\input texinfo   @c -*-texinfo-*-
@c %**start of header
@setfilename python.info
@documentencoding UTF-8
@ifinfo
@*Generated by Sphinx 8.2.3.@*
@end ifinfo
@settitle Python
@defindex ge
@paragraphindent 0
@exampleindent 4
@finalout
@dircategory Miscellaneous
@direntry
* python: (python.info). One line description of project
@end direntry

@c %**end of header

@copying
@quotation
Python 3.14.6, June 19, 2026

Author name not set

Copyright @copyright{} 2001 Python Software Foundation
@end quotation

@end copying

@titlepage
@title Python
@insertcopying
@end titlepage
@contents

@c %** start of user preamble

@c %** end of user preamble

@ifnottex
@node Top
@top Python
@insertcopying
@end ifnottex

@c %**start of body
@anchor{contents doc}@anchor{13c}
@menu
* What’s New in Python:: 
* The Python Tutorial:: 
* Python Setup and Usage:: 
* The Python Language Reference:: 
* The Python Standard Library:: 
* Extending and Embedding the Python Interpreter:: 
* Python/C API reference manual:: 
* Installing Python modules:: 
* Python HOWTOs:: 
* Python Frequently Asked Questions:: 
* Deprecations:: 
* Glossary:: 
* About this documentation:: 
* Dealing with Bugs:: 
* Copyright:: 
* History and License:: 
* Python Module Index:: 
* Index:: 

@detailmenu
 --- The Detailed Node Listing ---

What’s New in Python

* What’s new in Python 3.14: What’s new in Python 3 14. 
* What’s New In Python 3.13: What’s New In Python 3 13. 
* What’s New In Python 3.12: What’s New In Python 3 12. 
* What’s New In Python 3.11: What’s New In Python 3 11. 
* What’s New In Python 3.10: What’s New In Python 3 10. 
* What’s New In Python 3.9: What’s New In Python 3 9. 
* What’s New In Python 3.8: What’s New In Python 3 8. 
* What’s New In Python 3.7: What’s New In Python 3 7. 
* What’s New In Python 3.6: What’s New In Python 3 6. 
* What’s New In Python 3.5: What’s New In Python 3 5. 
* What’s New In Python 3.4: What’s New In Python 3 4. 
* What’s New In Python 3.3: What’s New In Python 3 3. 
* What’s New In Python 3.2: What’s New In Python 3 2. 
* What’s New In Python 3.1: What’s New In Python 3 1. 
* What’s New In Python 3.0: What’s New In Python 3 0. 
* What’s New in Python 2.7: What’s New in Python 2 7. 
* What’s New in Python 2.6: What’s New in Python 2 6. 
* What’s New in Python 2.5: What’s New in Python 2 5. 
* What’s New in Python 2.4: What’s New in Python 2 4. 
* What’s New in Python 2.3: What’s New in Python 2 3. 
* What’s New in Python 2.2: What’s New in Python 2 2. 
* What’s New in Python 2.1: What’s New in Python 2 1. 
* What’s New in Python 2.0: What’s New in Python 2 0. 
* Changelog:: 

What’s new in Python 3.14

* Summary – Release highlights:: 
* New features:: 
* Other language changes:: 
* New modules:: 
* Improved modules:: 
* Optimizations:: 
* Removed:: 
* Deprecated:: 
* CPython bytecode changes:: 
* C API changes:: 
* Build changes:: 
* Porting to Python 3.14: Porting to Python 3 14. 
* Notable changes in 3.14.1: Notable changes in 3 14 1. 
* Notable changes in 3.14.5: Notable changes in 3 14 5. 

New features

* PEP 649 & PEP 749; Deferred evaluation of annotations: PEP 649 & PEP 749 Deferred evaluation of annotations. 
* PEP 734; Multiple interpreters in the standard library: PEP 734 Multiple interpreters in the standard library. 
* PEP 750; Template string literals: PEP 750 Template string literals. 
* PEP 768; Safe external debugger interface: PEP 768 Safe external debugger interface. 
* A new type of interpreter:: 
* Free-threaded mode improvements:: 
* Improved error messages:: 
* PEP 784; Zstandard support in the standard library: PEP 784 Zstandard support in the standard library. 
* Asyncio introspection capabilities:: 
* Concurrent safe warnings control:: 

Other language changes

* Built-ins:: 
* Command line and environment:: 
* PEP 758; Allow except and except* expressions without brackets: PEP 758 Allow except and except* expressions without brackets. 
* PEP 765; Control flow in finally blocks: PEP 765 Control flow in finally blocks. 
* Garbage collection:: 
* Default interactive shell:: 

Improved modules

* argparse:: 
* ast:: 
* asyncio:: 
* calendar:: 
* concurrent.futures: concurrent futures. 
* configparser:: 
* contextvars:: 
* ctypes:: 
* curses:: 
* datetime:: 
* decimal:: 
* difflib:: 
* dis:: 
* errno:: 
* faulthandler:: 
* fnmatch:: 
* fractions:: 
* functools:: 
* getopt:: 
* getpass:: 
* graphlib:: 
* heapq:: 
* hmac:: 
* http:: 
* imaplib:: 
* inspect:: 
* io:: 
* json:: 
* linecache:: 
* logging.handlers: logging handlers. 
* math:: 
* mimetypes:: 
* multiprocessing:: 
* operator:: 
* os:: 
* os.path: os path. 
* pathlib:: 
* pdb:: 
* pickle:: 
* platform:: 
* pydoc:: 
* re:: 
* socket:: 
* ssl:: 
* struct:: 
* symtable:: 
* sys:: 
* sys.monitoring: sys monitoring. 
* sysconfig:: 
* tarfile:: 
* threading:: 
* tkinter:: 
* turtle:: 
* types:: 
* typing:: 
* unicodedata:: 
* unittest:: 
* urllib:: 
* uuid:: 
* webbrowser:: 
* zipfile:: 

Optimizations

* asyncio: asyncio<2>. 
* base64:: 
* bdb:: 
* difflib: difflib<2>. 
* gc:: 
* io: io<2>. 
* pathlib: pathlib<2>. 
* pdb: pdb<2>. 
* textwrap:: 
* uuid: uuid<2>. 
* zlib:: 

Removed

* argparse: argparse<2>. 
* ast: ast<2>. 
* asyncio: asyncio<3>. 
* email:: 
* importlib.abc: importlib abc. 
* itertools:: 
* pathlib: pathlib<3>. 
* pkgutil:: 
* pty:: 
* sqlite3:: 
* urllib: urllib<2>. 

Deprecated

* New deprecations:: 
* Pending removal in Python 3.15: Pending removal in Python 3 15. 
* Pending removal in Python 3.16: Pending removal in Python 3 16. 
* Pending removal in Python 3.17: Pending removal in Python 3 17. 
* Pending removal in Python 3.18: Pending removal in Python 3 18. 
* Pending removal in Python 3.19: Pending removal in Python 3 19. 
* Pending removal in future versions:: 

CPython bytecode changes

* Pseudo-instructions:: 

C API changes

* Python configuration C API:: 
* New features in the C API:: 
* Limited C API changes:: 
* Removed C APIs:: 
* Deprecated C APIs:: 

Deprecated C APIs

* Pending removal in Python 3.15: Pending removal in Python 3 15<2>. 
* Pending removal in Python 3.16: Pending removal in Python 3 16<2>. 
* Pending removal in Python 3.18: Pending removal in Python 3 18<2>. 
* Pending removal in future versions: Pending removal in future versions<2>. 

Build changes

* build-details.json: build-details json. 
* Discontinuation of PGP signatures:: 
* Free-threaded Python is officially supported:: 
* Binary releases for the experimental just-in-time compiler:: 

Porting to Python 3.14

* Changes in the Python API:: 
* Changes in annotations (PEP 649 and PEP 749): Changes in annotations PEP 649 and PEP 749. 
* Changes in the C API:: 

Changes in annotations (PEP 649 and PEP 749)

* Implications for annotated code:: 
* Implications for readers of __annotations__:: 
* Related changes:: 
* from __future__ import annotations:: 

Notable changes in 3.14.5

* gc: gc<2>. 

What’s New In Python 3.13

* Summary – Release Highlights:: 
* New Features:: 
* Other Language Changes:: 
* New Modules:: 
* Improved Modules:: 
* Optimizations: Optimizations<2>. 
* Removed Modules And APIs:: 
* New Deprecations:: 
* CPython Bytecode Changes:: 
* C API Changes:: 
* Build Changes:: 
* Porting to Python 3.13: Porting to Python 3 13. 
* Regression Test Changes:: 

New Features

* A better interactive interpreter:: 
* Improved error messages: Improved error messages<2>. 
* Free-threaded CPython:: 
* An experimental just-in-time (JIT) compiler: An experimental just-in-time JIT compiler. 
* Defined mutation semantics for locals(): Defined mutation semantics for locals. 
* Support for mobile platforms:: 

Improved Modules

* argparse: argparse<3>. 
* array:: 
* ast: ast<3>. 
* asyncio: asyncio<4>. 
* base64: base64<2>. 
* compileall:: 
* concurrent.futures: concurrent futures<2>. 
* configparser: configparser<2>. 
* copy:: 
* ctypes: ctypes<2>. 
* dbm:: 
* dis: dis<2>. 
* doctest:: 
* email: email<2>. 
* enum:: 
* fractions: fractions<2>. 
* glob:: 
* importlib:: 
* io: io<3>. 
* ipaddress:: 
* itertools: itertools<2>. 
* marshal:: 
* math: math<2>. 
* mimetypes: mimetypes<2>. 
* mmap:: 
* multiprocessing: multiprocessing<2>. 
* os: os<2>. 
* os.path: os path<2>. 
* pathlib: pathlib<4>. 
* pdb: pdb<3>. 
* queue:: 
* random:: 
* re: re<2>. 
* shutil:: 
* site:: 
* sqlite3: sqlite3<2>. 
* ssl: ssl<2>. 
* statistics:: 
* subprocess:: 
* sys: sys<2>. 
* tempfile:: 
* time:: 
* tkinter: tkinter<2>. 
* traceback:: 
* types: types<2>. 
* typing: typing<2>. 
* unicodedata: unicodedata<2>. 
* venv:: 
* warnings:: 
* xml:: 
* zipimport:: 

Removed Modules And APIs

* PEP 594; Remove “dead batteries” from the standard library: PEP 594 Remove “dead batteries” from the standard library. 
* 2to3:: 
* builtins:: 
* configparser: configparser<3>. 
* importlib.metadata: importlib metadata. 
* locale:: 
* opcode:: 
* optparse:: 
* pathlib: pathlib<5>. 
* re: re<3>. 
* tkinter.tix: tkinter tix. 
* turtle: turtle<2>. 
* typing: typing<3>. 
* unittest: unittest<2>. 
* urllib: urllib<3>. 
* webbrowser: webbrowser<2>. 

New Deprecations

* Pending removal in Python 3.14: Pending removal in Python 3 14. 
* Pending removal in Python 3.15: Pending removal in Python 3 15<3>. 
* Pending removal in Python 3.16: Pending removal in Python 3 16<3>. 
* Pending removal in Python 3.17: Pending removal in Python 3 17<2>. 
* Pending removal in Python 3.18: Pending removal in Python 3 18<3>. 
* Pending removal in Python 3.19: Pending removal in Python 3 19<2>. 
* Pending removal in future versions: Pending removal in future versions<3>. 

C API Changes

* New Features: New Features<2>. 
* Changed C APIs:: 
* Limited C API Changes:: 
* Removed C APIs: Removed C APIs<2>. 
* Deprecated C APIs: Deprecated C APIs<2>. 

Deprecated C APIs

* Pending removal in Python 3.14: Pending removal in Python 3 14<2>. 
* Pending removal in Python 3.15: Pending removal in Python 3 15<4>. 
* Pending removal in Python 3.16: Pending removal in Python 3 16<4>. 
* Pending removal in Python 3.18: Pending removal in Python 3 18<4>. 
* Pending removal in future versions: Pending removal in future versions<4>. 

Porting to Python 3.13

* Changes in the Python API: Changes in the Python API<2>. 
* Changes in the C API: Changes in the C API<2>. 

What’s New In Python 3.12

* Summary – Release highlights: Summary – Release highlights<2>. 
* New Features: New Features<3>. 
* New Features Related to Type Hints:: 
* Other Language Changes: Other Language Changes<2>. 
* New Modules: New Modules<2>. 
* Improved Modules: Improved Modules<2>. 
* Optimizations: Optimizations<3>. 
* CPython bytecode changes: CPython bytecode changes<2>. 
* Demos and Tools:: 
* Deprecated: Deprecated<2>. 
* Removed: Removed<2>. 
* Porting to Python 3.12: Porting to Python 3 12. 
* Build Changes: Build Changes<2>. 
* C API Changes: C API Changes<2>. 

New Features

* PEP 695; Type Parameter Syntax: PEP 695 Type Parameter Syntax. 
* PEP 701; Syntactic formalization of f-strings: PEP 701 Syntactic formalization of f-strings. 
* PEP 684; A Per-Interpreter GIL: PEP 684 A Per-Interpreter GIL. 
* PEP 669; Low impact monitoring for CPython: PEP 669 Low impact monitoring for CPython. 
* PEP 688; Making the buffer protocol accessible in Python: PEP 688 Making the buffer protocol accessible in Python. 
* PEP 709; Comprehension inlining: PEP 709 Comprehension inlining. 
* Improved Error Messages:: 

New Features Related to Type Hints

* PEP 692; Using TypedDict for more precise **kwargs typing: PEP 692 Using TypedDict for more precise **kwargs typing. 
* PEP 698; Override Decorator for Static Typing: PEP 698 Override Decorator for Static Typing. 

Improved Modules

* array: array<2>. 
* asyncio: asyncio<5>. 
* calendar: calendar<2>. 
* csv:: 
* dis: dis<3>. 
* fractions: fractions<3>. 
* importlib.resources: importlib resources. 
* inspect: inspect<2>. 
* itertools: itertools<3>. 
* math: math<3>. 
* os: os<3>. 
* os.path: os path<3>. 
* pathlib: pathlib<6>. 
* platform: platform<2>. 
* pdb: pdb<4>. 
* random: random<2>. 
* shutil: shutil<2>. 
* sqlite3: sqlite3<3>. 
* statistics: statistics<2>. 
* sys: sys<3>. 
* tempfile: tempfile<2>. 
* threading: threading<2>. 
* tkinter: tkinter<3>. 
* tokenize:: 
* types: types<3>. 
* typing: typing<4>. 
* unicodedata: unicodedata<3>. 
* unittest: unittest<3>. 
* uuid: uuid<3>. 

Deprecated

* Pending removal in Python 3.13: Pending removal in Python 3 13. 
* Pending removal in Python 3.14: Pending removal in Python 3 14<3>. 
* Pending removal in Python 3.15: Pending removal in Python 3 15<5>. 
* Pending removal in Python 3.16: Pending removal in Python 3 16<5>. 
* Pending removal in Python 3.17: Pending removal in Python 3 17<3>. 
* Pending removal in future versions: Pending removal in future versions<5>. 

Removed

* asynchat and asyncore:: 
* configparser: configparser<4>. 
* distutils:: 
* ensurepip:: 
* enum: enum<2>. 
* ftplib:: 
* gzip:: 
* hashlib:: 
* importlib: importlib<2>. 
* imp:: 
* io: io<4>. 
* locale: locale<2>. 
* smtpd:: 
* sqlite3: sqlite3<4>. 
* ssl: ssl<3>. 
* unittest: unittest<4>. 
* webbrowser: webbrowser<3>. 
* xml.etree.ElementTree: xml etree ElementTree. 
* zipimport: zipimport<2>. 
* Others:: 

Porting to Python 3.12

* Changes in the Python API: Changes in the Python API<3>. 

C API Changes

* New Features: New Features<4>. 
* Porting to Python 3.12: Porting to Python 3 12<2>. 
* Deprecated: Deprecated<3>. 
* Removed: Removed<3>. 

Deprecated

* Pending removal in Python 3.14: Pending removal in Python 3 14<4>. 
* Pending removal in Python 3.15: Pending removal in Python 3 15<6>. 
* Pending removal in Python 3.16: Pending removal in Python 3 16<6>. 
* Pending removal in future versions: Pending removal in future versions<6>. 

What’s New In Python 3.11

* Summary – Release highlights: Summary – Release highlights<3>. 
* New Features: New Features<5>. 
* New Features Related to Type Hints: New Features Related to Type Hints<2>. 
* Other Language Changes: Other Language Changes<3>. 
* Other CPython Implementation Changes:: 
* New Modules: New Modules<3>. 
* Improved Modules: Improved Modules<3>. 
* Optimizations: Optimizations<4>. 
* Faster CPython:: 
* CPython bytecode changes: CPython bytecode changes<3>. 
* Deprecated: Deprecated<4>. 
* Pending Removal in Python 3.12: Pending Removal in Python 3 12. 
* Removed: Removed<4>. 
* Porting to Python 3.11: Porting to Python 3 11. 
* Build Changes: Build Changes<3>. 
* C API Changes: C API Changes<3>. 
* Notable changes in 3.11.4: Notable changes in 3 11 4. 
* Notable changes in 3.11.5: Notable changes in 3 11 5. 

New Features

* PEP 657; Fine-grained error locations in tracebacks: PEP 657 Fine-grained error locations in tracebacks. 
* PEP 654; Exception Groups and except*: PEP 654 Exception Groups and except*. 
* PEP 678; Exceptions can be enriched with notes: PEP 678 Exceptions can be enriched with notes. 
* Windows py.exe launcher improvements: Windows py exe launcher improvements. 

New Features Related to Type Hints

* PEP 646; Variadic generics: PEP 646 Variadic generics. 
* PEP 655; Marking individual TypedDict items as required or not-required: PEP 655 Marking individual TypedDict items as required or not-required. 
* PEP 673; Self type: PEP 673 Self type. 
* PEP 675; Arbitrary literal string type: PEP 675 Arbitrary literal string type. 
* PEP 681; Data class transforms: PEP 681 Data class transforms. 
* PEP 563 may not be the future:: 

Improved Modules

* asyncio: asyncio<6>. 
* contextlib:: 
* dataclasses:: 
* datetime: datetime<2>. 
* enum: enum<3>. 
* fcntl:: 
* fractions: fractions<4>. 
* functools: functools<2>. 
* gzip: gzip<2>. 
* hashlib: hashlib<2>. 
* IDLE and idlelib:: 
* inspect: inspect<3>. 
* locale: locale<3>. 
* logging:: 
* math: math<4>. 
* operator: operator<2>. 
* os: os<4>. 
* pathlib: pathlib<7>. 
* re: re<4>. 
* shutil: shutil<3>. 
* socket: socket<2>. 
* sqlite3: sqlite3<5>. 
* string:: 
* sys: sys<4>. 
* sysconfig: sysconfig<2>. 
* tempfile: tempfile<3>. 
* threading: threading<3>. 
* time: time<2>. 
* tkinter: tkinter<4>. 
* traceback: traceback<2>. 
* typing: typing<5>. 
* unicodedata: unicodedata<4>. 
* unittest: unittest<5>. 
* venv: venv<2>. 
* warnings: warnings<2>. 
* zipfile: zipfile<2>. 

Faster CPython

* Faster Startup:: 
* Faster Runtime:: 
* Misc:: 
* FAQ:: 
* About:: 

Faster Startup

* Frozen imports / Static code objects:: 

Faster Runtime

* Cheaper@comma{} lazy Python frames: Cheaper lazy Python frames. 
* Inlined Python function calls:: 
* PEP 659; Specializing Adaptive Interpreter: PEP 659 Specializing Adaptive Interpreter. 

FAQ

* How should I write my code to utilize these speedups?:: 
* Will CPython 3.11 use more memory?: Will CPython 3 11 use more memory?. 
* I don’t see any speedups in my workload. Why?: I don’t see any speedups in my workload Why?. 
* Is there a JIT compiler?:: 

CPython bytecode changes

* New opcodes:: 
* Replaced opcodes:: 
* Changed/removed opcodes:: 

Deprecated

* Language/Builtins:: 
* Modules:: 
* Standard Library:: 

C API Changes

* New Features: New Features<6>. 
* Porting to Python 3.11: Porting to Python 3 11<2>. 
* Deprecated: Deprecated<5>. 
* Pending Removal in Python 3.12: Pending Removal in Python 3 12<2>. 
* Removed: Removed<5>. 

Notable changes in 3.11.4

* tarfile: tarfile<2>. 

Notable changes in 3.11.5

* OpenSSL:: 

What’s New In Python 3.10

* Summary – Release highlights: Summary – Release highlights<4>. 
* New Features: New Features<7>. 
* New Features Related to Type Hints: New Features Related to Type Hints<3>. 
* Other Language Changes: Other Language Changes<4>. 
* New Modules: New Modules<4>. 
* Improved Modules: Improved Modules<4>. 
* Optimizations: Optimizations<5>. 
* Deprecated: Deprecated<6>. 
* Removed: Removed<6>. 
* Porting to Python 3.10: Porting to Python 3 10. 
* CPython bytecode changes: CPython bytecode changes<4>. 
* Build Changes: Build Changes<4>. 
* C API Changes: C API Changes<4>. 
* Notable security feature in 3.10.7: Notable security feature in 3 10 7. 
* Notable security feature in 3.10.8: Notable security feature in 3 10 8. 
* Notable changes in 3.10.12: Notable changes in 3 10 12. 

New Features

* Parenthesized context managers:: 
* Better error messages:: 
* PEP 626; Precise line numbers for debugging and other tools: PEP 626 Precise line numbers for debugging and other tools. 
* PEP 634; Structural Pattern Matching: PEP 634 Structural Pattern Matching. 
* Optional EncodingWarning and encoding="locale" option:: 

Better error messages

* SyntaxErrors:: 
* IndentationErrors:: 
* AttributeErrors:: 
* NameErrors:: 

PEP 634: Structural Pattern Matching

* Syntax and operations:: 
* Declarative approach:: 
* Simple pattern; match to a literal: Simple pattern match to a literal. 
* Patterns with a literal and variable:: 
* Patterns and classes:: 
* Nested patterns:: 
* Complex patterns and the wildcard:: 
* Guard:: 
* Other Key Features:: 

Simple pattern: match to a literal

* Behavior without the wildcard:: 

Patterns and classes

* Patterns with positional parameters:: 

New Features Related to Type Hints

* PEP 604; New Type Union Operator: PEP 604 New Type Union Operator. 
* PEP 612; Parameter Specification Variables: PEP 612 Parameter Specification Variables. 
* PEP 613; TypeAlias: PEP 613 TypeAlias. 
* PEP 647; User-Defined Type Guards: PEP 647 User-Defined Type Guards. 

Improved Modules

* asyncio: asyncio<7>. 
* argparse: argparse<4>. 
* array: array<3>. 
* asynchat@comma{} asyncore@comma{} smtpd: asynchat asyncore smtpd. 
* base64: base64<3>. 
* bdb: bdb<2>. 
* bisect:: 
* codecs:: 
* collections.abc: collections abc. 
* contextlib: contextlib<2>. 
* curses: curses<2>. 
* dataclasses: dataclasses<2>. 
* distutils: distutils<2>. 
* doctest: doctest<2>. 
* encodings:: 
* enum: enum<4>. 
* fileinput:: 
* faulthandler: faulthandler<2>. 
* gc: gc<3>. 
* glob: glob<2>. 
* hashlib: hashlib<3>. 
* hmac: hmac<2>. 
* IDLE and idlelib: IDLE and idlelib<2>. 
* importlib.metadata: importlib metadata<2>. 
* inspect: inspect<4>. 
* itertools: itertools<4>. 
* linecache: linecache<2>. 
* os: os<5>. 
* os.path: os path<4>. 
* pathlib: pathlib<8>. 
* platform: platform<3>. 
* pprint:: 
* py_compile:: 
* pyclbr:: 
* shelve:: 
* statistics: statistics<3>. 
* site: site<2>. 
* socket: socket<3>. 
* ssl: ssl<4>. 
* sqlite3: sqlite3<6>. 
* sys: sys<5>. 
* _thread:: 
* threading: threading<4>. 
* traceback: traceback<3>. 
* types: types<4>. 
* typing: typing<6>. 
* unittest: unittest<6>. 
* urllib.parse: urllib parse. 
* xml: xml<2>. 
* zipimport: zipimport<3>. 

dataclasses

* __slots__:: 
* Keyword-only fields:: 

Porting to Python 3.10

* Changes in the Python syntax:: 
* Changes in the Python API: Changes in the Python API<4>. 
* Changes in the C API: Changes in the C API<3>. 

C API Changes

* PEP 652; Maintaining the Stable ABI: PEP 652 Maintaining the Stable ABI. 
* New Features: New Features<8>. 
* Porting to Python 3.10: Porting to Python 3 10<2>. 
* Deprecated: Deprecated<7>. 
* Removed: Removed<7>. 

Notable changes in 3.10.12

* tarfile: tarfile<3>. 

What’s New In Python 3.9

* Summary – Release highlights: Summary – Release highlights<5>. 
* You should check for DeprecationWarning in your code:: 
* New Features: New Features<9>. 
* Other Language Changes: Other Language Changes<5>. 
* New Modules: New Modules<5>. 
* Improved Modules: Improved Modules<5>. 
* Optimizations: Optimizations<6>. 
* Deprecated: Deprecated<8>. 
* Removed: Removed<8>. 
* Porting to Python 3.9: Porting to Python 3 9. 
* Build Changes: Build Changes<5>. 
* C API Changes: C API Changes<5>. 
* Notable changes in Python 3.9.1: Notable changes in Python 3 9 1. 
* Notable changes in Python 3.9.2: Notable changes in Python 3 9 2. 
* Notable changes in Python 3.9.3: Notable changes in Python 3 9 3. 
* Notable changes in Python 3.9.5: Notable changes in Python 3 9 5. 
* Notable security feature in 3.9.14: Notable security feature in 3 9 14. 
* Notable changes in 3.9.17: Notable changes in 3 9 17. 

New Features

* Dictionary Merge & Update Operators:: 
* New String Methods to Remove Prefixes and Suffixes:: 
* Type Hinting Generics in Standard Collections:: 
* New Parser:: 

New Modules

* zoneinfo:: 
* graphlib: graphlib<2>. 

Improved Modules

* ast: ast<4>. 
* asyncio: asyncio<8>. 
* compileall: compileall<2>. 
* concurrent.futures: concurrent futures<3>. 
* curses: curses<3>. 
* datetime: datetime<3>. 
* distutils: distutils<3>. 
* fcntl: fcntl<2>. 
* ftplib: ftplib<2>. 
* gc: gc<4>. 
* hashlib: hashlib<4>. 
* http: http<2>. 
* IDLE and idlelib: IDLE and idlelib<3>. 
* imaplib: imaplib<2>. 
* importlib: importlib<3>. 
* inspect: inspect<5>. 
* ipaddress: ipaddress<2>. 
* math: math<5>. 
* multiprocessing: multiprocessing<3>. 
* nntplib:: 
* os: os<6>. 
* pathlib: pathlib<9>. 
* pdb: pdb<5>. 
* poplib:: 
* pprint: pprint<2>. 
* pydoc: pydoc<2>. 
* random: random<3>. 
* signal:: 
* smtplib:: 
* socket: socket<4>. 
* time: time<3>. 
* sys: sys<6>. 
* tracemalloc:: 
* typing: typing<7>. 
* unicodedata: unicodedata<5>. 
* venv: venv<3>. 
* xml: xml<3>. 

Porting to Python 3.9

* Changes in the Python API: Changes in the Python API<5>. 
* Changes in the C API: Changes in the C API<4>. 
* CPython bytecode changes: CPython bytecode changes<5>. 

C API Changes

* New Features: New Features<10>. 
* Porting to Python 3.9: Porting to Python 3 9<2>. 
* Removed: Removed<9>. 

Notable changes in Python 3.9.1

* typing: typing<8>. 
* macOS 11.0 (Big Sur) and Apple Silicon Mac support: macOS 11 0 Big Sur and Apple Silicon Mac support. 

Notable changes in Python 3.9.2

* collections.abc: collections abc<2>. 
* urllib.parse: urllib parse<2>. 

Notable changes in Python 3.9.5

* urllib.parse: urllib parse<3>. 

Notable changes in 3.9.17

* tarfile: tarfile<4>. 

What’s New In Python 3.8

* Summary – Release highlights: Summary – Release highlights<6>. 
* New Features: New Features<11>. 
* Other Language Changes: Other Language Changes<6>. 
* New Modules: New Modules<6>. 
* Improved Modules: Improved Modules<6>. 
* Optimizations: Optimizations<7>. 
* Build and C API Changes:: 
* Deprecated: Deprecated<9>. 
* API and Feature Removals:: 
* Porting to Python 3.8: Porting to Python 3 8. 
* Notable changes in Python 3.8.1: Notable changes in Python 3 8 1. 
* Notable changes in Python 3.8.2: Notable changes in Python 3 8 2. 
* Notable changes in Python 3.8.3: Notable changes in Python 3 8 3. 
* Notable changes in Python 3.8.8: Notable changes in Python 3 8 8. 
* Notable changes in Python 3.8.9: Notable changes in Python 3 8 9. 
* Notable changes in Python 3.8.10: Notable changes in Python 3 8 10. 
* Notable changes in Python 3.8.10: Notable changes in Python 3 8 10<2>. 
* Notable changes in Python 3.8.12: Notable changes in Python 3 8 12. 
* Notable security feature in 3.8.14: Notable security feature in 3 8 14. 
* Notable changes in 3.8.17: Notable changes in 3 8 17. 

New Features

* Assignment expressions:: 
* Positional-only parameters:: 
* Parallel filesystem cache for compiled bytecode files:: 
* Debug build uses the same ABI as release build:: 
* f-strings support = for self-documenting expressions and debugging:: 
* PEP 578; Python Runtime Audit Hooks: PEP 578 Python Runtime Audit Hooks. 
* PEP 587; Python Initialization Configuration: PEP 587 Python Initialization Configuration. 
* PEP 590; Vectorcall; a fast calling protocol for CPython: PEP 590 Vectorcall a fast calling protocol for CPython. 
* Pickle protocol 5 with out-of-band data buffers:: 

Improved Modules

* ast: ast<5>. 
* asyncio: asyncio<9>. 
* builtins: builtins<2>. 
* collections:: 
* cProfile:: 
* csv: csv<2>. 
* curses: curses<4>. 
* ctypes: ctypes<3>. 
* datetime: datetime<4>. 
* functools: functools<3>. 
* gc: gc<5>. 
* gettext:: 
* gzip: gzip<3>. 
* IDLE and idlelib: IDLE and idlelib<4>. 
* inspect: inspect<6>. 
* io: io<5>. 
* itertools: itertools<5>. 
* json.tool: json tool. 
* logging: logging<2>. 
* math: math<6>. 
* mmap: mmap<2>. 
* multiprocessing: multiprocessing<4>. 
* os: os<7>. 
* os.path: os path<5>. 
* pathlib: pathlib<10>. 
* pickle: pickle<2>. 
* plistlib:: 
* pprint: pprint<3>. 
* py_compile: py_compile<2>. 
* shlex:: 
* shutil: shutil<4>. 
* socket: socket<5>. 
* ssl: ssl<5>. 
* statistics: statistics<4>. 
* sys: sys<7>. 
* tarfile: tarfile<5>. 
* threading: threading<5>. 
* tokenize: tokenize<2>. 
* tkinter: tkinter<5>. 
* time: time<4>. 
* typing: typing<9>. 
* unicodedata: unicodedata<6>. 
* unittest: unittest<7>. 
* venv: venv<4>. 
* weakref:: 
* xml: xml<4>. 
* xmlrpc:: 

Porting to Python 3.8

* Changes in Python behavior:: 
* Changes in the Python API: Changes in the Python API<6>. 
* Changes in the C API: Changes in the C API<5>. 
* CPython bytecode changes: CPython bytecode changes<6>. 
* Demos and Tools: Demos and Tools<2>. 

Notable changes in Python 3.8.10

* macOS 11.0 (Big Sur) and Apple Silicon Mac support: macOS 11 0 Big Sur and Apple Silicon Mac support<2>. 

Notable changes in Python 3.8.10

* urllib.parse: urllib parse<4>. 

Notable changes in Python 3.8.12

* Changes in the Python API: Changes in the Python API<7>. 

Notable changes in 3.8.17

* tarfile: tarfile<6>. 

What’s New In Python 3.7

* Summary – Release Highlights: Summary – Release Highlights<2>. 
* New Features: New Features<12>. 
* Other Language Changes: Other Language Changes<7>. 
* New Modules: New Modules<7>. 
* Improved Modules: Improved Modules<7>. 
* C API Changes: C API Changes<6>. 
* Build Changes: Build Changes<6>. 
* Optimizations: Optimizations<8>. 
* Other CPython Implementation Changes: Other CPython Implementation Changes<2>. 
* Deprecated Python Behavior:: 
* Deprecated Python modules@comma{} functions and methods: Deprecated Python modules functions and methods. 
* Deprecated functions and types of the C API:: 
* Platform Support Removals:: 
* API and Feature Removals: API and Feature Removals<2>. 
* Module Removals:: 
* Windows-only Changes:: 
* Porting to Python 3.7: Porting to Python 3 7. 
* Notable changes in Python 3.7.1: Notable changes in Python 3 7 1. 
* Notable changes in Python 3.7.2: Notable changes in Python 3 7 2. 
* Notable changes in Python 3.7.6: Notable changes in Python 3 7 6. 
* Notable changes in Python 3.7.10: Notable changes in Python 3 7 10. 
* Notable changes in Python 3.7.11: Notable changes in Python 3 7 11. 
* Notable security feature in 3.7.14: Notable security feature in 3 7 14. 

New Features

* PEP 563; Postponed Evaluation of Annotations: PEP 563 Postponed Evaluation of Annotations. 
* PEP 538; Legacy C Locale Coercion: PEP 538 Legacy C Locale Coercion. 
* PEP 540; Forced UTF-8 Runtime Mode: PEP 540 Forced UTF-8 Runtime Mode. 
* PEP 553; Built-in breakpoint(): PEP 553 Built-in breakpoint. 
* PEP 539; New C API for Thread-Local Storage: PEP 539 New C API for Thread-Local Storage. 
* PEP 562; Customization of Access to Module Attributes: PEP 562 Customization of Access to Module Attributes. 
* PEP 564; New Time Functions With Nanosecond Resolution: PEP 564 New Time Functions With Nanosecond Resolution. 
* PEP 565; Show DeprecationWarning in __main__: PEP 565 Show DeprecationWarning in __main__. 
* PEP 560; Core Support for typing module and Generic Types: PEP 560 Core Support for typing module and Generic Types. 
* PEP 552; Hash-based .pyc Files: PEP 552 Hash-based pyc Files. 
* PEP 545; Python Documentation Translations: PEP 545 Python Documentation Translations. 
* Python Development Mode (-X dev): Python Development Mode -X dev. 

New Modules

* contextvars: contextvars<2>. 
* dataclasses: dataclasses<3>. 
* importlib.resources: importlib resources<2>. 

Improved Modules

* argparse: argparse<5>. 
* asyncio: asyncio<10>. 
* binascii:: 
* calendar: calendar<3>. 
* collections: collections<2>. 
* compileall: compileall<3>. 
* concurrent.futures: concurrent futures<4>. 
* contextlib: contextlib<3>. 
* cProfile: cProfile<2>. 
* crypt:: 
* datetime: datetime<5>. 
* dbm: dbm<2>. 
* decimal: decimal<2>. 
* dis: dis<4>. 
* distutils: distutils<4>. 
* enum: enum<5>. 
* functools: functools<4>. 
* gc: gc<6>. 
* hmac: hmac<3>. 
* http.client: http client. 
* http.server: http server. 
* idlelib and IDLE:: 
* importlib: importlib<4>. 
* io: io<6>. 
* ipaddress: ipaddress<3>. 
* itertools: itertools<6>. 
* locale: locale<4>. 
* logging: logging<3>. 
* math: math<7>. 
* mimetypes: mimetypes<3>. 
* msilib:: 
* multiprocessing: multiprocessing<5>. 
* os: os<8>. 
* pathlib: pathlib<11>. 
* pdb: pdb<6>. 
* py_compile: py_compile<3>. 
* pydoc: pydoc<3>. 
* queue: queue<2>. 
* re: re<5>. 
* signal: signal<2>. 
* socket: socket<6>. 
* socketserver:: 
* sqlite3: sqlite3<7>. 
* ssl: ssl<6>. 
* string: string<2>. 
* subprocess: subprocess<2>. 
* sys: sys<8>. 
* time: time<5>. 
* tkinter: tkinter<6>. 
* tracemalloc: tracemalloc<2>. 
* types: types<5>. 
* unicodedata: unicodedata<7>. 
* unittest: unittest<8>. 
* unittest.mock: unittest mock. 
* urllib.parse: urllib parse<5>. 
* uu:: 
* uuid: uuid<4>. 
* warnings: warnings<3>. 
* xml: xml<5>. 
* xml.etree: xml etree. 
* xmlrpc.server: xmlrpc server. 
* zipapp:: 
* zipfile: zipfile<3>. 

Deprecated Python modules, functions and methods

* aifc:: 
* asyncio: asyncio<11>. 
* collections: collections<3>. 
* dbm: dbm<3>. 
* enum: enum<6>. 
* gettext: gettext<2>. 
* importlib: importlib<5>. 
* locale: locale<5>. 
* macpath:: 
* threading: threading<6>. 
* socket: socket<7>. 
* ssl: ssl<7>. 
* sunau:: 
* sys: sys<9>. 
* wave:: 

Porting to Python 3.7

* Changes in Python Behavior:: 
* Changes in the Python API: Changes in the Python API<8>. 
* Changes in the C API: Changes in the C API<6>. 
* CPython bytecode changes: CPython bytecode changes<7>. 
* Windows-only Changes: Windows-only Changes<2>. 
* Other CPython implementation changes:: 

What’s New In Python 3.6

* Summary – Release highlights: Summary – Release highlights<7>. 
* New Features: New Features<13>. 
* Other Language Changes: Other Language Changes<8>. 
* New Modules: New Modules<8>. 
* Improved Modules: Improved Modules<8>. 
* Optimizations: Optimizations<9>. 
* Build and C API Changes: Build and C API Changes<2>. 
* Other Improvements:: 
* Deprecated: Deprecated<10>. 
* Removed: Removed<10>. 
* Porting to Python 3.6: Porting to Python 3 6. 
* Notable changes in Python 3.6.2: Notable changes in Python 3 6 2. 
* Notable changes in Python 3.6.4: Notable changes in Python 3 6 4. 
* Notable changes in Python 3.6.5: Notable changes in Python 3 6 5. 
* Notable changes in Python 3.6.7: Notable changes in Python 3 6 7. 
* Notable changes in Python 3.6.10: Notable changes in Python 3 6 10. 
* Notable changes in Python 3.6.13: Notable changes in Python 3 6 13. 
* Notable changes in Python 3.6.14: Notable changes in Python 3 6 14. 

New Features

* PEP 498; Formatted string literals: PEP 498 Formatted string literals. 
* PEP 526; Syntax for variable annotations: PEP 526 Syntax for variable annotations. 
* PEP 515; Underscores in Numeric Literals: PEP 515 Underscores in Numeric Literals. 
* PEP 525; Asynchronous Generators: PEP 525 Asynchronous Generators. 
* PEP 530; Asynchronous Comprehensions: PEP 530 Asynchronous Comprehensions. 
* PEP 487; Simpler customization of class creation: PEP 487 Simpler customization of class creation. 
* PEP 487; Descriptor Protocol Enhancements: PEP 487 Descriptor Protocol Enhancements. 
* PEP 519; Adding a file system path protocol: PEP 519 Adding a file system path protocol. 
* PEP 495; Local Time Disambiguation: PEP 495 Local Time Disambiguation. 
* PEP 529; Change Windows filesystem encoding to UTF-8: PEP 529 Change Windows filesystem encoding to UTF-8. 
* PEP 528; Change Windows console encoding to UTF-8: PEP 528 Change Windows console encoding to UTF-8. 
* PEP 520; Preserving Class Attribute Definition Order: PEP 520 Preserving Class Attribute Definition Order. 
* PEP 468; Preserving Keyword Argument Order: PEP 468 Preserving Keyword Argument Order. 
* New dict implementation:: 
* PEP 523; Adding a frame evaluation API to CPython: PEP 523 Adding a frame evaluation API to CPython. 
* PYTHONMALLOC environment variable:: 
* DTrace and SystemTap probing support:: 

New Modules

* secrets:: 

Improved Modules

* array: array<4>. 
* ast: ast<6>. 
* asyncio: asyncio<12>. 
* binascii: binascii<2>. 
* cmath:: 
* collections: collections<4>. 
* concurrent.futures: concurrent futures<5>. 
* contextlib: contextlib<4>. 
* datetime: datetime<6>. 
* decimal: decimal<3>. 
* distutils: distutils<5>. 
* email: email<3>. 
* encodings: encodings<2>. 
* enum: enum<7>. 
* faulthandler: faulthandler<3>. 
* fileinput: fileinput<2>. 
* hashlib: hashlib<5>. 
* http.client: http client<2>. 
* idlelib and IDLE: idlelib and IDLE<2>. 
* importlib: importlib<6>. 
* inspect: inspect<7>. 
* json: json<2>. 
* logging: logging<4>. 
* math: math<8>. 
* multiprocessing: multiprocessing<6>. 
* os: os<9>. 
* pathlib: pathlib<12>. 
* pdb: pdb<7>. 
* pickle: pickle<3>. 
* pickletools:: 
* pydoc: pydoc<4>. 
* random: random<4>. 
* re: re<6>. 
* readline:: 
* rlcompleter:: 
* shlex: shlex<2>. 
* site: site<3>. 
* sqlite3: sqlite3<8>. 
* socket: socket<8>. 
* socketserver: socketserver<2>. 
* ssl: ssl<8>. 
* statistics: statistics<5>. 
* struct: struct<2>. 
* subprocess: subprocess<3>. 
* sys: sys<10>. 
* telnetlib:: 
* time: time<6>. 
* timeit:: 
* tkinter: tkinter<7>. 
* traceback: traceback<4>. 
* tracemalloc: tracemalloc<3>. 
* typing: typing<10>. 
* unicodedata: unicodedata<8>. 
* unittest.mock: unittest mock<2>. 
* urllib.request: urllib request. 
* urllib.robotparser: urllib robotparser. 
* venv: venv<5>. 
* warnings: warnings<4>. 
* winreg:: 
* winsound:: 
* xmlrpc.client: xmlrpc client. 
* zipfile: zipfile<4>. 
* zlib: zlib<2>. 

Deprecated

* New Keywords:: 
* Deprecated Python behavior:: 
* Deprecated Python modules@comma{} functions and methods: Deprecated Python modules functions and methods<2>. 
* xml: xml<6>. 
* Deprecated functions and types of the C API: Deprecated functions and types of the C API<2>. 
* Deprecated Build Options:: 

Deprecated Python modules, functions and methods

* asynchat:: 
* asyncore:: 
* dbm: dbm<4>. 
* distutils: distutils<6>. 
* grp:: 
* importlib: importlib<7>. 
* os: os<10>. 
* re: re<7>. 
* ssl: ssl<9>. 
* tkinter: tkinter<8>. 
* venv: venv<6>. 

Removed

* API and Feature Removals: API and Feature Removals<3>. 

Porting to Python 3.6

* Changes in ‘python’ Command Behavior:: 
* Changes in the Python API: Changes in the Python API<9>. 
* Changes in the C API: Changes in the C API<7>. 
* CPython bytecode changes: CPython bytecode changes<8>. 

Notable changes in Python 3.6.2

* New make regen-all build target:: 
* Removal of make touch build target:: 

What’s New In Python 3.5

* Summary – Release highlights: Summary – Release highlights<8>. 
* New Features: New Features<14>. 
* Other Language Changes: Other Language Changes<9>. 
* New Modules: New Modules<9>. 
* Improved Modules: Improved Modules<9>. 
* Other module-level changes:: 
* Optimizations: Optimizations<10>. 
* Build and C API Changes: Build and C API Changes<3>. 
* Deprecated: Deprecated<11>. 
* Removed: Removed<11>. 
* Porting to Python 3.5: Porting to Python 3 5. 
* Notable changes in Python 3.5.4: Notable changes in Python 3 5 4. 

New Features

* PEP 492 - Coroutines with async and await syntax:: 
* PEP 465 - A dedicated infix operator for matrix multiplication:: 
* PEP 448 - Additional Unpacking Generalizations:: 
* PEP 461 - percent formatting support for bytes and bytearray:: 
* PEP 484 - Type Hints:: 
* PEP 471 - os.scandir() function – a better and faster directory iterator: PEP 471 - os scandir function – a better and faster directory iterator. 
* PEP 475; Retry system calls failing with EINTR: PEP 475 Retry system calls failing with EINTR. 
* PEP 479; Change StopIteration handling inside generators: PEP 479 Change StopIteration handling inside generators. 
* PEP 485; A function for testing approximate equality: PEP 485 A function for testing approximate equality. 
* PEP 486; Make the Python Launcher aware of virtual environments: PEP 486 Make the Python Launcher aware of virtual environments. 
* PEP 488; Elimination of PYO files: PEP 488 Elimination of PYO files. 
* PEP 489; Multi-phase extension module initialization: PEP 489 Multi-phase extension module initialization. 

New Modules

* typing: typing<11>. 
* zipapp: zipapp<2>. 

Improved Modules

* argparse: argparse<6>. 
* asyncio: asyncio<13>. 
* bz2:: 
* cgi:: 
* cmath: cmath<2>. 
* code:: 
* collections: collections<5>. 
* collections.abc: collections abc<3>. 
* compileall: compileall<4>. 
* concurrent.futures: concurrent futures<6>. 
* configparser: configparser<5>. 
* contextlib: contextlib<5>. 
* csv: csv<3>. 
* curses: curses<5>. 
* dbm: dbm<5>. 
* difflib: difflib<3>. 
* distutils: distutils<7>. 
* doctest: doctest<3>. 
* email: email<4>. 
* enum: enum<8>. 
* faulthandler: faulthandler<4>. 
* functools: functools<5>. 
* glob: glob<3>. 
* gzip: gzip<4>. 
* heapq: heapq<2>. 
* http: http<3>. 
* http.client: http client<3>. 
* idlelib and IDLE: idlelib and IDLE<3>. 
* imaplib: imaplib<3>. 
* imghdr:: 
* importlib: importlib<8>. 
* inspect: inspect<8>. 
* io: io<7>. 
* ipaddress: ipaddress<4>. 
* json: json<3>. 
* linecache: linecache<3>. 
* locale: locale<6>. 
* logging: logging<5>. 
* lzma:: 
* math: math<9>. 
* multiprocessing: multiprocessing<7>. 
* operator: operator<3>. 
* os: os<11>. 
* pathlib: pathlib<13>. 
* pickle: pickle<4>. 
* poplib: poplib<2>. 
* re: re<8>. 
* readline: readline<2>. 
* selectors:: 
* shutil: shutil<5>. 
* signal: signal<3>. 
* smtpd: smtpd<2>. 
* smtplib: smtplib<2>. 
* sndhdr:: 
* socket: socket<9>. 
* ssl: ssl<10>. 
* sqlite3: sqlite3<9>. 
* subprocess: subprocess<4>. 
* sys: sys<11>. 
* sysconfig: sysconfig<3>. 
* tarfile: tarfile<7>. 
* threading: threading<7>. 
* time: time<7>. 
* timeit: timeit<2>. 
* tkinter: tkinter<9>. 
* traceback: traceback<5>. 
* types: types<6>. 
* unicodedata: unicodedata<9>. 
* unittest: unittest<9>. 
* unittest.mock: unittest mock<3>. 
* urllib: urllib<4>. 
* wsgiref:: 
* xmlrpc: xmlrpc<2>. 
* xml.sax: xml sax. 
* zipfile: zipfile<5>. 

ssl

* Memory BIO Support:: 
* Application-Layer Protocol Negotiation Support:: 
* Other Changes:: 

Deprecated

* New Keywords: New Keywords<2>. 
* Deprecated Python Behavior: Deprecated Python Behavior<2>. 
* Unsupported Operating Systems:: 
* Deprecated Python modules@comma{} functions and methods: Deprecated Python modules functions and methods<3>. 

Removed

* API and Feature Removals: API and Feature Removals<4>. 

Porting to Python 3.5

* Changes in Python behavior: Changes in Python behavior<2>. 
* Changes in the Python API: Changes in the Python API<10>. 
* Changes in the C API: Changes in the C API<8>. 

Notable changes in Python 3.5.4

* New make regen-all build target: New make regen-all build target<2>. 
* Removal of make touch build target: Removal of make touch build target<2>. 

What’s New In Python 3.4

* Summary – Release Highlights: Summary – Release Highlights<3>. 
* New Features: New Features<15>. 
* New Modules: New Modules<10>. 
* Improved Modules: Improved Modules<10>. 
* CPython Implementation Changes:: 
* Deprecated: Deprecated<12>. 
* Removed: Removed<12>. 
* Porting to Python 3.4: Porting to Python 3 4. 
* Changed in 3.4.3: Changed in 3 4 3. 

New Features

* PEP 453; Explicit Bootstrapping of PIP in Python Installations: PEP 453 Explicit Bootstrapping of PIP in Python Installations. 
* PEP 446; Newly Created File Descriptors Are Non-Inheritable: PEP 446 Newly Created File Descriptors Are Non-Inheritable. 
* Improvements to Codec Handling:: 
* PEP 451; A ModuleSpec Type for the Import System: PEP 451 A ModuleSpec Type for the Import System. 
* Other Language Changes: Other Language Changes<10>. 

PEP 453: Explicit Bootstrapping of PIP in Python Installations

* Bootstrapping pip By Default:: 
* Documentation Changes:: 

New Modules

* asyncio: asyncio<14>. 
* ensurepip: ensurepip<2>. 
* enum: enum<9>. 
* pathlib: pathlib<14>. 
* selectors: selectors<2>. 
* statistics: statistics<6>. 
* tracemalloc: tracemalloc<4>. 

Improved Modules

* abc:: 
* aifc: aifc<2>. 
* argparse: argparse<7>. 
* audioop:: 
* base64: base64<4>. 
* collections: collections<6>. 
* colorsys:: 
* contextlib: contextlib<6>. 
* dbm: dbm<6>. 
* dis: dis<5>. 
* doctest: doctest<4>. 
* email: email<5>. 
* filecmp:: 
* functools: functools<6>. 
* gc: gc<7>. 
* glob: glob<4>. 
* hashlib: hashlib<6>. 
* hmac: hmac<4>. 
* html:: 
* http: http<4>. 
* idlelib and IDLE: idlelib and IDLE<4>. 
* importlib: importlib<9>. 
* inspect: inspect<9>. 
* ipaddress: ipaddress<5>. 
* logging: logging<6>. 
* marshal: marshal<2>. 
* mmap: mmap<3>. 
* multiprocessing: multiprocessing<8>. 
* operator: operator<4>. 
* os: os<12>. 
* pdb: pdb<8>. 
* pickle: pickle<5>. 
* plistlib: plistlib<2>. 
* poplib: poplib<3>. 
* pprint: pprint<4>. 
* pty: pty<2>. 
* pydoc: pydoc<5>. 
* re: re<9>. 
* resource:: 
* select:: 
* shelve: shelve<2>. 
* shutil: shutil<6>. 
* smtpd: smtpd<3>. 
* smtplib: smtplib<3>. 
* socket: socket<10>. 
* sqlite3: sqlite3<10>. 
* ssl: ssl<11>. 
* stat:: 
* struct: struct<3>. 
* subprocess: subprocess<5>. 
* sunau: sunau<2>. 
* sys: sys<12>. 
* tarfile: tarfile<8>. 
* textwrap: textwrap<2>. 
* threading: threading<8>. 
* traceback: traceback<6>. 
* types: types<7>. 
* urllib: urllib<5>. 
* unittest: unittest<10>. 
* venv: venv<7>. 
* wave: wave<2>. 
* weakref: weakref<2>. 
* xml.etree: xml etree<2>. 
* zipfile: zipfile<6>. 

CPython Implementation Changes

* PEP 445; Customization of CPython Memory Allocators: PEP 445 Customization of CPython Memory Allocators. 
* PEP 442; Safe Object Finalization: PEP 442 Safe Object Finalization. 
* PEP 456; Secure and Interchangeable Hash Algorithm: PEP 456 Secure and Interchangeable Hash Algorithm. 
* PEP 436; Argument Clinic: PEP 436 Argument Clinic. 
* Other Build and C API Changes:: 
* Other Improvements: Other Improvements<2>. 
* Significant Optimizations:: 

Deprecated

* Deprecations in the Python API:: 
* Deprecated Features:: 

Removed

* Operating Systems No Longer Supported:: 
* API and Feature Removals: API and Feature Removals<5>. 
* Code Cleanups:: 

Porting to Python 3.4

* Changes in ‘python’ Command Behavior: Changes in ‘python’ Command Behavior<2>. 
* Changes in the Python API: Changes in the Python API<11>. 
* Changes in the C API: Changes in the C API<9>. 

Changed in 3.4.3

* PEP 476; Enabling certificate verification by default for stdlib http clients: PEP 476 Enabling certificate verification by default for stdlib http clients. 

What’s New In Python 3.3

* Summary – Release highlights: Summary – Release highlights<9>. 
* PEP 405; Virtual Environments: PEP 405 Virtual Environments. 
* PEP 420; Implicit Namespace Packages: PEP 420 Implicit Namespace Packages. 
* PEP 3118; New memoryview implementation and buffer protocol documentation: PEP 3118 New memoryview implementation and buffer protocol documentation. 
* PEP 393; Flexible String Representation: PEP 393 Flexible String Representation. 
* PEP 397; Python Launcher for Windows: PEP 397 Python Launcher for Windows. 
* PEP 3151; Reworking the OS and IO exception hierarchy: PEP 3151 Reworking the OS and IO exception hierarchy. 
* PEP 380; Syntax for Delegating to a Subgenerator: PEP 380 Syntax for Delegating to a Subgenerator. 
* PEP 409; Suppressing exception context: PEP 409 Suppressing exception context. 
* PEP 414; Explicit Unicode literals: PEP 414 Explicit Unicode literals. 
* PEP 3155; Qualified name for classes and functions: PEP 3155 Qualified name for classes and functions. 
* PEP 412; Key-Sharing Dictionary: PEP 412 Key-Sharing Dictionary. 
* PEP 362; Function Signature Object: PEP 362 Function Signature Object. 
* PEP 421; Adding sys.implementation: PEP 421 Adding sys implementation. 
* Using importlib as the Implementation of Import:: 
* Other Language Changes: Other Language Changes<11>. 
* A Finer-Grained Import Lock:: 
* Builtin functions and types:: 
* New Modules: New Modules<11>. 
* Improved Modules: Improved Modules<11>. 
* Optimizations: Optimizations<11>. 
* Build and C API Changes: Build and C API Changes<4>. 
* Deprecated: Deprecated<13>. 
* Porting to Python 3.3: Porting to Python 3 3. 

PEP 3118: New memoryview implementation and buffer protocol documentation

* Features:: 
* API changes:: 

PEP 393: Flexible String Representation

* Functionality:: 
* Performance and resource usage:: 

PEP 421: Adding sys.implementation

* SimpleNamespace:: 

Using importlib as the Implementation of Import

* New APIs:: 
* Visible Changes:: 

New Modules

* faulthandler: faulthandler<5>. 
* ipaddress: ipaddress<6>. 
* lzma: lzma<2>. 

Improved Modules

* abc: abc<2>. 
* array: array<5>. 
* base64: base64<5>. 
* binascii: binascii<3>. 
* bz2: bz2<2>. 
* codecs: codecs<2>. 
* collections: collections<7>. 
* contextlib: contextlib<7>. 
* crypt: crypt<2>. 
* curses: curses<6>. 
* datetime: datetime<7>. 
* decimal: decimal<4>. 
* email: email<6>. 
* ftplib: ftplib<3>. 
* functools: functools<7>. 
* gc: gc<8>. 
* hmac: hmac<5>. 
* http: http<5>. 
* html: html<2>. 
* imaplib: imaplib<4>. 
* inspect: inspect<10>. 
* io: io<8>. 
* itertools: itertools<7>. 
* logging: logging<7>. 
* math: math<10>. 
* mmap: mmap<4>. 
* multiprocessing: multiprocessing<9>. 
* nntplib: nntplib<2>. 
* os: os<13>. 
* pdb: pdb<9>. 
* pickle: pickle<6>. 
* pydoc: pydoc<6>. 
* re: re<10>. 
* sched:: 
* select: select<2>. 
* shlex: shlex<3>. 
* shutil: shutil<7>. 
* signal: signal<4>. 
* smtpd: smtpd<4>. 
* smtplib: smtplib<4>. 
* socket: socket<11>. 
* socketserver: socketserver<3>. 
* sqlite3: sqlite3<11>. 
* ssl: ssl<12>. 
* stat: stat<2>. 
* struct: struct<4>. 
* subprocess: subprocess<6>. 
* sys: sys<13>. 
* tarfile: tarfile<9>. 
* tempfile: tempfile<4>. 
* textwrap: textwrap<3>. 
* threading: threading<9>. 
* time: time<8>. 
* types: types<8>. 
* unittest: unittest<11>. 
* urllib: urllib<6>. 
* webbrowser: webbrowser<4>. 
* xml.etree.ElementTree: xml etree ElementTree<2>. 
* zlib: zlib<3>. 

decimal

* Features: Features<2>. 
* API changes: API changes<2>. 

email

* Policy Framework:: 
* Provisional Policy with New Header API:: 
* Other API Changes:: 

Deprecated

* Unsupported Operating Systems: Unsupported Operating Systems<2>. 
* Deprecated Python modules@comma{} functions and methods: Deprecated Python modules functions and methods<4>. 
* Deprecated functions and types of the C API: Deprecated functions and types of the C API<3>. 
* Deprecated features:: 

Porting to Python 3.3

* Porting Python code:: 
* Porting C code:: 
* Building C extensions:: 
* Command Line Switch Changes:: 

What’s New In Python 3.2

* PEP 384; Defining a Stable ABI: PEP 384 Defining a Stable ABI. 
* PEP 389; Argparse Command Line Parsing Module: PEP 389 Argparse Command Line Parsing Module. 
* PEP 391; Dictionary Based Configuration for Logging: PEP 391 Dictionary Based Configuration for Logging. 
* PEP 3148; The concurrent.futures module: PEP 3148 The concurrent futures module. 
* PEP 3147; PYC Repository Directories: PEP 3147 PYC Repository Directories. 
* PEP 3149; ABI Version Tagged .so Files: PEP 3149 ABI Version Tagged so Files. 
* PEP 3333; Python Web Server Gateway Interface v1.0.1: PEP 3333 Python Web Server Gateway Interface v1 0 1. 
* Other Language Changes: Other Language Changes<12>. 
* New@comma{} Improved@comma{} and Deprecated Modules: New Improved and Deprecated Modules. 
* Multi-threading:: 
* Optimizations: Optimizations<12>. 
* Unicode:: 
* Codecs:: 
* Documentation:: 
* IDLE:: 
* Code Repository:: 
* Build and C API Changes: Build and C API Changes<5>. 
* Porting to Python 3.2: Porting to Python 3 2. 

New, Improved, and Deprecated Modules

* email: email<7>. 
* elementtree:: 
* functools: functools<8>. 
* itertools: itertools<8>. 
* collections: collections<8>. 
* threading: threading<10>. 
* datetime and time:: 
* math: math<11>. 
* abc: abc<3>. 
* io: io<9>. 
* reprlib:: 
* logging: logging<8>. 
* csv: csv<4>. 
* contextlib: contextlib<8>. 
* decimal and fractions:: 
* ftp:: 
* popen:: 
* select: select<3>. 
* gzip and zipfile:: 
* tarfile: tarfile<10>. 
* hashlib: hashlib<7>. 
* ast: ast<7>. 
* os: os<14>. 
* shutil: shutil<8>. 
* sqlite3: sqlite3<12>. 
* html: html<3>. 
* socket: socket<12>. 
* ssl: ssl<13>. 
* nntp:: 
* certificates:: 
* imaplib: imaplib<5>. 
* http.client: http client<4>. 
* unittest: unittest<12>. 
* random: random<5>. 
* poplib: poplib<4>. 
* asyncore: asyncore<2>. 
* tempfile: tempfile<5>. 
* inspect: inspect<11>. 
* pydoc: pydoc<7>. 
* dis: dis<6>. 
* dbm: dbm<7>. 
* ctypes: ctypes<4>. 
* site: site<4>. 
* sysconfig: sysconfig<4>. 
* pdb: pdb<10>. 
* configparser: configparser<6>. 
* urllib.parse: urllib parse<6>. 
* mailbox:: 
* turtledemo:: 

What’s New In Python 3.1

* PEP 372; Ordered Dictionaries: PEP 372 Ordered Dictionaries. 
* PEP 378; Format Specifier for Thousands Separator: PEP 378 Format Specifier for Thousands Separator. 
* Other Language Changes: Other Language Changes<13>. 
* New@comma{} Improved@comma{} and Deprecated Modules: New Improved and Deprecated Modules<2>. 
* Optimizations: Optimizations<13>. 
* IDLE: IDLE<2>. 
* Build and C API Changes: Build and C API Changes<6>. 
* Porting to Python 3.1: Porting to Python 3 1. 

What’s New In Python 3.0

* Common Stumbling Blocks:: 
* Overview Of Syntax Changes:: 
* Changes Already Present In Python 2.6: Changes Already Present In Python 2 6. 
* Library Changes:: 
* PEP 3101; A New Approach To String Formatting: PEP 3101 A New Approach To String Formatting. 
* Changes To Exceptions:: 
* Miscellaneous Other Changes:: 
* Build and C API Changes: Build and C API Changes<7>. 
* Performance:: 
* Porting To Python 3.0: Porting To Python 3 0. 

Common Stumbling Blocks

* Print Is A Function:: 
* Views And Iterators Instead Of Lists:: 
* Ordering Comparisons:: 
* Integers:: 
* Text Vs. Data Instead Of Unicode Vs. 8-bit: Text Vs Data Instead Of Unicode Vs 8-bit. 

Overview Of Syntax Changes

* New Syntax:: 
* Changed Syntax:: 
* Removed Syntax:: 

Miscellaneous Other Changes

* Operators And Special Methods:: 
* Builtins:: 

What’s New in Python 2.7

* The Future for Python 2.x: The Future for Python 2 x. 
* Changes to the Handling of Deprecation Warnings:: 
* Python 3.1 Features: Python 3 1 Features. 
* PEP 372; Adding an Ordered Dictionary to collections: PEP 372 Adding an Ordered Dictionary to collections. 
* PEP 378; Format Specifier for Thousands Separator: PEP 378 Format Specifier for Thousands Separator<2>. 
* PEP 389; The argparse Module for Parsing Command Lines: PEP 389 The argparse Module for Parsing Command Lines. 
* PEP 391; Dictionary-Based Configuration For Logging: PEP 391 Dictionary-Based Configuration For Logging. 
* PEP 3106; Dictionary Views: PEP 3106 Dictionary Views. 
* PEP 3137; The memoryview Object: PEP 3137 The memoryview Object. 
* Other Language Changes: Other Language Changes<14>. 
* New and Improved Modules:: 
* Build and C API Changes: Build and C API Changes<8>. 
* Other Changes and Fixes:: 
* Porting to Python 2.7: Porting to Python 2 7. 
* New Features Added to Python 2.7 Maintenance Releases: New Features Added to Python 2 7 Maintenance Releases. 
* Acknowledgements:: 

Other Language Changes

* Interpreter Changes:: 
* Optimizations: Optimizations<14>. 

New and Improved Modules

* New module; importlib: New module importlib. 
* New module; sysconfig: New module sysconfig. 
* ttk; Themed Widgets for Tk: ttk Themed Widgets for Tk. 
* Updated module; unittest: Updated module unittest. 
* Updated module; ElementTree 1.3: Updated module ElementTree 1 3. 

Build and C API Changes

* Capsules:: 
* Port-Specific Changes; Windows: Port-Specific Changes Windows. 
* Port-Specific Changes; Mac OS X: Port-Specific Changes Mac OS X. 
* Port-Specific Changes; FreeBSD: Port-Specific Changes FreeBSD. 

New Features Added to Python 2.7 Maintenance Releases

* Two new environment variables for debug mode:: 
* PEP 434; IDLE Enhancement Exception for All Branches: PEP 434 IDLE Enhancement Exception for All Branches. 
* PEP 466; Network Security Enhancements for Python 2.7: PEP 466 Network Security Enhancements for Python 2 7. 
* PEP 477; Backport ensurepip (PEP 453) to Python 2.7: PEP 477 Backport ensurepip PEP 453 to Python 2 7. 
* PEP 476; Enabling certificate verification by default for stdlib http clients: PEP 476 Enabling certificate verification by default for stdlib http clients<2>. 
* PEP 493; HTTPS verification migration tools for Python 2.7: PEP 493 HTTPS verification migration tools for Python 2 7. 
* New make regen-all build target: New make regen-all build target<3>. 
* Removal of make touch build target: Removal of make touch build target<3>. 

PEP 477: Backport ensurepip (PEP 453) to Python 2.7

* Bootstrapping pip By Default: Bootstrapping pip By Default<2>. 
* Documentation Changes: Documentation Changes<2>. 

What’s New in Python 2.6

* Python 3.0: Python 3 0. 
* Changes to the Development Process:: 
* PEP 343; The ‘with’ statement: PEP 343 The ‘with’ statement. 
* PEP 366; Explicit Relative Imports From a Main Module: PEP 366 Explicit Relative Imports From a Main Module. 
* PEP 370; Per-user site-packages Directory: PEP 370 Per-user site-packages Directory. 
* PEP 371; The multiprocessing Package: PEP 371 The multiprocessing Package. 
* PEP 3101; Advanced String Formatting: PEP 3101 Advanced String Formatting. 
* PEP 3105; print As a Function: PEP 3105 print As a Function. 
* PEP 3110; Exception-Handling Changes: PEP 3110 Exception-Handling Changes. 
* PEP 3112; Byte Literals: PEP 3112 Byte Literals. 
* PEP 3116; New I/O Library: PEP 3116 New I/O Library. 
* PEP 3118; Revised Buffer Protocol: PEP 3118 Revised Buffer Protocol. 
* PEP 3119; Abstract Base Classes: PEP 3119 Abstract Base Classes. 
* PEP 3127; Integer Literal Support and Syntax: PEP 3127 Integer Literal Support and Syntax. 
* PEP 3129; Class Decorators: PEP 3129 Class Decorators. 
* PEP 3141; A Type Hierarchy for Numbers: PEP 3141 A Type Hierarchy for Numbers. 
* Other Language Changes: Other Language Changes<15>. 
* New and Improved Modules: New and Improved Modules<2>. 
* Deprecations and Removals:: 
* Build and C API Changes: Build and C API Changes<9>. 
* Porting to Python 2.6: Porting to Python 2 6. 
* Acknowledgements: Acknowledgements<2>. 

Changes to the Development Process

* New Issue Tracker; Roundup: New Issue Tracker Roundup. 
* New Documentation Format; reStructuredText Using Sphinx: New Documentation Format reStructuredText Using Sphinx. 

PEP 343: The ‘with’ statement

* Writing Context Managers:: 
* The contextlib module:: 

PEP 3141: A Type Hierarchy for Numbers

* The fractions Module:: 

Other Language Changes

* Optimizations: Optimizations<15>. 
* Interpreter Changes: Interpreter Changes<2>. 

New and Improved Modules

* The ast module:: 
* The future_builtins module:: 
* The json module; JavaScript Object Notation: The json module JavaScript Object Notation. 
* The plistlib module; A Property-List Parser: The plistlib module A Property-List Parser. 
* ctypes Enhancements:: 
* Improved SSL Support:: 

Build and C API Changes

* Port-Specific Changes; Windows: Port-Specific Changes Windows<2>. 
* Port-Specific Changes; Mac OS X: Port-Specific Changes Mac OS X<2>. 
* Port-Specific Changes; IRIX: Port-Specific Changes IRIX. 

What’s New in Python 2.5

* PEP 308; Conditional Expressions: PEP 308 Conditional Expressions. 
* PEP 309; Partial Function Application: PEP 309 Partial Function Application. 
* PEP 314; Metadata for Python Software Packages v1.1: PEP 314 Metadata for Python Software Packages v1 1. 
* PEP 328; Absolute and Relative Imports: PEP 328 Absolute and Relative Imports. 
* PEP 338; Executing Modules as Scripts: PEP 338 Executing Modules as Scripts. 
* PEP 341; Unified try/except/finally: PEP 341 Unified try/except/finally. 
* PEP 342; New Generator Features: PEP 342 New Generator Features. 
* PEP 343; The ‘with’ statement: PEP 343 The ‘with’ statement<2>. 
* PEP 352; Exceptions as New-Style Classes: PEP 352 Exceptions as New-Style Classes. 
* PEP 353; Using ssize_t as the index type: PEP 353 Using ssize_t as the index type. 
* PEP 357; The ‘__index__’ method: PEP 357 The ‘__index__’ method. 
* Other Language Changes: Other Language Changes<16>. 
* New@comma{} Improved@comma{} and Removed Modules: New Improved and Removed Modules. 
* Build and C API Changes: Build and C API Changes<10>. 
* Porting to Python 2.5: Porting to Python 2 5. 
* Acknowledgements: Acknowledgements<3>. 

PEP 343: The ‘with’ statement

* Writing Context Managers: Writing Context Managers<2>. 
* The contextlib module: The contextlib module<2>. 

Other Language Changes

* Interactive Interpreter Changes:: 
* Optimizations: Optimizations<16>. 

New, Improved, and Removed Modules

* The ctypes package:: 
* The ElementTree package:: 
* The hashlib package:: 
* The sqlite3 package:: 
* The wsgiref package:: 

Build and C API Changes

* Port-Specific Changes:: 

What’s New in Python 2.4

* PEP 218; Built-In Set Objects: PEP 218 Built-In Set Objects. 
* PEP 237; Unifying Long Integers and Integers: PEP 237 Unifying Long Integers and Integers. 
* PEP 289; Generator Expressions: PEP 289 Generator Expressions. 
* PEP 292; Simpler String Substitutions: PEP 292 Simpler String Substitutions. 
* PEP 318; Decorators for Functions and Methods: PEP 318 Decorators for Functions and Methods. 
* PEP 322; Reverse Iteration: PEP 322 Reverse Iteration. 
* PEP 324; New subprocess Module: PEP 324 New subprocess Module. 
* PEP 327; Decimal Data Type: PEP 327 Decimal Data Type. 
* PEP 328; Multi-line Imports: PEP 328 Multi-line Imports. 
* PEP 331; Locale-Independent Float/String Conversions: PEP 331 Locale-Independent Float/String Conversions. 
* Other Language Changes: Other Language Changes<17>. 
* New@comma{} Improved@comma{} and Deprecated Modules: New Improved and Deprecated Modules<3>. 
* Build and C API Changes: Build and C API Changes<11>. 
* Porting to Python 2.4: Porting to Python 2 4. 
* Acknowledgements: Acknowledgements<4>. 

PEP 327: Decimal Data Type

* Why is Decimal needed?:: 
* The Decimal type:: 
* The Context type:: 

Other Language Changes

* Optimizations: Optimizations<17>. 

New, Improved, and Deprecated Modules

* cookielib:: 
* doctest: doctest<5>. 

Build and C API Changes

* Port-Specific Changes: Port-Specific Changes<2>. 

What’s New in Python 2.3

* PEP 218; A Standard Set Datatype: PEP 218 A Standard Set Datatype. 
* PEP 255; Simple Generators: PEP 255 Simple Generators. 
* PEP 263; Source Code Encodings: PEP 263 Source Code Encodings. 
* PEP 273; Importing Modules from ZIP Archives: PEP 273 Importing Modules from ZIP Archives. 
* PEP 277; Unicode file name support for Windows NT: PEP 277 Unicode file name support for Windows NT. 
* PEP 278; Universal Newline Support: PEP 278 Universal Newline Support. 
* PEP 279; enumerate(): PEP 279 enumerate. 
* PEP 282; The logging Package: PEP 282 The logging Package. 
* PEP 285; A Boolean Type: PEP 285 A Boolean Type. 
* PEP 293; Codec Error Handling Callbacks: PEP 293 Codec Error Handling Callbacks. 
* PEP 301; Package Index and Metadata for Distutils: PEP 301 Package Index and Metadata for Distutils. 
* PEP 302; New Import Hooks: PEP 302 New Import Hooks. 
* PEP 305; Comma-separated Files: PEP 305 Comma-separated Files. 
* PEP 307; Pickle Enhancements: PEP 307 Pickle Enhancements. 
* Extended Slices:: 
* Other Language Changes: Other Language Changes<18>. 
* New@comma{} Improved@comma{} and Deprecated Modules: New Improved and Deprecated Modules<4>. 
* Pymalloc; A Specialized Object Allocator: Pymalloc A Specialized Object Allocator. 
* Build and C API Changes: Build and C API Changes<12>. 
* Other Changes and Fixes: Other Changes and Fixes<2>. 
* Porting to Python 2.3: Porting to Python 2 3. 
* Acknowledgements: Acknowledgements<5>. 

Other Language Changes

* String Changes:: 
* Optimizations: Optimizations<18>. 

New, Improved, and Deprecated Modules

* Date/Time Type:: 
* The optparse Module:: 

Build and C API Changes

* Port-Specific Changes: Port-Specific Changes<3>. 

What’s New in Python 2.2

* Introduction:: 
* PEPs 252 and 253; Type and Class Changes: PEPs 252 and 253 Type and Class Changes. 
* PEP 234; Iterators: PEP 234 Iterators. 
* PEP 255; Simple Generators: PEP 255 Simple Generators<2>. 
* PEP 237; Unifying Long Integers and Integers: PEP 237 Unifying Long Integers and Integers<2>. 
* PEP 238; Changing the Division Operator: PEP 238 Changing the Division Operator. 
* Unicode Changes:: 
* PEP 227; Nested Scopes: PEP 227 Nested Scopes. 
* New and Improved Modules: New and Improved Modules<3>. 
* Interpreter Changes and Fixes:: 
* Other Changes and Fixes: Other Changes and Fixes<3>. 
* Acknowledgements: Acknowledgements<6>. 

PEPs 252 and 253: Type and Class Changes

* Old and New Classes:: 
* Descriptors:: 
* Multiple Inheritance; The Diamond Rule: Multiple Inheritance The Diamond Rule. 
* Attribute Access:: 
* Related Links:: 

What’s New in Python 2.1

* Introduction: Introduction<2>. 
* PEP 227; Nested Scopes: PEP 227 Nested Scopes<2>. 
* PEP 236; __future__ Directives: PEP 236 __future__ Directives. 
* PEP 207; Rich Comparisons: PEP 207 Rich Comparisons. 
* PEP 230; Warning Framework: PEP 230 Warning Framework. 
* PEP 229; New Build System: PEP 229 New Build System. 
* PEP 205; Weak References: PEP 205 Weak References. 
* PEP 232; Function Attributes: PEP 232 Function Attributes. 
* PEP 235; Importing Modules on Case-Insensitive Platforms: PEP 235 Importing Modules on Case-Insensitive Platforms. 
* PEP 217; Interactive Display Hook: PEP 217 Interactive Display Hook. 
* PEP 208; New Coercion Model: PEP 208 New Coercion Model. 
* PEP 241; Metadata in Python Packages: PEP 241 Metadata in Python Packages. 
* New and Improved Modules: New and Improved Modules<4>. 
* Other Changes and Fixes: Other Changes and Fixes<4>. 
* Acknowledgements: Acknowledgements<7>. 

What’s New in Python 2.0

* Introduction: Introduction<3>. 
* What About Python 1.6?: What About Python 1 6?. 
* New Development Process:: 
* Unicode: Unicode<2>. 
* List Comprehensions:: 
* Augmented Assignment:: 
* String Methods:: 
* Garbage Collection of Cycles:: 
* Other Core Changes:: 
* Porting to 2.0: Porting to 2 0. 
* Extending/Embedding Changes:: 
* Distutils; Making Modules Easy to Install: Distutils Making Modules Easy to Install. 
* XML Modules:: 
* Module changes:: 
* New modules: New modules<2>. 
* IDLE Improvements:: 
* Deleted and Deprecated Modules:: 
* Acknowledgements: Acknowledgements<8>. 

Other Core Changes

* Minor Language Changes:: 
* Changes to Built-in Functions:: 

XML Modules

* SAX2 Support:: 
* DOM Support:: 
* Relationship to PyXML:: 

Changelog

* Python next:: 
* Python 3.14.6 final: Python 3 14 6 final. 
* Python 3.14.5 final: Python 3 14 5 final. 
* Python 3.14.5 release candidate 1: Python 3 14 5 release candidate 1. 
* Python 3.14.4 final: Python 3 14 4 final. 
* Python 3.14.3 final: Python 3 14 3 final. 
* Python 3.14.2 final: Python 3 14 2 final. 
* Python 3.14.1 final: Python 3 14 1 final. 
* Python 3.14.0 final: Python 3 14 0 final. 
* Python 3.14.0 release candidate 3: Python 3 14 0 release candidate 3. 
* Python 3.14.0 release candidate 2: Python 3 14 0 release candidate 2. 
* Python 3.14.0 release candidate 1: Python 3 14 0 release candidate 1. 
* Python 3.14.0 beta 4: Python 3 14 0 beta 4. 
* Python 3.14.0 beta 3: Python 3 14 0 beta 3. 
* Python 3.14.0 beta 2: Python 3 14 0 beta 2. 
* Python 3.14.0 beta 1: Python 3 14 0 beta 1. 
* Python 3.14.0 alpha 7: Python 3 14 0 alpha 7. 
* Python 3.14.0 alpha 6: Python 3 14 0 alpha 6. 
* Python 3.14.0 alpha 5: Python 3 14 0 alpha 5. 
* Python 3.14.0 alpha 4: Python 3 14 0 alpha 4. 
* Python 3.14.0 alpha 3: Python 3 14 0 alpha 3. 
* Python 3.14.0 alpha 2: Python 3 14 0 alpha 2. 
* Python 3.14.0 alpha 1: Python 3 14 0 alpha 1. 
* Python 3.13.0 beta 1: Python 3 13 0 beta 1. 
* Python 3.13.0 alpha 6: Python 3 13 0 alpha 6. 
* Python 3.13.0 alpha 5: Python 3 13 0 alpha 5. 
* Python 3.13.0 alpha 4: Python 3 13 0 alpha 4. 
* Python 3.13.0 alpha 3: Python 3 13 0 alpha 3. 
* Python 3.13.0 alpha 2: Python 3 13 0 alpha 2. 
* Python 3.13.0 alpha 1: Python 3 13 0 alpha 1. 
* Python 3.12.0 beta 1: Python 3 12 0 beta 1. 
* Python 3.12.0 alpha 7: Python 3 12 0 alpha 7. 
* Python 3.12.0 alpha 6: Python 3 12 0 alpha 6. 
* Python 3.12.0 alpha 5: Python 3 12 0 alpha 5. 
* Python 3.12.0 alpha 4: Python 3 12 0 alpha 4. 
* Python 3.12.0 alpha 3: Python 3 12 0 alpha 3. 
* Python 3.12.0 alpha 2: Python 3 12 0 alpha 2. 
* Python 3.12.0 alpha 1: Python 3 12 0 alpha 1. 
* Python 3.11.0 beta 1: Python 3 11 0 beta 1. 
* Python 3.11.0 alpha 7: Python 3 11 0 alpha 7. 
* Python 3.11.0 alpha 6: Python 3 11 0 alpha 6. 
* Python 3.11.0 alpha 5: Python 3 11 0 alpha 5. 
* Python 3.11.0 alpha 4: Python 3 11 0 alpha 4. 
* Python 3.11.0 alpha 3: Python 3 11 0 alpha 3. 
* Python 3.11.0 alpha 2: Python 3 11 0 alpha 2. 
* Python 3.11.0 alpha 1: Python 3 11 0 alpha 1. 
* Python 3.10.0 beta 1: Python 3 10 0 beta 1. 
* Python 3.10.0 alpha 7: Python 3 10 0 alpha 7. 
* Python 3.10.0 alpha 6: Python 3 10 0 alpha 6. 
* Python 3.10.0 alpha 5: Python 3 10 0 alpha 5. 
* Python 3.10.0 alpha 4: Python 3 10 0 alpha 4. 
* Python 3.10.0 alpha 3: Python 3 10 0 alpha 3. 
* Python 3.10.0 alpha 2: Python 3 10 0 alpha 2. 
* Python 3.10.0 alpha 1: Python 3 10 0 alpha 1. 
* Python 3.9.0 beta 1: Python 3 9 0 beta 1. 
* Python 3.9.0 alpha 6: Python 3 9 0 alpha 6. 
* Python 3.9.0 alpha 5: Python 3 9 0 alpha 5. 
* Python 3.9.0 alpha 4: Python 3 9 0 alpha 4. 
* Python 3.9.0 alpha 3: Python 3 9 0 alpha 3. 
* Python 3.9.0 alpha 2: Python 3 9 0 alpha 2. 
* Python 3.9.0 alpha 1: Python 3 9 0 alpha 1. 
* Python 3.8.0 beta 1: Python 3 8 0 beta 1. 
* Python 3.8.0 alpha 4: Python 3 8 0 alpha 4. 
* Python 3.8.0 alpha 3: Python 3 8 0 alpha 3. 
* Python 3.8.0 alpha 2: Python 3 8 0 alpha 2. 
* Python 3.8.0 alpha 1: Python 3 8 0 alpha 1. 
* Python 3.7.0 final: Python 3 7 0 final. 
* Python 3.7.0 release candidate 1: Python 3 7 0 release candidate 1. 
* Python 3.7.0 beta 5: Python 3 7 0 beta 5. 
* Python 3.7.0 beta 4: Python 3 7 0 beta 4. 
* Python 3.7.0 beta 3: Python 3 7 0 beta 3. 
* Python 3.7.0 beta 2: Python 3 7 0 beta 2. 
* Python 3.7.0 beta 1: Python 3 7 0 beta 1. 
* Python 3.7.0 alpha 4: Python 3 7 0 alpha 4. 
* Python 3.7.0 alpha 3: Python 3 7 0 alpha 3. 
* Python 3.7.0 alpha 2: Python 3 7 0 alpha 2. 
* Python 3.7.0 alpha 1: Python 3 7 0 alpha 1. 
* Python 3.6.6 final: Python 3 6 6 final. 
* Python 3.6.6 release candidate 1: Python 3 6 6 release candidate 1. 
* Python 3.6.5 final: Python 3 6 5 final. 
* Python 3.6.5 release candidate 1: Python 3 6 5 release candidate 1. 
* Python 3.6.4 final: Python 3 6 4 final. 
* Python 3.6.4 release candidate 1: Python 3 6 4 release candidate 1. 
* Python 3.6.3 final: Python 3 6 3 final. 
* Python 3.6.3 release candidate 1: Python 3 6 3 release candidate 1. 
* Python 3.6.2 final: Python 3 6 2 final. 
* Python 3.6.2 release candidate 2: Python 3 6 2 release candidate 2. 
* Python 3.6.2 release candidate 1: Python 3 6 2 release candidate 1. 
* Python 3.6.1 final: Python 3 6 1 final. 
* Python 3.6.1 release candidate 1: Python 3 6 1 release candidate 1. 
* Python 3.6.0 final: Python 3 6 0 final. 
* Python 3.6.0 release candidate 2: Python 3 6 0 release candidate 2. 
* Python 3.6.0 release candidate 1: Python 3 6 0 release candidate 1. 
* Python 3.6.0 beta 4: Python 3 6 0 beta 4. 
* Python 3.6.0 beta 3: Python 3 6 0 beta 3. 
* Python 3.6.0 beta 2: Python 3 6 0 beta 2. 
* Python 3.6.0 beta 1: Python 3 6 0 beta 1. 
* Python 3.6.0 alpha 4: Python 3 6 0 alpha 4. 
* Python 3.6.0 alpha 3: Python 3 6 0 alpha 3. 
* Python 3.6.0 alpha 2: Python 3 6 0 alpha 2. 
* Python 3.6.0 alpha 1: Python 3 6 0 alpha 1. 
* Python 3.5.5 final: Python 3 5 5 final. 
* Python 3.5.5 release candidate 1: Python 3 5 5 release candidate 1. 
* Python 3.5.4 final: Python 3 5 4 final. 
* Python 3.5.4 release candidate 1: Python 3 5 4 release candidate 1. 
* Python 3.5.3 final: Python 3 5 3 final. 
* Python 3.5.3 release candidate 1: Python 3 5 3 release candidate 1. 
* Python 3.5.2 final: Python 3 5 2 final. 
* Python 3.5.2 release candidate 1: Python 3 5 2 release candidate 1. 
* Python 3.5.1 final: Python 3 5 1 final. 
* Python 3.5.1 release candidate 1: Python 3 5 1 release candidate 1. 
* Python 3.5.0 final: Python 3 5 0 final. 
* Python 3.5.0 release candidate 4: Python 3 5 0 release candidate 4. 
* Python 3.5.0 release candidate 3: Python 3 5 0 release candidate 3. 
* Python 3.5.0 release candidate 2: Python 3 5 0 release candidate 2. 
* Python 3.5.0 release candidate 1: Python 3 5 0 release candidate 1. 
* Python 3.5.0 beta 4: Python 3 5 0 beta 4. 
* Python 3.5.0 beta 3: Python 3 5 0 beta 3. 
* Python 3.5.0 beta 2: Python 3 5 0 beta 2. 
* Python 3.5.0 beta 1: Python 3 5 0 beta 1. 
* Python 3.5.0 alpha 4: Python 3 5 0 alpha 4. 
* Python 3.5.0 alpha 3: Python 3 5 0 alpha 3. 
* Python 3.5.0 alpha 2: Python 3 5 0 alpha 2. 
* Python 3.5.0 alpha 1: Python 3 5 0 alpha 1. 

Python next

* Tests:: 
* Library:: 
* Documentation: Documentation<2>. 
* Core and Builtins:: 
* C API:: 
* Build:: 

Python 3.14.6 final

* Security:: 
* Core and Builtins: Core and Builtins<2>. 
* Library: Library<2>. 
* Documentation: Documentation<3>. 
* Tests: Tests<2>. 
* Build: Build<2>. 
* Windows:: 
* macOS:: 
* IDLE: IDLE<3>. 
* C API: C API<2>. 

Python 3.14.5 final

* Security: Security<2>. 
* Core and Builtins: Core and Builtins<3>. 
* Library: Library<3>. 
* Tests: Tests<3>. 
* macOS: macOS<2>. 

Python 3.14.5 release candidate 1

* Security: Security<3>. 
* Core and Builtins: Core and Builtins<4>. 
* Library: Library<4>. 
* Documentation: Documentation<4>. 
* Build: Build<3>. 
* Windows: Windows<2>. 
* macOS: macOS<3>. 

Python 3.14.4 final

* Security: Security<4>. 
* Core and Builtins: Core and Builtins<5>. 
* Library: Library<5>. 
* Documentation: Documentation<5>. 
* Tests: Tests<4>. 
* Build: Build<4>. 
* Windows: Windows<3>. 
* macOS: macOS<4>. 
* C API: C API<3>. 

Python 3.14.3 final

* Windows: Windows<4>. 
* Tools/Demos:: 
* Tests: Tests<5>. 
* Security: Security<5>. 
* Library: Library<6>. 
* IDLE: IDLE<4>. 
* Documentation: Documentation<6>. 
* Core and Builtins: Core and Builtins<6>. 
* C API: C API<4>. 
* Build: Build<5>. 

Python 3.14.2 final

* Security: Security<6>. 
* Library: Library<7>. 
* Core and Builtins: Core and Builtins<7>. 
* Library: Library<8>. 

Python 3.14.1 final

* Windows: Windows<5>. 
* Tools/Demos: Tools/Demos<2>. 
* Tests: Tests<6>. 
* Security: Security<7>. 
* Library: Library<9>. 
* IDLE: IDLE<5>. 
* Documentation: Documentation<7>. 
* Core and Builtins: Core and Builtins<8>. 
* Library: Library<10>. 
* Core and Builtins: Core and Builtins<9>. 
* Library: Library<11>. 
* Core and Builtins: Core and Builtins<10>. 
* Library: Library<12>. 
* Core and Builtins: Core and Builtins<11>. 
* Library: Library<13>. 
* Core and Builtins: Core and Builtins<12>. 
* Library: Library<14>. 
* Core and Builtins: Core and Builtins<13>. 
* Library: Library<15>. 
* Core and Builtins: Core and Builtins<14>. 
* C API: C API<5>. 
* Build: Build<6>. 

Python 3.14.0 final

* macOS: macOS<5>. 
* Windows: Windows<6>. 
* Tools/Demos: Tools/Demos<3>. 
* Security: Security<8>. 
* Library: Library<16>. 

Python 3.14.0 release candidate 3

* Windows: Windows<7>. 
* Tools/Demos: Tools/Demos<4>. 
* Security: Security<9>. 
* Library: Library<17>. 
* Core and Builtins: Core and Builtins<15>. 

Python 3.14.0 release candidate 2

* macOS: macOS<6>. 
* Windows: Windows<8>. 
* Library: Library<18>. 
* Documentation: Documentation<8>. 
* Core and Builtins: Core and Builtins<16>. 
* C API: C API<6>. 
* Build: Build<7>. 

Python 3.14.0 release candidate 1

* Tools/Demos: Tools/Demos<5>. 
* Security: Security<10>. 
* Library: Library<19>. 
* Core and Builtins: Core and Builtins<17>. 
* Library: Library<20>. 
* Core and Builtins: Core and Builtins<18>. 
* Library: Library<21>. 
* Core and Builtins: Core and Builtins<19>. 
* C API: C API<7>. 
* Build: Build<8>. 

Python 3.14.0 beta 4

* Tools/Demos: Tools/Demos<6>. 
* Tests: Tests<7>. 
* Security: Security<11>. 
* Library: Library<22>. 
* Documentation: Documentation<9>. 
* Core and Builtins: Core and Builtins<20>. 
* C API: C API<8>. 
* Build: Build<9>. 

Python 3.14.0 beta 3

* Windows: Windows<9>. 
* Tests: Tests<8>. 
* Security: Security<12>. 
* Library: Library<23>. 
* Documentation: Documentation<10>. 
* Core and Builtins: Core and Builtins<21>. 
* Library: Library<24>. 
* Core and Builtins: Core and Builtins<22>. 
* Library: Library<25>. 
* Core and Builtins: Core and Builtins<23>. 
* Library: Library<26>. 
* Core and Builtins: Core and Builtins<24>. 
* C API: C API<9>. 
* Build: Build<10>. 

Python 3.14.0 beta 2

* Windows: Windows<10>. 
* Tools/Demos: Tools/Demos<7>. 
* Tests: Tests<9>. 
* Security: Security<13>. 
* Library: Library<27>. 
* Core and Builtins: Core and Builtins<25>. 
* C API: C API<10>. 
* Build: Build<11>. 

Python 3.14.0 beta 1

* Windows: Windows<11>. 
* Tools/Demos: Tools/Demos<8>. 
* Tests: Tests<10>. 
* Security: Security<14>. 
* Library: Library<28>. 
* IDLE: IDLE<6>. 
* Documentation: Documentation<11>. 
* Core and Builtins: Core and Builtins<26>. 
* Library: Library<29>. 
* Core and Builtins: Core and Builtins<27>. 
* Library: Library<30>. 
* Core and Builtins: Core and Builtins<28>. 
* Library: Library<31>. 
* C API: C API<11>. 
* Build: Build<12>. 

Python 3.14.0 alpha 7

* macOS: macOS<7>. 
* Windows: Windows<12>. 
* Tools/Demos: Tools/Demos<9>. 
* Tests: Tests<11>. 
* Security: Security<15>. 
* Library: Library<32>. 
* Documentation: Documentation<12>. 
* Core and Builtins: Core and Builtins<29>. 
* Library: Library<33>. 
* Core and Builtins: Core and Builtins<30>. 
* C API: C API<12>. 
* Build: Build<13>. 

Python 3.14.0 alpha 6

* macOS: macOS<8>. 
* Windows: Windows<13>. 
* Tools/Demos: Tools/Demos<10>. 
* Tests: Tests<12>. 
* Security: Security<16>. 
* Library: Library<34>. 
* Documentation: Documentation<13>. 
* Core and Builtins: Core and Builtins<31>. 
* Library: Library<35>. 
* Core and Builtins: Core and Builtins<32>. 
* Library: Library<36>. 
* Core and Builtins: Core and Builtins<33>. 
* C API: C API<13>. 
* Build: Build<14>. 

Python 3.14.0 alpha 5

* macOS: macOS<9>. 
* Tools/Demos: Tools/Demos<11>. 
* Tests: Tests<13>. 
* Security: Security<17>. 
* Library: Library<37>. 
* IDLE: IDLE<7>. 
* Documentation: Documentation<14>. 
* Core and Builtins: Core and Builtins<34>. 
* Library: Library<38>. 
* Core and Builtins: Core and Builtins<35>. 
* Library: Library<39>. 
* Core and Builtins: Core and Builtins<36>. 
* Library: Library<40>. 
* C API: C API<14>. 
* Build: Build<15>. 

Python 3.14.0 alpha 4

* macOS: macOS<10>. 
* Tools/Demos: Tools/Demos<12>. 
* Tests: Tests<14>. 
* Library: Library<41>. 
* Core and Builtins: Core and Builtins<37>. 
* Library: Library<42>. 
* Core and Builtins: Core and Builtins<38>. 
* Library: Library<43>. 
* Core and Builtins: Core and Builtins<39>. 
* C API: C API<15>. 
* Build: Build<16>. 

Python 3.14.0 alpha 3

* Windows: Windows<14>. 
* Tools/Demos: Tools/Demos<13>. 
* Tests: Tests<15>. 
* Security: Security<18>. 
* Library: Library<44>. 
* Documentation: Documentation<15>. 
* Core and Builtins: Core and Builtins<40>. 
* Library: Library<45>. 
* Core and Builtins: Core and Builtins<41>. 
* C API: C API<16>. 
* Build: Build<17>. 

Python 3.14.0 alpha 2

* Windows: Windows<15>. 
* Tools/Demos: Tools/Demos<14>. 
* Tests: Tests<16>. 
* Security: Security<19>. 
* Library: Library<46>. 
* Documentation: Documentation<16>. 
* Core and Builtins: Core and Builtins<42>. 
* Library: Library<47>. 
* Core and Builtins: Core and Builtins<43>. 
* Library: Library<48>. 
* Core and Builtins: Core and Builtins<44>. 
* Library: Library<49>. 
* C API: C API<17>. 
* Build: Build<18>. 

Python 3.14.0 alpha 1

* macOS: macOS<11>. 
* Windows: Windows<16>. 
* Tools/Demos: Tools/Demos<15>. 
* Tests: Tests<17>. 
* Security: Security<20>. 
* Library: Library<50>. 
* IDLE: IDLE<8>. 
* Documentation: Documentation<17>. 
* Core and Builtins: Core and Builtins<45>. 
* Library: Library<51>. 
* Core and Builtins: Core and Builtins<46>. 
* Library: Library<52>. 
* Core and Builtins: Core and Builtins<47>. 
* Library: Library<53>. 
* Core and Builtins: Core and Builtins<48>. 
* Library: Library<54>. 
* Core and Builtins: Core and Builtins<49>. 
* Library: Library<55>. 
* Core and Builtins: Core and Builtins<50>. 
* Library: Library<56>. 
* Core and Builtins: Core and Builtins<51>. 
* Library: Library<57>. 
* Core and Builtins: Core and Builtins<52>. 
* C API: C API<18>. 
* Build: Build<19>. 

Python 3.13.0 beta 1

* Security: Security<21>. 
* Core and Builtins: Core and Builtins<53>. 
* Library: Library<58>. 
* Core and Builtins: Core and Builtins<54>. 
* Library: Library<59>. 
* Documentation: Documentation<18>. 
* Build: Build<20>. 
* Windows: Windows<17>. 
* macOS: macOS<12>. 
* IDLE: IDLE<9>. 
* C API: C API<19>. 

Python 3.13.0 alpha 6

* Core and Builtins: Core and Builtins<55>. 
* Library: Library<60>. 
* Core and Builtins: Core and Builtins<56>. 
* Library: Library<61>. 
* Documentation: Documentation<19>. 
* Tests: Tests<18>. 
* Build: Build<21>. 
* Windows: Windows<18>. 
* C API: C API<20>. 

Python 3.13.0 alpha 5

* Security: Security<22>. 
* Core and Builtins: Core and Builtins<57>. 
* Library: Library<62>. 
* Core and Builtins: Core and Builtins<58>. 
* Library: Library<63>. 
* Core and Builtins: Core and Builtins<59>. 
* Library: Library<64>. 
* Documentation: Documentation<20>. 
* Tests: Tests<19>. 
* Build: Build<22>. 
* Windows: Windows<19>. 
* macOS: macOS<13>. 
* IDLE: IDLE<10>. 
* Tools/Demos: Tools/Demos<16>. 
* C API: C API<21>. 

Python 3.13.0 alpha 4

* Security: Security<23>. 
* Core and Builtins: Core and Builtins<60>. 
* Library: Library<65>. 
* Documentation: Documentation<21>. 
* Tests: Tests<20>. 
* Build: Build<23>. 
* Windows: Windows<20>. 
* macOS: macOS<14>. 
* IDLE: IDLE<11>. 
* Tools/Demos: Tools/Demos<17>. 
* C API: C API<22>. 

Python 3.13.0 alpha 3

* Security: Security<24>. 
* Core and Builtins: Core and Builtins<61>. 
* Library: Library<66>. 
* Documentation: Documentation<22>. 
* Tests: Tests<21>. 
* Build: Build<24>. 
* Windows: Windows<21>. 
* macOS: macOS<15>. 
* IDLE: IDLE<12>. 
* C API: C API<23>. 

Python 3.13.0 alpha 2

* Core and Builtins: Core and Builtins<62>. 
* Library: Library<67>. 
* Tests: Tests<22>. 
* Build: Build<25>. 
* Windows: Windows<22>. 
* macOS: macOS<16>. 
* IDLE: IDLE<13>. 
* Tools/Demos: Tools/Demos<18>. 
* C API: C API<24>. 

Python 3.13.0 alpha 1

* Security: Security<25>. 
* Core and Builtins: Core and Builtins<63>. 
* Library: Library<68>. 
* Documentation: Documentation<23>. 
* Tests: Tests<23>. 
* Build: Build<26>. 
* Windows: Windows<23>. 
* macOS: macOS<17>. 
* IDLE: IDLE<14>. 
* Tools/Demos: Tools/Demos<19>. 
* C API: C API<25>. 

Python 3.12.0 beta 1

* Security: Security<26>. 
* Library: Library<69>. 
* Core and Builtins: Core and Builtins<64>. 
* Library: Library<70>. 
* Core and Builtins: Core and Builtins<65>. 
* Library: Library<71>. 
* Documentation: Documentation<24>. 
* Tests: Tests<24>. 
* Build: Build<27>. 
* Windows: Windows<24>. 
* macOS: macOS<18>. 
* IDLE: IDLE<15>. 
* Tools/Demos: Tools/Demos<20>. 
* C API: C API<26>. 

Python 3.12.0 alpha 7

* Core and Builtins: Core and Builtins<66>. 
* Library: Library<72>. 
* Core and Builtins: Core and Builtins<67>. 
* Build: Build<28>. 
* Core and Builtins: Core and Builtins<68>. 
* Library: Library<73>. 
* Documentation: Documentation<25>. 
* Tests: Tests<25>. 
* Build: Build<29>. 
* Windows: Windows<25>. 
* Tools/Demos: Tools/Demos<21>. 
* C API: C API<27>. 

Python 3.12.0 alpha 6

* Security: Security<27>. 
* Core and Builtins: Core and Builtins<69>. 
* Library: Library<74>. 
* Documentation: Documentation<26>. 
* Tests: Tests<26>. 
* Build: Build<30>. 
* Windows: Windows<26>. 
* macOS: macOS<19>. 
* C API: C API<28>. 

Python 3.12.0 alpha 5

* Security: Security<28>. 
* Core and Builtins: Core and Builtins<70>. 
* Library: Library<75>. 
* Documentation: Documentation<27>. 
* Tests: Tests<27>. 
* Build: Build<31>. 
* Windows: Windows<27>. 

Python 3.12.0 alpha 4

* Core and Builtins: Core and Builtins<71>. 
* Library: Library<76>. 
* Core and Builtins: Core and Builtins<72>. 
* Library: Library<77>. 
* Core and Builtins: Core and Builtins<73>. 
* Library: Library<78>. 
* Documentation: Documentation<28>. 
* Tests: Tests<28>. 
* Build: Build<32>. 
* Windows: Windows<28>. 
* macOS: macOS<20>. 
* Tools/Demos: Tools/Demos<22>. 
* C API: C API<29>. 

Python 3.12.0 alpha 3

* Security: Security<29>. 
* Core and Builtins: Core and Builtins<74>. 
* Library: Library<79>. 
* Core and Builtins: Core and Builtins<75>. 
* Library: Library<80>. 
* Documentation: Documentation<29>. 
* Tests: Tests<29>. 
* Build: Build<33>. 
* Windows: Windows<29>. 
* macOS: macOS<21>. 
* Tools/Demos: Tools/Demos<23>. 
* C API: C API<30>. 

Python 3.12.0 alpha 2

* Security: Security<30>. 
* Core and Builtins: Core and Builtins<76>. 
* Build: Build<34>. 
* Core and Builtins: Core and Builtins<77>. 
* Library: Library<81>. 
* Documentation: Documentation<30>. 
* Tests: Tests<30>. 
* Build: Build<35>. 
* Windows: Windows<30>. 
* macOS: macOS<22>. 
* C API: C API<31>. 

Python 3.12.0 alpha 1

* Security: Security<31>. 
* Core and Builtins: Core and Builtins<78>. 
* Library: Library<82>. 
* Core and Builtins: Core and Builtins<79>. 
* Library: Library<83>. 
* Core and Builtins: Core and Builtins<80>. 
* Library: Library<84>. 
* Core and Builtins: Core and Builtins<81>. 
* Library: Library<85>. 
* Core and Builtins: Core and Builtins<82>. 
* Library: Library<86>. 
* Core and Builtins: Core and Builtins<83>. 
* Library: Library<87>. 
* Core and Builtins: Core and Builtins<84>. 
* Library: Library<88>. 
* Core and Builtins: Core and Builtins<85>. 
* Library: Library<89>. 
* Core and Builtins: Core and Builtins<86>. 
* Library: Library<90>. 
* Core and Builtins: Core and Builtins<87>. 
* Library: Library<91>. 
* Documentation: Documentation<31>. 
* Tests: Tests<31>. 
* Build: Build<36>. 
* Windows: Windows<31>. 
* macOS: macOS<23>. 
* IDLE: IDLE<16>. 
* Tools/Demos: Tools/Demos<24>. 
* C API: C API<32>. 

Python 3.11.0 beta 1

* Security: Security<32>. 
* Core and Builtins: Core and Builtins<88>. 
* Library: Library<92>. 
* Core and Builtins: Core and Builtins<89>. 
* Build: Build<37>. 
* Core and Builtins: Core and Builtins<90>. 
* Library: Library<93>. 
* Documentation: Documentation<32>. 
* Tests: Tests<32>. 
* Build: Build<38>. 
* Windows: Windows<32>. 
* macOS: macOS<24>. 
* Tools/Demos: Tools/Demos<25>. 
* C API: C API<33>. 

Python 3.11.0 alpha 7

* Core and Builtins: Core and Builtins<91>. 
* Library: Library<94>. 
* Core and Builtins: Core and Builtins<92>. 
* Library: Library<95>. 
* Core and Builtins: Core and Builtins<93>. 
* Library: Library<96>. 
* Documentation: Documentation<33>. 
* Tests: Tests<33>. 
* Build: Build<39>. 
* Windows: Windows<33>. 
* macOS: macOS<25>. 
* Tools/Demos: Tools/Demos<26>. 
* C API: C API<34>. 

Python 3.11.0 alpha 6

* Core and Builtins: Core and Builtins<94>. 
* Library: Library<97>. 
* Core and Builtins: Core and Builtins<95>. 
* Library: Library<98>. 
* Core and Builtins: Core and Builtins<96>. 
* Library: Library<99>. 
* Core and Builtins: Core and Builtins<97>. 
* Library: Library<100>. 
* Documentation: Documentation<34>. 
* Tests: Tests<34>. 
* Build: Build<40>. 
* Windows: Windows<34>. 
* IDLE: IDLE<17>. 
* C API: C API<35>. 

Python 3.11.0 alpha 5

* Core and Builtins: Core and Builtins<98>. 
* Library: Library<101>. 
* Core and Builtins: Core and Builtins<99>. 
* Library: Library<102>. 
* Build: Build<41>. 
* Core and Builtins: Core and Builtins<100>. 
* Library: Library<103>. 
* Documentation: Documentation<35>. 
* Tests: Tests<35>. 
* Build: Build<42>. 
* Windows: Windows<35>. 
* macOS: macOS<26>. 
* IDLE: IDLE<18>. 
* C API: C API<36>. 

Python 3.11.0 alpha 4

* Core and Builtins: Core and Builtins<101>. 
* Library: Library<104>. 
* Core and Builtins: Core and Builtins<102>. 
* Library: Library<105>. 
* Core and Builtins: Core and Builtins<103>. 
* Library: Library<106>. 
* Core and Builtins: Core and Builtins<104>. 
* Library: Library<107>. 
* Documentation: Documentation<36>. 
* Tests: Tests<36>. 
* Build: Build<43>. 
* Windows: Windows<36>. 
* macOS: macOS<27>. 
* C API: C API<37>. 

Python 3.11.0 alpha 3

* Core and Builtins: Core and Builtins<105>. 
* Library: Library<108>. 
* Core and Builtins: Core and Builtins<106>. 
* Library: Library<109>. 
* Documentation: Documentation<37>. 
* Tests: Tests<37>. 
* Build: Build<44>. 
* Windows: Windows<37>. 
* macOS: macOS<28>. 
* C API: C API<38>. 

Python 3.11.0 alpha 2

* Core and Builtins: Core and Builtins<107>. 
* Library: Library<110>. 
* Documentation: Documentation<38>. 
* Tests: Tests<38>. 
* Build: Build<45>. 
* Windows: Windows<38>. 
* macOS: macOS<29>. 
* IDLE: IDLE<19>. 
* C API: C API<39>. 

Python 3.11.0 alpha 1

* Security: Security<33>. 
* Core and Builtins: Core and Builtins<108>. 
* Library: Library<111>. 
* Core and Builtins: Core and Builtins<109>. 
* Library: Library<112>. 
* Core and Builtins: Core and Builtins<110>. 
* Library: Library<113>. 
* Core and Builtins: Core and Builtins<111>. 
* Library: Library<114>. 
* Core and Builtins: Core and Builtins<112>. 
* Library: Library<115>. 
* Core and Builtins: Core and Builtins<113>. 
* Library: Library<116>. 
* Core and Builtins: Core and Builtins<114>. 
* Library: Library<117>. 
* Core and Builtins: Core and Builtins<115>. 
* Library: Library<118>. 
* Core and Builtins: Core and Builtins<116>. 
* Library: Library<119>. 
* Core and Builtins: Core and Builtins<117>. 
* Library: Library<120>. 
* Documentation: Documentation<39>. 
* Tests: Tests<39>. 
* Build: Build<46>. 
* Windows: Windows<39>. 
* macOS: macOS<30>. 
* IDLE: IDLE<20>. 
* Tools/Demos: Tools/Demos<27>. 
* C API: C API<40>. 

Python 3.10.0 beta 1

* Security: Security<34>. 
* Core and Builtins: Core and Builtins<118>. 
* Library: Library<121>. 
* Core and Builtins: Core and Builtins<119>. 
* Library: Library<122>. 
* Core and Builtins: Core and Builtins<120>. 
* Library: Library<123>. 
* Documentation: Documentation<40>. 
* Tests: Tests<40>. 
* Build: Build<47>. 
* Windows: Windows<40>. 
* macOS: macOS<31>. 
* IDLE: IDLE<21>. 
* C API: C API<41>. 

Python 3.10.0 alpha 7

* Security: Security<35>. 
* Core and Builtins: Core and Builtins<121>. 
* Library: Library<124>. 
* Core and Builtins: Core and Builtins<122>. 
* Library: Library<125>. 
* Documentation: Documentation<41>. 
* Tests: Tests<41>. 
* Build: Build<48>. 
* Windows: Windows<41>. 
* IDLE: IDLE<22>. 
* C API: C API<42>. 

Python 3.10.0 alpha 6

* Security: Security<36>. 
* Core and Builtins: Core and Builtins<123>. 
* Library: Library<126>. 
* Core and Builtins: Core and Builtins<124>. 
* Library: Library<127>. 
* Core and Builtins: Core and Builtins<125>. 
* Library: Library<128>. 
* Documentation: Documentation<42>. 
* Tests: Tests<42>. 
* Build: Build<49>. 
* Windows: Windows<42>. 
* macOS: macOS<32>. 
* IDLE: IDLE<23>. 
* C API: C API<43>. 

Python 3.10.0 alpha 5

* Security: Security<37>. 
* Core and Builtins: Core and Builtins<126>. 
* Library: Library<129>. 
* Core and Builtins: Core and Builtins<127>. 
* Library: Library<130>. 
* Documentation: Documentation<43>. 
* Tests: Tests<43>. 
* Build: Build<50>. 
* Windows: Windows<43>. 
* macOS: macOS<33>. 
* IDLE: IDLE<24>. 
* C API: C API<44>. 

Python 3.10.0 alpha 4

* Core and Builtins: Core and Builtins<128>. 
* Library: Library<131>. 
* Core and Builtins: Core and Builtins<129>. 
* Library: Library<132>. 
* Core and Builtins: Core and Builtins<130>. 
* Library: Library<133>. 
* Documentation: Documentation<44>. 
* Tests: Tests<44>. 
* Build: Build<51>. 
* macOS: macOS<34>. 
* Tools/Demos: Tools/Demos<28>. 
* C API: C API<45>. 

Python 3.10.0 alpha 3

* Security: Security<38>. 
* Core and Builtins: Core and Builtins<131>. 
* Library: Library<134>. 
* Core and Builtins: Core and Builtins<132>. 
* Library: Library<135>. 
* Core and Builtins: Core and Builtins<133>. 
* Library: Library<136>. 
* Core and Builtins: Core and Builtins<134>. 
* Library: Library<137>. 
* Documentation: Documentation<45>. 
* Tests: Tests<45>. 
* Build: Build<52>. 
* Windows: Windows<44>. 
* macOS: macOS<35>. 
* IDLE: IDLE<25>. 
* Tools/Demos: Tools/Demos<29>. 
* C API: C API<46>. 

Python 3.10.0 alpha 2

* Security: Security<39>. 
* Core and Builtins: Core and Builtins<135>. 
* Library: Library<138>. 
* Core and Builtins: Core and Builtins<136>. 
* Library: Library<139>. 
* Documentation: Documentation<46>. 
* Tests: Tests<46>. 
* Build: Build<53>. 
* Windows: Windows<45>. 
* macOS: macOS<36>. 
* IDLE: IDLE<26>. 
* C API: C API<47>. 

Python 3.10.0 alpha 1

* Security: Security<40>. 
* Core and Builtins: Core and Builtins<137>. 
* Library: Library<140>. 
* Core and Builtins: Core and Builtins<138>. 
* Library: Library<141>. 
* Core and Builtins: Core and Builtins<139>. 
* Library: Library<142>. 
* Core and Builtins: Core and Builtins<140>. 
* Library: Library<143>. 
* Core and Builtins: Core and Builtins<141>. 
* Library: Library<144>. 
* Core and Builtins: Core and Builtins<142>. 
* Library: Library<145>. 
* Core and Builtins: Core and Builtins<143>. 
* Library: Library<146>. 
* Core and Builtins: Core and Builtins<144>. 
* Library: Library<147>. 
* Core and Builtins: Core and Builtins<145>. 
* Library: Library<148>. 
* Core and Builtins: Core and Builtins<146>. 
* Library: Library<149>. 
* Core and Builtins: Core and Builtins<147>. 
* Library: Library<150>. 
* Core and Builtins: Core and Builtins<148>. 
* Library: Library<151>. 
* Core and Builtins: Core and Builtins<149>. 
* Library: Library<152>. 
* Core and Builtins: Core and Builtins<150>. 
* Library: Library<153>. 
* Core and Builtins: Core and Builtins<151>. 
* Library: Library<154>. 
* Documentation: Documentation<47>. 
* Tests: Tests<47>. 
* Build: Build<54>. 
* Windows: Windows<46>. 
* macOS: macOS<37>. 
* IDLE: IDLE<27>. 
* C API: C API<48>. 

Python 3.9.0 beta 1

* Security: Security<41>. 
* Core and Builtins: Core and Builtins<152>. 
* Library: Library<155>. 
* Documentation: Documentation<48>. 
* Tests: Tests<48>. 
* Build: Build<55>. 
* Windows: Windows<47>. 
* macOS: macOS<38>. 
* Tools/Demos: Tools/Demos<30>. 
* C API: C API<49>. 

Python 3.9.0 alpha 6

* Security: Security<42>. 
* Core and Builtins: Core and Builtins<153>. 
* Library: Library<156>. 
* Documentation: Documentation<49>. 
* Tests: Tests<49>. 
* Build: Build<56>. 
* Windows: Windows<48>. 
* macOS: macOS<39>. 
* IDLE: IDLE<28>. 
* Tools/Demos: Tools/Demos<31>. 
* C API: C API<50>. 

Python 3.9.0 alpha 5

* Security: Security<43>. 
* Core and Builtins: Core and Builtins<154>. 
* Library: Library<157>. 
* Documentation: Documentation<50>. 
* Tests: Tests<50>. 
* Build: Build<57>. 
* Windows: Windows<49>. 
* macOS: macOS<40>. 
* IDLE: IDLE<29>. 
* Tools/Demos: Tools/Demos<32>. 
* C API: C API<51>. 

Python 3.9.0 alpha 4

* Security: Security<44>. 
* Core and Builtins: Core and Builtins<155>. 
* Library: Library<158>. 
* Documentation: Documentation<51>. 
* Tests: Tests<51>. 
* Build: Build<58>. 
* Windows: Windows<50>. 
* IDLE: IDLE<30>. 
* C API: C API<52>. 

Python 3.9.0 alpha 3

* Core and Builtins: Core and Builtins<156>. 
* Library: Library<159>. 
* Documentation: Documentation<52>. 
* Build: Build<59>. 
* IDLE: IDLE<31>. 
* C API: C API<53>. 

Python 3.9.0 alpha 2

* Security: Security<45>. 
* Core and Builtins: Core and Builtins<157>. 
* Library: Library<160>. 
* Documentation: Documentation<53>. 
* Tests: Tests<52>. 
* Build: Build<60>. 
* Windows: Windows<51>. 
* macOS: macOS<41>. 
* IDLE: IDLE<32>. 
* C API: C API<54>. 

Python 3.9.0 alpha 1

* Security: Security<46>. 
* Core and Builtins: Core and Builtins<158>. 
* Library: Library<161>. 
* Documentation: Documentation<54>. 
* Tests: Tests<53>. 
* Build: Build<61>. 
* Windows: Windows<52>. 
* macOS: macOS<42>. 
* IDLE: IDLE<33>. 
* Tools/Demos: Tools/Demos<33>. 
* C API: C API<55>. 

Python 3.8.0 beta 1

* Security: Security<47>. 
* Core and Builtins: Core and Builtins<159>. 
* Library: Library<162>. 
* Documentation: Documentation<55>. 
* Tests: Tests<54>. 
* Build: Build<62>. 
* Windows: Windows<53>. 
* macOS: macOS<43>. 
* IDLE: IDLE<34>. 
* Tools/Demos: Tools/Demos<34>. 
* C API: C API<56>. 

Python 3.8.0 alpha 4

* Security: Security<48>. 
* Core and Builtins: Core and Builtins<160>. 
* Library: Library<163>. 
* Documentation: Documentation<56>. 
* Tests: Tests<55>. 
* Build: Build<63>. 
* Windows: Windows<54>. 
* macOS: macOS<44>. 
* IDLE: IDLE<35>. 
* Tools/Demos: Tools/Demos<35>. 
* C API: C API<57>. 

Python 3.8.0 alpha 3

* Security: Security<49>. 
* Core and Builtins: Core and Builtins<161>. 
* Library: Library<164>. 
* Documentation: Documentation<57>. 
* Tests: Tests<56>. 
* Build: Build<64>. 
* Windows: Windows<55>. 
* IDLE: IDLE<36>. 
* Tools/Demos: Tools/Demos<36>. 
* C API: C API<58>. 

Python 3.8.0 alpha 2

* Core and Builtins: Core and Builtins<162>. 
* Library: Library<165>. 
* Documentation: Documentation<58>. 
* Tests: Tests<57>. 
* Windows: Windows<56>. 
* IDLE: IDLE<37>. 

Python 3.8.0 alpha 1

* Security: Security<50>. 
* Core and Builtins: Core and Builtins<163>. 
* Library: Library<166>. 
* Documentation: Documentation<59>. 
* Tests: Tests<58>. 
* Build: Build<65>. 
* Windows: Windows<57>. 
* macOS: macOS<45>. 
* IDLE: IDLE<38>. 
* Tools/Demos: Tools/Demos<37>. 
* C API: C API<59>. 

Python 3.7.0 final

* Library: Library<167>. 
* C API: C API<60>. 

Python 3.7.0 release candidate 1

* Core and Builtins: Core and Builtins<164>. 
* Library: Library<168>. 
* Documentation: Documentation<60>. 
* Build: Build<66>. 
* Windows: Windows<58>. 
* IDLE: IDLE<39>. 

Python 3.7.0 beta 5

* Core and Builtins: Core and Builtins<165>. 
* Library: Library<169>. 
* Documentation: Documentation<61>. 
* Tests: Tests<59>. 
* Build: Build<67>. 
* macOS: macOS<46>. 
* IDLE: IDLE<40>. 

Python 3.7.0 beta 4

* Core and Builtins: Core and Builtins<166>. 
* Library: Library<170>. 
* Documentation: Documentation<62>. 
* Tests: Tests<60>. 
* Build: Build<68>. 
* Windows: Windows<59>. 
* macOS: macOS<47>. 
* IDLE: IDLE<41>. 
* Tools/Demos: Tools/Demos<38>. 

Python 3.7.0 beta 3

* Security: Security<51>. 
* Core and Builtins: Core and Builtins<167>. 
* Library: Library<171>. 
* Documentation: Documentation<63>. 
* Tests: Tests<61>. 
* Build: Build<69>. 
* Windows: Windows<60>. 
* macOS: macOS<48>. 
* IDLE: IDLE<42>. 
* Tools/Demos: Tools/Demos<39>. 
* C API: C API<61>. 

Python 3.7.0 beta 2

* Security: Security<52>. 
* Core and Builtins: Core and Builtins<168>. 
* Library: Library<172>. 
* Documentation: Documentation<64>. 
* Tests: Tests<62>. 
* Build: Build<70>. 
* Windows: Windows<61>. 
* macOS: macOS<49>. 
* IDLE: IDLE<43>. 
* Tools/Demos: Tools/Demos<40>. 

Python 3.7.0 beta 1

* Core and Builtins: Core and Builtins<169>. 
* Library: Library<173>. 
* Documentation: Documentation<65>. 
* Tests: Tests<63>. 
* Build: Build<71>. 
* Windows: Windows<62>. 
* macOS: macOS<50>. 
* C API: C API<62>. 

Python 3.7.0 alpha 4

* Core and Builtins: Core and Builtins<170>. 
* Library: Library<174>. 
* Documentation: Documentation<66>. 
* Tests: Tests<64>. 
* Windows: Windows<63>. 
* Tools/Demos: Tools/Demos<41>. 
* C API: C API<63>. 

Python 3.7.0 alpha 3

* Core and Builtins: Core and Builtins<171>. 
* Library: Library<175>. 
* Documentation: Documentation<67>. 
* Tests: Tests<65>. 
* Build: Build<72>. 
* Windows: Windows<64>. 
* macOS: macOS<51>. 
* IDLE: IDLE<44>. 
* Tools/Demos: Tools/Demos<42>. 
* C API: C API<64>. 

Python 3.7.0 alpha 2

* Core and Builtins: Core and Builtins<172>. 
* Library: Library<176>. 
* Documentation: Documentation<68>. 
* Build: Build<73>. 
* IDLE: IDLE<45>. 
* C API: C API<65>. 

Python 3.7.0 alpha 1

* Security: Security<53>. 
* Core and Builtins: Core and Builtins<173>. 
* Library: Library<177>. 
* Documentation: Documentation<69>. 
* Tests: Tests<66>. 
* Build: Build<74>. 
* Windows: Windows<65>. 
* IDLE: IDLE<46>. 
* Tools/Demos: Tools/Demos<43>. 
* C API: C API<66>. 

Python 3.6.6 release candidate 1

* Core and Builtins: Core and Builtins<174>. 
* Library: Library<178>. 
* Documentation: Documentation<70>. 
* Tests: Tests<67>. 
* Build: Build<75>. 
* Windows: Windows<66>. 
* macOS: macOS<52>. 
* IDLE: IDLE<47>. 
* Tools/Demos: Tools/Demos<44>. 
* C API: C API<67>. 

Python 3.6.5 final

* Tests: Tests<68>. 
* Build: Build<76>. 

Python 3.6.5 release candidate 1

* Security: Security<54>. 
* Core and Builtins: Core and Builtins<175>. 
* Library: Library<179>. 
* Documentation: Documentation<71>. 
* Tests: Tests<69>. 
* Build: Build<77>. 
* Windows: Windows<67>. 
* macOS: macOS<53>. 
* IDLE: IDLE<48>. 
* Tools/Demos: Tools/Demos<45>. 
* C API: C API<68>. 

Python 3.6.4 release candidate 1

* Core and Builtins: Core and Builtins<176>. 
* Library: Library<180>. 
* Documentation: Documentation<72>. 
* Tests: Tests<70>. 
* Build: Build<78>. 
* Windows: Windows<68>. 
* macOS: macOS<54>. 
* IDLE: IDLE<49>. 
* Tools/Demos: Tools/Demos<46>. 
* C API: C API<69>. 

Python 3.6.3 final

* Library: Library<181>. 
* Build: Build<79>. 

Python 3.6.3 release candidate 1

* Security: Security<55>. 
* Core and Builtins: Core and Builtins<177>. 
* Library: Library<182>. 
* Documentation: Documentation<73>. 
* Tests: Tests<71>. 
* Build: Build<80>. 
* Windows: Windows<69>. 
* IDLE: IDLE<50>. 
* Tools/Demos: Tools/Demos<47>. 

Python 3.6.2 release candidate 2

* Security: Security<56>. 

Python 3.6.2 release candidate 1

* Security: Security<57>. 
* Core and Builtins: Core and Builtins<178>. 
* Library: Library<183>. 
* IDLE: IDLE<51>. 
* C API: C API<70>. 
* Build: Build<81>. 
* Documentation: Documentation<74>. 
* Tools/Demos: Tools/Demos<48>. 
* Tests: Tests<72>. 
* Windows: Windows<70>. 

Python 3.6.1 final

* Core and Builtins: Core and Builtins<179>. 
* Build: Build<82>. 

Python 3.6.1 release candidate 1

* Core and Builtins: Core and Builtins<180>. 
* Library: Library<184>. 
* IDLE: IDLE<52>. 
* Windows: Windows<71>. 
* C API: C API<71>. 
* Documentation: Documentation<75>. 
* Tests: Tests<73>. 
* Build: Build<83>. 

Python 3.6.0 release candidate 2

* Core and Builtins: Core and Builtins<181>. 
* Tools/Demos: Tools/Demos<49>. 
* Windows: Windows<72>. 
* Build: Build<84>. 

Python 3.6.0 release candidate 1

* Core and Builtins: Core and Builtins<182>. 
* Library: Library<185>. 
* C API: C API<72>. 
* Documentation: Documentation<76>. 
* Tools/Demos: Tools/Demos<50>. 

Python 3.6.0 beta 4

* Core and Builtins: Core and Builtins<183>. 
* Library: Library<186>. 
* Documentation: Documentation<77>. 
* Tests: Tests<74>. 
* Build: Build<85>. 

Python 3.6.0 beta 3

* Core and Builtins: Core and Builtins<184>. 
* Library: Library<187>. 
* Windows: Windows<73>. 
* Build: Build<86>. 
* Tests: Tests<75>. 

Python 3.6.0 beta 2

* Core and Builtins: Core and Builtins<185>. 
* Library: Library<188>. 
* Windows: Windows<74>. 
* C API: C API<73>. 
* Build: Build<87>. 
* Tests: Tests<76>. 

Python 3.6.0 beta 1

* Core and Builtins: Core and Builtins<186>. 
* Library: Library<189>. 
* IDLE: IDLE<53>. 
* C API: C API<74>. 
* Tests: Tests<77>. 
* Build: Build<88>. 
* Tools/Demos: Tools/Demos<51>. 
* Windows: Windows<75>. 

Python 3.6.0 alpha 4

* Core and Builtins: Core and Builtins<187>. 
* Library: Library<190>. 
* IDLE: IDLE<54>. 
* Tests: Tests<78>. 
* Windows: Windows<76>. 
* Build: Build<89>. 

Python 3.6.0 alpha 3

* Security: Security<58>. 
* Core and Builtins: Core and Builtins<188>. 
* Library: Library<191>. 
* IDLE: IDLE<55>. 
* C API: C API<75>. 
* Build: Build<90>. 
* Tools/Demos: Tools/Demos<52>. 
* Documentation: Documentation<78>. 
* Tests: Tests<79>. 

Python 3.6.0 alpha 2

* Security: Security<59>. 
* Core and Builtins: Core and Builtins<189>. 
* Library: Library<192>. 
* IDLE: IDLE<56>. 
* Documentation: Documentation<79>. 
* Tests: Tests<80>. 
* Windows: Windows<77>. 
* Build: Build<91>. 
* C API: C API<76>. 
* Tools/Demos: Tools/Demos<53>. 

Python 3.6.0 alpha 1

* Security: Security<60>. 
* Core and Builtins: Core and Builtins<190>. 
* Library: Library<193>. 
* IDLE: IDLE<57>. 
* Documentation: Documentation<80>. 
* Tests: Tests<81>. 
* Build: Build<92>. 
* Windows: Windows<78>. 
* Tools/Demos: Tools/Demos<54>. 
* C API: C API<77>. 

Python 3.5.5 release candidate 1

* Security: Security<61>. 
* Core and Builtins: Core and Builtins<191>. 
* Library: Library<194>. 

Python 3.5.4 final

* Library: Library<195>. 

Python 3.5.4 release candidate 1

* Security: Security<62>. 
* Core and Builtins: Core and Builtins<192>. 
* Library: Library<196>. 
* Documentation: Documentation<81>. 
* Tests: Tests<82>. 
* Build: Build<93>. 
* Windows: Windows<79>. 
* C API: C API<78>. 

Python 3.5.3 release candidate 1

* Security: Security<63>. 
* Core and Builtins: Core and Builtins<193>. 
* Library: Library<197>. 
* IDLE: IDLE<58>. 
* C API: C API<79>. 
* Documentation: Documentation<82>. 
* Tests: Tests<83>. 
* Tools/Demos: Tools/Demos<55>. 
* Windows: Windows<80>. 
* Build: Build<94>. 

Python 3.5.2 final

* Core and Builtins: Core and Builtins<194>. 
* Tests: Tests<84>. 
* IDLE: IDLE<59>. 

Python 3.5.2 release candidate 1

* Security: Security<64>. 
* Core and Builtins: Core and Builtins<195>. 
* Library: Library<198>. 
* IDLE: IDLE<60>. 
* Documentation: Documentation<83>. 
* Tests: Tests<85>. 
* Build: Build<95>. 
* Windows: Windows<81>. 
* Tools/Demos: Tools/Demos<56>. 

Python 3.5.1 final

* Core and Builtins: Core and Builtins<196>. 
* Windows: Windows<82>. 

Python 3.5.1 release candidate 1

* Core and Builtins: Core and Builtins<197>. 
* Library: Library<199>. 
* IDLE: IDLE<61>. 
* Documentation: Documentation<84>. 
* Tests: Tests<86>. 
* Build: Build<96>. 
* Windows: Windows<83>. 
* Tools/Demos: Tools/Demos<57>. 

Python 3.5.0 final

* Build: Build<97>. 

Python 3.5.0 release candidate 4

* Library: Library<200>. 
* Build: Build<98>. 

Python 3.5.0 release candidate 3

* Core and Builtins: Core and Builtins<198>. 
* Library: Library<201>. 

Python 3.5.0 release candidate 2

* Core and Builtins: Core and Builtins<199>. 
* Library: Library<202>. 

Python 3.5.0 release candidate 1

* Core and Builtins: Core and Builtins<200>. 
* Library: Library<203>. 
* IDLE: IDLE<62>. 
* Documentation: Documentation<85>. 
* Tests: Tests<87>. 

Python 3.5.0 beta 4

* Core and Builtins: Core and Builtins<201>. 
* Library: Library<204>. 
* Build: Build<99>. 

Python 3.5.0 beta 3

* Core and Builtins: Core and Builtins<202>. 
* Library: Library<205>. 
* Tests: Tests<88>. 
* Documentation: Documentation<86>. 
* Build: Build<100>. 

Python 3.5.0 beta 2

* Core and Builtins: Core and Builtins<203>. 
* Library: Library<206>. 

Python 3.5.0 beta 1

* Core and Builtins: Core and Builtins<204>. 
* Library: Library<207>. 
* IDLE: IDLE<63>. 
* Tests: Tests<89>. 
* Documentation: Documentation<87>. 
* Tools/Demos: Tools/Demos<58>. 

Python 3.5.0 alpha 4

* Core and Builtins: Core and Builtins<205>. 
* Library: Library<208>. 
* Build: Build<101>. 
* Tests: Tests<90>. 
* Tools/Demos: Tools/Demos<59>. 
* C API: C API<80>. 

Python 3.5.0 alpha 3

* Core and Builtins: Core and Builtins<206>. 
* Library: Library<209>. 
* Build: Build<102>. 
* Tests: Tests<91>. 
* Tools/Demos: Tools/Demos<60>. 

Python 3.5.0 alpha 2

* Core and Builtins: Core and Builtins<207>. 
* Library: Library<210>. 
* Build: Build<103>. 
* C API: C API<81>. 
* Windows: Windows<84>. 

Python 3.5.0 alpha 1

* Core and Builtins: Core and Builtins<208>. 
* Library: Library<211>. 
* IDLE: IDLE<64>. 
* Build: Build<104>. 
* C API: C API<82>. 
* Documentation: Documentation<88>. 
* Tests: Tests<92>. 
* Tools/Demos: Tools/Demos<61>. 
* Windows: Windows<85>. 

The Python Tutorial

* Whetting Your Appetite:: 
* Using the Python Interpreter:: 
* An Informal Introduction to Python:: 
* More Control Flow Tools:: 
* Data Structures:: 
* Modules: Modules<2>. 
* Input and Output:: 
* Errors and Exceptions:: 
* Classes:: 
* Brief tour of the standard library:: 
* Brief tour of the standard library — part II:: 
* Virtual Environments and Packages:: 
* What Now?:: 
* Interactive Input Editing and History Substitution:: 
* Floating-Point Arithmetic; Issues and Limitations: Floating-Point Arithmetic Issues and Limitations. 
* Appendix:: 

Using the Python Interpreter

* Invoking the Interpreter:: 
* The Interpreter and Its Environment:: 

Invoking the Interpreter

* Argument Passing:: 
* Interactive Mode:: 

The Interpreter and Its Environment

* Source Code Encoding:: 

An Informal Introduction to Python

* Using Python as a Calculator:: 
* First Steps Towards Programming:: 

Using Python as a Calculator

* Numbers:: 
* Text:: 
* Lists:: 

More Control Flow Tools

* if Statements:: 
* for Statements:: 
* The range() Function: The range Function. 
* break and continue Statements:: 
* else Clauses on Loops:: 
* pass Statements:: 
* match Statements:: 
* Defining Functions:: 
* More on Defining Functions:: 
* Intermezzo; Coding Style: Intermezzo Coding Style. 

More on Defining Functions

* Default Argument Values:: 
* Keyword Arguments:: 
* Special parameters:: 
* Arbitrary Argument Lists:: 
* Unpacking Argument Lists:: 
* Lambda Expressions:: 
* Documentation Strings:: 
* Function Annotations:: 

Special parameters

* Positional-or-Keyword Arguments:: 
* Positional-Only Parameters:: 
* Keyword-Only Arguments:: 
* Function Examples:: 
* Recap:: 

Data Structures

* More on Lists:: 
* The del statement:: 
* Tuples and Sequences:: 
* Sets:: 
* Dictionaries:: 
* Looping Techniques:: 
* More on Conditions:: 
* Comparing Sequences and Other Types:: 

More on Lists

* Using Lists as Stacks:: 
* Using Lists as Queues:: 
* List Comprehensions: List Comprehensions<2>. 
* Nested List Comprehensions:: 

Modules

* More on Modules:: 
* Standard Modules:: 
* The dir() Function: The dir Function. 
* Packages:: 

More on Modules

* Executing modules as scripts:: 
* The Module Search Path:: 
* “Compiled” Python files:: 

Packages

* Importing * From a Package:: 
* Intra-package References:: 
* Packages in Multiple Directories:: 

Input and Output

* Fancier Output Formatting:: 
* Reading and Writing Files:: 

Fancier Output Formatting

* Formatted String Literals:: 
* The String format() Method: The String format Method. 
* Manual String Formatting:: 
* Old string formatting:: 

Reading and Writing Files

* Methods of File Objects:: 
* Saving structured data with json:: 

Errors and Exceptions

* Syntax Errors:: 
* Exceptions:: 
* Handling Exceptions:: 
* Raising Exceptions:: 
* Exception Chaining:: 
* User-defined Exceptions:: 
* Defining Clean-up Actions:: 
* Predefined Clean-up Actions:: 
* Raising and Handling Multiple Unrelated Exceptions:: 
* Enriching Exceptions with Notes:: 

Classes

* A Word About Names and Objects:: 
* Python Scopes and Namespaces:: 
* A First Look at Classes:: 
* Random Remarks:: 
* Inheritance:: 
* Private Variables:: 
* Odds and Ends:: 
* Iterators:: 
* Generators:: 
* Generator Expressions:: 

Python Scopes and Namespaces

* Scopes and Namespaces Example:: 

A First Look at Classes

* Class Definition Syntax:: 
* Class Objects:: 
* Instance Objects:: 
* Method Objects:: 
* Class and Instance Variables:: 

Inheritance

* Multiple Inheritance:: 

Brief tour of the standard library

* Operating system interface:: 
* File wildcards:: 
* Command-line arguments:: 
* Error output redirection and program termination:: 
* String pattern matching:: 
* Mathematics:: 
* Internet access:: 
* Dates and times:: 
* Data compression:: 
* Performance measurement:: 
* Quality control:: 
* Batteries included:: 

Brief tour of the standard library — part II

* Output formatting:: 
* Templating:: 
* Working with binary data record layouts:: 
* Multi-threading: Multi-threading<2>. 
* Logging:: 
* Weak references:: 
* Tools for working with lists:: 
* Decimal floating-point arithmetic:: 

Virtual Environments and Packages

* Introduction: Introduction<4>. 
* Creating Virtual Environments:: 
* Managing Packages with pip:: 

Interactive Input Editing and History Substitution

* Tab Completion and History Editing:: 
* Alternatives to the Interactive Interpreter:: 

Floating-Point Arithmetic:  Issues and Limitations

* Representation Error:: 

Appendix

* Interactive Mode: Interactive Mode<2>. 

Interactive Mode

* Error Handling:: 
* Executable Python Scripts:: 
* The Interactive Startup File:: 
* The Customization Modules:: 

Python Setup and Usage

* Command line and environment: Command line and environment<2>. 
* Using Python on Unix platforms:: 
* Configure Python:: 
* Using Python on Windows:: 
* Using Python on macOS:: 
* Using Python on Android:: 
* Using Python on iOS:: 
* Editors and IDEs:: 

Command line and environment

* Command line:: 
* Environment variables:: 

Command line

* Interface options:: 
* Generic options:: 
* Miscellaneous options:: 
* Controlling color:: 

Environment variables

* Debug-mode variables:: 

Using Python on Unix platforms

* Getting and installing the latest version of Python:: 
* Building Python:: 
* Python-related paths and files:: 
* Miscellaneous:: 
* Custom OpenSSL:: 

Getting and installing the latest version of Python

* On Linux:: 
* On FreeBSD and OpenBSD:: 

On Linux

* Installing IDLE:: 

Configure Python

* Build Requirements:: 
* Generated files:: 
* Configure Options:: 
* Python Build System:: 
* Compiler and linker flags:: 

Build Requirements

* Requirements for optional modules:: 

Generated files

* configure script:: 

Configure Options

* General Options:: 
* C compiler options:: 
* Linker options:: 
* Options for third-party dependencies:: 
* WebAssembly Options:: 
* Install Options:: 
* Performance options:: 
* Python Debug Build:: 
* Debug options:: 
* Linker options: Linker options<2>. 
* Libraries options:: 
* Security Options:: 
* macOS Options:: 
* iOS Options:: 
* Cross Compiling Options:: 

Python Build System

* Main files of the build system:: 
* Main build steps:: 
* Main Makefile targets:: 
* C extensions:: 

Main Makefile targets

* make:: 
* make platform:: 
* make profile-opt:: 
* make clean:: 
* make distclean:: 
* make install:: 
* make test:: 
* make ci:: 
* make buildbottest:: 
* make regen-all:: 

Compiler and linker flags

* Preprocessor flags:: 
* Compiler flags:: 
* Linker flags:: 

Using Python on Windows

* Python install manager:: 
* The embeddable package:: 
* The nuget.org packages: The nuget org packages. 
* Alternative bundles:: 
* Supported Windows versions:: 
* Removing the MAX_PATH limitation:: 
* UTF-8 mode:: 
* Finding modules:: 
* Additional modules:: 
* Compiling Python on Windows:: 
* The full installer (deprecated): The full installer deprecated. 
* Python launcher for Windows (deprecated): Python launcher for Windows deprecated. 

Python install manager

* Installation:: 
* Basic use:: 
* Command help:: 
* Listing runtimes:: 
* Installing runtimes:: 
* Offline installs:: 
* Uninstalling runtimes:: 
* Configuration:: 
* Shebang lines:: 
* Advanced installation:: 
* Administrative configuration:: 
* Installing free-threaded binaries:: 
* Index signatures:: 
* Troubleshooting:: 

The embeddable package

* Python application:: 
* Embedding Python:: 

The nuget.org packages

* Free-threaded packages:: 

Additional modules

* PyWin32:: 
* cx_Freeze:: 

The full installer (deprecated)

* Installation steps:: 
* Removing the MAX_PATH limitation: Removing the MAX_PATH limitation<2>. 
* Installing without UI:: 
* Installing without downloading:: 
* Modifying an install:: 
* Installing free-threaded binaries: Installing free-threaded binaries<2>. 

Python launcher for Windows (deprecated)

* Getting started:: 
* Shebang lines: Shebang lines<2>. 
* Arguments in shebang lines:: 
* Customization:: 
* Diagnostics:: 
* Dry run:: 
* Install on demand:: 
* Return codes:: 

Getting started

* From the command-line:: 
* Virtual environments:: 
* From a script:: 
* From file associations:: 

Customization

* Customization via INI files:: 
* Customizing default Python versions:: 

Using Python on macOS

* Using Python for macOS from python.org: Using Python for macOS from python org. 
* Alternative Distributions:: 
* Installing Additional Python Packages:: 
* GUI Programming:: 
* Advanced Topics:: 
* Other Resources:: 

Using Python for macOS from python.org

* Installation steps: Installation steps<2>. 
* How to run a Python script:: 

Advanced Topics

* Installing Free-threaded Binaries:: 
* Installing using the command line:: 
* Distributing Python Applications:: 
* App Store Compliance:: 

Using Python on Android

* Adding Python to an Android app:: 
* Building a Python package for Android:: 

Using Python on iOS

* Python at runtime on iOS:: 
* Installing Python on iOS:: 
* App Store Compliance: App Store Compliance<2>. 

Python at runtime on iOS

* iOS version compatibility:: 
* Platform identification:: 
* Standard library availability:: 
* Binary extension modules:: 
* Compiler stub binaries:: 

Installing Python on iOS

* Tools for building iOS apps:: 
* Adding Python to an iOS project:: 
* Testing a Python package:: 

App Store Compliance

* Incompatible code in the standard library:: 
* Privacy manifests:: 

Editors and IDEs

* IDLE — Python editor and shell:: 
* Other Editors and IDEs:: 

The Python Language Reference

* Introduction: Introduction<5>. 
* Lexical analysis:: 
* Data model:: 
* Execution model:: 
* The import system:: 
* Expressions:: 
* Simple statements:: 
* Compound statements:: 
* Top-level components:: 
* Full Grammar specification:: 

Introduction

* Alternate Implementations:: 
* Notation:: 

Notation

* Lexical and Syntactic definitions:: 

Lexical analysis

* Line structure:: 
* Other tokens:: 
* Names (identifiers and keywords): Names identifiers and keywords. 
* Literals:: 
* String and Bytes literals:: 
* Numeric literals:: 
* Operators and delimiters:: 

Line structure

* Logical lines:: 
* Physical lines:: 
* Comments:: 
* Encoding declarations:: 
* Explicit line joining:: 
* Implicit line joining:: 
* Blank lines:: 
* Indentation:: 
* Whitespace between tokens:: 
* End marker:: 

Names (identifiers and keywords)

* Keywords:: 
* Soft Keywords:: 
* Reserved classes of identifiers:: 
* Non-ASCII characters in names:: 

String and Bytes literals

* Triple-quoted strings:: 
* String prefixes:: 
* Formal grammar:: 
* Escape sequences:: 
* Bytes literals:: 
* Raw string literals:: 
* f-strings:: 
* t-strings:: 
* Formal grammar for f-strings:: 

Escape sequences

* Ignored end of line:: 
* Escaped characters:: 
* Octal character:: 
* Hexadecimal character:: 
* Named Unicode character:: 
* Hexadecimal Unicode characters:: 
* Unrecognized escape sequences:: 

Numeric literals

* Integer literals:: 
* Floating-point literals:: 
* Imaginary literals:: 

Data model

* Objects@comma{} values and types: Objects values and types. 
* The standard type hierarchy:: 
* Special method names:: 
* Coroutines:: 

The standard type hierarchy

* None:: 
* NotImplemented:: 
* Ellipsis:: 
* numbers.Number: numbers Number. 
* Sequences:: 
* Set types:: 
* Mappings:: 
* Callable types:: 
* Modules: Modules<3>. 
* Custom classes:: 
* Class instances:: 
* I/O objects (also known as file objects): I/O objects also known as file objects. 
* Internal types:: 

numbers.Number

* numbers.Integral: numbers Integral. 
* numbers.Real (float): numbers Real float. 
* numbers.Complex (complex): numbers Complex complex. 

Sequences

* Immutable sequences:: 
* Mutable sequences:: 

Mappings

* Dictionaries: Dictionaries<2>. 

Callable types

* User-defined functions:: 
* Instance methods:: 
* Generator functions:: 
* Coroutine functions:: 
* Asynchronous generator functions:: 
* Built-in functions:: 
* Built-in methods:: 
* Classes: Classes<2>. 
* Class Instances:: 

User-defined functions

* Special read-only attributes:: 
* Special writable attributes:: 

Modules

* Import-related attributes on module objects:: 
* Other writable attributes on module objects:: 
* Module dictionaries:: 

Custom classes

* Special attributes:: 
* Special methods:: 

Class instances

* Special attributes: Special attributes<2>. 

Internal types

* Code objects:: 
* Frame objects:: 
* Traceback objects:: 
* Slice objects:: 
* Static method objects:: 
* Class method objects:: 

Code objects

* Special read-only attributes: Special read-only attributes<2>. 
* Methods on code objects:: 

Frame objects

* Special read-only attributes: Special read-only attributes<3>. 
* Special writable attributes: Special writable attributes<2>. 
* Frame object methods:: 

Special method names

* Basic customization:: 
* Customizing attribute access:: 
* Customizing class creation:: 
* Customizing instance and subclass checks:: 
* Emulating generic types:: 
* Emulating callable objects:: 
* Emulating container types:: 
* Emulating numeric types:: 
* With Statement Context Managers:: 
* Customizing positional arguments in class pattern matching:: 
* Emulating buffer types:: 
* Annotations:: 
* Special method lookup:: 

Customizing attribute access

* Customizing module attribute access:: 
* Implementing Descriptors:: 
* Invoking Descriptors:: 
* __slots__: __slots__<2>. 

Customizing class creation

* Metaclasses:: 
* Resolving MRO entries:: 
* Determining the appropriate metaclass:: 
* Preparing the class namespace:: 
* Executing the class body:: 
* Creating the class object:: 
* Uses for metaclasses:: 

Emulating generic types

* The purpose of __class_getitem__:: 
* __class_getitem__ versus __getitem__:: 

Coroutines

* Awaitable Objects:: 
* Coroutine Objects:: 
* Asynchronous Iterators:: 
* Asynchronous Context Managers:: 

Execution model

* Structure of a program:: 
* Naming and binding:: 
* Exceptions: Exceptions<2>. 
* Runtime Components:: 

Naming and binding

* Binding of names:: 
* Resolution of names:: 
* Annotation scopes:: 
* Lazy evaluation:: 
* Builtins and restricted execution:: 
* Interaction with dynamic features:: 

Runtime Components

* General Computing Model:: 
* Python Runtime Model:: 

The import system

* importlib: importlib<10>. 
* Packages: Packages<2>. 
* Searching:: 
* Loading:: 
* The Path Based Finder:: 
* Replacing the standard import system:: 
* Package Relative Imports:: 
* Special considerations for __main__:: 
* References:: 

Packages

* Regular packages:: 
* Namespace packages:: 

Searching

* The module cache:: 
* Finders and loaders:: 
* Import hooks:: 
* The meta path:: 

Loading

* Loaders:: 
* Submodules:: 
* Module specs:: 
* __path__ attributes on modules:: 
* Module reprs:: 
* Cached bytecode invalidation:: 

The Path Based Finder

* Path entry finders:: 
* Path entry finder protocol:: 

Special considerations for __main__

* __main__.__spec__: __main__ __spec__. 

Expressions

* Arithmetic conversions:: 
* Atoms:: 
* Primaries:: 
* Await expression:: 
* The power operator:: 
* Unary arithmetic and bitwise operations:: 
* Binary arithmetic operations:: 
* Shifting operations:: 
* Binary bitwise operations:: 
* Comparisons:: 
* Boolean operations:: 
* Assignment expressions: Assignment expressions<2>. 
* Conditional expressions:: 
* Lambdas:: 
* Expression lists:: 
* Evaluation order:: 
* Operator precedence:: 

Atoms

* Built-in constants:: 
* Identifiers (Names): Identifiers Names. 
* Literals: Literals<2>. 
* Parenthesized forms:: 
* Displays for lists@comma{} sets and dictionaries: Displays for lists sets and dictionaries. 
* List displays:: 
* Set displays:: 
* Dictionary displays:: 
* Generator expressions:: 
* Yield expressions:: 

Identifiers (Names)

* Private name mangling:: 

Literals

* Literals and object identity:: 
* String literal concatenation:: 

Yield expressions

* Generator-iterator methods:: 
* Examples:: 
* Asynchronous generator functions: Asynchronous generator functions<2>. 
* Asynchronous generator-iterator methods:: 

Primaries

* Attribute references:: 
* Subscriptions and slicings:: 
* Calls:: 

Subscriptions and slicings

* Slicings:: 
* Comma-separated subscripts:: 
* “Starred” subscriptions:: 
* Formal subscription grammar:: 

Comparisons

* Value comparisons:: 
* Membership test operations:: 
* Identity comparisons:: 

Simple statements

* Expression statements:: 
* Assignment statements:: 
* The assert statement:: 
* The pass statement:: 
* The del statement: The del statement<2>. 
* The return statement:: 
* The yield statement:: 
* The raise statement:: 
* The break statement:: 
* The continue statement:: 
* The import statement:: 
* The global statement:: 
* The nonlocal statement:: 
* The type statement:: 

Assignment statements

* Augmented assignment statements:: 
* Annotated assignment statements:: 

The import statement

* Future statements:: 

Compound statements

* The if statement:: 
* The while statement:: 
* The for statement:: 
* The try statement:: 
* The with statement:: 
* The match statement:: 
* Function definitions:: 
* Class definitions:: 
* Coroutines: Coroutines<2>. 
* Type parameter lists:: 
* Annotations: Annotations<2>. 

The try statement

* except clause:: 
* except* clause:: 
* else clause:: 
* finally clause:: 

The match statement

* Overview:: 
* Guards:: 
* Irrefutable Case Blocks:: 
* Patterns:: 

Patterns

* OR Patterns:: 
* AS Patterns:: 
* Literal Patterns:: 
* Capture Patterns:: 
* Wildcard Patterns:: 
* Value Patterns:: 
* Group Patterns:: 
* Sequence Patterns:: 
* Mapping Patterns:: 
* Class Patterns:: 

Coroutines

* Coroutine function definition:: 
* The async for statement:: 
* The async with statement:: 

Type parameter lists

* Generic functions:: 
* Generic classes:: 
* Generic type aliases:: 

Top-level components

* Complete Python programs:: 
* File input:: 
* Interactive input:: 
* Expression input:: 

The Python Standard Library

* Introduction: Introduction<6>. 
* Built-in Functions:: 
* Built-in Constants:: 
* Built-in Types:: 
* Built-in Exceptions:: 
* Thread Safety Guarantees:: 
* Text Processing Services:: 
* Binary Data Services:: 
* Data Types:: 
* Numeric and Mathematical Modules:: 
* Functional Programming Modules:: 
* File and Directory Access:: 
* Data Persistence:: 
* Data Compression and Archiving:: 
* File Formats:: 
* Cryptographic Services:: 
* Generic Operating System Services:: 
* Command-line interface libraries:: 
* Concurrent Execution:: 
* Networking and Interprocess Communication:: 
* Internet Data Handling:: 
* Structured Markup Processing Tools:: 
* Internet Protocols and Support:: 
* Multimedia Services:: 
* Internationalization:: 
* Graphical user interfaces with Tk:: 
* Development Tools:: 
* Debugging and Profiling:: 
* Software Packaging and Distribution:: 
* Python Runtime Services:: 
* Custom Python Interpreters:: 
* Importing Modules:: 
* Python Language Services:: 
* MS Windows Specific Services:: 
* Unix-specific services:: 
* Modules command-line interface (CLI): Modules command-line interface CLI. 
* Superseded Modules:: 
* Removed Modules:: 
* Security Considerations: Security Considerations<3>. 

Introduction

* Notes on availability:: 

Notes on availability

* WebAssembly platforms:: 
* Mobile platforms:: 

Built-in Constants

* Constants added by the site module:: 

Built-in Types

* Truth Value Testing:: 
* Boolean Operations — and@comma{} or@comma{} not: Boolean Operations — and or not. 
* Comparisons: Comparisons<2>. 
* Numeric Types — int@comma{} float@comma{} complex: Numeric Types — int float complex. 
* Boolean Type - bool:: 
* Iterator Types:: 
* Sequence Types — list@comma{} tuple@comma{} range: Sequence Types — list tuple range. 
* Text and Binary Sequence Type Methods Summary:: 
* Text Sequence Type — str:: 
* Binary Sequence Types — bytes@comma{} bytearray@comma{} memoryview: Binary Sequence Types — bytes bytearray memoryview. 
* Set Types — set@comma{} frozenset: Set Types — set frozenset. 
* Mapping Types — dict:: 
* Context Manager Types:: 
* Type Annotation Types — Generic Alias@comma{} Union: Type Annotation Types — Generic Alias Union. 
* Other Built-in Types:: 
* Special Attributes:: 
* Integer string conversion length limitation:: 

Numeric Types — int, float, complex

* Bitwise Operations on Integer Types:: 
* Additional Methods on Integer Types:: 
* Additional Methods on Float:: 
* Additional Methods on Complex:: 
* Hashing of numeric types:: 

Iterator Types

* Generator Types:: 

Sequence Types — list, tuple, range

* Common Sequence Operations:: 
* Immutable Sequence Types:: 
* Mutable Sequence Types:: 
* Lists: Lists<2>. 
* Tuples:: 
* Ranges:: 

Text Sequence Type — str

* String Methods: String Methods<2>. 
* Formatted String Literals (f-strings): Formatted String Literals f-strings. 
* Template String Literals (t-strings): Template String Literals t-strings. 
* printf-style String Formatting:: 

Formatted String Literals (f-strings)

* Debug specifier:: 
* Conversion specifier:: 
* Format specifier:: 

Binary Sequence Types — bytes, bytearray, memoryview

* Bytes Objects:: 
* Bytearray Objects:: 
* Bytes and Bytearray Operations:: 
* printf-style Bytes Formatting:: 
* Memory Views:: 

Mapping Types — dict

* Dictionary view objects:: 

Type Annotation Types — Generic Alias, Union

* Generic Alias Type:: 
* Union Type:: 

Generic Alias Type

* Standard Generic Classes:: 
* Special Attributes of GenericAlias objects:: 

Other Built-in Types

* Modules: Modules<4>. 
* Classes and Class Instances:: 
* Functions:: 
* Methods:: 
* Code Objects:: 
* Type Objects:: 
* The Null Object:: 
* The Ellipsis Object:: 
* The NotImplemented Object:: 
* Internal Objects:: 

Integer string conversion length limitation

* Affected APIs:: 
* Configuring the limit:: 
* Recommended configuration:: 

Built-in Exceptions

* Exception context:: 
* Inheriting from built-in exceptions:: 
* Base classes:: 
* Concrete exceptions:: 
* Warnings:: 
* Exception groups:: 
* Exception hierarchy:: 

Concrete exceptions

* OS exceptions:: 

Thread Safety Guarantees

* Thread safety levels:: 
* Thread safety for list objects:: 
* Thread safety for dict objects:: 
* Thread safety for set objects:: 
* Thread safety for bytearray objects:: 
* Thread safety for memoryview objects:: 

Thread safety levels

* Incompatible:: 
* Compatible:: 
* Safe on distinct objects:: 
* Safe on shared objects:: 
* Atomic:: 

Text Processing Services

* string — Common string operations:: 
* string.templatelib — Support for template string literals: string templatelib — Support for template string literals. 
* re — Regular expression operations:: 
* difflib — Helpers for computing deltas:: 
* textwrap — Text wrapping and filling:: 
* unicodedata — Unicode Database:: 
* stringprep — Internet String Preparation:: 
* readline — GNU readline interface:: 
* rlcompleter — Completion function for GNU readline:: 

string — Common string operations

* String constants:: 
* Custom string formatting:: 
* Format string syntax:: 
* Template strings ($-strings): Template strings $-strings. 
* Helper functions:: 

Format string syntax

* Format specification mini-language:: 
* Format examples:: 

string.templatelib — Support for template string literals

* Template strings:: 
* Types:: 
* Helper functions: Helper functions<2>. 

re — Regular expression operations

* Regular Expression Syntax:: 
* Module Contents:: 
* Regular Expression Objects:: 
* Match Objects:: 
* Regular Expression Examples:: 

Module Contents

* Flags:: 
* Functions: Functions<2>. 
* Exceptions: Exceptions<3>. 

Regular Expression Examples

* Checking for a Pair:: 
* Simulating scanf(): Simulating scanf. 
* search() vs. match(): search vs match. 
* Making a Phonebook:: 
* Text Munging:: 
* Finding all Adverbs:: 
* Finding all Adverbs and their Positions:: 
* Raw String Notation:: 
* Writing a Tokenizer:: 

difflib — Helpers for computing deltas

* SequenceMatcher objects:: 
* SequenceMatcher examples:: 
* Differ objects:: 
* Differ example:: 
* A command-line interface to difflib:: 
* ndiff example:: 

readline — GNU readline interface

* Init file:: 
* Line buffer:: 
* History file:: 
* History list:: 
* Startup hooks:: 
* Completion:: 
* Example:: 

Binary Data Services

* struct — Interpret bytes as packed binary data:: 
* codecs — Codec registry and base classes:: 

struct — Interpret bytes as packed binary data

* Functions and Exceptions:: 
* Format Strings:: 
* Applications:: 
* Classes: Classes<3>. 

Format Strings

* Byte Order@comma{} Size@comma{} and Alignment: Byte Order Size and Alignment. 
* Format Characters:: 
* Examples: Examples<2>. 

Applications

* Native Formats:: 
* Standard Formats:: 

codecs — Codec registry and base classes

* Codec Base Classes:: 
* Encodings and Unicode:: 
* Standard Encodings:: 
* Python Specific Encodings:: 
* encodings — Encodings package:: 
* encodings.idna — Internationalized Domain Names in Applications: encodings idna — Internationalized Domain Names in Applications. 
* encodings.mbcs — Windows ANSI codepage: encodings mbcs — Windows ANSI codepage. 
* encodings.utf_8_sig — UTF-8 codec with BOM signature: encodings utf_8_sig — UTF-8 codec with BOM signature. 

Codec Base Classes

* Error Handlers:: 
* Stateless Encoding and Decoding:: 
* Incremental Encoding and Decoding:: 
* Stream Encoding and Decoding:: 

Incremental Encoding and Decoding

* IncrementalEncoder Objects:: 
* IncrementalDecoder Objects:: 

Stream Encoding and Decoding

* StreamWriter Objects:: 
* StreamReader Objects:: 
* StreamReaderWriter Objects:: 
* StreamRecoder Objects:: 

Python Specific Encodings

* Text Encodings:: 
* Binary Transforms:: 
* Standalone Codec Functions:: 
* Text Transforms:: 

Data Types

* datetime — Basic date and time types:: 
* zoneinfo — IANA time zone support:: 
* calendar — General calendar-related functions:: 
* collections — Container datatypes:: 
* collections.abc — Abstract Base Classes for Containers: collections abc — Abstract Base Classes for Containers. 
* heapq — Heap queue algorithm:: 
* bisect — Array bisection algorithm:: 
* array — Efficient arrays of numeric values:: 
* weakref — Weak references:: 
* types — Dynamic type creation and names for built-in types:: 
* copy — Shallow and deep copy operations:: 
* pprint — Data pretty printer:: 
* reprlib — Alternate repr() implementation: reprlib — Alternate repr implementation. 
* enum — Support for enumerations:: 
* graphlib — Functionality to operate with graph-like structures:: 

datetime — Basic date and time types

* Aware and naive objects:: 
* Constants:: 
* Available types:: 
* timedelta objects:: 
* date objects:: 
* datetime objects:: 
* time objects:: 
* tzinfo objects:: 
* timezone objects:: 
* strftime() and strptime() behavior: strftime and strptime behavior. 

Available types

* Common properties:: 
* Determining if an object is aware or naive:: 

timedelta objects

* Examples of usage; timedelta: Examples of usage timedelta. 

date objects

* Examples of usage; date: Examples of usage date. 

datetime objects

* Examples of usage; datetime: Examples of usage datetime. 

time objects

* Examples of usage; time: Examples of usage time. 

strftime() and strptime() behavior

* strftime() and strptime() format codes: strftime and strptime format codes. 
* Technical detail:: 

zoneinfo — IANA time zone support

* Using ZoneInfo:: 
* Data sources:: 
* The ZoneInfo class:: 
* Functions: Functions<3>. 
* Globals:: 
* Exceptions and warnings:: 

Data sources

* Configuring the data sources:: 

Configuring the data sources

* Compile-time configuration:: 
* Environment configuration:: 
* Runtime configuration:: 

The ZoneInfo class

* String representations:: 
* Pickle serialization:: 

calendar — General calendar-related functions

* Command-line usage:: 

collections — Container datatypes

* ChainMap objects:: 
* Counter objects:: 
* deque objects:: 
* defaultdict objects:: 
* namedtuple() Factory Function for Tuples with Named Fields: namedtuple Factory Function for Tuples with Named Fields. 
* OrderedDict objects:: 
* UserDict objects:: 
* UserList objects:: 
* UserString objects:: 

ChainMap objects

* ChainMap Examples and Recipes:: 

deque objects

* deque Recipes:: 

defaultdict objects

* defaultdict Examples:: 

OrderedDict objects

* OrderedDict Examples and Recipes:: 

collections.abc — Abstract Base Classes for Containers

* Collections Abstract Base Classes:: 
* Collections Abstract Base Classes – Detailed Descriptions:: 
* Examples and Recipes:: 

heapq — Heap queue algorithm

* Basic Examples:: 
* Other Applications:: 
* Priority Queue Implementation Notes:: 
* Theory:: 

bisect — Array bisection algorithm

* Performance Notes:: 
* Searching Sorted Lists:: 
* Examples: Examples<3>. 

weakref — Weak references

* Weak Reference Objects:: 
* Example: Example<2>. 
* Finalizer Objects:: 
* Comparing finalizers with __del__() methods: Comparing finalizers with __del__ methods. 

types — Dynamic type creation and names for built-in types

* Dynamic Type Creation:: 
* Standard Interpreter Types:: 
* Additional Utility Classes and Functions:: 
* Coroutine Utility Functions:: 

pprint — Data pretty printer

* Functions: Functions<4>. 
* PrettyPrinter Objects:: 
* Example: Example<3>. 

reprlib — Alternate repr() implementation

* Repr Objects:: 
* Subclassing Repr Objects:: 

enum — Support for enumerations

* Module contents:: 
* Data types:: 
* Utilities and decorators:: 
* Notes:: 

Data types

* Supported __dunder__ names:: 
* Supported _sunder_ names:: 

graphlib — Functionality to operate with graph-like structures

* Exceptions: Exceptions<4>. 

Numeric and Mathematical Modules

* numbers — Numeric abstract base classes:: 
* math — Mathematical functions:: 
* cmath — Mathematical functions for complex numbers:: 
* decimal — Decimal fixed-point and floating-point arithmetic:: 
* fractions — Rational numbers:: 
* random — Generate pseudo-random numbers:: 
* statistics — Mathematical statistics functions:: 

numbers — Numeric abstract base classes

* The numeric tower:: 
* Notes for type implementers:: 

Notes for type implementers

* Adding More Numeric ABCs:: 
* Implementing the arithmetic operations:: 

math — Mathematical functions

* Number-theoretic functions:: 
* Floating point arithmetic:: 
* Floating point manipulation functions:: 
* Power@comma{} exponential and logarithmic functions: Power exponential and logarithmic functions. 
* Summation and product functions:: 
* Angular conversion:: 
* Trigonometric functions:: 
* Hyperbolic functions:: 
* Special functions:: 
* Constants: Constants<2>. 

cmath — Mathematical functions for complex numbers

* Conversions to and from polar coordinates:: 
* Power and logarithmic functions:: 
* Trigonometric functions: Trigonometric functions<2>. 
* Hyperbolic functions: Hyperbolic functions<2>. 
* Classification functions:: 
* Constants: Constants<3>. 

decimal — Decimal fixed-point and floating-point arithmetic

* Quick-start tutorial:: 
* Decimal objects:: 
* Context objects:: 
* Constants: Constants<4>. 
* Rounding modes:: 
* Signals:: 
* Floating-point notes:: 
* Working with threads:: 
* Recipes:: 
* Decimal FAQ:: 

Decimal objects

* Logical operands:: 

Floating-point notes

* Mitigating round-off error with increased precision:: 
* Special values:: 

random — Generate pseudo-random numbers

* Bookkeeping functions:: 
* Functions for bytes:: 
* Functions for integers:: 
* Functions for sequences:: 
* Discrete distributions:: 
* Real-valued distributions:: 
* Alternative Generator:: 
* Notes on Reproducibility:: 
* Examples: Examples<4>. 
* Recipes: Recipes<2>. 
* Command-line usage: Command-line usage<2>. 
* Command-line example:: 

statistics — Mathematical statistics functions

* Averages and measures of central location:: 
* Measures of spread:: 
* Statistics for relations between two inputs:: 
* Function details:: 
* Exceptions: Exceptions<5>. 
* NormalDist objects:: 
* Examples and Recipes: Examples and Recipes<2>. 

Examples and Recipes

* Classic probability problems:: 
* Monte Carlo inputs for simulations:: 
* Approximating binomial distributions:: 
* Naive bayesian classifier:: 

Functional Programming Modules

* itertools — Functions creating iterators for efficient looping:: 
* functools — Higher-order functions and operations on callable objects:: 
* operator — Standard operators as functions:: 

itertools — Functions creating iterators for efficient looping

* Itertool Functions:: 
* Itertools Recipes:: 

functools — Higher-order functions and operations on callable objects

* partial Objects:: 

operator — Standard operators as functions

* Mapping Operators to Functions:: 
* In-place Operators:: 

File and Directory Access

* pathlib — Object-oriented filesystem paths:: 
* os.path — Common pathname manipulations: os path — Common pathname manipulations. 
* stat — Interpreting stat() results: stat — Interpreting stat results. 
* filecmp — File and Directory Comparisons:: 
* tempfile — Generate temporary files and directories:: 
* glob — Unix style pathname pattern expansion:: 
* fnmatch — Unix filename pattern matching:: 
* linecache — Random access to text lines:: 
* shutil — High-level file operations:: 

pathlib — Object-oriented filesystem paths

* Basic use: Basic use<2>. 
* Exceptions: Exceptions<6>. 
* Pure paths:: 
* Concrete paths:: 
* Pattern language:: 
* Comparison to the glob module:: 
* Comparison to the os and os.path modules: Comparison to the os and os path modules. 
* Protocols:: 

Pure paths

* General properties:: 
* Operators:: 
* Accessing individual parts:: 
* Methods and properties:: 

Concrete paths

* Parsing and generating URIs:: 
* Expanding and resolving paths:: 
* Querying file type and status:: 
* Reading and writing files:: 
* Reading directories:: 
* Creating files and directories:: 
* Copying@comma{} moving and deleting: Copying moving and deleting. 
* Permissions and ownership:: 

Comparison to the os and os.path modules

* Corresponding tools:: 

filecmp — File and Directory Comparisons

* The dircmp class:: 

tempfile — Generate temporary files and directories

* Examples: Examples<5>. 
* Deprecated functions and variables:: 

glob — Unix style pathname pattern expansion

* Examples: Examples<6>. 

shutil — High-level file operations

* Directory and files operations:: 
* Archiving operations:: 
* Querying the size of the output terminal:: 

Directory and files operations

* Platform-dependent efficient copy operations:: 
* copytree example:: 
* rmtree example:: 

Archiving operations

* Archiving example:: 
* Archiving example with base_dir:: 

Data Persistence

* pickle — Python object serialization:: 
* copyreg — Register pickle support functions:: 
* shelve — Python object persistence:: 
* marshal — Internal Python object serialization:: 
* dbm — Interfaces to Unix “databases”:: 
* sqlite3 — DB-API 2.0 interface for SQLite databases: sqlite3 — DB-API 2 0 interface for SQLite databases. 

pickle — Python object serialization

* Relationship to other Python modules:: 
* Data stream format:: 
* Module Interface:: 
* What can be pickled and unpickled?:: 
* Pickling Class Instances:: 
* Custom Reduction for Types@comma{} Functions@comma{} and Other Objects: Custom Reduction for Types Functions and Other Objects. 
* Out-of-band Buffers:: 
* Restricting Globals:: 
* Performance: Performance<2>. 
* Examples: Examples<7>. 
* Command-line interface:: 

Relationship to other Python modules

* Comparison with marshal:: 
* Comparison with json:: 

Pickling Class Instances

* Persistence of External Objects:: 
* Dispatch Tables:: 
* Handling Stateful Objects:: 

Out-of-band Buffers

* Provider API:: 
* Consumer API:: 
* Example: Example<4>. 

copyreg — Register pickle support functions

* Example: Example<5>. 

shelve — Python object persistence

* Restrictions:: 
* Example: Example<6>. 

dbm — Interfaces to Unix “databases”

* dbm.sqlite3 — SQLite backend for dbm: dbm sqlite3 — SQLite backend for dbm. 
* dbm.gnu — GNU database manager: dbm gnu — GNU database manager. 
* dbm.ndbm — New Database Manager: dbm ndbm — New Database Manager. 
* dbm.dumb — Portable DBM implementation: dbm dumb — Portable DBM implementation. 

sqlite3 — DB-API 2.0 interface for SQLite databases

* Tutorial:: 
* Reference:: 
* How-to guides:: 
* Explanation:: 

Reference

* Module functions:: 
* Module constants:: 
* Connection objects:: 
* Cursor objects:: 
* Row objects:: 
* Blob objects:: 
* PrepareProtocol objects:: 
* Exceptions: Exceptions<7>. 
* SQLite and Python types:: 
* Default adapters and converters (deprecated): Default adapters and converters deprecated. 
* Command-line interface: Command-line interface<2>. 

How-to guides

* How to use placeholders to bind values in SQL queries:: 
* How to adapt custom Python types to SQLite values:: 
* How to convert SQLite values to custom Python types:: 
* Adapter and converter recipes:: 
* How to use connection shortcut methods:: 
* How to use the connection context manager:: 
* How to work with SQLite URIs:: 
* How to create and use row factories:: 
* How to handle non-UTF-8 text encodings:: 

How to adapt custom Python types to SQLite values

* How to write adaptable objects:: 
* How to register adapter callables:: 

Explanation

* Transaction control:: 

Transaction control

* Transaction control via the autocommit attribute:: 
* Transaction control via the isolation_level attribute:: 

Data Compression and Archiving

* The compression package:: 
* compression.zstd — Compression compatible with the Zstandard format: compression zstd — Compression compatible with the Zstandard format. 
* zlib — Compression compatible with gzip:: 
* gzip — Support for gzip files:: 
* bz2 — Support for bzip2 compression:: 
* lzma — Compression using the LZMA algorithm:: 
* zipfile — Work with ZIP archives:: 
* tarfile — Read and write tar archive files:: 

compression.zstd — Compression compatible with the Zstandard format

* Exceptions: Exceptions<8>. 
* Reading and writing compressed files:: 
* Compressing and decompressing data in memory:: 
* Zstandard dictionaries:: 
* Advanced parameter control:: 
* Miscellaneous: Miscellaneous<2>. 
* Examples: Examples<8>. 

gzip — Support for gzip files

* Examples of usage:: 
* Command-line interface: Command-line interface<3>. 

Command-line interface

* Command-line options:: 

bz2 — Support for bzip2 compression

* (De)compression of files: De compression of files. 
* Incremental (de)compression: Incremental de compression. 
* One-shot (de)compression: One-shot de compression. 
* Examples of usage: Examples of usage<2>. 

lzma — Compression using the LZMA algorithm

* Reading and writing compressed files: Reading and writing compressed files<2>. 
* Compressing and decompressing data in memory: Compressing and decompressing data in memory<2>. 
* Miscellaneous: Miscellaneous<3>. 
* Specifying custom filter chains:: 
* Examples: Examples<9>. 

zipfile — Work with ZIP archives

* ZipFile objects:: 
* Path objects:: 
* PyZipFile objects:: 
* ZipInfo objects:: 
* Command-line interface: Command-line interface<4>. 
* Decompression pitfalls:: 

Command-line interface

* Command-line options: Command-line options<2>. 

Decompression pitfalls

* From file itself:: 
* File system limitations:: 
* Resources limitations:: 
* Interruption:: 
* Default behaviors of extraction:: 

tarfile — Read and write tar archive files

* TarFile Objects:: 
* TarInfo Objects:: 
* Extraction filters:: 
* Command-Line Interface:: 
* Examples: Examples<10>. 
* Supported tar formats:: 
* Unicode issues:: 

Extraction filters

* Default named filters:: 
* Filter errors:: 
* Hints for further verification:: 
* Supporting older Python versions:: 
* Stateful extraction filter example:: 

Command-Line Interface

* Command-line options: Command-line options<3>. 

Examples

* Reading examples:: 
* Writing examples:: 

File Formats

* csv — CSV File Reading and Writing:: 
* configparser — Configuration file parser:: 
* tomllib — Parse TOML files:: 
* netrc — netrc file processing:: 
* plistlib — Generate and parse Apple .plist files: plistlib — Generate and parse Apple plist files. 

csv — CSV File Reading and Writing

* Module Contents: Module Contents<2>. 
* Dialects and Formatting Parameters:: 
* Reader Objects:: 
* Writer Objects:: 
* Examples: Examples<11>. 

configparser — Configuration file parser

* Quick Start:: 
* Supported Datatypes:: 
* Fallback Values:: 
* Supported INI File Structure:: 
* Unnamed Sections:: 
* Interpolation of values:: 
* Mapping Protocol Access:: 
* Customizing Parser Behaviour:: 
* Legacy API Examples:: 
* ConfigParser Objects:: 
* RawConfigParser Objects:: 
* Exceptions: Exceptions<9>. 

tomllib — Parse TOML files

* Examples: Examples<12>. 
* Conversion Table:: 

netrc — netrc file processing

* netrc Objects:: 

plistlib — Generate and parse Apple .plist files

* Examples: Examples<13>. 

Cryptographic Services

* hashlib — Secure hashes and message digests:: 
* hmac — Keyed-Hashing for Message Authentication:: 
* secrets — Generate secure random numbers for managing secrets:: 

hashlib — Secure hashes and message digests

* Hash algorithms:: 
* Usage:: 
* Constructors:: 
* Attributes:: 
* Hash Objects:: 
* SHAKE variable length digests:: 
* File hashing:: 
* Key derivation:: 
* BLAKE2:: 

BLAKE2

* Creating hash objects:: 
* Constants: Constants<5>. 
* Examples: Examples<14>. 
* Credits:: 

Examples

* Simple hashing:: 
* Using different digest sizes:: 
* Keyed hashing:: 
* Randomized hashing:: 
* Personalization:: 
* Tree mode:: 

secrets — Generate secure random numbers for managing secrets

* Random numbers:: 
* Generating tokens:: 
* Other functions:: 
* Recipes and best practices:: 

Generating tokens

* How many bytes should tokens use?:: 

Generic Operating System Services

* os — Miscellaneous operating system interfaces:: 
* io — Core tools for working with streams:: 
* time — Time access and conversions:: 
* logging — Logging facility for Python:: 
* logging.config — Logging configuration: logging config — Logging configuration. 
* logging.handlers — Logging handlers: logging handlers — Logging handlers. 
* platform — Access to underlying platform’s identifying data:: 
* errno — Standard errno system symbols:: 
* ctypes — A foreign function library for Python:: 

os — Miscellaneous operating system interfaces

* File Names@comma{} Command Line Arguments@comma{} and Environment Variables: File Names Command Line Arguments and Environment Variables. 
* Python UTF-8 Mode:: 
* Process Parameters:: 
* File Object Creation:: 
* File Descriptor Operations:: 
* Files and Directories:: 
* Process Management:: 
* Interface to the scheduler:: 
* Miscellaneous System Information:: 
* Random numbers: Random numbers<2>. 

File Descriptor Operations

* Querying the size of a terminal:: 
* Inheritance of File Descriptors:: 

Files and Directories

* Timer File Descriptors:: 
* Linux extended attributes:: 

io — Core tools for working with streams

* Overview: Overview<2>. 
* Text Encoding:: 
* High-level Module Interface:: 
* Class hierarchy:: 
* Static Typing:: 
* Performance: Performance<3>. 

Overview

* Text I/O:: 
* Binary I/O:: 
* Raw I/O:: 

Text Encoding

* Opt-in EncodingWarning:: 

Class hierarchy

* I/O Base Classes:: 
* Raw File I/O:: 
* Buffered Streams:: 
* Text I/O: Text I/O<2>. 

Performance

* Binary I/O: Binary I/O<2>. 
* Text I/O: Text I/O<3>. 
* Multi-threading: Multi-threading<3>. 
* Reentrancy:: 

time — Time access and conversions

* Functions: Functions<5>. 
* Clock ID Constants:: 
* Timezone Constants:: 

logging — Logging facility for Python

* Logger Objects:: 
* Logging Levels:: 
* Handler Objects:: 
* Formatter Objects:: 
* Filter Objects:: 
* LogRecord Objects:: 
* LogRecord attributes:: 
* LoggerAdapter Objects:: 
* Thread Safety:: 
* Module-Level Functions:: 
* Module-Level Attributes:: 
* Integration with the warnings module:: 

logging.config — Logging configuration

* Configuration functions:: 
* Security considerations:: 
* Configuration dictionary schema:: 
* Configuration file format:: 

Configuration dictionary schema

* Dictionary Schema Details:: 
* Incremental Configuration:: 
* Object connections:: 
* User-defined objects:: 
* Handler configuration order:: 
* Access to external objects:: 
* Access to internal objects:: 
* Import resolution and custom importers:: 
* Configuring QueueHandler and QueueListener:: 

logging.handlers — Logging handlers

* StreamHandler:: 
* FileHandler:: 
* NullHandler:: 
* WatchedFileHandler:: 
* BaseRotatingHandler:: 
* RotatingFileHandler:: 
* TimedRotatingFileHandler:: 
* SocketHandler:: 
* DatagramHandler:: 
* SysLogHandler:: 
* NTEventLogHandler:: 
* SMTPHandler:: 
* MemoryHandler:: 
* HTTPHandler:: 
* QueueHandler:: 
* QueueListener:: 

platform —  Access to underlying platform’s identifying data

* Cross platform:: 
* Java platform:: 
* Windows platform:: 
* macOS platform:: 
* iOS platform:: 
* Unix platforms:: 
* Linux platforms:: 
* Android platform:: 
* Command-line usage: Command-line usage<3>. 

ctypes — A foreign function library for Python

* ctypes tutorial:: 
* ctypes reference:: 

ctypes tutorial

* Loading dynamic link libraries:: 
* Accessing functions from loaded dlls:: 
* Calling functions:: 
* Fundamental data types:: 
* Calling functions@comma{} continued: Calling functions continued. 
* Calling variadic functions:: 
* Calling functions with your own custom data types:: 
* Specifying the required argument types (function prototypes): Specifying the required argument types function prototypes. 
* Return types:: 
* Passing pointers (or; passing parameters by reference): Passing pointers or passing parameters by reference. 
* Structures and unions:: 
* Structure/union layout@comma{} alignment and byte order: Structure/union layout alignment and byte order. 
* Bit fields in structures and unions:: 
* Arrays:: 
* Pointers:: 
* Thread safety without the GIL:: 
* Type conversions:: 
* Incomplete Types:: 
* Callback functions:: 
* Accessing values exported from dlls:: 
* Surprises:: 
* Variable-sized data types:: 

ctypes reference

* Finding shared libraries:: 
* Listing loaded shared libraries:: 
* Loading shared libraries:: 
* Foreign functions:: 
* Function prototypes:: 
* Utility functions:: 
* Data types: Data types<2>. 
* Fundamental data types: Fundamental data types<2>. 
* Structured data types:: 
* Arrays and pointers:: 
* Exceptions: Exceptions<10>. 

Command-line interface libraries

* argparse — Parser for command-line options@comma{} arguments and subcommands: argparse — Parser for command-line options arguments and subcommands. 
* optparse — Parser for command line options:: 
* getpass — Portable password input:: 
* fileinput — Iterate over lines from multiple input streams:: 
* curses — Terminal handling for character-cell displays:: 
* curses.textpad — Text input widget for curses programs: curses textpad — Text input widget for curses programs. 
* curses.ascii — Utilities for ASCII characters: curses ascii — Utilities for ASCII characters. 
* curses.panel — A panel stack extension for curses: curses panel — A panel stack extension for curses. 
* cmd — Support for line-oriented command interpreters:: 

argparse — Parser for command-line options, arguments and subcommands

* ArgumentParser objects:: 
* The add_argument() method: The add_argument method. 
* The parse_args() method: The parse_args method. 
* Other utilities:: 
* Exceptions: Exceptions<11>. 

ArgumentParser objects

* prog:: 
* usage:: 
* description:: 
* epilog:: 
* parents:: 
* formatter_class:: 
* prefix_chars:: 
* fromfile_prefix_chars:: 
* argument_default:: 
* allow_abbrev:: 
* conflict_handler:: 
* add_help:: 
* exit_on_error:: 
* suggest_on_error:: 
* color:: 

The add_argument() method

* name or flags:: 
* action:: 
* nargs:: 
* const:: 
* default:: 
* type:: 
* choices:: 
* required:: 
* help:: 
* metavar:: 
* dest:: 
* deprecated:: 
* Action classes:: 

The parse_args() method

* Option value syntax:: 
* Invalid arguments:: 
* Arguments containing -:: 
* Argument abbreviations (prefix matching): Argument abbreviations prefix matching. 
* Beyond sys.argv: Beyond sys argv. 
* The Namespace object:: 

Other utilities

* Subcommands:: 
* FileType objects:: 
* Argument groups:: 
* Mutual exclusion:: 
* Parser defaults:: 
* Printing help:: 
* Partial parsing:: 
* Customizing file parsing:: 
* Exiting methods:: 
* Intermixed parsing:: 
* Registering custom types or actions:: 

Exceptions

* Argparse Tutorial:: 
* Migrating optparse code to argparse:: 

Argparse Tutorial

* Concepts:: 
* The basics:: 
* Introducing Positional arguments:: 
* Introducing Optional arguments:: 
* Combining Positional and Optional arguments:: 
* Getting a little more advanced:: 
* How to translate the argparse output:: 
* Custom type converters:: 
* Conclusion:: 

Introducing Optional arguments

* Short options:: 

Getting a little more advanced

* Specifying ambiguous arguments:: 
* Conflicting options:: 

optparse — Parser for command line options

* Choosing an argument parsing library:: 
* Introduction: Introduction<7>. 
* Background:: 
* Tutorial: Tutorial<2>. 
* Reference Guide:: 
* Option Callbacks:: 
* Extending optparse:: 
* Exceptions: Exceptions<12>. 

Background

* Terminology:: 
* What are options for?:: 
* What are positional arguments for?:: 

Tutorial

* Understanding option actions:: 
* The store action:: 
* Handling boolean (flag) options: Handling boolean flag options. 
* Other actions:: 
* Default values:: 
* Generating help:: 
* Printing a version string:: 
* How optparse handles errors:: 
* Putting it all together:: 

Generating help

* Grouping Options:: 

Reference Guide

* Creating the parser:: 
* Populating the parser:: 
* Defining options:: 
* Option attributes:: 
* Standard option actions:: 
* Standard option types:: 
* Parsing arguments:: 
* Querying and manipulating your option parser:: 
* Conflicts between options:: 
* Cleanup:: 
* Other methods:: 

Option Callbacks

* Defining a callback option:: 
* How callbacks are called:: 
* Raising errors in a callback:: 
* Callback example 1; trivial callback: Callback example 1 trivial callback. 
* Callback example 2; check option order: Callback example 2 check option order. 
* Callback example 3; check option order (generalized): Callback example 3 check option order generalized. 
* Callback example 4; check arbitrary condition: Callback example 4 check arbitrary condition. 
* Callback example 5; fixed arguments: Callback example 5 fixed arguments. 
* Callback example 6; variable arguments: Callback example 6 variable arguments. 

Extending optparse

* Adding new types:: 
* Adding new actions:: 

curses — Terminal handling for character-cell displays

* Functions: Functions<6>. 
* Window objects:: 
* Constants: Constants<6>. 

curses.textpad — Text input widget for curses programs

* Textbox objects:: 

curses.panel — A panel stack extension for curses

* Functions: Functions<7>. 
* Panel objects:: 

cmd — Support for line-oriented command interpreters

* Cmd Objects:: 
* Cmd Example:: 

Concurrent Execution

* threading — Thread-based parallelism:: 
* multiprocessing — Process-based parallelism:: 
* multiprocessing.shared_memory — Shared memory for direct access across processes: multiprocessing shared_memory — Shared memory for direct access across processes. 
* The concurrent package:: 
* concurrent.futures — Launching parallel tasks: concurrent futures — Launching parallel tasks. 
* concurrent.interpreters — Multiple interpreters in the same process: concurrent interpreters — Multiple interpreters in the same process. 
* subprocess — Subprocess management:: 
* sched — Event scheduler:: 
* queue — A synchronized queue class:: 
* contextvars — Context Variables:: 
* _thread — Low-level threading API:: 

threading — Thread-based parallelism

* Introduction: Introduction<8>. 
* GIL and performance considerations:: 
* Reference: Reference<2>. 
* Using locks@comma{} conditions@comma{} and semaphores in the with statement: Using locks conditions and semaphores in the with statement. 

Reference

* Thread-local data:: 
* Thread objects:: 
* Lock objects:: 
* RLock objects:: 
* Condition objects:: 
* Semaphore objects:: 
* Semaphore example:: 
* Event objects:: 
* Timer objects:: 
* Barrier objects:: 

multiprocessing — Process-based parallelism

* Introduction: Introduction<9>. 
* Reference: Reference<3>. 
* Programming guidelines:: 
* Examples: Examples<15>. 

Introduction

* The Process class:: 
* Contexts and start methods:: 
* Exchanging objects between processes:: 
* Synchronization between processes:: 
* Sharing state between processes:: 
* Using a pool of workers:: 

Reference

* Global start method:: 
* Process and exceptions:: 
* Pipes and Queues:: 
* Miscellaneous: Miscellaneous<4>. 
* Connection Objects:: 
* Synchronization primitives:: 
* Shared ctypes Objects:: 
* Managers:: 
* Proxy Objects:: 
* Process Pools:: 
* Listeners and Clients:: 
* Authentication keys:: 
* Logging: Logging<2>. 
* The multiprocessing.dummy module: The multiprocessing dummy module. 

Shared ctypes Objects

* The multiprocessing.sharedctypes module: The multiprocessing sharedctypes module. 

Managers

* Customized managers:: 
* Using a remote manager:: 

Proxy Objects

* Cleanup: Cleanup<2>. 

Listeners and Clients

* Address Formats:: 

Programming guidelines

* All start methods:: 
* The spawn and forkserver start methods:: 

concurrent.futures — Launching parallel tasks

* Executor Objects:: 
* ThreadPoolExecutor:: 
* InterpreterPoolExecutor:: 
* ProcessPoolExecutor:: 
* Future Objects:: 
* Module Functions:: 
* Exception classes:: 

ThreadPoolExecutor

* ThreadPoolExecutor Example:: 

ProcessPoolExecutor

* ProcessPoolExecutor Example:: 

concurrent.interpreters — Multiple interpreters in the same process

* Key details:: 
* Introduction: Introduction<10>. 
* Reference: Reference<4>. 
* Basic usage:: 

Introduction

* Multiple Interpreters and Isolation:: 
* Running in an Interpreter:: 
* Concurrency and Parallelism:: 
* Communication Between Interpreters:: 
* “Sharing” Objects:: 

Reference

* Interpreter objects:: 
* Exceptions: Exceptions<13>. 
* Communicating Between Interpreters:: 

subprocess — Subprocess management

* Using the subprocess Module:: 
* Security Considerations:: 
* Popen Objects:: 
* Windows Popen Helpers:: 
* Older high-level API:: 
* Replacing Older Functions with the subprocess Module:: 
* Legacy Shell Invocation Functions:: 
* Notes: Notes<2>. 

Using the subprocess Module

* Frequently Used Arguments:: 
* Popen Constructor:: 
* Exceptions: Exceptions<14>. 

Windows Popen Helpers

* Windows Constants:: 

Replacing Older Functions with the subprocess Module

* Replacing /bin/sh shell command substitution:: 
* Replacing shell pipeline:: 
* Replacing os.system(): Replacing os system. 
* Replacing the os.spawn family: Replacing the os spawn family. 
* Replacing os.popen(): Replacing os popen. 

Notes

* Timeout Behavior:: 
* Converting an argument sequence to a string on Windows:: 
* Disable use of posix_spawn(): Disable use of posix_spawn. 

sched — Event scheduler

* Scheduler Objects:: 

queue — A synchronized queue class

* Queue Objects:: 
* SimpleQueue Objects:: 

Queue Objects

* Waiting for task completion:: 
* Terminating queues:: 

contextvars — Context Variables

* Context Variables:: 
* Manual Context Management:: 
* asyncio support:: 

Networking and Interprocess Communication

* asyncio — Asynchronous I/O:: 
* socket — Low-level networking interface:: 
* ssl — TLS/SSL wrapper for socket objects:: 
* select — Waiting for I/O completion:: 
* selectors — High-level I/O multiplexing:: 
* signal — Set handlers for asynchronous events:: 
* mmap — Memory-mapped file support:: 

asyncio — Asynchronous I/O

* Runners:: 
* Coroutines and tasks:: 
* Streams:: 
* Synchronization Primitives:: 
* Subprocesses:: 
* Queues:: 
* Exceptions: Exceptions<16>. 
* Call Graph Introspection:: 
* Event loop:: 
* Futures:: 
* Transports and Protocols:: 
* Policies:: 
* Platform Support:: 
* Extending:: 
* High-level API Index:: 
* Low-level API Index:: 
* Developing with asyncio:: 
* asyncio and free-threaded Python:: 

Runners

* Running an asyncio Program:: 
* Runner context manager:: 
* Handling Keyboard Interruption:: 

Coroutines and tasks

* Coroutines: Coroutines<3>. 
* Awaitables:: 
* Creating tasks:: 
* Task cancellation:: 
* Task groups:: 
* Sleeping:: 
* Running tasks concurrently:: 
* Eager task factory:: 
* Shielding from cancellation:: 
* Timeouts:: 
* Waiting primitives:: 
* Running in threads:: 
* Scheduling from other threads:: 
* Introspection:: 
* Task object:: 

Task groups

* Terminating a task group:: 

Streams

* StreamReader:: 
* StreamWriter:: 
* Examples: Examples<16>. 

Examples

* TCP echo client using streams:: 
* TCP echo server using streams:: 
* Get HTTP headers:: 
* Register an open socket to wait for data using streams:: 

Synchronization Primitives

* Lock:: 
* Event:: 
* Condition:: 
* Semaphore:: 
* BoundedSemaphore:: 
* Barrier:: 

Subprocesses

* Creating Subprocesses:: 
* Constants: Constants<7>. 
* Interacting with Subprocesses:: 

Interacting with Subprocesses

* Subprocess and Threads:: 
* Examples: Examples<17>. 

Queues

* Queue:: 
* Priority Queue:: 
* LIFO Queue:: 
* Exceptions: Exceptions<15>. 
* Examples: Examples<18>. 

Call Graph Introspection

* Low level utility functions:: 

Event loop

* Event loop methods:: 
* Callback handles:: 
* Server objects:: 
* Event loop implementations:: 
* Examples: Examples<19>. 

Event loop methods

* Running and stopping the loop:: 
* Scheduling callbacks:: 
* Scheduling delayed callbacks:: 
* Creating futures and tasks:: 
* Opening network connections:: 
* Creating network servers:: 
* Transferring files:: 
* TLS upgrade:: 
* Watching file descriptors:: 
* Working with socket objects directly:: 
* DNS:: 
* Working with pipes:: 
* Unix signals:: 
* Executing code in thread or process pools:: 
* Error handling API:: 
* Enabling debug mode:: 
* Running subprocesses:: 

Examples

* Hello World with call_soon(): Hello World with call_soon. 
* Display the current date with call_later(): Display the current date with call_later. 
* Watch a file descriptor for read events:: 
* Set signal handlers for SIGINT and SIGTERM:: 

Futures

* Future Functions:: 
* Future Object:: 

Transports and Protocols

* Transports:: 
* Protocols: Protocols<2>. 
* Examples: Examples<20>. 

Transports

* Transports Hierarchy:: 
* Base Transport:: 
* Read-only Transports:: 
* Write-only Transports:: 
* Datagram Transports:: 
* Subprocess Transports:: 

Protocols

* Base Protocols:: 
* Base Protocol:: 
* Streaming Protocols:: 
* Buffered Streaming Protocols:: 
* Datagram Protocols:: 
* Subprocess Protocols:: 

Examples

* TCP Echo Server:: 
* TCP Echo Client:: 
* UDP Echo Server:: 
* UDP Echo Client:: 
* Connecting Existing Sockets:: 
* loop.subprocess_exec() and SubprocessProtocol: loop subprocess_exec and SubprocessProtocol. 

Policies

* Getting and Setting the Policy:: 
* Policy Objects:: 
* Custom Policies:: 

Platform Support

* All Platforms:: 
* Windows: Windows<86>. 
* macOS: macOS<55>. 

Windows

* Subprocess Support on Windows:: 

Extending

* Writing a Custom Event Loop:: 
* Future and Task private constructors:: 
* Task lifetime support:: 

High-level API Index

* Tasks:: 
* Queues: Queues<2>. 
* Subprocesses: Subprocesses<2>. 
* Streams: Streams<2>. 
* Synchronization:: 
* Exceptions: Exceptions<17>. 

Low-level API Index

* Obtaining the Event Loop:: 
* Event Loop Methods:: 
* Transports: Transports<2>. 
* Protocols: Protocols<3>. 
* Event Loop Policies:: 

Developing with asyncio

* Debug Mode:: 
* Concurrency and Multithreading:: 
* Running Blocking Code:: 
* Logging: Logging<3>. 
* Detect never-awaited coroutines:: 
* Detect never-retrieved exceptions:: 
* Asynchronous generators best practices:: 

Asynchronous generators best practices

* Close asynchronous generators explicitly:: 
* Create asynchronous generators only when the event loop is running:: 
* Avoid concurrent iteration and closure of the same generator:: 

asyncio and free-threaded Python

* Thread safety considerations:: 
* Using asyncio with threads:: 
* Producer/consumer across threads:: 

socket — Low-level networking interface

* Socket families:: 
* Module contents: Module contents<2>. 
* Socket Objects:: 
* Notes on socket timeouts:: 
* Example: Example<7>. 

Module contents

* Exceptions: Exceptions<18>. 
* Constants: Constants<8>. 
* Functions: Functions<8>. 

Functions

* Creating sockets:: 
* Other functions: Other functions<2>. 

Notes on socket timeouts

* Timeouts and the connect method:: 
* Timeouts and the accept method:: 

ssl — TLS/SSL wrapper for socket objects

* Functions@comma{} constants@comma{} and exceptions: Functions constants and exceptions. 
* SSL sockets:: 
* SSL contexts:: 
* Certificates:: 
* Examples: Examples<21>. 
* Notes on non-blocking sockets:: 
* Memory BIO support:: 
* SSL session:: 
* Security considerations: Security considerations<2>. 
* TLS 1.3: TLS 1 3. 

Functions, constants, and exceptions

* Socket creation:: 
* Context creation:: 
* Exceptions: Exceptions<19>. 
* Random generation:: 
* Certificate handling:: 
* Constants: Constants<9>. 

Certificates

* Certificate chains:: 
* CA certificates:: 
* Combined key and certificate:: 
* Self-signed certificates:: 

Examples

* Testing for SSL support:: 
* Client-side operation:: 
* Server-side operation:: 

Security considerations

* Best defaults:: 
* Manual settings:: 
* Multi-processing:: 

Manual settings

* Verifying certificates:: 
* Protocol versions:: 
* Cipher selection:: 

select — Waiting for I/O completion

* /dev/poll polling objects:: 
* Edge and level trigger polling (epoll) objects: Edge and level trigger polling epoll objects. 
* Polling objects:: 
* Kqueue objects:: 
* Kevent objects:: 

selectors — High-level I/O multiplexing

* Introduction: Introduction<11>. 
* Classes: Classes<4>. 
* Examples: Examples<22>. 

signal — Set handlers for asynchronous events

* General rules:: 
* Module contents: Module contents<3>. 
* Examples: Examples<23>. 
* Note on SIGPIPE:: 
* Note on Signal Handlers and Exceptions:: 

General rules

* Execution of Python signal handlers:: 
* Signals and threads:: 

mmap — Memory-mapped file support

* MADV_* Constants:: 
* MAP_* Constants:: 

Internet Data Handling

* email — An email and MIME handling package:: 
* json — JSON encoder and decoder:: 
* mailbox — Manipulate mailboxes in various formats:: 
* mimetypes — Map filenames to MIME types:: 
* base64 — Base16@comma{} Base32@comma{} Base64@comma{} Base85 Data Encodings: base64 — Base16 Base32 Base64 Base85 Data Encodings. 
* binascii — Convert between binary and ASCII:: 
* quopri — Encode and decode MIME quoted-printable data:: 

email — An email and MIME handling package

* email.message; Representing an email message: email message Representing an email message. 
* email.parser; Parsing email messages: email parser Parsing email messages. 
* email.generator; Generating MIME documents: email generator Generating MIME documents. 
* email.policy; Policy Objects: email policy Policy Objects. 
* email.errors; Exception and Defect classes: email errors Exception and Defect classes. 
* email.headerregistry; Custom Header Objects: email headerregistry Custom Header Objects. 
* email.contentmanager; Managing MIME Content: email contentmanager Managing MIME Content. 
* email; Examples: email Examples. 
* email.message.Message; Representing an email message using the compat32 API: email message Message Representing an email message using the compat32 API. 
* email.mime; Creating email and MIME objects from scratch: email mime Creating email and MIME objects from scratch. 
* email.header; Internationalized headers: email header Internationalized headers. 
* email.charset; Representing character sets: email charset Representing character sets. 
* email.encoders; Encoders: email encoders Encoders. 
* email.utils; Miscellaneous utilities: email utils Miscellaneous utilities. 
* email.iterators; Iterators: email iterators Iterators. 

email.parser: Parsing email messages

* FeedParser API:: 
* Parser API:: 
* Additional notes:: 

email.contentmanager: Managing MIME Content

* Content Manager Instances:: 

json — JSON encoder and decoder

* Basic Usage:: 
* Encoders and Decoders:: 
* Exceptions: Exceptions<20>. 
* Standard Compliance and Interoperability:: 
* Command-line interface: Command-line interface<5>. 

Standard Compliance and Interoperability

* Character Encodings:: 
* Infinite and NaN Number Values:: 
* Repeated Names Within an Object:: 
* Top-level Non-Object@comma{} Non-Array Values: Top-level Non-Object Non-Array Values. 
* Implementation Limitations:: 

Command-line interface

* Command-line options: Command-line options<4>. 

mailbox — Manipulate mailboxes in various formats

* Mailbox objects:: 
* Message objects:: 
* Exceptions: Exceptions<21>. 
* Examples: Examples<24>. 

Mailbox objects

* Maildir objects:: 
* mbox objects:: 
* MH objects:: 
* Babyl objects:: 
* MMDF objects:: 

Message objects

* MaildirMessage objects:: 
* mboxMessage objects:: 
* MHMessage objects:: 
* BabylMessage objects:: 
* MMDFMessage objects:: 

mimetypes — Map filenames to MIME types

* MimeTypes objects:: 
* Command-line usage: Command-line usage<4>. 
* Command-line example: Command-line example<2>. 

base64 — Base16, Base32, Base64, Base85 Data Encodings

* RFC 4648 Encodings:: 
* Base85 Encodings:: 
* Legacy Interface:: 
* Security Considerations: Security Considerations<2>. 

Structured Markup Processing Tools

* html — HyperText Markup Language support:: 
* html.parser — Simple HTML and XHTML parser: html parser — Simple HTML and XHTML parser. 
* html.entities — Definitions of HTML general entities: html entities — Definitions of HTML general entities. 
* XML Processing Modules:: 
* xml.etree.ElementTree — The ElementTree XML API: xml etree ElementTree — The ElementTree XML API. 
* xml.dom — The Document Object Model API: xml dom — The Document Object Model API. 
* xml.dom.minidom — Minimal DOM implementation: xml dom minidom — Minimal DOM implementation. 
* xml.dom.pulldom — Support for building partial DOM trees: xml dom pulldom — Support for building partial DOM trees. 
* xml.sax — Support for SAX2 parsers: xml sax — Support for SAX2 parsers. 
* xml.sax.handler — Base classes for SAX handlers: xml sax handler — Base classes for SAX handlers. 
* xml.sax.saxutils — SAX Utilities: xml sax saxutils — SAX Utilities. 
* xml.sax.xmlreader — Interface for XML parsers: xml sax xmlreader — Interface for XML parsers. 
* xml.parsers.expat — Fast XML parsing using Expat: xml parsers expat — Fast XML parsing using Expat. 

html.parser — Simple HTML and XHTML parser

* Example HTML Parser Application:: 
* HTMLParser Methods:: 
* Examples: Examples<25>. 

XML Processing Modules

* XML security:: 

xml.etree.ElementTree — The ElementTree XML API

* Tutorial: Tutorial<3>. 
* XPath support:: 
* Reference: Reference<5>. 
* XInclude support:: 
* Reference: Reference<6>. 

Tutorial

* XML tree and elements:: 
* Parsing XML:: 
* Pull API for non-blocking parsing:: 
* Finding interesting elements:: 
* Modifying an XML File:: 
* Building XML documents:: 
* Parsing XML with Namespaces:: 

XPath support

* Example: Example<8>. 
* Supported XPath syntax:: 

Reference

* Functions: Functions<9>. 

XInclude support

* Example: Example<9>. 

Reference

* Functions: Functions<10>. 
* Element Objects:: 
* ElementTree Objects:: 
* QName Objects:: 
* TreeBuilder Objects:: 
* XMLParser Objects:: 
* XMLPullParser Objects:: 
* Exceptions: Exceptions<22>. 

xml.dom — The Document Object Model API

* Module Contents: Module Contents<3>. 
* Objects in the DOM:: 
* Conformance:: 

Objects in the DOM

* DOMImplementation Objects:: 
* Node Objects:: 
* NodeList Objects:: 
* DocumentType Objects:: 
* Document Objects:: 
* Element Objects: Element Objects<2>. 
* Attr Objects:: 
* NamedNodeMap Objects:: 
* Comment Objects:: 
* Text and CDATASection Objects:: 
* ProcessingInstruction Objects:: 
* Exceptions: Exceptions<23>. 

Conformance

* Type Mapping:: 
* Accessor Methods:: 

xml.dom.minidom — Minimal DOM implementation

* DOM Objects:: 
* DOM Example:: 
* minidom and the DOM standard:: 

xml.dom.pulldom — Support for building partial DOM trees

* DOMEventStream Objects:: 

xml.sax — Support for SAX2 parsers

* SAXException Objects:: 

xml.sax.handler — Base classes for SAX handlers

* ContentHandler Objects:: 
* DTDHandler Objects:: 
* EntityResolver Objects:: 
* ErrorHandler Objects:: 
* LexicalHandler Objects:: 

xml.sax.xmlreader — Interface for XML parsers

* XMLReader Objects:: 
* IncrementalParser Objects:: 
* Locator Objects:: 
* InputSource Objects:: 
* The Attributes Interface:: 
* The AttributesNS Interface:: 

xml.parsers.expat — Fast XML parsing using Expat

* XMLParser Objects: XMLParser Objects<2>. 
* ExpatError Exceptions:: 
* Example: Example<10>. 
* Content Model Descriptions:: 
* Expat error constants:: 

Internet Protocols and Support

* webbrowser — Convenient web-browser controller:: 
* wsgiref — WSGI Utilities and Reference Implementation:: 
* urllib — URL handling modules:: 
* urllib.request — Extensible library for opening URLs: urllib request — Extensible library for opening URLs. 
* urllib.response — Response classes used by urllib: urllib response — Response classes used by urllib. 
* urllib.parse — Parse URLs into components: urllib parse — Parse URLs into components. 
* urllib.error — Exception classes raised by urllib.request: urllib error — Exception classes raised by urllib request. 
* urllib.robotparser — Parser for robots.txt: urllib robotparser — Parser for robots txt. 
* http — HTTP modules:: 
* http.client — HTTP protocol client: http client — HTTP protocol client. 
* ftplib — FTP protocol client:: 
* poplib — POP3 protocol client:: 
* imaplib — IMAP4 protocol client:: 
* smtplib — SMTP protocol client:: 
* uuid — UUID objects according to RFC 9562:: 
* socketserver — A framework for network servers:: 
* http.server — HTTP servers: http server — HTTP servers. 
* http.cookies — HTTP state management: http cookies — HTTP state management. 
* http.cookiejar — Cookie handling for HTTP clients: http cookiejar — Cookie handling for HTTP clients. 
* xmlrpc — XMLRPC server and client modules:: 
* xmlrpc.client — XML-RPC client access: xmlrpc client — XML-RPC client access. 
* xmlrpc.server — Basic XML-RPC servers: xmlrpc server — Basic XML-RPC servers. 
* ipaddress — IPv4/IPv6 manipulation library:: 

webbrowser — Convenient web-browser controller

* Command-line interface: Command-line interface<6>. 
* Browser controller objects:: 

wsgiref — WSGI Utilities and Reference Implementation

* wsgiref.util – WSGI environment utilities: wsgiref util – WSGI environment utilities. 
* wsgiref.headers – WSGI response header tools: wsgiref headers – WSGI response header tools. 
* wsgiref.simple_server – a simple WSGI HTTP server: wsgiref simple_server – a simple WSGI HTTP server. 
* wsgiref.validate — WSGI conformance checker: wsgiref validate — WSGI conformance checker. 
* wsgiref.handlers – server/gateway base classes: wsgiref handlers – server/gateway base classes. 
* wsgiref.types – WSGI types for static type checking: wsgiref types – WSGI types for static type checking. 
* Examples: Examples<26>. 

urllib.request — Extensible library for opening URLs

* Request Objects:: 
* OpenerDirector Objects:: 
* BaseHandler Objects:: 
* HTTPRedirectHandler Objects:: 
* HTTPCookieProcessor Objects:: 
* ProxyHandler Objects:: 
* HTTPPasswordMgr Objects:: 
* HTTPPasswordMgrWithPriorAuth Objects:: 
* AbstractBasicAuthHandler Objects:: 
* HTTPBasicAuthHandler Objects:: 
* ProxyBasicAuthHandler Objects:: 
* AbstractDigestAuthHandler Objects:: 
* HTTPDigestAuthHandler Objects:: 
* ProxyDigestAuthHandler Objects:: 
* HTTPHandler Objects:: 
* HTTPSHandler Objects:: 
* FileHandler Objects:: 
* DataHandler Objects:: 
* FTPHandler Objects:: 
* CacheFTPHandler Objects:: 
* UnknownHandler Objects:: 
* HTTPErrorProcessor Objects:: 
* Examples: Examples<27>. 
* Legacy interface:: 
* urllib.request Restrictions: urllib request Restrictions. 

urllib.parse — Parse URLs into components

* URL Parsing:: 
* URL parsing security:: 
* Parsing ASCII Encoded Bytes:: 
* Structured Parse Results:: 
* URL Quoting:: 

http — HTTP modules

* HTTP status codes:: 
* HTTP status category:: 
* HTTP methods:: 

http.client — HTTP protocol client

* HTTPConnection Objects:: 
* HTTPResponse Objects:: 
* Examples: Examples<28>. 
* HTTPMessage Objects:: 

ftplib — FTP protocol client

* Reference: Reference<7>. 

Reference

* FTP objects:: 
* FTP_TLS objects:: 
* Module variables:: 

poplib — POP3 protocol client

* POP3 Objects:: 
* POP3 Example:: 

imaplib — IMAP4 protocol client

* IMAP4 Objects:: 
* IMAP4 Example:: 

smtplib — SMTP protocol client

* SMTP Objects:: 
* SMTP Example:: 

uuid — UUID objects according to RFC 9562

* Command-Line Usage:: 
* Example: Example<11>. 
* Command-Line Example:: 

socketserver — A framework for network servers

* Server Creation Notes:: 
* Server Objects:: 
* Request Handler Objects:: 
* Examples: Examples<29>. 

Examples

* socketserver.TCPServer Example: socketserver TCPServer Example. 
* socketserver.UDPServer Example: socketserver UDPServer Example. 
* Asynchronous Mixins:: 

http.server — HTTP servers

* Command-line interface: Command-line interface<7>. 
* Security considerations: Security considerations<3>. 

http.cookies — HTTP state management

* Cookie Objects:: 
* Morsel Objects:: 
* Example: Example<12>. 

http.cookiejar — Cookie handling for HTTP clients

* CookieJar and FileCookieJar Objects:: 
* FileCookieJar subclasses and co-operation with web browsers:: 
* CookiePolicy Objects:: 
* DefaultCookiePolicy Objects:: 
* Cookie Objects: Cookie Objects<2>. 
* Examples: Examples<30>. 

xmlrpc.client — XML-RPC client access

* ServerProxy Objects:: 
* DateTime Objects:: 
* Binary Objects:: 
* Fault Objects:: 
* ProtocolError Objects:: 
* MultiCall Objects:: 
* Convenience Functions:: 
* Example of Client Usage:: 
* Example of Client and Server Usage:: 

xmlrpc.server — Basic XML-RPC servers

* SimpleXMLRPCServer objects:: 
* CGIXMLRPCRequestHandler:: 
* Documenting XMLRPC server:: 
* DocXMLRPCServer objects:: 
* DocCGIXMLRPCRequestHandler:: 

SimpleXMLRPCServer objects

* SimpleXMLRPCServer example:: 

ipaddress — IPv4/IPv6 manipulation library

* Convenience factory functions:: 
* IP Addresses:: 
* IP Network definitions:: 
* Interface objects:: 
* Other Module Level Functions:: 
* Custom Exceptions:: 

IP Addresses

* Address objects:: 
* Conversion to Strings and Integers:: 
* Operators: Operators<2>. 

Operators

* Comparison operators:: 
* Arithmetic operators:: 

IP Network definitions

* Prefix@comma{} net mask and host mask: Prefix net mask and host mask. 
* Network objects:: 
* Operators: Operators<3>. 

Operators

* Logical operators:: 
* Iteration:: 
* Networks as containers of addresses:: 

Interface objects

* Operators: Operators<4>. 

Operators

* Logical operators: Logical operators<2>. 

Multimedia Services

* wave — Read and write WAV files:: 
* colorsys — Conversions between color systems:: 

wave — Read and write WAV files

* Wave_read Objects:: 
* Wave_write Objects:: 

Internationalization

* gettext — Multilingual internationalization services:: 
* locale — Internationalization services:: 

gettext — Multilingual internationalization services

* GNU gettext API:: 
* Class-based API:: 
* Internationalizing your programs and modules:: 
* Acknowledgements: Acknowledgements<9>. 

Class-based API

* The NullTranslations class:: 
* The GNUTranslations class:: 
* Solaris message catalog support:: 
* The Catalog constructor:: 

Internationalizing your programs and modules

* Localizing your module:: 
* Localizing your application:: 
* Changing languages on the fly:: 
* Deferred translations:: 

locale — Internationalization services

* Background@comma{} details@comma{} hints@comma{} tips and caveats: Background details hints tips and caveats. 
* Locale names:: 
* For extension writers and programs that embed Python:: 
* Access to message catalogs:: 

Graphical user interfaces with Tk

* tkinter — Python interface to Tcl/Tk:: 
* tkinter.colorchooser — Color choosing dialog: tkinter colorchooser — Color choosing dialog. 
* tkinter.font — Tkinter font wrapper: tkinter font — Tkinter font wrapper. 
* Tkinter dialogs:: 
* tkinter.messagebox — Tkinter message prompts: tkinter messagebox — Tkinter message prompts. 
* tkinter.scrolledtext — Scrolled text widget: tkinter scrolledtext — Scrolled text widget. 
* tkinter.dnd — Drag and drop support: tkinter dnd — Drag and drop support. 
* tkinter.ttk — Tk themed widgets: tkinter ttk — Tk themed widgets. 
* IDLE — Python editor and shell: IDLE — Python editor and shell<2>. 
* turtle — Turtle graphics:: 

tkinter — Python interface to Tcl/Tk

* Architecture:: 
* Tkinter modules:: 
* Tkinter life preserver:: 
* Threading model:: 
* Handy reference:: 
* File handlers:: 
* Reference: Reference<8>. 

Tkinter life preserver

* A Hello World program:: 
* Important Tk concepts:: 
* Understanding how Tkinter wraps Tcl/Tk:: 
* How do I…? What option does…?:: 
* Navigating the Tcl/Tk reference manual:: 

Handy reference

* Setting options:: 
* The packer:: 
* Packer options:: 
* Coupling widget variables:: 
* The window manager:: 
* Tk option data types:: 
* Bindings and events:: 
* The index parameter:: 
* Images:: 

Reference

* Base and mixin classes:: 
* Widget classes:: 
* Variable classes:: 
* Image classes:: 
* Other classes:: 
* Module-level functions:: 
* Constants: Constants<10>. 

Tkinter dialogs

* tkinter.simpledialog — Standard Tkinter input dialogs: tkinter simpledialog — Standard Tkinter input dialogs. 
* tkinter.filedialog — File selection dialogs: tkinter filedialog — File selection dialogs. 
* tkinter.commondialog — Dialog window templates: tkinter commondialog — Dialog window templates. 
* tkinter.dialog — Classic Tk dialog boxes: tkinter dialog — Classic Tk dialog boxes. 

tkinter.filedialog — File selection dialogs

* Native load/save dialogs:: 

tkinter.ttk — Tk themed widgets

* Using Ttk:: 
* Ttk widgets:: 
* Widget:: 
* Combobox:: 
* Spinbox:: 
* Notebook:: 
* Progressbar:: 
* Separator:: 
* Sizegrip:: 
* Treeview:: 
* Ttk styling:: 
* Additional widgets:: 

Widget

* Standard options:: 
* Scrollable widget options:: 
* Label options:: 
* Compatibility options:: 
* Widget states:: 
* ttk.Widget: ttk Widget. 

Combobox

* Options:: 
* Virtual events:: 
* ttk.Combobox: ttk Combobox. 

Spinbox

* Options: Options<2>. 
* Virtual events: Virtual events<2>. 
* ttk.Spinbox: ttk Spinbox. 

Notebook

* Options: Options<3>. 
* Tab options:: 
* Tab identifiers:: 
* Virtual events: Virtual events<3>. 
* ttk.Notebook: ttk Notebook. 

Progressbar

* Options: Options<4>. 
* ttk.Progressbar: ttk Progressbar. 

Separator

* Options: Options<5>. 

Sizegrip

* Platform-specific notes:: 
* Bugs:: 

Treeview

* Options: Options<6>. 
* Item options:: 
* Tag options:: 
* Column identifiers:: 
* Virtual events: Virtual events<4>. 
* ttk.Treeview: ttk Treeview. 

Ttk styling

* Layouts:: 

IDLE — Python editor and shell

* Menus:: 
* Editing and Navigation:: 
* Startup and Code Execution:: 
* Help and Preferences:: 
* idlelib — implementation of IDLE application:: 

Menus

* File menu (Shell and Editor): File menu Shell and Editor. 
* Edit menu (Shell and Editor): Edit menu Shell and Editor. 
* Format menu (Editor window only): Format menu Editor window only. 
* Run menu (Editor window only): Run menu Editor window only. 
* Shell menu (Shell window only): Shell menu Shell window only. 
* Debug menu (Shell window only): Debug menu Shell window only. 
* Options menu (Shell and Editor): Options menu Shell and Editor. 
* Window menu (Shell and Editor): Window menu Shell and Editor. 
* Help menu (Shell and Editor): Help menu Shell and Editor. 
* Context menus:: 

Editing and Navigation

* Editor windows:: 
* Key bindings:: 
* Automatic indentation:: 
* Search and Replace:: 
* Completions:: 
* Calltips:: 
* Format block:: 
* Code Context:: 
* Shell window:: 
* Text colors:: 

Startup and Code Execution

* Command-line usage: Command-line usage<5>. 
* Startup failure:: 
* Running user code:: 
* User output in Shell:: 
* Developing tkinter applications:: 
* Running without a subprocess:: 

Help and Preferences

* Help sources:: 
* Setting preferences:: 
* IDLE on macOS:: 
* Extensions:: 

turtle — Turtle graphics

* Introduction: Introduction<12>. 
* Get started:: 
* Tutorial: Tutorial<4>. 
* How to…:: 
* Turtle graphics reference:: 
* Methods of RawTurtle/Turtle and corresponding functions:: 
* Methods of TurtleScreen/Screen and corresponding functions:: 
* Public classes:: 
* Explanation: Explanation<2>. 
* Help and configuration:: 
* turtledemo — Demo scripts:: 
* Changes since Python 2.6: Changes since Python 2 6. 
* Changes since Python 3.0: Changes since Python 3 0. 

Tutorial

* Starting a turtle environment:: 
* Basic drawing:: 
* Making algorithmic patterns:: 

Basic drawing

* Pen control:: 
* The turtle’s position:: 

How to…

* Get started as quickly as possible:: 
* Automatically begin and end filling:: 
* Use the turtle module namespace:: 
* Use turtle graphics in a script:: 
* Use object-oriented turtle graphics:: 

Turtle graphics reference

* Turtle methods:: 
* Methods of TurtleScreen/Screen:: 

Methods of RawTurtle/Turtle and corresponding functions

* Turtle motion:: 
* Tell Turtle’s state:: 
* Settings for measurement:: 
* Pen control: Pen control<2>. 
* Turtle state:: 
* Using events:: 
* Special Turtle methods:: 
* Compound shapes:: 

Pen control

* Drawing state:: 
* Color control:: 
* Filling:: 
* More drawing control:: 

Turtle state

* Visibility:: 
* Appearance:: 

Methods of TurtleScreen/Screen and corresponding functions

* Window control:: 
* Animation control:: 
* Using screen events:: 
* Input methods:: 
* Settings and special methods:: 
* Methods specific to Screen@comma{} not inherited from TurtleScreen: Methods specific to Screen not inherited from TurtleScreen. 

Help and configuration

* How to use help:: 
* Translation of docstrings into different languages:: 
* How to configure Screen and Turtles:: 

Development Tools

* typing — Support for type hints:: 
* pydoc — Documentation generator and online help system:: 
* Python Development Mode:: 
* doctest — Test interactive Python examples:: 
* unittest — Unit testing framework:: 
* unittest.mock — mock object library: unittest mock — mock object library. 
* unittest.mock — getting started: unittest mock — getting started. 
* test — Regression tests package for Python:: 
* test.support — Utilities for the Python test suite: test support — Utilities for the Python test suite. 
* test.support.socket_helper — Utilities for socket tests: test support socket_helper — Utilities for socket tests. 
* test.support.script_helper — Utilities for the Python execution tests: test support script_helper — Utilities for the Python execution tests. 
* test.support.bytecode_helper — Support tools for testing correct bytecode generation: test support bytecode_helper — Support tools for testing correct bytecode generation. 
* test.support.threading_helper — Utilities for threading tests: test support threading_helper — Utilities for threading tests. 
* test.support.os_helper — Utilities for os tests: test support os_helper — Utilities for os tests. 
* test.support.import_helper — Utilities for import tests: test support import_helper — Utilities for import tests. 
* test.support.warnings_helper — Utilities for warnings tests: test support warnings_helper — Utilities for warnings tests. 

typing — Support for type hints

* Specification for the Python Type System:: 
* Type aliases:: 
* NewType:: 
* Annotating callable objects:: 
* Generics:: 
* Annotating tuples:: 
* The type of class objects:: 
* Annotating generators and coroutines:: 
* User-defined generic types:: 
* The Any type:: 
* Nominal vs structural subtyping:: 
* Module contents: Module contents<4>. 
* Deprecation Timeline of Major Features:: 

Module contents

* Special typing primitives:: 
* Protocols: Protocols<4>. 
* ABCs and Protocols for working with I/O:: 
* Functions and decorators:: 
* Introspection helpers:: 
* Constant:: 
* Deprecated aliases:: 

Special typing primitives

* Special types:: 
* Special forms:: 
* Building generic types and type aliases:: 
* Other special directives:: 

Deprecated aliases

* Aliases to built-in types:: 
* Aliases to types in collections:: 
* Aliases to other concrete types:: 
* Aliases to container ABCs in collections.abc: Aliases to container ABCs in collections abc. 
* Aliases to asynchronous ABCs in collections.abc: Aliases to asynchronous ABCs in collections abc. 
* Aliases to other ABCs in collections.abc: Aliases to other ABCs in collections abc. 
* Aliases to contextlib ABCs:: 

Python Development Mode

* Effects of the Python Development Mode:: 
* ResourceWarning Example:: 
* Bad file descriptor error example:: 

doctest — Test interactive Python examples

* Simple Usage; Checking Examples in Docstrings: Simple Usage Checking Examples in Docstrings. 
* Simple Usage; Checking Examples in a Text File: Simple Usage Checking Examples in a Text File. 
* Command-line Usage:: 
* How It Works:: 
* Basic API:: 
* Unittest API:: 
* Advanced API:: 
* Debugging:: 
* Soapbox:: 

How It Works

* Which Docstrings Are Examined?:: 
* How are Docstring Examples Recognized?:: 
* What’s the Execution Context?:: 
* What About Exceptions?:: 
* Option Flags:: 
* Directives:: 
* Warnings: Warnings<2>. 

Advanced API

* DocTest Objects:: 
* Example Objects:: 
* DocTestFinder objects:: 
* DocTestParser objects:: 
* TestResults objects:: 
* DocTestRunner objects:: 
* OutputChecker objects:: 

unittest — Unit testing framework

* Basic example:: 
* Command-Line Interface: Command-Line Interface<2>. 
* Test Discovery:: 
* Organizing test code:: 
* Re-using old test code:: 
* Skipping tests and expected failures:: 
* Distinguishing test iterations using subtests:: 
* Classes and functions:: 
* Class and Module Fixtures:: 
* Signal Handling:: 

Command-Line Interface

* Command-line options: Command-line options<5>. 

Classes and functions

* Test cases:: 
* Grouping tests:: 
* Loading and running tests:: 

Loading and running tests

* load_tests Protocol:: 

Class and Module Fixtures

* setUpClass and tearDownClass:: 
* setUpModule and tearDownModule:: 

unittest.mock — mock object library

* Quick Guide:: 
* The Mock Class:: 
* The patchers:: 
* MagicMock and magic method support:: 
* Helpers:: 
* Order of precedence of side_effect@comma{} return_value and wraps: Order of precedence of side_effect return_value and wraps. 

The Mock Class

* Calling:: 
* Deleting Attributes:: 
* Mock names and the name attribute:: 
* Attaching Mocks as Attributes:: 

The patchers

* patch:: 
* patch.object: patch object. 
* patch.dict: patch dict. 
* patch.multiple: patch multiple. 
* patch methods; start and stop: patch methods start and stop. 
* patch builtins:: 
* TEST_PREFIX:: 
* Nesting Patch Decorators:: 
* Where to patch:: 
* Patching Descriptors and Proxy Objects:: 

MagicMock and magic method support

* Mocking Magic Methods:: 
* Magic Mock:: 

Helpers

* sentinel:: 
* DEFAULT:: 
* call:: 
* create_autospec:: 
* ANY:: 
* FILTER_DIR:: 
* mock_open:: 
* Autospeccing:: 
* Sealing mocks:: 

unittest.mock — getting started

* Using Mock:: 
* Patch decorators:: 
* Further examples:: 

Using Mock

* Mock patching methods:: 
* Mock for method calls on an object:: 
* Mocking classes:: 
* Naming your mocks:: 
* Tracking all calls:: 
* Setting return values and attributes:: 
* Raising exceptions with mocks:: 
* Side effect functions and iterables:: 
* Mocking asynchronous iterators:: 
* Mocking asynchronous context manager:: 
* Creating a mock from an existing object:: 
* Using side_effect to return per file content:: 

Further examples

* Mocking chained calls:: 
* Partial mocking:: 
* Mocking a generator method:: 
* Applying the same patch to every test method:: 
* Mocking unbound methods:: 
* Checking multiple calls with mock:: 
* Coping with mutable arguments:: 
* Nesting patches:: 
* Mocking a dictionary with MagicMock:: 
* Mock subclasses and their attributes:: 
* Mocking imports with patch.dict: Mocking imports with patch dict. 
* Tracking order of calls and less verbose call assertions:: 
* More complex argument matching:: 

test — Regression tests package for Python

* Writing Unit Tests for the test package:: 
* Running tests using the command-line interface:: 

Debugging and Profiling

* Audit events table:: 
* bdb — Debugger framework:: 
* faulthandler — Dump the Python traceback:: 
* pdb — The Python Debugger:: 
* The Python Profilers:: 
* timeit — Measure execution time of small code snippets:: 
* trace — Trace or track Python statement execution:: 
* tracemalloc — Trace memory allocations:: 

faulthandler — Dump the Python traceback

* Dumping the traceback:: 
* Dumping the C stack:: 
* Fault handler state:: 
* Dumping the tracebacks after a timeout:: 
* Dumping the traceback on a user signal:: 
* Issue with file descriptors:: 
* Example: Example<13>. 

Dumping the C stack

* C Stack Compatibility:: 

pdb — The Python Debugger

* Command-line interface: Command-line interface<8>. 
* Debugger commands:: 

The Python Profilers

* Introduction to the profilers:: 
* Instant User’s Manual:: 
* profile and cProfile Module Reference:: 
* The Stats Class:: 
* What Is Deterministic Profiling?:: 
* Limitations:: 
* Calibration:: 
* Using a custom timer:: 

timeit — Measure execution time of small code snippets

* Basic Examples: Basic Examples<2>. 
* Python Interface:: 
* Command-Line Interface: Command-Line Interface<3>. 
* Examples: Examples<31>. 

trace — Trace or track Python statement execution

* Command-Line Usage: Command-Line Usage<2>. 
* Programmatic Interface:: 

Command-Line Usage

* Main options:: 
* Modifiers:: 
* Filters:: 

tracemalloc — Trace memory allocations

* Examples: Examples<32>. 
* API:: 

Examples

* Display the top 10:: 
* Compute differences:: 
* Get the traceback of a memory block:: 
* Pretty top:: 

Pretty top

* Record the current and peak size of all traced memory blocks:: 

API

* Functions: Functions<11>. 
* DomainFilter:: 
* Filter:: 
* Frame:: 
* Snapshot:: 
* Statistic:: 
* StatisticDiff:: 
* Trace:: 
* Traceback:: 

Software Packaging and Distribution

* ensurepip — Bootstrapping the pip installer:: 
* venv — Creation of virtual environments:: 
* zipapp — Manage executable Python zip archives:: 

ensurepip — Bootstrapping the pip installer

* Command-line interface: Command-line interface<9>. 
* Module API:: 

venv — Creation of virtual environments

* Creating virtual environments:: 
* How venvs work:: 
* API: API<2>. 
* An example of extending EnvBuilder:: 

zipapp — Manage executable Python zip archives

* Basic Example:: 
* Command-Line Interface: Command-Line Interface<4>. 
* Python API:: 
* Examples: Examples<33>. 
* Specifying the Interpreter:: 
* Creating Standalone Applications with zipapp:: 
* The Python Zip Application Archive Format:: 

Creating Standalone Applications with zipapp

* Caveats:: 

Python Runtime Services

* sys — System-specific parameters and functions:: 
* sys.monitoring — Execution event monitoring: sys monitoring — Execution event monitoring. 
* sysconfig — Provide access to Python’s configuration information:: 
* builtins — Built-in objects:: 
* __main__ — Top-level code environment:: 
* warnings — Warning control:: 
* dataclasses — Data Classes:: 
* contextlib — Utilities for with-statement contexts:: 
* abc — Abstract Base Classes:: 
* atexit — Exit handlers:: 
* traceback — Print or retrieve a stack traceback:: 
* __future__ — Future statement definitions:: 
* gc — Garbage Collector interface:: 
* inspect — Inspect live objects:: 
* annotationlib — Functionality for introspecting annotations:: 
* site — Site-specific configuration hook:: 

sys.monitoring — Execution event monitoring

* Tool identifiers:: 
* Events:: 
* Turning events on and off:: 
* Registering callback functions:: 

Tool identifiers

* Registering and using tools:: 

Events

* Local events:: 
* Deprecated event:: 
* Ancillary events:: 
* Other events:: 
* The STOP_ITERATION event:: 

Turning events on and off

* Setting events globally:: 
* Per code object events:: 
* Disabling events:: 

Registering callback functions

* Callback function arguments:: 

sysconfig — Provide access to Python’s configuration information

* Configuration variables:: 
* Installation paths:: 
* User scheme:: 
* Home scheme:: 
* Prefix scheme:: 
* Installation path functions:: 
* Other functions: Other functions<3>. 
* Command-line usage: Command-line usage<6>. 

User scheme

* posix_user:: 
* nt_user:: 
* osx_framework_user:: 

Home scheme

* posix_home:: 

Prefix scheme

* posix_prefix:: 
* nt:: 

__main__ — Top-level code environment

* __name__ == '__main__':: 
* __main__.py in Python Packages: __main__ py in Python Packages. 
* import __main__:: 

__name__ == '__main__'

* What is the “top-level code environment”?:: 
* Idiomatic Usage:: 
* Packaging Considerations:: 

__main__.py in Python Packages

* Idiomatic Usage: Idiomatic Usage<2>. 

warnings — Warning control

* Warning Categories:: 
* The Warnings Filter:: 
* Temporarily Suppressing Warnings:: 
* Testing Warnings:: 
* Updating Code For New Versions of Dependencies:: 
* Available Functions:: 
* Available Context Managers:: 
* Concurrent safety of Context Managers:: 

The Warnings Filter

* Repeated Warning Suppression Criteria:: 
* Describing Warning Filters:: 
* Default Warning Filter:: 
* Overriding the default filter:: 

dataclasses — Data Classes

* Module contents: Module contents<5>. 
* Post-init processing:: 
* Class variables:: 
* Init-only variables:: 
* Frozen instances:: 
* Inheritance: Inheritance<2>. 
* Re-ordering of keyword-only parameters in __init__(): Re-ordering of keyword-only parameters in __init__. 
* Default factory functions:: 
* Mutable default values:: 
* Descriptor-typed fields:: 

contextlib — Utilities for with-statement contexts

* Utilities:: 
* Examples and Recipes: Examples and Recipes<3>. 
* Single use@comma{} reusable and reentrant context managers: Single use reusable and reentrant context managers. 

Examples and Recipes

* Supporting a variable number of context managers:: 
* Catching exceptions from __enter__ methods:: 
* Cleaning up in an __enter__ implementation:: 
* Replacing any use of try-finally and flag variables:: 
* Using a context manager as a function decorator:: 

Single use, reusable and reentrant context managers

* Reentrant context managers:: 
* Reusable context managers:: 

atexit — Exit handlers

* atexit Example:: 

traceback — Print or retrieve a stack traceback

* Module-Level Functions: Module-Level Functions<2>. 
* TracebackException Objects:: 
* StackSummary Objects:: 
* FrameSummary Objects:: 
* Examples of Using the Module-Level Functions:: 
* Examples of Using TracebackException:: 

__future__ — Future statement definitions

* Module Contents: Module Contents<4>. 

inspect — Inspect live objects

* Types and members:: 
* Retrieving source code:: 
* Introspecting callables with the Signature object:: 
* Classes and functions: Classes and functions<2>. 
* The interpreter stack:: 
* Fetching attributes statically:: 
* Current State of Generators@comma{} Coroutines@comma{} and Asynchronous Generators: Current State of Generators Coroutines and Asynchronous Generators. 
* Code Objects Bit Flags:: 
* Buffer flags:: 
* Command-line interface: Command-line interface<10>. 

annotationlib — Functionality for introspecting annotations

* Annotation semantics:: 
* Classes: Classes<5>. 
* Functions: Functions<12>. 
* Recipes: Recipes<3>. 
* Limitations of the STRING format:: 
* Limitations of the FORWARDREF format:: 
* Security implications of introspecting annotations:: 

Recipes

* Using annotations in a metaclass:: 
* Creating a custom callable annotate function:: 

site — Site-specific configuration hook

* sitecustomize:: 
* usercustomize:: 
* Readline configuration:: 
* Module contents: Module contents<6>. 
* Command-line interface: Command-line interface<11>. 

Custom Python Interpreters

* code — Interpreter base classes:: 
* codeop — Compile Python code:: 

code — Interpreter base classes

* Interactive Interpreter Objects:: 
* Interactive Console Objects:: 

Importing Modules

* zipimport — Import modules from Zip archives:: 
* pkgutil — Package extension utility:: 
* modulefinder — Find modules used by a script:: 
* runpy — Locating and executing Python modules:: 
* importlib — The implementation of import:: 
* importlib.resources – Package resource reading@comma{} opening and access: importlib resources – Package resource reading opening and access. 
* importlib.resources.abc – Abstract base classes for resources: importlib resources abc – Abstract base classes for resources. 
* importlib.metadata – Accessing package metadata: importlib metadata – Accessing package metadata. 
* The initialization of the sys.path module search path: The initialization of the sys path module search path. 

zipimport — Import modules from Zip archives

* zipimporter Objects:: 
* Examples: Examples<34>. 

modulefinder — Find modules used by a script

* Example usage of ModuleFinder:: 

importlib — The implementation of import

* Introduction: Introduction<13>. 
* Functions: Functions<13>. 
* importlib.abc – Abstract base classes related to import: importlib abc – Abstract base classes related to import. 
* importlib.machinery – Importers and path hooks: importlib machinery – Importers and path hooks. 
* importlib.util – Utility code for importers: importlib util – Utility code for importers. 
* Examples: Examples<35>. 

Examples

* Importing programmatically:: 
* Checking if a module can be imported:: 
* Importing a source file directly:: 
* Implementing lazy imports:: 
* Setting up an importer:: 
* Approximating importlib.import_module(): Approximating importlib import_module. 

importlib.resources – Package resource reading, opening and access

* Functional API:: 

importlib.metadata – Accessing package metadata

* Overview: Overview<3>. 
* Functional API: Functional API<2>. 
* Distributions:: 
* Distribution Discovery:: 
* Implementing Custom Providers:: 

Functional API

* Entry points:: 
* Distribution metadata:: 
* Distribution versions:: 
* Distribution files:: 
* Distribution requirements:: 
* Mapping import to distribution packages:: 

Implementing Custom Providers

* Example: Example<14>. 

The initialization of the sys.path module search path

* Virtual Environments:: 
* _pth files:: 
* Embedded Python:: 

Python Language Services

* ast — Abstract syntax trees:: 
* symtable — Access to the compiler’s symbol tables:: 
* token — Constants used with Python parse trees:: 
* keyword — Testing for Python keywords:: 
* tokenize — Tokenizer for Python source:: 
* tabnanny — Detection of ambiguous indentation:: 
* pyclbr — Python module browser support:: 
* py_compile — Compile Python source files:: 
* compileall — Byte-compile Python libraries:: 
* dis — Disassembler for Python bytecode:: 
* pickletools — Tools for pickle developers:: 

ast — Abstract syntax trees

* Abstract grammar:: 
* Node classes:: 
* ast helpers:: 
* Compiler flags: Compiler flags<2>. 
* Command-line usage: Command-line usage<7>. 

Node classes

* Root nodes:: 
* Literals: Literals<3>. 
* Variables:: 
* Expressions: Expressions<2>. 
* Statements:: 
* Control flow:: 
* Pattern matching:: 
* Type annotations:: 
* Type parameters:: 
* Function and class definitions:: 
* Async and await:: 

Expressions

* Subscripting:: 
* Comprehensions:: 

Statements

* Imports:: 

symtable — Access to the compiler’s symbol tables

* Generating Symbol Tables:: 
* Examining Symbol Tables:: 
* Command-Line Usage: Command-Line Usage<3>. 

tokenize — Tokenizer for Python source

* Tokenizing Input:: 
* Command-Line Usage: Command-Line Usage<4>. 
* Examples: Examples<36>. 

pyclbr — Python module browser support

* Function Objects:: 
* Class Objects: Class Objects<2>. 

py_compile — Compile Python source files

* Command-Line Interface: Command-Line Interface<5>. 

compileall — Byte-compile Python libraries

* Command-line use:: 
* Public functions:: 

dis — Disassembler for Python bytecode

* Command-line interface: Command-line interface<12>. 
* Bytecode analysis:: 
* Analysis functions:: 
* Python Bytecode Instructions:: 
* Opcode collections:: 

pickletools — Tools for pickle developers

* Command-line usage: Command-line usage<8>. 
* Programmatic interface:: 

Command-line usage

* Command-line options: Command-line options<6>. 

MS Windows Specific Services

* msvcrt — Useful routines from the MS VC++ runtime:: 
* winreg — Windows registry access:: 
* winsound — Sound-playing interface for Windows:: 

msvcrt — Useful routines from the MS VC++ runtime

* File Operations:: 
* Console I/O:: 
* Other Functions:: 

winreg — Windows registry access

* Functions: Functions<14>. 
* Constants: Constants<11>. 
* Registry Handle Objects:: 

Constants

* HKEY_* Constants:: 
* Access Rights:: 
* Value Types:: 

Access Rights

* 64-bit Specific:: 

Unix-specific services

* shlex — Simple lexical analysis:: 
* posix — The most common POSIX system calls:: 
* pwd — The password database:: 
* grp — The group database:: 
* termios — POSIX style tty control:: 
* tty — Terminal control functions:: 
* pty — Pseudo-terminal utilities:: 
* fcntl — The fcntl and ioctl system calls:: 
* resource — Resource usage information:: 
* syslog — Unix syslog library routines:: 

shlex — Simple lexical analysis

* shlex Objects:: 
* Parsing Rules:: 
* Improved Compatibility with Shells:: 

posix — The most common POSIX system calls

* Large File Support:: 
* Notable Module Contents:: 

termios — POSIX style tty control

* Example: Example<15>. 

pty — Pseudo-terminal utilities

* Example: Example<16>. 

resource — Resource usage information

* Resource Limits:: 
* Resource Usage:: 

syslog — Unix syslog library routines

* Examples: Examples<37>. 

Examples

* Simple example:: 

Superseded Modules

* getopt — C-style parser for command line options:: 

Removed Modules

* aifc — Read and write AIFF and AIFC files:: 
* asynchat — Asynchronous socket command/response handler:: 
* asyncore — Asynchronous socket handler:: 
* audioop — Manipulate raw audio data:: 
* cgi — Common Gateway Interface support:: 
* cgitb — Traceback manager for CGI scripts:: 
* chunk — Read IFF chunked data:: 
* crypt — Function to check Unix passwords:: 
* distutils — Building and installing Python modules:: 
* imghdr — Determine the type of an image:: 
* imp — Access the import internals:: 
* mailcap — Mailcap file handling:: 
* msilib — Read and write Microsoft Installer files:: 
* nis — Interface to Sun’s NIS (Yellow Pages): nis — Interface to Sun’s NIS Yellow Pages. 
* nntplib — NNTP protocol client:: 
* ossaudiodev — Access to OSS-compatible audio devices:: 
* pipes — Interface to shell pipelines:: 
* smtpd — SMTP Server:: 
* sndhdr — Determine type of sound file:: 
* spwd — The shadow password database:: 
* sunau — Read and write Sun AU files:: 
* telnetlib — Telnet client:: 
* uu — Encode and decode uuencode files:: 
* xdrlib — Encode and decode XDR data:: 

Extending and Embedding the Python Interpreter

* Recommended third party tools:: 
* Creating extensions without third party tools:: 
* Embedding the CPython runtime in a larger application:: 

Creating extensions without third party tools

* Extending Python with C or C++:: 
* Defining Extension Types; Tutorial: Defining Extension Types Tutorial. 
* Defining Extension Types; Assorted Topics: Defining Extension Types Assorted Topics. 
* Building C and C++ Extensions:: 
* Building C and C++ Extensions on Windows:: 

Extending Python with C or C++

* A Simple Example:: 
* Intermezzo; Errors and Exceptions: Intermezzo Errors and Exceptions. 
* Back to the Example:: 
* The Module’s Method Table and Initialization Function:: 
* Compilation and Linkage:: 
* Calling Python Functions from C:: 
* Extracting Parameters in Extension Functions:: 
* Keyword Parameters for Extension Functions:: 
* Building Arbitrary Values:: 
* Reference Counts:: 
* Writing Extensions in C++:: 
* Providing a C API for an Extension Module:: 

Reference Counts

* Reference Counting in Python:: 
* Ownership Rules:: 
* Thin Ice:: 
* NULL Pointers:: 

Defining Extension Types: Tutorial

* The Basics:: 
* Adding data and methods to the Basic example:: 
* Providing finer control over data attributes:: 
* Supporting cyclic garbage collection:: 
* Subclassing other types:: 

Defining Extension Types: Assorted Topics

* Finalization and De-allocation:: 
* Object Presentation:: 
* Attribute Management:: 
* Object Comparison:: 
* Abstract Protocol Support:: 
* Weak Reference Support:: 
* More Suggestions:: 

Attribute Management

* Generic Attribute Management:: 
* Type-specific Attribute Management:: 

Building C and C++ Extensions

* Building C and C++ Extensions with setuptools:: 

Building C and C++ Extensions on Windows

* A Cookbook Approach:: 
* Differences Between Unix and Windows:: 
* Using DLLs in Practice:: 

Embedding the CPython runtime in a larger application

* Embedding Python in Another Application:: 

Embedding Python in Another Application

* Very High Level Embedding:: 
* Beyond Very High Level Embedding; An overview: Beyond Very High Level Embedding An overview. 
* Pure Embedding:: 
* Extending Embedded Python:: 
* Embedding Python in C++:: 
* Compiling and Linking under Unix-like systems:: 

Python/C API reference manual

* Introduction: Introduction<14>. 
* C API Stability:: 
* The Very High Level Layer:: 
* Reference Counting:: 
* Exception Handling:: 
* Defining extension modules:: 
* Utilities: Utilities<2>. 
* Abstract Objects Layer:: 
* Concrete Objects Layer:: 
* Interpreter initialization and finalization:: 
* Thread states and the global interpreter lock:: 
* Asynchronous notifications:: 
* Operating system thread APIs:: 
* Synchronization primitives: Synchronization primitives<2>. 
* Thread-local storage support:: 
* Multiple interpreters in a Python process:: 
* Profiling and tracing:: 
* Reference tracing:: 
* Python Initialization Configuration:: 
* Memory Management:: 
* Object Implementation Support:: 
* API and ABI Versioning:: 
* Monitoring C API:: 
* Generating Execution Events:: 

Introduction

* Language version compatibility:: 
* Coding standards:: 
* Include Files:: 
* Useful macros:: 
* Objects@comma{} Types and Reference Counts: Objects Types and Reference Counts. 
* Exceptions: Exceptions<24>. 
* Embedding Python: Embedding Python<2>. 
* Debugging Builds:: 
* Recommended third party tools: Recommended third party tools<2>. 

Useful macros

* Docstring macros:: 
* General utility macros:: 
* Declaration utilities:: 
* Outdated macros:: 

General utility macros

* Numeric utilities:: 
* Assertion utilities:: 
* Type size utilities:: 
* Macro definition utilities:: 

Objects, Types and Reference Counts

* Reference Counts: Reference Counts<2>. 
* Types: Types<2>. 

Reference Counts

* Reference Count Details:: 

C API Stability

* Unstable C API:: 
* Stable Application Binary Interface:: 
* Platform Considerations:: 
* Contents of Limited API:: 

Stable Application Binary Interface

* Limited C API:: 
* Stable ABI:: 
* Limited API Scope and Performance:: 
* Limited API Caveats:: 

The Very High Level Layer

* Available start symbols:: 
* Stack Effects:: 

Exception Handling

* Printing and clearing:: 
* Raising exceptions:: 
* Issuing warnings:: 
* Querying the error indicator:: 
* Signal Handling: Signal Handling<2>. 
* Exception Classes:: 
* Exception Objects:: 
* Unicode Exception Objects:: 
* Recursion Control:: 
* Exception and warning types:: 
* Tracebacks:: 

Exception and warning types

* Exception types:: 
* OSError aliases:: 
* Warning types:: 

Defining extension modules

* Multiple module instances:: 
* Initialization function:: 
* Multi-phase initialization:: 
* Legacy single-phase initialization:: 

Utilities

* Operating System Utilities:: 
* System Functions:: 
* Process Control:: 
* Importing Modules: Importing Modules<2>. 
* Data marshalling support:: 
* Parsing arguments and building values:: 
* String conversion and formatting:: 
* Character classification and conversion:: 
* PyHash API:: 
* Reflection:: 
* Codec registry and support functions:: 
* PyTime C API:: 
* Support for Perf Maps:: 

Parsing arguments and building values

* Parsing arguments: Parsing arguments<2>. 
* Building values:: 

Parsing arguments

* Strings and buffers:: 
* Numbers: Numbers<2>. 
* Other objects:: 
* API Functions:: 

Codec registry and support functions

* Codec lookup API:: 
* Registry API for Unicode encoding error handlers:: 
* Codec utility variables:: 

PyTime C API

* Types: Types<3>. 
* Clock Functions:: 
* Raw Clock Functions:: 
* Conversion functions:: 

Abstract Objects Layer

* Object Protocol:: 
* Call Protocol:: 
* Number Protocol:: 
* Sequence Protocol:: 
* Mapping Protocol:: 
* Iterator Protocol:: 
* Buffer Protocol:: 

Call Protocol

* The tp_call Protocol:: 
* The Vectorcall Protocol:: 
* Object Calling API:: 
* Call Support API:: 

The Vectorcall Protocol

* Recursion Control: Recursion Control<2>. 
* Vectorcall Support API:: 

Buffer Protocol

* Buffer structure:: 
* Buffer request types:: 
* Complex arrays:: 
* Buffer-related functions:: 

Buffer request types

* request-independent fields:: 
* readonly@comma{} format: readonly format. 
* shape@comma{} strides@comma{} suboffsets: shape strides suboffsets. 
* contiguity requests:: 
* compound requests:: 

Complex arrays

* NumPy-style; shape and strides: NumPy-style shape and strides. 
* PIL-style; shape@comma{} strides and suboffsets: PIL-style shape strides and suboffsets. 

Concrete Objects Layer

* Fundamental Objects:: 
* Numeric Objects:: 
* Sequence Objects:: 
* Container Objects:: 
* Function Objects: Function Objects<2>. 
* Other Objects:: 
* C API for extension modules:: 

Fundamental Objects

* Type Objects: Type Objects<2>. 
* The None Object:: 

Type Objects

* Creating Heap-Allocated Types:: 

Numeric Objects

* Integer Objects:: 
* Boolean Objects:: 
* Floating-Point Objects:: 
* Complex Number Objects:: 

Integer Objects

* Export API:: 
* PyLongWriter API:: 
* Deprecated API:: 

Floating-Point Objects

* Pack and Unpack functions:: 

Pack and Unpack functions

* Pack functions:: 
* Unpack functions:: 

Complex Number Objects

* Complex Numbers as C Structures:: 
* Complex Numbers as Python Objects:: 

Sequence Objects

* Bytes Objects: Bytes Objects<2>. 
* Byte Array Objects:: 
* Unicode Objects and Codecs:: 
* Tuple Objects:: 
* Struct Sequence Objects:: 
* List Objects:: 

Byte Array Objects

* Type check macros:: 
* Direct API functions:: 
* Macros:: 

Unicode Objects and Codecs

* Unicode Objects:: 
* Built-in Codecs:: 
* Methods and Slot Functions:: 
* PyUnicodeWriter:: 
* Deprecated API: Deprecated API<2>. 

Unicode Objects

* Unicode Type:: 
* Unicode Character Properties:: 
* Creating and accessing Unicode strings:: 
* Locale Encoding:: 
* File System Encoding:: 
* wchar_t Support:: 

Built-in Codecs

* Generic Codecs:: 
* UTF-8 Codecs:: 
* UTF-32 Codecs:: 
* UTF-16 Codecs:: 
* UTF-7 Codecs:: 
* Unicode-Escape Codecs:: 
* Raw-Unicode-Escape Codecs:: 
* Latin-1 Codecs:: 
* ASCII Codecs:: 
* Character Map Codecs:: 
* MBCS codecs for Windows:: 

Container Objects

* Dictionary Objects:: 
* Set Objects:: 

Dictionary Objects

* Dictionary View Objects:: 
* Ordered Dictionaries:: 

Set Objects

* Deprecated API: Deprecated API<3>. 

Function Objects

* Function Objects: Function Objects<3>. 
* Instance Method Objects:: 
* Method Objects: Method Objects<2>. 
* Cell Objects:: 
* Code Objects: Code Objects<2>. 
* Code Object Flags:: 
* Extra information:: 

Other Objects

* File objects:: 
* Module Objects:: 
* Module definitions:: 
* Creating extension modules dynamically:: 
* Support functions:: 
* Iterator Objects:: 
* Descriptor Objects:: 
* Slice Objects:: 
* MemoryView objects:: 
* Pickle buffer objects:: 
* Weak Reference Objects: Weak Reference Objects<2>. 
* Capsules: Capsules<2>. 
* Frame objects: Frame objects<2>. 
* Generator Objects:: 
* Coroutine Objects: Coroutine Objects<2>. 
* Context Variables Objects:: 
* Objects for Type Hinting:: 

File objects

* Soft-deprecated API:: 

Module definitions

* Module slots:: 

Support functions

* Module lookup (single-phase initialization): Module lookup single-phase initialization. 

Iterator Objects

* Range Objects:: 
* Builtin Iterator Types:: 
* Other Iterator Objects:: 

Descriptor Objects

* Built-in descriptors:: 

Slice Objects

* Ellipsis Object:: 

Frame objects

* Frame locals proxies:: 
* Legacy local variable APIs:: 
* Internal frames:: 

Generator Objects

* Asynchronous Generator Objects:: 
* Deprecated API: Deprecated API<4>. 

C API for extension modules

* Curses C API:: 
* Internal data:: 
* DateTime Objects: DateTime Objects<2>. 
* Internal data: Internal data<2>. 

Interpreter initialization and finalization

* Before Python initialization:: 
* Global configuration variables:: 
* Initializing and finalizing the interpreter:: 
* Cautions regarding runtime finalization:: 
* Process-wide parameters:: 

Thread states and the global interpreter lock

* Detaching the thread state from extension code:: 
* Non-Python created threads:: 
* Legacy API:: 
* Cautions about fork(): Cautions about fork. 
* High-level APIs:: 
* GIL-state APIs:: 
* Low-level APIs:: 

Detaching the thread state from extension code

* APIs:: 

Synchronization primitives

* Python critical section API:: 
* Legacy locking APIs:: 

Thread-local storage support

* Thread-specific storage API:: 
* Dynamic allocation:: 
* Methods: Methods<2>. 
* Legacy APIs:: 

Multiple interpreters in a Python process

* A per-interpreter GIL:: 
* Bugs and caveats:: 
* High-level APIs: High-level APIs<2>. 
* Low-level APIs: Low-level APIs<2>. 
* Advanced debugger support:: 

Python Initialization Configuration

* PyInitConfig C API:: 
* Configuration Options:: 
* Runtime Python configuration API:: 
* PyConfig C API:: 
* Py_GetArgcArgv(): Py_GetArgcArgv. 
* Delaying main module execution:: 

PyInitConfig C API

* Example: Example<17>. 
* Create Config:: 
* Error Handling: Error Handling<2>. 
* Get Options:: 
* Set Options:: 
* Module:: 
* Initialize Python:: 

PyConfig C API

* Example: Example<18>. 
* PyWideStringList:: 
* PyStatus:: 
* PyPreConfig:: 
* Preinitialize Python with PyPreConfig:: 
* PyConfig:: 
* Initialization with PyConfig:: 
* Isolated Configuration:: 
* Python Configuration:: 
* Python Path Configuration:: 

Memory Management

* Overview: Overview<4>. 
* Allocator Domains:: 
* Raw Memory Interface:: 
* Memory Interface:: 
* Object allocators:: 
* Default Memory Allocators:: 
* Customize Memory Allocators:: 
* Debug hooks on the Python memory allocators:: 
* The pymalloc allocator:: 
* The mimalloc allocator:: 
* tracemalloc C API:: 
* Examples: Examples<38>. 

Memory Interface

* Deprecated aliases: Deprecated aliases<2>. 

The pymalloc allocator

* Customize pymalloc Arena Allocator:: 

Object Implementation Support

* Allocating objects on the heap:: 
* Object Life Cycle:: 
* Common Object Structures:: 
* Type Object Structures:: 
* Supporting Cyclic Garbage Collection:: 

Allocating objects on the heap

* Soft-deprecated aliases:: 

Object Life Cycle

* Life Events:: 
* Cyclic Isolate Destruction:: 
* Functions: Functions<15>. 

Common Object Structures

* Base object types and macros:: 
* Implementing functions and methods:: 
* Accessing attributes of extension types:: 

Accessing attributes of extension types

* Member flags:: 
* Member types:: 
* Defining Getters and Setters:: 

Type Object Structures

* Quick Reference:: 
* PyTypeObject Definition:: 
* PyObject Slots:: 
* PyVarObject Slots:: 
* PyTypeObject Slots:: 
* Static Types:: 
* Heap Types:: 
* Number Object Structures:: 
* Mapping Object Structures:: 
* Sequence Object Structures:: 
* Buffer Object Structures:: 
* Async Object Structures:: 
* Slot Type typedefs:: 
* Examples: Examples<39>. 

Quick Reference

* “tp slots”:: 
* sub-slots:: 
* slot typedefs:: 

Supporting Cyclic Garbage Collection

* Controlling the Garbage Collector State:: 
* Querying Garbage Collector State:: 

API and ABI Versioning

* Build-time version constants:: 
* Run-time version:: 
* Bit-packing macros:: 

Generating Execution Events

* Managing the Monitoring State:: 

Installing Python modules

* Key terms:: 
* Basic usage: Basic usage<2>. 
* How do I …?:: 
* Common installation issues:: 

How do I …?

* … install packages just for the current user?:: 
* … install scientific Python packages?:: 
* … work with multiple versions of Python installed in parallel?:: 

Common installation issues

* Installing into the system Python on Linux:: 
* Pip not installed:: 
* Installing binary extensions:: 

Python HOWTOs

* A Conceptual Overview of asyncio:: 
* Porting Extension Modules to Python 3:: 
* Curses Programming with Python:: 
* Descriptor Guide:: 
* Debugging C API extensions and CPython Internals with GDB:: 
* Enum HOWTO:: 
* Functional Programming HOWTO:: 
* Logging HOWTO:: 
* Logging Cookbook:: 
* Regular expression HOWTO:: 
* Socket Programming HOWTO:: 
* Sorting Techniques:: 
* Unicode HOWTO:: 
* HOWTO Fetch Internet Resources Using The urllib Package:: 
* An introduction to the ipaddress module:: 
* Instrumenting CPython with DTrace and SystemTap:: 
* Python support for the Linux perf profiler:: 
* Annotations Best Practices:: 
* Isolating Extension Modules:: 
* timer file descriptor HOWTO:: 
* The Python 2.3 Method Resolution Order: The Python 2 3 Method Resolution Order. 
* Python support for free threading:: 
* C API Extension Support for Free Threading:: 
* Remote debugging attachment protocol:: 
* Permission requirements:: 
* Locating the PyRuntime structure:: 
* Reading _Py_DebugOffsets:: 
* Locating the interpreter and thread state:: 
* Writing control information:: 
* Summary:: 
* Security and threat model:: 

A Conceptual Overview of asyncio

* A conceptual overview part 1; the high-level: A conceptual overview part 1 the high-level. 
* A conceptual overview part 2; the nuts and bolts: A conceptual overview part 2 the nuts and bolts. 

A conceptual overview part 1: the high-level

* Event Loop:: 
* Asynchronous functions and coroutines:: 
* Tasks: Tasks<2>. 
* await:: 

A conceptual overview part 2: the nuts and bolts

* The inner workings of coroutines:: 
* Futures: Futures<2>. 
* A homemade asyncio.sleep: A homemade asyncio sleep. 

Curses Programming with Python

* What is curses?:: 
* Starting and ending a curses application:: 
* Windows and Pads:: 
* Displaying Text:: 
* User Input:: 
* For More Information:: 

What is curses?

* The Python curses module:: 

Displaying Text

* Attributes and Color:: 

Descriptor Guide

* Primer:: 
* Complete Practical Example:: 
* Technical Tutorial:: 
* Pure Python Equivalents:: 

Primer

* Simple example; A descriptor that returns a constant: Simple example A descriptor that returns a constant. 
* Dynamic lookups:: 
* Managed attributes:: 
* Customized names:: 
* Closing thoughts:: 

Complete Practical Example

* Validator class:: 
* Custom validators:: 
* Practical application:: 

Technical Tutorial

* Abstract:: 
* Definition and introduction:: 
* Descriptor protocol:: 
* Overview of descriptor invocation:: 
* Invocation from an instance:: 
* Invocation from a class:: 
* Invocation from super:: 
* Summary of invocation logic:: 
* Automatic name notification:: 
* ORM example:: 

Pure Python Equivalents

* Properties:: 
* Functions and methods:: 
* Kinds of methods:: 
* Static methods:: 
* Class methods:: 
* Member objects and __slots__:: 

Debugging C API extensions and CPython Internals with GDB

* Prerequisites:: 
* Using the Debug build and Development mode:: 
* Using the python-gdb extension:: 
* Use with GDB commands:: 

Prerequisites

* Setup with Python built from source:: 
* Setup for Python from a Linux distro:: 

Using the python-gdb extension

* Pretty-printers:: 
* py-list:: 
* py-up and py-down:: 
* py-bt:: 
* py-print:: 
* py-locals:: 

Enum HOWTO

* Programmatic access to enumeration members and their attributes:: 
* Duplicating enum members and values:: 
* Ensuring unique enumeration values:: 
* Using automatic values:: 
* Iteration: Iteration<2>. 
* Comparisons: Comparisons<3>. 
* Allowed members and attributes of enumerations:: 
* Restricted Enum subclassing:: 
* Dataclass support:: 
* Pickling:: 
* Functional API: Functional API<3>. 
* Derived Enumerations:: 
* When to use __new__() vs. __init__(): When to use __new__ vs __init__. 
* Finer Points:: 
* How are Enums and Flags different?:: 
* Enum Cookbook:: 
* Subclassing EnumType:: 

Derived Enumerations

* IntEnum:: 
* StrEnum:: 
* IntFlag:: 
* Flag:: 
* Others: Others<2>. 

Finer Points

* Supported __dunder__ and _sunder_ names:: 
* _Private__names:: 
* Enum member type:: 
* Creating members that are mixed with other data types:: 
* Boolean value of Enum classes and members:: 
* Enum classes with methods:: 
* Combining members of Flag:: 
* Flag and IntFlag minutia:: 

How are Enums and Flags different?

* Enum Classes:: 
* Flag Classes:: 
* Enum Members (aka instances): Enum Members aka instances. 
* Flag Members:: 

Enum Cookbook

* Omitting values:: 
* OrderedEnum:: 
* DuplicateFreeEnum:: 
* MultiValueEnum:: 
* Planet:: 
* TimePeriod:: 

Omitting values

* Using auto:: 
* Using object:: 
* Using a descriptive string:: 
* Using a custom __new__(): Using a custom __new__. 

Functional Programming HOWTO

* Introduction: Introduction<15>. 
* Iterators: Iterators<2>. 
* Generator expressions and list comprehensions:: 
* Generators: Generators<2>. 
* Built-in functions: Built-in functions<2>. 
* The itertools module:: 
* The functools module:: 
* Small functions and the lambda expression:: 
* Revision History and Acknowledgements:: 
* References: References<2>. 

Introduction

* Formal provability:: 
* Modularity:: 
* Ease of debugging and testing:: 
* Composability:: 

Iterators

* Data Types That Support Iterators:: 

Generators

* Passing values into a generator:: 

The itertools module

* Creating new iterators:: 
* Calling functions on elements:: 
* Selecting elements:: 
* Combinatoric functions:: 
* Grouping elements:: 

The functools module

* The operator module:: 

References

* General:: 
* Python-specific:: 
* Python documentation:: 

Logging HOWTO

* Basic Logging Tutorial:: 
* Advanced Logging Tutorial:: 
* Logging Levels: Logging Levels<2>. 
* Useful Handlers:: 
* Exceptions raised during logging:: 
* Using arbitrary objects as messages:: 
* Optimization:: 
* Other resources:: 

Basic Logging Tutorial

* When to use logging:: 
* A simple example:: 
* Logging to a file:: 
* Logging variable data:: 
* Changing the format of displayed messages:: 
* Displaying the date/time in messages:: 
* Next Steps:: 

Advanced Logging Tutorial

* Logging Flow:: 
* Loggers:: 
* Handlers:: 
* Formatters:: 
* Configuring Logging:: 
* What happens if no configuration is provided:: 
* Configuring Logging for a Library:: 

Logging Levels

* Custom Levels:: 

Logging Cookbook

* Using logging in multiple modules:: 
* Logging from multiple threads:: 
* Multiple handlers and formatters:: 
* Logging to multiple destinations:: 
* Custom handling of levels:: 
* Configuration server example:: 
* Dealing with handlers that block:: 
* Sending and receiving logging events across a network:: 
* Adding contextual information to your logging output:: 
* Use of contextvars:: 
* Imparting contextual information in handlers:: 
* Logging to a single file from multiple processes:: 
* Using file rotation:: 
* Use of alternative formatting styles:: 
* Customizing LogRecord:: 
* Subclassing QueueHandler and QueueListener- a ZeroMQ example:: 
* Subclassing QueueHandler and QueueListener- a pynng example:: 
* An example dictionary-based configuration:: 
* Using a rotator and namer to customize log rotation processing:: 
* A more elaborate multiprocessing example:: 
* Inserting a BOM into messages sent to a SysLogHandler:: 
* Implementing structured logging:: 
* Customizing handlers with dictConfig(): Customizing handlers with dictConfig. 
* Using particular formatting styles throughout your application:: 
* Configuring filters with dictConfig(): Configuring filters with dictConfig. 
* Customized exception formatting:: 
* Speaking logging messages:: 
* Buffering logging messages and outputting them conditionally:: 
* Sending logging messages to email@comma{} with buffering: Sending logging messages to email with buffering. 
* Formatting times using UTC (GMT) via configuration: Formatting times using UTC GMT via configuration. 
* Using a context manager for selective logging:: 
* A CLI application starter template:: 
* A Qt GUI for logging:: 
* Logging to syslog with RFC5424 support:: 
* How to treat a logger like an output stream:: 
* How to uniformly handle newlines in logging output:: 
* Patterns to avoid:: 
* Other resources: Other resources<2>. 

Sending and receiving logging events across a network

* Running a logging socket listener in production:: 

Adding contextual information to your logging output

* Using LoggerAdapters to impart contextual information:: 
* Using Filters to impart contextual information:: 

Using LoggerAdapters to impart contextual information

* Using objects other than dicts to pass contextual information:: 

Logging to a single file from multiple processes

* Using concurrent.futures.ProcessPoolExecutor: Using concurrent futures ProcessPoolExecutor. 
* Deploying web applications using Gunicorn and uWSGI:: 

Subclassing QueueHandler and QueueListener- a ZeroMQ example

* Subclass QueueHandler:: 
* Subclass QueueListener:: 

Subclassing QueueHandler and QueueListener- a pynng example

* Subclass QueueListener: Subclass QueueListener<2>. 
* Subclass QueueHandler: Subclass QueueHandler<2>. 

Using particular formatting styles throughout your application

* Using LogRecord factories:: 
* Using custom message objects:: 

Patterns to avoid

* Opening the same log file multiple times:: 
* Using loggers as attributes in a class or passing them as parameters:: 
* Adding handlers other than NullHandler to a logger in a library:: 
* Creating a lot of loggers:: 

Regular expression HOWTO

* Introduction: Introduction<16>. 
* Simple patterns:: 
* Using regular expressions:: 
* More pattern power:: 
* Modifying strings:: 
* Common problems:: 
* Feedback:: 

Simple patterns

* Matching characters:: 
* Repeating things:: 

Using regular expressions

* Compiling regular expressions:: 
* The backslash plague:: 
* Performing matches:: 
* Module-level functions: Module-level functions<2>. 
* Compilation flags:: 

More pattern power

* More metacharacters:: 
* Grouping:: 
* Non-capturing and named groups:: 
* Lookahead assertions:: 

Modifying strings

* Splitting strings:: 
* Search and replace:: 

Common problems

* Use string methods:: 
* match() versus search(): match versus search. 
* Greedy versus non-greedy:: 
* Using re.VERBOSE: Using re VERBOSE. 

Socket Programming HOWTO

* Sockets:: 
* Creating a Socket:: 
* Using a Socket:: 
* Disconnecting:: 
* Non-blocking Sockets:: 

Sockets

* History:: 

Creating a Socket

* IPC:: 

Using a Socket

* Binary Data:: 

Disconnecting

* When Sockets Die:: 

Sorting Techniques

* Sorting Basics:: 
* Key Functions:: 
* Operator Module Functions and Partial Function Evaluation:: 
* Ascending and Descending:: 
* Sort Stability and Complex Sorts:: 
* Decorate-Sort-Undecorate:: 
* Comparison Functions:: 
* Strategies For Unorderable Types and Values:: 
* Odds and Ends: Odds and Ends<2>. 
* Partial Sorts:: 

Unicode HOWTO

* Introduction to Unicode:: 
* Python’s Unicode Support:: 
* Reading and Writing Unicode Data:: 
* Acknowledgements: Acknowledgements<10>. 

Introduction to Unicode

* Definitions:: 
* Encodings:: 
* References: References<3>. 

Python’s Unicode Support

* The String Type:: 
* Converting to Bytes:: 
* Unicode Literals in Python Source Code:: 
* Unicode Properties:: 
* Comparing Strings:: 
* Unicode Regular Expressions:: 
* References: References<4>. 

Reading and Writing Unicode Data

* Unicode filenames:: 
* Tips for Writing Unicode-aware Programs:: 
* References: References<5>. 

Tips for Writing Unicode-aware Programs

* Converting Between File Encodings:: 
* Files in an Unknown Encoding:: 

HOWTO Fetch Internet Resources Using The urllib Package

* Introduction: Introduction<17>. 
* Fetching URLs:: 
* Handling Exceptions: Handling Exceptions<2>. 
* info and geturl:: 
* Openers and Handlers:: 
* Basic Authentication:: 
* Proxies:: 
* Sockets and Layers:: 
* Footnotes:: 

Fetching URLs

* Data:: 
* Headers:: 

Handling Exceptions

* URLError:: 
* HTTPError:: 
* Wrapping it Up:: 

HTTPError

* Error Codes:: 

Wrapping it Up

* Number 1:: 
* Number 2:: 

An introduction to the ipaddress module

* Creating Address/Network/Interface objects:: 
* Inspecting Address/Network/Interface Objects:: 
* Networks as lists of Addresses:: 
* Comparisons: Comparisons<4>. 
* Using IP Addresses with other modules:: 
* Getting more detail when instance creation fails:: 

Creating Address/Network/Interface objects

* A Note on IP Versions:: 
* IP Host Addresses:: 
* Defining Networks:: 
* Host Interfaces:: 

Instrumenting CPython with DTrace and SystemTap

* Enabling the static markers:: 
* Static DTrace probes:: 
* Static SystemTap markers:: 
* Available static markers:: 
* SystemTap Tapsets:: 
* Examples: Examples<40>. 

Available static markers

* C Entry Points:: 
* C Probing Checks:: 

Python support for the Linux perf profiler

* How to enable perf profiling support:: 
* How to obtain the best results:: 
* How to work without frame pointers:: 

Annotations Best Practices

* Accessing The Annotations Dict Of An Object In Python 3.10 And Newer: Accessing The Annotations Dict Of An Object In Python 3 10 And Newer. 
* Accessing The Annotations Dict Of An Object In Python 3.9 And Older: Accessing The Annotations Dict Of An Object In Python 3 9 And Older. 
* Manually Un-Stringizing Stringized Annotations:: 
* Best Practices For __annotations__ In Any Python Version:: 
* __annotations__ Quirks:: 

Isolating Extension Modules

* Who should read this:: 
* Background: Background<2>. 
* Making Modules Safe with Multiple Interpreters:: 
* Heap Types: Heap Types<2>. 
* Open Issues:: 

Background

* Enter Per-Module State:: 
* Isolated Module Objects:: 
* Surprising Edge Cases:: 

Making Modules Safe with Multiple Interpreters

* Managing Global State:: 
* Managing Per-Module State:: 
* Opt-Out; Limiting to One Module Object per Process: Opt-Out Limiting to One Module Object per Process. 
* Module State Access from Functions:: 

Heap Types

* Changing Static Types to Heap Types:: 
* Defining Heap Types:: 
* Garbage-Collection Protocol:: 
* Module State Access from Classes:: 
* Module State Access from Regular Methods:: 
* Module State Access from Slot Methods@comma{} Getters and Setters: Module State Access from Slot Methods Getters and Setters. 
* Lifetime of the Module State:: 

Garbage-Collection Protocol

* tp_traverse in Python 3.8 and lower: tp_traverse in Python 3 8 and lower. 
* Delegating tp_traverse:: 
* Defining tp_dealloc:: 
* Not overriding tp_free:: 
* Avoiding PyObject_New:: 

Open Issues

* Per-Class Scope:: 
* Lossless Conversion to Heap Types:: 

timer file descriptor HOWTO

* Examples: Examples<41>. 

The Python 2.3 Method Resolution Order

* The beginning:: 
* The C3 Method Resolution Order:: 
* Examples: Examples<42>. 
* Bad Method Resolution Orders:: 
* The end:: 
* Resources:: 

Python support for free threading

* Installation: Installation<2>. 
* Identifying free-threaded Python:: 
* The global interpreter lock in free-threaded Python:: 
* Thread safety:: 
* Known limitations:: 
* Behavioral changes:: 

Known limitations

* Immortalization:: 
* Frame objects: Frame objects<3>. 
* Iterators: Iterators<3>. 
* Single-threaded performance:: 

Behavioral changes

* Context variables:: 
* Warning filters:: 
* Increased memory usage:: 

Increased memory usage

* All interned strings are immortal:: 
* Non-GC objects have a larger object header:: 
* QSBR can delay freeing of memory:: 
* mimalloc allocator vs pymalloc:: 
* Free-threaded reference counting can cause objects to live longer:: 
* Per-thread reference counting can delay freeing objects:: 

C API Extension Support for Free Threading

* Identifying the Free-Threaded Build in C:: 
* Module Initialization:: 
* General API Guidelines:: 
* Borrowed References:: 
* Memory Allocation APIs:: 
* Thread State and GIL APIs:: 
* Protecting Internal Extension State:: 
* Critical Sections:: 
* Building Extensions for the Free-Threaded Build:: 

Module Initialization

* Multi-Phase Initialization:: 
* Single-Phase Initialization:: 

General API Guidelines

* Container Thread Safety:: 

Container Thread Safety

* PyDict_Next:: 

Critical Sections

* What Are Critical Sections?:: 
* Using Critical Sections:: 
* How Critical Sections Work:: 
* Deadlock Avoidance:: 
* Important Considerations:: 

Building Extensions for the Free-Threaded Build

* Limited C API and Stable ABI:: 
* Windows: Windows<87>. 

Remote debugging attachment protocol

* Disabling remote debugging:: 

Security and threat model

* When to use PYTHON_DISABLE_REMOTE_DEBUG:: 

Python Frequently Asked Questions

* General Python FAQ:: 
* Programming FAQ:: 
* Design and History FAQ:: 
* Library and Extension FAQ:: 
* Extending/Embedding FAQ:: 
* Python on Windows FAQ:: 
* Graphic User Interface FAQ:: 
* “Why is Python Installed on my Computer?” FAQ:: 

General Python FAQ

* General Information:: 
* Python in the real world:: 

General Information

* What is Python?:: 
* What is the Python Software Foundation?:: 
* Are there copyright restrictions on the use of Python?:: 
* Why was Python created in the first place?:: 
* What is Python good for?:: 
* How does the Python version numbering scheme work?:: 
* How do I obtain a copy of the Python source?:: 
* How do I get documentation on Python?:: 
* I’ve never programmed before. Is there a Python tutorial?: I’ve never programmed before Is there a Python tutorial?. 
* Is there a newsgroup or mailing list devoted to Python?:: 
* How do I get a beta test version of Python?:: 
* How do I submit bug reports and patches for Python?:: 
* Are there any published articles about Python that I can reference?:: 
* Are there any books on Python?:: 
* Where in the world is www.python.org located?: Where in the world is www python org located?. 
* Why is it called Python?:: 
* Do I have to like “Monty Python’s Flying Circus”?:: 

Python in the real world

* How stable is Python?:: 
* How many people are using Python?:: 
* Have any significant projects been done in Python?:: 
* What new developments are expected for Python in the future?:: 
* Is it reasonable to propose incompatible changes to Python?:: 
* Is Python a good language for beginning programmers?:: 

Programming FAQ

* General questions:: 
* Core language:: 
* Numbers and strings:: 
* Performance: Performance<4>. 
* Sequences (tuples/lists): Sequences tuples/lists. 
* Objects:: 
* Modules: Modules<5>. 

General questions

* Is there a source code-level debugger with breakpoints and single-stepping?:: 
* Are there tools to help find bugs or perform static analysis?:: 
* How can I create a stand-alone binary from a Python script?:: 
* Are there coding standards or a style guide for Python programs?:: 

Core language

* Why am I getting an UnboundLocalError when the variable has a value?:: 
* What are the rules for local and global variables in Python?:: 
* Why do lambdas defined in a loop with different values all return the same result?:: 
* How do I share global variables across modules?:: 
* What are the “best practices” for using import in a module?:: 
* Why are default values shared between objects?:: 
* How can I pass optional or keyword parameters from one function to another?:: 
* What is the difference between arguments and parameters?:: 
* Why did changing list ‘y’ also change list ‘x’?:: 
* How do I write a function with output parameters (call by reference)?: How do I write a function with output parameters call by reference ?. 
* How do you make a higher order function in Python?:: 
* How do I copy an object in Python?:: 
* How can I find the methods or attributes of an object?:: 
* How can my code discover the name of an object?:: 
* What’s up with the comma operator’s precedence?:: 
* Is there an equivalent of C’s “?;” ternary operator?: Is there an equivalent of C’s “? ” ternary operator?. 
* Is it possible to write obfuscated one-liners in Python?:: 
* What does the slash(/) in the parameter list of a function mean?: What does the slash / in the parameter list of a function mean?. 

Numbers and strings

* How do I specify hexadecimal and octal integers?:: 
* Why does -22 // 10 return -3?:: 
* How do I get int literal attribute instead of SyntaxError?:: 
* How do I convert a string to a number?:: 
* How do I convert a number to a string?:: 
* How do I modify a string in place?:: 
* How do I use strings to call functions/methods?:: 
* Is there an equivalent to Perl’s chomp() for removing trailing newlines from strings?: Is there an equivalent to Perl’s chomp for removing trailing newlines from strings?. 
* Is there a scanf() or sscanf() equivalent?: Is there a scanf or sscanf equivalent?. 
* What does UnicodeDecodeError or UnicodeEncodeError error mean?:: 
* Can I end a raw string with an odd number of backslashes?:: 

Performance

* My program is too slow. How do I speed it up?: My program is too slow How do I speed it up?. 
* What is the most efficient way to concatenate many strings together?:: 

Sequences (tuples/lists)

* How do I convert between tuples and lists?:: 
* What’s a negative index?:: 
* How do I iterate over a sequence in reverse order?:: 
* How do you remove duplicates from a list?:: 
* How do you remove multiple items from a list?:: 
* How do you make an array in Python?:: 
* How do I create a multidimensional list?:: 
* How do I apply a method or function to a sequence of objects?:: 
* Why does a_tuple[i] += [‘item’] raise an exception when the addition works?:: 
* I want to do a complicated sort; can you do a Schwartzian Transform in Python?: I want to do a complicated sort can you do a Schwartzian Transform in Python?. 
* How can I sort one list by values from another list?:: 

Objects

* What is a class?:: 
* What is a method?:: 
* What is self?:: 
* How do I check if an object is an instance of a given class or of a subclass of it?:: 
* What is delegation?:: 
* How do I call a method defined in a base class from a derived class that extends it?:: 
* How can I organize my code to make it easier to change the base class?:: 
* How do I create static class data and static class methods?:: 
* How can I overload constructors (or methods) in Python?: How can I overload constructors or methods in Python?. 
* I try to use __spam and I get an error about _SomeClassName__spam.: I try to use __spam and I get an error about _SomeClassName__spam. 
* My class defines __del__ but it is not called when I delete the object.: My class defines __del__ but it is not called when I delete the object. 
* How do I get a list of all instances of a given class?:: 
* Why does the result of id() appear to be not unique?: Why does the result of id appear to be not unique?. 
* When can I rely on identity tests with the is operator?:: 
* How can a subclass control what data is stored in an immutable instance?:: 
* How do I cache method calls?:: 

Modules

* How do I create a .pyc file?: How do I create a pyc file?. 
* How do I find the current module name?:: 
* How can I have modules that mutually import each other?:: 
* __import__(‘x.y.z’) returns <module ‘x’>; how do I get z?: __import__ ‘x y z’ returns <module ‘x’>; how do I get z?. 
* When I edit an imported module and reimport it@comma{} the changes don’t show up. Why does this happen?: When I edit an imported module and reimport it the changes don’t show up Why does this happen?. 

Design and History FAQ

* Why does Python use indentation for grouping of statements?:: 
* Why am I getting strange results with simple arithmetic operations?:: 
* Why are floating-point calculations so inaccurate?:: 
* Why are Python strings immutable?:: 
* Why must ‘self’ be used explicitly in method definitions and calls?:: 
* Why can’t I use an assignment in an expression?:: 
* Why does Python use methods for some functionality (e.g. list.index()) but functions for other (e.g. len(list))?: Why does Python use methods for some functionality e g list index but functions for other e g len list ?. 
* Why is join() a string method instead of a list or tuple method?: Why is join a string method instead of a list or tuple method?. 
* How fast are exceptions?:: 
* Why isn’t there a switch or case statement in Python?:: 
* Can’t you emulate threads in the interpreter instead of relying on an OS-specific thread implementation?:: 
* Why can’t lambda expressions contain statements?:: 
* Can Python be compiled to machine code@comma{} C or some other language?: Can Python be compiled to machine code C or some other language?. 
* How does Python manage memory?:: 
* Why doesn’t CPython use a more traditional garbage collection scheme?:: 
* Why isn’t all memory freed when CPython exits?:: 
* Why are there separate tuple and list data types?:: 
* How are lists implemented in CPython?:: 
* How are dictionaries implemented in CPython?:: 
* Why must dictionary keys be immutable?:: 
* Why doesn’t list.sort() return the sorted list?: Why doesn’t list sort return the sorted list?. 
* How do you specify and enforce an interface spec in Python?:: 
* Why is there no goto?:: 
* Why can’t raw strings (r-strings) end with a backslash?: Why can’t raw strings r-strings end with a backslash?. 
* Why doesn’t Python have a “with” statement for attribute assignments?:: 
* Why don’t generators support the with statement?:: 
* Why are colons required for the if/while/def/class statements?:: 
* Why does Python allow commas at the end of lists and tuples?:: 

Library and Extension FAQ

* General Library Questions:: 
* Common tasks:: 
* Threads:: 
* Input and Output: Input and Output<2>. 
* Network/Internet Programming:: 
* Databases:: 
* Mathematics and Numerics:: 

General Library Questions

* How do I find a module or application to perform task X?:: 
* Where is the math.py (socket.py@comma{} regex.py@comma{} etc.) source file?: Where is the math py socket py regex py etc source file?. 
* How do I make a Python script executable on Unix?:: 
* Is there a curses/termcap package for Python?:: 
* Is there an equivalent to C’s onexit() in Python?: Is there an equivalent to C’s onexit in Python?. 
* Why don’t my signal handlers work?:: 

Common tasks

* How do I test a Python program or component?:: 
* How do I create documentation from doc strings?:: 
* How do I get a single keypress at a time?:: 

Threads

* How do I program using threads?:: 
* None of my threads seem to run; why?: None of my threads seem to run why?. 
* How do I parcel out work among a bunch of worker threads?:: 
* What kinds of global value mutation are thread-safe?:: 
* Can’t we get rid of the Global Interpreter Lock?:: 

Input and Output

* How do I delete a file? (And other file questions…): How do I delete a file? And other file questions…. 
* How do I copy a file?:: 
* How do I read (or write) binary data?: How do I read or write binary data?. 
* I can’t seem to use os.read() on a pipe created with os.popen(); why?: I can’t seem to use os read on a pipe created with os popen ; why?. 
* How do I access the serial (RS232) port?: How do I access the serial RS232 port?. 
* Why doesn’t closing sys.stdout (stdin@comma{} stderr) really close it?: Why doesn’t closing sys stdout stdin stderr really close it?. 

Network/Internet Programming

* What WWW tools are there for Python?:: 
* What module should I use to help with generating HTML?:: 
* How do I send mail from a Python script?:: 
* How do I avoid blocking in the connect() method of a socket?: How do I avoid blocking in the connect method of a socket?. 

Databases

* Are there any interfaces to database packages in Python?:: 
* How do you implement persistent objects in Python?:: 

Mathematics and Numerics

* How do I generate random numbers in Python?:: 

Extending/Embedding FAQ

* Can I create my own functions in C?:: 
* Can I create my own functions in C++?:: 
* Writing C is hard; are there any alternatives?:: 
* How can I execute arbitrary Python statements from C?:: 
* How can I evaluate an arbitrary Python expression from C?:: 
* How do I extract C values from a Python object?:: 
* How do I use Py_BuildValue() to create a tuple of arbitrary length?: How do I use Py_BuildValue to create a tuple of arbitrary length?. 
* How do I call an object’s method from C?:: 
* How do I catch the output from PyErr_Print() (or anything that prints to stdout/stderr)?: How do I catch the output from PyErr_Print or anything that prints to stdout/stderr ?. 
* How do I access a module written in Python from C?:: 
* How do I interface to C++ objects from Python?:: 
* I added a module using the Setup file and the make fails; why?:: 
* How do I debug an extension?:: 
* I want to compile a Python module on my Linux system@comma{} but some files are missing. Why?: I want to compile a Python module on my Linux system but some files are missing Why?. 
* How do I tell “incomplete input” from “invalid input”?:: 
* How do I find undefined g++ symbols __builtin_new or __pure_virtual?:: 
* Can I create an object class with some methods implemented in C and others in Python (e.g. through inheritance)?: Can I create an object class with some methods implemented in C and others in Python e g through inheritance ?. 

Python on Windows FAQ

* How do I run a Python program under Windows?:: 
* How do I make Python scripts executable?:: 
* Why does Python sometimes take so long to start?:: 
* How do I make an executable from a Python script?:: 
* Is a *.pyd file the same as a DLL?: Is a * pyd file the same as a DLL?. 
* How can I embed Python into a Windows application?:: 
* How do I keep editors from inserting tabs into my Python source?:: 
* How do I check for a keypress without blocking?:: 
* How do I solve the missing api-ms-win-crt-runtime-l1-1-0.dll error?: How do I solve the missing api-ms-win-crt-runtime-l1-1-0 dll error?. 

Graphic User Interface FAQ

* General GUI Questions:: 
* What GUI toolkits exist for Python?:: 
* Tkinter questions:: 

Tkinter questions

* How do I freeze Tkinter applications?:: 
* Can I have Tk events handled while waiting for I/O?:: 
* I can’t get key bindings to work in Tkinter; why?: I can’t get key bindings to work in Tkinter why?. 

“Why is Python Installed on my Computer?” FAQ

* What is Python?: What is Python?<2>. 
* Why is Python installed on my machine?:: 
* Can I delete Python?:: 

Deprecations

* Pending removal in Python 3.15: Pending removal in Python 3 15<7>. 
* Pending removal in Python 3.16: Pending removal in Python 3 16<7>. 
* Pending removal in Python 3.17: Pending removal in Python 3 17<4>. 
* Pending removal in Python 3.18: Pending removal in Python 3 18<5>. 
* Pending removal in Python 3.19: Pending removal in Python 3 19<3>. 
* Pending removal in future versions: Pending removal in future versions<7>. 
* C API deprecations:: 

C API deprecations

* Pending removal in Python 3.15: Pending removal in Python 3 15<8>. 
* Pending removal in Python 3.18: Pending removal in Python 3 18<6>. 
* Pending removal in future versions: Pending removal in future versions<8>. 

About this documentation

* Contributors to the Python documentation:: 

Dealing with Bugs

* Documentation bugs:: 
* Using the Python issue tracker:: 
* Getting started contributing to Python yourself:: 

History and License

* History of the software:: 
* Terms and conditions for accessing or otherwise using Python:: 
* Licenses and Acknowledgements for Incorporated Software:: 

Terms and conditions for accessing or otherwise using Python

* PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2:: 
* BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0: BEOPEN COM LICENSE AGREEMENT FOR PYTHON 2 0. 
* CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1: CNRI LICENSE AGREEMENT FOR PYTHON 1 6 1. 
* CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2: CWI LICENSE AGREEMENT FOR PYTHON 0 9 0 THROUGH 1 2. 
* ZERO-CLAUSE BSD LICENSE FOR CODE IN THE PYTHON DOCUMENTATION:: 

Licenses and Acknowledgements for Incorporated Software

* Mersenne Twister:: 
* Sockets: Sockets<2>. 
* Asynchronous socket services:: 
* Cookie management:: 
* Execution tracing:: 
* UUencode and UUdecode functions:: 
* XML Remote Procedure Calls:: 
* test_epoll:: 
* Select kqueue:: 
* SipHash24:: 
* strtod and dtoa:: 
* OpenSSL: OpenSSL<2>. 
* expat:: 
* libffi:: 
* zlib: zlib<4>. 
* cfuhash:: 
* libmpdec:: 
* W3C C14N test suite:: 
* mimalloc:: 
* asyncio: asyncio<15>. 
* Global Unbounded Sequences (GUS): Global Unbounded Sequences GUS. 
* Zstandard bindings:: 

@end detailmenu
@end menu

@node What’s New in Python,The Python Tutorial,Top,Top
@anchor{whatsnew/index doc}@anchor{13d}@anchor{whatsnew/index python-documentation-contents}@anchor{13e}@anchor{whatsnew/index what-s-new-in-python}@anchor{13f}@anchor{whatsnew/index whatsnew-index}@anchor{140}
@chapter What’s New in Python


The “What’s New in Python” series of essays takes tours through the most
important changes between major Python versions.  They are a “must read” for
anyone wishing to stay up-to-date after a new release.

@menu
* What’s new in Python 3.14: What’s new in Python 3 14. 
* What’s New In Python 3.13: What’s New In Python 3 13. 
* What’s New In Python 3.12: What’s New In Python 3 12. 
* What’s New In Python 3.11: What’s New In Python 3 11. 
* What’s New In Python 3.10: What’s New In Python 3 10. 
* What’s New In Python 3.9: What’s New In Python 3 9. 
* What’s New In Python 3.8: What’s New In Python 3 8. 
* What’s New In Python 3.7: What’s New In Python 3 7. 
* What’s New In Python 3.6: What’s New In Python 3 6. 
* What’s New In Python 3.5: What’s New In Python 3 5. 
* What’s New In Python 3.4: What’s New In Python 3 4. 
* What’s New In Python 3.3: What’s New In Python 3 3. 
* What’s New In Python 3.2: What’s New In Python 3 2. 
* What’s New In Python 3.1: What’s New In Python 3 1. 
* What’s New In Python 3.0: What’s New In Python 3 0. 
* What’s New in Python 2.7: What’s New in Python 2 7. 
* What’s New in Python 2.6: What’s New in Python 2 6. 
* What’s New in Python 2.5: What’s New in Python 2 5. 
* What’s New in Python 2.4: What’s New in Python 2 4. 
* What’s New in Python 2.3: What’s New in Python 2 3. 
* What’s New in Python 2.2: What’s New in Python 2 2. 
* What’s New in Python 2.1: What’s New in Python 2 1. 
* What’s New in Python 2.0: What’s New in Python 2 0. 
* Changelog:: 

@end menu

@node What’s new in Python 3 14,What’s New In Python 3 13,,What’s New in Python
@anchor{whatsnew/3 14 doc}@anchor{141}@anchor{whatsnew/3 14 what-s-new-in-python-3-14}@anchor{142}
@section What’s new in Python 3.14


@*Editors: 
Adam Turner and Hugo van Kemenade


@c Rules for maintenance:
@c 
@c * Anyone can add text to this document.  Do not spend very much time
@c on the wording of your changes, because your text will probably
@c get rewritten to some degree.
@c 
@c * The maintainer will go through Misc/NEWS periodically and add
@c changes; it's therefore more important to add your changes to
@c Misc/NEWS than to this file.
@c 
@c * This is not a complete list of every single change; completeness
@c is the purpose of Misc/NEWS.  Some changes I consider too small
@c or esoteric to include.  If such a change is added to the text,
@c I'll just remove it.  (This is another reason you shouldn't spend
@c too much time on writing your addition.)
@c 
@c * If you want to draw your new text to the attention of the
@c maintainer, add 'XXX' to the beginning of the paragraph or
@c section.
@c 
@c * It's OK to just add a fragmentary note about a change.  For
@c example: "XXX Describe the transmogrify() function added to the
@c socket module."  The maintainer will research the change and
@c write the necessary text.
@c 
@c * You can comment out your additions if you like, but it's not
@c necessary (especially when a final release is some months away).
@c 
@c * Credit the author of a patch or bugfix.   Just the name is
@c sufficient; the e-mail address isn't necessary.
@c 
@c * It's helpful to add the issue number as a comment:
@c 
@c XXX Describe the transmogrify() function added to the socket
@c module.
@c (Contributed by P.Y. Developer in :gh:`12345`.)
@c 
@c This saves the maintainer the effort of going through the VCS log
@c when researching a change.

This article explains the new features in Python 3.14, compared to 3.13.
Python 3.14 was released on 7 October 2025.
For full details, see the @ref{143,,changelog}.


@subsubheading See also


@geindex Python Enhancement Proposals; PEP 745
PEP 745@footnote{https://peps.python.org/pep-0745/} – Python 3.14 release schedule


@menu
* Summary – Release highlights:: 
* New features:: 
* Other language changes:: 
* New modules:: 
* Improved modules:: 
* Optimizations:: 
* Removed:: 
* Deprecated:: 
* CPython bytecode changes:: 
* C API changes:: 
* Build changes:: 
* Porting to Python 3.14: Porting to Python 3 14. 
* Notable changes in 3.14.1: Notable changes in 3 14 1. 
* Notable changes in 3.14.5: Notable changes in 3 14 5. 

@end menu

@node Summary – Release highlights,New features,,What’s new in Python 3 14
@anchor{whatsnew/3 14 summary-release-highlights}@anchor{144}
@subsection Summary – Release highlights


@c This section singles out the most important changes in Python 3.14.
@c Brevity is key.

Python 3.14 is the latest stable release of the Python programming
language, with a mix of changes to the language, the implementation,
and the standard library.
The biggest changes include @ref{145,,template string literals},
@ref{146,,deferred evaluation of annotations},
and support for @ref{147,,subinterpreters} in
the standard library.

The library changes include significantly improved capabilities for
@ref{148,,introspection in asyncio},
@ref{149,,support for Zstandard} via a new
@ref{23,,compression.zstd} module, syntax highlighting in the REPL,
as well as the usual deprecations and removals,
and improvements in user-friendliness and correctness.

This article doesn’t attempt to provide a complete specification
of all new features, but instead gives a convenient overview.
For full details refer to the documentation,
such as the @ref{14a,,Library Reference}
and @ref{14b,,Language Reference}.
To understand the complete implementation and design rationale for a change,
refer to the PEP for a particular new feature;
but note that PEPs usually are not kept up-to-date
once a feature has been fully implemented.
See @ref{14c,,Porting to Python 3.14} for guidance on upgrading from
earlier versions of Python.


__________________________________________________________________


@c PEP-sized items next.

Interpreter improvements:


@itemize *

@item 
@geindex Python Enhancement Proposals; PEP 649
PEP 649@footnote{https://peps.python.org/pep-0649/} and 
@geindex Python Enhancement Proposals; PEP 749
PEP 749@footnote{https://peps.python.org/pep-0749/}: @ref{146,,Deferred evaluation of annotations}

@item 
@geindex Python Enhancement Proposals; PEP 734
PEP 734@footnote{https://peps.python.org/pep-0734/}: @ref{147,,Multiple interpreters in the standard library}

@item 
@geindex Python Enhancement Proposals; PEP 750
PEP 750@footnote{https://peps.python.org/pep-0750/}: @ref{145,,Template strings}

@item 
@geindex Python Enhancement Proposals; PEP 758
PEP 758@footnote{https://peps.python.org/pep-0758/}: @ref{14d,,Allow except and except* expressions without brackets}

@item 
@geindex Python Enhancement Proposals; PEP 765
PEP 765@footnote{https://peps.python.org/pep-0765/}: @ref{14e,,Control flow in finally blocks}

@item 
@geindex Python Enhancement Proposals; PEP 768
PEP 768@footnote{https://peps.python.org/pep-0768/}: @ref{14f,,Safe external debugger interface for CPython}

@item 
@ref{150,,A new type of interpreter}

@item 
@ref{151,,Free-threaded mode improvements}

@item 
@ref{152,,Improved error messages}

@item 
@ref{153,,Incremental garbage collection}
@end itemize

Significant improvements in the standard library:


@itemize *

@item 
@geindex Python Enhancement Proposals; PEP 784
PEP 784@footnote{https://peps.python.org/pep-0784/}: @ref{149,,Zstandard support in the standard library}

@item 
@ref{148,,Asyncio introspection capabilities}

@item 
@ref{154,,Concurrent safe warnings control}

@item 
@ref{155,,Syntax highlighting in the default interactive shell}, and color output in several
standard library CLIs
@end itemize

C API improvements:


@itemize *

@item 
@geindex Python Enhancement Proposals; PEP 741
PEP 741@footnote{https://peps.python.org/pep-0741/}: @ref{156,,Python configuration C API}
@end itemize

Platform support:


@itemize *

@item 
@geindex Python Enhancement Proposals; PEP 776
PEP 776@footnote{https://peps.python.org/pep-0776/}: Emscripten is now an @ref{157,,officially supported platform}, at 
@geindex Python Enhancement Proposals; PEP 11#tier-3
tier 3@footnote{https://peps.python.org/pep-0011/#tier-3}.
@end itemize

Release changes:


@itemize *

@item 
@geindex Python Enhancement Proposals; PEP 779
PEP 779@footnote{https://peps.python.org/pep-0779/}: @ref{158,,Free-threaded Python is officially supported}

@item 
@geindex Python Enhancement Proposals; PEP 761
PEP 761@footnote{https://peps.python.org/pep-0761/}: @ref{159,,PGP signatures have been discontinued for official releases}

@item 
@ref{15a,,Windows and macOS binary releases now support the experimental just-in-time compiler}

@item 
@ref{157,,Binary releases for Android are now provided}
@end itemize

@node New features,Other language changes,Summary – Release highlights,What’s new in Python 3 14
@anchor{whatsnew/3 14 new-features}@anchor{15b}
@subsection New features


@menu
* PEP 649 & PEP 749; Deferred evaluation of annotations: PEP 649 & PEP 749 Deferred evaluation of annotations. 
* PEP 734; Multiple interpreters in the standard library: PEP 734 Multiple interpreters in the standard library. 
* PEP 750; Template string literals: PEP 750 Template string literals. 
* PEP 768; Safe external debugger interface: PEP 768 Safe external debugger interface. 
* A new type of interpreter:: 
* Free-threaded mode improvements:: 
* Improved error messages:: 
* PEP 784; Zstandard support in the standard library: PEP 784 Zstandard support in the standard library. 
* Asyncio introspection capabilities:: 
* Concurrent safe warnings control:: 

@end menu

@node PEP 649 & PEP 749 Deferred evaluation of annotations,PEP 734 Multiple interpreters in the standard library,,New features
@anchor{whatsnew/3 14 pep-649-pep-749-deferred-evaluation-of-annotations}@anchor{15c}@anchor{whatsnew/3 14 whatsnew314-deferred-annotations}@anchor{146}
@subsubsection 
@geindex Python Enhancement Proposals; PEP 649
`PEP 649' & 
@geindex Python Enhancement Proposals; PEP 749
`PEP 749': Deferred evaluation of annotations


The @ref{15d,,annotations} on functions, classes, and modules are no
longer evaluated eagerly. Instead, annotations are stored in special-purpose
@ref{15e,,annotate functions} and evaluated only when
necessary (except if @code{from __future__ import annotations} is used).

This change is designed to improve performance and usability of annotations
in Python in most circumstances. The runtime cost for defining annotations is
minimized, but it remains possible to introspect annotations at runtime.
It is no longer necessary to enclose annotations in strings if they
contain forward references.

The new @ref{6,,annotationlib} module provides tools for inspecting deferred
annotations. Annotations may be evaluated in the @ref{15f,,VALUE}
format (which evaluates annotations to runtime values, similar to the behavior in
earlier Python versions), the @ref{160,,FORWARDREF} format
(which replaces undefined names with special markers), and the
@ref{161,,STRING} format (which returns annotations as strings).

This example shows how these formats behave:

@example
>>> from annotationlib import get_annotations, Format
>>> def func(arg: Undefined):
...     pass
>>> get_annotations(func, format=Format.VALUE)
Traceback (most recent call last):
  ...
NameError: name 'Undefined' is not defined
>>> get_annotations(func, format=Format.FORWARDREF)
@{'arg': ForwardRef('Undefined', owner=<function func at 0x...>)@}
>>> get_annotations(func, format=Format.STRING)
@{'arg': 'Undefined'@}
@end example

The @ref{162,,porting} section contains guidance
on changes that may be needed due to these changes, though in the majority of
cases, code will continue working as-is.

(Contributed by Jelle Zijlstra in 
@geindex Python Enhancement Proposals; PEP 749
PEP 749@footnote{https://peps.python.org/pep-0749/} and gh-119180@footnote{https://github.com/python/cpython/issues/119180};
@geindex Python Enhancement Proposals; PEP 649
PEP 649@footnote{https://peps.python.org/pep-0649/} was written by Larry Hastings.)


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 649

@item PEP 649@footnote{https://peps.python.org/pep-0649/}

Deferred Evaluation Of Annotations Using Descriptors

@geindex Python Enhancement Proposals; PEP 749

@item PEP 749@footnote{https://peps.python.org/pep-0749/}

Implementing PEP 649
@end table


@node PEP 734 Multiple interpreters in the standard library,PEP 750 Template string literals,PEP 649 & PEP 749 Deferred evaluation of annotations,New features
@anchor{whatsnew/3 14 pep-734-multiple-interpreters-in-the-standard-library}@anchor{163}@anchor{whatsnew/3 14 whatsnew314-multiple-interpreters}@anchor{147}
@subsubsection 
@geindex Python Enhancement Proposals; PEP 734
`PEP 734': Multiple interpreters in the standard library


The CPython runtime supports running multiple copies of Python in the
same process simultaneously and has done so for over 20 years.
Each of these separate copies is called an ‘interpreter’.
However, the feature had been available only through
the @ref{164,,C-API}.

That limitation is removed in Python 3.14,
with the new @ref{25,,concurrent.interpreters} module.

There are at least two notable reasons why using multiple interpreters
has significant benefits:


@itemize *

@item 
they support a new (to Python), human-friendly concurrency model

@item 
true multi-core parallelism
@end itemize

For some use cases, concurrency in software improves efficiency and
can simplify design, at a high level.
At the same time, implementing and maintaining all but the simplest concurrency
is often a struggle for the human brain.
That especially applies to plain threads (for example, @ref{f3,,threading}),
where all memory is shared between all threads.

With multiple isolated interpreters, you can take advantage of a class
of concurrency models, like Communicating Sequential Processes (CSP)
or the actor model, that have found
success in other programming languages, like Smalltalk, Erlang,
Haskell, and Go. Think of multiple interpreters as threads
but with opt-in sharing.

Regarding multi-core parallelism: as of Python 3.12, interpreters
are now sufficiently isolated from one another to be used in parallel
(see 
@geindex Python Enhancement Proposals; PEP 684
PEP 684@footnote{https://peps.python.org/pep-0684/}). This unlocks a variety of CPU-intensive use cases
for Python that were limited by the @ref{165,,GIL}.

Using multiple interpreters is similar in many ways to
@ref{98,,multiprocessing}, in that they both provide isolated logical
“processes” that can run in parallel, with no sharing by default.
However, when using multiple interpreters, an application will use
fewer system resources and will operate more efficiently (since it
stays within the same process). Think of multiple interpreters as
having the isolation of processes with the efficiency of threads.

@c XXX Add an example or two.

@c XXX Link to the not-yet-added HOWTO doc.

While the feature has been around for decades, multiple interpreters
have not been used widely, due to low awareness and the lack of a
standard library module. Consequently, they currently have several
notable limitations, which are expected to improve significantly now
that the feature is going mainstream.

Current limitations:


@itemize *

@item 
starting each interpreter has not been optimized yet

@item 
each interpreter uses more memory than necessary
(work continues on extensive internal sharing between interpreters)

@item 
there aren’t many options `yet' for truly sharing objects or other
data between interpreters (other than @ref{166,,memoryview})

@item 
many third-party extension modules on PyPI are not yet compatible
with multiple interpreters
(all standard library extension modules `are' compatible)

@item 
the approach to writing applications that use multiple isolated
interpreters is mostly unfamiliar to Python users, for now
@end itemize

The impact of these limitations will depend on future CPython
improvements, how interpreters are used, and what the community solves
through PyPI packages. Depending on the use case, the limitations may
not have much impact, so try it out!

Furthermore, future CPython releases will reduce or eliminate overhead
and provide utilities that are less appropriate on PyPI. In the
meantime, most of the limitations can also be addressed through
extension modules, meaning PyPI packages can fill any gap for 3.14, and
even back to 3.12 where interpreters were finally properly isolated and
stopped sharing the @ref{165,,GIL}. Likewise, libraries on PyPI are expected
to emerge for high-level abstractions on top of interpreters.

Regarding extension modules, work is in progress to update some PyPI
projects, as well as tools like Cython, pybind11, nanobind, and PyO3.
The steps for isolating an extension module are found at
@ref{167,,Isolating Extension Modules}.
Isolating a module has a lot of overlap with what is required to support
@ref{151,,free-threading}, so the ongoing
work in the community in that area will help accelerate support
for multiple interpreters.

Also added in 3.14: @ref{168,,concurrent.futures.InterpreterPoolExecutor}.

(Contributed by Eric Snow in gh-134939@footnote{https://github.com/python/cpython/issues/134939}.)


@subsubheading See also


@geindex Python Enhancement Proposals; PEP 734
PEP 734@footnote{https://peps.python.org/pep-0734/}


@node PEP 750 Template string literals,PEP 768 Safe external debugger interface,PEP 734 Multiple interpreters in the standard library,New features
@anchor{whatsnew/3 14 pep-750-template-string-literals}@anchor{169}@anchor{whatsnew/3 14 whatsnew314-template-string-literals}@anchor{145}
@subsubsection 
@geindex Python Enhancement Proposals; PEP 750
`PEP 750': Template string literals


Template strings are a new mechanism for custom string processing.
They share the familiar syntax of f-strings but, unlike f-strings,
return an object representing the static and interpolated parts of
the string, instead of a simple @ref{16a,,str}.

To write a t-string, use a @code{'t'} prefix instead of an @code{'f'}:

@example
>>> variety = 'Stilton'
>>> template = t'Try some @{variety@} cheese!'
>>> type(template)
<class 'string.templatelib.Template'>
@end example

@ref{16b,,Template} objects provide access to the static
and interpolated (in curly braces) parts of a string `before' they are combined.
Iterate over @code{Template} instances to access their parts in order:

@c variety = 'Stilton'
@c template = t'Try some {variety} cheese!'

@example
>>> list(template)
['Try some ', Interpolation('Stilton', 'variety', None, '@w{'}), ' cheese!']
@end example

It’s easy to write (or call) code to process @code{Template} instances.
For example, here’s a function that renders static parts lowercase and
@ref{16c,,Interpolation} instances uppercase:

@example
from string.templatelib import Interpolation

def lower_upper(template):
    """Render static parts lowercase and interpolations uppercase."""
    parts = []
    for part in template:
        if isinstance(part, Interpolation):
            parts.append(str(part.value).upper())
        else:
            parts.append(part.lower())
    return '@w{'}.join(parts)

name = 'Wenslydale'
template = t'Mister @{name@}'
assert lower_upper(template) == 'mister WENSLYDALE'
@end example

Because @code{Template} instances distinguish between static strings and
interpolations at runtime, they can be useful for sanitising user input.
Writing a @code{html()} function that escapes user input in HTML is an exercise
left to the reader!
Template processing code can provide improved flexibility.
For instance, a more advanced @code{html()} function could accept
a @code{dict} of HTML attributes directly in the template:

@example
attributes = @{'src': 'limburger.jpg', 'alt': 'lovely cheese'@}
template = t'<img @{attributes@}>'
assert html(template) == '<img src="limburger.jpg" alt="lovely cheese" />'
@end example

Of course, template processing code does not need to return a string-like result.
An even `more' advanced @code{html()} could return a custom type representing
a DOM-like structure.

With t-strings in place, developers can write systems that sanitise SQL,
make safe shell operations, improve logging, tackle modern ideas in web
development (HTML, CSS, and so on), and implement lightweight custom business DSLs.

(Contributed by Jim Baker, Guido van Rossum, Paul Everitt, Koudai Aono,
Lysandros Nikolaou, Dave Peck, Adam Turner, Jelle Zijlstra, Bénédikt Tran,
and Pablo Galindo Salgado in gh-132661@footnote{https://github.com/python/cpython/issues/132661}.)


@subsubheading See also


@geindex Python Enhancement Proposals; PEP 750
PEP 750@footnote{https://peps.python.org/pep-0750/}.


@node PEP 768 Safe external debugger interface,A new type of interpreter,PEP 750 Template string literals,New features
@anchor{whatsnew/3 14 pep-768-safe-external-debugger-interface}@anchor{16d}@anchor{whatsnew/3 14 whatsnew314-remote-debugging}@anchor{14f}
@subsubsection 
@geindex Python Enhancement Proposals; PEP 768
`PEP 768': Safe external debugger interface


Python 3.14 introduces a zero-overhead debugging interface that allows
debuggers and profilers to safely attach to running Python processes
without stopping or restarting them.
This is a significant enhancement to Python’s debugging capabilities,
meaning that unsafe alternatives are no longer required.

The new interface provides safe execution points for attaching debugger code
without modifying the interpreter’s normal execution path
or adding any overhead at runtime.
Due to this, tools can now inspect and interact with Python applications
in real-time, which is a crucial capability for high-availability systems
and production environments.

For convenience, this interface is implemented in the @ref{16e,,sys.remote_exec()}
function. For example:

@example
import sys
from tempfile import NamedTemporaryFile

with NamedTemporaryFile(mode='w', suffix='.py', delete=False) as f:
    script_path = f.name
    f.write(f'import my_debugger; my_debugger.connect(@{os.getpid()@})')

# Execute in process with PID 1234
print('Behold! An offering:')
sys.remote_exec(1234, script_path)
@end example

This function allows sending Python code to be executed in a target process
at the next safe execution point.
However, tool authors can also implement the protocol directly as described
in the PEP, which details the underlying mechanisms used to safely attach to
running processes.

The debugging interface has been carefully designed with security in mind
and includes several mechanisms to control access:


@itemize *

@item 
A 
@geindex PYTHON_DISABLE_REMOTE_DEBUG
@geindex environment variable; PYTHON_DISABLE_REMOTE_DEBUG
@ref{16f,,PYTHON_DISABLE_REMOTE_DEBUG} environment variable.

@item 
A @ref{170,,-X disable-remote-debug} command-line option.

@item 
A @ref{171,,--without-remote-debug} configure flag to completely disable
the feature at build time.
@end itemize

(Contributed by Pablo Galindo Salgado, Matt Wozniski, and Ivona Stojanovic
in gh-131591@footnote{https://github.com/python/cpython/issues/131591}.)


@subsubheading See also


@geindex Python Enhancement Proposals; PEP 768
PEP 768@footnote{https://peps.python.org/pep-0768/}.


@node A new type of interpreter,Free-threaded mode improvements,PEP 768 Safe external debugger interface,New features
@anchor{whatsnew/3 14 a-new-type-of-interpreter}@anchor{172}@anchor{whatsnew/3 14 whatsnew314-tail-call-interpreter}@anchor{150}
@subsubsection A new type of interpreter


A new type of interpreter has been added to CPython.
It uses tail calls between small C functions that implement individual
Python opcodes, rather than one large C @code{case} statement.
For certain newer compilers, this interpreter provides
significantly better performance. Preliminary benchmarks suggest a geometric
mean of 3-5% faster on the standard @code{pyperformance} benchmark suite,
depending on platform and architecture.
The baseline is Python 3.14 built with Clang 19, without this new interpreter.

This interpreter currently only works with Clang 19 and newer
on x86-64 and AArch64 architectures.
However, a future release of GCC is expected to support this as well.

This feature is opt-in for now. Enabling profile-guided optimization is highly
recommended when using the new interpreter as it is the only configuration
that has been tested and validated for improved performance.
For further information, see @ref{173,,--with-tail-call-interp}.

@cartouche
@quotation Note 
This is not to be confused with tail call optimization@footnote{https://en.wikipedia.org/wiki/Tail_call} of Python
functions, which is currently not implemented in CPython.

This new interpreter type is an internal implementation detail of the CPython
interpreter.  It doesn’t change the visible behavior of Python programs at
all.  It can improve their performance, but doesn’t change anything else.
@end quotation
@end cartouche

(Contributed by Ken Jin in gh-128563@footnote{https://github.com/python/cpython/issues/128563}, with ideas on how to implement this
in CPython by Mark Shannon, Garrett Gu, Haoran Xu, and Josh Haberman.)

@node Free-threaded mode improvements,Improved error messages,A new type of interpreter,New features
@anchor{whatsnew/3 14 free-threaded-mode-improvements}@anchor{174}@anchor{whatsnew/3 14 whatsnew314-free-threaded-cpython}@anchor{151}
@subsubsection Free-threaded mode improvements


CPython’s free-threaded mode (
@geindex Python Enhancement Proposals; PEP 703
PEP 703@footnote{https://peps.python.org/pep-0703/}), initially added in 3.13,
has been significantly improved in Python 3.14.
The implementation described in PEP 703 has been finished, including C API
changes, and temporary workarounds in the interpreter were replaced with
more permanent solutions.
The specializing adaptive interpreter (
@geindex Python Enhancement Proposals; PEP 659
PEP 659@footnote{https://peps.python.org/pep-0659/}) is now enabled
in free-threaded mode, which along with many other optimizations
greatly improves its performance.
The performance penalty on single-threaded code in free-threaded mode
is now roughly 5-10%, depending on the platform and C compiler used.

From Python 3.14, when compiling extension modules for the free-threaded build of
CPython on Windows, the preprocessor variable @code{Py_GIL_DISABLED} now needs to
be specified by the build backend, as it will no longer be determined
automatically by the C compiler. For a running interpreter, the setting that
was used at compile time can be found using @ref{175,,sysconfig.get_config_var()}.

The new @ref{170,,-X context_aware_warnings} flag controls if
@ref{154,,concurrent safe warnings control}
is enabled. The flag defaults to true for the free-threaded build
and false for the GIL-enabled build.

A new @ref{176,,thread_inherit_context} flag has been added,
which if enabled means that threads created with @ref{177,,threading.Thread}
start with a copy of the @ref{178,,Context()} of the caller of
@ref{179,,start()}.  Most significantly, this makes the warning
filtering context established by @ref{17a,,catch_warnings} be
“inherited” by threads (or asyncio tasks) started within that context.  It also
affects other modules that use context variables, such as the @ref{3a,,decimal}
context manager.
This flag defaults to true for the free-threaded build and false for
the GIL-enabled build.

(Contributed by Sam Gross, Matt Page, Neil Schemenauer, Thomas Wouters,
Donghee Na, Kirill Podoprigora, Ken Jin, Itamar Oren, Brett Simmers,
Dino Viehland, Nathan Goldbaum, Ralf Gommers, Lysandros Nikolaou, Kumar Aditya,
Edgar Margffoy, and many others.
Some of these contributors are employed by Meta, which has continued to provide
significant engineering resources to support this project.)

@node Improved error messages,PEP 784 Zstandard support in the standard library,Free-threaded mode improvements,New features
@anchor{whatsnew/3 14 improved-error-messages}@anchor{17b}@anchor{whatsnew/3 14 whatsnew314-improved-error-messages}@anchor{152}
@subsubsection Improved error messages



@itemize *

@item 
The interpreter now provides helpful suggestions when it detects typos in Python
keywords. When a word that closely resembles a Python keyword is encountered,
the interpreter will suggest the correct keyword in the error message. This
feature helps programmers quickly identify and fix common typing mistakes. For
example:

@example
>>> whille True:
...     pass
Traceback (most recent call last):
  File "<stdin>", line 1
    whille True:
    ^^^^^^
SyntaxError: invalid syntax. Did you mean 'while'?
@end example

While the feature focuses on the most common cases, some variations of
misspellings may still result in regular syntax errors.
(Contributed by Pablo Galindo in gh-132449@footnote{https://github.com/python/cpython/issues/132449}.)

@item 
@ref{17c,,elif} statements that follow an @ref{17d,,else} block now have
a specific error message.
(Contributed by Steele Farnsworth in gh-129902@footnote{https://github.com/python/cpython/issues/129902}.)

@example
>>> if who == "me":
...     print("It's me!")
... else:
...     print("It's not me!")
... elif who is None:
...     print("Who is it?")
File "<stdin>", line 5
  elif who is None:
  ^^^^
SyntaxError: 'elif' block follows an 'else' block
@end example

@item 
If a statement is passed to the @ref{17e,,Conditional expressions} after @ref{17d,,else},
or one of @ref{17f,,pass}, @ref{180,,break}, or @ref{181,,continue}
is passed before @ref{182,,if}, then the
error message highlights where the @ref{183,,expression} is
required. (Contributed by Sergey Miryanov in gh-129515@footnote{https://github.com/python/cpython/issues/129515}.)

@example
>>> x = 1 if True else pass
Traceback (most recent call last):
  File "<string>", line 1
    x = 1 if True else pass
                       ^^^^
SyntaxError: expected expression after 'else', but statement is given

>>> x = continue if True else break
Traceback (most recent call last):
  File "<string>", line 1
    x = continue if True else break
        ^^^^^^^^
SyntaxError: expected expression before 'if', but statement is given
@end example

@item 
When incorrectly closed strings are detected, the error message suggests
that the string may be intended to be part of the string.
(Contributed by Pablo Galindo in gh-88535@footnote{https://github.com/python/cpython/issues/88535}.)

@example
>>> "The interesting object "The important object" is very important"
Traceback (most recent call last):
SyntaxError: invalid syntax. Is this intended to be part of the string?
@end example

@item 
When strings have incompatible prefixes, the error now shows
which prefixes are incompatible.
(Contributed by Nikita Sobolev in gh-133197@footnote{https://github.com/python/cpython/issues/133197}.)

@example
>>> ub'abc'
  File "<python-input-0>", line 1
    ub'abc'
    ^^
SyntaxError: 'u' and 'b' prefixes are incompatible
@end example

@item 
Improved error messages when using @code{as} with incompatible targets in:


@itemize -

@item 
Imports: @code{import ... as ...}

@item 
From imports: @code{from ... import ... as ...}

@item 
Except handlers: @code{except ... as ...}

@item 
Pattern-match cases: @code{case ... as ...}
@end itemize

(Contributed by Nikita Sobolev in gh-123539@footnote{https://github.com/python/cpython/issues/123539}, gh-123562@footnote{https://github.com/python/cpython/issues/123562}, and gh-123440@footnote{https://github.com/python/cpython/issues/123440}.)

@item 
Improved error message when trying to add an instance of an unhashable type to
a @ref{184,,dict} or @ref{185,,set}.
(Contributed by CF Bolz-Tereick and Victor Stinner in gh-132828@footnote{https://github.com/python/cpython/issues/132828}.)

@example
>>> s = set()
>>> s.add(@{'pages': 12, 'grade': 'A'@})
Traceback (most recent call last):
  File "<python-input-1>", line 1, in <module>
    s.add(@{'pages': 12, 'grade': 'A'@})
    ~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: cannot use 'dict' as a set element (unhashable type: 'dict')
>>> d = @{@}
>>> l = [1, 2, 3]
>>> d[l] = 12
Traceback (most recent call last):
  File "<python-input-4>", line 1, in <module>
    d[l] = 12
    ~^^^
TypeError: cannot use 'list' as a dict key (unhashable type: 'list')
@end example

@item 
Improved error message when an object supporting the synchronous
context manager protocol is entered using @ref{186,,async with}
instead of @ref{187,,with},
and vice versa for the asynchronous context manager protocol.
(Contributed by Bénédikt Tran in gh-128398@footnote{https://github.com/python/cpython/issues/128398}.)
@end itemize

@node PEP 784 Zstandard support in the standard library,Asyncio introspection capabilities,Improved error messages,New features
@anchor{whatsnew/3 14 pep-784-zstandard-support-in-the-standard-library}@anchor{188}@anchor{whatsnew/3 14 whatsnew314-zstandard}@anchor{149}
@subsubsection 
@geindex Python Enhancement Proposals; PEP 784
`PEP 784': Zstandard support in the standard library


The new @code{compression} package contains modules @code{compression.lzma},
@code{compression.bz2}, @code{compression.gzip} and @code{compression.zlib}
which re-export the @ref{8e,,lzma}, @ref{14,,bz2}, @ref{6b,,gzip} and @ref{13a,,zlib}
modules respectively. The new import names under @code{compression} are the
preferred names for importing these compression modules from Python 3.14. However,
the existing modules names have not been deprecated. Any deprecation or removal
of the existing compression modules will occur no sooner than five years after
the release of 3.14.

The new @code{compression.zstd} module provides compression and decompression
APIs for the Zstandard format via bindings to Meta's zstd library@footnote{https://facebook.github.io/zstd/}. Zstandard is a widely adopted, highly
efficient, and fast compression format. In addition to the APIs introduced in
@code{compression.zstd}, support for reading and writing Zstandard compressed
archives has been added to the @ref{e4,,tarfile}, @ref{138,,zipfile}, and
@ref{ca,,shutil} modules.

Here’s an example of using the new module to compress some data:

@example
from compression import zstd
import math

data = str(math.pi).encode() * 20
compressed = zstd.compress(data)
ratio = len(compressed) / len(data)
print(f"Achieved compression ratio of @{ratio@}")
@end example

As can be seen, the API is similar to the APIs of the @code{lzma} and
@code{bz2} modules.

(Contributed by Emma Harper Smith, Adam Turner, Gregory P. Smith, Tomas Roun,
Victor Stinner, and Rogdham in gh-132983@footnote{https://github.com/python/cpython/issues/132983}.)


@subsubheading See also


@geindex Python Enhancement Proposals; PEP 784
PEP 784@footnote{https://peps.python.org/pep-0784/}.


@node Asyncio introspection capabilities,Concurrent safe warnings control,PEP 784 Zstandard support in the standard library,New features
@anchor{whatsnew/3 14 asyncio-introspection-capabilities}@anchor{189}@anchor{whatsnew/3 14 whatsnew314-asyncio-introspection}@anchor{148}
@subsubsection Asyncio introspection capabilities


Added a new command-line interface to inspect running Python processes
using asynchronous tasks, available via @code{python -m asyncio ps PID}
or @code{python -m asyncio pstree PID}.

The @code{ps} subcommand inspects the given process ID (PID) and displays
information about currently running asyncio tasks.
It outputs a task table: a flat listing of all tasks, their names,
their coroutine stacks, and which tasks are awaiting them.

The @code{pstree} subcommand fetches the same information, but instead renders a
visual async call tree, showing coroutine relationships in a hierarchical format.
This command is particularly useful for debugging long-running or stuck
asynchronous programs.
It can help developers quickly identify where a program is blocked,
what tasks are pending, and how coroutines are chained together.

For example given this code:

@example
import asyncio

async def play_track(track):
    await asyncio.sleep(5)
    print(f'🎵 Finished: @{track@}')

async def play_album(name, tracks):
    async with asyncio.TaskGroup() as tg:
        for track in tracks:
            tg.create_task(play_track(track), name=track)

async def main():
    async with asyncio.TaskGroup() as tg:
        tg.create_task(
          play_album('Sundowning', ['TNDNBTG', 'Levitate']),
          name='Sundowning')
        tg.create_task(
          play_album('TMBTE', ['DYWTYLM', 'Aqua Regia']),
          name='TMBTE')

if __name__ == '__main__':
    asyncio.run(main())
@end example

Executing the new tool on the running process will yield a table like this:

@example
python -m asyncio ps 12345

tid        task id              task name            coroutine stack                                    awaiter chain                                      awaiter name    awaiter id
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1935500    0x7fc930c18050       Task-1               TaskGroup._aexit -> TaskGroup.__aexit__ -> main                                                                       0x0
1935500    0x7fc930c18230       Sundowning           TaskGroup._aexit -> TaskGroup.__aexit__ -> album   TaskGroup._aexit -> TaskGroup.__aexit__ -> main    Task-1          0x7fc930c18050
1935500    0x7fc93173fa50       TMBTE                TaskGroup._aexit -> TaskGroup.__aexit__ -> album   TaskGroup._aexit -> TaskGroup.__aexit__ -> main    Task-1          0x7fc930c18050
1935500    0x7fc93173fdf0       TNDNBTG              sleep -> play                                      TaskGroup._aexit -> TaskGroup.__aexit__ -> album   Sundowning      0x7fc930c18230
1935500    0x7fc930d32510       Levitate             sleep -> play                                      TaskGroup._aexit -> TaskGroup.__aexit__ -> album   Sundowning      0x7fc930c18230
1935500    0x7fc930d32890       DYWTYLM              sleep -> play                                      TaskGroup._aexit -> TaskGroup.__aexit__ -> album   TMBTE           0x7fc93173fa50
1935500    0x7fc93161ec30       Aqua Regia           sleep -> play                                      TaskGroup._aexit -> TaskGroup.__aexit__ -> album   TMBTE           0x7fc93173fa50
@end example

or a tree like this:

@example
python -m asyncio pstree 12345

└── (T) Task-1
    └──  main example.py:13
        └──  TaskGroup.__aexit__ Lib/asyncio/taskgroups.py:72
            └──  TaskGroup._aexit Lib/asyncio/taskgroups.py:121
                ├── (T) Sundowning
                │   └──  album example.py:8
                │       └──  TaskGroup.__aexit__ Lib/asyncio/taskgroups.py:72
                │           └──  TaskGroup._aexit Lib/asyncio/taskgroups.py:121
                │               ├── (T) TNDNBTG
                │               │   └──  play example.py:4
                │               │       └──  sleep Lib/asyncio/tasks.py:702
                │               └── (T) Levitate
                │                   └──  play example.py:4
                │                       └──  sleep Lib/asyncio/tasks.py:702
                └── (T) TMBTE
                    └──  album example.py:8
                        └──  TaskGroup.__aexit__ Lib/asyncio/taskgroups.py:72
                            └──  TaskGroup._aexit Lib/asyncio/taskgroups.py:121
                                ├── (T) DYWTYLM
                                │   └──  play example.py:4
                                │       └──  sleep Lib/asyncio/tasks.py:702
                                └── (T) Aqua Regia
                                    └──  play example.py:4
                                        └──  sleep Lib/asyncio/tasks.py:702
@end example

If a cycle is detected in the async await graph (which could indicate a
programming issue), the tool raises an error and lists the cycle paths that
prevent tree construction:

@example
python -m asyncio pstree 12345

ERROR: await-graph contains cycles - cannot print a tree!

cycle: Task-2 → Task-3 → Task-2
@end example

(Contributed by Pablo Galindo, Łukasz Langa, Yury Selivanov, and Marta
Gomez Macias in gh-91048@footnote{https://github.com/python/cpython/issues/91048}.)

@node Concurrent safe warnings control,,Asyncio introspection capabilities,New features
@anchor{whatsnew/3 14 concurrent-safe-warnings-control}@anchor{18a}@anchor{whatsnew/3 14 whatsnew314-concurrent-warnings-control}@anchor{154}
@subsubsection Concurrent safe warnings control


The @ref{17a,,warnings.catch_warnings} context manager will now optionally
use a context variable for warning filters. This is enabled by setting
the @ref{18b,,context_aware_warnings} flag, either with the @code{-X}
command-line option or an environment variable. This gives predictable
warnings control when using @code{catch_warnings} combined with
multiple threads or asynchronous tasks. The flag defaults to true for the
free-threaded build and false for the GIL-enabled build.

(Contributed by Neil Schemenauer and Kumar Aditya in gh-130010@footnote{https://github.com/python/cpython/issues/130010}.)

@node Other language changes,New modules,New features,What’s new in Python 3 14
@anchor{whatsnew/3 14 other-language-changes}@anchor{18c}
@subsection Other language changes



@itemize *

@item 
All Windows code pages are now supported as ‘cpXXX’ codecs on Windows.
(Contributed by Serhiy Storchaka in gh-123803@footnote{https://github.com/python/cpython/issues/123803}.)

@item 
Implement mixed-mode arithmetic rules combining real and complex numbers
as specified by the C standard since C99.
(Contributed by Sergey B Kirpichev in gh-69639@footnote{https://github.com/python/cpython/issues/69639}.)

@item 
More syntax errors are now detected regardless of optimisation and
the @ref{18d,,-O} command-line option.
This includes writes to @code{__debug__}, incorrect use of @ref{18e,,await},
and asynchronous comprehensions outside asynchronous functions.
For example, @code{python -O -c 'assert (__debug__ := 1)'}
or @code{python -O -c 'assert await 1'} now produce @ref{18f,,SyntaxError}s.
(Contributed by Irit Katriel and Jelle Zijlstra in gh-122245@footnote{https://github.com/python/cpython/issues/122245} & gh-121637@footnote{https://github.com/python/cpython/issues/121637}.)

@item 
When subclassing a pure C type, the C slots for the new type
are no longer replaced with a wrapped version on class creation
if they are not explicitly overridden in the subclass.
(Contributed by Tomasz Pytel in gh-132284@footnote{https://github.com/python/cpython/issues/132284}.)
@end itemize

@menu
* Built-ins:: 
* Command line and environment:: 
* PEP 758; Allow except and except* expressions without brackets: PEP 758 Allow except and except* expressions without brackets. 
* PEP 765; Control flow in finally blocks: PEP 765 Control flow in finally blocks. 
* Garbage collection:: 
* Default interactive shell:: 

@end menu

@node Built-ins,Command line and environment,,Other language changes
@anchor{whatsnew/3 14 built-ins}@anchor{190}
@subsubsection Built-ins



@itemize *

@item 
The @ref{191,,bytes.fromhex()} and @ref{192,,bytearray.fromhex()} methods now accept
ASCII @ref{193,,bytes} and @ref{194,,bytes-like objects}.
(Contributed by Daniel Pope in gh-129349@footnote{https://github.com/python/cpython/issues/129349}.)

@item 
Add class methods @ref{195,,float.from_number()} and @ref{196,,complex.from_number()}
to convert a number to @ref{197,,float} or @ref{198,,complex} type correspondingly.
They raise a @ref{199,,TypeError} if the argument is not a real number.
(Contributed by Serhiy Storchaka in gh-84978@footnote{https://github.com/python/cpython/issues/84978}.)

@item 
Support underscore and comma as thousands separators in the fractional part
for floating-point presentation types of the new-style string formatting
(with @ref{19a,,format()} or @ref{19b,,f-strings}).
(Contributed by Sergey B Kirpichev in gh-87790@footnote{https://github.com/python/cpython/issues/87790}.)

@item 
The @ref{19c,,int()} function no longer delegates to @ref{19d,,__trunc__()}.
Classes that want to support conversion to @code{int()} must implement
either @ref{19e,,__int__()} or @ref{19f,,__index__()}.
(Contributed by Mark Dickinson in gh-119743@footnote{https://github.com/python/cpython/issues/119743}.)

@item 
The @ref{1a0,,map()} function now has an optional keyword-only `strict' flag
like @ref{1a1,,zip()} to check that all the iterables are of equal length.
(Contributed by Wannes Boeykens in gh-119793@footnote{https://github.com/python/cpython/issues/119793}.)

@item 
The @ref{166,,memoryview} type now supports subscription,
making it a @ref{1a2,,generic type}.
(Contributed by Brian Schubert in gh-126012@footnote{https://github.com/python/cpython/issues/126012}.)

@item 
Using @ref{1a3,,NotImplemented} in a boolean context
will now raise a @ref{199,,TypeError}.
This has raised a @ref{1a4,,DeprecationWarning} since Python 3.9.
(Contributed by Jelle Zijlstra in gh-118767@footnote{https://github.com/python/cpython/issues/118767}.)

@item 
Three-argument @ref{1a5,,pow()} now tries calling @ref{1a6,,__rpow__()}
if necessary.
Previously it was only called in two-argument @code{pow()}
and the binary power operator.
(Contributed by Serhiy Storchaka in gh-130104@footnote{https://github.com/python/cpython/issues/130104}.)

@item 
@ref{1a7,,super} objects are now @ref{29,,copyable} and @ref{ab,,pickleable}.
(Contributed by Serhiy Storchaka in gh-125767@footnote{https://github.com/python/cpython/issues/125767}.)
@end itemize

@node Command line and environment,PEP 758 Allow except and except* expressions without brackets,Built-ins,Other language changes
@anchor{whatsnew/3 14 command-line-and-environment}@anchor{1a8}
@subsubsection Command line and environment



@itemize *

@item 
The import time flag can now track modules that are already loaded (‘cached’),
via the new @ref{170,,-X importtime=2}.
When such a module is imported, the @code{self} and @code{cumulative} times
are replaced by the string @code{cached}.

Values above @code{2} for @code{-X importtime} are now reserved for future use.

(Contributed by Noah Kim and Adam Turner in gh-118655@footnote{https://github.com/python/cpython/issues/118655}.)

@item 
The command-line option @ref{1a9,,-c} now automatically dedents its code
argument before execution. The auto-dedentation behavior mirrors
@ref{1aa,,textwrap.dedent()}.
(Contributed by Jon Crall and Steven Sun in gh-103998@footnote{https://github.com/python/cpython/issues/103998}.)

@item 
@code{-J} is no longer a reserved flag for Jython@footnote{https://www.jython.org/},
and now has no special meaning.
(Contributed by Adam Turner in gh-133336@footnote{https://github.com/python/cpython/issues/133336}.)
@end itemize

@node PEP 758 Allow except and except* expressions without brackets,PEP 765 Control flow in finally blocks,Command line and environment,Other language changes
@anchor{whatsnew/3 14 pep-758-allow-except-and-except-expressions-without-brackets}@anchor{1ab}@anchor{whatsnew/3 14 whatsnew314-bracketless-except}@anchor{14d}
@subsubsection PEP 758: Allow @code{except} and @code{except*} expressions without brackets


The @ref{1ac,,except} and @ref{1ad,,except*} expressions
now allow brackets to be omitted when there are multiple exception types
and the @code{as} clause is not used.
For example:

@example
try:
    connect_to_server()
except TimeoutError, ConnectionRefusedError:
    print('The network has ceased to be!')
@end example

(Contributed by Pablo Galindo and Brett Cannon in 
@geindex Python Enhancement Proposals; PEP 758
PEP 758@footnote{https://peps.python.org/pep-0758/} and gh-131831@footnote{https://github.com/python/cpython/issues/131831}.)

@node PEP 765 Control flow in finally blocks,Garbage collection,PEP 758 Allow except and except* expressions without brackets,Other language changes
@anchor{whatsnew/3 14 pep-765-control-flow-in-finally-blocks}@anchor{1ae}@anchor{whatsnew/3 14 whatsnew314-finally-syntaxwarning}@anchor{14e}
@subsubsection PEP 765: Control flow in @code{finally} blocks


The compiler now emits a @ref{1af,,SyntaxWarning} when a @ref{1b0,,return},
@ref{180,,break}, or @ref{181,,continue} statement have the effect of
leaving a @ref{1b1,,finally} block.
This change is specified in 
@geindex Python Enhancement Proposals; PEP 765
PEP 765@footnote{https://peps.python.org/pep-0765/}.

In situations where this change is inconvenient (such as those where the
warnings are redundant due to code linting), the @ref{1b2,,warning filter} can be used to turn off all syntax warnings by adding
@code{ignore::SyntaxWarning} as a filter. This can be specified in combination
with a filter that converts other warnings to errors (for example, passing
@code{-Werror -Wignore::SyntaxWarning} as CLI options, or setting
@code{PYTHONWARNINGS=error,ignore::SyntaxWarning}).

Note that applying such a filter at runtime using the @ref{119,,warnings} module
will only suppress the warning in code that is compiled `after' the filter is
adjusted. Code that is compiled prior to the filter adjustment (for example,
when a module is imported) will still emit the syntax warning.

(Contributed by Irit Katriel in gh-130080@footnote{https://github.com/python/cpython/issues/130080}.)
@anchor{whatsnew/3 14 incremental-garbage-collection}@anchor{1b3}
@node Garbage collection,Default interactive shell,PEP 765 Control flow in finally blocks,Other language changes
@anchor{whatsnew/3 14 garbage-collection}@anchor{1b4}@anchor{whatsnew/3 14 whatsnew314-incremental-gc}@anchor{153}
@subsubsection Garbage collection


`From Python 3.14.5 onwards:'

The garbage collector (GC) has changed in Python 3.14.5.

Python 3.14.0-3.14.4 shipped with a new incremental GC.
However, due to a number of reports@footnote{https://github.com/python/cpython/issues/142516}
of significant memory pressure in production environments,
it has been reverted back to the generational GC from 3.13.
This is the GC now used in Python 3.14.5 and later.

`Previously in Python 3.14.0-3.14.4:'

The cycle garbage collector is now incremental.
This means that maximum pause times are reduced
by an order of magnitude or more for larger heaps.

There are now only two generations: young and old.
When @ref{1b5,,gc.collect()} is not called directly, the
GC is invoked a little less frequently. When invoked, it
collects the young generation and an increment of the
old generation, instead of collecting one or more generations.

The behavior of @code{gc.collect()} changes slightly:


@itemize *

@item 
@code{gc.collect(1)}: Performs an increment of garbage collection,
rather than collecting generation 1.

@item 
Other calls to @code{gc.collect()} are unchanged.
@end itemize

(Contributed by Mark Shannon in gh-108362@footnote{https://github.com/python/cpython/issues/108362}.)

@node Default interactive shell,,Garbage collection,Other language changes
@anchor{whatsnew/3 14 default-interactive-shell}@anchor{1b6}
@subsubsection Default interactive shell

@anchor{whatsnew/3 14 whatsnew314-pyrepl-highlighting}@anchor{155}

@itemize *

@item 
The default @ref{1b7,,interactive} shell now highlights Python syntax.
The feature is enabled by default, save if 
@geindex PYTHON_BASIC_REPL
@geindex environment variable; PYTHON_BASIC_REPL
@ref{1b8,,PYTHON_BASIC_REPL}
or any other environment variable that disables colour is set.
See @ref{1b9,,Controlling color} for details.

The default color theme for syntax highlighting strives for good contrast
and exclusively uses the 4-bit VGA standard ANSI color codes for maximum
compatibility. The theme can be customized using an experimental API
@code{_colorize.set_theme()}.
This can be called interactively or in the 
@geindex PYTHONSTARTUP
@geindex environment variable; PYTHONSTARTUP
@ref{1ba,,PYTHONSTARTUP} script.
Note that this function has no stability guarantees,
and may change or be removed.

(Contributed by Łukasz Langa in gh-131507@footnote{https://github.com/python/cpython/issues/131507}.)

@item 
The default @ref{1b7,,interactive} shell now supports import auto-completion.
This means that typing @code{import co} and pressing @code{<Tab>} will suggest
modules starting with @code{co}. Similarly, typing @code{from concurrent import i}
will suggest submodules of @code{concurrent} starting with @code{i}.
Note that autocompletion of module attributes is not currently supported.
(Contributed by Tomas Roun in gh-69605@footnote{https://github.com/python/cpython/issues/69605}.)
@end itemize

@node New modules,Improved modules,Other language changes,What’s new in Python 3 14
@anchor{whatsnew/3 14 new-modules}@anchor{1bb}
@subsection New modules



@itemize *

@item 
@ref{6,,annotationlib}:
For introspecting @ref{15d,,annotations}.
See @ref{146,,PEP 749} for more details.
(Contributed by Jelle Zijlstra in gh-119180@footnote{https://github.com/python/cpython/issues/119180}.)

@item 
@ref{22,,compression} (including @ref{23,,compression.zstd}):
A package for compression-related modules,
including a new module to support the Zstandard compression format.
See @ref{149,,PEP 784} for more details.
(Contributed by Emma Harper Smith, Adam Turner, Gregory P. Smith, Tomas Roun,
Victor Stinner, and Rogdham in gh-132983@footnote{https://github.com/python/cpython/issues/132983}.)

@item 
@ref{25,,concurrent.interpreters}:
Support for multiple interpreters in the standard library.
See @ref{147,,PEP 734} for more details.
(Contributed by Eric Snow in gh-134939@footnote{https://github.com/python/cpython/issues/134939}.)

@item 
@ref{d9,,string.templatelib}:
Support for template string literals (t-strings).
See @ref{145,,PEP 750} for more details.
(Contributed by Jim Baker, Guido van Rossum, Paul Everitt, Koudai Aono,
Lysandros Nikolaou, Dave Peck, Adam Turner, Jelle Zijlstra, Bénédikt Tran,
and Pablo Galindo Salgado in gh-132661@footnote{https://github.com/python/cpython/issues/132661}.)
@end itemize

@node Improved modules,Optimizations,New modules,What’s new in Python 3 14
@anchor{whatsnew/3 14 improved-modules}@anchor{1bc}
@subsection Improved modules


@menu
* argparse:: 
* ast:: 
* asyncio:: 
* calendar:: 
* concurrent.futures: concurrent futures. 
* configparser:: 
* contextvars:: 
* ctypes:: 
* curses:: 
* datetime:: 
* decimal:: 
* difflib:: 
* dis:: 
* errno:: 
* faulthandler:: 
* fnmatch:: 
* fractions:: 
* functools:: 
* getopt:: 
* getpass:: 
* graphlib:: 
* heapq:: 
* hmac:: 
* http:: 
* imaplib:: 
* inspect:: 
* io:: 
* json:: 
* linecache:: 
* logging.handlers: logging handlers. 
* math:: 
* mimetypes:: 
* multiprocessing:: 
* operator:: 
* os:: 
* os.path: os path. 
* pathlib:: 
* pdb:: 
* pickle:: 
* platform:: 
* pydoc:: 
* re:: 
* socket:: 
* ssl:: 
* struct:: 
* symtable:: 
* sys:: 
* sys.monitoring: sys monitoring. 
* sysconfig:: 
* tarfile:: 
* threading:: 
* tkinter:: 
* turtle:: 
* types:: 
* typing:: 
* unicodedata:: 
* unittest:: 
* urllib:: 
* uuid:: 
* webbrowser:: 
* zipfile:: 

@end menu

@node argparse,ast,,Improved modules
@anchor{whatsnew/3 14 argparse}@anchor{1bd}
@subsubsection argparse



@itemize *

@item 
The default value of the @ref{1be,,program name} for
@ref{1bf,,argparse.ArgumentParser} now reflects the way the Python
interpreter was instructed to find the @code{__main__} module code.
(Contributed by Serhiy Storchaka and Alyssa Coghlan in gh-66436@footnote{https://github.com/python/cpython/issues/66436}.)

@item 
Introduced the optional `suggest_on_error' parameter to
@ref{1bf,,argparse.ArgumentParser}, enabling suggestions for argument choices
and subparser names if mistyped by the user.
(Contributed by Savannah Ostrowski in gh-124456@footnote{https://github.com/python/cpython/issues/124456}.)

@item 
Enable color for help text, which can be disabled with the optional `color'
parameter to @ref{1bf,,argparse.ArgumentParser}.
This can also be controlled by @ref{1b9,,environment variables}.
(Contributed by Hugo van Kemenade in gh-130645@footnote{https://github.com/python/cpython/issues/130645}.)
@end itemize

@node ast,asyncio,argparse,Improved modules
@anchor{whatsnew/3 14 ast}@anchor{1c0}
@subsubsection ast



@itemize *

@item 
Add @ref{1c1,,compare()}, a function for comparing two ASTs.
(Contributed by Batuhan Taskaya and Jeremy Hylton in gh-60191@footnote{https://github.com/python/cpython/issues/60191}.)

@item 
Add support for @ref{1c2,,copy.replace()} for AST nodes.
(Contributed by Bénédikt Tran in gh-121141@footnote{https://github.com/python/cpython/issues/121141}.)

@item 
Docstrings are now removed from an optimized AST in optimization level 2.
(Contributed by Irit Katriel in gh-123958@footnote{https://github.com/python/cpython/issues/123958}.)

@item 
The @ref{1c3,,repr()} output for AST nodes now includes more information.
(Contributed by Tomas Roun in gh-116022@footnote{https://github.com/python/cpython/issues/116022}.)

@item 
When called with an AST as input, the @ref{1c4,,parse()} function
now always verifies that the root node type is appropriate.
(Contributed by Irit Katriel in gh-130139@footnote{https://github.com/python/cpython/issues/130139}.)

@item 
Add new options to the command-line interface:
@ref{1c5,,--feature-version},
@ref{1c6,,--optimize}, and
@ref{1c7,,--show-empty}.
(Contributed by Semyon Moroz in gh-133367@footnote{https://github.com/python/cpython/issues/133367}.)
@end itemize

@node asyncio,calendar,ast,Improved modules
@anchor{whatsnew/3 14 asyncio}@anchor{1c8}
@subsubsection asyncio



@itemize *

@item 
The function and methods named @code{create_task()} now take an arbitrary
list of keyword arguments. All keyword arguments are passed to the
@ref{1c9,,Task} constructor or the custom task factory.
(See @ref{1ca,,set_task_factory()} for details.)
The @code{name} and @code{context} keyword arguments are no longer special;
the name should now be set using the @code{name} keyword argument of the factory,
and @code{context} may be @code{None}.

This affects the following function and methods:
@ref{1cb,,asyncio.create_task()},
@ref{1cc,,asyncio.loop.create_task()},
@ref{1cd,,asyncio.TaskGroup.create_task()}.

(Contributed by Thomas Grainger in gh-128307@footnote{https://github.com/python/cpython/issues/128307}.)

@item 
There are two new utility functions for
introspecting and printing a program’s call graph:
@ref{1ce,,capture_call_graph()} and @ref{1cf,,print_call_graph()}.
See @ref{148,,Asyncio introspection capabilities} for more details.
(Contributed by Yury Selivanov, Pablo Galindo Salgado, and Łukasz Langa
in gh-91048@footnote{https://github.com/python/cpython/issues/91048}.)
@end itemize

@node calendar,concurrent futures,asyncio,Improved modules
@anchor{whatsnew/3 14 calendar}@anchor{1d0}
@subsubsection calendar

@anchor{whatsnew/3 14 whatsnew314-color-calendar}@anchor{1d1}

@itemize *

@item 
By default, today’s date is highlighted in color in @ref{15,,calendar}’s
@ref{1d2,,command-line} text output.
This can be controlled by @ref{1b9,,environment variables}.
(Contributed by Hugo van Kemenade in gh-128317@footnote{https://github.com/python/cpython/issues/128317}.)
@end itemize

@node concurrent futures,configparser,calendar,Improved modules
@anchor{whatsnew/3 14 concurrent-futures}@anchor{1d3}
@subsubsection concurrent.futures

@anchor{whatsnew/3 14 whatsnew314-concurrent-futures-interp-pool}@anchor{168}

@itemize *

@item 
Add a new executor class, @ref{1d4,,InterpreterPoolExecutor},
which exposes multiple Python interpreters in the same process
(‘subinterpreters’) to Python code.
This uses a pool of independent Python interpreters to execute calls
asynchronously.

This is separate from the new @ref{25,,interpreters} module
introduced by @ref{147,,PEP 734}.
(Contributed by Eric Snow in gh-124548@footnote{https://github.com/python/cpython/issues/124548}.)
@end itemize
@anchor{whatsnew/3 14 whatsnew314-concurrent-futures-start-method}@anchor{1d5}

@itemize *

@item 
On Unix platforms other than macOS, @ref{1d6,,‘forkserver’} is now the default @ref{1d7,,start method} for
@ref{1d8,,ProcessPoolExecutor}
(replacing @ref{1d9,,‘fork’}).
This change does not affect Windows or macOS, where @ref{1da,,‘spawn’} remains the default start method.

If the threading incompatible `fork' method is required, you must explicitly
request it by supplying a multiprocessing context `mp_context' to
@ref{1d8,,ProcessPoolExecutor}.

See @ref{1db,,forkserver restrictions}
for information and differences with the `fork' method and how this change
may affect existing code with mutable global shared variables and/or shared
objects that can not be automatically @ref{ab,,pickled}.

(Contributed by Gregory P. Smith in gh-84559@footnote{https://github.com/python/cpython/issues/84559}.)

@item 
Add two new methods to @ref{1d8,,ProcessPoolExecutor},
@ref{1dc,,terminate_workers()}
and @ref{1dd,,kill_workers()},
as ways to terminate or kill all living worker processes in the given pool.
(Contributed by Charles Machalow in gh-130849@footnote{https://github.com/python/cpython/issues/130849}.)

@item 
Add the optional `buffersize' parameter to @ref{1de,,Executor.map} to limit the number of submitted
tasks whose results have not yet been yielded. If the buffer is full,
iteration over the `iterables' pauses until a result is yielded from the
buffer.
(Contributed by Enzo Bonnal and Josh Rosenberg in gh-74028@footnote{https://github.com/python/cpython/issues/74028}.)
@end itemize

@node configparser,contextvars,concurrent futures,Improved modules
@anchor{whatsnew/3 14 configparser}@anchor{1df}
@subsubsection configparser



@itemize *

@item 
@code{configparser} will no longer write config files it cannot read,
to improve security.
Attempting to @ref{1e0,,write()} keys containing
delimiters or beginning with the section header pattern will raise an
@ref{1e1,,InvalidWriteError}.
(Contributed by Jacob Lincoln in gh-129270@footnote{https://github.com/python/cpython/issues/129270}.)
@end itemize

@node contextvars,ctypes,configparser,Improved modules
@anchor{whatsnew/3 14 contextvars}@anchor{1e2}
@subsubsection contextvars



@itemize *

@item 
Support the @ref{1e3,,context manager} protocol
for @ref{1e4,,Token} objects.
(Contributed by Andrew Svetlov in gh-129889@footnote{https://github.com/python/cpython/issues/129889}.)
@end itemize

@node ctypes,curses,contextvars,Improved modules
@anchor{whatsnew/3 14 ctypes}@anchor{1e5}
@subsubsection ctypes



@itemize *

@item 
The layout of @ref{1e6,,bit fields}
in @ref{1e7,,Structure} and @ref{1e8,,Union} objects
is now a closer match to platform defaults (GCC/Clang or MSVC).
In particular, fields no longer overlap.
(Contributed by Matthias Görgens in gh-97702@footnote{https://github.com/python/cpython/issues/97702}.)

@item 
The @ref{1e9,,Structure._layout_} class attribute can now be set
to help match a non-default ABI.
(Contributed by Petr Viktorin in gh-97702@footnote{https://github.com/python/cpython/issues/97702}.)

@item 
The class of @ref{1e7,,Structure}/@ref{1e8,,Union}
field descriptors is now available as @ref{1ea,,CField},
and has new attributes to aid debugging and introspection.
(Contributed by Petr Viktorin in gh-128715@footnote{https://github.com/python/cpython/issues/128715}.)

@item 
On Windows, the @ref{1eb,,COMError} exception is now public.
(Contributed by Jun Komoda in gh-126686@footnote{https://github.com/python/cpython/issues/126686}.)

@item 
On Windows, the @ref{1ec,,CopyComPointer()} function is now public.
(Contributed by Jun Komoda in gh-127275@footnote{https://github.com/python/cpython/issues/127275}.)

@item 
Add @ref{1ed,,memoryview_at()}, a function to create a
@ref{166,,memoryview} object that refers to the supplied pointer and
length. This works like @ref{1ee,,ctypes.string_at()} except it avoids a
buffer copy, and is typically useful when implementing pure Python
callback functions that are passed dynamically-sized buffers.
(Contributed by Rian Hunter in gh-112018@footnote{https://github.com/python/cpython/issues/112018}.)

@item 
Complex types, @ref{1ef,,c_float_complex},
@ref{1f0,,c_double_complex}, and @ref{1f1,,c_longdouble_complex},
are now available if both the compiler and the @code{libffi} library support
complex C types.
(Contributed by Sergey B Kirpichev in gh-61103@footnote{https://github.com/python/cpython/issues/61103}.)

@item 
Add @ref{1f2,,ctypes.util.dllist()} for listing the shared libraries
loaded by the current process.
(Contributed by Brian Ward in gh-119349@footnote{https://github.com/python/cpython/issues/119349}.)

@item 
Move @ref{1f3,,ctypes.POINTER()} types cache from a global internal cache
(@code{_pointer_type_cache}) to the @ref{1f4,,_CData.__pointer_type__} attribute of the corresponding
@code{ctypes} types.
This will stop the cache from growing without limits in some situations.
(Contributed by Sergey Miryanov in gh-100926@footnote{https://github.com/python/cpython/issues/100926}.)

@item 
The @ref{1f5,,py_object} type now supports subscription,
making it a @ref{1a2,,generic type}.
(Contributed by Brian Schubert in gh-132168@footnote{https://github.com/python/cpython/issues/132168}.)

@item 
@code{ctypes} now supports @ref{1f6,,free-threading builds}.
(Contributed by Kumar Aditya and Peter Bierma in gh-127945@footnote{https://github.com/python/cpython/issues/127945}.)
@end itemize

@node curses,datetime,ctypes,Improved modules
@anchor{whatsnew/3 14 curses}@anchor{1f7}
@subsubsection curses



@itemize *

@item 
Add the @ref{1f8,,assume_default_colors()} function,
a refinement of the @ref{1f9,,use_default_colors()} function which
allows changing the color pair @code{0}.
(Contributed by Serhiy Storchaka in gh-133139@footnote{https://github.com/python/cpython/issues/133139}.)
@end itemize

@node datetime,decimal,curses,Improved modules
@anchor{whatsnew/3 14 datetime}@anchor{1fa}
@subsubsection datetime



@itemize *

@item 
Add the @ref{1fb,,strptime()} method to the
@ref{1fc,,datetime.date} and @ref{1fd,,datetime.time} classes.
(Contributed by Wannes Boeykens in gh-41431@footnote{https://github.com/python/cpython/issues/41431}.)
@end itemize

@node decimal,difflib,datetime,Improved modules
@anchor{whatsnew/3 14 decimal}@anchor{1fe}
@subsubsection decimal



@itemize *

@item 
Add @ref{1ff,,Decimal.from_number()} as an alternative constructor for
@ref{200,,Decimal}.
(Contributed by Serhiy Storchaka in gh-121798@footnote{https://github.com/python/cpython/issues/121798}.)

@item 
Expose @ref{201,,IEEEContext()} to support creation of contexts
corresponding to the IEEE 754 (2008) decimal interchange formats.
(Contributed by Sergey B Kirpichev in gh-53032@footnote{https://github.com/python/cpython/issues/53032}.)
@end itemize

@node difflib,dis,decimal,Improved modules
@anchor{whatsnew/3 14 difflib}@anchor{202}
@subsubsection difflib



@itemize *

@item 
Comparison pages with highlighted changes generated by the
@ref{203,,HtmlDiff} class now support ‘dark mode’.
(Contributed by Jiahao Li in gh-129939@footnote{https://github.com/python/cpython/issues/129939}.)
@end itemize

@node dis,errno,difflib,Improved modules
@anchor{whatsnew/3 14 dis}@anchor{204}
@subsubsection dis



@itemize *

@item 
Add support for rendering full source location information of
@ref{205,,instructions}, rather than only the line number.
This feature is added to the following interfaces via the `show_positions'
keyword argument:


@itemize -

@item 
@ref{206,,dis.Bytecode}

@item 
@ref{207,,dis.dis()}

@item 
@ref{208,,dis.distb()}

@item 
@ref{209,,dis.disassemble()}
@end itemize

This feature is also exposed via @ref{20a,,dis --show-positions}.
(Contributed by Bénédikt Tran in gh-123165@footnote{https://github.com/python/cpython/issues/123165}.)

@item 
Add the @ref{20b,,dis --specialized} command-line option to
show specialized bytecode.
(Contributed by Bénédikt Tran in gh-127413@footnote{https://github.com/python/cpython/issues/127413}.)
@end itemize

@node errno,faulthandler,dis,Improved modules
@anchor{whatsnew/3 14 errno}@anchor{20c}
@subsubsection errno



@itemize *

@item 
Add the @ref{20d,,EHWPOISON} error code constant.
(Contributed by James Roy in gh-126585@footnote{https://github.com/python/cpython/issues/126585}.)
@end itemize

@node faulthandler,fnmatch,errno,Improved modules
@anchor{whatsnew/3 14 faulthandler}@anchor{20e}
@subsubsection faulthandler



@itemize *

@item 
Add support for printing the C stack trace on systems that
@ref{20f,,support it} via the new
@ref{210,,dump_c_stack()} function or via the `c_stack' argument
in @ref{211,,faulthandler.enable()}.
(Contributed by Peter Bierma in gh-127604@footnote{https://github.com/python/cpython/issues/127604}.)
@end itemize

@node fnmatch,fractions,faulthandler,Improved modules
@anchor{whatsnew/3 14 fnmatch}@anchor{212}
@subsubsection fnmatch



@itemize *

@item 
Add @ref{213,,filterfalse()}, a function to reject names
matching a given pattern.
(Contributed by Bénédikt Tran in gh-74598@footnote{https://github.com/python/cpython/issues/74598}.)
@end itemize

@node fractions,functools,fnmatch,Improved modules
@anchor{whatsnew/3 14 fractions}@anchor{214}
@subsubsection fractions



@itemize *

@item 
A @ref{215,,Fraction} object may now be constructed from any
object with the @code{as_integer_ratio()} method.
(Contributed by Serhiy Storchaka in gh-82017@footnote{https://github.com/python/cpython/issues/82017}.)

@item 
Add @ref{216,,Fraction.from_number()} as an alternative constructor for
@ref{215,,Fraction}.
(Contributed by Serhiy Storchaka in gh-121797@footnote{https://github.com/python/cpython/issues/121797}.)
@end itemize

@node functools,getopt,fractions,Improved modules
@anchor{whatsnew/3 14 functools}@anchor{217}
@subsubsection functools



@itemize *

@item 
Add the @ref{218,,Placeholder} sentinel.
This may be used with the @ref{219,,partial()}
or @ref{21a,,partialmethod()} functions to reserve a place
for positional arguments in the returned @ref{21b,,partial object}.
(Contributed by Dominykas Grigonis in gh-119127@footnote{https://github.com/python/cpython/issues/119127}.)

@item 
Allow the `initial' parameter of @ref{21c,,reduce()} to be passed
as a keyword argument.
(Contributed by Sayandip Dutta in gh-125916@footnote{https://github.com/python/cpython/issues/125916}.)
@end itemize

@node getopt,getpass,functools,Improved modules
@anchor{whatsnew/3 14 getopt}@anchor{21d}
@subsubsection getopt



@itemize *

@item 
Add support for options with optional arguments.
(Contributed by Serhiy Storchaka in gh-126374@footnote{https://github.com/python/cpython/issues/126374}.)

@item 
Add support for returning intermixed options and non-option arguments in order.
(Contributed by Serhiy Storchaka in gh-126390@footnote{https://github.com/python/cpython/issues/126390}.)
@end itemize

@node getpass,graphlib,getopt,Improved modules
@anchor{whatsnew/3 14 getpass}@anchor{21e}
@subsubsection getpass



@itemize *

@item 
Support keyboard feedback in the @ref{21f,,getpass()} function via
the keyword-only optional argument `echo_char'.
Placeholder characters are rendered whenever a character is entered,
and removed when a character is deleted.
(Contributed by Semyon Moroz in gh-77065@footnote{https://github.com/python/cpython/issues/77065}.)
@end itemize

@node graphlib,heapq,getpass,Improved modules
@anchor{whatsnew/3 14 graphlib}@anchor{220}
@subsubsection graphlib



@itemize *

@item 
Allow @ref{221,,TopologicalSorter.prepare()} to be called more than once
as long as sorting has not started.
(Contributed by Daniel Pope in gh-130914@footnote{https://github.com/python/cpython/issues/130914}.)
@end itemize

@node heapq,hmac,graphlib,Improved modules
@anchor{whatsnew/3 14 heapq}@anchor{222}
@subsubsection heapq



@itemize *

@item 
The @code{heapq} module has improved support for working with max-heaps,
via the following new functions:


@itemize *

@item 
@ref{223,,heapify_max()}

@item 
@ref{224,,heappush_max()}

@item 
@ref{225,,heappop_max()}

@item 
@ref{226,,heapreplace_max()}

@item 
@ref{227,,heappushpop_max()}
@end itemize
@end itemize

@node hmac,http,heapq,Improved modules
@anchor{whatsnew/3 14 hmac}@anchor{228}
@subsubsection hmac



@itemize *

@item 
Add a built-in implementation for HMAC (
@geindex RFC; RFC 2104
RFC 2104@footnote{https://datatracker.ietf.org/doc/html/rfc2104.html}) using formally verified
code from the HACL*@footnote{https://github.com/hacl-star/hacl-star/} project.
This implementation is used as a fallback when the OpenSSL implementation
of HMAC is not available.
(Contributed by Bénédikt Tran in gh-99108@footnote{https://github.com/python/cpython/issues/99108}.)
@end itemize

@node http,imaplib,hmac,Improved modules
@anchor{whatsnew/3 14 http}@anchor{229}
@subsubsection http



@itemize *

@item 
Directory lists and error pages generated by the @ref{76,,http.server}
module allow the browser to apply its default dark mode.
(Contributed by Yorik Hansen in gh-123430@footnote{https://github.com/python/cpython/issues/123430}.)

@item 
The @ref{76,,http.server} module now supports serving over HTTPS using the
@ref{22a,,http.server.HTTPSServer} class. This functionality is exposed by
the command-line interface (@code{python -m http.server}) through the following
options:


@itemize *

@item 
@ref{22b,,--tls-cert <path>}:
Path to the TLS certificate file.

@item 
@ref{22c,,--tls-key <path>}:
Optional path to the private key file.

@item 
@ref{22d,,--tls-password-file <path>}:
Optional path to the password file for the private key.
@end itemize

(Contributed by Semyon Moroz in gh-85162@footnote{https://github.com/python/cpython/issues/85162}.)
@end itemize

@node imaplib,inspect,http,Improved modules
@anchor{whatsnew/3 14 imaplib}@anchor{22e}
@subsubsection imaplib



@itemize *

@item 
Add @ref{22f,,IMAP4.idle()}, implementing the IMAP4
@code{IDLE} command as defined in 
@geindex RFC; RFC 2177
RFC 2177@footnote{https://datatracker.ietf.org/doc/html/rfc2177.html}.
(Contributed by Forest in gh-55454@footnote{https://github.com/python/cpython/issues/55454}.)
@end itemize

@node inspect,io,imaplib,Improved modules
@anchor{whatsnew/3 14 inspect}@anchor{230}
@subsubsection inspect



@itemize *

@item 
@ref{231,,signature()} takes a new argument `annotation_format' to control
the @ref{232,,annotationlib.Format} used for representing annotations.
(Contributed by Jelle Zijlstra in gh-101552@footnote{https://github.com/python/cpython/issues/101552}.)

@item 
@ref{233,,Signature.format()} takes a new argument `unquote_annotations'.
If true, string @ref{15d,,annotations} are displayed without
surrounding quotes.
(Contributed by Jelle Zijlstra in gh-101552@footnote{https://github.com/python/cpython/issues/101552}.)

@item 
Add function @ref{234,,ispackage()} to determine whether an object is a
@ref{235,,package} or not.
(Contributed by Zhikang Yan in gh-125634@footnote{https://github.com/python/cpython/issues/125634}.)
@end itemize

@node io,json,inspect,Improved modules
@anchor{whatsnew/3 14 io}@anchor{236}
@subsubsection io



@itemize *

@item 
Reading text from a non-blocking stream with @code{read} may now raise a
@ref{237,,BlockingIOError} if the operation cannot immediately return bytes.
(Contributed by Giovanni Siragusa in gh-109523@footnote{https://github.com/python/cpython/issues/109523}.)

@item 
Add the @ref{238,,Reader} and @ref{239,,Writer} protocols as simpler
alternatives to the pseudo-protocols @ref{23a,,typing.IO},
@ref{23b,,typing.TextIO}, and @ref{23c,,typing.BinaryIO}.
(Contributed by Sebastian Rittau in gh-127648@footnote{https://github.com/python/cpython/issues/127648}.)
@end itemize

@node json,linecache,io,Improved modules
@anchor{whatsnew/3 14 json}@anchor{23d}
@subsubsection json



@itemize *

@item 
Add exception notes for JSON serialization errors that allow
identifying the source of the error.
(Contributed by Serhiy Storchaka in gh-122163@footnote{https://github.com/python/cpython/issues/122163}.)

@item 
Allow using the @ref{86,,json} module as a script using the @ref{23e,,-m} switch:
@code{python -m json}.
This is now preferred to @code{python -m json.tool},
which is @ref{23f,,soft deprecated}.
See the @ref{240,,JSON command-line interface} documentation.
(Contributed by Trey Hunner in gh-122873@footnote{https://github.com/python/cpython/issues/122873}.)

@item 
By default, the output of the @ref{240,,JSON command-line interface} is highlighted in color.
This can be controlled by @ref{1b9,,environment variables}.
(Contributed by Tomas Roun in gh-131952@footnote{https://github.com/python/cpython/issues/131952}.)
@end itemize

@node linecache,logging handlers,json,Improved modules
@anchor{whatsnew/3 14 linecache}@anchor{241}
@subsubsection linecache



@itemize *

@item 
@ref{242,,getline()} can now retrieve source code for frozen modules.
(Contributed by Tian Gao in gh-131638@footnote{https://github.com/python/cpython/issues/131638}.)
@end itemize

@node logging handlers,math,linecache,Improved modules
@anchor{whatsnew/3 14 logging-handlers}@anchor{243}
@subsubsection logging.handlers



@itemize *

@item 
@ref{244,,QueueListener} objects now support the
@ref{1e3,,context manager} protocol.
(Contributed by Charles Machalow in gh-132106@footnote{https://github.com/python/cpython/issues/132106}.)

@item 
@ref{245,,QueueListener.start} now
raises a @ref{246,,RuntimeError} if the listener is already started.
(Contributed by Charles Machalow in gh-132106@footnote{https://github.com/python/cpython/issues/132106}.)
@end itemize

@node math,mimetypes,logging handlers,Improved modules
@anchor{whatsnew/3 14 math}@anchor{247}
@subsubsection math



@itemize *

@item 
Added more detailed error messages for domain errors in the module.
(Contributed by Charlie Zhao and Sergey B Kirpichev in gh-101410@footnote{https://github.com/python/cpython/issues/101410}.)
@end itemize

@node mimetypes,multiprocessing,math,Improved modules
@anchor{whatsnew/3 14 mimetypes}@anchor{248}
@subsubsection mimetypes



@itemize *

@item 
Add a public @ref{249,,command-line} for the module,
invoked via @code{python -m mimetypes}.
(Contributed by Oleg Iarygin and Hugo van Kemenade in gh-93096@footnote{https://github.com/python/cpython/issues/93096}.)

@item 
Add several new MIME types based on RFCs and common usage:

@subsubheading Microsoft and 
@geindex RFC; RFC 8081
RFC 8081@footnote{https://datatracker.ietf.org/doc/html/rfc8081.html} MIME types for fonts



@itemize *

@item 
Embedded OpenType: @code{application/vnd.ms-fontobject}

@item 
OpenType Layout (OTF) @code{font/otf}

@item 
TrueType: @code{font/ttf}

@item 
WOFF 1.0 @code{font/woff}

@item 
WOFF 2.0 @code{font/woff2}
@end itemize

@subsubheading 
@geindex RFC; RFC 9559
RFC 9559@footnote{https://datatracker.ietf.org/doc/html/rfc9559.html} MIME types for Matroska audiovisual data container structures



@itemize *

@item 
audio with no video: @code{audio/matroska} (@code{.mka})

@item 
video: @code{video/matroska} (@code{.mkv})

@item 
stereoscopic video: @code{video/matroska-3d} (@code{.mk3d})
@end itemize

@subsubheading Images with RFCs



@itemize *

@item 
@geindex RFC; RFC 1494
RFC 1494@footnote{https://datatracker.ietf.org/doc/html/rfc1494.html}: CCITT Group 3 (@code{.g3})

@item 
@geindex RFC; RFC 3362
RFC 3362@footnote{https://datatracker.ietf.org/doc/html/rfc3362.html}: Real-time Facsimile, T.38 (@code{.t38})

@item 
@geindex RFC; RFC 3745
RFC 3745@footnote{https://datatracker.ietf.org/doc/html/rfc3745.html}: JPEG 2000 (@code{.jp2}), extension (@code{.jpx}) and compound (@code{.jpm})

@item 
@geindex RFC; RFC 3950
RFC 3950@footnote{https://datatracker.ietf.org/doc/html/rfc3950.html}: Tag Image File Format Fax eXtended, TIFF-FX (@code{.tfx})

@item 
@geindex RFC; RFC 4047
RFC 4047@footnote{https://datatracker.ietf.org/doc/html/rfc4047.html}: Flexible Image Transport System (@code{.fits})

@item 
@geindex RFC; RFC 7903
RFC 7903@footnote{https://datatracker.ietf.org/doc/html/rfc7903.html}: Enhanced Metafile (@code{.emf}) and Windows Metafile (@code{.wmf})
@end itemize

@subsubheading Other MIME type additions and changes



@itemize *

@item 
@geindex RFC; RFC 2361
RFC 2361@footnote{https://datatracker.ietf.org/doc/html/rfc2361.html}: Change type for @code{.avi} to @code{video/vnd.avi}
and for @code{.wav} to @code{audio/vnd.wave}

@item 
@geindex RFC; RFC 4337
RFC 4337@footnote{https://datatracker.ietf.org/doc/html/rfc4337.html}: Add MPEG-4 @code{audio/mp4} (@code{.m4a})

@item 
@geindex RFC; RFC 5334
RFC 5334@footnote{https://datatracker.ietf.org/doc/html/rfc5334.html}: Add Ogg media (@code{.oga}, @code{.ogg} and @code{.ogx})

@item 
@geindex RFC; RFC 6713
RFC 6713@footnote{https://datatracker.ietf.org/doc/html/rfc6713.html}: Add gzip @code{application/gzip} (@code{.gz})

@item 
@geindex RFC; RFC 9639
RFC 9639@footnote{https://datatracker.ietf.org/doc/html/rfc9639.html}: Add FLAC @code{audio/flac} (@code{.flac})

@item 
@geindex RFC; RFC 9512
RFC 9512@footnote{https://datatracker.ietf.org/doc/html/rfc9512.html} @code{application/yaml} MIME type for YAML files (@code{.yaml}
and @code{.yml})

@item 
Add 7z @code{application/x-7z-compressed} (@code{.7z})

@item 
Add Android Package @code{application/vnd.android.package-archive} (@code{.apk})
when not strict

@item 
Add deb @code{application/x-debian-package} (@code{.deb})

@item 
Add glTF binary @code{model/gltf-binary} (@code{.glb})

@item 
Add glTF JSON/ASCII @code{model/gltf+json} (@code{.gltf})

@item 
Add M4V @code{video/x-m4v} (@code{.m4v})

@item 
Add PHP @code{application/x-httpd-php} (@code{.php})

@item 
Add RAR @code{application/vnd.rar} (@code{.rar})

@item 
Add RPM @code{application/x-rpm} (@code{.rpm})

@item 
Add STL @code{model/stl} (@code{.stl})

@item 
Add Windows Media Video @code{video/x-ms-wmv} (@code{.wmv})

@item 
De facto: Add WebM @code{audio/webm} (@code{.weba})

@item 
ECMA-376@footnote{https://ecma-international.org/publications-and-standards/standards/ecma-376/}:
Add @code{.docx}, @code{.pptx} and @code{.xlsx} types

@item 
OASIS@footnote{https://docs.oasis-open.org/office/v1.2/cs01/OpenDocument-v1.2-cs01-part1.html#Appendix_C}:
Add OpenDocument @code{.odg}, @code{.odp}, @code{.ods} and @code{.odt} types

@item 
W3C@footnote{https://www.w3.org/TR/epub-33/#app-media-type}:
Add EPUB @code{application/epub+zip} (@code{.epub})
@end itemize

(Contributed by Sahil Prajapati and Hugo van Kemenade in gh-84852@footnote{https://github.com/python/cpython/issues/84852},
by Sasha “Nelie” Chernykh and Hugo van Kemenade in gh-132056@footnote{https://github.com/python/cpython/issues/132056},
and by Hugo van Kemenade in gh-89416@footnote{https://github.com/python/cpython/issues/89416}, gh-85957@footnote{https://github.com/python/cpython/issues/85957}, and gh-129965@footnote{https://github.com/python/cpython/issues/129965}.)
@end itemize

@node multiprocessing,operator,mimetypes,Improved modules
@anchor{whatsnew/3 14 multiprocessing}@anchor{24a}
@subsubsection multiprocessing

@anchor{whatsnew/3 14 whatsnew314-multiprocessing-start-method}@anchor{24b}

@itemize *

@item 
On Unix platforms other than macOS, @ref{1d6,,‘forkserver’} is now the default @ref{1d7,,start method}
(replacing @ref{1d9,,‘fork’}).
This change does not affect Windows or macOS, where @ref{1da,,‘spawn’} remains the default start method.

If the threading incompatible `fork' method is required, you must explicitly
request it via a context from @ref{24c,,get_context()} (preferred)
or change the default via @ref{24d,,set_start_method()}.

See @ref{1db,,forkserver restrictions}
for information and differences with the `fork' method and how this change
may affect existing code with mutable global shared variables and/or shared
objects that can not be automatically @ref{ab,,pickled}.

(Contributed by Gregory P. Smith in gh-84559@footnote{https://github.com/python/cpython/issues/84559}.)

@item 
@ref{98,,multiprocessing}’s @code{'forkserver'} start method now authenticates
its control socket to avoid solely relying on filesystem permissions
to restrict what other processes could cause the forkserver to spawn workers
and run code.
(Contributed by Gregory P. Smith for gh-97514@footnote{https://github.com/python/cpython/issues/97514}.)

@item 
The @ref{24e,,multiprocessing proxy objects}
for `list' and `dict' types gain previously overlooked missing methods:

@quotation


@itemize *

@item 
@code{clear()} and @code{copy()} for proxies of @ref{24f,,list}

@item 
@ref{250,,fromkeys()}, @code{reversed(d)}, @code{d | @{@}}, @code{@{@} | d},
@code{d |= @{'b': 2@}} for proxies of @ref{184,,dict}
@end itemize
@end quotation

(Contributed by Roy Hyunjin Han for gh-103134@footnote{https://github.com/python/cpython/issues/103134}.)

@item 
Add support for shared @ref{185,,set} objects via
@ref{251,,SyncManager.set()}.
The @ref{185,,set()} in @ref{252,,Manager()} method is now available.
(Contributed by Mingyu Park in gh-129949@footnote{https://github.com/python/cpython/issues/129949}.)

@item 
Add the @ref{253,,interrupt()}
to @ref{254,,multiprocessing.Process} objects, which terminates the child
process by sending @ref{255,,SIGINT}. This enables
@ref{1b1,,finally} clauses to print a stack trace for the terminated
process. (Contributed by Artem Pulkin in gh-131913@footnote{https://github.com/python/cpython/issues/131913}.)
@end itemize

@node operator,os,multiprocessing,Improved modules
@anchor{whatsnew/3 14 operator}@anchor{256}
@subsubsection operator



@itemize *

@item 
Add @ref{257,,is_none()} and @ref{258,,is_not_none()} as a pair
of functions, such that @code{operator.is_none(obj)} is equivalent
to @code{obj is None} and @code{operator.is_not_none(obj)} is equivalent
to @code{obj is not None}.
(Contributed by Raymond Hettinger and Nico Mexis in gh-115808@footnote{https://github.com/python/cpython/issues/115808}.)
@end itemize

@node os,os path,operator,Improved modules
@anchor{whatsnew/3 14 os}@anchor{259}
@subsubsection os



@itemize *

@item 
Add the @ref{25a,,reload_environ()} function to update @ref{25b,,os.environ} and
@ref{25c,,os.environb} with changes to the environment made by
@ref{25d,,os.putenv()}, by @ref{25e,,os.unsetenv()}, or made outside Python in the
same process.
(Contributed by Victor Stinner in gh-120057@footnote{https://github.com/python/cpython/issues/120057}.)

@item 
Add the @ref{25f,,SCHED_DEADLINE} and @ref{260,,SCHED_NORMAL} constants
to the @code{os} module.
(Contributed by James Roy in gh-127688@footnote{https://github.com/python/cpython/issues/127688}.)

@item 
Add the @ref{261,,readinto()} function to read into a
@ref{262,,buffer object} from a file descriptor.
(Contributed by Cody Maloney in gh-129205@footnote{https://github.com/python/cpython/issues/129205}.)
@end itemize

@node os path,pathlib,os,Improved modules
@anchor{whatsnew/3 14 os-path}@anchor{263}
@subsubsection os.path



@itemize *

@item 
The `strict' parameter to @ref{264,,realpath()} accepts a new value,
@ref{265,,ALLOW_MISSING}.
If used, errors other than @ref{266,,FileNotFoundError} will be re-raised;
the resulting path can be missing but it will be free of symlinks.
(Contributed by Petr Viktorin for 
@geindex Common Vulnerabilities and Exposures; CVE 2025-4517
CVE 2025-4517@footnote{https://www.cve.org/CVERecord?id=CVE-2025-4517}.)
@end itemize

@node pathlib,pdb,os path,Improved modules
@anchor{whatsnew/3 14 pathlib}@anchor{267}
@subsubsection pathlib



@itemize *

@item 
Add methods to @ref{268,,pathlib.Path} to recursively copy or move files and
directories:


@itemize *

@item 
@ref{269,,copy()} copies a file or directory tree to a destination.

@item 
@ref{26a,,copy_into()} copies `into' a destination directory.

@item 
@ref{26b,,move()} moves a file or directory tree to a destination.

@item 
@ref{26c,,move_into()} moves `into' a destination directory.
@end itemize

(Contributed by Barney Gale in gh-73991@footnote{https://github.com/python/cpython/issues/73991}.)

@item 
Add the @ref{26d,,info} attribute, which stores an object
implementing the new @ref{26e,,pathlib.types.PathInfo} protocol. The
object supports querying the file type and internally caching
@ref{26f,,stat()} results. Path objects generated by
@ref{270,,iterdir()} are initialized with file type information
gleaned from scanning the parent directory.
(Contributed by Barney Gale in gh-125413@footnote{https://github.com/python/cpython/issues/125413}.)
@end itemize

@node pdb,pickle,pathlib,Improved modules
@anchor{whatsnew/3 14 pdb}@anchor{271}
@subsubsection pdb



@itemize *

@item 
The @ref{aa,,pdb} module now supports remote attaching to a running Python process
using a new @ref{272,,-p PID} command-line option:

@example
python -m pdb -p 1234
@end example

This will connect to the Python process with the given PID and allow you to
debug it interactively. Notice that due to how the Python interpreter works
attaching to a remote process that is blocked in a system call or waiting for
I/O will only work once the next bytecode instruction is executed or when the
process receives a signal.

This feature uses @ref{14f,,PEP 768}
and the new @ref{16e,,sys.remote_exec()} function to attach to the remote process
and send the PDB commands to it.

(Contributed by Matt Wozniski and Pablo Galindo in gh-131591@footnote{https://github.com/python/cpython/issues/131591}.)

@item 
Hardcoded breakpoints (@ref{273,,breakpoint()} and @ref{274,,set_trace()}) now
reuse the most recent @ref{275,,Pdb} instance that calls
@ref{276,,set_trace()}, instead of creating a new one each time.
As a result, all the instance specific data like @ref{277,,display} and
@ref{278,,commands} are preserved across hardcoded breakpoints.
(Contributed by Tian Gao in gh-121450@footnote{https://github.com/python/cpython/issues/121450}.)

@item 
Add a new argument `mode' to @ref{275,,pdb.Pdb}. Disable the @code{restart}
command when @ref{aa,,pdb} is in @code{inline} mode.
(Contributed by Tian Gao in gh-123757@footnote{https://github.com/python/cpython/issues/123757}.)

@item 
A confirmation prompt will be shown when the user tries to quit @ref{aa,,pdb}
in @code{inline} mode. @code{y}, @code{Y}, @code{<Enter>} or @code{EOF} will confirm
the quit and call @ref{279,,sys.exit()}, instead of raising @ref{27a,,bdb.BdbQuit}.
(Contributed by Tian Gao in gh-124704@footnote{https://github.com/python/cpython/issues/124704}.)

@item 
Inline breakpoints like @ref{273,,breakpoint()} or @ref{274,,pdb.set_trace()} will
always stop the program at calling frame, ignoring the @code{skip} pattern
(if any).
(Contributed by Tian Gao in gh-130493@footnote{https://github.com/python/cpython/issues/130493}.)

@item 
@code{<tab>} at the beginning of the line in @ref{aa,,pdb} multi-line input will
fill in a 4-space indentation now, instead of inserting a @code{\t} character.
(Contributed by Tian Gao in gh-130471@footnote{https://github.com/python/cpython/issues/130471}.)

@item 
Auto-indent is introduced in @ref{aa,,pdb} multi-line input. It will either
keep the indentation of the last line or insert a 4-space indentation when
it detects a new code block.
(Contributed by Tian Gao in gh-133350@footnote{https://github.com/python/cpython/issues/133350}.)

@item 
@code{$_asynctask} is added to access the current asyncio task if applicable.
(Contributed by Tian Gao in gh-124367@footnote{https://github.com/python/cpython/issues/124367}.)

@item 
@ref{27b,,pdb.set_trace_async()} is added to support debugging asyncio
coroutines. @ref{18e,,await} statements are supported with this
function.
(Contributed by Tian Gao in gh-132576@footnote{https://github.com/python/cpython/issues/132576}.)

@item 
Source code displayed in @ref{aa,,pdb} will be syntax-highlighted. This feature
can be controlled using the same methods as the default @ref{1b7,,interactive}
shell, in addition to the newly added @code{colorize} argument of @ref{275,,pdb.Pdb}.
(Contributed by Tian Gao and Łukasz Langa in gh-133355@footnote{https://github.com/python/cpython/issues/133355}.)
@end itemize

@node pickle,platform,pdb,Improved modules
@anchor{whatsnew/3 14 pickle}@anchor{27c}
@subsubsection pickle



@itemize *

@item 
Set the default protocol version on the @ref{ab,,pickle} module to 5.
For more details, see @ref{27d,,pickle protocols}.

@item 
Add exception notes for pickle serialization errors that allow
identifying the source of the error.
(Contributed by Serhiy Storchaka in gh-122213@footnote{https://github.com/python/cpython/issues/122213}.)
@end itemize

@node platform,pydoc,pickle,Improved modules
@anchor{whatsnew/3 14 platform}@anchor{27e}
@subsubsection platform



@itemize *

@item 
Add @ref{27f,,invalidate_caches()}, a function to invalidate
cached results in the @code{platform} module.
(Contributed by Bénédikt Tran in gh-122549@footnote{https://github.com/python/cpython/issues/122549}.)
@end itemize

@node pydoc,re,platform,Improved modules
@anchor{whatsnew/3 14 pydoc}@anchor{280}
@subsubsection pydoc



@itemize *

@item 
@ref{15d,,Annotations} in help output are now usually
displayed in a format closer to that in the original source.
(Contributed by Jelle Zijlstra in gh-101552@footnote{https://github.com/python/cpython/issues/101552}.)
@end itemize

@node re,socket,pydoc,Improved modules
@anchor{whatsnew/3 14 re}@anchor{281}
@subsubsection re



@itemize *

@item 
Support @code{\z} as a synonym for @code{\Z} in @ref{be,,regular expressions}.
It is interpreted unambiguously in many other regular expression engines,
unlike @code{\Z}, which has subtly different behavior.
(Contributed by Serhiy Storchaka in gh-133306@footnote{https://github.com/python/cpython/issues/133306}.)

@item 
@code{\B} in @ref{be,,regular expression} now matches the empty input string,
meaning that it is now always the opposite of @code{\b}.
(Contributed by Serhiy Storchaka in gh-124130@footnote{https://github.com/python/cpython/issues/124130}.)
@end itemize

@node socket,ssl,re,Improved modules
@anchor{whatsnew/3 14 socket}@anchor{282}
@subsubsection socket



@itemize *

@item 
Improve and fix support for Bluetooth sockets.


@itemize *

@item 
Fix support of Bluetooth sockets on NetBSD and DragonFly BSD.
(Contributed by Serhiy Storchaka in gh-132429@footnote{https://github.com/python/cpython/issues/132429}.)

@item 
Fix support for @ref{283,,BTPROTO_HCI} on FreeBSD.
(Contributed by Victor Stinner in gh-111178@footnote{https://github.com/python/cpython/issues/111178}.)

@item 
Add support for @ref{284,,BTPROTO_SCO} on FreeBSD.
(Contributed by Serhiy Storchaka in gh-85302@footnote{https://github.com/python/cpython/issues/85302}.)

@item 
Add support for `cid' and `bdaddr_type' in the address for
@ref{285,,BTPROTO_L2CAP} on FreeBSD.
(Contributed by Serhiy Storchaka in gh-132429@footnote{https://github.com/python/cpython/issues/132429}.)

@item 
Add support for `channel' in the address for
@ref{283,,BTPROTO_HCI} on Linux.
(Contributed by Serhiy Storchaka in gh-70145@footnote{https://github.com/python/cpython/issues/70145}.)

@item 
Accept an integer as the address for
@ref{283,,BTPROTO_HCI} on Linux.
(Contributed by Serhiy Storchaka in gh-132099@footnote{https://github.com/python/cpython/issues/132099}.)

@item 
Return `cid' in @ref{286,,getsockname()} for
@ref{285,,BTPROTO_L2CAP}.
(Contributed by Serhiy Storchaka in gh-132429@footnote{https://github.com/python/cpython/issues/132429}.)

@item 
Add many new constants.
(Contributed by Serhiy Storchaka in gh-132734@footnote{https://github.com/python/cpython/issues/132734}.)
@end itemize
@end itemize

@node ssl,struct,socket,Improved modules
@anchor{whatsnew/3 14 ssl}@anchor{287}
@subsubsection ssl



@itemize *

@item 
Indicate through the @ref{288,,HAS_PHA} Boolean whether the @code{ssl}
module supports TLSv1.3 post-handshake client authentication (PHA).
(Contributed by Will Childs-Klein in gh-128036@footnote{https://github.com/python/cpython/issues/128036}.)
@end itemize

@node struct,symtable,ssl,Improved modules
@anchor{whatsnew/3 14 struct}@anchor{289}
@subsubsection struct



@itemize *

@item 
Support the float complex and double complex C types in
the @ref{db,,struct} module (formatting characters @code{'F'} and @code{'D'}
respectively).
(Contributed by Sergey B Kirpichev in gh-121249@footnote{https://github.com/python/cpython/issues/121249}.)
@end itemize

@node symtable,sys,struct,Improved modules
@anchor{whatsnew/3 14 symtable}@anchor{28a}
@subsubsection symtable



@itemize *

@item 
Expose the following @ref{28b,,Symbol} methods:


@itemize *

@item 
@ref{28c,,is_comp_cell()}

@item 
@ref{28d,,is_comp_iter()}

@item 
@ref{28e,,is_free_class()}
@end itemize

(Contributed by Bénédikt Tran in gh-120029@footnote{https://github.com/python/cpython/issues/120029}.)
@end itemize

@node sys,sys monitoring,symtable,Improved modules
@anchor{whatsnew/3 14 sys}@anchor{28f}
@subsubsection sys



@itemize *

@item 
The previously undocumented special function @ref{290,,sys.getobjects()},
which only exists in specialized builds of Python, may now return objects
from other interpreters than the one it’s called in.
(Contributed by Eric Snow in gh-125286@footnote{https://github.com/python/cpython/issues/125286}.)

@item 
Add @ref{291,,sys._is_immortal()} for determining if an object is @ref{292,,immortal}.
(Contributed by Peter Bierma in gh-128509@footnote{https://github.com/python/cpython/issues/128509}.)

@item 
On FreeBSD, @ref{293,,sys.platform} no longer contains the major version number.
It is always @code{'freebsd'}, instead of @code{'freebsd13'} or @code{'freebsd14'}.
(Contributed by Michael Osipov in gh-129393@footnote{https://github.com/python/cpython/issues/129393}.)

@item 
Raise @ref{1a4,,DeprecationWarning} for @ref{294,,sys._clear_type_cache()}. This
function was deprecated in Python 3.13 but it didn’t raise a runtime warning.

@item 
Add @ref{16e,,sys.remote_exec()} to implement the new external debugger interface.
See @ref{14f,,PEP 768} for details.
(Contributed by Pablo Galindo Salgado, Matt Wozniski, and Ivona Stojanovic
in gh-131591@footnote{https://github.com/python/cpython/issues/131591}.)

@item 
Add the @ref{295,,sys._jit} namespace, containing utilities for introspecting
just-in-time compilation.
(Contributed by Brandt Bucher in gh-133231@footnote{https://github.com/python/cpython/issues/133231}.)
@end itemize

@node sys monitoring,sysconfig,sys,Improved modules
@anchor{whatsnew/3 14 sys-monitoring}@anchor{296}
@subsubsection sys.monitoring



@itemize *

@item 
Add two new monitoring events, @ref{297,,BRANCH_LEFT} and
@ref{298,,BRANCH_RIGHT}.
These replace and deprecate the @code{BRANCH} event.
(Contributed by Mark Shannon in gh-122548@footnote{https://github.com/python/cpython/issues/122548}.)
@end itemize

@node sysconfig,tarfile,sys monitoring,Improved modules
@anchor{whatsnew/3 14 sysconfig}@anchor{299}
@subsubsection sysconfig



@itemize *

@item 
Add @code{ABIFLAGS} key to @ref{29a,,get_config_vars()} on Windows.
(Contributed by Xuehai Pan in gh-131799@footnote{https://github.com/python/cpython/issues/131799}.)
@end itemize

@node tarfile,threading,sysconfig,Improved modules
@anchor{whatsnew/3 14 tarfile}@anchor{29b}
@subsubsection tarfile



@itemize *

@item 
@ref{29c,,data_filter()} now normalizes symbolic link targets in order to
avoid path traversal attacks.
(Contributed by Petr Viktorin in gh-127987@footnote{https://github.com/python/cpython/issues/127987} and 
@geindex Common Vulnerabilities and Exposures; CVE 2025-4138
CVE 2025-4138@footnote{https://www.cve.org/CVERecord?id=CVE-2025-4138}.)

@item 
@ref{29d,,extractall()} now skips fixing up directory attributes
when a directory was removed or replaced by another kind of file.
(Contributed by Petr Viktorin in gh-127987@footnote{https://github.com/python/cpython/issues/127987} and 
@geindex Common Vulnerabilities and Exposures; CVE 2024-12718
CVE 2024-12718@footnote{https://www.cve.org/CVERecord?id=CVE-2024-12718}.)

@item 
@ref{29e,,extract()} and @ref{29d,,extractall()}
now (re-)apply the extraction filter when substituting a link (hard or
symbolic) with a copy of another archive member, and when fixing up
directory attributes.
The former raises a new exception, @ref{29f,,LinkFallbackError}.
(Contributed by Petr Viktorin for 
@geindex Common Vulnerabilities and Exposures; CVE 2025-4330
CVE 2025-4330@footnote{https://www.cve.org/CVERecord?id=CVE-2025-4330} and 
@geindex Common Vulnerabilities and Exposures; CVE 2024-12718
CVE 2024-12718@footnote{https://www.cve.org/CVERecord?id=CVE-2024-12718}.)

@item 
@ref{29e,,extract()} and @ref{29d,,extractall()}
no longer extract rejected members when
@ref{2a0,,errorlevel()} is zero.
(Contributed by Matt Prodani and Petr Viktorin in gh-112887@footnote{https://github.com/python/cpython/issues/112887}
and 
@geindex Common Vulnerabilities and Exposures; CVE 2025-4435
CVE 2025-4435@footnote{https://www.cve.org/CVERecord?id=CVE-2025-4435}.)
@end itemize

@node threading,tkinter,tarfile,Improved modules
@anchor{whatsnew/3 14 threading}@anchor{2a1}
@subsubsection threading



@itemize *

@item 
@ref{179,,threading.Thread.start()} now sets the operating system thread name
to @ref{2a2,,threading.Thread.name}.
(Contributed by Victor Stinner in gh-59705@footnote{https://github.com/python/cpython/issues/59705}.)
@end itemize

@node tkinter,turtle,threading,Improved modules
@anchor{whatsnew/3 14 tkinter}@anchor{2a3}
@subsubsection tkinter



@itemize *

@item 
Make @ref{f6,,tkinter} widget methods @code{after()} and @code{after_idle()}
accept keyword arguments.
(Contributed by Zhikang Yan in gh-126899@footnote{https://github.com/python/cpython/issues/126899}.)

@item 
Add ability to specify a name for @code{tkinter.OptionMenu} and
@code{tkinter.ttk.OptionMenu}.
(Contributed by Zhikang Yan in gh-130482@footnote{https://github.com/python/cpython/issues/130482}.)
@end itemize

@node turtle,types,tkinter,Improved modules
@anchor{whatsnew/3 14 turtle}@anchor{2a4}
@subsubsection turtle



@itemize *

@item 
Add context managers for @ref{2a5,,turtle.fill()}, @ref{2a6,,turtle.poly()},
and @ref{2a7,,turtle.no_animation()}.
(Contributed by Marie Roald and Yngve Mardal Moe in gh-126350@footnote{https://github.com/python/cpython/issues/126350}.)
@end itemize

@node types,typing,turtle,Improved modules
@anchor{whatsnew/3 14 types}@anchor{2a8}
@subsubsection types



@itemize *

@item 
@ref{2a9,,types.UnionType} is now an alias for @ref{2aa,,typing.Union}.
See @ref{2ab,,below} for more details.
(Contributed by Jelle Zijlstra in gh-105499@footnote{https://github.com/python/cpython/issues/105499}.)
@end itemize

@node typing,unicodedata,types,Improved modules
@anchor{whatsnew/3 14 typing}@anchor{2ac}
@subsubsection typing

@anchor{whatsnew/3 14 whatsnew314-typing-union}@anchor{2ab}

@itemize *

@item 
The @ref{2a9,,types.UnionType} and @ref{2aa,,typing.Union} types are now
aliases for each other, meaning that both old-style unions
(created with @code{Union[int, str]}) and new-style unions (@code{int | str})
now create instances of the same runtime type. This unifies the behavior
between the two syntaxes, but leads to some differences in behavior that
may affect users who introspect types at runtime:


@itemize -

@item 
Both syntaxes for creating a union now produce the same string
representation in @ref{1c3,,repr()}.
For example, @code{repr(Union[int, str])} is now @code{"int | str"} instead of
@code{"typing.Union[int, str]"}.

@item 
Unions created using the old syntax are no longer cached.
Previously, running @code{Union[int, str]} multiple times would return
the same object (@code{Union[int, str] is Union[int, str]} would be @code{True}),
but now it will return two different objects.
Use @code{==} to compare unions for equality, not @code{is}.
New-style unions have never been cached this way.
This change could increase memory usage for some programs that use
a large number of unions created by subscripting @code{typing.Union}.
However, several factors offset this cost:
unions used in annotations are no longer evaluated by default in Python
3.14 because of 
@geindex Python Enhancement Proposals; PEP 649
PEP 649@footnote{https://peps.python.org/pep-0649/}; an instance of @ref{2a9,,types.UnionType} is
itself much smaller than the object returned by @code{Union[]} was on prior
Python versions; and removing the cache also saves some space.
It is therefore unlikely that this change will cause a significant increase
in memory usage for most users.

@item 
Previously, old-style unions were implemented using the private class
@code{typing._UnionGenericAlias}.
This class is no longer needed for the implementation,
but it has been retained for backward compatibility,
with removal scheduled for Python 3.17.
Users should use documented introspection helpers like
@ref{2ad,,get_origin()} and @ref{2ae,,typing.get_args()} instead of
relying on private implementation details.

@item 
It is now possible to use @ref{2aa,,typing.Union} itself in
@ref{2af,,isinstance()} checks.
For example, @code{isinstance(int | str, typing.Union)} will return @code{True};
previously this raised @ref{199,,TypeError}.

@item 
The @code{__args__} attribute of @ref{2aa,,typing.Union} objects is
no longer writable.

@item 
It is no longer possible to set any attributes on @ref{2aa,,Union}
objects.
This only ever worked for dunder attributes on previous versions, was never
documented to work, and was subtly broken in many cases.
@end itemize

(Contributed by Jelle Zijlstra in gh-105499@footnote{https://github.com/python/cpython/issues/105499}.)

@item 
@ref{2b0,,TypeAliasType} now supports star unpacking.
@end itemize

@node unicodedata,unittest,typing,Improved modules
@anchor{whatsnew/3 14 unicodedata}@anchor{2b1}
@subsubsection unicodedata



@itemize *

@item 
The Unicode database has been updated to Unicode 16.0.0.
@end itemize

@node unittest,urllib,unicodedata,Improved modules
@anchor{whatsnew/3 14 unittest}@anchor{2b2}
@subsubsection unittest

@anchor{whatsnew/3 14 whatsnew314-color-unittest}@anchor{2b3}

@itemize *

@item 
@ref{10d,,unittest} output is now colored by default.
This can be controlled by @ref{1b9,,environment variables}.
(Contributed by Hugo van Kemenade in gh-127221@footnote{https://github.com/python/cpython/issues/127221}.)

@item 
unittest discovery supports @ref{2b4,,namespace package} as start
directory again. It was removed in Python 3.11.
(Contributed by Jacob Walls in gh-80958@footnote{https://github.com/python/cpython/issues/80958}.)

@item 
A number of new methods were added in the @ref{2b5,,TestCase} class
that provide more specialized tests.


@itemize -

@item 
@ref{2b6,,assertHasAttr()} and
@ref{2b7,,assertNotHasAttr()} check whether the object
has a particular attribute.

@item 
@ref{2b8,,assertIsSubclass()} and
@ref{2b9,,assertNotIsSubclass()} check whether the object
is a subclass of a particular class, or of one of a tuple of classes.

@item 
@ref{2ba,,assertStartsWith()},
@ref{2bb,,assertNotStartsWith()},
@ref{2bc,,assertEndsWith()} and
@ref{2bd,,assertNotEndsWith()} check whether the Unicode
or byte string starts or ends with particular strings.
@end itemize

(Contributed by Serhiy Storchaka in gh-71339@footnote{https://github.com/python/cpython/issues/71339}.)
@end itemize

@node urllib,uuid,unittest,Improved modules
@anchor{whatsnew/3 14 urllib}@anchor{2be}
@subsubsection urllib



@itemize *

@item 
Upgrade HTTP digest authentication algorithm for @ref{112,,urllib.request} by
supporting SHA-256 digest authentication as specified in 
@geindex RFC; RFC 7616
RFC 7616@footnote{https://datatracker.ietf.org/doc/html/rfc7616.html}.
(Contributed by Calvin Bui in gh-128193@footnote{https://github.com/python/cpython/issues/128193}.)

@item 
Improve ergonomics and standards compliance when parsing and emitting
@code{file:} URLs.

In @ref{2bf,,url2pathname()}:


@itemize -

@item 
Accept a complete URL when the new `require_scheme' argument is set to
true.

@item 
Discard URL authority if it matches the local hostname.

@item 
Discard URL authority if it resolves to a local IP address when the new
`resolve_host' argument is set to true.

@item 
Discard URL query and fragment components.

@item 
Raise @ref{2c0,,URLError} if a URL authority isn’t local,
except on Windows where we return a UNC path as before.
@end itemize

In @ref{2c1,,pathname2url()}:


@itemize -

@item 
Return a complete URL when the new `add_scheme' argument is set to true.

@item 
Include an empty URL authority when a path begins with a slash. For
example, the path @code{/etc/hosts} is converted to the URL @code{///etc/hosts}.
@end itemize

On Windows, drive letters are no longer converted to uppercase, and @code{:}
characters not following a drive letter no longer cause an @ref{2c2,,OSError}
exception to be raised.

(Contributed by Barney Gale in gh-125866@footnote{https://github.com/python/cpython/issues/125866}.)
@end itemize

@node uuid,webbrowser,urllib,Improved modules
@anchor{whatsnew/3 14 uuid}@anchor{2c3}
@subsubsection uuid



@itemize *

@item 
Add support for UUID versions 6, 7, and 8 via @ref{2c4,,uuid6()},
@ref{2c5,,uuid7()}, and @ref{2c6,,uuid8()} respectively, as specified
in 
@geindex RFC; RFC 9562
RFC 9562@footnote{https://datatracker.ietf.org/doc/html/rfc9562.html}.
(Contributed by Bénédikt Tran in gh-89083@footnote{https://github.com/python/cpython/issues/89083}.)

@item 
@ref{2c7,,NIL} and @ref{2c8,,MAX} are now available to represent the
Nil and Max UUID formats as defined by 
@geindex RFC; RFC 9562
RFC 9562@footnote{https://datatracker.ietf.org/doc/html/rfc9562.html}.
(Contributed by Nick Pope in gh-128427@footnote{https://github.com/python/cpython/issues/128427}.)

@item 
Allow generating multiple UUIDs simultaneously on the command-line via
@ref{2c9,,python -m uuid --count}.
(Contributed by Simon Legner in gh-131236@footnote{https://github.com/python/cpython/issues/131236}.)
@end itemize

@node webbrowser,zipfile,uuid,Improved modules
@anchor{whatsnew/3 14 webbrowser}@anchor{2ca}
@subsubsection webbrowser



@itemize *

@item 
Names in the 
@geindex BROWSER
@geindex environment variable; BROWSER
@code{BROWSER} environment variable can now refer to already
registered browsers for the @ref{11c,,webbrowser} module, instead of always
generating a new browser command.

This makes it possible to set 
@geindex BROWSER
@geindex environment variable; BROWSER
@code{BROWSER} to the value of one of the
supported browsers on macOS.
@end itemize

@node zipfile,,webbrowser,Improved modules
@anchor{whatsnew/3 14 zipfile}@anchor{2cb}
@subsubsection zipfile



@itemize *

@item 
Added @ref{2cc,,ZipInfo._for_archive}, a method
to resolve suitable defaults for a @ref{2cd,,ZipInfo} object
as used by @ref{2ce,,ZipFile.writestr}.
(Contributed by Bénédikt Tran in gh-123424@footnote{https://github.com/python/cpython/issues/123424}.)

@item 
@ref{2ce,,ZipFile.writestr()} now respects the 
@geindex SOURCE_DATE_EPOCH
@geindex environment variable; SOURCE_DATE_EPOCH
@code{SOURCE_DATE_EPOCH}
environment variable in order to better support reproducible builds.
(Contributed by Jiahao Li in gh-91279@footnote{https://github.com/python/cpython/issues/91279}.)
@end itemize

@c Add improved modules above alphabetically, not here at the end.

@node Optimizations,Removed,Improved modules,What’s new in Python 3 14
@anchor{whatsnew/3 14 optimizations}@anchor{2cf}
@subsection Optimizations



@itemize *

@item 
The import time for several standard library modules has been improved,
including @ref{6,,annotationlib}, @ref{9,,ast}, @ref{b,,asyncio}, @ref{f,,base64},
@ref{1a,,cmd}, @ref{2d,,csv}, @ref{67,,gettext}, @ref{81,,importlib.util}, @ref{8a,,locale},
@ref{93,,mimetypes}, @ref{a4,,optparse}, @ref{ab,,pickle}, @ref{b3,,pprint},
@ref{b5,,pstats}, @ref{c9,,shlex}, @ref{d1,,socket}, @ref{d8,,string}, @ref{dc,,subprocess},
@ref{f3,,threading}, @ref{103,,tomllib}, @ref{10a,,types}, and @ref{138,,zipfile}.

(Contributed by Adam Turner, Bénédikt Tran, Chris Markiewicz, Eli Schwartz,
Hugo van Kemenade, Jelle Zijlstra, and others in gh-118761@footnote{https://github.com/python/cpython/issues/118761}.)

@item 
The interpreter now avoids some reference count modifications internally
when it’s safe to do so.
This can lead to different values being returned from @ref{2d0,,sys.getrefcount()}
and @ref{2d1,,Py_REFCNT()} compared to previous versions of Python.
See @ref{2d2,,below} for details.
@end itemize

@menu
* asyncio: asyncio<2>. 
* base64:: 
* bdb:: 
* difflib: difflib<2>. 
* gc:: 
* io: io<2>. 
* pathlib: pathlib<2>. 
* pdb: pdb<2>. 
* textwrap:: 
* uuid: uuid<2>. 
* zlib:: 

@end menu

@node asyncio<2>,base64,,Optimizations
@anchor{whatsnew/3 14 id2}@anchor{2d3}
@subsubsection asyncio



@itemize *

@item 
Standard benchmark results have improved by 10-20% following the
implementation of a new per-thread doubly linked list
for @ref{1c9,,native tasks},
also reducing memory usage.
This enables external introspection tools such as
@ref{148,,python -m asyncio pstree}
to introspect the call graph of asyncio tasks running in all threads.
(Contributed by Kumar Aditya in gh-107803@footnote{https://github.com/python/cpython/issues/107803}.)

@item 
The module now has first class support for
@ref{1f6,,free-threading builds}.
This enables parallel execution of multiple event loops across
different threads, scaling linearly with the number of threads.
(Contributed by Kumar Aditya in gh-128002@footnote{https://github.com/python/cpython/issues/128002}.)
@end itemize

@node base64,bdb,asyncio<2>,Optimizations
@anchor{whatsnew/3 14 base64}@anchor{2d4}
@subsubsection base64



@itemize *

@item 
@ref{2d5,,b16decode()} is now up to six times faster.
(Contributed by Bénédikt Tran, Chris Markiewicz, and Adam Turner
in gh-118761@footnote{https://github.com/python/cpython/issues/118761}.)
@end itemize

@node bdb,difflib<2>,base64,Optimizations
@anchor{whatsnew/3 14 bdb}@anchor{2d6}
@subsubsection bdb



@itemize *

@item 
The basic debugger now has a @ref{e0,,sys.monitoring}-based backend,
which can be selected via the passing @code{'monitoring'}
to the @ref{2d7,,Bdb} class’s new `backend' parameter.
(Contributed by Tian Gao in gh-124533@footnote{https://github.com/python/cpython/issues/124533}.)
@end itemize

@node difflib<2>,gc,bdb,Optimizations
@anchor{whatsnew/3 14 id3}@anchor{2d8}
@subsubsection difflib



@itemize *

@item 
The @ref{2d9,,IS_LINE_JUNK()} function is now up to twice as fast.
(Contributed by Adam Turner and Semyon Moroz in gh-130167@footnote{https://github.com/python/cpython/issues/130167}.)
@end itemize

@node gc,io<2>,difflib<2>,Optimizations
@anchor{whatsnew/3 14 gc}@anchor{2da}
@subsubsection gc



@itemize *

@item 
`From Python 3.14.5 onwards:'

Python 3.14.0-3.14.4 shipped with a new incremental garbage collector.
However, due to a number of reports@footnote{https://github.com/python/cpython/issues/142516}
of significant memory pressure in production environments,
it has been reverted back to the generational GC from 3.13.
This is the GC now used in Python 3.14.5 and later.

@item 
`Previously in Python 3.14.0-3.14.4:'

The new @ref{153,,incremental garbage collector}
means that maximum pause times are reduced
by an order of magnitude or more for larger heaps.

Because of this optimization, the meaning of the results of
@ref{2db,,get_threshold()} and @ref{2dc,,set_threshold()} have changed,
along with @ref{2dd,,get_count()} and @ref{2de,,get_stats()}.


@itemize -

@item 
For backwards compatibility, @ref{2db,,get_threshold()} continues to return
a three-item tuple.
The first value is the threshold for young collections, as before;
the second value determines the rate at which the old collection is scanned
(the default is 10, and higher values mean that the old collection
is scanned more slowly).
The third value is now meaningless and is always zero.

@item 
@ref{2dc,,set_threshold()} now ignores any items after the second.

@item 
@ref{2dd,,get_count()} and @ref{2de,,get_stats()} continue to return
the same format of results.
The only difference is that instead of the results referring to
the young, aging and old generations,
the results refer to the young generation
and the aging and collecting spaces of the old generation.
@end itemize

In summary, code that attempted to manipulate the behavior of the cycle GC
may not work exactly as intended, but it is very unlikely to be harmful.
All other code will work just fine.

(Contributed by Mark Shannon in gh-108362@footnote{https://github.com/python/cpython/issues/108362}.)
@end itemize

@node io<2>,pathlib<2>,gc,Optimizations
@anchor{whatsnew/3 14 id4}@anchor{2df}
@subsubsection io



@itemize *

@item 
Opening and reading files now executes fewer system calls.
Reading a small operating system cached file in full is up to 15% faster.
(Contributed by Cody Maloney and Victor Stinner
in gh-120754@footnote{https://github.com/python/cpython/issues/120754} and gh-90102@footnote{https://github.com/python/cpython/issues/90102}.)
@end itemize

@node pathlib<2>,pdb<2>,io<2>,Optimizations
@anchor{whatsnew/3 14 id5}@anchor{2e0}
@subsubsection pathlib



@itemize *

@item 
@ref{2e1,,Path.read_bytes} now uses unbuffered mode
to open files, which is between 9% and 17% faster to read in full.
(Contributed by Cody Maloney in gh-120754@footnote{https://github.com/python/cpython/issues/120754}.)
@end itemize

@node pdb<2>,textwrap,pathlib<2>,Optimizations
@anchor{whatsnew/3 14 id6}@anchor{2e2}
@subsubsection pdb



@itemize *

@item 
@ref{aa,,pdb} now supports two backends, based on either
@ref{2e3,,sys.settrace()} or @ref{e0,,sys.monitoring}.
Using the @ref{2e4,,pdb CLI} or @ref{273,,breakpoint()}
will always use the @code{sys.monitoring} backend.
Explicitly instantiating @ref{275,,pdb.Pdb} and its derived classes
will use the @code{sys.settrace()} backend by default, which is configurable.
(Contributed by Tian Gao in gh-124533@footnote{https://github.com/python/cpython/issues/124533}.)
@end itemize

@node textwrap,uuid<2>,pdb<2>,Optimizations
@anchor{whatsnew/3 14 textwrap}@anchor{2e5}
@subsubsection textwrap



@itemize *

@item 
Optimize the @ref{1aa,,dedent()} function, improving performance by
an average of 2.4x, with larger improvements for bigger inputs,
and fix a bug with incomplete normalization of blank lines with whitespace
characters other than space and tab.
@end itemize

@node uuid<2>,zlib,textwrap,Optimizations
@anchor{whatsnew/3 14 id7}@anchor{2e6}
@subsubsection uuid



@itemize *

@item 
@ref{2e7,,uuid3()} and @ref{2e8,,uuid5()} are now both roughly 40% faster
for 16-byte names and 20% faster for 1024-byte names.
Performance for longer names remains unchanged.
(Contributed by Bénédikt Tran in gh-128150@footnote{https://github.com/python/cpython/issues/128150}.)

@item 
@ref{2e9,,uuid4()} is now c. 30% faster.
(Contributed by Bénédikt Tran in gh-128150@footnote{https://github.com/python/cpython/issues/128150}.)
@end itemize

@node zlib,,uuid<2>,Optimizations
@anchor{whatsnew/3 14 zlib}@anchor{2ea}
@subsubsection zlib



@itemize *

@item 
On Windows, zlib-ng@footnote{https://github.com/zlib-ng/zlib-ng}
is now used as the implementation of the @ref{13a,,zlib} module
in the default binaries.
There are no known incompatibilities between @code{zlib-ng}
and the previously-used @code{zlib} implementation.
This should result in better performance at all compression levels.

It is worth noting that @code{zlib.Z_BEST_SPEED} (@code{1}) may result in
significantly less compression than the previous implementation,
whilst also significantly reducing the time taken to compress.

(Contributed by Steve Dower in gh-91349@footnote{https://github.com/python/cpython/issues/91349}.)
@end itemize

@node Removed,Deprecated,Optimizations,What’s new in Python 3 14
@anchor{whatsnew/3 14 removed}@anchor{2eb}
@subsection Removed


@menu
* argparse: argparse<2>. 
* ast: ast<2>. 
* asyncio: asyncio<3>. 
* email:: 
* importlib.abc: importlib abc. 
* itertools:: 
* pathlib: pathlib<3>. 
* pkgutil:: 
* pty:: 
* sqlite3:: 
* urllib: urllib<2>. 

@end menu

@node argparse<2>,ast<2>,,Removed
@anchor{whatsnew/3 14 id8}@anchor{2ec}
@subsubsection argparse



@itemize *

@item 
Remove the `type', `choices', and `metavar' parameters
of @code{BooleanOptionalAction}.
These have been deprecated since Python 3.12.
(Contributed by Nikita Sobolev in gh-118805@footnote{https://github.com/python/cpython/issues/118805}.)

@item 
Calling @ref{2ed,,add_argument_group()}
on an argument group now raises a @ref{2ee,,ValueError}.
Similarly, @code{add_argument_group()}
or @ref{2ef,,add_mutually_exclusive_group()}
on a mutually exclusive group now both raise @code{ValueError}s.
This ‘nesting’ was never supported, often failed to work correctly,
and was unintentionally exposed through inheritance.
This functionality has been deprecated since Python 3.11.
(Contributed by Savannah Ostrowski in gh-127186@footnote{https://github.com/python/cpython/issues/127186}.)
@end itemize

@node ast<2>,asyncio<3>,argparse<2>,Removed
@anchor{whatsnew/3 14 id9}@anchor{2f0}
@subsubsection ast



@itemize *

@item 
Remove the following classes, which have been deprecated aliases of
@ref{2f1,,Constant} since Python 3.8 and have emitted
deprecation warnings since Python 3.12:


@itemize *

@item 
@code{Bytes}

@item 
@code{Ellipsis}

@item 
@code{NameConstant}

@item 
@code{Num}

@item 
@code{Str}
@end itemize

As a consequence of these removals, user-defined @code{visit_Num}, @code{visit_Str},
@code{visit_Bytes}, @code{visit_NameConstant} and @code{visit_Ellipsis} methods
on custom @ref{2f2,,NodeVisitor} subclasses will no longer be called
when the @code{NodeVisitor} subclass is visiting an AST.
Define a @code{visit_Constant} method instead.

(Contributed by Alex Waygood in gh-119562@footnote{https://github.com/python/cpython/issues/119562}.)

@item 
Remove the following deprecated properties on @ref{2f1,,ast.Constant},
which were present for compatibility with the now-removed AST classes:


@itemize *

@item 
@code{Constant.n}

@item 
@code{Constant.s}
@end itemize

Use @code{Constant.value} instead.
(Contributed by Alex Waygood in gh-119562@footnote{https://github.com/python/cpython/issues/119562}.)
@end itemize

@node asyncio<3>,email,ast<2>,Removed
@anchor{whatsnew/3 14 id10}@anchor{2f3}
@subsubsection asyncio



@itemize *

@item 
Remove the following classes, methods, and functions,
which have been deprecated since Python 3.12:


@itemize *

@item 
@code{AbstractChildWatcher}

@item 
@code{FastChildWatcher}

@item 
@code{MultiLoopChildWatcher}

@item 
@code{PidfdChildWatcher}

@item 
@code{SafeChildWatcher}

@item 
@code{ThreadedChildWatcher}

@item 
@code{AbstractEventLoopPolicy.get_child_watcher()}

@item 
@code{AbstractEventLoopPolicy.set_child_watcher()}

@item 
@code{get_child_watcher()}

@item 
@code{set_child_watcher()}
@end itemize

(Contributed by Kumar Aditya in gh-120804@footnote{https://github.com/python/cpython/issues/120804}.)

@item 
@ref{2f4,,asyncio.get_event_loop()} now raises a @ref{246,,RuntimeError}
if there is no current event loop,
and no longer implicitly creates an event loop.

(Contributed by Kumar Aditya in gh-126353@footnote{https://github.com/python/cpython/issues/126353}.)

@c TODO: move these patterns to the asyncio docs?
@c quite long for What's New

There’s a few patterns that use @ref{2f4,,asyncio.get_event_loop()}, most
of them can be replaced with @ref{2f5,,asyncio.run()}.

If you’re running an async function, simply use @ref{2f5,,asyncio.run()}.

Before:

@example
async def main():
    ...


loop = asyncio.get_event_loop()
try:
    loop.run_until_complete(main())
finally:
    loop.close()
@end example

After:

@example
async def main():
    ...

asyncio.run(main())
@end example

If you need to start something, for example, a server listening on a socket
and then run forever, use @ref{2f5,,asyncio.run()} and an
@ref{2f6,,asyncio.Event}.

Before:

@example
def start_server(loop): ...

loop = asyncio.get_event_loop()
try:
    start_server(loop)
    loop.run_forever()
finally:
    loop.close()
@end example

After:

@example
def start_server(loop): ...

async def main():
    start_server(asyncio.get_running_loop())
    await asyncio.Event().wait()

asyncio.run(main())
@end example

If you need to run something in an event loop, then run some blocking
code around it, use @ref{2f7,,asyncio.Runner}.

Before:

@example
async def operation_one(): ...
def blocking_code(): ...
async def operation_two(): ...

loop = asyncio.get_event_loop()
try:
    loop.run_until_complete(operation_one())
    blocking_code()
    loop.run_until_complete(operation_two())
finally:
    loop.close()
@end example

After:

@example
async def operation_one(): ...
def blocking_code(): ...
async def operation_two(): ...

with asyncio.Runner() as runner:
    runner.run(operation_one())
    blocking_code()
    runner.run(operation_two())
@end example
@end itemize

@node email,importlib abc,asyncio<3>,Removed
@anchor{whatsnew/3 14 email}@anchor{2f8}
@subsubsection email



@itemize *

@item 
Remove @ref{2f9,,email.utils.localtime()}’s `isdst' parameter,
which was deprecated in and has been ignored since Python 3.12.
(Contributed by Hugo van Kemenade in gh-118798@footnote{https://github.com/python/cpython/issues/118798}.)
@end itemize

@node importlib abc,itertools,email,Removed
@anchor{whatsnew/3 14 importlib-abc}@anchor{2fa}
@subsubsection importlib.abc



@itemize *

@item 
Remove deprecated @ref{7c,,importlib.abc} classes:


@itemize *

@item 
@code{ResourceReader}
(use @ref{2fb,,TraversableResources})

@item 
@code{Traversable}
(use @ref{2fc,,Traversable})

@item 
@code{TraversableResources}
(use @ref{2fb,,TraversableResources})
@end itemize

(Contributed by Jason R. Coombs and Hugo van Kemenade in gh-93963@footnote{https://github.com/python/cpython/issues/93963}.)
@end itemize

@node itertools,pathlib<3>,importlib abc,Removed
@anchor{whatsnew/3 14 itertools}@anchor{2fd}
@subsubsection itertools



@itemize *

@item 
Remove support for copy, deepcopy, and pickle operations
from @ref{85,,itertools} iterators.
These have emitted a @ref{1a4,,DeprecationWarning} since Python 3.12.
(Contributed by Raymond Hettinger in gh-101588@footnote{https://github.com/python/cpython/issues/101588}.)
@end itemize

@node pathlib<3>,pkgutil,itertools,Removed
@anchor{whatsnew/3 14 id11}@anchor{2fe}
@subsubsection pathlib



@itemize *

@item 
Remove support for passing additional keyword arguments
to @ref{268,,Path}.
In previous versions, any such arguments are ignored.
(Contributed by Barney Gale in gh-74033@footnote{https://github.com/python/cpython/issues/74033}.)

@item 
Remove support for passing additional positional arguments to
@ref{2ff,,PurePath.relative_to()} and @ref{300,,is_relative_to()}.
In previous versions, any such arguments are joined onto `other'.
(Contributed by Barney Gale in gh-78707@footnote{https://github.com/python/cpython/issues/78707}.)
@end itemize

@node pkgutil,pty,pathlib<3>,Removed
@anchor{whatsnew/3 14 pkgutil}@anchor{301}
@subsubsection pkgutil



@itemize *

@item 
Remove the @code{get_loader()} and @code{find_loader()} functions,
which have been deprecated since Python 3.12.
(Contributed by Bénédikt Tran in gh-97850@footnote{https://github.com/python/cpython/issues/97850}.)
@end itemize

@node pty,sqlite3,pkgutil,Removed
@anchor{whatsnew/3 14 pty}@anchor{302}
@subsubsection pty



@itemize *

@item 
Remove the @code{master_open()} and @code{slave_open()} functions,
which have been deprecated since Python 3.12.
Use @ref{303,,pty.openpty()} instead.
(Contributed by Nikita Sobolev in gh-118824@footnote{https://github.com/python/cpython/issues/118824}.)
@end itemize

@node sqlite3,urllib<2>,pty,Removed
@anchor{whatsnew/3 14 sqlite3}@anchor{304}
@subsubsection sqlite3



@itemize *

@item 
Remove @code{version} and @code{version_info} from
the @ref{d4,,sqlite3} module;
use @ref{305,,sqlite_version} and @ref{306,,sqlite_version_info}
for the actual version number of the runtime SQLite library.
(Contributed by Hugo van Kemenade in gh-118924@footnote{https://github.com/python/cpython/issues/118924}.)

@item 
Using a sequence of parameters with named placeholders now
raises a @ref{307,,ProgrammingError},
having been deprecated since Python 3.12.
(Contributed by Erlend E. Aasland in gh-118928@footnote{https://github.com/python/cpython/issues/118928} and gh-101693@footnote{https://github.com/python/cpython/issues/101693}.)
@end itemize

@node urllib<2>,,sqlite3,Removed
@anchor{whatsnew/3 14 id12}@anchor{308}
@subsubsection urllib



@itemize *

@item 
Remove the @code{Quoter} class from @ref{111,,urllib.parse},
which has been deprecated since Python 3.11.
(Contributed by Nikita Sobolev in gh-118827@footnote{https://github.com/python/cpython/issues/118827}.)

@item 
Remove the @code{URLopener} and @code{FancyURLopener} classes
from @ref{112,,urllib.request},
which have been deprecated since Python 3.3.

@code{myopener.open()} can be replaced with @ref{309,,urlopen()}.
@code{myopener.retrieve()} can be replaced with
@ref{30a,,urlretrieve()}.
Customisations to the opener classes can be replaced by passing
customized handlers to @ref{30b,,build_opener()}.
(Contributed by Barney Gale in gh-84850@footnote{https://github.com/python/cpython/issues/84850}.)
@end itemize

@node Deprecated,CPython bytecode changes,Removed,What’s new in Python 3 14
@anchor{whatsnew/3 14 deprecated}@anchor{30c}
@subsection Deprecated


@menu
* New deprecations:: 
* Pending removal in Python 3.15: Pending removal in Python 3 15. 
* Pending removal in Python 3.16: Pending removal in Python 3 16. 
* Pending removal in Python 3.17: Pending removal in Python 3 17. 
* Pending removal in Python 3.18: Pending removal in Python 3 18. 
* Pending removal in Python 3.19: Pending removal in Python 3 19. 
* Pending removal in future versions:: 

@end menu

@node New deprecations,Pending removal in Python 3 15,,Deprecated
@anchor{whatsnew/3 14 new-deprecations}@anchor{30d}
@subsubsection New deprecations



@itemize *

@item 
Passing a complex number as the `real' or `imag' argument in the
@ref{198,,complex()} constructor is now deprecated;
complex numbers should only be passed as a single positional argument.
(Contributed by Serhiy Storchaka in gh-109218@footnote{https://github.com/python/cpython/issues/109218}.)

@item 
@ref{7,,argparse}:


@itemize *

@item 
Passing the undocumented keyword argument `prefix_chars' to the
@ref{2ed,,add_argument_group()} method is now deprecated.
(Contributed by Savannah Ostrowski in gh-125563@footnote{https://github.com/python/cpython/issues/125563}.)

@item 
Deprecated the @ref{30e,,argparse.FileType} type converter.
Anything relating to resource management should be handled
downstream, after the arguments have been parsed.
(Contributed by Serhiy Storchaka in gh-58032@footnote{https://github.com/python/cpython/issues/58032}.)
@end itemize

@item 
@ref{b,,asyncio}:


@itemize *

@item 
The @code{asyncio.iscoroutinefunction()} is now deprecated
and will be removed in Python 3.16;
use @ref{30f,,inspect.iscoroutinefunction()} instead.
(Contributed by Jiahao Li and Kumar Aditya in gh-122875@footnote{https://github.com/python/cpython/issues/122875}.)

@item 
The @ref{b,,asyncio} policy system is deprecated
and will be removed in Python 3.16.
In particular, the following classes and functions are deprecated:


@itemize *

@item 
@ref{310,,asyncio.AbstractEventLoopPolicy}

@item 
@ref{311,,asyncio.DefaultEventLoopPolicy}

@item 
@ref{312,,asyncio.WindowsSelectorEventLoopPolicy}

@item 
@ref{313,,asyncio.WindowsProactorEventLoopPolicy}

@item 
@ref{314,,asyncio.get_event_loop_policy()}

@item 
@ref{315,,asyncio.set_event_loop_policy()}
@end itemize

Users should use @ref{2f5,,asyncio.run()} or @ref{2f7,,asyncio.Runner} with
the `loop_factory' argument to use the desired event loop implementation.

For example, to use @ref{316,,asyncio.SelectorEventLoop} on Windows:

@example
import asyncio

async def main():
    ...

asyncio.run(main(), loop_factory=asyncio.SelectorEventLoop)
@end example

(Contributed by Kumar Aditya in gh-127949@footnote{https://github.com/python/cpython/issues/127949}.)
@end itemize

@item 
@ref{1c,,codecs}:
The @ref{317,,codecs.open()} function is now deprecated,
and will be removed in a future version of Python.
Use @ref{318,,open()} instead.
(Contributed by Inada Naoki in gh-133036@footnote{https://github.com/python/cpython/issues/133036}.)

@item 
@ref{2e,,ctypes}:


@itemize *

@item 
On non-Windows platforms, setting @ref{319,,Structure._pack_} to use a
MSVC-compatible default memory layout is now deprecated in favor of setting
@ref{1e9,,Structure._layout_} to @code{'ms'}, and will be removed in Python 3.19.
(Contributed by Petr Viktorin in gh-131747@footnote{https://github.com/python/cpython/issues/131747}.)

@item 
Calling @ref{1f3,,ctypes.POINTER()} on a string is now deprecated.
Use @ref{31a,,incomplete types}
for self-referential structures.
Also, the internal @code{ctypes._pointer_type_cache} is deprecated.
See @code{ctypes.POINTER()} for updated implementation details.
(Contributed by Sergey Myrianov in gh-100926@footnote{https://github.com/python/cpython/issues/100926}.)
@end itemize

@item 
@ref{63,,functools}:
Calling the Python implementation of @ref{21c,,functools.reduce()} with `function'
or `sequence' as keyword arguments is now deprecated;
the parameters will be made positional-only in Python 3.16.
(Contributed by Kirill Podoprigora in gh-121676@footnote{https://github.com/python/cpython/issues/121676}.)

@item 
@ref{8b,,logging}:
Support for custom logging handlers with the `strm' argument
is now deprecated and scheduled for removal in Python 3.16.
Define handlers with the `stream' argument instead.
(Contributed by Mariusz Felisiak in gh-115032@footnote{https://github.com/python/cpython/issues/115032}.)

@item 
@ref{93,,mimetypes}:
Valid extensions are either empty or must start with ‘.’ for
@ref{31b,,mimetypes.MimeTypes.add_type()}.
Undotted extensions are deprecated and will
raise a @ref{2ee,,ValueError} in Python 3.16.
(Contributed by Hugo van Kemenade in gh-75223@footnote{https://github.com/python/cpython/issues/75223}.)

@item 
@code{nturl2path}:
This module is now deprecated. Call @ref{2bf,,urllib.request.url2pathname()}
and @ref{2c1,,pathname2url()} instead.
(Contributed by Barney Gale in gh-125866@footnote{https://github.com/python/cpython/issues/125866}.)

@item 
@ref{a5,,os}:
The @ref{31c,,os.popen()} and @ref{31d,,os.spawn*} functions
are now @ref{23f,,soft deprecated}.
They should no longer be used to write new code.
The @ref{dc,,subprocess} module is recommended instead.
(Contributed by Victor Stinner in gh-120743@footnote{https://github.com/python/cpython/issues/120743}.)

@item 
@ref{a8,,pathlib}:
@code{pathlib.PurePath.as_uri()} is now deprecated
and scheduled for removal in Python 3.19.
Use @ref{31e,,pathlib.Path.as_uri()} instead.
(Contributed by Barney Gale in gh-123599@footnote{https://github.com/python/cpython/issues/123599}.)

@item 
@ref{aa,,pdb}:
The undocumented @code{pdb.Pdb.curframe_locals} attribute is now a deprecated
read-only property, which will be removed in a future version of Python.
The low overhead dynamic frame locals access added in Python 3.13 by 
@geindex Python Enhancement Proposals; PEP 667
PEP 667@footnote{https://peps.python.org/pep-0667/}
means the frame locals cache reference previously stored in this attribute
is no longer needed. Derived debuggers should access
@code{pdb.Pdb.curframe.f_locals} directly in Python 3.13 and later versions.
(Contributed by Tian Gao in gh-124369@footnote{https://github.com/python/cpython/issues/124369} and gh-125951@footnote{https://github.com/python/cpython/issues/125951}.)

@item 
@ref{de,,symtable}:
Deprecate @ref{31f,,symtable.Class.get_methods()} due to the lack of interest,
scheduled for removal in Python 3.16.
(Contributed by Bénédikt Tran in gh-119698@footnote{https://github.com/python/cpython/issues/119698}.)

@item 
@ref{f6,,tkinter}:
The @code{tkinter.Variable} methods @code{trace_variable()},
@code{trace_vdelete()} and @code{trace_vinfo()} are now deprecated.
Use @code{trace_add()}, @code{trace_remove()} and @code{trace_info()} instead.
(Contributed by Serhiy Storchaka in gh-120220@footnote{https://github.com/python/cpython/issues/120220}.)

@item 
@ref{111,,urllib.parse}:
Accepting objects with false values (like @code{0} and @code{[]}) except empty
strings, bytes-like objects and @code{None} in @ref{320,,parse_qsl()}
and @ref{321,,parse_qs()} is now deprecated.
(Contributed by Serhiy Storchaka in gh-116897@footnote{https://github.com/python/cpython/issues/116897}.)
@end itemize

@c Add deprecations above alphabetically, not here at the end.

@node Pending removal in Python 3 15,Pending removal in Python 3 16,New deprecations,Deprecated
@anchor{whatsnew/3 14 pending-removal-in-python-3-15}@anchor{322}
@subsubsection Pending removal in Python 3.15



@itemize *

@item 
The import system:


@itemize *

@item 
Setting @ref{323,,__cached__} on a module while
failing to set @ref{324,,__spec__.cached}
is deprecated. In Python 3.15, @code{__cached__} will cease to be set or
take into consideration by the import system or standard library. (gh-97879@footnote{https://github.com/python/cpython/issues/97879})

@item 
Setting @ref{325,,__package__} on a module while
failing to set @ref{326,,__spec__.parent}
is deprecated. In Python 3.15, @code{__package__} will cease to be set or
take into consideration by the import system or standard library. (gh-97879@footnote{https://github.com/python/cpython/issues/97879})
@end itemize

@item 
@ref{2e,,ctypes}:


@itemize *

@item 
The undocumented @code{ctypes.SetPointerType()} function
has been deprecated since Python 3.13.
@end itemize

@item 
@ref{76,,http.server}:


@itemize *

@item 
The obsolete and rarely used @ref{327,,CGIHTTPRequestHandler}
has been deprecated since Python 3.13.
No direct replacement exists.
`Anything' is better than CGI to interface
a web server with a request handler.

@item 
The @code{--cgi} flag to the @code{python -m http.server}
command-line interface has been deprecated since Python 3.13.
@end itemize

@item 
@ref{7b,,importlib}:


@itemize *

@item 
@code{load_module()} method: use @code{exec_module()} instead.
@end itemize

@item 
@ref{a8,,pathlib}:


@itemize *

@item 
@ref{328,,PurePath.is_reserved()}
has been deprecated since Python 3.13.
Use @ref{329,,os.path.isreserved()} to detect reserved paths on Windows.
@end itemize

@item 
@ref{af,,platform}:


@itemize *

@item 
@ref{32a,,java_ver()} has been deprecated since Python 3.13.
This function is only useful for Jython support, has a confusing API,
and is largely untested.
@end itemize

@item 
@ref{e1,,sysconfig}:


@itemize *

@item 
The `check_home' argument of @ref{32b,,sysconfig.is_python_build()} has been
deprecated since Python 3.12.
@end itemize

@item 
@ref{f3,,threading}:


@itemize *

@item 
@ref{32c,,RLock()} will take no arguments in Python 3.15.
Passing any arguments has been deprecated since Python 3.14,
as the Python version does not permit any arguments,
but the C version allows any number of positional or keyword arguments,
ignoring every argument.
@end itemize

@item 
@ref{10a,,types}:


@itemize *

@item 
@ref{32d,,types.CodeType}: Accessing @ref{32e,,co_lnotab} was
deprecated in 
@geindex Python Enhancement Proposals; PEP 626
PEP 626@footnote{https://peps.python.org/pep-0626/}
since 3.10 and was planned to be removed in 3.12,
but it only got a proper @ref{1a4,,DeprecationWarning} in 3.12.
May be removed in 3.15.
(Contributed by Nikita Sobolev in gh-101866@footnote{https://github.com/python/cpython/issues/101866}.)
@end itemize

@item 
@ref{10b,,typing}:


@itemize *

@item 
The undocumented keyword argument syntax for creating
@ref{32f,,NamedTuple} classes
(for example, @code{Point = NamedTuple("Point", x=int, y=int)})
has been deprecated since Python 3.13.
Use the class-based syntax or the functional syntax instead.

@item 
When using the functional syntax of @ref{330,,TypedDict}s, failing
to pass a value to the `fields' parameter (@code{TD = TypedDict("TD")}) or
passing @code{None} (@code{TD = TypedDict("TD", None)}) has been deprecated
since Python 3.13.
Use @code{class TD(TypedDict): pass} or @code{TD = TypedDict("TD", @{@})}
to create a TypedDict with zero field.

@item 
The @ref{331,,typing.no_type_check_decorator()} decorator function
has been deprecated since Python 3.13.
After eight years in the @ref{10b,,typing} module,
it has yet to be supported by any major type checker.
@end itemize

@item 
@ref{11a,,wave}:


@itemize *

@item 
The @ref{332,,getmark()}, @code{setmark()},
and @ref{333,,getmarkers()} methods of
the @ref{334,,Wave_read} and @ref{335,,Wave_write} classes
have been deprecated since Python 3.13.
@end itemize

@item 
@ref{139,,zipimport}:


@itemize *

@item 
@ref{336,,load_module()} has been deprecated since
Python 3.10. Use @ref{337,,exec_module()} instead.
(Contributed by Jiahao Li in gh-125746@footnote{https://github.com/python/cpython/issues/125746}.)
@end itemize
@end itemize

@node Pending removal in Python 3 16,Pending removal in Python 3 17,Pending removal in Python 3 15,Deprecated
@anchor{whatsnew/3 14 pending-removal-in-python-3-16}@anchor{338}
@subsubsection Pending removal in Python 3.16



@itemize *

@item 
The import system:


@itemize *

@item 
Setting @ref{339,,__loader__} on a module while
failing to set @ref{33a,,__spec__.loader}
is deprecated. In Python 3.16, @code{__loader__} will cease to be set or
taken into consideration by the import system or the standard library.
@end itemize

@item 
@ref{8,,array}:


@itemize *

@item 
The @code{'u'} format code (@code{wchar_t})
has been deprecated in documentation since Python 3.3
and at runtime since Python 3.13.
Use the @code{'w'} format code (@ref{33b,,Py_UCS4})
for Unicode characters instead.
@end itemize

@item 
@ref{b,,asyncio}:


@itemize *

@item 
@code{asyncio.iscoroutinefunction()} is deprecated
and will be removed in Python 3.16;
use @ref{30f,,inspect.iscoroutinefunction()} instead.
(Contributed by Jiahao Li and Kumar Aditya in gh-122875@footnote{https://github.com/python/cpython/issues/122875}.)

@item 
@ref{b,,asyncio} policy system is deprecated and will be removed in Python 3.16.
In particular, the following classes and functions are deprecated:


@itemize *

@item 
@ref{310,,asyncio.AbstractEventLoopPolicy}

@item 
@ref{311,,asyncio.DefaultEventLoopPolicy}

@item 
@ref{312,,asyncio.WindowsSelectorEventLoopPolicy}

@item 
@ref{313,,asyncio.WindowsProactorEventLoopPolicy}

@item 
@ref{314,,asyncio.get_event_loop_policy()}

@item 
@ref{315,,asyncio.set_event_loop_policy()}
@end itemize

Users should use @ref{2f5,,asyncio.run()} or @ref{2f7,,asyncio.Runner} with
`loop_factory' to use the desired event loop implementation.

For example, to use @ref{316,,asyncio.SelectorEventLoop} on Windows:

@example
import asyncio

async def main():
    ...

asyncio.run(main(), loop_factory=asyncio.SelectorEventLoop)
@end example

(Contributed by Kumar Aditya in gh-127949@footnote{https://github.com/python/cpython/issues/127949}.)
@end itemize

@item 
@ref{13,,builtins}:


@itemize *

@item 
Bitwise inversion on boolean types, @code{~True} or @code{~False}
has been deprecated since Python 3.12,
as it produces surprising and unintuitive results (@code{-2} and @code{-1}).
Use @code{not x} instead for the logical negation of a Boolean.
In the rare case that you need the bitwise inversion of
the underlying integer, convert to @code{int} explicitly (@code{~int(x)}).
@end itemize

@item 
@ref{63,,functools}:


@itemize *

@item 
Calling the Python implementation of @ref{21c,,functools.reduce()} with `function'
or `sequence' as keyword arguments has been deprecated since Python 3.14.
@end itemize

@item 
@ref{8b,,logging}:

Support for custom logging handlers with the `strm' argument is deprecated
and scheduled for removal in Python 3.16. Define handlers with the `stream'
argument instead. (Contributed by Mariusz Felisiak in gh-115032@footnote{https://github.com/python/cpython/issues/115032}.)

@item 
@ref{93,,mimetypes}:


@itemize *

@item 
Valid extensions start with a ‘.’ or are empty for
@ref{31b,,mimetypes.MimeTypes.add_type()}.
Undotted extensions are deprecated and will
raise a @ref{2ee,,ValueError} in Python 3.16.
(Contributed by Hugo van Kemenade in gh-75223@footnote{https://github.com/python/cpython/issues/75223}.)
@end itemize

@item 
@ref{ca,,shutil}:


@itemize *

@item 
The @code{ExecError} exception
has been deprecated since Python 3.14.
It has not been used by any function in @code{shutil} since Python 3.4,
and is now an alias of @ref{246,,RuntimeError}.
@end itemize

@item 
@ref{de,,symtable}:


@itemize *

@item 
The @ref{31f,,Class.get_methods} method
has been deprecated since Python 3.14.
@end itemize

@item 
@ref{df,,sys}:


@itemize *

@item 
The @ref{33c,,_enablelegacywindowsfsencoding()} function
has been deprecated since Python 3.13.
Use the 
@geindex PYTHONLEGACYWINDOWSFSENCODING
@geindex environment variable; PYTHONLEGACYWINDOWSFSENCODING
@ref{33d,,PYTHONLEGACYWINDOWSFSENCODING} environment variable instead.
@end itemize

@item 
@ref{e1,,sysconfig}:


@itemize *

@item 
The @code{sysconfig.expand_makefile_vars()} function
has been deprecated since Python 3.14.
Use the @code{vars} argument of @ref{33e,,sysconfig.get_paths()} instead.
@end itemize

@item 
@ref{e4,,tarfile}:


@itemize *

@item 
The undocumented and unused @code{TarFile.tarfile} attribute
has been deprecated since Python 3.13.
@end itemize
@end itemize

@node Pending removal in Python 3 17,Pending removal in Python 3 18,Pending removal in Python 3 16,Deprecated
@anchor{whatsnew/3 14 pending-removal-in-python-3-17}@anchor{33f}
@subsubsection Pending removal in Python 3.17



@itemize *

@item 
@ref{1f,,collections.abc}:


@itemize -

@item 
@ref{340,,collections.abc.ByteString} is scheduled for removal in Python 3.17.

Use @code{isinstance(obj, collections.abc.Buffer)} to test if @code{obj}
implements the @ref{262,,buffer protocol} at runtime. For use
in type annotations, either use @ref{341,,Buffer} or a union
that explicitly specifies the types your code supports (e.g.,
@code{bytes | bytearray | memoryview}).

@code{ByteString} was originally intended to be an abstract class that
would serve as a supertype of both @ref{193,,bytes} and @ref{342,,bytearray}.
However, since the ABC never had any methods, knowing that an object was an
instance of @code{ByteString} never actually told you anything useful
about the object. Other common buffer types such as @ref{166,,memoryview}
were also never understood as subtypes of @code{ByteString} (either at
runtime or by static type checkers).

See 
@geindex Python Enhancement Proposals; PEP 688#current-options
PEP 688@footnote{https://peps.python.org/pep-0688/#current-options} for more details.
(Contributed by Shantanu Jain in gh-91896@footnote{https://github.com/python/cpython/issues/91896}.)
@end itemize

@item 
@ref{10b,,typing}:


@itemize -

@item 
Before Python 3.14, old-style unions were implemented using the private class
@code{typing._UnionGenericAlias}. This class is no longer needed for the implementation,
but it has been retained for backward compatibility, with removal scheduled for Python
3.17. Users should use documented introspection helpers like @ref{2ad,,typing.get_origin()}
and @ref{2ae,,typing.get_args()} instead of relying on private implementation details.

@item 
@ref{343,,typing.ByteString}, deprecated since Python 3.9, is scheduled for removal in
Python 3.17.

Use @code{isinstance(obj, collections.abc.Buffer)} to test if @code{obj}
implements the @ref{262,,buffer protocol} at runtime. For use
in type annotations, either use @ref{341,,Buffer} or a union
that explicitly specifies the types your code supports (e.g.,
@code{bytes | bytearray | memoryview}).

@code{ByteString} was originally intended to be an abstract class that
would serve as a supertype of both @ref{193,,bytes} and @ref{342,,bytearray}.
However, since the ABC never had any methods, knowing that an object was an
instance of @code{ByteString} never actually told you anything useful
about the object. Other common buffer types such as @ref{166,,memoryview}
were also never understood as subtypes of @code{ByteString} (either at
runtime or by static type checkers).

See 
@geindex Python Enhancement Proposals; PEP 688#current-options
PEP 688@footnote{https://peps.python.org/pep-0688/#current-options} for more details.
(Contributed by Shantanu Jain in gh-91896@footnote{https://github.com/python/cpython/issues/91896}.)
@end itemize
@end itemize

@node Pending removal in Python 3 18,Pending removal in Python 3 19,Pending removal in Python 3 17,Deprecated
@anchor{whatsnew/3 14 pending-removal-in-python-3-18}@anchor{344}
@subsubsection Pending removal in Python 3.18



@itemize *

@item 
@ref{3a,,decimal}:


@itemize *

@item 
The non-standard and undocumented @ref{200,,Decimal} format
specifier @code{'N'}, which is only supported in the @code{decimal} module’s
C implementation, has been deprecated since Python 3.13.
(Contributed by Serhiy Storchaka in gh-89902@footnote{https://github.com/python/cpython/issues/89902}.)
@end itemize
@end itemize

@node Pending removal in Python 3 19,Pending removal in future versions,Pending removal in Python 3 18,Deprecated
@anchor{whatsnew/3 14 pending-removal-in-python-3-19}@anchor{345}
@subsubsection Pending removal in Python 3.19



@itemize *

@item 
@ref{2e,,ctypes}:


@itemize *

@item 
Implicitly switching to the MSVC-compatible struct layout by setting
@ref{319,,_pack_} but not @ref{1e9,,_layout_}
on non-Windows platforms.
@end itemize
@end itemize

@node Pending removal in future versions,,Pending removal in Python 3 19,Deprecated
@anchor{whatsnew/3 14 pending-removal-in-future-versions}@anchor{346}
@subsubsection Pending removal in future versions


The following APIs will be removed in the future,
although there is currently no date scheduled for their removal.


@itemize *

@item 
@ref{7,,argparse}:


@itemize *

@item 
Nesting argument groups and nesting mutually exclusive
groups are deprecated.

@item 
Passing the undocumented keyword argument `prefix_chars' to
@ref{2ed,,add_argument_group()} is now
deprecated.

@item 
The @ref{30e,,argparse.FileType} type converter is deprecated.
@end itemize

@item 
@ref{13,,builtins}:


@itemize *

@item 
Generators: @code{throw(type, exc, tb)} and @code{athrow(type, exc, tb)}
signature is deprecated: use @code{throw(exc)} and @code{athrow(exc)} instead,
the single argument signature.

@item 
Currently Python accepts numeric literals immediately followed by keywords,
for example @code{0in x}, @code{1or x}, @code{0if 1else 2}.  It allows confusing and
ambiguous expressions like @code{[0x1for x in y]} (which can be interpreted as
@code{[0x1 for x in y]} or @code{[0x1f or x in y]}).  A syntax warning is raised
if the numeric literal is immediately followed by one of keywords
@ref{347,,and}, @ref{17d,,else}, @ref{348,,for}, @ref{182,,if},
@ref{349,,in}, @ref{34a,,is} and @ref{34b,,or}.  In a future release it
will be changed to a syntax error. (gh-87999@footnote{https://github.com/python/cpython/issues/87999})

@item 
Support for @code{__index__()} and @code{__int__()} method returning non-int type:
these methods will be required to return an instance of a strict subclass of
@ref{19c,,int}.

@item 
Support for @code{__float__()} method returning a strict subclass of
@ref{197,,float}: these methods will be required to return an instance of
@code{float}.

@item 
Support for @code{__complex__()} method returning a strict subclass of
@ref{198,,complex}: these methods will be required to return an instance of
@code{complex}.

@item 
Passing a complex number as the `real' or `imag' argument in the
@ref{198,,complex()} constructor is now deprecated; it should only be passed
as a single positional argument.
(Contributed by Serhiy Storchaka in gh-109218@footnote{https://github.com/python/cpython/issues/109218}.)
@end itemize

@item 
@ref{15,,calendar}: @code{calendar.January} and @code{calendar.February} constants are
deprecated and replaced by @ref{34c,,calendar.JANUARY} and
@ref{34d,,calendar.FEBRUARY}.
(Contributed by Prince Roshan in gh-103636@footnote{https://github.com/python/cpython/issues/103636}.)

@item 
@ref{1c,,codecs}: use @ref{318,,open()} instead of @ref{317,,codecs.open()}. (gh-133038@footnote{https://github.com/python/cpython/issues/133038})

@item 
@ref{32e,,codeobject.co_lnotab}: use the @ref{34e,,codeobject.co_lines()} method
instead.

@item 
@ref{34,,datetime}:


@itemize *

@item 
@ref{34f,,utcnow()}:
use @code{datetime.datetime.now(tz=datetime.UTC)}.

@item 
@ref{350,,utcfromtimestamp()}:
use @code{datetime.datetime.fromtimestamp(timestamp, tz=datetime.UTC)}.
@end itemize

@item 
@ref{67,,gettext}: Plural value must be an integer.

@item 
@ref{7b,,importlib}:


@itemize *

@item 
@ref{351,,cache_from_source()} `debug_override' parameter is
deprecated: use the `optimization' parameter instead.
@end itemize

@item 
@ref{7e,,importlib.metadata}:


@itemize *

@item 
@code{EntryPoints} tuple interface.

@item 
Implicit @code{None} on return values.
@end itemize

@item 
@ref{8b,,logging}: the @code{warn()} method has been deprecated
since Python 3.3, use @ref{352,,warning()} instead.

@item 
@ref{8f,,mailbox}: Use of StringIO input and text mode is deprecated, use
BytesIO and binary mode instead.

@item 
@ref{a5,,os}: Calling @ref{353,,os.register_at_fork()} in multi-threaded process.

@item 
@code{pydoc.ErrorDuringImport}: A tuple value for `exc_info' parameter is
deprecated, use an exception instance.

@item 
@ref{be,,re}: More strict rules are now applied for numerical group references
and group names in regular expressions.  Only sequence of ASCII digits is now
accepted as a numerical reference.  The group name in bytes patterns and
replacement strings can now only contain ASCII letters and digits and
underscore.
(Contributed by Serhiy Storchaka in gh-91760@footnote{https://github.com/python/cpython/issues/91760}.)

@item 
@code{sre_compile}, @code{sre_constants} and @code{sre_parse} modules.

@item 
@ref{ca,,shutil}: @ref{354,,rmtree()}’s `onerror' parameter is deprecated in
Python 3.12; use the `onexc' parameter instead.

@item 
@ref{d5,,ssl} options and protocols:


@itemize *

@item 
@ref{355,,ssl.SSLContext} without protocol argument is deprecated.

@item 
@ref{355,,ssl.SSLContext}: @ref{356,,set_npn_protocols()} and
@code{selected_npn_protocol()} are deprecated: use ALPN
instead.

@item 
@code{ssl.OP_NO_SSL*} options

@item 
@code{ssl.OP_NO_TLS*} options

@item 
@code{ssl.PROTOCOL_SSLv3}

@item 
@code{ssl.PROTOCOL_TLS}

@item 
@code{ssl.PROTOCOL_TLSv1}

@item 
@code{ssl.PROTOCOL_TLSv1_1}

@item 
@code{ssl.PROTOCOL_TLSv1_2}

@item 
@code{ssl.TLSVersion.SSLv3}

@item 
@code{ssl.TLSVersion.TLSv1}

@item 
@code{ssl.TLSVersion.TLSv1_1}
@end itemize

@item 
@ref{f3,,threading} methods:


@itemize *

@item 
@code{threading.Condition.notifyAll()}: use @ref{357,,notify_all()}.

@item 
@code{threading.Event.isSet()}: use @ref{358,,is_set()}.

@item 
@code{threading.Thread.isDaemon()}, @ref{359,,threading.Thread.setDaemon()}:
use @ref{35a,,threading.Thread.daemon} attribute.

@item 
@code{threading.Thread.getName()}, @ref{35b,,threading.Thread.setName()}:
use @ref{2a2,,threading.Thread.name} attribute.

@item 
@code{threading.currentThread()}: use @ref{35c,,threading.current_thread()}.

@item 
@code{threading.activeCount()}: use @ref{35d,,threading.active_count()}.
@end itemize

@item 
@ref{35e,,typing.Text} (gh-92332@footnote{https://github.com/python/cpython/issues/92332}).

@item 
The internal class @code{typing._UnionGenericAlias} is no longer used to implement
@ref{2aa,,typing.Union}. To preserve compatibility with users using this private
class, a compatibility shim will be provided until at least Python 3.17. (Contributed by
Jelle Zijlstra in gh-105499@footnote{https://github.com/python/cpython/issues/105499}.)

@item 
@ref{35f,,unittest.IsolatedAsyncioTestCase}: it is deprecated to return a value
that is not @code{None} from a test case.

@item 
@ref{111,,urllib.parse} deprecated functions: @ref{360,,urlparse()} instead


@itemize *

@item 
@code{splitattr()}

@item 
@code{splithost()}

@item 
@code{splitnport()}

@item 
@code{splitpasswd()}

@item 
@code{splitport()}

@item 
@code{splitquery()}

@item 
@code{splittag()}

@item 
@code{splittype()}

@item 
@code{splituser()}

@item 
@code{splitvalue()}

@item 
@code{to_bytes()}
@end itemize

@item 
@ref{11f,,wsgiref}: @code{SimpleHandler.stdout.write()} should not do partial
writes.

@item 
@ref{12c,,xml.etree.ElementTree}: Testing the truth value of an
@ref{361,,Element} is deprecated. In a future release it
will always return @code{True}. Prefer explicit @code{len(elem)} or
@code{elem is not None} tests instead.

@item 
@ref{294,,sys._clear_type_cache()} is deprecated:
use @ref{362,,sys._clear_internal_caches()} instead.
@end itemize

@node CPython bytecode changes,C API changes,Deprecated,What’s new in Python 3 14
@anchor{whatsnew/3 14 cpython-bytecode-changes}@anchor{363}
@subsection CPython bytecode changes



@itemize *

@item 
Replaced the opcode @code{BINARY_SUBSCR} by the @ref{364,,BINARY_OP}
opcode with the @code{NB_SUBSCR} oparg.
(Contributed by Irit Katriel in gh-100239@footnote{https://github.com/python/cpython/issues/100239}.)

@item 
Add the @ref{365,,BUILD_INTERPOLATION} and @ref{366,,BUILD_TEMPLATE}
opcodes to construct new @ref{16c,,Interpolation}
and @ref{16b,,Template} instances, respectively.
(Contributed by Lysandros Nikolaou and others in gh-132661@footnote{https://github.com/python/cpython/issues/132661};
see also @ref{145,,PEP 750; Template strings}).

@item 
Remove the @code{BUILD_CONST_KEY_MAP} opcode.
Use @ref{367,,BUILD_MAP} instead.
(Contributed by Mark Shannon in gh-122160@footnote{https://github.com/python/cpython/issues/122160}.)

@item 
Replace the @code{LOAD_ASSERTION_ERROR} opcode with
@ref{368,,LOAD_COMMON_CONSTANT} and add support for loading
@ref{369,,NotImplementedError}.

@item 
Add the @ref{36a,,LOAD_FAST_BORROW} and @ref{36b,,LOAD_FAST_BORROW_LOAD_FAST_BORROW}
opcodes to reduce reference counting overhead when the interpreter can prove
that the reference in the frame outlives the reference loaded onto the stack.
(Contributed by Matt Page in gh-130704@footnote{https://github.com/python/cpython/issues/130704}.)

@item 
Add the @ref{36c,,LOAD_SMALL_INT} opcode, which pushes a small integer
equal to the @code{oparg} to the stack.
The @code{RETURN_CONST} opcode is removed as it is no longer used.
(Contributed by Mark Shannon in gh-125837@footnote{https://github.com/python/cpython/issues/125837}.)

@item 
Add the new @ref{36d,,LOAD_SPECIAL} instruction.
Generate code for @ref{187,,with} and @ref{186,,async with} statements
using the new instruction.
Removed the @code{BEFORE_WITH} and @code{BEFORE_ASYNC_WITH} instructions.
(Contributed by Mark Shannon in gh-120507@footnote{https://github.com/python/cpython/issues/120507}.)

@item 
Add the @ref{36e,,POP_ITER} opcode to support ‘virtual’ iterators.
(Contributed by Mark Shannon in gh-132554@footnote{https://github.com/python/cpython/issues/132554}.)
@end itemize

@menu
* Pseudo-instructions:: 

@end menu

@node Pseudo-instructions,,,CPython bytecode changes
@anchor{whatsnew/3 14 pseudo-instructions}@anchor{36f}
@subsubsection Pseudo-instructions



@itemize *

@item 
Add the @code{ANNOTATIONS_PLACEHOLDER} pseudo instruction
to support partially executed module-level annotations with
@ref{146,,deferred evaluation of annotations}.
(Contributed by Jelle Zijlstra in gh-130907@footnote{https://github.com/python/cpython/issues/130907}.)

@item 
Add the @code{BINARY_OP_EXTEND} pseudo instruction,
which executes a pair of functions (guard and specialization functions)
accessed from the inline cache.
(Contributed by Irit Katriel in gh-100239@footnote{https://github.com/python/cpython/issues/100239}.)

@item 
Add three specializations for @ref{370,,CALL_KW};
@code{CALL_KW_PY} for calls to Python functions,
@code{CALL_KW_BOUND_METHOD} for calls to bound methods, and
@code{CALL_KW_NON_PY} for all other calls.
(Contributed by Mark Shannon in gh-118093@footnote{https://github.com/python/cpython/issues/118093}.)

@item 
Add the @ref{371,,JUMP_IF_TRUE} and @ref{372,,JUMP_IF_FALSE} pseudo instructions,
conditional jumps which do not impact the stack.
Replaced by the sequence @code{COPY 1}, @code{TO_BOOL}, @code{POP_JUMP_IF_TRUE/FALSE}.
(Contributed by Irit Katriel in gh-124285@footnote{https://github.com/python/cpython/issues/124285}.)

@item 
Add the @code{LOAD_CONST_MORTAL} pseudo instruction.
(Contributed by Mark Shannon in gh-128685@footnote{https://github.com/python/cpython/issues/128685}.)

@item 
Add the @ref{373,,LOAD_CONST_IMMORTAL} pseudo instruction,
which does the same as @code{LOAD_CONST}, but is more efficient
for immortal objects.
(Contributed by Mark Shannon in gh-125837@footnote{https://github.com/python/cpython/issues/125837}.)

@item 
Add the @ref{374,,NOT_TAKEN} pseudo instruction, used by @ref{e0,,sys.monitoring}
to record branch events (such as @ref{297,,BRANCH_LEFT}).
(Contributed by Mark Shannon in gh-122548@footnote{https://github.com/python/cpython/issues/122548}.)
@end itemize

@node C API changes,Build changes,CPython bytecode changes,What’s new in Python 3 14
@anchor{whatsnew/3 14 c-api-changes}@anchor{375}
@subsection C API changes


@menu
* Python configuration C API:: 
* New features in the C API:: 
* Limited C API changes:: 
* Removed C APIs:: 
* Deprecated C APIs:: 

@end menu

@node Python configuration C API,New features in the C API,,C API changes
@anchor{whatsnew/3 14 python-configuration-c-api}@anchor{376}@anchor{whatsnew/3 14 whatsnew314-capi-config}@anchor{156}
@subsubsection Python configuration C API


Add a @ref{377,,PyInitConfig C API} to configure the Python
initialization without relying on C structures and the ability to make
ABI-compatible changes in the future.

Complete the 
@geindex Python Enhancement Proposals; PEP 587
PEP 587@footnote{https://peps.python.org/pep-0587/} @ref{378,,PyConfig C API} by adding
@ref{379,,PyInitConfig_AddModule()} which can be used to add a built-in extension
module; a feature previously referred to as the “inittab”.

Add @ref{37a,,PyConfig_Get()} and @ref{37b,,PyConfig_Set()} functions to get and set
the current runtime configuration.

@geindex Python Enhancement Proposals; PEP 587
PEP 587@footnote{https://peps.python.org/pep-0587/} ‘Python Initialization Configuration’ unified all the ways
to configure Python’s initialization. This PEP also unifies the configuration
of Python’s preinitialization and initialization in a single API.
Moreover, this PEP only provides a single choice to embed Python,
instead of having two ‘Python’ and ‘Isolated’ choices (PEP 587),
to further simplify the API.

The lower level PEP 587 PyConfig API remains available for use cases
with an intentionally higher level of coupling to CPython implementation details
(such as emulating the full functionality of CPython’s CLI, including its
configuration mechanisms).

(Contributed by Victor Stinner in gh-107954@footnote{https://github.com/python/cpython/issues/107954}.)


@subsubheading See also


@geindex Python Enhancement Proposals; PEP 741
PEP 741@footnote{https://peps.python.org/pep-0741/} and 
@geindex Python Enhancement Proposals; PEP 587
PEP 587@footnote{https://peps.python.org/pep-0587/}


@node New features in the C API,Limited C API changes,Python configuration C API,C API changes
@anchor{whatsnew/3 14 new-features-in-the-c-api}@anchor{37c}
@subsubsection New features in the C API



@itemize *

@item 
Add @ref{37d,,Py_PACK_VERSION()} and @ref{37e,,Py_PACK_FULL_VERSION()},
two new macros for bit-packing Python version numbers.
This is useful for comparisons with @ref{37f,,Py_Version}
or @ref{380,,PY_VERSION_HEX}.
(Contributed by Petr Viktorin in gh-128629@footnote{https://github.com/python/cpython/issues/128629}.)

@item 
Add @ref{381,,PyBytes_Join(sep@comma{} iterable)} function,
similar to @code{sep.join(iterable)} in Python.
(Contributed by Victor Stinner in gh-121645@footnote{https://github.com/python/cpython/issues/121645}.)

@item 
Add functions to manipulate the configuration of the current
runtime Python interpreter
(@ref{156,,PEP 741; Python configuration C API}):


@itemize *

@item 
@ref{37a,,PyConfig_Get()}

@item 
@ref{382,,PyConfig_GetInt()}

@item 
@ref{37b,,PyConfig_Set()}

@item 
@ref{383,,PyConfig_Names()}
@end itemize

(Contributed by Victor Stinner in gh-107954@footnote{https://github.com/python/cpython/issues/107954}.)

@item 
Add functions to configure Python initialization
(@ref{156,,PEP 741; Python configuration C API}):


@itemize *

@item 
@ref{384,,Py_InitializeFromInitConfig()}

@item 
@ref{379,,PyInitConfig_AddModule()}

@item 
@ref{385,,PyInitConfig_Create()}

@item 
@ref{386,,PyInitConfig_Free()}

@item 
@ref{387,,PyInitConfig_FreeStrList()}

@item 
@ref{388,,PyInitConfig_GetError()}

@item 
@ref{389,,PyInitConfig_GetExitCode()}

@item 
@ref{38a,,PyInitConfig_GetInt()}

@item 
@ref{38b,,PyInitConfig_GetStr()}

@item 
@ref{38c,,PyInitConfig_GetStrList()}

@item 
@ref{38d,,PyInitConfig_HasOption()}

@item 
@ref{38e,,PyInitConfig_SetInt()}

@item 
@ref{38f,,PyInitConfig_SetStr()}

@item 
@ref{390,,PyInitConfig_SetStrList()}
@end itemize

(Contributed by Victor Stinner in gh-107954@footnote{https://github.com/python/cpython/issues/107954}.)

@item 
Add @ref{391,,Py_fopen()} function to open a file.
This works similarly to the standard C @code{fopen()} function,
instead accepting a Python object for the `path' parameter
and setting an exception on error.
The corresponding new @ref{392,,Py_fclose()} function should be used
to close a file.
(Contributed by Victor Stinner in gh-127350@footnote{https://github.com/python/cpython/issues/127350}.)

@item 
Add @ref{393,,Py_HashBuffer()} to compute and return the hash value of a buffer.
(Contributed by Antoine Pitrou and Victor Stinner in gh-122854@footnote{https://github.com/python/cpython/issues/122854}.)

@item 
Add @ref{394,,PyImport_ImportModuleAttr()} and
@ref{395,,PyImport_ImportModuleAttrString()} helper functions to import a module
and get an attribute of the module.
(Contributed by Victor Stinner in gh-128911@footnote{https://github.com/python/cpython/issues/128911}.)

@item 
Add @ref{396,,PyIter_NextItem()} to replace @ref{397,,PyIter_Next()},
which has an ambiguous return value.
(Contributed by Irit Katriel and Erlend Aasland in gh-105201@footnote{https://github.com/python/cpython/issues/105201}.)

@item 
Add @ref{398,,PyLong_GetSign()} function to get the sign of @ref{19c,,int} objects.
(Contributed by Sergey B Kirpichev in gh-116560@footnote{https://github.com/python/cpython/issues/116560}.)

@item 
Add @ref{399,,PyLong_IsPositive()}, @ref{39a,,PyLong_IsNegative()}
and @ref{39b,,PyLong_IsZero()} for checking if @ref{39c,,PyLongObject}
is positive, negative, or zero, respectively.
(Contributed by James Roy and Sergey B Kirpichev in gh-126061@footnote{https://github.com/python/cpython/issues/126061}.)

@item 
Add new functions to convert C @code{<stdint.h>} numbers to/from
Python @ref{19c,,int} objects:


@itemize *

@item 
@ref{39d,,PyLong_AsInt32()}

@item 
@ref{39e,,PyLong_AsInt64()}

@item 
@ref{39f,,PyLong_AsUInt32()}

@item 
@ref{3a0,,PyLong_AsUInt64()}

@item 
@ref{3a1,,PyLong_FromInt32()}

@item 
@ref{3a2,,PyLong_FromInt64()}

@item 
@ref{3a3,,PyLong_FromUInt32()}

@item 
@ref{3a4,,PyLong_FromUInt64()}
@end itemize

(Contributed by Victor Stinner in gh-120389@footnote{https://github.com/python/cpython/issues/120389}.)

@item 
Add a new import and export API for Python @ref{19c,,int} objects
(
@geindex Python Enhancement Proposals; PEP 757
PEP 757@footnote{https://peps.python.org/pep-0757/}):


@itemize *

@item 
@ref{3a5,,PyLong_GetNativeLayout()}

@item 
@ref{3a6,,PyLong_Export()}

@item 
@ref{3a7,,PyLong_FreeExport()}

@item 
@ref{3a8,,PyLongWriter_Create()}

@item 
@ref{3a9,,PyLongWriter_Finish()}

@item 
@ref{3aa,,PyLongWriter_Discard()}
@end itemize

(Contributed by Sergey B Kirpichev and Victor Stinner in gh-102471@footnote{https://github.com/python/cpython/issues/102471}.)

@item 
Add @ref{3ab,,PyMonitoring_FireBranchLeftEvent()} and
@ref{3ac,,PyMonitoring_FireBranchRightEvent()} for generating
@ref{297,,BRANCH_LEFT} and @ref{298,,BRANCH_RIGHT}
events, respectively.
(Contributed by Mark Shannon in gh-122548@footnote{https://github.com/python/cpython/issues/122548}.)

@item 
Add @ref{3ad,,PyType_Freeze()} function to make a type immutable.
(Contributed by Victor Stinner in gh-121654@footnote{https://github.com/python/cpython/issues/121654}.)

@item 
Add @ref{3ae,,PyType_GetBaseByToken()} and @ref{3af,,Py_tp_token} slot
for easier superclass identification, which attempts to resolve the
type checking issue mentioned in 
@geindex Python Enhancement Proposals; PEP 630#type-checking
PEP 630@footnote{https://peps.python.org/pep-0630/#type-checking}.
(Contributed in gh-124153@footnote{https://github.com/python/cpython/issues/124153}.)

@item 
Add a new @ref{3b0,,PyUnicode_Equal()} function to test if two
strings are equal.
The function is also added to the Limited C API.
(Contributed by Victor Stinner in gh-124502@footnote{https://github.com/python/cpython/issues/124502}.)

@item 
Add a new @ref{3b1,,PyUnicodeWriter} API to create a Python @ref{16a,,str}
object, with the following functions:


@itemize *

@item 
@ref{3b2,,PyUnicodeWriter_Create()}

@item 
@ref{3b3,,PyUnicodeWriter_DecodeUTF8Stateful()}

@item 
@ref{3b4,,PyUnicodeWriter_Discard()}

@item 
@ref{3b5,,PyUnicodeWriter_Finish()}

@item 
@ref{3b6,,PyUnicodeWriter_Format()}

@item 
@ref{3b7,,PyUnicodeWriter_WriteASCII()}

@item 
@ref{3b8,,PyUnicodeWriter_WriteChar()}

@item 
@ref{3b9,,PyUnicodeWriter_WriteRepr()}

@item 
@ref{3ba,,PyUnicodeWriter_WriteStr()}

@item 
@ref{3bb,,PyUnicodeWriter_WriteSubstring()}

@item 
@ref{3bc,,PyUnicodeWriter_WriteUCS4()}

@item 
@ref{3bd,,PyUnicodeWriter_WriteUTF8()}

@item 
@ref{3be,,PyUnicodeWriter_WriteWideChar()}
@end itemize

(Contributed by Victor Stinner in gh-119182@footnote{https://github.com/python/cpython/issues/119182}.)

@item 
The @code{k} and @code{K} formats in @ref{3bf,,PyArg_ParseTuple()} and
similar functions now use @ref{19f,,__index__()} if available,
like all other integer formats.
(Contributed by Serhiy Storchaka in gh-112068@footnote{https://github.com/python/cpython/issues/112068}.)

@item 
Add support for a new @code{p} format unit in @ref{3c0,,Py_BuildValue()}
that produces a Python @ref{3c1,,bool} object from a C integer.
(Contributed by Pablo Galindo in bpo-45325@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45325}.)

@item 
Add @ref{3c2,,PyUnstable_IsImmortal()} for determining if
an object is @ref{292,,immortal}, for debugging purposes.
(Contributed by Peter Bierma in gh-128509@footnote{https://github.com/python/cpython/issues/128509}.)

@item 
Add @ref{3c3,,PyUnstable_Object_EnableDeferredRefcount()} for enabling
deferred reference counting, as outlined in 
@geindex Python Enhancement Proposals; PEP 703
PEP 703@footnote{https://peps.python.org/pep-0703/}.

@item 
Add @ref{3c4,,PyUnstable_Object_IsUniquelyReferenced()} as
a replacement for @code{Py_REFCNT(op) == 1} on @ref{1f6,,free threaded} builds.
(Contributed by Peter Bierma in gh-133140@footnote{https://github.com/python/cpython/issues/133140}.)

@item 
Add @ref{3c5,,PyUnstable_Object_IsUniqueReferencedTemporary()} to
determine if an object is a unique temporary object on the
interpreter’s operand stack.
This can be used in some cases as a replacement for checking
if @ref{2d1,,Py_REFCNT()} is @code{1} for Python objects passed
as arguments to C API functions.
(Contributed by Sam Gross in gh-133164@footnote{https://github.com/python/cpython/issues/133164}.)
@end itemize

@node Limited C API changes,Removed C APIs,New features in the C API,C API changes
@anchor{whatsnew/3 14 limited-c-api-changes}@anchor{3c6}
@subsubsection Limited C API changes



@itemize *

@item 
In the limited C API version 3.14 and newer, @ref{3c7,,Py_TYPE()} and
@ref{2d1,,Py_REFCNT()} are now implemented as an opaque function call
to hide implementation details.
(Contributed by Victor Stinner in gh-120600@footnote{https://github.com/python/cpython/issues/120600} and gh-124127@footnote{https://github.com/python/cpython/issues/124127}.)

@item 
Remove the @ref{3c8,,PySequence_Fast_GET_SIZE},
@ref{3c9,,PySequence_Fast_GET_ITEM},
and @ref{3ca,,PySequence_Fast_ITEMS}
macros from the limited C API, since they have always been broken
in the limited C API.
(Contributed by Victor Stinner in gh-91417@footnote{https://github.com/python/cpython/issues/91417}.)
@end itemize

@node Removed C APIs,Deprecated C APIs,Limited C API changes,C API changes
@anchor{whatsnew/3 14 removed-c-apis}@anchor{3cb}@anchor{whatsnew/3 14 whatsnew314-c-api-removed}@anchor{3cc}
@subsubsection Removed C APIs



@itemize *

@item 
Creating @ref{3cd,,immutable types} with
mutable bases was deprecated in Python 3.12,
and now raises a @ref{199,,TypeError}.
(Contributed by Nikita Sobolev in gh-119775@footnote{https://github.com/python/cpython/issues/119775}.)

@item 
Remove @code{PyDictObject.ma_version_tag} member, which was deprecated
in Python 3.12.
Use the @ref{3ce,,PyDict_AddWatcher()} API instead.
(Contributed by Sam Gross in gh-124296@footnote{https://github.com/python/cpython/issues/124296}.)

@item 
Remove the private @code{_Py_InitializeMain()} function.
It was a @ref{3cf,,provisional API} added to Python 3.8 by 
@geindex Python Enhancement Proposals; PEP 587
PEP 587@footnote{https://peps.python.org/pep-0587/}.
(Contributed by Victor Stinner in gh-129033@footnote{https://github.com/python/cpython/issues/129033}.)

@item 
Remove the undocumented APIs @code{Py_C_RECURSION_LIMIT}
and @code{PyThreadState.c_recursion_remaining}.
These were added in 3.13 and have been removed without deprecation.
Use @ref{3d0,,Py_EnterRecursiveCall()} to guard against runaway
recursion in C code.
(Removed by Petr Viktorin in gh-133079@footnote{https://github.com/python/cpython/issues/133079}, see also gh-130396@footnote{https://github.com/python/cpython/issues/130396}.)
@end itemize

@node Deprecated C APIs,,Removed C APIs,C API changes
@anchor{whatsnew/3 14 deprecated-c-apis}@anchor{3d1}@anchor{whatsnew/3 14 whatsnew314-c-api-deprecated}@anchor{3d2}
@subsubsection Deprecated C APIs



@itemize *

@item 
The @code{Py_HUGE_VAL} macro is now @ref{23f,,soft deprecated}.
Use @code{Py_INFINITY} instead.
(Contributed by Sergey B Kirpichev in gh-120026@footnote{https://github.com/python/cpython/issues/120026}.)

@item 
The @code{Py_IS_NAN}, @code{Py_IS_INFINITY},
and @code{Py_IS_FINITE} macros are now @ref{23f,,soft deprecated}.
Use @code{isnan}, @code{isinf} and @code{isfinite}
instead, available from @code{math.h} since C99.
(Contributed by Sergey B Kirpichev in gh-119613@footnote{https://github.com/python/cpython/issues/119613}.)

@item 
Non-tuple sequences are now deprecated as argument for the @code{(items)}
format unit in @ref{3bf,,PyArg_ParseTuple()} and other @ref{3d3,,argument parsing} functions if `items' contains format units
which store a @ref{3d4,,borrowed buffer} or a
@ref{3d5,,borrowed reference}.
(Contributed by Serhiy Storchaka in gh-50333@footnote{https://github.com/python/cpython/issues/50333}.)

@item 
The @code{_PyMonitoring_FireBranchEvent} function is now deprecated
and should be replaced with calls to
@ref{3ab,,PyMonitoring_FireBranchLeftEvent()} and
@ref{3ac,,PyMonitoring_FireBranchRightEvent()}.

@item 
The previously undocumented function @ref{3d6,,PySequence_In()} is
now @ref{23f,,soft deprecated}.
Use @ref{3d7,,PySequence_Contains()} instead.
(Contributed by Yuki Kobayashi in gh-127896@footnote{https://github.com/python/cpython/issues/127896}.)
@end itemize

@c Add C API deprecations above alphabetically, not here at the end.

@menu
* Pending removal in Python 3.15: Pending removal in Python 3 15<2>. 
* Pending removal in Python 3.16: Pending removal in Python 3 16<2>. 
* Pending removal in Python 3.18: Pending removal in Python 3 18<2>. 
* Pending removal in future versions: Pending removal in future versions<2>. 

@end menu

@node Pending removal in Python 3 15<2>,Pending removal in Python 3 16<2>,,Deprecated C APIs
@anchor{whatsnew/3 14 id13}@anchor{3d8}
@subsubsection Pending removal in Python 3.15



@itemize *

@item 
The @ref{3d9,,PyImport_ImportModuleNoBlock()}:
Use @ref{3da,,PyImport_ImportModule()} instead.

@item 
@ref{3db,,PyWeakref_GetObject()} and @ref{3dc,,PyWeakref_GET_OBJECT()}:
Use @ref{3dd,,PyWeakref_GetRef()} instead. The pythoncapi-compat project@footnote{https://github.com/python/pythoncapi-compat/} can be used to get
@code{PyWeakref_GetRef()} on Python 3.12 and older.

@item 
@ref{3de,,Py_UNICODE} type and the @code{Py_UNICODE_WIDE} macro:
Use @code{wchar_t} instead.

@item 
@code{PyUnicode_AsDecodedObject()}:
Use @ref{3df,,PyCodec_Decode()} instead.

@item 
@code{PyUnicode_AsDecodedUnicode()}:
Use @ref{3df,,PyCodec_Decode()} instead; Note that some codecs (for example, “base64”)
may return a type other than @ref{16a,,str}, such as @ref{193,,bytes}.

@item 
@code{PyUnicode_AsEncodedObject()}:
Use @ref{3e0,,PyCodec_Encode()} instead.

@item 
@code{PyUnicode_AsEncodedUnicode()}:
Use @ref{3e0,,PyCodec_Encode()} instead; Note that some codecs (for example, “base64”)
may return a type other than @ref{193,,bytes}, such as @ref{16a,,str}.

@item 
Python initialization functions, deprecated in Python 3.13:


@itemize *

@item 
@ref{3e1,,Py_GetPath()}:
Use @ref{37a,,PyConfig_Get("module_search_paths")}
(@ref{3e2,,sys.path}) instead.

@item 
@ref{3e3,,Py_GetPrefix()}:
Use @ref{37a,,PyConfig_Get("base_prefix")}
(@ref{3e4,,sys.base_prefix}) instead. Use @code{PyConfig_Get("prefix")} (@ref{3e5,,sys.prefix}) if @ref{3e6,,virtual environments} need to be handled.

@item 
@ref{3e7,,Py_GetExecPrefix()}:
Use @ref{37a,,PyConfig_Get("base_exec_prefix")}
(@ref{3e8,,sys.base_exec_prefix}) instead. Use
@code{PyConfig_Get("exec_prefix")}
(@ref{3e9,,sys.exec_prefix}) if @ref{3e6,,virtual environments} need to
be handled.

@item 
@ref{3ea,,Py_GetProgramFullPath()}:
Use @ref{37a,,PyConfig_Get("executable")}
(@ref{3eb,,sys.executable}) instead.

@item 
@ref{3ec,,Py_GetProgramName()}:
Use @ref{37a,,PyConfig_Get("executable")}
(@ref{3eb,,sys.executable}) instead.

@item 
@ref{3ed,,Py_GetPythonHome()}:
Use @ref{37a,,PyConfig_Get("home")} or the
@geindex PYTHONHOME
@geindex environment variable; PYTHONHOME
@ref{3ee,,PYTHONHOME} environment variable instead.
@end itemize

The pythoncapi-compat project@footnote{https://github.com/python/pythoncapi-compat/} can be used to get
@ref{37a,,PyConfig_Get()} on Python 3.13 and older.

@item 
Functions to configure Python’s initialization, deprecated in Python 3.11:


@itemize *

@item 
@code{PySys_SetArgvEx()}:
Set @ref{3ef,,PyConfig.argv} instead.

@item 
@code{PySys_SetArgv()}:
Set @ref{3ef,,PyConfig.argv} instead.

@item 
@code{Py_SetProgramName()}:
Set @ref{3f0,,PyConfig.program_name} instead.

@item 
@code{Py_SetPythonHome()}:
Set @ref{3f1,,PyConfig.home} instead.

@item 
@ref{3f2,,PySys_ResetWarnOptions()}:
Clear @ref{3f3,,sys.warnoptions} and @code{warnings.filters} instead.
@end itemize

The @ref{3f4,,Py_InitializeFromConfig()} API should be used with
@ref{3f5,,PyConfig} instead.

@item 
Global configuration variables:


@itemize *

@item 
@ref{3f6,,Py_DebugFlag}:
Use @ref{3f7,,PyConfig.parser_debug} or
@ref{37a,,PyConfig_Get("parser_debug")} instead.

@item 
@ref{3f8,,Py_VerboseFlag}:
Use @ref{3f9,,PyConfig.verbose} or
@ref{37a,,PyConfig_Get("verbose")} instead.

@item 
@ref{3fa,,Py_QuietFlag}:
Use @ref{3fb,,PyConfig.quiet} or
@ref{37a,,PyConfig_Get("quiet")} instead.

@item 
@ref{3fc,,Py_InteractiveFlag}:
Use @ref{3fd,,PyConfig.interactive} or
@ref{37a,,PyConfig_Get("interactive")} instead.

@item 
@ref{3fe,,Py_InspectFlag}:
Use @ref{3ff,,PyConfig.inspect} or
@ref{37a,,PyConfig_Get("inspect")} instead.

@item 
@ref{400,,Py_OptimizeFlag}:
Use @ref{401,,PyConfig.optimization_level} or
@ref{37a,,PyConfig_Get("optimization_level")} instead.

@item 
@ref{402,,Py_NoSiteFlag}:
Use @ref{403,,PyConfig.site_import} or
@ref{37a,,PyConfig_Get("site_import")} instead.

@item 
@ref{404,,Py_BytesWarningFlag}:
Use @ref{405,,PyConfig.bytes_warning} or
@ref{37a,,PyConfig_Get("bytes_warning")} instead.

@item 
@ref{406,,Py_FrozenFlag}:
Use @ref{407,,PyConfig.pathconfig_warnings} or
@ref{37a,,PyConfig_Get("pathconfig_warnings")} instead.

@item 
@ref{408,,Py_IgnoreEnvironmentFlag}:
Use @ref{409,,PyConfig.use_environment} or
@ref{37a,,PyConfig_Get("use_environment")} instead.

@item 
@ref{40a,,Py_DontWriteBytecodeFlag}:
Use @ref{40b,,PyConfig.write_bytecode} or
@ref{37a,,PyConfig_Get("write_bytecode")} instead.

@item 
@ref{40c,,Py_NoUserSiteDirectory}:
Use @ref{40d,,PyConfig.user_site_directory} or
@ref{37a,,PyConfig_Get("user_site_directory")} instead.

@item 
@ref{40e,,Py_UnbufferedStdioFlag}:
Use @ref{40f,,PyConfig.buffered_stdio} or
@ref{37a,,PyConfig_Get("buffered_stdio")} instead.

@item 
@ref{410,,Py_HashRandomizationFlag}:
Use @ref{411,,PyConfig.use_hash_seed}
and @ref{412,,PyConfig.hash_seed} or
@ref{37a,,PyConfig_Get("hash_seed")} instead.

@item 
@ref{413,,Py_IsolatedFlag}:
Use @ref{414,,PyConfig.isolated} or
@ref{37a,,PyConfig_Get("isolated")} instead.

@item 
@ref{415,,Py_LegacyWindowsFSEncodingFlag}:
Use @ref{416,,PyPreConfig.legacy_windows_fs_encoding} or
@ref{37a,,PyConfig_Get("legacy_windows_fs_encoding")} instead.

@item 
@ref{417,,Py_LegacyWindowsStdioFlag}:
Use @ref{418,,PyConfig.legacy_windows_stdio} or
@ref{37a,,PyConfig_Get("legacy_windows_stdio")} instead.

@item 
@code{Py_FileSystemDefaultEncoding}, @code{Py_HasFileSystemDefaultEncoding}:
Use @ref{419,,PyConfig.filesystem_encoding} or
@ref{37a,,PyConfig_Get("filesystem_encoding")} instead.

@item 
@code{Py_FileSystemDefaultEncodeErrors}:
Use @ref{41a,,PyConfig.filesystem_errors} or
@ref{37a,,PyConfig_Get("filesystem_errors")} instead.

@item 
@code{Py_UTF8Mode}:
Use @ref{41b,,PyPreConfig.utf8_mode} or
@ref{37a,,PyConfig_Get("utf8_mode")} instead.
(see @ref{41c,,Py_PreInitialize()})
@end itemize

The @ref{3f4,,Py_InitializeFromConfig()} API should be used with
@ref{3f5,,PyConfig} to set these options. Or @ref{37a,,PyConfig_Get()} can be
used to get these options at runtime.
@end itemize

@node Pending removal in Python 3 16<2>,Pending removal in Python 3 18<2>,Pending removal in Python 3 15<2>,Deprecated C APIs
@anchor{whatsnew/3 14 id14}@anchor{41d}
@subsubsection Pending removal in Python 3.16



@itemize *

@item 
The bundled copy of @code{libmpdec}.
@end itemize

@node Pending removal in Python 3 18<2>,Pending removal in future versions<2>,Pending removal in Python 3 16<2>,Deprecated C APIs
@anchor{whatsnew/3 14 id15}@anchor{41e}
@subsubsection Pending removal in Python 3.18



@itemize *

@item 
The following private functions are deprecated
and planned for removal in Python 3.18:


@itemize *

@item 
@code{_PyBytes_Join()}: use @ref{381,,PyBytes_Join()}.

@item 
@code{_PyDict_GetItemStringWithError()}: use @ref{41f,,PyDict_GetItemStringRef()}.

@item 
@code{_PyDict_Pop()}: use @ref{420,,PyDict_Pop()}.

@item 
@code{_PyLong_Sign()}: use @ref{398,,PyLong_GetSign()}.

@item 
@code{_PyLong_FromDigits()} and @code{_PyLong_New()}:
use @ref{3a8,,PyLongWriter_Create()}.

@item 
@code{_PyThreadState_UncheckedGet()}: use @ref{421,,PyThreadState_GetUnchecked()}.

@item 
@code{_PyUnicode_AsString()}: use @ref{422,,PyUnicode_AsUTF8()}.

@item 
@code{_PyUnicodeWriter_Init()}:
replace @code{_PyUnicodeWriter_Init(&writer)} with
@ref{3b2,,writer = PyUnicodeWriter_Create(0)}.

@item 
@code{_PyUnicodeWriter_Finish()}:
replace @code{_PyUnicodeWriter_Finish(&writer)} with
@ref{3b5,,PyUnicodeWriter_Finish(writer)}.

@item 
@code{_PyUnicodeWriter_Dealloc()}:
replace @code{_PyUnicodeWriter_Dealloc(&writer)} with
@ref{3b4,,PyUnicodeWriter_Discard(writer)}.

@item 
@code{_PyUnicodeWriter_WriteChar()}:
replace @code{_PyUnicodeWriter_WriteChar(&writer, ch)} with
@ref{3b8,,PyUnicodeWriter_WriteChar(writer@comma{} ch)}.

@item 
@code{_PyUnicodeWriter_WriteStr()}:
replace @code{_PyUnicodeWriter_WriteStr(&writer, str)} with
@ref{3ba,,PyUnicodeWriter_WriteStr(writer@comma{} str)}.

@item 
@code{_PyUnicodeWriter_WriteSubstring()}:
replace @code{_PyUnicodeWriter_WriteSubstring(&writer, str, start, end)} with
@ref{3bb,,PyUnicodeWriter_WriteSubstring(writer@comma{} str@comma{} start@comma{} end)}.

@item 
@code{_PyUnicodeWriter_WriteASCIIString()}:
replace @code{_PyUnicodeWriter_WriteASCIIString(&writer, str)} with
@ref{3b7,,PyUnicodeWriter_WriteASCII(writer@comma{} str)}.

@item 
@code{_PyUnicodeWriter_WriteLatin1String()}:
replace @code{_PyUnicodeWriter_WriteLatin1String(&writer, str)} with
@ref{3bd,,PyUnicodeWriter_WriteUTF8(writer@comma{} str)}.

@item 
@code{_PyUnicodeWriter_Prepare()}: (no replacement).

@item 
@code{_PyUnicodeWriter_PrepareKind()}: (no replacement).

@item 
@code{_Py_HashPointer()}: use @ref{423,,Py_HashPointer()}.

@item 
@code{_Py_fopen_obj()}: use @ref{391,,Py_fopen()}.
@end itemize

The pythoncapi-compat project@footnote{https://github.com/python/pythoncapi-compat/} can be used to get
these new public functions on Python 3.13 and older.
(Contributed by Victor Stinner in gh-128863@footnote{https://github.com/python/cpython/issues/128863}.)
@end itemize

@node Pending removal in future versions<2>,,Pending removal in Python 3 18<2>,Deprecated C APIs
@anchor{whatsnew/3 14 id16}@anchor{424}
@subsubsection Pending removal in future versions


The following APIs are deprecated and will be removed,
although there is currently no date scheduled for their removal.


@itemize *

@item 
@ref{425,,Py_TPFLAGS_HAVE_FINALIZE}:
Unneeded since Python 3.8.

@item 
@ref{426,,PyErr_Fetch()}:
Use @ref{427,,PyErr_GetRaisedException()} instead.

@item 
@ref{428,,PyErr_NormalizeException()}:
Use @ref{427,,PyErr_GetRaisedException()} instead.

@item 
@ref{429,,PyErr_Restore()}:
Use @ref{42a,,PyErr_SetRaisedException()} instead.

@item 
@ref{42b,,PyModule_GetFilename()}:
Use @ref{42c,,PyModule_GetFilenameObject()} instead.

@item 
@ref{42d,,PyOS_AfterFork()}:
Use @ref{42e,,PyOS_AfterFork_Child()} instead.

@item 
@ref{42f,,PySlice_GetIndicesEx()}:
Use @ref{430,,PySlice_Unpack()} and @ref{431,,PySlice_AdjustIndices()} instead.

@item 
@ref{432,,PyUnicode_READY()}:
Unneeded since Python 3.12

@item 
@code{PyErr_Display()}:
Use @ref{433,,PyErr_DisplayException()} instead.

@item 
@code{_PyErr_ChainExceptions()}:
Use @code{_PyErr_ChainExceptions1()} instead.

@item 
@code{PyBytesObject.ob_shash} member:
call @ref{434,,PyObject_Hash()} instead.

@item 
Thread Local Storage (TLS) API:


@itemize *

@item 
@ref{435,,PyThread_create_key()}:
Use @ref{436,,PyThread_tss_alloc()} instead.

@item 
@ref{437,,PyThread_delete_key()}:
Use @ref{438,,PyThread_tss_free()} instead.

@item 
@ref{439,,PyThread_set_key_value()}:
Use @ref{43a,,PyThread_tss_set()} instead.

@item 
@ref{43b,,PyThread_get_key_value()}:
Use @ref{43c,,PyThread_tss_get()} instead.

@item 
@ref{43d,,PyThread_delete_key_value()}:
Use @ref{43e,,PyThread_tss_delete()} instead.

@item 
@ref{43f,,PyThread_ReInitTLS()}:
Unneeded since Python 3.7.
@end itemize
@end itemize

@node Build changes,Porting to Python 3 14,C API changes,What’s new in Python 3 14
@anchor{whatsnew/3 14 build-changes}@anchor{440}@anchor{whatsnew/3 14 whatsnew314-build-changes}@anchor{157}
@subsection Build changes



@itemize *

@item 
@geindex Python Enhancement Proposals; PEP 776
PEP 776@footnote{https://peps.python.org/pep-0776/}: Emscripten is now an officially supported platform at
@geindex Python Enhancement Proposals; PEP 11#tier-3
tier 3@footnote{https://peps.python.org/pep-0011/#tier-3}. As a part of this effort, more than 25 bugs in
Emscripten libc@footnote{https://emscripten.org/docs/porting/emscripten-runtime-environment.html} were fixed. Emscripten now includes support
for @ref{2e,,ctypes}, @ref{e7,,termios}, and @ref{5d,,fcntl}, as well as
experimental support for the new @ref{441,,default interactive shell}.
(Contributed by R. Hood Chatham in gh-127146@footnote{https://github.com/python/cpython/issues/127146}, gh-127683@footnote{https://github.com/python/cpython/issues/127683}, and gh-136931@footnote{https://github.com/python/cpython/issues/136931}.)

@item 
Official Android binary releases are now provided on python.org@footnote{https://www.python.org/downloads/android/}.

@item 
GNU Autoconf 2.72 is now required to generate @code{configure}.
(Contributed by Erlend Aasland in gh-115765@footnote{https://github.com/python/cpython/issues/115765}.)

@item 
@code{wasm32-unknown-emscripten} is now a 
@geindex Python Enhancement Proposals; PEP 11
PEP 11@footnote{https://peps.python.org/pep-0011/} tier 3 platform.
(Contributed by R. Hood Chatham in gh-127146@footnote{https://github.com/python/cpython/issues/127146}, gh-127683@footnote{https://github.com/python/cpython/issues/127683}, and gh-136931@footnote{https://github.com/python/cpython/issues/136931}.)

@item 
@code{#pragma}-based linking with @code{python3*.lib} can now be switched off
with @ref{442,,Py_NO_LINK_LIB}.
(Contributed by Jean-Christophe Fillion-Robin in gh-82909@footnote{https://github.com/python/cpython/issues/82909}.)

@item 
CPython now enables a set of recommended compiler options by default
for improved security.
Use the @ref{443,,--disable-safety} @code{configure} option to disable them,
or the @ref{444,,--enable-slower-safety} option for a larger set
of compiler options, albeit with a performance cost.

@item 
The @code{WITH_FREELISTS} macro and @code{--without-freelists} @code{configure}
option have been removed.

@item 
The new @code{configure} option @ref{173,,--with-tail-call-interp}
may be used to enable the experimental tail call interpreter.
See @ref{150,,A new type of interpreter} for further details.

@item 
To disable the new remote debugging support, use the
@ref{171,,--without-remote-debug} @code{configure} option.
This may be useful for security reasons.

@item 
iOS and macOS apps can now be configured to redirect @code{stdout} and
@code{stderr} content to the system log.
(Contributed by Russell Keith-Magee in gh-127592@footnote{https://github.com/python/cpython/issues/127592}.)

@item 
The iOS testbed is now able to stream test output while the test is running.
The testbed can also be used to run the test suite of projects other than
CPython itself.
(Contributed by Russell Keith-Magee in gh-127592@footnote{https://github.com/python/cpython/issues/127592}.)
@end itemize

@menu
* build-details.json: build-details json. 
* Discontinuation of PGP signatures:: 
* Free-threaded Python is officially supported:: 
* Binary releases for the experimental just-in-time compiler:: 

@end menu

@node build-details json,Discontinuation of PGP signatures,,Build changes
@anchor{whatsnew/3 14 build-details-json}@anchor{445}@anchor{whatsnew/3 14 whatsnew314-build-details}@anchor{446}
@subsubsection @code{build-details.json}


Installations of Python now contain a new file, @code{build-details.json}.
This is a static JSON document containing build details for CPython,
to allow for introspection without needing to run code.
This is helpful for use-cases such as Python launchers, cross-compilation,
and so on.

@code{build-details.json} must be installed in the platform-independent
standard library directory. This corresponds to the @ref{447,,‘stdlib’} @ref{e1,,sysconfig} installation path,
which can be found by running @code{sysconfig.get_path('stdlib')}.


@subsubheading See also


@geindex Python Enhancement Proposals; PEP 739
PEP 739@footnote{https://peps.python.org/pep-0739/} – @code{build-details.json} 1.0 – a static description file
for Python build details


@node Discontinuation of PGP signatures,Free-threaded Python is officially supported,build-details json,Build changes
@anchor{whatsnew/3 14 discontinuation-of-pgp-signatures}@anchor{448}@anchor{whatsnew/3 14 whatsnew314-no-more-pgp}@anchor{159}
@subsubsection Discontinuation of PGP signatures


PGP (Pretty Good Privacy) signatures will not be provided
for releases of Python 3.14 or future versions.
To verify CPython artifacts, users must use Sigstore verification materials@footnote{https://www.python.org/downloads/metadata/sigstore/}.
Releases have been signed using Sigstore@footnote{https://www.sigstore.dev/} since Python 3.11.

This change in release process was specified in 
@geindex Python Enhancement Proposals; PEP 761
PEP 761@footnote{https://peps.python.org/pep-0761/}.

@node Free-threaded Python is officially supported,Binary releases for the experimental just-in-time compiler,Discontinuation of PGP signatures,Build changes
@anchor{whatsnew/3 14 free-threaded-python-is-officially-supported}@anchor{449}@anchor{whatsnew/3 14 whatsnew314-free-threaded-now-supported}@anchor{158}
@subsubsection Free-threaded Python is officially supported


The free-threaded build of Python is now supported and no longer experimental.
This is the start of phase II@footnote{https://discuss.python.org/t/37075} where
free-threaded Python is officially supported but still optional.

The free-threading team are confident that the project is on the right path,
and appreciate the continued dedication from everyone working to make
free-threading ready for broader adoption across the Python community.

With these recommendations and the acceptance of this PEP, the Python developer
community should broadly advertise that free-threading is a supported
Python build option now and into the future, and that it will not be removed
without a proper deprecation schedule.

Any decision to transition to phase III@footnote{https://discuss.python.org/t/37075},
with free-threading as the default or sole build of Python is still undecided,
and dependent on many factors both within CPython itself and the community.
This decision is for the future.


@subsubheading See also


@geindex Python Enhancement Proposals; PEP 779
PEP 779@footnote{https://peps.python.org/pep-0779/}

PEP 779's acceptance@footnote{https://discuss.python.org/t/84319/123}


@node Binary releases for the experimental just-in-time compiler,,Free-threaded Python is officially supported,Build changes
@anchor{whatsnew/3 14 binary-releases-for-the-experimental-just-in-time-compiler}@anchor{44a}@anchor{whatsnew/3 14 whatsnew314-jit-compiler}@anchor{15a}
@subsubsection Binary releases for the experimental just-in-time compiler


The official macOS and Windows release binaries now include an `experimental'
just-in-time (JIT) compiler. Although it is `not' recommended for production
use, it can be tested by setting 
@geindex PYTHON_JIT
@geindex environment variable; PYTHON_JIT
@ref{44b,,PYTHON_JIT=1} as an
environment variable. Downstream source builds and redistributors can use the
@ref{44c,,--enable-experimental-jit=yes-off} configuration option for similar
behavior.

The JIT is at an early stage and still in active development. As such, the
typical performance impact of enabling it can range from 10% slower to 20%
faster, depending on workload. To aid in testing and evaluation, a set of
introspection functions has been provided in the @ref{295,,sys._jit} namespace.
@ref{44d,,sys._jit.is_available()} can be used to determine if the current executable
supports JIT compilation, while @ref{44e,,sys._jit.is_enabled()} can be used to tell
if JIT compilation has been enabled for the current process.

Currently, the most significant missing functionality is that native debuggers
and profilers like @code{gdb} and @code{perf} are unable to unwind through JIT frames
(Python debuggers and profilers, like @ref{aa,,pdb} or @ref{b4,,profile}, continue to
work without modification). Free-threaded builds do not support JIT compilation.

Please report any bugs or major performance regressions that you encounter!


@subsubheading See also


@geindex Python Enhancement Proposals; PEP 744
PEP 744@footnote{https://peps.python.org/pep-0744/}


@node Porting to Python 3 14,Notable changes in 3 14 1,Build changes,What’s new in Python 3 14
@anchor{whatsnew/3 14 porting-to-python-3-14}@anchor{14c}
@subsection Porting to Python 3.14


This section lists previously described changes and other bugfixes
that may require changes to your code.

@menu
* Changes in the Python API:: 
* Changes in annotations (PEP 649 and PEP 749): Changes in annotations PEP 649 and PEP 749. 
* Changes in the C API:: 

@end menu

@node Changes in the Python API,Changes in annotations PEP 649 and PEP 749,,Porting to Python 3 14
@anchor{whatsnew/3 14 changes-in-the-python-api}@anchor{44f}
@subsubsection Changes in the Python API



@itemize *

@item 
On Unix platforms other than macOS, `forkserver' is now the default
@ref{1d7,,start method} for @ref{98,,multiprocessing}
and @ref{1d8,,ProcessPoolExecutor}, instead of `fork'.

See @ref{1d5,,(1)} and
@ref{24b,,(2)} for details.

If you encounter @ref{450,,NameError}s or pickling errors coming out of
@ref{98,,multiprocessing} or @ref{24,,concurrent.futures}, see the
@ref{1db,,forkserver restrictions}.

This change does not affect Windows or macOS, where @ref{1da,,‘spawn’} remains the default start method.

@item 
@ref{219,,functools.partial} is now a method descriptor.
Wrap it in @ref{451,,staticmethod()} if you want to preserve the old behavior.
(Contributed by Serhiy Storchaka and Dominykas Grigonis in gh-121027@footnote{https://github.com/python/cpython/issues/121027}.)

@item 
The @ref{153,,garbage collector is now incremental},
which means that the behavior of @ref{1b5,,gc.collect()} changes slightly:


@itemize *

@item 
@code{gc.collect(1)}: Performs an increment of garbage collection,
rather than collecting generation 1.

@item 
Other calls to @code{gc.collect()} are unchanged.
@end itemize

@item 
The @ref{452,,locale.nl_langinfo()} function now temporarily sets the @code{LC_CTYPE}
locale in some cases.
This temporary change affects other threads.
(Contributed by Serhiy Storchaka in gh-69998@footnote{https://github.com/python/cpython/issues/69998}.)

@item 
@ref{2a9,,types.UnionType} is now an alias for @ref{2aa,,typing.Union},
causing changes in some behaviors.
See @ref{2ab,,above} for more details.
(Contributed by Jelle Zijlstra in gh-105499@footnote{https://github.com/python/cpython/issues/105499}.)

@item 
The runtime behavior of annotations has changed in various ways; see
@ref{146,,above} for details. While most code that interacts
with annotations should continue to work, some undocumented details may behave
differently.

@item 
As part of making the @ref{93,,mimetypes} CLI public,
it now exits with @code{1} on failure instead of @code{0}
and @code{2} on incorrect command-line parameters instead of @code{1}.
Error messages are now printed to stderr.

@item 
The @code{\B} pattern in regular expression now matches the empty string
when given as the entire pattern, which may cause behavioural changes.

@item 
On FreeBSD, @ref{293,,sys.platform} no longer contains the major version number.
@end itemize

@node Changes in annotations PEP 649 and PEP 749,Changes in the C API,Changes in the Python API,Porting to Python 3 14
@anchor{whatsnew/3 14 changes-in-annotations-pep-649-and-pep-749}@anchor{453}@anchor{whatsnew/3 14 whatsnew314-porting-annotations}@anchor{162}
@subsubsection Changes in annotations (
@geindex Python Enhancement Proposals; PEP 649
`PEP 649' and 
@geindex Python Enhancement Proposals; PEP 749
`PEP 749')


This section contains guidance on changes that may be needed to annotations
or Python code that interacts with or introspects annotations,
due to the changes related to @ref{146,,deferred evaluation of annotations}.

In the majority of cases, working code from older versions of Python
will not require any changes.

@menu
* Implications for annotated code:: 
* Implications for readers of __annotations__:: 
* Related changes:: 
* from __future__ import annotations:: 

@end menu

@node Implications for annotated code,Implications for readers of __annotations__,,Changes in annotations PEP 649 and PEP 749
@anchor{whatsnew/3 14 implications-for-annotated-code}@anchor{454}
@subsubsection Implications for annotated code


If you define annotations in your code (for example, for use with a static type
checker), then this change probably does not affect you: you can keep
writing annotations the same way you did with previous versions of Python.

You will likely be able to remove quoted strings in annotations, which are frequently
used for forward references. Similarly, if you use @code{from __future__ import annotations}
to avoid having to write strings in annotations, you may well be able to
remove that import once you support only Python 3.14 and newer.
However, if you rely on third-party libraries that read annotations,
those libraries may need changes to support unquoted annotations before they
work as expected.

@node Implications for readers of __annotations__,Related changes,Implications for annotated code,Changes in annotations PEP 649 and PEP 749
@anchor{whatsnew/3 14 implications-for-readers-of-annotations}@anchor{455}
@subsubsection Implications for readers of @code{__annotations__}


If your code reads the @ref{456,,__annotations__} attribute on objects,
you may want to make changes in order to support code that relies on
deferred evaluation of annotations.
For example, you may want to use @ref{457,,annotationlib.get_annotations()} with
the @ref{160,,FORWARDREF} format,
as the @ref{33,,dataclasses} module now does.

The external typing_extensions@footnote{https://pypi.org/project/typing_extensions/} package provides partial backports
of some of the functionality of the @ref{6,,annotationlib} module,
such as the @ref{232,,Format} enum and
the @ref{457,,get_annotations()} function.
These can be used to write cross-version code that takes advantage of
the new behavior in Python 3.14.

@node Related changes,from __future__ import annotations,Implications for readers of __annotations__,Changes in annotations PEP 649 and PEP 749
@anchor{whatsnew/3 14 related-changes}@anchor{458}
@subsubsection Related changes


The changes in Python 3.14 are designed to rework how @code{__annotations__}
works at runtime while minimizing breakage to code that contains
annotations in source code and to code that reads @code{__annotations__}.
However, if you rely on undocumented details of the annotation behavior
or on private functions in the standard library, there are many ways in which
your code may not work in Python 3.14.
To safeguard your code against future changes, only use the documented
functionality of the @ref{6,,annotationlib} module.

In particular, do not read annotations directly from the namespace dictionary
attribute of type objects.
Use @ref{459,,annotationlib.get_annotate_from_class_namespace()} during class
construction and @ref{457,,annotationlib.get_annotations()} afterwards.

In previous releases, it was sometimes possible to access class annotations
from an instance of an annotated class. This behavior was undocumented
and accidental, and will no longer work in Python 3.14.

@node from __future__ import annotations,,Related changes,Changes in annotations PEP 649 and PEP 749
@anchor{whatsnew/3 14 from-future-import-annotations}@anchor{45a}
@subsubsection @code{from __future__ import annotations}


In Python 3.7, 
@geindex Python Enhancement Proposals; PEP 563
PEP 563@footnote{https://peps.python.org/pep-0563/} introduced the @code{from __future__ import annotations}
@ref{45b,,future statement}, which turns all annotations into strings.

However, this statement is now deprecated and it is expected to be removed
in a future version of Python.
This removal will not happen until after Python 3.13 reaches its end of life
in 2029, being the last version of Python without support for deferred
evaluation of annotations.

In Python 3.14, the behavior of code using @code{from __future__ import annotations}
is unchanged.

@node Changes in the C API,,Changes in annotations PEP 649 and PEP 749,Porting to Python 3 14
@anchor{whatsnew/3 14 changes-in-the-c-api}@anchor{45c}
@subsubsection Changes in the C API



@itemize *

@item 
@ref{45d,,Py_Finalize()} now deletes all interned strings. This
is backwards incompatible to any C extension that holds onto an interned
string after a call to @code{Py_Finalize()} and is then reused after a
call to @ref{45e,,Py_Initialize()}.  Any issues arising from this behavior will
normally result in crashes during the execution of the subsequent call to
@code{Py_Initialize()} from accessing uninitialized memory. To fix, use
an address sanitizer to identify any use-after-free coming from
an interned string and deallocate it during module shutdown.
(Contributed by Eddie Elizondo in gh-113601@footnote{https://github.com/python/cpython/issues/113601}.)

@item 
The @ref{45f,,Unicode Exception Objects} C API
now raises a @ref{199,,TypeError} if its exception argument is not
a @ref{460,,UnicodeError} object.
(Contributed by Bénédikt Tran in gh-127691@footnote{https://github.com/python/cpython/issues/127691}.)
@end itemize
@anchor{whatsnew/3 14 whatsnew314-refcount}@anchor{2d2}

@itemize *

@item 
The interpreter internally avoids some reference count modifications when
loading objects onto the operands stack by @ref{3d5,,borrowing}
references when possible. This can lead to smaller reference count values
compared to previous Python versions. C API extensions that checked
@ref{2d1,,Py_REFCNT()} of @code{1} to determine if an function argument is not
referenced by any other code should instead use
@ref{3c5,,PyUnstable_Object_IsUniqueReferencedTemporary()} as a safer replacement.

@item 
Private functions promoted to public C APIs:


@itemize *

@item 
@code{_PyBytes_Join()}: @ref{381,,PyBytes_Join()}

@item 
@code{_PyLong_IsNegative()}: @ref{39a,,PyLong_IsNegative()}

@item 
@code{_PyLong_IsPositive()}: @ref{399,,PyLong_IsPositive()}

@item 
@code{_PyLong_IsZero()}: @ref{39b,,PyLong_IsZero()}

@item 
@code{_PyLong_Sign()}: @ref{398,,PyLong_GetSign()}

@item 
@code{_PyUnicodeWriter_Dealloc()}: @ref{3b4,,PyUnicodeWriter_Discard()}

@item 
@code{_PyUnicodeWriter_Finish()}: @ref{3b5,,PyUnicodeWriter_Finish()}

@item 
@code{_PyUnicodeWriter_Init()}: use @ref{3b2,,PyUnicodeWriter_Create()}

@item 
@code{_PyUnicodeWriter_Prepare()}: (no replacement)

@item 
@code{_PyUnicodeWriter_PrepareKind()}: (no replacement)

@item 
@code{_PyUnicodeWriter_WriteChar()}: @ref{3b8,,PyUnicodeWriter_WriteChar()}

@item 
@code{_PyUnicodeWriter_WriteStr()}: @ref{3ba,,PyUnicodeWriter_WriteStr()}

@item 
@code{_PyUnicodeWriter_WriteSubstring()}: @ref{3bb,,PyUnicodeWriter_WriteSubstring()}

@item 
@code{_PyUnicode_EQ()}: @ref{3b0,,PyUnicode_Equal()}

@item 
@code{_PyUnicode_Equal()}: @ref{3b0,,PyUnicode_Equal()}

@item 
@code{_Py_GetConfig()}: @ref{37a,,PyConfig_Get()} and @ref{382,,PyConfig_GetInt()}

@item 
@code{_Py_HashBytes()}: @ref{393,,Py_HashBuffer()}

@item 
@code{_Py_fopen_obj()}: @ref{391,,Py_fopen()}

@item 
@code{PyMutex_IsLocked()} : @ref{461,,PyMutex_IsLocked()}
@end itemize

The pythoncapi-compat project@footnote{https://github.com/python/pythoncapi-compat/} can be used to get most of these new
functions on Python 3.13 and older.
@end itemize

@node Notable changes in 3 14 1,Notable changes in 3 14 5,Porting to Python 3 14,What’s new in Python 3 14
@anchor{whatsnew/3 14 notable-changes-in-3-14-1}@anchor{462}@anchor{whatsnew/3 14 pythoncapi-compat-project}@anchor{463}
@subsection Notable changes in 3.14.1



@itemize *

@item 
Add @ref{464,,PyUnstable_ThreadState_SetStackProtection()} and
@ref{465,,PyUnstable_ThreadState_ResetStackProtection()} functions to set
the stack protection base address and stack protection size of a Python
thread state.
(Contributed by Victor Stinner in gh-139653@footnote{https://github.com/python/cpython/issues/139653}.)
@end itemize

@node Notable changes in 3 14 5,,Notable changes in 3 14 1,What’s new in Python 3 14
@anchor{whatsnew/3 14 notable-changes-in-3-14-5}@anchor{466}
@subsection Notable changes in 3.14.5


@menu
* gc: gc<2>. 

@end menu

@node gc<2>,,,Notable changes in 3 14 5
@anchor{whatsnew/3 14 id19}@anchor{467}
@subsubsection gc



@itemize *

@item 
The incremental garbage collector shipped in Python 3.14.0-3.14.4 has been
reverted back to the generational garbage collector from 3.13,
due to a number of reports@footnote{https://github.com/python/cpython/issues/142516}
of significant memory pressure in production environments.
See @ref{153,,Garbage collection} for details.
@end itemize

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node What’s New In Python 3 13,What’s New In Python 3 12,What’s new in Python 3 14,What’s New in Python
@anchor{whatsnew/3 13 doc}@anchor{468}@anchor{whatsnew/3 13 translation-repo}@anchor{469}@anchor{whatsnew/3 13 what-s-new-in-python-3-13}@anchor{46a}
@section What’s New In Python 3.13


@*Editors: 
Adam Turner and Thomas Wouters


@c Rules for maintenance:
@c 
@c * Anyone can add text to this document.  Do not spend very much time
@c on the wording of your changes, because your text will probably
@c get rewritten to some degree.
@c 
@c * The maintainer will go through Misc/NEWS periodically and add
@c changes; it's therefore more important to add your changes to
@c Misc/NEWS than to this file.
@c 
@c * This is not a complete list of every single change; completeness
@c is the purpose of Misc/NEWS.  Some changes I consider too small
@c or esoteric to include.  If such a change is added to the text,
@c I'll just remove it.  (This is another reason you shouldn't spend
@c too much time on writing your addition.)
@c 
@c * If you want to draw your new text to the attention of the
@c maintainer, add 'XXX' to the beginning of the paragraph or
@c section.
@c 
@c * It's OK to just add a fragmentary note about a change.  For
@c example: "XXX Describe the transmogrify() function added to the
@c socket module."  The maintainer will research the change and
@c write the necessary text.
@c 
@c * You can comment out your additions if you like, but it's not
@c necessary (especially when a final release is some months away).
@c 
@c * Credit the author of a patch or bugfix.   Just the name is
@c sufficient; the e-mail address isn't necessary.
@c 
@c * It's helpful to add the issue number as a comment:
@c 
@c XXX Describe the transmogrify() function added to the socket
@c module.
@c (Contributed by P.Y. Developer in :gh:`12345`.)
@c 
@c This saves the maintainer the effort of going through the VCS log
@c when researching a change.

This article explains the new features in Python 3.13, compared to 3.12.
Python 3.13 was released on October 7, 2024.
For full details, see the @ref{143,,changelog}.


@subsubheading See also


@geindex Python Enhancement Proposals; PEP 719
PEP 719@footnote{https://peps.python.org/pep-0719/} – Python 3.13 Release Schedule


@menu
* Summary – Release Highlights:: 
* New Features:: 
* Other Language Changes:: 
* New Modules:: 
* Improved Modules:: 
* Optimizations: Optimizations<2>. 
* Removed Modules And APIs:: 
* New Deprecations:: 
* CPython Bytecode Changes:: 
* C API Changes:: 
* Build Changes:: 
* Porting to Python 3.13: Porting to Python 3 13. 
* Regression Test Changes:: 

@end menu

@node Summary – Release Highlights,New Features,,What’s New In Python 3 13
@anchor{whatsnew/3 13 summary-release-highlights}@anchor{46b}
@subsection Summary – Release Highlights


@c This section singles out the most important changes in Python 3.13.
@c Brevity is key.

Python 3.13 is a stable release of the Python programming
language, with a mix of changes to the language, the implementation
and the standard library.
The biggest changes include a new @ref{46c,,interactive interpreter}@anchor{whatsnew/3 13 whatsnew313-better-interactive-interpreter}@anchor{46c},
experimental support for running in a @ref{46d,,free-threaded mode}@anchor{whatsnew/3 13 whatsnew313-free-threaded-cpython}@anchor{46d} (
@geindex Python Enhancement Proposals; PEP 703
PEP 703@footnote{https://peps.python.org/pep-0703/}),
and a @ref{46e,,Just-In-Time compiler}@anchor{whatsnew/3 13 whatsnew313-jit-compiler}@anchor{46e} (
@geindex Python Enhancement Proposals; PEP 744
PEP 744@footnote{https://peps.python.org/pep-0744/}).

Error messages continue to improve, with tracebacks now highlighted in color
by default. The @ref{46f,,locals()} builtin now has @ref{470,,defined semantics} for changing the returned mapping,
and type parameters now support default values.

The library changes contain removal of deprecated APIs and modules,
as well as the usual improvements in user-friendliness and correctness.
Several legacy standard library modules have now @ref{471,,been removed}@anchor{whatsnew/3 13 whatsnew313-pep594}@anchor{471} following their deprecation in Python 3.11 (
@geindex Python Enhancement Proposals; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}).

This article doesn’t attempt to provide a complete specification
of all new features, but instead gives a convenient overview.
For full details refer to the documentation,
such as the @ref{14a,,Library Reference}
and @ref{14b,,Language Reference}.
To understand the complete implementation and design rationale for a change,
refer to the PEP for a particular new feature;
but note that PEPs usually are not kept up-to-date
once a feature has been fully implemented.
See @ref{472,,Porting to Python 3.13} for guidance on upgrading from
earlier versions of Python.


__________________________________________________________________


@c PEP-sized items next.

Interpreter improvements:


@itemize *

@item 
A greatly improved @ref{46c,,interactive interpreter} and
@ref{473,,improved error messages}.

@item 
@geindex Python Enhancement Proposals; PEP 667
PEP 667@footnote{https://peps.python.org/pep-0667/}: The @ref{46f,,locals()} builtin now has
@ref{470,,defined semantics} when mutating the
returned mapping. Python debuggers and similar tools may now more reliably
update local variables in optimized scopes even during concurrent code
execution.

@item 
@geindex Python Enhancement Proposals; PEP 703
PEP 703@footnote{https://peps.python.org/pep-0703/}: CPython 3.13 has experimental support for running with the
@ref{474,,global interpreter lock} disabled. See @ref{46d,,Free-threaded CPython} for more details.

@item 
@geindex Python Enhancement Proposals; PEP 744
PEP 744@footnote{https://peps.python.org/pep-0744/}: A basic @ref{46e,,JIT compiler} was added.
It is currently disabled by default (though we may turn it on later).
Performance improvements are modest – we expect to improve this
over the next few releases.

@item 
Color support in the new @ref{46c,,interactive interpreter},
as well as in @ref{473,,tracebacks}
and @ref{475,,doctest} output.
This can be disabled through the 
@geindex PYTHON_COLORS
@geindex environment variable; PYTHON_COLORS
@ref{476,,PYTHON_COLORS} and NO_COLOR@footnote{https://no-color.org/}
environment variables.
@end itemize

Python data model improvements:


@itemize *

@item 
@ref{477,,__static_attributes__} stores the names of attributes accessed
through @code{self.X} in any function in a class body.

@item 
@ref{478,,__firstlineno__} records the first line number of a class
definition.
@end itemize

Significant improvements in the standard library:


@itemize *

@item 
Add a new @ref{479,,PythonFinalizationError} exception, raised when an operation
is blocked during @ref{47a,,finalization}.

@item 
The @ref{7,,argparse} module now supports deprecating command-line options,
positional arguments, and subcommands.

@item 
The new functions @ref{47b,,base64.z85encode()} and @ref{47c,,base64.z85decode()}
support encoding and decoding Z85 data@footnote{https://rfc.zeromq.org/spec/32/}.

@item 
The @ref{29,,copy} module now has a @ref{1c2,,copy.replace()} function,
with support for many builtin types and any class defining
the @ref{47d,,__replace__()} method.

@item 
The new @ref{39,,dbm.sqlite3} module is now the default @ref{35,,dbm} backend.

@item 
The @ref{a5,,os} module has a @ref{47e,,suite of new functions}
for working with Linux’s timer notification file descriptors.

@item 
The @ref{bd,,random} module now has a @ref{47f,,command-line interface}.
@end itemize

Security improvements:


@itemize *

@item 
@ref{480,,ssl.create_default_context()} sets @ref{481,,ssl.VERIFY_X509_PARTIAL_CHAIN}
and @ref{482,,ssl.VERIFY_X509_STRICT} as default flags.
@end itemize

C API improvements:


@itemize *

@item 
The @ref{483,,Py_mod_gil} slot is now used to indicate that
an extension module supports running with the @ref{165,,GIL} disabled.

@item 
The @ref{484,,PyTime C API} has been added,
providing access to system clocks.

@item 
@ref{485,,PyMutex} is a new lightweight mutex that occupies a single byte.

@item 
There is a new @ref{486,,suite of functions}
for generating 
@geindex Python Enhancement Proposals; PEP 669
PEP 669@footnote{https://peps.python.org/pep-0669/} monitoring events in the C API.
@end itemize

New typing features:


@itemize *

@item 
@geindex Python Enhancement Proposals; PEP 696
PEP 696@footnote{https://peps.python.org/pep-0696/}: Type parameters (@ref{487,,typing.TypeVar}, @ref{488,,typing.ParamSpec},
and @ref{489,,typing.TypeVarTuple}) now support defaults.

@item 
@geindex Python Enhancement Proposals; PEP 702
PEP 702@footnote{https://peps.python.org/pep-0702/}: The new @ref{48a,,warnings.deprecated()} decorator adds support
for marking deprecations in the type system and at runtime.

@item 
@geindex Python Enhancement Proposals; PEP 705
PEP 705@footnote{https://peps.python.org/pep-0705/}: @ref{48b,,typing.ReadOnly} can be used to mark an item of a
@ref{330,,typing.TypedDict} as read-only for type checkers.

@item 
@geindex Python Enhancement Proposals; PEP 742
PEP 742@footnote{https://peps.python.org/pep-0742/}: @ref{48c,,typing.TypeIs} provides more intuitive
type narrowing behavior, as an alternative to @ref{48d,,typing.TypeGuard}.
@end itemize

Platform support:


@itemize *

@item 
@geindex Python Enhancement Proposals; PEP 730
PEP 730@footnote{https://peps.python.org/pep-0730/}: Apple’s iOS is now an @ref{48e,,officially supported platform}, at 
@geindex Python Enhancement Proposals; PEP 11#tier-3
tier 3@footnote{https://peps.python.org/pep-0011/#tier-3}.

@item 
@geindex Python Enhancement Proposals; PEP 738
PEP 738@footnote{https://peps.python.org/pep-0738/}: Android is now an @ref{48e,,officially supported platform}, at 
@geindex Python Enhancement Proposals; PEP 11#tier-3
tier 3@footnote{https://peps.python.org/pep-0011/#tier-3}.

@item 
@code{wasm32-wasi} is now supported as a 
@geindex Python Enhancement Proposals; PEP 11#tier-2
tier 2@footnote{https://peps.python.org/pep-0011/#tier-2} platform.

@item 
@code{wasm32-emscripten} is no longer an officially supported platform.
@end itemize

Important removals:


@itemize *

@item 
@ref{471,,PEP 594}: The remaining 19 “dead batteries”
(legacy stdlib modules) have been removed from the standard library:
@code{aifc}, @code{audioop}, @code{cgi}, @code{cgitb}, @code{chunk},
@code{crypt}, @code{imghdr}, @code{mailcap}, @code{msilib}, @code{nis},
@code{nntplib}, @code{ossaudiodev}, @code{pipes}, @code{sndhdr},
@code{spwd}, @code{sunau}, @code{telnetlib}, @code{uu} and @code{xdrlib}.

@item 
Remove the @code{2to3} tool and @code{lib2to3} module
(deprecated in Python 3.11).

@item 
Remove the @code{tkinter.tix} module (deprecated in Python 3.6).

@item 
Remove the @code{locale.resetlocale()} function.

@item 
Remove the @code{typing.io} and @code{typing.re} namespaces.

@item 
Remove chained @ref{48f,,classmethod} descriptors.
@end itemize

Release schedule changes:

@geindex Python Enhancement Proposals; PEP 602
PEP 602@footnote{https://peps.python.org/pep-0602/} (“Annual Release Cycle for Python”) has been updated
to extend the full support (‘bugfix’) period for new releases to two years.
This updated policy means that:


@itemize *

@item 
Python 3.9–3.12 have one and a half years of full support,
followed by three and a half years of security fixes.

@item 
Python 3.13 and later have two years of full support,
followed by three years of security fixes.
@end itemize

@node New Features,Other Language Changes,Summary – Release Highlights,What’s New In Python 3 13
@anchor{whatsnew/3 13 new-features}@anchor{490}
@subsection New Features


@menu
* A better interactive interpreter:: 
* Improved error messages: Improved error messages<2>. 
* Free-threaded CPython:: 
* An experimental just-in-time (JIT) compiler: An experimental just-in-time JIT compiler. 
* Defined mutation semantics for locals(): Defined mutation semantics for locals. 
* Support for mobile platforms:: 

@end menu

@node A better interactive interpreter,Improved error messages<2>,,New Features
@anchor{whatsnew/3 13 a-better-interactive-interpreter}@anchor{491}
@subsubsection A better interactive interpreter


Python now uses a new @ref{1b7,,interactive} shell by default, based on code
from the PyPy project@footnote{https://pypy.org/}.
When the user starts the @ref{492,,REPL} from an interactive terminal,
the following new features are now supported:


@itemize *

@item 
Multiline editing with history preservation.

@item 
Direct support for REPL-specific commands like @code{help}, @code{exit},
and @code{quit}, without the need to call them as functions.

@item 
Prompts and tracebacks with @ref{1b9,,color enabled by default}.

@item 
Interactive help browsing using @code{F1} with a separate command
history.

@item 
History browsing using @code{F2} that skips output as well as the
@ref{493,,>>>} and @ref{494,,…} prompts.

@item 
“Paste mode” with @code{F3} that makes pasting larger blocks of code
easier (press @code{F3} again to return to the regular prompt).
@end itemize

To disable the new interactive shell,
set the 
@geindex PYTHON_BASIC_REPL
@geindex environment variable; PYTHON_BASIC_REPL
@ref{1b8,,PYTHON_BASIC_REPL} environment variable.
For more on interactive mode, see @ref{495,,Interactive Mode}.

(Contributed by Pablo Galindo Salgado, Łukasz Langa, and
Lysandros Nikolaou in gh-111201@footnote{https://github.com/python/cpython/issues/111201} based on code from the PyPy project.
Windows support contributed by Dino Viehland and Anthony Shaw.)

@node Improved error messages<2>,Free-threaded CPython,A better interactive interpreter,New Features
@anchor{whatsnew/3 13 improved-error-messages}@anchor{496}@anchor{whatsnew/3 13 whatsnew313-improved-error-messages}@anchor{473}
@subsubsection Improved error messages



@itemize *

@item 
The interpreter now uses color by default when displaying tracebacks in the
terminal. This feature @ref{1b9,,can be controlled}
via the new 
@geindex PYTHON_COLORS
@geindex environment variable; PYTHON_COLORS
@ref{476,,PYTHON_COLORS} environment variable as well as
the canonical NO_COLOR@footnote{https://no-color.org/} and FORCE_COLOR@footnote{https://force-color.org/} environment variables.
(Contributed by Pablo Galindo Salgado in gh-112730@footnote{https://github.com/python/cpython/issues/112730}.)

@item 
A common mistake is to write a script with the same name as a
standard library module. When this results in errors, we now
display a more helpful error message:

@example
$ python random.py
Traceback (most recent call last):
  File "/home/me/random.py", line 1, in <module>
    import random
  File "/home/me/random.py", line 3, in <module>
    print(random.randint(5))
          ^^^^^^^^^^^^^^
AttributeError: module 'random' has no attribute 'randint' (consider renaming '/home/me/random.py' since it has the same name as the standard library module named 'random' and prevents importing that standard library module)
@end example

Similarly, if a script has the same name as a third-party
module that it attempts to import and this results in errors,
we also display a more helpful error message:

@example
$ python numpy.py
Traceback (most recent call last):
  File "/home/me/numpy.py", line 1, in <module>
    import numpy as np
  File "/home/me/numpy.py", line 3, in <module>
    np.array([1, 2, 3])
    ^^^^^^^^
AttributeError: module 'numpy' has no attribute 'array' (consider renaming '/home/me/numpy.py' if it has the same name as a library you intended to import)
@end example

(Contributed by Shantanu Jain in gh-95754@footnote{https://github.com/python/cpython/issues/95754}.)

@item 
The error message now tries to suggest the correct keyword argument
when an incorrect keyword argument is passed to a function.

@example
>>> "Better error messages!".split(max_split=1)
Traceback (most recent call last):
  File "<python-input-0>", line 1, in <module>
    "Better error messages!".split(max_split=1)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
TypeError: split() got an unexpected keyword argument 'max_split'. Did you mean 'maxsplit'?
@end example

(Contributed by Pablo Galindo Salgado and Shantanu Jain in gh-107944@footnote{https://github.com/python/cpython/issues/107944}.)
@end itemize

@node Free-threaded CPython,An experimental just-in-time JIT compiler,Improved error messages<2>,New Features
@anchor{whatsnew/3 13 free-threaded-cpython}@anchor{497}
@subsubsection Free-threaded CPython


CPython now has experimental support for running in a free-threaded mode,
with the @ref{474,,global interpreter lock} (GIL) disabled.
This is an experimental feature and therefore is not enabled by default.
The free-threaded mode requires a different executable,
usually called @code{python3.13t} or @code{python3.13t.exe}.
Pre-built binaries marked as `free-threaded' can be installed as part of
the official @ref{498,,Windows}
and @ref{499,,macOS} installers,
or CPython can be built from source with the @ref{49a,,--disable-gil} option.

Free-threaded execution allows for full utilization of the available
processing power by running threads in parallel on available CPU cores.
While not all software will benefit from this automatically, programs
designed with threading in mind will run faster on multi-core hardware.
`The free-threaded mode is experimental' and work is ongoing to improve it:
expect some bugs and a substantial single-threaded performance hit.
Free-threaded builds of CPython support optionally running with the GIL
enabled at runtime using the environment variable 
@geindex PYTHON_GIL
@geindex environment variable; PYTHON_GIL
@ref{49b,,PYTHON_GIL} or
the command-line option @ref{170,,-X gil=1}.

To check if the current interpreter supports free-threading, @ref{49c,,python -VV}
and @ref{49d,,sys.version} contain “experimental free-threading build”.
The new @code{sys._is_gil_enabled()} function can be used to check whether
the GIL is actually disabled in the running process.

C-API extension modules need to be built specifically for the free-threaded
build. Extensions that support running with the @ref{165,,GIL} disabled should
use the @ref{483,,Py_mod_gil} slot. Extensions using single-phase init should
use @ref{49e,,PyUnstable_Module_SetGIL()} to indicate whether they support
running with the GIL disabled. Importing C extensions that don’t use these
mechanisms will cause the GIL to be enabled, unless the GIL was explicitly
disabled with the 
@geindex PYTHON_GIL
@geindex environment variable; PYTHON_GIL
@ref{49b,,PYTHON_GIL} environment variable or the
@ref{170,,-X gil=0} option.
pip 24.1 or newer is required to install packages with C extensions in the
free-threaded build.

This work was made possible thanks to many individuals and
organizations, including the large community of contributors to Python
and third-party projects to test and enable free-threading support.
Notable contributors include:
Sam Gross, Ken Jin, Donghee Na, Itamar Oren, Matt Page, Brett Simmers,
Dino Viehland, Carl Meyer, Nathan Goldbaum, Ralf Gommers,
Lysandros Nikolaou, and many others.
Many of these contributors are employed by Meta, which has
provided significant engineering resources to support this project.


@subsubheading See also


@geindex Python Enhancement Proposals; PEP 703
PEP 703@footnote{https://peps.python.org/pep-0703/} “Making the Global Interpreter Lock Optional in CPython”
contains rationale and information surrounding this work.

Porting Extension Modules to Support Free-Threading@footnote{https://py-free-threading.github.io/porting/}: A community-maintained
porting guide for extension authors.


@node An experimental just-in-time JIT compiler,Defined mutation semantics for locals,Free-threaded CPython,New Features
@anchor{whatsnew/3 13 an-experimental-just-in-time-jit-compiler}@anchor{49f}
@subsubsection An experimental just-in-time (JIT) compiler


When CPython is configured and built using
the @code{--enable-experimental-jit} option,
a just-in-time (JIT) compiler is added which may speed up some Python programs.
On Windows, use @code{PCbuild/build.bat --experimental-jit} to enable the JIT
or @code{--experimental-jit-interpreter} to enable the Tier 2 interpreter.
Build requirements and further supporting information are contained at@footnote{https://github.com/python/cpython/blob/main/Tools/jit/README.md}
@code{Tools/jit/README.md}.

The @code{--enable-experimental-jit} option takes these (optional) values,
defaulting to @code{yes} if @code{--enable-experimental-jit} is present
without the optional value.


@itemize *

@item 
@code{no}: Disable the entire Tier 2 and JIT pipeline.

@item 
@code{yes}: Enable the JIT.
To disable the JIT at runtime, pass the environment variable @code{PYTHON_JIT=0}.

@item 
@code{yes-off}: Build the JIT but disable it by default.
To enable the JIT at runtime, pass the environment variable @code{PYTHON_JIT=1}.

@item 
@code{interpreter}: Enable the Tier 2 interpreter but disable the JIT.
The interpreter can be disabled by running with @code{PYTHON_JIT=0}.
@end itemize

The internal architecture is roughly as follows:


@itemize *

@item 
We start with specialized `Tier 1 bytecode'.
See @ref{4a0,,What’s new in 3.11} for details.

@item 
When the Tier 1 bytecode gets hot enough, it gets translated
to a new purely internal intermediate representation (IR),
called the `Tier 2 IR', and sometimes referred to as micro-ops (“uops”).

@item 
The Tier 2 IR uses the same stack-based virtual machine as Tier 1,
but the instruction format is better suited to translation to machine code.

@item 
We have several optimization passes for Tier 2 IR, which are applied
before it is interpreted or translated to machine code.

@item 
There is a Tier 2 interpreter, but it is mostly intended for debugging
the earlier stages of the optimization pipeline.
The Tier 2 interpreter can be enabled by configuring Python
with @code{--enable-experimental-jit=interpreter}.

@item 
When the JIT is enabled, the optimized
Tier 2 IR is translated to machine code, which is then executed.

@item 
The machine code translation process uses a technique called
`copy-and-patch'. It has no runtime dependencies, but there is a new
build-time dependency on LLVM.
@end itemize


@subsubheading See also


@geindex Python Enhancement Proposals; PEP 744
PEP 744@footnote{https://peps.python.org/pep-0744/}


(JIT by Brandt Bucher, inspired by a paper by Haoran Xu and Fredrik Kjolstad.
Tier 2 IR by Mark Shannon and Guido van Rossum.
Tier 2 optimizer by Ken Jin.)

@node Defined mutation semantics for locals,Support for mobile platforms,An experimental just-in-time JIT compiler,New Features
@anchor{whatsnew/3 13 defined-mutation-semantics-for-locals}@anchor{4a1}@anchor{whatsnew/3 13 whatsnew313-locals-semantics}@anchor{470}
@subsubsection Defined mutation semantics for @code{locals()}


Historically, the expected result of mutating the return value of
@ref{46f,,locals()} has been left to individual Python implementations to define.
Starting from Python 3.13, 
@geindex Python Enhancement Proposals; PEP 667
PEP 667@footnote{https://peps.python.org/pep-0667/} standardises
the historical behavior of CPython for most code execution scopes,
but changes @ref{4a2,,optimized scopes}
(functions, generators, coroutines, comprehensions, and generator expressions)
to explicitly return independent snapshots of the currently assigned local
variables, including locally referenced nonlocal variables captured in closures.

This change to the semantics of @ref{46f,,locals()} in optimized scopes also
affects the default behavior of code execution functions that implicitly
target @code{locals()} if no explicit namespace is provided
(such as @ref{4a3,,exec()} and @ref{4a4,,eval()}).
In previous versions, whether or not changes could be accessed by calling
@code{locals()} after calling the code execution function was
implementation-dependent. In CPython specifically, such code would typically
appear to work as desired, but could sometimes fail in optimized scopes based
on other code (including debuggers and code execution tracing tools)
potentially resetting the shared snapshot in that scope.
Now, the code will always run against an independent snapshot of
the local variables in optimized scopes, and hence the changes will never
be visible in subsequent calls to @code{locals()}.
To access the changes made in these cases, an explicit namespace reference
must now be passed to the relevant function.
Alternatively, it may make sense to update affected code to use a higher level
code execution API that returns the resulting code execution namespace
(e.g. @ref{4a5,,runpy.run_path()} when executing Python files from disk).

To ensure debuggers and similar tools can reliably update local variables in
scopes affected by this change, @ref{4a6,,FrameType.f_locals} now
returns a write-through proxy to the frame’s local and locally referenced
nonlocal variables in these scopes, rather than returning an inconsistently
updated shared @code{dict} instance with undefined runtime semantics.

See 
@geindex Python Enhancement Proposals; PEP 667
PEP 667@footnote{https://peps.python.org/pep-0667/} for more details, including related C API changes
and deprecations. Porting notes are also provided below for the affected
@ref{4a7,,Python APIs} and @ref{4a8,,C APIs}.

(PEP and implementation contributed by Mark Shannon and Tian Gao in
gh-74929@footnote{https://github.com/python/cpython/issues/74929}. Documentation updates provided by Guido van Rossum and
Alyssa Coghlan.)

@node Support for mobile platforms,,Defined mutation semantics for locals,New Features
@anchor{whatsnew/3 13 support-for-mobile-platforms}@anchor{4a9}@anchor{whatsnew/3 13 whatsnew313-platform-support}@anchor{48e}
@subsubsection Support for mobile platforms


@geindex Python Enhancement Proposals; PEP 730
PEP 730@footnote{https://peps.python.org/pep-0730/}: iOS is now a 
@geindex Python Enhancement Proposals; PEP 11
PEP 11@footnote{https://peps.python.org/pep-0011/} supported platform, with the
@code{arm64-apple-ios} and @code{arm64-apple-ios-simulator} targets at tier 3
(iPhone and iPad devices released after 2013 and the Xcode iOS simulator
running on Apple silicon hardware, respectively).
@code{x86_64-apple-ios-simulator}
(the Xcode iOS simulator running on older @code{x86_64} hardware)
is not a tier 3 supported platform, but will have best-effort support.
(PEP written and implementation contributed by Russell Keith-Magee in
gh-114099@footnote{https://github.com/python/cpython/issues/114099}.)

@geindex Python Enhancement Proposals; PEP 738
PEP 738@footnote{https://peps.python.org/pep-0738/}: Android is now a 
@geindex Python Enhancement Proposals; PEP 11
PEP 11@footnote{https://peps.python.org/pep-0011/} supported platform, with the
@code{aarch64-linux-android} and @code{x86_64-linux-android} targets at tier 3.
The 32-bit targets @code{arm-linux-androideabi} and @code{i686-linux-android}
are not tier 3 supported platforms, but will have best-effort support.
(PEP written and implementation contributed by Malcolm Smith in
gh-116622@footnote{https://github.com/python/cpython/issues/116622}.)


@subsubheading See also


@geindex Python Enhancement Proposals; PEP 730
PEP 730@footnote{https://peps.python.org/pep-0730/}, 
@geindex Python Enhancement Proposals; PEP 738
PEP 738@footnote{https://peps.python.org/pep-0738/}


@node Other Language Changes,New Modules,New Features,What’s New In Python 3 13
@anchor{whatsnew/3 13 other-language-changes}@anchor{4aa}
@subsection Other Language Changes



@itemize *

@item 
The compiler now strips common leading whitespace
from every line in a docstring.
This reduces the size of the @ref{4ab,,bytecode cache}
(such as @code{.pyc} files), with reductions in file size of around 5%,
for example in @code{sqlalchemy.orm.session} from SQLAlchemy 2.0.
This change affects tools that use docstrings, such as @ref{3e,,doctest}.

@example
>>> def spam():
...     """
...         This is a docstring with
...           leading whitespace.
...
...         It even has multiple paragraphs!
...     """
...
>>> spam.__doc__
'\nThis is a docstring with\n  leading whitespace.\n\nIt even has multiple paragraphs!\n'
@end example

(Contributed by Inada Naoki in gh-81283@footnote{https://github.com/python/cpython/issues/81283}.)

@item 
@ref{4ac,,Annotation scopes} within class scopes
can now contain lambdas and comprehensions.
Comprehensions that are located within class scopes
are not inlined into their parent scope.

@example
class C[T]:
    type Alias = lambda: T
@end example

(Contributed by Jelle Zijlstra in gh-109118@footnote{https://github.com/python/cpython/issues/109118} and gh-118160@footnote{https://github.com/python/cpython/issues/118160}.)

@item 
@ref{45b,,Future statements} are no longer triggered by
relative imports of the @ref{0,,__future__} module,
meaning that statements of the form @code{from .__future__ import ...}
are now simply standard relative imports, with no special features activated.
(Contributed by Jeremiah Gabriel Pascual in gh-118216@footnote{https://github.com/python/cpython/issues/118216}.)

@item 
@ref{4ad,,global} declarations are now permitted in @ref{1ac,,except} blocks
when that global is used in the @ref{17d,,else} block.
Previously this raised an erroneous @ref{18f,,SyntaxError}.
(Contributed by Irit Katriel in gh-111123@footnote{https://github.com/python/cpython/issues/111123}.)

@item 
Add 
@geindex PYTHON_FROZEN_MODULES
@geindex environment variable; PYTHON_FROZEN_MODULES
@ref{4ae,,PYTHON_FROZEN_MODULES}, a new environment variable that
determines whether frozen modules are ignored by the import machinery,
equivalent to the @ref{170,,-X frozen_modules} command-line option.
(Contributed by Yilei Yang in gh-111374@footnote{https://github.com/python/cpython/issues/111374}.)

@item 
Add @ref{4af,,support for the perf profiler} working
without frame pointers@footnote{https://en.wikipedia.org/wiki/Call_stack} through
the new environment variable 
@geindex PYTHON_PERF_JIT_SUPPORT
@geindex environment variable; PYTHON_PERF_JIT_SUPPORT
@ref{4b0,,PYTHON_PERF_JIT_SUPPORT}
and command-line option @ref{170,,-X perf_jit}.
(Contributed by Pablo Galindo in gh-118518@footnote{https://github.com/python/cpython/issues/118518}.)

@item 
The location of a @code{.python_history} file can be changed via the
new 
@geindex PYTHON_HISTORY
@geindex environment variable; PYTHON_HISTORY
@ref{4b1,,PYTHON_HISTORY} environment variable.
(Contributed by Levi Sabah, Zackery Spytz and Hugo van Kemenade
in gh-73965@footnote{https://github.com/python/cpython/issues/73965}.)

@item 
Classes have a new @ref{477,,__static_attributes__} attribute.
This is populated by the compiler with a tuple of the class’s attribute names
which are assigned through @code{self.<name>} from any function in its body.
(Contributed by Irit Katriel in gh-115775@footnote{https://github.com/python/cpython/issues/115775}.)

@item 
The compiler now creates a @code{__firstlineno__} attribute on classes
with the line number of the first line of the class definition.
(Contributed by Serhiy Storchaka in gh-118465@footnote{https://github.com/python/cpython/issues/118465}.)

@item 
The @ref{4a3,,exec()} and @ref{4a4,,eval()} builtins now accept
the `globals' and `locals' arguments as keywords.
(Contributed by Raphael Gaschignard in gh-105879@footnote{https://github.com/python/cpython/issues/105879})

@item 
The @ref{4b2,,compile()} builtin now accepts a new flag,
@code{ast.PyCF_OPTIMIZED_AST}, which is similar to @code{ast.PyCF_ONLY_AST}
except that the returned AST is optimized according to
the value of the `optimize' argument.
(Contributed by Irit Katriel in gh-108113@footnote{https://github.com/python/cpython/issues/108113}).

@item 
Add a @ref{4b3,,__name__} attribute on @ref{4b4,,property} objects.
(Contributed by Eugene Toder in gh-101860@footnote{https://github.com/python/cpython/issues/101860}.)

@item 
Add @ref{479,,PythonFinalizationError}, a new exception derived from
@ref{246,,RuntimeError} and used to signal when operations are blocked
during @ref{47a,,finalization}.
The following callables now raise @code{PythonFinalizationError},
instead of @code{RuntimeError}:


@itemize *

@item 
@ref{4b5,,_thread.start_new_thread()}

@item 
@ref{4b6,,os.fork()}

@item 
@ref{4b7,,os.forkpty()}

@item 
@ref{4b8,,subprocess.Popen}
@end itemize

(Contributed by Victor Stinner in gh-114570@footnote{https://github.com/python/cpython/issues/114570}.)

@item 
Allow the `count' argument of @ref{4b9,,str.replace()} to be a keyword.
(Contributed by Hugo van Kemenade in gh-106487@footnote{https://github.com/python/cpython/issues/106487}.)

@item 
Many functions now emit a warning if a boolean value is passed as
a file descriptor argument.
This can help catch some errors earlier.
(Contributed by Serhiy Storchaka in gh-82626@footnote{https://github.com/python/cpython/issues/82626}.)

@item 
Added @code{name} and @code{mode} attributes
for compressed and archived file-like objects in
the @ref{14,,bz2}, @ref{8e,,lzma}, @ref{e4,,tarfile}, and @ref{138,,zipfile} modules.
(Contributed by Serhiy Storchaka in gh-115961@footnote{https://github.com/python/cpython/issues/115961}.)
@end itemize

@node New Modules,Improved Modules,Other Language Changes,What’s New In Python 3 13
@anchor{whatsnew/3 13 new-modules}@anchor{4ba}
@subsection New Modules



@itemize *

@item 
@ref{39,,dbm.sqlite3}: An SQLite backend for @ref{35,,dbm}.
(Contributed by Raymond Hettinger and Erlend E. Aasland in gh-100414@footnote{https://github.com/python/cpython/issues/100414}.)
@end itemize

@node Improved Modules,Optimizations<2>,New Modules,What’s New In Python 3 13
@anchor{whatsnew/3 13 improved-modules}@anchor{4bb}
@subsection Improved Modules


@menu
* argparse: argparse<3>. 
* array:: 
* ast: ast<3>. 
* asyncio: asyncio<4>. 
* base64: base64<2>. 
* compileall:: 
* concurrent.futures: concurrent futures<2>. 
* configparser: configparser<2>. 
* copy:: 
* ctypes: ctypes<2>. 
* dbm:: 
* dis: dis<2>. 
* doctest:: 
* email: email<2>. 
* enum:: 
* fractions: fractions<2>. 
* glob:: 
* importlib:: 
* io: io<3>. 
* ipaddress:: 
* itertools: itertools<2>. 
* marshal:: 
* math: math<2>. 
* mimetypes: mimetypes<2>. 
* mmap:: 
* multiprocessing: multiprocessing<2>. 
* os: os<2>. 
* os.path: os path<2>. 
* pathlib: pathlib<4>. 
* pdb: pdb<3>. 
* queue:: 
* random:: 
* re: re<2>. 
* shutil:: 
* site:: 
* sqlite3: sqlite3<2>. 
* ssl: ssl<2>. 
* statistics:: 
* subprocess:: 
* sys: sys<2>. 
* tempfile:: 
* time:: 
* tkinter: tkinter<2>. 
* traceback:: 
* types: types<2>. 
* typing: typing<2>. 
* unicodedata: unicodedata<2>. 
* venv:: 
* warnings:: 
* xml:: 
* zipimport:: 

@end menu

@node argparse<3>,array,,Improved Modules
@anchor{whatsnew/3 13 argparse}@anchor{4bc}
@subsubsection argparse



@itemize *

@item 
Add the `deprecated' parameter to the
@ref{4bd,,add_argument()}
and @code{add_parser()} methods, to enable deprecating
command-line options, positional arguments, and subcommands.
(Contributed by Serhiy Storchaka in gh-83648@footnote{https://github.com/python/cpython/issues/83648}.)
@end itemize

@node array,ast<3>,argparse<3>,Improved Modules
@anchor{whatsnew/3 13 array}@anchor{4be}
@subsubsection array



@itemize *

@item 
Add the @code{'w'} type code (@code{Py_UCS4}) for Unicode characters.
It should be used instead of the deprecated @code{'u'} type code.
(Contributed by Inada Naoki in gh-80480@footnote{https://github.com/python/cpython/issues/80480}.)

@item 
Register @ref{4bf,,array.array} as a @ref{4c0,,MutableSequence}
by implementing the @ref{4c1,,clear()} method.
(Contributed by Mike Zimin in gh-114894@footnote{https://github.com/python/cpython/issues/114894}.)
@end itemize

@node ast<3>,asyncio<4>,array,Improved Modules
@anchor{whatsnew/3 13 ast}@anchor{4c2}
@subsubsection ast



@itemize *

@item 
The constructors of node types in the @ref{9,,ast} module are now
stricter in the arguments they accept,
with more intuitive behavior when arguments are omitted.

If an optional field on an AST node is not included as an argument when
constructing an instance, the field will now be set to @code{None}. Similarly,
if a list field is omitted, that field will now be set to an empty list,
and if an @code{expr_context} field is omitted, it defaults to
@ref{4c3,,Load()}.
(Previously, in all cases, the attribute would be missing on the newly
constructed AST node instance.)

In all other cases, where a required argument is omitted,
the node constructor will emit a @ref{1a4,,DeprecationWarning}.
This will raise an exception in Python 3.15.
Similarly, passing a keyword argument to the constructor
that does not map to a field on the AST node is now deprecated,
and will raise an exception in Python 3.15.

These changes do not apply to user-defined subclasses of @ref{4c4,,ast.AST}
unless the class opts in to the new behavior
by defining the @ref{4c5,,AST._field_types} mapping.

(Contributed by Jelle Zijlstra in gh-105858@footnote{https://github.com/python/cpython/issues/105858}, gh-117486@footnote{https://github.com/python/cpython/issues/117486}, and gh-118851@footnote{https://github.com/python/cpython/issues/118851}.)

@item 
@ref{1c4,,ast.parse()} now accepts an optional argument `optimize'
which is passed on to @ref{4b2,,compile()}.
This makes it possible to obtain an optimized AST.
(Contributed by Irit Katriel in gh-108113@footnote{https://github.com/python/cpython/issues/108113}.)
@end itemize

@node asyncio<4>,base64<2>,ast<3>,Improved Modules
@anchor{whatsnew/3 13 asyncio}@anchor{4c6}
@subsubsection asyncio



@itemize *

@item 
@ref{4c7,,asyncio.as_completed()} now returns an object that is both an
@ref{4c8,,asynchronous iterator} and a plain @ref{4c9,,iterator}
of @ref{4ca,,awaitables}.
The awaitables yielded by asynchronous iteration include original task
or future objects that were passed in,
making it easier to associate results with the tasks being completed.
(Contributed by Justin Arthur in gh-77714@footnote{https://github.com/python/cpython/issues/77714}.)

@item 
@ref{4cb,,asyncio.loop.create_unix_server()} will now automatically remove
the Unix socket when the server is closed.
(Contributed by Pierre Ossman in gh-111246@footnote{https://github.com/python/cpython/issues/111246}.)

@item 
@ref{4cc,,DatagramTransport.sendto()} will now send zero-length
datagrams if called with an empty bytes object.
The transport flow control also now accounts for the datagram header
when calculating the buffer size.
(Contributed by Jamie Phan in gh-115199@footnote{https://github.com/python/cpython/issues/115199}.)

@item 
Add @ref{4cd,,Queue.shutdown}
and @ref{4ce,,QueueShutDown} to manage queue termination.
(Contributed by Laurie Opperman and Yves Duprat in gh-104228@footnote{https://github.com/python/cpython/issues/104228}.)

@item 
Add the @ref{4cf,,Server.close_clients()} and @ref{4d0,,Server.abort_clients()}
methods, which more forcefully close an asyncio server.
(Contributed by Pierre Ossman in gh-113538@footnote{https://github.com/python/cpython/issues/113538}.)

@item 
Accept a tuple of separators in @ref{4d1,,StreamReader.readuntil()},
stopping when any one of them is encountered.
(Contributed by Bruce Merry in gh-81322@footnote{https://github.com/python/cpython/issues/81322}.)

@item 
Improve the behavior of @ref{4d2,,TaskGroup} when
an external cancellation collides with an internal cancellation.
For example, when two task groups are nested
and both experience an exception in a child task simultaneously,
it was possible that the outer task group would hang,
because its internal cancellation was swallowed by the inner task group.

In the case where a task group is cancelled externally
and also must raise an @ref{4d3,,ExceptionGroup},
it will now call the parent task’s @ref{4d4,,cancel()} method.
This ensures that a @ref{4d5,,CancelledError} will be raised
at the next @ref{18e,,await}, so the cancellation is not lost.

An added benefit of these changes is that task groups now preserve
the cancellation count (@ref{4d6,,cancelling()}).

In order to handle some corner cases, @ref{4d7,,uncancel()} may now
reset the undocumented @code{_must_cancel} flag
when the cancellation count reaches zero.

(Inspired by an issue reported by Arthur Tacca in gh-116720@footnote{https://github.com/python/cpython/issues/116720}.)

@item 
When @ref{1cd,,TaskGroup.create_task()} is called on an inactive
@ref{4d2,,TaskGroup}, the given coroutine will be closed (which
prevents a @ref{4d8,,RuntimeWarning} about the given coroutine being
never awaited).
(Contributed by Arthur Tacca and Jason Zhang in gh-115957@footnote{https://github.com/python/cpython/issues/115957}.)

@item 
The function and methods named @code{create_task} have received a new
@code{**kwargs} argument that is passed through to the task constructor.
This change was accidentally added in 3.13.3,
and broke the API contract for custom task factories.
Several third-party task factories implemented workarounds for this.
In 3.13.4 and later releases the old factory contract is honored
once again (until 3.14).
To keep the workarounds working, the extra @code{**kwargs} argument still
allows passing additional keyword arguments to @ref{1c9,,Task}
and to custom task factories.

This affects the following function and methods:
@ref{1cb,,asyncio.create_task()},
@ref{1cc,,asyncio.loop.create_task()},
@ref{1cd,,asyncio.TaskGroup.create_task()}.
(Contributed by Thomas Grainger in gh-128307@footnote{https://github.com/python/cpython/issues/128307}.)
@end itemize

@node base64<2>,compileall,asyncio<4>,Improved Modules
@anchor{whatsnew/3 13 base64}@anchor{4d9}
@subsubsection base64



@itemize *

@item 
Add @ref{47b,,z85encode()} and @ref{47c,,z85decode()} functions
for encoding @ref{193,,bytes} as Z85 data@footnote{https://rfc.zeromq.org/spec/32/}
and decoding Z85-encoded data to @code{bytes}.
(Contributed by Matan Perelman in gh-75299@footnote{https://github.com/python/cpython/issues/75299}.)
@end itemize

@node compileall,concurrent futures<2>,base64<2>,Improved Modules
@anchor{whatsnew/3 13 compileall}@anchor{4da}
@subsubsection compileall



@itemize *

@item 
The default number of worker threads and processes is now selected using
@ref{4db,,os.process_cpu_count()} instead of @ref{4dc,,os.cpu_count()}.
(Contributed by Victor Stinner in gh-109649@footnote{https://github.com/python/cpython/issues/109649}.)
@end itemize

@node concurrent futures<2>,configparser<2>,compileall,Improved Modules
@anchor{whatsnew/3 13 concurrent-futures}@anchor{4dd}
@subsubsection concurrent.futures



@itemize *

@item 
The default number of worker threads and processes is now selected using
@ref{4db,,os.process_cpu_count()} instead of @ref{4dc,,os.cpu_count()}.
(Contributed by Victor Stinner in gh-109649@footnote{https://github.com/python/cpython/issues/109649}.)
@end itemize

@node configparser<2>,copy,concurrent futures<2>,Improved Modules
@anchor{whatsnew/3 13 configparser}@anchor{4de}
@subsubsection configparser



@itemize *

@item 
@ref{4df,,ConfigParser} now has support for unnamed sections,
which allows for top-level key-value pairs.
This can be enabled with the new `allow_unnamed_section' parameter.
(Contributed by Pedro Sousa Lacerda in gh-66449@footnote{https://github.com/python/cpython/issues/66449}.)
@end itemize

@node copy,ctypes<2>,configparser<2>,Improved Modules
@anchor{whatsnew/3 13 copy}@anchor{4e0}
@subsubsection copy



@itemize *

@item 
The new @ref{1c2,,replace()} function and the @ref{47d,,replace protocol} make creating modified copies of objects much simpler.
This is especially useful when working with immutable objects.
The following types support the @code{replace()} function
and implement the replace protocol:


@itemize *

@item 
@ref{4e1,,collections.namedtuple()}

@item 
@ref{4e2,,dataclasses.dataclass}

@item 
@ref{4e3,,datetime.datetime}, @ref{1fc,,datetime.date}, @ref{1fd,,datetime.time}

@item 
@ref{4e4,,inspect.Signature}, @ref{4e5,,inspect.Parameter}

@item 
@ref{4e6,,types.SimpleNamespace}

@item 
@ref{4e7,,code objects}
@end itemize

Any user-defined class can also support @ref{1c2,,copy.replace()} by defining
the @ref{47d,,__replace__()} method.
(Contributed by Serhiy Storchaka in gh-108751@footnote{https://github.com/python/cpython/issues/108751}.)
@end itemize

@node ctypes<2>,dbm,copy,Improved Modules
@anchor{whatsnew/3 13 ctypes}@anchor{4e8}
@subsubsection ctypes



@itemize *

@item 
As a consequence of necessary internal refactoring, initialization of
internal metaclasses now happens in @code{__init__} rather
than in @code{__new__}. This affects projects that subclass these internal
metaclasses to provide custom initialization.
Generally:


@itemize -

@item 
Custom logic that was done in @code{__new__} after calling @code{super().__new__}
should be moved to @code{__init__}.

@item 
To create a class, call the metaclass, not only the metaclass’s
@code{__new__} method.
@end itemize

See gh-124520@footnote{https://github.com/python/cpython/issues/124520} for discussion and links to changes in some affected
projects.

@item 
@ref{1e7,,ctypes.Structure} objects have a new @ref{4e9,,_align_}
attribute which allows the alignment of the structure being packed to/from
memory to be specified explicitly.
(Contributed by Matt Sanderson in gh-112433@footnote{https://github.com/python/cpython/issues/112433})
@end itemize

@node dbm,dis<2>,ctypes<2>,Improved Modules
@anchor{whatsnew/3 13 dbm}@anchor{4ea}
@subsubsection dbm



@itemize *

@item 
Add @ref{39,,dbm.sqlite3}, a new module which implements an SQLite backend,
and make it the default @code{dbm} backend.
(Contributed by Raymond Hettinger and Erlend E. Aasland in gh-100414@footnote{https://github.com/python/cpython/issues/100414}.)

@item 
Allow removing all items from the database through
the new @code{clear()} methods of the GDBM and NDBM database objects.
(Contributed by Donghee Na in gh-107122@footnote{https://github.com/python/cpython/issues/107122}.)
@end itemize

@node dis<2>,doctest,dbm,Improved Modules
@anchor{whatsnew/3 13 dis}@anchor{4eb}
@subsubsection dis



@itemize *

@item 
Change the output of @ref{3c,,dis} module functions to show logical
labels for jump targets and exception handlers, rather than offsets.
The offsets can be added with the new
@ref{4ec,,-O} command-line option
or the `show_offsets' argument.
(Contributed by Irit Katriel in gh-112137@footnote{https://github.com/python/cpython/issues/112137}.)

@item 
@ref{4ed,,get_instructions()} no longer represents cache entries
as separate instructions.
Instead, it returns them as part of the @ref{205,,Instruction},
in the new `cache_info' field.
The `show_caches' argument to @code{get_instructions()} is deprecated
and no longer has any effect.
(Contributed by Irit Katriel in gh-112962@footnote{https://github.com/python/cpython/issues/112962}.)
@end itemize

@node doctest,email<2>,dis<2>,Improved Modules
@anchor{whatsnew/3 13 doctest}@anchor{4ee}@anchor{whatsnew/3 13 whatsnew313-doctest}@anchor{475}
@subsubsection doctest



@itemize *

@item 
@ref{3e,,doctest} output is now colored by default.
This can be controlled via the new 
@geindex PYTHON_COLORS
@geindex environment variable; PYTHON_COLORS
@ref{476,,PYTHON_COLORS} environment
variable as well as the canonical NO_COLOR@footnote{https://no-color.org/}
and FORCE_COLOR@footnote{https://force-color.org/} environment variables.
See also @ref{1b9,,Controlling color}.
(Contributed by Hugo van Kemenade in gh-117225@footnote{https://github.com/python/cpython/issues/117225}.)

@item 
The @ref{4ef,,DocTestRunner.run()} method now counts the number of skipped tests.
Add the @ref{4f0,,DocTestRunner.skips} and @ref{4f1,,TestResults.skipped} attributes.
(Contributed by Victor Stinner in gh-108794@footnote{https://github.com/python/cpython/issues/108794}.)
@end itemize

@node email<2>,enum,doctest,Improved Modules
@anchor{whatsnew/3 13 email}@anchor{4f2}
@subsubsection email



@itemize *

@item 
Headers with embedded newlines are now quoted on output.
The @ref{44,,generator} will now refuse to serialize (write) headers
that are improperly folded or delimited, such that they would be parsed as
multiple headers or joined with adjacent data.
If you need to turn this safety feature off,
set @ref{4f3,,verify_generated_headers}.
(Contributed by Bas Bloemsaat and Petr Viktorin in gh-121650@footnote{https://github.com/python/cpython/issues/121650}.)

@item 
@ref{4f4,,getaddresses()} and @ref{4f5,,parseaddr()} now
return @code{('@w{'}, '@w{'})} pairs in more situations where invalid email addresses
are encountered instead of potentially inaccurate values.
The two functions have a new optional `strict' parameter (default @code{True}).
To get the old behavior (accepting malformed input), use @code{strict=False}.
@code{getattr(email.utils, 'supports_strict_parsing', False)} can be used
to check if the `strict' parameter is available.
(Contributed by Thomas Dwyer and Victor Stinner for gh-102988@footnote{https://github.com/python/cpython/issues/102988} to improve
the 
@geindex Common Vulnerabilities and Exposures; CVE 2023-27043
CVE 2023-27043@footnote{https://www.cve.org/CVERecord?id=CVE-2023-27043} fix.)
@end itemize

@node enum,fractions<2>,email<2>,Improved Modules
@anchor{whatsnew/3 13 enum}@anchor{4f6}
@subsubsection enum



@itemize *

@item 
@ref{4f7,,EnumDict} has been made public to better support subclassing
@ref{4f8,,EnumType}.
@end itemize

@node fractions<2>,glob,enum,Improved Modules
@anchor{whatsnew/3 13 fractions}@anchor{4f9}
@subsubsection fractions



@itemize *

@item 
@ref{215,,Fraction} objects now support the standard
@ref{4fa,,format specification mini-language} rules
for fill, alignment, sign handling, minimum width, and grouping.
(Contributed by Mark Dickinson in gh-111320@footnote{https://github.com/python/cpython/issues/111320}.)
@end itemize

@node glob,importlib,fractions<2>,Improved Modules
@anchor{whatsnew/3 13 glob}@anchor{4fb}
@subsubsection glob



@itemize *

@item 
Add @ref{4fc,,translate()}, a function to convert a path specification
with shell-style wildcards to a regular expression.
(Contributed by Barney Gale in gh-72904@footnote{https://github.com/python/cpython/issues/72904}.)
@end itemize

@node importlib,io<3>,glob,Improved Modules
@anchor{whatsnew/3 13 importlib}@anchor{4fd}
@subsubsection importlib



@itemize *

@item 
The following functions in @ref{7f,,importlib.resources} now allow accessing
a directory (or tree) of resources, using multiple positional arguments
(the `encoding' and `errors' arguments in the text-reading functions
are now keyword-only):


@itemize *

@item 
@ref{4fe,,is_resource()}

@item 
@ref{4ff,,open_binary()}

@item 
@ref{500,,open_text()}

@item 
@ref{501,,path()}

@item 
@ref{502,,read_binary()}

@item 
@ref{503,,read_text()}
@end itemize

These functions are no longer deprecated and are not scheduled for removal.
(Contributed by Petr Viktorin in gh-116608@footnote{https://github.com/python/cpython/issues/116608}.)

@item 
@ref{504,,contents()} remains deprecated in favor of
the fully-featured @ref{2fc,,Traversable} API.
However, there is now no plan to remove it.
(Contributed by Petr Viktorin in gh-116608@footnote{https://github.com/python/cpython/issues/116608}.)
@end itemize

@node io<3>,ipaddress,importlib,Improved Modules
@anchor{whatsnew/3 13 io}@anchor{505}
@subsubsection io



@itemize *

@item 
The @ref{506,,IOBase} finalizer now logs any errors raised by
the @ref{507,,close()} method with @ref{508,,sys.unraisablehook}.
Previously, errors were ignored silently by default,
and only logged in @ref{509,,Python Development Mode}
or when using a @ref{50a,,Python debug build}.
(Contributed by Victor Stinner in gh-62948@footnote{https://github.com/python/cpython/issues/62948}.)
@end itemize

@node ipaddress,itertools<2>,io<3>,Improved Modules
@anchor{whatsnew/3 13 ipaddress}@anchor{50b}
@subsubsection ipaddress



@itemize *

@item 
Add the @ref{50c,,IPv4Address.ipv6_mapped} property,
which returns the IPv4-mapped IPv6 address.
(Contributed by Charles Machalow in gh-109466@footnote{https://github.com/python/cpython/issues/109466}.)

@item 
Fix @code{is_global} and @code{is_private} behavior in
@ref{50d,,IPv4Address}, @ref{50e,,IPv6Address},
@ref{50f,,IPv4Network}, and @ref{510,,IPv6Network}.
(Contributed by Jakub Stasiak in gh-113171@footnote{https://github.com/python/cpython/issues/113171}.)
@end itemize

@node itertools<2>,marshal,ipaddress,Improved Modules
@anchor{whatsnew/3 13 itertools}@anchor{511}
@subsubsection itertools



@itemize *

@item 
@ref{512,,batched()} has a new `strict' parameter,
which raises a @ref{2ee,,ValueError} if the final batch is shorter
than the specified batch size.
(Contributed by Raymond Hettinger in gh-113202@footnote{https://github.com/python/cpython/issues/113202}.)
@end itemize

@node marshal,math<2>,itertools<2>,Improved Modules
@anchor{whatsnew/3 13 marshal}@anchor{513}
@subsubsection marshal



@itemize *

@item 
Add the `allow_code' parameter in module functions.
Passing @code{allow_code=False} prevents serialization and de-serialization
of code objects which are incompatible between Python versions.
(Contributed by Serhiy Storchaka in gh-113626@footnote{https://github.com/python/cpython/issues/113626}.)
@end itemize

@node math<2>,mimetypes<2>,marshal,Improved Modules
@anchor{whatsnew/3 13 math}@anchor{514}
@subsubsection math



@itemize *

@item 
The new function @ref{515,,fma()} performs fused multiply-add operations.
This computes @code{x * y + z} with only a single round,
and so avoids any intermediate loss of precision.
It wraps the @code{fma()} function provided by C99,
and follows the specification of the IEEE 754 “fusedMultiplyAdd” operation
for special cases.
(Contributed by Mark Dickinson and Victor Stinner in gh-73468@footnote{https://github.com/python/cpython/issues/73468}.)
@end itemize

@node mimetypes<2>,mmap,math<2>,Improved Modules
@anchor{whatsnew/3 13 mimetypes}@anchor{516}
@subsubsection mimetypes



@itemize *

@item 
Add the @ref{517,,guess_file_type()} function to guess a MIME type
from a filesystem path.
Using paths with @ref{518,,guess_type()} is now @ref{23f,,soft deprecated}.
(Contributed by Serhiy Storchaka in gh-66543@footnote{https://github.com/python/cpython/issues/66543}.)
@end itemize

@node mmap,multiprocessing<2>,mimetypes<2>,Improved Modules
@anchor{whatsnew/3 13 mmap}@anchor{519}
@subsubsection mmap



@itemize *

@item 
@ref{51a,,mmap} is now protected from crashing on Windows when the
mapped memory is inaccessible due to file system errors or access violations.
(Contributed by Jannis Weigend in gh-118209@footnote{https://github.com/python/cpython/issues/118209}.)

@item 
@ref{51a,,mmap} has a new @ref{51b,,seekable()} method
that can be used when a seekable file-like object is required.
The @ref{51c,,seek()} method now returns the new absolute position.
(Contributed by Donghee Na and Sylvie Liberman in gh-111835@footnote{https://github.com/python/cpython/issues/111835}.)

@item 
The new UNIX-only `trackfd' parameter for @ref{51a,,mmap} controls
file descriptor duplication;
if false, the file descriptor specified by `fileno' will not be duplicated.
(Contributed by Zackery Spytz and Petr Viktorin in gh-78502@footnote{https://github.com/python/cpython/issues/78502}.)
@end itemize

@node multiprocessing<2>,os<2>,mmap,Improved Modules
@anchor{whatsnew/3 13 multiprocessing}@anchor{51d}
@subsubsection multiprocessing



@itemize *

@item 
The default number of worker threads and processes is now selected using
@ref{4db,,os.process_cpu_count()} instead of @ref{4dc,,os.cpu_count()}.
(Contributed by Victor Stinner in gh-109649@footnote{https://github.com/python/cpython/issues/109649}.)
@end itemize

@node os<2>,os path<2>,multiprocessing<2>,Improved Modules
@anchor{whatsnew/3 13 os}@anchor{51e}
@subsubsection os



@itemize *

@item 
Add @ref{4db,,process_cpu_count()} function to get the number
of logical CPU cores usable by the calling thread of the current process.
(Contributed by Victor Stinner in gh-109649@footnote{https://github.com/python/cpython/issues/109649}.)

@item 
@ref{4dc,,cpu_count()} and @ref{4db,,process_cpu_count()} can be overridden
through the new environment variable 
@geindex PYTHON_CPU_COUNT
@geindex environment variable; PYTHON_CPU_COUNT
@ref{51f,,PYTHON_CPU_COUNT}
or the new command-line option @ref{170,,-X cpu_count}.
This option is useful for users who need to limit CPU resources
of a container system without having to modify application code
or the container itself.
(Contributed by Donghee Na in gh-109595@footnote{https://github.com/python/cpython/issues/109595}.)

@item 
Add a @ref{47e,,low level interface} to Linux’s
@code{timer file descriptors@footnote{https://manpages.debian.org/timerfd_create(2)}}
via @ref{520,,timerfd_create()},
@ref{521,,timerfd_settime()}, @ref{522,,timerfd_settime_ns()},
@ref{523,,timerfd_gettime()}, @ref{524,,timerfd_gettime_ns()},
@ref{525,,TFD_NONBLOCK}, @ref{526,,TFD_CLOEXEC},
@ref{527,,TFD_TIMER_ABSTIME}, and @ref{528,,TFD_TIMER_CANCEL_ON_SET}
(Contributed by Masaru Tsuchiyama in gh-108277@footnote{https://github.com/python/cpython/issues/108277}.)

@item 
@ref{529,,lchmod()} and the `follow_symlinks' argument of @ref{52a,,chmod()}
are both now available on Windows.
Note that the default value of `follow_symlinks'
in @code{lchmod()} is @code{False} on Windows.
(Contributed by Serhiy Storchaka in gh-59616@footnote{https://github.com/python/cpython/issues/59616}.)

@item 
@ref{52b,,fchmod()} and support for file descriptors in @ref{52a,,chmod()}
are both now available on Windows.
(Contributed by Serhiy Storchaka in gh-113191@footnote{https://github.com/python/cpython/issues/113191}.)

@item 
On Windows, @ref{52c,,mkdir()} and @ref{52d,,makedirs()} now support passing
a `mode' value of @code{0o700} to apply access control to the new directory.
This implicitly affects @ref{52e,,tempfile.mkdtemp()}
and is a mitigation for 
@geindex Common Vulnerabilities and Exposures; CVE 2024-4030
CVE 2024-4030@footnote{https://www.cve.org/CVERecord?id=CVE-2024-4030}.
Other values for `mode' continue to be ignored.
(Contributed by Steve Dower in gh-118486@footnote{https://github.com/python/cpython/issues/118486}.)

@item 
@ref{52f,,posix_spawn()} now accepts @code{None} for the `env' argument,
which makes the newly spawned process use the current process environment.
(Contributed by Jakub Kulik in gh-113119@footnote{https://github.com/python/cpython/issues/113119}.)

@item 
@ref{52f,,posix_spawn()} can now use the @ref{530,,POSIX_SPAWN_CLOSEFROM}
attribute in the `file_actions' parameter on platforms that support
@code{posix_spawn_file_actions_addclosefrom_np()}.
(Contributed by Jakub Kulik in gh-113117@footnote{https://github.com/python/cpython/issues/113117}.)
@end itemize

@node os path<2>,pathlib<4>,os<2>,Improved Modules
@anchor{whatsnew/3 13 os-path}@anchor{531}
@subsubsection os.path



@itemize *

@item 
Add @ref{329,,isreserved()} to check if a path is reserved
on the current system.
This function is only available on Windows.
(Contributed by Barney Gale in gh-88569@footnote{https://github.com/python/cpython/issues/88569}.)

@item 
On Windows, @ref{532,,isabs()} no longer considers paths
starting with exactly one slash (@code{\} or @code{/}) to be absolute.
(Contributed by Barney Gale and Jon Foster in gh-44626@footnote{https://github.com/python/cpython/issues/44626}.)

@item 
@ref{264,,realpath()} now resolves MS-DOS style file names
even if the file is not accessible.
(Contributed by Moonsik Park in gh-82367@footnote{https://github.com/python/cpython/issues/82367}.)
@end itemize

@node pathlib<4>,pdb<3>,os path<2>,Improved Modules
@anchor{whatsnew/3 13 pathlib}@anchor{533}
@subsubsection pathlib



@itemize *

@item 
Add @ref{534,,UnsupportedOperation}, which is raised instead of
@ref{369,,NotImplementedError} when a path operation isn’t supported.
(Contributed by Barney Gale in gh-89812@footnote{https://github.com/python/cpython/issues/89812}.)

@item 
Add a new constructor for creating @ref{268,,Path} objects
from ‘file’ URIs (@code{file:///}), @ref{535,,Path.from_uri()}.
(Contributed by Barney Gale in gh-107465@footnote{https://github.com/python/cpython/issues/107465}.)

@item 
Add @ref{536,,PurePath.full_match()} for matching paths with
shell-style wildcards, including the recursive wildcard “@code{**}”.
(Contributed by Barney Gale in gh-73435@footnote{https://github.com/python/cpython/issues/73435}.)

@item 
Add the @ref{537,,PurePath.parser} class attribute to store the
implementation of @ref{a6,,os.path} used
for low-level path parsing and joining.
This will be either @code{posixpath} or @code{ntpath}.

@item 
Add `recurse_symlinks' keyword-only argument to
@ref{538,,Path.glob()} and @ref{539,,rglob()}.
(Contributed by Barney Gale in gh-77609@footnote{https://github.com/python/cpython/issues/77609}.)

@item 
@ref{538,,Path.glob()} and @ref{539,,rglob()}
now return files and directories when given a pattern that ends with “@code{**}”.
Previously, only directories were returned.
(Contributed by Barney Gale in gh-70303@footnote{https://github.com/python/cpython/issues/70303}.)

@item 
Add the `follow_symlinks' keyword-only argument to
@ref{53a,,Path.is_file},
@ref{53b,,Path.is_dir},
@ref{53c,,Path.owner()}, and @ref{53d,,Path.group()}.
(Contributed by Barney Gale in gh-105793@footnote{https://github.com/python/cpython/issues/105793} and Kamil Turek in gh-107962@footnote{https://github.com/python/cpython/issues/107962}.)
@end itemize

@node pdb<3>,queue,pathlib<4>,Improved Modules
@anchor{whatsnew/3 13 pdb}@anchor{53e}
@subsubsection pdb



@itemize *

@item 
@ref{273,,breakpoint()} and @ref{274,,set_trace()} now enter the debugger immediately
rather than on the next line of code to be executed. This change prevents the
debugger from breaking outside of the context when @code{breakpoint()} is positioned
at the end of the context.
(Contributed by Tian Gao in gh-118579@footnote{https://github.com/python/cpython/issues/118579}.)

@item 
@code{sys.path[0]} is no longer replaced by the directory of the script
being debugged when @ref{53f,,sys.flags.safe_path} is set.
(Contributed by Tian Gao and Christian Walther in gh-111762@footnote{https://github.com/python/cpython/issues/111762}.)

@item 
@ref{137,,zipapp} is now supported as a debugging target.
(Contributed by Tian Gao in gh-118501@footnote{https://github.com/python/cpython/issues/118501}.)

@item 
Add ability to move between chained exceptions during
post-mortem debugging in @ref{540,,pm()} using
the new @ref{541,,exceptions [exc_number]} command for Pdb.
(Contributed by Matthias Bussonnier in gh-106676@footnote{https://github.com/python/cpython/issues/106676}.)

@item 
Expressions and statements whose prefix is a pdb command are now correctly
identified and executed.
(Contributed by Tian Gao in gh-108464@footnote{https://github.com/python/cpython/issues/108464}.)
@end itemize

@node queue,random,pdb<3>,Improved Modules
@anchor{whatsnew/3 13 queue}@anchor{542}
@subsubsection queue



@itemize *

@item 
Add @ref{543,,Queue.shutdown} and @ref{544,,ShutDown}
to manage queue termination.
(Contributed by Laurie Opperman and Yves Duprat in gh-104750@footnote{https://github.com/python/cpython/issues/104750}.)
@end itemize

@node random,re<2>,queue,Improved Modules
@anchor{whatsnew/3 13 random}@anchor{545}
@subsubsection random



@itemize *

@item 
Add a @ref{47f,,command-line interface}.
(Contributed by Hugo van Kemenade in gh-118131@footnote{https://github.com/python/cpython/issues/118131}.)
@end itemize

@node re<2>,shutil,random,Improved Modules
@anchor{whatsnew/3 13 re}@anchor{546}
@subsubsection re



@itemize *

@item 
Rename @code{re.error} to @ref{547,,PatternError} for improved clarity.
@code{re.error} is kept for backward compatibility.
@end itemize

@node shutil,site,re<2>,Improved Modules
@anchor{whatsnew/3 13 shutil}@anchor{548}
@subsubsection shutil



@itemize *

@item 
Support the `dir_fd' and `follow_symlinks' keyword arguments
in @ref{549,,chown()}.
(Contributed by Berker Peksag and Tahia K in gh-62308@footnote{https://github.com/python/cpython/issues/62308})
@end itemize

@node site,sqlite3<2>,shutil,Improved Modules
@anchor{whatsnew/3 13 site}@anchor{54a}
@subsubsection site



@itemize *

@item 
@code{.pth} files are now decoded using UTF-8 first,
and then with the @ref{54b,,locale encoding} if UTF-8 decoding fails.
(Contributed by Inada Naoki in gh-117802@footnote{https://github.com/python/cpython/issues/117802}.)
@end itemize

@node sqlite3<2>,ssl<2>,site,Improved Modules
@anchor{whatsnew/3 13 sqlite3}@anchor{54c}
@subsubsection sqlite3



@itemize *

@item 
A @ref{54d,,ResourceWarning} is now emitted if a @ref{54e,,Connection}
object is not @ref{54f,,closed} explicitly.
(Contributed by Erlend E. Aasland in gh-105539@footnote{https://github.com/python/cpython/issues/105539}.)

@item 
Add the `filter' keyword-only parameter to @ref{550,,Connection.iterdump()}
for filtering database objects to dump.
(Contributed by Mariusz Felisiak in gh-91602@footnote{https://github.com/python/cpython/issues/91602}.)
@end itemize

@node ssl<2>,statistics,sqlite3<2>,Improved Modules
@anchor{whatsnew/3 13 ssl}@anchor{551}
@subsubsection ssl



@itemize *

@item 
The @ref{480,,create_default_context()} API now includes
@ref{481,,VERIFY_X509_PARTIAL_CHAIN} and @ref{482,,VERIFY_X509_STRICT}
in its default flags.

@cartouche
@quotation Note 
@ref{482,,VERIFY_X509_STRICT} may reject pre-
@geindex RFC; RFC 5280
RFC 5280@footnote{https://datatracker.ietf.org/doc/html/rfc5280.html}
or malformed certificates that the underlying OpenSSL implementation
might otherwise accept.
Whilst disabling this is not recommended, you can do so using:

@example
import ssl

ctx = ssl.create_default_context()
ctx.verify_flags &= ~ssl.VERIFY_X509_STRICT
@end example
@end quotation
@end cartouche

(Contributed by William Woodruff in gh-112389@footnote{https://github.com/python/cpython/issues/112389}.)
@end itemize

@node statistics,subprocess,ssl<2>,Improved Modules
@anchor{whatsnew/3 13 statistics}@anchor{552}
@subsubsection statistics



@itemize *

@item 
Add @ref{553,,kde()} for kernel density estimation.
This makes it possible to estimate a continuous probability density function
from a fixed number of discrete samples.
(Contributed by Raymond Hettinger in gh-115863@footnote{https://github.com/python/cpython/issues/115863}.)

@item 
Add @ref{554,,kde_random()} for sampling from an
estimated probability density function created by @ref{553,,kde()}.
(Contributed by Raymond Hettinger in gh-115863@footnote{https://github.com/python/cpython/issues/115863}.)
@end itemize

@node subprocess,sys<2>,statistics,Improved Modules
@anchor{whatsnew/3 13 subprocess}@anchor{555}@anchor{whatsnew/3 13 whatsnew313-subprocess}@anchor{556}
@subsubsection subprocess



@itemize *

@item 
The @ref{dc,,subprocess} module now uses the @ref{52f,,posix_spawn()} function in
more situations.

Notably, when `close_fds' is @code{True} (the default),
@ref{52f,,posix_spawn()} will be used when the C library provides
@code{posix_spawn_file_actions_addclosefrom_np()},
which includes recent versions of Linux, FreeBSD, and Solaris.
On Linux, this should perform similarly to the existing
Linux @code{vfork()} based code.

A private control knob @code{subprocess._USE_POSIX_SPAWN} can
be set to @code{False} if you need to force @ref{dc,,subprocess}
to never use @ref{52f,,posix_spawn()}.
Please report your reason and platform details in
the @ref{557,,issue tracker} if you set this
so that we can improve our API selection logic for everyone.
(Contributed by Jakub Kulik in gh-113117@footnote{https://github.com/python/cpython/issues/113117}.)
@end itemize

@node sys<2>,tempfile,subprocess,Improved Modules
@anchor{whatsnew/3 13 sys}@anchor{558}
@subsubsection sys



@itemize *

@item 
Add the @ref{559,,_is_interned()} function to test if a string was interned.
This function is not guaranteed to exist in all implementations of Python.
(Contributed by Serhiy Storchaka in gh-78573@footnote{https://github.com/python/cpython/issues/78573}.)
@end itemize

@node tempfile,time,sys<2>,Improved Modules
@anchor{whatsnew/3 13 tempfile}@anchor{55a}
@subsubsection tempfile



@itemize *

@item 
On Windows, the default mode @code{0o700} used by @ref{52e,,tempfile.mkdtemp()} now
limits access to the new directory due to changes to @ref{52c,,os.mkdir()}.
This is a mitigation for 
@geindex Common Vulnerabilities and Exposures; CVE 2024-4030
CVE 2024-4030@footnote{https://www.cve.org/CVERecord?id=CVE-2024-4030}.
(Contributed by Steve Dower in gh-118486@footnote{https://github.com/python/cpython/issues/118486}.)
@end itemize

@node time,tkinter<2>,tempfile,Improved Modules
@anchor{whatsnew/3 13 time}@anchor{55b}
@subsubsection time



@itemize *

@item 
On Windows, @ref{55c,,monotonic()} now uses the
@code{QueryPerformanceCounter()} clock for a resolution of 1 microsecond,
instead of the @code{GetTickCount64()} clock which has
a resolution of 15.6 milliseconds.
(Contributed by Victor Stinner in gh-88494@footnote{https://github.com/python/cpython/issues/88494}.)

@item 
On Windows, @ref{55d,,time()} now uses the
@code{GetSystemTimePreciseAsFileTime()} clock for a resolution of 1 microsecond,
instead of the @code{GetSystemTimeAsFileTime()} clock which has
a resolution of 15.6 milliseconds.
(Contributed by Victor Stinner in gh-63207@footnote{https://github.com/python/cpython/issues/63207}.)
@end itemize

@node tkinter<2>,traceback,time,Improved Modules
@anchor{whatsnew/3 13 tkinter}@anchor{55e}
@subsubsection tkinter



@itemize *

@item 
Add @ref{f6,,tkinter} widget methods:
@code{tk_busy_hold()}, @code{tk_busy_configure()},
@code{tk_busy_cget()}, @code{tk_busy_forget()},
@code{tk_busy_current()}, and @code{tk_busy_status()}.
(Contributed by Miguel, klappnase and Serhiy Storchaka in gh-72684@footnote{https://github.com/python/cpython/issues/72684}.)

@item 
The @ref{f6,,tkinter} widget method @code{wm_attributes()} now accepts
the attribute name without the minus prefix to get window attributes,
for example @code{w.wm_attributes('alpha')}
and allows specifying attributes and values to set as keyword arguments,
for example @code{w.wm_attributes(alpha=0.5)}.
(Contributed by Serhiy Storchaka in gh-43457@footnote{https://github.com/python/cpython/issues/43457}.)

@item 
@code{wm_attributes()} can now return attributes as a @ref{184,,dict},
by using the new optional keyword-only parameter `return_python_dict'.
(Contributed by Serhiy Storchaka in gh-43457@footnote{https://github.com/python/cpython/issues/43457}.)

@item 
@code{Text.count()} can now return a simple @ref{19c,,int}
when the new optional keyword-only parameter `return_ints' is used.
Otherwise, the single count is returned as a 1-tuple or @code{None}.
(Contributed by Serhiy Storchaka in gh-97928@footnote{https://github.com/python/cpython/issues/97928}.)

@item 
Support the “vsapi” element type in
the @ref{55f,,element_create()} method of
@ref{560,,tkinter.ttk.Style}.
(Contributed by Serhiy Storchaka in gh-68166@footnote{https://github.com/python/cpython/issues/68166}.)

@item 
Add the @code{after_info()} method for Tkinter widgets.
(Contributed by Cheryl Sabella in gh-77020@footnote{https://github.com/python/cpython/issues/77020}.)

@item 
Add a new @code{copy_replace()} method to @code{PhotoImage}
to copy a region from one image to another,
possibly with pixel zooming, subsampling, or both.
(Contributed by Serhiy Storchaka in gh-118225@footnote{https://github.com/python/cpython/issues/118225}.)

@item 
Add `from_coords' parameter to the @code{PhotoImage} methods
@code{copy()}, @code{zoom()} and @code{subsample()}.
Add `zoom' and `subsample' parameters to the @code{PhotoImage} method
@code{copy()}.
(Contributed by Serhiy Storchaka in gh-118225@footnote{https://github.com/python/cpython/issues/118225}.)

@item 
Add the @code{PhotoImage} methods
@code{read()} to read an image from a file
and @code{data()} to get the image data.
Add `background' and `grayscale' parameters to the @code{write()} method.
(Contributed by Serhiy Storchaka in gh-118271@footnote{https://github.com/python/cpython/issues/118271}.)
@end itemize

@node traceback,types<2>,tkinter<2>,Improved Modules
@anchor{whatsnew/3 13 traceback}@anchor{561}
@subsubsection traceback



@itemize *

@item 
Add the @ref{562,,exc_type_str} attribute
to @ref{563,,TracebackException},
which holds a string display of the `exc_type'.
Deprecate the @ref{564,,exc_type} attribute,
which holds the type object itself.
Add parameter `save_exc_type' (default @code{True})
to indicate whether @code{exc_type} should be saved.
(Contributed by Irit Katriel in gh-112332@footnote{https://github.com/python/cpython/issues/112332}.)

@item 
Add a new `show_group' keyword-only parameter to
@ref{565,,TracebackException.format_exception_only()} to (recursively) format
the nested exceptions of a @ref{566,,BaseExceptionGroup} instance.
(Contributed by Irit Katriel in gh-105292@footnote{https://github.com/python/cpython/issues/105292}.)
@end itemize

@node types<2>,typing<2>,traceback,Improved Modules
@anchor{whatsnew/3 13 types}@anchor{567}
@subsubsection types



@itemize *

@item 
@ref{4e6,,SimpleNamespace} can now take a single positional argument
to initialise the namespace’s arguments.
This argument must either be a mapping or an iterable of key-value pairs.
(Contributed by Serhiy Storchaka in gh-108191@footnote{https://github.com/python/cpython/issues/108191}.)
@end itemize

@node typing<2>,unicodedata<2>,types<2>,Improved Modules
@anchor{whatsnew/3 13 typing}@anchor{568}
@subsubsection typing



@itemize *

@item 
@geindex Python Enhancement Proposals; PEP 705
PEP 705@footnote{https://peps.python.org/pep-0705/}: Add @ref{48b,,ReadOnly}, a special typing construct
to mark a @ref{330,,TypedDict} item as read-only for type checkers.

@item 
@geindex Python Enhancement Proposals; PEP 742
PEP 742@footnote{https://peps.python.org/pep-0742/}: Add @ref{48c,,TypeIs}, a typing construct
that can be used to instruct a type checker how to narrow a type.

@item 
Add @ref{569,,NoDefault}, a sentinel object used to represent
the defaults of some parameters in the @ref{10b,,typing} module.
(Contributed by Jelle Zijlstra in gh-116126@footnote{https://github.com/python/cpython/issues/116126}.)

@item 
Add @ref{56a,,get_protocol_members()} to return the set of members
defining a @ref{56b,,typing.Protocol}.
(Contributed by Jelle Zijlstra in gh-104873@footnote{https://github.com/python/cpython/issues/104873}.)

@item 
Add @ref{56c,,is_protocol()} to check whether a class
is a @ref{56b,,Protocol}.
(Contributed by Jelle Zijlstra in gh-104873@footnote{https://github.com/python/cpython/issues/104873}.)

@item 
@ref{56d,,ClassVar} can now be nested in @ref{56e,,Final},
and vice versa.
(Contributed by Mehdi Drissi in gh-89547@footnote{https://github.com/python/cpython/issues/89547}.)
@end itemize

@node unicodedata<2>,venv,typing<2>,Improved Modules
@anchor{whatsnew/3 13 unicodedata}@anchor{56f}
@subsubsection unicodedata



@itemize *

@item 
Update the Unicode database to version 15.1.0@footnote{https://www.unicode.org/versions/Unicode15.1.0/}.
(Contributed by James Gerity in gh-109559@footnote{https://github.com/python/cpython/issues/109559}.)
@end itemize

@node venv,warnings,unicodedata<2>,Improved Modules
@anchor{whatsnew/3 13 venv}@anchor{570}
@subsubsection venv



@itemize *

@item 
Add support for creating source control management (SCM) ignore files
in a virtual environment’s directory.
By default, Git is supported.
This is implemented as opt-in via the API,
which can be extended to support other SCMs
(@ref{571,,EnvBuilder} and @ref{572,,create()}),
and opt-out via the CLI, using @code{--without-scm-ignore-files}.
(Contributed by Brett Cannon in gh-108125@footnote{https://github.com/python/cpython/issues/108125}.)
@end itemize

@node warnings,xml,venv,Improved Modules
@anchor{whatsnew/3 13 warnings}@anchor{573}
@subsubsection warnings



@itemize *

@item 
@geindex Python Enhancement Proposals; PEP 702
PEP 702@footnote{https://peps.python.org/pep-0702/}: The new @ref{48a,,warnings.deprecated()} decorator provides a way to
communicate deprecations to a @ref{574,,static type checker}
and to warn on usage of deprecated classes and functions.
A @ref{1a4,,DeprecationWarning} may also be emitted when
a decorated function or class is used at runtime.
(Contributed by Jelle Zijlstra in gh-104003@footnote{https://github.com/python/cpython/issues/104003}.)
@end itemize

@node xml,zipimport,warnings,Improved Modules
@anchor{whatsnew/3 13 xml}@anchor{575}
@subsubsection xml



@itemize *

@item 
Allow controlling Expat >=2.6.0 reparse deferral (
@geindex Common Vulnerabilities and Exposures; CVE 2023-52425
CVE 2023-52425@footnote{https://www.cve.org/CVERecord?id=CVE-2023-52425})
by adding five new methods:


@itemize *

@item 
@ref{576,,xml.etree.ElementTree.XMLParser.flush()}

@item 
@ref{577,,xml.etree.ElementTree.XMLPullParser.flush()}

@item 
@ref{578,,xml.parsers.expat.xmlparser.GetReparseDeferralEnabled()}

@item 
@ref{579,,xml.parsers.expat.xmlparser.SetReparseDeferralEnabled()}

@item 
@code{xml.sax.expatreader.ExpatParser.flush()}
@end itemize

(Contributed by Sebastian Pipping in gh-115623@footnote{https://github.com/python/cpython/issues/115623}.)

@item 
Add the @code{close()} method for the iterator returned by
@ref{57a,,iterparse()} for explicit cleanup.
(Contributed by Serhiy Storchaka in gh-69893@footnote{https://github.com/python/cpython/issues/69893}.)
@end itemize

@node zipimport,,xml,Improved Modules
@anchor{whatsnew/3 13 zipimport}@anchor{57b}
@subsubsection zipimport



@itemize *

@item 
Add support for ZIP64@footnote{https://en.wikipedia.org/wiki/Zip_(file_format)#ZIP64} format files.
Everybody loves huge data, right?
(Contributed by Tim Hatch in gh-94146@footnote{https://github.com/python/cpython/issues/94146}.)
@end itemize

@node Optimizations<2>,Removed Modules And APIs,Improved Modules,What’s New In Python 3 13
@anchor{whatsnew/3 13 optimizations}@anchor{57c}
@subsection Optimizations



@itemize *

@item 
Several standard library modules have had
their import times significantly improved.
For example, the import time of the @ref{10b,,typing} module
has been reduced by around a third by removing dependencies
on @ref{be,,re} and @ref{27,,contextlib}.
Other modules to enjoy import-time speedups include
@ref{54,,email.utils}, @ref{5a,,enum}, @ref{63,,functools},
@ref{7e,,importlib.metadata}, and @ref{f3,,threading}.
(Contributed by Alex Waygood, Shantanu Jain, Adam Turner, Daniel Hollas,
and others in gh-109653@footnote{https://github.com/python/cpython/issues/109653}.)

@item 
@ref{57d,,textwrap.indent()} is now around 30% faster than before for large input.
(Contributed by Inada Naoki in gh-107369@footnote{https://github.com/python/cpython/issues/107369}.)

@item 
The @ref{dc,,subprocess} module now uses the @ref{52f,,posix_spawn()} function in
more situations, including when `close_fds' is @code{True} (the default)
on many modern platforms.
This should provide a notable performance increase
when launching processes on FreeBSD and Solaris.
See the @ref{556,,subprocess} section above for details.
(Contributed by Jakub Kulik in gh-113117@footnote{https://github.com/python/cpython/issues/113117}.)
@end itemize

@node Removed Modules And APIs,New Deprecations,Optimizations<2>,What’s New In Python 3 13
@anchor{whatsnew/3 13 removed-modules-and-apis}@anchor{57e}
@subsection Removed Modules And APIs


@menu
* PEP 594; Remove “dead batteries” from the standard library: PEP 594 Remove “dead batteries” from the standard library. 
* 2to3:: 
* builtins:: 
* configparser: configparser<3>. 
* importlib.metadata: importlib metadata. 
* locale:: 
* opcode:: 
* optparse:: 
* pathlib: pathlib<5>. 
* re: re<3>. 
* tkinter.tix: tkinter tix. 
* turtle: turtle<2>. 
* typing: typing<3>. 
* unittest: unittest<2>. 
* urllib: urllib<3>. 
* webbrowser: webbrowser<2>. 

@end menu

@node PEP 594 Remove “dead batteries” from the standard library,2to3,,Removed Modules And APIs
@anchor{whatsnew/3 13 pep-594-remove-dead-batteries-from-the-standard-library}@anchor{57f}
@subsubsection PEP 594: Remove “dead batteries” from the standard library


@geindex Python Enhancement Proposals; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/} proposed removing 19 modules from the standard library,
colloquially referred to as ‘dead batteries’ due to their
historic, obsolete, or insecure status.
All of the following modules were deprecated in Python 3.11,
and are now removed:


@itemize *

@item 
@code{aifc}


@itemize *

@item 
standard-aifc@footnote{https://pypi.org/project/standard-aifc/}:
Use the redistribution of @code{aifc} library from PyPI.
@end itemize

@item 
@code{audioop}


@itemize *

@item 
audioop-lts@footnote{https://pypi.org/project/audioop-lts/}:
Use @code{audioop-lts} library from PyPI.
@end itemize

@item 
@code{chunk}


@itemize *

@item 
standard-chunk@footnote{https://pypi.org/project/standard-chunk/}:
Use the redistribution of @code{chunk} library from PyPI.
@end itemize

@item 
@code{cgi} and @code{cgitb}


@itemize *

@item 
@code{cgi.FieldStorage} can typically be replaced with
@ref{320,,urllib.parse.parse_qsl()} for @code{GET} and @code{HEAD} requests,
and the @ref{48,,email.message} module or the multipart@footnote{https://pypi.org/project/multipart/} library
for @code{POST} and @code{PUT} requests.

@item 
@code{cgi.parse()} can be replaced by calling
@ref{321,,urllib.parse.parse_qs()} directly on the desired query string,
unless the input is @code{multipart/form-data},
which should be replaced as described below for @code{cgi.parse_multipart()}.

@item 
@code{cgi.parse_header()} can be replaced with the functionality
in the @ref{3f,,email} package, which implements the same MIME RFCs.
For example, with @ref{580,,email.message.EmailMessage}:

@example
from email.message import EmailMessage

msg = EmailMessage()
msg['content-type'] = 'application/json; charset="utf8"'
main, params = msg.get_content_type(), msg['content-type'].params
@end example

@item 
@code{cgi.parse_multipart()} can be replaced with the functionality
in the @ref{3f,,email} package, which implements the same MIME RFCs,
or with the multipart@footnote{https://pypi.org/project/multipart/} library.
For example, the @ref{580,,email.message.EmailMessage}
and @ref{581,,email.message.Message} classes.

@item 
standard-cgi@footnote{https://pypi.org/project/standard-cgi/}: and standard-cgitb@footnote{https://pypi.org/project/standard-cgitb/}:
Use the redistribution of @code{cgi} and @code{cgitb} library from PyPI.
@end itemize

@item 
@code{crypt} and the private @code{_crypt} extension.
The @ref{6c,,hashlib} module may be an appropriate replacement
when simply hashing a value is required.
Otherwise, various third-party libraries on PyPI are available:


@itemize *

@item 
bcrypt@footnote{https://pypi.org/project/bcrypt/}:
Modern password hashing for your software and your servers.

@item 
argon2-cffi@footnote{https://pypi.org/project/argon2-cffi/}:
The secure Argon2 password hashing algorithm.

@item 
legacycrypt@footnote{https://pypi.org/project/legacycrypt/}:
@ref{2e,,ctypes} wrapper to the POSIX crypt library call
and associated functionality.

@item 
crypt_r@footnote{https://pypi.org/project/crypt_r/}:
Fork of the @code{crypt} module,
wrapper to the @code{crypt_r(3)@footnote{https://manpages.debian.org/crypt_r(3)}} library call
and associated functionality.

@item 
standard-crypt@footnote{https://pypi.org/project/standard-crypt/} and deprecated-crypt-alternative@footnote{https://pypi.org/project/deprecated-crypt-alternative/}:
Use the redistribution of @code{crypt} and reimplementation of @code{_crypt} libraries from PyPI.
@end itemize

@item 
@code{imghdr}:
The filetype@footnote{https://pypi.org/project/filetype/}, puremagic@footnote{https://pypi.org/project/puremagic/}, or python-magic@footnote{https://pypi.org/project/python-magic/} libraries
should be used as replacements.
For example, the @code{puremagic.what()} function can be used
to replace the @code{imghdr.what()} function for all file formats
that were supported by @code{imghdr}.


@itemize *

@item 
standard-imghdr@footnote{https://pypi.org/project/standard-imghdr/}:
Use the redistribution of @code{imghdr} library from PyPI.
@end itemize

@item 
@code{mailcap}:
Use the @ref{93,,mimetypes} module instead.


@itemize *

@item 
standard-mailcap@footnote{https://pypi.org/project/standard-mailcap/}:
Use the redistribution of @code{mailcap} library from PyPI.
@end itemize

@item 
@code{msilib}

@item 
@code{nis}

@item 
@code{nntplib}:
Use the pynntp@footnote{https://pypi.org/project/pynntp/} library from PyPI instead.


@itemize *

@item 
standard-nntplib@footnote{https://pypi.org/project/standard-nntplib/}:
Use the redistribution of @code{nntplib} library from PyPI.
@end itemize

@item 
@code{ossaudiodev}:
For audio playback, use the pygame@footnote{https://pypi.org/project/pygame/} library from PyPI instead.

@item 
@code{pipes}:
Use the @ref{dc,,subprocess} module instead.
Use @ref{582,,shlex.quote()} to replace the undocumented @code{pipes.quote}
function.


@itemize *

@item 
standard-pipes@footnote{https://pypi.org/project/standard-pipes/}:
Use the redistribution of @code{pipes} library from PyPI.
@end itemize

@item 
@code{sndhdr}:
The filetype@footnote{https://pypi.org/project/filetype/}, puremagic@footnote{https://pypi.org/project/puremagic/}, or python-magic@footnote{https://pypi.org/project/python-magic/} libraries
should be used as replacements.


@itemize *

@item 
standard-sndhdr@footnote{https://pypi.org/project/standard-sndhdr/}:
Use the redistribution of @code{sndhdr} library from PyPI.
@end itemize

@item 
@code{spwd}:
Use the python-pam@footnote{https://pypi.org/project/python-pam/} library from PyPI instead.

@item 
@code{sunau}


@itemize *

@item 
standard-sunau@footnote{https://pypi.org/project/standard-sunau/}:
Use the redistribution of @code{sunau} library from PyPI.
@end itemize

@item 
@code{telnetlib},
Use the telnetlib3@footnote{https://pypi.org/project/telnetlib3/} or Exscript@footnote{https://pypi.org/project/Exscript/} libraries from PyPI instead.


@itemize *

@item 
standard-telnetlib@footnote{https://pypi.org/project/standard-telnetlib/}:
Use the redistribution of @code{telnetlib} library from PyPI.
@end itemize

@item 
@code{uu}:
Use the @ref{f,,base64} module instead, as a modern alternative.


@itemize *

@item 
standard-uu@footnote{https://pypi.org/project/standard-uu/}:
Use the redistribution of @code{uu} library from PyPI.
@end itemize

@item 
@code{xdrlib}


@itemize *

@item 
standard-xdrlib@footnote{https://pypi.org/project/standard-xdrlib/}:
Use the redistribution of @code{xdrlib} library from PyPI.
@end itemize
@end itemize

(Contributed by Victor Stinner and Zachary Ware in gh-104773@footnote{https://github.com/python/cpython/issues/104773} and gh-104780@footnote{https://github.com/python/cpython/issues/104780}.)

@node 2to3,builtins,PEP 594 Remove “dead batteries” from the standard library,Removed Modules And APIs
@anchor{whatsnew/3 13 to3}@anchor{583}
@subsubsection 2to3



@itemize *

@item 
Remove the @code{2to3} program and the @code{lib2to3} module,
previously deprecated in Python 3.11.
(Contributed by Victor Stinner in gh-104780@footnote{https://github.com/python/cpython/issues/104780}.)
@end itemize

@node builtins,configparser<3>,2to3,Removed Modules And APIs
@anchor{whatsnew/3 13 builtins}@anchor{584}
@subsubsection builtins



@itemize *

@item 
Remove support for chained @ref{48f,,classmethod} descriptors
(introduced in gh-63272@footnote{https://github.com/python/cpython/issues/63272}).
These can no longer be used to wrap other descriptors,
such as @ref{4b4,,property}.
The core design of this feature was flawed and led to several problems.
To “pass-through” a @code{classmethod}, consider using
the @code{__wrapped__} attribute that was added in Python 3.10.
(Contributed by Raymond Hettinger in gh-89519@footnote{https://github.com/python/cpython/issues/89519}.)

@item 
Raise a @ref{246,,RuntimeError} when calling @ref{585,,frame.clear()}
on a suspended frame (as has always been the case for an executing frame).
(Contributed by Irit Katriel in gh-79932@footnote{https://github.com/python/cpython/issues/79932}.)
@end itemize

@node configparser<3>,importlib metadata,builtins,Removed Modules And APIs
@anchor{whatsnew/3 13 id3}@anchor{586}
@subsubsection configparser



@itemize *

@item 
Remove the undocumented @code{LegacyInterpolation} class,
deprecated in the docstring since Python 3.2,
and at runtime since Python 3.11.
(Contributed by Hugo van Kemenade in gh-104886@footnote{https://github.com/python/cpython/issues/104886}.)
@end itemize

@node importlib metadata,locale,configparser<3>,Removed Modules And APIs
@anchor{whatsnew/3 13 importlib-metadata}@anchor{587}
@subsubsection importlib.metadata



@itemize *

@item 
Remove deprecated subscript (@ref{588,,__getitem__()}) access for
@ref{589,,EntryPoint} objects.
(Contributed by Jason R. Coombs in gh-113175@footnote{https://github.com/python/cpython/issues/113175}.)
@end itemize

@node locale,opcode,importlib metadata,Removed Modules And APIs
@anchor{whatsnew/3 13 locale}@anchor{58a}
@subsubsection locale



@itemize *

@item 
Remove the @code{locale.resetlocale()} function, deprecated in Python 3.11.
Use @code{locale.setlocale(locale.LC_ALL, "")} instead.
(Contributed by Victor Stinner in gh-104783@footnote{https://github.com/python/cpython/issues/104783}.)
@end itemize

@node opcode,optparse,locale,Removed Modules And APIs
@anchor{whatsnew/3 13 opcode}@anchor{58b}
@subsubsection opcode



@itemize *

@item 
Move @code{opcode.ENABLE_SPECIALIZATION} to @code{_opcode.ENABLE_SPECIALIZATION}.
This field was added in 3.12, it was never documented,
and is not intended for external use.
(Contributed by Irit Katriel in gh-105481@footnote{https://github.com/python/cpython/issues/105481}.)

@item 
Remove @code{opcode.is_pseudo()}, @code{opcode.MIN_PSEUDO_OPCODE},
and @code{opcode.MAX_PSEUDO_OPCODE}, which were added in Python 3.12,
but were neither documented nor exposed through @ref{3c,,dis},
and were not intended to be used externally.
(Contributed by Irit Katriel in gh-105481@footnote{https://github.com/python/cpython/issues/105481}.)
@end itemize

@node optparse,pathlib<5>,opcode,Removed Modules And APIs
@anchor{whatsnew/3 13 optparse}@anchor{58c}
@subsubsection optparse



@itemize *

@item 
This module is no longer considered @ref{23f,,soft deprecated}.
While @ref{7,,argparse} remains preferred for new projects that
aren’t using a third party command line argument processing
library, there are aspects of the way @code{argparse} works that
mean the lower level @code{optparse} module may provide a better
foundation for `writing' argument processing libraries, and
for implementing command line applications which adhere more
strictly than @code{argparse} does to various Unix command line
processing conventions that originate in the behaviour of the
C @code{getopt()} function .
(Contributed by Alyssa Coghlan and Serhiy Storchaka in gh-126180@footnote{https://github.com/python/cpython/issues/126180}.)
@end itemize

@node pathlib<5>,re<3>,optparse,Removed Modules And APIs
@anchor{whatsnew/3 13 id4}@anchor{58d}
@subsubsection pathlib



@itemize *

@item 
Remove the ability to use @ref{268,,Path} objects as context managers.
This functionality was deprecated and has had no effect since Python 3.9.
(Contributed by Barney Gale in gh-83863@footnote{https://github.com/python/cpython/issues/83863}.)
@end itemize

@node re<3>,tkinter tix,pathlib<5>,Removed Modules And APIs
@anchor{whatsnew/3 13 id5}@anchor{58e}
@subsubsection re



@itemize *

@item 
Remove the undocumented, deprecated, and broken
@code{re.template()} function and @code{re.TEMPLATE} / @code{re.T} flag.
(Contributed by Serhiy Storchaka and Nikita Sobolev in gh-105687@footnote{https://github.com/python/cpython/issues/105687}.)
@end itemize

@node tkinter tix,turtle<2>,re<3>,Removed Modules And APIs
@anchor{whatsnew/3 13 tkinter-tix}@anchor{58f}
@subsubsection tkinter.tix



@itemize *

@item 
Remove the @code{tkinter.tix} module, deprecated in Python 3.6.
The third-party Tix library which the module wrapped is unmaintained.
(Contributed by Zachary Ware in gh-75552@footnote{https://github.com/python/cpython/issues/75552}.)
@end itemize

@node turtle<2>,typing<3>,tkinter tix,Removed Modules And APIs
@anchor{whatsnew/3 13 turtle}@anchor{590}
@subsubsection turtle



@itemize *

@item 
Remove the @code{RawTurtle.settiltangle()} method,
deprecated in the documentation since Python 3.1
and at runtime since Python 3.11.
(Contributed by Hugo van Kemenade in gh-104876@footnote{https://github.com/python/cpython/issues/104876}.)
@end itemize

@node typing<3>,unittest<2>,turtle<2>,Removed Modules And APIs
@anchor{whatsnew/3 13 id6}@anchor{591}
@subsubsection typing



@itemize *

@item 
Remove the @code{typing.io} and @code{typing.re} namespaces,
deprecated since Python 3.8.
The items in those namespaces can be imported directly
from the @ref{10b,,typing} module.
(Contributed by Sebastian Rittau in gh-92871@footnote{https://github.com/python/cpython/issues/92871}.)

@item 
Remove the keyword-argument method of creating
@ref{330,,TypedDict} types, deprecated in Python 3.11.
(Contributed by Tomas Roun in gh-104786@footnote{https://github.com/python/cpython/issues/104786}.)
@end itemize

@node unittest<2>,urllib<3>,typing<3>,Removed Modules And APIs
@anchor{whatsnew/3 13 unittest}@anchor{592}
@subsubsection unittest



@itemize *

@item 
Remove the following @ref{10d,,unittest} functions, deprecated in Python 3.11:


@itemize *

@item 
@code{unittest.findTestCases()}

@item 
@code{unittest.makeSuite()}

@item 
@code{unittest.getTestCaseNames()}
@end itemize

Use @ref{593,,TestLoader} methods instead:


@itemize *

@item 
@ref{594,,loadTestsFromModule()}

@item 
@ref{595,,loadTestsFromTestCase()}

@item 
@ref{596,,getTestCaseNames()}
@end itemize

(Contributed by Hugo van Kemenade in gh-104835@footnote{https://github.com/python/cpython/issues/104835}.)

@item 
Remove the untested and undocumented @code{TestProgram.usageExit()}
method, deprecated in Python 3.11.
(Contributed by Hugo van Kemenade in gh-104992@footnote{https://github.com/python/cpython/issues/104992}.)
@end itemize

@node urllib<3>,webbrowser<2>,unittest<2>,Removed Modules And APIs
@anchor{whatsnew/3 13 urllib}@anchor{597}
@subsubsection urllib



@itemize *

@item 
Remove the `cafile', `capath', and `cadefault' parameters of the
@ref{309,,urllib.request.urlopen()} function, deprecated in Python 3.6.
Use the `context' parameter instead with an @ref{355,,SSLContext} instance.
The @ref{598,,ssl.SSLContext.load_cert_chain()} function
can be used to load specific certificates,
or let @ref{480,,ssl.create_default_context()} select
the operating system’s trusted certificate authority (CA) certificates.
(Contributed by Victor Stinner in gh-105382@footnote{https://github.com/python/cpython/issues/105382}.)
@end itemize

@node webbrowser<2>,,urllib<3>,Removed Modules And APIs
@anchor{whatsnew/3 13 webbrowser}@anchor{599}
@subsubsection webbrowser



@itemize *

@item 
Remove the untested and undocumented @code{MacOSX} class,
deprecated in Python 3.11.
Use the @code{MacOSXOSAScript} class (introduced in Python 3.2) instead.
(Contributed by Hugo van Kemenade in gh-104804@footnote{https://github.com/python/cpython/issues/104804}.)

@item 
Remove the deprecated @code{MacOSXOSAScript._name} attribute.
Use the @ref{59a,,MacOSXOSAScript.name}
attribute instead.
(Contributed by Nikita Sobolev in gh-105546@footnote{https://github.com/python/cpython/issues/105546}.)
@end itemize

@node New Deprecations,CPython Bytecode Changes,Removed Modules And APIs,What’s New In Python 3 13
@anchor{whatsnew/3 13 new-deprecations}@anchor{59b}
@subsection New Deprecations



@itemize *

@item 
@ref{59c,,User-defined functions}:


@itemize *

@item 
Deprecate assignment to a function’s @ref{59d,,__code__} attribute,
where the new code object’s type does not match the function’s type.
The different types are:
plain function, generator, async generator, and coroutine.
(Contributed by Irit Katriel in gh-81137@footnote{https://github.com/python/cpython/issues/81137}.)
@end itemize

@item 
@ref{8,,array}:


@itemize *

@item 
Deprecate the @code{'u'} format code (@code{wchar_t}) at runtime.
This format code has been deprecated in documentation since Python 3.3,
and will be removed in Python 3.16.
Use the @code{'w'} format code (@ref{33b,,Py_UCS4})
for Unicode characters instead.
(Contributed by Hugo van Kemenade in gh-80480@footnote{https://github.com/python/cpython/issues/80480}.)
@end itemize

@item 
@ref{2e,,ctypes}:


@itemize *

@item 
Deprecate the undocumented @code{SetPointerType()} function,
to be removed in Python 3.15.
(Contributed by Victor Stinner in gh-105733@footnote{https://github.com/python/cpython/issues/105733}.)

@item 
@ref{23f,,Soft-deprecate} the @ref{59e,,ARRAY()}
function in favour of @code{type * length} multiplication.
(Contributed by Victor Stinner in gh-105733@footnote{https://github.com/python/cpython/issues/105733}.)
@end itemize

@item 
@ref{3a,,decimal}:


@itemize *

@item 
Deprecate the non-standard and undocumented @ref{200,,Decimal}
format specifier @code{'N'},
which is only supported in the @code{decimal} module’s C implementation.
Scheduled to be removed in Python 3.18.
(Contributed by Serhiy Storchaka in gh-89902@footnote{https://github.com/python/cpython/issues/89902}.)
@end itemize

@item 
@ref{3c,,dis}:


@itemize *

@item 
Deprecate the @code{HAVE_ARGUMENT} separator.
Check membership in @ref{59f,,hasarg} instead.
(Contributed by Irit Katriel in gh-109319@footnote{https://github.com/python/cpython/issues/109319}.)
@end itemize

@item 
@ref{67,,gettext}:


@itemize *

@item 
Deprecate non-integer numbers as arguments to functions and methods
that consider plural forms in the @code{gettext} module,
even if no translation was found.
(Contributed by Serhiy Storchaka in gh-88434@footnote{https://github.com/python/cpython/issues/88434}.)
@end itemize

@item 
@ref{68,,glob}:


@itemize *

@item 
Deprecate the undocumented @code{glob0()} and @code{glob1()} functions.
Use @ref{5a0,,glob()} and pass a @ref{5a1,,path-like object} specifying
the root directory to the `root_dir' parameter instead.
(Contributed by Barney Gale in gh-117337@footnote{https://github.com/python/cpython/issues/117337}.)
@end itemize

@item 
@ref{76,,http.server}:


@itemize *

@item 
Deprecate @ref{327,,CGIHTTPRequestHandler},
to be removed in Python 3.15.
Process-based CGI HTTP servers have been out of favor for a very long time.
This code was outdated, unmaintained, and rarely used.
It has a high potential for both security and functionality bugs.
(Contributed by Gregory P. Smith in gh-109096@footnote{https://github.com/python/cpython/issues/109096}.)

@item 
Deprecate the @code{--cgi} flag to
the @code{python -m http.server} command-line interface,
to be removed in Python 3.15.
(Contributed by Gregory P. Smith in gh-109096@footnote{https://github.com/python/cpython/issues/109096}.)
@end itemize

@item 
@ref{93,,mimetypes}:


@itemize *

@item 
@ref{23f,,Soft-deprecate} file path arguments
to @ref{518,,guess_type()},
use @ref{517,,guess_file_type()} instead.
(Contributed by Serhiy Storchaka in gh-66543@footnote{https://github.com/python/cpython/issues/66543}.)
@end itemize

@item 
@ref{be,,re}:


@itemize *

@item 
Deprecate passing the optional `maxsplit', `count', or `flags' arguments
as positional arguments to the module-level
@ref{5a2,,split()}, @ref{5a3,,sub()}, and @ref{5a4,,subn()} functions.
These parameters will become @ref{5a5,,keyword-only}
in a future version of Python.
(Contributed by Serhiy Storchaka in gh-56166@footnote{https://github.com/python/cpython/issues/56166}.)
@end itemize

@item 
@ref{a8,,pathlib}:


@itemize *

@item 
Deprecate @ref{328,,PurePath.is_reserved()},
to be removed in Python 3.15.
Use @ref{329,,os.path.isreserved()} to detect reserved paths on Windows.
(Contributed by Barney Gale in gh-88569@footnote{https://github.com/python/cpython/issues/88569}.)
@end itemize

@item 
@ref{af,,platform}:


@itemize *

@item 
Deprecate @ref{32a,,java_ver()},
to be removed in Python 3.15.
This function is only useful for Jython support, has a confusing API,
and is largely untested.
(Contributed by Nikita Sobolev in gh-116349@footnote{https://github.com/python/cpython/issues/116349}.)
@end itemize

@item 
@ref{ba,,pydoc}:


@itemize *

@item 
Deprecate the undocumented @code{ispackage()} function.
(Contributed by Zackery Spytz in gh-64020@footnote{https://github.com/python/cpython/issues/64020}.)
@end itemize

@item 
@ref{d4,,sqlite3}:


@itemize *

@item 
Deprecate passing more than one positional argument to
the @ref{5a6,,connect()} function
and the @ref{54e,,Connection} constructor.
The remaining parameters will become keyword-only in Python 3.15.
(Contributed by Erlend E. Aasland in gh-107948@footnote{https://github.com/python/cpython/issues/107948}.)

@item 
Deprecate passing name, number of arguments, and the callable as keyword
arguments for @ref{5a7,,Connection.create_function()}
and @ref{5a8,,Connection.create_aggregate()}
These parameters will become positional-only in Python 3.15.
(Contributed by Erlend E. Aasland in gh-108278@footnote{https://github.com/python/cpython/issues/108278}.)

@item 
Deprecate passing the callback callable by keyword for the
@ref{5a9,,set_authorizer()},
@ref{5aa,,set_progress_handler()}, and
@ref{5ab,,set_trace_callback()}
@ref{54e,,Connection} methods.
The callback callables will become positional-only in Python 3.15.
(Contributed by Erlend E. Aasland in gh-108278@footnote{https://github.com/python/cpython/issues/108278}.)
@end itemize

@item 
@ref{df,,sys}:


@itemize *

@item 
Deprecate the @ref{33c,,_enablelegacywindowsfsencoding()} function,
to be removed in Python 3.16.
Use the 
@geindex PYTHONLEGACYWINDOWSFSENCODING
@geindex environment variable; PYTHONLEGACYWINDOWSFSENCODING
@ref{33d,,PYTHONLEGACYWINDOWSFSENCODING} environment variable instead.
(Contributed by Inada Naoki in gh-73427@footnote{https://github.com/python/cpython/issues/73427}.)
@end itemize

@item 
@ref{e4,,tarfile}:


@itemize *

@item 
Deprecate the undocumented and unused @code{TarFile.tarfile} attribute,
to be removed in Python 3.16.
(Contributed in gh-115256@footnote{https://github.com/python/cpython/issues/115256}.)
@end itemize

@item 
@ref{105,,traceback}:


@itemize *

@item 
Deprecate the @ref{564,,TracebackException.exc_type} attribute.
Use @ref{562,,TracebackException.exc_type_str} instead.
(Contributed by Irit Katriel in gh-112332@footnote{https://github.com/python/cpython/issues/112332}.)
@end itemize

@item 
@ref{10b,,typing}:


@itemize *

@item 
Deprecate the undocumented keyword argument syntax for creating
@ref{32f,,NamedTuple} classes
(e.g. @code{Point = NamedTuple("Point", x=int, y=int)}),
to be removed in Python 3.15.
Use the class-based syntax or the functional syntax instead.
(Contributed by Alex Waygood in gh-105566@footnote{https://github.com/python/cpython/issues/105566}.)

@item 
Deprecate omitting the `fields' parameter when creating
a @ref{32f,,NamedTuple} or @ref{330,,typing.TypedDict} class,
and deprecate passing @code{None} to the `fields' parameter of both types.
Python 3.15 will require a valid sequence for the `fields' parameter.
To create a NamedTuple class with zero fields,
use @code{class NT(NamedTuple): pass} or @code{NT = NamedTuple("NT", ())}.
To create a TypedDict class with zero fields,
use @code{class TD(TypedDict): pass} or @code{TD = TypedDict("TD", @{@})}.
(Contributed by Alex Waygood in gh-105566@footnote{https://github.com/python/cpython/issues/105566} and gh-105570@footnote{https://github.com/python/cpython/issues/105570}.)

@item 
Deprecate the @ref{331,,typing.no_type_check_decorator()} decorator function,
to be removed in Python 3.15.
After eight years in the @ref{10b,,typing} module,
it has yet to be supported by any major type checker.
(Contributed by Alex Waygood in gh-106309@footnote{https://github.com/python/cpython/issues/106309}.)

@item 
Deprecate @ref{5ac,,typing.AnyStr}.
In Python 3.16, it will be removed from @code{typing.__all__},
and a @ref{1a4,,DeprecationWarning} will be emitted at runtime
when it is imported or accessed.
It will be removed entirely in Python 3.18.
Use the new @ref{5ad,,type parameter syntax} instead.
(Contributed by Michael The in gh-107116@footnote{https://github.com/python/cpython/issues/107116}.)
@end itemize

@item 
@ref{11a,,wave}:


@itemize *

@item 
Deprecate the @ref{332,,getmark()}, @code{setmark()},
and @ref{333,,getmarkers()} methods of
the @ref{334,,Wave_read} and @ref{335,,Wave_write} classes,
to be removed in Python 3.15.
(Contributed by Victor Stinner in gh-105096@footnote{https://github.com/python/cpython/issues/105096}.)
@end itemize
@end itemize

@c Add deprecations above alphabetically, not here at the end.

@menu
* Pending removal in Python 3.14: Pending removal in Python 3 14. 
* Pending removal in Python 3.15: Pending removal in Python 3 15<3>. 
* Pending removal in Python 3.16: Pending removal in Python 3 16<3>. 
* Pending removal in Python 3.17: Pending removal in Python 3 17<2>. 
* Pending removal in Python 3.18: Pending removal in Python 3 18<3>. 
* Pending removal in Python 3.19: Pending removal in Python 3 19<2>. 
* Pending removal in future versions: Pending removal in future versions<3>. 

@end menu

@node Pending removal in Python 3 14,Pending removal in Python 3 15<3>,,New Deprecations
@anchor{whatsnew/3 13 pending-removal-in-python-3-14}@anchor{5ae}
@subsubsection Pending removal in Python 3.14



@itemize *

@item 
@ref{7,,argparse}: The `type', `choices', and `metavar' parameters
of @code{argparse.BooleanOptionalAction} are deprecated
and will be removed in 3.14.
(Contributed by Nikita Sobolev in gh-92248@footnote{https://github.com/python/cpython/issues/92248}.)

@item 
@ref{9,,ast}: The following features have been deprecated in documentation
since Python 3.8, now cause a @ref{1a4,,DeprecationWarning} to be emitted at
runtime when they are accessed or used, and will be removed in Python 3.14:


@itemize *

@item 
@code{ast.Num}

@item 
@code{ast.Str}

@item 
@code{ast.Bytes}

@item 
@code{ast.NameConstant}

@item 
@code{ast.Ellipsis}
@end itemize

Use @ref{2f1,,ast.Constant} instead.
(Contributed by Serhiy Storchaka in gh-90953@footnote{https://github.com/python/cpython/issues/90953}.)

@item 
@ref{b,,asyncio}:


@itemize *

@item 
The child watcher classes @code{asyncio.MultiLoopChildWatcher},
@code{asyncio.FastChildWatcher}, @code{asyncio.AbstractChildWatcher}
and @code{asyncio.SafeChildWatcher} are deprecated and
will be removed in Python 3.14.
(Contributed by Kumar Aditya in gh-94597@footnote{https://github.com/python/cpython/issues/94597}.)

@item 
@code{asyncio.set_child_watcher()}, @code{asyncio.get_child_watcher()},
@code{asyncio.AbstractEventLoopPolicy.set_child_watcher()} and
@code{asyncio.AbstractEventLoopPolicy.get_child_watcher()} are deprecated
and will be removed in Python 3.14.
(Contributed by Kumar Aditya in gh-94597@footnote{https://github.com/python/cpython/issues/94597}.)

@item 
The @ref{2f4,,get_event_loop()} method of the
default event loop policy now emits a @ref{1a4,,DeprecationWarning} if there
is no current event loop set and it decides to create one.
(Contributed by Serhiy Storchaka and Guido van Rossum in gh-100160@footnote{https://github.com/python/cpython/issues/100160}.)
@end itemize

@item 
@ref{3f,,email}: Deprecated the `isdst' parameter in @ref{2f9,,email.utils.localtime()}.
(Contributed by Alan Williams in gh-72346@footnote{https://github.com/python/cpython/issues/72346}.)

@item 
@ref{7c,,importlib.abc} deprecated classes:


@itemize *

@item 
@code{importlib.abc.ResourceReader}

@item 
@code{importlib.abc.Traversable}

@item 
@code{importlib.abc.TraversableResources}
@end itemize

Use @ref{80,,importlib.resources.abc} classes instead:


@itemize *

@item 
@ref{2fc,,importlib.resources.abc.Traversable}

@item 
@ref{2fb,,importlib.resources.abc.TraversableResources}
@end itemize

(Contributed by Jason R. Coombs and Hugo van Kemenade in gh-93963@footnote{https://github.com/python/cpython/issues/93963}.)

@item 
@ref{85,,itertools} had undocumented, inefficient, historically buggy,
and inconsistent support for copy, deepcopy, and pickle operations.
This will be removed in 3.14 for a significant reduction in code
volume and maintenance burden.
(Contributed by Raymond Hettinger in gh-101588@footnote{https://github.com/python/cpython/issues/101588}.)

@item 
@ref{98,,multiprocessing}: The default start method will change to a safer one on
Linux, BSDs, and other non-macOS POSIX platforms where @code{'fork'} is currently
the default (gh-84559@footnote{https://github.com/python/cpython/issues/84559}). Adding a runtime warning about this was deemed too
disruptive as the majority of code is not expected to care. Use the
@ref{24c,,get_context()} or
@ref{24d,,set_start_method()} APIs to explicitly specify when
your code `requires' @code{'fork'}.  See @ref{1d7,,Contexts and start methods}.

@item 
@ref{a8,,pathlib}: @ref{300,,is_relative_to()} and
@ref{2ff,,relative_to()}: passing additional arguments is
deprecated.

@item 
@ref{ae,,pkgutil}: @code{pkgutil.find_loader()} and @code{pkgutil.get_loader()}
now raise @ref{1a4,,DeprecationWarning};
use @ref{5af,,importlib.util.find_spec()} instead.
(Contributed by Nikita Sobolev in gh-97850@footnote{https://github.com/python/cpython/issues/97850}.)

@item 
@ref{b6,,pty}:


@itemize *

@item 
@code{master_open()}: use @ref{303,,pty.openpty()}.

@item 
@code{slave_open()}: use @ref{303,,pty.openpty()}.
@end itemize

@item 
@ref{d4,,sqlite3}:


@itemize *

@item 
@code{version} and @code{version_info}.

@item 
@ref{5b0,,execute()} and @ref{5b1,,executemany()}
if @ref{5b2,,named placeholders} are used and
`parameters' is a sequence instead of a @ref{184,,dict}.
@end itemize

@item 
@ref{10f,,urllib}:
@code{urllib.parse.Quoter} is deprecated: it was not intended to be a
public API.
(Contributed by Gregory P. Smith in gh-88168@footnote{https://github.com/python/cpython/issues/88168}.)
@end itemize

@node Pending removal in Python 3 15<3>,Pending removal in Python 3 16<3>,Pending removal in Python 3 14,New Deprecations
@anchor{whatsnew/3 13 pending-removal-in-python-3-15}@anchor{5b3}
@subsubsection Pending removal in Python 3.15



@itemize *

@item 
The import system:


@itemize *

@item 
Setting @ref{323,,__cached__} on a module while
failing to set @ref{324,,__spec__.cached}
is deprecated. In Python 3.15, @code{__cached__} will cease to be set or
take into consideration by the import system or standard library. (gh-97879@footnote{https://github.com/python/cpython/issues/97879})

@item 
Setting @ref{325,,__package__} on a module while
failing to set @ref{326,,__spec__.parent}
is deprecated. In Python 3.15, @code{__package__} will cease to be set or
take into consideration by the import system or standard library. (gh-97879@footnote{https://github.com/python/cpython/issues/97879})
@end itemize

@item 
@ref{2e,,ctypes}:


@itemize *

@item 
The undocumented @code{ctypes.SetPointerType()} function
has been deprecated since Python 3.13.
@end itemize

@item 
@ref{76,,http.server}:


@itemize *

@item 
The obsolete and rarely used @ref{327,,CGIHTTPRequestHandler}
has been deprecated since Python 3.13.
No direct replacement exists.
`Anything' is better than CGI to interface
a web server with a request handler.

@item 
The @code{--cgi} flag to the @code{python -m http.server}
command-line interface has been deprecated since Python 3.13.
@end itemize

@item 
@ref{7b,,importlib}:


@itemize *

@item 
@code{load_module()} method: use @code{exec_module()} instead.
@end itemize

@item 
@ref{a8,,pathlib}:


@itemize *

@item 
@ref{328,,PurePath.is_reserved()}
has been deprecated since Python 3.13.
Use @ref{329,,os.path.isreserved()} to detect reserved paths on Windows.
@end itemize

@item 
@ref{af,,platform}:


@itemize *

@item 
@ref{32a,,java_ver()} has been deprecated since Python 3.13.
This function is only useful for Jython support, has a confusing API,
and is largely untested.
@end itemize

@item 
@ref{e1,,sysconfig}:


@itemize *

@item 
The `check_home' argument of @ref{32b,,sysconfig.is_python_build()} has been
deprecated since Python 3.12.
@end itemize

@item 
@ref{f3,,threading}:


@itemize *

@item 
@ref{32c,,RLock()} will take no arguments in Python 3.15.
Passing any arguments has been deprecated since Python 3.14,
as the Python version does not permit any arguments,
but the C version allows any number of positional or keyword arguments,
ignoring every argument.
@end itemize

@item 
@ref{10a,,types}:


@itemize *

@item 
@ref{32d,,types.CodeType}: Accessing @ref{32e,,co_lnotab} was
deprecated in 
@geindex Python Enhancement Proposals; PEP 626
PEP 626@footnote{https://peps.python.org/pep-0626/}
since 3.10 and was planned to be removed in 3.12,
but it only got a proper @ref{1a4,,DeprecationWarning} in 3.12.
May be removed in 3.15.
(Contributed by Nikita Sobolev in gh-101866@footnote{https://github.com/python/cpython/issues/101866}.)
@end itemize

@item 
@ref{10b,,typing}:


@itemize *

@item 
The undocumented keyword argument syntax for creating
@ref{32f,,NamedTuple} classes
(for example, @code{Point = NamedTuple("Point", x=int, y=int)})
has been deprecated since Python 3.13.
Use the class-based syntax or the functional syntax instead.

@item 
When using the functional syntax of @ref{330,,TypedDict}s, failing
to pass a value to the `fields' parameter (@code{TD = TypedDict("TD")}) or
passing @code{None} (@code{TD = TypedDict("TD", None)}) has been deprecated
since Python 3.13.
Use @code{class TD(TypedDict): pass} or @code{TD = TypedDict("TD", @{@})}
to create a TypedDict with zero field.

@item 
The @ref{331,,typing.no_type_check_decorator()} decorator function
has been deprecated since Python 3.13.
After eight years in the @ref{10b,,typing} module,
it has yet to be supported by any major type checker.
@end itemize

@item 
@ref{11a,,wave}:


@itemize *

@item 
The @ref{332,,getmark()}, @code{setmark()},
and @ref{333,,getmarkers()} methods of
the @ref{334,,Wave_read} and @ref{335,,Wave_write} classes
have been deprecated since Python 3.13.
@end itemize

@item 
@ref{139,,zipimport}:


@itemize *

@item 
@ref{336,,load_module()} has been deprecated since
Python 3.10. Use @ref{337,,exec_module()} instead.
(Contributed by Jiahao Li in gh-125746@footnote{https://github.com/python/cpython/issues/125746}.)
@end itemize
@end itemize

@node Pending removal in Python 3 16<3>,Pending removal in Python 3 17<2>,Pending removal in Python 3 15<3>,New Deprecations
@anchor{whatsnew/3 13 pending-removal-in-python-3-16}@anchor{5b4}
@subsubsection Pending removal in Python 3.16



@itemize *

@item 
The import system:


@itemize *

@item 
Setting @ref{339,,__loader__} on a module while
failing to set @ref{33a,,__spec__.loader}
is deprecated. In Python 3.16, @code{__loader__} will cease to be set or
taken into consideration by the import system or the standard library.
@end itemize

@item 
@ref{8,,array}:


@itemize *

@item 
The @code{'u'} format code (@code{wchar_t})
has been deprecated in documentation since Python 3.3
and at runtime since Python 3.13.
Use the @code{'w'} format code (@ref{33b,,Py_UCS4})
for Unicode characters instead.
@end itemize

@item 
@ref{b,,asyncio}:


@itemize *

@item 
@code{asyncio.iscoroutinefunction()} is deprecated
and will be removed in Python 3.16;
use @ref{30f,,inspect.iscoroutinefunction()} instead.
(Contributed by Jiahao Li and Kumar Aditya in gh-122875@footnote{https://github.com/python/cpython/issues/122875}.)

@item 
@ref{b,,asyncio} policy system is deprecated and will be removed in Python 3.16.
In particular, the following classes and functions are deprecated:


@itemize *

@item 
@ref{310,,asyncio.AbstractEventLoopPolicy}

@item 
@ref{311,,asyncio.DefaultEventLoopPolicy}

@item 
@ref{312,,asyncio.WindowsSelectorEventLoopPolicy}

@item 
@ref{313,,asyncio.WindowsProactorEventLoopPolicy}

@item 
@ref{314,,asyncio.get_event_loop_policy()}

@item 
@ref{315,,asyncio.set_event_loop_policy()}
@end itemize

Users should use @ref{2f5,,asyncio.run()} or @ref{2f7,,asyncio.Runner} with
`loop_factory' to use the desired event loop implementation.

For example, to use @ref{316,,asyncio.SelectorEventLoop} on Windows:

@example
import asyncio

async def main():
    ...

asyncio.run(main(), loop_factory=asyncio.SelectorEventLoop)
@end example

(Contributed by Kumar Aditya in gh-127949@footnote{https://github.com/python/cpython/issues/127949}.)
@end itemize

@item 
@ref{13,,builtins}:


@itemize *

@item 
Bitwise inversion on boolean types, @code{~True} or @code{~False}
has been deprecated since Python 3.12,
as it produces surprising and unintuitive results (@code{-2} and @code{-1}).
Use @code{not x} instead for the logical negation of a Boolean.
In the rare case that you need the bitwise inversion of
the underlying integer, convert to @code{int} explicitly (@code{~int(x)}).
@end itemize

@item 
@ref{63,,functools}:


@itemize *

@item 
Calling the Python implementation of @ref{21c,,functools.reduce()} with `function'
or `sequence' as keyword arguments has been deprecated since Python 3.14.
@end itemize

@item 
@ref{8b,,logging}:

Support for custom logging handlers with the `strm' argument is deprecated
and scheduled for removal in Python 3.16. Define handlers with the `stream'
argument instead. (Contributed by Mariusz Felisiak in gh-115032@footnote{https://github.com/python/cpython/issues/115032}.)

@item 
@ref{93,,mimetypes}:


@itemize *

@item 
Valid extensions start with a ‘.’ or are empty for
@ref{31b,,mimetypes.MimeTypes.add_type()}.
Undotted extensions are deprecated and will
raise a @ref{2ee,,ValueError} in Python 3.16.
(Contributed by Hugo van Kemenade in gh-75223@footnote{https://github.com/python/cpython/issues/75223}.)
@end itemize

@item 
@ref{ca,,shutil}:


@itemize *

@item 
The @code{ExecError} exception
has been deprecated since Python 3.14.
It has not been used by any function in @code{shutil} since Python 3.4,
and is now an alias of @ref{246,,RuntimeError}.
@end itemize

@item 
@ref{de,,symtable}:


@itemize *

@item 
The @ref{31f,,Class.get_methods} method
has been deprecated since Python 3.14.
@end itemize

@item 
@ref{df,,sys}:


@itemize *

@item 
The @ref{33c,,_enablelegacywindowsfsencoding()} function
has been deprecated since Python 3.13.
Use the 
@geindex PYTHONLEGACYWINDOWSFSENCODING
@geindex environment variable; PYTHONLEGACYWINDOWSFSENCODING
@ref{33d,,PYTHONLEGACYWINDOWSFSENCODING} environment variable instead.
@end itemize

@item 
@ref{e1,,sysconfig}:


@itemize *

@item 
The @code{sysconfig.expand_makefile_vars()} function
has been deprecated since Python 3.14.
Use the @code{vars} argument of @ref{33e,,sysconfig.get_paths()} instead.
@end itemize

@item 
@ref{e4,,tarfile}:


@itemize *

@item 
The undocumented and unused @code{TarFile.tarfile} attribute
has been deprecated since Python 3.13.
@end itemize
@end itemize

@node Pending removal in Python 3 17<2>,Pending removal in Python 3 18<3>,Pending removal in Python 3 16<3>,New Deprecations
@anchor{whatsnew/3 13 pending-removal-in-python-3-17}@anchor{5b5}
@subsubsection Pending removal in Python 3.17



@itemize *

@item 
@ref{1f,,collections.abc}:


@itemize -

@item 
@ref{340,,collections.abc.ByteString} is scheduled for removal in Python 3.17.

Use @code{isinstance(obj, collections.abc.Buffer)} to test if @code{obj}
implements the @ref{262,,buffer protocol} at runtime. For use
in type annotations, either use @ref{341,,Buffer} or a union
that explicitly specifies the types your code supports (e.g.,
@code{bytes | bytearray | memoryview}).

@code{ByteString} was originally intended to be an abstract class that
would serve as a supertype of both @ref{193,,bytes} and @ref{342,,bytearray}.
However, since the ABC never had any methods, knowing that an object was an
instance of @code{ByteString} never actually told you anything useful
about the object. Other common buffer types such as @ref{166,,memoryview}
were also never understood as subtypes of @code{ByteString} (either at
runtime or by static type checkers).

See 
@geindex Python Enhancement Proposals; PEP 688#current-options
PEP 688@footnote{https://peps.python.org/pep-0688/#current-options} for more details.
(Contributed by Shantanu Jain in gh-91896@footnote{https://github.com/python/cpython/issues/91896}.)
@end itemize

@item 
@ref{10b,,typing}:


@itemize -

@item 
Before Python 3.14, old-style unions were implemented using the private class
@code{typing._UnionGenericAlias}. This class is no longer needed for the implementation,
but it has been retained for backward compatibility, with removal scheduled for Python
3.17. Users should use documented introspection helpers like @ref{2ad,,typing.get_origin()}
and @ref{2ae,,typing.get_args()} instead of relying on private implementation details.

@item 
@ref{343,,typing.ByteString}, deprecated since Python 3.9, is scheduled for removal in
Python 3.17.

Use @code{isinstance(obj, collections.abc.Buffer)} to test if @code{obj}
implements the @ref{262,,buffer protocol} at runtime. For use
in type annotations, either use @ref{341,,Buffer} or a union
that explicitly specifies the types your code supports (e.g.,
@code{bytes | bytearray | memoryview}).

@code{ByteString} was originally intended to be an abstract class that
would serve as a supertype of both @ref{193,,bytes} and @ref{342,,bytearray}.
However, since the ABC never had any methods, knowing that an object was an
instance of @code{ByteString} never actually told you anything useful
about the object. Other common buffer types such as @ref{166,,memoryview}
were also never understood as subtypes of @code{ByteString} (either at
runtime or by static type checkers).

See 
@geindex Python Enhancement Proposals; PEP 688#current-options
PEP 688@footnote{https://peps.python.org/pep-0688/#current-options} for more details.
(Contributed by Shantanu Jain in gh-91896@footnote{https://github.com/python/cpython/issues/91896}.)
@end itemize
@end itemize

@node Pending removal in Python 3 18<3>,Pending removal in Python 3 19<2>,Pending removal in Python 3 17<2>,New Deprecations
@anchor{whatsnew/3 13 pending-removal-in-python-3-18}@anchor{5b6}
@subsubsection Pending removal in Python 3.18



@itemize *

@item 
@ref{3a,,decimal}:


@itemize *

@item 
The non-standard and undocumented @ref{200,,Decimal} format
specifier @code{'N'}, which is only supported in the @code{decimal} module’s
C implementation, has been deprecated since Python 3.13.
(Contributed by Serhiy Storchaka in gh-89902@footnote{https://github.com/python/cpython/issues/89902}.)
@end itemize
@end itemize

@node Pending removal in Python 3 19<2>,Pending removal in future versions<3>,Pending removal in Python 3 18<3>,New Deprecations
@anchor{whatsnew/3 13 pending-removal-in-python-3-19}@anchor{5b7}
@subsubsection Pending removal in Python 3.19



@itemize *

@item 
@ref{2e,,ctypes}:


@itemize *

@item 
Implicitly switching to the MSVC-compatible struct layout by setting
@ref{319,,_pack_} but not @ref{1e9,,_layout_}
on non-Windows platforms.
@end itemize
@end itemize

@node Pending removal in future versions<3>,,Pending removal in Python 3 19<2>,New Deprecations
@anchor{whatsnew/3 13 pending-removal-in-future-versions}@anchor{5b8}
@subsubsection Pending removal in future versions


The following APIs will be removed in the future,
although there is currently no date scheduled for their removal.


@itemize *

@item 
@ref{7,,argparse}:


@itemize *

@item 
Nesting argument groups and nesting mutually exclusive
groups are deprecated.

@item 
Passing the undocumented keyword argument `prefix_chars' to
@ref{2ed,,add_argument_group()} is now
deprecated.

@item 
The @ref{30e,,argparse.FileType} type converter is deprecated.
@end itemize

@item 
@ref{13,,builtins}:


@itemize *

@item 
Generators: @code{throw(type, exc, tb)} and @code{athrow(type, exc, tb)}
signature is deprecated: use @code{throw(exc)} and @code{athrow(exc)} instead,
the single argument signature.

@item 
Currently Python accepts numeric literals immediately followed by keywords,
for example @code{0in x}, @code{1or x}, @code{0if 1else 2}.  It allows confusing and
ambiguous expressions like @code{[0x1for x in y]} (which can be interpreted as
@code{[0x1 for x in y]} or @code{[0x1f or x in y]}).  A syntax warning is raised
if the numeric literal is immediately followed by one of keywords
@ref{347,,and}, @ref{17d,,else}, @ref{348,,for}, @ref{182,,if},
@ref{349,,in}, @ref{34a,,is} and @ref{34b,,or}.  In a future release it
will be changed to a syntax error. (gh-87999@footnote{https://github.com/python/cpython/issues/87999})

@item 
Support for @code{__index__()} and @code{__int__()} method returning non-int type:
these methods will be required to return an instance of a strict subclass of
@ref{19c,,int}.

@item 
Support for @code{__float__()} method returning a strict subclass of
@ref{197,,float}: these methods will be required to return an instance of
@code{float}.

@item 
Support for @code{__complex__()} method returning a strict subclass of
@ref{198,,complex}: these methods will be required to return an instance of
@code{complex}.

@item 
Passing a complex number as the `real' or `imag' argument in the
@ref{198,,complex()} constructor is now deprecated; it should only be passed
as a single positional argument.
(Contributed by Serhiy Storchaka in gh-109218@footnote{https://github.com/python/cpython/issues/109218}.)
@end itemize

@item 
@ref{15,,calendar}: @code{calendar.January} and @code{calendar.February} constants are
deprecated and replaced by @ref{34c,,calendar.JANUARY} and
@ref{34d,,calendar.FEBRUARY}.
(Contributed by Prince Roshan in gh-103636@footnote{https://github.com/python/cpython/issues/103636}.)

@item 
@ref{1c,,codecs}: use @ref{318,,open()} instead of @ref{317,,codecs.open()}. (gh-133038@footnote{https://github.com/python/cpython/issues/133038})

@item 
@ref{32e,,codeobject.co_lnotab}: use the @ref{34e,,codeobject.co_lines()} method
instead.

@item 
@ref{34,,datetime}:


@itemize *

@item 
@ref{34f,,utcnow()}:
use @code{datetime.datetime.now(tz=datetime.UTC)}.

@item 
@ref{350,,utcfromtimestamp()}:
use @code{datetime.datetime.fromtimestamp(timestamp, tz=datetime.UTC)}.
@end itemize

@item 
@ref{67,,gettext}: Plural value must be an integer.

@item 
@ref{7b,,importlib}:


@itemize *

@item 
@ref{351,,cache_from_source()} `debug_override' parameter is
deprecated: use the `optimization' parameter instead.
@end itemize

@item 
@ref{7e,,importlib.metadata}:


@itemize *

@item 
@code{EntryPoints} tuple interface.

@item 
Implicit @code{None} on return values.
@end itemize

@item 
@ref{8b,,logging}: the @code{warn()} method has been deprecated
since Python 3.3, use @ref{352,,warning()} instead.

@item 
@ref{8f,,mailbox}: Use of StringIO input and text mode is deprecated, use
BytesIO and binary mode instead.

@item 
@ref{a5,,os}: Calling @ref{353,,os.register_at_fork()} in multi-threaded process.

@item 
@code{pydoc.ErrorDuringImport}: A tuple value for `exc_info' parameter is
deprecated, use an exception instance.

@item 
@ref{be,,re}: More strict rules are now applied for numerical group references
and group names in regular expressions.  Only sequence of ASCII digits is now
accepted as a numerical reference.  The group name in bytes patterns and
replacement strings can now only contain ASCII letters and digits and
underscore.
(Contributed by Serhiy Storchaka in gh-91760@footnote{https://github.com/python/cpython/issues/91760}.)

@item 
@code{sre_compile}, @code{sre_constants} and @code{sre_parse} modules.

@item 
@ref{ca,,shutil}: @ref{354,,rmtree()}’s `onerror' parameter is deprecated in
Python 3.12; use the `onexc' parameter instead.

@item 
@ref{d5,,ssl} options and protocols:


@itemize *

@item 
@ref{355,,ssl.SSLContext} without protocol argument is deprecated.

@item 
@ref{355,,ssl.SSLContext}: @ref{356,,set_npn_protocols()} and
@code{selected_npn_protocol()} are deprecated: use ALPN
instead.

@item 
@code{ssl.OP_NO_SSL*} options

@item 
@code{ssl.OP_NO_TLS*} options

@item 
@code{ssl.PROTOCOL_SSLv3}

@item 
@code{ssl.PROTOCOL_TLS}

@item 
@code{ssl.PROTOCOL_TLSv1}

@item 
@code{ssl.PROTOCOL_TLSv1_1}

@item 
@code{ssl.PROTOCOL_TLSv1_2}

@item 
@code{ssl.TLSVersion.SSLv3}

@item 
@code{ssl.TLSVersion.TLSv1}

@item 
@code{ssl.TLSVersion.TLSv1_1}
@end itemize

@item 
@ref{f3,,threading} methods:


@itemize *

@item 
@code{threading.Condition.notifyAll()}: use @ref{357,,notify_all()}.

@item 
@code{threading.Event.isSet()}: use @ref{358,,is_set()}.

@item 
@code{threading.Thread.isDaemon()}, @ref{359,,threading.Thread.setDaemon()}:
use @ref{35a,,threading.Thread.daemon} attribute.

@item 
@code{threading.Thread.getName()}, @ref{35b,,threading.Thread.setName()}:
use @ref{2a2,,threading.Thread.name} attribute.

@item 
@code{threading.currentThread()}: use @ref{35c,,threading.current_thread()}.

@item 
@code{threading.activeCount()}: use @ref{35d,,threading.active_count()}.
@end itemize

@item 
@ref{35e,,typing.Text} (gh-92332@footnote{https://github.com/python/cpython/issues/92332}).

@item 
The internal class @code{typing._UnionGenericAlias} is no longer used to implement
@ref{2aa,,typing.Union}. To preserve compatibility with users using this private
class, a compatibility shim will be provided until at least Python 3.17. (Contributed by
Jelle Zijlstra in gh-105499@footnote{https://github.com/python/cpython/issues/105499}.)

@item 
@ref{35f,,unittest.IsolatedAsyncioTestCase}: it is deprecated to return a value
that is not @code{None} from a test case.

@item 
@ref{111,,urllib.parse} deprecated functions: @ref{360,,urlparse()} instead


@itemize *

@item 
@code{splitattr()}

@item 
@code{splithost()}

@item 
@code{splitnport()}

@item 
@code{splitpasswd()}

@item 
@code{splitport()}

@item 
@code{splitquery()}

@item 
@code{splittag()}

@item 
@code{splittype()}

@item 
@code{splituser()}

@item 
@code{splitvalue()}

@item 
@code{to_bytes()}
@end itemize

@item 
@ref{11f,,wsgiref}: @code{SimpleHandler.stdout.write()} should not do partial
writes.

@item 
@ref{12c,,xml.etree.ElementTree}: Testing the truth value of an
@ref{361,,Element} is deprecated. In a future release it
will always return @code{True}. Prefer explicit @code{len(elem)} or
@code{elem is not None} tests instead.

@item 
@ref{294,,sys._clear_type_cache()} is deprecated:
use @ref{362,,sys._clear_internal_caches()} instead.
@end itemize

@node CPython Bytecode Changes,C API Changes,New Deprecations,What’s New In Python 3 13
@anchor{whatsnew/3 13 cpython-bytecode-changes}@anchor{5b9}
@subsection CPython Bytecode Changes



@itemize *

@item 
The oparg of @ref{5ba,,YIELD_VALUE} is now
@code{1} if the yield is part of a yield-from or await, and @code{0} otherwise.
The oparg of @ref{5bb,,RESUME} was changed to add a bit indicating
if the except-depth is 1, which is needed to optimize closing of generators.
(Contributed by Irit Katriel in gh-111354@footnote{https://github.com/python/cpython/issues/111354}.)
@end itemize

@node C API Changes,Build Changes,CPython Bytecode Changes,What’s New In Python 3 13
@anchor{whatsnew/3 13 c-api-changes}@anchor{5bc}
@subsection C API Changes


@menu
* New Features: New Features<2>. 
* Changed C APIs:: 
* Limited C API Changes:: 
* Removed C APIs: Removed C APIs<2>. 
* Deprecated C APIs: Deprecated C APIs<2>. 

@end menu

@node New Features<2>,Changed C APIs,,C API Changes
@anchor{whatsnew/3 13 id7}@anchor{5bd}
@subsubsection New Features



@itemize *

@item 
Add the @ref{486,,PyMonitoring C API}
for generating 
@geindex Python Enhancement Proposals; PEP 669
PEP 669@footnote{https://peps.python.org/pep-0669/} monitoring events:


@itemize *

@item 
@ref{5be,,PyMonitoringState}

@item 
@ref{5bf,,PyMonitoring_FirePyStartEvent()}

@item 
@ref{5c0,,PyMonitoring_FirePyResumeEvent()}

@item 
@ref{5c1,,PyMonitoring_FirePyReturnEvent()}

@item 
@ref{5c2,,PyMonitoring_FirePyYieldEvent()}

@item 
@ref{5c3,,PyMonitoring_FireCallEvent()}

@item 
@ref{5c4,,PyMonitoring_FireLineEvent()}

@item 
@ref{5c5,,PyMonitoring_FireJumpEvent()}

@item 
@code{PyMonitoring_FireBranchEvent}

@item 
@ref{5c6,,PyMonitoring_FireCReturnEvent()}

@item 
@ref{5c7,,PyMonitoring_FirePyThrowEvent()}

@item 
@ref{5c8,,PyMonitoring_FireRaiseEvent()}

@item 
@ref{5c9,,PyMonitoring_FireCRaiseEvent()}

@item 
@ref{5ca,,PyMonitoring_FireReraiseEvent()}

@item 
@ref{5cb,,PyMonitoring_FireExceptionHandledEvent()}

@item 
@ref{5cc,,PyMonitoring_FirePyUnwindEvent()}

@item 
@ref{5cd,,PyMonitoring_FireStopIterationEvent()}

@item 
@ref{5ce,,PyMonitoring_EnterScope()}

@item 
@ref{5cf,,PyMonitoring_ExitScope()}
@end itemize

(Contributed by Irit Katriel in gh-111997@footnote{https://github.com/python/cpython/issues/111997}).

@item 
Add @ref{485,,PyMutex}, a lightweight mutex that occupies a single byte,
and the new @ref{5d0,,PyMutex_Lock()} and @ref{5d1,,PyMutex_Unlock()} functions.
@code{PyMutex_Lock()} will release the @ref{165,,GIL} (if currently held)
if the operation needs to block.
(Contributed by Sam Gross in gh-108724@footnote{https://github.com/python/cpython/issues/108724}.)

@item 
Add the @ref{5d2,,PyTime C API} to provide access to system clocks:


@itemize *

@item 
@ref{5d3,,PyTime_t}.

@item 
@ref{5d4,,PyTime_MIN} and @ref{5d5,,PyTime_MAX}.

@item 
@ref{5d6,,PyTime_AsSecondsDouble()}.

@item 
@ref{5d7,,PyTime_Monotonic()}.

@item 
@ref{5d8,,PyTime_MonotonicRaw()}.

@item 
@ref{5d9,,PyTime_PerfCounter()}.

@item 
@ref{5da,,PyTime_PerfCounterRaw()}.

@item 
@ref{5db,,PyTime_Time()}.

@item 
@ref{5dc,,PyTime_TimeRaw()}.
@end itemize

(Contributed by Victor Stinner and Petr Viktorin in gh-110850@footnote{https://github.com/python/cpython/issues/110850}.)

@item 
Add the @ref{5dd,,PyDict_ContainsString()} function
with the same behavior as @ref{5de,,PyDict_Contains()},
but `key' is specified as a const char* UTF-8 encoded bytes string,
rather than a @ref{5df,,PyObject}*.
(Contributed by Victor Stinner in gh-108314@footnote{https://github.com/python/cpython/issues/108314}.)

@item 
Add the @ref{5e0,,PyDict_GetItemRef()} and @ref{41f,,PyDict_GetItemStringRef()}
functions,
which behave similarly to @ref{5e1,,PyDict_GetItemWithError()},
but return a  @ref{5e2,,strong reference} instead of a @ref{3d5,,borrowed reference}.
Moreover, these functions return @code{-1} on error,
removing the need to check @code{PyErr_Occurred()}.
(Contributed by Victor Stinner in gh-106004@footnote{https://github.com/python/cpython/issues/106004}.)

@item 
Add the @ref{5e3,,PyDict_SetDefaultRef()} function,
which behaves similarly to @ref{5e4,,PyDict_SetDefault()},
but returns a @ref{5e2,,strong reference} instead of a @ref{3d5,,borrowed reference}.
This function returns @code{-1} on error,
@code{0} on insertion,
and @code{1} if the key was already present in the dictionary.
(Contributed by Sam Gross in gh-112066@footnote{https://github.com/python/cpython/issues/112066}.)

@item 
Add the @ref{420,,PyDict_Pop()} and @ref{5e5,,PyDict_PopString()} functions
to remove a key from a dictionary and optionally return the removed value.
This is similar to @ref{5e6,,dict.pop()},
though there is no default value,
and @ref{5e7,,KeyError} is not raised for missing keys.
(Contributed by Stefan Behnel and Victor Stinner in gh-111262@footnote{https://github.com/python/cpython/issues/111262}.)

@item 
Add the @ref{5e8,,PyMapping_GetOptionalItem()}
and @ref{5e9,,PyMapping_GetOptionalItemString()} functions
as alternatives to @ref{5ea,,PyObject_GetItem()}
and @ref{5eb,,PyMapping_GetItemString()} respectively.
The new functions do not raise @ref{5e7,,KeyError}
if the requested key is missing from the mapping.
These variants are more convenient and faster
if a missing key should not be treated as a failure.
(Contributed by Serhiy Storchaka in gh-106307@footnote{https://github.com/python/cpython/issues/106307}.)

@item 
Add the @ref{5ec,,PyObject_GetOptionalAttr()}
and @ref{5ed,,PyObject_GetOptionalAttrString()} functions
as alternatives to  @ref{5ee,,PyObject_GetAttr()}
and @ref{5ef,,PyObject_GetAttrString()} respectively.
The new functions do not raise @ref{5f0,,AttributeError}
if the requested attribute is not found on the object.
These variants are more convenient and faster
if the missing attribute should not be treated as a failure.
(Contributed by Serhiy Storchaka in gh-106521@footnote{https://github.com/python/cpython/issues/106521}.)

@item 
Add the @ref{5f1,,PyErr_FormatUnraisable()} function
as an extension to @ref{5f2,,PyErr_WriteUnraisable()}
that allows customizing the warning message.
(Contributed by Serhiy Storchaka in gh-108082@footnote{https://github.com/python/cpython/issues/108082}.)

@item 
Add new functions that return a @ref{5e2,,strong reference} instead of
a @ref{3d5,,borrowed reference} for frame locals, globals, and builtins,
as part of @ref{470,,PEP 667}:


@itemize *

@item 
@ref{5f3,,PyEval_GetFrameBuiltins()} replaces @ref{5f4,,PyEval_GetBuiltins()}

@item 
@ref{5f5,,PyEval_GetFrameGlobals()} replaces @ref{5f6,,PyEval_GetGlobals()}

@item 
@ref{5f7,,PyEval_GetFrameLocals()} replaces @ref{5f8,,PyEval_GetLocals()}
@end itemize

(Contributed by Mark Shannon and Tian Gao in gh-74929@footnote{https://github.com/python/cpython/issues/74929}.)

@item 
Add the @ref{5f9,,Py_GetConstant()} and @ref{5fa,,Py_GetConstantBorrowed()}
functions to get @ref{5e2,,strong}
or @ref{3d5,,borrowed} references to constants.
For example, @code{Py_GetConstant(Py_CONSTANT_ZERO)} returns a strong reference
to the constant zero.
(Contributed by Victor  Stinner in gh-115754@footnote{https://github.com/python/cpython/issues/115754}.)

@item 
Add the @ref{5fb,,PyImport_AddModuleRef()} function
as a replacement for @ref{5fc,,PyImport_AddModule()}
that returns a @ref{5e2,,strong reference} instead of a @ref{3d5,,borrowed reference}.
(Contributed by Victor Stinner in gh-105922@footnote{https://github.com/python/cpython/issues/105922}.)

@item 
Add the @ref{5fd,,Py_IsFinalizing()} function to check
whether the main Python interpreter is
@ref{47a,,shutting down}.
(Contributed by Victor Stinner in gh-108014@footnote{https://github.com/python/cpython/issues/108014}.)

@item 
Add the @ref{5fe,,PyList_GetItemRef()} function
as a replacement for @ref{5ff,,PyList_GetItem()}
that returns a @ref{5e2,,strong reference} instead of a @ref{3d5,,borrowed reference}.
(Contributed by Sam Gross in gh-114329@footnote{https://github.com/python/cpython/issues/114329}.)

@item 
Add the @ref{600,,PyList_Extend()} and @ref{601,,PyList_Clear()} functions,
mirroring the Python @ref{602,,list.extend()} and @ref{603,,list.clear()} methods.
(Contributed by Victor Stinner in gh-111138@footnote{https://github.com/python/cpython/issues/111138}.)

@item 
Add the @ref{604,,PyLong_AsInt()} function.
It behaves similarly to @ref{605,,PyLong_AsLong()},
but stores the result in a C int instead of a C long.
(Contributed by Victor Stinner in gh-108014@footnote{https://github.com/python/cpython/issues/108014}.)

@item 
Add the @ref{606,,PyLong_AsNativeBytes()}, @ref{607,,PyLong_FromNativeBytes()},
and @ref{608,,PyLong_FromUnsignedNativeBytes()} functions
to simplify converting between native integer types
and Python @ref{19c,,int} objects.
(Contributed by Steve Dower in gh-111140@footnote{https://github.com/python/cpython/issues/111140}.)

@item 
Add @ref{609,,PyModule_Add()} function, which is similar to
@ref{60a,,PyModule_AddObjectRef()} and @ref{60b,,PyModule_AddObject()},
but always steals a reference to the value.
(Contributed by Serhiy Storchaka in gh-86493@footnote{https://github.com/python/cpython/issues/86493}.)

@item 
Add the @ref{60c,,PyObject_GenericHash()} function
that implements the default hashing function of a Python object.
(Contributed by Serhiy Storchaka in gh-113024@footnote{https://github.com/python/cpython/issues/113024}.)

@item 
Add the @ref{423,,Py_HashPointer()} function to hash a raw pointer.
(Contributed by Victor Stinner in gh-111545@footnote{https://github.com/python/cpython/issues/111545}.)

@item 
Add the @ref{60d,,PyObject_VisitManagedDict()} and
@ref{60e,,PyObject_ClearManagedDict()} functions.
which must be called by the traverse and clear functions of a type using
the @ref{60f,,Py_TPFLAGS_MANAGED_DICT} flag.
The pythoncapi-compat project@footnote{https://github.com/python/pythoncapi-compat/} can be used to
use these functions with Python 3.11 and 3.12.
(Contributed by Victor Stinner in gh-107073@footnote{https://github.com/python/cpython/issues/107073}.)

@item 
Add the @ref{610,,PyRefTracer_SetTracer()}
and @ref{611,,PyRefTracer_GetTracer()} functions,
which enable tracking object creation and destruction
in the same way that the @ref{106,,tracemalloc} module does.
(Contributed by Pablo Galindo in gh-93502@footnote{https://github.com/python/cpython/issues/93502}.)

@item 
Add the @ref{612,,PySys_AuditTuple()} function
as an alternative to @ref{613,,PySys_Audit()}
that takes event arguments as a Python @ref{614,,tuple} object.
(Contributed by Victor Stinner in gh-85283@footnote{https://github.com/python/cpython/issues/85283}.)

@item 
Add the @ref{421,,PyThreadState_GetUnchecked()} function
as an alternative to @ref{615,,PyThreadState_Get()}
that doesn’t kill the process with a fatal error if it is @code{NULL}.
The caller is responsible for checking if the result is @code{NULL}.
(Contributed by Victor Stinner in gh-108867@footnote{https://github.com/python/cpython/issues/108867}.)

@item 
Add the @ref{616,,PyType_GetFullyQualifiedName()} function
to get the type’s fully qualified name.
The module name is prepended if @ref{617,,type.__module__} is
a string and is not equal to either @code{'builtins'} or @code{'__main__'}.
(Contributed by Victor Stinner in gh-111696@footnote{https://github.com/python/cpython/issues/111696}.)

@item 
Add the @ref{618,,PyType_GetModuleName()} function
to get the type’s module name. This is equivalent to getting the
@ref{617,,type.__module__} attribute.
(Contributed by Eric Snow and Victor Stinner in gh-111696@footnote{https://github.com/python/cpython/issues/111696}.)

@item 
Add the @ref{619,,PyUnicode_EqualToUTF8AndSize()}
and @ref{61a,,PyUnicode_EqualToUTF8()} functions
to compare a Unicode object with a const char* UTF-8 encoded string
and @code{1} if they are equal or @code{0} otherwise.
These functions do not raise exceptions.
(Contributed by Serhiy Storchaka in gh-110289@footnote{https://github.com/python/cpython/issues/110289}.)

@item 
Add the @ref{3dd,,PyWeakref_GetRef()} function
as an alternative to  @ref{3db,,PyWeakref_GetObject()}
that returns a @ref{5e2,,strong reference}
or @code{NULL} if the referent is no longer live.
(Contributed by Victor Stinner in gh-105927@footnote{https://github.com/python/cpython/issues/105927}.)

@item 
Add fixed variants of functions which silently ignore errors:


@itemize *

@item 
@ref{61b,,PyObject_HasAttrWithError()} replaces @ref{61c,,PyObject_HasAttr()}.

@item 
@ref{61d,,PyObject_HasAttrStringWithError()}
replaces @ref{61e,,PyObject_HasAttrString()}.

@item 
@ref{61f,,PyMapping_HasKeyWithError()} replaces @ref{620,,PyMapping_HasKey()}.

@item 
@ref{621,,PyMapping_HasKeyStringWithError()}
replaces @ref{622,,PyMapping_HasKeyString()}.
@end itemize

The new functions return @code{-1} for errors
and the standard @code{1} for true and @code{0} for false.

(Contributed by Serhiy Storchaka in gh-108511@footnote{https://github.com/python/cpython/issues/108511}.)
@end itemize

@node Changed C APIs,Limited C API Changes,New Features<2>,C API Changes
@anchor{whatsnew/3 13 changed-c-apis}@anchor{623}
@subsubsection Changed C APIs



@itemize *

@item 
The `keywords' parameter of @ref{624,,PyArg_ParseTupleAndKeywords()}
and @ref{625,,PyArg_VaParseTupleAndKeywords()}
now has type char *const* in C
and const char *const* in C++,
instead of char**.
In C++, this makes these functions compatible with arguments
of type const char *const*, const char**,
or char *const* without an explicit type cast.
In C, the functions only support arguments of type char *const*.
This can be overridden with the @ref{626,,PY_CXX_CONST} macro.
(Contributed by Serhiy Storchaka in gh-65210@footnote{https://github.com/python/cpython/issues/65210}.)

@item 
@ref{624,,PyArg_ParseTupleAndKeywords()} now supports
non-ASCII keyword parameter names.
(Contributed by Serhiy Storchaka in gh-110815@footnote{https://github.com/python/cpython/issues/110815}.)

@item 
The @code{PyCode_GetFirstFree()} function is now unstable API
and is now named @ref{627,,PyUnstable_Code_GetFirstFree()}.
(Contributed by Bogdan Romanyuk in gh-115781@footnote{https://github.com/python/cpython/issues/115781}.)

@item 
The @ref{628,,PyDict_GetItem()}, @ref{629,,PyDict_GetItemString()},
@ref{620,,PyMapping_HasKey()}, @ref{622,,PyMapping_HasKeyString()},
@ref{61c,,PyObject_HasAttr()}, @ref{61e,,PyObject_HasAttrString()},
and @ref{62a,,PySys_GetObject()} functions,
each of which clears all errors which occurred when calling them
now reports these errors using @ref{508,,sys.unraisablehook()}.
You may replace them with other functions as recommended in the documentation.
(Contributed by Serhiy Storchaka in gh-106672@footnote{https://github.com/python/cpython/issues/106672}.)

@item 
Add support for the @code{%T}, @code{%#T}, @code{%N} and @code{%#N} formats
to @ref{62b,,PyUnicode_FromFormat()}:


@itemize *

@item 
@code{%T}: Get the fully qualified name of an object type

@item 
@code{%#T}: As above, but use a colon as the separator

@item 
@code{%N}: Get the fully qualified name of a type

@item 
@code{%#N}: As above, but use a colon as the separator
@end itemize

See 
@geindex Python Enhancement Proposals; PEP 737
PEP 737@footnote{https://peps.python.org/pep-0737/} for more information.
(Contributed by Victor Stinner in gh-111696@footnote{https://github.com/python/cpython/issues/111696}.)

@item 
You no longer have to define the @code{PY_SSIZE_T_CLEAN} macro before
including @code{Python.h} when using @code{#} formats in
@ref{62c,,format codes}.
APIs accepting the format codes always use @code{Py_ssize_t} for @code{#} formats.
(Contributed by Inada Naoki in gh-104922@footnote{https://github.com/python/cpython/issues/104922}.)

@item 
If Python is built in @ref{50a,,debug mode}
or @ref{62d,,with assertions},
@ref{62e,,PyTuple_SET_ITEM()} and @ref{62f,,PyList_SET_ITEM()}
now check the index argument with an assertion.
(Contributed by Victor Stinner in gh-106168@footnote{https://github.com/python/cpython/issues/106168}.)
@end itemize

@node Limited C API Changes,Removed C APIs<2>,Changed C APIs,C API Changes
@anchor{whatsnew/3 13 limited-c-api-changes}@anchor{630}
@subsubsection Limited C API Changes



@itemize *

@item 
The following functions are now included in the Limited C API:


@itemize *

@item 
@ref{631,,PyMem_RawMalloc()}

@item 
@ref{632,,PyMem_RawCalloc()}

@item 
@ref{633,,PyMem_RawRealloc()}

@item 
@ref{634,,PyMem_RawFree()}

@item 
@ref{613,,PySys_Audit()}

@item 
@ref{612,,PySys_AuditTuple()}

@item 
@ref{635,,PyType_GetModuleByDef()}
@end itemize

(Contributed by Victor Stinner in gh-85283@footnote{https://github.com/python/cpython/issues/85283} and gh-116936@footnote{https://github.com/python/cpython/issues/116936}.)

@item 
Python built with @ref{636,,--with-trace-refs} (tracing references)
now supports the @ref{637,,Limited API}.
(Contributed by Victor Stinner in gh-108634@footnote{https://github.com/python/cpython/issues/108634}.)
@end itemize

@node Removed C APIs<2>,Deprecated C APIs<2>,Limited C API Changes,C API Changes
@anchor{whatsnew/3 13 removed-c-apis}@anchor{638}
@subsubsection Removed C APIs



@itemize *

@item 
Remove several functions, macros, variables, etc
with names prefixed by @code{_Py} or @code{_PY} (which are considered private).
If your project is affected  by one of these removals
and you believe that the removed API should remain available,
please @ref{557,,open a new issue} to request a public C API
and add @code{cc: @@vstinner} to the issue to notify Victor Stinner.
(Contributed by Victor Stinner in gh-106320@footnote{https://github.com/python/cpython/issues/106320}.)

@item 
Remove old buffer protocols deprecated in Python 3.0.
Use @ref{262,,Buffer Protocol} instead.


@itemize *

@item 
@code{PyObject_CheckReadBuffer()}:
Use @ref{639,,PyObject_CheckBuffer()} to test
whether the object supports the buffer protocol.
Note that @code{PyObject_CheckBuffer()} doesn’t guarantee
that @ref{63a,,PyObject_GetBuffer()} will succeed.
To test if the object is actually readable,
see the next example of @code{PyObject_GetBuffer()}.

@item 
@code{PyObject_AsCharBuffer()}, @code{PyObject_AsReadBuffer()}:
Use @ref{63a,,PyObject_GetBuffer()} and @ref{63b,,PyBuffer_Release()} instead:

@example
Py_buffer view;
if (PyObject_GetBuffer(obj, &view, PyBUF_SIMPLE) < 0) @{
    return NULL;
@}
// Use `view.buf` and `view.len` to read from the buffer.
// You may need to cast buf as `(const char*)view.buf`.
PyBuffer_Release(&view);
@end example

@item 
@code{PyObject_AsWriteBuffer()}:
Use @ref{63a,,PyObject_GetBuffer()} and @ref{63b,,PyBuffer_Release()} instead:

@example
Py_buffer view;
if (PyObject_GetBuffer(obj, &view, PyBUF_WRITABLE) < 0) @{
    return NULL;
@}
// Use `view.buf` and `view.len` to write to the buffer.
PyBuffer_Release(&view);
@end example
@end itemize

(Contributed by Inada Naoki in gh-85275@footnote{https://github.com/python/cpython/issues/85275}.)

@item 
Remove various functions deprecated in Python 3.9:


@itemize *

@item 
@code{PyEval_CallObject()}, @code{PyEval_CallObjectWithKeywords()}:
Use @ref{63c,,PyObject_CallNoArgs()} or @ref{63d,,PyObject_Call()} instead.

@cartouche
@quotation Warning 
In @ref{63d,,PyObject_Call()}, positional arguments must be a @ref{614,,tuple}
and must not be @code{NULL},
and keyword arguments must be a @ref{184,,dict} or @code{NULL},
whereas the removed functions checked argument types
and accepted @code{NULL} positional and keyword arguments.
To replace @code{PyEval_CallObjectWithKeywords(func, NULL, kwargs)} with
@code{PyObject_Call()},
pass an empty tuple as positional arguments using
@ref{63e,,PyTuple_New(0)}.
@end quotation
@end cartouche

@item 
@code{PyEval_CallFunction()}:
Use @ref{63f,,PyObject_CallFunction()} instead.

@item 
@code{PyEval_CallMethod()}:
Use @ref{640,,PyObject_CallMethod()} instead.

@item 
@code{PyCFunction_Call()}:
Use @ref{63d,,PyObject_Call()} instead.
@end itemize

(Contributed by Victor Stinner in gh-105107@footnote{https://github.com/python/cpython/issues/105107}.)

@item 
Remove the following old functions to configure the Python initialization,
deprecated in Python 3.11:


@itemize *

@item 
@code{PySys_AddWarnOptionUnicode()}:
Use @ref{641,,PyConfig.warnoptions} instead.

@item 
@code{PySys_AddWarnOption()}:
Use @ref{641,,PyConfig.warnoptions} instead.

@item 
@code{PySys_AddXOption()}:
Use @ref{642,,PyConfig.xoptions} instead.

@item 
@code{PySys_HasWarnOptions()}:
Use @ref{642,,PyConfig.xoptions} instead.

@item 
@code{PySys_SetPath()}:
Set @ref{643,,PyConfig.module_search_paths} instead.

@item 
@code{Py_SetPath()}:
Set @ref{643,,PyConfig.module_search_paths} instead.

@item 
@code{Py_SetStandardStreamEncoding()}:
Set @ref{644,,PyConfig.stdio_encoding} instead,
and set also maybe @ref{418,,PyConfig.legacy_windows_stdio} (on Windows).

@item 
@code{_Py_SetProgramFullPath()}:
Set @ref{645,,PyConfig.executable} instead.
@end itemize

Use the new @ref{3f5,,PyConfig} API of the @ref{646,,Python Initialization Configuration} instead (
@geindex Python Enhancement Proposals; PEP 587
PEP 587@footnote{https://peps.python.org/pep-0587/}), added to Python 3.8.
(Contributed by Victor Stinner in gh-105145@footnote{https://github.com/python/cpython/issues/105145}.)

@item 
Remove @code{PyEval_AcquireLock()} and @code{PyEval_ReleaseLock()} functions,
deprecated in Python 3.2.
They didn’t update the current thread state.
They can be replaced with:


@itemize *

@item 
@ref{647,,PyEval_SaveThread()} and @ref{648,,PyEval_RestoreThread()};

@item 
low-level @ref{649,,PyEval_AcquireThread()} and @ref{648,,PyEval_RestoreThread()};

@item 
or @ref{64a,,PyGILState_Ensure()} and @ref{64b,,PyGILState_Release()}.
@end itemize

(Contributed by Victor Stinner in gh-105182@footnote{https://github.com/python/cpython/issues/105182}.)

@item 
Remove the @code{PyEval_ThreadsInitialized()} function,
deprecated in Python 3.9.
Since Python 3.7, @code{Py_Initialize()} always creates the GIL:
calling @code{PyEval_InitThreads()} does nothing and
@code{PyEval_ThreadsInitialized()} always returns non-zero.
(Contributed by Victor Stinner in gh-105182@footnote{https://github.com/python/cpython/issues/105182}.)

@item 
Remove the @code{_PyInterpreterState_Get()} alias to
@ref{64c,,PyInterpreterState_Get()}
which was kept for backward compatibility with Python 3.8.
The pythoncapi-compat project@footnote{https://github.com/python/pythoncapi-compat/} can be used to get
@code{PyInterpreterState_Get()} on Python 3.8 and older.
(Contributed by Victor Stinner in gh-106320@footnote{https://github.com/python/cpython/issues/106320}.)

@item 
Remove the private @code{_PyObject_FastCall()} function:
use @code{PyObject_Vectorcall()} which is available since Python 3.8
(
@geindex Python Enhancement Proposals; PEP 590
PEP 590@footnote{https://peps.python.org/pep-0590/}).
(Contributed by Victor Stinner in gh-106023@footnote{https://github.com/python/cpython/issues/106023}.)

@item 
Remove the @code{cpython/pytime.h} header file,
which only contained private functions.
(Contributed by Victor Stinner in gh-106316@footnote{https://github.com/python/cpython/issues/106316}.)

@item 
Remove the undocumented @code{PY_TIMEOUT_MAX} constant from the limited C API.
(Contributed by Victor Stinner in gh-110014@footnote{https://github.com/python/cpython/issues/110014}.)

@item 
Remove the old trashcan macros @code{Py_TRASHCAN_SAFE_BEGIN}
and @code{Py_TRASHCAN_SAFE_END}.
Replace both with the new macros @code{Py_TRASHCAN_BEGIN}
and @code{Py_TRASHCAN_END}.
(Contributed by Irit Katriel in gh-105111@footnote{https://github.com/python/cpython/issues/105111}.)
@end itemize

@node Deprecated C APIs<2>,,Removed C APIs<2>,C API Changes
@anchor{whatsnew/3 13 deprecated-c-apis}@anchor{64d}
@subsubsection Deprecated C APIs



@itemize *

@item 
Deprecate old Python initialization functions:


@itemize *

@item 
@ref{3f2,,PySys_ResetWarnOptions()}:
Clear @ref{3f3,,sys.warnoptions} and @code{warnings.filters} instead.

@item 
@ref{3e7,,Py_GetExecPrefix()}:
Get @ref{3e9,,sys.exec_prefix} instead.

@item 
@ref{3e1,,Py_GetPath()}:
Get @ref{3e2,,sys.path} instead.

@item 
@ref{3e3,,Py_GetPrefix()}:
Get @ref{3e5,,sys.prefix} instead.

@item 
@ref{3ea,,Py_GetProgramFullPath()}:
Get @ref{3eb,,sys.executable} instead.

@item 
@ref{3ec,,Py_GetProgramName()}:
Get @ref{3eb,,sys.executable} instead.

@item 
@ref{3ed,,Py_GetPythonHome()}:
Get @ref{3f1,,PyConfig.home}
or the 
@geindex PYTHONHOME
@geindex environment variable; PYTHONHOME
@ref{3ee,,PYTHONHOME} environment variable instead.
@end itemize

(Contributed by Victor Stinner in gh-105145@footnote{https://github.com/python/cpython/issues/105145}.)

@item 
@ref{23f,,Soft deprecate} the
@ref{5f4,,PyEval_GetBuiltins()}, @ref{5f6,,PyEval_GetGlobals()},
and @ref{5f8,,PyEval_GetLocals()} functions,
which return a @ref{3d5,,borrowed reference}.
(Soft deprecated as part of 
@geindex Python Enhancement Proposals; PEP 667
PEP 667@footnote{https://peps.python.org/pep-0667/}.)

@item 
Deprecate the @ref{3d9,,PyImport_ImportModuleNoBlock()} function,
which is just an alias to @ref{3da,,PyImport_ImportModule()} since Python 3.3.
(Contributed by Victor Stinner in gh-105396@footnote{https://github.com/python/cpython/issues/105396}.)

@item 
@ref{23f,,Soft deprecate} the
@ref{60b,,PyModule_AddObject()} function.
It should be replaced with @ref{609,,PyModule_Add()}
or @ref{60a,,PyModule_AddObjectRef()}.
(Contributed by Serhiy Storchaka in gh-86493@footnote{https://github.com/python/cpython/issues/86493}.)

@item 
Deprecate the old @code{Py_UNICODE} and @code{PY_UNICODE_TYPE} types
and the @code{Py_UNICODE_WIDE} define.
Use the @code{wchar_t} type directly instead.
Since Python 3.3, @code{Py_UNICODE} and @code{PY_UNICODE_TYPE}
are just aliases to @code{wchar_t}.
(Contributed by Victor Stinner in gh-105156@footnote{https://github.com/python/cpython/issues/105156}.)

@item 
Deprecate the @ref{3db,,PyWeakref_GetObject()} and
@ref{3dc,,PyWeakref_GET_OBJECT()} functions,
which return a @ref{3d5,,borrowed reference}.
Replace them with the new @ref{3dd,,PyWeakref_GetRef()} function,
which returns a @ref{5e2,,strong reference}.
The pythoncapi-compat project@footnote{https://github.com/python/pythoncapi-compat/} can be used to get
@code{PyWeakref_GetRef()} on Python 3.12 and older.
(Contributed by Victor Stinner in gh-105927@footnote{https://github.com/python/cpython/issues/105927}.)
@end itemize

@c Add deprecations above alphabetically, not here at the end.

@menu
* Pending removal in Python 3.14: Pending removal in Python 3 14<2>. 
* Pending removal in Python 3.15: Pending removal in Python 3 15<4>. 
* Pending removal in Python 3.16: Pending removal in Python 3 16<4>. 
* Pending removal in Python 3.18: Pending removal in Python 3 18<4>. 
* Pending removal in future versions: Pending removal in future versions<4>. 

@end menu

@node Pending removal in Python 3 14<2>,Pending removal in Python 3 15<4>,,Deprecated C APIs<2>
@anchor{whatsnew/3 13 id8}@anchor{64e}
@subsubsection Pending removal in Python 3.14



@itemize *

@item 
The @code{ma_version_tag} field in @ref{64f,,PyDictObject} for extension modules
(
@geindex Python Enhancement Proposals; PEP 699
PEP 699@footnote{https://peps.python.org/pep-0699/}; gh-101193@footnote{https://github.com/python/cpython/issues/101193}).

@item 
Creating @ref{3cd,,immutable types} with mutable
bases (gh-95388@footnote{https://github.com/python/cpython/issues/95388}).
@end itemize

@node Pending removal in Python 3 15<4>,Pending removal in Python 3 16<4>,Pending removal in Python 3 14<2>,Deprecated C APIs<2>
@anchor{whatsnew/3 13 id9}@anchor{650}
@subsubsection Pending removal in Python 3.15



@itemize *

@item 
The @ref{3d9,,PyImport_ImportModuleNoBlock()}:
Use @ref{3da,,PyImport_ImportModule()} instead.

@item 
@ref{3db,,PyWeakref_GetObject()} and @ref{3dc,,PyWeakref_GET_OBJECT()}:
Use @ref{3dd,,PyWeakref_GetRef()} instead. The pythoncapi-compat project@footnote{https://github.com/python/pythoncapi-compat/} can be used to get
@code{PyWeakref_GetRef()} on Python 3.12 and older.

@item 
@ref{3de,,Py_UNICODE} type and the @code{Py_UNICODE_WIDE} macro:
Use @code{wchar_t} instead.

@item 
@code{PyUnicode_AsDecodedObject()}:
Use @ref{3df,,PyCodec_Decode()} instead.

@item 
@code{PyUnicode_AsDecodedUnicode()}:
Use @ref{3df,,PyCodec_Decode()} instead; Note that some codecs (for example, “base64”)
may return a type other than @ref{16a,,str}, such as @ref{193,,bytes}.

@item 
@code{PyUnicode_AsEncodedObject()}:
Use @ref{3e0,,PyCodec_Encode()} instead.

@item 
@code{PyUnicode_AsEncodedUnicode()}:
Use @ref{3e0,,PyCodec_Encode()} instead; Note that some codecs (for example, “base64”)
may return a type other than @ref{193,,bytes}, such as @ref{16a,,str}.

@item 
Python initialization functions, deprecated in Python 3.13:


@itemize *

@item 
@ref{3e1,,Py_GetPath()}:
Use @ref{37a,,PyConfig_Get("module_search_paths")}
(@ref{3e2,,sys.path}) instead.

@item 
@ref{3e3,,Py_GetPrefix()}:
Use @ref{37a,,PyConfig_Get("base_prefix")}
(@ref{3e4,,sys.base_prefix}) instead. Use @code{PyConfig_Get("prefix")} (@ref{3e5,,sys.prefix}) if @ref{3e6,,virtual environments} need to be handled.

@item 
@ref{3e7,,Py_GetExecPrefix()}:
Use @ref{37a,,PyConfig_Get("base_exec_prefix")}
(@ref{3e8,,sys.base_exec_prefix}) instead. Use
@code{PyConfig_Get("exec_prefix")}
(@ref{3e9,,sys.exec_prefix}) if @ref{3e6,,virtual environments} need to
be handled.

@item 
@ref{3ea,,Py_GetProgramFullPath()}:
Use @ref{37a,,PyConfig_Get("executable")}
(@ref{3eb,,sys.executable}) instead.

@item 
@ref{3ec,,Py_GetProgramName()}:
Use @ref{37a,,PyConfig_Get("executable")}
(@ref{3eb,,sys.executable}) instead.

@item 
@ref{3ed,,Py_GetPythonHome()}:
Use @ref{37a,,PyConfig_Get("home")} or the
@geindex PYTHONHOME
@geindex environment variable; PYTHONHOME
@ref{3ee,,PYTHONHOME} environment variable instead.
@end itemize

The pythoncapi-compat project@footnote{https://github.com/python/pythoncapi-compat/} can be used to get
@ref{37a,,PyConfig_Get()} on Python 3.13 and older.

@item 
Functions to configure Python’s initialization, deprecated in Python 3.11:


@itemize *

@item 
@code{PySys_SetArgvEx()}:
Set @ref{3ef,,PyConfig.argv} instead.

@item 
@code{PySys_SetArgv()}:
Set @ref{3ef,,PyConfig.argv} instead.

@item 
@code{Py_SetProgramName()}:
Set @ref{3f0,,PyConfig.program_name} instead.

@item 
@code{Py_SetPythonHome()}:
Set @ref{3f1,,PyConfig.home} instead.

@item 
@ref{3f2,,PySys_ResetWarnOptions()}:
Clear @ref{3f3,,sys.warnoptions} and @code{warnings.filters} instead.
@end itemize

The @ref{3f4,,Py_InitializeFromConfig()} API should be used with
@ref{3f5,,PyConfig} instead.

@item 
Global configuration variables:


@itemize *

@item 
@ref{3f6,,Py_DebugFlag}:
Use @ref{3f7,,PyConfig.parser_debug} or
@ref{37a,,PyConfig_Get("parser_debug")} instead.

@item 
@ref{3f8,,Py_VerboseFlag}:
Use @ref{3f9,,PyConfig.verbose} or
@ref{37a,,PyConfig_Get("verbose")} instead.

@item 
@ref{3fa,,Py_QuietFlag}:
Use @ref{3fb,,PyConfig.quiet} or
@ref{37a,,PyConfig_Get("quiet")} instead.

@item 
@ref{3fc,,Py_InteractiveFlag}:
Use @ref{3fd,,PyConfig.interactive} or
@ref{37a,,PyConfig_Get("interactive")} instead.

@item 
@ref{3fe,,Py_InspectFlag}:
Use @ref{3ff,,PyConfig.inspect} or
@ref{37a,,PyConfig_Get("inspect")} instead.

@item 
@ref{400,,Py_OptimizeFlag}:
Use @ref{401,,PyConfig.optimization_level} or
@ref{37a,,PyConfig_Get("optimization_level")} instead.

@item 
@ref{402,,Py_NoSiteFlag}:
Use @ref{403,,PyConfig.site_import} or
@ref{37a,,PyConfig_Get("site_import")} instead.

@item 
@ref{404,,Py_BytesWarningFlag}:
Use @ref{405,,PyConfig.bytes_warning} or
@ref{37a,,PyConfig_Get("bytes_warning")} instead.

@item 
@ref{406,,Py_FrozenFlag}:
Use @ref{407,,PyConfig.pathconfig_warnings} or
@ref{37a,,PyConfig_Get("pathconfig_warnings")} instead.

@item 
@ref{408,,Py_IgnoreEnvironmentFlag}:
Use @ref{409,,PyConfig.use_environment} or
@ref{37a,,PyConfig_Get("use_environment")} instead.

@item 
@ref{40a,,Py_DontWriteBytecodeFlag}:
Use @ref{40b,,PyConfig.write_bytecode} or
@ref{37a,,PyConfig_Get("write_bytecode")} instead.

@item 
@ref{40c,,Py_NoUserSiteDirectory}:
Use @ref{40d,,PyConfig.user_site_directory} or
@ref{37a,,PyConfig_Get("user_site_directory")} instead.

@item 
@ref{40e,,Py_UnbufferedStdioFlag}:
Use @ref{40f,,PyConfig.buffered_stdio} or
@ref{37a,,PyConfig_Get("buffered_stdio")} instead.

@item 
@ref{410,,Py_HashRandomizationFlag}:
Use @ref{411,,PyConfig.use_hash_seed}
and @ref{412,,PyConfig.hash_seed} or
@ref{37a,,PyConfig_Get("hash_seed")} instead.

@item 
@ref{413,,Py_IsolatedFlag}:
Use @ref{414,,PyConfig.isolated} or
@ref{37a,,PyConfig_Get("isolated")} instead.

@item 
@ref{415,,Py_LegacyWindowsFSEncodingFlag}:
Use @ref{416,,PyPreConfig.legacy_windows_fs_encoding} or
@ref{37a,,PyConfig_Get("legacy_windows_fs_encoding")} instead.

@item 
@ref{417,,Py_LegacyWindowsStdioFlag}:
Use @ref{418,,PyConfig.legacy_windows_stdio} or
@ref{37a,,PyConfig_Get("legacy_windows_stdio")} instead.

@item 
@code{Py_FileSystemDefaultEncoding}, @code{Py_HasFileSystemDefaultEncoding}:
Use @ref{419,,PyConfig.filesystem_encoding} or
@ref{37a,,PyConfig_Get("filesystem_encoding")} instead.

@item 
@code{Py_FileSystemDefaultEncodeErrors}:
Use @ref{41a,,PyConfig.filesystem_errors} or
@ref{37a,,PyConfig_Get("filesystem_errors")} instead.

@item 
@code{Py_UTF8Mode}:
Use @ref{41b,,PyPreConfig.utf8_mode} or
@ref{37a,,PyConfig_Get("utf8_mode")} instead.
(see @ref{41c,,Py_PreInitialize()})
@end itemize

The @ref{3f4,,Py_InitializeFromConfig()} API should be used with
@ref{3f5,,PyConfig} to set these options. Or @ref{37a,,PyConfig_Get()} can be
used to get these options at runtime.
@end itemize

@node Pending removal in Python 3 16<4>,Pending removal in Python 3 18<4>,Pending removal in Python 3 15<4>,Deprecated C APIs<2>
@anchor{whatsnew/3 13 id10}@anchor{651}
@subsubsection Pending removal in Python 3.16



@itemize *

@item 
The bundled copy of @code{libmpdec}.
@end itemize

@node Pending removal in Python 3 18<4>,Pending removal in future versions<4>,Pending removal in Python 3 16<4>,Deprecated C APIs<2>
@anchor{whatsnew/3 13 id11}@anchor{652}
@subsubsection Pending removal in Python 3.18



@itemize *

@item 
The following private functions are deprecated
and planned for removal in Python 3.18:


@itemize *

@item 
@code{_PyBytes_Join()}: use @ref{381,,PyBytes_Join()}.

@item 
@code{_PyDict_GetItemStringWithError()}: use @ref{41f,,PyDict_GetItemStringRef()}.

@item 
@code{_PyDict_Pop()}: use @ref{420,,PyDict_Pop()}.

@item 
@code{_PyLong_Sign()}: use @ref{398,,PyLong_GetSign()}.

@item 
@code{_PyLong_FromDigits()} and @code{_PyLong_New()}:
use @ref{3a8,,PyLongWriter_Create()}.

@item 
@code{_PyThreadState_UncheckedGet()}: use @ref{421,,PyThreadState_GetUnchecked()}.

@item 
@code{_PyUnicode_AsString()}: use @ref{422,,PyUnicode_AsUTF8()}.

@item 
@code{_PyUnicodeWriter_Init()}:
replace @code{_PyUnicodeWriter_Init(&writer)} with
@ref{3b2,,writer = PyUnicodeWriter_Create(0)}.

@item 
@code{_PyUnicodeWriter_Finish()}:
replace @code{_PyUnicodeWriter_Finish(&writer)} with
@ref{3b5,,PyUnicodeWriter_Finish(writer)}.

@item 
@code{_PyUnicodeWriter_Dealloc()}:
replace @code{_PyUnicodeWriter_Dealloc(&writer)} with
@ref{3b4,,PyUnicodeWriter_Discard(writer)}.

@item 
@code{_PyUnicodeWriter_WriteChar()}:
replace @code{_PyUnicodeWriter_WriteChar(&writer, ch)} with
@ref{3b8,,PyUnicodeWriter_WriteChar(writer@comma{} ch)}.

@item 
@code{_PyUnicodeWriter_WriteStr()}:
replace @code{_PyUnicodeWriter_WriteStr(&writer, str)} with
@ref{3ba,,PyUnicodeWriter_WriteStr(writer@comma{} str)}.

@item 
@code{_PyUnicodeWriter_WriteSubstring()}:
replace @code{_PyUnicodeWriter_WriteSubstring(&writer, str, start, end)} with
@ref{3bb,,PyUnicodeWriter_WriteSubstring(writer@comma{} str@comma{} start@comma{} end)}.

@item 
@code{_PyUnicodeWriter_WriteASCIIString()}:
replace @code{_PyUnicodeWriter_WriteASCIIString(&writer, str)} with
@ref{3b7,,PyUnicodeWriter_WriteASCII(writer@comma{} str)}.

@item 
@code{_PyUnicodeWriter_WriteLatin1String()}:
replace @code{_PyUnicodeWriter_WriteLatin1String(&writer, str)} with
@ref{3bd,,PyUnicodeWriter_WriteUTF8(writer@comma{} str)}.

@item 
@code{_PyUnicodeWriter_Prepare()}: (no replacement).

@item 
@code{_PyUnicodeWriter_PrepareKind()}: (no replacement).

@item 
@code{_Py_HashPointer()}: use @ref{423,,Py_HashPointer()}.

@item 
@code{_Py_fopen_obj()}: use @ref{391,,Py_fopen()}.
@end itemize

The pythoncapi-compat project@footnote{https://github.com/python/pythoncapi-compat/} can be used to get
these new public functions on Python 3.13 and older.
(Contributed by Victor Stinner in gh-128863@footnote{https://github.com/python/cpython/issues/128863}.)
@end itemize

@node Pending removal in future versions<4>,,Pending removal in Python 3 18<4>,Deprecated C APIs<2>
@anchor{whatsnew/3 13 id12}@anchor{653}
@subsubsection Pending removal in future versions


The following APIs are deprecated and will be removed,
although there is currently no date scheduled for their removal.


@itemize *

@item 
@ref{425,,Py_TPFLAGS_HAVE_FINALIZE}:
Unneeded since Python 3.8.

@item 
@ref{426,,PyErr_Fetch()}:
Use @ref{427,,PyErr_GetRaisedException()} instead.

@item 
@ref{428,,PyErr_NormalizeException()}:
Use @ref{427,,PyErr_GetRaisedException()} instead.

@item 
@ref{429,,PyErr_Restore()}:
Use @ref{42a,,PyErr_SetRaisedException()} instead.

@item 
@ref{42b,,PyModule_GetFilename()}:
Use @ref{42c,,PyModule_GetFilenameObject()} instead.

@item 
@ref{42d,,PyOS_AfterFork()}:
Use @ref{42e,,PyOS_AfterFork_Child()} instead.

@item 
@ref{42f,,PySlice_GetIndicesEx()}:
Use @ref{430,,PySlice_Unpack()} and @ref{431,,PySlice_AdjustIndices()} instead.

@item 
@ref{432,,PyUnicode_READY()}:
Unneeded since Python 3.12

@item 
@code{PyErr_Display()}:
Use @ref{433,,PyErr_DisplayException()} instead.

@item 
@code{_PyErr_ChainExceptions()}:
Use @code{_PyErr_ChainExceptions1()} instead.

@item 
@code{PyBytesObject.ob_shash} member:
call @ref{434,,PyObject_Hash()} instead.

@item 
Thread Local Storage (TLS) API:


@itemize *

@item 
@ref{435,,PyThread_create_key()}:
Use @ref{436,,PyThread_tss_alloc()} instead.

@item 
@ref{437,,PyThread_delete_key()}:
Use @ref{438,,PyThread_tss_free()} instead.

@item 
@ref{439,,PyThread_set_key_value()}:
Use @ref{43a,,PyThread_tss_set()} instead.

@item 
@ref{43b,,PyThread_get_key_value()}:
Use @ref{43c,,PyThread_tss_get()} instead.

@item 
@ref{43d,,PyThread_delete_key_value()}:
Use @ref{43e,,PyThread_tss_delete()} instead.

@item 
@ref{43f,,PyThread_ReInitTLS()}:
Unneeded since Python 3.7.
@end itemize
@end itemize

@node Build Changes,Porting to Python 3 13,C API Changes,What’s New In Python 3 13
@anchor{whatsnew/3 13 build-changes}@anchor{654}@anchor{whatsnew/3 13 pythoncapi-compat-project}@anchor{655}
@subsection Build Changes



@itemize *

@item 
@code{arm64-apple-ios} and @code{arm64-apple-ios-simulator} are both
now 
@geindex Python Enhancement Proposals; PEP 11
PEP 11@footnote{https://peps.python.org/pep-0011/} tier 3 platforms.
(@ref{48e,,PEP 730} written
and implementation contributed by Russell Keith-Magee in gh-114099@footnote{https://github.com/python/cpython/issues/114099}.)

@item 
@code{aarch64-linux-android} and @code{x86_64-linux-android} are both
now 
@geindex Python Enhancement Proposals; PEP 11
PEP 11@footnote{https://peps.python.org/pep-0011/} tier 3 platforms.
(@ref{48e,,PEP 738} written
and implementation contributed by Malcolm Smith in gh-116622@footnote{https://github.com/python/cpython/issues/116622}.)

@item 
@code{wasm32-wasi} is now a 
@geindex Python Enhancement Proposals; PEP 11
PEP 11@footnote{https://peps.python.org/pep-0011/} tier 2 platform.
(Contributed by Brett Cannon in gh-115192@footnote{https://github.com/python/cpython/issues/115192}.)

@item 
@code{wasm32-emscripten} is no longer a 
@geindex Python Enhancement Proposals; PEP 11
PEP 11@footnote{https://peps.python.org/pep-0011/} supported platform.
(Contributed by Brett Cannon in gh-115192@footnote{https://github.com/python/cpython/issues/115192}.)

@item 
Building CPython now requires a compiler with support for the C11 atomic
library, GCC built-in atomic functions, or MSVC interlocked intrinsics.

@item 
Autoconf 2.71 and aclocal 1.16.5 are now required to regenerate
the @code{configure} script.
(Contributed by Christian Heimes in gh-89886@footnote{https://github.com/python/cpython/issues/89886} and by Victor Stinner in gh-112090@footnote{https://github.com/python/cpython/issues/112090}.)

@item 
SQLite 3.15.2 or newer is required to build
the @ref{d4,,sqlite3} extension module.
(Contributed by Erlend Aasland in gh-105875@footnote{https://github.com/python/cpython/issues/105875}.)

@item 
CPython now bundles the mimalloc library@footnote{https://github.com/microsoft/mimalloc/} by default.
It is licensed under the MIT license;
see @ref{656,,mimalloc license}.
The bundled mimalloc has custom changes, see gh-113141@footnote{https://github.com/python/cpython/issues/113141} for details.
(Contributed by Dino Viehland in gh-109914@footnote{https://github.com/python/cpython/issues/109914}.)

@item 
The @code{configure} option @ref{657,,--with-system-libmpdec}
now defaults to @code{yes}.
The bundled copy of @code{libmpdec} will be removed in Python 3.16.

@item 
Python built with @code{configure} @ref{636,,--with-trace-refs}
(tracing references) is now ABI compatible with the Python release build
and @ref{50a,,debug build}.
(Contributed by Victor Stinner in gh-108634@footnote{https://github.com/python/cpython/issues/108634}.)

@item 
On POSIX systems, the pkg-config (@code{.pc}) filenames now include the ABI
flags.  For example, the free-threaded build generates @code{python-3.13t.pc}
and the debug build generates @code{python-3.13d.pc}.

@item 
The @code{errno}, @code{fcntl}, @code{grp}, @code{md5}, @code{pwd}, @code{resource},
@code{termios}, @code{winsound},
@code{_ctypes_test}, @code{_multiprocessing.posixshmem}, @code{_scproxy}, @code{_stat},
@code{_statistics}, @code{_testconsole}, @code{_testimportmultiple} and @code{_uuid}
C extensions are now built with the @ref{637,,limited C API}.
(Contributed by Victor Stinner in gh-85283@footnote{https://github.com/python/cpython/issues/85283}.)
@end itemize

@node Porting to Python 3 13,Regression Test Changes,Build Changes,What’s New In Python 3 13
@anchor{whatsnew/3 13 porting-to-python-3-13}@anchor{472}
@subsection Porting to Python 3.13


This section lists previously described changes and other bugfixes
that may require changes to your code.

@menu
* Changes in the Python API: Changes in the Python API<2>. 
* Changes in the C API: Changes in the C API<2>. 

@end menu

@node Changes in the Python API<2>,Changes in the C API<2>,,Porting to Python 3 13
@anchor{whatsnew/3 13 changes-in-the-python-api}@anchor{658}
@subsubsection Changes in the Python API

@anchor{whatsnew/3 13 pep667-porting-notes-py}@anchor{4a7}

@itemize *

@item 
@ref{470,,PEP 667} introduces several changes
to the semantics of @ref{46f,,locals()} and @ref{4a6,,f_locals}:


@itemize *

@item 
Calling @ref{46f,,locals()} in an @ref{4a2,,optimized scope} now produces an
independent snapshot on each call, and hence no longer implicitly updates
previously returned references. Obtaining the legacy CPython behavior now
requires explicit calls to update the initially returned dictionary with the
results of subsequent calls to @code{locals()}. Code execution functions that
implicitly target @code{locals()} (such as @code{exec} and @code{eval}) must be
passed an explicit namespace to access their results in an optimized scope.
(Changed as part of 
@geindex Python Enhancement Proposals; PEP 667
PEP 667@footnote{https://peps.python.org/pep-0667/}.)

@item 
Calling @ref{46f,,locals()} from a comprehension at module or class scope
(including via @code{exec} or @code{eval}) once more behaves as if the comprehension
were running as an independent nested function (i.e. the local variables from
the containing scope are not included). In Python 3.12, this had changed
to include the local variables from the containing scope when implementing
@geindex Python Enhancement Proposals; PEP 709
PEP 709@footnote{https://peps.python.org/pep-0709/}. (Changed as part of 
@geindex Python Enhancement Proposals; PEP 667
PEP 667@footnote{https://peps.python.org/pep-0667/}.)

@item 
Accessing @ref{4a6,,FrameType.f_locals} in an
@ref{4a2,,optimized scope} now returns a write-through proxy rather than a
snapshot that gets updated at ill-specified times. If a snapshot is desired,
it must be created explicitly with @code{dict} or the proxy’s @code{.copy()} method.
(Changed as part of 
@geindex Python Enhancement Proposals; PEP 667
PEP 667@footnote{https://peps.python.org/pep-0667/}.)
@end itemize

@item 
@ref{219,,functools.partial} now emits a @ref{659,,FutureWarning}
when used as a method.
The behavior will change in future Python versions.
Wrap it in @ref{451,,staticmethod()} if you want to preserve the old behavior.
(Contributed by Serhiy Storchaka in gh-121027@footnote{https://github.com/python/cpython/issues/121027}.)

@item 
An @ref{2c2,,OSError} is now raised by @ref{65a,,getpass.getuser()}
for any failure to retrieve a username,
instead of @ref{65b,,ImportError} on non-Unix platforms
or @ref{5e7,,KeyError} on Unix platforms where the password database is empty.

@item 
The value of the @code{mode} attribute of @ref{65c,,gzip.GzipFile}
is now a string (@code{'rb'} or @code{'wb'}) instead of an integer (@code{1} or @code{2}).
The value of the @code{mode} attribute of the readable file-like object
returned by @ref{65d,,zipfile.ZipFile.open()} is now @code{'rb'} instead of @code{'r'}.
(Contributed by Serhiy Storchaka in gh-115961@footnote{https://github.com/python/cpython/issues/115961}.)

@item 
@ref{65e,,mailbox.Maildir} now ignores files with a leading dot (@code{.}).
(Contributed by Zackery Spytz in gh-65559@footnote{https://github.com/python/cpython/issues/65559}.)

@item 
@ref{538,,pathlib.Path.glob()} and @ref{539,,rglob()} now return both
files and directories if a pattern that ends with “@code{**}” is given,
rather than directories only.
Add a trailing slash to keep the previous behavior and only match directories.

@item 
The @ref{f3,,threading} module now expects the @code{_thread} module
to have an @code{_is_main_interpreter()} function.
This function takes no arguments and returns @code{True}
if the current interpreter is the main interpreter.

Any library or application that provides a custom @code{_thread} module
must provide @code{_is_main_interpreter()},
just like the module’s other “private” attributes.
(gh-112826@footnote{https://github.com/python/cpython/issues/112826}.)
@end itemize

@node Changes in the C API<2>,,Changes in the Python API<2>,Porting to Python 3 13
@anchor{whatsnew/3 13 changes-in-the-c-api}@anchor{65f}
@subsubsection Changes in the C API



@itemize *

@item 
@code{Python.h} no longer includes the @code{<ieeefp.h>} standard header. It was
included for the @code{finite()} function which is now provided by the
@code{<math.h>} header. It should now be included explicitly if needed. Remove
also the @code{HAVE_IEEEFP_H} macro.
(Contributed by Victor Stinner in gh-108765@footnote{https://github.com/python/cpython/issues/108765}.)

@item 
@code{Python.h} no longer includes these standard header files: @code{<time.h>},
@code{<sys/select.h>} and @code{<sys/time.h>}. If needed, they should now be
included explicitly. For example, @code{<time.h>} provides the @code{clock()} and
@code{gmtime()} functions, @code{<sys/select.h>} provides the @code{select()}
function, and @code{<sys/time.h>} provides the @code{futimes()}, @code{gettimeofday()}
and @code{setitimer()} functions.
(Contributed by Victor Stinner in gh-108765@footnote{https://github.com/python/cpython/issues/108765}.)

@item 
On Windows, @code{Python.h} no longer includes the @code{<stddef.h>} standard
header file. If needed, it should now be included explicitly. For example, it
provides @code{offsetof()} function, and @code{size_t} and @code{ptrdiff_t} types.
Including @code{<stddef.h>} explicitly was already needed by all other
platforms, the @code{HAVE_STDDEF_H} macro is only defined on Windows.
(Contributed by Victor Stinner in gh-108765@footnote{https://github.com/python/cpython/issues/108765}.)

@item 
If the @ref{660,,Py_LIMITED_API} macro is defined, @code{Py_BUILD_CORE},
@code{Py_BUILD_CORE_BUILTIN} and @code{Py_BUILD_CORE_MODULE} macros
are now undefined by @code{<Python.h>}.
(Contributed by Victor Stinner in gh-85283@footnote{https://github.com/python/cpython/issues/85283}.)

@item 
The old trashcan macros @code{Py_TRASHCAN_SAFE_BEGIN} and @code{Py_TRASHCAN_SAFE_END}
were removed. They should be replaced by the new macros @code{Py_TRASHCAN_BEGIN}
and @code{Py_TRASHCAN_END}.

A @code{tp_dealloc} function that has the old macros, such as:

@example
static void
mytype_dealloc(mytype *p)
@{
    PyObject_GC_UnTrack(p);
    Py_TRASHCAN_SAFE_BEGIN(p);
    ...
    Py_TRASHCAN_SAFE_END
@}
@end example

should migrate to the new macros as follows:

@example
static void
mytype_dealloc(mytype *p)
@{
    PyObject_GC_UnTrack(p);
    Py_TRASHCAN_BEGIN(p, mytype_dealloc)
    ...
    Py_TRASHCAN_END
@}
@end example

Note that @code{Py_TRASHCAN_BEGIN} has a second argument which
should be the deallocation function it is in. The new macros were
added in Python 3.8 and the old macros were deprecated in Python 3.11.
(Contributed by Irit Katriel in gh-105111@footnote{https://github.com/python/cpython/issues/105111}.)
@end itemize
@anchor{whatsnew/3 13 pep667-porting-notes-c}@anchor{4a8}

@itemize *

@item 
@ref{470,,PEP 667} introduces several changes
to frame-related functions:


@itemize *

@item 
The effects of mutating the dictionary returned from
@ref{5f8,,PyEval_GetLocals()} in an @ref{4a2,,optimized scope} have changed.
New dict entries added this way will now `only' be visible to
subsequent @code{PyEval_GetLocals()} calls in that frame,
as @ref{661,,PyFrame_GetLocals()}, @ref{46f,,locals()},
and @ref{4a6,,FrameType.f_locals} no longer access
the same underlying cached dictionary.
Changes made to entries for actual variable names and names added via
the write-through proxy interfaces will be overwritten on subsequent calls
to @code{PyEval_GetLocals()} in that frame.
The recommended code update depends on how the function was being used,
so refer to the deprecation notice on the function for details.

@item 
Calling @ref{661,,PyFrame_GetLocals()} in an @ref{4a2,,optimized scope}
now returns a write-through proxy rather than a snapshot
that gets updated at ill-specified times.
If a snapshot is desired, it must be created explicitly
(e.g. with @ref{662,,PyDict_Copy()}),
or by calling the new @ref{5f7,,PyEval_GetFrameLocals()} API.

@item 
@code{PyFrame_FastToLocals()} and @code{PyFrame_FastToLocalsWithError()}
no longer have any effect.
Calling these functions has been redundant since Python 3.11,
when @ref{661,,PyFrame_GetLocals()} was first introduced.

@item 
@code{PyFrame_LocalsToFast()} no longer has any effect.
Calling this function is redundant now that @ref{661,,PyFrame_GetLocals()}
returns a write-through proxy for @ref{4a2,,optimized scopes}.
@end itemize

@item 
Python 3.13 removed many private functions. Some of them can be replaced using these
alternatives:


@itemize *

@item 
@code{_PyDict_Pop()}: @ref{420,,PyDict_Pop()} or @ref{5e5,,PyDict_PopString()};

@item 
@code{_PyDict_GetItemWithError()}: @ref{5e0,,PyDict_GetItemRef()};

@item 
@code{_PyErr_WriteUnraisableMsg()}:  @ref{5f1,,PyErr_FormatUnraisable()};

@item 
@code{_PyEval_SetTrace()}: @ref{663,,PyEval_SetTrace()} or @ref{664,,PyEval_SetTraceAllThreads()};

@item 
@code{_PyList_Extend()}: @ref{600,,PyList_Extend()};

@item 
@code{_PyLong_AsInt()}: @ref{604,,PyLong_AsInt()};

@item 
@code{_PyMem_RawStrdup()}: @code{strdup()};

@item 
@code{_PyMem_Strdup()}: @code{strdup()};

@item 
@code{_PyObject_ClearManagedDict()}: @ref{60e,,PyObject_ClearManagedDict()};

@item 
@code{_PyObject_VisitManagedDict()}: @ref{60d,,PyObject_VisitManagedDict()};

@item 
@code{_PyThreadState_UncheckedGet()}: @ref{421,,PyThreadState_GetUnchecked()};

@item 
@code{_PyTime_AsSecondsDouble()}: @ref{5d6,,PyTime_AsSecondsDouble()};

@item 
@code{_PyTime_GetMonotonicClock()}: @ref{5d7,,PyTime_Monotonic()} or @ref{5d8,,PyTime_MonotonicRaw()};

@item 
@code{_PyTime_GetPerfCounter()}: @ref{5d9,,PyTime_PerfCounter()} or @ref{5da,,PyTime_PerfCounterRaw()};

@item 
@code{_PyTime_GetSystemClock()}: @ref{5db,,PyTime_Time()} or @ref{5dc,,PyTime_TimeRaw()};

@item 
@code{_PyTime_MAX}: @ref{5d5,,PyTime_MAX};

@item 
@code{_PyTime_MIN}: @ref{5d4,,PyTime_MIN};

@item 
@code{_PyTime_t}: @ref{5d3,,PyTime_t};

@item 
@code{_Py_HashPointer()}: @ref{423,,Py_HashPointer()};

@item 
@code{_Py_IsFinalizing()}: @ref{5fd,,Py_IsFinalizing()}.
@end itemize

The pythoncapi-compat project@footnote{https://github.com/python/pythoncapi-compat/} can be used to get most of these new
functions on Python 3.12 and older.
@end itemize

@node Regression Test Changes,,Porting to Python 3 13,What’s New In Python 3 13
@anchor{whatsnew/3 13 regression-test-changes}@anchor{665}
@subsection Regression Test Changes



@itemize *

@item 
Python built with @code{configure} @ref{666,,--with-pydebug} now
supports a @ref{170,,-X presite=package.module} command-line
option. If used, it specifies a module that should be imported early
in the lifecycle of the interpreter, before @code{site.py} is executed.
(Contributed by Łukasz Langa in gh-110769@footnote{https://github.com/python/cpython/issues/110769}.)
@end itemize

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node What’s New In Python 3 12,What’s New In Python 3 11,What’s New In Python 3 13,What’s New in Python
@anchor{whatsnew/3 12 doc}@anchor{667}@anchor{whatsnew/3 12 translation-repo}@anchor{668}@anchor{whatsnew/3 12 what-s-new-in-python-3-12}@anchor{669}
@section What’s New In Python 3.12


@*Editor: 
Adam Turner


@c Rules for maintenance:
@c 
@c * Anyone can add text to this document.  Do not spend very much time
@c on the wording of your changes, because your text will probably
@c get rewritten to some degree.
@c 
@c * The maintainer will go through Misc/NEWS periodically and add
@c changes; it's therefore more important to add your changes to
@c Misc/NEWS than to this file.
@c 
@c * This is not a complete list of every single change; completeness
@c is the purpose of Misc/NEWS.  Some changes I consider too small
@c or esoteric to include.  If such a change is added to the text,
@c I'll just remove it.  (This is another reason you shouldn't spend
@c too much time on writing your addition.)
@c 
@c * If you want to draw your new text to the attention of the
@c maintainer, add 'XXX' to the beginning of the paragraph or
@c section.
@c 
@c * It's OK to just add a fragmentary note about a change.  For
@c example: "XXX Describe the transmogrify() function added to the
@c socket module."  The maintainer will research the change and
@c write the necessary text.
@c 
@c * You can comment out your additions if you like, but it's not
@c necessary (especially when a final release is some months away).
@c 
@c * Credit the author of a patch or bugfix.   Just the name is
@c sufficient; the e-mail address isn't necessary.
@c 
@c * It's helpful to add the issue number as a comment:
@c 
@c XXX Describe the transmogrify() function added to the socket
@c module.
@c (Contributed by P.Y. Developer in :gh:`12345`.)
@c 
@c This saves the maintainer the effort of going through the VCS log when
@c researching a change.

This article explains the new features in Python 3.12, compared to 3.11.
Python 3.12 was released on October 2, 2023.
For full details, see the @ref{143,,changelog}.


@subsubheading See also


@geindex Python Enhancement Proposals; PEP 693
PEP 693@footnote{https://peps.python.org/pep-0693/} – Python 3.12 Release Schedule


@menu
* Summary – Release highlights: Summary – Release highlights<2>. 
* New Features: New Features<3>. 
* New Features Related to Type Hints:: 
* Other Language Changes: Other Language Changes<2>. 
* New Modules: New Modules<2>. 
* Improved Modules: Improved Modules<2>. 
* Optimizations: Optimizations<3>. 
* CPython bytecode changes: CPython bytecode changes<2>. 
* Demos and Tools:: 
* Deprecated: Deprecated<2>. 
* Removed: Removed<2>. 
* Porting to Python 3.12: Porting to Python 3 12. 
* Build Changes: Build Changes<2>. 
* C API Changes: C API Changes<2>. 

@end menu

@node Summary – Release highlights<2>,New Features<3>,,What’s New In Python 3 12
@anchor{whatsnew/3 12 summary-release-highlights}@anchor{66a}
@subsection Summary – Release highlights


@c This section singles out the most important changes in Python 3.12.
@c Brevity is key.

Python 3.12 is a stable release of the Python programming language,
with a mix of changes to the language and the standard library.
The library changes focus on cleaning up deprecated APIs, usability, and correctness.
Of note, the @code{distutils} package has been removed from the standard library.
Filesystem support in @ref{a5,,os} and @ref{a8,,pathlib} has seen a number of improvements,
and several modules have better performance.

The language changes focus on usability,
as @ref{66b,,f-strings} have had many limitations removed
and ‘Did you mean …’ suggestions continue to improve.
The new @ref{66c,,type parameter syntax}
and @ref{66d,,type} statement improve ergonomics for using @ref{1a2,,generic types} and @ref{66e,,type aliases} with static type checkers.

This article doesn’t attempt to provide a complete specification of all new features,
but instead gives a convenient overview.
For full details, you should refer to the documentation,
such as the  @ref{14a,,Library Reference}
and @ref{14b,,Language Reference}.
If you want to understand the complete implementation and design rationale for a change,
refer to the PEP for a particular new feature;
but note that PEPs usually are not kept up-to-date
once a feature has been fully implemented.


__________________________________________________________________


@c PEP-sized items next.

New syntax features:


@itemize *

@item 
@ref{66c,,PEP 695}, type parameter syntax and the @ref{66d,,type} statement
@end itemize

New grammar features:


@itemize *

@item 
@ref{66f,,PEP 701}, @ref{66b,,f-strings} in the grammar
@end itemize

Interpreter improvements:


@itemize *

@item 
@ref{670,,PEP 684}, a unique per-interpreter @ref{474,,GIL}

@item 
@ref{671,,PEP 669}, low impact monitoring

@item 
@ref{672,,Improved 'Did you mean ...' suggestions}@anchor{whatsnew/3 12 improved-error-messages}@anchor{672}
for @ref{450,,NameError}, @ref{65b,,ImportError}, and @ref{18f,,SyntaxError} exceptions
@end itemize

Python data model improvements:


@itemize *

@item 
@ref{673,,PEP 688}, using the @ref{262,,buffer protocol} from Python
@end itemize

Significant improvements in the standard library:


@itemize *

@item 
The @ref{268,,pathlib.Path} class now supports subclassing

@item 
The @ref{a5,,os} module received several improvements for Windows support

@item 
A @ref{674,,command-line interface} has been added to the
@ref{d4,,sqlite3} module

@item 
@ref{2af,,isinstance()} checks against @ref{675,,runtime-checkable protocols} enjoy a speed up of between two and 20 times

@item 
The @ref{b,,asyncio} package has had a number of performance improvements,
with some benchmarks showing a 75% speed up.

@item 
A @ref{676,,command-line interface} has been added to the
@ref{117,,uuid} module

@item 
Due to the changes in @ref{66f,,PEP 701},
producing tokens via the @ref{102,,tokenize} module is up to 64% faster.
@end itemize

Security improvements:


@itemize *

@item 
Replace the builtin @ref{6c,,hashlib} implementations of
SHA1, SHA3, SHA2-384, SHA2-512, and MD5 with formally verified code from the
HACL*@footnote{https://github.com/hacl-star/hacl-star/} project.
These builtin implementations remain as fallbacks that are only used when
OpenSSL does not provide them.
@end itemize

C API improvements:


@itemize *

@item 
@ref{677,,PEP 697}, unstable C API tier

@item 
@ref{678,,PEP 683}, immortal objects
@end itemize

CPython implementation improvements:


@itemize *

@item 
@ref{679,,PEP 709}, comprehension inlining

@item 
@ref{4af,,CPython support} for the Linux @code{perf} profiler

@item 
Implement stack overflow protection on supported platforms
@end itemize

New typing features:


@itemize *

@item 
@ref{67a,,PEP 692}, using @ref{330,,TypedDict} to
annotate @ref{67b,,**kwargs}

@item 
@ref{67c,,PEP 698}, @ref{67d,,typing.override()} decorator
@end itemize

Important deprecations, removals or restrictions:


@itemize *

@item 
@geindex Python Enhancement Proposals; PEP 623
PEP 623@footnote{https://peps.python.org/pep-0623/}: Remove @code{wstr} from Unicode objects in Python’s C API,
reducing the size of every @ref{16a,,str} object by at least 8 bytes.

@item 
@geindex Python Enhancement Proposals; PEP 632
PEP 632@footnote{https://peps.python.org/pep-0632/}: Remove the @code{distutils} package.
See 
@geindex Python Enhancement Proposals; PEP 0632#migration-advice
the migration guide@footnote{https://peps.python.org/pep-0632/#migration-advice}
for advice replacing the APIs it provided.
The third-party Setuptools@footnote{https://setuptools.pypa.io/en/latest/deprecated/distutils-legacy.html}
package continues to provide @code{distutils},
if you still require it in Python 3.12 and beyond.

@item 
gh-95299@footnote{https://github.com/python/cpython/issues/95299}: Do not pre-install @code{setuptools} in virtual environments
created with @ref{118,,venv}.
This means that @code{distutils}, @code{setuptools}, @code{pkg_resources},
and @code{easy_install} will no longer available by default; to access these
run @code{pip install setuptools} in the @ref{67e,,activated}
virtual environment.

@item 
The @code{asynchat}, @code{asyncore}, and @code{imp} modules have been
removed, along with several @ref{2b5,,unittest.TestCase}
@ref{67f,,method aliases}@anchor{whatsnew/3 12 unittest-testcase-removed-aliases}@anchor{67f}.
@end itemize

@node New Features<3>,New Features Related to Type Hints,Summary – Release highlights<2>,What’s New In Python 3 12
@anchor{whatsnew/3 12 new-features}@anchor{680}
@subsection New Features


@menu
* PEP 695; Type Parameter Syntax: PEP 695 Type Parameter Syntax. 
* PEP 701; Syntactic formalization of f-strings: PEP 701 Syntactic formalization of f-strings. 
* PEP 684; A Per-Interpreter GIL: PEP 684 A Per-Interpreter GIL. 
* PEP 669; Low impact monitoring for CPython: PEP 669 Low impact monitoring for CPython. 
* PEP 688; Making the buffer protocol accessible in Python: PEP 688 Making the buffer protocol accessible in Python. 
* PEP 709; Comprehension inlining: PEP 709 Comprehension inlining. 
* Improved Error Messages:: 

@end menu

@node PEP 695 Type Parameter Syntax,PEP 701 Syntactic formalization of f-strings,,New Features<3>
@anchor{whatsnew/3 12 pep-695-type-parameter-syntax}@anchor{681}@anchor{whatsnew/3 12 whatsnew312-pep695}@anchor{66c}
@subsubsection PEP 695: Type Parameter Syntax


Generic classes and functions under 
@geindex Python Enhancement Proposals; PEP 484
PEP 484@footnote{https://peps.python.org/pep-0484/} were declared using a verbose syntax
that left the scope of type parameters unclear and required explicit declarations of
variance.

@geindex Python Enhancement Proposals; PEP 695
PEP 695@footnote{https://peps.python.org/pep-0695/} introduces a new, more compact and explicit way to create
@ref{682,,generic classes} and @ref{683,,functions}:

@example
def max[T](args: Iterable[T]) -> T:
    ...

class list[T]:
    def __getitem__(self, index: int, /) -> T:
        ...

    def append(self, element: T) -> None:
        ...
@end example

In addition, the PEP introduces a new way to declare @ref{684,,type aliases}
using the @ref{66d,,type} statement, which creates an instance of
@ref{2b0,,TypeAliasType}:

@example
type Point = tuple[float, float]
@end example

Type aliases can also be @ref{685,,generic}:

@example
type Point[T] = tuple[T, T]
@end example

The new syntax allows declaring @ref{489,,TypeVarTuple}
and @ref{488,,ParamSpec} parameters, as well as @ref{487,,TypeVar}
parameters with bounds or constraints:

@example
type IntFunc[**P] = Callable[P, int]  # ParamSpec
type LabeledTuple[*Ts] = tuple[str, *Ts]  # TypeVarTuple
type HashableSequence[T: Hashable] = Sequence[T]  # TypeVar with bound
type IntOrStrSequence[T: (int, str)] = Sequence[T]  # TypeVar with constraints
@end example

The value of type aliases and the bound and constraints of type variables
created through this syntax are evaluated only on demand (see
@ref{686,,lazy evaluation}). This means type aliases are able to
refer to other types defined later in the file.

Type parameters declared through a type parameter list are visible within the
scope of the declaration and any nested scopes, but not in the outer scope. For
example, they can be used in the type annotations for the methods of a generic
class or in the class body. However, they cannot be used in the module scope after
the class is defined. See @ref{5ad,,Type parameter lists} for a detailed description of the
runtime semantics of type parameters.

In order to support these scoping semantics, a new kind of scope is introduced,
the @ref{4ac,,annotation scope}. Annotation scopes behave for the
most part like function scopes, but interact differently with enclosing class scopes.
In Python 3.13, @ref{15d,,annotations} will also be evaluated in
annotation scopes.

See 
@geindex Python Enhancement Proposals; PEP 695
PEP 695@footnote{https://peps.python.org/pep-0695/} for more details.

(PEP written by Eric Traut. Implementation by Jelle Zijlstra, Eric Traut,
and others in gh-103764@footnote{https://github.com/python/cpython/issues/103764}.)

@node PEP 701 Syntactic formalization of f-strings,PEP 684 A Per-Interpreter GIL,PEP 695 Type Parameter Syntax,New Features<3>
@anchor{whatsnew/3 12 pep-701-syntactic-formalization-of-f-strings}@anchor{687}@anchor{whatsnew/3 12 whatsnew312-pep701}@anchor{66f}
@subsubsection PEP 701: Syntactic formalization of f-strings


@geindex Python Enhancement Proposals; PEP 701
PEP 701@footnote{https://peps.python.org/pep-0701/} lifts some restrictions on the usage of @ref{66b,,f-strings}.
Expression components inside f-strings can now be any valid Python expression,
including strings reusing the same quote as the containing f-string,
multi-line expressions, comments, backslashes, and unicode escape sequences.
Let’s cover these in detail:


@itemize *

@item 
Quote reuse: in Python 3.11, reusing the same quotes as the enclosing f-string
raises a @ref{18f,,SyntaxError}, forcing the user to either use other available
quotes (like using double quotes or triple quotes if the f-string uses single
quotes). In Python 3.12, you can now do things like this:

@example
>>> songs = ['Take me back to Eden', 'Alkaline', 'Ascensionism']
>>> f"This is the playlist: @{", ".join(songs)@}"
'This is the playlist: Take me back to Eden, Alkaline, Ascensionism'
@end example

Note that before this change there was no explicit limit in how f-strings can
be nested, but the fact that string quotes cannot be reused inside the
expression component of f-strings made it impossible to nest f-strings
arbitrarily. In fact, this is the most nested f-string that could be written:

@example
>>> f"""@{f'@w{'}'@{f'@{f"@{1+1@}"@}'@}'@w{'}'@}"""
'2'
@end example

As now f-strings can contain any valid Python expression inside expression
components, it is now possible to nest f-strings arbitrarily:

@example
>>> f"@{f"@{f"@{f"@{f"@{f"@{1+1@}"@}"@}"@}"@}"@}"
'2'
@end example

@item 
Multi-line expressions and comments: In Python 3.11, f-string expressions
must be defined in a single line, even if the expression within the f-string
could normally span multiple lines
(like literal lists being defined over multiple lines),
making them harder to read. In Python 3.12 you can now define f-strings
spanning multiple lines, and add inline comments:

@example
>>> f"This is the playlist: @{", ".join([
...     'Take me back to Eden',  # My, my, those eyes like fire
...     'Alkaline',              # Not acid nor alkaline
...     'Ascensionism'           # Take to the broken skies at last
... ])@}"
'This is the playlist: Take me back to Eden, Alkaline, Ascensionism'
@end example

@item 
Backslashes and unicode characters: before Python 3.12 f-string expressions
couldn’t contain any @code{\} character. This also affected unicode @ref{688,,escape sequences} (such as @code{\N@{snowman@}}) as these contain
the @code{\N} part that previously could not be part of expression components of
f-strings. Now, you can define expressions like this:

@example
>>> print(f"This is the playlist: @{"\n".join(songs)@}")
This is the playlist: Take me back to Eden
Alkaline
Ascensionism
>>> print(f"This is the playlist: @{"\N@{BLACK HEART SUIT@}".join(songs)@}")
This is the playlist: Take me back to Eden♥Alkaline♥Ascensionism
@end example
@end itemize

See 
@geindex Python Enhancement Proposals; PEP 701
PEP 701@footnote{https://peps.python.org/pep-0701/} for more details.

As a positive side-effect of how this feature has been implemented (by parsing f-strings
with 
@geindex Python Enhancement Proposals; PEP 617
the PEG parser@footnote{https://peps.python.org/pep-0617/}), now error messages for f-strings are more precise
and include the exact location of the error. For example, in Python 3.11, the following
f-string raises a @ref{18f,,SyntaxError}:

@example
>>> my_string = f"@{x z y@}" + f"@{1 + 1@}"
  File "<stdin>", line 1
    (x z y)
     ^^^
SyntaxError: f-string: invalid syntax. Perhaps you forgot a comma?
@end example

but the error message doesn’t include the exact location of the error within the line and
also has the expression artificially surrounded by parentheses. In Python 3.12, as f-strings
are parsed with the PEG parser, error messages can be more precise and show the entire line:

@example
>>> my_string = f"@{x z y@}" + f"@{1 + 1@}"
  File "<stdin>", line 1
    my_string = f"@{x z y@}" + f"@{1 + 1@}"
                   ^^^
SyntaxError: invalid syntax. Perhaps you forgot a comma?
@end example

(Contributed by Pablo Galindo, Batuhan Taskaya, Lysandros Nikolaou, Cristián
Maureira-Fredes and Marta Gómez in gh-102856@footnote{https://github.com/python/cpython/issues/102856}. PEP written by Pablo Galindo,
Batuhan Taskaya, Lysandros Nikolaou and Marta Gómez).

@node PEP 684 A Per-Interpreter GIL,PEP 669 Low impact monitoring for CPython,PEP 701 Syntactic formalization of f-strings,New Features<3>
@anchor{whatsnew/3 12 pep-684-a-per-interpreter-gil}@anchor{689}@anchor{whatsnew/3 12 whatsnew312-pep684}@anchor{670}
@subsubsection PEP 684: A Per-Interpreter GIL


@geindex Python Enhancement Proposals; PEP 684
PEP 684@footnote{https://peps.python.org/pep-0684/} introduces a per-interpreter @ref{474,,GIL},
so that sub-interpreters may now be created with a unique GIL per interpreter.
This allows Python programs to take full advantage of multiple CPU
cores. This is currently only available through the C-API,
though a Python API is 
@geindex Python Enhancement Proposals; PEP 554
anticipated for 3.13@footnote{https://peps.python.org/pep-0554/}.

Use the new @ref{68a,,Py_NewInterpreterFromConfig()} function to
create an interpreter with its own GIL:

@example
PyInterpreterConfig config = @{
    .check_multi_interp_extensions = 1,
    .gil = PyInterpreterConfig_OWN_GIL,
@};
PyThreadState *tstate = NULL;
PyStatus status = Py_NewInterpreterFromConfig(&tstate, &config);
if (PyStatus_Exception(status)) @{
    return -1;
@}
/* The new interpreter is now active in the current thread. */
@end example

For further examples how to use the C-API for sub-interpreters with a
per-interpreter GIL, see @code{Modules/_xxsubinterpretersmodule.c}.

(Contributed by Eric Snow in gh-104210@footnote{https://github.com/python/cpython/issues/104210}, etc.)

@node PEP 669 Low impact monitoring for CPython,PEP 688 Making the buffer protocol accessible in Python,PEP 684 A Per-Interpreter GIL,New Features<3>
@anchor{whatsnew/3 12 pep-669-low-impact-monitoring-for-cpython}@anchor{68b}@anchor{whatsnew/3 12 whatsnew312-pep669}@anchor{671}
@subsubsection PEP 669: Low impact monitoring for CPython


@geindex Python Enhancement Proposals; PEP 669
PEP 669@footnote{https://peps.python.org/pep-0669/} defines a new @ref{e0,,API} for profilers,
debuggers, and other tools to monitor events in CPython.
It covers a wide range of events, including calls,
returns, lines, exceptions, jumps, and more.
This means that you only pay for what you use, providing support
for near-zero overhead debuggers and coverage tools.
See  @code{sys.monitoring} for details.

(Contributed by Mark Shannon in gh-103082@footnote{https://github.com/python/cpython/issues/103082}.)

@node PEP 688 Making the buffer protocol accessible in Python,PEP 709 Comprehension inlining,PEP 669 Low impact monitoring for CPython,New Features<3>
@anchor{whatsnew/3 12 pep-688-making-the-buffer-protocol-accessible-in-python}@anchor{68c}@anchor{whatsnew/3 12 whatsnew312-pep688}@anchor{673}
@subsubsection PEP 688: Making the buffer protocol accessible in Python


@geindex Python Enhancement Proposals; PEP 688
PEP 688@footnote{https://peps.python.org/pep-0688/} introduces a way to use the @ref{262,,buffer protocol}
from Python code. Classes that implement the @ref{68d,,__buffer__()} method
are now usable as buffer types.

The new @ref{341,,collections.abc.Buffer} ABC provides a standard
way to represent buffer objects, for example in type annotations.
The new @ref{68e,,inspect.BufferFlags} enum represents the flags that
can be used to customize buffer creation.
(Contributed by Jelle Zijlstra in gh-102500@footnote{https://github.com/python/cpython/issues/102500}.)

@node PEP 709 Comprehension inlining,Improved Error Messages,PEP 688 Making the buffer protocol accessible in Python,New Features<3>
@anchor{whatsnew/3 12 pep-709-comprehension-inlining}@anchor{68f}@anchor{whatsnew/3 12 whatsnew312-pep709}@anchor{679}
@subsubsection PEP 709: Comprehension inlining


Dictionary, list, and set comprehensions are now inlined, rather than creating a
new single-use function object for each execution of the comprehension. This
speeds up execution of a comprehension by up to two times.
See 
@geindex Python Enhancement Proposals; PEP 709
PEP 709@footnote{https://peps.python.org/pep-0709/} for further details.

Comprehension iteration variables remain isolated and don’t overwrite a
variable of the same name in the outer scope, nor are they visible after the
comprehension. Inlining does result in a few visible behavior changes:


@itemize *

@item 
There is no longer a separate frame for the comprehension in tracebacks,
and tracing/profiling no longer shows the comprehension as a function call.

@item 
The @ref{de,,symtable} module will no longer produce child symbol tables for each
comprehension; instead, the comprehension’s locals will be included in the
parent function’s symbol table.

@item 
Calling @ref{46f,,locals()} inside a comprehension now includes variables
from outside the comprehension, and no longer includes the synthetic @code{.0}
variable for the comprehension “argument”.

@item 
A comprehension iterating directly over @code{locals()} (e.g. @code{[k for k in
locals()]}) may see “RuntimeError: dictionary changed size during iteration”
when run under tracing (e.g. code coverage measurement). This is the same
behavior already seen in e.g. @code{for k in locals():}. To avoid the error, first
create a list of keys to iterate over: @code{keys = list(locals()); [k for k in
keys]}.
@end itemize

(Contributed by Carl Meyer and Vladimir Matveev in 
@geindex Python Enhancement Proposals; PEP 709
PEP 709@footnote{https://peps.python.org/pep-0709/}.)

@node Improved Error Messages,,PEP 709 Comprehension inlining,New Features<3>

@subsubsection Improved Error Messages



@itemize *

@item 
Modules from the standard library are now potentially suggested as part of
the error messages displayed by the interpreter when a @ref{450,,NameError} is
raised to the top level. (Contributed by Pablo Galindo in gh-98254@footnote{https://github.com/python/cpython/issues/98254}.)

@example
>>> sys.version_info
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'sys' is not defined. Did you forget to import 'sys'?
@end example

@item 
Improve the error suggestion for @ref{450,,NameError} exceptions for instances.
Now if a @code{NameError} is raised in a method and the instance has an
attribute that’s exactly equal to the name in the exception, the suggestion
will include @code{self.<NAME>} instead of the closest match in the method
scope. (Contributed by Pablo Galindo in gh-99139@footnote{https://github.com/python/cpython/issues/99139}.)

@example
>>> class A:
...    def __init__(self):
...        self.blech = 1
...
...    def foo(self):
...        somethin = blech
...
>>> A().foo()
Traceback (most recent call last):
  File "<stdin>", line 1
    somethin = blech
               ^^^^^
NameError: name 'blech' is not defined. Did you mean: 'self.blech'?
@end example

@item 
Improve the @ref{18f,,SyntaxError} error message when the user types @code{import x
from y} instead of @code{from y import x}. (Contributed by Pablo Galindo in gh-98931@footnote{https://github.com/python/cpython/issues/98931}.)

@example
>>> import a.y.z from b.y.z
Traceback (most recent call last):
  File "<stdin>", line 1
    import a.y.z from b.y.z
    ^^^^^^^^^^^^^^^^^^^^^^^
SyntaxError: Did you mean to use 'from ... import ...' instead?
@end example

@item 
@ref{65b,,ImportError} exceptions raised from failed @code{from <module> import
<name>} statements now include suggestions for the value of @code{<name>} based on the
available names in @code{<module>}. (Contributed by Pablo Galindo in gh-91058@footnote{https://github.com/python/cpython/issues/91058}.)

@example
>>> from collections import chainmap
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: cannot import name 'chainmap' from 'collections'. Did you mean: 'ChainMap'?
@end example
@end itemize

@node New Features Related to Type Hints,Other Language Changes<2>,New Features<3>,What’s New In Python 3 12
@anchor{whatsnew/3 12 new-features-related-to-type-hints}@anchor{690}
@subsection New Features Related to Type Hints


This section covers major changes affecting 
@geindex Python Enhancement Proposals; PEP 484
type hints@footnote{https://peps.python.org/pep-0484/} and
the @ref{10b,,typing} module.

@menu
* PEP 692; Using TypedDict for more precise **kwargs typing: PEP 692 Using TypedDict for more precise **kwargs typing. 
* PEP 698; Override Decorator for Static Typing: PEP 698 Override Decorator for Static Typing. 

@end menu

@node PEP 692 Using TypedDict for more precise **kwargs typing,PEP 698 Override Decorator for Static Typing,,New Features Related to Type Hints
@anchor{whatsnew/3 12 pep-692-using-typeddict-for-more-precise-kwargs-typing}@anchor{691}@anchor{whatsnew/3 12 whatsnew312-pep692}@anchor{67a}
@subsubsection PEP 692: Using @code{TypedDict} for more precise @code{**kwargs} typing


Typing @code{**kwargs} in a function signature as introduced by 
@geindex Python Enhancement Proposals; PEP 484
PEP 484@footnote{https://peps.python.org/pep-0484/} allowed
for valid annotations only in cases where all of the @code{**kwargs} were of the
same type.

@geindex Python Enhancement Proposals; PEP 692
PEP 692@footnote{https://peps.python.org/pep-0692/} specifies a more precise way of typing @code{**kwargs} by relying on
typed dictionaries:

@example
from typing import TypedDict, Unpack

class Movie(TypedDict):
  name: str
  year: int

def foo(**kwargs: Unpack[Movie]): ...
@end example

See 
@geindex Python Enhancement Proposals; PEP 692
PEP 692@footnote{https://peps.python.org/pep-0692/} for more details.

(Contributed by Franek Magiera in gh-103629@footnote{https://github.com/python/cpython/issues/103629}.)

@node PEP 698 Override Decorator for Static Typing,,PEP 692 Using TypedDict for more precise **kwargs typing,New Features Related to Type Hints
@anchor{whatsnew/3 12 pep-698-override-decorator-for-static-typing}@anchor{692}@anchor{whatsnew/3 12 whatsnew312-pep698}@anchor{67c}
@subsubsection PEP 698: Override Decorator for Static Typing


A new decorator @ref{67d,,typing.override()} has been added to the @ref{10b,,typing}
module. It indicates to type checkers that the method is intended to override
a method in a superclass. This allows type checkers to catch mistakes where
a method that is intended to override something in a base class
does not in fact do so.

Example:

@example
from typing import override

class Base:
  def get_color(self) -> str:
    return "blue"

class GoodChild(Base):
  @@override  # ok: overrides Base.get_color
  def get_color(self) -> str:
    return "yellow"

class BadChild(Base):
  @@override  # type checker error: does not override Base.get_color
  def get_colour(self) -> str:
    return "red"
@end example

See 
@geindex Python Enhancement Proposals; PEP 698
PEP 698@footnote{https://peps.python.org/pep-0698/} for more details.

(Contributed by Steven Troxler in gh-101561@footnote{https://github.com/python/cpython/issues/101561}.)

@node Other Language Changes<2>,New Modules<2>,New Features Related to Type Hints,What’s New In Python 3 12
@anchor{whatsnew/3 12 other-language-changes}@anchor{693}
@subsection Other Language Changes



@itemize *

@item 
The parser now raises @ref{18f,,SyntaxError} when parsing source code containing
null bytes. (Contributed by Pablo Galindo in gh-96670@footnote{https://github.com/python/cpython/issues/96670}.)

@item 
A backslash-character pair that is not a valid escape sequence now generates
a @ref{1af,,SyntaxWarning}, instead of @ref{1a4,,DeprecationWarning}.
For example, @code{re.compile("\d+\.\d+")} now emits a @code{SyntaxWarning}
(@code{"\d"} is an invalid escape sequence, use raw strings for regular
expression: @code{re.compile(r"\d+\.\d+")}).
In a future Python version, @ref{18f,,SyntaxError} will eventually be raised,
instead of @code{SyntaxWarning}.
(Contributed by Victor Stinner in gh-98401@footnote{https://github.com/python/cpython/issues/98401}.)

@item 
Octal escapes with value larger than @code{0o377} (ex: @code{"\477"}), deprecated
in Python 3.11, now produce a @ref{1af,,SyntaxWarning}, instead of
@ref{1a4,,DeprecationWarning}.
In a future Python version they will be eventually a @ref{18f,,SyntaxError}.
(Contributed by Victor Stinner in gh-98401@footnote{https://github.com/python/cpython/issues/98401}.)

@item 
Variables used in the target part of comprehensions that are not stored to
can now be used in assignment expressions (@code{:=}).
For example, in @code{[(b := 1) for a, b.prop in some_iter]}, the assignment to
@code{b} is now allowed. Note that assigning to variables stored to in the target
part of comprehensions (like @code{a}) is still disallowed, as per 
@geindex Python Enhancement Proposals; PEP 572
PEP 572@footnote{https://peps.python.org/pep-0572/}.
(Contributed by Nikita Sobolev in gh-100581@footnote{https://github.com/python/cpython/issues/100581}.)

@item 
Exceptions raised in a class or type’s @code{__set_name__} method are no longer
wrapped by a @ref{246,,RuntimeError}. Context information is added to the
exception as a 
@geindex Python Enhancement Proposals; PEP 678
PEP 678@footnote{https://peps.python.org/pep-0678/} note. (Contributed by Irit Katriel in gh-77757@footnote{https://github.com/python/cpython/issues/77757}.)

@item 
When a @code{try-except*} construct handles the entire @ref{4d3,,ExceptionGroup}
and raises one other exception, that exception is no longer wrapped in an
@code{ExceptionGroup}. Also changed in version 3.11.4. (Contributed by Irit
Katriel in gh-103590@footnote{https://github.com/python/cpython/issues/103590}.)

@item 
The Garbage Collector now runs only on the eval breaker mechanism of the
Python bytecode evaluation loop instead of object allocations. The GC can
also run when @ref{694,,PyErr_CheckSignals()} is called so C extensions that
need to run for a long time without executing any Python code also have a
chance to execute the GC periodically. (Contributed by Pablo Galindo in
gh-97922@footnote{https://github.com/python/cpython/issues/97922}.)

@item 
All builtin and extension callables expecting boolean parameters now accept
arguments of any type instead of just @ref{3c1,,bool} and @ref{19c,,int}.
(Contributed by Serhiy Storchaka in gh-60203@footnote{https://github.com/python/cpython/issues/60203}.)

@item 
@ref{166,,memoryview} now supports the half-float type (the “e” format code).
(Contributed by Donghee Na and Antoine Pitrou in gh-90751@footnote{https://github.com/python/cpython/issues/90751}.)

@item 
@ref{695,,slice} objects are now hashable, allowing them to be used as dict keys and
set items. (Contributed by Will Bradshaw, Furkan Onder, and Raymond Hettinger in gh-101264@footnote{https://github.com/python/cpython/issues/101264}.)

@item 
@ref{696,,sum()} now uses Neumaier summation to improve accuracy and commutativity
when summing floats or mixed ints and floats.
(Contributed by Raymond Hettinger in gh-100425@footnote{https://github.com/python/cpython/issues/100425}.)

@item 
@ref{1c4,,ast.parse()} now raises @ref{18f,,SyntaxError} instead of @ref{2ee,,ValueError}
when parsing source code containing null bytes. (Contributed by Pablo Galindo
in gh-96670@footnote{https://github.com/python/cpython/issues/96670}.)

@item 
The extraction methods in @ref{e4,,tarfile}, and @ref{697,,shutil.unpack_archive()},
have a new a `filter' argument that allows limiting tar features than may be
surprising or dangerous, such as creating files outside the destination
directory.
See @ref{698,,tarfile extraction filters} for details.
In Python 3.14, the default will switch to @code{'data'}.
(Contributed by Petr Viktorin in 
@geindex Python Enhancement Proposals; PEP 706
PEP 706@footnote{https://peps.python.org/pep-0706/}.)

@item 
@ref{699,,types.MappingProxyType} instances are now hashable if the underlying
mapping is hashable.
(Contributed by Serhiy Storchaka in gh-87995@footnote{https://github.com/python/cpython/issues/87995}.)

@item 
Add @ref{4af,,support for the perf profiler} through the new
environment variable 
@geindex PYTHONPERFSUPPORT
@geindex environment variable; PYTHONPERFSUPPORT
@ref{69a,,PYTHONPERFSUPPORT}
and command-line option @ref{170,,-X perf},
as well as the new @ref{69b,,sys.activate_stack_trampoline()},
@ref{69c,,sys.deactivate_stack_trampoline()},
and @ref{69d,,sys.is_stack_trampoline_active()} functions.
(Design by Pablo Galindo. Contributed by Pablo Galindo and Christian Heimes
with contributions from Gregory P. Smith [Google] and Mark Shannon
in gh-96123@footnote{https://github.com/python/cpython/issues/96123}.)
@end itemize

@node New Modules<2>,Improved Modules<2>,Other Language Changes<2>,What’s New In Python 3 12
@anchor{whatsnew/3 12 new-modules}@anchor{69e}
@subsection New Modules



@itemize *

@item 
None.
@end itemize

@node Improved Modules<2>,Optimizations<3>,New Modules<2>,What’s New In Python 3 12
@anchor{whatsnew/3 12 improved-modules}@anchor{69f}
@subsection Improved Modules


@menu
* array: array<2>. 
* asyncio: asyncio<5>. 
* calendar: calendar<2>. 
* csv:: 
* dis: dis<3>. 
* fractions: fractions<3>. 
* importlib.resources: importlib resources. 
* inspect: inspect<2>. 
* itertools: itertools<3>. 
* math: math<3>. 
* os: os<3>. 
* os.path: os path<3>. 
* pathlib: pathlib<6>. 
* platform: platform<2>. 
* pdb: pdb<4>. 
* random: random<2>. 
* shutil: shutil<2>. 
* sqlite3: sqlite3<3>. 
* statistics: statistics<2>. 
* sys: sys<3>. 
* tempfile: tempfile<2>. 
* threading: threading<2>. 
* tkinter: tkinter<3>. 
* tokenize:: 
* types: types<3>. 
* typing: typing<4>. 
* unicodedata: unicodedata<3>. 
* unittest: unittest<3>. 
* uuid: uuid<3>. 

@end menu

@node array<2>,asyncio<5>,,Improved Modules<2>
@anchor{whatsnew/3 12 array}@anchor{6a0}
@subsubsection array



@itemize *

@item 
The @ref{4bf,,array.array} class now supports subscripting, making it a
@ref{1a2,,generic type}. (Contributed by Jelle Zijlstra in gh-98658@footnote{https://github.com/python/cpython/issues/98658}.)
@end itemize

@node asyncio<5>,calendar<2>,array<2>,Improved Modules<2>
@anchor{whatsnew/3 12 asyncio}@anchor{6a1}
@subsubsection asyncio



@itemize *

@item 
The performance of writing to sockets in @ref{b,,asyncio} has been
significantly improved. @code{asyncio} now avoids unnecessary copying when
writing to sockets and uses @ref{6a2,,sendmsg()} if the platform
supports it. (Contributed by Kumar Aditya in gh-91166@footnote{https://github.com/python/cpython/issues/91166}.)

@item 
Add @ref{6a3,,asyncio.eager_task_factory()} and @ref{6a4,,asyncio.create_eager_task_factory()}
functions to allow opting an event loop in to eager task execution,
making some use-cases 2x to 5x faster.
(Contributed by Jacob Bower & Itamar Oren in gh-102853@footnote{https://github.com/python/cpython/issues/102853}, gh-104140@footnote{https://github.com/python/cpython/issues/104140}, and gh-104138@footnote{https://github.com/python/cpython/issues/104138})

@item 
On Linux, @ref{b,,asyncio} uses @code{asyncio.PidfdChildWatcher} by default
if @ref{6a5,,os.pidfd_open()} is available and functional instead of
@code{asyncio.ThreadedChildWatcher}.
(Contributed by Kumar Aditya in gh-98024@footnote{https://github.com/python/cpython/issues/98024}.)

@item 
The event loop now uses the best available child watcher for each platform
(@code{asyncio.PidfdChildWatcher} if supported and
@code{asyncio.ThreadedChildWatcher} otherwise), so manually
configuring a child watcher is not recommended.
(Contributed by Kumar Aditya in gh-94597@footnote{https://github.com/python/cpython/issues/94597}.)

@item 
Add `loop_factory' parameter to @ref{2f5,,asyncio.run()} to allow specifying
a custom event loop factory.
(Contributed by Kumar Aditya in gh-99388@footnote{https://github.com/python/cpython/issues/99388}.)

@item 
Add C implementation of @ref{6a6,,asyncio.current_task()} for 4x-6x speedup.
(Contributed by Itamar Oren and Pranav Thulasiram Bhat in gh-100344@footnote{https://github.com/python/cpython/issues/100344}.)

@item 
@ref{6a7,,asyncio.iscoroutine()} now returns @code{False} for generators as
@ref{b,,asyncio} does not support legacy generator-based coroutines.
(Contributed by Kumar Aditya in gh-102748@footnote{https://github.com/python/cpython/issues/102748}.)

@item 
@ref{6a8,,asyncio.wait()} and @ref{4c7,,asyncio.as_completed()} now accepts generators
yielding tasks.
(Contributed by Kumar Aditya in gh-78530@footnote{https://github.com/python/cpython/issues/78530}.)
@end itemize

@node calendar<2>,csv,asyncio<5>,Improved Modules<2>
@anchor{whatsnew/3 12 calendar}@anchor{6a9}
@subsubsection calendar



@itemize *

@item 
Add enums @ref{6aa,,calendar.Month} and @ref{6ab,,calendar.Day}
defining months of the year and days of the week.
(Contributed by Prince Roshan in gh-103636@footnote{https://github.com/python/cpython/issues/103636}.)
@end itemize

@node csv,dis<3>,calendar<2>,Improved Modules<2>
@anchor{whatsnew/3 12 csv}@anchor{6ac}
@subsubsection csv



@itemize *

@item 
Add @ref{6ad,,csv.QUOTE_NOTNULL} and @ref{6ae,,csv.QUOTE_STRINGS} flags to
provide finer grained control of @code{None} and empty strings by
@ref{6af,,reader} and @ref{6b0,,writer} objects.
@end itemize

@node dis<3>,fractions<3>,csv,Improved Modules<2>
@anchor{whatsnew/3 12 dis}@anchor{6b1}
@subsubsection dis



@itemize *

@item 
Pseudo instruction opcodes (which are used by the compiler but
do not appear in executable bytecode) are now exposed in the
@ref{3c,,dis} module.
@ref{6b2,,HAVE_ARGUMENT} is still relevant to real opcodes,
but it is not useful for pseudo instructions. Use the new
@ref{59f,,dis.hasarg} collection instead.
(Contributed by Irit Katriel in gh-94216@footnote{https://github.com/python/cpython/issues/94216}.)

@item 
Add the @ref{6b3,,dis.hasexc} collection to signify instructions that set
an exception handler. (Contributed by Irit Katriel in gh-94216@footnote{https://github.com/python/cpython/issues/94216}.)
@end itemize

@node fractions<3>,importlib resources,dis<3>,Improved Modules<2>
@anchor{whatsnew/3 12 fractions}@anchor{6b4}
@subsubsection fractions



@itemize *

@item 
Objects of type @ref{215,,fractions.Fraction} now support float-style
formatting. (Contributed by Mark Dickinson in gh-100161@footnote{https://github.com/python/cpython/issues/100161}.)
@end itemize

@node importlib resources,inspect<2>,fractions<3>,Improved Modules<2>
@anchor{whatsnew/3 12 importlib-resources}@anchor{6b5}
@subsubsection importlib.resources



@itemize *

@item 
@ref{6b6,,importlib.resources.as_file()} now supports resource directories.
(Contributed by Jason R. Coombs in gh-97930@footnote{https://github.com/python/cpython/issues/97930}.)

@item 
Rename first parameter of @ref{6b7,,importlib.resources.files()} to `anchor'.
(Contributed by Jason R. Coombs in gh-100598@footnote{https://github.com/python/cpython/issues/100598}.)
@end itemize

@node inspect<2>,itertools<3>,importlib resources,Improved Modules<2>
@anchor{whatsnew/3 12 inspect}@anchor{6b8}
@subsubsection inspect



@itemize *

@item 
Add @ref{6b9,,inspect.markcoroutinefunction()} to mark sync functions that return
a @ref{6ba,,coroutine} for use with @ref{30f,,inspect.iscoroutinefunction()}.
(Contributed by Carlton Gibson in gh-99247@footnote{https://github.com/python/cpython/issues/99247}.)

@item 
Add @ref{6bb,,inspect.getasyncgenstate()} and @ref{6bc,,inspect.getasyncgenlocals()}
for determining the current state of asynchronous generators.
(Contributed by Thomas Krennwallner in gh-79940@footnote{https://github.com/python/cpython/issues/79940}.)

@item 
The performance of @ref{6bd,,inspect.getattr_static()} has been considerably
improved. Most calls to the function should be at least 2x faster than they
were in Python 3.11. (Contributed by Alex Waygood in gh-103193@footnote{https://github.com/python/cpython/issues/103193}.)
@end itemize

@node itertools<3>,math<3>,inspect<2>,Improved Modules<2>
@anchor{whatsnew/3 12 itertools}@anchor{6be}
@subsubsection itertools



@itemize *

@item 
Add @ref{512,,itertools.batched()} for collecting into even-sized
tuples where the last batch may be shorter than the rest.
(Contributed by Raymond Hettinger in gh-98363@footnote{https://github.com/python/cpython/issues/98363}.)
@end itemize

@node math<3>,os<3>,itertools<3>,Improved Modules<2>
@anchor{whatsnew/3 12 math}@anchor{6bf}
@subsubsection math



@itemize *

@item 
Add @ref{6c0,,math.sumprod()} for computing a sum of products.
(Contributed by Raymond Hettinger in gh-100485@footnote{https://github.com/python/cpython/issues/100485}.)

@item 
Extend @ref{6c1,,math.nextafter()} to include a `steps' argument
for moving up or down multiple steps at a time. (Contributed by
Matthias Goergens, Mark Dickinson, and Raymond Hettinger in gh-94906@footnote{https://github.com/python/cpython/issues/94906}.)
@end itemize

@node os<3>,os path<3>,math<3>,Improved Modules<2>
@anchor{whatsnew/3 12 os}@anchor{6c2}
@subsubsection os



@itemize *

@item 
Add @ref{6c3,,os.PIDFD_NONBLOCK} to open a file descriptor
for a process with @ref{6a5,,os.pidfd_open()} in non-blocking mode.
(Contributed by Kumar Aditya in gh-93312@footnote{https://github.com/python/cpython/issues/93312}.)

@item 
@ref{6c4,,os.DirEntry} now includes an @ref{6c5,,os.DirEntry.is_junction()}
method to check if the entry is a junction.
(Contributed by Charles Machalow in gh-99547@footnote{https://github.com/python/cpython/issues/99547}.)

@item 
Add @ref{6c6,,os.listdrives()}, @ref{6c7,,os.listvolumes()} and @ref{6c8,,os.listmounts()}
functions on Windows for enumerating drives, volumes and mount points.
(Contributed by Steve Dower in gh-102519@footnote{https://github.com/python/cpython/issues/102519}.)

@item 
@ref{26f,,os.stat()} and @ref{6c9,,os.lstat()} are now more accurate on Windows.
The @code{st_birthtime} field will now be filled with the creation time
of the file, and @code{st_ctime} is deprecated but still contains the
creation time (but in the future will return the last metadata change,
for consistency with other platforms). @code{st_dev} may be up to 64 bits
and @code{st_ino} up to 128 bits depending on your file system, and
@code{st_rdev} is always set to zero rather than incorrect values.
Both functions may be significantly faster on newer releases of
Windows. (Contributed by Steve Dower in gh-99726@footnote{https://github.com/python/cpython/issues/99726}.)
@end itemize

@node os path<3>,pathlib<6>,os<3>,Improved Modules<2>
@anchor{whatsnew/3 12 os-path}@anchor{6ca}
@subsubsection os.path



@itemize *

@item 
Add @ref{6cb,,os.path.isjunction()} to check if a given path is a junction.
(Contributed by Charles Machalow in gh-99547@footnote{https://github.com/python/cpython/issues/99547}.)

@item 
Add @ref{6cc,,os.path.splitroot()} to split a path into a triad
@code{(drive, root, tail)}. (Contributed by Barney Gale in gh-101000@footnote{https://github.com/python/cpython/issues/101000}.)
@end itemize

@node pathlib<6>,platform<2>,os path<3>,Improved Modules<2>
@anchor{whatsnew/3 12 pathlib}@anchor{6cd}
@subsubsection pathlib



@itemize *

@item 
Add support for subclassing @ref{6ce,,pathlib.PurePath} and
@ref{268,,pathlib.Path}, plus their Posix- and Windows-specific variants.
Subclasses may override the @ref{6cf,,pathlib.PurePath.with_segments()} method
to pass information between path instances.

@item 
Add @ref{6d0,,pathlib.Path.walk()} for walking the directory trees and generating
all file or directory names within them, similar to @ref{6d1,,os.walk()}.
(Contributed by Stanislav Zmiev in gh-90385@footnote{https://github.com/python/cpython/issues/90385}.)

@item 
Add `walk_up' optional parameter to @ref{2ff,,pathlib.PurePath.relative_to()}
to allow the insertion of @code{..} entries in the result; this behavior is
more consistent with @ref{6d2,,os.path.relpath()}.
(Contributed by Domenico Ragusa in gh-84538@footnote{https://github.com/python/cpython/issues/84538}.)

@item 
Add @ref{6d3,,pathlib.Path.is_junction()} as a proxy to @ref{6cb,,os.path.isjunction()}.
(Contributed by Charles Machalow in gh-99547@footnote{https://github.com/python/cpython/issues/99547}.)

@item 
Add `case_sensitive' optional parameter to @ref{538,,pathlib.Path.glob()},
@ref{539,,pathlib.Path.rglob()} and @ref{6d4,,pathlib.PurePath.match()} for matching
the path’s case sensitivity, allowing for more precise control over the matching process.
@end itemize

@node platform<2>,pdb<4>,pathlib<6>,Improved Modules<2>
@anchor{whatsnew/3 12 platform}@anchor{6d5}
@subsubsection platform



@itemize *

@item 
Add support for detecting Windows 11 and Windows Server releases past 2012.
Previously, lookups on Windows Server platforms newer than Windows Server 2012
and on Windows 11 would return @code{Windows-10}.
(Contributed by Steve Dower in gh-89545@footnote{https://github.com/python/cpython/issues/89545}.)
@end itemize

@node pdb<4>,random<2>,platform<2>,Improved Modules<2>
@anchor{whatsnew/3 12 pdb}@anchor{6d6}
@subsubsection pdb



@itemize *

@item 
Add convenience variables to hold values temporarily for debug session
and provide quick access to values like the current frame or the return
value.
(Contributed by Tian Gao in gh-103693@footnote{https://github.com/python/cpython/issues/103693}.)
@end itemize

@node random<2>,shutil<2>,pdb<4>,Improved Modules<2>
@anchor{whatsnew/3 12 random}@anchor{6d7}
@subsubsection random



@itemize *

@item 
Add @ref{6d8,,random.binomialvariate()}.
(Contributed by Raymond Hettinger in gh-81620@footnote{https://github.com/python/cpython/issues/81620}.)

@item 
Add a default of @code{lambd=1.0} to @ref{6d9,,random.expovariate()}.
(Contributed by Raymond Hettinger in gh-100234@footnote{https://github.com/python/cpython/issues/100234}.)
@end itemize

@node shutil<2>,sqlite3<3>,random<2>,Improved Modules<2>
@anchor{whatsnew/3 12 shutil}@anchor{6da}
@subsubsection shutil



@itemize *

@item 
@ref{6db,,shutil.make_archive()} now passes the `root_dir' argument to custom
archivers which support it.
In this case it no longer temporarily changes the current working directory
of the process to `root_dir' to perform archiving.
(Contributed by Serhiy Storchaka in gh-74696@footnote{https://github.com/python/cpython/issues/74696}.)

@item 
@ref{354,,shutil.rmtree()} now accepts a new argument `onexc' which is an
error handler like `onerror' but which expects an exception instance
rather than a `(typ, val, tb)' triplet. `onerror' is deprecated.
(Contributed by Irit Katriel in gh-102828@footnote{https://github.com/python/cpython/issues/102828}.)

@item 
@ref{6dc,,shutil.which()} now consults the `PATHEXT' environment variable to
find matches within `PATH' on Windows even when the given `cmd' includes
a directory component.
(Contributed by Charles Machalow in gh-103179@footnote{https://github.com/python/cpython/issues/103179}.)

@ref{6dc,,shutil.which()} will call @code{NeedCurrentDirectoryForExePathW} when
querying for executables on Windows to determine if the current working
directory should be prepended to the search path.
(Contributed by Charles Machalow in gh-103179@footnote{https://github.com/python/cpython/issues/103179}.)

@ref{6dc,,shutil.which()} will return a path matching the `cmd' with a component
from @code{PATHEXT} prior to a direct match elsewhere in the search path on
Windows.
(Contributed by Charles Machalow in gh-103179@footnote{https://github.com/python/cpython/issues/103179}.)
@end itemize

@node sqlite3<3>,statistics<2>,shutil<2>,Improved Modules<2>
@anchor{whatsnew/3 12 sqlite3}@anchor{6dd}
@subsubsection sqlite3



@itemize *

@item 
Add a @ref{674,,command-line interface}.
(Contributed by Erlend E. Aasland in gh-77617@footnote{https://github.com/python/cpython/issues/77617}.)

@item 
Add the @ref{6de,,sqlite3.Connection.autocommit} attribute
to @ref{54e,,sqlite3.Connection}
and the `autocommit' parameter to @ref{5a6,,sqlite3.connect()}
to control 
@geindex Python Enhancement Proposals; PEP 249
PEP 249@footnote{https://peps.python.org/pep-0249/}-compliant
@ref{6df,,transaction handling}.
(Contributed by Erlend E. Aasland in gh-83638@footnote{https://github.com/python/cpython/issues/83638}.)

@item 
Add `entrypoint' keyword-only parameter to
@ref{6e0,,sqlite3.Connection.load_extension()},
for overriding the SQLite extension entry point.
(Contributed by Erlend E. Aasland in gh-103015@footnote{https://github.com/python/cpython/issues/103015}.)

@item 
Add @ref{6e1,,sqlite3.Connection.getconfig()} and
@ref{6e2,,sqlite3.Connection.setconfig()} to @ref{54e,,sqlite3.Connection}
to make configuration changes to a database connection.
(Contributed by Erlend E. Aasland in gh-103489@footnote{https://github.com/python/cpython/issues/103489}.)
@end itemize

@node statistics<2>,sys<3>,sqlite3<3>,Improved Modules<2>
@anchor{whatsnew/3 12 statistics}@anchor{6e3}
@subsubsection statistics



@itemize *

@item 
Extend @ref{6e4,,statistics.correlation()} to include as a @code{ranked} method
for computing the Spearman correlation of ranked data.
(Contributed by Raymond Hettinger in gh-95861@footnote{https://github.com/python/cpython/issues/95861}.)
@end itemize

@node sys<3>,tempfile<2>,statistics<2>,Improved Modules<2>
@anchor{whatsnew/3 12 sys}@anchor{6e5}
@subsubsection sys



@itemize *

@item 
Add the @ref{e0,,sys.monitoring} namespace to expose the new @ref{671,,PEP 669} monitoring API.
(Contributed by Mark Shannon in gh-103082@footnote{https://github.com/python/cpython/issues/103082}.)

@item 
Add @ref{69b,,sys.activate_stack_trampoline()} and
@ref{69c,,sys.deactivate_stack_trampoline()} for activating and deactivating
stack profiler trampolines,
and @ref{69d,,sys.is_stack_trampoline_active()} for querying if stack profiler
trampolines are active.
(Contributed by Pablo Galindo and Christian Heimes
with contributions from Gregory P. Smith [Google] and Mark Shannon
in gh-96123@footnote{https://github.com/python/cpython/issues/96123}.)

@item 
Add @ref{6e6,,sys.last_exc} which holds the last unhandled exception that
was raised (for post-mortem debugging use cases). Deprecate the
three fields that have the same information in its legacy form:
@ref{6e7,,sys.last_type}, @ref{6e8,,sys.last_value} and @ref{6e9,,sys.last_traceback}.
(Contributed by Irit Katriel in gh-102778@footnote{https://github.com/python/cpython/issues/102778}.)

@item 
@ref{6ea,,sys._current_exceptions()} now returns a mapping from thread-id to an
exception instance, rather than to a @code{(typ, exc, tb)} tuple.
(Contributed by Irit Katriel in gh-103176@footnote{https://github.com/python/cpython/issues/103176}.)

@item 
@ref{6eb,,sys.setrecursionlimit()} and @ref{6ec,,sys.getrecursionlimit()}.
The recursion limit now applies only to Python code. Builtin functions do
not use the recursion limit, but are protected by a different mechanism
that prevents recursion from causing a virtual machine crash.
@end itemize

@node tempfile<2>,threading<2>,sys<3>,Improved Modules<2>
@anchor{whatsnew/3 12 tempfile}@anchor{6ed}
@subsubsection tempfile



@itemize *

@item 
The @ref{6ee,,tempfile.NamedTemporaryFile} function has a new optional parameter
`delete_on_close' (Contributed by Evgeny Zorin in gh-58451@footnote{https://github.com/python/cpython/issues/58451}.)

@item 
@ref{52e,,tempfile.mkdtemp()} now always returns an absolute path, even if the
argument provided to the `dir' parameter is a relative path.
@end itemize

@node threading<2>,tkinter<3>,tempfile<2>,Improved Modules<2>
@anchor{whatsnew/3 12 threading}@anchor{6ef}
@subsubsection threading



@itemize *

@item 
Add @ref{6f0,,threading.settrace_all_threads()} and
@ref{6f1,,threading.setprofile_all_threads()} that allow to set tracing and
profiling functions in all running threads in addition to the calling one.
(Contributed by Pablo Galindo in gh-93503@footnote{https://github.com/python/cpython/issues/93503}.)
@end itemize

@node tkinter<3>,tokenize,threading<2>,Improved Modules<2>
@anchor{whatsnew/3 12 tkinter}@anchor{6f2}
@subsubsection tkinter



@itemize *

@item 
@code{tkinter.Canvas.coords()} now flattens its arguments.
It now accepts not only coordinates as separate arguments
(@code{x1, y1, x2, y2, ...}) and a sequence of coordinates
(@code{[x1, y1, x2, y2, ...]}), but also coordinates grouped in pairs
(@code{(x1, y1), (x2, y2), ...} and @code{[(x1, y1), (x2, y2), ...]}),
like @code{create_*()} methods.
(Contributed by Serhiy Storchaka in gh-94473@footnote{https://github.com/python/cpython/issues/94473}.)
@end itemize

@node tokenize,types<3>,tkinter<3>,Improved Modules<2>
@anchor{whatsnew/3 12 tokenize}@anchor{6f3}
@subsubsection tokenize



@itemize *

@item 
The @ref{102,,tokenize} module includes the changes introduced in 
@geindex Python Enhancement Proposals; PEP 701
PEP 701@footnote{https://peps.python.org/pep-0701/}.
(Contributed by Marta Gómez Macías and Pablo Galindo in gh-102856@footnote{https://github.com/python/cpython/issues/102856}.)
See @ref{6f4,,Porting to Python 3.12} for more information on the
changes to the @code{tokenize} module.
@end itemize

@node types<3>,typing<4>,tokenize,Improved Modules<2>
@anchor{whatsnew/3 12 types}@anchor{6f5}
@subsubsection types



@itemize *

@item 
Add @ref{6f6,,types.get_original_bases()} to allow for further introspection of
@ref{6f7,,User-defined generic types} when subclassed. (Contributed by
James Hilton-Balfe and Alex Waygood in gh-101827@footnote{https://github.com/python/cpython/issues/101827}.)
@end itemize

@node typing<4>,unicodedata<3>,types<3>,Improved Modules<2>
@anchor{whatsnew/3 12 typing}@anchor{6f8}@anchor{whatsnew/3 12 whatsnew-typing-py312}@anchor{6f9}
@subsubsection typing



@itemize *

@item 
@ref{2af,,isinstance()} checks against
@ref{675,,runtime-checkable protocols} now use
@ref{6bd,,inspect.getattr_static()} rather than @ref{6fa,,hasattr()} to lookup whether
attributes exist. This means that descriptors and @ref{6fb,,__getattr__()}
methods are no longer unexpectedly evaluated during @code{isinstance()} checks
against runtime-checkable protocols. However, it may also mean that some
objects which used to be considered instances of a runtime-checkable protocol
may no longer be considered instances of that protocol on Python 3.12+, and
vice versa. Most users are unlikely to be affected by this change.
(Contributed by Alex Waygood in gh-102433@footnote{https://github.com/python/cpython/issues/102433}.)

@item 
The members of a runtime-checkable protocol are now considered “frozen” at
runtime as soon as the class has been created. Monkey-patching attributes
onto a runtime-checkable protocol will still work, but will have no impact on
@ref{2af,,isinstance()} checks comparing objects to the protocol. For example:

@example
>>> from typing import Protocol, runtime_checkable
>>> @@runtime_checkable
... class HasX(Protocol):
...     x = 1
...
>>> class Foo: ...
...
>>> f = Foo()
>>> isinstance(f, HasX)
False
>>> f.x = 1
>>> isinstance(f, HasX)
True
>>> HasX.y = 2
>>> isinstance(f, HasX)  # unchanged, even though HasX now also has a "y" attribute
True
@end example

This change was made in order to speed up @code{isinstance()} checks against
runtime-checkable protocols.

@item 
The performance profile of @ref{2af,,isinstance()} checks against
@ref{675,,runtime-checkable protocols} has changed
significantly. Most @code{isinstance()} checks against protocols with only a few
members should be at least 2x faster than in 3.11, and some may be 20x
faster or more. However, @code{isinstance()} checks against protocols with many
members may be slower than in Python 3.11. (Contributed by Alex
Waygood in gh-74690@footnote{https://github.com/python/cpython/issues/74690} and gh-103193@footnote{https://github.com/python/cpython/issues/103193}.)

@item 
All @ref{330,,typing.TypedDict} and @ref{32f,,typing.NamedTuple} classes now have the
@code{__orig_bases__} attribute. (Contributed by Adrian Garcia Badaracco in
gh-103699@footnote{https://github.com/python/cpython/issues/103699}.)

@item 
Add @code{frozen_default} parameter to @ref{6fc,,typing.dataclass_transform()}.
(Contributed by Erik De Bonte in gh-99957@footnote{https://github.com/python/cpython/issues/99957}.)
@end itemize

@node unicodedata<3>,unittest<3>,typing<4>,Improved Modules<2>
@anchor{whatsnew/3 12 unicodedata}@anchor{6fd}
@subsubsection unicodedata



@itemize *

@item 
The Unicode database has been updated to version 15.0.0. (Contributed by
Benjamin Peterson in gh-96734@footnote{https://github.com/python/cpython/issues/96734}).
@end itemize

@node unittest<3>,uuid<3>,unicodedata<3>,Improved Modules<2>
@anchor{whatsnew/3 12 unittest}@anchor{6fe}
@subsubsection unittest


Add a @code{--durations} command line option, showing the N slowest test cases:

@example
python3 -m unittest --durations=3 lib.tests.test_threading
.....
Slowest test durations
----------------------------------------------------------------------
1.210s     test_timeout (Lib.test.test_threading.BarrierTests)
1.003s     test_default_timeout (Lib.test.test_threading.BarrierTests)
0.518s     test_timeout (Lib.test.test_threading.EventTests)

(0.000 durations hidden.  Use -v to show these durations.)
----------------------------------------------------------------------
Ran 158 tests in 9.869s

OK (skipped=3)
@end example

(Contributed by Giampaolo Rodola in gh-48330@footnote{https://github.com/python/cpython/issues/48330})

@node uuid<3>,,unittest<3>,Improved Modules<2>
@anchor{whatsnew/3 12 uuid}@anchor{6ff}
@subsubsection uuid



@itemize *

@item 
Add a @ref{676,,command-line interface}.
(Contributed by Adam Chhina in gh-88597@footnote{https://github.com/python/cpython/issues/88597}.)
@end itemize

@node Optimizations<3>,CPython bytecode changes<2>,Improved Modules<2>,What’s New In Python 3 12
@anchor{whatsnew/3 12 optimizations}@anchor{700}
@subsection Optimizations



@itemize *

@item 
Remove @code{wstr} and @code{wstr_length} members from Unicode objects.
It reduces object size by 8 or 16 bytes on 64bit platform. (
@geindex Python Enhancement Proposals; PEP 623
PEP 623@footnote{https://peps.python.org/pep-0623/})
(Contributed by Inada Naoki in gh-92536@footnote{https://github.com/python/cpython/issues/92536}.)

@item 
Add experimental support for using the BOLT binary optimizer in the build
process, which improves performance by 1-5%.
(Contributed by Kevin Modzelewski in gh-90536@footnote{https://github.com/python/cpython/issues/90536} and tuned by Donghee Na in gh-101525@footnote{https://github.com/python/cpython/issues/101525})

@item 
Speed up the regular expression substitution (functions @ref{5a3,,re.sub()} and
@ref{5a4,,re.subn()} and corresponding @code{re.Pattern} methods) for
replacement strings containing group references by 2–3 times.
(Contributed by Serhiy Storchaka in gh-91524@footnote{https://github.com/python/cpython/issues/91524}.)

@item 
Speed up @ref{1c9,,asyncio.Task} creation by deferring expensive string formatting.
(Contributed by Itamar Oren in gh-103793@footnote{https://github.com/python/cpython/issues/103793}.)

@item 
The @ref{701,,tokenize.tokenize()} and @ref{702,,tokenize.generate_tokens()} functions are
up to 64% faster as a side effect of the changes required to cover 
@geindex Python Enhancement Proposals; PEP 701
PEP 701@footnote{https://peps.python.org/pep-0701/} in
the @ref{102,,tokenize} module. (Contributed by Marta Gómez Macías and Pablo Galindo
in gh-102856@footnote{https://github.com/python/cpython/issues/102856}.)

@item 
Speed up @ref{1a7,,super()} method calls and attribute loads via the
new @ref{703,,LOAD_SUPER_ATTR} instruction. (Contributed by Carl Meyer and
Vladimir Matveev in gh-103497@footnote{https://github.com/python/cpython/issues/103497}.)
@end itemize

@node CPython bytecode changes<2>,Demos and Tools,Optimizations<3>,What’s New In Python 3 12
@anchor{whatsnew/3 12 cpython-bytecode-changes}@anchor{704}
@subsection CPython bytecode changes



@itemize *

@item 
Remove the @code{LOAD_METHOD} instruction. It has been merged into
@ref{705,,LOAD_ATTR}. @code{LOAD_ATTR} will now behave like the old
@code{LOAD_METHOD} instruction if the low bit of its oparg is set.
(Contributed by Ken Jin in gh-93429@footnote{https://github.com/python/cpython/issues/93429}.)

@item 
Remove the @code{JUMP_IF_FALSE_OR_POP} and @code{JUMP_IF_TRUE_OR_POP}
instructions. (Contributed by Irit Katriel in gh-102859@footnote{https://github.com/python/cpython/issues/102859}.)

@item 
Remove the @code{PRECALL} instruction. (Contributed by Mark Shannon in
gh-92925@footnote{https://github.com/python/cpython/issues/92925}.)

@item 
Add the @ref{706,,BINARY_SLICE} and @ref{707,,STORE_SLICE} instructions.
(Contributed by Mark Shannon in gh-94163@footnote{https://github.com/python/cpython/issues/94163}.)

@item 
Add the @ref{708,,CALL_INTRINSIC_1} instructions.
(Contributed by Mark Shannon in gh-99005@footnote{https://github.com/python/cpython/issues/99005}.)

@item 
Add the @ref{709,,CALL_INTRINSIC_2} instruction.
(Contributed by Irit Katriel in gh-101799@footnote{https://github.com/python/cpython/issues/101799}.)

@item 
Add the @ref{70a,,CLEANUP_THROW} instruction.
(Contributed by Brandt Bucher in gh-90997@footnote{https://github.com/python/cpython/issues/90997}.)

@item 
Add the @code{END_SEND} instruction.
(Contributed by Mark Shannon in gh-103082@footnote{https://github.com/python/cpython/issues/103082}.)

@item 
Add the @ref{70b,,LOAD_FAST_AND_CLEAR} instruction as part of the
implementation of 
@geindex Python Enhancement Proposals; PEP 709
PEP 709@footnote{https://peps.python.org/pep-0709/}. (Contributed by Carl Meyer in gh-101441@footnote{https://github.com/python/cpython/issues/101441}.)

@item 
Add the @ref{70c,,LOAD_FAST_CHECK} instruction.
(Contributed by Dennis Sweeney in gh-93143@footnote{https://github.com/python/cpython/issues/93143}.)

@item 
Add the @ref{70d,,LOAD_FROM_DICT_OR_DEREF}, @ref{70e,,LOAD_FROM_DICT_OR_GLOBALS},
and @ref{70f,,LOAD_LOCALS} opcodes as part of the implementation of 
@geindex Python Enhancement Proposals; PEP 695
PEP 695@footnote{https://peps.python.org/pep-0695/}.
Remove the @code{LOAD_CLASSDEREF} opcode, which can be replaced with
@code{LOAD_LOCALS} plus @code{LOAD_FROM_DICT_OR_DEREF}. (Contributed
by Jelle Zijlstra in gh-103764@footnote{https://github.com/python/cpython/issues/103764}.)

@item 
Add the @ref{703,,LOAD_SUPER_ATTR} instruction. (Contributed by Carl Meyer and
Vladimir Matveev in gh-103497@footnote{https://github.com/python/cpython/issues/103497}.)

@item 
Add the @code{RETURN_CONST} instruction. (Contributed by Wenyang Wang in gh-101632@footnote{https://github.com/python/cpython/issues/101632}.)
@end itemize

@node Demos and Tools,Deprecated<2>,CPython bytecode changes<2>,What’s New In Python 3 12
@anchor{whatsnew/3 12 demos-and-tools}@anchor{710}
@subsection Demos and Tools



@itemize *

@item 
Remove the @code{Tools/demo/} directory which contained old demo scripts. A copy
can be found in the old-demos project@footnote{https://github.com/gvanrossum/old-demos}.
(Contributed by Victor Stinner in gh-97681@footnote{https://github.com/python/cpython/issues/97681}.)

@item 
Remove outdated example scripts of the @code{Tools/scripts/} directory.
A copy can be found in the old-demos project@footnote{https://github.com/gvanrossum/old-demos}.
(Contributed by Victor Stinner in gh-97669@footnote{https://github.com/python/cpython/issues/97669}.)
@end itemize

@node Deprecated<2>,Removed<2>,Demos and Tools,What’s New In Python 3 12
@anchor{whatsnew/3 12 deprecated}@anchor{711}
@subsection Deprecated



@itemize *

@item 
@ref{7,,argparse}: The `type', `choices', and `metavar' parameters
of @code{argparse.BooleanOptionalAction} are deprecated
and will be removed in 3.14.
(Contributed by Nikita Sobolev in gh-92248@footnote{https://github.com/python/cpython/issues/92248}.)

@item 
@ref{9,,ast}: The following @code{ast} features have been deprecated in documentation since
Python 3.8, now cause a @ref{1a4,,DeprecationWarning} to be emitted at runtime
when they are accessed or used, and will be removed in Python 3.14:


@itemize *

@item 
@code{ast.Num}

@item 
@code{ast.Str}

@item 
@code{ast.Bytes}

@item 
@code{ast.NameConstant}

@item 
@code{ast.Ellipsis}
@end itemize

Use @ref{2f1,,ast.Constant} instead.
(Contributed by Serhiy Storchaka in gh-90953@footnote{https://github.com/python/cpython/issues/90953}.)

@item 
@ref{b,,asyncio}:


@itemize *

@item 
The child watcher classes @code{asyncio.MultiLoopChildWatcher},
@code{asyncio.FastChildWatcher}, @code{asyncio.AbstractChildWatcher}
and @code{asyncio.SafeChildWatcher} are deprecated and
will be removed in Python 3.14.
(Contributed by Kumar Aditya in gh-94597@footnote{https://github.com/python/cpython/issues/94597}.)

@item 
@code{asyncio.set_child_watcher()}, @code{asyncio.get_child_watcher()},
@code{asyncio.AbstractEventLoopPolicy.set_child_watcher()} and
@code{asyncio.AbstractEventLoopPolicy.get_child_watcher()} are deprecated
and will be removed in Python 3.14.
(Contributed by Kumar Aditya in gh-94597@footnote{https://github.com/python/cpython/issues/94597}.)

@item 
The @ref{2f4,,get_event_loop()} method of the
default event loop policy now emits a @ref{1a4,,DeprecationWarning} if there
is no current event loop set and it decides to create one.
(Contributed by Serhiy Storchaka and Guido van Rossum in gh-100160@footnote{https://github.com/python/cpython/issues/100160}.)
@end itemize

@item 
@ref{15,,calendar}: @code{calendar.January} and @code{calendar.February} constants are deprecated and
replaced by @ref{34c,,calendar.JANUARY} and @ref{34d,,calendar.FEBRUARY}.
(Contributed by Prince Roshan in gh-103636@footnote{https://github.com/python/cpython/issues/103636}.)

@item 
@ref{1f,,collections.abc}: Deprecated @ref{340,,collections.abc.ByteString}.

Use @code{isinstance(obj, collections.abc.Buffer)} to test if @code{obj} implements
the @ref{262,,buffer protocol} at runtime. For use in type
annotations, either use @ref{341,,Buffer} or a union
that explicitly specifies the types your code supports (e.g.,
@code{bytes | bytearray | memoryview}).

@code{ByteString} was originally intended to be an abstract class that
would serve as a supertype of both @ref{193,,bytes} and @ref{342,,bytearray}.
However, since the ABC never had any methods, knowing that an object was an
instance of @code{ByteString} never actually told you anything useful
about the object. Other common buffer types such as @ref{166,,memoryview} were
also never understood as subtypes of @code{ByteString} (either at
runtime or by static type checkers).

See 
@geindex Python Enhancement Proposals; PEP 688#current-options
PEP 688@footnote{https://peps.python.org/pep-0688/#current-options} for more details.
(Contributed by Shantanu Jain in gh-91896@footnote{https://github.com/python/cpython/issues/91896}.)

@item 
@ref{34,,datetime}: @ref{4e3,,datetime.datetime}’s @ref{34f,,utcnow()} and
@ref{350,,utcfromtimestamp()} are deprecated and will be
removed in a future version. Instead, use timezone-aware objects to represent
datetimes in UTC: respectively, call @ref{712,,now()} and
@ref{713,,fromtimestamp()}  with the `tz' parameter set to
@ref{714,,datetime.UTC}.
(Contributed by Paul Ganssle in gh-103857@footnote{https://github.com/python/cpython/issues/103857}.)

@item 
@ref{3f,,email}: Deprecate the `isdst' parameter in @ref{2f9,,email.utils.localtime()}.
(Contributed by Alan Williams in gh-72346@footnote{https://github.com/python/cpython/issues/72346}.)

@item 
@ref{7c,,importlib.abc}: Deprecated the following classes, scheduled for removal in
Python 3.14:


@itemize *

@item 
@code{importlib.abc.ResourceReader}

@item 
@code{importlib.abc.Traversable}

@item 
@code{importlib.abc.TraversableResources}
@end itemize

Use @ref{80,,importlib.resources.abc} classes instead:


@itemize *

@item 
@ref{2fc,,importlib.resources.abc.Traversable}

@item 
@ref{2fb,,importlib.resources.abc.TraversableResources}
@end itemize

(Contributed by Jason R. Coombs and Hugo van Kemenade in gh-93963@footnote{https://github.com/python/cpython/issues/93963}.)

@item 
@ref{85,,itertools}: Deprecate the support for copy, deepcopy, and pickle operations,
which is undocumented, inefficient, historically buggy, and inconsistent.
This will be removed in 3.14 for a significant reduction in code
volume and maintenance burden.
(Contributed by Raymond Hettinger in gh-101588@footnote{https://github.com/python/cpython/issues/101588}.)

@item 
@ref{98,,multiprocessing}: In Python 3.14, the default @code{multiprocessing}
start method will change to a safer one on Linux, BSDs,
and other non-macOS POSIX platforms where @code{'fork'} is currently
the default (gh-84559@footnote{https://github.com/python/cpython/issues/84559}). Adding a runtime warning about this was deemed too
disruptive as the majority of code is not expected to care. Use the
@ref{24c,,get_context()} or
@ref{24d,,set_start_method()} APIs to explicitly specify when
your code `requires' @code{'fork'}.  See @ref{1d7,,contexts and start methods}.

@item 
@ref{ae,,pkgutil}: @code{pkgutil.find_loader()} and @code{pkgutil.get_loader()}
are deprecated and will be removed in Python 3.14;
use @ref{5af,,importlib.util.find_spec()} instead.
(Contributed by Nikita Sobolev in gh-97850@footnote{https://github.com/python/cpython/issues/97850}.)

@item 
@ref{b6,,pty}: The module has two undocumented @code{master_open()} and @code{slave_open()}
functions that have been deprecated since Python 2 but only gained a
proper @ref{1a4,,DeprecationWarning} in 3.12. Remove them in 3.14.
(Contributed by Soumendra Ganguly and Gregory P. Smith in gh-85984@footnote{https://github.com/python/cpython/issues/85984}.)

@item 
@ref{a5,,os}:


@itemize *

@item 
The @code{st_ctime} fields return by @ref{26f,,os.stat()} and @ref{6c9,,os.lstat()} on
Windows are deprecated. In a future release, they will contain the last
metadata change time, consistent with other platforms. For now, they still
contain the creation time, which is also available in the new @code{st_birthtime}
field. (Contributed by Steve Dower in gh-99726@footnote{https://github.com/python/cpython/issues/99726}.)

@item 
On POSIX platforms, @ref{4b6,,os.fork()} can now raise a
@ref{1a4,,DeprecationWarning} when it can detect being called from a
multithreaded process. There has always been a fundamental incompatibility
with the POSIX platform when doing so. Even if such code `appeared' to work.
We added the warning to raise awareness as issues encountered by code doing
this are becoming more frequent. See the @code{os.fork()} documentation for
more details along with this discussion on fork being incompatible with threads@footnote{https://discuss.python.org/t/concerns-regarding-deprecation-of-fork-with-alive-threads/33555} for `why' we’re now surfacing this
longstanding platform compatibility problem to developers.
@end itemize

When this warning appears due to usage of @ref{98,,multiprocessing} or
@ref{24,,concurrent.futures} the fix is to use a different
@code{multiprocessing} start method such as @code{"spawn"} or @code{"forkserver"}.

@item 
@ref{ca,,shutil}: The `onerror' argument of @ref{354,,shutil.rmtree()} is deprecated;
use `onexc' instead. (Contributed by Irit Katriel in gh-102828@footnote{https://github.com/python/cpython/issues/102828}.)

@item 
@ref{d4,,sqlite3}:


@itemize *

@item 
@ref{715,,default adapters and converters} are now deprecated.
Instead, use the @ref{716,,Adapter and converter recipes}
and tailor them to your needs.
(Contributed by Erlend E. Aasland in gh-90016@footnote{https://github.com/python/cpython/issues/90016}.)

@item 
In @ref{5b0,,execute()}, @ref{1a4,,DeprecationWarning} is now emitted
when @ref{5b2,,named placeholders} are used together with
parameters supplied as a @ref{717,,sequence} instead of as a @ref{184,,dict}.
Starting from Python 3.14, using named placeholders with parameters supplied
as a sequence will raise a @ref{307,,ProgrammingError}.
(Contributed by Erlend E. Aasland in gh-101698@footnote{https://github.com/python/cpython/issues/101698}.)
@end itemize

@item 
@ref{df,,sys}: The @ref{6e7,,sys.last_type}, @ref{6e8,,sys.last_value} and @ref{6e9,,sys.last_traceback}
fields are deprecated. Use @ref{6e6,,sys.last_exc} instead.
(Contributed by Irit Katriel in gh-102778@footnote{https://github.com/python/cpython/issues/102778}.)

@item 
@ref{e4,,tarfile}: Extracting tar archives without specifying `filter' is deprecated until
Python 3.14, when @code{'data'} filter will become the default.
See @ref{698,,Extraction filters} for details.

@item 
@ref{10b,,typing}:


@itemize *

@item 
@ref{718,,typing.Hashable} and @ref{719,,typing.Sized}, aliases for
@ref{71a,,collections.abc.Hashable} and @ref{71b,,collections.abc.Sized} respectively, are
deprecated. (gh-94309@footnote{https://github.com/python/cpython/issues/94309}.)

@item 
@ref{343,,typing.ByteString}, deprecated since Python 3.9, now causes a
@ref{1a4,,DeprecationWarning} to be emitted when it is used.
(Contributed by Alex Waygood in gh-91896@footnote{https://github.com/python/cpython/issues/91896}.)
@end itemize

@item 
@ref{12c,,xml.etree.ElementTree}: The module now emits @ref{1a4,,DeprecationWarning}
when testing the truth value of an @ref{361,,xml.etree.ElementTree.Element}.
Before, the Python implementation emitted @ref{659,,FutureWarning}, and the C
implementation emitted nothing.
(Contributed by Jacob Walls in gh-83122@footnote{https://github.com/python/cpython/issues/83122}.)

@item 
The 3-arg signatures (type, value, traceback) of @ref{71c,,coroutine throw()}, @ref{71d,,generator throw()} and
@ref{71e,,async generator throw()} are deprecated and
may be removed in a future version of Python. Use the single-arg versions
of these functions instead. (Contributed by Ofey Chan in gh-89874@footnote{https://github.com/python/cpython/issues/89874}.)

@item 
@ref{1a4,,DeprecationWarning} is now raised when @ref{325,,__package__} on a
module differs from
@ref{326,,__spec__.parent} (previously
it was @ref{71f,,ImportWarning}).
(Contributed by Brett Cannon in gh-65961@footnote{https://github.com/python/cpython/issues/65961}.)

@item 
Setting @ref{325,,__package__} or @ref{323,,__cached__} on a
module is deprecated, and will cease to be set or taken into consideration by
the import system in Python 3.14. (Contributed by Brett Cannon in gh-65961@footnote{https://github.com/python/cpython/issues/65961}.)

@item 
The bitwise inversion operator (@code{~}) on bool is deprecated. It will throw an
error in Python 3.16. Use @code{not} for logical negation of bools instead.
In the rare case that you really need the bitwise inversion of the underlying
@code{int}, convert to int explicitly: @code{~int(x)}. (Contributed by Tim Hoffmann
in gh-103487@footnote{https://github.com/python/cpython/issues/103487}.)

@item 
Accessing @ref{32e,,co_lnotab} on code objects was deprecated in
Python 3.10 via 
@geindex Python Enhancement Proposals; PEP 626
PEP 626@footnote{https://peps.python.org/pep-0626/},
but it only got a proper @ref{1a4,,DeprecationWarning} in 3.12.
May be removed in 3.15.
(Contributed by Nikita Sobolev in gh-101866@footnote{https://github.com/python/cpython/issues/101866}.)
@end itemize

@menu
* Pending removal in Python 3.13: Pending removal in Python 3 13. 
* Pending removal in Python 3.14: Pending removal in Python 3 14<3>. 
* Pending removal in Python 3.15: Pending removal in Python 3 15<5>. 
* Pending removal in Python 3.16: Pending removal in Python 3 16<5>. 
* Pending removal in Python 3.17: Pending removal in Python 3 17<3>. 
* Pending removal in future versions: Pending removal in future versions<5>. 

@end menu

@node Pending removal in Python 3 13,Pending removal in Python 3 14<3>,,Deprecated<2>
@anchor{whatsnew/3 12 pending-removal-in-python-3-13}@anchor{720}
@subsubsection Pending removal in Python 3.13


Modules (see 
@geindex Python Enhancement Proposals; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}):


@itemize *

@item 
@code{aifc}

@item 
@code{audioop}

@item 
@code{cgi}

@item 
@code{cgitb}

@item 
@code{chunk}

@item 
@code{crypt}

@item 
@code{imghdr}

@item 
@code{mailcap}

@item 
@code{msilib}

@item 
@code{nis}

@item 
@code{nntplib}

@item 
@code{ossaudiodev}

@item 
@code{pipes}

@item 
@code{sndhdr}

@item 
@code{spwd}

@item 
@code{sunau}

@item 
@code{telnetlib}

@item 
@code{uu}

@item 
@code{xdrlib}
@end itemize

Other modules:


@itemize *

@item 
@code{lib2to3}, and the @code{2to3} program (gh-84540@footnote{https://github.com/python/cpython/issues/84540})
@end itemize

APIs:


@itemize *

@item 
@code{configparser.LegacyInterpolation} (gh-90765@footnote{https://github.com/python/cpython/issues/90765})

@item 
@code{locale.resetlocale()} (gh-90817@footnote{https://github.com/python/cpython/issues/90817})

@item 
@code{turtle.RawTurtle.settiltangle()} (gh-50096@footnote{https://github.com/python/cpython/issues/50096})

@item 
@code{unittest.findTestCases()} (gh-50096@footnote{https://github.com/python/cpython/issues/50096})

@item 
@code{unittest.getTestCaseNames()} (gh-50096@footnote{https://github.com/python/cpython/issues/50096})

@item 
@code{unittest.makeSuite()} (gh-50096@footnote{https://github.com/python/cpython/issues/50096})

@item 
@code{unittest.TestProgram.usageExit()} (gh-67048@footnote{https://github.com/python/cpython/issues/67048})

@item 
@code{webbrowser.MacOSX} (gh-86421@footnote{https://github.com/python/cpython/issues/86421})

@item 
@ref{48f,,classmethod} descriptor chaining (gh-89519@footnote{https://github.com/python/cpython/issues/89519})
@end itemize

@node Pending removal in Python 3 14<3>,Pending removal in Python 3 15<5>,Pending removal in Python 3 13,Deprecated<2>
@anchor{whatsnew/3 12 pending-removal-in-python-3-14}@anchor{721}
@subsubsection Pending removal in Python 3.14



@itemize *

@item 
@ref{7,,argparse}: The `type', `choices', and `metavar' parameters
of @code{argparse.BooleanOptionalAction} are deprecated
and will be removed in 3.14.
(Contributed by Nikita Sobolev in gh-92248@footnote{https://github.com/python/cpython/issues/92248}.)

@item 
@ref{9,,ast}: The following features have been deprecated in documentation
since Python 3.8, now cause a @ref{1a4,,DeprecationWarning} to be emitted at
runtime when they are accessed or used, and will be removed in Python 3.14:


@itemize *

@item 
@code{ast.Num}

@item 
@code{ast.Str}

@item 
@code{ast.Bytes}

@item 
@code{ast.NameConstant}

@item 
@code{ast.Ellipsis}
@end itemize

Use @ref{2f1,,ast.Constant} instead.
(Contributed by Serhiy Storchaka in gh-90953@footnote{https://github.com/python/cpython/issues/90953}.)

@item 
@ref{b,,asyncio}:


@itemize *

@item 
The child watcher classes @code{asyncio.MultiLoopChildWatcher},
@code{asyncio.FastChildWatcher}, @code{asyncio.AbstractChildWatcher}
and @code{asyncio.SafeChildWatcher} are deprecated and
will be removed in Python 3.14.
(Contributed by Kumar Aditya in gh-94597@footnote{https://github.com/python/cpython/issues/94597}.)

@item 
@code{asyncio.set_child_watcher()}, @code{asyncio.get_child_watcher()},
@code{asyncio.AbstractEventLoopPolicy.set_child_watcher()} and
@code{asyncio.AbstractEventLoopPolicy.get_child_watcher()} are deprecated
and will be removed in Python 3.14.
(Contributed by Kumar Aditya in gh-94597@footnote{https://github.com/python/cpython/issues/94597}.)

@item 
The @ref{2f4,,get_event_loop()} method of the
default event loop policy now emits a @ref{1a4,,DeprecationWarning} if there
is no current event loop set and it decides to create one.
(Contributed by Serhiy Storchaka and Guido van Rossum in gh-100160@footnote{https://github.com/python/cpython/issues/100160}.)
@end itemize

@item 
@ref{3f,,email}: Deprecated the `isdst' parameter in @ref{2f9,,email.utils.localtime()}.
(Contributed by Alan Williams in gh-72346@footnote{https://github.com/python/cpython/issues/72346}.)

@item 
@ref{7c,,importlib.abc} deprecated classes:


@itemize *

@item 
@code{importlib.abc.ResourceReader}

@item 
@code{importlib.abc.Traversable}

@item 
@code{importlib.abc.TraversableResources}
@end itemize

Use @ref{80,,importlib.resources.abc} classes instead:


@itemize *

@item 
@ref{2fc,,importlib.resources.abc.Traversable}

@item 
@ref{2fb,,importlib.resources.abc.TraversableResources}
@end itemize

(Contributed by Jason R. Coombs and Hugo van Kemenade in gh-93963@footnote{https://github.com/python/cpython/issues/93963}.)

@item 
@ref{85,,itertools} had undocumented, inefficient, historically buggy,
and inconsistent support for copy, deepcopy, and pickle operations.
This will be removed in 3.14 for a significant reduction in code
volume and maintenance burden.
(Contributed by Raymond Hettinger in gh-101588@footnote{https://github.com/python/cpython/issues/101588}.)

@item 
@ref{98,,multiprocessing}: The default start method will change to a safer one on
Linux, BSDs, and other non-macOS POSIX platforms where @code{'fork'} is currently
the default (gh-84559@footnote{https://github.com/python/cpython/issues/84559}). Adding a runtime warning about this was deemed too
disruptive as the majority of code is not expected to care. Use the
@ref{24c,,get_context()} or
@ref{24d,,set_start_method()} APIs to explicitly specify when
your code `requires' @code{'fork'}.  See @ref{1d7,,Contexts and start methods}.

@item 
@ref{a8,,pathlib}: @ref{300,,is_relative_to()} and
@ref{2ff,,relative_to()}: passing additional arguments is
deprecated.

@item 
@ref{ae,,pkgutil}: @code{pkgutil.find_loader()} and @code{pkgutil.get_loader()}
now raise @ref{1a4,,DeprecationWarning};
use @ref{5af,,importlib.util.find_spec()} instead.
(Contributed by Nikita Sobolev in gh-97850@footnote{https://github.com/python/cpython/issues/97850}.)

@item 
@ref{b6,,pty}:


@itemize *

@item 
@code{master_open()}: use @ref{303,,pty.openpty()}.

@item 
@code{slave_open()}: use @ref{303,,pty.openpty()}.
@end itemize

@item 
@ref{d4,,sqlite3}:


@itemize *

@item 
@code{version} and @code{version_info}.

@item 
@ref{5b0,,execute()} and @ref{5b1,,executemany()}
if @ref{5b2,,named placeholders} are used and
`parameters' is a sequence instead of a @ref{184,,dict}.
@end itemize

@item 
@ref{10f,,urllib}:
@code{urllib.parse.Quoter} is deprecated: it was not intended to be a
public API.
(Contributed by Gregory P. Smith in gh-88168@footnote{https://github.com/python/cpython/issues/88168}.)
@end itemize

@node Pending removal in Python 3 15<5>,Pending removal in Python 3 16<5>,Pending removal in Python 3 14<3>,Deprecated<2>
@anchor{whatsnew/3 12 pending-removal-in-python-3-15}@anchor{722}
@subsubsection Pending removal in Python 3.15



@itemize *

@item 
The import system:


@itemize *

@item 
Setting @ref{323,,__cached__} on a module while
failing to set @ref{324,,__spec__.cached}
is deprecated. In Python 3.15, @code{__cached__} will cease to be set or
take into consideration by the import system or standard library. (gh-97879@footnote{https://github.com/python/cpython/issues/97879})

@item 
Setting @ref{325,,__package__} on a module while
failing to set @ref{326,,__spec__.parent}
is deprecated. In Python 3.15, @code{__package__} will cease to be set or
take into consideration by the import system or standard library. (gh-97879@footnote{https://github.com/python/cpython/issues/97879})
@end itemize

@item 
@ref{2e,,ctypes}:


@itemize *

@item 
The undocumented @code{ctypes.SetPointerType()} function
has been deprecated since Python 3.13.
@end itemize

@item 
@ref{76,,http.server}:


@itemize *

@item 
The obsolete and rarely used @ref{327,,CGIHTTPRequestHandler}
has been deprecated since Python 3.13.
No direct replacement exists.
`Anything' is better than CGI to interface
a web server with a request handler.

@item 
The @code{--cgi} flag to the @code{python -m http.server}
command-line interface has been deprecated since Python 3.13.
@end itemize

@item 
@ref{7b,,importlib}:


@itemize *

@item 
@code{load_module()} method: use @code{exec_module()} instead.
@end itemize

@item 
@ref{a8,,pathlib}:


@itemize *

@item 
@ref{328,,PurePath.is_reserved()}
has been deprecated since Python 3.13.
Use @ref{329,,os.path.isreserved()} to detect reserved paths on Windows.
@end itemize

@item 
@ref{af,,platform}:


@itemize *

@item 
@ref{32a,,java_ver()} has been deprecated since Python 3.13.
This function is only useful for Jython support, has a confusing API,
and is largely untested.
@end itemize

@item 
@ref{e1,,sysconfig}:


@itemize *

@item 
The `check_home' argument of @ref{32b,,sysconfig.is_python_build()} has been
deprecated since Python 3.12.
@end itemize

@item 
@ref{f3,,threading}:


@itemize *

@item 
@ref{32c,,RLock()} will take no arguments in Python 3.15.
Passing any arguments has been deprecated since Python 3.14,
as the Python version does not permit any arguments,
but the C version allows any number of positional or keyword arguments,
ignoring every argument.
@end itemize

@item 
@ref{10a,,types}:


@itemize *

@item 
@ref{32d,,types.CodeType}: Accessing @ref{32e,,co_lnotab} was
deprecated in 
@geindex Python Enhancement Proposals; PEP 626
PEP 626@footnote{https://peps.python.org/pep-0626/}
since 3.10 and was planned to be removed in 3.12,
but it only got a proper @ref{1a4,,DeprecationWarning} in 3.12.
May be removed in 3.15.
(Contributed by Nikita Sobolev in gh-101866@footnote{https://github.com/python/cpython/issues/101866}.)
@end itemize

@item 
@ref{10b,,typing}:


@itemize *

@item 
The undocumented keyword argument syntax for creating
@ref{32f,,NamedTuple} classes
(for example, @code{Point = NamedTuple("Point", x=int, y=int)})
has been deprecated since Python 3.13.
Use the class-based syntax or the functional syntax instead.

@item 
When using the functional syntax of @ref{330,,TypedDict}s, failing
to pass a value to the `fields' parameter (@code{TD = TypedDict("TD")}) or
passing @code{None} (@code{TD = TypedDict("TD", None)}) has been deprecated
since Python 3.13.
Use @code{class TD(TypedDict): pass} or @code{TD = TypedDict("TD", @{@})}
to create a TypedDict with zero field.

@item 
The @ref{331,,typing.no_type_check_decorator()} decorator function
has been deprecated since Python 3.13.
After eight years in the @ref{10b,,typing} module,
it has yet to be supported by any major type checker.
@end itemize

@item 
@ref{11a,,wave}:


@itemize *

@item 
The @ref{332,,getmark()}, @code{setmark()},
and @ref{333,,getmarkers()} methods of
the @ref{334,,Wave_read} and @ref{335,,Wave_write} classes
have been deprecated since Python 3.13.
@end itemize

@item 
@ref{139,,zipimport}:


@itemize *

@item 
@ref{336,,load_module()} has been deprecated since
Python 3.10. Use @ref{337,,exec_module()} instead.
(Contributed by Jiahao Li in gh-125746@footnote{https://github.com/python/cpython/issues/125746}.)
@end itemize
@end itemize

@node Pending removal in Python 3 16<5>,Pending removal in Python 3 17<3>,Pending removal in Python 3 15<5>,Deprecated<2>
@anchor{whatsnew/3 12 pending-removal-in-python-3-16}@anchor{723}
@subsubsection Pending removal in Python 3.16



@itemize *

@item 
The import system:


@itemize *

@item 
Setting @ref{339,,__loader__} on a module while
failing to set @ref{33a,,__spec__.loader}
is deprecated. In Python 3.16, @code{__loader__} will cease to be set or
taken into consideration by the import system or the standard library.
@end itemize

@item 
@ref{8,,array}:


@itemize *

@item 
The @code{'u'} format code (@code{wchar_t})
has been deprecated in documentation since Python 3.3
and at runtime since Python 3.13.
Use the @code{'w'} format code (@ref{33b,,Py_UCS4})
for Unicode characters instead.
@end itemize

@item 
@ref{b,,asyncio}:


@itemize *

@item 
@code{asyncio.iscoroutinefunction()} is deprecated
and will be removed in Python 3.16;
use @ref{30f,,inspect.iscoroutinefunction()} instead.
(Contributed by Jiahao Li and Kumar Aditya in gh-122875@footnote{https://github.com/python/cpython/issues/122875}.)

@item 
@ref{b,,asyncio} policy system is deprecated and will be removed in Python 3.16.
In particular, the following classes and functions are deprecated:


@itemize *

@item 
@ref{310,,asyncio.AbstractEventLoopPolicy}

@item 
@ref{311,,asyncio.DefaultEventLoopPolicy}

@item 
@ref{312,,asyncio.WindowsSelectorEventLoopPolicy}

@item 
@ref{313,,asyncio.WindowsProactorEventLoopPolicy}

@item 
@ref{314,,asyncio.get_event_loop_policy()}

@item 
@ref{315,,asyncio.set_event_loop_policy()}
@end itemize

Users should use @ref{2f5,,asyncio.run()} or @ref{2f7,,asyncio.Runner} with
`loop_factory' to use the desired event loop implementation.

For example, to use @ref{316,,asyncio.SelectorEventLoop} on Windows:

@example
import asyncio

async def main():
    ...

asyncio.run(main(), loop_factory=asyncio.SelectorEventLoop)
@end example

(Contributed by Kumar Aditya in gh-127949@footnote{https://github.com/python/cpython/issues/127949}.)
@end itemize

@item 
@ref{13,,builtins}:


@itemize *

@item 
Bitwise inversion on boolean types, @code{~True} or @code{~False}
has been deprecated since Python 3.12,
as it produces surprising and unintuitive results (@code{-2} and @code{-1}).
Use @code{not x} instead for the logical negation of a Boolean.
In the rare case that you need the bitwise inversion of
the underlying integer, convert to @code{int} explicitly (@code{~int(x)}).
@end itemize

@item 
@ref{63,,functools}:


@itemize *

@item 
Calling the Python implementation of @ref{21c,,functools.reduce()} with `function'
or `sequence' as keyword arguments has been deprecated since Python 3.14.
@end itemize

@item 
@ref{8b,,logging}:

Support for custom logging handlers with the `strm' argument is deprecated
and scheduled for removal in Python 3.16. Define handlers with the `stream'
argument instead. (Contributed by Mariusz Felisiak in gh-115032@footnote{https://github.com/python/cpython/issues/115032}.)

@item 
@ref{93,,mimetypes}:


@itemize *

@item 
Valid extensions start with a ‘.’ or are empty for
@ref{31b,,mimetypes.MimeTypes.add_type()}.
Undotted extensions are deprecated and will
raise a @ref{2ee,,ValueError} in Python 3.16.
(Contributed by Hugo van Kemenade in gh-75223@footnote{https://github.com/python/cpython/issues/75223}.)
@end itemize

@item 
@ref{ca,,shutil}:


@itemize *

@item 
The @code{ExecError} exception
has been deprecated since Python 3.14.
It has not been used by any function in @code{shutil} since Python 3.4,
and is now an alias of @ref{246,,RuntimeError}.
@end itemize

@item 
@ref{de,,symtable}:


@itemize *

@item 
The @ref{31f,,Class.get_methods} method
has been deprecated since Python 3.14.
@end itemize

@item 
@ref{df,,sys}:


@itemize *

@item 
The @ref{33c,,_enablelegacywindowsfsencoding()} function
has been deprecated since Python 3.13.
Use the 
@geindex PYTHONLEGACYWINDOWSFSENCODING
@geindex environment variable; PYTHONLEGACYWINDOWSFSENCODING
@ref{33d,,PYTHONLEGACYWINDOWSFSENCODING} environment variable instead.
@end itemize

@item 
@ref{e1,,sysconfig}:


@itemize *

@item 
The @code{sysconfig.expand_makefile_vars()} function
has been deprecated since Python 3.14.
Use the @code{vars} argument of @ref{33e,,sysconfig.get_paths()} instead.
@end itemize

@item 
@ref{e4,,tarfile}:


@itemize *

@item 
The undocumented and unused @code{TarFile.tarfile} attribute
has been deprecated since Python 3.13.
@end itemize
@end itemize

@node Pending removal in Python 3 17<3>,Pending removal in future versions<5>,Pending removal in Python 3 16<5>,Deprecated<2>
@anchor{whatsnew/3 12 pending-removal-in-python-3-17}@anchor{724}
@subsubsection Pending removal in Python 3.17



@itemize *

@item 
@ref{1f,,collections.abc}:


@itemize -

@item 
@ref{340,,collections.abc.ByteString} is scheduled for removal in Python 3.17.

Use @code{isinstance(obj, collections.abc.Buffer)} to test if @code{obj}
implements the @ref{262,,buffer protocol} at runtime. For use
in type annotations, either use @ref{341,,Buffer} or a union
that explicitly specifies the types your code supports (e.g.,
@code{bytes | bytearray | memoryview}).

@code{ByteString} was originally intended to be an abstract class that
would serve as a supertype of both @ref{193,,bytes} and @ref{342,,bytearray}.
However, since the ABC never had any methods, knowing that an object was an
instance of @code{ByteString} never actually told you anything useful
about the object. Other common buffer types such as @ref{166,,memoryview}
were also never understood as subtypes of @code{ByteString} (either at
runtime or by static type checkers).

See 
@geindex Python Enhancement Proposals; PEP 688#current-options
PEP 688@footnote{https://peps.python.org/pep-0688/#current-options} for more details.
(Contributed by Shantanu Jain in gh-91896@footnote{https://github.com/python/cpython/issues/91896}.)
@end itemize

@item 
@ref{10b,,typing}:


@itemize -

@item 
Before Python 3.14, old-style unions were implemented using the private class
@code{typing._UnionGenericAlias}. This class is no longer needed for the implementation,
but it has been retained for backward compatibility, with removal scheduled for Python
3.17. Users should use documented introspection helpers like @ref{2ad,,typing.get_origin()}
and @ref{2ae,,typing.get_args()} instead of relying on private implementation details.

@item 
@ref{343,,typing.ByteString}, deprecated since Python 3.9, is scheduled for removal in
Python 3.17.

Use @code{isinstance(obj, collections.abc.Buffer)} to test if @code{obj}
implements the @ref{262,,buffer protocol} at runtime. For use
in type annotations, either use @ref{341,,Buffer} or a union
that explicitly specifies the types your code supports (e.g.,
@code{bytes | bytearray | memoryview}).

@code{ByteString} was originally intended to be an abstract class that
would serve as a supertype of both @ref{193,,bytes} and @ref{342,,bytearray}.
However, since the ABC never had any methods, knowing that an object was an
instance of @code{ByteString} never actually told you anything useful
about the object. Other common buffer types such as @ref{166,,memoryview}
were also never understood as subtypes of @code{ByteString} (either at
runtime or by static type checkers).

See 
@geindex Python Enhancement Proposals; PEP 688#current-options
PEP 688@footnote{https://peps.python.org/pep-0688/#current-options} for more details.
(Contributed by Shantanu Jain in gh-91896@footnote{https://github.com/python/cpython/issues/91896}.)
@end itemize
@end itemize

@node Pending removal in future versions<5>,,Pending removal in Python 3 17<3>,Deprecated<2>
@anchor{whatsnew/3 12 pending-removal-in-future-versions}@anchor{725}
@subsubsection Pending removal in future versions


The following APIs will be removed in the future,
although there is currently no date scheduled for their removal.


@itemize *

@item 
@ref{7,,argparse}:


@itemize *

@item 
Nesting argument groups and nesting mutually exclusive
groups are deprecated.

@item 
Passing the undocumented keyword argument `prefix_chars' to
@ref{2ed,,add_argument_group()} is now
deprecated.

@item 
The @ref{30e,,argparse.FileType} type converter is deprecated.
@end itemize

@item 
@ref{13,,builtins}:


@itemize *

@item 
Generators: @code{throw(type, exc, tb)} and @code{athrow(type, exc, tb)}
signature is deprecated: use @code{throw(exc)} and @code{athrow(exc)} instead,
the single argument signature.

@item 
Currently Python accepts numeric literals immediately followed by keywords,
for example @code{0in x}, @code{1or x}, @code{0if 1else 2}.  It allows confusing and
ambiguous expressions like @code{[0x1for x in y]} (which can be interpreted as
@code{[0x1 for x in y]} or @code{[0x1f or x in y]}).  A syntax warning is raised
if the numeric literal is immediately followed by one of keywords
@ref{347,,and}, @ref{17d,,else}, @ref{348,,for}, @ref{182,,if},
@ref{349,,in}, @ref{34a,,is} and @ref{34b,,or}.  In a future release it
will be changed to a syntax error. (gh-87999@footnote{https://github.com/python/cpython/issues/87999})

@item 
Support for @code{__index__()} and @code{__int__()} method returning non-int type:
these methods will be required to return an instance of a strict subclass of
@ref{19c,,int}.

@item 
Support for @code{__float__()} method returning a strict subclass of
@ref{197,,float}: these methods will be required to return an instance of
@code{float}.

@item 
Support for @code{__complex__()} method returning a strict subclass of
@ref{198,,complex}: these methods will be required to return an instance of
@code{complex}.

@item 
Passing a complex number as the `real' or `imag' argument in the
@ref{198,,complex()} constructor is now deprecated; it should only be passed
as a single positional argument.
(Contributed by Serhiy Storchaka in gh-109218@footnote{https://github.com/python/cpython/issues/109218}.)
@end itemize

@item 
@ref{15,,calendar}: @code{calendar.January} and @code{calendar.February} constants are
deprecated and replaced by @ref{34c,,calendar.JANUARY} and
@ref{34d,,calendar.FEBRUARY}.
(Contributed by Prince Roshan in gh-103636@footnote{https://github.com/python/cpython/issues/103636}.)

@item 
@ref{1c,,codecs}: use @ref{318,,open()} instead of @ref{317,,codecs.open()}. (gh-133038@footnote{https://github.com/python/cpython/issues/133038})

@item 
@ref{32e,,codeobject.co_lnotab}: use the @ref{34e,,codeobject.co_lines()} method
instead.

@item 
@ref{34,,datetime}:


@itemize *

@item 
@ref{34f,,utcnow()}:
use @code{datetime.datetime.now(tz=datetime.UTC)}.

@item 
@ref{350,,utcfromtimestamp()}:
use @code{datetime.datetime.fromtimestamp(timestamp, tz=datetime.UTC)}.
@end itemize

@item 
@ref{67,,gettext}: Plural value must be an integer.

@item 
@ref{7b,,importlib}:


@itemize *

@item 
@ref{351,,cache_from_source()} `debug_override' parameter is
deprecated: use the `optimization' parameter instead.
@end itemize

@item 
@ref{7e,,importlib.metadata}:


@itemize *

@item 
@code{EntryPoints} tuple interface.

@item 
Implicit @code{None} on return values.
@end itemize

@item 
@ref{8b,,logging}: the @code{warn()} method has been deprecated
since Python 3.3, use @ref{352,,warning()} instead.

@item 
@ref{8f,,mailbox}: Use of StringIO input and text mode is deprecated, use
BytesIO and binary mode instead.

@item 
@ref{a5,,os}: Calling @ref{353,,os.register_at_fork()} in multi-threaded process.

@item 
@code{pydoc.ErrorDuringImport}: A tuple value for `exc_info' parameter is
deprecated, use an exception instance.

@item 
@ref{be,,re}: More strict rules are now applied for numerical group references
and group names in regular expressions.  Only sequence of ASCII digits is now
accepted as a numerical reference.  The group name in bytes patterns and
replacement strings can now only contain ASCII letters and digits and
underscore.
(Contributed by Serhiy Storchaka in gh-91760@footnote{https://github.com/python/cpython/issues/91760}.)

@item 
@code{sre_compile}, @code{sre_constants} and @code{sre_parse} modules.

@item 
@ref{ca,,shutil}: @ref{354,,rmtree()}’s `onerror' parameter is deprecated in
Python 3.12; use the `onexc' parameter instead.

@item 
@ref{d5,,ssl} options and protocols:


@itemize *

@item 
@ref{355,,ssl.SSLContext} without protocol argument is deprecated.

@item 
@ref{355,,ssl.SSLContext}: @ref{356,,set_npn_protocols()} and
@code{selected_npn_protocol()} are deprecated: use ALPN
instead.

@item 
@code{ssl.OP_NO_SSL*} options

@item 
@code{ssl.OP_NO_TLS*} options

@item 
@code{ssl.PROTOCOL_SSLv3}

@item 
@code{ssl.PROTOCOL_TLS}

@item 
@code{ssl.PROTOCOL_TLSv1}

@item 
@code{ssl.PROTOCOL_TLSv1_1}

@item 
@code{ssl.PROTOCOL_TLSv1_2}

@item 
@code{ssl.TLSVersion.SSLv3}

@item 
@code{ssl.TLSVersion.TLSv1}

@item 
@code{ssl.TLSVersion.TLSv1_1}
@end itemize

@item 
@ref{f3,,threading} methods:


@itemize *

@item 
@code{threading.Condition.notifyAll()}: use @ref{357,,notify_all()}.

@item 
@code{threading.Event.isSet()}: use @ref{358,,is_set()}.

@item 
@code{threading.Thread.isDaemon()}, @ref{359,,threading.Thread.setDaemon()}:
use @ref{35a,,threading.Thread.daemon} attribute.

@item 
@code{threading.Thread.getName()}, @ref{35b,,threading.Thread.setName()}:
use @ref{2a2,,threading.Thread.name} attribute.

@item 
@code{threading.currentThread()}: use @ref{35c,,threading.current_thread()}.

@item 
@code{threading.activeCount()}: use @ref{35d,,threading.active_count()}.
@end itemize

@item 
@ref{35e,,typing.Text} (gh-92332@footnote{https://github.com/python/cpython/issues/92332}).

@item 
The internal class @code{typing._UnionGenericAlias} is no longer used to implement
@ref{2aa,,typing.Union}. To preserve compatibility with users using this private
class, a compatibility shim will be provided until at least Python 3.17. (Contributed by
Jelle Zijlstra in gh-105499@footnote{https://github.com/python/cpython/issues/105499}.)

@item 
@ref{35f,,unittest.IsolatedAsyncioTestCase}: it is deprecated to return a value
that is not @code{None} from a test case.

@item 
@ref{111,,urllib.parse} deprecated functions: @ref{360,,urlparse()} instead


@itemize *

@item 
@code{splitattr()}

@item 
@code{splithost()}

@item 
@code{splitnport()}

@item 
@code{splitpasswd()}

@item 
@code{splitport()}

@item 
@code{splitquery()}

@item 
@code{splittag()}

@item 
@code{splittype()}

@item 
@code{splituser()}

@item 
@code{splitvalue()}

@item 
@code{to_bytes()}
@end itemize

@item 
@ref{11f,,wsgiref}: @code{SimpleHandler.stdout.write()} should not do partial
writes.

@item 
@ref{12c,,xml.etree.ElementTree}: Testing the truth value of an
@ref{361,,Element} is deprecated. In a future release it
will always return @code{True}. Prefer explicit @code{len(elem)} or
@code{elem is not None} tests instead.

@item 
@ref{294,,sys._clear_type_cache()} is deprecated:
use @ref{362,,sys._clear_internal_caches()} instead.
@end itemize

@node Removed<2>,Porting to Python 3 12,Deprecated<2>,What’s New In Python 3 12
@anchor{whatsnew/3 12 removed}@anchor{726}@anchor{whatsnew/3 12 whatsnew312-removed}@anchor{727}
@subsection Removed


@menu
* asynchat and asyncore:: 
* configparser: configparser<4>. 
* distutils:: 
* ensurepip:: 
* enum: enum<2>. 
* ftplib:: 
* gzip:: 
* hashlib:: 
* importlib: importlib<2>. 
* imp:: 
* io: io<4>. 
* locale: locale<2>. 
* smtpd:: 
* sqlite3: sqlite3<4>. 
* ssl: ssl<3>. 
* unittest: unittest<4>. 
* webbrowser: webbrowser<3>. 
* xml.etree.ElementTree: xml etree ElementTree. 
* zipimport: zipimport<2>. 
* Others:: 

@end menu

@node asynchat and asyncore,configparser<4>,,Removed<2>
@anchor{whatsnew/3 12 asynchat-and-asyncore}@anchor{728}
@subsubsection asynchat and asyncore



@itemize *

@item 
These two modules have been removed
according to the schedule in 
@geindex Python Enhancement Proposals; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/},
having been deprecated in Python 3.6.
Use @ref{b,,asyncio} instead.
(Contributed by Nikita Sobolev in gh-96580@footnote{https://github.com/python/cpython/issues/96580}.)
@end itemize

@node configparser<4>,distutils,asynchat and asyncore,Removed<2>
@anchor{whatsnew/3 12 configparser}@anchor{729}
@subsubsection configparser



@itemize *

@item 
Several names deprecated in the @ref{26,,configparser} way back in 3.2 have
been removed per gh-89336@footnote{https://github.com/python/cpython/issues/89336}:


@itemize *

@item 
@ref{72a,,configparser.ParsingError} no longer has a @code{filename} attribute
or argument. Use the @code{source} attribute and argument instead.

@item 
@ref{26,,configparser} no longer has a @code{SafeConfigParser} class. Use the
shorter @ref{4df,,ConfigParser} name instead.

@item 
@ref{4df,,configparser.ConfigParser} no longer has a @code{readfp} method.
Use @ref{72b,,read_file()} instead.
@end itemize
@end itemize

@node distutils,ensurepip,configparser<4>,Removed<2>
@anchor{whatsnew/3 12 distutils}@anchor{72c}@anchor{whatsnew/3 12 whatsnew312-removed-distutils}@anchor{72d}
@subsubsection distutils



@itemize *

@item 
Remove the @code{distutils} package. It was deprecated in Python 3.10 by
@geindex Python Enhancement Proposals; PEP 632
PEP 632@footnote{https://peps.python.org/pep-0632/} “Deprecate distutils module”. For projects still using
@code{distutils} and cannot be updated to something else, the @code{setuptools}
project can be installed: it still provides @code{distutils}.
(Contributed by Victor Stinner in gh-92584@footnote{https://github.com/python/cpython/issues/92584}.)
@end itemize

@node ensurepip,enum<2>,distutils,Removed<2>
@anchor{whatsnew/3 12 ensurepip}@anchor{72e}
@subsubsection ensurepip



@itemize *

@item 
Remove the bundled setuptools wheel from @ref{59,,ensurepip},
and stop installing setuptools in environments created by @ref{118,,venv}.

@code{pip (>= 22.1)} does not require setuptools to be installed in the
environment. @code{setuptools}-based (and @code{distutils}-based) packages
can still be used with @code{pip install}, since pip will provide
@code{setuptools} in the build environment it uses for building a
package.

@code{easy_install}, @code{pkg_resources}, @code{setuptools} and @code{distutils}
are no longer provided by default in environments created with
@code{venv} or bootstrapped with @code{ensurepip}, since they are part of
the @code{setuptools} package. For projects relying on these at runtime,
the @code{setuptools} project should be declared as a dependency and
installed separately (typically, using pip).

(Contributed by Pradyun Gedam in gh-95299@footnote{https://github.com/python/cpython/issues/95299}.)
@end itemize

@node enum<2>,ftplib,ensurepip,Removed<2>
@anchor{whatsnew/3 12 enum}@anchor{72f}
@subsubsection enum



@itemize *

@item 
Remove @ref{5a,,enum}’s @code{EnumMeta.__getattr__}, which is no longer needed for
enum attribute access.
(Contributed by Ethan Furman in gh-95083@footnote{https://github.com/python/cpython/issues/95083}.)
@end itemize

@node ftplib,gzip,enum<2>,Removed<2>
@anchor{whatsnew/3 12 ftplib}@anchor{730}
@subsubsection ftplib



@itemize *

@item 
Remove @ref{62,,ftplib}’s @code{FTP_TLS.ssl_version} class attribute: use the
`context' parameter instead.
(Contributed by Victor Stinner in gh-94172@footnote{https://github.com/python/cpython/issues/94172}.)
@end itemize

@node gzip,hashlib,ftplib,Removed<2>
@anchor{whatsnew/3 12 gzip}@anchor{731}
@subsubsection gzip



@itemize *

@item 
Remove the @code{filename} attribute of @ref{6b,,gzip}’s @ref{65c,,gzip.GzipFile},
deprecated since Python 2.6, use the @ref{732,,name} attribute
instead. In write mode, the @code{filename} attribute added @code{'.gz'} file
extension if it was not present.
(Contributed by Victor Stinner in gh-94196@footnote{https://github.com/python/cpython/issues/94196}.)
@end itemize

@node hashlib,importlib<2>,gzip,Removed<2>
@anchor{whatsnew/3 12 hashlib}@anchor{733}
@subsubsection hashlib



@itemize *

@item 
Remove the pure Python implementation of @ref{6c,,hashlib}’s
@ref{734,,hashlib.pbkdf2_hmac()}, deprecated in Python 3.10. Python 3.10 and
newer requires OpenSSL 1.1.1 (
@geindex Python Enhancement Proposals; PEP 644
PEP 644@footnote{https://peps.python.org/pep-0644/}): this OpenSSL version provides
a C implementation of @code{pbkdf2_hmac()} which is faster.
(Contributed by Victor Stinner in gh-94199@footnote{https://github.com/python/cpython/issues/94199}.)
@end itemize

@node importlib<2>,imp,hashlib,Removed<2>
@anchor{whatsnew/3 12 importlib}@anchor{735}
@subsubsection importlib



@itemize *

@item 
Many previously deprecated cleanups in @ref{7b,,importlib} have now been
completed:


@itemize *

@item 
References to, and support for @code{module_repr()} has been removed.
(Contributed by Barry Warsaw in gh-97850@footnote{https://github.com/python/cpython/issues/97850}.)

@item 
@code{importlib.util.set_package}, @code{importlib.util.set_loader} and
@code{importlib.util.module_for_loader} have all been removed. (Contributed by
Brett Cannon and Nikita Sobolev in gh-65961@footnote{https://github.com/python/cpython/issues/65961} and gh-97850@footnote{https://github.com/python/cpython/issues/97850}.)

@item 
Support for @code{find_loader()} and @code{find_module()} APIs have been
removed.  (Contributed by Barry Warsaw in gh-98040@footnote{https://github.com/python/cpython/issues/98040}.)

@item 
@code{importlib.abc.Finder}, @code{pkgutil.ImpImporter}, and @code{pkgutil.ImpLoader}
have been removed.  (Contributed by Barry Warsaw in gh-98040@footnote{https://github.com/python/cpython/issues/98040}.)
@end itemize
@end itemize

@node imp,io<4>,importlib<2>,Removed<2>
@anchor{whatsnew/3 12 imp}@anchor{736}@anchor{whatsnew/3 12 whatsnew312-removed-imp}@anchor{737}
@subsubsection imp



@itemize *

@item 
The @code{imp} module has been removed.  (Contributed by Barry Warsaw in
gh-98040@footnote{https://github.com/python/cpython/issues/98040}.)

To migrate, consult the following correspondence table:

@quotation


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

imp

@tab

importlib

@item

@code{imp.NullImporter}

@tab

Insert @code{None} into @code{sys.path_importer_cache}

@item

@code{imp.cache_from_source()}

@tab

@ref{351,,importlib.util.cache_from_source()}

@item

@code{imp.find_module()}

@tab

@ref{5af,,importlib.util.find_spec()}

@item

@code{imp.get_magic()}

@tab

@ref{738,,importlib.util.MAGIC_NUMBER}

@item

@code{imp.get_suffixes()}

@tab

@ref{739,,importlib.machinery.SOURCE_SUFFIXES}, @ref{73a,,importlib.machinery.EXTENSION_SUFFIXES}, and @ref{73b,,importlib.machinery.BYTECODE_SUFFIXES}

@item

@code{imp.get_tag()}

@tab

@ref{73c,,sys.implementation.cache_tag}

@item

@code{imp.load_module()}

@tab

@ref{73d,,importlib.import_module()}

@item

@code{imp.new_module(name)}

@tab

@code{types.ModuleType(name)}

@item

@code{imp.reload()}

@tab

@ref{73e,,importlib.reload()}

@item

@code{imp.source_from_cache()}

@tab

@ref{73f,,importlib.util.source_from_cache()}

@item

@code{imp.load_source()}

@tab

`See below'

@end multitable

@end quotation

Replace @code{imp.load_source()} with:

@example
import importlib.util
import importlib.machinery

def load_source(modname, filename):
    loader = importlib.machinery.SourceFileLoader(modname, filename)
    spec = importlib.util.spec_from_file_location(modname, filename, loader=loader)
    module = importlib.util.module_from_spec(spec)
    # The module is always executed and not cached in sys.modules.
    # Uncomment the following line to cache the module.
    # sys.modules[module.__name__] = module
    loader.exec_module(module)
    return module
@end example

@item 
Remove @code{imp} functions and attributes with no replacements:


@itemize *

@item 
Undocumented functions:


@itemize *

@item 
@code{imp.init_builtin()}

@item 
@code{imp.load_compiled()}

@item 
@code{imp.load_dynamic()}

@item 
@code{imp.load_package()}
@end itemize

@item 
@code{imp.lock_held()}, @code{imp.acquire_lock()}, @code{imp.release_lock()}:
the locking scheme has changed in Python 3.3 to per-module locks.

@item 
@code{imp.find_module()} constants: @code{SEARCH_ERROR}, @code{PY_SOURCE},
@code{PY_COMPILED}, @code{C_EXTENSION}, @code{PY_RESOURCE}, @code{PKG_DIRECTORY},
@code{C_BUILTIN}, @code{PY_FROZEN}, @code{PY_CODERESOURCE}, @code{IMP_HOOK}.
@end itemize
@end itemize

@node io<4>,locale<2>,imp,Removed<2>
@anchor{whatsnew/3 12 io}@anchor{740}
@subsubsection io



@itemize *

@item 
Remove @ref{83,,io}’s @code{io.OpenWrapper} and @code{_pyio.OpenWrapper}, deprecated in Python
3.10: just use @ref{318,,open()} instead. The @code{open()} (@ref{741,,io.open()})
function is a built-in function. Since Python 3.10, @code{_pyio.open()} is
also a static method.
(Contributed by Victor Stinner in gh-94169@footnote{https://github.com/python/cpython/issues/94169}.)
@end itemize

@node locale<2>,smtpd,io<4>,Removed<2>
@anchor{whatsnew/3 12 locale}@anchor{742}
@subsubsection locale



@itemize *

@item 
Remove @ref{8a,,locale}’s @code{locale.format()} function, deprecated in Python 3.7:
use @ref{743,,locale.format_string()} instead.
(Contributed by Victor Stinner in gh-94226@footnote{https://github.com/python/cpython/issues/94226}.)
@end itemize

@node smtpd,sqlite3<4>,locale<2>,Removed<2>
@anchor{whatsnew/3 12 smtpd}@anchor{744}
@subsubsection smtpd



@itemize *

@item 
The @code{smtpd} module has been removed according to the schedule in 
@geindex Python Enhancement Proposals; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/},
having been deprecated in Python 3.4.7 and 3.5.4.
Use the aiosmtpd@footnote{https://pypi.org/project/aiosmtpd/} PyPI module or any other
@ref{b,,asyncio}-based server instead.
(Contributed by Oleg Iarygin in gh-93243@footnote{https://github.com/python/cpython/issues/93243}.)
@end itemize

@node sqlite3<4>,ssl<3>,smtpd,Removed<2>
@anchor{whatsnew/3 12 id2}@anchor{745}
@subsubsection sqlite3



@itemize *

@item 
The following undocumented @ref{d4,,sqlite3} features, deprecated in Python
3.10, are now removed:


@itemize *

@item 
@code{sqlite3.enable_shared_cache()}

@item 
@code{sqlite3.OptimizedUnicode}
@end itemize

If a shared cache must be used, open the database in URI mode using the
@code{cache=shared} query parameter.

The @code{sqlite3.OptimizedUnicode} text factory has been an alias for
@ref{16a,,str} since Python 3.3. Code that previously set the text factory to
@code{OptimizedUnicode} can either use @code{str} explicitly, or rely on the
default value which is also @code{str}.

(Contributed by Erlend E. Aasland in gh-92548@footnote{https://github.com/python/cpython/issues/92548}.)
@end itemize

@node ssl<3>,unittest<4>,sqlite3<4>,Removed<2>
@anchor{whatsnew/3 12 ssl}@anchor{746}
@subsubsection ssl



@itemize *

@item 
Remove @ref{d5,,ssl}’s @code{ssl.RAND_pseudo_bytes()} function, deprecated in Python 3.6:
use @ref{747,,os.urandom()} or @ref{748,,ssl.RAND_bytes()} instead.
(Contributed by Victor Stinner in gh-94199@footnote{https://github.com/python/cpython/issues/94199}.)

@item 
Remove the @code{ssl.match_hostname()} function.
It was deprecated in Python 3.7. OpenSSL performs
hostname matching since Python 3.7, Python no longer uses the
@code{ssl.match_hostname()} function.
(Contributed by Victor Stinner in gh-94199@footnote{https://github.com/python/cpython/issues/94199}.)

@item 
Remove the @code{ssl.wrap_socket()} function, deprecated in Python 3.7:
instead, create a @ref{355,,ssl.SSLContext} object and call its
@ref{749,,ssl.SSLContext.wrap_socket} method. Any package that still uses
@code{ssl.wrap_socket()} is broken and insecure. The function neither sends a
SNI TLS extension nor validates the server hostname. Code is subject to 
@geindex Common Weakness Enumeration; CWE 295
CWE 295@footnote{https://cwe.mitre.org/data/definitions/295.html}
(Improper Certificate Validation).
(Contributed by Victor Stinner in gh-94199@footnote{https://github.com/python/cpython/issues/94199}.)
@end itemize

@node unittest<4>,webbrowser<3>,ssl<3>,Removed<2>
@anchor{whatsnew/3 12 id3}@anchor{74a}
@subsubsection unittest



@itemize *

@item 
Remove many long-deprecated @ref{10d,,unittest} features:


@itemize *

@item 
A number of @ref{2b5,,TestCase} method aliases:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxx} 
@headitem

Deprecated alias

@tab

Method Name

@tab

Deprecated in

@item

@code{failUnless}

@tab

@ref{74b,,assertTrue()}

@tab

3.1

@item

@code{failIf}

@tab

@ref{74c,,assertFalse()}

@tab

3.1

@item

@code{failUnlessEqual}

@tab

@ref{74d,,assertEqual()}

@tab

3.1

@item

@code{failIfEqual}

@tab

@ref{74e,,assertNotEqual()}

@tab

3.1

@item

@code{failUnlessAlmostEqual}

@tab

@ref{74f,,assertAlmostEqual()}

@tab

3.1

@item

@code{failIfAlmostEqual}

@tab

@ref{750,,assertNotAlmostEqual()}

@tab

3.1

@item

@code{failUnlessRaises}

@tab

@ref{751,,assertRaises()}

@tab

3.1

@item

@code{assert_}

@tab

@ref{74b,,assertTrue()}

@tab

3.2

@item

@code{assertEquals}

@tab

@ref{74d,,assertEqual()}

@tab

3.2

@item

@code{assertNotEquals}

@tab

@ref{74e,,assertNotEqual()}

@tab

3.2

@item

@code{assertAlmostEquals}

@tab

@ref{74f,,assertAlmostEqual()}

@tab

3.2

@item

@code{assertNotAlmostEquals}

@tab

@ref{750,,assertNotAlmostEqual()}

@tab

3.2

@item

@code{assertRegexpMatches}

@tab

@ref{752,,assertRegex()}

@tab

3.2

@item

@code{assertRaisesRegexp}

@tab

@ref{753,,assertRaisesRegex()}

@tab

3.2

@item

@code{assertNotRegexpMatches}

@tab

@ref{754,,assertNotRegex()}

@tab

3.5

@end multitable


You can use @indicateurl{https://github.com/isidentical/teyit} to automatically modernise
your unit tests.

@item 
Undocumented and broken @ref{2b5,,TestCase} method
@code{assertDictContainsSubset} (deprecated in Python 3.2).

@item 
Undocumented @ref{594,,TestLoader.loadTestsFromModule} parameter `use_load_tests'
(deprecated and ignored since Python 3.5).

@item 
An alias of the @ref{755,,TextTestResult} class:
@code{_TextTestResult} (deprecated in Python 3.2).
@end itemize

(Contributed by Serhiy Storchaka in gh-89325@footnote{https://github.com/python/cpython/issues/89325}.)
@end itemize

@node webbrowser<3>,xml etree ElementTree,unittest<4>,Removed<2>
@anchor{whatsnew/3 12 webbrowser}@anchor{756}
@subsubsection webbrowser



@itemize *

@item 
Remove support for obsolete browsers from @ref{11c,,webbrowser}.
The removed browsers include: Grail, Mosaic, Netscape, Galeon, Skipstone,
Iceape, Firebird, and Firefox versions 35 and below (gh-102871@footnote{https://github.com/python/cpython/issues/102871}).
@end itemize

@node xml etree ElementTree,zipimport<2>,webbrowser<3>,Removed<2>
@anchor{whatsnew/3 12 xml-etree-elementtree}@anchor{757}
@subsubsection xml.etree.ElementTree



@itemize *

@item 
Remove the @code{ElementTree.Element.copy()} method of the
pure Python implementation, deprecated in Python 3.10, use the
@ref{758,,copy.copy()} function instead.  The C implementation of @ref{12c,,xml.etree.ElementTree}
has no @code{copy()} method, only a @code{__copy__()} method.
(Contributed by Victor Stinner in gh-94383@footnote{https://github.com/python/cpython/issues/94383}.)
@end itemize

@node zipimport<2>,Others,xml etree ElementTree,Removed<2>
@anchor{whatsnew/3 12 zipimport}@anchor{759}
@subsubsection zipimport



@itemize *

@item 
Remove @ref{139,,zipimport}’s @code{find_loader()} and @code{find_module()} methods,
deprecated in Python 3.10: use the @code{find_spec()} method instead.  See
@geindex Python Enhancement Proposals; PEP 451
PEP 451@footnote{https://peps.python.org/pep-0451/} for the rationale.
(Contributed by Victor Stinner in gh-94379@footnote{https://github.com/python/cpython/issues/94379}.)
@end itemize

@node Others,,zipimport<2>,Removed<2>
@anchor{whatsnew/3 12 others}@anchor{75a}
@subsubsection Others



@itemize *

@item 
Remove the @code{suspicious} rule from the documentation @code{Makefile} and
@code{Doc/tools/rstlint.py}, both in favor of sphinx-lint@footnote{https://github.com/sphinx-contrib/sphinx-lint}.
(Contributed by Julien Palard in gh-98179@footnote{https://github.com/python/cpython/issues/98179}.)

@item 
Remove the `keyfile' and `certfile' parameters from the
@ref{62,,ftplib}, @ref{78,,imaplib}, @ref{b1,,poplib} and @ref{cf,,smtplib} modules,
and the `key_file', `cert_file' and `check_hostname' parameters from the
@ref{73,,http.client} module,
all deprecated since Python 3.6. Use the `context' parameter
(`ssl_context' in @code{imaplib}) instead.
(Contributed by Victor Stinner in gh-94172@footnote{https://github.com/python/cpython/issues/94172}.)

@item 
Remove @code{Jython} compatibility hacks from several stdlib modules and tests.
(Contributed by Nikita Sobolev in gh-99482@footnote{https://github.com/python/cpython/issues/99482}.)

@item 
Remove @code{_use_broken_old_ctypes_structure_semantics_} flag
from @ref{2e,,ctypes} module.
(Contributed by Nikita Sobolev in gh-99285@footnote{https://github.com/python/cpython/issues/99285}.)
@end itemize

@node Porting to Python 3 12,Build Changes<2>,Removed<2>,What’s New In Python 3 12
@anchor{whatsnew/3 12 porting-to-python-3-12}@anchor{75b}@anchor{whatsnew/3 12 whatsnew312-porting-to-python312}@anchor{6f4}
@subsection Porting to Python 3.12


This section lists previously described changes and other bugfixes
that may require changes to your code.

@menu
* Changes in the Python API: Changes in the Python API<3>. 

@end menu

@node Changes in the Python API<3>,,,Porting to Python 3 12
@anchor{whatsnew/3 12 changes-in-the-python-api}@anchor{75c}
@subsubsection Changes in the Python API



@itemize *

@item 
More strict rules are now applied for numerical group references and
group names in regular expressions.
Only sequence of ASCII digits is now accepted as a numerical reference.
The group name in bytes patterns and replacement strings can now only
contain ASCII letters and digits and underscore.
(Contributed by Serhiy Storchaka in gh-91760@footnote{https://github.com/python/cpython/issues/91760}.)

@item 
Remove @code{randrange()} functionality deprecated since Python 3.10.  Formerly,
@code{randrange(10.0)} losslessly converted to @code{randrange(10)}. Now, it raises a
@ref{199,,TypeError}. Also, the exception raised for non-integer values such as
@code{randrange(10.5)} or @code{randrange('10')} has been changed from @ref{2ee,,ValueError} to
@code{TypeError}.  This also prevents bugs where @code{randrange(1e25)} would silently
select from a larger range than @code{randrange(10**25)}.
(Originally suggested by Serhiy Storchaka gh-86388@footnote{https://github.com/python/cpython/issues/86388}.)

@item 
@ref{1bf,,argparse.ArgumentParser} changed encoding and error handler
for reading arguments from file (e.g. @code{fromfile_prefix_chars} option)
from default text encoding (e.g. @ref{75d,,locale.getpreferredencoding(False)})
to @ref{75e,,filesystem encoding and error handler}.
Argument files should be encoded in UTF-8 instead of ANSI Codepage on Windows.

@item 
Remove the @code{asyncore}-based @code{smtpd} module deprecated in Python 3.4.7
and 3.5.4.  A recommended replacement is the
@ref{b,,asyncio}-based aiosmtpd@footnote{https://pypi.org/project/aiosmtpd/} PyPI module.

@item 
@ref{75f,,shlex.split()}: Passing @code{None} for `s' argument now raises an
exception, rather than reading @ref{760,,sys.stdin}. The feature was deprecated
in Python 3.9.
(Contributed by Victor Stinner in gh-94352@footnote{https://github.com/python/cpython/issues/94352}.)

@item 
The @ref{a5,,os} module no longer accepts bytes-like paths, like
@ref{342,,bytearray} and @ref{166,,memoryview} types: only the exact
@ref{193,,bytes} type is accepted for bytes strings.
(Contributed by Victor Stinner in gh-98393@footnote{https://github.com/python/cpython/issues/98393}.)

@item 
@ref{761,,syslog.openlog()} and @ref{762,,syslog.closelog()} now fail if used in subinterpreters.
@ref{763,,syslog.syslog()} may still be used in subinterpreters,
but now only if @code{syslog.openlog()} has already been called in the main interpreter.
These new restrictions do not apply to the main interpreter,
so only a very small set of users might be affected.
This change helps with interpreter isolation.  Furthermore, @ref{e2,,syslog} is a wrapper
around process-global resources, which are best managed from the main interpreter.
(Contributed by Donghee Na in gh-99127@footnote{https://github.com/python/cpython/issues/99127}.)

@item 
The undocumented locking behavior of @ref{764,,cached_property()}
is removed, because it locked across all instances of the class, leading to high
lock contention. This means that a cached property getter function could now run
more than once for a single instance, if two threads race. For most simple
cached properties (e.g. those that are idempotent and simply calculate a value
based on other attributes of the instance) this will be fine.  If
synchronization is needed, implement locking within the cached property getter
function or around multi-threaded access points.

@item 
@ref{6ea,,sys._current_exceptions()} now returns a mapping from thread-id to an
exception instance, rather than to a @code{(typ, exc, tb)} tuple.
(Contributed by Irit Katriel in gh-103176@footnote{https://github.com/python/cpython/issues/103176}.)

@item 
When extracting tar files using @ref{e4,,tarfile} or
@ref{697,,shutil.unpack_archive()}, pass the `filter' argument to limit features
that may be surprising or dangerous.
See @ref{698,,Extraction filters} for details.

@item 
The output of the @ref{701,,tokenize.tokenize()} and @ref{702,,tokenize.generate_tokens()}
functions is now changed due to the changes introduced in 
@geindex Python Enhancement Proposals; PEP 701
PEP 701@footnote{https://peps.python.org/pep-0701/}. This
means that @code{STRING} tokens are not emitted any more for f-strings and the
tokens described in 
@geindex Python Enhancement Proposals; PEP 701
PEP 701@footnote{https://peps.python.org/pep-0701/} are now produced instead: @code{FSTRING_START},
@code{FSTRING_MIDDLE} and @code{FSTRING_END} are now emitted for f-string “string”
parts in addition to the appropriate tokens for the tokenization in the
expression components. For example for the f-string @code{f"start @{1+1@} end"}
the old version of the tokenizer emitted:

@example
1,0-1,18:           STRING         'f"start @{1+1@} end"'
@end example

while the new version emits:

@example
1,0-1,2:            FSTRING_START  'f"'
1,2-1,8:            FSTRING_MIDDLE 'start '
1,8-1,9:            OP             '@{'
1,9-1,10:           NUMBER         '1'
1,10-1,11:          OP             '+'
1,11-1,12:          NUMBER         '1'
1,12-1,13:          OP             '@}'
1,13-1,17:          FSTRING_MIDDLE ' end'
1,17-1,18:          FSTRING_END    '"'
@end example

Additionally, there may be some minor behavioral changes as a consequence of the
changes required to support 
@geindex Python Enhancement Proposals; PEP 701
PEP 701@footnote{https://peps.python.org/pep-0701/}. Some of these changes include:


@itemize *

@item 
The @code{type} attribute of the tokens emitted when tokenizing some invalid Python
characters such as @code{!} has changed from @code{ERRORTOKEN} to @code{OP}.

@item 
Incomplete single-line strings now also raise @ref{765,,tokenize.TokenError} as incomplete
multiline strings do.

@item 
Some incomplete or invalid Python code now raises @ref{765,,tokenize.TokenError} instead of
returning arbitrary @code{ERRORTOKEN} tokens when tokenizing it.

@item 
Mixing tabs and spaces as indentation in the same file is not supported anymore and will
raise a @ref{766,,TabError}.
@end itemize

@item 
The @ref{f3,,threading} module now expects the @code{_thread} module to have
an @code{_is_main_interpreter} attribute.  It is a function with no
arguments that returns @code{True} if the current interpreter is the
main interpreter.

Any library or application that provides a custom @code{_thread} module
should provide @code{_is_main_interpreter()}.
(See gh-112826@footnote{https://github.com/python/cpython/issues/112826}.)
@end itemize

@node Build Changes<2>,C API Changes<2>,Porting to Python 3 12,What’s New In Python 3 12
@anchor{whatsnew/3 12 build-changes}@anchor{767}
@subsection Build Changes



@itemize *

@item 
Python no longer uses @code{setup.py} to build shared C extension modules.
Build parameters like headers and libraries are detected in @code{configure}
script. Extensions are built by @code{Makefile}. Most extensions use
@code{pkg-config} and fall back to manual detection.
(Contributed by Christian Heimes in gh-93939@footnote{https://github.com/python/cpython/issues/93939}.)

@item 
@code{va_start()} with two parameters, like @code{va_start(args, format),}
is now required to build Python.
@code{va_start()} is no longer called with a single parameter.
(Contributed by Kumar Aditya in gh-93207@footnote{https://github.com/python/cpython/issues/93207}.)

@item 
CPython now uses the ThinLTO option as the default link time optimization policy
if the Clang compiler accepts the flag.
(Contributed by Donghee Na in gh-89536@footnote{https://github.com/python/cpython/issues/89536}.)

@item 
Add @code{COMPILEALL_OPTS} variable in @code{Makefile} to override @ref{21,,compileall}
options (default: @code{-j0}) in @code{make install}. Also merged the 3
@code{compileall} commands into a single command to build .pyc files for all
optimization levels (0, 1, 2) at once.
(Contributed by Victor Stinner in gh-99289@footnote{https://github.com/python/cpython/issues/99289}.)

@item 
Add platform triplets for 64-bit LoongArch:


@itemize *

@item 
loongarch64-linux-gnusf

@item 
loongarch64-linux-gnuf32

@item 
loongarch64-linux-gnu
@end itemize

(Contributed by Zhang Na in gh-90656@footnote{https://github.com/python/cpython/issues/90656}.)

@item 
@code{PYTHON_FOR_REGEN} now require Python 3.10 or newer.

@item 
Autoconf 2.71 and aclocal 1.16.4 is now required to regenerate
@code{configure}.
(Contributed by Christian Heimes in gh-89886@footnote{https://github.com/python/cpython/issues/89886}.)

@item 
Windows builds and macOS installers from python.org now use OpenSSL 3.0.
@end itemize

@node C API Changes<2>,,Build Changes<2>,What’s New In Python 3 12
@anchor{whatsnew/3 12 c-api-changes}@anchor{768}
@subsection C API Changes


@menu
* New Features: New Features<4>. 
* Porting to Python 3.12: Porting to Python 3 12<2>. 
* Deprecated: Deprecated<3>. 
* Removed: Removed<3>. 

@end menu

@node New Features<4>,Porting to Python 3 12<2>,,C API Changes<2>
@anchor{whatsnew/3 12 id4}@anchor{769}
@subsubsection New Features

@anchor{whatsnew/3 12 whatsnew312-pep697}@anchor{677}

@itemize *

@item 
@geindex Python Enhancement Proposals; PEP 697
PEP 697@footnote{https://peps.python.org/pep-0697/}: Introduce the @ref{76a,,Unstable C API tier},
intended for low-level tools like debuggers and JIT compilers.
This API may change in each minor release of CPython without deprecation
warnings.
Its contents are marked by the @code{PyUnstable_} prefix in names.

Code object constructors:


@itemize -

@item 
@code{PyUnstable_Code_New()} (renamed from @code{PyCode_New})

@item 
@code{PyUnstable_Code_NewWithPosOnlyArgs()} (renamed from @code{PyCode_NewWithPosOnlyArgs})
@end itemize

Extra storage for code objects (
@geindex Python Enhancement Proposals; PEP 523
PEP 523@footnote{https://peps.python.org/pep-0523/}):


@itemize -

@item 
@code{PyUnstable_Eval_RequestCodeExtraIndex()} (renamed from @code{_PyEval_RequestCodeExtraIndex})

@item 
@code{PyUnstable_Code_GetExtra()} (renamed from @code{_PyCode_GetExtra})

@item 
@code{PyUnstable_Code_SetExtra()} (renamed from @code{_PyCode_SetExtra})
@end itemize

The original names will continue to be available until the respective
API changes.

(Contributed by Petr Viktorin in gh-101101@footnote{https://github.com/python/cpython/issues/101101}.)

@item 
@geindex Python Enhancement Proposals; PEP 697
PEP 697@footnote{https://peps.python.org/pep-0697/}: Add an API for extending types whose instance memory layout is
opaque:


@itemize -

@item 
@ref{76b,,PyType_Spec.basicsize} can be zero or negative to specify
inheriting or extending the base class size.

@item 
@ref{76c,,PyObject_GetTypeData()} and @ref{76d,,PyType_GetTypeDataSize()}
added to allow access to subclass-specific instance data.

@item 
@ref{76e,,Py_TPFLAGS_ITEMS_AT_END} and @ref{76f,,PyObject_GetItemData()}
added to allow safely extending certain variable-sized types, including
@ref{770,,PyType_Type}.

@item 
@ref{771,,Py_RELATIVE_OFFSET} added to allow defining
@ref{772,,members} in terms of a subclass-specific struct.
@end itemize

(Contributed by Petr Viktorin in gh-103509@footnote{https://github.com/python/cpython/issues/103509}.)

@item 
Add the new @ref{637,,limited C API} function @ref{773,,PyType_FromMetaclass()},
which generalizes the existing @ref{774,,PyType_FromModuleAndSpec()} using
an additional metaclass argument.
(Contributed by Wenzel Jakob in gh-93012@footnote{https://github.com/python/cpython/issues/93012}.)

@item 
API for creating objects that can be called using
@ref{775,,the vectorcall protocol} was added to the
@ref{776,,Limited API}:


@itemize *

@item 
@ref{777,,Py_TPFLAGS_HAVE_VECTORCALL}

@item 
@ref{778,,PyVectorcall_NARGS()}

@item 
@ref{779,,PyVectorcall_Call()}

@item 
@ref{77a,,vectorcallfunc}
@end itemize

The @ref{777,,Py_TPFLAGS_HAVE_VECTORCALL} flag is now removed from a class
when the class’s @ref{77b,,__call__()} method is reassigned.
This makes vectorcall safe to use with mutable types (i.e. heap types
without the immutable flag, @ref{3cd,,Py_TPFLAGS_IMMUTABLETYPE}).
Mutable types that do not override @ref{77c,,tp_call} now
inherit the @code{Py_TPFLAGS_HAVE_VECTORCALL} flag.
(Contributed by Petr Viktorin in gh-93274@footnote{https://github.com/python/cpython/issues/93274}.)

The @ref{60f,,Py_TPFLAGS_MANAGED_DICT} and @ref{77d,,Py_TPFLAGS_MANAGED_WEAKREF}
flags have been added. This allows extensions classes to support object
@ref{77e,,__dict__} and weakrefs with less bookkeeping,
using less memory and with faster access.

@item 
API for performing calls using
@ref{775,,the vectorcall protocol} was added to the
@ref{776,,Limited API}:


@itemize *

@item 
@ref{77f,,PyObject_Vectorcall()}

@item 
@ref{780,,PyObject_VectorcallMethod()}

@item 
@ref{781,,PY_VECTORCALL_ARGUMENTS_OFFSET}
@end itemize

This means that both the incoming and outgoing ends of the vector call
protocol are now available in the @ref{776,,Limited API}. (Contributed
by Wenzel Jakob in gh-98586@footnote{https://github.com/python/cpython/issues/98586}.)

@item 
Add two new public functions,
@ref{782,,PyEval_SetProfileAllThreads()} and
@ref{664,,PyEval_SetTraceAllThreads()}, that allow to set tracing and profiling
functions in all running threads in addition to the calling one. (Contributed
by Pablo Galindo in gh-93503@footnote{https://github.com/python/cpython/issues/93503}.)

@item 
Add new function @ref{783,,PyFunction_SetVectorcall()} to the C API
which sets the vectorcall field of a given @ref{784,,PyFunctionObject}.
(Contributed by Andrew Frost in gh-92257@footnote{https://github.com/python/cpython/issues/92257}.)

@item 
The C API now permits registering callbacks via @ref{3ce,,PyDict_AddWatcher()},
@ref{785,,PyDict_Watch()} and related APIs to be called whenever a dictionary
is modified. This is intended for use by optimizing interpreters, JIT
compilers, or debuggers.
(Contributed by Carl Meyer in gh-91052@footnote{https://github.com/python/cpython/issues/91052}.)

@item 
Add @ref{786,,PyType_AddWatcher()} and @ref{787,,PyType_Watch()} API to register
callbacks to receive notification on changes to a type.
(Contributed by Carl Meyer in gh-91051@footnote{https://github.com/python/cpython/issues/91051}.)

@item 
Add @ref{788,,PyCode_AddWatcher()} and @ref{789,,PyCode_ClearWatcher()}
APIs to register callbacks to receive notification on creation and
destruction of code objects.
(Contributed by Itamar Oren in gh-91054@footnote{https://github.com/python/cpython/issues/91054}.)

@item 
Add @ref{78a,,PyFrame_GetVar()} and @ref{78b,,PyFrame_GetVarString()} functions to
get a frame variable by its name.
(Contributed by Victor Stinner in gh-91248@footnote{https://github.com/python/cpython/issues/91248}.)

@item 
Add @ref{427,,PyErr_GetRaisedException()} and @ref{42a,,PyErr_SetRaisedException()}
for saving and restoring the current exception.
These functions return and accept a single exception object,
rather than the triple arguments of the now-deprecated
@ref{426,,PyErr_Fetch()} and @ref{429,,PyErr_Restore()}.
This is less error prone and a bit more efficient.
(Contributed by Mark Shannon in gh-101578@footnote{https://github.com/python/cpython/issues/101578}.)

@item 
Add @code{_PyErr_ChainExceptions1}, which takes an exception instance,
to replace the legacy-API @code{_PyErr_ChainExceptions}, which is now
deprecated. (Contributed by Mark Shannon in gh-101578@footnote{https://github.com/python/cpython/issues/101578}.)

@item 
Add @ref{78c,,PyException_GetArgs()} and @ref{78d,,PyException_SetArgs()}
as convenience functions for retrieving and modifying
the @ref{78e,,args} passed to the exception’s constructor.
(Contributed by Mark Shannon in gh-101578@footnote{https://github.com/python/cpython/issues/101578}.)

@item 
Add @ref{433,,PyErr_DisplayException()}, which takes an exception instance,
to replace the legacy-api @code{PyErr_Display()}. (Contributed by
Irit Katriel in gh-102755@footnote{https://github.com/python/cpython/issues/102755}).
@end itemize
@anchor{whatsnew/3 12 whatsnew312-pep683}@anchor{678}

@itemize *

@item 
@geindex Python Enhancement Proposals; PEP 683
PEP 683@footnote{https://peps.python.org/pep-0683/}: Introduce `Immortal Objects', which allows objects
to bypass reference counts, and related changes to the C-API:


@itemize -

@item 

@table @asis

@item @code{_Py_IMMORTAL_REFCNT}: The reference count that defines an object

as immortal.
@end table

@item 
@code{_Py_IsImmortal} Checks if an object has the immortal reference count.

@item 

@table @asis

@item @code{PyObject_HEAD_INIT} This will now initialize reference count to

@code{_Py_IMMORTAL_REFCNT} when used with @code{Py_BUILD_CORE}.
@end table

@item 

@table @asis

@item @code{SSTATE_INTERNED_IMMORTAL} An identifier for interned unicode objects

that are immortal.
@end table

@item 

@table @asis

@item @code{SSTATE_INTERNED_IMMORTAL_STATIC} An identifier for interned unicode

objects that are immortal and static
@end table

@item 

@table @asis

@item @code{sys.getunicodeinternedsize} This returns the total number of unicode

objects that have been interned. This is now needed for @code{refleak.py} to
correctly track reference counts and allocated blocks
@end table
@end itemize

(Contributed by Eddie Elizondo in gh-84436@footnote{https://github.com/python/cpython/issues/84436}.)

@item 
@geindex Python Enhancement Proposals; PEP 684
PEP 684@footnote{https://peps.python.org/pep-0684/}: Add the new @ref{68a,,Py_NewInterpreterFromConfig()}
function and @ref{78f,,PyInterpreterConfig}, which may be used
to create sub-interpreters with their own GILs.
(See @ref{670,,PEP 684; A Per-Interpreter GIL} for more info.)
(Contributed by Eric Snow in gh-104110@footnote{https://github.com/python/cpython/issues/104110}.)

@item 
In the limited C API version 3.12, @ref{790,,Py_INCREF()} and
@ref{791,,Py_DECREF()} functions are now implemented as opaque function calls to
hide implementation details.
(Contributed by Victor Stinner in gh-105387@footnote{https://github.com/python/cpython/issues/105387}.)
@end itemize

@node Porting to Python 3 12<2>,Deprecated<3>,New Features<4>,C API Changes<2>
@anchor{whatsnew/3 12 id5}@anchor{792}
@subsubsection Porting to Python 3.12



@itemize *

@item 
Legacy Unicode APIs based on @code{Py_UNICODE*} representation has been removed.
Please migrate to APIs based on UTF-8 or @code{wchar_t*}.

@item 
Argument parsing functions like @ref{3bf,,PyArg_ParseTuple()} doesn’t support
@code{Py_UNICODE*} based format (e.g. @code{u}, @code{Z}) anymore. Please migrate
to other formats for Unicode like @code{s}, @code{z}, @code{es}, and @code{U}.

@item 
@code{tp_weaklist} for all static builtin types is always @code{NULL}.
This is an internal-only field on @code{PyTypeObject}
but we’re pointing out the change in case someone happens to be
accessing the field directly anyway.  To avoid breakage, consider
using the existing public C-API instead, or, if necessary, the
(internal-only) @code{_PyObject_GET_WEAKREFS_LISTPTR()} macro.

@item 
This internal-only @ref{793,,PyTypeObject.tp_subclasses} may now not be
a valid object pointer.  Its type was changed to void* to
reflect this.  We mention this in case someone happens to be accessing the
internal-only field directly.

To get a list of subclasses, call the Python method
@ref{794,,__subclasses__()} (using @ref{640,,PyObject_CallMethod()},
for example).

@item 
Add support of more formatting options (left aligning, octals, uppercase
hexadecimals, @code{intmax_t}, @code{ptrdiff_t}, @code{wchar_t} C
strings, variable width and precision) in @ref{62b,,PyUnicode_FromFormat()} and
@ref{795,,PyUnicode_FromFormatV()}.
(Contributed by Serhiy Storchaka in gh-98836@footnote{https://github.com/python/cpython/issues/98836}.)

@item 
An unrecognized format character in @ref{62b,,PyUnicode_FromFormat()} and
@ref{795,,PyUnicode_FromFormatV()} now sets a @ref{796,,SystemError}.
In previous versions it caused all the rest of the format string to be
copied as-is to the result string, and any extra arguments discarded.
(Contributed by Serhiy Storchaka in gh-95781@footnote{https://github.com/python/cpython/issues/95781}.)

@item 
Fix wrong sign placement in @ref{62b,,PyUnicode_FromFormat()} and
@ref{795,,PyUnicode_FromFormatV()}.
(Contributed by Philip Georgi in gh-95504@footnote{https://github.com/python/cpython/issues/95504}.)

@item 
Extension classes wanting to add a @ref{77e,,__dict__} or weak reference slot
should use @ref{60f,,Py_TPFLAGS_MANAGED_DICT} and
@ref{77d,,Py_TPFLAGS_MANAGED_WEAKREF} instead of @code{tp_dictoffset} and
@code{tp_weaklistoffset}, respectively.
The use of @code{tp_dictoffset} and @code{tp_weaklistoffset} is still
supported, but does not fully support multiple inheritance
(gh-95589@footnote{https://github.com/python/cpython/issues/95589}), and performance may be worse.
Classes declaring @code{Py_TPFLAGS_MANAGED_DICT} must call
@code{_PyObject_VisitManagedDict()} and @code{_PyObject_ClearManagedDict()}
to traverse and clear their instance’s dictionaries.
To clear weakrefs, call @ref{797,,PyObject_ClearWeakRefs()}, as before.

@item 
The @ref{798,,PyUnicode_FSDecoder()} function no longer accepts bytes-like
paths, like @ref{342,,bytearray} and @ref{166,,memoryview} types: only the exact
@ref{193,,bytes} type is accepted for bytes strings.
(Contributed by Victor Stinner in gh-98393@footnote{https://github.com/python/cpython/issues/98393}.)

@item 
The @ref{799,,Py_CLEAR}, @ref{79a,,Py_SETREF} and @ref{79b,,Py_XSETREF}
macros now only evaluate their arguments once. If an argument has side
effects, these side effects are no longer duplicated.
(Contributed by Victor Stinner in gh-98724@footnote{https://github.com/python/cpython/issues/98724}.)

@item 
The interpreter’s error indicator is now always normalized. This means
that @ref{79c,,PyErr_SetObject()}, @ref{79d,,PyErr_SetString()} and the other
functions that set the error indicator now normalize the exception
before storing it. (Contributed by Mark Shannon in gh-101578@footnote{https://github.com/python/cpython/issues/101578}.)

@item 
@code{_Py_RefTotal} is no longer authoritative and only kept around
for ABI compatibility.  Note that it is an internal global and only
available on debug builds.  If you happen to be using it then you’ll
need to start using @code{_Py_GetGlobalRefTotal()}.

@item 
The following functions now select an appropriate metaclass for the newly
created type:


@itemize *

@item 
@ref{79e,,PyType_FromSpec()}

@item 
@ref{79f,,PyType_FromSpecWithBases()}

@item 
@ref{774,,PyType_FromModuleAndSpec()}
@end itemize

Creating classes whose metaclass overrides @ref{7a0,,tp_new}
is deprecated, and in Python 3.14+ it will be disallowed.
Note that these functions ignore @code{tp_new} of the metaclass, possibly
allowing incomplete initialization.

Note that @ref{773,,PyType_FromMetaclass()} (added in Python 3.12)
already disallows creating classes whose metaclass overrides @code{tp_new}
(@ref{7a1,,__new__()} in Python).

Since @code{tp_new} overrides almost everything @code{PyType_From*} functions do,
the two are incompatible with each other.
The existing behavior – ignoring the metaclass for several steps
of type creation – is unsafe in general, since (meta)classes assume that
@code{tp_new} was called.
There is no simple general workaround. One of the following may work for you:


@itemize -

@item 
If you control the metaclass, avoid using @code{tp_new} in it:


@itemize -

@item 
If initialization can be skipped, it can be done in
@ref{7a2,,tp_init} instead.

@item 
If the metaclass doesn’t need to be instantiated from Python,
set its @code{tp_new} to @code{NULL} using
the @ref{7a3,,Py_TPFLAGS_DISALLOW_INSTANTIATION} flag.
This makes it acceptable for @code{PyType_From*} functions.
@end itemize

@item 
Avoid @code{PyType_From*} functions: if you don’t need C-specific features
(slots or setting the instance size), create types by @ref{7a4,,calling}
the metaclass.

@item 
If you `know' the @code{tp_new} can be skipped safely, filter the deprecation
warning out using @ref{17a,,warnings.catch_warnings()} from Python.
@end itemize

@item 
@ref{7a5,,PyOS_InputHook} and @ref{7a6,,PyOS_ReadlineFunctionPointer} are no
longer called in @ref{164,,subinterpreters}. This is
because clients generally rely on process-wide global state (since these
callbacks have no way of recovering extension module state).

This also avoids situations where extensions may find themselves running in a
subinterpreter that they don’t support (or haven’t yet been loaded in). See
gh-104668@footnote{https://github.com/python/cpython/issues/104668} for more info.

@item 
@ref{39c,,PyLongObject} has had its internals changed for better performance.
Although the internals of @code{PyLongObject} are private, they are used
by some extension modules.
The internal fields should no longer be accessed directly, instead the API
functions beginning @code{PyLong_...} should be used instead.
Two new `unstable' API functions are provided for efficient access to the
value of @code{PyLongObject}s which fit into a single machine word:


@itemize *

@item 
@ref{7a7,,PyUnstable_Long_IsCompact()}

@item 
@ref{7a8,,PyUnstable_Long_CompactValue()}
@end itemize

@item 
Custom allocators, set via @ref{7a9,,PyMem_SetAllocator()}, are now
required to be thread-safe, regardless of memory domain.  Allocators
that don’t have their own state, including “hooks”, are not affected.
If your custom allocator is not already thread-safe and you need
guidance then please create a new GitHub issue
and CC @code{@@ericsnowcurrently}.
@end itemize

@node Deprecated<3>,Removed<3>,Porting to Python 3 12<2>,C API Changes<2>
@anchor{whatsnew/3 12 id6}@anchor{7aa}
@subsubsection Deprecated



@itemize *

@item 
In accordance with 
@geindex Python Enhancement Proposals; PEP 699
PEP 699@footnote{https://peps.python.org/pep-0699/}, the @code{ma_version_tag} field in @ref{64f,,PyDictObject}
is deprecated for extension modules. Accessing this field will generate a compiler
warning at compile time. This field will be removed in Python 3.14.
(Contributed by Ramvikrams and Kumar Aditya in gh-101193@footnote{https://github.com/python/cpython/issues/101193}. PEP by Ken Jin.)

@item 
Deprecate global configuration variable:


@itemize *

@item 
@ref{3f6,,Py_DebugFlag}: use @ref{3f7,,PyConfig.parser_debug}

@item 
@ref{3f8,,Py_VerboseFlag}: use @ref{3f9,,PyConfig.verbose}

@item 
@ref{3fa,,Py_QuietFlag}: use @ref{3fb,,PyConfig.quiet}

@item 
@ref{3fc,,Py_InteractiveFlag}: use @ref{3fd,,PyConfig.interactive}

@item 
@ref{3fe,,Py_InspectFlag}: use @ref{3ff,,PyConfig.inspect}

@item 
@ref{400,,Py_OptimizeFlag}: use @ref{401,,PyConfig.optimization_level}

@item 
@ref{402,,Py_NoSiteFlag}: use @ref{403,,PyConfig.site_import}

@item 
@ref{404,,Py_BytesWarningFlag}: use @ref{405,,PyConfig.bytes_warning}

@item 
@ref{406,,Py_FrozenFlag}: use @ref{407,,PyConfig.pathconfig_warnings}

@item 
@ref{408,,Py_IgnoreEnvironmentFlag}: use @ref{409,,PyConfig.use_environment}

@item 
@ref{40a,,Py_DontWriteBytecodeFlag}: use @ref{40b,,PyConfig.write_bytecode}

@item 
@ref{40c,,Py_NoUserSiteDirectory}: use @ref{40d,,PyConfig.user_site_directory}

@item 
@ref{40e,,Py_UnbufferedStdioFlag}: use @ref{40f,,PyConfig.buffered_stdio}

@item 
@ref{410,,Py_HashRandomizationFlag}: use @ref{411,,PyConfig.use_hash_seed}
and @ref{412,,PyConfig.hash_seed}

@item 
@ref{413,,Py_IsolatedFlag}: use @ref{414,,PyConfig.isolated}

@item 
@ref{415,,Py_LegacyWindowsFSEncodingFlag}: use @ref{416,,PyPreConfig.legacy_windows_fs_encoding}

@item 
@ref{417,,Py_LegacyWindowsStdioFlag}: use @ref{418,,PyConfig.legacy_windows_stdio}

@item 
@code{Py_FileSystemDefaultEncoding}: use @ref{419,,PyConfig.filesystem_encoding}

@item 
@code{Py_HasFileSystemDefaultEncoding}: use @ref{419,,PyConfig.filesystem_encoding}

@item 
@code{Py_FileSystemDefaultEncodeErrors}: use @ref{41a,,PyConfig.filesystem_errors}

@item 
@code{Py_UTF8Mode}: use @ref{41b,,PyPreConfig.utf8_mode} (see @ref{41c,,Py_PreInitialize()})
@end itemize

The @ref{3f4,,Py_InitializeFromConfig()} API should be used with
@ref{3f5,,PyConfig} instead.
(Contributed by Victor Stinner in gh-77782@footnote{https://github.com/python/cpython/issues/77782}.)

@item 
Creating @ref{3cd,,immutable types} with mutable
bases is deprecated and will be disabled in Python 3.14. (gh-95388@footnote{https://github.com/python/cpython/issues/95388})

@item 
The @code{structmember.h} header is deprecated, though it continues to be
available and there are no plans to remove it.

Its contents are now available just by including @code{Python.h},
with a @code{Py} prefix added if it was missing:


@itemize -

@item 
@ref{772,,PyMemberDef}, @ref{7ab,,PyMember_GetOne()} and
@ref{7ac,,PyMember_SetOne()}

@item 
Type macros like @ref{7ad,,Py_T_INT}, @ref{7ae,,Py_T_DOUBLE}, etc.
(previously @code{T_INT}, @code{T_DOUBLE}, etc.)

@item 
The flags @ref{7af,,Py_READONLY} (previously @code{READONLY}) and
@ref{7b0,,Py_AUDIT_READ} (previously all uppercase)
@end itemize

Several items are not exposed from @code{Python.h}:


@itemize -

@item 
@ref{7b1,,T_OBJECT} (use @ref{7b2,,Py_T_OBJECT_EX})

@item 
@ref{7b3,,T_NONE} (previously undocumented, and pretty quirky)

@item 
The macro @code{WRITE_RESTRICTED} which does nothing.

@item 
The macros @code{RESTRICTED} and @code{READ_RESTRICTED}, equivalents of
@ref{7b0,,Py_AUDIT_READ}.

@item 
In some configurations, @code{<stddef.h>} is not included from @code{Python.h}.
It should be included manually when using @code{offsetof()}.
@end itemize

The deprecated header continues to provide its original
contents under the original names.
Your old code can stay unchanged, unless the extra include and non-namespaced
macros bother you greatly.

(Contributed in gh-47146@footnote{https://github.com/python/cpython/issues/47146} by Petr Viktorin, based on
earlier work by Alexander Belopolsky and Matthias Braun.)

@item 
@ref{426,,PyErr_Fetch()} and @ref{429,,PyErr_Restore()} are deprecated.
Use @ref{427,,PyErr_GetRaisedException()} and
@ref{42a,,PyErr_SetRaisedException()} instead.
(Contributed by Mark Shannon in gh-101578@footnote{https://github.com/python/cpython/issues/101578}.)

@item 
@code{PyErr_Display()} is deprecated. Use @ref{433,,PyErr_DisplayException()}
instead. (Contributed by Irit Katriel in gh-102755@footnote{https://github.com/python/cpython/issues/102755}).

@item 
@code{_PyErr_ChainExceptions} is deprecated. Use @code{_PyErr_ChainExceptions1}
instead. (Contributed by Irit Katriel in gh-102192@footnote{https://github.com/python/cpython/issues/102192}.)

@item 
Using @ref{79e,,PyType_FromSpec()}, @ref{79f,,PyType_FromSpecWithBases()}
or @ref{774,,PyType_FromModuleAndSpec()} to create a class whose metaclass
overrides @ref{7a0,,tp_new} is deprecated.
Call the metaclass instead.
@end itemize

@c Add deprecations above alphabetically, not here at the end.

@menu
* Pending removal in Python 3.14: Pending removal in Python 3 14<4>. 
* Pending removal in Python 3.15: Pending removal in Python 3 15<6>. 
* Pending removal in Python 3.16: Pending removal in Python 3 16<6>. 
* Pending removal in future versions: Pending removal in future versions<6>. 

@end menu

@node Pending removal in Python 3 14<4>,Pending removal in Python 3 15<6>,,Deprecated<3>
@anchor{whatsnew/3 12 id7}@anchor{7b4}
@subsubsection Pending removal in Python 3.14



@itemize *

@item 
The @code{ma_version_tag} field in @ref{64f,,PyDictObject} for extension modules
(
@geindex Python Enhancement Proposals; PEP 699
PEP 699@footnote{https://peps.python.org/pep-0699/}; gh-101193@footnote{https://github.com/python/cpython/issues/101193}).

@item 
Creating @ref{3cd,,immutable types} with mutable
bases (gh-95388@footnote{https://github.com/python/cpython/issues/95388}).
@end itemize

@node Pending removal in Python 3 15<6>,Pending removal in Python 3 16<6>,Pending removal in Python 3 14<4>,Deprecated<3>
@anchor{whatsnew/3 12 id8}@anchor{7b5}
@subsubsection Pending removal in Python 3.15



@itemize *

@item 
The @ref{3d9,,PyImport_ImportModuleNoBlock()}:
Use @ref{3da,,PyImport_ImportModule()} instead.

@item 
@ref{3db,,PyWeakref_GetObject()} and @ref{3dc,,PyWeakref_GET_OBJECT()}:
Use @ref{3dd,,PyWeakref_GetRef()} instead. The pythoncapi-compat project@footnote{https://github.com/python/pythoncapi-compat/} can be used to get
@code{PyWeakref_GetRef()} on Python 3.12 and older.

@item 
@ref{3de,,Py_UNICODE} type and the @code{Py_UNICODE_WIDE} macro:
Use @code{wchar_t} instead.

@item 
@code{PyUnicode_AsDecodedObject()}:
Use @ref{3df,,PyCodec_Decode()} instead.

@item 
@code{PyUnicode_AsDecodedUnicode()}:
Use @ref{3df,,PyCodec_Decode()} instead; Note that some codecs (for example, “base64”)
may return a type other than @ref{16a,,str}, such as @ref{193,,bytes}.

@item 
@code{PyUnicode_AsEncodedObject()}:
Use @ref{3e0,,PyCodec_Encode()} instead.

@item 
@code{PyUnicode_AsEncodedUnicode()}:
Use @ref{3e0,,PyCodec_Encode()} instead; Note that some codecs (for example, “base64”)
may return a type other than @ref{193,,bytes}, such as @ref{16a,,str}.

@item 
Python initialization functions, deprecated in Python 3.13:


@itemize *

@item 
@ref{3e1,,Py_GetPath()}:
Use @ref{37a,,PyConfig_Get("module_search_paths")}
(@ref{3e2,,sys.path}) instead.

@item 
@ref{3e3,,Py_GetPrefix()}:
Use @ref{37a,,PyConfig_Get("base_prefix")}
(@ref{3e4,,sys.base_prefix}) instead. Use @code{PyConfig_Get("prefix")} (@ref{3e5,,sys.prefix}) if @ref{3e6,,virtual environments} need to be handled.

@item 
@ref{3e7,,Py_GetExecPrefix()}:
Use @ref{37a,,PyConfig_Get("base_exec_prefix")}
(@ref{3e8,,sys.base_exec_prefix}) instead. Use
@code{PyConfig_Get("exec_prefix")}
(@ref{3e9,,sys.exec_prefix}) if @ref{3e6,,virtual environments} need to
be handled.

@item 
@ref{3ea,,Py_GetProgramFullPath()}:
Use @ref{37a,,PyConfig_Get("executable")}
(@ref{3eb,,sys.executable}) instead.

@item 
@ref{3ec,,Py_GetProgramName()}:
Use @ref{37a,,PyConfig_Get("executable")}
(@ref{3eb,,sys.executable}) instead.

@item 
@ref{3ed,,Py_GetPythonHome()}:
Use @ref{37a,,PyConfig_Get("home")} or the
@geindex PYTHONHOME
@geindex environment variable; PYTHONHOME
@ref{3ee,,PYTHONHOME} environment variable instead.
@end itemize

The pythoncapi-compat project@footnote{https://github.com/python/pythoncapi-compat/} can be used to get
@ref{37a,,PyConfig_Get()} on Python 3.13 and older.

@item 
Functions to configure Python’s initialization, deprecated in Python 3.11:


@itemize *

@item 
@code{PySys_SetArgvEx()}:
Set @ref{3ef,,PyConfig.argv} instead.

@item 
@code{PySys_SetArgv()}:
Set @ref{3ef,,PyConfig.argv} instead.

@item 
@code{Py_SetProgramName()}:
Set @ref{3f0,,PyConfig.program_name} instead.

@item 
@code{Py_SetPythonHome()}:
Set @ref{3f1,,PyConfig.home} instead.

@item 
@ref{3f2,,PySys_ResetWarnOptions()}:
Clear @ref{3f3,,sys.warnoptions} and @code{warnings.filters} instead.
@end itemize

The @ref{3f4,,Py_InitializeFromConfig()} API should be used with
@ref{3f5,,PyConfig} instead.

@item 
Global configuration variables:


@itemize *

@item 
@ref{3f6,,Py_DebugFlag}:
Use @ref{3f7,,PyConfig.parser_debug} or
@ref{37a,,PyConfig_Get("parser_debug")} instead.

@item 
@ref{3f8,,Py_VerboseFlag}:
Use @ref{3f9,,PyConfig.verbose} or
@ref{37a,,PyConfig_Get("verbose")} instead.

@item 
@ref{3fa,,Py_QuietFlag}:
Use @ref{3fb,,PyConfig.quiet} or
@ref{37a,,PyConfig_Get("quiet")} instead.

@item 
@ref{3fc,,Py_InteractiveFlag}:
Use @ref{3fd,,PyConfig.interactive} or
@ref{37a,,PyConfig_Get("interactive")} instead.

@item 
@ref{3fe,,Py_InspectFlag}:
Use @ref{3ff,,PyConfig.inspect} or
@ref{37a,,PyConfig_Get("inspect")} instead.

@item 
@ref{400,,Py_OptimizeFlag}:
Use @ref{401,,PyConfig.optimization_level} or
@ref{37a,,PyConfig_Get("optimization_level")} instead.

@item 
@ref{402,,Py_NoSiteFlag}:
Use @ref{403,,PyConfig.site_import} or
@ref{37a,,PyConfig_Get("site_import")} instead.

@item 
@ref{404,,Py_BytesWarningFlag}:
Use @ref{405,,PyConfig.bytes_warning} or
@ref{37a,,PyConfig_Get("bytes_warning")} instead.

@item 
@ref{406,,Py_FrozenFlag}:
Use @ref{407,,PyConfig.pathconfig_warnings} or
@ref{37a,,PyConfig_Get("pathconfig_warnings")} instead.

@item 
@ref{408,,Py_IgnoreEnvironmentFlag}:
Use @ref{409,,PyConfig.use_environment} or
@ref{37a,,PyConfig_Get("use_environment")} instead.

@item 
@ref{40a,,Py_DontWriteBytecodeFlag}:
Use @ref{40b,,PyConfig.write_bytecode} or
@ref{37a,,PyConfig_Get("write_bytecode")} instead.

@item 
@ref{40c,,Py_NoUserSiteDirectory}:
Use @ref{40d,,PyConfig.user_site_directory} or
@ref{37a,,PyConfig_Get("user_site_directory")} instead.

@item 
@ref{40e,,Py_UnbufferedStdioFlag}:
Use @ref{40f,,PyConfig.buffered_stdio} or
@ref{37a,,PyConfig_Get("buffered_stdio")} instead.

@item 
@ref{410,,Py_HashRandomizationFlag}:
Use @ref{411,,PyConfig.use_hash_seed}
and @ref{412,,PyConfig.hash_seed} or
@ref{37a,,PyConfig_Get("hash_seed")} instead.

@item 
@ref{413,,Py_IsolatedFlag}:
Use @ref{414,,PyConfig.isolated} or
@ref{37a,,PyConfig_Get("isolated")} instead.

@item 
@ref{415,,Py_LegacyWindowsFSEncodingFlag}:
Use @ref{416,,PyPreConfig.legacy_windows_fs_encoding} or
@ref{37a,,PyConfig_Get("legacy_windows_fs_encoding")} instead.

@item 
@ref{417,,Py_LegacyWindowsStdioFlag}:
Use @ref{418,,PyConfig.legacy_windows_stdio} or
@ref{37a,,PyConfig_Get("legacy_windows_stdio")} instead.

@item 
@code{Py_FileSystemDefaultEncoding}, @code{Py_HasFileSystemDefaultEncoding}:
Use @ref{419,,PyConfig.filesystem_encoding} or
@ref{37a,,PyConfig_Get("filesystem_encoding")} instead.

@item 
@code{Py_FileSystemDefaultEncodeErrors}:
Use @ref{41a,,PyConfig.filesystem_errors} or
@ref{37a,,PyConfig_Get("filesystem_errors")} instead.

@item 
@code{Py_UTF8Mode}:
Use @ref{41b,,PyPreConfig.utf8_mode} or
@ref{37a,,PyConfig_Get("utf8_mode")} instead.
(see @ref{41c,,Py_PreInitialize()})
@end itemize

The @ref{3f4,,Py_InitializeFromConfig()} API should be used with
@ref{3f5,,PyConfig} to set these options. Or @ref{37a,,PyConfig_Get()} can be
used to get these options at runtime.
@end itemize

@node Pending removal in Python 3 16<6>,Pending removal in future versions<6>,Pending removal in Python 3 15<6>,Deprecated<3>
@anchor{whatsnew/3 12 id9}@anchor{7b6}
@subsubsection Pending removal in Python 3.16



@itemize *

@item 
The bundled copy of @code{libmpdec}.
@end itemize

@node Pending removal in future versions<6>,,Pending removal in Python 3 16<6>,Deprecated<3>
@anchor{whatsnew/3 12 id10}@anchor{7b7}
@subsubsection Pending removal in future versions


The following APIs are deprecated and will be removed,
although there is currently no date scheduled for their removal.


@itemize *

@item 
@ref{425,,Py_TPFLAGS_HAVE_FINALIZE}:
Unneeded since Python 3.8.

@item 
@ref{426,,PyErr_Fetch()}:
Use @ref{427,,PyErr_GetRaisedException()} instead.

@item 
@ref{428,,PyErr_NormalizeException()}:
Use @ref{427,,PyErr_GetRaisedException()} instead.

@item 
@ref{429,,PyErr_Restore()}:
Use @ref{42a,,PyErr_SetRaisedException()} instead.

@item 
@ref{42b,,PyModule_GetFilename()}:
Use @ref{42c,,PyModule_GetFilenameObject()} instead.

@item 
@ref{42d,,PyOS_AfterFork()}:
Use @ref{42e,,PyOS_AfterFork_Child()} instead.

@item 
@ref{42f,,PySlice_GetIndicesEx()}:
Use @ref{430,,PySlice_Unpack()} and @ref{431,,PySlice_AdjustIndices()} instead.

@item 
@ref{432,,PyUnicode_READY()}:
Unneeded since Python 3.12

@item 
@code{PyErr_Display()}:
Use @ref{433,,PyErr_DisplayException()} instead.

@item 
@code{_PyErr_ChainExceptions()}:
Use @code{_PyErr_ChainExceptions1()} instead.

@item 
@code{PyBytesObject.ob_shash} member:
call @ref{434,,PyObject_Hash()} instead.

@item 
Thread Local Storage (TLS) API:


@itemize *

@item 
@ref{435,,PyThread_create_key()}:
Use @ref{436,,PyThread_tss_alloc()} instead.

@item 
@ref{437,,PyThread_delete_key()}:
Use @ref{438,,PyThread_tss_free()} instead.

@item 
@ref{439,,PyThread_set_key_value()}:
Use @ref{43a,,PyThread_tss_set()} instead.

@item 
@ref{43b,,PyThread_get_key_value()}:
Use @ref{43c,,PyThread_tss_get()} instead.

@item 
@ref{43d,,PyThread_delete_key_value()}:
Use @ref{43e,,PyThread_tss_delete()} instead.

@item 
@ref{43f,,PyThread_ReInitTLS()}:
Unneeded since Python 3.7.
@end itemize
@end itemize

@node Removed<3>,,Deprecated<3>,C API Changes<2>
@anchor{whatsnew/3 12 id11}@anchor{7b8}
@subsubsection Removed



@itemize *

@item 
Remove the @code{token.h} header file. There was never any public tokenizer C
API. The @code{token.h} header file was only designed to be used by Python
internals.
(Contributed by Victor Stinner in gh-92651@footnote{https://github.com/python/cpython/issues/92651}.)

@item 
Legacy Unicode APIs have been removed. See 
@geindex Python Enhancement Proposals; PEP 623
PEP 623@footnote{https://peps.python.org/pep-0623/} for detail.


@itemize *

@item 
@code{PyUnicode_WCHAR_KIND}

@item 
@code{PyUnicode_AS_UNICODE()}

@item 
@code{PyUnicode_AsUnicode()}

@item 
@code{PyUnicode_AsUnicodeAndSize()}

@item 
@code{PyUnicode_AS_DATA()}

@item 
@code{PyUnicode_FromUnicode()}

@item 
@code{PyUnicode_GET_SIZE()}

@item 
@code{PyUnicode_GetSize()}

@item 
@code{PyUnicode_GET_DATA_SIZE()}
@end itemize

@item 
Remove the @code{PyUnicode_InternImmortal()} function macro.
(Contributed by Victor Stinner in gh-85858@footnote{https://github.com/python/cpython/issues/85858}.)
@end itemize

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node What’s New In Python 3 11,What’s New In Python 3 10,What’s New In Python 3 12,What’s New in Python
@anchor{whatsnew/3 11 doc}@anchor{7b9}@anchor{whatsnew/3 11 translation-repo}@anchor{7ba}@anchor{whatsnew/3 11 what-s-new-in-python-3-11}@anchor{7bb}
@section What’s New In Python 3.11


@*Editor: 
Pablo Galindo Salgado


@c Rules for maintenance:
@c 
@c * Anyone can add text to this document.  Do not spend very much time
@c on the wording of your changes, because your text will probably
@c get rewritten to some degree.
@c 
@c * The maintainer will go through Misc/NEWS periodically and add
@c changes; it's therefore more important to add your changes to
@c Misc/NEWS than to this file.
@c 
@c * This is not a complete list of every single change; completeness
@c is the purpose of Misc/NEWS.  Some changes I consider too small
@c or esoteric to include.  If such a change is added to the text,
@c I'll just remove it.  (This is another reason you shouldn't spend
@c too much time on writing your addition.)
@c 
@c * If you want to draw your new text to the attention of the
@c maintainer, add 'XXX' to the beginning of the paragraph or
@c section.
@c 
@c * It's OK to just add a fragmentary note about a change.  For
@c example: "XXX Describe the transmogrify() function added to the
@c socket module."  The maintainer will research the change and
@c write the necessary text.
@c 
@c * You can comment out your additions if you like, but it's not
@c necessary (especially when a final release is some months away).
@c 
@c * Credit the author of a patch or bugfix.   Just the name is
@c sufficient; the e-mail address isn't necessary.
@c 
@c * It's helpful to add the bug/patch number as a comment:
@c 
@c XXX Describe the transmogrify() function added to the socket
@c module.
@c (Contributed by P.Y. Developer in :issue:`12345`.)
@c 
@c This saves the maintainer the effort of going through the Mercurial log
@c when researching a change.

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 the @ref{143,,changelog}.

@menu
* Summary – Release highlights: Summary – Release highlights<3>. 
* New Features: New Features<5>. 
* New Features Related to Type Hints: New Features Related to Type Hints<2>. 
* Other Language Changes: Other Language Changes<3>. 
* Other CPython Implementation Changes:: 
* New Modules: New Modules<3>. 
* Improved Modules: Improved Modules<3>. 
* Optimizations: Optimizations<4>. 
* Faster CPython:: 
* CPython bytecode changes: CPython bytecode changes<3>. 
* Deprecated: Deprecated<4>. 
* Pending Removal in Python 3.12: Pending Removal in Python 3 12. 
* Removed: Removed<4>. 
* Porting to Python 3.11: Porting to Python 3 11. 
* Build Changes: Build Changes<3>. 
* C API Changes: C API Changes<3>. 
* Notable changes in 3.11.4: Notable changes in 3 11 4. 
* Notable changes in 3.11.5: Notable changes in 3 11 5. 

@end menu

@node Summary – Release highlights<3>,New Features<5>,,What’s New In Python 3 11
@anchor{whatsnew/3 11 summary-release-highlights}@anchor{7bc}@anchor{whatsnew/3 11 whatsnew311-summary}@anchor{7bd}
@subsection Summary – Release highlights


@c This section singles out the most important changes in Python 3.11.
@c Brevity is key.


@itemize *

@item 
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.
See @ref{7be,,Faster CPython} for details.
@end itemize

@c PEP-sized items next.

New syntax features:


@itemize *

@item 
@ref{7bf,,PEP 654; Exception Groups and except*}
@end itemize

New built-in features:


@itemize *

@item 
@ref{7c0,,PEP 678; Exceptions can be enriched with notes}
@end itemize

New standard library modules:


@itemize *

@item 
@geindex Python Enhancement Proposals; PEP 680
PEP 680@footnote{https://peps.python.org/pep-0680/}: @ref{103,,tomllib} —
Support for parsing TOML@footnote{https://toml.io/} in the Standard Library
@end itemize

Interpreter improvements:


@itemize *

@item 
@ref{7c1,,PEP 657; Fine-grained error locations in tracebacks}

@item 
New @ref{7c2,,-P} command line option and 
@geindex PYTHONSAFEPATH
@geindex environment variable; PYTHONSAFEPATH
@ref{7c3,,PYTHONSAFEPATH} environment
variable to @ref{7c4,,disable automatically prepending potentially unsafe paths} to @ref{3e2,,sys.path}
@end itemize

New typing features:


@itemize *

@item 
@ref{7c5,,PEP 646; Variadic generics}

@item 
@ref{7c6,,PEP 655; Marking individual TypedDict items as required or not-required}

@item 
@ref{7c7,,PEP 673; Self type}

@item 
@ref{7c8,,PEP 675; Arbitrary literal string type}

@item 
@ref{7c9,,PEP 681; Data class transforms}
@end itemize

Important deprecations, removals and restrictions:


@itemize *

@item 
@geindex Python Enhancement Proposals; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}:
@ref{7ca,,Many legacy standard library modules have been deprecated} and will be removed in Python 3.13

@item 
@geindex Python Enhancement Proposals; PEP 624
PEP 624@footnote{https://peps.python.org/pep-0624/}:
@ref{7cb,,Py_UNICODE encoder APIs have been removed}

@item 
@geindex Python Enhancement Proposals; PEP 670
PEP 670@footnote{https://peps.python.org/pep-0670/}:
@ref{7cc,,Macros converted to static inline functions}
@end itemize

@node New Features<5>,New Features Related to Type Hints<2>,Summary – Release highlights<3>,What’s New In Python 3 11
@anchor{whatsnew/3 11 new-features}@anchor{7cd}@anchor{whatsnew/3 11 whatsnew311-features}@anchor{7ce}
@subsection New Features


@menu
* PEP 657; Fine-grained error locations in tracebacks: PEP 657 Fine-grained error locations in tracebacks. 
* PEP 654; Exception Groups and except*: PEP 654 Exception Groups and except*. 
* PEP 678; Exceptions can be enriched with notes: PEP 678 Exceptions can be enriched with notes. 
* Windows py.exe launcher improvements: Windows py exe launcher improvements. 

@end menu

@node PEP 657 Fine-grained error locations in tracebacks,PEP 654 Exception Groups and except*,,New Features<5>
@anchor{whatsnew/3 11 pep-657-fine-grained-error-locations-in-tracebacks}@anchor{7cf}@anchor{whatsnew/3 11 whatsnew311-pep657}@anchor{7c1}
@subsubsection PEP 657: Fine-grained error locations in tracebacks


When printing tracebacks, the interpreter will now point to the exact expression
that caused the error, instead of just the line. For example:

@example
Traceback (most recent call last):
  File "distance.py", line 11, in <module>
    print(manhattan_distance(p1, p2))
          ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "distance.py", line 6, in manhattan_distance
    return abs(point_1.x - point_2.x) + abs(point_1.y - point_2.y)
                           ^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'x'
@end example

Previous versions of the interpreter would point to just the line, making it
ambiguous which object was @code{None}. These enhanced errors can also be helpful
when dealing with deeply nested @ref{184,,dict} objects and multiple function calls:

@example
Traceback (most recent call last):
  File "query.py", line 37, in <module>
    magic_arithmetic('foo')
  File "query.py", line 18, in magic_arithmetic
    return add_counts(x) / 25
           ^^^^^^^^^^^^^
  File "query.py", line 24, in add_counts
    return 25 + query_user(user1) + query_user(user2)
                ^^^^^^^^^^^^^^^^^
  File "query.py", line 32, in query_user
    return 1 + query_count(db, response['a']['b']['c']['user'], retry=True)
                               ~~~~~~~~~~~~~~~~~~^^^^^
TypeError: 'NoneType' object is not subscriptable
@end example

As well as complex arithmetic expressions:

@example
Traceback (most recent call last):
  File "calculation.py", line 54, in <module>
    result = (x / y / z) * (a / b / c)
              ~~~~~~^~~
ZeroDivisionError: division by zero
@end example

Additionally, the information used by the enhanced traceback feature
is made available via a general API, that can be used to correlate
@ref{4ab,,bytecode} @ref{7d0,,instructions} with source code location.
This information can be retrieved using:


@itemize -

@item 
The @ref{7d1,,codeobject.co_positions()} method in Python.

@item 
The @ref{7d2,,PyCode_Addr2Location()} function in the C API.
@end itemize

See 
@geindex Python Enhancement Proposals; PEP 657
PEP 657@footnote{https://peps.python.org/pep-0657/} for more details. (Contributed by Pablo Galindo, Batuhan Taskaya
and Ammar Askar in bpo-43950@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43950}.)

@cartouche
@quotation Note 
This feature requires storing column positions in @ref{7d3,,Code Objects},
which may result in a small increase in interpreter memory usage
and disk usage for compiled Python files.
To avoid storing the extra information
and deactivate printing the extra traceback information,
use the @ref{170,,-X no_debug_ranges} command line option
or the 
@geindex PYTHONNODEBUGRANGES
@geindex environment variable; PYTHONNODEBUGRANGES
@ref{7d4,,PYTHONNODEBUGRANGES} environment variable.
@end quotation
@end cartouche

@node PEP 654 Exception Groups and except*,PEP 678 Exceptions can be enriched with notes,PEP 657 Fine-grained error locations in tracebacks,New Features<5>
@anchor{whatsnew/3 11 pep-654-exception-groups-and-except}@anchor{7d5}@anchor{whatsnew/3 11 whatsnew311-pep654}@anchor{7bf}
@subsubsection PEP 654: Exception Groups and @code{except*}


@geindex Python Enhancement Proposals; PEP 654
PEP 654@footnote{https://peps.python.org/pep-0654/} introduces language features that enable a program
to raise and handle multiple unrelated exceptions simultaneously.
The builtin types @ref{4d3,,ExceptionGroup} and @ref{566,,BaseExceptionGroup}
make it possible to group exceptions and raise them together,
and the new @ref{1ad,,except*} syntax generalizes
@ref{1ac,,except} to match subgroups of exception groups.

See 
@geindex Python Enhancement Proposals; PEP 654
PEP 654@footnote{https://peps.python.org/pep-0654/} for more details.

(Contributed by Irit Katriel in bpo-45292@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45292}. PEP written by
Irit Katriel, Yury Selivanov and Guido van Rossum.)

@node PEP 678 Exceptions can be enriched with notes,Windows py exe launcher improvements,PEP 654 Exception Groups and except*,New Features<5>
@anchor{whatsnew/3 11 pep-678-exceptions-can-be-enriched-with-notes}@anchor{7d6}@anchor{whatsnew/3 11 whatsnew311-pep678}@anchor{7c0}
@subsubsection PEP 678: Exceptions can be enriched with notes


The @ref{7d7,,add_note()} method is added to @ref{7d8,,BaseException}.
It can be used to enrich exceptions with context information
that is not available at the time when the exception is raised.
The added notes appear in the default traceback.

See 
@geindex Python Enhancement Proposals; PEP 678
PEP 678@footnote{https://peps.python.org/pep-0678/} for more details.

(Contributed by Irit Katriel in bpo-45607@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45607}.
PEP written by Zac Hatfield-Dodds.)

@node Windows py exe launcher improvements,,PEP 678 Exceptions can be enriched with notes,New Features<5>
@anchor{whatsnew/3 11 whatsnew311-windows-launcher}@anchor{7d9}@anchor{whatsnew/3 11 windows-py-exe-launcher-improvements}@anchor{7da}
@subsubsection Windows @code{py.exe} launcher improvements


The copy of the @ref{7db,,Python install manager} included with Python 3.11 has been significantly
updated. It now supports company/tag syntax as defined in 
@geindex Python Enhancement Proposals; PEP 514
PEP 514@footnote{https://peps.python.org/pep-0514/} using the
@code{-V:@var{<company>}/@var{<tag>}} argument instead of the limited @code{-@var{<major>}.@var{<minor>}}.
This allows launching distributions other than @code{PythonCore},
the one hosted on python.org@footnote{https://www.python.org}.

When using @code{-V:} selectors, either company or tag can be omitted, but all
installs will be searched. For example, @code{-V:OtherPython/} will select the
“best” tag registered for @code{OtherPython}, while @code{-V:3.11} or @code{-V:/3.11}
will select the “best” distribution with tag @code{3.11}.

When using the legacy @code{-@var{<major>}}, @code{-@var{<major>}.@var{<minor>}},
@code{-@var{<major>}-@var{<bitness>}} or @code{-@var{<major>}.@var{<minor>}-@var{<bitness>}} arguments,
all existing behaviour should be preserved from past versions,
and only releases from @code{PythonCore} will be selected.
However, the @code{-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 @code{-32} suffix.
All releases of Python since 3.5 have included this in their 32-bit builds.
@anchor{whatsnew/3 11 new-feat-related-type-hints-311}@anchor{7dc}
@node New Features Related to Type Hints<2>,Other Language Changes<3>,New Features<5>,What’s New In Python 3 11
@anchor{whatsnew/3 11 new-features-related-to-type-hints}@anchor{7dd}@anchor{whatsnew/3 11 whatsnew311-typing-features}@anchor{7de}
@subsection New Features Related to Type Hints


This section covers major changes affecting 
@geindex Python Enhancement Proposals; PEP 484
PEP 484@footnote{https://peps.python.org/pep-0484/} type hints and
the @ref{10b,,typing} module.

@menu
* PEP 646; Variadic generics: PEP 646 Variadic generics. 
* PEP 655; Marking individual TypedDict items as required or not-required: PEP 655 Marking individual TypedDict items as required or not-required. 
* PEP 673; Self type: PEP 673 Self type. 
* PEP 675; Arbitrary literal string type: PEP 675 Arbitrary literal string type. 
* PEP 681; Data class transforms: PEP 681 Data class transforms. 
* PEP 563 may not be the future:: 

@end menu

@node PEP 646 Variadic generics,PEP 655 Marking individual TypedDict items as required or not-required,,New Features Related to Type Hints<2>
@anchor{whatsnew/3 11 pep-646-variadic-generics}@anchor{7df}@anchor{whatsnew/3 11 whatsnew311-pep646}@anchor{7c5}
@subsubsection PEP 646: Variadic generics


@geindex Python Enhancement Proposals; PEP 484
PEP 484@footnote{https://peps.python.org/pep-0484/} previously introduced @ref{487,,TypeVar}, enabling creation
of generics parameterised with a single type. 
@geindex Python Enhancement Proposals; PEP 646
PEP 646@footnote{https://peps.python.org/pep-0646/} adds
@ref{489,,TypeVarTuple}, enabling parameterisation
with an `arbitrary' number of types. In other words,
a @code{TypeVarTuple} is a `variadic' type variable,
enabling `variadic' generics.

This enables a wide variety of use cases.
In particular, it allows the type of array-like structures
in numerical computing libraries such as NumPy and TensorFlow to be
parameterised with the array `shape'. Static type checkers will now
be able to catch shape-related bugs in code that uses these libraries.

See 
@geindex Python Enhancement Proposals; PEP 646
PEP 646@footnote{https://peps.python.org/pep-0646/} for more details.

(Contributed by Matthew Rahtz in bpo-43224@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43224}, with contributions by
Serhiy Storchaka and Jelle Zijlstra. PEP written by Mark Mendoza, Matthew
Rahtz, Pradeep Kumar Srinivasan, and Vincent Siles.)

@node PEP 655 Marking individual TypedDict items as required or not-required,PEP 673 Self type,PEP 646 Variadic generics,New Features Related to Type Hints<2>
@anchor{whatsnew/3 11 pep-655-marking-individual-typeddict-items-as-required-or-not-required}@anchor{7e0}@anchor{whatsnew/3 11 whatsnew311-pep655}@anchor{7c6}
@subsubsection PEP 655: Marking individual @code{TypedDict} items as required or not-required


@ref{7e1,,Required} and @ref{7e2,,NotRequired} provide a
straightforward way to mark whether individual items in a
@ref{330,,TypedDict} must be present. Previously, this was only possible
using inheritance.

All fields are still required by default,
unless the `total' parameter is set to @code{False},
in which case all fields are still not-required by default.
For example, the following specifies a @code{TypedDict}
with one required and one not-required key:

@example
class Movie(TypedDict):
   title: str
   year: NotRequired[int]

m1: Movie = @{"title": "Black Panther", "year": 2018@}  # OK
m2: Movie = @{"title": "Star Wars"@}  # OK (year is not required)
m3: Movie = @{"year": 2022@}  # ERROR (missing required field title)
@end example

The following definition is equivalent:

@example
class Movie(TypedDict, total=False):
   title: Required[str]
   year: int
@end example

See 
@geindex Python Enhancement Proposals; PEP 655
PEP 655@footnote{https://peps.python.org/pep-0655/} for more details.

(Contributed by David Foster and Jelle Zijlstra in bpo-47087@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47087}. PEP
written by David Foster.)

@node PEP 673 Self type,PEP 675 Arbitrary literal string type,PEP 655 Marking individual TypedDict items as required or not-required,New Features Related to Type Hints<2>
@anchor{whatsnew/3 11 pep-673-self-type}@anchor{7e3}@anchor{whatsnew/3 11 whatsnew311-pep673}@anchor{7c7}
@subsubsection PEP 673: @code{Self} type


The new @ref{7e4,,Self} annotation provides a simple and intuitive
way to annotate methods that return an instance of their class. This
behaves the same as the @ref{487,,TypeVar}-based approach
@geindex Python Enhancement Proposals; PEP 484#annotating-instance-and-class-methods
specified in PEP 484@footnote{https://peps.python.org/pep-0484/#annotating-instance-and-class-methods},
but is more concise and easier to follow.

Common use cases include alternative constructors provided as
@ref{48f,,classmethod}s,
and @ref{7e5,,__enter__()} methods that return @code{self}:

@example
class MyLock:
    def __enter__(self) -> Self:
        self.lock()
        return self

    ...

class MyInt:
    @@classmethod
    def fromhex(cls, s: str) -> Self:
        return cls(int(s, 16))

    ...
@end example

@ref{7e4,,Self} can also be used to annotate method parameters
or attributes of the same type as their enclosing class.

See 
@geindex Python Enhancement Proposals; PEP 673
PEP 673@footnote{https://peps.python.org/pep-0673/} for more details.

(Contributed by James Hilton-Balfe in bpo-46534@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46534}. PEP written by
Pradeep Kumar Srinivasan and James Hilton-Balfe.)

@node PEP 675 Arbitrary literal string type,PEP 681 Data class transforms,PEP 673 Self type,New Features Related to Type Hints<2>
@anchor{whatsnew/3 11 pep-675-arbitrary-literal-string-type}@anchor{7e6}@anchor{whatsnew/3 11 whatsnew311-pep675}@anchor{7c8}
@subsubsection PEP 675: Arbitrary literal string type


The new @ref{7e7,,LiteralString} annotation may be used to indicate
that a function parameter can be of any literal string type. This allows
a function to accept arbitrary literal string types, as well as strings
created from other literal strings. Type checkers can then
enforce that sensitive functions, such as those that execute SQL
statements 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:

@example
def run_query(sql: LiteralString) -> ...
    ...

def caller(
    arbitrary_string: str,
    query_string: LiteralString,
    table_name: LiteralString,
) -> None:
    run_query("SELECT * FROM students")       # ok
    run_query(query_string)                   # ok
    run_query("SELECT * FROM " + table_name)  # ok
    run_query(arbitrary_string)               # type checker error
    run_query(                                # type checker error
        f"SELECT * FROM students WHERE name = @{arbitrary_string@}"
    )
@end example

See 
@geindex Python Enhancement Proposals; PEP 675
PEP 675@footnote{https://peps.python.org/pep-0675/} for more details.

(Contributed by Jelle Zijlstra in bpo-47088@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47088}. PEP written by Pradeep
Kumar Srinivasan and Graham Bleaney.)

@node PEP 681 Data class transforms,PEP 563 may not be the future,PEP 675 Arbitrary literal string type,New Features Related to Type Hints<2>
@anchor{whatsnew/3 11 pep-681-data-class-transforms}@anchor{7e8}@anchor{whatsnew/3 11 whatsnew311-pep681}@anchor{7c9}
@subsubsection PEP 681: Data class transforms


@ref{6fc,,dataclass_transform} may be used to
decorate a class, metaclass, or a function that is itself a decorator.
The presence of @code{@@dataclass_transform()} tells a static type checker that the
decorated object performs runtime “magic” that transforms a class,
giving it @ref{4e2,,dataclass}-like behaviors.

For example:

@example
# The create_model decorator is defined by a library.
@@typing.dataclass_transform()
def create_model(cls: Type[T]) -> Type[T]:
    cls.__init__ = ...
    cls.__eq__ = ...
    cls.__ne__ = ...
    return cls

# The create_model decorator can now be used to create new model classes:
@@create_model
class CustomerModel:
    id: int
    name: str

c = CustomerModel(id=327, name="Eric Idle")
@end example

See 
@geindex Python Enhancement Proposals; PEP 681
PEP 681@footnote{https://peps.python.org/pep-0681/} for more details.

(Contributed by Jelle Zijlstra in gh-91860@footnote{https://github.com/python/cpython/issues/91860}. PEP written by
Erik De Bonte and Eric Traut.)

@node PEP 563 may not be the future,,PEP 681 Data class transforms,New Features Related to Type Hints<2>
@anchor{whatsnew/3 11 pep-563-may-not-be-the-future}@anchor{7e9}@anchor{whatsnew/3 11 whatsnew311-pep563-deferred}@anchor{7ea}
@subsubsection PEP 563 may not be the future


@geindex Python Enhancement Proposals; PEP 563
PEP 563@footnote{https://peps.python.org/pep-0563/} Postponed Evaluation of Annotations
(the @code{from __future__ import annotations} @ref{45b,,future statement})
that was originally planned for release in Python 3.10
has been put on hold indefinitely.
See this message from the Steering Council@footnote{https://mail.python.org/archives/list/python-dev@@python.org/message/VIZEBX5EYMSYIJNDBF6DMUMZOCWHARSO/}
for more information.

@node Other Language Changes<3>,Other CPython Implementation Changes,New Features Related to Type Hints<2>,What’s New In Python 3 11
@anchor{whatsnew/3 11 other-language-changes}@anchor{7eb}@anchor{whatsnew/3 11 whatsnew311-other-lang-changes}@anchor{7ec}
@subsection Other Language Changes



@itemize *

@item 
Starred unpacking expressions can now be used in @ref{348,,for} statements.
(See bpo-46725@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46725} for more details.)

@item 
Asynchronous @ref{7ed,,comprehensions} are now allowed
inside comprehensions in @ref{7ee,,asynchronous functions}.
Outer comprehensions implicitly become asynchronous in this case.
(Contributed by Serhiy Storchaka in bpo-33346@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33346}.)

@item 
A @ref{199,,TypeError} is now raised instead of an @ref{5f0,,AttributeError} in
@ref{187,,with} statements and @ref{7ef,,contextlib.ExitStack.enter_context()}
for objects that do not support the @ref{1e3,,context manager} protocol,
and in @ref{186,,async with} statements and
@ref{7f0,,contextlib.AsyncExitStack.enter_async_context()}
for objects not supporting the @ref{7f1,,asynchronous context manager} protocol.
(Contributed by Serhiy Storchaka in bpo-12022@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12022} and bpo-44471@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44471}.)

@item 
Added @ref{7f2,,object.__getstate__()}, which provides the default
implementation of the @code{__getstate__()} method. @ref{29,,copy}ing
and @ref{ab,,pickle}ing instances of subclasses of builtin types
@ref{342,,bytearray}, @ref{185,,set}, @ref{7f3,,frozenset},
@ref{7f4,,collections.OrderedDict}, @ref{7f5,,collections.deque},
@ref{7f6,,weakref.WeakSet}, and @ref{7f7,,datetime.tzinfo} now copies and
pickles instance attributes implemented as @ref{7f8,,slots}.
This change has an unintended side effect: It trips up a small minority
of existing Python projects not expecting @code{object.__getstate__()} to
exist. See the later comments on gh-70766@footnote{https://github.com/python/cpython/issues/70766} for discussions of what
workarounds such code may need.
(Contributed by Serhiy Storchaka in bpo-26579@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26579}.)
@end itemize
@anchor{whatsnew/3 11 whatsnew311-pythonsafepath}@anchor{7c4}

@itemize *

@item 
Added a @ref{7c2,,-P} command line option
and a 
@geindex PYTHONSAFEPATH
@geindex environment variable; PYTHONSAFEPATH
@ref{7c3,,PYTHONSAFEPATH} environment variable,
which disable the automatic prepending to @ref{3e2,,sys.path}
of the script’s directory when running a script,
or the current directory when using @ref{1a9,,-c} and @ref{23e,,-m}.
This ensures only stdlib and installed modules
are picked up by @ref{7f9,,import},
and avoids unintentionally or maliciously shadowing modules
with those in a local (and typically user-writable) directory.
(Contributed by Victor Stinner in gh-57684@footnote{https://github.com/python/cpython/issues/57684}.)

@item 
A @code{"z"} option was added to the @ref{4fa,,Format specification mini-language} that
coerces negative to positive zero after rounding to the format precision.
See 
@geindex Python Enhancement Proposals; PEP 682
PEP 682@footnote{https://peps.python.org/pep-0682/} for more details.
(Contributed by John Belmonte in gh-90153@footnote{https://github.com/python/cpython/issues/90153}.)

@item 
Bytes are no longer accepted on @ref{3e2,,sys.path}.  Support broke sometime
between Python 3.2 and 3.6, with no one noticing until after Python 3.10.0
was released. In addition, bringing back support would be problematic due to
interactions between @ref{7fa,,-b} and @ref{7fb,,sys.path_importer_cache} when
there is a mixture of @ref{16a,,str} and @ref{193,,bytes} keys.
(Contributed by Thomas Grainger in gh-91181@footnote{https://github.com/python/cpython/issues/91181}.)
@end itemize

@node Other CPython Implementation Changes,New Modules<3>,Other Language Changes<3>,What’s New In Python 3 11
@anchor{whatsnew/3 11 other-cpython-implementation-changes}@anchor{7fc}@anchor{whatsnew/3 11 whatsnew311-other-implementation-changes}@anchor{7fd}
@subsection Other CPython Implementation Changes



@itemize *

@item 
The special methods @ref{7fe,,__complex__()} for @ref{198,,complex}
and @ref{7ff,,__bytes__()} for @ref{193,,bytes} are implemented to support
the @ref{800,,typing.SupportsComplex} and @ref{801,,typing.SupportsBytes} protocols.
(Contributed by Mark Dickinson and Donghee Na in bpo-24234@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24234}.)

@item 
@code{siphash13} is added as a new internal hashing algorithm.
It has similar security properties as @code{siphash24},
but it is slightly faster for long inputs.
@ref{16a,,str}, @ref{193,,bytes}, and some other types
now use it as the default algorithm for @ref{802,,hash()}.
@geindex Python Enhancement Proposals; PEP 552
PEP 552@footnote{https://peps.python.org/pep-0552/} @ref{803,,hash-based .pyc files}
now use @code{siphash13} too.
(Contributed by Inada Naoki in bpo-29410@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29410}.)

@item 
When an active exception is re-raised by a @ref{804,,raise} statement with no parameters,
the traceback attached to this exception is now always @code{sys.exc_info()[1].__traceback__}.
This means that changes made to the traceback in the current @ref{1ac,,except} clause are
reflected in the re-raised exception.
(Contributed by Irit Katriel in bpo-45711@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45711}.)

@item 
The interpreter state’s representation of handled exceptions
(aka @code{exc_info} or @code{_PyErr_StackItem})
now only has the @code{exc_value} field; @code{exc_type} and @code{exc_traceback}
have been removed, as they can be derived from @code{exc_value}.
(Contributed by Irit Katriel in bpo-45711@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45711}.)

@item 
A new @ref{805,,command line option}, @code{AppendPath},
has been added for the Windows installer.
It behaves similarly to @code{PrependPath},
but appends the install and scripts directories instead of prepending them.
(Contributed by Bastian Neuburger in bpo-44934@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44934}.)

@item 
The @ref{806,,PyConfig.module_search_paths_set} field must now be set to @code{1} for
initialization to use @ref{643,,PyConfig.module_search_paths} to initialize
@ref{3e2,,sys.path}. Otherwise, initialization will recalculate the path and replace
any values added to @code{module_search_paths}.

@item 
The output of the @ref{807,,--help} option now fits in 50 lines/80 columns.
Information about @ref{808,,Python environment variables}
and @ref{170,,-X} options is now available using the respective
@ref{809,,--help-env} and @ref{80a,,--help-xoptions} flags,
and with the new @ref{80b,,--help-all}.
(Contributed by Éric Araujo in bpo-46142@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46142}.)

@item 
Converting between @ref{19c,,int} and @ref{16a,,str} in bases other than 2
(binary), 4, 8 (octal), 16 (hexadecimal), or 32 such as base 10 (decimal)
now raises a @ref{2ee,,ValueError} if the number of digits in string form is
above a limit to avoid potential denial of service attacks due to the
algorithmic complexity. This is a mitigation for 
@geindex Common Vulnerabilities and Exposures; CVE 2020-10735
CVE 2020-10735@footnote{https://www.cve.org/CVERecord?id=CVE-2020-10735}.
This limit can be configured or disabled by environment variable, command
line flag, or @ref{df,,sys} APIs. See the @ref{80c,,integer string conversion length limitation} documentation.  The default limit
is 4300 digits in string form.
@end itemize

@node New Modules<3>,Improved Modules<3>,Other CPython Implementation Changes,What’s New In Python 3 11
@anchor{whatsnew/3 11 new-modules}@anchor{80d}@anchor{whatsnew/3 11 whatsnew311-new-modules}@anchor{80e}
@subsection New Modules



@itemize *

@item 
@ref{103,,tomllib}: For parsing TOML@footnote{https://toml.io/}.
See 
@geindex Python Enhancement Proposals; PEP 680
PEP 680@footnote{https://peps.python.org/pep-0680/} for more details.
(Contributed by Taneli Hukkinen in bpo-40059@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40059}.)

@item 
@ref{123,,wsgiref.types}:
@geindex Python Enhancement Proposals; PEP 3333
WSGI@footnote{https://peps.python.org/pep-3333/}-specific types for static type checking.
(Contributed by Sebastian Rittau in bpo-42012@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42012}.)
@end itemize

@node Improved Modules<3>,Optimizations<4>,New Modules<3>,What’s New In Python 3 11
@anchor{whatsnew/3 11 improved-modules}@anchor{80f}@anchor{whatsnew/3 11 whatsnew311-improved-modules}@anchor{810}
@subsection Improved Modules


@menu
* asyncio: asyncio<6>. 
* contextlib:: 
* dataclasses:: 
* datetime: datetime<2>. 
* enum: enum<3>. 
* fcntl:: 
* fractions: fractions<4>. 
* functools: functools<2>. 
* gzip: gzip<2>. 
* hashlib: hashlib<2>. 
* IDLE and idlelib:: 
* inspect: inspect<3>. 
* locale: locale<3>. 
* logging:: 
* math: math<4>. 
* operator: operator<2>. 
* os: os<4>. 
* pathlib: pathlib<7>. 
* re: re<4>. 
* shutil: shutil<3>. 
* socket: socket<2>. 
* sqlite3: sqlite3<5>. 
* string:: 
* sys: sys<4>. 
* sysconfig: sysconfig<2>. 
* tempfile: tempfile<3>. 
* threading: threading<3>. 
* time: time<2>. 
* tkinter: tkinter<4>. 
* traceback: traceback<2>. 
* typing: typing<5>. 
* unicodedata: unicodedata<4>. 
* unittest: unittest<5>. 
* venv: venv<2>. 
* warnings: warnings<2>. 
* zipfile: zipfile<2>. 

@end menu

@node asyncio<6>,contextlib,,Improved Modules<3>
@anchor{whatsnew/3 11 asyncio}@anchor{811}@anchor{whatsnew/3 11 whatsnew311-asyncio}@anchor{812}
@subsubsection asyncio



@itemize *

@item 
Added the @ref{4d2,,TaskGroup} class,
an @ref{813,,asynchronous context manager}
holding a group of tasks that will wait for all of them upon exit.
For new code this is recommended over using
@ref{1cb,,create_task()} and @ref{814,,gather()} directly.
(Contributed by Yury Selivanov and others in gh-90908@footnote{https://github.com/python/cpython/issues/90908}.)

@item 
Added @ref{815,,timeout()}, an asynchronous context manager for
setting a timeout on asynchronous operations. For new code this is
recommended over using @ref{816,,wait_for()} directly.
(Contributed by Andrew Svetlov in gh-90927@footnote{https://github.com/python/cpython/issues/90927}.)

@item 
Added the @ref{2f7,,Runner} class, which exposes the machinery
used by @ref{2f5,,run()}.
(Contributed by Andrew Svetlov in gh-91218@footnote{https://github.com/python/cpython/issues/91218}.)

@item 
Added the @ref{817,,Barrier} class to the synchronization
primitives in the asyncio library, and the related
@ref{818,,BrokenBarrierError} exception.
(Contributed by Yves Duprat and Andrew Svetlov in gh-87518@footnote{https://github.com/python/cpython/issues/87518}.)

@item 
Added keyword argument `all_errors' to @ref{819,,asyncio.loop.create_connection()}
so that multiple connection errors can be raised as an @ref{4d3,,ExceptionGroup}.

@item 
Added the @ref{81a,,asyncio.StreamWriter.start_tls()} method for
upgrading existing stream-based connections to TLS.
(Contributed by Ian Good in bpo-34975@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34975}.)

@item 
Added raw datagram socket functions to the event loop:
@ref{81b,,sock_sendto()},
@ref{81c,,sock_recvfrom()} and
@ref{81d,,sock_recvfrom_into()}.
These have implementations in @ref{316,,SelectorEventLoop} and
@ref{81e,,ProactorEventLoop}.
(Contributed by Alex Grönholm in bpo-46805@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46805}.)

@item 
Added @ref{4d6,,cancelling()} and
@ref{4d7,,uncancel()} methods to @ref{1c9,,Task}.
These are primarily intended for internal use,
notably by @ref{4d2,,TaskGroup}.
@end itemize

@node contextlib,dataclasses,asyncio<6>,Improved Modules<3>
@anchor{whatsnew/3 11 contextlib}@anchor{81f}@anchor{whatsnew/3 11 whatsnew311-contextlib}@anchor{820}
@subsubsection contextlib



@itemize *

@item 
Added non parallel-safe @ref{821,,chdir()} context manager to change
the current working directory and then restore it on exit. Simple wrapper
around @ref{822,,chdir()}. (Contributed by Filipe Laíns in bpo-25625@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25625})
@end itemize

@node dataclasses,datetime<2>,contextlib,Improved Modules<3>
@anchor{whatsnew/3 11 dataclasses}@anchor{823}@anchor{whatsnew/3 11 whatsnew311-dataclasses}@anchor{824}
@subsubsection dataclasses



@itemize *

@item 
Change field default mutability check, allowing only defaults which are
@ref{825,,hashable} instead of any object which is not an instance of
@ref{184,,dict}, @ref{24f,,list} or @ref{185,,set}. (Contributed by Eric V. Smith in
bpo-44674@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44674}.)
@end itemize

@node datetime<2>,enum<3>,dataclasses,Improved Modules<3>
@anchor{whatsnew/3 11 datetime}@anchor{826}@anchor{whatsnew/3 11 whatsnew311-datetime}@anchor{827}
@subsubsection datetime



@itemize *

@item 
Add @ref{714,,datetime.UTC}, a convenience alias for
@ref{828,,datetime.timezone.utc}. (Contributed by Kabir Kwatra in gh-91973@footnote{https://github.com/python/cpython/issues/91973}.)

@item 
@ref{829,,datetime.date.fromisoformat()}, @ref{82a,,datetime.time.fromisoformat()} and
@ref{82b,,datetime.datetime.fromisoformat()} can now be used to parse most ISO 8601
formats (barring only those that support fractional hours and minutes).
(Contributed by Paul Ganssle in gh-80010@footnote{https://github.com/python/cpython/issues/80010}.)
@end itemize

@node enum<3>,fcntl,datetime<2>,Improved Modules<3>
@anchor{whatsnew/3 11 enum}@anchor{82c}@anchor{whatsnew/3 11 whatsnew311-enum}@anchor{82d}
@subsubsection enum



@itemize *

@item 
Renamed @code{EnumMeta} to @ref{4f8,,EnumType}
(@code{EnumMeta} kept as an alias).

@item 
Added @ref{82e,,StrEnum},
with members that can be used as (and must be) strings.

@item 
Added @ref{82f,,ReprEnum},
which only modifies the @ref{830,,__repr__()} of members
while returning their literal values (rather than names)
for @ref{831,,__str__()} and @ref{832,,__format__()}
(used by @ref{16a,,str()}, @ref{19a,,format()} and @ref{66b,,f-string}s).

@item 
Changed @ref{833,,Enum.__format__()} (the default for
@ref{19a,,format()}, @ref{834,,str.format()} and @ref{66b,,f-string}s) to always produce
the same result as @ref{835,,Enum.__str__()}:  for enums inheriting from
@ref{82f,,ReprEnum} it will be the member’s value; for all other enums
it will be the enum and member name (e.g. @code{Color.RED}).

@item 
Added a new `boundary' class parameter to @ref{836,,Flag} enums
and the @ref{837,,FlagBoundary} enum with its options,
to control how to handle out-of-range flag values.

@item 
Added the @ref{838,,verify()} enum decorator
and the @ref{839,,EnumCheck} enum with its options,
to check enum classes against several specific constraints.

@item 
Added the @ref{83a,,member()} and @ref{83b,,nonmember()} decorators,
to ensure the decorated object is/is not converted to an enum member.

@item 
Added the @ref{83c,,property()} decorator,
which works like @ref{4b4,,property()} except for enums.
Use this instead of @ref{83d,,types.DynamicClassAttribute()}.

@item 
Added the @ref{83e,,global_enum()} enum decorator,
which adjusts @ref{830,,__repr__()} and @ref{831,,__str__()}
to show values as members of their module rather than the enum class.
For example, @code{'re.ASCII'} for the @ref{83f,,ASCII} member
of @ref{840,,re.RegexFlag} rather than @code{'RegexFlag.ASCII'}.

@item 
Enhanced @ref{836,,Flag} to support
@ref{841,,len()}, iteration and @ref{349,,in}/@ref{842,,not in} on its members.
For example, the following now works:
@code{len(AFlag(3)) == 2 and list(AFlag(3)) == (AFlag.ONE, AFlag.TWO)}

@item 
Changed @ref{843,,Enum} and @ref{836,,Flag}
so that members are now defined
before @ref{844,,__init_subclass__()} is called;
@ref{845,,dir()} now includes methods, etc., from mixed-in data types.

@item 
Changed @ref{836,,Flag}
to only consider primary values (power of two) canonical
while composite values (@code{3}, @code{6}, @code{10}, etc.) are considered aliases;
inverted flags are coerced to their positive equivalent.
@end itemize

@node fcntl,fractions<4>,enum<3>,Improved Modules<3>
@anchor{whatsnew/3 11 fcntl}@anchor{846}@anchor{whatsnew/3 11 whatsnew311-fcntl}@anchor{847}
@subsubsection fcntl



@itemize *

@item 
On FreeBSD, the @code{F_DUP2FD} and @code{F_DUP2FD_CLOEXEC} flags respectively
are supported, the former equals to @code{dup2} usage while the latter set
the @code{FD_CLOEXEC} flag in addition.
@end itemize

@node fractions<4>,functools<2>,fcntl,Improved Modules<3>
@anchor{whatsnew/3 11 fractions}@anchor{848}@anchor{whatsnew/3 11 whatsnew311-fractions}@anchor{849}
@subsubsection fractions



@itemize *

@item 
Support 
@geindex Python Enhancement Proposals; PEP 515
PEP 515@footnote{https://peps.python.org/pep-0515/}-style initialization of @ref{215,,Fraction} from
string.  (Contributed by Sergey B Kirpichev in bpo-44258@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44258}.)

@item 
@ref{215,,Fraction} now implements an @code{__int__} method, so
that an @code{isinstance(some_fraction, typing.SupportsInt)} check passes.
(Contributed by Mark Dickinson in bpo-44547@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44547}.)
@end itemize

@node functools<2>,gzip<2>,fractions<4>,Improved Modules<3>
@anchor{whatsnew/3 11 functools}@anchor{84a}@anchor{whatsnew/3 11 whatsnew311-functools}@anchor{84b}
@subsubsection functools



@itemize *

@item 
@ref{84c,,functools.singledispatch()} now supports @ref{2a9,,types.UnionType}
and @ref{2aa,,typing.Union} as annotations to the dispatch argument.:

@example
>>> from functools import singledispatch
>>> @@singledispatch
... def fun(arg, verbose=False):
...     if verbose:
...         print("Let me just say,", end=" ")
...     print(arg)
...
>>> @@fun.register
... def _(arg: int | float, verbose=False):
...     if verbose:
...         print("Strength in numbers, eh?", end=" ")
...     print(arg)
...
>>> from typing import Union
>>> @@fun.register
... def _(arg: Union[list, set], verbose=False):
...     if verbose:
...         print("Enumerate this:")
...     for i, elem in enumerate(arg):
...         print(i, elem)
...
@end example

(Contributed by Yurii Karabas in bpo-46014@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46014}.)
@end itemize

@node gzip<2>,hashlib<2>,functools<2>,Improved Modules<3>
@anchor{whatsnew/3 11 gzip}@anchor{84d}@anchor{whatsnew/3 11 whatsnew311-gzip}@anchor{84e}
@subsubsection gzip



@itemize *

@item 
The @ref{84f,,gzip.compress()} function is now faster when used with the
`mtime=0' argument as it delegates the compression entirely to a single
@ref{850,,zlib.compress()} operation. There is one side effect of this change: The
gzip file header contains an “OS” byte in its header. That was traditionally
always set to a value of 255 representing “unknown” by the @ref{6b,,gzip}
module. Now, when using @code{compress()} with `mtime=0', it may be
set to a different value by the underlying zlib C library Python was linked
against.
(See gh-112346@footnote{https://github.com/python/cpython/issues/112346} for details on the side effect.)
@end itemize

@node hashlib<2>,IDLE and idlelib,gzip<2>,Improved Modules<3>
@anchor{whatsnew/3 11 hashlib}@anchor{851}@anchor{whatsnew/3 11 whatsnew311-hashlib}@anchor{852}
@subsubsection hashlib



@itemize *

@item 
@ref{853,,hashlib.blake2b()} and @ref{854,,hashlib.blake2s()} now prefer libb2@footnote{https://www.blake2.net/}
over Python’s vendored copy.
(Contributed by Christian Heimes in bpo-47095@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47095}.)

@item 
The internal @code{_sha3} module with SHA3 and SHAKE algorithms now uses
`tiny_sha3' instead of the `Keccak Code Package' to reduce code and binary
size. The @ref{6c,,hashlib} module prefers optimized SHA3 and SHAKE
implementations from OpenSSL. The change affects only installations without
OpenSSL support.
(Contributed by Christian Heimes in bpo-47098@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47098}.)

@item 
Add @ref{855,,hashlib.file_digest()}, a helper function for efficient hashing
of files or file-like objects.
(Contributed by Christian Heimes in gh-89313@footnote{https://github.com/python/cpython/issues/89313}.)
@end itemize

@node IDLE and idlelib,inspect<3>,hashlib<2>,Improved Modules<3>
@anchor{whatsnew/3 11 idle-and-idlelib}@anchor{856}@anchor{whatsnew/3 11 whatsnew311-idle}@anchor{857}
@subsubsection IDLE and idlelib



@itemize *

@item 
Apply syntax highlighting to @code{.pyi} files. (Contributed by Alex
Waygood and Terry Jan Reedy in bpo-45447@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45447}.)

@item 
Include prompts when saving Shell with inputs and outputs.
(Contributed by Terry Jan Reedy in gh-95191@footnote{https://github.com/python/cpython/issues/95191}.)
@end itemize

@node inspect<3>,locale<3>,IDLE and idlelib,Improved Modules<3>
@anchor{whatsnew/3 11 inspect}@anchor{858}@anchor{whatsnew/3 11 whatsnew311-inspect}@anchor{859}
@subsubsection inspect



@itemize *

@item 
Add @ref{85a,,getmembers_static()} to return all members without
triggering dynamic lookup via the descriptor protocol. (Contributed by
Weipeng Hong in bpo-30533@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30533}.)

@item 
Add @ref{85b,,ismethodwrapper()}
for checking if the type of an object is a @ref{85c,,MethodWrapperType}.
(Contributed by Hakan Çelik in bpo-29418@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29418}.)

@item 
Change the frame-related functions in the @ref{82,,inspect} module to return new
@ref{85d,,FrameInfo} and @ref{85e,,Traceback} class instances
(backwards compatible with the previous @ref{85f,,named tuple}-like interfaces)
that includes the extended 
@geindex Python Enhancement Proposals; PEP 657
PEP 657@footnote{https://peps.python.org/pep-0657/} position information (end
line number, column and end column). The affected functions are:


@itemize *

@item 
@ref{860,,inspect.getframeinfo()}

@item 
@ref{861,,inspect.getouterframes()}

@item 
@ref{862,,inspect.getinnerframes()},

@item 
@ref{863,,inspect.stack()}

@item 
@ref{864,,inspect.trace()}
@end itemize

(Contributed by Pablo Galindo in gh-88116@footnote{https://github.com/python/cpython/issues/88116}.)
@end itemize

@node locale<3>,logging,inspect<3>,Improved Modules<3>
@anchor{whatsnew/3 11 locale}@anchor{865}@anchor{whatsnew/3 11 whatsnew311-locale}@anchor{866}
@subsubsection locale



@itemize *

@item 
Add @ref{867,,locale.getencoding()} to get the current locale encoding. It is similar to
@code{locale.getpreferredencoding(False)} but ignores the
@ref{868,,Python UTF-8 Mode}.
@end itemize

@node logging,math<4>,locale<3>,Improved Modules<3>
@anchor{whatsnew/3 11 logging}@anchor{869}@anchor{whatsnew/3 11 whatsnew311-logging}@anchor{86a}
@subsubsection logging



@itemize *

@item 
Added @ref{86b,,getLevelNamesMapping()}
to return a mapping from logging level names (e.g. @code{'CRITICAL'})
to the values of their corresponding @ref{86c,,Logging Levels} (e.g. @code{50}, by default).
(Contributed by Andrei Kulakovin in gh-88024@footnote{https://github.com/python/cpython/issues/88024}.)

@item 
Added a @ref{86d,,createSocket()} method
to @ref{86e,,SysLogHandler}, to match
@ref{86f,,SocketHandler.createSocket()}.
It is called automatically during handler initialization
and when emitting an event, if there is no active socket.
(Contributed by Kirill Pinchuk in gh-88457@footnote{https://github.com/python/cpython/issues/88457}.)
@end itemize

@node math<4>,operator<2>,logging,Improved Modules<3>
@anchor{whatsnew/3 11 math}@anchor{870}@anchor{whatsnew/3 11 whatsnew311-math}@anchor{871}
@subsubsection math



@itemize *

@item 
Add @ref{872,,math.exp2()}: return 2 raised to the power of x.
(Contributed by Gideon Mitchell in bpo-45917@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45917}.)

@item 
Add @ref{873,,math.cbrt()}: return the cube root of x.
(Contributed by Ajith Ramachandran in bpo-44357@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44357}.)

@item 
The behaviour of two @ref{874,,math.pow()} corner cases was changed, for
consistency with the IEEE 754 specification. The operations
@code{math.pow(0.0, -math.inf)} and @code{math.pow(-0.0, -math.inf)} now return
@code{inf}. Previously they raised @ref{2ee,,ValueError}. (Contributed by Mark
Dickinson in bpo-44339@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44339}.)

@item 
The @ref{875,,math.nan} value is now always available.
(Contributed by Victor Stinner in bpo-46917@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46917}.)
@end itemize

@node operator<2>,os<4>,math<4>,Improved Modules<3>
@anchor{whatsnew/3 11 operator}@anchor{876}@anchor{whatsnew/3 11 whatsnew311-operator}@anchor{877}
@subsubsection operator



@itemize *

@item 
A new function @code{operator.call} has been added, such that
@code{operator.call(obj, *args, **kwargs) == obj(*args, **kwargs)}.
(Contributed by Antony Lee in bpo-44019@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44019}.)
@end itemize

@node os<4>,pathlib<7>,operator<2>,Improved Modules<3>
@anchor{whatsnew/3 11 os}@anchor{878}@anchor{whatsnew/3 11 whatsnew311-os}@anchor{879}
@subsubsection os



@itemize *

@item 
On Windows, @ref{747,,os.urandom()} now uses @code{BCryptGenRandom()},
instead of @code{CryptGenRandom()} which is deprecated.
(Contributed by Donghee Na in bpo-44611@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44611}.)
@end itemize

@node pathlib<7>,re<4>,os<4>,Improved Modules<3>
@anchor{whatsnew/3 11 pathlib}@anchor{87a}@anchor{whatsnew/3 11 whatsnew311-pathlib}@anchor{87b}
@subsubsection pathlib



@itemize *

@item 
@ref{538,,glob()} and @ref{539,,rglob()} return only
directories if `pattern' ends with a pathname components separator:
@ref{87c,,sep} or @ref{87d,,altsep}.
(Contributed by Eisuke Kawasima in bpo-22276@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22276} and bpo-33392@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33392}.)
@end itemize

@node re<4>,shutil<3>,pathlib<7>,Improved Modules<3>
@anchor{whatsnew/3 11 re}@anchor{87e}@anchor{whatsnew/3 11 whatsnew311-re}@anchor{87f}
@subsubsection re



@itemize *

@item 
Atomic grouping (@code{(?>...)}) and possessive quantifiers (@code{*+}, @code{++},
@code{?+}, @code{@{m,n@}+}) are now supported in regular expressions.
(Contributed by Jeffrey C. Jacobs and Serhiy Storchaka in bpo-433030@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=433030}.)
@end itemize

@node shutil<3>,socket<2>,re<4>,Improved Modules<3>
@anchor{whatsnew/3 11 shutil}@anchor{880}@anchor{whatsnew/3 11 whatsnew311-shutil}@anchor{881}
@subsubsection shutil



@itemize *

@item 
Add optional parameter `dir_fd' in @ref{354,,shutil.rmtree()}.
(Contributed by Serhiy Storchaka in bpo-46245@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46245}.)
@end itemize

@node socket<2>,sqlite3<5>,shutil<3>,Improved Modules<3>
@anchor{whatsnew/3 11 socket}@anchor{882}@anchor{whatsnew/3 11 whatsnew311-socket}@anchor{883}
@subsubsection socket



@itemize *

@item 
Add CAN Socket support for NetBSD.
(Contributed by Thomas Klausner in bpo-30512@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30512}.)

@item 
@ref{884,,create_connection()} has an option to raise, in case of
failure to connect, an @ref{4d3,,ExceptionGroup} containing all errors
instead of only raising the last error.
(Contributed by Irit Katriel in bpo-29980@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29980}.)
@end itemize

@node sqlite3<5>,string,socket<2>,Improved Modules<3>
@anchor{whatsnew/3 11 sqlite3}@anchor{885}@anchor{whatsnew/3 11 whatsnew311-sqlite3}@anchor{886}
@subsubsection sqlite3



@itemize *

@item 
You can now disable the authorizer by passing @ref{887,,None} to
@ref{5a9,,set_authorizer()}.
(Contributed by Erlend E. Aasland in bpo-44491@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44491}.)

@item 
Collation name @ref{888,,create_collation()} can now
contain any Unicode character.  Collation names with invalid characters
now raise @ref{889,,UnicodeEncodeError} instead of @ref{307,,sqlite3.ProgrammingError}.
(Contributed by Erlend E. Aasland in bpo-44688@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44688}.)

@item 
@ref{d4,,sqlite3} exceptions now include the SQLite extended error code as
@ref{88a,,sqlite_errorcode} and the SQLite error name as
@ref{88b,,sqlite_errorname}.
(Contributed by Aviv Palivoda, Daniel Shahaf, and Erlend E. Aasland in
bpo-16379@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16379} and bpo-24139@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24139}.)

@item 
Add @ref{88c,,setlimit()} and
@ref{88d,,getlimit()} to @ref{54e,,sqlite3.Connection} for
setting and getting SQLite limits by connection basis.
(Contributed by Erlend E. Aasland in bpo-45243@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45243}.)

@item 
@ref{d4,,sqlite3} now sets @ref{88e,,sqlite3.threadsafety} based on the default
threading mode the underlying SQLite library has been compiled with.
(Contributed by Erlend E. Aasland in bpo-45613@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45613}.)

@item 
@ref{d4,,sqlite3} C callbacks now use unraisable exceptions if callback
tracebacks are enabled. Users can now register an
@ref{508,,unraisable hook handler} to improve their debug
experience.
(Contributed by Erlend E. Aasland in bpo-45828@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45828}.)

@item 
Fetch across rollback no longer raises @ref{88f,,InterfaceError}.
Instead we leave it to the SQLite library to handle these cases.
(Contributed by Erlend E. Aasland in bpo-44092@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44092}.)

@item 
Add @ref{890,,serialize()} and
@ref{891,,deserialize()} to @ref{54e,,sqlite3.Connection} for
serializing and deserializing databases.
(Contributed by Erlend E. Aasland in bpo-41930@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41930}.)

@item 
Add @ref{892,,create_window_function()} to
@ref{54e,,sqlite3.Connection} for creating aggregate window functions.
(Contributed by Erlend E. Aasland in bpo-34916@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34916}.)

@item 
Add @ref{893,,blobopen()} to @ref{54e,,sqlite3.Connection}.
@ref{894,,sqlite3.Blob} allows incremental I/O operations on blobs.
(Contributed by Aviv Palivoda and Erlend E. Aasland in bpo-24905@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24905}.)
@end itemize

@node string,sys<4>,sqlite3<5>,Improved Modules<3>
@anchor{whatsnew/3 11 string}@anchor{895}@anchor{whatsnew/3 11 whatsnew311-string}@anchor{896}
@subsubsection string



@itemize *

@item 
Add @ref{897,,get_identifiers()}
and @ref{898,,is_valid()} to @ref{899,,string.Template},
which respectively return all valid placeholders,
and whether any invalid placeholders are present.
(Contributed by Ben Kehoe in gh-90465@footnote{https://github.com/python/cpython/issues/90465}.)
@end itemize

@node sys<4>,sysconfig<2>,string,Improved Modules<3>
@anchor{whatsnew/3 11 sys}@anchor{89a}@anchor{whatsnew/3 11 whatsnew311-sys}@anchor{89b}
@subsubsection sys



@itemize *

@item 
@ref{89c,,sys.exc_info()} now derives the @code{type} and @code{traceback} fields
from the @code{value} (the exception instance), so when an exception is
modified while it is being handled, the changes are reflected in
the results of subsequent calls to @code{exc_info()}.
(Contributed by Irit Katriel in bpo-45711@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45711}.)

@item 
Add @ref{89d,,sys.exception()} which returns the active exception instance
(equivalent to @code{sys.exc_info()[1]}).
(Contributed by Irit Katriel in bpo-46328@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46328}.)

@item 
Add the @ref{89e,,sys.flags.safe_path} flag.
(Contributed by Victor Stinner in gh-57684@footnote{https://github.com/python/cpython/issues/57684}.)
@end itemize

@node sysconfig<2>,tempfile<3>,sys<4>,Improved Modules<3>
@anchor{whatsnew/3 11 sysconfig}@anchor{89f}@anchor{whatsnew/3 11 whatsnew311-sysconfig}@anchor{8a0}
@subsubsection sysconfig



@itemize *

@item 
Three new @ref{447,,installation schemes}
(`posix_venv', `nt_venv' and `venv') were added and are used when Python
creates new virtual environments or when it is running from a virtual
environment.
The first two schemes (`posix_venv' and `nt_venv') are OS-specific
for non-Windows and Windows, the `venv' is essentially an alias to one of
them according to the OS Python runs on.
This is useful for downstream distributors who modify
@ref{8a1,,sysconfig.get_preferred_scheme()}.
Third party code that creates new virtual environments should use the new
`venv' installation scheme to determine the paths, as does @ref{118,,venv}.
(Contributed by Miro Hrončok in bpo-45413@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45413}.)
@end itemize

@node tempfile<3>,threading<3>,sysconfig<2>,Improved Modules<3>
@anchor{whatsnew/3 11 tempfile}@anchor{8a2}@anchor{whatsnew/3 11 whatsnew311-tempfile}@anchor{8a3}
@subsubsection tempfile



@itemize *

@item 
@ref{8a4,,SpooledTemporaryFile} objects now fully implement the methods
of @ref{8a5,,io.BufferedIOBase} or @ref{8a6,,io.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 in gh-70363@footnote{https://github.com/python/cpython/issues/70363}.)
@end itemize

@node threading<3>,time<2>,tempfile<3>,Improved Modules<3>
@anchor{whatsnew/3 11 threading}@anchor{8a7}@anchor{whatsnew/3 11 whatsnew311-threading}@anchor{8a8}
@subsubsection threading



@itemize *

@item 
On Unix, if the @code{sem_clockwait()} function is available in the C library
(glibc 2.30 and newer), the @ref{8a9,,threading.Lock.acquire()} method now uses
the monotonic clock (@ref{8aa,,time.CLOCK_MONOTONIC}) for the timeout, rather
than using the system clock (@ref{8ab,,time.CLOCK_REALTIME}), to not be affected
by system clock changes.
(Contributed by Victor Stinner in bpo-41710@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41710}.)
@end itemize

@node time<2>,tkinter<4>,threading<3>,Improved Modules<3>
@anchor{whatsnew/3 11 time}@anchor{8ac}@anchor{whatsnew/3 11 whatsnew311-time}@anchor{8ad}
@subsubsection time



@itemize *

@item 
On Unix, @ref{8ae,,time.sleep()} now uses the @code{clock_nanosleep()} or
@code{nanosleep()} function, if available, which has a resolution of 1 nanosecond
(10@w{^-9} seconds), rather than using @code{select()} which has a resolution
of 1 microsecond (10@w{^-6} seconds).
(Contributed by Benjamin Szőke and Victor Stinner in bpo-21302@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21302}.)

@item 
On Windows 8.1 and newer, @ref{8ae,,time.sleep()} now uses a waitable timer based
on high-resolution timers@footnote{https://docs.microsoft.com/en-us/windows-hardware/drivers/kernel/high-resolution-timers}
which has a resolution of 100 nanoseconds (10@w{^-7} seconds). Previously,
it had a resolution of 1 millisecond (10@w{^-3} seconds).
(Contributed by Benjamin Szőke, Donghee Na, Eryk Sun and Victor Stinner in bpo-21302@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21302} and bpo-45429@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45429}.)
@end itemize

@node tkinter<4>,traceback<2>,time<2>,Improved Modules<3>
@anchor{whatsnew/3 11 tkinter}@anchor{8af}@anchor{whatsnew/3 11 whatsnew311-tkinter}@anchor{8b0}
@subsubsection tkinter



@itemize *

@item 
Added method @code{info_patchlevel()} which returns the exact version of
the Tcl library as a named tuple similar to @ref{8b1,,sys.version_info}.
(Contributed by Serhiy Storchaka in gh-91827@footnote{https://github.com/python/cpython/issues/91827}.)
@end itemize

@node traceback<2>,typing<5>,tkinter<4>,Improved Modules<3>
@anchor{whatsnew/3 11 traceback}@anchor{8b2}@anchor{whatsnew/3 11 whatsnew311-traceback}@anchor{8b3}
@subsubsection traceback



@itemize *

@item 
Add @ref{8b4,,traceback.StackSummary.format_frame_summary()} to allow users
to override which frames appear in the traceback, and how they are
formatted.
(Contributed by Ammar Askar in bpo-44569@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44569}.)

@item 
Add @ref{8b5,,traceback.TracebackException.print()}, which prints the
formatted @ref{563,,TracebackException} instance to a file.
(Contributed by Irit Katriel in bpo-33809@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33809}.)
@end itemize

@node typing<5>,unicodedata<4>,traceback<2>,Improved Modules<3>
@anchor{whatsnew/3 11 typing}@anchor{8b6}@anchor{whatsnew/3 11 whatsnew311-typing}@anchor{8b7}
@subsubsection typing


For major changes, see @ref{7dc,,New Features Related to Type Hints}.


@itemize *

@item 
Add @ref{8b8,,typing.assert_never()} and @ref{8b9,,typing.Never}.
@code{typing.assert_never()} is useful for asking a type checker to confirm
that a line of code is not reachable. At runtime, it raises an
@ref{8ba,,AssertionError}.
(Contributed by Jelle Zijlstra in gh-90633@footnote{https://github.com/python/cpython/issues/90633}.)

@item 
Add @ref{8bb,,typing.reveal_type()}. This is useful for asking a type checker
what type it has inferred for a given expression. At runtime it prints
the type of the received value.
(Contributed by Jelle Zijlstra in gh-90572@footnote{https://github.com/python/cpython/issues/90572}.)

@item 
Add @ref{8bc,,typing.assert_type()}. This is useful for asking a type checker
to confirm that the type it has inferred for a given expression matches
the given type. At runtime it simply returns the received value.
(Contributed by Jelle Zijlstra in gh-90638@footnote{https://github.com/python/cpython/issues/90638}.)

@item 
@ref{330,,typing.TypedDict} types can now be generic. (Contributed by
Samodya Abeysiriwardane in gh-89026@footnote{https://github.com/python/cpython/issues/89026}.)

@item 
@ref{32f,,NamedTuple} types can now be generic.
(Contributed by Serhiy Storchaka in bpo-43923@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43923}.)

@item 
Allow subclassing of @ref{8bd,,typing.Any}. This is useful for avoiding
type checker errors related to highly dynamic class, such as mocks.
(Contributed by Shantanu Jain in gh-91154@footnote{https://github.com/python/cpython/issues/91154}.)

@item 
The @ref{8be,,typing.final()} decorator now sets the @code{__final__} attributed on
the decorated object.
(Contributed by Jelle Zijlstra in gh-90500@footnote{https://github.com/python/cpython/issues/90500}.)

@item 
The @ref{8bf,,typing.get_overloads()} function can be used for introspecting
the overloads of a function. @ref{8c0,,typing.clear_overloads()} can be used
to clear all registered overloads of a function.
(Contributed by Jelle Zijlstra in gh-89263@footnote{https://github.com/python/cpython/issues/89263}.)

@item 
The @ref{8c1,,__init__()} method of @ref{56b,,Protocol} subclasses
is now preserved. (Contributed by Adrian Garcia Badarasco in gh-88970@footnote{https://github.com/python/cpython/issues/88970}.)

@item 
The representation of empty tuple types (@code{Tuple[()]}) is simplified.
This affects introspection, e.g. @code{get_args(Tuple[()])} now evaluates
to @code{()} instead of @code{((),)}.
(Contributed by Serhiy Storchaka in gh-91137@footnote{https://github.com/python/cpython/issues/91137}.)

@item 
Loosen runtime requirements for type annotations by removing the callable
check in the private @code{typing._type_check} function. (Contributed by
Gregory Beauregard in gh-90802@footnote{https://github.com/python/cpython/issues/90802}.)

@item 
@ref{8c2,,typing.get_type_hints()} now supports evaluating strings as forward
references in @ref{8c3,,PEP 585 generic aliases}.
(Contributed by Niklas Rosenstein in gh-85542@footnote{https://github.com/python/cpython/issues/85542}.)

@item 
@ref{8c2,,typing.get_type_hints()} no longer adds @ref{8c4,,Optional}
to parameters with @code{None} as a default. (Contributed by Nikita Sobolev
in gh-90353@footnote{https://github.com/python/cpython/issues/90353}.)

@item 
@ref{8c2,,typing.get_type_hints()} now supports evaluating bare stringified
@ref{56d,,ClassVar} annotations. (Contributed by Gregory Beauregard
in gh-90711@footnote{https://github.com/python/cpython/issues/90711}.)

@item 
@ref{8c5,,typing.no_type_check()} no longer modifies external classes and functions.
It also now correctly marks classmethods as not to be type checked. (Contributed
by Nikita Sobolev in gh-90729@footnote{https://github.com/python/cpython/issues/90729}.)
@end itemize

@node unicodedata<4>,unittest<5>,typing<5>,Improved Modules<3>
@anchor{whatsnew/3 11 unicodedata}@anchor{8c6}@anchor{whatsnew/3 11 whatsnew311-unicodedata}@anchor{8c7}
@subsubsection unicodedata



@itemize *

@item 
The Unicode database has been updated to version 14.0.0.
(Contributed by Benjamin Peterson in bpo-45190@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45190}).
@end itemize

@node unittest<5>,venv<2>,unicodedata<4>,Improved Modules<3>
@anchor{whatsnew/3 11 unittest}@anchor{8c8}@anchor{whatsnew/3 11 whatsnew311-unittest}@anchor{8c9}
@subsubsection unittest



@itemize *

@item 
Added methods @ref{8ca,,enterContext()} and
@ref{8cb,,enterClassContext()} of class
@ref{2b5,,TestCase}, method
@ref{8cc,,enterAsyncContext()} of
class @ref{35f,,IsolatedAsyncioTestCase} and function
@ref{8cd,,unittest.enterModuleContext()}.
(Contributed by Serhiy Storchaka in bpo-45046@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45046}.)
@end itemize

@node venv<2>,warnings<2>,unittest<5>,Improved Modules<3>
@anchor{whatsnew/3 11 venv}@anchor{8ce}@anchor{whatsnew/3 11 whatsnew311-venv}@anchor{8cf}
@subsubsection venv



@itemize *

@item 
When new Python virtual environments are created, the `venv'
@ref{447,,sysconfig installation scheme} is used
to determine the paths inside the environment.
When Python runs in a virtual environment, the same installation scheme
is the default.
That means that downstream distributors can change the default sysconfig install
scheme without changing behavior of virtual environments.
Third party code that also creates new virtual environments should do the same.
(Contributed by Miro Hrončok in bpo-45413@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45413}.)
@end itemize

@node warnings<2>,zipfile<2>,venv<2>,Improved Modules<3>
@anchor{whatsnew/3 11 warnings}@anchor{8d0}@anchor{whatsnew/3 11 whatsnew311-warnings}@anchor{8d1}
@subsubsection warnings



@itemize *

@item 
@ref{17a,,warnings.catch_warnings()} now accepts arguments for @ref{8d2,,warnings.simplefilter()},
providing a more concise way to locally ignore warnings or convert them to errors.
(Contributed by Zac Hatfield-Dodds in bpo-47074@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47074}.)
@end itemize

@node zipfile<2>,,warnings<2>,Improved Modules<3>
@anchor{whatsnew/3 11 whatsnew311-zipfile}@anchor{8d3}@anchor{whatsnew/3 11 zipfile}@anchor{8d4}
@subsubsection zipfile



@itemize *

@item 
Added support for specifying member name encoding for reading metadata
in a @ref{8d5,,ZipFile}’s directory and file headers.
(Contributed by Stephen J. Turnbull and Serhiy Storchaka in bpo-28080@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28080}.)

@item 
Added @ref{8d6,,ZipFile.mkdir()}
for creating new directories inside ZIP archives.
(Contributed by Sam Ezeh in gh-49083@footnote{https://github.com/python/cpython/issues/49083}.)

@item 
Added @ref{8d7,,stem}, @ref{8d8,,suffix}
and @ref{8d9,,suffixes} to @ref{8da,,zipfile.Path}.
(Contributed by Miguel Brito in gh-88261@footnote{https://github.com/python/cpython/issues/88261}.)
@end itemize

@node Optimizations<4>,Faster CPython,Improved Modules<3>,What’s New In Python 3 11
@anchor{whatsnew/3 11 optimizations}@anchor{8db}@anchor{whatsnew/3 11 whatsnew311-optimizations}@anchor{8dc}
@subsection Optimizations


This section covers specific optimizations independent of the
@ref{7be,,Faster CPython} project, which is covered in its own section.


@itemize *

@item 
The compiler now optimizes simple
@ref{8dd,,printf-style % formatting} on string literals
containing only the format codes @code{%s}, @code{%r} and @code{%a} and makes it as
fast as a corresponding @ref{66b,,f-string} expression.
(Contributed by Serhiy Storchaka in bpo-28307@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28307}.)

@item 
Integer division (@code{//}) is better tuned for optimization by compilers.
It is now around 20% faster on x86-64 when dividing an @ref{19c,,int}
by a value smaller than @code{2**30}.
(Contributed by Gregory P. Smith and Tim Peters in gh-90564@footnote{https://github.com/python/cpython/issues/90564}.)

@item 
@ref{696,,sum()} is now nearly 30% faster for integers smaller than @code{2**30}.
(Contributed by Stefan Behnel in gh-68264@footnote{https://github.com/python/cpython/issues/68264}.)

@item 
Resizing lists is streamlined for the common case,
speeding up @ref{8de,,list.append()} by ≈15%
and simple @ref{8df,,list comprehension}s by up to 20-30%
(Contributed by Dennis Sweeney in gh-91165@footnote{https://github.com/python/cpython/issues/91165}.)

@item 
Dictionaries don’t store hash values when all keys are Unicode objects,
decreasing @ref{184,,dict} size.
For example, @code{sys.getsizeof(dict.fromkeys("abcdefg"))}
is reduced from 352 bytes to 272 bytes (23% smaller) on 64-bit platforms.
(Contributed by Inada Naoki in bpo-46845@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46845}.)

@item 
Using @ref{8e0,,asyncio.DatagramProtocol} is now orders of magnitude faster
when transferring large files over UDP,
with speeds over 100 times higher for a ≈60 MiB file.
(Contributed by msoxzw in gh-91487@footnote{https://github.com/python/cpython/issues/91487}.)

@item 
@ref{92,,math} functions @ref{8e1,,comb()} and @ref{8e2,,perm()} are now
≈10 times faster for large arguments (with a larger speedup for larger `k').
(Contributed by Serhiy Storchaka in bpo-37295@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37295}.)

@item 
The @ref{d7,,statistics} functions @ref{8e3,,mean()},
@ref{8e4,,variance()} and @ref{8e5,,stdev()} now consume
iterators in one pass rather than converting them to a @ref{24f,,list} first.
This is twice as fast and can save substantial memory.
(Contributed by Raymond Hettinger in gh-90415@footnote{https://github.com/python/cpython/issues/90415}.)

@item 
@ref{8e6,,unicodedata.normalize()}
now normalizes pure-ASCII strings in constant time.
(Contributed by Donghee Na in bpo-44987@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44987}.)
@end itemize

@node Faster CPython,CPython bytecode changes<3>,Optimizations<4>,What’s New In Python 3 11
@anchor{whatsnew/3 11 faster-cpython}@anchor{8e7}@anchor{whatsnew/3 11 whatsnew311-faster-cpython}@anchor{7be}
@subsection Faster CPython


CPython 3.11 is an average of
25% faster@footnote{https://github.com/faster-cpython/ideas#published-results}
than CPython 3.10 as measured with the
pyperformance@footnote{https://github.com/python/pyperformance} 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:
@ref{8e8,,Faster Startup} and @ref{8e9,,Faster Runtime}.
Optimizations not covered by this project are listed separately under
@ref{8dc,,Optimizations}.

@menu
* Faster Startup:: 
* Faster Runtime:: 
* Misc:: 
* FAQ:: 
* About:: 

@end menu

@node Faster Startup,Faster Runtime,,Faster CPython
@anchor{whatsnew/3 11 faster-startup}@anchor{8ea}@anchor{whatsnew/3 11 whatsnew311-faster-startup}@anchor{8e8}
@subsubsection Faster Startup


@menu
* Frozen imports / Static code objects:: 

@end menu

@node Frozen imports / Static code objects,,,Faster Startup
@anchor{whatsnew/3 11 frozen-imports-static-code-objects}@anchor{8eb}@anchor{whatsnew/3 11 whatsnew311-faster-imports}@anchor{8ec}
@subsubsection Frozen imports / Static code objects


Python caches @ref{4ab,,bytecode} in the @ref{8ed,,__pycache__}
directory to speed up module loading.

Previously in 3.10, Python module execution looked like this:

@example
Read __pycache__ -> Unmarshal -> Heap allocated code object -> Evaluate
@end example

In Python 3.11, the core modules essential for Python startup are “frozen”.
This means that their @ref{7d3,,Code Objects} (and bytecode)
are statically allocated by the interpreter.
This reduces the steps in module execution process to:

@example
Statically allocated code object -> Evaluate
@end example

Interpreter startup is now 10-15% faster in Python 3.11. This has a big
impact for short-running programs using Python.

(Contributed by Eric Snow, Guido van Rossum and Kumar Aditya in many issues.)

@node Faster Runtime,Misc,Faster Startup,Faster CPython
@anchor{whatsnew/3 11 faster-runtime}@anchor{8ee}@anchor{whatsnew/3 11 whatsnew311-faster-runtime}@anchor{8e9}
@subsubsection Faster Runtime


@menu
* Cheaper@comma{} lazy Python frames: Cheaper lazy Python frames. 
* Inlined Python function calls:: 
* PEP 659; Specializing Adaptive Interpreter: PEP 659 Specializing Adaptive Interpreter. 

@end menu

@node Cheaper lazy Python frames,Inlined Python function calls,,Faster Runtime
@anchor{whatsnew/3 11 cheaper-lazy-python-frames}@anchor{8ef}@anchor{whatsnew/3 11 whatsnew311-lazy-python-frames}@anchor{8f0}
@subsubsection Cheaper, lazy Python frames


Python frames, holding execution information,
are created whenever Python calls a Python function.
The following are new frame optimizations:


@itemize -

@item 
Streamlined the frame creation process.

@item 
Avoided memory allocation by generously re-using frame space on the C stack.

@item 
Streamlined the internal frame struct to contain only essential information.
Frames previously held extra debugging and memory management information.
@end itemize

Old-style @ref{8f1,,frame objects}
are now created only when requested by debuggers
or by Python introspection functions such as @ref{8f2,,sys._getframe()} and
@ref{8f3,,inspect.currentframe()}. For most user code, no frame objects are
created at all. As a result, nearly all Python functions calls have sped
up significantly. We measured a 3-7% speedup in pyperformance.

(Contributed by Mark Shannon in bpo-44590@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44590}.)
@anchor{whatsnew/3 11 inline-calls}@anchor{8f4}
@node Inlined Python function calls,PEP 659 Specializing Adaptive Interpreter,Cheaper lazy Python frames,Faster Runtime
@anchor{whatsnew/3 11 inlined-python-function-calls}@anchor{8f5}@anchor{whatsnew/3 11 whatsnew311-inline-calls}@anchor{8f6}
@subsubsection Inlined Python function calls


During a Python function call, Python will call an evaluating C function to
interpret that function’s code. This effectively limits pure Python recursion to
what’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. This
avoids 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 or
factorial, we observed a 1.7x speedup. This also means recursive functions
can recurse significantly deeper
(if the user increases the recursion limit with @ref{6eb,,sys.setrecursionlimit()}).
We measured a 1-3% improvement in pyperformance.

(Contributed by Pablo Galindo and Mark Shannon in bpo-45256@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45256}.)

@node PEP 659 Specializing Adaptive Interpreter,,Inlined Python function calls,Faster Runtime
@anchor{whatsnew/3 11 pep-659-specializing-adaptive-interpreter}@anchor{8f7}@anchor{whatsnew/3 11 whatsnew311-pep659}@anchor{4a0}
@subsubsection PEP 659: Specializing Adaptive Interpreter


@geindex Python Enhancement Proposals; PEP 659
PEP 659@footnote{https://peps.python.org/pep-0659/} is one of the key parts of the Faster CPython project. The general
idea is that while Python is a dynamic language, most code has regions where
objects and types rarely change. This concept is known as `type stability'.

At runtime, Python will try to look for common patterns and type stability
in the executing code. Python will then replace the current operation with a
more specialized one. This specialized operation uses fast paths available only
to those use cases/types, which generally outperform their generic
counterparts. This also brings in another concept called `inline caching', where
Python caches the results of expensive operations directly in the
@ref{4ab,,bytecode}.

The specializer will also combine certain common instruction pairs into one
superinstruction, reducing the overhead during execution.

Python will only specialize
when it sees code that is “hot” (executed multiple times). This prevents Python
from wasting time on run-once code. Python can also de-specialize when code is
too 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.
See 
@geindex Python Enhancement Proposals; PEP 659
PEP 659@footnote{https://peps.python.org/pep-0659/} for more information. Implementation by Mark Shannon and Brandt
Bucher, with additional help from Irit Katriel and Dennis Sweeney.)

@c If I missed out anyone, please add them.


@multitable {xxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxx} 
@headitem

Operation

@tab

Form

@tab

Specialization

@tab

Operation speedup
(up to)

@tab

Contributor(s)

@item

Binary
operations

@tab

@code{x + x}

@code{x - x}

@code{x * x}

@tab

Binary add, multiply and subtract for common types
such as @ref{19c,,int}, @ref{197,,float} and @ref{16a,,str}
take custom fast paths for their underlying types.

@tab

10%

@tab

Mark Shannon,
Donghee Na,
Brandt Bucher,
Dennis Sweeney

@item

Subscript

@tab

@code{a[i]}

@tab

Subscripting container types such as @ref{24f,,list},
@ref{614,,tuple} and @ref{184,,dict} directly index
the underlying data structures.

Subscripting custom @ref{588,,__getitem__()}
is also inlined similar to @ref{8f4,,Inlined Python function calls}.

@tab

10-25%

@tab

Irit Katriel,
Mark Shannon

@item

Store
subscript

@tab

@code{a[i] = z}

@tab

Similar to subscripting specialization above.

@tab

10-25%

@tab

Dennis Sweeney

@item

Calls

@tab

@code{f(arg)}

@code{C(arg)}

@tab

Calls to common builtin (C) functions and types such
as @ref{841,,len()} and @ref{16a,,str} directly call their
underlying C version. This avoids going through the
internal calling convention.

@tab

20%

@tab

Mark Shannon,
Ken Jin

@item

Load
global
variable

@tab

@code{print}

@code{len}

@tab

The object’s index in the globals/builtins namespace
is cached. Loading globals and builtins require
zero namespace lookups.

@tab

@footnote{
A similar optimization already existed since Python 3.8.
3.11 specializes for more forms and reduces some overhead.
}

@tab

Mark Shannon

@item

Load
attribute

@tab

@code{o.attr}

@tab

Similar to loading global variables. The attribute’s
index inside the class/object’s namespace is cached.
In most cases, attribute loading will require zero
namespace lookups.

@tab

@footnote{
A similar optimization already existed since Python 3.10.
3.11 specializes for more forms. Furthermore, all attribute loads should
be sped up by @uref{https://bugs.python.org/issue?@@action=redirect&bpo=45947,bpo-45947}.
}

@tab

Mark Shannon

@item

Load
methods for
call

@tab

@code{o.meth()}

@tab

The actual address of the method is cached. Method
loading now has no namespace lookups – even for
classes with long inheritance chains.

@tab

10-20%

@tab

Ken Jin,
Mark Shannon

@item

Store
attribute

@tab

@code{o.attr = z}

@tab

Similar to load attribute optimization.

@tab

2%
in pyperformance

@tab

Mark Shannon

@item

Unpack
Sequence

@tab

@code{*seq}

@tab

Specialized for common containers such as
@ref{24f,,list} and @ref{614,,tuple}.
Avoids internal calling convention.

@tab

8%

@tab

Brandt Bucher

@end multitable


@node Misc,FAQ,Faster Runtime,Faster CPython
@anchor{whatsnew/3 11 misc}@anchor{8f8}@anchor{whatsnew/3 11 whatsnew311-faster-cpython-misc}@anchor{8f9}
@subsubsection Misc



@itemize *

@item 
Objects now require less memory due to lazily created object namespaces.
Their namespace dictionaries now also share keys more freely.
(Contributed Mark Shannon in bpo-45340@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45340} and bpo-40116@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40116}.)

@item 
“Zero-cost” exceptions are implemented, eliminating the cost
of @ref{8fa,,try} statements when no exception is raised.
(Contributed by Mark Shannon in bpo-40222@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40222}.)

@item 
A more concise representation of exceptions in the interpreter reduced the
time required for catching an exception by about 10%.
(Contributed by Irit Katriel in bpo-45711@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45711}.)

@item 
@ref{be,,re}’s regular expression matching engine has been partially refactored,
and now uses computed gotos (or “threaded code”) on supported platforms. As a
result, Python 3.11 executes the pyperformance regular expression benchmarks@footnote{https://pyperformance.readthedocs.io/benchmarks.html#regex-dna} up to 10%
faster than Python 3.10.
(Contributed by Brandt Bucher in gh-91404@footnote{https://github.com/python/cpython/issues/91404}.)
@end itemize

@node FAQ,About,Misc,Faster CPython
@anchor{whatsnew/3 11 faq}@anchor{8fb}@anchor{whatsnew/3 11 whatsnew311-faster-cpython-faq}@anchor{8fc}
@subsubsection FAQ


@menu
* How should I write my code to utilize these speedups?:: 
* Will CPython 3.11 use more memory?: Will CPython 3 11 use more memory?. 
* I don’t see any speedups in my workload. Why?: I don’t see any speedups in my workload Why?. 
* Is there a JIT compiler?:: 

@end menu

@node How should I write my code to utilize these speedups?,Will CPython 3 11 use more memory?,,FAQ
@anchor{whatsnew/3 11 faster-cpython-faq-my-code}@anchor{8fd}@anchor{whatsnew/3 11 how-should-i-write-my-code-to-utilize-these-speedups}@anchor{8fe}
@subsubsection 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.

@node Will CPython 3 11 use more memory?,I don’t see any speedups in my workload Why?,How should I write my code to utilize these speedups?,FAQ
@anchor{whatsnew/3 11 faster-cpython-faq-memory}@anchor{8ff}@anchor{whatsnew/3 11 will-cpython-3-11-use-more-memory}@anchor{900}
@subsubsection 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 object
dictionaries as mentioned above.

@node I don’t see any speedups in my workload Why?,Is there a JIT compiler?,Will CPython 3 11 use more memory?,FAQ
@anchor{whatsnew/3 11 faster-cpython-ymmv}@anchor{901}@anchor{whatsnew/3 11 i-don-t-see-any-speedups-in-my-workload-why}@anchor{902}
@subsubsection I don’t see any speedups in my workload. Why?


Certain code won’t have noticeable benefits. If your code spends most of
its time on I/O operations, or already does most of its
computation in a C extension library like NumPy, there won’t be significant
speedups. This project currently benefits pure-Python workloads the most.

Furthermore, the pyperformance figures are a geometric mean. Even within the
pyperformance benchmarks, certain benchmarks have slowed down slightly, while
others have sped up by nearly 2x!

@node Is there a JIT compiler?,,I don’t see any speedups in my workload Why?,FAQ
@anchor{whatsnew/3 11 faster-cpython-jit}@anchor{903}@anchor{whatsnew/3 11 is-there-a-jit-compiler}@anchor{904}
@subsubsection Is there a JIT compiler?


No. We’re still exploring other optimizations.

@node About,,FAQ,Faster CPython
@anchor{whatsnew/3 11 about}@anchor{905}@anchor{whatsnew/3 11 whatsnew311-faster-cpython-about}@anchor{906}
@subsubsection About


Faster CPython explores optimizations for @ref{907,,CPython}. The main team is
funded by Microsoft to work on this full-time. Pablo Galindo Salgado is also
funded by Bloomberg LP to work on the project part-time. Finally, many
contributors are volunteers from the community.

@node CPython bytecode changes<3>,Deprecated<4>,Faster CPython,What’s New In Python 3 11
@anchor{whatsnew/3 11 cpython-bytecode-changes}@anchor{908}@anchor{whatsnew/3 11 whatsnew311-bytecode-changes}@anchor{909}
@subsection CPython bytecode changes


The bytecode now contains inline cache entries,
which take the form of the newly-added @ref{90a,,CACHE} 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 modifying
raw, adaptive bytecode containing quickened data.

@menu
* New opcodes:: 
* Replaced opcodes:: 
* Changed/removed opcodes:: 

@end menu

@node New opcodes,Replaced opcodes,,CPython bytecode changes<3>
@anchor{whatsnew/3 11 new-opcodes}@anchor{90b}@anchor{whatsnew/3 11 whatsnew311-added-opcodes}@anchor{90c}
@subsubsection New opcodes



@itemize *

@item 
@code{ASYNC_GEN_WRAP}, @ref{90d,,RETURN_GENERATOR} and @ref{90e,,SEND},
used in generators and co-routines.

@item 
@ref{90f,,COPY_FREE_VARS},
which avoids needing special caller-side code for closures.

@item 
@ref{910,,JUMP_BACKWARD_NO_INTERRUPT},
for use in certain loops where handling interrupts is undesirable.

@item 
@ref{911,,MAKE_CELL}, to create @ref{912,,Cell Objects}.

@item 
@ref{913,,CHECK_EG_MATCH}  and  @code{PREP_RERAISE_STAR},
to handle the @ref{7bf,,new exception groups and except*}
added in 
@geindex Python Enhancement Proposals; PEP 654
PEP 654@footnote{https://peps.python.org/pep-0654/}.

@item 
@ref{914,,PUSH_EXC_INFO}, for use in exception handlers.

@item 
@ref{5bb,,RESUME}, a no-op,
for internal tracing, debugging and optimization checks.
@end itemize

@node Replaced opcodes,Changed/removed opcodes,New opcodes,CPython bytecode changes<3>
@anchor{whatsnew/3 11 replaced-opcodes}@anchor{915}@anchor{whatsnew/3 11 whatsnew311-replaced-opcodes}@anchor{916}
@subsubsection Replaced opcodes



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Replaced Opcode(s)

@tab

New Opcode(s)

@tab

Notes

@item


@display
@code{BINARY_*}@w{ }
@code{INPLACE_*}@w{ }
@end display



@tab

@ref{364,,BINARY_OP}

@tab

Replaced all numeric binary/in-place
opcodes with a single opcode

@item


@display
@code{CALL_FUNCTION}@w{ }
@code{CALL_FUNCTION_KW}@w{ }
@code{CALL_METHOD}@w{ }
@end display



@tab


@display
@ref{917,,CALL}@w{ }
@code{KW_NAMES}@w{ }
@code{PRECALL}@w{ }
@ref{918,,PUSH_NULL}@w{ }
@end display



@tab

Decouples argument shifting for methods
from handling of keyword arguments;
allows better specialization of calls

@item


@display
@code{DUP_TOP}@w{ }
@code{DUP_TOP_TWO}@w{ }
@code{ROT_TWO}@w{ }
@code{ROT_THREE}@w{ }
@code{ROT_FOUR}@w{ }
@code{ROT_N}@w{ }
@end display



@tab


@display
@ref{919,,COPY}@w{ }
@ref{91a,,SWAP}@w{ }
@end display



@tab

Stack manipulation instructions

@item


@display
@code{JUMP_IF_NOT_EXC_MATCH}@w{ }
@end display



@tab


@display
@ref{91b,,CHECK_EXC_MATCH}@w{ }
@end display



@tab

Now performs check but doesn’t jump

@item


@display
@code{JUMP_ABSOLUTE}@w{ }
@code{POP_JUMP_IF_FALSE}@w{ }
@code{POP_JUMP_IF_TRUE}@w{ }
@end display



@tab


@display
@ref{91c,,JUMP_BACKWARD}@w{ }
@code{POP_JUMP_BACKWARD_IF_*}@w{ }
@code{POP_JUMP_FORWARD_IF_*}@w{ }
@end display



@tab

See @footnote{
All jump opcodes are now relative, including the
existing @code{JUMP_IF_TRUE_OR_POP} and @code{JUMP_IF_FALSE_OR_POP}.
The argument is now an offset from the current instruction
rather than an absolute location.
};
@code{TRUE}, @code{FALSE},
@code{NONE} and @code{NOT_NONE} variants
for each direction

@item


@display
@code{SETUP_WITH}@w{ }
@code{SETUP_ASYNC_WITH}@w{ }
@end display



@tab

@code{BEFORE_WITH}

@tab

@ref{187,,with} block setup

@end multitable

@anchor{whatsnew/3 11 whatsnew311-changed-opcodes}@anchor{91d}@anchor{whatsnew/3 11 whatsnew311-removed-opcodes}@anchor{91e}
@node Changed/removed opcodes,,Replaced opcodes,CPython bytecode changes<3>
@anchor{whatsnew/3 11 changed-removed-opcodes}@anchor{91f}@anchor{whatsnew/3 11 whatsnew311-changed-removed-opcodes}@anchor{920}
@subsubsection Changed/removed opcodes



@itemize *

@item 
Changed @ref{921,,MATCH_CLASS} and @ref{922,,MATCH_KEYS}
to no longer push an additional boolean value to indicate success/failure.
Instead, @code{None} is pushed on failure
in place of the tuple of extracted values.

@item 
Changed opcodes that work with exceptions to reflect them
now being represented as one item on the stack instead of three
(see gh-89874@footnote{https://github.com/python/cpython/issues/89874}).

@item 
Removed @code{COPY_DICT_WITHOUT_KEYS}, @code{GEN_START},
@code{POP_BLOCK}, @code{SETUP_FINALLY} and @code{YIELD_FROM}.
@end itemize
@anchor{whatsnew/3 11 whatsnew311-deprecated}@anchor{923}
@node Deprecated<4>,Pending Removal in Python 3 12,CPython bytecode changes<3>,What’s New In Python 3 11
@anchor{whatsnew/3 11 deprecated}@anchor{924}@anchor{whatsnew/3 11 whatsnew311-python-api-deprecated}@anchor{925}
@subsection Deprecated


This section lists Python APIs that have been deprecated in Python 3.11.

Deprecated C APIs are @ref{926,,listed separately}.
@anchor{whatsnew/3 11 whatsnew311-deprecated-language}@anchor{927}
@menu
* Language/Builtins:: 
* Modules:: 
* Standard Library:: 

@end menu

@node Language/Builtins,Modules,,Deprecated<4>
@anchor{whatsnew/3 11 language-builtins}@anchor{928}@anchor{whatsnew/3 11 whatsnew311-deprecated-builtins}@anchor{929}
@subsubsection Language/Builtins



@itemize *

@item 
Chaining @ref{48f,,classmethod} descriptors (introduced in bpo-19072@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19072})
is now deprecated.  It can no longer be used to wrap other descriptors
such as @ref{4b4,,property}.  The core design of this feature was flawed
and caused a number of downstream problems.  To “pass-through” a
@code{classmethod}, consider using the @code{__wrapped__} attribute
that was added in Python 3.10.
(Contributed by Raymond Hettinger in gh-89519@footnote{https://github.com/python/cpython/issues/89519}.)

@item 
Octal escapes in string and bytes literals with values larger than @code{0o377}
(255 in decimal) now produce a @ref{1a4,,DeprecationWarning}.
In a future Python version, they will raise a @ref{1af,,SyntaxWarning} and
eventually a @ref{18f,,SyntaxError}.
(Contributed by Serhiy Storchaka in gh-81548@footnote{https://github.com/python/cpython/issues/81548}.)

@item 
The delegation of @ref{19c,,int()} to @ref{19d,,__trunc__()} is now deprecated.
Calling @code{int(a)} when @code{type(a)} implements @code{__trunc__()} but not
@ref{19e,,__int__()} or @ref{19f,,__index__()} now raises
a @ref{1a4,,DeprecationWarning}.
(Contributed by Zackery Spytz in bpo-44977@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44977}.)
@end itemize

@node Modules,Standard Library,Language/Builtins,Deprecated<4>
@anchor{whatsnew/3 11 modules}@anchor{92a}@anchor{whatsnew/3 11 whatsnew311-deprecated-modules}@anchor{92b}
@subsubsection Modules

@anchor{whatsnew/3 11 whatsnew311-pep594}@anchor{7ca}

@itemize *

@item 
@geindex Python Enhancement Proposals; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/} led to the deprecations of the following modules
slated for removal in Python 3.13:


@multitable {xxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxx} 
@item

@code{aifc}

@tab

@code{chunk}

@tab

@code{msilib}

@tab

@code{pipes}

@tab

@code{telnetlib}

@item

@code{audioop}

@tab

@code{crypt}

@tab

@code{nis}

@tab

@code{sndhdr}

@tab

@code{uu}

@item

@code{cgi}

@tab

@code{imghdr}

@tab

@code{nntplib}

@tab

@code{spwd}

@tab

@code{xdrlib}

@item

@code{cgitb}

@tab

@code{mailcap}

@tab

@code{ossaudiodev}

@tab

@code{sunau}

@tab

@end multitable


(Contributed by Brett Cannon in bpo-47061@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47061} and Victor Stinner in
gh-68966@footnote{https://github.com/python/cpython/issues/68966}.)

@item 
The @code{asynchat}, @code{asyncore} and  @code{smtpd} modules have been
deprecated since at least Python 3.6. Their documentation and deprecation
warnings have now been updated to note they will be removed in Python 3.12.
(Contributed by Hugo van Kemenade in bpo-47022@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47022}.)

@item 
The @code{lib2to3} package and @code{2to3} tool
are now deprecated and may not be able to parse Python 3.10 or newer.
See 
@geindex Python Enhancement Proposals; PEP 617
PEP 617@footnote{https://peps.python.org/pep-0617/}, introducing the new PEG parser, for details.
(Contributed by Victor Stinner in bpo-40360@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40360}.)

@item 
Undocumented modules @code{sre_compile}, @code{sre_constants}
and @code{sre_parse} are now deprecated.
(Contributed by Serhiy Storchaka in bpo-47152@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47152}.)
@end itemize

@node Standard Library,,Modules,Deprecated<4>
@anchor{whatsnew/3 11 standard-library}@anchor{92c}@anchor{whatsnew/3 11 whatsnew311-deprecated-stdlib}@anchor{92d}
@subsubsection Standard Library



@itemize *

@item 
The following have been deprecated in @ref{26,,configparser} since Python 3.2.
Their deprecation warnings have now been updated to note they will be removed
in Python 3.12:


@itemize *

@item 
the @code{configparser.SafeConfigParser} class

@item 
the @code{configparser.ParsingError.filename} property

@item 
the @code{configparser.RawConfigParser.readfp()} method
@end itemize

(Contributed by Hugo van Kemenade in bpo-45173@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45173}.)

@item 
@code{configparser.LegacyInterpolation} has been deprecated in the docstring
since Python 3.2, and is not listed in the @ref{26,,configparser} documentation.
It now emits a @ref{1a4,,DeprecationWarning} and will be removed
in Python 3.13. Use @ref{92e,,configparser.BasicInterpolation} or
@ref{92f,,configparser.ExtendedInterpolation} instead.
(Contributed by Hugo van Kemenade in bpo-46607@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46607}.)

@item 
The older set of @ref{7f,,importlib.resources} functions were deprecated
in favor of the replacements added in Python 3.9
and will be removed in a future Python version,
due to not supporting resources located within package subdirectories:


@itemize *

@item 
@code{importlib.resources.contents()}

@item 
@code{importlib.resources.is_resource()}

@item 
@code{importlib.resources.open_binary()}

@item 
@code{importlib.resources.open_text()}

@item 
@code{importlib.resources.read_binary()}

@item 
@code{importlib.resources.read_text()}

@item 
@code{importlib.resources.path()}
@end itemize

@item 
The @ref{930,,locale.getdefaultlocale()} function is deprecated and will be
removed in Python 3.15. Use @ref{931,,locale.setlocale()},
@ref{75d,,locale.getpreferredencoding(False)} and
@ref{932,,locale.getlocale()} functions instead.
(Contributed by Victor Stinner in gh-90817@footnote{https://github.com/python/cpython/issues/90817}.)

@item 
The @code{locale.resetlocale()} function is deprecated and will be
removed in Python 3.13. Use @code{locale.setlocale(locale.LC_ALL, "")} instead.
(Contributed by Victor Stinner in gh-90817@footnote{https://github.com/python/cpython/issues/90817}.)

@item 
Stricter rules will now be applied for numerical group references
and group names in @ref{933,,regular expressions}.
Only sequences of ASCII digits will now be accepted as a numerical reference,
and the group name in @ref{193,,bytes} patterns and replacement strings
can only contain ASCII letters, digits and underscores.
For now, a deprecation warning is raised for syntax violating these rules.
(Contributed by Serhiy Storchaka in gh-91760@footnote{https://github.com/python/cpython/issues/91760}.)

@item 
In the @ref{be,,re} module, the @code{re.template()} function
and the corresponding @code{re.TEMPLATE} and @code{re.T} flags
are 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 in gh-92728@footnote{https://github.com/python/cpython/issues/92728}.)

@item 
@code{turtle.settiltangle()} has been deprecated since Python 3.1;
it now emits a deprecation warning and will be removed in Python 3.13. Use
@ref{934,,turtle.tiltangle()} instead (it was earlier incorrectly marked
as deprecated, and its docstring is now corrected).
(Contributed by Hugo van Kemenade in bpo-45837@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45837}.)

@item 
@ref{35e,,typing.Text}, which exists solely to provide compatibility support
between Python 2 and Python 3 code, is now deprecated. Its removal is
currently unplanned, but users are encouraged to use @ref{16a,,str} instead
wherever possible.
(Contributed by Alex Waygood in gh-92332@footnote{https://github.com/python/cpython/issues/92332}.)

@item 
The keyword argument syntax for constructing @ref{330,,typing.TypedDict} types
is now deprecated. Support will be removed in Python 3.13. (Contributed by
Jingchen Ye in gh-90224@footnote{https://github.com/python/cpython/issues/90224}.)

@item 
@code{webbrowser.MacOSX} is deprecated and will be removed in Python 3.13.
It is untested, undocumented, and not used by @ref{11c,,webbrowser} itself.
(Contributed by Donghee Na in bpo-42255@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42255}.)

@item 
The behavior of returning a value from a @ref{2b5,,TestCase} and
@ref{35f,,IsolatedAsyncioTestCase} test methods (other than the
default @code{None} value) is now deprecated.

@item 
Deprecated the following not-formally-documented @ref{10d,,unittest} functions,
scheduled for removal in Python 3.13:


@itemize *

@item 
@code{unittest.findTestCases()}

@item 
@code{unittest.makeSuite()}

@item 
@code{unittest.getTestCaseNames()}
@end itemize

Use @ref{593,,TestLoader} methods instead:


@itemize *

@item 
@ref{594,,unittest.TestLoader.loadTestsFromModule()}

@item 
@ref{595,,unittest.TestLoader.loadTestsFromTestCase()}

@item 
@ref{596,,unittest.TestLoader.getTestCaseNames()}
@end itemize

(Contributed by Erlend E. Aasland in bpo-5846@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5846}.)

@item 
@code{unittest.TestProgram.usageExit()} is marked deprecated, to be removed
in 3.13.
(Contributed by Carlos Damázio in gh-67048@footnote{https://github.com/python/cpython/issues/67048}.)
@end itemize
@anchor{whatsnew/3 11 whatsnew311-pending-removal}@anchor{935}
@node Pending Removal in Python 3 12,Removed<4>,Deprecated<4>,What’s New In Python 3 11
@anchor{whatsnew/3 11 pending-removal-in-python-3-12}@anchor{936}@anchor{whatsnew/3 11 whatsnew311-python-api-pending-removal}@anchor{937}
@subsection 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 are
@ref{938,,listed separately}.


@itemize *

@item 
The @code{asynchat} module

@item 
The @code{asyncore} module

@item 
The @ref{939,,entire distutils package}

@item 
The @code{imp} module

@item 
The @ref{23a,,typing.io} namespace

@item 
The @ref{93a,,typing.re} namespace

@item 
@code{cgi.log()}

@item 
@code{importlib.find_loader()}

@item 
@code{importlib.abc.Loader.module_repr()}

@item 
@code{importlib.abc.MetaPathFinder.find_module()}

@item 
@code{importlib.abc.PathEntryFinder.find_loader()}

@item 
@code{importlib.abc.PathEntryFinder.find_module()}

@item 
@code{importlib.machinery.BuiltinImporter.find_module()}

@item 
@code{importlib.machinery.BuiltinLoader.module_repr()}

@item 
@code{importlib.machinery.FileFinder.find_loader()}

@item 
@code{importlib.machinery.FileFinder.find_module()}

@item 
@code{importlib.machinery.FrozenImporter.find_module()}

@item 
@code{importlib.machinery.FrozenLoader.module_repr()}

@item 
@code{importlib.machinery.PathFinder.find_module()}

@item 
@code{importlib.machinery.WindowsRegistryFinder.find_module()}

@item 
@code{importlib.util.module_for_loader()}

@item 
@code{importlib.util.set_loader_wrapper()}

@item 
@code{importlib.util.set_package_wrapper()}

@item 
@code{pkgutil.ImpImporter}

@item 
@code{pkgutil.ImpLoader}

@item 
@code{pathlib.Path.link_to()}

@item 
@code{sqlite3.enable_shared_cache()}

@item 
@code{sqlite3.OptimizedUnicode()}

@item 
@code{PYTHONTHREADDEBUG} environment variable

@item 
The following deprecated aliases in @ref{10d,,unittest}:

@quotation


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxx} 
@headitem

Deprecated alias

@tab

Method Name

@tab

Deprecated in

@item

@code{failUnless}

@tab

@ref{74b,,assertTrue()}

@tab

3.1

@item

@code{failIf}

@tab

@ref{74c,,assertFalse()}

@tab

3.1

@item

@code{failUnlessEqual}

@tab

@ref{74d,,assertEqual()}

@tab

3.1

@item

@code{failIfEqual}

@tab

@ref{74e,,assertNotEqual()}

@tab

3.1

@item

@code{failUnlessAlmostEqual}

@tab

@ref{74f,,assertAlmostEqual()}

@tab

3.1

@item

@code{failIfAlmostEqual}

@tab

@ref{750,,assertNotAlmostEqual()}

@tab

3.1

@item

@code{failUnlessRaises}

@tab

@ref{751,,assertRaises()}

@tab

3.1

@item

@code{assert_}

@tab

@ref{74b,,assertTrue()}

@tab

3.2

@item

@code{assertEquals}

@tab

@ref{74d,,assertEqual()}

@tab

3.2

@item

@code{assertNotEquals}

@tab

@ref{74e,,assertNotEqual()}

@tab

3.2

@item

@code{assertAlmostEquals}

@tab

@ref{74f,,assertAlmostEqual()}

@tab

3.2

@item

@code{assertNotAlmostEquals}

@tab

@ref{750,,assertNotAlmostEqual()}

@tab

3.2

@item

@code{assertRegexpMatches}

@tab

@ref{752,,assertRegex()}

@tab

3.2

@item

@code{assertRaisesRegexp}

@tab

@ref{753,,assertRaisesRegex()}

@tab

3.2

@item

@code{assertNotRegexpMatches}

@tab

@ref{754,,assertNotRegex()}

@tab

3.5

@end multitable

@end quotation
@end itemize
@anchor{whatsnew/3 11 whatsnew311-removed}@anchor{93b}
@node Removed<4>,Porting to Python 3 11,Pending Removal in Python 3 12,What’s New In Python 3 11
@anchor{whatsnew/3 11 removed}@anchor{93c}@anchor{whatsnew/3 11 whatsnew311-python-api-removed}@anchor{93d}
@subsection Removed


This section lists Python APIs that have been removed in Python 3.11.

Removed C APIs are @ref{93e,,listed separately}.


@itemize *

@item 
Removed the @code{@@asyncio.coroutine()} @ref{93f,,decorator}
enabling legacy generator-based coroutines to be compatible with
@ref{940,,async} / @ref{18e,,await} code.
The function has been deprecated since Python 3.8 and the removal was
initially scheduled for Python 3.10. Use @ref{7ee,,async def} instead.
(Contributed by Illia Volochii in bpo-43216@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43216}.)

@item 
Removed @code{asyncio.coroutines.CoroWrapper} used for wrapping legacy
generator-based coroutine objects in the debug mode.
(Contributed by Illia Volochii in bpo-43216@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43216}.)

@item 
Due to significant security concerns, the `reuse_address' parameter of
@ref{941,,asyncio.loop.create_datagram_endpoint()}, disabled in Python 3.9, is
now entirely removed. This is because of the behavior of the socket option
@code{SO_REUSEADDR} in UDP.
(Contributed by Hugo van Kemenade in bpo-45129@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45129}.)

@item 
Removed the @code{binhex} module, deprecated in Python 3.9.
Also removed the related, similarly-deprecated @ref{11,,binascii} functions:


@itemize *

@item 
@code{binascii.a2b_hqx()}

@item 
@code{binascii.b2a_hqx()}

@item 
@code{binascii.rlecode_hqx()}

@item 
@code{binascii.rldecode_hqx()}
@end itemize

The @ref{942,,binascii.crc_hqx()} function remains available.

(Contributed by Victor Stinner in bpo-45085@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45085}.)

@item 
Removed the @code{distutils} @code{bdist_msi} command deprecated in Python 3.9.
Use @code{bdist_wheel} (wheel packages) instead.
(Contributed by Hugo van Kemenade in bpo-45124@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45124}.)

@item 
Removed the @ref{588,,__getitem__()} methods of
@ref{943,,xml.dom.pulldom.DOMEventStream}, @ref{944,,wsgiref.util.FileWrapper}
and @ref{945,,fileinput.FileInput}, deprecated since Python 3.9.
(Contributed by Hugo van Kemenade in bpo-45132@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45132}.)

@item 
Removed the deprecated @ref{67,,gettext} functions
@code{lgettext()}, @code{ldgettext()},
@code{lngettext()} and @code{ldngettext()}.
Also removed the @code{bind_textdomain_codeset()} function,
the @code{NullTranslations.output_charset()} and
@code{NullTranslations.set_output_charset()} methods,
and the `codeset' parameter of @code{translation()} and @code{install()},
since they are only used for the @code{l*gettext()} functions.
(Contributed by Donghee Na and Serhiy Storchaka in bpo-44235@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44235}.)

@item 
Removed from the @ref{82,,inspect} module:


@itemize *

@item 
The @code{getargspec()} function, deprecated since Python 3.0;
use @ref{231,,inspect.signature()} or @ref{946,,inspect.getfullargspec()} instead.

@item 
The @code{formatargspec()} function, deprecated since Python 3.5;
use the @ref{231,,inspect.signature()} function
or the @ref{4e4,,inspect.Signature} object directly.

@item 
The undocumented @code{Signature.from_builtin()}
and @code{Signature.from_function()} methods, deprecated since Python 3.5;
use the @ref{947,,Signature.from_callable()}
method instead.
@end itemize

(Contributed by Hugo van Kemenade in bpo-45320@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45320}.)

@item 
Removed the @ref{948,,__class_getitem__()} method
from @ref{6ce,,pathlib.PurePath},
because it was not used and added by mistake in previous versions.
(Contributed by Nikita Sobolev in bpo-46483@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46483}.)

@item 
Removed the @code{MailmanProxy} class in the @code{smtpd} module,
as it is unusable without the external @code{mailman} package.
(Contributed by Donghee Na in bpo-35800@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35800}.)

@item 
Removed the deprecated @code{split()} method of @code{_tkinter.TkappType}.
(Contributed by Erlend E. Aasland in bpo-38371@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38371}.)

@item 
Removed namespace package support from @ref{10d,,unittest} discovery.
It was introduced in Python 3.4 but has been broken since Python 3.7.
(Contributed by Inada Naoki in bpo-23882@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23882}.)

@item 
Removed the undocumented private @code{float.__set_format__()} method,
previously known as @code{float.__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 in bpo-46852@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46852}.)

@item 
The @code{--experimental-isolated-subinterpreters} configure flag
(and corresponding @code{EXPERIMENTAL_ISOLATED_SUBINTERPRETERS} macro)
have been removed.

@item 
Pynche@footnote{https://pypi.org/project/Pynche/}
— The Pythonically Natural Color and Hue Editor — has been moved out
of @code{Tools/scripts} and is being developed independently@footnote{https://gitlab.com/warsaw/pynche/-/tree/main} from the Python source tree.
@end itemize
@anchor{whatsnew/3 11 whatsnew311-porting}@anchor{949}
@node Porting to Python 3 11,Build Changes<3>,Removed<4>,What’s New In Python 3 11
@anchor{whatsnew/3 11 porting-to-python-3-11}@anchor{94a}@anchor{whatsnew/3 11 whatsnew311-python-api-porting}@anchor{94b}
@subsection Porting to Python 3.11


This section lists previously described changes and other bugfixes
in the Python API that may require changes to your Python code.

Porting notes for the C API are
@ref{94c,,listed separately}.


@itemize *

@item 
@ref{318,,open()}, @ref{741,,io.open()}, @ref{317,,codecs.open()} and
@ref{945,,fileinput.FileInput} no longer accept @code{'U'} (“universal newline”)
in the file mode. In Python 3, “universal newline” mode is used by default
whenever a file is opened in text mode,
and the @code{'U'} flag has been deprecated since Python 3.3.
The @ref{94d,,newline parameter}
to these functions controls how universal newlines work.
(Contributed by Victor Stinner in bpo-37330@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37330}.)

@item 
@ref{4c4,,ast.AST} node positions are now validated when provided to
@ref{4b2,,compile()} and other related functions. If invalid positions are detected,
a @ref{2ee,,ValueError} will be raised. (Contributed by Pablo Galindo in gh-93351@footnote{https://github.com/python/cpython/issues/93351})

@item 
Prohibited passing non-@ref{94e,,concurrent.futures.ThreadPoolExecutor}
executors to @ref{94f,,asyncio.loop.set_default_executor()}
following a deprecation in Python 3.8.
(Contributed by Illia Volochii in bpo-43234@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43234}.)

@item 
@ref{15,,calendar}: The @ref{950,,calendar.LocaleTextCalendar} and
@ref{951,,calendar.LocaleHTMLCalendar} classes now use
@ref{932,,locale.getlocale()}, instead of using @ref{930,,locale.getdefaultlocale()},
if no locale is specified.
(Contributed by Victor Stinner in bpo-46659@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46659}.)

@item 
The @ref{aa,,pdb} module now reads the @code{.pdbrc} configuration file with
the @code{'UTF-8'} encoding.
(Contributed by Srinivas Reddy Thatiparthy (శ్రీనివాస్  రెడ్డి తాటిపర్తి) in bpo-41137@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41137}.)

@item 
The `population' parameter of @ref{952,,random.sample()} must be a sequence,
and automatic conversion of @ref{185,,set}s to @ref{24f,,list}s
is no longer supported. Also, if the sample size
is larger than the population size, a @ref{2ee,,ValueError} is raised.
(Contributed by Raymond Hettinger in bpo-40465@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40465}.)

@item 
The `random' optional parameter of @ref{953,,random.shuffle()} was removed.
It was previously an arbitrary random function to use for the shuffle;
now, @ref{954,,random.random()} (its previous default) will always be used.

@item 
In @ref{be,,re} @ref{933,,Regular Expression Syntax}, global inline flags (e.g. @code{(?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 in bpo-47066@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47066}.)

@item 
In the @ref{be,,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 in bpo-35859@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35859}.)
@end itemize

@node Build Changes<3>,C API Changes<3>,Porting to Python 3 11,What’s New In Python 3 11
@anchor{whatsnew/3 11 build-changes}@anchor{955}@anchor{whatsnew/3 11 whatsnew311-build-changes}@anchor{956}
@subsection Build Changes



@itemize *

@item 
CPython now has 
@geindex Python Enhancement Proposals; PEP 11
PEP 11@footnote{https://peps.python.org/pep-0011/} 
@geindex Python Enhancement Proposals; PEP 11#tier-3
Tier 3 support@footnote{https://peps.python.org/pep-0011/#tier-3} for
cross compiling to the WebAssembly@footnote{https://webassembly.org/} platforms
Emscripten@footnote{https://emscripten.org/}
(@code{wasm32-unknown-emscripten}, i.e. Python in the browser)
and WebAssembly System Interface (WASI)@footnote{https://wasi.dev/}
(@code{wasm32-unknown-wasi}).
The effort is inspired by previous work like Pyodide@footnote{https://pyodide.org/}.
These platforms provide a limited subset of POSIX APIs; Python standard
libraries 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 in gh-84461@footnote{https://github.com/python/cpython/issues/84461}
and WASI contributed by Christian Heimes in gh-90473@footnote{https://github.com/python/cpython/issues/90473};
platforms promoted in gh-95085@footnote{https://github.com/python/cpython/issues/95085})

@item 
Building CPython now requires:


@itemize *

@item 
A C11@footnote{https://en.cppreference.com/w/c/11} compiler and standard library.
Optional C11 features@footnote{https://en.wikipedia.org/wiki/C11_(C_standard_revision)#Optional_features}
are not required.
(Contributed by Victor Stinner in bpo-46656@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46656},
bpo-45440@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45440} and bpo-46640@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46640}.)

@item 
Support for IEEE 754@footnote{https://en.wikipedia.org/wiki/IEEE_754}
floating-point numbers.
(Contributed by Victor Stinner in bpo-46917@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46917}.)
@end itemize

@item 
The @code{Py_NO_NAN} macro has been removed.
Since CPython now requires IEEE 754 floats, NaN values are always available.
(Contributed by Victor Stinner in bpo-46656@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46656}.)

@item 
The @ref{f6,,tkinter} package now requires Tcl/Tk@footnote{https://www.tcl.tk}
version 8.5.12 or newer.
(Contributed by Serhiy Storchaka in bpo-46996@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46996}.)

@item 
Build dependencies, compiler flags, and linker flags for most stdlib
extension modules are now detected by @code{configure}. libffi, libnsl,
libsqlite3, zlib, bzip2, liblzma, libcrypt, Tcl/Tk, and uuid flags
are detected by pkg-config@footnote{https://www.freedesktop.org/wiki/Software/pkg-config/} (when available).
@ref{f6,,tkinter} now requires a pkg-config command
to detect development settings for Tcl/Tk@footnote{https://www.tcl.tk} headers and libraries.
(Contributed by Christian Heimes and Erlend Egeberg Aasland in
bpo-45847@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45847}, bpo-45747@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45747}, and bpo-45763@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45763}.)

@item 
libpython is no longer linked against libcrypt.
(Contributed by Mike Gilbert in bpo-45433@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45433}.)

@item 
CPython can now be built with the
ThinLTO@footnote{https://clang.llvm.org/docs/ThinLTO.html} option
via passing @code{thin} to @ref{957,,--with-lto}, i.e. @code{--with-lto=thin}.
(Contributed by Donghee Na and Brett Holman in bpo-44340@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44340}.)

@item 
Freelists for object structs can now be disabled. A new @code{configure}
option @code{--without-freelists} can be used to disable all freelists
except empty tuple singleton.
(Contributed by Christian Heimes in bpo-45522@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45522}.)

@item 
@code{Modules/Setup} and @code{Modules/makesetup} have been improved and tied up.
Extension modules can now be built through @code{makesetup}. All except some
test modules can be linked statically into a main binary or library.
(Contributed by Brett Cannon and Christian Heimes in bpo-45548@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45548},
bpo-45570@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45570}, bpo-45571@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45571}, and bpo-43974@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43974}.)

@cartouche
@quotation Note 
Use the environment variables @code{TCLTK_CFLAGS} and
@code{TCLTK_LIBS} to manually specify the location of Tcl/Tk headers
and libraries. The @code{configure} options
@code{--with-tcltk-includes} and @code{--with-tcltk-libs}
have been removed.

On RHEL 7 and CentOS 7 the development packages do not provide @code{tcl.pc}
and @code{tk.pc}; use @code{TCLTK_LIBS="-ltk8.5 -ltkstub8.5 -ltcl8.5"}.
The directory @code{Misc/rhel7} contains @code{.pc} files and instructions
on how to build Python with RHEL 7’s and CentOS 7’s Tcl/Tk and OpenSSL.
@end quotation
@end cartouche

@item 
CPython will now use 30-bit digits by default for the Python @ref{19c,,int}
implementation. Previously, the default was to use 30-bit digits on platforms
with @code{SIZEOF_VOID_P >= 8}, and 15-bit digits otherwise. It’s still possible
to explicitly request use of 15-bit digits via either the
@ref{958,,--enable-big-digits} option to the configure script
or (for Windows) the @code{PYLONG_BITS_IN_DIGIT} variable in @code{PC/pyconfig.h},
but this option may be removed at some point in the future.
(Contributed by Mark Dickinson in bpo-45569@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45569}.)
@end itemize

@node C API Changes<3>,Notable changes in 3 11 4,Build Changes<3>,What’s New In Python 3 11
@anchor{whatsnew/3 11 c-api-changes}@anchor{959}@anchor{whatsnew/3 11 whatsnew311-c-api}@anchor{95a}
@subsection C API Changes


@menu
* New Features: New Features<6>. 
* Porting to Python 3.11: Porting to Python 3 11<2>. 
* Deprecated: Deprecated<5>. 
* Pending Removal in Python 3.12: Pending Removal in Python 3 12<2>. 
* Removed: Removed<5>. 

@end menu

@node New Features<6>,Porting to Python 3 11<2>,,C API Changes<3>
@anchor{whatsnew/3 11 id5}@anchor{95b}@anchor{whatsnew/3 11 whatsnew311-c-api-new-features}@anchor{95c}
@subsubsection New Features



@itemize *

@item 
Add a new @ref{95d,,PyType_GetName()} function to get type’s short name.
(Contributed by Hai Shi in bpo-42035@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42035}.)

@item 
Add a new @ref{95e,,PyType_GetQualName()} function to get type’s qualified name.
(Contributed by Hai Shi in bpo-42035@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42035}.)

@item 
Add new @ref{95f,,PyThreadState_EnterTracing()} and
@ref{960,,PyThreadState_LeaveTracing()} functions to the limited C API to
suspend and resume tracing and profiling.
(Contributed by Victor Stinner in bpo-43760@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43760}.)

@item 
Added the @ref{37f,,Py_Version} constant which bears the same value as
@ref{380,,PY_VERSION_HEX}.
(Contributed by  Gabriele N. Tornetta in bpo-43931@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43931}.)

@item 
@ref{961,,Py_buffer} and APIs are now part of the limited API and the stable
ABI:


@itemize *

@item 
@ref{639,,PyObject_CheckBuffer()}

@item 
@ref{63a,,PyObject_GetBuffer()}

@item 
@ref{962,,PyBuffer_GetPointer()}

@item 
@ref{963,,PyBuffer_SizeFromFormat()}

@item 
@ref{964,,PyBuffer_ToContiguous()}

@item 
@ref{965,,PyBuffer_FromContiguous()}

@item 
@ref{966,,PyObject_CopyData()}

@item 
@ref{967,,PyBuffer_IsContiguous()}

@item 
@ref{968,,PyBuffer_FillContiguousStrides()}

@item 
@ref{969,,PyBuffer_FillInfo()}

@item 
@ref{63b,,PyBuffer_Release()}

@item 
@ref{96a,,PyMemoryView_FromBuffer()}

@item 
@ref{96b,,bf_getbuffer} and
@ref{96c,,bf_releasebuffer} type slots
@end itemize

(Contributed by Christian Heimes in bpo-45459@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45459}.)

@item 
Added the @ref{635,,PyType_GetModuleByDef()} function, used to get the module
in which a method was defined, in cases where this information is not
available directly (via @ref{96d,,PyCMethod}).
(Contributed by Petr Viktorin in bpo-46613@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46613}.)

@item 
Add new functions to pack and unpack C double (serialize and deserialize):
@ref{96e,,PyFloat_Pack2()}, @ref{96f,,PyFloat_Pack4()}, @ref{970,,PyFloat_Pack8()},
@ref{971,,PyFloat_Unpack2()}, @ref{972,,PyFloat_Unpack4()} and
@ref{973,,PyFloat_Unpack8()}.
(Contributed by Victor Stinner in bpo-46906@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46906}.)

@item 
Add new functions to get frame object attributes:
@ref{974,,PyFrame_GetBuiltins()}, @ref{975,,PyFrame_GetGenerator()},
@ref{976,,PyFrame_GetGlobals()}, @ref{977,,PyFrame_GetLasti()}.

@item 
Added two new functions to get and set the active exception instance:
@ref{978,,PyErr_GetHandledException()} and @ref{979,,PyErr_SetHandledException()}.
These are alternatives to @ref{97a,,PyErr_SetExcInfo()} and
@ref{97b,,PyErr_GetExcInfo()} which work with the legacy 3-tuple
representation of exceptions.
(Contributed by Irit Katriel in bpo-46343@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46343}.)

@item 
Added the @ref{97c,,PyConfig.safe_path} member.
(Contributed by Victor Stinner in gh-57684@footnote{https://github.com/python/cpython/issues/57684}.)
@end itemize

@node Porting to Python 3 11<2>,Deprecated<5>,New Features<6>,C API Changes<3>
@anchor{whatsnew/3 11 id6}@anchor{97d}@anchor{whatsnew/3 11 whatsnew311-c-api-porting}@anchor{94c}
@subsubsection Porting to Python 3.11

@anchor{whatsnew/3 11 whatsnew311-pep670}@anchor{7cc}

@itemize *

@item 
Some macros have been converted to static inline functions to avoid
macro pitfalls@footnote{https://gcc.gnu.org/onlinedocs/cpp/Macro-Pitfalls.html}.
The change should be mostly transparent to users,
as the replacement functions will cast their arguments to the expected types
to 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.
See 
@geindex Python Enhancement Proposals; PEP 670
PEP 670@footnote{https://peps.python.org/pep-0670/} for more details.
(Contributed by Victor Stinner and Erlend E. Aasland in gh-89653@footnote{https://github.com/python/cpython/issues/89653}.)

@item 
@ref{97a,,PyErr_SetExcInfo()} no longer uses the @code{type} and @code{traceback}
arguments, the interpreter now derives those values from the exception
instance (the @code{value} argument). The function still steals references
of all three arguments.
(Contributed by Irit Katriel in bpo-45711@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45711}.)

@item 
@ref{97b,,PyErr_GetExcInfo()} now derives the @code{type} and @code{traceback}
fields of the result from the exception instance (the @code{value} field).
(Contributed by Irit Katriel in bpo-45711@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45711}.)

@item 
@ref{97e,,_frozen} has a new @code{is_package} field to indicate whether
or not the frozen module is a package.  Previously, a negative value
in the @code{size} field was the indicator.  Now only non-negative values
be used for @code{size}.
(Contributed by Kumar Aditya in bpo-46608@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46608}.)

@item 
@ref{97f,,_PyFrameEvalFunction()} now takes @code{_PyInterpreterFrame*}
as its second parameter, instead of @code{PyFrameObject*}.
See 
@geindex Python Enhancement Proposals; PEP 523
PEP 523@footnote{https://peps.python.org/pep-0523/} for more details of how to use this function pointer type.

@item 
@code{PyCode_New()} and @code{PyCode_NewWithPosOnlyArgs()} now take
an additional @code{exception_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 the @code{replace} method.

@item 
@ref{980,,PyCodeObject} no longer has the @code{co_code}, @code{co_varnames},
@code{co_cellvars} and @code{co_freevars} fields.  Instead, use
@ref{981,,PyCode_GetCode()}, @ref{982,,PyCode_GetVarnames()},
@ref{983,,PyCode_GetCellvars()} and @ref{984,,PyCode_GetFreevars()} respectively
to access them via the C API.
(Contributed by Brandt Bucher in bpo-46841@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46841} and Ken Jin in gh-92154@footnote{https://github.com/python/cpython/issues/92154}
and gh-94936@footnote{https://github.com/python/cpython/issues/94936}.)

@item 
The old trashcan macros (@code{Py_TRASHCAN_SAFE_BEGIN}/@code{Py_TRASHCAN_SAFE_END})
are now deprecated. They should be replaced by the new macros
@code{Py_TRASHCAN_BEGIN} and @code{Py_TRASHCAN_END}.

A tp_dealloc function that has the old macros, such as:

@example
static void
mytype_dealloc(mytype *p)
@{
    PyObject_GC_UnTrack(p);
    Py_TRASHCAN_SAFE_BEGIN(p);
    ...
    Py_TRASHCAN_SAFE_END
@}
@end example

should migrate to the new macros as follows:

@example
static void
mytype_dealloc(mytype *p)
@{
    PyObject_GC_UnTrack(p);
    Py_TRASHCAN_BEGIN(p, mytype_dealloc)
    ...
    Py_TRASHCAN_END
@}
@end example

Note that @code{Py_TRASHCAN_BEGIN} has a second argument which
should be the deallocation function it is in.

To support older Python versions in the same codebase, you
can define the following macros and use them throughout
the code (credit: these were copied from the @code{mypy} codebase):

@example
#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
@end example

@item 
The @ref{985,,PyType_Ready()} function now raises an error if a type is defined
with the @ref{986,,Py_TPFLAGS_HAVE_GC} flag set but has no traverse function
(@ref{987,,PyTypeObject.tp_traverse}).
(Contributed by Victor Stinner in bpo-44263@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44263}.)

@item 
Heap types with the @ref{3cd,,Py_TPFLAGS_IMMUTABLETYPE} flag can now inherit
the 
@geindex Python Enhancement Proposals; PEP 590
PEP 590@footnote{https://peps.python.org/pep-0590/} vectorcall protocol.  Previously, this was only possible for
@ref{988,,static types}.
(Contributed by Erlend E. Aasland in bpo-43908@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43908})

@item 
Since @ref{3c7,,Py_TYPE()} is changed to a inline static function,
@code{Py_TYPE(obj) = new_type} must be replaced with
@code{Py_SET_TYPE(obj, new_type)}: see the @ref{989,,Py_SET_TYPE()} function
(available since Python 3.9). For backward compatibility, this macro can be
used:

@example
#if PY_VERSION_HEX < 0x030900A4 && !defined(Py_SET_TYPE)
static inline void _Py_SET_TYPE(PyObject *ob, PyTypeObject *type)
@{ ob->ob_type = type; @}
#define Py_SET_TYPE(ob, type) _Py_SET_TYPE((PyObject*)(ob), type)
#endif
@end example

(Contributed by Victor Stinner in bpo-39573@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39573}.)

@item 
Since @ref{98a,,Py_SIZE()} is changed to a inline static function,
@code{Py_SIZE(obj) = new_size} must be replaced with
@code{Py_SET_SIZE(obj, new_size)}: see the @ref{98b,,Py_SET_SIZE()} function
(available since Python 3.9). For backward compatibility, this macro can be
used:

@example
#if PY_VERSION_HEX < 0x030900A4 && !defined(Py_SET_SIZE)
static inline void _Py_SET_SIZE(PyVarObject *ob, Py_ssize_t size)
@{ ob->ob_size = size; @}
#define Py_SET_SIZE(ob, size) _Py_SET_SIZE((PyVarObject*)(ob), size)
#endif
@end example

(Contributed by Victor Stinner in bpo-39573@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39573}.)

@item 
@code{<Python.h>} no longer includes the header files @code{<stdlib.h>},
@code{<stdio.h>}, @code{<errno.h>} and @code{<string.h>} when the @code{Py_LIMITED_API}
macro is set to @code{0x030b0000} (Python 3.11) or higher. C extensions should
explicitly include the header files after @code{#include <Python.h>}.
(Contributed by Victor Stinner in bpo-45434@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45434}.)

@item 
The non-limited API files @code{cellobject.h}, @code{classobject.h}, @code{code.h}, @code{context.h},
@code{funcobject.h}, @code{genobject.h} and @code{longintrepr.h} have been moved to
the @code{Include/cpython} directory. Moreover, the @code{eval.h} header file was
removed. These files must not be included directly, as they are already
included in @code{Python.h}: @ref{98c,,Include Files}. If they have
been included directly, consider including @code{Python.h} instead.
(Contributed by Victor Stinner in bpo-35134@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35134}.)

@item 
The @code{PyUnicode_CHECK_INTERNED()} macro has been excluded from the
limited C API. It was never usable there, because it used internal structures
which are not available in the limited C API.
(Contributed by Victor Stinner in bpo-46007@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46007}.)

@item 
The following frame functions and type are now directly available with
@code{#include <Python.h>}, it’s no longer needed to add
@code{#include <frameobject.h>}:


@itemize *

@item 
@ref{98d,,PyFrame_Check()}

@item 
@ref{98e,,PyFrame_GetBack()}

@item 
@ref{974,,PyFrame_GetBuiltins()}

@item 
@ref{975,,PyFrame_GetGenerator()}

@item 
@ref{976,,PyFrame_GetGlobals()}

@item 
@ref{977,,PyFrame_GetLasti()}

@item 
@ref{661,,PyFrame_GetLocals()}

@item 
@ref{98f,,PyFrame_Type}
@end itemize

(Contributed by Victor Stinner in gh-93937@footnote{https://github.com/python/cpython/issues/93937}.)
@end itemize
@anchor{whatsnew/3 11 pyframeobject-3-11-hiding}@anchor{990}

@itemize *

@item 
The @ref{991,,PyFrameObject} structure members have been removed from the
public C API.

While the documentation notes that the @ref{991,,PyFrameObject} fields are
subject to change at any time, they have been stable for a long time and were
used in several popular extensions.

In Python 3.11, the frame struct was reorganized to allow performance
optimizations. Some fields were removed entirely, as they were details of the
old implementation.

@ref{991,,PyFrameObject} fields:


@itemize *

@item 
@code{f_back}: use @ref{98e,,PyFrame_GetBack()}.

@item 
@code{f_blockstack}: removed.

@item 
@code{f_builtins}: use @ref{974,,PyFrame_GetBuiltins()}.

@item 
@code{f_code}: use @ref{992,,PyFrame_GetCode()}.

@item 
@code{f_gen}: use @ref{975,,PyFrame_GetGenerator()}.

@item 
@code{f_globals}: use @ref{976,,PyFrame_GetGlobals()}.

@item 
@code{f_iblock}: removed.

@item 
@code{f_lasti}: use @ref{977,,PyFrame_GetLasti()}.
Code using @code{f_lasti} with @code{PyCode_Addr2Line()} should use
@ref{993,,PyFrame_GetLineNumber()} instead; it may be faster.

@item 
@code{f_lineno}: use @ref{993,,PyFrame_GetLineNumber()}

@item 
@code{f_locals}: use @ref{661,,PyFrame_GetLocals()}.

@item 
@code{f_stackdepth}: removed.

@item 
@code{f_state}: no public API (renamed to @code{f_frame.f_state}).

@item 
@code{f_trace}: no public API.

@item 
@code{f_trace_lines}: use @code{PyObject_GetAttrString((PyObject*)frame, "f_trace_lines")}.

@item 
@code{f_trace_opcodes}: use @code{PyObject_GetAttrString((PyObject*)frame, "f_trace_opcodes")}.

@item 
@code{f_localsplus}: no public API (renamed to @code{f_frame.localsplus}).

@item 
@code{f_valuestack}: removed.
@end itemize

The Python frame object is now created lazily. A side effect is that the
@ref{994,,f_back} member must not be accessed directly,
since its value is now also
computed lazily. The @ref{98e,,PyFrame_GetBack()} function must be called
instead.

Debuggers that accessed the @ref{4a6,,f_locals} directly `must' call
@ref{661,,PyFrame_GetLocals()} instead. They no longer need to call
@code{PyFrame_FastToLocalsWithError()} or @code{PyFrame_LocalsToFast()},
in fact they should not call those functions. The necessary updating of the
frame is now managed by the virtual machine.

Code defining @code{PyFrame_GetCode()} on Python 3.8 and older:

@example
#if PY_VERSION_HEX < 0x030900B1
static inline PyCodeObject* PyFrame_GetCode(PyFrameObject *frame)
@{
    Py_INCREF(frame->f_code);
    return frame->f_code;
@}
#endif
@end example

Code defining @code{PyFrame_GetBack()} on Python 3.8 and older:

@example
#if PY_VERSION_HEX < 0x030900B1
static inline PyFrameObject* PyFrame_GetBack(PyFrameObject *frame)
@{
    Py_XINCREF(frame->f_back);
    return frame->f_back;
@}
#endif
@end example

Or use the pythoncapi_compat project@footnote{https://github.com/python/pythoncapi-compat} to get these two
functions on older Python versions.

@item 
Changes of the @ref{995,,PyThreadState} structure members:


@itemize *

@item 
@code{frame}: removed, use @ref{996,,PyThreadState_GetFrame()} (function added
to Python 3.9 by bpo-40429@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40429}).
Warning: the function returns a @ref{5e2,,strong reference}, need to call
@ref{997,,Py_XDECREF()}.

@item 
@code{tracing}: changed, use @ref{95f,,PyThreadState_EnterTracing()}
and @ref{960,,PyThreadState_LeaveTracing()}
(functions added to Python 3.11 by bpo-43760@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43760}).

@item 
@code{recursion_depth}: removed,
use @code{(tstate->recursion_limit - tstate->recursion_remaining)} instead.

@item 
@code{stackcheck_counter}: removed.
@end itemize

Code defining @code{PyThreadState_GetFrame()} on Python 3.8 and older:

@example
#if PY_VERSION_HEX < 0x030900B1
static inline PyFrameObject* PyThreadState_GetFrame(PyThreadState *tstate)
@{
    Py_XINCREF(tstate->frame);
    return tstate->frame;
@}
#endif
@end example

Code defining @code{PyThreadState_EnterTracing()} and
@code{PyThreadState_LeaveTracing()} on Python 3.10 and older:

@example
#if PY_VERSION_HEX < 0x030B00A2
static inline void PyThreadState_EnterTracing(PyThreadState *tstate)
@{
    tstate->tracing++;
#if PY_VERSION_HEX >= 0x030A00A1
    tstate->cframe->use_tracing = 0;
#else
    tstate->use_tracing = 0;
#endif
@}

static inline void PyThreadState_LeaveTracing(PyThreadState *tstate)
@{
    int use_tracing = (tstate->c_tracefunc != NULL || tstate->c_profilefunc != NULL);
    tstate->tracing--;
#if PY_VERSION_HEX >= 0x030A00A1
    tstate->cframe->use_tracing = use_tracing;
#else
    tstate->use_tracing = use_tracing;
#endif
@}
#endif
@end example

Or use the pythoncapi-compat project@footnote{https://github.com/python/pythoncapi-compat} to get these functions
on old Python functions.

@item 
Distributors are encouraged to build Python with the optimized Blake2
library libb2@footnote{https://www.blake2.net/}.

@item 
The @ref{806,,PyConfig.module_search_paths_set} field must now be set to 1 for
initialization to use @ref{643,,PyConfig.module_search_paths} to initialize
@ref{3e2,,sys.path}. Otherwise, initialization will recalculate the path and replace
any values added to @code{module_search_paths}.

@item 
@ref{998,,PyConfig_Read()} no longer calculates the initial search path, and will not
fill any values into @ref{643,,PyConfig.module_search_paths}. To calculate default
paths and then modify them, finish initialization and use @ref{62a,,PySys_GetObject()}
to retrieve @ref{3e2,,sys.path} as a Python list object and modify it directly.
@end itemize

@node Deprecated<5>,Pending Removal in Python 3 12<2>,Porting to Python 3 11<2>,C API Changes<3>
@anchor{whatsnew/3 11 id7}@anchor{999}@anchor{whatsnew/3 11 whatsnew311-c-api-deprecated}@anchor{926}
@subsubsection Deprecated



@itemize *

@item 
Deprecate the following functions to configure the Python initialization:


@itemize *

@item 
@code{PySys_AddWarnOptionUnicode()}

@item 
@code{PySys_AddWarnOption()}

@item 
@code{PySys_AddXOption()}

@item 
@code{PySys_HasWarnOptions()}

@item 
@code{PySys_SetArgvEx()}

@item 
@code{PySys_SetArgv()}

@item 
@code{PySys_SetPath()}

@item 
@code{Py_SetPath()}

@item 
@code{Py_SetProgramName()}

@item 
@code{Py_SetPythonHome()}

@item 
@code{Py_SetStandardStreamEncoding()}

@item 
@code{_Py_SetProgramFullPath()}
@end itemize

Use the new @ref{3f5,,PyConfig} API of the @ref{646,,Python Initialization Configuration} instead (
@geindex Python Enhancement Proposals; PEP 587
PEP 587@footnote{https://peps.python.org/pep-0587/}).
(Contributed by Victor Stinner in gh-88279@footnote{https://github.com/python/cpython/issues/88279}.)

@item 
Deprecate the @code{ob_shash} member of the @ref{99a,,PyBytesObject}. Use @ref{434,,PyObject_Hash()} instead.
(Contributed by Inada Naoki in bpo-46864@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46864}.)
@end itemize

@node Pending Removal in Python 3 12<2>,Removed<5>,Deprecated<5>,C API Changes<3>
@anchor{whatsnew/3 11 id8}@anchor{99b}@anchor{whatsnew/3 11 whatsnew311-c-api-pending-removal}@anchor{938}
@subsubsection 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.


@itemize *

@item 
@code{PyUnicode_AS_DATA()}

@item 
@code{PyUnicode_AS_UNICODE()}

@item 
@code{PyUnicode_AsUnicodeAndSize()}

@item 
@code{PyUnicode_AsUnicode()}

@item 
@code{PyUnicode_FromUnicode()}

@item 
@code{PyUnicode_GET_DATA_SIZE()}

@item 
@code{PyUnicode_GET_SIZE()}

@item 
@code{PyUnicode_GetSize()}

@item 
@code{PyUnicode_IS_COMPACT()}

@item 
@code{PyUnicode_IS_READY()}

@item 
@ref{432,,PyUnicode_READY()}

@item 
@code{PyUnicode_WSTR_LENGTH()}

@item 
@code{_PyUnicode_AsUnicode()}

@item 
@code{PyUnicode_WCHAR_KIND}

@item 
@ref{99c,,PyUnicodeObject}

@item 
@code{PyUnicode_InternImmortal()}
@end itemize

@node Removed<5>,,Pending Removal in Python 3 12<2>,C API Changes<3>
@anchor{whatsnew/3 11 id9}@anchor{99d}@anchor{whatsnew/3 11 whatsnew311-c-api-removed}@anchor{93e}
@subsubsection Removed



@itemize *

@item 
@code{PyFrame_BlockSetup()} and @code{PyFrame_BlockPop()} have been
removed.
(Contributed by Mark Shannon in bpo-40222@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40222}.)

@item 
Remove the following math macros using the @code{errno} variable:


@itemize *

@item 
@code{Py_ADJUST_ERANGE1()}

@item 
@code{Py_ADJUST_ERANGE2()}

@item 
@code{Py_OVERFLOWED()}

@item 
@code{Py_SET_ERANGE_IF_OVERFLOW()}

@item 
@code{Py_SET_ERRNO_ON_MATH_ERROR()}
@end itemize

(Contributed by Victor Stinner in bpo-45412@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45412}.)

@item 
Remove @code{Py_UNICODE_COPY()} and @code{Py_UNICODE_FILL()} macros, deprecated
since Python 3.3. Use @code{PyUnicode_CopyCharacters()} or @code{memcpy()}
(@code{wchar_t*} string), and @code{PyUnicode_Fill()} functions instead.
(Contributed by Victor Stinner in bpo-41123@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41123}.)

@item 
Remove the @code{pystrhex.h} header file. It only contains private functions.
C extensions should only include the main @code{<Python.h>} header file.
(Contributed by Victor Stinner in bpo-45434@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45434}.)

@item 
Remove the @code{Py_FORCE_DOUBLE()} macro. It was used by the
@code{Py_IS_INFINITY()} macro.
(Contributed by Victor Stinner in bpo-45440@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45440}.)

@item 
The following items are no longer available when @ref{660,,Py_LIMITED_API}
is defined:


@itemize *

@item 
@ref{99e,,PyMarshal_WriteLongToFile()}

@item 
@ref{99f,,PyMarshal_WriteObjectToFile()}

@item 
@ref{9a0,,PyMarshal_ReadObjectFromString()}

@item 
@ref{9a1,,PyMarshal_WriteObjectToString()}

@item 
the @code{Py_MARSHAL_VERSION} macro
@end itemize

These are not part of the @ref{9a2,,limited API}.

(Contributed by Victor Stinner in bpo-45474@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45474}.)

@item 
Exclude @ref{3dc,,PyWeakref_GET_OBJECT()} from the limited C API. It never
worked since the @code{PyWeakReference} structure is opaque in the
limited C API.
(Contributed by Victor Stinner in bpo-35134@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35134}.)

@item 
Remove the @code{PyHeapType_GET_MEMBERS()} macro. It was exposed in the
public C API by mistake, it must only be used by Python internally.
Use the @code{PyTypeObject.tp_members} member instead.
(Contributed by Victor Stinner in bpo-40170@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40170}.)

@item 
Remove the @code{HAVE_PY_SET_53BIT_PRECISION} macro (moved to the internal C
API).
(Contributed by Victor Stinner in bpo-45412@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45412}.)
@end itemize
@anchor{whatsnew/3 11 whatsnew311-pep624}@anchor{7cb}

@itemize *

@item 
Remove the @ref{3de,,Py_UNICODE} encoder APIs,
as they have been deprecated since Python 3.3,
are little used
and are inefficient relative to the recommended alternatives.

The removed functions are:


@itemize *

@item 
@code{PyUnicode_Encode()}

@item 
@code{PyUnicode_EncodeASCII()}

@item 
@code{PyUnicode_EncodeLatin1()}

@item 
@code{PyUnicode_EncodeUTF7()}

@item 
@code{PyUnicode_EncodeUTF8()}

@item 
@code{PyUnicode_EncodeUTF16()}

@item 
@code{PyUnicode_EncodeUTF32()}

@item 
@code{PyUnicode_EncodeUnicodeEscape()}

@item 
@code{PyUnicode_EncodeRawUnicodeEscape()}

@item 
@code{PyUnicode_EncodeCharmap()}

@item 
@code{PyUnicode_TranslateCharmap()}

@item 
@code{PyUnicode_EncodeDecimal()}

@item 
@code{PyUnicode_TransformDecimalToASCII()}
@end itemize

See 
@geindex Python Enhancement Proposals; PEP 624
PEP 624@footnote{https://peps.python.org/pep-0624/} for details and
@geindex Python Enhancement Proposals; PEP 624#alternative-apis
migration guidance@footnote{https://peps.python.org/pep-0624/#alternative-apis}.
(Contributed by Inada Naoki in bpo-44029@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44029}.)
@end itemize

@node Notable changes in 3 11 4,Notable changes in 3 11 5,C API Changes<3>,What’s New In Python 3 11
@anchor{whatsnew/3 11 notable-changes-in-3-11-4}@anchor{9a3}
@subsection Notable changes in 3.11.4


@menu
* tarfile: tarfile<2>. 

@end menu

@node tarfile<2>,,,Notable changes in 3 11 4
@anchor{whatsnew/3 11 tarfile}@anchor{9a4}
@subsubsection tarfile



@itemize *

@item 
The extraction methods in @ref{e4,,tarfile}, and @ref{697,,shutil.unpack_archive()},
have a new a `filter' argument that allows limiting tar features than may be
surprising or dangerous, such as creating files outside the destination
directory.
See @ref{698,,Extraction filters} for details.
In Python 3.12, use without the `filter' argument will show a
@ref{1a4,,DeprecationWarning}.
In Python 3.14, the default will switch to @code{'data'}.
(Contributed by Petr Viktorin in 
@geindex Python Enhancement Proposals; PEP 706
PEP 706@footnote{https://peps.python.org/pep-0706/}.)
@end itemize

@node Notable changes in 3 11 5,,Notable changes in 3 11 4,What’s New In Python 3 11
@anchor{whatsnew/3 11 notable-changes-in-3-11-5}@anchor{9a5}
@subsection Notable changes in 3.11.5


@menu
* OpenSSL:: 

@end menu

@node OpenSSL,,,Notable changes in 3 11 5
@anchor{whatsnew/3 11 openssl}@anchor{9a6}
@subsubsection OpenSSL



@itemize *

@item 
Windows builds and macOS installers from python.org now use OpenSSL 3.0.
@end itemize

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node What’s New In Python 3 10,What’s New In Python 3 9,What’s New In Python 3 11,What’s New in Python
@anchor{whatsnew/3 10 doc}@anchor{9a7}@anchor{whatsnew/3 10 translation-repo}@anchor{9a8}@anchor{whatsnew/3 10 what-s-new-in-python-3-10}@anchor{9a9}
@section What’s New In Python 3.10


@*Editor: 
Pablo Galindo Salgado


@c Rules for maintenance:
@c 
@c * Anyone can add text to this document.  Do not spend very much time
@c on the wording of your changes, because your text will probably
@c get rewritten to some degree.
@c 
@c * The maintainer will go through Misc/NEWS periodically and add
@c changes; it's therefore more important to add your changes to
@c Misc/NEWS than to this file.
@c 
@c * This is not a complete list of every single change; completeness
@c is the purpose of Misc/NEWS.  Some changes I consider too small
@c or esoteric to include.  If such a change is added to the text,
@c I'll just remove it.  (This is another reason you shouldn't spend
@c too much time on writing your addition.)
@c 
@c * If you want to draw your new text to the attention of the
@c maintainer, add 'XXX' to the beginning of the paragraph or
@c section.
@c 
@c * It's OK to just add a fragmentary note about a change.  For
@c example: "XXX Describe the transmogrify() function added to the
@c socket module."  The maintainer will research the change and
@c write the necessary text.
@c 
@c * You can comment out your additions if you like, but it's not
@c necessary (especially when a final release is some months away).
@c 
@c * Credit the author of a patch or bugfix.   Just the name is
@c sufficient; the e-mail address isn't necessary.
@c 
@c * It's helpful to add the bug/patch number as a comment:
@c 
@c XXX Describe the transmogrify() function added to the socket
@c module.
@c (Contributed by P.Y. Developer in :issue:`12345`.)
@c 
@c This saves the maintainer the effort of going through the git log
@c when researching a change.

This article explains the new features in Python 3.10, compared to 3.9.
Python 3.10 was released on October 4, 2021.
For full details, see the @ref{143,,changelog}.

@menu
* Summary – Release highlights: Summary – Release highlights<4>. 
* New Features: New Features<7>. 
* New Features Related to Type Hints: New Features Related to Type Hints<3>. 
* Other Language Changes: Other Language Changes<4>. 
* New Modules: New Modules<4>. 
* Improved Modules: Improved Modules<4>. 
* Optimizations: Optimizations<5>. 
* Deprecated: Deprecated<6>. 
* Removed: Removed<6>. 
* Porting to Python 3.10: Porting to Python 3 10. 
* CPython bytecode changes: CPython bytecode changes<4>. 
* Build Changes: Build Changes<4>. 
* C API Changes: C API Changes<4>. 
* Notable security feature in 3.10.7: Notable security feature in 3 10 7. 
* Notable security feature in 3.10.8: Notable security feature in 3 10 8. 
* Notable changes in 3.10.12: Notable changes in 3 10 12. 

@end menu

@node Summary – Release highlights<4>,New Features<7>,,What’s New In Python 3 10
@anchor{whatsnew/3 10 summary-release-highlights}@anchor{9aa}
@subsection Summary – Release highlights


@c This section singles out the most important changes in Python 3.10.
@c Brevity is key.

@c PEP-sized items next.

New syntax features:


@itemize *

@item 
@geindex Python Enhancement Proposals; PEP 634
PEP 634@footnote{https://peps.python.org/pep-0634/}, Structural Pattern Matching: Specification

@item 
@geindex Python Enhancement Proposals; PEP 635
PEP 635@footnote{https://peps.python.org/pep-0635/}, Structural Pattern Matching: Motivation and Rationale

@item 
@geindex Python Enhancement Proposals; PEP 636
PEP 636@footnote{https://peps.python.org/pep-0636/}, Structural Pattern Matching: Tutorial

@item 
bpo-12782@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12782}, Parenthesized context managers are now officially allowed.
@end itemize

New features in the standard library:


@itemize *

@item 
@geindex Python Enhancement Proposals; PEP 618
PEP 618@footnote{https://peps.python.org/pep-0618/}, Add Optional Length-Checking To zip.
@end itemize

Interpreter improvements:


@itemize *

@item 
@geindex Python Enhancement Proposals; PEP 626
PEP 626@footnote{https://peps.python.org/pep-0626/}, Precise line numbers for debugging and other tools.
@end itemize

New typing features:


@itemize *

@item 
@geindex Python Enhancement Proposals; PEP 604
PEP 604@footnote{https://peps.python.org/pep-0604/}, Allow writing union types as X | Y

@item 
@geindex Python Enhancement Proposals; PEP 612
PEP 612@footnote{https://peps.python.org/pep-0612/}, Parameter Specification Variables

@item 
@geindex Python Enhancement Proposals; PEP 613
PEP 613@footnote{https://peps.python.org/pep-0613/}, Explicit Type Aliases

@item 
@geindex Python Enhancement Proposals; PEP 647
PEP 647@footnote{https://peps.python.org/pep-0647/}, User-Defined Type Guards
@end itemize

Important deprecations, removals or restrictions:


@itemize *

@item 
@geindex Python Enhancement Proposals; PEP 644
PEP 644@footnote{https://peps.python.org/pep-0644/}, Require OpenSSL 1.1.1 or newer

@item 
@geindex Python Enhancement Proposals; PEP 632
PEP 632@footnote{https://peps.python.org/pep-0632/}, Deprecate distutils module.

@item 
@geindex Python Enhancement Proposals; PEP 623
PEP 623@footnote{https://peps.python.org/pep-0623/}, Deprecate and prepare for the removal of the wstr member in PyUnicodeObject.

@item 
@geindex Python Enhancement Proposals; PEP 624
PEP 624@footnote{https://peps.python.org/pep-0624/}, Remove Py_UNICODE encoder APIs

@item 
@geindex Python Enhancement Proposals; PEP 597
PEP 597@footnote{https://peps.python.org/pep-0597/}, Add optional EncodingWarning
@end itemize

@node New Features<7>,New Features Related to Type Hints<3>,Summary – Release highlights<4>,What’s New In Python 3 10
@anchor{whatsnew/3 10 new-features}@anchor{9ab}
@subsection New Features


@menu
* Parenthesized context managers:: 
* Better error messages:: 
* PEP 626; Precise line numbers for debugging and other tools: PEP 626 Precise line numbers for debugging and other tools. 
* PEP 634; Structural Pattern Matching: PEP 634 Structural Pattern Matching. 
* Optional EncodingWarning and encoding="locale" option:: 

@end menu

@node Parenthesized context managers,Better error messages,,New Features<7>
@anchor{whatsnew/3 10 parenthesized-context-managers}@anchor{9ac}@anchor{whatsnew/3 10 whatsnew310-pep563}@anchor{9ad}
@subsubsection Parenthesized context managers


Using enclosing parentheses for continuation across multiple lines
in context managers is now supported. This allows formatting a long
collection of context managers in multiple lines in a similar way
as it was previously possible with import statements. For instance,
all these examples are now valid:

@example
with (CtxManager() as example):
    ...

with (
    CtxManager1(),
    CtxManager2()
):
    ...

with (CtxManager1() as example,
      CtxManager2()):
    ...

with (CtxManager1(),
      CtxManager2() as example):
    ...

with (
    CtxManager1() as example1,
    CtxManager2() as example2
):
    ...
@end example

it is also possible to use a trailing comma at the end of the
enclosed group:

@example
with (
    CtxManager1() as example1,
    CtxManager2() as example2,
    CtxManager3() as example3,
):
    ...
@end example

This new syntax uses the non LL(1) capacities of the new parser.
Check 
@geindex Python Enhancement Proposals; PEP 617
PEP 617@footnote{https://peps.python.org/pep-0617/} for more details.

(Contributed by Guido van Rossum, Pablo Galindo and Lysandros Nikolaou
in bpo-12782@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12782} and bpo-40334@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40334}.)

@node Better error messages,PEP 626 Precise line numbers for debugging and other tools,Parenthesized context managers,New Features<7>
@anchor{whatsnew/3 10 better-error-messages}@anchor{9ae}
@subsubsection Better error messages


@menu
* SyntaxErrors:: 
* IndentationErrors:: 
* AttributeErrors:: 
* NameErrors:: 

@end menu

@node SyntaxErrors,IndentationErrors,,Better error messages
@anchor{whatsnew/3 10 syntaxerrors}@anchor{9af}
@subsubsection SyntaxErrors


When parsing code that contains unclosed parentheses or brackets the interpreter
now includes the location of the unclosed bracket of parentheses instead of displaying
`SyntaxError: unexpected EOF while parsing' or pointing to some incorrect location.
For instance, consider the following code (notice the unclosed ‘@{‘):

@example
expected = @{9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4,
            38: 4, 39: 4, 45: 5, 46: 5, 47: 5, 48: 5, 49: 5, 54: 6,
some_other_code = foo()
@end example

Previous versions of the interpreter reported confusing places as the location of
the syntax error:

@example
File "example.py", line 3
    some_other_code = foo()
                    ^
SyntaxError: invalid syntax
@end example

but in Python 3.10 a more informative error is emitted:

@example
File "example.py", line 1
    expected = @{9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4,
               ^
SyntaxError: '@{' was never closed
@end example

In a similar way, errors involving unclosed string literals (single and triple
quoted) now point to the start of the string instead of reporting EOF/EOL.

These improvements are inspired by previous work in the PyPy interpreter.

(Contributed by Pablo Galindo in bpo-42864@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42864} and Batuhan Taskaya in
bpo-40176@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40176}.)

@ref{18f,,SyntaxError} exceptions raised by the interpreter will now highlight the
full error range of the expression that constitutes the syntax error itself,
instead of just where the problem is detected. In this way, instead of displaying
(before Python 3.10):

@example
>>> foo(x, z for z in range(10), t, w)
  File "<stdin>", line 1
    foo(x, z for z in range(10), t, w)
           ^
SyntaxError: Generator expression must be parenthesized
@end example

now Python 3.10 will display the exception as:

@example
>>> foo(x, z for z in range(10), t, w)
  File "<stdin>", line 1
    foo(x, z for z in range(10), t, w)
           ^^^^^^^^^^^^^^^^^^^^
SyntaxError: Generator expression must be parenthesized
@end example

This improvement was contributed by Pablo Galindo in bpo-43914@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43914}.

A considerable amount of new specialized messages for @ref{18f,,SyntaxError} exceptions
have been incorporated. Some of the most notable ones are as follows:


@itemize *

@item 
Missing @code{:} before blocks:

@example
>>> if rocket.position > event_horizon
  File "<stdin>", line 1
    if rocket.position > event_horizon
                                      ^
SyntaxError: expected ':'
@end example

(Contributed by Pablo Galindo in bpo-42997@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42997}.)

@item 
Unparenthesised tuples in comprehensions targets:

@example
>>> @{x,y for x,y in zip('abcd', '1234')@}
  File "<stdin>", line 1
    @{x,y for x,y in zip('abcd', '1234')@}
     ^
SyntaxError: did you forget parentheses around the comprehension target?
@end example

(Contributed by Pablo Galindo in bpo-43017@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43017}.)

@item 
Missing commas in collection literals and between expressions:

@example
>>> items = @{
... x: 1,
... y: 2
... z: 3,
  File "<stdin>", line 3
    y: 2
       ^
SyntaxError: invalid syntax. Perhaps you forgot a comma?
@end example

(Contributed by Pablo Galindo in bpo-43822@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43822}.)

@item 
Multiple Exception types without parentheses:

@example
>>> try:
...     build_dyson_sphere()
... except NotEnoughScienceError, NotEnoughResourcesError:
  File "<stdin>", line 3
    except NotEnoughScienceError, NotEnoughResourcesError:
           ^
SyntaxError: multiple exception types must be parenthesized
@end example

(Contributed by Pablo Galindo in bpo-43149@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43149}.)

@item 
Missing @code{:} and values in dictionary literals:

@example
>>> values = @{
... x: 1,
... y: 2,
... z:
... @}
  File "<stdin>", line 4
    z:
     ^
SyntaxError: expression expected after dictionary key and ':'

>>> values = @{x:1, y:2, z w:3@}
  File "<stdin>", line 1
    values = @{x:1, y:2, z w:3@}
                        ^
SyntaxError: ':' expected after dictionary key
@end example

(Contributed by Pablo Galindo in bpo-43823@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43823}.)

@item 
@code{try} blocks without @code{except} or @code{finally} blocks:

@example
>>> try:
...     x = 2
... something = 3
  File "<stdin>", line 3
    something  = 3
    ^^^^^^^^^
SyntaxError: expected 'except' or 'finally' block
@end example

(Contributed by Pablo Galindo in bpo-44305@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44305}.)

@item 
Usage of @code{=} instead of @code{==} in comparisons:

@example
>>> if rocket.position = event_horizon:
  File "<stdin>", line 1
    if rocket.position = event_horizon:
                       ^
SyntaxError: cannot assign to attribute here. Maybe you meant '==' instead of '='?
@end example

(Contributed by Pablo Galindo in bpo-43797@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43797}.)

@item 
Usage of @code{*} in f-strings:

@example
>>> f"Black holes @{*all_black_holes@} and revelations"
  File "<stdin>", line 1
    (*all_black_holes)
     ^
SyntaxError: f-string: cannot use starred expression here
@end example

(Contributed by Pablo Galindo in bpo-41064@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41064}.)
@end itemize

@node IndentationErrors,AttributeErrors,SyntaxErrors,Better error messages
@anchor{whatsnew/3 10 indentationerrors}@anchor{9b0}
@subsubsection IndentationErrors


Many @ref{9b1,,IndentationError} exceptions now have more context regarding what kind of block
was expecting an indentation, including the location of the statement:

@example
>>> def foo():
...    if lel:
...    x = 2
  File "<stdin>", line 3
    x = 2
    ^
IndentationError: expected an indented block after 'if' statement in line 2
@end example

@node AttributeErrors,NameErrors,IndentationErrors,Better error messages
@anchor{whatsnew/3 10 attributeerrors}@anchor{9b2}
@subsubsection AttributeErrors


When printing @ref{5f0,,AttributeError}, @code{PyErr_Display()} will offer
suggestions of similar attribute names in the object that the exception was
raised from:

@example
>>> collections.namedtoplo
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: module 'collections' has no attribute 'namedtoplo'. Did you mean: namedtuple?
@end example

(Contributed by Pablo Galindo in bpo-38530@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38530}.)

@cartouche
@quotation Warning 
Notice this won’t work if @code{PyErr_Display()} is not called to display the error
which can happen if some other custom error display function is used. This is a common
scenario in some REPLs like IPython.
@end quotation
@end cartouche

@node NameErrors,,AttributeErrors,Better error messages
@anchor{whatsnew/3 10 nameerrors}@anchor{9b3}
@subsubsection NameErrors


When printing @ref{450,,NameError} raised by the interpreter, @code{PyErr_Display()}
will offer suggestions of similar variable names in the function that the exception
was raised from:

@example
>>> schwarzschild_black_hole = None
>>> schwarschild_black_hole
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'schwarschild_black_hole' is not defined. Did you mean: schwarzschild_black_hole?
@end example

(Contributed by Pablo Galindo in bpo-38530@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38530}.)

@cartouche
@quotation Warning 
Notice this won’t work if @code{PyErr_Display()} is not called to display the error,
which can happen if some other custom error display function is used. This is a common
scenario in some REPLs like IPython.
@end quotation
@end cartouche

@node PEP 626 Precise line numbers for debugging and other tools,PEP 634 Structural Pattern Matching,Better error messages,New Features<7>
@anchor{whatsnew/3 10 pep-626-precise-line-numbers-for-debugging-and-other-tools}@anchor{9b4}
@subsubsection PEP 626: Precise line numbers for debugging and other tools


PEP 626 brings more precise and reliable line numbers for debugging, profiling and coverage tools.
Tracing events, with the correct line number, are generated for all lines of code executed and only for lines of code that are executed.

The @ref{9b5,,f_lineno} attribute of frame objects will always contain the
expected line number.

The @ref{32e,,co_lnotab} attribute of
@ref{4e7,,code objects} is deprecated and
will be removed in 3.12.
Code that needs to convert from offset to line number should use the new
@ref{34e,,co_lines()} method instead.

@node PEP 634 Structural Pattern Matching,Optional EncodingWarning and encoding="locale" option,PEP 626 Precise line numbers for debugging and other tools,New Features<7>
@anchor{whatsnew/3 10 pep-634-structural-pattern-matching}@anchor{9b6}
@subsubsection PEP 634: Structural Pattern Matching


Structural pattern matching has been added in the form of a `match statement'
and `case statements' of patterns with associated actions. Patterns
consist of sequences, mappings, primitive data types as well as class instances.
Pattern matching enables programs to extract information from complex data types,
branch on the structure of data, and apply specific actions based on different
forms of data.

@menu
* Syntax and operations:: 
* Declarative approach:: 
* Simple pattern; match to a literal: Simple pattern match to a literal. 
* Patterns with a literal and variable:: 
* Patterns and classes:: 
* Nested patterns:: 
* Complex patterns and the wildcard:: 
* Guard:: 
* Other Key Features:: 

@end menu

@node Syntax and operations,Declarative approach,,PEP 634 Structural Pattern Matching
@anchor{whatsnew/3 10 syntax-and-operations}@anchor{9b7}
@subsubsection Syntax and operations


The generic syntax of pattern matching is:

@example
match subject:
    case <pattern_1>:
        <action_1>
    case <pattern_2>:
        <action_2>
    case <pattern_3>:
        <action_3>
    case _:
        <action_wildcard>
@end example

A match statement takes an expression and compares its value to successive
patterns given as one or more case blocks.  Specifically, pattern matching
operates by:


@enumerate 

@item 
using data with type and shape (the @code{subject})

@item 
evaluating the @code{subject} in the @code{match} statement

@item 
comparing the subject with each pattern in a @code{case} statement
from top to bottom until a match is confirmed.

@item 
executing the action associated with the pattern of the confirmed
match

@item 
If an exact match is not confirmed, the last case, a wildcard @code{_},
if provided, will be used as the matching case. If an exact match is
not confirmed and a wildcard case does not exist, the entire match
block is a no-op.
@end enumerate

@node Declarative approach,Simple pattern match to a literal,Syntax and operations,PEP 634 Structural Pattern Matching
@anchor{whatsnew/3 10 declarative-approach}@anchor{9b8}
@subsubsection Declarative approach


Readers may be aware of pattern matching through the simple example of matching
a subject (data object) to a literal (pattern) with the switch statement found
in C, Java or JavaScript (and many other languages). Often the switch statement
is used for comparison of an object/expression with case statements containing
literals.

More powerful examples of pattern matching can be found in languages such as
Scala and Elixir. With structural pattern matching, the approach is “declarative” and
explicitly states the conditions (the patterns) for data to match.

While an “imperative” series of instructions using nested “if” statements
could be used to accomplish something similar to structural pattern matching,
it is less clear than the “declarative” approach. Instead the “declarative”
approach states the conditions to meet for a match and is more readable through
its explicit patterns. While structural pattern matching can be used in its
simplest form comparing a variable to a literal in a case statement, its
true value for Python lies in its handling of the subject’s type and shape.

@node Simple pattern match to a literal,Patterns with a literal and variable,Declarative approach,PEP 634 Structural Pattern Matching
@anchor{whatsnew/3 10 simple-pattern-match-to-a-literal}@anchor{9b9}
@subsubsection Simple pattern: match to a literal


Let’s look at this example as pattern matching in its simplest form: a value,
the subject, being matched to several literals, the patterns. In the example
below, @code{status} is the subject of the match statement. The patterns are
each of the case statements, where literals represent request status codes.
The associated action to the case is executed after a match:

@example
def http_error(status):
    match status:
        case 400:
            return "Bad request"
        case 404:
            return "Not found"
        case 418:
            return "I'm a teapot"
        case _:
            return "Something's wrong with the internet"
@end example

If the above function is passed a @code{status} of 418, “I’m a teapot” is returned.
If the above function is passed a @code{status} of 500, the case statement with
@code{_} will match as a wildcard, and “Something’s wrong with the internet” is
returned.
Note the last block: the variable name, @code{_}, acts as a `wildcard' and insures
the subject will always match. The use of @code{_} is optional.

You can combine several literals in a single pattern using @code{|} (“or”):

@example
case 401 | 403 | 404:
    return "Not allowed"
@end example

@menu
* Behavior without the wildcard:: 

@end menu

@node Behavior without the wildcard,,,Simple pattern match to a literal
@anchor{whatsnew/3 10 behavior-without-the-wildcard}@anchor{9ba}
@subsubsection Behavior without the wildcard


If we modify the above example by removing the last case block, the example
becomes:

@example
def http_error(status):
    match status:
        case 400:
            return "Bad request"
        case 404:
            return "Not found"
        case 418:
            return "I'm a teapot"
@end example

Without the use of @code{_} in a case statement, a match may not exist. If no
match exists, the behavior is a no-op. For example, if @code{status} of 500 is
passed, a no-op occurs.

@node Patterns with a literal and variable,Patterns and classes,Simple pattern match to a literal,PEP 634 Structural Pattern Matching
@anchor{whatsnew/3 10 patterns-with-a-literal-and-variable}@anchor{9bb}
@subsubsection Patterns with a literal and variable


Patterns can look like unpacking assignments, and a pattern may be used to bind
variables. In this example, a data point can be unpacked to its x-coordinate
and y-coordinate:

@example
# point is an (x, y) tuple
match point:
    case (0, 0):
        print("Origin")
    case (0, y):
        print(f"Y=@{y@}")
    case (x, 0):
        print(f"X=@{x@}")
    case (x, y):
        print(f"X=@{x@}, Y=@{y@}")
    case _:
        raise ValueError("Not a point")
@end example

The first pattern has two literals, @code{(0, 0)}, and may be thought of as an
extension of the literal pattern shown above. The next two patterns combine a
literal and a variable, and the variable `binds' a value from the subject
(@code{point}).  The fourth pattern captures two values, which makes it
conceptually similar to the unpacking assignment @code{(x, y) = point}.

@node Patterns and classes,Nested patterns,Patterns with a literal and variable,PEP 634 Structural Pattern Matching
@anchor{whatsnew/3 10 patterns-and-classes}@anchor{9bc}
@subsubsection Patterns and classes


If you are using classes to structure your data, you can use as a pattern
the class name followed by an argument list resembling a constructor. This
pattern has the ability to capture instance attributes into variables:

@example
class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

def location(point):
    match point:
        case Point(x=0, y=0):
            print("Origin is the point's location.")
        case Point(x=0, y=y):
            print(f"Y=@{y@} and the point is on the y-axis.")
        case Point(x=x, y=0):
            print(f"X=@{x@} and the point is on the x-axis.")
        case Point():
            print("The point is located somewhere else on the plane.")
        case _:
            print("Not a point")
@end example

@menu
* Patterns with positional parameters:: 

@end menu

@node Patterns with positional parameters,,,Patterns and classes
@anchor{whatsnew/3 10 patterns-with-positional-parameters}@anchor{9bd}
@subsubsection Patterns with positional parameters


You can use positional parameters with some builtin classes that provide an
ordering for their attributes (e.g. dataclasses). You can also define a specific
position for attributes in patterns by setting the @code{__match_args__} special
attribute in your classes. If it’s set to (“x”, “y”), the following patterns
are all equivalent (and all bind the @code{y} attribute to the @code{var} variable):

@example
Point(1, var)
Point(1, y=var)
Point(x=1, y=var)
Point(y=var, x=1)
@end example

@node Nested patterns,Complex patterns and the wildcard,Patterns and classes,PEP 634 Structural Pattern Matching
@anchor{whatsnew/3 10 nested-patterns}@anchor{9be}
@subsubsection Nested patterns


Patterns can be arbitrarily nested.  For example, if our data is a short
list of points, it could be matched like this:

@example
match points:
    case []:
        print("No points in the list.")
    case [Point(0, 0)]:
        print("The origin is the only point in the list.")
    case [Point(x, y)]:
        print(f"A single point @{x@}, @{y@} is in the list.")
    case [Point(0, y1), Point(0, y2)]:
        print(f"Two points on the Y axis at @{y1@}, @{y2@} are in the list.")
    case _:
        print("Something else is found in the list.")
@end example

@node Complex patterns and the wildcard,Guard,Nested patterns,PEP 634 Structural Pattern Matching
@anchor{whatsnew/3 10 complex-patterns-and-the-wildcard}@anchor{9bf}
@subsubsection Complex patterns and the wildcard


To this point, the examples have used @code{_} alone in the last case statement.
A wildcard can be used in more complex patterns, such as @code{('error', code, _)}.
For example:

@example
match test_variable:
    case ('warning', code, 40):
        print("A warning has been received.")
    case ('error', code, _):
        print(f"An error @{code@} occurred.")
@end example

In the above case, @code{test_variable} will match for (‘error’, code, 100) and
(‘error’, code, 800).

@node Guard,Other Key Features,Complex patterns and the wildcard,PEP 634 Structural Pattern Matching
@anchor{whatsnew/3 10 guard}@anchor{9c0}
@subsubsection Guard


We can add an @code{if} clause to a pattern, known as a “guard”.  If the
guard is false, @code{match} goes on to try the next case block.  Note
that value capture happens before the guard is evaluated:

@example
match point:
    case Point(x, y) if x == y:
        print(f"The point is located on the diagonal Y=X at @{x@}.")
    case Point(x, y):
        print(f"Point is not on the diagonal.")
@end example

@node Other Key Features,,Guard,PEP 634 Structural Pattern Matching
@anchor{whatsnew/3 10 other-key-features}@anchor{9c1}
@subsubsection Other Key Features


Several other key features:


@itemize -

@item 
Like unpacking assignments, tuple and list patterns have exactly the
same meaning and actually match arbitrary sequences. Technically,
the subject must be a sequence.
Therefore, an important exception is that patterns don’t match iterators.
Also, to prevent a common mistake, sequence patterns don’t match strings.

@item 
Sequence patterns support wildcards: @code{[x, y, *rest]} and @code{(x, y,
*rest)} work similar to wildcards in unpacking assignments.  The
name after @code{*} may also be @code{_}, so @code{(x, y, *_)} matches a sequence
of at least two items without binding the remaining items.

@item 
Mapping patterns: @code{@{"bandwidth": b, "latency": l@}} captures the
@code{"bandwidth"} and @code{"latency"} values from a dict.  Unlike sequence
patterns, extra keys are ignored.  A wildcard @code{**rest} is also
supported.  (But @code{**_} would be redundant, so is not allowed.)

@item 
Subpatterns may be captured using the @code{as} keyword:

@example
case (Point(x1, y1), Point(x2, y2) as p2): ...
@end example

This binds x1, y1, x2, y2 like you would expect without the @code{as} clause,
and p2 to the entire second item of the subject.

@item 
Most literals are compared by equality. However, the singletons @code{True},
@code{False} and @code{None} are compared by identity.

@item 
Named constants may be used in patterns.  These named constants must be
dotted names to prevent the constant from being interpreted as a capture
variable:

@example
from enum import Enum
class Color(Enum):
    RED = 0
    GREEN = 1
    BLUE = 2

color = Color.GREEN
match color:
    case Color.RED:
        print("I see red!")
    case Color.GREEN:
        print("Grass is green")
    case Color.BLUE:
        print("I'm feeling the blues :(")
@end example
@end itemize

For the full specification see 
@geindex Python Enhancement Proposals; PEP 634
PEP 634@footnote{https://peps.python.org/pep-0634/}.  Motivation and rationale
are in 
@geindex Python Enhancement Proposals; PEP 635
PEP 635@footnote{https://peps.python.org/pep-0635/}, and a longer tutorial is in 
@geindex Python Enhancement Proposals; PEP 636
PEP 636@footnote{https://peps.python.org/pep-0636/}.

@node Optional EncodingWarning and encoding="locale" option,,PEP 634 Structural Pattern Matching,New Features<7>
@anchor{whatsnew/3 10 optional-encodingwarning-and-encoding-locale-option}@anchor{9c2}@anchor{whatsnew/3 10 whatsnew310-pep597}@anchor{9c3}
@subsubsection Optional @code{EncodingWarning} and @code{encoding="locale"} option


The default encoding of @ref{9c4,,TextIOWrapper} and @ref{318,,open()} is
platform and locale dependent. Since UTF-8 is used on most Unix
platforms, omitting @code{encoding} option when opening UTF-8 files
(e.g. JSON, YAML, TOML, Markdown) is a very common bug. For example:

@example
# BUG: "rb" mode or encoding="utf-8" should be used.
with open("data.json") as f:
    data = json.load(f)
@end example

To find this type of bug, an optional @code{EncodingWarning} is added.
It is emitted when @ref{89e,,sys.flags.warn_default_encoding}
is true and locale-specific default encoding is used.

@code{-X warn_default_encoding} option and 
@geindex PYTHONWARNDEFAULTENCODING
@geindex environment variable; PYTHONWARNDEFAULTENCODING
@ref{9c5,,PYTHONWARNDEFAULTENCODING}
are added to enable the warning.

See @ref{9c6,,Text Encoding} for more information.

@node New Features Related to Type Hints<3>,Other Language Changes<4>,New Features<7>,What’s New In Python 3 10
@anchor{whatsnew/3 10 new-feat-related-type-hints}@anchor{9c7}@anchor{whatsnew/3 10 new-features-related-to-type-hints}@anchor{9c8}
@subsection New Features Related to Type Hints


This section covers major changes affecting 
@geindex Python Enhancement Proposals; PEP 484
PEP 484@footnote{https://peps.python.org/pep-0484/} type hints and
the @ref{10b,,typing} module.

@menu
* PEP 604; New Type Union Operator: PEP 604 New Type Union Operator. 
* PEP 612; Parameter Specification Variables: PEP 612 Parameter Specification Variables. 
* PEP 613; TypeAlias: PEP 613 TypeAlias. 
* PEP 647; User-Defined Type Guards: PEP 647 User-Defined Type Guards. 

@end menu

@node PEP 604 New Type Union Operator,PEP 612 Parameter Specification Variables,,New Features Related to Type Hints<3>
@anchor{whatsnew/3 10 pep-604-new-type-union-operator}@anchor{9c9}
@subsubsection PEP 604: New Type Union Operator


A new type union operator was introduced which enables the syntax @code{X | Y}.
This provides a cleaner way of expressing ‘either type X or type Y’ instead of
using @ref{2aa,,typing.Union}, especially in type hints.

In previous versions of Python, to apply a type hint for functions accepting
arguments of multiple types, @ref{2aa,,typing.Union} was used:

@example
def square(number: Union[int, float]) -> Union[int, float]:
    return number ** 2
@end example

Type hints can now be written in a more succinct manner:

@example
def square(number: int | float) -> int | float:
    return number ** 2
@end example

This new syntax is also accepted as the second argument to @ref{2af,,isinstance()}
and @ref{9ca,,issubclass()}:

@example
>>> isinstance(1, int | str)
True
@end example

See @ref{9cb,,Union Type} and 
@geindex Python Enhancement Proposals; PEP 604
PEP 604@footnote{https://peps.python.org/pep-0604/} for more details.

(Contributed by Maggie Moss and Philippe Prados in bpo-41428@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41428},
with additions by Yurii Karabas and Serhiy Storchaka in bpo-44490@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44490}.)

@node PEP 612 Parameter Specification Variables,PEP 613 TypeAlias,PEP 604 New Type Union Operator,New Features Related to Type Hints<3>
@anchor{whatsnew/3 10 pep-612-parameter-specification-variables}@anchor{9cc}
@subsubsection PEP 612: Parameter Specification Variables


Two new options to improve the information provided to static type checkers for
@geindex Python Enhancement Proposals; PEP 484
PEP 484@footnote{https://peps.python.org/pep-0484/}‘s @code{Callable} have been added to the @ref{10b,,typing} module.

The first is the parameter specification variable.  They are used to forward the
parameter types of one callable to another callable – a pattern commonly
found in higher order functions and decorators.  Examples of usage can be found
in @ref{488,,typing.ParamSpec}. Previously, there was no easy way to type annotate
dependency of parameter types in such a precise manner.

The second option is the new @code{Concatenate} operator. It’s used in conjunction
with parameter specification variables to type annotate a higher order callable
which adds or removes parameters of another callable.  Examples of usage can
be found in @ref{9cd,,typing.Concatenate}.

See @ref{9ce,,typing.Callable}, @ref{488,,typing.ParamSpec},
@ref{9cd,,typing.Concatenate}, @ref{9cf,,typing.ParamSpecArgs},
@ref{9d0,,typing.ParamSpecKwargs}, and 
@geindex Python Enhancement Proposals; PEP 612
PEP 612@footnote{https://peps.python.org/pep-0612/} for more details.

(Contributed by Ken Jin in bpo-41559@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41559}, with minor enhancements by Jelle
Zijlstra in bpo-43783@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43783}.  PEP written by Mark Mendoza.)

@node PEP 613 TypeAlias,PEP 647 User-Defined Type Guards,PEP 612 Parameter Specification Variables,New Features Related to Type Hints<3>
@anchor{whatsnew/3 10 pep-613-typealias}@anchor{9d1}
@subsubsection PEP 613: TypeAlias


@geindex Python Enhancement Proposals; PEP 484
PEP 484@footnote{https://peps.python.org/pep-0484/} introduced the concept of type aliases, only requiring them to be
top-level unannotated assignments. This simplicity sometimes made it difficult
for type checkers to distinguish between type aliases and ordinary assignments,
especially when forward references or invalid types were involved. Compare:

@example
StrCache = 'Cache[str]'  # a type alias
LOG_PREFIX = 'LOG[DEBUG]'  # a module constant
@end example

Now the @ref{10b,,typing} module has a special value @ref{9d2,,TypeAlias}
which lets you declare type aliases more explicitly:

@example
StrCache: TypeAlias = 'Cache[str]'  # a type alias
LOG_PREFIX = 'LOG[DEBUG]'  # a module constant
@end example

See 
@geindex Python Enhancement Proposals; PEP 613
PEP 613@footnote{https://peps.python.org/pep-0613/} for more details.

(Contributed by Mikhail Golubev in bpo-41923@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41923}.)

@node PEP 647 User-Defined Type Guards,,PEP 613 TypeAlias,New Features Related to Type Hints<3>
@anchor{whatsnew/3 10 pep-647-user-defined-type-guards}@anchor{9d3}
@subsubsection PEP 647: User-Defined Type Guards


@ref{48d,,TypeGuard} has been added to the @ref{10b,,typing} module to annotate
type guard functions and improve information provided to static type checkers
during type narrowing.  For more information, please see
@code{TypeGuard}‘s documentation, and 
@geindex Python Enhancement Proposals; PEP 647
PEP 647@footnote{https://peps.python.org/pep-0647/}.

(Contributed by Ken Jin and Guido van Rossum in bpo-43766@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43766}.
PEP written by Eric Traut.)

@node Other Language Changes<4>,New Modules<4>,New Features Related to Type Hints<3>,What’s New In Python 3 10
@anchor{whatsnew/3 10 other-language-changes}@anchor{9d4}
@subsection Other Language Changes



@itemize *

@item 
The @ref{19c,,int} type has a new method @ref{9d5,,int.bit_count()}, returning the
number of ones in the binary expansion of a given integer, also known
as the population count. (Contributed by Niklas Fiekas in bpo-29882@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29882}.)

@item 
The views returned by @ref{9d6,,dict.keys()}, @ref{9d7,,dict.values()} and
@ref{9d8,,dict.items()} now all have a @code{mapping} attribute that gives a
@ref{699,,types.MappingProxyType} object wrapping the original
dictionary. (Contributed by Dennis Sweeney in bpo-40890@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40890}.)

@item 
@geindex Python Enhancement Proposals; PEP 618
PEP 618@footnote{https://peps.python.org/pep-0618/}: The @ref{1a1,,zip()} function now has an optional @code{strict} flag, used
to require that all the iterables have an equal length.

@item 
Builtin and extension functions that take integer arguments no longer accept
@ref{200,,Decimal}s, @ref{215,,Fraction}s and other
objects that can be converted to integers only with a loss (e.g. that have
the @ref{19e,,__int__()} method but do not have the
@ref{19f,,__index__()} method).
(Contributed by Serhiy Storchaka in bpo-37999@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37999}.)

@item 
If @ref{9d9,,object.__ipow__()} returns @ref{1a3,,NotImplemented}, the operator will
correctly fall back to @ref{9da,,object.__pow__()} and @ref{1a6,,object.__rpow__()} as expected.
(Contributed by Alex Shkop in bpo-38302@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38302}.)

@item 
Assignment expressions can now be used unparenthesized within set literals
and set comprehensions, as well as in sequence indexes (but not slices).

@item 
Functions have a new @code{__builtins__} attribute which is used to look for
builtin symbols when a function is executed, instead of looking into
@code{__globals__['__builtins__']}. The attribute is initialized from
@code{__globals__["__builtins__"]} if it exists, else from the current builtins.
(Contributed by Mark Shannon in bpo-42990@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42990}.)

@item 
Two new builtin functions – @ref{9db,,aiter()} and @ref{9dc,,anext()} have been added
to provide asynchronous counterparts to @ref{9dd,,iter()} and @ref{9de,,next()},
respectively.
(Contributed by Joshua Bronson, Daniel Pope, and Justin Wang in bpo-31861@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31861}.)

@item 
Static methods (@ref{451,,@@staticmethod}) and class methods
(@ref{48f,,@@classmethod}) now inherit the method attributes
(@code{__module__}, @code{__name__}, @code{__qualname__}, @code{__doc__},
@code{__annotations__}) and have a new @code{__wrapped__} attribute.
Moreover, static methods are now callable as regular functions.
(Contributed by Victor Stinner in bpo-43682@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43682}.)

@item 
Annotations for complex targets (everything beside @code{simple name} targets
defined by 
@geindex Python Enhancement Proposals; PEP 526
PEP 526@footnote{https://peps.python.org/pep-0526/}) no longer cause any runtime effects with @code{from __future__ import annotations}.
(Contributed by Batuhan Taskaya in bpo-42737@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42737}.)

@item 
Class and module objects now lazy-create empty annotations dicts on demand.
The annotations dicts are stored in the object’s @code{__dict__} for
backwards compatibility.  This improves the best practices for working
with @code{__annotations__}; for more information, please see
@ref{9df,,Annotations Best Practices}.
(Contributed by Larry Hastings in bpo-43901@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43901}.)

@item 
Annotations consist of @code{yield}, @code{yield from}, @code{await} or named expressions
are now forbidden under @code{from __future__ import annotations} due to their side
effects.
(Contributed by Batuhan Taskaya in bpo-42725@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42725}.)

@item 
Usage of unbound variables, @code{super()} and other expressions that might
alter the processing of symbol table as annotations are now rendered
effectless under @code{from __future__ import annotations}.
(Contributed by Batuhan Taskaya in bpo-42725@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42725}.)

@item 
Hashes of NaN values of both @ref{197,,float} type and
@ref{200,,decimal.Decimal} type now depend on object identity. Formerly, they
always hashed to @code{0} even though NaN values are not equal to one another.
This caused potentially quadratic runtime behavior due to excessive hash
collisions when creating dictionaries and sets containing multiple NaNs.
(Contributed by Raymond Hettinger in bpo-43475@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43475}.)

@item 
A @ref{18f,,SyntaxError} (instead of a @ref{450,,NameError}) will be raised when deleting
the @ref{9e0,,__debug__} constant.  (Contributed by Donghee Na in bpo-45000@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45000}.)

@item 
@ref{18f,,SyntaxError} exceptions now have @code{end_lineno} and
@code{end_offset} attributes.  They will be @code{None} if not determined.
(Contributed by Pablo Galindo in bpo-43914@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43914}.)
@end itemize

@node New Modules<4>,Improved Modules<4>,Other Language Changes<4>,What’s New In Python 3 10
@anchor{whatsnew/3 10 new-modules}@anchor{9e1}
@subsection New Modules



@itemize *

@item 
None.
@end itemize

@node Improved Modules<4>,Optimizations<5>,New Modules<4>,What’s New In Python 3 10
@anchor{whatsnew/3 10 improved-modules}@anchor{9e2}
@subsection Improved Modules


@menu
* asyncio: asyncio<7>. 
* argparse: argparse<4>. 
* array: array<3>. 
* asynchat@comma{} asyncore@comma{} smtpd: asynchat asyncore smtpd. 
* base64: base64<3>. 
* bdb: bdb<2>. 
* bisect:: 
* codecs:: 
* collections.abc: collections abc. 
* contextlib: contextlib<2>. 
* curses: curses<2>. 
* dataclasses: dataclasses<2>. 
* distutils: distutils<2>. 
* doctest: doctest<2>. 
* encodings:: 
* enum: enum<4>. 
* fileinput:: 
* faulthandler: faulthandler<2>. 
* gc: gc<3>. 
* glob: glob<2>. 
* hashlib: hashlib<3>. 
* hmac: hmac<2>. 
* IDLE and idlelib: IDLE and idlelib<2>. 
* importlib.metadata: importlib metadata<2>. 
* inspect: inspect<4>. 
* itertools: itertools<4>. 
* linecache: linecache<2>. 
* os: os<5>. 
* os.path: os path<4>. 
* pathlib: pathlib<8>. 
* platform: platform<3>. 
* pprint:: 
* py_compile:: 
* pyclbr:: 
* shelve:: 
* statistics: statistics<3>. 
* site: site<2>. 
* socket: socket<3>. 
* ssl: ssl<4>. 
* sqlite3: sqlite3<6>. 
* sys: sys<5>. 
* _thread:: 
* threading: threading<4>. 
* traceback: traceback<3>. 
* types: types<4>. 
* typing: typing<6>. 
* unittest: unittest<6>. 
* urllib.parse: urllib parse. 
* xml: xml<2>. 
* zipimport: zipimport<3>. 

@end menu

@node asyncio<7>,argparse<4>,,Improved Modules<4>
@anchor{whatsnew/3 10 asyncio}@anchor{9e3}
@subsubsection asyncio


Add missing @ref{9e4,,connect_accepted_socket()}
method.
(Contributed by Alex Grönholm in bpo-41332@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41332}.)

@node argparse<4>,array<3>,asyncio<7>,Improved Modules<4>
@anchor{whatsnew/3 10 argparse}@anchor{9e5}
@subsubsection argparse


Misleading phrase “optional arguments” was replaced with “options” in argparse help. Some tests might require adaptation if they rely on exact output match.
(Contributed by Raymond Hettinger in bpo-9694@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9694}.)

@node array<3>,asynchat asyncore smtpd,argparse<4>,Improved Modules<4>
@anchor{whatsnew/3 10 array}@anchor{9e6}
@subsubsection array


The @ref{9e7,,index()} method of @ref{4bf,,array.array} now has
optional `start' and `stop' parameters.
(Contributed by Anders Lorentsen and Zackery Spytz in bpo-31956@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31956}.)

@node asynchat asyncore smtpd,base64<3>,array<3>,Improved Modules<4>
@anchor{whatsnew/3 10 asynchat-asyncore-smtpd}@anchor{9e8}
@subsubsection asynchat, asyncore, smtpd


These modules have been marked as deprecated in their module documentation
since Python 3.6.  An import-time @ref{1a4,,DeprecationWarning} has now been
added to all three of these modules.

@node base64<3>,bdb<2>,asynchat asyncore smtpd,Improved Modules<4>
@anchor{whatsnew/3 10 base64}@anchor{9e9}
@subsubsection base64


Add @ref{9ea,,base64.b32hexencode()} and @ref{9eb,,base64.b32hexdecode()} to support the
Base32 Encoding with Extended Hex Alphabet.

@node bdb<2>,bisect,base64<3>,Improved Modules<4>
@anchor{whatsnew/3 10 bdb}@anchor{9ec}
@subsubsection bdb


Add @code{clearBreakpoints()} to reset all set breakpoints.
(Contributed by Irit Katriel in bpo-24160@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24160}.)

@node bisect,codecs,bdb<2>,Improved Modules<4>
@anchor{whatsnew/3 10 bisect}@anchor{9ed}
@subsubsection bisect


Added the possibility of providing a `key' function to the APIs in the @ref{12,,bisect}
module. (Contributed by Raymond Hettinger in bpo-4356@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4356}.)

@node codecs,collections abc,bisect,Improved Modules<4>
@anchor{whatsnew/3 10 codecs}@anchor{9ee}
@subsubsection codecs


Add a @ref{9ef,,codecs.unregister()} function to unregister a codec search function.
(Contributed by Hai Shi in bpo-41842@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41842}.)

@node collections abc,contextlib<2>,codecs,Improved Modules<4>
@anchor{whatsnew/3 10 collections-abc}@anchor{9f0}
@subsubsection collections.abc


The @code{__args__} of the @ref{8c3,,parameterized generic} for
@ref{9f1,,collections.abc.Callable} are now consistent with @ref{9ce,,typing.Callable}.
@code{collections.abc.Callable} generic now flattens type parameters, similar
to what @code{typing.Callable} currently does.  This means that
@code{collections.abc.Callable[[int, str], str]} will have @code{__args__} of
@code{(int, str, str)}; previously this was @code{([int, str], str)}.  To allow this
change, @ref{9f2,,types.GenericAlias} can now be subclassed, and a subclass will
be returned when subscripting the @code{collections.abc.Callable} type.  Note
that a @ref{199,,TypeError} may be raised for invalid forms of parameterizing
@code{collections.abc.Callable} which may have passed silently in Python 3.9.
(Contributed by Ken Jin in bpo-42195@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42195}.)

@node contextlib<2>,curses<2>,collections abc,Improved Modules<4>
@anchor{whatsnew/3 10 contextlib}@anchor{9f3}
@subsubsection contextlib


Add a @ref{9f4,,contextlib.aclosing()} context manager to safely close async generators
and objects representing asynchronously released resources.
(Contributed by Joongi Kim and John Belmonte in bpo-41229@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41229}.)

Add asynchronous context manager support to @ref{9f5,,contextlib.nullcontext()}.
(Contributed by Tom Gringauz in bpo-41543@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41543}.)

Add @ref{9f6,,AsyncContextDecorator}, for supporting usage of async
context managers as decorators.

@node curses<2>,dataclasses<2>,contextlib<2>,Improved Modules<4>
@anchor{whatsnew/3 10 curses}@anchor{9f7}
@subsubsection curses


The extended color functions added in ncurses 6.1 will be used transparently
by @ref{9f8,,curses.color_content()}, @ref{9f9,,curses.init_color()},
@ref{9fa,,curses.init_pair()}, and @ref{9fb,,curses.pair_content()}. A new function,
@ref{9fc,,curses.has_extended_color_support()}, indicates whether extended color
support is provided by the underlying ncurses library.
(Contributed by Jeffrey Kintscher and Hans Petter Jansson in bpo-36982@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36982}.)

The @code{BUTTON5_*} constants are now exposed in the @ref{2f,,curses} module if
they are provided by the underlying curses library.
(Contributed by Zackery Spytz in bpo-39273@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39273}.)

@node dataclasses<2>,distutils<2>,curses<2>,Improved Modules<4>
@anchor{whatsnew/3 10 dataclasses}@anchor{9fd}
@subsubsection dataclasses


@menu
* __slots__:: 
* Keyword-only fields:: 

@end menu

@node __slots__,Keyword-only fields,,dataclasses<2>
@anchor{whatsnew/3 10 slots}@anchor{9fe}
@subsubsection __slots__


Added @code{slots} parameter in @ref{4e2,,dataclasses.dataclass()} decorator.
(Contributed by Yurii Karabas in bpo-42269@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42269})

@node Keyword-only fields,,__slots__,dataclasses<2>
@anchor{whatsnew/3 10 keyword-only-fields}@anchor{9ff}
@subsubsection Keyword-only fields


dataclasses now supports fields that are keyword-only in the
generated __init__ method.  There are a number of ways of specifying
keyword-only fields.

You can say that every field is keyword-only:

@example
from dataclasses import dataclass

@@dataclass(kw_only=True)
class Birthday:
    name: str
    birthday: datetime.date
@end example

Both @code{name} and @code{birthday} are keyword-only parameters to the
generated __init__ method.

You can specify keyword-only on a per-field basis:

@example
from dataclasses import dataclass, field

@@dataclass
class Birthday:
    name: str
    birthday: datetime.date = field(kw_only=True)
@end example

Here only @code{birthday} is keyword-only.  If you set @code{kw_only} on
individual fields, be aware that there are rules about re-ordering
fields due to keyword-only fields needing to follow non-keyword-only
fields.  See the full dataclasses documentation for details.

You can also specify that all fields following a KW_ONLY marker are
keyword-only.  This will probably be the most common usage:

@example
from dataclasses import dataclass, KW_ONLY

@@dataclass
class Point:
    x: float
    y: float
    _: KW_ONLY
    z: float = 0.0
    t: float = 0.0
@end example

Here, @code{z} and @code{t} are keyword-only parameters, while @code{x} and
@code{y} are not.
(Contributed by Eric V. Smith in bpo-43532@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43532}.)

@node distutils<2>,doctest<2>,dataclasses<2>,Improved Modules<4>
@anchor{whatsnew/3 10 distutils}@anchor{a00}@anchor{whatsnew/3 10 distutils-deprecated}@anchor{939}
@subsubsection distutils


The entire @code{distutils} package is deprecated, to be removed in Python
3.12. Its functionality for specifying package builds has already been
completely replaced by third-party packages @code{setuptools} and
@code{packaging}, and most other commonly used APIs are available elsewhere
in the standard library (such as @ref{af,,platform}, @ref{ca,,shutil},
@ref{dc,,subprocess} or @ref{e1,,sysconfig}). There are no plans to migrate
any other functionality from @code{distutils}, and applications that are
using other functions should plan to make private copies of the code.
Refer to 
@geindex Python Enhancement Proposals; PEP 632
PEP 632@footnote{https://peps.python.org/pep-0632/} for discussion.

The @code{bdist_wininst} command deprecated in Python 3.8 has been removed.
The @code{bdist_wheel} command is now recommended to distribute binary packages
on Windows.
(Contributed by Victor Stinner in bpo-42802@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42802}.)

@node doctest<2>,encodings,distutils<2>,Improved Modules<4>
@anchor{whatsnew/3 10 doctest}@anchor{a01}
@subsubsection doctest


When a module does not define @code{__loader__}, fall back to @code{__spec__.loader}.
(Contributed by Brett Cannon in bpo-42133@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42133}.)

@node encodings,enum<4>,doctest<2>,Improved Modules<4>
@anchor{whatsnew/3 10 encodings}@anchor{a02}
@subsubsection encodings


@ref{a03,,encodings.normalize_encoding()} now ignores non-ASCII characters.
(Contributed by Hai Shi in bpo-39337@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39337}.)

@node enum<4>,fileinput,encodings,Improved Modules<4>
@anchor{whatsnew/3 10 enum}@anchor{a04}
@subsubsection enum


@ref{843,,Enum} @ref{830,,__repr__()} now returns @code{enum_name.member_name} and
@ref{831,,__str__()} now returns @code{member_name}.  Stdlib enums available as
module constants have a @ref{1c3,,repr()} of @code{module_name.member_name}.
(Contributed by Ethan Furman in bpo-40066@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40066}.)

Add @ref{82e,,enum.StrEnum} for enums where all members are strings.
(Contributed by Ethan Furman in bpo-41816@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41816}.)

@node fileinput,faulthandler<2>,enum<4>,Improved Modules<4>
@anchor{whatsnew/3 10 fileinput}@anchor{a05}
@subsubsection fileinput


Add `encoding' and `errors' parameters in @ref{a06,,fileinput.input()} and
@ref{945,,fileinput.FileInput}.
(Contributed by Inada Naoki in bpo-43712@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43712}.)

@ref{a07,,fileinput.hook_compressed()} now returns @ref{9c4,,TextIOWrapper} object
when `mode' is “r” and file is compressed, like uncompressed files.
(Contributed by Inada Naoki in bpo-5758@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5758}.)

@node faulthandler<2>,gc<3>,fileinput,Improved Modules<4>
@anchor{whatsnew/3 10 faulthandler}@anchor{a08}
@subsubsection faulthandler


The @ref{5c,,faulthandler} module now detects if a fatal error occurs during a
garbage collector collection.
(Contributed by Victor Stinner in bpo-44466@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44466}.)

@node gc<3>,glob<2>,faulthandler<2>,Improved Modules<4>
@anchor{whatsnew/3 10 gc}@anchor{a09}
@subsubsection gc


Add audit hooks for @ref{a0a,,gc.get_objects()}, @ref{a0b,,gc.get_referrers()} and
@ref{a0c,,gc.get_referents()}. (Contributed by Pablo Galindo in bpo-43439@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43439}.)

@node glob<2>,hashlib<3>,gc<3>,Improved Modules<4>
@anchor{whatsnew/3 10 glob}@anchor{a0d}
@subsubsection glob


Add the `root_dir' and `dir_fd' parameters in @ref{5a0,,glob()} and
@ref{a0e,,iglob()} which allow to specify the root directory for searching.
(Contributed by Serhiy Storchaka in bpo-38144@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38144}.)

@node hashlib<3>,hmac<2>,glob<2>,Improved Modules<4>
@anchor{whatsnew/3 10 hashlib}@anchor{a0f}
@subsubsection hashlib


The hashlib module requires OpenSSL 1.1.1 or newer.
(Contributed by Christian Heimes in 
@geindex Python Enhancement Proposals; PEP 644
PEP 644@footnote{https://peps.python.org/pep-0644/} and bpo-43669@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43669}.)

The hashlib module has preliminary support for OpenSSL 3.0.0.
(Contributed by Christian Heimes in bpo-38820@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38820} and other issues.)

The pure-Python fallback of @ref{734,,pbkdf2_hmac()} is deprecated. In
the future PBKDF2-HMAC will only be available when Python has been built with
OpenSSL support.
(Contributed by Christian Heimes in bpo-43880@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43880}.)

@node hmac<2>,IDLE and idlelib<2>,hashlib<3>,Improved Modules<4>
@anchor{whatsnew/3 10 hmac}@anchor{a10}
@subsubsection hmac


The hmac module now uses OpenSSL’s HMAC implementation internally.
(Contributed by Christian Heimes in bpo-40645@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40645}.)

@node IDLE and idlelib<2>,importlib metadata<2>,hmac<2>,Improved Modules<4>
@anchor{whatsnew/3 10 idle-and-idlelib}@anchor{a11}
@subsubsection IDLE and idlelib


Make IDLE invoke @ref{a12,,sys.excepthook()} (when started without ‘-n’).
User hooks were previously ignored.  (Contributed by Ken Hilton in
bpo-43008@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43008}.)

Rearrange the settings dialog.  Split the General tab into Windows
and Shell/Ed tabs.  Move help sources, which extend the Help menu, to the
Extensions tab.  Make space for new options and shorten the dialog. The
latter makes the dialog better fit small screens.  (Contributed by Terry Jan
Reedy in bpo-40468@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40468}.)  Move the indent space setting from the Font tab to
the new Windows tab.  (Contributed by Mark Roseman and Terry Jan Reedy in
bpo-33962@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33962}.)

The changes above were backported to a 3.9 maintenance release.

Add a Shell sidebar.  Move the primary prompt (‘>>>’) to the sidebar.
Add secondary prompts (’…’) to the sidebar.  Left click and optional
drag selects one or more lines of text, as with the editor
line number sidebar.  Right click after selecting text lines displays
a context menu with ‘copy with prompts’.  This zips together prompts
from the sidebar with lines from the selected text.  This option also
appears on the context menu for the text.  (Contributed by Tal Einat
in bpo-37903@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37903}.)

Use spaces instead of tabs to indent interactive code.  This makes
interactive code entries ‘look right’.  Making this feasible was a
major motivation for adding the shell sidebar.  (Contributed by
Terry Jan Reedy in bpo-37892@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37892}.)

Highlight the new @ref{a13,,soft keywords} @ref{a14,,match},
@code{case}, and @ref{a15,,_} in
pattern-matching statements. However, this highlighting is not perfect
and will be incorrect in some rare cases, including some @code{_}-s in
@code{case} patterns.  (Contributed by Tal Einat in bpo-44010@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44010}.)

New in 3.10 maintenance releases.

Apply syntax highlighting to @code{.pyi} files. (Contributed by Alex
Waygood and Terry Jan Reedy in bpo-45447@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45447}.)

Include prompts when saving Shell with inputs and outputs.
(Contributed by Terry Jan Reedy in gh-95191@footnote{https://github.com/python/cpython/issues/95191}.)

@node importlib metadata<2>,inspect<4>,IDLE and idlelib<2>,Improved Modules<4>
@anchor{whatsnew/3 10 importlib-metadata}@anchor{a16}
@subsubsection importlib.metadata


Feature parity with @code{importlib_metadata} 4.6
(history@footnote{https://importlib-metadata.readthedocs.io/en/latest/history.html}).

@ref{589,,importlib.metadata entry points}
now provide a nicer experience
for selecting entry points by group and name through a new
@ref{589,,importlib.metadata.EntryPoints} class. See the Compatibility
Note in the docs for more info on the deprecation and usage.

Added @ref{a17,,importlib.metadata.packages_distributions()}
for resolving top-level Python modules and packages to their
@ref{a18,,importlib.metadata.Distribution}.

@node inspect<4>,itertools<4>,importlib metadata<2>,Improved Modules<4>
@anchor{whatsnew/3 10 inspect}@anchor{a19}
@subsubsection inspect


When a module does not define @code{__loader__}, fall back to @code{__spec__.loader}.
(Contributed by Brett Cannon in bpo-42133@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42133}.)

Add @ref{a1a,,inspect.get_annotations()}, which safely computes the annotations
defined on an object. It works around the quirks of accessing the annotations
on various types of objects, and makes very few assumptions about the object
it examines. @code{inspect.get_annotations()} can also correctly un-stringize
stringized annotations.  @code{inspect.get_annotations()} is now considered
best practice for accessing the annotations dict defined on any Python object;
for more information on best practices for working with annotations, please see
@ref{9df,,Annotations Best Practices}.
Relatedly, @ref{231,,inspect.signature()},
@ref{947,,inspect.Signature.from_callable()}, and @code{inspect.Signature.from_function()}
now call @code{inspect.get_annotations()} to retrieve annotations. This means
@code{inspect.signature()} and @code{inspect.Signature.from_callable()} can
also now un-stringize stringized annotations.
(Contributed by Larry Hastings in bpo-43817@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43817}.)

@node itertools<4>,linecache<2>,inspect<4>,Improved Modules<4>
@anchor{whatsnew/3 10 itertools}@anchor{a1b}
@subsubsection itertools


Add @ref{a1c,,itertools.pairwise()}.
(Contributed by Raymond Hettinger in bpo-38200@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38200}.)

@node linecache<2>,os<5>,itertools<4>,Improved Modules<4>
@anchor{whatsnew/3 10 linecache}@anchor{a1d}
@subsubsection linecache


When a module does not define @code{__loader__}, fall back to @code{__spec__.loader}.
(Contributed by Brett Cannon in bpo-42133@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42133}.)

@node os<5>,os path<4>,linecache<2>,Improved Modules<4>
@anchor{whatsnew/3 10 os}@anchor{a1e}
@subsubsection os


Add @ref{4dc,,os.cpu_count()} support for VxWorks RTOS.
(Contributed by Peixing Xin in bpo-41440@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41440}.)

Add a new function @ref{a1f,,os.eventfd()} and related helpers to wrap the
@code{eventfd2} syscall on Linux.
(Contributed by Christian Heimes in bpo-41001@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41001}.)

Add @ref{a20,,os.splice()} that allows to move data between two file
descriptors without copying between kernel address space and user
address space, where one of the file descriptors must refer to a
pipe. (Contributed by Pablo Galindo in bpo-41625@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41625}.)

Add @ref{a21,,O_EVTONLY}, @ref{a22,,O_FSYNC}, @ref{a23,,O_SYMLINK}
and @ref{a24,,O_NOFOLLOW_ANY} for macOS.
(Contributed by Donghee Na in bpo-43106@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43106}.)

@node os path<4>,pathlib<8>,os<5>,Improved Modules<4>
@anchor{whatsnew/3 10 os-path}@anchor{a25}
@subsubsection os.path


@ref{264,,os.path.realpath()} now accepts a `strict' keyword-only argument. When set
to @code{True}, @ref{2c2,,OSError} is raised if a path doesn’t exist or a symlink loop
is encountered.
(Contributed by Barney Gale in bpo-43757@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43757}.)

@node pathlib<8>,platform<3>,os path<4>,Improved Modules<4>
@anchor{whatsnew/3 10 pathlib}@anchor{a26}
@subsubsection pathlib


Add slice support to @ref{a27,,PurePath.parents}.
(Contributed by Joshua Cannon in bpo-35498@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35498}.)

Add negative indexing support to @ref{a27,,PurePath.parents}.
(Contributed by Yaroslav Pankovych in bpo-21041@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21041}.)

Add @ref{a28,,Path.hardlink_to} method that
supersedes @code{link_to()}. The new method has the same argument
order as @ref{a29,,symlink_to()}.
(Contributed by Barney Gale in bpo-39950@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39950}.)

@ref{a2a,,pathlib.Path.stat()} and @ref{a2b,,chmod()} now accept a
`follow_symlinks' keyword-only argument for consistency with corresponding
functions in the @ref{a5,,os} module.
(Contributed by Barney Gale in bpo-39906@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39906}.)

@node platform<3>,pprint,pathlib<8>,Improved Modules<4>
@anchor{whatsnew/3 10 platform}@anchor{a2c}
@subsubsection platform


Add @ref{a2d,,platform.freedesktop_os_release()} to retrieve operation system
identification from freedesktop.org os-release@footnote{https://www.freedesktop.org/software/systemd/man/os-release.html} standard file.
(Contributed by Christian Heimes in bpo-28468@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28468}.)

@node pprint,py_compile,platform<3>,Improved Modules<4>
@anchor{whatsnew/3 10 pprint}@anchor{a2e}
@subsubsection pprint


@ref{a2f,,pprint.pprint()} now accepts a new @code{underscore_numbers} keyword argument.
(Contributed by sblondon in bpo-42914@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42914}.)

@ref{b3,,pprint} can now pretty-print @ref{4e2,,dataclasses.dataclass} instances.
(Contributed by Lewis Gaul in bpo-43080@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43080}.)

@node py_compile,pyclbr,pprint,Improved Modules<4>
@anchor{whatsnew/3 10 py-compile}@anchor{a30}
@subsubsection py_compile


Add @code{--quiet} option to command-line interface of @ref{b8,,py_compile}.
(Contributed by Gregory Schevchenko in bpo-38731@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38731}.)

@node pyclbr,shelve,py_compile,Improved Modules<4>
@anchor{whatsnew/3 10 pyclbr}@anchor{a31}
@subsubsection pyclbr


Add an @code{end_lineno} attribute to the @code{Function} and @code{Class}
objects in the tree returned by @ref{a32,,pyclbr.readmodule()} and
@ref{a33,,pyclbr.readmodule_ex()}.  It matches the existing (start) @code{lineno}.
(Contributed by Aviral Srivastava in bpo-38307@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38307}.)

@node shelve,statistics<3>,pyclbr,Improved Modules<4>
@anchor{whatsnew/3 10 shelve}@anchor{a34}
@subsubsection shelve


The @ref{c8,,shelve} module now uses @ref{a35,,pickle.DEFAULT_PROTOCOL} by default
instead of @ref{ab,,pickle} protocol @code{3} when creating shelves.
(Contributed by Zackery Spytz in bpo-34204@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34204}.)

@node statistics<3>,site<2>,shelve,Improved Modules<4>
@anchor{whatsnew/3 10 statistics}@anchor{a36}
@subsubsection statistics


Add @ref{a37,,covariance()}, Pearson’s
@ref{6e4,,correlation()}, and simple
@ref{a38,,linear_regression()} functions.
(Contributed by Tymoteusz Wołodźko in bpo-38490@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38490}.)

@node site<2>,socket<3>,statistics<3>,Improved Modules<4>
@anchor{whatsnew/3 10 site}@anchor{a39}
@subsubsection site


When a module does not define @code{__loader__}, fall back to @code{__spec__.loader}.
(Contributed by Brett Cannon in bpo-42133@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42133}.)

@node socket<3>,ssl<4>,site<2>,Improved Modules<4>
@anchor{whatsnew/3 10 socket}@anchor{a3a}
@subsubsection socket


The exception @ref{a3b,,socket.timeout} is now an alias of @ref{a3c,,TimeoutError}.
(Contributed by Christian Heimes in bpo-42413@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42413}.)

Add option to create MPTCP sockets with @code{IPPROTO_MPTCP}
(Contributed by Rui Cunha in bpo-43571@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43571}.)

Add @code{IP_RECVTOS} option to receive the type of service (ToS) or DSCP/ECN fields
(Contributed by Georg Sauthoff in bpo-44077@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44077}.)

@node ssl<4>,sqlite3<6>,socket<3>,Improved Modules<4>
@anchor{whatsnew/3 10 ssl}@anchor{a3d}
@subsubsection ssl


The ssl module requires OpenSSL 1.1.1 or newer.
(Contributed by Christian Heimes in 
@geindex Python Enhancement Proposals; PEP 644
PEP 644@footnote{https://peps.python.org/pep-0644/} and bpo-43669@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43669}.)

The ssl module has preliminary support for OpenSSL 3.0.0 and new option
@ref{a3e,,OP_IGNORE_UNEXPECTED_EOF}.
(Contributed by Christian Heimes in bpo-38820@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38820}, bpo-43794@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43794},
bpo-43788@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43788}, bpo-43791@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43791}, bpo-43799@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43799}, bpo-43920@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43920},
bpo-43789@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43789}, and bpo-43811@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43811}.)

Deprecated function and use of deprecated constants now result in
a @ref{1a4,,DeprecationWarning}. @ref{a3f,,ssl.SSLContext.options} has
@ref{a40,,OP_NO_SSLv2} and @ref{a41,,OP_NO_SSLv3} set by default and
therefore cannot warn about setting the flag again. The
@ref{a42,,deprecation section} has a list of deprecated
features.
(Contributed by Christian Heimes in bpo-43880@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43880}.)

The ssl module now has more secure default settings. Ciphers without forward
secrecy or SHA-1 MAC are disabled by default. Security level 2 prohibits
weak RSA, DH, and ECC keys with less than 112 bits of security.
@ref{355,,SSLContext} defaults to minimum protocol version TLS 1.2.
Settings are based on Hynek Schlawack’s research.
(Contributed by Christian Heimes in bpo-43998@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43998}.)

The deprecated protocols SSL 3.0, TLS 1.0, and TLS 1.1 are no longer
officially supported. Python does not block them actively. However
OpenSSL build options, distro configurations, vendor patches, and cipher
suites may prevent a successful handshake.

Add a `timeout' parameter to the @ref{a43,,ssl.get_server_certificate()} function.
(Contributed by Zackery Spytz in bpo-31870@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31870}.)

The ssl module uses heap-types and multi-phase initialization.
(Contributed by Christian Heimes in bpo-42333@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42333}.)

A new verify flag @ref{481,,VERIFY_X509_PARTIAL_CHAIN} has been added.
(Contributed by l0x in bpo-40849@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40849}.)

@node sqlite3<6>,sys<5>,ssl<4>,Improved Modules<4>
@anchor{whatsnew/3 10 sqlite3}@anchor{a44}
@subsubsection sqlite3


Add audit events for @ref{5a6,,connect()},
@ref{a45,,enable_load_extension()}, and
@ref{6e0,,load_extension()}.
(Contributed by Erlend E. Aasland in bpo-43762@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43762}.)

@node sys<5>,_thread,sqlite3<6>,Improved Modules<4>
@anchor{whatsnew/3 10 sys}@anchor{a46}
@subsubsection sys


Add @ref{a47,,sys.orig_argv} attribute: the list of the original command line
arguments passed to the Python executable.
(Contributed by Victor Stinner in bpo-23427@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23427}.)

Add @ref{a48,,sys.stdlib_module_names}, containing the list of the standard library
module names.
(Contributed by Victor Stinner in bpo-42955@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42955}.)

@node _thread,threading<4>,sys<5>,Improved Modules<4>
@anchor{whatsnew/3 10 thread}@anchor{a49}
@subsubsection _thread


@ref{a4a,,_thread.interrupt_main()} now takes an optional signal number to
simulate (the default is still @ref{255,,signal.SIGINT}).
(Contributed by Antoine Pitrou in bpo-43356@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43356}.)

@node threading<4>,traceback<3>,_thread,Improved Modules<4>
@anchor{whatsnew/3 10 threading}@anchor{a4b}
@subsubsection threading


Add @ref{a4c,,threading.gettrace()} and @ref{a4d,,threading.getprofile()} to
retrieve the functions set by @ref{a4e,,threading.settrace()} and
@ref{a4f,,threading.setprofile()} respectively.
(Contributed by Mario Corchero in bpo-42251@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42251}.)

Add @ref{a50,,threading.__excepthook__} to allow retrieving the original value
of @ref{a51,,threading.excepthook()} in case it is set to a broken or a different
value.
(Contributed by Mario Corchero in bpo-42308@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42308}.)

@node traceback<3>,types<4>,threading<4>,Improved Modules<4>
@anchor{whatsnew/3 10 traceback}@anchor{a52}
@subsubsection traceback


The @ref{a53,,format_exception()},
@ref{a54,,format_exception_only()}, and
@ref{a55,,print_exception()} functions can now take an exception object
as a positional-only argument.
(Contributed by Zackery Spytz and Matthias Bussonnier in bpo-26389@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26389}.)

@node types<4>,typing<6>,traceback<3>,Improved Modules<4>
@anchor{whatsnew/3 10 types}@anchor{a56}
@subsubsection types


Reintroduce the @ref{a57,,types.EllipsisType}, @ref{a58,,types.NoneType}
and @ref{a59,,types.NotImplementedType} classes, providing a new set
of types readily interpretable by type checkers.
(Contributed by Bas van Beek in bpo-41810@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41810}.)

@node typing<6>,unittest<6>,types<4>,Improved Modules<4>
@anchor{whatsnew/3 10 typing}@anchor{a5a}
@subsubsection typing


For major changes, see @ref{9c7,,New Features Related to Type Hints}.

The behavior of @ref{a5b,,typing.Literal} was changed to conform with 
@geindex Python Enhancement Proposals; PEP 586
PEP 586@footnote{https://peps.python.org/pep-0586/}
and to match the behavior of static type checkers specified in the PEP.


@enumerate 

@item 
@code{Literal} now de-duplicates parameters.

@item 
Equality comparisons between @code{Literal} objects are now order independent.

@item 
@code{Literal} comparisons now respect types.  For example,
@code{Literal[0] == Literal[False]} previously evaluated to @code{True}.  It is
now @code{False}.  To support this change, the internally used type cache now
supports differentiating types.

@item 
@code{Literal} objects will now raise a @ref{199,,TypeError} exception during
equality comparisons if any of their parameters are not @ref{825,,hashable}.
Note that declaring @code{Literal} with unhashable parameters will not throw
an error:

@example
>>> from typing import Literal
>>> Literal[@{0@}]
>>> Literal[@{0@}] == Literal[@{False@}]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'set'
@end example
@end enumerate

(Contributed by Yurii Karabas in bpo-42345@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42345}.)

Add new function @ref{a5c,,typing.is_typeddict()} to introspect if an annotation
is a @ref{330,,typing.TypedDict}.
(Contributed by Patrick Reader in bpo-41792@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41792}.)

Subclasses of @code{typing.Protocol} which only have data variables declared
will now raise a @code{TypeError} when checked with @code{isinstance} unless they
are decorated with @ref{675,,runtime_checkable()}.  Previously, these checks
passed silently.  Users should decorate their
subclasses with the @code{runtime_checkable()} decorator
if they want runtime protocols.
(Contributed by Yurii Karabas in bpo-38908@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38908}.)

Importing from the @code{typing.io} and @code{typing.re} submodules will now emit
@ref{1a4,,DeprecationWarning}.  These submodules have been deprecated since
Python 3.8 and will be removed in a future version of Python.  Anything
belonging to those submodules should be imported directly from
@ref{10b,,typing} instead.
(Contributed by Sebastian Rittau in bpo-38291@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38291}.)

@node unittest<6>,urllib parse,typing<6>,Improved Modules<4>
@anchor{whatsnew/3 10 unittest}@anchor{a5d}
@subsubsection unittest


Add new method @ref{a5e,,assertNoLogs()} to complement the
existing @ref{a5f,,assertLogs()}. (Contributed by Kit Yan Choi
in bpo-39385@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39385}.)

@node urllib parse,xml<2>,unittest<6>,Improved Modules<4>
@anchor{whatsnew/3 10 urllib-parse}@anchor{a60}
@subsubsection urllib.parse


Python versions earlier than Python 3.10 allowed using both @code{;} and @code{&} as
query parameter separators in @ref{321,,urllib.parse.parse_qs()} and
@ref{320,,urllib.parse.parse_qsl()}.  Due to security concerns, and to conform with
newer W3C recommendations, this has been changed to allow only a single
separator key, with @code{&} as the default.  This change also affects
@code{cgi.parse()} and @code{cgi.parse_multipart()} as they use the affected
functions internally.  For more details, please see their respective
documentation.
(Contributed by Adam Goldschmidt, Senthil Kumaran and Ken Jin in bpo-42967@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42967}.)

The presence of newline or tab characters in parts of a URL allows for some
forms of attacks. Following the WHATWG specification that updates 
@geindex RFC; RFC 3986
RFC 3986@footnote{https://datatracker.ietf.org/doc/html/rfc3986.html},
ASCII newline @code{\n}, @code{\r} and tab @code{\t} characters are stripped from the
URL by the parser in @ref{111,,urllib.parse} preventing such attacks. The removal
characters are controlled by a new module level variable
@code{urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE}. (See gh-88048@footnote{https://github.com/python/cpython/issues/88048})

@node xml<2>,zipimport<3>,urllib parse,Improved Modules<4>
@anchor{whatsnew/3 10 xml}@anchor{a61}
@subsubsection xml


Add a @ref{a62,,LexicalHandler} class to the
@ref{131,,xml.sax.handler} module.
(Contributed by Jonathan Gossage and Zackery Spytz in bpo-35018@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35018}.)

@node zipimport<3>,,xml<2>,Improved Modules<4>
@anchor{whatsnew/3 10 zipimport}@anchor{a63}
@subsubsection zipimport


Add methods related to 
@geindex Python Enhancement Proposals; PEP 451
PEP 451@footnote{https://peps.python.org/pep-0451/}: @ref{a64,,find_spec()},
@ref{a65,,zipimport.zipimporter.create_module()}, and
@ref{337,,zipimport.zipimporter.exec_module()}.
(Contributed by Brett Cannon in bpo-42131@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42131}.)

Add @ref{a66,,invalidate_caches()} method.
(Contributed by Desmond Cheong in bpo-14678@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14678}.)

@node Optimizations<5>,Deprecated<6>,Improved Modules<4>,What’s New In Python 3 10
@anchor{whatsnew/3 10 optimizations}@anchor{a67}
@subsection Optimizations



@itemize *

@item 
Constructors @ref{16a,,str()}, @ref{193,,bytes()} and @ref{342,,bytearray()} are now faster
(around 30–40% for small objects).
(Contributed by Serhiy Storchaka in bpo-41334@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41334}.)

@item 
The @ref{c3,,runpy} module now imports fewer modules.
The @code{python3 -m module-name} command startup time is 1.4x faster in
average. On Linux, @code{python3 -I -m module-name} imports 69 modules on Python
3.9, whereas it only imports 51 modules (-18) on Python 3.10.
(Contributed by Victor Stinner in bpo-41006@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41006} and bpo-41718@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41718}.)

@item 
The @code{LOAD_ATTR} instruction now uses new “per opcode cache” mechanism.  It
is about 36% faster now for regular attributes and 44% faster for slots.
(Contributed by Pablo Galindo and Yury Selivanov in bpo-42093@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42093} and Guido
van Rossum in bpo-42927@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42927}, based on ideas implemented originally in PyPy
and MicroPython.)

@item 
When building Python with @ref{a68,,--enable-optimizations} now
@code{-fno-semantic-interposition} is added to both the compile and link line.
This speeds builds of the Python interpreter created with @ref{a69,,--enable-shared}
with @code{gcc} by up to 30%. See this article@footnote{https://developers.redhat.com/blog/2020/06/25/red-hat-enterprise-linux-8-2-brings-faster-python-3-8-run-speeds/}
for more details. (Contributed by Victor Stinner and Pablo Galindo in
bpo-38980@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38980}.)

@item 
Use a new output buffer management code for @ref{14,,bz2} / @ref{8e,,lzma} /
@ref{13a,,zlib} modules, and add @code{.readall()} function to
@code{_compression.DecompressReader} class. bz2 decompression is now 1.09x ~ 1.17x
faster, lzma decompression 1.20x ~ 1.32x faster, @code{GzipFile.read(-1)} 1.11x
~ 1.18x faster. (Contributed by Ma Lin, reviewed by Gregory P. Smith, in bpo-41486@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41486})

@item 
When using stringized annotations, annotations dicts for functions are no longer
created when the function is created.  Instead, they are stored as a tuple of
strings, and the function object lazily converts this into the annotations dict
on demand.  This optimization cuts the CPU time needed to define an annotated
function by half.
(Contributed by Yurii Karabas and Inada Naoki in bpo-42202@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42202}.)

@item 
Substring search functions such as @code{str1 in str2} and @code{str2.find(str1)}
now sometimes use Crochemore & Perrin’s “Two-Way” string searching
algorithm to avoid quadratic behavior on long strings.  (Contributed
by Dennis Sweeney in bpo-41972@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41972})

@item 
Add micro-optimizations to @code{_PyType_Lookup()} to improve type attribute cache lookup
performance in the common case of cache hits. This makes the interpreter 1.04 times faster
on average. (Contributed by Dino Viehland in bpo-43452@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43452}.)

@item 
The following built-in functions now support the faster 
@geindex Python Enhancement Proposals; PEP 590
PEP 590@footnote{https://peps.python.org/pep-0590/} vectorcall calling convention:
@ref{1a0,,map()}, @ref{a6a,,filter()}, @ref{a6b,,reversed()}, @ref{3c1,,bool()} and @ref{197,,float()}.
(Contributed by Donghee Na and Jeroen Demeyer in bpo-43575@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43575}, bpo-43287@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43287}, bpo-41922@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41922}, bpo-41873@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41873} and bpo-41870@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41870}.)

@item 
@ref{a6c,,BZ2File} performance is improved by removing internal @code{RLock}.
This makes @code{BZ2File} thread unsafe in the face of multiple simultaneous
readers or writers, just like its equivalent classes in @ref{6b,,gzip} and
@ref{8e,,lzma} have always been.  (Contributed by Inada Naoki in bpo-43785@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43785}.)
@end itemize

@node Deprecated<6>,Removed<6>,Optimizations<5>,What’s New In Python 3 10
@anchor{whatsnew/3 10 deprecated}@anchor{a6d}@anchor{whatsnew/3 10 whatsnew310-deprecated}@anchor{a42}
@subsection Deprecated



@itemize *

@item 
Currently Python accepts numeric literals immediately followed by keywords,
for example @code{0in x}, @code{1or x}, @code{0if 1else 2}.  It allows confusing
and ambiguous expressions like @code{[0x1for x in y]} (which can be
interpreted as @code{[0x1 for x in y]} or @code{[0x1f or x in y]}).  Starting in
this release, a deprecation warning is raised if the numeric literal is
immediately followed by one of keywords @ref{347,,and}, @ref{17d,,else},
@ref{348,,for}, @ref{182,,if}, @ref{349,,in}, @ref{34a,,is} and @ref{34b,,or}.
In future releases it will be changed to syntax warning, and finally to
syntax error.
(Contributed by Serhiy Storchaka in bpo-43833@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43833}.)

@item 
Starting in this release, there will be a concerted effort to begin
cleaning up old import semantics that were kept for Python 2.7
compatibility. Specifically,
@code{find_loader()}/@code{find_module()}
(superseded by @ref{a6e,,find_spec()}),
@ref{a6f,,load_module()}
(superseded by @ref{a70,,exec_module()}),
@code{module_repr()} (which the import system
takes care of for you), the @code{__package__} attribute
(superseded by @code{__spec__.parent}), the @code{__loader__} attribute
(superseded by @code{__spec__.loader}), and the @code{__cached__} attribute
(superseded by @code{__spec__.cached}) will slowly be removed (as well
as other classes and methods in @ref{7b,,importlib}).
@ref{71f,,ImportWarning} and/or @ref{1a4,,DeprecationWarning} will be raised
as appropriate to help identify code which needs updating during
this transition.

@item 
The entire @code{distutils} namespace is deprecated, to be removed in
Python 3.12. Refer to the @ref{939,,module changes}
section for more information.

@item 
Non-integer arguments to @ref{a71,,random.randrange()} are deprecated.
The @ref{2ee,,ValueError} is deprecated in favor of a @ref{199,,TypeError}.
(Contributed by Serhiy Storchaka and Raymond Hettinger in bpo-37319@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37319}.)

@item 
The various @code{load_module()} methods of @ref{7b,,importlib} have been
documented as deprecated since Python 3.6, but will now also trigger
a @ref{1a4,,DeprecationWarning}. Use
@ref{a70,,exec_module()} instead.
(Contributed by Brett Cannon in bpo-26131@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26131}.)

@item 
@code{zimport.zipimporter.load_module()} has been deprecated in
preference for @ref{337,,exec_module()}.
(Contributed by Brett Cannon in bpo-26131@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26131}.)

@item 
The use of @ref{a6f,,load_module()} by the import
system now triggers an @ref{71f,,ImportWarning} as
@ref{a70,,exec_module()} is preferred.
(Contributed by Brett Cannon in bpo-26131@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26131}.)

@item 
The use of @code{importlib.abc.MetaPathFinder.find_module()} and
@code{importlib.abc.PathEntryFinder.find_module()} by the import system now
trigger an @ref{71f,,ImportWarning} as
@ref{a6e,,importlib.abc.MetaPathFinder.find_spec()} and
@ref{a72,,importlib.abc.PathEntryFinder.find_spec()}
are preferred, respectively. You can use
@ref{a73,,importlib.util.spec_from_loader()} to help in porting.
(Contributed by Brett Cannon in bpo-42134@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42134}.)

@item 
The use of @code{importlib.abc.PathEntryFinder.find_loader()} by the import
system now triggers an @ref{71f,,ImportWarning} as
@ref{a72,,importlib.abc.PathEntryFinder.find_spec()} is preferred. You can use
@ref{a73,,importlib.util.spec_from_loader()} to help in porting.
(Contributed by Brett Cannon in bpo-43672@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43672}.)

@item 
The various implementations of
@code{importlib.abc.MetaPathFinder.find_module()} (
@code{importlib.machinery.BuiltinImporter.find_module()},
@code{importlib.machinery.FrozenImporter.find_module()},
@code{importlib.machinery.WindowsRegistryFinder.find_module()},
@code{importlib.machinery.PathFinder.find_module()},
@code{importlib.abc.MetaPathFinder.find_module()} ),
@code{importlib.abc.PathEntryFinder.find_module()} (
@code{importlib.machinery.FileFinder.find_module()} ), and
@code{importlib.abc.PathEntryFinder.find_loader()} (
@code{importlib.machinery.FileFinder.find_loader()} )
now raise @ref{1a4,,DeprecationWarning} and are slated for removal in
Python 3.12 (previously they were documented as deprecated in Python 3.4).
(Contributed by Brett Cannon in bpo-42135@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42135}.)

@item 
@code{importlib.abc.Finder} is deprecated (including its sole method,
@code{find_module()}). Both
@ref{a74,,importlib.abc.MetaPathFinder} and @ref{a75,,importlib.abc.PathEntryFinder}
no longer inherit from the class. Users should inherit from one of these two
classes as appropriate instead.
(Contributed by Brett Cannon in bpo-42135@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42135}.)

@item 
The deprecations of @code{imp}, @code{importlib.find_loader()},
@code{importlib.util.set_package_wrapper()},
@code{importlib.util.set_loader_wrapper()},
@code{importlib.util.module_for_loader()},
@code{pkgutil.ImpImporter}, and
@code{pkgutil.ImpLoader} have all been updated to list Python 3.12 as the
slated version of removal (they began raising @ref{1a4,,DeprecationWarning} in
previous versions of Python).
(Contributed by Brett Cannon in bpo-43720@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43720}.)

@item 
The import system now uses the @code{__spec__} attribute on modules before
falling back on @code{module_repr()} for a module’s
@code{__repr__()} method. Removal of the use of @code{module_repr()} is scheduled
for Python 3.12.
(Contributed by Brett Cannon in bpo-42137@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42137}.)

@item 
@code{importlib.abc.Loader.module_repr()},
@code{importlib.machinery.FrozenLoader.module_repr()}, and
@code{importlib.machinery.BuiltinLoader.module_repr()} are deprecated and
slated for removal in Python 3.12.
(Contributed by Brett Cannon in bpo-42136@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42136}.)

@item 
@code{sqlite3.OptimizedUnicode} has been undocumented and obsolete since Python
3.3, when it was made an alias to @ref{16a,,str}.  It is now deprecated,
scheduled for removal in Python 3.12.
(Contributed by Erlend E. Aasland in bpo-42264@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42264}.)

@item 
The undocumented built-in function @code{sqlite3.enable_shared_cache} is now
deprecated, scheduled for removal in Python 3.12.  Its use is strongly
discouraged by the SQLite3 documentation.  See the SQLite3 docs@footnote{https://sqlite.org/c3ref/enable_shared_cache.html} for more details.
If a shared cache must be used, open the database in URI mode using the
@code{cache=shared} query parameter.
(Contributed by Erlend E. Aasland in bpo-24464@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24464}.)

@item 
The following @code{threading} methods are now deprecated:


@itemize *

@item 
@code{threading.currentThread} => @ref{35c,,threading.current_thread()}

@item 
@code{threading.activeCount} => @ref{35d,,threading.active_count()}

@item 
@code{threading.Condition.notifyAll} =>
@ref{357,,threading.Condition.notify_all()}

@item 
@code{threading.Event.isSet} => @ref{358,,threading.Event.is_set()}

@item 
@code{threading.Thread.setName} => @ref{2a2,,threading.Thread.name}

@item 
@code{threading.thread.getName} => @ref{2a2,,threading.Thread.name}

@item 
@code{threading.Thread.isDaemon} => @ref{35a,,threading.Thread.daemon}

@item 
@code{threading.Thread.setDaemon} => @ref{35a,,threading.Thread.daemon}
@end itemize

(Contributed by Jelle Zijlstra in gh-87889@footnote{https://github.com/python/cpython/issues/87889}.)

@item 
@code{pathlib.Path.link_to()} is deprecated and slated for removal in
Python 3.12. Use @ref{a28,,pathlib.Path.hardlink_to()} instead.
(Contributed by Barney Gale in bpo-39950@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39950}.)

@item 
@code{cgi.log()} is deprecated and slated for removal in Python 3.12.
(Contributed by Inada Naoki in bpo-41139@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41139}.)

@item 
The following @ref{d5,,ssl} features have been deprecated since Python 3.6,
Python 3.7, or OpenSSL 1.1.0 and will be removed in 3.11:


@itemize *

@item 
@code{OP_NO_SSLv2}, @code{OP_NO_SSLv3}, @code{OP_NO_TLSv1},
@code{OP_NO_TLSv1_1}, @code{OP_NO_TLSv1_2}, and
@code{OP_NO_TLSv1_3} are replaced by
@ref{a76,,minimum_version} and
@ref{a77,,maximum_version}.

@item 
@code{PROTOCOL_SSLv2}, @code{PROTOCOL_SSLv3},
@code{PROTOCOL_SSLv23}, @code{PROTOCOL_TLSv1},
@code{PROTOCOL_TLSv1_1}, @code{PROTOCOL_TLSv1_2}, and
@code{PROTOCOL_TLS} are deprecated in favor of
@ref{a78,,PROTOCOL_TLS_CLIENT} and @ref{a79,,PROTOCOL_TLS_SERVER}

@item 
@code{wrap_socket()} is replaced by @ref{749,,ssl.SSLContext.wrap_socket()}

@item 
@code{match_hostname()}

@item 
@code{RAND_pseudo_bytes()}, @code{RAND_egd()}

@item 
NPN features like @ref{a7a,,ssl.SSLSocket.selected_npn_protocol()} and
@ref{356,,ssl.SSLContext.set_npn_protocols()} are replaced by ALPN.
@end itemize

@item 
The threading debug (@code{PYTHONTHREADDEBUG} environment variable) is
deprecated in Python 3.10 and will be removed in Python 3.12. This feature
requires a @ref{50a,,debug build of Python}.
(Contributed by Victor Stinner in bpo-44584@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44584}.)

@item 
Importing from the @code{typing.io} and @code{typing.re} submodules will now emit
@ref{1a4,,DeprecationWarning}.  These submodules will be removed in a future version
of Python.  Anything belonging to these submodules should be imported directly
from @ref{10b,,typing} instead.
(Contributed by Sebastian Rittau in bpo-38291@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38291}.)
@end itemize

@node Removed<6>,Porting to Python 3 10,Deprecated<6>,What’s New In Python 3 10
@anchor{whatsnew/3 10 removed}@anchor{a7b}@anchor{whatsnew/3 10 whatsnew310-removed}@anchor{a7c}
@subsection Removed



@itemize *

@item 
Removed special methods @code{__int__}, @code{__float__}, @code{__floordiv__},
@code{__mod__}, @code{__divmod__}, @code{__rfloordiv__}, @code{__rmod__} and
@code{__rdivmod__} of the @ref{198,,complex} class.  They always raised
a @ref{199,,TypeError}.
(Contributed by Serhiy Storchaka in bpo-41974@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41974}.)

@item 
The @code{ParserBase.error()} method from the private and undocumented @code{_markupbase}
module has been removed.  @ref{a7d,,html.parser.HTMLParser} is the only subclass of
@code{ParserBase} and its @code{error()} implementation was already removed in
Python 3.5.
(Contributed by Berker Peksag in bpo-31844@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31844}.)

@item 
Removed the @code{unicodedata.ucnhash_CAPI} attribute which was an internal
PyCapsule object. The related private @code{_PyUnicode_Name_CAPI} structure was
moved to the internal C API.
(Contributed by Victor Stinner in bpo-42157@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42157}.)

@item 
Removed the @code{parser} module, which was deprecated in 3.9 due to the
switch to the new PEG parser, as well as all the C source and header files
that were only being used by the old parser, including @code{node.h}, @code{parser.h},
@code{graminit.h} and @code{grammar.h}.

@item 
Removed the Public C API functions @code{PyParser_SimpleParseStringFlags},
@code{PyParser_SimpleParseStringFlagsFilename},
@code{PyParser_SimpleParseFileFlags} and @code{PyNode_Compile}
that were deprecated in 3.9 due to the switch to the new PEG parser.

@item 
Removed the @code{formatter} module, which was deprecated in Python 3.4.
It is somewhat obsolete, little used, and not tested. It was originally
scheduled to be removed in Python 3.6, but such removals were delayed until
after Python 2.7 EOL. Existing users should copy whatever classes they use
into their code.
(Contributed by Donghee Na and Terry J. Reedy in bpo-42299@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42299}.)

@item 
Removed the @code{PyModule_GetWarningsModule()} function that was useless
now due to the @code{_warnings} module was converted to a builtin module in 2.6.
(Contributed by Hai Shi in bpo-42599@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42599}.)

@item 
Remove deprecated aliases to @ref{a7e,,Collections Abstract Base Classes} from
the @ref{1e,,collections} module.
(Contributed by Victor Stinner in bpo-37324@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37324}.)

@item 
The @code{loop} parameter has been removed from most of @ref{b,,asyncio}‘s
@ref{a7f,,high-level API} following deprecation
in Python 3.8.  The motivation behind this change is multifold:


@enumerate 

@item 
This simplifies the high-level API.

@item 
The functions in the high-level API have been implicitly getting the
current thread’s running event loop since Python 3.7.  There isn’t a need to
pass the event loop to the API in most normal use cases.

@item 
Event loop passing is error-prone especially when dealing with loops
running in different threads.
@end enumerate

Note that the low-level API will still accept @code{loop}.
See @ref{a80,,Changes in the Python API} for examples of how to replace existing code.

(Contributed by Yurii Karabas, Andrew Svetlov, Yury Selivanov and Kyle Stanley
in bpo-42392@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42392}.)
@end itemize

@node Porting to Python 3 10,CPython bytecode changes<4>,Removed<6>,What’s New In Python 3 10
@anchor{whatsnew/3 10 porting-to-python-3-10}@anchor{a81}
@subsection Porting to Python 3.10


This section lists previously described changes and other bugfixes
that may require changes to your code.

@menu
* Changes in the Python syntax:: 
* Changes in the Python API: Changes in the Python API<4>. 
* Changes in the C API: Changes in the C API<3>. 

@end menu

@node Changes in the Python syntax,Changes in the Python API<4>,,Porting to Python 3 10
@anchor{whatsnew/3 10 changes-in-the-python-syntax}@anchor{a82}
@subsubsection Changes in the Python syntax



@itemize *

@item 
Deprecation warning is now emitted when compiling previously valid syntax
if the numeric literal is immediately followed by a keyword (like in @code{0in x}).
In future releases it will be changed to syntax warning, and finally to a
syntax error.  To get rid of the warning and make the code compatible with
future releases just add a space between the numeric literal and the
following keyword.
(Contributed by Serhiy Storchaka in bpo-43833@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43833}.)
@end itemize

@node Changes in the Python API<4>,Changes in the C API<3>,Changes in the Python syntax,Porting to Python 3 10
@anchor{whatsnew/3 10 changes-in-the-python-api}@anchor{a83}@anchor{whatsnew/3 10 changes-python-api}@anchor{a80}
@subsubsection Changes in the Python API



@itemize *

@item 
The `etype' parameters of the @ref{a53,,format_exception()},
@ref{a54,,format_exception_only()}, and
@ref{a55,,print_exception()} functions in the @ref{105,,traceback} module
have been renamed to `exc'.
(Contributed by Zackery Spytz and Matthias Bussonnier in bpo-26389@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26389}.)

@item 
@ref{d,,atexit}: At Python exit, if a callback registered with
@ref{a84,,atexit.register()} fails, its exception is now logged. Previously, only
some exceptions were logged, and the last exception was always silently
ignored.
(Contributed by Victor Stinner in bpo-42639@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42639}.)

@item 
@ref{9f1,,collections.abc.Callable} generic now flattens type parameters, similar
to what @ref{9ce,,typing.Callable} currently does.  This means that
@code{collections.abc.Callable[[int, str], str]} will have @code{__args__} of
@code{(int, str, str)}; previously this was @code{([int, str], str)}.  Code which
accesses the arguments via @ref{2ae,,typing.get_args()} or @code{__args__} need to account
for this change.  Furthermore, @ref{199,,TypeError} may be raised for invalid forms
of parameterizing @code{collections.abc.Callable} which may have passed
silently in Python 3.9.
(Contributed by Ken Jin in bpo-42195@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42195}.)

@item 
@ref{a85,,socket.htons()} and @ref{a86,,socket.ntohs()} now raise @ref{a87,,OverflowError}
instead of @ref{1a4,,DeprecationWarning} if the given parameter will not fit in
a 16-bit unsigned integer.
(Contributed by Erlend E. Aasland in bpo-42393@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42393}.)

@item 
The @code{loop} parameter has been removed from most of @ref{b,,asyncio}‘s
@ref{a7f,,high-level API} following deprecation
in Python 3.8.

A coroutine that currently looks like this:

@example
async def foo(loop):
    await asyncio.sleep(1, loop=loop)
@end example

Should be replaced with this:

@example
async def foo():
    await asyncio.sleep(1)
@end example

If @code{foo()} was specifically designed `not' to run in the current thread’s
running event loop (e.g. running in another thread’s event loop), consider
using @ref{a88,,asyncio.run_coroutine_threadsafe()} instead.

(Contributed by Yurii Karabas, Andrew Svetlov, Yury Selivanov and Kyle Stanley
in bpo-42392@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42392}.)

@item 
The @ref{a89,,types.FunctionType} constructor now inherits the current builtins
if the `globals' dictionary has no @code{"__builtins__"} key, rather than using
@code{@{"None": None@}} as builtins: same behavior as @ref{4a4,,eval()} and
@ref{4a3,,exec()} functions.  Defining a function with @code{def function(...): ...}
in Python is not affected, globals cannot be overridden with this syntax: it
also inherits the current builtins.
(Contributed by Victor Stinner in bpo-42990@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42990}.)
@end itemize

@node Changes in the C API<3>,,Changes in the Python API<4>,Porting to Python 3 10
@anchor{whatsnew/3 10 changes-in-the-c-api}@anchor{a8a}
@subsubsection Changes in the C API



@itemize *

@item 
The C API functions @code{PyParser_SimpleParseStringFlags},
@code{PyParser_SimpleParseStringFlagsFilename},
@code{PyParser_SimpleParseFileFlags}, @code{PyNode_Compile} and the type
used by these functions, @code{struct _node}, were removed due to the switch
to the new PEG parser.

Source should be now be compiled directly to a code object using, for
example, @ref{a8b,,Py_CompileString()}. The resulting code object can then be
evaluated using, for example, @ref{a8c,,PyEval_EvalCode()}.

Specifically:


@itemize *

@item 
A call to @code{PyParser_SimpleParseStringFlags} followed by
@code{PyNode_Compile} can be replaced by calling @ref{a8b,,Py_CompileString()}.

@item 
There is no direct replacement for @code{PyParser_SimpleParseFileFlags}.
To compile code from a @code{FILE *} argument, you will need to read
the file in C and pass the resulting buffer to @ref{a8b,,Py_CompileString()}.

@item 
To compile a file given a @code{char *} filename, explicitly open the file, read
it and compile the result. One way to do this is using the @ref{83,,io}
module with @ref{3da,,PyImport_ImportModule()}, @ref{640,,PyObject_CallMethod()},
@ref{a8d,,PyBytes_AsString()} and @ref{a8b,,Py_CompileString()},
as sketched below. (Declarations and error handling are omitted.)

@example
io_module = Import_ImportModule("io");
fileobject = PyObject_CallMethod(io_module, "open", "ss", filename, "rb");
source_bytes_object = PyObject_CallMethod(fileobject, "read", "");
result = PyObject_CallMethod(fileobject, "close", "");
source_buf = PyBytes_AsString(source_bytes_object);
code = Py_CompileString(source_buf, filename, Py_file_input);
@end example

@item 
For @code{FrameObject} objects, the @ref{a8e,,f_lasti} member now represents a wordcode
offset instead of a simple offset into the bytecode string. This means that this
number needs to be multiplied by 2 to be used with APIs that expect a byte offset
instead (like @ref{a8f,,PyCode_Addr2Line()} for example). Notice as well that the
@code{f_lasti} member of @code{FrameObject} objects is not considered stable: please
use @ref{993,,PyFrame_GetLineNumber()} instead.
@end itemize
@end itemize

@node CPython bytecode changes<4>,Build Changes<4>,Porting to Python 3 10,What’s New In Python 3 10
@anchor{whatsnew/3 10 cpython-bytecode-changes}@anchor{a90}
@subsection CPython bytecode changes



@itemize *

@item 
The @code{MAKE_FUNCTION} instruction now accepts either a dict or a tuple of
strings as the function’s annotations.
(Contributed by Yurii Karabas and Inada Naoki in bpo-42202@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42202}.)
@end itemize

@node Build Changes<4>,C API Changes<4>,CPython bytecode changes<4>,What’s New In Python 3 10
@anchor{whatsnew/3 10 build-changes}@anchor{a91}
@subsection Build Changes



@itemize *

@item 
@geindex Python Enhancement Proposals; PEP 644
PEP 644@footnote{https://peps.python.org/pep-0644/}: Python now requires OpenSSL 1.1.1 or newer. OpenSSL 1.0.2 is no
longer supported.
(Contributed by Christian Heimes in bpo-43669@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43669}.)

@item 
The C99 functions @code{snprintf()} and @code{vsnprintf()} are now required
to build Python.
(Contributed by Victor Stinner in bpo-36020@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36020}.)

@item 
@ref{d4,,sqlite3} requires SQLite 3.7.15 or higher. (Contributed by Sergey Fedoseev
and Erlend E. Aasland in bpo-40744@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40744} and bpo-40810@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40810}.)

@item 
The @ref{d,,atexit} module must now always be built as a built-in module.
(Contributed by Victor Stinner in bpo-42639@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42639}.)

@item 
Add @ref{a92,,--disable-test-modules} option to the @code{configure} script:
don’t build nor install test modules.
(Contributed by Xavier de Gaye, Thomas Petazzoni and Peixing Xin in bpo-27640@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27640}.)

@item 
Add @ref{a93,,--with-wheel-pkg-dir=PATH option}
to the @code{./configure} script. If
specified, the @ref{59,,ensurepip} module looks for @code{setuptools} and @code{pip}
wheel packages in this directory: if both are present, these wheel packages
are used instead of ensurepip bundled wheel packages.

Some Linux distribution packaging policies recommend against bundling
dependencies. For example, Fedora installs wheel packages in the
@code{/usr/share/python-wheels/} directory and don’t install the
@code{ensurepip._bundled} package.

(Contributed by Victor Stinner in bpo-42856@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42856}.)

@item 
Add a new @ref{a94,,configure --without-static-libpython option} to not build the @code{libpythonMAJOR.MINOR.a}
static library and not install the @code{python.o} object file.

(Contributed by Victor Stinner in bpo-43103@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43103}.)

@item 
The @code{configure} script now uses the @code{pkg-config} utility, if available,
to detect the location of Tcl/Tk headers and libraries.  As before, those
locations can be explicitly specified with the @code{--with-tcltk-includes}
and @code{--with-tcltk-libs} configuration options.
(Contributed by Manolis Stamatogiannakis in bpo-42603@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42603}.)

@item 
Add @ref{a95,,--with-openssl-rpath} option to @code{configure} script. The option
simplifies building Python with a custom OpenSSL installation, e.g.
@code{./configure --with-openssl=/path/to/openssl --with-openssl-rpath=auto}.
(Contributed by Christian Heimes in bpo-43466@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43466}.)
@end itemize

@node C API Changes<4>,Notable security feature in 3 10 7,Build Changes<4>,What’s New In Python 3 10
@anchor{whatsnew/3 10 c-api-changes}@anchor{a96}
@subsection C API Changes


@menu
* PEP 652; Maintaining the Stable ABI: PEP 652 Maintaining the Stable ABI. 
* New Features: New Features<8>. 
* Porting to Python 3.10: Porting to Python 3 10<2>. 
* Deprecated: Deprecated<7>. 
* Removed: Removed<7>. 

@end menu

@node PEP 652 Maintaining the Stable ABI,New Features<8>,,C API Changes<4>
@anchor{whatsnew/3 10 pep-652-maintaining-the-stable-abi}@anchor{a97}
@subsubsection PEP 652: Maintaining the Stable ABI


The Stable ABI (Application Binary Interface) for extension modules or
embedding Python is now explicitly defined.
@ref{776,,C API Stability} describes C API and ABI stability guarantees along with best
practices for using the Stable ABI.

(Contributed by Petr Viktorin in 
@geindex Python Enhancement Proposals; PEP 652
PEP 652@footnote{https://peps.python.org/pep-0652/} and bpo-43795@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43795}.)

@node New Features<8>,Porting to Python 3 10<2>,PEP 652 Maintaining the Stable ABI,C API Changes<4>
@anchor{whatsnew/3 10 id1}@anchor{a98}
@subsubsection New Features



@itemize *

@item 
The result of @ref{a99,,PyNumber_Index()} now always has exact type @ref{19c,,int}.
Previously, the result could have been an instance of a subclass of @code{int}.
(Contributed by Serhiy Storchaka in bpo-40792@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40792}.)

@item 
Add a new @ref{a9a,,orig_argv} member to the @ref{3f5,,PyConfig}
structure: the list of the original command line arguments passed to the
Python executable.
(Contributed by Victor Stinner in bpo-23427@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23427}.)

@item 
The @ref{a9b,,PyDateTime_DATE_GET_TZINFO()} and
@ref{a9c,,PyDateTime_TIME_GET_TZINFO()} macros have been added for accessing
the @code{tzinfo} attributes of @ref{4e3,,datetime.datetime} and
@ref{1fd,,datetime.time} objects.
(Contributed by Zackery Spytz in bpo-30155@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30155}.)

@item 
Add a @ref{a9d,,PyCodec_Unregister()} function to unregister a codec
search function.
(Contributed by Hai Shi in bpo-41842@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41842}.)

@item 
The @ref{a9e,,PyIter_Send()} function was added to allow
sending value into iterator without raising @code{StopIteration} exception.
(Contributed by Vladimir Matveev in bpo-41756@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41756}.)

@item 
Add @ref{a9f,,PyUnicode_AsUTF8AndSize()} to the limited C API.
(Contributed by Alex Gaynor in bpo-41784@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41784}.)

@item 
Add @ref{60a,,PyModule_AddObjectRef()} function: similar to
@ref{60b,,PyModule_AddObject()} but don’t steal a reference to the value on
success.
(Contributed by Victor Stinner in bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}.)

@item 
Add @ref{aa0,,Py_NewRef()} and @ref{aa1,,Py_XNewRef()} functions to increment the
reference count of an object and return the object.
(Contributed by Victor Stinner in bpo-42262@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42262}.)

@item 
The @ref{79f,,PyType_FromSpecWithBases()} and @ref{774,,PyType_FromModuleAndSpec()}
functions now accept a single class as the `bases' argument.
(Contributed by Serhiy Storchaka in bpo-42423@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42423}.)

@item 
The @ref{774,,PyType_FromModuleAndSpec()} function now accepts NULL @code{tp_doc}
slot.
(Contributed by Hai Shi in bpo-41832@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41832}.)

@item 
The @ref{aa2,,PyType_GetSlot()} function can accept
@ref{988,,static types}.
(Contributed by Hai Shi and Petr Viktorin in bpo-41073@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41073}.)

@item 
Add a new @ref{aa3,,PySet_CheckExact()} function to the C-API to check if an
object is an instance of @ref{185,,set} but not an instance of a subtype.
(Contributed by Pablo Galindo in bpo-43277@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43277}.)

@item 
Add @ref{aa4,,PyErr_SetInterruptEx()} which allows passing a signal number
to simulate.
(Contributed by Antoine Pitrou in bpo-43356@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43356}.)

@item 
The limited C API is now supported if @ref{50a,,Python is built in debug mode} (if the @code{Py_DEBUG} macro is defined). In the limited C API,
the @ref{790,,Py_INCREF()} and @ref{791,,Py_DECREF()} functions are now implemented
as opaque function
calls, rather than accessing directly the @ref{aa5,,PyObject.ob_refcnt}
member, if Python is built in debug mode and the @code{Py_LIMITED_API} macro
targets Python 3.10 or newer. It became possible to support the limited C API
in debug mode because the @ref{5df,,PyObject} structure is the same in release
and debug mode since Python 3.8 (see bpo-36465@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36465}).

The limited C API is still not supported in the @ref{636,,--with-trace-refs}
special build (@code{Py_TRACE_REFS} macro).
(Contributed by Victor Stinner in bpo-43688@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43688}.)

@item 
Add the @ref{aa6,,Py_Is(x@comma{} y)} function to test if the `x' object is
the `y' object, the same as @code{x is y} in Python. Add also the
@ref{aa7,,Py_IsNone()}, @ref{aa8,,Py_IsTrue()}, @ref{aa9,,Py_IsFalse()} functions to
test if an object is, respectively, the @code{None} singleton, the @code{True}
singleton or the @code{False} singleton.
(Contributed by Victor Stinner in bpo-43753@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43753}.)

@item 
Add new functions to control the garbage collector from C code:
@ref{aaa,,PyGC_Enable()},
@ref{aab,,PyGC_Disable()},
@ref{aac,,PyGC_IsEnabled()}.
These functions allow to activate, deactivate and query the state of the garbage collector from C code without
having to import the @ref{64,,gc} module.

@item 
Add a new @ref{7a3,,Py_TPFLAGS_DISALLOW_INSTANTIATION} type flag to disallow
creating type instances.
(Contributed by Victor Stinner in bpo-43916@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43916}.)

@item 
Add a new @ref{3cd,,Py_TPFLAGS_IMMUTABLETYPE} type flag for creating immutable
type objects: type attributes cannot be set nor deleted.
(Contributed by Victor Stinner and Erlend E. Aasland in bpo-43908@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43908}.)
@end itemize

@node Porting to Python 3 10<2>,Deprecated<7>,New Features<8>,C API Changes<4>
@anchor{whatsnew/3 10 id2}@anchor{aad}
@subsubsection Porting to Python 3.10



@itemize *

@item 
The @code{PY_SSIZE_T_CLEAN} macro must now be defined to use
@ref{3bf,,PyArg_ParseTuple()} and @ref{3c0,,Py_BuildValue()} formats which use
@code{#}: @code{es#}, @code{et#}, @code{s#}, @code{u#}, @code{y#}, @code{z#}, @code{U#} and @code{Z#}.
See @ref{3d3,,Parsing arguments and building values} and 
@geindex Python Enhancement Proposals; PEP 353
PEP 353@footnote{https://peps.python.org/pep-0353/}.
(Contributed by Victor Stinner in bpo-40943@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40943}.)

@item 
Since @ref{2d1,,Py_REFCNT()} is changed to the inline static function,
@code{Py_REFCNT(obj) = new_refcnt} must be replaced with @code{Py_SET_REFCNT(obj, new_refcnt)}:
see @ref{aae,,Py_SET_REFCNT()} (available since Python 3.9). For backward
compatibility, this macro can be used:

@example
#if PY_VERSION_HEX < 0x030900A4
#  define Py_SET_REFCNT(obj, refcnt) ((Py_REFCNT(obj) = (refcnt)), (void)0)
#endif
@end example

(Contributed by Victor Stinner in bpo-39573@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39573}.)

@item 
Calling @ref{628,,PyDict_GetItem()} without @ref{165,,GIL} held had been allowed
for historical reason. It is no longer allowed.
(Contributed by Victor Stinner in bpo-40839@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40839}.)

@item 
@code{PyUnicode_FromUnicode(NULL, size)} and @code{PyUnicode_FromStringAndSize(NULL, size)}
raise @code{DeprecationWarning} now.  Use @ref{aaf,,PyUnicode_New()} to allocate
Unicode object without initial data.
(Contributed by Inada Naoki in bpo-36346@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36346}.)

@item 
The private @code{_PyUnicode_Name_CAPI} structure of the PyCapsule API
@code{unicodedata.ucnhash_CAPI} has been moved to the internal C API.
(Contributed by Victor Stinner in bpo-42157@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42157}.)

@item 
@ref{3e1,,Py_GetPath()}, @ref{3e3,,Py_GetPrefix()}, @ref{3e7,,Py_GetExecPrefix()},
@ref{3ea,,Py_GetProgramFullPath()}, @ref{3ed,,Py_GetPythonHome()} and
@ref{3ec,,Py_GetProgramName()} functions now return @code{NULL} if called before
@ref{45e,,Py_Initialize()} (before Python is initialized). Use the new
@ref{646,,Python Initialization Configuration} API to get the @ref{ab0,,Python Path Configuration}.
(Contributed by Victor Stinner in bpo-42260@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42260}.)

@item 
@ref{62f,,PyList_SET_ITEM()}, @ref{62e,,PyTuple_SET_ITEM()} and
@ref{ab1,,PyCell_SET()} macros can no longer be used as l-value or r-value.
For example, @code{x = PyList_SET_ITEM(a, b, c)} and
@code{PyList_SET_ITEM(a, b, c) = x} now fail with a compiler error. It prevents
bugs like @code{if (PyList_SET_ITEM (a, b, c) < 0) ...} test.
(Contributed by Zackery Spytz and Victor Stinner in bpo-30459@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30459}.)

@item 
The non-limited API files @code{odictobject.h}, @code{parser_interface.h},
@code{picklebufobject.h}, @code{pyarena.h}, @code{pyctype.h}, @code{pydebug.h},
@code{pyfpe.h}, and @code{pytime.h} have been moved to the @code{Include/cpython}
directory. These files must not be included directly, as they are already
included in @code{Python.h}; see @ref{98c,,Include Files}. If they have
been included directly, consider including @code{Python.h} instead.
(Contributed by Nicholas Sim in bpo-35134@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35134}.)

@item 
Use the @ref{3cd,,Py_TPFLAGS_IMMUTABLETYPE} type flag to create immutable type
objects. Do not rely on @ref{ab2,,Py_TPFLAGS_HEAPTYPE} to decide if a type
object is mutable or not; check if @code{Py_TPFLAGS_IMMUTABLETYPE} is set
instead.
(Contributed by Victor Stinner and Erlend E. Aasland in bpo-43908@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43908}.)

@item 
The undocumented function @code{Py_FrozenMain} has been removed from the
limited API. The function is mainly useful for custom builds of Python.
(Contributed by Petr Viktorin in bpo-26241@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26241}.)
@end itemize

@node Deprecated<7>,Removed<7>,Porting to Python 3 10<2>,C API Changes<4>
@anchor{whatsnew/3 10 id3}@anchor{ab3}
@subsubsection Deprecated



@itemize *

@item 
The @code{PyUnicode_InternImmortal()} function is now deprecated
and will be removed in Python 3.12: use @ref{ab4,,PyUnicode_InternInPlace()}
instead.
(Contributed by Victor Stinner in bpo-41692@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41692}.)
@end itemize

@node Removed<7>,,Deprecated<7>,C API Changes<4>
@anchor{whatsnew/3 10 id4}@anchor{ab5}
@subsubsection Removed



@itemize *

@item 
Removed @code{Py_UNICODE_str*} functions manipulating @code{Py_UNICODE*} strings.
(Contributed by Inada Naoki in bpo-41123@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41123}.)


@itemize *

@item 
@code{Py_UNICODE_strlen}: use @ref{ab6,,PyUnicode_GetLength()} or
@ref{ab7,,PyUnicode_GET_LENGTH}

@item 
@code{Py_UNICODE_strcat}: use @ref{ab8,,PyUnicode_CopyCharacters()} or
@ref{62b,,PyUnicode_FromFormat()}

@item 
@code{Py_UNICODE_strcpy}, @code{Py_UNICODE_strncpy}: use
@ref{ab8,,PyUnicode_CopyCharacters()} or @ref{ab9,,PyUnicode_Substring()}

@item 
@code{Py_UNICODE_strcmp}: use @ref{aba,,PyUnicode_Compare()}

@item 
@code{Py_UNICODE_strncmp}: use @ref{abb,,PyUnicode_Tailmatch()}

@item 
@code{Py_UNICODE_strchr}, @code{Py_UNICODE_strrchr}: use
@ref{abc,,PyUnicode_FindChar()}
@end itemize

@item 
Removed @code{PyUnicode_GetMax()}. Please migrate to new (
@geindex Python Enhancement Proposals; PEP 393
PEP 393@footnote{https://peps.python.org/pep-0393/}) APIs.
(Contributed by Inada Naoki in bpo-41103@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41103}.)

@item 
Removed @code{PyLong_FromUnicode()}. Please migrate to @ref{abd,,PyLong_FromUnicodeObject()}.
(Contributed by Inada Naoki in bpo-41103@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41103}.)

@item 
Removed @code{PyUnicode_AsUnicodeCopy()}. Please use @ref{abe,,PyUnicode_AsUCS4Copy()} or
@ref{abf,,PyUnicode_AsWideCharString()}
(Contributed by Inada Naoki in bpo-41103@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41103}.)

@item 
Removed @code{_Py_CheckRecursionLimit} variable: it has been replaced by
@code{ceval.recursion_limit} of the @ref{ac0,,PyInterpreterState} structure.
(Contributed by Victor Stinner in bpo-41834@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41834}.)

@item 
Removed undocumented macros @code{Py_ALLOW_RECURSION} and
@code{Py_END_ALLOW_RECURSION} and the @code{recursion_critical} field of the
@ref{ac0,,PyInterpreterState} structure.
(Contributed by Serhiy Storchaka in bpo-41936@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41936}.)

@item 
Removed the undocumented @code{PyOS_InitInterrupts()} function. Initializing
Python already implicitly installs signal handlers: see
@ref{ac1,,PyConfig.install_signal_handlers}.
(Contributed by Victor Stinner in bpo-41713@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41713}.)

@item 
Remove the @code{PyAST_Validate()} function. It is no longer possible to build a
AST object (@code{mod_ty} type) with the public C API. The function was already
excluded from the limited C API (
@geindex Python Enhancement Proposals; PEP 384
PEP 384@footnote{https://peps.python.org/pep-0384/}).
(Contributed by Victor Stinner in bpo-43244@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43244}.)

@item 
Remove the @code{symtable.h} header file and the undocumented functions:


@itemize *

@item 
@code{PyST_GetScope()}

@item 
@code{PySymtable_Build()}

@item 
@code{PySymtable_BuildObject()}

@item 
@code{PySymtable_Free()}

@item 
@code{Py_SymtableString()}

@item 
@code{Py_SymtableStringObject()}
@end itemize

The @code{Py_SymtableString()} function was part the stable ABI by mistake but
it could not be used, because the @code{symtable.h} header file was excluded
from the limited C API.

Use Python @ref{de,,symtable} module instead.
(Contributed by Victor Stinner in bpo-43244@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43244}.)

@item 
Remove @ref{7a6,,PyOS_ReadlineFunctionPointer()} from the limited C API headers
and from @code{python3.dll}, the library that provides the stable ABI on
Windows. Since the function takes a @code{FILE*} argument, its ABI stability
cannot be guaranteed.
(Contributed by Petr Viktorin in bpo-43868@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43868}.)

@item 
Remove @code{ast.h}, @code{asdl.h}, and @code{Python-ast.h} header files.
These functions were undocumented and excluded from the limited C API.
Most names defined by these header files were not prefixed by @code{Py} and so
could create names conflicts. For example, @code{Python-ast.h} defined a
@code{Yield} macro which was conflict with the @code{Yield} name used by the
Windows @code{<winbase.h>} header. Use the Python @ref{9,,ast} module instead.
(Contributed by Victor Stinner in bpo-43244@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43244}.)

@item 
Remove the compiler and parser functions using @code{struct _mod} type, because
the public AST C API was removed:


@itemize *

@item 
@code{PyAST_Compile()}

@item 
@code{PyAST_CompileEx()}

@item 
@code{PyAST_CompileObject()}

@item 
@code{PyFuture_FromAST()}

@item 
@code{PyFuture_FromASTObject()}

@item 
@code{PyParser_ASTFromFile()}

@item 
@code{PyParser_ASTFromFileObject()}

@item 
@code{PyParser_ASTFromFilename()}

@item 
@code{PyParser_ASTFromString()}

@item 
@code{PyParser_ASTFromStringObject()}
@end itemize

These functions were undocumented and excluded from the limited C API.
(Contributed by Victor Stinner in bpo-43244@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43244}.)

@item 
Remove the @code{pyarena.h} header file with functions:


@itemize *

@item 
@code{PyArena_New()}

@item 
@code{PyArena_Free()}

@item 
@code{PyArena_Malloc()}

@item 
@code{PyArena_AddPyObject()}
@end itemize

These functions were undocumented, excluded from the limited C API, and were
only used internally by the compiler.
(Contributed by Victor Stinner in bpo-43244@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43244}.)

@item 
The @code{PyThreadState.use_tracing} member has been removed to optimize Python.
(Contributed by Mark Shannon in bpo-43760@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43760}.)
@end itemize

@node Notable security feature in 3 10 7,Notable security feature in 3 10 8,C API Changes<4>,What’s New In Python 3 10
@anchor{whatsnew/3 10 notable-security-feature-in-3-10-7}@anchor{ac2}
@subsection Notable security feature in 3.10.7


Converting between @ref{19c,,int} and @ref{16a,,str} in bases other than 2
(binary), 4, 8 (octal), 16 (hexadecimal), or 32 such as base 10 (decimal)
now raises a @ref{2ee,,ValueError} if the number of digits in string form is
above a limit to avoid potential denial of service attacks due to the
algorithmic complexity. This is a mitigation for 
@geindex Common Vulnerabilities and Exposures; CVE 2020-10735
CVE 2020-10735@footnote{https://www.cve.org/CVERecord?id=CVE-2020-10735}.
This limit can be configured or disabled by environment variable, command
line flag, or @ref{df,,sys} APIs. See the @ref{80c,,integer string conversion length limitation} documentation.  The default limit
is 4300 digits in string form.

@node Notable security feature in 3 10 8,Notable changes in 3 10 12,Notable security feature in 3 10 7,What’s New In Python 3 10
@anchor{whatsnew/3 10 notable-security-feature-in-3-10-8}@anchor{ac3}
@subsection Notable security feature in 3.10.8


The deprecated @code{mailcap} module now refuses to inject unsafe text
(filenames, MIME types, parameters) into shell commands. Instead of using such
text, it will warn and act as if a match was not found (or for test commands,
as if the test failed).
(Contributed by Petr Viktorin in gh-98966@footnote{https://github.com/python/cpython/issues/98966}.)

@node Notable changes in 3 10 12,,Notable security feature in 3 10 8,What’s New In Python 3 10
@anchor{whatsnew/3 10 notable-changes-in-3-10-12}@anchor{ac4}
@subsection Notable changes in 3.10.12


@menu
* tarfile: tarfile<3>. 

@end menu

@node tarfile<3>,,,Notable changes in 3 10 12
@anchor{whatsnew/3 10 tarfile}@anchor{ac5}
@subsubsection tarfile



@itemize *

@item 
The extraction methods in @ref{e4,,tarfile}, and @ref{697,,shutil.unpack_archive()},
have a new a `filter' argument that allows limiting tar features than may be
surprising or dangerous, such as creating files outside the destination
directory.
See @ref{698,,Extraction filters} for details.
In Python 3.12, use without the `filter' argument will show a
@ref{1a4,,DeprecationWarning}.
In Python 3.14, the default will switch to @code{'data'}.
(Contributed by Petr Viktorin in 
@geindex Python Enhancement Proposals; PEP 706
PEP 706@footnote{https://peps.python.org/pep-0706/}.)
@end itemize

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node What’s New In Python 3 9,What’s New In Python 3 8,What’s New In Python 3 10,What’s New in Python
@anchor{whatsnew/3 9 doc}@anchor{ac6}@anchor{whatsnew/3 9 translation-repo}@anchor{ac7}@anchor{whatsnew/3 9 what-s-new-in-python-3-9}@anchor{ac8}
@section What’s New In Python 3.9


@*Editor: 
Łukasz Langa


@c Rules for maintenance:
@c 
@c * Anyone can add text to this document.  Your text might get
@c rewritten to some degree.
@c 
@c * The maintainer will go through Misc/NEWS periodically and add
@c changes; it's therefore more important to add your changes to
@c Misc/NEWS than to this file.
@c 
@c * This is not a complete list of every single change; completeness
@c is the purpose of Misc/NEWS.  Some changes will be too small
@c or esoteric to include.  If such a change is added to the text,
@c it might get removed during final editing.
@c 
@c * If you want to draw your new text to the attention of the
@c maintainer, add 'XXX' to the beginning of the paragraph or
@c section.
@c 
@c * It's OK to just add a fragmentary note about a change.  For
@c example: "XXX Describe the transmogrify() function added to the
@c socket module."  The maintainer will research the change and
@c write the necessary text.
@c 
@c * You can comment out your additions if you like, but it's not
@c necessary (especially when a final release is some months away).
@c 
@c * Credit the author of a patch or bugfix.   Just the name is
@c sufficient; the e-mail address isn't necessary.
@c 
@c * It's helpful to add the bug/patch number as a comment:
@c 
@c XXX Describe the transmogrify() function added to the socket
@c module.
@c (Contributed by P.Y. Developer in :issue:`12345`.)
@c 
@c This saves the maintainer the effort of going through the Mercurial log
@c when researching a change.

This article explains the new features in Python 3.9, compared to 3.8.
Python 3.9 was released on October 5, 2020.
For full details, see the @ref{143,,changelog}.


@subsubheading See also


@geindex Python Enhancement Proposals; PEP 596
PEP 596@footnote{https://peps.python.org/pep-0596/} - Python 3.9 Release Schedule


@menu
* Summary – Release highlights: Summary – Release highlights<5>. 
* You should check for DeprecationWarning in your code:: 
* New Features: New Features<9>. 
* Other Language Changes: Other Language Changes<5>. 
* New Modules: New Modules<5>. 
* Improved Modules: Improved Modules<5>. 
* Optimizations: Optimizations<6>. 
* Deprecated: Deprecated<8>. 
* Removed: Removed<8>. 
* Porting to Python 3.9: Porting to Python 3 9. 
* Build Changes: Build Changes<5>. 
* C API Changes: C API Changes<5>. 
* Notable changes in Python 3.9.1: Notable changes in Python 3 9 1. 
* Notable changes in Python 3.9.2: Notable changes in Python 3 9 2. 
* Notable changes in Python 3.9.3: Notable changes in Python 3 9 3. 
* Notable changes in Python 3.9.5: Notable changes in Python 3 9 5. 
* Notable security feature in 3.9.14: Notable security feature in 3 9 14. 
* Notable changes in 3.9.17: Notable changes in 3 9 17. 

@end menu

@node Summary – Release highlights<5>,You should check for DeprecationWarning in your code,,What’s New In Python 3 9
@anchor{whatsnew/3 9 summary-release-highlights}@anchor{ac9}
@subsection Summary – Release highlights


@c This section singles out the most important changes in Python 3.9.
@c Brevity is key.

New syntax features:


@itemize *

@item 
@geindex Python Enhancement Proposals; PEP 584
PEP 584@footnote{https://peps.python.org/pep-0584/}, union operators added to @code{dict};

@item 
@geindex Python Enhancement Proposals; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/}, type hinting generics in standard collections;

@item 
@geindex Python Enhancement Proposals; PEP 614
PEP 614@footnote{https://peps.python.org/pep-0614/}, relaxed grammar restrictions on decorators.
@end itemize

New built-in features:


@itemize *

@item 
@geindex Python Enhancement Proposals; PEP 616
PEP 616@footnote{https://peps.python.org/pep-0616/}, string methods to remove prefixes and suffixes.
@end itemize

New features in the standard library:


@itemize *

@item 
@geindex Python Enhancement Proposals; PEP 593
PEP 593@footnote{https://peps.python.org/pep-0593/}, flexible function and variable annotations;

@item 
@ref{6a5,,os.pidfd_open()} added that allows process management without races
and signals.
@end itemize

Interpreter improvements:


@itemize *

@item 
@geindex Python Enhancement Proposals; PEP 573
PEP 573@footnote{https://peps.python.org/pep-0573/}, fast access to module state from methods of C extension
types;

@item 
@geindex Python Enhancement Proposals; PEP 617
PEP 617@footnote{https://peps.python.org/pep-0617/}, CPython now uses a new parser based on PEG;

@item 
a number of Python builtins (range, tuple, set, frozenset, list, dict) are
now sped up using 
@geindex Python Enhancement Proposals; PEP 590
PEP 590@footnote{https://peps.python.org/pep-0590/} vectorcall;

@item 
garbage collection does not block on resurrected objects;

@item 
a number of Python modules (@code{_abc}, @code{audioop}, @code{_bz2},
@code{_codecs}, @code{_contextvars}, @code{_crypt}, @code{_functools},
@code{_json}, @code{_locale}, @ref{92,,math}, @ref{a3,,operator}, @ref{c1,,resource},
@ref{f4,,time}, @code{_weakref}) now use multiphase initialization as defined
by PEP 489;

@item 
a number of standard library modules (@code{audioop}, @ref{9,,ast}, @ref{6a,,grp},
@code{_hashlib}, @ref{b7,,pwd}, @code{_posixsubprocess}, @ref{bd,,random},
@ref{c6,,select}, @ref{db,,struct}, @ref{e7,,termios}, @ref{13a,,zlib}) are now using
the stable ABI defined by PEP 384.
@end itemize

New library modules:


@itemize *

@item 
@geindex Python Enhancement Proposals; PEP 615
PEP 615@footnote{https://peps.python.org/pep-0615/}, the IANA Time Zone Database is now present in the standard
library in the @ref{13b,,zoneinfo} module;

@item 
an implementation of a topological sort of a graph is now provided in
the new @ref{69,,graphlib} module.
@end itemize

Release process changes:


@itemize *

@item 
@geindex Python Enhancement Proposals; PEP 602
PEP 602@footnote{https://peps.python.org/pep-0602/}, CPython adopts an annual release cycle.
@end itemize

@node You should check for DeprecationWarning in your code,New Features<9>,Summary – Release highlights<5>,What’s New In Python 3 9
@anchor{whatsnew/3 9 you-should-check-for-deprecationwarning-in-your-code}@anchor{aca}
@subsection You should check for DeprecationWarning in your code


When Python 2.7 was still supported, a lot of functionality in Python 3
was kept for backward compatibility with Python 2.7. With the end of Python
2 support, these backward compatibility layers have been removed, or will
be removed soon. Most of them emitted a @ref{1a4,,DeprecationWarning} warning for
several years. For example, using @code{collections.Mapping} instead of
@code{collections.abc.Mapping} emits a @code{DeprecationWarning} since Python
3.3, released in 2012.

Test your application with the @ref{acb,,-W} @code{default} command-line option to see
@ref{1a4,,DeprecationWarning} and @ref{acc,,PendingDeprecationWarning}, or even with
@code{-W} @code{error} to treat them as errors. @ref{1b2,,Warnings Filter} can be used to ignore warnings from third-party code.

Python 3.9 is the last version providing those Python 2 backward compatibility
layers, to give more time to Python projects maintainers to organize the
removal of the Python 2 support and add support for Python 3.9.

Aliases to @ref{a7e,,Abstract Base Classes} in
the @ref{1e,,collections} module, like @code{collections.Mapping} alias to
@ref{acd,,collections.abc.Mapping}, are kept for one last release for backward
compatibility. They will be removed from Python 3.10.

More generally, try to run your tests in the @ref{509,,Python Development Mode} which helps to prepare your code to make it compatible with the
next Python version.

Note: a number of pre-existing deprecations were removed in this version of
Python as well. Consult the @ref{ace,,Removed} section.

@node New Features<9>,Other Language Changes<5>,You should check for DeprecationWarning in your code,What’s New In Python 3 9
@anchor{whatsnew/3 9 new-features}@anchor{acf}
@subsection New Features


@menu
* Dictionary Merge & Update Operators:: 
* New String Methods to Remove Prefixes and Suffixes:: 
* Type Hinting Generics in Standard Collections:: 
* New Parser:: 

@end menu

@node Dictionary Merge & Update Operators,New String Methods to Remove Prefixes and Suffixes,,New Features<9>
@anchor{whatsnew/3 9 dictionary-merge-update-operators}@anchor{ad0}
@subsubsection Dictionary Merge & Update Operators


Merge (@code{|}) and update (@code{|=}) operators have been added to the built-in
@ref{184,,dict} class. Those complement the existing @code{dict.update} and
@code{@{**d1, **d2@}} methods of merging dictionaries.

Example:

@example
>>> x = @{"key1": "value1 from x", "key2": "value2 from x"@}
>>> y = @{"key2": "value2 from y", "key3": "value3 from y"@}
>>> x | y
@{'key1': 'value1 from x', 'key2': 'value2 from y', 'key3': 'value3 from y'@}
>>> y | x
@{'key2': 'value2 from x', 'key3': 'value3 from y', 'key1': 'value1 from x'@}
@end example

See 
@geindex Python Enhancement Proposals; PEP 584
PEP 584@footnote{https://peps.python.org/pep-0584/} for a full description.
(Contributed by Brandt Bucher in bpo-36144@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36144}.)

@node New String Methods to Remove Prefixes and Suffixes,Type Hinting Generics in Standard Collections,Dictionary Merge & Update Operators,New Features<9>
@anchor{whatsnew/3 9 new-string-methods-to-remove-prefixes-and-suffixes}@anchor{ad1}
@subsubsection New String Methods to Remove Prefixes and Suffixes


@ref{ad2,,str.removeprefix(prefix)} and
@ref{ad3,,str.removesuffix(suffix)} have been added
to easily remove an unneeded prefix or a suffix from a string. Corresponding
@code{bytes}, @code{bytearray}, and @code{collections.UserString} methods have also been
added. See 
@geindex Python Enhancement Proposals; PEP 616
PEP 616@footnote{https://peps.python.org/pep-0616/} for a full description. (Contributed by Dennis Sweeney in
bpo-39939@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39939}.)

@node Type Hinting Generics in Standard Collections,New Parser,New String Methods to Remove Prefixes and Suffixes,New Features<9>
@anchor{whatsnew/3 9 type-hinting-generics-in-standard-collections}@anchor{ad4}
@subsubsection Type Hinting Generics in Standard Collections


In type annotations you can now use built-in collection types such as
@code{list} and @code{dict} as generic types instead of importing the
corresponding capitalized types (e.g. @code{List} or @code{Dict}) from
@code{typing}.  Some other types in the standard library are also now generic,
for example @code{queue.Queue}.

Example:

@example
def greet_all(names: list[str]) -> None:
    for name in names:
        print("Hello", name)
@end example

See 
@geindex Python Enhancement Proposals; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} for more details.  (Contributed by Guido van Rossum,
Ethan Smith, and Batuhan Taşkaya in bpo-39481@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39481}.)

@node New Parser,,Type Hinting Generics in Standard Collections,New Features<9>
@anchor{whatsnew/3 9 new-parser}@anchor{ad5}
@subsubsection New Parser


Python 3.9 uses a new parser, based on PEG@footnote{https://en.wikipedia.org/wiki/Parsing_expression_grammar} instead
of LL(1)@footnote{https://en.wikipedia.org/wiki/LL_parser}.  The new
parser’s performance is roughly comparable to that of the old parser,
but the PEG formalism is more flexible than LL(1) when it comes to
designing new language features.  We’ll start using this flexibility
in Python 3.10 and later.

The @ref{9,,ast} module uses the new parser and produces the same AST as
the old parser.

In Python 3.10, the old parser will be deleted and so will all
functionality that depends on it (primarily the @code{parser} module,
which has long been deprecated).  In Python 3.9 `only', you can switch
back to the LL(1) parser using a command line switch (@code{-X
oldparser}) or an environment variable (@code{PYTHONOLDPARSER=1}).

See 
@geindex Python Enhancement Proposals; PEP 617
PEP 617@footnote{https://peps.python.org/pep-0617/} for more details.  (Contributed by Guido van Rossum,
Pablo Galindo and Lysandros Nikolaou in bpo-40334@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40334}.)

@node Other Language Changes<5>,New Modules<5>,New Features<9>,What’s New In Python 3 9
@anchor{whatsnew/3 9 other-language-changes}@anchor{ad6}
@subsection Other Language Changes



@itemize *

@item 
@ref{ad7,,__import__()} now raises @ref{65b,,ImportError} instead of
@ref{2ee,,ValueError}, which used to occur when a relative import went past
its top-level package.
(Contributed by Ngalim Siregar in bpo-37444@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37444}.)

@item 
Python now gets the absolute path of the script filename specified on
the command line (ex: @code{python3 script.py}): the @code{__file__} attribute of
the @ref{1,,__main__} module became an absolute path, rather than a relative
path. These paths now remain valid after the current directory is changed
by @ref{822,,os.chdir()}. As a side effect, the traceback also displays the
absolute path for @code{__main__} module frames in this case.
(Contributed by Victor Stinner in bpo-20443@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20443}.)

@item 
In the @ref{509,,Python Development Mode} and in @ref{50a,,debug build}, the
`encoding' and `errors' arguments are now checked for string encoding and
decoding operations. Examples: @ref{318,,open()}, @ref{ad8,,str.encode()} and
@ref{ad9,,bytes.decode()}.

By default, for best performance, the `errors' argument is only checked at
the first encoding/decoding error and the `encoding' argument is sometimes
ignored for empty strings.
(Contributed by Victor Stinner in bpo-37388@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37388}.)

@item 
@code{"".replace("", s, n)} now returns @code{s} instead of an empty string for
all non-zero @code{n}.  It is now consistent with @code{"".replace("", s)}.
There are similar changes for @ref{193,,bytes} and @ref{342,,bytearray} objects.
(Contributed by Serhiy Storchaka in bpo-28029@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28029}.)

@item 
Any valid expression can now be used as a @ref{93f,,decorator}.  Previously, the
grammar was much more restrictive.  See 
@geindex Python Enhancement Proposals; PEP 614
PEP 614@footnote{https://peps.python.org/pep-0614/} for details.
(Contributed by Brandt Bucher in bpo-39702@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39702}.)

@item 
Improved help for the @ref{10b,,typing} module. Docstrings are now shown for
all special forms and special generic aliases (like @code{Union} and @code{List}).
Using @ref{ada,,help()} with generic alias like @code{List[int]} will show the help
for the correspondent concrete type (@code{list} in this case).
(Contributed by Serhiy Storchaka in bpo-40257@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40257}.)

@item 
Parallel running of @ref{adb,,aclose()} / @ref{adc,,asend()} /
@ref{71e,,athrow()} is now prohibited, and @code{ag_running} now reflects
the actual running status of the async generator.
(Contributed by Yury Selivanov in bpo-30773@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30773}.)

@item 
Unexpected errors in calling the @code{__iter__} method are no longer masked by
@code{TypeError} in the @ref{349,,in} operator and functions
@ref{add,,contains()}, @ref{ade,,indexOf()} and
@ref{adf,,countOf()} of the @ref{a3,,operator} module.
(Contributed by Serhiy Storchaka in bpo-40824@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40824}.)

@item 
Unparenthesized lambda expressions can no longer be the expression part in an
@code{if} clause in comprehensions and generator expressions. See bpo-41848@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41848}
and bpo-43755@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43755} for details.
@end itemize

@node New Modules<5>,Improved Modules<5>,Other Language Changes<5>,What’s New In Python 3 9
@anchor{whatsnew/3 9 new-modules}@anchor{ae0}
@subsection New Modules


@menu
* zoneinfo:: 
* graphlib: graphlib<2>. 

@end menu

@node zoneinfo,graphlib<2>,,New Modules<5>
@anchor{whatsnew/3 9 zoneinfo}@anchor{ae1}
@subsubsection zoneinfo


The @ref{13b,,zoneinfo} module brings support for the IANA time zone database to
the standard library. It adds @ref{ae2,,zoneinfo.ZoneInfo}, a concrete
@ref{7f7,,datetime.tzinfo} implementation backed by the system’s time zone data.

Example:

@example
>>> from zoneinfo import ZoneInfo
>>> import datetime as dt

>>> # Daylight saving time
>>> when = dt.datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("America/Los_Angeles"))
>>> print(when)
2020-10-31 12:00:00-07:00
>>> when.tzname()
'PDT'

>>> # Standard time
>>> when += dt.timedelta(days=7)
>>> print(when)
2020-11-07 12:00:00-08:00
>>> print(when.tzname())
PST
@end example

As a fall-back source of data for platforms that don’t ship the IANA database,
the tzdata@footnote{https://pypi.org/project/tzdata/} module was released as a first-party package – distributed via
PyPI and maintained by the CPython core team.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 615

@item PEP 615@footnote{https://peps.python.org/pep-0615/} – Support for the IANA Time Zone Database in the Standard Library

PEP written and implemented by Paul Ganssle
@end table


@node graphlib<2>,,zoneinfo,New Modules<5>
@anchor{whatsnew/3 9 graphlib}@anchor{ae3}
@subsubsection graphlib


A new module, @ref{69,,graphlib}, was added that contains the
@ref{ae4,,graphlib.TopologicalSorter} class to offer functionality to perform
topological sorting of graphs. (Contributed by Pablo Galindo, Tim Peters and
Larry Hastings in bpo-17005@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17005}.)

@node Improved Modules<5>,Optimizations<6>,New Modules<5>,What’s New In Python 3 9
@anchor{whatsnew/3 9 improved-modules}@anchor{ae5}
@subsection Improved Modules


@menu
* ast: ast<4>. 
* asyncio: asyncio<8>. 
* compileall: compileall<2>. 
* concurrent.futures: concurrent futures<3>. 
* curses: curses<3>. 
* datetime: datetime<3>. 
* distutils: distutils<3>. 
* fcntl: fcntl<2>. 
* ftplib: ftplib<2>. 
* gc: gc<4>. 
* hashlib: hashlib<4>. 
* http: http<2>. 
* IDLE and idlelib: IDLE and idlelib<3>. 
* imaplib: imaplib<2>. 
* importlib: importlib<3>. 
* inspect: inspect<5>. 
* ipaddress: ipaddress<2>. 
* math: math<5>. 
* multiprocessing: multiprocessing<3>. 
* nntplib:: 
* os: os<6>. 
* pathlib: pathlib<9>. 
* pdb: pdb<5>. 
* poplib:: 
* pprint: pprint<2>. 
* pydoc: pydoc<2>. 
* random: random<3>. 
* signal:: 
* smtplib:: 
* socket: socket<4>. 
* time: time<3>. 
* sys: sys<6>. 
* tracemalloc:: 
* typing: typing<7>. 
* unicodedata: unicodedata<5>. 
* venv: venv<3>. 
* xml: xml<3>. 

@end menu

@node ast<4>,asyncio<8>,,Improved Modules<5>
@anchor{whatsnew/3 9 ast}@anchor{ae6}
@subsubsection ast


Added the `indent' option to @ref{ae7,,dump()} which allows it to produce a
multiline indented output.
(Contributed by Serhiy Storchaka in bpo-37995@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37995}.)

Added @ref{ae8,,ast.unparse()} as a function in the @ref{9,,ast} module that can
be used to unparse an @ref{4c4,,ast.AST} object and produce a string with code
that would produce an equivalent @code{ast.AST} object when parsed.
(Contributed by Pablo Galindo and Batuhan Taskaya in bpo-38870@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38870}.)

Added docstrings to AST nodes that contains the ASDL signature used to
construct that node. (Contributed by Batuhan Taskaya in bpo-39638@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39638}.)

@node asyncio<8>,compileall<2>,ast<4>,Improved Modules<5>
@anchor{whatsnew/3 9 asyncio}@anchor{ae9}
@subsubsection asyncio


Due to significant security concerns, the `reuse_address' parameter of
@ref{941,,asyncio.loop.create_datagram_endpoint()} is no longer supported. This is
because of the behavior of the socket option @code{SO_REUSEADDR} in UDP. For more
details, see the documentation for @code{loop.create_datagram_endpoint()}.
(Contributed by Kyle Stanley, Antoine Pitrou, and Yury Selivanov in
bpo-37228@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37228}.)

Added a new @ref{6ba,,coroutine} @ref{aea,,shutdown_default_executor()}
that schedules a shutdown for the default executor that waits on the
@ref{94e,,ThreadPoolExecutor} to finish closing. Also,
@ref{2f5,,asyncio.run()} has been updated to use the new coroutine.
(Contributed by Kyle Stanley in bpo-34037@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34037}.)

Added @code{asyncio.PidfdChildWatcher}, a Linux-specific child watcher
implementation that polls process file descriptors. (bpo-38692@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38692})

Added a new @ref{6ba,,coroutine} @ref{aeb,,asyncio.to_thread()}. It is mainly used for
running IO-bound functions in a separate thread to avoid blocking the event
loop, and essentially works as a high-level version of
@ref{aec,,run_in_executor()} that can directly take keyword arguments.
(Contributed by Kyle Stanley and Yury Selivanov in bpo-32309@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32309}.)

When cancelling the task due to a timeout, @ref{816,,asyncio.wait_for()} will now
wait until the cancellation is complete also in the case when `timeout' is
<= 0, like it does with positive timeouts.
(Contributed by Elvis Pranskevichus in bpo-32751@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32751}.)

@ref{b,,asyncio} now raises @ref{199,,TypeError} when calling incompatible
methods with an @ref{aed,,ssl.SSLSocket} socket.
(Contributed by Ido Michael in bpo-37404@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37404}.)

@node compileall<2>,concurrent futures<3>,asyncio<8>,Improved Modules<5>
@anchor{whatsnew/3 9 compileall}@anchor{aee}
@subsubsection compileall


Added new possibility to use hardlinks for duplicated @code{.pyc} files: `hardlink_dupes' parameter and –hardlink-dupes command line option.
(Contributed by  Lumír ‘Frenzy’ Balhar in bpo-40495@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40495}.)

Added new options for path manipulation in resulting @code{.pyc} files: `stripdir', `prependdir', `limit_sl_dest' parameters and -s, -p, -e command line options.
Added the possibility to specify the option for an optimization level multiple times.
(Contributed by Lumír ‘Frenzy’ Balhar in bpo-38112@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38112}.)

@node concurrent futures<3>,curses<3>,compileall<2>,Improved Modules<5>
@anchor{whatsnew/3 9 concurrent-futures}@anchor{aef}
@subsubsection concurrent.futures


Added a new `cancel_futures' parameter to
@ref{af0,,concurrent.futures.Executor.shutdown()} that cancels all pending futures
which have not started running, instead of waiting for them to complete before
shutting down the executor.
(Contributed by Kyle Stanley in bpo-39349@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39349}.)

Removed daemon threads from @ref{94e,,ThreadPoolExecutor}
and @ref{1d8,,ProcessPoolExecutor}. This improves
compatibility with subinterpreters and predictability in their shutdown
processes. (Contributed by Kyle Stanley in bpo-39812@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39812}.)

Workers in @ref{1d8,,ProcessPoolExecutor} are now spawned on
demand, only when there are no available idle workers to reuse. This optimizes
startup overhead and reduces the amount of lost CPU time to idle workers.
(Contributed by Kyle Stanley in bpo-39207@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39207}.)

@node curses<3>,datetime<3>,concurrent futures<3>,Improved Modules<5>
@anchor{whatsnew/3 9 curses}@anchor{af1}
@subsubsection curses


Added @ref{af2,,curses.get_escdelay()}, @ref{af3,,curses.set_escdelay()},
@ref{af4,,curses.get_tabsize()}, and @ref{af5,,curses.set_tabsize()} functions.
(Contributed by Anthony Sottile in bpo-38312@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38312}.)

@node datetime<3>,distutils<3>,curses<3>,Improved Modules<5>
@anchor{whatsnew/3 9 datetime}@anchor{af6}
@subsubsection datetime


The @ref{af7,,isocalendar()} of @ref{1fc,,datetime.date}
and @ref{af8,,isocalendar()} of @ref{4e3,,datetime.datetime}
methods now returns a @ref{4e1,,namedtuple()} instead of a @ref{614,,tuple}.
(Contributed by Donghee Na in bpo-24416@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24416}.)

@node distutils<3>,fcntl<2>,datetime<3>,Improved Modules<5>
@anchor{whatsnew/3 9 distutils}@anchor{af9}
@subsubsection distutils


The @code{upload} command now creates SHA2-256 and Blake2b-256 hash
digests. It skips MD5 on platforms that block MD5 digest.
(Contributed by Christian Heimes in bpo-40698@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40698}.)

@node fcntl<2>,ftplib<2>,distutils<3>,Improved Modules<5>
@anchor{whatsnew/3 9 fcntl}@anchor{afa}
@subsubsection fcntl


Added constants @code{fcntl.F_OFD_GETLK}, @code{fcntl.F_OFD_SETLK}
and @code{fcntl.F_OFD_SETLKW}.
(Contributed by Donghee Na in bpo-38602@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38602}.)

@node ftplib<2>,gc<4>,fcntl<2>,Improved Modules<5>
@anchor{whatsnew/3 9 ftplib}@anchor{afb}
@subsubsection ftplib


@ref{afc,,FTP} and @ref{afd,,FTP_TLS} now raise a @ref{2ee,,ValueError}
if the given timeout for their constructor is zero to prevent the creation of
a non-blocking socket. (Contributed by Donghee Na in bpo-39259@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39259}.)

@node gc<4>,hashlib<4>,ftplib<2>,Improved Modules<5>
@anchor{whatsnew/3 9 gc}@anchor{afe}
@subsubsection gc


When the garbage collector makes a collection in which some objects resurrect
(they are reachable from outside the isolated cycles after the finalizers have
been executed), do not block the collection of all objects that are still
unreachable. (Contributed by Pablo Galindo and Tim Peters in bpo-38379@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38379}.)

Added a new function @ref{aff,,gc.is_finalized()} to check if an object has been
finalized by the garbage collector. (Contributed by Pablo Galindo in
bpo-39322@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39322}.)

@node hashlib<4>,http<2>,gc<4>,Improved Modules<5>
@anchor{whatsnew/3 9 hashlib}@anchor{b00}
@subsubsection hashlib


The @ref{6c,,hashlib} module can now use SHA3 hashes and SHAKE XOF from OpenSSL
when available.
(Contributed by Christian Heimes in bpo-37630@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37630}.)

Builtin hash modules can now be disabled with
@code{./configure --without-builtin-hashlib-hashes} or selectively enabled with
e.g. @code{./configure --with-builtin-hashlib-hashes=sha3,blake2} to force use
of OpenSSL based implementation.
(Contributed by Christian Heimes in bpo-40479@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40479})

@node http<2>,IDLE and idlelib<3>,hashlib<4>,Improved Modules<5>
@anchor{whatsnew/3 9 http}@anchor{b01}
@subsubsection http


HTTP status codes @code{103 EARLY_HINTS}, @code{418 IM_A_TEAPOT} and @code{425 TOO_EARLY} are added to
@ref{b02,,http.HTTPStatus}. (Contributed by Donghee Na in bpo-39509@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39509} and Ross Rhodes in bpo-39507@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39507}.)

@node IDLE and idlelib<3>,imaplib<2>,http<2>,Improved Modules<5>
@anchor{whatsnew/3 9 idle-and-idlelib}@anchor{b03}
@subsubsection IDLE and idlelib


Added option to toggle cursor blink off.  (Contributed by Zackery Spytz
in bpo-4603@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4603}.)

Escape key now closes IDLE completion windows.  (Contributed by Johnny
Najera in bpo-38944@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38944}.)

Added keywords to module name completion list.  (Contributed by Terry J.
Reedy in bpo-37765@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37765}.)

New in 3.9 maintenance releases

Make IDLE invoke @ref{a12,,sys.excepthook()} (when started without ‘-n’).
User hooks were previously ignored.  (Contributed by Ken Hilton in
bpo-43008@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43008}.)

The changes above have been backported to 3.8 maintenance releases.

Rearrange the settings dialog.  Split the General tab into Windows
and Shell/Ed tabs.  Move help sources, which extend the Help menu, to the
Extensions tab.  Make space for new options and shorten the dialog. The
latter makes the dialog better fit small screens.  (Contributed by Terry Jan
Reedy in bpo-40468@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40468}.)  Move the indent space setting from the Font tab to
the new Windows tab.  (Contributed by Mark Roseman and Terry Jan Reedy in
bpo-33962@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33962}.)

Apply syntax highlighting to @code{.pyi} files. (Contributed by Alex
Waygood and Terry Jan Reedy in bpo-45447@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45447}.)

@node imaplib<2>,importlib<3>,IDLE and idlelib<3>,Improved Modules<5>
@anchor{whatsnew/3 9 imaplib}@anchor{b04}
@subsubsection imaplib


@ref{b05,,IMAP4} and @ref{b06,,IMAP4_SSL} now have
an optional `timeout' parameter for their constructors.
Also, the @ref{b07,,open()} method now has an optional `timeout' parameter
with this change. The overridden methods of @code{IMAP4_SSL} and
@ref{b08,,IMAP4_stream} were applied to this change.
(Contributed by Donghee Na in bpo-38615@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38615}.)

@ref{b09,,imaplib.IMAP4.unselect()} is added.
@code{imaplib.IMAP4.unselect()} frees server’s resources associated with the
selected mailbox and returns the server to the authenticated
state. This command performs the same actions as @ref{b0a,,imaplib.IMAP4.close()}, except
that no messages are permanently removed from the currently
selected mailbox. (Contributed by Donghee Na in bpo-40375@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40375}.)

@node importlib<3>,inspect<5>,imaplib<2>,Improved Modules<5>
@anchor{whatsnew/3 9 importlib}@anchor{b0b}
@subsubsection importlib


To improve consistency with import statements, @ref{b0c,,importlib.util.resolve_name()}
now raises @ref{65b,,ImportError} instead of @ref{2ee,,ValueError} for invalid relative
import attempts.
(Contributed by Ngalim Siregar in bpo-37444@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37444}.)

Import loaders which publish immutable module objects can now publish
immutable packages in addition to individual modules.
(Contributed by Dino Viehland in bpo-39336@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39336}.)

Added @ref{6b7,,importlib.resources.files()} function with support for
subdirectories in package data, matching backport in @code{importlib_resources}
version 1.5.
(Contributed by Jason R. Coombs in bpo-39791@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39791}.)

Refreshed @code{importlib.metadata} from @code{importlib_metadata} version 1.6.1.

@node inspect<5>,ipaddress<2>,importlib<3>,Improved Modules<5>
@anchor{whatsnew/3 9 inspect}@anchor{b0d}
@subsubsection inspect


@ref{b0e,,inspect.BoundArguments.arguments} is changed from @code{OrderedDict} to regular
dict.  (Contributed by Inada Naoki in bpo-36350@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36350} and bpo-39775@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39775}.)

@node ipaddress<2>,math<5>,inspect<5>,Improved Modules<5>
@anchor{whatsnew/3 9 ipaddress}@anchor{b0f}
@subsubsection ipaddress


@ref{84,,ipaddress} now supports IPv6 Scoped Addresses (IPv6 address with suffix @code{%<scope_id>}).

Scoped IPv6 addresses can be parsed using @ref{50e,,ipaddress.IPv6Address}.
If present, scope zone ID is available through the @ref{b10,,scope_id} attribute.
(Contributed by Oleksandr Pavliuk in bpo-34788@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34788}.)

Starting with Python 3.9.5 the @ref{84,,ipaddress} module no longer
accepts any leading zeros in IPv4 address strings.
(Contributed by Christian Heimes in bpo-36384@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36384}).

@node math<5>,multiprocessing<3>,ipaddress<2>,Improved Modules<5>
@anchor{whatsnew/3 9 math}@anchor{b11}
@subsubsection math


Expanded the @ref{b12,,math.gcd()} function to handle multiple arguments.
Formerly, it only supported two arguments.
(Contributed by Serhiy Storchaka in bpo-39648@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39648}.)

Added @ref{b13,,math.lcm()}: return the least common multiple of specified arguments.
(Contributed by Mark Dickinson, Ananthakrishnan and Serhiy Storchaka in
bpo-39479@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39479} and bpo-39648@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39648}.)

Added @ref{6c1,,math.nextafter()}: return the next floating-point value after `x'
towards `y'.
(Contributed by Victor Stinner in bpo-39288@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39288}.)

Added @ref{b14,,math.ulp()}: return the value of the least significant bit
of a float.
(Contributed by Victor Stinner in bpo-39310@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39310}.)

@node multiprocessing<3>,nntplib,math<5>,Improved Modules<5>
@anchor{whatsnew/3 9 multiprocessing}@anchor{b15}
@subsubsection multiprocessing


The @ref{b16,,multiprocessing.SimpleQueue} class has a new
@ref{b17,,close()} method to explicitly close the
queue.
(Contributed by Victor Stinner in bpo-30966@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30966}.)

@node nntplib,os<6>,multiprocessing<3>,Improved Modules<5>
@anchor{whatsnew/3 9 nntplib}@anchor{b18}
@subsubsection nntplib


@code{NNTP} and @code{NNTP_SSL} now raise a @ref{2ee,,ValueError}
if the given timeout for their constructor is zero to prevent the creation of
a non-blocking socket. (Contributed by Donghee Na in bpo-39259@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39259}.)

@node os<6>,pathlib<9>,nntplib,Improved Modules<5>
@anchor{whatsnew/3 9 os}@anchor{b19}
@subsubsection os


Added @ref{b1a,,CLD_KILLED} and @ref{b1b,,CLD_STOPPED} for @code{si_code}.
(Contributed by Donghee Na in bpo-38493@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38493}.)

Exposed the Linux-specific @ref{6a5,,os.pidfd_open()} (bpo-38692@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38692}) and
@ref{b1c,,os.P_PIDFD} (bpo-38713@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38713}) for process management with file
descriptors.

The @ref{25e,,os.unsetenv()} function is now also available on Windows.
(Contributed by Victor Stinner in bpo-39413@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39413}.)

The @ref{25d,,os.putenv()} and @ref{25e,,os.unsetenv()} functions are now always
available.
(Contributed by Victor Stinner in bpo-39395@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39395}.)

Added @ref{b1d,,os.waitstatus_to_exitcode()} function:
convert a wait status to an exit code.
(Contributed by Victor Stinner in bpo-40094@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40094}.)

@node pathlib<9>,pdb<5>,os<6>,Improved Modules<5>
@anchor{whatsnew/3 9 pathlib}@anchor{b1e}
@subsubsection pathlib


Added @ref{b1f,,pathlib.Path.readlink()} which acts similarly to
@ref{b20,,os.readlink()}.
(Contributed by Girts Folkmanis in bpo-30618@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30618})

@node pdb<5>,poplib,pathlib<9>,Improved Modules<5>
@anchor{whatsnew/3 9 pdb}@anchor{b21}
@subsubsection pdb


On Windows now @ref{275,,Pdb} supports @code{~/.pdbrc}.
(Contributed by Tim Hopper and Dan Lidral-Porter in bpo-20523@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20523}.)

@node poplib,pprint<2>,pdb<5>,Improved Modules<5>
@anchor{whatsnew/3 9 poplib}@anchor{b22}
@subsubsection poplib


@ref{b23,,POP3} and @ref{b24,,POP3_SSL} now raise a @ref{2ee,,ValueError}
if the given timeout for their constructor is zero to prevent the creation of
a non-blocking socket. (Contributed by Donghee Na in bpo-39259@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39259}.)

@node pprint<2>,pydoc<2>,poplib,Improved Modules<5>
@anchor{whatsnew/3 9 pprint}@anchor{b25}
@subsubsection pprint


@ref{b3,,pprint} can now pretty-print @ref{4e6,,types.SimpleNamespace}.
(Contributed by Carl Bordum Hansen in bpo-37376@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37376}.)

@node pydoc<2>,random<3>,pprint<2>,Improved Modules<5>
@anchor{whatsnew/3 9 pydoc}@anchor{b26}
@subsubsection pydoc


The documentation string is now shown not only for class, function,
method etc, but for any object that has its own @ref{b27,,__doc__}
attribute.
(Contributed by Serhiy Storchaka in bpo-40257@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40257}.)

@node random<3>,signal,pydoc<2>,Improved Modules<5>
@anchor{whatsnew/3 9 random}@anchor{b28}
@subsubsection random


Added a new @ref{b29,,random.Random.randbytes()} method: generate random bytes.
(Contributed by Victor Stinner in bpo-40286@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40286}.)

@node signal,smtplib,random<3>,Improved Modules<5>
@anchor{whatsnew/3 9 signal}@anchor{b2a}
@subsubsection signal


Exposed the Linux-specific @ref{b2b,,signal.pidfd_send_signal()} for sending to
signals to a process using a file descriptor instead of a pid. (bpo-38712@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38712})

@node smtplib,socket<4>,signal,Improved Modules<5>
@anchor{whatsnew/3 9 smtplib}@anchor{b2c}
@subsubsection smtplib


@ref{b2d,,SMTP} and @ref{b2e,,SMTP_SSL} now raise a @ref{2ee,,ValueError}
if the given timeout for their constructor is zero to prevent the creation of
a non-blocking socket. (Contributed by Donghee Na in bpo-39259@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39259}.)

@ref{b2f,,LMTP} constructor  now has an optional `timeout' parameter.
(Contributed by Donghee Na in bpo-39329@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39329}.)

@node socket<4>,time<3>,smtplib,Improved Modules<5>
@anchor{whatsnew/3 9 socket}@anchor{b30}
@subsubsection socket


The @ref{d1,,socket} module now exports the @ref{b31,,CAN_RAW_JOIN_FILTERS}
constant on Linux 4.1 and greater.
(Contributed by Stefan Tatschner and Zackery Spytz in bpo-25780@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25780}.)

The socket module now supports the @ref{b32,,CAN_J1939} protocol on
platforms that support it.  (Contributed by Karl Ding in bpo-40291@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40291}.)

The socket module now has the @ref{b33,,socket.send_fds()} and
@ref{b34,,socket.recv_fds()} functions. (Contributed by Joannah Nanjekye, Shinya
Okano and Victor Stinner in bpo-28724@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28724}.)

@node time<3>,sys<6>,socket<4>,Improved Modules<5>
@anchor{whatsnew/3 9 time}@anchor{b35}
@subsubsection time


On AIX, @ref{b36,,thread_time()} is now implemented with @code{thread_cputime()}
which has nanosecond resolution, rather than
@code{clock_gettime(CLOCK_THREAD_CPUTIME_ID)} which has a resolution of 10 milliseconds.
(Contributed by Batuhan Taskaya in bpo-40192@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40192})

@node sys<6>,tracemalloc,time<3>,Improved Modules<5>
@anchor{whatsnew/3 9 sys}@anchor{b37}
@subsubsection sys


Added a new @ref{b38,,sys.platlibdir} attribute: name of the platform-specific
library directory. It is used to build the path of standard library and the
paths of installed extension modules. It is equal to @code{"lib"} on most
platforms.  On Fedora and SuSE, it is equal to @code{"lib64"} on 64-bit platforms.
(Contributed by Jan Matějek, Matěj Cepl, Charalampos Stratakis and Victor Stinner in bpo-1294959@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1294959}.)

Previously, @ref{b39,,sys.stderr} was block-buffered when non-interactive. Now
@code{stderr} defaults to always being line-buffered.
(Contributed by Jendrik Seipp in bpo-13601@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13601}.)

@node tracemalloc,typing<7>,sys<6>,Improved Modules<5>
@anchor{whatsnew/3 9 tracemalloc}@anchor{b3a}
@subsubsection tracemalloc


Added @ref{b3b,,tracemalloc.reset_peak()} to set the peak size of traced memory
blocks to the current size, to measure the peak of specific pieces of code.
(Contributed by Huon Wilson in bpo-40630@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40630}.)

@node typing<7>,unicodedata<5>,tracemalloc,Improved Modules<5>
@anchor{whatsnew/3 9 typing}@anchor{b3c}
@subsubsection typing


@geindex Python Enhancement Proposals; PEP 593
PEP 593@footnote{https://peps.python.org/pep-0593/} introduced an @ref{b3d,,typing.Annotated} type to decorate existing
types with context-specific metadata and new @code{include_extras} parameter to
@ref{8c2,,typing.get_type_hints()} to access the metadata at runtime. (Contributed
by Till Varoquaux and Konstantin Kashin.)

@node unicodedata<5>,venv<3>,typing<7>,Improved Modules<5>
@anchor{whatsnew/3 9 unicodedata}@anchor{b3e}
@subsubsection unicodedata


The Unicode database has been updated to version 13.0.0. (bpo-39926@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39926}).

@node venv<3>,xml<3>,unicodedata<5>,Improved Modules<5>
@anchor{whatsnew/3 9 venv}@anchor{b3f}
@subsubsection venv


The activation scripts provided by @ref{118,,venv} now all specify their prompt
customization consistently by always using the value specified by
@code{__VENV_PROMPT__}. Previously some scripts unconditionally used
@code{__VENV_PROMPT__}, others only if it happened to be set (which was the default
case), and one used @code{__VENV_NAME__} instead.
(Contributed by Brett Cannon in bpo-37663@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37663}.)

@node xml<3>,,venv<3>,Improved Modules<5>
@anchor{whatsnew/3 9 xml}@anchor{b40}
@subsubsection xml


White space characters within attributes are now preserved when serializing
@ref{12c,,xml.etree.ElementTree} to XML file. EOLNs are no longer normalized
to “n”. This is the result of discussion about how to interpret
section 2.11 of XML spec.
(Contributed by Mefistotelis in bpo-39011@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39011}.)

@node Optimizations<6>,Deprecated<8>,Improved Modules<5>,What’s New In Python 3 9
@anchor{whatsnew/3 9 optimizations}@anchor{b41}
@subsection Optimizations



@itemize *

@item 
Optimized the idiom for assignment a temporary variable in comprehensions.
Now @code{for y in [expr]} in comprehensions is as fast as a simple assignment
@code{y = expr}.  For example:

@quotation

sums = [s for s in [0] for x in data for s in [s + x]]
@end quotation

Unlike the @code{:=} operator this idiom does not leak a variable to the
outer scope.

(Contributed by Serhiy Storchaka in bpo-32856@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32856}.)

@item 
Optimized signal handling in multithreaded applications. If a thread different
than the main thread gets a signal, the bytecode evaluation loop is no longer
interrupted at each bytecode instruction to check for pending signals which
cannot be handled. Only the main thread of the main interpreter can handle
signals.

Previously, the bytecode evaluation loop was interrupted at each instruction
until the main thread handles signals.
(Contributed by Victor Stinner in bpo-40010@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40010}.)

@item 
Optimized the @ref{dc,,subprocess} module on FreeBSD using @code{closefrom()}.
(Contributed by Ed Maste, Conrad Meyer, Kyle Evans, Kubilay Kocak and Victor
Stinner in bpo-38061@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38061}.)

@item 
@ref{b42,,PyLong_FromDouble()} is now up to 1.87x faster for values that
fit into long.
(Contributed by Sergey Fedoseev in bpo-37986@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37986}.)

@item 
A number of Python builtins (@ref{b43,,range}, @ref{614,,tuple}, @ref{185,,set},
@ref{7f3,,frozenset}, @ref{24f,,list}, @ref{184,,dict}) are now sped up by using
@geindex Python Enhancement Proposals; PEP 590
PEP 590@footnote{https://peps.python.org/pep-0590/} vectorcall protocol.
(Contributed by Donghee Na, Mark Shannon, Jeroen Demeyer and Petr Viktorin in bpo-37207@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37207}.)

@item 
Optimized @code{set.difference_update()} for the case when the other set
is much larger than the base set.
(Suggested by Evgeny Kapun with code contributed by Michele Orrù in bpo-8425@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8425}.)

@item 
Python’s small object allocator (@code{obmalloc.c}) now allows (no more than)
one empty arena to remain available for immediate reuse, without returning
it to the OS.  This prevents thrashing in simple loops where an arena could
be created and destroyed anew on each iteration.
(Contributed by Tim Peters in bpo-37257@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37257}.)

@item 
@ref{b44,,floor division} of float operation now has a better performance. Also
the message of @ref{b45,,ZeroDivisionError} for this operation is updated.
(Contributed by Donghee Na in bpo-39434@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39434}.)

@item 
Decoding short ASCII strings with UTF-8 and ascii codecs is now about
15% faster.  (Contributed by Inada Naoki in bpo-37348@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37348}.)
@end itemize

Here’s a summary of performance improvements from Python 3.4 through Python 3.9:

@example
Python version                       3.4     3.5     3.6     3.7     3.8    3.9
--------------                       ---     ---     ---     ---     ---    ---

Variable and attribute read access:
    read_local                       7.1     7.1     5.4     5.1     3.9    3.9
    read_nonlocal                    7.1     8.1     5.8     5.4     4.4    4.5
    read_global                     15.5    19.0    14.3    13.6     7.6    7.8
    read_builtin                    21.1    21.6    18.5    19.0     7.5    7.8
    read_classvar_from_class        25.6    26.5    20.7    19.5    18.4   17.9
    read_classvar_from_instance     22.8    23.5    18.8    17.1    16.4   16.9
    read_instancevar                32.4    33.1    28.0    26.3    25.4   25.3
    read_instancevar_slots          27.8    31.3    20.8    20.8    20.2   20.5
    read_namedtuple                 73.8    57.5    45.0    46.8    18.4   18.7
    read_boundmethod                37.6    37.9    29.6    26.9    27.7   41.1

Variable and attribute write access:
    write_local                      8.7     9.3     5.5     5.3     4.3    4.3
    write_nonlocal                  10.5    11.1     5.6     5.5     4.7    4.8
    write_global                    19.7    21.2    18.0    18.0    15.8   16.7
    write_classvar                  92.9    96.0   104.6   102.1    39.2   39.8
    write_instancevar               44.6    45.8    40.0    38.9    35.5   37.4
    write_instancevar_slots         35.6    36.1    27.3    26.6    25.7   25.8

Data structure read access:
    read_list                       24.2    24.5    20.8    20.8    19.0   19.5
    read_deque                      24.7    25.5    20.2    20.6    19.8   20.2
    read_dict                       24.3    25.7    22.3    23.0    21.0   22.4
    read_strdict                    22.6    24.3    19.5    21.2    18.9   21.5

Data structure write access:
    write_list                      27.1    28.5    22.5    21.6    20.0   20.0
    write_deque                     28.7    30.1    22.7    21.8    23.5   21.7
    write_dict                      31.4    33.3    29.3    29.2    24.7   25.4
    write_strdict                   28.4    29.9    27.5    25.2    23.1   24.5

Stack (or queue) operations:
    list_append_pop                 93.4   112.7    75.4    74.2    50.8   50.6
    deque_append_pop                43.5    57.0    49.4    49.2    42.5   44.2
    deque_append_popleft            43.7    57.3    49.7    49.7    42.8   46.4

Timing loop:
    loop_overhead                    0.5     0.6     0.4     0.3     0.3    0.3
@end example

These results were generated from the variable access benchmark script at:
@code{Tools/scripts/var_access_benchmark.py}. The benchmark script displays timings
in nanoseconds.  The benchmarks were measured on an
Intel® Core™ i7-4960HQ processor@footnote{https://ark.intel.com/content/www/us/en/ark/products/76088/intel-core-i7-4960hq-processor-6m-cache-up-to-3-80-ghz.html}
running the macOS 64-bit builds found at
python.org@footnote{https://www.python.org/downloads/macos/}.

@node Deprecated<8>,Removed<8>,Optimizations<6>,What’s New In Python 3 9
@anchor{whatsnew/3 9 deprecated}@anchor{b46}
@subsection Deprecated



@itemize *

@item 
The distutils @code{bdist_msi} command is now deprecated, use
@code{bdist_wheel} (wheel packages) instead.
(Contributed by Hugo van Kemenade in bpo-39586@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39586}.)

@item 
Currently @ref{b47,,math.factorial()} accepts @ref{197,,float} instances with
non-negative integer values (like @code{5.0}).  It raises a @ref{2ee,,ValueError}
for non-integral and negative floats.  It is now deprecated.  In future
Python versions it will raise a @ref{199,,TypeError} for all floats.
(Contributed by Serhiy Storchaka in bpo-37315@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37315}.)

@item 
The @code{parser} and @code{symbol} modules are deprecated and will be
removed in future versions of Python. For the majority of use cases,
users can leverage the Abstract Syntax Tree (AST) generation and compilation
stage, using the @ref{9,,ast} module.

@item 
The Public C API functions @code{PyParser_SimpleParseStringFlags()},
@code{PyParser_SimpleParseStringFlagsFilename()},
@code{PyParser_SimpleParseFileFlags()} and @code{PyNode_Compile()}
are deprecated and will be removed in Python 3.10 together with the old parser.

@item 
Using @ref{1a3,,NotImplemented} in a boolean context has been deprecated,
as it is almost exclusively the result of incorrect rich comparator
implementations. It will be made a @ref{199,,TypeError} in a future version
of Python.
(Contributed by Josh Rosenberg in bpo-35712@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35712}.)

@item 
The @ref{bd,,random} module currently accepts any hashable type as a
possible seed value.  Unfortunately, some of those types are not
guaranteed to have a deterministic hash value.  After Python 3.9,
the module will restrict its seeds to @ref{887,,None}, @ref{19c,,int},
@ref{197,,float}, @ref{16a,,str}, @ref{193,,bytes}, and @ref{342,,bytearray}.

@item 
Opening the @ref{65c,,GzipFile} file for writing without specifying
the `mode' argument is deprecated.  In future Python versions it will always
be opened for reading by default.  Specify the `mode' argument for opening
it for writing and silencing a warning.
(Contributed by Serhiy Storchaka in bpo-28286@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28286}.)

@item 
Deprecated the @code{split()} method of @code{_tkinter.TkappType} in
favour of the @code{splitlist()} method which has more consistent and
predictable behavior.
(Contributed by Serhiy Storchaka in bpo-38371@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38371}.)

@item 
The explicit passing of coroutine objects to @ref{6a8,,asyncio.wait()} has been
deprecated and will be removed in version 3.11.
(Contributed by Yury Selivanov and Kyle Stanley in bpo-34790@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34790}.)

@item 
binhex4 and hexbin4 standards are now deprecated. The @code{binhex} module
and the following @ref{11,,binascii} functions are now deprecated:


@itemize *

@item 
@code{b2a_hqx()}, @code{a2b_hqx()}

@item 
@code{rlecode_hqx()}, @code{rledecode_hqx()}
@end itemize

(Contributed by Victor Stinner in bpo-39353@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39353}.)

@item 
@ref{9,,ast} classes @code{slice}, @code{Index} and @code{ExtSlice} are considered deprecated
and will be removed in future Python versions.  @code{value} itself should be
used instead of @code{Index(value)}.  @code{Tuple(slices, Load())} should be
used instead of @code{ExtSlice(slices)}.
(Contributed by Serhiy Storchaka in bpo-34822@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34822}.)

@item 
@ref{9,,ast} classes @code{Suite}, @code{Param}, @code{AugLoad} and @code{AugStore}
are considered deprecated and will be removed in future Python versions.
They were not generated by the parser and not accepted by the code
generator in Python 3.
(Contributed by Batuhan Taskaya in bpo-39639@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39639} and bpo-39969@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39969}
and Serhiy Storchaka in bpo-39988@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39988}.)

@item 
The @code{PyEval_InitThreads()} and @code{PyEval_ThreadsInitialized()}
functions are now deprecated and will be removed in Python 3.11. Calling
@code{PyEval_InitThreads()} now does nothing. The @ref{165,,GIL} is initialized
by @ref{45e,,Py_Initialize()} since Python 3.7.
(Contributed by Victor Stinner in bpo-39877@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39877}.)

@item 
Passing @code{None} as the first argument to the @ref{75f,,shlex.split()} function
has been deprecated.  (Contributed by Zackery Spytz in bpo-33262@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33262}.)

@item 
@code{smtpd.MailmanProxy()} is now deprecated as it is unusable without
an external module, @code{mailman}.  (Contributed by Samuel Colvin in bpo-35800@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35800}.)

@item 
The @code{lib2to3} module now emits a @ref{acc,,PendingDeprecationWarning}.
Python 3.9 switched to a PEG parser (see 
@geindex Python Enhancement Proposals; PEP 617
PEP 617@footnote{https://peps.python.org/pep-0617/}), and Python 3.10 may
include new language syntax that is not parsable by lib2to3’s LL(1) parser.
The @code{lib2to3} module may be removed from the standard library in a future
Python version. Consider third-party alternatives such as LibCST@footnote{https://libcst.readthedocs.io/} or
parso@footnote{https://parso.readthedocs.io/}.
(Contributed by Carl Meyer in bpo-40360@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40360}.)

@item 
The `random' parameter of @ref{953,,random.shuffle()} has been deprecated.
(Contributed by Raymond Hettinger in bpo-40465@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40465})
@end itemize

@node Removed<8>,Porting to Python 3 9,Deprecated<8>,What’s New In Python 3 9
@anchor{whatsnew/3 9 removed}@anchor{b48}@anchor{whatsnew/3 9 removed-in-python-39}@anchor{ace}
@subsection Removed



@itemize *

@item 
The erroneous version at @code{unittest.mock.__version__} has been removed.

@item 
@code{nntplib.NNTP}: @code{xpath()} and @code{xgtitle()} methods have been removed.
These methods are deprecated since Python 3.3. Generally, these extensions
are not supported or not enabled by NNTP server administrators.
For @code{xgtitle()}, please use @code{nntplib.NNTP.descriptions()} or
@code{nntplib.NNTP.description()} instead.
(Contributed by Donghee Na in bpo-39366@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39366}.)

@item 
@ref{4bf,,array.array}: @code{tostring()} and @code{fromstring()} methods have been
removed. They were aliases to @code{tobytes()} and @code{frombytes()}, deprecated
since Python 3.2.
(Contributed by Victor Stinner in bpo-38916@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38916}.)

@item 
The undocumented @code{sys.callstats()} function has been removed. Since Python
3.7, it was deprecated and always returned @ref{887,,None}. It required a special
build option @code{CALL_PROFILE} which was already removed in Python 3.7.
(Contributed by Victor Stinner in bpo-37414@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37414}.)

@item 
The @code{sys.getcheckinterval()} and @code{sys.setcheckinterval()} functions have
been removed. They were deprecated since Python 3.2. Use
@ref{b49,,sys.getswitchinterval()} and @ref{b4a,,sys.setswitchinterval()} instead.
(Contributed by Victor Stinner in bpo-37392@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37392}.)

@item 
The C function @code{PyImport_Cleanup()} has been removed. It was documented as:
“Empty the module table.  For internal use only.”
(Contributed by Victor Stinner in bpo-36710@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36710}.)

@item 
@code{_dummy_thread} and @code{dummy_threading} modules have been removed. These
modules were deprecated since Python 3.7 which requires threading support.
(Contributed by Victor Stinner in bpo-37312@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37312}.)

@item 
@code{aifc.openfp()} alias to @code{aifc.open()}, @code{sunau.openfp()} alias to
@code{sunau.open()}, and @code{wave.openfp()} alias to @ref{b4b,,wave.open()} have been
removed. They were deprecated since Python 3.7.
(Contributed by Victor Stinner in bpo-37320@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37320}.)

@item 
The @code{isAlive()} method of @ref{177,,threading.Thread}
has been removed. It was deprecated since Python 3.8.
Use @ref{b4c,,is_alive()} instead.
(Contributed by Donghee Na in bpo-37804@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37804}.)

@item 
Methods @code{getchildren()} and @code{getiterator()} of classes
@ref{b4d,,ElementTree} and
@ref{361,,Element} in the @ref{12c,,ElementTree}
module have been removed.  They were deprecated in Python 3.2.
Use @code{iter(x)} or @code{list(x)} instead of @code{x.getchildren()} and
@code{x.iter()} or @code{list(x.iter())} instead of @code{x.getiterator()}.
(Contributed by Serhiy Storchaka in bpo-36543@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36543}.)

@item 
The old @ref{b0,,plistlib} API has been removed, it was deprecated since Python
3.4. Use the @ref{b4e,,load()}, @ref{b4f,,loads()}, @ref{b50,,dump()}, and
@ref{b51,,dumps()} functions. Additionally, the `use_builtin_types' parameter was
removed, standard @ref{193,,bytes} objects are always used instead.
(Contributed by Jon Janzen in bpo-36409@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36409}.)

@item 
The C function @code{PyGen_NeedsFinalizing} has been removed. It was not
documented, tested, or used anywhere within CPython after the implementation
of 
@geindex Python Enhancement Proposals; PEP 442
PEP 442@footnote{https://peps.python.org/pep-0442/}. Patch by Joannah Nanjekye.
(Contributed by Joannah Nanjekye in bpo-15088@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15088})

@item 
@code{base64.encodestring()} and @code{base64.decodestring()}, aliases deprecated
since Python 3.1, have been removed: use @ref{b52,,base64.encodebytes()} and
@ref{b53,,base64.decodebytes()} instead.
(Contributed by Victor Stinner in bpo-39351@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39351}.)

@item 
@code{fractions.gcd()} function has been removed, it was deprecated since Python
3.5 (bpo-22486@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22486}): use @ref{b12,,math.gcd()} instead.
(Contributed by Victor Stinner in bpo-39350@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39350}.)

@item 
The `buffering' parameter of @ref{a6c,,bz2.BZ2File} has been removed. Since
Python 3.0, it was ignored and using it emitted a @ref{1a4,,DeprecationWarning}.
Pass an open file object to control how the file is opened.
(Contributed by Victor Stinner in bpo-39357@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39357}.)

@item 
The `encoding' parameter of @ref{b54,,json.loads()} has been removed.
As of Python 3.1, it was deprecated and ignored; using it has emitted a
@ref{1a4,,DeprecationWarning} since Python 3.8.
(Contributed by Inada Naoki in bpo-39377@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39377})

@item 
@code{with (await asyncio.lock):} and @code{with (yield from asyncio.lock):} statements are
not longer supported, use @code{async with lock} instead.  The same is correct for
@code{asyncio.Condition} and @code{asyncio.Semaphore}.
(Contributed by Andrew Svetlov in bpo-34793@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34793}.)

@item 
The @code{sys.getcounts()} function, the @code{-X showalloccount} command line
option and the @code{show_alloc_count} field of the C structure
@ref{3f5,,PyConfig} have been removed. They required a special Python build by
defining @code{COUNT_ALLOCS} macro.
(Contributed by Victor Stinner in bpo-39489@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39489}.)

@item 
The @code{_field_types} attribute of the @ref{32f,,typing.NamedTuple} class
has been removed.  It was deprecated since Python 3.8.  Use
the @code{__annotations__} attribute instead.
(Contributed by Serhiy Storchaka in bpo-40182@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40182}.)

@item 
The @code{symtable.SymbolTable.has_exec()} method has been removed. It was
deprecated since 2006, and only returning @code{False} when it’s called.
(Contributed by Batuhan Taskaya in bpo-40208@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40208})

@item 
The @code{asyncio.Task.current_task()} and @code{asyncio.Task.all_tasks()}
have been removed. They were deprecated since Python 3.7 and you can use
@ref{6a6,,asyncio.current_task()} and @ref{b55,,asyncio.all_tasks()} instead.
(Contributed by Rémi Lapeyre in bpo-40967@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40967})

@item 
The @code{unescape()} method in the @ref{a7d,,html.parser.HTMLParser} class
has been removed (it was deprecated since Python 3.4).  @ref{b56,,html.unescape()}
should be used for converting character references to the corresponding
unicode characters.
@end itemize

@node Porting to Python 3 9,Build Changes<5>,Removed<8>,What’s New In Python 3 9
@anchor{whatsnew/3 9 porting-to-python-3-9}@anchor{b57}
@subsection Porting to Python 3.9


This section lists previously described changes and other bugfixes
that may require changes to your code.

@menu
* Changes in the Python API: Changes in the Python API<5>. 
* Changes in the C API: Changes in the C API<4>. 
* CPython bytecode changes: CPython bytecode changes<5>. 

@end menu

@node Changes in the Python API<5>,Changes in the C API<4>,,Porting to Python 3 9
@anchor{whatsnew/3 9 changes-in-the-python-api}@anchor{b58}
@subsubsection Changes in the Python API



@itemize *

@item 
@ref{ad7,,__import__()} and @ref{b0c,,importlib.util.resolve_name()} now raise
@ref{65b,,ImportError} where it previously raised @ref{2ee,,ValueError}. Callers
catching the specific exception type and supporting both Python 3.9 and
earlier versions will need to catch both using @code{except (ImportError, ValueError):}.

@item 
The @ref{118,,venv} activation scripts no longer special-case when
@code{__VENV_PROMPT__} is set to @code{""}.

@item 
The @ref{b59,,select.epoll.unregister()} method no longer ignores the
@ref{b5a,,EBADF} error.
(Contributed by Victor Stinner in bpo-39239@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39239}.)

@item 
The `compresslevel' parameter of @ref{a6c,,bz2.BZ2File} became keyword-only,
since the `buffering' parameter has been removed.
(Contributed by Victor Stinner in bpo-39357@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39357}.)

@item 
Simplified AST for subscription. Simple indices will be represented by
their value, extended slices will be represented as tuples.
@code{Index(value)} will return a @code{value} itself, @code{ExtSlice(slices)}
will return @code{Tuple(slices, Load())}.
(Contributed by Serhiy Storchaka in bpo-34822@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34822}.)

@item 
The @ref{7b,,importlib} module now ignores the 
@geindex PYTHONCASEOK
@geindex environment variable; PYTHONCASEOK
@ref{b5b,,PYTHONCASEOK}
environment variable when the @ref{b5c,,-E} or @ref{b5d,,-I} command line
options are being used.

@item 
The `encoding' parameter has been added to the classes @ref{afc,,ftplib.FTP} and
@ref{afd,,ftplib.FTP_TLS} as a keyword-only parameter, and the default encoding
is changed from Latin-1 to UTF-8 to follow 
@geindex RFC; RFC 2640
RFC 2640@footnote{https://datatracker.ietf.org/doc/html/rfc2640.html}.

@item 
@ref{aea,,asyncio.loop.shutdown_default_executor()} has been added to
@ref{b5e,,AbstractEventLoop}, meaning alternative event loops that
inherit from it should have this method defined.
(Contributed by Kyle Stanley in bpo-34037@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34037}.)

@item 
The constant values of future flags in the @ref{0,,__future__} module
is updated in order to prevent collision with compiler flags. Previously
@code{PyCF_ALLOW_TOP_LEVEL_AWAIT} was clashing with @code{CO_FUTURE_DIVISION}.
(Contributed by Batuhan Taskaya in bpo-39562@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39562})

@item 
@code{array('u')} now uses @code{wchar_t} as C type instead of @code{Py_UNICODE}.
This change doesn’t affect to its behavior because @code{Py_UNICODE} is alias
of @code{wchar_t} since Python 3.3.
(Contributed by Inada Naoki in bpo-34538@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34538}.)

@item 
The @ref{b5f,,logging.getLogger()} API now returns the root logger when passed
the name @code{'root'}, whereas previously it returned a non-root logger named
@code{'root'}. This could affect cases where user code explicitly wants a
non-root logger named @code{'root'}, or instantiates a logger using
@code{logging.getLogger(__name__)} in some top-level module called @code{'root.py'}.
(Contributed by Vinay Sajip in bpo-37742@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37742}.)

@item 
Division handling of @ref{6ce,,PurePath} now returns @ref{1a3,,NotImplemented}
instead of raising a @ref{199,,TypeError} when passed something other than an
instance of @code{str} or @code{PurePath}.  This allows creating
compatible classes that don’t inherit from those mentioned types.
(Contributed by Roger Aiudi in bpo-34775@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34775}).

@item 
Starting with Python 3.9.5 the @ref{84,,ipaddress} module no longer
accepts any leading zeros in IPv4 address strings. Leading zeros are
ambiguous and interpreted as octal notation by some libraries. For example
the legacy function @ref{b60,,socket.inet_aton()} treats leading zeros as octal
notatation. glibc implementation of modern @ref{b61,,inet_pton()} does
not accept any leading zeros.
(Contributed by Christian Heimes in bpo-36384@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36384}).

@item 
@ref{b62,,codecs.lookup()} now normalizes the encoding name the same way as
@ref{a03,,encodings.normalize_encoding()}, except that @code{codecs.lookup()} also
converts the name to lower case. For example, @code{"latex+latin1"} encoding
name is now normalized to @code{"latex_latin1"}.
(Contributed by Jordon Xu in bpo-37751@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37751}.)
@end itemize

@node Changes in the C API<4>,CPython bytecode changes<5>,Changes in the Python API<5>,Porting to Python 3 9
@anchor{whatsnew/3 9 changes-in-the-c-api}@anchor{b63}
@subsubsection Changes in the C API



@itemize *

@item 
Instances of @ref{b64,,heap-allocated types} (such as those created with
@ref{79e,,PyType_FromSpec()} and similar APIs) hold a reference to their type
object since Python 3.8. As indicated in the “Changes in the C API” of Python
3.8, for the vast majority of cases, there should be no side effect but for
types that have a custom @ref{987,,tp_traverse} function,
ensure that all custom @code{tp_traverse} functions of heap-allocated types
visit the object’s type.

@quotation

Example:

@example
int
foo_traverse(PyObject *self, visitproc visit, void *arg)
@{
// Rest of the traverse function
#if PY_VERSION_HEX >= 0x03090000
    // This was not needed before Python 3.9 (Python issue 35810 and 40217)
    Py_VISIT(Py_TYPE(self));
#endif
@}
@end example
@end quotation

If your traverse function delegates to @code{tp_traverse} of its base class
(or another type), ensure that @code{Py_TYPE(self)} is visited only once.
Note that only @ref{b64,,heap type} are expected to visit the type
in @code{tp_traverse}.

@quotation

For example, if your @code{tp_traverse} function includes:

@example
base->tp_traverse(self, visit, arg)
@end example

then add:

@example
#if PY_VERSION_HEX >= 0x03090000
    // This was not needed before Python 3.9 (bpo-35810 and bpo-40217)
    if (base->tp_flags & Py_TPFLAGS_HEAPTYPE) @{
        // a heap type's tp_traverse already visited Py_TYPE(self)
    @} else @{
        Py_VISIT(Py_TYPE(self));
    @}
#else
@end example
@end quotation

(See bpo-35810@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35810} and bpo-40217@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40217} for more information.)

@item 
The functions @code{PyEval_CallObject}, @code{PyEval_CallFunction},
@code{PyEval_CallMethod} and @code{PyEval_CallObjectWithKeywords} are deprecated.
Use @ref{63d,,PyObject_Call()} and its variants instead.
(See more details in bpo-29548@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29548}.)
@end itemize

@node CPython bytecode changes<5>,,Changes in the C API<4>,Porting to Python 3 9
@anchor{whatsnew/3 9 cpython-bytecode-changes}@anchor{b65}
@subsubsection CPython bytecode changes



@itemize *

@item 
The @code{LOAD_ASSERTION_ERROR} opcode was added for handling the
@ref{b66,,assert} statement. Previously, the assert statement would not work
correctly if the @ref{8ba,,AssertionError} exception was being shadowed.
(Contributed by Zackery Spytz in bpo-34880@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34880}.)

@item 
The @ref{b67,,COMPARE_OP} opcode was split into four distinct instructions:


@itemize *

@item 
@code{COMPARE_OP} for rich comparisons

@item 
@code{IS_OP} for ‘is’ and ‘is not’ tests

@item 
@code{CONTAINS_OP} for ‘in’ and ‘not in’ tests

@item 
@code{JUMP_IF_NOT_EXC_MATCH} for checking exceptions in ‘try-except’
statements.
@end itemize

(Contributed by Mark Shannon in bpo-39156@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39156}.)
@end itemize

@node Build Changes<5>,C API Changes<5>,Porting to Python 3 9,What’s New In Python 3 9
@anchor{whatsnew/3 9 build-changes}@anchor{b68}
@subsection Build Changes



@itemize *

@item 
Added @code{--with-platlibdir} option to the @code{configure} script: name of the
platform-specific library directory, stored in the new @ref{b38,,sys.platlibdir}
attribute. See @code{sys.platlibdir} attribute for more information.
(Contributed by Jan Matějek, Matěj Cepl, Charalampos Stratakis
and Victor Stinner in bpo-1294959@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1294959}.)

@item 
The @code{COUNT_ALLOCS} special build macro has been removed.
(Contributed by Victor Stinner in bpo-39489@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39489}.)

@item 
On non-Windows platforms, the @code{setenv()} and @code{unsetenv()}
functions are now required to build Python.
(Contributed by Victor Stinner in bpo-39395@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39395}.)

@item 
On non-Windows platforms, creating @code{bdist_wininst} installers is now
officially unsupported.  (See bpo-10945@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10945} for more details.)

@item 
When building Python on macOS from source, @code{_tkinter} now links with
non-system Tcl and Tk frameworks if they are installed in
@code{/Library/Frameworks}, as had been the case on older releases
of macOS. If a macOS SDK is explicitly configured, by using
@ref{b69,,--enable-universalsdk} or @code{-isysroot}, only the SDK itself is
searched. The default behavior can still be overridden with
@code{--with-tcltk-includes} and @code{--with-tcltk-libs}.
(Contributed by Ned Deily in bpo-34956@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34956}.)

@item 
Python can now be built for Windows 10 ARM64.
(Contributed by Steve Dower in bpo-33125@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33125}.)

@item 
Some individual tests are now skipped when @code{--pgo} is used.  The tests
in question increased the PGO task time significantly and likely
didn’t help improve optimization of the final executable. This
speeds up the task by a factor of about 15x.  Running the full unit test
suite is slow.  This change may result in a slightly less optimized build
since not as many code branches will be executed.  If you are willing to
wait for the much slower build, the old behavior can be restored using
@code{./configure [..] PROFILE_TASK="-m test --pgo-extended"}.  We make no
guarantees as to which PGO task set produces a faster build.  Users who care
should run their own relevant benchmarks as results can depend on the
environment, workload, and compiler tool chain.
(See bpo-36044@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36044} and bpo-37707@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37707} for more details.)
@end itemize

@node C API Changes<5>,Notable changes in Python 3 9 1,Build Changes<5>,What’s New In Python 3 9
@anchor{whatsnew/3 9 c-api-changes}@anchor{b6a}
@subsection C API Changes


@menu
* New Features: New Features<10>. 
* Porting to Python 3.9: Porting to Python 3 9<2>. 
* Removed: Removed<9>. 

@end menu

@node New Features<10>,Porting to Python 3 9<2>,,C API Changes<5>
@anchor{whatsnew/3 9 id1}@anchor{b6b}
@subsubsection New Features



@itemize *

@item 
@geindex Python Enhancement Proposals; PEP 573
PEP 573@footnote{https://peps.python.org/pep-0573/}: Added @ref{774,,PyType_FromModuleAndSpec()} to associate
a module with a class; @ref{b6c,,PyType_GetModule()} and
@ref{b6d,,PyType_GetModuleState()} to retrieve the module and its state; and
@ref{96d,,PyCMethod} and @ref{b6e,,METH_METHOD} to allow a method to
access the class it was defined in.
(Contributed by Marcel Plch and Petr Viktorin in bpo-38787@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38787}.)

@item 
Added @ref{992,,PyFrame_GetCode()} function: get a frame code.
Added @ref{98e,,PyFrame_GetBack()} function: get the frame next outer frame.
(Contributed by Victor Stinner in bpo-40421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40421}.)

@item 
Added @ref{993,,PyFrame_GetLineNumber()} to the limited C API.
(Contributed by Victor Stinner in bpo-40421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40421}.)

@item 
Added @ref{b6f,,PyThreadState_GetInterpreter()} and
@ref{64c,,PyInterpreterState_Get()} functions to get the interpreter.
Added @ref{996,,PyThreadState_GetFrame()} function to get the current frame of a
Python thread state.
Added @ref{b70,,PyThreadState_GetID()} function: get the unique identifier of a
Python thread state.
(Contributed by Victor Stinner in bpo-39947@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39947}.)

@item 
Added a new public @ref{63c,,PyObject_CallNoArgs()} function to the C API, which
calls a callable Python object without any arguments. It is the most efficient
way to call a callable Python object without any argument.
(Contributed by Victor Stinner in bpo-37194@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37194}.)

@item 
Changes in the limited C API (if @code{Py_LIMITED_API} macro is defined):


@itemize *

@item 
Provide @ref{3d0,,Py_EnterRecursiveCall()} and @ref{b71,,Py_LeaveRecursiveCall()}
as regular functions for the limited API. Previously, there were defined as
macros, but these macros didn’t compile with the limited C API which cannot
access @code{PyThreadState.recursion_depth} field (the structure is opaque in
the limited C API).

@item 
@code{PyObject_INIT()} and @code{PyObject_INIT_VAR()} become regular “opaque”
function to hide implementation details.
@end itemize

(Contributed by Victor Stinner in bpo-38644@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38644} and bpo-39542@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39542}.)

@item 
The @ref{b72,,PyModule_AddType()} function is added to help adding a type
to a module.
(Contributed by Donghee Na in bpo-40024@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40024}.)

@item 
Added the functions @ref{b73,,PyObject_GC_IsTracked()} and
@ref{b74,,PyObject_GC_IsFinalized()} to the public API to allow to query if
Python objects are being currently tracked or have been already finalized by
the garbage collector respectively.
(Contributed by Pablo Galindo Salgado in bpo-40241@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40241}.)

@item 
Added @code{_PyObject_FunctionStr()} to get a user-friendly string
representation of a function-like object.
(Patch by Jeroen Demeyer in bpo-37645@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37645}.)

@item 
Added @ref{b75,,PyObject_CallOneArg()} for calling an object with one
positional argument
(Patch by Jeroen Demeyer in bpo-37483@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37483}.)
@end itemize

@node Porting to Python 3 9<2>,Removed<9>,New Features<10>,C API Changes<5>
@anchor{whatsnew/3 9 id2}@anchor{b76}
@subsubsection Porting to Python 3.9



@itemize *

@item 
@code{PyInterpreterState.eval_frame} (
@geindex Python Enhancement Proposals; PEP 523
PEP 523@footnote{https://peps.python.org/pep-0523/}) now requires a new mandatory
`tstate' parameter (@code{PyThreadState*}).
(Contributed by Victor Stinner in bpo-38500@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38500}.)

@item 
Extension modules: @ref{b77,,m_traverse},
@ref{b78,,m_clear} and @ref{b79,,m_free}
functions of @ref{b7a,,PyModuleDef} are no longer called if the module state
was requested but is not allocated yet. This is the case immediately after
the module is created and before the module is executed
(@ref{b7b,,Py_mod_exec} function). More precisely, these functions are not called
if @ref{b7c,,m_size} is greater than 0 and the module state (as
returned by @ref{b7d,,PyModule_GetState()}) is @code{NULL}.

Extension modules without module state (@code{m_size <= 0}) are not affected.

@item 
If @ref{b7e,,Py_AddPendingCall()} is called in a subinterpreter, the function is
now scheduled to be called from the subinterpreter, rather than being called
from the main interpreter. Each subinterpreter now has its own list of
scheduled calls.
(Contributed by Victor Stinner in bpo-39984@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39984}.)

@item 
The Windows registry is no longer used to initialize @ref{3e2,,sys.path} when
the @code{-E} option is used (if @ref{409,,PyConfig.use_environment} is set to
@code{0}). This is significant when embedding Python on Windows.
(Contributed by Zackery Spytz in bpo-8901@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8901}.)

@item 
The global variable @ref{b7f,,PyStructSequence_UnnamedField} is now a constant
and refers to a constant string.
(Contributed by Serhiy Storchaka in bpo-38650@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38650}.)

@item 
The @code{PyGC_Head} structure is now opaque. It is only defined in the
internal C API (@code{pycore_gc.h}).
(Contributed by Victor Stinner in bpo-40241@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40241}.)

@item 
The @code{Py_UNICODE_COPY}, @code{Py_UNICODE_FILL}, @code{PyUnicode_WSTR_LENGTH},
@code{PyUnicode_FromUnicode()}, @code{PyUnicode_AsUnicode()},
@code{_PyUnicode_AsUnicode}, and @code{PyUnicode_AsUnicodeAndSize()} are
marked as deprecated in C.  They have been deprecated by 
@geindex Python Enhancement Proposals; PEP 393
PEP 393@footnote{https://peps.python.org/pep-0393/} since
Python 3.3.
(Contributed by Inada Naoki in bpo-36346@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36346}.)

@item 
The @ref{b80,,Py_FatalError()} function is replaced with a macro which logs
automatically the name of the current function, unless the
@code{Py_LIMITED_API} macro is defined.
(Contributed by Victor Stinner in bpo-39882@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39882}.)

@item 
The vectorcall protocol now requires that the caller passes only strings as
keyword names. (See bpo-37540@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37540} for more information.)

@item 
Implementation details of a number of macros and functions are now hidden:


@itemize *

@item 
@ref{b81,,PyObject_IS_GC()} macro was converted to a function.

@item 
The @code{PyObject_NEW()} macro becomes an alias to the
@ref{b82,,PyObject_New} macro, and the @code{PyObject_NEW_VAR()} macro
becomes an alias to the @ref{b83,,PyObject_NewVar} macro. They no longer
access directly the @ref{b84,,PyTypeObject.tp_basicsize} member.

@item 
@code{PyObject_GET_WEAKREFS_LISTPTR()} macro was converted to a function:
the macro accessed directly the @ref{b85,,PyTypeObject.tp_weaklistoffset}
member.

@item 
@ref{639,,PyObject_CheckBuffer()} macro was converted to a function: the macro
accessed directly the @ref{b86,,PyTypeObject.tp_as_buffer} member.

@item 
@ref{b87,,PyIndex_Check()} is now always declared as an opaque function to hide
implementation details: removed the @code{PyIndex_Check()} macro. The macro accessed
directly the @ref{b88,,PyTypeObject.tp_as_number} member.
@end itemize

(See bpo-40170@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40170} for more details.)
@end itemize

@node Removed<9>,,Porting to Python 3 9<2>,C API Changes<5>
@anchor{whatsnew/3 9 id3}@anchor{b89}
@subsubsection Removed



@itemize *

@item 
Excluded @code{PyFPE_START_PROTECT()} and @code{PyFPE_END_PROTECT()} macros of
@code{pyfpe.h} from the limited C API.
(Contributed by Victor Stinner in bpo-38835@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38835}.)

@item 
The @code{tp_print} slot of @ref{b8a,,PyTypeObject} has been removed.
It was used for printing objects to files in Python 2.7 and before. Since
Python 3.0, it has been ignored and unused.
(Contributed by Jeroen Demeyer in bpo-36974@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36974}.)

@item 
Changes in the limited C API (if @code{Py_LIMITED_API} macro is defined):


@itemize *

@item 
Excluded the following functions from the limited C API:


@itemize *

@item 
@code{PyThreadState_DeleteCurrent()}
(Contributed by Joannah Nanjekye in bpo-37878@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37878}.)

@item 
@code{_Py_CheckRecursionLimit}

@item 
@code{_Py_NewReference()}

@item 
@code{_Py_ForgetReference()}

@item 
@code{_PyTraceMalloc_NewReference()}

@item 
@code{_Py_GetRefTotal()}

@item 
The trashcan mechanism which never worked in the limited C API.

@item 
@code{PyTrash_UNWIND_LEVEL}

@item 
@code{Py_TRASHCAN_BEGIN_CONDITION}

@item 
@code{Py_TRASHCAN_BEGIN}

@item 
@code{Py_TRASHCAN_END}

@item 
@code{Py_TRASHCAN_SAFE_BEGIN}

@item 
@code{Py_TRASHCAN_SAFE_END}
@end itemize

@item 
Moved following functions and definitions to the internal C API:


@itemize *

@item 
@code{_PyDebug_PrintTotalRefs()}

@item 
@code{_Py_PrintReferences()}

@item 
@code{_Py_PrintReferenceAddresses()}

@item 
@code{_Py_tracemalloc_config}

@item 
@code{_Py_AddToAllObjects()} (specific to @code{Py_TRACE_REFS} build)
@end itemize
@end itemize

(Contributed by Victor Stinner in bpo-38644@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38644} and bpo-39542@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39542}.)

@item 
Removed @code{_PyRuntime.getframe} hook and removed @code{_PyThreadState_GetFrame}
macro which was an alias to @code{_PyRuntime.getframe}. They were only exposed
by the internal C API. Removed also @code{PyThreadFrameGetter} type.
(Contributed by Victor Stinner in bpo-39946@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39946}.)

@item 
Removed the following functions from the C API. Call @ref{b8b,,PyGC_Collect()}
explicitly to clear all free lists.
(Contributed by Inada Naoki and Victor Stinner in bpo-37340@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37340},
bpo-38896@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38896} and bpo-40428@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40428}.)


@itemize *

@item 
@code{PyAsyncGen_ClearFreeLists()}

@item 
@code{PyContext_ClearFreeList()}

@item 
@code{PyDict_ClearFreeList()}

@item 
@code{PyFloat_ClearFreeList()}

@item 
@code{PyFrame_ClearFreeList()}

@item 
@code{PyList_ClearFreeList()}

@item 
@code{PyMethod_ClearFreeList()} and @code{PyCFunction_ClearFreeList()}:
the free lists of bound method objects have been removed.

@item 
@code{PySet_ClearFreeList()}: the set free list has been removed
in Python 3.4.

@item 
@code{PyTuple_ClearFreeList()}

@item 
@code{PyUnicode_ClearFreeList()}: the Unicode free list has been removed in
Python 3.3.
@end itemize

@item 
Removed @code{_PyUnicode_ClearStaticStrings()} function.
(Contributed by Victor Stinner in bpo-39465@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39465}.)

@item 
Removed @code{Py_UNICODE_MATCH}. It has been deprecated by 
@geindex Python Enhancement Proposals; PEP 393
PEP 393@footnote{https://peps.python.org/pep-0393/}, and
broken since Python 3.3. The @ref{abb,,PyUnicode_Tailmatch()} function can be
used instead.
(Contributed by Inada Naoki in bpo-36346@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36346}.)

@item 
Cleaned header files of interfaces defined but with no implementation.
The public API symbols being removed are:
@code{_PyBytes_InsertThousandsGroupingLocale},
@code{_PyBytes_InsertThousandsGrouping}, @code{_Py_InitializeFromArgs},
@code{_Py_InitializeFromWideArgs}, @code{_PyFloat_Repr}, @code{_PyFloat_Digits},
@code{_PyFloat_DigitsInit}, @code{PyFrame_ExtendStack}, @code{_PyAIterWrapper_Type},
@code{PyNullImporter_Type}, @code{PyCmpWrapper_Type}, @code{PySortWrapper_Type},
@code{PyNoArgsFunction}.
(Contributed by Pablo Galindo Salgado in bpo-39372@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39372}.)
@end itemize

@node Notable changes in Python 3 9 1,Notable changes in Python 3 9 2,C API Changes<5>,What’s New In Python 3 9
@anchor{whatsnew/3 9 notable-changes-in-python-3-9-1}@anchor{b8c}
@subsection Notable changes in Python 3.9.1


@menu
* typing: typing<8>. 
* macOS 11.0 (Big Sur) and Apple Silicon Mac support: macOS 11 0 Big Sur and Apple Silicon Mac support. 

@end menu

@node typing<8>,macOS 11 0 Big Sur and Apple Silicon Mac support,,Notable changes in Python 3 9 1
@anchor{whatsnew/3 9 id4}@anchor{b8d}
@subsubsection typing


The behavior of @ref{a5b,,typing.Literal} was changed to conform with 
@geindex Python Enhancement Proposals; PEP 586
PEP 586@footnote{https://peps.python.org/pep-0586/}
and to match the behavior of static type checkers specified in the PEP.


@enumerate 

@item 
@code{Literal} now de-duplicates parameters.

@item 
Equality comparisons between @code{Literal} objects are now order independent.

@item 
@code{Literal} comparisons now respect types.  For example,
@code{Literal[0] == Literal[False]} previously evaluated to @code{True}.  It is
now @code{False}.  To support this change, the internally used type cache now
supports differentiating types.

@item 
@code{Literal} objects will now raise a @ref{199,,TypeError} exception during
equality comparisons if any of their parameters are not @ref{825,,hashable}.
Note that declaring @code{Literal} with mutable parameters will not throw
an error:

@example
>>> from typing import Literal
>>> Literal[@{0@}]
>>> Literal[@{0@}] == Literal[@{False@}]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'set'
@end example
@end enumerate

(Contributed by Yurii Karabas in bpo-42345@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42345}.)

@node macOS 11 0 Big Sur and Apple Silicon Mac support,,typing<8>,Notable changes in Python 3 9 1
@anchor{whatsnew/3 9 macos-11-0-big-sur-and-apple-silicon-mac-support}@anchor{b8e}
@subsubsection macOS 11.0 (Big Sur) and Apple Silicon Mac support


As of 3.9.1, Python now fully supports building and running on macOS 11.0
(Big Sur) and on Apple Silicon Macs (based on the @code{ARM64} architecture).
A new universal build variant, @code{universal2}, is now available to natively
support both @code{ARM64} and @code{Intel 64} in one set of executables. Binaries
can also now be built on current versions of macOS to be deployed on a range
of older macOS versions (tested to 10.9) while making some newer OS
functions and options conditionally available based on the operating system
version in use at runtime (“weaklinking”).

(Contributed by Ronald Oussoren and Lawrence D’Anna in bpo-41100@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41100}.)

@node Notable changes in Python 3 9 2,Notable changes in Python 3 9 3,Notable changes in Python 3 9 1,What’s New In Python 3 9
@anchor{whatsnew/3 9 notable-changes-in-python-3-9-2}@anchor{b8f}
@subsection Notable changes in Python 3.9.2


@menu
* collections.abc: collections abc<2>. 
* urllib.parse: urllib parse<2>. 

@end menu

@node collections abc<2>,urllib parse<2>,,Notable changes in Python 3 9 2
@anchor{whatsnew/3 9 collections-abc}@anchor{b90}
@subsubsection collections.abc


@ref{9f1,,collections.abc.Callable} generic now flattens type parameters, similar
to what @ref{9ce,,typing.Callable} currently does.  This means that
@code{collections.abc.Callable[[int, str], str]} will have @code{__args__} of
@code{(int, str, str)}; previously this was @code{([int, str], str)}.  To allow this
change, @ref{9f2,,types.GenericAlias} can now be subclassed, and a subclass will
be returned when subscripting the @code{collections.abc.Callable} type.
Code which accesses the arguments via @ref{2ae,,typing.get_args()} or @code{__args__}
need to account for this change.  A @ref{1a4,,DeprecationWarning} may be emitted for
invalid forms of parameterizing @code{collections.abc.Callable} which may have
passed silently in Python 3.9.1.  This @code{DeprecationWarning} will
become a @ref{199,,TypeError} in Python 3.10.
(Contributed by Ken Jin in bpo-42195@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42195}.)

@node urllib parse<2>,,collections abc<2>,Notable changes in Python 3 9 2
@anchor{whatsnew/3 9 urllib-parse}@anchor{b91}
@subsubsection urllib.parse


Earlier Python versions allowed using both @code{;} and @code{&} as
query parameter separators in @ref{321,,urllib.parse.parse_qs()} and
@ref{320,,urllib.parse.parse_qsl()}.  Due to security concerns, and to conform with
newer W3C recommendations, this has been changed to allow only a single
separator key, with @code{&} as the default.  This change also affects
@code{cgi.parse()} and @code{cgi.parse_multipart()} as they use the affected
functions internally. For more details, please see their respective
documentation.
(Contributed by Adam Goldschmidt, Senthil Kumaran and Ken Jin in bpo-42967@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42967}.)

@node Notable changes in Python 3 9 3,Notable changes in Python 3 9 5,Notable changes in Python 3 9 2,What’s New In Python 3 9
@anchor{whatsnew/3 9 notable-changes-in-python-3-9-3}@anchor{b92}
@subsection Notable changes in Python 3.9.3


A security fix alters the @ref{afc,,ftplib.FTP} behavior to not trust the
IPv4 address sent from the remote server when setting up a passive data
channel.  We reuse the ftp server IP address instead.  For unusual code
requiring the old behavior, set a @code{trust_server_pasv_ipv4_address}
attribute on your FTP instance to @code{True}.  (See gh-87451@footnote{https://github.com/python/cpython/issues/87451})

@node Notable changes in Python 3 9 5,Notable security feature in 3 9 14,Notable changes in Python 3 9 3,What’s New In Python 3 9
@anchor{whatsnew/3 9 notable-changes-in-python-3-9-5}@anchor{b93}
@subsection Notable changes in Python 3.9.5


@menu
* urllib.parse: urllib parse<3>. 

@end menu

@node urllib parse<3>,,,Notable changes in Python 3 9 5
@anchor{whatsnew/3 9 id5}@anchor{b94}
@subsubsection urllib.parse


The presence of newline or tab characters in parts of a URL allows for some
forms of attacks. Following the WHATWG specification that updates 
@geindex RFC; RFC 3986
RFC 3986@footnote{https://datatracker.ietf.org/doc/html/rfc3986.html},
ASCII newline @code{\n}, @code{\r} and tab @code{\t} characters are stripped from the
URL by the parser in @ref{111,,urllib.parse} preventing such attacks. The removal
characters are controlled by a new module level variable
@code{urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE}. (See gh-88048@footnote{https://github.com/python/cpython/issues/88048})

@node Notable security feature in 3 9 14,Notable changes in 3 9 17,Notable changes in Python 3 9 5,What’s New In Python 3 9
@anchor{whatsnew/3 9 notable-security-feature-in-3-9-14}@anchor{b95}
@subsection Notable security feature in 3.9.14


Converting between @ref{19c,,int} and @ref{16a,,str} in bases other than 2
(binary), 4, 8 (octal), 16 (hexadecimal), or 32 such as base 10 (decimal)
now raises a @ref{2ee,,ValueError} if the number of digits in string form is
above a limit to avoid potential denial of service attacks due to the
algorithmic complexity. This is a mitigation for 
@geindex Common Vulnerabilities and Exposures; CVE 2020-10735
CVE 2020-10735@footnote{https://www.cve.org/CVERecord?id=CVE-2020-10735}.
This limit can be configured or disabled by environment variable, command
line flag, or @ref{df,,sys} APIs. See the @ref{80c,,integer string conversion length limitation} documentation.  The default limit
is 4300 digits in string form.

@node Notable changes in 3 9 17,,Notable security feature in 3 9 14,What’s New In Python 3 9
@anchor{whatsnew/3 9 notable-changes-in-3-9-17}@anchor{b96}
@subsection Notable changes in 3.9.17


@menu
* tarfile: tarfile<4>. 

@end menu

@node tarfile<4>,,,Notable changes in 3 9 17
@anchor{whatsnew/3 9 tarfile}@anchor{b97}
@subsubsection tarfile



@itemize *

@item 
The extraction methods in @ref{e4,,tarfile}, and @ref{697,,shutil.unpack_archive()},
have a new a `filter' argument that allows limiting tar features than may be
surprising or dangerous, such as creating files outside the destination
directory.
See @ref{698,,Extraction filters} for details.
In Python 3.12, use without the `filter' argument will show a
@ref{1a4,,DeprecationWarning}.
In Python 3.14, the default will switch to @code{'data'}.
(Contributed by Petr Viktorin in 
@geindex Python Enhancement Proposals; PEP 706
PEP 706@footnote{https://peps.python.org/pep-0706/}.)
@end itemize

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node What’s New In Python 3 8,What’s New In Python 3 7,What’s New In Python 3 9,What’s New in Python
@anchor{whatsnew/3 8 doc}@anchor{b98}@anchor{whatsnew/3 8 translation-repo}@anchor{b99}@anchor{whatsnew/3 8 what-s-new-in-python-3-8}@anchor{b9a}
@section What’s New In Python 3.8


@c Rules for maintenance:
@c 
@c * Anyone can add text to this document.  Do not spend very much time
@c on the wording of your changes, because your text will probably
@c get rewritten to some degree.
@c 
@c * The maintainer will go through Misc/NEWS periodically and add
@c changes; it's therefore more important to add your changes to
@c Misc/NEWS than to this file.
@c 
@c * This is not a complete list of every single change; completeness
@c is the purpose of Misc/NEWS.  Some changes I consider too small
@c or esoteric to include.  If such a change is added to the text,
@c I'll just remove it.  (This is another reason you shouldn't spend
@c too much time on writing your addition.)
@c 
@c * If you want to draw your new text to the attention of the
@c maintainer, add 'XXX' to the beginning of the paragraph or
@c section.
@c 
@c * It's OK to just add a fragmentary note about a change.  For
@c example: "XXX Describe the transmogrify() function added to the
@c socket module."  The maintainer will research the change and
@c write the necessary text.
@c 
@c * You can comment out your additions if you like, but it's not
@c necessary (especially when a final release is some months away).
@c 
@c * Credit the author of a patch or bugfix.   Just the name is
@c sufficient; the e-mail address isn't necessary.
@c 
@c * It's helpful to add the bug/patch number as a comment:
@c 
@c XXX Describe the transmogrify() function added to the socket
@c module.
@c (Contributed by P.Y. Developer in :issue:`12345`.)
@c 
@c This saves the maintainer the effort of going through the Git log
@c when researching a change.

@*Editor: 
Raymond Hettinger


This article explains the new features in Python 3.8, compared to 3.7.
Python 3.8 was released on October 14, 2019.
For full details, see the @ref{143,,changelog}.

@c from math import cos, radians
@c from unicodedata import normalize
@c import re
@c import math

@menu
* Summary – Release highlights: Summary – Release highlights<6>. 
* New Features: New Features<11>. 
* Other Language Changes: Other Language Changes<6>. 
* New Modules: New Modules<6>. 
* Improved Modules: Improved Modules<6>. 
* Optimizations: Optimizations<7>. 
* Build and C API Changes:: 
* Deprecated: Deprecated<9>. 
* API and Feature Removals:: 
* Porting to Python 3.8: Porting to Python 3 8. 
* Notable changes in Python 3.8.1: Notable changes in Python 3 8 1. 
* Notable changes in Python 3.8.2: Notable changes in Python 3 8 2. 
* Notable changes in Python 3.8.3: Notable changes in Python 3 8 3. 
* Notable changes in Python 3.8.8: Notable changes in Python 3 8 8. 
* Notable changes in Python 3.8.9: Notable changes in Python 3 8 9. 
* Notable changes in Python 3.8.10: Notable changes in Python 3 8 10. 
* Notable changes in Python 3.8.10: Notable changes in Python 3 8 10<2>. 
* Notable changes in Python 3.8.12: Notable changes in Python 3 8 12. 
* Notable security feature in 3.8.14: Notable security feature in 3 8 14. 
* Notable changes in 3.8.17: Notable changes in 3 8 17. 

@end menu

@node Summary – Release highlights<6>,New Features<11>,,What’s New In Python 3 8
@anchor{whatsnew/3 8 summary-release-highlights}@anchor{b9b}
@subsection Summary – Release highlights


@c This section singles out the most important changes in Python 3.8.
@c Brevity is key.

@c PEP-sized items next.

@node New Features<11>,Other Language Changes<6>,Summary – Release highlights<6>,What’s New In Python 3 8
@anchor{whatsnew/3 8 new-features}@anchor{b9c}
@subsection New Features


@menu
* Assignment expressions:: 
* Positional-only parameters:: 
* Parallel filesystem cache for compiled bytecode files:: 
* Debug build uses the same ABI as release build:: 
* f-strings support = for self-documenting expressions and debugging:: 
* PEP 578; Python Runtime Audit Hooks: PEP 578 Python Runtime Audit Hooks. 
* PEP 587; Python Initialization Configuration: PEP 587 Python Initialization Configuration. 
* PEP 590; Vectorcall; a fast calling protocol for CPython: PEP 590 Vectorcall a fast calling protocol for CPython. 
* Pickle protocol 5 with out-of-band data buffers:: 

@end menu

@node Assignment expressions,Positional-only parameters,,New Features<11>
@anchor{whatsnew/3 8 assignment-expressions}@anchor{b9d}
@subsubsection Assignment expressions


There is new syntax @code{:=} that assigns values to variables as part of a larger
expression. It is affectionately known as “the walrus operator” due to
its resemblance to the eyes and tusks of a walrus@footnote{https://en.wikipedia.org/wiki/Walrus#/media/File:Pacific_Walrus_-_Bull_(8247646168).jpg}.

In this example, the assignment expression helps avoid calling
@ref{841,,len()} twice:

@example
if (n := len(a)) > 10:
    print(f"List is too long (@{n@} elements, expected <= 10)")
@end example

A similar benefit arises during regular expression matching where
match objects are needed twice, once to test whether a match
occurred and another to extract a subgroup:

@example
discount = 0.0
if (mo := re.search(r'(\d+)% discount', advertisement)):
    discount = float(mo.group(1)) / 100.0
@end example

The operator is also useful with while-loops that compute
a value to test loop termination and then need that same
value again in the body of the loop:

@example
# Loop over fixed length blocks
while (block := f.read(256)) != '@w{'}:
    process(block)
@end example

Another motivating use case arises in list comprehensions where
a value computed in a filtering condition is also needed in
the expression body:

@example
[clean_name.title() for name in names
 if (clean_name := normalize('NFC', name)) in allowed_names]
@end example

Try to limit use of the walrus operator to clean cases that reduce
complexity and improve readability.

See 
@geindex Python Enhancement Proposals; PEP 572
PEP 572@footnote{https://peps.python.org/pep-0572/} for a full description.

(Contributed by Emily Morehouse in bpo-35224@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35224}.)

@node Positional-only parameters,Parallel filesystem cache for compiled bytecode files,Assignment expressions,New Features<11>
@anchor{whatsnew/3 8 positional-only-parameters}@anchor{b9e}
@subsubsection Positional-only parameters


There is a new function parameter syntax @code{/} to indicate that some
function parameters must be specified positionally and cannot be used as
keyword arguments.  This is the same notation shown by @code{help()} for C
functions annotated with Larry Hastings’
Argument Clinic@footnote{https://devguide.python.org/development-tools/clinic/} tool.

In the following example, parameters `a' and `b' are positional-only,
while `c' or `d' can be positional or keyword, and `e' or `f' are
required to be keywords:

@example
def f(a, b, /, c, d, *, e, f):
    print(a, b, c, d, e, f)
@end example

The following is a valid call:

@example
f(10, 20, 30, d=40, e=50, f=60)
@end example

However, these are invalid calls:

@example
f(10, b=20, c=30, d=40, e=50, f=60)   # b cannot be a keyword argument
f(10, 20, 30, 40, 50, f=60)           # e must be a keyword argument
@end example

One use case for this notation is that it allows pure Python functions
to fully emulate behaviors of existing C coded functions.  For example,
the built-in @ref{b9f,,divmod()} function does not accept keyword arguments:

@example
def divmod(a, b, /):
    "Emulate the built in divmod() function"
    return (a // b, a % b)
@end example

Another use case is to preclude keyword arguments when the parameter
name is not helpful.  For example, the builtin @ref{841,,len()} function has
the signature @code{len(obj, /)}.  This precludes awkward calls such as:

@example
len(obj='hello')  # The "obj" keyword argument impairs readability
@end example

A further benefit of marking a parameter as positional-only is that it
allows the parameter name to be changed in the future without risk of
breaking client code.  For example, in the @ref{d7,,statistics} module, the
parameter name `dist' may be changed in the future.  This was made
possible with the following function specification:

@example
def quantiles(dist, /, *, n=4, method='exclusive')
    ...
@end example

Since the parameters to the left of @code{/} are not exposed as possible
keywords, the parameters names remain available for use in @code{**kwargs}:

@example
>>> def f(a, b, /, **kwargs):
...     print(a, b, kwargs)
...
>>> f(10, 20, a=1, b=2, c=3)         # a and b are used in two ways
10 20 @{'a': 1, 'b': 2, 'c': 3@}
@end example

This greatly simplifies the implementation of functions and methods
that need to accept arbitrary keyword arguments.  For example, here
is an excerpt from code in the @ref{1e,,collections} module:

@example
class Counter(dict):

    def __init__(self, iterable=None, /, **kwds):
        # Note "iterable" is a possible keyword argument
@end example

See 
@geindex Python Enhancement Proposals; PEP 570
PEP 570@footnote{https://peps.python.org/pep-0570/} for a full description.

(Contributed by Pablo Galindo in bpo-36540@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36540}.)

@c TODO: Pablo will sprint on docs at PyCon US 2019.

@node Parallel filesystem cache for compiled bytecode files,Debug build uses the same ABI as release build,Positional-only parameters,New Features<11>
@anchor{whatsnew/3 8 parallel-filesystem-cache-for-compiled-bytecode-files}@anchor{ba0}
@subsubsection Parallel filesystem cache for compiled bytecode files


The new 
@geindex PYTHONPYCACHEPREFIX
@geindex environment variable; PYTHONPYCACHEPREFIX
@ref{ba1,,PYTHONPYCACHEPREFIX} setting (also available as
@ref{170,,-X} @code{pycache_prefix}) configures the implicit bytecode
cache to use a separate parallel filesystem tree, rather than
the default @code{__pycache__} subdirectories within each source
directory.

The location of the cache is reported in @ref{ba2,,sys.pycache_prefix}
(@ref{887,,None} indicates the default location in @code{__pycache__}
subdirectories).

(Contributed by Carl Meyer in bpo-33499@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33499}.)

@node Debug build uses the same ABI as release build,f-strings support = for self-documenting expressions and debugging,Parallel filesystem cache for compiled bytecode files,New Features<11>
@anchor{whatsnew/3 8 debug-build-uses-the-same-abi-as-release-build}@anchor{ba3}
@subsubsection Debug build uses the same ABI as release build


The ABI of Python @ref{50a,,debug builds}  is now compatible with
Python release builds. On Unix, when Python is built in debug mode, it is now
possible to load C extensions built in release mode and C extensions built
using the stable ABI. The inverse is not true, as debug builds expose
additional symbols not available in release builds.

Defining the @code{Py_DEBUG} macro no longer implies the @code{Py_TRACE_REFS} macro,
which introduces the only ABI incompatibility. The @code{Py_TRACE_REFS} macro,
which adds the @ref{290,,sys.getobjects()} function and the 
@geindex PYTHONDUMPREFS
@geindex environment variable; PYTHONDUMPREFS
@ref{ba4,,PYTHONDUMPREFS}
environment variable, can be set using the new @ref{636,,./configure --with-trace-refs} build option.
(Contributed by Victor Stinner in bpo-36465@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36465}.)

On Unix, C extensions are no longer linked to libpython except on Android
and Cygwin.
It is now possible
for a statically linked Python to load a C extension built using a shared
library Python.
(Contributed by Victor Stinner in bpo-21536@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21536}.)

On Unix, when Python is built in debug mode, import now also looks for C
extensions compiled in release mode and for C extensions compiled with the
stable ABI.
(Contributed by Victor Stinner in bpo-36722@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36722}.)

To embed Python into an application, a new @code{--embed} option must be passed to
@code{python3-config --libs --embed} to get @code{-lpython3.8} (link the application
to libpython). To support both 3.8 and older, try @code{python3-config --libs
--embed} first and fallback to @code{python3-config --libs} (without @code{--embed})
if the previous command fails.

Add a pkg-config @code{python-3.8-embed} module to embed Python into an
application: @code{pkg-config python-3.8-embed --libs} includes @code{-lpython3.8}.
To support both 3.8 and older, try @code{pkg-config python-X.Y-embed --libs} first
and fallback to @code{pkg-config python-X.Y --libs} (without @code{--embed}) if the
previous command fails (replace @code{X.Y} with the Python version).

On the other hand, @code{pkg-config python3.8 --libs} no longer contains
@code{-lpython3.8}. C extensions must not be linked to libpython (except on
Android and Cygwin, whose cases are handled by the script);
this change is backward incompatible on purpose.
(Contributed by Victor Stinner in bpo-36721@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36721}.)

@node f-strings support = for self-documenting expressions and debugging,PEP 578 Python Runtime Audit Hooks,Debug build uses the same ABI as release build,New Features<11>
@anchor{whatsnew/3 8 bpo-36817-whatsnew}@anchor{ba5}@anchor{whatsnew/3 8 f-strings-support-for-self-documenting-expressions-and-debugging}@anchor{ba6}
@subsubsection f-strings support @code{=} for self-documenting expressions and debugging


Added an @code{=} specifier to @ref{66b,,f-string}s. An f-string such as
@code{f'@{expr=@}'} will expand to the text of the expression, an equal sign,
then the representation of the evaluated expression.  For example:

@example
>>> import datetime as dt
>>> user = 'eric_idle'
>>> member_since = dt.date(1975, 7, 31)
>>> f'@{user=@} @{member_since=@}'
"user='eric_idle' member_since=datetime.date(1975, 7, 31)"
@end example

The usual @ref{19b,,f-string format specifiers} allow more
control over how the result of the expression is displayed:

@example
>>> delta = dt.date.today() - member_since
>>> f'@{user=!s@}  @{delta.days=:,d@}'
'user=eric_idle  delta.days=16,075'
@end example

The @code{=} specifier will display the whole expression so that
calculations can be shown:

@example
>>> print(f'@{theta=@}  @{cos(radians(theta))=:.3f@}')
theta=30  cos(radians(theta))=0.866
@end example

(Contributed by Eric V. Smith and Larry Hastings in bpo-36817@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36817}.)

@node PEP 578 Python Runtime Audit Hooks,PEP 587 Python Initialization Configuration,f-strings support = for self-documenting expressions and debugging,New Features<11>
@anchor{whatsnew/3 8 pep-578-python-runtime-audit-hooks}@anchor{ba7}
@subsubsection PEP 578: Python Runtime Audit Hooks


The PEP adds an Audit Hook and Verified Open Hook. Both are available from
Python and native code, allowing applications and frameworks written in pure
Python code to take advantage of extra notifications, while also allowing
embedders or system administrators to deploy builds of Python where auditing is
always enabled.

See 
@geindex Python Enhancement Proposals; PEP 578
PEP 578@footnote{https://peps.python.org/pep-0578/} for full details.

@node PEP 587 Python Initialization Configuration,PEP 590 Vectorcall a fast calling protocol for CPython,PEP 578 Python Runtime Audit Hooks,New Features<11>
@anchor{whatsnew/3 8 pep-587-python-initialization-configuration}@anchor{ba8}
@subsubsection PEP 587: Python Initialization Configuration


The 
@geindex Python Enhancement Proposals; PEP 587
PEP 587@footnote{https://peps.python.org/pep-0587/} adds a new C API to configure the Python Initialization
providing finer control on the whole configuration and better error reporting.

New structures:


@itemize *

@item 
@ref{3f5,,PyConfig}

@item 
@ref{ba9,,PyPreConfig}

@item 
@ref{baa,,PyStatus}

@item 
@ref{bab,,PyWideStringList}
@end itemize

New functions:


@itemize *

@item 
@ref{bac,,PyConfig_Clear()}

@item 
@ref{bad,,PyConfig_InitIsolatedConfig()}

@item 
@ref{bae,,PyConfig_InitPythonConfig()}

@item 
@ref{998,,PyConfig_Read()}

@item 
@ref{baf,,PyConfig_SetArgv()}

@item 
@ref{bb0,,PyConfig_SetBytesArgv()}

@item 
@ref{bb1,,PyConfig_SetBytesString()}

@item 
@ref{bb2,,PyConfig_SetString()}

@item 
@ref{bb3,,PyPreConfig_InitIsolatedConfig()}

@item 
@ref{bb4,,PyPreConfig_InitPythonConfig()}

@item 
@ref{bb5,,PyStatus_Error()}

@item 
@ref{bb6,,PyStatus_Exception()}

@item 
@ref{bb7,,PyStatus_Exit()}

@item 
@ref{bb8,,PyStatus_IsError()}

@item 
@ref{bb9,,PyStatus_IsExit()}

@item 
@ref{bba,,PyStatus_NoMemory()}

@item 
@ref{bbb,,PyStatus_Ok()}

@item 
@ref{bbc,,PyWideStringList_Append()}

@item 
@ref{bbd,,PyWideStringList_Insert()}

@item 
@ref{bbe,,Py_BytesMain()}

@item 
@ref{bbf,,Py_ExitStatusException()}

@item 
@ref{3f4,,Py_InitializeFromConfig()}

@item 
@ref{41c,,Py_PreInitialize()}

@item 
@ref{bc0,,Py_PreInitializeFromArgs()}

@item 
@ref{bc1,,Py_PreInitializeFromBytesArgs()}

@item 
@ref{bc2,,Py_RunMain()}
@end itemize

This PEP also adds @code{_PyRuntimeState.preconfig} (@ref{ba9,,PyPreConfig} type)
and @code{PyInterpreterState.config} (@ref{3f5,,PyConfig} type) fields to these
internal structures. @code{PyInterpreterState.config} becomes the new
reference configuration, replacing global configuration variables and
other private variables.

See @ref{646,,Python Initialization Configuration} for the
documentation.

See 
@geindex Python Enhancement Proposals; PEP 587
PEP 587@footnote{https://peps.python.org/pep-0587/} for a full description.

(Contributed by Victor Stinner in bpo-36763@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36763}.)

@node PEP 590 Vectorcall a fast calling protocol for CPython,Pickle protocol 5 with out-of-band data buffers,PEP 587 Python Initialization Configuration,New Features<11>
@anchor{whatsnew/3 8 pep-590-vectorcall-a-fast-calling-protocol-for-cpython}@anchor{bc3}
@subsubsection PEP 590: Vectorcall: a fast calling protocol for CPython


@ref{775,,The Vectorcall Protocol} is added to the Python/C API.
It is meant to formalize existing optimizations which were already done
for various classes.
Any @ref{988,,static type} implementing a callable can use this
protocol.

This is currently provisional.
The aim is to make it fully public in Python 3.9.

See 
@geindex Python Enhancement Proposals; PEP 590
PEP 590@footnote{https://peps.python.org/pep-0590/} for a full description.

(Contributed by Jeroen Demeyer, Mark Shannon and Petr Viktorin in bpo-36974@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36974}.)

@node Pickle protocol 5 with out-of-band data buffers,,PEP 590 Vectorcall a fast calling protocol for CPython,New Features<11>
@anchor{whatsnew/3 8 pickle-protocol-5-with-out-of-band-data-buffers}@anchor{bc4}
@subsubsection Pickle protocol 5 with out-of-band data buffers


When @ref{ab,,pickle} is used to transfer large data between Python processes
in order to take advantage of multi-core or multi-machine processing,
it is important to optimize the transfer by reducing memory copies, and
possibly by applying custom techniques such as data-dependent compression.

The @ref{ab,,pickle} protocol 5 introduces support for out-of-band buffers
where 
@geindex Python Enhancement Proposals; PEP 3118
PEP 3118@footnote{https://peps.python.org/pep-3118/}-compatible data can be transmitted separately from the
main pickle stream, at the discretion of the communication layer.

See 
@geindex Python Enhancement Proposals; PEP 574
PEP 574@footnote{https://peps.python.org/pep-0574/} for a full description.

(Contributed by Antoine Pitrou in bpo-36785@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36785}.)

@node Other Language Changes<6>,New Modules<6>,New Features<11>,What’s New In Python 3 8
@anchor{whatsnew/3 8 other-language-changes}@anchor{bc5}
@subsection Other Language Changes



@itemize *

@item 
A @ref{181,,continue} statement was illegal in the @ref{1b1,,finally} clause
due to a problem with the implementation.  In Python 3.8 this restriction
was lifted.
(Contributed by Serhiy Storchaka in bpo-32489@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32489}.)

@item 
The @ref{3c1,,bool}, @ref{19c,,int}, and @ref{215,,fractions.Fraction} types
now have an @ref{bc6,,as_integer_ratio()} method like that found in
@ref{197,,float} and @ref{200,,decimal.Decimal}.  This minor API extension
makes it possible to write @code{numerator, denominator =
x.as_integer_ratio()} and have it work across multiple numeric types.
(Contributed by Lisa Roach in bpo-33073@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33073} and Raymond Hettinger in
bpo-37819@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37819}.)

@item 
Constructors of @ref{19c,,int}, @ref{197,,float} and @ref{198,,complex} will now
use the @ref{19f,,__index__()} special method, if available and the
corresponding method @ref{19e,,__int__()}, @ref{bc7,,__float__()}
or @ref{7fe,,__complex__()} is not available.
(Contributed by Serhiy Storchaka in bpo-20092@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20092}.)

@item 
Added support of @code{\N@{@var{name}@}} escapes in @ref{be,,regular expressions}:

@example
>>> notice = 'Copyright © 2019'
>>> copyright_year_pattern = re.compile(r'\N@{copyright sign@}\s*(\d@{4@})')
>>> int(copyright_year_pattern.search(notice).group(1))
2019
@end example

(Contributed by Jonathan Eunice and Serhiy Storchaka in bpo-30688@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30688}.)

@item 
Dict and dictviews are now iterable in reversed insertion order using
@ref{a6b,,reversed()}. (Contributed by Rémi Lapeyre in bpo-33462@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33462}.)

@item 
The syntax allowed for keyword names in function calls was further
restricted. In particular, @code{f((keyword)=arg)} is no longer allowed. It was
never intended to permit more than a bare name on the left-hand side of a
keyword argument assignment term.
(Contributed by Benjamin Peterson in bpo-34641@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34641}.)

@item 
Generalized iterable unpacking in @ref{bc8,,yield} and
@ref{1b0,,return} statements no longer requires enclosing parentheses.
This brings the `yield' and `return' syntax into better agreement with
normal assignment syntax:

@example
>>> def parse(family):
...     lastname, *members = family.split()
...     return lastname.upper(), *members
...
>>> parse('simpsons homer marge bart lisa maggie')
('SIMPSONS', 'homer', 'marge', 'bart', 'lisa', 'maggie')
@end example

(Contributed by David Cuthbert and Jordan Chapman in bpo-32117@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32117}.)

@item 
When a comma is missed in code such as @code{[(10, 20) (30, 40)]}, the
compiler displays a @ref{1af,,SyntaxWarning} with a helpful suggestion.
This improves on just having a @ref{199,,TypeError} indicating that the
first tuple was not callable.  (Contributed by Serhiy Storchaka in
bpo-15248@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15248}.)

@item 
Arithmetic operations between subclasses of @ref{1fc,,datetime.date} or
@ref{4e3,,datetime.datetime} and @ref{bc9,,datetime.timedelta} objects now return
an instance of the subclass, rather than the base class. This also affects
the return type of operations whose implementation (directly or indirectly)
uses @code{datetime.timedelta} arithmetic, such as
@ref{bca,,astimezone()}.
(Contributed by Paul Ganssle in bpo-32417@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32417}.)

@item 
When the Python interpreter is interrupted by Ctrl-C (SIGINT) and the
resulting @ref{bcb,,KeyboardInterrupt} exception is not caught, the Python process
now exits via a SIGINT signal or with the correct exit code such that the
calling process can detect that it died due to a Ctrl-C.  Shells on POSIX
and Windows use this to properly terminate scripts in interactive sessions.
(Contributed by Google via Gregory P. Smith in bpo-1054041@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1054041}.)

@item 
Some advanced styles of programming require updating the
@ref{32d,,types.CodeType} object for an existing function.  Since code
objects are immutable, a new code object needs to be created, one
that is modeled on the existing code object.  With 19 parameters,
this was somewhat tedious.  Now, the new @code{replace()} method makes
it possible to create a clone with a few altered parameters.

Here’s an example that alters the @ref{8e3,,statistics.mean()} function to
prevent the `data' parameter from being used as a keyword argument:

@example
>>> from statistics import mean
>>> mean(data=[10, 20, 90])
40
>>> mean.__code__ = mean.__code__.replace(co_posonlyargcount=1)
>>> mean(data=[10, 20, 90])
Traceback (most recent call last):
  ...
TypeError: mean() got some positional-only arguments passed as keyword arguments: 'data'
@end example

(Contributed by Victor Stinner in bpo-37032@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37032}.)

@item 
For integers, the three-argument form of the @ref{1a5,,pow()} function now
permits the exponent to be negative in the case where the base is
relatively prime to the modulus. It then computes a modular inverse to
the base when the exponent is @code{-1}, and a suitable power of that
inverse for other negative exponents.  For example, to compute the
modular multiplicative inverse@footnote{https://en.wikipedia.org/wiki/Modular_multiplicative_inverse} of 38
modulo 137, write:

@example
>>> pow(38, -1, 137)
119
>>> 119 * 38 % 137
1
@end example

Modular inverses arise in the solution of linear Diophantine equations@footnote{https://en.wikipedia.org/wiki/Diophantine_equation}.
For example, to find integer solutions for @code{4258𝑥 + 147𝑦 = 369},
first rewrite as @code{4258𝑥 ≡ 369 (mod 147)} then solve:

@example
>>> x = 369 * pow(4258, -1, 147) % 147
>>> y = (4258 * x - 369) // -147
>>> 4258 * x + 147 * y
369
@end example

(Contributed by Mark Dickinson in bpo-36027@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36027}.)

@item 
Dict comprehensions have been synced-up with dict literals so that the
key is computed first and the value second:

@example
>>> # Dict comprehension
>>> cast = @{input('role? '): input('actor? ') for i in range(2)@}
role? King Arthur
actor? Chapman
role? Black Knight
actor? Cleese

>>> # Dict literal
>>> cast = @{input('role? '): input('actor? ')@}
role? Sir Robin
actor? Eric Idle
@end example

The guaranteed execution order is helpful with assignment expressions
because variables assigned in the key expression will be available in
the value expression:

@example
>>> names = ['Martin von Löwis', 'Łukasz Langa', 'Walter Dörwald']
>>> @{(n := normalize('NFC', name)).casefold() : n for name in names@}
@{'martin von löwis': 'Martin von Löwis',
 'łukasz langa': 'Łukasz Langa',
 'walter dörwald': 'Walter Dörwald'@}
@end example

(Contributed by Jörn Heissler in bpo-35224@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35224}.)

@item 
The @ref{bcc,,object.__reduce__()} method can now return a tuple from two to
six elements long. Formerly, five was the limit.  The new, optional sixth
element is a callable with a @code{(obj, state)} signature.  This allows the
direct control over the state-updating behavior of a specific object.  If
not `None', this callable will have priority over the object’s
@ref{bcd,,__setstate__()} method.
(Contributed by Pierre Glaser and Olivier Grisel in bpo-35900@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35900}.)
@end itemize

@node New Modules<6>,Improved Modules<6>,Other Language Changes<6>,What’s New In Python 3 8
@anchor{whatsnew/3 8 new-modules}@anchor{bce}
@subsection New Modules



@itemize *

@item 
The new @ref{7e,,importlib.metadata} module provides (provisional) support for
reading metadata from third-party packages.  For example, it can extract an
installed package’s version number, list of entry points, and more:

@example
>>> # Note following example requires that the popular "requests"
>>> # package has been installed.
>>>
>>> from importlib.metadata import version, requires, files
>>> version('requests')
'2.22.0'
>>> list(requires('requests'))
['chardet (<3.1.0,>=3.0.2)']
>>> list(files('requests'))[:5]
[PackagePath('requests-2.22.0.dist-info/INSTALLER'),
 PackagePath('requests-2.22.0.dist-info/LICENSE'),
 PackagePath('requests-2.22.0.dist-info/METADATA'),
 PackagePath('requests-2.22.0.dist-info/RECORD'),
 PackagePath('requests-2.22.0.dist-info/WHEEL')]
@end example

(Contributed by Barry Warsaw and Jason R. Coombs in bpo-34632@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34632}.)
@end itemize

@node Improved Modules<6>,Optimizations<7>,New Modules<6>,What’s New In Python 3 8
@anchor{whatsnew/3 8 improved-modules}@anchor{bcf}
@subsection Improved Modules


@menu
* ast: ast<5>. 
* asyncio: asyncio<9>. 
* builtins: builtins<2>. 
* collections:: 
* cProfile:: 
* csv: csv<2>. 
* curses: curses<4>. 
* ctypes: ctypes<3>. 
* datetime: datetime<4>. 
* functools: functools<3>. 
* gc: gc<5>. 
* gettext:: 
* gzip: gzip<3>. 
* IDLE and idlelib: IDLE and idlelib<4>. 
* inspect: inspect<6>. 
* io: io<5>. 
* itertools: itertools<5>. 
* json.tool: json tool. 
* logging: logging<2>. 
* math: math<6>. 
* mmap: mmap<2>. 
* multiprocessing: multiprocessing<4>. 
* os: os<7>. 
* os.path: os path<5>. 
* pathlib: pathlib<10>. 
* pickle: pickle<2>. 
* plistlib:: 
* pprint: pprint<3>. 
* py_compile: py_compile<2>. 
* shlex:: 
* shutil: shutil<4>. 
* socket: socket<5>. 
* ssl: ssl<5>. 
* statistics: statistics<4>. 
* sys: sys<7>. 
* tarfile: tarfile<5>. 
* threading: threading<5>. 
* tokenize: tokenize<2>. 
* tkinter: tkinter<5>. 
* time: time<4>. 
* typing: typing<9>. 
* unicodedata: unicodedata<6>. 
* unittest: unittest<7>. 
* venv: venv<4>. 
* weakref:: 
* xml: xml<4>. 
* xmlrpc:: 

@end menu

@node ast<5>,asyncio<9>,,Improved Modules<6>
@anchor{whatsnew/3 8 ast}@anchor{bd0}
@subsubsection ast


AST nodes now have @code{end_lineno} and @code{end_col_offset} attributes,
which give the precise location of the end of the node.  (This only
applies to nodes that have @code{lineno} and @code{col_offset} attributes.)

New function @ref{bd1,,ast.get_source_segment()} returns the source code
for a specific AST node.

(Contributed by Ivan Levkivskyi in bpo-33416@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33416}.)

The @ref{1c4,,ast.parse()} function has some new flags:


@itemize *

@item 
@code{type_comments=True} causes it to return the text of 
@geindex Python Enhancement Proposals; PEP 484
PEP 484@footnote{https://peps.python.org/pep-0484/} and
@geindex Python Enhancement Proposals; PEP 526
PEP 526@footnote{https://peps.python.org/pep-0526/} type comments associated with certain AST nodes;

@item 
@code{mode='func_type'} can be used to parse 
@geindex Python Enhancement Proposals; PEP 484
PEP 484@footnote{https://peps.python.org/pep-0484/} “signature type
comments” (returned for function definition AST nodes);

@item 
@code{feature_version=(3, N)} allows specifying an earlier Python 3
version.  For example, @code{feature_version=(3, 4)} will treat
@ref{940,,async} and @ref{18e,,await} as non-reserved words.
@end itemize

(Contributed by Guido van Rossum in bpo-35766@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35766}.)

@node asyncio<9>,builtins<2>,ast<5>,Improved Modules<6>
@anchor{whatsnew/3 8 asyncio}@anchor{bd2}
@subsubsection asyncio


@ref{2f5,,asyncio.run()} has graduated from the provisional to stable API. This
function can be used to execute a @ref{6ba,,coroutine} and return the result while
automatically managing the event loop. For example:

@example
import asyncio

async def main():
    await asyncio.sleep(0)
    return 42

asyncio.run(main())
@end example

This is `roughly' equivalent to:

@example
import asyncio

async def main():
    await asyncio.sleep(0)
    return 42

loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
try:
    loop.run_until_complete(main())
finally:
    asyncio.set_event_loop(None)
    loop.close()
@end example

The actual implementation is significantly more complex. Thus,
@ref{2f5,,asyncio.run()} should be the preferred way of running asyncio programs.

(Contributed by Yury Selivanov in bpo-32314@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32314}.)

Running @code{python -m asyncio} launches a natively async REPL.  This allows rapid
experimentation with code that has a top-level @ref{18e,,await}.  There is no
longer a need to directly call @code{asyncio.run()} which would spawn a new event
loop on every invocation:

@example
$ python -m asyncio
asyncio REPL 3.8.0
Use "await" directly instead of "asyncio.run()".
Type "help", "copyright", "credits" or "license" for more information.
>>> import asyncio
>>> await asyncio.sleep(10, result='hello')
hello
@end example

(Contributed by Yury Selivanov in bpo-37028@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37028}.)

The exception @ref{4d5,,asyncio.CancelledError} now inherits from
@ref{7d8,,BaseException} rather than @ref{bd3,,Exception} and no longer inherits
from @ref{bd4,,concurrent.futures.CancelledError}.
(Contributed by Yury Selivanov in bpo-32528@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32528}.)

On Windows, the default event loop is now @ref{81e,,ProactorEventLoop}.
(Contributed by Victor Stinner in bpo-34687@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34687}.)

@ref{81e,,ProactorEventLoop} now also supports UDP.
(Contributed by Adam Meily and Andrew Svetlov in bpo-29883@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29883}.)

@ref{81e,,ProactorEventLoop} can now be interrupted by
@ref{bcb,,KeyboardInterrupt} (“CTRL+C”).
(Contributed by Vladimir Matveev in bpo-23057@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23057}.)

Added @ref{bd5,,asyncio.Task.get_coro()} for getting the wrapped coroutine
within an @ref{1c9,,asyncio.Task}.
(Contributed by Alex Grönholm in bpo-36999@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36999}.)

Asyncio tasks can now be named, either by passing the @code{name} keyword
argument to @ref{1cb,,asyncio.create_task()} or
the @ref{1cc,,create_task()} event loop method, or by
calling the @ref{bd6,,set_name()} method on the task object. The
task name is visible in the @code{repr()} output of @ref{1c9,,asyncio.Task} and
can also be retrieved using the @ref{bd7,,get_name()} method.
(Contributed by Alex Grönholm in bpo-34270@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34270}.)

Added support for
Happy Eyeballs@footnote{https://en.wikipedia.org/wiki/Happy_Eyeballs} to
@ref{819,,asyncio.loop.create_connection()}. To specify the behavior, two new
parameters have been added: `happy_eyeballs_delay' and `interleave'. The Happy
Eyeballs algorithm improves responsiveness in applications that support IPv4
and IPv6 by attempting to simultaneously connect using both.
(Contributed by twisteroid ambassador in bpo-33530@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33530}.)

@node builtins<2>,collections,asyncio<9>,Improved Modules<6>
@anchor{whatsnew/3 8 builtins}@anchor{bd8}
@subsubsection builtins


The @ref{4b2,,compile()} built-in has been improved to accept the
@code{ast.PyCF_ALLOW_TOP_LEVEL_AWAIT} flag. With this new flag passed,
@code{compile()} will allow top-level @code{await}, @code{async for} and @code{async with}
constructs that are usually considered invalid syntax. Asynchronous code object
marked with the @code{CO_COROUTINE} flag may then be returned.
(Contributed by Matthias Bussonnier in bpo-34616@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34616})

@node collections,cProfile,builtins<2>,Improved Modules<6>
@anchor{whatsnew/3 8 collections}@anchor{bd9}
@subsubsection collections


The @ref{bda,,_asdict()} method for
@ref{4e1,,collections.namedtuple()} now returns a @ref{184,,dict} instead of a
@ref{7f4,,collections.OrderedDict}. This works because regular dicts have
guaranteed ordering since Python 3.7. If the extra features of
@code{OrderedDict} are required, the suggested remediation is to cast the
result to the desired type: @code{OrderedDict(nt._asdict())}.
(Contributed by Raymond Hettinger in bpo-35864@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35864}.)

@node cProfile,csv<2>,collections,Improved Modules<6>
@anchor{whatsnew/3 8 cprofile}
@subsubsection cProfile


The @ref{bdc,,cProfile.Profile} class can now be used as a context manager.
Profile a block of code by running:

@example
import cProfile

with cProfile.Profile() as profiler:
      # code to be profiled
      ...
@end example

(Contributed by Scott Sanderson in bpo-29235@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29235}.)

@node csv<2>,curses<4>,cProfile,Improved Modules<6>
@anchor{whatsnew/3 8 csv}@anchor{bdd}
@subsubsection csv


The @ref{bde,,csv.DictReader} now returns instances of @ref{184,,dict} instead of
a @ref{7f4,,collections.OrderedDict}.  The tool is now faster and uses less
memory while still preserving the field order.
(Contributed by Michael Selik in bpo-34003@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34003}.)

@node curses<4>,ctypes<3>,csv<2>,Improved Modules<6>
@anchor{whatsnew/3 8 curses}@anchor{bdf}
@subsubsection curses


Added a new variable holding structured version information for the
underlying ncurses library: @ref{be0,,ncurses_version}.
(Contributed by Serhiy Storchaka in bpo-31680@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31680}.)

@node ctypes<3>,datetime<4>,curses<4>,Improved Modules<6>
@anchor{whatsnew/3 8 ctypes}@anchor{be1}
@subsubsection ctypes


On Windows, @ref{be2,,CDLL} and subclasses now accept a `winmode' parameter
to specify flags for the underlying @code{LoadLibraryEx} call. The default flags are
set to only load DLL dependencies from trusted locations, including the path
where the DLL is stored (if a full or partial path is used to load the initial
DLL) and paths added by @ref{be3,,add_dll_directory()}.
(Contributed by Steve Dower in bpo-36085@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36085}.)

@node datetime<4>,functools<3>,ctypes<3>,Improved Modules<6>
@anchor{whatsnew/3 8 datetime}@anchor{be4}
@subsubsection datetime


Added new alternate constructors @ref{be5,,datetime.date.fromisocalendar()} and
@ref{be6,,datetime.datetime.fromisocalendar()}, which construct @ref{1fc,,date} and
@ref{4e3,,datetime} objects respectively from ISO year, week number, and weekday;
these are the inverse of each class’s @code{isocalendar} method.
(Contributed by Paul Ganssle in bpo-36004@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36004}.)

@node functools<3>,gc<5>,datetime<4>,Improved Modules<6>
@anchor{whatsnew/3 8 functools}@anchor{be7}
@subsubsection functools


@ref{be8,,functools.lru_cache()} can now be used as a straight decorator rather
than as a function returning a decorator.  So both of these are now supported:

@example
@@lru_cache
def f(x):
    ...

@@lru_cache(maxsize=256)
def f(x):
    ...
@end example

(Contributed by Raymond Hettinger in bpo-36772@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36772}.)

Added a new @ref{764,,functools.cached_property()} decorator, for computed properties
cached for the life of the instance.

@example
import functools
import statistics

class Dataset:
   def __init__(self, sequence_of_numbers):
      self.data = sequence_of_numbers

   @@functools.cached_property
   def variance(self):
      return statistics.variance(self.data)
@end example

(Contributed by Carl Meyer in bpo-21145@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21145})

Added a new @ref{be9,,functools.singledispatchmethod()} decorator that converts
methods into @ref{bea,,generic functions} using
@ref{beb,,single dispatch}:

@example
from functools import singledispatchmethod
from contextlib import suppress

class TaskManager:

    def __init__(self, tasks):
        self.tasks = list(tasks)

    @@singledispatchmethod
    def discard(self, value):
        with suppress(ValueError):
            self.tasks.remove(value)

    @@discard.register(list)
    def _(self, tasks):
        targets = set(tasks)
        self.tasks = [x for x in self.tasks if x not in targets]
@end example

(Contributed by Ethan Smith in bpo-32380@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32380})

@node gc<5>,gettext,functools<3>,Improved Modules<6>
@anchor{whatsnew/3 8 gc}@anchor{bec}
@subsubsection gc


@ref{a0a,,get_objects()} can now receive an optional `generation' parameter
indicating a generation to get objects from.
(Contributed by Pablo Galindo in bpo-36016@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36016}.)

@node gettext,gzip<3>,gc<5>,Improved Modules<6>
@anchor{whatsnew/3 8 gettext}@anchor{bed}
@subsubsection gettext


Added @ref{bee,,pgettext()} and its variants.
(Contributed by Franz Glasner, Éric Araujo, and Cheryl Sabella in bpo-2504@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2504}.)

@node gzip<3>,IDLE and idlelib<4>,gettext,Improved Modules<6>
@anchor{whatsnew/3 8 gzip}@anchor{bef}
@subsubsection gzip


Added the `mtime' parameter to @ref{84f,,gzip.compress()} for reproducible output.
(Contributed by Guo Ci Teo in bpo-34898@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34898}.)

A @ref{bf0,,BadGzipFile} exception is now raised instead of @ref{2c2,,OSError}
for certain types of invalid or corrupt gzip files.
(Contributed by Filip Gruszczyński, Michele Orrù, and Zackery Spytz in
bpo-6584@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6584}.)

@node IDLE and idlelib<4>,inspect<6>,gzip<3>,Improved Modules<6>
@anchor{whatsnew/3 8 idle-and-idlelib}@anchor{bf1}
@subsubsection IDLE and idlelib


Output over N lines (50 by default) is squeezed down to a button.
N can be changed in the PyShell section of the General page of the
Settings dialog.  Fewer, but possibly extra long, lines can be squeezed by
right clicking on the output.  Squeezed output can be expanded in place
by double-clicking the button or into the clipboard or a separate window
by right-clicking the button.  (Contributed by Tal Einat in bpo-1529353@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1529353}.)

Add “Run Customized” to the Run menu to run a module with customized
settings. Any command line arguments entered are added to sys.argv.
They also re-appear in the box for the next customized run.  One can also
suppress the normal Shell main module restart.  (Contributed by Cheryl
Sabella, Terry Jan Reedy, and others in bpo-5680@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5680} and bpo-37627@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37627}.)

Added optional line numbers for IDLE editor windows. Windows
open without line numbers unless set otherwise in the General
tab of the configuration dialog.  Line numbers for an existing
window are shown and hidden in the Options menu.
(Contributed by Tal Einat and Saimadhav Heblikar in bpo-17535@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17535}.)

OS native encoding is now used for converting between Python strings and Tcl
objects. This allows IDLE to work with emoji and other non-BMP characters.
These characters can be displayed or copied and pasted to or from the
clipboard.  Converting strings from Tcl to Python and back now never fails.
(Many people worked on this for eight years but the problem was finally
solved by Serhiy Storchaka in bpo-13153@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13153}.)

New in 3.8.1:

Add option to toggle cursor blink off.  (Contributed by Zackery Spytz
in bpo-4603@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4603}.)

Escape key now closes IDLE completion windows.  (Contributed by Johnny
Najera in bpo-38944@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38944}.)

The changes above have been backported to 3.7 maintenance releases.

Add keywords to module name completion list.  (Contributed by Terry J.
Reedy in bpo-37765@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37765}.)

@node inspect<6>,io<5>,IDLE and idlelib<4>,Improved Modules<6>
@anchor{whatsnew/3 8 inspect}@anchor{bf2}
@subsubsection inspect


The @ref{bf3,,inspect.getdoc()} function can now find docstrings for @code{__slots__}
if that attribute is a @ref{184,,dict} where the values are docstrings.
This provides documentation options similar to what we already have
for @ref{4b4,,property()}, @ref{48f,,classmethod()}, and @ref{451,,staticmethod()}:

@example
class AudioClip:
    __slots__ = @{'bit_rate': 'expressed in kilohertz to one decimal place',
                 'duration': 'in seconds, rounded up to an integer'@}
    def __init__(self, bit_rate, duration):
        self.bit_rate = round(bit_rate / 1000.0, 1)
        self.duration = ceil(duration)
@end example

(Contributed by Raymond Hettinger in bpo-36326@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36326}.)

@node io<5>,itertools<5>,inspect<6>,Improved Modules<6>
@anchor{whatsnew/3 8 io}@anchor{bf4}
@subsubsection io


In development mode (@ref{170,,-X} @code{env}) and in @ref{50a,,debug build}, the
@ref{506,,io.IOBase} finalizer now logs the exception if the @code{close()} method
fails. The exception is ignored silently by default in release build.
(Contributed by Victor Stinner in bpo-18748@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18748}.)

@node itertools<5>,json tool,io<5>,Improved Modules<6>
@anchor{whatsnew/3 8 itertools}@anchor{bf5}
@subsubsection itertools


The @ref{bf6,,itertools.accumulate()} function added an option `initial' keyword
argument to specify an initial value:

@example
>>> from itertools import accumulate
>>> list(accumulate([10, 5, 30, 15], initial=1000))
[1000, 1010, 1015, 1045, 1060]
@end example

(Contributed by Lisa Roach in bpo-34659@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34659}.)

@node json tool,logging<2>,itertools<5>,Improved Modules<6>
@anchor{whatsnew/3 8 json-tool}@anchor{bf7}
@subsubsection json.tool


Add option @code{--json-lines} to parse every input line as a separate JSON object.
(Contributed by Weipeng Hong in bpo-31553@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31553}.)

@node logging<2>,math<6>,json tool,Improved Modules<6>
@anchor{whatsnew/3 8 logging}@anchor{bf8}
@subsubsection logging


Added a `force' keyword argument to @ref{bf9,,logging.basicConfig()}.
When set to true, any existing handlers attached
to the root logger are removed and closed before carrying out the
configuration specified by the other arguments.

This solves a long-standing problem.  Once a logger or `basicConfig()' had
been called, subsequent calls to `basicConfig()' were silently ignored.
This made it difficult to update, experiment with, or teach the various
logging configuration options using the interactive prompt or a Jupyter
notebook.

(Suggested by Raymond Hettinger, implemented by Donghee Na, and
reviewed by Vinay Sajip in bpo-33897@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33897}.)

@node math<6>,mmap<2>,logging<2>,Improved Modules<6>
@anchor{whatsnew/3 8 math}@anchor{bfa}
@subsubsection math


Added new function @ref{bfb,,math.dist()} for computing Euclidean distance
between two points.  (Contributed by Raymond Hettinger in bpo-33089@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33089}.)

Expanded the @ref{bfc,,math.hypot()} function to handle multiple dimensions.
Formerly, it only supported the 2-D case.
(Contributed by Raymond Hettinger in bpo-33089@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33089}.)

Added new function, @ref{bfd,,math.prod()}, as analogous function to @ref{696,,sum()}
that returns the product of a ‘start’ value (default: 1) times an iterable of
numbers:

@example
>>> prior = 0.8
>>> likelihoods = [0.625, 0.84, 0.30]
>>> math.prod(likelihoods, start=prior)
0.126
@end example

(Contributed by Pablo Galindo in bpo-35606@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35606}.)

Added two new combinatoric functions @ref{8e2,,math.perm()} and @ref{8e1,,math.comb()}:

@example
>>> math.perm(10, 3)    # Permutations of 10 things taken 3 at a time
720
>>> math.comb(10, 3)    # Combinations of 10 things taken 3 at a time
120
@end example

(Contributed by Yash Aggarwal, Keller Fuchs, Serhiy Storchaka, and Raymond
Hettinger in bpo-37128@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37128}, bpo-37178@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37178}, and bpo-35431@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35431}.)

Added a new function @ref{bfe,,math.isqrt()} for computing accurate integer square
roots without conversion to floating point.  The new function supports
arbitrarily large integers.  It is faster than @code{floor(sqrt(n))} but slower
than @ref{bff,,math.sqrt()}:

@example
>>> r = 650320427
>>> s = r ** 2
>>> isqrt(s - 1)         # correct
650320426
>>> floor(sqrt(s - 1))   # incorrect
650320427
@end example

(Contributed by Mark Dickinson in bpo-36887@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36887}.)

The function @ref{b47,,math.factorial()} no longer accepts arguments that are not
int-like. (Contributed by Pablo Galindo in bpo-33083@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33083}.)

@node mmap<2>,multiprocessing<4>,math<6>,Improved Modules<6>
@anchor{whatsnew/3 8 mmap}@anchor{c00}
@subsubsection mmap


The @ref{51a,,mmap.mmap} class now has an @ref{c01,,madvise()} method to
access the @code{madvise()} system call.
(Contributed by Zackery Spytz in bpo-32941@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32941}.)

@node multiprocessing<4>,os<7>,mmap<2>,Improved Modules<6>
@anchor{whatsnew/3 8 multiprocessing}@anchor{c02}
@subsubsection multiprocessing


Added new @ref{9d,,multiprocessing.shared_memory} module.
(Contributed by Davin Potts in bpo-35813@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35813}.)

On macOS, the `spawn' start method is now used by default.
(Contributed by Victor Stinner in bpo-33725@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33725}.)

@node os<7>,os path<5>,multiprocessing<4>,Improved Modules<6>
@anchor{whatsnew/3 8 os}@anchor{c03}
@subsubsection os


Added new function @ref{be3,,add_dll_directory()} on Windows for providing
additional search paths for native dependencies when importing extension
modules or loading DLLs using @ref{2e,,ctypes}.
(Contributed by Steve Dower in bpo-36085@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36085}.)

A new @ref{c04,,os.memfd_create()} function was added to wrap the
@code{memfd_create()} syscall.
(Contributed by Zackery Spytz and Christian Heimes in bpo-26836@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26836}.)

On Windows, much of the manual logic for handling reparse points (including
symlinks and directory junctions) has been delegated to the operating system.
Specifically, @ref{26f,,os.stat()} will now traverse anything supported by the
operating system, while @ref{6c9,,os.lstat()} will only open reparse points that
identify as “name surrogates” while others are opened as for @code{os.stat()}.
In all cases, @ref{c05,,os.stat_result.st_mode} will only have @code{S_IFLNK} set for
symbolic links and not other kinds of reparse points. To identify other kinds
of reparse point, check the new @ref{c06,,os.stat_result.st_reparse_tag} attribute.

On Windows, @ref{b20,,os.readlink()} is now able to read directory junctions. Note
that @ref{c07,,islink()} will return @code{False} for directory junctions,
and so code that checks @code{islink} first will continue to treat junctions as
directories, while code that handles errors from @code{os.readlink()} may now
treat junctions as links.

(Contributed by Steve Dower in bpo-37834@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37834}.)

@node os path<5>,pathlib<10>,os<7>,Improved Modules<6>
@anchor{whatsnew/3 8 os-path}@anchor{c08}
@subsubsection os.path


@ref{a6,,os.path} functions that return a boolean result like
@ref{c09,,exists()}, @ref{c0a,,lexists()}, @ref{c0b,,isdir()},
@ref{c0c,,isfile()}, @ref{c07,,islink()}, and @ref{c0d,,ismount()}
now return @code{False} instead of raising @ref{2ee,,ValueError} or its subclasses
@ref{889,,UnicodeEncodeError} and @ref{c0e,,UnicodeDecodeError} for paths that contain
characters or bytes unrepresentable at the OS level.
(Contributed by Serhiy Storchaka in bpo-33721@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33721}.)

@ref{c0f,,expanduser()} on Windows now prefers the 
@geindex USERPROFILE
@geindex environment variable; USERPROFILE
@code{USERPROFILE}
environment variable and does not use 
@geindex HOME
@geindex environment variable; HOME
@code{HOME}, which is not normally set
for regular user accounts.
(Contributed by Anthony Sottile in bpo-36264@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36264}.)

@ref{c0b,,isdir()} on Windows no longer returns @code{True} for a link to a
non-existent directory.

@ref{264,,realpath()} on Windows now resolves reparse points, including
symlinks and directory junctions.

(Contributed by Steve Dower in bpo-37834@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37834}.)

@node pathlib<10>,pickle<2>,os path<5>,Improved Modules<6>
@anchor{whatsnew/3 8 pathlib}@anchor{c10}
@subsubsection pathlib


@ref{268,,pathlib.Path} methods that return a boolean result like
@ref{c11,,exists()}, @ref{53b,,is_dir()},
@ref{53a,,is_file()}, @ref{c12,,is_mount()},
@ref{c13,,is_symlink()}, @ref{c14,,is_block_device()},
@ref{c15,,is_char_device()}, @ref{c16,,is_fifo()},
@ref{c17,,is_socket()} now return @code{False} instead of raising
@ref{2ee,,ValueError} or its subclass @ref{889,,UnicodeEncodeError} for paths that
contain characters unrepresentable at the OS level.
(Contributed by Serhiy Storchaka in bpo-33721@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33721}.)

Added @code{pathlib.Path.link_to()} which creates a hard link pointing
to a path.
(Contributed by Joannah Nanjekye in bpo-26978@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26978})
Note that @code{link_to} was deprecated in 3.10 and removed in 3.12 in
favor of a @code{hardlink_to} method added in 3.10 which matches the
semantics of the existing @code{symlink_to} method.

@node pickle<2>,plistlib,pathlib<10>,Improved Modules<6>
@anchor{whatsnew/3 8 pickle}@anchor{c18}
@subsubsection pickle


@ref{ab,,pickle} extensions subclassing the C-optimized @ref{c19,,Pickler}
can now override the pickling logic of functions and classes by defining the
special @ref{c1a,,reducer_override()} method.
(Contributed by Pierre Glaser and Olivier Grisel in bpo-35900@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35900}.)

@node plistlib,pprint<3>,pickle<2>,Improved Modules<6>
@anchor{whatsnew/3 8 plistlib}@anchor{c1b}
@subsubsection plistlib


Added new @ref{c1c,,plistlib.UID} and enabled support for reading and writing
NSKeyedArchiver-encoded binary plists.
(Contributed by Jon Janzen in bpo-26707@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26707}.)

@node pprint<3>,py_compile<2>,plistlib,Improved Modules<6>
@anchor{whatsnew/3 8 pprint}@anchor{c1d}
@subsubsection pprint


The @ref{b3,,pprint} module added a `sort_dicts' parameter to several functions.
By default, those functions continue to sort dictionaries before rendering or
printing.  However, if `sort_dicts' is set to false, the dictionaries retain
the order that keys were inserted.  This can be useful for comparison to JSON
inputs during debugging.

In addition, there is a convenience new function, @ref{c1e,,pprint.pp()} that is
like @ref{a2f,,pprint.pprint()} but with `sort_dicts' defaulting to @code{False}:

@example
>>> from pprint import pprint, pp
>>> d = dict(source='input.txt', operation='filter', destination='output.txt')
>>> pp(d, width=40)                  # Original order
@{'source': 'input.txt',
 'operation': 'filter',
 'destination': 'output.txt'@}
>>> pprint(d, width=40)              # Keys sorted alphabetically
@{'destination': 'output.txt',
 'operation': 'filter',
 'source': 'input.txt'@}
@end example

(Contributed by Rémi Lapeyre in bpo-30670@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30670}.)

@node py_compile<2>,shlex,pprint<3>,Improved Modules<6>
@anchor{whatsnew/3 8 py-compile}@anchor{c1f}
@subsubsection py_compile


@ref{c20,,py_compile.compile()} now supports silent mode.
(Contributed by Joannah Nanjekye in bpo-22640@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22640}.)

@node shlex,shutil<4>,py_compile<2>,Improved Modules<6>
@anchor{whatsnew/3 8 shlex}@anchor{c21}
@subsubsection shlex


The new @ref{c22,,shlex.join()} function acts as the inverse of @ref{75f,,shlex.split()}.
(Contributed by Bo Bayles in bpo-32102@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32102}.)

@node shutil<4>,socket<5>,shlex,Improved Modules<6>
@anchor{whatsnew/3 8 shutil}@anchor{c23}
@subsubsection shutil


@ref{c24,,shutil.copytree()} now accepts a new @code{dirs_exist_ok} keyword argument.
(Contributed by Josh Bronson in bpo-20849@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20849}.)

@ref{6db,,shutil.make_archive()} now defaults to the modern pax (POSIX.1-2001)
format for new archives to improve portability and standards conformance,
inherited from the corresponding change to the @ref{e4,,tarfile} module.
(Contributed by C.A.M. Gerlach in bpo-30661@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30661}.)

@ref{354,,shutil.rmtree()} on Windows now removes directory junctions without
recursively removing their contents first.
(Contributed by Steve Dower in bpo-37834@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37834}.)

@node socket<5>,ssl<5>,shutil<4>,Improved Modules<6>
@anchor{whatsnew/3 8 socket}@anchor{c25}
@subsubsection socket


Added @ref{c26,,create_server()} and @ref{c27,,has_dualstack_ipv6()}
convenience functions to automate the necessary tasks usually involved when
creating a server socket, including accepting both IPv4 and IPv6 connections
on the same socket.  (Contributed by Giampaolo Rodolà in bpo-17561@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17561}.)

The @ref{c28,,socket.if_nameindex()}, @ref{c29,,socket.if_nametoindex()}, and
@ref{c2a,,socket.if_indextoname()} functions have been implemented on Windows.
(Contributed by Zackery Spytz in bpo-37007@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37007}.)

@node ssl<5>,statistics<4>,socket<5>,Improved Modules<6>
@anchor{whatsnew/3 8 ssl}@anchor{c2b}
@subsubsection ssl


Added @ref{c2c,,post_handshake_auth} to enable and
@ref{c2d,,verify_client_post_handshake()} to initiate TLS 1.3
post-handshake authentication.
(Contributed by Christian Heimes in bpo-34670@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34670}.)

@node statistics<4>,sys<7>,ssl<5>,Improved Modules<6>
@anchor{whatsnew/3 8 statistics}@anchor{c2e}
@subsubsection statistics


Added @ref{c2f,,statistics.fmean()} as a faster, floating-point variant of
@ref{8e3,,statistics.mean()}.  (Contributed by Raymond Hettinger and
Steven D’Aprano in bpo-35904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35904}.)

Added @ref{c30,,statistics.geometric_mean()}
(Contributed by Raymond Hettinger in bpo-27181@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27181}.)

Added @ref{c31,,statistics.multimode()} that returns a list of the most
common values. (Contributed by Raymond Hettinger in bpo-35892@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35892}.)

Added @ref{c32,,statistics.quantiles()} that divides data or a distribution
in to equiprobable intervals (e.g. quartiles, deciles, or percentiles).
(Contributed by Raymond Hettinger in bpo-36546@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36546}.)

Added @ref{c33,,statistics.NormalDist}, a tool for creating
and manipulating normal distributions of a random variable.
(Contributed by Raymond Hettinger in bpo-36018@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36018}.)

@example
>>> temperature_feb = NormalDist.from_samples([4, 12, -3, 2, 7, 14])
>>> temperature_feb.mean
6.0
>>> temperature_feb.stdev
6.356099432828281

>>> temperature_feb.cdf(3)            # Chance of being under 3 degrees
0.3184678262814532
>>> # Relative chance of being 7 degrees versus 10 degrees
>>> temperature_feb.pdf(7) / temperature_feb.pdf(10)
1.2039930378537762

>>> el_niño = NormalDist(4, 2.5)
>>> temperature_feb += el_niño        # Add in a climate effect
>>> temperature_feb
NormalDist(mu=10.0, sigma=6.830080526611674)

>>> temperature_feb * (9/5) + 32      # Convert to Fahrenheit
NormalDist(mu=50.0, sigma=12.294144947901014)
>>> temperature_feb.samples(3)        # Generate random samples
[7.672102882379219, 12.000027119750287, 4.647488369766392]
@end example

@node sys<7>,tarfile<5>,statistics<4>,Improved Modules<6>
@anchor{whatsnew/3 8 sys}@anchor{c34}
@subsubsection sys


Add new @ref{508,,sys.unraisablehook()} function which can be overridden to control
how “unraisable exceptions” are handled. It is called when an exception has
occurred but there is no way for Python to handle it. For example, when a
destructor raises an exception or during garbage collection
(@ref{1b5,,gc.collect()}).
(Contributed by Victor Stinner in bpo-36829@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36829}.)

@node tarfile<5>,threading<5>,sys<7>,Improved Modules<6>
@anchor{whatsnew/3 8 tarfile}@anchor{c35}
@subsubsection tarfile


The @ref{e4,,tarfile} module now defaults to the modern pax (POSIX.1-2001)
format for new archives, instead of the previous GNU-specific one.
This improves cross-platform portability with a consistent encoding (UTF-8)
in a standardized and extensible format, and offers several other benefits.
(Contributed by C.A.M. Gerlach in bpo-36268@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36268}.)

@node threading<5>,tokenize<2>,tarfile<5>,Improved Modules<6>
@anchor{whatsnew/3 8 threading}@anchor{c36}
@subsubsection threading


Add a new @ref{a51,,threading.excepthook()} function which handles uncaught
@ref{c37,,threading.Thread.run()} exception. It can be overridden to control how
uncaught @code{threading.Thread.run()} exceptions are handled.
(Contributed by Victor Stinner in bpo-1230540@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1230540}.)

Add a new @ref{c38,,threading.get_native_id()} function and
a @ref{c39,,native_id}
attribute to the @ref{177,,threading.Thread} class. These return the native
integral Thread ID of the current thread assigned by the kernel.
This feature is only available on certain platforms, see
@code{get_native_id} for more information.
(Contributed by Jake Tesler in bpo-36084@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36084}.)

@node tokenize<2>,tkinter<5>,threading<5>,Improved Modules<6>
@anchor{whatsnew/3 8 tokenize}@anchor{c3a}
@subsubsection tokenize


The @ref{102,,tokenize} module now implicitly emits a @code{NEWLINE} token when
provided with input that does not have a trailing new line.  This behavior
now matches what the C tokenizer does internally.
(Contributed by Ammar Askar in bpo-33899@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33899}.)

@node tkinter<5>,time<4>,tokenize<2>,Improved Modules<6>
@anchor{whatsnew/3 8 tkinter}@anchor{c3b}
@subsubsection tkinter


Added methods @code{selection_from()},
@code{selection_present()},
@code{selection_range()} and
@code{selection_to()}
in the @code{tkinter.Spinbox} class.
(Contributed by Juliette Monsel in bpo-34829@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34829}.)

Added method @code{moveto()}
in the @code{tkinter.Canvas} class.
(Contributed by Juliette Monsel in bpo-23831@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23831}.)

The @code{tkinter.PhotoImage} class now has
@code{transparency_get()} and
@code{transparency_set()} methods.  (Contributed by
Zackery Spytz in bpo-25451@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25451}.)

@node time<4>,typing<9>,tkinter<5>,Improved Modules<6>
@anchor{whatsnew/3 8 time}@anchor{c3c}
@subsubsection time


Added new clock @ref{c3d,,CLOCK_UPTIME_RAW} for macOS 10.12.
(Contributed by Joannah Nanjekye in bpo-35702@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35702}.)

@node typing<9>,unicodedata<6>,time<4>,Improved Modules<6>
@anchor{whatsnew/3 8 typing}@anchor{c3e}
@subsubsection typing


The @ref{10b,,typing} module incorporates several new features:


@itemize *

@item 
A dictionary type with per-key types.  See 
@geindex Python Enhancement Proposals; PEP 589
PEP 589@footnote{https://peps.python.org/pep-0589/} and
@ref{330,,typing.TypedDict}.
TypedDict uses only string keys.  By default, every key is required
to be present. Specify “total=False” to allow keys to be optional:

@example
class Location(TypedDict, total=False):
    lat_long: tuple
    grid_square: str
    xy_coordinate: tuple
@end example

@item 
Literal types.  See 
@geindex Python Enhancement Proposals; PEP 586
PEP 586@footnote{https://peps.python.org/pep-0586/} and @ref{a5b,,typing.Literal}.
Literal types indicate that a parameter or return value
is constrained to one or more specific literal values:

@example
def get_status(port: int) -> Literal['connected', 'disconnected']:
    ...
@end example

@item 
“Final” variables, functions, methods and classes.  See 
@geindex Python Enhancement Proposals; PEP 591
PEP 591@footnote{https://peps.python.org/pep-0591/},
@ref{56e,,typing.Final} and @ref{8be,,typing.final()}.
The final qualifier instructs a static type checker to restrict
subclassing, overriding, or reassignment:

@example
pi: Final[float] = 3.1415926536
@end example

@item 
Protocol definitions.  See 
@geindex Python Enhancement Proposals; PEP 544
PEP 544@footnote{https://peps.python.org/pep-0544/}, @ref{56b,,typing.Protocol} and
@ref{675,,typing.runtime_checkable()}.  Simple ABCs like
@ref{c3f,,typing.SupportsInt} are now @code{Protocol} subclasses.

@item 
New protocol class @ref{c40,,typing.SupportsIndex}.

@item 
New functions @ref{2ad,,typing.get_origin()} and @ref{2ae,,typing.get_args()}.
@end itemize

@node unicodedata<6>,unittest<7>,typing<9>,Improved Modules<6>
@anchor{whatsnew/3 8 unicodedata}@anchor{c41}
@subsubsection unicodedata


The @ref{10c,,unicodedata} module has been upgraded to use the Unicode 12.1.0@footnote{https://blog.unicode.org/2019/05/unicode-12-1-en.html} release.

New function @ref{c42,,is_normalized()} can be used to verify a string
is in a specific normal form, often much faster than by actually normalizing
the string.  (Contributed by Max Belanger, David Euresti, and Greg Price in
bpo-32285@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32285} and bpo-37966@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37966}).

@node unittest<7>,venv<4>,unicodedata<6>,Improved Modules<6>
@anchor{whatsnew/3 8 unittest}@anchor{c43}
@subsubsection unittest


Added @ref{c44,,AsyncMock} to support an asynchronous version of
@ref{c45,,Mock}.  Appropriate new assert functions for testing
have been added as well.
(Contributed by Lisa Roach in bpo-26467@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26467}).

Added @ref{c46,,addModuleCleanup()} and
@ref{c47,,addClassCleanup()} to unittest to support
cleanups for @ref{c48,,setUpModule()} and
@ref{c49,,setUpClass()}.
(Contributed by Lisa Roach in bpo-24412@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24412}.)

Several mock assert functions now also print a list of actual calls upon
failure. (Contributed by Petter Strandmark in bpo-35047@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35047}.)

@ref{10d,,unittest} module gained support for coroutines to be used as test cases
with @ref{35f,,unittest.IsolatedAsyncioTestCase}.
(Contributed by Andrew Svetlov in bpo-32972@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32972}.)

Example:

@example
import unittest


class TestRequest(unittest.IsolatedAsyncioTestCase):

    async def asyncSetUp(self):
        self.connection = await AsyncConnection()

    async def test_get(self):
        response = await self.connection.get("https://example.com")
        self.assertEqual(response.status_code, 200)

    async def asyncTearDown(self):
        await self.connection.close()


if __name__ == "__main__":
    unittest.main()
@end example

@node venv<4>,weakref,unittest<7>,Improved Modules<6>
@anchor{whatsnew/3 8 venv}@anchor{c4a}
@subsubsection venv


@ref{118,,venv} now includes an @code{Activate.ps1} script on all platforms for
activating virtual environments under PowerShell Core 6.1.
(Contributed by Brett Cannon in bpo-32718@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32718}.)

@node weakref,xml<4>,venv<4>,Improved Modules<6>
@anchor{whatsnew/3 8 weakref}@anchor{c4b}
@subsubsection weakref


The proxy objects returned by @ref{c4c,,weakref.proxy()} now support the matrix
multiplication operators @code{@@} and @code{@@=} in addition to the other
numeric operators. (Contributed by Mark Dickinson in bpo-36669@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36669}.)

@node xml<4>,xmlrpc,weakref,Improved Modules<6>
@anchor{whatsnew/3 8 xml}@anchor{c4d}
@subsubsection xml


As mitigation against DTD and external entity retrieval, the
@ref{129,,xml.dom.minidom} and @ref{130,,xml.sax} modules no longer process
external entities by default.
(Contributed by Christian Heimes in bpo-17239@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17239}.)

The @code{.find*()} methods in the @ref{12c,,xml.etree.ElementTree} module
support wildcard searches like @code{@{*@}tag} which ignores the namespace
and @code{@{namespace@}*} which returns all tags in the given namespace.
(Contributed by Stefan Behnel in bpo-28238@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28238}.)

The @ref{12c,,xml.etree.ElementTree} module provides a new function
@ref{c4e,,canonicalize()} that implements C14N 2.0.
(Contributed by Stefan Behnel in bpo-13611@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13611}.)

The target object of @ref{c4f,,xml.etree.ElementTree.XMLParser} can
receive namespace declaration events through the new callback methods
@code{start_ns()} and @code{end_ns()}.  Additionally, the
@ref{c50,,xml.etree.ElementTree.TreeBuilder} target can be configured
to process events about comments and processing instructions to include
them in the generated tree.
(Contributed by Stefan Behnel in bpo-36676@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36676} and bpo-36673@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36673}.)

@node xmlrpc,,xml<4>,Improved Modules<6>
@anchor{whatsnew/3 8 xmlrpc}@anchor{c51}
@subsubsection xmlrpc


@ref{c52,,xmlrpc.client.ServerProxy} now supports an optional `headers' keyword
argument for a sequence of HTTP headers to be sent with each request.  Among
other things, this makes it possible to upgrade from default basic
authentication to faster session authentication.
(Contributed by Cédric Krier in bpo-35153@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35153}.)

@node Optimizations<7>,Build and C API Changes,Improved Modules<6>,What’s New In Python 3 8
@anchor{whatsnew/3 8 optimizations}@anchor{c53}
@subsection Optimizations



@itemize *

@item 
The @ref{dc,,subprocess} module can now use the @ref{52f,,os.posix_spawn()} function
in some cases for better performance. Currently, it is only used on macOS
and Linux (using glibc 2.24 or newer) if all these conditions are met:


@itemize *

@item 
`close_fds' is false;

@item 
`preexec_fn', `pass_fds', `cwd' and `start_new_session' parameters
are not set;

@item 
the `executable' path contains a directory.
@end itemize

(Contributed by Joannah Nanjekye and Victor Stinner in bpo-35537@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35537}.)

@item 
@ref{c54,,shutil.copyfile()}, @ref{c55,,shutil.copy()}, @ref{c56,,shutil.copy2()},
@ref{c24,,shutil.copytree()} and @ref{c57,,shutil.move()} use platform-specific
“fast-copy” syscalls on Linux and macOS in order to copy the file
more efficiently.
“fast-copy” means that the copying operation occurs within the kernel,
avoiding the use of userspace buffers in Python as in
“@code{outfd.write(infd.read())}”.
On Windows @code{shutil.copyfile()} uses a bigger default buffer size (1 MiB
instead of 16 KiB) and a @ref{166,,memoryview()}-based variant of
@ref{c58,,shutil.copyfileobj()} is used.
The speedup for copying a 512 MiB file within the same partition is about
+26% on Linux, +50% on macOS and +40% on Windows. Also, much less CPU cycles
are consumed.
See @ref{c59,,Platform-dependent efficient copy operations} section.
(Contributed by Giampaolo Rodolà in bpo-33671@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33671}.)

@item 
@ref{c24,,shutil.copytree()} uses @ref{c5a,,os.scandir()} function and all copy
functions depending from it use cached @ref{26f,,os.stat()} values. The speedup
for copying a directory with 8000 files is around +9% on Linux, +20% on
Windows and +30% on a Windows SMB share. Also the number of @code{os.stat()}
syscalls is reduced by 38% making @code{shutil.copytree()} especially faster
on network filesystems. (Contributed by Giampaolo Rodolà in bpo-33695@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33695}.)

@item 
The default protocol in the @ref{ab,,pickle} module is now Protocol 4,
first introduced in Python 3.4.  It offers better performance and smaller
size compared to Protocol 3 available since Python 3.0.

@item 
Removed one @ref{c5b,,Py_ssize_t} member from @code{PyGC_Head}.  All GC tracked
objects (e.g. tuple, list, dict) size is reduced 4 or 8 bytes.
(Contributed by Inada Naoki in bpo-33597@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33597}.)

@item 
@ref{c5c,,uuid.UUID} now uses @code{__slots__} to reduce its memory footprint.
(Contributed by Wouter Bolsterlee and Tal Einat in bpo-30977@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30977})

@item 
Improved performance of @ref{c5d,,operator.itemgetter()} by 33%.  Optimized
argument handling and added a fast path for the common case of a single
non-negative integer index into a tuple (which is the typical use case in
the standard library).  (Contributed by Raymond Hettinger in
bpo-35664@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35664}.)

@item 
Sped-up field lookups in @ref{4e1,,collections.namedtuple()}.  They are now more
than two times faster, making them the fastest form of instance variable
lookup in Python. (Contributed by Raymond Hettinger, Pablo Galindo, and
Joe Jevnik, Serhiy Storchaka in bpo-32492@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32492}.)

@item 
The @ref{24f,,list} constructor does not overallocate the internal item buffer
if the input iterable has a known length (the input implements @code{__len__}).
This makes the created list 12% smaller on average. (Contributed by
Raymond Hettinger and Pablo Galindo in bpo-33234@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33234}.)

@item 
Doubled the speed of class variable writes.  When a non-dunder attribute
was updated, there was an unnecessary call to update slots.
(Contributed by Stefan Behnel, Pablo Galindo Salgado, Raymond Hettinger,
Neil Schemenauer, and Serhiy Storchaka in bpo-36012@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36012}.)

@item 
Reduced an overhead of converting arguments passed to many builtin functions
and methods.  This sped up calling some simple builtin functions and
methods up to 20–50%.  (Contributed by Serhiy Storchaka in bpo-23867@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23867},
bpo-35582@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35582} and bpo-36127@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36127}.)

@item 
@code{LOAD_GLOBAL} instruction now uses new “per opcode cache” mechanism.
It is about 40% faster now.  (Contributed by Yury Selivanov and Inada Naoki in
bpo-26219@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26219}.)
@end itemize

@node Build and C API Changes,Deprecated<9>,Optimizations<7>,What’s New In Python 3 8
@anchor{whatsnew/3 8 build-and-c-api-changes}@anchor{c5e}
@subsection Build and C API Changes



@itemize *

@item 
Default @ref{c5f,,sys.abiflags} became an empty string: the @code{m} flag for
pymalloc became useless (builds with and without pymalloc are ABI compatible)
and so has been removed. (Contributed by Victor Stinner in bpo-36707@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36707}.)

Example of changes:


@itemize *

@item 
Only @code{python3.8} program is installed, @code{python3.8m} program is gone.

@item 
Only @code{python3.8-config} script is installed, @code{python3.8m-config} script
is gone.

@item 
The @code{m} flag has been removed from the suffix of dynamic library
filenames: extension modules in the standard library as well as those
produced and installed by third-party packages, like those downloaded from
PyPI. On Linux, for example, the Python 3.7 suffix
@code{.cpython-37m-x86_64-linux-gnu.so} became
@code{.cpython-38-x86_64-linux-gnu.so} in Python 3.8.
@end itemize

@item 
The header files have been reorganized to better separate the different kinds
of APIs:


@itemize *

@item 
@code{Include/*.h} should be the portable public stable C API.

@item 
@code{Include/cpython/*.h} should be the unstable C API specific to CPython;
public API, with some private API prefixed by @code{_Py} or @code{_PY}.

@item 
@code{Include/internal/*.h} is the private internal C API very specific to
CPython. This API comes with no backward compatibility warranty and should
not be used outside CPython. It is only exposed for very specific needs
like debuggers and profiles which has to access to CPython internals
without calling functions. This API is now installed by @code{make install}.
@end itemize

(Contributed by Victor Stinner in bpo-35134@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35134} and bpo-35081@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35081},
work initiated by Eric Snow in Python 3.7.)

@item 
Some macros have been converted to static inline functions: parameter types
and return type are well defined, they don’t have issues specific to macros,
variables have a local scopes. Examples:


@itemize *

@item 
@ref{790,,Py_INCREF()}, @ref{791,,Py_DECREF()}

@item 
@ref{c60,,Py_XINCREF()}, @ref{997,,Py_XDECREF()}

@item 
@code{PyObject_INIT}, @code{PyObject_INIT_VAR}

@item 
Private functions: @code{_PyObject_GC_TRACK()},
@code{_PyObject_GC_UNTRACK()}, @code{_Py_Dealloc()}
@end itemize

(Contributed by Victor Stinner in bpo-35059@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35059}.)

@item 
The @code{PyByteArray_Init()} and @code{PyByteArray_Fini()} functions have
been removed. They did nothing since Python 2.7.4 and Python 3.2.0, were
excluded from the limited API (stable ABI), and were not documented.
(Contributed by Victor Stinner in bpo-35713@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35713}.)

@item 
The result of @ref{c61,,PyExceptionClass_Name()} is now of type
@code{const char *} rather of @code{char *}.
(Contributed by Serhiy Storchaka in bpo-33818@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33818}.)

@item 
The duality of @code{Modules/Setup.dist} and @code{Modules/Setup} has been
removed.  Previously, when updating the CPython source tree, one had
to manually copy @code{Modules/Setup.dist} (inside the source tree) to
@code{Modules/Setup} (inside the build tree) in order to reflect any changes
upstream.  This was of a small benefit to packagers at the expense of
a frequent annoyance to developers following CPython development, as
forgetting to copy the file could produce build failures.

Now the build system always reads from @code{Modules/Setup} inside the source
tree.  People who want to customize that file are encouraged to maintain
their changes in a git fork of CPython or as patch files, as they would do
for any other change to the source tree.

(Contributed by Antoine Pitrou in bpo-32430@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32430}.)

@item 
Functions that convert Python number to C integer like
@ref{605,,PyLong_AsLong()} and argument parsing functions like
@ref{3bf,,PyArg_ParseTuple()} with integer converting format units like @code{'i'}
will now use the @ref{19f,,__index__()} special method instead of
@ref{19e,,__int__()}, if available.  The deprecation warning will be
emitted for objects with the @code{__int__()} method but without the
@code{__index__()} method (like @ref{200,,Decimal} and
@ref{215,,Fraction}).  @ref{c62,,PyNumber_Check()} will now return
@code{1} for objects implementing @code{__index__()}.
@ref{c63,,PyNumber_Long()}, @ref{c64,,PyNumber_Float()} and
@ref{c65,,PyFloat_AsDouble()} also now use the @code{__index__()} method if
available.
(Contributed by Serhiy Storchaka in bpo-36048@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36048} and bpo-20092@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20092}.)

@item 
Heap-allocated type objects will now increase their reference count
in @ref{c66,,PyObject_Init()} (and its parallel macro @code{PyObject_INIT})
instead of in @ref{c67,,PyType_GenericAlloc()}. Types that modify instance
allocation or deallocation may need to be adjusted.
(Contributed by Eddie Elizondo in bpo-35810@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35810}.)

@item 
The new function @code{PyCode_NewWithPosOnlyArgs()} allows to create
code objects like @code{PyCode_New()}, but with an extra `posonlyargcount'
parameter for indicating the number of positional-only arguments.
(Contributed by Pablo Galindo in bpo-37221@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37221}.)

@item 
@code{Py_SetPath()} now sets @ref{3eb,,sys.executable} to the program full
path (@ref{3ea,,Py_GetProgramFullPath()}) rather than to the program name
(@ref{3ec,,Py_GetProgramName()}).
(Contributed by Victor Stinner in bpo-38234@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38234}.)
@end itemize

@node Deprecated<9>,API and Feature Removals,Build and C API Changes,What’s New In Python 3 8
@anchor{whatsnew/3 8 deprecated}@anchor{c68}
@subsection Deprecated



@itemize *

@item 
The distutils @code{bdist_wininst} command is now deprecated, use
@code{bdist_wheel} (wheel packages) instead.
(Contributed by Victor Stinner in bpo-37481@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37481}.)

@item 
Deprecated methods @code{getchildren()} and @code{getiterator()} in
the @ref{12c,,ElementTree} module now emit a
@ref{1a4,,DeprecationWarning} instead of @ref{acc,,PendingDeprecationWarning}.
They will be removed in Python 3.9.
(Contributed by Serhiy Storchaka in bpo-29209@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29209}.)

@item 
Passing an object that is not an instance of
@ref{94e,,concurrent.futures.ThreadPoolExecutor} to
@ref{94f,,loop.set_default_executor()} is
deprecated and will be prohibited in Python 3.9.
(Contributed by Elvis Pranskevichus in bpo-34075@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34075}.)

@item 
The @ref{588,,__getitem__()} methods of @ref{943,,xml.dom.pulldom.DOMEventStream},
@ref{944,,wsgiref.util.FileWrapper} and @ref{945,,fileinput.FileInput} have been
deprecated.

Implementations of these methods have been ignoring their `index' parameter,
and returning the next item instead.
(Contributed by Berker Peksag in bpo-9372@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9372}.)

@item 
The @ref{32f,,typing.NamedTuple} class has deprecated the @code{_field_types}
attribute in favor of the @code{__annotations__} attribute which has the same
information. (Contributed by Raymond Hettinger in bpo-36320@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36320}.)

@item 
@ref{9,,ast} classes @code{Num}, @code{Str}, @code{Bytes}, @code{NameConstant} and
@code{Ellipsis} are considered deprecated and will be removed in future Python
versions. @ref{2f1,,Constant} should be used instead.
(Contributed by Serhiy Storchaka in bpo-32892@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32892}.)

@item 
@ref{2f2,,ast.NodeVisitor} methods @code{visit_Num()}, @code{visit_Str()},
@code{visit_Bytes()}, @code{visit_NameConstant()} and @code{visit_Ellipsis()} are
deprecated now and will not be called in future Python versions.
Add the @ref{c69,,visit_Constant()} method to handle all
constant nodes.
(Contributed by Serhiy Storchaka in bpo-36917@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36917}.)

@item 
The @code{@@asyncio.coroutine} @ref{93f,,decorator} is deprecated and will be
removed in version 3.10.  Instead of @code{@@asyncio.coroutine}, use
@ref{7ee,,async def} instead.
(Contributed by Andrew Svetlov in bpo-36921@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36921}.)

@item 
In @ref{b,,asyncio}, the explicit passing of a `loop' argument has been
deprecated and will be removed in version 3.10 for the following:
@ref{c6a,,asyncio.sleep()}, @ref{814,,asyncio.gather()}, @ref{c6b,,asyncio.shield()},
@ref{816,,asyncio.wait_for()}, @ref{6a8,,asyncio.wait()}, @ref{4c7,,asyncio.as_completed()},
@ref{1c9,,asyncio.Task}, @ref{c6c,,asyncio.Lock}, @ref{2f6,,asyncio.Event},
@ref{c6d,,asyncio.Condition}, @ref{c6e,,asyncio.Semaphore},
@ref{c6f,,asyncio.BoundedSemaphore}, @ref{c70,,asyncio.Queue},
@ref{c71,,asyncio.create_subprocess_exec()}, and
@ref{c72,,asyncio.create_subprocess_shell()}.

@item 
The explicit passing of coroutine objects to @ref{6a8,,asyncio.wait()} has been
deprecated and will be removed in version 3.11.
(Contributed by Yury Selivanov in bpo-34790@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34790}.)

@item 
The following functions and methods are deprecated in the @ref{67,,gettext}
module: @code{lgettext()}, @code{ldgettext()},
@code{lngettext()} and @code{ldngettext()}.
They return encoded bytes, and it’s possible that you will get unexpected
Unicode-related exceptions if there are encoding problems with the
translated strings. It’s much better to use alternatives which return
Unicode strings in Python 3. These functions have been broken for a long time.

Function @code{bind_textdomain_codeset()}, methods
@code{NullTranslations.output_charset()} and
@code{NullTranslations.set_output_charset()}, and the `codeset'
parameter of functions @ref{c73,,translation()} and
@ref{c74,,install()} are also deprecated, since they are only used for
the @code{l*gettext()} functions.
(Contributed by Serhiy Storchaka in bpo-33710@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33710}.)

@item 
The @code{isAlive()} method of @ref{177,,threading.Thread}
has been deprecated.
(Contributed by Donghee Na in bpo-35283@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35283}.)

@item 
Many builtin and extension functions that take integer arguments will
now emit a deprecation warning for @ref{200,,Decimal}s,
@ref{215,,Fraction}s and any other objects that can be converted
to integers only with a loss (e.g. that have the @ref{19e,,__int__()}
method but do not have the @ref{19f,,__index__()} method).  In future
version they will be errors.
(Contributed by Serhiy Storchaka in bpo-36048@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36048}.)

@item 
Deprecated passing the following arguments as keyword arguments:


@itemize -

@item 
`func' in @ref{21a,,functools.partialmethod()}, @ref{c75,,weakref.finalize()},
@ref{c76,,profile.Profile.runcall()}, @code{cProfile.Profile.runcall()},
@ref{c77,,bdb.Bdb.runcall()}, @ref{c78,,trace.Trace.runfunc()} and
@ref{c79,,curses.wrapper()}.

@item 
`function' in @ref{c7a,,unittest.TestCase.addCleanup()}.

@item 
`fn' in the @ref{c7b,,submit()} method of
@ref{94e,,concurrent.futures.ThreadPoolExecutor} and
@ref{1d8,,concurrent.futures.ProcessPoolExecutor}.

@item 
`callback' in @ref{c7c,,contextlib.ExitStack.callback()},
@code{contextlib.AsyncExitStack.callback()} and
@ref{c7d,,contextlib.AsyncExitStack.push_async_callback()}.

@item 
`c' and `typeid' in the @code{create()}
method of @code{multiprocessing.managers.Server} and
@code{multiprocessing.managers.SharedMemoryServer}.

@item 
`obj' in @ref{c75,,weakref.finalize()}.
@end itemize

In future releases of Python, they will be @ref{c7e,,positional-only}.
(Contributed by Serhiy Storchaka in bpo-36492@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36492}.)
@end itemize

@node API and Feature Removals,Porting to Python 3 8,Deprecated<9>,What’s New In Python 3 8
@anchor{whatsnew/3 8 api-and-feature-removals}@anchor{c7f}
@subsection API and Feature Removals


The following features and APIs have been removed from Python 3.8:


@itemize *

@item 
Starting with Python 3.3, importing ABCs from @ref{1e,,collections} was
deprecated, and importing should be done from @ref{1f,,collections.abc}. Being
able to import from collections was marked for removal in 3.8, but has been
delayed to 3.9. (See gh-81134@footnote{https://github.com/python/cpython/issues/81134}.)

@item 
The @code{macpath} module, deprecated in Python 3.7, has been removed.
(Contributed by Victor Stinner in bpo-35471@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35471}.)

@item 
The function @code{platform.popen()} has been removed, after having been
deprecated since Python 3.3: use @ref{31c,,os.popen()} instead.
(Contributed by Victor Stinner in bpo-35345@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35345}.)

@item 
The function @code{time.clock()} has been removed, after having been
deprecated since Python 3.3: use @ref{c80,,time.perf_counter()} or
@ref{c81,,time.process_time()} instead, depending
on your requirements, to have well-defined behavior.
(Contributed by Matthias Bussonnier in bpo-36895@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36895}.)

@item 
The @code{pyvenv} script has been removed in favor of @code{python3.8 -m venv}
to help eliminate confusion as to what Python interpreter the @code{pyvenv}
script is tied to. (Contributed by Brett Cannon in bpo-25427@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25427}.)

@item 
@code{parse_qs}, @code{parse_qsl}, and @code{escape} are removed from the @code{cgi}
module.  They are deprecated in Python 3.2 or older. They should be imported
from the @code{urllib.parse} and @code{html} modules instead.

@item 
@code{filemode} function is removed from the @ref{e4,,tarfile} module.
It is not documented and deprecated since Python 3.3.

@item 
The @ref{c4f,,XMLParser} constructor no longer accepts
the `html' argument.  It never had an effect and was deprecated in Python 3.4.
All other parameters are now @ref{5a5,,keyword-only}.
(Contributed by Serhiy Storchaka in bpo-29209@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29209}.)

@item 
Removed the @code{doctype()} method of @ref{c4f,,XMLParser}.
(Contributed by Serhiy Storchaka in bpo-29209@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29209}.)

@item 
“unicode_internal” codec is removed.
(Contributed by Inada Naoki in bpo-36297@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36297}.)

@item 
The @code{Cache} and @code{Statement} objects of the @ref{d4,,sqlite3} module are not
exposed to the user.
(Contributed by Aviv Palivoda in bpo-30262@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30262}.)

@item 
The @code{bufsize} keyword argument of @ref{a06,,fileinput.input()} and
@ref{945,,fileinput.FileInput()} which was ignored and deprecated since Python 3.6
has been removed. bpo-36952@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36952} (Contributed by Matthias Bussonnier.)

@item 
The functions @code{sys.set_coroutine_wrapper()} and
@code{sys.get_coroutine_wrapper()} deprecated in Python 3.7 have been removed;
bpo-36933@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36933} (Contributed by Matthias Bussonnier.)
@end itemize

@node Porting to Python 3 8,Notable changes in Python 3 8 1,API and Feature Removals,What’s New In Python 3 8
@anchor{whatsnew/3 8 porting-to-python-3-8}@anchor{c82}
@subsection Porting to Python 3.8


This section lists previously described changes and other bugfixes
that may require changes to your code.

@menu
* Changes in Python behavior:: 
* Changes in the Python API: Changes in the Python API<6>. 
* Changes in the C API: Changes in the C API<5>. 
* CPython bytecode changes: CPython bytecode changes<6>. 
* Demos and Tools: Demos and Tools<2>. 

@end menu

@node Changes in Python behavior,Changes in the Python API<6>,,Porting to Python 3 8
@anchor{whatsnew/3 8 changes-in-python-behavior}@anchor{c83}
@subsubsection Changes in Python behavior



@itemize *

@item 
Yield expressions (both @code{yield} and @code{yield from} clauses) are now disallowed
in comprehensions and generator expressions (aside from the iterable expression
in the leftmost @code{for} clause).
(Contributed by Serhiy Storchaka in bpo-10544@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10544}.)

@item 
The compiler now produces a @ref{1af,,SyntaxWarning} when identity checks
(@code{is} and @code{is not}) are used with certain types of literals
(e.g. strings, numbers).  These can often work by accident in CPython,
but are not guaranteed by the language spec.  The warning advises users
to use equality tests (@code{==} and @code{!=}) instead.
(Contributed by Serhiy Storchaka in bpo-34850@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34850}.)

@item 
The CPython interpreter can swallow exceptions in some circumstances.
In Python 3.8 this happens in fewer cases.  In particular, exceptions
raised when getting the attribute from the type dictionary are no longer
ignored. (Contributed by Serhiy Storchaka in bpo-35459@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35459}.)

@item 
Removed @code{__str__} implementations from builtin types @ref{3c1,,bool},
@ref{19c,,int}, @ref{197,,float}, @ref{198,,complex} and few classes from
the standard library.  They now inherit @code{__str__()} from @ref{c84,,object}.
As result, defining the @code{__repr__()} method in the subclass of these
classes will affect their string representation.
(Contributed by Serhiy Storchaka in bpo-36793@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36793}.)

@item 
On AIX, @ref{293,,sys.platform} doesn’t contain the major version anymore.
It is always @code{'aix'}, instead of @code{'aix3'} .. @code{'aix7'}.  Since
older Python versions include the version number, so it is recommended to
always use @code{sys.platform.startswith('aix')}.
(Contributed by M. Felt in bpo-36588@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36588}.)

@item 
@code{PyEval_AcquireLock()} and @code{PyEval_AcquireThread()} now
terminate the current thread if called while the interpreter is
finalizing, making them consistent with @ref{648,,PyEval_RestoreThread()},
@ref{c85,,Py_END_ALLOW_THREADS()}, and @ref{64a,,PyGILState_Ensure()}. If this
behavior is not desired, guard the call by checking @code{_Py_IsFinalizing()}
or @ref{c86,,sys.is_finalizing()}.
(Contributed by Joannah Nanjekye in bpo-36475@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36475}.)
@end itemize

@node Changes in the Python API<6>,Changes in the C API<5>,Changes in Python behavior,Porting to Python 3 8
@anchor{whatsnew/3 8 changes-in-the-python-api}@anchor{c87}
@subsubsection Changes in the Python API



@itemize *

@item 
The @ref{c88,,os.getcwdb()} function now uses the UTF-8 encoding on Windows,
rather than the ANSI code page: see 
@geindex Python Enhancement Proposals; PEP 529
PEP 529@footnote{https://peps.python.org/pep-0529/} for the rationale. The
function is no longer deprecated on Windows.
(Contributed by Victor Stinner in bpo-37412@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37412}.)

@item 
@ref{4b8,,subprocess.Popen} can now use @ref{52f,,os.posix_spawn()} in some cases
for better performance. On Windows Subsystem for Linux and QEMU User
Emulation, the @code{Popen} constructor using
@code{os.posix_spawn()} no longer raises an exception on errors like
“missing program”.  Instead the child process fails with a
non-zero @ref{c89,,returncode}.
(Contributed by Joannah Nanjekye and Victor Stinner in bpo-35537@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35537}.)

@item 
The `preexec_fn' argument of * @ref{4b8,,subprocess.Popen} is no longer
compatible with subinterpreters. The use of the parameter in a
subinterpreter now raises @ref{246,,RuntimeError}.
(Contributed by Eric Snow in bpo-34651@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34651}, modified by Christian Heimes
in bpo-37951@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37951}.)

@item 
The @ref{c8a,,imaplib.IMAP4.logout()} method no longer silently ignores arbitrary
exceptions.
(Contributed by Victor Stinner in bpo-36348@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36348}.)

@item 
The function @code{platform.popen()} has been removed, after having been deprecated since
Python 3.3: use @ref{31c,,os.popen()} instead.
(Contributed by Victor Stinner in bpo-35345@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35345}.)

@item 
The @ref{c8b,,statistics.mode()} function no longer raises an exception
when given multimodal data.  Instead, it returns the first mode
encountered in the input data.  (Contributed by Raymond Hettinger
in bpo-35892@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35892}.)

@item 
The @ref{c8c,,selection()} method of the
@ref{c8d,,tkinter.ttk.Treeview} class no longer takes arguments.  Using it with
arguments for changing the selection was deprecated in Python 3.6.  Use
specialized methods like @ref{c8e,,selection_set()} for
changing the selection.  (Contributed by Serhiy Storchaka in bpo-31508@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31508}.)

@item 
The @ref{c8f,,writexml()}, @ref{c90,,toxml()}
and @ref{c91,,toprettyxml()} methods of
@ref{129,,xml.dom.minidom} and the @ref{c92,,write()}
method of @ref{12c,,xml.etree.ElementTree} now preserve the attribute order
specified by the user.
(Contributed by Diego Rojas and Raymond Hettinger in bpo-34160@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34160}.)

@item 
A @ref{36,,dbm.dumb} database opened with flags @code{'r'} is now read-only.
@ref{c93,,dbm.dumb.open()} with flags @code{'r'} and @code{'w'} no longer creates
a database if it does not exist.
(Contributed by Serhiy Storchaka in bpo-32749@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32749}.)

@item 
The @code{doctype()} method defined in a subclass of
@ref{c4f,,XMLParser} will no longer be called and will
emit a @ref{4d8,,RuntimeWarning} instead of a @ref{1a4,,DeprecationWarning}.
Define the @ref{c94,,doctype()}
method on a target for handling an XML doctype declaration.
(Contributed by Serhiy Storchaka in bpo-29209@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29209}.)

@item 
A @ref{246,,RuntimeError} is now raised when the custom metaclass doesn’t
provide the @code{__classcell__} entry in the namespace passed to
@code{type.__new__}.  A @ref{1a4,,DeprecationWarning} was emitted in Python
3.6–3.7.  (Contributed by Serhiy Storchaka in bpo-23722@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23722}.)

@item 
The @ref{bdc,,cProfile.Profile} class can now be used as
a context manager. (Contributed by Scott Sanderson in bpo-29235@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29235}.)

@item 
@ref{c54,,shutil.copyfile()}, @ref{c55,,shutil.copy()}, @ref{c56,,shutil.copy2()},
@ref{c24,,shutil.copytree()} and @ref{c57,,shutil.move()} use platform-specific
“fast-copy” syscalls (see
@ref{c59,,Platform-dependent efficient copy operations} section).

@item 
@ref{c54,,shutil.copyfile()} default buffer size on Windows was changed from
16 KiB to 1 MiB.

@item 
The @code{PyGC_Head} struct has changed completely.  All code that touched the
struct member should be rewritten.  (See bpo-33597@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33597}.)

@item 
The @ref{ac0,,PyInterpreterState} struct has been moved into the “internal”
header files (specifically Include/internal/pycore_pystate.h).  An
opaque @code{PyInterpreterState} is still available as part of the public
API (and stable ABI).  The docs indicate that none of the struct’s
fields are public, so we hope no one has been using them.  However,
if you do rely on one or more of those private fields and have no
alternative then please open a BPO issue.  We’ll work on helping
you adjust (possibly including adding accessor functions to the
public API).  (See bpo-35886@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35886}.)

@item 
The @ref{c95,,mmap.flush()} method now returns @code{None} on
success and raises an exception on error under all platforms.  Previously,
its behavior was platform-dependent: a nonzero value was returned on success;
zero was returned on error under Windows.  A zero value was returned on
success; an exception was raised on error under Unix.
(Contributed by Berker Peksag in bpo-2122@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2122}.)

@item 
@ref{129,,xml.dom.minidom} and @ref{130,,xml.sax} modules no longer process
external entities by default.
(Contributed by Christian Heimes in bpo-17239@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17239}.)

@item 
Deleting a key from a read-only @ref{35,,dbm} database (@ref{36,,dbm.dumb},
@ref{37,,dbm.gnu} or @ref{38,,dbm.ndbm}) raises @code{error} (@ref{c96,,dbm.dumb.error},
@ref{c97,,dbm.gnu.error} or @ref{c98,,dbm.ndbm.error}) instead of @ref{5e7,,KeyError}.
(Contributed by Xiang Zhang in bpo-33106@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33106}.)

@item 
Simplified AST for literals.  All constants will be represented as
@ref{2f1,,ast.Constant} instances.  Instantiating old classes @code{Num},
@code{Str}, @code{Bytes}, @code{NameConstant} and @code{Ellipsis} will return
an instance of @code{Constant}.
(Contributed by Serhiy Storchaka in bpo-32892@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32892}.)

@item 
@ref{c0f,,expanduser()} on Windows now prefers the 
@geindex USERPROFILE
@geindex environment variable; USERPROFILE
@code{USERPROFILE}
environment variable and does not use 
@geindex HOME
@geindex environment variable; HOME
@code{HOME}, which is not normally
set for regular user accounts.
(Contributed by Anthony Sottile in bpo-36264@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36264}.)

@item 
The exception @ref{4d5,,asyncio.CancelledError} now inherits from
@ref{7d8,,BaseException} rather than @ref{bd3,,Exception} and no longer inherits
from @ref{bd4,,concurrent.futures.CancelledError}.
(Contributed by Yury Selivanov in bpo-32528@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32528}.)

@item 
The function @ref{816,,asyncio.wait_for()} now correctly waits for cancellation
when using an instance of @ref{1c9,,asyncio.Task}. Previously, upon reaching
`timeout', it was cancelled and immediately returned.
(Contributed by Elvis Pranskevichus in bpo-32751@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32751}.)

@item 
The function @ref{c99,,asyncio.BaseTransport.get_extra_info()} now returns a safe
to use socket object when ‘socket’ is passed to the `name' parameter.
(Contributed by Yury Selivanov in bpo-37027@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37027}.)

@item 
@ref{c9a,,asyncio.BufferedProtocol} has graduated to the stable API.
@end itemize
@anchor{whatsnew/3 8 bpo-36085-whatsnew}@anchor{c9b}

@itemize *

@item 
DLL dependencies for extension modules and DLLs loaded with @ref{2e,,ctypes} on
Windows are now resolved more securely. Only the system paths, the directory
containing the DLL or PYD file, and directories added with
@ref{be3,,add_dll_directory()} are searched for load-time dependencies.
Specifically, 
@geindex PATH
@geindex environment variable; PATH
@code{PATH} and the current working directory are no longer
used, and modifications to these will no longer have any effect on normal DLL
resolution. If your application relies on these mechanisms, you should check
for @code{add_dll_directory()} and if it exists, use it to add your DLLs
directory while loading your library. Note that Windows 7 users will need to
ensure that Windows Update KB2533623 has been installed (this is also verified
by the installer).
(Contributed by Steve Dower in bpo-36085@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36085}.)

@item 
The header files and functions related to pgen have been removed after its
replacement by a pure Python implementation. (Contributed by Pablo Galindo
in bpo-36623@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36623}.)

@item 
@ref{32d,,types.CodeType} has a new parameter in the second position of the
constructor (`posonlyargcount') to support positional-only arguments defined
in 
@geindex Python Enhancement Proposals; PEP 570
PEP 570@footnote{https://peps.python.org/pep-0570/}. The first argument (`argcount') now represents the total
number of positional arguments (including positional-only arguments). The new
@code{replace()} method of @code{types.CodeType} can be used to make the code
future-proof.

@item 
The parameter @code{digestmod} for @ref{c9c,,hmac.new()} no longer uses the MD5 digest
by default.
@end itemize

@node Changes in the C API<5>,CPython bytecode changes<6>,Changes in the Python API<6>,Porting to Python 3 8
@anchor{whatsnew/3 8 changes-in-the-c-api}@anchor{c9d}
@subsubsection Changes in the C API



@itemize *

@item 
The @ref{c9e,,PyCompilerFlags} structure got a new `cf_feature_version'
field. It should be initialized to @code{PY_MINOR_VERSION}. The field is ignored
by default, and is used if and only if @code{PyCF_ONLY_AST} flag is set in
`cf_flags'.
(Contributed by Guido van Rossum in bpo-35766@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35766}.)

@item 
The @code{PyEval_ReInitThreads()} function has been removed from the C API.
It should not be called explicitly: use @ref{42e,,PyOS_AfterFork_Child()}
instead.
(Contributed by Victor Stinner in bpo-36728@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36728}.)

@item 
On Unix, C extensions are no longer linked to libpython except on Android
and Cygwin. When Python is embedded, @code{libpython} must not be loaded with
@code{RTLD_LOCAL}, but @code{RTLD_GLOBAL} instead. Previously, using
@code{RTLD_LOCAL}, it was already not possible to load C extensions which
were not linked to @code{libpython}, like C extensions of the standard
library built by the @code{*shared*} section of @code{Modules/Setup}.
(Contributed by Victor Stinner in bpo-21536@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21536}.)

@item 
Use of @code{#} variants of formats in parsing or building value (e.g.
@ref{3bf,,PyArg_ParseTuple()}, @ref{3c0,,Py_BuildValue()}, @ref{63f,,PyObject_CallFunction()},
etc.) without @code{PY_SSIZE_T_CLEAN} defined raises @code{DeprecationWarning} now.
It will be removed in 3.10 or 4.0.  Read @ref{3d3,,Parsing arguments and building values} for detail.
(Contributed by Inada Naoki in bpo-36381@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36381}.)

@item 
Instances of heap-allocated types (such as those created with
@ref{79e,,PyType_FromSpec()}) hold a reference to their type object.
Increasing the reference count of these type objects has been moved from
@ref{c67,,PyType_GenericAlloc()} to the more low-level functions,
@ref{c66,,PyObject_Init()} and @code{PyObject_INIT}.
This makes types created through @code{PyType_FromSpec()} behave like
other classes in managed code.

@ref{988,,Statically allocated types} are not affected.

For the vast majority of cases, there should be no side effect.
However, types that manually increase the reference count after allocating
an instance (perhaps to work around the bug) may now become immortal.
To avoid this, these classes need to call Py_DECREF on the type object
during instance deallocation.

To correctly port these types into 3.8, please apply the following
changes:


@itemize *

@item 
Remove @ref{790,,Py_INCREF} on the type object after allocating an
instance - if any.
This may happen after calling @ref{b82,,PyObject_New},
@ref{b83,,PyObject_NewVar}, @ref{c9f,,PyObject_GC_New()},
@ref{ca0,,PyObject_GC_NewVar()}, or any other custom allocator that uses
@ref{c66,,PyObject_Init()} or @code{PyObject_INIT}.

Example:

@example
static foo_struct *
foo_new(PyObject *type) @{
    foo_struct *foo = PyObject_GC_New(foo_struct, (PyTypeObject *) type);
    if (foo == NULL)
        return NULL;
#if PY_VERSION_HEX < 0x03080000
    // Workaround for Python issue 35810; no longer necessary in Python 3.8
    PY_INCREF(type)
#endif
    return foo;
@}
@end example

@item 
Ensure that all custom @code{tp_dealloc} functions of heap-allocated types
decrease the type’s reference count.

Example:

@example
static void
foo_dealloc(foo_struct *instance) @{
    PyObject *type = Py_TYPE(instance);
    PyObject_GC_Del(instance);
#if PY_VERSION_HEX >= 0x03080000
    // This was not needed before Python 3.8 (Python issue 35810)
    Py_DECREF(type);
#endif
@}
@end example
@end itemize

(Contributed by Eddie Elizondo in bpo-35810@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35810}.)

@item 
The @ref{ca1,,Py_DEPRECATED()} macro has been implemented for MSVC.
The macro now must be placed before the symbol name.

Example:

@example
Py_DEPRECATED(3.8) PyAPI_FUNC(int) Py_OldFunction(void);
@end example

(Contributed by Zackery Spytz in bpo-33407@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33407}.)

@item 
The interpreter does not pretend to support binary compatibility of
extension types across feature releases, anymore.  A @ref{ca2,,PyTypeObject}
exported by a third-party extension module is supposed to have all the
slots expected in the current Python version, including
@ref{ca3,,tp_finalize} (@ref{425,,Py_TPFLAGS_HAVE_FINALIZE}
is not checked anymore before reading @code{tp_finalize}).

(Contributed by Antoine Pitrou in bpo-32388@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32388}.)

@item 
The functions @code{PyNode_AddChild()} and @code{PyParser_AddToken()} now accept
two additional @code{int} arguments `end_lineno' and `end_col_offset'.

@item 
The @code{libpython38.a} file to allow MinGW tools to link directly against
@code{python38.dll} is no longer included in the regular Windows distribution.
If you require this file, it may be generated with the @code{gendef} and
@code{dlltool} tools, which are part of the MinGW binutils package:

@example
gendef - python38.dll > tmp.def
dlltool --dllname python38.dll --def tmp.def --output-lib libpython38.a
@end example

The location of an installed @code{pythonXY.dll} will depend on the
installation options and the version and language of Windows. See
@ref{ca4,,Using Python on Windows} for more information. The resulting library should be
placed in the same directory as @code{pythonXY.lib}, which is generally the
@code{libs} directory under your Python installation.

(Contributed by Steve Dower in bpo-37351@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37351}.)
@end itemize

@node CPython bytecode changes<6>,Demos and Tools<2>,Changes in the C API<5>,Porting to Python 3 8
@anchor{whatsnew/3 8 cpython-bytecode-changes}@anchor{ca5}
@subsubsection CPython bytecode changes



@itemize *

@item 
The interpreter loop  has been simplified by moving the logic of unrolling
the stack of blocks into the compiler.  The compiler emits now explicit
instructions for adjusting the stack of values and calling the
cleaning-up code for @ref{180,,break}, @ref{181,,continue} and
@ref{1b0,,return}.

Removed opcodes @code{BREAK_LOOP}, @code{CONTINUE_LOOP},
@code{SETUP_LOOP} and @code{SETUP_EXCEPT}.  Added new opcodes
@code{ROT_FOUR}, @code{BEGIN_FINALLY}, @code{CALL_FINALLY} and
@code{POP_FINALLY}.  Changed the behavior of @code{END_FINALLY}
and @code{WITH_CLEANUP_START}.

(Contributed by Mark Shannon, Antoine Pitrou and Serhiy Storchaka in
bpo-17611@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17611}.)

@item 
Added new opcode @ref{ca6,,END_ASYNC_FOR} for handling exceptions raised
when awaiting a next item in an @ref{ca7,,async for} loop.
(Contributed by Serhiy Storchaka in bpo-33041@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33041}.)

@item 
The @ref{ca8,,MAP_ADD} now expects the value as the first element in the
stack and the key as the second element. This change was made so the key
is always evaluated before the value in dictionary comprehensions, as
proposed by 
@geindex Python Enhancement Proposals; PEP 572
PEP 572@footnote{https://peps.python.org/pep-0572/}. (Contributed by Jörn Heissler in bpo-35224@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35224}.)
@end itemize

@node Demos and Tools<2>,,CPython bytecode changes<6>,Porting to Python 3 8
@anchor{whatsnew/3 8 demos-and-tools}@anchor{ca9}
@subsubsection Demos and Tools


Added a benchmark script for timing various ways to access variables:
@code{Tools/scripts/var_access_benchmark.py}.
(Contributed by Raymond Hettinger in bpo-35884@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35884}.)

Here’s a summary of performance improvements since Python 3.3:

@example
Python version                       3.3     3.4     3.5     3.6     3.7     3.8
--------------                       ---     ---     ---     ---     ---     ---

Variable and attribute read access:
    read_local                       4.0     7.1     7.1     5.4     5.1     3.9
    read_nonlocal                    5.3     7.1     8.1     5.8     5.4     4.4
    read_global                     13.3    15.5    19.0    14.3    13.6     7.6
    read_builtin                    20.0    21.1    21.6    18.5    19.0     7.5
    read_classvar_from_class        20.5    25.6    26.5    20.7    19.5    18.4
    read_classvar_from_instance     18.5    22.8    23.5    18.8    17.1    16.4
    read_instancevar                26.8    32.4    33.1    28.0    26.3    25.4
    read_instancevar_slots          23.7    27.8    31.3    20.8    20.8    20.2
    read_namedtuple                 68.5    73.8    57.5    45.0    46.8    18.4
    read_boundmethod                29.8    37.6    37.9    29.6    26.9    27.7

Variable and attribute write access:
    write_local                      4.6     8.7     9.3     5.5     5.3     4.3
    write_nonlocal                   7.3    10.5    11.1     5.6     5.5     4.7
    write_global                    15.9    19.7    21.2    18.0    18.0    15.8
    write_classvar                  81.9    92.9    96.0   104.6   102.1    39.2
    write_instancevar               36.4    44.6    45.8    40.0    38.9    35.5
    write_instancevar_slots         28.7    35.6    36.1    27.3    26.6    25.7

Data structure read access:
    read_list                       19.2    24.2    24.5    20.8    20.8    19.0
    read_deque                      19.9    24.7    25.5    20.2    20.6    19.8
    read_dict                       19.7    24.3    25.7    22.3    23.0    21.0
    read_strdict                    17.9    22.6    24.3    19.5    21.2    18.9

Data structure write access:
    write_list                      21.2    27.1    28.5    22.5    21.6    20.0
    write_deque                     23.8    28.7    30.1    22.7    21.8    23.5
    write_dict                      25.9    31.4    33.3    29.3    29.2    24.7
    write_strdict                   22.9    28.4    29.9    27.5    25.2    23.1

Stack (or queue) operations:
    list_append_pop                144.2    93.4   112.7    75.4    74.2    50.8
    deque_append_pop                30.4    43.5    57.0    49.4    49.2    42.5
    deque_append_popleft            30.8    43.7    57.3    49.7    49.7    42.8

Timing loop:
    loop_overhead                    0.3     0.5     0.6     0.4     0.3     0.3
@end example

The benchmarks were measured on an
Intel® Core™ i7-4960HQ processor@footnote{https://ark.intel.com/content/www/us/en/ark/products/76088/intel-core-i7-4960hq-processor-6m-cache-up-to-3-80-ghz.html}
running the macOS 64-bit builds found at
python.org@footnote{https://www.python.org/downloads/macos/}.
The benchmark script displays timings in nanoseconds.

@node Notable changes in Python 3 8 1,Notable changes in Python 3 8 2,Porting to Python 3 8,What’s New In Python 3 8
@anchor{whatsnew/3 8 notable-changes-in-python-3-8-1}@anchor{caa}
@subsection Notable changes in Python 3.8.1


Due to significant security concerns, the `reuse_address' parameter of
@ref{941,,asyncio.loop.create_datagram_endpoint()} is no longer supported. This is
because of the behavior of the socket option @code{SO_REUSEADDR} in UDP. For more
details, see the documentation for @code{loop.create_datagram_endpoint()}.
(Contributed by Kyle Stanley, Antoine Pitrou, and Yury Selivanov in
bpo-37228@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37228}.)

@node Notable changes in Python 3 8 2,Notable changes in Python 3 8 3,Notable changes in Python 3 8 1,What’s New In Python 3 8
@anchor{whatsnew/3 8 notable-changes-in-python-3-8-2}@anchor{cab}
@subsection Notable changes in Python 3.8.2


Fixed a regression with the @code{ignore} callback of @ref{c24,,shutil.copytree()}.
The argument types are now str and List[str] again.
(Contributed by Manuel Barkhau and Giampaolo Rodola in gh-83571@footnote{https://github.com/python/cpython/issues/83571}.)

@node Notable changes in Python 3 8 3,Notable changes in Python 3 8 8,Notable changes in Python 3 8 2,What’s New In Python 3 8
@anchor{whatsnew/3 8 notable-changes-in-python-3-8-3}@anchor{cac}
@subsection Notable changes in Python 3.8.3


The constant values of future flags in the @ref{0,,__future__} module
are updated in order to prevent collision with compiler flags. Previously
@code{PyCF_ALLOW_TOP_LEVEL_AWAIT} was clashing with @code{CO_FUTURE_DIVISION}.
(Contributed by Batuhan Taskaya in gh-83743@footnote{https://github.com/python/cpython/issues/83743})

@node Notable changes in Python 3 8 8,Notable changes in Python 3 8 9,Notable changes in Python 3 8 3,What’s New In Python 3 8
@anchor{whatsnew/3 8 notable-changes-in-python-3-8-8}@anchor{cad}
@subsection Notable changes in Python 3.8.8


Earlier Python versions allowed using both @code{;} and @code{&} as
query parameter separators in @ref{321,,urllib.parse.parse_qs()} and
@ref{320,,urllib.parse.parse_qsl()}.  Due to security concerns, and to conform with
newer W3C recommendations, this has been changed to allow only a single
separator key, with @code{&} as the default.  This change also affects
@code{cgi.parse()} and @code{cgi.parse_multipart()} as they use the affected
functions internally. For more details, please see their respective
documentation.
(Contributed by Adam Goldschmidt, Senthil Kumaran and Ken Jin in bpo-42967@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42967}.)

@node Notable changes in Python 3 8 9,Notable changes in Python 3 8 10,Notable changes in Python 3 8 8,What’s New In Python 3 8
@anchor{whatsnew/3 8 notable-changes-in-python-3-8-9}@anchor{cae}
@subsection Notable changes in Python 3.8.9


A security fix alters the @ref{afc,,ftplib.FTP} behavior to not trust the
IPv4 address sent from the remote server when setting up a passive data
channel.  We reuse the ftp server IP address instead.  For unusual code
requiring the old behavior, set a @code{trust_server_pasv_ipv4_address}
attribute on your FTP instance to @code{True}.  (See gh-87451@footnote{https://github.com/python/cpython/issues/87451})

@node Notable changes in Python 3 8 10,Notable changes in Python 3 8 10<2>,Notable changes in Python 3 8 9,What’s New In Python 3 8
@anchor{whatsnew/3 8 notable-changes-in-python-3-8-10}@anchor{caf}
@subsection Notable changes in Python 3.8.10


@menu
* macOS 11.0 (Big Sur) and Apple Silicon Mac support: macOS 11 0 Big Sur and Apple Silicon Mac support<2>. 

@end menu

@node macOS 11 0 Big Sur and Apple Silicon Mac support<2>,,,Notable changes in Python 3 8 10
@anchor{whatsnew/3 8 macos-11-0-big-sur-and-apple-silicon-mac-support}@anchor{cb0}
@subsubsection macOS 11.0 (Big Sur) and Apple Silicon Mac support


As of 3.8.10, Python now supports building and running on macOS 11
(Big Sur) and on Apple Silicon Macs (based on the @code{ARM64} architecture).
A new universal build variant, @code{universal2}, is now available to natively
support both @code{ARM64} and @code{Intel 64} in one set of executables.
Note that support for “weaklinking”, building binaries targeted for newer
versions of macOS that will also run correctly on older versions by
testing at runtime for missing features, is not included in this backport
from Python 3.9; to support a range of macOS versions, continue to target
for and build on the oldest version in the range.

(Originally contributed by Ronald Oussoren and Lawrence D’Anna in gh-85272@footnote{https://github.com/python/cpython/issues/85272},
with fixes by FX Coudert and Eli Rykoff, and backported to 3.8 by Maxime Bélanger
and Ned Deily)

@node Notable changes in Python 3 8 10<2>,Notable changes in Python 3 8 12,Notable changes in Python 3 8 10,What’s New In Python 3 8
@anchor{whatsnew/3 8 id1}@anchor{cb1}
@subsection Notable changes in Python 3.8.10


@menu
* urllib.parse: urllib parse<4>. 

@end menu

@node urllib parse<4>,,,Notable changes in Python 3 8 10<2>
@anchor{whatsnew/3 8 urllib-parse}@anchor{cb2}
@subsubsection urllib.parse


The presence of newline or tab characters in parts of a URL allows for some
forms of attacks. Following the WHATWG specification that updates 
@geindex RFC; RFC 3986
RFC 3986@footnote{https://datatracker.ietf.org/doc/html/rfc3986.html},
ASCII newline @code{\n}, @code{\r} and tab @code{\t} characters are stripped from the
URL by the parser in @ref{111,,urllib.parse} preventing such attacks. The removal
characters are controlled by a new module level variable
@code{urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE}. (See bpo-43882@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43882})

@node Notable changes in Python 3 8 12,Notable security feature in 3 8 14,Notable changes in Python 3 8 10<2>,What’s New In Python 3 8
@anchor{whatsnew/3 8 notable-changes-in-python-3-8-12}@anchor{cb3}
@subsection Notable changes in Python 3.8.12


@menu
* Changes in the Python API: Changes in the Python API<7>. 

@end menu

@node Changes in the Python API<7>,,,Notable changes in Python 3 8 12
@anchor{whatsnew/3 8 id2}@anchor{cb4}
@subsubsection Changes in the Python API


Starting with Python 3.8.12 the @ref{84,,ipaddress} module no longer accepts
any leading zeros in IPv4 address strings. Leading zeros are ambiguous and
interpreted as octal notation by some libraries. For example the legacy
function @ref{b60,,socket.inet_aton()} treats leading zeros as octal notation.
glibc implementation of modern @ref{b61,,inet_pton()} does not accept
any leading zeros.

(Originally contributed by Christian Heimes in bpo-36384@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36384}, and backported
to 3.8 by Achraf Merzouki.)

@node Notable security feature in 3 8 14,Notable changes in 3 8 17,Notable changes in Python 3 8 12,What’s New In Python 3 8
@anchor{whatsnew/3 8 notable-security-feature-in-3-8-14}@anchor{cb5}
@subsection Notable security feature in 3.8.14


Converting between @ref{19c,,int} and @ref{16a,,str} in bases other than 2
(binary), 4, 8 (octal), 16 (hexadecimal), or 32 such as base 10 (decimal)
now raises a @ref{2ee,,ValueError} if the number of digits in string form is
above a limit to avoid potential denial of service attacks due to the
algorithmic complexity. This is a mitigation for 
@geindex Common Vulnerabilities and Exposures; CVE 2020-10735
CVE 2020-10735@footnote{https://www.cve.org/CVERecord?id=CVE-2020-10735}.
This limit can be configured or disabled by environment variable, command
line flag, or @ref{df,,sys} APIs. See the @ref{80c,,integer string conversion length limitation} documentation.  The default limit
is 4300 digits in string form.

@node Notable changes in 3 8 17,,Notable security feature in 3 8 14,What’s New In Python 3 8
@anchor{whatsnew/3 8 notable-changes-in-3-8-17}@anchor{cb6}
@subsection Notable changes in 3.8.17


@menu
* tarfile: tarfile<6>. 

@end menu

@node tarfile<6>,,,Notable changes in 3 8 17
@anchor{whatsnew/3 8 id3}@anchor{cb7}
@subsubsection tarfile



@itemize *

@item 
The extraction methods in @ref{e4,,tarfile}, and @ref{697,,shutil.unpack_archive()},
have a new a `filter' argument that allows limiting tar features than may be
surprising or dangerous, such as creating files outside the destination
directory.
See @ref{698,,Extraction filters} for details.
In Python 3.12, use without the `filter' argument will show a
@ref{1a4,,DeprecationWarning}.
In Python 3.14, the default will switch to @code{'data'}.
(Contributed by Petr Viktorin in 
@geindex Python Enhancement Proposals; PEP 706
PEP 706@footnote{https://peps.python.org/pep-0706/}.)
@end itemize

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node What’s New In Python 3 7,What’s New In Python 3 6,What’s New In Python 3 8,What’s New in Python
@anchor{whatsnew/3 7 doc}@anchor{cb8}@anchor{whatsnew/3 7 translation-repo}@anchor{cb9}@anchor{whatsnew/3 7 what-s-new-in-python-3-7}@anchor{cba}
@section What’s New In Python 3.7


@*Editor: 
Elvis Pranskevichus <@email{elvis@@magic.io}>


@c Rules for maintenance:
@c 
@c * Anyone can add text to this document.  Do not spend very much time
@c on the wording of your changes, because your text will probably
@c get rewritten to some degree.
@c 
@c * The maintainer will go through Misc/NEWS periodically and add
@c changes; it's therefore more important to add your changes to
@c Misc/NEWS than to this file.
@c 
@c * This is not a complete list of every single change; completeness
@c is the purpose of Misc/NEWS.  Some changes I consider too small
@c or esoteric to include.  If such a change is added to the text,
@c I'll just remove it.  (This is another reason you shouldn't spend
@c too much time on writing your addition.)
@c 
@c * If you want to draw your new text to the attention of the
@c maintainer, add 'XXX' to the beginning of the paragraph or
@c section.
@c 
@c * It's OK to just add a fragmentary note about a change.  For
@c example: "XXX Describe the transmogrify() function added to the
@c socket module."  The maintainer will research the change and
@c write the necessary text.
@c 
@c * You can comment out your additions if you like, but it's not
@c necessary (especially when a final release is some months away).
@c 
@c * Credit the author of a patch or bugfix.   Just the name is
@c sufficient; the e-mail address isn't necessary.
@c 
@c * It's helpful to add the bug/patch number as a comment:
@c 
@c XXX Describe the transmogrify() function added to the socket
@c module.
@c (Contributed by P.Y. Developer in :issue:`12345`.)
@c 
@c This saves the maintainer the effort of going through the Git log
@c when researching a change.

This article explains the new features in Python 3.7, compared to 3.6.
Python 3.7 was released on June 27, 2018.
For full details, see the @ref{143,,changelog}.

@menu
* Summary – Release Highlights: Summary – Release Highlights<2>. 
* New Features: New Features<12>. 
* Other Language Changes: Other Language Changes<7>. 
* New Modules: New Modules<7>. 
* Improved Modules: Improved Modules<7>. 
* C API Changes: C API Changes<6>. 
* Build Changes: Build Changes<6>. 
* Optimizations: Optimizations<8>. 
* Other CPython Implementation Changes: Other CPython Implementation Changes<2>. 
* Deprecated Python Behavior:: 
* Deprecated Python modules@comma{} functions and methods: Deprecated Python modules functions and methods. 
* Deprecated functions and types of the C API:: 
* Platform Support Removals:: 
* API and Feature Removals: API and Feature Removals<2>. 
* Module Removals:: 
* Windows-only Changes:: 
* Porting to Python 3.7: Porting to Python 3 7. 
* Notable changes in Python 3.7.1: Notable changes in Python 3 7 1. 
* Notable changes in Python 3.7.2: Notable changes in Python 3 7 2. 
* Notable changes in Python 3.7.6: Notable changes in Python 3 7 6. 
* Notable changes in Python 3.7.10: Notable changes in Python 3 7 10. 
* Notable changes in Python 3.7.11: Notable changes in Python 3 7 11. 
* Notable security feature in 3.7.14: Notable security feature in 3 7 14. 

@end menu

@node Summary – Release Highlights<2>,New Features<12>,,What’s New In Python 3 7
@anchor{whatsnew/3 7 summary-release-highlights}@anchor{cbb}
@subsection Summary – Release Highlights


@c This section singles out the most important changes in Python 3.7.
@c Brevity is key.

New syntax features:


@itemize *

@item 
@ref{cbc,,PEP 563}, postponed evaluation of type annotations.
@end itemize

Backwards incompatible syntax changes:


@itemize *

@item 
@ref{940,,async} and @ref{18e,,await} are now reserved keywords.
@end itemize

New library modules:


@itemize *

@item 
@ref{28,,contextvars}: @ref{cbd,,PEP 567 – Context Variables}

@item 
@ref{33,,dataclasses}: @ref{cbe,,PEP 557 – Data Classes}

@item 
@ref{cbf,,importlib.resources}
@end itemize

New built-in features:


@itemize *

@item 
@ref{cc0,,PEP 553}, the new @ref{273,,breakpoint()} function.
@end itemize

Python data model improvements:


@itemize *

@item 
@ref{cc1,,PEP 562}, customization of access to
module attributes.

@item 
@ref{cc2,,PEP 560}, core support for typing module and
generic types.

@item 
the insertion-order preservation nature of @ref{cc3,,dict}
objects has been declared@footnote{https://mail.python.org/pipermail/python-dev/2017-December/151283.html} to be an official
part of the Python language spec.
@end itemize

Significant improvements in the standard library:


@itemize *

@item 
The @ref{b,,asyncio} module has received new features, significant
@ref{cc4,,usability and performance improvements}.

@item 
The @ref{f4,,time} module gained support for
@ref{cc5,,functions with nanosecond resolution}.
@end itemize

CPython implementation improvements:


@itemize *

@item 
Avoiding the use of ASCII as a default text encoding:


@itemize *

@item 
@ref{cc6,,PEP 538}, legacy C locale coercion

@item 
@ref{cc7,,PEP 540}, forced UTF-8 runtime mode
@end itemize

@item 
@ref{cc8,,PEP 552}, deterministic .pycs

@item 
@ref{cc9,,New Python Development Mode}

@item 
@ref{cca,,PEP 565}, improved @ref{1a4,,DeprecationWarning}
handling
@end itemize

C API improvements:


@itemize *

@item 
@ref{ccb,,PEP 539}, new C API for thread-local storage
@end itemize

Documentation improvements:


@itemize *

@item 
@ref{ccc,,PEP 545}, Python documentation translations

@item 
New documentation translations: Japanese@footnote{https://docs.python.org/ja/},
French@footnote{https://docs.python.org/fr/}, and
Korean@footnote{https://docs.python.org/ko/}.
@end itemize

This release features notable performance improvements in many areas.
The @ref{ccd,,Optimizations} section lists them in detail.

For a list of changes that may affect compatibility with previous Python
releases please refer to the @ref{cce,,Porting to Python 3.7} section.

@node New Features<12>,Other Language Changes<7>,Summary – Release Highlights<2>,What’s New In Python 3 7
@anchor{whatsnew/3 7 new-features}@anchor{ccf}
@subsection New Features


@menu
* PEP 563; Postponed Evaluation of Annotations: PEP 563 Postponed Evaluation of Annotations. 
* PEP 538; Legacy C Locale Coercion: PEP 538 Legacy C Locale Coercion. 
* PEP 540; Forced UTF-8 Runtime Mode: PEP 540 Forced UTF-8 Runtime Mode. 
* PEP 553; Built-in breakpoint(): PEP 553 Built-in breakpoint. 
* PEP 539; New C API for Thread-Local Storage: PEP 539 New C API for Thread-Local Storage. 
* PEP 562; Customization of Access to Module Attributes: PEP 562 Customization of Access to Module Attributes. 
* PEP 564; New Time Functions With Nanosecond Resolution: PEP 564 New Time Functions With Nanosecond Resolution. 
* PEP 565; Show DeprecationWarning in __main__: PEP 565 Show DeprecationWarning in __main__. 
* PEP 560; Core Support for typing module and Generic Types: PEP 560 Core Support for typing module and Generic Types. 
* PEP 552; Hash-based .pyc Files: PEP 552 Hash-based pyc Files. 
* PEP 545; Python Documentation Translations: PEP 545 Python Documentation Translations. 
* Python Development Mode (-X dev): Python Development Mode -X dev. 

@end menu

@node PEP 563 Postponed Evaluation of Annotations,PEP 538 Legacy C Locale Coercion,,New Features<12>
@anchor{whatsnew/3 7 pep-563-postponed-evaluation-of-annotations}@anchor{cd0}@anchor{whatsnew/3 7 whatsnew37-pep563}@anchor{cbc}
@subsubsection PEP 563: Postponed Evaluation of Annotations


The advent of type hints in Python uncovered two glaring usability issues
with the functionality of annotations added in 
@geindex Python Enhancement Proposals; PEP 3107
PEP 3107@footnote{https://peps.python.org/pep-3107/} and refined
further in 
@geindex Python Enhancement Proposals; PEP 526
PEP 526@footnote{https://peps.python.org/pep-0526/}:


@itemize *

@item 
annotations could only use names which were already available in the
current scope, in other words they didn’t support forward references
of any kind; and

@item 
annotating source code had adverse effects on startup time of Python
programs.
@end itemize

Both of these issues are fixed by postponing the evaluation of
annotations.  Instead of compiling code which executes expressions in
annotations at their definition time, the compiler stores the annotation
in a string form equivalent to the AST of the expression in question.
If needed, annotations can be resolved at runtime using
@ref{8c2,,typing.get_type_hints()}.  In the common case where this is not
required, the annotations are cheaper to store (since short strings
are interned by the interpreter) and make startup time faster.

Usability-wise, annotations now support forward references, making the
following syntax valid:

@example
class C:
    @@classmethod
    def from_string(cls, source: str) -> C:
        ...

    def validate_b(self, obj: B) -> bool:
        ...

class B:
    ...
@end example

Since this change breaks compatibility, the new behavior needs to be enabled
on a per-module basis in Python 3.7 using a @ref{0,,__future__} import:

@example
from __future__ import annotations
@end example

It will become the default in Python 3.10.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 563

@item PEP 563@footnote{https://peps.python.org/pep-0563/} – Postponed evaluation of annotations

PEP written and implemented by Łukasz Langa.
@end table


@node PEP 538 Legacy C Locale Coercion,PEP 540 Forced UTF-8 Runtime Mode,PEP 563 Postponed Evaluation of Annotations,New Features<12>
@anchor{whatsnew/3 7 pep-538-legacy-c-locale-coercion}@anchor{cd1}@anchor{whatsnew/3 7 whatsnew37-pep538}@anchor{cc6}
@subsubsection PEP 538: Legacy C Locale Coercion


An ongoing challenge within the Python 3 series has been determining a sensible
default strategy for handling the “7-bit ASCII” text encoding assumption
currently implied by the use of the default C or POSIX locale on non-Windows
platforms.

@geindex Python Enhancement Proposals; PEP 538
PEP 538@footnote{https://peps.python.org/pep-0538/} updates the default interpreter command line interface to
automatically coerce that locale to an available UTF-8 based locale as
described in the documentation of the new 
@geindex PYTHONCOERCECLOCALE
@geindex environment variable; PYTHONCOERCECLOCALE
@ref{cd2,,PYTHONCOERCECLOCALE}
environment variable. Automatically setting @code{LC_CTYPE} this way means that
both the core interpreter and locale-aware C extensions (such as
@ref{bf,,readline}) will assume the use of UTF-8 as the default text encoding,
rather than ASCII.

The platform support definition in 
@geindex Python Enhancement Proposals; PEP 11
PEP 11@footnote{https://peps.python.org/pep-0011/} has also been updated to limit
full text handling support to suitably configured non-ASCII based locales.

As part of this change, the default error handler for @ref{760,,stdin} and
@ref{cd3,,stdout} is now @code{surrogateescape} (rather than @code{strict}) when
using any of the defined coercion target locales (currently @code{C.UTF-8},
@code{C.utf8}, and @code{UTF-8}).  The default error handler for @ref{b39,,stderr}
continues to be @code{backslashreplace}, regardless of locale.

Locale coercion is silent by default, but to assist in debugging potentially
locale related integration problems, explicit warnings (emitted directly on
@ref{b39,,stderr}) can be requested by setting @code{PYTHONCOERCECLOCALE=warn}.
This setting will also cause the Python runtime to emit a warning if the
legacy C locale remains active when the core interpreter is initialized.

While 
@geindex Python Enhancement Proposals; PEP 538
PEP 538@footnote{https://peps.python.org/pep-0538/}’s locale coercion has the benefit of also affecting extension
modules (such as GNU @code{readline}), as well as child processes (including those
running non-Python applications and older versions of Python), it has the
downside of requiring that a suitable target locale be present on the running
system. To better handle the case where no suitable target locale is available
(as occurs on RHEL/CentOS 7, for example), Python 3.7 also implements
@ref{cc7,,PEP 540; Forced UTF-8 Runtime Mode}.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 538

@item PEP 538@footnote{https://peps.python.org/pep-0538/} – Coercing the legacy C locale to a UTF-8 based locale

PEP written and implemented by Nick Coghlan.
@end table


@node PEP 540 Forced UTF-8 Runtime Mode,PEP 553 Built-in breakpoint,PEP 538 Legacy C Locale Coercion,New Features<12>
@anchor{whatsnew/3 7 pep-540-forced-utf-8-runtime-mode}@anchor{cd4}@anchor{whatsnew/3 7 whatsnew37-pep540}@anchor{cc7}
@subsubsection PEP 540: Forced UTF-8 Runtime Mode


The new @ref{170,,-X} @code{utf8} command line option and 
@geindex PYTHONUTF8
@geindex environment variable; PYTHONUTF8
@ref{cd5,,PYTHONUTF8}
environment variable can be used to enable the @ref{868,,Python UTF-8 Mode}.

When in UTF-8 mode, CPython ignores the locale settings, and uses the
UTF-8 encoding by default.  The error handlers for @ref{760,,sys.stdin} and
@ref{cd3,,sys.stdout} streams are set to @code{surrogateescape}.

The forced UTF-8 mode can be used to change the text handling behavior in
an embedded Python interpreter without changing the locale settings of
an embedding application.

While 
@geindex Python Enhancement Proposals; PEP 540
PEP 540@footnote{https://peps.python.org/pep-0540/}’s UTF-8 mode has the benefit of working regardless of which
locales are available on the running system, it has the downside of having no
effect on extension modules (such as GNU @code{readline}), child processes running
non-Python applications, and child processes running older versions of Python.
To reduce the risk of corrupting text data when communicating with such
components, Python 3.7 also implements @ref{cc7,,PEP 540; Forced UTF-8 Runtime Mode}).

The UTF-8 mode is enabled by default when the locale is @code{C} or @code{POSIX}, and
the 
@geindex Python Enhancement Proposals; PEP 538
PEP 538@footnote{https://peps.python.org/pep-0538/} locale coercion feature fails to change it to a UTF-8 based
alternative (whether that failure is due to @code{PYTHONCOERCECLOCALE=0} being set,
@code{LC_ALL} being set, or the lack of a suitable target locale).


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 540

@item PEP 540@footnote{https://peps.python.org/pep-0540/} – Add a new UTF-8 mode

PEP written and implemented by Victor Stinner
@end table


@node PEP 553 Built-in breakpoint,PEP 539 New C API for Thread-Local Storage,PEP 540 Forced UTF-8 Runtime Mode,New Features<12>
@anchor{whatsnew/3 7 pep-553-built-in-breakpoint}@anchor{cd6}@anchor{whatsnew/3 7 whatsnew37-pep553}@anchor{cc0}
@subsubsection PEP 553: Built-in @code{breakpoint()}


Python 3.7 includes the new built-in @ref{273,,breakpoint()} function as
an easy and consistent way to enter the Python debugger.

Built-in @code{breakpoint()} calls @ref{cd7,,sys.breakpointhook()}.  By default, the
latter imports @ref{aa,,pdb} and then calls @code{pdb.set_trace()}, but by binding
@code{sys.breakpointhook()} to the function of your choosing, @code{breakpoint()} can
enter any debugger. Additionally, the environment variable
@geindex PYTHONBREAKPOINT
@geindex environment variable; PYTHONBREAKPOINT
@ref{cd8,,PYTHONBREAKPOINT} can be set to the callable of your debugger of
choice.  Set @code{PYTHONBREAKPOINT=0} to completely disable built-in
@code{breakpoint()}.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 553

@item PEP 553@footnote{https://peps.python.org/pep-0553/} – Built-in breakpoint()

PEP written and implemented by Barry Warsaw
@end table


@node PEP 539 New C API for Thread-Local Storage,PEP 562 Customization of Access to Module Attributes,PEP 553 Built-in breakpoint,New Features<12>
@anchor{whatsnew/3 7 pep-539-new-c-api-for-thread-local-storage}@anchor{cd9}@anchor{whatsnew/3 7 whatsnew37-pep539}@anchor{ccb}
@subsubsection PEP 539: New C API for Thread-Local Storage


While Python provides a C API for thread-local storage support; the existing
@ref{cda,,Thread Local Storage (TLS) API} has used
int to represent TLS keys across all platforms.  This has not
generally been a problem for officially support platforms, but that is neither
POSIX-compliant, nor portable in any practical sense.

@geindex Python Enhancement Proposals; PEP 539
PEP 539@footnote{https://peps.python.org/pep-0539/} changes this by providing a new @ref{cdb,,Thread Specific Storage (TSS) API} to CPython which supersedes use of the
existing TLS API within the CPython interpreter, while deprecating the existing
API.  The TSS API uses a new type @ref{cdc,,Py_tss_t} instead of int
to represent TSS keys–an opaque type the definition of which may depend on
the underlying TLS implementation.  Therefore, this will allow to build CPython
on platforms where the native TLS key is defined in a way that cannot be safely
cast to int.

Note that on platforms where the native TLS key is defined in a way that cannot
be safely cast to int, all functions of the existing TLS API will be
no-op and immediately return failure. This indicates clearly that the old API
is not supported on platforms where it cannot be used reliably, and that no
effort will be made to add such support.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 539

@item PEP 539@footnote{https://peps.python.org/pep-0539/} – A New C-API for Thread-Local Storage in CPython

PEP written by Erik M. Bray; implementation by Masayuki Yamamoto.
@end table


@node PEP 562 Customization of Access to Module Attributes,PEP 564 New Time Functions With Nanosecond Resolution,PEP 539 New C API for Thread-Local Storage,New Features<12>
@anchor{whatsnew/3 7 pep-562-customization-of-access-to-module-attributes}@anchor{cdd}@anchor{whatsnew/3 7 whatsnew37-pep562}@anchor{cc1}
@subsubsection PEP 562: Customization of Access to Module Attributes


Python 3.7 allows defining @ref{cde,,__getattr__()} on modules and will call
it whenever a module attribute is otherwise not found.  Defining
@ref{cdf,,__dir__()} on modules is now also allowed.

A typical example of where this may be useful is module attribute deprecation
and lazy loading.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 562

@item PEP 562@footnote{https://peps.python.org/pep-0562/} – Module @code{__getattr__} and @code{__dir__}

PEP written and implemented by Ivan Levkivskyi
@end table


@node PEP 564 New Time Functions With Nanosecond Resolution,PEP 565 Show DeprecationWarning in __main__,PEP 562 Customization of Access to Module Attributes,New Features<12>
@anchor{whatsnew/3 7 pep-564-new-time-functions-with-nanosecond-resolution}@anchor{ce0}@anchor{whatsnew/3 7 whatsnew37-pep564}@anchor{cc5}
@subsubsection PEP 564: New Time Functions With Nanosecond Resolution


The resolution of clocks in modern systems can exceed the limited precision
of a floating-point number returned by the @ref{55d,,time.time()} function
and its variants.  To avoid loss of precision, 
@geindex Python Enhancement Proposals; PEP 564
PEP 564@footnote{https://peps.python.org/pep-0564/} adds six new
“nanosecond” variants of the existing timer functions to the @ref{f4,,time}
module:


@itemize *

@item 
@ref{ce1,,time.clock_gettime_ns()}

@item 
@ref{ce2,,time.clock_settime_ns()}

@item 
@ref{ce3,,time.monotonic_ns()}

@item 
@ref{ce4,,time.perf_counter_ns()}

@item 
@ref{ce5,,time.process_time_ns()}

@item 
@ref{ce6,,time.time_ns()}
@end itemize

The new functions return the number of nanoseconds as an integer value.

@geindex Python Enhancement Proposals; PEP 0564#annex-clocks-resolution-in-python
Measurements@footnote{https://peps.python.org/pep-0564/#annex-clocks-resolution-in-python}
show that on Linux and Windows the resolution of @ref{ce6,,time.time_ns()} is
approximately 3 times better than that of @ref{55d,,time.time()}.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 564

@item PEP 564@footnote{https://peps.python.org/pep-0564/} – Add new time functions with nanosecond resolution

PEP written and implemented by Victor Stinner
@end table


@node PEP 565 Show DeprecationWarning in __main__,PEP 560 Core Support for typing module and Generic Types,PEP 564 New Time Functions With Nanosecond Resolution,New Features<12>
@anchor{whatsnew/3 7 pep-565-show-deprecationwarning-in-main}@anchor{ce7}@anchor{whatsnew/3 7 whatsnew37-pep565}@anchor{cca}
@subsubsection PEP 565: Show DeprecationWarning in @code{__main__}


The default handling of @ref{1a4,,DeprecationWarning} has been changed such that
these warnings are once more shown by default, but only when the code
triggering them is running directly in the @ref{1,,__main__} module.  As a result,
developers of single file scripts and those using Python interactively should
once again start seeing deprecation warnings for the APIs they use, but
deprecation warnings triggered by imported application, library and framework
modules will continue to be hidden by default.

As a result of this change, the standard library now allows developers to choose
between three different deprecation warning behaviours:


@itemize *

@item 
@ref{659,,FutureWarning}: always displayed by default, recommended for warnings
intended to be seen by application end users (e.g. for deprecated application
configuration settings).

@item 
@ref{1a4,,DeprecationWarning}: displayed by default only in @ref{1,,__main__} and when
running tests, recommended for warnings intended to be seen by other Python
developers where a version upgrade may result in changed behaviour or an
error.

@item 
@ref{acc,,PendingDeprecationWarning}: displayed by default only when running
tests, intended for cases where a future version upgrade will change the
warning category to @ref{1a4,,DeprecationWarning} or @ref{659,,FutureWarning}.
@end itemize

Previously both @ref{1a4,,DeprecationWarning} and @ref{acc,,PendingDeprecationWarning}
were only visible when running tests, which meant that developers primarily
writing single file scripts or using Python interactively could be surprised
by breaking changes in the APIs they used.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 565

@item PEP 565@footnote{https://peps.python.org/pep-0565/} – Show DeprecationWarning in @code{__main__}

PEP written and implemented by Nick Coghlan
@end table


@node PEP 560 Core Support for typing module and Generic Types,PEP 552 Hash-based pyc Files,PEP 565 Show DeprecationWarning in __main__,New Features<12>
@anchor{whatsnew/3 7 pep-560-core-support-for-typing-module-and-generic-types}@anchor{ce8}@anchor{whatsnew/3 7 whatsnew37-pep560}@anchor{cc2}
@subsubsection PEP 560: Core Support for @code{typing} module and Generic Types


Initially 
@geindex Python Enhancement Proposals; PEP 484
PEP 484@footnote{https://peps.python.org/pep-0484/} was designed in such way that it would not introduce `any'
changes to the core CPython interpreter. Now type hints and the @ref{10b,,typing}
module are extensively used by the community, so this restriction is removed.
The PEP introduces two special methods @ref{948,,__class_getitem__()} and
@ref{ce9,,__mro_entries__()}, these methods are now used by most classes and special
constructs in @code{typing}. As a result, the speed of various operations
with types increased up to 7 times, the generic types can be used without
metaclass conflicts, and several long standing bugs in @code{typing} module are
fixed.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 560

@item PEP 560@footnote{https://peps.python.org/pep-0560/} – Core support for typing module and generic types

PEP written and implemented by Ivan Levkivskyi
@end table


@node PEP 552 Hash-based pyc Files,PEP 545 Python Documentation Translations,PEP 560 Core Support for typing module and Generic Types,New Features<12>
@anchor{whatsnew/3 7 pep-552-hash-based-pyc-files}@anchor{cea}@anchor{whatsnew/3 7 whatsnew37-pep552}@anchor{cc8}
@subsubsection PEP 552: Hash-based .pyc Files


Python has traditionally checked the up-to-dateness of bytecode cache files
(i.e., @code{.pyc} files) by comparing the source metadata (last-modified timestamp
and size) with source metadata saved in the cache file header when it was
generated. While effective, this invalidation method has its drawbacks.  When
filesystem timestamps are too coarse, Python can miss source updates, leading to
user confusion. Additionally, having a timestamp in the cache file is
problematic for build reproducibility@footnote{https://reproducible-builds.org/} and
content-based build systems.

@geindex Python Enhancement Proposals; PEP 552
PEP 552@footnote{https://peps.python.org/pep-0552/} extends the pyc format to allow the hash of the source file to be
used for invalidation instead of the source timestamp. Such @code{.pyc} files are
called “hash-based”. By default, Python still uses timestamp-based invalidation
and does not generate hash-based @code{.pyc} files at runtime. Hash-based @code{.pyc}
files may be generated with @ref{b8,,py_compile} or @ref{21,,compileall}.

Hash-based @code{.pyc} files come in two variants: checked and unchecked. Python
validates checked hash-based @code{.pyc} files against the corresponding source
files at runtime but doesn’t do so for unchecked hash-based pycs. Unchecked
hash-based @code{.pyc} files are a useful performance optimization for environments
where a system external to Python (e.g., the build system) is responsible for
keeping @code{.pyc} files up-to-date.

See @ref{803,,Cached bytecode invalidation} for more information.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 552

@item PEP 552@footnote{https://peps.python.org/pep-0552/} – Deterministic pycs

PEP written and implemented by Benjamin Peterson
@end table


@node PEP 545 Python Documentation Translations,Python Development Mode -X dev,PEP 552 Hash-based pyc Files,New Features<12>
@anchor{whatsnew/3 7 pep-545-python-documentation-translations}@anchor{ceb}@anchor{whatsnew/3 7 whatsnew37-pep545}@anchor{ccc}
@subsubsection PEP 545: Python Documentation Translations


@geindex Python Enhancement Proposals; PEP 545
PEP 545@footnote{https://peps.python.org/pep-0545/} describes the process of creating and maintaining Python
documentation translations.

Three new translations have been added:


@itemize -

@item 
Japanese: @indicateurl{https://docs.python.org/ja/}

@item 
French: @indicateurl{https://docs.python.org/fr/}

@item 
Korean: @indicateurl{https://docs.python.org/ko/}
@end itemize


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 545

@item PEP 545@footnote{https://peps.python.org/pep-0545/} – Python Documentation Translations

PEP written and implemented by Julien Palard, Inada Naoki, and
Victor Stinner.
@end table


@node Python Development Mode -X dev,,PEP 545 Python Documentation Translations,New Features<12>
@anchor{whatsnew/3 7 python-development-mode-x-dev}@anchor{cec}@anchor{whatsnew/3 7 whatsnew37-devmode}@anchor{cc9}
@subsubsection Python Development Mode (-X dev)


The new @ref{170,,-X} @code{dev} command line option or the new
@geindex PYTHONDEVMODE
@geindex environment variable; PYTHONDEVMODE
@ref{ced,,PYTHONDEVMODE} environment variable can be used to enable
@ref{509,,Python Development Mode}.  When in development mode, Python performs
additional runtime checks that are too expensive to be enabled by default.
See @ref{509,,Python Development Mode} documentation for the full
description.

@node Other Language Changes<7>,New Modules<7>,New Features<12>,What’s New In Python 3 7
@anchor{whatsnew/3 7 other-language-changes}@anchor{cee}
@subsection Other Language Changes



@itemize *

@item 
An @ref{18e,,await} expression and comprehensions containing an
@ref{ca7,,async for} clause were illegal in the expressions in
@ref{19b,,formatted string literals} due to a problem with the
implementation.  In Python 3.7 this restriction was lifted.

@item 
More than 255 arguments can now be passed to a function, and a function can
now have more than 255 parameters. (Contributed by Serhiy Storchaka in
bpo-12844@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12844} and bpo-18896@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18896}.)

@item 
@ref{191,,bytes.fromhex()} and @ref{192,,bytearray.fromhex()} now ignore all ASCII
whitespace, not only spaces. (Contributed by Robert Xiao in bpo-28927@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28927}.)

@item 
@ref{16a,,str}, @ref{193,,bytes}, and @ref{342,,bytearray} gained support for
the new @ref{cef,,isascii()} method, which can be used to
test if a string or bytes contain only the ASCII characters.
(Contributed by INADA Naoki in bpo-32677@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32677}.)

@item 
@ref{65b,,ImportError} now displays module name and module @code{__file__} path when
@code{from ... import ...} fails. (Contributed by Matthias Bussonnier in
bpo-29546@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29546}.)

@item 
Circular imports involving absolute imports with binding a submodule to
a name are now supported.
(Contributed by Serhiy Storchaka in bpo-30024@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30024}.)

@item 
@code{object.__format__(x, '@w{'})} is now equivalent to @code{str(x)} rather than
@code{format(str(self), '@w{'})}.
(Contributed by Serhiy Storchaka in bpo-28974@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28974}.)

@item 
In order to better support dynamic creation of stack traces,
@ref{cf0,,types.TracebackType} can now be instantiated from Python code, and
the @ref{cf1,,tb_next} attribute on
@ref{cf2,,tracebacks} is now writable.
(Contributed by Nathaniel J. Smith in bpo-30579@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30579}.)

@item 
When using the @ref{23e,,-m} switch, @code{sys.path[0]} is now eagerly expanded
to the full starting directory path, rather than being left as the empty
directory (which allows imports from the `current' working directory at the
time when an import occurs)
(Contributed by Nick Coghlan in bpo-33053@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33053}.)

@item 
The new @ref{170,,-X} @code{importtime} option or the
@geindex PYTHONPROFILEIMPORTTIME
@geindex environment variable; PYTHONPROFILEIMPORTTIME
@ref{cf3,,PYTHONPROFILEIMPORTTIME} environment variable can be used to show
the timing of each module import.
(Contributed by Inada Naoki in bpo-31415@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31415}.)
@end itemize

@node New Modules<7>,Improved Modules<7>,Other Language Changes<7>,What’s New In Python 3 7
@anchor{whatsnew/3 7 new-modules}@anchor{cf4}
@subsection New Modules


@menu
* contextvars: contextvars<2>. 
* dataclasses: dataclasses<3>. 
* importlib.resources: importlib resources<2>. 

@end menu

@node contextvars<2>,dataclasses<3>,,New Modules<7>
@anchor{whatsnew/3 7 contextvars}@anchor{cf5}@anchor{whatsnew/3 7 whatsnew37-pep567}@anchor{cbd}
@subsubsection contextvars


The new @ref{28,,contextvars} module and a set of
@ref{cf6,,new C APIs} introduce
support for `context variables'.  Context variables are conceptually
similar to thread-local variables.  Unlike TLS, context variables
support asynchronous code correctly.

The @ref{b,,asyncio} and @ref{3a,,decimal} modules have been updated to use
and support context variables out of the box.  Particularly the active
decimal context is now stored in a context variable, which allows
decimal operations to work with the correct context in asynchronous code.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 567

@item PEP 567@footnote{https://peps.python.org/pep-0567/} – Context Variables

PEP written and implemented by Yury Selivanov
@end table


@node dataclasses<3>,importlib resources<2>,contextvars<2>,New Modules<7>
@anchor{whatsnew/3 7 dataclasses}@anchor{cf7}@anchor{whatsnew/3 7 whatsnew37-pep557}@anchor{cbe}
@subsubsection dataclasses


The new @ref{4e2,,dataclass()} decorator provides a way to declare
`data classes'.  A data class describes its attributes using class variable
annotations.  Its constructor and other magic methods, such as
@ref{830,,__repr__()}, @ref{cf8,,__eq__()}, and
@ref{cf9,,__hash__()} are generated automatically.

Example:

@example
@@dataclass
class Point:
    x: float
    y: float
    z: float = 0.0

p = Point(1.5, 2.5)
print(p)   # produces "Point(x=1.5, y=2.5, z=0.0)"
@end example


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 557

@item PEP 557@footnote{https://peps.python.org/pep-0557/} – Data Classes

PEP written and implemented by Eric V. Smith
@end table


@node importlib resources<2>,,dataclasses<3>,New Modules<7>
@anchor{whatsnew/3 7 importlib-resources}@anchor{cfa}@anchor{whatsnew/3 7 whatsnew37-importlib-resources}@anchor{cbf}
@subsubsection importlib.resources


The new @ref{7f,,importlib.resources} module provides several new APIs and one
new ABC for access to, opening, and reading `resources' inside packages.
Resources are roughly similar to files inside packages, but they needn’t
be actual files on the physical file system.  Module loaders can provide a
@code{get_resource_reader()} function which returns
a @code{importlib.abc.ResourceReader} instance to support this
new API.  Built-in file path loaders and zip file loaders both support this.

Contributed by Barry Warsaw and Brett Cannon in bpo-32248@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32248}.


@subsubheading See also


importlib_resources@footnote{https://importlib-resources.readthedocs.io/en/latest/}
– a PyPI backport for earlier Python versions.


@node Improved Modules<7>,C API Changes<6>,New Modules<7>,What’s New In Python 3 7
@anchor{whatsnew/3 7 improved-modules}@anchor{cfb}
@subsection Improved Modules


@menu
* argparse: argparse<5>. 
* asyncio: asyncio<10>. 
* binascii:: 
* calendar: calendar<3>. 
* collections: collections<2>. 
* compileall: compileall<3>. 
* concurrent.futures: concurrent futures<4>. 
* contextlib: contextlib<3>. 
* cProfile: cProfile<2>. 
* crypt:: 
* datetime: datetime<5>. 
* dbm: dbm<2>. 
* decimal: decimal<2>. 
* dis: dis<4>. 
* distutils: distutils<4>. 
* enum: enum<5>. 
* functools: functools<4>. 
* gc: gc<6>. 
* hmac: hmac<3>. 
* http.client: http client. 
* http.server: http server. 
* idlelib and IDLE:: 
* importlib: importlib<4>. 
* io: io<6>. 
* ipaddress: ipaddress<3>. 
* itertools: itertools<6>. 
* locale: locale<4>. 
* logging: logging<3>. 
* math: math<7>. 
* mimetypes: mimetypes<3>. 
* msilib:: 
* multiprocessing: multiprocessing<5>. 
* os: os<8>. 
* pathlib: pathlib<11>. 
* pdb: pdb<6>. 
* py_compile: py_compile<3>. 
* pydoc: pydoc<3>. 
* queue: queue<2>. 
* re: re<5>. 
* signal: signal<2>. 
* socket: socket<6>. 
* socketserver:: 
* sqlite3: sqlite3<7>. 
* ssl: ssl<6>. 
* string: string<2>. 
* subprocess: subprocess<2>. 
* sys: sys<8>. 
* time: time<5>. 
* tkinter: tkinter<6>. 
* tracemalloc: tracemalloc<2>. 
* types: types<5>. 
* unicodedata: unicodedata<7>. 
* unittest: unittest<8>. 
* unittest.mock: unittest mock. 
* urllib.parse: urllib parse<5>. 
* uu:: 
* uuid: uuid<4>. 
* warnings: warnings<3>. 
* xml: xml<5>. 
* xml.etree: xml etree. 
* xmlrpc.server: xmlrpc server. 
* zipapp:: 
* zipfile: zipfile<3>. 

@end menu

@node argparse<5>,asyncio<10>,,Improved Modules<7>
@anchor{whatsnew/3 7 argparse}@anchor{cfc}
@subsubsection argparse


The new @ref{cfd,,ArgumentParser.parse_intermixed_args()}
method allows intermixing options and positional arguments.
(Contributed by paul.j3 in bpo-14191@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14191}.)

@node asyncio<10>,binascii,argparse<5>,Improved Modules<7>
@anchor{whatsnew/3 7 asyncio}@anchor{cfe}@anchor{whatsnew/3 7 whatsnew37-asyncio}@anchor{cc4}
@subsubsection asyncio


The @ref{b,,asyncio} module has received many new features, usability and
@ref{cff,,performance improvements}.  Notable changes
include:


@itemize *

@item 
The new @ref{3cf,,provisional} @ref{2f5,,asyncio.run()} function can
be used to run a coroutine from synchronous code by automatically creating and
destroying the event loop.
(Contributed by Yury Selivanov in bpo-32314@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32314}.)

@item 
asyncio gained support for @ref{28,,contextvars}.
@ref{d00,,loop.call_soon()},
@ref{d01,,loop.call_soon_threadsafe()},
@ref{d02,,loop.call_later()},
@ref{d03,,loop.call_at()}, and
@ref{d04,,Future.add_done_callback()}
have a new optional keyword-only `context' parameter.
@ref{1c9,,Tasks} now track their context automatically.
See 
@geindex Python Enhancement Proposals; PEP 567
PEP 567@footnote{https://peps.python.org/pep-0567/} for more details.
(Contributed by Yury Selivanov in bpo-32436@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32436}.)

@item 
The new @ref{1cb,,asyncio.create_task()} function has been added as a shortcut
to @code{asyncio.get_event_loop().create_task()}.
(Contributed by Andrew Svetlov in bpo-32311@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32311}.)

@item 
The new @ref{d05,,loop.start_tls()}
method can be used to upgrade an existing connection to TLS.
(Contributed by Yury Selivanov in bpo-23749@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23749}.)

@item 
The new @ref{d06,,loop.sock_recv_into()}
method allows reading data from a socket directly into a provided buffer making
it possible to reduce data copies.
(Contributed by Antoine Pitrou in bpo-31819@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31819}.)

@item 
The new @ref{6a6,,asyncio.current_task()} function returns the currently running
@ref{1c9,,Task} instance, and the new @ref{b55,,asyncio.all_tasks()}
function returns a set of all existing @code{Task} instances in a given loop.
The @code{Task.current_task()} and
@code{Task.all_tasks()} methods have been deprecated.
(Contributed by Andrew Svetlov in bpo-32250@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32250}.)

@item 
The new `provisional' @ref{c9a,,BufferedProtocol} class allows
implementing streaming protocols with manual control over the receive buffer.
(Contributed by Yury Selivanov in bpo-32251@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32251}.)

@item 
The new @ref{d07,,asyncio.get_running_loop()} function returns the currently
running loop, and raises a @ref{246,,RuntimeError} if no loop is running.
This is in contrast with @ref{2f4,,asyncio.get_event_loop()}, which will `create'
a new event loop if none is running.
(Contributed by Yury Selivanov in bpo-32269@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32269}.)

@item 
The new @ref{d08,,StreamWriter.wait_closed()}
coroutine method allows waiting until the stream writer is closed.  The new
@ref{d09,,StreamWriter.is_closing()} method
can be used to determine if the writer is closing.
(Contributed by Andrew Svetlov in bpo-32391@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32391}.)

@item 
The new @ref{d0a,,loop.sock_sendfile()}
coroutine method allows sending files using @ref{d0b,,os.sendfile} when possible.
(Contributed by Andrew Svetlov in bpo-32410@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32410}.)

@item 
The new @ref{d0c,,Future.get_loop()} and
@code{Task.get_loop()} methods return the instance of the loop on which a task or
a future were created.
@ref{d0d,,Server.get_loop()} allows doing the same for
@ref{d0e,,asyncio.Server} objects.
(Contributed by Yury Selivanov in bpo-32415@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32415} and
Srinivas Reddy Thatiparthy in bpo-32418@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32418}.)

@item 
It is now possible to control how instances of @ref{d0e,,asyncio.Server} begin
serving.  Previously, the server would start serving immediately when created.
The new `start_serving' keyword argument to
@ref{d0f,,loop.create_server()} and
@ref{4cb,,loop.create_unix_server()},
as well as @ref{d10,,Server.start_serving()}, and
@ref{d11,,Server.serve_forever()}
can be used to decouple server instantiation and serving.  The new
@ref{d12,,Server.is_serving()} method returns @code{True}
if the server is serving.  @code{Server} objects are now
asynchronous context managers:

@example
srv = await loop.create_server(...)

async with srv:
    # some code

# At this point, srv is closed and no longer accepts new connections.
@end example

(Contributed by Yury Selivanov in bpo-32662@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32662}.)

@item 
Callback objects returned by
@ref{d02,,loop.call_later()}
gained the new @ref{d13,,when()} method which
returns an absolute scheduled callback timestamp.
(Contributed by Andrew Svetlov in bpo-32741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32741}.)

@item 
The @ref{941,,loop.create_datagram_endpoint()} method
gained support for Unix sockets.
(Contributed by Quentin Dawans in bpo-31245@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31245}.)

@item 
The @ref{d14,,asyncio.open_connection()}, @ref{d15,,asyncio.start_server()} functions,
@ref{819,,loop.create_connection()},
@ref{d0f,,loop.create_server()},
@ref{9e4,,loop.create_accepted_socket()}
methods and their corresponding UNIX socket variants now accept the
`ssl_handshake_timeout' keyword argument.
(Contributed by Neil Aspinall in bpo-29970@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29970}.)

@item 
The new @ref{d16,,Handle.cancelled()} method returns
@code{True} if the callback was cancelled.
(Contributed by Marat Sharafutdinov in bpo-31943@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31943}.)

@item 
The asyncio source has been converted to use the
@ref{940,,async}/@ref{18e,,await} syntax.
(Contributed by Andrew Svetlov in bpo-32193@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32193}.)

@item 
The new @ref{d17,,ReadTransport.is_reading()}
method can be used to determine the reading state of the transport.
Additionally, calls to
@ref{d18,,ReadTransport.resume_reading()}
and @ref{d19,,ReadTransport.pause_reading()}
are now idempotent.
(Contributed by Yury Selivanov in bpo-32356@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32356}.)

@item 
Loop methods which accept socket paths now support passing
@ref{5a1,,path-like objects}.
(Contributed by Yury Selivanov in bpo-32066@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32066}.)

@item 
In @ref{b,,asyncio} TCP sockets on Linux are now created with @code{TCP_NODELAY}
flag set by default.
(Contributed by Yury Selivanov and Victor Stinner in bpo-27456@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27456}.)

@item 
Exceptions occurring in cancelled tasks are no longer logged.
(Contributed by Yury Selivanov in bpo-30508@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30508}.)

@item 
New @code{WindowsSelectorEventLoopPolicy} and
@code{WindowsProactorEventLoopPolicy} classes.
(Contributed by Yury Selivanov in bpo-33792@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33792}.)
@end itemize

Several @code{asyncio} APIs have been
@ref{d1a,,deprecated}.

@node binascii,calendar<3>,asyncio<10>,Improved Modules<7>
@anchor{whatsnew/3 7 binascii}@anchor{d1b}
@subsubsection binascii


The @ref{d1c,,b2a_uu()} function now accepts an optional `backtick'
keyword argument.  When it’s true, zeros are represented by @code{'`'}
instead of spaces.  (Contributed by Xiang Zhang in bpo-30103@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30103}.)

@node calendar<3>,collections<2>,binascii,Improved Modules<7>
@anchor{whatsnew/3 7 calendar}@anchor{d1d}
@subsubsection calendar


The @ref{d1e,,HTMLCalendar} class has new class attributes which ease
the customization of CSS classes in the produced HTML calendar.
(Contributed by Oz Tiram in bpo-30095@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30095}.)

@node collections<2>,compileall<3>,calendar<3>,Improved Modules<7>
@anchor{whatsnew/3 7 collections}@anchor{d1f}
@subsubsection collections


@code{collections.namedtuple()} now supports default values.
(Contributed by Raymond Hettinger in bpo-32320@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32320}.)

@node compileall<3>,concurrent futures<4>,collections<2>,Improved Modules<7>
@anchor{whatsnew/3 7 compileall}@anchor{d20}
@subsubsection compileall


@ref{d21,,compileall.compile_dir()} learned the new `invalidation_mode' parameter,
which can be used to enable
@ref{cc8,,hash-based .pyc invalidation}.  The invalidation
mode can also be specified on the command line using the new
@code{--invalidation-mode} argument.
(Contributed by Benjamin Peterson in bpo-31650@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31650}.)

@node concurrent futures<4>,contextlib<3>,compileall<3>,Improved Modules<7>
@anchor{whatsnew/3 7 concurrent-futures}@anchor{d22}
@subsubsection concurrent.futures


@ref{1d8,,ProcessPoolExecutor} and
@ref{94e,,ThreadPoolExecutor} now
support the new `initializer' and `initargs' constructor arguments.
(Contributed by Antoine Pitrou in bpo-21423@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21423}.)

The @ref{1d8,,ProcessPoolExecutor}
can now take the multiprocessing context via the new `mp_context' argument.
(Contributed by Thomas Moreau in bpo-31540@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31540}.)

@node contextlib<3>,cProfile<2>,concurrent futures<4>,Improved Modules<7>
@anchor{whatsnew/3 7 contextlib}@anchor{d23}
@subsubsection contextlib


The new @ref{9f5,,nullcontext()} is a simpler and faster no-op
context manager than @ref{d24,,ExitStack}.
(Contributed by Jesse-Bakker in bpo-10049@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10049}.)

The new @ref{d25,,asynccontextmanager()},
@ref{d26,,AbstractAsyncContextManager}, and
@ref{d27,,AsyncExitStack} have been added to
complement their synchronous counterparts.  (Contributed
by Jelle Zijlstra in bpo-29679@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29679} and bpo-30241@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30241},
and by Alexander Mohr and Ilya Kulakov in bpo-29302@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29302}.)

@node cProfile<2>,crypt,contextlib<3>,Improved Modules<7>
@anchor{whatsnew/3 7 cprofile}@anchor{d28}
@subsubsection cProfile


The @ref{2b,,cProfile} command line now accepts @code{-m module_name} as an
alternative to script path.  (Contributed by Sanyam Khurana in bpo-21862@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21862}.)

@node crypt,datetime<5>,cProfile<2>,Improved Modules<7>
@anchor{whatsnew/3 7 crypt}@anchor{d29}
@subsubsection crypt


The @code{crypt} module now supports the Blowfish hashing method.
(Contributed by Serhiy Storchaka in bpo-31664@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31664}.)

The @code{mksalt()} function now allows specifying the number of rounds
for hashing.  (Contributed by Serhiy Storchaka in bpo-31702@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31702}.)

@node datetime<5>,dbm<2>,crypt,Improved Modules<7>
@anchor{whatsnew/3 7 datetime}@anchor{d2a}
@subsubsection datetime


The new @ref{82b,,datetime.fromisoformat()}
method constructs a @ref{4e3,,datetime} object from a string
in one of the formats output by
@ref{d2b,,datetime.isoformat()}.
(Contributed by Paul Ganssle in bpo-15873@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15873}.)

The @ref{7f7,,tzinfo} class now supports sub-minute offsets.
(Contributed by Alexander Belopolsky in bpo-5288@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5288}.)

@node dbm<2>,decimal<2>,datetime<5>,Improved Modules<7>
@anchor{whatsnew/3 7 dbm}@anchor{d2c}
@subsubsection dbm


@ref{36,,dbm.dumb} now supports reading read-only files and no longer writes the
index file when it is not changed.

@node decimal<2>,dis<4>,dbm<2>,Improved Modules<7>
@anchor{whatsnew/3 7 decimal}@anchor{d2d}
@subsubsection decimal


The @ref{3a,,decimal} module now uses @ref{cbd,,context variables}
to store the decimal context.
(Contributed by Yury Selivanov in bpo-32630@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32630}.)

@node dis<4>,distutils<4>,decimal<2>,Improved Modules<7>
@anchor{whatsnew/3 7 dis}@anchor{d2e}
@subsubsection dis


The @ref{207,,dis()} function is now able to
disassemble nested code objects (the code of comprehensions, generator
expressions and nested functions, and the code used for building nested
classes).  The maximum depth of disassembly recursion is controlled by
the new `depth' parameter.
(Contributed by Serhiy Storchaka in bpo-11822@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11822}.)

@node distutils<4>,enum<5>,dis<4>,Improved Modules<7>
@anchor{whatsnew/3 7 distutils}@anchor{d2f}
@subsubsection distutils


@code{README.rst} is now included in the list of distutils standard READMEs and
therefore included in source distributions.
(Contributed by Ryan Gonzalez in bpo-11913@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11913}.)

@node enum<5>,functools<4>,distutils<4>,Improved Modules<7>
@anchor{whatsnew/3 7 enum}@anchor{d30}
@subsubsection enum


The @ref{843,,Enum} learned the new @code{_ignore_} class property,
which allows listing the names of properties which should not become
enum members.
(Contributed by Ethan Furman in bpo-31801@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31801}.)

In Python 3.8, attempting to check for non-Enum objects in @ref{843,,Enum}
classes will raise a @ref{199,,TypeError} (e.g. @code{1 in Color}); similarly,
attempting to check for non-Flag objects in a @ref{836,,Flag} member will
raise @code{TypeError} (e.g. @code{1 in Perm.RW}); currently, both operations
return @ref{d31,,False} instead and are deprecated.
(Contributed by Ethan Furman in bpo-33217@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33217}.)

@node functools<4>,gc<6>,enum<5>,Improved Modules<7>
@anchor{whatsnew/3 7 functools}@anchor{d32}
@subsubsection functools


@ref{84c,,functools.singledispatch()} now supports registering implementations
using type annotations.
(Contributed by Łukasz Langa in bpo-32227@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32227}.)

@node gc<6>,hmac<3>,functools<4>,Improved Modules<7>
@anchor{whatsnew/3 7 gc}@anchor{d33}
@subsubsection gc


The new @ref{d34,,gc.freeze()} function allows freezing all objects tracked
by the garbage collector and excluding them from future collections.
This can be used before a POSIX @code{fork()} call to make the GC copy-on-write
friendly or to speed up collection.  The new @ref{d35,,gc.unfreeze()} functions
reverses this operation.  Additionally, @ref{d36,,gc.get_freeze_count()} can
be used to obtain the number of frozen objects.
(Contributed by Li Zekun in bpo-31558@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31558}.)

@node hmac<3>,http client,gc<6>,Improved Modules<7>
@anchor{whatsnew/3 7 hmac}@anchor{d37}
@subsubsection hmac


The @ref{6e,,hmac} module now has an optimized one-shot @ref{d38,,digest()}
function, which is up to three times faster than @ref{d39,,HMAC()}.
(Contributed by Christian Heimes in bpo-32433@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32433}.)

@node http client,http server,hmac<3>,Improved Modules<7>
@anchor{whatsnew/3 7 http-client}@anchor{d3a}
@subsubsection http.client


@ref{d3b,,HTTPConnection} and @ref{d3c,,HTTPSConnection}
now support the new `blocksize' argument for improved upload throughput.
(Contributed by Nir Soffer in bpo-31945@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31945}.)

@node http server,idlelib and IDLE,http client,Improved Modules<7>
@anchor{whatsnew/3 7 http-server}@anchor{d3d}
@subsubsection http.server


@ref{d3e,,SimpleHTTPRequestHandler} now supports the HTTP
@code{If-Modified-Since} header.  The server returns the 304 response status if
the target file was not modified after the time specified in the header.
(Contributed by Pierre Quentel in bpo-29654@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29654}.)

@ref{d3e,,SimpleHTTPRequestHandler} accepts the new `directory'
argument, in addition to the new @code{--directory} command line argument.
With this parameter, the server serves the specified directory, by default it
uses the current working directory.
(Contributed by Stéphane Wirtel and Julien Palard in bpo-28707@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28707}.)

The new @ref{d3f,,ThreadingHTTPServer} class
uses threads to handle requests using @ref{d40,,ThreadingMixIn}.
It is used when @code{http.server} is run with @code{-m}.
(Contributed by Julien Palard in bpo-31639@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31639}.)

@node idlelib and IDLE,importlib<4>,http server,Improved Modules<7>
@anchor{whatsnew/3 7 idlelib-and-idle}@anchor{d41}
@subsubsection idlelib and IDLE


Multiple fixes for autocompletion. (Contributed by Louie Lu in bpo-15786@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15786}.)

Module Browser (on the File menu, formerly called Class Browser),
now displays nested functions and classes in addition to top-level
functions and classes.
(Contributed by Guilherme Polo, Cheryl Sabella, and Terry Jan Reedy
in bpo-1612262@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1612262}.)

The Settings dialog (Options, Configure IDLE) has been partly rewritten
to improve both appearance and function.
(Contributed by Cheryl Sabella and Terry Jan Reedy in multiple issues.)

The font sample now includes a selection of non-Latin characters so that
users can better see the effect of selecting a particular font.
(Contributed by Terry Jan Reedy in bpo-13802@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13802}.)
The sample can be edited to include other characters.
(Contributed by Serhiy Storchaka in bpo-31860@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31860}.)

The IDLE features formerly implemented as extensions have been reimplemented
as normal features.  Their settings have been moved from the Extensions tab
to other dialog tabs.
(Contributed by Charles Wohlganger and Terry Jan Reedy in bpo-27099@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27099}.)

Editor code context option revised.  Box displays all context lines up to
maxlines.  Clicking on a context line jumps the editor to that line.  Context
colors for custom themes is added to Highlights tab of Settings dialog.
(Contributed by Cheryl Sabella and Terry Jan Reedy in bpo-33642@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33642},
bpo-33768@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33768}, and bpo-33679@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33679}.)

On Windows, a new API call tells Windows that tk scales for DPI. On Windows
8.1+ or 10, with DPI compatibility properties of the Python binary
unchanged, and a monitor resolution greater than 96 DPI, this should
make text and lines sharper.  It should otherwise have no effect.
(Contributed by Terry Jan Reedy in bpo-33656@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33656}.)

New in 3.7.1:

Output over N lines (50 by default) is squeezed down to a button.
N can be changed in the PyShell section of the General page of the
Settings dialog.  Fewer, but possibly extra long, lines can be squeezed by
right clicking on the output.  Squeezed output can be expanded in place
by double-clicking the button or into the clipboard or a separate window
by right-clicking the button.  (Contributed by Tal Einat in bpo-1529353@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1529353}.)

The changes above have been backported to 3.6 maintenance releases.

NEW in 3.7.4:

Add “Run Customized” to the Run menu to run a module with customized
settings. Any command line arguments entered are added to sys.argv.
They re-appear in the box for the next customized run.  One can also
suppress the normal Shell main module restart.  (Contributed by Cheryl
Sabella, Terry Jan Reedy, and others in bpo-5680@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5680} and bpo-37627@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37627}.)

New in 3.7.5:

Add optional line numbers for IDLE editor windows. Windows
open without line numbers unless set otherwise in the General
tab of the configuration dialog.  Line numbers for an existing
window are shown and hidden in the Options menu.
(Contributed by Tal Einat and Saimadhav Heblikar in bpo-17535@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17535}.)

@node importlib<4>,io<6>,idlelib and IDLE,Improved Modules<7>
@anchor{whatsnew/3 7 importlib}@anchor{d42}
@subsubsection importlib


The @code{importlib.abc.ResourceReader} ABC was introduced to
support the loading of resources from packages.  See also
@ref{cbf,,importlib.resources}.
(Contributed by Barry Warsaw, Brett Cannon in bpo-32248@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32248}.)

@ref{73e,,importlib.reload()} now raises @ref{d43,,ModuleNotFoundError} if the module
lacks a spec.
(Contributed by Garvit Khatri in bpo-29851@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29851}.)

@ref{5af,,importlib.util.find_spec()} now raises @ref{d43,,ModuleNotFoundError} instead of
@ref{5f0,,AttributeError} if the specified parent module is not a package (i.e.
lacks a @code{__path__} attribute).
(Contributed by Milan Oberkirch in bpo-30436@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30436}.)

The new @ref{d44,,importlib.util.source_hash()} can be used to compute the hash of
the passed source.  A @ref{cc8,,hash-based .pyc file}
embeds the value returned by this function.

@node io<6>,ipaddress<3>,importlib<4>,Improved Modules<7>
@anchor{whatsnew/3 7 io}@anchor{d45}
@subsubsection io


The new @ref{d46,,TextIOWrapper.reconfigure()}
method can be used to reconfigure the text stream with the new settings.
(Contributed by Antoine Pitrou in bpo-30526@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30526} and
INADA Naoki in bpo-15216@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15216}.)

@node ipaddress<3>,itertools<6>,io<6>,Improved Modules<7>
@anchor{whatsnew/3 7 ipaddress}@anchor{d47}
@subsubsection ipaddress


The new @code{subnet_of()} and @code{supernet_of()} methods of
@ref{510,,ipaddress.IPv6Network} and @ref{50f,,ipaddress.IPv4Network} can
be used for network containment tests.
(Contributed by Michel Albert and Cheryl Sabella in bpo-20825@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20825}.)

@node itertools<6>,locale<4>,ipaddress<3>,Improved Modules<7>
@anchor{whatsnew/3 7 itertools}@anchor{d48}
@subsubsection itertools


@ref{d49,,itertools.islice()} now accepts
@ref{19f,,integer-like objects} as start, stop,
and slice arguments.
(Contributed by Will Roberts in bpo-30537@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30537}.)

@node locale<4>,logging<3>,itertools<6>,Improved Modules<7>
@anchor{whatsnew/3 7 locale}@anchor{d4a}
@subsubsection locale


The new `monetary' argument to @ref{743,,locale.format_string()} can be used
to make the conversion use monetary thousands separators and
grouping strings.  (Contributed by Garvit in bpo-10379@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10379}.)

The @ref{75d,,locale.getpreferredencoding()} function now always returns @code{'UTF-8'}
on Android or when in the @ref{cc7,,forced UTF-8 mode}.

@node logging<3>,math<7>,locale<4>,Improved Modules<7>
@anchor{whatsnew/3 7 logging}@anchor{d4b}
@subsubsection logging


@ref{d4c,,Logger} instances can now be pickled.
(Contributed by Vinay Sajip in bpo-30520@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30520}.)

The new @ref{d4d,,StreamHandler.setStream()}
method can be used to replace the logger stream after handler creation.
(Contributed by Vinay Sajip in bpo-30522@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30522}.)

It is now possible to specify keyword arguments to handler constructors in
configuration passed to @ref{d4e,,logging.config.fileConfig()}.
(Contributed by Preston Landers in bpo-31080@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31080}.)

@node math<7>,mimetypes<3>,logging<3>,Improved Modules<7>
@anchor{whatsnew/3 7 math}@anchor{d4f}
@subsubsection math


The new @ref{d50,,math.remainder()} function implements the IEEE 754-style remainder
operation.  (Contributed by Mark Dickinson in bpo-29962@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29962}.)

@node mimetypes<3>,msilib,math<7>,Improved Modules<7>
@anchor{whatsnew/3 7 mimetypes}@anchor{d51}
@subsubsection mimetypes


The MIME type of .bmp has been changed from @code{'image/x-ms-bmp'} to
@code{'image/bmp'}.
(Contributed by Nitish Chandra in bpo-22589@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22589}.)

@node msilib,multiprocessing<5>,mimetypes<3>,Improved Modules<7>
@anchor{whatsnew/3 7 msilib}@anchor{d52}
@subsubsection msilib


The new @code{Database.Close()} method can be used
to close the @abbr{MSI} database.
(Contributed by Berker Peksag in bpo-20486@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20486}.)

@node multiprocessing<5>,os<8>,msilib,Improved Modules<7>
@anchor{whatsnew/3 7 multiprocessing}@anchor{d53}
@subsubsection multiprocessing


The new @ref{d54,,Process.close()} method
explicitly closes the process object and releases all resources associated
with it.  @ref{2ee,,ValueError} is raised if the underlying process is still
running.
(Contributed by Antoine Pitrou in bpo-30596@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30596}.)

The new @ref{d55,,Process.kill()} method can
be used to terminate the process using the @ref{d56,,SIGKILL} signal on Unix.
(Contributed by Vitor Pereira in bpo-30794@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30794}.)

Non-daemonic threads created by @ref{254,,Process} are now
joined on process exit.
(Contributed by Antoine Pitrou in bpo-18966@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18966}.)

@node os<8>,pathlib<11>,multiprocessing<5>,Improved Modules<7>
@anchor{whatsnew/3 7 os}@anchor{d57}
@subsubsection os


@ref{d58,,os.fwalk()} now accepts the `path' argument as @ref{193,,bytes}.
(Contributed by Serhiy Storchaka in bpo-28682@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28682}.)

@ref{c5a,,os.scandir()} gained support for @ref{d59,,file descriptors}.
(Contributed by Serhiy Storchaka in bpo-25996@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25996}.)

The new @ref{353,,register_at_fork()} function allows registering Python
callbacks to be executed at process fork.
(Contributed by Antoine Pitrou in bpo-16500@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16500}.)

Added @ref{d5a,,os.preadv()} (combine the functionality of @ref{d5b,,os.readv()} and
@ref{d5c,,os.pread()}) and @ref{d5d,,os.pwritev()} functions (combine the functionality
of @ref{d5e,,os.writev()} and @ref{d5f,,os.pwrite()}). (Contributed by Pablo Galindo in
bpo-31368@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31368}.)

The mode argument of @ref{52d,,os.makedirs()} no longer affects the file
permission bits of newly created intermediate-level directories.
(Contributed by Serhiy Storchaka in bpo-19930@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19930}.)

@ref{d60,,os.dup2()} now returns the new file descriptor.  Previously, @code{None}
was always returned.
(Contributed by Benjamin Peterson in bpo-32441@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32441}.)

The structure returned by @ref{26f,,os.stat()} now contains the
@ref{d61,,st_fstype} attribute on Solaris and its derivatives.
(Contributed by Jesús Cea Avión in bpo-32659@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32659}.)

@node pathlib<11>,pdb<6>,os<8>,Improved Modules<7>
@anchor{whatsnew/3 7 pathlib}@anchor{d62}
@subsubsection pathlib


The new @ref{c12,,Path.is_mount()} method is now available
on POSIX systems and can be used to determine whether a path is a mount point.
(Contributed by Cooper Ry Lees in bpo-30897@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30897}.)

@node pdb<6>,py_compile<3>,pathlib<11>,Improved Modules<7>
@anchor{whatsnew/3 7 pdb}@anchor{d63}
@subsubsection pdb


@ref{274,,pdb.set_trace()} now takes an optional `header' keyword-only
argument.  If given, it is printed to the console just before debugging
begins.  (Contributed by Barry Warsaw in bpo-31389@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31389}.)

@ref{aa,,pdb} command line now accepts @code{-m module_name} as an alternative to
script file.  (Contributed by Mario Corchero in bpo-32206@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32206}.)

@node py_compile<3>,pydoc<3>,pdb<6>,Improved Modules<7>
@anchor{whatsnew/3 7 py-compile}@anchor{d64}
@subsubsection py_compile


@ref{c20,,py_compile.compile()} – and by extension, @ref{21,,compileall} – now
respects the 
@geindex SOURCE_DATE_EPOCH
@geindex environment variable; SOURCE_DATE_EPOCH
@code{SOURCE_DATE_EPOCH} environment variable by
unconditionally creating @code{.pyc} files for hash-based validation.
This allows for guaranteeing
reproducible builds@footnote{https://reproducible-builds.org/} of @code{.pyc}
files when they are created eagerly. (Contributed by Bernhard M. Wiedemann
in bpo-29708@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29708}.)

@node pydoc<3>,queue<2>,py_compile<3>,Improved Modules<7>
@anchor{whatsnew/3 7 pydoc}@anchor{d65}
@subsubsection pydoc


The pydoc server can now bind to an arbitrary hostname specified by the
new @code{-n} command-line argument.
(Contributed by Feanil Patel in bpo-31128@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31128}.)

@node queue<2>,re<5>,pydoc<3>,Improved Modules<7>
@anchor{whatsnew/3 7 queue}@anchor{d66}
@subsubsection queue


The new @ref{d67,,SimpleQueue} class is an unbounded @abbr{FIFO} queue.
(Contributed by Antoine Pitrou in bpo-14976@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14976}.)

@node re<5>,signal<2>,queue<2>,Improved Modules<7>
@anchor{whatsnew/3 7 re}@anchor{d68}
@subsubsection re


The flags @ref{83f,,re.ASCII}, @ref{d69,,re.LOCALE} and @ref{d6a,,re.UNICODE}
can be set within the scope of a group.
(Contributed by Serhiy Storchaka in bpo-31690@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31690}.)

@ref{5a2,,re.split()} now supports splitting on a pattern like @code{r'\b'},
@code{'^$'} or @code{(?=-)} that matches an empty string.
(Contributed by Serhiy Storchaka in bpo-25054@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25054}.)

Regular expressions compiled with the @ref{d69,,re.LOCALE} flag no longer
depend on the locale at compile time.  Locale settings are applied only
when the compiled regular expression is used.
(Contributed by Serhiy Storchaka in bpo-30215@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30215}.)

@ref{659,,FutureWarning} is now emitted if a regular expression contains
character set constructs that will change semantically in the future,
such as nested sets and set operations.
(Contributed by Serhiy Storchaka in bpo-30349@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30349}.)

Compiled regular expression and match objects can now be copied
using @ref{758,,copy.copy()} and @ref{d6b,,copy.deepcopy()}.
(Contributed by Serhiy Storchaka in bpo-10076@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10076}.)

@node signal<2>,socket<6>,re<5>,Improved Modules<7>
@anchor{whatsnew/3 7 signal}@anchor{d6c}
@subsubsection signal


The new `warn_on_full_buffer' argument to the @ref{d6d,,signal.set_wakeup_fd()}
function makes it possible to specify whether Python prints a warning on
stderr when the wakeup buffer overflows.
(Contributed by Nathaniel J. Smith in bpo-30050@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30050}.)

@node socket<6>,socketserver,signal<2>,Improved Modules<7>
@anchor{whatsnew/3 7 socket}@anchor{d6e}
@subsubsection socket


The new @ref{d6f,,socket.getblocking()} method
returns @code{True} if the socket is in blocking mode and @code{False} otherwise.
(Contributed by Yury Selivanov in bpo-32373@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32373}.)

The new @ref{d70,,socket.close()} function closes the passed socket file descriptor.
This function should be used instead of @ref{d71,,os.close()} for better
compatibility across platforms.
(Contributed by Christian Heimes in bpo-32454@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32454}.)

The @ref{d1,,socket} module now exposes the @ref{d72,,socket.TCP_CONGESTION} (Linux 2.6.13), @ref{d72,,socket.TCP_USER_TIMEOUT} (Linux 2.6.37), and @ref{d72,,socket.TCP_NOTSENT_LOWAT} (Linux 3.12) constants.
(Contributed by Omar Sandoval in bpo-26273@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26273} and
Nathaniel J. Smith in bpo-29728@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29728}.)

Support for @ref{d73,,socket.AF_VSOCK} sockets has been added to allow
communication between virtual machines and their hosts.
(Contributed by Cathy Avery in bpo-27584@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27584}.)

Sockets now auto-detect family, type and protocol from file descriptor
by default.
(Contributed by Christian Heimes in bpo-28134@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28134}.)

@node socketserver,sqlite3<7>,socket<6>,Improved Modules<7>
@anchor{whatsnew/3 7 socketserver}@anchor{d74}
@subsubsection socketserver


@ref{d75,,socketserver.ThreadingMixIn.server_close} now waits until all non-daemon
threads complete. @code{socketserver.ForkingMixIn.server_close} now waits
until all child processes complete.

Add a new @ref{d76,,socketserver.ForkingMixIn.block_on_close} class attribute to
@ref{d77,,socketserver.ForkingMixIn} and @ref{d40,,socketserver.ThreadingMixIn}
classes. Set the class attribute to @code{False} to get the pre-3.7 behaviour.

@node sqlite3<7>,ssl<6>,socketserver,Improved Modules<7>
@anchor{whatsnew/3 7 sqlite3}@anchor{d78}
@subsubsection sqlite3


@ref{54e,,sqlite3.Connection} now exposes the @ref{d79,,backup()}
method when the underlying SQLite library is at version 3.6.11 or higher.
(Contributed by Lele Gaifax in bpo-27645@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27645}.)

The `database' argument of @ref{5a6,,sqlite3.connect()} now accepts any
@ref{5a1,,path-like object}, instead of just a string.
(Contributed by Anders Lorentsen in bpo-31843@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31843}.)

@node ssl<6>,string<2>,sqlite3<7>,Improved Modules<7>
@anchor{whatsnew/3 7 ssl}@anchor{d7a}
@subsubsection ssl


The @ref{d5,,ssl} module now uses OpenSSL’s builtin API instead of
@code{match_hostname()} to check a host name or an IP address.  Values
are validated during TLS handshake.  Any certificate validation error
including failing the host name check now raises
@ref{d7b,,SSLCertVerificationError} and aborts the handshake with a proper
TLS Alert message.  The new exception contains additional information.
Host name validation can be customized with
@ref{d7c,,SSLContext.hostname_checks_common_name}.
(Contributed by Christian Heimes in bpo-31399@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31399}.)

@cartouche
@quotation Note 
The improved host name check requires a `libssl' implementation compatible
with OpenSSL 1.0.2 or 1.1.  Consequently, OpenSSL 0.9.8 and 1.0.1 are no
longer supported (see @ref{d7d,,Platform Support Removals} for more details).
The ssl module is mostly compatible with LibreSSL 2.7.2 and newer.
@end quotation
@end cartouche

The @code{ssl} module no longer sends IP addresses in SNI TLS extension.
(Contributed by Christian Heimes in bpo-32185@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32185}.)

@code{match_hostname()} no longer supports partial wildcards like
@code{www*.example.org}.
(Contributed by Mandeep Singh in bpo-23033@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23033} and Christian Heimes in
bpo-31399@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31399}.)

The default cipher suite selection of the @code{ssl} module now uses a blacklist
approach rather than a hard-coded whitelist.  Python no longer re-enables
ciphers that have been blocked by OpenSSL security updates.  Default cipher
suite selection can be configured at compile time.
(Contributed by Christian Heimes in bpo-31429@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31429}.)

Validation of server certificates containing internationalized domain names
(IDNs) is now supported.  As part of this change, the
@ref{d7e,,SSLSocket.server_hostname} attribute
now stores the expected hostname in A-label form (@code{"xn--pythn-mua.org"}),
rather than the U-label form (@code{"pythön.org"}).  (Contributed by
Nathaniel J. Smith and Christian Heimes in bpo-28414@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28414}.)

The @code{ssl} module has preliminary and experimental support for TLS 1.3 and
OpenSSL 1.1.1.  At the time of Python 3.7.0 release, OpenSSL 1.1.1 is still
under development and TLS 1.3 hasn’t been finalized yet.  The TLS 1.3
handshake and protocol behaves slightly differently than TLS 1.2 and earlier,
see @ref{d7f,,TLS 1.3}.
(Contributed by Christian Heimes in bpo-32947@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32947}, bpo-20995@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20995},
bpo-29136@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29136}, bpo-30622@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30622} and bpo-33618@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33618})

@ref{aed,,SSLSocket} and @ref{d80,,SSLObject} no longer have a public
constructor.  Direct instantiation was never a documented and supported
feature.  Instances must be created with @ref{355,,SSLContext} methods
@ref{749,,wrap_socket()} and @ref{d81,,wrap_bio()}.
(Contributed by Christian Heimes in bpo-32951@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32951})

OpenSSL 1.1 APIs for setting the minimum and maximum TLS protocol version are
available as @ref{a76,,SSLContext.minimum_version}
and @ref{a77,,SSLContext.maximum_version}.
Supported protocols are indicated by several new flags, such as
@ref{d82,,HAS_TLSv1_1}.
(Contributed by Christian Heimes in bpo-32609@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32609}.)

Added @ref{c2c,,ssl.SSLContext.post_handshake_auth} to enable and
@ref{c2d,,ssl.SSLSocket.verify_client_post_handshake()} to initiate TLS 1.3
post-handshake authentication.
(Contributed by Christian Heimes in gh-78851@footnote{https://github.com/python/cpython/issues/78851}.)

@node string<2>,subprocess<2>,ssl<6>,Improved Modules<7>
@anchor{whatsnew/3 7 string}@anchor{d83}
@subsubsection string


@ref{899,,string.Template} now lets you to optionally modify the regular
expression pattern for braced placeholders and non-braced placeholders
separately.  (Contributed by Barry Warsaw in bpo-1198569@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1198569}.)

@node subprocess<2>,sys<8>,string<2>,Improved Modules<7>
@anchor{whatsnew/3 7 subprocess}@anchor{d84}
@subsubsection subprocess


The @ref{d85,,subprocess.run()} function accepts the new `capture_output'
keyword argument.  When true, stdout and stderr will be captured.
This is equivalent to passing @ref{d86,,subprocess.PIPE} as `stdout' and
`stderr' arguments.
(Contributed by Bo Bayles in bpo-32102@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32102}.)

The @code{subprocess.run} function and the @ref{4b8,,subprocess.Popen} constructor
now accept the `text' keyword argument as an alias
to `universal_newlines'.
(Contributed by Andrew Clegg in bpo-31756@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31756}.)

On Windows the default for `close_fds' was changed from @code{False} to
@code{True} when redirecting the standard handles.  It’s now possible to set
`close_fds' to true when redirecting the standard handles.  See
@ref{4b8,,subprocess.Popen}.  This means that `close_fds' now defaults to
@code{True} on all supported platforms.
(Contributed by Segev Finer in bpo-19764@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19764}.)

The subprocess module is now more graceful when handling
@ref{bcb,,KeyboardInterrupt} during @ref{d87,,subprocess.call()},
@ref{d85,,subprocess.run()}, or in a @ref{4b8,,Popen}
context manager.  It now waits a short amount of time for the child
to exit, before continuing the handling of the @code{KeyboardInterrupt}
exception.
(Contributed by Gregory P. Smith in bpo-25942@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25942}.)

@node sys<8>,time<5>,subprocess<2>,Improved Modules<7>
@anchor{whatsnew/3 7 sys}@anchor{d88}
@subsubsection sys


The new @ref{cd7,,sys.breakpointhook()} hook function is called by the
built-in @ref{273,,breakpoint()}.
(Contributed by Barry Warsaw in bpo-31353@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31353}.)

On Android, the new @ref{d89,,sys.getandroidapilevel()} returns the build-time
Android API version.
(Contributed by Victor Stinner in bpo-28740@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28740}.)

The new @ref{d8a,,sys.get_coroutine_origin_tracking_depth()} function returns
the current coroutine origin tracking depth, as set by
the new @ref{d8b,,sys.set_coroutine_origin_tracking_depth()}.  @ref{b,,asyncio}
has been converted to use this new API instead of
the deprecated @code{sys.set_coroutine_wrapper()}.
(Contributed by Nathaniel J. Smith in bpo-32591@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32591}.)

@node time<5>,tkinter<6>,sys<8>,Improved Modules<7>
@anchor{whatsnew/3 7 time}@anchor{d8c}
@subsubsection time


@geindex Python Enhancement Proposals; PEP 564
PEP 564@footnote{https://peps.python.org/pep-0564/} adds six new functions with nanosecond resolution to the
@ref{f4,,time} module:


@itemize *

@item 
@ref{ce1,,time.clock_gettime_ns()}

@item 
@ref{ce2,,time.clock_settime_ns()}

@item 
@ref{ce3,,time.monotonic_ns()}

@item 
@ref{ce4,,time.perf_counter_ns()}

@item 
@ref{ce5,,time.process_time_ns()}

@item 
@ref{ce6,,time.time_ns()}
@end itemize

New clock identifiers have been added:


@itemize *

@item 
@ref{d8d,,time.CLOCK_BOOTTIME} (Linux): Identical to
@ref{8aa,,time.CLOCK_MONOTONIC}, except it also includes any time that the
system is suspended.

@item 
@ref{d8e,,time.CLOCK_PROF} (FreeBSD, NetBSD and OpenBSD): High-resolution
per-process CPU timer.

@item 
@ref{d8f,,time.CLOCK_UPTIME} (FreeBSD, OpenBSD): Time whose absolute value is
the time the system has been running and not suspended, providing accurate
uptime measurement.
@end itemize

The new @ref{b36,,time.thread_time()} and @ref{d90,,time.thread_time_ns()} functions
can be used to get per-thread CPU time measurements.
(Contributed by Antoine Pitrou in bpo-32025@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32025}.)

The new @ref{d91,,time.pthread_getcpuclockid()} function returns the clock ID
of the thread-specific CPU-time clock.

@node tkinter<6>,tracemalloc<2>,time<5>,Improved Modules<7>
@anchor{whatsnew/3 7 tkinter}@anchor{d92}
@subsubsection tkinter


The new @ref{d93,,tkinter.ttk.Spinbox} class is now available.
(Contributed by Alan Moore in bpo-32585@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32585}.)

@node tracemalloc<2>,types<5>,tkinter<6>,Improved Modules<7>
@anchor{whatsnew/3 7 tracemalloc}@anchor{d94}
@subsubsection tracemalloc


@ref{d95,,tracemalloc.Traceback} behaves more like regular tracebacks,
sorting the frames from oldest to most recent.
@ref{d96,,Traceback.format()}
now accepts negative `limit', truncating the result to the
@code{abs(limit)} oldest frames.  To get the old behaviour, use
the new `most_recent_first' argument to @code{Traceback.format()}.
(Contributed by Jesse Bakker in bpo-32121@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32121}.)

@node types<5>,unicodedata<7>,tracemalloc<2>,Improved Modules<7>
@anchor{whatsnew/3 7 types}@anchor{d97}
@subsubsection types


The new @ref{d98,,WrapperDescriptorType},
@ref{85c,,MethodWrapperType}, @ref{d99,,MethodDescriptorType},
and @ref{d9a,,ClassMethodDescriptorType} classes are now available.
(Contributed by Manuel Krebber and Guido van Rossum in bpo-29377@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29377},
and Serhiy Storchaka in bpo-32265@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32265}.)

The new @ref{d9b,,types.resolve_bases()} function resolves MRO entries
dynamically as specified by 
@geindex Python Enhancement Proposals; PEP 560
PEP 560@footnote{https://peps.python.org/pep-0560/}.
(Contributed by Ivan Levkivskyi in bpo-32717@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32717}.)

@node unicodedata<7>,unittest<8>,types<5>,Improved Modules<7>
@anchor{whatsnew/3 7 unicodedata}@anchor{d9c}
@subsubsection unicodedata


The internal @ref{10c,,unicodedata} database has been upgraded to use Unicode 11@footnote{https://www.unicode.org/versions/Unicode11.0.0/}. (Contributed by Benjamin
Peterson.)

@node unittest<8>,unittest mock,unicodedata<7>,Improved Modules<7>
@anchor{whatsnew/3 7 unittest}@anchor{d9d}
@subsubsection unittest


The new @code{-k} command-line option allows filtering tests by a name
substring or a Unix shell-like pattern.
For example, @code{python -m unittest -k foo} runs
@code{foo_tests.SomeTest.test_something}, @code{bar_tests.SomeTest.test_foo},
but not @code{bar_tests.FooTest.test_something}.
(Contributed by Jonas Haag in bpo-32071@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32071}.)

@node unittest mock,urllib parse<5>,unittest<8>,Improved Modules<7>
@anchor{whatsnew/3 7 unittest-mock}@anchor{d9e}
@subsubsection unittest.mock


The @ref{d9f,,sentinel} attributes now preserve their identity
when they are @ref{29,,copied} or @ref{ab,,pickled}. (Contributed by
Serhiy Storchaka in bpo-20804@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20804}.)

The new @ref{da0,,seal()} function allows sealing
@ref{c45,,Mock} instances, which will disallow further creation
of attribute mocks.  The seal is applied recursively to all attributes that
are themselves mocks.
(Contributed by Mario Corchero in bpo-30541@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30541}.)

@node urllib parse<5>,uu,unittest mock,Improved Modules<7>
@anchor{whatsnew/3 7 urllib-parse}@anchor{da1}
@subsubsection urllib.parse


@ref{da2,,urllib.parse.quote()} has been updated from 
@geindex RFC; RFC 2396
RFC 2396@footnote{https://datatracker.ietf.org/doc/html/rfc2396.html} to 
@geindex RFC; RFC 3986
RFC 3986@footnote{https://datatracker.ietf.org/doc/html/rfc3986.html},
adding @code{~} to the set of characters that are never quoted by default.
(Contributed by Christian Theune and Ratnadeep Debnath in bpo-16285@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16285}.)

@node uu,uuid<4>,urllib parse<5>,Improved Modules<7>
@anchor{whatsnew/3 7 uu}@anchor{da3}
@subsubsection uu


The @code{uu.encode()} function now accepts an optional `backtick'
keyword argument.  When it’s true, zeros are represented by @code{'`'}
instead of spaces.  (Contributed by Xiang Zhang in bpo-30103@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30103}.)

@node uuid<4>,warnings<3>,uu,Improved Modules<7>
@anchor{whatsnew/3 7 uuid}@anchor{da4}
@subsubsection uuid


The new @ref{da5,,UUID.is_safe} attribute relays information
from the platform about whether generated UUIDs are generated with a
multiprocessing-safe method.
(Contributed by Barry Warsaw in bpo-22807@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22807}.)

@ref{da6,,uuid.getnode()} now prefers universally administered
MAC addresses over locally administered MAC addresses.
This makes a better guarantee for global uniqueness of UUIDs returned
from @ref{da7,,uuid.uuid1()}.  If only locally administered MAC addresses are
available, the first such one found is returned.
(Contributed by Barry Warsaw in bpo-32107@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32107}.)

@node warnings<3>,xml<5>,uuid<4>,Improved Modules<7>
@anchor{whatsnew/3 7 warnings}@anchor{da8}
@subsubsection warnings


The initialization of the default warnings filters has changed as follows:


@itemize *

@item 
warnings enabled via command line options (including those for @ref{7fa,,-b}
and the new CPython-specific @ref{170,,-X} @code{dev} option) are always passed
to the warnings machinery via the @ref{3f3,,sys.warnoptions} attribute.

@item 
warnings filters enabled via the command line or the environment now have the
following order of precedence:


@itemize *

@item 
the @code{BytesWarning} filter for @ref{7fa,,-b} (or @code{-bb})

@item 
any filters specified with the @ref{acb,,-W} option

@item 
any filters specified with the 
@geindex PYTHONWARNINGS
@geindex environment variable; PYTHONWARNINGS
@ref{da9,,PYTHONWARNINGS} environment
variable

@item 
any other CPython specific filters (e.g. the @code{default} filter added
for the new @code{-X dev} mode)

@item 
any implicit filters defined directly by the warnings machinery
@end itemize

@item 
in @ref{50a,,CPython debug builds}, all warnings are now displayed
by default (the implicit filter list is empty)
@end itemize

(Contributed by Nick Coghlan and Victor Stinner in bpo-20361@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20361},
bpo-32043@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32043}, and bpo-32230@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32230}.)

Deprecation warnings are once again shown by default in single-file scripts and
at the interactive prompt.  See @ref{cca,,PEP 565; Show DeprecationWarning in __main__} for details.
(Contributed by Nick Coghlan in bpo-31975@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31975}.)

@node xml<5>,xml etree,warnings<3>,Improved Modules<7>
@anchor{whatsnew/3 7 xml}@anchor{daa}
@subsubsection xml


As mitigation against DTD and external entity retrieval, the
@ref{129,,xml.dom.minidom} and @ref{130,,xml.sax} modules no longer process
external entities by default.
(Contributed by Christian Heimes in gh-61441@footnote{https://github.com/python/cpython/issues/61441}.)

@node xml etree,xmlrpc server,xml<5>,Improved Modules<7>
@anchor{whatsnew/3 7 xml-etree}@anchor{dab}
@subsubsection xml.etree


@ref{dac,,ElementPath} predicates in the @code{find()}
methods can now compare text of the current node with @code{[. = "text"]},
not only text in children.  Predicates also allow adding spaces for
better readability.  (Contributed by Stefan Behnel in bpo-31648@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31648}.)

@node xmlrpc server,zipapp,xml etree,Improved Modules<7>
@anchor{whatsnew/3 7 xmlrpc-server}@anchor{dad}
@subsubsection xmlrpc.server


@code{SimpleXMLRPCDispatcher.register_function()}
can now be used as a decorator.  (Contributed by Xiang Zhang in
bpo-7769@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7769}.)

@node zipapp,zipfile<3>,xmlrpc server,Improved Modules<7>
@anchor{whatsnew/3 7 zipapp}@anchor{dae}
@subsubsection zipapp


Function @ref{daf,,create_archive()} now accepts an optional `filter'
argument to allow the user to select which files should be included in the
archive.  (Contributed by Irmen de Jong in bpo-31072@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31072}.)

Function @ref{daf,,create_archive()} now accepts an optional `compressed'
argument to generate a compressed archive.  A command line option
@code{--compress} has also been added to support compression.
(Contributed by Zhiming Wang in bpo-31638@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31638}.)

@node zipfile<3>,,zipapp,Improved Modules<7>
@anchor{whatsnew/3 7 zipfile}@anchor{db0}
@subsubsection zipfile


@ref{8d5,,ZipFile} now accepts the new `compresslevel' parameter to
control the compression level.
(Contributed by Bo Bayles in bpo-21417@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21417}.)

Subdirectories in archives created by @code{ZipFile} are now stored in
alphabetical order.
(Contributed by Bernhard M. Wiedemann in bpo-30693@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30693}.)

@node C API Changes<6>,Build Changes<6>,Improved Modules<7>,What’s New In Python 3 7
@anchor{whatsnew/3 7 c-api-changes}@anchor{db1}
@subsection C API Changes


A new API for thread-local storage has been implemented.  See
@ref{ccb,,PEP 539; New C API for Thread-Local Storage} for an overview and
@ref{cdb,,Thread-specific storage API} for a complete reference.
(Contributed by Masayuki Yamamoto in bpo-25658@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25658}.)

The new @ref{cbd,,context variables} functionality
exposes a number of @ref{cf6,,new C APIs}.

The new @ref{db2,,PyImport_GetModule()} function returns the previously
imported module with the given name.
(Contributed by Eric Snow in bpo-28411@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28411}.)

The new @ref{db3,,Py_RETURN_RICHCOMPARE} macro eases writing rich
comparison functions.
(Contributed by Petr Victorin in bpo-23699@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23699}.)

The new @ref{db4,,Py_UNREACHABLE} macro can be used to mark unreachable
code paths.
(Contributed by Barry Warsaw in bpo-31338@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31338}.)

The @ref{106,,tracemalloc} now exposes a C API through the new
@ref{db5,,PyTraceMalloc_Track()} and @ref{db6,,PyTraceMalloc_Untrack()}
functions.
(Contributed by Victor Stinner in bpo-30054@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30054}.)

The new @ref{db7,,import__find__load__start} and
@ref{db7,,import__find__load__done} static markers can be used
to trace module imports.
(Contributed by Christian Heimes in bpo-31574@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31574}.)

The fields @code{name} and @code{doc} of structures
@ref{772,,PyMemberDef}, @ref{db8,,PyGetSetDef},
@ref{db9,,PyStructSequence_Field}, @ref{dba,,PyStructSequence_Desc},
and @code{wrapperbase} are now of type @code{const char *} rather of
@code{char *}.  (Contributed by Serhiy Storchaka in bpo-28761@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28761}.)

The result of @ref{a9f,,PyUnicode_AsUTF8AndSize()} and @ref{422,,PyUnicode_AsUTF8()}
is now of type @code{const char *} rather of @code{char *}. (Contributed by Serhiy
Storchaka in bpo-28769@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28769}.)

The result of @ref{dbb,,PyMapping_Keys()}, @ref{dbc,,PyMapping_Values()} and
@ref{dbd,,PyMapping_Items()} is now always a list, rather than a list or a
tuple. (Contributed by Oren Milman in bpo-28280@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28280}.)

Added functions @ref{430,,PySlice_Unpack()} and @ref{431,,PySlice_AdjustIndices()}.
(Contributed by Serhiy Storchaka in bpo-27867@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27867}.)

@ref{42d,,PyOS_AfterFork()} is deprecated in favour of the new functions
@ref{dbe,,PyOS_BeforeFork()}, @ref{dbf,,PyOS_AfterFork_Parent()} and
@ref{42e,,PyOS_AfterFork_Child()}.  (Contributed by Antoine Pitrou in
bpo-16500@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16500}.)

The @code{PyExc_RecursionErrorInst} singleton that was part of the public API
has been removed as its members being never cleared may cause a segfault
during finalization of the interpreter. Contributed by Xavier de Gaye in
bpo-22898@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22898} and bpo-30697@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30697}.

Added C API support for timezones with timezone constructors
@ref{dc0,,PyTimeZone_FromOffset()} and @ref{dc1,,PyTimeZone_FromOffsetAndName()},
and access to the UTC singleton with @ref{dc2,,PyDateTime_TimeZone_UTC}.
Contributed by Paul Ganssle in bpo-10381@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10381}.

The type of results of @code{PyThread_start_new_thread()} and
@code{PyThread_get_thread_ident()}, and the `id' parameter of
@ref{dc3,,PyThreadState_SetAsyncExc()} changed from long to
unsigned long.
(Contributed by Serhiy Storchaka in bpo-6532@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6532}.)

@ref{abf,,PyUnicode_AsWideCharString()} now raises a @ref{2ee,,ValueError} if the
second argument is @code{NULL} and the wchar_t* string contains null
characters.  (Contributed by Serhiy Storchaka in bpo-30708@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30708}.)

Changes to the startup sequence and the management of dynamic memory
allocators mean that the long documented requirement to call
@ref{45e,,Py_Initialize()} before calling most C API functions is now
relied on more heavily, and failing to abide by it may lead to segfaults in
embedding applications. See the @ref{cce,,Porting to Python 3.7} section in this
document and the @ref{dc4,,Before Python initialization} section in the C API documentation
for more details.

The new @ref{dc5,,PyInterpreterState_GetID()} returns the unique ID for a
given interpreter.
(Contributed by Eric Snow in bpo-29102@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29102}.)

@ref{dc6,,Py_DecodeLocale()}, @ref{dc7,,Py_EncodeLocale()} now use the UTF-8
encoding when the @ref{cc7,,UTF-8 mode} is enabled.
(Contributed by Victor Stinner in bpo-29240@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29240}.)

@ref{dc8,,PyUnicode_DecodeLocaleAndSize()} and @ref{dc9,,PyUnicode_EncodeLocale()}
now use the current locale encoding for @code{surrogateescape} error handler.
(Contributed by Victor Stinner in bpo-29240@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29240}.)

The `start' and `end' parameters of @ref{abc,,PyUnicode_FindChar()} are
now adjusted to behave like string slices.
(Contributed by Xiang Zhang in bpo-28822@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28822}.)

@node Build Changes<6>,Optimizations<8>,C API Changes<6>,What’s New In Python 3 7
@anchor{whatsnew/3 7 build-changes}@anchor{dca}
@subsection Build Changes


Support for building @code{--without-threads} has been removed.  The
@ref{f3,,threading} module is now always available.
(Contributed by Antoine Pitrou in bpo-31370@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31370}.).

A full copy of libffi is no longer bundled for use when building the
@ref{2e,,_ctypes} module on non-OSX UNIX platforms.  An installed copy
of libffi is now required when building @code{_ctypes} on such platforms.
(Contributed by Zachary Ware in bpo-27979@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27979}.)

The Windows build process no longer depends on Subversion to pull in external
sources, a Python script is used to download zipfiles from GitHub instead.
If Python 3.6 is not found on the system (via @code{py -3.6}), NuGet is used to
download a copy of 32-bit Python for this purpose.  (Contributed by Zachary
Ware in bpo-30450@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30450}.)

The @ref{d5,,ssl} module requires OpenSSL 1.0.2 or 1.1 compatible libssl.
OpenSSL 1.0.1 has reached end of lifetime on 2016-12-31 and is no longer
supported. LibreSSL is temporarily not supported as well. LibreSSL releases
up to version 2.6.4 are missing required OpenSSL 1.0.2 APIs.

@node Optimizations<8>,Other CPython Implementation Changes<2>,Build Changes<6>,What’s New In Python 3 7
@anchor{whatsnew/3 7 optimizations}@anchor{dcb}@anchor{whatsnew/3 7 whatsnew37-perf}@anchor{ccd}
@subsection Optimizations


The overhead of calling many methods of various standard library classes
implemented in C has been significantly reduced by porting more code
to use the @code{METH_FASTCALL} convention.
(Contributed by Victor Stinner in bpo-29300@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29300}, bpo-29507@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29507},
bpo-29452@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29452}, and bpo-29286@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29286}.)

Various optimizations have reduced Python startup time by 10% on Linux and
up to 30% on macOS.
(Contributed by Victor Stinner, INADA Naoki in bpo-29585@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29585}, and
Ivan Levkivskyi in bpo-31333@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31333}.)

Method calls are now up to 20% faster due to the bytecode changes which
avoid creating bound method instances.
(Contributed by Yury Selivanov and INADA Naoki in bpo-26110@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26110}.)
@anchor{whatsnew/3 7 whatsnew37-asyncio-perf}@anchor{cff}
The @ref{b,,asyncio} module received a number of notable optimizations for
commonly used functions:


@itemize *

@item 
The @ref{2f4,,asyncio.get_event_loop()} function has been reimplemented in C to
make it up to 15 times faster.
(Contributed by Yury Selivanov in bpo-32296@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32296}.)

@item 
@ref{dcc,,asyncio.Future} callback management has been optimized.
(Contributed by Yury Selivanov in bpo-32348@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32348}.)

@item 
@ref{814,,asyncio.gather()} is now up to 15% faster.
(Contributed by Yury Selivanov in bpo-32355@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32355}.)

@item 
@ref{c6a,,asyncio.sleep()} is now up to 2 times faster when the `delay'
argument is zero or negative.
(Contributed by Andrew Svetlov in bpo-32351@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32351}.)

@item 
The performance overhead of asyncio debug mode has been reduced.
(Contributed by Antoine Pitrou in bpo-31970@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31970}.)
@end itemize

As a result of @ref{cc2,,PEP 560 work}, the import time
of @ref{10b,,typing} has been reduced by a factor of 7, and many typing operations
are now faster.
(Contributed by Ivan Levkivskyi in bpo-32226@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32226}.)

@ref{dcd,,sorted()} and @ref{dce,,list.sort()} have been optimized for common cases
to be up to 40-75% faster.
(Contributed by Elliot Gorokhovsky in bpo-28685@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28685}.)

@ref{dcf,,dict.copy()} is now up to 5.5 times faster.
(Contributed by Yury Selivanov in bpo-31179@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31179}.)

@ref{6fa,,hasattr()} and @ref{dd0,,getattr()} are now about 4 times faster when
`name' is not found and `obj' does not override @ref{6fb,,object.__getattr__()}
or @ref{dd1,,object.__getattribute__()}.
(Contributed by INADA Naoki in bpo-32544@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32544}.)

Searching for certain Unicode characters (like Ukrainian capital “Є”)
in a string was up to 25 times slower than searching for other characters.
It is now only 3 times slower in the worst case.
(Contributed by Serhiy Storchaka in bpo-24821@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24821}.)

The @ref{4e1,,collections.namedtuple()} factory has been reimplemented to
make the creation of named tuples 4 to 6 times faster.
(Contributed by Jelle Zijlstra with further improvements by INADA Naoki,
Serhiy Storchaka, and Raymond Hettinger in bpo-28638@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28638}.)

@ref{dd2,,datetime.date.fromordinal()} and @ref{dd3,,datetime.date.fromtimestamp()}
are now up to 30% faster in the common case.
(Contributed by Paul Ganssle in bpo-32403@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32403}.)

The @ref{d58,,os.fwalk()} function is now up to 2 times faster thanks to
the use of @ref{c5a,,os.scandir()}.
(Contributed by Serhiy Storchaka in bpo-25996@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25996}.)

The speed of the @ref{354,,shutil.rmtree()} function has been improved by
20–40% thanks to the use of the @ref{c5a,,os.scandir()} function.
(Contributed by Serhiy Storchaka in bpo-28564@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28564}.)

Optimized case-insensitive matching and searching of @ref{be,,regular expressions}.  Searching some patterns can now be up to 20 times faster.
(Contributed by Serhiy Storchaka in bpo-30285@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30285}.)

@ref{dd4,,re.compile()} now converts @code{flags} parameter to int object if
it is @code{RegexFlag}.  It is now as fast as Python 3.5, and faster than
Python 3.6 by about 10% depending on the pattern.
(Contributed by INADA Naoki in bpo-31671@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31671}.)

The @ref{dd5,,modify()} methods of classes
@ref{dd6,,selectors.EpollSelector}, @ref{dd7,,selectors.PollSelector}
and @ref{dd8,,selectors.DevpollSelector} may be around 10% faster under
heavy loads.  (Contributed by Giampaolo Rodola’ in bpo-30014@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30014})

Constant folding has been moved from the peephole optimizer to the new AST
optimizer, which is able perform optimizations more consistently.
(Contributed by Eugene Toder and INADA Naoki in bpo-29469@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29469} and
bpo-11549@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11549}.)

Most functions and methods in @ref{4,,abc} have been rewritten in C.
This makes creation of abstract base classes, and calling @ref{2af,,isinstance()}
and @ref{9ca,,issubclass()} on them 1.5x faster.  This also reduces Python
start-up time by up to 10%. (Contributed by Ivan Levkivskyi and INADA Naoki
in bpo-31333@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31333})

Significant speed improvements to alternate constructors for
@ref{1fc,,datetime.date} and @ref{4e3,,datetime.datetime} by using fast-path
constructors when not constructing subclasses. (Contributed by Paul Ganssle
in bpo-32403@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32403})

The speed of comparison of @ref{4bf,,array.array} instances has been
improved considerably in certain cases.  It is now from 10x to 70x faster
when comparing arrays holding values of the same integer type.
(Contributed by Adrian Wielgosik in bpo-24700@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24700}.)

The @ref{dd9,,math.erf()} and @ref{dda,,math.erfc()} functions now use the (faster)
C library implementation on most platforms.
(Contributed by Serhiy Storchaka in bpo-26121@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26121}.)

@node Other CPython Implementation Changes<2>,Deprecated Python Behavior,Optimizations<8>,What’s New In Python 3 7
@anchor{whatsnew/3 7 other-cpython-implementation-changes}@anchor{ddb}
@subsection Other CPython Implementation Changes



@itemize *

@item 
Trace hooks may now opt out of receiving the @code{line} and opt into receiving
the @code{opcode} events from the interpreter by setting the corresponding new
@ref{ddc,,f_trace_lines} and @ref{ddd,,f_trace_opcodes} attributes on the
frame being traced. (Contributed by Nick Coghlan in bpo-31344@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31344}.)

@item 
Fixed some consistency problems with namespace package module attributes.
Namespace module objects now have an @code{__file__} that is set to @code{None}
(previously unset), and their @code{__spec__.origin} is also set to @code{None}
(previously the string @code{"namespace"}).  See bpo-32305@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32305}.  Also, the
namespace module object’s @code{__spec__.loader} is set to the same value as
@code{__loader__} (previously, the former was set to @code{None}).  See
bpo-32303@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32303}.

@item 
The @ref{46f,,locals()} dictionary now displays in the lexical order that
variables were defined.  Previously, the order was undefined.
(Contributed by Raymond Hettinger in bpo-32690@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32690}.)

@item 
The @code{distutils} @code{upload} command no longer tries to change CR
end-of-line characters to CRLF.  This fixes a corruption issue with sdists
that ended with a byte equivalent to CR.
(Contributed by Bo Bayles in bpo-32304@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32304}.)
@end itemize

@node Deprecated Python Behavior,Deprecated Python modules functions and methods,Other CPython Implementation Changes<2>,What’s New In Python 3 7
@anchor{whatsnew/3 7 deprecated-python-behavior}@anchor{dde}
@subsection Deprecated Python Behavior


Yield expressions (both @code{yield} and @code{yield from} clauses) are now deprecated
in comprehensions and generator expressions (aside from the iterable expression
in the leftmost @code{for} clause). This ensures that comprehensions
always immediately return a container of the appropriate type (rather than
potentially returning a @ref{ddf,,generator iterator} object), while generator
expressions won’t attempt to interleave their implicit output with the output
from any explicit yield expressions.  In Python 3.7, such expressions emit
@ref{1a4,,DeprecationWarning} when compiled, in Python 3.8 this will be a
@ref{18f,,SyntaxError}.
(Contributed by Serhiy Storchaka in bpo-10544@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10544}.)

Returning a subclass of @ref{198,,complex} from @ref{7fe,,object.__complex__()} is
deprecated and will be an error in future Python versions.  This makes
@code{__complex__()} consistent with @ref{19e,,object.__int__()} and
@ref{bc7,,object.__float__()}.
(Contributed by Serhiy Storchaka in bpo-28894@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28894}.)

@node Deprecated Python modules functions and methods,Deprecated functions and types of the C API,Deprecated Python Behavior,What’s New In Python 3 7
@anchor{whatsnew/3 7 deprecated-python-modules-functions-and-methods}@anchor{de0}
@subsection Deprecated Python modules, functions and methods


@menu
* aifc:: 
* asyncio: asyncio<11>. 
* collections: collections<3>. 
* dbm: dbm<3>. 
* enum: enum<6>. 
* gettext: gettext<2>. 
* importlib: importlib<5>. 
* locale: locale<5>. 
* macpath:: 
* threading: threading<6>. 
* socket: socket<7>. 
* ssl: ssl<7>. 
* sunau:: 
* sys: sys<9>. 
* wave:: 

@end menu

@node aifc,asyncio<11>,,Deprecated Python modules functions and methods
@anchor{whatsnew/3 7 aifc}@anchor{de1}
@subsubsection aifc


@code{aifc.openfp()} has been deprecated and will be removed in Python 3.9.
Use @code{aifc.open()} instead.
(Contributed by Brian Curtin in bpo-31985@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31985}.)

@node asyncio<11>,collections<3>,aifc,Deprecated Python modules functions and methods
@anchor{whatsnew/3 7 id2}@anchor{de2}@anchor{whatsnew/3 7 whatsnew37-asyncio-deprecated}@anchor{d1a}
@subsubsection asyncio


Support for directly @code{await}-ing instances of @ref{c6c,,asyncio.Lock} and
other asyncio synchronization primitives has been deprecated.  An
asynchronous context manager must be used in order to acquire and release
the synchronization resource.
(Contributed by Andrew Svetlov in bpo-32253@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32253}.)

The @code{asyncio.Task.current_task()} and @code{asyncio.Task.all_tasks()}
methods have been deprecated.
(Contributed by Andrew Svetlov in bpo-32250@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32250}.)

@node collections<3>,dbm<3>,asyncio<11>,Deprecated Python modules functions and methods
@anchor{whatsnew/3 7 id3}@anchor{de3}
@subsubsection collections


In Python 3.8, the abstract base classes in @ref{1f,,collections.abc} will no
longer be exposed in the regular @ref{1e,,collections} module.  This will help
create a clearer distinction between the concrete classes and the abstract
base classes.
(Contributed by Serhiy Storchaka in bpo-25988@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25988}.)

@node dbm<3>,enum<6>,collections<3>,Deprecated Python modules functions and methods
@anchor{whatsnew/3 7 id4}@anchor{de4}
@subsubsection dbm


@ref{36,,dbm.dumb} now supports reading read-only files and no longer writes the
index file when it is not changed.  A deprecation warning is now emitted
if the index file is missing and recreated in the @code{'r'} and @code{'w'}
modes (this will be an error in future Python releases).
(Contributed by Serhiy Storchaka in bpo-28847@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28847}.)

@node enum<6>,gettext<2>,dbm<3>,Deprecated Python modules functions and methods
@anchor{whatsnew/3 7 id5}@anchor{de5}
@subsubsection enum


In Python 3.8, attempting to check for non-Enum objects in @ref{843,,Enum}
classes will raise a @ref{199,,TypeError} (e.g. @code{1 in Color}); similarly,
attempting to check for non-Flag objects in a @ref{836,,Flag} member will
raise @code{TypeError} (e.g. @code{1 in Perm.RW}); currently, both operations
return @ref{d31,,False} instead.
(Contributed by Ethan Furman in bpo-33217@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33217}.)

@node gettext<2>,importlib<5>,enum<6>,Deprecated Python modules functions and methods
@anchor{whatsnew/3 7 gettext}@anchor{de6}
@subsubsection gettext


Using non-integer value for selecting a plural form in @ref{67,,gettext} is
now deprecated.  It never correctly worked. (Contributed by Serhiy Storchaka
in bpo-28692@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28692}.)

@node importlib<5>,locale<5>,gettext<2>,Deprecated Python modules functions and methods
@anchor{whatsnew/3 7 id6}@anchor{de7}
@subsubsection importlib


Methods
@code{MetaPathFinder.find_module()}
(replaced by
@ref{a6e,,MetaPathFinder.find_spec()})
and
@code{PathEntryFinder.find_loader()}
(replaced by
@ref{a72,,PathEntryFinder.find_spec()})
both deprecated in Python 3.4 now emit @ref{1a4,,DeprecationWarning}.
(Contributed by Matthias Bussonnier in bpo-29576@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29576}.)

The @ref{de8,,importlib.abc.ResourceLoader} ABC has been deprecated in
favour of @code{importlib.abc.ResourceReader}.

@node locale<5>,macpath,importlib<5>,Deprecated Python modules functions and methods
@anchor{whatsnew/3 7 id7}@anchor{de9}
@subsubsection locale


@code{locale.format()} has been deprecated, use @ref{743,,locale.format_string()}
instead.  (Contributed by Garvit in bpo-10379@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10379}.)

@node macpath,threading<6>,locale<5>,Deprecated Python modules functions and methods
@anchor{whatsnew/3 7 macpath}@anchor{dea}
@subsubsection macpath


The @code{macpath} is now deprecated and will be removed in Python 3.8.
(Contributed by Chi Hsuan Yen in bpo-9850@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9850}.)

@node threading<6>,socket<7>,macpath,Deprecated Python modules functions and methods
@anchor{whatsnew/3 7 threading}@anchor{deb}
@subsubsection threading


@code{dummy_threading} and @code{_dummy_thread} have been deprecated.  It is
no longer possible to build Python with threading disabled.
Use @ref{f3,,threading} instead.
(Contributed by Antoine Pitrou in bpo-31370@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31370}.)

@node socket<7>,ssl<7>,threading<6>,Deprecated Python modules functions and methods
@anchor{whatsnew/3 7 id8}@anchor{dec}
@subsubsection socket


The silent argument value truncation in @ref{a85,,socket.htons()} and
@ref{a86,,socket.ntohs()} has been deprecated.  In future versions of Python,
if the passed argument is larger than 16 bits, an exception will be raised.
(Contributed by Oren Milman in bpo-28332@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28332}.)

@node ssl<7>,sunau,socket<7>,Deprecated Python modules functions and methods
@anchor{whatsnew/3 7 id9}@anchor{ded}
@subsubsection ssl


@code{ssl.wrap_socket()} is deprecated.  Use
@ref{749,,ssl.SSLContext.wrap_socket()} instead.
(Contributed by Christian Heimes in bpo-28124@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28124}.)

@node sunau,sys<9>,ssl<7>,Deprecated Python modules functions and methods
@anchor{whatsnew/3 7 sunau}@anchor{dee}
@subsubsection sunau


@code{sunau.openfp()} has been deprecated and will be removed in Python 3.9.
Use @code{sunau.open()} instead.
(Contributed by Brian Curtin in bpo-31985@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31985}.)

@node sys<9>,wave,sunau,Deprecated Python modules functions and methods
@anchor{whatsnew/3 7 id10}@anchor{def}
@subsubsection sys


Deprecated @code{sys.set_coroutine_wrapper()} and
@code{sys.get_coroutine_wrapper()}.

The undocumented @code{sys.callstats()} function has been deprecated and
will be removed in a future Python version.
(Contributed by Victor Stinner in bpo-28799@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28799}.)

@node wave,,sys<9>,Deprecated Python modules functions and methods
@anchor{whatsnew/3 7 wave}@anchor{df0}
@subsubsection wave


@code{wave.openfp()} has been deprecated and will be removed in Python 3.9.
Use @ref{b4b,,wave.open()} instead.
(Contributed by Brian Curtin in bpo-31985@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31985}.)

@node Deprecated functions and types of the C API,Platform Support Removals,Deprecated Python modules functions and methods,What’s New In Python 3 7
@anchor{whatsnew/3 7 deprecated-functions-and-types-of-the-c-api}@anchor{df1}
@subsection Deprecated functions and types of the C API


Function @ref{42f,,PySlice_GetIndicesEx()} is deprecated and replaced with
a macro if @code{Py_LIMITED_API} is not set or set to a value in the range
between @code{0x03050400} and @code{0x03060000} (not inclusive), or is @code{0x03060100}
or higher.  (Contributed by Serhiy Storchaka in bpo-27867@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27867}.)

@ref{42d,,PyOS_AfterFork()} has been deprecated.  Use @ref{dbe,,PyOS_BeforeFork()},
@ref{dbf,,PyOS_AfterFork_Parent()} or @ref{42e,,PyOS_AfterFork_Child()} instead.
(Contributed by Antoine Pitrou in bpo-16500@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16500}.)

@node Platform Support Removals,API and Feature Removals<2>,Deprecated functions and types of the C API,What’s New In Python 3 7
@anchor{whatsnew/3 7 id11}@anchor{df2}@anchor{whatsnew/3 7 platform-support-removals}@anchor{d7d}
@subsection Platform Support Removals



@itemize *

@item 
FreeBSD 9 and older are no longer officially supported.

@item 
For full Unicode support, including within extension modules, *nix platforms
are now expected to provide at least one of @code{C.UTF-8} (full locale),
@code{C.utf8} (full locale) or @code{UTF-8} (@code{LC_CTYPE}-only locale) as an
alternative to the legacy @code{ASCII}-based @code{C} locale.

@item 
OpenSSL 0.9.8 and 1.0.1 are no longer supported, which means building CPython
3.7 with SSL/TLS support on older platforms still using these versions
requires custom build options that link to a more recent version of OpenSSL.

Notably, this issue affects the Debian 8 (aka “jessie”) and Ubuntu 14.04
(aka “Trusty”) LTS Linux distributions, as they still use OpenSSL 1.0.1 by
default.

Debian 9 (“stretch”) and Ubuntu 16.04 (“xenial”), as well as recent releases
of other LTS Linux releases (e.g. RHEL/CentOS 7.5, SLES 12-SP3), use OpenSSL
1.0.2 or later, and remain supported in the default build configuration.

CPython’s own CI configuration file@footnote{https://github.com/python/cpython/blob/v3.7.13/.travis.yml} provides an
example of using the SSL
compatibility testing infrastructure@footnote{https://github.com/python/cpython/tree/3.14/Tools/ssl/multissltests.py} in
CPython’s test suite to build and link against OpenSSL 1.1.0 rather than an
outdated system provided OpenSSL.
@end itemize

@node API and Feature Removals<2>,Module Removals,Platform Support Removals,What’s New In Python 3 7
@anchor{whatsnew/3 7 api-and-feature-removals}@anchor{df3}
@subsection API and Feature Removals


The following features and APIs have been removed from Python 3.7:


@itemize *

@item 
The @code{os.stat_float_times()} function has been removed. It was introduced in
Python 2.3 for backward compatibility with Python 2.2, and was deprecated
since Python 3.1.

@item 
Unknown escapes consisting of @code{'\'} and an ASCII letter in replacement
templates for @ref{5a3,,re.sub()} were deprecated in Python 3.5, and will now
cause an error.

@item 
Removed support of the `exclude' argument in @ref{df4,,tarfile.TarFile.add()}.
It was deprecated in Python 2.7 and 3.2.  Use the `filter' argument instead.

@item 
The @code{ntpath.splitunc()} function was deprecated in
Python 3.1, and has now been removed.  Use @ref{df5,,splitdrive()}
instead.

@item 
@ref{4e1,,collections.namedtuple()} no longer supports the `verbose' parameter
or @code{_source} attribute which showed the generated source code for the
named tuple class.  This was part of an optimization designed to speed-up
class creation.  (Contributed by Jelle Zijlstra with further improvements
by INADA Naoki, Serhiy Storchaka, and Raymond Hettinger in bpo-28638@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28638}.)

@item 
Functions @ref{3c1,,bool()}, @ref{197,,float()}, @ref{24f,,list()} and @ref{614,,tuple()} no
longer take keyword arguments.  The first argument of @ref{19c,,int()} can now
be passed only as positional argument.

@item 
Removed previously deprecated in Python 2.4 classes @code{Plist}, @code{Dict} and
@code{_InternalDict} in the @ref{b0,,plistlib} module.  Dict values in the result
of functions @code{readPlist()} and
@code{readPlistFromBytes()} are now normal dicts.  You no longer
can use attribute access to access items of these dictionaries.

@item 
The @code{asyncio.windows_utils.socketpair()} function has been
removed.  Use the @ref{df6,,socket.socketpair()} function instead,
it is available on all platforms since Python 3.5.
@code{asyncio.windows_utils.socketpair} was just an alias to
@code{socket.socketpair} on Python 3.5 and newer.

@item 
@ref{b,,asyncio} no longer exports the @ref{c7,,selectors} and
@code{_overlapped} modules as @code{asyncio.selectors} and
@code{asyncio._overlapped}. Replace @code{from asyncio import selectors} with
@code{import selectors}.

@item 
Direct instantiation of @ref{aed,,ssl.SSLSocket} and @ref{d80,,ssl.SSLObject}
objects is now prohibited. The constructors were never documented, tested,
or designed as public constructors.  Users were supposed to use
@code{ssl.wrap_socket()} or @ref{355,,ssl.SSLContext}.
(Contributed by Christian Heimes in bpo-32951@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32951}.)

@item 
The unused @code{distutils} @code{install_misc} command has been removed.
(Contributed by Eric N. Vander Weele in bpo-29218@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29218}.)
@end itemize

@node Module Removals,Windows-only Changes,API and Feature Removals<2>,What’s New In Python 3 7
@anchor{whatsnew/3 7 module-removals}@anchor{df7}
@subsection Module Removals


The @code{fpectl} module has been removed.  It was never enabled by
default, never worked correctly on x86-64, and it changed the Python
ABI in ways that caused unexpected breakage of C extensions.
(Contributed by Nathaniel J. Smith in bpo-29137@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29137}.)

@node Windows-only Changes,Porting to Python 3 7,Module Removals,What’s New In Python 3 7
@anchor{whatsnew/3 7 windows-only-changes}@anchor{df8}
@subsection Windows-only Changes


The python launcher, (py.exe), can accept 32 & 64 bit specifiers `without'
having to specify a minor version as well. So @code{py -3-32} and @code{py -3-64}
become valid as well as @code{py -3.7-32}, also the -`m'-64 and -`m.n'-64 forms
are now accepted to force 64 bit python even if 32 bit would have otherwise
been used. If the specified version is not available py.exe will error exit.
(Contributed by Steve Barnes in bpo-30291@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30291}.)

The launcher can be run as @code{py -0} to produce a list of the installed pythons,
`with default marked with an asterisk'. Running @code{py -0p} will include the paths.
If py is run with a version specifier that cannot be matched it will also print
the `short form' list of available specifiers.
(Contributed by Steve Barnes in bpo-30362@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30362}.)

@node Porting to Python 3 7,Notable changes in Python 3 7 1,Windows-only Changes,What’s New In Python 3 7
@anchor{whatsnew/3 7 porting-to-python-3-7}@anchor{df9}@anchor{whatsnew/3 7 porting-to-python-37}@anchor{cce}
@subsection Porting to Python 3.7


This section lists previously described changes and other bugfixes
that may require changes to your code.

@menu
* Changes in Python Behavior:: 
* Changes in the Python API: Changes in the Python API<8>. 
* Changes in the C API: Changes in the C API<6>. 
* CPython bytecode changes: CPython bytecode changes<7>. 
* Windows-only Changes: Windows-only Changes<2>. 
* Other CPython implementation changes:: 

@end menu

@node Changes in Python Behavior,Changes in the Python API<8>,,Porting to Python 3 7
@anchor{whatsnew/3 7 changes-in-python-behavior}@anchor{dfa}
@subsubsection Changes in Python Behavior



@itemize *

@item 
@ref{940,,async} and @ref{18e,,await} names are now reserved keywords.
Code using these names as identifiers will now raise a @ref{18f,,SyntaxError}.
(Contributed by Jelle Zijlstra in bpo-30406@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30406}.)

@item 
@geindex Python Enhancement Proposals; PEP 479
PEP 479@footnote{https://peps.python.org/pep-0479/} is enabled for all code in Python 3.7, meaning that
@ref{dfb,,StopIteration} exceptions raised directly or indirectly in
coroutines and generators are transformed into @ref{246,,RuntimeError}
exceptions.
(Contributed by Yury Selivanov in bpo-32670@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32670}.)

@item 
@ref{dfc,,object.__aiter__()} methods can no longer be declared as
asynchronous.  (Contributed by Yury Selivanov in bpo-31709@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31709}.)

@item 
Due to an oversight, earlier Python versions erroneously accepted the
following syntax:

@example
f(1 for x in [1],)

class C(1 for x in [1]):
    pass
@end example

Python 3.7 now correctly raises a @ref{18f,,SyntaxError}, as a generator
expression always needs to be directly inside a set of parentheses
and cannot have a comma on either side, and the duplication of the
parentheses can be omitted only on calls.
(Contributed by Serhiy Storchaka in bpo-32012@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32012} and bpo-32023@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32023}.)

@item 
When using the @ref{23e,,-m} switch, the initial working directory is now added
to @ref{3e2,,sys.path}, rather than an empty string (which dynamically denoted
the current working directory at the time of each import). Any programs that
are checking for the empty string, or otherwise relying on the previous
behaviour, will need to be updated accordingly (e.g. by also checking for
@code{os.getcwd()} or @code{os.path.dirname(__main__.__file__)}, depending on why
the code was checking for the empty string in the first place).
@end itemize

@node Changes in the Python API<8>,Changes in the C API<6>,Changes in Python Behavior,Porting to Python 3 7
@anchor{whatsnew/3 7 changes-in-the-python-api}@anchor{dfd}
@subsubsection Changes in the Python API



@itemize *

@item 
@ref{d75,,socketserver.ThreadingMixIn.server_close} now waits until all
non-daemon threads complete.  Set the new
@ref{d76,,socketserver.ThreadingMixIn.block_on_close} class attribute to
@code{False} to get the pre-3.7 behaviour.
(Contributed by Victor Stinner in bpo-31233@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31233} and bpo-33540@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33540}.)

@item 
@ref{d75,,socketserver.ForkingMixIn.server_close} now waits until all
child processes complete. Set the new
@ref{d76,,socketserver.ForkingMixIn.block_on_close} class attribute to @code{False}
to get the pre-3.7 behaviour.
(Contributed by Victor Stinner in bpo-31151@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31151} and bpo-33540@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33540}.)

@item 
The @ref{dfe,,locale.localeconv()} function now temporarily sets the @code{LC_CTYPE}
locale to the value of @code{LC_NUMERIC} in some cases.
(Contributed by Victor Stinner in bpo-31900@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31900}.)

@item 
@ref{dff,,pkgutil.walk_packages()} now raises a @ref{2ee,,ValueError} if `path' is
a string.  Previously an empty list was returned.
(Contributed by Sanyam Khurana in bpo-24744@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24744}.)

@item 
A format string argument for @ref{e00,,string.Formatter.format()}
is now @ref{c7e,,positional-only}.
Passing it as a keyword argument was deprecated in Python 3.5. (Contributed
by Serhiy Storchaka in bpo-29193@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29193}.)

@item 
Attributes @ref{e01,,key},
@ref{e02,,value} and
@ref{e03,,coded_value} of class
@ref{e04,,http.cookies.Morsel} are now read-only.
Assigning to them was deprecated in Python 3.5.
Use the @ref{e05,,set()} method for setting them.
(Contributed by Serhiy Storchaka in bpo-29192@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29192}.)

@item 
The `mode' argument of @ref{52d,,os.makedirs()} no longer affects the file
permission bits of newly created intermediate-level directories.
To set their file permission bits you can set the umask before invoking
@code{makedirs()}.
(Contributed by Serhiy Storchaka in bpo-19930@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19930}.)

@item 
The @ref{e06,,struct.Struct.format} type is now @ref{16a,,str} instead of
@ref{193,,bytes}. (Contributed by Victor Stinner in bpo-21071@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21071}.)

@item 
@code{cgi.parse_multipart()} now accepts the `encoding' and `errors'
arguments and returns the same results as
@code{FieldStorage}: for non-file fields, the value associated to a key
is a list of strings, not bytes.
(Contributed by Pierre Quentel in bpo-29979@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29979}.)

@item 
Due to internal changes in @ref{d1,,socket}, calling @ref{e07,,socket.fromshare()}
on a socket created by @ref{e08,,socket.share} in older
Python versions is not supported.

@item 
@code{repr} for @ref{7d8,,BaseException} has changed to not include the trailing
comma.  Most exceptions are affected by this change.
(Contributed by Serhiy Storchaka in bpo-30399@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30399}.)

@item 
@code{repr} for @ref{bc9,,datetime.timedelta} has changed to include the keyword
arguments in the output. (Contributed by Utkarsh Upadhyay in bpo-30302@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30302}.)

@item 
Because @ref{354,,shutil.rmtree()} is now implemented using the @ref{c5a,,os.scandir()}
function, the user specified handler `onerror' is now called with the first
argument @code{os.scandir} instead of @code{os.listdir} when listing the directory
is failed.

@item 
Support for nested sets and set operations in regular expressions as in
Unicode Technical Standard #18@footnote{https://unicode.org/reports/tr18/} might be added in the future.  This would
change the syntax.  To facilitate this future change a @ref{659,,FutureWarning}
will be raised in ambiguous cases for the time being.
That include sets starting with a literal @code{'['} or containing literal
character sequences @code{'--'}, @code{'&&'}, @code{'~~'}, and @code{'||'}.  To
avoid a warning, escape them with a backslash.
(Contributed by Serhiy Storchaka in bpo-30349@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30349}.)

@item 
The result of splitting a string on a @ref{be,,regular expression}
that could match an empty string has been changed.  For example
splitting on @code{r'\s*'} will now split not only on whitespaces as it
did previously, but also on empty strings before all non-whitespace
characters and just before the end of the string.
The previous behavior can be restored by changing the pattern
to @code{r'\s+'}.  A @ref{659,,FutureWarning} was emitted for such patterns since
Python 3.5.

For patterns that match both empty and non-empty strings, the result of
searching for all matches may also be changed in other cases.  For example
in the string @code{'a\n\n'}, the pattern @code{r'(?m)^\s*?$'} will not only
match empty strings at positions 2 and 3, but also the string @code{'\n'} at
positions 2–3.  To match only blank lines, the pattern should be rewritten
as @code{r'(?m)^[^\S\n]*$'}.

@ref{5a3,,re.sub()} now replaces empty matches adjacent to a previous
non-empty match.  For example @code{re.sub('x*', '-', 'abxd')} returns now
@code{'-a-b--d-'} instead of @code{'-a-b-d-'} (the first minus between ‘b’ and
‘d’ replaces ‘x’, and the second minus replaces an empty string between
‘x’ and ‘d’).

(Contributed by Serhiy Storchaka in bpo-25054@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25054} and bpo-32308@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32308}.)

@item 
Change @ref{e09,,re.escape()} to only escape regex special characters instead
of escaping all characters other than ASCII letters, numbers, and @code{'_'}.
(Contributed by Serhiy Storchaka in bpo-29995@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29995}.)

@item 
@ref{d95,,tracemalloc.Traceback} frames are now sorted from oldest to most
recent to be more consistent with @ref{105,,traceback}.
(Contributed by Jesse Bakker in bpo-32121@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32121}.)

@item 
On OSes that support @ref{e0a,,socket.SOCK_NONBLOCK} or
@ref{e0b,,socket.SOCK_CLOEXEC} bit flags, the
@ref{e0c,,socket.type} no longer has them applied.
Therefore, checks like @code{if sock.type == socket.SOCK_STREAM}
work as expected on all platforms.
(Contributed by Yury Selivanov in bpo-32331@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32331}.)

@item 
On Windows the default for the `close_fds' argument of
@ref{4b8,,subprocess.Popen} was changed from @ref{d31,,False} to @ref{e0d,,True}
when redirecting the standard handles. If you previously depended on handles
being inherited when using @code{subprocess.Popen} with standard io
redirection, you will have to pass @code{close_fds=False} to preserve the
previous behaviour, or use
@ref{e0e,,STARTUPINFO.lpAttributeList}.

@item 
@ref{e0f,,importlib.machinery.PathFinder.invalidate_caches()} – which implicitly
affects @ref{e10,,importlib.invalidate_caches()} – now deletes entries
in @ref{7fb,,sys.path_importer_cache} which are set to @code{None}.
(Contributed by Brett Cannon in bpo-33169@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33169}.)

@item 
In @ref{b,,asyncio},
@ref{e11,,loop.sock_recv()},
@ref{e12,,loop.sock_sendall()},
@ref{e13,,loop.sock_accept()},
@ref{e14,,loop.getaddrinfo()},
@ref{e15,,loop.getnameinfo()}
have been changed to be proper coroutine methods to match their
documentation.  Previously, these methods returned @ref{dcc,,asyncio.Future}
instances.
(Contributed by Yury Selivanov in bpo-32327@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32327}.)

@item 
@ref{e16,,asyncio.Server.sockets} now returns a copy of the internal list
of server sockets, instead of returning it directly.
(Contributed by Yury Selivanov in bpo-32662@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32662}.)

@item 
@ref{e06,,Struct.format} is now a @ref{16a,,str} instance
instead of a @ref{193,,bytes} instance.
(Contributed by Victor Stinner in bpo-21071@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21071}.)

@item 
@ref{7,,argparse} subparsers can now be made mandatory by passing @code{required=True}
to @ref{e17,,ArgumentParser.add_subparsers()}.
(Contributed by Anthony Sottile in bpo-26510@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26510}.)

@item 
@ref{e18,,ast.literal_eval()} is now stricter.  Addition and subtraction of
arbitrary numbers are no longer allowed.
(Contributed by Serhiy Storchaka in bpo-31778@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31778}.)

@item 
@ref{e19,,Calendar.itermonthdates}
will now consistently raise an exception when a date falls outside of the
@code{0001-01-01} through @code{9999-12-31} range.  To support applications that
cannot tolerate such exceptions, the new
@ref{e1a,,Calendar.itermonthdays3} and
@ref{e1b,,Calendar.itermonthdays4} can be used.
The new methods return tuples and are not restricted by the range supported by
@ref{1fc,,datetime.date}.
(Contributed by Alexander Belopolsky in bpo-28292@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28292}.)

@item 
@ref{e1c,,collections.ChainMap} now preserves the order of the underlying
mappings.  (Contributed by Raymond Hettinger in bpo-32792@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32792}.)

@item 
The @code{submit()} method of @ref{94e,,concurrent.futures.ThreadPoolExecutor}
and @ref{1d8,,concurrent.futures.ProcessPoolExecutor} now raises
a @ref{246,,RuntimeError} if called during interpreter shutdown.
(Contributed by Mark Nemec in bpo-33097@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33097}.)

@item 
The @ref{4df,,configparser.ConfigParser} constructor now uses @code{read_dict()}
to process the default values, making its behavior consistent with the
rest of the parser.  Non-string keys and values in the defaults
dictionary are now being implicitly converted to strings.
(Contributed by James Tocknell in bpo-23835@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23835}.)

@item 
Several undocumented internal imports were removed.
One example is that @code{os.errno} is no longer available; use @code{import errno}
directly instead.
Note that such undocumented internal imports may be removed any time without
notice, even in micro version releases.
@end itemize

@node Changes in the C API<6>,CPython bytecode changes<7>,Changes in the Python API<8>,Porting to Python 3 7
@anchor{whatsnew/3 7 changes-in-the-c-api}@anchor{e1d}
@subsubsection Changes in the C API


The function @ref{42f,,PySlice_GetIndicesEx()} is considered unsafe for
resizable sequences.  If the slice indices are not instances of @ref{19c,,int},
but objects that implement the @code{__index__()} method, the sequence can be
resized after passing its length to @code{PySlice_GetIndicesEx()}.  This
can lead to returning indices out of the length of the sequence.  For
avoiding possible problems use new functions @ref{430,,PySlice_Unpack()} and
@ref{431,,PySlice_AdjustIndices()}.
(Contributed by Serhiy Storchaka in bpo-27867@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27867}.)

@node CPython bytecode changes<7>,Windows-only Changes<2>,Changes in the C API<6>,Porting to Python 3 7
@anchor{whatsnew/3 7 cpython-bytecode-changes}@anchor{e1e}
@subsubsection CPython bytecode changes


There are two new opcodes: @code{LOAD_METHOD} and @code{CALL_METHOD}.
(Contributed by Yury Selivanov and INADA Naoki in bpo-26110@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26110}.)

The @code{STORE_ANNOTATION} opcode has been removed.
(Contributed by Mark Shannon in bpo-32550@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32550}.)

@node Windows-only Changes<2>,Other CPython implementation changes,CPython bytecode changes<7>,Porting to Python 3 7
@anchor{whatsnew/3 7 id12}@anchor{e1f}
@subsubsection Windows-only Changes


The file used to override @ref{3e2,,sys.path} is now called
@code{<python-executable>._pth} instead of @code{'sys.path'}.
See @ref{e20,,Finding modules} for more information.
(Contributed by Steve Dower in bpo-28137@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28137}.)

@node Other CPython implementation changes,,Windows-only Changes<2>,Porting to Python 3 7
@anchor{whatsnew/3 7 id13}@anchor{e21}
@subsubsection Other CPython implementation changes


In preparation for potential future changes to the public CPython runtime
initialization API (see 
@geindex Python Enhancement Proposals; PEP 432
PEP 432@footnote{https://peps.python.org/pep-0432/} for an initial, but somewhat outdated,
draft), CPython’s internal startup
and configuration management logic has been significantly refactored. While
these updates are intended to be entirely transparent to both embedding
applications and users of the regular CPython CLI, they’re being mentioned
here as the refactoring changes the internal order of various operations
during interpreter startup, and hence may uncover previously latent defects,
either in embedding applications, or in CPython itself.
(Initially contributed by Nick Coghlan and Eric Snow as part of
bpo-22257@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22257}, and further updated by Nick, Eric, and Victor Stinner in a
number of other issues). Some known details affected:


@itemize *

@item 
@code{PySys_AddWarnOptionUnicode()} is not currently usable by embedding
applications due to the requirement to create a Unicode object prior to
calling @code{Py_Initialize}. Use @code{PySys_AddWarnOption()} instead.

@item 
warnings filters added by an embedding application with
@code{PySys_AddWarnOption()} should now more consistently take precedence
over the default filters set by the interpreter
@end itemize

Due to changes in the way the default warnings filters are configured,
setting @ref{404,,Py_BytesWarningFlag} to a value greater than one is no longer
sufficient to both emit @ref{e22,,BytesWarning} messages and have them converted
to exceptions.  Instead, the flag must be set (to cause the warnings to be
emitted in the first place), and an explicit @code{error::BytesWarning}
warnings filter added to convert them to exceptions.

Due to a change in the way docstrings are handled by the compiler, the
implicit @code{return None} in a function body consisting solely of a docstring
is now marked as occurring on the same line as the docstring, not on the
function’s header line.

The current exception state has been moved from the frame object to the co-routine.
This simplified the interpreter and fixed a couple of obscure bugs caused by
having swap exception state when entering or exiting a generator.
(Contributed by Mark Shannon in bpo-25612@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25612}.)

@node Notable changes in Python 3 7 1,Notable changes in Python 3 7 2,Porting to Python 3 7,What’s New In Python 3 7
@anchor{whatsnew/3 7 notable-changes-in-python-3-7-1}@anchor{e23}
@subsection Notable changes in Python 3.7.1


Starting in 3.7.1, @ref{45e,,Py_Initialize()} now consistently reads and respects
all of the same environment settings as @ref{e24,,Py_Main()} (in earlier Python
versions, it respected an ill-defined subset of those environment variables,
while in Python 3.7.0 it didn’t read any of them due to bpo-34247@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34247}). If
this behavior is unwanted, set @ref{408,,Py_IgnoreEnvironmentFlag} to 1 before
calling @code{Py_Initialize()}.

In 3.7.1 the C API for Context Variables
@ref{e25,,was updated} to use
@ref{5df,,PyObject} pointers.  See also bpo-34762@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34762}.

In 3.7.1 the @ref{102,,tokenize} module now implicitly emits a @code{NEWLINE} token
when provided with input that does not have a trailing new line.  This behavior
now matches what the C tokenizer does internally.
(Contributed by Ammar Askar in bpo-33899@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33899}.)

@node Notable changes in Python 3 7 2,Notable changes in Python 3 7 6,Notable changes in Python 3 7 1,What’s New In Python 3 7
@anchor{whatsnew/3 7 notable-changes-in-python-3-7-2}@anchor{e26}
@subsection Notable changes in Python 3.7.2


In 3.7.2, @ref{118,,venv} on Windows no longer copies the original binaries, but
creates redirector scripts named @code{python.exe} and @code{pythonw.exe} instead.
This resolves a long standing issue where all virtual environments would have
to be upgraded or recreated with each Python update. However, note that this
release will still require recreation of virtual environments in order to get
the new scripts.

@node Notable changes in Python 3 7 6,Notable changes in Python 3 7 10,Notable changes in Python 3 7 2,What’s New In Python 3 7
@anchor{whatsnew/3 7 notable-changes-in-python-3-7-6}@anchor{e27}
@subsection Notable changes in Python 3.7.6


Due to significant security concerns, the `reuse_address' parameter of
@ref{941,,asyncio.loop.create_datagram_endpoint()} is no longer supported. This is
because of the behavior of the socket option @code{SO_REUSEADDR} in UDP. For more
details, see the documentation for @code{loop.create_datagram_endpoint()}.
(Contributed by Kyle Stanley, Antoine Pitrou, and Yury Selivanov in
bpo-37228@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37228}.)

@node Notable changes in Python 3 7 10,Notable changes in Python 3 7 11,Notable changes in Python 3 7 6,What’s New In Python 3 7
@anchor{whatsnew/3 7 notable-changes-in-python-3-7-10}@anchor{e28}
@subsection Notable changes in Python 3.7.10


Earlier Python versions allowed using both @code{;} and @code{&} as
query parameter separators in @ref{321,,urllib.parse.parse_qs()} and
@ref{320,,urllib.parse.parse_qsl()}.  Due to security concerns, and to conform with
newer W3C recommendations, this has been changed to allow only a single
separator key, with @code{&} as the default.  This change also affects
@code{cgi.parse()} and @code{cgi.parse_multipart()} as they use the affected
functions internally. For more details, please see their respective
documentation.
(Contributed by Adam Goldschmidt, Senthil Kumaran and Ken Jin in bpo-42967@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42967}.)

@node Notable changes in Python 3 7 11,Notable security feature in 3 7 14,Notable changes in Python 3 7 10,What’s New In Python 3 7
@anchor{whatsnew/3 7 notable-changes-in-python-3-7-11}@anchor{e29}
@subsection Notable changes in Python 3.7.11


A security fix alters the @ref{afc,,ftplib.FTP} behavior to not trust the
IPv4 address sent from the remote server when setting up a passive data
channel.  We reuse the ftp server IP address instead.  For unusual code
requiring the old behavior, set a @code{trust_server_pasv_ipv4_address}
attribute on your FTP instance to @code{True}.  (See gh-87451@footnote{https://github.com/python/cpython/issues/87451})

The presence of newline or tab characters in parts of a URL allows for some
forms of attacks. Following the WHATWG specification that updates RFC 3986,
ASCII newline @code{\n}, @code{\r} and tab @code{\t} characters are stripped from the
URL by the parser @ref{111,,urllib.parse()} preventing such attacks. The removal
characters are controlled by a new module level variable
@code{urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE}. (See gh-88048@footnote{https://github.com/python/cpython/issues/88048})

@node Notable security feature in 3 7 14,,Notable changes in Python 3 7 11,What’s New In Python 3 7
@anchor{whatsnew/3 7 notable-security-feature-in-3-7-14}@anchor{e2a}
@subsection Notable security feature in 3.7.14


Converting between @ref{19c,,int} and @ref{16a,,str} in bases other than 2
(binary), 4, 8 (octal), 16 (hexadecimal), or 32 such as base 10 (decimal)
now raises a @ref{2ee,,ValueError} if the number of digits in string form is
above a limit to avoid potential denial of service attacks due to the
algorithmic complexity. This is a mitigation for 
@geindex Common Vulnerabilities and Exposures; CVE 2020-10735
CVE 2020-10735@footnote{https://www.cve.org/CVERecord?id=CVE-2020-10735}.
This limit can be configured or disabled by environment variable, command
line flag, or @ref{df,,sys} APIs. See the @ref{80c,,integer string conversion length limitation} documentation.  The default limit
is 4300 digits in string form.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node What’s New In Python 3 6,What’s New In Python 3 5,What’s New In Python 3 7,What’s New in Python
@anchor{whatsnew/3 6 doc}@anchor{e2b}@anchor{whatsnew/3 6 translation-repo}@anchor{e2c}@anchor{whatsnew/3 6 what-s-new-in-python-3-6}@anchor{e2d}
@section What’s New In Python 3.6


@*Editors: 
Elvis Pranskevichus <@email{elvis@@magic.io}>, Yury Selivanov <@email{yury@@magic.io}>


@c Rules for maintenance:
@c 
@c * Anyone can add text to this document.  Do not spend very much time
@c on the wording of your changes, because your text will probably
@c get rewritten to some degree.
@c 
@c * The maintainer will go through Misc/NEWS periodically and add
@c changes; it's therefore more important to add your changes to
@c Misc/NEWS than to this file.
@c 
@c * This is not a complete list of every single change; completeness
@c is the purpose of Misc/NEWS.  Some changes I consider too small
@c or esoteric to include.  If such a change is added to the text,
@c I'll just remove it.  (This is another reason you shouldn't spend
@c too much time on writing your addition.)
@c 
@c * If you want to draw your new text to the attention of the
@c maintainer, add 'XXX' to the beginning of the paragraph or
@c section.
@c 
@c * It's OK to just add a fragmentary note about a change.  For
@c example: "XXX Describe the transmogrify() function added to the
@c socket module."  The maintainer will research the change and
@c write the necessary text.
@c 
@c * You can comment out your additions if you like, but it's not
@c necessary (especially when a final release is some months away).
@c 
@c * Credit the author of a patch or bugfix.   Just the name is
@c sufficient; the e-mail address isn't necessary.
@c 
@c * It's helpful to add the bug/patch number as a comment:
@c 
@c XXX Describe the transmogrify() function added to the socket
@c module.
@c (Contributed by P.Y. Developer in :issue:`12345`.)
@c 
@c This saves the maintainer the effort of going through the Mercurial log
@c when researching a change.

This article explains the new features in Python 3.6, compared to 3.5.
Python 3.6 was released on December 23, 2016.  See the
changelog@footnote{https://docs.python.org/3.6/whatsnew/changelog.html} for a full
list of changes.


@subsubheading See also


@geindex Python Enhancement Proposals; PEP 494
PEP 494@footnote{https://peps.python.org/pep-0494/} - Python 3.6 Release Schedule


@menu
* Summary – Release highlights: Summary – Release highlights<7>. 
* New Features: New Features<13>. 
* Other Language Changes: Other Language Changes<8>. 
* New Modules: New Modules<8>. 
* Improved Modules: Improved Modules<8>. 
* Optimizations: Optimizations<9>. 
* Build and C API Changes: Build and C API Changes<2>. 
* Other Improvements:: 
* Deprecated: Deprecated<10>. 
* Removed: Removed<10>. 
* Porting to Python 3.6: Porting to Python 3 6. 
* Notable changes in Python 3.6.2: Notable changes in Python 3 6 2. 
* Notable changes in Python 3.6.4: Notable changes in Python 3 6 4. 
* Notable changes in Python 3.6.5: Notable changes in Python 3 6 5. 
* Notable changes in Python 3.6.7: Notable changes in Python 3 6 7. 
* Notable changes in Python 3.6.10: Notable changes in Python 3 6 10. 
* Notable changes in Python 3.6.13: Notable changes in Python 3 6 13. 
* Notable changes in Python 3.6.14: Notable changes in Python 3 6 14. 

@end menu

@node Summary – Release highlights<7>,New Features<13>,,What’s New In Python 3 6
@anchor{whatsnew/3 6 summary-release-highlights}@anchor{e2e}
@subsection Summary – Release highlights


New syntax features:


@itemize *

@item 
@ref{e2f,,PEP 498}, formatted string literals.

@item 
@ref{e30,,PEP 515}, underscores in numeric literals.

@item 
@ref{e31,,PEP 526}, syntax for variable annotations.

@item 
@ref{e32,,PEP 525}, asynchronous generators.

@item 
@ref{e33,,PEP 530}: asynchronous comprehensions.
@end itemize

New library modules:


@itemize *

@item 
@ref{c5,,secrets}: @ref{e34,,PEP 506 – Adding A Secrets Module To The Standard Library}.
@end itemize

CPython implementation improvements:


@itemize *

@item 
The @ref{cc3,,dict} type has been reimplemented to use
a @ref{e35,,more compact representation}
based on a proposal by Raymond Hettinger@footnote{https://mail.python.org/pipermail/python-dev/2012-December/123028.html}
and similar to the PyPy dict implementation@footnote{https://morepypy.blogspot.com/2015/01/faster-more-memory-efficient-and-more.html}.  This resulted in dictionaries
using 20% to 25% less memory when compared to Python 3.5.

@item 
Customization of class creation has been simplified with the
@ref{e36,,new protocol}.

@item 
The class attribute definition order is
@ref{e37,,now preserved}.

@item 
The order of elements in @code{**kwargs} now
@ref{e38,,corresponds to the order} in which keyword
arguments were passed to the function.

@item 
DTrace and SystemTap @ref{e39,,probing support} has
been added.

@item 
The new @ref{e3a,,PYTHONMALLOC} environment variable
can now be used to debug the interpreter memory allocation and access
errors.
@end itemize

Significant improvements in the standard library:


@itemize *

@item 
The @ref{b,,asyncio} module has received new features, significant
usability and performance improvements, and a fair amount of bug fixes.
Starting with Python 3.6 the @code{asyncio} module is no longer provisional
and its API is considered stable.

@item 
A new @ref{e3b,,file system path protocol} has been
implemented to support @ref{5a1,,path-like objects}.
All standard library functions operating on paths have been updated to
work with the new protocol.

@item 
The @ref{34,,datetime} module has gained support for
@ref{e3c,,Local Time Disambiguation}.

@item 
The @ref{10b,,typing} module received a number of
@ref{e3d,,improvements}.

@item 
The @ref{106,,tracemalloc} module has been significantly reworked
and is now used to provide better output for @ref{54d,,ResourceWarning}
as well as provide better diagnostics for memory allocation errors.
See the @ref{e3a,,PYTHONMALLOC section} for more
information.
@end itemize

Security improvements:


@itemize *

@item 
The new @ref{c5,,secrets} module has been added to simplify the generation of
cryptographically strong pseudo-random numbers suitable for
managing secrets such as account authentication, tokens, and similar.

@item 
On Linux, @ref{747,,os.urandom()} now blocks until the system urandom entropy
pool is initialized to increase the security. See the 
@geindex Python Enhancement Proposals; PEP 524
PEP 524@footnote{https://peps.python.org/pep-0524/} for the
rationale.

@item 
The @ref{6c,,hashlib} and @ref{d5,,ssl} modules now support OpenSSL 1.1.0.

@item 
The default settings and feature set of the @ref{d5,,ssl} module have been
improved.

@item 
The @ref{6c,,hashlib} module received support for the BLAKE2, SHA-3 and SHAKE
hash algorithms and the @ref{e3e,,scrypt()} key derivation function.
@end itemize

Windows improvements:


@itemize *

@item 
@ref{e3f,,PEP 528} and @ref{e40,,PEP 529},
Windows filesystem and console encoding changed to UTF-8.

@item 
The @code{py.exe} launcher, when used interactively, no longer prefers
Python 2 over Python 3 when the user doesn’t specify a version (via
command line arguments or a config file).  Handling of shebang lines
remains unchanged - “python” refers to Python 2 in that case.

@item 
@code{python.exe} and @code{pythonw.exe} have been marked as long-path aware,
which means that the 260 character path limit may no longer apply.
See @ref{e41,,removing the MAX_PATH limitation} for details.

@item 
A @code{._pth} file can be added to force isolated mode and fully specify
all search paths to avoid registry and environment lookup. See
@ref{e20,,the documentation} for more information.

@item 
A @code{python36.zip} file now works as a landmark to infer
@geindex PYTHONHOME
@geindex environment variable; PYTHONHOME
@ref{3ee,,PYTHONHOME}. See @ref{e20,,the documentation} for
more information.
@end itemize

@node New Features<13>,Other Language Changes<8>,Summary – Release highlights<7>,What’s New In Python 3 6
@anchor{whatsnew/3 6 new-features}@anchor{e42}@anchor{whatsnew/3 6 pypy-dict-implementation}@anchor{e43}
@subsection New Features


@menu
* PEP 498; Formatted string literals: PEP 498 Formatted string literals. 
* PEP 526; Syntax for variable annotations: PEP 526 Syntax for variable annotations. 
* PEP 515; Underscores in Numeric Literals: PEP 515 Underscores in Numeric Literals. 
* PEP 525; Asynchronous Generators: PEP 525 Asynchronous Generators. 
* PEP 530; Asynchronous Comprehensions: PEP 530 Asynchronous Comprehensions. 
* PEP 487; Simpler customization of class creation: PEP 487 Simpler customization of class creation. 
* PEP 487; Descriptor Protocol Enhancements: PEP 487 Descriptor Protocol Enhancements. 
* PEP 519; Adding a file system path protocol: PEP 519 Adding a file system path protocol. 
* PEP 495; Local Time Disambiguation: PEP 495 Local Time Disambiguation. 
* PEP 529; Change Windows filesystem encoding to UTF-8: PEP 529 Change Windows filesystem encoding to UTF-8. 
* PEP 528; Change Windows console encoding to UTF-8: PEP 528 Change Windows console encoding to UTF-8. 
* PEP 520; Preserving Class Attribute Definition Order: PEP 520 Preserving Class Attribute Definition Order. 
* PEP 468; Preserving Keyword Argument Order: PEP 468 Preserving Keyword Argument Order. 
* New dict implementation:: 
* PEP 523; Adding a frame evaluation API to CPython: PEP 523 Adding a frame evaluation API to CPython. 
* PYTHONMALLOC environment variable:: 
* DTrace and SystemTap probing support:: 

@end menu

@node PEP 498 Formatted string literals,PEP 526 Syntax for variable annotations,,New Features<13>
@anchor{whatsnew/3 6 pep-498-formatted-string-literals}@anchor{e44}@anchor{whatsnew/3 6 whatsnew36-pep498}@anchor{e2f}
@subsubsection PEP 498: Formatted string literals


@geindex Python Enhancement Proposals; PEP 498
PEP 498@footnote{https://peps.python.org/pep-0498/} introduces a new kind of string literals: `f-strings', or
@ref{19b,,formatted string literals}.

Formatted string literals are prefixed with @code{'f'} and are similar to
the format strings accepted by @ref{834,,str.format()}.  They contain replacement
fields surrounded by curly braces.  The replacement fields are expressions,
which are evaluated at run time, and then formatted using the
@ref{19a,,format()} protocol:

@example
>>> name = "Fred"
>>> f"He said his name is @{name@}."
'He said his name is Fred.'
>>> width = 10
>>> precision = 4
>>> value = decimal.Decimal("12.34567")
>>> f"result: @{value:@{width@}.@{precision@}@}"  # nested fields
'result:      12.35'
@end example


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 498

@item PEP 498@footnote{https://peps.python.org/pep-0498/} – Literal String Interpolation.

PEP written and implemented by Eric V. Smith.
@end table

@ref{19b,,Feature documentation}.


@node PEP 526 Syntax for variable annotations,PEP 515 Underscores in Numeric Literals,PEP 498 Formatted string literals,New Features<13>
@anchor{whatsnew/3 6 pep-526-syntax-for-variable-annotations}@anchor{e45}@anchor{whatsnew/3 6 whatsnew36-pep526}@anchor{e31}
@subsubsection PEP 526: Syntax for variable annotations


@geindex Python Enhancement Proposals; PEP 484
PEP 484@footnote{https://peps.python.org/pep-0484/} introduced the standard for type annotations of function
parameters, a.k.a. type hints. This PEP adds syntax to Python for annotating
the types of variables including class variables and instance variables:

@example
primes: List[int] = []

captain: str  # Note: no initial value!

class Starship:
    stats: Dict[str, int] = @{@}
@end example

Just as for function annotations, the Python interpreter does not attach any
particular meaning to variable annotations and only stores them in the
@code{__annotations__} attribute of a class or module.

In contrast to variable declarations in statically typed languages,
the goal of annotation syntax is to provide an easy way to specify structured
type metadata for third party tools and libraries via the abstract syntax tree
and the @code{__annotations__} attribute.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 526

@item PEP 526@footnote{https://peps.python.org/pep-0526/} – Syntax for variable annotations.

PEP written by Ryan Gonzalez, Philip House, Ivan Levkivskyi, Lisa Roach,
and Guido van Rossum. Implemented by Ivan Levkivskyi.
@end table

Tools that use or will use the new syntax:
mypy@footnote{https://www.mypy-lang.org/},
pytype@footnote{https://github.com/google/pytype}, PyCharm, etc.


@node PEP 515 Underscores in Numeric Literals,PEP 525 Asynchronous Generators,PEP 526 Syntax for variable annotations,New Features<13>
@anchor{whatsnew/3 6 pep-515-underscores-in-numeric-literals}@anchor{e46}@anchor{whatsnew/3 6 whatsnew36-pep515}@anchor{e30}
@subsubsection PEP 515: Underscores in Numeric Literals


@geindex Python Enhancement Proposals; PEP 515
PEP 515@footnote{https://peps.python.org/pep-0515/} adds the ability to use underscores in numeric literals for
improved readability.  For example:

@example
>>> 1_000_000_000_000_000
1000000000000000
>>> 0x_FF_FF_FF_FF
4294967295
@end example

Single underscores are allowed between digits and after any base
specifier.  Leading, trailing, or multiple underscores in a row are not
allowed.

The @ref{4fa,,string formatting} language also now has support
for the @code{'_'} option to signal the use of an underscore for a thousands
separator for floating-point presentation types and for integer
presentation type @code{'d'}.  For integer presentation types @code{'b'},
@code{'o'}, @code{'x'}, and @code{'X'}, underscores will be inserted every 4
digits:

@example
>>> '@{:_@}'.format(1000000)
'1_000_000'
>>> '@{:_x@}'.format(0xFFFFFFFF)
'ffff_ffff'
@end example


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 515

@item PEP 515@footnote{https://peps.python.org/pep-0515/} – Underscores in Numeric Literals

PEP written by Georg Brandl and Serhiy Storchaka.
@end table


@node PEP 525 Asynchronous Generators,PEP 530 Asynchronous Comprehensions,PEP 515 Underscores in Numeric Literals,New Features<13>
@anchor{whatsnew/3 6 pep-525-asynchronous-generators}@anchor{e47}@anchor{whatsnew/3 6 whatsnew36-pep525}@anchor{e32}
@subsubsection PEP 525: Asynchronous Generators


@geindex Python Enhancement Proposals; PEP 492
PEP 492@footnote{https://peps.python.org/pep-0492/} introduced support for native coroutines and @code{async} / @code{await}
syntax to Python 3.5.  A notable limitation of the Python 3.5 implementation
is that it was not possible to use @code{await} and @code{yield} in the same
function body.  In Python 3.6 this restriction has been lifted, making it
possible to define `asynchronous generators':

@example
async def ticker(delay, to):
    """Yield numbers from 0 to *to* every *delay* seconds."""
    for i in range(to):
        yield i
        await asyncio.sleep(delay)
@end example

The new syntax allows for faster and more concise code.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 525

@item PEP 525@footnote{https://peps.python.org/pep-0525/} – Asynchronous Generators

PEP written and implemented by Yury Selivanov.
@end table


@node PEP 530 Asynchronous Comprehensions,PEP 487 Simpler customization of class creation,PEP 525 Asynchronous Generators,New Features<13>
@anchor{whatsnew/3 6 pep-530-asynchronous-comprehensions}@anchor{e48}@anchor{whatsnew/3 6 whatsnew36-pep530}@anchor{e33}
@subsubsection PEP 530: Asynchronous Comprehensions


@geindex Python Enhancement Proposals; PEP 530
PEP 530@footnote{https://peps.python.org/pep-0530/} adds support for using @code{async for} in list, set, dict
comprehensions and generator expressions:

@example
result = [i async for i in aiter() if i % 2]
@end example

Additionally, @code{await} expressions are supported in all kinds
of comprehensions:

@example
result = [await fun() for fun in funcs if await condition()]
@end example


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 530

@item PEP 530@footnote{https://peps.python.org/pep-0530/} – Asynchronous Comprehensions

PEP written and implemented by Yury Selivanov.
@end table


@node PEP 487 Simpler customization of class creation,PEP 487 Descriptor Protocol Enhancements,PEP 530 Asynchronous Comprehensions,New Features<13>
@anchor{whatsnew/3 6 pep-487-simpler-customization-of-class-creation}@anchor{e49}@anchor{whatsnew/3 6 whatsnew36-pep487}@anchor{e36}
@subsubsection PEP 487: Simpler customization of class creation


It is now possible to customize subclass creation without using a metaclass.
The new @code{__init_subclass__} classmethod will be called on the base class
whenever a new subclass is created:

@example
class PluginBase:
    subclasses = []

    def __init_subclass__(cls, **kwargs):
        super().__init_subclass__(**kwargs)
        cls.subclasses.append(cls)

class Plugin1(PluginBase):
    pass

class Plugin2(PluginBase):
    pass
@end example

In order to allow zero-argument @ref{1a7,,super()} calls to work correctly from
@ref{844,,__init_subclass__()} implementations, custom metaclasses must
ensure that the new @code{__classcell__} namespace entry is propagated to
@code{type.__new__} (as described in @ref{e4a,,Creating the class object}).


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 487

@item PEP 487@footnote{https://peps.python.org/pep-0487/} – Simpler customization of class creation

PEP written and implemented by Martin Teichmann.
@end table

@ref{e4b,,Feature documentation}


@node PEP 487 Descriptor Protocol Enhancements,PEP 519 Adding a file system path protocol,PEP 487 Simpler customization of class creation,New Features<13>
@anchor{whatsnew/3 6 pep-487-descriptor-protocol-enhancements}@anchor{e4c}@anchor{whatsnew/3 6 whatsnew36-pep487-descriptors}@anchor{e4d}
@subsubsection PEP 487: Descriptor Protocol Enhancements


@geindex Python Enhancement Proposals; PEP 487
PEP 487@footnote{https://peps.python.org/pep-0487/} extends the descriptor protocol to include the new optional
@ref{e4e,,__set_name__()} method.  Whenever a new class is defined, the new
method will be called on all descriptors included in the definition, providing
them with a reference to the class being defined and the name given to the
descriptor within the class namespace.  In other words, instances of
descriptors can now know the attribute name of the descriptor in the
owner class:

@example
class IntField:
    def __get__(self, instance, owner):
        return instance.__dict__[self.name]

    def __set__(self, instance, value):
        if not isinstance(value, int):
            raise ValueError(f'expecting integer in @{self.name@}')
        instance.__dict__[self.name] = value

    # this is the new initializer:
    def __set_name__(self, owner, name):
        self.name = name

class Model:
    int_field = IntField()
@end example


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 487

@item PEP 487@footnote{https://peps.python.org/pep-0487/} – Simpler customization of class creation

PEP written and implemented by Martin Teichmann.
@end table

@ref{e4f,,Feature documentation}


@node PEP 519 Adding a file system path protocol,PEP 495 Local Time Disambiguation,PEP 487 Descriptor Protocol Enhancements,New Features<13>
@anchor{whatsnew/3 6 pep-519-adding-a-file-system-path-protocol}@anchor{e50}@anchor{whatsnew/3 6 whatsnew36-pep519}@anchor{e3b}
@subsubsection PEP 519: Adding a file system path protocol


File system paths have historically been represented as @ref{16a,,str}
or @ref{193,,bytes} objects. This has led to people who write code which
operate on file system paths to assume that such objects are only one
of those two types (an @ref{19c,,int} representing a file descriptor
does not count as that is not a file path). Unfortunately that
assumption prevents alternative object representations of file system
paths like @ref{a8,,pathlib} from working with pre-existing code,
including Python’s standard library.

To fix this situation, a new interface represented by
@ref{e51,,os.PathLike} has been defined. By implementing the
@ref{e52,,__fspath__()} method, an object signals that it
represents a path. An object can then provide a low-level
representation of a file system path as a @ref{16a,,str} or
@ref{193,,bytes} object. This means an object is considered
@ref{5a1,,path-like} if it implements
@code{os.PathLike} or is a @code{str} or @code{bytes} object
which represents a file system path. Code can use @ref{e53,,os.fspath()},
@ref{e54,,os.fsdecode()}, or @ref{e55,,os.fsencode()} to explicitly get a
@code{str} and/or @code{bytes} representation of a path-like
object.

The built-in @ref{318,,open()} function has been updated to accept
@ref{e51,,os.PathLike} objects, as have all relevant functions in the
@ref{a5,,os} and @ref{a6,,os.path} modules, and most other functions and
classes in the standard library.  The @ref{6c4,,os.DirEntry} class
and relevant classes in @ref{a8,,pathlib} have also been updated to
implement @code{os.PathLike}.

The hope is that updating the fundamental functions for operating
on file system paths will lead to third-party code to implicitly
support all @ref{5a1,,path-like objects} without any
code changes, or at least very minimal ones (e.g. calling
@ref{e53,,os.fspath()} at the beginning of code before operating on a
path-like object).

Here are some examples of how the new interface allows for
@ref{268,,pathlib.Path} to be used more easily and transparently with
pre-existing code:

@example
>>> import pathlib
>>> with open(pathlib.Path("README")) as f:
...     contents = f.read()
...
>>> import os.path
>>> os.path.splitext(pathlib.Path("some_file.txt"))
('some_file', '.txt')
>>> os.path.join("/a/b", pathlib.Path("c"))
'/a/b/c'
>>> import os
>>> os.fspath(pathlib.Path("some_file.txt"))
'some_file.txt'
@end example

(Implemented by Brett Cannon, Ethan Furman, Dusty Phillips, and Jelle Zijlstra.)


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 519

@item PEP 519@footnote{https://peps.python.org/pep-0519/} – Adding a file system path protocol

PEP written by Brett Cannon and Koos Zevenhoven.
@end table


@node PEP 495 Local Time Disambiguation,PEP 529 Change Windows filesystem encoding to UTF-8,PEP 519 Adding a file system path protocol,New Features<13>
@anchor{whatsnew/3 6 pep-495-local-time-disambiguation}@anchor{e56}@anchor{whatsnew/3 6 whatsnew36-pep495}@anchor{e3c}
@subsubsection PEP 495: Local Time Disambiguation


In most world locations, there have been and will be times when local clocks
are moved back.  In those times, intervals are introduced in which local
clocks show the same time twice in the same day. In these situations, the
information displayed on a local clock (or stored in a Python datetime
instance) is insufficient to identify a particular moment in time.

@geindex Python Enhancement Proposals; PEP 495
PEP 495@footnote{https://peps.python.org/pep-0495/} adds the new `fold' attribute to instances of
@ref{4e3,,datetime.datetime} and @ref{1fd,,datetime.time} classes to differentiate
between two moments in time for which local times are the same:

@example
>>> u0 = datetime(2016, 11, 6, 4, tzinfo=timezone.utc)
>>> for i in range(4):
...     u = u0 + i*HOUR
...     t = u.astimezone(Eastern)
...     print(u.time(), 'UTC =', t.time(), t.tzname(), t.fold)
...
04:00:00 UTC = 00:00:00 EDT 0
05:00:00 UTC = 01:00:00 EDT 0
06:00:00 UTC = 01:00:00 EST 1
07:00:00 UTC = 02:00:00 EST 0
@end example

The values of the @ref{e57,,fold} attribute have the
value @code{0} for all instances except those that represent the second
(chronologically) moment in time in an ambiguous case.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 495

@item PEP 495@footnote{https://peps.python.org/pep-0495/} – Local Time Disambiguation

PEP written by Alexander Belopolsky and Tim Peters, implementation
by Alexander Belopolsky.
@end table


@node PEP 529 Change Windows filesystem encoding to UTF-8,PEP 528 Change Windows console encoding to UTF-8,PEP 495 Local Time Disambiguation,New Features<13>
@anchor{whatsnew/3 6 pep-529-change-windows-filesystem-encoding-to-utf-8}@anchor{e58}@anchor{whatsnew/3 6 whatsnew36-pep529}@anchor{e40}
@subsubsection PEP 529: Change Windows filesystem encoding to UTF-8


Representing filesystem paths is best performed with str (Unicode) rather than
bytes. However, there are some situations where using bytes is sufficient and
correct.

Prior to Python 3.6, data loss could result when using bytes paths on Windows.
With this change, using bytes to represent paths is now supported on Windows,
provided those bytes are encoded with the encoding returned by
@ref{e59,,sys.getfilesystemencoding()}, which now defaults to @code{'utf-8'}.

Applications that do not use str to represent paths should use
@ref{e55,,os.fsencode()} and @ref{e54,,os.fsdecode()} to ensure their bytes are
correctly encoded. To revert to the previous behaviour, set
@geindex PYTHONLEGACYWINDOWSFSENCODING
@geindex environment variable; PYTHONLEGACYWINDOWSFSENCODING
@ref{33d,,PYTHONLEGACYWINDOWSFSENCODING} or call
@ref{33c,,sys._enablelegacywindowsfsencoding()}.

See 
@geindex Python Enhancement Proposals; PEP 529
PEP 529@footnote{https://peps.python.org/pep-0529/} for more information and discussion of code modifications that
may be required.

@node PEP 528 Change Windows console encoding to UTF-8,PEP 520 Preserving Class Attribute Definition Order,PEP 529 Change Windows filesystem encoding to UTF-8,New Features<13>
@anchor{whatsnew/3 6 pep-528-change-windows-console-encoding-to-utf-8}@anchor{e5a}@anchor{whatsnew/3 6 whatsnew36-pep528}@anchor{e3f}
@subsubsection PEP 528: Change Windows console encoding to UTF-8


The default console on Windows will now accept all Unicode characters and
provide correctly read str objects to Python code. @code{sys.stdin},
@code{sys.stdout} and @code{sys.stderr} now default to utf-8 encoding.

This change only applies when using an interactive console, and not when
redirecting files or pipes. To revert to the previous behaviour for interactive
console use, set 
@geindex PYTHONLEGACYWINDOWSSTDIO
@geindex environment variable; PYTHONLEGACYWINDOWSSTDIO
@ref{e5b,,PYTHONLEGACYWINDOWSSTDIO}.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 528

@item PEP 528@footnote{https://peps.python.org/pep-0528/} – Change Windows console encoding to UTF-8

PEP written and implemented by Steve Dower.
@end table


@node PEP 520 Preserving Class Attribute Definition Order,PEP 468 Preserving Keyword Argument Order,PEP 528 Change Windows console encoding to UTF-8,New Features<13>
@anchor{whatsnew/3 6 pep-520-preserving-class-attribute-definition-order}@anchor{e5c}@anchor{whatsnew/3 6 whatsnew36-pep520}@anchor{e37}
@subsubsection PEP 520: Preserving Class Attribute Definition Order


Attributes in a class definition body have a natural ordering: the same
order in which the names appear in the source.  This order is now
preserved in the new class’s @ref{e5d,,__dict__} attribute.

Also, the effective default class `execution' namespace (returned from
@ref{e5e,,type.__prepare__()}) is now an insertion-order-preserving
mapping.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 520

@item PEP 520@footnote{https://peps.python.org/pep-0520/} – Preserving Class Attribute Definition Order

PEP written and implemented by Eric Snow.
@end table


@node PEP 468 Preserving Keyword Argument Order,New dict implementation,PEP 520 Preserving Class Attribute Definition Order,New Features<13>
@anchor{whatsnew/3 6 pep-468-preserving-keyword-argument-order}@anchor{e5f}@anchor{whatsnew/3 6 whatsnew36-pep468}@anchor{e38}
@subsubsection PEP 468: Preserving Keyword Argument Order


@code{**kwargs} in a function signature is now guaranteed to be an
insertion-order-preserving mapping.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 468

@item PEP 468@footnote{https://peps.python.org/pep-0468/} – Preserving Keyword Argument Order

PEP written and implemented by Eric Snow.
@end table


@node New dict implementation,PEP 523 Adding a frame evaluation API to CPython,PEP 468 Preserving Keyword Argument Order,New Features<13>
@anchor{whatsnew/3 6 new-dict-implementation}@anchor{e60}@anchor{whatsnew/3 6 whatsnew36-compactdict}@anchor{e35}
@subsubsection New dict implementation


The @ref{cc3,,dict} type now uses a “compact” representation
based on a proposal by Raymond Hettinger@footnote{https://mail.python.org/pipermail/python-dev/2012-December/123028.html}
which was first implemented by PyPy@footnote{https://morepypy.blogspot.com/2015/01/faster-more-memory-efficient-and-more.html}.
The memory usage of the new @ref{184,,dict()} is between 20% and 25% smaller
compared to Python 3.5.

The order-preserving aspect of this new implementation is considered an
implementation detail and should not be relied upon (this may change in
the future, but it is desired to have this new dict implementation in
the language for a few releases before changing the language spec to mandate
order-preserving semantics for all current and future Python
implementations; this also helps preserve backwards-compatibility
with older versions of the language where random iteration order is
still in effect, e.g. Python 3.5).

(Contributed by INADA Naoki in bpo-27350@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27350}. Idea
originally suggested by Raymond Hettinger@footnote{https://mail.python.org/pipermail/python-dev/2012-December/123028.html}.)

@node PEP 523 Adding a frame evaluation API to CPython,PYTHONMALLOC environment variable,New dict implementation,New Features<13>
@anchor{whatsnew/3 6 pep-523-adding-a-frame-evaluation-api-to-cpython}@anchor{e61}@anchor{whatsnew/3 6 whatsnew36-pep523}@anchor{e62}
@subsubsection PEP 523: Adding a frame evaluation API to CPython


While Python provides extensive support to customize how code
executes, one place it has not done so is in the evaluation of frame
objects.  If you wanted some way to intercept frame evaluation in
Python there really wasn’t any way without directly manipulating
function pointers for defined functions.

@geindex Python Enhancement Proposals; PEP 523
PEP 523@footnote{https://peps.python.org/pep-0523/} changes this by providing an API to make frame
evaluation pluggable at the C level. This will allow for tools such
as debuggers and JITs to intercept frame evaluation before the
execution of Python code begins. This enables the use of alternative
evaluation implementations for Python code, tracking frame
evaluation, etc.

This API is not part of the limited C API and is marked as private to
signal that usage of this API is expected to be limited and only
applicable to very select, low-level use-cases. Semantics of the
API will change with Python as necessary.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 523

@item PEP 523@footnote{https://peps.python.org/pep-0523/} – Adding a frame evaluation API to CPython

PEP written by Brett Cannon and Dino Viehland.
@end table


@node PYTHONMALLOC environment variable,DTrace and SystemTap probing support,PEP 523 Adding a frame evaluation API to CPython,New Features<13>
@anchor{whatsnew/3 6 pythonmalloc-environment-variable}@anchor{e63}@anchor{whatsnew/3 6 whatsnew36-pythonmalloc}@anchor{e3a}
@subsubsection PYTHONMALLOC environment variable


The new 
@geindex PYTHONMALLOC
@geindex environment variable; PYTHONMALLOC
@ref{e64,,PYTHONMALLOC} environment variable allows setting the Python
memory allocators and installing debug hooks.

It is now possible to install debug hooks on Python memory allocators on Python
compiled in release mode using @code{PYTHONMALLOC=debug}. Effects of debug hooks:


@itemize *

@item 
Newly allocated memory is filled with the byte @code{0xCB}

@item 
Freed memory is filled with the byte @code{0xDB}

@item 
Detect violations of the Python memory allocator API. For example,
@ref{e65,,PyObject_Free()} called on a memory block allocated by
@ref{e66,,PyMem_Malloc()}.

@item 
Detect writes before the start of a buffer (buffer underflows)

@item 
Detect writes after the end of a buffer (buffer overflows)

@item 
Check that the @ref{474,,GIL} is held when allocator
functions of @ref{e67,,PYMEM_DOMAIN_OBJ} (ex: @ref{e68,,PyObject_Malloc()}) and
@ref{e69,,PYMEM_DOMAIN_MEM} (ex: @ref{e66,,PyMem_Malloc()}) domains are called.
@end itemize

Checking if the GIL is held is also a new feature of Python 3.6.

See the @ref{e6a,,PyMem_SetupDebugHooks()} function for debug hooks on Python
memory allocators.

It is now also possible to force the usage of the @code{malloc()} allocator of
the C library for all Python memory allocations using @code{PYTHONMALLOC=malloc}.
This is helpful when using external memory debuggers like Valgrind on
a Python compiled in release mode.

On error, the debug hooks on Python memory allocators now use the
@ref{106,,tracemalloc} module to get the traceback where a memory block was
allocated.

Example of fatal error on buffer overflow using
@code{python3.6 -X tracemalloc=5} (store 5 frames in traces):

@example
Debug memory block at address p=0x7fbcd41666f8: API 'o'
    4 bytes originally requested
    The 7 pad bytes at p-7 are FORBIDDENBYTE, as expected.
    The 8 pad bytes at tail=0x7fbcd41666fc are not all FORBIDDENBYTE (0xfb):
        at tail+0: 0x02 *** OUCH
        at tail+1: 0xfb
        at tail+2: 0xfb
        at tail+3: 0xfb
        at tail+4: 0xfb
        at tail+5: 0xfb
        at tail+6: 0xfb
        at tail+7: 0xfb
    The block was made by call #1233329 to debug malloc/realloc.
    Data at p: 1a 2b 30 00

Memory block allocated at (most recent call first):
  File "test/test_bytes.py", line 323
  File "unittest/case.py", line 600
  File "unittest/case.py", line 648
  File "unittest/suite.py", line 122
  File "unittest/suite.py", line 84

Fatal Python error: bad trailing pad byte

Current thread 0x00007fbcdbd32700 (most recent call first):
  File "test/test_bytes.py", line 323 in test_hex
  File "unittest/case.py", line 600 in run
  File "unittest/case.py", line 648 in __call__
  File "unittest/suite.py", line 122 in run
  File "unittest/suite.py", line 84 in __call__
  File "unittest/suite.py", line 122 in run
  File "unittest/suite.py", line 84 in __call__
  ...
@end example

(Contributed by Victor Stinner in bpo-26516@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26516} and bpo-26564@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26564}.)

@node DTrace and SystemTap probing support,,PYTHONMALLOC environment variable,New Features<13>
@anchor{whatsnew/3 6 dtrace-and-systemtap-probing-support}@anchor{e6b}@anchor{whatsnew/3 6 whatsnew36-tracing}@anchor{e39}
@subsubsection DTrace and SystemTap probing support


Python can now be built @code{--with-dtrace} which enables static markers
for the following events in the interpreter:


@itemize *

@item 
function call/return

@item 
garbage collection started/finished

@item 
line of code executed.
@end itemize

This can be used to instrument running interpreters in production,
without the need to recompile specific @ref{50a,,debug builds} or
providing application-specific profiling/debugging code.

More details in @ref{e6c,,Instrumenting CPython with DTrace and SystemTap}.

The current implementation is tested on Linux and macOS.  Additional
markers may be added in the future.

(Contributed by Łukasz Langa in bpo-21590@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21590}, based on patches by
Jesús Cea Avión, David Malcolm, and Nikhil Benesch.)

@node Other Language Changes<8>,New Modules<8>,New Features<13>,What’s New In Python 3 6
@anchor{whatsnew/3 6 other-language-changes}@anchor{e6d}
@subsection Other Language Changes


Some smaller changes made to the core Python language are:


@itemize *

@item 
A @code{global} or @code{nonlocal} statement must now textually appear
before the first use of the affected name in the same scope.
Previously this was a @ref{1af,,SyntaxWarning}.

@item 
It is now possible to set a @ref{e6e,,special method} to
@code{None} to indicate that the corresponding operation is not available.
For example, if a class sets @ref{e6f,,__iter__()} to @code{None}, the class
is not iterable.
(Contributed by Andrew Barnert and Ivan Levkivskyi in bpo-25958@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25958}.)

@item 
Long sequences of repeated traceback lines are now abbreviated as
@code{"[Previous line repeated @{count@} more times]"} (see
@ref{e70,,traceback} for an example).
(Contributed by Emanuel Barry in bpo-26823@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26823}.)

@item 
Import now raises the new exception @ref{d43,,ModuleNotFoundError}
(subclass of @ref{65b,,ImportError}) when it cannot find a module.  Code
that currently checks for ImportError (in try-except) will still work.
(Contributed by Eric Snow in bpo-15767@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15767}.)

@item 
Class methods relying on zero-argument @code{super()} will now work correctly
when called from metaclass methods during class creation.
(Contributed by Martin Teichmann in bpo-23722@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23722}.)
@end itemize

@node New Modules<8>,Improved Modules<8>,Other Language Changes<8>,What’s New In Python 3 6
@anchor{whatsnew/3 6 new-modules}@anchor{e71}
@subsection New Modules


@menu
* secrets:: 

@end menu

@node secrets,,,New Modules<8>
@anchor{whatsnew/3 6 secrets}@anchor{e72}@anchor{whatsnew/3 6 whatsnew36-pep506}@anchor{e34}
@subsubsection secrets


The main purpose of the new @ref{c5,,secrets} module is to provide an obvious way
to reliably generate cryptographically strong pseudo-random values suitable
for managing secrets, such as account authentication, tokens, and similar.

@cartouche
@quotation Warning 
Note that the pseudo-random generators in the @ref{bd,,random} module
should `NOT' be used for security purposes.  Use @ref{c5,,secrets}
on Python 3.6+ and @ref{747,,os.urandom()} on Python 3.5 and earlier.
@end quotation
@end cartouche


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 506

@item PEP 506@footnote{https://peps.python.org/pep-0506/} – Adding A Secrets Module To The Standard Library

PEP written and implemented by Steven D’Aprano.
@end table


@node Improved Modules<8>,Optimizations<9>,New Modules<8>,What’s New In Python 3 6
@anchor{whatsnew/3 6 improved-modules}@anchor{e73}
@subsection Improved Modules


@menu
* array: array<4>. 
* ast: ast<6>. 
* asyncio: asyncio<12>. 
* binascii: binascii<2>. 
* cmath:: 
* collections: collections<4>. 
* concurrent.futures: concurrent futures<5>. 
* contextlib: contextlib<4>. 
* datetime: datetime<6>. 
* decimal: decimal<3>. 
* distutils: distutils<5>. 
* email: email<3>. 
* encodings: encodings<2>. 
* enum: enum<7>. 
* faulthandler: faulthandler<3>. 
* fileinput: fileinput<2>. 
* hashlib: hashlib<5>. 
* http.client: http client<2>. 
* idlelib and IDLE: idlelib and IDLE<2>. 
* importlib: importlib<6>. 
* inspect: inspect<7>. 
* json: json<2>. 
* logging: logging<4>. 
* math: math<8>. 
* multiprocessing: multiprocessing<6>. 
* os: os<9>. 
* pathlib: pathlib<12>. 
* pdb: pdb<7>. 
* pickle: pickle<3>. 
* pickletools:: 
* pydoc: pydoc<4>. 
* random: random<4>. 
* re: re<6>. 
* readline:: 
* rlcompleter:: 
* shlex: shlex<2>. 
* site: site<3>. 
* sqlite3: sqlite3<8>. 
* socket: socket<8>. 
* socketserver: socketserver<2>. 
* ssl: ssl<8>. 
* statistics: statistics<5>. 
* struct: struct<2>. 
* subprocess: subprocess<3>. 
* sys: sys<10>. 
* telnetlib:: 
* time: time<6>. 
* timeit:: 
* tkinter: tkinter<7>. 
* traceback: traceback<4>. 
* tracemalloc: tracemalloc<3>. 
* typing: typing<10>. 
* unicodedata: unicodedata<8>. 
* unittest.mock: unittest mock<2>. 
* urllib.request: urllib request. 
* urllib.robotparser: urllib robotparser. 
* venv: venv<5>. 
* warnings: warnings<4>. 
* winreg:: 
* winsound:: 
* xmlrpc.client: xmlrpc client. 
* zipfile: zipfile<4>. 
* zlib: zlib<2>. 

@end menu

@node array<4>,ast<6>,,Improved Modules<8>
@anchor{whatsnew/3 6 array}@anchor{e74}
@subsubsection array


Exhausted iterators of @ref{4bf,,array.array} will now stay exhausted even
if the iterated array is extended.  This is consistent with the behavior
of other mutable sequences.

Contributed by Serhiy Storchaka in bpo-26492@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26492}.

@node ast<6>,asyncio<12>,array<4>,Improved Modules<8>
@anchor{whatsnew/3 6 ast}@anchor{e75}
@subsubsection ast


The new @ref{2f1,,ast.Constant} AST node has been added.  It can be used
by external AST optimizers for the purposes of constant folding.

Contributed by Victor Stinner in bpo-26146@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26146}.

@node asyncio<12>,binascii<2>,ast<6>,Improved Modules<8>
@anchor{whatsnew/3 6 asyncio}@anchor{e76}
@subsubsection asyncio


Starting with Python 3.6 the @code{asyncio} module is no longer provisional and its
API is considered stable.

Notable changes in the @ref{b,,asyncio} module since Python 3.5.0
(all backported to 3.5.x due to the provisional status):


@itemize *

@item 
The @ref{2f4,,get_event_loop()} function has been changed to
always return the currently running loop when called from coroutines
and callbacks.
(Contributed by Yury Selivanov in bpo-28613@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28613}.)

@item 
The @ref{e77,,ensure_future()} function and all functions that
use it, such as @ref{e78,,loop.run_until_complete()},
now accept all kinds of @ref{4ca,,awaitable objects}.
(Contributed by Yury Selivanov.)

@item 
New @ref{a88,,run_coroutine_threadsafe()} function to submit
coroutines to event loops from other threads.
(Contributed by Vincent Michel.)

@item 
New @ref{e79,,Transport.is_closing()}
method to check if the transport is closing or closed.
(Contributed by Yury Selivanov.)

@item 
The @ref{d0f,,loop.create_server()}
method can now accept a list of hosts.
(Contributed by Yann Sionneau.)

@item 
New @ref{e7a,,loop.create_future()}
method to create Future objects.  This allows alternative event
loop implementations, such as
uvloop@footnote{https://github.com/MagicStack/uvloop}, to provide a faster
@ref{dcc,,asyncio.Future} implementation.
(Contributed by Yury Selivanov in bpo-27041@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27041}.)

@item 
New @ref{e7b,,loop.get_exception_handler()}
method to get the current exception handler.
(Contributed by Yury Selivanov in bpo-27040@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27040}.)

@item 
New @ref{4d1,,StreamReader.readuntil()}
method to read data from the stream until a separator bytes
sequence appears.
(Contributed by Mark Korenberg.)

@item 
The performance of @ref{e7c,,StreamReader.readexactly()}
has been improved.
(Contributed by Mark Korenberg in bpo-28370@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28370}.)

@item 
The @ref{e14,,loop.getaddrinfo()}
method is optimized to avoid calling the system @code{getaddrinfo}
function if the address is already resolved.
(Contributed by A. Jesse Jiryu Davis.)

@item 
The @ref{e7d,,loop.stop()}
method has been changed to stop the loop immediately after
the current iteration.  Any new callbacks scheduled as a result
of the last iteration will be discarded.
(Contributed by Guido van Rossum in bpo-25593@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25593}.)

@item 
@ref{e7e,,Future.set_exception}
will now raise @ref{199,,TypeError} when passed an instance of
the @ref{dfb,,StopIteration} exception.
(Contributed by Chris Angelico in bpo-26221@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26221}.)

@item 
New @ref{9e4,,loop.connect_accepted_socket()}
method to be used by servers that accept connections outside of asyncio,
but that use asyncio to handle them.
(Contributed by Jim Fulton in bpo-27392@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27392}.)

@item 
@code{TCP_NODELAY} flag is now set for all TCP transports by default.
(Contributed by Yury Selivanov in bpo-27456@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27456}.)

@item 
New @ref{e7f,,loop.shutdown_asyncgens()}
to properly close pending asynchronous generators before closing the
loop.
(Contributed by Yury Selivanov in bpo-28003@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28003}.)

@item 
@ref{dcc,,Future} and @ref{1c9,,Task}
classes now have an optimized C implementation which makes asyncio
code up to 30% faster.
(Contributed by Yury Selivanov and INADA Naoki in bpo-26081@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26081}
and bpo-28544@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28544}.)
@end itemize

@node binascii<2>,cmath,asyncio<12>,Improved Modules<8>
@anchor{whatsnew/3 6 binascii}@anchor{e80}
@subsubsection binascii


The @ref{e81,,b2a_base64()} function now accepts an optional `newline'
keyword argument to control whether the newline character is appended to the
return value.
(Contributed by Victor Stinner in bpo-25357@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25357}.)

@node cmath,collections<4>,binascii<2>,Improved Modules<8>
@anchor{whatsnew/3 6 cmath}@anchor{e82}
@subsubsection cmath


The new @ref{e83,,cmath.tau} (`τ') constant has been added.
(Contributed by Lisa Roach in bpo-12345@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12345}, see 
@geindex Python Enhancement Proposals; PEP 628
PEP 628@footnote{https://peps.python.org/pep-0628/} for details.)

New constants: @ref{e84,,cmath.inf} and @ref{e85,,cmath.nan} to
match @ref{e86,,math.inf} and @ref{875,,math.nan}, and also @ref{e87,,cmath.infj}
and @ref{e88,,cmath.nanj} to match the format used by complex repr.
(Contributed by Mark Dickinson in bpo-23229@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23229}.)

@node collections<4>,concurrent futures<5>,cmath,Improved Modules<8>
@anchor{whatsnew/3 6 collections}@anchor{e89}
@subsubsection collections


The new @ref{e8a,,Collection} abstract base class has been
added to represent sized iterable container classes.
(Contributed by Ivan Levkivskyi, docs by Neil Girdhar in bpo-27598@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27598}.)

The new @ref{e8b,,Reversible} abstract base class represents
iterable classes that also provide the @ref{e8c,,__reversed__()} method.
(Contributed by Ivan Levkivskyi in bpo-25987@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25987}.)

The new @ref{e8d,,AsyncGenerator} abstract base class represents
asynchronous generators.
(Contributed by Yury Selivanov in bpo-28720@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28720}.)

The @ref{4e1,,namedtuple()} function now accepts an optional
keyword argument `module', which, when specified, is used for
the @ref{617,,__module__} attribute of the returned named tuple class.
(Contributed by Raymond Hettinger in bpo-17941@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17941}.)

The `verbose' and `rename' arguments for
@ref{4e1,,namedtuple()} are now keyword-only.
(Contributed by Raymond Hettinger in bpo-25628@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25628}.)

Recursive @ref{7f5,,collections.deque} instances can now be pickled.
(Contributed by Serhiy Storchaka in bpo-26482@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26482}.)

@node concurrent futures<5>,contextlib<4>,collections<4>,Improved Modules<8>
@anchor{whatsnew/3 6 concurrent-futures}@anchor{e8e}
@subsubsection concurrent.futures


The @ref{94e,,ThreadPoolExecutor}
class constructor now accepts an optional `thread_name_prefix' argument
to make it possible to customize the names of the threads created by the
pool.
(Contributed by Gregory P. Smith in bpo-27664@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27664}.)

@node contextlib<4>,datetime<6>,concurrent futures<5>,Improved Modules<8>
@anchor{whatsnew/3 6 contextlib}@anchor{e8f}
@subsubsection contextlib


The @ref{e90,,contextlib.AbstractContextManager} class has been added to
provide an abstract base class for context managers.  It provides a
sensible default implementation for @code{__enter__()} which returns
@code{self} and leaves @code{__exit__()} an abstract method.  A matching
class has been added to the @ref{10b,,typing} module as
@ref{e91,,typing.ContextManager}.
(Contributed by Brett Cannon in bpo-25609@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25609}.)

@node datetime<6>,decimal<3>,contextlib<4>,Improved Modules<8>
@anchor{whatsnew/3 6 datetime}@anchor{e92}
@subsubsection datetime


The @ref{4e3,,datetime} and @ref{1fd,,time} classes have
the new @ref{e93,,fold} attribute used to disambiguate local time
when necessary.  Many functions in the @ref{34,,datetime} have been
updated to support local time disambiguation.
See @ref{e3c,,Local Time Disambiguation} section for more
information.
(Contributed by Alexander Belopolsky in bpo-24773@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24773}.)

The @ref{e94,,datetime.strftime()} and
@ref{e95,,date.strftime()} methods now support
ISO 8601 date directives @code{%G}, @code{%u} and @code{%V}.
(Contributed by Ashley Anderson in bpo-12006@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12006}.)

The @ref{d2b,,datetime.isoformat()} function
now accepts an optional `timespec' argument that specifies the number
of additional components of the time value to include.
(Contributed by Alessandro Cucci and Alexander Belopolsky in bpo-19475@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19475}.)

The @ref{e96,,datetime.combine()} now
accepts an optional `tzinfo' argument.
(Contributed by Alexander Belopolsky in bpo-27661@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27661}.)

@node decimal<3>,distutils<5>,datetime<6>,Improved Modules<8>
@anchor{whatsnew/3 6 decimal}@anchor{e97}
@subsubsection decimal


New @ref{e98,,Decimal.as_integer_ratio()}
method that returns a pair @code{(n, d)} of integers that represent the given
@ref{200,,Decimal} instance as a fraction, in lowest terms and
with a positive denominator:

@example
>>> Decimal('-3.14').as_integer_ratio()
(-157, 50)
@end example

(Contributed by Stefan Krah amd Mark Dickinson in bpo-25928@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25928}.)

@node distutils<5>,email<3>,decimal<3>,Improved Modules<8>
@anchor{whatsnew/3 6 distutils}@anchor{e99}
@subsubsection distutils


The @code{default_format} attribute has been removed from
@code{distutils.command.sdist.sdist} and the @code{formats}
attribute defaults to @code{['gztar']}. Although not anticipated,
any code relying on the presence of @code{default_format} may
need to be adapted. See bpo-27819@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27819} for more details.

@node email<3>,encodings<2>,distutils<5>,Improved Modules<8>
@anchor{whatsnew/3 6 email}@anchor{e9a}
@subsubsection email


The new email API, enabled via the `policy' keyword to various constructors, is
no longer provisional.  The @ref{3f,,email} documentation has been reorganized and
rewritten to focus on the new API, while retaining the old documentation for
the legacy API.  (Contributed by R. David Murray in bpo-24277@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24277}.)

The @ref{49,,email.mime} classes now all accept an optional `policy' keyword.
(Contributed by Berker Peksag in bpo-27331@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27331}.)

The @ref{e9b,,DecodedGenerator} now supports the `policy'
keyword.

There is a new @ref{53,,policy} attribute,
@ref{e9c,,message_factory}, that controls what class is used
by default when the parser creates new message objects.  For the
@ref{e9d,,email.policy.compat32} policy this is @ref{581,,Message},
for the new policies it is @ref{580,,EmailMessage}.
(Contributed by R. David Murray in bpo-20476@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20476}.)

@node encodings<2>,enum<7>,email<3>,Improved Modules<8>
@anchor{whatsnew/3 6 encodings}@anchor{e9e}
@subsubsection encodings


On Windows, added the @code{'oem'} encoding to use @code{CP_OEMCP}, and the @code{'ansi'}
alias for the existing @code{'mbcs'} encoding, which uses the @code{CP_ACP} code page.
(Contributed by Steve Dower in bpo-27959@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27959}.)

@node enum<7>,faulthandler<3>,encodings<2>,Improved Modules<8>
@anchor{whatsnew/3 6 enum}@anchor{e9f}
@subsubsection enum


Two new enumeration base classes have been added to the @ref{5a,,enum} module:
@ref{836,,Flag} and @ref{ea0,,IntFlag}.  Both are used to define
constants that can be combined using the bitwise operators.
(Contributed by Ethan Furman in bpo-23591@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23591}.)

Many standard library modules have been updated to use the
@ref{ea0,,IntFlag} class for their constants.

The new @ref{ea1,,enum.auto} value can be used to assign values to enum
members automatically:

@example
>>> from enum import Enum, auto
>>> class Color(Enum):
...     red = auto()
...     blue = auto()
...     green = auto()
...
>>> list(Color)
[<Color.red: 1>, <Color.blue: 2>, <Color.green: 3>]
@end example

@node faulthandler<3>,fileinput<2>,enum<7>,Improved Modules<8>
@anchor{whatsnew/3 6 faulthandler}@anchor{ea2}
@subsubsection faulthandler


On Windows, the @ref{5c,,faulthandler} module now installs a handler for Windows
exceptions: see @ref{211,,faulthandler.enable()}. (Contributed by Victor Stinner in
bpo-23848@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23848}.)

@node fileinput<2>,hashlib<5>,faulthandler<3>,Improved Modules<8>
@anchor{whatsnew/3 6 fileinput}@anchor{ea3}
@subsubsection fileinput


@ref{ea4,,hook_encoded()} now supports the `errors' argument.
(Contributed by Joseph Hackman in bpo-25788@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25788}.)

@node hashlib<5>,http client<2>,fileinput<2>,Improved Modules<8>
@anchor{whatsnew/3 6 hashlib}@anchor{ea5}
@subsubsection hashlib


@ref{6c,,hashlib} supports OpenSSL 1.1.0.  The minimum recommend version is 1.0.2.
(Contributed by Christian Heimes in bpo-26470@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26470}.)

BLAKE2 hash functions were added to the module. @ref{853,,blake2b()}
and @ref{854,,blake2s()} are always available and support the full
feature set of BLAKE2.
(Contributed by Christian Heimes in bpo-26798@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26798} based on code by
Dmitry Chestnykh and Samuel Neves. Documentation written by Dmitry Chestnykh.)

The SHA-3 hash functions @ref{ea6,,sha3_224()}, @ref{ea7,,sha3_256()},
@ref{ea8,,sha3_384()}, @ref{ea9,,sha3_512()}, and SHAKE hash functions
@ref{eaa,,shake_128()} and @ref{eab,,shake_256()} were added.
(Contributed by Christian Heimes in bpo-16113@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16113}. Keccak Code Package
by Guido Bertoni, Joan Daemen, Michaël Peeters, Gilles Van Assche, and
Ronny Van Keer.)

The password-based key derivation function @ref{e3e,,scrypt()} is now
available with OpenSSL 1.1.0 and newer.
(Contributed by Christian Heimes in bpo-27928@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27928}.)

@node http client<2>,idlelib and IDLE<2>,hashlib<5>,Improved Modules<8>
@anchor{whatsnew/3 6 http-client}@anchor{eac}
@subsubsection http.client


@ref{ead,,HTTPConnection.request()} and
@ref{eae,,endheaders()} both now support
chunked encoding request bodies.
(Contributed by Demian Brecht and Rolf Krahl in bpo-12319@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12319}.)

@node idlelib and IDLE<2>,importlib<6>,http client<2>,Improved Modules<8>
@anchor{whatsnew/3 6 idlelib-and-idle}@anchor{eaf}
@subsubsection idlelib and IDLE


The idlelib package is being modernized and refactored to make IDLE look and
work better and to make the code easier to understand, test, and improve. Part
of making IDLE look better, especially on Linux and Mac, is using ttk widgets,
mostly in the dialogs.  As a result, IDLE no longer runs with tcl/tk 8.4.  It
now requires tcl/tk 8.5 or 8.6.  We recommend running the latest release of
either.

‘Modernizing’ includes renaming and consolidation of idlelib modules. The
renaming of files with partial uppercase names is similar to the renaming of,
for instance, Tkinter and TkFont to tkinter and tkinter.font in 3.0.  As a
result, imports of idlelib files that worked in 3.5 will usually not work in
3.6.  At least a module name change will be needed (see idlelib/README.txt),
sometimes more.  (Name changes contributed by Al Swiegart and Terry Reedy in
bpo-24225@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24225}.  Most idlelib patches since have been and will be part of the
process.)

In compensation, the eventual result with be that some idlelib classes will be
easier to use, with better APIs and docstrings explaining them.  Additional
useful information will be added to idlelib when available.

New in 3.6.2:

Multiple fixes for autocompletion. (Contributed by Louie Lu in bpo-15786@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15786}.)

New in 3.6.3:

Module Browser (on the File menu, formerly called Class Browser),
now displays nested functions and classes in addition to top-level
functions and classes.
(Contributed by Guilherme Polo, Cheryl Sabella, and Terry Jan Reedy
in bpo-1612262@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1612262}.)

The IDLE features formerly implemented as extensions have been reimplemented
as normal features.  Their settings have been moved from the Extensions tab
to other dialog tabs.
(Contributed by Charles Wohlganger and Terry Jan Reedy in bpo-27099@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27099}.)

The Settings dialog (Options, Configure IDLE) has been partly rewritten
to improve both appearance and function.
(Contributed by Cheryl Sabella and Terry Jan Reedy in multiple issues.)

New in 3.6.4:

The font sample now includes a selection of non-Latin characters so that
users can better see the effect of selecting a particular font.
(Contributed by Terry Jan Reedy in bpo-13802@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13802}.)
The sample can be edited to include other characters.
(Contributed by Serhiy Storchaka in bpo-31860@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31860}.)

New in 3.6.6:

Editor code context option revised.  Box displays all context lines up to
maxlines.  Clicking on a context line jumps the editor to that line.  Context
colors for custom themes is added to Highlights tab of Settings dialog.
(Contributed by Cheryl Sabella and Terry Jan Reedy in bpo-33642@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33642},
bpo-33768@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33768}, and bpo-33679@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33679}.)

On Windows, a new API call tells Windows that tk scales for DPI. On Windows
8.1+ or 10, with DPI compatibility properties of the Python binary
unchanged, and a monitor resolution greater than 96 DPI, this should
make text and lines sharper.  It should otherwise have no effect.
(Contributed by Terry Jan Reedy in bpo-33656@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33656}.)

New in 3.6.7:

Output over N lines (50 by default) is squeezed down to a button.
N can be changed in the PyShell section of the General page of the
Settings dialog.  Fewer, but possibly extra long, lines can be squeezed by
right clicking on the output.  Squeezed output can be expanded in place
by double-clicking the button or into the clipboard or a separate window
by right-clicking the button.  (Contributed by Tal Einat in bpo-1529353@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1529353}.)

@node importlib<6>,inspect<7>,idlelib and IDLE<2>,Improved Modules<8>
@anchor{whatsnew/3 6 importlib}@anchor{eb0}
@subsubsection importlib


Import now raises the new exception @ref{d43,,ModuleNotFoundError}
(subclass of @ref{65b,,ImportError}) when it cannot find a module.  Code
that current checks for @code{ImportError} (in try-except) will still work.
(Contributed by Eric Snow in bpo-15767@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15767}.)

@ref{eb1,,importlib.util.LazyLoader} now calls
@ref{eb2,,create_module()} on the wrapped loader, removing the
restriction that @ref{eb3,,importlib.machinery.BuiltinImporter} and
@ref{eb4,,importlib.machinery.ExtensionFileLoader} couldn’t be used with
@code{importlib.util.LazyLoader}.

@ref{351,,importlib.util.cache_from_source()},
@ref{73f,,importlib.util.source_from_cache()}, and
@ref{eb5,,importlib.util.spec_from_file_location()} now accept a
@ref{5a1,,path-like object}.

@node inspect<7>,json<2>,importlib<6>,Improved Modules<8>
@anchor{whatsnew/3 6 inspect}@anchor{eb6}
@subsubsection inspect


The @ref{231,,inspect.signature()} function now reports the
implicit @code{.0} parameters generated by the compiler for comprehension and
generator expression scopes as if they were positional-only parameters called
@code{implicit0}. (Contributed by Jelle Zijlstra in bpo-19611@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19611}.)

To reduce code churn when upgrading from Python 2.7 and the legacy
@code{inspect.getargspec()} API, the previously documented deprecation of
@ref{946,,inspect.getfullargspec()} has been reversed. While this function is
convenient for single/source Python 2/3 code bases, the richer
@ref{231,,inspect.signature()} interface remains the recommended approach for new
code. (Contributed by Nick Coghlan in bpo-27172@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27172})

@node json<2>,logging<4>,inspect<7>,Improved Modules<8>
@anchor{whatsnew/3 6 json}@anchor{eb7}
@subsubsection json


@ref{eb8,,json.load()} and @ref{b54,,json.loads()} now support binary input.  Encoded
JSON should be represented using either UTF-8, UTF-16, or UTF-32.
(Contributed by Serhiy Storchaka in bpo-17909@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17909}.)

@node logging<4>,math<8>,json<2>,Improved Modules<8>
@anchor{whatsnew/3 6 logging}@anchor{eb9}
@subsubsection logging


The new @ref{eba,,WatchedFileHandler.reopenIfNeeded()}
method has been added to add the ability to check if the log file needs to
be reopened.
(Contributed by Marian Horban in bpo-24884@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24884}.)

@node math<8>,multiprocessing<6>,logging<4>,Improved Modules<8>
@anchor{whatsnew/3 6 math}@anchor{ebb}
@subsubsection math


The tau (`τ') constant has been added to the @ref{92,,math} and @ref{19,,cmath}
modules.
(Contributed by Lisa Roach in bpo-12345@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12345}, see 
@geindex Python Enhancement Proposals; PEP 628
PEP 628@footnote{https://peps.python.org/pep-0628/} for details.)

@node multiprocessing<6>,os<9>,math<8>,Improved Modules<8>
@anchor{whatsnew/3 6 multiprocessing}@anchor{ebc}
@subsubsection multiprocessing


@ref{24e,,Proxy Objects} returned by
@ref{252,,multiprocessing.Manager()} can now be nested.
(Contributed by Davin Potts in bpo-6766@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6766}.)

@node os<9>,pathlib<12>,multiprocessing<6>,Improved Modules<8>
@anchor{whatsnew/3 6 os}@anchor{ebd}
@subsubsection os


See the summary of @ref{e3b,,PEP 519} for details on how the
@ref{a5,,os} and @ref{a6,,os.path} modules now support
@ref{5a1,,path-like objects}.

@ref{c5a,,scandir()} now supports @ref{193,,bytes} paths on Windows.

A new @ref{ebe,,close()} method allows explicitly closing a
@ref{c5a,,scandir()} iterator.  The @code{scandir()} iterator now
supports the @ref{1e3,,context manager} protocol.  If a @code{scandir()}
iterator is neither exhausted nor explicitly closed a @ref{54d,,ResourceWarning}
will be emitted in its destructor.
(Contributed by Serhiy Storchaka in bpo-25994@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25994}.)

On Linux, @ref{747,,os.urandom()} now blocks until the system urandom entropy pool
is initialized to increase the security. See the 
@geindex Python Enhancement Proposals; PEP 524
PEP 524@footnote{https://peps.python.org/pep-0524/} for the rationale.

The Linux @code{getrandom()} syscall (get random bytes) is now exposed as the new
@ref{ebf,,os.getrandom()} function.
(Contributed by Victor Stinner, part of the 
@geindex Python Enhancement Proposals; PEP 524
PEP 524@footnote{https://peps.python.org/pep-0524/})

@node pathlib<12>,pdb<7>,os<9>,Improved Modules<8>
@anchor{whatsnew/3 6 pathlib}@anchor{ec0}
@subsubsection pathlib


@ref{a8,,pathlib} now supports @ref{5a1,,path-like objects}.
(Contributed by Brett Cannon in bpo-27186@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27186}.)

See the summary of @ref{e3b,,PEP 519} for details.

@node pdb<7>,pickle<3>,pathlib<12>,Improved Modules<8>
@anchor{whatsnew/3 6 pdb}@anchor{ec1}
@subsubsection pdb


The @ref{275,,Pdb} class constructor has a new optional `readrc' argument
to control whether @code{.pdbrc} files should be read.

@node pickle<3>,pickletools,pdb<7>,Improved Modules<8>
@anchor{whatsnew/3 6 pickle}@anchor{ec2}
@subsubsection pickle


Objects that need @code{__new__} called with keyword arguments can now be pickled
using @ref{27d,,pickle protocols} older than protocol version 4.
Protocol version 4 already supports this case.  (Contributed by Serhiy
Storchaka in bpo-24164@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24164}.)

@node pickletools,pydoc<4>,pickle<3>,Improved Modules<8>
@anchor{whatsnew/3 6 pickletools}@anchor{ec3}
@subsubsection pickletools


@ref{ec4,,pickletools.dis()} now outputs the implicit memo index for the
@code{MEMOIZE} opcode.
(Contributed by Serhiy Storchaka in bpo-25382@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25382}.)

@node pydoc<4>,random<4>,pickletools,Improved Modules<8>
@anchor{whatsnew/3 6 pydoc}@anchor{ec5}
@subsubsection pydoc


The @ref{ba,,pydoc} module has learned to respect the @code{MANPAGER}
environment variable.
(Contributed by Matthias Klose in bpo-8637@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8637}.)

@ref{ada,,help()} and @ref{ba,,pydoc} can now list named tuple fields in the
order they were defined rather than alphabetically.
(Contributed by Raymond Hettinger in bpo-24879@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24879}.)

@node random<4>,re<6>,pydoc<4>,Improved Modules<8>
@anchor{whatsnew/3 6 random}@anchor{ec6}
@subsubsection random


The new @ref{ec7,,choices()} function returns a list of elements of
specified size from the given population with optional weights.
(Contributed by Raymond Hettinger in bpo-18844@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18844}.)

@node re<6>,readline,random<4>,Improved Modules<8>
@anchor{whatsnew/3 6 re}@anchor{ec8}
@subsubsection re


Added support of modifier spans in regular expressions.  Examples:
@code{'(?i:p)ython'} matches @code{'python'} and @code{'Python'}, but not @code{'PYTHON'};
@code{'(?i)g(?-i:v)r'} matches @code{'GvR'} and @code{'gvr'}, but not @code{'GVR'}.
(Contributed by Serhiy Storchaka in bpo-433028@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=433028}.)

Match object groups can be accessed by @code{__getitem__}, which is
equivalent to @code{group()}.  So @code{mo['name']} is now equivalent to
@code{mo.group('name')}.  (Contributed by Eric Smith in bpo-24454@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24454}.)

@ref{ec9,,Match} objects now support
@ref{19f,,index-like objects} as group
indices.
(Contributed by Jeroen Demeyer and Xiang Zhang in bpo-27177@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27177}.)

@node readline,rlcompleter,re<6>,Improved Modules<8>
@anchor{whatsnew/3 6 readline}@anchor{eca}
@subsubsection readline


Added @ref{ecb,,set_auto_history()} to enable or disable
automatic addition of input to the history list.  (Contributed by
Tyler Crompton in bpo-26870@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26870}.)

@node rlcompleter,shlex<2>,readline,Improved Modules<8>
@anchor{whatsnew/3 6 rlcompleter}@anchor{ecc}
@subsubsection rlcompleter


Private and special attribute names now are omitted unless the prefix starts
with underscores.  A space or a colon is added after some completed keywords.
(Contributed by Serhiy Storchaka in bpo-25011@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25011} and bpo-25209@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25209}.)

@node shlex<2>,site<3>,rlcompleter,Improved Modules<8>
@anchor{whatsnew/3 6 shlex}@anchor{ecd}
@subsubsection shlex


The @ref{ece,,shlex} has much
@ref{ecf,,improved shell compatibility}
through the new `punctuation_chars' argument to control which characters
are treated as punctuation.
(Contributed by Vinay Sajip in bpo-1521950@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1521950}.)

@node site<3>,sqlite3<8>,shlex<2>,Improved Modules<8>
@anchor{whatsnew/3 6 site}@anchor{ed0}
@subsubsection site


When specifying paths to add to @ref{3e2,,sys.path} in a @code{.pth} file,
you may now specify file paths on top of directories (e.g. zip files).
(Contributed by Wolfgang Langner in bpo-26587@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26587}).

@node sqlite3<8>,socket<8>,site<3>,Improved Modules<8>
@anchor{whatsnew/3 6 sqlite3}@anchor{ed1}
@subsubsection sqlite3


@ref{ed2,,sqlite3.Cursor.lastrowid} now supports the @code{REPLACE} statement.
(Contributed by Alex LordThorsen in bpo-16864@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16864}.)

@node socket<8>,socketserver<2>,sqlite3<8>,Improved Modules<8>
@anchor{whatsnew/3 6 socket}@anchor{ed3}
@subsubsection socket


The @ref{ed4,,ioctl()} function now supports the
@ref{ed5,,SIO_LOOPBACK_FAST_PATH} control code.
(Contributed by Daniel Stokes in bpo-26536@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26536}.)

The @ref{ed6,,getsockopt()} constants @code{SO_DOMAIN},
@code{SO_PROTOCOL}, @code{SO_PEERSEC}, and @code{SO_PASSSEC} are now supported.
(Contributed by Christian Heimes in bpo-26907@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26907}.)

The @ref{ed7,,setsockopt()} now supports the
@code{setsockopt(level, optname, None, optlen: int)} form.
(Contributed by Christian Heimes in bpo-27744@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27744}.)

The socket module now supports the address family
@ref{ed8,,AF_ALG} to interface with Linux Kernel crypto API. @code{ALG_*},
@code{SOL_ALG} and @ref{ed9,,sendmsg_afalg()} were added.
(Contributed by Christian Heimes in bpo-27744@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27744} with support from
Victor Stinner.)

New Linux constants @code{TCP_USER_TIMEOUT} and @code{TCP_CONGESTION} were added.
(Contributed by Omar Sandoval, bpo-26273@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26273}).

@node socketserver<2>,ssl<8>,socket<8>,Improved Modules<8>
@anchor{whatsnew/3 6 socketserver}@anchor{eda}
@subsubsection socketserver


Servers based on the @ref{d2,,socketserver} module, including those
defined in @ref{76,,http.server}, @ref{136,,xmlrpc.server} and
@ref{122,,wsgiref.simple_server}, now support the @ref{1e3,,context manager}
protocol.
(Contributed by Aviv Palivoda in bpo-26404@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26404}.)

The @ref{edb,,wfile} attribute of
@ref{edc,,StreamRequestHandler} classes now implements
the @ref{8a5,,io.BufferedIOBase} writable interface.  In particular,
calling @ref{edd,,write()} is now guaranteed to send the
data in full.  (Contributed by Martin Panter in bpo-26721@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26721}.)

@node ssl<8>,statistics<5>,socketserver<2>,Improved Modules<8>
@anchor{whatsnew/3 6 ssl}@anchor{ede}
@subsubsection ssl


@ref{d5,,ssl} supports OpenSSL 1.1.0.  The minimum recommend version is 1.0.2.
(Contributed by Christian Heimes in bpo-26470@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26470}.)

3DES has been removed from the default cipher suites and ChaCha20 Poly1305
cipher suites have been added.
(Contributed by Christian Heimes in bpo-27850@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27850} and bpo-27766@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27766}.)

@ref{355,,SSLContext} has better default configuration for options
and ciphers.
(Contributed by Christian Heimes in bpo-28043@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28043}.)

SSL session can be copied from one client-side connection to another
with the new @ref{edf,,SSLSession} class.  TLS session resumption can
speed up the initial handshake, reduce latency and improve performance
(Contributed by Christian Heimes in bpo-19500@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19500} based on a draft by
Alex Warhawk.)

The new @ref{ee0,,get_ciphers()} method can be used to
get a list of enabled ciphers in order of cipher priority.

All constants and flags have been converted to @ref{ee1,,IntEnum} and
@ref{ea0,,IntFlag}.
(Contributed by Christian Heimes in bpo-28025@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28025}.)

Server and client-side specific TLS protocols for @ref{355,,SSLContext}
were added.
(Contributed by Christian Heimes in bpo-28085@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28085}.)

Added @ref{c2c,,ssl.SSLContext.post_handshake_auth} to enable and
@ref{c2d,,ssl.SSLSocket.verify_client_post_handshake()} to initiate TLS 1.3
post-handshake authentication.
(Contributed by Christian Heimes in gh-78851@footnote{https://github.com/python/cpython/issues/78851}.)

@node statistics<5>,struct<2>,ssl<8>,Improved Modules<8>
@anchor{whatsnew/3 6 statistics}@anchor{ee2}
@subsubsection statistics


A new @ref{ee3,,harmonic_mean()} function has been added.
(Contributed by Steven D’Aprano in bpo-27181@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27181}.)

@node struct<2>,subprocess<3>,statistics<5>,Improved Modules<8>
@anchor{whatsnew/3 6 struct}@anchor{ee4}
@subsubsection struct


@ref{db,,struct} now supports IEEE 754 half-precision floats via the @code{'e'}
format specifier.
(Contributed by Eli Stevens, Mark Dickinson in bpo-11734@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11734}.)

@node subprocess<3>,sys<10>,struct<2>,Improved Modules<8>
@anchor{whatsnew/3 6 subprocess}@anchor{ee5}
@subsubsection subprocess


@ref{4b8,,subprocess.Popen} destructor now emits a @ref{54d,,ResourceWarning} warning
if the child process is still running. Use the context manager protocol (@code{with
proc: ...}) or explicitly call the @ref{ee6,,wait()} method to
read the exit status of the child process. (Contributed by Victor Stinner in
bpo-26741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26741}.)

The @ref{4b8,,subprocess.Popen} constructor and all functions that pass arguments
through to it now accept `encoding' and `errors' arguments. Specifying either
of these will enable text mode for the `stdin', `stdout' and `stderr' streams.
(Contributed by Steve Dower in bpo-6135@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6135}.)

@node sys<10>,telnetlib,subprocess<3>,Improved Modules<8>
@anchor{whatsnew/3 6 sys}@anchor{ee7}
@subsubsection sys


The new @ref{ee8,,getfilesystemencodeerrors()} function returns the name of
the error mode used to convert between Unicode filenames and bytes filenames.
(Contributed by Steve Dower in bpo-27781@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27781}.)

On Windows the return value of the @ref{ee9,,getwindowsversion()} function
now includes the `platform_version' field which contains the accurate major
version, minor version and build number of the current operating system,
rather than the version that is being emulated for the process
(Contributed by Steve Dower in bpo-27932@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27932}.)

@node telnetlib,time<6>,sys<10>,Improved Modules<8>
@anchor{whatsnew/3 6 telnetlib}@anchor{eea}
@subsubsection telnetlib


@code{telnetlib.Telnet} is now a context manager (contributed by
Stéphane Wirtel in bpo-25485@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25485}).

@node time<6>,timeit,telnetlib,Improved Modules<8>
@anchor{whatsnew/3 6 time}@anchor{eeb}
@subsubsection time


The @ref{eec,,struct_time} attributes @code{tm_gmtoff} and
@code{tm_zone} are now available on all platforms.

@node timeit,tkinter<7>,time<6>,Improved Modules<8>
@anchor{whatsnew/3 6 timeit}@anchor{eed}
@subsubsection timeit


The new @ref{eee,,Timer.autorange()} convenience
method has been added to call @ref{eef,,Timer.timeit()}
repeatedly so that the total run time is greater or equal to 200 milliseconds.
(Contributed by Steven D’Aprano in bpo-6422@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6422}.)

@ref{f5,,timeit} now warns when there is substantial (4x) variance
between best and worst times.
(Contributed by Serhiy Storchaka in bpo-23552@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23552}.)

@node tkinter<7>,traceback<4>,timeit,Improved Modules<8>
@anchor{whatsnew/3 6 tkinter}@anchor{ef0}
@subsubsection tkinter


Added methods @code{Variable.trace_add()},
@code{Variable.trace_remove()} and @code{trace_info()}
in the @code{tkinter.Variable} class.  They replace old methods
@code{trace_variable()}, @code{trace()},
@code{trace_vdelete()} and
@code{trace_vinfo()} that use obsolete Tcl commands and might
not work in future versions of Tcl.
(Contributed by Serhiy Storchaka in bpo-22115@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22115}).

@node traceback<4>,tracemalloc<3>,tkinter<7>,Improved Modules<8>
@anchor{whatsnew/3 6 traceback}@anchor{ef1}@anchor{whatsnew/3 6 whatsnew36-traceback}@anchor{e70}
@subsubsection traceback


Both the traceback module and the interpreter’s builtin exception display now
abbreviate long sequences of repeated lines in tracebacks as shown in the
following example:

@example
>>> def f(): f()
...
>>> f()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in f
  File "<stdin>", line 1, in f
  File "<stdin>", line 1, in f
  [Previous line repeated 995 more times]
RecursionError: maximum recursion depth exceeded
@end example

(Contributed by Emanuel Barry in bpo-26823@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26823}.)

@node tracemalloc<3>,typing<10>,traceback<4>,Improved Modules<8>
@anchor{whatsnew/3 6 tracemalloc}@anchor{ef2}
@subsubsection tracemalloc


The @ref{106,,tracemalloc} module now supports tracing memory allocations in
multiple different address spaces.

The new @ref{ef3,,DomainFilter} filter class has been added
to filter block traces by their address space (domain).

(Contributed by Victor Stinner in bpo-26588@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26588}.)

@node typing<10>,unicodedata<8>,tracemalloc<3>,Improved Modules<8>
@anchor{whatsnew/3 6 typing}@anchor{ef4}@anchor{whatsnew/3 6 whatsnew36-typing}@anchor{e3d}
@subsubsection typing


Since the @ref{10b,,typing} module is @ref{3cf,,provisional},
all changes introduced in Python 3.6 have also been
backported to Python 3.5.x.

The @ref{10b,,typing} module has a much improved support for generic type
aliases.  For example @code{Dict[str, Tuple[S, T]]} is now a valid
type annotation.
(Contributed by Guido van Rossum in Github #195@footnote{https://github.com/python/typing/pull/195}.)

The @ref{e91,,typing.ContextManager} class has been added for
representing @ref{e90,,contextlib.AbstractContextManager}.
(Contributed by Brett Cannon in bpo-25609@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25609}.)

The @ref{ef5,,typing.Collection} class has been added for
representing @ref{e8a,,collections.abc.Collection}.
(Contributed by Ivan Levkivskyi in bpo-27598@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27598}.)

The @ref{56d,,typing.ClassVar} type construct has been added to
mark class variables.  As introduced in 
@geindex Python Enhancement Proposals; PEP 526
PEP 526@footnote{https://peps.python.org/pep-0526/}, a variable annotation
wrapped in ClassVar indicates that a given attribute is intended to be used as
a class variable and should not be set on instances of that class.
(Contributed by Ivan Levkivskyi in Github #280@footnote{https://github.com/python/typing/pull/280}.)

A new @ref{ef6,,TYPE_CHECKING} constant that is assumed to be
@code{True} by the static type checkers, but is @code{False} at runtime.
(Contributed by Guido van Rossum in Github #230@footnote{https://github.com/python/typing/issues/230}.)

A new @ref{ef7,,NewType()} helper function has been added to create
lightweight distinct types for annotations:

@example
from typing import NewType

UserId = NewType('UserId', int)
some_id = UserId(524313)
@end example

The static type checker will treat the new type as if it were a subclass
of the original type.  (Contributed by Ivan Levkivskyi in Github #189@footnote{https://github.com/python/typing/issues/189}.)

@node unicodedata<8>,unittest mock<2>,typing<10>,Improved Modules<8>
@anchor{whatsnew/3 6 unicodedata}@anchor{ef8}
@subsubsection unicodedata


The @ref{10c,,unicodedata} module now uses data from Unicode 9.0.0@footnote{https://unicode.org/versions/Unicode9.0.0/}.
(Contributed by Benjamin Peterson.)

@node unittest mock<2>,urllib request,unicodedata<8>,Improved Modules<8>
@anchor{whatsnew/3 6 unittest-mock}@anchor{ef9}
@subsubsection unittest.mock


The @ref{c45,,Mock} class has the following improvements:


@itemize *

@item 
Two new methods, @ref{efa,,Mock.assert_called()} and @ref{efb,,Mock.assert_called_once()} to check if the mock object
was called.
(Contributed by Amit Saha in bpo-26323@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26323}.)

@item 
The @ref{efc,,Mock.reset_mock()} method
now has two optional keyword only arguments: `return_value' and
`side_effect'.
(Contributed by Kushal Das in bpo-21271@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21271}.)
@end itemize

@node urllib request,urllib robotparser,unittest mock<2>,Improved Modules<8>
@anchor{whatsnew/3 6 urllib-request}@anchor{efd}
@subsubsection urllib.request


If a HTTP request has a file or iterable body (other than a
bytes object) but no @code{Content-Length} header, rather than
throwing an error, @ref{efe,,AbstractHTTPHandler}
now falls back to use chunked transfer encoding.
(Contributed by Demian Brecht and Rolf Krahl in bpo-12319@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12319}.)

@node urllib robotparser,venv<5>,urllib request,Improved Modules<8>
@anchor{whatsnew/3 6 urllib-robotparser}@anchor{eff}
@subsubsection urllib.robotparser


@ref{f00,,RobotFileParser} now supports the @code{Crawl-delay} and
@code{Request-rate} extensions.
(Contributed by Nikolay Bogoychev in bpo-16099@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16099}.)

@node venv<5>,warnings<4>,urllib robotparser,Improved Modules<8>
@anchor{whatsnew/3 6 venv}@anchor{f01}
@subsubsection venv


@ref{118,,venv} accepts a new parameter @code{--prompt}. This parameter provides an
alternative prefix for the virtual environment. (Proposed by Łukasz Balcerzak
and ported to 3.6 by Stéphane Wirtel in bpo-22829@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22829}.)

@node warnings<4>,winreg,venv<5>,Improved Modules<8>
@anchor{whatsnew/3 6 warnings}@anchor{f02}
@subsubsection warnings


A new optional `source' parameter has been added to the
@ref{f03,,warnings.warn_explicit()} function: the destroyed object which emitted a
@ref{54d,,ResourceWarning}. A `source' attribute has also been added to
@code{warnings.WarningMessage} (contributed by Victor Stinner in
bpo-26568@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26568} and bpo-26567@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26567}).

When a @ref{54d,,ResourceWarning} warning is logged, the @ref{106,,tracemalloc} module is now
used to try to retrieve the traceback where the destroyed object was allocated.

Example with the script @code{example.py}:

@example
import warnings

def func():
    return open(__file__)

f = func()
f = None
@end example

Output of the command @code{python3.6 -Wd -X tracemalloc=5 example.py}:

@example
example.py:7: ResourceWarning: unclosed file <_io.TextIOWrapper name='example.py' mode='r' encoding='UTF-8'>
  f = None
Object allocated at (most recent call first):
  File "example.py", lineno 4
    return open(__file__)
  File "example.py", lineno 6
    f = func()
@end example

The “Object allocated at” traceback is new and is only displayed if
@ref{106,,tracemalloc} is tracing Python memory allocations and if the
@ref{119,,warnings} module was already imported.

@node winreg,winsound,warnings<4>,Improved Modules<8>
@anchor{whatsnew/3 6 winreg}@anchor{f04}
@subsubsection winreg


Added the 64-bit integer type @ref{f05,,REG_QWORD}.
(Contributed by Clement Rouault in bpo-23026@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23026}.)

@node winsound,xmlrpc client,winreg,Improved Modules<8>
@anchor{whatsnew/3 6 winsound}@anchor{f06}
@subsubsection winsound


Allowed keyword arguments to be passed to @ref{f07,,Beep},
@ref{f08,,MessageBeep}, and @ref{f09,,PlaySound} (bpo-27982@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27982}).

@node xmlrpc client,zipfile<4>,winsound,Improved Modules<8>
@anchor{whatsnew/3 6 xmlrpc-client}@anchor{f0a}
@subsubsection xmlrpc.client


The @ref{135,,xmlrpc.client} module now supports unmarshalling
additional data types used by the Apache XML-RPC implementation
for numerics and @code{None}.
(Contributed by Serhiy Storchaka in bpo-26885@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26885}.)

@node zipfile<4>,zlib<2>,xmlrpc client,Improved Modules<8>
@anchor{whatsnew/3 6 zipfile}@anchor{f0b}
@subsubsection zipfile


A new @ref{f0c,,ZipInfo.from_file()} class method
allows making a @ref{2cd,,ZipInfo} instance from a filesystem file.
A new @ref{f0d,,ZipInfo.is_dir()} method can be used
to check if the @code{ZipInfo} instance represents a directory.
(Contributed by Thomas Kluyver in bpo-26039@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26039}.)

The @ref{65d,,ZipFile.open()} method can now be used to
write data into a ZIP file, as well as for extracting data.
(Contributed by Thomas Kluyver in bpo-26039@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26039}.)

@node zlib<2>,,zipfile<4>,Improved Modules<8>
@anchor{whatsnew/3 6 zlib}@anchor{f0e}
@subsubsection zlib


The @ref{850,,compress()} and @ref{f0f,,decompress()} functions now accept
keyword arguments.
(Contributed by Aviv Palivoda in bpo-26243@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26243} and
Xiang Zhang in bpo-16764@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16764} respectively.)

@node Optimizations<9>,Build and C API Changes<2>,Improved Modules<8>,What’s New In Python 3 6
@anchor{whatsnew/3 6 optimizations}@anchor{f10}
@subsection Optimizations



@itemize *

@item 
The Python interpreter now uses a 16-bit wordcode instead of bytecode which
made a number of opcode optimizations possible.
(Contributed by Demur Rumed with input and reviews from
Serhiy Storchaka and Victor Stinner in bpo-26647@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26647} and bpo-28050@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28050}.)

@item 
The @ref{dcc,,asyncio.Future} class now has an optimized C implementation.
(Contributed by Yury Selivanov and INADA Naoki in bpo-26081@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26081}.)

@item 
The @ref{1c9,,asyncio.Task} class now has an optimized
C implementation. (Contributed by Yury Selivanov in bpo-28544@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28544}.)

@item 
Various implementation improvements in the @ref{10b,,typing} module
(such as caching of generic types) allow up to 30 times performance
improvements and reduced memory footprint.

@item 
The ASCII decoder is now up to 60 times as fast for error handlers
@code{surrogateescape}, @code{ignore} and @code{replace} (Contributed
by Victor Stinner in bpo-24870@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24870}).

@item 
The ASCII and the Latin1 encoders are now up to 3 times as fast for the
error handler @code{surrogateescape}
(Contributed by Victor Stinner in bpo-25227@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25227}).

@item 
The UTF-8 encoder is now up to 75 times as fast for error handlers
@code{ignore}, @code{replace}, @code{surrogateescape}, @code{surrogatepass} (Contributed
by Victor Stinner in bpo-25267@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25267}).

@item 
The UTF-8 decoder is now up to 15 times as fast for error handlers
@code{ignore}, @code{replace} and @code{surrogateescape} (Contributed
by Victor Stinner in bpo-25301@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25301}).

@item 
@code{bytes % args} is now up to 2 times faster. (Contributed by Victor Stinner
in bpo-25349@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25349}).

@item 
@code{bytearray % args} is now between 2.5 and 5 times faster. (Contributed by
Victor Stinner in bpo-25399@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25399}).

@item 
Optimize @ref{191,,bytes.fromhex()} and @ref{192,,bytearray.fromhex()}: they are now
between 2x and 3.5x faster. (Contributed by Victor Stinner in bpo-25401@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25401}).

@item 
Optimize @code{bytes.replace(b'@w{'}, b'.')} and @code{bytearray.replace(b'@w{'}, b'.')}:
up to 80% faster. (Contributed by Josh Snider in bpo-26574@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26574}).

@item 
Allocator functions of the @ref{e66,,PyMem_Malloc()} domain
(@ref{e69,,PYMEM_DOMAIN_MEM}) now use the @ref{f11,,pymalloc memory allocator} instead of @code{malloc()} function of the C library. The
pymalloc allocator is optimized for objects smaller or equal to 512 bytes
with a short lifetime, and use @code{malloc()} for larger memory blocks.
(Contributed by Victor Stinner in bpo-26249@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26249}).

@item 
@ref{f12,,pickle.load()} and @ref{f13,,pickle.loads()} are now up to 10% faster when
deserializing many small objects (Contributed by Victor Stinner in
bpo-27056@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27056}).

@item 
Passing @ref{f14,,keyword arguments} to a function has an
overhead in comparison with passing @ref{f15,,positional arguments}.  Now in extension functions implemented with using
Argument Clinic this overhead is significantly decreased.
(Contributed by Serhiy Storchaka in bpo-27574@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27574}).

@item 
Optimized @ref{5a0,,glob()} and @ref{a0e,,iglob()} functions in the
@ref{68,,glob} module; they are now about 3–6 times faster.
(Contributed by Serhiy Storchaka in bpo-25596@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25596}).

@item 
Optimized globbing in @ref{a8,,pathlib} by using @ref{c5a,,os.scandir()};
it is now about 1.5–4 times faster.
(Contributed by Serhiy Storchaka in bpo-26032@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26032}).

@item 
@ref{12c,,xml.etree.ElementTree} parsing, iteration and deepcopy performance
has been significantly improved.
(Contributed by Serhiy Storchaka in bpo-25638@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25638}, bpo-25873@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25873},
and bpo-25869@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25869}.)

@item 
Creation of @ref{215,,fractions.Fraction} instances from floats and
decimals is now 2 to 3 times faster.
(Contributed by Serhiy Storchaka in bpo-25971@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25971}.)
@end itemize

@node Build and C API Changes<2>,Other Improvements,Optimizations<9>,What’s New In Python 3 6
@anchor{whatsnew/3 6 build-and-c-api-changes}@anchor{f16}
@subsection Build and C API Changes



@itemize *

@item 
Python now requires some C99 support in the toolchain to build.
Most notably, Python now uses standard integer types and macros in
place of custom macros like @code{PY_LONG_LONG}.
For more information, see 
@geindex Python Enhancement Proposals; PEP 7
PEP 7@footnote{https://peps.python.org/pep-0007/} and bpo-17884@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17884}.

@item 
Cross-compiling CPython with the Android NDK and the Android API level set to
21 (Android 5.0 Lollipop) or greater runs successfully. While Android is not
yet a supported platform, the Python test suite runs on the Android emulator
with only about 16 tests failures. See the Android meta-issue bpo-26865@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26865}.

@item 
The @code{--enable-optimizations} configure flag has been added. Turning it on
will activate expensive optimizations like PGO.
(Original patch by Alecsandru Patrascu of Intel in bpo-26359@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26359}.)

@item 
The @ref{474,,GIL} must now be held when allocator
functions of @ref{e67,,PYMEM_DOMAIN_OBJ} (ex: @ref{e68,,PyObject_Malloc()}) and
@ref{e69,,PYMEM_DOMAIN_MEM} (ex: @ref{e66,,PyMem_Malloc()}) domains are called.

@item 
New @ref{f17,,Py_FinalizeEx()} API which indicates if flushing buffered data
failed.
(Contributed by Martin Panter in bpo-5319@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5319}.)

@item 
@ref{624,,PyArg_ParseTupleAndKeywords()} now supports @ref{c7e,,positional-only parameters}.  Positional-only parameters are
defined by empty names.
(Contributed by Serhiy Storchaka in bpo-26282@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26282}).

@item 
@code{PyTraceback_Print} method now abbreviates long sequences of repeated lines
as @code{"[Previous line repeated @{count@} more times]"}.
(Contributed by Emanuel Barry in bpo-26823@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26823}.)

@item 
The new @ref{f18,,PyErr_SetImportErrorSubclass()} function allows for
specifying a subclass of @ref{65b,,ImportError} to raise.
(Contributed by Eric Snow in bpo-15767@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15767}.)

@item 
The new @ref{f19,,PyErr_ResourceWarning()} function can be used to generate
a @ref{54d,,ResourceWarning} providing the source of the resource allocation.
(Contributed by Victor Stinner in bpo-26567@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26567}.)

@item 
The new @ref{f1a,,PyOS_FSPath()} function returns the file system
representation of a @ref{5a1,,path-like object}.
(Contributed by Brett Cannon in bpo-27186@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27186}.)

@item 
The @ref{f1b,,PyUnicode_FSConverter()} and @ref{798,,PyUnicode_FSDecoder()}
functions will now accept @ref{5a1,,path-like objects}.
@end itemize

@node Other Improvements,Deprecated<10>,Build and C API Changes<2>,What’s New In Python 3 6
@anchor{whatsnew/3 6 other-improvements}@anchor{f1c}
@subsection Other Improvements



@itemize *

@item 
When @ref{f1d,,--version} (short form: @ref{49c,,-V}) is supplied twice,
Python prints @ref{49d,,sys.version} for detailed information.

@example
$ ./python -VV
Python 3.6.0b4+ (3.6:223967b49e49+, Nov 21 2016, 20:55:04)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)]
@end example
@end itemize

@node Deprecated<10>,Removed<10>,Other Improvements,What’s New In Python 3 6
@anchor{whatsnew/3 6 deprecated}@anchor{f1e}
@subsection Deprecated


@menu
* New Keywords:: 
* Deprecated Python behavior:: 
* Deprecated Python modules@comma{} functions and methods: Deprecated Python modules functions and methods<2>. 
* xml: xml<6>. 
* Deprecated functions and types of the C API: Deprecated functions and types of the C API<2>. 
* Deprecated Build Options:: 

@end menu

@node New Keywords,Deprecated Python behavior,,Deprecated<10>
@anchor{whatsnew/3 6 new-keywords}@anchor{f1f}
@subsubsection New Keywords


@code{async} and @code{await} are not recommended to be used as variable, class,
function or module names.  Introduced by 
@geindex Python Enhancement Proposals; PEP 492
PEP 492@footnote{https://peps.python.org/pep-0492/} in Python 3.5, they will
become proper keywords in Python 3.7.  Starting in Python 3.6, the use of
@code{async} or @code{await} as names will generate a @ref{1a4,,DeprecationWarning}.

@node Deprecated Python behavior,Deprecated Python modules functions and methods<2>,New Keywords,Deprecated<10>
@anchor{whatsnew/3 6 deprecated-python-behavior}@anchor{f20}
@subsubsection Deprecated Python behavior


Raising the @ref{dfb,,StopIteration} exception inside a generator will now
generate a @ref{1a4,,DeprecationWarning}, and will trigger a @ref{246,,RuntimeError}
in Python 3.7.  See @ref{f21,,PEP 479; Change StopIteration handling inside generators} for details.

The @ref{dfc,,__aiter__()} method is now expected to return an asynchronous
iterator directly instead of returning an awaitable as previously.
Doing the former will trigger a @ref{1a4,,DeprecationWarning}.  Backward
compatibility will be removed in Python 3.7.
(Contributed by Yury Selivanov in bpo-27243@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27243}.)

A backslash-character pair that is not a valid escape sequence now generates
a @ref{1a4,,DeprecationWarning}.  Although this will eventually become a
@ref{18f,,SyntaxError}, that will not be for several Python releases.
(Contributed by Emanuel Barry in bpo-27364@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27364}.)

When performing a relative import, falling back on @code{__name__} and
@code{__path__} from the calling module when @code{__spec__} or
@code{__package__} are not defined now raises an @ref{71f,,ImportWarning}.
(Contributed by Rose Ames in bpo-25791@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25791}.)

@node Deprecated Python modules functions and methods<2>,xml<6>,Deprecated Python behavior,Deprecated<10>
@anchor{whatsnew/3 6 deprecated-python-modules-functions-and-methods}@anchor{f22}
@subsubsection Deprecated Python modules, functions and methods


@menu
* asynchat:: 
* asyncore:: 
* dbm: dbm<4>. 
* distutils: distutils<6>. 
* grp:: 
* importlib: importlib<7>. 
* os: os<10>. 
* re: re<7>. 
* ssl: ssl<9>. 
* tkinter: tkinter<8>. 
* venv: venv<6>. 

@end menu

@node asynchat,asyncore,,Deprecated Python modules functions and methods<2>
@anchor{whatsnew/3 6 asynchat}@anchor{f23}
@subsubsection asynchat


The @code{asynchat} has been deprecated in favor of @ref{b,,asyncio}.
(Contributed by Mariatta in bpo-25002@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25002}.)

@node asyncore,dbm<4>,asynchat,Deprecated Python modules functions and methods<2>
@anchor{whatsnew/3 6 asyncore}@anchor{f24}
@subsubsection asyncore


The @code{asyncore} has been deprecated in favor of @ref{b,,asyncio}.
(Contributed by Mariatta in bpo-25002@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25002}.)

@node dbm<4>,distutils<6>,asyncore,Deprecated Python modules functions and methods<2>
@anchor{whatsnew/3 6 dbm}@anchor{f25}
@subsubsection dbm


Unlike other @ref{35,,dbm} implementations, the @ref{36,,dbm.dumb} module
creates databases with the @code{'rw'} mode and allows modifying the database
opened with the @code{'r'} mode.  This behavior is now deprecated and will
be removed in 3.8.
(Contributed by Serhiy Storchaka in bpo-21708@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21708}.)

@node distutils<6>,grp,dbm<4>,Deprecated Python modules functions and methods<2>
@anchor{whatsnew/3 6 id2}@anchor{f26}
@subsubsection distutils


The undocumented @code{extra_path} argument to the
@code{distutils.Distribution} constructor is now considered deprecated
and will raise a warning if set.   Support for this parameter will be
removed in a future Python release.  See bpo-27919@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27919} for details.

@node grp,importlib<7>,distutils<6>,Deprecated Python modules functions and methods<2>
@anchor{whatsnew/3 6 grp}@anchor{f27}
@subsubsection grp


The support of non-integer arguments in @ref{f28,,getgrgid()} has been
deprecated.
(Contributed by Serhiy Storchaka in bpo-26129@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26129}.)

@node importlib<7>,os<10>,grp,Deprecated Python modules functions and methods<2>
@anchor{whatsnew/3 6 id3}@anchor{f29}
@subsubsection importlib


The @ref{f2a,,importlib.machinery.SourceFileLoader.load_module()} and
@ref{f2b,,importlib.machinery.SourcelessFileLoader.load_module()} methods
are now deprecated. They were the only remaining implementations of
@ref{a6f,,importlib.abc.Loader.load_module()} in @ref{7b,,importlib} that had not
been deprecated in previous versions of Python in favour of
@ref{a70,,importlib.abc.Loader.exec_module()}.

The @ref{f2c,,importlib.machinery.WindowsRegistryFinder} class is now
deprecated. As of 3.6.0, it is still added to @ref{f2d,,sys.meta_path} by
default (on Windows), but this may change in future releases.

@node os<10>,re<7>,importlib<7>,Deprecated Python modules functions and methods<2>
@anchor{whatsnew/3 6 id4}@anchor{f2e}
@subsubsection os


Undocumented support of general @ref{194,,bytes-like objects}
as paths in @ref{a5,,os} functions, @ref{4b2,,compile()} and similar functions is
now deprecated.
(Contributed by Serhiy Storchaka in bpo-25791@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25791} and bpo-26754@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26754}.)

@node re<7>,ssl<9>,os<10>,Deprecated Python modules functions and methods<2>
@anchor{whatsnew/3 6 id5}@anchor{f2f}
@subsubsection re


Support for inline flags @code{(?letters)} in the middle of the regular
expression has been deprecated and will be removed in a future Python
version.  Flags at the start of a regular expression are still allowed.
(Contributed by Serhiy Storchaka in bpo-22493@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22493}.)

@node ssl<9>,tkinter<8>,re<7>,Deprecated Python modules functions and methods<2>
@anchor{whatsnew/3 6 id6}@anchor{f30}
@subsubsection ssl


OpenSSL 0.9.8, 1.0.0 and 1.0.1 are deprecated and no longer supported.
In the future the @ref{d5,,ssl} module will require at least OpenSSL 1.0.2 or
1.1.0.

SSL-related arguments like @code{certfile}, @code{keyfile} and @code{check_hostname}
in @ref{62,,ftplib}, @ref{73,,http.client}, @ref{78,,imaplib}, @ref{b1,,poplib},
and @ref{cf,,smtplib} have been deprecated in favor of @code{context}.
(Contributed by Christian Heimes in bpo-28022@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28022}.)

A couple of protocols and functions of the @ref{d5,,ssl} module are now
deprecated. Some features will no longer be available in future versions
of OpenSSL. Other features are deprecated in favor of a different API.
(Contributed by Christian Heimes in bpo-28022@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28022} and bpo-26470@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26470}.)

@node tkinter<8>,venv<6>,ssl<9>,Deprecated Python modules functions and methods<2>
@anchor{whatsnew/3 6 id7}@anchor{f31}
@subsubsection tkinter


The @code{tkinter.tix} module is now deprecated.  @ref{f6,,tkinter} users
should use @ref{100,,tkinter.ttk} instead.

@node venv<6>,,tkinter<8>,Deprecated Python modules functions and methods<2>
@anchor{whatsnew/3 6 id8}@anchor{f32}@anchor{whatsnew/3 6 whatsnew36-venv}@anchor{f33}
@subsubsection venv


The @code{pyvenv} script has been deprecated in favour of @code{python3 -m venv}.
This prevents confusion as to what Python interpreter @code{pyvenv} is
connected to and thus what Python interpreter will be used by the virtual
environment.  (Contributed by Brett Cannon in bpo-25154@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25154}.)

@node xml<6>,Deprecated functions and types of the C API<2>,Deprecated Python modules functions and methods<2>,Deprecated<10>
@anchor{whatsnew/3 6 xml}@anchor{f34}
@subsubsection xml



@itemize *

@item 
As mitigation against DTD and external entity retrieval, the
@ref{129,,xml.dom.minidom} and @ref{130,,xml.sax} modules no longer process
external entities by default.
(Contributed by Christian Heimes in gh-61441@footnote{https://github.com/python/cpython/issues/61441}.)
@end itemize

@node Deprecated functions and types of the C API<2>,Deprecated Build Options,xml<6>,Deprecated<10>
@anchor{whatsnew/3 6 deprecated-functions-and-types-of-the-c-api}@anchor{f35}
@subsubsection Deprecated functions and types of the C API


Undocumented functions @code{PyUnicode_AsEncodedObject()},
@code{PyUnicode_AsDecodedObject()}, @code{PyUnicode_AsEncodedUnicode()}
and @code{PyUnicode_AsDecodedUnicode()} are deprecated now.
Use the @ref{f36,,generic codec based API} instead.

@node Deprecated Build Options,,Deprecated functions and types of the C API<2>,Deprecated<10>
@anchor{whatsnew/3 6 deprecated-build-options}@anchor{f37}
@subsubsection Deprecated Build Options


The @code{--with-system-ffi} configure flag is now on by default on non-macOS
UNIX platforms.  It may be disabled by using @code{--without-system-ffi}, but
using the flag is deprecated and will not be accepted in Python 3.7.
macOS is unaffected by this change.  Note that many OS distributors already
use the @code{--with-system-ffi} flag when building their system Python.

@node Removed<10>,Porting to Python 3 6,Deprecated<10>,What’s New In Python 3 6
@anchor{whatsnew/3 6 removed}@anchor{f38}
@subsection Removed


@menu
* API and Feature Removals: API and Feature Removals<3>. 

@end menu

@node API and Feature Removals<3>,,,Removed<10>
@anchor{whatsnew/3 6 api-and-feature-removals}@anchor{f39}
@subsubsection API and Feature Removals



@itemize *

@item 
Unknown escapes consisting of @code{'\'} and an ASCII letter in
regular expressions will now cause an error.  In replacement templates for
@ref{5a3,,re.sub()} they are still allowed, but deprecated.
The @ref{d69,,re.LOCALE} flag can now only be used with binary patterns.

@item 
@code{inspect.getmoduleinfo()} was removed (was deprecated since CPython 3.3).
@ref{f3a,,inspect.getmodulename()} should be used for obtaining the module
name for a given path.
(Contributed by Yury Selivanov in bpo-13248@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13248}.)

@item 
@code{traceback.Ignore} class and @code{traceback.usage}, @code{traceback.modname},
@code{traceback.fullmodname}, @code{traceback.find_lines_from_code},
@code{traceback.find_lines}, @code{traceback.find_strings},
@code{traceback.find_executable_lines} methods were removed from the
@ref{105,,traceback} module. They were undocumented methods deprecated since
Python 3.2 and equivalent functionality is available from private methods.

@item 
The @code{tk_menuBar()} and @code{tk_bindForTraversal()} dummy methods in
@ref{f6,,tkinter} widget classes were removed (corresponding Tk commands
were obsolete since Tk 4.0).

@item 
The @ref{65d,,open()} method of the @ref{8d5,,zipfile.ZipFile}
class no longer supports the @code{'U'} mode (was deprecated since Python 3.4).
Use @ref{9c4,,io.TextIOWrapper} for reading compressed text files in
@ref{f3b,,universal newlines} mode.

@item 
The undocumented @code{IN}, @code{CDROM}, @code{DLFCN}, @code{TYPES}, @code{CDIO}, and
@code{STROPTS} modules have been removed.  They had been available in the
platform specific @code{Lib/plat-*/} directories, but were chronically out of
date, inconsistently available across platforms, and unmaintained.  The
script that created these modules is still available in the source
distribution at Tools/scripts/h2py.py@footnote{https://github.com/python/cpython/blob/v3.6.15/Tools/scripts/h2py.py}.

@item 
The deprecated @code{asynchat.fifo} class has been removed.
@end itemize

@node Porting to Python 3 6,Notable changes in Python 3 6 2,Removed<10>,What’s New In Python 3 6
@anchor{whatsnew/3 6 porting-to-python-3-6}@anchor{f3c}
@subsection Porting to Python 3.6


This section lists previously described changes and other bugfixes
that may require changes to your code.

@menu
* Changes in ‘python’ Command Behavior:: 
* Changes in the Python API: Changes in the Python API<9>. 
* Changes in the C API: Changes in the C API<7>. 
* CPython bytecode changes: CPython bytecode changes<8>. 

@end menu

@node Changes in ‘python’ Command Behavior,Changes in the Python API<9>,,Porting to Python 3 6
@anchor{whatsnew/3 6 changes-in-python-command-behavior}@anchor{f3d}
@subsubsection Changes in ‘python’ Command Behavior



@itemize *

@item 
The output of a special Python build with defined @code{COUNT_ALLOCS},
@code{SHOW_ALLOC_COUNT} or @code{SHOW_TRACK_COUNT} macros is now off by
default.  It can be re-enabled using the @code{-X showalloccount} option.
It now outputs to @code{stderr} instead of @code{stdout}.
(Contributed by Serhiy Storchaka in bpo-23034@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23034}.)
@end itemize

@node Changes in the Python API<9>,Changes in the C API<7>,Changes in ‘python’ Command Behavior,Porting to Python 3 6
@anchor{whatsnew/3 6 changes-in-the-python-api}@anchor{f3e}
@subsubsection Changes in the Python API



@itemize *

@item 
@ref{318,,open()} will no longer allow combining the @code{'U'} mode flag
with @code{'+'}.
(Contributed by Jeff Balogh and John O’Connor in bpo-2091@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2091}.)

@item 
@ref{d4,,sqlite3} no longer implicitly commits an open transaction before DDL
statements.

@item 
On Linux, @ref{747,,os.urandom()} now blocks until the system urandom entropy pool
is initialized to increase the security.

@item 
When @ref{a70,,importlib.abc.Loader.exec_module()} is defined,
@ref{eb2,,importlib.abc.Loader.create_module()} must also be defined.

@item 
@ref{f3f,,PyErr_SetImportError()} now sets @ref{199,,TypeError} when its `msg'
argument is not set. Previously only @code{NULL} was returned.

@item 
The format of the @ref{32e,,co_lnotab} attribute of code objects
changed to support
a negative line number delta. By default, Python does not emit bytecode with
a negative line number delta. Functions using @ref{9b5,,frame.f_lineno},
@code{PyFrame_GetLineNumber()} or @code{PyCode_Addr2Line()} are not affected.
Functions directly decoding @code{co_lnotab} should be updated to use a signed
8-bit integer type for the line number delta, but this is only required to
support applications using a negative line number delta. See
@code{Objects/lnotab_notes.txt} for the @code{co_lnotab} format and how to decode
it, and see the 
@geindex Python Enhancement Proposals; PEP 511
PEP 511@footnote{https://peps.python.org/pep-0511/} for the rationale.

@item 
The functions in the @ref{21,,compileall} module now return booleans instead
of @code{1} or @code{0} to represent success or failure, respectively. Thanks to
booleans being a subclass of integers, this should only be an issue if you
were doing identity checks for @code{1} or @code{0}. See bpo-25768@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25768}.

@item 
Reading the @code{port} attribute of
@ref{f40,,urllib.parse.urlsplit()} and @ref{360,,urlparse()} results
now raises @ref{2ee,,ValueError} for out-of-range values, rather than
returning @ref{887,,None}.  See bpo-20059@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20059}.

@item 
The @code{imp} module now raises a @ref{1a4,,DeprecationWarning} instead of
@ref{acc,,PendingDeprecationWarning}.

@item 
The following modules have had missing APIs added to their
@ref{f41,,__all__} attributes to match the documented APIs:
@ref{15,,calendar}, @code{cgi}, @ref{2d,,csv},
@ref{12c,,ElementTree}, @ref{5a,,enum},
@ref{5f,,fileinput}, @ref{62,,ftplib}, @ref{8b,,logging}, @ref{8f,,mailbox},
@ref{93,,mimetypes}, @ref{a4,,optparse}, @ref{b0,,plistlib}, @code{smtpd},
@ref{dc,,subprocess}, @ref{e4,,tarfile}, @ref{f3,,threading} and
@ref{11a,,wave}.  This means they will export new symbols when @code{import *}
is used.
(Contributed by Joel Taddei and Jacek Kołodziej in bpo-23883@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23883}.)

@item 
When performing a relative import, if @code{__package__} does not compare equal
to @code{__spec__.parent} then @ref{71f,,ImportWarning} is raised.
(Contributed by Brett Cannon in bpo-25791@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25791}.)

@item 
When a relative import is performed and no parent package is known, then
@ref{65b,,ImportError} will be raised. Previously, @ref{796,,SystemError} could be
raised. (Contributed by Brett Cannon in bpo-18018@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18018}.)

@item 
Servers based on the @ref{d2,,socketserver} module, including those
defined in @ref{76,,http.server}, @ref{136,,xmlrpc.server} and
@ref{122,,wsgiref.simple_server}, now only catch exceptions derived
from @ref{bd3,,Exception}. Therefore if a request handler raises
an exception like @ref{f42,,SystemExit} or @ref{bcb,,KeyboardInterrupt},
@ref{f43,,handle_error()} is no longer called, and
the exception will stop a single-threaded server. (Contributed by
Martin Panter in bpo-23430@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23430}.)

@item 
@code{spwd.getspnam()} now raises a @ref{f44,,PermissionError} instead of
@ref{5e7,,KeyError} if the user doesn’t have privileges.

@item 
The @ref{f45,,socket.socket.close()} method now raises an exception if
an error (e.g. @code{EBADF}) was reported by the underlying system call.
(Contributed by Martin Panter in bpo-26685@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26685}.)

@item 
The `decode_data' argument for the @code{smtpd.SMTPChannel} and
@code{smtpd.SMTPServer} constructors is now @code{False} by default.
This means that the argument passed to
@code{process_message()} is now a bytes object by
default, and @code{process_message()} will be passed keyword arguments.
Code that has already been updated in accordance with the deprecation
warning generated by 3.5 will not be affected.

@item 
All optional arguments of the @ref{f46,,dump()}, @ref{f47,,dumps()},
@ref{eb8,,load()} and @ref{b54,,loads()} functions and
@ref{f48,,JSONEncoder} and @ref{f49,,JSONDecoder} class
constructors in the @ref{86,,json} module are now @ref{5a5,,keyword-only}.
(Contributed by Serhiy Storchaka in bpo-18726@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18726}.)

@item 
Subclasses of @ref{f4a,,type} which don’t override @code{type.__new__} may no
longer use the one-argument form to get the type of an object.

@item 
As part of 
@geindex Python Enhancement Proposals; PEP 487
PEP 487@footnote{https://peps.python.org/pep-0487/}, the handling of keyword arguments passed to
@ref{f4a,,type} (other than the metaclass hint, @code{metaclass}) is now
consistently delegated to @ref{844,,object.__init_subclass__()}. This means that
@ref{7a1,,type.__new__} and @ref{8c1,,type.__init__} both now accept arbitrary keyword arguments,
but @code{object.__init_subclass__()} (which is called from
@code{type.__new__}) will reject them by default.
Custom metaclasses accepting additional keyword arguments will need to adjust
their calls to @code{type.__new__}
(whether direct or via @ref{1a7,,super}) accordingly.

@item 
In @code{distutils.command.sdist.sdist}, the @code{default_format}
attribute has been removed and is no longer honored. Instead, the
gzipped tarfile format is the default on all platforms and no
platform-specific selection is made.
In environments where distributions are
built on Windows and zip distributions are required, configure
the project with a @code{setup.cfg} file containing the following:

@example
[sdist]
formats=zip
@end example

This behavior has also been backported to earlier Python versions
by Setuptools 26.0.0.

@item 
In the @ref{112,,urllib.request} module and the
@ref{ead,,http.client.HTTPConnection.request()} method, if no Content-Length
header field has been specified and the request body is a file object,
it is now sent with HTTP 1.1 chunked encoding. If a file object has to
be sent to a HTTP 1.0 server, the Content-Length value now has to be
specified by the caller.
(Contributed by Demian Brecht and Rolf Krahl with tweaks from
Martin Panter in bpo-12319@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12319}.)

@item 
The @ref{bde,,DictReader} now returns rows of type
@ref{7f4,,OrderedDict}.
(Contributed by Steve Holden in bpo-27842@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27842}.)

@item 
The @code{crypt.METHOD_CRYPT} will no longer be added to @code{crypt.methods}
if unsupported by the platform.
(Contributed by Victor Stinner in bpo-25287@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25287}.)

@item 
The `verbose' and `rename' arguments for
@ref{4e1,,namedtuple()} are now keyword-only.
(Contributed by Raymond Hettinger in bpo-25628@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25628}.)

@item 
On Linux, @ref{f4b,,ctypes.util.find_library()} now looks in
@code{LD_LIBRARY_PATH} for shared libraries.
(Contributed by Vinay Sajip in bpo-9998@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9998}.)

@item 
The @ref{b05,,imaplib.IMAP4} class now handles flags containing the
@code{']'} character in messages sent from the server to improve
real-world compatibility.
(Contributed by Lita Cho in bpo-21815@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21815}.)

@item 
The @ref{f4c,,mmap.mmap.write()} function now returns the number
of bytes written like other write methods.
(Contributed by Jakub Stasiak in bpo-26335@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26335}.)

@item 
The @ref{f4d,,pkgutil.iter_modules()} and @ref{dff,,pkgutil.walk_packages()}
functions now return @ref{f4e,,ModuleInfo} named tuples.
(Contributed by Ramchandra Apte in bpo-17211@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17211}.)

@item 
@ref{5a3,,re.sub()} now raises an error for invalid numerical group
references in replacement templates even if the pattern is not
found in the string.  The error message for invalid group references
now includes the group index and the position of the reference.
(Contributed by SilentGhost, Serhiy Storchaka in bpo-25953@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25953}.)

@item 
@ref{8d5,,zipfile.ZipFile} will now raise @ref{369,,NotImplementedError} for
unrecognized compression values.  Previously a plain @ref{246,,RuntimeError}
was raised.  Additionally, calling @code{ZipFile} methods
on a closed ZipFile or calling the @ref{f4f,,write()} method
on a ZipFile created with mode @code{'r'} will raise a @ref{2ee,,ValueError}.
Previously, a @code{RuntimeError} was raised in those scenarios.

@item 
when custom metaclasses are combined with zero-argument @ref{1a7,,super()} or
direct references from methods to the implicit @code{__class__} closure
variable, the implicit @code{__classcell__} namespace entry must now be passed
up to @code{type.__new__} for initialisation. Failing to do so will result in
a @ref{1a4,,DeprecationWarning} in Python 3.6 and a @ref{246,,RuntimeError} in
Python 3.8.

@item 
With the introduction of @ref{d43,,ModuleNotFoundError}, import system consumers
may start expecting import system replacements to raise that more specific
exception when appropriate, rather than the less-specific @ref{65b,,ImportError}.
To provide future compatibility with such consumers, implementers of
alternative import systems that completely replace @ref{ad7,,__import__()} will
need to update their implementations to raise the new subclass when a module
can’t be found at all. Implementers of compliant plugins to the default
import system shouldn’t need to make any changes, as the default import
system will raise the new subclass when appropriate.
@end itemize

@node Changes in the C API<7>,CPython bytecode changes<8>,Changes in the Python API<9>,Porting to Python 3 6
@anchor{whatsnew/3 6 changes-in-the-c-api}@anchor{f50}
@subsubsection Changes in the C API



@itemize *

@item 
The @ref{e66,,PyMem_Malloc()} allocator family now uses the @ref{f11,,pymalloc allocator} rather than the system @code{malloc()}. Applications calling
@code{PyMem_Malloc()} without holding the GIL can now crash. Set the
@geindex PYTHONMALLOC
@geindex environment variable; PYTHONMALLOC
@ref{e64,,PYTHONMALLOC} environment variable to @code{debug} to validate the
usage of memory allocators in your application. See bpo-26249@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26249}.

@item 
@ref{f51,,Py_Exit()} (and the main interpreter) now override the exit status
with 120 if flushing buffered data failed.  See bpo-5319@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5319}.
@end itemize

@node CPython bytecode changes<8>,,Changes in the C API<7>,Porting to Python 3 6
@anchor{whatsnew/3 6 cpython-bytecode-changes}@anchor{f52}
@subsubsection CPython bytecode changes


There have been several major changes to the @ref{4ab,,bytecode} in Python 3.6.


@itemize *

@item 
The Python interpreter now uses a 16-bit wordcode instead of bytecode.
(Contributed by Demur Rumed with input and reviews from
Serhiy Storchaka and Victor Stinner in bpo-26647@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26647} and bpo-28050@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28050}.)

@item 
The new @code{FORMAT_VALUE} and @ref{f53,,BUILD_STRING} opcodes as part
of the  @ref{e2f,,formatted string literal} implementation.
(Contributed by Eric Smith in bpo-25483@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25483} and
Serhiy Storchaka in bpo-27078@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27078}.)

@item 
The new @code{BUILD_CONST_KEY_MAP} opcode to optimize the creation
of dictionaries with constant keys.
(Contributed by Serhiy Storchaka in bpo-27140@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27140}.)

@item 
The function call opcodes have been heavily reworked for better performance
and simpler implementation.
The @ref{f54,,MAKE_FUNCTION}, @code{CALL_FUNCTION},
@code{CALL_FUNCTION_KW} and @code{BUILD_MAP_UNPACK_WITH_CALL} opcodes
have been modified, the new @ref{f55,,CALL_FUNCTION_EX} and
@code{BUILD_TUPLE_UNPACK_WITH_CALL} have been added, and
@code{CALL_FUNCTION_VAR}, @code{CALL_FUNCTION_VAR_KW} and @code{MAKE_CLOSURE} opcodes
have been removed.
(Contributed by Demur Rumed in bpo-27095@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27095}, and Serhiy Storchaka in
bpo-27213@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27213}, bpo-28257@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28257}.)

@item 
The new @ref{f56,,SETUP_ANNOTATIONS} and @code{STORE_ANNOTATION} opcodes
have been added to support the new @ref{f57,,variable annotation} syntax.
(Contributed by Ivan Levkivskyi in bpo-27985@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27985}.)
@end itemize

@node Notable changes in Python 3 6 2,Notable changes in Python 3 6 4,Porting to Python 3 6,What’s New In Python 3 6
@anchor{whatsnew/3 6 notable-changes-in-python-3-6-2}@anchor{f58}
@subsection Notable changes in Python 3.6.2


@menu
* New make regen-all build target:: 
* Removal of make touch build target:: 

@end menu

@node New make regen-all build target,Removal of make touch build target,,Notable changes in Python 3 6 2
@anchor{whatsnew/3 6 new-make-regen-all-build-target}@anchor{f59}
@subsubsection New @code{make regen-all} build target


To simplify cross-compilation, and to ensure that CPython can reliably be
compiled without requiring an existing version of Python to already be
available, the autotools-based build system no longer attempts to implicitly
recompile generated files based on file modification times.

Instead, a new @code{make regen-all} command has been added to force regeneration
of these files when desired (e.g. after an initial version of Python has
already been built based on the pregenerated versions).

More selective regeneration targets are also defined - see
Makefile.pre.in@footnote{https://github.com/python/cpython/tree/3.14/Makefile.pre.in} for details.

(Contributed by Victor Stinner in bpo-23404@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23404}.)


Added in version 3.6.2.


@node Removal of make touch build target,,New make regen-all build target,Notable changes in Python 3 6 2
@anchor{whatsnew/3 6 removal-of-make-touch-build-target}@anchor{f5a}
@subsubsection Removal of @code{make touch} build target


The @code{make touch} build target previously used to request implicit regeneration
of generated files by updating their modification times has been removed.

It has been replaced by the new @code{make regen-all} target.

(Contributed by Victor Stinner in bpo-23404@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23404}.)


Changed in version 3.6.2.


@node Notable changes in Python 3 6 4,Notable changes in Python 3 6 5,Notable changes in Python 3 6 2,What’s New In Python 3 6
@anchor{whatsnew/3 6 notable-changes-in-python-3-6-4}@anchor{f5b}
@subsection Notable changes in Python 3.6.4


The @code{PyExc_RecursionErrorInst} singleton that was part of the public API
has been removed as its members being never cleared may cause a segfault
during finalization of the interpreter.
(Contributed by Xavier de Gaye in bpo-22898@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22898} and bpo-30697@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30697}.)

@node Notable changes in Python 3 6 5,Notable changes in Python 3 6 7,Notable changes in Python 3 6 4,What’s New In Python 3 6
@anchor{whatsnew/3 6 notable-changes-in-python-3-6-5}@anchor{f5c}
@subsection Notable changes in Python 3.6.5


The @ref{dfe,,locale.localeconv()} function now sets temporarily the @code{LC_CTYPE}
locale to the @code{LC_NUMERIC} locale in some cases.
(Contributed by Victor Stinner in bpo-31900@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31900}.)

@node Notable changes in Python 3 6 7,Notable changes in Python 3 6 10,Notable changes in Python 3 6 5,What’s New In Python 3 6
@anchor{whatsnew/3 6 notable-changes-in-python-3-6-7}@anchor{f5d}
@subsection Notable changes in Python 3.6.7


@ref{129,,xml.dom.minidom} and @ref{130,,xml.sax} modules no longer process
external entities by default. See also gh-61441@footnote{https://github.com/python/cpython/issues/61441}.

In 3.6.7 the @ref{102,,tokenize} module now implicitly emits a @code{NEWLINE} token
when provided with input that does not have a trailing new line.  This behavior
now matches what the C tokenizer does internally.
(Contributed by Ammar Askar in bpo-33899@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33899}.)

@node Notable changes in Python 3 6 10,Notable changes in Python 3 6 13,Notable changes in Python 3 6 7,What’s New In Python 3 6
@anchor{whatsnew/3 6 notable-changes-in-python-3-6-10}@anchor{f5e}
@subsection Notable changes in Python 3.6.10


Due to significant security concerns, the `reuse_address' parameter of
@ref{941,,asyncio.loop.create_datagram_endpoint()} is no longer supported. This is
because of the behavior of the socket option @code{SO_REUSEADDR} in UDP. For more
details, see the documentation for @code{loop.create_datagram_endpoint()}.
(Contributed by Kyle Stanley, Antoine Pitrou, and Yury Selivanov in
bpo-37228@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37228}.)

@node Notable changes in Python 3 6 13,Notable changes in Python 3 6 14,Notable changes in Python 3 6 10,What’s New In Python 3 6
@anchor{whatsnew/3 6 notable-changes-in-python-3-6-13}@anchor{f5f}
@subsection Notable changes in Python 3.6.13


Earlier Python versions allowed using both @code{;} and @code{&} as
query parameter separators in @ref{321,,urllib.parse.parse_qs()} and
@ref{320,,urllib.parse.parse_qsl()}.  Due to security concerns, and to conform with
newer W3C recommendations, this has been changed to allow only a single
separator key, with @code{&} as the default.  This change also affects
@code{cgi.parse()} and @code{cgi.parse_multipart()} as they use the affected
functions internally. For more details, please see their respective
documentation.
(Contributed by Adam Goldschmidt, Senthil Kumaran and Ken Jin in bpo-42967@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42967}.)

@node Notable changes in Python 3 6 14,,Notable changes in Python 3 6 13,What’s New In Python 3 6
@anchor{whatsnew/3 6 notable-changes-in-python-3-6-14}@anchor{f60}
@subsection Notable changes in Python 3.6.14


A security fix alters the @ref{afc,,ftplib.FTP} behavior to not trust the
IPv4 address sent from the remote server when setting up a passive data
channel.  We reuse the ftp server IP address instead.  For unusual code
requiring the old behavior, set a @code{trust_server_pasv_ipv4_address}
attribute on your FTP instance to @code{True}.  (See gh-87451@footnote{https://github.com/python/cpython/issues/87451})

The presence of newline or tab characters in parts of a URL allows for some
forms of attacks. Following the WHATWG specification that updates RFC 3986,
ASCII newline @code{\n}, @code{\r} and tab @code{\t} characters are stripped from the
URL by the parser @ref{111,,urllib.parse()} preventing such attacks. The removal
characters are controlled by a new module level variable
@code{urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE}. (See gh-88048@footnote{https://github.com/python/cpython/issues/88048})

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node What’s New In Python 3 5,What’s New In Python 3 4,What’s New In Python 3 6,What’s New in Python
@anchor{whatsnew/3 5 doc}@anchor{f61}@anchor{whatsnew/3 5 translation-repo}@anchor{f62}@anchor{whatsnew/3 5 what-s-new-in-python-3-5}@anchor{f63}
@section What’s New In Python 3.5


@*Editors: 
Elvis Pranskevichus <@email{elvis@@magic.io}>, Yury Selivanov <@email{yury@@magic.io}>


@c Rules for maintenance:
@c 
@c * Anyone can add text to this document.  Do not spend very much time
@c on the wording of your changes, because your text will probably
@c get rewritten to some degree.
@c 
@c * The maintainer will go through Misc/NEWS periodically and add
@c changes; it's therefore more important to add your changes to
@c Misc/NEWS than to this file.
@c 
@c * This is not a complete list of every single change; completeness
@c is the purpose of Misc/NEWS.  Some changes I consider too small
@c or esoteric to include.  If such a change is added to the text,
@c I'll just remove it.  (This is another reason you shouldn't spend
@c too much time on writing your addition.)
@c 
@c * If you want to draw your new text to the attention of the
@c maintainer, add 'XXX' to the beginning of the paragraph or
@c section.
@c 
@c * It's OK to just add a fragmentary note about a change.  For
@c example: "XXX Describe the transmogrify() function added to the
@c socket module."  The maintainer will research the change and
@c write the necessary text.
@c 
@c * You can comment out your additions if you like, but it's not
@c necessary (especially when a final release is some months away).
@c 
@c * Credit the author of a patch or bugfix.   Just the name is
@c sufficient; the e-mail address isn't necessary.
@c 
@c * It's helpful to add the bug/patch number as a comment:
@c 
@c XXX Describe the transmogrify() function added to the socket
@c module.
@c (Contributed by P.Y. Developer in :issue:`12345`.)
@c 
@c This saves the maintainer the effort of going through the Mercurial log
@c when researching a change.

This article explains the new features in Python 3.5, compared to 3.4.
Python 3.5 was released on September 13, 2015.  See the
changelog@footnote{https://docs.python.org/3.5/whatsnew/changelog.html} for a full
list of changes.


@subsubheading See also


@geindex Python Enhancement Proposals; PEP 478
PEP 478@footnote{https://peps.python.org/pep-0478/} - Python 3.5 Release Schedule


@menu
* Summary – Release highlights: Summary – Release highlights<8>. 
* New Features: New Features<14>. 
* Other Language Changes: Other Language Changes<9>. 
* New Modules: New Modules<9>. 
* Improved Modules: Improved Modules<9>. 
* Other module-level changes:: 
* Optimizations: Optimizations<10>. 
* Build and C API Changes: Build and C API Changes<3>. 
* Deprecated: Deprecated<11>. 
* Removed: Removed<11>. 
* Porting to Python 3.5: Porting to Python 3 5. 
* Notable changes in Python 3.5.4: Notable changes in Python 3 5 4. 

@end menu

@node Summary – Release highlights<8>,New Features<14>,,What’s New In Python 3 5
@anchor{whatsnew/3 5 summary-release-highlights}@anchor{f64}
@subsection Summary – Release highlights


New syntax features:


@itemize *

@item 
@ref{f65,,PEP 492}, coroutines with async and await syntax.

@item 
@ref{f66,,PEP 465}, a new matrix multiplication operator: @code{a @@ b}.

@item 
@ref{f67,,PEP 448}, additional unpacking generalizations.
@end itemize

New library modules:


@itemize *

@item 
@ref{10b,,typing}: @ref{f68,,PEP 484 – Type Hints}.

@item 
@ref{137,,zipapp}: @ref{f69,,PEP 441 Improving Python ZIP Application Support}.
@end itemize

New built-in features:


@itemize *

@item 
@code{bytes % args}, @code{bytearray % args}: @ref{f6a,,PEP 461} –
Adding @code{%} formatting to bytes and bytearray.

@item 
New @ref{f6b,,bytes.hex()}, @ref{f6c,,bytearray.hex()} and @ref{f6d,,memoryview.hex()}
methods. (Contributed by Arnon Yaari in bpo-9951@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9951}.)

@item 
@ref{166,,memoryview} now supports tuple indexing (including multi-dimensional).
(Contributed by Antoine Pitrou in bpo-23632@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23632}.)

@item 
Generators have a new @code{gi_yieldfrom} attribute, which returns the
object being iterated by @code{yield from} expressions. (Contributed
by Benno Leslie and Yury Selivanov in bpo-24450@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24450}.)

@item 
A new @ref{f6e,,RecursionError} exception is now raised when maximum
recursion depth is reached.  (Contributed by Georg Brandl
in bpo-19235@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19235}.)
@end itemize

CPython implementation improvements:


@itemize *

@item 
When the @code{LC_TYPE} locale is the POSIX locale (@code{C} locale),
@ref{760,,sys.stdin} and @ref{cd3,,sys.stdout} now use the
@code{surrogateescape} error handler, instead of the @code{strict} error handler.
(Contributed by Victor Stinner in bpo-19977@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19977}.)

@item 
@code{.pyo} files are no longer used and have been replaced by a more flexible
scheme that includes the optimization level explicitly in @code{.pyc} name.
(See @ref{f6f,,PEP 488 overview}.)

@item 
Builtin and extension modules are now initialized in a multi-phase process,
which is similar to how Python modules are loaded.
(See @ref{f70,,PEP 489 overview}.)
@end itemize

Significant improvements in the standard library:


@itemize *

@item 
@ref{7f4,,collections.OrderedDict} is now
@ref{f71,,implemented in C}, which makes it
4 to 100 times faster.

@item 
The @ref{d5,,ssl} module gained
@ref{f72,,support for Memory BIO}, which decouples SSL
protocol handling from network IO.

@item 
The new @ref{c5a,,os.scandir()} function provides a
@ref{f73,,better and significantly faster way}
of directory traversal.

@item 
@ref{be8,,functools.lru_cache()} has been mostly
@ref{f74,,reimplemented in C}, yielding much better
performance.

@item 
The new @ref{d85,,subprocess.run()} function provides a
@ref{f75,,streamlined way to run subprocesses}.

@item 
The @ref{105,,traceback} module has been significantly
@ref{f76,,enhanced} for improved
performance and developer convenience.
@end itemize

Security improvements:


@itemize *

@item 
SSLv3 is now disabled throughout the standard library.
It can still be enabled by instantiating a @ref{355,,ssl.SSLContext}
manually.  (See bpo-22638@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22638} for more details; this change was
backported to CPython 3.4 and 2.7.)

@item 
HTTP cookie parsing is now stricter, in order to protect
against potential injection attacks. (Contributed by Antoine Pitrou
in bpo-22796@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22796}.)
@end itemize

Windows improvements:


@itemize *

@item 
A new installer for Windows has replaced the old MSI.
See @ref{ca4,,Using Python on Windows} for more information.

@item 
Windows builds now use Microsoft Visual C++ 14.0, and extension modules
should use the same.
@end itemize

Please read on for a comprehensive list of user-facing changes, including many
other smaller improvements, CPython optimizations, deprecations, and potential
porting issues.

@node New Features<14>,Other Language Changes<9>,Summary – Release highlights<8>,What’s New In Python 3 5
@anchor{whatsnew/3 5 new-features}@anchor{f77}
@subsection New Features


@menu
* PEP 492 - Coroutines with async and await syntax:: 
* PEP 465 - A dedicated infix operator for matrix multiplication:: 
* PEP 448 - Additional Unpacking Generalizations:: 
* PEP 461 - percent formatting support for bytes and bytearray:: 
* PEP 484 - Type Hints:: 
* PEP 471 - os.scandir() function – a better and faster directory iterator: PEP 471 - os scandir function – a better and faster directory iterator. 
* PEP 475; Retry system calls failing with EINTR: PEP 475 Retry system calls failing with EINTR. 
* PEP 479; Change StopIteration handling inside generators: PEP 479 Change StopIteration handling inside generators. 
* PEP 485; A function for testing approximate equality: PEP 485 A function for testing approximate equality. 
* PEP 486; Make the Python Launcher aware of virtual environments: PEP 486 Make the Python Launcher aware of virtual environments. 
* PEP 488; Elimination of PYO files: PEP 488 Elimination of PYO files. 
* PEP 489; Multi-phase extension module initialization: PEP 489 Multi-phase extension module initialization. 

@end menu

@node PEP 492 - Coroutines with async and await syntax,PEP 465 - A dedicated infix operator for matrix multiplication,,New Features<14>
@anchor{whatsnew/3 5 pep-492-coroutines-with-async-and-await-syntax}@anchor{f78}@anchor{whatsnew/3 5 whatsnew-pep-492}@anchor{f65}
@subsubsection PEP 492 - Coroutines with async and await syntax


@geindex Python Enhancement Proposals; PEP 492
PEP 492@footnote{https://peps.python.org/pep-0492/} greatly improves support for asynchronous programming in Python
by adding @ref{4ca,,awaitable objects},
@ref{f79,,coroutine functions},
@ref{f7a,,asynchronous iteration},
and @ref{7f1,,asynchronous context managers}.

Coroutine functions are declared using the new @ref{7ee,,async def} syntax:

@example
>>> async def coro():
...     return 'spam'
@end example

Inside a coroutine function, the new @ref{18e,,await} expression can be used
to suspend coroutine execution until the result is available.  Any object
can be `awaited', as long as it implements the @ref{4ca,,awaitable} protocol by
defining the @ref{f7b,,__await__()} method.

PEP 492 also adds @ref{ca7,,async for} statement for convenient iteration
over asynchronous iterables.

An example of a rudimentary HTTP client written using the new syntax:

@example
import asyncio

async def http_get(domain):
    reader, writer = await asyncio.open_connection(domain, 80)

    writer.write(b'\r\n'.join([
        b'GET / HTTP/1.1',
        b'Host: %b' % domain.encode('latin-1'),
        b'Connection: close',
        b'@w{'}, b'@w{'}
    ]))

    async for line in reader:
        print('>>>', line)

    writer.close()

loop = asyncio.get_event_loop()
try:
    loop.run_until_complete(http_get('example.com'))
finally:
    loop.close()
@end example

Similarly to asynchronous iteration, there is a new syntax for asynchronous
context managers.  The following script:

@example
import asyncio

async def coro(name, lock):
    print('coro @{@}: waiting for lock'.format(name))
    async with lock:
        print('coro @{@}: holding the lock'.format(name))
        await asyncio.sleep(1)
        print('coro @{@}: releasing the lock'.format(name))

loop = asyncio.get_event_loop()
lock = asyncio.Lock()
coros = asyncio.gather(coro(1, lock), coro(2, lock))
try:
    loop.run_until_complete(coros)
finally:
    loop.close()
@end example

will output:

@example
coro 2: waiting for lock
coro 2: holding the lock
coro 1: waiting for lock
coro 2: releasing the lock
coro 1: holding the lock
coro 1: releasing the lock
@end example

Note that both @ref{ca7,,async for} and @ref{186,,async with} can only
be used inside a coroutine function declared with @ref{7ee,,async def}.

Coroutine functions are intended to be run inside a compatible event loop,
such as the @ref{f7c,,asyncio loop}.

@cartouche
@quotation Note 

Changed in version 3.5.2: Starting with CPython 3.5.2, @code{__aiter__} can directly return
@ref{4c8,,asynchronous iterators}.  Returning
an @ref{4ca,,awaitable} object will result in a
@ref{acc,,PendingDeprecationWarning}.

See more details in the @ref{f7d,,Asynchronous Iterators} documentation
section.

@end quotation
@end cartouche


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 492

@item PEP 492@footnote{https://peps.python.org/pep-0492/} – Coroutines with async and await syntax

PEP written and implemented by Yury Selivanov.
@end table


@node PEP 465 - A dedicated infix operator for matrix multiplication,PEP 448 - Additional Unpacking Generalizations,PEP 492 - Coroutines with async and await syntax,New Features<14>
@anchor{whatsnew/3 5 pep-465-a-dedicated-infix-operator-for-matrix-multiplication}@anchor{f7e}@anchor{whatsnew/3 5 whatsnew-pep-465}@anchor{f66}
@subsubsection PEP 465 - A dedicated infix operator for matrix multiplication


@geindex Python Enhancement Proposals; PEP 465
PEP 465@footnote{https://peps.python.org/pep-0465/} adds the @code{@@} infix operator for matrix multiplication.
Currently, no builtin Python types implement the new operator, however, it
can be implemented by defining @ref{f7f,,__matmul__()},
@ref{f80,,__rmatmul__()}, and @ref{f81,,__imatmul__()} for regular,
reflected, and in-place matrix multiplication.
The semantics of these methods is similar to that of
methods defining other infix arithmetic operators.

Matrix multiplication is a notably common operation in many fields of
mathematics, science, engineering, and the addition of @code{@@} allows writing
cleaner code:

@example
S = (H @@ beta - r).T @@ inv(H @@ V @@ H.T) @@ (H @@ beta - r)
@end example

instead of:

@example
S = dot((dot(H, beta) - r).T,
        dot(inv(dot(dot(H, V), H.T)), dot(H, beta) - r))
@end example

NumPy 1.10 has support for the new operator:

@example
>>> import numpy

>>> x = numpy.ones(3)
>>> x
array([ 1., 1., 1.])

>>> m = numpy.eye(3)
>>> m
array([[ 1., 0., 0.],
       [ 0., 1., 0.],
       [ 0., 0., 1.]])

>>> x @@ m
array([ 1., 1., 1.])
@end example


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 465

@item PEP 465@footnote{https://peps.python.org/pep-0465/} – A dedicated infix operator for matrix multiplication

PEP written by Nathaniel J. Smith; implemented by Benjamin Peterson.
@end table


@node PEP 448 - Additional Unpacking Generalizations,PEP 461 - percent formatting support for bytes and bytearray,PEP 465 - A dedicated infix operator for matrix multiplication,New Features<14>
@anchor{whatsnew/3 5 pep-448-additional-unpacking-generalizations}@anchor{f82}@anchor{whatsnew/3 5 whatsnew-pep-448}@anchor{f67}
@subsubsection PEP 448 - Additional Unpacking Generalizations


@geindex Python Enhancement Proposals; PEP 448
PEP 448@footnote{https://peps.python.org/pep-0448/} extends the allowed uses of the @code{*} iterable unpacking
operator and @code{**} dictionary unpacking operator.  It is now possible
to use an arbitrary number of unpackings in @ref{f83,,function calls}:

@example
>>> print(*[1], *[2], 3, *[4, 5])
1 2 3 4 5

>>> def fn(a, b, c, d):
...     print(a, b, c, d)
...

>>> fn(**@{'a': 1, 'c': 3@}, **@{'b': 2, 'd': 4@})
1 2 3 4
@end example

Similarly, tuple, list, set, and dictionary displays allow multiple
unpackings (see @ref{f84,,Expression lists} and @ref{f85,,Dictionary displays}):

@example
>>> *range(4), 4
(0, 1, 2, 3, 4)

>>> [*range(4), 4]
[0, 1, 2, 3, 4]

>>> @{*range(4), 4, *(5, 6, 7)@}
@{0, 1, 2, 3, 4, 5, 6, 7@}

>>> @{'x': 1, **@{'y': 2@}@}
@{'x': 1, 'y': 2@}
@end example


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 448

@item PEP 448@footnote{https://peps.python.org/pep-0448/} – Additional Unpacking Generalizations

PEP written by Joshua Landau; implemented by Neil Girdhar,
Thomas Wouters, and Joshua Landau.
@end table


@node PEP 461 - percent formatting support for bytes and bytearray,PEP 484 - Type Hints,PEP 448 - Additional Unpacking Generalizations,New Features<14>
@anchor{whatsnew/3 5 pep-461-percent-formatting-support-for-bytes-and-bytearray}@anchor{f86}@anchor{whatsnew/3 5 whatsnew-pep-461}@anchor{f6a}
@subsubsection PEP 461 - percent formatting support for bytes and bytearray


@geindex Python Enhancement Proposals; PEP 461
PEP 461@footnote{https://peps.python.org/pep-0461/} adds support for the @code{%}
@ref{f87,,interpolation operator} to @ref{193,,bytes}
and @ref{342,,bytearray}.

While interpolation is usually thought of as a string operation, there are
cases where interpolation on @code{bytes} or @code{bytearrays} makes sense, and the
work needed to make up for this missing functionality detracts from the
overall readability of the code.  This issue is particularly important when
dealing with wire format protocols, which are often a mixture of binary
and ASCII compatible text.

Examples:

@example
>>> b'Hello %b!' % b'World'
b'Hello World!'

>>> b'x=%i y=%f' % (1, 2.5)
b'x=1 y=2.500000'
@end example

Unicode is not allowed for @code{%b}, but it is accepted by @code{%a} (equivalent of
@code{repr(obj).encode('ascii', 'backslashreplace')}):

@example
>>> b'Hello %b!' % 'World'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: %b requires bytes, or an object that implements __bytes__, not 'str'

>>> b'price: %a' % '10€'
b"price: '10\\u20ac'"
@end example

Note that @code{%s} and @code{%r} conversion types, although supported, should
only be used in codebases that need compatibility with Python 2.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 461

@item PEP 461@footnote{https://peps.python.org/pep-0461/} – Adding % formatting to bytes and bytearray

PEP written by Ethan Furman; implemented by Neil Schemenauer and
Ethan Furman.
@end table


@node PEP 484 - Type Hints,PEP 471 - os scandir function – a better and faster directory iterator,PEP 461 - percent formatting support for bytes and bytearray,New Features<14>
@anchor{whatsnew/3 5 pep-484-type-hints}@anchor{f88}@anchor{whatsnew/3 5 whatsnew-pep-484}@anchor{f68}
@subsubsection PEP 484 - Type Hints


Function annotation syntax has been a Python feature since version 3.0
(
@geindex Python Enhancement Proposals; PEP 3107
PEP 3107@footnote{https://peps.python.org/pep-3107/}), however the semantics of annotations has been left undefined.

Experience has shown that the majority of function annotation
uses were to provide type hints to function parameters and return values.  It
became evident that it would be beneficial for Python users, if the
standard library included the base definitions and tools for type annotations.

@geindex Python Enhancement Proposals; PEP 484
PEP 484@footnote{https://peps.python.org/pep-0484/} introduces a @ref{3cf,,provisional module} to
provide these standard definitions and tools, along with some conventions
for situations where annotations are not available.

For example, here is a simple function whose argument and return type
are declared in the annotations:

@example
def greeting(name: str) -> str:
    return 'Hello ' + name
@end example

While these annotations are available at runtime through the usual
@ref{456,,__annotations__} attribute, `no automatic type checking happens
at runtime'.  Instead, it is assumed that a separate off-line type checker
(e.g. mypy@footnote{https://mypy-lang.org}) will be used for on-demand
source code analysis.

The type system supports unions, generic types, and a special type
named @ref{8bd,,Any} which is consistent with (i.e. assignable to
and from) all types.


@subsubheading See also



@itemize *

@item 
@ref{10b,,typing} module documentation

@item 

@table @asis

@geindex Python Enhancement Proposals; PEP 484

@item PEP 484@footnote{https://peps.python.org/pep-0484/} – Type Hints

PEP written by Guido van Rossum, Jukka Lehtosalo, and Łukasz Langa;
implemented by Guido van Rossum.
@end table

@item 

@table @asis

@geindex Python Enhancement Proposals; PEP 483

@item PEP 483@footnote{https://peps.python.org/pep-0483/} – The Theory of Type Hints

PEP written by Guido van Rossum
@end table
@end itemize


@node PEP 471 - os scandir function – a better and faster directory iterator,PEP 475 Retry system calls failing with EINTR,PEP 484 - Type Hints,New Features<14>
@anchor{whatsnew/3 5 pep-471-os-scandir-function-a-better-and-faster-directory-iterator}@anchor{f89}@anchor{whatsnew/3 5 whatsnew-pep-471}@anchor{f73}
@subsubsection PEP 471 - os.scandir() function – a better and faster directory iterator


@geindex Python Enhancement Proposals; PEP 471
PEP 471@footnote{https://peps.python.org/pep-0471/} adds a new directory iteration function, @ref{c5a,,os.scandir()},
to the standard library.  Additionally, @ref{6d1,,os.walk()} is now
implemented using @code{scandir}, which makes it 3 to 5 times faster
on POSIX systems and 7 to 20 times faster on Windows systems.  This is
largely achieved by greatly reducing the number of calls to @ref{26f,,os.stat()}
required to walk a directory tree.

Additionally, @code{scandir} returns an iterator, as opposed to returning
a list of file names, which improves memory efficiency when iterating
over very large directories.

The following example shows a simple use of @ref{c5a,,os.scandir()} to display all
the files (excluding directories) in the given `path' that don’t start with
@code{'.'}. The @ref{f8a,,entry.is_file()} call will generally
not make an additional system call:

@example
for entry in os.scandir(path):
    if not entry.name.startswith('.') and entry.is_file():
        print(entry.name)
@end example


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 471

@item PEP 471@footnote{https://peps.python.org/pep-0471/} – os.scandir() function – a better and faster directory iterator

PEP written and implemented by Ben Hoyt with the help of Victor Stinner.
@end table


@node PEP 475 Retry system calls failing with EINTR,PEP 479 Change StopIteration handling inside generators,PEP 471 - os scandir function – a better and faster directory iterator,New Features<14>
@anchor{whatsnew/3 5 pep-475-retry-system-calls-failing-with-eintr}@anchor{f8b}@anchor{whatsnew/3 5 whatsnew-pep-475}@anchor{f8c}
@subsubsection PEP 475: Retry system calls failing with EINTR


An @ref{f8d,,errno.EINTR} error code is returned whenever a system call, that
is waiting for I/O, is interrupted by a signal.  Previously, Python would
raise @ref{f8e,,InterruptedError} in such cases.  This meant that, when writing a
Python application, the developer had two choices:


@enumerate 

@item 
Ignore the @code{InterruptedError}.

@item 
Handle the @code{InterruptedError} and attempt to restart the interrupted
system call at every call site.
@end enumerate

The first option makes an application fail intermittently.
The second option adds a large amount of boilerplate that makes the
code nearly unreadable.  Compare:

@example
print("Hello World")
@end example

and:

@example
while True:
    try:
        print("Hello World")
        break
    except InterruptedError:
        continue
@end example

@geindex Python Enhancement Proposals; PEP 475
PEP 475@footnote{https://peps.python.org/pep-0475/} implements automatic retry of system calls on
@code{EINTR}.  This removes the burden of dealing with @code{EINTR}
or @ref{f8e,,InterruptedError} in user code in most situations and makes
Python programs, including the standard library, more robust.  Note that
the system call is only retried if the signal handler does not raise an
exception.

Below is a list of functions which are now retried when interrupted
by a signal:


@itemize *

@item 
@ref{318,,open()} and @ref{741,,io.open()};

@item 
functions of the @ref{5c,,faulthandler} module;

@item 
@ref{a5,,os} functions: @ref{f8f,,fchdir()}, @ref{52b,,fchmod()},
@ref{f90,,fchown()}, @ref{f91,,fdatasync()}, @ref{f92,,fstat()},
@ref{f93,,fstatvfs()}, @ref{f94,,fsync()}, @ref{f95,,ftruncate()},
@ref{f96,,mkfifo()}, @ref{f97,,mknod()}, @ref{f98,,open()},
@ref{f99,,posix_fadvise()}, @ref{f9a,,posix_fallocate()}, @ref{d5c,,pread()},
@ref{d5f,,pwrite()}, @ref{f9b,,read()}, @ref{d5b,,readv()}, @ref{d0b,,sendfile()},
@ref{f9c,,wait3()}, @ref{f9d,,wait4()}, @ref{f9e,,wait()},
@ref{f9f,,waitid()}, @ref{fa0,,waitpid()}, @ref{fa1,,write()},
@ref{d5e,,writev()};

@item 
special cases: @ref{d71,,os.close()} and @ref{d60,,os.dup2()} now ignore
@ref{f8d,,EINTR} errors; the syscall is not retried (see the PEP
for the rationale);

@item 
@ref{c6,,select} functions: @ref{fa2,,devpoll.poll()},
@ref{fa3,,epoll.poll()},
@ref{fa4,,kqueue.control()},
@ref{fa5,,poll.poll()}, @ref{fa6,,select()};

@item 
methods of the @ref{fa7,,socket} class: @ref{fa8,,accept()},
@ref{fa9,,connect()} (except for non-blocking sockets),
@ref{faa,,recv()}, @ref{fab,,recvfrom()},
@ref{fac,,recvmsg()}, @ref{fad,,send()},
@ref{fae,,sendall()}, @ref{6a2,,sendmsg()},
@ref{faf,,sendto()};

@item 
@ref{fb0,,signal.sigtimedwait()} and @ref{fb1,,signal.sigwaitinfo()};

@item 
@ref{8ae,,time.sleep()}.
@end itemize


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 475

@item PEP 475@footnote{https://peps.python.org/pep-0475/} – Retry system calls failing with EINTR

PEP and implementation written by Charles-François Natali and
Victor Stinner, with the help of Antoine Pitrou (the French connection).
@end table


@node PEP 479 Change StopIteration handling inside generators,PEP 485 A function for testing approximate equality,PEP 475 Retry system calls failing with EINTR,New Features<14>
@anchor{whatsnew/3 5 pep-479-change-stopiteration-handling-inside-generators}@anchor{fb2}@anchor{whatsnew/3 5 whatsnew-pep-479}@anchor{f21}
@subsubsection PEP 479: Change StopIteration handling inside generators


The interaction of generators and @ref{dfb,,StopIteration} in Python 3.4 and
earlier was sometimes surprising, and could conceal obscure bugs.  Previously,
@code{StopIteration} raised accidentally inside a generator function was
interpreted as the end of the iteration by the loop construct driving the
generator.

@geindex Python Enhancement Proposals; PEP 479
PEP 479@footnote{https://peps.python.org/pep-0479/} changes the behavior of generators: when a @code{StopIteration}
exception is raised inside a generator, it is replaced with a
@ref{246,,RuntimeError} before it exits the generator frame.  The main goal of
this change is to ease debugging in the situation where an unguarded
@ref{9de,,next()} call raises @code{StopIteration} and causes the iteration controlled
by the generator to terminate silently. This is particularly pernicious in
combination with the @code{yield from} construct.

This is a backwards incompatible change, so to enable the new behavior,
a @ref{fb3,,__future__} import is necessary:

@example
>>> from __future__ import generator_stop

>>> def gen():
...     next(iter([]))
...     yield
...
>>> next(gen())
Traceback (most recent call last):
  File "<stdin>", line 2, in gen
StopIteration

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
RuntimeError: generator raised StopIteration
@end example

Without a @code{__future__} import, a @ref{acc,,PendingDeprecationWarning} will be
raised whenever a @ref{dfb,,StopIteration} exception is raised inside a generator.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 479

@item PEP 479@footnote{https://peps.python.org/pep-0479/} – Change StopIteration handling inside generators

PEP written by Chris Angelico and Guido van Rossum. Implemented by
Chris Angelico, Yury Selivanov and Nick Coghlan.
@end table


@node PEP 485 A function for testing approximate equality,PEP 486 Make the Python Launcher aware of virtual environments,PEP 479 Change StopIteration handling inside generators,New Features<14>
@anchor{whatsnew/3 5 pep-485-a-function-for-testing-approximate-equality}@anchor{fb4}@anchor{whatsnew/3 5 whatsnew-pep-485}@anchor{fb5}
@subsubsection PEP 485: A function for testing approximate equality


@geindex Python Enhancement Proposals; PEP 485
PEP 485@footnote{https://peps.python.org/pep-0485/} adds the @ref{fb6,,math.isclose()} and @ref{fb7,,cmath.isclose()}
functions which tell whether two values are approximately equal or
“close” to each other.  Whether or not two values are considered
close is determined according to given absolute and relative tolerances.
Relative tolerance is the maximum allowed difference between @code{isclose}
arguments, relative to the larger absolute value:

@example
>>> import math
>>> a = 5.0
>>> b = 4.99998
>>> math.isclose(a, b, rel_tol=1e-5)
True
>>> math.isclose(a, b, rel_tol=1e-6)
False
@end example

It is also possible to compare two values using absolute tolerance, which
must be a non-negative value:

@example
>>> import math
>>> a = 5.0
>>> b = 4.99998
>>> math.isclose(a, b, abs_tol=0.00003)
True
>>> math.isclose(a, b, abs_tol=0.00001)
False
@end example


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 485

@item PEP 485@footnote{https://peps.python.org/pep-0485/} – A function for testing approximate equality

PEP written by Christopher Barker; implemented by Chris Barker and
Tal Einat.
@end table


@node PEP 486 Make the Python Launcher aware of virtual environments,PEP 488 Elimination of PYO files,PEP 485 A function for testing approximate equality,New Features<14>
@anchor{whatsnew/3 5 pep-486-make-the-python-launcher-aware-of-virtual-environments}@anchor{fb8}@anchor{whatsnew/3 5 whatsnew-pep-486}@anchor{fb9}
@subsubsection PEP 486: Make the Python Launcher aware of virtual environments


@geindex Python Enhancement Proposals; PEP 486
PEP 486@footnote{https://peps.python.org/pep-0486/} makes the Windows launcher (see 
@geindex Python Enhancement Proposals; PEP 397
PEP 397@footnote{https://peps.python.org/pep-0397/}) aware of an active
virtual environment. When the default interpreter would be used and the
@code{VIRTUAL_ENV} environment variable is set, the interpreter in the virtual
environment will be used.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 486

@item PEP 486@footnote{https://peps.python.org/pep-0486/} – Make the Python Launcher aware of virtual environments

PEP written and implemented by Paul Moore.
@end table


@node PEP 488 Elimination of PYO files,PEP 489 Multi-phase extension module initialization,PEP 486 Make the Python Launcher aware of virtual environments,New Features<14>
@anchor{whatsnew/3 5 pep-488-elimination-of-pyo-files}@anchor{fba}@anchor{whatsnew/3 5 whatsnew-pep-488}@anchor{f6f}
@subsubsection PEP 488: Elimination of PYO files


@geindex Python Enhancement Proposals; PEP 488
PEP 488@footnote{https://peps.python.org/pep-0488/} does away with the concept of @code{.pyo} files. This means that
@code{.pyc} files represent both unoptimized and optimized bytecode. To prevent the
need to constantly regenerate bytecode files, @code{.pyc} files now have an
optional @code{opt-} tag in their name when the bytecode is optimized. This has the
side-effect of no more bytecode file name clashes when running under either
@ref{18d,,-O} or @ref{fbb,,-OO}. Consequently, bytecode files generated from
@code{-O}, and @code{-OO} may now exist simultaneously.
@ref{351,,importlib.util.cache_from_source()} has an updated API to help with
this change.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 488

@item PEP 488@footnote{https://peps.python.org/pep-0488/} – Elimination of PYO files

PEP written and implemented by Brett Cannon.
@end table


@node PEP 489 Multi-phase extension module initialization,,PEP 488 Elimination of PYO files,New Features<14>
@anchor{whatsnew/3 5 pep-489-multi-phase-extension-module-initialization}@anchor{fbc}@anchor{whatsnew/3 5 whatsnew-pep-489}@anchor{f70}
@subsubsection PEP 489: Multi-phase extension module initialization


@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/} updates extension module initialization to take advantage of the
two step module loading mechanism introduced by 
@geindex Python Enhancement Proposals; PEP 451
PEP 451@footnote{https://peps.python.org/pep-0451/} in Python 3.4.

This change brings the import semantics of extension modules that opt-in to
using the new mechanism much closer to those of Python source and bytecode
modules, including the ability to use any valid identifier as a module name,
rather than being restricted to ASCII.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 489

@item PEP 489@footnote{https://peps.python.org/pep-0489/} – Multi-phase extension module initialization

PEP written by Petr Viktorin, Stefan Behnel, and Nick Coghlan;
implemented by Petr Viktorin.
@end table


@node Other Language Changes<9>,New Modules<9>,New Features<14>,What’s New In Python 3 5
@anchor{whatsnew/3 5 other-language-changes}@anchor{fbd}
@subsection Other Language Changes


Some smaller changes made to the core Python language are:


@itemize *

@item 
Added the @code{"namereplace"} error handlers.  The @code{"backslashreplace"}
error handlers now work with decoding and translating.
(Contributed by Serhiy Storchaka in bpo-19676@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19676} and bpo-22286@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22286}.)

@item 
The @ref{7fa,,-b} option now affects comparisons of @ref{193,,bytes} with
@ref{19c,,int}.  (Contributed by Serhiy Storchaka in bpo-23681@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23681}.)

@item 
New Kazakh @code{kz1048} and Tajik @code{koi8_t} @ref{fbe,,codecs}.
(Contributed by Serhiy Storchaka in bpo-22682@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22682} and bpo-22681@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22681}.)

@item 
Property docstrings are now writable. This is especially useful for
@ref{4e1,,collections.namedtuple()} docstrings.
(Contributed by Berker Peksag in bpo-24064@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24064}.)

@item 
Circular imports involving relative imports are now supported.
(Contributed by Brett Cannon and Antoine Pitrou in bpo-17636@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17636}.)
@end itemize

@node New Modules<9>,Improved Modules<9>,Other Language Changes<9>,What’s New In Python 3 5
@anchor{whatsnew/3 5 new-modules}@anchor{fbf}
@subsection New Modules


@menu
* typing: typing<11>. 
* zipapp: zipapp<2>. 

@end menu

@node typing<11>,zipapp<2>,,New Modules<9>
@anchor{whatsnew/3 5 typing}@anchor{fc0}
@subsubsection typing


The new @ref{10b,,typing} @ref{3cf,,provisional} module
provides standard definitions and tools for function type annotations.
See @ref{f68,,Type Hints} for more information.

@node zipapp<2>,,typing<11>,New Modules<9>
@anchor{whatsnew/3 5 whatsnew-zipapp}@anchor{f69}@anchor{whatsnew/3 5 zipapp}@anchor{fc1}
@subsubsection zipapp


The new @ref{137,,zipapp} module (specified in 
@geindex Python Enhancement Proposals; PEP 441
PEP 441@footnote{https://peps.python.org/pep-0441/}) provides an API and
command line tool for creating executable Python Zip Applications, which
were introduced in Python 2.6 in bpo-1739468@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1739468}, but which were not well
publicized, either at the time or since.

With the new module, bundling your application is as simple as putting all
the files, including a @code{__main__.py} file, into a directory @code{myapp}
and running:

@example
$ python -m zipapp myapp
$ python myapp.pyz
@end example

The module implementation has been contributed by Paul Moore in
bpo-23491@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23491}.


@subsubheading See also


@geindex Python Enhancement Proposals; PEP 441
PEP 441@footnote{https://peps.python.org/pep-0441/} – Improving Python ZIP Application Support


@node Improved Modules<9>,Other module-level changes,New Modules<9>,What’s New In Python 3 5
@anchor{whatsnew/3 5 improved-modules}@anchor{fc2}
@subsection Improved Modules


@menu
* argparse: argparse<6>. 
* asyncio: asyncio<13>. 
* bz2:: 
* cgi:: 
* cmath: cmath<2>. 
* code:: 
* collections: collections<5>. 
* collections.abc: collections abc<3>. 
* compileall: compileall<4>. 
* concurrent.futures: concurrent futures<6>. 
* configparser: configparser<5>. 
* contextlib: contextlib<5>. 
* csv: csv<3>. 
* curses: curses<5>. 
* dbm: dbm<5>. 
* difflib: difflib<3>. 
* distutils: distutils<7>. 
* doctest: doctest<3>. 
* email: email<4>. 
* enum: enum<8>. 
* faulthandler: faulthandler<4>. 
* functools: functools<5>. 
* glob: glob<3>. 
* gzip: gzip<4>. 
* heapq: heapq<2>. 
* http: http<3>. 
* http.client: http client<3>. 
* idlelib and IDLE: idlelib and IDLE<3>. 
* imaplib: imaplib<3>. 
* imghdr:: 
* importlib: importlib<8>. 
* inspect: inspect<8>. 
* io: io<7>. 
* ipaddress: ipaddress<4>. 
* json: json<3>. 
* linecache: linecache<3>. 
* locale: locale<6>. 
* logging: logging<5>. 
* lzma:: 
* math: math<9>. 
* multiprocessing: multiprocessing<7>. 
* operator: operator<3>. 
* os: os<11>. 
* pathlib: pathlib<13>. 
* pickle: pickle<4>. 
* poplib: poplib<2>. 
* re: re<8>. 
* readline: readline<2>. 
* selectors:: 
* shutil: shutil<5>. 
* signal: signal<3>. 
* smtpd: smtpd<2>. 
* smtplib: smtplib<2>. 
* sndhdr:: 
* socket: socket<9>. 
* ssl: ssl<10>. 
* sqlite3: sqlite3<9>. 
* subprocess: subprocess<4>. 
* sys: sys<11>. 
* sysconfig: sysconfig<3>. 
* tarfile: tarfile<7>. 
* threading: threading<7>. 
* time: time<7>. 
* timeit: timeit<2>. 
* tkinter: tkinter<9>. 
* traceback: traceback<5>. 
* types: types<6>. 
* unicodedata: unicodedata<9>. 
* unittest: unittest<9>. 
* unittest.mock: unittest mock<3>. 
* urllib: urllib<4>. 
* wsgiref:: 
* xmlrpc: xmlrpc<2>. 
* xml.sax: xml sax. 
* zipfile: zipfile<5>. 

@end menu

@node argparse<6>,asyncio<13>,,Improved Modules<9>
@anchor{whatsnew/3 5 argparse}@anchor{fc3}
@subsubsection argparse


The @ref{1bf,,ArgumentParser} class now allows disabling
@ref{fc4,,abbreviated usage} of long options by setting
@ref{fc5,,allow_abbrev} to @code{False}.  (Contributed by Jonathan Paugh,
Steven Bethard, paul j3 and Daniel Eriksson in bpo-14910@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14910}.)

@node asyncio<13>,bz2,argparse<6>,Improved Modules<9>
@anchor{whatsnew/3 5 asyncio}@anchor{fc6}
@subsubsection asyncio


Since the @ref{b,,asyncio} module is @ref{3cf,,provisional},
all changes introduced in Python 3.5 have also been backported to Python 3.4.x.

Notable changes in the @ref{b,,asyncio} module since Python 3.4.0:


@itemize *

@item 
New debugging APIs: @ref{fc7,,loop.set_debug()}
and @ref{fc8,,loop.get_debug()} methods.
(Contributed by Victor Stinner.)

@item 
The proactor event loop now supports SSL.
(Contributed by Antoine Pitrou and Victor Stinner in bpo-22560@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22560}.)

@item 
A new @ref{fc9,,loop.is_closed()} method to
check if the event loop is closed.
(Contributed by Victor Stinner in bpo-21326@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21326}.)

@item 
A new @ref{1cc,,loop.create_task()}
to conveniently create and schedule a new @ref{1c9,,Task}
for a coroutine.  The @code{create_task} method is also used by all
asyncio functions that wrap coroutines into tasks, such as
@ref{6a8,,asyncio.wait()}, @ref{814,,asyncio.gather()}, etc.
(Contributed by Victor Stinner.)

@item 
A new @ref{fca,,transport.get_write_buffer_limits()}
method to inquire for `high-' and `low-' water limits of the flow
control.
(Contributed by Victor Stinner.)

@item 
The @code{async()} function is deprecated in favor of
@ref{e77,,ensure_future()}.
(Contributed by Yury Selivanov.)

@item 
New @ref{1ca,,loop.set_task_factory()} and
@ref{fcb,,loop.get_task_factory()}
methods to customize the task factory that @ref{1cc,,loop.create_task()} method uses.  (Contributed by Yury
Selivanov.)

@item 
New @ref{fcc,,Queue.join()} and
@ref{fcd,,Queue.task_done()} queue methods.
(Contributed by Victor Stinner.)

@item 
The @code{JoinableQueue} class was removed, in favor of the
@ref{c70,,asyncio.Queue} class.
(Contributed by Victor Stinner.)
@end itemize

Updates in 3.5.1:


@itemize *

@item 
The @ref{e77,,ensure_future()} function and all functions that
use it, such as @ref{e78,,loop.run_until_complete()},
now accept all kinds of @ref{4ca,,awaitable objects}.
(Contributed by Yury Selivanov.)

@item 
New @ref{a88,,run_coroutine_threadsafe()} function to submit
coroutines to event loops from other threads.
(Contributed by Vincent Michel.)

@item 
New @ref{e79,,Transport.is_closing()}
method to check if the transport is closing or closed.
(Contributed by Yury Selivanov.)

@item 
The @ref{d0f,,loop.create_server()}
method can now accept a list of hosts.
(Contributed by Yann Sionneau.)
@end itemize

Updates in 3.5.2:


@itemize *

@item 
New @ref{e7a,,loop.create_future()}
method to create Future objects.  This allows alternative event
loop implementations, such as
uvloop@footnote{https://github.com/MagicStack/uvloop}, to provide a faster
@ref{dcc,,asyncio.Future} implementation.
(Contributed by Yury Selivanov.)

@item 
New @ref{e7b,,loop.get_exception_handler()}
method to get the current exception handler.
(Contributed by Yury Selivanov.)

@item 
New @ref{4d1,,StreamReader.readuntil()}
method to read data from the stream until a separator bytes
sequence appears.
(Contributed by Mark Korenberg.)

@item 
The @ref{819,,loop.create_connection()}
and @ref{d0f,,loop.create_server()}
methods are optimized to avoid calling the system @code{getaddrinfo}
function if the address is already resolved.
(Contributed by A. Jesse Jiryu Davis.)

@item 
The @ref{fce,,loop.sock_connect(sock@comma{} address)}
no longer requires the `address' to be resolved prior to the call.
(Contributed by A. Jesse Jiryu Davis.)
@end itemize

@node bz2,cgi,asyncio<13>,Improved Modules<9>
@anchor{whatsnew/3 5 bz2}@anchor{fcf}
@subsubsection bz2


The @ref{fd0,,BZ2Decompressor.decompress}
method now accepts an optional `max_length' argument to limit the maximum
size of decompressed data. (Contributed by Nikolaus Rath in bpo-15955@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15955}.)

@node cgi,cmath<2>,bz2,Improved Modules<9>
@anchor{whatsnew/3 5 cgi}@anchor{fd1}
@subsubsection cgi


The @code{FieldStorage} class now supports the @ref{1e3,,context manager}
protocol.  (Contributed by Berker Peksag in bpo-20289@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20289}.)

@node cmath<2>,code,cgi,Improved Modules<9>
@anchor{whatsnew/3 5 cmath}@anchor{fd2}
@subsubsection cmath


A new function @ref{fb7,,isclose()} provides a way to test for approximate
equality.  (Contributed by Chris Barker and Tal Einat in bpo-24270@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24270}.)

@node code,collections<5>,cmath<2>,Improved Modules<9>
@anchor{whatsnew/3 5 code}@anchor{fd3}
@subsubsection code


The @ref{fd4,,InteractiveInterpreter.showtraceback()}
method now prints the full chained traceback, just like the interactive
interpreter.  (Contributed by Claudiu Popa in bpo-17442@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17442}.)

@node collections<5>,collections abc<3>,code,Improved Modules<9>
@anchor{whatsnew/3 5 collections}@anchor{fd5}
@subsubsection collections

@anchor{whatsnew/3 5 whatsnew-ordereddict}@anchor{f71}
The @ref{7f4,,OrderedDict} class is now implemented in C, which
makes it 4 to 100 times faster.  (Contributed by Eric Snow in bpo-16991@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16991}.)

@code{OrderedDict.items()}, @code{OrderedDict.keys()},
and @code{OrderedDict.values()} views now support @ref{a6b,,reversed()} iteration.
(Contributed by Serhiy Storchaka in bpo-19505@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19505}.)

The @ref{7f5,,deque} class now defines
@ref{fd6,,index()}, @ref{fd7,,insert()}, and
@ref{fd8,,copy()}, and supports the @code{+} and @code{*} operators.
This allows deques to be recognized as a @ref{4c0,,MutableSequence}
and improves their substitutability for lists.
(Contributed by Raymond Hettinger in bpo-23704@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23704}.)

Docstrings produced by @ref{4e1,,namedtuple()} can now be updated:

@example
Point = namedtuple('Point', ['x', 'y'])
Point.__doc__ += ': Cartesian coordinate'
Point.x.__doc__ = 'abscissa'
Point.y.__doc__ = 'ordinate'
@end example

(Contributed by Berker Peksag in bpo-24064@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24064}.)

The @ref{fd9,,UserString} class now implements the
@ref{fda,,__getnewargs__()}, @ref{fdb,,__rmod__()}, @ref{fdc,,casefold()},
@ref{fdd,,format_map()}, @ref{fde,,isprintable()}, and @ref{fdf,,maketrans()}
methods to match the corresponding methods of @ref{16a,,str}.
(Contributed by Joe Jevnik in bpo-22189@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22189}.)

@node collections abc<3>,compileall<4>,collections<5>,Improved Modules<9>
@anchor{whatsnew/3 5 collections-abc}@anchor{fe0}
@subsubsection collections.abc


The @code{Sequence.index()} method now
accepts `start' and `stop' arguments to match the corresponding methods
of @ref{614,,tuple}, @ref{24f,,list}, etc.
(Contributed by Devin Jeanpierre in bpo-23086@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23086}.)

A new @ref{fe1,,Generator} abstract base class. (Contributed
by Stefan Behnel in bpo-24018@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24018}.)

New @ref{fe2,,Awaitable}, @ref{fe3,,Coroutine},
@ref{fe4,,AsyncIterator}, and
@ref{fe5,,AsyncIterable} abstract base classes.
(Contributed by Yury Selivanov in bpo-24184@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24184}.)

For earlier Python versions, a backport of the new ABCs is available in an
external PyPI package@footnote{https://pypi.org/project/backports_abc/}.

@node compileall<4>,concurrent futures<6>,collections abc<3>,Improved Modules<9>
@anchor{whatsnew/3 5 compileall}@anchor{fe6}
@subsubsection compileall


A new @ref{21,,compileall} option, @code{-j @var{N}}, allows running `N' workers
simultaneously to perform parallel bytecode compilation.
The @ref{d21,,compile_dir()} function has a corresponding @code{workers}
parameter.  (Contributed by Claudiu Popa in bpo-16104@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16104}.)

Another new option, @code{-r}, allows controlling the maximum recursion
level for subdirectories.  (Contributed by Claudiu Popa in bpo-19628@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19628}.)

The @code{-q} command line option can now be specified more than once, in
which case all output, including errors, will be suppressed.  The corresponding
@code{quiet} parameter in @ref{d21,,compile_dir()},
@ref{fe7,,compile_file()}, and @ref{fe8,,compile_path()} can now
accept an integer value indicating the level of output suppression.
(Contributed by Thomas Kluyver in bpo-21338@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21338}.)

@node concurrent futures<6>,configparser<5>,compileall<4>,Improved Modules<9>
@anchor{whatsnew/3 5 concurrent-futures}@anchor{fe9}
@subsubsection concurrent.futures


The @ref{1de,,Executor.map()} method now accepts a
`chunksize' argument to allow batching of tasks to improve performance when
@ref{1d8,,ProcessPoolExecutor()} is used.
(Contributed by Dan O’Reilly in bpo-11271@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11271}.)

The number of workers in the @ref{94e,,ThreadPoolExecutor}
constructor is optional now.  The default value is 5 times the number of CPUs.
(Contributed by Claudiu Popa in bpo-21527@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21527}.)

@node configparser<5>,contextlib<5>,concurrent futures<6>,Improved Modules<9>
@anchor{whatsnew/3 5 configparser}@anchor{fea}
@subsubsection configparser


@ref{26,,configparser} now provides a way to customize the conversion
of values by specifying a dictionary of converters in the
@ref{4df,,ConfigParser} constructor, or by defining them
as methods in @code{ConfigParser} subclasses.  Converters defined in
a parser instance are inherited by its section proxies.

Example:

@example
>>> import configparser
>>> conv = @{@}
>>> conv['list'] = lambda v: [e.strip() for e in v.split() if e.strip()]
>>> cfg = configparser.ConfigParser(converters=conv)
>>> cfg.read_string("""
... [s]
... list = a b c d e f g
... """)
>>> cfg.get('s', 'list')
'a b c d e f g'
>>> cfg.getlist('s', 'list')
['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> section = cfg['s']
>>> section.getlist('list')
['a', 'b', 'c', 'd', 'e', 'f', 'g']
@end example

(Contributed by Łukasz Langa in bpo-18159@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18159}.)

@node contextlib<5>,csv<3>,configparser<5>,Improved Modules<9>
@anchor{whatsnew/3 5 contextlib}@anchor{feb}
@subsubsection contextlib


The new @ref{fec,,redirect_stderr()} @ref{1e3,,context manager} (similar to
@ref{fed,,redirect_stdout()}) makes it easier for utility scripts to
handle inflexible APIs that write their output to @ref{b39,,sys.stderr} and
don’t provide any options to redirect it:

@example
>>> import contextlib, io, logging
>>> f = io.StringIO()
>>> with contextlib.redirect_stderr(f):
...     logging.warning('warning')
...
>>> f.getvalue()
'WARNING:root:warning\n'
@end example

(Contributed by Berker Peksag in bpo-22389@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22389}.)

@node csv<3>,curses<5>,contextlib<5>,Improved Modules<9>
@anchor{whatsnew/3 5 csv}@anchor{fee}
@subsubsection csv


The @ref{fef,,writerow()} method now supports arbitrary iterables,
not just sequences.  (Contributed by Serhiy Storchaka in bpo-23171@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23171}.)

@node curses<5>,dbm<5>,csv<3>,Improved Modules<9>
@anchor{whatsnew/3 5 curses}@anchor{ff0}
@subsubsection curses


The new @ref{ff1,,update_lines_cols()} function updates the @ref{ff2,,LINES}
and @ref{ff3,,COLS} module variables.  This is useful for detecting
manual screen resizing.  (Contributed by Arnon Yaari in bpo-4254@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4254}.)

@node dbm<5>,difflib<3>,curses<5>,Improved Modules<9>
@anchor{whatsnew/3 5 dbm}@anchor{ff4}
@subsubsection dbm


@ref{c93,,dumb.open} always creates a new database when the flag
has the value @code{"n"}.  (Contributed by Claudiu Popa in bpo-18039@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18039}.)

@node difflib<3>,distutils<7>,dbm<5>,Improved Modules<9>
@anchor{whatsnew/3 5 difflib}@anchor{ff5}
@subsubsection difflib


The charset of HTML documents generated by
@ref{ff6,,HtmlDiff.make_file()}
can now be customized by using a new `charset' keyword-only argument.
The default charset of HTML document changed from @code{"ISO-8859-1"}
to @code{"utf-8"}.
(Contributed by Berker Peksag in bpo-2052@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2052}.)

The @ref{ff7,,diff_bytes()} function can now compare lists of byte
strings.  This fixes a regression from Python 2.
(Contributed by Terry J. Reedy and Greg Ward in bpo-17445@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17445}.)

@node distutils<7>,doctest<3>,difflib<3>,Improved Modules<9>
@anchor{whatsnew/3 5 distutils}@anchor{ff8}
@subsubsection distutils


Both the @code{build} and @code{build_ext} commands now accept a @code{-j} option to
enable parallel building of extension modules.
(Contributed by Antoine Pitrou in bpo-5309@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5309}.)

The @code{distutils} module now supports @code{xz} compression, and can be
enabled by passing @code{xztar} as an argument to @code{bdist --format}.
(Contributed by Serhiy Storchaka in bpo-16314@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16314}.)

@node doctest<3>,email<4>,distutils<7>,Improved Modules<9>
@anchor{whatsnew/3 5 doctest}@anchor{ff9}
@subsubsection doctest


The @ref{ffa,,DocTestSuite()} function returns an empty
@ref{ffb,,unittest.TestSuite} if `module' contains no docstrings, instead of
raising @ref{2ee,,ValueError}.  (Contributed by Glenn Jones in bpo-15916@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15916}.)

@node email<4>,enum<8>,doctest<3>,Improved Modules<9>
@anchor{whatsnew/3 5 email}@anchor{ffc}
@subsubsection email


A new policy option @ref{ffd,,Policy.mangle_from_}
controls whether or not lines that start with @code{"From "} in email bodies are
prefixed with a @code{">"} character by generators.  The default is @code{True} for
@ref{e9d,,compat32} and @code{False} for all other policies.
(Contributed by Milan Oberkirch in bpo-20098@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20098}.)

A new
@ref{ffe,,Message.get_content_disposition()}
method provides easy access to a canonical value for the
@code{Content-Disposition} header.
(Contributed by Abhilash Raj in bpo-21083@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21083}.)

A new policy option @ref{fff,,EmailPolicy.utf8}
can be set to @code{True} to encode email headers using the UTF-8 charset instead
of using encoded words.  This allows @code{Messages} to be formatted according to
@geindex RFC; RFC 6532
RFC 6532@footnote{https://datatracker.ietf.org/doc/html/rfc6532.html} and used with an SMTP server that supports the 
@geindex RFC; RFC 6531
RFC 6531@footnote{https://datatracker.ietf.org/doc/html/rfc6531.html}
@code{SMTPUTF8} extension.  (Contributed by R. David Murray in
bpo-24211@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24211}.)

The @ref{1000,,mime.text.MIMEText} constructor now
accepts a @ref{1001,,charset.Charset} instance.
(Contributed by Claude Paroz and Berker Peksag in bpo-16324@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16324}.)

@node enum<8>,faulthandler<4>,email<4>,Improved Modules<9>
@anchor{whatsnew/3 5 enum}@anchor{1002}
@subsubsection enum


The @ref{843,,Enum} callable has a new parameter `start' to
specify the initial number of enum values if only `names' are provided:

@example
>>> Animal = enum.Enum('Animal', 'cat dog', start=10)
>>> Animal.cat
<Animal.cat: 10>
>>> Animal.dog
<Animal.dog: 11>
@end example

(Contributed by Ethan Furman in bpo-21706@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21706}.)

@node faulthandler<4>,functools<5>,enum<8>,Improved Modules<9>
@anchor{whatsnew/3 5 faulthandler}@anchor{1003}
@subsubsection faulthandler


The @ref{211,,enable()}, @ref{1004,,register()},
@ref{1005,,dump_traceback()} and
@ref{1006,,dump_traceback_later()} functions now accept file
descriptors in addition to file-like objects.
(Contributed by Wei Wu in bpo-23566@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23566}.)

@node functools<5>,glob<3>,faulthandler<4>,Improved Modules<9>
@anchor{whatsnew/3 5 functools}@anchor{1007}
@subsubsection functools

@anchor{whatsnew/3 5 whatsnew-lrucache}@anchor{f74}
Most of the @ref{be8,,lru_cache()} machinery is now implemented in C, making
it significantly faster.  (Contributed by Matt Joiner, Alexey Kachayev, and
Serhiy Storchaka in bpo-14373@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14373}.)

@node glob<3>,gzip<4>,functools<5>,Improved Modules<9>
@anchor{whatsnew/3 5 glob}@anchor{1008}
@subsubsection glob


The @ref{a0e,,iglob()} and @ref{5a0,,glob()} functions now support recursive
search in subdirectories, using the @code{"**"} pattern.
(Contributed by Serhiy Storchaka in bpo-13968@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13968}.)

@node gzip<4>,heapq<2>,glob<3>,Improved Modules<9>
@anchor{whatsnew/3 5 gzip}@anchor{1009}
@subsubsection gzip


The `mode' argument of the @ref{65c,,GzipFile} constructor now
accepts @code{"x"} to request exclusive creation.
(Contributed by Tim Heaney in bpo-19222@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19222}.)

@node heapq<2>,http<3>,gzip<4>,Improved Modules<9>
@anchor{whatsnew/3 5 heapq}@anchor{100a}
@subsubsection heapq


Element comparison in @ref{100b,,merge()} can now be customized by
passing a @ref{100c,,key function} in a new optional `key' keyword argument,
and a new optional `reverse' keyword argument can be used to reverse element
comparison:

@example
>>> import heapq
>>> a = ['9', '777', '55555']
>>> b = ['88', '6666']
>>> list(heapq.merge(a, b, key=len))
['9', '88', '777', '6666', '55555']
>>> list(heapq.merge(reversed(a), reversed(b), key=len, reverse=True))
['55555', '6666', '777', '88', '9']
@end example

(Contributed by Raymond Hettinger in bpo-13742@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13742}.)

@node http<3>,http client<3>,heapq<2>,Improved Modules<9>
@anchor{whatsnew/3 5 http}@anchor{100d}
@subsubsection http


A new @ref{b02,,HTTPStatus} enum that defines a set of
HTTP status codes, reason phrases and long descriptions written in English.
(Contributed by Demian Brecht in bpo-21793@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21793}.)

@node http client<3>,idlelib and IDLE<3>,http<3>,Improved Modules<9>
@anchor{whatsnew/3 5 http-client}@anchor{100e}
@subsubsection http.client


@ref{100f,,HTTPConnection.getresponse()}
now raises a @ref{1010,,RemoteDisconnected} exception when a
remote server connection is closed unexpectedly.  Additionally, if a
@ref{1011,,ConnectionError} (of which @code{RemoteDisconnected}
is a subclass) is raised, the client socket is now closed automatically,
and will reconnect on the next request:

@example
import http.client
conn = http.client.HTTPConnection('www.python.org')
for retries in range(3):
    try:
        conn.request('GET', '/')
        resp = conn.getresponse()
    except http.client.RemoteDisconnected:
        pass
@end example

(Contributed by Martin Panter in bpo-3566@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3566}.)

@node idlelib and IDLE<3>,imaplib<3>,http client<3>,Improved Modules<9>
@anchor{whatsnew/3 5 idlelib-and-idle}@anchor{1012}
@subsubsection idlelib and IDLE


Since idlelib implements the IDLE shell and editor and is not intended for
import by other programs, it gets improvements with every release.  See
@code{Lib/idlelib/NEWS.txt} for a cumulative list of changes since 3.4.0,
as well as changes made in future 3.5.x releases. This file is also available
from the IDLE Help ‣ About IDLE dialog.

@node imaplib<3>,imghdr,idlelib and IDLE<3>,Improved Modules<9>
@anchor{whatsnew/3 5 imaplib}@anchor{1013}
@subsubsection imaplib


The @ref{b05,,IMAP4} class now supports the @ref{1e3,,context manager} protocol.
When used in a @ref{187,,with} statement, the IMAP4 @code{LOGOUT}
command will be called automatically at the end of the block.
(Contributed by Tarek Ziadé and Serhiy Storchaka in bpo-4972@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4972}.)

The @ref{78,,imaplib} module now supports 
@geindex RFC; RFC 5161
RFC 5161@footnote{https://datatracker.ietf.org/doc/html/rfc5161.html} (ENABLE Extension)
and 
@geindex RFC; RFC 6855
RFC 6855@footnote{https://datatracker.ietf.org/doc/html/rfc6855.html} (UTF-8 Support) via the @ref{1014,,IMAP4.enable()}
method.  A new @ref{1015,,IMAP4.utf8_enabled}
attribute tracks whether or not 
@geindex RFC; RFC 6855
RFC 6855@footnote{https://datatracker.ietf.org/doc/html/rfc6855.html} support is enabled.
(Contributed by Milan Oberkirch, R. David Murray, and Maciej Szulik in
bpo-21800@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21800}.)

The @ref{78,,imaplib} module now automatically encodes non-ASCII string usernames
and passwords using UTF-8, as recommended by the RFCs.  (Contributed by Milan
Oberkirch in bpo-21800@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21800}.)

@node imghdr,importlib<8>,imaplib<3>,Improved Modules<9>
@anchor{whatsnew/3 5 imghdr}@anchor{1016}
@subsubsection imghdr


The @code{what()} function now recognizes the
OpenEXR@footnote{https://www.openexr.com} format
(contributed by Martin Vignali and Claudiu Popa in bpo-20295@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20295}),
and the WebP@footnote{https://en.wikipedia.org/wiki/WebP} format
(contributed by Fabrice Aneche and Claudiu Popa in bpo-20197@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20197}.)

@node importlib<8>,inspect<8>,imghdr,Improved Modules<9>
@anchor{whatsnew/3 5 importlib}@anchor{1017}
@subsubsection importlib


The @ref{eb1,,util.LazyLoader} class allows for
lazy loading of modules in applications where startup time is important.
(Contributed by Brett Cannon in bpo-17621@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17621}.)

The @ref{1018,,abc.InspectLoader.source_to_code()}
method is now a static method.  This makes it easier to initialize a module
object with code compiled from a string by running
@code{exec(code, module.__dict__)}.
(Contributed by Brett Cannon in bpo-21156@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21156}.)

The new @ref{1019,,util.module_from_spec()}
function is now the preferred way to create a new module.  As opposed to
creating a @ref{101a,,types.ModuleType} instance directly, this new function
will set the various import-controlled attributes based on the passed-in
spec object.  (Contributed by Brett Cannon in bpo-20383@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20383}.)

@node inspect<8>,io<7>,importlib<8>,Improved Modules<9>
@anchor{whatsnew/3 5 inspect}@anchor{101b}
@subsubsection inspect


Both the @ref{4e4,,Signature} and @ref{4e5,,Parameter} classes are
now picklable and hashable.  (Contributed by Yury Selivanov in bpo-20726@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20726}
and bpo-20334@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20334}.)

A new
@ref{101c,,BoundArguments.apply_defaults()}
method provides a way to set default values for missing arguments:

@example
>>> def foo(a, b='ham', *args): pass
>>> ba = inspect.signature(foo).bind('spam')
>>> ba.apply_defaults()
>>> ba.arguments
OrderedDict([('a', 'spam'), ('b', 'ham'), ('args', ())])
@end example

(Contributed by Yury Selivanov in bpo-24190@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24190}.)

A new class method
@ref{947,,Signature.from_callable()} makes
subclassing of @ref{4e4,,Signature} easier.  (Contributed
by Yury Selivanov and Eric Snow in bpo-17373@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17373}.)

The @ref{231,,signature()} function now accepts a `follow_wrapped'
optional keyword argument, which, when set to @code{False}, disables automatic
following of @code{__wrapped__} links.
(Contributed by Yury Selivanov in bpo-20691@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20691}.)

A set of new functions to inspect
@ref{f79,,coroutine functions} and
@ref{6ba,,coroutine objects} has been added:
@ref{101d,,iscoroutine()}, @ref{30f,,iscoroutinefunction()},
@ref{101e,,isawaitable()}, @ref{101f,,getcoroutinelocals()},
and @ref{1020,,getcoroutinestate()}.
(Contributed by Yury Selivanov in bpo-24017@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24017} and bpo-24400@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24400}.)

The @ref{863,,stack()}, @ref{864,,trace()},
@ref{861,,getouterframes()}, and @ref{862,,getinnerframes()}
functions now return a list of named tuples.
(Contributed by Daniel Shahaf in bpo-16808@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16808}.)

@node io<7>,ipaddress<4>,inspect<8>,Improved Modules<9>
@anchor{whatsnew/3 5 io}@anchor{1021}
@subsubsection io


A new @ref{1022,,BufferedIOBase.readinto1()}
method, that uses at most one call to the underlying raw stream’s
@ref{1023,,RawIOBase.read()} or
@ref{1024,,RawIOBase.readinto()} methods.
(Contributed by Nikolaus Rath in bpo-20578@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20578}.)

@node ipaddress<4>,json<3>,io<7>,Improved Modules<9>
@anchor{whatsnew/3 5 ipaddress}@anchor{1025}
@subsubsection ipaddress


Both the @ref{50f,,IPv4Network} and @ref{510,,IPv6Network} classes
now accept an @code{(address, netmask)} tuple argument, so as to easily construct
network objects from existing addresses:

@example
>>> import ipaddress
>>> ipaddress.IPv4Network(('127.0.0.0', 8))
IPv4Network('127.0.0.0/8')
>>> ipaddress.IPv4Network(('127.0.0.0', '255.0.0.0'))
IPv4Network('127.0.0.0/8')
@end example

(Contributed by Peter Moody and Antoine Pitrou in bpo-16531@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16531}.)

A new @ref{1026,,reverse_pointer} attribute for the
@ref{50d,,IPv4Address} and @ref{50e,,IPv6Address} classes
returns the name of the reverse DNS PTR record:

@example
>>> import ipaddress
>>> addr = ipaddress.IPv4Address('127.0.0.1')
>>> addr.reverse_pointer
'1.0.0.127.in-addr.arpa'
>>> addr6 = ipaddress.IPv6Address('::1')
>>> addr6.reverse_pointer
'1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa'
@end example

(Contributed by Leon Weber in bpo-20480@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20480}.)

@node json<3>,linecache<3>,ipaddress<4>,Improved Modules<9>
@anchor{whatsnew/3 5 json}@anchor{1027}
@subsubsection json


The @ref{87,,json.tool} command line interface now preserves the order of keys in
JSON objects passed in input.  The new @code{--sort-keys} option can be used
to sort the keys alphabetically. (Contributed by Berker Peksag
in bpo-21650@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21650}.)

JSON decoder now raises @ref{1028,,JSONDecodeError} instead of
@ref{2ee,,ValueError} to provide better context information about the error.
(Contributed by Serhiy Storchaka in bpo-19361@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19361}.)

@node linecache<3>,locale<6>,json<3>,Improved Modules<9>
@anchor{whatsnew/3 5 linecache}@anchor{1029}
@subsubsection linecache


A new @ref{102a,,lazycache()} function can be used to capture information
about a non-file-based module to permit getting its lines later via
@ref{242,,getline()}. This avoids doing I/O until a line is actually
needed, without having to carry the module globals around indefinitely.
(Contributed by Robert Collins in bpo-17911@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17911}.)

@node locale<6>,logging<5>,linecache<3>,Improved Modules<9>
@anchor{whatsnew/3 5 locale}@anchor{102b}
@subsubsection locale


A new @ref{102c,,delocalize()} function can be used to convert a string into
a normalized number string, taking the @code{LC_NUMERIC} settings into account:

@example
>>> import locale
>>> locale.setlocale(locale.LC_NUMERIC, 'de_DE.UTF-8')
'de_DE.UTF-8'
>>> locale.delocalize('1.234,56')
'1234.56'
>>> locale.setlocale(locale.LC_NUMERIC, 'en_US.UTF-8')
'en_US.UTF-8'
>>> locale.delocalize('1,234.56')
'1234.56'
@end example

(Contributed by Cédric Krier in bpo-13918@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13918}.)

@node logging<5>,lzma,locale<6>,Improved Modules<9>
@anchor{whatsnew/3 5 logging}@anchor{102d}
@subsubsection logging


All logging methods (@ref{d4c,,Logger} @ref{102e,,log()},
@ref{102f,,exception()}, @ref{1030,,critical()},
@ref{1031,,debug()}, etc.), now accept exception instances
as an `exc_info' argument, in addition to boolean values and exception
tuples:

@example
>>> import logging
>>> try:
...     1/0
... except ZeroDivisionError as ex:
...     logging.error('exception', exc_info=ex)
ERROR:root:exception
@end example

(Contributed by Yury Selivanov in bpo-20537@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20537}.)

The @ref{1032,,handlers.HTTPHandler} class now
accepts an optional @ref{355,,ssl.SSLContext} instance to configure SSL
settings used in an HTTP connection.
(Contributed by Alex Gaynor in bpo-22788@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22788}.)

The @ref{244,,handlers.QueueListener} class now
takes a `respect_handler_level' keyword argument which, if set to @code{True},
will pass messages to handlers taking handler levels into account.
(Contributed by Vinay Sajip.)

@node lzma,math<9>,logging<5>,Improved Modules<9>
@anchor{whatsnew/3 5 lzma}@anchor{1033}
@subsubsection lzma


The @ref{1034,,LZMADecompressor.decompress()}
method now accepts an optional `max_length' argument to limit the maximum
size of decompressed data.
(Contributed by Martin Panter in bpo-15955@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15955}.)

@node math<9>,multiprocessing<7>,lzma,Improved Modules<9>
@anchor{whatsnew/3 5 math}@anchor{1035}
@subsubsection math


Two new constants have been added to the @ref{92,,math} module: @ref{e86,,inf}
and @ref{875,,nan}.  (Contributed by Mark Dickinson in bpo-23185@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23185}.)

A new function @ref{fb6,,isclose()} provides a way to test for approximate
equality. (Contributed by Chris Barker and Tal Einat in bpo-24270@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24270}.)

A new @ref{b12,,gcd()} function has been added.  The @code{fractions.gcd()}
function is now deprecated. (Contributed by Mark Dickinson and Serhiy
Storchaka in bpo-22486@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22486}.)

@node multiprocessing<7>,operator<3>,math<9>,Improved Modules<9>
@anchor{whatsnew/3 5 multiprocessing}@anchor{1036}
@subsubsection multiprocessing


@ref{1037,,sharedctypes.synchronized()}
objects now support the @ref{1e3,,context manager} protocol.
(Contributed by Charles-François Natali in bpo-21565@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21565}.)

@node operator<3>,os<11>,multiprocessing<7>,Improved Modules<9>
@anchor{whatsnew/3 5 operator}@anchor{1038}
@subsubsection operator


@ref{1039,,attrgetter()}, @ref{c5d,,itemgetter()},
and @ref{103a,,methodcaller()} objects now support pickling.
(Contributed by Josh Rosenberg and Serhiy Storchaka in bpo-22955@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22955}.)

New @ref{103b,,matmul()} and @ref{103c,,imatmul()} functions
to perform matrix multiplication.
(Contributed by Benjamin Peterson in bpo-21176@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21176}.)

@node os<11>,pathlib<13>,operator<3>,Improved Modules<9>
@anchor{whatsnew/3 5 os}@anchor{103d}
@subsubsection os


The new @ref{c5a,,scandir()} function returning an iterator of
@ref{6c4,,DirEntry} objects has been added.  If possible, @code{scandir()}
extracts file attributes while scanning a directory, removing the need to
perform subsequent system calls to determine file type or attributes, which may
significantly improve performance.  (Contributed by Ben Hoyt with the help
of Victor Stinner in bpo-22524@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22524}.)

On Windows, a new
@ref{103e,,stat_result.st_file_attributes}
attribute is now available.  It corresponds to the @code{dwFileAttributes} member
of the @code{BY_HANDLE_FILE_INFORMATION} structure returned by
@code{GetFileInformationByHandle()}.  (Contributed by Ben Hoyt in bpo-21719@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21719}.)

The @ref{747,,urandom()} function now uses the @code{getrandom()} syscall on Linux 3.17
or newer, and @code{getentropy()} on OpenBSD 5.6 and newer, removing the need to
use @code{/dev/urandom} and avoiding failures due to potential file descriptor
exhaustion.  (Contributed by Victor Stinner in bpo-22181@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22181}.)

New @ref{103f,,get_blocking()} and @ref{1040,,set_blocking()} functions allow
getting and setting a file descriptor’s blocking mode (@ref{1041,,O_NONBLOCK}.)
(Contributed by Victor Stinner in bpo-22054@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22054}.)

The @ref{1042,,truncate()} and @ref{f95,,ftruncate()} functions are now supported
on Windows.  (Contributed by Steve Dower in bpo-23668@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23668}.)

There is a new @ref{1043,,os.path.commonpath()} function returning the longest
common sub-path of each passed pathname.  Unlike the
@ref{1044,,os.path.commonprefix()} function, it always returns a valid
path:

@example
>>> os.path.commonprefix(['/usr/lib', '/usr/local/lib'])
'/usr/l'

>>> os.path.commonpath(['/usr/lib', '/usr/local/lib'])
'/usr'
@end example

(Contributed by Rafik Draoui and Serhiy Storchaka in bpo-10395@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10395}.)

@node pathlib<13>,pickle<4>,os<11>,Improved Modules<9>
@anchor{whatsnew/3 5 pathlib}@anchor{1045}
@subsubsection pathlib


The new @ref{1046,,Path.samefile()} method can be used
to check whether the path points to the same file as another path, which can
be either another @ref{268,,Path} object, or a string:

@example
>>> import pathlib
>>> p1 = pathlib.Path('/etc/hosts')
>>> p2 = pathlib.Path('/etc/../etc/hosts')
>>> p1.samefile(p2)
True
@end example

(Contributed by Vajrasky Kok and Antoine Pitrou in bpo-19775@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19775}.)

The @ref{1047,,Path.mkdir()} method now accepts a new optional
`exist_ok' argument to match @code{mkdir -p} and @ref{52d,,os.makedirs()}
functionality.  (Contributed by Berker Peksag in bpo-21539@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21539}.)

There is a new @ref{1048,,Path.expanduser()} method to
expand @code{~} and @code{~user} prefixes.  (Contributed by Serhiy Storchaka and
Claudiu Popa in bpo-19776@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19776}.)

A new @ref{1049,,Path.home()} class method can be used to get
a @ref{268,,Path} instance representing the user’s home
directory.
(Contributed by Victor Salgado and Mayank Tripathi in bpo-19777@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19777}.)

New @ref{104a,,Path.write_text()},
@ref{104b,,Path.read_text()},
@ref{104c,,Path.write_bytes()},
@ref{2e1,,Path.read_bytes()} methods to simplify
read/write operations on files.

The following code snippet will create or rewrite existing file
@code{~/spam42}:

@example
>>> import pathlib
>>> p = pathlib.Path('~/spam42')
>>> p.expanduser().write_text('ham')
3
@end example

(Contributed by Christopher Welborn in bpo-20218@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20218}.)

@node pickle<4>,poplib<2>,pathlib<13>,Improved Modules<9>
@anchor{whatsnew/3 5 pickle}@anchor{104d}
@subsubsection pickle


Nested objects, such as unbound methods or nested classes, can now be pickled
using @ref{27d,,pickle protocols} older than protocol version 4.
Protocol version 4 already supports these cases.  (Contributed by Serhiy
Storchaka in bpo-23611@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23611}.)

@node poplib<2>,re<8>,pickle<4>,Improved Modules<9>
@anchor{whatsnew/3 5 poplib}@anchor{104e}
@subsubsection poplib


A new @ref{104f,,POP3.utf8()} command enables 
@geindex RFC; RFC 6856
RFC 6856@footnote{https://datatracker.ietf.org/doc/html/rfc6856.html}
(Internationalized Email) support, if a POP server supports it.
(Contributed by Milan OberKirch in bpo-21804@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21804}.)

@node re<8>,readline<2>,poplib<2>,Improved Modules<9>
@anchor{whatsnew/3 5 re}@anchor{1050}
@subsubsection re


References and conditional references to groups with fixed length are now
allowed in lookbehind assertions:

@example
>>> import re
>>> pat = re.compile(r'(a|b).(?<=\1)c')
>>> pat.match('aac')
<_sre.SRE_Match object; span=(0, 3), match='aac'>
>>> pat.match('bbc')
<_sre.SRE_Match object; span=(0, 3), match='bbc'>
@end example

(Contributed by Serhiy Storchaka in bpo-9179@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9179}.)

The number of capturing groups in regular expressions is no longer limited to
100.  (Contributed by Serhiy Storchaka in bpo-22437@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22437}.)

The @ref{5a3,,sub()} and @ref{5a4,,subn()} functions now replace unmatched
groups with empty strings instead of raising an exception.
(Contributed by Serhiy Storchaka in bpo-1519638@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1519638}.)

The @ref{547,,re.error} exceptions have new attributes,
@ref{1051,,msg}, @ref{1052,,pattern},
@ref{1053,,pos}, @ref{1054,,lineno},
and @ref{1055,,colno}, that provide better context
information about the error:

@example
>>> re.compile("""
...     (?x)
...     .++
... """)
Traceback (most recent call last):
   ...
sre_constants.error: multiple repeat at position 16 (line 3, column 7)
@end example

(Contributed by Serhiy Storchaka in bpo-22578@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22578}.)

@node readline<2>,selectors,re<8>,Improved Modules<9>
@anchor{whatsnew/3 5 readline}@anchor{1056}
@subsubsection readline


A new @ref{1057,,append_history_file()} function can be used to append
the specified number of trailing elements in history to the given file.
(Contributed by Bruno Cauet in bpo-22940@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22940}.)

@node selectors,shutil<5>,readline<2>,Improved Modules<9>
@anchor{whatsnew/3 5 selectors}@anchor{1058}
@subsubsection selectors


The new @ref{dd8,,DevpollSelector} supports efficient
@code{/dev/poll} polling on Solaris.
(Contributed by Giampaolo Rodola’ in bpo-18931@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18931}.)

@node shutil<5>,signal<3>,selectors,Improved Modules<9>
@anchor{whatsnew/3 5 shutil}@anchor{1059}
@subsubsection shutil


The @ref{c57,,move()} function now accepts a `copy_function' argument,
allowing, for example, the @ref{c55,,copy()} function to be used instead of
the default @ref{c56,,copy2()} if there is a need to ignore file metadata
when moving.
(Contributed by Claudiu Popa in bpo-19840@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19840}.)

The @ref{6db,,make_archive()} function now supports the `xztar' format.
(Contributed by Serhiy Storchaka in bpo-5411@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5411}.)

@node signal<3>,smtpd<2>,shutil<5>,Improved Modules<9>
@anchor{whatsnew/3 5 signal}@anchor{105a}
@subsubsection signal


On Windows, the @ref{d6d,,set_wakeup_fd()} function now also supports
socket handles.  (Contributed by Victor Stinner in bpo-22018@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22018}.)

Various @code{SIG*} constants in the @ref{cb,,signal} module have been converted into
@ref{5a,,Enums}.  This allows meaningful names to be printed
during debugging, instead of integer “magic numbers”.
(Contributed by Giampaolo Rodola’ in bpo-21076@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21076}.)

@node smtpd<2>,smtplib<2>,signal<3>,Improved Modules<9>
@anchor{whatsnew/3 5 smtpd}@anchor{105b}
@subsubsection smtpd


Both the @code{SMTPServer} and @code{SMTPChannel} classes now
accept a `decode_data' keyword argument to determine if the @code{DATA} portion of
the SMTP transaction is decoded using the @code{"utf-8"} codec or is instead
provided to the
@code{SMTPServer.process_message()}
method as a byte string.  The default is @code{True} for backward compatibility
reasons, but will change to @code{False} in Python 3.6.  If `decode_data' is set
to @code{False}, the @code{process_message} method must be prepared to accept keyword
arguments.
(Contributed by Maciej Szulik in bpo-19662@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19662}.)

The @code{SMTPServer} class now advertises the @code{8BITMIME} extension
(
@geindex RFC; RFC 6152
RFC 6152@footnote{https://datatracker.ietf.org/doc/html/rfc6152.html}) if `decode_data' has been set @code{True}.  If the client
specifies @code{BODY=8BITMIME} on the @code{MAIL} command, it is passed to
@code{SMTPServer.process_message()}
via the `mail_options' keyword.
(Contributed by Milan Oberkirch and R.  David Murray in bpo-21795@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21795}.)

The @code{SMTPServer} class now also supports the @code{SMTPUTF8}
extension (
@geindex RFC; RFC 6531
RFC 6531@footnote{https://datatracker.ietf.org/doc/html/rfc6531.html}: Internationalized Email).  If the client specified
@code{SMTPUTF8 BODY=8BITMIME} on the @code{MAIL} command, they are passed to
@code{SMTPServer.process_message()}
via the `mail_options' keyword.  It is the responsibility of the
@code{process_message} method to correctly handle the @code{SMTPUTF8} data.
(Contributed by Milan Oberkirch in bpo-21725@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21725}.)

It is now possible to provide, directly or via name resolution, IPv6
addresses in the @code{SMTPServer} constructor, and have it
successfully connect.  (Contributed by Milan Oberkirch in bpo-14758@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14758}.)

@node smtplib<2>,sndhdr,smtpd<2>,Improved Modules<9>
@anchor{whatsnew/3 5 smtplib}@anchor{105c}
@subsubsection smtplib


A new @ref{105d,,SMTP.auth()} method provides a convenient way to
implement custom authentication mechanisms. (Contributed by Milan
Oberkirch in bpo-15014@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15014}.)

The @ref{105e,,SMTP.set_debuglevel()} method now
accepts an additional debuglevel (2), which enables timestamps in debug
messages. (Contributed by Gavin Chappell and Maciej Szulik in bpo-16914@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16914}.)

Both the @ref{105f,,SMTP.sendmail()} and
@ref{1060,,SMTP.send_message()} methods now
support 
@geindex RFC; RFC 6531
RFC 6531@footnote{https://datatracker.ietf.org/doc/html/rfc6531.html} (SMTPUTF8).
(Contributed by Milan Oberkirch and R. David Murray in bpo-22027@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22027}.)

@node sndhdr,socket<9>,smtplib<2>,Improved Modules<9>
@anchor{whatsnew/3 5 sndhdr}@anchor{1061}
@subsubsection sndhdr


The @code{what()} and @code{whathdr()} functions  now return
a @ref{4e1,,namedtuple()}.  (Contributed by Claudiu Popa in
bpo-18615@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18615}.)

@node socket<9>,ssl<10>,sndhdr,Improved Modules<9>
@anchor{whatsnew/3 5 socket}@anchor{1062}
@subsubsection socket


Functions with timeouts now use a monotonic clock, instead of a system clock.
(Contributed by Victor Stinner in bpo-22043@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22043}.)

A new @ref{1063,,socket.sendfile()} method allows
sending a file over a socket by using the high-performance @ref{d0b,,os.sendfile()}
function on UNIX, resulting in uploads being from 2 to 3 times faster than when
using plain @ref{fad,,socket.send()}.
(Contributed by Giampaolo Rodola’ in bpo-17552@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17552}.)

The @ref{fae,,socket.sendall()} method no longer resets the
socket timeout every time bytes are received or sent.  The socket timeout is
now the maximum total duration to send all data.
(Contributed by Victor Stinner in bpo-23853@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23853}.)

The `backlog' argument of the @ref{1064,,socket.listen()}
method is now optional.  By default it is set to
@ref{1065,,SOMAXCONN} or to @code{128}, whichever is less.
(Contributed by Charles-François Natali in bpo-21455@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21455}.)

@node ssl<10>,sqlite3<9>,socket<9>,Improved Modules<9>
@anchor{whatsnew/3 5 ssl}@anchor{1066}
@subsubsection ssl


@menu
* Memory BIO Support:: 
* Application-Layer Protocol Negotiation Support:: 
* Other Changes:: 

@end menu

@node Memory BIO Support,Application-Layer Protocol Negotiation Support,,ssl<10>
@anchor{whatsnew/3 5 memory-bio-support}@anchor{1067}@anchor{whatsnew/3 5 whatsnew-sslmemorybio}@anchor{f72}
@subsubsection Memory BIO Support


(Contributed by Geert Jansen in bpo-21965@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21965}.)

The new @ref{d80,,SSLObject} class has been added to provide SSL protocol
support for cases when the network I/O capabilities of @ref{aed,,SSLSocket}
are not necessary or are suboptimal.  @code{SSLObject} represents
an SSL protocol instance, but does not implement any network I/O methods, and
instead provides a memory buffer interface.  The new @ref{1068,,MemoryBIO}
class can be used to pass data between Python and an SSL protocol instance.

The memory BIO SSL support is primarily intended to be used in frameworks
implementing asynchronous I/O for which @ref{aed,,SSLSocket}’s readiness
model (“select/poll”) is inefficient.

A new @ref{d81,,SSLContext.wrap_bio()} method can be used
to create a new @code{SSLObject} instance.

@node Application-Layer Protocol Negotiation Support,Other Changes,Memory BIO Support,ssl<10>
@anchor{whatsnew/3 5 application-layer-protocol-negotiation-support}@anchor{1069}
@subsubsection Application-Layer Protocol Negotiation Support


(Contributed by Benjamin Peterson in bpo-20188@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20188}.)

Where OpenSSL support is present, the @ref{d5,,ssl} module now implements
the `Application-Layer Protocol Negotiation' TLS extension as described
in 
@geindex RFC; RFC 7301
RFC 7301@footnote{https://datatracker.ietf.org/doc/html/rfc7301.html}.

The new @ref{106a,,SSLContext.set_alpn_protocols()}
can be used to specify which protocols a socket should advertise during
the TLS handshake.

The new
@ref{106b,,SSLSocket.selected_alpn_protocol()}
returns the protocol that was selected during the TLS handshake.
The @ref{106c,,HAS_ALPN} flag indicates whether ALPN support is present.

@node Other Changes,,Application-Layer Protocol Negotiation Support,ssl<10>
@anchor{whatsnew/3 5 other-changes}@anchor{106d}
@subsubsection Other Changes


There is a new @ref{106e,,SSLSocket.version()} method to
query the actual protocol version in use.
(Contributed by Antoine Pitrou in bpo-20421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20421}.)

The @ref{aed,,SSLSocket} class now implements
a @code{SSLSocket.sendfile()} method.
(Contributed by Giampaolo Rodola’ in bpo-17552@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17552}.)

The @code{SSLSocket.send()} method now raises either
the @ref{106f,,ssl.SSLWantReadError} or @ref{1070,,ssl.SSLWantWriteError} exception on a
non-blocking socket if the operation would block. Previously, it would return
@code{0}.  (Contributed by Nikolaus Rath in bpo-20951@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20951}.)

The @ref{1071,,cert_time_to_seconds()} function now interprets the input time
as UTC and not as local time, per 
@geindex RFC; RFC 5280
RFC 5280@footnote{https://datatracker.ietf.org/doc/html/rfc5280.html}.  Additionally, the return
value is always an @ref{19c,,int}. (Contributed by Akira Li in bpo-19940@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19940}.)

New @code{SSLObject.shared_ciphers()} and
@ref{1072,,SSLSocket.shared_ciphers()} methods return
the list of ciphers sent by the client during the handshake.
(Contributed by Benjamin Peterson in bpo-23186@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23186}.)

The @ref{1073,,SSLSocket.do_handshake()},
@ref{1074,,SSLSocket.read()},
@code{SSLSocket.shutdown()}, and
@ref{1075,,SSLSocket.write()} methods of the @ref{aed,,SSLSocket}
class no longer reset the socket timeout every time bytes are received or sent.
The socket timeout is now the maximum total duration of the method.
(Contributed by Victor Stinner in bpo-23853@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23853}.)

The @code{match_hostname()} function now supports matching of IP addresses.
(Contributed by Antoine Pitrou in bpo-23239@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23239}.)

@node sqlite3<9>,subprocess<4>,ssl<10>,Improved Modules<9>
@anchor{whatsnew/3 5 sqlite3}@anchor{1076}
@subsubsection sqlite3


The @ref{1077,,Row} class now fully supports the sequence protocol,
in particular @ref{a6b,,reversed()} iteration and slice indexing.
(Contributed by Claudiu Popa in bpo-10203@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10203}; by Lucas Sinclair,
Jessica McKellar, and  Serhiy Storchaka in bpo-13583@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13583}.)

@node subprocess<4>,sys<11>,sqlite3<9>,Improved Modules<9>
@anchor{whatsnew/3 5 subprocess}@anchor{1078}@anchor{whatsnew/3 5 whatsnew-subprocess}@anchor{f75}
@subsubsection subprocess


The new @ref{d85,,run()} function has been added.
It runs the specified command and returns a
@ref{1079,,CompletedProcess} object, which describes a finished
process.  The new API is more consistent and is the recommended approach
to invoking subprocesses in Python code that does not need to maintain
compatibility with earlier Python versions.
(Contributed by Thomas Kluyver in bpo-23342@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23342}.)

Examples:

@example
>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], stdout=subprocess.PIPE)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n')
@end example

@node sys<11>,sysconfig<3>,subprocess<4>,Improved Modules<9>
@anchor{whatsnew/3 5 sys}@anchor{107a}
@subsubsection sys


A new @code{set_coroutine_wrapper()} function allows setting a global
hook that will be called whenever a @ref{6ba,,coroutine object}
is created by an @ref{7ee,,async def} function.  A corresponding
@code{get_coroutine_wrapper()} can be used to obtain a currently set
wrapper.  Both functions are @ref{3cf,,provisional},
and are intended for debugging purposes only.  (Contributed by Yury Selivanov
in bpo-24017@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24017}.)

A new @ref{c86,,is_finalizing()} function can be used to check if the Python
interpreter is @ref{47a,,shutting down}.
(Contributed by Antoine Pitrou in bpo-22696@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22696}.)

@node sysconfig<3>,tarfile<7>,sys<11>,Improved Modules<9>
@anchor{whatsnew/3 5 sysconfig}@anchor{107b}
@subsubsection sysconfig


The name of the user scripts directory on Windows now includes the first
two components of the Python version. (Contributed by Paul Moore
in bpo-23437@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23437}.)

@node tarfile<7>,threading<7>,sysconfig<3>,Improved Modules<9>
@anchor{whatsnew/3 5 tarfile}@anchor{107c}
@subsubsection tarfile


The `mode' argument of the @ref{107d,,open()} function now accepts @code{"x"}
to request exclusive creation.  (Contributed by Berker Peksag in bpo-21717@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21717}.)

The @ref{29d,,TarFile.extractall()} and
@ref{29e,,TarFile.extract()} methods now take a keyword
argument `numeric_owner'.  If set to @code{True}, the extracted files and
directories will be owned by the numeric @code{uid} and @code{gid} from the tarfile.
If set to @code{False} (the default, and the behavior in versions prior to 3.5),
they will be owned by the named user and group in the tarfile.
(Contributed by Michael Vogt and Eric Smith in bpo-23193@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23193}.)

The @ref{107e,,TarFile.list()} now accepts an optional
`members' keyword argument that can be set to a subset of the list returned
by @ref{107f,,TarFile.getmembers()}.
(Contributed by Serhiy Storchaka in bpo-21549@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21549}.)

@node threading<7>,time<7>,tarfile<7>,Improved Modules<9>
@anchor{whatsnew/3 5 threading}@anchor{1080}
@subsubsection threading


Both the @ref{8a9,,Lock.acquire()} and
@ref{1081,,RLock.acquire()} methods
now use a monotonic clock for timeout management.
(Contributed by Victor Stinner in bpo-22043@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22043}.)

@node time<7>,timeit<2>,threading<7>,Improved Modules<9>
@anchor{whatsnew/3 5 time}@anchor{1082}
@subsubsection time


The @ref{55c,,monotonic()} function is now always available.
(Contributed by Victor Stinner in bpo-22043@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22043}.)

@node timeit<2>,tkinter<9>,time<7>,Improved Modules<9>
@anchor{whatsnew/3 5 timeit}@anchor{1083}
@subsubsection timeit


A new command line option @code{-u} or @code{--unit=@var{U}} can be used to specify the time
unit for the timer output.  Supported options are @code{usec}, @code{msec},
or @code{sec}.  (Contributed by Julian Gindi in bpo-18983@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18983}.)

The @ref{1084,,timeit()} function has a new `globals' parameter for
specifying the namespace in which the code will be running.
(Contributed by Ben Roberts in bpo-2527@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2527}.)

@node tkinter<9>,traceback<5>,timeit<2>,Improved Modules<9>
@anchor{whatsnew/3 5 tkinter}@anchor{1085}
@subsubsection tkinter


The @code{tkinter._fix} module used for setting up the Tcl/Tk environment
on Windows has been replaced by a private function in the @code{_tkinter}
module which makes no permanent changes to environment variables.
(Contributed by Zachary Ware in bpo-20035@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20035}.)

@node traceback<5>,types<6>,tkinter<9>,Improved Modules<9>
@anchor{whatsnew/3 5 traceback}@anchor{1086}@anchor{whatsnew/3 5 whatsnew-traceback}@anchor{f76}
@subsubsection traceback


New @ref{1087,,walk_stack()} and @ref{1088,,walk_tb()}
functions to conveniently traverse frame and
@ref{cf2,,traceback objects}.
(Contributed by Robert Collins in bpo-17911@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17911}.)

New lightweight classes: @ref{563,,TracebackException},
@ref{1089,,StackSummary}, and @ref{108a,,FrameSummary}.
(Contributed by Robert Collins in bpo-17911@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17911}.)

Both the @ref{108b,,print_tb()} and @ref{108c,,print_stack()} functions
now support negative values for the `limit' argument.
(Contributed by Dmitry Kazakov in bpo-22619@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22619}.)

@node types<6>,unicodedata<9>,traceback<5>,Improved Modules<9>
@anchor{whatsnew/3 5 types}@anchor{108d}
@subsubsection types


A new @ref{108e,,coroutine()} function to transform
@ref{ddf,,generator} and
@ref{fe1,,generator-like} objects into
@ref{4ca,,awaitables}.
(Contributed by Yury Selivanov in bpo-24017@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24017}.)

A new type called @ref{108f,,CoroutineType}, which is used for
@ref{6ba,,coroutine} objects created by @ref{7ee,,async def} functions.
(Contributed by Yury Selivanov in bpo-24400@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24400}.)

@node unicodedata<9>,unittest<9>,types<6>,Improved Modules<9>
@anchor{whatsnew/3 5 unicodedata}@anchor{1090}
@subsubsection unicodedata


The @ref{10c,,unicodedata} module now uses data from Unicode 8.0.0@footnote{https://unicode.org/versions/Unicode8.0.0/}.

@node unittest<9>,unittest mock<3>,unicodedata<9>,Improved Modules<9>
@anchor{whatsnew/3 5 unittest}@anchor{1091}
@subsubsection unittest


The @ref{594,,TestLoader.loadTestsFromModule()}
method now accepts a keyword-only argument `pattern' which is passed to
@code{load_tests} as the third argument.  Found packages are now checked for
@code{load_tests} regardless of whether their path matches `pattern', because it
is impossible for a package name to match the default pattern.
(Contributed by Robert Collins and Barry A. Warsaw in bpo-16662@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16662}.)

Unittest discovery errors now are exposed in the
@ref{1092,,TestLoader.errors} attribute of the
@ref{593,,TestLoader} instance.
(Contributed by Robert Collins in bpo-19746@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19746}.)

A new command line option @code{--locals} to show local variables in
tracebacks.  (Contributed by Robert Collins in bpo-22936@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22936}.)

@node unittest mock<3>,urllib<4>,unittest<9>,Improved Modules<9>
@anchor{whatsnew/3 5 unittest-mock}@anchor{1093}
@subsubsection unittest.mock


The @ref{c45,,Mock} class has the following improvements:


@itemize *

@item 
The class constructor has a new `unsafe' parameter, which causes mock
objects to raise @ref{5f0,,AttributeError} on attribute names starting
with @code{"assert"}.
(Contributed by Kushal Das in bpo-21238@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21238}.)

@item 
A new @ref{1094,,Mock.assert_not_called()}
method to check if the mock object was called.
(Contributed by Kushal Das in bpo-21262@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21262}.)
@end itemize

The @ref{1095,,MagicMock} class now supports
@ref{1096,,__truediv__()}, @ref{1097,,__divmod__()}
and @ref{f7f,,__matmul__()} operators.
(Contributed by Johannes Baiter in bpo-20968@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20968}, and Håkan Lövdahl
in bpo-23581@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23581} and bpo-23568@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23568}.)

It is no longer necessary to explicitly pass @code{create=True} to the
@ref{1098,,patch()} function when patching builtin names.
(Contributed by Kushal Das in bpo-17660@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17660}.)

@node urllib<4>,wsgiref,unittest mock<3>,Improved Modules<9>
@anchor{whatsnew/3 5 urllib}@anchor{1099}
@subsubsection urllib


A new
@ref{109a,,request.HTTPPasswordMgrWithPriorAuth}
class allows HTTP Basic Authentication credentials to be managed so as to
eliminate unnecessary @code{401} response handling, or to unconditionally send
credentials on the first request in order to communicate with servers that
return a @code{404} response instead of a @code{401} if the @code{Authorization} header
is not sent. (Contributed by Matej Cepl in bpo-19494@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19494} and Akshit Khurana in
bpo-7159@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7159}.)

A new `quote_via' argument for the
@ref{109b,,parse.urlencode()}
function provides a way to control the encoding of query parts if needed.
(Contributed by Samwyse and Arnon Yaari in bpo-13866@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13866}.)

The @ref{309,,request.urlopen()} function accepts an
@ref{355,,ssl.SSLContext} object as a `context' argument, which will be used for
the HTTPS connection.  (Contributed by Alex Gaynor in bpo-22366@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22366}.)

The @ref{109c,,parse.urljoin()} was updated to use the
@geindex RFC; RFC 3986
RFC 3986@footnote{https://datatracker.ietf.org/doc/html/rfc3986.html} semantics for the resolution of relative URLs, rather than
@geindex RFC; RFC 1808
RFC 1808@footnote{https://datatracker.ietf.org/doc/html/rfc1808.html} and 
@geindex RFC; RFC 2396
RFC 2396@footnote{https://datatracker.ietf.org/doc/html/rfc2396.html}.
(Contributed by Demian Brecht and Senthil Kumaran in bpo-22118@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22118}.)

@node wsgiref,xmlrpc<2>,urllib<4>,Improved Modules<9>
@anchor{whatsnew/3 5 wsgiref}@anchor{109d}
@subsubsection wsgiref


The `headers' argument of the @ref{109e,,headers.Headers}
class constructor is now optional.
(Contributed by Pablo Torres Navarrete and SilentGhost in bpo-5800@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5800}.)

@node xmlrpc<2>,xml sax,wsgiref,Improved Modules<9>
@anchor{whatsnew/3 5 xmlrpc}@anchor{109f}
@subsubsection xmlrpc


The @ref{c52,,client.ServerProxy} class now supports
the @ref{1e3,,context manager} protocol.
(Contributed by Claudiu Popa in bpo-20627@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20627}.)

The @ref{c52,,client.ServerProxy} constructor now accepts
an optional @ref{355,,ssl.SSLContext} instance.
(Contributed by Alex Gaynor in bpo-22960@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22960}.)

@node xml sax,zipfile<5>,xmlrpc<2>,Improved Modules<9>
@anchor{whatsnew/3 5 xml-sax}@anchor{10a0}
@subsubsection xml.sax


SAX parsers now support a character stream of the
@ref{10a1,,xmlreader.InputSource} object.
(Contributed by Serhiy Storchaka in bpo-2175@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2175}.)

@ref{10a2,,parseString()} now accepts a @ref{16a,,str} instance.
(Contributed by Serhiy Storchaka in bpo-10590@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10590}.)

@node zipfile<5>,,xml sax,Improved Modules<9>
@anchor{whatsnew/3 5 zipfile}@anchor{10a3}
@subsubsection zipfile


ZIP output can now be written to unseekable streams.
(Contributed by Serhiy Storchaka in bpo-23252@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23252}.)

The `mode' argument of @ref{65d,,ZipFile.open()} method now
accepts @code{"x"} to request exclusive creation.
(Contributed by Serhiy Storchaka in bpo-21717@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21717}.)

@node Other module-level changes,Optimizations<10>,Improved Modules<9>,What’s New In Python 3 5
@anchor{whatsnew/3 5 other-module-level-changes}@anchor{10a4}
@subsection Other module-level changes


Many functions in the @ref{94,,mmap}, @code{ossaudiodev}, @ref{d1,,socket},
@ref{d5,,ssl}, and @ref{1c,,codecs} modules now accept writable
@ref{194,,bytes-like objects}.
(Contributed by Serhiy Storchaka in bpo-23001@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23001}.)

@node Optimizations<10>,Build and C API Changes<3>,Other module-level changes,What’s New In Python 3 5
@anchor{whatsnew/3 5 optimizations}@anchor{10a5}
@subsection Optimizations


The @ref{6d1,,os.walk()} function has been sped up by 3 to 5 times on POSIX systems,
and by 7 to 20 times on Windows.  This was done using the new @ref{c5a,,os.scandir()}
function, which exposes file information from the underlying @code{readdir} or
@code{FindFirstFile}/@code{FindNextFile} system calls.  (Contributed by
Ben Hoyt with help from Victor Stinner in bpo-23605@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23605}.)

Construction of @code{bytes(int)} (filled by zero bytes) is faster and uses less
memory for large objects. @code{calloc()} is used instead of @code{malloc()} to
allocate memory for these objects.
(Contributed by Victor Stinner in bpo-21233@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21233}.)

Some operations on @ref{84,,ipaddress} @ref{50f,,IPv4Network} and
@ref{510,,IPv6Network} have been massively sped up, such as
@ref{10a6,,subnets()}, @ref{10a7,,supernet()},
@ref{10a8,,summarize_address_range()}, @ref{10a9,,collapse_addresses()}.
The speed up can range from 3 to 15 times.
(Contributed by Antoine Pitrou, Michel Albert, and Markus in
bpo-21486@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21486}, bpo-21487@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21487}, bpo-20826@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20826}, bpo-23266@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23266}.)

Pickling of @ref{84,,ipaddress} objects was optimized to produce significantly
smaller output.  (Contributed by Serhiy Storchaka in bpo-23133@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23133}.)

Many operations on @ref{10aa,,io.BytesIO} are now 50% to 100% faster.
(Contributed by Serhiy Storchaka in bpo-15381@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15381} and David Wilson in
bpo-22003@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22003}.)

The @ref{10ab,,marshal.dumps()} function is now faster: 65–85% with versions 3
and 4, 20–25% with versions 0 to 2 on typical data, and up to 5 times in
best cases.
(Contributed by Serhiy Storchaka in bpo-20416@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20416} and bpo-23344@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23344}.)

The UTF-32 encoder is now 3 to 7 times faster.
(Contributed by Serhiy Storchaka in bpo-15027@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15027}.)

Regular expressions are now parsed up to 10% faster.
(Contributed by Serhiy Storchaka in bpo-19380@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19380}.)

The @ref{f47,,json.dumps()} function was optimized to run with
@code{ensure_ascii=False} as fast as with @code{ensure_ascii=True}.
(Contributed by Naoki Inada in bpo-23206@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23206}.)

The @ref{10ac,,PyObject_IsInstance()} and @ref{10ad,,PyObject_IsSubclass()}
functions have been sped up in the common case that the second argument
has @ref{f4a,,type} as its metaclass.
(Contributed Georg Brandl by in bpo-22540@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22540}.)

Method caching was slightly improved, yielding up to 5% performance
improvement in some benchmarks.
(Contributed by Antoine Pitrou in bpo-22847@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22847}.)

Objects from the @ref{bd,,random} module now use 50% less memory on 64-bit
builds.  (Contributed by Serhiy Storchaka in bpo-23488@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23488}.)

The @ref{4b4,,property()} getter calls are up to 25% faster.
(Contributed by Joe Jevnik in bpo-23910@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23910}.)

Instantiation of @ref{215,,fractions.Fraction} is now up to 30% faster.
(Contributed by Stefan Behnel in bpo-22464@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22464}.)

String methods @ref{10ae,,find()}, @ref{10af,,rfind()}, @ref{10b0,,split()},
@ref{10b1,,partition()} and the @ref{349,,in} string operator are now significantly
faster for searching 1-character substrings.
(Contributed by Serhiy Storchaka in bpo-23573@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23573}.)

@node Build and C API Changes<3>,Deprecated<11>,Optimizations<10>,What’s New In Python 3 5
@anchor{whatsnew/3 5 build-and-c-api-changes}@anchor{10b2}
@subsection Build and C API Changes


New @code{calloc} functions were added:


@itemize *

@item 
@ref{632,,PyMem_RawCalloc()},

@item 
@ref{10b3,,PyMem_Calloc()},

@item 
@ref{10b4,,PyObject_Calloc()}.
@end itemize

(Contributed by Victor Stinner in bpo-21233@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21233}.)

New encoding/decoding helper functions:


@itemize *

@item 
@ref{dc6,,Py_DecodeLocale()} (replaced @code{_Py_char2wchar()}),

@item 
@ref{dc7,,Py_EncodeLocale()} (replaced @code{_Py_wchar2char()}).
@end itemize

(Contributed by Victor Stinner in bpo-18395@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18395}.)

A new @ref{10b5,,PyCodec_NameReplaceErrors()} function to replace the unicode
encode error with @code{\N@{...@}} escapes.
(Contributed by Serhiy Storchaka in bpo-19676@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19676}.)

A new @ref{10b6,,PyErr_FormatV()} function similar to @ref{10b7,,PyErr_Format()},
but accepts a @code{va_list} argument.
(Contributed by Antoine Pitrou in bpo-18711@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18711}.)

A new @ref{10b8,,PyExc_RecursionError} exception.
(Contributed by Georg Brandl in bpo-19235@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19235}.)

New @ref{10b9,,PyModule_FromDefAndSpec()}, @ref{10ba,,PyModule_FromDefAndSpec2()},
and @ref{10bb,,PyModule_ExecDef()} functions introduced by 
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/} –
multi-phase extension module initialization.
(Contributed by Petr Viktorin in bpo-24268@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24268}.)

New @ref{10bc,,PyNumber_MatrixMultiply()} and
@ref{10bd,,PyNumber_InPlaceMatrixMultiply()} functions to perform matrix
multiplication.
(Contributed by Benjamin Peterson in bpo-21176@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21176}.  See also 
@geindex Python Enhancement Proposals; PEP 465
PEP 465@footnote{https://peps.python.org/pep-0465/}
for details.)

The @ref{ca3,,PyTypeObject.tp_finalize} slot is now part of the stable ABI.

Windows builds now require Microsoft Visual C++ 14.0, which
is available as part of Visual Studio 2015@footnote{https://visualstudio.microsoft.com/en/vs/older-downloads/#visual-studio-2015-and-other-products}.

Extension modules now include a platform information tag in their filename on
some platforms (the tag is optional, and CPython will import extensions without
it, although if the tag is present and mismatched, the extension won’t be
loaded):


@itemize *

@item 
On Linux, extension module filenames end with
@code{.cpython-<major><minor>m-<architecture>-<os>.pyd}:


@itemize *

@item 
@code{<major>} is the major number of the Python version;
for Python 3.5 this is @code{3}.

@item 
@code{<minor>} is the minor number of the Python version;
for Python 3.5 this is @code{5}.

@item 
@code{<architecture>} is the hardware architecture the extension module
was built to run on. It’s most commonly either @code{i386} for 32-bit Intel
platforms or @code{x86_64} for 64-bit Intel (and AMD) platforms.

@item 
@code{<os>} is always @code{linux-gnu}, except for extensions built to
talk to the 32-bit ABI on 64-bit platforms, in which case it is
@code{linux-gnu32} (and @code{<architecture>} will be @code{x86_64}).
@end itemize

@item 
On Windows, extension module filenames end with
@code{<debug>.cp<major><minor>-<platform>.pyd}:


@itemize *

@item 
@code{<major>} is the major number of the Python version;
for Python 3.5 this is @code{3}.

@item 
@code{<minor>} is the minor number of the Python version;
for Python 3.5 this is @code{5}.

@item 
@code{<platform>} is the platform the extension module was built for,
either @code{win32} for Win32, @code{win_amd64} for Win64, @code{win_ia64} for
Windows Itanium 64, and @code{win_arm} for Windows on ARM.

@item 
If built in debug mode, @code{<debug>} will be @code{_d},
otherwise it will be blank.
@end itemize

@item 
On OS X platforms, extension module filenames now end with @code{-darwin.so}.

@item 
On all other platforms, extension module filenames are the same as they were
with Python 3.4.
@end itemize

@node Deprecated<11>,Removed<11>,Build and C API Changes<3>,What’s New In Python 3 5
@anchor{whatsnew/3 5 deprecated}@anchor{10be}
@subsection Deprecated


@menu
* New Keywords: New Keywords<2>. 
* Deprecated Python Behavior: Deprecated Python Behavior<2>. 
* Unsupported Operating Systems:: 
* Deprecated Python modules@comma{} functions and methods: Deprecated Python modules functions and methods<3>. 

@end menu

@node New Keywords<2>,Deprecated Python Behavior<2>,,Deprecated<11>
@anchor{whatsnew/3 5 new-keywords}@anchor{10bf}
@subsubsection New Keywords


@code{async} and @code{await} are not recommended to be used as variable, class,
function or module names.  Introduced by 
@geindex Python Enhancement Proposals; PEP 492
PEP 492@footnote{https://peps.python.org/pep-0492/} in Python 3.5, they will
become proper keywords in Python 3.7.

@node Deprecated Python Behavior<2>,Unsupported Operating Systems,New Keywords<2>,Deprecated<11>
@anchor{whatsnew/3 5 deprecated-python-behavior}@anchor{10c0}
@subsubsection Deprecated Python Behavior


Raising the @ref{dfb,,StopIteration} exception inside a generator will now generate a silent
@ref{acc,,PendingDeprecationWarning}, which will become a non-silent deprecation
warning in Python 3.6 and will trigger a @ref{246,,RuntimeError} in Python 3.7.
See @ref{f21,,PEP 479; Change StopIteration handling inside generators}
for details.

@node Unsupported Operating Systems,Deprecated Python modules functions and methods<3>,Deprecated Python Behavior<2>,Deprecated<11>
@anchor{whatsnew/3 5 unsupported-operating-systems}@anchor{10c1}
@subsubsection Unsupported Operating Systems


Windows XP is no longer supported by Microsoft, thus, per 
@geindex Python Enhancement Proposals; PEP 11
PEP 11@footnote{https://peps.python.org/pep-0011/}, CPython
3.5 is no longer officially supported on this OS.

@node Deprecated Python modules functions and methods<3>,,Unsupported Operating Systems,Deprecated<11>
@anchor{whatsnew/3 5 deprecated-python-modules-functions-and-methods}@anchor{10c2}
@subsubsection Deprecated Python modules, functions and methods


The @code{formatter} module has now graduated to full deprecation and is still
slated for removal in Python 3.6.

The @code{asyncio.async()} function is deprecated in favor of
@ref{e77,,ensure_future()}.

The @code{smtpd} module has in the past always decoded the DATA portion of
email messages using the @code{utf-8} codec.  This can now be controlled by the
new `decode_data' keyword to @code{SMTPServer}.  The default value is
@code{True}, but this default is deprecated.  Specify the `decode_data' keyword
with an appropriate value to avoid the deprecation warning.

Directly assigning values to the @ref{e01,,key},
@ref{e02,,value} and
@ref{e03,,coded_value} of @ref{e04,,http.cookies.Morsel}
objects is deprecated.  Use the @ref{e05,,set()} method
instead.  In addition, the undocumented `LegalChars' parameter of
@code{set()} is deprecated, and is now ignored.

Passing a format string as keyword argument `format_string' to the
@ref{e00,,format()} method of the @ref{10c3,,string.Formatter}
class has been deprecated.
(Contributed by Serhiy Storchaka in bpo-23671@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23671}.)

The @code{platform.dist()} and @code{platform.linux_distribution()} functions
are now deprecated.  Linux distributions use too many different ways of
describing themselves, so the functionality is left to a package.
(Contributed by Vajrasky Kok and Berker Peksag in bpo-1322@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1322}.)

The previously undocumented @code{from_function} and @code{from_builtin} methods of
@ref{4e4,,inspect.Signature} are deprecated.  Use the new
@ref{947,,Signature.from_callable()}
method instead. (Contributed by Yury Selivanov in bpo-24248@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24248}.)

The @code{inspect.getargspec()} function is deprecated and scheduled to be
removed in Python 3.6.  (See bpo-20438@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20438} for details.)

The @ref{82,,inspect} @ref{946,,getfullargspec()},
@ref{10c4,,getcallargs()}, and @code{formatargspec()} functions are
deprecated in favor of the @ref{231,,inspect.signature()} API. (Contributed by Yury
Selivanov in bpo-20438@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20438}.)

@ref{10c5,,getargvalues()} and @ref{10c6,,formatargvalues()} functions
were inadvertently marked as deprecated with the release of Python 3.5.0.

Use of @ref{d69,,re.LOCALE} flag with str patterns or @ref{83f,,re.ASCII} is now
deprecated.  (Contributed by Serhiy Storchaka in bpo-22407@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22407}.)

Use of unrecognized special sequences consisting of @code{'\'} and an ASCII letter
in regular expression patterns and replacement patterns now raises a
deprecation warning and will be forbidden in Python 3.6.
(Contributed by Serhiy Storchaka in bpo-23622@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23622}.)

The undocumented and unofficial `use_load_tests' default argument of the
@ref{594,,unittest.TestLoader.loadTestsFromModule()} method now is
deprecated and ignored.
(Contributed by Robert Collins and Barry A. Warsaw in bpo-16662@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16662}.)

@node Removed<11>,Porting to Python 3 5,Deprecated<11>,What’s New In Python 3 5
@anchor{whatsnew/3 5 removed}@anchor{10c7}
@subsection Removed


@menu
* API and Feature Removals: API and Feature Removals<4>. 

@end menu

@node API and Feature Removals<4>,,,Removed<11>
@anchor{whatsnew/3 5 api-and-feature-removals}@anchor{10c8}
@subsubsection API and Feature Removals


The following obsolete and previously deprecated APIs and features have been
removed:


@itemize *

@item 
The @code{__version__} attribute has been dropped from the email package.  The
email code hasn’t been shipped separately from the stdlib for a long time,
and the @code{__version__} string was not updated in the last few releases.

@item 
The internal @code{Netrc} class in the @ref{62,,ftplib} module was deprecated in
3.4, and has now been removed.
(Contributed by Matt Chaput in bpo-6623@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6623}.)

@item 
The concept of @code{.pyo} files has been removed.

@item 
The JoinableQueue class in the provisional @ref{b,,asyncio} module was
deprecated in 3.4.4 and is now removed.
(Contributed by A. Jesse Jiryu Davis in bpo-23464@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23464}.)
@end itemize

@node Porting to Python 3 5,Notable changes in Python 3 5 4,Removed<11>,What’s New In Python 3 5
@anchor{whatsnew/3 5 porting-to-python-3-5}@anchor{10c9}
@subsection Porting to Python 3.5


This section lists previously described changes and other bugfixes
that may require changes to your code.

@menu
* Changes in Python behavior: Changes in Python behavior<2>. 
* Changes in the Python API: Changes in the Python API<10>. 
* Changes in the C API: Changes in the C API<8>. 

@end menu

@node Changes in Python behavior<2>,Changes in the Python API<10>,,Porting to Python 3 5
@anchor{whatsnew/3 5 changes-in-python-behavior}@anchor{10ca}
@subsubsection Changes in Python behavior



@itemize *

@item 
Due to an oversight, earlier Python versions erroneously accepted the
following syntax:

@example
f(1 for x in [1], *args)
f(1 for x in [1], **kwargs)
@end example

Python 3.5 now correctly raises a @ref{18f,,SyntaxError}, as generator
expressions must be put in parentheses if not a sole argument to a function.
@end itemize

@node Changes in the Python API<10>,Changes in the C API<8>,Changes in Python behavior<2>,Porting to Python 3 5
@anchor{whatsnew/3 5 changes-in-the-python-api}@anchor{10cb}
@subsubsection Changes in the Python API



@itemize *

@item 
@geindex Python Enhancement Proposals; PEP 475
PEP 475@footnote{https://peps.python.org/pep-0475/}: System calls are now retried when interrupted by a signal instead
of raising @ref{f8e,,InterruptedError} if the Python signal handler does not
raise an exception.

@item 
Before Python 3.5, a @ref{1fd,,datetime.time} object was considered to be false
if it represented midnight in UTC.  This behavior was considered obscure and
error-prone and has been removed in Python 3.5.  See bpo-13936@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13936} for full
details.

@item 
The @code{ssl.SSLSocket.send()} method now raises either
@ref{106f,,ssl.SSLWantReadError} or @ref{1070,,ssl.SSLWantWriteError}
on a non-blocking socket if the operation would block.  Previously,
it would return @code{0}.  (Contributed by Nikolaus Rath in bpo-20951@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20951}.)

@item 
The @code{__name__} attribute of generators is now set from the function name,
instead of being set from the code name. Use @code{gen.gi_code.co_name} to
retrieve the code name. Generators also have a new @code{__qualname__}
attribute, the qualified name, which is now used for the representation
of a generator (@code{repr(gen)}).
(Contributed by Victor Stinner in bpo-21205@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21205}.)

@item 
The deprecated “strict” mode and argument of @ref{a7d,,HTMLParser},
@code{HTMLParser.error()}, and the @code{HTMLParserError} exception have been
removed.  (Contributed by Ezio Melotti in bpo-15114@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15114}.)
The `convert_charrefs' argument of @code{HTMLParser} is
now @code{True} by default.  (Contributed by Berker Peksag in bpo-21047@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21047}.)

@item 
Although it is not formally part of the API, it is worth noting for porting
purposes (ie: fixing tests) that error messages that were previously of the
form “‘sometype’ does not support the buffer protocol” are now of the form “a
@ref{194,,bytes-like object} is required, not ‘sometype’”.
(Contributed by Ezio Melotti in bpo-16518@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16518}.)

@item 
If the current directory is set to a directory that no longer exists then
@ref{266,,FileNotFoundError} will no longer be raised and instead
@ref{10cc,,find_spec()} will return @code{None}
`without' caching @code{None} in @ref{7fb,,sys.path_importer_cache}, which is
different than the typical case (bpo-22834@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22834}).

@item 
HTTP status code and messages from @ref{73,,http.client} and @ref{76,,http.server}
were refactored into a common @ref{b02,,HTTPStatus} enum.  The values in
@code{http.client} and @code{http.server} remain available for backwards
compatibility.  (Contributed by Demian Brecht in bpo-21793@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21793}.)

@item 
When an import loader defines @ref{a70,,exec_module()}
it is now expected to also define
@ref{eb2,,create_module()} (raises a
@ref{1a4,,DeprecationWarning} now, will be an error in Python 3.6). If the loader
inherits from @ref{10cd,,importlib.abc.Loader} then there is nothing to do, else
simply define @code{create_module()} to return
@code{None}.  (Contributed by Brett Cannon in bpo-23014@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23014}.)

@item 
The @ref{5a2,,re.split()} function always ignored empty pattern matches, so the
@code{"x*"} pattern worked the same as @code{"x+"}, and the @code{"\b"} pattern never
worked.  Now @code{re.split()} raises a warning if the pattern could match
an empty string.  For compatibility, use patterns that never match an empty
string (e.g. @code{"x+"} instead of @code{"x*"}).  Patterns that could only match
an empty string (such as @code{"\b"}) now raise an error.
(Contributed by Serhiy Storchaka in bpo-22818@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22818}.)

@item 
The @ref{e04,,http.cookies.Morsel} dict-like interface has been made self
consistent:  morsel comparison now takes the @ref{e01,,key}
and @ref{e02,,value} into account,
@ref{10ce,,copy()} now results in a
@code{Morsel} instance rather than a @ref{184,,dict}, and
@ref{10cf,,update()} will now raise an exception if any of the
keys in the update dictionary are invalid.  In addition, the undocumented
`LegalChars' parameter of @ref{e05,,set()} is deprecated and
is now ignored.  (Contributed by Demian Brecht in bpo-2211@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2211}.)

@item 
@geindex Python Enhancement Proposals; PEP 488
PEP 488@footnote{https://peps.python.org/pep-0488/} has removed @code{.pyo} files from Python and introduced the optional
@code{opt-} tag in @code{.pyc} file names. The
@ref{351,,importlib.util.cache_from_source()} has gained an `optimization'
parameter to help control the @code{opt-} tag. Because of this, the
`debug_override' parameter of the function is now deprecated. @code{.pyo} files
are also no longer supported as a file argument to the Python interpreter and
thus serve no purpose when distributed on their own (i.e. sourceless code
distribution). Due to the fact that the magic number for bytecode has changed
in Python 3.5, all old @code{.pyo} files from previous versions of Python are
invalid regardless of this PEP.

@item 
The @ref{d1,,socket} module now exports the @ref{10d0,,CAN_RAW_FD_FRAMES}
constant on linux 3.6 and greater.

@item 
The @ref{1071,,ssl.cert_time_to_seconds()} function now interprets the input time
as UTC and not as local time, per 
@geindex RFC; RFC 5280
RFC 5280@footnote{https://datatracker.ietf.org/doc/html/rfc5280.html}.  Additionally, the return
value is always an @ref{19c,,int}. (Contributed by Akira Li in bpo-19940@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19940}.)

@item 
The @code{pygettext.py} Tool now uses the standard +NNNN format for timezones in
the POT-Creation-Date header.

@item 
The @ref{cf,,smtplib} module now uses @ref{b39,,sys.stderr} instead of the previous
module-level @code{stderr} variable for debug output.  If your (test)
program depends on patching the module-level variable to capture the debug
output, you will need to update it to capture sys.stderr instead.

@item 
The @ref{10d1,,str.startswith()} and @ref{10d2,,str.endswith()} methods no longer return
@code{True} when finding the empty string and the indexes are completely out of
range.  (Contributed by Serhiy Storchaka in bpo-24284@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24284}.)

@item 
The @ref{bf3,,inspect.getdoc()} function now returns documentation strings
inherited from base classes.  Documentation strings no longer need to be
duplicated if the inherited documentation is appropriate.  To suppress an
inherited string, an empty string must be specified (or the documentation
may be filled in).  This change affects the output of the @ref{ba,,pydoc}
module and the @ref{ada,,help()} function.
(Contributed by Serhiy Storchaka in bpo-15582@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15582}.)

@item 
Nested @ref{219,,functools.partial()} calls are now flattened.  If you were
relying on the previous behavior, you can now either add an attribute to a
@code{functools.partial()} object or you can create a subclass of
@code{functools.partial()}.
(Contributed by Alexander Belopolsky in bpo-7830@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7830}.)
@end itemize

@node Changes in the C API<8>,,Changes in the Python API<10>,Porting to Python 3 5
@anchor{whatsnew/3 5 changes-in-the-c-api}@anchor{10d3}
@subsubsection Changes in the C API



@itemize *

@item 
The undocumented @code{format} member of the
(non-public) @code{PyMemoryViewObject} structure has been removed.
All extensions relying on the relevant parts in @code{memoryobject.h}
must be rebuilt.

@item 
The @code{PyMemAllocator} structure was renamed to
@ref{10d4,,PyMemAllocatorEx} and a new @code{calloc} field was added.

@item 
Removed non-documented macro @code{PyObject_REPR()} which leaked references.
Use format character @code{%R} in @ref{62b,,PyUnicode_FromFormat()}-like functions
to format the @ref{1c3,,repr()} of the object.
(Contributed by Serhiy Storchaka in bpo-22453@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22453}.)

@item 
Because the lack of the @ref{617,,__module__} attribute breaks pickling and
introspection, a deprecation warning is now raised for builtin types without
the @code{__module__} attribute.  This will be an @ref{5f0,,AttributeError} in
the future.
(Contributed by Serhiy Storchaka in bpo-20204@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20204}.)

@item 
As part of the 
@geindex Python Enhancement Proposals; PEP 492
PEP 492@footnote{https://peps.python.org/pep-0492/} implementation, the @code{tp_reserved} slot of
@ref{ca2,,PyTypeObject} was replaced with a
@ref{10d5,,tp_as_async} slot.  Refer to @ref{10d6,,Coroutine Objects} for
new types, structures and functions.
@end itemize

@node Notable changes in Python 3 5 4,,Porting to Python 3 5,What’s New In Python 3 5
@anchor{whatsnew/3 5 notable-changes-in-python-3-5-4}@anchor{10d7}
@subsection Notable changes in Python 3.5.4


@menu
* New make regen-all build target: New make regen-all build target<2>. 
* Removal of make touch build target: Removal of make touch build target<2>. 

@end menu

@node New make regen-all build target<2>,Removal of make touch build target<2>,,Notable changes in Python 3 5 4
@anchor{whatsnew/3 5 new-make-regen-all-build-target}@anchor{10d8}
@subsubsection New @code{make regen-all} build target


To simplify cross-compilation, and to ensure that CPython can reliably be
compiled without requiring an existing version of Python to already be
available, the autotools-based build system no longer attempts to implicitly
recompile generated files based on file modification times.

Instead, a new @code{make regen-all} command has been added to force regeneration
of these files when desired (e.g. after an initial version of Python has
already been built based on the pregenerated versions).

More selective regeneration targets are also defined - see
Makefile.pre.in@footnote{https://github.com/python/cpython/tree/3.14/Makefile.pre.in} for details.

(Contributed by Victor Stinner in bpo-23404@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23404}.)


Added in version 3.5.4.


@node Removal of make touch build target<2>,,New make regen-all build target<2>,Notable changes in Python 3 5 4
@anchor{whatsnew/3 5 removal-of-make-touch-build-target}@anchor{10d9}
@subsubsection Removal of @code{make touch} build target


The @code{make touch} build target previously used to request implicit regeneration
of generated files by updating their modification times has been removed.

It has been replaced by the new @code{make regen-all} target.

(Contributed by Victor Stinner in bpo-23404@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23404}.)


Changed in version 3.5.4.


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node What’s New In Python 3 4,What’s New In Python 3 3,What’s New In Python 3 5,What’s New in Python
@anchor{whatsnew/3 4 doc}@anchor{10da}@anchor{whatsnew/3 4 translation-repo}@anchor{10db}@anchor{whatsnew/3 4 what-s-new-in-python-3-4}@anchor{10dc}
@section What’s New In Python 3.4


@*Author: 
R. David Murray <@email{rdmurray@@bitdance.com}> (Editor)


@c Rules for maintenance:
@c 
@c * Anyone can add text to this document, but the maintainer reserves the
@c right to rewrite any additions. In particular, for obscure or esoteric
@c features, the maintainer may reduce any addition to a simple reference to
@c the new documentation rather than explaining the feature inline.
@c 
@c * While the maintainer will periodically go through Misc/NEWS
@c and add changes, it's best not to rely on this. We know from experience
@c that any changes that aren't in the What's New documentation around the
@c time of the original release will remain largely unknown to the community
@c for years, even if they're added later. We also know from experience that
@c other priorities can arise, and the maintainer will run out of time to do
@c updates -- in such cases, end users will be much better served by partial
@c notifications that at least give a hint about new features to
@c investigate.
@c 
@c * This is not a complete list of every single change; completeness
@c is the purpose of Misc/NEWS. The What's New should focus on changes that
@c are visible to Python *users* and that *require* a feature release (i.e.
@c most bug fixes should only be recorded in Misc/NEWS)
@c 
@c * PEPs should not be marked Final until they have an entry in What's New.
@c A placeholder entry that is just a section header and a link to the PEP
@c (e.g ":pep:`397` has been implemented") is acceptable. If a PEP has been
@c implemented and noted in What's New, don't forget to mark it as Final!
@c 
@c * If you want to draw your new text to the attention of the
@c maintainer, add 'XXX' to the beginning of the paragraph or
@c section.
@c 
@c * It's OK to add just a very brief note about a change.  For
@c example: "The :ref:`~socket.transmogrify()` function was added to the
@c :mod:`socket` module."  The maintainer will research the change and
@c write the necessary text (if appropriate). The advantage of doing this
@c is that even if no more descriptive text is ever added, readers will at
@c least have a notification that the new feature exists and a link to the
@c relevant documentation.
@c 
@c * You can comment out your additions if you like, but it's not
@c necessary (especially when a final release is some months away).
@c 
@c * Credit the author of a patch or bugfix.   Just the name is
@c sufficient; the e-mail address isn't necessary.
@c 
@c * It's helpful to add the bug/patch number as a comment:
@c 
@c The :ref:`~socket.transmogrify()` function was added to the
@c :mod:`socket` module.  (Contributed by P.Y. Developer in :issue:`12345`.)
@c 
@c This saves the maintainer the effort of going through the Mercurial log
@c when researching a change.
@c 
@c * Cross referencing tip: :ref:`mod.attr` will display as ``mod.attr``,
@c while :ref:`~mod.attr` will display as ``attr``.

This article explains the new features in Python 3.4, compared to 3.3.
Python 3.4 was released on March 16, 2014.  For full details, see the
changelog@footnote{https://docs.python.org/3.4/whatsnew/changelog.html}.


@subsubheading See also


@geindex Python Enhancement Proposals; PEP 429
PEP 429@footnote{https://peps.python.org/pep-0429/} – Python 3.4 Release Schedule


@menu
* Summary – Release Highlights: Summary – Release Highlights<3>. 
* New Features: New Features<15>. 
* New Modules: New Modules<10>. 
* Improved Modules: Improved Modules<10>. 
* CPython Implementation Changes:: 
* Deprecated: Deprecated<12>. 
* Removed: Removed<12>. 
* Porting to Python 3.4: Porting to Python 3 4. 
* Changed in 3.4.3: Changed in 3 4 3. 

@end menu

@node Summary – Release Highlights<3>,New Features<15>,,What’s New In Python 3 4
@anchor{whatsnew/3 4 summary-release-highlights}@anchor{10dd}
@subsection Summary – Release Highlights


@c This section singles out the most important changes in Python 3.4.
@c Brevity is key.

New syntax features:


@itemize *

@item 
No new syntax features were added in Python 3.4.
@end itemize

Other new features:


@itemize *

@item 
@ref{10de,,pip should always be available} (
@geindex Python Enhancement Proposals; PEP 453
PEP 453@footnote{https://peps.python.org/pep-0453/}).

@item 
@ref{10df,,Newly created file descriptors are non-inheritable}
(
@geindex Python Enhancement Proposals; PEP 446
PEP 446@footnote{https://peps.python.org/pep-0446/}).

@item 
command line option for @ref{10e0,,isolated mode}
(bpo-16499@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16499}).

@item 
@ref{10e1,,improvements in the handling of codecs}
that are not text encodings (multiple issues).

@item 
@ref{10e2,,A ModuleSpec Type} for the Import System
(
@geindex Python Enhancement Proposals; PEP 451
PEP 451@footnote{https://peps.python.org/pep-0451/}).  (Affects importer authors.)

@item 
The @ref{91,,marshal} format has been made @ref{10e3,,more compact and efficient} (bpo-16475@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16475}).
@end itemize

New library modules:


@itemize *

@item 
@ref{b,,asyncio}: @ref{10e4,,New provisional API for asynchronous IO} (
@geindex Python Enhancement Proposals; PEP 3156
PEP 3156@footnote{https://peps.python.org/pep-3156/}).

@item 
@ref{59,,ensurepip}: @ref{10e5,,Bootstrapping the pip installer}
(
@geindex Python Enhancement Proposals; PEP 453
PEP 453@footnote{https://peps.python.org/pep-0453/}).

@item 
@ref{5a,,enum}: @ref{10e6,,Support for enumeration types}
(
@geindex Python Enhancement Proposals; PEP 435
PEP 435@footnote{https://peps.python.org/pep-0435/}).

@item 
@ref{a8,,pathlib}: @ref{10e7,,Object-oriented filesystem paths}
(
@geindex Python Enhancement Proposals; PEP 428
PEP 428@footnote{https://peps.python.org/pep-0428/}).

@item 
@ref{c7,,selectors}: @ref{10e8,,High-level and efficient I/O multiplexing}, built upon the @ref{c6,,select} module primitives (part
of 
@geindex Python Enhancement Proposals; PEP 3156
PEP 3156@footnote{https://peps.python.org/pep-3156/}).

@item 
@ref{d7,,statistics}: A basic @ref{10e9,,numerically stable statistics library} (
@geindex Python Enhancement Proposals; PEP 450
PEP 450@footnote{https://peps.python.org/pep-0450/}).

@item 
@ref{106,,tracemalloc}: @ref{10ea,,Trace Python memory allocations} (
@geindex Python Enhancement Proposals; PEP 454
PEP 454@footnote{https://peps.python.org/pep-0454/}).
@end itemize

Significantly improved library modules:


@itemize *

@item 
@ref{10eb,,Single-dispatch generic functions} in
@ref{63,,functools} (
@geindex Python Enhancement Proposals; PEP 443
PEP 443@footnote{https://peps.python.org/pep-0443/}).

@item 
New @ref{ab,,pickle} @ref{10ec,,protocol 4} (
@geindex Python Enhancement Proposals; PEP 3154
PEP 3154@footnote{https://peps.python.org/pep-3154/}).

@item 
@ref{98,,multiprocessing} now has @ref{10ed,,an option to avoid using os.fork on Unix} (bpo-8713@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8713}).

@item 
@ref{3f,,email} has a new submodule, @ref{41,,contentmanager}, and
a new @ref{581,,Message} subclass
(@ref{580,,EmailMessage}) that @ref{10ee,,simplify MIME handling} (bpo-18891@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18891}).

@item 
The @ref{82,,inspect} and @ref{ba,,pydoc} modules are now capable of
correct introspection of a much wider variety of callable objects,
which improves the output of the Python @ref{ada,,help()} system.

@item 
The @ref{84,,ipaddress} module API has been declared stable
@end itemize

Security improvements:


@itemize *

@item 
@ref{10ef,,Secure and interchangeable hash algorithm}
(
@geindex Python Enhancement Proposals; PEP 456
PEP 456@footnote{https://peps.python.org/pep-0456/}).

@item 
@ref{10df,,Make newly created file descriptors non-inheritable}
(
@geindex Python Enhancement Proposals; PEP 446
PEP 446@footnote{https://peps.python.org/pep-0446/}) to avoid leaking file descriptors to child processes.

@item 
New command line option for @ref{10e0,,isolated mode},
(bpo-16499@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16499}).

@item 
@ref{98,,multiprocessing} now has @ref{10ed,,an option to avoid using os.fork on Unix}.  `spawn' and `forkserver' are
more secure because they avoid sharing data with child processes.

@item 
@ref{98,,multiprocessing} child processes on Windows no longer inherit
all of the parent’s inheritable handles, only the necessary ones.

@item 
A new @ref{734,,hashlib.pbkdf2_hmac()} function provides
the PKCS#5 password-based key derivation function 2@footnote{https://en.wikipedia.org/wiki/PBKDF2}.

@item 
@ref{10f0,,TLSv1.1 and TLSv1.2 support} for @ref{d5,,ssl}.

@item 
@ref{10f1,,Retrieving certificates from the Windows system cert store support} for @ref{d5,,ssl}.

@item 
@ref{10f2,,Server-side SNI (Server Name Indication) support} for @ref{d5,,ssl}.

@item 
The @ref{355,,ssl.SSLContext} class has a @ref{10f3,,lot of improvements}.

@item 
All modules in the standard library that support SSL now support server
certificate verification, including hostname matching
(@code{ssl.match_hostname()}) and CRLs (Certificate Revocation lists, see
@ref{10f4,,ssl.SSLContext.load_verify_locations()}).
@end itemize

CPython implementation improvements:


@itemize *

@item 
@ref{10f5,,Safe object finalization} (
@geindex Python Enhancement Proposals; PEP 442
PEP 442@footnote{https://peps.python.org/pep-0442/}).

@item 
Leveraging 
@geindex Python Enhancement Proposals; PEP 442
PEP 442@footnote{https://peps.python.org/pep-0442/}, in most cases @ref{10f5,,module globals are no longer set to None during finalization} (bpo-18214@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18214}).

@item 
@ref{10f6,,Configurable memory allocators} (
@geindex Python Enhancement Proposals; PEP 445
PEP 445@footnote{https://peps.python.org/pep-0445/}).

@item 
@ref{10f7,,Argument Clinic} (
@geindex Python Enhancement Proposals; PEP 436
PEP 436@footnote{https://peps.python.org/pep-0436/}).
@end itemize

Please read on for a comprehensive list of user-facing changes, including many
other smaller improvements, CPython optimizations, deprecations, and potential
porting issues.

@node New Features<15>,New Modules<10>,Summary – Release Highlights<3>,What’s New In Python 3 4
@anchor{whatsnew/3 4 new-features}@anchor{10f8}
@subsection New Features


@menu
* PEP 453; Explicit Bootstrapping of PIP in Python Installations: PEP 453 Explicit Bootstrapping of PIP in Python Installations. 
* PEP 446; Newly Created File Descriptors Are Non-Inheritable: PEP 446 Newly Created File Descriptors Are Non-Inheritable. 
* Improvements to Codec Handling:: 
* PEP 451; A ModuleSpec Type for the Import System: PEP 451 A ModuleSpec Type for the Import System. 
* Other Language Changes: Other Language Changes<10>. 

@end menu

@node PEP 453 Explicit Bootstrapping of PIP in Python Installations,PEP 446 Newly Created File Descriptors Are Non-Inheritable,,New Features<15>
@anchor{whatsnew/3 4 pep-453-explicit-bootstrapping-of-pip-in-python-installations}@anchor{10f9}@anchor{whatsnew/3 4 whatsnew-pep-453}@anchor{10de}
@subsubsection PEP 453: Explicit Bootstrapping of PIP in Python Installations


@menu
* Bootstrapping pip By Default:: 
* Documentation Changes:: 

@end menu

@node Bootstrapping pip By Default,Documentation Changes,,PEP 453 Explicit Bootstrapping of PIP in Python Installations
@anchor{whatsnew/3 4 bootstrapping-pip-by-default}@anchor{10fa}
@subsubsection Bootstrapping pip By Default


The new @ref{59,,ensurepip} module (defined in 
@geindex Python Enhancement Proposals; PEP 453
PEP 453@footnote{https://peps.python.org/pep-0453/}) provides a standard
cross-platform mechanism to bootstrap the pip installer into Python
installations and virtual environments. The version of @code{pip} included
with Python 3.4.0 is @code{pip} 1.5.4, and future 3.4.x maintenance releases
will update the bundled version to the latest version of @code{pip} that is
available at the time of creating the release candidate.

By default, the commands @code{pipX} and @code{pipX.Y} will be installed on all
platforms (where X.Y stands for the version of the Python installation),
along with the @code{pip} Python package and its dependencies. On Windows and
in virtual environments on all platforms, the unversioned @code{pip} command
will also be installed. On other platforms, the system wide unversioned
@code{pip} command typically refers to the separately installed Python 2
version.

The @code{pyvenv} command line utility and the @ref{118,,venv}
module make use of the @ref{59,,ensurepip} module to make @code{pip} readily
available in virtual environments. When using the command line utility,
@code{pip} is installed by default, while when using the @code{venv} module
@ref{10fb,,API} installation of @code{pip} must be requested explicitly.

For CPython @ref{10fc,,source builds on POSIX systems},
the @code{make install} and @code{make altinstall} commands bootstrap @code{pip} by
default.  This behaviour can be controlled through configure options, and
overridden through Makefile options.

On Windows and Mac OS X, the CPython installers now default to installing
@code{pip} along with CPython itself (users may opt out of installing it
during the installation process). Window users will need to opt in to the
automatic @code{PATH} modifications to have @code{pip} available from the command
line by default, otherwise it can still be accessed through the Python
launcher for Windows as @code{py -m pip}.

As 
@geindex Python Enhancement Proposals; PEP 0453#recommendations-for-downstream-distributors
discussed in the PEP@footnote{https://peps.python.org/pep-0453/#recommendations-for-downstream-distributors}
platform packagers may choose not to install
these commands by default, as long as, when invoked, they provide clear and
simple directions on how to install them on that platform (usually using
the system package manager).

@cartouche
@quotation Note 
To avoid conflicts between parallel Python 2 and Python 3 installations,
only the versioned @code{pip3} and @code{pip3.4} commands are bootstrapped by
default when @code{ensurepip} is invoked directly - the @code{--default-pip}
option is needed to also request the unversioned @code{pip} command.
@code{pyvenv} and the Windows installer ensure that the unqualified @code{pip}
command is made available in those environments, and @code{pip} can always be
invoked via the @code{-m} switch rather than directly to avoid ambiguity on
systems with multiple Python installations.
@end quotation
@end cartouche

@node Documentation Changes,,Bootstrapping pip By Default,PEP 453 Explicit Bootstrapping of PIP in Python Installations
@anchor{whatsnew/3 4 documentation-changes}@anchor{10fd}
@subsubsection Documentation Changes


As part of this change, the @ref{10fe,,Installing Python modules} and
distributing-index sections of the documentation have been
completely redesigned as short getting started and FAQ documents. Most
packaging documentation has now been moved out to the Python Packaging
Authority maintained Python Packaging User Guide@footnote{https://packaging.python.org} and the documentation of the individual
projects.

However, as this migration is currently still incomplete, the legacy
versions of those guides remaining available as @ref{10ff,,Building C and C++ Extensions with setuptools}
and @ref{1100,,Building C and C++ Extensions with setuptools}.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 453

@item PEP 453@footnote{https://peps.python.org/pep-0453/} – Explicit bootstrapping of pip in Python installations

PEP written by Donald Stufft and Nick Coghlan, implemented by
Donald Stufft, Nick Coghlan, Martin von Löwis and Ned Deily.
@end table


@node PEP 446 Newly Created File Descriptors Are Non-Inheritable,Improvements to Codec Handling,PEP 453 Explicit Bootstrapping of PIP in Python Installations,New Features<15>
@anchor{whatsnew/3 4 pep-446-newly-created-file-descriptors-are-non-inheritable}@anchor{1101}@anchor{whatsnew/3 4 whatsnew-pep-446}@anchor{10df}
@subsubsection PEP 446: Newly Created File Descriptors Are Non-Inheritable


@geindex Python Enhancement Proposals; PEP 446
PEP 446@footnote{https://peps.python.org/pep-0446/} makes newly created file descriptors @ref{1102,,non-inheritable}.  In general, this is the behavior an application will
want: when launching a new process, having currently open files also
open in the new process can lead to all sorts of hard to find bugs,
and potentially to security issues.

However, there are occasions when inheritance is desired.  To support
these cases, the following new functions and methods are available:


@itemize *

@item 
@ref{1103,,os.get_inheritable()}, @ref{1104,,os.set_inheritable()}

@item 
@ref{1105,,os.get_handle_inheritable()}, @ref{1106,,os.set_handle_inheritable()}

@item 
@ref{1107,,socket.socket.get_inheritable()}, @ref{1108,,socket.socket.set_inheritable()}
@end itemize


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 446

@item PEP 446@footnote{https://peps.python.org/pep-0446/} – Make newly created file descriptors non-inheritable

PEP written and implemented by Victor Stinner.
@end table


@node Improvements to Codec Handling,PEP 451 A ModuleSpec Type for the Import System,PEP 446 Newly Created File Descriptors Are Non-Inheritable,New Features<15>
@anchor{whatsnew/3 4 codec-handling-improvements}@anchor{10e1}@anchor{whatsnew/3 4 improvements-to-codec-handling}@anchor{1109}
@subsubsection Improvements to Codec Handling


Since it was first introduced, the @ref{1c,,codecs} module has always been
intended to operate as a type-neutral dynamic encoding and decoding
system. However, its close coupling with the Python text model, especially
the type restricted convenience methods on the builtin @ref{16a,,str},
@ref{193,,bytes} and @ref{342,,bytearray} types, has historically obscured that
fact.

As a key step in clarifying the situation, the @ref{110a,,codecs.encode()} and
@ref{110b,,codecs.decode()} convenience functions are now properly documented in
Python 2.7, 3.3 and 3.4. These functions have existed in the @ref{1c,,codecs}
module (and have been covered by the regression test suite) since Python 2.4,
but were previously only discoverable through runtime introspection.

Unlike the convenience methods on @ref{16a,,str}, @ref{193,,bytes} and
@ref{342,,bytearray}, the @ref{1c,,codecs} convenience functions support arbitrary
codecs in both Python 2 and Python 3, rather than being limited to Unicode text
encodings (in Python 3) or @code{basestring} <-> @code{basestring} conversions (in
Python 2).

In Python 3.4, the interpreter is able to identify the known non-text
encodings provided in the standard library and direct users towards these
general purpose convenience functions when appropriate:

@example
>>> b"abcdef".decode("hex")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
LookupError: 'hex' is not a text encoding; use codecs.decode() to handle arbitrary codecs

>>> "hello".encode("rot13")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
LookupError: 'rot13' is not a text encoding; use codecs.encode() to handle arbitrary codecs

>>> open("foo.txt", encoding="hex")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
LookupError: 'hex' is not a text encoding; use codecs.open() to handle arbitrary codecs
@end example

In a related change, whenever it is feasible without breaking backwards
compatibility, exceptions raised during encoding and decoding operations
are wrapped in a chained exception of the same type that mentions the
name of the codec responsible for producing the error:

@example
>>> import codecs

>>> codecs.decode(b"abcdefgh", "hex")
Traceback (most recent call last):
  File "/usr/lib/python3.4/encodings/hex_codec.py", line 20, in hex_decode
    return (binascii.a2b_hex(input), len(input))
binascii.Error: Non-hexadecimal digit found

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
binascii.Error: decoding with 'hex' codec failed (Error: Non-hexadecimal digit found)

>>> codecs.encode("hello", "bz2")
Traceback (most recent call last):
  File "/usr/lib/python3.4/encodings/bz2_codec.py", line 17, in bz2_encode
    return (bz2.compress(input), len(input))
  File "/usr/lib/python3.4/bz2.py", line 498, in compress
    return comp.compress(data) + comp.flush()
TypeError: 'str' does not support the buffer interface

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: encoding with 'bz2' codec failed (TypeError: 'str' does not support the buffer interface)
@end example

Finally, as the examples above show, these improvements have permitted
the restoration of the convenience aliases for the non-Unicode codecs that
were themselves restored in Python 3.2. This means that encoding binary data
to and from its hexadecimal representation (for example) can now be written
as:

@example
>>> from codecs import encode, decode
>>> encode(b"hello", "hex")
b'68656c6c6f'
>>> decode(b"68656c6c6f", "hex")
b'hello'
@end example

The binary and text transforms provided in the standard library are detailed
in @ref{110c,,Binary Transforms} and @ref{110d,,Text Transforms}.

(Contributed by Nick Coghlan in bpo-7475@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7475}, bpo-17827@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17827},
bpo-17828@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17828} and bpo-19619@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19619}.)

@node PEP 451 A ModuleSpec Type for the Import System,Other Language Changes<10>,Improvements to Codec Handling,New Features<15>
@anchor{whatsnew/3 4 pep-451-a-modulespec-type-for-the-import-system}@anchor{110e}@anchor{whatsnew/3 4 whatsnew-pep-451}@anchor{10e2}
@subsubsection PEP 451: A ModuleSpec Type for the Import System


@geindex Python Enhancement Proposals; PEP 451
PEP 451@footnote{https://peps.python.org/pep-0451/} provides an encapsulation of the information about a module that the
import machinery will use to load it (that is, a module specification).  This
helps simplify both the import implementation and several import-related APIs.
The change is also a stepping stone for several future import-related improvements@footnote{https://mail.python.org/pipermail/python-dev/2013-November/130111.html}.

The public-facing changes from the PEP are entirely backward-compatible.
Furthermore, they should be transparent to everyone but importer authors.  Key
finder and loader methods have been deprecated, but they will continue working.
New importers should use the new methods described in the PEP.  Existing
importers should be updated to implement the new methods.  See the
@ref{110f,,Deprecated} section for a list of methods that should be replaced and
their replacements.

@node Other Language Changes<10>,,PEP 451 A ModuleSpec Type for the Import System,New Features<15>
@anchor{whatsnew/3 4 other-language-changes}@anchor{1110}
@subsubsection Other Language Changes


Some smaller changes made to the core Python language are:


@itemize *

@item 
Unicode database updated to UCD version 6.3.

@item 
@ref{1111,,min()} and @ref{1112,,max()} now accept a `default' keyword-only argument that
can be used to specify the value they return if the iterable they are
evaluating has no elements.  (Contributed by Julian Berman in
bpo-18111@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18111}.)

@item 
Module objects are now @ref{1113,,weakly referenceable}.

@item 
Module @code{__file__} attributes (and related values) should now always
contain absolute paths by default, with the sole exception of
@code{__main__.__file__} when a script has been executed directly using
a relative path.  (Contributed by Brett Cannon in bpo-18416@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18416}.)

@item 
All the UTF-* codecs (except UTF-7) now reject surrogates during both
encoding and decoding unless the @code{surrogatepass} error handler is used,
with the exception of the UTF-16 decoder (which accepts valid surrogate pairs)
and the UTF-16 encoder (which produces them while encoding non-BMP characters).
(Contributed by Victor Stinner, Kang-Hao (Kenny) Lu and Serhiy Storchaka in
bpo-12892@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12892}.)

@item 
New German EBCDIC @ref{fbe,,codec} @code{cp273}.  (Contributed
by Michael Bierenfeld and Andrew Kuchling in bpo-1097797@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1097797}.)

@item 
New Ukrainian @ref{fbe,,codec} @code{cp1125}.  (Contributed by
Serhiy Storchaka in bpo-19668@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19668}.)

@item 
@ref{193,,bytes}.join() and @ref{342,,bytearray}.join() now accept arbitrary
buffer objects as arguments.  (Contributed by Antoine Pitrou in
bpo-15958@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15958}.)

@item 
The @ref{19c,,int} constructor now accepts any object that has an @code{__index__}
method for its `base' argument.  (Contributed by Mark Dickinson in
bpo-16772@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16772}.)

@item 
Frame objects now have a @ref{585,,clear()} method that clears all
references to local variables from the frame.  (Contributed by Antoine Pitrou
in bpo-17934@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17934}.)

@item 
@ref{166,,memoryview} is now registered as a @ref{1f,,Sequence},
and supports the @ref{a6b,,reversed()} builtin.  (Contributed by Nick Coghlan
and Claudiu Popa in bpo-18690@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18690} and bpo-19078@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19078}.)

@item 
Signatures reported by @ref{ada,,help()} have been modified and improved in
several cases as a result of the introduction of Argument Clinic and other
changes to the @ref{82,,inspect} and @ref{ba,,pydoc} modules.

@item 
@ref{1114,,__length_hint__()} is now part of the formal language
specification (see 
@geindex Python Enhancement Proposals; PEP 424
PEP 424@footnote{https://peps.python.org/pep-0424/}).  (Contributed by Armin Ronacher in
bpo-16148@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16148}.)
@end itemize

@node New Modules<10>,Improved Modules<10>,New Features<15>,What’s New In Python 3 4
@anchor{whatsnew/3 4 new-modules}@anchor{1115}
@subsection New Modules


@menu
* asyncio: asyncio<14>. 
* ensurepip: ensurepip<2>. 
* enum: enum<9>. 
* pathlib: pathlib<14>. 
* selectors: selectors<2>. 
* statistics: statistics<6>. 
* tracemalloc: tracemalloc<4>. 

@end menu

@node asyncio<14>,ensurepip<2>,,New Modules<10>
@anchor{whatsnew/3 4 asyncio}@anchor{1116}@anchor{whatsnew/3 4 whatsnew-asyncio}@anchor{10e4}
@subsubsection asyncio


The new @ref{b,,asyncio} module (defined in 
@geindex Python Enhancement Proposals; PEP 3156
PEP 3156@footnote{https://peps.python.org/pep-3156/}) provides a standard
pluggable event loop model for Python, providing solid asynchronous IO
support in the standard library, and making it easier for other event loop
implementations to interoperate with the standard library and each other.

For Python 3.4, this module is considered a @ref{3cf,,provisional API}.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 3156

@item PEP 3156@footnote{https://peps.python.org/pep-3156/} – Asynchronous IO Support Rebooted: the “asyncio” Module

PEP written and implementation led by Guido van Rossum.
@end table


@node ensurepip<2>,enum<9>,asyncio<14>,New Modules<10>
@anchor{whatsnew/3 4 ensurepip}@anchor{1117}@anchor{whatsnew/3 4 whatsnew-ensurepip}@anchor{10e5}
@subsubsection ensurepip


The new @ref{59,,ensurepip} module is the primary infrastructure for the
@geindex Python Enhancement Proposals; PEP 453
PEP 453@footnote{https://peps.python.org/pep-0453/} implementation.  In the normal course of events end users will not
need to interact with this module, but it can be used to manually bootstrap
@code{pip} if the automated bootstrapping into an installation or virtual
environment was declined.

@ref{59,,ensurepip} includes a bundled copy of @code{pip}, up-to-date as of the first
release candidate of the release of CPython with which it ships (this applies
to both maintenance releases and feature releases).  @code{ensurepip} does not
access the internet.  If the installation has internet access, after
@code{ensurepip} is run the bundled @code{pip} can be used to upgrade @code{pip} to a
more recent release than the bundled one.  (Note that such an upgraded version
of @code{pip} is considered to be a separately installed package and will not be
removed if Python is uninstalled.)

The module is named `ensure'pip because if called when @code{pip} is already
installed, it does nothing.  It also has an @code{--upgrade} option that will
cause it to install the bundled copy of @code{pip} if the existing installed
version of @code{pip} is older than the bundled copy.

@node enum<9>,pathlib<14>,ensurepip<2>,New Modules<10>
@anchor{whatsnew/3 4 enum}@anchor{1118}@anchor{whatsnew/3 4 whatsnew-enum}@anchor{10e6}
@subsubsection enum


The new @ref{5a,,enum} module (defined in 
@geindex Python Enhancement Proposals; PEP 435
PEP 435@footnote{https://peps.python.org/pep-0435/}) provides a standard
implementation of enumeration types, allowing other modules (such as
@ref{d1,,socket}) to provide more informative error messages and better
debugging support by replacing opaque integer constants with backwards
compatible enumeration values.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 435

@item PEP 435@footnote{https://peps.python.org/pep-0435/} – Adding an Enum type to the Python standard library

PEP written by Barry Warsaw, Eli Bendersky and Ethan Furman,
implemented by Ethan Furman.
@end table


@node pathlib<14>,selectors<2>,enum<9>,New Modules<10>
@anchor{whatsnew/3 4 pathlib}@anchor{1119}@anchor{whatsnew/3 4 whatsnew-pathlib}@anchor{10e7}
@subsubsection pathlib


The new @ref{a8,,pathlib} module offers classes representing filesystem paths
with semantics appropriate for different operating systems.  Path classes are
divided between `pure paths', which provide purely computational operations
without I/O, and `concrete paths', which inherit from pure paths but also
provide I/O operations.

For Python 3.4, this module is considered a @ref{3cf,,provisional API}.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 428

@item PEP 428@footnote{https://peps.python.org/pep-0428/} – The pathlib module – object-oriented filesystem paths

PEP written and implemented by Antoine Pitrou.
@end table


@node selectors<2>,statistics<6>,pathlib<14>,New Modules<10>
@anchor{whatsnew/3 4 selectors}@anchor{111a}@anchor{whatsnew/3 4 whatsnew-selectors}@anchor{10e8}
@subsubsection selectors


The new @ref{c7,,selectors} module (created as part of implementing 
@geindex Python Enhancement Proposals; PEP 3156
PEP 3156@footnote{https://peps.python.org/pep-3156/})
allows high-level and efficient I/O multiplexing, built upon the
@ref{c6,,select} module primitives.

@node statistics<6>,tracemalloc<4>,selectors<2>,New Modules<10>
@anchor{whatsnew/3 4 statistics}@anchor{111b}@anchor{whatsnew/3 4 whatsnew-statistics}@anchor{10e9}
@subsubsection statistics


The new @ref{d7,,statistics} module (defined in 
@geindex Python Enhancement Proposals; PEP 450
PEP 450@footnote{https://peps.python.org/pep-0450/}) offers some core
statistics functionality directly in the standard library. This module
supports calculation of the mean, median, mode, variance and standard
deviation of a data series.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 450

@item PEP 450@footnote{https://peps.python.org/pep-0450/} – Adding A Statistics Module To The Standard Library

PEP written and implemented by Steven D’Aprano
@end table


@node tracemalloc<4>,,statistics<6>,New Modules<10>
@anchor{whatsnew/3 4 tracemalloc}@anchor{111c}@anchor{whatsnew/3 4 whatsnew-tracemalloc}@anchor{10ea}
@subsubsection tracemalloc


The new @ref{106,,tracemalloc} module (defined in 
@geindex Python Enhancement Proposals; PEP 454
PEP 454@footnote{https://peps.python.org/pep-0454/}) is a debug tool to
trace memory blocks allocated by Python. It provides the following information:


@itemize *

@item 
Trace where an object was allocated

@item 
Statistics on allocated memory blocks per filename and per line number:
total size, number and average size of allocated memory blocks

@item 
Compute the differences between two snapshots to detect memory leaks
@end itemize


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 454

@item PEP 454@footnote{https://peps.python.org/pep-0454/} – Add a new tracemalloc module to trace Python memory allocations

PEP written and implemented by Victor Stinner
@end table


@node Improved Modules<10>,CPython Implementation Changes,New Modules<10>,What’s New In Python 3 4
@anchor{whatsnew/3 4 improved-modules}@anchor{111d}
@subsection Improved Modules


@menu
* abc:: 
* aifc: aifc<2>. 
* argparse: argparse<7>. 
* audioop:: 
* base64: base64<4>. 
* collections: collections<6>. 
* colorsys:: 
* contextlib: contextlib<6>. 
* dbm: dbm<6>. 
* dis: dis<5>. 
* doctest: doctest<4>. 
* email: email<5>. 
* filecmp:: 
* functools: functools<6>. 
* gc: gc<7>. 
* glob: glob<4>. 
* hashlib: hashlib<6>. 
* hmac: hmac<4>. 
* html:: 
* http: http<4>. 
* idlelib and IDLE: idlelib and IDLE<4>. 
* importlib: importlib<9>. 
* inspect: inspect<9>. 
* ipaddress: ipaddress<5>. 
* logging: logging<6>. 
* marshal: marshal<2>. 
* mmap: mmap<3>. 
* multiprocessing: multiprocessing<8>. 
* operator: operator<4>. 
* os: os<12>. 
* pdb: pdb<8>. 
* pickle: pickle<5>. 
* plistlib: plistlib<2>. 
* poplib: poplib<3>. 
* pprint: pprint<4>. 
* pty: pty<2>. 
* pydoc: pydoc<5>. 
* re: re<9>. 
* resource:: 
* select:: 
* shelve: shelve<2>. 
* shutil: shutil<6>. 
* smtpd: smtpd<3>. 
* smtplib: smtplib<3>. 
* socket: socket<10>. 
* sqlite3: sqlite3<10>. 
* ssl: ssl<11>. 
* stat:: 
* struct: struct<3>. 
* subprocess: subprocess<5>. 
* sunau: sunau<2>. 
* sys: sys<12>. 
* tarfile: tarfile<8>. 
* textwrap: textwrap<2>. 
* threading: threading<8>. 
* traceback: traceback<6>. 
* types: types<7>. 
* urllib: urllib<5>. 
* unittest: unittest<10>. 
* venv: venv<7>. 
* wave: wave<2>. 
* weakref: weakref<2>. 
* xml.etree: xml etree<2>. 
* zipfile: zipfile<6>. 

@end menu

@node abc,aifc<2>,,Improved Modules<10>
@anchor{whatsnew/3 4 abc}@anchor{111e}
@subsubsection abc


New function @ref{111f,,abc.get_cache_token()} can be used to know when to invalidate
caches that are affected by changes in the object graph.  (Contributed
by Łukasz Langa in bpo-16832@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16832}.)

New class @ref{1120,,ABC} has @ref{1121,,ABCMeta} as its meta class.
Using @code{ABC} as a base class has essentially the same effect as specifying
@code{metaclass=abc.ABCMeta}, but is simpler to type and easier to read.
(Contributed by Bruno Dupuis in bpo-16049@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16049}.)

@node aifc<2>,argparse<7>,abc,Improved Modules<10>
@anchor{whatsnew/3 4 aifc}@anchor{1122}
@subsubsection aifc


The @code{getparams()} method now returns a namedtuple rather than a
plain tuple.  (Contributed by Claudiu Popa in bpo-17818@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17818}.)

@code{aifc.open()} now supports the context management protocol: when used in a
@ref{187,,with} block, the @code{close()} method of the returned
object will be called automatically at the end of the block.  (Contributed by
Serhiy Storchacha in bpo-16486@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16486}.)

The @code{writeframesraw()} and @code{writeframes()}
methods now accept any @ref{194,,bytes-like object}.  (Contributed by Serhiy
Storchaka in bpo-8311@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8311}.)

@node argparse<7>,audioop,aifc<2>,Improved Modules<10>
@anchor{whatsnew/3 4 argparse}@anchor{1123}
@subsubsection argparse


The @ref{30e,,FileType} class now accepts `encoding' and
`errors' arguments, which are passed through to @ref{318,,open()}.  (Contributed
by Lucas Maystre in bpo-11175@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11175}.)

@node audioop,base64<4>,argparse<7>,Improved Modules<10>
@anchor{whatsnew/3 4 audioop}@anchor{1124}
@subsubsection audioop


@code{audioop} now supports 24-bit samples.  (Contributed by Serhiy Storchaka
in bpo-12866@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12866}.)

New @code{byteswap()} function converts big-endian samples to
little-endian and vice versa.  (Contributed by Serhiy Storchaka in
bpo-19641@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19641}.)

All @code{audioop} functions now accept any @ref{194,,bytes-like object}.  Strings
are not accepted: they didn’t work before, now they raise an error right away.
(Contributed by Serhiy Storchaka in bpo-16685@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16685}.)

@node base64<4>,collections<6>,audioop,Improved Modules<10>
@anchor{whatsnew/3 4 base64}@anchor{1125}
@subsubsection base64


The encoding and decoding functions in @ref{f,,base64} now accept any
@ref{194,,bytes-like object} in cases where it previously required a
@ref{193,,bytes} or @ref{342,,bytearray} instance.  (Contributed by Nick Coghlan in
bpo-17839@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17839}.)

New functions @ref{1126,,a85encode()}, @ref{1127,,a85decode()},
@ref{1128,,b85encode()}, and @ref{1129,,b85decode()} provide the ability to
encode and decode binary data from and to @code{Ascii85} and the git/mercurial
@code{Base85} formats, respectively.  The @code{a85} functions have options that can
be used to make them compatible with the variants of the @code{Ascii85} encoding,
including the Adobe variant.  (Contributed by Martin Morrison, the Mercurial
project, Serhiy Storchaka, and Antoine Pitrou in bpo-17618@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17618}.)

@node collections<6>,colorsys,base64<4>,Improved Modules<10>
@anchor{whatsnew/3 4 collections}@anchor{112a}
@subsubsection collections


The @ref{112b,,ChainMap.new_child()} method now accepts an `m' argument specifying
the child map to add to the chain.  This allows an existing mapping and/or a
custom mapping type to be used for the child.  (Contributed by Vinay Sajip in
bpo-16613@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16613}.)

@node colorsys,contextlib<6>,collections<6>,Improved Modules<10>
@anchor{whatsnew/3 4 colorsys}@anchor{112c}
@subsubsection colorsys


The number of digits in the coefficients for the RGB — YIQ conversions have
been expanded so that they match the FCC NTSC versions.  The change in
results should be less than 1% and may better match results found elsewhere.
(Contributed by Brian Landers and Serhiy Storchaka in bpo-14323@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14323}.)

@node contextlib<6>,dbm<6>,colorsys,Improved Modules<10>
@anchor{whatsnew/3 4 contextlib}@anchor{112d}
@subsubsection contextlib


The new @ref{112e,,contextlib.suppress} context manager helps to clarify the
intent of code that deliberately suppresses exceptions from a single
statement.  (Contributed by Raymond Hettinger in bpo-15806@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15806} and
Zero Piraeus in bpo-19266@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19266}.)

The new @ref{fed,,contextlib.redirect_stdout()} context manager makes it easier
for utility scripts to handle inflexible APIs that write their output to
@ref{cd3,,sys.stdout} and don’t provide any options to redirect it.  Using the
context manager, the @code{sys.stdout} output can be redirected to any
other stream or, in conjunction with @ref{112f,,io.StringIO}, to a string.
The latter can be especially useful, for example, to capture output
from a function that was written to implement a command line interface.
It is recommended only for utility scripts because it affects the
global state of @code{sys.stdout}.  (Contributed by Raymond Hettinger
in bpo-15805@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15805}.)

The @ref{27,,contextlib} documentation has also been updated to include a
@ref{1130,,discussion} of the
differences between single use, reusable and reentrant context managers.

@node dbm<6>,dis<5>,contextlib<6>,Improved Modules<10>
@anchor{whatsnew/3 4 dbm}@anchor{1131}
@subsubsection dbm


@ref{1132,,dbm.open()} objects now support the context management protocol.  When
used in a @ref{187,,with} statement, the @code{close} method of the database
object will be called automatically at the end of the block.  (Contributed by
Claudiu Popa and Nick Coghlan in bpo-19282@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19282}.)

@node dis<5>,doctest<4>,dbm<6>,Improved Modules<10>
@anchor{whatsnew/3 4 dis}@anchor{1133}
@subsubsection dis


Functions @ref{1134,,show_code()}, @ref{207,,dis()}, @ref{208,,distb()}, and
@ref{209,,disassemble()} now accept a keyword-only `file' argument that
controls where they write their output.

The @ref{3c,,dis} module is now built around an @ref{205,,Instruction} class
that provides object oriented access to the details of each individual bytecode
operation.

A new method, @ref{4ed,,get_instructions()}, provides an iterator that emits
the Instruction stream for a given piece of Python code.  Thus it is now
possible to write a program that inspects and manipulates a bytecode
object in ways different from those provided by the @ref{3c,,dis} module
itself.  For example:

@example
>>> import dis
>>> for instr in dis.get_instructions(lambda x: x + 1):
...     print(instr.opname)
LOAD_FAST
LOAD_CONST
BINARY_ADD
RETURN_VALUE
@end example

The various display tools in the @ref{3c,,dis} module have been rewritten to use
these new components.

In addition, a new application-friendly class @ref{206,,Bytecode} provides
an object-oriented API for inspecting bytecode in both in human-readable form
and for iterating over instructions.  The @code{Bytecode} constructor
takes the same arguments that @ref{4ed,,get_instructions()} does (plus an
optional `current_offset'), and the resulting object can be iterated to produce
@ref{205,,Instruction} objects.  But it also has a @ref{1135,,dis}
method, equivalent to calling @ref{207,,dis} on the constructor argument, but
returned as a multi-line string:

@example
>>> bytecode = dis.Bytecode(lambda x: x + 1, current_offset=3)
>>> for instr in bytecode:
...     print('@{@} (@{@})'.format(instr.opname, instr.opcode))
LOAD_FAST (124)
LOAD_CONST (100)
BINARY_ADD (23)
RETURN_VALUE (83)
>>> bytecode.dis().splitlines()
['  1           0 LOAD_FAST                0 (x)',
 '      -->     3 LOAD_CONST               1 (1)',
 '              6 BINARY_ADD',
 '              7 RETURN_VALUE']
@end example

@ref{206,,Bytecode} also has a class method,
@ref{1136,,from_traceback()}, that provides the ability to manipulate a
traceback (that is, @code{print(Bytecode.from_traceback(tb).dis())} is equivalent
to @code{distb(tb)}).

(Contributed by Nick Coghlan, Ryan Kelly and Thomas Kluyver in bpo-11816@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11816}
and Claudiu Popa in bpo-17916@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17916}.)

New function @ref{1137,,stack_effect()} computes the effect on the Python stack
of a given opcode and argument, information that is not otherwise available.
(Contributed by Larry Hastings in bpo-19722@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19722}.)

@node doctest<4>,email<5>,dis<5>,Improved Modules<10>
@anchor{whatsnew/3 4 doctest}@anchor{1138}
@subsubsection doctest


A new @ref{1139,,option flag}, @ref{113a,,FAIL_FAST}, halts
test running as soon as the first failure is detected.  (Contributed by R.
David Murray and Daniel Urban in bpo-16522@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16522}.)

The @ref{3e,,doctest} command line interface now uses @ref{7,,argparse}, and has two
new options, @code{-o} and @code{-f}.  @code{-o} allows @ref{1139,,doctest options} to be specified on the command line, and @code{-f} is a
shorthand for @code{-o FAIL_FAST} (to parallel the similar option supported by the
@ref{10d,,unittest} CLI).  (Contributed by R. David Murray in bpo-11390@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11390}.)

@ref{3e,,doctest} will now find doctests in extension module @code{__doc__} strings.
(Contributed by Zachary Ware in bpo-3158@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3158}.)

@node email<5>,filecmp,doctest<4>,Improved Modules<10>
@anchor{whatsnew/3 4 email}@anchor{113b}
@subsubsection email


@ref{113c,,as_string()} now accepts a `policy' argument to
override the default policy of the message when generating a string
representation of it.  This means that @code{as_string} can now be used in more
circumstances, instead of having to create and use a @ref{44,,generator} in
order to pass formatting parameters to its @code{flatten} method.  (Contributed by
R. David Murray in bpo-18600@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18600}.)

New method @ref{113d,,as_bytes()} added to produce a bytes
representation of the message in a fashion similar to how @code{as_string}
produces a string representation.  It does not accept the `maxheaderlen'
argument, but does accept the `unixfrom' and `policy' arguments. The
@ref{581,,Message} @ref{113e,,__bytes__()} method
calls it, meaning that @code{bytes(mymsg)} will now produce the intuitive
result:  a bytes object containing the fully formatted message.  (Contributed
by R. David Murray in bpo-18600@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18600}.)

The @ref{113f,,Message.set_param()} message now accepts a `replace' keyword argument.
When specified, the associated header will be updated without changing
its location in the list of headers.  For backward compatibility, the default
is @code{False}.  (Contributed by R. David Murray in bpo-18891@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18891}.)
@anchor{whatsnew/3 4 whatsnew-email-contentmanager}@anchor{10ee}
A pair of new subclasses of @ref{581,,Message} have been added
(@ref{580,,EmailMessage} and @ref{1140,,MIMEPart}), along with a new sub-module,
@ref{41,,contentmanager} and a new @ref{53,,policy} attribute
@ref{1141,,content_manager}.  All documentation is
currently in the new module, which is being added as part of email’s new
@ref{3cf,,provisional API}.  These classes provide a number of new methods that
make extracting content from and inserting content into email messages much
easier.  For details, see the @code{contentmanager} documentation and
the @ref{1142,,email; Examples}.  These API additions complete the
bulk of the work that was planned as part of the email6 project.  The currently
provisional API is scheduled to become final in Python 3.5 (possibly with a few
minor additions in the area of error handling).  (Contributed by R. David
Murray in bpo-18891@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18891}.)

@node filecmp,functools<6>,email<5>,Improved Modules<10>
@anchor{whatsnew/3 4 filecmp}@anchor{1143}
@subsubsection filecmp


A new @ref{1144,,clear_cache()} function provides the ability to clear the
@ref{5e,,filecmp} comparison cache, which uses @ref{26f,,os.stat()} information to
determine if the file has changed since the last compare.  This can be used,
for example, if the file might have been changed and re-checked in less time
than the resolution of a particular filesystem’s file modification time field.
(Contributed by Mark Levitt in bpo-18149@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18149}.)

New module attribute @ref{1145,,DEFAULT_IGNORES} provides the list of
directories that are used as the default value for the `ignore' parameter of
the @ref{1146,,dircmp()} function.  (Contributed by Eli Bendersky in
bpo-15442@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15442}.)

@node functools<6>,gc<7>,filecmp,Improved Modules<10>
@anchor{whatsnew/3 4 functools}@anchor{1147}
@subsubsection functools


The new @ref{21a,,partialmethod()} descriptor brings partial argument
application to descriptors, just as @ref{219,,partial()} provides
for normal callables. The new descriptor also makes it easier to get
arbitrary callables (including @code{partial()} instances)
to behave like normal instance methods when included in a class definition.
(Contributed by Alon Horev and Nick Coghlan in bpo-4331@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4331}.)
@anchor{whatsnew/3 4 whatsnew-singledispatch}@anchor{10eb}
The new @ref{84c,,singledispatch()} decorator brings support for
single-dispatch generic functions to the Python standard library. Where
object oriented programming focuses on grouping multiple operations on a
common set of data into a class, a generic function focuses on grouping
multiple implementations of an operation that allows it to work with
`different' kinds of data.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 443

@item PEP 443@footnote{https://peps.python.org/pep-0443/} – Single-dispatch generic functions

PEP written and implemented by Łukasz Langa.
@end table


@ref{1148,,total_ordering()} now supports a return value of
@ref{1a3,,NotImplemented} from the underlying comparison function.  (Contributed
by Katie Miller in bpo-10042@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10042}.)

A pure-python version of the @ref{219,,partial()} function is now in the
stdlib; in CPython it is overridden by the C accelerated version, but it is
available for other implementations to use.  (Contributed by Brian Thorne in
bpo-12428@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12428}.)

@node gc<7>,glob<4>,functools<6>,Improved Modules<10>
@anchor{whatsnew/3 4 gc}@anchor{1149}
@subsubsection gc


New function @ref{2de,,get_stats()} returns a list of three per-generation
dictionaries containing the collections statistics since interpreter startup.
(Contributed by Antoine Pitrou in bpo-16351@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16351}.)

@node glob<4>,hashlib<6>,gc<7>,Improved Modules<10>
@anchor{whatsnew/3 4 glob}@anchor{114a}
@subsubsection glob


A new function @ref{114b,,escape()} provides a way to escape special characters
in a filename so that they do not become part of the globbing expansion but are
instead matched literally.  (Contributed by Serhiy Storchaka in bpo-8402@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8402}.)

@node hashlib<6>,hmac<4>,glob<4>,Improved Modules<10>
@anchor{whatsnew/3 4 hashlib}@anchor{114c}
@subsubsection hashlib


A new @ref{734,,hashlib.pbkdf2_hmac()} function provides
the PKCS#5 password-based key derivation function 2@footnote{https://en.wikipedia.org/wiki/PBKDF2}.  (Contributed by Christian
Heimes in bpo-18582@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18582}.)

The @ref{114d,,name} attribute of @ref{6c,,hashlib} hash objects is now
a formally supported interface.  It has always existed in CPython’s
@code{hashlib} (although it did not return lower case names for all supported
hashes), but it was not a public interface and so some other Python
implementations have not previously supported it.  (Contributed by Jason R.
Coombs in bpo-18532@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18532}.)

@node hmac<4>,html,hashlib<6>,Improved Modules<10>
@anchor{whatsnew/3 4 hmac}@anchor{114e}
@subsubsection hmac


@ref{6e,,hmac} now accepts @code{bytearray} as well as @code{bytes} for the `key'
argument to the @ref{c9c,,new()} function, and the `msg' parameter to both the
@code{new()} function and the @ref{114f,,update()} method now
accepts any type supported by the @ref{6c,,hashlib} module.  (Contributed
by Jonas Borgström in bpo-18240@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18240}.)

The `digestmod' argument to the @ref{c9c,,hmac.new()} function may now be any hash
digest name recognized by @ref{6c,,hashlib}.  In addition, the current behavior in
which the value of `digestmod' defaults to @code{MD5} is deprecated: in a
future version of Python there will be no default value.  (Contributed by
Christian Heimes in bpo-17276@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17276}.)

With the addition of @ref{1150,,block_size} and @ref{1151,,name}
attributes (and the formal documentation of the @ref{1152,,digest_size}
attribute), the @ref{6e,,hmac} module now conforms fully to the 
@geindex Python Enhancement Proposals; PEP 247
PEP 247@footnote{https://peps.python.org/pep-0247/} API.
(Contributed by Christian Heimes in bpo-18775@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18775}.)

@node html,http<4>,hmac<4>,Improved Modules<10>
@anchor{whatsnew/3 4 html}@anchor{1153}
@subsubsection html


New function @ref{b56,,unescape()} function converts HTML5 character references to
the corresponding Unicode characters.  (Contributed by Ezio Melotti in
bpo-2927@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2927}.)

@ref{a7d,,HTMLParser} accepts a new keyword argument
`convert_charrefs' that, when @code{True}, automatically converts all character
references.  For backward-compatibility, its value defaults to @code{False}, but
it will change to @code{True} in a future version of Python, so you are invited to
set it explicitly and update your code to use this new feature.  (Contributed
by Ezio Melotti in bpo-13633@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13633}.)

The `strict' argument of @ref{a7d,,HTMLParser} is now deprecated.
(Contributed by Ezio Melotti in bpo-15114@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15114}.)

@node http<4>,idlelib and IDLE<4>,html,Improved Modules<10>
@anchor{whatsnew/3 4 http}@anchor{1154}
@subsubsection http


@ref{1155,,send_error()} now accepts an
optional additional `explain' parameter which can be used to provide an
extended error description, overriding the hardcoded default if there is one.
This extended error description will be formatted using the
@ref{1156,,error_message_format} attribute
and sent as the body of the error response.
(Contributed by Karl Cow in bpo-12921@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12921}.)

The @ref{76,,http.server} @ref{1157,,command line interface} now has
a @code{-b/--bind} option that causes the server to listen on a specific address.
(Contributed by Malte Swart in bpo-17764@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17764}.)

@node idlelib and IDLE<4>,importlib<9>,http<4>,Improved Modules<10>
@anchor{whatsnew/3 4 idlelib-and-idle}@anchor{1158}
@subsubsection idlelib and IDLE


Since idlelib implements the IDLE shell and editor and is not intended for
import by other programs, it gets improvements with every release. See
@code{Lib/idlelib/NEWS.txt} for a cumulative list of changes since 3.3.0,
as well as changes made in future 3.4.x releases. This file is also available
from the IDLE Help ‣ About IDLE dialog.

@node importlib<9>,inspect<9>,idlelib and IDLE<4>,Improved Modules<10>
@anchor{whatsnew/3 4 importlib}@anchor{1159}
@subsubsection importlib


The @ref{115a,,InspectLoader} ABC defines a new method,
@ref{1018,,source_to_code()} that accepts source
data and a path and returns a code object.  The default implementation
is equivalent to @code{compile(data, path, 'exec', dont_inherit=True)}.
(Contributed by Eric Snow and Brett Cannon in bpo-15627@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15627}.)

@ref{115a,,InspectLoader} also now has a default implementation
for the @ref{115b,,get_code()} method.  However,
it will normally be desirable to override the default implementation
for performance reasons.  (Contributed by Brett Cannon in bpo-18072@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18072}.)

The @ref{73e,,reload()} function has been moved from @code{imp} to
@ref{7b,,importlib} as part of the @code{imp} module deprecation.  (Contributed by
Berker Peksag in bpo-18193@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18193}.)

@ref{81,,importlib.util} now has a @ref{738,,MAGIC_NUMBER} attribute
providing access to the bytecode version number.  This replaces the
@code{get_magic()} function in the deprecated @code{imp} module.
(Contributed by Brett Cannon in bpo-18192@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18192}.)

New @ref{81,,importlib.util} functions @ref{351,,cache_from_source()}
and @ref{73f,,source_from_cache()} replace the same-named functions
in the deprecated @code{imp} module.  (Contributed by Brett Cannon in
bpo-18194@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18194}.)

The @ref{7b,,importlib} bootstrap @ref{115c,,NamespaceLoader} now conforms to
the @ref{115a,,InspectLoader} ABC, which means that @code{runpy} and
@code{python -m} can now be used with namespace packages.  (Contributed
by Brett Cannon in bpo-18058@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18058}.)

@ref{81,,importlib.util} has a new function @ref{115d,,decode_source()}
that decodes source from bytes using universal newline processing.  This is
useful for implementing @ref{115e,,InspectLoader.get_source()} methods.

@ref{eb4,,importlib.machinery.ExtensionFileLoader} now has a
@ref{115f,,get_filename()} method.  This was
inadvertently omitted in the original implementation.  (Contributed by Eric
Snow in bpo-19152@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19152}.)

@node inspect<9>,ipaddress<5>,importlib<9>,Improved Modules<10>
@anchor{whatsnew/3 4 inspect}@anchor{1160}
@subsubsection inspect


The @ref{82,,inspect} module now offers a basic @ref{1161,,command line interface} to quickly display source code and other
information for modules, classes and functions.  (Contributed by Claudiu Popa
and Nick Coghlan in bpo-18626@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18626}.)

@ref{1162,,unwrap()} makes it easy to unravel wrapper function chains
created by @ref{1163,,functools.wraps()} (and any other API that sets the
@code{__wrapped__} attribute on a wrapper function).  (Contributed by
Daniel Urban, Aaron Iles and Nick Coghlan in bpo-13266@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13266}.)

As part of the implementation of the new @ref{5a,,enum} module, the
@ref{82,,inspect} module now has substantially better support for custom
@code{__dir__} methods and dynamic class attributes provided through
metaclasses.  (Contributed by Ethan Furman in bpo-18929@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18929} and
bpo-19030@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19030}.)

@ref{946,,getfullargspec()} and @code{getargspec()}
now use the @ref{231,,signature()} API. This allows them to
support a much broader range of callables, including those with
@code{__signature__} attributes, those with metadata provided by argument
clinic, @ref{219,,functools.partial()} objects and more. Note that, unlike
@code{signature()}, these functions still ignore @code{__wrapped__}
attributes, and report the already bound first argument for bound methods,
so it is still necessary to update your code to use
@code{signature()} directly if those features are desired.
(Contributed by Yury Selivanov in bpo-17481@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17481}.)

@ref{231,,signature()} now supports duck types of CPython functions,
which adds support for functions compiled with Cython.  (Contributed
by Stefan Behnel and Yury Selivanov in bpo-17159@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17159}.)

@node ipaddress<5>,logging<6>,inspect<9>,Improved Modules<10>
@anchor{whatsnew/3 4 ipaddress}@anchor{1164}
@subsubsection ipaddress


@ref{84,,ipaddress} was added to the standard library in Python 3.3 as a
@ref{3cf,,provisional API}. With the release of Python 3.4, this qualification
has been removed: @code{ipaddress} is now considered a stable API, covered
by the normal standard library requirements to maintain backwards
compatibility.

A new @ref{1165,,is_global} property is @code{True} if
an address is globally routeable.  (Contributed by Peter Moody in
bpo-17400@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17400}.)

@node logging<6>,marshal<2>,ipaddress<5>,Improved Modules<10>
@anchor{whatsnew/3 4 logging}@anchor{1166}
@subsubsection logging


The @ref{1167,,TimedRotatingFileHandler} has a new `atTime'
parameter that can be used to specify the time of day when rollover should
happen.  (Contributed by Ronald Oussoren in bpo-9556@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9556}.)

@ref{1168,,SocketHandler} and
@ref{1169,,DatagramHandler} now support Unix domain sockets (by
setting `port' to @code{None}).  (Contributed by Vinay Sajip in commit
ce46195b56a9.)

@ref{d4e,,fileConfig()} now accepts a
@ref{116a,,configparser.RawConfigParser} subclass instance for the `fname'
parameter.  This facilitates using a configuration file when logging
configuration is just a part of the overall application configuration, or where
the application modifies the configuration before passing it to
@code{fileConfig()}.  (Contributed by Vinay Sajip in
bpo-16110@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16110}.)

Logging configuration data received from a socket via the
@ref{116b,,logging.config.listen()} function can now be validated before being
processed by supplying a verification function as the argument to the new
`verify' keyword argument.  (Contributed by Vinay Sajip in bpo-15452@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15452}.)

@node marshal<2>,mmap<3>,logging<6>,Improved Modules<10>
@anchor{whatsnew/3 4 marshal}@anchor{116c}@anchor{whatsnew/3 4 whatsnew-marshal-3}@anchor{10e3}
@subsubsection marshal


The default @ref{91,,marshal} version has been bumped to 3.  The code implementing
the new version restores the Python2 behavior of recording only one copy of
interned strings and preserving the interning on deserialization, and extends
this “one copy” ability to any object type (including handling recursive
references).  This reduces both the size of @code{.pyc} files and the amount of
memory a module occupies in memory when it is loaded from a @code{.pyc} (or
@code{.pyo}) file.  (Contributed by Kristján Valur Jónsson in bpo-16475@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16475},
with additional speedups by Antoine Pitrou in bpo-19219@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19219}.)

@node mmap<3>,multiprocessing<8>,marshal<2>,Improved Modules<10>
@anchor{whatsnew/3 4 mmap}@anchor{116d}
@subsubsection mmap


mmap objects are now @ref{1113,,weakly referenceable}.
(Contributed by Valerie Lambert in bpo-4885@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4885}.)

@node multiprocessing<8>,operator<4>,mmap<3>,Improved Modules<10>
@anchor{whatsnew/3 4 multiprocessing}@anchor{116e}
@subsubsection multiprocessing

@anchor{whatsnew/3 4 whatsnew-multiprocessing-no-fork}@anchor{10ed}
On Unix two new @ref{1d7,,start methods},
@code{spawn} and @code{forkserver}, have been added for starting processes using
@ref{98,,multiprocessing}.  These make the mixing of processes with threads more
robust, and the @code{spawn} method matches the semantics that multiprocessing has
always used on Windows.  New function
@ref{116f,,get_all_start_methods()} reports all start methods
available on the platform, @ref{1170,,get_start_method()} reports
the current start method, and @ref{24d,,set_start_method()} sets
the start method.  (Contributed by Richard Oudkerk in bpo-8713@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8713}.)

@ref{98,,multiprocessing} also now has the concept of a @code{context}, which
determines how child processes are created.  New function
@ref{24c,,get_context()} returns a context that uses a specified
start method.  It has the same API as the @code{multiprocessing} module itself,
so you can use it to create @ref{1171,,Pool}s and other
objects that will operate within that context.  This allows a framework and an
application or different parts of the same application to use multiprocessing
without interfering with each other.  (Contributed by Richard Oudkerk in
bpo-18999@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18999}.)

Except when using the old `fork' start method, child processes no longer
inherit unneeded handles/file descriptors from their parents (part of
bpo-8713@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8713}).

@ref{98,,multiprocessing} now relies on @ref{c3,,runpy} (which implements the
@code{-m} switch) to initialise @code{__main__} appropriately in child processes
when using the @code{spawn} or @code{forkserver} start methods. This resolves some
edge cases where combining multiprocessing, the @code{-m} command line switch,
and explicit relative imports could cause obscure failures in child
processes.  (Contributed by Nick Coghlan in bpo-19946@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19946}.)

@node operator<4>,os<12>,multiprocessing<8>,Improved Modules<10>
@anchor{whatsnew/3 4 operator}@anchor{1172}
@subsubsection operator


New function @ref{1173,,length_hint()} provides an implementation of the
specification for how the @ref{1114,,__length_hint__()} special method should
be used, as part of the 
@geindex Python Enhancement Proposals; PEP 424
PEP 424@footnote{https://peps.python.org/pep-0424/} formal specification of this language
feature.  (Contributed by Armin Ronacher in bpo-16148@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16148}.)

There is now a pure-python version of the @ref{a3,,operator} module available for
reference and for use by alternate implementations of Python.  (Contributed by
Zachary Ware in bpo-16694@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16694}.)

@node os<12>,pdb<8>,operator<4>,Improved Modules<10>
@anchor{whatsnew/3 4 os}@anchor{1174}
@subsubsection os


There are new functions to get and set the @ref{1102,,inheritable flag} of a file descriptor (@ref{1103,,os.get_inheritable()},
@ref{1104,,os.set_inheritable()}) or a Windows handle
(@ref{1105,,os.get_handle_inheritable()}, @ref{1106,,os.set_handle_inheritable()}).

New function @ref{4dc,,cpu_count()} reports the number of CPUs available on the
platform on which Python is running (or @code{None} if the count can’t be
determined).  The @ref{1175,,multiprocessing.cpu_count()} function is now implemented
in terms of this function).  (Contributed by Trent Nelson, Yogesh Chaudhari,
Victor Stinner, and Charles-François Natali in bpo-17914@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17914}.)

@ref{1176,,os.path.samestat()} is now available on the Windows platform (and the
@ref{1177,,os.path.samefile()} implementation is now shared between Unix and
Windows).  (Contributed by Brian Curtin in bpo-11939@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11939}.)

@ref{c0d,,os.path.ismount()} now recognizes volumes mounted below a drive
root on Windows.  (Contributed by Tim Golden in bpo-9035@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9035}.)

@ref{f98,,os.open()} supports two new flags on platforms that provide them,
@ref{1178,,O_PATH} (un-opened file descriptor), and @ref{1179,,O_TMPFILE}
(unnamed temporary file; as of 3.4.0 release available only on Linux systems
with a kernel version of 3.11 or newer that have uapi headers).  (Contributed
by Christian Heimes in bpo-18673@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18673} and Benjamin Peterson, respectively.)

@node pdb<8>,pickle<5>,os<12>,Improved Modules<10>
@anchor{whatsnew/3 4 pdb}@anchor{117a}
@subsubsection pdb


@ref{aa,,pdb} has been enhanced to handle generators, @ref{bc8,,yield}, and
@code{yield from} in a more useful fashion.  This is especially helpful when
debugging @ref{b,,asyncio} based programs.  (Contributed by Andrew Svetlov and
Xavier de Gaye in bpo-16596@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16596}.)

The @code{print} command has been removed from @ref{aa,,pdb}, restoring access to the
Python @ref{117b,,print()} function from the pdb command line.  Python2’s @code{pdb} did
not have a @code{print} command; instead, entering @code{print} executed the
@code{print} statement.  In Python3 @code{print} was mistakenly made an alias for the
pdb @ref{117c,,p} command.  @code{p}, however, prints the @code{repr} of its argument,
not the @code{str} like the Python2 @code{print} command did.  Worse, the Python3
@code{pdb print} command shadowed the Python3 @code{print} function, making it
inaccessible at the @code{pdb} prompt.  (Contributed by Connor Osborn in
bpo-18764@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18764}.)

@node pickle<5>,plistlib<2>,pdb<8>,Improved Modules<10>
@anchor{whatsnew/3 4 pickle}@anchor{117d}@anchor{whatsnew/3 4 whatsnew-protocol-4}@anchor{10ec}
@subsubsection pickle


@ref{ab,,pickle} now supports (but does not use by default) a new pickle protocol,
protocol 4.  This new protocol addresses a number of issues that were present
in previous protocols, such as the serialization of nested classes, very large
strings and containers, and classes whose @ref{7a1,,__new__()} method takes
keyword-only arguments.  It also provides some efficiency improvements.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 3154

@item PEP 3154@footnote{https://peps.python.org/pep-3154/} – Pickle protocol 4

PEP written by Antoine Pitrou and implemented by Alexandre Vassalotti.
@end table


@node plistlib<2>,poplib<3>,pickle<5>,Improved Modules<10>
@anchor{whatsnew/3 4 plistlib}@anchor{117e}
@subsubsection plistlib


@ref{b0,,plistlib} now has an API that is similar to the standard pattern for
stdlib serialization protocols, with new @ref{b4e,,load()},
@ref{b50,,dump()}, @ref{b4f,,loads()}, and @ref{b51,,dumps()}
functions.  (The older API is now deprecated.)  In addition to the already
supported XML plist format (@ref{117f,,FMT_XML}), it also now supports
the binary plist format (@ref{1180,,FMT_BINARY}).  (Contributed by Ronald
Oussoren and others in bpo-14455@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14455}.)

@node poplib<3>,pprint<4>,plistlib<2>,Improved Modules<10>
@anchor{whatsnew/3 4 poplib}@anchor{1181}
@subsubsection poplib


Two new methods have been added to @ref{b1,,poplib}: @ref{1182,,capa()},
which returns the list of capabilities advertised by the POP server, and
@ref{1183,,stls()}, which switches a clear-text POP3 session into an
encrypted POP3 session if the POP server supports it.  (Contributed by Lorenzo
Catucci in bpo-4473@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4473}.)

@node pprint<4>,pty<2>,poplib<3>,Improved Modules<10>
@anchor{whatsnew/3 4 pprint}@anchor{1184}
@subsubsection pprint


The @ref{b3,,pprint} module’s @ref{1185,,PrettyPrinter} class and its
@ref{1186,,pformat()}, and @ref{a2f,,pprint()} functions have a new
option, `compact', that controls how the output is formatted.  Currently
setting `compact' to @code{True} means that sequences will be printed with as many
sequence elements as will fit within `width' on each (indented) line.
(Contributed by Serhiy Storchaka in bpo-19132@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19132}.)

Long strings are now wrapped using Python’s normal line continuation
syntax.  (Contributed by Antoine Pitrou in bpo-17150@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17150}.)

@node pty<2>,pydoc<5>,pprint<4>,Improved Modules<10>
@anchor{whatsnew/3 4 pty}@anchor{1187}
@subsubsection pty


@ref{1188,,pty.spawn()} now returns the status value from @ref{fa0,,os.waitpid()} on
the child process, instead of @code{None}.  (Contributed by Gregory P. Smith.)

@node pydoc<5>,re<9>,pty<2>,Improved Modules<10>
@anchor{whatsnew/3 4 pydoc}@anchor{1189}
@subsubsection pydoc


The @ref{ba,,pydoc} module is now based directly on the @ref{231,,inspect.signature()}
introspection API, allowing it to provide signature information for a wider
variety of callable objects. This change also means that @code{__wrapped__}
attributes are now taken into account when displaying help information.
(Contributed by Larry Hastings in bpo-19674@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19674}.)

The @ref{ba,,pydoc} module no longer displays the @code{self} parameter for
already bound methods. Instead, it aims to always display the exact current
signature of the supplied callable.  (Contributed by Larry Hastings in
bpo-20710@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20710}.)

In addition to the changes that have been made to @ref{ba,,pydoc} directly,
its handling of custom @code{__dir__} methods and various descriptor
behaviours has also been improved substantially by the underlying changes in
the @ref{82,,inspect} module.

As the @ref{ada,,help()} builtin is based on @ref{ba,,pydoc}, the above changes also
affect the behaviour of @code{help()}.

@node re<9>,resource,pydoc<5>,Improved Modules<10>
@anchor{whatsnew/3 4 re}@anchor{118a}
@subsubsection re


New @ref{118b,,fullmatch()} function and @ref{118c,,Pattern.fullmatch()} method anchor
the pattern at both ends of the string to match.  This provides a way to be
explicit about the goal of the match, which avoids a class of subtle bugs where
@code{$} characters get lost during code changes or the addition of alternatives
to an existing regular expression.  (Contributed by Matthew Barnett in
bpo-16203@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16203}.)

The repr of @ref{118d,,regex objects} now includes the pattern
and the flags; the repr of @ref{118e,,match objects} now
includes the start, end, and the part of the string that matched.  (Contributed
by Hugo Lopes Tavares and Serhiy Storchaka in bpo-13592@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13592} and
bpo-17087@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17087}.)

@node resource,select,re<9>,Improved Modules<10>
@anchor{whatsnew/3 4 resource}@anchor{118f}
@subsubsection resource


New @ref{1190,,prlimit()} function, available on Linux platforms with a
kernel version of 2.6.36 or later and glibc of 2.13 or later, provides the
ability to query or set the resource limits for processes other than the one
making the call.  (Contributed by Christian Heimes in bpo-16595@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16595}.)

On Linux kernel version 2.6.36 or later, there are also some new
Linux specific constants: @ref{1191,,RLIMIT_MSGQUEUE},
@ref{1192,,RLIMIT_NICE}, @ref{1193,,RLIMIT_RTPRIO},
@ref{1194,,RLIMIT_RTTIME}, and @ref{1195,,RLIMIT_SIGPENDING}.
(Contributed by Christian Heimes in bpo-19324@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19324}.)

On FreeBSD version 9 and later, there some new FreeBSD specific constants:
@ref{1196,,RLIMIT_SBSIZE}, @ref{1197,,RLIMIT_SWAP}, and
@ref{1198,,RLIMIT_NPTS}.  (Contributed by Claudiu Popa in
bpo-19343@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19343}.)

@node select,shelve<2>,resource,Improved Modules<10>
@anchor{whatsnew/3 4 select}@anchor{1199}
@subsubsection select


@ref{119a,,epoll} objects now support the context management protocol.
When used in a @ref{187,,with} statement, the @ref{119b,,close()}
method will be called automatically at the end of the block.  (Contributed
by Serhiy Storchaka in bpo-16488@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16488}.)

@ref{119c,,devpoll} objects now have @ref{119d,,fileno()} and
@ref{119e,,close()} methods, as well as a new attribute
@ref{119f,,closed}.  (Contributed by Victor Stinner in
bpo-18794@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18794}.)

@node shelve<2>,shutil<6>,select,Improved Modules<10>
@anchor{whatsnew/3 4 shelve}@anchor{11a0}
@subsubsection shelve


@ref{11a1,,Shelf} instances may now be used in @ref{187,,with} statements,
and will be automatically closed at the end of the @code{with} block.
(Contributed by Filip Gruszczyński in bpo-13896@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13896}.)

@node shutil<6>,smtpd<3>,shelve<2>,Improved Modules<10>
@anchor{whatsnew/3 4 shutil}@anchor{11a2}
@subsubsection shutil


@ref{c54,,copyfile()} now raises a specific @ref{11a3,,Error} subclass,
@ref{11a4,,SameFileError}, when the source and destination are the same
file, which allows an application to take appropriate action on this specific
error.  (Contributed by Atsuo Ishimoto and Hynek Schlawack in
bpo-1492704@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1492704}.)

@node smtpd<3>,smtplib<3>,shutil<6>,Improved Modules<10>
@anchor{whatsnew/3 4 smtpd}@anchor{11a5}
@subsubsection smtpd


The @code{SMTPServer} and @code{SMTPChannel} classes now
accept a `map' keyword argument which, if specified, is passed in to
@code{asynchat.async_chat} as its `map' argument.  This allows an application
to avoid affecting the global socket map.  (Contributed by Vinay Sajip in
bpo-11959@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11959}.)

@node smtplib<3>,socket<10>,smtpd<3>,Improved Modules<10>
@anchor{whatsnew/3 4 smtplib}@anchor{11a6}
@subsubsection smtplib


@ref{11a7,,SMTPException} is now a subclass of @ref{2c2,,OSError}, which allows
both socket level errors and SMTP protocol level errors to be caught in one
try/except statement by code that only cares whether or not an error occurred.
(Contributed by Ned Jackson Lovely in bpo-2118@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2118}.)

@node socket<10>,sqlite3<10>,smtplib<3>,Improved Modules<10>
@anchor{whatsnew/3 4 socket}@anchor{11a8}
@subsubsection socket


The socket module now supports the @ref{11a9,,CAN_BCM} protocol on
platforms that support it.  (Contributed by Brian Thorne in bpo-15359@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15359}.)

Socket objects have new methods to get or set their @ref{1102,,inheritable flag}, @ref{1107,,get_inheritable()} and
@ref{1108,,set_inheritable()}.

The @code{socket.AF_*} and @code{socket.SOCK_*} constants are now enumeration values
using the new @ref{5a,,enum} module.  This allows meaningful names to be printed
during debugging, instead of integer “magic numbers”.

The @ref{11aa,,AF_LINK} constant is now available on BSD and OSX.

@ref{b61,,inet_pton()} and @ref{11ab,,inet_ntop()} are now supported
on Windows.  (Contributed by Atsuo Ishimoto in bpo-7171@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7171}.)

@node sqlite3<10>,ssl<11>,socket<10>,Improved Modules<10>
@anchor{whatsnew/3 4 sqlite3}@anchor{11ac}
@subsubsection sqlite3


A new boolean parameter to the @ref{5a6,,connect()} function, `uri', can be
used to indicate that the `database' parameter is a @code{uri} (see the SQLite URI documentation@footnote{https://www.sqlite.org/uri.html}).  (Contributed by poq in
bpo-13773@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13773}.)

@node ssl<11>,stat,sqlite3<10>,Improved Modules<10>
@anchor{whatsnew/3 4 ssl}@anchor{11ad}
@subsubsection ssl

@anchor{whatsnew/3 4 whatsnew-tls-11-12}@anchor{10f0}
@ref{11ae,,PROTOCOL_TLSv1_1} and @ref{11af,,PROTOCOL_TLSv1_2} (TLSv1.1 and
TLSv1.2 support) have been added; support for these protocols is only available if
Python is linked with OpenSSL 1.0.1 or later.  (Contributed by Michele Orrù and
Antoine Pitrou in bpo-16692@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16692}.)
@anchor{whatsnew/3 4 whatsnew34-sslcontext}@anchor{10f3}
New function @ref{480,,create_default_context()} provides a standard way to
obtain an @ref{355,,SSLContext} whose settings are intended to be a
reasonable balance between compatibility and security.  These settings are
more stringent than the defaults provided by the @code{SSLContext}
constructor, and may be adjusted in the future, without prior deprecation, if
best-practice security requirements change.  The new recommended best
practice for using stdlib libraries that support SSL is to use
@code{create_default_context()} to obtain an @code{SSLContext}
object, modify it if needed, and then pass it as the `context' argument
of the appropriate stdlib API.  (Contributed by Christian Heimes
in bpo-19689@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19689}.)

@ref{355,,SSLContext} method @ref{10f4,,load_verify_locations()}
accepts a new optional argument `cadata', which can be used to provide PEM or
DER encoded certificates directly via strings or bytes, respectively.
(Contributed by Christian Heimes in bpo-18138@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18138}.)

New function @ref{11b0,,get_default_verify_paths()} returns
a named tuple of the paths and environment variables that the
@ref{11b1,,set_default_verify_paths()} method uses to set
OpenSSL’s default @code{cafile} and @code{capath}.  This can be an aid in
debugging default verification issues.  (Contributed by Christian Heimes
in bpo-18143@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18143}.)

@ref{355,,SSLContext} has a new method,
@ref{11b2,,cert_store_stats()}, that reports the number of loaded
@code{X.509} certs, @code{X.509 CA} certs, and certificate revocation lists
(@code{crl}s), as well as a @ref{11b3,,get_ca_certs()} method that
returns a list of the loaded @code{CA} certificates.  (Contributed by Christian
Heimes in bpo-18147@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18147}.)

If OpenSSL 0.9.8 or later is available, @ref{355,,SSLContext} has a new
attribute @ref{11b4,,verify_flags} that can be used to control the
certificate verification process by setting it to some combination of the new
constants @ref{11b5,,VERIFY_DEFAULT}, @ref{11b6,,VERIFY_CRL_CHECK_LEAF},
@ref{11b7,,VERIFY_CRL_CHECK_CHAIN}, or @ref{482,,VERIFY_X509_STRICT}.
OpenSSL does not do any CRL verification by default.  (Contributed by
Christien Heimes in bpo-8813@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8813}.)

New @ref{355,,SSLContext} method @ref{11b8,,load_default_certs()}
loads a set of default “certificate authority” (CA) certificates from default
locations, which vary according to the platform.  It can be used to load both
TLS web server authentication certificates
(@code{purpose=}@ref{11b9,,SERVER_AUTH}) for a client to use to verify a
server, and certificates for a server to use in verifying client certificates
(@code{purpose=}@ref{11ba,,CLIENT_AUTH}).  (Contributed by Christian
Heimes in bpo-19292@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19292}.)
@anchor{whatsnew/3 4 whatsnew34-win-cert-store}@anchor{10f1}
Two new windows-only functions, @ref{11bb,,enum_certificates()} and
@ref{11bc,,enum_crls()} provide the ability to retrieve certificates,
certificate information, and CRLs from the Windows cert store.  (Contributed
by Christian Heimes in bpo-17134@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17134}.)
@anchor{whatsnew/3 4 whatsnew34-sni}@anchor{10f2}
Support for server-side SNI (Server Name Indication) using the new
@ref{11bd,,ssl.SSLContext.set_servername_callback()} method.
(Contributed by Daniel Black in bpo-8109@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8109}.)

The dictionary returned by @ref{11be,,SSLSocket.getpeercert()} contains additional
@code{X509v3} extension items: @code{crlDistributionPoints}, @code{calIssuers}, and
@code{OCSP} URIs.  (Contributed by Christian Heimes in bpo-18379@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18379}.)

@node stat,struct<3>,ssl<11>,Improved Modules<10>
@anchor{whatsnew/3 4 stat}@anchor{11bf}
@subsubsection stat


The @ref{d6,,stat} module is now backed by a C implementation in @code{_stat}. A C
implementation is required as most of the values aren’t standardized and
are platform-dependent.  (Contributed by Christian Heimes in bpo-11016@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11016}.)

The module supports new @ref{11c0,,ST_MODE} flags, @ref{11c1,,S_IFDOOR},
@ref{11c2,,S_IFPORT}, and @ref{11c3,,S_IFWHT}.  (Contributed by
Christian Hiemes in bpo-11016@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11016}.)

@node struct<3>,subprocess<5>,stat,Improved Modules<10>
@anchor{whatsnew/3 4 struct}@anchor{11c4}
@subsubsection struct


New function @ref{11c5,,iter_unpack} and a new
@ref{11c6,,struct.Struct.iter_unpack()} method on compiled formats provide streamed
unpacking of a buffer containing repeated instances of a given format of data.
(Contributed by Antoine Pitrou in bpo-17804@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17804}.)

@node subprocess<5>,sunau<2>,struct<3>,Improved Modules<10>
@anchor{whatsnew/3 4 subprocess}@anchor{11c7}
@subsubsection subprocess


@ref{11c8,,check_output()} now accepts an `input' argument that can
be used to provide the contents of @code{stdin} for the command that is run.
(Contributed by Zack Weinberg in bpo-16624@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16624}.)

@ref{11c9,,getoutput()} and @ref{11ca,,getstatusoutput()} now
work on Windows.  This change was actually inadvertently made in 3.3.4.
(Contributed by Tim Golden in bpo-10197@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10197}.)

@node sunau<2>,sys<12>,subprocess<5>,Improved Modules<10>
@anchor{whatsnew/3 4 sunau}@anchor{11cb}
@subsubsection sunau


The @code{getparams()} method now returns a namedtuple rather than a
plain tuple.  (Contributed by Claudiu Popa in bpo-18901@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18901}.)

@code{sunau.open()} now supports the context management protocol: when used in a
@ref{187,,with} block, the @code{close} method of the returned object will be
called automatically at the end of the block.  (Contributed by Serhiy Storchaka
in bpo-18878@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18878}.)

@code{AU_write.setsampwidth()} now supports 24 bit samples, thus adding
support for writing 24 sample using the module.  (Contributed by
Serhiy Storchaka in bpo-19261@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19261}.)

The @code{writeframesraw()} and
@code{writeframes()} methods now accept any @ref{194,,bytes-like object}.  (Contributed by Serhiy Storchaka in bpo-8311@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8311}.)

@node sys<12>,tarfile<8>,sunau<2>,Improved Modules<10>
@anchor{whatsnew/3 4 sys}@anchor{11cc}
@subsubsection sys


New function @ref{11cd,,sys.getallocatedblocks()} returns the current number of
blocks allocated by the interpreter.  (In CPython with the default
@code{--with-pymalloc} setting, this is allocations made through the
@ref{e68,,PyObject_Malloc()} API.)  This can be useful for tracking memory leaks,
especially if automated via a test suite.  (Contributed by Antoine Pitrou
in bpo-13390@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13390}.)

When the Python interpreter starts in @ref{441,,interactive mode}, it checks for an @ref{11ce,,__interactivehook__} attribute
on the @ref{df,,sys} module.  If the attribute exists, its value is called with no
arguments just before interactive mode is started.  The check is made after the
@geindex PYTHONSTARTUP
@geindex environment variable; PYTHONSTARTUP
@ref{1ba,,PYTHONSTARTUP} file is read, so it can be set there.  The @ref{cc,,site}
module @ref{11cf,,sets it} to a function that enables tab
completion and history saving (in @code{~/.python-history}) if the platform
supports @ref{bf,,readline}.  If you do not want this (new) behavior, you can
override it in 
@geindex PYTHONSTARTUP
@geindex environment variable; PYTHONSTARTUP
@code{PYTHONSTARTUP}, @ref{cd,,sitecustomize}, or
@ref{115,,usercustomize} by deleting this attribute from @code{sys} (or setting it
to some other callable).  (Contributed by Éric Araujo and Antoine Pitrou in
bpo-5845@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5845}.)

@node tarfile<8>,textwrap<2>,sys<12>,Improved Modules<10>
@anchor{whatsnew/3 4 tarfile}@anchor{11d0}
@subsubsection tarfile


The @ref{e4,,tarfile} module now supports a simple @ref{11d1,,Command-Line Interface} when
called as a script directly or via @code{-m}.  This can be used to create and
extract tarfile archives.  (Contributed by Berker Peksag in bpo-13477@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13477}.)

@node textwrap<2>,threading<8>,tarfile<8>,Improved Modules<10>
@anchor{whatsnew/3 4 textwrap}@anchor{11d2}
@subsubsection textwrap


The @ref{11d3,,TextWrapper} class has two new attributes/constructor
arguments: @ref{11d4,,max_lines}, which limits the number of
lines in the output, and @ref{11d5,,placeholder}, which is a
string that will appear at the end of the output if it has been truncated
because of `max_lines'.  Building on these capabilities, a new convenience
function @ref{11d6,,shorten()} collapses all of the whitespace in the input
to single spaces and produces a single line of a given `width' that ends with
the `placeholder' (by default, @code{[...]}).  (Contributed by Antoine Pitrou and
Serhiy Storchaka in bpo-18585@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18585} and bpo-18725@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18725}.)

@node threading<8>,traceback<6>,textwrap<2>,Improved Modules<10>
@anchor{whatsnew/3 4 threading}@anchor{11d7}
@subsubsection threading


The @ref{177,,Thread} object representing the main thread can be
obtained from the new @ref{11d8,,main_thread()} function.  In normal
conditions this will be the thread from which the Python interpreter was
started.  (Contributed by Andrew Svetlov in bpo-18882@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18882}.)

@node traceback<6>,types<7>,threading<8>,Improved Modules<10>
@anchor{whatsnew/3 4 traceback}@anchor{11d9}
@subsubsection traceback


A new @ref{11da,,traceback.clear_frames()} function takes a traceback object
and clears the local variables in all of the frames it references,
reducing the amount of memory consumed.  (Contributed by Andrew Kuchling in
bpo-1565525@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1565525}.)

@node types<7>,urllib<5>,traceback<6>,Improved Modules<10>
@anchor{whatsnew/3 4 types}@anchor{11db}
@subsubsection types


A new @ref{83d,,DynamicClassAttribute()} descriptor provides a way to define
an attribute that acts normally when looked up through an instance object, but
which is routed to the `class' @code{__getattr__} when looked up through the
class.  This allows one to have properties active on a class, and have virtual
attributes on the class with the same name (see @ref{5a,,enum} for an example).
(Contributed by Ethan Furman in bpo-19030@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19030}.)

@node urllib<5>,unittest<10>,types<7>,Improved Modules<10>
@anchor{whatsnew/3 4 urllib}@anchor{11dc}
@subsubsection urllib


@ref{112,,urllib.request} now supports @code{data:} URLs via the
@ref{11dd,,DataHandler} class.  (Contributed by Mathias Panzenböck
in bpo-16423@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16423}.)

The http method that will be used by a @ref{11de,,Request} class
can now be specified by setting a @ref{11df,,method}
class attribute on the subclass.  (Contributed by Jason R Coombs in
bpo-18978@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18978}.)

@ref{11de,,Request} objects are now reusable: if the
@ref{11e0,,full_url} or @ref{11e1,,data}
attributes are modified, all relevant internal properties are updated.  This
means, for example, that it is now possible to use the same
@code{Request} object in more than one
@ref{11e2,,OpenerDirector.open()} call with different `data' arguments, or to
modify a @code{Request}‘s @code{url} rather than recomputing it
from scratch.  There is also a new
@ref{11e3,,remove_header()} method that can be used to remove
headers from a @code{Request}.  (Contributed by Alexey
Kachayev in bpo-16464@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16464}, Daniel Wozniak in bpo-17485@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17485}, and Damien Brecht
and Senthil Kumaran in bpo-17272@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17272}.)

@ref{11e4,,HTTPError} objects now have a
@ref{11e5,,headers} attribute that provides access to the
HTTP response headers associated with the error.  (Contributed by
Berker Peksag in bpo-15701@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15701}.)

@node unittest<10>,venv<7>,urllib<5>,Improved Modules<10>
@anchor{whatsnew/3 4 unittest}@anchor{11e6}
@subsubsection unittest


The @ref{2b5,,TestCase} class has a new method,
@ref{11e7,,subTest()}, that produces a context manager whose
@ref{187,,with} block becomes a “sub-test”.  This context manager allows a test
method to dynamically generate subtests  by, say, calling the @code{subTest}
context manager inside a loop.  A single test method can thereby produce an
indefinite number of separately identified and separately counted tests, all of
which will run even if one or more of them fail.  For example:

@example
class NumbersTest(unittest.TestCase):
    def test_even(self):
        for i in range(6):
            with self.subTest(i=i):
                self.assertEqual(i % 2, 0)
@end example

will result in six subtests, each identified in the unittest verbose output
with a label consisting of the variable name @code{i} and a particular value for
that variable (@code{i=0}, @code{i=1}, etc).  See @ref{11e8,,Distinguishing test iterations using subtests} for the full
version of this example.  (Contributed by Antoine Pitrou in bpo-16997@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16997}.)

@ref{11e9,,unittest.main()} now accepts an iterable of test names for
`defaultTest', where previously it only accepted a single test name as a
string.  (Contributed by Jyrki Pulliainen in bpo-15132@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15132}.)

If @ref{11ea,,SkipTest} is raised during test discovery (that is, at the
module level in the test file), it is now reported as a skip instead of an
error.  (Contributed by Zach Ware in bpo-16935@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16935}.)

@ref{11eb,,discover()} now sorts the discovered files to provide
consistent test ordering.  (Contributed by Martin Melin and Jeff Ramnani in
bpo-16709@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16709}.)

@ref{ffb,,TestSuite} now drops references to tests as soon as the test
has been run, if the test is successful.  On Python interpreters that do
garbage collection, this allows the tests to be garbage collected if nothing
else is holding a reference to the test.  It is possible to override this
behavior by creating a @code{TestSuite} subclass that defines a
custom @code{_removeTestAtIndex} method.  (Contributed by Tom Wardill, Matt
McClure, and Andrew Svetlov in bpo-11798@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11798}.)

A new test assertion context-manager, @ref{a5f,,assertLogs()},
will ensure that a given block of code emits a log message using the
@ref{8b,,logging} module.  By default the message can come from any logger and
have a priority of @code{INFO} or higher, but both the logger name and an
alternative minimum logging level may be specified.  The object returned by the
context manager can be queried for the @ref{11ec,,LogRecord}s and/or
formatted messages that were logged.  (Contributed by Antoine Pitrou in
bpo-18937@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18937}.)

Test discovery now works with namespace packages (Contributed by Claudiu Popa
in bpo-17457@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17457}.)

@ref{10e,,unittest.mock} objects now inspect their specification signatures when
matching calls, which means an argument can now be matched by either position
or name, instead of only by position.  (Contributed by Antoine Pitrou in
bpo-17015@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17015}.)

@ref{11ed,,mock_open()} objects now have @code{readline} and @code{readlines}
methods.  (Contributed by Toshio Kuratomi in bpo-17467@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17467}.)

@node venv<7>,wave<2>,unittest<10>,Improved Modules<10>
@anchor{whatsnew/3 4 venv}@anchor{11ee}
@subsubsection venv


@ref{118,,venv} now includes activation scripts for the @code{csh} and @code{fish}
shells.  (Contributed by Andrew Svetlov in bpo-15417@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15417}.)

@ref{571,,EnvBuilder} and the @ref{572,,create()} convenience function
take a new keyword argument `with_pip', which defaults to @code{False}, that
controls whether or not @code{EnvBuilder} ensures that @code{pip} is
installed in the virtual environment.  (Contributed by Nick Coghlan in
bpo-19552@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19552} as part of the 
@geindex Python Enhancement Proposals; PEP 453
PEP 453@footnote{https://peps.python.org/pep-0453/} implementation.)

@node wave<2>,weakref<2>,venv<7>,Improved Modules<10>
@anchor{whatsnew/3 4 wave}@anchor{11ef}
@subsubsection wave


The @ref{11f0,,getparams()} method now returns a namedtuple rather
than a plain tuple.  (Contributed by Claudiu Popa in bpo-17487@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17487}.)

@ref{b4b,,wave.open()} now supports the context management protocol.  (Contributed
by Claudiu Popa in bpo-17616@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17616}.)

@ref{11a,,wave} can now @ref{11f1,,write output to unseekable files}.  (Contributed by David Jones, Guilherme Polo, and Serhiy
Storchaka in bpo-5202@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5202}.)

The @ref{11f2,,writeframesraw()} and
@ref{11f3,,writeframes()} methods now accept any @ref{194,,bytes-like object}.  (Contributed by Serhiy Storchaka in bpo-8311@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8311}.)

@node weakref<2>,xml etree<2>,wave<2>,Improved Modules<10>
@anchor{whatsnew/3 4 weakref}@anchor{11f4}
@subsubsection weakref


New @ref{11f5,,WeakMethod} class simulates weak references to bound
methods.  (Contributed by Antoine Pitrou in bpo-14631@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14631}.)

New @ref{c75,,finalize} class makes it possible to register a callback
to be invoked when an object is garbage collected, without needing to
carefully manage the lifecycle of the weak reference itself.  (Contributed by
Richard Oudkerk in bpo-15528@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15528}.)

The callback, if any, associated with a @ref{11f6,,ref} is now
exposed via the @ref{11f7,,__callback__} attribute.  (Contributed
by Mark Dickinson in bpo-17643@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17643}.)

@node xml etree<2>,zipfile<6>,weakref<2>,Improved Modules<10>
@anchor{whatsnew/3 4 xml-etree}@anchor{11f8}
@subsubsection xml.etree


A new parser, @ref{11f9,,XMLPullParser}, allows a
non-blocking applications to parse XML documents.  An example can be
seen at @ref{11fa,,Pull API for non-blocking parsing}.  (Contributed by Antoine
Pitrou in bpo-17741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17741}.)

The @ref{12c,,xml.etree.ElementTree} @ref{11fb,,tostring()} and
@ref{11fc,,tostringlist()} functions, and the
@ref{b4d,,ElementTree}
@ref{c92,,write()} method, now have a
`short_empty_elements' @ref{5a5,,keyword-only parameter}
providing control over whether elements with no content are written in
abbreviated (@code{<tag />}) or expanded (@code{<tag></tag>}) form.  (Contributed by
Ariel Poliak and Serhiy Storchaka in bpo-14377@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14377}.)

@node zipfile<6>,,xml etree<2>,Improved Modules<10>
@anchor{whatsnew/3 4 zipfile}@anchor{11fd}
@subsubsection zipfile


The @ref{11fe,,writepy()} method of the
@ref{11ff,,PyZipFile} class has a new `filterfunc' option that can be
used to control which directories and files are added to the archive.  For
example, this could be used to exclude test files from the archive.
(Contributed by Christian Tismer in bpo-19274@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19274}.)

The `allowZip64' parameter to @ref{8d5,,ZipFile} and
@ref{11ff,,PyZipFile} is now @code{True} by default.  (Contributed by
William Mallard in bpo-17201@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17201}.)

@node CPython Implementation Changes,Deprecated<12>,Improved Modules<10>,What’s New In Python 3 4
@anchor{whatsnew/3 4 cpython-implementation-changes}@anchor{1200}
@subsection CPython Implementation Changes


@menu
* PEP 445; Customization of CPython Memory Allocators: PEP 445 Customization of CPython Memory Allocators. 
* PEP 442; Safe Object Finalization: PEP 442 Safe Object Finalization. 
* PEP 456; Secure and Interchangeable Hash Algorithm: PEP 456 Secure and Interchangeable Hash Algorithm. 
* PEP 436; Argument Clinic: PEP 436 Argument Clinic. 
* Other Build and C API Changes:: 
* Other Improvements: Other Improvements<2>. 
* Significant Optimizations:: 

@end menu

@node PEP 445 Customization of CPython Memory Allocators,PEP 442 Safe Object Finalization,,CPython Implementation Changes
@anchor{whatsnew/3 4 pep-445-customization-of-cpython-memory-allocators}@anchor{1201}@anchor{whatsnew/3 4 whatsnew-pep-445}@anchor{10f6}
@subsubsection PEP 445: Customization of CPython Memory Allocators


@geindex Python Enhancement Proposals; PEP 445
PEP 445@footnote{https://peps.python.org/pep-0445/} adds new C level interfaces to customize memory allocation in
the CPython interpreter.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 445

@item PEP 445@footnote{https://peps.python.org/pep-0445/} – Add new APIs to customize Python memory allocators

PEP written and implemented by Victor Stinner.
@end table


@node PEP 442 Safe Object Finalization,PEP 456 Secure and Interchangeable Hash Algorithm,PEP 445 Customization of CPython Memory Allocators,CPython Implementation Changes
@anchor{whatsnew/3 4 pep-442-safe-object-finalization}@anchor{1202}@anchor{whatsnew/3 4 whatsnew-pep-442}@anchor{10f5}
@subsubsection PEP 442: Safe Object Finalization


@geindex Python Enhancement Proposals; PEP 442
PEP 442@footnote{https://peps.python.org/pep-0442/} removes the current limitations and quirks of object finalization
in CPython. With it, objects with @ref{1203,,__del__()} methods, as well as
generators with @ref{1b1,,finally} clauses, can be finalized when they are
part of a reference cycle.

As part of this change, module globals are no longer forcibly set to
@ref{887,,None} during interpreter shutdown in most cases, instead relying
on the normal operation of the cyclic garbage collector.  This avoids a
whole class of interpreter-shutdown-time errors, usually involving
@code{__del__} methods, that have plagued Python since the cyclic GC
was first introduced.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 442

@item PEP 442@footnote{https://peps.python.org/pep-0442/} – Safe object finalization

PEP written and implemented by Antoine Pitrou.
@end table


@node PEP 456 Secure and Interchangeable Hash Algorithm,PEP 436 Argument Clinic,PEP 442 Safe Object Finalization,CPython Implementation Changes
@anchor{whatsnew/3 4 pep-456-secure-and-interchangeable-hash-algorithm}@anchor{1204}@anchor{whatsnew/3 4 whatsnew-pep-456}@anchor{10ef}
@subsubsection PEP 456: Secure and Interchangeable Hash Algorithm


@geindex Python Enhancement Proposals; PEP 456
PEP 456@footnote{https://peps.python.org/pep-0456/} follows up on earlier security fix work done on Python’s hash
algorithm to address certain DOS attacks to which public facing APIs backed by
dictionary lookups may be subject.  (See bpo-14621@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14621} for the start of the
current round of improvements.)  The PEP unifies CPython’s hash code to make it
easier for a packager to substitute a different hash algorithm, and switches
Python’s default implementation to a SipHash implementation on platforms that
have a 64 bit data type.  Any performance differences in comparison with the
older FNV algorithm are trivial.

The PEP adds additional fields to the @ref{1205,,sys.hash_info} named tuple to
describe the hash algorithm in use by the currently executing binary.  Otherwise,
the PEP does not alter any existing CPython APIs.

@node PEP 436 Argument Clinic,Other Build and C API Changes,PEP 456 Secure and Interchangeable Hash Algorithm,CPython Implementation Changes
@anchor{whatsnew/3 4 pep-436-argument-clinic}@anchor{1206}@anchor{whatsnew/3 4 whatsnew-pep-436}@anchor{10f7}
@subsubsection PEP 436: Argument Clinic


“Argument Clinic” (
@geindex Python Enhancement Proposals; PEP 436
PEP 436@footnote{https://peps.python.org/pep-0436/}) is now part of the CPython build process
and can be used to simplify the process of defining and maintaining
accurate signatures for builtins and standard library extension modules
implemented in C.

Some standard library extension modules have been converted to use Argument
Clinic in Python 3.4, and @ref{ba,,pydoc} and @ref{82,,inspect} have been updated
accordingly.

It is expected that signature metadata for programmatic introspection will
be added to additional callables implemented in C as part of Python 3.4
maintenance releases.

@cartouche
@quotation Note 
The Argument Clinic PEP is not fully up to date with the state of the
implementation. This has been deemed acceptable by the release manager
and core development team in this case, as Argument Clinic will not
be made available as a public API for third party use in Python 3.4.
@end quotation
@end cartouche


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 436

@item PEP 436@footnote{https://peps.python.org/pep-0436/} – The Argument Clinic DSL

PEP written and implemented by Larry Hastings.
@end table


@node Other Build and C API Changes,Other Improvements<2>,PEP 436 Argument Clinic,CPython Implementation Changes
@anchor{whatsnew/3 4 other-build-and-c-api-changes}@anchor{1207}
@subsubsection Other Build and C API Changes



@itemize *

@item 
The new @ref{aa2,,PyType_GetSlot()} function has been added to the stable ABI,
allowing retrieval of function pointers from named type slots when using
the limited API.  (Contributed by Martin von Löwis in bpo-17162@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17162}.)

@item 
The new @code{Py_SetStandardStreamEncoding()} pre-initialization API
allows applications embedding the CPython interpreter to reliably force
a particular encoding and error handler for the standard streams.
(Contributed by Bastien Montagne and Nick Coghlan in bpo-16129@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16129}.)

@item 
Most Python C APIs that don’t mutate string arguments are now correctly
marked as accepting @code{const char *} rather than @code{char *}.  (Contributed
by Serhiy Storchaka in bpo-1772673@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1772673}.)

@item 
A new shell version of @code{python-config} can be used even when a python
interpreter is not available (for example, in cross compilation scenarios).

@item 
@ref{62b,,PyUnicode_FromFormat()} now supports width and precision
specifications for @code{%s}, @code{%A}, @code{%U}, @code{%V}, @code{%S}, and @code{%R}.
(Contributed by Ysj Ray and Victor Stinner in bpo-7330@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7330}.)

@item 
New function @ref{1208,,PyStructSequence_InitType2()} supplements the
existing @ref{1209,,PyStructSequence_InitType()} function.  The difference
is that it returns @code{0} on success and @code{-1} on failure.

@item 
The CPython source can now be compiled using the address sanity checking
features of recent versions of GCC and clang:  the false alarms in the small
object allocator have been silenced.  (Contributed by Dhiru Kholia in
bpo-18596@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18596}.)

@item 
The Windows build now uses Address Space Layout Randomization@footnote{https://en.wikipedia.org/wiki/Address_space_layout_randomization} and Data Execution Prevention@footnote{https://en.wikipedia.org/wiki/Data_Execution_Prevention}.  (Contributed by
Christian Heimes in bpo-16632@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16632}.)

@item 
New function @ref{120a,,PyObject_LengthHint()} is the C API equivalent
of @ref{1173,,operator.length_hint()}.  (Contributed by Armin Ronacher in
bpo-16148@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16148}.)
@end itemize

@node Other Improvements<2>,Significant Optimizations,Other Build and C API Changes,CPython Implementation Changes
@anchor{whatsnew/3 4 other-improvements}@anchor{120b}@anchor{whatsnew/3 4 other-improvements-3-4}@anchor{120c}
@subsubsection Other Improvements

@anchor{whatsnew/3 4 whatsnew-isolated-mode}@anchor{10e0}

@itemize *

@item 
The @ref{120d,,python} command has a new @ref{120e,,option}, @code{-I}, which causes it to run in “isolated mode”,
which means that @ref{3e2,,sys.path} contains neither the script’s directory nor
the user’s @code{site-packages} directory, and all @code{PYTHON*} environment
variables are ignored (it implies both @code{-s} and @code{-E}).  Other
restrictions may also be applied in the future, with the goal being to
isolate the execution of a script from the user’s environment.  This is
appropriate, for example, when Python is used to run a system script.  On
most POSIX systems it can and should be used in the @code{#!} line of system
scripts.  (Contributed by Christian Heimes in bpo-16499@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16499}.)

@item 
Tab-completion is now enabled by default in the interactive interpreter
on systems that support @ref{bf,,readline}.  History is also enabled by default,
and is written to (and read from) the file @code{~/.python-history}.
(Contributed by Antoine Pitrou and Éric Araujo in bpo-5845@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5845}.)

@item 
Invoking the Python interpreter with @code{--version} now outputs the version to
standard output instead of standard error (bpo-18338@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18338}). Similar changes
were made to @ref{7,,argparse} (bpo-18920@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18920}) and other modules that have
script-like invocation capabilities (bpo-18922@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18922}).

@item 
The CPython Windows installer now adds @code{.py} to the 
@geindex PATHEXT
@geindex environment variable; PATHEXT
@code{PATHEXT}
variable when extensions are registered, allowing users to run a python
script at the windows command prompt by just typing its name without the
@code{.py} extension.  (Contributed by Paul Moore in bpo-18569@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18569}.)

@item 
A new @code{make} target coverage-report@footnote{https://devguide.python.org/coverage/#measuring-coverage-of-c-code-with-gcov-and-lcov}
will build python, run the test suite, and generate an HTML coverage report
for the C codebase using @code{gcov} and lcov@footnote{https://github.com/linux-test-project/lcov}.

@item 
The @code{-R} option to the @ref{120f,,python regression test suite} now
also checks for memory allocation leaks, using
@ref{11cd,,sys.getallocatedblocks()}.  (Contributed by Antoine Pitrou in
bpo-13390@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13390}.)

@item 
@code{python -m} now works with namespace packages.

@item 
The @ref{d6,,stat} module is now implemented in C, which means it gets the
values for its constants from the C header files, instead of having the
values hard-coded in the python module as was previously the case.

@item 
Loading multiple python modules from a single OS module (@code{.so}, @code{.dll})
now works correctly (previously it silently returned the first python
module in the file).  (Contributed by Václav Šmilauer in bpo-16421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16421}.)

@item 
A new opcode, @code{LOAD_CLASSDEREF}, has been added to fix a bug in the
loading of free variables in class bodies that could be triggered by certain
uses of @ref{e5e,,__prepare__}.  (Contributed by Benjamin Peterson in
bpo-17853@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17853}.)

@item 
A number of MemoryError-related crashes were identified and fixed by Victor
Stinner using his 
@geindex Python Enhancement Proposals; PEP 445
PEP 445@footnote{https://peps.python.org/pep-0445/}-based @code{pyfailmalloc} tool (bpo-18408@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18408},
bpo-18520@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18520}).

@item 
The @code{pyvenv} command now accepts a @code{--copies} option
to use copies rather than symlinks even on systems where symlinks are the
default.  (Contributed by Vinay Sajip in bpo-18807@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18807}.)

@item 
The @code{pyvenv} command also accepts a @code{--without-pip}
option to suppress the otherwise-automatic bootstrapping of pip into
the virtual environment.  (Contributed by Nick Coghlan in bpo-19552@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19552}
as part of the 
@geindex Python Enhancement Proposals; PEP 453
PEP 453@footnote{https://peps.python.org/pep-0453/} implementation.)

@item 
The encoding name is now optional in the value set for the
@geindex PYTHONIOENCODING
@geindex environment variable; PYTHONIOENCODING
@ref{1210,,PYTHONIOENCODING} environment variable.  This makes it possible to
set just the error handler, without changing the default encoding.
(Contributed by Serhiy Storchaka in bpo-18818@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18818}.)

@item 
The @ref{14,,bz2}, @ref{8e,,lzma}, and @ref{6b,,gzip} module @code{open} functions now
support @code{x} (exclusive creation) mode.  (Contributed by Tim Heaney and
Vajrasky Kok in bpo-19201@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19201}, bpo-19222@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19222}, and bpo-19223@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19223}.)
@end itemize

@node Significant Optimizations,,Other Improvements<2>,CPython Implementation Changes
@anchor{whatsnew/3 4 significant-optimizations}@anchor{1211}
@subsubsection Significant Optimizations



@itemize *

@item 
The UTF-32 decoder is now 3x to 4x faster.  (Contributed by Serhiy Storchaka
in bpo-14625@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14625}.)

@item 
The cost of hash collisions for sets is now reduced.  Each hash table
probe now checks a series of consecutive, adjacent key/hash pairs before
continuing to make random probes through the hash table.  This exploits
cache locality to make collision resolution less expensive.
The collision resolution scheme can be described as a hybrid of linear
probing and open addressing.  The number of additional linear probes
defaults to nine.  This can be changed at compile-time by defining
LINEAR_PROBES to be any value.  Set LINEAR_PROBES=0 to turn-off
linear probing entirely.  (Contributed by Raymond Hettinger in
bpo-18771@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18771}.)

@item 
The interpreter starts about 30% faster. A couple of measures lead to the
speedup. The interpreter loads fewer modules on startup, e.g. the @ref{be,,re},
@ref{1e,,collections} and @ref{8a,,locale} modules and their dependencies are no
longer imported by default. The marshal module has been improved to load
compiled Python code faster.  (Contributed by Antoine Pitrou, Christian
Heimes and Victor Stinner in bpo-19219@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19219}, bpo-19218@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19218}, bpo-19209@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19209},
bpo-19205@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19205} and bpo-9548@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9548}.)

@item 
@ref{a6c,,bz2.BZ2File} is now as fast or faster than the Python2 version for
most cases.  @ref{1212,,lzma.LZMAFile} has also been optimized.  (Contributed by
Serhiy Storchaka and Nadeem Vawda in bpo-16034@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16034}.)

@item 
@ref{1213,,random.getrandbits()} is 20%-40% faster for small integers (the most
common use case).  (Contributed by Serhiy Storchaka in bpo-16674@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16674}.)

@item 
By taking advantage of the new storage format for strings, pickling of
strings is now significantly faster.  (Contributed by Victor Stinner and
Antoine Pitrou in bpo-15596@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15596}.)

@item 
A performance issue in @code{io.FileIO.readall()} has been solved.  This
particularly affects Windows, and significantly speeds up the case of piping
significant amounts of data through @ref{dc,,subprocess}.  (Contributed
by Richard Oudkerk in bpo-15758@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15758}.)

@item 
@ref{1214,,html.escape()} is now 10x faster.  (Contributed by Matt Bryant in
bpo-18020@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18020}.)

@item 
On Windows, the native @code{VirtualAlloc} is now used instead of the CRT
@code{malloc} in @code{obmalloc}.  Artificial benchmarks show about a 3% memory
savings.

@item 
@ref{747,,os.urandom()} now uses a lazily opened persistent file descriptor
so as to avoid using many file descriptors when run in parallel from
multiple threads.  (Contributed by Antoine Pitrou in bpo-18756@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18756}.)
@end itemize

@node Deprecated<12>,Removed<12>,CPython Implementation Changes,What’s New In Python 3 4
@anchor{whatsnew/3 4 deprecated}@anchor{1215}@anchor{whatsnew/3 4 deprecated-3-4}@anchor{110f}
@subsection Deprecated


This section covers various APIs and other features that have been deprecated
in Python 3.4, and will be removed in Python 3.5 or later.  In most (but not
all) cases, using the deprecated APIs will produce a @ref{1a4,,DeprecationWarning}
when the interpreter is run with deprecation warnings enabled (for example, by
using @code{-Wd}).

@menu
* Deprecations in the Python API:: 
* Deprecated Features:: 

@end menu

@node Deprecations in the Python API,Deprecated Features,,Deprecated<12>
@anchor{whatsnew/3 4 deprecations-in-the-python-api}@anchor{1216}
@subsubsection Deprecations in the Python API



@itemize *

@item 
As mentioned in @ref{10e2,,PEP 451; A ModuleSpec Type for the Import System}, a number of @ref{7b,,importlib}
methods and functions are deprecated: @code{importlib.find_loader()} is
replaced by @ref{5af,,importlib.util.find_spec()};
@code{importlib.machinery.PathFinder.find_module()} is replaced by
@ref{1217,,importlib.machinery.PathFinder.find_spec()};
@code{importlib.abc.MetaPathFinder.find_module()} is replaced by
@ref{a6e,,importlib.abc.MetaPathFinder.find_spec()};
@code{importlib.abc.PathEntryFinder.find_loader()} and
@code{find_module()} are replaced by
@ref{a72,,importlib.abc.PathEntryFinder.find_spec()}; all of the @code{@var{xxx}Loader} ABC
@code{load_module} methods (@code{importlib.abc.Loader.load_module()},
@code{importlib.abc.InspectLoader.load_module()},
@code{importlib.abc.FileLoader.load_module()},
@code{importlib.abc.SourceLoader.load_module()}) should no longer be
implemented, instead loaders should implement an
@code{exec_module} method
(@ref{a70,,importlib.abc.Loader.exec_module()},
@ref{1218,,importlib.abc.InspectLoader.exec_module()}
@ref{1219,,importlib.abc.SourceLoader.exec_module()}) and let the import system
take care of the rest; and
@code{importlib.abc.Loader.module_repr()},
@code{importlib.util.module_for_loader()}, @code{importlib.util.set_loader()},
and @code{importlib.util.set_package()} are no longer needed because their
functions are now handled automatically by the import system.

@item 
The @code{imp} module is pending deprecation. To keep compatibility with
Python 2/3 code bases, the module’s removal is currently not scheduled.

@item 
The @code{formatter} module is pending deprecation and is slated for removal
in Python 3.6.

@item 
@code{MD5} as the default `digestmod' for the @ref{c9c,,hmac.new()} function is
deprecated.  Python 3.6 will require an explicit digest name or constructor as
`digestmod' argument.

@item 
The internal @code{Netrc} class in the @ref{62,,ftplib} module has been documented
as deprecated in its docstring for quite some time.  It now emits a
@ref{1a4,,DeprecationWarning} and will be removed completely in Python 3.5.

@item 
The undocumented `endtime' argument to @ref{ee6,,subprocess.Popen.wait()} should
not have been exposed and is hopefully not in use; it is deprecated and
will mostly likely be removed in Python 3.5.

@item 
The `strict' argument of @ref{a7d,,HTMLParser} is deprecated.

@item 
The @ref{b0,,plistlib} @code{readPlist()},
@code{writePlist()}, @code{readPlistFromBytes()}, and
@code{writePlistToBytes()} functions are deprecated in favor of the
corresponding new functions @ref{b4e,,load()}, @ref{b50,,dump()},
@ref{b4f,,loads()}, and @ref{b51,,dumps()}.  @code{Data()}
is deprecated in favor of just using the @ref{193,,bytes} constructor.

@item 
The @ref{e1,,sysconfig} key @code{SO} is deprecated, it has been replaced by
@code{EXT_SUFFIX}.

@item 
The @code{U} mode accepted by various @code{open} functions is deprecated.
In Python3 it does not do anything useful, and should be replaced by
appropriate uses of @ref{9c4,,io.TextIOWrapper} (if needed) and its `newline'
argument.

@item 
The `parser' argument of @ref{57a,,xml.etree.ElementTree.iterparse()} has
been deprecated, as has the `html' argument of
@ref{c4f,,XMLParser()}.  To prepare for the removal of the
latter, all arguments to @code{XMLParser} should be passed by keyword.
@end itemize

@node Deprecated Features,,Deprecations in the Python API,Deprecated<12>
@anchor{whatsnew/3 4 deprecated-features}@anchor{121a}
@subsubsection Deprecated Features



@itemize *

@item 
Running @ref{121b,,IDLE — Python editor and shell} with the @code{-n} flag (no subprocess) is deprecated.
However, the feature will not be removed until bpo-18823@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18823} is resolved.

@item 
The site module adding a “site-python” directory to sys.path, if it
exists, is deprecated (bpo-19375@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19375}).
@end itemize

@node Removed<12>,Porting to Python 3 4,Deprecated<12>,What’s New In Python 3 4
@anchor{whatsnew/3 4 removed}@anchor{121c}
@subsection Removed


@menu
* Operating Systems No Longer Supported:: 
* API and Feature Removals: API and Feature Removals<5>. 
* Code Cleanups:: 

@end menu

@node Operating Systems No Longer Supported,API and Feature Removals<5>,,Removed<12>
@anchor{whatsnew/3 4 operating-systems-no-longer-supported}@anchor{121d}
@subsubsection Operating Systems No Longer Supported


Support for the following operating systems has been removed from the source
and build tools:


@itemize *

@item 
OS/2 (bpo-16135@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16135}).

@item 
Windows 2000 (changeset e52df05b496a).

@item 
Windows systems where @code{COMSPEC} points to @code{command.com} (bpo-14470@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14470}).

@item 
VMS (bpo-16136@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16136}).
@end itemize

@node API and Feature Removals<5>,Code Cleanups,Operating Systems No Longer Supported,Removed<12>
@anchor{whatsnew/3 4 api-and-feature-removals}@anchor{121e}
@subsubsection API and Feature Removals


The following obsolete and previously deprecated APIs and features have been
removed:


@itemize *

@item 
The unmaintained @code{Misc/TextMate} and @code{Misc/vim} directories have been
removed (see the devguide@footnote{https://devguide.python.org}
for suggestions on what to use instead).

@item 
The @code{SO} makefile macro is removed (it was replaced by the
@code{SHLIB_SUFFIX} and @code{EXT_SUFFIX} macros) (bpo-16754@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16754}).

@item 
The @code{PyThreadState.tick_counter} field has been removed; its value has
been meaningless since Python 3.2, when the “new GIL” was introduced
(bpo-19199@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19199}).

@item 
@code{PyLoader} and @code{PyPycLoader} have been removed from @ref{7b,,importlib}.
(Contributed by Taras Lyapun in bpo-15641@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15641}.)

@item 
The `strict' argument to @ref{d3b,,HTTPConnection} and
@ref{d3c,,HTTPSConnection} has been removed.  HTTP 0.9-style
“Simple Responses” are no longer supported.

@item 
The deprecated @ref{11de,,urllib.request.Request} getter and setter methods
@code{add_data}, @code{has_data}, @code{get_data}, @code{get_type}, @code{get_host},
@code{get_selector}, @code{set_proxy}, @code{get_origin_req_host}, and
@code{is_unverifiable} have been removed (use direct attribute access instead).

@item 
Support for loading the deprecated @code{TYPE_INT64} has been removed from
@ref{91,,marshal}.  (Contributed by Dan Riti in bpo-15480@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15480}.)

@item 
@ref{4e4,,inspect.Signature}: positional-only parameters are now required
to have a valid name.

@item 
@ref{832,,object.__format__()} no longer accepts non-empty format strings, it now
raises a @ref{199,,TypeError} instead.  Using a non-empty string has been
deprecated since Python 3.2.  This change has been made to prevent a
situation where previously working (but incorrect) code would start failing
if an object gained a __format__ method, which means that your code may now
raise a @code{TypeError} if you are using an @code{'s'} format code with objects
that do not have a __format__ method that handles it.  See bpo-7994@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7994} for
background.

@item 
@code{difflib.SequenceMatcher.isbjunk()} and
@code{difflib.SequenceMatcher.isbpopular()} were deprecated in 3.2, and have
now been removed: use @code{x in sm.bjunk} and
@code{x in sm.bpopular}, where `sm' is a @ref{121f,,SequenceMatcher} object
(bpo-13248@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13248}).
@end itemize

@node Code Cleanups,,API and Feature Removals<5>,Removed<12>
@anchor{whatsnew/3 4 code-cleanups}@anchor{1220}
@subsubsection Code Cleanups



@itemize *

@item 
The unused and undocumented internal @code{Scanner} class has been removed from
the @ref{ba,,pydoc} module.

@item 
The private and effectively unused @code{_gestalt} module has been removed,
along with the private @ref{af,,platform} functions @code{_mac_ver_lookup},
@code{_mac_ver_gstalt}, and @code{_bcd2str}, which would only have ever been called
on badly broken OSX systems (see bpo-18393@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18393}).

@item 
The hardcoded copies of certain @ref{d6,,stat} constants that were included in
the @ref{e4,,tarfile} module namespace have been removed.
@end itemize

@node Porting to Python 3 4,Changed in 3 4 3,Removed<12>,What’s New In Python 3 4
@anchor{whatsnew/3 4 porting-to-python-3-4}@anchor{1221}
@subsection Porting to Python 3.4


This section lists previously described changes and other bugfixes
that may require changes to your code.

@menu
* Changes in ‘python’ Command Behavior: Changes in ‘python’ Command Behavior<2>. 
* Changes in the Python API: Changes in the Python API<11>. 
* Changes in the C API: Changes in the C API<9>. 

@end menu

@node Changes in ‘python’ Command Behavior<2>,Changes in the Python API<11>,,Porting to Python 3 4
@anchor{whatsnew/3 4 changes-in-python-command-behavior}@anchor{1222}
@subsubsection Changes in ‘python’ Command Behavior



@itemize *

@item 
In a posix shell, setting the 
@geindex PATH
@geindex environment variable; PATH
@code{PATH} environment variable to
an empty value is equivalent to not setting it at all.  However, setting
@geindex PYTHONPATH
@geindex environment variable; PYTHONPATH
@ref{1223,,PYTHONPATH} to an empty value was `not' equivalent to not setting it
at all: setting 
@geindex PYTHONPATH
@geindex environment variable; PYTHONPATH
@code{PYTHONPATH} to an empty value was equivalent to
setting it to @code{.}, which leads to confusion when reasoning by analogy to
how 
@geindex PATH
@geindex environment variable; PATH
@code{PATH} works.  The behavior now conforms to the posix convention
for 
@geindex PATH
@geindex environment variable; PATH
@code{PATH}.

@item 
The [X refs, Y blocks] output of a debug (@code{--with-pydebug}) build of the
CPython interpreter is now off by default.  It can be re-enabled using the
@code{-X showrefcount} option.  (Contributed by Ezio Melotti in bpo-17323@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17323}.)

@item 
The python command and most stdlib scripts (as well as @ref{7,,argparse}) now
output @code{--version} information to @code{stdout} instead of @code{stderr} (for
issue list see @ref{120c,,Other Improvements} above).
@end itemize

@node Changes in the Python API<11>,Changes in the C API<9>,Changes in ‘python’ Command Behavior<2>,Porting to Python 3 4
@anchor{whatsnew/3 4 changes-in-the-python-api}@anchor{1224}
@subsubsection Changes in the Python API



@itemize *

@item 
The ABCs defined in @ref{7c,,importlib.abc} now either raise the appropriate
exception or return a default value instead of raising
@ref{369,,NotImplementedError} blindly. This will only affect code calling
@ref{1a7,,super()} and falling through all the way to the ABCs. For compatibility,
catch both @code{NotImplementedError} or the appropriate exception as needed.

@item 
The module type now initializes the @ref{325,,__package__} and
@ref{339,,__loader__}
attributes to @code{None} by default. To determine if these attributes were set
in a backwards-compatible fashion, use e.g.
@code{getattr(module, '__loader__', None) is not None}.  (bpo-17115@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17115}.)

@item 
@code{importlib.util.module_for_loader()} now sets @code{__loader__} and
@code{__package__} unconditionally to properly support reloading. If this is not
desired then you will need to set these attributes manually. You can use
@code{importlib.util.module_to_load()} for module management.

@item 
Import now resets relevant attributes (e.g. @code{__name__}, @code{__loader__},
@code{__package__}, @code{__file__}, @code{__cached__}) unconditionally when reloading.
Note that this restores a pre-3.3 behavior in that it means a module is
re-found when re-loaded (bpo-19413@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19413}).

@item 
Frozen packages no longer set @code{__path__} to a list containing the package
name, they now set it to an empty list.  The previous behavior could cause
the import system to do the wrong thing on submodule imports if there was
also a directory with the same name as the frozen package.  The correct way
to determine if a module is a package or not is to use @code{hasattr(module,
'__path__')} (bpo-18065@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18065}).

@item 
Frozen modules no longer define a @code{__file__} attribute. It’s semantically
incorrect for frozen modules to set the attribute as they are not loaded from
any explicit location. If you must know that a module comes from frozen code
then you can see if the module’s @code{__spec__.location} is set to @code{'frozen'},
check if the loader is a subclass of
@ref{1225,,importlib.machinery.FrozenImporter},
or if Python 2 compatibility is necessary you can use @code{imp.is_frozen()}.

@item 
@ref{c20,,py_compile.compile()} now raises @ref{1226,,FileExistsError} if the file path
it would write to is a symlink or a non-regular file. This is to act as a
warning that import will overwrite those files with a regular file regardless
of what type of file path they were originally.

@item 
@ref{1227,,importlib.abc.SourceLoader.get_source()} no longer raises
@ref{65b,,ImportError} when the source code being loaded triggers a
@ref{18f,,SyntaxError} or @ref{c0e,,UnicodeDecodeError}. As @code{ImportError} is
meant to be raised only when source code cannot be found but it should, it was
felt to be over-reaching/overloading of that meaning when the source code is
found but improperly structured. If you were catching ImportError before and
wish to continue to ignore syntax or decoding issues, catch all three
exceptions now.

@item 
@ref{1228,,functools.update_wrapper()} and @ref{1163,,functools.wraps()} now correctly
set the @code{__wrapped__} attribute to the function being wrapped, even if
that function also had its @code{__wrapped__} attribute set. This means
@code{__wrapped__} attributes now correctly link a stack of decorated
functions rather than every @code{__wrapped__} attribute in the chain
referring to the innermost function. Introspection libraries that
assumed the previous behaviour was intentional can use
@ref{1162,,inspect.unwrap()} to access the first function in the chain that has
no @code{__wrapped__} attribute.

@item 
@ref{946,,inspect.getfullargspec()} has been reimplemented on top of
@ref{231,,inspect.signature()} and hence handles a much wider variety of callable
objects than it did in the past. It is expected that additional builtin and
extension module callables will gain signature metadata over the course of
the Python 3.4 series. Code that assumes that
@code{inspect.getfullargspec()} will fail on non-Python callables may need
to be adjusted accordingly.

@item 
@ref{1229,,importlib.machinery.PathFinder} now passes on the current working
directory to objects in @ref{122a,,sys.path_hooks} for the empty string. This
results in @ref{7fb,,sys.path_importer_cache} never containing @code{'@w{'}}, thus
iterating through @code{sys.path_importer_cache} based on @ref{3e2,,sys.path}
will not find all keys. A module’s @code{__file__} when imported in the current
working directory will also now have an absolute path, including when using
@code{-m} with the interpreter (except for @code{__main__.__file__} when a script
has been executed directly using a relative path) (Contributed by Brett
Cannon in bpo-18416@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18416}).  is specified on the command-line)
(bpo-18416@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18416}).

@item 
The removal of the `strict' argument to @ref{d3b,,HTTPConnection}
and @ref{d3c,,HTTPSConnection} changes the meaning of the
remaining arguments if you are specifying them positionally rather than by
keyword.  If you’ve been paying attention to deprecation warnings your code
should already be specifying any additional arguments via keywords.

@item 
Strings between @code{from __future__ import ...} statements now `always' raise
a @ref{18f,,SyntaxError}.  Previously if there was no leading docstring, an
interstitial string would sometimes be ignored.  This brings CPython into
compliance with the language spec; Jython and PyPy already were.
(bpo-17434@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17434}).

@item 
@ref{11be,,ssl.SSLSocket.getpeercert()} and @ref{1073,,ssl.SSLSocket.do_handshake()}
now raise an @ref{2c2,,OSError} with @code{ENOTCONN} when the @code{SSLSocket} is not
connected, instead of the previous behavior of raising an
@ref{5f0,,AttributeError}.  In addition, @code{getpeercert()}
will raise a @ref{2ee,,ValueError} if the handshake has not yet been done.

@item 
@ref{122b,,base64.b32decode()} now raises a @ref{122c,,binascii.Error} when the
input string contains non-b32-alphabet characters, instead of a
@ref{199,,TypeError}.  This particular @code{TypeError} was missed when the other
@code{TypeError}s were converted.  (Contributed by Serhiy Storchaka in
bpo-18011@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18011}.)  Note: this change was also inadvertently applied in Python
3.3.3.

@item 
The @code{file} attribute is now automatically closed when
the creating @code{cgi.FieldStorage} instance is garbage collected. If you
were pulling the file object out separately from the @code{cgi.FieldStorage}
instance and not keeping the instance alive, then you should either store the
entire @code{cgi.FieldStorage} instance or read the contents of the file
before the @code{cgi.FieldStorage} instance is garbage collected.

@item 
Calling @code{read} or @code{write} on a closed SSL socket now raises an
informative @ref{2ee,,ValueError} rather than the previous more mysterious
@ref{5f0,,AttributeError} (bpo-9177@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9177}).

@item 
@ref{122d,,slice.indices()} no longer produces an @ref{a87,,OverflowError} for huge
values.  As a consequence of this fix, @code{slice.indices()} now raises a
@ref{2ee,,ValueError} if given a negative length; previously it returned nonsense
values (bpo-14794@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14794}).

@item 
The @ref{198,,complex} constructor, unlike the @ref{19,,cmath} functions, was
incorrectly accepting @ref{197,,float} values if an object’s @code{__complex__}
special method returned one.  This now raises a @ref{199,,TypeError}.
(bpo-16290@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16290}.)

@item 
The @ref{19c,,int} constructor in 3.2 and 3.3 erroneously accepts @ref{197,,float}
values for the `base' parameter.  It is unlikely anyone was doing this, but
if so, it will now raise a @ref{199,,TypeError} (bpo-16772@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16772}).

@item 
Defaults for keyword-only arguments are now evaluated `after' defaults for
regular keyword arguments, instead of before.  Hopefully no one wrote any
code that depends on the previous buggy behavior (bpo-16967@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16967}).

@item 
Stale thread states are now cleared after @ref{4b6,,fork()}.  This may cause
some system resources to be released that previously were incorrectly kept
perpetually alive (for example, database connections kept in thread-local
storage).  (bpo-17094@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17094}.)

@item 
Parameter names in @code{__annotations__} dicts are now mangled properly,
similarly to @ref{122e,,__kwdefaults__}.
(Contributed by Yury Selivanov in bpo-20625@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20625}.)

@item 
@ref{114d,,hashlib.hash.name} now always returns the identifier in lower case.
Previously some builtin hashes had uppercase names, but now that it is a
formal public interface the naming has been made consistent (bpo-18532@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18532}).

@item 
Because @ref{ffb,,unittest.TestSuite} now drops references to tests after they
are run, test harnesses that reuse a @ref{ffb,,TestSuite} to re-run
a set of tests may fail.   Test suites should not be re-used in this fashion
since it means state is retained between test runs, breaking the test
isolation that @ref{10d,,unittest} is designed to provide.  However, if the lack
of isolation is considered acceptable, the old behavior can be restored by
creating a @code{TestSuite} subclass that defines a
@code{_removeTestAtIndex} method that does nothing (see
@ref{122f,,TestSuite.__iter__()}) (bpo-11798@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11798}).

@item 
@ref{10d,,unittest} now uses @ref{7,,argparse} for command line parsing.  There are
certain invalid command forms that used to work that are no longer allowed;
in theory this should not cause backward compatibility issues since the
disallowed command forms didn’t make any sense and are unlikely to be in use.

@item 
The @ref{5a2,,re.split()}, @ref{1230,,re.findall()}, and @ref{5a3,,re.sub()} functions, and
the @ref{1231,,group()} and @ref{1232,,groups()} methods of
@code{match} objects now always return a `bytes' object when the string
to be matched is a @ref{194,,bytes-like object}.  Previously the return type
matched the input type, so if your code was depending on the return value
being, say, a @code{bytearray}, you will need to change your code.

@item 
@code{audioop} functions now raise an error immediately if passed string
input, instead of failing randomly later on (bpo-16685@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16685}).

@item 
The new `convert_charrefs' argument to @ref{a7d,,HTMLParser}
currently defaults to @code{False} for backward compatibility, but will
eventually be changed to default to @code{True}.  It is recommended that you add
this keyword, with the appropriate value, to any
@code{HTMLParser} calls in your code (bpo-13633@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13633}).

@item 
Since the `digestmod' argument to the @ref{c9c,,hmac.new()} function will in the
future have no default, all calls to @code{hmac.new()} should be changed to
explicitly specify a `digestmod' (bpo-17276@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17276}).

@item 
Calling @ref{175,,sysconfig.get_config_var()} with the @code{SO} key, or looking
@code{SO} up in the results of a call to @ref{29a,,sysconfig.get_config_vars()}
is deprecated.  This key should be replaced by @code{EXT_SUFFIX} or
@code{SHLIB_SUFFIX}, depending on the context (bpo-19555@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19555}).

@item 
Any calls to @code{open} functions that specify @code{U} should be modified.
@code{U} is ineffective in Python3 and will eventually raise an error if used.
Depending on the function, the equivalent of its old Python2 behavior can be
achieved using either a `newline' argument, or if necessary by wrapping the
stream in @ref{9c4,,TextIOWrapper} to use its `newline' argument
(bpo-15204@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15204}).

@item 
If you use @code{pyvenv} in a script and desire that pip
`not' be installed, you must add @code{--without-pip} to your command
invocation.

@item 
The default behavior of @ref{f46,,json.dump()} and @ref{f47,,json.dumps()} when
an indent is specified has changed: it no longer produces trailing
spaces after the item separating commas at the ends of lines.  This
will matter only if you have tests that are doing white-space-sensitive
comparisons of such output (bpo-16333@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16333}).

@item 
@ref{3e,,doctest} now looks for doctests in extension module @code{__doc__}
strings, so if your doctest test discovery includes extension modules that
have things that look like doctests in them you may see test failures you’ve
never seen before when running your tests (bpo-3158@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3158}).

@item 
The @ref{1f,,collections.abc} module has been slightly refactored as
part of the Python startup improvements.  As a consequence of this, it is no
longer the case that importing @ref{1e,,collections} automatically imports
@code{collections.abc}.  If your program depended on the (undocumented)
implicit import, you will need to add an explicit @code{import collections.abc}
(bpo-20784@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20784}).
@end itemize

@node Changes in the C API<9>,,Changes in the Python API<11>,Porting to Python 3 4
@anchor{whatsnew/3 4 changes-in-the-c-api}@anchor{1233}
@subsubsection Changes in the C API



@itemize *

@item 
@ref{1234,,PyEval_EvalFrameEx()}, @ref{1235,,PyObject_Repr()}, and
@ref{1236,,PyObject_Str()}, along with some other internal C APIs, now include
a debugging assertion that ensures they are not used in situations where
they may silently discard a currently active exception. In cases where
discarding the active exception is expected and desired (for example,
because it has already been saved locally with @ref{426,,PyErr_Fetch()} or
is being deliberately replaced with a different exception), an explicit
@ref{1237,,PyErr_Clear()} call will be needed to avoid triggering the
assertion when invoking these operations (directly or indirectly) and
running against a version of Python that is compiled with assertions
enabled.

@item 
@ref{f3f,,PyErr_SetImportError()} now sets @ref{199,,TypeError} when its `msg'
argument is not set. Previously only @code{NULL} was returned with no exception
set.

@item 
The result of the @ref{7a6,,PyOS_ReadlineFunctionPointer} callback must
now be a string allocated by @ref{631,,PyMem_RawMalloc()} or
@ref{633,,PyMem_RawRealloc()}, or @code{NULL} if an error occurred, instead of a
string allocated by @ref{e66,,PyMem_Malloc()} or @ref{1238,,PyMem_Realloc()}
(bpo-16742@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16742})

@item 
@ref{439,,PyThread_set_key_value()} now always set the value. In Python
3.3, the function did nothing if the key already exists (if the current
value is a non-@code{NULL} pointer).

@item 
The @code{f_tstate} (thread state) field of the @ref{991,,PyFrameObject}
structure has been removed to fix a bug: see bpo-14432@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14432} for the
rationale.
@end itemize

@node Changed in 3 4 3,,Porting to Python 3 4,What’s New In Python 3 4
@anchor{whatsnew/3 4 changed-in-3-4-3}@anchor{1239}
@subsection Changed in 3.4.3


@menu
* PEP 476; Enabling certificate verification by default for stdlib http clients: PEP 476 Enabling certificate verification by default for stdlib http clients. 

@end menu

@node PEP 476 Enabling certificate verification by default for stdlib http clients,,,Changed in 3 4 3
@anchor{whatsnew/3 4 pep-476}@anchor{123a}@anchor{whatsnew/3 4 pep-476-enabling-certificate-verification-by-default-for-stdlib-http-clients}@anchor{123b}
@subsubsection PEP 476: Enabling certificate verification by default for stdlib http clients


@ref{73,,http.client} and modules which use it, such as @ref{112,,urllib.request} and
@ref{135,,xmlrpc.client}, will now verify that the server presents a certificate
which is signed by a CA in the platform trust store and whose hostname matches
the hostname being requested by default, significantly improving security for
many applications.

For applications which require the old previous behavior, they can pass an
alternate context:

@example
import urllib.request
import ssl

# This disables all verification
context = ssl._create_unverified_context()

# This allows using a specific certificate for the host, which doesn't need
# to be in the trust store
context = ssl.create_default_context(cafile="/path/to/file.crt")

urllib.request.urlopen("https://invalid-cert", context=context)
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node What’s New In Python 3 3,What’s New In Python 3 2,What’s New In Python 3 4,What’s New in Python
@anchor{whatsnew/3 3 doc}@anchor{123c}@anchor{whatsnew/3 3 translation-repo}@anchor{123d}@anchor{whatsnew/3 3 what-s-new-in-python-3-3}@anchor{123e}
@section What’s New In Python 3.3


@c Rules for maintenance:
@c 
@c * Anyone can add text to this document.  Do not spend very much time
@c on the wording of your changes, because your text will probably
@c get rewritten to some degree.
@c 
@c * The maintainer will go through Misc/NEWS periodically and add
@c changes; it's therefore more important to add your changes to
@c Misc/NEWS than to this file.
@c 
@c * This is not a complete list of every single change; completeness
@c is the purpose of Misc/NEWS.  Some changes I consider too small
@c or esoteric to include.  If such a change is added to the text,
@c I'll just remove it.  (This is another reason you shouldn't spend
@c too much time on writing your addition.)
@c 
@c * If you want to draw your new text to the attention of the
@c maintainer, add 'XXX' to the beginning of the paragraph or
@c section.
@c 
@c * It's OK to just add a fragmentary note about a change.  For
@c example: "XXX Describe the transmogrify() function added to the
@c socket module."  The maintainer will research the change and
@c write the necessary text.
@c 
@c * You can comment out your additions if you like, but it's not
@c necessary (especially when a final release is some months away).
@c 
@c * Credit the author of a patch or bugfix.   Just the name is
@c sufficient; the e-mail address isn't necessary.
@c 
@c * It's helpful to add the bug/patch number as a comment:
@c 
@c XXX Describe the transmogrify() function added to the socket
@c module.
@c (Contributed by P.Y. Developer in :issue:`12345`.)
@c 
@c This saves the maintainer the effort of going through the Mercurial log
@c when researching a change.

This article explains the new features in Python 3.3, compared to 3.2.
Python 3.3 was released on September 29, 2012.  For full details,
see the changelog@footnote{https://docs.python.org/3.3/whatsnew/changelog.html}.


@subsubheading See also


@geindex Python Enhancement Proposals; PEP 398
PEP 398@footnote{https://peps.python.org/pep-0398/} - Python 3.3 Release Schedule


@menu
* Summary – Release highlights: Summary – Release highlights<9>. 
* PEP 405; Virtual Environments: PEP 405 Virtual Environments. 
* PEP 420; Implicit Namespace Packages: PEP 420 Implicit Namespace Packages. 
* PEP 3118; New memoryview implementation and buffer protocol documentation: PEP 3118 New memoryview implementation and buffer protocol documentation. 
* PEP 393; Flexible String Representation: PEP 393 Flexible String Representation. 
* PEP 397; Python Launcher for Windows: PEP 397 Python Launcher for Windows. 
* PEP 3151; Reworking the OS and IO exception hierarchy: PEP 3151 Reworking the OS and IO exception hierarchy. 
* PEP 380; Syntax for Delegating to a Subgenerator: PEP 380 Syntax for Delegating to a Subgenerator. 
* PEP 409; Suppressing exception context: PEP 409 Suppressing exception context. 
* PEP 414; Explicit Unicode literals: PEP 414 Explicit Unicode literals. 
* PEP 3155; Qualified name for classes and functions: PEP 3155 Qualified name for classes and functions. 
* PEP 412; Key-Sharing Dictionary: PEP 412 Key-Sharing Dictionary. 
* PEP 362; Function Signature Object: PEP 362 Function Signature Object. 
* PEP 421; Adding sys.implementation: PEP 421 Adding sys implementation. 
* Using importlib as the Implementation of Import:: 
* Other Language Changes: Other Language Changes<11>. 
* A Finer-Grained Import Lock:: 
* Builtin functions and types:: 
* New Modules: New Modules<11>. 
* Improved Modules: Improved Modules<11>. 
* Optimizations: Optimizations<11>. 
* Build and C API Changes: Build and C API Changes<4>. 
* Deprecated: Deprecated<13>. 
* Porting to Python 3.3: Porting to Python 3 3. 

@end menu

@node Summary – Release highlights<9>,PEP 405 Virtual Environments,,What’s New In Python 3 3
@anchor{whatsnew/3 3 summary-release-highlights}@anchor{123f}
@subsection Summary – Release highlights


@c This section singles out the most important changes in Python 3.3.
@c Brevity is key.

New syntax features:


@itemize *

@item 
New @code{yield from} expression for @ref{1240,,generator delegation}.

@item 
The @code{u'unicode'} syntax is accepted again for @ref{16a,,str} objects.
@end itemize

New library modules:


@itemize *

@item 
@ref{5c,,faulthandler} (helps debugging low-level crashes)

@item 
@ref{84,,ipaddress} (high-level objects representing IP addresses and masks)

@item 
@ref{8e,,lzma} (compress data using the XZ / LZMA algorithm)

@item 
@ref{10e,,unittest.mock} (replace parts of your system under test with mock objects)

@item 
@ref{118,,venv} (Python @ref{1241,,virtual environments}, as in the
popular @code{virtualenv} package)
@end itemize

New built-in features:


@itemize *

@item 
Reworked @ref{1242,,I/O exception hierarchy}.
@end itemize

Implementation improvements:


@itemize *

@item 
Rewritten @ref{1243,,import machinery} based on @ref{7b,,importlib}.

@item 
More compact @ref{1244,,unicode strings}.

@item 
More compact @ref{1245,,attribute dictionaries}.
@end itemize

Significantly Improved Library Modules:


@itemize *

@item 
C Accelerator for the @ref{1246,,decimal} module.

@item 
Better unicode handling in the @ref{1247,,email} module
(@ref{1248,,provisional}).
@end itemize

Security improvements:


@itemize *

@item 
Hash randomization is switched on by default.
@end itemize

Please read on for a comprehensive list of user-facing changes.

@node PEP 405 Virtual Environments,PEP 420 Implicit Namespace Packages,Summary – Release highlights<9>,What’s New In Python 3 3
@anchor{whatsnew/3 3 pep-405}@anchor{1241}@anchor{whatsnew/3 3 pep-405-virtual-environments}@anchor{1249}
@subsection PEP 405: Virtual Environments


Virtual environments help create separate Python setups while sharing a
system-wide base install, for ease of maintenance.  Virtual environments
have their own set of private site packages (i.e. locally installed
libraries), and are optionally segregated from the system-wide site
packages.  Their concept and implementation are inspired by the popular
@code{virtualenv} third-party package, but benefit from tighter integration
with the interpreter core.

This PEP adds the @ref{118,,venv} module for programmatic access, and the
@code{pyvenv} script for command-line access and
administration.  The Python interpreter checks for a @code{pyvenv.cfg},
file whose existence signals the base of a virtual environment’s directory
tree.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 405

@item PEP 405@footnote{https://peps.python.org/pep-0405/} - Python Virtual Environments

PEP written by Carl Meyer; implementation by Carl Meyer and Vinay Sajip
@end table


@node PEP 420 Implicit Namespace Packages,PEP 3118 New memoryview implementation and buffer protocol documentation,PEP 405 Virtual Environments,What’s New In Python 3 3
@anchor{whatsnew/3 3 pep-420-implicit-namespace-packages}@anchor{124a}
@subsection PEP 420: Implicit Namespace Packages


Native support for package directories that don’t require @code{__init__.py}
marker files and can automatically span multiple path segments (inspired by
various third party approaches to namespace packages, as described in
@geindex Python Enhancement Proposals; PEP 420
PEP 420@footnote{https://peps.python.org/pep-0420/})


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 420

@item PEP 420@footnote{https://peps.python.org/pep-0420/} - Implicit Namespace Packages

PEP written by Eric V. Smith; implementation by Eric V. Smith
and Barry Warsaw
@end table


@node PEP 3118 New memoryview implementation and buffer protocol documentation,PEP 393 Flexible String Representation,PEP 420 Implicit Namespace Packages,What’s New In Python 3 3
@anchor{whatsnew/3 3 pep-3118-new-memoryview-implementation-and-buffer-protocol-documentation}@anchor{124b}@anchor{whatsnew/3 3 pep-3118-update}@anchor{124c}
@subsection PEP 3118: New memoryview implementation and buffer protocol documentation


The implementation of 
@geindex Python Enhancement Proposals; PEP 3118
PEP 3118@footnote{https://peps.python.org/pep-3118/} has been significantly improved.

The new memoryview implementation comprehensively fixes all ownership and
lifetime issues of dynamically allocated fields in the Py_buffer struct
that led to multiple crash reports. Additionally, several functions that
crashed or returned incorrect results for non-contiguous or multi-dimensional
input have been fixed.

The memoryview object now has a PEP-3118 compliant getbufferproc()
that checks the consumer’s request type. Many new features have been
added, most of them work in full generality for non-contiguous arrays
and arrays with suboffsets.

The documentation has been updated, clearly spelling out responsibilities
for both exporters and consumers. Buffer request flags are grouped into
basic and compound flags. The memory layout of non-contiguous and
multi-dimensional NumPy-style arrays is explained.

@menu
* Features:: 
* API changes:: 

@end menu

@node Features,API changes,,PEP 3118 New memoryview implementation and buffer protocol documentation
@anchor{whatsnew/3 3 features}@anchor{124d}
@subsubsection Features



@itemize *

@item 
All native single character format specifiers in struct module syntax
(optionally prefixed with ‘@@’) are now supported.

@item 
With some restrictions, the cast() method allows changing of format and
shape of C-contiguous arrays.

@item 
Multi-dimensional list representations are supported for any array type.

@item 
Multi-dimensional comparisons are supported for any array type.

@item 
One-dimensional memoryviews of hashable (read-only) types with formats B,
b or c are now hashable.  (Contributed by Antoine Pitrou in bpo-13411@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13411}.)

@item 
Arbitrary slicing of any 1-D arrays type is supported. For example, it
is now possible to reverse a memoryview in `O'(1) by using a negative step.
@end itemize

@node API changes,,Features,PEP 3118 New memoryview implementation and buffer protocol documentation
@anchor{whatsnew/3 3 api-changes}@anchor{124e}
@subsubsection API changes



@itemize *

@item 
The maximum number of dimensions is officially limited to 64.

@item 
The representation of empty shape, strides and suboffsets is now
an empty tuple instead of @code{None}.

@item 
Accessing a memoryview element with format ‘B’ (unsigned bytes)
now returns an integer (in accordance with the struct module syntax).
For returning a bytes object the view must be cast to ‘c’ first.

@item 
memoryview comparisons now use the logical structure of the operands
and compare all array elements by value. All format strings in struct
module syntax are supported. Views with unrecognised format strings
are still permitted, but will always compare as unequal, regardless
of view contents.

@item 
For further changes see @ref{124f,,Build and C API Changes} and @ref{1250,,Porting C code}.
@end itemize

(Contributed by Stefan Krah in bpo-10181@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10181}.)


@subsubheading See also


@geindex Python Enhancement Proposals; PEP 3118
PEP 3118@footnote{https://peps.python.org/pep-3118/} - Revising the Buffer Protocol


@node PEP 393 Flexible String Representation,PEP 397 Python Launcher for Windows,PEP 3118 New memoryview implementation and buffer protocol documentation,What’s New In Python 3 3
@anchor{whatsnew/3 3 pep-393}@anchor{1244}@anchor{whatsnew/3 3 pep-393-flexible-string-representation}@anchor{1251}
@subsection PEP 393: Flexible String Representation


The Unicode string type is changed to support multiple internal
representations, depending on the character with the largest Unicode ordinal
(1, 2, or 4 bytes) in the represented string.  This allows a space-efficient
representation in common cases, but gives access to full UCS-4 on all
systems.  For compatibility with existing APIs, several representations may
exist in parallel; over time, this compatibility should be phased out.

On the Python side, there should be no downside to this change.

On the C API side, 
@geindex Python Enhancement Proposals; PEP 393
PEP 393@footnote{https://peps.python.org/pep-0393/} is fully backward compatible.  The legacy API
should remain available at least five years.  Applications using the legacy
API will not fully benefit of the memory reduction, or - worse - may use
a bit more memory, because Python may have to maintain two versions of each
string (in the legacy format and in the new efficient storage).

@menu
* Functionality:: 
* Performance and resource usage:: 

@end menu

@node Functionality,Performance and resource usage,,PEP 393 Flexible String Representation
@anchor{whatsnew/3 3 functionality}@anchor{1252}
@subsubsection Functionality


Changes introduced by 
@geindex Python Enhancement Proposals; PEP 393
PEP 393@footnote{https://peps.python.org/pep-0393/} are the following:


@itemize *

@item 
Python now always supports the full range of Unicode code points, including
non-BMP ones (i.e. from @code{U+0000} to @code{U+10FFFF}).  The distinction between
narrow and wide builds no longer exists and Python now behaves like a wide
build, even under Windows.

@item 
With the death of narrow builds, the problems specific to narrow builds have
also been fixed, for example:


@itemize *

@item 
@ref{841,,len()} now always returns 1 for non-BMP characters,
so @code{len('\U0010FFFF') == 1};

@item 
surrogate pairs are not recombined in string literals,
so @code{'\uDBFF\uDFFF' != '\U0010FFFF'};

@item 
indexing or slicing non-BMP characters returns the expected value,
so @code{'\U0010FFFF'[0]} now returns @code{'\U0010FFFF'} and not @code{'\uDBFF'};

@item 
all other functions in the standard library now correctly handle
non-BMP code points.
@end itemize

@item 
The value of @ref{1253,,sys.maxunicode} is now always @code{1114111} (@code{0x10FFFF}
in hexadecimal).  The @code{PyUnicode_GetMax()} function still returns
either @code{0xFFFF} or @code{0x10FFFF} for backward compatibility, and it should
not be used with the new Unicode API (see bpo-13054@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13054}).

@item 
The @code{./configure} flag @code{--with-wide-unicode} has been removed.
@end itemize

@node Performance and resource usage,,Functionality,PEP 393 Flexible String Representation
@anchor{whatsnew/3 3 performance-and-resource-usage}@anchor{1254}
@subsubsection Performance and resource usage


The storage of Unicode strings now depends on the highest code point in the string:


@itemize *

@item 
pure ASCII and Latin1 strings (@code{U+0000-U+00FF}) use 1 byte per code point;

@item 
BMP strings (@code{U+0000-U+FFFF}) use 2 bytes per code point;

@item 
non-BMP strings (@code{U+10000-U+10FFFF}) use 4 bytes per code point.
@end itemize

The net effect is that for most applications, memory usage of string
storage should decrease significantly - especially compared to former
wide unicode builds - as, in many cases, strings will be pure ASCII
even in international contexts (because many strings store non-human
language data, such as XML fragments, HTTP headers, JSON-encoded data,
etc.).  We also hope that it will, for the same reasons, increase CPU
cache efficiency on non-trivial applications. The memory usage of
Python 3.3 is two to three times smaller than Python 3.2, and a little
bit better than Python 2.7, on a Django benchmark (see the PEP for
details).


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 393

@item PEP 393@footnote{https://peps.python.org/pep-0393/} - Flexible String Representation

PEP written by Martin von Löwis; implementation by Torsten Becker
and Martin von Löwis.
@end table


@node PEP 397 Python Launcher for Windows,PEP 3151 Reworking the OS and IO exception hierarchy,PEP 393 Flexible String Representation,What’s New In Python 3 3
@anchor{whatsnew/3 3 pep-397}@anchor{1255}@anchor{whatsnew/3 3 pep-397-python-launcher-for-windows}@anchor{1256}
@subsection PEP 397: Python Launcher for Windows


The Python 3.3 Windows installer now includes a @code{py} launcher application
that can be used to launch Python applications in a version independent
fashion.

This launcher is invoked implicitly when double-clicking @code{*.py} files.
If only a single Python version is installed on the system, that version
will be used to run the file. If multiple versions are installed, the most
recent version is used by default, but this can be overridden by including
a Unix-style “shebang line” in the Python script.

The launcher can also be used explicitly from the command line as the @code{py}
application. Running @code{py} follows the same version selection rules as
implicitly launching scripts, but a more specific version can be selected
by passing appropriate arguments (such as @code{-3} to request Python 3 when
Python 2 is also installed, or @code{-2.6} to specifically request an earlier
Python version when a more recent version is installed).

In addition to the launcher, the Windows installer now includes an
option to add the newly installed Python to the system PATH.  (Contributed
by Brian Curtin in bpo-3561@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3561}.)


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 397

@item PEP 397@footnote{https://peps.python.org/pep-0397/} - Python Launcher for Windows

PEP written by Mark Hammond and Martin v. Löwis; implementation by
Vinay Sajip.
@end table

Launcher documentation: @ref{7db,,Python install manager}

Installer PATH modification: @ref{1257,,Python install manager}


@node PEP 3151 Reworking the OS and IO exception hierarchy,PEP 380 Syntax for Delegating to a Subgenerator,PEP 397 Python Launcher for Windows,What’s New In Python 3 3
@anchor{whatsnew/3 3 pep-3151}@anchor{1242}@anchor{whatsnew/3 3 pep-3151-reworking-the-os-and-io-exception-hierarchy}@anchor{1258}
@subsection PEP 3151: Reworking the OS and IO exception hierarchy


The hierarchy of exceptions raised by operating system errors is now both
simplified and finer-grained.

You don’t have to worry anymore about choosing the appropriate exception
type between @ref{2c2,,OSError}, @ref{1259,,IOError}, @ref{125a,,EnvironmentError},
@ref{125b,,WindowsError}, @code{mmap.error}, @ref{125c,,socket.error} or
@ref{125d,,select.error}.  All these exception types are now only one:
@code{OSError}.  The other names are kept as aliases for compatibility
reasons.

Also, it is now easier to catch a specific error condition.  Instead of
inspecting the @code{errno} attribute (or @code{args[0]}) for a particular
constant from the @ref{5b,,errno} module, you can catch the adequate
@ref{2c2,,OSError} subclass.  The available subclasses are the following:


@itemize *

@item 
@ref{237,,BlockingIOError}

@item 
@ref{125e,,ChildProcessError}

@item 
@ref{1011,,ConnectionError}

@item 
@ref{1226,,FileExistsError}

@item 
@ref{266,,FileNotFoundError}

@item 
@ref{f8e,,InterruptedError}

@item 
@ref{125f,,IsADirectoryError}

@item 
@ref{1260,,NotADirectoryError}

@item 
@ref{f44,,PermissionError}

@item 
@ref{1261,,ProcessLookupError}

@item 
@ref{a3c,,TimeoutError}
@end itemize

And the @ref{1011,,ConnectionError} itself has finer-grained subclasses:


@itemize *

@item 
@ref{1262,,BrokenPipeError}

@item 
@ref{1263,,ConnectionAbortedError}

@item 
@ref{1264,,ConnectionRefusedError}

@item 
@ref{1265,,ConnectionResetError}
@end itemize

Thanks to the new exceptions, common usages of the @ref{5b,,errno} can now be
avoided.  For example, the following code written for Python 3.2:

@example
from errno import ENOENT, EACCES, EPERM

try:
    with open("document.txt") as f:
        content = f.read()
except IOError as err:
    if err.errno == ENOENT:
        print("document.txt file is missing")
    elif err.errno in (EACCES, EPERM):
        print("You are not allowed to read document.txt")
    else:
        raise
@end example

can now be written without the @ref{5b,,errno} import and without manual
inspection of exception attributes:

@example
try:
    with open("document.txt") as f:
        content = f.read()
except FileNotFoundError:
    print("document.txt file is missing")
except PermissionError:
    print("You are not allowed to read document.txt")
@end example


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 3151

@item PEP 3151@footnote{https://peps.python.org/pep-3151/} - Reworking the OS and IO Exception Hierarchy

PEP written and implemented by Antoine Pitrou
@end table


@geindex yield; yield from (in What's New)

@node PEP 380 Syntax for Delegating to a Subgenerator,PEP 409 Suppressing exception context,PEP 3151 Reworking the OS and IO exception hierarchy,What’s New In Python 3 3
@anchor{whatsnew/3 3 pep-380}@anchor{1240}@anchor{whatsnew/3 3 pep-380-syntax-for-delegating-to-a-subgenerator}@anchor{1266}
@subsection PEP 380: Syntax for Delegating to a Subgenerator


PEP 380 adds the @code{yield from} expression, allowing a @ref{1267,,generator} to
delegate
part of its operations to another generator. This allows a section of code
containing @ref{bc8,,yield} to be factored out and placed in another generator.
Additionally, the subgenerator is allowed to return with a value, and the
value is made available to the delegating generator.

While designed primarily for use in delegating to a subgenerator, the @code{yield
from} expression actually allows delegation to arbitrary subiterators.

For simple iterators, @code{yield from iterable} is essentially just a shortened
form of @code{for item in iterable: yield item}:

@example
>>> def g(x):
...     yield from range(x, 0, -1)
...     yield from range(x)
...
>>> list(g(5))
[5, 4, 3, 2, 1, 0, 1, 2, 3, 4]
@end example

However, unlike an ordinary loop, @code{yield from} allows subgenerators to
receive sent and thrown values directly from the calling scope, and
return a final value to the outer generator:

@example
>>> def accumulate():
...     tally = 0
...     while 1:
...         next = yield
...         if next is None:
...             return tally
...         tally += next
...
>>> def gather_tallies(tallies):
...     while 1:
...         tally = yield from accumulate()
...         tallies.append(tally)
...
>>> tallies = []
>>> acc = gather_tallies(tallies)
>>> next(acc)  # Ensure the accumulator is ready to accept values
>>> for i in range(4):
...     acc.send(i)
...
>>> acc.send(None)  # Finish the first tally
>>> for i in range(5):
...     acc.send(i)
...
>>> acc.send(None)  # Finish the second tally
>>> tallies
[6, 10]
@end example

The main principle driving this change is to allow even generators that are
designed to be used with the @code{send} and @code{throw} methods to be split into
multiple subgenerators as easily as a single large function can be split into
multiple subfunctions.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 380

@item PEP 380@footnote{https://peps.python.org/pep-0380/} - Syntax for Delegating to a Subgenerator

PEP written by Greg Ewing; implementation by Greg Ewing, integrated into
3.3 by Renaud Blanch, Ryan Kelly and Nick Coghlan; documentation by
Zbigniew Jędrzejewski-Szmek and Nick Coghlan
@end table


@node PEP 409 Suppressing exception context,PEP 414 Explicit Unicode literals,PEP 380 Syntax for Delegating to a Subgenerator,What’s New In Python 3 3
@anchor{whatsnew/3 3 pep-409-suppressing-exception-context}@anchor{1268}
@subsection PEP 409: Suppressing exception context


PEP 409 introduces new syntax that allows the display of the chained
exception context to be disabled. This allows cleaner error messages in
applications that convert between exception types:

@example
>>> class D:
...     def __init__(self, extra):
...         self._extra_attributes = extra
...     def __getattr__(self, attr):
...         try:
...             return self._extra_attributes[attr]
...         except KeyError:
...             raise AttributeError(attr) from None
...
>>> D(@{@}).x
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 8, in __getattr__
AttributeError: x
@end example

Without the @code{from None} suffix to suppress the cause, the original
exception would be displayed by default:

@example
>>> class C:
...     def __init__(self, extra):
...         self._extra_attributes = extra
...     def __getattr__(self, attr):
...         try:
...             return self._extra_attributes[attr]
...         except KeyError:
...             raise AttributeError(attr)
...
>>> C(@{@}).x
Traceback (most recent call last):
  File "<stdin>", line 6, in __getattr__
KeyError: 'x'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 8, in __getattr__
AttributeError: x
@end example

No debugging capability is lost, as the original exception context remains
available if needed (for example, if an intervening library has incorrectly
suppressed valuable underlying details):

@example
>>> try:
...     D(@{@}).x
... except AttributeError as exc:
...     print(repr(exc.__context__))
...
KeyError('x',)
@end example


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 409

@item PEP 409@footnote{https://peps.python.org/pep-0409/} - Suppressing exception context

PEP written by Ethan Furman; implemented by Ethan Furman and Nick
Coghlan.
@end table


@node PEP 414 Explicit Unicode literals,PEP 3155 Qualified name for classes and functions,PEP 409 Suppressing exception context,What’s New In Python 3 3
@anchor{whatsnew/3 3 pep-414-explicit-unicode-literals}@anchor{1269}
@subsection PEP 414: Explicit Unicode literals


To ease the transition from Python 2 for Unicode aware Python applications
that make heavy use of Unicode literals, Python 3.3 once again supports the
“@code{u}” prefix for string literals. This prefix has no semantic significance
in Python 3, it is provided solely to reduce the number of purely mechanical
changes in migrating to Python 3, making it easier for developers to focus on
the more significant semantic changes (such as the stricter default
separation of binary and text data).


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 414

@item PEP 414@footnote{https://peps.python.org/pep-0414/} - Explicit Unicode literals

PEP written by Armin Ronacher.
@end table


@node PEP 3155 Qualified name for classes and functions,PEP 412 Key-Sharing Dictionary,PEP 414 Explicit Unicode literals,What’s New In Python 3 3
@anchor{whatsnew/3 3 pep-3155-qualified-name-for-classes-and-functions}@anchor{126a}
@subsection PEP 3155: Qualified name for classes and functions


Functions and class objects have a new @ref{126b,,__qualname__}
attribute representing
the “path” from the module top-level to their definition.  For global functions
and classes, this is the same as @ref{126c,,__name__}.
For other functions and classes,
it provides better information about where they were actually defined, and
how they might be accessible from the global scope.

Example with (non-bound) methods:

@example
>>> class C:
...     def meth(self):
...         pass
...
>>> C.meth.__name__
'meth'
>>> C.meth.__qualname__
'C.meth'
@end example

Example with nested classes:

@example
>>> class C:
...     class D:
...         def meth(self):
...             pass
...
>>> C.D.__name__
'D'
>>> C.D.__qualname__
'C.D'
>>> C.D.meth.__name__
'meth'
>>> C.D.meth.__qualname__
'C.D.meth'
@end example

Example with nested functions:

@example
>>> def outer():
...     def inner():
...         pass
...     return inner
...
>>> outer().__name__
'inner'
>>> outer().__qualname__
'outer.<locals>.inner'
@end example

The string representation of those objects is also changed to include the
new, more precise information:

@example
>>> str(C.D)
"<class '__main__.C.D'>"
>>> str(C.D.meth)
'<function C.D.meth at 0x7f46b9fe31e0>'
@end example


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 3155

@item PEP 3155@footnote{https://peps.python.org/pep-3155/} - Qualified name for classes and functions

PEP written and implemented by Antoine Pitrou.
@end table


@node PEP 412 Key-Sharing Dictionary,PEP 362 Function Signature Object,PEP 3155 Qualified name for classes and functions,What’s New In Python 3 3
@anchor{whatsnew/3 3 pep-412}@anchor{1245}@anchor{whatsnew/3 3 pep-412-key-sharing-dictionary}@anchor{126d}
@subsection PEP 412: Key-Sharing Dictionary


Dictionaries used for the storage of objects’ attributes are now able to
share part of their internal storage between each other (namely, the part
which stores the keys and their respective hashes).  This reduces the memory
consumption of programs creating many instances of non-builtin types.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 412

@item PEP 412@footnote{https://peps.python.org/pep-0412/} - Key-Sharing Dictionary

PEP written and implemented by Mark Shannon.
@end table


@node PEP 362 Function Signature Object,PEP 421 Adding sys implementation,PEP 412 Key-Sharing Dictionary,What’s New In Python 3 3
@anchor{whatsnew/3 3 pep-362-function-signature-object}@anchor{126e}
@subsection PEP 362: Function Signature Object


A new function @ref{231,,inspect.signature()} makes introspection of python
callables easy and straightforward.  A broad range of callables is supported:
python functions, decorated or not, classes, and @ref{219,,functools.partial()}
objects.  New classes @ref{4e4,,inspect.Signature}, @ref{4e5,,inspect.Parameter}
and @ref{126f,,inspect.BoundArguments} hold information about the call signatures,
such as, annotations, default values, parameters kinds, and bound arguments,
which considerably simplifies writing decorators and any code that validates
or amends calling signatures or arguments.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 362

@item PEP 362@footnote{https://peps.python.org/pep-0362/}: -  Function Signature Object

PEP written by Brett Cannon, Yury Selivanov, Larry Hastings, Jiwon Seo;
implemented by Yury Selivanov.
@end table


@node PEP 421 Adding sys implementation,Using importlib as the Implementation of Import,PEP 362 Function Signature Object,What’s New In Python 3 3
@anchor{whatsnew/3 3 pep-421-adding-sys-implementation}@anchor{1270}
@subsection PEP 421: Adding sys.implementation


A new attribute on the @ref{df,,sys} module exposes details specific to the
implementation of the currently running interpreter.  The initial set of
attributes on @ref{73c,,sys.implementation} are @code{name}, @code{version},
@code{hexversion}, and @code{cache_tag}.

The intention of @code{sys.implementation} is to consolidate into one namespace
the implementation-specific data used by the standard library.  This allows
different Python implementations to share a single standard library code base
much more easily.  In its initial state, @code{sys.implementation} holds only a
small portion of the implementation-specific data.  Over time that ratio will
shift in order to make the standard library more portable.

One example of improved standard library portability is @code{cache_tag}.  As of
Python 3.3, @code{sys.implementation.cache_tag} is used by @ref{7b,,importlib} to
support 
@geindex Python Enhancement Proposals; PEP 3147
PEP 3147@footnote{https://peps.python.org/pep-3147/} compliance.  Any Python implementation that uses
@code{importlib} for its built-in import system may use @code{cache_tag} to control
the caching behavior for modules.

@menu
* SimpleNamespace:: 

@end menu

@node SimpleNamespace,,,PEP 421 Adding sys implementation
@anchor{whatsnew/3 3 simplenamespace}@anchor{1271}
@subsubsection SimpleNamespace


The implementation of @code{sys.implementation} also introduces a new type to
Python: @ref{4e6,,types.SimpleNamespace}.  In contrast to a mapping-based
namespace, like @ref{184,,dict}, @code{SimpleNamespace} is attribute-based, like
@ref{c84,,object}.  However, unlike @code{object}, @code{SimpleNamespace} instances
are writable.  This means that you can add, remove, and modify the namespace
through normal attribute access.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 421

@item PEP 421@footnote{https://peps.python.org/pep-0421/} - Adding sys.implementation

PEP written and implemented by Eric Snow.
@end table


@node Using importlib as the Implementation of Import,Other Language Changes<11>,PEP 421 Adding sys implementation,What’s New In Python 3 3
@anchor{whatsnew/3 3 importlib}@anchor{1243}@anchor{whatsnew/3 3 using-importlib-as-the-implementation-of-import}@anchor{1272}
@subsection Using importlib as the Implementation of Import


bpo-2377@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2377} - Replace __import__ w/ importlib.__import__
bpo-13959@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13959} - Re-implement parts of @code{imp} in pure Python
bpo-14605@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14605} - Make import machinery explicit
bpo-14646@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14646} - Require loaders set __loader__ and __package__

The @ref{ad7,,__import__()} function is now powered by @ref{1273,,importlib.__import__()}.
This work leads to the completion of “phase 2” of 
@geindex Python Enhancement Proposals; PEP 302
PEP 302@footnote{https://peps.python.org/pep-0302/}. There are
multiple benefits to this change. First, it has allowed for more of the
machinery powering import to be exposed instead of being implicit and hidden
within the C code. It also provides a single implementation for all Python VMs
supporting Python 3.3 to use, helping to end any VM-specific deviations in
import semantics. And finally it eases the maintenance of import, allowing for
future growth to occur.

For the common user, there should be no visible change in semantics.  For
those whose code currently manipulates import or calls import
programmatically, the code changes that might possibly be required are covered
in the @ref{1274,,Porting Python code} section of this document.

@menu
* New APIs:: 
* Visible Changes:: 

@end menu

@node New APIs,Visible Changes,,Using importlib as the Implementation of Import
@anchor{whatsnew/3 3 new-apis}@anchor{1275}
@subsubsection New APIs


One of the large benefits of this work is the exposure of what goes into
making the import statement work. That means the various importers that were
once implicit are now fully exposed as part of the @ref{7b,,importlib} package.

The abstract base classes defined in @ref{7c,,importlib.abc} have been expanded
to properly delineate between @ref{1276,,meta path finders}
and @ref{1277,,path entry finders} by introducing
@ref{a74,,importlib.abc.MetaPathFinder} and
@ref{a75,,importlib.abc.PathEntryFinder}, respectively. The old ABC of
@code{importlib.abc.Finder} is now only provided for backwards-compatibility
and does not enforce any method requirements.

In terms of finders, @ref{1278,,importlib.machinery.FileFinder} exposes the
mechanism used to search for source and bytecode files of a module. Previously
this class was an implicit member of @ref{122a,,sys.path_hooks}.

For loaders, the new abstract base class @ref{1279,,importlib.abc.FileLoader} helps
write a loader that uses the file system as the storage mechanism for a module’s
code. The loader for source files
(@ref{127a,,importlib.machinery.SourceFileLoader}), sourceless bytecode files
(@ref{127b,,importlib.machinery.SourcelessFileLoader}), and extension modules
(@ref{eb4,,importlib.machinery.ExtensionFileLoader}) are now available for
direct use.

@ref{65b,,ImportError} now has @code{name} and @code{path} attributes which are set when
there is relevant data to provide. The message for failed imports will also
provide the full name of the module now instead of just the tail end of the
module’s name.

The @ref{e10,,importlib.invalidate_caches()} function will now call the method with
the same name on all finders cached in @ref{7fb,,sys.path_importer_cache} to help
clean up any stored state as necessary.

@node Visible Changes,,New APIs,Using importlib as the Implementation of Import
@anchor{whatsnew/3 3 visible-changes}@anchor{127c}
@subsubsection Visible Changes


For potential required changes to code, see the @ref{1274,,Porting Python code}
section.

Beyond the expanse of what @ref{7b,,importlib} now exposes, there are other
visible changes to import. The biggest is that @ref{f2d,,sys.meta_path} and
@ref{122a,,sys.path_hooks} now store all of the meta path finders and path entry
hooks used by import.  Previously the finders were implicit and hidden within
the C code of import instead of being directly exposed. This means that one can
now easily remove or change the order of the various finders to fit one’s needs.

Another change is that all modules have a @code{__loader__} attribute, storing the
loader used to create the module. 
@geindex Python Enhancement Proposals; PEP 302
PEP 302@footnote{https://peps.python.org/pep-0302/} has been updated to make this
attribute mandatory for loaders to implement, so in the future once 3rd-party
loaders have been updated people will be able to rely on the existence of the
attribute. Until such time, though, import is setting the module post-load.

Loaders are also now expected to set the @code{__package__} attribute from
@geindex Python Enhancement Proposals; PEP 366
PEP 366@footnote{https://peps.python.org/pep-0366/}. Once again, import itself is already setting this on all loaders
from @ref{7b,,importlib} and import itself is setting the attribute post-load.

@code{None} is now inserted into @ref{7fb,,sys.path_importer_cache} when no finder
can be found on @ref{122a,,sys.path_hooks}. Since @code{imp.NullImporter} is not
directly exposed on @code{sys.path_hooks} it could no longer be relied upon to
always be available to use as a value representing no finder found.

All other changes relate to semantic changes which should be taken into
consideration when updating code for Python 3.3, and thus should be read about
in the @ref{1274,,Porting Python code} section of this document.

(Implementation by Brett Cannon)

@node Other Language Changes<11>,A Finer-Grained Import Lock,Using importlib as the Implementation of Import,What’s New In Python 3 3
@anchor{whatsnew/3 3 other-language-changes}@anchor{127d}
@subsection Other Language Changes


Some smaller changes made to the core Python language are:


@itemize *

@item 
Added support for Unicode name aliases and named sequences.
Both @ref{127e,,unicodedata.lookup()} and @code{'\N@{...@}'} now resolve name aliases,
and @code{unicodedata.lookup()} resolves named sequences too.

(Contributed by Ezio Melotti in bpo-12753@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12753}.)

@item 
Unicode database updated to UCD version 6.1.0

@item 
Equality comparisons on @ref{b43,,range()} objects now return a result reflecting
the equality of the underlying sequences generated by those range objects.
(bpo-13201@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13201})

@item 
The @code{count()}, @code{find()}, @code{rfind()}, @code{index()} and @code{rindex()}
methods of @ref{193,,bytes} and @ref{342,,bytearray} objects now accept an
integer between 0 and 255 as their first argument.

(Contributed by Petri Lehtinen in bpo-12170@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12170}.)

@item 
The @code{rjust()}, @code{ljust()}, and @code{center()} methods of @ref{193,,bytes}
and @ref{342,,bytearray} now accept a @code{bytearray} for the @code{fill}
argument.  (Contributed by Petri Lehtinen in bpo-12380@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12380}.)

@item 
New methods have been added to @ref{24f,,list} and @ref{342,,bytearray}:
@code{copy()} and @code{clear()} (bpo-10516@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10516}).  Consequently,
@ref{4c0,,MutableSequence} now also defines a
@code{clear()} method (bpo-11388@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11388}).

@item 
Raw bytes literals can now be written @code{rb"..."} as well as @code{br"..."}.

(Contributed by Antoine Pitrou in bpo-13748@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13748}.)

@item 
@ref{127f,,dict.setdefault()} now does only one lookup for the given key, making
it atomic when used with built-in types.

(Contributed by Filip Gruszczyński in bpo-13521@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13521}.)

@item 
The error messages produced when a function call does not match the function
signature have been significantly improved.

(Contributed by Benjamin Peterson.)
@end itemize

@node A Finer-Grained Import Lock,Builtin functions and types,Other Language Changes<11>,What’s New In Python 3 3
@anchor{whatsnew/3 3 a-finer-grained-import-lock}@anchor{1280}
@subsection A Finer-Grained Import Lock


Previous versions of CPython have always relied on a global import lock.
This led to unexpected annoyances, such as deadlocks when importing a module
would trigger code execution in a different thread as a side-effect.
Clumsy workarounds were sometimes employed, such as the
@ref{3d9,,PyImport_ImportModuleNoBlock()} C API function.

In Python 3.3, importing a module takes a per-module lock.  This correctly
serializes importation of a given module from multiple threads (preventing
the exposure of incompletely initialized modules), while eliminating the
aforementioned annoyances.

(Contributed by Antoine Pitrou in bpo-9260@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9260}.)

@node Builtin functions and types,New Modules<11>,A Finer-Grained Import Lock,What’s New In Python 3 3
@anchor{whatsnew/3 3 builtin-functions-and-types}@anchor{1281}
@subsection Builtin functions and types



@itemize *

@item 
@ref{318,,open()} gets a new `opener' parameter: the underlying file descriptor
for the file object is then obtained by calling `opener' with (`file',
`flags'). It can be used to use custom flags like @ref{1282,,os.O_CLOEXEC} for
example. The @code{'x'} mode was added: open for exclusive creation, failing if
the file already exists.

@item 
@ref{117b,,print()}: added the `flush' keyword argument. If the `flush' keyword
argument is true, the stream is forcibly flushed.

@item 
@ref{802,,hash()}: hash randomization is enabled by default, see
@ref{cf9,,object.__hash__()} and 
@geindex PYTHONHASHSEED
@geindex environment variable; PYTHONHASHSEED
@ref{1283,,PYTHONHASHSEED}.

@item 
The @ref{16a,,str} type gets a new @ref{fdc,,casefold()} method: return a
casefolded copy of the string, casefolded strings may be used for caseless
matching. For example, @code{'ß'.casefold()} returns @code{'ss'}.

@item 
The sequence documentation has been substantially rewritten to better
explain the binary/text sequence distinction and to provide specific
documentation sections for the individual builtin sequence types
(bpo-4966@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4966}).
@end itemize

@node New Modules<11>,Improved Modules<11>,Builtin functions and types,What’s New In Python 3 3
@anchor{whatsnew/3 3 new-modules}@anchor{1284}
@subsection New Modules


@menu
* faulthandler: faulthandler<5>. 
* ipaddress: ipaddress<6>. 
* lzma: lzma<2>. 

@end menu

@node faulthandler<5>,ipaddress<6>,,New Modules<11>
@anchor{whatsnew/3 3 faulthandler}@anchor{1285}
@subsubsection faulthandler


This new debug module @ref{5c,,faulthandler} contains functions to dump Python tracebacks explicitly,
on a fault (a crash like a segmentation fault), after a timeout, or on a user
signal. Call @ref{211,,faulthandler.enable()} to install fault handlers for the
@ref{1286,,SIGSEGV}, @ref{1287,,SIGFPE}, @ref{1288,,SIGABRT},
@ref{1289,,SIGBUS}, and @ref{128a,,SIGILL} signals.
You can also enable them at startup by setting the 
@geindex PYTHONFAULTHANDLER
@geindex environment variable; PYTHONFAULTHANDLER
@ref{128b,,PYTHONFAULTHANDLER}
environment variable or by using @ref{170,,-X} @code{faulthandler} command line option.

Example of a segmentation fault on Linux:

@example
$ python -q -X faulthandler
>>> import ctypes
>>> ctypes.string_at(0)
Fatal Python error: Segmentation fault

Current thread 0x00007fb899f39700:
  File "/home/python/cpython/Lib/ctypes/__init__.py", line 486 in string_at
  File "<stdin>", line 1 in <module>
Segmentation fault
@end example

@node ipaddress<6>,lzma<2>,faulthandler<5>,New Modules<11>
@anchor{whatsnew/3 3 ipaddress}@anchor{128c}
@subsubsection ipaddress


The new @ref{84,,ipaddress} module provides tools for creating and manipulating
objects representing IPv4 and IPv6 addresses, networks and interfaces (i.e.
an IP address associated with a specific IP subnet).

(Contributed by Google and Peter Moody in 
@geindex Python Enhancement Proposals; PEP 3144
PEP 3144@footnote{https://peps.python.org/pep-3144/}.)

@node lzma<2>,,ipaddress<6>,New Modules<11>
@anchor{whatsnew/3 3 lzma}@anchor{128d}
@subsubsection lzma


The newly added @ref{8e,,lzma} module provides data compression and decompression
using the LZMA algorithm, including support for the @code{.xz} and @code{.lzma}
file formats.

(Contributed by Nadeem Vawda and Per Øyvind Karlsen in bpo-6715@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6715}.)

@node Improved Modules<11>,Optimizations<11>,New Modules<11>,What’s New In Python 3 3
@anchor{whatsnew/3 3 improved-modules}@anchor{128e}
@subsection Improved Modules


@menu
* abc: abc<2>. 
* array: array<5>. 
* base64: base64<5>. 
* binascii: binascii<3>. 
* bz2: bz2<2>. 
* codecs: codecs<2>. 
* collections: collections<7>. 
* contextlib: contextlib<7>. 
* crypt: crypt<2>. 
* curses: curses<6>. 
* datetime: datetime<7>. 
* decimal: decimal<4>. 
* email: email<6>. 
* ftplib: ftplib<3>. 
* functools: functools<7>. 
* gc: gc<8>. 
* hmac: hmac<5>. 
* http: http<5>. 
* html: html<2>. 
* imaplib: imaplib<4>. 
* inspect: inspect<10>. 
* io: io<8>. 
* itertools: itertools<7>. 
* logging: logging<7>. 
* math: math<10>. 
* mmap: mmap<4>. 
* multiprocessing: multiprocessing<9>. 
* nntplib: nntplib<2>. 
* os: os<13>. 
* pdb: pdb<9>. 
* pickle: pickle<6>. 
* pydoc: pydoc<6>. 
* re: re<10>. 
* sched:: 
* select: select<2>. 
* shlex: shlex<3>. 
* shutil: shutil<7>. 
* signal: signal<4>. 
* smtpd: smtpd<4>. 
* smtplib: smtplib<4>. 
* socket: socket<11>. 
* socketserver: socketserver<3>. 
* sqlite3: sqlite3<11>. 
* ssl: ssl<12>. 
* stat: stat<2>. 
* struct: struct<4>. 
* subprocess: subprocess<6>. 
* sys: sys<13>. 
* tarfile: tarfile<9>. 
* tempfile: tempfile<4>. 
* textwrap: textwrap<3>. 
* threading: threading<9>. 
* time: time<8>. 
* types: types<8>. 
* unittest: unittest<11>. 
* urllib: urllib<6>. 
* webbrowser: webbrowser<4>. 
* xml.etree.ElementTree: xml etree ElementTree<2>. 
* zlib: zlib<3>. 

@end menu

@node abc<2>,array<5>,,Improved Modules<11>
@anchor{whatsnew/3 3 abc}@anchor{128f}
@subsubsection abc


Improved support for abstract base classes containing descriptors composed with
abstract methods. The recommended approach to declaring abstract descriptors is
now to provide @code{__isabstractmethod__} as a dynamically updated
property. The built-in descriptors have been updated accordingly.


@itemize *

@item 
@ref{1290,,abc.abstractproperty} has been deprecated, use @ref{4b4,,property}
with @ref{1291,,abc.abstractmethod()} instead.

@item 
@ref{1292,,abc.abstractclassmethod} has been deprecated, use
@ref{48f,,classmethod} with @ref{1291,,abc.abstractmethod()} instead.

@item 
@ref{1293,,abc.abstractstaticmethod} has been deprecated, use
@ref{451,,staticmethod} with @ref{1291,,abc.abstractmethod()} instead.
@end itemize

(Contributed by Darren Dale in bpo-11610@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11610}.)

@ref{1294,,abc.ABCMeta.register()} now returns the registered subclass, which means
it can now be used as a class decorator (bpo-10868@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10868}).

@node array<5>,base64<5>,abc<2>,Improved Modules<11>
@anchor{whatsnew/3 3 array}@anchor{1295}
@subsubsection array


The @ref{8,,array} module supports the long long type using @code{q} and
@code{Q} type codes.

(Contributed by Oren Tirosh and Hirokazu Yamamoto in bpo-1172711@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1172711}.)

@node base64<5>,binascii<3>,array<5>,Improved Modules<11>
@anchor{whatsnew/3 3 base64}@anchor{1296}
@subsubsection base64


ASCII-only Unicode strings are now accepted by the decoding functions of the
@ref{f,,base64} modern interface. For example, @code{base64.b64decode('YWJj')}
returns @code{b'abc'}.  (Contributed by Catalin Iacob in bpo-13641@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13641}.)

@node binascii<3>,bz2<2>,base64<5>,Improved Modules<11>
@anchor{whatsnew/3 3 binascii}@anchor{1297}
@subsubsection binascii


In addition to the binary objects they normally accept, the @code{a2b_} functions
now all also accept ASCII-only strings as input.  (Contributed by Antoine
Pitrou in bpo-13637@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13637}.)

@node bz2<2>,codecs<2>,binascii<3>,Improved Modules<11>
@anchor{whatsnew/3 3 bz2}@anchor{1298}
@subsubsection bz2


The @ref{14,,bz2} module has been rewritten from scratch. In the process, several
new features have been added:


@itemize *

@item 
New @ref{1299,,bz2.open()} function: open a bzip2-compressed file in binary or
text mode.

@item 
@ref{a6c,,bz2.BZ2File} can now read from and write to arbitrary file-like
objects, by means of its constructor’s `fileobj' argument.

(Contributed by Nadeem Vawda in bpo-5863@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5863}.)

@item 
@ref{a6c,,bz2.BZ2File} and @ref{129a,,bz2.decompress()} can now decompress
multi-stream inputs (such as those produced by the @code{pbzip2} tool).
@code{bz2.BZ2File} can now also be used to create this type of file, using
the @code{'a'} (append) mode.

(Contributed by Nir Aides in bpo-1625@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1625}.)

@item 
@ref{a6c,,bz2.BZ2File} now implements all of the @ref{8a5,,io.BufferedIOBase} API,
except for the @code{detach()} and @code{truncate()} methods.
@end itemize

@node codecs<2>,collections<7>,bz2<2>,Improved Modules<11>
@anchor{whatsnew/3 3 codecs}@anchor{129b}
@subsubsection codecs


The @ref{57,,mbcs} codec has been rewritten to handle correctly
@code{replace} and @code{ignore} error handlers on all Windows versions.  The
@code{mbcs} codec now supports all error handlers, instead of only
@code{replace} to encode and @code{ignore} to decode.

A new Windows-only codec has been added: @code{cp65001} (bpo-13216@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13216}). It is the
Windows code page 65001 (Windows UTF-8, @code{CP_UTF8}).  For example, it is used
by @code{sys.stdout} if the console output code page is set to cp65001 (e.g., using
@code{chcp 65001} command).

Multibyte CJK decoders now resynchronize faster.  They only ignore the first
byte of an invalid byte sequence. For example, @code{b'\xff\n'.decode('gb2312',
'replace')} now returns a @code{\n} after the replacement character.

(bpo-12016@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12016})

Incremental CJK codec encoders are no longer reset at each call to their
encode() methods. For example:

@example
>>> import codecs
>>> encoder = codecs.getincrementalencoder('hz')('strict')
>>> b'@w{'}.join(encoder.encode(x) for x in '\u52ff\u65bd\u65bc\u4eba\u3002 Bye.')
b'~@{NpJ)l6HK!#~@} Bye.'
@end example

This example gives @code{b'~@{Np~@}~@{J)~@}~@{l6~@}~@{HK~@}~@{!#~@} Bye.'} with older Python
versions.

(bpo-12100@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12100})

The @code{unicode_internal} codec has been deprecated.

@node collections<7>,contextlib<7>,codecs<2>,Improved Modules<11>
@anchor{whatsnew/3 3 collections}@anchor{129c}
@subsubsection collections


Addition of a new @ref{e1c,,ChainMap} class to allow treating a
number of mappings as a single unit.  (Written by Raymond Hettinger for
bpo-11089@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11089}, made public in bpo-11297@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11297}.)

The abstract base classes have been moved in a new @ref{1f,,collections.abc}
module, to better differentiate between the abstract and the concrete
collections classes.  Aliases for ABCs are still present in the
@ref{1e,,collections} module to preserve existing imports.  (bpo-11085@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11085})

@c XXX addition of __slots__ to ABCs not recorded here: internal detail

The @ref{129d,,Counter} class now supports the unary @code{+} and @code{-}
operators, as well as the in-place operators @code{+=}, @code{-=}, @code{|=}, and
@code{&=}.  (Contributed by Raymond Hettinger in bpo-13121@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13121}.)

@node contextlib<7>,crypt<2>,collections<7>,Improved Modules<11>
@anchor{whatsnew/3 3 contextlib}@anchor{129e}
@subsubsection contextlib


@ref{d24,,ExitStack} now provides a solid foundation for
programmatic manipulation of context managers and similar cleanup
functionality. Unlike the previous @code{contextlib.nested} API (which was
deprecated and removed), the new API is designed to work correctly
regardless of whether context managers acquire their resources in
their @code{__init__} method (for example, file objects) or in their
@code{__enter__} method (for example, synchronisation objects from the
@ref{f3,,threading} module).

(bpo-13585@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13585})

@node crypt<2>,curses<6>,contextlib<7>,Improved Modules<11>
@anchor{whatsnew/3 3 crypt}@anchor{129f}
@subsubsection crypt


Addition of salt and modular crypt format (hashing method) and the @code{mksalt()}
function to the @code{crypt} module.

(bpo-10924@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10924})

@node curses<6>,datetime<7>,crypt<2>,Improved Modules<11>
@anchor{whatsnew/3 3 curses}@anchor{12a0}
@subsubsection curses



@itemize *

@item 
If the @ref{2f,,curses} module is linked to the ncursesw library, use Unicode
functions when Unicode strings or characters are passed (e.g.
@code{waddwstr()}), and bytes functions otherwise (e.g. @code{waddstr()}).

@item 
Use the locale encoding instead of @code{utf-8} to encode Unicode strings.

@item 
@ref{12a1,,curses.window} has a new @ref{12a2,,curses.window.encoding} attribute.

@item 
The @ref{12a1,,curses.window} class has a new @ref{12a3,,get_wch()}
method to get a wide character

@item 
The @ref{2f,,curses} module has a new @ref{12a4,,unget_wch()} function to
push a wide character so the next @ref{12a3,,get_wch()} will return
it
@end itemize

(Contributed by Iñigo Serna in bpo-6755@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6755}.)

@node datetime<7>,decimal<4>,curses<6>,Improved Modules<11>
@anchor{whatsnew/3 3 datetime}@anchor{12a5}
@subsubsection datetime



@itemize *

@item 
Equality comparisons between naive and aware @ref{4e3,,datetime}
instances now return @ref{d31,,False} instead of raising @ref{199,,TypeError}
(bpo-15006@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15006}).

@item 
New @ref{12a6,,datetime.datetime.timestamp()} method: Return POSIX timestamp
corresponding to the @ref{4e3,,datetime} instance.

@item 
The @ref{e94,,datetime.datetime.strftime()} method supports formatting years
older than 1000.

@item 
The @ref{bca,,datetime.datetime.astimezone()} method can now be
called without arguments to convert datetime instance to the system
timezone.
@end itemize

@node decimal<4>,email<6>,datetime<7>,Improved Modules<11>
@anchor{whatsnew/3 3 decimal}@anchor{12a7}@anchor{whatsnew/3 3 new-decimal}@anchor{1246}
@subsubsection decimal



@table @asis

@item bpo-7652@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7652} - integrate fast native decimal arithmetic.

C-module and libmpdec written by Stefan Krah.
@end table

The new C version of the decimal module integrates the high speed libmpdec
library for arbitrary precision correctly rounded decimal floating-point
arithmetic. libmpdec conforms to IBM’s General Decimal Arithmetic Specification.

Performance gains range from 10x for database applications to 100x for
numerically intensive applications. These numbers are expected gains
for standard precisions used in decimal floating-point arithmetic. Since
the precision is user configurable, the exact figures may vary. For example,
in integer bignum arithmetic the differences can be significantly higher.

The following table is meant as an illustration. Benchmarks are available
at @indicateurl{https://www.bytereef.org/mpdecimal/quickstart.html}.

@quotation


@multitable {xxxxxxxxxxx} {xxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxx} 
@headitem

@tab

decimal.py

@tab

_decimal

@tab

speedup

@item

pi

@tab

42.02s

@tab

0.345s

@tab

120x

@item

telco

@tab

172.19s

@tab

5.68s

@tab

30x

@item

psycopg

@tab

3.57s

@tab

0.29s

@tab

12x

@end multitable

@end quotation

@menu
* Features: Features<2>. 
* API changes: API changes<2>. 

@end menu

@node Features<2>,API changes<2>,,decimal<4>
@anchor{whatsnew/3 3 id1}@anchor{12a8}
@subsubsection Features



@itemize *

@item 
The @ref{12a9,,FloatOperation} signal optionally enables stricter
semantics for mixing floats and Decimals.

@item 
If Python is compiled without threads, the C version automatically
disables the expensive thread local context machinery. In this case,
the variable @ref{12aa,,HAVE_THREADS} is set to @code{False}.
@end itemize

@node API changes<2>,,Features<2>,decimal<4>
@anchor{whatsnew/3 3 id2}@anchor{12ab}
@subsubsection API changes



@itemize *

@item 
The C module has the following context limits, depending on the machine
architecture:

@quotation


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

@tab

32-bit

@tab

64-bit

@item

@ref{12ac,,MAX_PREC}

@tab

@code{425000000}

@tab

@code{999999999999999999}

@item

@ref{12ad,,MAX_EMAX}

@tab

@code{425000000}

@tab

@code{999999999999999999}

@item

@ref{12ae,,MIN_EMIN}

@tab

@code{-425000000}

@tab

@code{-999999999999999999}

@end multitable

@end quotation

@item 
In the context templates (@ref{12af,,DefaultContext},
@ref{12b0,,BasicContext} and @ref{12b1,,ExtendedContext})
the magnitude of @ref{12b2,,Emax} and
@ref{12b3,,Emin} has changed to @code{999999}.

@item 
The @ref{200,,Decimal} constructor in decimal.py does not observe
the context limits and converts values with arbitrary exponents or precision
exactly. Since the C version has internal limits, the following scheme is
used: If possible, values are converted exactly, otherwise
@ref{12b4,,InvalidOperation} is raised and the result is NaN. In the
latter case it is always possible to use @ref{12b5,,create_decimal()}
in order to obtain a rounded or inexact value.

@item 
The power function in decimal.py is always correctly rounded. In the
C version, it is defined in terms of the correctly rounded
@ref{12b6,,exp()} and @ref{12b7,,ln()} functions,
but the final result is only “almost always correctly rounded”.

@item 
In the C version, the context dictionary containing the signals is a
@ref{12b8,,MutableMapping}.  For speed reasons,
@ref{12b9,,flags} and @ref{12ba,,traps} always
refer to the same @code{MutableMapping} that the context
was initialized with. If a new signal dictionary is assigned,
@code{flags} and @code{traps}
are updated with the new values, but they do not reference the RHS
dictionary.

@item 
Pickling a @ref{12bb,,Context} produces a different output in order
to have a common interchange format for the Python and C versions.

@item 
The order of arguments in the @ref{12bb,,Context} constructor has been
changed to match the order displayed by @ref{1c3,,repr()}.

@item 
The @code{watchexp} parameter in the @ref{12bc,,quantize()} method
is deprecated.
@end itemize

@node email<6>,ftplib<3>,decimal<4>,Improved Modules<11>
@anchor{whatsnew/3 3 email}@anchor{12bd}@anchor{whatsnew/3 3 new-email}@anchor{1247}
@subsubsection email


@menu
* Policy Framework:: 
* Provisional Policy with New Header API:: 
* Other API Changes:: 

@end menu

@node Policy Framework,Provisional Policy with New Header API,,email<6>
@anchor{whatsnew/3 3 policy-framework}@anchor{12be}
@subsubsection Policy Framework


The email package now has a @ref{53,,policy} framework.  A
@ref{12bf,,Policy} is an object with several methods and properties
that control how the email package behaves.  The primary policy for Python 3.3
is the @ref{12c0,,Compat32} policy, which provides backward
compatibility with the email package in Python 3.2.  A @code{policy} can be
specified when an email message is parsed by a @ref{52,,parser}, or when a
@ref{581,,Message} object is created, or when an email is
serialized using a @ref{44,,generator}.  Unless overridden, a policy passed
to a @code{parser} is inherited by all the @code{Message} object and sub-objects
created by the @code{parser}.  By default a @code{generator} will use the policy of
the @code{Message} object it is serializing.  The default policy is
@ref{e9d,,compat32}.

The minimum set of controls implemented by all @code{policy} objects are:


@multitable {xxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

max_line_length

@tab

The maximum length, excluding the linesep character(s),
individual lines may have when a @code{Message} is
serialized.  Defaults to 78.

@item

linesep

@tab

The character used to separate individual lines when a
@code{Message} is serialized.  Defaults to @code{\n}.

@item

cte_type

@tab

@code{7bit} or @code{8bit}.  @code{8bit} applies only to a
@code{Bytes} @code{generator}, and means that non-ASCII may
be used where allowed by the protocol (or where it
exists in the original input).

@item

raise_on_defect

@tab

Causes a @code{parser} to raise error when defects are
encountered instead of adding them to the @code{Message}
object’s @code{defects} list.

@end multitable


A new policy instance, with new settings, is created using the
@ref{12c1,,clone()} method of policy objects.  @code{clone} takes
any of the above controls as keyword arguments.  Any control not specified in
the call retains its default value.  Thus you can create a policy that uses
@code{\r\n} linesep characters like this:

@example
mypolicy = compat32.clone(linesep='\r\n')
@end example

Policies can be used to make the generation of messages in the format needed by
your application simpler.  Instead of having to remember to specify
@code{linesep='\r\n'} in all the places you call a @code{generator}, you can specify
it once, when you set the policy used by the @code{parser} or the @code{Message},
whichever your program uses to create @code{Message} objects.  On the other hand,
if you need to generate messages in multiple forms, you can still specify the
parameters in the appropriate @code{generator} call.  Or you can have custom
policy instances for your different cases, and pass those in when you create
the @code{generator}.

@node Provisional Policy with New Header API,Other API Changes,Policy Framework,email<6>
@anchor{whatsnew/3 3 provisional-policy-with-new-header-api}@anchor{12c2}
@subsubsection Provisional Policy with New Header API


While the policy framework is worthwhile all by itself, the main motivation for
introducing it is to allow the creation of new policies that implement new
features for the email package in a way that maintains backward compatibility
for those who do not use the new policies.  Because the new policies introduce a
new API, we are releasing them in Python 3.3 as a @ref{1248,,provisional policy}.  Backwards incompatible changes (up to and including
removal of the code) may occur if deemed necessary by the core developers.

The new policies are instances of @ref{12c3,,EmailPolicy},
and add the following additional controls:


@multitable {xxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

refold_source

@tab

Controls whether or not headers parsed by a
@ref{52,,parser} are refolded by the
@ref{44,,generator}.  It can be @code{none}, @code{long},
or @code{all}.  The default is @code{long}, which means that
source headers with a line longer than
@code{max_line_length} get refolded.  @code{none} means no
line get refolded, and @code{all} means that all lines
get refolded.

@item

header_factory

@tab

A callable that take a @code{name} and @code{value} and
produces a custom header object.

@end multitable


The @code{header_factory} is the key to the new features provided by the new
policies.  When one of the new policies is used, any header retrieved from
a @code{Message} object is an object produced by the @code{header_factory}, and any
time you set a header on a @code{Message} it becomes an object produced by
@code{header_factory}.  All such header objects have a @code{name} attribute equal
to the header name.  Address and Date headers have additional attributes
that give you access to the parsed data of the header.  This means you can now
do things like this:

@example
>>> m = Message(policy=SMTP)
>>> m['To'] = 'Éric <foo@@example.com>'
>>> m['to']
'Éric <foo@@example.com>'
>>> m['to'].addresses
(Address(display_name='Éric', username='foo', domain='example.com'),)
>>> m['to'].addresses[0].username
'foo'
>>> m['to'].addresses[0].display_name
'Éric'
>>> m['Date'] = email.utils.localtime()
>>> m['Date'].datetime
datetime.datetime(2012, 5, 25, 21, 39, 24, 465484, tzinfo=datetime.timezone(datetime.timedelta(-1, 72000), 'EDT'))
>>> m['Date']
'Fri, 25 May 2012 21:44:27 -0400'
>>> print(m)
To: =?utf-8?q?=C3=89ric?= <foo@@example.com>
Date: Fri, 25 May 2012 21:44:27 -0400
@end example

You will note that the unicode display name is automatically encoded as
@code{utf-8} when the message is serialized, but that when the header is accessed
directly, you get the unicode version.  This eliminates any need to deal with
the @ref{45,,email.header} @ref{12c4,,decode_header()} or
@ref{12c5,,make_header()} functions.

You can also create addresses from parts:

@example
>>> m['cc'] = [Group('pals', [Address('Bob', 'bob', 'example.com'),
...                           Address('Sally', 'sally', 'example.com')]),
...            Address('Bonzo', addr_spec='bonz@@laugh.com')]
>>> print(m)
To: =?utf-8?q?=C3=89ric?= <foo@@example.com>
Date: Fri, 25 May 2012 21:44:27 -0400
cc: pals: Bob <bob@@example.com>, Sally <sally@@example.com>;, Bonzo <bonz@@laugh.com>
@end example

Decoding to unicode is done automatically:

@example
>>> m2 = message_from_string(str(m))
>>> m2['to']
'Éric <foo@@example.com>'
@end example

When you parse a message, you can use the @code{addresses} and @code{groups}
attributes of the header objects to access the groups and individual
addresses:

@example
>>> m2['cc'].addresses
(Address(display_name='Bob', username='bob', domain='example.com'), Address(display_name='Sally', username='sally', domain='example.com'), Address(display_name='Bonzo', username='bonz', domain='laugh.com'))
>>> m2['cc'].groups
(Group(display_name='pals', addresses=(Address(display_name='Bob', username='bob', domain='example.com'), Address(display_name='Sally', username='sally', domain='example.com')), Group(display_name=None, addresses=(Address(display_name='Bonzo', username='bonz', domain='laugh.com'),))
@end example

In summary, if you use one of the new policies, header manipulation works the
way it ought to:  your application works with unicode strings, and the email
package transparently encodes and decodes the unicode to and from the RFC
standard Content Transfer Encodings.

@node Other API Changes,,Provisional Policy with New Header API,email<6>
@anchor{whatsnew/3 3 other-api-changes}@anchor{12c6}
@subsubsection Other API Changes


New @ref{12c7,,BytesHeaderParser}, added to the @ref{52,,parser}
module to complement @ref{12c8,,HeaderParser} and complete the Bytes
API.

New utility functions:


@itemize *

@item 
@ref{12c9,,format_datetime()}: given a @ref{4e3,,datetime},
produce a string formatted for use in an email header.

@item 
@ref{12ca,,parsedate_to_datetime()}: given a date string from
an email header, convert it into an aware @ref{4e3,,datetime},
or a naive @code{datetime} if the offset is @code{-0000}.

@item 
@ref{2f9,,localtime()}: With no argument, returns the
current local time as an aware @ref{4e3,,datetime} using the local
@ref{12cb,,timezone}.  Given an aware @code{datetime},
converts it into an aware @code{datetime} using the
local @code{timezone}.
@end itemize

@node ftplib<3>,functools<7>,email<6>,Improved Modules<11>
@anchor{whatsnew/3 3 ftplib}@anchor{12cc}
@subsubsection ftplib



@itemize *

@item 
@ref{afc,,ftplib.FTP} now accepts a @code{source_address} keyword argument to
specify the @code{(host, port)} to use as the source address in the bind call
when creating the outgoing socket.  (Contributed by Giampaolo Rodolà
in bpo-8594@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8594}.)

@item 
The @ref{afd,,FTP_TLS} class now provides a new
@ref{12cd,,ccc()} function to revert control channel back to
plaintext.  This can be useful to take advantage of firewalls that know how
to handle NAT with non-secure FTP without opening fixed ports.  (Contributed
by Giampaolo Rodolà in bpo-12139@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12139}.)

@item 
Added @ref{12ce,,ftplib.FTP.mlsd()} method which provides a parsable directory
listing format and deprecates @ref{12cf,,ftplib.FTP.nlst()} and
@ref{12d0,,ftplib.FTP.dir()}.  (Contributed by Giampaolo Rodolà in bpo-11072@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11072}.)
@end itemize

@node functools<7>,gc<8>,ftplib<3>,Improved Modules<11>
@anchor{whatsnew/3 3 functools}@anchor{12d1}
@subsubsection functools


The @ref{be8,,functools.lru_cache()} decorator now accepts a @code{typed} keyword
argument (that defaults to @code{False} to ensure that it caches values of
different types that compare equal in separate cache slots.  (Contributed
by Raymond Hettinger in bpo-13227@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13227}.)

@node gc<8>,hmac<5>,functools<7>,Improved Modules<11>
@anchor{whatsnew/3 3 gc}@anchor{12d2}
@subsubsection gc


It is now possible to register callbacks invoked by the garbage collector
before and after collection using the new @ref{12d3,,callbacks} list.

@node hmac<5>,http<5>,gc<8>,Improved Modules<11>
@anchor{whatsnew/3 3 hmac}@anchor{12d4}
@subsubsection hmac


A new @ref{12d5,,compare_digest()} function has been added to prevent side
channel attacks on digests through timing analysis.  (Contributed by Nick
Coghlan and Christian Heimes in bpo-15061@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15061}.)

@node http<5>,html<2>,hmac<5>,Improved Modules<11>
@anchor{whatsnew/3 3 http}@anchor{12d6}
@subsubsection http


@ref{12d7,,http.server.BaseHTTPRequestHandler} now buffers the headers and writes
them all at once when @ref{12d8,,end_headers()} is
called.  A new method @ref{12d9,,flush_headers()}
can be used to directly manage when the accumulated headers are sent.
(Contributed by Andrew Schaaf in bpo-3709@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3709}.)

@ref{76,,http.server} now produces valid @code{HTML 4.01 strict} output.
(Contributed by Ezio Melotti in bpo-13295@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13295}.)

@ref{12da,,http.client.HTTPResponse} now has a
@ref{12db,,readinto()} method, which means it can be used
as an @ref{12dc,,io.RawIOBase} class.  (Contributed by John Kuhn in
bpo-13464@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13464}.)

@node html<2>,imaplib<4>,http<5>,Improved Modules<11>
@anchor{whatsnew/3 3 html}@anchor{12dd}
@subsubsection html


@ref{a7d,,html.parser.HTMLParser} is now able to parse broken markup without
raising errors, therefore the `strict' argument of the constructor and the
@code{HTMLParseError} exception are now deprecated.
The ability to parse broken markup is the result of a number of bug fixes that
are also available on the latest bug fix releases of Python 2.7/3.2.
(Contributed by Ezio Melotti in bpo-15114@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15114}, and bpo-14538@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14538},
bpo-13993@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13993}, bpo-13960@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13960}, bpo-13358@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13358}, bpo-1745761@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1745761},
bpo-755670@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=755670}, bpo-13357@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13357}, bpo-12629@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12629}, bpo-1200313@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1200313},
bpo-670664@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=670664}, bpo-13273@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13273}, bpo-12888@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12888}, bpo-7311@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7311}.)

A new @ref{12de,,html5} dictionary that maps HTML5 named character
references to the equivalent Unicode character(s) (e.g. @code{html5['gt;'] ==
'>'}) has been added to the @ref{70,,html.entities} module.  The dictionary is
now also used by @ref{a7d,,HTMLParser}.  (Contributed by Ezio
Melotti in bpo-11113@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11113} and bpo-15156@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15156}.)

@node imaplib<4>,inspect<10>,html<2>,Improved Modules<11>
@anchor{whatsnew/3 3 imaplib}@anchor{12df}
@subsubsection imaplib


The @ref{b06,,IMAP4_SSL} constructor now accepts an SSLContext
parameter to control parameters of the secure channel.

(Contributed by Sijin Joseph in bpo-8808@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8808}.)

@node inspect<10>,io<8>,imaplib<4>,Improved Modules<11>
@anchor{whatsnew/3 3 inspect}@anchor{12e0}
@subsubsection inspect


A new @ref{12e1,,getclosurevars()} function has been added. This function
reports the current binding of all names referenced from the function body and
where those names were resolved, making it easier to verify correct internal
state when testing code that relies on stateful closures.

(Contributed by Meador Inge and Nick Coghlan in bpo-13062@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13062}.)

A new @ref{12e2,,getgeneratorlocals()} function has been added. This
function reports the current binding of local variables in the generator’s
stack frame, making it easier to verify correct internal state when testing
generators.

(Contributed by Meador Inge in bpo-15153@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15153}.)

@node io<8>,itertools<7>,inspect<10>,Improved Modules<11>
@anchor{whatsnew/3 3 io}@anchor{12e3}
@subsubsection io


The @ref{741,,open()} function has a new @code{'x'} mode that can be used to
exclusively create a new file, and raise a @ref{1226,,FileExistsError} if the file
already exists. It is based on the C11 ‘x’ mode to fopen().

(Contributed by David Townshend in bpo-12760@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12760}.)

The constructor of the @ref{9c4,,TextIOWrapper} class has a new
`write_through' optional argument. If `write_through' is @code{True}, calls to
@code{write()} are guaranteed not to be buffered: any data
written on the @code{TextIOWrapper} object is immediately handled to its
underlying binary buffer.

@node itertools<7>,logging<7>,io<8>,Improved Modules<11>
@anchor{whatsnew/3 3 itertools}@anchor{12e4}
@subsubsection itertools


@ref{bf6,,accumulate()} now takes an optional @code{func} argument for
providing a user-supplied binary function.

@node logging<7>,math<10>,itertools<7>,Improved Modules<11>
@anchor{whatsnew/3 3 logging}@anchor{12e5}
@subsubsection logging


The @ref{bf9,,basicConfig()} function now supports an optional @code{handlers}
argument taking an iterable of handlers to be added to the root logger.

A class level attribute @code{append_nul} has
been added to @ref{86e,,SysLogHandler} to allow control of the
appending of the @code{NUL} (@code{\000}) byte to syslog records, since for some
daemons it is required while for others it is passed through to the log.

@node math<10>,mmap<4>,logging<7>,Improved Modules<11>
@anchor{whatsnew/3 3 math}@anchor{12e6}
@subsubsection math


The @ref{92,,math} module has a new function, @ref{12e7,,log2()},  which returns
the base-2 logarithm of `x'.

(Written by Mark Dickinson in bpo-11888@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11888}.)

@node mmap<4>,multiprocessing<9>,math<10>,Improved Modules<11>
@anchor{whatsnew/3 3 mmap}@anchor{12e8}
@subsubsection mmap


The @ref{12e9,,read()} method is now more compatible with other file-like
objects: if the argument is omitted or specified as @code{None}, it returns the
bytes from the current file position to the end of the mapping.  (Contributed
by Petri Lehtinen in bpo-12021@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12021}.)

@node multiprocessing<9>,nntplib<2>,mmap<4>,Improved Modules<11>
@anchor{whatsnew/3 3 multiprocessing}@anchor{12ea}
@subsubsection multiprocessing


The new @ref{12eb,,multiprocessing.connection.wait()} function allows polling
multiple objects (such as connections, sockets and pipes) with a timeout.
(Contributed by Richard Oudkerk in bpo-12328@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12328}.)

@ref{12ec,,multiprocessing.connection.Connection} objects can now be transferred
over multiprocessing connections.
(Contributed by Richard Oudkerk in bpo-4892@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4892}.)

@ref{254,,multiprocessing.Process} now accepts a @code{daemon} keyword argument
to override the default behavior of inheriting the @code{daemon} flag from
the parent process (bpo-6064@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6064}).

New attribute @ref{12ed,,multiprocessing.Process.sentinel} allows a
program to wait on multiple @ref{254,,Process} objects at one
time using the appropriate OS primitives (for example, @ref{c6,,select} on
posix systems).

New methods @ref{12ee,,multiprocessing.pool.Pool.starmap()} and
@ref{12ef,,starmap_async()} provide
@ref{12f0,,itertools.starmap()} equivalents to the existing
@ref{12f1,,multiprocessing.pool.Pool.map()} and
@ref{12f2,,map_async()} functions.  (Contributed by Hynek
Schlawack in bpo-12708@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12708}.)

@node nntplib<2>,os<13>,multiprocessing<9>,Improved Modules<11>
@anchor{whatsnew/3 3 nntplib}@anchor{12f3}
@subsubsection nntplib


The @code{nntplib.NNTP} class now supports the context management protocol to
unconditionally consume @ref{125c,,socket.error} exceptions and to close the NNTP
connection when done:

@example
>>> from nntplib import NNTP
>>> with NNTP('news.gmane.org') as n:
...     n.group('gmane.comp.python.committers')
...
('211 1755 1 1755 gmane.comp.python.committers', 1755, 1, 1755, 'gmane.comp.python.committers')
>>>
@end example

(Contributed by Giampaolo Rodolà in bpo-9795@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9795}.)

@node os<13>,pdb<9>,nntplib<2>,Improved Modules<11>
@anchor{whatsnew/3 3 os}@anchor{12f4}
@subsubsection os



@itemize *

@item 
The @ref{a5,,os} module has a new @ref{12f5,,pipe2()} function that makes it
possible to create a pipe with @ref{1282,,O_CLOEXEC} or
@ref{1041,,O_NONBLOCK} flags set atomically. This is especially useful to
avoid race conditions in multi-threaded programs.

@item 
The @ref{a5,,os} module has a new @ref{d0b,,sendfile()} function which provides
an efficient “zero-copy” way for copying data from one file (or socket)
descriptor to another. The phrase “zero-copy” refers to the fact that all of
the copying of data between the two descriptors is done entirely by the
kernel, with no copying of data into userspace buffers. @code{sendfile()}
can be used to efficiently copy data from a file on disk to a network socket,
e.g. for downloading a file.

(Patch submitted by Ross Lagerwall and Giampaolo Rodolà in bpo-10882@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10882}.)

@item 
To avoid race conditions like symlink attacks and issues with temporary
files and directories, it is more reliable (and also faster) to manipulate
file descriptors instead of file names. Python 3.3 enhances existing functions
and introduces new functions to work on file descriptors (bpo-4761@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4761},
bpo-10755@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10755} and bpo-14626@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14626}).


@itemize -

@item 
The @ref{a5,,os} module has a new @ref{d58,,fwalk()} function similar to
@ref{6d1,,walk()} except that it also yields file descriptors referring to the
directories visited. This is especially useful to avoid symlink races.

@item 
The following functions get new optional `dir_fd' (@ref{12f6,,paths relative to directory descriptors}) and/or `follow_symlinks' (@ref{12f7,,not following symlinks}):
@ref{12f8,,access()}, @ref{12f9,,chflags()}, @ref{52a,,chmod()}, @ref{12fa,,chown()},
@ref{12fb,,link()}, @ref{6c9,,lstat()}, @ref{52c,,mkdir()}, @ref{f96,,mkfifo()},
@ref{f97,,mknod()}, @ref{f98,,open()}, @ref{b20,,readlink()}, @ref{12fc,,remove()},
@ref{12fd,,rename()}, @ref{12fe,,replace()}, @ref{12ff,,rmdir()}, @ref{26f,,stat()},
@ref{1300,,symlink()}, @ref{1301,,unlink()}, @ref{1302,,utime()}.  Platform
support for using these parameters can be checked via the sets
@ref{1303,,os.supports_dir_fd} and @ref{1304,,os.supports_follow_symlinks}.

@item 
The following functions now support a file descriptor for their path argument:
@ref{822,,chdir()}, @ref{52a,,chmod()}, @ref{12fa,,chown()},
@ref{1305,,execve()}, @ref{1306,,listdir()}, @ref{1307,,pathconf()}, @ref{c09,,exists()},
@ref{26f,,stat()}, @ref{1308,,statvfs()}, @ref{1302,,utime()}.  Platform support
for this can be checked via the @ref{1309,,os.supports_fd} set.
@end itemize

@item 
@ref{12f8,,access()} accepts an @code{effective_ids} keyword argument to turn on
using the effective uid/gid rather than the real uid/gid in the access check.
Platform support for this can be checked via the
@ref{130a,,supports_effective_ids} set.

@item 
The @ref{a5,,os} module has two new functions: @ref{130b,,getpriority()} and
@ref{130c,,setpriority()}. They can be used to get or set process
niceness/priority in a fashion similar to @ref{130d,,os.nice()} but extended to all
processes instead of just the current one.

(Patch submitted by Giampaolo Rodolà in bpo-10784@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10784}.)

@item 
The new @ref{12fe,,os.replace()} function allows cross-platform renaming of a
file with overwriting the destination.  With @ref{12fd,,os.rename()}, an existing
destination file is overwritten under POSIX, but raises an error under
Windows.
(Contributed by Antoine Pitrou in bpo-8828@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8828}.)

@item 
The stat family of functions (@ref{26f,,stat()}, @ref{f92,,fstat()},
and @ref{6c9,,lstat()}) now support reading a file’s timestamps
with nanosecond precision.  Symmetrically, @ref{1302,,utime()}
can now write file timestamps with nanosecond precision.  (Contributed by
Larry Hastings in bpo-14127@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14127}.)

@item 
The new @ref{130e,,os.get_terminal_size()} function queries the size of the
terminal attached to a file descriptor. See also
@ref{130f,,shutil.get_terminal_size()}.
(Contributed by Zbigniew Jędrzejewski-Szmek in bpo-13609@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13609}.)
@end itemize

@c XXX sort out this mess after beta1


@itemize *

@item 
New functions to support Linux extended attributes (bpo-12720@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12720}):
@ref{1310,,getxattr()}, @ref{1311,,listxattr()}, @ref{1312,,removexattr()},
@ref{1313,,setxattr()}.

@item 
New interface to the scheduler. These functions
control how a process is allocated CPU time by the operating system. New
functions:
@ref{1314,,sched_get_priority_max()}, @ref{1315,,sched_get_priority_min()},
@ref{1316,,sched_getaffinity()}, @ref{1317,,sched_getparam()},
@ref{1318,,sched_getscheduler()}, @ref{1319,,sched_rr_get_interval()},
@ref{131a,,sched_setaffinity()}, @ref{131b,,sched_setparam()},
@ref{131c,,sched_setscheduler()}, @ref{131d,,sched_yield()},

@item 
New functions to control the file system:


@itemize *

@item 
@ref{f99,,posix_fadvise()}: Announces an intention to access data in a
specific pattern thus allowing the kernel to make optimizations.

@item 
@ref{f9a,,posix_fallocate()}: Ensures that enough disk space is allocated
for a file.

@item 
@ref{131e,,sync()}: Force write of everything to disk.
@end itemize

@item 
Additional new  posix functions:


@itemize *

@item 
@ref{131f,,lockf()}: Apply, test or remove a POSIX lock on an open file descriptor.

@item 
@ref{d5c,,pread()}: Read from a file descriptor at an offset, the file
offset remains unchanged.

@item 
@ref{d5f,,pwrite()}: Write to a file descriptor from an offset, leaving
the file offset unchanged.

@item 
@ref{d5b,,readv()}: Read from a file descriptor into a number of writable buffers.

@item 
@ref{1042,,truncate()}: Truncate the file corresponding to `path', so that
it is at most `length' bytes in size.

@item 
@ref{f9f,,waitid()}: Wait for the completion of one or more child processes.

@item 
@ref{d5e,,writev()}: Write the contents of `buffers' to a file descriptor,
where `buffers' is an arbitrary sequence of buffers.

@item 
@ref{1320,,getgrouplist()} (bpo-9344@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9344}): Return list of group ids that
specified user belongs to.
@end itemize

@item 
@ref{1321,,times()} and @ref{1322,,uname()}: Return type changed from a tuple to
a tuple-like object with named attributes.

@item 
Some platforms now support additional constants for the @ref{1323,,lseek()}
function, such as @code{os.SEEK_HOLE} and @code{os.SEEK_DATA}.

@item 
New constants @ref{1324,,RTLD_LAZY}, @ref{1325,,RTLD_NOW},
@ref{1326,,RTLD_GLOBAL}, @ref{1327,,RTLD_LOCAL}, @ref{1328,,RTLD_NODELETE},
@ref{1329,,RTLD_NOLOAD}, and @ref{132a,,RTLD_DEEPBIND} are available on
platforms that support them.   These are for use with the
@ref{132b,,sys.setdlopenflags()} function, and supersede the similar constants
defined in @ref{2e,,ctypes} and @code{DLFCN}.  (Contributed by Victor Stinner
in bpo-13226@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13226}.)

@item 
@ref{1300,,os.symlink()} now accepts (and ignores) the @code{target_is_directory}
keyword argument on non-Windows platforms, to ease cross-platform support.
@end itemize

@node pdb<9>,pickle<6>,os<13>,Improved Modules<11>
@anchor{whatsnew/3 3 pdb}@anchor{132c}
@subsubsection pdb


Tab-completion is now available not only for command names, but also their
arguments.  For example, for the @code{break} command, function and file names
are completed.

(Contributed by Georg Brandl in bpo-14210@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14210})

@node pickle<6>,pydoc<6>,pdb<9>,Improved Modules<11>
@anchor{whatsnew/3 3 pickle}@anchor{132d}
@subsubsection pickle


@ref{c19,,pickle.Pickler} objects now have an optional
@ref{132e,,dispatch_table} attribute allowing per-pickler
reduction functions to be set.

(Contributed by Richard Oudkerk in bpo-14166@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14166}.)

@node pydoc<6>,re<10>,pickle<6>,Improved Modules<11>
@anchor{whatsnew/3 3 pydoc}@anchor{132f}
@subsubsection pydoc


The Tk GUI and the @code{serve()} function have been removed from the
@ref{ba,,pydoc} module: @code{pydoc -g} and @code{serve()} have been deprecated
in Python 3.2.

@node re<10>,sched,pydoc<6>,Improved Modules<11>
@anchor{whatsnew/3 3 re}@anchor{1330}
@subsubsection re


@ref{16a,,str} regular expressions now support @code{\u} and @code{\U} escapes.

(Contributed by Serhiy Storchaka in bpo-3665@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3665}.)

@node sched,select<2>,re<10>,Improved Modules<11>
@anchor{whatsnew/3 3 sched}@anchor{1331}
@subsubsection sched



@itemize *

@item 
@ref{1332,,run()} now accepts a `blocking' parameter which when
set to false makes the method execute the scheduled events due to expire
soonest (if any) and then return immediately.
This is useful in case you want to use the @ref{1333,,scheduler} in
non-blocking applications.  (Contributed by Giampaolo Rodolà in bpo-13449@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13449}.)

@item 
@ref{1333,,scheduler} class can now be safely used in multi-threaded
environments.  (Contributed by Josiah Carlson and Giampaolo Rodolà in
bpo-8684@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8684}.)

@item 
`timefunc' and `delayfunct' parameters of @ref{1333,,scheduler} class
constructor are now optional and defaults to @ref{55d,,time.time()} and
@ref{8ae,,time.sleep()} respectively.  (Contributed by Chris Clark in
bpo-13245@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13245}.)

@item 
@ref{1334,,enter()} and @ref{1335,,enterabs()}
`argument' parameter is now optional.  (Contributed by Chris Clark in
bpo-13245@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13245}.)

@item 
@ref{1334,,enter()} and @ref{1335,,enterabs()}
now accept a `kwargs' parameter.  (Contributed by Chris Clark in
bpo-13245@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13245}.)
@end itemize

@node select<2>,shlex<3>,sched,Improved Modules<11>
@anchor{whatsnew/3 3 select}@anchor{1336}
@subsubsection select


Solaris and derivative platforms have a new class @ref{119c,,select.devpoll}
for high performance asynchronous sockets via @code{/dev/poll}.
(Contributed by Jesús Cea Avión in bpo-6397@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6397}.)

@node shlex<3>,shutil<7>,select<2>,Improved Modules<11>
@anchor{whatsnew/3 3 shlex}@anchor{1337}
@subsubsection shlex


The previously undocumented helper function @code{quote} from the
@code{pipes} modules has been moved to the @ref{c9,,shlex} module and
documented.  @ref{582,,quote()} properly escapes all characters in a string
that might be otherwise given special meaning by the shell.

@node shutil<7>,signal<4>,shlex<3>,Improved Modules<11>
@anchor{whatsnew/3 3 shutil}@anchor{1338}
@subsubsection shutil



@itemize *

@item 
New functions:


@itemize *

@item 
@ref{1339,,disk_usage()}: provides total, used and free disk space
statistics.  (Contributed by Giampaolo Rodolà in bpo-12442@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12442}.)

@item 
@ref{549,,chown()}: allows one to change user and/or group of the given
path also specifying the user/group names and not only their numeric
ids.  (Contributed by Sandro Tosi in bpo-12191@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12191}.)

@item 
@ref{130f,,shutil.get_terminal_size()}: returns the size of the terminal window
to which the interpreter is attached.  (Contributed by Zbigniew
Jędrzejewski-Szmek in bpo-13609@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13609}.)
@end itemize

@item 
@ref{c56,,copy2()} and @ref{133a,,copystat()} now preserve file
timestamps with nanosecond precision on platforms that support it.
They also preserve file “extended attributes” on Linux.  (Contributed
by Larry Hastings in bpo-14127@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14127} and  bpo-15238@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15238}.)

@item 
Several functions now take an optional @code{symlinks} argument: when that
parameter is true, symlinks aren’t dereferenced and the operation instead
acts on the symlink itself (or creates one, if relevant).
(Contributed by Hynek Schlawack in bpo-12715@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12715}.)

@item 
When copying files to a different file system, @ref{c57,,move()} now
handles symlinks the way the posix @code{mv} command does, recreating the
symlink rather than copying the target file contents.  (Contributed by
Jonathan Niehof in bpo-9993@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9993}.)  @code{move()} now also returns
the @code{dst} argument as its result.

@item 
@ref{354,,rmtree()} is now resistant to symlink attacks on platforms
which support the new @code{dir_fd} parameter in @ref{f98,,os.open()} and
@ref{1301,,os.unlink()}.  (Contributed by Martin von Löwis and Hynek Schlawack
in bpo-4489@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4489}.)
@end itemize

@node signal<4>,smtpd<4>,shutil<7>,Improved Modules<11>
@anchor{whatsnew/3 3 signal}@anchor{133b}
@subsubsection signal



@itemize *

@item 
The @ref{cb,,signal} module has new functions:


@itemize *

@item 
@ref{133c,,pthread_sigmask()}: fetch and/or change the signal mask of the
calling thread (Contributed by Jean-Paul Calderone in bpo-8407@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8407});

@item 
@ref{133d,,pthread_kill()}: send a signal to a thread;

@item 
@ref{133e,,sigpending()}: examine pending functions;

@item 
@ref{133f,,sigwait()}: wait a signal;

@item 
@ref{fb1,,sigwaitinfo()}: wait for a signal, returning detailed
information about it;

@item 
@ref{fb0,,sigtimedwait()}: like @ref{fb1,,sigwaitinfo()} but with a
timeout.
@end itemize

@item 
The signal handler writes the signal number as a single byte instead of
a nul byte into the wakeup file descriptor. So it is possible to wait more
than one signal and know which signals were raised.

@item 
@ref{1340,,signal.signal()} and @ref{1341,,signal.siginterrupt()} raise an OSError,
instead of a RuntimeError: OSError has an errno attribute.
@end itemize

@node smtpd<4>,smtplib<4>,signal<4>,Improved Modules<11>
@anchor{whatsnew/3 3 smtpd}@anchor{1342}
@subsubsection smtpd


The @code{smtpd} module now supports 
@geindex RFC; RFC 5321
RFC 5321@footnote{https://datatracker.ietf.org/doc/html/rfc5321.html} (extended SMTP) and 
@geindex RFC; RFC 1870
RFC 1870@footnote{https://datatracker.ietf.org/doc/html/rfc1870.html}
(size extension).  Per the standard, these extensions are enabled if and only
if the client initiates the session with an @code{EHLO} command.

(Initial @code{ELHO} support by Alberto Trevino.  Size extension by Juhana
Jauhiainen.  Substantial additional work on the patch contributed by Michele
Orrù and Dan Boswell.  bpo-8739@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8739})

@node smtplib<4>,socket<11>,smtpd<4>,Improved Modules<11>
@anchor{whatsnew/3 3 smtplib}@anchor{1343}
@subsubsection smtplib


The @ref{b2d,,SMTP}, @ref{b2e,,SMTP_SSL}, and
@ref{b2f,,LMTP} classes now accept a @code{source_address} keyword argument
to specify the @code{(host, port)} to use as the source address in the bind call
when creating the outgoing socket.  (Contributed by Paulo Scardine in
bpo-11281@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11281}.)

@ref{b2d,,SMTP} now supports the context management protocol, allowing an
@code{SMTP} instance to be used in a @code{with} statement.  (Contributed
by Giampaolo Rodolà in bpo-11289@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11289}.)

The @ref{b2e,,SMTP_SSL} constructor and the @ref{1344,,starttls()}
method now accept an SSLContext parameter to control parameters of the secure
channel.  (Contributed by Kasun Herath in bpo-8809@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8809}.)

@node socket<11>,socketserver<3>,smtplib<4>,Improved Modules<11>
@anchor{whatsnew/3 3 socket}@anchor{1345}
@subsubsection socket



@itemize *

@item 
The @ref{fa7,,socket} class now exposes additional methods to process
ancillary data when supported by the underlying platform:


@itemize *

@item 
@ref{6a2,,sendmsg()}

@item 
@ref{fac,,recvmsg()}

@item 
@ref{1346,,recvmsg_into()}
@end itemize

(Contributed by David Watson in bpo-6560@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6560}, based on an earlier patch by
Heiko Wundram)

@item 
The @ref{fa7,,socket} class now supports the PF_CAN protocol family
(@indicateurl{https://en.wikipedia.org/wiki/Socketcan}), on Linux
(@indicateurl{https://lwn.net/Articles/253425}).

(Contributed by Matthias Fuchs, updated by Tiago Gonçalves in bpo-10141@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10141}.)

@item 
The @ref{fa7,,socket} class now supports the PF_RDS protocol family
(@indicateurl{https://en.wikipedia.org/wiki/Reliable_Datagram_Sockets} and
https://oss.oracle.com/projects/rds@footnote{https://web.archive.org/web/20130115155505/https://oss.oracle.com/projects/rds/}).

@item 
The @ref{fa7,,socket} class now supports the @code{PF_SYSTEM} protocol
family on OS X.  (Contributed by Michael Goderbauer in bpo-13777@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13777}.)

@item 
New function @ref{1347,,sethostname()} allows the hostname to be set
on Unix systems if the calling process has sufficient privileges.
(Contributed by Ross Lagerwall in bpo-10866@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10866}.)
@end itemize

@node socketserver<3>,sqlite3<11>,socket<11>,Improved Modules<11>
@anchor{whatsnew/3 3 socketserver}@anchor{1348}
@subsubsection socketserver


@ref{1349,,BaseServer} now has an overridable method
@ref{134a,,service_actions()} that is called by the
@ref{134b,,serve_forever()} method in the service loop.
@ref{d77,,ForkingMixIn} now uses this to clean up zombie
child processes.  (Contributed by Justin Warkentin in bpo-11109@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11109}.)

@node sqlite3<11>,ssl<12>,socketserver<3>,Improved Modules<11>
@anchor{whatsnew/3 3 sqlite3}@anchor{134c}
@subsubsection sqlite3


New @ref{54e,,sqlite3.Connection} method
@ref{5ab,,set_trace_callback()} can be used to capture a trace of
all sql commands processed by sqlite.  (Contributed by Torsten Landschoff
in bpo-11688@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11688}.)

@node ssl<12>,stat<2>,sqlite3<11>,Improved Modules<11>
@anchor{whatsnew/3 3 ssl}@anchor{134d}
@subsubsection ssl



@itemize *

@item 
The @ref{d5,,ssl} module has two new random generation functions:


@itemize *

@item 
@ref{748,,RAND_bytes()}: generate cryptographically strong
pseudo-random bytes.

@item 
@code{RAND_pseudo_bytes()}: generate pseudo-random bytes.
@end itemize

(Contributed by Victor Stinner in bpo-12049@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12049}.)

@item 
The @ref{d5,,ssl} module now exposes a finer-grained exception hierarchy
in order to make it easier to inspect the various kinds of errors.
(Contributed by Antoine Pitrou in bpo-11183@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11183}.)

@item 
@ref{598,,load_cert_chain()} now accepts a `password' argument
to be used if the private key is encrypted.
(Contributed by Adam Simpkins in bpo-12803@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12803}.)

@item 
Diffie-Hellman key exchange, both regular and Elliptic Curve-based, is
now supported through the @ref{134e,,load_dh_params()} and
@ref{134f,,set_ecdh_curve()} methods.
(Contributed by Antoine Pitrou in bpo-13626@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13626} and bpo-13627@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13627}.)

@item 
SSL sockets have a new @ref{1350,,get_channel_binding()} method
allowing the implementation of certain authentication mechanisms such as
SCRAM-SHA-1-PLUS.  (Contributed by Jacek Konieczny in bpo-12551@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12551}.)

@item 
You can query the SSL compression algorithm used by an SSL socket, thanks
to its new @ref{1351,,compression()} method.  The new attribute
@ref{1352,,OP_NO_COMPRESSION} can be used to disable compression.
(Contributed by Antoine Pitrou in bpo-13634@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13634}.)

@item 
Support has been added for the Next Protocol Negotiation extension using
the @ref{356,,ssl.SSLContext.set_npn_protocols()} method.
(Contributed by Colin Marc in bpo-14204@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14204}.)

@item 
SSL errors can now be introspected more easily thanks to
@ref{1353,,library} and @ref{1354,,reason} attributes.
(Contributed by Antoine Pitrou in bpo-14837@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14837}.)

@item 
The @ref{a43,,get_server_certificate()} function now supports IPv6.
(Contributed by Charles-François Natali in bpo-11811@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11811}.)

@item 
New attribute @ref{1355,,OP_CIPHER_SERVER_PREFERENCE} allows setting
SSLv3 server sockets to use the server’s cipher ordering preference rather
than the client’s (bpo-13635@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13635}).
@end itemize

@node stat<2>,struct<4>,ssl<12>,Improved Modules<11>
@anchor{whatsnew/3 3 stat}@anchor{1356}
@subsubsection stat


The undocumented tarfile.filemode function has been moved to
@ref{1357,,stat.filemode()}. It can be used to convert a file’s mode to a string of
the form ‘-rwxrwxrwx’.

(Contributed by Giampaolo Rodolà in bpo-14807@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14807}.)

@node struct<4>,subprocess<6>,stat<2>,Improved Modules<11>
@anchor{whatsnew/3 3 struct}@anchor{1358}
@subsubsection struct


The @ref{db,,struct} module now supports @code{ssize_t} and @code{size_t} via the
new codes @code{n} and @code{N}, respectively.  (Contributed by Antoine Pitrou
in bpo-3163@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3163}.)

@node subprocess<6>,sys<13>,struct<4>,Improved Modules<11>
@anchor{whatsnew/3 3 subprocess}@anchor{1359}
@subsubsection subprocess


Command strings can now be bytes objects on posix platforms.  (Contributed by
Victor Stinner in bpo-8513@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8513}.)

A new constant @ref{135a,,DEVNULL} allows suppressing output in a
platform-independent fashion.  (Contributed by Ross Lagerwall in
bpo-5870@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5870}.)

@node sys<13>,tarfile<9>,subprocess<6>,Improved Modules<11>
@anchor{whatsnew/3 3 sys}@anchor{135b}
@subsubsection sys


The @ref{df,,sys} module has a new @ref{135c,,thread_info} @ref{85f,,named tuple} holding information about the thread implementation
(bpo-11223@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11223}).

@node tarfile<9>,tempfile<4>,sys<13>,Improved Modules<11>
@anchor{whatsnew/3 3 tarfile}@anchor{135d}
@subsubsection tarfile


@ref{e4,,tarfile} now supports @code{lzma} encoding via the @ref{8e,,lzma} module.
(Contributed by Lars Gustäbel in bpo-5689@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5689}.)

@node tempfile<4>,textwrap<3>,tarfile<9>,Improved Modules<11>
@anchor{whatsnew/3 3 tempfile}@anchor{135e}
@subsubsection tempfile


@ref{8a4,,tempfile.SpooledTemporaryFile}'s @code{truncate()} method now accepts
a @code{size} parameter.  (Contributed by Ryan Kelly in bpo-9957@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9957}.)

@node textwrap<3>,threading<9>,tempfile<4>,Improved Modules<11>
@anchor{whatsnew/3 3 textwrap}@anchor{135f}
@subsubsection textwrap


The @ref{f2,,textwrap} module has a new @ref{57d,,indent()} that makes
it straightforward to add a common prefix to selected lines in a block
of text  (bpo-13857@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13857}).

@node threading<9>,time<8>,textwrap<3>,Improved Modules<11>
@anchor{whatsnew/3 3 threading}@anchor{1360}
@subsubsection threading


@ref{1361,,threading.Condition}, @ref{1362,,threading.Semaphore},
@ref{1363,,threading.BoundedSemaphore}, @ref{1364,,threading.Event}, and
@ref{1365,,threading.Timer}, all of which used to be factory functions returning a
class instance, are now classes and may be subclassed.  (Contributed by Éric
Araujo in bpo-10968@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10968}.)

The @ref{177,,threading.Thread} constructor now accepts a @code{daemon} keyword
argument to override the default behavior of inheriting the @code{daemon} flag
value from the parent thread (bpo-6064@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6064}).

The formerly private function @code{_thread.get_ident} is now available as the
public function @ref{1366,,threading.get_ident()}.  This eliminates several cases of
direct access to the @code{_thread} module in the stdlib.  Third party code that
used @code{_thread.get_ident} should likewise be changed to use the new public
interface.

@node time<8>,types<8>,threading<9>,Improved Modules<11>
@anchor{whatsnew/3 3 time}@anchor{1367}
@subsubsection time


The 
@geindex Python Enhancement Proposals; PEP 418
PEP 418@footnote{https://peps.python.org/pep-0418/} added new functions to the @ref{f4,,time} module:


@itemize *

@item 
@ref{1368,,get_clock_info()}: Get information on a clock.

@item 
@ref{55c,,monotonic()}: Monotonic clock (cannot go backward), not affected
by system clock updates.

@item 
@ref{c80,,perf_counter()}: Performance counter with the highest available
resolution to measure a short duration.

@item 
@ref{c81,,process_time()}: Sum of the system and user CPU time of the
current process.
@end itemize

Other new functions:


@itemize *

@item 
@ref{1369,,clock_getres()}, @ref{136a,,clock_gettime()} and
@ref{136b,,clock_settime()} functions with @code{CLOCK_@var{xxx}} constants.
(Contributed by Victor Stinner in bpo-10278@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10278}.)
@end itemize

To improve cross platform consistency, @ref{8ae,,sleep()} now raises a
@ref{2ee,,ValueError} when passed a negative sleep value.  Previously this was an
error on posix, but produced an infinite sleep on Windows.

@node types<8>,unittest<11>,time<8>,Improved Modules<11>
@anchor{whatsnew/3 3 types}@anchor{136c}
@subsubsection types


Add a new @ref{699,,types.MappingProxyType} class: Read-only proxy of a mapping.
(bpo-14386@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14386})

The new functions @ref{136d,,types.new_class()} and @ref{136e,,types.prepare_class()} provide support
for 
@geindex Python Enhancement Proposals; PEP 3115
PEP 3115@footnote{https://peps.python.org/pep-3115/} compliant dynamic type creation. (bpo-14588@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14588})

@node unittest<11>,urllib<6>,types<8>,Improved Modules<11>
@anchor{whatsnew/3 3 unittest}@anchor{136f}
@subsubsection unittest


@ref{751,,assertRaises()}, @ref{753,,assertRaisesRegex()}, @ref{1370,,assertWarns()}, and
@ref{1371,,assertWarnsRegex()} now accept a keyword argument `msg' when used as
context managers.  (Contributed by Ezio Melotti and Winston Ewert in
bpo-10775@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10775}.)

@ref{1372,,unittest.TestCase.run()} now returns the @ref{1373,,TestResult}
object.

@node urllib<6>,webbrowser<4>,unittest<11>,Improved Modules<11>
@anchor{whatsnew/3 3 urllib}@anchor{1374}
@subsubsection urllib


The @ref{11de,,Request} class, now accepts a `method' argument
used by @ref{1375,,get_method()} to determine what HTTP method
should be used.  For example, this will send a @code{'HEAD'} request:

@example
>>> urlopen(Request('https://www.python.org', method='HEAD'))
@end example

(bpo-1673007@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1673007})

@node webbrowser<4>,xml etree ElementTree<2>,urllib<6>,Improved Modules<11>
@anchor{whatsnew/3 3 webbrowser}@anchor{1376}
@subsubsection webbrowser


The @ref{11c,,webbrowser} module supports more “browsers”: Google Chrome (named
@code{chrome}, @code{chromium}, @code{chrome-browser} or
@code{chromium-browser} depending on the version and operating system),
and the generic launchers @code{xdg-open}, from the FreeDesktop.org
project, and @code{gvfs-open}, which is the default URI handler for GNOME
3.  (The former contributed by Arnaud Calmettes in bpo-13620@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13620}, the latter
by Matthias Klose in bpo-14493@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14493}.)

@node xml etree ElementTree<2>,zlib<3>,webbrowser<4>,Improved Modules<11>
@anchor{whatsnew/3 3 xml-etree-elementtree}@anchor{1377}
@subsubsection xml.etree.ElementTree


The @ref{12c,,xml.etree.ElementTree} module now imports its C accelerator by
default; there is no longer a need to explicitly import
@code{xml.etree.cElementTree} (this module stays for backwards compatibility,
but is now deprecated).  In addition,  the @code{iter} family of methods of
@ref{361,,Element} has been optimized (rewritten in C).
The module’s documentation has also been greatly improved with added examples
and a more detailed reference.

@node zlib<3>,,xml etree ElementTree<2>,Improved Modules<11>
@anchor{whatsnew/3 3 zlib}@anchor{1378}
@subsubsection zlib


New attribute @ref{1379,,zlib.Decompress.eof} makes it possible to distinguish
between a properly formed compressed stream and an incomplete or truncated one.
(Contributed by Nadeem Vawda in bpo-12646@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12646}.)

New attribute @ref{137a,,zlib.ZLIB_RUNTIME_VERSION} reports the version string of
the underlying @code{zlib} library that is loaded at runtime.  (Contributed by
Torsten Landschoff in bpo-12306@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12306}.)

@node Optimizations<11>,Build and C API Changes<4>,Improved Modules<11>,What’s New In Python 3 3
@anchor{whatsnew/3 3 optimizations}@anchor{137b}
@subsection Optimizations


Major performance enhancements have been added:


@itemize *

@item 
Thanks to 
@geindex Python Enhancement Proposals; PEP 393
PEP 393@footnote{https://peps.python.org/pep-0393/}, some operations on Unicode strings have been optimized:


@itemize *

@item 
the memory footprint is divided by 2 to 4 depending on the text

@item 
encode an ASCII string to UTF-8 doesn’t need to encode characters anymore,
the UTF-8 representation is shared with the ASCII representation

@item 
the UTF-8 encoder has been optimized

@item 
repeating a single ASCII letter and getting a substring of an ASCII string
is 4 times faster
@end itemize

@item 
UTF-8 is now 2x to 4x faster.  UTF-16 encoding is now up to 10x faster.

(Contributed by Serhiy Storchaka, bpo-14624@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14624}, bpo-14738@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14738} and
bpo-15026@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15026}.)
@end itemize

@node Build and C API Changes<4>,Deprecated<13>,Optimizations<11>,What’s New In Python 3 3
@anchor{whatsnew/3 3 build-and-c-api-changes}@anchor{124f}
@subsection Build and C API Changes


Changes to Python’s build process and to the C API include:


@itemize *

@item 
New 
@geindex Python Enhancement Proposals; PEP 3118
PEP 3118@footnote{https://peps.python.org/pep-3118/} related function:


@itemize *

@item 
@ref{137c,,PyMemoryView_FromMemory()}
@end itemize

@item 
@geindex Python Enhancement Proposals; PEP 393
PEP 393@footnote{https://peps.python.org/pep-0393/} added new Unicode types, macros and functions:


@itemize *

@item 
High-level API:


@itemize *

@item 
@ref{ab8,,PyUnicode_CopyCharacters()}

@item 
@ref{abc,,PyUnicode_FindChar()}

@item 
@ref{ab6,,PyUnicode_GetLength()}, @ref{ab7,,PyUnicode_GET_LENGTH}

@item 
@ref{aaf,,PyUnicode_New()}

@item 
@ref{ab9,,PyUnicode_Substring()}

@item 
@ref{137d,,PyUnicode_ReadChar()}, @ref{137e,,PyUnicode_WriteChar()}
@end itemize

@item 
Low-level API:


@itemize *

@item 
@ref{137f,,Py_UCS1}, @ref{1380,,Py_UCS2}, @ref{33b,,Py_UCS4} types

@item 
@ref{1381,,PyASCIIObject} and @ref{1382,,PyCompactUnicodeObject} structures

@item 
@ref{432,,PyUnicode_READY}

@item 
@ref{1383,,PyUnicode_FromKindAndData()}

@item 
@ref{1384,,PyUnicode_AsUCS4()}, @ref{abe,,PyUnicode_AsUCS4Copy()}

@item 
@ref{1385,,PyUnicode_DATA}, @ref{1386,,PyUnicode_1BYTE_DATA},
@ref{1387,,PyUnicode_2BYTE_DATA}, @ref{1388,,PyUnicode_4BYTE_DATA}

@item 
@ref{1389,,PyUnicode_KIND} with @code{PyUnicode_Kind} enum:
@code{PyUnicode_WCHAR_KIND}, @ref{138a,,PyUnicode_1BYTE_KIND},
@ref{138b,,PyUnicode_2BYTE_KIND}, @ref{138c,,PyUnicode_4BYTE_KIND}

@item 
@ref{138d,,PyUnicode_READ}, @ref{138e,,PyUnicode_READ_CHAR}, @ref{138f,,PyUnicode_WRITE}

@item 
@ref{1390,,PyUnicode_MAX_CHAR_VALUE}
@end itemize
@end itemize

@item 
@ref{3bf,,PyArg_ParseTuple} now accepts a @ref{342,,bytearray} for the @code{c}
format (bpo-12380@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12380}).
@end itemize

@node Deprecated<13>,Porting to Python 3 3,Build and C API Changes<4>,What’s New In Python 3 3
@anchor{whatsnew/3 3 deprecated}@anchor{1391}
@subsection Deprecated


@menu
* Unsupported Operating Systems: Unsupported Operating Systems<2>. 
* Deprecated Python modules@comma{} functions and methods: Deprecated Python modules functions and methods<4>. 
* Deprecated functions and types of the C API: Deprecated functions and types of the C API<3>. 
* Deprecated features:: 

@end menu

@node Unsupported Operating Systems<2>,Deprecated Python modules functions and methods<4>,,Deprecated<13>
@anchor{whatsnew/3 3 unsupported-operating-systems}@anchor{1392}
@subsubsection Unsupported Operating Systems


OS/2 and VMS are no longer supported due to the lack of a maintainer.

Windows 2000 and Windows platforms which set @code{COMSPEC} to @code{command.com}
are no longer supported due to maintenance burden.

OSF support, which was deprecated in 3.2, has been completely removed.

@node Deprecated Python modules functions and methods<4>,Deprecated functions and types of the C API<3>,Unsupported Operating Systems<2>,Deprecated<13>
@anchor{whatsnew/3 3 deprecated-python-modules-functions-and-methods}@anchor{1393}
@subsubsection Deprecated Python modules, functions and methods



@itemize *

@item 
Passing a non-empty string to @code{object.__format__()} is deprecated, and
will produce a @ref{199,,TypeError} in Python 3.4 (bpo-9856@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9856}).

@item 
The @code{unicode_internal} codec has been deprecated because of the
@geindex Python Enhancement Proposals; PEP 393
PEP 393@footnote{https://peps.python.org/pep-0393/}, use UTF-8, UTF-16 (@code{utf-16-le} or @code{utf-16-be}), or UTF-32
(@code{utf-32-le} or @code{utf-32-be})

@item 
@ref{12cf,,ftplib.FTP.nlst()} and @ref{12d0,,ftplib.FTP.dir()}: use
@ref{12ce,,ftplib.FTP.mlsd()}

@item 
@code{platform.popen()}: use the @ref{dc,,subprocess} module. Check especially
the @ref{1394,,Replacing Older Functions with the subprocess Module} section (bpo-11377@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11377}).

@item 
bpo-13374@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13374}: The Windows bytes API has been deprecated in the @ref{a5,,os}
module. Use Unicode filenames, instead of bytes filenames, to not depend on
the ANSI code page anymore and to support any filename.

@item 
bpo-13988@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13988}: The @code{xml.etree.cElementTree} module is deprecated.  The
accelerator is used automatically whenever available.

@item 
The behaviour of @code{time.clock()} depends on the platform: use the new
@ref{c80,,time.perf_counter()} or @ref{c81,,time.process_time()} function instead,
depending on your requirements, to have a well defined behaviour.

@item 
The @code{os.stat_float_times()} function is deprecated.

@item 
@ref{4,,abc} module:


@itemize *

@item 
@ref{1290,,abc.abstractproperty} has been deprecated, use @ref{4b4,,property}
with @ref{1291,,abc.abstractmethod()} instead.

@item 
@ref{1292,,abc.abstractclassmethod} has been deprecated, use
@ref{48f,,classmethod} with @ref{1291,,abc.abstractmethod()} instead.

@item 
@ref{1293,,abc.abstractstaticmethod} has been deprecated, use
@ref{451,,staticmethod} with @ref{1291,,abc.abstractmethod()} instead.
@end itemize

@item 
@ref{7b,,importlib} package:


@itemize *

@item 
@ref{1395,,importlib.abc.SourceLoader.path_mtime()} is now deprecated in favour of
@ref{1396,,importlib.abc.SourceLoader.path_stats()} as bytecode files now store
both the modification time and size of the source file the bytecode file was
compiled from.
@end itemize
@end itemize

@node Deprecated functions and types of the C API<3>,Deprecated features,Deprecated Python modules functions and methods<4>,Deprecated<13>
@anchor{whatsnew/3 3 deprecated-functions-and-types-of-the-c-api}@anchor{1397}
@subsubsection Deprecated functions and types of the C API


The @ref{3de,,Py_UNICODE} has been deprecated by 
@geindex Python Enhancement Proposals; PEP 393
PEP 393@footnote{https://peps.python.org/pep-0393/} and will be
removed in Python 4. All functions using this type are deprecated:

Unicode functions and methods using @ref{3de,,Py_UNICODE} and
@ref{3de,,Py_UNICODE}* types:


@itemize *

@item 
@code{PyUnicode_FromUnicode}: use @ref{1398,,PyUnicode_FromWideChar()} or
@ref{1383,,PyUnicode_FromKindAndData()}

@item 
@code{PyUnicode_AS_UNICODE}, @code{PyUnicode_AsUnicode()},
@code{PyUnicode_AsUnicodeAndSize()}: use @ref{abf,,PyUnicode_AsWideCharString()}

@item 
@code{PyUnicode_AS_DATA}: use @ref{1385,,PyUnicode_DATA} with
@ref{138d,,PyUnicode_READ} and @ref{138f,,PyUnicode_WRITE}

@item 
@code{PyUnicode_GET_SIZE}, @code{PyUnicode_GetSize()}: use
@ref{ab7,,PyUnicode_GET_LENGTH} or @ref{ab6,,PyUnicode_GetLength()}

@item 
@code{PyUnicode_GET_DATA_SIZE}: use
@code{PyUnicode_GET_LENGTH(str) * PyUnicode_KIND(str)} (only work on ready
strings)

@item 
@code{PyUnicode_AsUnicodeCopy()}: use @ref{abe,,PyUnicode_AsUCS4Copy()} or
@ref{abf,,PyUnicode_AsWideCharString()}

@item 
@code{PyUnicode_GetMax()}
@end itemize

Functions and macros manipulating Py_UNICODE* strings:


@itemize *

@item 
@code{Py_UNICODE_strlen()}: use @ref{ab6,,PyUnicode_GetLength()} or
@ref{ab7,,PyUnicode_GET_LENGTH}

@item 
@code{Py_UNICODE_strcat()}: use @ref{ab8,,PyUnicode_CopyCharacters()} or
@ref{62b,,PyUnicode_FromFormat()}

@item 
@code{Py_UNICODE_strcpy()}, @code{Py_UNICODE_strncpy()},
@code{Py_UNICODE_COPY()}: use @ref{ab8,,PyUnicode_CopyCharacters()} or
@ref{ab9,,PyUnicode_Substring()}

@item 
@code{Py_UNICODE_strcmp()}: use @ref{aba,,PyUnicode_Compare()}

@item 
@code{Py_UNICODE_strncmp()}: use @ref{abb,,PyUnicode_Tailmatch()}

@item 
@code{Py_UNICODE_strchr()}, @code{Py_UNICODE_strrchr()}: use
@ref{abc,,PyUnicode_FindChar()}

@item 
@code{Py_UNICODE_FILL()}: use @ref{1399,,PyUnicode_Fill()}

@item 
@code{Py_UNICODE_MATCH}
@end itemize

Encoders:


@itemize *

@item 
@code{PyUnicode_Encode()}: use @code{PyUnicode_AsEncodedObject()}

@item 
@code{PyUnicode_EncodeUTF7()}

@item 
@code{PyUnicode_EncodeUTF8()}: use @ref{422,,PyUnicode_AsUTF8()} or
@ref{139a,,PyUnicode_AsUTF8String()}

@item 
@code{PyUnicode_EncodeUTF32()}

@item 
@code{PyUnicode_EncodeUTF16()}

@item 
@code{PyUnicode_EncodeUnicodeEscape()} use
@ref{139b,,PyUnicode_AsUnicodeEscapeString()}

@item 
@code{PyUnicode_EncodeRawUnicodeEscape()} use
@ref{139c,,PyUnicode_AsRawUnicodeEscapeString()}

@item 
@code{PyUnicode_EncodeLatin1()}: use @ref{139d,,PyUnicode_AsLatin1String()}

@item 
@code{PyUnicode_EncodeASCII()}: use @ref{139e,,PyUnicode_AsASCIIString()}

@item 
@code{PyUnicode_EncodeCharmap()}

@item 
@code{PyUnicode_TranslateCharmap()}

@item 
@code{PyUnicode_EncodeMBCS()}: use @ref{139f,,PyUnicode_AsMBCSString()} or
@ref{13a0,,PyUnicode_EncodeCodePage()} (with @code{CP_ACP} code_page)

@item 
@code{PyUnicode_EncodeDecimal()},
@code{PyUnicode_TransformDecimalToASCII()}
@end itemize

@node Deprecated features,,Deprecated functions and types of the C API<3>,Deprecated<13>
@anchor{whatsnew/3 3 deprecated-features}@anchor{13a1}
@subsubsection Deprecated features


The @ref{8,,array} module’s @code{'u'} format code is now deprecated and will be
removed in Python 4 together with the rest of the (@ref{3de,,Py_UNICODE}) API.

@node Porting to Python 3 3,,Deprecated<13>,What’s New In Python 3 3
@anchor{whatsnew/3 3 porting-to-python-3-3}@anchor{13a2}
@subsection Porting to Python 3.3


This section lists previously described changes and other bugfixes
that may require changes to your code.

@menu
* Porting Python code:: 
* Porting C code:: 
* Building C extensions:: 
* Command Line Switch Changes:: 

@end menu

@node Porting Python code,Porting C code,,Porting to Python 3 3
@anchor{whatsnew/3 3 porting-python-code}@anchor{1274}@anchor{whatsnew/3 3 portingpythoncode}@anchor{13a3}
@subsubsection Porting Python code



@itemize *

@item 
Hash randomization is enabled by default. Set the 
@geindex PYTHONHASHSEED
@geindex environment variable; PYTHONHASHSEED
@ref{1283,,PYTHONHASHSEED}
environment variable to @code{0} to disable hash randomization. See also the
@ref{cf9,,object.__hash__()} method.

@item 
bpo-12326@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12326}: On Linux, sys.platform doesn’t contain the major version
anymore. It is now always ‘linux’, instead of ‘linux2’ or ‘linux3’ depending
on the Linux version used to build Python. Replace sys.platform == ‘linux2’
with sys.platform.startswith(‘linux’), or directly sys.platform == ‘linux’ if
you don’t need to support older Python versions.

@item 
bpo-13847@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13847}, bpo-14180@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14180}: @ref{f4,,time} and @ref{34,,datetime}:
@ref{a87,,OverflowError} is now raised instead of @ref{2ee,,ValueError} if a
timestamp is out of range. @ref{2c2,,OSError} is now raised if C functions
@code{gmtime()} or @code{localtime()} failed.

@item 
The default finders used by import now utilize a cache of what is contained
within a specific directory. If you create a Python source file or sourceless
bytecode file, make sure to call @ref{e10,,importlib.invalidate_caches()} to clear
out the cache for the finders to notice the new file.

@item 
@ref{65b,,ImportError} now uses the full name of the module that was attempted to
be imported. Doctests that check ImportErrors’ message will need to be
updated to use the full name of the module instead of just the tail of the
name.

@item 
The `index' argument to @ref{ad7,,__import__()} now defaults to 0 instead of -1
and no longer support negative values. It was an oversight when 
@geindex Python Enhancement Proposals; PEP 328
PEP 328@footnote{https://peps.python.org/pep-0328/} was
implemented that the default value remained -1. If you need to continue to
perform a relative import followed by an absolute import, then perform the
relative import using an index of 1, followed by another import using an
index of 0. It is preferred, though, that you use
@ref{73d,,importlib.import_module()} rather than call @code{__import__()} directly.

@item 
@ref{ad7,,__import__()} no longer allows one to use an index value other than 0
for top-level modules. E.g. @code{__import__('sys', level=1)} is now an error.

@item 
Because @ref{f2d,,sys.meta_path} and @ref{122a,,sys.path_hooks} now have finders on
them by default, you will most likely want to use @ref{13a4,,list.insert()} instead
of @ref{8de,,list.append()} to add to those lists.

@item 
Because @code{None} is now inserted into @ref{7fb,,sys.path_importer_cache}, if you
are clearing out entries in the dictionary of paths that do not have a
finder, you will need to remove keys paired with values of @code{None} `and'
@code{imp.NullImporter} to be backwards-compatible. This will lead to extra
overhead on older versions of Python that re-insert @code{None} into
@code{sys.path_importer_cache} where it represents the use of implicit
finders, but semantically it should not change anything.

@item 
@code{importlib.abc.Finder} no longer specifies a @code{find_module()} abstract
method that must be implemented. If you were relying on subclasses to
implement that method, make sure to check for the method’s existence first.
You will probably want to check for @code{find_loader()} first, though, in the
case of working with @ref{1277,,path entry finders}.

@item 
@ref{ae,,pkgutil} has been converted to use @ref{7b,,importlib} internally. This
eliminates many edge cases where the old behaviour of the 
@geindex Python Enhancement Proposals; PEP 302
PEP 302@footnote{https://peps.python.org/pep-0302/} import
emulation failed to match the behaviour of the real import system. The
import emulation itself is still present, but is now deprecated. The
@ref{13a5,,pkgutil.iter_importers()} and @ref{dff,,pkgutil.walk_packages()} functions
special case the standard import hooks so they are still supported even
though they do not provide the non-standard @code{iter_modules()} method.

@item 
A longstanding RFC-compliance bug (bpo-1079@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1079}) in the parsing done by
@ref{12c4,,email.header.decode_header()} has been fixed.  Code that uses the
standard idiom to convert encoded headers into unicode
(@code{str(make_header(decode_header(h))}) will see no change, but code that
looks at the individual tuples returned by decode_header will see that
whitespace that precedes or follows @code{ASCII} sections is now included in the
@code{ASCII} section.  Code that builds headers using @code{make_header} should
also continue to work without change, since @code{make_header} continues to add
whitespace between @code{ASCII} and non-@code{ASCII} sections if it is not already
present in the input strings.

@item 
@ref{13a6,,email.utils.formataddr()} now does the correct content transfer
encoding when passed non-@code{ASCII} display names.  Any code that depended on
the previous buggy behavior that preserved the non-@code{ASCII} unicode in the
formatted output string will need to be changed (bpo-1690608@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1690608}).

@item 
@ref{13a7,,poplib.POP3.quit()} may now raise protocol errors like all other
@code{poplib} methods.  Code that assumes @code{quit} does not raise
@ref{13a8,,poplib.error_proto} errors may need to be changed if errors on @code{quit}
are encountered by a particular application (bpo-11291@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11291}).

@item 
The @code{strict} argument to @ref{13a9,,email.parser.Parser}, deprecated since
Python 2.4, has finally been removed.

@item 
The deprecated method @code{unittest.TestCase.assertSameElements} has been
removed.

@item 
The deprecated variable @code{time.accept2dyear} has been removed.

@item 
The deprecated @code{Context._clamp} attribute has been removed from the
@ref{3a,,decimal} module.  It was previously replaced by the public attribute
@ref{13aa,,clamp}.  (See bpo-8540@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8540}.)

@item 
The undocumented internal helper class @code{SSLFakeFile} has been removed
from @ref{cf,,smtplib}, since its functionality has long been provided directly
by @ref{13ab,,socket.socket.makefile()}.

@item 
Passing a negative value to @ref{8ae,,time.sleep()} on Windows now raises an
error instead of sleeping forever.  It has always raised an error on posix.

@item 
The @code{ast.__version__} constant has been removed.  If you need to
make decisions affected by the AST version, use @ref{8b1,,sys.version_info}
to make the decision.

@item 
Code that used to work around the fact that the @ref{f3,,threading} module used
factory functions by subclassing the private classes will need to change to
subclass the now-public classes.

@item 
The undocumented debugging machinery in the threading module has been
removed, simplifying the code.  This should have no effect on production
code, but is mentioned here in case any application debug frameworks were
interacting with it (bpo-13550@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13550}).
@end itemize

@node Porting C code,Building C extensions,Porting Python code,Porting to Python 3 3
@anchor{whatsnew/3 3 porting-c-code}@anchor{1250}
@subsubsection Porting C code



@itemize *

@item 
In the course of changes to the buffer API the undocumented
@code{smalltable} member of the
@ref{961,,Py_buffer} structure has been removed and the
layout of the @code{PyMemoryViewObject} has changed.

All extensions relying on the relevant parts in @code{memoryobject.h}
or @code{object.h} must be rebuilt.

@item 
Due to @ref{1244,,PEP 393}, the @ref{3de,,Py_UNICODE} type and all
functions using this type are deprecated (but will stay available for
at least five years).  If you were using low-level Unicode APIs to
construct and access unicode objects and you want to benefit of the
memory footprint reduction provided by 
@geindex Python Enhancement Proposals; PEP 393
PEP 393@footnote{https://peps.python.org/pep-0393/}, you have to convert
your code to the new @ref{13ac,,Unicode API}.

However, if you only have been using high-level functions such as
@ref{13ad,,PyUnicode_Concat()}, @ref{13ae,,PyUnicode_Join()} or
@ref{62b,,PyUnicode_FromFormat()}, your code will automatically take
advantage of the new unicode representations.

@item 
@ref{13af,,PyImport_GetMagicNumber()} now returns @code{-1} upon failure.

@item 
As a negative value for the `level' argument to @ref{ad7,,__import__()} is no
longer valid, the same now holds for @ref{13b0,,PyImport_ImportModuleLevel()}.
This also means that the value of `level' used by
@ref{13b1,,PyImport_ImportModuleEx()} is now @code{0} instead of @code{-1}.
@end itemize

@node Building C extensions,Command Line Switch Changes,Porting C code,Porting to Python 3 3
@anchor{whatsnew/3 3 building-c-extensions}@anchor{13b2}
@subsubsection Building C extensions



@itemize *

@item 
The range of possible file names for C extensions has been narrowed.
Very rarely used spellings have been suppressed: under POSIX, files
named @code{xxxmodule.so}, @code{xxxmodule.abi3.so} and
@code{xxxmodule.cpython-*.so} are no longer recognized as implementing
the @code{xxx} module.  If you had been generating such files, you have
to switch to the other spellings (i.e., remove the @code{module} string
from the file names).

(implemented in bpo-14040@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14040}.)
@end itemize

@node Command Line Switch Changes,,Building C extensions,Porting to Python 3 3
@anchor{whatsnew/3 3 command-line-switch-changes}@anchor{13b3}
@subsubsection Command Line Switch Changes



@itemize *

@item 
The -Q command-line flag and related artifacts have been removed.  Code
checking sys.flags.division_warning will need updating.

(bpo-10998@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10998}, contributed by Éric Araujo.)

@item 
When @code{python} is started with @ref{13b4,,-S}, @code{import site}
will no longer add site-specific paths to the module search paths.  In
previous versions, it did.

(bpo-11591@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11591}, contributed by Carl Meyer with editions by Éric Araujo.)
@end itemize

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node What’s New In Python 3 2,What’s New In Python 3 1,What’s New In Python 3 3,What’s New in Python
@anchor{whatsnew/3 2 doc}@anchor{13b5}@anchor{whatsnew/3 2 translation-repo}@anchor{13b6}@anchor{whatsnew/3 2 what-s-new-in-python-3-2}@anchor{13b7}
@section What’s New In Python 3.2


@*Author: 
Raymond Hettinger


@c $Id$
@c Rules for maintenance:
@c 
@c * Anyone can add text to this document.  Do not spend very much time
@c on the wording of your changes, because your text will probably
@c get rewritten.  (Note, during release candidate phase or just before
@c a beta release, please use the tracker instead -- this helps avoid
@c merge conflicts.   If you must add a suggested entry directly,
@c please put it in an XXX comment and the maintainer will take notice).
@c 
@c * The maintainer will go through Misc/NEWS periodically and add
@c changes; it's therefore more important to add your changes to
@c Misc/NEWS than to this file.
@c 
@c * This is not a complete list of every single change; completeness
@c is the purpose of Misc/NEWS.  Some changes I consider too small
@c or esoteric to include.  If such a change is added to the text,
@c I'll just remove it.  (This is another reason you shouldn't spend
@c too much time on writing your addition.)
@c 
@c * If you want to draw your new text to the attention of the
@c maintainer, add 'XXX' to the beginning of the paragraph or
@c section.
@c 
@c * It's OK to just add a fragmentary note about a change.  For
@c example: "XXX Describe the transmogrify() function added to the
@c socket module."  The maintainer will research the change and
@c write the necessary text.
@c 
@c * You can comment out your additions if you like, but it's not
@c necessary (especially when a final release is some months away).
@c 
@c * Credit the author of a patch or bugfix.   Just the name is
@c sufficient; the e-mail address isn't necessary.  It's helpful to
@c add the issue number:
@c 
@c   XXX Describe the transmogrify() function added to the socket
@c   module.
@c 
@c   (Contributed by P.Y. Developer; :issue:`12345`.)
@c 
@c This saves the maintainer the effort of going through the SVN log
@c when researching a change.

This article explains the new features in Python 3.2 as compared to 3.1.
Python 3.2 was released on February 20, 2011. It
focuses on a few highlights and gives a few examples.  For full details, see the
Misc/NEWS@footnote{https://github.com/python/cpython/blob/076ca6c3c8df3030307e548d9be792ce3c1c6eea/Misc/NEWS}
file.


@subsubheading See also


@geindex Python Enhancement Proposals; PEP 392
PEP 392@footnote{https://peps.python.org/pep-0392/} - Python 3.2 Release Schedule


@menu
* PEP 384; Defining a Stable ABI: PEP 384 Defining a Stable ABI. 
* PEP 389; Argparse Command Line Parsing Module: PEP 389 Argparse Command Line Parsing Module. 
* PEP 391; Dictionary Based Configuration for Logging: PEP 391 Dictionary Based Configuration for Logging. 
* PEP 3148; The concurrent.futures module: PEP 3148 The concurrent futures module. 
* PEP 3147; PYC Repository Directories: PEP 3147 PYC Repository Directories. 
* PEP 3149; ABI Version Tagged .so Files: PEP 3149 ABI Version Tagged so Files. 
* PEP 3333; Python Web Server Gateway Interface v1.0.1: PEP 3333 Python Web Server Gateway Interface v1 0 1. 
* Other Language Changes: Other Language Changes<12>. 
* New@comma{} Improved@comma{} and Deprecated Modules: New Improved and Deprecated Modules. 
* Multi-threading:: 
* Optimizations: Optimizations<12>. 
* Unicode:: 
* Codecs:: 
* Documentation:: 
* IDLE:: 
* Code Repository:: 
* Build and C API Changes: Build and C API Changes<5>. 
* Porting to Python 3.2: Porting to Python 3 2. 

@end menu

@node PEP 384 Defining a Stable ABI,PEP 389 Argparse Command Line Parsing Module,,What’s New In Python 3 2
@anchor{whatsnew/3 2 pep-384-defining-a-stable-abi}@anchor{13b8}
@subsection PEP 384: Defining a Stable ABI


In the past, extension modules built for one Python version were often
not usable with other Python versions. Particularly on Windows, every
feature release of Python required rebuilding all extension modules that
one wanted to use. This requirement was the result of the free access to
Python interpreter internals that extension modules could use.

With Python 3.2, an alternative approach becomes available: extension
modules which restrict themselves to a limited API (by defining
Py_LIMITED_API) cannot use many of the internals, but are constrained
to a set of API functions that are promised to be stable for several
releases. As a consequence, extension modules built for 3.2 in that
mode will also work with 3.3, 3.4, and so on. Extension modules that
make use of details of memory structures can still be built, but will
need to be recompiled for every feature release.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 384

@item PEP 384@footnote{https://peps.python.org/pep-0384/} - Defining a Stable ABI

PEP written by Martin von Löwis.
@end table


@node PEP 389 Argparse Command Line Parsing Module,PEP 391 Dictionary Based Configuration for Logging,PEP 384 Defining a Stable ABI,What’s New In Python 3 2
@anchor{whatsnew/3 2 pep-389-argparse-command-line-parsing-module}@anchor{13b9}
@subsection PEP 389: Argparse Command Line Parsing Module


A new module for command line parsing, @ref{7,,argparse}, was introduced to
overcome the limitations of @ref{a4,,optparse} which did not provide support for
positional arguments (not just options), subcommands, required options and other
common patterns of specifying and validating options.

This module has already had widespread success in the community as a
third-party module.  Being more fully featured than its predecessor, the
@ref{7,,argparse} module is now the preferred module for command-line processing.
The older module is still being kept available because of the substantial amount
of legacy code that depends on it.

Here’s an annotated example parser showing features like limiting results to a
set of choices, specifying a `metavar' in the help screen, validating that one
or more positional arguments is present, and making a required option:

@example
import argparse
parser = argparse.ArgumentParser(
            description = 'Manage servers',         # main description for help
            epilog = 'Tested on Solaris and Linux') # displayed after help
parser.add_argument('action',                       # argument name
            choices = ['deploy', 'start', 'stop'],  # three allowed values
            help = 'action on each target')         # help msg
parser.add_argument('targets',
            metavar = 'HOSTNAME',                   # var name used in help msg
            nargs = '+',                            # require one or more targets
            help = 'url for target machines')       # help msg explanation
parser.add_argument('-u', '--user',                 # -u or --user option
            required = True,                        # make it a required argument
            help = 'login as user')
@end example

Example of calling the parser on a command string:

@example
>>> cmd = 'deploy sneezy.example.com sleepy.example.com -u skycaptain'
>>> result = parser.parse_args(cmd.split())
>>> result.action
'deploy'
>>> result.targets
['sneezy.example.com', 'sleepy.example.com']
>>> result.user
'skycaptain'
@end example

Example of the parser’s automatically generated help:

@example
>>> parser.parse_args('-h'.split())

usage: manage_cloud.py [-h] -u USER
                       @{deploy,start,stop@} HOSTNAME [HOSTNAME ...]

Manage servers

positional arguments:
  @{deploy,start,stop@}   action on each target
  HOSTNAME              url for target machines

optional arguments:
  -h, --help            show this help message and exit
  -u USER, --user USER  login as user

Tested on Solaris and Linux
@end example

An especially nice @ref{7,,argparse} feature is the ability to define subparsers,
each with their own argument patterns and help displays:

@example
import argparse
parser = argparse.ArgumentParser(prog='HELM')
subparsers = parser.add_subparsers()

parser_l = subparsers.add_parser('launch', help='Launch Control')   # first subgroup
parser_l.add_argument('-m', '--missiles', action='store_true')
parser_l.add_argument('-t', '--torpedos', action='store_true')

parser_m = subparsers.add_parser('move', help='Move Vessel',        # second subgroup
                                 aliases=('steer', 'turn'))         # equivalent names
parser_m.add_argument('-c', '--course', type=int, required=True)
parser_m.add_argument('-s', '--speed', type=int, default=0)
@end example

@example
$ ./helm.py --help                         # top level help (launch and move)
$ ./helm.py launch --help                  # help for launch options
$ ./helm.py launch --missiles              # set missiles=True and torpedos=False
$ ./helm.py steer --course 180 --speed 5   # set movement parameters
@end example


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 389

@item PEP 389@footnote{https://peps.python.org/pep-0389/} - New Command Line Parsing Module

PEP written by Steven Bethard.
@end table

@ref{13ba,,Migrating optparse code to argparse} for details on the differences from @ref{a4,,optparse}.


@node PEP 391 Dictionary Based Configuration for Logging,PEP 3148 The concurrent futures module,PEP 389 Argparse Command Line Parsing Module,What’s New In Python 3 2
@anchor{whatsnew/3 2 pep-391-dictionary-based-configuration-for-logging}@anchor{13bb}
@subsection PEP 391:  Dictionary Based Configuration for Logging


The @ref{8b,,logging} module provided two kinds of configuration, one style with
function calls for each option or another style driven by an external file saved
in a @ref{26,,configparser} format.  Those options did not provide the flexibility
to create configurations from JSON or YAML files, nor did they support
incremental configuration, which is needed for specifying logger options from a
command line.

To support a more flexible style, the module now offers
@ref{13bc,,logging.config.dictConfig()} for specifying logging configuration with
plain Python dictionaries.  The configuration options include formatters,
handlers, filters, and loggers.  Here’s a working example of a configuration
dictionary:

@example
@{"version": 1,
 "formatters": @{"brief": @{"format": "%(levelname)-8s: %(name)-15s: %(message)s"@},
                "full": @{"format": "%(asctime)s %(name)-15s %(levelname)-8s %(message)s"@}
                @},
 "handlers": @{"console": @{
                   "class": "logging.StreamHandler",
                   "formatter": "brief",
                   "level": "INFO",
                   "stream": "ext://sys.stdout"@},
              "console_priority": @{
                   "class": "logging.StreamHandler",
                   "formatter": "full",
                   "level": "ERROR",
                   "stream": "ext://sys.stderr"@}
              @},
 "root": @{"level": "DEBUG", "handlers": ["console", "console_priority"]@}@}
@end example

If that dictionary is stored in a file called @code{conf.json}, it can be
loaded and called with code like this:

@example
>>> import json, logging.config
>>> with open('conf.json') as f:
...     conf = json.load(f)
...
>>> logging.config.dictConfig(conf)
>>> logging.info("Transaction completed normally")
INFO    : root           : Transaction completed normally
>>> logging.critical("Abnormal termination")
2011-02-17 11:14:36,694 root            CRITICAL Abnormal termination
@end example


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 391

@item PEP 391@footnote{https://peps.python.org/pep-0391/} - Dictionary Based Configuration for Logging

PEP written by Vinay Sajip.
@end table


@node PEP 3148 The concurrent futures module,PEP 3147 PYC Repository Directories,PEP 391 Dictionary Based Configuration for Logging,What’s New In Python 3 2
@anchor{whatsnew/3 2 pep-3148-the-concurrent-futures-module}@anchor{13bd}
@subsection PEP 3148:  The @code{concurrent.futures} module


Code for creating and managing concurrency is being collected in a new top-level
namespace, `concurrent'.  Its first member is a `futures' package which provides
a uniform high-level interface for managing threads and processes.

The design for @ref{24,,concurrent.futures} was inspired by the
`java.util.concurrent' package.  In that model, a running call and its result
are represented by a @ref{13be,,Future} object that abstracts
features common to threads, processes, and remote procedure calls.  That object
supports status checks (running or done), timeouts, cancellations, adding
callbacks, and access to results or exceptions.

The primary offering of the new module is a pair of executor classes for
launching and managing calls.  The goal of the executors is to make it easier to
use existing tools for making parallel calls. They save the effort needed to
setup a pool of resources, launch the calls, create a results queue, add
time-out handling, and limit the total number of threads, processes, or remote
procedure calls.

Ideally, each application should share a single executor across multiple
components so that process and thread limits can be centrally managed.  This
solves the design challenge that arises when each component has its own
competing strategy for resource management.

Both classes share a common interface with three methods:
@ref{c7b,,submit()} for scheduling a callable and
returning a @ref{13be,,Future} object;
@ref{1de,,map()} for scheduling many asynchronous calls
at a time, and @ref{af0,,shutdown()} for freeing
resources.  The class is a @ref{1e3,,context manager} and can be used in a
@ref{187,,with} statement to assure that resources are automatically released
when currently pending futures are done executing.

A simple of example of @ref{94e,,ThreadPoolExecutor} is a
launch of four parallel threads for copying files:

@example
import concurrent.futures, shutil
with concurrent.futures.ThreadPoolExecutor(max_workers=4) as e:
    e.submit(shutil.copy, 'src1.txt', 'dest1.txt')
    e.submit(shutil.copy, 'src2.txt', 'dest2.txt')
    e.submit(shutil.copy, 'src3.txt', 'dest3.txt')
    e.submit(shutil.copy, 'src3.txt', 'dest4.txt')
@end example


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 3148

@item PEP 3148@footnote{https://peps.python.org/pep-3148/} - Futures – Execute Computations Asynchronously

PEP written by Brian Quinlan.
@end table

@ref{13bf,,Code for Threaded Parallel URL reads}, an
example using threads to fetch multiple web pages in parallel.

@ref{13c0,,Code for computing prime numbers in parallel}, an example demonstrating
@ref{1d8,,ProcessPoolExecutor}.


@node PEP 3147 PYC Repository Directories,PEP 3149 ABI Version Tagged so Files,PEP 3148 The concurrent futures module,What’s New In Python 3 2
@anchor{whatsnew/3 2 pep-3147-pyc-repository-directories}@anchor{13c1}
@subsection PEP 3147:  PYC Repository Directories


Python’s scheme for caching bytecode in `.pyc' files did not work well in
environments with multiple Python interpreters.  If one interpreter encountered
a cached file created by another interpreter, it would recompile the source and
overwrite the cached file, thus losing the benefits of caching.

The issue of “pyc fights” has become more pronounced as it has become
commonplace for Linux distributions to ship with multiple versions of Python.
These conflicts also arise with CPython alternatives such as Unladen Swallow.

To solve this problem, Python’s import machinery has been extended to use
distinct filenames for each interpreter.  Instead of Python 3.2 and Python 3.3 and
Unladen Swallow each competing for a file called “mymodule.pyc”, they will now
look for “mymodule.cpython-32.pyc”, “mymodule.cpython-33.pyc”, and
“mymodule.unladen10.pyc”.  And to prevent all of these new files from
cluttering source directories, the `pyc' files are now collected in a
“__pycache__” directory stored under the package directory.

Aside from the filenames and target directories, the new scheme has a few
aspects that are visible to the programmer:


@itemize *

@item 
Imported modules now have a @ref{323,,__cached__} attribute which stores
the name of the actual file that was imported:

@example
>>> import collections
>>> collections.__cached__
'c:/py32/lib/__pycache__/collections.cpython-32.pyc'
@end example

@item 
The tag that is unique to each interpreter is accessible from the @code{imp}
module:

@example
>>> import imp
>>> imp.get_tag()
'cpython-32'
@end example

@item 
Scripts that try to deduce source filename from the imported file now need to
be smarter.  It is no longer sufficient to simply strip the “c” from a “.pyc”
filename.  Instead, use the new functions in the @code{imp} module:

@example
>>> imp.source_from_cache('c:/py32/lib/__pycache__/collections.cpython-32.pyc')
'c:/py32/lib/collections.py'
>>> imp.cache_from_source('c:/py32/lib/collections.py')
'c:/py32/lib/__pycache__/collections.cpython-32.pyc'
@end example

@item 
The @ref{b8,,py_compile} and @ref{21,,compileall} modules have been updated to
reflect the new naming convention and target directory.  The command-line
invocation of `compileall' has new options: @code{-i} for
specifying a list of files and directories to compile and @code{-b} which causes
bytecode files to be written to their legacy location rather than
`__pycache__'.

@item 
The @ref{7c,,importlib.abc} module has been updated with new @ref{13c2,,abstract base classes} for loading bytecode files.  The obsolete
ABCs, @code{PyLoader} and
@code{PyPycLoader}, have been deprecated (instructions on how
to stay Python 3.1 compatible are included with the documentation).
@end itemize


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 3147

@item PEP 3147@footnote{https://peps.python.org/pep-3147/} - PYC Repository Directories

PEP written by Barry Warsaw.
@end table


@node PEP 3149 ABI Version Tagged so Files,PEP 3333 Python Web Server Gateway Interface v1 0 1,PEP 3147 PYC Repository Directories,What’s New In Python 3 2
@anchor{whatsnew/3 2 pep-3149-abi-version-tagged-so-files}@anchor{13c3}
@subsection PEP 3149: ABI Version Tagged .so Files


The PYC repository directory allows multiple bytecode cache files to be
co-located.  This PEP implements a similar mechanism for shared object files by
giving them a common directory and distinct names for each version.

The common directory is “pyshared” and the file names are made distinct by
identifying the Python implementation (such as CPython, PyPy, Jython, etc.), the
major and minor version numbers, and optional build flags (such as “d” for
debug, “m” for pymalloc, “u” for wide-unicode).  For an arbitrary package “foo”,
you may see these files when the distribution package is installed:

@example
/usr/share/pyshared/foo.cpython-32m.so
/usr/share/pyshared/foo.cpython-33md.so
@end example

In Python itself, the tags are accessible from functions in the @ref{e1,,sysconfig}
module:

@example
>>> import sysconfig
>>> sysconfig.get_config_var('SOABI')       # find the version tag
'cpython-32mu'
>>> sysconfig.get_config_var('EXT_SUFFIX')  # find the full filename extension
'.cpython-32mu.so'
@end example


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 3149

@item PEP 3149@footnote{https://peps.python.org/pep-3149/} - ABI Version Tagged .so Files

PEP written by Barry Warsaw.
@end table


@node PEP 3333 Python Web Server Gateway Interface v1 0 1,Other Language Changes<12>,PEP 3149 ABI Version Tagged so Files,What’s New In Python 3 2
@anchor{whatsnew/3 2 pep-3333-python-web-server-gateway-interface-v1-0-1}@anchor{13c4}
@subsection PEP 3333: Python Web Server Gateway Interface v1.0.1


This informational PEP clarifies how bytes/text issues are to be handled by the
WSGI protocol.  The challenge is that string handling in Python 3 is most
conveniently handled with the @ref{16a,,str} type even though the HTTP protocol
is itself bytes oriented.

The PEP differentiates so-called `native strings' that are used for
request/response headers and metadata versus `byte strings' which are used for
the bodies of requests and responses.

The `native strings' are always of type @ref{16a,,str} but are restricted to code
points between `U+0000' through `U+00FF' which are translatable to bytes using
`Latin-1' encoding.  These strings are used for the keys and values in the
environment dictionary and for response headers and statuses in the
@code{start_response()} function.  They must follow 
@geindex RFC; RFC 2616
RFC 2616@footnote{https://datatracker.ietf.org/doc/html/rfc2616.html} with respect to
encoding. That is, they must either be `ISO-8859-1' characters or use
@geindex RFC; RFC 2047
RFC 2047@footnote{https://datatracker.ietf.org/doc/html/rfc2047.html} MIME encoding.

For developers porting WSGI applications from Python 2, here are the salient
points:


@itemize *

@item 
If the app already used strings for headers in Python 2, no change is needed.

@item 
If instead, the app encoded output headers or decoded input headers, then the
headers will need to be re-encoded to Latin-1.  For example, an output header
encoded in utf-8 was using @code{h.encode('utf-8')} now needs to convert from
bytes to native strings using @code{h.encode('utf-8').decode('latin-1')}.

@item 
Values yielded by an application or sent using the @code{write()} method
must be byte strings.  The @code{start_response()} function and environ
must use native strings.  The two cannot be mixed.
@end itemize

For server implementers writing CGI-to-WSGI pathways or other CGI-style
protocols, the users must to be able access the environment using native strings
even though the underlying platform may have a different convention.  To bridge
this gap, the @ref{11f,,wsgiref} module has a new function,
@ref{13c5,,wsgiref.handlers.read_environ()} for transcoding CGI variables from
@ref{25b,,os.environ} into native strings and returning a new dictionary.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 3333

@item PEP 3333@footnote{https://peps.python.org/pep-3333/} - Python Web Server Gateway Interface v1.0.1

PEP written by Phillip Eby.
@end table


@node Other Language Changes<12>,New Improved and Deprecated Modules,PEP 3333 Python Web Server Gateway Interface v1 0 1,What’s New In Python 3 2
@anchor{whatsnew/3 2 other-language-changes}@anchor{13c6}
@subsection Other Language Changes


Some smaller changes made to the core Python language are:


@itemize *

@item 
String formatting for @ref{19a,,format()} and @ref{834,,str.format()} gained new
capabilities for the format character `#'.  Previously, for integers in
binary, octal, or hexadecimal, it caused the output to be prefixed with ‘0b’,
‘0o’, or ‘0x’ respectively.  Now it can also handle floats, complex, and
Decimal, causing the output to always have a decimal point even when no digits
follow it.

@example
>>> format(20, '#o')
'0o24'
>>> format(12.34, '#5.0f')
'  12.'
@end example

(Suggested by Mark Dickinson and implemented by Eric Smith in bpo-7094@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7094}.)

@item 
There is also a new @ref{fdd,,str.format_map()} method that extends the
capabilities of the existing @ref{834,,str.format()} method by accepting arbitrary
@ref{13c7,,mapping} objects.  This new method makes it possible to use string
formatting with any of Python’s many dictionary-like objects such as
@ref{13c8,,defaultdict}, @ref{11a1,,Shelf},
@ref{4df,,ConfigParser}, or @ref{35,,dbm}.  It is also useful with
custom @ref{184,,dict} subclasses that normalize keys before look-up or that
supply a @ref{13c9,,__missing__()} method for unknown keys:

@example
>>> import shelve
>>> d = shelve.open('tmp.shl')
>>> 'The @{project_name@} status is @{status@} as of @{date@}'.format_map(d)
'The testing project status is green as of February 15, 2011'

>>> class LowerCasedDict(dict):
...     def __getitem__(self, key):
...         return dict.__getitem__(self, key.lower())
...
>>> lcd = LowerCasedDict(part='widgets', quantity=10)
>>> 'There are @{QUANTITY@} @{Part@} in stock'.format_map(lcd)
'There are 10 widgets in stock'

>>> class PlaceholderDict(dict):
...     def __missing__(self, key):
...         return '<@{@}>'.format(key)
...
>>> 'Hello @{name@}, welcome to @{location@}'.format_map(PlaceholderDict())
'Hello <name>, welcome to <location>'
@end example
@end itemize

@quotation

(Suggested by Raymond Hettinger and implemented by Eric Smith in
bpo-6081@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6081}.)
@end quotation


@itemize *

@item 
The interpreter can now be started with a quiet option, @code{-q}, to prevent
the copyright and version information from being displayed in the interactive
mode.  The option can be introspected using the @ref{89e,,sys.flags} attribute:

@example
$ python -q
>>> sys.flags
sys.flags(debug=0, division_warning=0, inspect=0, interactive=0,
optimize=0, dont_write_bytecode=0, no_user_site=0, no_site=0,
ignore_environment=0, verbose=0, bytes_warning=0, quiet=1)
@end example

(Contributed by Marcin Wojdyr in bpo-1772833@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1772833}).

@item 
The @ref{6fa,,hasattr()} function works by calling @ref{dd0,,getattr()} and detecting
whether an exception is raised.  This technique allows it to detect methods
created dynamically by @ref{6fb,,__getattr__()} or @ref{dd1,,__getattribute__()} which
would otherwise be absent from the class dictionary.  Formerly, `hasattr'
would catch any exception, possibly masking genuine errors.  Now, `hasattr'
has been tightened to only catch @ref{5f0,,AttributeError} and let other
exceptions pass through:

@example
>>> class A:
...     @@property
...     def f(self):
...         return 1 // 0
...
>>> a = A()
>>> hasattr(a, 'f')
Traceback (most recent call last):
  ...
ZeroDivisionError: integer division or modulo by zero
@end example

(Discovered by Yury Selivanov and fixed by Benjamin Peterson; bpo-9666@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9666}.)

@item 
The @ref{16a,,str()} of a float or complex number is now the same as its
@ref{1c3,,repr()}. Previously, the @code{str()} form was shorter but that just
caused confusion and is no longer needed now that the shortest possible
@code{repr()} is displayed by default:

@example
>>> import math
>>> repr(math.pi)
'3.141592653589793'
>>> str(math.pi)
'3.141592653589793'
@end example

(Proposed and implemented by Mark Dickinson; bpo-9337@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9337}.)

@item 
@ref{166,,memoryview} objects now have a @ref{13ca,,release()} method
and they also now support the context management protocol.  This allows timely
release of any resources that were acquired when requesting a buffer from the
original object.

@example
>>> with memoryview(b'abcdefgh') as v:
...     print(v.tolist())
[97, 98, 99, 100, 101, 102, 103, 104]
@end example

(Added by Antoine Pitrou; bpo-9757@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9757}.)

@item 
Previously it was illegal to delete a name from the local namespace if it
occurs as a free variable in a nested block:

@example
def outer(x):
    def inner():
        return x
    inner()
    del x
@end example

This is now allowed.  Remember that the target of an @ref{1ac,,except} clause
is cleared, so this code which used to work with Python 2.6, raised a
@ref{18f,,SyntaxError} with Python 3.1 and now works again:

@example
def f():
    def print_error():
        print(e)
    try:
        something
    except Exception as e:
        print_error()
        # implicit "del e" here
@end example

(See bpo-4617@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4617}.)

@item 
@ref{13cb,,Struct sequence types} are now subclasses of tuple.
This means that C structures like those returned by @ref{26f,,os.stat()},
@ref{13cc,,time.gmtime()}, and @ref{8b1,,sys.version_info} now work like a
@ref{85f,,named tuple} and now work with functions and methods that
expect a tuple as an argument.  This is a big step forward in making the C
structures as flexible as their pure Python counterparts:

@example
>>> import sys
>>> isinstance(sys.version_info, tuple)
True
>>> 'Version %d.%d.%d %s(%d)' % sys.version_info
'Version 3.2.0 final(0)'
@end example

(Suggested by Arfrever Frehtes Taifersar Arahesis and implemented
by Benjamin Peterson in bpo-8413@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8413}.)

@item 
Warnings are now easier to control using the 
@geindex PYTHONWARNINGS
@geindex environment variable; PYTHONWARNINGS
@ref{da9,,PYTHONWARNINGS}
environment variable as an alternative to using @code{-W} at the command line:

@example
$ export PYTHONWARNINGS='ignore::RuntimeWarning::,once::UnicodeWarning::'
@end example

(Suggested by Barry Warsaw and implemented by Philip Jenvey in bpo-7301@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7301}.)

@item 
A new warning category, @ref{54d,,ResourceWarning}, has been added.  It is
emitted when potential issues with resource consumption or cleanup
are detected.  It is silenced by default in normal release builds but
can be enabled through the means provided by the @ref{119,,warnings}
module, or on the command line.

A @ref{54d,,ResourceWarning} is issued at interpreter shutdown if the
@ref{13cd,,gc.garbage} list isn’t empty, and if @ref{13ce,,gc.DEBUG_UNCOLLECTABLE} is
set, all uncollectable objects are printed.  This is meant to make the
programmer aware that their code contains object finalization issues.

A @ref{54d,,ResourceWarning} is also issued when a @ref{13cf,,file object} is destroyed
without having been explicitly closed.  While the deallocator for such
object ensures it closes the underlying operating system resource
(usually, a file descriptor), the delay in deallocating the object could
produce various issues, especially under Windows.  Here is an example
of enabling the warning from the command line:

@example
$ python -q -Wdefault
>>> f = open("foo", "wb")
>>> del f
__main__:1: ResourceWarning: unclosed file <_io.BufferedWriter name='foo'>
@end example

(Added by Antoine Pitrou and Georg Brandl in bpo-10093@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10093} and bpo-477863@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=477863}.)

@item 
@ref{b43,,range} objects now support `index' and `count' methods. This is part
of an effort to make more objects fully implement the
@ref{13d0,,collections.Sequence} @ref{13c2,,abstract base class}.  As a result, the
language will have a more uniform API.  In addition, @code{range} objects
now support slicing and negative indices, even with values larger than
@ref{13d1,,sys.maxsize}.  This makes `range' more interoperable with lists:

@example
>>> range(0, 100, 2).count(10)
1
>>> range(0, 100, 2).index(10)
5
>>> range(0, 100, 2)[5]
10
>>> range(0, 100, 2)[0:5]
range(0, 10, 2)
@end example

(Contributed by Daniel Stutzbach in bpo-9213@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9213}, by Alexander Belopolsky
in bpo-2690@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2690}, and by Nick Coghlan in bpo-10889@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10889}.)

@item 
The @ref{13d2,,callable()} builtin function from Py2.x was resurrected.  It provides
a concise, readable alternative to using an @ref{13c2,,abstract base class} in an
expression like @code{isinstance(x, collections.Callable)}:

@example
>>> callable(max)
True
>>> callable(20)
False
@end example

(See bpo-10518@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10518}.)

@item 
Python’s import mechanism can now load modules installed in directories with
non-ASCII characters in the path name.  This solved an aggravating problem
with home directories for users with non-ASCII characters in their usernames.
@end itemize

@quotation

(Required extensive work by Victor Stinner in bpo-9425@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9425}.)
@end quotation

@node New Improved and Deprecated Modules,Multi-threading,Other Language Changes<12>,What’s New In Python 3 2
@anchor{whatsnew/3 2 new-improved-and-deprecated-modules}@anchor{13d3}
@subsection New, Improved, and Deprecated Modules


Python’s standard library has undergone significant maintenance efforts and
quality improvements.

The biggest news for Python 3.2 is that the @ref{3f,,email} package, @ref{8f,,mailbox}
module, and @code{nntplib} modules now work correctly with the bytes/text model
in Python 3.  For the first time, there is correct handling of messages with
mixed encodings.

Throughout the standard library, there has been more careful attention to
encodings and text versus bytes issues.  In particular, interactions with the
operating system are now better able to exchange non-ASCII data using the
Windows MBCS encoding, locale-aware encodings, or UTF-8.

Another significant win is the addition of substantially better support for
`SSL' connections and security certificates.

In addition, more classes now implement a @ref{1e3,,context manager} to support
convenient and reliable resource clean-up using a @ref{187,,with} statement.

@menu
* email: email<7>. 
* elementtree:: 
* functools: functools<8>. 
* itertools: itertools<8>. 
* collections: collections<8>. 
* threading: threading<10>. 
* datetime and time:: 
* math: math<11>. 
* abc: abc<3>. 
* io: io<9>. 
* reprlib:: 
* logging: logging<8>. 
* csv: csv<4>. 
* contextlib: contextlib<8>. 
* decimal and fractions:: 
* ftp:: 
* popen:: 
* select: select<3>. 
* gzip and zipfile:: 
* tarfile: tarfile<10>. 
* hashlib: hashlib<7>. 
* ast: ast<7>. 
* os: os<14>. 
* shutil: shutil<8>. 
* sqlite3: sqlite3<12>. 
* html: html<3>. 
* socket: socket<12>. 
* ssl: ssl<13>. 
* nntp:: 
* certificates:: 
* imaplib: imaplib<5>. 
* http.client: http client<4>. 
* unittest: unittest<12>. 
* random: random<5>. 
* poplib: poplib<4>. 
* asyncore: asyncore<2>. 
* tempfile: tempfile<5>. 
* inspect: inspect<11>. 
* pydoc: pydoc<7>. 
* dis: dis<6>. 
* dbm: dbm<7>. 
* ctypes: ctypes<4>. 
* site: site<4>. 
* sysconfig: sysconfig<4>. 
* pdb: pdb<10>. 
* configparser: configparser<6>. 
* urllib.parse: urllib parse<6>. 
* mailbox:: 
* turtledemo:: 

@end menu

@node email<7>,elementtree,,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 email}@anchor{13d4}
@subsubsection email


The usability of the @ref{3f,,email} package in Python 3 has been mostly fixed by
the extensive efforts of R. David Murray.  The problem was that emails are
typically read and stored in the form of @ref{193,,bytes} rather than @ref{16a,,str}
text, and they may contain multiple encodings within a single email.  So, the
email package had to be extended to parse and generate email messages in bytes
format.


@itemize *

@item 
New functions @ref{13d5,,message_from_bytes()} and
@ref{13d6,,message_from_binary_file()}, and new classes
@ref{13d7,,BytesFeedParser} and @ref{13d8,,BytesParser}
allow binary message data to be parsed into model objects.

@item 
Given bytes input to the model, @ref{13d9,,get_payload()}
will by default decode a message body that has a
@code{Content-Transfer-Encoding} of `8bit' using the charset
specified in the MIME headers and return the resulting string.

@item 
Given bytes input to the model, @ref{13da,,Generator} will
convert message bodies that have a @code{Content-Transfer-Encoding} of
`8bit' to instead have a `7bit' @code{Content-Transfer-Encoding}.

Headers with unencoded non-ASCII bytes are deemed to be 
@geindex RFC; RFC 2047
RFC 2047@footnote{https://datatracker.ietf.org/doc/html/rfc2047.html}-encoded
using the `unknown-8bit' character set.

@item 
A new class @ref{13db,,BytesGenerator} produces bytes as output,
preserving any unchanged non-ASCII data that was present in the input used to
build the model, including message bodies with a
@code{Content-Transfer-Encoding} of `8bit'.

@item 
The @ref{cf,,smtplib} @ref{b2d,,SMTP} class now accepts a byte string
for the `msg' argument to the @ref{105f,,sendmail()} method,
and a new method, @ref{1060,,send_message()} accepts a
@ref{581,,Message} object and can optionally obtain the
`from_addr' and `to_addrs' addresses directly from the object.
@end itemize

(Proposed and implemented by R. David Murray, bpo-4661@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4661} and bpo-10321@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10321}.)

@node elementtree,functools<8>,email<7>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 elementtree}@anchor{13dc}
@subsubsection elementtree


The @ref{12c,,xml.etree.ElementTree} package and its @code{xml.etree.cElementTree}
counterpart have been updated to version 1.3.

Several new and useful functions and methods have been added:


@itemize *

@item 
@ref{13dd,,xml.etree.ElementTree.fromstringlist()} which builds an XML document
from a sequence of fragments

@item 
@ref{13de,,xml.etree.ElementTree.register_namespace()} for registering a global
namespace prefix

@item 
@ref{11fc,,xml.etree.ElementTree.tostringlist()} for string representation
including all sublists

@item 
@ref{13df,,xml.etree.ElementTree.Element.extend()} for appending a sequence of zero
or more elements

@item 
@ref{13e0,,xml.etree.ElementTree.Element.iterfind()} searches an element and
subelements

@item 
@ref{13e1,,xml.etree.ElementTree.Element.itertext()} creates a text iterator over
an element and its subelements

@item 
@ref{13e2,,xml.etree.ElementTree.TreeBuilder.end()} closes the current element

@item 
@ref{c94,,xml.etree.ElementTree.TreeBuilder.doctype()} handles a doctype
declaration
@end itemize

Two methods have been deprecated:


@itemize *

@item 
@code{xml.etree.ElementTree.getchildren()} use @code{list(elem)} instead.

@item 
@code{xml.etree.ElementTree.getiterator()} use @code{Element.iter} instead.
@end itemize

For details of the update, see Introducing ElementTree@footnote{https://web.archive.org/web/20200703234532/http://effbot.org/zone/elementtree-13-intro.htm}
on Fredrik Lundh’s website.

(Contributed by Florent Xicluna and Fredrik Lundh, bpo-6472@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6472}.)

@node functools<8>,itertools<8>,elementtree,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 functools}@anchor{13e3}
@subsubsection functools



@itemize *

@item 
The @ref{63,,functools} module includes a new decorator for caching function
calls.  @ref{be8,,functools.lru_cache()} can save repeated queries to an external
resource whenever the results are expected to be the same.

For example, adding a caching decorator to a database query function can save
database accesses for popular searches:

@example
>>> import functools
>>> @@functools.lru_cache(maxsize=300)
... def get_phone_number(name):
...     c = conn.cursor()
...     c.execute('SELECT phonenumber FROM phonelist WHERE name=?', (name,))
...     return c.fetchone()[0]
@end example

@example
>>> for name in user_requests:
...     get_phone_number(name)        # cached lookup
@end example

To help with choosing an effective cache size, the wrapped function is
instrumented for tracking cache statistics:

@example
>>> get_phone_number.cache_info()
CacheInfo(hits=4805, misses=980, maxsize=300, currsize=300)
@end example

If the phonelist table gets updated, the outdated contents of the cache can be
cleared with:

@example
>>> get_phone_number.cache_clear()
@end example

(Contributed by Raymond Hettinger and incorporating design ideas from Jim
Baker, Miki Tebeka, and Nick Coghlan; see recipe 498245@footnote{https://code.activestate.com/recipes/498245-lru-and-lfu-cache-decorators/}, recipe 577479@footnote{https://code.activestate.com/recipes/577479-simple-caching-decorator/}, bpo-10586@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10586}, and
bpo-10593@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10593}.)

@item 
The @ref{1163,,functools.wraps()} decorator now adds a @code{__wrapped__} attribute
pointing to the original callable function.  This allows wrapped functions to
be introspected.  It also copies @ref{13e4,,__annotations__} if
defined.  And now it also gracefully skips over missing attributes such as
@ref{13e5,,__doc__} which
might not be defined for the wrapped callable.

In the above example, the cache can be removed by recovering the original
function:

@example
>>> get_phone_number = get_phone_number.__wrapped__    # uncached function
@end example

(By Nick Coghlan and Terrence Cole; bpo-9567@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9567}, bpo-3445@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3445}, and
bpo-8814@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8814}.)

@item 
To help write classes with rich comparison methods, a new decorator
@ref{1148,,functools.total_ordering()} will use existing equality and inequality
methods to fill in the remaining methods.

For example, supplying `__eq__' and `__lt__' will enable
@ref{1148,,total_ordering()} to fill-in `__le__', `__gt__' and `__ge__':

@example
@@total_ordering
class Student:
    def __eq__(self, other):
        return ((self.lastname.lower(), self.firstname.lower()) ==
                (other.lastname.lower(), other.firstname.lower()))

    def __lt__(self, other):
        return ((self.lastname.lower(), self.firstname.lower()) <
                (other.lastname.lower(), other.firstname.lower()))
@end example

With the `total_ordering' decorator, the remaining comparison methods
are filled in automatically.

(Contributed by Raymond Hettinger.)

@item 
To aid in porting programs from Python 2, the @ref{13e6,,functools.cmp_to_key()}
function converts an old-style comparison function to
modern @ref{100c,,key function}:

@example
>>> # locale-aware sort order
>>> sorted(iterable, key=cmp_to_key(locale.strcoll))
@end example

For sorting examples and a brief sorting tutorial, see the Sorting HowTo@footnote{https://wiki.python.org/moin/HowTo/Sorting/} tutorial.

(Contributed by Raymond Hettinger.)
@end itemize

@node itertools<8>,collections<8>,functools<8>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 itertools}@anchor{13e7}
@subsubsection itertools



@itemize *

@item 
The @ref{85,,itertools} module has a new @ref{bf6,,accumulate()} function
modeled on APL’s `scan' operator and Numpy’s `accumulate' function:

@example
>>> from itertools import accumulate
>>> list(accumulate([8, 2, 50]))
[8, 10, 60]
@end example

@example
>>> prob_dist = [0.1, 0.4, 0.2, 0.3]
>>> list(accumulate(prob_dist))      # cumulative probability distribution
[0.1, 0.5, 0.7, 1.0]
@end example

For an example using @ref{bf6,,accumulate()}, see the @ref{13e8,,examples for the random module}.

(Contributed by Raymond Hettinger and incorporating design suggestions
from Mark Dickinson.)
@end itemize

@node collections<8>,threading<10>,itertools<8>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 collections}@anchor{13e9}
@subsubsection collections



@itemize *

@item 
The @ref{129d,,collections.Counter} class now has two forms of in-place
subtraction, the existing `-=' operator for saturating subtraction@footnote{https://en.wikipedia.org/wiki/Saturation_arithmetic} and the new
@ref{13ea,,subtract()} method for regular subtraction.  The
former is suitable for multisets@footnote{https://en.wikipedia.org/wiki/Multiset}
which only have positive counts, and the latter is more suitable for use cases
that allow negative counts:

@example
>>> from collections import Counter
>>> tally = Counter(dogs=5, cats=3)
>>> tally -= Counter(dogs=2, cats=8)    # saturating subtraction
>>> tally
Counter(@{'dogs': 3@})
@end example

@example
>>> tally = Counter(dogs=5, cats=3)
>>> tally.subtract(dogs=2, cats=8)      # regular subtraction
>>> tally
Counter(@{'dogs': 3, 'cats': -5@})
@end example

(Contributed by Raymond Hettinger.)

@item 
The @ref{7f4,,collections.OrderedDict} class has a new method
@ref{13eb,,move_to_end()} which takes an existing key and
moves it to either the first or last position in the ordered sequence.

The default is to move an item to the last position.  This is equivalent of
renewing an entry with @code{od[k] = od.pop(k)}.

A fast move-to-end operation is useful for resequencing entries.  For example,
an ordered dictionary can be used to track order of access by aging entries
from the oldest to the most recently accessed.

@example
>>> from collections import OrderedDict
>>> d = OrderedDict.fromkeys(['a', 'b', 'X', 'd', 'e'])
>>> list(d)
['a', 'b', 'X', 'd', 'e']
>>> d.move_to_end('X')
>>> list(d)
['a', 'b', 'd', 'e', 'X']
@end example

(Contributed by Raymond Hettinger.)

@item 
The @ref{7f5,,collections.deque} class grew two new methods
@ref{13ec,,count()} and @ref{13ed,,reverse()} that
make them more substitutable for @ref{24f,,list} objects:

@example
>>> from collections import deque
>>> d = deque('simsalabim')
>>> d.count('s')
2
>>> d.reverse()
>>> d
deque(['m', 'i', 'b', 'a', 'l', 'a', 's', 'm', 'i', 's'])
@end example

(Contributed by Raymond Hettinger.)
@end itemize

@node threading<10>,datetime and time,collections<8>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 threading}@anchor{13ee}
@subsubsection threading


The @ref{f3,,threading} module has a new @ref{13ef,,Barrier}
synchronization class for making multiple threads wait until all of them have
reached a common barrier point.  Barriers are useful for making sure that a task
with multiple preconditions does not run until all of the predecessor tasks are
complete.

Barriers can work with an arbitrary number of threads.  This is a generalization
of a Rendezvous@footnote{https://en.wikipedia.org/wiki/Synchronous_rendezvous} which
is defined for only two threads.

Implemented as a two-phase cyclic barrier, @ref{13ef,,Barrier} objects
are suitable for use in loops.  The separate `filling' and `draining' phases
assure that all threads get released (drained) before any one of them can loop
back and re-enter the barrier.  The barrier fully resets after each cycle.

Example of using barriers:

@example
from threading import Barrier, Thread

def get_votes(site):
    ballots = conduct_election(site)
    all_polls_closed.wait()        # do not count until all polls are closed
    totals = summarize(ballots)
    publish(site, totals)

all_polls_closed = Barrier(len(sites))
for site in sites:
    Thread(target=get_votes, args=(site,)).start()
@end example

In this example, the barrier enforces a rule that votes cannot be counted at any
polling site until all polls are closed.  Notice how a solution with a barrier
is similar to one with @ref{13f0,,threading.Thread.join()}, but the threads stay alive
and continue to do work (summarizing ballots) after the barrier point is
crossed.

If any of the predecessor tasks can hang or be delayed, a barrier can be created
with an optional `timeout' parameter.  Then if the timeout period elapses before
all the predecessor tasks reach the barrier point, all waiting threads are
released and a @ref{13f1,,BrokenBarrierError} exception is raised:

@example
def get_votes(site):
    ballots = conduct_election(site)
    try:
        all_polls_closed.wait(timeout=midnight - time.now())
    except BrokenBarrierError:
        lockbox = seal_ballots(ballots)
        queue.put(lockbox)
    else:
        totals = summarize(ballots)
        publish(site, totals)
@end example

In this example, the barrier enforces a more robust rule.  If some election
sites do not finish before midnight, the barrier times-out and the ballots are
sealed and deposited in a queue for later handling.

See Barrier Synchronization Patterns@footnote{https://osl.cs.illinois.edu/media/papers/karmani-2009-barrier_synchronization_pattern.pdf}
for more examples of how barriers can be used in parallel computing.  Also, there is
a simple but thorough explanation of barriers in The Little Book of Semaphores@footnote{https://greenteapress.com/semaphores/LittleBookOfSemaphores.pdf}, `section 3.6'.

(Contributed by Kristján Valur Jónsson with an API review by Jeffrey Yasskin in
bpo-8777@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8777}.)

@node datetime and time,math<11>,threading<10>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 datetime-and-time}@anchor{13f2}
@subsubsection datetime and time



@itemize *

@item 
The @ref{34,,datetime} module has a new type @ref{12cb,,timezone} that
implements the @ref{7f7,,tzinfo} interface by returning a fixed UTC
offset and timezone name. This makes it easier to create timezone-aware
datetime objects:

@example
>>> import datetime as dt

>>> dt.datetime.now(dt.timezone.utc)
datetime.datetime(2010, 12, 8, 21, 4, 2, 923754, tzinfo=datetime.timezone.utc)

>>> dt.datetime.strptime("01/01/2000 12:00 +0000", "%m/%d/%Y %H:%M %z")
datetime.datetime(2000, 1, 1, 12, 0, tzinfo=datetime.timezone.utc)
@end example

@item 
Also, @ref{bc9,,timedelta} objects can now be multiplied by
@ref{197,,float} and divided by @code{float} and @ref{19c,,int} objects.
And @code{timedelta} objects can now divide one another.

@item 
The @ref{e95,,datetime.date.strftime()} method is no longer restricted to years
after 1900.  The new supported year range is from 1000 to 9999 inclusive.

@item 
Whenever a two-digit year is used in a time tuple, the interpretation has been
governed by @code{time.accept2dyear}.  The default is @code{True} which means that
for a two-digit year, the century is guessed according to the POSIX rules
governing the @code{%y} strptime format.

Starting with Py3.2, use of the century guessing heuristic will emit a
@ref{1a4,,DeprecationWarning}.  Instead, it is recommended that
@code{time.accept2dyear} be set to @code{False} so that large date ranges
can be used without guesswork:

@example
>>> import time, warnings
>>> warnings.resetwarnings()      # remove the default warning filters

>>> time.accept2dyear = True      # guess whether 11 means 11 or 2011
>>> time.asctime((11, 1, 1, 12, 34, 56, 4, 1, 0))
Warning (from warnings module):
  ...
DeprecationWarning: Century info guessed for a 2-digit year.
'Fri Jan  1 12:34:56 2011'

>>> time.accept2dyear = False     # use the full range of allowable dates
>>> time.asctime((11, 1, 1, 12, 34, 56, 4, 1, 0))
'Fri Jan  1 12:34:56 11'
@end example

Several functions now have significantly expanded date ranges.  When
@code{time.accept2dyear} is false, the @ref{13f3,,time.asctime()} function will
accept any year that fits in a C int, while the @ref{13f4,,time.mktime()} and
@ref{13f5,,time.strftime()} functions will accept the full range supported by the
corresponding operating system functions.
@end itemize

(Contributed by Alexander Belopolsky and Victor Stinner in bpo-1289118@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1289118},
bpo-5094@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5094}, bpo-6641@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6641}, bpo-2706@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2706}, bpo-1777412@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1777412}, bpo-8013@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8013},
and bpo-10827@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10827}.)

@c XXX https://bugs.python.org/issue?%40search_text=datetime&%40sort=-activity

@node math<11>,abc<3>,datetime and time,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 math}@anchor{13f6}
@subsubsection math


The @ref{92,,math} module has been updated with six new functions inspired by the
C99 standard.

The @ref{13f7,,isfinite()} function provides a reliable and fast way to detect
special values.  It returns @code{True} for regular numbers and @code{False} for `Nan' or
`Infinity':

@example
>>> from math import isfinite
>>> [isfinite(x) for x in (123, 4.56, float('Nan'), float('Inf'))]
[True, True, False, False]
@end example

The @ref{13f8,,expm1()} function computes @code{e**x-1} for small values of `x'
without incurring the loss of precision that usually accompanies the subtraction
of nearly equal quantities:

@example
>>> from math import expm1
>>> expm1(0.013671875)   # more accurate way to compute e**x-1 for a small x
0.013765762467652909
@end example

The @ref{dd9,,erf()} function computes a probability integral or Gaussian error function@footnote{https://en.wikipedia.org/wiki/Error_function}.  The
complementary error function, @ref{dda,,erfc()}, is @code{1 - erf(x)}:

@example
>>> from math import erf, erfc, sqrt
>>> erf(1.0/sqrt(2.0))   # portion of normal distribution within 1 standard deviation
0.682689492137086
>>> erfc(1.0/sqrt(2.0))  # portion of normal distribution outside 1 standard deviation
0.31731050786291404
>>> erf(1.0/sqrt(2.0)) + erfc(1.0/sqrt(2.0))
1.0
@end example

The @ref{13f9,,gamma()} function is a continuous extension of the factorial
function.  See @indicateurl{https://en.wikipedia.org/wiki/Gamma_function} for details.  Because
the function is related to factorials, it grows large even for small values of
`x', so there is also a @ref{13fa,,lgamma()} function for computing the natural
logarithm of the gamma function:

@example
>>> from math import gamma, lgamma
>>> gamma(7.0)           # six factorial
720.0
>>> lgamma(801.0)        # log(800 factorial)
4551.950730698041
@end example

(Contributed by Mark Dickinson.)

@node abc<3>,io<9>,math<11>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 abc}@anchor{13fb}
@subsubsection abc


The @ref{4,,abc} module now supports @ref{1292,,abstractclassmethod()} and
@ref{1293,,abstractstaticmethod()}.

These tools make it possible to define an @ref{13c2,,abstract base class} that
requires a particular @ref{48f,,classmethod()} or @ref{451,,staticmethod()} to be
implemented:

@example
class Temperature(metaclass=abc.ABCMeta):
    @@abc.abstractclassmethod
    def from_fahrenheit(cls, t):
        ...
    @@abc.abstractclassmethod
    def from_celsius(cls, t):
        ...
@end example

(Patch submitted by Daniel Urban; bpo-5867@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5867}.)

@node io<9>,reprlib,abc<3>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 io}@anchor{13fc}
@subsubsection io


The @ref{10aa,,io.BytesIO} has a new method, @ref{13fd,,getbuffer()}, which
provides functionality similar to @ref{166,,memoryview()}.  It creates an editable
view of the data without making a copy.  The buffer’s random access and support
for slice notation are well-suited to in-place editing:

@example
>>> REC_LEN, LOC_START, LOC_LEN = 34, 7, 11

>>> def change_location(buffer, record_number, location):
...     start = record_number * REC_LEN + LOC_START
...     buffer[start: start+LOC_LEN] = location

>>> import io

>>> byte_stream = io.BytesIO(
...     b'G3805  storeroom  Main chassis    '
...     b'X7899  shipping   Reserve cog     '
...     b'L6988  receiving  Primary sprocket'
... )
>>> buffer = byte_stream.getbuffer()
>>> change_location(buffer, 1, b'warehouse  ')
>>> change_location(buffer, 0, b'showroom   ')
>>> print(byte_stream.getvalue())
b'G3805  showroom   Main chassis    '
b'X7899  warehouse  Reserve cog     '
b'L6988  receiving  Primary sprocket'
@end example

(Contributed by Antoine Pitrou in bpo-5506@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5506}.)

@node reprlib,logging<8>,io<9>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 reprlib}@anchor{13fe}
@subsubsection reprlib


When writing a @ref{830,,__repr__()} method for a custom container, it is easy to
forget to handle the case where a member refers back to the container itself.
Python’s builtin objects such as @ref{24f,,list} and @ref{185,,set} handle
self-reference by displaying “…” in the recursive part of the representation
string.

To help write such @ref{830,,__repr__()} methods, the @ref{c0,,reprlib} module has a new
decorator, @ref{13ff,,recursive_repr()}, for detecting recursive calls to
@code{__repr__()} and substituting a placeholder string instead:

@example
>>> class MyList(list):
...     @@recursive_repr()
...     def __repr__(self):
...         return '<' + '|'.join(map(repr, self)) + '>'
...
>>> m = MyList('abc')
>>> m.append(m)
>>> m.append('x')
>>> print(m)
<'a'|'b'|'c'|...|'x'>
@end example

(Contributed by Raymond Hettinger in bpo-9826@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9826} and bpo-9840@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9840}.)

@node logging<8>,csv<4>,reprlib,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 logging}@anchor{1400}
@subsubsection logging


In addition to dictionary-based configuration described above, the
@ref{8b,,logging} package has many other improvements.

The logging documentation has been augmented by a @ref{1401,,basic tutorial}, an @ref{1402,,advanced tutorial}, and a @ref{1403,,cookbook} of
logging recipes.  These documents are the fastest way to learn about logging.

The @ref{bf9,,logging.basicConfig()} set-up function gained a `style' argument to
support three different types of string formatting.  It defaults to “%” for
traditional %-formatting, can be set to “@{” for the new @ref{834,,str.format()} style, or
can be set to “$” for the shell-style formatting provided by
@ref{899,,string.Template}.  The following three configurations are equivalent:

@example
>>> from logging import basicConfig
>>> basicConfig(style='%', format="%(name)s -> %(levelname)s: %(message)s")
>>> basicConfig(style='@{', format="@{name@} -> @{levelname@} @{message@}")
>>> basicConfig(style='$', format="$name -> $levelname: $message")
@end example

If no configuration is set-up before a logging event occurs, there is now a
default configuration using a @ref{1404,,StreamHandler} directed to
@ref{b39,,sys.stderr} for events of @code{WARNING} level or higher.  Formerly, an
event occurring before a configuration was set-up would either raise an
exception or silently drop the event depending on the value of
@ref{1405,,logging.raiseExceptions}.  The new default handler is stored in
@ref{1406,,logging.lastResort}.

The use of filters has been simplified.  Instead of creating a
@ref{1407,,Filter} object, the predicate can be any Python callable that
returns @code{True} or @code{False}.

There were a number of other improvements that add flexibility and simplify
configuration.  See the module documentation for a full listing of changes in
Python 3.2.

@node csv<4>,contextlib<8>,logging<8>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 csv}@anchor{1408}
@subsubsection csv


The @ref{2d,,csv} module now supports a new dialect, @ref{1409,,unix_dialect},
which applies quoting for all fields and a traditional Unix style with @code{'\n'} as
the line terminator.  The registered dialect name is @code{unix}.

The @ref{140a,,csv.DictWriter} has a new method,
@ref{140b,,writeheader()} for writing-out an initial row to document
the field names:

@example
>>> import csv, sys
>>> w = csv.DictWriter(sys.stdout, ['name', 'dept'], dialect='unix')
>>> w.writeheader()
"name","dept"
>>> w.writerows([
...     @{'name': 'tom', 'dept': 'accounting'@},
...     @{'name': 'susan', 'dept': 'Salesl'@}])
"tom","accounting"
"susan","sales"
@end example

(New dialect suggested by Jay Talbot in bpo-5975@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5975}, and the new method
suggested by Ed Abraham in bpo-1537721@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1537721}.)

@node contextlib<8>,decimal and fractions,csv<4>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 contextlib}@anchor{140c}
@subsubsection contextlib


There is a new and slightly mind-blowing tool
@ref{140d,,ContextDecorator} that is helpful for creating a
@ref{1e3,,context manager} that does double duty as a function decorator.

As a convenience, this new functionality is used by
@ref{140e,,contextmanager()} so that no extra effort is needed to support
both roles.

The basic idea is that both context managers and function decorators can be used
for pre-action and post-action wrappers.  Context managers wrap a group of
statements using a @ref{187,,with} statement, and function decorators wrap a
group of statements enclosed in a function.  So, occasionally there is a need to
write a pre-action or post-action wrapper that can be used in either role.

For example, it is sometimes useful to wrap functions or groups of statements
with a logger that can track the time of entry and time of exit.  Rather than
writing both a function decorator and a context manager for the task, the
@ref{140e,,contextmanager()} provides both capabilities in a single
definition:

@example
from contextlib import contextmanager
import logging

logging.basicConfig(level=logging.INFO)

@@contextmanager
def track_entry_and_exit(name):
    logging.info('Entering: %s', name)
    yield
    logging.info('Exiting: %s', name)
@end example

Formerly, this would have only been usable as a context manager:

@example
with track_entry_and_exit('widget loader'):
    print('Some time consuming activity goes here')
    load_widget()
@end example

Now, it can be used as a decorator as well:

@example
@@track_entry_and_exit('widget loader')
def activity():
    print('Some time consuming activity goes here')
    load_widget()
@end example

Trying to fulfill two roles at once places some limitations on the technique.
Context managers normally have the flexibility to return an argument usable by
a @ref{187,,with} statement, but there is no parallel for function decorators.

In the above example, there is not a clean way for the `track_entry_and_exit'
context manager to return a logging instance for use in the body of enclosed
statements.

(Contributed by Michael Foord in bpo-9110@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9110}.)

@node decimal and fractions,ftp,contextlib<8>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 decimal-and-fractions}@anchor{140f}
@subsubsection decimal and fractions


Mark Dickinson crafted an elegant and efficient scheme for assuring that
different numeric datatypes will have the same hash value whenever their actual
values are equal (bpo-8188@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8188}):

@example
assert hash(Fraction(3, 2)) == hash(1.5) == \
       hash(Decimal("1.5")) == hash(complex(1.5, 0))
@end example

Some of the hashing details are exposed through a new attribute,
@ref{1205,,sys.hash_info}, which describes the bit width of the hash value, the
prime modulus, the hash values for `infinity' and `nan', and the multiplier
used for the imaginary part of a number:

@example
>>> sys.hash_info
sys.hash_info(width=64, modulus=2305843009213693951, inf=314159, nan=0, imag=1000003)
@end example

An early decision to limit the interoperability of various numeric types has
been relaxed.  It is still unsupported (and ill-advised) to have implicit
mixing in arithmetic expressions such as @code{Decimal('1.1') + float('1.1')}
because the latter loses information in the process of constructing the binary
float.  However, since existing floating-point value can be converted losslessly
to either a decimal or rational representation, it makes sense to add them to
the constructor and to support mixed-type comparisons.


@itemize *

@item 
The @ref{200,,decimal.Decimal} constructor now accepts @ref{197,,float} objects
directly so there in no longer a need to use the @ref{1410,,from_float()}
method (bpo-8257@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8257}).

@item 
Mixed type comparisons are now fully supported so that
@ref{200,,Decimal} objects can be directly compared with @ref{197,,float}
and @ref{215,,fractions.Fraction} (bpo-2531@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2531} and bpo-8188@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8188}).
@end itemize

Similar changes were made to @ref{215,,fractions.Fraction} so that the
@ref{1411,,from_float()} and @ref{1412,,from_decimal()}
methods are no longer needed (bpo-8294@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8294}):

@example
>>> from decimal import Decimal
>>> from fractions import Fraction
>>> Decimal(1.1)
Decimal('1.100000000000000088817841970012523233890533447265625')
>>> Fraction(1.1)
Fraction(2476979795053773, 2251799813685248)
@end example

Another useful change for the @ref{3a,,decimal} module is that the
@ref{13aa,,Context.clamp} attribute is now public.  This is useful in creating
contexts that correspond to the decimal interchange formats specified in IEEE
754 (see bpo-8540@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8540}).

(Contributed by Mark Dickinson and Raymond Hettinger.)

@node ftp,popen,decimal and fractions,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 ftp}@anchor{1413}
@subsubsection ftp


The @ref{afc,,ftplib.FTP} class now supports the context management protocol to
unconditionally consume @ref{125c,,socket.error} exceptions and to close the FTP
connection when done:

@example
>>> from ftplib import FTP
>>> with FTP("ftp1.at.proftpd.org") as ftp:
        ftp.login()
        ftp.dir()

'230 Anonymous login ok, restrictions apply.'
dr-xr-xr-x   9 ftp      ftp           154 May  6 10:43 .
dr-xr-xr-x   9 ftp      ftp           154 May  6 10:43 ..
dr-xr-xr-x   5 ftp      ftp          4096 May  6 10:43 CentOS
dr-xr-xr-x   3 ftp      ftp            18 Jul 10  2008 Fedora
@end example

Other file-like objects such as @ref{51a,,mmap.mmap} and @ref{a06,,fileinput.input()}
also grew auto-closing context managers:

@example
with fileinput.input(files=('log1.txt', 'log2.txt')) as f:
    for line in f:
        process(line)
@end example

(Contributed by Tarek Ziadé and Giampaolo Rodolà in bpo-4972@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4972}, and
by Georg Brandl in bpo-8046@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8046} and bpo-1286@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1286}.)

The @ref{afd,,FTP_TLS} class now accepts a `context' parameter, which is a
@ref{355,,ssl.SSLContext} object allowing bundling SSL configuration options,
certificates and private keys into a single (potentially long-lived) structure.

(Contributed by Giampaolo Rodolà; bpo-8806@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8806}.)

@node popen,select<3>,ftp,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 popen}@anchor{1414}
@subsubsection popen


The @ref{31c,,os.popen()} and @ref{4b8,,subprocess.Popen()} functions now support
@ref{187,,with} statements for auto-closing of the file descriptors.

(Contributed by Antoine Pitrou and Brian Curtin in bpo-7461@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7461} and
bpo-10554@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10554}.)

@node select<3>,gzip and zipfile,popen,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 select}@anchor{1415}
@subsubsection select


The @ref{c6,,select} module now exposes a new, constant attribute,
@ref{1416,,PIPE_BUF}, which gives the minimum number of bytes which are
guaranteed not to block when @ref{fa6,,select.select()} says a pipe is ready
for writing.

@example
>>> import select
>>> select.PIPE_BUF
512
@end example

(Available on Unix systems. Patch by Sébastien Sablé in bpo-9862@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9862})

@node gzip and zipfile,tarfile<10>,select<3>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 gzip-and-zipfile}@anchor{1417}
@subsubsection gzip and zipfile


@ref{65c,,gzip.GzipFile} now implements the @ref{8a5,,io.BufferedIOBase}
@ref{13c2,,abstract base class} (except for @code{truncate()}).  It also has a
@ref{1418,,peek()} method and supports unseekable as well as
zero-padded file objects.

The @ref{6b,,gzip} module also gains the @ref{84f,,compress()} and
@ref{1419,,decompress()} functions for easier in-memory compression and
decompression.  Keep in mind that text needs to be encoded as @ref{193,,bytes}
before compressing and decompressing:

@example
>>> import gzip
>>> s = 'Three shall be the number thou shalt count, '
>>> s += 'and the number of the counting shall be three'
>>> b = s.encode()                        # convert to utf-8
>>> len(b)
89
>>> c = gzip.compress(b)
>>> len(c)
77
>>> gzip.decompress(c).decode()[:42]      # decompress and convert to text
'Three shall be the number thou shalt count'
@end example

(Contributed by Anand B. Pillai in bpo-3488@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3488}; and by Antoine Pitrou, Nir
Aides and Brian Curtin in bpo-9962@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9962}, bpo-1675951@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1675951}, bpo-7471@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7471} and
bpo-2846@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2846}.)

Also, the @ref{65d,,zipfile.ZipExtFile} class was reworked internally to represent
files stored inside an archive.  The new implementation is significantly faster
and can be wrapped in an @ref{141a,,io.BufferedReader} object for more speedups.  It
also solves an issue where interleaved calls to `read' and `readline' gave the
wrong results.

(Patch submitted by Nir Aides in bpo-7610@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7610}.)

@node tarfile<10>,hashlib<7>,gzip and zipfile,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 tarfile}@anchor{141b}
@subsubsection tarfile


The @ref{141c,,TarFile} class can now be used as a context manager.  In
addition, its @ref{df4,,add()} method has a new option, `filter',
that controls which files are added to the archive and allows the file metadata
to be edited.

The new `filter' option replaces the older, less flexible `exclude' parameter
which is now deprecated.  If specified, the optional `filter' parameter needs to
be a @ref{f14,,keyword argument}.  The user-supplied filter function accepts a
@ref{141d,,TarInfo} object and returns an updated
@code{TarInfo} object, or if it wants the file to be excluded, the
function can return @code{None}:

@example
>>> import tarfile, glob

>>> def myfilter(tarinfo):
...     if tarinfo.isfile():             # only save real files
...         tarinfo.uname = 'monty'      # redact the user name
...         return tarinfo

>>> with tarfile.open(name='myarchive.tar.gz', mode='w:gz') as tf:
...     for filename in glob.glob('*.txt'):
...         tf.add(filename, filter=myfilter)
...     tf.list()
-rw-r--r-- monty/501        902 2011-01-26 17:59:11 annotations.txt
-rw-r--r-- monty/501        123 2011-01-26 17:59:11 general_questions.txt
-rw-r--r-- monty/501       3514 2011-01-26 17:59:11 prion.txt
-rw-r--r-- monty/501        124 2011-01-26 17:59:11 py_todo.txt
-rw-r--r-- monty/501       1399 2011-01-26 17:59:11 semaphore_notes.txt
@end example

(Proposed by Tarek Ziadé and implemented by Lars Gustäbel in bpo-6856@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6856}.)

@node hashlib<7>,ast<7>,tarfile<10>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 hashlib}@anchor{141e}
@subsubsection hashlib


The @ref{6c,,hashlib} module has two new constant attributes listing the hashing
algorithms guaranteed to be present in all implementations and those available
on the current implementation:

@example
>>> import hashlib

>>> hashlib.algorithms_guaranteed
@{'sha1', 'sha224', 'sha384', 'sha256', 'sha512', 'md5'@}

>>> hashlib.algorithms_available
@{'md2', 'SHA256', 'SHA512', 'dsaWithSHA', 'mdc2', 'SHA224', 'MD4', 'sha256',
'sha512', 'ripemd160', 'SHA1', 'MDC2', 'SHA', 'SHA384', 'MD2',
'ecdsa-with-SHA1','md4', 'md5', 'sha1', 'DSA-SHA', 'sha224',
'dsaEncryption', 'DSA', 'RIPEMD160', 'sha', 'MD5', 'sha384'@}
@end example

(Suggested by Carl Chenet in bpo-7418@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7418}.)

@node ast<7>,os<14>,hashlib<7>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 ast}@anchor{141f}
@subsubsection ast


The @ref{9,,ast} module has a wonderful a general-purpose tool for safely
evaluating expression strings using the Python literal
syntax.  The @ref{e18,,ast.literal_eval()} function serves as a secure alternative to
the builtin @ref{4a4,,eval()} function which is easily abused.  Python 3.2 adds
@ref{193,,bytes} and @ref{185,,set} literals to the list of supported types:
strings, bytes, numbers, tuples, lists, dicts, sets, booleans, and @code{None}.

@example
>>> from ast import literal_eval

>>> request = "@{'req': 3, 'func': 'pow', 'args': (2, 0.5)@}"
>>> literal_eval(request)
@{'args': (2, 0.5), 'req': 3, 'func': 'pow'@}

>>> request = "os.system('do something harmful')"
>>> literal_eval(request)
Traceback (most recent call last):
  ...
ValueError: malformed node or string: <_ast.Call object at 0x101739a10>
@end example

(Implemented by Benjamin Peterson and Georg Brandl.)

@node os<14>,shutil<8>,ast<7>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 os}@anchor{1420}
@subsubsection os


Different operating systems use various encodings for filenames and environment
variables.  The @ref{a5,,os} module provides two new functions,
@ref{e55,,fsencode()} and @ref{e54,,fsdecode()}, for encoding and decoding
filenames:

@example
>>> import os
>>> filename = 'Sehenswürdigkeiten'
>>> os.fsencode(filename)
b'Sehensw\xc3\xbcrdigkeiten'
@end example

Some operating systems allow direct access to encoded bytes in the
environment.  If so, the @ref{1421,,os.supports_bytes_environ} constant will be
true.

For direct access to encoded environment variables (if available),
use the new @ref{1422,,os.getenvb()} function or use @ref{25c,,os.environb}
which is a bytes version of @ref{25b,,os.environ}.

(Contributed by Victor Stinner.)

@node shutil<8>,sqlite3<12>,os<14>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 shutil}@anchor{1423}
@subsubsection shutil


The @ref{c24,,shutil.copytree()} function has two new options:


@itemize *

@item 
`ignore_dangling_symlinks': when @code{symlinks=False} so that the function
copies a file pointed to by a symlink, not the symlink itself. This option
will silence the error raised if the file doesn’t exist.

@item 
`copy_function': is a callable that will be used to copy files.
@ref{c56,,shutil.copy2()} is used by default.
@end itemize

(Contributed by Tarek Ziadé.)

In addition, the @ref{ca,,shutil} module now supports @ref{1424,,archiving operations} for zipfiles, uncompressed tarfiles, gzipped tarfiles,
and bzipped tarfiles.  And there are functions for registering additional
archiving file formats (such as xz compressed tarfiles or custom formats).

The principal functions are @ref{6db,,make_archive()} and
@ref{697,,unpack_archive()}.  By default, both operate on the current
directory (which can be set by @ref{822,,os.chdir()}) and on any sub-directories.
The archive filename needs to be specified with a full pathname.  The archiving
step is non-destructive (the original files are left unchanged).

@example
>>> import shutil, pprint

>>> os.chdir('mydata')  # change to the source directory
>>> f = shutil.make_archive('/var/backup/mydata',
...                         'zip')      # archive the current directory
>>> f                                   # show the name of archive
'/var/backup/mydata.zip'
>>> os.chdir('tmp')                     # change to an unpacking
>>> shutil.unpack_archive('/var/backup/mydata.zip')  # recover the data

>>> pprint.pprint(shutil.get_archive_formats())  # display known formats
[('bztar', "bzip2'ed tar-file"),
 ('gztar', "gzip'ed tar-file"),
 ('tar', 'uncompressed tar file'),
 ('zip', 'ZIP file')]

>>> shutil.register_archive_format(     # register a new archive format
...     name='xz',
...     function=xz.compress,           # callable archiving function
...     extra_args=[('level', 8)],      # arguments to the function
...     description='xz compression'
... )
@end example

(Contributed by Tarek Ziadé.)

@node sqlite3<12>,html<3>,shutil<8>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 sqlite3}@anchor{1425}
@subsubsection sqlite3


The @ref{d4,,sqlite3} module was updated to pysqlite version 2.6.0.  It has two new capabilities.


@itemize *

@item 
The @code{sqlite3.Connection.in_transit} attribute is true if there is an
active transaction for uncommitted changes.

@item 
The @ref{a45,,sqlite3.Connection.enable_load_extension()} and
@ref{6e0,,sqlite3.Connection.load_extension()} methods allows you to load SQLite
extensions from “.so” files.  One well-known extension is the fulltext-search
extension distributed with SQLite.
@end itemize

(Contributed by R. David Murray and Shashwat Anand; bpo-8845@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8845}.)

@node html<3>,socket<12>,sqlite3<12>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 html}@anchor{1426}
@subsubsection html


A new @ref{6f,,html} module was introduced with only a single function,
@ref{1214,,escape()}, which is used for escaping reserved characters from HTML
markup:

@example
>>> import html
>>> html.escape('x > 2 && x < 7')
'x &gt; 2 &amp;&amp; x &lt; 7'
@end example

@node socket<12>,ssl<13>,html<3>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 socket}@anchor{1427}
@subsubsection socket


The @ref{d1,,socket} module has two new improvements.


@itemize *

@item 
Socket objects now have a @ref{1428,,detach()} method which puts
the socket into closed state without actually closing the underlying file
descriptor.  The latter can then be reused for other purposes.
(Added by Antoine Pitrou; bpo-8524@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8524}.)

@item 
@ref{884,,socket.create_connection()} now supports the context management protocol
to unconditionally consume @ref{125c,,socket.error} exceptions and to close the
socket when done.
(Contributed by Giampaolo Rodolà; bpo-9794@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9794}.)
@end itemize

@node ssl<13>,nntp,socket<12>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 ssl}@anchor{1429}
@subsubsection ssl


The @ref{d5,,ssl} module added a number of features to satisfy common requirements
for secure (encrypted, authenticated) internet connections:


@itemize *

@item 
A new class, @ref{355,,SSLContext}, serves as a container for persistent
SSL data, such as protocol settings, certificates, private keys, and various
other options. It includes a @ref{749,,wrap_socket()} for creating
an SSL socket from an SSL context.

@item 
A new function, @code{ssl.match_hostname()}, supports server identity
verification for higher-level protocols by implementing the rules of HTTPS
(from 
@geindex RFC; RFC 2818
RFC 2818@footnote{https://datatracker.ietf.org/doc/html/rfc2818.html}) which are also suitable for other protocols.

@item 
The @ref{749,,ssl.wrap_socket()} constructor function now takes a `ciphers'
argument.  The `ciphers' string lists the allowed encryption algorithms using
the format described in the OpenSSL documentation@footnote{https://docs.openssl.org/1.0.2/man1/ciphers/#cipher-list-format}.

@item 
When linked against recent versions of OpenSSL, the @ref{d5,,ssl} module now
supports the Server Name Indication extension to the TLS protocol, allowing
multiple “virtual hosts” using different certificates on a single IP port.
This extension is only supported in client mode, and is activated by passing
the `server_hostname' argument to @ref{749,,ssl.SSLContext.wrap_socket()}.

@item 
Various options have been added to the @ref{d5,,ssl} module, such as
@ref{a40,,OP_NO_SSLv2} which disables the insecure and obsolete SSLv2
protocol.

@item 
The extension now loads all the OpenSSL ciphers and digest algorithms.  If
some SSL certificates cannot be verified, they are reported as an “unknown
algorithm” error.

@item 
The version of OpenSSL being used is now accessible using the module
attributes @ref{142a,,ssl.OPENSSL_VERSION} (a string),
@ref{142b,,ssl.OPENSSL_VERSION_INFO} (a 5-tuple), and
@ref{142c,,ssl.OPENSSL_VERSION_NUMBER} (an integer).
@end itemize

(Contributed by Antoine Pitrou in bpo-8850@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8850}, bpo-1589@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1589}, bpo-8322@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8322},
bpo-5639@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5639}, bpo-4870@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4870}, bpo-8484@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8484}, and bpo-8321@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8321}.)

@node nntp,certificates,ssl<13>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 nntp}@anchor{142d}
@subsubsection nntp


The @code{nntplib} module has a revamped implementation with better bytes and
text semantics as well as more practical APIs.  These improvements break
compatibility with the nntplib version in Python 3.1, which was partly
dysfunctional in itself.

Support for secure connections through both implicit (using
@code{nntplib.NNTP_SSL}) and explicit (using @code{nntplib.NNTP.starttls()})
TLS has also been added.

(Contributed by Antoine Pitrou in bpo-9360@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9360} and Andrew Vant in bpo-1926@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1926}.)

@node certificates,imaplib<5>,nntp,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 certificates}@anchor{142e}
@subsubsection certificates


@ref{d3c,,http.client.HTTPSConnection}, @ref{142f,,urllib.request.HTTPSHandler}
and @ref{309,,urllib.request.urlopen()} now take optional arguments to allow for
server certificate checking against a set of Certificate Authorities,
as recommended in public uses of HTTPS.

(Added by Antoine Pitrou, bpo-9003@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9003}.)

@node imaplib<5>,http client<4>,certificates,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 imaplib}@anchor{1430}
@subsubsection imaplib


Support for explicit TLS on standard IMAP4 connections has been added through
the new @ref{1431,,imaplib.IMAP4.starttls} method.

(Contributed by Lorenzo M. Catucci and Antoine Pitrou, bpo-4471@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4471}.)

@node http client<4>,unittest<12>,imaplib<5>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 http-client}@anchor{1432}
@subsubsection http.client


There were a number of small API improvements in the @ref{73,,http.client} module.
The old-style HTTP 0.9 simple responses are no longer supported and the `strict'
parameter is deprecated in all classes.

The @ref{d3b,,HTTPConnection} and
@ref{d3c,,HTTPSConnection} classes now have a `source_address'
parameter for a (host, port) tuple indicating where the HTTP connection is made
from.

Support for certificate checking and HTTPS virtual hosts were added to
@ref{d3c,,HTTPSConnection}.

The @ref{ead,,request()} method on connection objects
allowed an optional `body' argument so that a @ref{13cf,,file object} could be used
to supply the content of the request.  Conveniently, the `body' argument now
also accepts an @ref{1433,,iterable} object so long as it includes an explicit
@code{Content-Length} header.  This extended interface is much more flexible than
before.

To establish an HTTPS connection through a proxy server, there is a new
@ref{1434,,set_tunnel()} method that sets the host and
port for HTTP Connect tunneling.

To match the behavior of @ref{76,,http.server}, the HTTP client library now also
encodes headers with ISO-8859-1 (Latin-1) encoding.  It was already doing that
for incoming headers, so now the behavior is consistent for both incoming and
outgoing traffic. (See work by Armin Ronacher in bpo-10980@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10980}.)

@node unittest<12>,random<5>,http client<4>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 unittest}@anchor{1435}
@subsubsection unittest


The unittest module has a number of improvements supporting test discovery for
packages, easier experimentation at the interactive prompt, new testcase
methods, improved diagnostic messages for test failures, and better method
names.


@itemize *

@item 
The command-line call @code{python -m unittest} can now accept file paths
instead of module names for running specific tests (bpo-10620@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10620}).  The new
test discovery can find tests within packages, locating any test importable
from the top-level directory.  The top-level directory can be specified with
the @code{-t} option, a pattern for matching files with @code{-p}, and a directory to
start discovery with @code{-s}:

@example
$ python -m unittest discover -s my_proj_dir -p _test.py
@end example

(Contributed by Michael Foord.)

@item 
Experimentation at the interactive prompt is now easier because the
@ref{2b5,,unittest.TestCase} class can now be instantiated without
arguments:

@example
>>> from unittest import TestCase
>>> TestCase().assertEqual(pow(2, 3), 8)
@end example

(Contributed by Michael Foord.)

@item 
The @ref{10d,,unittest} module has two new methods,
@ref{1370,,assertWarns()} and
@ref{1371,,assertWarnsRegex()} to verify that a given warning type
is triggered by the code under test:

@example
with self.assertWarns(DeprecationWarning):
    legacy_function('XYZ')
@end example

(Contributed by Antoine Pitrou, bpo-9754@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9754}.)

Another new method, @ref{1436,,assertCountEqual()} is used to
compare two iterables to determine if their element counts are equal (whether
the same elements are present with the same number of occurrences regardless
of order):

@example
def test_anagram(self):
    self.assertCountEqual('algorithm', 'logarithm')
@end example

(Contributed by Raymond Hettinger.)

@item 
A principal feature of the unittest module is an effort to produce meaningful
diagnostics when a test fails.  When possible, the failure is recorded along
with a diff of the output.  This is especially helpful for analyzing log files
of failed test runs. However, since diffs can sometime be voluminous, there is
a new @ref{1437,,maxDiff} attribute that sets maximum length of
diffs displayed.

@item 
In addition, the method names in the module have undergone a number of clean-ups.

For example, @ref{752,,assertRegex()} is the new name for
@code{assertRegexpMatches()} which was misnamed because the
test uses @ref{1438,,re.search()}, not @ref{1439,,re.match()}.  Other methods using
regular expressions are now named using short form “Regex” in preference to
“Regexp” – this matches the names used in other unittest implementations,
matches Python’s old name for the @ref{be,,re} module, and it has unambiguous
camel-casing.

(Contributed by Raymond Hettinger and implemented by Ezio Melotti.)

@item 
To improve consistency, some long-standing method aliases are being
deprecated in favor of the preferred names:

@quotation


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Old Name

@tab

Preferred Name

@item

@code{assert_()}

@tab

@ref{74b,,assertTrue()}

@item

@code{assertEquals()}

@tab

@ref{74d,,assertEqual()}

@item

@code{assertNotEquals()}

@tab

@ref{74e,,assertNotEqual()}

@item

@code{assertAlmostEquals()}

@tab

@ref{74f,,assertAlmostEqual()}

@item

@code{assertNotAlmostEquals()}

@tab

@ref{750,,assertNotAlmostEqual()}

@end multitable

@end quotation

Likewise, the @code{TestCase.fail*} methods deprecated in Python 3.1 are expected
to be removed in Python 3.3.

(Contributed by Ezio Melotti; bpo-9424@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9424}.)

@item 
The @code{assertDictContainsSubset()} method was deprecated
because it was misimplemented with the arguments in the wrong order.  This
created hard-to-debug optical illusions where tests like
@code{TestCase().assertDictContainsSubset(@{'a':1, 'b':2@}, @{'a':1@})} would fail.

(Contributed by Raymond Hettinger.)
@end itemize

@node random<5>,poplib<4>,unittest<12>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 random}@anchor{143a}
@subsubsection random


The integer methods in the @ref{bd,,random} module now do a better job of producing
uniform distributions.  Previously, they computed selections with
@code{int(n*random())} which had a slight bias whenever `n' was not a power of two.
Now, multiple selections are made from a range up to the next power of two and a
selection is kept only when it falls within the range @code{0 <= x < n}.  The
functions and methods affected are @ref{a71,,randrange()},
@ref{143b,,randint()}, @ref{143c,,choice()}, @ref{953,,shuffle()} and
@ref{952,,sample()}.

(Contributed by Raymond Hettinger; bpo-9025@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9025}.)

@node poplib<4>,asyncore<2>,random<5>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 poplib}@anchor{143d}
@subsubsection poplib


@ref{b24,,POP3_SSL} class now accepts a `context' parameter, which is a
@ref{355,,ssl.SSLContext} object allowing bundling SSL configuration options,
certificates and private keys into a single (potentially long-lived)
structure.

(Contributed by Giampaolo Rodolà; bpo-8807@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8807}.)

@node asyncore<2>,tempfile<5>,poplib<4>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 asyncore}@anchor{143e}
@subsubsection asyncore


@code{asyncore.dispatcher} now provides a
@code{handle_accepted()} method
returning a @code{(sock, addr)} pair which is called when a connection has actually
been established with a new remote endpoint. This is supposed to be used as a
replacement for old @code{handle_accept()} and avoids
the user  to call @code{accept()} directly.

(Contributed by Giampaolo Rodolà; bpo-6706@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6706}.)

@node tempfile<5>,inspect<11>,asyncore<2>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 tempfile}@anchor{143f}
@subsubsection tempfile


The @ref{e6,,tempfile} module has a new context manager,
@ref{1440,,TemporaryDirectory} which provides easy deterministic
cleanup of temporary directories:

@example
with tempfile.TemporaryDirectory() as tmpdirname:
    print('created temporary dir:', tmpdirname)
@end example

(Contributed by Neil Schemenauer and Nick Coghlan; bpo-5178@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5178}.)

@node inspect<11>,pydoc<7>,tempfile<5>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 inspect}@anchor{1441}
@subsubsection inspect



@itemize *

@item 
The @ref{82,,inspect} module has a new function
@ref{1442,,getgeneratorstate()} to easily identify the current state of a
generator-iterator:

@example
>>> from inspect import getgeneratorstate
>>> def gen():
...     yield 'demo'
...
>>> g = gen()
>>> getgeneratorstate(g)
'GEN_CREATED'
>>> next(g)
'demo'
>>> getgeneratorstate(g)
'GEN_SUSPENDED'
>>> next(g, None)
>>> getgeneratorstate(g)
'GEN_CLOSED'
@end example

(Contributed by Rodolpho Eckhardt and Nick Coghlan, bpo-10220@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10220}.)

@item 
To support lookups without the possibility of activating a dynamic attribute,
the @ref{82,,inspect} module has a new function, @ref{6bd,,getattr_static()}.
Unlike @ref{6fa,,hasattr()}, this is a true read-only search, guaranteed not to
change state while it is searching:

@example
>>> class A:
...     @@property
...     def f(self):
...         print('Running')
...         return 10
...
>>> a = A()
>>> getattr(a, 'f')
Running
10
>>> inspect.getattr_static(a, 'f')
<property object at 0x1022bd788>
@end example
@end itemize

@quotation

(Contributed by Michael Foord.)
@end quotation

@node pydoc<7>,dis<6>,inspect<11>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 pydoc}@anchor{1443}
@subsubsection pydoc


The @ref{ba,,pydoc} module now provides a much-improved web server interface, as
well as a new command-line option @code{-b} to automatically open a browser window
to display that server:

@example
$ pydoc3.2 -b
@end example

(Contributed by Ron Adam; bpo-2001@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2001}.)

@node dis<6>,dbm<7>,pydoc<7>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 dis}@anchor{1444}
@subsubsection dis


The @ref{3c,,dis} module gained two new functions for inspecting code,
@ref{1445,,code_info()} and @ref{1134,,show_code()}.  Both provide detailed code
object information for the supplied function, method, source code string or code
object.  The former returns a string and the latter prints it:

@example
>>> import dis, random
>>> dis.show_code(random.choice)
Name:              choice
Filename:          /Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/random.py
Argument count:    2
Kw-only arguments: 0
Number of locals:  3
Stack size:        11
Flags:             OPTIMIZED, NEWLOCALS, NOFREE
Constants:
   0: 'Choose a random element from a non-empty sequence.'
   1: 'Cannot choose from an empty sequence'
Names:
   0: _randbelow
   1: len
   2: ValueError
   3: IndexError
Variable names:
   0: self
   1: seq
   2: i
@end example

In addition, the @ref{207,,dis()} function now accepts string arguments
so that the common idiom @code{dis(compile(s, '@w{'}, 'eval'))} can be shortened
to @code{dis(s)}:

@example
>>> dis('3*x+1 if x%2==1 else x//2')
  1           0 LOAD_NAME                0 (x)
              3 LOAD_CONST               0 (2)
              6 BINARY_MODULO
              7 LOAD_CONST               1 (1)
             10 COMPARE_OP               2 (==)
             13 POP_JUMP_IF_FALSE       28
             16 LOAD_CONST               2 (3)
             19 LOAD_NAME                0 (x)
             22 BINARY_MULTIPLY
             23 LOAD_CONST               1 (1)
             26 BINARY_ADD
             27 RETURN_VALUE
        >>   28 LOAD_NAME                0 (x)
             31 LOAD_CONST               0 (2)
             34 BINARY_FLOOR_DIVIDE
             35 RETURN_VALUE
@end example

Taken together, these improvements make it easier to explore how CPython is
implemented and to see for yourself what the language syntax does
under-the-hood.

(Contributed by Nick Coghlan in bpo-9147@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9147}.)

@node dbm<7>,ctypes<4>,dis<6>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 dbm}@anchor{1446}
@subsubsection dbm


All database modules now support the @code{get()} and @code{setdefault()} methods.

(Suggested by Ray Allen in bpo-9523@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9523}.)

@node ctypes<4>,site<4>,dbm<7>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 ctypes}@anchor{1447}
@subsubsection ctypes


A new type, @ref{1448,,ctypes.c_ssize_t} represents the C @code{ssize_t} datatype.

@node site<4>,sysconfig<4>,ctypes<4>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 site}@anchor{1449}
@subsubsection site


The @ref{cc,,site} module has three new functions useful for reporting on the
details of a given Python installation.


@itemize *

@item 
@ref{144a,,getsitepackages()} lists all global site-packages directories.

@item 
@ref{144b,,getuserbase()} reports on the user’s base directory where data can
be stored.

@item 
@ref{144c,,getusersitepackages()} reveals the user-specific site-packages
directory path.
@end itemize

@example
>>> import site
>>> site.getsitepackages()
['/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/site-packages',
 '/Library/Frameworks/Python.framework/Versions/3.2/lib/site-python',
 '/Library/Python/3.2/site-packages']
>>> site.getuserbase()
'/Users/raymondhettinger/Library/Python/3.2'
>>> site.getusersitepackages()
'/Users/raymondhettinger/Library/Python/3.2/lib/python/site-packages'
@end example

Conveniently, some of site’s functionality is accessible directly from the
command-line:

@example
$ python -m site --user-base
/Users/raymondhettinger/.local
$ python -m site --user-site
/Users/raymondhettinger/.local/lib/python3.2/site-packages
@end example

(Contributed by Tarek Ziadé in bpo-6693@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6693}.)

@node sysconfig<4>,pdb<10>,site<4>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 sysconfig}@anchor{144d}
@subsubsection sysconfig


The new @ref{e1,,sysconfig} module makes it straightforward to discover
installation paths and configuration variables that vary across platforms and
installations.

The module offers access simple access functions for platform and version
information:


@itemize *

@item 
@ref{144e,,get_platform()} returning values like `linux-i586' or
`macosx-10.6-ppc'.

@item 
@ref{144f,,get_python_version()} returns a Python version string
such as “3.2”.
@end itemize

It also provides access to the paths and variables corresponding to one of
seven named schemes used by @code{distutils}.  Those include `posix_prefix',
`posix_home', `posix_user', `nt', `nt_user', `os2', `os2_home':


@itemize *

@item 
@ref{33e,,get_paths()} makes a dictionary containing installation paths
for the current installation scheme.

@item 
@ref{29a,,get_config_vars()} returns a dictionary of platform specific
variables.
@end itemize

There is also a convenient command-line interface:

@example
C:\Python32>python -m sysconfig
Platform: "win32"
Python version: "3.2"
Current installation scheme: "nt"

Paths:
        data = "C:\Python32"
        include = "C:\Python32\Include"
        platinclude = "C:\Python32\Include"
        platlib = "C:\Python32\Lib\site-packages"
        platstdlib = "C:\Python32\Lib"
        purelib = "C:\Python32\Lib\site-packages"
        scripts = "C:\Python32\Scripts"
        stdlib = "C:\Python32\Lib"

Variables:
        BINDIR = "C:\Python32"
        BINLIBDEST = "C:\Python32\Lib"
        EXE = ".exe"
        INCLUDEPY = "C:\Python32\Include"
        LIBDEST = "C:\Python32\Lib"
        SO = ".pyd"
        VERSION = "32"
        abiflags = ""
        base = "C:\Python32"
        exec_prefix = "C:\Python32"
        platbase = "C:\Python32"
        prefix = "C:\Python32"
        projectbase = "C:\Python32"
        py_version = "3.2"
        py_version_nodot = "32"
        py_version_short = "3.2"
        srcdir = "C:\Python32"
        userbase = "C:\Documents and Settings\Raymond\Application Data\Python"
@end example

(Moved out of Distutils by Tarek Ziadé.)

@node pdb<10>,configparser<6>,sysconfig<4>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 pdb}@anchor{1450}
@subsubsection pdb


The @ref{aa,,pdb} debugger module gained a number of usability improvements:


@itemize *

@item 
@code{pdb.py} now has a @code{-c} option that executes commands as given in a
@code{.pdbrc} script file.

@item 
A @code{.pdbrc} script file can contain @code{continue} and @code{next} commands
that continue debugging.

@item 
The @ref{275,,Pdb} class constructor now accepts a `nosigint' argument.

@item 
New commands: @code{l(list)}, @code{ll(long list)} and @code{source} for
listing source code.

@item 
New commands: @code{display} and @code{undisplay} for showing or hiding
the value of an expression if it has changed.

@item 
New command: @code{interact} for starting an interactive interpreter containing
the global and local  names found in the current scope.

@item 
Breakpoints can be cleared by breakpoint number.
@end itemize

(Contributed by Georg Brandl, Antonio Cuni and Ilya Sandler.)

@node configparser<6>,urllib parse<6>,pdb<10>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 configparser}@anchor{1451}
@subsubsection configparser


The @ref{26,,configparser} module was modified to improve usability and
predictability of the default parser and its supported INI syntax.  The old
@code{ConfigParser} class was removed in favor of @code{SafeConfigParser}
which has in turn been renamed to @ref{4df,,ConfigParser}. Support
for inline comments is now turned off by default and section or option
duplicates are not allowed in a single configuration source.

Config parsers gained a new API based on the mapping protocol:

@example
>>> parser = ConfigParser()
>>> parser.read_string("""
... [DEFAULT]
... location = upper left
... visible = yes
... editable = no
... color = blue
...
... [main]
... title = Main Menu
... color = green
...
... [options]
... title = Options
... """)
>>> parser['main']['color']
'green'
>>> parser['main']['editable']
'no'
>>> section = parser['options']
>>> section['title']
'Options'
>>> section['title'] = 'Options (editable: %(editable)s)'
>>> section['title']
'Options (editable: no)'
@end example

The new API is implemented on top of the classical API, so custom parser
subclasses should be able to use it without modifications.

The INI file structure accepted by config parsers can now be customized. Users
can specify alternative option/value delimiters and comment prefixes, change the
name of the `DEFAULT' section or switch the interpolation syntax.

There is support for pluggable interpolation including an additional interpolation
handler @ref{92f,,ExtendedInterpolation}:

@example
>>> parser = ConfigParser(interpolation=ExtendedInterpolation())
>>> parser.read_dict(@{'buildout': @{'directory': '/home/ambv/zope9'@},
...                   'custom': @{'prefix': '/usr/local'@}@})
>>> parser.read_string("""
... [buildout]
... parts =
...   zope9
...   instance
... find-links =
...   $@{buildout:directory@}/downloads/dist
...
... [zope9]
... recipe = plone.recipe.zope9install
... location = /opt/zope
...
... [instance]
... recipe = plone.recipe.zope9instance
... zope9-location = $@{zope9:location@}
... zope-conf = $@{custom:prefix@}/etc/zope.conf
... """)
>>> parser['buildout']['find-links']
'\n/home/ambv/zope9/downloads/dist'
>>> parser['instance']['zope-conf']
'/usr/local/etc/zope.conf'
>>> instance = parser['instance']
>>> instance['zope-conf']
'/usr/local/etc/zope.conf'
>>> instance['zope9-location']
'/opt/zope'
@end example

A number of smaller features were also introduced, like support for specifying
encoding in read operations, specifying fallback values for get-functions, or
reading directly from dictionaries and strings.

(All changes contributed by Łukasz Langa.)

@c XXX consider showing a difflib example

@node urllib parse<6>,mailbox,configparser<6>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 urllib-parse}@anchor{1452}
@subsubsection urllib.parse


A number of usability improvements were made for the @ref{111,,urllib.parse} module.

The @ref{360,,urlparse()} function now supports IPv6@footnote{https://en.wikipedia.org/wiki/IPv6} addresses as described in 
@geindex RFC; RFC 2732
RFC 2732@footnote{https://datatracker.ietf.org/doc/html/rfc2732.html}:

@example
>>> import urllib.parse
>>> urllib.parse.urlparse('http://[dead:beef:cafe:5417:affe:8FA3:deaf:feed]/foo/')
ParseResult(scheme='http',
            netloc='[dead:beef:cafe:5417:affe:8FA3:deaf:feed]',
            path='/foo/',
            params='@w{'},
            query='@w{'},
            fragment='@w{'})
@end example

The @ref{1453,,urldefrag()} function now returns a @ref{85f,,named tuple}:

@example
>>> r = urllib.parse.urldefrag('http://python.org/about/#target')
>>> r
DefragResult(url='http://python.org/about/', fragment='target')
>>> r[0]
'http://python.org/about/'
>>> r.fragment
'target'
@end example

And, the @ref{109b,,urlencode()} function is now much more flexible,
accepting either a string or bytes type for the `query' argument.  If it is a
string, then the `safe', `encoding', and `error' parameters are sent to
@ref{1454,,quote_plus()} for encoding:

@example
>>> urllib.parse.urlencode([
...      ('type', 'telenovela'),
...      ('name', '¿Dónde Está Elisa?')],
...      encoding='latin-1')
'type=telenovela&name=%BFD%F3nde+Est%E1+Elisa%3F'
@end example

As detailed in @ref{1455,,Parsing ASCII Encoded Bytes}, all the @ref{111,,urllib.parse}
functions now accept ASCII-encoded byte strings as input, so long as they are
not mixed with regular strings.  If ASCII-encoded byte strings are given as
parameters, the return types will also be an ASCII-encoded byte strings:

@example
>>> urllib.parse.urlparse(b'http://www.python.org:80/about/')
ParseResultBytes(scheme=b'http', netloc=b'www.python.org:80',
                 path=b'/about/', params=b'@w{'}, query=b'@w{'}, fragment=b'@w{'})
@end example

(Work by Nick Coghlan, Dan Mahn, and Senthil Kumaran in bpo-2987@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2987},
bpo-5468@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5468}, and bpo-9873@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9873}.)

@node mailbox,turtledemo,urllib parse<6>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 mailbox}@anchor{1456}
@subsubsection mailbox


Thanks to a concerted effort by R. David Murray, the @ref{8f,,mailbox} module has
been fixed for Python 3.2.  The challenge was that mailbox had been originally
designed with a text interface, but email messages are best represented with
@ref{193,,bytes} because various parts of a message may have different encodings.

The solution harnessed the @ref{3f,,email} package’s binary support for parsing
arbitrary email messages.  In addition, the solution required a number of API
changes.

As expected, the @ref{1457,,add()} method for
@ref{1458,,mailbox.Mailbox} objects now accepts binary input.

@ref{112f,,StringIO} and text file input are deprecated.  Also, string input
will fail early if non-ASCII characters are used.  Previously it would fail when
the email was processed in a later step.

There is also support for binary output.  The @ref{1459,,get_file()}
method now returns a file in the binary mode (where it used to incorrectly set
the file to text-mode).  There is also a new @ref{145a,,get_bytes()}
method that returns a @ref{193,,bytes} representation of a message corresponding
to a given `key'.

It is still possible to get non-binary output using the old API’s
@ref{145b,,get_string()} method, but that approach
is not very useful.  Instead, it is best to extract messages from
a @ref{145c,,Message} object or to load them from binary input.

(Contributed by R. David Murray, with efforts from Steffen Daode Nurpmeso and an
initial patch by Victor Stinner in bpo-9124@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9124}.)

@node turtledemo,,mailbox,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 turtledemo}@anchor{145d}
@subsubsection turtledemo


The demonstration code for the @ref{108,,turtle} module was moved from the `Demo'
directory to main library.  It includes over a dozen sample scripts with
lively displays.  Being on @ref{3e2,,sys.path}, it can now be run directly
from the command-line:

@example
$ python -m turtledemo
@end example

(Moved from the Demo directory by Alexander Belopolsky in bpo-10199@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10199}.)

@node Multi-threading,Optimizations<12>,New Improved and Deprecated Modules,What’s New In Python 3 2
@anchor{whatsnew/3 2 multi-threading}@anchor{145e}
@subsection Multi-threading



@itemize *

@item 
The mechanism for serializing execution of concurrently running Python threads
(generally known as the @ref{165,,GIL} or Global Interpreter Lock) has
been rewritten.  Among the objectives were more predictable switching
intervals and reduced overhead due to lock contention and the number of
ensuing system calls.  The notion of a “check interval” to allow thread
switches has been abandoned and replaced by an absolute duration expressed in
seconds.  This parameter is tunable through @ref{b4a,,sys.setswitchinterval()}.
It currently defaults to 5 milliseconds.

Additional details about the implementation can be read from a python-dev mailing-list message@footnote{https://mail.python.org/pipermail/python-dev/2009-October/093321.html}
(however, “priority requests” as exposed in this message have not been kept
for inclusion).

(Contributed by Antoine Pitrou.)

@item 
Regular and recursive locks now accept an optional `timeout' argument to their
@ref{8a9,,acquire()} method.  (Contributed by Antoine Pitrou;
bpo-7316@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7316}.)

@item 
Similarly, @ref{145f,,threading.Semaphore.acquire()} also gained a `timeout'
argument.  (Contributed by Torsten Landschoff; bpo-850728@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=850728}.)

@item 
Regular and recursive lock acquisitions can now be interrupted by signals on
platforms using Pthreads.  This means that Python programs that deadlock while
acquiring locks can be successfully killed by repeatedly sending SIGINT to the
process (by pressing @code{Ctrl}+@code{C} in most shells).
(Contributed by Reid Kleckner; bpo-8844@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8844}.)
@end itemize

@node Optimizations<12>,Unicode,Multi-threading,What’s New In Python 3 2
@anchor{whatsnew/3 2 optimizations}@anchor{1460}
@subsection Optimizations


A number of small performance enhancements have been added:


@itemize *

@item 
Python’s peephole optimizer now recognizes patterns such @code{x in @{1, 2, 3@}} as
being a test for membership in a set of constants.  The optimizer recasts the
@ref{185,,set} as a @ref{7f3,,frozenset} and stores the pre-built constant.

Now that the speed penalty is gone, it is practical to start writing
membership tests using set-notation.  This style is both semantically clear
and operationally fast:

@example
extension = name.rpartition('.')[2]
if extension in @{'xml', 'html', 'xhtml', 'css'@}:
    handle(name)
@end example

(Patch and additional tests contributed by Dave Malcolm; bpo-6690@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6690}).

@item 
Serializing and unserializing data using the @ref{ab,,pickle} module is now
several times faster.

(Contributed by Alexandre Vassalotti, Antoine Pitrou
and the Unladen Swallow team in bpo-9410@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9410} and bpo-3873@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3873}.)

@item 
The Timsort algorithm@footnote{https://en.wikipedia.org/wiki/Timsort} used in
@ref{dce,,list.sort()} and @ref{dcd,,sorted()} now runs faster and uses less memory
when called with a @ref{100c,,key function}.  Previously, every element of
a list was wrapped with a temporary object that remembered the key value
associated with each element.  Now, two arrays of keys and values are
sorted in parallel.  This saves the memory consumed by the sort wrappers,
and it saves time lost to delegating comparisons.

(Patch by Daniel Stutzbach in bpo-9915@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9915}.)

@item 
JSON decoding performance is improved and memory consumption is reduced
whenever the same string is repeated for multiple keys.  Also, JSON encoding
now uses the C speedups when the @code{sort_keys} argument is true.

(Contributed by Antoine Pitrou in bpo-7451@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7451} and by Raymond Hettinger and
Antoine Pitrou in bpo-10314@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10314}.)

@item 
Recursive locks (created with the @ref{32c,,threading.RLock()} API) now benefit
from a C implementation which makes them as fast as regular locks, and between
10x and 15x faster than their previous pure Python implementation.

(Contributed by Antoine Pitrou; bpo-3001@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3001}.)

@item 
The fast-search algorithm in stringlib is now used by the @ref{10b0,,split()},
@ref{1461,,rsplit()}, @ref{1462,,splitlines()} and @ref{4b9,,replace()} methods on
@ref{193,,bytes}, @ref{342,,bytearray} and @ref{16a,,str} objects. Likewise, the
algorithm is also used by @ref{10af,,rfind()}, @ref{1463,,rindex()}, @code{rsplit()} and
@ref{1464,,rpartition()}.

(Patch by Florent Xicluna in bpo-7622@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7622} and bpo-7462@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7462}.)

@item 
Integer to string conversions now work two “digits” at a time, reducing the
number of division and modulo operations.

(bpo-6713@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6713} by Gawain Bolton, Mark Dickinson, and Victor Stinner.)
@end itemize

There were several other minor optimizations. Set differencing now runs faster
when one operand is much larger than the other (patch by Andress Bennetts in
bpo-8685@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8685}).  The @code{array.repeat()} method has a faster implementation
(bpo-1569291@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1569291} by Alexander Belopolsky). The @ref{12d7,,BaseHTTPRequestHandler}
has more efficient buffering (bpo-3709@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3709} by Andrew Schaaf).  The
@ref{1039,,operator.attrgetter()} function has been sped-up (bpo-10160@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10160} by
Christos Georgiou).  And @ref{4df,,ConfigParser} loads multi-line arguments a bit
faster (bpo-7113@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7113} by Łukasz Langa).

@node Unicode,Codecs,Optimizations<12>,What’s New In Python 3 2
@anchor{whatsnew/3 2 unicode}@anchor{1465}
@subsection Unicode


Python has been updated to Unicode 6.0.0@footnote{https://unicode.org/versions/Unicode6.0.0/}.  The update to the standard adds
over 2,000 new characters including emoji@footnote{https://en.wikipedia.org/wiki/Emoji}
symbols which are important for mobile phones.

In addition, the updated standard has altered the character properties for two
Kannada characters (U+0CF1, U+0CF2) and one New Tai Lue numeric character
(U+19DA), making the former eligible for use in identifiers while disqualifying
the latter.  For more information, see Unicode Character Database Changes@footnote{https://www.unicode.org/versions/Unicode6.0.0/#Database_Changes}.

@node Codecs,Documentation,Unicode,What’s New In Python 3 2
@anchor{whatsnew/3 2 codecs}@anchor{1466}
@subsection Codecs


Support was added for `cp720' Arabic DOS encoding (bpo-1616979@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1616979}).

MBCS encoding no longer ignores the error handler argument. In the default
strict mode, it raises an @ref{c0e,,UnicodeDecodeError} when it encounters an
undecodable byte sequence and an @ref{889,,UnicodeEncodeError} for an unencodable
character.

The MBCS codec supports @code{'strict'} and @code{'ignore'} error handlers for
decoding, and @code{'strict'} and @code{'replace'} for encoding.

To emulate Python3.1 MBCS encoding, select the @code{'ignore'} handler for decoding
and the @code{'replace'} handler for encoding.

On Mac OS X, Python decodes command line arguments with @code{'utf-8'} rather than
the locale encoding.

By default, @ref{e4,,tarfile} uses @code{'utf-8'} encoding on Windows (instead of
@code{'mbcs'}) and the @code{'surrogateescape'} error handler on all operating
systems.

@node Documentation,IDLE,Codecs,What’s New In Python 3 2
@anchor{whatsnew/3 2 documentation}@anchor{1467}
@subsection Documentation


The documentation continues to be improved.


@itemize *

@item 
A table of quick links has been added to the top of lengthy sections such as
@ref{1468,,Built-in Functions}.  In the case of @ref{85,,itertools}, the links are
accompanied by tables of cheatsheet-style summaries to provide an overview and
memory jog without having to read all of the docs.

@item 
In some cases, the pure Python source code can be a helpful adjunct to the
documentation, so now many modules now feature quick links to the latest
version of the source code.  For example, the @ref{63,,functools} module
documentation has a quick link at the top labeled:

@quotation

`Source code' Lib/functools.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/functools.py}.
@end quotation

(Contributed by Raymond Hettinger; see
rationale@footnote{https://rhettinger.wordpress.com/2011/01/28/open-your-source-more/}.)

@item 
The docs now contain more examples and recipes.  In particular, @ref{be,,re}
module has an extensive section, @ref{1469,,Regular Expression Examples}.  Likewise, the
@ref{85,,itertools} module continues to be updated with new
@ref{146a,,Itertools Recipes}.

@item 
The @ref{34,,datetime} module now has an auxiliary implementation in pure Python.
No functionality was changed.  This just provides an easier-to-read alternate
implementation.

(Contributed by Alexander Belopolsky in bpo-9528@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9528}.)

@item 
The unmaintained @code{Demo} directory has been removed.  Some demos were
integrated into the documentation, some were moved to the @code{Tools/demo}
directory, and others were removed altogether.

(Contributed by Georg Brandl in bpo-7962@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7962}.)
@end itemize

@node IDLE,Code Repository,Documentation,What’s New In Python 3 2
@anchor{whatsnew/3 2 idle}@anchor{146b}
@subsection IDLE



@itemize *

@item 
The format menu now has an option to clean source files by stripping
trailing whitespace.

(Contributed by Raymond Hettinger; bpo-5150@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5150}.)

@item 
IDLE on Mac OS X now works with both Carbon AquaTk and Cocoa AquaTk.

(Contributed by Kevin Walzer, Ned Deily, and Ronald Oussoren; bpo-6075@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6075}.)
@end itemize

@node Code Repository,Build and C API Changes<5>,IDLE,What’s New In Python 3 2
@anchor{whatsnew/3 2 code-repository}@anchor{146c}
@subsection Code Repository


In addition to the existing Subversion code repository at @indicateurl{https://svn.python.org}
there is now a Mercurial@footnote{https://www.mercurial-scm.org/} repository at
@indicateurl{https://hg.python.org/}.

After the 3.2 release, there are plans to switch to Mercurial as the primary
repository.  This distributed version control system should make it easier for
members of the community to create and share external changesets.  See
@geindex Python Enhancement Proposals; PEP 385
PEP 385@footnote{https://peps.python.org/pep-0385/} for details.

To learn to use the new version control system, see the Quick Start@footnote{https://www.mercurial-scm.org/wiki/QuickStart} or the Guide to Mercurial Workflows@footnote{https://www.mercurial-scm.org/guide}.

@node Build and C API Changes<5>,Porting to Python 3 2,Code Repository,What’s New In Python 3 2
@anchor{whatsnew/3 2 build-and-c-api-changes}@anchor{146d}
@subsection Build and C API Changes


Changes to Python’s build process and to the C API include:


@itemize *

@item 
The `idle', `pydoc' and `2to3' scripts are now installed with a
version-specific suffix on @code{make altinstall} (bpo-10679@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10679}).

@item 
The C functions that access the Unicode Database now accept and return
characters from the full Unicode range, even on narrow unicode builds
(Py_UNICODE_TOLOWER, Py_UNICODE_ISDECIMAL, and others).  A visible difference
in Python is that @ref{146e,,unicodedata.numeric()} now returns the correct value
for large code points, and @ref{1c3,,repr()} may consider more characters as
printable.

(Reported by Bupjoe Lee and fixed by Amaury Forgeot D’Arc; bpo-5127@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5127}.)

@item 
Computed gotos are now enabled by default on supported compilers (which are
detected by the configure script).  They can still be disabled selectively by
specifying @code{--without-computed-gotos}.

(Contributed by Antoine Pitrou; bpo-9203@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9203}.)

@item 
The option @code{--with-wctype-functions} was removed.  The built-in unicode
database is now used for all functions.

(Contributed by Amaury Forgeot D’Arc; bpo-9210@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9210}.)

@item 
Hash values are now values of a new type, @ref{146f,,Py_hash_t}, which is
defined to be the same size as a pointer.  Previously they were of type long,
which on some 64-bit operating systems is still only 32 bits long.  As a
result of this fix, @ref{185,,set} and @ref{184,,dict} can now hold more than
@code{2**32} entries on builds with 64-bit pointers (previously, they could grow
to that size but their performance degraded catastrophically).

(Suggested by Raymond Hettinger and implemented by Benjamin Peterson;
bpo-9778@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9778}.)

@item 
A new macro @code{Py_VA_COPY} copies the state of the variable argument
list.  It is equivalent to C99 `va_copy' but available on all Python platforms
(bpo-2443@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2443}).

@item 
A new C API function @code{PySys_SetArgvEx()} allows an embedded interpreter
to set @ref{1470,,sys.argv} without also modifying @ref{3e2,,sys.path}
(bpo-5753@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5753}).

@item 
@code{PyEval_CallObject()} is now only available in macro form.  The
function declaration, which was kept for backwards compatibility reasons, is
now removed – the macro was introduced in 1997 (bpo-8276@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8276}).

@item 
There is a new function @ref{1471,,PyLong_AsLongLongAndOverflow()} which
is analogous to @ref{1472,,PyLong_AsLongAndOverflow()}.  They both serve to
convert Python @ref{19c,,int} into a native fixed-width type while providing
detection of cases where the conversion won’t fit (bpo-7767@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7767}).

@item 
The @ref{1473,,PyUnicode_CompareWithASCIIString()} function now returns `not
equal' if the Python string is `NUL' terminated.

@item 
There is a new function @ref{1474,,PyErr_NewExceptionWithDoc()} that is
like @ref{1475,,PyErr_NewException()} but allows a docstring to be specified.
This lets C exceptions have the same self-documenting capabilities as
their pure Python counterparts (bpo-7033@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7033}).

@item 
When compiled with the @code{--with-valgrind} option, the pymalloc
allocator will be automatically disabled when running under Valgrind.  This
gives improved memory leak detection when running under Valgrind, while taking
advantage of pymalloc at other times (bpo-2422@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2422}).

@item 
Removed the @code{O?} format from the `PyArg_Parse' functions.  The format is no
longer used and it had never been documented (bpo-8837@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8837}).
@end itemize

There were a number of other small changes to the C-API.  See the
Misc/NEWS@footnote{https://github.com/python/cpython/blob/v3.2.6/Misc/NEWS}
file for a complete list.

Also, there were a number of updates to the Mac OS X build, see
Mac/BuildScript/README.txt@footnote{https://github.com/python/cpython/blob/v3.2.6/Mac/BuildScript/README.txt}
for details.  For users running a 32/64-bit
build, there is a known problem with the default Tcl/Tk on Mac OS X 10.6.
Accordingly, we recommend installing an updated alternative such as
ActiveState Tcl/Tk 8.5.9@footnote{https://web.archive.org/web/20101208191259/https://www.activestate.com/activetcl/downloads}.
See @indicateurl{https://www.python.org/download/mac/tcltk/} for additional details.

@node Porting to Python 3 2,,Build and C API Changes<5>,What’s New In Python 3 2
@anchor{whatsnew/3 2 porting-to-python-3-2}@anchor{1476}
@subsection Porting to Python 3.2


This section lists previously described changes and other bugfixes that may
require changes to your code:


@itemize *

@item 
The @ref{26,,configparser} module has a number of clean-ups.  The major change is
to replace the old @code{ConfigParser} class with long-standing preferred
alternative @code{SafeConfigParser}.  In addition there are a number of
smaller incompatibilities:


@itemize *

@item 
The interpolation syntax is now validated on
@ref{1477,,get()} and
@ref{1478,,set()} operations. In the default
interpolation scheme, only two tokens with percent signs are valid: @code{%(name)s}
and @code{%%}, the latter being an escaped percent sign.

@item 
The @ref{1478,,set()} and
@ref{1479,,add_section()} methods now verify that
values are actual strings.  Formerly, unsupported types could be introduced
unintentionally.

@item 
Duplicate sections or options from a single source now raise either
@ref{147a,,DuplicateSectionError} or
@ref{147b,,DuplicateOptionError}.  Formerly, duplicates would
silently overwrite a previous entry.

@item 
Inline comments are now disabled by default so now the `;' character
can be safely used in values.

@item 
Comments now can be indented.  Consequently, for `;' or `#' to appear at
the start of a line in multiline values, it has to be interpolated.  This
keeps comment prefix characters in values from being mistaken as comments.

@item 
@code{""} is now a valid value and is no longer automatically converted to an
empty string. For empty strings, use @code{"option ="} in a line.
@end itemize

@item 
The @code{nntplib} module was reworked extensively, meaning that its APIs
are often incompatible with the 3.1 APIs.

@item 
@ref{342,,bytearray} objects can no longer be used as filenames; instead,
they should be converted to @ref{193,,bytes}.

@item 
The @code{array.tostring()} and @code{array.fromstring()} have been renamed to
@ref{147c,,array.tobytes()} and
@ref{147d,,array.frombytes()} for clarity.  The old names
have been deprecated. (See bpo-8990@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8990}.)

@item 
@code{PyArg_Parse*()} functions:


@itemize *

@item 
“t#” format has been removed: use “s#” or “s*” instead

@item 
“w” and “w#” formats has been removed: use “w*” instead
@end itemize

@item 
The @code{PyCObject} type, deprecated in 3.1, has been removed.  To wrap
opaque C pointers in Python objects, the @ref{147e,,PyCapsule} API should be used
instead; the new type has a well-defined interface for passing typing safety
information and a less complicated signature for calling a destructor.

@item 
The @code{sys.setfilesystemencoding()} function was removed because
it had a flawed design.

@item 
The @ref{147f,,random.seed()} function and method now salt string seeds with an
sha512 hash function.  To access the previous version of `seed' in order to
reproduce Python 3.1 sequences, set the `version' argument to `1',
@code{random.seed(s, version=1)}.

@item 
The previously deprecated @code{string.maketrans()} function has been removed
in favor of the static methods @ref{1480,,bytes.maketrans()} and
@ref{1481,,bytearray.maketrans()}.  This change solves the confusion around which
types were supported by the @ref{d8,,string} module.  Now, @ref{16a,,str},
@ref{193,,bytes}, and @ref{342,,bytearray} each have their own `maketrans' and
`translate' methods with intermediate translation tables of the appropriate
type.

(Contributed by Georg Brandl; bpo-5675@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5675}.)

@item 
The previously deprecated @code{contextlib.nested()} function has been removed
in favor of a plain @ref{187,,with} statement which can accept multiple
context managers.  The latter technique is faster (because it is built-in),
and it does a better job finalizing multiple context managers when one of them
raises an exception:

@example
with open('mylog.txt') as infile, open('a.out', 'w') as outfile:
    for line in infile:
        if '<critical>' in line:
            outfile.write(line)
@end example

(Contributed by Georg Brandl and Mattias Brändström;
appspot issue 53094@footnote{https://codereview.appspot.com/53094}.)

@item 
@ref{1482,,struct.pack()} now only allows bytes for the @code{s} string pack code.
Formerly, it would accept text arguments and implicitly encode them to bytes
using UTF-8.  This was problematic because it made assumptions about the
correct encoding and because a variable-length encoding can fail when writing
to fixed length segment of a structure.

Code such as @code{struct.pack('<6sHHBBB', 'GIF87a', x, y)} should be rewritten
with to use bytes instead of text, @code{struct.pack('<6sHHBBB', b'GIF87a', x, y)}.

(Discovered by David Beazley and fixed by Victor Stinner; bpo-10783@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10783}.)

@item 
The @ref{12c,,xml.etree.ElementTree} class now raises an
@ref{1483,,xml.etree.ElementTree.ParseError} when a parse fails. Previously it
raised an @ref{1484,,xml.parsers.expat.ExpatError}.

@item 
The new, longer @ref{16a,,str()} value on floats may break doctests which rely on
the old output format.

@item 
In @ref{4b8,,subprocess.Popen}, the default value for `close_fds' is now
@code{True} under Unix; under Windows, it is @code{True} if the three standard
streams are set to @code{None}, @code{False} otherwise.  Previously, `close_fds'
was always @code{False} by default, which produced difficult to solve bugs
or race conditions when open file descriptors would leak into the child
process.

@item 
Support for legacy HTTP 0.9 has been removed from @ref{112,,urllib.request}
and @ref{73,,http.client}.  Such support is still present on the server side
(in @ref{76,,http.server}).

(Contributed by Antoine Pitrou, bpo-10711@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10711}.)

@item 
SSL sockets in timeout mode now raise @ref{a3b,,socket.timeout} when a timeout
occurs, rather than a generic @ref{1485,,SSLError}.

(Contributed by Antoine Pitrou, bpo-10272@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10272}.)

@item 
The misleading functions @code{PyEval_AcquireLock()} and
@code{PyEval_ReleaseLock()} have been officially deprecated.  The
thread-state aware APIs (such as @ref{647,,PyEval_SaveThread()}
and @ref{648,,PyEval_RestoreThread()}) should be used instead.

@item 
Due to security risks, @code{asyncore.handle_accept()} has been deprecated, and
a new function, @code{asyncore.handle_accepted()}, was added to replace it.

(Contributed by Giampaolo Rodola in bpo-6706@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6706}.)

@item 
Due to the new @ref{165,,GIL} implementation, @code{PyEval_InitThreads()}
cannot be called before @ref{45e,,Py_Initialize()} anymore.
@end itemize

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node What’s New In Python 3 1,What’s New In Python 3 0,What’s New In Python 3 2,What’s New in Python
@anchor{whatsnew/3 1 doc}@anchor{1486}@anchor{whatsnew/3 1 translation-repo}@anchor{1487}@anchor{whatsnew/3 1 what-s-new-in-python-3-1}@anchor{1488}
@section What’s New In Python 3.1


@*Author: 
Raymond Hettinger


@c $Id$
@c Rules for maintenance:
@c 
@c * Anyone can add text to this document.  Do not spend very much time
@c on the wording of your changes, because your text will probably
@c get rewritten to some degree.
@c 
@c * The maintainer will go through Misc/NEWS periodically and add
@c changes; it's therefore more important to add your changes to
@c Misc/NEWS than to this file.
@c 
@c * This is not a complete list of every single change; completeness
@c is the purpose of Misc/NEWS.  Some changes I consider too small
@c or esoteric to include.  If such a change is added to the text,
@c I'll just remove it.  (This is another reason you shouldn't spend
@c too much time on writing your addition.)
@c 
@c * If you want to draw your new text to the attention of the
@c maintainer, add 'XXX' to the beginning of the paragraph or
@c section.
@c 
@c * It's OK to just add a fragmentary note about a change.  For
@c example: "XXX Describe the transmogrify() function added to the
@c socket module."  The maintainer will research the change and
@c write the necessary text.
@c 
@c * You can comment out your additions if you like, but it's not
@c necessary (especially when a final release is some months away).
@c 
@c * Credit the author of a patch or bugfix.   Just the name is
@c sufficient; the e-mail address isn't necessary.
@c 
@c * It's helpful to add the bug/patch number as a comment:
@c 
@c % Patch 12345
@c XXX Describe the transmogrify() function added to the socket
@c module.
@c (Contributed by P.Y. Developer.)
@c 
@c This saves the maintainer the effort of going through the SVN log
@c when researching a change.

This article explains the new features in Python 3.1, compared to 3.0.
Python 3.1 was released on June 27, 2009.

@menu
* PEP 372; Ordered Dictionaries: PEP 372 Ordered Dictionaries. 
* PEP 378; Format Specifier for Thousands Separator: PEP 378 Format Specifier for Thousands Separator. 
* Other Language Changes: Other Language Changes<13>. 
* New@comma{} Improved@comma{} and Deprecated Modules: New Improved and Deprecated Modules<2>. 
* Optimizations: Optimizations<13>. 
* IDLE: IDLE<2>. 
* Build and C API Changes: Build and C API Changes<6>. 
* Porting to Python 3.1: Porting to Python 3 1. 

@end menu

@node PEP 372 Ordered Dictionaries,PEP 378 Format Specifier for Thousands Separator,,What’s New In Python 3 1
@anchor{whatsnew/3 1 pep-372-ordered-dictionaries}@anchor{1489}
@subsection PEP 372: Ordered Dictionaries


Regular Python dictionaries iterate over key/value pairs in arbitrary order.
Over the years, a number of authors have written alternative implementations
that remember the order that the keys were originally inserted.  Based on
the experiences from those implementations, a new
@ref{7f4,,collections.OrderedDict} class has been introduced.

The OrderedDict API is substantially the same as regular dictionaries
but will iterate over keys and values in a guaranteed order depending on
when a key was first inserted.  If a new entry overwrites an existing entry,
the original insertion position is left unchanged.  Deleting an entry and
reinserting it will move it to the end.

The standard library now supports use of ordered dictionaries in several
modules.  The @ref{26,,configparser} module uses them by default.  This lets
configuration files be read, modified, and then written back in their original
order.  The `_asdict()' method for @ref{4e1,,collections.namedtuple()} now
returns an ordered dictionary with the values appearing in the same order as
the underlying tuple indices.  The @ref{86,,json} module is being built-out with
an `object_pairs_hook' to allow OrderedDicts to be built by the decoder.
Support was also added for third-party tools like PyYAML@footnote{https://pyyaml.org/}.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 372

@item PEP 372@footnote{https://peps.python.org/pep-0372/} - Ordered Dictionaries

PEP written by Armin Ronacher and Raymond Hettinger.  Implementation
written by Raymond Hettinger.
@end table


Since an ordered dictionary remembers its insertion order, it can be used
in conjunction with sorting to make a sorted dictionary:

@example
>>> # regular unsorted dictionary
>>> d = @{'banana': 3, 'apple':4, 'pear': 1, 'orange': 2@}

>>> # dictionary sorted by key
>>> OrderedDict(sorted(d.items(), key=lambda t: t[0]))
OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])

>>> # dictionary sorted by value
>>> OrderedDict(sorted(d.items(), key=lambda t: t[1]))
OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)])

>>> # dictionary sorted by length of the key string
>>> OrderedDict(sorted(d.items(), key=lambda t: len(t[0])))
OrderedDict([('pear', 1), ('apple', 4), ('orange', 2), ('banana', 3)])
@end example

The new sorted dictionaries maintain their sort order when entries
are deleted.  But when new keys are added, the keys are appended
to the end and the sort is not maintained.

@node PEP 378 Format Specifier for Thousands Separator,Other Language Changes<13>,PEP 372 Ordered Dictionaries,What’s New In Python 3 1
@anchor{whatsnew/3 1 pep-378-format-specifier-for-thousands-separator}@anchor{148a}
@subsection PEP 378: Format Specifier for Thousands Separator


The built-in @ref{19a,,format()} function and the @ref{834,,str.format()} method use
a mini-language that now includes a simple, non-locale aware way to format
a number with a thousands separator.  That provides a way to humanize a
program’s output, improving its professional appearance and readability:

@example
>>> format(1234567, ',d')
'1,234,567'
>>> format(1234567.89, ',.2f')
'1,234,567.89'
>>> format(12345.6 + 8901234.12j, ',f')
'12,345.600000+8,901,234.120000j'
>>> format(Decimal('1234567.89'), ',f')
'1,234,567.89'
@end example

The supported types are @ref{19c,,int}, @ref{197,,float}, @ref{198,,complex}
and @ref{200,,decimal.Decimal}.

Discussions are underway about how to specify alternative separators
like dots, spaces, apostrophes, or underscores.  Locale-aware applications
should use the existing `n' format specifier which already has some support
for thousands separators.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 378

@item PEP 378@footnote{https://peps.python.org/pep-0378/} - Format Specifier for Thousands Separator

PEP written by Raymond Hettinger and implemented by Eric Smith and
Mark Dickinson.
@end table


@node Other Language Changes<13>,New Improved and Deprecated Modules<2>,PEP 378 Format Specifier for Thousands Separator,What’s New In Python 3 1
@anchor{whatsnew/3 1 other-language-changes}@anchor{148b}
@subsection Other Language Changes


Some smaller changes made to the core Python language are:


@itemize *

@item 
Directories and zip archives containing a @code{__main__.py}
file can now be executed directly by passing their name to the
interpreter. The directory/zipfile is automatically inserted as the
first entry in sys.path.  (Suggestion and initial patch by Andy Chu;
revised patch by Phillip J. Eby and Nick Coghlan; bpo-1739468@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1739468}.)

@item 
The @ref{19c,,int()} type gained a @code{bit_length} method that returns the
number of bits necessary to represent its argument in binary:

@example
>>> n = 37
>>> bin(37)
'0b100101'
>>> n.bit_length()
6
>>> n = 2**123-1
>>> n.bit_length()
123
>>> (n+1).bit_length()
124
@end example

(Contributed by Fredrik Johansson, Victor Stinner, Raymond Hettinger,
and Mark Dickinson; bpo-3439@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3439}.)

@item 
The fields in @ref{19a,,format()} strings can now be automatically
numbered:

@example
>>> 'Sir @{@} of @{@}'.format('Gallahad', 'Camelot')
'Sir Gallahad of Camelot'
@end example

Formerly, the string would have required numbered fields such as:
@code{'Sir @{0@} of @{1@}'}.

(Contributed by Eric Smith; bpo-5237@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5237}.)

@item 
The @code{string.maketrans()} function is deprecated and is replaced by new
static methods, @ref{1480,,bytes.maketrans()} and @ref{1481,,bytearray.maketrans()}.
This change solves the confusion around which types were supported by the
@ref{d8,,string} module. Now, @ref{16a,,str}, @ref{193,,bytes}, and
@ref{342,,bytearray} each have their own `maketrans' and `translate'
methods with intermediate translation tables of the appropriate type.

(Contributed by Georg Brandl; bpo-5675@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5675}.)

@item 
The syntax of the @ref{187,,with} statement now allows multiple context
managers in a single statement:

@example
>>> with open('mylog.txt') as infile, open('a.out', 'w') as outfile:
...     for line in infile:
...         if '<critical>' in line:
...             outfile.write(line)
@end example

With the new syntax, the @code{contextlib.nested()} function is no longer
needed and is now deprecated.

(Contributed by Georg Brandl and Mattias Brändström;
appspot issue 53094@footnote{https://codereview.appspot.com/53094}.)

@item 
@code{round(x, n)} now returns an integer if `x' is an integer.
Previously it returned a float:

@example
>>> round(1123, -2)
1100
@end example

(Contributed by Mark Dickinson; bpo-4707@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4707}.)

@item 
Python now uses David Gay’s algorithm for finding the shortest floating-point
representation that doesn’t change its value.  This should help
mitigate some of the confusion surrounding binary floating-point
numbers.

The significance is easily seen with a number like @code{1.1} which does not
have an exact equivalent in binary floating point.  Since there is no exact
equivalent, an expression like @code{float('1.1')} evaluates to the nearest
representable value which is @code{0x1.199999999999ap+0} in hex or
@code{1.100000000000000088817841970012523233890533447265625} in decimal. That
nearest value was and still is used in subsequent floating-point
calculations.

What is new is how the number gets displayed.  Formerly, Python used a
simple approach.  The value of @code{repr(1.1)} was computed as @code{format(1.1,
'.17g')} which evaluated to @code{'1.1000000000000001'}. The advantage of
using 17 digits was that it relied on IEEE-754 guarantees to assure that
@code{eval(repr(1.1))} would round-trip exactly to its original value.  The
disadvantage is that many people found the output to be confusing (mistaking
intrinsic limitations of binary floating-point representation as being a
problem with Python itself).

The new algorithm for @code{repr(1.1)} is smarter and returns @code{'1.1'}.
Effectively, it searches all equivalent string representations (ones that
get stored with the same underlying float value) and returns the shortest
representation.

The new algorithm tends to emit cleaner representations when possible, but
it does not change the underlying values.  So, it is still the case that
@code{1.1 + 2.2 != 3.3} even though the representations may suggest otherwise.

The new algorithm depends on certain features in the underlying floating-point
implementation.  If the required features are not found, the old
algorithm will continue to be used.  Also, the text pickle protocols
assure cross-platform portability by using the old algorithm.

(Contributed by Eric Smith and Mark Dickinson; bpo-1580@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1580})
@end itemize

@node New Improved and Deprecated Modules<2>,Optimizations<13>,Other Language Changes<13>,What’s New In Python 3 1
@anchor{whatsnew/3 1 new-improved-and-deprecated-modules}@anchor{148c}
@subsection New, Improved, and Deprecated Modules



@itemize *

@item 
Added a @ref{129d,,collections.Counter} class to support convenient
counting of unique items in a sequence or iterable:

@example
>>> Counter(['red', 'blue', 'red', 'green', 'blue', 'blue'])
Counter(@{'blue': 3, 'red': 2, 'green': 1@})
@end example

(Contributed by Raymond Hettinger; bpo-1696199@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1696199}.)

@item 
Added a new module, @ref{100,,tkinter.ttk} for access to the Tk themed widget set.
The basic idea of ttk is to separate, to the extent possible, the code
implementing a widget’s behavior from the code implementing its appearance.

(Contributed by Guilherme Polo; bpo-2983@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2983}.)

@item 
The @ref{65c,,gzip.GzipFile} and @ref{a6c,,bz2.BZ2File} classes now support
the context management protocol:

@example
>>> # Automatically close file after writing
>>> with gzip.GzipFile(filename, "wb") as f:
...     f.write(b"xxx")
@end example

(Contributed by Antoine Pitrou.)

@item 
The @ref{3a,,decimal} module now supports methods for creating a
decimal object from a binary @ref{197,,float}.  The conversion is
exact but can sometimes be surprising:

@example
>>> Decimal.from_float(1.1)
Decimal('1.100000000000000088817841970012523233890533447265625')
@end example

The long decimal result shows the actual binary fraction being
stored for `1.1'.  The fraction has many digits because `1.1' cannot
be exactly represented in binary.

(Contributed by Raymond Hettinger and Mark Dickinson.)

@item 
The @ref{85,,itertools} module grew two new functions.  The
@ref{148d,,itertools.combinations_with_replacement()} function is one of
four for generating combinatorics including permutations and Cartesian
products.  The @ref{148e,,itertools.compress()} function mimics its namesake
from APL.  Also, the existing @ref{148f,,itertools.count()} function now has
an optional `step' argument and can accept any type of counting
sequence including @ref{215,,fractions.Fraction} and
@ref{200,,decimal.Decimal}:

@example
>>> [p+q for p,q in combinations_with_replacement('LOVE', 2)]
['LL', 'LO', 'LV', 'LE', 'OO', 'OV', 'OE', 'VV', 'VE', 'EE']

>>> list(compress(data=range(10), selectors=[0,0,1,1,0,1,0,1,0,0]))
[2, 3, 5, 7]

>>> c = count(start=Fraction(1,2), step=Fraction(1,6))
>>> [next(c), next(c), next(c), next(c)]
[Fraction(1, 2), Fraction(2, 3), Fraction(5, 6), Fraction(1, 1)]
@end example

(Contributed by Raymond Hettinger.)

@item 
@ref{4e1,,collections.namedtuple()} now supports a keyword argument
`rename' which lets invalid fieldnames be automatically converted to
positional names in the form _0, _1, etc.  This is useful when
the field names are being created by an external source such as a
CSV header, SQL field list, or user input:

@example
>>> query = input()
SELECT region, dept, count(*) FROM main GROUPBY region, dept

>>> cursor.execute(query)
>>> query_fields = [desc[0] for desc in cursor.description]
>>> UserQuery = namedtuple('UserQuery', query_fields, rename=True)
>>> pprint.pprint([UserQuery(*row) for row in cursor])
[UserQuery(region='South', dept='Shipping', _2=185),
 UserQuery(region='North', dept='Accounting', _2=37),
 UserQuery(region='West', dept='Sales', _2=419)]
@end example

(Contributed by Raymond Hettinger; bpo-1818@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1818}.)

@item 
The @ref{5a3,,re.sub()}, @ref{5a4,,re.subn()} and @ref{5a2,,re.split()} functions now
accept a flags parameter.

(Contributed by Gregory Smith.)

@item 
The @ref{8b,,logging} module now implements a simple @ref{1490,,logging.NullHandler}
class for applications that are not using logging but are calling
library code that does.  Setting-up a null handler will suppress
spurious warnings such as “No handlers could be found for logger foo”:

@example
>>> h = logging.NullHandler()
>>> logging.getLogger("foo").addHandler(h)
@end example

(Contributed by Vinay Sajip; bpo-4384@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4384}).

@item 
The @ref{c3,,runpy} module which supports the @code{-m} command line switch
now supports the execution of packages by looking for and executing
a @code{__main__} submodule when a package name is supplied.

(Contributed by Andi Vajda; bpo-4195@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4195}.)

@item 
The @ref{aa,,pdb} module can now access and display source code loaded via
@ref{139,,zipimport} (or any other conformant 
@geindex Python Enhancement Proposals; PEP 302
PEP 302@footnote{https://peps.python.org/pep-0302/} loader).

(Contributed by Alexander Belopolsky; bpo-4201@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4201}.)

@item 
@ref{219,,functools.partial} objects can now be pickled.
@end itemize

@quotation

(Suggested by Antoine Pitrou and Jesse Noller.  Implemented by
Jack Diederich; bpo-5228@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5228}.)
@end quotation


@itemize *

@item 
Add @ref{ba,,pydoc} help topics for symbols so that @code{help('@@')}
works as expected in the interactive environment.

(Contributed by David Laban; bpo-4739@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4739}.)

@item 
The @ref{10d,,unittest} module now supports skipping individual tests or classes
of tests. And it supports marking a test as an expected failure, a test that
is known to be broken, but shouldn’t be counted as a failure on a
TestResult:

@example
class TestGizmo(unittest.TestCase):

    @@unittest.skipUnless(sys.platform.startswith("win"), "requires Windows")
    def test_gizmo_on_windows(self):
        ...

    @@unittest.expectedFailure
    def test_gimzo_without_required_library(self):
        ...
@end example

Also, tests for exceptions have been builtout to work with context managers
using the @ref{187,,with} statement:

@example
def test_division_by_zero(self):
    with self.assertRaises(ZeroDivisionError):
        x / 0
@end example

In addition, several new assertion methods were added including
@ref{1491,,assertSetEqual()},
@ref{1492,,assertDictEqual()},
@code{assertDictContainsSubset()},
@ref{1493,,assertListEqual()},
@ref{1494,,assertTupleEqual()},
@ref{1495,,assertSequenceEqual()},
@ref{753,,assertRaisesRegexp()},
@ref{1496,,assertIsNone()},
and @ref{1497,,assertIsNotNone()}.

(Contributed by Benjamin Peterson and Antoine Pitrou.)

@item 
The @ref{83,,io} module has three new constants for the @ref{1498,,seek()}
method: @ref{1499,,SEEK_SET}, @ref{149a,,SEEK_CUR}, and @ref{149b,,SEEK_END}.

@item 
The @ref{8b1,,sys.version_info} tuple is now a named tuple:

@example
>>> sys.version_info
sys.version_info(major=3, minor=1, micro=0, releaselevel='alpha', serial=2)
@end example

(Contributed by Ross Light; bpo-4285@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4285}.)

@item 
The @code{nntplib} and @ref{78,,imaplib} modules now support IPv6.

(Contributed by Derek Morr; bpo-1655@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1655} and bpo-1664@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1664}.)

@item 
The @ref{ab,,pickle} module has been adapted for better interoperability with
Python 2.x when used with protocol 2 or lower.  The reorganization of the
standard library changed the formal reference for many objects.  For
example, @code{__builtin__.set} in Python 2 is called @code{builtins.set} in Python
3. This change confounded efforts to share data between different versions of
Python.  But now when protocol 2 or lower is selected, the pickler will
automatically use the old Python 2 names for both loading and dumping. This
remapping is turned-on by default but can be disabled with the `fix_imports'
option:

@example
>>> s = @{1, 2, 3@}
>>> pickle.dumps(s, protocol=0)
b'c__builtin__\nset\np0\n((lp1\nL1L\naL2L\naL3L\natp2\nRp3\n.'
>>> pickle.dumps(s, protocol=0, fix_imports=False)
b'cbuiltins\nset\np0\n((lp1\nL1L\naL2L\naL3L\natp2\nRp3\n.'
@end example

An unfortunate but unavoidable side-effect of this change is that protocol 2
pickles produced by Python 3.1 won’t be readable with Python 3.0. The latest
pickle protocol, protocol 3, should be used when migrating data between
Python 3.x implementations, as it doesn’t attempt to remain compatible with
Python 2.x.

(Contributed by Alexandre Vassalotti and Antoine Pitrou, bpo-6137@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6137}.)

@item 
A new module, @ref{7b,,importlib} was added.  It provides a complete, portable,
pure Python reference implementation of the @ref{7f9,,import} statement and its
counterpart, the @ref{ad7,,__import__()} function.  It represents a substantial
step forward in documenting and defining the actions that take place during
imports.

(Contributed by Brett Cannon.)
@end itemize

@node Optimizations<13>,IDLE<2>,New Improved and Deprecated Modules<2>,What’s New In Python 3 1
@anchor{whatsnew/3 1 optimizations}@anchor{149c}
@subsection Optimizations


Major performance enhancements have been added:


@itemize *

@item 
The new I/O library (as defined in 
@geindex Python Enhancement Proposals; PEP 3116
PEP 3116@footnote{https://peps.python.org/pep-3116/}) was mostly written in
Python and quickly proved to be a problematic bottleneck in Python 3.0.
In Python 3.1, the I/O library has been entirely rewritten in C and is
2 to 20 times faster depending on the task at hand. The pure Python
version is still available for experimentation purposes through
the @code{_pyio} module.

(Contributed by Amaury Forgeot d’Arc and Antoine Pitrou.)

@item 
Added a heuristic so that tuples and dicts containing only untrackable objects
are not tracked by the garbage collector. This can reduce the size of
collections and therefore the garbage collection overhead on long-running
programs, depending on their particular use of datatypes.

(Contributed by Antoine Pitrou, bpo-4688@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4688}.)

@item 
Enabling a configure option named @code{--with-computed-gotos}
on compilers that support it (notably: gcc, SunPro, icc), the bytecode
evaluation loop is compiled with a new dispatch mechanism which gives
speedups of up to 20%, depending on the system, the compiler, and
the benchmark.

(Contributed by Antoine Pitrou along with a number of other participants,
bpo-4753@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4753}).

@item 
The decoding of UTF-8, UTF-16 and LATIN-1 is now two to four times
faster.

(Contributed by Antoine Pitrou and Amaury Forgeot d’Arc, bpo-4868@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4868}.)

@item 
The @ref{86,,json} module now has a C extension to substantially improve
its performance.  In addition, the API was modified so that json works
only with @ref{16a,,str}, not with @ref{193,,bytes}.  That change makes the
module closely match the JSON specification@footnote{https://json.org/}
which is defined in terms of Unicode.

(Contributed by Bob Ippolito and converted to Py3.1 by Antoine Pitrou
and Benjamin Peterson; bpo-4136@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4136}.)

@item 
Unpickling now interns the attribute names of pickled objects.  This saves
memory and allows pickles to be smaller.

(Contributed by Jake McGuire and Antoine Pitrou; bpo-5084@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5084}.)
@end itemize

@node IDLE<2>,Build and C API Changes<6>,Optimizations<13>,What’s New In Python 3 1
@anchor{whatsnew/3 1 idle}@anchor{149d}
@subsection IDLE



@itemize *

@item 
IDLE’s format menu now provides an option to strip trailing whitespace
from a source file.

(Contributed by Roger D. Serwy; bpo-5150@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5150}.)
@end itemize

@node Build and C API Changes<6>,Porting to Python 3 1,IDLE<2>,What’s New In Python 3 1
@anchor{whatsnew/3 1 build-and-c-api-changes}@anchor{149e}
@subsection Build and C API Changes


Changes to Python’s build process and to the C API include:


@itemize *

@item 
Integers are now stored internally either in base @code{2**15} or in base
@code{2**30}, the base being determined at build time.  Previously, they
were always stored in base @code{2**15}.  Using base @code{2**30} gives
significant performance improvements on 64-bit machines, but
benchmark results on 32-bit machines have been mixed.  Therefore,
the default is to use base @code{2**30} on 64-bit machines and base @code{2**15}
on 32-bit machines; on Unix, there’s a new configure option
@code{--enable-big-digits} that can be used to override this default.

Apart from the performance improvements this change should be invisible to
end users, with one exception: for testing and debugging purposes there’s a
new @ref{149f,,sys.int_info} that provides information about the
internal format, giving the number of bits per digit and the size in bytes
of the C type used to store each digit:

@example
>>> import sys
>>> sys.int_info
sys.int_info(bits_per_digit=30, sizeof_digit=4)
@end example

(Contributed by Mark Dickinson; bpo-4258@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4258}.)

@item 
The @ref{14a0,,PyLong_AsUnsignedLongLong()} function now handles a negative
`pylong' by raising @ref{a87,,OverflowError} instead of @ref{199,,TypeError}.

(Contributed by Mark Dickinson and Lisandro Dalcrin; bpo-5175@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5175}.)

@item 
Deprecated @code{PyNumber_Int()}.  Use @ref{c63,,PyNumber_Long()} instead.

(Contributed by Mark Dickinson; bpo-4910@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4910}.)

@item 
Added a new @ref{14a1,,PyOS_string_to_double()} function to replace the
deprecated functions @code{PyOS_ascii_strtod()} and @code{PyOS_ascii_atof()}.

(Contributed by Mark Dickinson; bpo-5914@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5914}.)

@item 
Added @ref{147e,,PyCapsule} as a replacement for the @code{PyCObject} API.
The principal difference is that the new type has a well defined interface
for passing typing safety information and a less complicated signature
for calling a destructor.  The old type had a problematic API and is now
deprecated.

(Contributed by Larry Hastings; bpo-5630@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5630}.)
@end itemize

@node Porting to Python 3 1,,Build and C API Changes<6>,What’s New In Python 3 1
@anchor{whatsnew/3 1 porting-to-python-3-1}@anchor{14a2}
@subsection Porting to Python 3.1


This section lists previously described changes and other bugfixes
that may require changes to your code:


@itemize *

@item 
The new floating-point string representations can break existing doctests.
For example:

@example
def e():
    '@w{'}'Compute the base of natural logarithms.

    >>> e()
    2.7182818284590451

    '@w{'}'
    return sum(1/math.factorial(x) for x in reversed(range(30)))

doctest.testmod()

**********************************************************************
Failed example:
    e()
Expected:
    2.7182818284590451
Got:
    2.718281828459045
**********************************************************************
@end example

@item 
The automatic name remapping in the pickle module for protocol 2 or lower can
make Python 3.1 pickles unreadable in Python 3.0.  One solution is to use
protocol 3.  Another solution is to set the `fix_imports' option to @code{False}.
See the discussion above for more details.
@end itemize

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node What’s New In Python 3 0,What’s New in Python 2 7,What’s New In Python 3 1,What’s New in Python
@anchor{whatsnew/3 0 doc}@anchor{14a3}@anchor{whatsnew/3 0 translation-repo}@anchor{14a4}@anchor{whatsnew/3 0 what-s-new-in-python-3-0}@anchor{14a5}
@section What’s New In Python 3.0


@c XXX Add trademark info for Apple, Microsoft.

@*Author: 
Guido van Rossum


@c $Id$
@c Rules for maintenance:
@c 
@c * Anyone can add text to this document.  Do not spend very much time
@c on the wording of your changes, because your text will probably
@c get rewritten to some degree.
@c 
@c * The maintainer will go through Misc/NEWS periodically and add
@c changes; it's therefore more important to add your changes to
@c Misc/NEWS than to this file.  (Note: I didn't get to this for 3.0.
@c GvR.)
@c 
@c * This is not a complete list of every single change; completeness
@c is the purpose of Misc/NEWS.  Some changes I consider too small
@c or esoteric to include.  If such a change is added to the text,
@c I'll just remove it.  (This is another reason you shouldn't spend
@c too much time on writing your addition.)
@c 
@c * If you want to draw your new text to the attention of the
@c maintainer, add 'XXX' to the beginning of the paragraph or
@c section.
@c 
@c * It's OK to just add a fragmentary note about a change.  For
@c example: "XXX Describe the transmogrify() function added to the
@c socket module."  The maintainer will research the change and
@c write the necessary text.
@c 
@c * You can comment out your additions if you like, but it's not
@c necessary (especially when a final release is some months away).
@c 
@c * Credit the author of a patch or bugfix.   Just the name is
@c sufficient; the e-mail address isn't necessary.  (Due to time
@c constraints I haven't managed to do this for 3.0.  GvR.)
@c 
@c * It's helpful to add the bug/patch number as a comment:
@c 
@c % Patch 12345
@c XXX Describe the transmogrify() function added to the socket
@c module.
@c (Contributed by P.Y. Developer.)
@c 
@c This saves the maintainer the effort of going through the SVN log
@c when researching a change.  (Again, I didn't get to this for 3.0.
@c GvR.)

This article explains the new features in Python 3.0, compared to 2.6.
Python 3.0, also known as “Python 3000” or “Py3K”, is the first ever
`intentionally backwards incompatible' Python release. Python 3.0 was released on December 3, 2008.
There are more changes than in a typical release, and more that are important for all
Python users. Nevertheless, after digesting the changes, you’ll find
that Python really hasn’t changed all that much – by and large, we’re
mostly fixing well-known annoyances and warts, and removing a lot of
old cruft.

This article doesn’t attempt to provide a complete specification of
all new features, but instead tries to give a convenient overview.
For full details, you should refer to the documentation for Python
3.0, and/or the many PEPs referenced in the text. If you want to
understand the complete implementation and design rationale for a
particular feature, PEPs usually have more details than the regular
documentation; but note that PEPs usually are not kept up-to-date once
a feature has been fully implemented.

Due to time constraints this document is not as complete as it should
have been.  As always for a new release, the @code{Misc/NEWS} file in the
source distribution contains a wealth of detailed information about
every small thing that was changed.

@c Compare with previous release in 2 - 3 sentences here.

@c add hyperlink when the documentation becomes available online.

@c ======================================================================

@c Large, PEP-level features and changes should be described here.

@c Should there be a new section here for 3k migration?

@c Or perhaps a more general section describing module changes/deprecation?

@c sets module deprecated

@c ======================================================================

@menu
* Common Stumbling Blocks:: 
* Overview Of Syntax Changes:: 
* Changes Already Present In Python 2.6: Changes Already Present In Python 2 6. 
* Library Changes:: 
* PEP 3101; A New Approach To String Formatting: PEP 3101 A New Approach To String Formatting. 
* Changes To Exceptions:: 
* Miscellaneous Other Changes:: 
* Build and C API Changes: Build and C API Changes<7>. 
* Performance:: 
* Porting To Python 3.0: Porting To Python 3 0. 

@end menu

@node Common Stumbling Blocks,Overview Of Syntax Changes,,What’s New In Python 3 0
@anchor{whatsnew/3 0 common-stumbling-blocks}@anchor{14a6}
@subsection Common Stumbling Blocks


This section lists those few changes that are most likely to trip you
up if you’re used to Python 2.5.

@menu
* Print Is A Function:: 
* Views And Iterators Instead Of Lists:: 
* Ordering Comparisons:: 
* Integers:: 
* Text Vs. Data Instead Of Unicode Vs. 8-bit: Text Vs Data Instead Of Unicode Vs 8-bit. 

@end menu

@node Print Is A Function,Views And Iterators Instead Of Lists,,Common Stumbling Blocks
@anchor{whatsnew/3 0 print-is-a-function}@anchor{14a7}
@subsubsection Print Is A Function


The @code{print} statement has been replaced with a @ref{117b,,print()}
function, with keyword arguments to replace most of the special syntax
of the old @code{print} statement (
@geindex Python Enhancement Proposals; PEP 3105
PEP 3105@footnote{https://peps.python.org/pep-3105/}).  Examples:

@example
Old: print "The answer is", 2*2
New: print("The answer is", 2*2)

Old: print x,           # Trailing comma suppresses newline
New: print(x, end=" ")  # Appends a space instead of a newline

Old: print              # Prints a newline
New: print()            # You must call the function!

Old: print >>sys.stderr, "fatal error"
New: print("fatal error", file=sys.stderr)

Old: print (x, y)       # prints repr((x, y))
New: print((x, y))      # Not the same as print(x, y)!
@end example

You can also customize the separator between items, e.g.:

@example
print("There are <", 2**32, "> possibilities!", sep="")
@end example

which produces:

@example
There are <4294967296> possibilities!
@end example

Note:


@itemize *

@item 
The @ref{117b,,print()} function doesn’t support the “softspace” feature of
the old @code{print} statement.  For example, in Python 2.x,
@code{print "A\n", "B"} would write @code{"A\nB\n"}; but in Python 3.0,
@code{print("A\n", "B")} writes @code{"A\n B\n"}.

@item 
Initially, you’ll be finding yourself typing the old @code{print x}
a lot in interactive mode.  Time to retrain your fingers to type
@code{print(x)} instead!

@item 
When using the @code{2to3} source-to-source conversion tool, all
@code{print} statements are automatically converted to
@ref{117b,,print()} function calls, so this is mostly a non-issue for
larger projects.
@end itemize

@node Views And Iterators Instead Of Lists,Ordering Comparisons,Print Is A Function,Common Stumbling Blocks
@anchor{whatsnew/3 0 views-and-iterators-instead-of-lists}@anchor{14a8}
@subsubsection Views And Iterators Instead Of Lists


Some well-known APIs no longer return lists:


@itemize *

@item 
@ref{184,,dict} methods @ref{9d6,,dict.keys()}, @ref{9d8,,dict.items()} and
@ref{9d7,,dict.values()} return “views” instead of lists.  For example,
this no longer works: @code{k = d.keys(); k.sort()}.  Use @code{k =
sorted(d)} instead (this works in Python 2.5 too and is just
as efficient).

@item 
Also, the @code{dict.iterkeys()}, @code{dict.iteritems()} and
@code{dict.itervalues()} methods are no longer supported.

@item 
@ref{1a0,,map()} and @ref{a6a,,filter()} return iterators.  If you really need
a list and the input sequences are all of equal length, a quick
fix is to wrap @code{map()} in @ref{24f,,list()}, e.g. @code{list(map(...))},
but a better fix is
often to use a list comprehension (especially when the original code
uses @ref{14a9,,lambda}), or rewriting the code so it doesn’t need a
list at all.  Particularly tricky is @code{map()} invoked for the
side effects of the function; the correct transformation is to use a
regular @ref{348,,for} loop (since creating a list would just be
wasteful).

If the input sequences are not of equal length, @ref{1a0,,map()} will
stop at the termination of the shortest of the sequences. For full
compatibility with @code{map()} from Python 2.x, also wrap the sequences in
@ref{14aa,,itertools.zip_longest()}, e.g. @code{map(func, *sequences)} becomes
@code{list(map(func, itertools.zip_longest(*sequences)))}.

@item 
@ref{b43,,range()} now behaves like @code{xrange()} used to behave, except
it works with values of arbitrary size.  The latter no longer
exists.

@item 
@ref{1a1,,zip()} now returns an iterator.
@end itemize

@node Ordering Comparisons,Integers,Views And Iterators Instead Of Lists,Common Stumbling Blocks
@anchor{whatsnew/3 0 ordering-comparisons}@anchor{14ab}
@subsubsection Ordering Comparisons


Python 3.0 has simplified the rules for ordering comparisons:


@itemize *

@item 
The ordering comparison operators (@code{<}, @code{<=}, @code{>=}, @code{>})
raise a TypeError exception when the operands don’t have a
meaningful natural ordering.  Thus, expressions like @code{1 < '@w{'}}, @code{0
> None} or @code{len <= len} are no longer valid, and e.g. @code{None <
None} raises @ref{199,,TypeError} instead of returning
@code{False}.  A corollary is that sorting a heterogeneous list
no longer makes sense – all the elements must be comparable to each
other.  Note that this does not apply to the @code{==} and @code{!=}
operators: objects of different incomparable types always compare
unequal to each other.

@item 
@ref{dcd,,sorted()} and @ref{dce,,list.sort()} no longer accept the
`cmp' argument providing a comparison function.  Use the `key'
argument instead. N.B. the `key' and `reverse' arguments are now
“keyword-only”.

@item 
The @code{cmp()} function should be treated as gone, and the @code{__cmp__()}
special method is no longer supported.  Use @ref{14ac,,__lt__()} for sorting,
@ref{cf8,,__eq__()} with @ref{cf9,,__hash__()}, and other rich comparisons as needed.
(If you really need the @code{cmp()} functionality, you could use the
expression @code{(a > b) - (a < b)} as the equivalent for @code{cmp(a, b)}.)
@end itemize

@node Integers,Text Vs Data Instead Of Unicode Vs 8-bit,Ordering Comparisons,Common Stumbling Blocks
@anchor{whatsnew/3 0 integers}@anchor{14ad}
@subsubsection Integers



@itemize *

@item 
@geindex Python Enhancement Proposals; PEP 237
PEP 237@footnote{https://peps.python.org/pep-0237/}: Essentially, @code{long} renamed to @ref{19c,,int}.
That is, there is only one built-in integral type, named
@code{int}; but it behaves mostly like the old @code{long} type.

@item 
@geindex Python Enhancement Proposals; PEP 238
PEP 238@footnote{https://peps.python.org/pep-0238/}: An expression like @code{1/2} returns a float.  Use
@code{1//2} to get the truncating behavior.  (The latter syntax has
existed for years, at least since Python 2.2.)

@item 
The @code{sys.maxint} constant was removed, since there is no
longer a limit to the value of integers.  However, @ref{13d1,,sys.maxsize}
can be used as an integer larger than any practical list or string
index.  It conforms to the implementation’s “natural” integer size
and is typically the same as @code{sys.maxint} in previous releases
on the same platform (assuming the same build options).

@item 
The @ref{1c3,,repr()} of a long integer doesn’t include the trailing @code{L}
anymore, so code that unconditionally strips that character will
chop off the last digit instead.  (Use @ref{16a,,str()} instead.)

@item 
Octal literals are no longer of the form @code{0720}; use @code{0o720}
instead.
@end itemize

@node Text Vs Data Instead Of Unicode Vs 8-bit,,Integers,Common Stumbling Blocks
@anchor{whatsnew/3 0 text-vs-data-instead-of-unicode-vs-8-bit}@anchor{14ae}
@subsubsection Text Vs. Data Instead Of Unicode Vs. 8-bit


Everything you thought you knew about binary data and Unicode has
changed.


@itemize *

@item 
Python 3.0 uses the concepts of `text' and (binary) `data' instead
of Unicode strings and 8-bit strings.  All text is Unicode; however
`encoded' Unicode is represented as binary data.  The type used to
hold text is @ref{16a,,str}, the type used to hold data is
@ref{193,,bytes}.  The biggest difference with the 2.x situation is
that any attempt to mix text and data in Python 3.0 raises
@ref{199,,TypeError}, whereas if you were to mix Unicode and 8-bit
strings in Python 2.x, it would work if the 8-bit string happened to
contain only 7-bit (ASCII) bytes, but you would get
@ref{c0e,,UnicodeDecodeError} if it contained non-ASCII values.  This
value-specific behavior has caused numerous sad faces over the
years.

@item 
As a consequence of this change in philosophy, pretty much all code
that uses Unicode, encodings or binary data most likely has to
change.  The change is for the better, as in the 2.x world there
were numerous bugs having to do with mixing encoded and unencoded
text.  To be prepared in Python 2.x, start using @code{unicode}
for all unencoded text, and @ref{16a,,str} for binary or encoded data
only.  Then the @code{2to3} tool will do most of the work for you.

@item 
You can no longer use @code{u"..."} literals for Unicode text.
However, you must use @code{b"..."} literals for binary data.

@item 
As the @ref{16a,,str} and @ref{193,,bytes} types cannot be mixed, you
must always explicitly convert between them.  Use @ref{ad8,,str.encode()}
to go from @code{str} to @code{bytes}, and @ref{ad9,,bytes.decode()}
to go from @code{bytes} to @code{str}.  You can also use
@code{bytes(s, encoding=...)} and @code{str(b, encoding=...)},
respectively.

@item 
Like @ref{16a,,str}, the @ref{193,,bytes} type is immutable.  There is a
separate `mutable' type to hold buffered binary data,
@ref{342,,bytearray}.  Nearly all APIs that accept @code{bytes} also
accept @code{bytearray}.  The mutable API is based on
@ref{4c0,,collections.MutableSequence}.

@item 
All backslashes in raw string literals are interpreted literally.
This means that @code{'\U'} and @code{'\u'} escapes in raw strings are not
treated specially.  For example, @code{r'\u20ac'} is a string of 6
characters in Python 3.0, whereas in 2.6, @code{ur'\u20ac'} was the
single “euro” character.  (Of course, this change only affects raw
string literals; the euro character is @code{'\u20ac'} in Python 3.0.)

@item 
The built-in @code{basestring} abstract type was removed.  Use
@ref{16a,,str} instead.  The @code{str} and @ref{193,,bytes} types
don’t have functionality enough in common to warrant a shared base
class.  The @code{2to3} tool (see below) replaces every occurrence of
@code{basestring} with @code{str}.

@item 
Files opened as text files (still the default mode for @ref{318,,open()})
always use an encoding to map between strings (in memory) and bytes
(on disk).  Binary files (opened with a @code{b} in the mode argument)
always use bytes in memory.  This means that if a file is opened
using an incorrect mode or encoding, I/O will likely fail loudly,
instead of silently producing incorrect data.  It also means that
even Unix users will have to specify the correct mode (text or
binary) when opening a file.  There is a platform-dependent default
encoding, which on Unixy platforms can be set with the @code{LANG}
environment variable (and sometimes also with some other
platform-specific locale-related environment variables).  In many
cases, but not all, the system default is UTF-8; you should never
count on this default.  Any application reading or writing more than
pure ASCII text should probably have a way to override the encoding.
There is no longer any need for using the encoding-aware streams
in the @ref{1c,,codecs} module.

@item 
The initial values of @ref{760,,sys.stdin}, @ref{cd3,,sys.stdout} and
@ref{b39,,sys.stderr} are now unicode-only text files (i.e., they are
instances of @ref{8a6,,io.TextIOBase}).  To read and write bytes data
with these streams, you need to use their @ref{14af,,io.TextIOBase.buffer}
attribute.

@item 
Filenames are passed to and returned from APIs as (Unicode) strings.
This can present platform-specific problems because on some
platforms filenames are arbitrary byte strings.  (On the other hand,
on Windows filenames are natively stored as Unicode.)  As a
work-around, most APIs (e.g. @ref{318,,open()} and many functions in the
@ref{a5,,os} module) that take filenames accept @ref{193,,bytes} objects
as well as strings, and a few APIs have a way to ask for a
@code{bytes} return value.  Thus, @ref{1306,,os.listdir()} returns a
list of @code{bytes} instances if the argument is a @code{bytes}
instance, and @ref{c88,,os.getcwdb()} returns the current working
directory as a @code{bytes} instance.  Note that when
@code{os.listdir()} returns a list of strings, filenames that
cannot be decoded properly are omitted rather than raising
@ref{460,,UnicodeError}.

@item 
Some system APIs like @ref{25b,,os.environ} and @ref{1470,,sys.argv} can
also present problems when the bytes made available by the system is
not interpretable using the default encoding.  Setting the @code{LANG}
variable and rerunning the program is probably the best approach.

@item 
@geindex Python Enhancement Proposals; PEP 3138
PEP 3138@footnote{https://peps.python.org/pep-3138/}: The @ref{1c3,,repr()} of a string no longer escapes
non-ASCII characters.  It still escapes control characters and code
points with non-printable status in the Unicode standard, however.

@item 
@geindex Python Enhancement Proposals; PEP 3120
PEP 3120@footnote{https://peps.python.org/pep-3120/}: The default source encoding is now UTF-8.

@item 
@geindex Python Enhancement Proposals; PEP 3131
PEP 3131@footnote{https://peps.python.org/pep-3131/}: Non-ASCII letters are now allowed in identifiers.
(However, the standard library remains ASCII-only with the exception
of contributor names in comments.)

@item 
The @code{StringIO} and @code{cStringIO} modules are gone.  Instead,
import the @ref{83,,io} module and use @ref{112f,,io.StringIO} or
@ref{10aa,,io.BytesIO} for text and data respectively.

@item 
See also the @ref{14b0,,Unicode HOWTO}, which was updated for Python 3.0.
@end itemize

@node Overview Of Syntax Changes,Changes Already Present In Python 2 6,Common Stumbling Blocks,What’s New In Python 3 0
@anchor{whatsnew/3 0 overview-of-syntax-changes}@anchor{14b1}
@subsection Overview Of Syntax Changes


This section gives a brief overview of every `syntactic' change in
Python 3.0.

@menu
* New Syntax:: 
* Changed Syntax:: 
* Removed Syntax:: 

@end menu

@node New Syntax,Changed Syntax,,Overview Of Syntax Changes
@anchor{whatsnew/3 0 new-syntax}@anchor{14b2}
@subsubsection New Syntax



@itemize *

@item 
@geindex Python Enhancement Proposals; PEP 3107
PEP 3107@footnote{https://peps.python.org/pep-3107/}: Function argument and return value annotations.  This
provides a standardized way of annotating a function’s parameters
and return value.  There are no semantics attached to such
annotations except that they can be introspected at runtime using
the @ref{456,,__annotations__} attribute.  The intent is to
encourage experimentation through metaclasses, decorators or frameworks.

@item 
@geindex Python Enhancement Proposals; PEP 3102
PEP 3102@footnote{https://peps.python.org/pep-3102/}: Keyword-only arguments.  Named parameters occurring
after @code{*args} in the parameter list `must' be specified using
keyword syntax in the call.  You can also use a bare @code{*} in the
parameter list to indicate that you don’t accept a variable-length
argument list, but you do have keyword-only arguments.

@item 
Keyword arguments are allowed after the list of base classes in a
class definition.  This is used by the new convention for specifying
a metaclass (see next section), but can be used for other purposes
as well, as long as the metaclass supports it.

@item 
@geindex Python Enhancement Proposals; PEP 3104
PEP 3104@footnote{https://peps.python.org/pep-3104/}: @ref{14b3,,nonlocal} statement.  Using @code{nonlocal x}
you can now assign directly to a variable in an outer (but
non-global) scope.  @code{nonlocal} is a new reserved word.

@item 
@geindex Python Enhancement Proposals; PEP 3132
PEP 3132@footnote{https://peps.python.org/pep-3132/}: Extended Iterable Unpacking.  You can now write things
like @code{a, b, *rest = some_sequence}.  And even @code{*rest, a =
stuff}.  The @code{rest} object is always a (possibly empty) list; the
right-hand side may be any iterable.  Example:

@example
(a, *rest, b) = range(5)
@end example

This sets `a' to @code{0}, `b' to @code{4}, and `rest' to @code{[1, 2, 3]}.

@item 
Dictionary comprehensions: @code{@{k: v for k, v in stuff@}} means the
same thing as @code{dict(stuff)} but is more flexible.  (This is
@geindex Python Enhancement Proposals; PEP 274
PEP 274@footnote{https://peps.python.org/pep-0274/} vindicated. :-)

@item 
Set literals, e.g. @code{@{1, 2@}}.  Note that @code{@{@}} is an empty
dictionary; use @code{set()} for an empty set.  Set comprehensions are
also supported; e.g., @code{@{x for x in stuff@}} means the same thing as
@code{set(stuff)} but is more flexible.

@item 
New octal literals, e.g. @code{0o720} (already in 2.6).  The old octal
literals (@code{0720}) are gone.

@item 
New binary literals, e.g. @code{0b1010} (already in 2.6), and
there is a new corresponding built-in function, @ref{14b4,,bin()}.

@item 
Bytes literals are introduced with a leading @code{b} or @code{B}, and
there is a new corresponding built-in function, @ref{193,,bytes()}.
@end itemize

@node Changed Syntax,Removed Syntax,New Syntax,Overview Of Syntax Changes
@anchor{whatsnew/3 0 changed-syntax}@anchor{14b5}
@subsubsection Changed Syntax



@itemize *

@item 
@geindex Python Enhancement Proposals; PEP 3109
PEP 3109@footnote{https://peps.python.org/pep-3109/} and 
@geindex Python Enhancement Proposals; PEP 3134
PEP 3134@footnote{https://peps.python.org/pep-3134/}: new @ref{804,,raise} statement syntax:
@code{raise [@var{expr} [from @var{expr}]]}.  See below.

@item 
@code{as} and @ref{187,,with} are now reserved words.  (Since
2.6, actually.)

@item 
@code{True}, @code{False}, and @code{None} are reserved words.  (2.6 partially enforced
the restrictions on @code{None} already.)

@item 
Change from @ref{1ac,,except} `exc', `var' to
@code{except} `exc' @code{as} `var'.  See 
@geindex Python Enhancement Proposals; PEP 3110
PEP 3110@footnote{https://peps.python.org/pep-3110/}.

@item 
@geindex Python Enhancement Proposals; PEP 3115
PEP 3115@footnote{https://peps.python.org/pep-3115/}: New Metaclass Syntax.  Instead of:

@example
class C:
    __metaclass__ = M
    ...
@end example

you must now use:

@example
class C(metaclass=M):
    ...
@end example

The module-global @code{__metaclass__} variable is no longer
supported.  (It was a crutch to make it easier to default to
new-style classes without deriving every class from
@ref{c84,,object}.)

@item 
List comprehensions no longer support the syntactic form
@code{[... for @var{var} in @var{item1}, @var{item2}, ...]}.  Use
@code{[... for @var{var} in (@var{item1}, @var{item2}, ...)]} instead.
Also note that list comprehensions have different semantics: they
are closer to syntactic sugar for a generator expression inside a
@ref{24f,,list()} constructor, and in particular the loop control
variables are no longer leaked into the surrounding scope.

@item 
The `ellipsis' (@code{...}) can be used as an atomic expression
anywhere.  (Previously it was only allowed in slices.)  Also, it
`must' now be spelled as @code{...}.  (Previously it could also be
spelled as @code{. . .}, by a mere accident of the grammar.)
@end itemize

@node Removed Syntax,,Changed Syntax,Overview Of Syntax Changes
@anchor{whatsnew/3 0 removed-syntax}@anchor{14b6}
@subsubsection Removed Syntax



@itemize *

@item 
@geindex Python Enhancement Proposals; PEP 3113
PEP 3113@footnote{https://peps.python.org/pep-3113/}: Tuple parameter unpacking removed.  You can no longer
write @code{def foo(a, (b, c)): ...}.
Use @code{def foo(a, b_c): b, c = b_c} instead.

@item 
Removed backticks (use @ref{1c3,,repr()} instead).

@item 
Removed @code{<>} (use @code{!=} instead).

@item 
Removed keyword: @ref{4a3,,exec()} is no longer a keyword; it remains as
a function.  (Fortunately the function syntax was also accepted in
2.x.)  Also note that @code{exec()} no longer takes a stream argument;
instead of @code{exec(f)} you can use @code{exec(f.read())}.

@item 
Integer literals no longer support a trailing @code{l} or @code{L}.

@item 
String literals no longer support a leading @code{u} or @code{U}.

@item 
The @ref{14b7,,from} `module' @ref{7f9,,import} @code{*} syntax is only
allowed at the module level, no longer inside functions.

@item 
The only acceptable syntax for relative imports is @code{from .[@var{module}]
import @var{name}}.  All @ref{7f9,,import} forms not starting with @code{.} are
interpreted as absolute imports.  (
@geindex Python Enhancement Proposals; PEP 328
PEP 328@footnote{https://peps.python.org/pep-0328/})

@item 
Classic classes are gone.
@end itemize

@node Changes Already Present In Python 2 6,Library Changes,Overview Of Syntax Changes,What’s New In Python 3 0
@anchor{whatsnew/3 0 changes-already-present-in-python-2-6}@anchor{14b8}
@subsection Changes Already Present In Python 2.6


Since many users presumably make the jump straight from Python 2.5 to
Python 3.0, this section reminds the reader of new features that were
originally designed for Python 3.0 but that were back-ported to Python
2.6.  The corresponding sections in @ref{14b9,,What’s New in Python 2.6} should be
consulted for longer descriptions.


@itemize *

@item 
@ref{14ba,,PEP 343; The ‘with’ statement}.  The @ref{187,,with} statement is now a standard
feature and no longer needs to be imported from the @ref{0,,__future__}.
Also check out @ref{14bb,,Writing Context Managers} and
@ref{14bc,,The contextlib module}.

@item 
@ref{14bd,,PEP 366; Explicit Relative Imports From a Main Module}.  This enhances the usefulness of the @ref{23e,,-m}
option when the referenced module lives in a package.

@item 
@ref{14be,,PEP 370; Per-user site-packages Directory}.

@item 
@ref{14bf,,PEP 371; The multiprocessing Package}.

@item 
@ref{14c0,,PEP 3101; Advanced String Formatting}.  Note: the 2.6 description mentions the
@ref{19a,,format()} method for both 8-bit and Unicode strings.  In 3.0,
only the @ref{16a,,str} type (text strings with Unicode support)
supports this method; the @ref{193,,bytes} type does not.  The plan is
to eventually make this the only API for string formatting, and to
start deprecating the @code{%} operator in Python 3.1.

@item 
@ref{14c1,,PEP 3105; print As a Function}.  This is now a standard feature and no longer needs
to be imported from @ref{0,,__future__}.  More details were given above.

@item 
@ref{14c2,,PEP 3110; Exception-Handling Changes}.  The @ref{1ac,,except} `exc' @code{as} `var'
syntax is now standard and @code{except} `exc', `var' is no
longer supported.  (Of course, the @code{as} `var' part is still
optional.)

@item 
@ref{14c3,,PEP 3112; Byte Literals}.  The @code{b"..."} string literal notation (and its
variants like @code{b'...'}, @code{b"""..."""}, and @code{br"..."}) now
produces a literal of type @ref{193,,bytes}.

@item 
@ref{14c4,,PEP 3116; New I/O Library}.  The @ref{83,,io} module is now the standard way of
doing file I/O.  The built-in @ref{318,,open()} function is now an
alias for @ref{741,,io.open()} and has additional keyword arguments
`encoding', `errors', `newline' and `closefd'.  Also note that an
invalid `mode' argument now raises @ref{2ee,,ValueError}, not
@ref{1259,,IOError}.  The binary file object underlying a text file
object can be accessed as @code{f.buffer} (but beware that the
text object maintains a buffer of itself in order to speed up
the encoding and decoding operations).

@item 
@ref{14c5,,PEP 3118; Revised Buffer Protocol}.  The old builtin @code{buffer()} is now really gone;
the new builtin @ref{166,,memoryview()} provides (mostly) similar
functionality.

@item 
@ref{14c6,,PEP 3119; Abstract Base Classes}.  The @ref{4,,abc} module and the ABCs defined in the
@ref{1e,,collections} module plays a somewhat more prominent role in
the language now, and built-in collection types like @ref{184,,dict}
and @ref{24f,,list} conform to the @ref{12b8,,collections.MutableMapping}
and @ref{4c0,,collections.MutableSequence} ABCs, respectively.

@item 
@ref{14c7,,PEP 3127; Integer Literal Support and Syntax}.  As mentioned above, the new octal literal
notation is the only one supported, and binary literals have been
added.

@item 
@ref{14c8,,PEP 3129; Class Decorators}.

@item 
@ref{14c9,,PEP 3141; A Type Hierarchy for Numbers}.  The @ref{a2,,numbers} module is another new use of
ABCs, defining Python’s “numeric tower”.  Also note the new
@ref{61,,fractions} module which implements @ref{14ca,,numbers.Rational}.
@end itemize

@node Library Changes,PEP 3101 A New Approach To String Formatting,Changes Already Present In Python 2 6,What’s New In Python 3 0
@anchor{whatsnew/3 0 library-changes}@anchor{14cb}
@subsection Library Changes


Due to time constraints, this document does not exhaustively cover the
very extensive changes to the standard library.  
@geindex Python Enhancement Proposals; PEP 3108
PEP 3108@footnote{https://peps.python.org/pep-3108/} is the
reference for the major changes to the library.  Here’s a capsule
review:


@itemize *

@item 
Many old modules were removed.  Some, like @code{gopherlib} (no
longer used) and @code{md5} (replaced by @ref{6c,,hashlib}), were
already deprecated by 
@geindex Python Enhancement Proposals; PEP 4
PEP 4@footnote{https://peps.python.org/pep-0004/}.  Others were removed as a result
of the removal of support for various platforms such as Irix, BeOS
and Mac OS 9 (see 
@geindex Python Enhancement Proposals; PEP 11
PEP 11@footnote{https://peps.python.org/pep-0011/}).  Some modules were also selected for
removal in Python 3.0 due to lack of use or because a better
replacement exists.  See 
@geindex Python Enhancement Proposals; PEP 3108
PEP 3108@footnote{https://peps.python.org/pep-3108/} for an exhaustive list.

@item 
The @code{bsddb3} package was removed because its presence in the
core standard library has proved over time to be a particular burden
for the core developers due to testing instability and Berkeley DB’s
release schedule.  However, the package is alive and well,
externally maintained at @indicateurl{https://www.jcea.es/programacion/pybsddb.htm}.

@item 
Some modules were renamed because their old name disobeyed
@geindex Python Enhancement Proposals; PEP 8
PEP 8@footnote{https://peps.python.org/pep-0008/}, or for various other reasons.  Here’s the list:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Old Name

@tab

New Name

@item

_winreg

@tab

winreg

@item

ConfigParser

@tab

configparser

@item

copy_reg

@tab

copyreg

@item

Queue

@tab

queue

@item

SocketServer

@tab

socketserver

@item

markupbase

@tab

_markupbase

@item

repr

@tab

reprlib

@item

test.test_support

@tab

test.support

@end multitable


@item 
A common pattern in Python 2.x is to have one version of a module
implemented in pure Python, with an optional accelerated version
implemented as a C extension; for example, @ref{ab,,pickle} and
@code{cPickle}.  This places the burden of importing the accelerated
version and falling back on the pure Python version on each user of
these modules.  In Python 3.0, the accelerated versions are
considered implementation details of the pure Python versions.
Users should always import the standard version, which attempts to
import the accelerated version and falls back to the pure Python
version.  The @code{pickle} / @code{cPickle} pair received this
treatment.  The @ref{b4,,profile} module is on the list for 3.1.  The
@code{StringIO} module has been turned into a class in the @ref{83,,io}
module.

@item 
Some related modules have been grouped into packages, and usually
the submodule names have been simplified.  The resulting new
packages are:


@itemize *

@item 
@ref{35,,dbm} (@code{anydbm}, @code{dbhash}, @code{dbm},
@code{dumbdbm}, @code{gdbm}, @code{whichdb}).

@item 
@ref{6f,,html} (@code{HTMLParser}, @code{htmlentitydefs}).

@item 
@ref{72,,http} (@code{httplib}, @code{BaseHTTPServer},
@code{CGIHTTPServer}, @code{SimpleHTTPServer}, @code{Cookie},
@code{cookielib}).

@item 
@ref{f6,,tkinter} (all @code{Tkinter}-related modules except
@ref{108,,turtle}).  The target audience of @code{turtle} doesn’t
really care about @code{tkinter}.  Also note that as of Python
2.6, the functionality of @code{turtle} has been greatly enhanced.

@item 
@ref{10f,,urllib} (@code{urllib}, @code{urllib2}, @code{urlparse},
@code{robotparse}).

@item 
@ref{134,,xmlrpc} (@code{xmlrpclib}, @code{DocXMLRPCServer},
@code{SimpleXMLRPCServer}).
@end itemize
@end itemize

Some other changes to standard library modules, not covered by
@geindex Python Enhancement Proposals; PEP 3108
PEP 3108@footnote{https://peps.python.org/pep-3108/}:


@itemize *

@item 
Killed @code{sets}.  Use the built-in @ref{185,,set()} class.

@item 
Cleanup of the @ref{df,,sys} module: removed @code{sys.exitfunc()},
@code{sys.exc_clear()}, @code{sys.exc_type}, @code{sys.exc_value},
@code{sys.exc_traceback}.  (Note that @ref{6e7,,sys.last_type}
etc. remain.)

@item 
Cleanup of the @ref{4bf,,array.array} type: the @code{read()} and
@code{write()} methods are gone; use @ref{14cc,,fromfile()} and
@ref{14cd,,tofile()} instead.  Also, the @code{'c'} typecode for array is
gone – use either @code{'b'} for bytes or @code{'u'} for Unicode
characters.

@item 
Cleanup of the @ref{a3,,operator} module: removed
@code{sequenceIncludes()} and @code{isCallable()}.

@item 
Cleanup of the @code{thread} module: @code{acquire_lock()} and
@code{release_lock()} are gone; use @ref{8a9,,acquire()} and
@ref{14ce,,release()} instead.

@item 
Cleanup of the @ref{bd,,random} module: removed the @code{jumpahead()} API.

@item 
The @code{new} module is gone.

@item 
The functions @code{os.tmpnam()}, @code{os.tempnam()} and
@code{os.tmpfile()} have been removed in favor of the @ref{e6,,tempfile}
module.

@item 
The @ref{102,,tokenize} module has been changed to work with bytes.  The
main entry point is now @ref{701,,tokenize.tokenize()}, instead of
generate_tokens.

@item 
@code{string.letters} and its friends (@code{string.lowercase} and
@code{string.uppercase}) are gone.  Use
@ref{14cf,,string.ascii_letters} etc. instead.  (The reason for the
removal is that @code{string.letters} and friends had
locale-specific behavior, which is a bad idea for such
attractively named global “constants”.)

@item 
Renamed module @code{__builtin__} to @ref{13,,builtins} (removing the
underscores, adding an ‘s’).  The @code{__builtins__} variable
found in most global namespaces is unchanged.  To modify a builtin,
you should use @code{builtins}, not @code{__builtins__}!
@end itemize

@node PEP 3101 A New Approach To String Formatting,Changes To Exceptions,Library Changes,What’s New In Python 3 0
@anchor{whatsnew/3 0 pep-3101-a-new-approach-to-string-formatting}@anchor{14d0}
@subsection 
@geindex Python Enhancement Proposals; PEP 3101
`PEP 3101': A New Approach To String Formatting



@itemize *

@item 
A new system for  built-in string formatting operations replaces the
@code{%} string  formatting operator.   (However, the @code{%}  operator is
still supported;  it will  be deprecated in  Python 3.1  and removed
from the language at some later time.)  Read 
@geindex Python Enhancement Proposals; PEP 3101
PEP 3101@footnote{https://peps.python.org/pep-3101/} for the full
scoop.
@end itemize

@node Changes To Exceptions,Miscellaneous Other Changes,PEP 3101 A New Approach To String Formatting,What’s New In Python 3 0
@anchor{whatsnew/3 0 changes-to-exceptions}@anchor{14d1}
@subsection Changes To Exceptions


The APIs for raising and catching exception have been cleaned up and
new powerful features added:


@itemize *

@item 
@geindex Python Enhancement Proposals; PEP 352
PEP 352@footnote{https://peps.python.org/pep-0352/}: All exceptions must be derived (directly or indirectly)
from @ref{7d8,,BaseException}.  This is the root of the exception
hierarchy.  This is not new as a recommendation, but the
`requirement' to inherit from @code{BaseException} is new.  (Python
2.6 still allowed classic classes to be raised, and placed no
restriction on what you can catch.)  As a consequence, string
exceptions are finally truly and utterly dead.

@item 
Almost all exceptions should actually derive from @ref{bd3,,Exception};
@ref{7d8,,BaseException} should only be used as a base class for
exceptions that should only be handled at the top level, such as
@ref{f42,,SystemExit} or @ref{bcb,,KeyboardInterrupt}.  The recommended
idiom for handling all exceptions except for this latter category is
to use @ref{1ac,,except} @code{Exception}.

@item 
@code{StandardError} was removed.

@item 
Exceptions no longer behave as sequences.  Use the @ref{78e,,args}
attribute instead.

@item 
@geindex Python Enhancement Proposals; PEP 3109
PEP 3109@footnote{https://peps.python.org/pep-3109/}: Raising exceptions.  You must now use @code{raise
@var{Exception}(@var{args})} instead of @code{raise @var{Exception}, @var{args}}.
Additionally, you can no longer explicitly specify a traceback;
instead, if you `have' to do this, you can assign directly to the
@ref{14d2,,__traceback__} attribute (see below).

@item 
@geindex Python Enhancement Proposals; PEP 3110
PEP 3110@footnote{https://peps.python.org/pep-3110/}: Catching exceptions.  You must now use
@code{except @var{SomeException} as @var{variable}} instead
of @code{except @var{SomeException}, @var{variable}}.  Moreover, the
`variable' is explicitly deleted when the @ref{1ac,,except} block
is left.

@item 
@geindex Python Enhancement Proposals; PEP 3134
PEP 3134@footnote{https://peps.python.org/pep-3134/}: Exception chaining.  There are two cases: implicit
chaining and explicit chaining.  Implicit chaining happens when an
exception is raised in an @ref{1ac,,except} or @ref{1b1,,finally}
handler block.  This usually happens due to a bug in the handler
block; we call this a `secondary' exception.  In this case, the
original exception (that was being handled) is saved as the
@ref{14d3,,__context__} attribute of the secondary exception.
Explicit chaining is invoked with this syntax:

@example
raise SecondaryException() from primary_exception
@end example

(where `primary_exception' is any expression that produces an
exception object, probably an exception that was previously caught).
In this case, the primary exception is stored on the
@ref{14d4,,__cause__} attribute of the secondary exception.  The
traceback printed when an unhandled exception occurs walks the chain
of @code{__cause__} and @ref{14d3,,__context__} attributes and
prints a
separate traceback for each component of the chain, with the primary
exception at the top.  (Java users may recognize this behavior.)

@item 
@geindex Python Enhancement Proposals; PEP 3134
PEP 3134@footnote{https://peps.python.org/pep-3134/}: Exception objects now store their traceback as the
@ref{14d2,,__traceback__} attribute.  This means that an exception
object now contains all the information pertaining to an exception,
and there are fewer reasons to use @ref{89c,,sys.exc_info()} (though the
latter is not removed).

@item 
A few exception messages are improved when Windows fails to load an
extension module.  For example, @code{error code 193} is now @code{%1 is
not a valid Win32 application}.  Strings now deal with non-English
locales.
@end itemize

@node Miscellaneous Other Changes,Build and C API Changes<7>,Changes To Exceptions,What’s New In Python 3 0
@anchor{whatsnew/3 0 miscellaneous-other-changes}@anchor{14d5}
@subsection Miscellaneous Other Changes


@menu
* Operators And Special Methods:: 
* Builtins:: 

@end menu

@node Operators And Special Methods,Builtins,,Miscellaneous Other Changes
@anchor{whatsnew/3 0 operators-and-special-methods}@anchor{14d6}
@subsubsection Operators And Special Methods



@itemize *

@item 
@code{!=} now returns the opposite of @code{==}, unless @code{==} returns
@ref{1a3,,NotImplemented}.

@item 
The concept of “unbound methods” has been removed from the language.
When referencing a method as a class attribute, you now get a plain
function object.

@item 
@code{__getslice__()}, @code{__setslice__()} and @code{__delslice__()}
were killed.  The syntax @code{a[i:j]} now translates to
@code{a.__getitem__(slice(i, j))} (or @ref{14d7,,__setitem__()} or
@ref{14d8,,__delitem__()}, when used as an assignment or deletion target,
respectively).

@item 
@geindex Python Enhancement Proposals; PEP 3114
PEP 3114@footnote{https://peps.python.org/pep-3114/}: the standard @ref{9de,,next()} method has been renamed to
@ref{14d9,,__next__()}.

@item 
The @code{__oct__()} and @code{__hex__()} special methods are removed
– @ref{14da,,oct()} and @ref{14db,,hex()} use @ref{19f,,__index__()} now to convert
the argument to an integer.

@item 
Removed support for @code{__members__} and @code{__methods__}.

@item 
The function attributes named @code{func_X} have been renamed to
use the @code{__X__} form, freeing up these names in the function
attribute namespace for user-defined attributes.  To wit,
@code{func_closure}, @code{func_code}, @code{func_defaults},
@code{func_dict}, @code{func_doc}, @code{func_globals},
@code{func_name} were renamed to @ref{14dc,,__closure__},
@ref{59d,,__code__}, @ref{14dd,,__defaults__},
@ref{14de,,__dict__}, @ref{13e5,,__doc__},
@ref{14df,,__globals__}, @ref{14e0,,__name__},
respectively.

@item 
@code{__nonzero__()} is now @ref{14e1,,__bool__()}.
@end itemize

@node Builtins,,Operators And Special Methods,Miscellaneous Other Changes
@anchor{whatsnew/3 0 builtins}@anchor{14e2}
@subsubsection Builtins



@itemize *

@item 
@geindex Python Enhancement Proposals; PEP 3135
PEP 3135@footnote{https://peps.python.org/pep-3135/}: New @ref{1a7,,super()}.  You can now invoke @code{super()}
without arguments and (assuming this is in a regular instance method
defined inside a @ref{14e3,,class} statement) the right class and
instance will automatically be chosen.  With arguments, the behavior
of @code{super()} is unchanged.

@item 
@geindex Python Enhancement Proposals; PEP 3111
PEP 3111@footnote{https://peps.python.org/pep-3111/}: @code{raw_input()} was renamed to @ref{14e4,,input()}.  That
is, the new @code{input()} function reads a line from
@ref{760,,sys.stdin} and returns it with the trailing newline stripped.
It raises @ref{14e5,,EOFError} if the input is terminated prematurely.
To get the old behavior of @code{input()}, use @code{eval(input())}.

@item 
A new built-in function @ref{9de,,next()} was added to call the
@ref{14d9,,__next__()} method on an object.

@item 
The @ref{14e6,,round()} function rounding strategy and return type have
changed.  Exact halfway cases are now rounded to the nearest even
result instead of away from zero.  (For example, @code{round(2.5)} now
returns @code{2} rather than @code{3}.)  @code{round(x[, n])} now
delegates to @code{x.__round__([n])} instead of always returning a
float.  It generally returns an integer when called with a single
argument and a value of the same type as @code{x} when called with two
arguments.

@item 
Moved @code{intern()} to @ref{14e7,,sys.intern()}.

@item 
Removed: @code{apply()}.  Instead of @code{apply(f, args)} use
@code{f(*args)}.

@item 
Removed @ref{13d2,,callable()}.  Instead of @code{callable(f)} you can use
@code{isinstance(f, collections.Callable)}.  The @code{operator.isCallable()}
function is also gone.

@item 
Removed @code{coerce()}.  This function no longer serves a purpose
now that classic classes are gone.

@item 
Removed @code{execfile()}.  Instead of @code{execfile(fn)} use
@code{exec(open(fn).read())}.

@item 
Removed the @code{file} type.  Use @ref{318,,open()}.  There are now several
different kinds of streams that open can return in the @ref{83,,io} module.

@item 
Removed @code{reduce()}.  Use @ref{21c,,functools.reduce()} if you really
need it; however, 99 percent of the time an explicit @ref{348,,for}
loop is more readable.

@item 
Removed @code{reload()}.  Use @code{imp.reload()}.

@item 
Removed. @code{dict.has_key()} – use the @ref{349,,in} operator
instead.
@end itemize

@c ======================================================================

@node Build and C API Changes<7>,Performance,Miscellaneous Other Changes,What’s New In Python 3 0
@anchor{whatsnew/3 0 build-and-c-api-changes}@anchor{14e8}
@subsection Build and C API Changes


Due to time constraints, here is a `very' incomplete list of changes
to the C API.


@itemize *

@item 
Support for several platforms was dropped, including but not limited
to Mac OS 9, BeOS, RISCOS, Irix, and Tru64.

@item 
@geindex Python Enhancement Proposals; PEP 3118
PEP 3118@footnote{https://peps.python.org/pep-3118/}: New Buffer API.

@item 
@geindex Python Enhancement Proposals; PEP 3121
PEP 3121@footnote{https://peps.python.org/pep-3121/}: Extension Module Initialization & Finalization.

@item 
@geindex Python Enhancement Proposals; PEP 3123
PEP 3123@footnote{https://peps.python.org/pep-3123/}: Making @ref{14e9,,PyObject_HEAD} conform to standard C.

@item 
No more C API support for restricted execution.

@item 
@code{PyNumber_Coerce()}, @code{PyNumber_CoerceEx()},
@code{PyMember_Get()}, and @code{PyMember_Set()} C APIs are removed.

@item 
New C API @ref{3d9,,PyImport_ImportModuleNoBlock()}, works like
@ref{3da,,PyImport_ImportModule()} but won’t block on the import lock
(returning an error instead).

@item 
Renamed the boolean conversion C-level slot and method:
@code{nb_nonzero} is now @code{nb_bool}.

@item 
Removed @code{METH_OLDARGS} and @code{WITH_CYCLE_GC} from the C API.
@end itemize

@c ======================================================================

@node Performance,Porting To Python 3 0,Build and C API Changes<7>,What’s New In Python 3 0
@anchor{whatsnew/3 0 performance}@anchor{14ea}
@subsection Performance


The net result of the 3.0 generalizations is that Python 3.0 runs the
pystone benchmark around 10% slower than Python 2.5.  Most likely the
biggest cause is the removal of special-casing for small integers.
There’s room for improvement, but it will happen after 3.0 is
released!

@c ======================================================================

@node Porting To Python 3 0,,Performance,What’s New In Python 3 0
@anchor{whatsnew/3 0 porting-to-python-3-0}@anchor{14eb}
@subsection Porting To Python 3.0


For porting existing Python 2.5 or 2.6 source code to Python 3.0, the
best strategy is the following:


@enumerate 0

@item 
(Prerequisite:) Start with excellent test coverage.

@item 
Port to Python 2.6.  This should be no more work than the average
port from Python 2.x to Python 2.(x+1).  Make sure all your tests
pass.

@item 
(Still using 2.6:) Turn on the @code{-3} command line switch.
This enables warnings about features that will be removed (or
change) in 3.0.  Run your test suite again, and fix code that you
get warnings about until there are no warnings left, and all your
tests still pass.

@item 
Run the @code{2to3} source-to-source translator over your source code
tree.  Run the
result of the translation under Python 3.0.  Manually fix up any
remaining issues, fixing problems until all tests pass again.
@end enumerate

It is not recommended to try to write source code that runs unchanged
under both Python 2.6 and 3.0; you’d have to use a very contorted
coding style, e.g. avoiding @code{print} statements, metaclasses,
and much more.  If you are maintaining a library that needs to support
both Python 2.6 and Python 3.0, the best approach is to modify step 3
above by editing the 2.6 version of the source code and running the
@code{2to3} translator again, rather than editing the 3.0 version of the
source code.

For porting C extensions to Python 3.0, please see @ref{14ec,,Porting Extension Modules to Python 3}.

@c ======================================================================

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node What’s New in Python 2 7,What’s New in Python 2 6,What’s New In Python 3 0,What’s New in Python
@anchor{whatsnew/2 7 doc}@anchor{14ed}@anchor{whatsnew/2 7 translation-repo}@anchor{14ee}@anchor{whatsnew/2 7 what-s-new-in-python-2-7}@anchor{14ef}
@section What’s New in Python 2.7


@*Author: 
A.M. Kuchling (amk at amk.ca)


@c hyperlink all the methods & functions.

@c T_STRING_INPLACE not described in main docs

@c $Id$
@c Rules for maintenance:
@c 
@c * Anyone can add text to this document.  Do not spend very much time
@c on the wording of your changes, because your text will probably
@c get rewritten to some degree.
@c 
@c * The maintainer will go through Misc/NEWS periodically and add
@c changes; it's therefore more important to add your changes to
@c Misc/NEWS than to this file.
@c 
@c * This is not a complete list of every single change; completeness
@c is the purpose of Misc/NEWS.  Some changes I consider too small
@c or esoteric to include.  If such a change is added to the text,
@c I'll just remove it.  (This is another reason you shouldn't spend
@c too much time on writing your addition.)
@c 
@c * If you want to draw your new text to the attention of the
@c maintainer, add 'XXX' to the beginning of the paragraph or
@c section.
@c 
@c * It's OK to just add a fragmentary note about a change.  For
@c example: "XXX Describe the transmogrify() function added to the
@c socket module."  The maintainer will research the change and
@c write the necessary text.
@c 
@c * You can comment out your additions if you like, but it's not
@c necessary (especially when a final release is some months away).
@c 
@c * Credit the author of a patch or bugfix.  Just the name is
@c sufficient; the e-mail address isn't necessary.
@c 
@c * It's helpful to add the bug/patch number in a parenthetical comment.
@c 
@c XXX Describe the transmogrify() function added to the socket
@c module.
@c (Contributed by P.Y. Developer; :issue:`12345`.)
@c 
@c This saves the maintainer some effort going through the SVN logs
@c when researching a change.

This article explains the new features in Python 2.7.  Python 2.7 was released
on July 3, 2010.

Numeric handling has been improved in many ways, for both
floating-point numbers and for the @ref{200,,Decimal} class.
There are some useful additions to the standard library, such as a
greatly enhanced @ref{10d,,unittest} module, the @ref{7,,argparse} module
for parsing command-line options, convenient @ref{7f4,,OrderedDict}
and @ref{129d,,Counter} classes in the @ref{1e,,collections} module,
and many other improvements.

Python 2.7 is planned to be the last of the 2.x releases, so we worked
on making it a good release for the long term.  To help with porting
to Python 3, several new features from the Python 3.x series have been
included in 2.7.

This article doesn’t attempt to provide a complete specification of
the new features, but instead provides a convenient overview.  For
full details, you should refer to the documentation for Python 2.7 at
@indicateurl{https://docs.python.org}. If you want to understand the rationale for
the design and implementation, refer to the PEP for a particular new
feature or the issue on @indicateurl{https://bugs.python.org} in which a change was
discussed.  Whenever possible, “What’s New in Python” links to the
bug/patch item for each change.

@menu
* The Future for Python 2.x: The Future for Python 2 x. 
* Changes to the Handling of Deprecation Warnings:: 
* Python 3.1 Features: Python 3 1 Features. 
* PEP 372; Adding an Ordered Dictionary to collections: PEP 372 Adding an Ordered Dictionary to collections. 
* PEP 378; Format Specifier for Thousands Separator: PEP 378 Format Specifier for Thousands Separator<2>. 
* PEP 389; The argparse Module for Parsing Command Lines: PEP 389 The argparse Module for Parsing Command Lines. 
* PEP 391; Dictionary-Based Configuration For Logging: PEP 391 Dictionary-Based Configuration For Logging. 
* PEP 3106; Dictionary Views: PEP 3106 Dictionary Views. 
* PEP 3137; The memoryview Object: PEP 3137 The memoryview Object. 
* Other Language Changes: Other Language Changes<14>. 
* New and Improved Modules:: 
* Build and C API Changes: Build and C API Changes<8>. 
* Other Changes and Fixes:: 
* Porting to Python 2.7: Porting to Python 2 7. 
* New Features Added to Python 2.7 Maintenance Releases: New Features Added to Python 2 7 Maintenance Releases. 
* Acknowledgements:: 

@end menu

@node The Future for Python 2 x,Changes to the Handling of Deprecation Warnings,,What’s New in Python 2 7
@anchor{whatsnew/2 7 the-future-for-python-2-x}@anchor{14f0}@anchor{whatsnew/2 7 whatsnew27-python31}@anchor{14f1}
@subsection The Future for Python 2.x


Python 2.7 is the last major release in the 2.x series, as the Python
maintainers have shifted the focus of their new feature development efforts
to the Python 3.x series. This means that while Python 2 continues to
receive bug fixes, and to be updated to build correctly on new hardware and
versions of supported operated systems, there will be no new full feature
releases for the language or standard library.

However, while there is a large common subset between Python 2.7 and Python
3, and many of the changes involved in migrating to that common subset, or
directly to Python 3, can be safely automated, some other changes (notably
those associated with Unicode handling) may require careful consideration,
and preferably robust automated regression test suites, to migrate
effectively.

This means that Python 2.7 will remain in place for a long time, providing a
stable and supported base platform for production systems that have not yet
been ported to Python 3. The full expected lifecycle of the Python 2.7
series is detailed in 
@geindex Python Enhancement Proposals; PEP 373
PEP 373@footnote{https://peps.python.org/pep-0373/}.

Some key consequences of the long-term significance of 2.7 are:


@itemize *

@item 
As noted above, the 2.7 release has a much longer period of maintenance
when compared to earlier 2.x versions. Python 2.7 is currently expected to
remain supported by the core development team (receiving security updates
and other bug fixes) until at least 2020 (10 years after its initial
release, compared to the more typical support period of 18–24 months).

@item 
As the Python 2.7 standard library ages, making effective use of the
Python Package Index (either directly or via a redistributor) becomes
more important for Python 2 users. In addition to a wide variety of third
party packages for various tasks, the available packages include backports
of new modules and features from the Python 3 standard library that are
compatible with Python 2, as well as various tools and libraries that can
make it easier to migrate to Python 3. The Python Packaging User Guide@footnote{https://packaging.python.org} provides guidance on downloading and
installing software from the Python Package Index.

@item 
While the preferred approach to enhancing Python 2 is now the publication
of new packages on the Python Package Index, this approach doesn’t
necessarily work in all cases, especially those related to network
security. In exceptional cases that cannot be handled adequately by
publishing new or updated packages on PyPI, the Python Enhancement
Proposal process may be used to make the case for adding new features
directly to the Python 2 standard library. Any such additions, and the
maintenance releases where they were added, will be noted in the
@ref{14f2,,New Features Added to Python 2.7 Maintenance Releases} section below.
@end itemize

For projects wishing to migrate from Python 2 to Python 3, or for library
and framework developers wishing to support users on both Python 2 and
Python 3, there are a variety of tools and guides available to help decide
on a suitable approach and manage some of the technical details involved.
The recommended starting point is the pyporting-howto HOWTO guide.

@node Changes to the Handling of Deprecation Warnings,Python 3 1 Features,The Future for Python 2 x,What’s New in Python 2 7
@anchor{whatsnew/2 7 changes-to-the-handling-of-deprecation-warnings}@anchor{14f3}
@subsection Changes to the Handling of Deprecation Warnings


For Python 2.7, a policy decision was made to silence warnings only of
interest to developers by default.  @ref{1a4,,DeprecationWarning} and its
descendants are now ignored unless otherwise requested, preventing
users from seeing warnings triggered by an application.  This change
was also made in the branch that became Python 3.2. (Discussed
on stdlib-sig and carried out in bpo-7319@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7319}.)

In previous releases, @ref{1a4,,DeprecationWarning} messages were
enabled by default, providing Python developers with a clear
indication of where their code may break in a future major version
of Python.

However, there are increasingly many users of Python-based
applications who are not directly involved in the development of
those applications.  @ref{1a4,,DeprecationWarning} messages are
irrelevant to such users, making them worry about an application
that’s actually working correctly and burdening application developers
with responding to these concerns.

You can re-enable display of @ref{1a4,,DeprecationWarning} messages by
running Python with the @ref{acb,,-Wdefault} (short form:
@code{-Wd}) switch, or by setting the 
@geindex PYTHONWARNINGS
@geindex environment variable; PYTHONWARNINGS
@ref{da9,,PYTHONWARNINGS}
environment variable to @code{"default"} (or @code{"d"}) before running
Python.  Python code can also re-enable them
by calling @code{warnings.simplefilter('default')}.

The @code{unittest} module also automatically reenables deprecation warnings
when running tests.

@node Python 3 1 Features,PEP 372 Adding an Ordered Dictionary to collections,Changes to the Handling of Deprecation Warnings,What’s New in Python 2 7
@anchor{whatsnew/2 7 python-3-1-features}@anchor{14f4}
@subsection Python 3.1 Features


Much as Python 2.6 incorporated features from Python 3.0,
version 2.7 incorporates some of the new features
in Python 3.1.  The 2.x series continues to provide tools
for migrating to the 3.x series.

A partial list of 3.1 features that were backported to 2.7:


@itemize *

@item 
The syntax for set literals (@code{@{1,2,3@}} is a mutable set).

@item 
Dictionary and set comprehensions (@code{@{i: i*2 for i in range(3)@}}).

@item 
Multiple context managers in a single @ref{187,,with} statement.

@item 
A new version of the @ref{83,,io} library, rewritten in C for performance.

@item 
The ordered-dictionary type described in @ref{14f5,,PEP 372; Adding an Ordered Dictionary to collections}.

@item 
The new @code{","} format specifier described in @ref{14f6,,PEP 378; Format Specifier for Thousands Separator}.

@item 
The @ref{166,,memoryview} object.

@item 
A small subset of the @ref{7b,,importlib} module,
@ref{14f7,,described below}.

@item 
The @ref{1c3,,repr()} of a float @code{x} is shorter in many cases: it’s now
based on the shortest decimal string that’s guaranteed to round back
to @code{x}.  As in previous versions of Python, it’s guaranteed that
@code{float(repr(x))} recovers @code{x}.

@item 
Float-to-string and string-to-float conversions are correctly rounded.
The @ref{14e6,,round()} function is also now correctly rounded.

@item 
The @ref{147e,,PyCapsule} type, used to provide a C API for extension modules.

@item 
The @ref{1472,,PyLong_AsLongAndOverflow()} C API function.
@end itemize

Other new Python3-mode warnings include:


@itemize *

@item 
@code{operator.isCallable()} and @code{operator.sequenceIncludes()},
which are not supported in 3.x, now trigger warnings.

@item 
The @code{-3} switch now automatically
enables the @code{-Qwarn} switch that causes warnings
about using classic division with integers and long integers.
@end itemize

@c ========================================================================

@c Large, PEP-level features and changes should be described here.

@c ========================================================================

@node PEP 372 Adding an Ordered Dictionary to collections,PEP 378 Format Specifier for Thousands Separator<2>,Python 3 1 Features,What’s New in Python 2 7
@anchor{whatsnew/2 7 pep-0372}@anchor{14f5}@anchor{whatsnew/2 7 pep-372-adding-an-ordered-dictionary-to-collections}@anchor{14f8}
@subsection PEP 372: Adding an Ordered Dictionary to collections


Regular Python dictionaries iterate over key/value pairs in arbitrary order.
Over the years, a number of authors have written alternative implementations
that remember the order that the keys were originally inserted.  Based on
the experiences from those implementations, 2.7 introduces a new
@ref{7f4,,OrderedDict} class in the @ref{1e,,collections} module.

The @ref{7f4,,OrderedDict} API provides the same interface as regular
dictionaries but iterates over keys and values in a guaranteed order
depending on when a key was first inserted:

@example
>>> from collections import OrderedDict
>>> d = OrderedDict([('first', 1),
...                  ('second', 2),
...                  ('third', 3)])
>>> d.items()
[('first', 1), ('second', 2), ('third', 3)]
@end example

If a new entry overwrites an existing entry, the original insertion
position is left unchanged:

@example
>>> d['second'] = 4
>>> d.items()
[('first', 1), ('second', 4), ('third', 3)]
@end example

Deleting an entry and reinserting it will move it to the end:

@example
>>> del d['second']
>>> d['second'] = 5
>>> d.items()
[('first', 1), ('third', 3), ('second', 5)]
@end example

The @ref{14f9,,popitem()} method has an optional `last'
argument that defaults to @code{True}.  If `last' is true, the most recently
added key is returned and removed; if it’s false, the
oldest key is selected:

@example
>>> od = OrderedDict([(x,0) for x in range(20)])
>>> od.popitem()
(19, 0)
>>> od.popitem()
(18, 0)
>>> od.popitem(last=False)
(0, 0)
>>> od.popitem(last=False)
(1, 0)
@end example

Comparing two ordered dictionaries checks both the keys and values,
and requires that the insertion order was the same:

@example
>>> od1 = OrderedDict([('first', 1),
...                    ('second', 2),
...                    ('third', 3)])
>>> od2 = OrderedDict([('third', 3),
...                    ('first', 1),
...                    ('second', 2)])
>>> od1 == od2
False
>>> # Move 'third' key to the end
>>> del od2['third']; od2['third'] = 3
>>> od1 == od2
True
@end example

Comparing an @ref{7f4,,OrderedDict} with a regular dictionary
ignores the insertion order and just compares the keys and values.

How does the @ref{7f4,,OrderedDict} work?  It maintains a
doubly linked list of keys, appending new keys to the list as they’re inserted.
A secondary dictionary maps keys to their corresponding list node, so
deletion doesn’t have to traverse the entire linked list and therefore
remains `O'(1).

The standard library now supports use of ordered dictionaries in several
modules.


@itemize *

@item 
The @ref{26,,ConfigParser} module uses them by default, meaning that
configuration files can now be read, modified, and then written back
in their original order.

@item 
The @ref{bda,,_asdict()} method for
@ref{4e1,,collections.namedtuple()} now returns an ordered dictionary with the
values appearing in the same order as the underlying tuple indices.

@item 
The @ref{86,,json} module’s @ref{f49,,JSONDecoder} class
constructor was extended with an `object_pairs_hook' parameter to
allow @code{OrderedDict} instances to be built by the decoder.
Support was also added for third-party tools like
PyYAML@footnote{https://pyyaml.org/}.
@end itemize


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 372

@item PEP 372@footnote{https://peps.python.org/pep-0372/} - Adding an ordered dictionary to collections

PEP written by Armin Ronacher and Raymond Hettinger;
implemented by Raymond Hettinger.
@end table


@node PEP 378 Format Specifier for Thousands Separator<2>,PEP 389 The argparse Module for Parsing Command Lines,PEP 372 Adding an Ordered Dictionary to collections,What’s New in Python 2 7
@anchor{whatsnew/2 7 pep-0378}@anchor{14f6}@anchor{whatsnew/2 7 pep-378-format-specifier-for-thousands-separator}@anchor{14fa}
@subsection PEP 378: Format Specifier for Thousands Separator


To make program output more readable, it can be useful to add
separators to large numbers, rendering them as
18,446,744,073,709,551,616 instead of 18446744073709551616.

The fully general solution for doing this is the @ref{8a,,locale} module,
which can use different separators (“,” in North America, “.” in
Europe) and different grouping sizes, but @code{locale} is complicated
to use and unsuitable for multi-threaded applications where different
threads are producing output for different locales.

Therefore, a simple comma-grouping mechanism has been added to the
mini-language used by the @ref{834,,str.format()} method.  When
formatting a floating-point number, simply include a comma between the
width and the precision:

@example
>>> '@{:20,.2f@}'.format(18446744073709551616.0)
'18,446,744,073,709,551,616.00'
@end example

When formatting an integer, include the comma after the width:

@example
>>> '@{:20,d@}'.format(18446744073709551616)
'18,446,744,073,709,551,616'
@end example

This mechanism is not adaptable at all; commas are always used as the
separator and the grouping is always into three-digit groups.  The
comma-formatting mechanism isn’t as general as the @ref{8a,,locale}
module, but it’s easier to use.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 378

@item PEP 378@footnote{https://peps.python.org/pep-0378/} - Format Specifier for Thousands Separator

PEP written by Raymond Hettinger; implemented by Eric Smith.
@end table


@node PEP 389 The argparse Module for Parsing Command Lines,PEP 391 Dictionary-Based Configuration For Logging,PEP 378 Format Specifier for Thousands Separator<2>,What’s New in Python 2 7
@anchor{whatsnew/2 7 pep-389-the-argparse-module-for-parsing-command-lines}@anchor{14fb}
@subsection PEP 389: The argparse Module for Parsing Command Lines


The @ref{7,,argparse} module for parsing command-line arguments was
added as a more powerful replacement for the
@ref{a4,,optparse} module.

This means Python now supports three different modules for parsing
command-line arguments: @ref{65,,getopt}, @ref{a4,,optparse}, and
@ref{7,,argparse}.  The @code{getopt} module closely resembles the C
library’s @code{getopt()} function, so it remains useful if you’re writing a
Python prototype that will eventually be rewritten in C.
@code{optparse} becomes redundant, but there are no plans to remove it
because there are many scripts still using it, and there’s no
automated way to update these scripts.  (Making the @code{argparse}
API consistent with @code{optparse}’s interface was discussed but
rejected as too messy and difficult.)

In short, if you’re writing a new script and don’t need to worry
about compatibility with earlier versions of Python, use
@ref{7,,argparse} instead of @ref{a4,,optparse}.

Here’s an example:

@example
import argparse

parser = argparse.ArgumentParser(description='Command-line example.')

# Add optional switches
parser.add_argument('-v', action='store_true', dest='is_verbose',
                    help='produce verbose output')
parser.add_argument('-o', action='store', dest='output',
                    metavar='FILE',
                    help='direct output to FILE instead of stdout')
parser.add_argument('-C', action='store', type=int, dest='context',
                    metavar='NUM', default=0,
                    help='display NUM lines of added context')

# Allow any number of additional arguments.
parser.add_argument(nargs='*', action='store', dest='inputs',
                    help='input filenames (default is stdin)')

args = parser.parse_args()
print args.__dict__
@end example

Unless you override it, @code{-h} and @code{--help} switches
are automatically added, and produce neatly formatted output:

@example
-> ./python.exe argparse-example.py --help
usage: argparse-example.py [-h] [-v] [-o FILE] [-C NUM] [inputs [inputs ...]]

Command-line example.

positional arguments:
  inputs      input filenames (default is stdin)

optional arguments:
  -h, --help  show this help message and exit
  -v          produce verbose output
  -o FILE     direct output to FILE instead of stdout
  -C NUM      display NUM lines of added context
@end example

As with @ref{a4,,optparse}, the command-line switches and arguments
are returned as an object with attributes named by the `dest' parameters:

@example
-> ./python.exe argparse-example.py -v
@{'output': None,
 'is_verbose': True,
 'context': 0,
 'inputs': []@}

-> ./python.exe argparse-example.py -v -o /tmp/output -C 4 file1 file2
@{'output': '/tmp/output',
 'is_verbose': True,
 'context': 4,
 'inputs': ['file1', 'file2']@}
@end example

@ref{7,,argparse} has much fancier validation than @ref{a4,,optparse}; you
can specify an exact number of arguments as an integer, 0 or more
arguments by passing @code{'*'}, 1 or more by passing @code{'+'}, or an
optional argument with @code{'?'}.  A top-level parser can contain
sub-parsers to define subcommands that have different sets of
switches, as in @code{svn commit}, @code{svn checkout}, etc.  You can
specify an argument’s type as @ref{30e,,FileType}, which will
automatically open files for you and understands that @code{'-'} means
standard input or output.


@subsubheading See also



@table @asis

@item @ref{7,,argparse} documentation

The documentation page of the argparse module.

@item @ref{13ba,,Migrating optparse code to argparse}

Part of the Python documentation, describing how to convert
code that uses @ref{a4,,optparse}.

@geindex Python Enhancement Proposals; PEP 389

@item PEP 389@footnote{https://peps.python.org/pep-0389/} - argparse - New Command Line Parsing Module

PEP written and implemented by Steven Bethard.
@end table


@node PEP 391 Dictionary-Based Configuration For Logging,PEP 3106 Dictionary Views,PEP 389 The argparse Module for Parsing Command Lines,What’s New in Python 2 7
@anchor{whatsnew/2 7 pep-391-dictionary-based-configuration-for-logging}@anchor{14fc}
@subsection PEP 391: Dictionary-Based Configuration For Logging


The @ref{8b,,logging} module is very flexible; applications can define
a tree of logging subsystems, and each logger in this tree can filter
out certain messages, format them differently, and direct messages to
a varying number of handlers.

All this flexibility can require a lot of configuration.  You can
write Python statements to create objects and set their properties,
but a complex set-up requires verbose but boring code.
@ref{8b,,logging} also supports a @ref{d4e,,fileConfig()}
function that parses a file, but the file format doesn’t support
configuring filters, and it’s messier to generate programmatically.

Python 2.7 adds a @ref{13bc,,dictConfig()} function that
uses a dictionary to configure logging.  There are many ways to
produce a dictionary from different sources: construct one with code;
parse a file containing JSON; or use a YAML parsing library if one is
installed.  For more information see @ref{14fd,,Configuration functions}.

The following example configures two loggers, the root logger and a
logger named “network”.  Messages sent to the root logger will be
sent to the system log using the syslog protocol, and messages
to the “network” logger will be written to a @code{network.log} file
that will be rotated once the log reaches 1MB.

@example
import logging
import logging.config

configdict = @{
 'version': 1,    # Configuration schema in use; must be 1 for now
 'formatters': @{
     'standard': @{
         'format': ('%(asctime)s %(name)-15s '
                    '%(levelname)-8s %(message)s')@}@},

 'handlers': @{'netlog': @{'backupCount': 10,
                     'class': 'logging.handlers.RotatingFileHandler',
                     'filename': '/logs/network.log',
                     'formatter': 'standard',
                     'level': 'INFO',
                     'maxBytes': 1000000@},
              'syslog': @{'class': 'logging.handlers.SysLogHandler',
                         'formatter': 'standard',
                         'level': 'ERROR'@}@},

 # Specify all the subordinate loggers
 'loggers': @{
             'network': @{
                         'handlers': ['netlog']
             @}
 @},
 # Specify properties of the root logger
 'root': @{
          'handlers': ['syslog']
 @},
@}

# Set up configuration
logging.config.dictConfig(configdict)

# As an example, log two error messages
logger = logging.getLogger('/')
logger.error('Database not found')

netlogger = logging.getLogger('network')
netlogger.error('Connection failed')
@end example

Three smaller enhancements to the @ref{8b,,logging} module, all
implemented by Vinay Sajip, are:

@c rev79293


@itemize *

@item 
The @ref{86e,,SysLogHandler} class now supports
syslogging over TCP.  The constructor has a `socktype' parameter
giving the type of socket to use, either @ref{14fe,,socket.SOCK_DGRAM}
for UDP or @ref{14ff,,socket.SOCK_STREAM} for TCP.  The default
protocol remains UDP.

@item 
@ref{d4c,,Logger} instances gained a @ref{1500,,getChild()}
method that retrieves a descendant logger using a relative path.
For example, once you retrieve a logger by doing @code{log = getLogger('app')},
calling @code{log.getChild('network.listen')} is equivalent to
@code{getLogger('app.network.listen')}.

@item 
The @ref{1501,,LoggerAdapter} class gained an
@ref{1502,,isEnabledFor()} method that takes a
`level' and returns whether the underlying logger would
process a message of that level of importance.
@end itemize

@c XXX: Logger objects don't have a class declaration so the link don't work


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 391

@item PEP 391@footnote{https://peps.python.org/pep-0391/} - Dictionary-Based Configuration For Logging

PEP written and implemented by Vinay Sajip.
@end table


@node PEP 3106 Dictionary Views,PEP 3137 The memoryview Object,PEP 391 Dictionary-Based Configuration For Logging,What’s New in Python 2 7
@anchor{whatsnew/2 7 pep-3106-dictionary-views}@anchor{1503}
@subsection PEP 3106: Dictionary Views


The dictionary methods @ref{9d6,,keys()}, @ref{9d7,,values()}, and
@ref{9d8,,items()} are different in Python 3.x.  They return an object
called a `view' instead of a fully materialized list.

It’s not possible to change the return values of @ref{9d6,,keys()},
@ref{9d7,,values()}, and @ref{9d8,,items()} in Python 2.7 because
too much code would break.  Instead the 3.x versions were added
under the new names @code{viewkeys()}, @code{viewvalues()},
and @code{viewitems()}.

@example
>>> d = dict((i*10, chr(65+i)) for i in range(26))
>>> d
@{0: 'A', 130: 'N', 10: 'B', 140: 'O', 20: ..., 250: 'Z'@}
>>> d.viewkeys()
dict_keys([0, 130, 10, 140, 20, 150, 30, ..., 250])
@end example

Views can be iterated over, but the key and item views also behave
like sets.  The @code{&} operator performs intersection, and @code{|}
performs a union:

@example
>>> d1 = dict((i*10, chr(65+i)) for i in range(26))
>>> d2 = dict((i**.5, i) for i in range(1000))
>>> d1.viewkeys() & d2.viewkeys()
set([0.0, 10.0, 20.0, 30.0])
>>> d1.viewkeys() | range(0, 30)
set([0, 1, 130, 3, 4, 5, 6, ..., 120, 250])
@end example

The view keeps track of the dictionary and its contents change as the
dictionary is modified:

@example
>>> vk = d.viewkeys()
>>> vk
dict_keys([0, 130, 10, ..., 250])
>>> d[260] = '&'
>>> vk
dict_keys([0, 130, 260, 10, ..., 250])
@end example

However, note that you can’t add or remove keys while you’re iterating
over the view:

@example
>>> for k in vk:
...     d[k*2] = k
...
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
RuntimeError: dictionary changed size during iteration
@end example

You can use the view methods in Python 2.x code, and the 2to3
converter will change them to the standard @ref{9d6,,keys()},
@ref{9d7,,values()}, and @ref{9d8,,items()} methods.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 3106

@item PEP 3106@footnote{https://peps.python.org/pep-3106/} - Revamping dict.keys(), .values() and .items()

PEP written by Guido van Rossum.
Backported to 2.7 by Alexandre Vassalotti; bpo-1967@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1967}.
@end table


@node PEP 3137 The memoryview Object,Other Language Changes<14>,PEP 3106 Dictionary Views,What’s New in Python 2 7
@anchor{whatsnew/2 7 pep-3137-the-memoryview-object}@anchor{1504}
@subsection PEP 3137: The memoryview Object


The @ref{166,,memoryview} object provides a view of another object’s
memory content that matches the @ref{193,,bytes} type’s interface.

@example
>>> import string
>>> m = memoryview(string.letters)
>>> m
<memory at 0x37f850>
>>> len(m)           # Returns length of underlying object
52
>>> m[0], m[25], m[26]   # Indexing returns one byte
('a', 'z', 'A')
>>> m2 = m[0:26]         # Slicing returns another memoryview
>>> m2
<memory at 0x37f080>
@end example

The content of the view can be converted to a string of bytes or
a list of integers:

@example
>>> m2.tobytes()
'abcdefghijklmnopqrstuvwxyz'
>>> m2.tolist()
[97, 98, 99, 100, 101, 102, 103, ... 121, 122]
>>>
@end example

@ref{166,,memoryview} objects allow modifying the underlying object if
it’s a mutable object.

@example
>>> m2[0] = 75
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cannot modify read-only memory
>>> b = bytearray(string.letters)  # Creating a mutable object
>>> b
bytearray(b'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ')
>>> mb = memoryview(b)
>>> mb[0] = '*'         # Assign to view, changing the bytearray.
>>> b[0:5]              # The bytearray has been changed.
bytearray(b'*bcde')
>>>
@end example


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 3137

@item PEP 3137@footnote{https://peps.python.org/pep-3137/} - Immutable Bytes and Mutable Buffer

PEP written by Guido van Rossum.
Implemented by Travis Oliphant, Antoine Pitrou and others.
Backported to 2.7 by Antoine Pitrou; bpo-2396@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2396}.
@end table


@node Other Language Changes<14>,New and Improved Modules,PEP 3137 The memoryview Object,What’s New in Python 2 7
@anchor{whatsnew/2 7 other-language-changes}@anchor{1505}
@subsection Other Language Changes


Some smaller changes made to the core Python language are:


@itemize *

@item 
The syntax for set literals has been backported from Python 3.x.
Curly brackets are used to surround the contents of the resulting
mutable set; set literals are
distinguished from dictionaries by not containing colons and values.
@code{@{@}} continues to represent an empty dictionary; use
@code{set()} for an empty set.

@example
>>> @{1, 2, 3, 4, 5@}
set([1, 2, 3, 4, 5])
>>> set() # empty set
set([])
>>> @{@}    # empty dict
@{@}
@end example

Backported by Alexandre Vassalotti; bpo-2335@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2335}.

@item 
Dictionary and set comprehensions are another feature backported from
3.x, generalizing list/generator comprehensions to use
the literal syntax for sets and dictionaries.

@example
>>> @{x: x*x for x in range(6)@}
@{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25@}
>>> @{('a'*x) for x in range(6)@}
set(['@w{'}, 'a', 'aa', 'aaa', 'aaaa', 'aaaaa'])
@end example

Backported by Alexandre Vassalotti; bpo-2333@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2333}.

@item 
The @ref{187,,with} statement can now use multiple context managers
in one statement.  Context managers are processed from left to right
and each one is treated as beginning a new @code{with} statement.
This means that:

@example
with A() as a, B() as b:
    ... suite of statements ...
@end example

is equivalent to:

@example
with A() as a:
    with B() as b:
        ... suite of statements ...
@end example

The @code{contextlib.nested()} function provides a very similar
function, so it’s no longer necessary and has been deprecated.

(Proposed in @indicateurl{https://codereview.appspot.com/53094}; implemented by
Georg Brandl.)

@item 
Conversions between floating-point numbers and strings are
now correctly rounded on most platforms.  These conversions occur
in many different places: @ref{16a,,str()} on
floats and complex numbers; the @ref{197,,float} and @ref{198,,complex}
constructors;
numeric formatting; serializing and
deserializing floats and complex numbers using the
@ref{91,,marshal}, @ref{ab,,pickle}
and @ref{86,,json} modules;
parsing of float and imaginary literals in Python code;
and @ref{200,,Decimal}-to-float conversion.

Related to this, the @ref{1c3,,repr()} of a floating-point number `x'
now returns a result based on the shortest decimal string that’s
guaranteed to round back to `x' under correct rounding (with
round-half-to-even rounding mode).  Previously it gave a string
based on rounding x to 17 decimal digits.

@c maybe add an example?

The rounding library responsible for this improvement works on
Windows and on Unix platforms using the gcc, icc, or suncc
compilers.  There may be a small number of platforms where correct
operation of this code cannot be guaranteed, so the code is not
used on such systems.  You can find out which code is being used
by checking @ref{1506,,sys.float_repr_style},  which will be @code{short}
if the new code is in use and @code{legacy} if it isn’t.

Implemented by Eric Smith and Mark Dickinson, using David Gay’s
@code{dtoa.c} library; bpo-7117@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7117}.

@item 
Conversions from long integers and regular integers to floating
point now round differently, returning the floating-point number
closest to the number.  This doesn’t matter for small integers that
can be converted exactly, but for large numbers that will
unavoidably lose precision, Python 2.7 now approximates more
closely.  For example, Python 2.6 computed the following:

@example
>>> n = 295147905179352891391
>>> float(n)
2.9514790517935283e+20
>>> n - long(float(n))
65535L
@end example

Python 2.7’s floating-point result is larger, but much closer to the
true value:

@example
>>> n = 295147905179352891391
>>> float(n)
2.9514790517935289e+20
>>> n - long(float(n))
-1L
@end example

(Implemented by Mark Dickinson; bpo-3166@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3166}.)

Integer division is also more accurate in its rounding behaviours.  (Also
implemented by Mark Dickinson; bpo-1811@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1811}.)

@item 
Implicit coercion for complex numbers has been removed; the interpreter
will no longer ever attempt to call a @code{__coerce__()} method on complex
objects.  (Removed by Meador Inge and Mark Dickinson; bpo-5211@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5211}.)

@item 
The @ref{834,,str.format()} method now supports automatic numbering of the replacement
fields.  This makes using @code{str.format()} more closely resemble using
@code{%s} formatting:

@example
>>> '@{@}:@{@}:@{@}'.format(2009, 04, 'Sunday')
'2009:4:Sunday'
>>> '@{@}:@{@}:@{day@}'.format(2009, 4, day='Sunday')
'2009:4:Sunday'
@end example

The auto-numbering takes the fields from left to right, so the first @code{@{...@}}
specifier will use the first argument to @ref{834,,str.format()}, the next
specifier will use the next argument, and so on.  You can’t mix auto-numbering
and explicit numbering – either number all of your specifier fields or none
of them – but you can mix auto-numbering and named fields, as in the second
example above.  (Contributed by Eric Smith; bpo-5237@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5237}.)

Complex numbers now correctly support usage with @ref{19a,,format()},
and default to being right-aligned.
Specifying a precision or comma-separation applies to both the real
and imaginary parts of the number, but a specified field width and
alignment is applied to the whole of the resulting @code{1.5+3j}
output.  (Contributed by Eric Smith; bpo-1588@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1588} and bpo-7988@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7988}.)

The ‘F’ format code now always formats its output using uppercase characters,
so it will now produce ‘INF’ and ‘NAN’.
(Contributed by Eric Smith; bpo-3382@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3382}.)

A low-level change: the @ref{832,,object.__format__()} method now triggers
a @ref{acc,,PendingDeprecationWarning} if it’s passed a format string,
because the @code{__format__()} method for @ref{c84,,object} converts
the object to a string representation and formats that.  Previously
the method silently applied the format string to the string
representation, but that could hide mistakes in Python code.  If
you’re supplying formatting information such as an alignment or
precision, presumably you’re expecting the formatting to be applied
in some object-specific way.  (Fixed by Eric Smith; bpo-7994@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7994}.)

@item 
The @ref{19c,,int()} and @code{long()} types gained a @code{bit_length}
method that returns the number of bits necessary to represent
its argument in binary:

@example
>>> n = 37
>>> bin(n)
'0b100101'
>>> n.bit_length()
6
>>> n = 2**123-1
>>> n.bit_length()
123
>>> (n+1).bit_length()
124
@end example

(Contributed by Fredrik Johansson and Victor Stinner; bpo-3439@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3439}.)

@item 
The @ref{7f9,,import} statement will no longer try an absolute import
if a relative import (e.g. @code{from .os import sep}) fails.  This
fixes a bug, but could possibly break certain @code{import}
statements that were only working by accident.  (Fixed by Meador Inge;
bpo-7902@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7902}.)

@item 
It’s now possible for a subclass of the built-in @code{unicode} type
to override the @code{__unicode__()} method.  (Implemented by
Victor Stinner; bpo-1583863@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1583863}.)

@item 
The @ref{342,,bytearray} type’s @ref{1507,,translate()} method now accepts
@code{None} as its first argument.  (Fixed by Georg Brandl;
bpo-4759@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4759}.)

@c XXX bytearray doesn't seem to be documented

@item 
When using @ref{48f,,@@classmethod} and
@ref{451,,@@staticmethod} to wrap
methods as class or static methods, the wrapper object now
exposes the wrapped function as their @ref{1508,,__func__}
attribute.
(Contributed by Amaury Forgeot d’Arc, after a suggestion by
George Sakkis; bpo-5982@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5982}.)

@item 
When a restricted set of attributes were set using @code{__slots__},
deleting an unset attribute would not raise @ref{5f0,,AttributeError}
as you would expect.  Fixed by Benjamin Peterson; bpo-7604@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7604}.)

@item 
Two new encodings are now supported: “cp720”, used primarily for
Arabic text; and “cp858”, a variant of CP 850 that adds the euro
symbol.  (CP720 contributed by Alexander Belchenko and Amaury
Forgeot d’Arc in bpo-1616979@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1616979}; CP858 contributed by Tim Hatch in
bpo-8016@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8016}.)

@item 
The @code{file} object will now set the @code{filename} attribute
on the @ref{1259,,IOError} exception when trying to open a directory
on POSIX platforms (noted by Jan Kaliszewski; bpo-4764@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4764}), and
now explicitly checks for and forbids writing to read-only file objects
instead of trusting the C library to catch and report the error
(fixed by Stefan Krah; bpo-5677@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5677}).

@item 
The Python tokenizer now translates line endings itself, so the
@ref{4b2,,compile()} built-in function now accepts code using any
line-ending convention.  Additionally, it no longer requires that the
code end in a newline.

@item 
Extra parentheses in function definitions are illegal in Python 3.x,
meaning that you get a syntax error from @code{def f((x)): pass}.  In
Python3-warning mode, Python 2.7 will now warn about this odd usage.
(Noted by James Lingard; bpo-7362@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7362}.)

@item 
It’s now possible to create weak references to old-style class
objects.  New-style classes were always weak-referenceable.  (Fixed
by Antoine Pitrou; bpo-8268@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8268}.)

@item 
When a module object is garbage-collected, the module’s dictionary is
now only cleared if no one else is holding a reference to the
dictionary (bpo-7140@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7140}).
@end itemize

@c ======================================================================

@menu
* Interpreter Changes:: 
* Optimizations: Optimizations<14>. 

@end menu

@node Interpreter Changes,Optimizations<14>,,Other Language Changes<14>
@anchor{whatsnew/2 7 interpreter-changes}@anchor{1509}@anchor{whatsnew/2 7 new-27-interpreter}@anchor{150a}
@subsubsection Interpreter Changes


A new environment variable, 
@geindex PYTHONWARNINGS
@geindex environment variable; PYTHONWARNINGS
@ref{da9,,PYTHONWARNINGS},
allows controlling warnings.  It should be set to a string
containing warning settings, equivalent to those
used with the @ref{acb,,-W} switch, separated by commas.
(Contributed by Brian Curtin; bpo-7301@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7301}.)

For example, the following setting will print warnings every time
they occur, but turn warnings from the @ref{75,,Cookie} module into an
error.  (The exact syntax for setting an environment variable varies
across operating systems and shells.)

@example
export PYTHONWARNINGS=all,error:::Cookie:0
@end example

@c ======================================================================

@node Optimizations<14>,,Interpreter Changes,Other Language Changes<14>
@anchor{whatsnew/2 7 optimizations}@anchor{150b}
@subsubsection Optimizations


Several performance enhancements have been added:


@itemize *

@item 
A new opcode was added to perform the initial setup for
@ref{187,,with} statements, looking up the @ref{7e5,,__enter__()} and
@ref{150c,,__exit__()} methods.  (Contributed by Benjamin Peterson.)

@item 
The garbage collector now performs better for one common usage
pattern: when many objects are being allocated without deallocating
any of them.  This would previously take quadratic
time for garbage collection, but now the number of full garbage collections
is reduced as the number of objects on the heap grows.
The new logic only performs a full garbage collection pass when
the middle generation has been collected 10 times and when the
number of survivor objects from the middle generation exceeds 10% of
the number of objects in the oldest generation.  (Suggested by Martin
von Löwis and implemented by Antoine Pitrou; bpo-4074@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4074}.)

@item 
The garbage collector tries to avoid tracking simple containers
which can’t be part of a cycle. In Python 2.7, this is now true for
tuples and dicts containing atomic types (such as ints, strings,
etc.). Transitively, a dict containing tuples of atomic types won’t
be tracked either. This helps reduce the cost of each
garbage collection by decreasing the number of objects to be
considered and traversed by the collector.
(Contributed by Antoine Pitrou; bpo-4688@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4688}.)

@item 
Long integers are now stored internally either in base @code{2**15} or in base
@code{2**30}, the base being determined at build time.  Previously, they
were always stored in base @code{2**15}.  Using base @code{2**30} gives
significant performance improvements on 64-bit machines, but
benchmark results on 32-bit machines have been mixed.  Therefore,
the default is to use base @code{2**30} on 64-bit machines and base @code{2**15}
on 32-bit machines; on Unix, there’s a new configure option
@code{--enable-big-digits} that can be used to override this default.

Apart from the performance improvements this change should be
invisible to end users, with one exception: for testing and
debugging purposes there’s a new structseq @code{sys.long_info} that
provides information about the internal format, giving the number of
bits per digit and the size in bytes of the C type used to store
each digit:

@example
>>> import sys
>>> sys.long_info
sys.long_info(bits_per_digit=30, sizeof_digit=4)
@end example

(Contributed by Mark Dickinson; bpo-4258@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4258}.)

Another set of changes made long objects a few bytes smaller: 2 bytes
smaller on 32-bit systems and 6 bytes on 64-bit.
(Contributed by Mark Dickinson; bpo-5260@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5260}.)

@item 
The division algorithm for long integers has been made faster
by tightening the inner loop, doing shifts instead of multiplications,
and fixing an unnecessary extra iteration.
Various benchmarks show speedups of between 50% and 150% for long
integer divisions and modulo operations.
(Contributed by Mark Dickinson; bpo-5512@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5512}.)
Bitwise operations are also significantly faster (initial patch by
Gregory Smith; bpo-1087418@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1087418}).

@item 
The implementation of @code{%} checks for the left-side operand being
a Python string and special-cases it; this results in a 1–3%
performance increase for applications that frequently use @code{%}
with strings, such as templating libraries.
(Implemented by Collin Winter; bpo-5176@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5176}.)

@item 
List comprehensions with an @code{if} condition are compiled into
faster bytecode.  (Patch by Antoine Pitrou, back-ported to 2.7
by Jeffrey Yasskin; bpo-4715@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4715}.)

@item 
Converting an integer or long integer to a decimal string was made
faster by special-casing base 10 instead of using a generalized
conversion function that supports arbitrary bases.
(Patch by Gawain Bolton; bpo-6713@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6713}.)

@item 
The @code{split()}, @code{replace()}, @code{rindex()},
@code{rpartition()}, and @code{rsplit()} methods of string-like types
(strings, Unicode strings, and @ref{342,,bytearray} objects) now use a
fast reverse-search algorithm instead of a character-by-character
scan.  This is sometimes faster by a factor of 10.  (Added by
Florent Xicluna; bpo-7462@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7462} and bpo-7622@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7622}.)

@item 
The @ref{ab,,pickle} and @code{cPickle} modules now automatically
intern the strings used for attribute names, reducing memory usage
of the objects resulting from unpickling.  (Contributed by Jake
McGuire; bpo-5084@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5084}.)

@item 
The @code{cPickle} module now special-cases dictionaries,
nearly halving the time required to pickle them.
(Contributed by Collin Winter; bpo-5670@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5670}.)
@end itemize

@c ======================================================================

@node New and Improved Modules,Build and C API Changes<8>,Other Language Changes<14>,What’s New in Python 2 7
@anchor{whatsnew/2 7 new-and-improved-modules}@anchor{150d}
@subsection New and Improved Modules


As in every release, Python’s standard library received a number of
enhancements and bug fixes.  Here’s a partial list of the most notable
changes, sorted alphabetically by module name. Consult the
@code{Misc/NEWS} file in the source tree for a more complete list of
changes, or look through the Subversion logs for all the details.


@itemize *

@item 
The @ref{10,,bdb} module’s base debugging class @ref{2d7,,Bdb}
gained a feature for skipping modules.  The constructor
now takes an iterable containing glob-style patterns such as
@code{django.*}; the debugger will not step into stack frames
from a module that matches one of these patterns.
(Contributed by Maru Newby after a suggestion by
Senthil Kumaran; bpo-5142@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5142}.)

@item 
The @ref{11,,binascii} module now supports the buffer API, so it can be
used with @ref{166,,memoryview} instances and other similar buffer objects.
(Backported from 3.x by Florent Xicluna; bpo-7703@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7703}.)

@item 
Updated module: the @code{bsddb} module has been updated from 4.7.2devel9
to version 4.8.4 of
the pybsddb package@footnote{https://www.jcea.es/programacion/pybsddb.htm}.
The new version features better Python 3.x compatibility, various bug fixes,
and adds several new BerkeleyDB flags and methods.
(Updated by Jesús Cea Avión; bpo-8156@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8156}.  The pybsddb
changelog can be read at @indicateurl{https://hg.jcea.es/pybsddb/file/tip/ChangeLog}.)

@item 
The @ref{14,,bz2} module’s @ref{a6c,,BZ2File} now supports the context
management protocol, so you can write @code{with bz2.BZ2File(...) as f:}.
(Contributed by Hagen Fürstenau; bpo-3860@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3860}.)

@item 
New class: the @ref{129d,,Counter} class in the @ref{1e,,collections}
module is useful for tallying data.  @code{Counter} instances
behave mostly like dictionaries but return zero for missing keys instead of
raising a @ref{5e7,,KeyError}:

@example
>>> from collections import Counter
>>> c = Counter()
>>> for letter in 'here is a sample of english text':
...   c[letter] += 1
...
>>> c
Counter(@{' ': 6, 'e': 5, 's': 3, 'a': 2, 'i': 2, 'h': 2,
'l': 2, 't': 2, 'g': 1, 'f': 1, 'm': 1, 'o': 1, 'n': 1,
'p': 1, 'r': 1, 'x': 1@})
>>> c['e']
5
>>> c['z']
0
@end example

There are three additional @ref{129d,,Counter} methods.
@ref{150e,,most_common()} returns the N most common
elements and their counts.  @ref{150f,,elements()}
returns an iterator over the contained elements, repeating each
element as many times as its count.
@ref{13ea,,subtract()} takes an iterable and
subtracts one for each element instead of adding; if the argument is
a dictionary or another @code{Counter}, the counts are
subtracted.

@example
>>> c.most_common(5)
[(' ', 6), ('e', 5), ('s', 3), ('a', 2), ('i', 2)]
>>> c.elements() ->
   'a', 'a', ' ', ' ', ' ', ' ', ' ', ' ',
   'e', 'e', 'e', 'e', 'e', 'g', 'f', 'i', 'i',
   'h', 'h', 'm', 'l', 'l', 'o', 'n', 'p', 's',
   's', 's', 'r', 't', 't', 'x'
>>> c['e']
5
>>> c.subtract('very heavy on the letter e')
>>> c['e']    # Count is now lower
-1
@end example

Contributed by Raymond Hettinger; bpo-1696199@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1696199}.

@c revision 79660

New class: @ref{7f4,,OrderedDict} is described in the earlier
section @ref{14f5,,PEP 372; Adding an Ordered Dictionary to collections}.

New method: The @ref{7f5,,deque} data type now has a
@ref{13ec,,count()} method that returns the number of
contained elements equal to the supplied argument `x', and a
@ref{13ed,,reverse()} method that reverses the elements
of the deque in-place.  @code{deque} also exposes its maximum
length as the read-only @ref{1510,,maxlen} attribute.
(Both features added by Raymond Hettinger.)

The @ref{4e1,,namedtuple} class now has an optional `rename' parameter.
If `rename' is true, field names that are invalid because they’ve
been repeated or aren’t legal Python identifiers will be
renamed to legal names that are derived from the field’s
position within the list of fields:

@example
>>> from collections import namedtuple
>>> T = namedtuple('T', ['field1', '$illegal', 'for', 'field2'], rename=True)
>>> T._fields
('field1', '_1', '_2', 'field2')
@end example

(Added by Raymond Hettinger; bpo-1818@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1818}.)

Finally, the @ref{acd,,Mapping} abstract base class now
returns @ref{1a3,,NotImplemented} if a mapping is compared to
another type that isn’t a @code{Mapping}.
(Fixed by Daniel Stutzbach; bpo-8729@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8729}.)

@item 
Constructors for the parsing classes in the @ref{26,,ConfigParser} module now
take an `allow_no_value' parameter, defaulting to false; if true,
options without values will be allowed.  For example:

@example
>>> import ConfigParser, StringIO
>>> sample_config = """
... [mysqld]
... user = mysql
... pid-file = /var/run/mysqld/mysqld.pid
... skip-bdb
... """
>>> config = ConfigParser.RawConfigParser(allow_no_value=True)
>>> config.readfp(StringIO.StringIO(sample_config))
>>> config.get('mysqld', 'user')
'mysql'
>>> print config.get('mysqld', 'skip-bdb')
None
>>> print config.get('mysqld', 'unknown')
Traceback (most recent call last):
  ...
NoOptionError: No option 'unknown' in section: 'mysqld'
@end example

(Contributed by Mats Kindahl; bpo-7005@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7005}.)

@item 
Deprecated function: @code{contextlib.nested()}, which allows
handling more than one context manager with a single @ref{187,,with}
statement, has been deprecated, because the @code{with} statement
now supports multiple context managers.

@item 
The @ref{74,,cookielib} module now ignores cookies that have an invalid
version field, one that doesn’t contain an integer value.  (Fixed by
John J. Lee; bpo-3924@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3924}.)

@item 
The @ref{29,,copy} module’s @ref{d6b,,deepcopy()} function will now
correctly copy bound instance methods.  (Implemented by
Robert Collins; bpo-1515@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1515}.)

@item 
The @ref{2e,,ctypes} module now always converts @code{None} to a C @code{NULL}
pointer for arguments declared as pointers.  (Changed by Thomas
Heller; bpo-4606@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4606}.)  The underlying libffi library@footnote{https://sourceware.org/libffi/} has been updated to version
3.0.9, containing various fixes for different platforms.  (Updated
by Matthias Klose; bpo-8142@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8142}.)

@item 
New method: the @ref{34,,datetime} module’s @ref{bc9,,timedelta} class
gained a @ref{1511,,total_seconds()} method that returns the
number of seconds in the duration.  (Contributed by Brian Quinlan; bpo-5788@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5788}.)

@item 
New method: the @ref{200,,Decimal} class gained a
@ref{1410,,from_float()} class method that performs an exact
conversion of a floating-point number to a @code{Decimal}.
This exact conversion strives for the
closest decimal approximation to the floating-point representation’s value;
the resulting decimal value will therefore still include the inaccuracy,
if any.
For example, @code{Decimal.from_float(0.1)} returns
@code{Decimal('0.1000000000000000055511151231257827021181583404541015625')}.
(Implemented by Raymond Hettinger; bpo-4796@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4796}.)

Comparing instances of @ref{200,,Decimal} with floating-point
numbers now produces sensible results based on the numeric values
of the operands.  Previously such comparisons would fall back to
Python’s default rules for comparing objects, which produced arbitrary
results based on their type.  Note that you still cannot combine
@code{Decimal} and floating point in other operations such as addition,
since you should be explicitly choosing how to convert between float and
@code{Decimal}.  (Fixed by Mark Dickinson; bpo-2531@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2531}.)

The constructor for @ref{200,,Decimal} now accepts
floating-point numbers (added by Raymond Hettinger; bpo-8257@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8257})
and non-European Unicode characters such as Arabic-Indic digits
(contributed by Mark Dickinson; bpo-6595@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6595}).

Most of the methods of the @ref{12bb,,Context} class now accept integers
as well as @ref{200,,Decimal} instances; the only exceptions are the
@ref{1512,,canonical()} and @ref{1513,,is_canonical()}
methods.  (Patch by Juan José Conti; bpo-7633@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7633}.)

When using @ref{200,,Decimal} instances with a string’s
@ref{834,,format()} method, the default alignment was previously
left-alignment.  This has been changed to right-alignment, which is
more sensible for numeric types.  (Changed by Mark Dickinson; bpo-6857@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6857}.)

Comparisons involving a signaling NaN value (or @code{sNAN}) now signal
@ref{12b4,,InvalidOperation} instead of silently returning a true or
false value depending on the comparison operator.  Quiet NaN values
(or @code{NaN}) are now hashable.  (Fixed by Mark Dickinson;
bpo-7279@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7279}.)

@item 
The @ref{3b,,difflib} module now produces output that is more
compatible with modern @code{diff}/@code{patch} tools
through one small change, using a tab character instead of spaces as
a separator in the header giving the filename.  (Fixed by Anatoly
Techtonik; bpo-7585@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7585}.)

@item 
The Distutils @code{sdist} command now always regenerates the
@code{MANIFEST} file, since even if the @code{MANIFEST.in} or
@code{setup.py} files haven’t been modified, the user might have
created some new files that should be included.
(Fixed by Tarek Ziadé; bpo-8688@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8688}.)

@item 
The @ref{3e,,doctest} module’s @ref{1514,,IGNORE_EXCEPTION_DETAIL} flag
will now ignore the name of the module containing the exception
being tested.  (Patch by Lennart Regebro; bpo-7490@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7490}.)

@item 
The @ref{3f,,email} module’s @ref{581,,Message} class will
now accept a Unicode-valued payload, automatically converting the
payload to the encoding specified by @code{output_charset}.
(Added by R. David Murray; bpo-1368247@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1368247}.)

@item 
The @ref{215,,Fraction} class now accepts a single float or
@ref{200,,Decimal} instance, or two rational numbers, as
arguments to its constructor.  (Implemented by Mark Dickinson;
rationals added in bpo-5812@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5812}, and float/decimal in
bpo-8294@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8294}.)

Ordering comparisons (@code{<}, @code{<=}, @code{>}, @code{>=}) between
fractions and complex numbers now raise a @ref{199,,TypeError}.
This fixes an oversight, making the @ref{215,,Fraction}
match the other numeric types.

@c revision 79455

@item 
New class: @ref{afd,,FTP_TLS} in
the @ref{62,,ftplib} module provides secure FTP
connections using TLS encapsulation of authentication as well as
subsequent control and data transfers.
(Contributed by Giampaolo Rodola; bpo-2054@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2054}.)

The @ref{1515,,storbinary()} method for binary uploads can now restart
uploads thanks to an added `rest' parameter (patch by Pablo Mouzo;
bpo-6845@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6845}.)

@item 
New class decorator: @ref{1148,,total_ordering()} in the @ref{63,,functools}
module takes a class that defines an @ref{cf8,,__eq__()} method and one of
@ref{14ac,,__lt__()}, @ref{1516,,__le__()}, @ref{1517,,__gt__()}, or @ref{1518,,__ge__()},
and generates the missing comparison methods.  Since the
@code{__cmp__()} method is being deprecated in Python 3.x,
this decorator makes it easier to define ordered classes.
(Added by Raymond Hettinger; bpo-5479@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5479}.)

New function: @ref{13e6,,cmp_to_key()} will take an old-style comparison
function that expects two arguments and return a new callable that
can be used as the `key' parameter to functions such as
@ref{dcd,,sorted()}, @ref{1111,,min()} and @ref{1112,,max()}, etc.  The primary
intended use is to help with making code compatible with Python 3.x.
(Added by Raymond Hettinger.)

@item 
New function: the @ref{64,,gc} module’s @ref{1519,,is_tracked()} returns
true if a given instance is tracked by the garbage collector, false
otherwise. (Contributed by Antoine Pitrou; bpo-4688@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4688}.)

@item 
The @ref{6b,,gzip} module’s @ref{65c,,GzipFile} now supports the context
management protocol, so you can write @code{with gzip.GzipFile(...) as f:}
(contributed by Hagen Fürstenau; bpo-3860@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3860}), and it now implements
the @ref{8a5,,io.BufferedIOBase} ABC, so you can wrap it with
@ref{141a,,io.BufferedReader} for faster processing
(contributed by Nir Aides; bpo-7471@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7471}).
It’s also now possible to override the modification time
recorded in a gzipped file by providing an optional timestamp to
the constructor.  (Contributed by Jacques Frechet; bpo-4272@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4272}.)

Files in gzip format can be padded with trailing zero bytes; the
@ref{6b,,gzip} module will now consume these trailing bytes.  (Fixed by
Tadek Pietraszek and Brian Curtin; bpo-2846@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2846}.)

@item 
New attribute: the @ref{6c,,hashlib} module now has an @code{algorithms}
attribute containing a tuple naming the supported algorithms.
In Python 2.7, @code{hashlib.algorithms} contains
@code{('md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512')}.
(Contributed by Carl Chenet; bpo-7418@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7418}.)

@item 
The default @ref{12da,,HTTPResponse} class used by the @ref{72,,httplib} module now
supports buffering, resulting in much faster reading of HTTP responses.
(Contributed by Kristján Valur Jónsson; bpo-4879@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4879}.)

The @ref{d3b,,HTTPConnection} and @ref{d3c,,HTTPSConnection} classes
now support a `source_address' parameter, a @code{(host, port)} 2-tuple
giving the source address that will be used for the connection.
(Contributed by Eldon Ziegler; bpo-3972@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3972}.)

@item 
The @code{ihooks} module now supports relative imports.  Note that
@code{ihooks} is an older module for customizing imports,
superseded by the @code{imputil} module added in Python 2.0.
(Relative import support added by Neil Schemenauer.)

@c revision 75423

@item 
The @ref{78,,imaplib} module now supports IPv6 addresses.
(Contributed by Derek Morr; bpo-1655@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1655}.)

@item 
New function: the @ref{82,,inspect} module’s @ref{10c4,,getcallargs()}
takes a callable and its positional and keyword arguments,
and figures out which of the callable’s parameters will receive each argument,
returning a dictionary mapping argument names to their values.  For example:

@example
>>> from inspect import getcallargs
>>> def f(a, b=1, *pos, **named):
...     pass
...
>>> getcallargs(f, 1, 2, 3)
@{'a': 1, 'b': 2, 'pos': (3,), 'named': @{@}@}
>>> getcallargs(f, a=2, x=4)
@{'a': 2, 'b': 1, 'pos': (), 'named': @{'x': 4@}@}
>>> getcallargs(f)
Traceback (most recent call last):
...
TypeError: f() takes at least 1 argument (0 given)
@end example

Contributed by George Sakkis; bpo-3135@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3135}.

@item 
Updated module: The @ref{83,,io} library has been upgraded to the version shipped with
Python 3.1.  For 3.1, the I/O library was entirely rewritten in C
and is 2 to 20 times faster depending on the task being performed.  The
original Python version was renamed to the @code{_pyio} module.

One minor resulting change: the @ref{8a6,,io.TextIOBase} class now
has an @ref{151a,,errors} attribute giving the error setting
used for encoding and decoding errors (one of @code{'strict'}, @code{'replace'},
@code{'ignore'}).

The @ref{151b,,io.FileIO} class now raises an @ref{2c2,,OSError} when passed
an invalid file descriptor.  (Implemented by Benjamin Peterson;
bpo-4991@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4991}.)  The @ref{151c,,truncate()} method now preserves the
file position; previously it would change the file position to the
end of the new file.  (Fixed by Pascal Chambon; bpo-6939@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6939}.)

@item 
New function: @code{itertools.compress(data, selectors)} takes two
iterators.  Elements of `data' are returned if the corresponding
value in `selectors' is true:

@example
itertools.compress('ABCDEF', [1,0,1,0,1,1]) =>
  A, C, E, F
@end example

@c maybe here is better to use >>> list(itertools.compress(...)) instead

New function: @code{itertools.combinations_with_replacement(iter, r)}
returns all the possible `r'-length combinations of elements from the
iterable `iter'.  Unlike @ref{151d,,combinations()}, individual elements
can be repeated in the generated combinations:

@example
itertools.combinations_with_replacement('abc', 2) =>
  ('a', 'a'), ('a', 'b'), ('a', 'c'),
  ('b', 'b'), ('b', 'c'), ('c', 'c')
@end example

Note that elements are treated as unique depending on their position
in the input, not their actual values.

The @ref{148f,,itertools.count()} function now has a `step' argument that
allows incrementing by values other than 1.  @code{count()} also
now allows keyword arguments, and using non-integer values such as
floats or @ref{200,,Decimal} instances.  (Implemented by Raymond
Hettinger; bpo-5032@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5032}.)

@ref{151d,,itertools.combinations()} and @ref{151e,,itertools.product()}
previously raised @ref{2ee,,ValueError} for values of `r' larger than
the input iterable.  This was deemed a specification error, so they
now return an empty iterator.  (Fixed by Raymond Hettinger; bpo-4816@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4816}.)

@item 
Updated module: The @ref{86,,json} module was upgraded to version 2.0.9 of the
simplejson package, which includes a C extension that makes
encoding and decoding faster.
(Contributed by Bob Ippolito; bpo-4136@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4136}.)

To support the new @ref{7f4,,collections.OrderedDict} type, @ref{eb8,,json.load()}
now has an optional `object_pairs_hook' parameter that will be called
with any object literal that decodes to a list of pairs.
(Contributed by Raymond Hettinger; bpo-5381@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5381}.)

@item 
The @ref{8f,,mailbox} module’s @ref{65e,,Maildir} class now records the
timestamp on the directories it reads, and only re-reads them if the
modification time has subsequently changed.  This improves
performance by avoiding unneeded directory scans.  (Fixed by
A.M. Kuchling and Antoine Pitrou; bpo-1607951@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1607951}, bpo-6896@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6896}.)

@item 
New functions: the @ref{92,,math} module gained
@ref{dd9,,erf()} and @ref{dda,,erfc()} for the error function and the complementary error function,
@ref{13f8,,expm1()} which computes @code{e**x - 1} with more precision than
using @ref{151f,,exp()} and subtracting 1,
@ref{13f9,,gamma()} for the Gamma function, and
@ref{13fa,,lgamma()} for the natural log of the Gamma function.
(Contributed by Mark Dickinson and nirinA raseliarison; bpo-3366@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3366}.)

@item 
The @ref{98,,multiprocessing} module’s @code{Manager*} classes
can now be passed a callable that will be called whenever
a subprocess is started, along with a set of arguments that will be
passed to the callable.
(Contributed by lekma; bpo-5585@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5585}.)

The @ref{1171,,Pool} class, which controls a pool of worker processes,
now has an optional `maxtasksperchild' parameter.  Worker processes
will perform the specified number of tasks and then exit, causing the
@code{Pool} to start a new worker.  This is useful if tasks may leak
memory or other resources, or if some tasks will cause the worker to
become very large.
(Contributed by Charles Cazabon; bpo-6963@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6963}.)

@item 
The @code{nntplib} module now supports IPv6 addresses.
(Contributed by Derek Morr; bpo-1664@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1664}.)

@item 
New functions: the @ref{a5,,os} module wraps the following POSIX system
calls: @ref{1520,,getresgid()} and @ref{1521,,getresuid()}, which return the
real, effective, and saved GIDs and UIDs;
@ref{1522,,setresgid()} and @ref{1523,,setresuid()}, which set
real, effective, and saved GIDs and UIDs to new values;
@ref{1524,,initgroups()}, which initialize the group access list
for the current process.  (GID/UID functions
contributed by Travis H.; bpo-6508@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6508}.  Support for initgroups added
by Jean-Paul Calderone; bpo-7333@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7333}.)

The @ref{4b6,,os.fork()} function now re-initializes the import lock in
the child process; this fixes problems on Solaris when @code{fork()}
is called from a thread.  (Fixed by Zsolt Cserna; bpo-7242@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7242}.)

@item 
In the @ref{a6,,os.path} module, the @ref{1525,,normpath()} and
@ref{1526,,abspath()} functions now preserve Unicode; if their input path
is a Unicode string, the return value is also a Unicode string.
(@ref{1525,,normpath()} fixed by Matt Giuca in bpo-5827@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5827};
@ref{1526,,abspath()} fixed by Ezio Melotti in bpo-3426@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3426}.)

@item 
The @ref{ba,,pydoc} module now has help for the various symbols that Python
uses.  You can now do @code{help('<<')} or @code{help('@@')}, for example.
(Contributed by David Laban; bpo-4739@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4739}.)

@item 
The @ref{be,,re} module’s @ref{5a2,,split()}, @ref{5a3,,sub()}, and @ref{5a4,,subn()}
now accept an optional `flags' argument, for consistency with the
other functions in the module.  (Added by Gregory P. Smith.)

@item 
New function: @ref{4a5,,run_path()} in the @ref{c3,,runpy} module
will execute the code at a provided `path' argument.  `path' can be
the path of a Python source file (@code{example.py}), a compiled
bytecode file (@code{example.pyc}), a directory
(@code{./package/}), or a zip archive (@code{example.zip}).  If a
directory or zip path is provided, it will be added to the front of
@code{sys.path} and the module @ref{1,,__main__} will be imported.  It’s
expected that the directory or zip contains a @code{__main__.py};
if it doesn’t, some other @code{__main__.py} might be imported from
a location later in @code{sys.path}.  This makes more of the machinery
of @code{runpy} available to scripts that want to mimic the way
Python’s command line processes an explicit path name.
(Added by Nick Coghlan; bpo-6816@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6816}.)

@item 
New function: in the @ref{ca,,shutil} module, @ref{6db,,make_archive()}
takes a filename, archive type (zip or tar-format), and a directory
path, and creates an archive containing the directory’s contents.
(Added by Tarek Ziadé.)

@ref{ca,,shutil}’s @ref{c54,,copyfile()} and @ref{c24,,copytree()}
functions now raise a @ref{1527,,SpecialFileError} exception when
asked to copy a named pipe.  Previously the code would treat
named pipes like a regular file by opening them for reading, and
this would block indefinitely.  (Fixed by Antoine Pitrou; bpo-3002@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3002}.)

@item 
The @ref{cb,,signal} module no longer re-installs the signal handler
unless this is truly necessary, which fixes a bug that could make it
impossible to catch the EINTR signal robustly.  (Fixed by
Charles-Francois Natali; bpo-8354@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8354}.)

@item 
New functions: in the @ref{cc,,site} module, three new functions
return various site- and user-specific paths.
@ref{144a,,getsitepackages()} returns a list containing all
global site-packages directories,
@ref{144c,,getusersitepackages()} returns the path of the user’s
site-packages directory, and
@ref{144b,,getuserbase()} returns the value of the @ref{1528,,USER_BASE}
environment variable, giving the path to a directory that can be used
to store data.
(Contributed by Tarek Ziadé; bpo-6693@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6693}.)

The @ref{cc,,site} module now reports exceptions occurring
when the @ref{cd,,sitecustomize} module is imported, and will no longer
catch and swallow the @ref{bcb,,KeyboardInterrupt} exception.  (Fixed by
Victor Stinner; bpo-3137@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3137}.)

@item 
The @ref{884,,create_connection()} function
gained a `source_address' parameter, a @code{(host, port)} 2-tuple
giving the source address that will be used for the connection.
(Contributed by Eldon Ziegler; bpo-3972@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3972}.)

The @ref{1529,,recv_into()} and @ref{152a,,recvfrom_into()}
methods will now write into objects that support the buffer API, most usefully
the @ref{342,,bytearray} and @ref{166,,memoryview} objects.  (Implemented by
Antoine Pitrou; bpo-8104@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8104}.)

@item 
The @ref{d2,,SocketServer} module’s @ref{152b,,TCPServer} class now
supports socket timeouts and disabling the Nagle algorithm.
The @code{disable_nagle_algorithm} class attribute
defaults to @code{False}; if overridden to be true,
new request connections will have the TCP_NODELAY option set to
prevent buffering many small sends into a single TCP packet.
The @ref{152c,,timeout} class attribute can hold
a timeout in seconds that will be applied to the request socket; if
no request is received within that time, @ref{152d,,handle_timeout()}
will be called and @ref{152e,,handle_request()} will return.
(Contributed by Kristján Valur Jónsson; bpo-6192@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6192} and bpo-6267@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6267}.)

@item 
Updated module: the @ref{d4,,sqlite3} module has been updated to
version 2.6.0 of the pysqlite package@footnote{https://github.com/ghaering/pysqlite}. Version 2.6.0 includes a number of bugfixes, and adds
the ability to load SQLite extensions from shared libraries.
Call the @code{enable_load_extension(True)} method to enable extensions,
and then call @ref{6e0,,load_extension()} to load a particular shared library.
(Updated by Gerhard Häring.)

@item 
The @ref{d5,,ssl} module’s @ref{aed,,SSLSocket} objects now support the
buffer API, which fixed a test suite failure (fix by Antoine Pitrou;
bpo-7133@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7133}) and automatically set
OpenSSL’s @code{SSL_MODE_AUTO_RETRY}, which will prevent an error
code being returned from @code{recv()} operations that trigger an SSL
renegotiation (fix by Antoine Pitrou; bpo-8222@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8222}).

The @ref{749,,wrap_socket()} constructor function now takes a
`ciphers' argument that’s a string listing the encryption algorithms
to be allowed; the format of the string is described
in the OpenSSL documentation@footnote{https://docs.openssl.org/1.0.2/man1/ciphers/}.
(Added by Antoine Pitrou; bpo-8322@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8322}.)

Another change makes the extension load all of OpenSSL’s ciphers and
digest algorithms so that they’re all available.  Some SSL
certificates couldn’t be verified, reporting an “unknown algorithm”
error.  (Reported by Beda Kosata, and fixed by Antoine Pitrou;
bpo-8484@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8484}.)

The version of OpenSSL being used is now available as the module
attributes @ref{142a,,ssl.OPENSSL_VERSION} (a string),
@ref{142b,,ssl.OPENSSL_VERSION_INFO} (a 5-tuple), and
@ref{142c,,ssl.OPENSSL_VERSION_NUMBER} (an integer).  (Added by Antoine
Pitrou; bpo-8321@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8321}.)

@item 
The @ref{db,,struct} module will no longer silently ignore overflow
errors when a value is too large for a particular integer format
code (one of @code{bBhHiIlLqQ}); it now always raises a
@ref{152f,,struct.error} exception.  (Changed by Mark Dickinson;
bpo-1523@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1523}.)  The @ref{1482,,pack()} function will also
attempt to use @ref{19f,,__index__()} to convert and pack non-integers
before trying the @ref{19e,,__int__()} method or reporting an error.
(Changed by Mark Dickinson; bpo-8300@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8300}.)

@item 
New function: the @ref{dc,,subprocess} module’s
@ref{11c8,,check_output()} runs a command with a specified set of arguments
and returns the command’s output as a string when the command runs without
error, or raises a @ref{1530,,CalledProcessError} exception otherwise.

@example
>>> subprocess.check_output(['df', '-h', '.'])
'Filesystem     Size   Used  Avail Capacity  Mounted on\n
/dev/disk0s2    52G    49G   3.0G    94%    /\n'

>>> subprocess.check_output(['df', '-h', '/bogus'])
  ...
subprocess.CalledProcessError: Command '['df', '-h', '/bogus']' returned non-zero exit status 1
@end example

(Contributed by Gregory P. Smith.)

The @ref{dc,,subprocess} module will now retry its internal system calls
on receiving an @ref{f8d,,EINTR} signal.  (Reported by several people; final
patch by Gregory P. Smith in bpo-1068268@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1068268}.)

@item 
New function: @ref{1531,,is_declared_global()} in the @ref{de,,symtable} module
returns true for variables that are explicitly declared to be global,
false for ones that are implicitly global.
(Contributed by Jeremy Hylton.)

@item 
The @ref{e2,,syslog} module will now use the value of @code{sys.argv[0]} as the
identifier instead of the previous default value of @code{'python'}.
(Changed by Sean Reifschneider; bpo-8451@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8451}.)

@item 
The @ref{8b1,,sys.version_info} value is now a named tuple, with attributes
named @code{major}, @code{minor}, @code{micro},
@code{releaselevel}, and @code{serial}.  (Contributed by Ross
Light; bpo-4285@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4285}.)

@ref{ee9,,sys.getwindowsversion()} also returns a named tuple,
with attributes named @code{major}, @code{minor}, @code{build},
@code{platform}, @code{service_pack}, @code{service_pack_major},
@code{service_pack_minor}, @code{suite_mask}, and
@code{product_type}.  (Contributed by Brian Curtin; bpo-7766@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7766}.)

@item 
The @ref{e4,,tarfile} module’s default error handling has changed, to
no longer suppress fatal errors.  The default error level was previously 0,
which meant that errors would only result in a message being written to the
debug log, but because the debug log is not activated by default,
these errors go unnoticed.  The default error level is now 1,
which raises an exception if there’s an error.
(Changed by Lars Gustäbel; bpo-7357@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7357}.)

@ref{e4,,tarfile} now supports filtering the @ref{141d,,TarInfo}
objects being added to a tar file.  When you call @ref{df4,,add()},
you may supply an optional `filter' argument
that’s a callable.  The `filter' callable will be passed the
@code{TarInfo} for every file being added, and can modify and return it.
If the callable returns @code{None}, the file will be excluded from the
resulting archive.  This is more powerful than the existing
`exclude' argument, which has therefore been deprecated.
(Added by Lars Gustäbel; bpo-6856@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6856}.)
The @ref{141c,,TarFile} class also now supports the context management protocol.
(Added by Lars Gustäbel; bpo-7232@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7232}.)

@item 
The @ref{1532,,wait()} method of the @ref{1364,,threading.Event} class
now returns the internal flag on exit.  This means the method will usually
return true because @code{wait()} is supposed to block until the
internal flag becomes true.  The return value will only be false if
a timeout was provided and the operation timed out.
(Contributed by Tim Lesher; bpo-1674032@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1674032}.)

@item 
The Unicode database provided by the @ref{10c,,unicodedata} module is
now used internally to determine which characters are numeric,
whitespace, or represent line breaks.  The database also
includes information from the @code{Unihan.txt} data file (patch
by Anders Chrigström and Amaury Forgeot d’Arc; bpo-1571184@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1571184})
and has been updated to version 5.2.0 (updated by
Florent Xicluna; bpo-8024@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8024}).

@item 
The @ref{111,,urlparse} module’s @ref{f40,,urlsplit()} now handles
unknown URL schemes in a fashion compliant with 
@geindex RFC; RFC 3986
RFC 3986@footnote{https://datatracker.ietf.org/doc/html/rfc3986.html}: if the
URL is of the form @code{"<something>://..."}, the text before the
@code{://} is treated as the scheme, even if it’s a made-up scheme that
the module doesn’t know about.  This change may break code that
worked around the old behaviour.  For example, Python 2.6.4 or 2.5
will return the following:

@example
>>> import urlparse
>>> urlparse.urlsplit('invented://host/filename?query')
('invented', '@w{'}, '//host/filename?query', '@w{'}, '@w{'})
@end example

Python 2.7 (and Python 2.6.5) will return:

@example
>>> import urlparse
>>> urlparse.urlsplit('invented://host/filename?query')
('invented', 'host', '/filename?query', '@w{'}, '@w{'})
@end example

(Python 2.7 actually produces slightly different output, since it
returns a named tuple instead of a standard tuple.)

The @ref{111,,urlparse} module also supports IPv6 literal addresses as defined by
@geindex RFC; RFC 2732
RFC 2732@footnote{https://datatracker.ietf.org/doc/html/rfc2732.html} (contributed by Senthil Kumaran; bpo-2987@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2987}).

@example
>>> urlparse.urlparse('http://[1080::8:800:200C:417A]/foo')
ParseResult(scheme='http', netloc='[1080::8:800:200C:417A]',
            path='/foo', params='@w{'}, query='@w{'}, fragment='@w{'})
@end example

@item 
New class: the @ref{7f6,,WeakSet} class in the @ref{11b,,weakref}
module is a set that only holds weak references to its elements; elements
will be removed once there are no references pointing to them.
(Originally implemented in Python 3.x by Raymond Hettinger, and backported
to 2.7 by Michael Foord.)

@item 
The @ref{12c,,xml.etree.ElementTree} library, no longer escapes
ampersands and angle brackets when outputting an XML processing
instruction (which looks like @code{<?xml-stylesheet href="#style1"?>})
or comment (which looks like @code{<!-- comment -->}).
(Patch by Neil Muller; bpo-2746@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2746}.)

@item 
The XML-RPC client and server, provided by the @ref{135,,xmlrpclib} and
@ref{136,,SimpleXMLRPCServer} modules, have improved performance by
supporting HTTP/1.1 keep-alive and by optionally using gzip encoding
to compress the XML being exchanged.  The gzip compression is
controlled by the @code{encode_threshold} attribute of
@ref{1533,,SimpleXMLRPCRequestHandler}, which contains a size in bytes;
responses larger than this will be compressed.
(Contributed by Kristján Valur Jónsson; bpo-6267@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6267}.)

@item 
The @ref{138,,zipfile} module’s @ref{8d5,,ZipFile} now supports the context
management protocol, so you can write @code{with zipfile.ZipFile(...) as f:}.
(Contributed by Brian Curtin; bpo-5511@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5511}.)

@ref{138,,zipfile} now also supports archiving empty directories and
extracts them correctly.  (Fixed by Kuba Wieczorek; bpo-4710@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4710}.)
Reading files out of an archive is faster, and interleaving
@ref{1534,,read()} and
@ref{1535,,readline()} now works correctly.
(Contributed by Nir Aides; bpo-7610@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7610}.)

The @ref{1536,,is_zipfile()} function now
accepts a file object, in addition to the path names accepted in earlier
versions.  (Contributed by Gabriel Genellina; bpo-4756@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4756}.)

The @ref{2ce,,writestr()} method now has an optional `compress_type' parameter
that lets you override the default compression method specified in the
@ref{8d5,,ZipFile} constructor.  (Contributed by Ronald Oussoren;
bpo-6003@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6003}.)
@end itemize

@c ======================================================================

@c whole new modules get described in subsections here

@menu
* New module; importlib: New module importlib. 
* New module; sysconfig: New module sysconfig. 
* ttk; Themed Widgets for Tk: ttk Themed Widgets for Tk. 
* Updated module; unittest: Updated module unittest. 
* Updated module; ElementTree 1.3: Updated module ElementTree 1 3. 

@end menu

@node New module importlib,New module sysconfig,,New and Improved Modules
@anchor{whatsnew/2 7 importlib-section}@anchor{14f7}@anchor{whatsnew/2 7 new-module-importlib}@anchor{1537}
@subsubsection New module: importlib


Python 3.1 includes the @ref{7b,,importlib} package, a re-implementation
of the logic underlying Python’s @ref{7f9,,import} statement.
@code{importlib} is useful for implementers of Python interpreters and
to users who wish to write new importers that can participate in the
import process.  Python 2.7 doesn’t contain the complete
@code{importlib} package, but instead has a tiny subset that contains
a single function, @ref{73d,,import_module()}.

@code{import_module(name, package=None)} imports a module.  `name' is
a string containing the module or package’s name.  It’s possible to do
relative imports by providing a string that begins with a @code{.}
character, such as @code{..utils.errors}.  For relative imports, the
`package' argument must be provided and is the name of the package that
will be used as the anchor for
the relative import.  @ref{73d,,import_module()} both inserts the imported
module into @code{sys.modules} and returns the module object.

Here are some examples:

@example
>>> from importlib import import_module
>>> anydbm = import_module('anydbm')  # Standard absolute import
>>> anydbm
<module 'anydbm' from '/p/python/Lib/anydbm.py'>
>>> # Relative import
>>> file_util = import_module('..file_util', 'distutils.command')
>>> file_util
<module 'distutils.file_util' from '/python/Lib/distutils/file_util.pyc'>
@end example

@ref{7b,,importlib} was implemented by Brett Cannon and introduced in
Python 3.1.

@node New module sysconfig,ttk Themed Widgets for Tk,New module importlib,New and Improved Modules
@anchor{whatsnew/2 7 new-module-sysconfig}@anchor{1538}
@subsubsection New module: sysconfig


The @ref{e1,,sysconfig} module has been pulled out of the Distutils
package, becoming a new top-level module in its own right.
@code{sysconfig} provides functions for getting information about
Python’s build process: compiler switches, installation paths, the
platform name, and whether Python is running from its source
directory.

Some of the functions in the module are:


@itemize *

@item 
@ref{175,,get_config_var()} returns variables from Python’s
Makefile and the @code{pyconfig.h} file.

@item 
@ref{29a,,get_config_vars()} returns a dictionary containing
all of the configuration variables.

@item 
@ref{1539,,get_path()} returns the configured path for
a particular type of module: the standard library,
site-specific modules, platform-specific modules, etc.

@item 
@ref{32b,,is_python_build()} returns true if you’re running a
binary from a Python source tree, and false otherwise.
@end itemize

Consult the @ref{e1,,sysconfig} documentation for more details and for
a complete list of functions.

The Distutils package and @ref{e1,,sysconfig} are now maintained by Tarek
Ziadé, who has also started a Distutils2 package (source repository at
@indicateurl{https://hg.python.org/distutils2/}) for developing a next-generation
version of Distutils.

@node ttk Themed Widgets for Tk,Updated module unittest,New module sysconfig,New and Improved Modules
@anchor{whatsnew/2 7 ttk-themed-widgets-for-tk}@anchor{153a}
@subsubsection ttk: Themed Widgets for Tk


Tcl/Tk 8.5 includes a set of themed widgets that re-implement basic Tk
widgets but have a more customizable appearance and can therefore more
closely resemble the native platform’s widgets.  This widget
set was originally called Tile, but was renamed to Ttk (for “themed Tk”)
on being added to Tcl/Tck release 8.5.

To learn more, read the @ref{100,,ttk} module documentation.  You may also
wish to read the Tcl/Tk manual page describing the
Ttk theme engine, available at
@indicateurl{https://www.tcl.tk/man/tcl8.5/TkCmd/ttk_intro.html}. Some
screenshots of the Python/Ttk code in use are at
@indicateurl{https://code.google.com/archive/p/python-ttk/wikis/Screenshots.wiki}.

The @ref{100,,tkinter.ttk} module was written by Guilherme Polo and added in
bpo-2983@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2983}.  An alternate version called @code{Tile.py}, written by
Martin Franklin and maintained by Kevin Walzer, was proposed for
inclusion in bpo-2618@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2618}, but the authors argued that Guilherme
Polo’s work was more comprehensive.

@node Updated module unittest,Updated module ElementTree 1 3,ttk Themed Widgets for Tk,New and Improved Modules
@anchor{whatsnew/2 7 unittest-section}@anchor{153b}@anchor{whatsnew/2 7 updated-module-unittest}@anchor{153c}
@subsubsection Updated module: unittest


The @ref{10d,,unittest} module was greatly enhanced; many
new features were added.  Most of these features were implemented
by Michael Foord, unless otherwise noted.  The enhanced version of
the module is downloadable separately for use with Python versions 2.4 to 2.6,
packaged as the @code{unittest2} package, from unittest2@footnote{https://pypi.org/project/unittest2/}.

When used from the command line, the module can automatically discover
tests.  It’s not as fancy as py.test@footnote{https://pytest.org} or
nose@footnote{https://nose.readthedocs.io/}, but provides a
simple way to run tests kept within a set of package directories.  For example,
the following command will search the @code{test/} subdirectory for
any importable test files named @code{test*.py}:

@example
python -m unittest discover -s test
@end example

Consult the @ref{10d,,unittest} module documentation for more details.
(Developed in bpo-6001@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6001}.)

The @ref{11e9,,main()} function supports some other new options:


@itemize *

@item 
@ref{153d,,-b} or @code{--buffer} will buffer the standard output
and standard error streams during each test.  If the test passes,
any resulting output will be discarded; on failure, the buffered
output will be displayed.

@item 
@ref{153e,,-c} or @code{--catch} will cause the control-C interrupt
to be handled more gracefully.  Instead of interrupting the test
process immediately, the currently running test will be completed
and then the partial results up to the interruption will be reported.
If you’re impatient, a second press of control-C will cause an immediate
interruption.

This control-C handler tries to avoid causing problems when the code
being tested or the tests being run have defined a signal handler of
their own, by noticing that a signal handler was already set and
calling it.  If this doesn’t work for you, there’s a
@ref{153f,,removeHandler()} decorator that can be used to mark tests that
should have the control-C handling disabled.

@item 
@ref{1540,,-f} or @code{--failfast} makes
test execution stop immediately when a test fails instead of
continuing to execute further tests.  (Suggested by Cliff Dyer and
implemented by Michael Foord; bpo-8074@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8074}.)
@end itemize

The progress messages now show ‘x’ for expected failures
and ‘u’ for unexpected successes when run in verbose mode.
(Contributed by Benjamin Peterson.)

Test cases can raise the @ref{11ea,,SkipTest} exception to skip a
test (bpo-1034053@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1034053}).

The error messages for @ref{74d,,assertEqual()},
@ref{74b,,assertTrue()}, and @ref{74c,,assertFalse()}
failures now provide more information.  If you set the
@ref{1541,,longMessage} attribute of your @ref{2b5,,TestCase} classes to
true, both the standard error message and any additional message you
provide will be printed for failures.  (Added by Michael Foord; bpo-5663@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5663}.)

The @ref{751,,assertRaises()} method now
returns a context handler when called without providing a callable
object to run.  For example, you can write this:

@example
with self.assertRaises(KeyError):
    @{@}['foo']
@end example

(Implemented by Antoine Pitrou; bpo-4444@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4444}.)

@c rev 78774

Module- and class-level setup and teardown fixtures are now supported.
Modules can contain @ref{c48,,setUpModule()} and @ref{1542,,tearDownModule()}
functions.  Classes can have @ref{c49,,setUpClass()} and
@ref{1543,,tearDownClass()} methods that must be defined as class methods
(using @code{@@classmethod} or equivalent).  These functions and
methods are invoked when the test runner switches to a test case in a
different module or class.

The methods @ref{c7a,,addCleanup()} and
@ref{1544,,doCleanups()} were added.
@code{addCleanup()} lets you add cleanup functions that
will be called unconditionally (after @ref{1545,,setUp()} if
@code{setUp()} fails, otherwise after @ref{1546,,tearDown()}). This allows
for much simpler resource allocation and deallocation during tests
(bpo-5679@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5679}).

A number of new methods were added that provide more specialized
tests.  Many of these methods were written by Google engineers
for use in their test suites; Gregory P. Smith, Michael Foord, and
GvR worked on merging them into Python’s version of @ref{10d,,unittest}.


@itemize *

@item 
@ref{1496,,assertIsNone()} and @ref{1497,,assertIsNotNone()} take one
expression and verify that the result is or is not @code{None}.

@item 
@ref{1547,,assertIs()} and @ref{1548,,assertIsNot()}
take two values and check whether the two values evaluate to the same object or not.
(Added by Michael Foord; bpo-2578@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2578}.)

@item 
@ref{1549,,assertIsInstance()} and
@ref{154a,,assertNotIsInstance()} check whether
the resulting object is an instance of a particular class, or of
one of a tuple of classes.  (Added by Georg Brandl; bpo-7031@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7031}.)

@item 
@ref{154b,,assertGreater()}, @ref{154c,,assertGreaterEqual()},
@ref{154d,,assertLess()}, and @ref{154e,,assertLessEqual()} compare
two quantities.

@item 
@ref{154f,,assertMultiLineEqual()} compares two strings, and if they’re
not equal, displays a helpful comparison that highlights the
differences in the two strings.  This comparison is now used by
default when Unicode strings are compared with @ref{74d,,assertEqual()}.

@item 
@ref{752,,assertRegexpMatches()} and
@ref{754,,assertNotRegexpMatches()} checks whether the
first argument is a string matching or not matching the regular
expression provided as the second argument (bpo-8038@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8038}).

@item 
@ref{753,,assertRaisesRegexp()} checks
whether a particular exception
is raised, and then also checks that the string representation of
the exception matches the provided regular expression.

@item 
@ref{1550,,assertIn()} and @ref{1551,,assertNotIn()}
tests whether `first' is or is not in  `second'.

@item 
@ref{1436,,assertItemsEqual()} tests whether two provided sequences
contain the same elements.

@item 
@ref{1491,,assertSetEqual()} compares whether two sets are equal, and
only reports the differences between the sets in case of error.

@item 
Similarly, @ref{1493,,assertListEqual()} and @ref{1494,,assertTupleEqual()}
compare the specified types and explain any differences without necessarily
printing their full values; these methods are now used by default
when comparing lists and tuples using @ref{74d,,assertEqual()}.
More generally, @ref{1495,,assertSequenceEqual()} compares two sequences
and can optionally check whether both sequences are of a
particular type.

@item 
@ref{1492,,assertDictEqual()} compares two dictionaries and reports the
differences; it’s now used by default when you compare two dictionaries
using @ref{74d,,assertEqual()}.  @code{assertDictContainsSubset()} checks whether
all of the key/value pairs in `first' are found in `second'.

@item 
@ref{74f,,assertAlmostEqual()} and @ref{750,,assertNotAlmostEqual()} test
whether `first' and `second' are approximately equal.  This method
can either round their difference to an optionally specified number
of `places' (the default is 7) and compare it to zero, or require
the difference to be smaller than a supplied `delta' value.

@item 
@ref{1552,,loadTestsFromName()} properly honors the
@ref{1553,,suiteClass} attribute of
the @ref{593,,TestLoader}. (Fixed by Mark Roddy; bpo-6866@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6866}.)

@item 
A new hook lets you extend the @ref{74d,,assertEqual()} method to handle
new data types.  The @ref{1554,,addTypeEqualityFunc()} method takes a type
object and a function. The function will be used when both of the
objects being compared are of the specified type.  This function
should compare the two objects and raise an exception if they don’t
match; it’s a good idea for the function to provide additional
information about why the two objects aren’t matching, much as the new
sequence comparison methods do.
@end itemize

@ref{11e9,,unittest.main()} now takes an optional @code{exit} argument.  If
false, @code{main()} doesn’t call @ref{279,,sys.exit()}, allowing
@code{main()} to be used from the interactive interpreter.
(Contributed by J. Pablo Fernández; bpo-3379@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3379}.)

@ref{1373,,TestResult} has new @ref{1555,,startTestRun()} and
@ref{1556,,stopTestRun()} methods that are called immediately before
and after a test run.  (Contributed by Robert Collins; bpo-5728@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5728}.)

With all these changes, the @code{unittest.py} was becoming awkwardly
large, so the module was turned into a package and the code split into
several files (by Benjamin Peterson).  This doesn’t affect how the
module is imported or used.


@subsubheading See also



@table @asis

@item @indicateurl{https://web.archive.org/web/20210619163128/http://www.voidspace.org.uk/python/articles/unittest2.shtml}

Describes the new features, how to use them, and the
rationale for various design decisions.  (By Michael Foord.)
@end table


@node Updated module ElementTree 1 3,,Updated module unittest,New and Improved Modules
@anchor{whatsnew/2 7 elementtree-section}@anchor{1557}@anchor{whatsnew/2 7 updated-module-elementtree-1-3}@anchor{1558}
@subsubsection Updated module: ElementTree 1.3


The version of the ElementTree library included with Python was updated to
version 1.3.  Some of the new features are:


@itemize *

@item 
The various parsing functions now take a `parser' keyword argument
giving an @ref{c4f,,XMLParser} instance that will
be used.  This makes it possible to override the file’s internal encoding:

@example
p = ET.XMLParser(encoding='utf-8')
t = ET.XML("""<root/>""", parser=p)
@end example

Errors in parsing XML now raise a @ref{1483,,ParseError} exception, whose
instances have a @code{position} attribute
containing a (`line', `column') tuple giving the location of the problem.

@item 
ElementTree’s code for converting trees to a string has been
significantly reworked, making it roughly twice as fast in many
cases.  The @ref{c92,,ElementTree.write()}
and @code{Element.write()} methods now have a `method' parameter that can be
“xml” (the default), “html”, or “text”.  HTML mode will output empty
elements as @code{<empty></empty>} instead of @code{<empty/>}, and text
mode will skip over elements and only output the text chunks.  If
you set the @ref{1559,,tag} attribute of an
element to @code{None} but
leave its children in place, the element will be omitted when the
tree is written out, so you don’t need to do more extensive rearrangement
to remove a single element.

Namespace handling has also been improved.  All @code{xmlns:<whatever>}
declarations are now output on the root element, not scattered throughout
the resulting XML.  You can set the default namespace for a tree
by setting the @code{default_namespace} attribute and can
register new prefixes with @ref{13de,,register_namespace()}.  In XML mode,
you can use the true/false `xml_declaration' parameter to suppress the
XML declaration.

@item 
New @ref{361,,Element} method:
@ref{13df,,extend()} appends the items from a
sequence to the element’s children.  Elements themselves behave like
sequences, so it’s easy to move children from one element to
another:

@example
from xml.etree import ElementTree as ET

t = ET.XML("""<list>
  <item>1</item> <item>2</item>  <item>3</item>
</list>""")
new = ET.XML('<root/>')
new.extend(t)

# Outputs <root><item>1</item>...</root>
print ET.tostring(new)
@end example

@item 
New @ref{361,,Element} method:
@ref{155a,,iter()} yields the children of the
element as a generator.  It’s also possible to write @code{for child in
elem:} to loop over an element’s children.  The existing method
@code{getiterator()} is now deprecated, as is @code{getchildren()}
which constructs and returns a list of children.

@item 
New @ref{361,,Element} method:
@ref{13e1,,itertext()} yields all chunks of
text that are descendants of the element.  For example:

@example
t = ET.XML("""<list>
  <item>1</item> <item>2</item>  <item>3</item>
</list>""")

# Outputs ['\n  ', '1', ' ', '2', '  ', '3', '\n']
print list(t.itertext())
@end example

@item 
Deprecated: using an element as a Boolean (i.e., @code{if elem:}) would
return true if the element had any children, or false if there were
no children.  This behaviour is confusing – @code{None} is false, but
so is a childless element? – so it will now trigger a
@ref{659,,FutureWarning}.  In your code, you should be explicit: write
@code{len(elem) != 0} if you’re interested in the number of children,
or @code{elem is not None}.
@end itemize

Fredrik Lundh develops ElementTree and produced the 1.3 version;
you can read his article describing 1.3 at
@indicateurl{https://web.archive.org/web/20200703234532/http://effbot.org/zone/elementtree-13-intro.htm}.
Florent Xicluna updated the version included with
Python, after discussions on python-dev and in bpo-6472@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6472}.)

@c ======================================================================

@node Build and C API Changes<8>,Other Changes and Fixes,New and Improved Modules,What’s New in Python 2 7
@anchor{whatsnew/2 7 build-and-c-api-changes}@anchor{155b}
@subsection Build and C API Changes


Changes to Python’s build process and to the C API include:


@itemize *

@item 
The latest release of the GNU Debugger, GDB 7, can be scripted using Python@footnote{https://web.archive.org/web/20110715084810/http://sourceware.org/gdb/current/onlinedocs/gdb/Python.html}.
When you begin debugging an executable program P, GDB will look for
a file named @code{P-gdb.py} and automatically read it.  Dave Malcolm
contributed a @code{python-gdb.py} that adds a number of
commands useful when debugging Python itself.  For example,
@code{py-up} and @code{py-down} go up or down one Python stack frame,
which usually corresponds to several C stack frames.  @code{py-print}
prints the value of a Python variable, and @code{py-bt} prints the
Python stack trace.  (Added as a result of bpo-8032@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8032}.)

@item 
If you use the @code{.gdbinit} file provided with Python,
the “pyo” macro in the 2.7 version now works correctly when the thread being
debugged doesn’t hold the GIL; the macro now acquires it before printing.
(Contributed by Victor Stinner; bpo-3632@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3632}.)

@item 
@ref{b7e,,Py_AddPendingCall()} is now thread-safe, letting any
worker thread submit notifications to the main Python thread.  This
is particularly useful for asynchronous IO operations.
(Contributed by Kristján Valur Jónsson; bpo-4293@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4293}.)

@item 
New function: @ref{155c,,PyCode_NewEmpty()} creates an empty code object;
only the filename, function name, and first line number are required.
This is useful for extension modules that are attempting to
construct a more useful traceback stack.  Previously such
extensions needed to call @code{PyCode_New()}, which had many
more arguments.  (Added by Jeffrey Yasskin.)

@item 
New function: @ref{1474,,PyErr_NewExceptionWithDoc()} creates a new
exception class, just as the existing @ref{1475,,PyErr_NewException()} does,
but takes an extra @code{char *} argument containing the docstring for the
new exception class.  (Added by ‘lekma’ on the Python bug tracker;
bpo-7033@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7033}.)

@item 
New function: @ref{993,,PyFrame_GetLineNumber()} takes a frame object
and returns the line number that the frame is currently executing.
Previously code would need to get the index of the bytecode
instruction currently executing, and then look up the line number
corresponding to that address.  (Added by Jeffrey Yasskin.)

@item 
New functions: @ref{1472,,PyLong_AsLongAndOverflow()} and
@ref{1471,,PyLong_AsLongLongAndOverflow()}  approximates a Python long
integer as a C long or long long.
If the number is too large to fit into
the output type, an `overflow' flag is set and returned to the caller.
(Contributed by Case Van Horsen; bpo-7528@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7528} and bpo-7767@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7767}.)

@item 
New function: stemming from the rewrite of string-to-float conversion,
a new @ref{14a1,,PyOS_string_to_double()} function was added.  The old
@code{PyOS_ascii_strtod()} and @code{PyOS_ascii_atof()} functions
are now deprecated.

@item 
New function: @code{PySys_SetArgvEx()} sets the value of
@code{sys.argv} and can optionally update @code{sys.path} to include the
directory containing the script named by @code{sys.argv[0]} depending
on the value of an `updatepath' parameter.

This function was added to close a security hole for applications
that embed Python.  The old function, @code{PySys_SetArgv()}, would
always update @code{sys.path}, and sometimes it would add the current
directory.  This meant that, if you ran an application embedding
Python in a directory controlled by someone else, attackers could
put a Trojan-horse module in the directory (say, a file named
@code{os.py}) that your application would then import and run.

If you maintain a C/C++ application that embeds Python, check
whether you’re calling @code{PySys_SetArgv()} and carefully consider
whether the application should be using @code{PySys_SetArgvEx()}
with `updatepath' set to false.

Security issue reported as 
@geindex Common Vulnerabilities and Exposures; CVE 2008-5983
CVE 2008-5983@footnote{https://www.cve.org/CVERecord?id=CVE-2008-5983};
discussed in bpo-5753@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5753}, and fixed by Antoine Pitrou.

@item 
New macros: the Python header files now define the following macros:
@ref{155d,,Py_ISALNUM},
@ref{155e,,Py_ISALPHA},
@ref{155f,,Py_ISDIGIT},
@ref{1560,,Py_ISLOWER},
@ref{1561,,Py_ISSPACE},
@ref{1562,,Py_ISUPPER},
@ref{1563,,Py_ISXDIGIT},
@ref{1564,,Py_TOLOWER}, and @ref{1565,,Py_TOUPPER}.
All of these functions are analogous to the C
standard macros for classifying characters, but ignore the current
locale setting, because in
several places Python needs to analyze characters in a
locale-independent way.  (Added by Eric Smith;
bpo-5793@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5793}.)

@item 
Removed function: @code{PyEval_CallObject()} is now only available
as a macro.  A function version was being kept around to preserve
ABI linking compatibility, but that was in 1997; it can certainly be
deleted by now.  (Removed by Antoine Pitrou; bpo-8276@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8276}.)

@item 
New format codes: the @code{PyString_FromFormat()},
@code{PyString_FromFormatV()}, and @ref{10b7,,PyErr_Format()} functions now
accept @code{%lld} and @code{%llu} format codes for displaying
C’s long long types.
(Contributed by Mark Dickinson; bpo-7228@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7228}.)

@item 
The complicated interaction between threads and process forking has
been changed.  Previously, the child process created by
@ref{4b6,,os.fork()} might fail because the child is created with only a
single thread running, the thread performing the @code{os.fork()}.
If other threads were holding a lock, such as Python’s import lock,
when the fork was performed, the lock would still be marked as
“held” in the new process.  But in the child process nothing would
ever release the lock, since the other threads weren’t replicated,
and the child process would no longer be able to perform imports.

Python 2.7 acquires the import lock before performing an
@ref{4b6,,os.fork()}, and will also clean up any locks created using the
@ref{f3,,threading} module.  C extension modules that have internal
locks, or that call @code{fork()} themselves, will not benefit
from this clean-up.

(Fixed by Thomas Wouters; bpo-1590864@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1590864}.)

@item 
The @ref{45d,,Py_Finalize()} function now calls the internal
@code{threading._shutdown()} function; this prevents some exceptions from
being raised when an interpreter shuts down.
(Patch by Adam Olsen; bpo-1722344@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1722344}.)

@item 
When using the @ref{772,,PyMemberDef} structure to define attributes
of a type, Python will no longer let you try to delete or set a
@code{T_STRING_INPLACE} attribute.

@c rev 79644

@item 
Global symbols defined by the @ref{2e,,ctypes} module are now prefixed
with @code{Py}, or with @code{_ctypes}.  (Implemented by Thomas
Heller; bpo-3102@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3102}.)

@item 
New configure option: the @code{--with-system-expat} switch allows
building the @ref{12d,,pyexpat} module to use the system Expat library.
(Contributed by Arfrever Frehtes Taifersar Arahesis; bpo-7609@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7609}.)

@item 
New configure option: the
@code{--with-valgrind} option will now disable the pymalloc
allocator, which is difficult for the Valgrind memory-error detector
to analyze correctly.
Valgrind will therefore be better at detecting memory leaks and
overruns. (Contributed by James Henstridge; bpo-2422@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2422}.)

@item 
New configure option: you can now supply an empty string to
@code{--with-dbmliborder=} in order to disable all of the various
DBM modules.  (Added by Arfrever Frehtes Taifersar Arahesis;
bpo-6491@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6491}.)

@item 
The @code{configure} script now checks for floating-point rounding bugs
on certain 32-bit Intel chips and defines a @code{X87_DOUBLE_ROUNDING}
preprocessor definition.  No code currently uses this definition,
but it’s available if anyone wishes to use it.
(Added by Mark Dickinson; bpo-2937@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2937}.)

@code{configure} also now sets a @code{LDCXXSHARED} Makefile
variable for supporting C++ linking.  (Contributed by Arfrever
Frehtes Taifersar Arahesis; bpo-1222585@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1222585}.)

@item 
The build process now creates the necessary files for pkg-config
support.  (Contributed by Clinton Roy; bpo-3585@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3585}.)

@item 
The build process now supports Subversion 1.7.  (Contributed by
Arfrever Frehtes Taifersar Arahesis; bpo-6094@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6094}.)
@end itemize

@menu
* Capsules:: 
* Port-Specific Changes; Windows: Port-Specific Changes Windows. 
* Port-Specific Changes; Mac OS X: Port-Specific Changes Mac OS X. 
* Port-Specific Changes; FreeBSD: Port-Specific Changes FreeBSD. 

@end menu

@node Capsules,Port-Specific Changes Windows,,Build and C API Changes<8>
@anchor{whatsnew/2 7 capsules}@anchor{1566}@anchor{whatsnew/2 7 whatsnew27-capsules}@anchor{1567}
@subsubsection Capsules


Python 3.1 adds a new C datatype, @ref{147e,,PyCapsule}, for providing a
C API to an extension module.  A capsule is essentially the holder of
a C @code{void *} pointer, and is made available as a module attribute; for
example, the @ref{d1,,socket} module’s API is exposed as @code{socket.CAPI},
and @ref{10c,,unicodedata} exposes @code{ucnhash_CAPI}.  Other extensions
can import the module, access its dictionary to get the capsule
object, and then get the @code{void *} pointer, which will usually point
to an array of pointers to the module’s various API functions.

There is an existing data type already used for this,
@code{PyCObject}, but it doesn’t provide type safety.  Evil code
written in pure Python could cause a segmentation fault by taking a
@code{PyCObject} from module A and somehow substituting it for the
@code{PyCObject} in module B.   Capsules know their own name,
and getting the pointer requires providing the name:

@example
void *vtable;

if (!PyCapsule_IsValid(capsule, "mymodule.CAPI") @{
        PyErr_SetString(PyExc_ValueError, "argument type invalid");
        return NULL;
@}

vtable = PyCapsule_GetPointer(capsule, "mymodule.CAPI");
@end example

You are assured that @code{vtable} points to whatever you’re expecting.
If a different capsule was passed in, @ref{1568,,PyCapsule_IsValid()} would
detect the mismatched name and return false.  Refer to
@ref{1569,,Providing a C API for an Extension Module} for more information on using these objects.

Python 2.7 now uses capsules internally to provide various
extension-module APIs, but the @code{PyCObject_AsVoidPtr()} was
modified to handle capsules, preserving compile-time compatibility
with the @code{PyCObject} interface.  Use of
@code{PyCObject_AsVoidPtr()} will signal a
@ref{acc,,PendingDeprecationWarning}, which is silent by default.

Implemented in Python 3.1 and backported to 2.7 by Larry Hastings;
discussed in bpo-5630@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5630}.

@c ======================================================================

@node Port-Specific Changes Windows,Port-Specific Changes Mac OS X,Capsules,Build and C API Changes<8>
@anchor{whatsnew/2 7 port-specific-changes-windows}@anchor{156a}
@subsubsection Port-Specific Changes: Windows



@itemize *

@item 
The @ref{97,,msvcrt} module now contains some constants from
the @code{crtassem.h} header file:
@ref{156b,,CRT_ASSEMBLY_VERSION},
@ref{156c,,VC_ASSEMBLY_PUBLICKEYTOKEN},
and @ref{156d,,LIBRARIES_ASSEMBLY_NAME_PREFIX}.
(Contributed by David Cournapeau; bpo-4365@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4365}.)

@item 
The @ref{11d,,_winreg} module for accessing the registry now implements
the @ref{156e,,CreateKeyEx()} and @ref{156f,,DeleteKeyEx()}
functions, extended versions of previously supported functions that
take several extra arguments.  The @ref{1570,,DisableReflectionKey()},
@ref{1571,,EnableReflectionKey()}, and @ref{1572,,QueryReflectionKey()}
were also tested and documented.
(Implemented by Brian Curtin: bpo-7347@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7347}.)

@item 
The new @code{_beginthreadex()} API is used to start threads, and
the native thread-local storage functions are now used.
(Contributed by Kristján Valur Jónsson; bpo-3582@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3582}.)

@item 
The @ref{1573,,os.kill()} function now works on Windows.  The signal value
can be the constants @ref{1574,,CTRL_C_EVENT},
@ref{1575,,CTRL_BREAK_EVENT}, or any integer.  The first two constants
will send @code{Control}-@code{C} and @code{Control}-@code{Break} keystroke events to
subprocesses; any other value will use the @code{TerminateProcess()}
API.  (Contributed by Miki Tebeka; bpo-1220212@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1220212}.)

@item 
The @ref{1306,,os.listdir()} function now correctly fails
for an empty path.  (Fixed by Hirokazu Yamamoto; bpo-5913@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5913}.)

@item 
The @ref{93,,mimetypes} module will now read the MIME database from
the Windows registry when initializing.
(Patch by Gabriel Genellina; bpo-4969@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4969}.)
@end itemize

@c ======================================================================

@node Port-Specific Changes Mac OS X,Port-Specific Changes FreeBSD,Port-Specific Changes Windows,Build and C API Changes<8>
@anchor{whatsnew/2 7 port-specific-changes-mac-os-x}@anchor{1576}
@subsubsection Port-Specific Changes: Mac OS X



@itemize *

@item 
The path @code{/Library/Python/2.7/site-packages} is now appended to
@code{sys.path}, in order to share added packages between the system
installation and a user-installed copy of the same version.
(Changed by Ronald Oussoren; bpo-4865@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4865}.)


Changed in version 2.7.13: As of 2.7.13, this change was removed.
@code{/Library/Python/2.7/site-packages}, the site-packages directory
used by the Apple-supplied system Python 2.7 is no longer appended to
@code{sys.path} for user-installed Pythons such as from the python.org
installers.  As of macOS 10.12, Apple changed how the system
site-packages directory is configured, which could cause installation
of pip components, like setuptools, to fail.  Packages installed for
the system Python will no longer be shared with user-installed
Pythons. (bpo-28440@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28440})

@end itemize

@node Port-Specific Changes FreeBSD,,Port-Specific Changes Mac OS X,Build and C API Changes<8>
@anchor{whatsnew/2 7 port-specific-changes-freebsd}@anchor{1577}
@subsubsection Port-Specific Changes: FreeBSD



@itemize *

@item 
FreeBSD 7.1’s @code{SO_SETFIB} constant, used with the @ref{fa7,,socket()} methods
@ref{ed6,,getsockopt()}/@ref{ed7,,setsockopt()} to select an
alternate routing table, is now available in the @ref{d1,,socket}
module.  (Added by Kyle VanderBeek; bpo-8235@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8235}.)
@end itemize

@node Other Changes and Fixes,Porting to Python 2 7,Build and C API Changes<8>,What’s New in Python 2 7
@anchor{whatsnew/2 7 other-changes-and-fixes}@anchor{1578}
@subsection Other Changes and Fixes



@itemize *

@item 
Two benchmark scripts, @code{iobench} and @code{ccbench}, were
added to the @code{Tools} directory.  @code{iobench} measures the
speed of the built-in file I/O objects returned by @ref{318,,open()}
while performing various operations, and @code{ccbench} is a
concurrency benchmark that tries to measure computing throughput,
thread switching latency, and IO processing bandwidth when
performing several tasks using a varying number of threads.

@item 
The @code{Tools/i18n/msgfmt.py} script now understands plural
forms in @code{.po} files.  (Fixed by Martin von Löwis;
bpo-5464@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5464}.)

@item 
When importing a module from a @code{.pyc} or @code{.pyo} file
with an existing @code{.py} counterpart, the @ref{1579,,co_filename}
attributes of the resulting code objects are overwritten when the
original filename is obsolete.  This can happen if the file has been
renamed, moved, or is accessed through different paths.  (Patch by
Ziga Seilnacht and Jean-Paul Calderone; bpo-1180193@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1180193}.)

@item 
The @code{regrtest.py} script now takes a @code{--randseed=}
switch that takes an integer that will be used as the random seed
for the @code{-r} option that executes tests in random order.
The @code{-r} option also reports the seed that was used
(Added by Collin Winter.)

@item 
Another @code{regrtest.py} switch is @code{-j}, which
takes an integer specifying how many tests run in parallel. This
allows reducing the total runtime on multi-core machines.
This option is compatible with several other options, including the
@code{-R} switch which is known to produce long runtimes.
(Added by Antoine Pitrou, bpo-6152@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6152}.)  This can also be used
with a new @code{-F} switch that runs selected tests in a loop
until they fail.  (Added by Antoine Pitrou; bpo-7312@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7312}.)

@item 
When executed as a script, the @code{py_compile.py} module now
accepts @code{'-'} as an argument, which will read standard input for
the list of filenames to be compiled.  (Contributed by Piotr
Ożarowski; bpo-8233@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8233}.)
@end itemize

@c ======================================================================

@node Porting to Python 2 7,New Features Added to Python 2 7 Maintenance Releases,Other Changes and Fixes,What’s New in Python 2 7
@anchor{whatsnew/2 7 porting-to-python-2-7}@anchor{157a}
@subsection Porting to Python 2.7


This section lists previously described changes and other bugfixes
that may require changes to your code:


@itemize *

@item 
The @ref{b43,,range()} function processes its arguments more
consistently; it will now call @ref{19e,,__int__()} on non-float,
non-integer arguments that are supplied to it.  (Fixed by Alexander
Belopolsky; bpo-1533@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1533}.)

@item 
The string @ref{19a,,format()} method changed the default precision used
for floating-point and complex numbers from 6 decimal
places to 12, which matches the precision used by @ref{16a,,str()}.
(Changed by Eric Smith; bpo-5920@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5920}.)

@item 
Because of an optimization for the @ref{187,,with} statement, the special
methods @ref{7e5,,__enter__()} and @ref{150c,,__exit__()} must belong to the object’s
type, and cannot be directly attached to the object’s instance.  This
affects new-style classes (derived from @ref{c84,,object}) and C extension
types.  (bpo-6101@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6101}.)

@item 
Due to a bug in Python 2.6, the `exc_value' parameter to
@ref{150c,,__exit__()} methods was often the string representation of the
exception, not an instance.  This was fixed in 2.7, so `exc_value'
will be an instance as expected.  (Fixed by Florent Xicluna;
bpo-7853@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7853}.)

@item 
When a restricted set of attributes were set using @code{__slots__},
deleting an unset attribute would not raise @ref{5f0,,AttributeError}
as you would expect.  Fixed by Benjamin Peterson; bpo-7604@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7604}.)
@end itemize

In the standard library:


@itemize *

@item 
Operations with @ref{4e3,,datetime} instances that resulted in a year
falling outside the supported range didn’t always raise
@ref{a87,,OverflowError}.  Such errors are now checked more carefully
and will now raise the exception. (Reported by Mark Leander, patch
by Anand B. Pillai and Alexander Belopolsky; bpo-7150@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7150}.)

@item 
When using @ref{200,,Decimal} instances with a string’s
@ref{19a,,format()} method, the default alignment was previously
left-alignment.  This has been changed to right-alignment, which might
change the output of your programs.
(Changed by Mark Dickinson; bpo-6857@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6857}.)

Comparisons involving a signaling NaN value (or @code{sNAN}) now signal
@ref{12b4,,InvalidOperation} instead of silently returning a true or
false value depending on the comparison operator.  Quiet NaN values
(or @code{NaN}) are now hashable.  (Fixed by Mark Dickinson;
bpo-7279@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7279}.)

@item 
The @ref{12c,,xml.etree.ElementTree} library no longer escapes
ampersands and angle brackets when outputting an XML processing
instruction (which looks like @code{<?xml-stylesheet href="#style1"?>})
or comment (which looks like @code{<!-- comment -->}).
(Patch by Neil Muller; bpo-2746@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2746}.)

@item 
The @code{readline()} method of @ref{112f,,StringIO} objects now does
nothing when a negative length is requested, as other file-like
objects do.  (bpo-7348@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7348}).

@item 
The @ref{e2,,syslog} module will now use the value of @code{sys.argv[0]} as the
identifier instead of the previous default value of @code{'python'}.
(Changed by Sean Reifschneider; bpo-8451@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8451}.)

@item 
The @ref{e4,,tarfile} module’s default error handling has changed, to
no longer suppress fatal errors.  The default error level was previously 0,
which meant that errors would only result in a message being written to the
debug log, but because the debug log is not activated by default,
these errors go unnoticed.  The default error level is now 1,
which raises an exception if there’s an error.
(Changed by Lars Gustäbel; bpo-7357@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7357}.)

@item 
The @ref{111,,urlparse} module’s @ref{f40,,urlsplit()} now handles
unknown URL schemes in a fashion compliant with 
@geindex RFC; RFC 3986
RFC 3986@footnote{https://datatracker.ietf.org/doc/html/rfc3986.html}: if the
URL is of the form @code{"<something>://..."}, the text before the
@code{://} is treated as the scheme, even if it’s a made-up scheme that
the module doesn’t know about.  This change may break code that
worked around the old behaviour.  For example, Python 2.6.4 or 2.5
will return the following:

@example
>>> import urlparse
>>> urlparse.urlsplit('invented://host/filename?query')
('invented', '@w{'}, '//host/filename?query', '@w{'}, '@w{'})
@end example

Python 2.7 (and Python 2.6.5) will return:

@example
>>> import urlparse
>>> urlparse.urlsplit('invented://host/filename?query')
('invented', 'host', '/filename?query', '@w{'}, '@w{'})
@end example

(Python 2.7 actually produces slightly different output, since it
returns a named tuple instead of a standard tuple.)
@end itemize

For C extensions:


@itemize *

@item 
C extensions that use integer format codes with the @code{PyArg_Parse*}
family of functions will now raise a @ref{199,,TypeError} exception
instead of triggering a @ref{1a4,,DeprecationWarning} (bpo-5080@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5080}).

@item 
Use the new @ref{14a1,,PyOS_string_to_double()} function instead of the old
@code{PyOS_ascii_strtod()} and @code{PyOS_ascii_atof()} functions,
which are now deprecated.
@end itemize

For applications that embed Python:


@itemize *

@item 
The @code{PySys_SetArgvEx()} function was added, letting
applications close a security hole when the existing
@code{PySys_SetArgv()} function was used.  Check whether you’re
calling @code{PySys_SetArgv()} and carefully consider whether the
application should be using @code{PySys_SetArgvEx()} with
`updatepath' set to false.
@end itemize

@c ======================================================================

@node New Features Added to Python 2 7 Maintenance Releases,Acknowledgements,Porting to Python 2 7,What’s New in Python 2 7
@anchor{whatsnew/2 7 new-features-added-to-python-2-7-maintenance-releases}@anchor{157b}@anchor{whatsnew/2 7 py27-maintenance-enhancements}@anchor{14f2}
@subsection New Features Added to Python 2.7 Maintenance Releases


New features may be added to Python 2.7 maintenance releases when the
situation genuinely calls for it. Any such additions must go through
the Python Enhancement Proposal process, and make a compelling case for why
they can’t be adequately addressed by either adding the new feature solely to
Python 3, or else by publishing it on the Python Package Index.

In addition to the specific proposals listed below, there is a general
exemption allowing new @code{-3} warnings to be added in any Python 2.7
maintenance release.

@menu
* Two new environment variables for debug mode:: 
* PEP 434; IDLE Enhancement Exception for All Branches: PEP 434 IDLE Enhancement Exception for All Branches. 
* PEP 466; Network Security Enhancements for Python 2.7: PEP 466 Network Security Enhancements for Python 2 7. 
* PEP 477; Backport ensurepip (PEP 453) to Python 2.7: PEP 477 Backport ensurepip PEP 453 to Python 2 7. 
* PEP 476; Enabling certificate verification by default for stdlib http clients: PEP 476 Enabling certificate verification by default for stdlib http clients<2>. 
* PEP 493; HTTPS verification migration tools for Python 2.7: PEP 493 HTTPS verification migration tools for Python 2 7. 
* New make regen-all build target: New make regen-all build target<3>. 
* Removal of make touch build target: Removal of make touch build target<3>. 

@end menu

@node Two new environment variables for debug mode,PEP 434 IDLE Enhancement Exception for All Branches,,New Features Added to Python 2 7 Maintenance Releases
@anchor{whatsnew/2 7 two-new-environment-variables-for-debug-mode}@anchor{157c}
@subsubsection Two new environment variables for debug mode


In debug mode, the @code{[xxx refs]} statistic is not written by default, the
@code{PYTHONSHOWREFCOUNT} environment variable now must also be set.
(Contributed by Victor Stinner; bpo-31733@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31733}.)

When Python is compiled with @code{COUNT_ALLOC} defined, allocation counts are no
longer dumped by default anymore: the @code{PYTHONSHOWALLOCCOUNT} environment
variable must now also be set. Moreover, allocation counts are now dumped into
stderr, rather than stdout. (Contributed by Victor Stinner; bpo-31692@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31692}.)


Added in version 2.7.15.


@node PEP 434 IDLE Enhancement Exception for All Branches,PEP 466 Network Security Enhancements for Python 2 7,Two new environment variables for debug mode,New Features Added to Python 2 7 Maintenance Releases
@anchor{whatsnew/2 7 pep-434-idle-enhancement-exception-for-all-branches}@anchor{157d}
@subsubsection PEP 434: IDLE Enhancement Exception for All Branches


@geindex Python Enhancement Proposals; PEP 434
PEP 434@footnote{https://peps.python.org/pep-0434/} describes a general exemption for changes made to the IDLE
development environment shipped along with Python. This exemption makes it
possible for the IDLE developers to provide a more consistent user
experience across all supported versions of Python 2 and 3.

For details of any IDLE changes, refer to the NEWS file for the specific
release.

@node PEP 466 Network Security Enhancements for Python 2 7,PEP 477 Backport ensurepip PEP 453 to Python 2 7,PEP 434 IDLE Enhancement Exception for All Branches,New Features Added to Python 2 7 Maintenance Releases
@anchor{whatsnew/2 7 pep-466-network-security-enhancements-for-python-2-7}@anchor{157e}
@subsubsection PEP 466: Network Security Enhancements for Python 2.7


@geindex Python Enhancement Proposals; PEP 466
PEP 466@footnote{https://peps.python.org/pep-0466/} describes a number of network security enhancement proposals
that have been approved for inclusion in Python 2.7 maintenance releases,
with the first of those changes appearing in the Python 2.7.7 release.

@geindex Python Enhancement Proposals; PEP 466
PEP 466@footnote{https://peps.python.org/pep-0466/} related features added in Python 2.7.7:


@itemize *

@item 
@ref{12d5,,hmac.compare_digest()} was backported from Python 3 to make a timing
attack resistant comparison operation available to Python 2 applications.
(Contributed by Alex Gaynor; bpo-21306@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21306}.)

@item 
OpenSSL 1.0.1g was upgraded in the official Windows installers published on
python.org. (Contributed by Zachary Ware; bpo-21462@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21462}.)
@end itemize

@geindex Python Enhancement Proposals; PEP 466
PEP 466@footnote{https://peps.python.org/pep-0466/} related features added in Python 2.7.8:


@itemize *

@item 
@ref{734,,hashlib.pbkdf2_hmac()} was backported from Python 3 to make a hashing
algorithm suitable for secure password storage broadly available to Python
2 applications. (Contributed by Alex Gaynor; bpo-21304@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21304}.)

@item 
OpenSSL 1.0.1h was upgraded for the official Windows installers published on
python.org. (Contributed by Zachary Ware in bpo-21671@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21671} for 
@geindex Common Vulnerabilities and Exposures; CVE 2014-0224
CVE 2014-0224@footnote{https://www.cve.org/CVERecord?id=CVE-2014-0224}.)
@end itemize

@geindex Python Enhancement Proposals; PEP 466
PEP 466@footnote{https://peps.python.org/pep-0466/} related features added in Python 2.7.9:


@itemize *

@item 
Most of Python 3.4’s @ref{d5,,ssl} module was backported. This means @code{ssl}
now supports Server Name Indication, TLS1.x settings, access to the platform
certificate store, the @ref{355,,SSLContext} class, and other
features. (Contributed by Alex Gaynor and David Reid; bpo-21308@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21308}.)

Refer to the “Version added: 2.7.9” notes in the module documentation for
specific details.

@item 
@ref{747,,os.urandom()} was changed to cache a file descriptor to @code{/dev/urandom}
instead of reopening @code{/dev/urandom} on every call. (Contributed by Alex
Gaynor; bpo-21305@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21305}.)

@item 
@ref{157f,,hashlib.algorithms_guaranteed} and
@ref{1580,,hashlib.algorithms_available} were backported from Python 3 to make
it easier for Python 2 applications to select the strongest available hash
algorithm. (Contributed by Alex Gaynor in bpo-21307@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21307})
@end itemize

@node PEP 477 Backport ensurepip PEP 453 to Python 2 7,PEP 476 Enabling certificate verification by default for stdlib http clients<2>,PEP 466 Network Security Enhancements for Python 2 7,New Features Added to Python 2 7 Maintenance Releases
@anchor{whatsnew/2 7 pep-477-backport-ensurepip-pep-453-to-python-2-7}@anchor{1581}
@subsubsection PEP 477: Backport ensurepip (PEP 453) to Python 2.7


@geindex Python Enhancement Proposals; PEP 477
PEP 477@footnote{https://peps.python.org/pep-0477/} approves the inclusion of the 
@geindex Python Enhancement Proposals; PEP 453
PEP 453@footnote{https://peps.python.org/pep-0453/} ensurepip module and the
improved documentation that was enabled by it in the Python 2.7 maintenance
releases, appearing first in the Python 2.7.9 release.

@menu
* Bootstrapping pip By Default: Bootstrapping pip By Default<2>. 
* Documentation Changes: Documentation Changes<2>. 

@end menu

@node Bootstrapping pip By Default<2>,Documentation Changes<2>,,PEP 477 Backport ensurepip PEP 453 to Python 2 7
@anchor{whatsnew/2 7 bootstrapping-pip-by-default}@anchor{1582}
@subsubsection Bootstrapping pip By Default


The new @ref{59,,ensurepip} module (defined in 
@geindex Python Enhancement Proposals; PEP 453
PEP 453@footnote{https://peps.python.org/pep-0453/}) provides a standard
cross-platform mechanism to bootstrap the pip installer into Python
installations. The version of @code{pip} included with Python 2.7.9 is @code{pip}
1.5.6, and future 2.7.x maintenance releases will update the bundled version to
the latest version of @code{pip} that is available at the time of creating the
release candidate.

By default, the commands @code{pip}, @code{pipX} and @code{pipX.Y} will be installed on
all platforms (where X.Y stands for the version of the Python installation),
along with the @code{pip} Python package and its dependencies.

For CPython @ref{10fc,,source builds on POSIX systems},
the @code{make install} and @code{make altinstall} commands do not bootstrap @code{pip}
by default.  This behaviour can be controlled through configure options, and
overridden through Makefile options.

On Windows and Mac OS X, the CPython installers now default to installing
@code{pip} along with CPython itself (users may opt out of installing it
during the installation process). Window users will need to opt in to the
automatic @code{PATH} modifications to have @code{pip} available from the command
line by default, otherwise it can still be accessed through the Python
launcher for Windows as @code{py -m pip}.

As 
@geindex Python Enhancement Proposals; PEP 0477#disabling-ensurepip-by-downstream-distributors
discussed in the PEP@footnote{https://peps.python.org/pep-0477/#disabling-ensurepip-by-downstream-distributors},
platform packagers may choose not to install
these commands by default, as long as, when invoked, they provide clear and
simple directions on how to install them on that platform (usually using
the system package manager).

@node Documentation Changes<2>,,Bootstrapping pip By Default<2>,PEP 477 Backport ensurepip PEP 453 to Python 2 7
@anchor{whatsnew/2 7 documentation-changes}@anchor{1583}
@subsubsection Documentation Changes


As part of this change, the @ref{10fe,,Installing Python modules} and
distributing-index sections of the documentation have been
completely redesigned as short getting started and FAQ documents. Most
packaging documentation has now been moved out to the Python Packaging
Authority maintained Python Packaging User Guide@footnote{https://packaging.python.org} and the documentation of the individual
projects.

However, as this migration is currently still incomplete, the legacy
versions of those guides remaining available as @ref{10ff,,Building C and C++ Extensions with setuptools}
and @ref{1100,,Building C and C++ Extensions with setuptools}.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 453

@item PEP 453@footnote{https://peps.python.org/pep-0453/} – Explicit bootstrapping of pip in Python installations

PEP written by Donald Stufft and Nick Coghlan, implemented by
Donald Stufft, Nick Coghlan, Martin von Löwis and Ned Deily.
@end table


@node PEP 476 Enabling certificate verification by default for stdlib http clients<2>,PEP 493 HTTPS verification migration tools for Python 2 7,PEP 477 Backport ensurepip PEP 453 to Python 2 7,New Features Added to Python 2 7 Maintenance Releases
@anchor{whatsnew/2 7 pep-476-enabling-certificate-verification-by-default-for-stdlib-http-clients}@anchor{1584}
@subsubsection PEP 476: Enabling certificate verification by default for stdlib http clients


@geindex Python Enhancement Proposals; PEP 476
PEP 476@footnote{https://peps.python.org/pep-0476/} updated @ref{72,,httplib} and modules which use it, such as
@ref{112,,urllib2} and @ref{135,,xmlrpclib}, to now
verify that the server
presents a certificate which is signed by a Certificate Authority in the
platform trust store and whose hostname matches the hostname being requested
by default, significantly improving security for many applications. This
change was made in the Python 2.7.9 release.

For applications which require the old previous behavior, they can pass an
alternate context:

@example
import urllib2
import ssl

# This disables all verification
context = ssl._create_unverified_context()

# This allows using a specific certificate for the host, which doesn't need
# to be in the trust store
context = ssl.create_default_context(cafile="/path/to/file.crt")

urllib2.urlopen("https://invalid-cert", context=context)
@end example

@node PEP 493 HTTPS verification migration tools for Python 2 7,New make regen-all build target<3>,PEP 476 Enabling certificate verification by default for stdlib http clients<2>,New Features Added to Python 2 7 Maintenance Releases
@anchor{whatsnew/2 7 pep-493-https-verification-migration-tools-for-python-2-7}@anchor{1585}
@subsubsection PEP 493: HTTPS verification migration tools for Python 2.7


@geindex Python Enhancement Proposals; PEP 493
PEP 493@footnote{https://peps.python.org/pep-0493/} provides additional migration tools to support a more incremental
infrastructure upgrade process for environments containing applications and
services relying on the historically permissive processing of server
certificates when establishing client HTTPS connections.  These additions were
made in the Python 2.7.12 release.

These tools are intended for use in cases where affected applications and
services can’t be modified to explicitly pass a more permissive SSL context
when establishing the connection.

For applications and services which can’t be modified at all, the new
@code{PYTHONHTTPSVERIFY} environment variable may be set to @code{0} to revert an
entire Python process back to the default permissive behaviour of Python 2.7.8
and earlier.

For cases where the connection establishment code can’t be modified, but the
overall application can be, the new @code{ssl._https_verify_certificates()}
function can be used to adjust the default behaviour at runtime.

@node New make regen-all build target<3>,Removal of make touch build target<3>,PEP 493 HTTPS verification migration tools for Python 2 7,New Features Added to Python 2 7 Maintenance Releases
@anchor{whatsnew/2 7 new-make-regen-all-build-target}@anchor{1586}
@subsubsection New @code{make regen-all} build target


To simplify cross-compilation, and to ensure that CPython can reliably be
compiled without requiring an existing version of Python to already be
available, the autotools-based build system no longer attempts to implicitly
recompile generated files based on file modification times.

Instead, a new @code{make regen-all} command has been added to force regeneration
of these files when desired (e.g. after an initial version of Python has
already been built based on the pregenerated versions).

More selective regeneration targets are also defined - see
Makefile.pre.in@footnote{https://github.com/python/cpython/tree/3.14/Makefile.pre.in} for details.

(Contributed by Victor Stinner in bpo-23404@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23404}.)


Added in version 2.7.14.


@node Removal of make touch build target<3>,,New make regen-all build target<3>,New Features Added to Python 2 7 Maintenance Releases
@anchor{whatsnew/2 7 removal-of-make-touch-build-target}@anchor{1587}
@subsubsection Removal of @code{make touch} build target


The @code{make touch} build target previously used to request implicit regeneration
of generated files by updating their modification times has been removed.

It has been replaced by the new @code{make regen-all} target.

(Contributed by Victor Stinner in bpo-23404@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23404}.)


Changed in version 2.7.14.


@c ======================================================================

@node Acknowledgements,,New Features Added to Python 2 7 Maintenance Releases,What’s New in Python 2 7
@anchor{whatsnew/2 7 acknowledgements}@anchor{1588}@anchor{whatsnew/2 7 acks27}@anchor{1589}
@subsection Acknowledgements


The author would like to thank the following people for offering
suggestions, corrections and assistance with various drafts of this
article: Nick Coghlan, Philip Jenvey, Ryan Lovett, R. David Murray,
Hugh Secker-Walker.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node What’s New in Python 2 6,What’s New in Python 2 5,What’s New in Python 2 7,What’s New in Python
@anchor{whatsnew/2 6 doc}@anchor{158a}@anchor{whatsnew/2 6 translation-repo}@anchor{158b}@anchor{whatsnew/2 6 what-s-new-in-python-2-6}@anchor{158c}@anchor{whatsnew/2 6 whats-new-in-2-6}@anchor{14b9}
@section What’s New in Python 2.6


@*Author: 
A.M. Kuchling (amk at amk.ca)


@c $Id$
@c Rules for maintenance:
@c 
@c * Anyone can add text to this document.  Do not spend very much time
@c on the wording of your changes, because your text will probably
@c get rewritten to some degree.
@c 
@c * The maintainer will go through Misc/NEWS periodically and add
@c changes; it's therefore more important to add your changes to
@c Misc/NEWS than to this file.
@c 
@c * This is not a complete list of every single change; completeness
@c is the purpose of Misc/NEWS.  Some changes I consider too small
@c or esoteric to include.  If such a change is added to the text,
@c I'll just remove it.  (This is another reason you shouldn't spend
@c too much time on writing your addition.)
@c 
@c * If you want to draw your new text to the attention of the
@c maintainer, add 'XXX' to the beginning of the paragraph or
@c section.
@c 
@c * It's OK to just add a fragmentary note about a change.  For
@c example: "XXX Describe the transmogrify() function added to the
@c socket module."  The maintainer will research the change and
@c write the necessary text.
@c 
@c * You can comment out your additions if you like, but it's not
@c necessary (especially when a final release is some months away).
@c 
@c * Credit the author of a patch or bugfix.   Just the name is
@c sufficient; the e-mail address isn't necessary.
@c 
@c * It's helpful to add the bug/patch number in a parenthetical comment.
@c 
@c XXX Describe the transmogrify() function added to the socket
@c module.
@c (Contributed by P.Y. Developer; :issue:`12345`.)
@c 
@c This saves the maintainer some effort going through the SVN logs
@c when researching a change.

This article explains the new features in Python 2.6, released on October 1,
2008.  The release schedule is described in 
@geindex Python Enhancement Proposals; PEP 361
PEP 361@footnote{https://peps.python.org/pep-0361/}.

The major theme of Python 2.6 is preparing the migration path to
Python 3.0, a major redesign of the language.  Whenever possible,
Python 2.6 incorporates new features and syntax from 3.0 while
remaining compatible with existing code by not removing older features
or syntax.  When it’s not possible to do that, Python 2.6 tries to do
what it can, adding compatibility functions in a
@code{future_builtins} module and a @code{-3} switch to warn about
usages that will become unsupported in 3.0.

Some significant new packages have been added to the standard library,
such as the @ref{98,,multiprocessing} and @ref{86,,json} modules, but
there aren’t many new features that aren’t related to Python 3.0 in
some way.

Python 2.6 also sees a number of improvements and bugfixes throughout
the source.  A search through the change logs finds there were 259
patches applied and 612 bugs fixed between Python 2.5 and 2.6.  Both
figures are likely to be underestimates.

This article doesn’t attempt to provide a complete specification of
the new features, but instead provides a convenient overview.  For
full details, you should refer to the documentation for Python 2.6. If
you want to understand the rationale for the design and
implementation, refer to the PEP for a particular new feature.
Whenever possible, “What’s New in Python” links to the bug/patch item
for each change.

@c Compare with previous release in 2 - 3 sentences here.
@c add hyperlink when the documentation becomes available online.

@c ========================================================================

@c Large, PEP-level features and changes should be described here.

@c ========================================================================

@menu
* Python 3.0: Python 3 0. 
* Changes to the Development Process:: 
* PEP 343; The ‘with’ statement: PEP 343 The ‘with’ statement. 
* PEP 366; Explicit Relative Imports From a Main Module: PEP 366 Explicit Relative Imports From a Main Module. 
* PEP 370; Per-user site-packages Directory: PEP 370 Per-user site-packages Directory. 
* PEP 371; The multiprocessing Package: PEP 371 The multiprocessing Package. 
* PEP 3101; Advanced String Formatting: PEP 3101 Advanced String Formatting. 
* PEP 3105; print As a Function: PEP 3105 print As a Function. 
* PEP 3110; Exception-Handling Changes: PEP 3110 Exception-Handling Changes. 
* PEP 3112; Byte Literals: PEP 3112 Byte Literals. 
* PEP 3116; New I/O Library: PEP 3116 New I/O Library. 
* PEP 3118; Revised Buffer Protocol: PEP 3118 Revised Buffer Protocol. 
* PEP 3119; Abstract Base Classes: PEP 3119 Abstract Base Classes. 
* PEP 3127; Integer Literal Support and Syntax: PEP 3127 Integer Literal Support and Syntax. 
* PEP 3129; Class Decorators: PEP 3129 Class Decorators. 
* PEP 3141; A Type Hierarchy for Numbers: PEP 3141 A Type Hierarchy for Numbers. 
* Other Language Changes: Other Language Changes<15>. 
* New and Improved Modules: New and Improved Modules<2>. 
* Deprecations and Removals:: 
* Build and C API Changes: Build and C API Changes<9>. 
* Porting to Python 2.6: Porting to Python 2 6. 
* Acknowledgements: Acknowledgements<2>. 

@end menu

@node Python 3 0,Changes to the Development Process,,What’s New in Python 2 6
@anchor{whatsnew/2 6 python-3-0}@anchor{158d}
@subsection Python 3.0


The development cycle for Python versions 2.6 and 3.0 was
synchronized, with the alpha and beta releases for both versions being
made on the same days.  The development of 3.0 has influenced many
features in 2.6.

Python 3.0 is a far-ranging redesign of Python that breaks
compatibility with the 2.x series.  This means that existing Python
code will need some conversion in order to run on
Python 3.0.  However, not all the changes in 3.0 necessarily break
compatibility.  In cases where new features won’t cause existing code
to break, they’ve been backported to 2.6 and are described in this
document in the appropriate place.  Some of the 3.0-derived features
are:


@itemize *

@item 
A @code{__complex__()} method for converting objects to a complex number.

@item 
Alternate syntax for catching exceptions: @code{except TypeError as exc}.

@item 
The addition of @ref{21c,,functools.reduce()} as a synonym for the built-in
@code{reduce()} function.
@end itemize

Python 3.0 adds several new built-in functions and changes the
semantics of some existing builtins.  Functions that are new in 3.0
such as @ref{14b4,,bin()} have simply been added to Python 2.6, but existing
builtins haven’t been changed; instead, the @code{future_builtins}
module has versions with the new 3.0 semantics.  Code written to be
compatible with 3.0 can do @code{from future_builtins import hex, map} as
necessary.

A new command-line switch, @code{-3}, enables warnings
about features that will be removed in Python 3.0.  You can run code
with this switch to see how much work will be necessary to port
code to 3.0.  The value of this switch is available
to Python code as the boolean variable @code{sys.py3kwarning},
and to C extension code as @code{Py_Py3kWarningFlag}.


@subsubheading See also


The 3`xxx' series of PEPs, which contains proposals for Python 3.0.
@geindex Python Enhancement Proposals; PEP 3000
PEP 3000@footnote{https://peps.python.org/pep-3000/} describes the development process for Python 3.0.
Start with 
@geindex Python Enhancement Proposals; PEP 3100
PEP 3100@footnote{https://peps.python.org/pep-3100/} that describes the general goals for Python
3.0, and then explore the higher-numbered PEPs that propose
specific features.


@node Changes to the Development Process,PEP 343 The ‘with’ statement,Python 3 0,What’s New in Python 2 6
@anchor{whatsnew/2 6 changes-to-the-development-process}@anchor{158e}
@subsection Changes to the Development Process


While 2.6 was being developed, the Python development process
underwent two significant changes: we switched from SourceForge’s
issue tracker to a customized Roundup installation, and the
documentation was converted from LaTeX to reStructuredText.

@menu
* New Issue Tracker; Roundup: New Issue Tracker Roundup. 
* New Documentation Format; reStructuredText Using Sphinx: New Documentation Format reStructuredText Using Sphinx. 

@end menu

@node New Issue Tracker Roundup,New Documentation Format reStructuredText Using Sphinx,,Changes to the Development Process
@anchor{whatsnew/2 6 new-issue-tracker-roundup}@anchor{158f}
@subsubsection New Issue Tracker: Roundup


For a long time, the Python developers had been growing increasingly
annoyed by SourceForge’s bug tracker.  SourceForge’s hosted solution
doesn’t permit much customization; for example, it wasn’t possible to
customize the life cycle of issues.

The infrastructure committee of the Python Software Foundation
therefore posted a call for issue trackers, asking volunteers to set
up different products and import some of the bugs and patches from
SourceForge.  Four different trackers were examined: Jira@footnote{https://www.atlassian.com/software/jira/},
Launchpad@footnote{https://launchpad.net/},
Roundup@footnote{https://roundup.sourceforge.io/}, and
Trac@footnote{https://trac.edgewall.org/}.
The committee eventually settled on Jira
and Roundup as the two candidates.  Jira is a commercial product that
offers no-cost hosted instances to free-software projects; Roundup
is an open-source project that requires volunteers
to administer it and a server to host it.

After posting a call for volunteers, a new Roundup installation was
set up at @indicateurl{https://bugs.python.org}.  One installation of Roundup can
host multiple trackers, and this server now also hosts issue trackers
for Jython and for the Python web site.  It will surely find
other uses in the future.  Where possible,
this edition of “What’s New in Python” links to the bug/patch
item for each change.

Hosting of the Python bug tracker is kindly provided by
Upfront Systems@footnote{https://upfrontsoftware.co.za}
of Stellenbosch, South Africa.  Martin von Löwis put a
lot of effort into importing existing bugs and patches from
SourceForge; his scripts for this import operation are at
@code{https://svn.python.org/view/tracker/importer/} and may be useful to
other projects wishing to move from SourceForge to Roundup.


@subsubheading See also



@table @asis

@item @indicateurl{https://bugs.python.org}

The Python bug tracker.

@item @indicateurl{https://bugs.jython.org}:

The Jython bug tracker.

@item @indicateurl{https://roundup.sourceforge.io/}

Roundup downloads and documentation.

@item @indicateurl{https://svn.python.org/view/tracker/importer/}

Martin von Löwis’s conversion scripts.
@end table


@node New Documentation Format reStructuredText Using Sphinx,,New Issue Tracker Roundup,Changes to the Development Process
@anchor{whatsnew/2 6 new-documentation-format-restructuredtext-using-sphinx}@anchor{1590}
@subsubsection New Documentation Format: reStructuredText Using Sphinx


The Python documentation was written using LaTeX since the project
started around 1989.  In the 1980s and early 1990s, most documentation
was printed out for later study, not viewed online. LaTeX was widely
used because it provided attractive printed output while remaining
straightforward to write once the basic rules of the markup were
learned.

Today LaTeX is still used for writing publications destined for
printing, but the landscape for programming tools has shifted.  We no
longer print out reams of documentation; instead, we browse through it
online and HTML has become the most important format to support.
Unfortunately, converting LaTeX to HTML is fairly complicated and Fred
L. Drake Jr., the long-time Python documentation editor, spent a lot
of time maintaining the conversion process.  Occasionally people would
suggest converting the documentation into SGML and later XML, but
performing a good conversion is a major task and no one ever committed
the time required to finish the job.

During the 2.6 development cycle, Georg Brandl put a lot of effort
into building a new toolchain for processing the documentation.  The
resulting package is called Sphinx, and is available from
@indicateurl{https://www.sphinx-doc.org/}.

Sphinx concentrates on HTML output, producing attractively styled and
modern HTML; printed output is still supported through conversion to
LaTeX.  The input format is reStructuredText, a markup syntax
supporting custom extensions and directives that is commonly used in
the Python community.

Sphinx is a standalone package that can be used for writing, and
almost two dozen other projects
(listed on the Sphinx web site@footnote{https://www.sphinx-doc.org/en/master/examples.html})
have adopted Sphinx as their documentation tool.


@subsubheading See also



@table @asis

@item Documenting Python@footnote{https://devguide.python.org/documenting/}

Describes how to write for Python’s documentation.

@item Sphinx@footnote{https://www.sphinx-doc.org/}

Documentation and code for the Sphinx toolchain.

@item Docutils@footnote{https://docutils.sourceforge.io}

The underlying reStructuredText parser and toolset.
@end table


@node PEP 343 The ‘with’ statement,PEP 366 Explicit Relative Imports From a Main Module,Changes to the Development Process,What’s New in Python 2 6
@anchor{whatsnew/2 6 pep-0343}@anchor{14ba}@anchor{whatsnew/2 6 pep-343-the-with-statement}@anchor{1591}
@subsection PEP 343: The ‘with’ statement


The previous version, Python 2.5, added the ‘@ref{187,,with}’
statement as an optional feature, to be enabled by a @code{from __future__
import with_statement} directive.  In 2.6 the statement no longer needs to
be specially enabled; this means that @code{with} is now always a
keyword.  The rest of this section is a copy of the corresponding
section from the “What’s New in Python 2.5” document; if you’re
familiar with the ‘@code{with}’ statement
from Python 2.5, you can skip this section.

The ‘@ref{187,,with}’ statement clarifies code that previously would use
@code{try...finally} blocks to ensure that clean-up code is executed.  In this
section, I’ll discuss the statement as it will commonly be used.  In the next
section, I’ll examine the implementation details and show how to write objects
for use with this statement.

The ‘@ref{187,,with}’ statement is a control-flow structure whose basic
structure is:

@example
with expression [as variable]:
    with-block
@end example

The expression is evaluated, and it should result in an object that supports the
context management protocol (that is, has @ref{7e5,,__enter__()} and @ref{150c,,__exit__()}
methods).

The object’s @ref{7e5,,__enter__()} is called before `with-block' is executed and
therefore can run set-up code. It also may return a value that is bound to the
name `variable', if given.  (Note carefully that `variable' is `not' assigned
the result of `expression'.)

After execution of the `with-block' is finished, the object’s @ref{150c,,__exit__()}
method is called, even if the block raised an exception, and can therefore run
clean-up code.

Some standard Python objects now support the context management protocol and can
be used with the ‘@ref{187,,with}’ statement. File objects are one example:

@example
with open('/etc/passwd', 'r') as f:
    for line in f:
        print line
        ... more processing code ...
@end example

After this statement has executed, the file object in `f' will have been
automatically closed, even if the @ref{348,,for} loop raised an exception
part-way through the block.

@cartouche
@quotation Note 
In this case, `f' is the same object created by @ref{318,,open()}, because
@ref{7e5,,__enter__()} returns `self'.
@end quotation
@end cartouche

The @ref{f3,,threading} module’s locks and condition variables  also support the
‘@ref{187,,with}’ statement:

@example
lock = threading.Lock()
with lock:
    # Critical section of code
    ...
@end example

The lock is acquired before the block is executed and always released once  the
block is complete.

The @ref{1592,,localcontext()} function in the @ref{3a,,decimal} module makes
it easy to save and restore the current decimal context, which encapsulates
the desired precision and rounding characteristics for computations:

@example
from decimal import Decimal, Context, localcontext

# Displays with default precision of 28 digits
v = Decimal('578')
print v.sqrt()

with localcontext(Context(prec=16)):
    # All code in this block uses a precision of 16 digits.
    # The original context is restored on exiting the block.
    print v.sqrt()
@end example

@menu
* Writing Context Managers:: 
* The contextlib module:: 

@end menu

@node Writing Context Managers,The contextlib module,,PEP 343 The ‘with’ statement
@anchor{whatsnew/2 6 new-26-context-managers}@anchor{14bb}@anchor{whatsnew/2 6 writing-context-managers}@anchor{1593}
@subsubsection Writing Context Managers


Under the hood, the ‘@ref{187,,with}’ statement is fairly complicated. Most
people will only use ‘@code{with}’ in company with existing objects and
don’t need to know these details, so you can skip the rest of this section if
you like.  Authors of new objects will need to understand the details of the
underlying implementation and should keep reading.

A high-level explanation of the context management protocol is:


@itemize *

@item 
The expression is evaluated and should result in an object called a “context
manager”.  The context manager must have @ref{7e5,,__enter__()} and
@ref{150c,,__exit__()} methods.

@item 
The context manager’s @ref{7e5,,__enter__()} method is called.  The value
returned is assigned to `VAR'.  If no @code{as VAR} clause is present, the
value is simply discarded.

@item 
The code in `BLOCK' is executed.

@item 
If `BLOCK' raises an exception, the context manager’s @ref{150c,,__exit__()} method
is called with three arguments, the exception details (@code{type, value, traceback},
the same values returned by @ref{89c,,sys.exc_info()}, which can also be @code{None}
if no exception occurred).  The method’s return value controls whether an exception
is re-raised: any false value re-raises the exception, and @code{True} will result
in suppressing it.  You’ll only rarely want to suppress the exception, because
if you do the author of the code containing the ‘@ref{187,,with}’ statement will
never realize anything went wrong.

@item 
If `BLOCK' didn’t raise an exception,  the @ref{150c,,__exit__()} method is still
called, but `type', `value', and `traceback' are all @code{None}.
@end itemize

Let’s think through an example.  I won’t present detailed code but will only
sketch the methods necessary for a database that supports transactions.

(For people unfamiliar with database terminology: a set of changes to the
database are grouped into a transaction.  Transactions can be either committed,
meaning that all the changes are written into the database, or rolled back,
meaning that the changes are all discarded and the database is unchanged.  See
any database textbook for more information.)

Let’s assume there’s an object representing a database connection. Our goal will
be to let the user write code like this:

@example
db_connection = DatabaseConnection()
with db_connection as cursor:
    cursor.execute('insert into ...')
    cursor.execute('delete from ...')
    # ... more operations ...
@end example

The transaction should be committed if the code in the block runs flawlessly or
rolled back if there’s an exception. Here’s the basic interface for
@code{DatabaseConnection} that I’ll assume:

@example
class DatabaseConnection:
    # Database interface
    def cursor(self):
        "Returns a cursor object and starts a new transaction"
    def commit(self):
        "Commits current transaction"
    def rollback(self):
        "Rolls back current transaction"
@end example

The @ref{7e5,,__enter__()} method is pretty easy, having only to start a new
transaction.  For this application the resulting cursor object would be a useful
result, so the method will return it.  The user can then add @code{as cursor} to
their ‘@ref{187,,with}’ statement to bind the cursor to a variable name.

@example
class DatabaseConnection:
    ...
    def __enter__(self):
        # Code to start a new transaction
        cursor = self.cursor()
        return cursor
@end example

The @ref{150c,,__exit__()} method is the most complicated because it’s where most of
the work has to be done.  The method has to check if an exception occurred.  If
there was no exception, the transaction is committed.  The transaction is rolled
back if there was an exception.

In the code below, execution will just fall off the end of the function,
returning the default value of @code{None}.  @code{None} is false, so the exception
will be re-raised automatically.  If you wished, you could be more explicit and
add a @ref{1b0,,return} statement at the marked location.

@example
class DatabaseConnection:
    ...
    def __exit__(self, type, value, tb):
        if tb is None:
            # No exception, so commit
            self.commit()
        else:
            # Exception occurred, so rollback.
            self.rollback()
            # return False
@end example

@node The contextlib module,,Writing Context Managers,PEP 343 The ‘with’ statement
@anchor{whatsnew/2 6 new-module-contextlib}@anchor{14bc}@anchor{whatsnew/2 6 the-contextlib-module}@anchor{1594}
@subsubsection The contextlib module


The @ref{27,,contextlib} module provides some functions and a decorator that
are useful when writing objects for use with the ‘@ref{187,,with}’ statement.

The decorator is called @ref{140e,,contextmanager()}, and lets you write
a single generator function instead of defining a new class.  The generator
should yield exactly one value.  The code up to the @ref{bc8,,yield} will be
executed as the @ref{7e5,,__enter__()} method, and the value yielded will
be the method’s return value that will get bound to the variable in the
‘@ref{187,,with}’ statement’s @code{as} clause, if any.  The code after
the @code{yield} will be executed in the @ref{150c,,__exit__()} method.
Any exception raised in the block will be raised by the @code{yield}
statement.

Using this decorator, our database example from the previous section
could be written as:

@example
from contextlib import contextmanager

@@contextmanager
def db_transaction(connection):
    cursor = connection.cursor()
    try:
        yield cursor
    except:
        connection.rollback()
        raise
    else:
        connection.commit()

db = DatabaseConnection()
with db_transaction(db) as cursor:
    ...
@end example

The @ref{27,,contextlib} module also has a @code{nested(mgr1, mgr2, ...)} function
that combines a number of context managers so you don’t need to write nested
‘@ref{187,,with}’ statements.  In this example, the single ‘@code{with}’
statement both starts a database transaction and acquires a thread lock:

@example
lock = threading.Lock()
with nested (db_transaction(db), lock) as (cursor, locked):
    ...
@end example

Finally, the @ref{1595,,closing()} function returns its argument so that it can be
bound to a variable, and calls the argument’s @code{.close()} method at the end
of the block.

@example
import urllib, sys
from contextlib import closing

with closing(urllib.urlopen('http://www.yahoo.com')) as f:
    for line in f:
        sys.stdout.write(line)
@end example


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 343

@item PEP 343@footnote{https://peps.python.org/pep-0343/} - The “with” statement

PEP written by Guido van Rossum and Nick Coghlan; implemented by Mike Bland,
Guido van Rossum, and Neal Norwitz.  The PEP shows the code generated for a
‘@ref{187,,with}’ statement, which can be helpful in learning how the statement
works.
@end table

The documentation  for the @ref{27,,contextlib} module.


@c ======================================================================

@node PEP 366 Explicit Relative Imports From a Main Module,PEP 370 Per-user site-packages Directory,PEP 343 The ‘with’ statement,What’s New in Python 2 6
@anchor{whatsnew/2 6 pep-0366}@anchor{14bd}@anchor{whatsnew/2 6 pep-366-explicit-relative-imports-from-a-main-module}@anchor{1596}
@subsection PEP 366: Explicit Relative Imports From a Main Module


Python’s @ref{23e,,-m} switch allows running a module as a script.
When you ran a module that was located inside a package, relative
imports didn’t work correctly.

The fix for Python 2.6 adds a @ref{325,,module.__package__} attribute.
When this attribute is present, relative imports will be
relative to the value of this attribute instead of the
@ref{1597,,__name__} attribute.

PEP 302-style importers can then set @ref{325,,__package__} as necessary.
The @ref{c3,,runpy} module that implements the @ref{23e,,-m} switch now
does this, so relative imports will now work correctly in scripts
running from inside a package.

@c ======================================================================

@node PEP 370 Per-user site-packages Directory,PEP 371 The multiprocessing Package,PEP 366 Explicit Relative Imports From a Main Module,What’s New in Python 2 6
@anchor{whatsnew/2 6 pep-0370}@anchor{14be}@anchor{whatsnew/2 6 pep-370-per-user-site-packages-directory}@anchor{1598}
@subsection PEP 370: Per-user @code{site-packages} Directory


When you run Python, the module search path @code{sys.path} usually
includes a directory whose path ends in @code{"site-packages"}.  This
directory is intended to hold locally installed packages available to
all users using a machine or a particular site installation.

Python 2.6 introduces a convention for user-specific site directories.
The directory varies depending on the platform:


@itemize *

@item 
Unix and Mac OS X: @code{~/.local/}

@item 
Windows: @code{%APPDATA%/Python}
@end itemize

Within this directory, there will be version-specific subdirectories,
such as @code{lib/python2.6/site-packages} on Unix/Mac OS and
@code{Python26/site-packages} on Windows.

If you don’t like the default directory, it can be overridden by an
environment variable.  
@geindex PYTHONUSERBASE
@geindex environment variable; PYTHONUSERBASE
@ref{1599,,PYTHONUSERBASE} sets the root
directory used for all Python versions supporting this feature.  On
Windows, the directory for application-specific data can be changed by
setting the @code{APPDATA} environment variable.  You can also
modify the @code{site.py} file for your Python installation.

The feature can be disabled entirely by running Python with the
@ref{159a,,-s} option or setting the 
@geindex PYTHONNOUSERSITE
@geindex environment variable; PYTHONNOUSERSITE
@ref{159b,,PYTHONNOUSERSITE}
environment variable.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 370

@item PEP 370@footnote{https://peps.python.org/pep-0370/} - Per-user @code{site-packages} Directory

PEP written and implemented by Christian Heimes.
@end table


@c ======================================================================

@node PEP 371 The multiprocessing Package,PEP 3101 Advanced String Formatting,PEP 370 Per-user site-packages Directory,What’s New in Python 2 6
@anchor{whatsnew/2 6 pep-0371}@anchor{14bf}@anchor{whatsnew/2 6 pep-371-the-multiprocessing-package}@anchor{159c}
@subsection PEP 371: The @code{multiprocessing} Package


The new @ref{98,,multiprocessing} package lets Python programs create new
processes that will perform a computation and return a result to the
parent.  The parent and child processes can communicate using queues
and pipes, synchronize their operations using locks and semaphores,
and can share simple arrays of data.

The @ref{98,,multiprocessing} module started out as an exact emulation of
the @ref{f3,,threading} module using processes instead of threads.  That
goal was discarded along the path to Python 2.6, but the general
approach of the module is still similar.  The fundamental class
is the @ref{254,,Process}, which is passed a callable object and
a collection of arguments.  The @ref{159d,,start()} method
sets the callable running in a subprocess, after which you can call
the @ref{159e,,is_alive()} method to check whether the
subprocess is still running and the @ref{159f,,join()}
method to wait for the process to exit.

Here’s a simple example where the subprocess will calculate a
factorial.  The function doing the calculation is written strangely so
that it takes significantly longer when the input argument is a
multiple of 4.

@example
import time
from multiprocessing import Process, Queue


def factorial(queue, N):
    "Compute a factorial."
    # If N is a multiple of 4, this function will take much longer.
    if (N % 4) == 0:
        time.sleep(.05 * N/4)

    # Calculate the result
    fact = 1L
    for i in range(1, N+1):
        fact = fact * i

    # Put the result on the queue
    queue.put(fact)

if __name__ == '__main__':
    queue = Queue()

    N = 5

    p = Process(target=factorial, args=(queue, N))
    p.start()
    p.join()

    result = queue.get()
    print 'Factorial', N, '=', result
@end example

A @ref{15a0,,Queue} is used to communicate the result of the factorial.
The @code{Queue} object is stored in a global variable.
The child process will use the value of the variable when the child
was created; because it’s a @code{Queue}, parent and child can use
the object to communicate.  (If the parent were to change the value of
the global variable, the child’s value would be unaffected, and vice
versa.)

Two other classes, @ref{1171,,Pool} and
@ref{252,,Manager}, provide higher-level interfaces.
@code{Pool} will create a fixed number of worker
processes, and requests can then be distributed to the workers by calling
@ref{15a1,,apply()} or
@ref{15a2,,apply_async()} to add a single request, and
@ref{12f1,,map()} or
@ref{12f2,,map_async()} to add a number of
requests.  The following code uses a @code{Pool} to
spread requests across 5 worker processes and retrieve a list of results:

@example
from multiprocessing import Pool

def factorial(N, dictionary):
    "Compute a factorial."
    ...
p = Pool(5)
result = p.map(factorial, range(1, 1000, 10))
for v in result:
    print v
@end example

This produces the following output:

@example
1
39916800
51090942171709440000
8222838654177922817725562880000000
33452526613163807108170062053440751665152000000000
...
@end example

The other high-level interface, the @ref{252,,Manager} class,
creates a separate server process that can hold master copies of Python data
structures.  Other processes can then access and modify these data
structures using proxy objects.  The following example creates a
shared dictionary by calling the @ref{184,,dict()} method; the worker
processes then insert values into the dictionary.  (Locking is not
done for you automatically, which doesn’t matter in this example.
@code{Manager}’s methods also include
@ref{15a3,,Lock()},
@ref{15a4,,RLock()},
and @ref{15a5,,Semaphore()} to create
shared locks.)

@example
import time
from multiprocessing import Pool, Manager

def factorial(N, dictionary):
    "Compute a factorial."
    # Calculate the result
    fact = 1L
    for i in range(1, N+1):
        fact = fact * i

    # Store result in dictionary
    dictionary[N] = fact

if __name__ == '__main__':
    p = Pool(5)
    mgr = Manager()
    d = mgr.dict()         # Create shared dictionary

    # Run tasks using the pool
    for N in range(1, 1000, 10):
        p.apply_async(factorial, (N, d))

    # Mark pool as closed -- no more tasks can be added.
    p.close()

    # Wait for tasks to exit
    p.join()

    # Output results
    for k, v in sorted(d.items()):
        print k, v
@end example

This will produce the output:

@example
1 1
11 39916800
21 51090942171709440000
31 8222838654177922817725562880000000
41 33452526613163807108170062053440751665152000000000
51 15511187532873822802242430164693032110632597200169861120000...
@end example


@subsubheading See also


The documentation for the @ref{98,,multiprocessing} module.


@table @asis

@geindex Python Enhancement Proposals; PEP 371

@item PEP 371@footnote{https://peps.python.org/pep-0371/} - Addition of the multiprocessing package

PEP written by Jesse Noller and Richard Oudkerk;
implemented by Richard Oudkerk and Jesse Noller.
@end table


@c ======================================================================

@node PEP 3101 Advanced String Formatting,PEP 3105 print As a Function,PEP 371 The multiprocessing Package,What’s New in Python 2 6
@anchor{whatsnew/2 6 pep-3101}@anchor{14c0}@anchor{whatsnew/2 6 pep-3101-advanced-string-formatting}@anchor{15a6}
@subsection PEP 3101: Advanced String Formatting


In Python 3.0, the @code{%} operator is supplemented by a more powerful string
formatting method, @ref{19a,,format()}.  Support for the @ref{834,,str.format()} method
has been backported to Python 2.6.

In 2.6, both 8-bit and Unicode strings have a @code{.format()} method that
treats the string as a template and takes the arguments to be formatted.
The formatting template uses curly brackets (@code{@{}, @code{@}}) as special characters:

@example
>>> # Substitute positional argument 0 into the string.
>>> "User ID: @{0@}".format("root")
'User ID: root'
>>> # Use the named keyword arguments
>>> "User ID: @{uid@}   Last seen: @{last_login@}".format(
...    uid="root",
...    last_login = "5 Mar 2008 07:20")
'User ID: root   Last seen: 5 Mar 2008 07:20'
@end example

Curly brackets can be escaped by doubling them:

@example
>>> "Empty dict: @{@{@}@}".format()
"Empty dict: @{@}"
@end example

Field names can be integers indicating positional arguments, such as
@code{@{0@}}, @code{@{1@}}, etc. or names of keyword arguments.  You can also
supply compound field names that read attributes or access dictionary keys:

@example
>>> import sys
>>> print 'Platform: @{0.platform@}\nPython version: @{0.version@}'.format(sys)
Platform: darwin
Python version: 2.6a1+ (trunk:61261M, Mar  5 2008, 20:29:41)
[GCC 4.0.1 (Apple Computer, Inc. build 5367)]'

>>> import mimetypes
>>> 'Content-type: @{0[.mp4]@}'.format(mimetypes.types_map)
'Content-type: video/mp4'
@end example

Note that when using dictionary-style notation such as @code{[.mp4]}, you
don’t need to put any quotation marks around the string; it will look
up the value using @code{.mp4} as the key.  Strings beginning with a
number will be converted to an integer.  You can’t write more
complicated expressions inside a format string.

So far we’ve shown how to specify which field to substitute into the
resulting string.  The precise formatting used is also controllable by
adding a colon followed by a format specifier.  For example:

@example
>>> # Field 0: left justify, pad to 15 characters
>>> # Field 1: right justify, pad to 6 characters
>>> fmt = '@{0:15@} $@{1:>6@}'
>>> fmt.format('Registration', 35)
'Registration    $    35'
>>> fmt.format('Tutorial', 50)
'Tutorial        $    50'
>>> fmt.format('Banquet', 125)
'Banquet         $   125'
@end example

Format specifiers can reference other fields through nesting:

@example
>>> fmt = '@{0:@{1@}@}'
>>> width = 15
>>> fmt.format('Invoice #1234', width)
'Invoice #1234  '
>>> width = 35
>>> fmt.format('Invoice #1234', width)
'Invoice #1234                      '
@end example

The alignment of a field within the desired width can be specified:


@multitable {xxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Character

@tab

Effect

@item

< (default)

@tab

Left-align

@item

>

@tab

Right-align

@item

^

@tab

Center

@item

=

@tab

(For numeric types only) Pad after the sign.

@end multitable


Format specifiers can also include a presentation type, which
controls how the value is formatted.  For example, floating-point numbers
can be formatted as a general number or in exponential notation:

@example
>>> '@{0:g@}'.format(3.75)
'3.75'
>>> '@{0:e@}'.format(3.75)
'3.750000e+00'
@end example

A variety of presentation types are available.  Consult the 2.6
documentation for a @ref{15a7,,complete list}; here’s a sample:


@multitable {xxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@code{b}

@tab

Binary. Outputs the number in base 2.

@item

@code{c}

@tab

Character. Converts the integer to the corresponding Unicode character
before printing.

@item

@code{d}

@tab

Decimal Integer. Outputs the number in base 10.

@item

@code{o}

@tab

Octal format. Outputs the number in base 8.

@item

@code{x}

@tab

Hex format. Outputs the number in base 16, using lower-case letters for
the digits above 9.

@item

@code{e}

@tab

Exponent notation. Prints the number in scientific notation using the
letter ‘e’ to indicate the exponent.

@item

@code{g}

@tab

General format. This prints the number as a fixed-point number, unless
the number is too large, in which case it switches to ‘e’ exponent
notation.

@item

@code{n}

@tab

Number. This is the same as ‘g’ (for floats) or ‘d’ (for integers),
except that it uses the current locale setting to insert the appropriate
number separator characters.

@item

@code{%}

@tab

Percentage. Multiplies the number by 100 and displays in fixed (‘f’)
format, followed by a percent sign.

@end multitable


Classes and types can define a @ref{832,,__format__()} method to control how they’re
formatted.  It receives a single argument, the format specifier:

@example
def __format__(self, format_spec):
    if isinstance(format_spec, unicode):
        return unicode(str(self))
    else:
        return str(self)
@end example

There’s also a @ref{19a,,format()} builtin that will format a single
value.  It calls the type’s @ref{832,,__format__()} method with the
provided specifier:

@example
>>> format(75.6564, '.2f')
'75.66'
@end example


@subsubheading See also



@table @asis

@item @ref{15a7,,Format string syntax}

The reference documentation for format fields.

@geindex Python Enhancement Proposals; PEP 3101

@item PEP 3101@footnote{https://peps.python.org/pep-3101/} - Advanced String Formatting

PEP written by Talin. Implemented by Eric Smith.
@end table


@c ======================================================================

@node PEP 3105 print As a Function,PEP 3110 Exception-Handling Changes,PEP 3101 Advanced String Formatting,What’s New in Python 2 6
@anchor{whatsnew/2 6 pep-3105}@anchor{14c1}@anchor{whatsnew/2 6 pep-3105-print-as-a-function}@anchor{15a8}
@subsection PEP 3105: @code{print} As a Function


The @code{print} statement becomes the @ref{117b,,print()} function in Python 3.0.
Making @code{print()} a function makes it possible to replace the function
by doing @code{def print(...)} or importing a new function from somewhere else.

Python 2.6 has a @code{__future__} import that removes @code{print} as language
syntax, letting you use the functional form instead.  For example:

@example
>>> from __future__ import print_function
>>> print('# of entries', len(dictionary), file=sys.stderr)
@end example

The signature of the new function is:

@example
def print(*args, sep=' ', end='\n', file=None)
@end example

The parameters are:


@itemize *

@item 
`args': positional arguments whose values will be printed out.

@item 
`sep': the separator, which will be printed between arguments.

@item 
`end': the ending text, which will be printed after all of the
arguments have been output.

@item 
`file': the file object to which the output will be sent.
@end itemize


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 3105

@item PEP 3105@footnote{https://peps.python.org/pep-3105/} - Make print a function

PEP written by Georg Brandl.
@end table


@c ======================================================================

@node PEP 3110 Exception-Handling Changes,PEP 3112 Byte Literals,PEP 3105 print As a Function,What’s New in Python 2 6
@anchor{whatsnew/2 6 pep-3110}@anchor{14c2}@anchor{whatsnew/2 6 pep-3110-exception-handling-changes}@anchor{15a9}
@subsection PEP 3110: Exception-Handling Changes


One error that Python programmers occasionally make
is writing the following code:

@example
try:
    ...
except TypeError, ValueError:  # Wrong!
    ...
@end example

The author is probably trying to catch both @ref{199,,TypeError} and
@ref{2ee,,ValueError} exceptions, but this code actually does something
different: it will catch @code{TypeError} and bind the resulting
exception object to the local name @code{"ValueError"}.  The
@code{ValueError} exception will not be caught at all.  The correct
code specifies a tuple of exceptions:

@example
try:
    ...
except (TypeError, ValueError):
    ...
@end example

This error happens because the use of the comma here is ambiguous:
does it indicate two different nodes in the parse tree, or a single
node that’s a tuple?

Python 3.0 makes this unambiguous by replacing the comma with the word
“as”.  To catch an exception and store the exception object in the
variable @code{exc}, you must write:

@example
try:
    ...
except TypeError as exc:
    ...
@end example

Python 3.0 will only support the use of “as”, and therefore interprets
the first example as catching two different exceptions.  Python 2.6
supports both the comma and “as”, so existing code will continue to
work.  We therefore suggest using “as” when writing new Python code
that will only be executed with 2.6.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 3110

@item PEP 3110@footnote{https://peps.python.org/pep-3110/} - Catching Exceptions in Python 3000

PEP written and implemented by Collin Winter.
@end table


@c ======================================================================

@node PEP 3112 Byte Literals,PEP 3116 New I/O Library,PEP 3110 Exception-Handling Changes,What’s New in Python 2 6
@anchor{whatsnew/2 6 pep-3112}@anchor{14c3}@anchor{whatsnew/2 6 pep-3112-byte-literals}@anchor{15aa}
@subsection PEP 3112: Byte Literals


Python 3.0 adopts Unicode as the language’s fundamental string type and
denotes 8-bit literals differently, either as @code{b'string'}
or using a @ref{193,,bytes} constructor.  For future compatibility,
Python 2.6 adds @code{bytes} as a synonym for the @ref{16a,,str} type,
and it also supports the @code{b'@w{'}} notation.

The 2.6 @ref{16a,,str} differs from 3.0’s @ref{193,,bytes} type in various
ways; most notably, the constructor is completely different.  In 3.0,
@code{bytes([65, 66, 67])} is 3 elements long, containing the bytes
representing @code{ABC}; in 2.6, @code{bytes([65, 66, 67])} returns the
12-byte string representing the @ref{16a,,str()} of the list.

The primary use of @ref{193,,bytes} in 2.6 will be to write tests of
object type such as @code{isinstance(x, bytes)}.  This will help the 2to3
converter, which can’t tell whether 2.x code intends strings to
contain either characters or 8-bit bytes; you can now
use either @code{bytes} or @ref{16a,,str} to represent your intention
exactly, and the resulting code will also be correct in Python 3.0.

There’s also a @code{__future__} import that causes all string literals
to become Unicode strings.  This means that @code{\u} escape sequences
can be used to include Unicode characters:

@example
from __future__ import unicode_literals

s = ('\u751f\u3080\u304e\u3000\u751f\u3054'
     '\u3081\u3000\u751f\u305f\u307e\u3054')

print len(s)               # 12 Unicode characters
@end example

At the C level, Python 3.0 will rename the existing 8-bit
string type, called @code{PyStringObject} in Python 2.x,
to @ref{99a,,PyBytesObject}.  Python 2.6 uses @code{#define}
to support using the names @ref{99a,,PyBytesObject()},
@ref{15ab,,PyBytes_Check()}, @ref{15ac,,PyBytes_FromStringAndSize()},
and all the other functions and macros used with strings.

Instances of the @ref{193,,bytes} type are immutable just
as strings are.  A new @ref{342,,bytearray} type stores a mutable
sequence of bytes:

@example
>>> bytearray([65, 66, 67])
bytearray(b'ABC')
>>> b = bytearray(u'\u21ef\u3244', 'utf-8')
>>> b
bytearray(b'\xe2\x87\xaf\xe3\x89\x84')
>>> b[0] = '\xe3'
>>> b
bytearray(b'\xe3\x87\xaf\xe3\x89\x84')
>>> unicode(str(b), 'utf-8')
u'\u31ef \u3244'
@end example

Byte arrays support most of the methods of string types, such as
@ref{15ad,,startswith()}/@ref{15ae,,endswith()},
@ref{15af,,find()}/@ref{15b0,,rfind()},
and some of the methods of lists, such as @ref{15b1,,append()},
@ref{15b2,,pop()},  and @ref{15b3,,reverse()}.

@example
>>> b = bytearray('ABC')
>>> b.append('d')
>>> b.append(ord('e'))
>>> b
bytearray(b'ABCde')
@end example

There’s also a corresponding C API, with
@ref{15b4,,PyByteArray_FromObject()},
@ref{15b5,,PyByteArray_FromStringAndSize()},
and various other functions.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 3112

@item PEP 3112@footnote{https://peps.python.org/pep-3112/} - Bytes literals in Python 3000

PEP written by Jason Orendorff; backported to 2.6 by Christian Heimes.
@end table


@c ======================================================================

@node PEP 3116 New I/O Library,PEP 3118 Revised Buffer Protocol,PEP 3112 Byte Literals,What’s New in Python 2 6
@anchor{whatsnew/2 6 pep-3116}@anchor{14c4}@anchor{whatsnew/2 6 pep-3116-new-i-o-library}@anchor{15b6}
@subsection PEP 3116: New I/O Library


Python’s built-in file objects support a number of methods, but
file-like objects don’t necessarily support all of them.  Objects that
imitate files usually support @code{read()} and
@code{write()}, but they may not support @code{readline()},
for example.  Python 3.0 introduces a layered I/O library in the @ref{83,,io}
module that separates buffering and text-handling features from the
fundamental read and write operations.

There are three levels of abstract base classes provided by
the @ref{83,,io} module:


@itemize *

@item 
@ref{12dc,,RawIOBase} defines raw I/O operations: @ref{1023,,read()},
@ref{1024,,readinto()}, @ref{15b7,,write()},
@ref{1498,,seek()}, @ref{15b8,,tell()}, @ref{151c,,truncate()},
and @ref{507,,close()}.
Most of the methods of this class will often map to a single system call.
There are also @ref{15b9,,readable()}, @ref{15ba,,writable()},
and @ref{15bb,,seekable()} methods for determining what operations a
given object will allow.

Python 3.0 has concrete implementations of this class for files and
sockets, but Python 2.6 hasn’t restructured its file and socket objects
in this way.

@item 
@ref{8a5,,BufferedIOBase} is an abstract base class that
buffers data in memory to reduce the number of
system calls used, making I/O processing more efficient.
It supports all of the methods of @ref{12dc,,RawIOBase},
and adds a @ref{15bc,,raw} attribute holding the underlying
raw object.

There are five concrete classes implementing this ABC.
@ref{15bd,,BufferedWriter} and @ref{141a,,BufferedReader} are for objects
that support write-only or read-only usage that have a @ref{1498,,seek()}
method for random access.  @ref{15be,,BufferedRandom} objects support
read and write access upon the same underlying stream, and
@ref{15bf,,BufferedRWPair} is for objects such as TTYs that have both
read and write operations acting upon unconnected streams of data.
The @ref{10aa,,BytesIO} class supports reading, writing, and seeking
over an in-memory buffer.

@geindex universal newlines; What's new

@item 
@ref{8a6,,TextIOBase}: Provides functions for reading and writing
strings (remember, strings will be Unicode in Python 3.0),
and supporting @ref{f3b,,universal newlines}.  @code{TextIOBase} defines
the @ref{bf,,readline()} method and supports iteration upon
objects.

There are two concrete implementations.  @ref{9c4,,TextIOWrapper}
wraps a buffered I/O object, supporting all of the methods for
text I/O and adding a @ref{14af,,buffer} attribute for access
to the underlying object.  @ref{112f,,StringIO} simply buffers
everything in memory without ever writing anything to disk.

(In Python 2.6, @ref{112f,,io.StringIO} is implemented in
pure Python, so it’s pretty slow.   You should therefore stick with the
existing @code{StringIO} module or @code{cStringIO} for now.  At some
point Python 3.0’s @ref{83,,io} module will be rewritten into C for speed,
and perhaps the C implementation will be  backported to the 2.x releases.)
@end itemize

In Python 2.6, the underlying implementations haven’t been
restructured to build on top of the @ref{83,,io} module’s classes.  The
module is being provided to make it easier to write code that’s
forward-compatible with 3.0, and to save developers the effort of writing
their own implementations of buffering and text I/O.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 3116

@item PEP 3116@footnote{https://peps.python.org/pep-3116/} - New I/O

PEP written by Daniel Stutzbach, Mike Verdone, and Guido van Rossum.
Code by Guido van Rossum, Georg Brandl, Walter Doerwald,
Jeremy Hylton, Martin von Löwis, Tony Lownds, and others.
@end table


@c ======================================================================

@node PEP 3118 Revised Buffer Protocol,PEP 3119 Abstract Base Classes,PEP 3116 New I/O Library,What’s New in Python 2 6
@anchor{whatsnew/2 6 pep-3118}@anchor{14c5}@anchor{whatsnew/2 6 pep-3118-revised-buffer-protocol}@anchor{15c0}
@subsection PEP 3118: Revised Buffer Protocol


The buffer protocol is a C-level API that lets Python types
exchange pointers into their internal representations.  A
memory-mapped file can be viewed as a buffer of characters, for
example, and this lets another module such as @ref{be,,re}
treat memory-mapped files as a string of characters to be searched.

The primary users of the buffer protocol are numeric-processing
packages such as NumPy, which expose the internal representation
of arrays so that callers can write data directly into an array instead
of going through a slower API.  This PEP updates the buffer protocol in light of experience
from NumPy development, adding a number of new features
such as indicating the shape of an array or locking a memory region.

The most important new C API function is
@code{PyObject_GetBuffer(PyObject *obj, Py_buffer *view, int flags)}, which
takes an object and a set of flags, and fills in the
@code{Py_buffer} structure with information
about the object’s memory representation.  Objects
can use this operation to lock memory in place
while an external caller could be modifying the contents,
so there’s a corresponding @code{PyBuffer_Release(Py_buffer *view)} to
indicate that the external caller is done.

The `flags' argument to @ref{63a,,PyObject_GetBuffer()} specifies
constraints upon the memory returned.  Some examples are:


@itemize *

@item 
@ref{15c1,,PyBUF_WRITABLE} indicates that the memory must be writable.

@item 
@code{PyBUF_LOCK} requests a read-only or exclusive lock on the memory.

@item 
@ref{15c2,,PyBUF_C_CONTIGUOUS} and @ref{15c3,,PyBUF_F_CONTIGUOUS}
requests a C-contiguous (last dimension varies the fastest) or
Fortran-contiguous (first dimension varies the fastest) array layout.
@end itemize

Two new argument codes for @ref{3bf,,PyArg_ParseTuple()},
@code{s*} and @code{z*}, return locked buffer objects for a parameter.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 3118

@item PEP 3118@footnote{https://peps.python.org/pep-3118/} - Revising the buffer protocol

PEP written by Travis Oliphant and Carl Banks; implemented by
Travis Oliphant.
@end table


@c ======================================================================

@node PEP 3119 Abstract Base Classes,PEP 3127 Integer Literal Support and Syntax,PEP 3118 Revised Buffer Protocol,What’s New in Python 2 6
@anchor{whatsnew/2 6 pep-3119}@anchor{14c6}@anchor{whatsnew/2 6 pep-3119-abstract-base-classes}@anchor{15c4}
@subsection PEP 3119: Abstract Base Classes


Some object-oriented languages such as Java support interfaces,
declaring that a class has a given set of methods or supports a given
access protocol.  Abstract Base Classes (or ABCs) are an equivalent
feature for Python. The ABC support consists of an @ref{4,,abc} module
containing a metaclass called @ref{1121,,ABCMeta}, special handling of
this metaclass by the @ref{2af,,isinstance()} and @ref{9ca,,issubclass()}
builtins, and a collection of basic ABCs that the Python developers
think will be widely useful.  Future versions of Python will probably
add more ABCs.

Let’s say you have a particular class and wish to know whether it supports
dictionary-style access.  The phrase “dictionary-style” is vague, however.
It probably means that accessing items with @code{obj[1]} works.
Does it imply that setting items with @code{obj[2] = value} works?
Or that the object will have @code{keys()}, @code{values()}, and @code{items()}
methods?  What about the iterative variants  such as @code{iterkeys()}?
@code{copy`and :meth:()}!update`?  Iterating over the object with @code{iter()}?

The Python 2.6 @ref{1e,,collections} module includes a number of
different ABCs that represent these distinctions.  @code{Iterable}
indicates that a class defines @ref{e6f,,__iter__()}, and
@code{Container} means the class defines a @ref{15c5,,__contains__()}
method and therefore supports @code{x in y} expressions.  The basic
dictionary interface of getting items, setting items, and
@code{keys()}, @code{values()}, and @code{items()}, is defined by the
@code{MutableMapping} ABC.

You can derive your own classes from a particular ABC
to indicate they support that ABC’s interface:

@example
import collections

class Storage(collections.MutableMapping):
    ...
@end example

Alternatively, you could write the class without deriving from
the desired ABC and instead register the class by
calling the ABC’s @ref{1294,,register()} method:

@example
import collections

class Storage:
    ...

collections.MutableMapping.register(Storage)
@end example

For classes that you write, deriving from the ABC is probably clearer.
The @ref{1294,,register()}  method is useful when you’ve written a new
ABC that can describe an existing type or class, or if you want
to declare that some third-party class implements an ABC.
For example, if you defined a @code{PrintableType} ABC,
it’s legal to do:

@example
# Register Python's types
PrintableType.register(int)
PrintableType.register(float)
PrintableType.register(str)
@end example

Classes should obey the semantics specified by an ABC, but
Python can’t check this; it’s up to the class author to
understand the ABC’s requirements and to implement the code accordingly.

To check whether an object supports a particular interface, you can
now write:

@example
def func(d):
    if not isinstance(d, collections.MutableMapping):
        raise ValueError("Mapping object expected, not %r" % d)
@end example

Don’t feel that you must now begin writing lots of checks as in the
above example.  Python has a strong tradition of duck-typing, where
explicit type-checking is never done and code simply calls methods on
an object, trusting that those methods will be there and raising an
exception if they aren’t.  Be judicious in checking for ABCs and only
do it where it’s absolutely necessary.

You can write your own ABCs by using @code{abc.ABCMeta} as the
metaclass in a class definition:

@example
from abc import ABCMeta, abstractmethod

class Drawable():
    __metaclass__ = ABCMeta

    @@abstractmethod
    def draw(self, x, y, scale=1.0):
        pass

    def draw_doubled(self, x, y):
        self.draw(x, y, scale=2.0)


class Square(Drawable):
    def draw(self, x, y, scale):
        ...
@end example

In the @code{Drawable} ABC above, the @code{draw_doubled()} method
renders the object at twice its size and can be implemented in terms
of other methods described in @code{Drawable}.  Classes implementing
this ABC therefore don’t need to provide their own implementation
of @code{draw_doubled()}, though they can do so.  An implementation
of @code{draw()} is necessary, though; the ABC can’t provide
a useful generic implementation.

You can apply the @ref{1291,,@@~abc.abstractmethod} decorator to methods such as
@code{draw()} that must be implemented; Python will then raise an
exception for classes that don’t define the method.
Note that the exception is only raised when you actually
try to create an instance of a subclass lacking the method:

@example
>>> class Circle(Drawable):
...     pass
...
>>> c = Circle()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Can't instantiate abstract class Circle with abstract methods draw
>>>
@end example

Abstract data attributes can be declared using the
@code{@@abstractproperty} decorator:

@example
from abc import abstractproperty
...

@@abstractproperty
def readonly(self):
   return self._x
@end example

Subclasses must then define a @code{readonly} property.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 3119

@item PEP 3119@footnote{https://peps.python.org/pep-3119/} - Introducing Abstract Base Classes

PEP written by Guido van Rossum and Talin.
Implemented by Guido van Rossum.
Backported to 2.6 by Benjamin Aranguren, with Alex Martelli.
@end table


@c ======================================================================

@node PEP 3127 Integer Literal Support and Syntax,PEP 3129 Class Decorators,PEP 3119 Abstract Base Classes,What’s New in Python 2 6
@anchor{whatsnew/2 6 pep-3127}@anchor{14c7}@anchor{whatsnew/2 6 pep-3127-integer-literal-support-and-syntax}@anchor{15c6}
@subsection PEP 3127: Integer Literal Support and Syntax


Python 3.0 changes the syntax for octal (base-8) integer literals,
prefixing them with “0o” or “0O” instead of a leading zero, and adds
support for binary (base-2) integer literals, signalled by a “0b” or
“0B” prefix.

Python 2.6 doesn’t drop support for a leading 0 signalling
an octal number, but it does add support for “0o” and “0b”:

@example
>>> 0o21, 2*8 + 1
(17, 17)
>>> 0b101111
47
@end example

The @ref{14da,,oct()} builtin still returns numbers
prefixed with a leading zero, and a new @ref{14b4,,bin()}
builtin returns the binary representation for a number:

@example
>>> oct(42)
'052'
>>> future_builtins.oct(42)
'0o52'
>>> bin(173)
'0b10101101'
@end example

The @ref{19c,,int()} and @code{long()} builtins will now accept the “0o”
and “0b” prefixes when base-8 or base-2 are requested, or when the
`base' argument is zero (signalling that the base used should be
determined from the string):

@example
>>> int ('0o52', 0)
42
>>> int('1101', 2)
13
>>> int('0b1101', 2)
13
>>> int('0b1101', 0)
13
@end example


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 3127

@item PEP 3127@footnote{https://peps.python.org/pep-3127/} - Integer Literal Support and Syntax

PEP written by Patrick Maupin; backported to 2.6 by
Eric Smith.
@end table


@c ======================================================================

@node PEP 3129 Class Decorators,PEP 3141 A Type Hierarchy for Numbers,PEP 3127 Integer Literal Support and Syntax,What’s New in Python 2 6
@anchor{whatsnew/2 6 pep-3129}@anchor{14c8}@anchor{whatsnew/2 6 pep-3129-class-decorators}@anchor{15c7}
@subsection PEP 3129: Class Decorators


Decorators have been extended from functions to classes.  It’s now legal to
write:

@example
@@foo
@@bar
class A:
  pass
@end example

This is equivalent to:

@example
class A:
  pass

A = foo(bar(A))
@end example


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 3129

@item PEP 3129@footnote{https://peps.python.org/pep-3129/} - Class Decorators

PEP written by Collin Winter.
@end table


@c ======================================================================

@node PEP 3141 A Type Hierarchy for Numbers,Other Language Changes<15>,PEP 3129 Class Decorators,What’s New in Python 2 6
@anchor{whatsnew/2 6 pep-3141}@anchor{14c9}@anchor{whatsnew/2 6 pep-3141-a-type-hierarchy-for-numbers}@anchor{15c8}
@subsection PEP 3141: A Type Hierarchy for Numbers


Python 3.0 adds several abstract base classes for numeric types
inspired by Scheme’s numeric tower.  These classes were backported to
2.6 as the @ref{a2,,numbers} module.

The most general ABC is @code{Number}.  It defines no operations at
all, and only exists to allow checking if an object is a number by
doing @code{isinstance(obj, Number)}.

@code{Complex} is a subclass of @code{Number}.  Complex numbers
can undergo the basic operations of addition, subtraction,
multiplication, division, and exponentiation, and you can retrieve the
real and imaginary parts and obtain a number’s conjugate.  Python’s built-in
complex type is an implementation of @code{Complex}.

@code{Real} further derives from @code{Complex}, and adds
operations that only work on real numbers: @code{floor()}, @code{trunc()},
rounding, taking the remainder mod N, floor division,
and comparisons.

@code{Rational} numbers derive from @code{Real}, have
@code{numerator} and @code{denominator} properties, and can be
converted to floats.  Python 2.6 adds a simple rational-number class,
@code{Fraction}, in the @ref{61,,fractions} module.  (It’s called
@code{Fraction} instead of @code{Rational} to avoid
a name clash with @ref{14ca,,numbers.Rational}.)

@code{Integral} numbers derive from @code{Rational}, and
can be shifted left and right with @code{<<} and @code{>>},
combined using bitwise operations such as @code{&} and @code{|},
and can be used as array indexes and slice boundaries.

In Python 3.0, the PEP slightly redefines the existing builtins
@ref{14e6,,round()}, @ref{15c9,,math.floor()}, @ref{15ca,,math.ceil()}, and adds a new
one, @ref{15cb,,math.trunc()}, that’s been backported to Python 2.6.
@code{math.trunc()} rounds toward zero, returning the closest
@code{Integral} that’s between the function’s argument and zero.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 3141

@item PEP 3141@footnote{https://peps.python.org/pep-3141/} - A Type Hierarchy for Numbers

PEP written by Jeffrey Yasskin.
@end table

Scheme's numerical tower@footnote{https://www.gnu.org/software/guile/manual/html_node/Numerical-Tower.html#Numerical-Tower}, from the Guile manual.

Scheme's number datatypes@footnote{https://conservatory.scheme.org/schemers/Documents/Standards/R5RS/HTML/r5rs-Z-H-9.html#%_sec_6.2} from the R5RS Scheme specification.


@menu
* The fractions Module:: 

@end menu

@node The fractions Module,,,PEP 3141 A Type Hierarchy for Numbers
@anchor{whatsnew/2 6 the-fractions-module}@anchor{15cc}
@subsubsection The @code{fractions} Module


To fill out the hierarchy of numeric types, the @ref{61,,fractions}
module provides a rational-number class.  Rational numbers store their
values as a numerator and denominator forming a fraction, and can
exactly represent numbers such as @code{2/3} that floating-point numbers
can only approximate.

The @code{Fraction} constructor takes two @code{Integral} values
that will be the numerator and denominator of the resulting fraction.

@example
>>> from fractions import Fraction
>>> a = Fraction(2, 3)
>>> b = Fraction(2, 5)
>>> float(a), float(b)
(0.66666666666666663, 0.40000000000000002)
>>> a+b
Fraction(16, 15)
>>> a/b
Fraction(5, 3)
@end example

For converting floating-point numbers to rationals,
the float type now has an @code{as_integer_ratio()} method that returns
the numerator and denominator for a fraction that evaluates to the same
floating-point value:

@example
>>> (2.5) .as_integer_ratio()
(5, 2)
>>> (3.1415) .as_integer_ratio()
(7074029114692207L, 2251799813685248L)
>>> (1./3) .as_integer_ratio()
(6004799503160661L, 18014398509481984L)
@end example

Note that values that can only be approximated by floating-point
numbers, such as 1./3, are not simplified to the number being
approximated; the fraction attempts to match the floating-point value
`exactly'.

The @ref{61,,fractions} module is based upon an implementation by Sjoerd
Mullender that was in Python’s @code{Demo/classes/} directory for a
long time.  This implementation was significantly updated by Jeffrey
Yasskin.

@node Other Language Changes<15>,New and Improved Modules<2>,PEP 3141 A Type Hierarchy for Numbers,What’s New in Python 2 6
@anchor{whatsnew/2 6 other-language-changes}@anchor{15cd}
@subsection Other Language Changes


Some smaller changes made to the core Python language are:


@itemize *

@item 
Directories and zip archives containing a @code{__main__.py} file
can now be executed directly by passing their name to the
interpreter. The directory or zip archive is automatically inserted
as the first entry in sys.path.  (Suggestion and initial patch by
Andy Chu, subsequently revised by Phillip J. Eby and Nick Coghlan;
bpo-1739468@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1739468}.)

@item 
The @ref{6fa,,hasattr()} function was catching and ignoring all errors,
under the assumption that they meant a @code{__getattr__()} method
was failing somehow and the return value of @code{hasattr()} would
therefore be @code{False}.  This logic shouldn’t be applied to
@ref{bcb,,KeyboardInterrupt} and @ref{f42,,SystemExit}, however; Python 2.6
will no longer discard such exceptions when @code{hasattr()}
encounters them.  (Fixed by Benjamin Peterson; bpo-2196@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2196}.)

@item 
When calling a function using the @code{**} syntax to provide keyword
arguments, you are no longer required to use a Python dictionary;
any mapping will now work:

@example
>>> def f(**kw):
...    print sorted(kw)
...
>>> ud=UserDict.UserDict()
>>> ud['a'] = 1
>>> ud['b'] = 'string'
>>> f(**ud)
['a', 'b']
@end example

(Contributed by Alexander Belopolsky; bpo-1686487@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1686487}.)

It’s also become legal to provide keyword arguments after a @code{*args} argument
to a function call.

@example
>>> def f(*args, **kw):
...     print args, kw
...
>>> f(1,2,3, *(4,5,6), keyword=13)
(1, 2, 3, 4, 5, 6) @{'keyword': 13@}
@end example

Previously this would have been a syntax error.
(Contributed by Amaury Forgeot d’Arc; bpo-3473@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3473}.)

@item 
A new builtin, @code{next(iterator, [default])} returns the next item
from the specified iterator.  If the `default' argument is supplied,
it will be returned if `iterator' has been exhausted; otherwise,
the @ref{dfb,,StopIteration} exception will be raised.  (Backported
in bpo-2719@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2719}.)

@item 
Tuples now have @ref{15ce,,index()} and @ref{15cf,,count()} methods
matching the list type’s @ref{15d0,,index()} and @ref{15d1,,count()} methods:

@example
>>> t = (0,1,2,3,4,0,1,2)
>>> t.index(3)
3
>>> t.count(0)
2
@end example

(Contributed by Raymond Hettinger)

@item 
The built-in types now have improved support for extended slicing syntax,
accepting various combinations of @code{(start, stop, step)}.
Previously, the support was partial and certain corner cases wouldn’t work.
(Implemented by Thomas Wouters.)

@c Revision 57619

@item 
Properties now have three attributes, @code{getter}, @code{setter}
and @code{deleter}, that are decorators providing useful shortcuts
for adding a getter, setter or deleter function to an existing
property. You would use them like this:

@example
class C(object):
    @@property
    def x(self):
        return self._x

    @@x.setter
    def x(self, value):
        self._x = value

    @@x.deleter
    def x(self):
        del self._x

class D(C):
    @@C.x.getter
    def x(self):
        return self._x * 2

    @@x.setter
    def x(self, value):
        self._x = value / 2
@end example

@item 
Several methods of the built-in set types now accept multiple iterables:
@code{intersection()},
@code{intersection_update()},
@code{union()}, @code{update()},
@code{difference()} and @code{difference_update()}.

@example
>>> s=set('1234567890')
>>> s.intersection('abc123', 'cdf246')  # Intersection between all inputs
set(['2'])
>>> s.difference('246', '789')
set(['1', '0', '3', '5'])
@end example

(Contributed by Raymond Hettinger.)

@item 
Many floating-point features were added.  The @ref{197,,float()} function
will now turn the string @code{nan} into an
IEEE 754 Not A Number value, and @code{+inf} and @code{-inf} into
positive or negative infinity.  This works on any platform with
IEEE 754 semantics.  (Contributed by Christian Heimes; bpo-1635@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635}.)

Other functions in the @ref{92,,math} module, @code{isinf()} and
@code{isnan()}, return true if their floating-point argument is
infinite or Not A Number.  (bpo-1640@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1640})

Conversion functions were added to convert floating-point numbers
into hexadecimal strings (bpo-3008@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3008}).  These functions
convert floats to and from a string representation without
introducing rounding errors from the conversion between decimal and
binary.  Floats have a @ref{14db,,hex()} method that returns a string
representation, and the @code{float.fromhex()} method converts a string
back into a number:

@example
>>> a = 3.75
>>> a.hex()
'0x1.e000000000000p+1'
>>> float.fromhex('0x1.e000000000000p+1')
3.75
>>> b=1./3
>>> b.hex()
'0x1.5555555555555p-2'
@end example

@item 
A numerical nicety: when creating a complex number from two floats
on systems that support signed zeros (-0 and +0), the
@ref{198,,complex()} constructor will now preserve the sign
of the zero.  (Fixed by Mark T. Dickinson; bpo-1507@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1507}.)

@item 
Classes that inherit a @code{__hash__()} method from a parent class
can set @code{__hash__ = None} to indicate that the class isn’t
hashable.  This will make @code{hash(obj)} raise a @ref{199,,TypeError}
and the class will not be indicated as implementing the
@code{Hashable} ABC.

You should do this when you’ve defined a @code{__cmp__()} or
@code{__eq__()} method that compares objects by their value rather
than by identity.  All objects have a default hash method that uses
@code{id(obj)} as the hash value.  There’s no tidy way to remove the
@code{__hash__()} method inherited from a parent class, so
assigning @code{None} was implemented as an override.  At the
C level, extensions can set @code{tp_hash} to
@ref{15d2,,PyObject_HashNotImplemented()}.
(Fixed by Nick Coghlan and Amaury Forgeot d’Arc; bpo-2235@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2235}.)

@item 
The @ref{15d3,,GeneratorExit} exception now subclasses
@ref{7d8,,BaseException} instead of @ref{bd3,,Exception}.  This means
that an exception handler that does @code{except Exception:}
will not inadvertently catch @code{GeneratorExit}.
(Contributed by Chad Austin; bpo-1537@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1537}.)

@item 
Generator objects now have a @code{gi_code} attribute that refers to
the original code object backing the generator.
(Contributed by Collin Winter; bpo-1473257@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1473257}.)

@item 
The @ref{4b2,,compile()} built-in function now accepts keyword arguments
as well as positional parameters.  (Contributed by Thomas Wouters;
bpo-1444529@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1444529}.)

@item 
The @ref{198,,complex()} constructor now accepts strings containing
parenthesized complex numbers, meaning that @code{complex(repr(cplx))}
will now round-trip values.  For example, @code{complex('(3+4j)')}
now returns the value (3+4j).  (bpo-1491866@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1491866})

@item 
The string @code{translate()} method now accepts @code{None} as the
translation table parameter, which is treated as the identity
transformation.   This makes it easier to carry out operations
that only delete characters.  (Contributed by Bengt Richter and
implemented by Raymond Hettinger; bpo-1193128@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1193128}.)

@item 
The built-in @ref{845,,dir()} function now checks for a @code{__dir__()}
method on the objects it receives.  This method must return a list
of strings containing the names of valid attributes for the object,
and lets the object control the value that @code{dir()} produces.
Objects that have @code{__getattr__()} or @code{__getattribute__()}
methods can use this to advertise pseudo-attributes they will honor.
(bpo-1591665@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1591665})

@item 
Instance method objects have new attributes for the object and function
comprising the method; the new synonym for @code{im_self} is
@ref{15d4,,__self__}, and @code{im_func} is also available as
@ref{1508,,__func__}.
The old names are still supported in Python 2.6, but are gone in 3.0.

@item 
An obscure change: when you use the @ref{46f,,locals()} function inside a
@ref{14e3,,class} statement, the resulting dictionary no longer returns free
variables.  (Free variables, in this case, are variables referenced in the
@code{class} statement  that aren’t attributes of the class.)
@end itemize

@c ======================================================================

@menu
* Optimizations: Optimizations<15>. 
* Interpreter Changes: Interpreter Changes<2>. 

@end menu

@node Optimizations<15>,Interpreter Changes<2>,,Other Language Changes<15>
@anchor{whatsnew/2 6 optimizations}@anchor{15d5}
@subsubsection Optimizations



@itemize *

@item 
The @ref{119,,warnings} module has been rewritten in C.  This makes
it possible to invoke warnings from the parser, and may also
make the interpreter’s startup faster.
(Contributed by Neal Norwitz and Brett Cannon; bpo-1631171@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1631171}.)

@item 
Type objects now have a cache of methods that can reduce
the work required to find the correct method implementation
for a particular class; once cached, the interpreter doesn’t need to
traverse base classes to figure out the right method to call.
The cache is cleared if a base class or the class itself is modified,
so the cache should remain correct even in the face of Python’s dynamic
nature.
(Original optimization implemented by Armin Rigo, updated for
Python 2.6 by Kevin Jacobs; bpo-1700288@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1700288}.)

By default, this change is only applied to types that are included with
the Python core.  Extension modules may not necessarily be compatible with
this cache,
so they must explicitly add @ref{15d6,,Py_TPFLAGS_HAVE_VERSION_TAG}
to the module’s @code{tp_flags} field to enable the method cache.
(To be compatible with the method cache, the extension module’s code
must not directly access and modify the @code{tp_dict} member of
any of the types it implements.  Most modules don’t do this,
but it’s impossible for the Python interpreter to determine that.
See bpo-1878@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1878} for some discussion.)

@item 
Function calls that use keyword arguments are significantly faster
by doing a quick pointer comparison, usually saving the time of a
full string comparison.  (Contributed by Raymond Hettinger, after an
initial implementation by Antoine Pitrou; bpo-1819@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1819}.)

@item 
All of the functions in the @ref{db,,struct} module have been rewritten in
C, thanks to work at the Need For Speed sprint.
(Contributed by Raymond Hettinger.)

@item 
Some of the standard built-in types now set a bit in their type
objects.  This speeds up checking whether an object is a subclass of
one of these types.  (Contributed by Neal Norwitz.)

@item 
Unicode strings now use faster code for detecting
whitespace and line breaks; this speeds up the @code{split()} method
by about 25% and @code{splitlines()} by 35%.
(Contributed by Antoine Pitrou.)  Memory usage is reduced
by using pymalloc for the Unicode string’s data.

@item 
The @code{with} statement now stores the @ref{150c,,__exit__()} method on the stack,
producing a small speedup.  (Implemented by Jeffrey Yasskin.)

@item 
To reduce memory usage, the garbage collector will now clear internal
free lists when garbage-collecting the highest generation of objects.
This may return memory to the operating system sooner.
@end itemize

@c ======================================================================

@node Interpreter Changes<2>,,Optimizations<15>,Other Language Changes<15>
@anchor{whatsnew/2 6 interpreter-changes}@anchor{15d7}@anchor{whatsnew/2 6 new-26-interpreter}@anchor{15d8}
@subsubsection Interpreter Changes


Two command-line options have been reserved for use by other Python
implementations.  The @code{-J} switch has been reserved for use by
Jython for Jython-specific options, such as switches that are passed to
the underlying JVM.  @ref{170,,-X} has been reserved for options
specific to a particular implementation of Python such as CPython,
Jython, or IronPython.  If either option is used with Python 2.6, the
interpreter will report that the option isn’t currently used.

Python can now be prevented from writing @code{.pyc} or @code{.pyo}
files by supplying the @ref{15d9,,-B} switch to the Python interpreter,
or by setting the 
@geindex PYTHONDONTWRITEBYTECODE
@geindex environment variable; PYTHONDONTWRITEBYTECODE
@ref{15da,,PYTHONDONTWRITEBYTECODE} environment
variable before running the interpreter.  This setting is available to
Python programs as the @code{sys.dont_write_bytecode} variable, and
Python code can change the value to modify the interpreter’s
behaviour.  (Contributed by Neal Norwitz and Georg Brandl.)

The encoding used for standard input, output, and standard error can
be specified by setting the 
@geindex PYTHONIOENCODING
@geindex environment variable; PYTHONIOENCODING
@ref{1210,,PYTHONIOENCODING} environment
variable before running the interpreter.  The value should be a string
in the form @code{<encoding>} or @code{<encoding>:<errorhandler>}.
The `encoding' part specifies the encoding’s name, e.g. @code{utf-8} or
@code{latin-1}; the optional `errorhandler' part specifies
what to do with characters that can’t be handled by the encoding,
and  should be one of “error”, “ignore”, or “replace”.   (Contributed
by Martin von Löwis.)

@c ======================================================================

@node New and Improved Modules<2>,Deprecations and Removals,Other Language Changes<15>,What’s New in Python 2 6
@anchor{whatsnew/2 6 new-and-improved-modules}@anchor{15db}
@subsection New and Improved Modules


As in every release, Python’s standard library received a number of
enhancements and bug fixes.  Here’s a partial list of the most notable
changes, sorted alphabetically by module name. Consult the
@code{Misc/NEWS} file in the source tree for a more complete list of
changes, or look through the Subversion logs for all the details.


@itemize *

@item 
The @code{asyncore} and @code{asynchat} modules are
being actively maintained again, and a number of patches and bugfixes
were applied.  (Maintained by Josiah Carlson; see bpo-1736190@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1736190} for
one patch.)

@item 
The @code{bsddb} module also has a new maintainer, Jesús Cea Avión, and the package
is now available as a standalone package.  The web page for the package is
www.jcea.es/programacion/pybsddb.htm@footnote{https://www.jcea.es/programacion/pybsddb.htm}.
The plan is to remove the package from the standard library
in Python 3.0, because its pace of releases is much more frequent than
Python’s.

The @code{bsddb.dbshelve} module now uses the highest pickling protocol
available, instead of restricting itself to protocol 1.
(Contributed by W. Barnes.)

@item 
The @code{cgi} module will now read variables from the query string
of an HTTP POST request.  This makes it possible to use form actions
with URLs that include query strings such as
“/cgi-bin/add.py?category=1”.  (Contributed by Alexandre Fiori and
Nubis; bpo-1817@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1817}.)

The @code{parse_qs()} and @code{parse_qsl()} functions have been
relocated from the @code{cgi} module to the @ref{111,,urlparse} module.
The versions still available in the @code{cgi} module will
trigger @ref{acc,,PendingDeprecationWarning} messages in 2.6
(bpo-600362@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=600362}).

@item 
The @ref{19,,cmath} module underwent extensive revision,
contributed by Mark Dickinson and Christian Heimes.
Five new functions were added:


@itemize *

@item 
@code{polar()} converts a complex number to polar form, returning
the modulus and argument of the complex number.

@item 
@code{rect()} does the opposite, turning a modulus, argument pair
back into the corresponding complex number.

@item 
@code{phase()} returns the argument (also called the angle) of a complex
number.

@item 
@code{isnan()} returns True if either
the real or imaginary part of its argument is a NaN.

@item 
@code{isinf()} returns True if either the real or imaginary part of
its argument is infinite.
@end itemize

The revisions also improved the numerical soundness of the
@ref{19,,cmath} module.  For all functions, the real and imaginary
parts of the results are accurate to within a few units of least
precision (ulps) whenever possible.  See bpo-1381@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1381} for the
details.  The branch cuts for @code{asinh()}, @code{atanh()}: and
@code{atan()} have also been corrected.

The tests for the module have been greatly expanded; nearly 2000 new
test cases exercise the algebraic functions.

On IEEE 754 platforms, the @ref{19,,cmath} module now handles IEEE 754
special values and floating-point exceptions in a manner consistent
with Annex ‘G’ of the C99 standard.

@item 
A new data type in the @ref{1e,,collections} module: @code{namedtuple(typename, fieldnames)}
is a factory function that creates subclasses of the standard tuple
whose fields are accessible by name as well as index.  For example:

@example
>>> var_type = collections.namedtuple('variable',
...             'id name type size')
>>> # Names are separated by spaces or commas.
>>> # 'id, name, type, size' would also work.
>>> var_type._fields
('id', 'name', 'type', 'size')

>>> var = var_type(1, 'frequency', 'int', 4)
>>> print var[0], var.id    # Equivalent
1 1
>>> print var[2], var.type  # Equivalent
int int
>>> var._asdict()
@{'size': 4, 'type': 'int', 'id': 1, 'name': 'frequency'@}
>>> v2 = var._replace(name='amplitude')
>>> v2
variable(id=1, name='amplitude', type='int', size=4)
@end example

Several places in the standard library that returned tuples have
been modified to return @code{namedtuple()} instances.  For example,
the @code{Decimal.as_tuple()} method now returns a named tuple with
@code{sign}, @code{digits}, and @code{exponent} fields.

(Contributed by Raymond Hettinger.)

@item 
Another change to the @ref{1e,,collections} module is that the
@code{deque} type now supports an optional `maxlen' parameter;
if supplied, the deque’s size will be restricted to no more
than `maxlen' items.  Adding more items to a full deque causes
old items to be discarded.

@example
>>> from collections import deque
>>> dq=deque(maxlen=3)
>>> dq
deque([], maxlen=3)
>>> dq.append(1); dq.append(2); dq.append(3)
>>> dq
deque([1, 2, 3], maxlen=3)
>>> dq.append(4)
>>> dq
deque([2, 3, 4], maxlen=3)
@end example

(Contributed by Raymond Hettinger.)

@item 
The @ref{75,,Cookie} module’s @ref{e04,,Morsel} objects now support an
@ref{15dc,,httponly} attribute.  In some browsers. cookies with this attribute
set cannot be accessed or manipulated by JavaScript code.
(Contributed by Arvin Schnell; bpo-1638033@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1638033}.)

@item 
A new window method in the @ref{2f,,curses} module,
@code{chgat()}, changes the display attributes for a certain number of
characters on a single line.  (Contributed by Fabian Kreutz.)

@example
# Boldface text starting at y=0,x=21
# and affecting the rest of the line.
stdscr.chgat(0, 21, curses.A_BOLD)
@end example

The @code{Textbox} class in the @ref{32,,curses.textpad} module
now supports editing in insert mode as well as overwrite mode.
Insert mode is enabled by supplying a true value for the `insert_mode'
parameter when creating the @code{Textbox} instance.

@item 
The @ref{34,,datetime} module’s @code{strftime()} methods now support a
@code{%f} format code that expands to the number of microseconds in the
object, zero-padded on
the left to six places.  (Contributed by Skip Montanaro; bpo-1158@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1158}.)

@item 
The @ref{3a,,decimal} module was updated to version 1.66 of
the General Decimal Specification@footnote{https://speleotrove.com/decimal/decarith.html}.  New features
include some methods for some basic mathematical functions such as
@code{exp()} and @code{log10()}:

@example
>>> Decimal(1).exp()
Decimal("2.718281828459045235360287471")
>>> Decimal("2.7182818").ln()
Decimal("0.9999999895305022877376682436")
>>> Decimal(1000).log10()
Decimal("3")
@end example

The @code{as_tuple()} method of @code{Decimal} objects now returns a
named tuple with @code{sign}, @code{digits}, and @code{exponent} fields.

(Implemented by Facundo Batista and Mark Dickinson.  Named tuple
support added by Raymond Hettinger.)

@item 
The @ref{3b,,difflib} module’s @code{SequenceMatcher} class
now returns named tuples representing matches,
with @code{a}, @code{b}, and @code{size} attributes.
(Contributed by Raymond Hettinger.)

@item 
An optional @code{timeout} parameter, specifying a timeout measured in
seconds, was added to the @ref{afc,,ftplib.FTP} class constructor as
well as the @code{connect()} method.  (Added by Facundo Batista.)
Also, the @code{FTP} class’s @code{storbinary()} and
@code{storlines()} now take an optional `callback' parameter that
will be called with each block of data after the data has been sent.
(Contributed by Phil Schwartz; bpo-1221598@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1221598}.)

@item 
The @code{reduce()} built-in function is also available in the
@ref{63,,functools} module.  In Python 3.0, the builtin has been
dropped and @code{reduce()} is only available from @code{functools};
currently there are no plans to drop the builtin in the 2.x series.
(Patched by Christian Heimes; bpo-1739906@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1739906}.)

@item 
When possible, the @ref{66,,getpass} module will now use
@code{/dev/tty} to print a prompt message and read the password,
falling back to standard error and standard input.  If the
password may be echoed to the terminal, a warning is printed before
the prompt is displayed.  (Contributed by Gregory P. Smith.)

@item 
The @ref{5a0,,glob.glob()} function can now return Unicode filenames if
a Unicode path was used and Unicode filenames are matched within the
directory.  (bpo-1001604@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1001604})

@item 
A new function in the @ref{6d,,heapq} module, @code{merge(iter1, iter2, ...)},
takes any number of iterables returning data in sorted
order, and returns a new generator that returns the contents of all
the iterators, also in sorted order.  For example:

@example
>>> list(heapq.merge([1, 3, 5, 9], [2, 8, 16]))
[1, 2, 3, 5, 8, 9, 16]
@end example

Another new function, @code{heappushpop(heap, item)},
pushes `item' onto `heap', then pops off and returns the smallest item.
This is more efficient than making a call to @code{heappush()} and then
@code{heappop()}.

@ref{6d,,heapq} is now implemented to only use less-than comparison,
instead of the less-than-or-equal comparison it previously used.
This makes @code{heapq}’s usage of a type match the
@ref{dce,,list.sort()} method.
(Contributed by Raymond Hettinger.)

@item 
An optional @code{timeout} parameter, specifying a timeout measured in
seconds, was added to the @ref{d3b,,httplib.HTTPConnection} and
@ref{d3c,,HTTPSConnection} class constructors.  (Added by Facundo
Batista.)

@item 
Most of the @ref{82,,inspect} module’s functions, such as
@code{getmoduleinfo()} and @code{getargs()}, now return named tuples.
In addition to behaving like tuples, the elements of the  return value
can also be accessed as attributes.
(Contributed by Raymond Hettinger.)

Some new functions in the module include
@code{isgenerator()}, @code{isgeneratorfunction()},
and @code{isabstract()}.

@item 
The @ref{85,,itertools} module gained several new functions.

@code{izip_longest(iter1, iter2, ...[, fillvalue])} makes tuples from
each of the elements; if some of the iterables are shorter than
others, the missing values are set to `fillvalue'.  For example:

@example
>>> tuple(itertools.izip_longest([1,2,3], [1,2,3,4,5]))
((1, 1), (2, 2), (3, 3), (None, 4), (None, 5))
@end example

@code{product(iter1, iter2, ..., [repeat=N])} returns the Cartesian product
of the supplied iterables, a set of tuples containing
every possible combination of the elements returned from each iterable.

@example
>>> list(itertools.product([1,2,3], [4,5,6]))
[(1, 4), (1, 5), (1, 6),
 (2, 4), (2, 5), (2, 6),
 (3, 4), (3, 5), (3, 6)]
@end example

The optional `repeat' keyword argument is used for taking the
product of an iterable or a set of iterables with themselves,
repeated `N' times.  With a single iterable argument, `N'-tuples
are returned:

@example
>>> list(itertools.product([1,2], repeat=3))
[(1, 1, 1), (1, 1, 2), (1, 2, 1), (1, 2, 2),
 (2, 1, 1), (2, 1, 2), (2, 2, 1), (2, 2, 2)]
@end example

With two iterables, `2N'-tuples are returned.

@example
>>> list(itertools.product([1,2], [3,4], repeat=2))
[(1, 3, 1, 3), (1, 3, 1, 4), (1, 3, 2, 3), (1, 3, 2, 4),
 (1, 4, 1, 3), (1, 4, 1, 4), (1, 4, 2, 3), (1, 4, 2, 4),
 (2, 3, 1, 3), (2, 3, 1, 4), (2, 3, 2, 3), (2, 3, 2, 4),
 (2, 4, 1, 3), (2, 4, 1, 4), (2, 4, 2, 3), (2, 4, 2, 4)]
@end example

@code{combinations(iterable, r)} returns sub-sequences of length `r' from
the elements of `iterable'.

@example
>>> list(itertools.combinations('123', 2))
[('1', '2'), ('1', '3'), ('2', '3')]
>>> list(itertools.combinations('123', 3))
[('1', '2', '3')]
>>> list(itertools.combinations('1234', 3))
[('1', '2', '3'), ('1', '2', '4'),
 ('1', '3', '4'), ('2', '3', '4')]
@end example

@code{permutations(iter[, r])} returns all the permutations of length `r' of
the iterable’s elements.  If `r' is not specified, it will default to the
number of elements produced by the iterable.

@example
>>> list(itertools.permutations([1,2,3,4], 2))
[(1, 2), (1, 3), (1, 4),
 (2, 1), (2, 3), (2, 4),
 (3, 1), (3, 2), (3, 4),
 (4, 1), (4, 2), (4, 3)]
@end example

@code{itertools.chain(*iterables)} is an existing function in
@ref{85,,itertools} that gained a new constructor in Python 2.6.
@code{itertools.chain.from_iterable(iterable)} takes a single
iterable that should return other iterables.  @code{chain()} will
then return all the elements of the first iterable, then
all the elements of the second, and so on.

@example
>>> list(itertools.chain.from_iterable([[1,2,3], [4,5,6]]))
[1, 2, 3, 4, 5, 6]
@end example

(All contributed by Raymond Hettinger.)

@item 
The @ref{8b,,logging} module’s @code{FileHandler} class
and its subclasses @code{WatchedFileHandler}, @code{RotatingFileHandler},
and @code{TimedRotatingFileHandler} now
have an optional `delay' parameter to their constructors.  If `delay'
is true, opening of the log file is deferred until the first
@code{emit()} call is made.  (Contributed by Vinay Sajip.)

@code{TimedRotatingFileHandler} also has a `utc' constructor
parameter.  If the argument is true, UTC time will be used
in determining when midnight occurs and in generating filenames;
otherwise local time will be used.

@item 
Several new functions were added to the @ref{92,,math} module:


@itemize *

@item 
@ref{15dd,,isinf()} and @ref{15de,,isnan()} determine whether a given float
is a (positive or negative) infinity or a NaN (Not a Number), respectively.

@item 
@ref{15df,,copysign()} copies the sign bit of an IEEE 754 number,
returning the absolute value of `x' combined with the sign bit of
`y'.  For example, @code{math.copysign(1, -0.0)} returns -1.0.
(Contributed by Christian Heimes.)

@item 
@ref{b47,,factorial()} computes the factorial of a number.
(Contributed by Raymond Hettinger; bpo-2138@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2138}.)

@item 
@ref{15e0,,fsum()} adds up the stream of numbers from an iterable,
and is careful to avoid loss of precision through using partial sums.
(Contributed by Jean Brouwers, Raymond Hettinger, and Mark Dickinson;
bpo-2819@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2819}.)

@item 
@ref{15e1,,acosh()}, @ref{15e2,,asinh()}
and @ref{15e3,,atanh()} compute the inverse hyperbolic functions.

@item 
@ref{15e4,,log1p()} returns the natural logarithm of `1+x'
(base `e').

@item 
@code{trunc()} rounds a number toward zero, returning the closest
@code{Integral} that’s between the function’s argument and zero.
Added as part of the backport of
@ref{14c9,,PEP 3141's type hierarchy for numbers}.
@end itemize

@item 
The @ref{92,,math} module has been improved to give more consistent
behaviour across platforms, especially with respect to handling of
floating-point exceptions and IEEE 754 special values.

Whenever possible, the module follows the recommendations of the C99
standard about 754’s special values.  For example, @code{sqrt(-1.)}
should now give a @ref{2ee,,ValueError} across almost all platforms,
while @code{sqrt(float('NaN'))} should return a NaN on all IEEE 754
platforms.  Where Annex ‘F’ of the C99 standard recommends signaling
‘divide-by-zero’ or ‘invalid’, Python will raise @code{ValueError}.
Where Annex ‘F’ of the C99 standard recommends signaling ‘overflow’,
Python will raise @ref{a87,,OverflowError}.  (See bpo-711019@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=711019} and
bpo-1640@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1640}.)

(Contributed by Christian Heimes and Mark Dickinson.)

@item 
@ref{51a,,mmap} objects now have a @code{rfind()} method that searches for a
substring beginning at the end of the string and searching
backwards.  The @code{find()} method also gained an `end' parameter
giving an index at which to stop searching.
(Contributed by John Lenton.)

@item 
The @ref{a3,,operator} module gained a
@code{methodcaller()} function that takes a name and an optional
set of arguments, returning a callable that will call
the named function on any arguments passed to it.  For example:

@example
>>> # Equivalent to lambda s: s.replace('old', 'new')
>>> replacer = operator.methodcaller('replace', 'old', 'new')
>>> replacer('old wine in old bottles')
'new wine in new bottles'
@end example

(Contributed by Georg Brandl, after a suggestion by Gregory Petrosyan.)

The @code{attrgetter()} function now accepts dotted names and performs
the corresponding attribute lookups:

@example
>>> inst_name = operator.attrgetter(
...        '__class__.__name__')
>>> inst_name('@w{'})
'str'
>>> inst_name(help)
'_Helper'
@end example

(Contributed by Georg Brandl, after a suggestion by Barry Warsaw.)

@item 
The @ref{a5,,os} module now wraps several new system calls.
@code{fchmod(fd, mode)} and @code{fchown(fd, uid, gid)} change the mode
and ownership of an opened file, and @code{lchmod(path, mode)} changes
the mode of a symlink.  (Contributed by Georg Brandl and Christian
Heimes.)

@code{chflags()} and @code{lchflags()} are wrappers for the
corresponding system calls (where they’re available), changing the
flags set on a file.  Constants for the flag values are defined in
the @ref{d6,,stat} module; some possible values include
@code{UF_IMMUTABLE} to signal the file may not be changed and
@code{UF_APPEND} to indicate that data can only be appended to the
file.  (Contributed by M. Levinson.)

@code{os.closerange(low, high)} efficiently closes all file descriptors
from `low' to `high', ignoring any errors and not including `high' itself.
This function is now used by the @ref{dc,,subprocess} module to make starting
processes faster.  (Contributed by Georg Brandl; bpo-1663329@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1663329}.)

@item 
The @code{os.environ} object’s @code{clear()} method will now unset the
environment variables using @ref{25e,,os.unsetenv()} in addition to clearing
the object’s keys.  (Contributed by Martin Horcicka; bpo-1181@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1181}.)

@item 
The @ref{6d1,,os.walk()} function now has a @code{followlinks} parameter. If
set to True, it will follow symlinks pointing to directories and
visit the directory’s contents.  For backward compatibility, the
parameter’s default value is false.  Note that the function can fall
into an infinite recursion if there’s a symlink that points to a
parent directory.  (bpo-1273829@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1273829})

@item 
In the @ref{a6,,os.path} module, the @code{splitext()} function
has been changed to not split on leading period characters.
This produces better results when operating on Unix’s dot-files.
For example, @code{os.path.splitext('.ipython')}
now returns @code{('.ipython', '@w{'})} instead of @code{('@w{'}, '.ipython')}.
(bpo-1115886@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1115886})

A new function, @code{os.path.relpath(path, start='.')}, returns a relative path
from the @code{start} path, if it’s supplied, or from the current
working directory to the destination @code{path}.  (Contributed by
Richard Barran; bpo-1339796@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1339796}.)

On Windows, @ref{15e5,,os.path.expandvars()} will now expand environment variables
given in the form “%var%”, and “~user” will be expanded into the
user’s home directory path.  (Contributed by Josiah Carlson;
bpo-957650@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=957650}.)

@item 
The Python debugger provided by the @ref{aa,,pdb} module
gained a new command: “run” restarts the Python program being debugged
and can optionally take new command-line arguments for the program.
(Contributed by Rocky Bernstein; bpo-1393667@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1393667}.)

@item 
The @ref{15e6,,pdb.post_mortem()} function, used to begin debugging a
traceback, will now use the traceback returned by @ref{89c,,sys.exc_info()}
if no traceback is supplied.   (Contributed by Facundo Batista;
bpo-1106316@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1106316}.)

@item 
The @ref{ac,,pickletools} module now has an @code{optimize()} function
that takes a string containing a pickle and removes some unused
opcodes, returning a shorter pickle that contains the same data structure.
(Contributed by Raymond Hettinger.)

@item 
A @code{get_data()} function was added to the @ref{ae,,pkgutil}
module that returns the contents of resource files included
with an installed Python package.  For example:

@example
>>> import pkgutil
>>> print pkgutil.get_data('test', 'exception_hierarchy.txt')
BaseException
 +-- SystemExit
 +-- KeyboardInterrupt
 +-- GeneratorExit
 +-- Exception
      +-- StopIteration
      +-- StandardError
 ...
@end example

(Contributed by Paul Moore; bpo-2439@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2439}.)

@item 
The @code{pyexpat} module’s @code{Parser} objects now allow setting
their @code{buffer_size} attribute to change the size of the buffer
used to hold character data.
(Contributed by Achim Gaedke; bpo-1137@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1137}.)

@item 
The @code{Queue} module now provides queue variants that retrieve entries
in different orders.  The @code{PriorityQueue} class stores
queued items in a heap and retrieves them in priority order,
and @code{LifoQueue} retrieves the most recently added entries first,
meaning that it behaves like a stack.
(Contributed by Raymond Hettinger.)

@item 
The @ref{bd,,random} module’s @code{Random} objects can
now be pickled on a 32-bit system and unpickled on a 64-bit
system, and vice versa.  Unfortunately, this change also means
that Python 2.6’s @code{Random} objects can’t be unpickled correctly
on earlier versions of Python.
(Contributed by Shawn Ligocki; bpo-1727780@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1727780}.)

The new @code{triangular(low, high, mode)} function returns random
numbers following a triangular distribution.   The returned values
are between `low' and `high', not including `high' itself, and
with `mode' as the most frequently occurring value
in the distribution.  (Contributed by Wladmir van der Laan and
Raymond Hettinger; bpo-1681432@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1681432}.)

@item 
Long regular expression searches carried out by the  @ref{be,,re}
module will check for signals being delivered, so
time-consuming searches can now be interrupted.
(Contributed by Josh Hoyt and Ralf Schmitt; bpo-846388@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=846388}.)

The regular expression module is implemented by compiling bytecodes
for a tiny regex-specific virtual machine.  Untrusted code
could create malicious strings of bytecode directly and cause crashes,
so Python 2.6 includes a verifier for the regex bytecode.
(Contributed by Guido van Rossum from work for Google App Engine;
bpo-3487@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3487}.)

@item 
The @ref{c2,,rlcompleter} module’s @code{Completer.complete()} method
will now ignore exceptions triggered while evaluating a name.
(Fixed by Lorenz Quack; bpo-2250@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2250}.)

@item 
The @ref{c4,,sched} module’s @code{scheduler} instances now
have a read-only @ref{bb,,queue} attribute that returns the
contents of the scheduler’s queue, represented as a list of
named tuples with the fields @code{(time, priority, action, argument)}.
(Contributed by Raymond Hettinger; bpo-1861@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1861}.)

@item 
The @ref{c6,,select} module now has wrapper functions
for the Linux @code{epoll()} and BSD @code{kqueue()} system calls.
@code{modify()} method was added to the existing @code{poll}
objects; @code{pollobj.modify(fd, eventmask)} takes a file descriptor
or file object and an event mask, modifying the recorded event mask
for that file.
(Contributed by Christian Heimes; bpo-1657@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1657}.)

@item 
The @ref{c24,,shutil.copytree()} function now has an optional `ignore' argument
that takes a callable object.  This callable will receive each directory path
and a list of the directory’s contents, and returns a list of names that
will be ignored, not copied.

The @ref{ca,,shutil} module also provides an @code{ignore_patterns()}
function for use with this new parameter.  @code{ignore_patterns()}
takes an arbitrary number of glob-style patterns and returns a
callable that will ignore any files and directories that match any
of these patterns.  The following example copies a directory tree,
but skips both @code{.svn} directories and Emacs backup files,
which have names ending with ‘~’:

@example
shutil.copytree('Doc/library', '/tmp/library',
                ignore=shutil.ignore_patterns('*~', '.svn'))
@end example

(Contributed by Tarek Ziadé; bpo-2663@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2663}.)

@item 
Integrating signal handling with GUI handling event loops
like those used by Tkinter or GTk+ has long been a problem; most
software ends up polling, waking up every fraction of a second to check
if any GUI events have occurred.
The @ref{cb,,signal} module can now make this more efficient.
Calling @code{signal.set_wakeup_fd(fd)} sets a file descriptor
to be used; when a signal is received, a byte is written to that
file descriptor.  There’s also a C-level function,
@ref{15e7,,PySignal_SetWakeupFd()}, for setting the descriptor.

Event loops will use this by opening a pipe to create two descriptors,
one for reading and one for writing.  The writable descriptor
will be passed to @code{set_wakeup_fd()}, and the readable descriptor
will be added to the list of descriptors monitored by the event loop via
@code{select()} or @code{poll()}.
On receiving a signal, a byte will be written and the main event loop
will be woken up, avoiding the need to poll.

(Contributed by Adam Olsen; bpo-1583@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1583}.)

The @code{siginterrupt()} function is now available from Python code,
and allows changing whether signals can interrupt system calls or not.
(Contributed by Ralf Schmitt.)

The @code{setitimer()} and @code{getitimer()} functions have also been
added (where they’re available).  @code{setitimer()}
allows setting interval timers that will cause a signal to be
delivered to the process after a specified time, measured in
wall-clock time, consumed process time, or combined process+system
time.  (Contributed by Guilherme Polo; bpo-2240@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2240}.)

@item 
The @ref{cf,,smtplib} module now supports SMTP over SSL thanks to the
addition of the @code{SMTP_SSL} class. This class supports an
interface identical to the existing @code{SMTP} class.
(Contributed by Monty Taylor.)  Both class constructors also have an
optional @code{timeout} parameter that specifies a timeout for the
initial connection attempt, measured in seconds.  (Contributed by
Facundo Batista.)

An implementation of the LMTP protocol (
@geindex RFC; RFC 2033
RFC 2033@footnote{https://datatracker.ietf.org/doc/html/rfc2033.html}) was also added
to the module.  LMTP is used in place of SMTP when transferring
e-mail between agents that don’t manage a mail queue.  (LMTP
implemented by Leif Hedstrom; bpo-957003@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=957003}.)

@code{SMTP.starttls()} now complies with 
@geindex RFC; RFC 3207
RFC 3207@footnote{https://datatracker.ietf.org/doc/html/rfc3207.html} and forgets any
knowledge obtained from the server not obtained from the TLS
negotiation itself.  (Patch contributed by Bill Fenner;
bpo-829951@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=829951}.)

@item 
The @ref{d1,,socket} module now supports TIPC (@indicateurl{https://tipc.sourceforge.net/}),
a high-performance non-IP-based protocol designed for use in clustered
environments.  TIPC addresses are 4- or 5-tuples.
(Contributed by Alberto Bertogli; bpo-1646@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1646}.)

A new function, @code{create_connection()}, takes an address and
connects to it using an optional timeout value, returning the
connected socket object.  This function also looks up the address’s
type and connects to it using IPv4 or IPv6 as appropriate.  Changing
your code to use @code{create_connection()} instead of
@code{socket(socket.AF_INET, ...)} may be all that’s required to make
your code work with IPv6.

@item 
The base classes in the @ref{d2,,SocketServer} module now support
calling a @ref{152d,,handle_timeout()} method after a span of inactivity
specified by the server’s @ref{152c,,timeout} attribute.  (Contributed
by Michael Pomraning.)  The @ref{134b,,serve_forever()} method
now takes an optional poll interval measured in seconds,
controlling how often the server will check for a shutdown request.
(Contributed by Pedro Werneck and Jeffrey Yasskin;
bpo-742598@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=742598}, bpo-1193577@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1193577}.)

@item 
The @ref{d4,,sqlite3} module, maintained by Gerhard Häring,
has been updated from version 2.3.2 in Python 2.5 to
version 2.4.1.

@item 
The @ref{db,,struct} module now supports the C99 _Bool type,
using the format character @code{'?'}.
(Contributed by David Remahl.)

@item 
The @ref{4b8,,Popen} objects provided by the @ref{dc,,subprocess} module
now have @ref{15e8,,terminate()}, @ref{15e9,,kill()}, and @ref{15ea,,send_signal()} methods.
On Windows, @code{send_signal()} only supports the @ref{15eb,,SIGTERM}
signal, and all these methods are aliases for the Win32 API function
@code{TerminateProcess()}.
(Contributed by Christian Heimes.)

@item 
A new variable in the @ref{df,,sys} module, @code{float_info}, is an
object containing information derived from the @code{float.h} file
about the platform’s floating-point support.  Attributes of this
object include @code{mant_dig} (number of digits in the mantissa),
@code{epsilon} (smallest difference between 1.0 and the next
largest value representable), and several others.  (Contributed by
Christian Heimes; bpo-1534@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1534}.)

Another new variable, @code{dont_write_bytecode}, controls whether Python
writes any @code{.pyc} or @code{.pyo} files on importing a module.
If this variable is true, the compiled files are not written.  The
variable is initially set on start-up by supplying the @ref{15d9,,-B}
switch to the Python interpreter, or by setting the
@geindex PYTHONDONTWRITEBYTECODE
@geindex environment variable; PYTHONDONTWRITEBYTECODE
@ref{15da,,PYTHONDONTWRITEBYTECODE} environment variable before
running the interpreter.  Python code can subsequently
change the value of this variable to control whether bytecode files
are written or not.
(Contributed by Neal Norwitz and Georg Brandl.)

Information about the command-line arguments supplied to the Python
interpreter is available by reading attributes of a named
tuple available as @code{sys.flags}.  For example, the @code{verbose}
attribute is true if Python
was executed in verbose mode, @code{debug} is true in debugging mode, etc.
These attributes are all read-only.
(Contributed by Christian Heimes.)

A new function, @code{getsizeof()}, takes a Python object and returns
the amount of memory used by the object, measured in bytes.  Built-in
objects return correct results; third-party extensions may not,
but can define a @code{__sizeof__()} method to return the
object’s size.
(Contributed by Robert Schuppenies; bpo-2898@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2898}.)

It’s now possible to determine the current profiler and tracer functions
by calling @ref{15ec,,sys.getprofile()} and @ref{15ed,,sys.gettrace()}.
(Contributed by Georg Brandl; bpo-1648@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1648}.)

@item 
The @ref{e4,,tarfile} module now supports POSIX.1-2001 (pax) tarfiles in
addition to the POSIX.1-1988 (ustar) and GNU tar formats that were
already supported.  The default format is GNU tar; specify the
@code{format} parameter to open a file using a different format:

@example
tar = tarfile.open("output.tar", "w",
                   format=tarfile.PAX_FORMAT)
@end example

The new @code{encoding} and @code{errors} parameters specify an encoding and
an error handling scheme for character conversions.  @code{'strict'},
@code{'ignore'}, and @code{'replace'} are the three standard ways Python can
handle errors,;
@code{'utf-8'} is a special value that replaces bad characters with
their UTF-8 representation.  (Character conversions occur because the
PAX format supports Unicode filenames, defaulting to UTF-8 encoding.)

The @code{TarFile.add()} method now accepts an @code{exclude} argument that’s
a function that can be used to exclude certain filenames from
an archive.
The function must take a filename and return true if the file
should be excluded or false if it should be archived.
The function is applied to both the name initially passed to @code{add()}
and to the names of files in recursively added directories.

(All changes contributed by Lars Gustäbel).

@item 
An optional @code{timeout} parameter was added to the
@code{telnetlib.Telnet} class constructor, specifying a timeout
measured in seconds.  (Added by Facundo Batista.)

@item 
The @ref{6ee,,tempfile.NamedTemporaryFile} class usually deletes
the temporary file it created when the file is closed.  This
behaviour can now be changed by passing @code{delete=False} to the
constructor.  (Contributed by Damien Miller; bpo-1537850@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1537850}.)

A new class, @code{SpooledTemporaryFile}, behaves like
a temporary file but stores its data in memory until a maximum size is
exceeded.  On reaching that limit, the contents will be written to
an on-disk temporary file.  (Contributed by Dustin J. Mitchell.)

The @code{NamedTemporaryFile} and @code{SpooledTemporaryFile} classes
both work as context managers, so you can write
@code{with tempfile.NamedTemporaryFile() as tmp: ...}.
(Contributed by Alexander Belopolsky; bpo-2021@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2021}.)

@item 
The @ref{ea,,test.test_support} module gained a number
of context managers useful for writing tests.
@ref{15ee,,EnvironmentVarGuard()} is a
context manager that temporarily changes environment variables and
automatically restores them to their old values.

Another context manager, @code{TransientResource}, can surround calls
to resources that may or may not be available; it will catch and
ignore a specified list of exceptions.  For example,
a network test may ignore certain failures when connecting to an
external web site:

@example
with test_support.TransientResource(IOError,
                                errno=errno.ETIMEDOUT):
    f = urllib.urlopen('https://sf.net')
    ...
@end example

Finally, @code{check_warnings()} resets the @code{warning} module’s
warning filters and returns an object that will record all warning
messages triggered (bpo-3781@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3781}):

@example
with test_support.check_warnings() as wrec:
    warnings.simplefilter("always")
    # ... code that triggers a warning ...
    assert str(wrec.message) == "function is outdated"
    assert len(wrec.warnings) == 1, "Multiple warnings raised"
@end example

(Contributed by Brett Cannon.)

@item 
The @ref{f2,,textwrap} module can now preserve existing whitespace
at the beginnings and ends of the newly created lines
by specifying @code{drop_whitespace=False}
as an argument:

@example
>>> S = """This  sentence  has a bunch   of
...   extra   whitespace."""
>>> print textwrap.fill(S, width=15)
This  sentence
has a bunch
of    extra
whitespace.
>>> print textwrap.fill(S, drop_whitespace=False, width=15)
This  sentence
  has a bunch
   of    extra
   whitespace.
>>>
@end example

(Contributed by Dwayne Bailey; bpo-1581073@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1581073}.)

@item 
The @ref{f3,,threading} module API is being changed to use properties
such as @code{daemon} instead of @code{setDaemon()} and
@code{isDaemon()} methods, and some methods have been renamed to use
underscores instead of camel-case; for example, the
@code{activeCount()} method is renamed to @code{active_count()}.  Both
the 2.6 and 3.0 versions of the module support the same properties
and renamed methods, but don’t remove the old methods.  No date has been set
for the deprecation of the old APIs in Python 3.x; the old APIs won’t
be removed in any 2.x version.
(Carried out by several people, most notably Benjamin Peterson.)

The @ref{f3,,threading} module’s @code{Thread} objects
gained an @code{ident} property that returns the thread’s
identifier, a nonzero integer.  (Contributed by Gregory P. Smith;
bpo-2871@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2871}.)

@item 
The @ref{f5,,timeit} module now accepts callables as well as strings
for the statement being timed and for the setup code.
Two convenience functions were added for creating
@code{Timer} instances:
@code{repeat(stmt, setup, time, repeat, number)} and
@code{timeit(stmt, setup, time, number)} create an instance and call
the corresponding method. (Contributed by Erik Demaine;
bpo-1533909@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1533909}.)

@item 
The @code{Tkinter} module now accepts lists and tuples for options,
separating the elements by spaces before passing the resulting value to
Tcl/Tk.
(Contributed by Guilherme Polo; bpo-2906@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2906}.)

@item 
The @ref{108,,turtle} module for turtle graphics was greatly enhanced by
Gregor Lingl.  New features in the module include:


@itemize *

@item 
Better animation of turtle movement and rotation.

@item 
Control over turtle movement using the new @code{delay()},
@code{tracer()}, and @code{speed()} methods.

@item 
The ability to set new shapes for the turtle, and to
define a new coordinate system.

@item 
Turtles now have an @code{undo()} method that can roll back actions.

@item 
Simple support for reacting to input events such as mouse and keyboard
activity, making it possible to write simple games.

@item 
A @code{turtle.cfg} file can be used to customize the starting appearance
of the turtle’s screen.

@item 
The module’s docstrings can be replaced by new docstrings that have been
translated into another language.
@end itemize

(bpo-1513695@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1513695})

@item 
An optional @code{timeout} parameter was added to the
@ref{309,,urllib.urlopen} function and the
@code{urllib.ftpwrapper} class constructor, as well as the
@code{urllib2.urlopen} function.  The parameter specifies a timeout
measured in seconds.   For example:

@example
>>> u = urllib2.urlopen("http://slow.example.com",
                        timeout=3)
Traceback (most recent call last):
  ...
urllib2.URLError: <urlopen error timed out>
>>>
@end example

(Added by Facundo Batista.)

@item 
The Unicode database provided by the @ref{10c,,unicodedata} module
has been updated to version 5.1.0.  (Updated by
Martin von Löwis; bpo-3811@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3811}.)

@item 
The @ref{119,,warnings} module’s @code{formatwarning()} and @code{showwarning()}
gained an optional `line' argument that can be used to supply the
line of source code.  (Added as part of bpo-1631171@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1631171}, which re-implemented
part of the @code{warnings} module in C code.)

A new function, @code{catch_warnings()}, is a context manager
intended for testing purposes that lets you temporarily modify the
warning filters and then restore their original values (bpo-3781@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3781}).

@item 
The XML-RPC @ref{136,,SimpleXMLRPCServer} and @code{DocXMLRPCServer}
classes can now be prevented from immediately opening and binding to
their socket by passing @code{False} as the `bind_and_activate'
constructor parameter.  This can be used to modify the instance’s
@code{allow_reuse_address} attribute before calling the
@code{server_bind()} and @code{server_activate()} methods to
open the socket and begin listening for connections.
(Contributed by Peter Parente; bpo-1599845@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1599845}.)

@code{SimpleXMLRPCServer} also has a @code{_send_traceback_header}
attribute; if true, the exception and formatted traceback are returned
as HTTP headers “X-Exception” and “X-Traceback”.  This feature is
for debugging purposes only and should not be used on production servers
because the tracebacks might reveal passwords or other sensitive
information.  (Contributed by Alan McIntyre as part of his
project for Google’s Summer of Code 2007.)

@item 
The @ref{135,,xmlrpclib} module no longer automatically converts
@ref{1fc,,datetime.date} and @ref{1fd,,datetime.time} to the
@ref{15ef,,xmlrpclib.DateTime} type; the conversion semantics were
not necessarily correct for all applications.  Code using
@code{xmlrpclib} should convert @code{date} and @code{time}
instances. (bpo-1330538@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1330538})  The code can also handle
dates before 1900 (contributed by Ralf Schmitt; bpo-2014@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2014})
and 64-bit integers represented by using @code{<i8>} in XML-RPC responses
(contributed by Riku Lindblad; bpo-2985@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2985}).

@item 
The @ref{138,,zipfile} module’s @code{ZipFile} class now has
@code{extract()} and @code{extractall()} methods that will unpack
a single file or all the files in the archive to the current directory, or
to a specified directory:

@example
z = zipfile.ZipFile('python-251.zip')

# Unpack a single file, writing it relative
# to the /tmp directory.
z.extract('Python/sysmodule.c', '/tmp')

# Unpack all the files in the archive.
z.extractall()
@end example

(Contributed by Alan McIntyre; bpo-467924@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=467924}.)

The @ref{318,,open()}, @code{read()} and @code{extract()} methods can now
take either a filename or a @code{ZipInfo} object.  This is useful when an
archive accidentally contains a duplicated filename.
(Contributed by Graham Horler; bpo-1775025@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1775025}.)

Finally, @ref{138,,zipfile} now supports using Unicode filenames
for archived files.  (Contributed by Alexey Borzenkov; bpo-1734346@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1734346}.)
@end itemize

@c ======================================================================

@c whole new modules get described in subsections here

@menu
* The ast module:: 
* The future_builtins module:: 
* The json module; JavaScript Object Notation: The json module JavaScript Object Notation. 
* The plistlib module; A Property-List Parser: The plistlib module A Property-List Parser. 
* ctypes Enhancements:: 
* Improved SSL Support:: 

@end menu

@node The ast module,The future_builtins module,,New and Improved Modules<2>
@anchor{whatsnew/2 6 the-ast-module}@anchor{15f0}
@subsubsection The @code{ast} module


The @ref{9,,ast} module provides an Abstract Syntax Tree
representation of Python code, and Armin Ronacher
contributed a set of helper functions that perform a variety of
common tasks.  These will be useful for HTML templating
packages, code analyzers, and similar tools that process
Python code.

The @code{parse()} function takes an expression and returns an AST.
The @code{dump()} function outputs a representation of a tree, suitable
for debugging:

@example
import ast

t = ast.parse("""
d = @{@}
for i in 'abcdefghijklm':
    d[i + i] = ord(i) - ord('a') + 1
print d
""")
print ast.dump(t)
@end example

This outputs a deeply nested tree:

@example
Module(body=[
  Assign(targets=[
    Name(id='d', ctx=Store())
   ], value=Dict(keys=[], values=[]))
  For(target=Name(id='i', ctx=Store()),
      iter=Str(s='abcdefghijklm'), body=[
    Assign(targets=[
      Subscript(value=
        Name(id='d', ctx=Load()),
          slice=
          Index(value=
            BinOp(left=Name(id='i', ctx=Load()), op=Add(),
             right=Name(id='i', ctx=Load()))), ctx=Store())
     ], value=
     BinOp(left=
      BinOp(left=
       Call(func=
        Name(id='ord', ctx=Load()), args=[
          Name(id='i', ctx=Load())
         ], keywords=[], starargs=None, kwargs=None),
       op=Sub(), right=Call(func=
        Name(id='ord', ctx=Load()), args=[
          Str(s='a')
         ], keywords=[], starargs=None, kwargs=None)),
       op=Add(), right=Num(n=1)))
    ], orelse=[])
   Print(dest=None, values=[
     Name(id='d', ctx=Load())
   ], nl=True)
 ])
@end example

The @code{literal_eval()} method takes a string or an AST
representing a literal expression, parses and evaluates it, and
returns the resulting value.  A literal expression is a Python
expression containing only strings, numbers, dictionaries,
etc. but no statements or function calls.  If you need to
evaluate an expression but cannot accept the security risk of using an
@ref{4a4,,eval()} call, @code{literal_eval()} will handle it safely:

@example
>>> literal = '("a", "b", @{2:4, 3:8, 1:2@})'
>>> print ast.literal_eval(literal)
('a', 'b', @{1: 2, 2: 4, 3: 8@})
>>> print ast.literal_eval('"a" + "b"')
Traceback (most recent call last):
  ...
ValueError: malformed string
@end example

The module also includes @code{NodeVisitor} and
@code{NodeTransformer} classes for traversing and modifying an AST,
and functions for common transformations such as changing line
numbers.

@c ======================================================================

@node The future_builtins module,The json module JavaScript Object Notation,The ast module,New and Improved Modules<2>
@anchor{whatsnew/2 6 the-future-builtins-module}@anchor{15f1}
@subsubsection The @code{future_builtins} module


Python 3.0 makes many changes to the repertoire of built-in
functions, and most of the changes can’t be introduced in the Python
2.x series because they would break compatibility.
The @code{future_builtins} module provides versions
of these built-in functions that can be imported when writing
3.0-compatible code.

The functions in this module currently include:


@itemize *

@item 
@code{ascii(obj)}: equivalent to @ref{1c3,,repr()}.  In Python 3.0,
@code{repr()} will return a Unicode string, while @ref{15f2,,ascii()} will
return a pure ASCII bytestring.

@item 
@code{filter(predicate, iterable)},
@code{map(func, iterable1, ...)}: the 3.0 versions
return iterators, unlike the 2.x builtins which return lists.

@item 
@code{hex(value)}, @code{oct(value)}: instead of calling the
@code{__hex__()} or @code{__oct__()} methods, these versions will
call the @code{__index__()} method and convert the result to hexadecimal
or octal.  @ref{14da,,oct()} will use the new @code{0o} notation for its
result.
@end itemize

@c ======================================================================

@node The json module JavaScript Object Notation,The plistlib module A Property-List Parser,The future_builtins module,New and Improved Modules<2>
@anchor{whatsnew/2 6 the-json-module-javascript-object-notation}@anchor{15f3}
@subsubsection The @code{json} module: JavaScript Object Notation


The new @ref{86,,json} module supports the encoding and decoding of Python types in
JSON (Javascript Object Notation). JSON is a lightweight interchange format
often used in web applications. For more information about JSON, see
@indicateurl{http://www.json.org}.

@ref{86,,json} comes with support for decoding and encoding most built-in Python
types. The following example encodes and decodes a dictionary:

@example
>>> import json
>>> data = @{"spam": "foo", "parrot": 42@}
>>> in_json = json.dumps(data) # Encode the data
>>> in_json
'@{"parrot": 42, "spam": "foo"@}'
>>> json.loads(in_json) # Decode into a Python object
@{"spam": "foo", "parrot": 42@}
@end example

It’s also possible to write your own decoders and encoders to support
more types. Pretty-printing of the JSON strings is also supported.

@ref{86,,json} (originally called simplejson) was written by Bob
Ippolito.

@c ======================================================================

@node The plistlib module A Property-List Parser,ctypes Enhancements,The json module JavaScript Object Notation,New and Improved Modules<2>
@anchor{whatsnew/2 6 the-plistlib-module-a-property-list-parser}@anchor{15f4}
@subsubsection The @code{plistlib} module: A Property-List Parser


The @code{.plist} format is commonly used on Mac OS X to
store basic data types (numbers, strings, lists,
and dictionaries) by serializing them into an XML-based format.
It resembles the XML-RPC serialization of data types.

Despite being primarily used on Mac OS X, the format
has nothing Mac-specific about it and the Python implementation works
on any platform that Python supports, so the @ref{b0,,plistlib} module
has been promoted to the standard library.

Using the module is simple:

@example
import sys
import plistlib
import datetime as dt

# Create data structure
data_struct = dict(lastAccessed=dt.datetime.now(),
                   version=1,
                   categories=('Personal','Shared','Private'))

# Create string containing XML.
plist_str = plistlib.writePlistToString(data_struct)
new_struct = plistlib.readPlistFromString(plist_str)
print data_struct
print new_struct

# Write data structure to a file and read it back.
plistlib.writePlist(data_struct, '/tmp/customizations.plist')
new_struct = plistlib.readPlist('/tmp/customizations.plist')

# read/writePlist accepts file-like objects as well as paths.
plistlib.writePlist(data_struct, sys.stdout)
@end example

@c ======================================================================

@node ctypes Enhancements,Improved SSL Support,The plistlib module A Property-List Parser,New and Improved Modules<2>
@anchor{whatsnew/2 6 ctypes-enhancements}@anchor{15f5}
@subsubsection ctypes Enhancements


Thomas Heller continued to maintain and enhance the
@ref{2e,,ctypes} module.

@ref{2e,,ctypes} now supports a @code{c_bool} datatype
that represents the C99 @code{bool} type.  (Contributed by David Remahl;
bpo-1649190@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1649190}.)

The @ref{2e,,ctypes} string, buffer and array types have improved
support for extended slicing syntax,
where various combinations of @code{(start, stop, step)} are supplied.
(Implemented by Thomas Wouters.)

@c Revision 57769

All @ref{2e,,ctypes} data types now support
@code{from_buffer()} and @code{from_buffer_copy()}
methods that create a ctypes instance based on a
provided buffer object.  @code{from_buffer_copy()} copies
the contents of the object,
while @code{from_buffer()} will share the same memory area.

A new calling convention tells @ref{2e,,ctypes} to clear the @code{errno} or
Win32 LastError variables at the outset of each wrapped call.
(Implemented by Thomas Heller; bpo-1798@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1798}.)

You can now retrieve the Unix @code{errno} variable after a function
call.  When creating a wrapped function, you can supply
@code{use_errno=True} as a keyword parameter to the @code{DLL()} function
and then call the module-level methods @code{set_errno()} and
@code{get_errno()} to set and retrieve the error value.

The Win32 LastError variable is similarly supported by
the @code{DLL()}, @code{OleDLL()}, and @code{WinDLL()} functions.
You supply @code{use_last_error=True} as a keyword parameter
and then call the module-level methods @code{set_last_error()}
and @code{get_last_error()}.

The @code{byref()} function, used to retrieve a pointer to a ctypes
instance, now has an optional `offset' parameter that is a byte
count that will be added to the returned pointer.

@c ======================================================================

@node Improved SSL Support,,ctypes Enhancements,New and Improved Modules<2>
@anchor{whatsnew/2 6 improved-ssl-support}@anchor{15f6}
@subsubsection Improved SSL Support


Bill Janssen made extensive improvements to Python 2.6’s support for
the Secure Sockets Layer by adding a new module, @ref{d5,,ssl}, that’s
built atop the OpenSSL@footnote{https://www.openssl.org/} library.
This new module provides more control over the protocol negotiated,
the X.509 certificates used, and has better support for writing SSL
servers (as opposed to clients) in Python.  The existing SSL support
in the @ref{d1,,socket} module hasn’t been removed and continues to work,
though it will be removed in Python 3.0.

To use the new module, you must first create a TCP connection in the
usual way and then pass it to the @code{ssl.wrap_socket()} function.
It’s possible to specify whether a certificate is required, and to
obtain certificate info by calling the @code{getpeercert()} method.


@subsubheading See also


The documentation for the @ref{d5,,ssl} module.


@c ======================================================================

@node Deprecations and Removals,Build and C API Changes<9>,New and Improved Modules<2>,What’s New in Python 2 6
@anchor{whatsnew/2 6 deprecations-and-removals}@anchor{15f7}
@subsection Deprecations and Removals



@itemize *

@item 
String exceptions have been removed.  Attempting to use them raises a
@ref{199,,TypeError}.

@item 
Changes to the @ref{bd3,,Exception} interface
as dictated by 
@geindex Python Enhancement Proposals; PEP 352
PEP 352@footnote{https://peps.python.org/pep-0352/} continue to be made.  For 2.6,
the @code{message} attribute is being deprecated in favor of the
@ref{78e,,args} attribute.

@item 
(3.0-warning mode) Python 3.0 will feature a reorganized standard
library that will drop many outdated modules and rename others.
Python 2.6 running in 3.0-warning mode will warn about these modules
when they are imported.

The list of deprecated modules is:
@code{audiodev},
@code{bgenlocations},
@code{buildtools},
@code{bundlebuilder},
@code{Canvas},
@code{compiler},
@code{dircache},
@code{dl},
@code{fpformat},
@code{gensuitemodule},
@code{ihooks},
@code{imageop},
@code{imgfile},
@code{linuxaudiodev},
@code{mhlib},
@code{mimetools},
@code{multifile},
@code{new},
@code{pure},
@code{statvfs},
@code{sunaudiodev},
@code{test.testall}, and
@code{toaiff}.

@item 
The @code{gopherlib} module has been removed.

@item 
The @code{MimeWriter} module and @code{mimify} module
have been deprecated; use the @ref{3f,,email}
package instead.

@item 
The @code{md5} module has been deprecated; use the @ref{6c,,hashlib} module
instead.

@item 
The @code{posixfile} module has been deprecated; @ref{15f8,,fcntl.lockf()}
provides better locking.

@item 
The @code{popen2} module has been deprecated; use the @ref{dc,,subprocess}
module.

@item 
The @code{rgbimg} module has been removed.

@item 
The @code{sets} module has been deprecated; it’s better to
use the built-in @ref{185,,set} and @ref{7f3,,frozenset} types.

@item 
The @code{sha} module has been deprecated; use the @ref{6c,,hashlib} module
instead.
@end itemize

@c ======================================================================

@node Build and C API Changes<9>,Porting to Python 2 6,Deprecations and Removals,What’s New in Python 2 6
@anchor{whatsnew/2 6 build-and-c-api-changes}@anchor{15f9}
@subsection Build and C API Changes


Changes to Python’s build process and to the C API include:


@itemize *

@item 
Python now must be compiled with C89 compilers (after 19
years!).  This means that the Python source tree has dropped its
own implementations of @code{memmove()} and @code{strerror()}, which
are in the C89 standard library.

@item 
Python 2.6 can be built with Microsoft Visual Studio 2008 (version
9.0), and this is the new default compiler.  See the
@code{PCbuild} directory for the build files.  (Implemented by
Christian Heimes.)

@item 
On Mac OS X, Python 2.6 can be compiled as a 4-way universal build.
The @code{configure} script
can take a @code{--with-universal-archs=[32-bit|64-bit|all]}
switch, controlling whether the binaries are built for 32-bit
architectures (x86, PowerPC), 64-bit (x86-64 and PPC-64), or both.
(Contributed by Ronald Oussoren.)

@item 
A new function added in Python 2.6.6, @code{PySys_SetArgvEx()}, sets
the value of @code{sys.argv} and can optionally update @code{sys.path} to
include the directory containing the script named by @code{sys.argv[0]}
depending on the value of an `updatepath' parameter.

This function was added to close a security hole for applications
that embed Python.  The old function, @code{PySys_SetArgv()}, would
always update @code{sys.path}, and sometimes it would add the current
directory.  This meant that, if you ran an application embedding
Python in a directory controlled by someone else, attackers could
put a Trojan-horse module in the directory (say, a file named
@code{os.py}) that your application would then import and run.

If you maintain a C/C++ application that embeds Python, check
whether you’re calling @code{PySys_SetArgv()} and carefully consider
whether the application should be using @code{PySys_SetArgvEx()}
with `updatepath' set to false.  Note that using this function will
break compatibility with Python versions 2.6.5 and earlier; if you
have to continue working with earlier versions, you can leave
the call to @code{PySys_SetArgv()} alone and call
@code{PyRun_SimpleString("sys.path.pop(0)\n")} afterwards to discard
the first @code{sys.path} component.

Security issue reported as 
@geindex Common Vulnerabilities and Exposures; CVE 2008-5983
CVE 2008-5983@footnote{https://www.cve.org/CVERecord?id=CVE-2008-5983};
discussed in gh-50003@footnote{https://github.com/python/cpython/issues/50003}, and fixed by Antoine Pitrou.

@item 
The BerkeleyDB module now has a C API object, available as
@code{bsddb.db.api}.   This object can be used by other C extensions
that wish to use the @code{bsddb} module for their own purposes.
(Contributed by Duncan Grisby.)

@item 
The new buffer interface, previously described in
@ref{15c0,,the PEP 3118 section},
adds @ref{63a,,PyObject_GetBuffer()} and @ref{63b,,PyBuffer_Release()},
as well as a few other functions.

@item 
Python’s use of the C stdio library is now thread-safe, or at least
as thread-safe as the underlying library is.  A long-standing potential
bug occurred if one thread closed a file object while another thread
was reading from or writing to the object.  In 2.6 file objects
have a reference count, manipulated by the
@code{PyFile_IncUseCount()} and @code{PyFile_DecUseCount()}
functions.  File objects can’t be closed unless the reference count
is zero.  @code{PyFile_IncUseCount()} should be called while the GIL
is still held, before carrying out an I/O operation using the
@code{FILE *} pointer, and @code{PyFile_DecUseCount()} should be called
immediately after the GIL is re-acquired.
(Contributed by Antoine Pitrou and Gregory P. Smith.)

@item 
Importing modules simultaneously in two different threads no longer
deadlocks; it will now raise an @ref{65b,,ImportError}.  A new API
function, @ref{3d9,,PyImport_ImportModuleNoBlock()}, will look for a
module in @code{sys.modules} first, then try to import it after
acquiring an import lock.  If the import lock is held by another
thread, an @code{ImportError} is raised.
(Contributed by Christian Heimes.)

@item 
Several functions return information about the platform’s
floating-point support.  @ref{15fa,,PyFloat_GetMax()} returns
the maximum representable floating-point value,
and @ref{15fb,,PyFloat_GetMin()} returns the minimum
positive value.  @ref{15fc,,PyFloat_GetInfo()} returns an object
containing more information from the @code{float.h} file, such as
@code{"mant_dig"} (number of digits in the mantissa), @code{"epsilon"}
(smallest difference between 1.0 and the next largest value
representable), and several others.
(Contributed by Christian Heimes; bpo-1534@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1534}.)

@item 
C functions and methods that use
@ref{15fd,,PyComplex_AsCComplex()} will now accept arguments that
have a @code{__complex__()} method.  In particular, the functions in the
@ref{19,,cmath} module will now accept objects with this method.
This is a backport of a Python 3.0 change.
(Contributed by Mark Dickinson; bpo-1675423@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1675423}.)

@item 
Python’s C API now includes two functions for case-insensitive string
comparisons, @code{PyOS_stricmp(char*, char*)}
and @code{PyOS_strnicmp(char*, char*, Py_ssize_t)}.
(Contributed by Christian Heimes; bpo-1635@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635}.)

@item 
Many C extensions define their own little macro for adding
integers and strings to the module’s dictionary in the
@code{init*} function.  Python 2.6 finally defines standard macros
for adding values to a module, @ref{15fe,,PyModule_AddStringMacro}
and @ref{15ff,,PyModule_AddIntMacro()}.  (Contributed by
Christian Heimes.)

@item 
Some macros were renamed in both 3.0 and 2.6 to make it clearer that
they are macros,
not functions.  @code{Py_Size()} became @ref{98a,,Py_SIZE()},
@code{Py_Type()} became @ref{3c7,,Py_TYPE()}, and
@code{Py_Refcnt()} became @ref{2d1,,Py_REFCNT()}.
The mixed-case macros are still available
in Python 2.6 for backward compatibility.
(bpo-1629@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1629})

@item 
Distutils now places C extensions it builds in a
different directory when running on a debug version of Python.
(Contributed by Collin Winter; bpo-1530959@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1530959}.)

@item 
Several basic data types, such as integers and strings, maintain
internal free lists of objects that can be re-used.  The data
structures for these free lists now follow a naming convention: the
variable is always named @code{free_list}, the counter is always named
@code{numfree}, and a macro @code{Py<typename>_MAXFREELIST} is
always defined.

@item 
A new Makefile target, “make patchcheck”, prepares the Python source tree
for making a patch: it fixes trailing whitespace in all modified
@code{.py} files, checks whether the documentation has been changed,
and reports whether the @code{Misc/ACKS} and @code{Misc/NEWS} files
have been updated.
(Contributed by Brett Cannon.)

Another new target, “make profile-opt”, compiles a Python binary
using GCC’s profile-guided optimization.  It compiles Python with
profiling enabled, runs the test suite to obtain a set of profiling
results, and then compiles using these results for optimization.
(Contributed by Gregory P. Smith.)
@end itemize

@c ======================================================================

@menu
* Port-Specific Changes; Windows: Port-Specific Changes Windows<2>. 
* Port-Specific Changes; Mac OS X: Port-Specific Changes Mac OS X<2>. 
* Port-Specific Changes; IRIX: Port-Specific Changes IRIX. 

@end menu

@node Port-Specific Changes Windows<2>,Port-Specific Changes Mac OS X<2>,,Build and C API Changes<9>
@anchor{whatsnew/2 6 port-specific-changes-windows}@anchor{1600}
@subsubsection Port-Specific Changes: Windows



@itemize *

@item 
The support for Windows 95, 98, ME and NT4 has been dropped.
Python 2.6 requires at least Windows 2000 SP4.

@item 
The new default compiler on Windows is Visual Studio 2008 (version
9.0). The build directories for Visual Studio 2003 (version 7.1) and
2005 (version 8.0) were moved into the PC/ directory. The new
@code{PCbuild} directory supports cross compilation for X64, debug
builds and Profile Guided Optimization (PGO). PGO builds are roughly
10% faster than normal builds.  (Contributed by Christian Heimes
with help from Amaury Forgeot d’Arc and Martin von Löwis.)

@item 
The @ref{97,,msvcrt} module now supports
both the normal and wide char variants of the console I/O
API.  The @ref{1601,,getwch()} function reads a keypress and returns a Unicode
value, as does the @ref{1602,,getwche()} function.  The @ref{1603,,putwch()} function
takes a Unicode character and writes it to the console.
(Contributed by Christian Heimes.)

@item 
@ref{15e5,,os.path.expandvars()} will now expand environment variables in
the form “%var%”, and “~user” will be expanded into the user’s home
directory path.  (Contributed by Josiah Carlson; bpo-957650@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=957650}.)

@item 
The @ref{d1,,socket} module’s socket objects now have an
@ref{ed4,,ioctl()} method that provides a limited interface to the
@code{WSAIoctl()} system interface.

@item 
The @ref{11d,,_winreg} module now has a function,
@ref{1604,,ExpandEnvironmentStrings()},
that expands environment variable references such as @code{%NAME%}
in an input string.  The handle objects provided by this
module now support the context protocol, so they can be used
in @ref{187,,with} statements. (Contributed by Christian Heimes.)

@ref{11d,,_winreg} also has better support for x64 systems,
exposing the @ref{1570,,DisableReflectionKey()}, @ref{1571,,EnableReflectionKey()},
and @ref{1572,,QueryReflectionKey()} functions, which enable and disable
registry reflection for 32-bit processes running on 64-bit systems.
(bpo-1753245@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1753245})

@item 
The @code{msilib} module’s @code{Record} object
gained @code{GetInteger()} and @code{GetString()} methods that
return field values as an integer or a string.
(Contributed by Floris Bruynooghe; bpo-2125@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2125}.)
@end itemize

@c ======================================================================

@node Port-Specific Changes Mac OS X<2>,Port-Specific Changes IRIX,Port-Specific Changes Windows<2>,Build and C API Changes<9>
@anchor{whatsnew/2 6 port-specific-changes-mac-os-x}@anchor{1605}
@subsubsection Port-Specific Changes: Mac OS X



@itemize *

@item 
When compiling a framework build of Python, you can now specify the
framework name to be used by providing the
@code{--with-framework-name=} option to the
@code{configure} script.

@item 
The @code{macfs} module has been removed.  This in turn required the
@code{macostools.touched()} function to be removed because it depended on the
@code{macfs} module.  (bpo-1490190@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1490190})

@item 
Many other Mac OS modules have been deprecated and will be removed in
Python 3.0:
@code{_builtinSuites},
@code{aepack},
@code{aetools},
@code{aetypes},
@code{applesingle},
@code{appletrawmain},
@code{appletrunner},
@code{argvemulator},
@code{Audio_mac},
@code{autoGIL},
@code{Carbon},
@code{cfmfile},
@code{CodeWarrior},
@code{ColorPicker},
@code{EasyDialogs},
@code{Explorer},
@code{Finder},
@code{FrameWork},
@code{findertools},
@code{ic},
@code{icglue},
@code{icopen},
@code{macerrors},
@code{MacOS},
@code{macfs},
@code{macostools},
@code{macresource},
@code{MiniAEFrame},
@code{Nav},
@code{Netscape},
@code{OSATerminology},
@code{pimp},
@code{PixMapWrapper},
@code{StdSuites},
@code{SystemEvents},
@code{Terminal}, and
@code{terminalcommand}.
@end itemize

@c ======================================================================

@node Port-Specific Changes IRIX,,Port-Specific Changes Mac OS X<2>,Build and C API Changes<9>
@anchor{whatsnew/2 6 port-specific-changes-irix}@anchor{1606}
@subsubsection Port-Specific Changes: IRIX


A number of old IRIX-specific modules were deprecated and will
be removed in Python 3.0:
@code{al} and @code{AL},
@code{cd},
@code{cddb},
@code{cdplayer},
@code{CL} and @code{cl},
@code{DEVICE},
@code{ERRNO},
@code{FILE},
@code{FL} and @code{fl},
@code{flp},
@code{fm},
@code{GET},
@code{GLWS},
@code{GL} and @code{gl},
@code{IN},
@code{IOCTL},
@code{jpeg},
@code{panelparser},
@code{readcd},
@code{SV} and @code{sv},
@code{torgb},
@code{videoreader}, and
@code{WAIT}.

@c ======================================================================

@node Porting to Python 2 6,Acknowledgements<2>,Build and C API Changes<9>,What’s New in Python 2 6
@anchor{whatsnew/2 6 porting-to-python-2-6}@anchor{1607}
@subsection Porting to Python 2.6


This section lists previously described changes and other bugfixes
that may require changes to your code:


@itemize *

@item 
Classes that aren’t supposed to be hashable should
set @code{__hash__ = None} in their definitions to indicate
the fact.

@item 
String exceptions have been removed.  Attempting to use them raises a
@ref{199,,TypeError}.

@item 
The @code{__init__()} method of @ref{7f5,,collections.deque}
now clears any existing contents of the deque
before adding elements from the iterable.  This change makes the
behavior match @code{list.__init__()}.

@item 
@ref{8c1,,object.__init__()} previously accepted arbitrary arguments and
keyword arguments, ignoring them.  In Python 2.6, this is no longer
allowed and will result in a @ref{199,,TypeError}.  This will affect
@code{__init__()} methods that end up calling the corresponding
method on @ref{c84,,object} (perhaps through using @ref{1a7,,super()}).
See bpo-1683368@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1683368} for discussion.

@item 
The @code{Decimal} constructor now accepts leading and trailing
whitespace when passed a string.  Previously it would raise an
@code{InvalidOperation} exception.  On the other hand, the
@code{create_decimal()} method of @code{Context} objects now
explicitly disallows extra whitespace, raising a
@code{ConversionSyntax} exception.

@item 
Due to an implementation accident, if you passed a file path to
the built-in  @ref{ad7,,__import__()} function, it would actually import
the specified file.  This was never intended to work, however, and
the implementation now explicitly checks for this case and raises
an @ref{65b,,ImportError}.

@item 
C API: the @ref{1608,,PyImport_Import()} and @ref{3da,,PyImport_ImportModule()}
functions now default to absolute imports, not relative imports.
This will affect C extensions that import other modules.

@item 
C API: extension data types that shouldn’t be hashable
should define their @code{tp_hash} slot to
@ref{15d2,,PyObject_HashNotImplemented()}.

@item 
The @ref{d1,,socket} module exception @ref{125c,,socket.error} now inherits
from @ref{1259,,IOError}.  Previously it wasn’t a subclass of
@code{StandardError} but now it is, through @code{IOError}.
(Implemented by Gregory P. Smith; bpo-1706815@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1706815}.)

@item 
The @ref{135,,xmlrpclib} module no longer automatically converts
@ref{1fc,,datetime.date} and @ref{1fd,,datetime.time} to the
@ref{15ef,,xmlrpclib.DateTime} type; the conversion semantics were
not necessarily correct for all applications.  Code using
@code{xmlrpclib} should convert @code{date} and @code{time}
instances. (bpo-1330538@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1330538})

@item 
(3.0-warning mode) The @ref{bd3,,Exception} class now warns
when accessed using slicing or index access; having
@code{Exception} behave like a tuple is being phased out.

@item 
(3.0-warning mode) inequality comparisons between two dictionaries
or two objects that don’t implement comparison methods are reported
as warnings.  @code{dict1 == dict2} still works, but @code{dict1 < dict2}
is being phased out.

Comparisons between cells, which are an implementation detail of Python’s
scoping rules, also cause warnings because such comparisons are forbidden
entirely in 3.0.
@end itemize

For applications that embed Python:


@itemize *

@item 
The @code{PySys_SetArgvEx()} function was added in Python 2.6.6,
letting applications close a security hole when the existing
@code{PySys_SetArgv()} function was used.  Check whether you’re
calling @code{PySys_SetArgv()} and carefully consider whether the
application should be using @code{PySys_SetArgvEx()} with
`updatepath' set to false.
@end itemize

@c ======================================================================

@node Acknowledgements<2>,,Porting to Python 2 6,What’s New in Python 2 6
@anchor{whatsnew/2 6 acknowledgements}@anchor{1609}@anchor{whatsnew/2 6 acks}@anchor{160a}
@subsection Acknowledgements


The author would like to thank the following people for offering
suggestions, corrections and assistance with various drafts of this
article: Georg Brandl, Steve Brown, Nick Coghlan, Ralph Corderoy,
Jim Jewett, Kent Johnson, Chris Lambacher,  Martin Michlmayr,
Antoine Pitrou, Brian Warner.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node What’s New in Python 2 5,What’s New in Python 2 4,What’s New in Python 2 6,What’s New in Python
@anchor{whatsnew/2 5 doc}@anchor{160b}@anchor{whatsnew/2 5 translation-repo}@anchor{160c}@anchor{whatsnew/2 5 what-s-new-in-python-2-5}@anchor{160d}
@section What’s New in Python 2.5


@*Author: 
A.M. Kuchling


@c $Id: whatsnew25.tex 56611 2007-07-29 08:26:10Z georg.brandl $

@c Fix XXX comments

This article explains the new features in Python 2.5.  The final release of
Python 2.5 is scheduled for August 2006; 
@geindex Python Enhancement Proposals; PEP 356
PEP 356@footnote{https://peps.python.org/pep-0356/} describes the planned
release schedule.  Python 2.5 was released on September 19, 2006.

The changes in Python 2.5 are an interesting mix of language and library
improvements. The library enhancements will be more important to Python’s user
community, I think, because several widely useful packages were added.  New
modules include ElementTree for XML processing (@code{xml.etree}),
the SQLite database module (@code{sqlite}), and the @ref{2e,,ctypes}
module for calling C functions.

The language changes are of middling significance.  Some pleasant new features
were added, but most of them aren’t features that you’ll use every day.
Conditional expressions were finally added to the language using a novel syntax;
see section @ref{160e,,PEP 308; Conditional Expressions}.  The new ‘@ref{187,,with}’ statement will make
writing cleanup code easier (section @ref{160f,,PEP 343; The ‘with’ statement}).  Values can now be passed
into generators (section @ref{1610,,PEP 342; New Generator Features}).  Imports are now visible as either
absolute or relative (section @ref{1611,,PEP 328; Absolute and Relative Imports}).  Some corner cases of exception
handling are handled better (section @ref{1612,,PEP 341; Unified try/except/finally}).  All these improvements
are worthwhile, but they’re improvements to one specific language feature or
another; none of them are broad modifications to Python’s semantics.

As well as the language and library additions, other improvements and bugfixes
were made throughout the source tree.  A search through the SVN change logs
finds there were 353 patches applied and 458 bugs fixed between Python 2.4 and
2.5.  (Both figures are likely to be underestimates.)

This article doesn’t try to be a complete specification of the new features;
instead changes are briefly introduced using helpful examples.  For full
details, you should always refer to the documentation for Python 2.5 at
@indicateurl{https://docs.python.org}. If you want to understand the complete implementation
and design rationale, refer to the PEP for a particular new feature.

Comments, suggestions, and error reports for this document are welcome; please
e-mail them to the author or open a bug in the Python bug tracker.

@c ======================================================================

@menu
* PEP 308; Conditional Expressions: PEP 308 Conditional Expressions. 
* PEP 309; Partial Function Application: PEP 309 Partial Function Application. 
* PEP 314; Metadata for Python Software Packages v1.1: PEP 314 Metadata for Python Software Packages v1 1. 
* PEP 328; Absolute and Relative Imports: PEP 328 Absolute and Relative Imports. 
* PEP 338; Executing Modules as Scripts: PEP 338 Executing Modules as Scripts. 
* PEP 341; Unified try/except/finally: PEP 341 Unified try/except/finally. 
* PEP 342; New Generator Features: PEP 342 New Generator Features. 
* PEP 343; The ‘with’ statement: PEP 343 The ‘with’ statement<2>. 
* PEP 352; Exceptions as New-Style Classes: PEP 352 Exceptions as New-Style Classes. 
* PEP 353; Using ssize_t as the index type: PEP 353 Using ssize_t as the index type. 
* PEP 357; The ‘__index__’ method: PEP 357 The ‘__index__’ method. 
* Other Language Changes: Other Language Changes<16>. 
* New@comma{} Improved@comma{} and Removed Modules: New Improved and Removed Modules. 
* Build and C API Changes: Build and C API Changes<10>. 
* Porting to Python 2.5: Porting to Python 2 5. 
* Acknowledgements: Acknowledgements<3>. 

@end menu

@node PEP 308 Conditional Expressions,PEP 309 Partial Function Application,,What’s New in Python 2 5
@anchor{whatsnew/2 5 pep-308}@anchor{160e}@anchor{whatsnew/2 5 pep-308-conditional-expressions}@anchor{1613}
@subsection PEP 308: Conditional Expressions


For a long time, people have been requesting a way to write conditional
expressions, which are expressions that return value A or value B depending on
whether a Boolean value is true or false.  A conditional expression lets you
write a single assignment statement that has the same effect as the following:

@example
if condition:
    x = true_value
else:
    x = false_value
@end example

There have been endless tedious discussions of syntax on both python-dev and
comp.lang.python.  A vote was even held that found the majority of voters wanted
conditional expressions in some form, but there was no syntax that was preferred
by a clear majority. Candidates included C’s @code{cond ? true_v : false_v}, @code{if
cond then true_v else false_v}, and 16 other variations.

Guido van Rossum eventually chose a surprising syntax:

@example
x = true_value if condition else false_value
@end example

Evaluation is still lazy as in existing Boolean expressions, so the order of
evaluation jumps around a bit.  The `condition' expression in the middle is
evaluated first, and the `true_value' expression is evaluated only if the
condition was true.  Similarly, the `false_value' expression is only evaluated
when the condition is false.

This syntax may seem strange and backwards; why does the condition go in the
`middle' of the expression, and not in the front as in C’s @code{c ? x : y}?  The
decision was checked by applying the new syntax to the modules in the standard
library and seeing how the resulting code read.  In many cases where a
conditional expression is used, one value seems to be the ‘common case’ and one
value is an ‘exceptional case’, used only on rarer occasions when the condition
isn’t met.  The conditional syntax makes this pattern a bit more obvious:

@example
contents = ((doc + '\n') if doc else '@w{'})
@end example

I read the above statement as meaning “here `contents' is  usually assigned a
value of @code{doc+'\n'}; sometimes  `doc' is empty, in which special case an empty
string is returned.”   I doubt I will use conditional expressions very often
where there  isn’t a clear common and uncommon case.

There was some discussion of whether the language should require surrounding
conditional expressions with parentheses.  The decision was made to `not'
require parentheses in the Python language’s grammar, but as a matter of style I
think you should always use them. Consider these two statements:

@example
# First version -- no parens
level = 1 if logging else 0

# Second version -- with parens
level = (1 if logging else 0)
@end example

In the first version, I think a reader’s eye might group the statement into
‘level = 1’, ‘if logging’, ‘else 0’, and think that the condition decides
whether the assignment to `level' is performed.  The second version reads
better, in my opinion, because it makes it clear that the assignment is always
performed and the choice is being made between two values.

Another reason for including the brackets: a few odd combinations of list
comprehensions and lambdas could look like incorrect conditional expressions.
See 
@geindex Python Enhancement Proposals; PEP 308
PEP 308@footnote{https://peps.python.org/pep-0308/} for some examples.  If you put parentheses around your
conditional expressions, you won’t run into this case.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 308

@item PEP 308@footnote{https://peps.python.org/pep-0308/} - Conditional Expressions

PEP written by Guido van Rossum and Raymond D. Hettinger; implemented by Thomas
Wouters.
@end table


@c ======================================================================

@node PEP 309 Partial Function Application,PEP 314 Metadata for Python Software Packages v1 1,PEP 308 Conditional Expressions,What’s New in Python 2 5
@anchor{whatsnew/2 5 pep-309}@anchor{1614}@anchor{whatsnew/2 5 pep-309-partial-function-application}@anchor{1615}
@subsection PEP 309: Partial Function Application


The @ref{63,,functools} module is intended to contain tools for functional-style
programming.

One useful tool in this module is the @code{partial()} function. For programs
written in a functional style, you’ll sometimes want to construct variants of
existing functions that have some of the parameters filled in.  Consider a
Python function @code{f(a, b, c)}; you could create a new function @code{g(b, c)} that
was equivalent to @code{f(1, b, c)}.  This is called “partial function
application”.

@code{partial()} takes the arguments @code{(function, arg1, arg2, ... kwarg1=value1,
kwarg2=value2)}.  The resulting object is callable, so you can just call it to
invoke `function' with the filled-in arguments.

Here’s a small but realistic example:

@example
import functools

def log (message, subsystem):
    "Write the contents of 'message' to the specified subsystem."
    print '%s: %s' % (subsystem, message)
    ...

server_log = functools.partial(log, subsystem='server')
server_log('Unable to open socket')
@end example

Here’s another example, from a program that uses PyGTK.  Here a context-sensitive
pop-up menu is being constructed dynamically.  The callback provided
for the menu option is a partially applied version of the @code{open_item()}
method, where the first argument has been provided.

@example
...
class Application:
    def open_item(self, path):
       ...
    def init (self):
        open_func = functools.partial(self.open_item, item_path)
        popup_menu.append( ("Open", open_func, 1) )
@end example

Another function in the @ref{63,,functools} module is the
@code{update_wrapper(wrapper, wrapped)} function that helps you write
well-behaved decorators.  @code{update_wrapper()} copies the name, module, and
docstring attribute to a wrapper function so that tracebacks inside the wrapped
function are easier to understand.  For example, you might write:

@example
def my_decorator(f):
    def wrapper(*args, **kwds):
        print 'Calling decorated function'
        return f(*args, **kwds)
    functools.update_wrapper(wrapper, f)
    return wrapper
@end example

@code{wraps()} is a decorator that can be used inside your own decorators to copy
the wrapped function’s information.  An alternate  version of the previous
example would be:

@example
def my_decorator(f):
    @@functools.wraps(f)
    def wrapper(*args, **kwds):
        print 'Calling decorated function'
        return f(*args, **kwds)
    return wrapper
@end example


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 309

@item PEP 309@footnote{https://peps.python.org/pep-0309/} - Partial Function Application

PEP proposed and written by Peter Harris; implemented by Hye-Shik Chang and Nick
Coghlan, with adaptations by Raymond Hettinger.
@end table


@c ======================================================================

@node PEP 314 Metadata for Python Software Packages v1 1,PEP 328 Absolute and Relative Imports,PEP 309 Partial Function Application,What’s New in Python 2 5
@anchor{whatsnew/2 5 pep-314}@anchor{1616}@anchor{whatsnew/2 5 pep-314-metadata-for-python-software-packages-v1-1}@anchor{1617}
@subsection PEP 314: Metadata for Python Software Packages v1.1


Some simple dependency support was added to Distutils.  The @code{setup()}
function now has @code{requires}, @code{provides}, and @code{obsoletes} keyword
parameters.  When you build a source distribution using the @code{sdist} command,
the dependency information will be recorded in the @code{PKG-INFO} file.

Another new keyword parameter is @code{download_url}, which should be set to a URL
for the package’s source code.  This means it’s now possible to look up an entry
in the package index, determine the dependencies for a package, and download the
required packages.

@example
VERSION = '1.0'
setup(name='PyPackage',
      version=VERSION,
      requires=['numarray', 'zlib (>=1.1.4)'],
      obsoletes=['OldPackage']
      download_url=('http://www.example.com/pypackage/dist/pkg-%s.tar.gz'
                    % VERSION),
     )
@end example

Another new enhancement to the Python package index at
@indicateurl{https://pypi.org} is storing source and binary archives for a
package.  The new @code{upload} Distutils command will upload a package to
the repository.

Before a package can be uploaded, you must be able to build a distribution using
the @code{sdist} Distutils command.  Once that works, you can run @code{python
setup.py upload} to add your package to the PyPI archive.  Optionally you can
GPG-sign the package by supplying the @code{--sign} and @code{--identity}
options.

Package uploading was implemented by Martin von Löwis and Richard Jones.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 314

@item PEP 314@footnote{https://peps.python.org/pep-0314/} - Metadata for Python Software Packages v1.1

PEP proposed and written by A.M. Kuchling, Richard Jones, and Fred Drake;
implemented by Richard Jones and Fred Drake.
@end table


@c ======================================================================

@node PEP 328 Absolute and Relative Imports,PEP 338 Executing Modules as Scripts,PEP 314 Metadata for Python Software Packages v1 1,What’s New in Python 2 5
@anchor{whatsnew/2 5 pep-328}@anchor{1611}@anchor{whatsnew/2 5 pep-328-absolute-and-relative-imports}@anchor{1618}
@subsection PEP 328: Absolute and Relative Imports


The simpler part of 
@geindex Python Enhancement Proposals; PEP 328
PEP 328@footnote{https://peps.python.org/pep-0328/} was implemented in Python 2.4: parentheses could now
be used to enclose the names imported from a module using the @code{from ... import
...} statement, making it easier to import many different names.

The more complicated part has been implemented in Python 2.5: importing a module
can be specified to use absolute or package-relative imports.  The plan is to
move toward making absolute imports the default in future versions of Python.

Let’s say you have a package directory like this:

@example
pkg/
pkg/__init__.py
pkg/main.py
pkg/string.py
@end example

This defines a package named @code{pkg} containing the @code{pkg.main} and
@code{pkg.string} submodules.

Consider the code in the @code{main.py} module.  What happens if it executes
the statement @code{import string}?  In Python 2.4 and earlier, it will first look
in the package’s directory to perform a relative import, finds
@code{pkg/string.py}, imports the contents of that file as the
@code{pkg.string} module, and that module is bound to the name @code{string} in the
@code{pkg.main} module’s namespace.

That’s fine if @code{pkg.string} was what you wanted.  But what if you wanted
Python’s standard @ref{d8,,string} module?  There’s no clean way to ignore
@code{pkg.string} and look for the standard module; generally you had to look at
the contents of @code{sys.modules}, which is slightly unclean.    Holger Krekel’s
@code{py.std} package provides a tidier way to perform imports from the standard
library, @code{import py; py.std.string.join()}, but that package isn’t available
on all Python installations.

Reading code which relies on relative imports is also less clear, because a
reader may be confused about which module, @ref{d8,,string} or @code{pkg.string},
is intended to be used.  Python users soon learned not to duplicate the names of
standard library modules in the names of their packages’ submodules, but you
can’t protect against having your submodule’s name being used for a new module
added in a future version of Python.

In Python 2.5, you can switch @ref{7f9,,import}’s behaviour to  absolute imports
using a @code{from __future__ import absolute_import} directive.  This absolute-import
behaviour will become the default in a future version (probably Python
2.7).  Once absolute imports  are the default, @code{import string} will always
find the standard library’s version. It’s suggested that users should begin
using absolute imports as much as possible, so it’s preferable to begin writing
@code{from pkg import string} in your code.

Relative imports are still possible by adding a leading period  to the module
name when using the @code{from ... import} form:

@example
# Import names from pkg.string
from .string import name1, name2
# Import pkg.string
from . import string
@end example

This imports the @ref{d8,,string} module relative to the current package, so in
@code{pkg.main} this will import `name1' and `name2' from @code{pkg.string}.
Additional leading periods perform the relative import starting from the parent
of the current package.  For example, code in the @code{A.B.C} module can do:

@example
from . import D                 # Imports A.B.D
from .. import E                # Imports A.E
from ..F import G               # Imports A.F.G
@end example

Leading periods cannot be used with the @code{import modname}  form of the import
statement, only the @code{from ... import} form.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 328

@item PEP 328@footnote{https://peps.python.org/pep-0328/} - Imports: Multi-Line and Absolute/Relative

PEP written by Aahz; implemented by Thomas Wouters.

@item @indicateurl{https://pylib.readthedocs.io/}

The py library by Holger Krekel, which contains the @code{py.std} package.
@end table


@c ======================================================================

@node PEP 338 Executing Modules as Scripts,PEP 341 Unified try/except/finally,PEP 328 Absolute and Relative Imports,What’s New in Python 2 5
@anchor{whatsnew/2 5 pep-338}@anchor{1619}@anchor{whatsnew/2 5 pep-338-executing-modules-as-scripts}@anchor{161a}
@subsection PEP 338: Executing Modules as Scripts


The @ref{23e,,-m} switch added in Python 2.4 to execute a module as a script
gained a few more abilities.  Instead of being implemented in C code inside the
Python interpreter, the switch now uses an implementation in a new module,
@ref{c3,,runpy}.

The @ref{c3,,runpy} module implements a more sophisticated import mechanism so that
it’s now possible to run modules in a package such as @code{pychecker.checker}.
The module also supports alternative import mechanisms such as the
@ref{139,,zipimport} module.  This means you can add a .zip archive’s path to
@code{sys.path} and then use the @ref{23e,,-m} switch to execute code from the
archive.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 338

@item PEP 338@footnote{https://peps.python.org/pep-0338/} - Executing modules as scripts

PEP written and  implemented by Nick Coghlan.
@end table


@c ======================================================================

@node PEP 341 Unified try/except/finally,PEP 342 New Generator Features,PEP 338 Executing Modules as Scripts,What’s New in Python 2 5
@anchor{whatsnew/2 5 pep-341}@anchor{1612}@anchor{whatsnew/2 5 pep-341-unified-try-except-finally}@anchor{161b}
@subsection PEP 341: Unified try/except/finally


Until Python 2.5, the @ref{8fa,,try} statement came in two flavours. You could
use a @ref{1b1,,finally} block to ensure that code is always executed, or one or
more @ref{1ac,,except} blocks to catch  specific exceptions.  You couldn’t
combine both @code{except} blocks and a @code{finally} block, because
generating the right bytecode for the combined version was complicated and it
wasn’t clear what the semantics of the combined statement should be.

Guido van Rossum spent some time working with Java, which does support the
equivalent of combining @ref{1ac,,except} blocks and a @ref{1b1,,finally} block,
and this clarified what the statement should mean.  In Python 2.5, you can now
write:

@example
try:
    block-1 ...
except Exception1:
    handler-1 ...
except Exception2:
    handler-2 ...
else:
    else-block
finally:
    final-block
@end example

The code in `block-1' is executed.  If the code raises an exception, the various
@ref{1ac,,except} blocks are tested: if the exception is of class
@code{Exception1}, `handler-1' is executed; otherwise if it’s of class
@code{Exception2}, `handler-2' is executed, and so forth.  If no exception is
raised, the `else-block' is executed.

No matter what happened previously, the `final-block' is executed once the code
block is complete and any raised exceptions handled. Even if there’s an error in
an exception handler or the `else-block' and a new exception is raised, the code
in the `final-block' is still run.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 341

@item PEP 341@footnote{https://peps.python.org/pep-0341/} - Unifying try-except and try-finally

PEP written by Georg Brandl;  implementation by Thomas Lee.
@end table


@c ======================================================================

@node PEP 342 New Generator Features,PEP 343 The ‘with’ statement<2>,PEP 341 Unified try/except/finally,What’s New in Python 2 5
@anchor{whatsnew/2 5 pep-342}@anchor{1610}@anchor{whatsnew/2 5 pep-342-new-generator-features}@anchor{161c}
@subsection PEP 342: New Generator Features


Python 2.5 adds a simple way to pass values `into' a generator. As introduced in
Python 2.3, generators only produce output; once a generator’s code was invoked
to create an iterator, there was no way to pass any new information into the
function when its execution is resumed.  Sometimes the ability to pass in some
information would be useful.  Hackish solutions to this include making the
generator’s code look at a global variable and then changing the global
variable’s value, or passing in some mutable object that callers then modify.

To refresh your memory of basic generators, here’s a simple example:

@example
def counter (maximum):
    i = 0
    while i < maximum:
        yield i
        i += 1
@end example

When you call @code{counter(10)}, the result is an iterator that returns the values
from 0 up to 9.  On encountering the @ref{bc8,,yield} statement, the iterator
returns the provided value and suspends the function’s execution, preserving the
local variables. Execution resumes on the following call to the iterator’s
@ref{9de,,next()} method, picking up after the @code{yield} statement.

In Python 2.3, @ref{bc8,,yield} was a statement; it didn’t return any value.  In
2.5, @code{yield} is now an expression, returning a value that can be
assigned to a variable or otherwise operated on:

@example
val = (yield i)
@end example

I recommend that you always put parentheses around a @ref{bc8,,yield} expression
when you’re doing something with the returned value, as in the above example.
The parentheses aren’t always necessary, but it’s easier to always add them
instead of having to remember when they’re needed.

(
@geindex Python Enhancement Proposals; PEP 342
PEP 342@footnote{https://peps.python.org/pep-0342/} explains the exact rules, which are that a
@ref{bc8,,yield}-expression must always be parenthesized except when it
occurs at the top-level
expression on the right-hand side of an assignment.  This means you can write
@code{val = yield i} but have to use parentheses when there’s an operation, as in
@code{val = (yield i) + 12}.)

Values are sent into a generator by calling its @code{send(value)} method.  The
generator’s code is then resumed and the @ref{bc8,,yield} expression returns the
specified `value'.  If the regular @ref{9de,,next()} method is called, the
@code{yield} returns @ref{887,,None}.

Here’s the previous example, modified to allow changing the value of the
internal counter.

@example
def counter (maximum):
    i = 0
    while i < maximum:
        val = (yield i)
        # If value provided, change counter
        if val is not None:
            i = val
        else:
            i += 1
@end example

And here’s an example of changing the counter:

@example
>>> it = counter(10)
>>> print it.next()
0
>>> print it.next()
1
>>> print it.send(8)
8
>>> print it.next()
9
>>> print it.next()
Traceback (most recent call last):
  File "t.py", line 15, in ?
    print it.next()
StopIteration
@end example

@ref{bc8,,yield} will usually return @ref{887,,None}, so you should always check
for this case.  Don’t just use its value in expressions unless you’re sure that
the @code{send()} method will be the only method used to resume your generator
function.

In addition to @code{send()}, there are two other new methods on generators:


@itemize *

@item 
@code{throw(type, value=None, traceback=None)} is used to raise an exception
inside the generator; the exception is raised by the @ref{bc8,,yield} expression
where the generator’s execution is paused.

@item 
@code{close()} raises a new @ref{15d3,,GeneratorExit} exception inside the generator
to terminate the iteration.  On receiving this exception, the generator’s code
must either raise @code{GeneratorExit} or @ref{dfb,,StopIteration}.  Catching the
@code{GeneratorExit} exception and returning a value is illegal and will trigger
a @ref{246,,RuntimeError}; if the function raises some other exception, that
exception is propagated to the caller.  @code{close()} will also be called by
Python’s garbage collector when the generator is garbage-collected.

If you need to run cleanup code when a @ref{15d3,,GeneratorExit} occurs, I suggest
using a @code{try: ... finally:} suite instead of  catching @code{GeneratorExit}.
@end itemize

The cumulative effect of these changes is to turn generators from one-way
producers of information into both producers and consumers.

Generators also become `coroutines', a more generalized form of subroutines.
Subroutines are entered at one point and exited at another point (the top of the
function, and a @ref{1b0,,return} statement), but coroutines can be entered,
exited, and resumed at many different points (the @ref{bc8,,yield} statements).
We’ll have to figure out patterns for using coroutines effectively in Python.

The addition of the @code{close()} method has one side effect that isn’t obvious.
@code{close()} is called when a generator is garbage-collected, so this means the
generator’s code gets one last chance to run before the generator is destroyed.
This last chance means that @code{try...finally} statements in generators can now
be guaranteed to work; the @ref{1b1,,finally} clause will now always get a
chance to run.  The syntactic restriction that you couldn’t mix @ref{bc8,,yield}
statements with a @code{try...finally} suite has therefore been removed.  This
seems like a minor bit of language trivia, but using generators and
@code{try...finally} is actually necessary in order to implement the
@ref{187,,with} statement described by 
@geindex Python Enhancement Proposals; PEP 343
PEP 343@footnote{https://peps.python.org/pep-0343/}.  I’ll look at this new statement
in the following  section.

Another even more esoteric effect of this change: previously, the
@code{gi_frame} attribute of a generator was always a frame object. It’s now
possible for @code{gi_frame} to be @code{None} once the generator has been
exhausted.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 342

@item PEP 342@footnote{https://peps.python.org/pep-0342/} - Coroutines via Enhanced Generators

PEP written by  Guido van Rossum and Phillip J. Eby; implemented by Phillip J.
Eby.  Includes examples of  some fancier uses of generators as coroutines.

Earlier versions of these features were proposed in  
@geindex Python Enhancement Proposals; PEP 288
PEP 288@footnote{https://peps.python.org/pep-0288/} by Raymond
Hettinger and 
@geindex Python Enhancement Proposals; PEP 325
PEP 325@footnote{https://peps.python.org/pep-0325/} by Samuele Pedroni.

@item @indicateurl{https://en.wikipedia.org/wiki/Coroutine}

The Wikipedia entry for  coroutines.

@item @indicateurl{https://web.archive.org/web/20160321211320/http://www.sidhe.org/~dan/blog/archives/000178.html}

An explanation of coroutines from a Perl point of view, written by Dan Sugalski.
@end table


@c ======================================================================

@node PEP 343 The ‘with’ statement<2>,PEP 352 Exceptions as New-Style Classes,PEP 342 New Generator Features,What’s New in Python 2 5
@anchor{whatsnew/2 5 pep-343}@anchor{160f}@anchor{whatsnew/2 5 pep-343-the-with-statement}@anchor{161d}
@subsection PEP 343: The ‘with’ statement


The ‘@ref{187,,with}’ statement clarifies code that previously would use
@code{try...finally} blocks to ensure that clean-up code is executed.  In this
section, I’ll discuss the statement as it will commonly be used.  In the next
section, I’ll examine the implementation details and show how to write objects
for use with this statement.

The ‘@ref{187,,with}’ statement is a new control-flow structure whose basic
structure is:

@example
with expression [as variable]:
    with-block
@end example

The expression is evaluated, and it should result in an object that supports the
context management protocol (that is, has @ref{7e5,,__enter__()} and @ref{150c,,__exit__()}
methods.

The object’s @ref{7e5,,__enter__()} is called before `with-block' is executed and
therefore can run set-up code. It also may return a value that is bound to the
name `variable', if given.  (Note carefully that `variable' is `not' assigned
the result of `expression'.)

After execution of the `with-block' is finished, the object’s @ref{150c,,__exit__()}
method is called, even if the block raised an exception, and can therefore run
clean-up code.

To enable the statement in Python 2.5, you need to add the following directive
to your module:

@example
from __future__ import with_statement
@end example

The statement will always be enabled in Python 2.6.

Some standard Python objects now support the context management protocol and can
be used with the ‘@ref{187,,with}’ statement. File objects are one example:

@example
with open('/etc/passwd', 'r') as f:
    for line in f:
        print line
        ... more processing code ...
@end example

After this statement has executed, the file object in `f' will have been
automatically closed, even if the @ref{348,,for} loop raised an exception
part-way through the block.

@cartouche
@quotation Note 
In this case, `f' is the same object created by @ref{318,,open()}, because
@ref{7e5,,__enter__()} returns `self'.
@end quotation
@end cartouche

The @ref{f3,,threading} module’s locks and condition variables  also support the
‘@ref{187,,with}’ statement:

@example
lock = threading.Lock()
with lock:
    # Critical section of code
    ...
@end example

The lock is acquired before the block is executed and always released once  the
block is complete.

The new @code{localcontext()} function in the @ref{3a,,decimal} module makes it easy
to save and restore the current decimal context, which encapsulates the desired
precision and rounding characteristics for computations:

@example
from decimal import Decimal, Context, localcontext

# Displays with default precision of 28 digits
v = Decimal('578')
print v.sqrt()

with localcontext(Context(prec=16)):
    # All code in this block uses a precision of 16 digits.
    # The original context is restored on exiting the block.
    print v.sqrt()
@end example

@menu
* Writing Context Managers: Writing Context Managers<2>. 
* The contextlib module: The contextlib module<2>. 

@end menu

@node Writing Context Managers<2>,The contextlib module<2>,,PEP 343 The ‘with’ statement<2>
@anchor{whatsnew/2 5 new-25-context-managers}@anchor{161e}@anchor{whatsnew/2 5 writing-context-managers}@anchor{161f}
@subsubsection Writing Context Managers


Under the hood, the ‘@ref{187,,with}’ statement is fairly complicated. Most
people will only use ‘@code{with}’ in company with existing objects and
don’t need to know these details, so you can skip the rest of this section if
you like.  Authors of new objects will need to understand the details of the
underlying implementation and should keep reading.

A high-level explanation of the context management protocol is:


@itemize *

@item 
The expression is evaluated and should result in an object called a “context
manager”.  The context manager must have @ref{7e5,,__enter__()} and @ref{150c,,__exit__()}
methods.

@item 
The context manager’s @ref{7e5,,__enter__()} method is called.  The value returned
is assigned to `VAR'.  If no @code{'as VAR'} clause is present, the value is simply
discarded.

@item 
The code in `BLOCK' is executed.

@item 
If `BLOCK' raises an exception, the @code{__exit__(type, value, traceback)}
is called with the exception details, the same values returned by
@ref{89c,,sys.exc_info()}.  The method’s return value controls whether the exception
is re-raised: any false value re-raises the exception, and @code{True} will result
in suppressing it.  You’ll only rarely want to suppress the exception, because
if you do the author of the code containing the ‘@ref{187,,with}’ statement will
never realize anything went wrong.

@item 
If `BLOCK' didn’t raise an exception,  the @ref{150c,,__exit__()} method is still
called, but `type', `value', and `traceback' are all @code{None}.
@end itemize

Let’s think through an example.  I won’t present detailed code but will only
sketch the methods necessary for a database that supports transactions.

(For people unfamiliar with database terminology: a set of changes to the
database are grouped into a transaction.  Transactions can be either committed,
meaning that all the changes are written into the database, or rolled back,
meaning that the changes are all discarded and the database is unchanged.  See
any database textbook for more information.)

Let’s assume there’s an object representing a database connection. Our goal will
be to let the user write code like this:

@example
db_connection = DatabaseConnection()
with db_connection as cursor:
    cursor.execute('insert into ...')
    cursor.execute('delete from ...')
    # ... more operations ...
@end example

The transaction should be committed if the code in the block runs flawlessly or
rolled back if there’s an exception. Here’s the basic interface for
@code{DatabaseConnection} that I’ll assume:

@example
class DatabaseConnection:
    # Database interface
    def cursor (self):
        "Returns a cursor object and starts a new transaction"
    def commit (self):
        "Commits current transaction"
    def rollback (self):
        "Rolls back current transaction"
@end example

The @ref{7e5,,__enter__()} method is pretty easy, having only to start a new
transaction.  For this application the resulting cursor object would be a useful
result, so the method will return it.  The user can then add @code{as cursor} to
their ‘@ref{187,,with}’ statement to bind the cursor to a variable name.

@example
class DatabaseConnection:
    ...
    def __enter__ (self):
        # Code to start a new transaction
        cursor = self.cursor()
        return cursor
@end example

The @ref{150c,,__exit__()} method is the most complicated because it’s where most of
the work has to be done.  The method has to check if an exception occurred.  If
there was no exception, the transaction is committed.  The transaction is rolled
back if there was an exception.

In the code below, execution will just fall off the end of the function,
returning the default value of @code{None}.  @code{None} is false, so the exception
will be re-raised automatically.  If you wished, you could be more explicit and
add a @ref{1b0,,return} statement at the marked location.

@example
class DatabaseConnection:
    ...
    def __exit__ (self, type, value, tb):
        if tb is None:
            # No exception, so commit
            self.commit()
        else:
            # Exception occurred, so rollback.
            self.rollback()
            # return False
@end example

@node The contextlib module<2>,,Writing Context Managers<2>,PEP 343 The ‘with’ statement<2>
@anchor{whatsnew/2 5 contextlibmod}@anchor{1620}@anchor{whatsnew/2 5 the-contextlib-module}@anchor{1621}
@subsubsection The contextlib module


The new @ref{27,,contextlib} module provides some functions and a decorator that
are useful for writing objects for use with the ‘@ref{187,,with}’ statement.

The decorator is called @code{contextmanager()}, and lets you write a single
generator function instead of defining a new class.  The generator should yield
exactly one value.  The code up to the @ref{bc8,,yield} will be executed as the
@ref{7e5,,__enter__()} method, and the value yielded will be the method’s return
value that will get bound to the variable in the ‘@ref{187,,with}’ statement’s
@code{as} clause, if any.  The code after the @code{yield} will be
executed in the @ref{150c,,__exit__()} method.  Any exception raised in the block will
be raised by the @code{yield} statement.

Our database example from the previous section could be written  using this
decorator as:

@example
from contextlib import contextmanager

@@contextmanager
def db_transaction (connection):
    cursor = connection.cursor()
    try:
        yield cursor
    except:
        connection.rollback()
        raise
    else:
        connection.commit()

db = DatabaseConnection()
with db_transaction(db) as cursor:
    ...
@end example

The @ref{27,,contextlib} module also has a @code{nested(mgr1, mgr2, ...)} function
that combines a number of context managers so you don’t need to write nested
‘@ref{187,,with}’ statements.  In this example, the single ‘@code{with}’
statement both starts a database transaction and acquires a thread lock:

@example
lock = threading.Lock()
with nested (db_transaction(db), lock) as (cursor, locked):
    ...
@end example

Finally, the @code{closing(object)} function returns `object' so that it can be
bound to a variable, and calls @code{object.close} at the end of the block.

@example
import urllib, sys
from contextlib import closing

with closing(urllib.urlopen('http://www.yahoo.com')) as f:
    for line in f:
        sys.stdout.write(line)
@end example


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 343

@item PEP 343@footnote{https://peps.python.org/pep-0343/} - The “with” statement

PEP written by Guido van Rossum and Nick Coghlan; implemented by Mike Bland,
Guido van Rossum, and Neal Norwitz.  The PEP shows the code generated for a
‘@ref{187,,with}’ statement, which can be helpful in learning how the statement
works.
@end table

The documentation  for the @ref{27,,contextlib} module.


@c ======================================================================

@node PEP 352 Exceptions as New-Style Classes,PEP 353 Using ssize_t as the index type,PEP 343 The ‘with’ statement<2>,What’s New in Python 2 5
@anchor{whatsnew/2 5 pep-352}@anchor{1622}@anchor{whatsnew/2 5 pep-352-exceptions-as-new-style-classes}@anchor{1623}
@subsection PEP 352: Exceptions as New-Style Classes


Exception classes can now be new-style classes, not just classic classes, and
the built-in @ref{bd3,,Exception} class and all the standard built-in exceptions
(@ref{450,,NameError}, @ref{2ee,,ValueError}, etc.) are now new-style classes.

The inheritance hierarchy for exceptions has been rearranged a bit. In 2.5, the
inheritance relationships are:

@example
BaseException       # New in Python 2.5
|- KeyboardInterrupt
|- SystemExit
|- Exception
   |- (all other current built-in exceptions)
@end example

This rearrangement was done because people often want to catch all exceptions
that indicate program errors.  @ref{bcb,,KeyboardInterrupt} and @ref{f42,,SystemExit}
aren’t errors, though, and usually represent an explicit action such as the user
hitting @code{Control}-@code{C} or code calling @ref{279,,sys.exit()}.  A bare @code{except:} will
catch all exceptions, so you commonly need to list @code{KeyboardInterrupt} and
@code{SystemExit} in order to re-raise them.  The usual pattern is:

@example
try:
    ...
except (KeyboardInterrupt, SystemExit):
    raise
except:
    # Log error...
    # Continue running program...
@end example

In Python 2.5, you can now write @code{except Exception} to achieve the same
result, catching all the exceptions that usually indicate errors  but leaving
@ref{bcb,,KeyboardInterrupt} and @ref{f42,,SystemExit} alone.  As in previous versions,
a bare @code{except:} still catches all exceptions.

The goal for Python 3.0 is to require any class raised as an exception to derive
from @ref{7d8,,BaseException} or some descendant of @code{BaseException}, and future
releases in the Python 2.x series may begin to enforce this constraint.
Therefore, I suggest you begin making all your exception classes derive from
@ref{bd3,,Exception} now.  It’s been suggested that the bare @code{except:} form should
be removed in Python 3.0, but Guido van Rossum hasn’t decided whether to do this
or not.

Raising of strings as exceptions, as in the statement @code{raise "Error
occurred"}, is deprecated in Python 2.5 and will trigger a warning.  The aim is
to be able to remove the string-exception feature in a few releases.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 352

@item PEP 352@footnote{https://peps.python.org/pep-0352/} - Required Superclass for Exceptions

PEP written by  Brett Cannon and Guido van Rossum; implemented by Brett Cannon.
@end table


@c ======================================================================

@node PEP 353 Using ssize_t as the index type,PEP 357 The ‘__index__’ method,PEP 352 Exceptions as New-Style Classes,What’s New in Python 2 5
@anchor{whatsnew/2 5 pep-353}@anchor{1624}@anchor{whatsnew/2 5 pep-353-using-ssize-t-as-the-index-type}@anchor{1625}
@subsection PEP 353: Using ssize_t as the index type


A wide-ranging change to Python’s C API, using a new  @ref{c5b,,Py_ssize_t} type
definition instead of int,  will permit the interpreter to handle more
data on 64-bit platforms. This change doesn’t affect Python’s capacity on 32-bit
platforms.

Various pieces of the Python interpreter used C’s int type to store
sizes or counts; for example, the number of items in a list or tuple were stored
in an int.  The C compilers for most 64-bit platforms still define
int as a 32-bit type, so that meant that lists could only hold up to
@code{2**31 - 1} = 2147483647 items. (There are actually a few different
programming models that 64-bit C compilers can use – see
@indicateurl{https://unix.org/version2/whatsnew/lp64_wp.html} for a discussion – but the
most commonly available model leaves int as 32 bits.)

A limit of 2147483647 items doesn’t really matter on a 32-bit platform because
you’ll run out of memory before hitting the length limit. Each list item
requires space for a pointer, which is 4 bytes, plus space for a
@ref{5df,,PyObject} representing the item.  2147483647*4 is already more bytes
than a 32-bit address space can contain.

It’s possible to address that much memory on a 64-bit platform, however.  The
pointers for a list that size would only require 16 GiB of space, so it’s not
unreasonable that Python programmers might construct lists that large.
Therefore, the Python interpreter had to be changed to use some type other than
int, and this will be a 64-bit type on 64-bit platforms.  The change
will cause incompatibilities on 64-bit machines, so it was deemed worth making
the transition now, while the number of 64-bit users is still relatively small.
(In 5 or 10 years, we may `all' be on 64-bit machines, and the transition would
be more painful then.)

This change most strongly affects authors of C extension modules.   Python
strings and container types such as lists and tuples  now use
@ref{c5b,,Py_ssize_t} to store their size.   Functions such as
@ref{1626,,PyList_Size()}  now return @code{Py_ssize_t}.  Code in extension modules
may therefore need to have some variables changed to @code{Py_ssize_t}.

The @ref{3bf,,PyArg_ParseTuple()} and @ref{3c0,,Py_BuildValue()} functions have a new
conversion code, @code{n}, for @ref{c5b,,Py_ssize_t}.   @code{PyArg_ParseTuple()}’s
@code{s#} and @code{t#} still output int by default, but you can define the
macro  @code{PY_SSIZE_T_CLEAN} before including @code{Python.h}  to make
them return @code{Py_ssize_t}.

@geindex Python Enhancement Proposals; PEP 353
PEP 353@footnote{https://peps.python.org/pep-0353/} has a section on conversion guidelines that  extension authors should
read to learn about supporting 64-bit platforms.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 353

@item PEP 353@footnote{https://peps.python.org/pep-0353/} - Using ssize_t as the index type

PEP written and implemented by Martin von Löwis.
@end table


@c ======================================================================

@node PEP 357 The ‘__index__’ method,Other Language Changes<16>,PEP 353 Using ssize_t as the index type,What’s New in Python 2 5
@anchor{whatsnew/2 5 pep-357}@anchor{1627}@anchor{whatsnew/2 5 pep-357-the-index-method}@anchor{1628}
@subsection PEP 357: The ‘__index__’ method


The NumPy developers had a problem that could only be solved by adding a new
special method, @code{__index__()}.  When using slice notation, as in
@code{[start:stop:step]}, the values of the `start', `stop', and `step' indexes
must all be either integers or long integers.  NumPy defines a variety of
specialized integer types corresponding to unsigned and signed integers of 8,
16, 32, and 64 bits, but there was no way to signal that these types could be
used as slice indexes.

Slicing can’t just use the existing @code{__int__()} method because that method
is also used to implement coercion to integers.  If slicing used
@code{__int__()}, floating-point numbers would also become legal slice indexes
and that’s clearly an undesirable behaviour.

Instead, a new special method called @code{__index__()} was added.  It takes no
arguments and returns an integer giving the slice index to use.  For example:

@example
class C:
    def __index__ (self):
        return self.value
@end example

The return value must be either a Python integer or long integer. The
interpreter will check that the type returned is correct, and raises a
@ref{199,,TypeError} if this requirement isn’t met.

A corresponding @ref{1629,,nb_index} slot was added to the C-level
@ref{162a,,PyNumberMethods} structure to let C extensions implement this protocol.
@code{PyNumber_Index(obj)} can be used in extension code to call the
@code{__index__()} function and retrieve its result.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 357

@item PEP 357@footnote{https://peps.python.org/pep-0357/} - Allowing Any Object to be Used for Slicing

PEP written  and implemented by Travis Oliphant.
@end table


@c ======================================================================

@node Other Language Changes<16>,New Improved and Removed Modules,PEP 357 The ‘__index__’ method,What’s New in Python 2 5
@anchor{whatsnew/2 5 other-lang}@anchor{162b}@anchor{whatsnew/2 5 other-language-changes}@anchor{162c}
@subsection Other Language Changes


Here are all of the changes that Python 2.5 makes to the core Python language.


@itemize *

@item 
The @ref{184,,dict} type has a new hook for letting subclasses provide a default
value when a key isn’t contained in the dictionary. When a key isn’t found, the
dictionary’s @code{__missing__(key)} method will be called.  This hook is used
to implement the new @code{defaultdict} class in the @ref{1e,,collections}
module.  The following example defines a dictionary  that returns zero for any
missing key:

@example
class zerodict (dict):
    def __missing__ (self, key):
        return 0

d = zerodict(@{1:1, 2:2@})
print d[1], d[2]   # Prints 1, 2
print d[3], d[4]   # Prints 0, 0
@end example

@item 
Both 8-bit and Unicode strings have new @code{partition(sep)}  and
@code{rpartition(sep)} methods that simplify a common use case.

The @code{find(S)} method is often used to get an index which is then used to
slice the string and obtain the pieces that are before and after the separator.
@code{partition(sep)} condenses this pattern into a single method call that
returns a 3-tuple containing the substring before the separator, the separator
itself, and the substring after the separator.  If the separator isn’t found,
the first element of the tuple is the entire string and the other two elements
are empty.  @code{rpartition(sep)} also returns a 3-tuple but starts searching
from the end of the string; the @code{r} stands for ‘reverse’.

Some examples:

@example
>>> ('http://www.python.org').partition('://')
('http', '://', 'www.python.org')
>>> ('file:/usr/share/doc/index.html').partition('://')
('file:/usr/share/doc/index.html', '@w{'}, '@w{'})
>>> (u'Subject: a quick question').partition(':')
(u'Subject', u':', u' a quick question')
>>> 'www.python.org'.rpartition('.')
('www.python', '.', 'org')
>>> 'www.python.org'.rpartition(':')
('@w{'}, '@w{'}, 'www.python.org')
@end example

(Implemented by Fredrik Lundh following a suggestion by Raymond Hettinger.)

@item 
The @code{startswith()} and @code{endswith()} methods of string types now accept
tuples of strings to check for.

@example
def is_image_file (filename):
    return filename.endswith(('.gif', '.jpg', '.tiff'))
@end example

(Implemented by Georg Brandl following a suggestion by Tom Lynn.)

@c RFE #1491485

@item 
The @ref{1111,,min()} and @ref{1112,,max()} built-in functions gained a @code{key} keyword
parameter analogous to the @code{key} argument for @code{sort()}.  This parameter
supplies a function that takes a single argument and is called for every value
in the list; @code{min()}/@code{max()} will return the element with the
smallest/largest return value from this function. For example, to find the
longest string in a list, you can do:

@example
L = ['medium', 'longest', 'short']
# Prints 'longest'
print max(L, key=len)
# Prints 'short', because lexicographically 'short' has the largest value
print max(L)
@end example

(Contributed by Steven Bethard and Raymond Hettinger.)

@item 
Two new built-in functions, @ref{162d,,any()} and @ref{162e,,all()}, evaluate whether an
iterator contains any true or false values.  @code{any()} returns @ref{e0d,,True}
if any value returned by the iterator is true; otherwise it will return
@ref{d31,,False}.  @code{all()} returns @code{True} only if all of the values
returned by the iterator evaluate as true. (Suggested by Guido van Rossum, and
implemented by Raymond Hettinger.)

@item 
The result of a class’s @code{__hash__()} method can now be either a long
integer or a regular integer.  If a long integer is returned, the hash of that
value is taken.  In earlier versions the hash value was required to be a
regular integer, but in 2.5 the @ref{162f,,id()} built-in was changed to always
return non-negative numbers, and users often seem to use @code{id(self)} in
@code{__hash__()} methods (though this is discouraged).

@c Bug #1536021

@item 
ASCII is now the default encoding for modules.  It’s now  a syntax error if a
module contains string literals with 8-bit characters but doesn’t have an
encoding declaration.  In Python 2.4 this triggered a warning, not a syntax
error.  See 
@geindex Python Enhancement Proposals; PEP 263
PEP 263@footnote{https://peps.python.org/pep-0263/}  for how to declare a module’s encoding; for example, you
might add  a line like this near the top of the source file:

@example
# -*- coding: latin1 -*-
@end example

@item 
A new warning, @ref{1630,,UnicodeWarning}, is triggered when  you attempt to
compare a Unicode string and an 8-bit string  that can’t be converted to Unicode
using the default ASCII encoding.   The result of the comparison is false:

@example
>>> chr(128) == unichr(128)   # Can't convert chr(128) to Unicode
__main__:1: UnicodeWarning: Unicode equal comparison failed
  to convert both arguments to Unicode - interpreting them
  as being unequal
False
>>> chr(127) == unichr(127)   # chr(127) can be converted
True
@end example

Previously this would raise a @ref{c0e,,UnicodeDecodeError} exception, but in 2.5
this could result in puzzling problems when accessing a dictionary.  If you
looked up @code{unichr(128)} and @code{chr(128)} was being used as a key, you’d get a
@code{UnicodeDecodeError} exception.  Other changes in 2.5 resulted in this
exception being raised instead of suppressed by the code in @code{dictobject.c}
that implements dictionaries.

Raising an exception for such a comparison is strictly correct, but the change
might have broken code, so instead  @ref{1630,,UnicodeWarning} was introduced.

(Implemented by Marc-André Lemburg.)

@item 
One error that Python programmers sometimes make is forgetting to include an
@code{__init__.py} module in a package directory. Debugging this mistake can be
confusing, and usually requires running Python with the @ref{1631,,-v} switch to
log all the paths searched. In Python 2.5, a new @ref{71f,,ImportWarning} warning is
triggered when an import would have picked up a directory as a package but no
@code{__init__.py} was found.  This warning is silently ignored by default;
provide the @ref{acb,,-Wd} option when running the Python executable to display
the warning message. (Implemented by Thomas Wouters.)

@item 
The list of base classes in a class definition can now be empty.   As an
example, this is now legal:

@example
class C():
    pass
@end example

(Implemented by Brett Cannon.)
@end itemize

@c ======================================================================

@menu
* Interactive Interpreter Changes:: 
* Optimizations: Optimizations<16>. 

@end menu

@node Interactive Interpreter Changes,Optimizations<16>,,Other Language Changes<16>
@anchor{whatsnew/2 5 interactive}@anchor{1632}@anchor{whatsnew/2 5 interactive-interpreter-changes}@anchor{1633}
@subsubsection Interactive Interpreter Changes


In the interactive interpreter, @code{quit} and @code{exit}  have long been strings so
that new users get a somewhat helpful message when they try to quit:

@example
>>> quit
'Use Ctrl-D (i.e. EOF) to exit.'
@end example

In Python 2.5, @code{quit} and @code{exit} are now objects that still produce string
representations of themselves, but are also callable. Newbies who try @code{quit()}
or @code{exit()} will now exit the interpreter as they expect.  (Implemented by
Georg Brandl.)

The Python executable now accepts the standard long options  @ref{807,,--help}
and @ref{f1d,,--version}; on Windows,  it also accepts the @ref{1634,,/?} option
for displaying a help message. (Implemented by Georg Brandl.)

@c ======================================================================

@node Optimizations<16>,,Interactive Interpreter Changes,Other Language Changes<16>
@anchor{whatsnew/2 5 optimizations}@anchor{1635}@anchor{whatsnew/2 5 opts}@anchor{1636}
@subsubsection Optimizations


Several of the optimizations were developed at the NeedForSpeed sprint, an event
held in Reykjavik, Iceland, from May 21–28 2006. The sprint focused on speed
enhancements to the CPython implementation and was funded by EWT LLC with local
support from CCP Games.  Those optimizations added at this sprint are specially
marked in the following list.


@itemize *

@item 
When they were introduced  in Python 2.4, the built-in @ref{185,,set} and
@ref{7f3,,frozenset} types were built on top of Python’s dictionary type.   In 2.5
the internal data structure has been customized for implementing sets, and as a
result sets will use a third less memory and are somewhat faster. (Implemented
by Raymond Hettinger.)

@item 
The speed of some Unicode operations, such as finding substrings, string
splitting, and character map encoding and decoding, has been improved.
(Substring search and splitting improvements were added by Fredrik Lundh and
Andrew Dalke at the NeedForSpeed sprint. Character maps were improved by Walter
Dörwald and Martin von Löwis.)

@c Patch 1313939, 1359618

@item 
The @code{long(str, base)} function is now faster on long digit strings
because fewer intermediate results are calculated.  The peak is for strings of
around 800–1000 digits where  the function is 6 times faster. (Contributed by
Alan McIntyre and committed at the NeedForSpeed sprint.)

@c Patch 1442927

@item 
It’s now illegal to mix iterating over a file  with @code{for line in file} and
calling  the file object’s @code{read()}/@ref{bf,,readline()}/@code{readlines()}
methods.  Iteration uses an internal buffer and the  @code{read*()} methods
don’t use that buffer.   Instead they would return the data following the
buffer, causing the data to appear out of order.  Mixing iteration and these
methods will now trigger a @ref{2ee,,ValueError} from the @code{read*()} method.
(Implemented by Thomas Wouters.)

@c Patch 1397960

@item 
The @ref{db,,struct} module now compiles structure format  strings into an
internal representation and caches this representation, yielding a 20% speedup.
(Contributed by Bob Ippolito at the NeedForSpeed sprint.)

@item 
The @ref{be,,re} module got a 1 or 2% speedup by switching to  Python’s allocator
functions instead of the system’s  @code{malloc()} and @code{free()}.
(Contributed by Jack Diederich at the NeedForSpeed sprint.)

@item 
The code generator’s peephole optimizer now performs simple constant folding
in expressions.  If you write something like @code{a = 2+3}, the code generator
will do the arithmetic and produce code corresponding to @code{a = 5}.  (Proposed
and implemented  by Raymond Hettinger.)

@item 
Function calls are now faster because code objects now keep  the most recently
finished frame (a “zombie frame”) in an internal field of the code object,
reusing it the next time the code object is invoked.  (Original patch by Michael
Hudson, modified by Armin Rigo and Richard Jones; committed at the NeedForSpeed
sprint.)  Frame objects are also slightly smaller, which may improve cache
locality and reduce memory usage a bit.  (Contributed by Neal Norwitz.)

@c Patch 876206

@c Patch 1337051

@item 
Python’s built-in exceptions are now new-style classes, a change that speeds
up instantiation considerably.  Exception handling in Python 2.5 is therefore
about 30% faster than in 2.4. (Contributed by Richard Jones, Georg Brandl and
Sean Reifschneider at the NeedForSpeed sprint.)

@item 
Importing now caches the paths tried, recording whether  they exist or not so
that the interpreter makes fewer  @code{open()} and @code{stat()} calls on
startup. (Contributed by Martin von Löwis and Georg Brandl.)

@c Patch 921466
@end itemize

@c ======================================================================

@node New Improved and Removed Modules,Build and C API Changes<10>,Other Language Changes<16>,What’s New in Python 2 5
@anchor{whatsnew/2 5 modules}@anchor{1637}@anchor{whatsnew/2 5 new-improved-and-removed-modules}@anchor{1638}
@subsection New, Improved, and Removed Modules


The standard library received many enhancements and bug fixes in Python 2.5.
Here’s a partial list of the most notable changes, sorted alphabetically by
module name. Consult the @code{Misc/NEWS} file in the source tree for a more
complete list of changes, or look through the SVN logs for all the details.


@itemize *

@item 
The @code{audioop} module now supports the a-LAW encoding, and the code for
u-LAW encoding has been improved.  (Contributed by Lars Immisch.)

@item 
The @ref{1c,,codecs} module gained support for incremental codecs.  The
@code{codec.lookup()} function now returns a @code{CodecInfo} instance instead
of a tuple. @code{CodecInfo} instances behave like a 4-tuple to preserve
backward compatibility but also have the attributes @code{encode},
@code{decode}, @code{incrementalencoder}, @code{incrementaldecoder},
@code{streamwriter}, and @code{streamreader}.  Incremental codecs  can receive
input and produce output in multiple chunks; the output is the same as if the
entire input was fed to the non-incremental codec. See the @code{codecs} module
documentation for details. (Designed and implemented by Walter Dörwald.)

@c Patch  1436130

@item 
The @ref{1e,,collections} module gained a new type, @code{defaultdict}, that
subclasses the standard @ref{184,,dict} type.  The new type mostly behaves like a
dictionary but constructs a default value when a key isn’t present,
automatically adding it to the dictionary for the requested key value.

The first argument to @code{defaultdict}’s constructor is a factory function
that gets called whenever a key is requested but not found. This factory
function receives no arguments, so you can use built-in type constructors such
as @ref{24f,,list()} or @ref{19c,,int()}.  For example,  you can make an index of words
based on their initial letter like this:

@example
words = """Nel mezzo del cammin di nostra vita
mi ritrovai per una selva oscura
che la diritta via era smarrita""".lower().split()

index = defaultdict(list)

for w in words:
    init_letter = w[0]
    index[init_letter].append(w)
@end example

Printing @code{index} results in the following output:

@example
defaultdict(<type 'list'>, @{'c': ['cammin', 'che'], 'e': ['era'],
        'd': ['del', 'di', 'diritta'], 'm': ['mezzo', 'mi'],
        'l': ['la'], 'o': ['oscura'], 'n': ['nel', 'nostra'],
        'p': ['per'], 's': ['selva', 'smarrita'],
        'r': ['ritrovai'], 'u': ['una'], 'v': ['vita', 'via']@}
@end example

(Contributed by Guido van Rossum.)

@item 
The @code{deque} double-ended queue type supplied by the @ref{1e,,collections}
module now has a @code{remove(value)} method that removes the first occurrence
of `value' in the queue, raising @ref{2ee,,ValueError} if the value isn’t found.
(Contributed by Raymond Hettinger.)

@item 
New module: The @ref{27,,contextlib} module contains helper functions for use
with the new ‘@ref{187,,with}’ statement.  See section @ref{1620,,The contextlib module}
for more about this module.

@item 
New module: The @ref{2b,,cProfile} module is a C implementation of  the existing
@ref{b4,,profile} module that has much lower overhead. The module’s interface is
the same as @code{profile}: you run @code{cProfile.run('main()')} to profile a
function, can save profile data to a file, etc.  It’s not yet known if the
Hotshot profiler, which is also written in C but doesn’t match the
@code{profile} module’s interface, will continue to be maintained in future
versions of Python.  (Contributed by Armin Rigo.)

Also, the @ref{b5,,pstats} module for analyzing the data measured by the profiler
now supports directing the output to any file object by supplying a `stream'
argument to the @code{Stats} constructor. (Contributed by Skip Montanaro.)

@item 
The @ref{2d,,csv} module, which parses files in comma-separated value format,
received several enhancements and a number of bugfixes.  You can now set the
maximum size in bytes of a field by calling the
@code{csv.field_size_limit(new_limit)} function; omitting the `new_limit'
argument will return the currently set limit.  The @code{reader} class now has
a @code{line_num} attribute that counts the number of physical lines read from
the source; records can span multiple physical lines, so @code{line_num} is not
the same as the number of records read.

The CSV parser is now stricter about multi-line quoted fields. Previously, if a
line ended within a quoted field without a terminating newline character, a
newline would be inserted into the returned field. This behavior caused problems
when reading files that contained carriage return characters within fields, so
the code was changed to return the field without inserting newlines. As a
consequence, if newlines embedded within fields are important, the input should
be split into lines in a manner that preserves the newline characters.

(Contributed by Skip Montanaro and Andrew McNamara.)

@item 
The @ref{4e3,,datetime} class in the @ref{34,,datetime}  module now has a
@code{strptime(string, format)}  method for parsing date strings, contributed
by Josh Spoerri. It uses the same format characters as @ref{1639,,time.strptime()} and
@ref{13f5,,time.strftime()}:

@example
import datetime as dt

ts = dt.datetime.strptime('10:13:15 2006-03-07',
                          '%H:%M:%S %Y-%m-%d')
@end example

@item 
The @code{SequenceMatcher.get_matching_blocks()} method in the @ref{3b,,difflib}
module now guarantees to return a minimal list of blocks describing matching
subsequences.  Previously, the algorithm would occasionally break a block of
matching elements into two list entries. (Enhancement by Tim Peters.)

@item 
The @ref{3e,,doctest} module gained a @code{SKIP} option that keeps an example from
being executed at all.  This is intended for code snippets that are usage
examples intended for the reader and aren’t actually test cases.

An `encoding' parameter was added to the @code{testfile()} function and the
@code{DocFileSuite} class to specify the file’s encoding.  This makes it
easier to use non-ASCII characters in  tests contained within a docstring.
(Contributed by Bjorn Tillenius.)

@c Patch 1080727

@item 
The @ref{3f,,email} package has been updated to version 4.0. (Contributed by
Barry Warsaw.)

@c XXX need to provide some more detail here

@geindex universal newlines; What's new

@item 
The @ref{5f,,fileinput} module was made more flexible. Unicode filenames are now
supported, and a `mode' parameter that defaults to @code{"r"} was added to the
@ref{14e4,,input()} function to allow opening files in binary or @ref{f3b,,universal newlines} mode.  Another new parameter, `openhook', lets you use a function
other than @ref{318,,open()}  to open the input files.  Once you’re iterating over
the set of files, the @code{FileInput} object’s new @ref{163a,,fileno()} returns
the file descriptor for the currently opened file. (Contributed by Georg
Brandl.)

@item 
In the @ref{64,,gc} module, the new @code{get_count()} function returns a 3-tuple
containing the current collection counts for the three GC generations.  This is
accounting information for the garbage collector; when these counts reach a
specified threshold, a garbage collection sweep will be made.  The existing
@ref{1b5,,gc.collect()} function now takes an optional `generation' argument of 0, 1,
or 2 to specify which generation to collect. (Contributed by Barry Warsaw.)

@item 
The @code{nsmallest()} and  @code{nlargest()} functions in the @ref{6d,,heapq}
module  now support a @code{key} keyword parameter similar to the one provided by
the @ref{1111,,min()}/@ref{1112,,max()} functions and the @code{sort()} methods.  For
example:

@example
>>> import heapq
>>> L = ["short", 'medium', 'longest', 'longer still']
>>> heapq.nsmallest(2, L)  # Return two lowest elements, lexicographically
['longer still', 'longest']
>>> heapq.nsmallest(2, L, key=len)   # Return two shortest elements
['short', 'medium']
@end example

(Contributed by Raymond Hettinger.)

@item 
The @ref{d49,,itertools.islice()} function now accepts @code{None} for the start and
step arguments.  This makes it more compatible with the attributes of slice
objects, so that you can now write the following:

@example
s = slice(5)     # Create slice object
itertools.islice(iterable, s.start, s.stop, s.step)
@end example

(Contributed by Raymond Hettinger.)

@item 
The @ref{19a,,format()} function in the @ref{8a,,locale} module has been modified and
two new functions were added, @code{format_string()} and @code{currency()}.

The @ref{19a,,format()} function’s `val' parameter could previously be a string as
long as no more than one %char specifier appeared; now the parameter must be
exactly one %char specifier with no surrounding text.  An optional `monetary'
parameter was also added which, if @code{True}, will use the locale’s rules for
formatting currency in placing a separator between groups of three digits.

To format strings with multiple %char specifiers, use the new
@code{format_string()} function that works like @ref{19a,,format()} but also supports
mixing %char specifiers with arbitrary text.

A new @code{currency()} function was also added that formats a number according
to the current locale’s settings.

(Contributed by Georg Brandl.)

@c Patch 1180296

@item 
The @ref{8f,,mailbox} module underwent a massive rewrite to add the capability to
modify mailboxes in addition to reading them.  A new set of classes that include
@code{mbox}, @code{MH}, and @code{Maildir} are used to read mailboxes, and
have an @code{add(message)} method to add messages, @code{remove(key)} to
remove messages, and @code{lock()}/@code{unlock()} to lock/unlock the mailbox.
The following example converts a maildir-format mailbox into an mbox-format
one:

@example
import mailbox

# 'factory=None' uses email.Message.Message as the class representing
# individual messages.
src = mailbox.Maildir('maildir', factory=None)
dest = mailbox.mbox('/tmp/mbox')

for msg in src:
    dest.add(msg)
@end example

(Contributed by Gregory K. Johnson.  Funding was provided by Google’s 2005
Summer of Code.)

@item 
New module: the @code{msilib} module allows creating Microsoft Installer
@code{.msi} files and CAB files.  Some support for reading the @code{.msi}
database is also included. (Contributed by Martin von Löwis.)

@item 
The @code{nis} module now supports accessing domains other than the system
default domain by supplying a `domain' argument to the @code{nis.match()} and
@code{nis.maps()} functions. (Contributed by Ben Bell.)

@item 
The @ref{a3,,operator} module’s @code{itemgetter()}  and @code{attrgetter()}
functions now support multiple fields.   A call such as
@code{operator.attrgetter('a', 'b')} will return a function  that retrieves the
@code{a} and @code{b} attributes.  Combining  this new feature with the
@code{sort()} method’s @code{key} parameter  lets you easily sort lists using
multiple fields. (Contributed by Raymond Hettinger.)

@item 
The @ref{a4,,optparse} module was updated to version 1.5.1 of the Optik library.
The @code{OptionParser} class gained an @code{epilog} attribute, a string
that will be printed after the help message, and a @code{destroy()} method to
break reference cycles created by the object. (Contributed by Greg Ward.)

@item 
The @ref{a5,,os} module underwent several changes.  The @code{stat_float_times}
variable now defaults to true, meaning that @ref{26f,,os.stat()} will now return time
values as floats.  (This doesn’t necessarily mean that @code{os.stat()} will
return times that are precise to fractions of a second; not all systems support
such precision.)

Constants named @ref{1499,,os.SEEK_SET}, @ref{149a,,os.SEEK_CUR}, and
@ref{149b,,os.SEEK_END} have been added; these are the parameters to the
@ref{1323,,os.lseek()} function.  Two new constants for locking are
@ref{163b,,os.O_SHLOCK} and @ref{163c,,os.O_EXLOCK}.

Two new functions, @code{wait3()} and @code{wait4()}, were added.  They’re similar
the @code{waitpid()} function which waits for a child process to exit and returns
a tuple of the process ID and its exit status, but @code{wait3()} and
@code{wait4()} return additional information.  @code{wait3()} doesn’t take a
process ID as input, so it waits for any child process to exit and returns a
3-tuple of `process-id', `exit-status', `resource-usage' as returned from the
@ref{163d,,resource.getrusage()} function. @code{wait4(pid)} does take a process ID.
(Contributed by Chad J. Schroeder.)

On FreeBSD, the @ref{26f,,os.stat()} function now returns  times with nanosecond
resolution, and the returned object now has @code{st_gen} and
@code{st_birthtime}. The @code{st_flags} attribute is also available, if the
platform supports it. (Contributed by Antti Louko and  Diego Pettenò.)

@c (Patch 1180695, 1212117)

@item 
The Python debugger provided by the @ref{aa,,pdb} module can now store lists of
commands to execute when a breakpoint is reached and execution stops.  Once
breakpoint #1 has been created, enter @code{commands 1} and enter a series of
commands to be executed, finishing the list with @code{end}.  The command list can
include commands that resume execution, such as @code{continue} or @code{next}.
(Contributed by Grégoire Dooms.)

@c Patch 790710

@item 
The @ref{ab,,pickle} and @code{cPickle} modules no longer accept a return value
of @code{None} from the @ref{bcc,,__reduce__()} method; the method must return a tuple
of arguments instead.  The ability to return @code{None} was deprecated in Python
2.4, so this completes the removal of the feature.

@item 
The @ref{ae,,pkgutil} module, containing various utility functions for finding
packages, was enhanced to support 
@geindex Python Enhancement Proposals; PEP 302
PEP 302@footnote{https://peps.python.org/pep-0302/}’s import hooks and now also works for
packages stored in ZIP-format archives. (Contributed by Phillip J. Eby.)

@item 
The pybench benchmark suite by Marc-André Lemburg is now included in the
@code{Tools/pybench} directory.  The pybench suite is an improvement on the
commonly used @code{pystone.py} program because pybench provides a more
detailed measurement of the interpreter’s speed.  It times particular operations
such as function calls, tuple slicing, method lookups, and numeric operations,
instead of performing many different operations and reducing the result to a
single number as @code{pystone.py} does.

@item 
The @code{pyexpat} module now uses version 2.0 of the Expat parser.
(Contributed by Trent Mick.)

@item 
The @ref{15a0,,Queue} class provided by the @code{Queue} module gained two new
methods.  @code{join()} blocks until all items in the queue have been retrieved
and all processing work on the items  have been completed.  Worker threads call
the other new method,  @code{task_done()}, to signal that processing for an item
has been completed.  (Contributed by Raymond Hettinger.)

@item 
The old @code{regex} and @code{regsub} modules, which have been  deprecated
ever since Python 2.0, have finally been deleted.   Other deleted modules:
@code{statcache}, @code{tzparse}, @code{whrandom}.

@item 
Also deleted: the @code{lib-old} directory, which includes ancient modules
such as @code{dircmp} and @code{ni}, was removed.  @code{lib-old} wasn’t on the
default @code{sys.path}, so unless your programs explicitly added the directory to
@code{sys.path}, this removal shouldn’t affect your code.

@item 
The @ref{c2,,rlcompleter} module is no longer  dependent on importing the
@ref{bf,,readline} module and therefore now works on non-Unix platforms. (Patch
from Robert Kiendl.)

@c Patch #1472854

@item 
The @ref{136,,SimpleXMLRPCServer} and @code{DocXMLRPCServer}  classes now have a
@code{rpc_paths} attribute that constrains XML-RPC operations to a limited set
of URL paths; the default is to allow only @code{'/'} and @code{'/RPC2'}.  Setting
@code{rpc_paths} to @code{None} or an empty tuple disables  this path checking.

@c Bug #1473048

@item 
The @ref{d1,,socket} module now supports @code{AF_NETLINK} sockets on Linux,
thanks to a patch from Philippe Biondi.   Netlink sockets are a Linux-specific
mechanism for communications between a user-space process and kernel code; an
introductory  article about them is at @indicateurl{https://www.linuxjournal.com/article/7356}.
In Python code, netlink addresses are represented as a tuple of 2 integers,
@code{(pid, group_mask)}.

Two new methods on socket objects, @code{recv_into(buffer)} and
@code{recvfrom_into(buffer)}, store the received data in an object  that
supports the buffer protocol instead of returning the data as a string.  This
means you can put the data directly into an array or a memory-mapped file.

Socket objects also gained @code{getfamily()}, @code{gettype()}, and
@code{getproto()} accessor methods to retrieve the family, type, and protocol
values for the socket.

@item 
New module: the @code{spwd} module provides functions for accessing the shadow
password database on systems that support  shadow passwords.

@item 
The @ref{db,,struct} is now faster because it  compiles format strings into
@code{Struct} objects with @code{pack()} and @code{unpack()} methods.  This is
similar to how the @ref{be,,re} module lets you create compiled regular expression
objects.  You can still use the module-level  @code{pack()} and @code{unpack()}
functions; they’ll create  @code{Struct} objects and cache them.  Or you can
use  @code{Struct} instances directly:

@example
s = struct.Struct('ih3s')

data = s.pack(1972, 187, 'abc')
year, number, name = s.unpack(data)
@end example

You can also pack and unpack data to and from buffer objects directly using the
@code{pack_into(buffer, offset, v1, v2, ...)} and @code{unpack_from(buffer,
offset)} methods.  This lets you store data directly into an array or a
memory-mapped file.

(@code{Struct} objects were implemented by Bob Ippolito at the NeedForSpeed
sprint.  Support for buffer objects was added by Martin Blais, also at the
NeedForSpeed sprint.)

@item 
The Python developers switched from CVS to Subversion during the 2.5
development process.  Information about the exact build version is available as
the @code{sys.subversion} variable, a 3-tuple of @code{(interpreter-name, branch-name,
revision-range)}.  For example, at the time of writing my copy of 2.5 was
reporting @code{('CPython', 'trunk', '45313:45315')}.

This information is also available to C extensions via the
@ref{163e,,Py_GetBuildInfo()} function that returns a  string of build information
like this: @code{"trunk:45355:45356M, Apr 13 2006, 07:42:19"}.   (Contributed by
Barry Warsaw.)

@item 
Another new function, @ref{163f,,sys._current_frames()}, returns the current stack
frames for all running threads as a dictionary mapping thread identifiers to the
topmost stack frame currently active in that thread at the time the function is
called.  (Contributed by Tim Peters.)

@item 
The @code{TarFile} class in the @ref{e4,,tarfile} module now has an
@code{extractall()} method that extracts all members from the archive into the
current working directory.  It’s also possible to set a different directory as
the extraction target, and to unpack only a subset of the archive’s members.

The compression used for a tarfile opened in stream mode can now be autodetected
using the mode @code{'r|*'}. (Contributed by Lars Gustäbel.)

@c patch 918101

@item 
The @ref{f3,,threading} module now lets you set the stack size used when new
threads are created. The @code{stack_size([*size*])} function returns the
currently configured stack size, and supplying the optional `size' parameter
sets a new value.  Not all platforms support changing the stack size, but
Windows, POSIX threading, and OS/2 all do. (Contributed by Andrew MacIntyre.)

@c Patch 1454481

@item 
The @ref{10c,,unicodedata} module has been updated to use version 4.1.0 of the
Unicode character database.  Version 3.2.0 is required  by some specifications,
so it’s still available as  @ref{1640,,unicodedata.ucd_3_2_0}.

@item 
New module: the  @ref{117,,uuid} module generates  universally unique identifiers
(UUIDs) according to 
@geindex RFC; RFC 4122
RFC 4122@footnote{https://datatracker.ietf.org/doc/html/rfc4122.html}.  The RFC defines several different UUID
versions that are generated from a starting string, from system properties, or
purely randomly.  This module contains a @code{UUID} class and  functions
named @code{uuid1()}, @code{uuid3()}, @code{uuid4()},  and  @code{uuid5()} to
generate different versions of UUID.  (Version 2 UUIDs  are not specified in
@geindex RFC; RFC 4122
RFC 4122@footnote{https://datatracker.ietf.org/doc/html/rfc4122.html} and are not supported by this module.)

@example
>>> import uuid
>>> # make a UUID based on the host ID and current time
>>> uuid.uuid1()
UUID('a8098c1a-f86e-11da-bd1a-00112444be1e')

>>> # make a UUID using an MD5 hash of a namespace UUID and a name
>>> uuid.uuid3(uuid.NAMESPACE_DNS, 'python.org')
UUID('6fa459ea-ee8a-3ca4-894e-db77e160355e')

>>> # make a random UUID
>>> uuid.uuid4()
UUID('16fd2706-8baf-433b-82eb-8c7fada847da')

>>> # make a UUID using a SHA-1 hash of a namespace UUID and a name
>>> uuid.uuid5(uuid.NAMESPACE_DNS, 'python.org')
UUID('886313e1-3b8a-5372-9b90-0c9aee199e5d')
@end example

(Contributed by Ka-Ping Yee.)

@item 
The @ref{11b,,weakref} module’s @code{WeakKeyDictionary} and
@code{WeakValueDictionary} types gained new methods for iterating over the
weak references contained in the dictionary.  @code{iterkeyrefs()} and
@code{keyrefs()} methods were added to @code{WeakKeyDictionary}, and
@code{itervaluerefs()} and @code{valuerefs()} were added to
@code{WeakValueDictionary}.  (Contributed by Fred L. Drake, Jr.)

@item 
The @ref{11c,,webbrowser} module received a number of enhancements. It’s now
usable as a script with @code{python -m webbrowser}, taking a URL as the argument;
there are a number of switches  to control the behaviour (@code{-n} for a new
browser window,  @code{-t} for a new tab).  New module-level functions,
@code{open_new()} and @code{open_new_tab()}, were added  to support this.  The
module’s @ref{318,,open()} function supports an additional feature, an `autoraise'
parameter that signals whether to raise the open window when possible. A number
of additional browsers were added to the supported list such as Firefox, Opera,
Konqueror, and elinks.  (Contributed by Oleg Broytmann and Georg Brandl.)

@c Patch #754022

@item 
The @ref{135,,xmlrpclib} module now supports returning  @ref{4e3,,datetime} objects
for the XML-RPC date type.  Supply  @code{use_datetime=True} to the @ref{1641,,loads()}
function or the @code{Unmarshaller} class to enable this feature. (Contributed
by Skip Montanaro.)

@c Patch 1120353

@item 
The @ref{138,,zipfile} module now supports the ZIP64 version of the  format,
meaning that a .zip archive can now be larger than 4 GiB and can contain
individual files larger than 4 GiB.  (Contributed by Ronald Oussoren.)

@c Patch 1446489

@item 
The @ref{13a,,zlib} module’s @code{Compress} and @code{Decompress} objects now
support a @ref{29,,copy()} method that makes a copy of the  object’s internal state
and returns a new  @code{Compress} or @code{Decompress} object.
(Contributed by Chris AtLee.)

@c Patch 1435422
@end itemize

@c ======================================================================

@menu
* The ctypes package:: 
* The ElementTree package:: 
* The hashlib package:: 
* The sqlite3 package:: 
* The wsgiref package:: 

@end menu

@node The ctypes package,The ElementTree package,,New Improved and Removed Modules
@anchor{whatsnew/2 5 module-ctypes}@anchor{1642}@anchor{whatsnew/2 5 the-ctypes-package}@anchor{1643}
@subsubsection The ctypes package


The @ref{2e,,ctypes} package, written by Thomas Heller, has been added  to the
standard library.  @code{ctypes} lets you call arbitrary functions  in shared
libraries or DLLs.  Long-time users may remember the @code{dl} module, which
provides functions for loading shared libraries and calling functions in them.
The @code{ctypes} package is much fancier.

To load a shared library or DLL, you must create an instance of the
@code{CDLL} class and provide the name or path of the shared library or DLL.
Once that’s done, you can call arbitrary functions by accessing them as
attributes of the @code{CDLL} object.

@example
import ctypes

libc = ctypes.CDLL('libc.so.6')
result = libc.printf("Line of output\n")
@end example

Type constructors for the various C types are provided: @code{c_int()},
@code{c_float()}, @code{c_double()}, @code{c_char_p()} (equivalent to char*), and so forth.  Unlike Python’s types, the C versions are all mutable; you
can assign to their @code{value} attribute to change the wrapped value.  Python
integers and strings will be automatically converted to the corresponding C
types, but for other types you  must call the correct type constructor.  (And I
mean `must';  getting it wrong will often result in the interpreter crashing
with a segmentation fault.)

You shouldn’t use @code{c_char_p()} with a Python string when the C function will
be modifying the memory area, because Python strings are  supposed to be
immutable; breaking this rule will cause puzzling bugs.  When you need a
modifiable memory area, use @code{create_string_buffer()}:

@example
s = "this is a string"
buf = ctypes.create_string_buffer(s)
libc.strfry(buf)
@end example

C functions are assumed to return integers, but you can set the @code{restype}
attribute of the function object to  change this:

@example
>>> libc.atof('2.71828')
-1783957616
>>> libc.atof.restype = ctypes.c_double
>>> libc.atof('2.71828')
2.71828
@end example

@ref{2e,,ctypes} also provides a wrapper for Python’s C API  as the
@code{ctypes.pythonapi} object.  This object does `not'  release the global
interpreter lock before calling a function, because the lock must be held when
calling into the interpreter’s code.   There’s a @ref{1f5,,py_object} type
constructor that will create a  @ref{5df,,PyObject}* pointer.  A simple usage:

@example
import ctypes

d = @{@}
ctypes.pythonapi.PyObject_SetItem(ctypes.py_object(d),
          ctypes.py_object("abc"),  ctypes.py_object(1))
# d is now @{'abc', 1@}.
@end example

Don’t forget to use @ref{1f5,,py_object()}; if it’s omitted you end  up with a
segmentation fault.

@ref{2e,,ctypes} has been around for a while, but people still write  and
distribution hand-coded extension modules because you can’t rely on
@code{ctypes} being present. Perhaps developers will begin to write  Python
wrappers atop a library accessed through @code{ctypes} instead of extension
modules, now that @code{ctypes} is included with core Python.


@subsubheading See also



@table @asis

@item @indicateurl{https://web.archive.org/web/20180410025338/http://starship.python.net/crew/theller/ctypes/}

The pre-stdlib ctypes web page, with a tutorial, reference, and FAQ.
@end table

The documentation  for the @ref{2e,,ctypes} module.


@c ======================================================================

@node The ElementTree package,The hashlib package,The ctypes package,New Improved and Removed Modules
@anchor{whatsnew/2 5 module-etree}@anchor{1644}@anchor{whatsnew/2 5 the-elementtree-package}@anchor{1645}
@subsubsection The ElementTree package


A subset of Fredrik Lundh’s ElementTree library for processing XML has been
added to the standard library as @code{xml.etree}.  The available modules are
@code{ElementTree}, @code{ElementPath}, and @code{ElementInclude} from
ElementTree 1.2.6.    The @code{cElementTree} accelerator module is also
included.

The rest of this section will provide a brief overview of using ElementTree.
Full documentation for ElementTree is available at
@indicateurl{https://web.archive.org/web/20201124024954/http://effbot.org/zone/element-index.htm}.

ElementTree represents an XML document as a tree of element nodes. The text
content of the document is stored as the @code{text} and @code{tail}
attributes of  (This is one of the major differences between ElementTree and
the Document Object Model; in the DOM there are many different types of node,
including @code{TextNode}.)

The most commonly used parsing function is @code{parse()}, that takes either a
string (assumed to contain a filename) or a file-like object and returns an
@code{ElementTree} instance:

@example
from xml.etree import ElementTree as ET

tree = ET.parse('ex-1.xml')

feed = urllib.urlopen(
          'http://planet.python.org/rss10.xml')
tree = ET.parse(feed)
@end example

Once you have an @code{ElementTree} instance, you can call its @code{getroot()}
method to get the root @code{Element} node.

There’s also an @code{XML()} function that takes a string literal and returns an
@code{Element} node (not an @code{ElementTree}).   This function provides a
tidy way to incorporate XML fragments, approaching the convenience of an XML
literal:

@example
svg = ET.XML("""<svg width="10px" version="1.0">
             </svg>""")
svg.set('height', '320px')
svg.append(elem1)
@end example

Each XML element supports some dictionary-like and some list-like access
methods.  Dictionary-like operations are used to access attribute values, and
list-like operations are used to access child nodes.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Operation

@tab

Result

@item

@code{elem[n]}

@tab

Returns n’th child element.

@item

@code{elem[m:n]}

@tab

Returns list of m’th through n’th child
elements.

@item

@code{len(elem)}

@tab

Returns number of child elements.

@item

@code{list(elem)}

@tab

Returns list of child elements.

@item

@code{elem.append(elem2)}

@tab

Adds `elem2' as a child.

@item

@code{elem.insert(index, elem2)}

@tab

Inserts `elem2' at the specified location.

@item

@code{del elem[n]}

@tab

Deletes n’th child element.

@item

@code{elem.keys()}

@tab

Returns list of attribute names.

@item

@code{elem.get(name)}

@tab

Returns value of attribute `name'.

@item

@code{elem.set(name, value)}

@tab

Sets new value for attribute `name'.

@item

@code{elem.attrib}

@tab

Retrieves the dictionary containing
attributes.

@item

@code{del elem.attrib[name]}

@tab

Deletes attribute `name'.

@end multitable


Comments and processing instructions are also represented as @code{Element}
nodes.  To check if a node is a comment or processing instructions:

@example
if elem.tag is ET.Comment:
    ...
elif elem.tag is ET.ProcessingInstruction:
    ...
@end example

To generate XML output, you should call the @code{ElementTree.write()} method.
Like @code{parse()}, it can take either a string or a file-like object:

@example
# Encoding is US-ASCII
tree.write('output.xml')

# Encoding is UTF-8
f = open('output.xml', 'w')
tree.write(f, encoding='utf-8')
@end example

(Caution: the default encoding used for output is ASCII.  For general XML work,
where an element’s name may contain arbitrary Unicode characters, ASCII isn’t a
very useful encoding because it will raise an exception if an element’s name
contains any characters with values greater than 127.  Therefore, it’s best to
specify a different encoding such as UTF-8 that can handle any Unicode
character.)

This section is only a partial description of the ElementTree interfaces. Please
read the package’s official documentation for more details.


@subsubheading See also



@table @asis

@item @indicateurl{https://web.archive.org/web/20201124024954/http://effbot.org/zone/element-index.htm}

Official documentation for ElementTree.
@end table


@c ======================================================================

@node The hashlib package,The sqlite3 package,The ElementTree package,New Improved and Removed Modules
@anchor{whatsnew/2 5 module-hashlib}@anchor{1646}@anchor{whatsnew/2 5 the-hashlib-package}@anchor{1647}
@subsubsection The hashlib package


A new @ref{6c,,hashlib} module, written by Gregory P. Smith,  has been added to
replace the @code{md5} and @code{sha} modules.  @code{hashlib} adds support for
additional secure hashes (SHA-224, SHA-256, SHA-384, and SHA-512). When
available, the module uses OpenSSL for fast platform optimized implementations
of algorithms.

The old @code{md5} and @code{sha} modules still exist as wrappers around hashlib
to preserve backwards compatibility.  The new module’s interface is very close
to that of the old modules, but not identical. The most significant difference
is that the constructor functions for creating new hashing objects are named
differently.

@example
# Old versions
h = md5.md5()
h = md5.new()

# New version
h = hashlib.md5()

# Old versions
h = sha.sha()
h = sha.new()

# New version
h = hashlib.sha1()

# Hash that weren't previously available
h = hashlib.sha224()
h = hashlib.sha256()
h = hashlib.sha384()
h = hashlib.sha512()

# Alternative form
h = hashlib.new('md5')          # Provide algorithm as a string
@end example

Once a hash object has been created, its methods are the same as before:
@code{update(string)} hashes the specified string into the  current digest
state, @code{digest()} and @code{hexdigest()} return the digest value as a binary
string or a string of hex digits, and @ref{29,,copy()} returns a new hashing object
with the same digest state.


@subsubheading See also


The documentation  for the @ref{6c,,hashlib} module.


@c ======================================================================

@node The sqlite3 package,The wsgiref package,The hashlib package,New Improved and Removed Modules
@anchor{whatsnew/2 5 module-sqlite}@anchor{1648}@anchor{whatsnew/2 5 the-sqlite3-package}@anchor{1649}
@subsubsection The sqlite3 package


The pysqlite module (@indicateurl{https://www.pysqlite.org}), a wrapper for the SQLite embedded
database, has been added to the standard library under the package name
@ref{d4,,sqlite3}.

SQLite is a C library that provides a lightweight disk-based database that
doesn’t require a separate server process and allows accessing the database
using a nonstandard variant of the SQL query language. Some applications can use
SQLite for internal data storage.  It’s also possible to prototype an
application using SQLite and then port the code to a larger database such as
PostgreSQL or Oracle.

pysqlite was written by Gerhard Häring and provides a SQL interface compliant
with the DB-API 2.0 specification described by 
@geindex Python Enhancement Proposals; PEP 249
PEP 249@footnote{https://peps.python.org/pep-0249/}.

If you’re compiling the Python source yourself, note that the source tree
doesn’t include the SQLite code, only the wrapper module. You’ll need to have
the SQLite libraries and headers installed before compiling Python, and the
build process will compile the module when the necessary headers are available.

To use the module, you must first create a @code{Connection} object that
represents the database.  Here the data will be stored in the
@code{/tmp/example} file:

@example
conn = sqlite3.connect('/tmp/example')
@end example

You can also supply the special name @code{:memory:} to create a database in RAM.

Once you have a @code{Connection}, you can create a @code{Cursor}  object
and call its @code{execute()} method to perform SQL commands:

@example
c = conn.cursor()

# Create table
c.execute('@w{'}'create table stocks
(date text, trans text, symbol text,
 qty real, price real)'@w{'}')

# Insert a row of data
c.execute("""insert into stocks
          values ('2006-01-05','BUY','RHAT',100,35.14)""")
@end example

Usually your SQL operations will need to use values from Python variables.  You
shouldn’t assemble your query using Python’s string operations because doing so
is insecure; it makes your program vulnerable to an SQL injection attack.

Instead, use the DB-API’s parameter substitution.  Put @code{?} as a placeholder
wherever you want to use a value, and then provide a tuple of values as the
second argument to the cursor’s @code{execute()} method.  (Other database modules
may use a different placeholder, such as @code{%s} or @code{:1}.) For example:

@example
# Never do this -- insecure!
symbol = 'IBM'
c.execute("... where symbol = '%s'" % symbol)

# Do this instead
t = (symbol,)
c.execute('select * from stocks where symbol=?', t)

# Larger example
for t in (('2006-03-28', 'BUY', 'IBM', 1000, 45.00),
          ('2006-04-05', 'BUY', 'MSOFT', 1000, 72.00),
          ('2006-04-06', 'SELL', 'IBM', 500, 53.00),
         ):
    c.execute('insert into stocks values (?,?,?,?,?)', t)
@end example

To retrieve data after executing a SELECT statement, you can either  treat the
cursor as an iterator, call the cursor’s @code{fetchone()} method to retrieve a
single matching row,  or call @code{fetchall()} to get a list of the matching
rows.

This example uses the iterator form:

@example
>>> c = conn.cursor()
>>> c.execute('select * from stocks order by price')
>>> for row in c:
...    print row
...
(u'2006-01-05', u'BUY', u'RHAT', 100, 35.140000000000001)
(u'2006-03-28', u'BUY', u'IBM', 1000, 45.0)
(u'2006-04-06', u'SELL', u'IBM', 500, 53.0)
(u'2006-04-05', u'BUY', u'MSOFT', 1000, 72.0)
>>>
@end example

For more information about the SQL dialect supported by SQLite, see
@indicateurl{https://www.sqlite.org}.


@subsubheading See also



@table @asis

@item @indicateurl{https://www.pysqlite.org}

The pysqlite web page.

@item @indicateurl{https://www.sqlite.org}

The SQLite web page; the documentation describes the syntax and the available
data types for the supported SQL dialect.
@end table

The documentation  for the @ref{d4,,sqlite3} module.


@table @asis

@geindex Python Enhancement Proposals; PEP 249

@item PEP 249@footnote{https://peps.python.org/pep-0249/} - Database API Specification 2.0

PEP written by Marc-André Lemburg.
@end table


@c ======================================================================

@node The wsgiref package,,The sqlite3 package,New Improved and Removed Modules
@anchor{whatsnew/2 5 module-wsgiref}@anchor{164a}@anchor{whatsnew/2 5 the-wsgiref-package}@anchor{164b}
@subsubsection The wsgiref package


The Web Server Gateway Interface (WSGI) v1.0 defines a standard interface
between web servers and Python web applications and is described in 
@geindex Python Enhancement Proposals; PEP 333
PEP 333@footnote{https://peps.python.org/pep-0333/}.
The @ref{11f,,wsgiref} package is a reference implementation of the WSGI
specification.

@c XXX should this be in a :pep:`333` section instead?

The package includes a basic HTTP server that will run a WSGI application; this
server is useful for debugging but isn’t intended for  production use.  Setting
up a server takes only a few lines of code:

@example
from wsgiref import simple_server

wsgi_app = ...

host = '@w{'}
port = 8000
httpd = simple_server.make_server(host, port, wsgi_app)
httpd.serve_forever()
@end example

@c XXX discuss structure of WSGI applications?

@c XXX provide an example using Django or some other framework?


@subsubheading See also



@table @asis

@item @indicateurl{https://web.archive.org/web/20160331090247/http://wsgi.readthedocs.org/en/latest/}

A central web site for WSGI-related resources.

@geindex Python Enhancement Proposals; PEP 333

@item PEP 333@footnote{https://peps.python.org/pep-0333/} - Python Web Server Gateway Interface v1.0

PEP written by Phillip J. Eby.
@end table


@c ======================================================================

@node Build and C API Changes<10>,Porting to Python 2 5,New Improved and Removed Modules,What’s New in Python 2 5
@anchor{whatsnew/2 5 build-and-c-api-changes}@anchor{164c}@anchor{whatsnew/2 5 build-api}@anchor{164d}
@subsection Build and C API Changes


Changes to Python’s build process and to the C API include:


@itemize *

@item 
The Python source tree was converted from CVS to Subversion,  in a complex
migration procedure that was supervised and flawlessly carried out by Martin von
Löwis.  The procedure was developed as 
@geindex Python Enhancement Proposals; PEP 347
PEP 347@footnote{https://peps.python.org/pep-0347/}.

@item 
Coverity, a company that markets a source code analysis tool called Prevent,
provided the results of their examination of the Python source code.  The
analysis found about 60 bugs that  were quickly fixed.  Many of the bugs were
refcounting problems, often occurring in error-handling code.  See
@indicateurl{https://scan.coverity.com} for the statistics.

@item 
The largest change to the C API came from 
@geindex Python Enhancement Proposals; PEP 353
PEP 353@footnote{https://peps.python.org/pep-0353/}, which modifies the
interpreter to use a @ref{c5b,,Py_ssize_t} type definition instead of
int.  See the earlier section @ref{1624,,PEP 353; Using ssize_t as the index type} for a discussion of this
change.

@item 
The design of the bytecode compiler has changed a great deal,  no longer
generating bytecode by traversing the parse tree.  Instead the parse tree is
converted to an abstract syntax tree (or AST), and it is  the abstract syntax
tree that’s traversed to produce the bytecode.

It’s possible for Python code to obtain AST objects by using the
@ref{4b2,,compile()} built-in and specifying @code{_ast.PyCF_ONLY_AST} as the value of
the  `flags' parameter:

@example
from _ast import PyCF_ONLY_AST
ast = compile("""a=0
for i in range(10):
    a += i
""", "<string>", 'exec', PyCF_ONLY_AST)

assignment = ast.body[0]
for_loop = ast.body[1]
@end example

No official documentation has been written for the AST code yet, but 
@geindex Python Enhancement Proposals; PEP 339
PEP 339@footnote{https://peps.python.org/pep-0339/}
discusses the design.  To start learning about the code, read the definition of
the various AST nodes in @code{Parser/Python.asdl}.  A Python script reads this
file and generates a set of C structure definitions in
@code{Include/Python-ast.h}.  The @code{PyParser_ASTFromString()} and
@code{PyParser_ASTFromFile()}, defined in @code{Include/pythonrun.h}, take
Python source as input and return the root of an AST representing the contents.
This AST can then be turned into a code object by @code{PyAST_Compile()}.  For
more information, read the source code, and then ask questions on python-dev.

The AST code was developed under Jeremy Hylton’s management, and implemented by
(in alphabetical order) Brett Cannon, Nick Coghlan, Grant Edwards, John
Ehresman, Kurt Kaiser, Neal Norwitz, Tim Peters, Armin Rigo, and Neil
Schemenauer, plus the participants in a number of AST sprints at conferences
such as PyCon.

@c List of names taken from Jeremy's python-dev post at

@c https://mail.python.org/pipermail/python-dev/2005-October/057500.html

@item 
Evan Jones’s patch to obmalloc, first described in a talk at PyCon DC 2005,
was applied.  Python 2.4 allocated small objects in 256K-sized arenas, but never
freed arenas.  With this patch, Python will free arenas when they’re empty.  The
net effect is that on some platforms, when you allocate many objects, Python’s
memory usage may actually drop when you delete them and the memory may be
returned to the operating system.  (Implemented by Evan Jones, and reworked by
Tim Peters.)

Note that this change means extension modules must be more careful when
allocating memory.  Python’s API has many different functions for allocating
memory that are grouped into families.  For example, @ref{e66,,PyMem_Malloc()},
@ref{1238,,PyMem_Realloc()}, and @ref{164e,,PyMem_Free()} are one family that allocates
raw memory, while @ref{e68,,PyObject_Malloc()}, @ref{164f,,PyObject_Realloc()}, and
@ref{e65,,PyObject_Free()} are another family that’s supposed to be used for
creating Python objects.

Previously these different families all reduced to the platform’s
@code{malloc()} and @code{free()} functions.  This meant  it didn’t matter if
you got things wrong and allocated memory with the @code{PyMem} function but
freed it with the @code{PyObject} function.  With 2.5’s changes to obmalloc,
these families now do different things and mismatches will probably result in a
segfault.  You should carefully test your C extension modules with Python 2.5.

@item 
The built-in set types now have an official C API.  Call @ref{1650,,PySet_New()}
and @ref{1651,,PyFrozenSet_New()} to create a new set, @ref{1652,,PySet_Add()} and
@ref{1653,,PySet_Discard()} to add and remove elements, and @ref{1654,,PySet_Contains()}
and @ref{1655,,PySet_Size()} to examine the set’s state. (Contributed by Raymond
Hettinger.)

@item 
C code can now obtain information about the exact revision of the Python
interpreter by calling the  @ref{163e,,Py_GetBuildInfo()} function that returns a
string of build information like this: @code{"trunk:45355:45356M, Apr 13 2006,
07:42:19"}.   (Contributed by Barry Warsaw.)

@item 
Two new macros can be used to indicate C functions that are local to the
current file so that a faster calling convention can be used.
@ref{1656,,Py_LOCAL} declares the function as returning a value of the
specified `type' and uses a fast-calling qualifier.
@ref{1657,,Py_LOCAL_INLINE} does the same thing and also requests the
function be inlined.  If macro @code{PY_LOCAL_AGGRESSIVE} is defined before
@code{python.h} is included, a set of more aggressive optimizations are enabled
for the module; you should benchmark the results to find out if these
optimizations actually make the code faster.  (Contributed by Fredrik Lundh at
the NeedForSpeed sprint.)

@item 
@code{PyErr_NewException(name, base, dict)} can now accept a tuple of base
classes as its `base' argument.  (Contributed by Georg Brandl.)

@item 
The @code{PyErr_Warn()} function for issuing warnings is now deprecated in
favour of @code{PyErr_WarnEx(category, message, stacklevel)} which lets you
specify the number of stack frames separating this function and the caller.  A
`stacklevel' of 1 is the function calling @ref{1658,,PyErr_WarnEx()}, 2 is the
function above that, and so forth.  (Added by Neal Norwitz.)

@item 
The CPython interpreter is still written in C, but  the code can now be
compiled with a C++ compiler without errors.   (Implemented by Anthony Baxter,
Martin von Löwis, Skip Montanaro.)

@item 
The @code{PyRange_New()} function was removed.  It was never documented, never
used in the core code, and had dangerously lax error checking.  In the unlikely
case that your extensions were using it, you can replace it by something like
the following:

@example
range = PyObject_CallFunction((PyObject*) &PyRange_Type, "lll",
                              start, stop, step);
@end example
@end itemize

@c ======================================================================

@menu
* Port-Specific Changes:: 

@end menu

@node Port-Specific Changes,,,Build and C API Changes<10>
@anchor{whatsnew/2 5 port-specific-changes}@anchor{1659}@anchor{whatsnew/2 5 ports}@anchor{165a}
@subsubsection Port-Specific Changes



@itemize *

@item 
MacOS X (10.3 and higher): dynamic loading of modules now uses the
@code{dlopen()} function instead of MacOS-specific functions.

@item 
MacOS X: an @code{--enable-universalsdk} switch was added to the
@code{configure} script that compiles the interpreter as a universal binary
able to run on both PowerPC and Intel processors. (Contributed by Ronald
Oussoren; bpo-2573@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2573}.)

@item 
Windows: @code{.dll} is no longer supported as a filename extension for
extension modules.  @code{.pyd} is now the only filename extension that will be
searched for.
@end itemize

@c ======================================================================

@node Porting to Python 2 5,Acknowledgements<3>,Build and C API Changes<10>,What’s New in Python 2 5
@anchor{whatsnew/2 5 porting}@anchor{165b}@anchor{whatsnew/2 5 porting-to-python-2-5}@anchor{165c}
@subsection Porting to Python 2.5


This section lists previously described changes that may require changes to your
code:


@itemize *

@item 
ASCII is now the default encoding for modules.  It’s now  a syntax error if a
module contains string literals with 8-bit characters but doesn’t have an
encoding declaration.  In Python 2.4 this triggered a warning, not a syntax
error.

@item 
Previously, the @code{gi_frame} attribute of a generator was always a frame
object.  Because of the 
@geindex Python Enhancement Proposals; PEP 342
PEP 342@footnote{https://peps.python.org/pep-0342/} changes described in section @ref{1610,,PEP 342; New Generator Features},
it’s now possible for @code{gi_frame} to be @code{None}.

@item 
A new warning, @ref{1630,,UnicodeWarning}, is triggered when  you attempt to
compare a Unicode string and an 8-bit string that can’t be converted to Unicode
using the default ASCII encoding.  Previously such comparisons would raise a
@ref{c0e,,UnicodeDecodeError} exception.

@item 
Library: the @ref{2d,,csv} module is now stricter about multi-line quoted fields.
If your files contain newlines embedded within fields, the input should be split
into lines in a manner which preserves the newline characters.

@item 
Library: the @ref{8a,,locale} module’s  @ref{19a,,format()} function’s would
previously  accept any string as long as no more than one %char specifier
appeared.  In Python 2.5, the argument must be exactly one %char specifier with
no surrounding text.

@item 
Library: The @ref{ab,,pickle} and @code{cPickle} modules no longer accept a
return value of @code{None} from the @ref{bcc,,__reduce__()} method; the method must
return a tuple of arguments instead.  The modules also no longer accept the
deprecated `bin' keyword parameter.

@item 
Library: The @ref{136,,SimpleXMLRPCServer} and @code{DocXMLRPCServer}  classes now
have a @code{rpc_paths} attribute that constrains XML-RPC operations to a
limited set of URL paths; the default is to allow only @code{'/'} and @code{'/RPC2'}.
Setting  @code{rpc_paths} to @code{None} or an empty tuple disables  this path
checking.

@item 
C API: Many functions now use @ref{c5b,,Py_ssize_t}  instead of int to
allow processing more data on 64-bit machines.  Extension code may need to make
the same change to avoid warnings and to support 64-bit machines.  See the
earlier section @ref{1624,,PEP 353; Using ssize_t as the index type} for a discussion of this change.

@item 
C API:  The obmalloc changes mean that  you must be careful to not mix usage
of the @code{PyMem_*} and @code{PyObject_*} families of functions. Memory
allocated with  one family’s @code{*_Malloc} must be  freed with the
corresponding family’s @code{*_Free} function.
@end itemize

@c ======================================================================

@node Acknowledgements<3>,,Porting to Python 2 5,What’s New in Python 2 5
@anchor{whatsnew/2 5 acknowledgements}@anchor{165d}
@subsection Acknowledgements


The author would like to thank the following people for offering suggestions,
corrections and assistance with various drafts of this article: Georg Brandl,
Nick Coghlan, Phillip J. Eby, Lars Gustäbel, Raymond Hettinger, Ralf W.
Grosse-Kunstleve, Kent Johnson, Iain Lowe, Martin von Löwis, Fredrik Lundh, Andrew
McNamara, Skip Montanaro, Gustavo Niemeyer, Paul Prescod, James Pryor, Mike
Rovner, Scott Weikart, Barry Warsaw, Thomas Wouters.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node What’s New in Python 2 4,What’s New in Python 2 3,What’s New in Python 2 5,What’s New in Python
@anchor{whatsnew/2 4 doc}@anchor{165e}@anchor{whatsnew/2 4 translation-repo}@anchor{165f}@anchor{whatsnew/2 4 what-s-new-in-python-2-4}@anchor{1660}
@section What’s New in Python 2.4


@*Author: 
A.M. Kuchling


@c $Id: whatsnew24.tex 54632 2007-03-31 11:59:54Z georg.brandl $

@c Don't write extensive text for new sections; I'll do that.

@c Feel free to add commented-out reminders of things that need

@c to be covered.  --amk

This article explains the new features in Python 2.4.1, released on March 30,
2005.

Python 2.4 is a medium-sized release.  It doesn’t introduce as many changes as
the radical Python 2.2, but introduces more features than the conservative 2.3
release.  The most significant new language features are function decorators and
generator expressions; most other changes are to the standard library.

According to the CVS change logs, there were 481 patches applied and 502 bugs
fixed between Python 2.3 and 2.4.  Both figures are likely to be underestimates.

This article doesn’t attempt to provide a complete specification of every single
new feature, but instead provides a brief introduction to each feature.  For
full details, you should refer to the documentation for Python 2.4, such as the
Python Library Reference and the Python Reference Manual.  Often you will be
referred to the PEP for a particular new feature for explanations of the
implementation and design rationale.

@c ======================================================================

@menu
* PEP 218; Built-In Set Objects: PEP 218 Built-In Set Objects. 
* PEP 237; Unifying Long Integers and Integers: PEP 237 Unifying Long Integers and Integers. 
* PEP 289; Generator Expressions: PEP 289 Generator Expressions. 
* PEP 292; Simpler String Substitutions: PEP 292 Simpler String Substitutions. 
* PEP 318; Decorators for Functions and Methods: PEP 318 Decorators for Functions and Methods. 
* PEP 322; Reverse Iteration: PEP 322 Reverse Iteration. 
* PEP 324; New subprocess Module: PEP 324 New subprocess Module. 
* PEP 327; Decimal Data Type: PEP 327 Decimal Data Type. 
* PEP 328; Multi-line Imports: PEP 328 Multi-line Imports. 
* PEP 331; Locale-Independent Float/String Conversions: PEP 331 Locale-Independent Float/String Conversions. 
* Other Language Changes: Other Language Changes<17>. 
* New@comma{} Improved@comma{} and Deprecated Modules: New Improved and Deprecated Modules<3>. 
* Build and C API Changes: Build and C API Changes<11>. 
* Porting to Python 2.4: Porting to Python 2 4. 
* Acknowledgements: Acknowledgements<4>. 

@end menu

@node PEP 218 Built-In Set Objects,PEP 237 Unifying Long Integers and Integers,,What’s New in Python 2 4
@anchor{whatsnew/2 4 pep-218-built-in-set-objects}@anchor{1661}
@subsection PEP 218: Built-In Set Objects


Python 2.3 introduced the @code{sets} module.  C implementations of set data
types have now been added to the Python core as two new built-in types,
@code{set(iterable)} and @code{frozenset(iterable)}.  They provide high speed
operations for membership testing, for eliminating duplicates from sequences,
and for mathematical operations like unions, intersections, differences, and
symmetric differences.

@example
>>> a = set('abracadabra')              # form a set from a string
>>> 'z' in a                            # fast membership testing
False
>>> a                                   # unique letters in a
set(['a', 'r', 'b', 'c', 'd'])
>>> '@w{'}.join(a)                          # convert back into a string
'arbcd'

>>> b = set('alacazam')                 # form a second set
>>> a - b                               # letters in a but not in b
set(['r', 'd', 'b'])
>>> a | b                               # letters in either a or b
set(['a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'])
>>> a & b                               # letters in both a and b
set(['a', 'c'])
>>> a ^ b                               # letters in a or b but not both
set(['r', 'd', 'b', 'm', 'z', 'l'])

>>> a.add('z')                          # add a new element
>>> a.update('wxy')                     # add multiple new elements
>>> a
set(['a', 'c', 'b', 'd', 'r', 'w', 'y', 'x', 'z'])
>>> a.remove('x')                       # take one element out
>>> a
set(['a', 'c', 'b', 'd', 'r', 'w', 'y', 'z'])
@end example

The @ref{7f3,,frozenset()} type is an immutable version of @ref{185,,set()}. Since it is
immutable and hashable, it may be used as a dictionary key or as a member of
another set.

The @code{sets} module remains in the standard library, and may be useful if you
wish to subclass the @code{Set} or @code{ImmutableSet} classes.  There are
currently no plans to deprecate the module.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 218

@item PEP 218@footnote{https://peps.python.org/pep-0218/} - Adding a Built-In Set Object Type

Originally proposed by Greg Wilson and ultimately implemented by Raymond
Hettinger.
@end table


@c ======================================================================

@node PEP 237 Unifying Long Integers and Integers,PEP 289 Generator Expressions,PEP 218 Built-In Set Objects,What’s New in Python 2 4
@anchor{whatsnew/2 4 pep-237-unifying-long-integers-and-integers}@anchor{1662}
@subsection PEP 237: Unifying Long Integers and Integers


The lengthy transition process for this PEP, begun in Python 2.2, takes another
step forward in Python 2.4.  In 2.3, certain integer operations that would
behave differently after int/long unification triggered @ref{659,,FutureWarning}
warnings and returned values limited to 32 or 64 bits (depending on your
platform).  In 2.4, these expressions no longer produce a warning and instead
produce a different result that’s usually a long integer.

The problematic expressions are primarily left shifts and lengthy hexadecimal
and octal constants.  For example, @code{2 << 32} results in a warning in 2.3,
evaluating to 0 on 32-bit platforms.  In Python 2.4, this expression now returns
the correct answer, 8589934592.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 237

@item PEP 237@footnote{https://peps.python.org/pep-0237/} - Unifying Long Integers and Integers

Original PEP written by Moshe Zadka and GvR.  The changes for 2.4 were
implemented by  Kalle Svensson.
@end table


@c ======================================================================

@node PEP 289 Generator Expressions,PEP 292 Simpler String Substitutions,PEP 237 Unifying Long Integers and Integers,What’s New in Python 2 4
@anchor{whatsnew/2 4 pep-289-generator-expressions}@anchor{1663}
@subsection PEP 289: Generator Expressions


The iterator feature introduced in Python 2.2 and the @ref{85,,itertools} module
make it easier to write programs that loop through large data sets without
having the entire data set in memory at one time.  List comprehensions don’t fit
into this picture very well because they produce a Python list object containing
all of the items.  This unavoidably pulls all of the objects into memory, which
can be a problem if your data set is very large.  When trying to write a
functionally styled program, it would be natural to write something like:

@example
links = [link for link in get_all_links() if not link.followed]
for link in links:
    ...
@end example

instead of

@example
for link in get_all_links():
    if link.followed:
        continue
    ...
@end example

The first form is more concise and perhaps more readable, but if you’re dealing
with a large number of link objects you’d have to write the second form to avoid
having all link objects in memory at the same time.

Generator expressions work similarly to list comprehensions but don’t
materialize the entire list; instead they create a generator that will return
elements one by one.  The above example could be written as:

@example
links = (link for link in get_all_links() if not link.followed)
for link in links:
    ...
@end example

Generator expressions always have to be written inside parentheses, as in the
above example.  The parentheses signalling a function call also count, so if you
want to create an iterator that will be immediately passed to a function you
could write:

@example
print sum(obj.count for obj in list_all_objects())
@end example

Generator expressions differ from list comprehensions in various small ways.
Most notably, the loop variable (`obj' in the above example) is not accessible
outside of the generator expression.  List comprehensions leave the variable
assigned to its last value; future versions of Python will change this, making
list comprehensions match generator expressions in this respect.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 289

@item PEP 289@footnote{https://peps.python.org/pep-0289/} - Generator Expressions

Proposed by Raymond Hettinger and implemented by Jiwon Seo with early efforts
steered by Hye-Shik Chang.
@end table


@c ======================================================================

@node PEP 292 Simpler String Substitutions,PEP 318 Decorators for Functions and Methods,PEP 289 Generator Expressions,What’s New in Python 2 4
@anchor{whatsnew/2 4 pep-292-simpler-string-substitutions}@anchor{1664}
@subsection PEP 292: Simpler String Substitutions


Some new classes in the standard library provide an alternative mechanism for
substituting variables into strings; this style of substitution may be better
for applications where untrained users need to edit templates.

The usual way of substituting variables by name is the @code{%} operator:

@example
>>> '%(page)i: %(title)s' % @{'page':2, 'title': 'The Best of Times'@}
'2: The Best of Times'
@end example

When writing the template string, it can be easy to forget the @code{i} or @code{s}
after the closing parenthesis.  This isn’t a big problem if the template is in a
Python module, because you run the code, get an “Unsupported format character”
@ref{2ee,,ValueError}, and fix the problem.  However, consider an application such
as Mailman where template strings or translations are being edited by users who
aren’t aware of the Python language.  The format string’s syntax is complicated
to explain to such users, and if they make a mistake, it’s difficult to provide
helpful feedback to them.

PEP 292 adds a @code{Template} class to the @ref{d8,,string} module that uses
@code{$} to indicate a substitution:

@example
>>> import string
>>> t = string.Template('$page: $title')
>>> t.substitute(@{'page':2, 'title': 'The Best of Times'@})
'2: The Best of Times'
@end example

If a key is missing from the dictionary, the @code{substitute()} method will
raise a @ref{5e7,,KeyError}.  There’s also a @code{safe_substitute()} method that
ignores missing keys:

@example
>>> t = string.Template('$page: $title')
>>> t.safe_substitute(@{'page':3@})
'3: $title'
@end example


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 292

@item PEP 292@footnote{https://peps.python.org/pep-0292/} - Simpler String Substitutions

Written and implemented  by Barry Warsaw.
@end table


@c ======================================================================

@node PEP 318 Decorators for Functions and Methods,PEP 322 Reverse Iteration,PEP 292 Simpler String Substitutions,What’s New in Python 2 4
@anchor{whatsnew/2 4 pep-318-decorators-for-functions-and-methods}@anchor{1665}
@subsection PEP 318: Decorators for Functions and Methods


Python 2.2 extended Python’s object model by adding static methods and class
methods, but it didn’t extend Python’s syntax to provide any new way of defining
static or class methods.  Instead, you had to write a @ref{1666,,def} statement
in the usual way, and pass the resulting method to a @ref{451,,staticmethod()} or
@ref{48f,,classmethod()} function that would wrap up the function as a method of the
new type. Your code would look like this:

@example
class C:
   def meth (cls):
       ...

   meth = classmethod(meth)   # Rebind name to wrapped-up class method
@end example

If the method was very long, it would be easy to miss or forget the
@ref{48f,,classmethod()} invocation after the function body.

The intention was always to add some syntax to make such definitions more
readable, but at the time of 2.2’s release a good syntax was not obvious.  Today
a good syntax `still' isn’t obvious but users are asking for easier access to
the feature; a new syntactic feature has been added to meet this need.

The new feature is called “function decorators”.  The name comes from the idea
that @ref{48f,,classmethod()}, @ref{451,,staticmethod()}, and friends are storing
additional information on a function object; they’re `decorating' functions with
more details.

The notation borrows from Java and uses the @code{'@@'} character as an indicator.
Using the new syntax, the example above would be written:

@example
class C:

   @@classmethod
   def meth (cls):
       ...
@end example

The @code{@@classmethod} is shorthand for the @code{meth=classmethod(meth)} assignment.
More generally, if you have the following:

@example
@@A
@@B
@@C
def f ():
    ...
@end example

It’s equivalent to the following pre-decorator code:

@example
def f(): ...
f = A(B(C(f)))
@end example

Decorators must come on the line before a function definition, one decorator per
line, and can’t be on the same line as the def statement, meaning that @code{@@A def
f(): ...} is illegal.  You can only decorate function definitions, either at
the module level or inside a class; you can’t decorate class definitions.

A decorator is just a function that takes the function to be decorated as an
argument and returns either the same function or some new object.  The return
value of the decorator need not be callable (though it typically is), unless
further decorators will be applied to the result.  It’s easy to write your own
decorators.  The following simple example just sets an attribute on the function
object:

@example
>>> def deco(func):
...    func.attr = 'decorated'
...    return func
...
>>> @@deco
... def f(): pass
...
>>> f
<function f at 0x402ef0d4>
>>> f.attr
'decorated'
>>>
@end example

As a slightly more realistic example, the following decorator checks that the
supplied argument is an integer:

@example
def require_int (func):
    def wrapper (arg):
        assert isinstance(arg, int)
        return func(arg)

    return wrapper

@@require_int
def p1 (arg):
    print arg

@@require_int
def p2(arg):
    print arg*2
@end example

An example in 
@geindex Python Enhancement Proposals; PEP 318
PEP 318@footnote{https://peps.python.org/pep-0318/} contains a fancier version of this idea that lets you
both specify the required type and check the returned type.

Decorator functions can take arguments.  If arguments are supplied, your
decorator function is called with only those arguments and must return a new
decorator function; this function must take a single function and return a
function, as previously described.  In other words, @code{@@A @@B @@C(args)} becomes:

@example
def f(): ...
_deco = C(args)
f = A(B(_deco(f)))
@end example

Getting this right can be slightly brain-bending, but it’s not too difficult.

A small related change makes the @ref{14e0,,func_name}
attribute of functions
writable.  This attribute is used to display function names in tracebacks, so
decorators should change the name of any new function that’s constructed and
returned.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 318

@item PEP 318@footnote{https://peps.python.org/pep-0318/} - Decorators for Functions, Methods and Classes

Written  by Kevin D. Smith, Jim Jewett, and Skip Montanaro.  Several people
wrote patches implementing function decorators, but the one that was actually
checked in was patch #979728, written by Mark Russell.

@item @indicateurl{https://wiki.python.org/moin/PythonDecoratorLibrary}

This Wiki page contains several examples of decorators.
@end table


@c ======================================================================

@node PEP 322 Reverse Iteration,PEP 324 New subprocess Module,PEP 318 Decorators for Functions and Methods,What’s New in Python 2 4
@anchor{whatsnew/2 4 pep-322-reverse-iteration}@anchor{1667}
@subsection PEP 322: Reverse Iteration


A new built-in function, @code{reversed(seq)}, takes a sequence and returns an
iterator that loops over the elements of the sequence  in reverse order.

@example
>>> for i in reversed(xrange(1,4)):
...    print i
...
3
2
1
@end example

Compared to extended slicing, such as @code{range(1,4)[::-1]}, @ref{a6b,,reversed()} is
easier to read, runs faster, and uses substantially less memory.

Note that @ref{a6b,,reversed()} only accepts sequences, not arbitrary iterators.  If
you want to reverse an iterator, first convert it to  a list with @ref{24f,,list()}.

@example
>>> input = open('/etc/passwd', 'r')
>>> for line in reversed(list(input)):
...   print line
...
root:*:0:0:System Administrator:/var/root:/bin/tcsh
  ...
@end example


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 322

@item PEP 322@footnote{https://peps.python.org/pep-0322/} - Reverse Iteration

Written and implemented by Raymond Hettinger.
@end table


@c ======================================================================

@node PEP 324 New subprocess Module,PEP 327 Decimal Data Type,PEP 322 Reverse Iteration,What’s New in Python 2 4
@anchor{whatsnew/2 4 pep-324-new-subprocess-module}@anchor{1668}
@subsection PEP 324: New subprocess Module


The standard library provides a number of ways to execute a subprocess, offering
different features and different levels of complexity.
@code{os.system(command)} is easy to use, but slow (it runs a shell process
which executes the command) and dangerous (you have to be careful about escaping
the shell’s metacharacters).  The @code{popen2} module offers classes that can
capture standard output and standard error from the subprocess, but the naming
is confusing.  The @ref{dc,,subprocess} module cleans  this up, providing a unified
interface that offers all the features you might need.

Instead of @code{popen2}’s collection of classes, @ref{dc,,subprocess} contains a
single class called @ref{4b8,,subprocess.Popen}  whose constructor supports a number of
different keyword arguments.

@example
class Popen(args, bufsize=0, executable=None,
            stdin=None, stdout=None, stderr=None,
            preexec_fn=None, close_fds=False, shell=False,
            cwd=None, env=None, universal_newlines=False,
            startupinfo=None, creationflags=0):
@end example

`args' is commonly a sequence of strings that will be the arguments to the
program executed as the subprocess.  (If the `shell' argument is true, `args'
can be a string which will then be passed on to the shell for interpretation,
just as @ref{1669,,os.system()} does.)

`stdin', `stdout', and `stderr' specify what the subprocess’s input, output, and
error streams will be.  You can provide a file object or a file descriptor, or
you can use the constant @code{subprocess.PIPE} to create a pipe between the
subprocess and the parent.

@geindex universal newlines; What's new

The constructor has a number of handy options:


@itemize *

@item 
`close_fds' requests that all file descriptors be closed before running the
subprocess.

@item 
`cwd' specifies the working directory in which the subprocess will be executed
(defaulting to whatever the parent’s working directory is).

@item 
`env' is a dictionary specifying environment variables.

@item 
`preexec_fn' is a function that gets called before the child is started.

@item 
`universal_newlines' opens the child’s input and output using Python’s
@ref{f3b,,universal newlines} feature.
@end itemize

Once you’ve created the @code{Popen} instance,  you can call its @code{wait()}
method to pause until the subprocess has exited, @code{poll()} to check if it’s
exited without pausing,  or @code{communicate(data)} to send the string `data'
to the subprocess’s standard input.   @code{communicate(data)}  then reads any
data that the subprocess has sent to its standard output  or standard error,
returning a tuple @code{(stdout_data, stderr_data)}.

@code{call()} is a shortcut that passes its arguments along to the @code{Popen}
constructor, waits for the command to complete, and returns the status code of
the subprocess.  It can serve as a safer analog to @ref{1669,,os.system()}:

@example
sts = subprocess.call(['dpkg', '-i', '/tmp/new-package.deb'])
if sts == 0:
    # Success
    ...
else:
    # dpkg returned an error
    ...
@end example

The command is invoked without use of the shell.  If you really do want to  use
the shell, you can add @code{shell=True} as a keyword argument and provide a string
instead of a sequence:

@example
sts = subprocess.call('dpkg -i /tmp/new-package.deb', shell=True)
@end example

The PEP takes various examples of shell and Python code and shows how they’d be
translated into Python code that uses @ref{dc,,subprocess}.  Reading this section
of the PEP is highly recommended.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 324

@item PEP 324@footnote{https://peps.python.org/pep-0324/} - subprocess - New process module

Written and implemented by Peter Åstrand, with assistance from Fredrik Lundh and
others.
@end table


@c ======================================================================

@node PEP 327 Decimal Data Type,PEP 328 Multi-line Imports,PEP 324 New subprocess Module,What’s New in Python 2 4
@anchor{whatsnew/2 4 pep-327-decimal-data-type}@anchor{166a}
@subsection PEP 327: Decimal Data Type


Python has always supported floating-point (FP) numbers, based on the underlying
C double type, as a data type.  However, while most programming
languages provide a floating-point type, many people (even programmers) are
unaware that floating-point numbers don’t represent certain decimal fractions
accurately.  The new @code{Decimal} type can represent these fractions
accurately, up to a user-specified precision limit.

@menu
* Why is Decimal needed?:: 
* The Decimal type:: 
* The Context type:: 

@end menu

@node Why is Decimal needed?,The Decimal type,,PEP 327 Decimal Data Type
@anchor{whatsnew/2 4 why-is-decimal-needed}@anchor{166b}
@subsubsection Why is Decimal needed?


The limitations arise from the representation used for floating-point numbers.
FP numbers are made up of three components:


@itemize *

@item 
The sign, which is positive or negative.

@item 
The mantissa, which is a single-digit binary number   followed by a fractional
part.  For example, @code{1.01} in base-2 notation is @code{1 + 0/2 + 1/4}, or 1.25 in
decimal notation.

@item 
The exponent, which tells where the decimal point is located in the number
represented.
@end itemize

For example, the number 1.25 has positive sign, a mantissa value of 1.01 (in
binary), and an exponent of 0 (the decimal point doesn’t need to be shifted).
The number 5 has the same sign and mantissa, but the exponent is 2 because the
mantissa is multiplied by 4 (2 to the power of the exponent 2); 1.25 * 4 equals
5.

Modern systems usually provide floating-point support that conforms to a
standard called IEEE 754.  C’s double type is usually implemented as a
64-bit IEEE 754 number, which uses 52 bits of space for the mantissa.  This
means that numbers can only be specified to 52 bits of precision.  If you’re
trying to represent numbers whose expansion repeats endlessly, the expansion is
cut off after 52 bits. Unfortunately, most software needs to produce output in
base 10, and common fractions in base 10 are often repeating decimals in binary.
For example, 1.1 decimal is binary @code{1.0001100110011 ...}; .1 = 1/16 + 1/32 +
1/256 plus an infinite number of additional terms.  IEEE 754 has to chop off
that infinitely repeated decimal after 52 digits, so the representation is
slightly inaccurate.

Sometimes you can see this inaccuracy when the number is printed:

@example
>>> 1.1
1.1000000000000001
@end example

The inaccuracy isn’t always visible when you print the number because the
FP-to-decimal-string conversion is provided by the C library, and most C libraries try
to produce sensible output.  Even if it’s not displayed, however, the inaccuracy
is still there and subsequent operations can magnify the error.

For many applications this doesn’t matter.  If I’m plotting points and
displaying them on my monitor, the difference between 1.1 and 1.1000000000000001
is too small to be visible.  Reports often limit output to a certain number of
decimal places, and if you round the number to two or three or even eight
decimal places, the error is never apparent.  However, for applications where it
does matter,  it’s a lot of work to implement your own custom arithmetic
routines.

Hence, the @code{Decimal} type was created.

@node The Decimal type,The Context type,Why is Decimal needed?,PEP 327 Decimal Data Type
@anchor{whatsnew/2 4 the-decimal-type}@anchor{166c}
@subsubsection The @code{Decimal} type


A new module, @ref{3a,,decimal}, was added to Python’s standard library.  It
contains two classes, @code{Decimal} and @code{Context}.  @code{Decimal}
instances represent numbers, and @code{Context} instances are used to wrap up
various settings such as the precision and default rounding mode.

@code{Decimal} instances are immutable, like regular Python integers and FP
numbers; once it’s been created, you can’t change the value an instance
represents.  @code{Decimal} instances can be created from integers or
strings:

@example
>>> import decimal
>>> decimal.Decimal(1972)
Decimal("1972")
>>> decimal.Decimal("1.1")
Decimal("1.1")
@end example

You can also provide tuples containing the sign, the mantissa represented  as a
tuple of decimal digits, and the exponent:

@example
>>> decimal.Decimal((1, (1, 4, 7, 5), -2))
Decimal("-14.75")
@end example

Cautionary note: the sign bit is a Boolean value, so 0 is positive and 1 is
negative.

Converting from floating-point numbers poses a bit of a problem: should the FP
number representing 1.1 turn into the decimal number for exactly 1.1, or for 1.1
plus whatever inaccuracies are introduced? The decision was to dodge the issue
and leave such a conversion out of the API.  Instead, you should convert the
floating-point number into a string using the desired precision and pass the
string to the @code{Decimal} constructor:

@example
>>> f = 1.1
>>> decimal.Decimal(str(f))
Decimal("1.1")
>>> decimal.Decimal('%.12f' % f)
Decimal("1.100000000000")
@end example

Once you have @code{Decimal} instances, you can perform the usual mathematical
operations on them.  One limitation: exponentiation requires an integer
exponent:

@example
>>> a = decimal.Decimal('35.72')
>>> b = decimal.Decimal('1.73')
>>> a+b
Decimal("37.45")
>>> a-b
Decimal("33.99")
>>> a*b
Decimal("61.7956")
>>> a/b
Decimal("20.64739884393063583815028902")
>>> a ** 2
Decimal("1275.9184")
>>> a**b
Traceback (most recent call last):
  ...
decimal.InvalidOperation: x ** (non-integer)
@end example

You can combine @code{Decimal} instances with integers, but not with
floating-point numbers:

@example
>>> a + 4
Decimal("39.72")
>>> a + 4.5
Traceback (most recent call last):
  ...
TypeError: You can interact Decimal only with int, long or Decimal data types.
>>>
@end example

@code{Decimal} numbers can be used with the @ref{92,,math} and @ref{19,,cmath}
modules, but note that they’ll be immediately converted to  floating-point
numbers before the operation is performed, resulting in a possible loss of
precision and accuracy.  You’ll also get back a regular floating-point number
and not a @code{Decimal}.

@example
>>> import math, cmath
>>> d = decimal.Decimal('123456789012.345')
>>> math.sqrt(d)
351364.18288201344
>>> cmath.sqrt(-d)
351364.18288201344j
@end example

@code{Decimal} instances have a @code{sqrt()} method that returns a
@code{Decimal}, but if you need other things such as trigonometric functions
you’ll have to implement them.

@example
>>> d.sqrt()
Decimal("351364.1828820134592177245001")
@end example

@node The Context type,,The Decimal type,PEP 327 Decimal Data Type
@anchor{whatsnew/2 4 the-context-type}@anchor{166d}
@subsubsection The @code{Context} type


Instances of the @code{Context} class encapsulate several settings for
decimal operations:


@itemize *

@item 
@code{prec} is the precision, the number of decimal places.

@item 
@code{rounding} specifies the rounding mode.  The @ref{3a,,decimal} module has
constants for the various possibilities: @code{ROUND_DOWN},
@code{ROUND_CEILING},  @code{ROUND_HALF_EVEN}, and various others.

@item 
@code{traps} is a dictionary specifying what happens on encountering certain
error conditions: either  an exception is raised or  a value is returned.  Some
examples of error conditions are division by zero, loss of precision, and
overflow.
@end itemize

There’s a thread-local default context available by calling @code{getcontext()};
you can change the properties of this context to alter the default precision,
rounding, or trap handling.  The following example shows the effect of changing
the precision of the default context:

@example
>>> decimal.getcontext().prec
28
>>> decimal.Decimal(1) / decimal.Decimal(7)
Decimal("0.1428571428571428571428571429")
>>> decimal.getcontext().prec = 9
>>> decimal.Decimal(1) / decimal.Decimal(7)
Decimal("0.142857143")
@end example

The default action for error conditions is selectable; the module can either
return a special value such as infinity or not-a-number, or exceptions can be
raised:

@example
>>> decimal.Decimal(1) / decimal.Decimal(0)
Traceback (most recent call last):
  ...
decimal.DivisionByZero: x / 0
>>> decimal.getcontext().traps[decimal.DivisionByZero] = False
>>> decimal.Decimal(1) / decimal.Decimal(0)
Decimal("Infinity")
>>>
@end example

The @code{Context} instance also has various methods for formatting  numbers
such as @code{to_eng_string()} and @code{to_sci_string()}.

For more information, see the documentation for the @ref{3a,,decimal} module, which
includes a quick-start tutorial and a reference.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 327

@item PEP 327@footnote{https://peps.python.org/pep-0327/} - Decimal Data Type

Written by Facundo Batista and implemented by Facundo Batista, Eric Price,
Raymond Hettinger, Aahz, and Tim Peters.

@item http://www.lahey.com/float.htm@footnote{https://web.archive.org/web/20230604072523/http://www.lahey.com/float.htm}

The article uses Fortran code to illustrate many of the problems that
floating-point inaccuracy can cause.

@item @indicateurl{https://speleotrove.com/decimal/}

A description of a decimal-based representation.  This representation is being
proposed as a standard, and underlies the new Python decimal type.  Much of this
material was written by Mike Cowlishaw, designer of the Rexx language.
@end table


@c ======================================================================

@node PEP 328 Multi-line Imports,PEP 331 Locale-Independent Float/String Conversions,PEP 327 Decimal Data Type,What’s New in Python 2 4
@anchor{whatsnew/2 4 pep-328-multi-line-imports}@anchor{166e}
@subsection PEP 328: Multi-line Imports


One language change is a small syntactic tweak aimed at making it easier to
import many names from a module.  In a @code{from module import names} statement,
`names' is a sequence of names separated by commas.  If the sequence is  very
long, you can either write multiple imports from the same module, or you can use
backslashes to escape the line endings like this:

@example
from SimpleXMLRPCServer import SimpleXMLRPCServer,\
            SimpleXMLRPCRequestHandler,\
            CGIXMLRPCRequestHandler,\
            resolve_dotted_attribute
@end example

The syntactic change in Python 2.4 simply allows putting the names within
parentheses.  Python ignores newlines within a parenthesized expression, so the
backslashes are no longer needed:

@example
from SimpleXMLRPCServer import (SimpleXMLRPCServer,
                                SimpleXMLRPCRequestHandler,
                                CGIXMLRPCRequestHandler,
                                resolve_dotted_attribute)
@end example

The PEP also proposes that all @ref{7f9,,import} statements be absolute imports,
with a leading @code{.} character to indicate a relative import.  This part of the
PEP was not implemented for Python 2.4, but was completed for Python 2.5.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 328

@item PEP 328@footnote{https://peps.python.org/pep-0328/} - Imports: Multi-Line and Absolute/Relative

Written by Aahz.  Multi-line imports were implemented by Dima Dorfman.
@end table


@c ======================================================================

@node PEP 331 Locale-Independent Float/String Conversions,Other Language Changes<17>,PEP 328 Multi-line Imports,What’s New in Python 2 4
@anchor{whatsnew/2 4 pep-331-locale-independent-float-string-conversions}@anchor{166f}
@subsection PEP 331: Locale-Independent Float/String Conversions


The @ref{8a,,locale} modules lets Python software select various conversions and
display conventions that are localized to a particular country or language.
However, the module was careful to not change the numeric locale because various
functions in Python’s implementation required that the numeric locale remain set
to the @code{'C'} locale.  Often this was because the code was using the C
library’s @code{atof()} function.

Not setting the numeric locale caused trouble for extensions that used third-party
C libraries, however, because they wouldn’t have the correct locale set.
The motivating example was GTK+, whose user interface widgets weren’t displaying
numbers in the current locale.

The solution described in the PEP is to add three new functions to the Python
API that perform ASCII-only conversions, ignoring the locale setting:


@itemize *

@item 
@code{PyOS_ascii_strtod(str, ptr)}  and @code{PyOS_ascii_atof(str, ptr)}
both convert a string to a C double.

@item 
@code{PyOS_ascii_formatd(buffer, buf_len, format, d)} converts a
double to an ASCII string.
@end itemize

The code for these functions came from the GLib library
(https://developer-old.gnome.org/glib/2.26/@footnote{http://web.archive.org/web/20210306104320/https://developer.gnome.org/glib/2.26/}), whose developers kindly
relicensed the relevant functions and donated them to the Python Software
Foundation.  The @ref{8a,,locale} module  can now change the numeric locale,
letting extensions such as GTK+  produce the correct results.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 331

@item PEP 331@footnote{https://peps.python.org/pep-0331/} - Locale-Independent Float/String Conversions

Written by Christian R. Reis, and implemented by Gustavo Carneiro.
@end table


@c ======================================================================

@node Other Language Changes<17>,New Improved and Deprecated Modules<3>,PEP 331 Locale-Independent Float/String Conversions,What’s New in Python 2 4
@anchor{whatsnew/2 4 other-language-changes}@anchor{1670}
@subsection Other Language Changes


Here are all of the changes that Python 2.4 makes to the core Python language.


@itemize *

@item 
Decorators for functions and methods were added (
@geindex Python Enhancement Proposals; PEP 318
PEP 318@footnote{https://peps.python.org/pep-0318/}).

@item 
Built-in @ref{185,,set()} and @ref{7f3,,frozenset()} types were  added (
@geindex Python Enhancement Proposals; PEP 218
PEP 218@footnote{https://peps.python.org/pep-0218/}).
Other new built-ins include the @code{reversed(seq)} function (
@geindex Python Enhancement Proposals; PEP 322
PEP 322@footnote{https://peps.python.org/pep-0322/}).

@item 
Generator expressions were added (
@geindex Python Enhancement Proposals; PEP 289
PEP 289@footnote{https://peps.python.org/pep-0289/}).

@item 
Certain numeric expressions no longer return values restricted to 32 or 64
bits (
@geindex Python Enhancement Proposals; PEP 237
PEP 237@footnote{https://peps.python.org/pep-0237/}).

@item 
You can now put parentheses around the list of names in a @code{from module import
names} statement (
@geindex Python Enhancement Proposals; PEP 328
PEP 328@footnote{https://peps.python.org/pep-0328/}).

@item 
The @ref{1671,,dict.update()} method now accepts the same argument forms as the
@ref{184,,dict} constructor.  This includes any mapping, any iterable of key/value
pairs, and keyword arguments. (Contributed by Raymond Hettinger.)

@item 
The string methods @code{ljust()}, @code{rjust()}, and @code{center()} now take
an optional argument for specifying a fill character other than a space.
(Contributed by Raymond Hettinger.)

@item 
Strings also gained an @code{rsplit()} method that works like the @code{split()}
method but splits from the end of the string.   (Contributed by Sean
Reifschneider.)

@example
>>> 'www.python.org'.split('.', 1)
['www', 'python.org']
'www.python.org'.rsplit('.', 1)
['www.python', 'org']
@end example

@item 
Three keyword parameters, `cmp', `key', and `reverse', were added to the
@code{sort()} method of lists. These parameters make some common usages of
@code{sort()} simpler. All of these parameters are optional.

For the `cmp' parameter, the value should be a comparison function that takes
two parameters and returns -1, 0, or +1 depending on how the parameters compare.
This function will then be used to sort the list.  Previously this was the only
parameter that could be provided to @code{sort()}.

`key' should be a single-parameter function that takes a list element and
returns a comparison key for the element.  The list is then sorted using the
comparison keys.  The following example sorts a list case-insensitively:

@example
>>> L = ['A', 'b', 'c', 'D']
>>> L.sort()                 # Case-sensitive sort
>>> L
['A', 'D', 'b', 'c']
>>> # Using 'key' parameter to sort list
>>> L.sort(key=lambda x: x.lower())
>>> L
['A', 'b', 'c', 'D']
>>> # Old-fashioned way
>>> L.sort(cmp=lambda x,y: cmp(x.lower(), y.lower()))
>>> L
['A', 'b', 'c', 'D']
@end example

The last example, which uses the `cmp' parameter, is the old way to perform a
case-insensitive sort.  It works but is slower than using a `key' parameter.
Using `key' calls @code{lower()} method once for each element in the list while
using `cmp' will call it twice for each comparison, so using `key' saves on
invocations of the @code{lower()} method.

For simple key functions and comparison functions, it is often possible to avoid
a @ref{14a9,,lambda} expression by using an unbound method instead.  For example,
the above case-insensitive sort is best written as:

@example
>>> L.sort(key=str.lower)
>>> L
['A', 'b', 'c', 'D']
@end example

Finally, the `reverse' parameter takes a Boolean value.  If the value is true,
the list will be sorted into reverse order. Instead of @code{L.sort();
L.reverse()}, you can now write @code{L.sort(reverse=True)}.

The results of sorting are now guaranteed to be stable.  This means that two
entries with equal keys will be returned in the same order as they were input.
For example, you can sort a list of people by name, and then sort the list by
age, resulting in a list sorted by age where people with the same age are in
name-sorted order.

(All changes to @code{sort()} contributed by Raymond Hettinger.)

@item 
There is a new built-in function @code{sorted(iterable)} that works like the
in-place @ref{dce,,list.sort()} method but can be used in expressions.  The
differences are:

@item 
the input may be any iterable;

@item 
a newly formed copy is sorted, leaving the original intact; and

@item 
the expression returns the new sorted copy

@example
>>> L = [9,7,8,3,2,4,1,6,5]
>>> [10+i for i in sorted(L)]       # usable in a list comprehension
[11, 12, 13, 14, 15, 16, 17, 18, 19]
>>> L                               # original is left unchanged
[9,7,8,3,2,4,1,6,5]
>>> sorted('Monty Python')          # any iterable may be an input
[' ', 'M', 'P', 'h', 'n', 'n', 'o', 'o', 't', 't', 'y', 'y']

>>> # List the contents of a dict sorted by key values
>>> colormap = dict(red=1, blue=2, green=3, black=4, yellow=5)
>>> for k, v in sorted(colormap.iteritems()):
...     print k, v
...
black 4
blue 2
green 3
red 1
yellow 5
@end example

(Contributed by Raymond Hettinger.)

@item 
Integer operations will no longer trigger an @code{OverflowWarning}. The
@code{OverflowWarning} warning will disappear in Python 2.5.

@item 
The interpreter gained a new switch, @ref{23e,,-m}, that takes a name, searches
for the corresponding  module on @code{sys.path}, and runs the module as a script.
For example,  you can now run the Python profiler with @code{python -m profile}.
(Contributed by Nick Coghlan.)

@item 
The @code{eval(expr, globals, locals)} and @code{execfile(filename, globals,
locals)} functions and the @code{exec} statement now accept any mapping type
for the `locals' parameter.  Previously this had to be a regular Python
dictionary.  (Contributed by Raymond Hettinger.)

@item 
The @ref{1a1,,zip()} built-in function and @code{itertools.izip()} now return an
empty list if called with no arguments. Previously they raised a
@ref{199,,TypeError} exception.  This makes them more suitable for use with variable
length argument lists:

@example
>>> def transpose(array):
...    return zip(*array)
...
>>> transpose([(1,2,3), (4,5,6)])
[(1, 4), (2, 5), (3, 6)]
>>> transpose([])
[]
@end example

(Contributed by Raymond Hettinger.)

@item 
Encountering a failure while importing a module no longer leaves a partially initialized
module object in @code{sys.modules}.  The incomplete module object left
behind would fool further imports of the same module into succeeding, leading to
confusing errors.   (Fixed by Tim Peters.)

@item 
@ref{887,,None} is now a constant; code that binds a new value to  the name
@code{None} is now a syntax error. (Contributed by Raymond Hettinger.)
@end itemize

@c ======================================================================

@menu
* Optimizations: Optimizations<17>. 

@end menu

@node Optimizations<17>,,,Other Language Changes<17>
@anchor{whatsnew/2 4 optimizations}@anchor{1672}
@subsubsection Optimizations



@itemize *

@item 
The inner loops for list and tuple slicing were optimized and now run about
one-third faster.  The inner loops for dictionaries were also optimized,
resulting in performance boosts for @code{keys()}, @code{values()}, @code{items()},
@code{iterkeys()}, @code{itervalues()}, and @code{iteritems()}. (Contributed by
Raymond Hettinger.)

@item 
The machinery for growing and shrinking lists was optimized for speed and for
space efficiency.  Appending and popping from lists now runs faster due to more
efficient code paths and less frequent use of the underlying system
@code{realloc()}.  List comprehensions also benefit.   @ref{602,,list.extend()} was
also optimized and no longer converts its argument into a temporary list before
extending the base list.  (Contributed by Raymond Hettinger.)

@item 
@ref{24f,,list()}, @ref{614,,tuple()}, @ref{1a0,,map()}, @ref{a6a,,filter()}, and @ref{1a1,,zip()} now
run several times faster with non-sequence arguments that supply a
@code{__len__()} method.  (Contributed by Raymond Hettinger.)

@item 
The methods @code{list.__getitem__()}, @code{dict.__getitem__()}, and
@code{dict.__contains__()} are now implemented as @code{method_descriptor}
objects rather than @code{wrapper_descriptor} objects.  This form of  access
doubles their performance and makes them more suitable for use as arguments to
functionals: @code{map(mydict.__getitem__, keylist)}. (Contributed by Raymond
Hettinger.)

@item 
Added a new opcode, @code{LIST_APPEND}, that simplifies the generated bytecode
for list comprehensions and speeds them up by about a third.  (Contributed by
Raymond Hettinger.)

@item 
The peephole bytecode optimizer has been improved to  produce shorter, faster
bytecode; remarkably, the resulting bytecode is  more readable.  (Enhanced by
Raymond Hettinger.)

@item 
String concatenations in statements of the form @code{s = s + "abc"} and @code{s +=
"abc"} are now performed more efficiently in certain circumstances.  This
optimization won’t be present in other Python implementations such as Jython, so
you shouldn’t rely on it; using the @code{join()} method of strings is still
recommended when you want to efficiently glue a large number of strings
together. (Contributed by Armin Rigo.)
@end itemize

The net result of the 2.4 optimizations is that Python 2.4 runs the pystone
benchmark around 5% faster than Python 2.3 and 35% faster than Python 2.2.
(pystone is not a particularly good benchmark, but it’s the most commonly used
measurement of Python’s performance.  Your own applications may show greater or
smaller benefits from Python 2.4.)

@c pystone is almost useless for comparing different versions of Python;
@c instead, it excels at predicting relative Python performance on different
@c machines.  So, this section would be more informative if it used other tools
@c such as pybench and parrotbench.  For a more application oriented benchmark,
@c try comparing the timings of test_decimal.py under 2.3 and 2.4.

@c ======================================================================

@node New Improved and Deprecated Modules<3>,Build and C API Changes<11>,Other Language Changes<17>,What’s New in Python 2 4
@anchor{whatsnew/2 4 new-improved-and-deprecated-modules}@anchor{1673}
@subsection New, Improved, and Deprecated Modules


As usual, Python’s standard library received a number of enhancements and bug
fixes.  Here’s a partial list of the most notable changes, sorted alphabetically
by module name. Consult the @code{Misc/NEWS} file in the source tree for a more
complete list of changes, or look through the CVS logs for all the details.


@itemize *

@item 
The @code{asyncore} module’s @code{loop()} function now has a `count' parameter
that lets you perform a limited number of passes through the polling loop.  The
default is still to loop forever.

@item 
The @ref{f,,base64} module now has more complete 
@geindex RFC; RFC 3548
RFC 3548@footnote{https://datatracker.ietf.org/doc/html/rfc3548.html} support for Base64,
Base32, and Base16 encoding and decoding, including optional case folding and
optional alternative alphabets. (Contributed by Barry Warsaw.)

@item 
The @ref{12,,bisect} module now has an underlying C implementation for improved
performance. (Contributed by Dmitry Vasiliev.)

@item 
The CJKCodecs collections of East Asian codecs, maintained by Hye-Shik Chang,
was integrated into 2.4.   The new encodings are:

@item 
Chinese (PRC): gb2312, gbk, gb18030, big5hkscs, hz

@item 
Chinese (ROC): big5, cp950

@item 

@table @asis

@item Japanese: cp932, euc-jis-2004, euc-jp, euc-jisx0213, iso-2022-jp,

iso-2022-jp-1, iso-2022-jp-2, iso-2022-jp-3, iso-2022-jp-ext, iso-2022-jp-2004,
shift-jis, shift-jisx0213, shift-jis-2004
@end table

@item 
Korean: cp949, euc-kr, johab, iso-2022-kr

@item 
Some other new encodings were added: HP Roman8,  ISO_8859-11, ISO_8859-16,
PCTP-154, and TIS-620.

@item 
The UTF-8 and UTF-16 codecs now cope better with receiving partial input.
Previously the @code{StreamReader} class would try to read more data, making
it impossible to resume decoding from the stream.  The @code{read()} method will
now return as much data as it can and future calls will resume decoding where
previous ones left off.  (Implemented by Walter Dörwald.)

@item 
There is a new @ref{1e,,collections} module for  various specialized collection
datatypes.  Currently it contains just one type, @code{deque}, a double-ended
queue that supports efficiently adding and removing elements from either
end:

@example
>>> from collections import deque
>>> d = deque('ghi')        # make a new deque with three items
>>> d.append('j')           # add a new entry to the right side
>>> d.appendleft('f')       # add a new entry to the left side
>>> d                       # show the representation of the deque
deque(['f', 'g', 'h', 'i', 'j'])
>>> d.pop()                 # return and remove the rightmost item
'j'
>>> d.popleft()             # return and remove the leftmost item
'f'
>>> list(d)                 # list the contents of the deque
['g', 'h', 'i']
>>> 'h' in d                # search the deque
True
@end example

Several modules, such as the @code{Queue} and @ref{f3,,threading} modules, now take
advantage of @ref{7f5,,collections.deque} for improved performance.  (Contributed
by Raymond Hettinger.)

@item 
The @ref{26,,ConfigParser} classes have been enhanced slightly. The @ref{1674,,read()}
method now returns a list of the files that were successfully parsed, and the
@ref{1478,,set()} method raises @ref{199,,TypeError} if passed a `value' argument that
isn’t a string.   (Contributed by John Belmonte and David Goodger.)

@item 
The @ref{2f,,curses} module now supports the ncurses extension
@code{use_default_colors()}.  On platforms where the terminal supports
transparency, this makes it possible to use a transparent background.
(Contributed by Jörg Lehmann.)

@item 
The @ref{3b,,difflib} module now includes an @code{HtmlDiff} class that creates
an HTML table showing a side by side comparison of two versions of a text.
(Contributed by Dan Gass.)

@item 
The @ref{3f,,email} package was updated to version 3.0,  which dropped various
deprecated APIs and removes support for Python versions earlier than 2.3.  The
3.0 version of the package uses a new incremental parser for MIME messages,
available in the @code{email.FeedParser} module.  The new parser doesn’t require
reading the entire message into memory, and doesn’t raise exceptions if a
message is malformed; instead it records any problems in the  @code{defect}
attribute of the message.  (Developed by Anthony Baxter, Barry Warsaw, Thomas
Wouters, and others.)

@item 
The @ref{6d,,heapq} module has been converted to C.  The resulting tenfold
improvement in speed makes the module suitable for handling high volumes of
data.  In addition, the module has two new functions @code{nlargest()} and
@code{nsmallest()} that use heaps to find the N largest or smallest values in a
dataset without the expense of a full sort.  (Contributed by Raymond Hettinger.)

@item 
The @ref{72,,httplib} module now contains constants for HTTP status codes defined
in various HTTP-related RFC documents.  Constants have names such as
@code{OK}, @code{CREATED}, @code{CONTINUE}, and
@code{MOVED_PERMANENTLY}; use pydoc to get a full list.  (Contributed by
Andrew Eland.)

@item 
The @ref{78,,imaplib} module now supports IMAP’s THREAD command (contributed by
Yves Dionne) and new @code{deleteacl()} and @code{myrights()} methods (contributed
by Arnaud Mazin).

@item 
The @ref{85,,itertools} module gained a @code{groupby(iterable[, *func*])}
function. `iterable' is something that can be iterated over to return a stream
of elements, and the optional `func' parameter is a function that takes an
element and returns a key value; if omitted, the key is simply the element
itself.  @code{groupby()} then groups the elements into subsequences which have
matching values of the key, and returns a series of 2-tuples containing the key
value and an iterator over the subsequence.

Here’s an example to make this clearer.  The `key' function simply returns
whether a number is even or odd, so the result of @code{groupby()} is to return
consecutive runs of odd or even numbers.

@example
>>> import itertools
>>> L = [2, 4, 6, 7, 8, 9, 11, 12, 14]
>>> for key_val, it in itertools.groupby(L, lambda x: x % 2):
...    print key_val, list(it)
...
0 [2, 4, 6]
1 [7]
0 [8]
1 [9, 11]
0 [12, 14]
>>>
@end example

@code{groupby()} is typically used with sorted input.  The logic for
@code{groupby()} is similar to the Unix @code{uniq} filter which makes it handy for
eliminating, counting, or identifying duplicate elements:

@example
>>> word = 'abracadabra'
>>> letters = sorted(word)   # Turn string into a sorted list of letters
>>> letters
['a', 'a', 'a', 'a', 'a', 'b', 'b', 'c', 'd', 'r', 'r']
>>> for k, g in itertools.groupby(letters):
...    print k, list(g)
...
a ['a', 'a', 'a', 'a', 'a']
b ['b', 'b']
c ['c']
d ['d']
r ['r', 'r']
>>> # List unique letters
>>> [k for k, g in groupby(letters)]
['a', 'b', 'c', 'd', 'r']
>>> # Count letter occurrences
>>> [(k, len(list(g))) for k, g in groupby(letters)]
[('a', 5), ('b', 2), ('c', 1), ('d', 1), ('r', 2)]
@end example

(Contributed by Hye-Shik Chang.)

@item 
@ref{85,,itertools} also gained a function named @code{tee(iterator, N)} that
returns `N' independent iterators that replicate `iterator'.  If `N' is omitted,
the default is 2.

@example
>>> L = [1,2,3]
>>> i1, i2 = itertools.tee(L)
>>> i1,i2
(<itertools.tee object at 0x402c2080>, <itertools.tee object at 0x402c2090>)
>>> list(i1)               # Run the first iterator to exhaustion
[1, 2, 3]
>>> list(i2)               # Run the second iterator to exhaustion
[1, 2, 3]
@end example

Note that @code{tee()} has to keep copies of the values returned  by the
iterator; in the worst case, it may need to keep all of them.   This should
therefore be used carefully if the leading iterator can run far ahead of the
trailing iterator in a long stream of inputs. If the separation is large, then
you might as well use  @ref{24f,,list()} instead.  When the iterators track closely
with one another, @code{tee()} is ideal.  Possible applications include
bookmarking, windowing, or lookahead iterators. (Contributed by Raymond
Hettinger.)

@item 
A number of functions were added to the @ref{8a,,locale}  module, such as
@code{bind_textdomain_codeset()} to specify a particular encoding and a family of
@code{l*gettext()} functions that return messages in the chosen encoding.
(Contributed by Gustavo Niemeyer.)

@item 
Some keyword arguments were added to the @ref{8b,,logging} package’s
@code{basicConfig()} function to simplify log configuration.  The default
behavior is to log messages to standard error, but various keyword arguments can
be specified to log to a particular file, change the logging format, or set the
logging level. For example:

@example
import logging
logging.basicConfig(filename='/var/log/application.log',
    level=0,  # Log all messages
    format='%(levelname):%(process):%(thread):%(message)')
@end example

Other additions to the @ref{8b,,logging} package include a @code{log(level, msg)}
convenience method, as well as a @code{TimedRotatingFileHandler} class that
rotates its log files at a timed interval.  The module already had
@code{RotatingFileHandler}, which rotated logs once the file exceeded a
certain size.  Both classes derive from a new @code{BaseRotatingHandler} class
that can be used to implement other rotating handlers.

(Changes implemented by Vinay Sajip.)

@item 
The @ref{91,,marshal} module now shares interned strings on unpacking a  data
structure.  This may shrink the size of certain pickle strings, but the primary
effect is to make @code{.pyc} files significantly smaller. (Contributed by
Martin von Löwis.)

@item 
The @code{nntplib} module’s @code{NNTP} class gained @code{description()} and
@code{descriptions()} methods to retrieve  newsgroup descriptions for a single
group or for a range of groups. (Contributed by Jürgen A. Erhard.)

@item 
Two new functions were added to the @ref{a3,,operator} module,
@code{attrgetter(attr)} and @code{itemgetter(index)}. Both functions return
callables that take a single argument and return the corresponding attribute or
item; these callables make excellent data extractors when used with @ref{1a0,,map()}
or @ref{dcd,,sorted()}.  For example:

@example
>>> L = [('c', 2), ('d', 1), ('a', 4), ('b', 3)]
>>> map(operator.itemgetter(0), L)
['c', 'd', 'a', 'b']
>>> map(operator.itemgetter(1), L)
[2, 1, 4, 3]
>>> sorted(L, key=operator.itemgetter(1)) # Sort list by second tuple item
[('d', 1), ('c', 2), ('b', 3), ('a', 4)]
@end example

(Contributed by Raymond Hettinger.)

@item 
The @ref{a4,,optparse} module was updated in various ways.  The module now passes
its messages through @ref{1675,,gettext.gettext()}, making it possible to
internationalize Optik’s help and error messages.  Help messages for options can
now include the string @code{'%default'}, which will be replaced by the option’s
default value.  (Contributed by Greg Ward.)

@item 
The long-term plan is to deprecate the @code{rfc822} module in some future
Python release in favor of the @ref{3f,,email} package. To this end, the
@ref{1676,,email.Utils.formatdate} function has been changed to make it usable as a
replacement for @code{rfc822.formatdate()}.  You may want to write new e-mail
processing code with this in mind.  (Change implemented by Anthony Baxter.)

@item 
A new @code{urandom(n)} function was added to the @ref{a5,,os} module, returning
a string containing `n' bytes of random data.  This function provides access to
platform-specific sources of randomness such as @code{/dev/urandom} on Linux or
the Windows CryptoAPI.  (Contributed by Trevor Perrin.)

@item 
Another new function: @code{os.path.lexists(path)}  returns true if the file
specified by `path' exists, whether or not it’s a symbolic link.  This differs
from the existing @code{os.path.exists(path)} function, which returns false if
`path' is a symlink that points to a destination that doesn’t exist.
(Contributed by Beni Cherniavsky.)

@item 
A new @code{getsid()} function was added to the @ref{b2,,posix} module that
underlies the @ref{a5,,os} module. (Contributed by J. Raynor.)

@item 
The @ref{b1,,poplib} module now supports POP over SSL.  (Contributed by Hector
Urtubia.)

@item 
The @ref{b4,,profile} module can now profile C extension functions. (Contributed
by Nick Bastin.)

@item 
The @ref{bd,,random} module has a new method called @code{getrandbits(N)} that
returns a long integer `N' bits in length.  The existing @code{randrange()}
method now uses @code{getrandbits()} where appropriate, making generation of
arbitrarily large random numbers more efficient.  (Contributed by Raymond
Hettinger.)

@item 
The regular expression language accepted by the @ref{be,,re} module was extended
with simple conditional expressions, written as @code{(?(group)A|B)}.  `group' is
either a numeric group ID or a group name defined with @code{(?P<group>...)}
earlier in the expression.  If the specified group matched, the regular
expression pattern `A' will be tested against the string; if the group didn’t
match, the pattern `B' will be used instead. (Contributed by Gustavo Niemeyer.)

@item 
The @ref{be,,re} module is also no longer recursive, thanks to a massive amount
of work by Gustavo Niemeyer.  In a recursive regular expression engine, certain
patterns result in a large amount of C stack space being consumed, and it was
possible to overflow the stack. For example, if you matched a 30000-byte string
of @code{a} characters against the expression @code{(a|b)+}, one stack frame was
consumed per character.  Python 2.3 tried to check for stack overflow and raise
a @ref{246,,RuntimeError} exception, but certain patterns could sidestep the
checking and if you were unlucky Python could segfault. Python 2.4’s regular
expression engine can match this pattern without problems.

@item 
The @ref{cb,,signal} module now performs tighter error-checking on the parameters
to the @ref{1340,,signal.signal()} function.  For example, you can’t set a handler on
the @code{SIGKILL} signal; previous versions of Python would quietly accept
this, but 2.4 will raise a @ref{246,,RuntimeError} exception.

@item 
Two new functions were added to the @ref{d1,,socket} module. @code{socketpair()}
returns a pair of connected sockets and @code{getservbyport(port)} looks up the
service name for a given port number. (Contributed by Dave Cole and Barry
Warsaw.)

@item 
The @code{sys.exitfunc()} function has been deprecated.  Code should be using
the existing @ref{d,,atexit} module, which correctly handles calling multiple exit
functions.  Eventually @code{sys.exitfunc()} will become a purely internal
interface, accessed only by @code{atexit}.

@item 
The @ref{e4,,tarfile} module now generates GNU-format tar files by default.
(Contributed by Lars Gustäbel.)

@item 
The @ref{f3,,threading} module now has an elegantly simple way to support
thread-local data.  The module contains a @code{local} class whose attribute
values are local to different threads.

@example
import threading

data = threading.local()
data.number = 42
data.url = ('www.python.org', 80)
@end example

Other threads can assign and retrieve their own values for the @code{number}
and @code{url} attributes.  You can subclass @code{local} to initialize
attributes or to add methods. (Contributed by Jim Fulton.)

@item 
The @ref{f5,,timeit} module now automatically disables periodic garbage
collection during the timing loop.  This change makes consecutive timings more
comparable.  (Contributed by Raymond Hettinger.)

@item 
The @ref{11b,,weakref} module now supports a wider variety of objects including
Python functions, class instances, sets, frozensets, deques, arrays, files,
sockets, and regular expression pattern objects. (Contributed by Raymond
Hettinger.)

@item 
The @ref{135,,xmlrpclib} module now supports a multi-call extension for
transmitting multiple XML-RPC calls in a single HTTP operation. (Contributed by
Brian Quinlan.)

@item 
The @code{mpz}, @code{rotor}, and @code{xreadlines} modules have  been
removed.
@end itemize

@c ======================================================================

@c whole new modules get described in subsections here

@c =====================

@menu
* cookielib:: 
* doctest: doctest<5>. 

@end menu

@node cookielib,doctest<5>,,New Improved and Deprecated Modules<3>
@anchor{whatsnew/2 4 cookielib}@anchor{1677}
@subsubsection cookielib


The @ref{74,,cookielib} library supports client-side handling for HTTP cookies,
mirroring the @ref{75,,Cookie} module’s server-side cookie support. Cookies are
stored in cookie jars; the library transparently stores cookies offered by the
web server in the cookie jar, and fetches the cookie from the jar when
connecting to the server. As in web browsers, policy objects control whether
cookies are accepted or not.

In order to store cookies across sessions, two implementations of cookie jars
are provided: one that stores cookies in the Netscape format so applications can
use the Mozilla or Lynx cookie files, and one that stores cookies in the same
format as the Perl libwww library.

@ref{112,,urllib2} has been changed to interact with @ref{74,,cookielib}:
@code{HTTPCookieProcessor} manages a cookie jar that is used when accessing
URLs.

This module was contributed by John J. Lee.

@c ==================

@node doctest<5>,,cookielib,New Improved and Deprecated Modules<3>
@anchor{whatsnew/2 4 doctest}@anchor{1678}
@subsubsection doctest


The @ref{3e,,doctest} module underwent considerable refactoring thanks to Edward
Loper and Tim Peters.  Testing can still be as simple as running
@ref{1679,,doctest.testmod()}, but the refactorings allow customizing the module’s
operation in various ways

The new @code{DocTestFinder} class extracts the tests from a given  object’s
docstrings:

@example
def f (x, y):
    """>>> f(2,2)
4
>>> f(3,2)
6
    """
    return x*y

finder = doctest.DocTestFinder()

# Get list of DocTest instances
tests = finder.find(f)
@end example

The new @code{DocTestRunner} class then runs individual tests and can produce
a summary of the results:

@example
runner = doctest.DocTestRunner()
for t in tests:
    tried, failed = runner.run(t)

runner.summarize(verbose=1)
@end example

The above example produces the following output:

@example
1 items passed all tests:
   2 tests in f
2 tests in 1 items.
2 passed and 0 failed.
Test passed.
@end example

@code{DocTestRunner} uses an instance of the @code{OutputChecker} class to
compare the expected output with the actual output.  This class takes a number
of different flags that customize its behaviour; ambitious users can also write
a completely new subclass of @code{OutputChecker}.

The default output checker provides a number of handy features. For example,
with the @ref{167a,,doctest.ELLIPSIS} option flag, an ellipsis (@code{...}) in the
expected output matches any substring,  making it easier to accommodate outputs
that vary in minor ways:

@example
def o (n):
    """>>> o(1)
<__main__.C instance at 0x...>
>>>
"""
@end example

Another special string, @code{<BLANKLINE>}, matches a blank line:

@example
def p (n):
    """>>> p(1)
<BLANKLINE>
>>>
"""
@end example

Another new capability is producing a diff-style display of the output by
specifying the @ref{167b,,doctest.REPORT_UDIFF} (unified diffs),
@ref{167c,,doctest.REPORT_CDIFF} (context diffs), or @ref{167d,,doctest.REPORT_NDIFF}
(delta-style) option flags.  For example:

@example
def g (n):
    """>>> g(4)
here
is
a
lengthy
>>>"""
    L = 'here is a rather lengthy list of words'.split()
    for word in L[:n]:
        print word
@end example

Running the above function’s tests with @ref{167b,,doctest.REPORT_UDIFF} specified,
you get the following output:

@example
**********************************************************************
File "t.py", line 15, in g
Failed example:
    g(4)
Differences (unified diff with -expected +actual):
    @@@@ -2,3 +2,3 @@@@
     is
     a
    -lengthy
    +rather
**********************************************************************
@end example

@c ======================================================================

@node Build and C API Changes<11>,Porting to Python 2 4,New Improved and Deprecated Modules<3>,What’s New in Python 2 4
@anchor{whatsnew/2 4 build-and-c-api-changes}@anchor{167e}
@subsection Build and C API Changes


Some of the changes to Python’s build process and to the C API are:


@itemize *

@item 
Three new convenience macros were added for common return values from
extension functions: @ref{167f,,Py_RETURN_NONE}, @ref{1680,,Py_RETURN_TRUE}, and
@ref{1681,,Py_RETURN_FALSE}. (Contributed by Brett Cannon.)

@item 
Another new macro, @ref{799,,Py_CLEAR},  decreases the reference count of
`obj' and sets `obj' to the null pointer.  (Contributed by Jim Fulton.)

@item 
A new function, @code{PyTuple_Pack(N, obj1, obj2, ..., objN)}, constructs
tuples from a variable length argument list of Python objects.  (Contributed by
Raymond Hettinger.)

@item 
A new function, @code{PyDict_Contains(d, k)}, implements fast dictionary
lookups without masking exceptions raised during the look-up process.
(Contributed by Raymond Hettinger.)

@item 
The @ref{1682,,Py_IS_NAN}(X) macro returns 1 if  its float or double argument
`X' is a NaN.   (Contributed by Tim Peters.)

@item 
C code can avoid unnecessary locking by using the new
@code{PyEval_ThreadsInitialized()} function to tell  if any thread operations
have been performed.  If this function  returns false, no lock operations are
needed. (Contributed by Nick Coghlan.)

@item 
A new function, @ref{625,,PyArg_VaParseTupleAndKeywords()}, is the same as
@ref{624,,PyArg_ParseTupleAndKeywords()} but takes a  @code{va_list} instead of a
number of arguments. (Contributed by Greg Chapman.)

@item 
A new method flag, @ref{1683,,METH_COEXIST}, allows a function defined in slots
to co-exist with a @ref{1684,,PyCFunction} having the same name.  This can halve
the access time for a method such as @code{set.__contains__()}.  (Contributed by
Raymond Hettinger.)

@item 
Python can now be built with additional profiling for the interpreter itself,
intended as an aid to people developing the Python core.  Providing
@code{--enable-profiling} to the @code{configure} script will let you
profile the interpreter with @code{gprof}, and providing the
@code{--with-tsc} switch enables profiling using the Pentium’s
Time-Stamp-Counter register.  Note that the @code{--with-tsc} switch is slightly
misnamed, because the profiling feature also works on the PowerPC platform,
though that processor architecture doesn’t call that register “the TSC
register”.  (Contributed by Jeremy Hylton.)

@item 
The @code{tracebackobject} type has been renamed to
@code{PyTracebackObject}.
@end itemize

@c ======================================================================

@menu
* Port-Specific Changes: Port-Specific Changes<2>. 

@end menu

@node Port-Specific Changes<2>,,,Build and C API Changes<11>
@anchor{whatsnew/2 4 port-specific-changes}@anchor{1685}
@subsubsection Port-Specific Changes



@itemize *

@item 
The Windows port now builds under MSVC++ 7.1 as well as version 6.
(Contributed by Martin von Löwis.)
@end itemize

@c ======================================================================

@node Porting to Python 2 4,Acknowledgements<4>,Build and C API Changes<11>,What’s New in Python 2 4
@anchor{whatsnew/2 4 porting-to-python-2-4}@anchor{1686}
@subsection Porting to Python 2.4


This section lists previously described changes that may require changes to your
code:


@itemize *

@item 
Left shifts and hexadecimal/octal constants that are too  large no longer
trigger a @ref{659,,FutureWarning} and return  a value limited to 32 or 64 bits;
instead they return a long integer.

@item 
Integer operations will no longer trigger an @code{OverflowWarning}. The
@code{OverflowWarning} warning will disappear in Python 2.5.

@item 
The @ref{1a1,,zip()} built-in function and @code{itertools.izip()} now return  an
empty list instead of raising a @ref{199,,TypeError} exception if called with no
arguments.

@item 
You can no longer compare the @code{date} and @ref{4e3,,datetime} instances
provided by the @ref{34,,datetime} module.  Two  instances of different classes
will now always be unequal, and  relative comparisons (@code{<}, @code{>}) will raise
a @ref{199,,TypeError}.

@item 
@code{dircache.listdir()} now passes exceptions to the caller instead of
returning empty lists.

@item 
@code{LexicalHandler.startDTD()} used to receive the public and system IDs in
the wrong order.  This has been corrected; applications relying on the wrong
order need to be fixed.

@item 
@ref{1687,,fcntl.ioctl()} now warns if the `mutate'  argument is omitted and
relevant.

@item 
The @ref{e4,,tarfile} module now generates GNU-format tar files by default.

@item 
Encountering a failure while importing a module no longer leaves a
partially initialized module object in @code{sys.modules}.

@item 
@ref{887,,None} is now a constant; code that binds a new value to  the name
@code{None} is now a syntax error.

@item 
The @code{signals.signal()} function now raises a @ref{246,,RuntimeError} exception
for certain illegal values; previously these errors would pass silently.  For
example, you can no longer set a handler on the @code{SIGKILL} signal.
@end itemize

@c ======================================================================

@node Acknowledgements<4>,,Porting to Python 2 4,What’s New in Python 2 4
@anchor{whatsnew/2 4 acknowledgements}@anchor{1688}@anchor{whatsnew/2 4 acks}@anchor{1689}
@subsection Acknowledgements


The author would like to thank the following people for offering suggestions,
corrections and assistance with various drafts of this article: Koray Can,
Hye-Shik Chang, Michael Dyck, Raymond Hettinger, Brian Hurt, Hamish Lawson,
Fredrik Lundh, Sean Reifschneider, Sadruddin Rejeb.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node What’s New in Python 2 3,What’s New in Python 2 2,What’s New in Python 2 4,What’s New in Python
@anchor{whatsnew/2 3 doc}@anchor{168a}@anchor{whatsnew/2 3 translation-repo}@anchor{168b}@anchor{whatsnew/2 3 what-s-new-in-python-2-3}@anchor{168c}
@section What’s New in Python 2.3


@*Author: 
A.M. Kuchling


@c $Id: whatsnew23.tex 54631 2007-03-31 11:58:36Z georg.brandl $

This article explains the new features in Python 2.3.  Python 2.3 was released
on July 29, 2003.

The main themes for Python 2.3 are polishing some of the features added in 2.2,
adding various small but useful enhancements to the core language, and expanding
the standard library.  The new object model introduced in the previous version
has benefited from 18 months of bugfixes and from optimization efforts that have
improved the performance of new-style classes.  A few new built-in functions
have been added such as @ref{696,,sum()} and @ref{168d,,enumerate()}.  The @ref{349,,in}
operator can now be used for substring searches (e.g. @code{"ab" in "abc"} returns
@ref{e0d,,True}).

Some of the many new library features include Boolean, set, heap, and date/time
data types, the ability to import modules from ZIP-format archives, metadata
support for the long-awaited Python catalog, an updated version of IDLE, and
modules for logging messages, wrapping text, parsing CSV files, processing
command-line options, using BerkeleyDB databases…  the list of new and
enhanced modules is lengthy.

This article doesn’t attempt to provide a complete specification of the new
features, but instead provides a convenient overview.  For full details, you
should refer to the documentation for Python 2.3, such as the Python Library
Reference and the Python Reference Manual.  If you want to understand the
complete implementation and design rationale, refer to the PEP for a particular
new feature.

@c ======================================================================

@menu
* PEP 218; A Standard Set Datatype: PEP 218 A Standard Set Datatype. 
* PEP 255; Simple Generators: PEP 255 Simple Generators. 
* PEP 263; Source Code Encodings: PEP 263 Source Code Encodings. 
* PEP 273; Importing Modules from ZIP Archives: PEP 273 Importing Modules from ZIP Archives. 
* PEP 277; Unicode file name support for Windows NT: PEP 277 Unicode file name support for Windows NT. 
* PEP 278; Universal Newline Support: PEP 278 Universal Newline Support. 
* PEP 279; enumerate(): PEP 279 enumerate. 
* PEP 282; The logging Package: PEP 282 The logging Package. 
* PEP 285; A Boolean Type: PEP 285 A Boolean Type. 
* PEP 293; Codec Error Handling Callbacks: PEP 293 Codec Error Handling Callbacks. 
* PEP 301; Package Index and Metadata for Distutils: PEP 301 Package Index and Metadata for Distutils. 
* PEP 302; New Import Hooks: PEP 302 New Import Hooks. 
* PEP 305; Comma-separated Files: PEP 305 Comma-separated Files. 
* PEP 307; Pickle Enhancements: PEP 307 Pickle Enhancements. 
* Extended Slices:: 
* Other Language Changes: Other Language Changes<18>. 
* New@comma{} Improved@comma{} and Deprecated Modules: New Improved and Deprecated Modules<4>. 
* Pymalloc; A Specialized Object Allocator: Pymalloc A Specialized Object Allocator. 
* Build and C API Changes: Build and C API Changes<12>. 
* Other Changes and Fixes: Other Changes and Fixes<2>. 
* Porting to Python 2.3: Porting to Python 2 3. 
* Acknowledgements: Acknowledgements<5>. 

@end menu

@node PEP 218 A Standard Set Datatype,PEP 255 Simple Generators,,What’s New in Python 2 3
@anchor{whatsnew/2 3 pep-218-a-standard-set-datatype}@anchor{168e}
@subsection PEP 218: A Standard Set Datatype


The new @code{sets} module contains an implementation of a set datatype.  The
@code{Set} class is for mutable sets, sets that can have members added and
removed.  The @code{ImmutableSet} class is for sets that can’t be modified,
and instances of @code{ImmutableSet} can therefore be used as dictionary keys.
Sets are built on top of dictionaries, so the elements within a set must be
hashable.

Here’s a simple example:

@example
>>> import sets
>>> S = sets.Set([1,2,3])
>>> S
Set([1, 2, 3])
>>> 1 in S
True
>>> 0 in S
False
>>> S.add(5)
>>> S.remove(3)
>>> S
Set([1, 2, 5])
>>>
@end example

The union and intersection of sets can be computed with the @ref{168f,,union()} and
@ref{1690,,intersection()} methods; an alternative notation uses the bitwise operators
@code{&} and @code{|}. Mutable sets also have in-place versions of these methods,
@code{union_update()} and @ref{1691,,intersection_update()}.

@example
>>> S1 = sets.Set([1,2,3])
>>> S2 = sets.Set([4,5,6])
>>> S1.union(S2)
Set([1, 2, 3, 4, 5, 6])
>>> S1 | S2                  # Alternative notation
Set([1, 2, 3, 4, 5, 6])
>>> S1.intersection(S2)
Set([])
>>> S1 & S2                  # Alternative notation
Set([])
>>> S1.union_update(S2)
>>> S1
Set([1, 2, 3, 4, 5, 6])
>>>
@end example

It’s also possible to take the symmetric difference of two sets.  This is the
set of all elements in the union that aren’t in the intersection.  Another way
of putting it is that the symmetric difference contains all elements that are in
exactly one set.  Again, there’s an alternative notation (@code{^}), and an
in-place version with the ungainly name @ref{1692,,symmetric_difference_update()}.

@example
>>> S1 = sets.Set([1,2,3,4])
>>> S2 = sets.Set([3,4,5,6])
>>> S1.symmetric_difference(S2)
Set([1, 2, 5, 6])
>>> S1 ^ S2
Set([1, 2, 5, 6])
>>>
@end example

There are also @code{issubset()} and @code{issuperset()} methods for checking
whether one set is a subset or superset of another:

@example
>>> S1 = sets.Set([1,2,3])
>>> S2 = sets.Set([2,3])
>>> S2.issubset(S1)
True
>>> S1.issubset(S2)
False
>>> S1.issuperset(S2)
True
>>>
@end example


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 218

@item PEP 218@footnote{https://peps.python.org/pep-0218/} - Adding a Built-In Set Object Type

PEP written by Greg V. Wilson. Implemented by Greg V. Wilson, Alex Martelli, and
GvR.
@end table


@c ======================================================================

@node PEP 255 Simple Generators,PEP 263 Source Code Encodings,PEP 218 A Standard Set Datatype,What’s New in Python 2 3
@anchor{whatsnew/2 3 pep-255-simple-generators}@anchor{1693}@anchor{whatsnew/2 3 section-generators}@anchor{1694}
@subsection PEP 255: Simple Generators


In Python 2.2, generators were added as an optional feature, to be enabled by a
@code{from __future__ import generators} directive.  In 2.3 generators no longer
need to be specially enabled, and are now always present; this means that
@ref{bc8,,yield} is now always a keyword.  The rest of this section is a copy of
the description of generators from the “What’s New in Python 2.2” document; if
you read it back when Python 2.2 came out, you can skip the rest of this
section.

You’re doubtless familiar with how function calls work in Python or C. When you
call a function, it gets a private namespace where its local variables are
created.  When the function reaches a @ref{1b0,,return} statement, the local
variables are destroyed and the resulting value is returned to the caller.  A
later call to the same function will get a fresh new set of local variables.
But, what if the local variables weren’t thrown away on exiting a function?
What if you could later resume the function where it left off?  This is what
generators provide; they can be thought of as resumable functions.

Here’s the simplest example of a generator function:

@example
def generate_ints(N):
    for i in range(N):
        yield i
@end example

A new keyword, @ref{bc8,,yield}, was introduced for generators.  Any function
containing a @code{yield} statement is a generator function; this is
detected by Python’s bytecode compiler which compiles the function specially as
a result.

When you call a generator function, it doesn’t return a single value; instead it
returns a generator object that supports the iterator protocol.  On executing
the @ref{bc8,,yield} statement, the generator outputs the value of @code{i},
similar to a @ref{1b0,,return} statement.  The big difference between
@code{yield} and a @code{return} statement is that on reaching a
@code{yield} the generator’s state of execution is suspended and local
variables are preserved.  On the next call to the generator’s @code{.next()}
method, the function will resume executing immediately after the
@code{yield} statement.  (For complicated reasons, the @code{yield}
statement isn’t allowed inside the @ref{8fa,,try} block of a
@code{try}…@code{finally} statement; read 
@geindex Python Enhancement Proposals; PEP 255
PEP 255@footnote{https://peps.python.org/pep-0255/} for a full
explanation of the interaction between @code{yield} and exceptions.)

Here’s a sample usage of the @code{generate_ints()} generator:

@example
>>> gen = generate_ints(3)
>>> gen
<generator object at 0x8117f90>
>>> gen.next()
0
>>> gen.next()
1
>>> gen.next()
2
>>> gen.next()
Traceback (most recent call last):
  File "stdin", line 1, in ?
  File "stdin", line 2, in generate_ints
StopIteration
@end example

You could equally write @code{for i in generate_ints(5)}, or @code{a,b,c =
generate_ints(3)}.

Inside a generator function, the @ref{1b0,,return} statement can only be used
without a value, and signals the end of the procession of values; afterwards the
generator cannot return any further values. @code{return} with a value, such
as @code{return 5}, is a syntax error inside a generator function.  The end of the
generator’s results can also be indicated by raising @ref{dfb,,StopIteration}
manually, or by just letting the flow of execution fall off the bottom of the
function.

You could achieve the effect of generators manually by writing your own class
and storing all the local variables of the generator as instance variables.  For
example, returning a list of integers could be done by setting @code{self.count} to
0, and having the @ref{9de,,next()} method increment @code{self.count} and return it.
However, for a moderately complicated generator, writing a corresponding class
would be much messier. @code{Lib/test/test_generators.py} contains a number of
more interesting examples.  The simplest one implements an in-order traversal of
a tree using generators recursively.

@example
# A recursive generator that generates Tree leaves in in-order.
def inorder(t):
    if t:
        for x in inorder(t.left):
            yield x
        yield t.label
        for x in inorder(t.right):
            yield x
@end example

Two other examples in @code{Lib/test/test_generators.py} produce solutions for
the N-Queens problem (placing $N$ queens on an $NxN$ chess board so that no
queen threatens another) and the Knight’s Tour (a route that takes a knight to
every square of an $NxN$ chessboard without visiting any square twice).

The idea of generators comes from other programming languages, especially Icon
(@indicateurl{https://www2.cs.arizona.edu/icon/}), where the idea of generators is central.  In
Icon, every expression and function call behaves like a generator.  One example
from “An Overview of the Icon Programming Language” at
@indicateurl{https://www2.cs.arizona.edu/icon/docs/ipd266.htm} gives an idea of what this looks
like:

@example
sentence := "Store it in the neighboring harbor"
if (i := find("or", sentence)) > 5 then write(i)
@end example

In Icon the @code{find()} function returns the indexes at which the substring
“or” is found: 3, 23, 33.  In the @ref{182,,if} statement, @code{i} is first
assigned a value of 3, but 3 is less than 5, so the comparison fails, and Icon
retries it with the second value of 23.  23 is greater than 5, so the comparison
now succeeds, and the code prints the value 23 to the screen.

Python doesn’t go nearly as far as Icon in adopting generators as a central
concept.  Generators are considered part of the core Python language, but
learning or using them isn’t compulsory; if they don’t solve any problems that
you have, feel free to ignore them. One novel feature of Python’s interface as
compared to Icon’s is that a generator’s state is represented as a concrete
object (the iterator) that can be passed around to other functions or stored in
a data structure.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 255

@item PEP 255@footnote{https://peps.python.org/pep-0255/} - Simple Generators

Written by Neil Schemenauer, Tim Peters, Magnus Lie Hetland.  Implemented mostly
by Neil Schemenauer and Tim Peters, with other fixes from the Python Labs crew.
@end table


@c ======================================================================

@node PEP 263 Source Code Encodings,PEP 273 Importing Modules from ZIP Archives,PEP 255 Simple Generators,What’s New in Python 2 3
@anchor{whatsnew/2 3 pep-263-source-code-encodings}@anchor{1695}@anchor{whatsnew/2 3 section-encodings}@anchor{1696}
@subsection PEP 263: Source Code Encodings


Python source files can now be declared as being in different character set
encodings.  Encodings are declared by including a specially formatted comment in
the first or second line of the source file.  For example, a UTF-8 file can be
declared with:

@example
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
@end example

Without such an encoding declaration, the default encoding used is 7-bit ASCII.
Executing or importing modules that contain string literals with 8-bit
characters and have no encoding declaration will result in a
@ref{1a4,,DeprecationWarning} being signalled by Python 2.3; in 2.4 this will be a
syntax error.

The encoding declaration only affects Unicode string literals, which will be
converted to Unicode using the specified encoding.  Note that Python identifiers
are still restricted to ASCII characters, so you can’t have variable names that
use characters outside of the usual alphanumerics.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 263

@item PEP 263@footnote{https://peps.python.org/pep-0263/} - Defining Python Source Code Encodings

Written by Marc-André Lemburg and Martin von Löwis; implemented by Suzuki Hisao
and Martin von Löwis.
@end table


@c ======================================================================

@node PEP 273 Importing Modules from ZIP Archives,PEP 277 Unicode file name support for Windows NT,PEP 263 Source Code Encodings,What’s New in Python 2 3
@anchor{whatsnew/2 3 pep-273-importing-modules-from-zip-archives}@anchor{1697}
@subsection PEP 273: Importing Modules from ZIP Archives


The new @ref{139,,zipimport} module adds support for importing modules from a
ZIP-format archive.  You don’t need to import the module explicitly; it will be
automatically imported if a ZIP archive’s filename is added to @code{sys.path}.
For example:

@example
amk@@nyman:~/src/python$ unzip -l /tmp/example.zip
Archive:  /tmp/example.zip
  Length     Date   Time    Name
 --------    ----   ----    ----
     8467  11-26-02 22:30   jwzthreading.py
 --------                   -------
     8467                   1 file
amk@@nyman:~/src/python$ ./python
Python 2.3 (#1, Aug 1 2003, 19:54:32)
>>> import sys
>>> sys.path.insert(0, '/tmp/example.zip')  # Add .zip file to front of path
>>> import jwzthreading
>>> jwzthreading.__file__
'/tmp/example.zip/jwzthreading.py'
>>>
@end example

An entry in @code{sys.path} can now be the filename of a ZIP archive. The ZIP
archive can contain any kind of files, but only files named @code{*.py},
@code{*.pyc}, or @code{*.pyo} can be imported.  If an archive only contains
@code{*.py} files, Python will not attempt to modify the archive by adding the
corresponding @code{*.pyc} file, meaning that if a ZIP archive doesn’t contain
@code{*.pyc} files, importing may be rather slow.

A path within the archive can also be specified to only import from a
subdirectory; for example, the path @code{/tmp/example.zip/lib/} would only
import from the @code{lib/} subdirectory within the archive.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 273

@item PEP 273@footnote{https://peps.python.org/pep-0273/} - Import Modules from Zip Archives

Written by James C. Ahlstrom,  who also provided an implementation. Python 2.3
follows the specification in 
@geindex Python Enhancement Proposals; PEP 273
PEP 273@footnote{https://peps.python.org/pep-0273/},  but uses an implementation written by
Just van Rossum  that uses the import hooks described in 
@geindex Python Enhancement Proposals; PEP 302
PEP 302@footnote{https://peps.python.org/pep-0302/}. See section
@ref{1698,,PEP 302; New Import Hooks} for a description of the new import hooks.
@end table


@c ======================================================================

@node PEP 277 Unicode file name support for Windows NT,PEP 278 Universal Newline Support,PEP 273 Importing Modules from ZIP Archives,What’s New in Python 2 3
@anchor{whatsnew/2 3 pep-277-unicode-file-name-support-for-windows-nt}@anchor{1699}
@subsection PEP 277: Unicode file name support for Windows NT


On Windows NT, 2000, and XP, the system stores file names as Unicode strings.
Traditionally, Python has represented file names as byte strings, which is
inadequate because it renders some file names inaccessible.

Python now allows using arbitrary Unicode strings (within the limitations of the
file system) for all functions that expect file names, most notably the
@ref{318,,open()} built-in function. If a Unicode string is passed to
@ref{1306,,os.listdir()}, Python now returns a list of Unicode strings.  A new
function, @code{os.getcwdu()}, returns the current directory as a Unicode string.

Byte strings still work as file names, and on Windows Python will transparently
convert them to Unicode using the @code{mbcs} encoding.

Other systems also allow Unicode strings as file names but convert them to byte
strings before passing them to the system, which can cause a @ref{460,,UnicodeError}
to be raised. Applications can test whether arbitrary Unicode strings are
supported as file names by checking @ref{169a,,os.path.supports_unicode_filenames},
a Boolean value.

Under MacOS, @ref{1306,,os.listdir()} may now return Unicode filenames.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 277

@item PEP 277@footnote{https://peps.python.org/pep-0277/} - Unicode file name support for Windows NT

Written by Neil Hodgson; implemented by Neil Hodgson, Martin von Löwis, and Mark
Hammond.
@end table


@c ======================================================================

@geindex universal newlines; What's new

@node PEP 278 Universal Newline Support,PEP 279 enumerate,PEP 277 Unicode file name support for Windows NT,What’s New in Python 2 3
@anchor{whatsnew/2 3 pep-278-universal-newline-support}@anchor{169b}
@subsection PEP 278: Universal Newline Support


The three major operating systems used today are Microsoft Windows, Apple’s
Macintosh OS, and the various Unix derivatives.  A minor irritation of
cross-platform work  is that these three platforms all use different characters to
mark the ends of lines in text files.  Unix uses the linefeed (ASCII character
10), MacOS uses the carriage return (ASCII character 13), and Windows uses a
two-character sequence of a carriage return plus a newline.

Python’s file objects can now support end of line conventions other than the
one followed by the platform on which Python is running. Opening a file with
the mode @code{'U'} or @code{'rU'} will open a file for reading in @ref{f3b,,universal newlines} mode.  All three line ending conventions will be translated to a
@code{'\n'} in the strings returned by the various file methods such as
@code{read()} and @code{readline()}.

Universal newline support is also used when importing modules and when executing
a file with the @code{execfile()} function.  This means that Python modules can
be shared between all three operating systems without needing to convert the
line-endings.

This feature can be disabled when compiling Python by specifying the
@code{--without-universal-newlines} switch when running Python’s
@code{configure} script.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 278

@item PEP 278@footnote{https://peps.python.org/pep-0278/} - Universal Newline Support

Written and implemented by Jack Jansen.
@end table


@c ======================================================================

@node PEP 279 enumerate,PEP 282 The logging Package,PEP 278 Universal Newline Support,What’s New in Python 2 3
@anchor{whatsnew/2 3 pep-279-enumerate}@anchor{169c}@anchor{whatsnew/2 3 section-enumerate}@anchor{169d}
@subsection PEP 279: enumerate()


A new built-in function, @ref{168d,,enumerate()}, will make certain loops a bit
clearer.  @code{enumerate(thing)}, where `thing' is either an iterator or a
sequence, returns an iterator that will return @code{(0, thing[0])}, @code{(1,
thing[1])}, @code{(2, thing[2])}, and so forth.

A common idiom to change every element of a list looks like this:

@example
for i in range(len(L)):
    item = L[i]
    # ... compute some result based on item ...
    L[i] = result
@end example

This can be rewritten using @ref{168d,,enumerate()} as:

@example
for i, item in enumerate(L):
    # ... compute some result based on item ...
    L[i] = result
@end example


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 279

@item PEP 279@footnote{https://peps.python.org/pep-0279/} - The enumerate() built-in function

Written and implemented by Raymond D. Hettinger.
@end table


@c ======================================================================

@node PEP 282 The logging Package,PEP 285 A Boolean Type,PEP 279 enumerate,What’s New in Python 2 3
@anchor{whatsnew/2 3 pep-282-the-logging-package}@anchor{169e}
@subsection PEP 282: The logging Package


A standard package for writing logs, @ref{8b,,logging}, has been added to Python
2.3.  It provides a powerful and flexible mechanism for generating logging
output which can then be filtered and processed in various ways.  A
configuration file written in a standard format can be used to control the
logging behavior of a program.  Python includes handlers that will write log
records to standard error or to a file or socket, send them to the system log,
or even e-mail them to a particular address; of course, it’s also possible to
write your own handler classes.

The @ref{d4c,,Logger} class is the primary class. Most application code will deal
with one or more @code{Logger} objects, each one used by a particular
subsystem of the application. Each @code{Logger} is identified by a name, and
names are organized into a hierarchy using @code{.}  as the component separator.
For example, you might have @code{Logger} instances named @code{server},
@code{server.auth} and @code{server.network}.  The latter two instances are below
@code{server} in the hierarchy.  This means that if you turn up the verbosity for
@code{server} or direct @code{server} messages to a different handler, the changes
will also apply to records logged to @code{server.auth} and @code{server.network}.
There’s also a root @code{Logger} that’s the parent of all other loggers.

For simple uses, the @ref{8b,,logging} package contains some convenience functions
that always use the root log:

@example
import logging

logging.debug('Debugging information')
logging.info('Informational message')
logging.warning('Warning:config file %s not found', 'server.conf')
logging.error('Error occurred')
logging.critical('Critical error -- shutting down')
@end example

This produces the following output:

@example
WARNING:root:Warning:config file server.conf not found
ERROR:root:Error occurred
CRITICAL:root:Critical error -- shutting down
@end example

In the default configuration, informational and debugging messages are
suppressed and the output is sent to standard error.  You can enable the display
of informational and debugging messages by calling the @ref{169f,,setLevel()} method
on the root logger.

Notice the @ref{352,,warning()} call’s use of string formatting operators; all of the
functions for logging messages take the arguments @code{(msg, arg1, arg2, ...)} and
log the string resulting from @code{msg % (arg1, arg2, ...)}.

There’s also an @ref{16a0,,exception()} function that records the most recent
traceback.  Any of the other functions will also record the traceback if you
specify a true value for the keyword argument `exc_info'.

@example
def f():
    try:    1/0
    except: logging.exception('Problem recorded')

f()
@end example

This produces the following output:

@example
ERROR:root:Problem recorded
Traceback (most recent call last):
  File "t.py", line 6, in f
    1/0
ZeroDivisionError: integer division or modulo by zero
@end example

Slightly more advanced programs will use a logger other than the root logger.
The @code{getLogger(name)} function is used to get a particular log, creating
it if it doesn’t exist yet. @code{getLogger(None)} returns the root logger.

@example
log = logging.getLogger('server')
 ...
log.info('Listening on port %i', port)
 ...
log.critical('Disk full')
 ...
@end example

Log records are usually propagated up the hierarchy, so a message logged to
@code{server.auth} is also seen by @code{server} and @code{root}, but a @ref{d4c,,Logger}
can prevent this by setting its @ref{16a1,,propagate} attribute to @ref{d31,,False}.

There are more classes provided by the @ref{8b,,logging} package that can be
customized.  When a @ref{d4c,,Logger} instance is told to log a message, it
creates a @ref{11ec,,LogRecord} instance that is sent to any number of different
@ref{16a2,,Handler} instances.  Loggers and handlers can also have an attached list
of filters, and each filter can cause the @code{LogRecord} to be ignored or
can modify the record before passing it along.  When they’re finally output,
@code{LogRecord} instances are converted to text by a @ref{16a3,,Formatter}
class.  All of these classes can be replaced by your own specially written
classes.

With all of these features the @ref{8b,,logging} package should provide enough
flexibility for even the most complicated applications.  This is only an
incomplete overview of its features, so please see the package’s reference
documentation for all of the details.  Reading 
@geindex Python Enhancement Proposals; PEP 282
PEP 282@footnote{https://peps.python.org/pep-0282/} will also be helpful.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 282

@item PEP 282@footnote{https://peps.python.org/pep-0282/} - A Logging System

Written by Vinay Sajip and Trent Mick; implemented by Vinay Sajip.
@end table


@c ======================================================================

@node PEP 285 A Boolean Type,PEP 293 Codec Error Handling Callbacks,PEP 282 The logging Package,What’s New in Python 2 3
@anchor{whatsnew/2 3 pep-285-a-boolean-type}@anchor{16a4}@anchor{whatsnew/2 3 section-bool}@anchor{16a5}
@subsection PEP 285: A Boolean Type


A Boolean type was added to Python 2.3.  Two new constants were added to the
@code{__builtin__} module, @ref{e0d,,True} and @ref{d31,,False}.  (@code{True} and
@code{False} constants were added to the built-ins in Python 2.2.1, but the
2.2.1 versions are simply set to integer values of 1 and 0 and aren’t a
different type.)

The type object for this new type is named @ref{3c1,,bool}; the constructor for it
takes any Python value and converts it to @ref{e0d,,True} or @ref{d31,,False}.

@example
>>> bool(1)
True
>>> bool(0)
False
>>> bool([])
False
>>> bool( (1,) )
True
@end example

Most of the standard library modules and built-in functions have been changed to
return Booleans.

@example
>>> obj = []
>>> hasattr(obj, 'append')
True
>>> isinstance(obj, list)
True
>>> isinstance(obj, tuple)
False
@end example

Python’s Booleans were added with the primary goal of making code clearer.  For
example, if you’re reading a function and encounter the statement @code{return 1},
you might wonder whether the @code{1} represents a Boolean truth value, an index,
or a coefficient that multiplies some other quantity.  If the statement is
@code{return True}, however, the meaning of the return value is quite clear.

Python’s Booleans were `not' added for the sake of strict type-checking.  A very
strict language such as Pascal would also prevent you performing arithmetic with
Booleans, and would require that the expression in an @ref{182,,if} statement
always evaluate to a Boolean result.  Python is not this strict and never will
be, as 
@geindex Python Enhancement Proposals; PEP 285
PEP 285@footnote{https://peps.python.org/pep-0285/} explicitly says.  This means you can still use any expression
in an @code{if} statement, even ones that evaluate to a list or tuple or
some random object.  The Boolean type is a subclass of the @ref{19c,,int} class so
that arithmetic using a Boolean still works.

@example
>>> True + 1
2
>>> False + 1
1
>>> False * 75
0
>>> True * 75
75
@end example

To sum up @ref{e0d,,True} and @ref{d31,,False} in a sentence: they’re alternative
ways to spell the integer values 1 and 0, with the single difference that
@ref{16a,,str()} and @ref{1c3,,repr()} return the strings @code{'True'} and @code{'False'}
instead of @code{'1'} and @code{'0'}.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 285

@item PEP 285@footnote{https://peps.python.org/pep-0285/} - Adding a bool type

Written and implemented by GvR.
@end table


@c ======================================================================

@node PEP 293 Codec Error Handling Callbacks,PEP 301 Package Index and Metadata for Distutils,PEP 285 A Boolean Type,What’s New in Python 2 3
@anchor{whatsnew/2 3 pep-293-codec-error-handling-callbacks}@anchor{16a6}
@subsection PEP 293: Codec Error Handling Callbacks


When encoding a Unicode string into a byte string, unencodable characters may be
encountered.  So far, Python has allowed specifying the error processing as
either “strict” (raising @ref{460,,UnicodeError}), “ignore” (skipping the
character), or “replace” (using a question mark in the output string), with
“strict” being the default behavior. It may be desirable to specify alternative
processing of such errors, such as inserting an XML character reference or HTML
entity reference into the converted string.

Python now has a flexible framework to add different processing strategies.  New
error handlers can be added with @ref{16a7,,codecs.register_error()}, and codecs then
can access the error handler with @ref{16a8,,codecs.lookup_error()}. An equivalent C
API has been added for codecs written in C. The error handler gets the necessary
state information such as the string being converted, the position in the string
where the error was detected, and the target encoding.  The handler can then
either raise an exception or return a replacement string.

Two additional error handlers have been implemented using this framework:
“backslashreplace” uses Python backslash quoting to represent unencodable
characters and “xmlcharrefreplace” emits XML character references.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 293

@item PEP 293@footnote{https://peps.python.org/pep-0293/} - Codec Error Handling Callbacks

Written and implemented by Walter Dörwald.
@end table


@c ======================================================================

@node PEP 301 Package Index and Metadata for Distutils,PEP 302 New Import Hooks,PEP 293 Codec Error Handling Callbacks,What’s New in Python 2 3
@anchor{whatsnew/2 3 pep-301-package-index-and-metadata-for-distutils}@anchor{16a9}@anchor{whatsnew/2 3 section-pep301}@anchor{16aa}
@subsection PEP 301: Package Index and Metadata for Distutils


Support for the long-requested Python catalog makes its first appearance in 2.3.

The heart of the catalog is the new Distutils @code{register} command.
Running @code{python setup.py register} will collect the metadata describing a
package, such as its name, version, maintainer, description, &c., and send it to
a central catalog server.  The resulting catalog is available from
@indicateurl{https://pypi.org}.

To make the catalog a bit more useful, a new optional `classifiers' keyword
argument has been added to the Distutils @code{setup()} function.  A list of
Trove@footnote{http://catb.org/~esr/trove/}-style strings can be supplied to help
classify the software.

Here’s an example @code{setup.py} with classifiers, written to be compatible
with older versions of the Distutils:

@example
from distutils import core
kw = @{'name': "Quixote",
      'version': "0.5.1",
      'description': "A highly Pythonic Web application framework",
      # ...
      @}

if (hasattr(core, 'setup_keywords') and
    'classifiers' in core.setup_keywords):
    kw['classifiers'] = \
        ['Topic :: Internet :: WWW/HTTP :: Dynamic Content',
         'Environment :: No Input/Output (Daemon)',
         'Intended Audience :: Developers'],

core.setup(**kw)
@end example

The full list of classifiers can be obtained by running  @code{python setup.py
register --list-classifiers}.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 301

@item PEP 301@footnote{https://peps.python.org/pep-0301/} - Package Index and Metadata for Distutils

Written and implemented by Richard Jones.
@end table


@c ======================================================================

@node PEP 302 New Import Hooks,PEP 305 Comma-separated Files,PEP 301 Package Index and Metadata for Distutils,What’s New in Python 2 3
@anchor{whatsnew/2 3 pep-302-new-import-hooks}@anchor{16ab}@anchor{whatsnew/2 3 section-pep302}@anchor{1698}
@subsection PEP 302: New Import Hooks


While it’s been possible to write custom import hooks ever since the
@code{ihooks} module was introduced in Python 1.3, no one has ever been really
happy with it because writing new import hooks is difficult and messy.  There
have been various proposed alternatives such as the @code{imputil} and @code{iu}
modules, but none of them has ever gained much acceptance, and none of them were
easily usable from C code.

@geindex Python Enhancement Proposals; PEP 302
PEP 302@footnote{https://peps.python.org/pep-0302/} borrows ideas from its predecessors, especially from Gordon
McMillan’s @code{iu} module.  Three new items  are added to the @ref{df,,sys}
module:


@itemize *

@item 
@code{sys.path_hooks} is a list of callable objects; most  often they’ll be
classes.  Each callable takes a string containing a path and either returns an
importer object that will handle imports from this path or raises an
@ref{65b,,ImportError} exception if it can’t handle this path.

@item 
@code{sys.path_importer_cache} caches importer objects for each path, so
@code{sys.path_hooks} will only need to be traversed once for each path.

@item 
@code{sys.meta_path} is a list of importer objects that will be traversed before
@code{sys.path} is checked.  This list is initially empty, but user code can add
objects to it.  Additional built-in and frozen modules can be imported by an
object added to this list.
@end itemize

Importer objects must have a single method, @code{find_module(fullname,
path=None)}.  `fullname' will be a module or package name, e.g. @code{string} or
@code{distutils.core}.  @code{find_module()} must return a loader object that has a
single method, @code{load_module(fullname)}, that creates and returns the
corresponding module object.

Pseudo-code for Python’s new import logic, therefore, looks something like this
(simplified a bit; see 
@geindex Python Enhancement Proposals; PEP 302
PEP 302@footnote{https://peps.python.org/pep-0302/} for the full details):

@example
for mp in sys.meta_path:
    loader = mp(fullname)
    if loader is not None:
        <module> = loader.load_module(fullname)

for path in sys.path:
    for hook in sys.path_hooks:
        try:
            importer = hook(path)
        except ImportError:
            # ImportError, so try the other path hooks
            pass
        else:
            loader = importer.find_module(fullname)
            <module> = loader.load_module(fullname)

# Not found!
raise ImportError
@end example


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 302

@item PEP 302@footnote{https://peps.python.org/pep-0302/} - New Import Hooks

Written by Just van Rossum and Paul Moore. Implemented by Just van Rossum.
@end table


@c ======================================================================

@node PEP 305 Comma-separated Files,PEP 307 Pickle Enhancements,PEP 302 New Import Hooks,What’s New in Python 2 3
@anchor{whatsnew/2 3 pep-305-comma-separated-files}@anchor{16ac}@anchor{whatsnew/2 3 section-pep305}@anchor{16ad}
@subsection PEP 305: Comma-separated Files


Comma-separated files are a format frequently used for exporting data from
databases and spreadsheets.  Python 2.3 adds a parser for comma-separated files.

Comma-separated format is deceptively simple at first glance:

@example
Costs,150,200,3.95
@end example

Read a line and call @code{line.split(',')}: what could be simpler? But toss in
string data that can contain commas, and things get more complicated:

@example
"Costs",150,200,3.95,"Includes taxes, shipping, and sundry items"
@end example

A big ugly regular expression can parse this, but using the new  @ref{2d,,csv}
package is much simpler:

@example
import csv

input = open('datafile', 'rb')
reader = csv.reader(input)
for line in reader:
    print line
@end example

The @ref{6af,,reader()} function takes a number of different options. The field
separator isn’t limited to the comma and can be changed to any character, and so
can the quoting and line-ending characters.

Different dialects of comma-separated files can be defined and registered;
currently there are two dialects, both used by Microsoft Excel. A separate
@ref{6b0,,csv.writer} class will generate comma-separated files from a succession
of tuples or lists, quoting strings that contain the delimiter.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 305

@item PEP 305@footnote{https://peps.python.org/pep-0305/} - CSV File API

Written and implemented  by Kevin Altis, Dave Cole, Andrew McNamara, Skip
Montanaro, Cliff Wells.
@end table


@c ======================================================================

@node PEP 307 Pickle Enhancements,Extended Slices,PEP 305 Comma-separated Files,What’s New in Python 2 3
@anchor{whatsnew/2 3 pep-307-pickle-enhancements}@anchor{16ae}@anchor{whatsnew/2 3 section-pep307}@anchor{16af}
@subsection PEP 307: Pickle Enhancements


The @ref{ab,,pickle} and @code{cPickle} modules received some attention during the
2.3 development cycle.  In 2.2, new-style classes could be pickled without
difficulty, but they weren’t pickled very compactly; 
@geindex Python Enhancement Proposals; PEP 307
PEP 307@footnote{https://peps.python.org/pep-0307/} quotes a trivial
example where a new-style class results in a pickled string three times longer
than that for a classic class.

The solution was to invent a new pickle protocol.  The @ref{16b0,,pickle.dumps()}
function has supported a text-or-binary flag  for a long time.  In 2.3, this
flag is redefined from a Boolean to an integer: 0 is the old text-mode pickle
format, 1 is the old binary format, and now 2 is a new 2.3-specific format.  A
new constant, @ref{16b1,,pickle.HIGHEST_PROTOCOL}, can be used to select the
fanciest protocol available.

Unpickling is no longer considered a safe operation.  2.2’s @ref{ab,,pickle}
provided hooks for trying to prevent unsafe classes from being unpickled
(specifically, a @code{__safe_for_unpickling__} attribute), but none of this
code was ever audited and therefore it’s all been ripped out in 2.3.  You should
not unpickle untrusted data in any version of Python.

To reduce the pickling overhead for new-style classes, a new interface for
customizing pickling was added using three special methods:
@ref{7f2,,__getstate__()}, @ref{bcd,,__setstate__()}, and @ref{fda,,__getnewargs__()}.  Consult
@geindex Python Enhancement Proposals; PEP 307
PEP 307@footnote{https://peps.python.org/pep-0307/} for the full semantics  of these methods.

As a way to compress pickles yet further, it’s now possible to use integer codes
instead of long strings to identify pickled classes. The Python Software
Foundation will maintain a list of standardized codes; there’s also a range of
codes for private use.  Currently no codes have been specified.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 307

@item PEP 307@footnote{https://peps.python.org/pep-0307/} - Extensions to the pickle protocol

Written and implemented  by Guido van Rossum and Tim Peters.
@end table


@c ======================================================================

@node Extended Slices,Other Language Changes<18>,PEP 307 Pickle Enhancements,What’s New in Python 2 3
@anchor{whatsnew/2 3 extended-slices}@anchor{16b2}@anchor{whatsnew/2 3 section-slices}@anchor{16b3}
@subsection Extended Slices


Ever since Python 1.4, the slicing syntax has supported an optional third “step”
or “stride” argument.  For example, these are all legal Python syntax:
@code{L[1:10:2]}, @code{L[:-1:1]}, @code{L[::-1]}.  This was added to Python at the
request of the developers of Numerical Python, which uses the third argument
extensively.  However, Python’s built-in list, tuple, and string sequence types
have never supported this feature, raising a @ref{199,,TypeError} if you tried it.
Michael Hudson contributed a patch to fix this shortcoming.

For example, you can now easily extract the elements of a list that have even
indexes:

@example
>>> L = range(10)
>>> L[::2]
[0, 2, 4, 6, 8]
@end example

Negative values also work to make a copy of the same list in reverse order:

@example
>>> L[::-1]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
@end example

This also works for tuples, arrays, and strings:

@example
>>> s='abcd'
>>> s[::2]
'ac'
>>> s[::-1]
'dcba'
@end example

If you have a mutable sequence such as a list or an array you can assign to or
delete an extended slice, but there are some differences between assignment to
extended and regular slices.  Assignment to a regular slice can be used to
change the length of the sequence:

@example
>>> a = range(3)
>>> a
[0, 1, 2]
>>> a[1:3] = [4, 5, 6]
>>> a
[0, 4, 5, 6]
@end example

Extended slices aren’t this flexible.  When assigning to an extended slice, the
list on the right hand side of the statement must contain the same number of
items as the slice it is replacing:

@example
>>> a = range(4)
>>> a
[0, 1, 2, 3]
>>> a[::2]
[0, 2]
>>> a[::2] = [0, -1]
>>> a
[0, 1, -1, 3]
>>> a[::2] = [0,1,2]
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
ValueError: attempt to assign sequence of size 3 to extended slice of size 2
@end example

Deletion is more straightforward:

@example
>>> a = range(4)
>>> a
[0, 1, 2, 3]
>>> a[::2]
[0, 2]
>>> del a[::2]
>>> a
[1, 3]
@end example

One can also now pass slice objects to the @ref{588,,__getitem__()} methods of the
built-in sequences:

@example
>>> range(10).__getitem__(slice(0, 5, 2))
[0, 2, 4]
@end example

Or use slice objects directly in subscripts:

@example
>>> range(10)[slice(0, 5, 2)]
[0, 2, 4]
@end example

To simplify implementing sequences that support extended slicing, slice objects
now have a method @code{indices(length)} which, given the length of a sequence,
returns a @code{(start, stop, step)} tuple that can be passed directly to
@ref{b43,,range()}. @code{indices()} handles omitted and out-of-bounds indices in a
manner consistent with regular slices (and this innocuous phrase hides a welter
of confusing details!).  The method is intended to be used like this:

@example
class FakeSeq:
    ...
    def calc_item(self, i):
        ...
    def __getitem__(self, item):
        if isinstance(item, slice):
            indices = item.indices(len(self))
            return FakeSeq([self.calc_item(i) for i in range(*indices)])
        else:
            return self.calc_item(i)
@end example

From this example you can also see that the built-in @ref{695,,slice} object is
now the type object for the slice type, and is no longer a function.  This is
consistent with Python 2.2, where @ref{19c,,int}, @ref{16a,,str}, etc., underwent
the same change.

@c ======================================================================

@node Other Language Changes<18>,New Improved and Deprecated Modules<4>,Extended Slices,What’s New in Python 2 3
@anchor{whatsnew/2 3 other-language-changes}@anchor{16b4}
@subsection Other Language Changes


Here are all of the changes that Python 2.3 makes to the core Python language.


@itemize *

@item 
The @ref{bc8,,yield} statement is now always a keyword, as described in
section @ref{1694,,PEP 255; Simple Generators} of this document.

@item 
A new built-in function @ref{168d,,enumerate()} was added, as described in section
@ref{169d,,PEP 279; enumerate()} of this document.

@item 
Two new constants, @ref{e0d,,True} and @ref{d31,,False} were added along with the
built-in @ref{3c1,,bool} type, as described in section @ref{16a5,,PEP 285; A Boolean Type} of this
document.

@item 
The @ref{19c,,int()} type constructor will now return a long integer instead of
raising an @ref{a87,,OverflowError} when a string or floating-point number is too
large to fit into an integer.  This can lead to the paradoxical result that
@code{isinstance(int(expression), int)} is false, but that seems unlikely to cause
problems in practice.

@item 
Built-in types now support the extended slicing syntax, as described in
section @ref{16b3,,Extended Slices} of this document.

@item 
A new built-in function, @code{sum(iterable, start=0)},  adds up the numeric
items in the iterable object and returns their sum.  @ref{696,,sum()} only accepts
numbers, meaning that you can’t use it to concatenate a bunch of strings.
(Contributed by Alex Martelli.)

@item 
@code{list.insert(pos, value)} used to  insert `value' at the front of the list
when `pos' was negative.  The behaviour has now been changed to be consistent
with slice indexing, so when `pos' is -1 the value will be inserted before the
last element, and so forth.

@item 
@code{list.index(value)}, which searches for `value'  within the list and returns
its index, now takes optional  `start' and `stop' arguments to limit the search
to  only part of the list.

@item 
Dictionaries have a new method, @code{pop(key[, *default*])}, that returns
the value corresponding to `key' and removes that key/value pair from the
dictionary.  If the requested key isn’t present in the dictionary, `default' is
returned if it’s specified and @ref{5e7,,KeyError} raised if it isn’t.

@example
>>> d = @{1:2@}
>>> d
@{1: 2@}
>>> d.pop(4)
Traceback (most recent call last):
  File "stdin", line 1, in ?
KeyError: 4
>>> d.pop(1)
2
>>> d.pop(1)
Traceback (most recent call last):
  File "stdin", line 1, in ?
KeyError: 'pop(): dictionary is empty'
>>> d
@{@}
>>>
@end example

There’s also a new class method,  @code{dict.fromkeys(iterable, value)}, that
creates a dictionary with keys taken from the supplied iterator `iterable' and
all values set to `value', defaulting to @code{None}.

(Patches contributed by Raymond Hettinger.)

Also, the @ref{184,,dict()} constructor now accepts keyword arguments to simplify
creating small dictionaries:

@example
>>> dict(red=1, blue=2, green=3, black=4)
@{'blue': 2, 'black': 4, 'green': 3, 'red': 1@}
@end example

(Contributed by Just van Rossum.)

@item 
The @ref{b66,,assert} statement no longer checks the @code{__debug__} flag, so
you can no longer disable assertions by assigning to @code{__debug__}. Running
Python with the @ref{18d,,-O} switch will still generate code that doesn’t
execute any assertions.

@item 
Most type objects are now callable, so you can use them to create new objects
such as functions, classes, and modules.  (This means that the @code{new} module
can be deprecated in a future Python version, because you can now use the type
objects available in the @ref{10a,,types} module.) For example, you can create a new
module object with the following code:

@example
>>> import types
>>> m = types.ModuleType('abc','docstring')
>>> m
<module 'abc' (built-in)>
>>> m.__doc__
'docstring'
@end example

@item 
A new warning, @ref{acc,,PendingDeprecationWarning} was added to indicate features
which are in the process of being deprecated.  The warning will `not' be printed
by default.  To check for use of features that will be deprecated in the future,
supply @ref{acb,,-Walways;;PendingDeprecationWarning;;} on the command line or
use @ref{16b5,,warnings.filterwarnings()}.

@item 
The process of deprecating string-based exceptions, as in @code{raise "Error
occurred"}, has begun.  Raising a string will now trigger
@ref{acc,,PendingDeprecationWarning}.

@item 
Using @code{None} as a variable name will now result in a @ref{1af,,SyntaxWarning}
warning.  In a future version of Python, @code{None} may finally become a keyword.

@item 
The @code{xreadlines()} method of file objects, introduced in Python 2.1, is no
longer necessary because files now behave as their own iterator.
@code{xreadlines()} was originally introduced as a faster way to loop over all
the lines in a file, but now you can simply write @code{for line in file_obj}.
File objects also have a new read-only @code{encoding} attribute that gives the
encoding used by the file; Unicode strings written to the file will be
automatically  converted to bytes using the given encoding.

@item 
The method resolution order used by new-style classes has changed, though
you’ll only notice the difference if you have a really complicated inheritance
hierarchy.  Classic classes are unaffected by this change.  Python 2.2
originally used a topological sort of a class’s ancestors, but 2.3 now uses the
C3 algorithm as described in the paper "A Monotonic Superclass Linearization for Dylan"@footnote{https://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.19.3910}. To
understand the motivation for this change,  read Michele Simionato’s article
@ref{16b6,,The Python 2.3 Method Resolution Order}, or
read the thread on python-dev starting with the message at
@indicateurl{https://mail.python.org/pipermail/python-dev/2002-October/029035.html}. Samuele
Pedroni first pointed out the problem and also implemented the fix by coding the
C3 algorithm.

@item 
Python runs multithreaded programs by switching between threads after
executing N bytecodes.  The default value for N has been increased from 10 to
100 bytecodes, speeding up single-threaded applications by reducing the
switching overhead.  Some multithreaded applications may suffer slower response
time, but that’s easily fixed by setting the limit back to a lower number using
@code{sys.setcheckinterval(N)}. The limit can be retrieved with the new
@code{sys.getcheckinterval()} function.

@item 
One minor but far-reaching change is that the names of extension types defined
by the modules included with Python now contain the module and a @code{'.'} in
front of the type name.  For example, in Python 2.2, if you created a socket and
printed its @code{__class__}, you’d get this output:

@example
>>> s = socket.socket()
>>> s.__class__
<type 'socket'>
@end example

In 2.3, you get this:

@example
>>> s.__class__
<type '_socket.socket'>
@end example

@item 
One of the noted incompatibilities between old- and new-style classes has been
removed: you can now assign to the @ref{16b7,,__name__} and @ref{16b8,,__bases__}
attributes of new-style classes.  There are some restrictions on what can be
assigned to @code{__bases__} along the lines of those relating to assigning to
an instance’s @ref{16b9,,__class__} attribute.
@end itemize

@c ======================================================================

@menu
* String Changes:: 
* Optimizations: Optimizations<18>. 

@end menu

@node String Changes,Optimizations<18>,,Other Language Changes<18>
@anchor{whatsnew/2 3 string-changes}@anchor{16ba}
@subsubsection String Changes



@itemize *

@item 
The @ref{349,,in} operator now works differently for strings. Previously, when
evaluating @code{X in Y} where `X' and `Y' are strings, `X' could only be a single
character. That’s now changed; `X' can be a string of any length, and @code{X in Y}
will return @ref{e0d,,True} if `X' is a substring of `Y'.  If `X' is the empty
string, the result is always @code{True}.

@example
>>> 'ab' in 'abcd'
True
>>> 'ad' in 'abcd'
False
>>> '@w{'} in 'abcd'
True
@end example

Note that this doesn’t tell you where the substring starts; if you need that
information, use the @ref{10ae,,find()} string method.

@item 
The @ref{16bb,,strip()}, @ref{16bc,,lstrip()}, and @ref{16bd,,rstrip()} string methods now have
an optional argument for specifying the characters to strip.  The default is
still to remove all whitespace characters:

@example
>>> '   abc '.strip()
'abc'
>>> '><><abc<><><>'.strip('<>')
'abc'
>>> '><><abc<><><>\n'.strip('<>')
'abc<><><>\n'
>>> u'\u4000\u4001abc\u4000'.strip(u'\u4000')
u'\u4001abc'
>>>
@end example

(Suggested by Simon Brunning and implemented by Walter Dörwald.)

@item 
The @ref{10d1,,startswith()} and @ref{10d2,,endswith()} string methods now accept negative
numbers for the `start' and `end' parameters.

@item 
Another new string method is @ref{16be,,zfill()}, originally a function in the
@ref{d8,,string} module.  @code{zfill()} pads a numeric string with zeros on the
left until it’s the specified width. Note that the @code{%} operator is still more
flexible and powerful than @code{zfill()}.

@example
>>> '45'.zfill(4)
'0045'
>>> '12345'.zfill(4)
'12345'
>>> 'goofy'.zfill(6)
'0goofy'
@end example

(Contributed by Walter Dörwald.)

@item 
A new type object, @code{basestring}, has been added. Both 8-bit strings and
Unicode strings inherit from this type, so @code{isinstance(obj, basestring)} will
return @ref{e0d,,True} for either kind of string.  It’s a completely abstract
type, so you can’t create @code{basestring} instances.

@item 
Interned strings are no longer immortal and will now be garbage-collected in
the usual way when the only reference to them is from the internal dictionary of
interned strings.  (Implemented by Oren Tirosh.)
@end itemize

@c ======================================================================

@node Optimizations<18>,,String Changes,Other Language Changes<18>
@anchor{whatsnew/2 3 optimizations}@anchor{16bf}
@subsubsection Optimizations



@itemize *

@item 
The creation of new-style class instances has been made much faster; they’re
now faster than classic classes!

@item 
The @ref{dce,,sort()} method of list objects has been extensively rewritten by Tim
Peters, and the implementation is significantly faster.

@item 
Multiplication of large long integers is now much faster thanks to an
implementation of Karatsuba multiplication, an algorithm that scales better than
the `O'(`n'@w{^2}) required for the grade-school multiplication algorithm.  (Original
patch by Christopher A. Craig, and significantly reworked by Tim Peters.)

@item 
The @code{SET_LINENO} opcode is now gone.  This may provide a small speed
increase, depending on your compiler’s idiosyncrasies. See section
@ref{16c0,,Other Changes and Fixes} for a longer explanation. (Removed by Michael Hudson.)

@item 
@code{xrange()} objects now have their own iterator, making @code{for i in
xrange(n)} slightly faster than @code{for i in range(n)}.  (Patch by Raymond
Hettinger.)

@item 
A number of small rearrangements have been made in various hotspots to improve
performance, such as inlining a function or removing some code.  (Implemented
mostly by GvR, but lots of people have contributed single changes.)
@end itemize

The net result of the 2.3 optimizations is that Python 2.3 runs the  pystone
benchmark around 25% faster than Python 2.2.

@c ======================================================================

@node New Improved and Deprecated Modules<4>,Pymalloc A Specialized Object Allocator,Other Language Changes<18>,What’s New in Python 2 3
@anchor{whatsnew/2 3 new-improved-and-deprecated-modules}@anchor{16c1}
@subsection New, Improved, and Deprecated Modules


As usual, Python’s standard library received a number of enhancements and bug
fixes.  Here’s a partial list of the most notable changes, sorted alphabetically
by module name. Consult the @code{Misc/NEWS} file in the source tree for a more
complete list of changes, or look through the CVS logs for all the details.


@itemize *

@item 
The @ref{8,,array} module now supports arrays of Unicode characters using the
@code{'u'} format character.  Arrays also now support using the @code{+=} assignment
operator to add another array’s contents, and the @code{*=} assignment operator to
repeat an array. (Contributed by Jason Orendorff.)

@item 
The @code{bsddb} module has been replaced by version 4.1.6 of the PyBSDDB@footnote{https://pybsddb.sourceforge.net} package, providing a more complete interface
to the transactional features of the BerkeleyDB library.

The old version of the module has been renamed to  @code{bsddb185} and is no
longer built automatically; you’ll  have to edit @code{Modules/Setup} to enable
it.  Note that the new @code{bsddb} package is intended to be compatible with
the  old module, so be sure to file bugs if you discover any incompatibilities.
When upgrading to Python 2.3, if the new interpreter is compiled with a new
version of  the underlying BerkeleyDB library, you will almost certainly have to
convert your database files to the new version.  You can do this fairly easily
with the new scripts @code{db2pickle.py} and @code{pickle2db.py} which you
will find in the distribution’s @code{Tools/scripts} directory.  If you’ve
already been using the PyBSDDB package and importing it as @code{bsddb3}, you
will have to change your @code{import} statements to import it as @code{bsddb}.

@item 
The new @ref{14,,bz2} module is an interface to the bz2 data compression library.
bz2-compressed data is usually smaller than  corresponding
@ref{13a,,zlib}-compressed data. (Contributed by Gustavo Niemeyer.)

@item 
A set of standard date/time types has been added in the new @ref{34,,datetime}
module.  See the following section for more details.

@item 
The Distutils @code{Extension} class now supports an extra constructor
argument named `depends' for listing additional source files that an extension
depends on.  This lets Distutils recompile the module if any of the dependency
files are modified.  For example, if @code{sampmodule.c} includes the header
file @code{sample.h}, you would create the @code{Extension} object like
this:

@example
ext = Extension("samp",
                sources=["sampmodule.c"],
                depends=["sample.h"])
@end example

Modifying @code{sample.h} would then cause the module to be recompiled.
(Contributed by Jeremy Hylton.)

@item 
Other minor changes to Distutils: it now checks for the 
@geindex CC
@geindex environment variable; CC
@ref{16c2,,CC},
@geindex CFLAGS
@geindex environment variable; CFLAGS
@ref{16c3,,CFLAGS}, @code{CPP}, 
@geindex LDFLAGS
@geindex environment variable; LDFLAGS
@ref{16c4,,LDFLAGS}, and 
@geindex CPPFLAGS
@geindex environment variable; CPPFLAGS
@ref{16c5,,CPPFLAGS}
environment variables, using them to override the settings in Python’s
configuration (contributed by Robert Weber).

@item 
Previously the @ref{3e,,doctest} module would only search the docstrings of
public methods and functions for test cases, but it now also examines private
ones as well.  The @ref{ffa,,DocTestSuite()} function creates a
@ref{ffb,,unittest.TestSuite} object from a set of @code{doctest} tests.

@item 
The new @code{gc.get_referents(object)} function returns a list of all the
objects referenced by `object'.

@item 
The @ref{65,,getopt} module gained a new function, @ref{16c6,,gnu_getopt()}, that
supports the same arguments as the existing @ref{16c7,,getopt()} function but uses
GNU-style scanning mode. The existing @code{getopt()} stops processing options as
soon as a non-option argument is encountered, but in GNU-style mode processing
continues, meaning that options and arguments can be mixed.  For example:

@example
>>> getopt.getopt(['-f', 'filename', 'output', '-v'], 'f:v')
([('-f', 'filename')], ['output', '-v'])
>>> getopt.gnu_getopt(['-f', 'filename', 'output', '-v'], 'f:v')
([('-f', 'filename'), ('-v', '@w{'})], ['output'])
@end example

(Contributed by Peter Åstrand.)

@item 
The @ref{6a,,grp}, @ref{b7,,pwd}, and @ref{c1,,resource} modules now return enhanced
tuples:

@example
>>> import grp
>>> g = grp.getgrnam('amk')
>>> g.gr_name, g.gr_gid
('amk', 500)
@end example

@item 
The @ref{6b,,gzip} module can now handle files exceeding 2 GiB.

@item 
The new @ref{6d,,heapq} module contains an implementation of a heap queue
algorithm.  A heap is an array-like data structure that keeps items in a
partially sorted order such that, for every index `k', @code{heap[k] <=
heap[2*k+1]} and @code{heap[k] <= heap[2*k+2]}.  This makes it quick to remove the
smallest item, and inserting a new item while maintaining the heap property is
`O'(log `n').  (See @indicateurl{https://xlinux.nist.gov/dads//HTML/priorityque.html} for more
information about the priority queue data structure.)

The @ref{6d,,heapq} module provides @ref{16c8,,heappush()} and @ref{16c9,,heappop()} functions
for adding and removing items while maintaining the heap property on top of some
other mutable Python sequence type.  Here’s an example that uses a Python list:

@example
>>> import heapq
>>> heap = []
>>> for item in [3, 7, 5, 11, 1]:
...    heapq.heappush(heap, item)
...
>>> heap
[1, 3, 5, 11, 7]
>>> heapq.heappop(heap)
1
>>> heapq.heappop(heap)
3
>>> heap
[5, 7, 11]
@end example

(Contributed by Kevin O’Connor.)

@item 
The IDLE integrated development environment has been updated using the code
from the IDLEfork project (@indicateurl{https://idlefork.sourceforge.net}).  The most notable feature is
that the code being developed is now executed in a subprocess, meaning that
there’s no longer any need for manual @code{reload()} operations. IDLE’s core code
has been incorporated into the standard library as the @ref{77,,idlelib} package.

@item 
The @ref{78,,imaplib} module now supports IMAP over SSL. (Contributed by Piers
Lauder and Tino Lange.)

@item 
The @ref{85,,itertools} contains a number of useful functions for use with
iterators, inspired by various functions provided by the ML and Haskell
languages.  For example, @code{itertools.ifilter(predicate, iterator)} returns all
elements in the iterator for which the function @code{predicate()} returns
@ref{e0d,,True}, and @code{itertools.repeat(obj, N)} returns @code{obj} `N' times.
There are a number of other functions in the module; see the package’s reference
documentation for details.
(Contributed by Raymond Hettinger.)

@item 
Two new functions in the @ref{92,,math} module, @code{degrees(rads)} and
@code{radians(degs)}, convert between radians and degrees.  Other functions in
the @code{math} module such as @ref{16ca,,math.sin()} and @ref{16cb,,math.cos()} have always
required input values measured in radians.  Also, an optional `base' argument
was added to @ref{16cc,,math.log()} to make it easier to compute logarithms for bases
other than @code{e} and @code{10}.  (Contributed by Raymond Hettinger.)

@item 
Several new POSIX functions (@code{getpgid()}, @code{killpg()}, @code{lchown()},
@code{loadavg()}, @code{major()}, @code{makedev()}, @code{minor()}, and
@code{mknod()}) were added to the @ref{b2,,posix} module that underlies the
@ref{a5,,os} module. (Contributed by Gustavo Niemeyer, Geert Jansen, and Denis S.
Otkidach.)

@item 
In the @ref{a5,,os} module, the @code{*stat()} family of functions can now report
fractions of a second in a timestamp.  Such time stamps are represented as
floats, similar to the value returned by @ref{55d,,time.time()}.

During testing, it was found that some applications will break if time stamps
are floats.  For compatibility, when using the tuple interface of the
@ref{16cd,,stat_result} time stamps will be represented as integers. When using
named fields (a feature first introduced in Python 2.2), time stamps are still
represented as integers, unless @code{os.stat_float_times()} is invoked to enable
float return values:

@example
>>> os.stat("/tmp").st_mtime
1034791200
>>> os.stat_float_times(True)
>>> os.stat("/tmp").st_mtime
1034791200.6335014
@end example

In Python 2.4, the default will change to always returning floats.

Application developers should enable this feature only if all their libraries
work properly when confronted with floating-point time stamps, or if they use
the tuple API. If used, the feature should be activated on an application level
instead of trying to enable it on a per-use basis.

@item 
The @ref{a4,,optparse} module contains a new parser for command-line arguments
that can convert option values to a particular Python type  and will
automatically generate a usage message.  See the following section for  more
details.

@item 
The old and never-documented @code{linuxaudiodev} module has been deprecated,
and a new version named @code{ossaudiodev} has been added.  The module was
renamed because the OSS sound drivers can be used on platforms other than Linux,
and the interface has also been tidied and brought up to date in various ways.
(Contributed by Greg Ward and Nicholas FitzRoy-Dale.)

@item 
The new @ref{af,,platform} module contains a number of functions that try to
determine various properties of the platform you’re running on.  There are
functions for getting the architecture, CPU type, the Windows OS version, and
even the Linux distribution version. (Contributed by Marc-André Lemburg.)

@item 
The parser objects provided by the @ref{12d,,pyexpat} module can now optionally
buffer character data, resulting in fewer calls to your character data handler
and therefore faster performance.  Setting the parser object’s
@ref{16ce,,buffer_text} attribute to @ref{e0d,,True} will enable buffering.

@item 
The @code{sample(population, k)} function was added to the @ref{bd,,random}
module.  `population' is a sequence or @code{xrange} object containing the
elements of a population, and @ref{952,,sample()} chooses `k' elements from the
population without replacing chosen elements.  `k' can be any value up to
@code{len(population)}. For example:

@example
>>> days = ['Mo', 'Tu', 'We', 'Th', 'Fr', 'St', 'Sn']
>>> random.sample(days, 3)      # Choose 3 elements
['St', 'Sn', 'Th']
>>> random.sample(days, 7)      # Choose 7 elements
['Tu', 'Th', 'Mo', 'We', 'St', 'Fr', 'Sn']
>>> random.sample(days, 7)      # Choose 7 again
['We', 'Mo', 'Sn', 'Fr', 'Tu', 'St', 'Th']
>>> random.sample(days, 8)      # Can't choose eight
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "random.py", line 414, in sample
      raise ValueError, "sample larger than population"
ValueError: sample larger than population
>>> random.sample(xrange(1,10000,2), 10)   # Choose ten odd nos. under 10000
[3407, 3805, 1505, 7023, 2401, 2267, 9733, 3151, 8083, 9195]
@end example

The @ref{bd,,random} module now uses a new algorithm, the Mersenne Twister,
implemented in C.  It’s faster and more extensively studied than the previous
algorithm.

(All changes contributed by Raymond Hettinger.)

@item 
The @ref{bf,,readline} module also gained a number of new functions:
@ref{16cf,,get_history_item()}, @ref{16d0,,get_current_history_length()}, and
@ref{16d1,,redisplay()}.

@item 
The @code{rexec} and @code{Bastion} modules have been declared dead, and
attempts to import them will fail with a @ref{246,,RuntimeError}.  New-style classes
provide new ways to break out of the restricted execution environment provided
by @code{rexec}, and no one has interest in fixing them or time to do so.  If
you have applications using @code{rexec}, rewrite them to use something else.

(Sticking with Python 2.2 or 2.1 will not make your applications any safer
because there are known bugs in the @code{rexec} module in those versions.  To
repeat: if you’re using @code{rexec}, stop using it immediately.)

@item 
The @code{rotor} module has been deprecated because the  algorithm it uses for
encryption is not believed to be secure.  If you need encryption, use one of the
several AES Python modules that are available separately.

@item 
The @ref{ca,,shutil} module gained a @code{move(src, dest)} function that
recursively moves a file or directory to a new location.

@item 
Support for more advanced POSIX signal handling was added to the @ref{cb,,signal}
but then removed again as it proved impossible to make it work reliably across
platforms.

@item 
The @ref{d1,,socket} module now supports timeouts.  You can call the
@code{settimeout(t)} method on a socket object to set a timeout of `t' seconds.
Subsequent socket operations that take longer than `t' seconds to complete will
abort and raise a @ref{a3b,,socket.timeout} exception.

The original timeout implementation was by Tim O’Malley.  Michael Gilfix
integrated it into the Python @ref{d1,,socket} module and shepherded it through a
lengthy review.  After the code was checked in, Guido van Rossum rewrote parts
of it.  (This is a good example of a collaborative development process in
action.)

@item 
On Windows, the @ref{d1,,socket} module now ships with Secure  Sockets Layer
(SSL) support.

@item 
The value of the C @code{PYTHON_API_VERSION} macro is now exposed at the
Python level as @code{sys.api_version}.  The current exception can be cleared by
calling the new @code{sys.exc_clear()} function.

@item 
The new @ref{e4,,tarfile} module  allows reading from and writing to
@code{tar}-format archive files. (Contributed by Lars Gustäbel.)

@item 
The new @ref{f2,,textwrap} module contains functions for wrapping strings
containing paragraphs of text.  The @code{wrap(text, width)} function takes a
string and returns a list containing the text split into lines of no more than
the chosen width.  The @code{fill(text, width)} function returns a single
string, reformatted to fit into lines no longer than the chosen width. (As you
can guess, @ref{16d2,,fill()} is built on top of @ref{16d3,,wrap()}.  For example:

@example
>>> import textwrap
>>> paragraph = "Not a whit, we defy augury: ... more text ..."
>>> textwrap.wrap(paragraph, 60)
["Not a whit, we defy augury: there's a special providence in",
 "the fall of a sparrow. If it be now, 'tis not to come; if it",
 ...]
>>> print textwrap.fill(paragraph, 35)
Not a whit, we defy augury: there's
a special providence in the fall of
a sparrow. If it be now, 'tis not
to come; if it be not to come, it
will be now; if it be not now, yet
it will come: the readiness is all.
>>>
@end example

The module also contains a @ref{11d3,,TextWrapper} class that actually implements
the text wrapping strategy.   Both the @code{TextWrapper} class and the
@ref{16d3,,wrap()} and @ref{16d2,,fill()} functions support a number of additional keyword
arguments for fine-tuning the formatting; consult the module’s documentation
for details. (Contributed by Greg Ward.)

@item 
The @code{thread} and @ref{f3,,threading} modules now have companion modules,
@code{dummy_thread} and @code{dummy_threading}, that provide a do-nothing
implementation of the @code{thread} module’s interface for platforms where
threads are not supported.  The intention is to simplify thread-aware modules
(ones that `don’t' rely on threads to run) by putting the following code at the
top:

@example
try:
    import threading as _threading
except ImportError:
    import dummy_threading as _threading
@end example

In this example, @code{_threading} is used as the module name to make it clear
that the module being used is not necessarily the actual @ref{f3,,threading}
module. Code can call functions and use classes in @code{_threading} whether or
not threads are supported, avoiding an @ref{182,,if} statement and making the
code slightly clearer.  This module will not magically make multithreaded code
run without threads; code that waits for another thread to return or to do
something will simply hang forever.

@item 
The @ref{f4,,time} module’s @ref{1639,,strptime()} function has long been an annoyance
because it uses the platform C library’s @code{strptime()} implementation, and
different platforms sometimes have odd bugs.  Brett Cannon contributed a
portable implementation that’s written in pure Python and should behave
identically on all platforms.

@item 
The new @ref{f5,,timeit} module helps measure how long snippets of Python code
take to execute.  The @code{timeit.py} file can be run directly from the
command line, or the module’s @ref{16d4,,Timer} class can be imported and used
directly.  Here’s a short example that figures out whether it’s faster to
convert an 8-bit string to Unicode by appending an empty Unicode string to it or
by using the @code{unicode()} function:

@example
import timeit

timer1 = timeit.Timer('unicode("abc")')
timer2 = timeit.Timer('"abc" + u""')

# Run three trials
print timer1.repeat(repeat=3, number=100000)
print timer2.repeat(repeat=3, number=100000)

# On my laptop this outputs:
# [0.36831796169281006, 0.37441694736480713, 0.35304892063140869]
# [0.17574405670166016, 0.18193507194519043, 0.17565798759460449]
@end example

@item 
The @code{Tix} module has received various bug fixes and updates for the
current version of the Tix package.

@item 
The @code{Tkinter} module now works with a thread-enabled  version of Tcl.
Tcl’s threading model requires that widgets only be accessed from the thread in
which they’re created; accesses from another thread can cause Tcl to panic.  For
certain Tcl interfaces, @code{Tkinter} will now automatically avoid this  when a
widget is accessed from a different thread by marshalling a command, passing it
to the correct thread, and waiting for the results.  Other interfaces can’t be
handled automatically but @code{Tkinter} will now raise an exception on such an
access so that you can at least find out about the problem.  See
@indicateurl{https://mail.python.org/pipermail/python-dev/2002-December/031107.html} for a more
detailed explanation of this change.  (Implemented by Martin von Löwis.)

@item 
Calling Tcl methods through @code{_tkinter} no longer  returns only strings.
Instead, if Tcl returns other objects those objects are converted to their
Python equivalent, if one exists, or wrapped with a @code{_tkinter.Tcl_Obj}
object if no Python equivalent exists. This behavior can be controlled through
the @code{wantobjects()} method of @code{tkapp} objects.

When using @code{_tkinter} through the @code{Tkinter} module (as most Tkinter
applications will), this feature is always activated. It should not cause
compatibility problems, since Tkinter would always convert string results to
Python types where possible.

If any incompatibilities are found, the old behavior can be restored by setting
the @code{wantobjects} variable in the @code{Tkinter} module to false before
creating the first @code{tkapp} object.

@example
import Tkinter
Tkinter.wantobjects = 0
@end example

Any breakage caused by this change should be reported as a bug.

@item 
The @code{UserDict} module has a new @code{DictMixin} class which defines
all dictionary methods for classes that already have a minimum mapping
interface.  This greatly simplifies writing classes that need to be
substitutable for dictionaries, such as the classes in  the @ref{c8,,shelve}
module.

Adding the mix-in as a superclass provides the full dictionary interface
whenever the class defines @ref{588,,__getitem__()}, @ref{14d7,,__setitem__()},
@ref{14d8,,__delitem__()}, and @code{keys()}. For example:

@example
>>> import UserDict
>>> class SeqDict(UserDict.DictMixin):
...     """Dictionary lookalike implemented with lists."""
...     def __init__(self):
...         self.keylist = []
...         self.valuelist = []
...     def __getitem__(self, key):
...         try:
...             i = self.keylist.index(key)
...         except ValueError:
...             raise KeyError
...         return self.valuelist[i]
...     def __setitem__(self, key, value):
...         try:
...             i = self.keylist.index(key)
...             self.valuelist[i] = value
...         except ValueError:
...             self.keylist.append(key)
...             self.valuelist.append(value)
...     def __delitem__(self, key):
...         try:
...             i = self.keylist.index(key)
...         except ValueError:
...             raise KeyError
...         self.keylist.pop(i)
...         self.valuelist.pop(i)
...     def keys(self):
...         return list(self.keylist)
...
>>> s = SeqDict()
>>> dir(s)      # See that other dictionary methods are implemented
['__cmp__', '__contains__', '__delitem__', '__doc__', '__getitem__',
 '__init__', '__iter__', '__len__', '__module__', '__repr__',
 '__setitem__', 'clear', 'get', 'has_key', 'items', 'iteritems',
 'iterkeys', 'itervalues', 'keylist', 'keys', 'pop', 'popitem',
 'setdefault', 'update', 'valuelist', 'values']
@end example

(Contributed by Raymond Hettinger.)

@item 
The DOM implementation in @ref{129,,xml.dom.minidom} can now generate XML output
in a particular encoding by providing an optional encoding argument to the
@ref{c90,,toxml()} and @ref{c91,,toprettyxml()} methods of DOM nodes.

@item 
The @code{xmlrpclib} module now supports an XML-RPC extension for handling nil
data values such as Python’s @code{None}.  Nil values are always supported on
unmarshalling an XML-RPC response.  To generate requests containing @code{None},
you must supply a true value for the `allow_none' parameter when creating a
@code{Marshaller} instance.

@item 
The new @code{DocXMLRPCServer} module allows writing self-documenting XML-RPC
servers. Run it in demo mode (as a program) to see it in action.   Pointing the
web browser to the RPC server produces pydoc-style documentation; pointing
xmlrpclib to the server allows invoking the actual methods. (Contributed by
Brian Quinlan.)

@item 
Support for internationalized domain names (RFCs 3454, 3490, 3491, and 3492)
has been added. The “idna” encoding can be used to convert between a Unicode
domain name and the ASCII-compatible encoding (ACE) of that name.

@example
>@{@}>@{@}> u"www.Alliancefrançaise.nu".encode("idna")
'www.xn--alliancefranaise-npb.nu'
@end example

The @ref{d1,,socket} module has also been extended to transparently convert
Unicode hostnames to the ACE version before passing them to the C library.
Modules that deal with hostnames such as @code{httplib} and @ref{62,,ftplib})
also support Unicode host names; @code{httplib} also sends HTTP @code{Host}
headers using the ACE version of the domain name.  @ref{10f,,urllib} supports
Unicode URLs with non-ASCII host names as long as the @code{path} part of the URL
is ASCII only.

To implement this change, the @ref{da,,stringprep} module, the  @code{mkstringprep}
tool and the @code{punycode} encoding have been added.
@end itemize

@c ======================================================================

@menu
* Date/Time Type:: 
* The optparse Module:: 

@end menu

@node Date/Time Type,The optparse Module,,New Improved and Deprecated Modules<4>
@anchor{whatsnew/2 3 date-time-type}@anchor{16d5}
@subsubsection Date/Time Type


Date and time types suitable for expressing timestamps were added as the
@ref{34,,datetime} module.  The types don’t support different calendars or many
fancy features, and just stick to the basics of representing time.

The three primary types are: @ref{1fc,,date}, representing a day, month, and year;
@ref{1fd,,time}, consisting of hour, minute, and second; and @ref{4e3,,datetime},
which contains all the attributes of both @code{date} and @code{time}.
There’s also a @ref{bc9,,timedelta} class representing differences between two
points in time, and time zone logic is implemented by classes inheriting from
the abstract @ref{7f7,,tzinfo} class.

You can create instances of @ref{1fc,,date} and @ref{1fd,,time} by either supplying
keyword arguments to the appropriate constructor, e.g.
@code{datetime.date(year=1972, month=10, day=15)}, or by using one of a number of
class methods.  For example, the @ref{16d6,,today()} class method returns the
current local date.

Once created, instances of the date/time classes are all immutable. There are a
number of methods for producing formatted strings from objects:

@example
>>> import datetime as dt
>>> now = dt.datetime.now()
>>> now.isoformat()
'2002-12-30T21:27:03.994956'
>>> now.ctime()  # Only available on date, datetime
'Mon Dec 30 21:27:03 2002'
>>> now.strftime('%Y %d %b')
'2002 30 Dec'
@end example

The @ref{16d7,,replace()} method allows modifying one or more fields  of a
@ref{1fc,,date} or @ref{4e3,,datetime} instance, returning a new instance:

@example
>>> d = dt.datetime.now()
>>> d
datetime.datetime(2002, 12, 30, 22, 15, 38, 827738)
>>> d.replace(year=2001, hour=12)
datetime.datetime(2001, 12, 30, 12, 15, 38, 827738)
>>>
@end example

Instances can be compared, hashed, and converted to strings (the result is the
same as that of @ref{d2b,,isoformat()}).  @ref{1fc,,date} and @ref{4e3,,datetime}
instances can be subtracted from each other, and added to @ref{bc9,,timedelta}
instances.  The largest missing feature is that there’s no standard library
support for parsing strings and getting back a @code{date} or
@code{datetime}.

For more information, refer to the module’s reference documentation.
(Contributed by Tim Peters.)

@c ======================================================================

@node The optparse Module,,Date/Time Type,New Improved and Deprecated Modules<4>
@anchor{whatsnew/2 3 the-optparse-module}@anchor{16d8}
@subsubsection The optparse Module


The @ref{65,,getopt} module provides simple parsing of command-line arguments.  The
new @ref{a4,,optparse} module (originally named Optik) provides more elaborate
command-line parsing that follows the Unix conventions, automatically creates
the output for @code{--help}, and can perform different actions for different
options.

You start by creating an instance of @ref{16d9,,OptionParser} and telling it what
your program’s options are.

@example
import sys
from optparse import OptionParser

op = OptionParser()
op.add_option('-i', '--input',
              action='store', type='string', dest='input',
              help='set input filename')
op.add_option('-l', '--length',
              action='store', type='int', dest='length',
              help='set maximum length of output')
@end example

Parsing a command line is then done by calling the @ref{16da,,parse_args()} method.

@example
options, args = op.parse_args(sys.argv[1:])
print options
print args
@end example

This returns an object containing all of the option values, and a list of
strings containing the remaining arguments.

Invoking the script with the various arguments now works as you’d expect it to.
Note that the length argument is automatically converted to an integer.

@example
$ ./python opt.py -i data arg1
<Values at 0x400cad4c: @{'input': 'data', 'length': None@}>
['arg1']
$ ./python opt.py --input=data --length=4
<Values at 0x400cad2c: @{'input': 'data', 'length': 4@}>
[]
$
@end example

The help message is automatically generated for you:

@example
$ ./python opt.py --help
usage: opt.py [options]

options:
  -h, --help            show this help message and exit
  -iINPUT, --input=INPUT
                        set input filename
  -lLENGTH, --length=LENGTH
                        set maximum length of output
$
@end example

See the module’s documentation for more details.

Optik was written by Greg Ward, with suggestions from the readers of the Getopt
SIG.

@c ======================================================================

@node Pymalloc A Specialized Object Allocator,Build and C API Changes<12>,New Improved and Deprecated Modules<4>,What’s New in Python 2 3
@anchor{whatsnew/2 3 pymalloc-a-specialized-object-allocator}@anchor{16db}@anchor{whatsnew/2 3 section-pymalloc}@anchor{16dc}
@subsection Pymalloc: A Specialized Object Allocator


Pymalloc, a specialized object allocator written by Vladimir Marangozov, was a
feature added to Python 2.1.  Pymalloc is intended to be faster than the system
@code{malloc()} and to have less memory overhead for allocation patterns typical
of Python programs. The allocator uses C’s @code{malloc()} function to get large
pools of memory and then fulfills smaller memory requests from these pools.

In 2.1 and 2.2, pymalloc was an experimental feature and wasn’t enabled by
default; you had to explicitly enable it when compiling Python by providing the
@code{--with-pymalloc} option to the @code{configure} script.  In 2.3,
pymalloc has had further enhancements and is now enabled by default; you’ll have
to supply @code{--without-pymalloc} to disable it.

This change is transparent to code written in Python; however, pymalloc may
expose bugs in C extensions.  Authors of C extension modules should test their
code with pymalloc enabled, because some incorrect code may cause core dumps at
runtime.

There’s one particularly common error that causes problems.  There are a number
of memory allocation functions in Python’s C API that have previously just been
aliases for the C library’s @code{malloc()} and @code{free()}, meaning that if
you accidentally called mismatched functions the error wouldn’t be noticeable.
When the object allocator is enabled, these functions aren’t aliases of
@code{malloc()} and @code{free()} any more, and calling the wrong function to
free memory may get you a core dump.  For example, if memory was allocated using
@ref{e68,,PyObject_Malloc()}, it has to be freed using @ref{e65,,PyObject_Free()}, not
@code{free()}.  A few modules included with Python fell afoul of this and had to
be fixed; doubtless there are more third-party modules that will have the same
problem.

As part of this change, the confusing multiple interfaces for allocating memory
have been consolidated down into two API families. Memory allocated with one
family must not be manipulated with functions from the other family.  There is
one family for allocating chunks of memory and another family of functions
specifically for allocating Python objects.


@itemize *

@item 
To allocate and free an undistinguished chunk of memory use the “raw memory”
family: @ref{e66,,PyMem_Malloc()}, @ref{1238,,PyMem_Realloc()}, and @ref{164e,,PyMem_Free()}.

@item 
The “object memory” family is the interface to the pymalloc facility described
above and is biased towards a large number of “small” allocations:
@ref{e68,,PyObject_Malloc()}, @ref{164f,,PyObject_Realloc()}, and @ref{e65,,PyObject_Free()}.

@item 
To allocate and free Python objects, use the “object” family
@ref{b82,,PyObject_New}, @ref{b83,,PyObject_NewVar}, and @ref{16dd,,PyObject_Del()}.
@end itemize

Thanks to lots of work by Tim Peters, pymalloc in 2.3 also provides debugging
features to catch memory overwrites and doubled frees in both extension modules
and in the interpreter itself.  To enable this support, compile a debugging
version of the Python interpreter by running @code{configure} with
@code{--with-pydebug}.

To aid extension writers, a header file @code{Misc/pymemcompat.h} is
distributed with the source to Python 2.3 that allows Python extensions to use
the 2.3 interfaces to memory allocation while compiling against any version of
Python since 1.5.2.  You would copy the file from Python’s source distribution
and bundle it with the source of your extension.


@subsubheading See also



@table @asis

@item @indicateurl{https://hg.python.org/cpython/file/default/Objects/obmalloc.c}

For the full details of the pymalloc implementation, see the comments at
the top of the file @code{Objects/obmalloc.c} in the Python source code.
The above link points to the file within the python.org SVN browser.
@end table


@c ======================================================================

@node Build and C API Changes<12>,Other Changes and Fixes<2>,Pymalloc A Specialized Object Allocator,What’s New in Python 2 3
@anchor{whatsnew/2 3 build-and-c-api-changes}@anchor{16de}
@subsection Build and C API Changes


Changes to Python’s build process and to the C API include:


@itemize *

@item 
The cycle detection implementation used by the garbage collection has proven
to be stable, so it’s now been made mandatory.  You can no longer compile Python
without it, and the @code{--with-cycle-gc} switch to @code{configure} has
been removed.

@item 
Python can now optionally be built as a shared library
(@code{libpython2.3.so}) by supplying @code{--enable-shared} when running
Python’s @code{configure} script.  (Contributed by Ondrej Palkovsky.)

@item 
The @code{DL_EXPORT} and @code{DL_IMPORT} macros are now deprecated.
Initialization functions for Python extension modules should now be declared
using the new macro @ref{16df,,PyMODINIT_FUNC}, while the Python core will
generally use the @code{PyAPI_FUNC} and @code{PyAPI_DATA} macros.

@item 
The interpreter can be compiled without any docstrings for the built-in
functions and modules by supplying @code{--without-doc-strings} to the
@code{configure} script. This makes the Python executable about 10% smaller,
but will also mean that you can’t get help for Python’s built-ins.  (Contributed
by Gustavo Niemeyer.)

@item 
The @code{PyArg_NoArgs()} macro is now deprecated, and code that uses it
should be changed.  For Python 2.2 and later, the method definition table can
specify the @ref{16e0,,METH_NOARGS} flag, signalling that there are no arguments,
and the argument checking can then be removed.  If compatibility with pre-2.2
versions of Python is important, the code could use @code{PyArg_ParseTuple(args,
"")} instead, but this will be slower than using @code{METH_NOARGS}.

@item 
@ref{3bf,,PyArg_ParseTuple()} accepts new format characters for various sizes of
unsigned integers: @code{B} for unsigned char, @code{H} for unsigned short int,  @code{I} for unsigned int,  and @code{K} for unsigned long long.

@item 
A new function, @code{PyObject_DelItemString(mapping, char *key)} was added
as shorthand for @code{PyObject_DelItem(mapping, PyString_New(key))}.

@item 
File objects now manage their internal string buffer differently, increasing
it exponentially when needed.  This results in the benchmark tests in
@code{Lib/test/test_bufio.py} speeding up considerably (from 57 seconds to 1.7
seconds, according to one measurement).

@item 
It’s now possible to define class and static methods for a C extension type by
setting either the @ref{16e1,,METH_CLASS} or @ref{16e2,,METH_STATIC} flags in a
method’s @ref{16e3,,PyMethodDef} structure.

@item 
Python now includes a copy of the Expat XML parser’s source code, removing any
dependence on a system version or local installation of Expat.

@item 
If you dynamically allocate type objects in your extension, you should be
aware of a change in the rules relating to the @ref{617,,__module__} and
@ref{16b7,,__name__} attributes.  In summary, you will want to ensure the type’s
dictionary contains a @code{'__module__'} key; making the module name the part of
the type name leading up to the final period will no longer have the desired
effect.  For more detail, read the API reference documentation or the  source.
@end itemize

@c ======================================================================

@menu
* Port-Specific Changes: Port-Specific Changes<3>. 

@end menu

@node Port-Specific Changes<3>,,,Build and C API Changes<12>
@anchor{whatsnew/2 3 port-specific-changes}@anchor{16e4}
@subsubsection Port-Specific Changes


Support for a port to IBM’s OS/2 using the EMX runtime environment was merged
into the main Python source tree.  EMX is a POSIX emulation layer over the OS/2
system APIs.  The Python port for EMX tries to support all the POSIX-like
capability exposed by the EMX runtime, and mostly succeeds; @code{fork()} and
@ref{5d,,fcntl()} are restricted by the limitations of the underlying emulation
layer.  The standard OS/2 port, which uses IBM’s Visual Age compiler, also
gained support for case-sensitive import semantics as part of the integration of
the EMX port into CVS.  (Contributed by Andrew MacIntyre.)

On MacOS, most toolbox modules have been weaklinked to improve backward
compatibility.  This means that modules will no longer fail to load if a single
routine is missing on the current OS version. Instead calling the missing
routine will raise an exception. (Contributed by Jack Jansen.)

The RPM spec files, found in the @code{Misc/RPM/} directory in the Python
source distribution, were updated for 2.3.  (Contributed by Sean Reifschneider.)

Other new platforms now supported by Python include AtheOS
(@indicateurl{http://www.atheos.cx/}), GNU/Hurd, and OpenVMS.

@c ======================================================================

@node Other Changes and Fixes<2>,Porting to Python 2 3,Build and C API Changes<12>,What’s New in Python 2 3
@anchor{whatsnew/2 3 other-changes-and-fixes}@anchor{16e5}@anchor{whatsnew/2 3 section-other}@anchor{16c0}
@subsection Other Changes and Fixes


As usual, there were a bunch of other improvements and bugfixes scattered
throughout the source tree.  A search through the CVS change logs finds there
were 523 patches applied and 514 bugs fixed between Python 2.2 and 2.3.  Both
figures are likely to be underestimates.

Some of the more notable changes are:


@itemize *

@item 
If the 
@geindex PYTHONINSPECT
@geindex environment variable; PYTHONINSPECT
@ref{16e6,,PYTHONINSPECT} environment variable is set, the Python
interpreter will enter the interactive prompt after running a Python program, as
if Python had been invoked with the @ref{16e7,,-i} option. The environment
variable can be set before running the Python interpreter, or it can be set by
the Python program as part of its execution.

@item 
The @code{regrtest.py} script now provides a way to allow “all resources
except `foo'.”  A resource name passed to the @code{-u} option can now be
prefixed with a hyphen (@code{'-'}) to mean “remove this resource.”  For example,
the option ‘@code{-uall,-bsddb}’ could be used to enable the use of all resources
except @code{bsddb}.

@item 
The tools used to build the documentation now work under Cygwin as well as
Unix.

@item 
The @code{SET_LINENO} opcode has been removed.  Back in the mists of time, this
opcode was needed to produce line numbers in tracebacks and support trace
functions (for, e.g., @ref{aa,,pdb}). Since Python 1.5, the line numbers in
tracebacks have been computed using a different mechanism that works with
“python -O”.  For Python 2.3 Michael Hudson implemented a similar scheme to
determine when to call the trace function, removing the need for @code{SET_LINENO}
entirely.

It would be difficult to detect any resulting difference from Python code, apart
from a slight speed up when Python is run without @ref{18d,,-O}.

C extensions that access the @ref{9b5,,f_lineno} field of frame objects should
instead call @code{PyCode_Addr2Line(f->f_code, f->f_lasti)}. This will have the
added effect of making the code work as desired under “python -O” in earlier
versions of Python.

A nifty new feature is that trace functions can now assign to the
@ref{9b5,,f_lineno} attribute of frame objects, changing the line that will be
executed next.  A @code{jump} command has been added to the @ref{aa,,pdb} debugger
taking advantage of this new feature. (Implemented by Richie Hindle.)
@end itemize

@c ======================================================================

@node Porting to Python 2 3,Acknowledgements<5>,Other Changes and Fixes<2>,What’s New in Python 2 3
@anchor{whatsnew/2 3 porting-to-python-2-3}@anchor{16e8}
@subsection Porting to Python 2.3


This section lists previously described changes that may require changes to your
code:


@itemize *

@item 
@ref{bc8,,yield} is now always a keyword; if it’s used as a variable name in
your code, a different name must be chosen.

@item 
For strings `X' and `Y', @code{X in Y} now works if `X' is more than one
character long.

@item 
The @ref{19c,,int()} type constructor will now return a long integer instead of
raising an @ref{a87,,OverflowError} when a string or floating-point number is too
large to fit into an integer.

@item 
If you have Unicode strings that contain 8-bit characters, you must declare
the file’s encoding (UTF-8, Latin-1, or whatever) by adding a comment to the top
of the file.  See section @ref{1696,,PEP 263; Source Code Encodings} for more information.

@item 
Calling Tcl methods through @code{_tkinter} no longer  returns only strings.
Instead, if Tcl returns other objects those objects are converted to their
Python equivalent, if one exists, or wrapped with a @code{_tkinter.Tcl_Obj}
object if no Python equivalent exists.

@item 
Large octal and hex literals such as @code{0xffffffff} now trigger a
@ref{659,,FutureWarning}. Currently they’re stored as 32-bit numbers and result in a
negative value, but in Python 2.4 they’ll become positive long integers.

There are a few ways to fix this warning.  If you really need a positive number,
just add an @code{L} to the end of the literal.  If you’re trying to get a 32-bit
integer with low bits set and have previously used an expression such as @code{~(1
<< 31)}, it’s probably clearest to start with all bits set and clear the
desired upper bits. For example, to clear just the top bit (bit 31), you could
write @code{0xffffffffL &~(1L<<31)}.

@item 
You can no longer disable assertions by assigning to @code{__debug__}.

@item 
The Distutils @code{setup()} function has gained various new keyword arguments
such as `depends'.  Old versions of the Distutils will abort if passed unknown
keywords.  A solution is to check for the presence of the new
@code{get_distutil_options()} function in your @code{setup.py} and only uses the
new keywords with a version of the Distutils that supports them:

@example
from distutils import core

kw = @{'sources': 'foo.c', ...@}
if hasattr(core, 'get_distutil_options'):
    kw['depends'] = ['foo.h']
ext = Extension(**kw)
@end example

@item 
Using @code{None} as a variable name will now result in a @ref{1af,,SyntaxWarning}
warning.

@item 
Names of extension types defined by the modules included with Python now
contain the module and a @code{'.'} in front of the type name.
@end itemize

@c ======================================================================

@node Acknowledgements<5>,,Porting to Python 2 3,What’s New in Python 2 3
@anchor{whatsnew/2 3 acknowledgements}@anchor{16e9}@anchor{whatsnew/2 3 acks}@anchor{16ea}
@subsection Acknowledgements


The author would like to thank the following people for offering suggestions,
corrections and assistance with various drafts of this article: Jeff Bauer,
Simon Brunning, Brett Cannon, Michael Chermside, Andrew Dalke, Scott David
Daniels, Fred L. Drake, Jr., David Fraser,  Kelly Gerber, Raymond Hettinger,
Michael Hudson, Chris Lambert, Detlef Lannert, Martin von Löwis, Andrew
MacIntyre, Lalo Martins, Chad Netzer, Gustavo Niemeyer, Neal Norwitz, Hans
Nowak, Chris Reedy, Francesco Ricciardi, Vinay Sajip, Neil Schemenauer, Roman
Suzi, Jason Tishler, Just van Rossum.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node What’s New in Python 2 2,What’s New in Python 2 1,What’s New in Python 2 3,What’s New in Python
@anchor{whatsnew/2 2 doc}@anchor{16eb}@anchor{whatsnew/2 2 translation-repo}@anchor{16ec}@anchor{whatsnew/2 2 what-s-new-in-python-2-2}@anchor{16ed}
@section What’s New in Python 2.2


@*Author: 
A.M. Kuchling


@c $Id: whatsnew22.tex 37315 2004-09-10 19:33:00Z akuchling $

@menu
* Introduction:: 
* PEPs 252 and 253; Type and Class Changes: PEPs 252 and 253 Type and Class Changes. 
* PEP 234; Iterators: PEP 234 Iterators. 
* PEP 255; Simple Generators: PEP 255 Simple Generators<2>. 
* PEP 237; Unifying Long Integers and Integers: PEP 237 Unifying Long Integers and Integers<2>. 
* PEP 238; Changing the Division Operator: PEP 238 Changing the Division Operator. 
* Unicode Changes:: 
* PEP 227; Nested Scopes: PEP 227 Nested Scopes. 
* New and Improved Modules: New and Improved Modules<3>. 
* Interpreter Changes and Fixes:: 
* Other Changes and Fixes: Other Changes and Fixes<3>. 
* Acknowledgements: Acknowledgements<6>. 

@end menu

@node Introduction,PEPs 252 and 253 Type and Class Changes,,What’s New in Python 2 2
@anchor{whatsnew/2 2 introduction}@anchor{16ee}
@subsection Introduction


This article explains the new features in Python 2.2.2, released on October 14,
2002.  Python 2.2.2 is a bugfix release of Python 2.2, originally released on
December 21, 2001.

Python 2.2 can be thought of as the “cleanup release”.  There are some features
such as generators and iterators that are completely new, but most of the
changes, significant and far-reaching though they may be, are aimed at cleaning
up irregularities and dark corners of the language design.

This article doesn’t attempt to provide a complete specification of the new
features, but instead provides a convenient overview.  For full details, you
should refer to the documentation for Python 2.2, such as the Python Library Reference@footnote{https://docs.python.org/2.2/lib/lib.html} and the Python Reference Manual@footnote{https://docs.python.org/2.2/ref/ref.html}.  If you want to
understand the complete implementation and design rationale for a change, refer
to the PEP for a particular new feature.

@c see also, now defunct
@c 
@c http://www.unixreview.com/documents/s=1356/urm0109h/0109h.htm
@c    "What's So Special About Python 2.2?" is also about the new 2.2 features, and
@c    was written by Cameron Laird and Kathryn Soraiz.

@c ======================================================================

@node PEPs 252 and 253 Type and Class Changes,PEP 234 Iterators,Introduction,What’s New in Python 2 2
@anchor{whatsnew/2 2 peps-252-and-253-type-and-class-changes}@anchor{16ef}
@subsection PEPs 252 and 253: Type and Class Changes


The largest and most far-reaching changes in Python 2.2 are to Python’s model of
objects and classes.  The changes should be backward compatible, so it’s likely
that your code will continue to run unchanged, but the changes provide some
amazing new capabilities. Before beginning this, the longest and most
complicated section of this article, I’ll provide an overview of the changes and
offer some comments.

A long time ago I wrote a web page listing flaws in Python’s design.  One of the
most significant flaws was that it’s impossible to subclass Python types
implemented in C.  In particular, it’s not possible to subclass built-in types,
so you can’t just subclass, say, lists in order to add a single useful method to
them. The @code{UserList} module provides a class that supports all of the
methods of lists and that can be subclassed further, but there’s lots of C code
that expects a regular Python list and won’t accept a @ref{16f0,,UserList}
instance.

Python 2.2 fixes this, and in the process adds some exciting new capabilities.
A brief summary:


@itemize *

@item 
You can subclass built-in types such as lists and even integers, and your
subclasses should work in every place that requires the original type.

@item 
It’s now possible to define static and class methods, in addition to the
instance methods available in previous versions of Python.

@item 
It’s also possible to automatically call methods on accessing or setting an
instance attribute by using a new mechanism called `properties'.  Many uses
of @ref{6fb,,__getattr__()} can be rewritten to use properties instead, making the
resulting code simpler and faster.  As a small side benefit, attributes can now
have docstrings, too.

@item 
The list of legal attributes for an instance can be limited to a particular
set using `slots', making it possible to safeguard against typos and
perhaps make more optimizations possible in future versions of Python.
@end itemize

Some users have voiced concern about all these changes.  Sure, they say, the new
features are neat and lend themselves to all sorts of tricks that weren’t
possible in previous versions of Python, but they also make the language more
complicated.  Some people have said that they’ve always recommended Python for
its simplicity, and feel that its simplicity is being lost.

Personally, I think there’s no need to worry.  Many of the new features are
quite esoteric, and you can write a lot of Python code without ever needed to be
aware of them.  Writing a simple class is no more difficult than it ever was, so
you don’t need to bother learning or teaching them unless they’re actually
needed.  Some very complicated tasks that were previously only possible from C
will now be possible in pure Python, and to my mind that’s all for the better.

I’m not going to attempt to cover every single corner case and small change that
were required to make the new features work.  Instead this section will paint
only the broad strokes.  See section @ref{16f1,,Related Links}, “Related Links”, for
further sources of information about Python 2.2’s new object model.

@menu
* Old and New Classes:: 
* Descriptors:: 
* Multiple Inheritance; The Diamond Rule: Multiple Inheritance The Diamond Rule. 
* Attribute Access:: 
* Related Links:: 

@end menu

@node Old and New Classes,Descriptors,,PEPs 252 and 253 Type and Class Changes
@anchor{whatsnew/2 2 old-and-new-classes}@anchor{16f2}
@subsubsection Old and New Classes


First, you should know that Python 2.2 really has two kinds of classes: classic
or old-style classes, and new-style classes.  The old-style class model is
exactly the same as the class model in earlier versions of Python.  All the new
features described in this section apply only to new-style classes. This
divergence isn’t intended to last forever; eventually old-style classes will be
dropped, possibly in Python 3.0.

So how do you define a new-style class?  You do it by subclassing an existing
new-style class.  Most of Python’s built-in types, such as integers, lists,
dictionaries, and even files, are new-style classes now.  A new-style class
named @ref{c84,,object}, the base class for all built-in types, has also been
added so if no built-in type is suitable, you can just subclass
@code{object}:

@example
class C(object):
    def __init__ (self):
        ...
    ...
@end example

This means that @ref{14e3,,class} statements that don’t have any base classes are
always classic classes in Python 2.2.  (Actually you can also change this by
setting a module-level variable named @code{__metaclass__} — see 
@geindex Python Enhancement Proposals; PEP 253
PEP 253@footnote{https://peps.python.org/pep-0253/}
for the details — but it’s easier to just subclass @ref{c84,,object}.)

The type objects for the built-in types are available as built-ins, named using
a clever trick.  Python has always had built-in functions named @ref{19c,,int()},
@ref{197,,float()}, and @ref{16a,,str()}.  In 2.2, they aren’t functions any more, but
type objects that behave as factories when called.

@example
>>> int
<type 'int'>
>>> int('123')
123
@end example

To make the set of types complete, new type objects such as @ref{184,,dict()} and
@code{file()} have been added.  Here’s a more interesting example, adding a
@code{lock()} method to file objects:

@example
class LockableFile(file):
    def lock (self, operation, length=0, start=0, whence=0):
        import fcntl
        return fcntl.lockf(self.fileno(), operation,
                           length, start, whence)
@end example

The now-obsolete @code{posixfile} module contained a class that emulated all of
a file object’s methods and also added a @code{lock()} method, but this class
couldn’t be passed to internal functions that expected a built-in file,
something which is possible with our new @code{LockableFile}.

@node Descriptors,Multiple Inheritance The Diamond Rule,Old and New Classes,PEPs 252 and 253 Type and Class Changes
@anchor{whatsnew/2 2 descriptors}@anchor{16f3}
@subsubsection Descriptors


In previous versions of Python, there was no consistent way to discover what
attributes and methods were supported by an object. There were some informal
conventions, such as defining @code{__members__} and @code{__methods__}
attributes that were lists of names, but often the author of an extension type
or a class wouldn’t bother to define them.  You could fall back on inspecting
the @ref{77e,,__dict__} of an object, but when class inheritance or an arbitrary
@code{__getattr__()} hook were in use this could still be inaccurate.

The one big idea underlying the new class model is that an API for describing
the attributes of an object using `descriptors' has been formalized.
Descriptors specify the value of an attribute, stating whether it’s a method or
a field.  With the descriptor API, static methods and class methods become
possible, as well as more exotic constructs.

Attribute descriptors are objects that live inside class objects, and have a few
attributes of their own:


@itemize *

@item 
@ref{126c,,__name__} is the attribute’s name.

@item 
@ref{b27,,__doc__} is the attribute’s docstring.

@item 
@code{__get__(object)} is a method that retrieves the attribute value from
`object'.

@item 
@code{__set__(object, value)} sets the attribute on `object' to `value'.

@item 
@code{__delete__(object, value)} deletes the `value'  attribute of `object'.
@end itemize

For example, when you write @code{obj.x}, the steps that Python actually performs
are:

@example
descriptor = obj.__class__.x
descriptor.__get__(obj)
@end example

For methods, @ref{16f4,,descriptor.__get__} returns a temporary
object that’s
callable, and wraps up the instance and the method to be called on it. This is
also why static methods and class methods are now possible; they have
descriptors that wrap up just the method, or the method and the class.  As a
brief explanation of these new kinds of methods, static methods aren’t passed
the instance, and therefore resemble regular functions.  Class methods are
passed the class of the object, but not the object itself.  Static and class
methods are defined like this:

@example
class C(object):
    def f(arg1, arg2):
        ...
    f = staticmethod(f)

    def g(cls, arg1, arg2):
        ...
    g = classmethod(g)
@end example

The @ref{451,,staticmethod()} function takes the function @code{f()}, and returns it
wrapped up in a descriptor so it can be stored in the class object.  You might
expect there to be special syntax for creating such methods (@code{def static f},
@code{defstatic f()}, or something like that) but no such syntax has been defined
yet; that’s been left for future versions of Python.

More new features, such as slots and properties, are also implemented as new
kinds of descriptors, and it’s not difficult to write a descriptor class that
does something novel.  For example, it would be possible to write a descriptor
class that made it possible to write Eiffel-style preconditions and
postconditions for a method.  A class that used this feature might be defined
like this:

@example
from eiffel import eiffelmethod

class C(object):
    def f(self, arg1, arg2):
        # The actual function
        ...
    def pre_f(self):
        # Check preconditions
        ...
    def post_f(self):
        # Check postconditions
        ...

    f = eiffelmethod(f, pre_f, post_f)
@end example

Note that a person using the new @code{eiffelmethod()} doesn’t have to understand
anything about descriptors.  This is why I think the new features don’t increase
the basic complexity of the language. There will be a few wizards who need to
know about it in order to write @code{eiffelmethod()} or the ZODB or whatever,
but most users will just write code on top of the resulting libraries and ignore
the implementation details.

@node Multiple Inheritance The Diamond Rule,Attribute Access,Descriptors,PEPs 252 and 253 Type and Class Changes
@anchor{whatsnew/2 2 multiple-inheritance-the-diamond-rule}@anchor{16f5}
@subsubsection Multiple Inheritance: The Diamond Rule


Multiple inheritance has also been made more useful through changing the rules
under which names are resolved.  Consider this set of classes (diagram taken
from 
@geindex Python Enhancement Proposals; PEP 253
PEP 253@footnote{https://peps.python.org/pep-0253/} by Guido van Rossum):

@example
      class A:
        ^ ^  def save(self): ...
       /   \
      /     \
     /       \
    /         \
class B     class C:
    ^         ^  def save(self): ...
     \       /
      \     /
       \   /
        \ /
      class D
@end example

The lookup rule for classic classes is simple but not very smart; the base
classes are searched depth-first, going from left to right.  A reference to
@code{D.save()} will search the classes @code{D}, @code{B}, and then
@code{A}, where @code{save()} would be found and returned.  @code{C.save()}
would never be found at all.  This is bad, because if @code{C}’s @code{save()}
method is saving some internal state specific to @code{C}, not calling it will
result in that state never getting saved.

New-style classes follow a different algorithm that’s a bit more complicated to
explain, but does the right thing in this situation. (Note that Python 2.3
changes this algorithm to one that produces the same results in most cases, but
produces more useful results for really complicated inheritance graphs.)


@enumerate 

@item 
List all the base classes, following the classic lookup rule and include a
class multiple times if it’s visited repeatedly.  In the above example, the list
of visited classes is [@code{D}, @code{B}, @code{A}, @code{C},
@code{A}].

@item 
Scan the list for duplicated classes.  If any are found, remove all but one
occurrence, leaving the `last' one in the list.  In the above example, the list
becomes [@code{D}, @code{B}, @code{C}, @code{A}] after dropping
duplicates.
@end enumerate

Following this rule, referring to @code{D.save()} will return @code{C.save()},
which is the behaviour we’re after.  This lookup rule is the same as the one
followed by Common Lisp.  A new built-in function, @ref{1a7,,super()}, provides a way
to get at a class’s superclasses without having to reimplement Python’s
algorithm. The most commonly used form will be  @code{super(class, obj)}, which
returns  a bound superclass object (not the actual class object).  This form
will be used in methods to call a method in the superclass; for example,
@code{D}’s @code{save()} method would look like this:

@example
class D (B,C):
    def save (self):
        # Call superclass .save()
        super(D, self).save()
        # Save D's private information here
        ...
@end example

@ref{1a7,,super()} can also return unbound superclass objects when called as
@code{super(class)} or @code{super(class1, class2)}, but this probably won’t
often be useful.

@node Attribute Access,Related Links,Multiple Inheritance The Diamond Rule,PEPs 252 and 253 Type and Class Changes
@anchor{whatsnew/2 2 attribute-access}@anchor{16f6}
@subsubsection Attribute Access


A fair number of sophisticated Python classes define hooks for attribute access
using @ref{6fb,,__getattr__()}; most commonly this is done for convenience, to make
code more readable by automatically mapping an attribute access such as
@code{obj.parent} into a method call such as @code{obj.get_parent}.  Python 2.2 adds
some new ways of controlling attribute access.

First, @code{__getattr__(attr_name)} is still supported by new-style classes,
and nothing about it has changed.  As before, it will be called when an attempt
is made to access @code{obj.foo} and no attribute named @code{foo} is found in the
instance’s dictionary.

New-style classes also support a new method,
@code{__getattribute__(attr_name)}.  The difference between the two methods is
that @ref{dd1,,__getattribute__()} is `always' called whenever any attribute is
accessed, while the old @ref{6fb,,__getattr__()} is only called if @code{foo} isn’t
found in the instance’s dictionary.

However, Python 2.2’s support for `properties' will often be a simpler way
to trap attribute references.  Writing a @code{__getattr__()} method is
complicated because to avoid recursion you can’t use regular attribute accesses
inside them, and instead have to mess around with the contents of
@ref{77e,,__dict__}. @ref{6fb,,__getattr__()} methods also end up being called by Python
when it checks for other methods such as @ref{830,,__repr__()} or @code{__coerce__()},
and so have to be written with this in mind. Finally, calling a function on
every attribute access results in a sizable performance loss.

@ref{4b4,,property} is a new built-in type that packages up three functions that
get, set, or delete an attribute, and a docstring.  For example, if you want to
define a @code{size} attribute that’s computed, but also settable, you could
write:

@example
class C(object):
    def get_size (self):
        result = ... computation ...
        return result
    def set_size (self, size):
        ... compute something based on the size
        and set internal state appropriately ...

    # Define a property.  The 'delete this attribute'
    # method is defined as None, so the attribute
    # can't be deleted.
    size = property(get_size, set_size,
                    None,
                    "Storage size of this instance")
@end example

That is certainly clearer and easier to write than a pair of
@code{__getattr__()}/@code{__setattr__()} methods that check for the @code{size}
attribute and handle it specially while retrieving all other attributes from the
instance’s @ref{77e,,__dict__}.  Accesses to @code{size} are also the only ones
which have to perform the work of calling a function, so references to other
attributes run at their usual speed.

Finally, it’s possible to constrain the list of attributes that can be
referenced on an object using the new @ref{16f7,,__slots__} class attribute. Python
objects are usually very dynamic; at any time it’s possible to define a new
attribute on an instance by just doing @code{obj.new_attr=1}.   A new-style class
can define a class attribute named @code{__slots__} to limit the legal
attributes  to a particular set of names.  An example will make this clear:

@example
>>> class C(object):
...     __slots__ = ('template', 'name')
...
>>> obj = C()
>>> print obj.template
None
>>> obj.template = 'Test'
>>> print obj.template
Test
>>> obj.newattr = None
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
AttributeError: 'C' object has no attribute 'newattr'
@end example

Note how you get an @ref{5f0,,AttributeError} on the attempt to assign to an
attribute not listed in @ref{16f7,,__slots__}.

@node Related Links,,Attribute Access,PEPs 252 and 253 Type and Class Changes
@anchor{whatsnew/2 2 related-links}@anchor{16f8}@anchor{whatsnew/2 2 sect-rellinks}@anchor{16f1}
@subsubsection Related Links


This section has just been a quick overview of the new features, giving enough
of an explanation to start you programming, but many details have been
simplified or ignored.  Where should you go to get a more complete picture?

The @ref{16f9,,Descriptor Guide} is a lengthy tutorial introduction to
the descriptor features, written by Guido van Rossum. If my description has
whetted your appetite, go read this tutorial next, because it goes into much
more detail about the new features while still remaining quite easy to read.

Next, there are two relevant PEPs, 
@geindex Python Enhancement Proposals; PEP 252
PEP 252@footnote{https://peps.python.org/pep-0252/} and 
@geindex Python Enhancement Proposals; PEP 253
PEP 253@footnote{https://peps.python.org/pep-0253/}.  
@geindex Python Enhancement Proposals; PEP 252
PEP 252@footnote{https://peps.python.org/pep-0252/} is
titled “Making Types Look More Like Classes”, and covers the descriptor API.
@geindex Python Enhancement Proposals; PEP 253
PEP 253@footnote{https://peps.python.org/pep-0253/} is titled “Subtyping Built-in Types”, and describes the changes to
type objects that make it possible to subtype built-in objects.  
@geindex Python Enhancement Proposals; PEP 253
PEP 253@footnote{https://peps.python.org/pep-0253/} is
the more complicated PEP of the two, and at a few points the necessary
explanations of types and meta-types may cause your head to explode.  Both PEPs
were written and implemented by Guido van Rossum, with substantial assistance
from the rest of the Zope Corp. team.

Finally, there’s the ultimate authority: the source code.  Most of the machinery
for the type handling is in @code{Objects/typeobject.c}, but you should only
resort to it after all other avenues have been exhausted, including posting a
question to python-list or python-dev.

@c ======================================================================

@node PEP 234 Iterators,PEP 255 Simple Generators<2>,PEPs 252 and 253 Type and Class Changes,What’s New in Python 2 2
@anchor{whatsnew/2 2 pep-234-iterators}@anchor{16fa}
@subsection PEP 234: Iterators


Another significant addition to 2.2 is an iteration interface at both the C and
Python levels.  Objects can define how they can be looped over by callers.

In Python versions up to 2.1, the usual way to make @code{for item in obj} work is
to define a @ref{588,,__getitem__()} method that looks something like this:

@example
def __getitem__(self, index):
    return <next item>
@end example

@ref{588,,__getitem__()} is more properly used to define an indexing operation on an
object so that you can write @code{obj[5]} to retrieve the sixth element.  It’s a
bit misleading when you’re using this only to support @ref{348,,for} loops.
Consider some file-like object that wants to be looped over; the `index'
parameter is essentially meaningless, as the class probably assumes that a
series of @code{__getitem__()} calls will be made with `index' incrementing by
one each time.  In other words, the presence of the @code{__getitem__()} method
doesn’t mean that using @code{file[5]}  to randomly access the sixth element will
work, though it really should.

In Python 2.2, iteration can be implemented separately, and @ref{588,,__getitem__()}
methods can be limited to classes that really do support random access.  The
basic idea of iterators is  simple.  A new built-in function, @code{iter(obj)}
or @code{iter(C, sentinel)}, is used to get an iterator. @code{iter(obj)} returns
an iterator for the object `obj', while @code{iter(C, sentinel)} returns an
iterator that will invoke the callable object `C' until it returns `sentinel' to
signal that the iterator is done.

Python classes can define an @code{__iter__()} method, which should create and
return a new iterator for the object; if the object is its own iterator, this
method can just return @code{self}.  In particular, iterators will usually be their
own iterators.  Extension types implemented in C can implement a @ref{16fb,,tp_iter}
function in order to return an iterator, and extension types that want to behave
as iterators can define a @ref{16fc,,tp_iternext} function.

So, after all this, what do iterators actually do?  They have one required
method, @ref{9de,,next()}, which takes no arguments and returns the next value.  When
there are no more values to be returned, calling @code{next()} should raise the
@ref{dfb,,StopIteration} exception.

@example
>>> L = [1,2,3]
>>> i = iter(L)
>>> print i
<iterator object at 0x8116870>
>>> i.next()
1
>>> i.next()
2
>>> i.next()
3
>>> i.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
StopIteration
>>>
@end example

In 2.2, Python’s @ref{348,,for} statement no longer expects a sequence; it
expects something for which @ref{9dd,,iter()} will return an iterator. For backward
compatibility and convenience, an iterator is automatically constructed for
sequences that don’t implement @code{__iter__()} or a @ref{16fb,,tp_iter} slot, so
@code{for i in [1,2,3]} will still work.  Wherever the Python interpreter loops
over a sequence, it’s been changed to use the iterator protocol.  This means you
can do things like this:

@example
>>> L = [1,2,3]
>>> i = iter(L)
>>> a,b,c = i
>>> a,b,c
(1, 2, 3)
@end example

Iterator support has been added to some of Python’s basic types.   Calling
@ref{9dd,,iter()} on a dictionary will return an iterator which loops over its keys:

@example
>>> m = @{'Jan': 1, 'Feb': 2, 'Mar': 3, 'Apr': 4, 'May': 5, 'Jun': 6,
...      'Jul': 7, 'Aug': 8, 'Sep': 9, 'Oct': 10, 'Nov': 11, 'Dec': 12@}
>>> for key in m: print key, m[key]
...
Mar 3
Feb 2
Aug 8
Sep 9
May 5
Jun 6
Jul 7
Jan 1
Apr 4
Nov 11
Dec 12
Oct 10
@end example

That’s just the default behaviour.  If you want to iterate over keys, values, or
key/value pairs, you can explicitly call the @code{iterkeys()},
@code{itervalues()}, or @code{iteritems()} methods to get an appropriate iterator.
In a minor related change, the @ref{349,,in} operator now works on dictionaries,
so @code{key in dict} is now equivalent to @code{dict.has_key(key)}.

Files also provide an iterator, which calls the @ref{bf,,readline()} method until
there are no more lines in the file.  This means you can now read each line of a
file using code like this:

@example
for line in file:
    # do something for each line
    ...
@end example

Note that you can only go forward in an iterator; there’s no way to get the
previous element, reset the iterator, or make a copy of it. An iterator object
could provide such additional capabilities, but the iterator protocol only
requires a @ref{9de,,next()} method.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 234

@item PEP 234@footnote{https://peps.python.org/pep-0234/} - Iterators

Written by Ka-Ping Yee and GvR; implemented  by the Python Labs crew, mostly by
GvR and Tim Peters.
@end table


@c ======================================================================

@node PEP 255 Simple Generators<2>,PEP 237 Unifying Long Integers and Integers<2>,PEP 234 Iterators,What’s New in Python 2 2
@anchor{whatsnew/2 2 pep-255-simple-generators}@anchor{16fd}
@subsection PEP 255: Simple Generators


Generators are another new feature, one that interacts with the introduction of
iterators.

You’re doubtless familiar with how function calls work in Python or C.  When you
call a function, it gets a private namespace where its local variables are
created.  When the function reaches a @ref{1b0,,return} statement, the local
variables are destroyed and the resulting value is returned to the caller.  A
later call to the same function will get a fresh new set of local variables.
But, what if the local variables weren’t thrown away on exiting a function?
What if you could later resume the function where it left off?  This is what
generators provide; they can be thought of as resumable functions.

Here’s the simplest example of a generator function:

@example
def generate_ints(N):
    for i in range(N):
        yield i
@end example

A new keyword, @ref{bc8,,yield}, was introduced for generators.  Any function
containing a @code{yield} statement is a generator function; this is
detected by Python’s bytecode compiler which compiles the function specially as
a result.  Because a new keyword was introduced, generators must be explicitly
enabled in a module by including a @code{from __future__ import generators}
statement near the top of the module’s source code.  In Python 2.3 this
statement will become unnecessary.

When you call a generator function, it doesn’t return a single value; instead it
returns a generator object that supports the iterator protocol.  On executing
the @ref{bc8,,yield} statement, the generator outputs the value of @code{i},
similar to a @ref{1b0,,return} statement.  The big difference between
@code{yield} and a @code{return} statement is that on reaching a
@code{yield} the generator’s state of execution is suspended and local
variables are preserved.  On the next call to the generator’s @code{next()} method,
the function will resume executing immediately after the @code{yield}
statement.  (For complicated reasons, the @code{yield} statement isn’t
allowed inside the @code{try} block of a
@ref{8fa,,try}…@ref{1b1,,finally} statement; read 
@geindex Python Enhancement Proposals; PEP 255
PEP 255@footnote{https://peps.python.org/pep-0255/} for a full
explanation of the interaction between @code{yield} and exceptions.)

Here’s a sample usage of the @code{generate_ints()} generator:

@example
>>> gen = generate_ints(3)
>>> gen
<generator object at 0x8117f90>
>>> gen.next()
0
>>> gen.next()
1
>>> gen.next()
2
>>> gen.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "<stdin>", line 2, in generate_ints
StopIteration
@end example

You could equally write @code{for i in generate_ints(5)}, or @code{a,b,c =
generate_ints(3)}.

Inside a generator function, the @ref{1b0,,return} statement can only be used
without a value, and signals the end of the procession of values; afterwards the
generator cannot return any further values. @code{return} with a value, such
as @code{return 5}, is a syntax error inside a generator function.  The end of the
generator’s results can also be indicated by raising @ref{dfb,,StopIteration}
manually, or by just letting the flow of execution fall off the bottom of the
function.

You could achieve the effect of generators manually by writing your own class
and storing all the local variables of the generator as instance variables.  For
example, returning a list of integers could be done by setting @code{self.count} to
0, and having the @ref{9de,,next()} method increment @code{self.count} and return it.
However, for a moderately complicated generator, writing a corresponding class
would be much messier. @code{Lib/test/test_generators.py} contains a number of
more interesting examples.  The simplest one implements an in-order traversal of
a tree using generators recursively.

@example
# A recursive generator that generates Tree leaves in in-order.
def inorder(t):
    if t:
        for x in inorder(t.left):
            yield x
        yield t.label
        for x in inorder(t.right):
            yield x
@end example

Two other examples in @code{Lib/test/test_generators.py} produce solutions for
the N-Queens problem (placing $N$ queens on an $NxN$ chess board so that no
queen threatens another) and the Knight’s Tour (a route that takes a knight to
every square of an $NxN$ chessboard without visiting any square twice).

The idea of generators comes from other programming languages, especially Icon
(@indicateurl{https://www2.cs.arizona.edu/icon/}), where the idea of generators is central.  In
Icon, every expression and function call behaves like a generator.  One example
from “An Overview of the Icon Programming Language” at
@indicateurl{https://www2.cs.arizona.edu/icon/docs/ipd266.htm} gives an idea of what this looks
like:

@example
sentence := "Store it in the neighboring harbor"
if (i := find("or", sentence)) > 5 then write(i)
@end example

In Icon the @code{find()} function returns the indexes at which the substring
“or” is found: 3, 23, 33.  In the @ref{182,,if} statement, @code{i} is first
assigned a value of 3, but 3 is less than 5, so the comparison fails, and Icon
retries it with the second value of 23.  23 is greater than 5, so the comparison
now succeeds, and the code prints the value 23 to the screen.

Python doesn’t go nearly as far as Icon in adopting generators as a central
concept.  Generators are considered a new part of the core Python language, but
learning or using them isn’t compulsory; if they don’t solve any problems that
you have, feel free to ignore them. One novel feature of Python’s interface as
compared to Icon’s is that a generator’s state is represented as a concrete
object (the iterator) that can be passed around to other functions or stored in
a data structure.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 255

@item PEP 255@footnote{https://peps.python.org/pep-0255/} - Simple Generators

Written by Neil Schemenauer, Tim Peters, Magnus Lie Hetland.  Implemented mostly
by Neil Schemenauer and Tim Peters, with other fixes from the Python Labs crew.
@end table


@c ======================================================================

@node PEP 237 Unifying Long Integers and Integers<2>,PEP 238 Changing the Division Operator,PEP 255 Simple Generators<2>,What’s New in Python 2 2
@anchor{whatsnew/2 2 pep-237-unifying-long-integers-and-integers}@anchor{16fe}
@subsection PEP 237: Unifying Long Integers and Integers


In recent versions, the distinction between regular integers, which are 32-bit
values on most machines, and long integers, which can be of arbitrary size, was
becoming an annoyance.  For example, on platforms that support files larger than
@code{2**32} bytes, the @code{tell()} method of file objects has to return a long
integer. However, there were various bits of Python that expected plain integers
and would raise an error if a long integer was provided instead.  For example,
in Python 1.5, only regular integers could be used as a slice index, and
@code{'abc'[1L:]} would raise a @ref{199,,TypeError} exception with the message ‘slice
index must be int’.

Python 2.2 will shift values from short to long integers as required. The ‘L’
suffix is no longer needed to indicate a long integer literal, as now the
compiler will choose the appropriate type.  (Using the ‘L’ suffix will be
discouraged in future 2.x versions of Python, triggering a warning in Python
2.4, and probably dropped in Python 3.0.)  Many operations that used to raise an
@ref{a87,,OverflowError} will now return a long integer as their result.  For
example:

@example
>>> 1234567890123
1234567890123L
>>> 2 ** 64
18446744073709551616L
@end example

In most cases, integers and long integers will now be treated identically.  You
can still distinguish them with the @ref{f4a,,type()} built-in function, but that’s
rarely needed.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 237

@item PEP 237@footnote{https://peps.python.org/pep-0237/} - Unifying Long Integers and Integers

Written by Moshe Zadka and Guido van Rossum.  Implemented mostly by Guido van
Rossum.
@end table


@c ======================================================================

@node PEP 238 Changing the Division Operator,Unicode Changes,PEP 237 Unifying Long Integers and Integers<2>,What’s New in Python 2 2
@anchor{whatsnew/2 2 pep-238-changing-the-division-operator}@anchor{16ff}
@subsection PEP 238: Changing the Division Operator


The most controversial change in Python 2.2 heralds the start of an effort to
fix an old design flaw that’s been in Python from the beginning. Currently
Python’s division operator, @code{/}, behaves like C’s division operator when
presented with two integer arguments: it returns an integer result that’s
truncated down when there would be a fractional part.  For example, @code{3/2} is
1, not 1.5, and @code{(-1)/2} is -1, not -0.5.  This means that the results of
division can vary unexpectedly depending on the type of the two operands and
because Python is dynamically typed, it can be difficult to determine the
possible types of the operands.

(The controversy is over whether this is `really' a design flaw, and whether
it’s worth breaking existing code to fix this.  It’s caused endless discussions
on python-dev, and in July 2001 erupted into a storm of acidly sarcastic
postings on @code{comp.lang.python}. I won’t argue for either side here
and will stick to describing what’s  implemented in 2.2.  Read 
@geindex Python Enhancement Proposals; PEP 238
PEP 238@footnote{https://peps.python.org/pep-0238/} for a
summary of arguments and counter-arguments.)

Because this change might break code, it’s being introduced very gradually.
Python 2.2 begins the transition, but the switch won’t be complete until Python
3.0.

First, I’ll borrow some terminology from 
@geindex Python Enhancement Proposals; PEP 238
PEP 238@footnote{https://peps.python.org/pep-0238/}.  “True division” is the
division that most non-programmers are familiar with: 3/2 is 1.5, 1/4 is 0.25,
and so forth.  “Floor division” is what Python’s @code{/} operator currently does
when given integer operands; the result is the floor of the value returned by
true division.  “Classic division” is the current mixed behaviour of @code{/}; it
returns the result of floor division when the operands are integers, and returns
the result of true division when one of the operands is a floating-point number.

Here are the changes 2.2 introduces:


@itemize *

@item 
A new operator, @code{//}, is the floor division operator. (Yes, we know it looks
like C++’s comment symbol.)  @code{//} `always' performs floor division no matter
what the types of its operands are, so @code{1 // 2} is 0 and @code{1.0 // 2.0} is
also 0.0.

@code{//} is always available in Python 2.2; you don’t need to enable it using a
@code{__future__} statement.

@item 
By including a @code{from __future__ import division} in a module, the @code{/}
operator will be changed to return the result of true division, so @code{1/2} is
0.5.  Without the @code{__future__} statement, @code{/} still means classic division.
The default meaning of @code{/} will not change until Python 3.0.

@item 
Classes can define methods called @ref{1096,,__truediv__()} and @ref{1700,,__floordiv__()}
to overload the two division operators.  At the C level, there are also slots in
the @ref{162a,,PyNumberMethods} structure so extension types can define the two
operators.

@item 
Python 2.2 supports some command-line arguments for testing whether code will
work with the changed division semantics.  Running python with @code{-Q
warn} will cause a warning to be issued whenever division is applied to two
integers.  You can use this to find code that’s affected by the change and fix
it.  By default, Python 2.2 will simply perform classic division without a
warning; the warning will be turned on by default in Python 2.3.
@end itemize


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 238

@item PEP 238@footnote{https://peps.python.org/pep-0238/} - Changing the Division Operator

Written by Moshe Zadka and  Guido van Rossum.  Implemented by Guido van Rossum..
@end table


@c ======================================================================

@node Unicode Changes,PEP 227 Nested Scopes,PEP 238 Changing the Division Operator,What’s New in Python 2 2
@anchor{whatsnew/2 2 unicode-changes}@anchor{1701}
@subsection Unicode Changes


Python’s Unicode support has been enhanced a bit in 2.2.  Unicode strings are
usually stored as UCS-2, as 16-bit unsigned integers. Python 2.2 can also be
compiled to use UCS-4, 32-bit unsigned integers, as its internal encoding by
supplying @code{--enable-unicode=ucs4} to the configure script.   (It’s also
possible to specify @code{--disable-unicode} to completely disable Unicode
support.)

When built to use UCS-4 (a “wide Python”), the interpreter can natively handle
Unicode characters from U+000000 to U+110000, so the range of legal values for
the @code{unichr()} function is expanded accordingly.  Using an interpreter
compiled to use UCS-2 (a “narrow Python”), values greater than 65535 will still
cause @code{unichr()} to raise a @ref{2ee,,ValueError} exception. This is all
described in 
@geindex Python Enhancement Proposals; PEP 261
PEP 261@footnote{https://peps.python.org/pep-0261/}, “Support for ‘wide’ Unicode characters”; consult it for
further details.

Another change is simpler to explain. Since their introduction, Unicode strings
have supported an @code{encode()} method to convert the string to a selected
encoding such as UTF-8 or Latin-1.  A symmetric @code{decode([*encoding*])}
method has been added to 8-bit strings (though not to Unicode strings) in 2.2.
@code{decode()} assumes that the string is in the specified encoding and decodes
it, returning whatever is returned by the codec.

Using this new feature, codecs have been added for tasks not directly related to
Unicode.  For example, codecs have been added for uu-encoding, MIME’s base64
encoding, and compression with the @ref{13a,,zlib} module:

@example
>>> s = """Here is a lengthy piece of redundant, overly verbose,
... and repetitive text.
... """
>>> data = s.encode('zlib')
>>> data
'x\x9c\r\xc9\xc1\r\x80 \x10\x04\xc0?Ul...'
>>> data.decode('zlib')
'Here is a lengthy piece of redundant, overly verbose,\nand repetitive text.\n'
>>> print s.encode('uu')
begin 666 <data>
M2&5R92!I<R!A(&QE;F=T:'D@@<&EE8V4@@;V8@@<F5D=6YD86YT+"!O=F5R;'D@@
>=F5R8F]S92P*86YD(')E<&5T:71I=F4@@=&5X="X*

end
>>> "sheesh".encode('rot-13')
'furrfu'
@end example

To convert a class instance to Unicode, a @code{__unicode__()} method can be
defined by a class, analogous to @code{__str__()}.

@code{encode()}, @code{decode()}, and @code{__unicode__()} were implemented by
Marc-André Lemburg.  The changes to support using UCS-4 internally were
implemented by Fredrik Lundh and Martin von Löwis.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 261

@item PEP 261@footnote{https://peps.python.org/pep-0261/} - Support for ‘wide’ Unicode characters

Written by Paul Prescod.
@end table


@c ======================================================================

@node PEP 227 Nested Scopes,New and Improved Modules<3>,Unicode Changes,What’s New in Python 2 2
@anchor{whatsnew/2 2 pep-227-nested-scopes}@anchor{1702}
@subsection PEP 227: Nested Scopes


In Python 2.1, statically nested scopes were added as an optional feature, to be
enabled by a @code{from __future__ import nested_scopes} directive.  In 2.2 nested
scopes no longer need to be specially enabled, and are now always present.  The
rest of this section is a copy of the description of nested scopes from my
“What’s New in Python 2.1” document; if you read it when 2.1 came out, you can
skip the rest of this section.

The largest change introduced in Python 2.1, and made complete in 2.2, is to
Python’s scoping rules.  In Python 2.0, at any given time there are at most
three namespaces used to look up variable names: local, module-level, and the
built-in namespace.  This often surprised people because it didn’t match their
intuitive expectations.  For example, a nested recursive function definition
doesn’t work:

@example
def f():
    ...
    def g(value):
        ...
        return g(value-1) + 1
    ...
@end example

The function @code{g()} will always raise a @ref{450,,NameError} exception, because
the binding of the name @code{g} isn’t in either its local namespace or in the
module-level namespace.  This isn’t much of a problem in practice (how often do
you recursively define interior functions like this?), but this also made using
the @ref{14a9,,lambda} expression clumsier, and this was a problem in practice.
In code which uses @code{lambda} you can often find local variables being
copied by passing them as the default values of arguments.

@example
def find(self, name):
    "Return list of any entries equal to 'name'"
    L = filter(lambda x, name=name: x == name,
               self.list_attribute)
    return L
@end example

The readability of Python code written in a strongly functional style suffers
greatly as a result.

The most significant change to Python 2.2 is that static scoping has been added
to the language to fix this problem.  As a first effect, the @code{name=name}
default argument is now unnecessary in the above example.  Put simply, when a
given variable name is not assigned a value within a function (by an assignment,
or the @ref{1666,,def}, @ref{14e3,,class}, or @ref{7f9,,import} statements),
references to the variable will be looked up in the local namespace of the
enclosing scope.  A more detailed explanation of the rules, and a dissection of
the implementation, can be found in the PEP.

This change may cause some compatibility problems for code where the same
variable name is used both at the module level and as a local variable within a
function that contains further function definitions. This seems rather unlikely
though, since such code would have been pretty confusing to read in the first
place.

One side effect of the change is that the @code{from module import *} and
@code{exec} statements have been made illegal inside a function scope under
certain conditions.  The Python reference manual has said all along that @code{from
module import *} is only legal at the top level of a module, but the CPython
interpreter has never enforced this before.  As part of the implementation of
nested scopes, the compiler which turns Python source into bytecodes has to
generate different code to access variables in a containing scope.  @code{from
module import *} and @code{exec} make it impossible for the compiler to
figure this out, because they add names to the local namespace that are
unknowable at compile time. Therefore, if a function contains function
definitions or @ref{14a9,,lambda} expressions with free variables, the compiler
will flag this by raising a @ref{18f,,SyntaxError} exception.

To make the preceding explanation a bit clearer, here’s an example:

@example
x = 1
def f():
    # The next line is a syntax error
    exec 'x=2'
    def g():
        return x
@end example

Line 4 containing the @code{exec} statement is a syntax error, since
@code{exec} would define a new local variable named @code{x} whose value should
be accessed by @code{g()}.

This shouldn’t be much of a limitation, since @code{exec} is rarely used in
most Python code (and when it is used, it’s often a sign of a poor design
anyway).


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 227

@item PEP 227@footnote{https://peps.python.org/pep-0227/} - Statically Nested Scopes

Written and implemented by Jeremy Hylton.
@end table


@c ======================================================================

@node New and Improved Modules<3>,Interpreter Changes and Fixes,PEP 227 Nested Scopes,What’s New in Python 2 2
@anchor{whatsnew/2 2 new-and-improved-modules}@anchor{1703}
@subsection New and Improved Modules



@itemize *

@item 
The @ref{135,,xmlrpclib} module was contributed to the standard library by Fredrik
Lundh, providing support for writing XML-RPC clients.  XML-RPC is a simple
remote procedure call protocol built on top of HTTP and XML. For example, the
following snippet retrieves a list of RSS channels from the O’Reilly Network,
and then  lists the recent headlines for one channel:

@example
import xmlrpclib
s = xmlrpclib.Server(
      'http://www.oreillynet.com/meerkat/xml-rpc/server.php')
channels = s.meerkat.getChannels()
# channels is a list of dictionaries, like this:
# [@{'id': 4, 'title': 'Freshmeat Daily News'@}
#  @{'id': 190, 'title': '32Bits Online'@},
#  @{'id': 4549, 'title': '3DGamers'@}, ... ]

# Get the items for one channel
items = s.meerkat.getItems( @{'channel': 4@} )

# 'items' is another list of dictionaries, like this:
# [@{'link': 'http://freshmeat.net/releases/52719/',
#   'description': 'A utility which converts HTML to XSL FO.',
#   'title': 'html2fo 0.3 (Default)'@}, ... ]
@end example

The @ref{136,,SimpleXMLRPCServer} module makes it easy to create straightforward
XML-RPC servers.  See @indicateurl{http://xmlrpc.scripting.com/} for more information about XML-RPC.

@item 
The new @ref{6e,,hmac} module implements the HMAC algorithm described by
@geindex RFC; RFC 2104
RFC 2104@footnote{https://datatracker.ietf.org/doc/html/rfc2104.html}. (Contributed by Gerhard Häring.)

@item 
Several functions that originally returned lengthy tuples now return
pseudo-sequences that still behave like tuples but also have mnemonic attributes such
as @code{memberst_mtime} or @ref{1704,,tm_year}. The enhanced functions include
@ref{26f,,stat()}, @ref{f92,,fstat()}, @ref{1308,,statvfs()}, and @ref{f93,,fstatvfs()} in the
@ref{a5,,os} module, and @ref{1705,,localtime()}, @ref{13cc,,gmtime()}, and @ref{1639,,strptime()} in
the @ref{f4,,time} module.

For example, to obtain a file’s size using the old tuples, you’d end up writing
something like @code{file_size = os.stat(filename)[stat.ST_SIZE]}, but now this can
be written more clearly as @code{file_size = os.stat(filename).st_size}.

The original patch for this feature was contributed by Nick Mathewson.

@item 
The Python profiler has been extensively reworked and various errors in its
output have been corrected.  (Contributed by Fred L. Drake, Jr. and Tim Peters.)

@item 
The @ref{d1,,socket} module can be compiled to support IPv6; specify the
@code{--enable-ipv6} option to Python’s configure script.  (Contributed by
Jun-ichiro “itojun” Hagino.)

@item 
Two new format characters were added to the @ref{db,,struct} module for 64-bit
integers on platforms that support the C long long type.  @code{q} is for
a signed 64-bit integer, and @code{Q} is for an unsigned one.  The value is
returned in Python’s long integer type.  (Contributed by Tim Peters.)

@item 
In the interpreter’s interactive mode, there’s a new built-in function
@ref{ada,,help()} that uses the @ref{ba,,pydoc} module introduced in Python 2.1 to
provide interactive help. @code{help(object)} displays any available help text
about `object'.  @code{help()} with no argument puts you in an online help
utility, where you can enter the names of functions, classes, or modules to read
their help text. (Contributed by Guido van Rossum, using Ka-Ping Yee’s
@code{pydoc} module.)

@item 
Various bugfixes and performance improvements have been made to the SRE engine
underlying the @ref{be,,re} module.  For example, the @ref{5a3,,re.sub()} and
@ref{5a2,,re.split()} functions have been rewritten in C.  Another contributed patch
speeds up certain Unicode character ranges by a factor of two, and a new
@ref{1706,,finditer()}  method that returns an iterator over all the non-overlapping
matches in  a given string.  (SRE is maintained by Fredrik Lundh.  The
BIGCHARSET patch was contributed by Martin von Löwis.)

@item 
The @ref{cf,,smtplib} module now supports 
@geindex RFC; RFC 2487
RFC 2487@footnote{https://datatracker.ietf.org/doc/html/rfc2487.html}, “Secure SMTP over TLS”, so
it’s now possible to encrypt the SMTP traffic between a Python program and the
mail transport agent being handed a message.  @code{smtplib} also supports SMTP
authentication.  (Contributed by Gerhard Häring.)

@item 
The @ref{78,,imaplib} module, maintained by Piers Lauder, has support for several
new extensions: the NAMESPACE extension defined in 
@geindex RFC; RFC 2342
RFC 2342@footnote{https://datatracker.ietf.org/doc/html/rfc2342.html}, SORT, GETACL and
SETACL.  (Contributed by Anthony Baxter and Michel Pelletier.)

@item 
The @code{rfc822} module’s parsing of email addresses is now compliant with
@geindex RFC; RFC 2822
RFC 2822@footnote{https://datatracker.ietf.org/doc/html/rfc2822.html}, an update to 
@geindex RFC; RFC 822
RFC 822@footnote{https://datatracker.ietf.org/doc/html/rfc822.html}.  (The module’s name is `not' going to be
changed to @code{rfc2822}.)  A new package, @ref{3f,,email}, has also been added for
parsing and generating e-mail messages.  (Contributed by Barry Warsaw, and
arising out of his work on Mailman.)

@item 
The @ref{3b,,difflib} module now contains a new @code{Differ} class for
producing human-readable lists of changes (a “delta”) between two sequences of
lines of text.  There are also two generator functions, @code{ndiff()} and
@code{restore()}, which respectively return a delta from two sequences, or one of
the original sequences from a delta. (Grunt work contributed by David Goodger,
from ndiff.py code by Tim Peters who then did the generatorization.)

@item 
New constants @code{ascii_letters}, @code{ascii_lowercase}, and
@code{ascii_uppercase} were added to the @ref{d8,,string} module.  There were
several modules in the standard library that used @code{string.letters} to
mean the ranges A-Za-z, but that assumption is incorrect when locales are in
use, because @code{string.letters} varies depending on the set of legal
characters defined by the current locale.  The buggy modules have all been fixed
to use @code{ascii_letters} instead. (Reported by an unknown person; fixed by
Fred L. Drake, Jr.)

@item 
The @ref{93,,mimetypes} module now makes it easier to use alternative MIME-type
databases by the addition of a @ref{1707,,MimeTypes} class, which takes a list of
filenames to be parsed.  (Contributed by Fred L. Drake, Jr.)

@item 
A @ref{1365,,Timer} class was added to the @ref{f3,,threading} module that allows
scheduling an activity to happen at some future time.  (Contributed by Itamar
Shtull-Trauring.)
@end itemize

@c ======================================================================

@node Interpreter Changes and Fixes,Other Changes and Fixes<3>,New and Improved Modules<3>,What’s New in Python 2 2
@anchor{whatsnew/2 2 interpreter-changes-and-fixes}@anchor{1708}
@subsection Interpreter Changes and Fixes


Some of the changes only affect people who deal with the Python interpreter at
the C level because they’re writing Python extension modules, embedding the
interpreter, or just hacking on the interpreter itself. If you only write Python
code, none of the changes described here will affect you very much.


@itemize *

@item 
Profiling and tracing functions can now be implemented in C, which can operate
at much higher speeds than Python-based functions and should reduce the overhead
of profiling and tracing.  This  will be of interest to authors of development
environments for Python.  Two new C functions were added to Python’s API,
@ref{1709,,PyEval_SetProfile()} and @ref{663,,PyEval_SetTrace()}. The existing
@ref{170a,,sys.setprofile()} and @ref{2e3,,sys.settrace()} functions still exist, and have
simply been changed to use the new C-level interface.  (Contributed by Fred L.
Drake, Jr.)

@item 
Another low-level API, primarily of interest to implementers of Python
debuggers and development tools, was added. @ref{170b,,PyInterpreterState_Head()} and
@ref{170c,,PyInterpreterState_Next()} let a caller walk through all the existing
interpreter objects; @ref{170d,,PyInterpreterState_ThreadHead()} and
@ref{170e,,PyThreadState_Next()} allow looping over all the thread states for a given
interpreter.  (Contributed by David Beazley.)

@item 
The C-level interface to the garbage collector has been changed to make it
easier to write extension types that support garbage collection and to debug
misuses of the functions. Various functions have slightly different semantics,
so a bunch of functions had to be renamed.  Extensions that use the old API will
still compile but will `not' participate in garbage collection, so updating them
for 2.2 should be considered fairly high priority.

To upgrade an extension module to the new API, perform the following steps:

@item 
Rename @code{Py_TPFLAGS_GC} to @ref{986,,Py_TPFLAGS_HAVE_GC}.

@item 

@table @asis

@item Use @ref{c9f,,PyObject_GC_New()} or @ref{ca0,,PyObject_GC_NewVar()} to allocate

objects, and @ref{170f,,PyObject_GC_Del()} to deallocate them.
@end table

@item 
Rename @code{PyObject_GC_Init()} to @ref{1710,,PyObject_GC_Track()} and
@code{PyObject_GC_Fini()} to @ref{1711,,PyObject_GC_UnTrack()}.

@item 
Remove @code{PyGC_HEAD_SIZE} from object size calculations.

@item 
Remove calls to @code{PyObject_AS_GC()} and @code{PyObject_FROM_GC()}.

@item 
A new @code{et} format sequence was added to @ref{3bf,,PyArg_ParseTuple()}; @code{et}
takes both a parameter and an encoding name, and converts the parameter to the
given encoding if the parameter turns out to be a Unicode string, or leaves it
alone if it’s an 8-bit string, assuming it to already be in the desired
encoding.  This differs from the @code{es} format character, which assumes that
8-bit strings are in Python’s default ASCII encoding and converts them to the
specified new encoding. (Contributed by M.-A. Lemburg, and used for the MBCS
support on Windows described in the following section.)

@item 
A different argument parsing function, @ref{1712,,PyArg_UnpackTuple()}, has been
added that’s simpler and presumably faster.  Instead of specifying a format
string, the caller simply gives the minimum and maximum number of arguments
expected, and a set of pointers to @ref{5df,,PyObject}* variables that will be
filled in with argument values.

@item 
Two new flags @ref{16e0,,METH_NOARGS} and @ref{1713,,METH_O} are available in method
definition tables to simplify implementation of methods with no arguments or a
single untyped argument. Calling such methods is more efficient than calling a
corresponding method that uses @ref{1714,,METH_VARARGS}.  Also, the old
@code{METH_OLDARGS} style of writing C methods is  now officially deprecated.

@item 
Two new wrapper functions, @ref{1715,,PyOS_snprintf()} and @ref{1716,,PyOS_vsnprintf()}
were added to provide  cross-platform implementations for the relatively new
@code{snprintf()} and @code{vsnprintf()} C lib APIs. In contrast to the standard
@code{sprintf()} and @code{vsprintf()} functions, the Python versions check the
bounds of the buffer used to protect against buffer overruns. (Contributed by
M.-A. Lemburg.)

@item 
The @ref{1717,,_PyTuple_Resize()} function has lost an unused parameter, so now it
takes 2 parameters instead of 3.  The third argument was never used, and can
simply be discarded when porting code from earlier versions to Python 2.2.
@end itemize

@c ======================================================================

@node Other Changes and Fixes<3>,Acknowledgements<6>,Interpreter Changes and Fixes,What’s New in Python 2 2
@anchor{whatsnew/2 2 other-changes-and-fixes}@anchor{1718}
@subsection Other Changes and Fixes


As usual there were a bunch of other improvements and bugfixes scattered
throughout the source tree.  A search through the CVS change logs finds there
were 527 patches applied and 683 bugs fixed between Python 2.1 and 2.2; 2.2.1
applied 139 patches and fixed 143 bugs; 2.2.2 applied 106 patches and fixed 82
bugs.  These figures are likely to be underestimates.

Some of the more notable changes are:


@itemize *

@item 
The code for the MacOS port for Python, maintained by Jack Jansen, is now kept
in the main Python CVS tree, and many changes have been made to support MacOS X.

The most significant change is the ability to build Python as a framework,
enabled by supplying the @code{--enable-framework} option to the configure
script when compiling Python.  According to Jack Jansen, “This installs a
self-contained Python installation plus the OS X framework “glue” into
@code{/Library/Frameworks/Python.framework} (or another location of choice).
For now there is little immediate added benefit to this (actually, there is the
disadvantage that you have to change your PATH to be able to find Python), but
it is the basis for creating a full-blown Python application, porting the
MacPython IDE, possibly using Python as a standard OSA scripting language and
much more.”

Most of the MacPython toolbox modules, which interface to MacOS APIs such as
windowing, QuickTime, scripting, etc. have been ported to OS X, but they’ve been
left commented out in @code{setup.py}.  People who want to experiment with
these modules can uncomment them manually.

@c Jack's original comments:
@c The main change is the possibility to build Python as a
@c framework. This installs a self-contained Python installation plus the
@c OSX framework "glue" into /Library/Frameworks/Python.framework (or
@c another location of choice). For now there is little immediate added
@c benefit to this (actually, there is the disadvantage that you have to
@c change your PATH to be able to find Python), but it is the basis for
@c creating a fullblown Python application, porting the MacPython IDE,
@c possibly using Python as a standard OSA scripting language and much
@c more. You enable this with "configure --enable-framework".
@c The other change is that most MacPython toolbox modules, which
@c interface to all the MacOS APIs such as windowing, quicktime,
@c scripting, etc. have been ported. Again, most of these are not of
@c immediate use, as they need a full application to be really useful, so
@c they have been commented out in setup.py. People wanting to experiment
@c can uncomment them. Gestalt and Internet Config modules are enabled by
@c default.

@item 
Keyword arguments passed to built-in functions that don’t take them now cause a
@ref{199,,TypeError} exception to be raised, with the message “`function' takes no
keyword arguments”.

@item 
Weak references, added in Python 2.1 as an extension module, are now part of
the core because they’re used in the implementation of new-style classes.  The
@ref{1719,,ReferenceError} exception has therefore moved from the @ref{11b,,weakref}
module to become a built-in exception.

@item 
A new script, @code{Tools/scripts/cleanfuture.py} by Tim Peters,
automatically removes obsolete @code{__future__} statements from Python source
code.

@item 
An additional `flags' argument has been added to the built-in function
@ref{4b2,,compile()}, so the behaviour of @code{__future__} statements can now be
correctly observed in simulated shells, such as those presented by IDLE and
other development environments.  This is described in 
@geindex Python Enhancement Proposals; PEP 264
PEP 264@footnote{https://peps.python.org/pep-0264/}. (Contributed
by Michael Hudson.)

@item 
The new license introduced with Python 1.6 wasn’t GPL-compatible.  This is
fixed by some minor textual changes to the 2.2 license, so it’s now legal to
embed Python inside a GPLed program again.  Note that Python itself is not
GPLed, but instead is under a license that’s essentially equivalent to the BSD
license, same as it always was.  The license changes were also applied to the
Python 2.0.1 and 2.1.1 releases.

@item 
When presented with a Unicode filename on Windows, Python will now convert it
to an MBCS encoded string, as used by the Microsoft file APIs.  As MBCS is
explicitly used by the file APIs, Python’s choice of ASCII as the default
encoding turns out to be an annoyance.  On Unix, the locale’s character set is
used if @code{locale.nl_langinfo(CODESET)} is available.  (Windows support was
contributed by Mark Hammond with assistance from Marc-André Lemburg. Unix
support was added by Martin von Löwis.)

@item 
Large file support is now enabled on Windows.  (Contributed by Tim Peters.)

@item 
The @code{Tools/scripts/ftpmirror.py} script now parses a @code{.netrc}
file, if you have one. (Contributed by Mike Romberg.)

@item 
Some features of the object returned by the @code{xrange()} function are now
deprecated, and trigger warnings when they’re accessed; they’ll disappear in
Python 2.3. @code{xrange} objects tried to pretend they were full sequence
types by supporting slicing, sequence multiplication, and the @ref{349,,in}
operator, but these features were rarely used and therefore buggy.  The
@code{tolist()} method and the @code{start}, @code{stop}, and @code{step}
attributes are also being deprecated.  At the C level, the fourth argument to
the @code{PyRange_New()} function, @code{repeat}, has also been deprecated.

@item 
There were a bunch of patches to the dictionary implementation, mostly to fix
potential core dumps if a dictionary contains objects that sneakily changed
their hash value, or mutated the dictionary they were contained in. For a while
python-dev fell into a gentle rhythm of Michael Hudson finding a case that
dumped core, Tim Peters fixing the bug, Michael finding another case, and round
and round it went.

@item 
On Windows, Python can now be compiled with Borland C thanks to a number of
patches contributed by Stephen Hansen, though the result isn’t fully functional
yet.  (But this `is' progress…)

@item 
Another Windows enhancement: Wise Solutions generously offered PythonLabs use
of their InstallerMaster 8.1 system.  Earlier PythonLabs Windows installers used
Wise 5.0a, which was beginning to show its age.  (Packaged up by Tim Peters.)

@item 
Files ending in @code{.pyw} can now be imported on Windows. @code{.pyw} is a
Windows-only thing, used to indicate that a script needs to be run using
PYTHONW.EXE instead of PYTHON.EXE in order to prevent a DOS console from popping
up to display the output.  This patch makes it possible to import such scripts,
in case they’re also usable as modules.  (Implemented by David Bolen.)

@item 
On platforms where Python uses the C @code{dlopen()} function  to load
extension modules, it’s now possible to set the flags used  by @code{dlopen()}
using the @ref{171a,,sys.getdlopenflags()} and @ref{132b,,sys.setdlopenflags()} functions.
(Contributed by Bram Stolk.)

@item 
The @ref{1a5,,pow()} built-in function no longer supports 3 arguments when
floating-point numbers are supplied. @code{pow(x, y, z)} returns @code{(x**y) % z},
but this is never useful for floating-point numbers, and the final result varies
unpredictably depending on the platform.  A call such as @code{pow(2.0, 8.0, 7.0)}
will now raise a @ref{199,,TypeError} exception.
@end itemize

@c ======================================================================

@node Acknowledgements<6>,,Other Changes and Fixes<3>,What’s New in Python 2 2
@anchor{whatsnew/2 2 acknowledgements}@anchor{171b}
@subsection Acknowledgements


The author would like to thank the following people for offering suggestions,
corrections and assistance with various drafts of this article: Fred Bremmer,
Keith Briggs, Andrew Dalke, Fred L. Drake, Jr., Carel Fellinger, David Goodger,
Mark Hammond, Stephen Hansen, Michael Hudson, Jack Jansen, Marc-André Lemburg,
Martin von Löwis, Fredrik Lundh, Michael McLay, Nick Mathewson, Paul Moore,
Gustavo Niemeyer, Don O’Donnell, Joonas Paalasma, Tim Peters, Jens Quade, Tom
Reinhardt, Neil Schemenauer, Guido van Rossum, Greg Ward, Edward Welbourne.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node What’s New in Python 2 1,What’s New in Python 2 0,What’s New in Python 2 2,What’s New in Python
@anchor{whatsnew/2 1 doc}@anchor{171c}@anchor{whatsnew/2 1 translation-repo}@anchor{171d}@anchor{whatsnew/2 1 what-s-new-in-python-2-1}@anchor{171e}
@section What’s New in Python 2.1


@*Author: 
A.M. Kuchling


@c $Id: whatsnew21.tex 50964 2006-07-30 03:03:43Z fred.drake $

@menu
* Introduction: Introduction<2>. 
* PEP 227; Nested Scopes: PEP 227 Nested Scopes<2>. 
* PEP 236; __future__ Directives: PEP 236 __future__ Directives. 
* PEP 207; Rich Comparisons: PEP 207 Rich Comparisons. 
* PEP 230; Warning Framework: PEP 230 Warning Framework. 
* PEP 229; New Build System: PEP 229 New Build System. 
* PEP 205; Weak References: PEP 205 Weak References. 
* PEP 232; Function Attributes: PEP 232 Function Attributes. 
* PEP 235; Importing Modules on Case-Insensitive Platforms: PEP 235 Importing Modules on Case-Insensitive Platforms. 
* PEP 217; Interactive Display Hook: PEP 217 Interactive Display Hook. 
* PEP 208; New Coercion Model: PEP 208 New Coercion Model. 
* PEP 241; Metadata in Python Packages: PEP 241 Metadata in Python Packages. 
* New and Improved Modules: New and Improved Modules<4>. 
* Other Changes and Fixes: Other Changes and Fixes<4>. 
* Acknowledgements: Acknowledgements<7>. 

@end menu

@node Introduction<2>,PEP 227 Nested Scopes<2>,,What’s New in Python 2 1
@anchor{whatsnew/2 1 introduction}@anchor{171f}
@subsection Introduction


This article explains the new features in Python 2.1.  While there aren’t as
many changes in 2.1 as there were in Python 2.0, there are still some pleasant
surprises in store.  2.1 is the first release to be steered through the use of
Python Enhancement Proposals, or PEPs, so most of the sizable changes have
accompanying PEPs that provide more complete documentation and a design
rationale for the change.  This article doesn’t attempt to document the new
features completely, but simply provides an overview of the new features for
Python programmers. Refer to the Python 2.1 documentation, or to the specific
PEP, for more details about any new feature that particularly interests you.

One recent goal of the Python development team has been to accelerate the pace
of new releases, with a new release coming every 6 to 9 months. 2.1 is the first
release to come out at this faster pace, with the first alpha appearing in
January, 3 months after the final version of 2.0 was released.

The final release of Python 2.1 was made on April 17, 2001.

@c ======================================================================

@node PEP 227 Nested Scopes<2>,PEP 236 __future__ Directives,Introduction<2>,What’s New in Python 2 1
@anchor{whatsnew/2 1 pep-227-nested-scopes}@anchor{1720}
@subsection PEP 227: Nested Scopes


The largest change in Python 2.1 is to Python’s scoping rules.  In Python 2.0,
at any given time there are at most three namespaces used to look up variable
names: local, module-level, and the built-in namespace.  This often surprised
people because it didn’t match their intuitive expectations.  For example, a
nested recursive function definition doesn’t work:

@example
def f():
    ...
    def g(value):
        ...
        return g(value-1) + 1
    ...
@end example

The function @code{g()} will always raise a @ref{450,,NameError} exception, because
the binding of the name @code{g} isn’t in either its local namespace or in the
module-level namespace.  This isn’t much of a problem in practice (how often do
you recursively define interior functions like this?), but this also made using
the @ref{14a9,,lambda} expression clumsier, and this was a problem in practice.
In code which uses @code{lambda} you can often find local variables being
copied by passing them as the default values of arguments.

@example
def find(self, name):
    "Return list of any entries equal to 'name'"
    L = filter(lambda x, name=name: x == name,
               self.list_attribute)
    return L
@end example

The readability of Python code written in a strongly functional style suffers
greatly as a result.

The most significant change to Python 2.1 is that static scoping has been added
to the language to fix this problem.  As a first effect, the @code{name=name}
default argument is now unnecessary in the above example.  Put simply, when a
given variable name is not assigned a value within a function (by an assignment,
or the @ref{1666,,def}, @ref{14e3,,class}, or @ref{7f9,,import} statements),
references to the variable will be looked up in the local namespace of the
enclosing scope.  A more detailed explanation of the rules, and a dissection of
the implementation, can be found in the PEP.

This change may cause some compatibility problems for code where the same
variable name is used both at the module level and as a local variable within a
function that contains further function definitions. This seems rather unlikely
though, since such code would have been pretty confusing to read in the first
place.

One side effect of the change is that the @code{from module import *} and
@code{exec} statements have been made illegal inside a function scope under
certain conditions.  The Python reference manual has said all along that @code{from
module import *} is only legal at the top level of a module, but the CPython
interpreter has never enforced this before.  As part of the implementation of
nested scopes, the compiler which turns Python source into bytecodes has to
generate different code to access variables in a containing scope.  @code{from
module import *} and @code{exec} make it impossible for the compiler to
figure this out, because they add names to the local namespace that are
unknowable at compile time. Therefore, if a function contains function
definitions or @ref{14a9,,lambda} expressions with free variables, the compiler
will flag this by raising a @ref{18f,,SyntaxError} exception.

To make the preceding explanation a bit clearer, here’s an example:

@example
x = 1
def f():
    # The next line is a syntax error
    exec 'x=2'
    def g():
        return x
@end example

Line 4 containing the @code{exec} statement is a syntax error, since
@code{exec} would define a new local variable named @code{x} whose value should
be accessed by @code{g()}.

This shouldn’t be much of a limitation, since @code{exec} is rarely used in
most Python code (and when it is used, it’s often a sign of a poor design
anyway).

Compatibility concerns have led to nested scopes being introduced gradually; in
Python 2.1, they aren’t enabled by default, but can be turned on within a module
by using a future statement as described in 
@geindex Python Enhancement Proposals; PEP 236
PEP 236@footnote{https://peps.python.org/pep-0236/}.  (See the following section
for further discussion of 
@geindex Python Enhancement Proposals; PEP 236
PEP 236@footnote{https://peps.python.org/pep-0236/}.)  In Python 2.2, nested scopes will become
the default and there will be no way to turn them off, but users will have had
all of 2.1’s lifetime to fix any breakage resulting from their introduction.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 227

@item PEP 227@footnote{https://peps.python.org/pep-0227/} - Statically Nested Scopes

Written and implemented by Jeremy Hylton.
@end table


@c ======================================================================

@node PEP 236 __future__ Directives,PEP 207 Rich Comparisons,PEP 227 Nested Scopes<2>,What’s New in Python 2 1
@anchor{whatsnew/2 1 pep-236-future-directives}@anchor{1721}
@subsection PEP 236: __future__ Directives


The reaction to nested scopes was widespread concern about the dangers of
breaking code with the 2.1 release, and it was strong enough to make the
Pythoneers take a more conservative approach.  This approach consists of
introducing a convention for enabling optional functionality in release N that
will become compulsory in release N+1.

The syntax uses a @code{from...import} statement using the reserved module name
@ref{0,,__future__}.  Nested scopes can be enabled by the following statement:

@example
from __future__ import nested_scopes
@end example

While it looks like a normal @ref{7f9,,import} statement, it’s not; there are
strict rules on where such a future statement can be put. They can only be at
the top of a module, and must precede any Python code or regular
@code{import} statements.  This is because such statements can affect how
the Python bytecode compiler parses code and generates bytecode, so they must
precede any statement that will result in bytecodes being produced.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 236

@item PEP 236@footnote{https://peps.python.org/pep-0236/} - Back to the @ref{0,,__future__}

Written by Tim Peters, and primarily implemented by Jeremy Hylton.
@end table


@c ======================================================================

@node PEP 207 Rich Comparisons,PEP 230 Warning Framework,PEP 236 __future__ Directives,What’s New in Python 2 1
@anchor{whatsnew/2 1 pep-207-rich-comparisons}@anchor{1722}
@subsection PEP 207: Rich Comparisons


In earlier versions, Python’s support for implementing comparisons on user-defined
classes and extension types was quite simple. Classes could implement a
@code{__cmp__()} method that was given two instances of a class, and could only
return 0 if they were equal or +1 or -1 if they weren’t; the method couldn’t
raise an exception or return anything other than a Boolean value.  Users of
Numeric Python often found this model too weak and restrictive, because in the
number-crunching programs that numeric Python is used for, it would be more
useful to be able to perform elementwise comparisons of two matrices, returning
a matrix containing the results of a given comparison for each element.  If the
two matrices are of different sizes, then the compare has to be able to raise an
exception to signal the error.

In Python 2.1, rich comparisons were added in order to support this need.
Python classes can now individually overload each of the @code{<}, @code{<=}, @code{>},
@code{>=}, @code{==}, and @code{!=} operations.  The new magic method names are:


@multitable {xxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Operation

@tab

Method name

@item

@code{<}

@tab

@ref{14ac,,__lt__()}

@item

@code{<=}

@tab

@ref{1516,,__le__()}

@item

@code{>}

@tab

@ref{1517,,__gt__()}

@item

@code{>=}

@tab

@ref{1518,,__ge__()}

@item

@code{==}

@tab

@ref{cf8,,__eq__()}

@item

@code{!=}

@tab

@ref{1723,,__ne__()}

@end multitable


(The magic methods are named after the corresponding Fortran operators @code{.LT.}.
@code{.LE.}, &c.  Numeric programmers are almost certainly quite familiar with
these names and will find them easy to remember.)

Each of these magic methods is of the form @code{method(self, other)}, where
@code{self} will be the object on the left-hand side of the operator, while
@code{other} will be the object on the right-hand side.  For example, the
expression @code{A < B} will cause @code{A.__lt__(B)} to be called.

Each of these magic methods can return anything at all: a Boolean, a matrix, a
list, or any other Python object.  Alternatively they can raise an exception if
the comparison is impossible, inconsistent, or otherwise meaningless.

The built-in @code{cmp(A,B)} function can use the rich comparison machinery,
and now accepts an optional argument specifying which comparison operation to
use; this is given as one of the strings @code{"<"}, @code{"<="}, @code{">"}, @code{">="},
@code{"=="}, or @code{"!="}.  If called without the optional third argument,
@code{cmp()} will only return -1, 0, or +1 as in previous versions of Python;
otherwise it will call the appropriate method and can return any Python object.

There are also corresponding changes of interest to C programmers; there’s a new
slot @code{tp_richcmp} in type objects and an API for performing a given rich
comparison.  I won’t cover the C API here, but will refer you to 
@geindex Python Enhancement Proposals; PEP 207
PEP 207@footnote{https://peps.python.org/pep-0207/}, or to
2.1’s C API documentation, for the full list of related functions.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 207

@item PEP 207@footnote{https://peps.python.org/pep-0207/} - Rich Comparisons

Written by Guido van Rossum, heavily based on earlier work by David Ascher, and
implemented by Guido van Rossum.
@end table


@c ======================================================================

@node PEP 230 Warning Framework,PEP 229 New Build System,PEP 207 Rich Comparisons,What’s New in Python 2 1
@anchor{whatsnew/2 1 pep-230-warning-framework}@anchor{1724}
@subsection PEP 230: Warning Framework


Over its 10 years of existence, Python has accumulated a certain number of
obsolete modules and features along the way.  It’s difficult to know when a
feature is safe to remove, since there’s no way of knowing how much code uses it
— perhaps no programs depend on the feature, or perhaps many do.  To enable
removing old features in a more structured way, a warning framework was added.
When the Python developers want to get rid of a feature, it will first trigger a
warning in the next version of Python.  The following Python version can then
drop the feature, and users will have had a full release cycle to remove uses of
the old feature.

Python 2.1 adds the warning framework to be used in this scheme.  It adds a
@ref{119,,warnings} module that provide functions to issue warnings, and to filter
out warnings that you don’t want to be displayed. Third-party modules can also
use this framework to deprecate old features that they no longer wish to
support.

For example, in Python 2.1 the @code{regex} module is deprecated, so importing
it causes a warning to be printed:

@example
>>> import regex
__main__:1: DeprecationWarning: the regex module
         is deprecated; please use the re module
>>>
@end example

Warnings can be issued by calling the @ref{1725,,warnings.warn()} function:

@example
warnings.warn("feature X no longer supported")
@end example

The first parameter is the warning message; an additional optional parameters
can be used to specify a particular warning category.

Filters can be added to disable certain warnings; a regular expression pattern
can be applied to the message or to the module name in order to suppress a
warning.  For example, you may have a program that uses the @code{regex} module
and not want to spare the time to convert it to use the @ref{be,,re} module right
now.  The warning can be suppressed by calling

@example
import warnings
warnings.filterwarnings(action = 'ignore',
                        message='.*regex module is deprecated',
                        category=DeprecationWarning,
                        module = '__main__')
@end example

This adds a filter that will apply only to warnings of the class
@ref{1a4,,DeprecationWarning} triggered in the @ref{1,,__main__} module, and applies
a regular expression to only match the message about the @code{regex} module
being deprecated, and will cause such warnings to be ignored.  Warnings can also
be printed only once, printed every time the offending code is executed, or
turned into exceptions that will cause the program to stop (unless the
exceptions are caught in the usual way, of course).

Functions were also added to Python’s C API for issuing warnings; refer to PEP
230 or to Python’s API documentation for the details.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 5

@item PEP 5@footnote{https://peps.python.org/pep-0005/} - Guidelines for Language Evolution

Written by Paul Prescod, to specify procedures to be followed when removing old
features from Python.  The policy described in this PEP hasn’t been officially
adopted, but the eventual policy probably won’t be too different from Prescod’s
proposal.

@geindex Python Enhancement Proposals; PEP 230

@item PEP 230@footnote{https://peps.python.org/pep-0230/} - Warning Framework

Written and implemented by Guido van Rossum.
@end table


@c ======================================================================

@node PEP 229 New Build System,PEP 205 Weak References,PEP 230 Warning Framework,What’s New in Python 2 1
@anchor{whatsnew/2 1 pep-229-new-build-system}@anchor{1726}
@subsection PEP 229: New Build System


When compiling Python, the user had to go in and edit the @code{Modules/Setup}
file in order to enable various additional modules; the default set is
relatively small and limited to modules that compile on most Unix platforms.
This means that on Unix platforms with many more features, most notably Linux,
Python installations often don’t contain all useful modules they could.

Python 2.0 added the Distutils, a set of modules for distributing and installing
extensions.  In Python 2.1, the Distutils are used to compile much of the
standard library of extension modules, autodetecting which ones are supported on
the current machine.  It’s hoped that this will make Python installations easier
and more featureful.

Instead of having to edit the @code{Modules/Setup} file in order to enable
modules, a @code{setup.py} script in the top directory of the Python source
distribution is run at build time, and attempts to discover which modules can be
enabled by examining the modules and header files on the system.  If a module is
configured in @code{Modules/Setup}, the @code{setup.py} script won’t attempt
to compile that module and will defer to the @code{Modules/Setup} file’s
contents.  This provides a way to specific any strange command-line flags or
libraries that are required for a specific platform.

In another far-reaching change to the build mechanism, Neil Schemenauer
restructured things so Python now uses a single makefile that isn’t recursive,
instead of makefiles in the top directory and in each of the @code{Python/},
@code{Parser/}, @code{Objects/}, and @code{Modules/} subdirectories.  This
makes building Python faster and also makes hacking the Makefiles clearer and
simpler.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 229

@item PEP 229@footnote{https://peps.python.org/pep-0229/} - Using Distutils to Build Python

Written and implemented by A.M. Kuchling.
@end table


@c ======================================================================

@node PEP 205 Weak References,PEP 232 Function Attributes,PEP 229 New Build System,What’s New in Python 2 1
@anchor{whatsnew/2 1 pep-205-weak-references}@anchor{1727}
@subsection PEP 205: Weak References


Weak references, available through the @ref{11b,,weakref} module, are a minor but
useful new data type in the Python programmer’s toolbox.

Storing a reference to an object (say, in a dictionary or a list) has the side
effect of keeping that object alive forever.  There are a few specific cases
where this behaviour is undesirable, object caches being the most common one,
and another being circular references in data structures such as trees.

For example, consider a memoizing function that caches the results of another
function @code{f(x)} by storing the function’s argument and its result in a
dictionary:

@example
_cache = @{@}
def memoize(x):
    if _cache.has_key(x):
        return _cache[x]

    retval = f(x)

    # Cache the returned object
    _cache[x] = retval

    return retval
@end example

This version works for simple things such as integers, but it has a side effect;
the @code{_cache} dictionary holds a reference to the return values, so they’ll
never be deallocated until the Python process exits and cleans up. This isn’t
very noticeable for integers, but if @code{f()} returns an object, or a data
structure that takes up a lot of memory, this can be a problem.

Weak references provide a way to implement a cache that won’t keep objects alive
beyond their time.  If an object is only accessible through weak references, the
object will be deallocated and the weak references will now indicate that the
object it referred to no longer exists.  A weak reference to an object `obj' is
created by calling @code{wr = weakref.ref(obj)}.  The object being referred to is
returned by calling the weak reference as if it were a function: @code{wr()}.  It
will return the referenced object, or @code{None} if the object no longer exists.

This makes it possible to write a @code{memoize()} function whose cache doesn’t
keep objects alive, by storing weak references in the cache.

@example
_cache = @{@}
def memoize(x):
    if _cache.has_key(x):
        obj = _cache[x]()
        # If weak reference object still exists,
        # return it
        if obj is not None: return obj

    retval = f(x)

    # Cache a weak reference
    _cache[x] = weakref.ref(retval)

    return retval
@end example

The @ref{11b,,weakref} module also allows creating proxy objects which behave like
weak references — an object referenced only by proxy objects is deallocated –
but instead of requiring an explicit call to retrieve the object, the proxy
transparently forwards all operations to the object as long as the object still
exists.  If the object is deallocated, attempting to use a proxy will cause a
@code{weakref.ReferenceError} exception to be raised.

@example
proxy = weakref.proxy(obj)
proxy.attr   # Equivalent to obj.attr
proxy.meth() # Equivalent to obj.meth()
del obj
proxy.attr   # raises weakref.ReferenceError
@end example


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 205

@item PEP 205@footnote{https://peps.python.org/pep-0205/} - Weak References

Written and implemented by Fred L. Drake, Jr.
@end table


@c ======================================================================

@node PEP 232 Function Attributes,PEP 235 Importing Modules on Case-Insensitive Platforms,PEP 205 Weak References,What’s New in Python 2 1
@anchor{whatsnew/2 1 pep-232-function-attributes}@anchor{1728}
@subsection PEP 232: Function Attributes


In Python 2.1, functions can now have arbitrary information attached to them.
People were often using docstrings to hold information about functions and
methods, because the @ref{13e5,,__doc__} attribute was the only way of
attaching any
information to a function.  For example, in the Zope web application server,
functions are marked as safe for public access by having a docstring, and in
John Aycock’s SPARK parsing framework, docstrings hold parts of the BNF grammar
to be parsed.  This overloading is unfortunate, since docstrings are really
intended to hold a function’s documentation; for example, it means you can’t
properly document functions intended for private use in Zope.

Arbitrary attributes can now be set and retrieved on functions using the regular
Python syntax:

@example
def f(): pass

f.publish = 1
f.secure = 1
f.grammar = "A ::= B (C D)*"
@end example

The dictionary containing attributes can be accessed as the function’s
@ref{14de,,__dict__}. Unlike the @ref{e5d,,__dict__} attribute of class instances, in
functions you can actually assign a new dictionary to @code{__dict__}, though
the new value is restricted to a regular Python dictionary; you `can’t' be
tricky and set it to a @code{UserDict} instance, or any other random object
that behaves like a mapping.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 232

@item PEP 232@footnote{https://peps.python.org/pep-0232/} - Function Attributes

Written and implemented by Barry Warsaw.
@end table


@c ======================================================================

@node PEP 235 Importing Modules on Case-Insensitive Platforms,PEP 217 Interactive Display Hook,PEP 232 Function Attributes,What’s New in Python 2 1
@anchor{whatsnew/2 1 pep-235-importing-modules-on-case-insensitive-platforms}@anchor{1729}
@subsection PEP 235: Importing Modules on Case-Insensitive Platforms


Some operating systems have filesystems that are case-insensitive, MacOS and
Windows being the primary examples; on these systems, it’s impossible to
distinguish the filenames @code{FILE.PY} and @code{file.py}, even though they do store
the file’s name  in its original case (they’re case-preserving, too).

In Python 2.1, the @ref{7f9,,import} statement will work to simulate case-sensitivity
on case-insensitive platforms.  Python will now search for the first
case-sensitive match by default, raising an @ref{65b,,ImportError} if no such file
is found, so @code{import file} will not import a module named @code{FILE.PY}.
Case-insensitive matching can be requested by setting the 
@geindex PYTHONCASEOK
@geindex environment variable; PYTHONCASEOK
@ref{b5b,,PYTHONCASEOK}
environment variable before starting the Python interpreter.

@c ======================================================================

@node PEP 217 Interactive Display Hook,PEP 208 New Coercion Model,PEP 235 Importing Modules on Case-Insensitive Platforms,What’s New in Python 2 1
@anchor{whatsnew/2 1 pep-217-interactive-display-hook}@anchor{172a}
@subsection PEP 217: Interactive Display Hook


When using the Python interpreter interactively, the output of commands is
displayed using the built-in @ref{1c3,,repr()} function. In Python 2.1, the variable
@ref{172b,,sys.displayhook()} can be set to a callable object which will be called
instead of @code{repr()}. For example, you can set it to a special
pretty-printing function:

@example
>>> # Create a recursive data structure
... L = [1,2,3]
>>> L.append(L)
>>> L # Show Python's default output
[1, 2, 3, [...]]
>>> # Use pprint.pprint() as the display function
... import sys, pprint
>>> sys.displayhook = pprint.pprint
>>> L
[1, 2, 3,  <Recursion on list with id=135143996>]
>>>
@end example


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 217

@item PEP 217@footnote{https://peps.python.org/pep-0217/} - Display Hook for Interactive Use

Written and implemented by Moshe Zadka.
@end table


@c ======================================================================

@node PEP 208 New Coercion Model,PEP 241 Metadata in Python Packages,PEP 217 Interactive Display Hook,What’s New in Python 2 1
@anchor{whatsnew/2 1 pep-208-new-coercion-model}@anchor{172c}
@subsection PEP 208: New Coercion Model


How numeric coercion is done at the C level was significantly modified.  This
will only affect the authors of C extensions to Python, allowing them more
flexibility in writing extension types that support numeric operations.

Extension types can now set the type flag @code{Py_TPFLAGS_CHECKTYPES} in their
@code{PyTypeObject} structure to indicate that they support the new coercion model.
In such extension types, the numeric slot functions can no longer assume that
they’ll be passed two arguments of the same type; instead they may be passed two
arguments of differing types, and can then perform their own internal coercion.
If the slot function is passed a type it can’t handle, it can indicate the
failure by returning a reference to the @code{Py_NotImplemented} singleton value.
The numeric functions of the other type will then be tried, and perhaps they can
handle the operation; if the other type also returns @code{Py_NotImplemented}, then
a @ref{199,,TypeError} will be raised.  Numeric methods written in Python can also
return @code{Py_NotImplemented}, causing the interpreter to act as if the method
did not exist (perhaps raising a @code{TypeError}, perhaps trying another
object’s numeric methods).


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 208

@item PEP 208@footnote{https://peps.python.org/pep-0208/} - Reworking the Coercion Model

Written and implemented by Neil Schemenauer, heavily based upon earlier work by
Marc-André Lemburg.  Read this to understand the fine points of how numeric
operations will now be processed at the C level.
@end table


@c ======================================================================

@node PEP 241 Metadata in Python Packages,New and Improved Modules<4>,PEP 208 New Coercion Model,What’s New in Python 2 1
@anchor{whatsnew/2 1 pep-241-metadata-in-python-packages}@anchor{172d}
@subsection PEP 241: Metadata in Python Packages


A common complaint from Python users is that there’s no single catalog of all
the Python modules in existence.  T. Middleton’s Vaults of Parnassus at
@code{www.vex.net/parnassus/} (retired in February 2009, available in the Internet Archive Wayback Machine@footnote{https://web.archive.org/web/20090130140102/http://www.vex.net/parnassus/})
was the largest catalog of Python modules, but
registering software at the Vaults is optional, and many people did not bother.

As a first small step toward fixing the problem, Python software packaged using
the Distutils @code{sdist} command will include a file named
@code{PKG-INFO} containing information about the package such as its name,
version, and author (metadata, in cataloguing terminology).  
@geindex Python Enhancement Proposals; PEP 241
PEP 241@footnote{https://peps.python.org/pep-0241/} contains
the full list of fields that can be present in the @code{PKG-INFO} file.  As
people began to package their software using Python 2.1, more and more packages
will include metadata, making it possible to build automated cataloguing systems
and experiment with them.  With the result experience, perhaps it’ll be possible
to design a really good catalog and then build support for it into Python 2.2.
For example, the Distutils @code{sdist} and @code{bdist_*} commands
could support an @code{upload} option that would automatically upload your
package to a catalog server.

You can start creating packages containing @code{PKG-INFO} even if you’re not
using Python 2.1, since a new release of the Distutils will be made for users of
earlier Python versions.  Version 1.0.2 of the Distutils includes the changes
described in 
@geindex Python Enhancement Proposals; PEP 241
PEP 241@footnote{https://peps.python.org/pep-0241/}, as well as various bugfixes and enhancements.  It will be
available from the Distutils SIG at @indicateurl{https://www.python.org/community/sigs/current/distutils-sig/}.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 241

@item PEP 241@footnote{https://peps.python.org/pep-0241/} - Metadata for Python Software Packages

Written and implemented by A.M. Kuchling.

@geindex Python Enhancement Proposals; PEP 243

@item PEP 243@footnote{https://peps.python.org/pep-0243/} - Module Repository Upload Mechanism

Written by Sean Reifschneider, this draft PEP describes a proposed mechanism for
uploading  Python packages to a central server.
@end table


@c ======================================================================

@node New and Improved Modules<4>,Other Changes and Fixes<4>,PEP 241 Metadata in Python Packages,What’s New in Python 2 1
@anchor{whatsnew/2 1 new-and-improved-modules}@anchor{172e}
@subsection New and Improved Modules



@itemize *

@item 
Ka-Ping Yee contributed two new modules: @code{inspect.py}, a module for
getting information about live Python code, and @code{pydoc.py}, a module for
interactively converting docstrings to HTML or text.  As a bonus,
@code{Tools/scripts/pydoc}, which is now automatically installed, uses
@code{pydoc.py} to display documentation given a Python module, package, or
class name.  For example, @code{pydoc xml.dom} displays the following:

@example
Python Library Documentation: package xml.dom in xml

NAME
    xml.dom - W3C Document Object Model implementation for Python.

FILE
    /usr/local/lib/python2.1/xml/dom/__init__.pyc

DESCRIPTION
    The Python mapping of the Document Object Model is documented in the
    Python Library Reference in the section on the xml.dom package.

    This package contains the following modules:
      ...
@end example

@code{pydoc} also includes a Tk-based interactive help browser.   @code{pydoc}
quickly becomes addictive; try it out!

@item 
Two different modules for unit testing were added to the standard library.
The @ref{3e,,doctest} module, contributed by Tim Peters, provides a testing
framework based on running embedded examples in docstrings and comparing the
results against the expected output.  PyUnit, contributed by Steve Purcell, is a
unit testing framework inspired by JUnit, which was in turn an adaptation of
Kent Beck’s Smalltalk testing framework.  See @indicateurl{https://pyunit.sourceforge.net/} for
more information about PyUnit.

@item 
The @ref{3b,,difflib} module contains a class, @ref{121f,,SequenceMatcher}, which
compares two sequences and computes the changes required to transform one
sequence into the other.  For example, this module can be used to write a tool
similar to the Unix @code{diff} program, and in fact the sample program
@code{Tools/scripts/ndiff.py} demonstrates how to write such a script.

@item 
@ref{31,,curses.panel}, a wrapper for the panel library, part of ncurses and of
SYSV curses, was contributed by Thomas Gellekum.  The panel library provides
windows with the additional feature of depth. Windows can be moved higher or
lower in the depth ordering, and the panel library figures out where panels
overlap and which sections are visible.

@item 
The PyXML package has gone through a few releases since Python 2.0, and Python
2.1 includes an updated version of the @ref{127,,xml} package.  Some of the
noteworthy changes include support for Expat 1.2 and later versions, the ability
for Expat parsers to handle files in any encoding supported by Python, and
various bugfixes for SAX, DOM, and the @code{minidom} module.

@item 
Ping also contributed another hook for handling uncaught exceptions.
@ref{a12,,sys.excepthook()} can be set to a callable object.  When an exception isn’t
caught by any @ref{8fa,,try}…@ref{1ac,,except} blocks, the exception will be
passed to @code{sys.excepthook()}, which can then do whatever it likes.  At the
Ninth Python Conference, Ping demonstrated an application for this hook:
printing an extended traceback that not only lists the stack frames, but also
lists the function arguments and the local variables for each frame.

@item 
Various functions in the @ref{f4,,time} module, such as @ref{13f3,,asctime()} and
@ref{1705,,localtime()}, require a floating-point argument containing the time in
seconds since the epoch.  The most common use of these functions is to work with
the current time, so the floating-point argument has been made optional; when a
value isn’t provided, the current time will be used.  For example, log file
entries usually need a string containing the current time; in Python 2.1,
@code{time.asctime()} can be used, instead of the lengthier
@code{time.asctime(time.localtime(time.time()))} that was previously required.

This change was proposed and implemented by Thomas Wouters.

@item 
The @ref{62,,ftplib} module now defaults to retrieving files in passive mode,
because passive mode is more likely to work from behind a firewall.  This
request came from the Debian bug tracking system, since other Debian packages
use @code{ftplib} to retrieve files and then don’t work from behind a firewall.
It’s deemed unlikely that this will cause problems for anyone, because Netscape
defaults to passive mode and few people complain, but if passive mode is
unsuitable for your application or network setup, call @code{set_pasv(0)} on
FTP objects to disable passive mode.

@item 
Support for raw socket access has been added to the @ref{d1,,socket} module,
contributed by Grant Edwards.

@item 
The @ref{b5,,pstats} module now contains a simple interactive statistics browser
for displaying timing profiles for Python programs, invoked when the module is
run as a script.  Contributed by  Eric S. Raymond.

@item 
A new implementation-dependent function, @code{sys._getframe([depth])}, has
been added to return a given frame object from the current call stack.
@ref{8f2,,sys._getframe()} returns the frame at the top of the call stack;  if the
optional integer argument `depth' is supplied, the function returns the frame
that is `depth' calls below the top of the stack.  For example,
@code{sys._getframe(1)} returns the caller’s frame object.

This function is only present in CPython, not in Jython or the .NET
implementation.  Use it for debugging, and resist the temptation to put it into
production code.
@end itemize

@c ======================================================================

@node Other Changes and Fixes<4>,Acknowledgements<7>,New and Improved Modules<4>,What’s New in Python 2 1
@anchor{whatsnew/2 1 other-changes-and-fixes}@anchor{172f}
@subsection Other Changes and Fixes


There were relatively few smaller changes made in Python 2.1 due to the shorter
release cycle.  A search through the CVS change logs turns up 117 patches
applied, and 136 bugs fixed; both figures are likely to be underestimates.  Some
of the more notable changes are:


@itemize *

@item 
A specialized object allocator is now optionally available, that should be
faster than the system @code{malloc()} and have less memory overhead.  The
allocator uses C’s @code{malloc()} function to get large pools of memory, and
then fulfills smaller memory requests from these pools.  It can be enabled by
providing the @code{--with-pymalloc} option to the @code{configure}
script; see @code{Objects/obmalloc.c} for the implementation details.

Authors of C extension modules should test their code with the object allocator
enabled, because some incorrect code may break, causing core dumps at runtime.
There are a bunch of memory allocation functions in Python’s C API that have
previously been just aliases for the C library’s @code{malloc()} and
@code{free()}, meaning that if you accidentally called mismatched functions, the
error wouldn’t be noticeable.  When the object allocator is enabled, these
functions aren’t aliases of @code{malloc()} and @code{free()} any more, and
calling the wrong function to free memory will get you a core dump.  For
example, if memory was allocated using @ref{1730,,PyMem_New}, it has to be freed
using @ref{1731,,PyMem_Del()}, not @code{free()}.  A few modules included with Python
fell afoul of this and had to be fixed; doubtless there are more third-party
modules that will have the same problem.

The object allocator was contributed by Vladimir Marangozov.

@item 
The speed of line-oriented file I/O has been improved because people often
complain about its lack of speed, and because it’s often been used as a naïve
benchmark.  The @ref{bf,,readline()} method of file objects has therefore been
rewritten to be much faster.  The exact amount of the speedup will vary from
platform to platform depending on how slow the C library’s @code{getc()} was, but
is around 66%, and potentially much faster on some particular operating systems.
Tim Peters did much of the benchmarking and coding for this change, motivated by
a discussion in comp.lang.python.

A new module and method for file objects was also added, contributed by Jeff
Epler. The new method, @code{xreadlines()}, is similar to the existing
@code{xrange()} built-in.  @code{xreadlines()} returns an opaque sequence object
that only supports being iterated over, reading a line on every iteration but
not reading the entire file into memory as the existing @code{readlines()} method
does. You’d use it like this:

@example
for line in sys.stdin.xreadlines():
    # ... do something for each line ...
    ...
@end example

For a fuller discussion of the line I/O changes, see the python-dev summary for
January 1–15, 2001 at @indicateurl{https://mail.python.org/pipermail/python-dev/2001-January/}.

@item 
A new method, @ref{1732,,popitem()}, was added to dictionaries to enable
destructively iterating through the contents of a dictionary; this can be faster
for large dictionaries because there’s no need to construct a list containing
all the keys or values. @code{D.popitem()} removes a random @code{(key, value)} pair
from the dictionary @code{D} and returns it as a 2-tuple.  This was implemented
mostly by Tim Peters and Guido van Rossum, after a suggestion and preliminary
patch by Moshe Zadka.

@item 
Modules can now control which names are imported when @code{from module import *}
is used, by defining an @code{__all__} attribute containing a list of names that
will be imported.  One common complaint is that if the module imports other
modules such as @ref{df,,sys} or @ref{d8,,string}, @code{from module import *} will add
them to the importing module’s namespace.  To fix this, simply list the public
names in @code{__all__}:

@example
# List public names
__all__ = ['Database', 'open']
@end example

A stricter version of this patch was first suggested and implemented by Ben
Wolfson, but after some python-dev discussion, a weaker final version was
checked in.

@item 
Applying @ref{1c3,,repr()} to strings previously used octal escapes for
non-printable characters; for example, a newline was @code{'\012'}.  This was a
vestigial trace of Python’s C ancestry, but today octal is of very little
practical use.  Ka-Ping Yee suggested using hex escapes instead of octal ones,
and using the @code{\n}, @code{\t}, @code{\r} escapes for the appropriate characters,
and implemented this new formatting.

@item 
Syntax errors detected at compile-time can now raise exceptions containing the
filename and line number of the error, a pleasant side effect of the compiler
reorganization done by Jeremy Hylton.

@item 
C extensions which import other modules have been changed to use
@ref{3da,,PyImport_ImportModule()}, which means that they will use any import hooks
that have been installed.  This is also encouraged for third-party extensions
that need to import some other module from C code.

@item 
The size of the Unicode character database was shrunk by another 340K thanks
to Fredrik Lundh.

@item 
Some new ports were contributed: MacOS X (by Steven Majewski), Cygwin (by
Jason Tishler); RISCOS (by Dietmar Schwertberger); Unixware 7  (by Billy G.
Allie).
@end itemize

And there’s the usual list of minor bugfixes, minor memory leaks, docstring
edits, and other tweaks, too lengthy to be worth itemizing; see the CVS logs for
the full details if you want them.

@c ======================================================================

@node Acknowledgements<7>,,Other Changes and Fixes<4>,What’s New in Python 2 1
@anchor{whatsnew/2 1 acknowledgements}@anchor{1733}
@subsection Acknowledgements


The author would like to thank the following people for offering suggestions on
various drafts of this article: Graeme Cross, David Goodger, Jay Graves, Michael
Hudson, Marc-André Lemburg, Fredrik Lundh, Neil Schemenauer, Thomas Wouters.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node What’s New in Python 2 0,Changelog,What’s New in Python 2 1,What’s New in Python
@anchor{whatsnew/2 0 doc}@anchor{1734}@anchor{whatsnew/2 0 translation-repo}@anchor{1735}@anchor{whatsnew/2 0 what-s-new-in-python-2-0}@anchor{1736}
@section What’s New in Python 2.0


@*Author: 
A.M. Kuchling and Moshe Zadka


@c $Id: whatsnew20.tex 50964 2006-07-30 03:03:43Z fred.drake $

@menu
* Introduction: Introduction<3>. 
* What About Python 1.6?: What About Python 1 6?. 
* New Development Process:: 
* Unicode: Unicode<2>. 
* List Comprehensions:: 
* Augmented Assignment:: 
* String Methods:: 
* Garbage Collection of Cycles:: 
* Other Core Changes:: 
* Porting to 2.0: Porting to 2 0. 
* Extending/Embedding Changes:: 
* Distutils; Making Modules Easy to Install: Distutils Making Modules Easy to Install. 
* XML Modules:: 
* Module changes:: 
* New modules: New modules<2>. 
* IDLE Improvements:: 
* Deleted and Deprecated Modules:: 
* Acknowledgements: Acknowledgements<8>. 

@end menu

@node Introduction<3>,What About Python 1 6?,,What’s New in Python 2 0
@anchor{whatsnew/2 0 introduction}@anchor{1737}
@subsection Introduction


A new release of Python, version 2.0, was released on October 16, 2000. This
article covers the exciting new features in 2.0, highlights some other useful
changes, and points out a few incompatible changes that may require rewriting
code.

Python’s development never completely stops between releases, and a steady flow
of bug fixes and improvements are always being submitted. A host of minor fixes,
a few optimizations, additional docstrings, and better error messages went into
2.0; to list them all would be impossible, but they’re certainly significant.
Consult the publicly available CVS logs if you want to see the full list.  This
progress is due to the five developers working for  PythonLabs are now getting
paid to spend their days fixing bugs, and also due to the improved communication
resulting  from moving to SourceForge.

@c ======================================================================

@node What About Python 1 6?,New Development Process,Introduction<3>,What’s New in Python 2 0
@anchor{whatsnew/2 0 what-about-python-1-6}@anchor{1738}
@subsection What About Python 1.6?


Python 1.6 can be thought of as the Contractual Obligations Python release.
After the core development team left CNRI in May 2000, CNRI requested that a 1.6
release be created, containing all the work on Python that had been performed at
CNRI.  Python 1.6 therefore represents the state of the CVS tree as of May 2000,
with the most significant new feature being Unicode support.  Development
continued after May, of course, so the 1.6 tree received a few fixes to ensure
that it’s forward-compatible with Python 2.0.  1.6 is therefore part of Python’s
evolution, and not a side branch.

So, should you take much interest in Python 1.6?  Probably not.  The 1.6final
and 2.0beta1 releases were made on the same day (September 5, 2000), the plan
being to finalize Python 2.0 within a month or so.  If you have applications to
maintain, there seems little point in breaking things by moving to 1.6, fixing
them, and then having another round of breakage within a month by moving to 2.0;
you’re better off just going straight to 2.0.  Most of the really interesting
features described in this document are only in 2.0, because a lot of work was
done between May and September.

@c ======================================================================

@node New Development Process,Unicode<2>,What About Python 1 6?,What’s New in Python 2 0
@anchor{whatsnew/2 0 new-development-process}@anchor{1739}
@subsection New Development Process


The most important change in Python 2.0 may not be to the code at all, but to
how Python is developed: in May 2000 the Python developers began using the tools
made available by SourceForge for storing  source code, tracking bug reports,
and managing the queue of patch submissions.  To report bugs or submit patches
for Python 2.0, use the bug tracking and patch manager tools available from
Python’s project page, located at @indicateurl{https://sourceforge.net/projects/python/}.

The most important of the services now hosted at SourceForge is the Python CVS
tree, the version-controlled repository containing the source code for Python.
Previously, there were roughly 7 or so people who had write access to the CVS
tree, and all patches had to be inspected and checked in by one of the people on
this short list. Obviously, this wasn’t very scalable.  By moving the CVS tree
to SourceForge, it became possible to grant write access to more people; as of
September 2000 there were 27 people able to check in changes, a fourfold
increase.  This makes possible large-scale changes that wouldn’t be attempted if
they’d have to be filtered through the small group of core developers.  For
example, one day Peter Schneider-Kamp took it into his head to drop K&R C
compatibility and convert the C source for Python to ANSI C. After getting
approval on the python-dev mailing list, he launched into a flurry of checkins
that lasted about a week, other developers joined in to help, and the job was
done.  If there were only 5 people with write access, probably that task would
have been viewed as “nice, but not worth the time and effort needed” and it
would never have gotten done.

The shift to using SourceForge’s services has resulted in a remarkable increase
in the speed of development.  Patches now get submitted, commented on, revised
by people other than the original submitter, and bounced back and forth between
people until the patch is deemed worth checking in.  Bugs are tracked in one
central location and can be assigned to a specific person for fixing, and we can
count the number of open bugs to measure progress.  This didn’t come without a
cost: developers now have more e-mail to deal with, more mailing lists to
follow, and special tools had to be written for the new environment. For
example, SourceForge sends default patch and bug notification e-mail messages
that are completely unhelpful, so Ka-Ping Yee wrote an HTML screen-scraper that
sends more useful messages.

The ease of adding code caused a few initial growing pains, such as code was
checked in before it was ready or without getting clear agreement from the
developer group.  The approval process that has emerged is somewhat similar to
that used by the Apache group. Developers can vote +1, +0, -0, or -1 on a patch;
+1 and -1 denote acceptance or rejection, while +0 and -0 mean the developer is
mostly indifferent to the change, though with a slight positive or negative
slant.  The most significant change from the Apache model is that the voting is
essentially advisory, letting Guido van Rossum, who has Benevolent Dictator For
Life status, know what the general opinion is. He can still ignore the result of
a vote, and approve or reject a change even if the community disagrees with him.

Producing an actual patch is the last step in adding a new feature, and is
usually easy compared to the earlier task of coming up with a good design.
Discussions of new features can often explode into lengthy mailing list threads,
making the discussion hard to follow, and no one can read every posting to
python-dev.  Therefore, a relatively formal process has been set up to write
Python Enhancement Proposals (PEPs), modelled on the internet RFC process.  PEPs
are draft documents that describe a proposed new feature, and are continually
revised until the community reaches a consensus, either accepting or rejecting
the proposal.  Quoting from the introduction to 
@geindex Python Enhancement Proposals; PEP 1
PEP 1@footnote{https://peps.python.org/pep-0001/}, “PEP Purpose and
Guidelines”:

@quotation

PEP stands for Python Enhancement Proposal.  A PEP is a design document
providing information to the Python community, or describing a new feature for
Python.  The PEP should provide a concise technical specification of the feature
and a rationale for the feature.

We intend PEPs to be the primary mechanisms for proposing new features, for
collecting community input on an issue, and for documenting the design decisions
that have gone into Python.  The PEP author is responsible for building
consensus within the community and documenting dissenting opinions.
@end quotation

Read the rest of 
@geindex Python Enhancement Proposals; PEP 1
PEP 1@footnote{https://peps.python.org/pep-0001/} for the details of the PEP editorial process, style, and
format.  PEPs are kept in the Python CVS tree on SourceForge, though they’re not
part of the Python 2.0 distribution, and are also available in HTML form from
@indicateurl{https://peps.python.org/}.  As of September 2000, there are 25 PEPs, ranging
from 
@geindex Python Enhancement Proposals; PEP 201
PEP 201@footnote{https://peps.python.org/pep-0201/}, “Lockstep Iteration”, to PEP 225, “Elementwise/Objectwise
Operators”.

@c ======================================================================

@node Unicode<2>,List Comprehensions,New Development Process,What’s New in Python 2 0
@anchor{whatsnew/2 0 unicode}@anchor{173a}
@subsection Unicode


The largest new feature in Python 2.0 is a new fundamental data type: Unicode
strings.  Unicode uses 16-bit numbers to represent characters instead of the
8-bit number used by ASCII, meaning that 65,536 distinct characters can be
supported.

The final interface for Unicode support was arrived at through countless
often-stormy discussions on the python-dev mailing list, and mostly implemented by
Marc-André Lemburg, based on a Unicode string type implementation by Fredrik
Lundh.  A detailed explanation of the interface was written up as 
@geindex Python Enhancement Proposals; PEP 100
PEP 100@footnote{https://peps.python.org/pep-0100/},
“Python Unicode Integration”. This article will simply cover the most
significant points about the Unicode interfaces.

In Python source code, Unicode strings are written as @code{u"string"}.  Arbitrary
Unicode characters can be written using a new escape sequence, @code{\u@var{HHHH}}, where
`HHHH' is a 4-digit hexadecimal number from 0000 to FFFF.  The existing
@code{\x@var{HH}} escape sequence can also be used, and octal escapes can be used for
characters up to U+01FF, which is represented by @code{\777}.

Unicode strings, just like regular strings, are an immutable sequence type.
They can be indexed and sliced, but not modified in place. Unicode strings have
an @code{encode( [encoding] )} method that returns an 8-bit string in the desired
encoding.  Encodings are named by strings, such as @code{'ascii'}, @code{'utf-8'},
@code{'iso-8859-1'}, or whatever.  A codec API is defined for implementing and
registering new encodings that are then available throughout a Python program.
If an encoding isn’t specified, the default encoding is usually 7-bit ASCII,
though it can be changed for your Python installation by calling the
@code{sys.setdefaultencoding(encoding)} function in a customized version of
@code{site.py}.

Combining 8-bit and Unicode strings always coerces to Unicode, using the default
ASCII encoding; the result of @code{'a' + u'bc'} is @code{u'abc'}.

New built-in functions have been added, and existing built-ins modified to
support Unicode:


@itemize *

@item 
@code{unichr(ch)} returns a Unicode string 1 character long, containing the
character `ch'.

@item 
@code{ord(u)}, where `u' is a 1-character regular or Unicode string, returns the
number of the character as an integer.

@item 
@code{unicode(string [, encoding]  [, errors] )} creates a Unicode string
from an 8-bit string.  @code{encoding} is a string naming the encoding to use. The
@code{errors} parameter specifies the treatment of characters that are invalid for
the current encoding; passing @code{'strict'} as the value causes an exception to
be raised on any encoding error, while @code{'ignore'} causes errors to be silently
ignored and @code{'replace'} uses U+FFFD, the official replacement character, in
case of any problems.

@item 
The @code{exec} statement, and various built-ins such as @code{eval()},
@code{getattr()}, and @code{setattr()} will also accept Unicode strings as well as
regular strings.  (It’s possible that the process of fixing this missed some
built-ins; if you find a built-in function that accepts strings but doesn’t
accept Unicode strings at all, please report it as a bug.)
@end itemize

A new module, @ref{10c,,unicodedata}, provides an interface to Unicode character
properties.  For example, @code{unicodedata.category(u'A')} returns the 2-character
string ‘Lu’, the ‘L’ denoting it’s a letter, and ‘u’ meaning that it’s
uppercase. @code{unicodedata.bidirectional(u'\u0660')} returns ‘AN’, meaning that
U+0660 is an Arabic number.

The @ref{1c,,codecs} module contains functions to look up existing encodings and
register new ones.  Unless you want to implement a new encoding, you’ll most
often use the @code{codecs.lookup(encoding)} function, which returns a
4-element tuple: @code{(encode_func, decode_func, stream_reader, stream_writer)}.


@itemize *

@item 
`encode_func' is a function that takes a Unicode string, and returns a 2-tuple
@code{(string, length)}.  `string' is an 8-bit string containing a portion (perhaps
all) of the Unicode string converted into the given encoding, and `length' tells
you how much of the Unicode string was converted.

@item 
`decode_func' is the opposite of `encode_func', taking an 8-bit string and
returning a 2-tuple @code{(ustring, length)}, consisting of the resulting Unicode
string `ustring' and the integer `length' telling how much of the 8-bit string
was consumed.

@item 
`stream_reader' is a class that supports decoding input from a stream.
`stream_reader(file_obj)' returns an object that supports the @code{read()},
@code{readline()}, and @code{readlines()} methods.  These methods will all
translate from the given encoding and return Unicode strings.

@item 
`stream_writer', similarly, is a class that supports encoding output to a
stream.  `stream_writer(file_obj)' returns an object that supports the
@code{write()} and @code{writelines()} methods.  These methods expect Unicode
strings, translating them to the given encoding on output.
@end itemize

For example, the following code writes a Unicode string into a file,  encoding
it as UTF-8:

@example
import codecs

unistr = u'\u0660\u2000ab ...'

(UTF8_encode, UTF8_decode,
 UTF8_streamreader, UTF8_streamwriter) = codecs.lookup('UTF-8')

output = UTF8_streamwriter( open( '/tmp/output', 'wb') )
output.write( unistr )
output.close()
@end example

The following code would then read UTF-8 input from the file:

@example
input = UTF8_streamreader( open( '/tmp/output', 'rb') )
print repr(input.read())
input.close()
@end example

Unicode-aware regular expressions are available through the @ref{be,,re} module,
which has a new underlying implementation called SRE written by Fredrik Lundh of
Secret Labs AB.

A @code{-U} command line option was added which causes the Python compiler to
interpret all string literals as Unicode string literals. This is intended to be
used in testing and future-proofing your Python code, since some future version
of Python may drop support for 8-bit strings and provide only Unicode strings.

@c ======================================================================

@node List Comprehensions,Augmented Assignment,Unicode<2>,What’s New in Python 2 0
@anchor{whatsnew/2 0 list-comprehensions}@anchor{173b}
@subsection List Comprehensions


Lists are a workhorse data type in Python, and many programs manipulate a list
at some point.  Two common operations on lists are to loop over them, and either
pick out the elements that meet a certain criterion, or apply some function to
each element.  For example, given a list of strings, you might want to pull out
all the strings containing a given substring, or strip off trailing whitespace
from each line.

The existing @ref{1a0,,map()} and @ref{a6a,,filter()} functions can be used for this
purpose, but they require a function as one of their arguments.  This is fine if
there’s an existing built-in function that can be passed directly, but if there
isn’t, you have to create a little function to do the required work, and
Python’s scoping rules make the result ugly if the little function needs
additional information.  Take the first example in the previous paragraph,
finding all the strings in the list containing a given substring.  You could
write the following to do it:

@example
# Given the list L, make a list of all strings
# containing the substring S.
sublist = filter( lambda s, substring=S:
                     string.find(s, substring) != -1,
                  L)
@end example

Because of Python’s scoping rules, a default argument is used so that the
anonymous function created by the @ref{14a9,,lambda} expression knows what
substring is being searched for.  List comprehensions make this cleaner:

@example
sublist = [ s for s in L if string.find(s, S) != -1 ]
@end example

List comprehensions have the form:

@example
[ expression for expr in sequence1
             for expr2 in sequence2 ...
             for exprN in sequenceN
             if condition ]
@end example

The @code{for}…@code{in} clauses contain the sequences to be
iterated over.  The sequences do not have to be the same length, because they
are `not' iterated over in parallel, but from left to right; this is explained
more clearly in the following paragraphs.  The elements of the generated list
will be the successive values of `expression'.  The final @code{if} clause
is optional; if present, `expression' is only evaluated and added to the result
if `condition' is true.

To make the semantics very clear, a list comprehension is equivalent to the
following Python code:

@example
for expr1 in sequence1:
    for expr2 in sequence2:
    ...
        for exprN in sequenceN:
             if (condition):
                  # Append the value of
                  # the expression to the
                  # resulting list.
@end example

This means that when there are multiple @code{for}…@code{in}
clauses, the resulting list will be equal to the product of the lengths of all
the sequences.  If you have two lists of length 3, the output list is 9 elements
long:

@example
seq1 = 'abc'
seq2 = (1,2,3)
>>> [ (x,y) for x in seq1 for y in seq2]
[('a', 1), ('a', 2), ('a', 3), ('b', 1), ('b', 2), ('b', 3), ('c', 1),
('c', 2), ('c', 3)]
@end example

To avoid introducing an ambiguity into Python’s grammar, if `expression' is
creating a tuple, it must be surrounded with parentheses.  The first list
comprehension below is a syntax error, while the second one is correct:

@example
# Syntax error
[ x,y for x in seq1 for y in seq2]
# Correct
[ (x,y) for x in seq1 for y in seq2]
@end example

The idea of list comprehensions originally comes from the functional programming
language Haskell (@indicateurl{https://www.haskell.org}).  Greg Ewing argued most effectively
for adding them to Python and wrote the initial list comprehension patch, which
was then discussed for a seemingly endless time on the python-dev mailing list
and kept up-to-date by Skip Montanaro.

@c ======================================================================

@node Augmented Assignment,String Methods,List Comprehensions,What’s New in Python 2 0
@anchor{whatsnew/2 0 augmented-assignment}@anchor{173c}
@subsection Augmented Assignment


Augmented assignment operators, another long-requested feature, have been added
to Python 2.0.  Augmented assignment operators include @code{+=}, @code{-=}, @code{*=},
and so forth.  For example, the statement @code{a += 2} increments the value of the
variable  @code{a} by 2, equivalent to the slightly lengthier @code{a = a + 2}.

The full list of supported assignment operators is @code{+=}, @code{-=}, @code{*=},
@code{/=}, @code{%=}, @code{**=}, @code{&=}, @code{|=}, @code{^=}, @code{>>=}, and @code{<<=}.  Python
classes can override the augmented assignment operators by defining methods
named @code{__iadd__()}, @code{__isub__()}, etc.  For example, the following
@code{Number} class stores a number and supports using += to create a new
instance with an incremented value.

@c The empty groups below prevent conversion to guillemets.

@example
class Number:
    def __init__(self, value):
        self.value = value
    def __iadd__(self, increment):
        return Number( self.value + increment)

n = Number(5)
n += 3
print n.value
@end example

The @code{__iadd__()} special method is called with the value of the increment,
and should return a new instance with an appropriately modified value; this
return value is bound as the new value of the variable on the left-hand side.

Augmented assignment operators were first introduced in the C programming
language, and most C-derived languages, such as @code{awk}, C++, Java, Perl,
and PHP also support them.  The augmented assignment patch was implemented by
Thomas Wouters.

@c ======================================================================

@node String Methods,Garbage Collection of Cycles,Augmented Assignment,What’s New in Python 2 0
@anchor{whatsnew/2 0 string-methods}@anchor{173d}
@subsection String Methods


Until now string-manipulation functionality was in the @ref{d8,,string} module,
which was usually a front-end for the @code{strop} module written in C.  The
addition of Unicode posed a difficulty for the @code{strop} module, because the
functions would all need to be rewritten in order to accept either 8-bit or
Unicode strings.  For functions such as @code{string.replace()}, which takes 3
string arguments, that means eight possible permutations, and correspondingly
complicated code.

Instead, Python 2.0 pushes the problem onto the string type, making string
manipulation functionality available through methods on both 8-bit strings and
Unicode strings.

@example
>>> 'andrew'.capitalize()
'Andrew'
>>> 'hostname'.replace('os', 'linux')
'hlinuxtname'
>>> 'moshe'.find('sh')
2
@end example

One thing that hasn’t changed, a noteworthy April Fools’ joke notwithstanding,
is that Python strings are immutable. Thus, the string methods return new
strings, and do not modify the string on which they operate.

The old @ref{d8,,string} module is still around for backwards compatibility, but it
mostly acts as a front-end to the new string methods.

Two methods which have no parallel in pre-2.0 versions, although they did exist
in JPython for quite some time, are @code{startswith()} and @code{endswith()}.
@code{s.startswith(t)} is equivalent to @code{s[:len(t)] == t}, while
@code{s.endswith(t)} is equivalent to @code{s[-len(t):] == t}.

One other method which deserves special mention is @code{join()}.  The
@code{join()} method of a string receives one parameter, a sequence of strings,
and is equivalent to the @code{string.join()} function from the old @ref{d8,,string}
module, with the arguments reversed. In other words, @code{s.join(seq)} is
equivalent to the old @code{string.join(seq, s)}.

@c ======================================================================

@node Garbage Collection of Cycles,Other Core Changes,String Methods,What’s New in Python 2 0
@anchor{whatsnew/2 0 garbage-collection-of-cycles}@anchor{173e}
@subsection Garbage Collection of Cycles


The C implementation of Python uses reference counting to implement garbage
collection.  Every Python object maintains a count of the number of references
pointing to itself, and adjusts the count as references are created or
destroyed.  Once the reference count reaches zero, the object is no longer
accessible, since you need to have a reference to an object to access it, and if
the count is zero, no references exist any longer.

Reference counting has some pleasant properties: it’s easy to understand and
implement, and the resulting implementation is portable, fairly fast, and reacts
well with other libraries that implement their own memory handling schemes.  The
major problem with reference counting is that it sometimes doesn’t realise that
objects are no longer accessible, resulting in a memory leak.  This happens when
there are cycles of references.

Consider the simplest possible cycle,  a class instance which has a reference to
itself:

@example
instance = SomeClass()
instance.myself = instance
@end example

After the above two lines of code have been executed, the reference count of
@code{instance} is 2; one reference is from the variable named @code{'instance'}, and
the other is from the @code{myself} attribute of the instance.

If the next line of code is @code{del instance}, what happens?  The reference count
of @code{instance} is decreased by 1, so it has a reference count of 1; the
reference in the @code{myself} attribute still exists.  Yet the instance is no
longer accessible through Python code, and it could be deleted.  Several objects
can participate in a cycle if they have references to each other, causing all of
the objects to be leaked.

Python 2.0 fixes this problem by periodically executing a cycle detection
algorithm which looks for inaccessible cycles and deletes the objects involved.
A new @ref{64,,gc} module provides functions to perform a garbage collection,
obtain debugging statistics, and tuning the collector’s parameters.

Running the cycle detection algorithm takes some time, and therefore will result
in some additional overhead.  It is hoped that after we’ve gotten experience
with the cycle collection from using 2.0, Python 2.1 will be able to minimize
the overhead with careful tuning.  It’s not yet obvious how much performance is
lost, because benchmarking this is tricky and depends crucially on how often the
program creates and destroys objects.  The detection of cycles can be disabled
when Python is compiled, if you can’t afford even a tiny speed penalty or
suspect that the cycle collection is buggy, by specifying the
@code{--without-cycle-gc} switch when running the @code{configure}
script.

Several people tackled this problem and contributed to a solution.  An early
implementation of the cycle detection approach was written by Toby Kelsey.  The
current algorithm was suggested by Eric Tiedemann during a visit to CNRI, and
Guido van Rossum and Neil Schemenauer wrote two different implementations, which
were later integrated by Neil.  Lots of other people offered suggestions along
the way; the March 2000 archives of the python-dev mailing list contain most of
the relevant discussion, especially in the threads titled “Reference cycle
collection for Python” and “Finalization again”.

@c ======================================================================

@node Other Core Changes,Porting to 2 0,Garbage Collection of Cycles,What’s New in Python 2 0
@anchor{whatsnew/2 0 other-core-changes}@anchor{173f}
@subsection Other Core Changes


Various minor changes have been made to Python’s syntax and built-in functions.
None of the changes are very far-reaching, but they’re handy conveniences.

@menu
* Minor Language Changes:: 
* Changes to Built-in Functions:: 

@end menu

@node Minor Language Changes,Changes to Built-in Functions,,Other Core Changes
@anchor{whatsnew/2 0 minor-language-changes}@anchor{1740}
@subsubsection Minor Language Changes


A new syntax makes it more convenient to call a given function with a tuple of
arguments and/or a dictionary of keyword arguments. In Python 1.5 and earlier,
you’d use the @code{apply()} built-in function: @code{apply(f, args, kw)} calls the
function @code{f()} with the argument tuple `args' and the keyword arguments in
the dictionary `kw'.  @code{apply()}  is the same in 2.0, but thanks to a patch
from Greg Ewing, @code{f(*args, **kw)} is a shorter and clearer way to achieve the
same effect.  This syntax is symmetrical with the syntax for defining
functions:

@example
def f(*args, **kw):
    # args is a tuple of positional args,
    # kw is a dictionary of keyword args
    ...
@end example

The @code{print} statement can now have its output directed to a file-like
object by following the @code{print} with  @code{>> file}, similar to the
redirection operator in Unix shells. Previously you’d either have to use the
@code{write()} method of the file-like object, which lacks the convenience and
simplicity of @code{print}, or you could assign a new value to
@code{sys.stdout} and then restore the old value.  For sending output to standard
error, it’s much easier to write this:

@example
print >> sys.stderr, "Warning: action field not supplied"
@end example

Modules can now be renamed on importing them, using the syntax @code{import module
as name} or @code{from module import name as othername}.  The patch was submitted
by Thomas Wouters.

A new format style is available when using the @code{%} operator; ‘%r’ will insert
the @ref{1c3,,repr()} of its argument.  This was also added from symmetry
considerations, this time for symmetry with the existing ‘%s’ format style,
which inserts the @ref{16a,,str()} of its argument.  For example, @code{'%r %s' % ('abc',
'abc')} returns a string containing @code{'abc' abc}.

Previously there was no way to implement a class that overrode Python’s built-in
@ref{349,,in} operator and implemented a custom version.  @code{obj in seq} returns
true if `obj' is present in the sequence `seq'; Python computes this by simply
trying every index of the sequence until either `obj' is found or an
@ref{1741,,IndexError} is encountered.  Moshe Zadka contributed a patch which adds a
@code{__contains__()} magic method for providing a custom implementation for
@code{in}. Additionally, new built-in objects written in C can define what
@code{in} means for them via a new slot in the sequence protocol.

Earlier versions of Python used a recursive algorithm for deleting objects.
Deeply nested data structures could cause the interpreter to fill up the C stack
and crash; Christian Tismer rewrote the deletion logic to fix this problem.  On
a related note, comparing recursive objects recursed infinitely and crashed;
Jeremy Hylton rewrote the code to no longer crash, producing a useful result
instead.  For example, after this code:

@example
a = []
b = []
a.append(a)
b.append(b)
@end example

The comparison @code{a==b} returns true, because the two recursive data structures
are isomorphic. See the thread “trashcan and PR#7” in the April 2000 archives of
the python-dev mailing list for the discussion leading up to this
implementation, and some useful relevant links.    Note that comparisons can now
also raise exceptions. In earlier versions of Python, a comparison operation
such as @code{cmp(a,b)} would always produce an answer, even if a user-defined
@code{__cmp__()} method encountered an error, since the resulting exception would
simply be silently swallowed.

@c Starting URL:

@c https://www.python.org/pipermail/python-dev/2000-April/004834.html

Work has been done on porting Python to 64-bit Windows on the Itanium processor,
mostly by Trent Mick of ActiveState.  (Confusingly, @code{sys.platform} is still
@code{'win32'} on Win64 because it seems that for ease of porting, MS Visual C++
treats code as 32 bit on Itanium.) PythonWin also supports Windows CE; see the
Python CE page at @indicateurl{https://pythonce.sourceforge.net/} for more information.

Another new platform is Darwin/MacOS X; initial support for it is in Python 2.0.
Dynamic loading works, if you specify “configure –with-dyld –with-suffix=.x”.
Consult the README in the Python source distribution for more instructions.

An attempt has been made to alleviate one of Python’s warts, the often-confusing
@ref{450,,NameError} exception when code refers to a local variable before the
variable has been assigned a value.  For example, the following code raises an
exception on the @code{print} statement in both 1.5.2 and 2.0; in 1.5.2 a
@code{NameError} exception is raised, while 2.0 raises a new
@ref{1742,,UnboundLocalError} exception. @code{UnboundLocalError} is a subclass of
@code{NameError}, so any existing code that expects @code{NameError} to be
raised should still work.

@example
def f():
    print "i=",i
    i = i + 1
f()
@end example

Two new exceptions, @ref{766,,TabError} and @ref{9b1,,IndentationError}, have been
introduced.  They’re both subclasses of @ref{18f,,SyntaxError}, and are raised when
Python code is found to be improperly indented.

@node Changes to Built-in Functions,,Minor Language Changes,Other Core Changes
@anchor{whatsnew/2 0 changes-to-built-in-functions}@anchor{1743}
@subsubsection Changes to Built-in Functions


A new built-in, @code{zip(seq1, seq2, ...)}, has been added.  @ref{1a1,,zip()}
returns a list of tuples where each tuple contains the i-th element from each of
the argument sequences.  The difference between @code{zip()} and @code{map(None,
seq1, seq2)} is that @ref{1a0,,map()} pads the sequences with @code{None} if the
sequences aren’t all of the same length, while @code{zip()} truncates the
returned list to the length of the shortest argument sequence.

The @ref{19c,,int()} and @code{long()} functions now accept an optional “base”
parameter when the first argument is a string. @code{int('123', 10)} returns 123,
while @code{int('123', 16)} returns 291.  @code{int(123, 16)} raises a
@ref{199,,TypeError} exception with the message “can’t convert non-string with
explicit base”.

A new variable holding more detailed version information has been added to the
@ref{df,,sys} module.  @code{sys.version_info} is a tuple @code{(major, minor, micro,
level, serial)} For example, in a hypothetical 2.0.1beta1, @code{sys.version_info}
would be @code{(2, 0, 1, 'beta', 1)}. `level' is a string such as @code{"alpha"},
@code{"beta"}, or @code{"final"} for a final release.

Dictionaries have an odd new method, @code{setdefault(key, default)}, which
behaves similarly to the existing @code{get()} method.  However, if the key is
missing, @code{setdefault()} both returns the value of `default' as @code{get()}
would do, and also inserts it into the dictionary as the value for `key'.  Thus,
the following lines of code:

@example
if dict.has_key( key ): return dict[key]
else:
    dict[key] = []
    return dict[key]
@end example

can be reduced to a single @code{return dict.setdefault(key, [])} statement.

The interpreter sets a maximum recursion depth in order to catch runaway
recursion before filling the C stack and causing a core dump or GPF..
Previously this limit was fixed when you compiled Python, but in 2.0 the maximum
recursion depth can be read and modified using @ref{6ec,,sys.getrecursionlimit()} and
@ref{6eb,,sys.setrecursionlimit()}. The default value is 1000, and a rough maximum
value for a given platform can be found by running a new script,
@code{Misc/find_recursionlimit.py}.

@c ======================================================================

@node Porting to 2 0,Extending/Embedding Changes,Other Core Changes,What’s New in Python 2 0
@anchor{whatsnew/2 0 porting-to-2-0}@anchor{1744}
@subsection Porting to 2.0


New Python releases try hard to be compatible with previous releases, and the
record has been pretty good.  However, some changes are considered useful
enough, usually because they fix initial design decisions that turned out to be
actively mistaken, that breaking backward compatibility can’t always be avoided.
This section lists the changes in Python 2.0 that may cause old Python code to
break.

The change which will probably break the most code is tightening up the
arguments accepted by some methods.  Some methods would take multiple arguments
and treat them as a tuple, particularly various list methods such as
@ref{8de,,append()} and @ref{13a4,,insert()}.
In earlier versions of Python, if @code{L} is
a list, @code{L.append( 1,2 )} appends the tuple @code{(1,2)} to the list.  In Python
2.0 this causes a @ref{199,,TypeError} exception to be raised, with the message:
‘append requires exactly 1 argument; 2 given’.  The fix is to simply add an
extra set of parentheses to pass both values as a tuple:  @code{L.append( (1,2) )}.

The earlier versions of these methods were more forgiving because they used an
old function in Python’s C interface to parse their arguments; 2.0 modernizes
them to use @ref{3bf,,PyArg_ParseTuple()}, the current argument parsing function,
which provides more helpful error messages and treats multi-argument calls as
errors.  If you absolutely must use 2.0 but can’t fix your code, you can edit
@code{Objects/listobject.c} and define the preprocessor symbol
@code{NO_STRICT_LIST_APPEND} to preserve the old behaviour; this isn’t recommended.

Some of the functions in the @ref{d1,,socket} module are still forgiving in this
way.  For example, @code{socket.connect( ('hostname', 25) )} is the correct
form, passing a tuple representing an IP address, but @code{socket.connect('hostname', 25)}
also works. @ref{1745,,socket.connect_ex} and @ref{1746,,socket.bind}
are similarly easy-going.  2.0alpha1 tightened these functions up, but because
the documentation actually used the erroneous multiple argument form, many
people wrote code which would break with the stricter checking.  GvR backed out
the changes in the face of public reaction, so for the @code{socket} module, the
documentation was fixed and the multiple argument form is simply marked as
deprecated; it `will' be tightened up again in a future Python version.

The @code{\x} escape in string literals now takes exactly 2 hex digits.  Previously
it would consume all the hex digits following the ‘x’ and take the lowest 8 bits
of the result, so @code{\x123456} was equivalent to @code{\x56}.

The @ref{5f0,,AttributeError} and @ref{450,,NameError} exceptions have a more friendly
error message, whose text will be something like @code{'Spam' instance has no
attribute 'eggs'} or @code{name 'eggs' is not defined}.  Previously the error
message was just the missing attribute name @code{eggs}, and code written to take
advantage of this fact will break in 2.0.

Some work has been done to make integers and long integers a bit more
interchangeable.  In 1.5.2, large-file support was added for Solaris, to allow
reading files larger than 2 GiB; this made the @code{tell()} method of file
objects return a long integer instead of a regular integer.  Some code would
subtract two file offsets and attempt to use the result to multiply a sequence
or slice a string, but this raised a @ref{199,,TypeError}.  In 2.0, long integers
can be used to multiply or slice a sequence, and it’ll behave as you’d
intuitively expect it to; @code{3L * 'abc'} produces ‘abcabcabc’, and
@code{(0,1,2,3)[2L:4L]} produces (2,3). Long integers can also be used in various
contexts where previously only integers were accepted, such as in the
@code{seek()} method of file objects, and in the formats supported by the @code{%}
operator (@code{%d}, @code{%i}, @code{%x}, etc.).  For example, @code{"%d" % 2L**64} will
produce the string @code{18446744073709551616}.

The subtlest long integer change of all is that the @ref{16a,,str()} of a long
integer no longer has a trailing ‘L’ character, though @ref{1c3,,repr()} still
includes it.  The ‘L’ annoyed many people who wanted to print long integers that
looked just like regular integers, since they had to go out of their way to chop
off the character.  This is no longer a problem in 2.0, but code which does
@code{str(longval)[:-1]} and assumes the ‘L’ is there, will now lose the final
digit.

Taking the @ref{1c3,,repr()} of a float now uses a different formatting precision
than @ref{16a,,str()}.  @code{repr()} uses @code{%.17g} format string for C’s
@code{sprintf()}, while @code{str()} uses @code{%.12g} as before.  The effect is that
@code{repr()} may occasionally show more decimal places than  @code{str()}, for
certain numbers.  For example, the number 8.1 can’t be represented exactly in
binary, so @code{repr(8.1)} is @code{'8.0999999999999996'}, while str(8.1) is
@code{'8.1'}.

The @code{-X} command-line option, which turned all standard exceptions into
strings instead of classes, has been removed; the standard exceptions will now
always be classes.  The @code{exceptions} module containing the standard
exceptions was translated from Python to a built-in C module, written by Barry
Warsaw and Fredrik Lundh.

@c Commented out for now -- I don't think anyone will care.
@c The pattern and match objects provided by SRE are C types, not Python
@c class instances as in 1.5.  This means you can no longer inherit from
@c \class{RegexObject} or \class{MatchObject}, but that shouldn't be much
@c of a problem since no one should have been doing that in the first
@c place.

@c ======================================================================

@node Extending/Embedding Changes,Distutils Making Modules Easy to Install,Porting to 2 0,What’s New in Python 2 0
@anchor{whatsnew/2 0 extending-embedding-changes}@anchor{1747}
@subsection Extending/Embedding Changes


Some of the changes are under the covers, and will only be apparent to people
writing C extension modules or embedding a Python interpreter in a larger
application.  If you aren’t dealing with Python’s C API, you can safely skip
this section.

The version number of the Python C API was incremented, so C extensions compiled
for 1.5.2 must be recompiled in order to work with 2.0.  On Windows, it’s not
possible for Python 2.0 to import a third party extension built for Python 1.5.x
due to how Windows DLLs work, so Python will raise an exception and the import
will fail.

Users of Jim Fulton’s ExtensionClass module will be pleased to find out that
hooks have been added so that ExtensionClasses are now supported by
@ref{2af,,isinstance()} and @ref{9ca,,issubclass()}. This means you no longer have to
remember to write code such as @code{if type(obj) == myExtensionClass}, but can use
the more natural @code{if isinstance(obj, myExtensionClass)}.

The @code{Python/importdl.c} file, which was a mass of #ifdefs to support
dynamic loading on many different platforms, was cleaned up and reorganised by
Greg Stein.  @code{importdl.c} is now quite small, and platform-specific code
has been moved into a bunch of @code{Python/dynload_*.c} files.  Another
cleanup: there were also a number of @code{my*.h} files in the Include/
directory that held various portability hacks; they’ve been merged into a single
file, @code{Include/pyport.h}.

Vladimir Marangozov’s long-awaited malloc restructuring was completed, to make
it easy to have the Python interpreter use a custom allocator instead of C’s
standard @code{malloc()}.  For documentation, read the comments in
@code{Include/pymem.h} and @code{Include/objimpl.h}.  For the lengthy
discussions during which the interface was hammered out, see the web archives of
the ‘patches’ and ‘python-dev’ lists at python.org.

Recent versions of the GUSI development environment for MacOS support POSIX
threads.  Therefore, Python’s POSIX threading support now works on the
Macintosh.  Threading support using the user-space GNU @code{pth} library was also
contributed.

Threading support on Windows was enhanced, too.  Windows supports thread locks
that use kernel objects only in case of contention; in the common case when
there’s no contention, they use simpler functions which are an order of
magnitude faster.  A threaded version of Python 1.5.2 on NT is twice as slow as
an unthreaded version; with the 2.0 changes, the difference is only 10%.  These
improvements were contributed by Yakov Markovitch.

Python 2.0’s source now uses only ANSI C prototypes, so compiling Python now
requires an ANSI C compiler, and can no longer be done using a compiler that
only supports K&R C.

Previously the Python virtual machine used 16-bit numbers in its bytecode,
limiting the size of source files.  In particular, this affected the maximum
size of literal lists and dictionaries in Python source; occasionally people who
are generating Python code would run into this limit.  A patch by Charles G.
Waldman raises the limit from @code{2**16} to @code{2**32}.

Three new convenience functions intended for adding constants to a module’s
dictionary at module initialization time were added: @ref{60b,,PyModule_AddObject()},
@ref{1748,,PyModule_AddIntConstant()}, and @ref{1749,,PyModule_AddStringConstant()}.  Each
of these functions takes a module object, a null-terminated C string containing
the name to be added, and a third argument for the value to be assigned to the
name.  This third argument is, respectively, a Python object, a C long, or a C
string.

A wrapper API was added for Unix-style signal handlers. @ref{174a,,PyOS_getsig()} gets
a signal handler and @ref{174b,,PyOS_setsig()} will set a new handler.

@c ======================================================================

@node Distutils Making Modules Easy to Install,XML Modules,Extending/Embedding Changes,What’s New in Python 2 0
@anchor{whatsnew/2 0 distutils-making-modules-easy-to-install}@anchor{174c}
@subsection Distutils: Making Modules Easy to Install


Before Python 2.0, installing modules was a tedious affair – there was no way
to figure out automatically where Python is installed, or what compiler options
to use for extension modules.  Software authors had to go through an arduous
ritual of editing Makefiles and configuration files, which only really work on
Unix and leave Windows and MacOS unsupported.  Python users faced wildly
differing installation instructions which varied between different extension
packages, which made administering a Python installation something of  a chore.

The SIG for distribution utilities, shepherded by Greg Ward, has created the
Distutils, a system to make package installation much easier.  They form the
@code{distutils} package, a new part of Python’s standard library. In the best
case, installing a Python module from source will require the same steps: first
you simply mean unpack the tarball or zip archive, and the run “@code{python
setup.py install}”.  The platform will be automatically detected, the compiler
will be recognized, C extension modules will be compiled, and the distribution
installed into the proper directory.  Optional command-line arguments provide
more control over the installation process, the distutils package offers many
places to override defaults – separating the build from the install, building
or installing in non-default directories, and more.

In order to use the Distutils, you need to write a @code{setup.py} script.  For
the simple case, when the software contains only .py files, a minimal
@code{setup.py} can be just a few lines long:

@example
from distutils.core import setup
setup (name = "foo", version = "1.0",
       py_modules = ["module1", "module2"])
@end example

The @code{setup.py} file isn’t much more complicated if the software consists
of a few packages:

@example
from distutils.core import setup
setup (name = "foo", version = "1.0",
       packages = ["package", "package.subpackage"])
@end example

A C extension can be the most complicated case; here’s an example taken from
the PyXML package:

@example
from distutils.core import setup, Extension

expat_extension = Extension('xml.parsers.pyexpat',
     define_macros = [('XML_NS', None)],
     include_dirs = [ 'extensions/expat/xmltok',
                      'extensions/expat/xmlparse' ],
     sources = [ 'extensions/pyexpat.c',
                 'extensions/expat/xmltok/xmltok.c',
                 'extensions/expat/xmltok/xmlrole.c', ]
       )
setup (name = "PyXML", version = "0.5.4",
       ext_modules =[ expat_extension ] )
@end example

The Distutils can also take care of creating source and binary distributions.
The “sdist” command, run by “@code{python setup.py sdist}’, builds a source
distribution such as @code{foo-1.0.tar.gz}. Adding new commands isn’t
difficult, “bdist_rpm” and “bdist_wininst” commands have already been
contributed to create an RPM distribution and a Windows installer for the
software, respectively.  Commands to create other distribution formats such as
Debian packages and Solaris @code{.pkg} files are in various stages of
development.

All this is documented in a new manual, `Distributing Python Modules', that
joins the basic set of Python documentation.

@c ======================================================================

@node XML Modules,Module changes,Distutils Making Modules Easy to Install,What’s New in Python 2 0
@anchor{whatsnew/2 0 xml-modules}@anchor{174d}
@subsection XML Modules


Python 1.5.2 included a simple XML parser in the form of the @code{xmllib}
module, contributed by Sjoerd Mullender.  Since 1.5.2’s release, two different
interfaces for processing XML have become common: SAX2 (version 2 of the Simple
API for XML) provides an event-driven interface with some similarities to
@code{xmllib}, and the DOM (Document Object Model) provides a tree-based
interface, transforming an XML document into a tree of nodes that can be
traversed and modified.  Python 2.0 includes a SAX2 interface and a stripped-down
DOM interface as part of the @ref{127,,xml} package. Here we will give a brief
overview of these new interfaces; consult the Python documentation or the source
code for complete details. The Python XML SIG is also working on improved
documentation.

@menu
* SAX2 Support:: 
* DOM Support:: 
* Relationship to PyXML:: 

@end menu

@node SAX2 Support,DOM Support,,XML Modules
@anchor{whatsnew/2 0 sax2-support}@anchor{174e}
@subsubsection SAX2 Support


SAX defines an event-driven interface for parsing XML.  To use SAX, you must
write a SAX handler class.  Handler classes inherit from various classes
provided by SAX, and override various methods that will then be called by the
XML parser.  For example, the @ref{174f,,startElement()} and @ref{1750,,endElement()}
methods are called for every starting and end tag encountered by the parser, the
@ref{1751,,characters()} method is called for every chunk of character data, and so
forth.

The advantage of the event-driven approach is that the whole document doesn’t
have to be resident in memory at any one time, which matters if you are
processing really huge documents.  However, writing the SAX handler class can
get very complicated if you’re trying to modify the document structure in some
elaborate way.

For example, this little example program defines a handler that prints a message
for every starting and ending tag, and then parses the file @code{hamlet.xml}
using it:

@example
from xml import sax

class SimpleHandler(sax.ContentHandler):
    def startElement(self, name, attrs):
        print 'Start of element:', name, attrs.keys()

    def endElement(self, name):
        print 'End of element:', name

# Create a parser object
parser = sax.make_parser()

# Tell it what handler to use
handler = SimpleHandler()
parser.setContentHandler( handler )

# Parse a file!
parser.parse( 'hamlet.xml' )
@end example

For more information, consult the Python documentation, or the XML HOWTO at
@indicateurl{https://pyxml.sourceforge.net/topics/howto/xml-howto.html}.

@node DOM Support,Relationship to PyXML,SAX2 Support,XML Modules
@anchor{whatsnew/2 0 dom-support}@anchor{1752}
@subsubsection DOM Support


The Document Object Model is a tree-based representation for an XML document.  A
top-level @code{Document} instance is the root of the tree, and has a single
child which is the top-level @code{Element} instance. This @code{Element}
has children nodes representing character data and any sub-elements, which may
have further children of their own, and so forth.  Using the DOM you can
traverse the resulting tree any way you like, access element and attribute
values, insert and delete nodes, and convert the tree back into XML.

The DOM is useful for modifying XML documents, because you can create a DOM
tree, modify it by adding new nodes or rearranging subtrees, and then produce a
new XML document as output.  You can also construct a DOM tree manually and
convert it to XML, which can be a more flexible way of producing XML output than
simply writing @code{<tag1>}…@code{</tag1>} to a file.

The DOM implementation included with Python lives in the @ref{129,,xml.dom.minidom}
module.  It’s a lightweight implementation of the Level 1 DOM with support for
XML namespaces.  The  @code{parse()} and @code{parseString()} convenience
functions are provided for generating a DOM tree:

@example
from xml.dom import minidom
doc = minidom.parse('hamlet.xml')
@end example

@code{doc} is a @code{Document} instance.  @code{Document}, like all the other
DOM classes such as @code{Element} and @code{Text}, is a subclass of the
@code{Node} base class.  All the nodes in a DOM tree therefore support certain
common methods, such as @code{toxml()} which returns a string containing the XML
representation of the node and its children.  Each class also has special
methods of its own; for example, @code{Element} and @code{Document}
instances have a method to find all child elements with a given tag name.
Continuing from the previous 2-line example:

@example
perslist = doc.getElementsByTagName( 'PERSONA' )
print perslist[0].toxml()
print perslist[1].toxml()
@end example

For the `Hamlet' XML file, the above few lines output:

@example
<PERSONA>CLAUDIUS, king of Denmark. </PERSONA>
<PERSONA>HAMLET, son to the late, and nephew to the present king.</PERSONA>
@end example

The root element of the document is available as @code{doc.documentElement}, and
its children can be easily modified by deleting, adding, or removing nodes:

@example
root = doc.documentElement

# Remove the first child
root.removeChild( root.childNodes[0] )

# Move the new first child to the end
root.appendChild( root.childNodes[0] )

# Insert the new first child (originally,
# the third child) before the 20th child.
root.insertBefore( root.childNodes[0], root.childNodes[20] )
@end example

Again, I will refer you to the Python documentation for a complete listing of
the different @code{Node} classes and their various methods.

@node Relationship to PyXML,,DOM Support,XML Modules
@anchor{whatsnew/2 0 relationship-to-pyxml}@anchor{1753}
@subsubsection Relationship to PyXML


The XML Special Interest Group has been working on XML-related Python code for a
while.  Its code distribution, called PyXML, is available from the SIG’s web
pages at @indicateurl{https://www.python.org/community/sigs/current/xml-sig}. The PyXML distribution also used
the package name @code{xml}.  If you’ve written programs that used PyXML, you’re
probably wondering about its compatibility with the 2.0 @ref{127,,xml} package.

The answer is that Python 2.0’s @ref{127,,xml} package isn’t compatible with PyXML,
but can be made compatible by installing a recent version PyXML.  Many
applications can get by with the XML support that is included with Python 2.0,
but more complicated applications will require that the full PyXML package will
be installed.  When installed, PyXML versions 0.6.0 or greater will replace the
@code{xml} package shipped with Python, and will be a strict superset of the
standard package, adding a bunch of additional features.  Some of the additional
features in PyXML include:


@itemize *

@item 
4DOM, a full DOM implementation from FourThought, Inc.

@item 
The xmlproc validating parser, written by Lars Marius Garshol.

@item 
The @code{sgmlop} parser accelerator module, written by Fredrik Lundh.
@end itemize

@c ======================================================================

@node Module changes,New modules<2>,XML Modules,What’s New in Python 2 0
@anchor{whatsnew/2 0 module-changes}@anchor{1754}
@subsection Module changes


Lots of improvements and bugfixes were made to Python’s extensive standard
library; some of the affected modules include @ref{bf,,readline},
@ref{26,,ConfigParser}, @code{cgi}, @ref{15,,calendar}, @ref{b2,,posix}, @code{readline},
@code{xmllib}, @code{aifc}, @code{chunk}, @ref{11a,,wave}, @ref{bd,,random}, @ref{c8,,shelve},
and @code{nntplib}.  Consult the CVS logs for the exact patch-by-patch details.

Brian Gallew contributed OpenSSL support for the @ref{d1,,socket} module.  OpenSSL
is an implementation of the Secure Socket Layer, which encrypts the data being
sent over a socket.  When compiling Python, you can edit @code{Modules/Setup}
to include SSL support, which adds an additional function to the @code{socket}
module: @code{socket.ssl(socket, keyfile, certfile)}, which takes a socket
object and returns an SSL socket.  The @ref{72,,httplib} and @ref{10f,,urllib} modules
were also changed to support @code{https://} URLs, though no one has implemented
FTP or SMTP over SSL.

The @ref{72,,httplib} module has been rewritten by Greg Stein to support HTTP/1.1.

Backward compatibility with the 1.5 version of @code{httplib} is provided,
though using HTTP/1.1 features such as pipelining will require rewriting code to
use a different set of interfaces.

The @code{Tkinter} module now supports Tcl/Tk version 8.1, 8.2, or 8.3, and
support for the older 7.x versions has been dropped.  The Tkinter module now
supports displaying Unicode strings in Tk widgets. Also, Fredrik Lundh
contributed an optimization which makes operations like @code{create_line} and
@code{create_polygon} much faster, especially when using lots of coordinates.

The @ref{2f,,curses} module has been greatly extended, starting from Oliver
Andrich’s enhanced version, to provide many additional functions from ncurses
and SYSV curses, such as colour, alternative character set support, pads, and
mouse support.  This means the module is no longer compatible with operating
systems that only have BSD curses, but there don’t seem to be any currently
maintained OSes that fall into this category.

As mentioned in the earlier discussion of 2.0’s Unicode support, the underlying
implementation of the regular expressions provided by the @ref{be,,re} module has
been changed.  SRE, a new regular expression engine written by Fredrik Lundh and
partially funded by Hewlett Packard, supports matching against both 8-bit
strings and Unicode strings.

@c ======================================================================

@node New modules<2>,IDLE Improvements,Module changes,What’s New in Python 2 0
@anchor{whatsnew/2 0 new-modules}@anchor{1755}
@subsection New modules


A number of new modules were added.  We’ll simply list them with brief
descriptions; consult the 2.0 documentation for the details of a particular
module.


@itemize *

@item 
@ref{d,,atexit}:  For registering functions to be called before the Python
interpreter exits. Code that currently sets @code{sys.exitfunc} directly should be
changed to  use the @code{atexit} module instead, importing @code{atexit} and
calling @ref{a84,,atexit.register()} with  the function to be called on exit.
(Contributed by Skip Montanaro.)

@item 
@ref{1c,,codecs}, @code{encodings}, @ref{10c,,unicodedata}:  Added as part of the new
Unicode support.

@item 
@ref{5e,,filecmp}: Supersedes the old @code{cmp}, @code{cmpcache} and
@code{dircmp} modules, which have now become deprecated. (Contributed by Gordon
MacMillan and Moshe Zadka.)

@item 
@ref{67,,gettext}: This module provides internationalization (I18N) and
localization (L10N) support for Python programs by providing an interface to the
GNU gettext message catalog library. (Integrated by Barry Warsaw, from separate
contributions by Martin  von Löwis, Peter Funk, and James Henstridge.)

@item 
@code{linuxaudiodev}: Support for the @code{/dev/audio} device on Linux, a
twin to the existing @code{sunaudiodev} module. (Contributed by Peter Bosch,
with fixes by Jeremy Hylton.)

@item 
@ref{94,,mmap}: An interface to memory-mapped files on both Windows and Unix.  A
file’s contents can be mapped directly into memory, at which point it behaves
like a mutable string, so its contents can be read and modified.  They can even
be passed to functions that expect ordinary strings, such as the @ref{be,,re}
module. (Contributed by Sam Rushing, with some extensions by A.M. Kuchling.)

@item 
@code{pyexpat}: An interface to the Expat XML parser. (Contributed by Paul
Prescod.)

@item 
@ref{114,,robotparser}: Parse a @code{robots.txt} file, which is used for writing
web spiders that politely avoid certain areas of a web site.  The parser accepts
the contents of a @code{robots.txt} file, builds a set of rules from it, and
can then answer questions about the fetchability of a given URL.  (Contributed
by Skip Montanaro.)

@item 
@ref{e3,,tabnanny}: A module/script to  check Python source code for ambiguous
indentation. (Contributed by Tim Peters.)

@item 
@code{UserString}: A base class useful for deriving objects that behave like
strings.

@item 
@ref{11c,,webbrowser}: A module that provides a platform independent way to launch
a web browser on a specific URL. For each platform, various browsers are tried
in a specific order. The user can alter which browser is launched by setting the
`BROWSER' environment variable.  (Originally inspired by Eric S. Raymond’s patch
to @ref{10f,,urllib} which added similar functionality, but the final module comes
from code originally  implemented by Fred Drake as
@code{Tools/idle/BrowserControl.py}, and adapted for the standard library by
Fred.)

@item 
@ref{11d,,_winreg}: An interface to the Windows registry.  @code{_winreg} is an
adaptation of functions that have been part of PythonWin since 1995, but has now
been added to the core  distribution, and enhanced to support Unicode.
@code{_winreg} was written by Bill Tutt and Mark Hammond.

@item 
@ref{138,,zipfile}: A module for reading and writing ZIP-format archives.  These
are archives produced by @code{PKZIP} on DOS/Windows or @code{zip} on
Unix, not to be confused with @code{gzip}-format files (which are
supported by the @ref{6b,,gzip} module) (Contributed by James C. Ahlstrom.)

@item 
@code{imputil}: A module that provides a simpler way for writing customized
import hooks, in comparison to the existing @code{ihooks} module.  (Implemented
by Greg Stein, with much discussion on python-dev along the way.)
@end itemize

@c ======================================================================

@node IDLE Improvements,Deleted and Deprecated Modules,New modules<2>,What’s New in Python 2 0
@anchor{whatsnew/2 0 idle-improvements}@anchor{1756}
@subsection IDLE Improvements


IDLE is the official Python cross-platform IDE, written using Tkinter. Python
2.0 includes IDLE 0.6, which adds a number of new features and improvements.  A
partial list:


@itemize *

@item 
UI improvements and optimizations, especially in the area of syntax
highlighting and auto-indentation.

@item 
The class browser now shows more information, such as the top level functions
in a module.

@item 
Tab width is now a user settable option. When opening an existing Python file,
IDLE automatically detects the indentation conventions, and adapts.

@item 
There is now support for calling browsers on various platforms, used to open
the Python documentation in a browser.

@item 
IDLE now has a command line, which is largely similar to  the vanilla Python
interpreter.

@item 
Call tips were added in many places.

@item 
IDLE can now be installed as a package.

@item 
In the editor window, there is now a line/column bar at the bottom.

@item 
Three new keystroke commands: Check module (@code{Alt}-@code{F5}), Import module (@code{F5}) and
Run script (@code{Ctrl}-@code{F5}).
@end itemize

@c ======================================================================

@node Deleted and Deprecated Modules,Acknowledgements<8>,IDLE Improvements,What’s New in Python 2 0
@anchor{whatsnew/2 0 deleted-and-deprecated-modules}@anchor{1757}
@subsection Deleted and Deprecated Modules


A few modules have been dropped because they’re obsolete, or because there are
now better ways to do the same thing.  The @code{stdwin} module is gone; it was
for a platform-independent windowing toolkit that’s no longer developed.

A number of modules have been moved to the @code{lib-old} subdirectory:
@code{cmp}, @code{cmpcache}, @code{dircmp}, @code{dump},  @code{find},
@code{grep}, @code{packmail},  @code{poly}, @code{util}, @code{whatsound},
@code{zmod}.  If you have code which relies on a module  that’s been moved to
@code{lib-old}, you can simply add that directory to @code{sys.path}   to get them
back, but you’re encouraged to update any code that uses these modules.

@node Acknowledgements<8>,,Deleted and Deprecated Modules,What’s New in Python 2 0
@anchor{whatsnew/2 0 acknowledgements}@anchor{1758}
@subsection Acknowledgements


The authors would like to thank the following people for offering suggestions on
various drafts of this article: David Bolen, Mark Hammond, Gregg Hauser, Jeremy
Hylton, Fredrik Lundh, Detlef Lannert, Aahz Maruch, Skip Montanaro, Vladimir
Marangozov, Tobias Polzin, Guido van Rossum, Neil Schemenauer, and Russ Schmidt.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

The “Changelog” is an HTML version of the file built@footnote{https://pypi.org/project/blurb/}
from the contents of the
Misc/NEWS.d@footnote{https://github.com/python/cpython/tree/3.14/Misc/NEWS.d} directory tree, which contains `all' nontrivial changes
to Python for the current version.

@node Changelog,,What’s New in Python 2 0,What’s New in Python
@anchor{whatsnew/changelog doc}@anchor{1759}@anchor{whatsnew/changelog changelog}@anchor{143}@anchor{whatsnew/changelog id1}@anchor{175a}@anchor{whatsnew/changelog translation-repo}@anchor{175b}
@section Changelog


@menu
* Python next:: 
* Python 3.14.6 final: Python 3 14 6 final. 
* Python 3.14.5 final: Python 3 14 5 final. 
* Python 3.14.5 release candidate 1: Python 3 14 5 release candidate 1. 
* Python 3.14.4 final: Python 3 14 4 final. 
* Python 3.14.3 final: Python 3 14 3 final. 
* Python 3.14.2 final: Python 3 14 2 final. 
* Python 3.14.1 final: Python 3 14 1 final. 
* Python 3.14.0 final: Python 3 14 0 final. 
* Python 3.14.0 release candidate 3: Python 3 14 0 release candidate 3. 
* Python 3.14.0 release candidate 2: Python 3 14 0 release candidate 2. 
* Python 3.14.0 release candidate 1: Python 3 14 0 release candidate 1. 
* Python 3.14.0 beta 4: Python 3 14 0 beta 4. 
* Python 3.14.0 beta 3: Python 3 14 0 beta 3. 
* Python 3.14.0 beta 2: Python 3 14 0 beta 2. 
* Python 3.14.0 beta 1: Python 3 14 0 beta 1. 
* Python 3.14.0 alpha 7: Python 3 14 0 alpha 7. 
* Python 3.14.0 alpha 6: Python 3 14 0 alpha 6. 
* Python 3.14.0 alpha 5: Python 3 14 0 alpha 5. 
* Python 3.14.0 alpha 4: Python 3 14 0 alpha 4. 
* Python 3.14.0 alpha 3: Python 3 14 0 alpha 3. 
* Python 3.14.0 alpha 2: Python 3 14 0 alpha 2. 
* Python 3.14.0 alpha 1: Python 3 14 0 alpha 1. 
* Python 3.13.0 beta 1: Python 3 13 0 beta 1. 
* Python 3.13.0 alpha 6: Python 3 13 0 alpha 6. 
* Python 3.13.0 alpha 5: Python 3 13 0 alpha 5. 
* Python 3.13.0 alpha 4: Python 3 13 0 alpha 4. 
* Python 3.13.0 alpha 3: Python 3 13 0 alpha 3. 
* Python 3.13.0 alpha 2: Python 3 13 0 alpha 2. 
* Python 3.13.0 alpha 1: Python 3 13 0 alpha 1. 
* Python 3.12.0 beta 1: Python 3 12 0 beta 1. 
* Python 3.12.0 alpha 7: Python 3 12 0 alpha 7. 
* Python 3.12.0 alpha 6: Python 3 12 0 alpha 6. 
* Python 3.12.0 alpha 5: Python 3 12 0 alpha 5. 
* Python 3.12.0 alpha 4: Python 3 12 0 alpha 4. 
* Python 3.12.0 alpha 3: Python 3 12 0 alpha 3. 
* Python 3.12.0 alpha 2: Python 3 12 0 alpha 2. 
* Python 3.12.0 alpha 1: Python 3 12 0 alpha 1. 
* Python 3.11.0 beta 1: Python 3 11 0 beta 1. 
* Python 3.11.0 alpha 7: Python 3 11 0 alpha 7. 
* Python 3.11.0 alpha 6: Python 3 11 0 alpha 6. 
* Python 3.11.0 alpha 5: Python 3 11 0 alpha 5. 
* Python 3.11.0 alpha 4: Python 3 11 0 alpha 4. 
* Python 3.11.0 alpha 3: Python 3 11 0 alpha 3. 
* Python 3.11.0 alpha 2: Python 3 11 0 alpha 2. 
* Python 3.11.0 alpha 1: Python 3 11 0 alpha 1. 
* Python 3.10.0 beta 1: Python 3 10 0 beta 1. 
* Python 3.10.0 alpha 7: Python 3 10 0 alpha 7. 
* Python 3.10.0 alpha 6: Python 3 10 0 alpha 6. 
* Python 3.10.0 alpha 5: Python 3 10 0 alpha 5. 
* Python 3.10.0 alpha 4: Python 3 10 0 alpha 4. 
* Python 3.10.0 alpha 3: Python 3 10 0 alpha 3. 
* Python 3.10.0 alpha 2: Python 3 10 0 alpha 2. 
* Python 3.10.0 alpha 1: Python 3 10 0 alpha 1. 
* Python 3.9.0 beta 1: Python 3 9 0 beta 1. 
* Python 3.9.0 alpha 6: Python 3 9 0 alpha 6. 
* Python 3.9.0 alpha 5: Python 3 9 0 alpha 5. 
* Python 3.9.0 alpha 4: Python 3 9 0 alpha 4. 
* Python 3.9.0 alpha 3: Python 3 9 0 alpha 3. 
* Python 3.9.0 alpha 2: Python 3 9 0 alpha 2. 
* Python 3.9.0 alpha 1: Python 3 9 0 alpha 1. 
* Python 3.8.0 beta 1: Python 3 8 0 beta 1. 
* Python 3.8.0 alpha 4: Python 3 8 0 alpha 4. 
* Python 3.8.0 alpha 3: Python 3 8 0 alpha 3. 
* Python 3.8.0 alpha 2: Python 3 8 0 alpha 2. 
* Python 3.8.0 alpha 1: Python 3 8 0 alpha 1. 
* Python 3.7.0 final: Python 3 7 0 final. 
* Python 3.7.0 release candidate 1: Python 3 7 0 release candidate 1. 
* Python 3.7.0 beta 5: Python 3 7 0 beta 5. 
* Python 3.7.0 beta 4: Python 3 7 0 beta 4. 
* Python 3.7.0 beta 3: Python 3 7 0 beta 3. 
* Python 3.7.0 beta 2: Python 3 7 0 beta 2. 
* Python 3.7.0 beta 1: Python 3 7 0 beta 1. 
* Python 3.7.0 alpha 4: Python 3 7 0 alpha 4. 
* Python 3.7.0 alpha 3: Python 3 7 0 alpha 3. 
* Python 3.7.0 alpha 2: Python 3 7 0 alpha 2. 
* Python 3.7.0 alpha 1: Python 3 7 0 alpha 1. 
* Python 3.6.6 final: Python 3 6 6 final. 
* Python 3.6.6 release candidate 1: Python 3 6 6 release candidate 1. 
* Python 3.6.5 final: Python 3 6 5 final. 
* Python 3.6.5 release candidate 1: Python 3 6 5 release candidate 1. 
* Python 3.6.4 final: Python 3 6 4 final. 
* Python 3.6.4 release candidate 1: Python 3 6 4 release candidate 1. 
* Python 3.6.3 final: Python 3 6 3 final. 
* Python 3.6.3 release candidate 1: Python 3 6 3 release candidate 1. 
* Python 3.6.2 final: Python 3 6 2 final. 
* Python 3.6.2 release candidate 2: Python 3 6 2 release candidate 2. 
* Python 3.6.2 release candidate 1: Python 3 6 2 release candidate 1. 
* Python 3.6.1 final: Python 3 6 1 final. 
* Python 3.6.1 release candidate 1: Python 3 6 1 release candidate 1. 
* Python 3.6.0 final: Python 3 6 0 final. 
* Python 3.6.0 release candidate 2: Python 3 6 0 release candidate 2. 
* Python 3.6.0 release candidate 1: Python 3 6 0 release candidate 1. 
* Python 3.6.0 beta 4: Python 3 6 0 beta 4. 
* Python 3.6.0 beta 3: Python 3 6 0 beta 3. 
* Python 3.6.0 beta 2: Python 3 6 0 beta 2. 
* Python 3.6.0 beta 1: Python 3 6 0 beta 1. 
* Python 3.6.0 alpha 4: Python 3 6 0 alpha 4. 
* Python 3.6.0 alpha 3: Python 3 6 0 alpha 3. 
* Python 3.6.0 alpha 2: Python 3 6 0 alpha 2. 
* Python 3.6.0 alpha 1: Python 3 6 0 alpha 1. 
* Python 3.5.5 final: Python 3 5 5 final. 
* Python 3.5.5 release candidate 1: Python 3 5 5 release candidate 1. 
* Python 3.5.4 final: Python 3 5 4 final. 
* Python 3.5.4 release candidate 1: Python 3 5 4 release candidate 1. 
* Python 3.5.3 final: Python 3 5 3 final. 
* Python 3.5.3 release candidate 1: Python 3 5 3 release candidate 1. 
* Python 3.5.2 final: Python 3 5 2 final. 
* Python 3.5.2 release candidate 1: Python 3 5 2 release candidate 1. 
* Python 3.5.1 final: Python 3 5 1 final. 
* Python 3.5.1 release candidate 1: Python 3 5 1 release candidate 1. 
* Python 3.5.0 final: Python 3 5 0 final. 
* Python 3.5.0 release candidate 4: Python 3 5 0 release candidate 4. 
* Python 3.5.0 release candidate 3: Python 3 5 0 release candidate 3. 
* Python 3.5.0 release candidate 2: Python 3 5 0 release candidate 2. 
* Python 3.5.0 release candidate 1: Python 3 5 0 release candidate 1. 
* Python 3.5.0 beta 4: Python 3 5 0 beta 4. 
* Python 3.5.0 beta 3: Python 3 5 0 beta 3. 
* Python 3.5.0 beta 2: Python 3 5 0 beta 2. 
* Python 3.5.0 beta 1: Python 3 5 0 beta 1. 
* Python 3.5.0 alpha 4: Python 3 5 0 alpha 4. 
* Python 3.5.0 alpha 3: Python 3 5 0 alpha 3. 
* Python 3.5.0 alpha 2: Python 3 5 0 alpha 2. 
* Python 3.5.0 alpha 1: Python 3 5 0 alpha 1. 

@end menu

@node Python next,Python 3 14 6 final,,Changelog
@anchor{whatsnew/changelog python-next}@anchor{175c}
@subsection Python next


`Release date: XXXX-XX-XX'

@menu
* Tests:: 
* Library:: 
* Documentation: Documentation<2>. 
* Core and Builtins:: 
* C API:: 
* Build:: 

@end menu

@node Tests,Library,,Python next
@anchor{whatsnew/changelog tests}@anchor{175d}
@subsubsection Tests



@itemize -

@item 
gh-148853@footnote{https://github.com/python/cpython/issues/148853}: Fix tests failing on FreeBSD in test.support’s
in_systemd_nspawn_sync_suppressed()  due to unreadable /run directory.
@end itemize

@node Library,Documentation<2>,Tests,Python next
@anchor{whatsnew/changelog library}@anchor{175e}
@subsubsection Library



@itemize -

@item 
gh-151695@footnote{https://github.com/python/cpython/issues/151695}: Fix a use-after-free in the @ref{2f,,curses} module.  The encoding
of the initial screen, used by @ref{175f,,curses.unctrl()} and
@ref{1760,,curses.ungetch()} to encode non-ASCII characters, is now kept as a
private copy instead of a borrowed pointer to a window object that may be
deallocated.

@item 
gh-151403@footnote{https://github.com/python/cpython/issues/151403}: Fixed a crash in @ref{4b8,,subprocess.Popen} (and
@code{_posixsubprocess.fork_exec}) when an @code{argv} item’s
@ref{e52,,__fspath__()} concurrently mutates the @code{args} sequence
being converted.

@item 
gh-151390@footnote{https://github.com/python/cpython/issues/151390}: Colorize @code{match} in the @ref{492,,REPL} when followed by a unary
@code{+} or @code{-} operator. Patch by Bartosz Sławecki.

@item 
gh-151126@footnote{https://github.com/python/cpython/issues/151126}: Fix crash on unset @ref{1761,,MemoryError} on allocation failure in
@ref{1762,,ctypes.get_errno()}.

@item 
gh-151337@footnote{https://github.com/python/cpython/issues/151337}: Avoid possible memory leak in @code{tkinter.c} on Windows.

@item 
gh-151126@footnote{https://github.com/python/cpython/issues/151126}: Fix a crash when @ref{1761,,MemoryError} in
@code{os._path_splitroot()} was not set properly.

@item 
gh-151126@footnote{https://github.com/python/cpython/issues/151126}: Fix a crash, when there’s no memory left on a device, which
happened in @code{_interpchannels} module.

Now it raises proper @ref{1761,,MemoryError} errors.

@item 
gh-151295@footnote{https://github.com/python/cpython/issues/151295}: Fixed a crash (use-after-free) in @ref{1763,,bytes.join()} and
@ref{1764,,bytearray.join()} that could occur if an item’s
@ref{68d,,__buffer__()} concurrently mutates the sequence being joined.
The mutation is now reported as a @ref{246,,RuntimeError} instead.

@item 
gh-109940@footnote{https://github.com/python/cpython/issues/109940}: Fix Windows @ref{118,,venv} activation in @code{cmd.exe} to respect
@code{VIRTUAL_ENV_DISABLE_PROMPT}.

@item 
gh-143988@footnote{https://github.com/python/cpython/issues/143988}: Fixed crashes in @ref{6a2,,socket.socket.sendmsg()} and
@ref{1346,,socket.socket.recvmsg_into()} that could occur if buffer sequences
are concurrently mutated.

@item 
gh-130796@footnote{https://github.com/python/cpython/issues/130796}: Undeprecate the @ref{930,,locale.getdefaultlocale()} function. Patch
by Victor Stinner.

@item 
gh-120665@footnote{https://github.com/python/cpython/issues/120665}: Fixed an issue where @code{unittest} loaders would load and
instantiate @ref{2b5,,unittest.TestCase}-derived subclasses that are also
abstract base classes, which can’t be instantiated.

@item 
gh-101267@footnote{https://github.com/python/cpython/issues/101267}: When a worker process terminates unexpectedly,
@ref{1d8,,concurrent.futures.ProcessPoolExecutor} now sets a separate
@ref{1765,,BrokenProcessPool} exception on each
pending future instead of sharing a single instance among them all.
Sharing one exception produced malformed tracebacks: each
@ref{1766,,Future.result()} call re-raised
the same object, appending another copy of the traceback to it.
@end itemize

@node Documentation<2>,Core and Builtins,Library,Python next
@anchor{whatsnew/changelog documentation}@anchor{1767}
@subsubsection Documentation



@itemize -

@item 
gh-86726@footnote{https://github.com/python/cpython/issues/86726}: Greatly expand the @ref{f6,,tkinter} documentation to cover the
full public API of the package and its submodules.  The descriptions are
oriented towards Python rather than Tcl/Tk, with corrected return types
and @code{versionadded}/@code{versionchanged} information.
@end itemize

@node Core and Builtins,C API,Documentation<2>,Python next
@anchor{whatsnew/changelog core-and-builtins}@anchor{1768}
@subsubsection Core and Builtins



@itemize -

@item 
gh-151546@footnote{https://github.com/python/cpython/issues/151546}: Fix the stack limit check if Python is linked to musl (ex:
Alpine Linux). Use the stack size set by the linker to compute the stack
limits. Patch by Victor Stinner.

@item 
gh-151461@footnote{https://github.com/python/cpython/issues/151461}: Fix direct execution of files with invalid source encodings to
report the underlying codec lookup or decoding error instead of the
generic @code{SyntaxError: encoding problem} message. Patch by Bartosz
Sławecki.

@item 
gh-151218@footnote{https://github.com/python/cpython/issues/151218}: @ref{37b,,PyConfig_Set()} and @ref{1769,,sys.set_int_max_str_digits()}
now replace @ref{89e,,sys.flags} (create a new object), instead of modifying
@code{sys.flags} in-place. Patch by Victor Stinner.

@item 
gh-151253@footnote{https://github.com/python/cpython/issues/151253}: If @code{import encodings} (first import) fails at Python startup,
dump the Python path configuration to help users debugging their
configuration. Patch by Victor Stinner.

@item 
gh-151238@footnote{https://github.com/python/cpython/issues/151238}: Fix a crash when compiling a concatenated f-string or t-string
if an error occurs when processing one of it’s parts.

@item 
gh-151126@footnote{https://github.com/python/cpython/issues/151126}: Fix a crash, when there’s no memory left on a device, which
happened in @code{_interpchannels} module.

Now it raises proper @ref{1761,,MemoryError} errors.

@item 
gh-150902@footnote{https://github.com/python/cpython/issues/150902}: Apply an existing optimization of PyCriticalSection (single
mutex) to PyCriticalSection2: avoid acquiring the same locks that the
current CS has already acquired.

@item 
gh-151065@footnote{https://github.com/python/cpython/issues/151065}: Fix memory leak when using the @ref{176a,,mimalloc memory allocator}.

@item 
gh-150988@footnote{https://github.com/python/cpython/issues/150988}: Fix a reference leak in @ref{2c2,,OSError} when attributes are set
before @code{super().__init__()}.
@end itemize

@node C API,Build,Core and Builtins,Python next
@anchor{whatsnew/changelog c-api}@anchor{176b}
@subsubsection C API



@itemize -

@item 
gh-123619@footnote{https://github.com/python/cpython/issues/123619}: @ref{3c3,,PyUnstable_Object_EnableDeferredRefcount()} now returns
@code{0} if the object is not tracked by the garbage collector: if
@ref{1519,,gc.is_tracked()} is false. Patch by Victor Stinner.
@end itemize

@node Build,,C API,Python next
@anchor{whatsnew/changelog build}@anchor{176c}
@subsubsection Build



@itemize -

@item 
gh-148260@footnote{https://github.com/python/cpython/issues/148260}: On Linux when Python is linked to the musl C library, use a
thread stack size of at least 1 MiB instead of musl default which is 128
kiB. Patch by Victor Stinner.
@end itemize

@node Python 3 14 6 final,Python 3 14 5 final,Python next,Changelog
@anchor{whatsnew/changelog python-3-14-6-final}@anchor{176d}
@subsection Python 3.14.6 final


`Release date: 2026-06-10'

@menu
* Security:: 
* Core and Builtins: Core and Builtins<2>. 
* Library: Library<2>. 
* Documentation: Documentation<3>. 
* Tests: Tests<2>. 
* Build: Build<2>. 
* Windows:: 
* macOS:: 
* IDLE: IDLE<3>. 
* C API: C API<2>. 

@end menu

@node Security,Core and Builtins<2>,,Python 3 14 6 final
@anchor{whatsnew/changelog security}@anchor{176e}
@subsubsection Security



@itemize -

@item 
gh-151159@footnote{https://github.com/python/cpython/issues/151159}: Update Android and iOS installers to use OpenSSL 3.5.7.

@item 
gh-150599@footnote{https://github.com/python/cpython/issues/150599}: Fix a possible stack buffer overflow in @ref{14,,bz2} when a
@ref{176f,,bz2.BZ2Decompressor} is reused after a decompression error. The
decompressor now becomes unusable after libbz2 reports an error.

@item 
gh-149835@footnote{https://github.com/python/cpython/issues/149835}: @ref{c57,,shutil.move()} now resolves symlinks via
@ref{264,,os.path.realpath()} when checking whether the destination is inside
the source directory, preventing a symlink-based bypass of that guard.

@item 
gh-149698@footnote{https://github.com/python/cpython/issues/149698}: Update bundled libexpat@footnote{https://libexpat.github.io/} to
version 2.8.1 for the fix for 
@geindex Common Vulnerabilities and Exposures; CVE 2026-45186
CVE 2026-45186@footnote{https://www.cve.org/CVERecord?id=CVE-2026-45186}.

@item 
gh-87451@footnote{https://github.com/python/cpython/issues/87451}: The @ref{62,,ftplib} module’s undocumented @code{ftpcp} function no
longer trusts the IPv4 address value returned from the source server in
response to the @code{PASV} command by default, completing the fix for
CVE-2021-4189.  As with @ref{afc,,ftplib.FTP}, the former behavior can be
re-enabled by setting the @code{trust_server_pasv_ipv4_address} attribute on
the source @code{ftplib.FTP} instance to @code{True}.  Thanks to Qi Deng at
Aurascape AI for the report.

@item 
gh-149486@footnote{https://github.com/python/cpython/issues/149486}: @ref{29c,,tarfile.data_filter()} now validates link targets using
the same normalised value that is written to disk, strips trailing
separators from the member name when resolving a symlink’s directory, and
rejects link members that would replace the destination directory itself.
This closes several path-traversal bypasses of the @code{data} extraction
filter.

@item 
gh-149079@footnote{https://github.com/python/cpython/issues/149079}: Fix a potential denial of service in
@ref{8e6,,unicodedata.normalize()}. The canonical ordering step of Unicode
normalization used a quadratic-time insertion sort for reordering
combining characters, which could be exploited with crafted input
containing many combining characters in non-canonical order. Replaced with
a linear-time counting sort for long runs.

@item 
gh-149018@footnote{https://github.com/python/cpython/issues/149018}: Improved protection against XML hash-flooding attacks in
@ref{12d,,xml.parsers.expat} and @ref{12c,,xml.etree.ElementTree} when Python is
compiled with libExpat 2.8.0 or later.
@end itemize

@node Core and Builtins<2>,Library<2>,Security,Python 3 14 6 final
@anchor{whatsnew/changelog id2}@anchor{1770}
@subsubsection Core and Builtins



@itemize -

@item 
gh-151112@footnote{https://github.com/python/cpython/issues/151112}: Fix a crash in the compiler that could occur when running out
of memory.

@item 
gh-151126@footnote{https://github.com/python/cpython/issues/151126}: Fix a crash, when there’s no memory left on a device, which
happened in:


@itemize -

@item 
code compilation - @code{_winapi.CreateProcess()}
@end itemize

Now these places raise proper @ref{1761,,MemoryError} errors.

@item 
gh-150700@footnote{https://github.com/python/cpython/issues/150700}: Fix a @ref{796,,SystemError} when compiling a class-scope
comprehension containing a @code{lambda} that references @code{__class__},
@code{__classdict__}, or @code{__conditional_annotations__}. Patch by Bartosz
Sławecki.

@item 
gh-150633@footnote{https://github.com/python/cpython/issues/150633}: Fix the frozen importer accepting module names with embedded
null bytes, which caused it to bypass the @ref{1771,,sys.modules} cache and
create duplicate module objects.

@item 
gh-148613@footnote{https://github.com/python/cpython/issues/148613}: Fix a data race in the free-threaded build between
@ref{2dc,,gc.set_threshold()} and garbage collection scheduling during object
allocation.

@item 
gh-149156@footnote{https://github.com/python/cpython/issues/149156}: Fix an intermittent crash after @ref{4b6,,os.fork()} when perf
trampoline profiling is enabled and the child returns through trampoline
frames inherited from the parent process.

@item 
gh-149449@footnote{https://github.com/python/cpython/issues/149449}: Fix a use-after-free crash when the @ref{10c,,unicodedata} module
was removed from @ref{1771,,sys.modules} and garbage-collected between calls
that decode @code{\N@{...@}} escapes or use the @code{namereplace} codec error
handler.

@item 
gh-150207@footnote{https://github.com/python/cpython/issues/150207}: Fix a crash when a memory allocation fails during tokenizer
initialization. A proper @ref{1761,,MemoryError} is now raised instead.

@item 
gh-150107@footnote{https://github.com/python/cpython/issues/150107}: @ref{b,,asyncio}: @code{sendfile()} and @code{sock_sendfile()} event
loop methods now call @code{file.seek(offset)} if `file' has a @code{seek()}
method, even if `offset' is @code{0} (default value).

@item 
gh-150146@footnote{https://github.com/python/cpython/issues/150146}: Fix a crash on a complex type variable substitution.

@code{from typing import TypeVar; memoryview[TypeVar("")][*typing.Mapping[...,
...]]} used to fail due to missing @code{NULL} check on @code{_unpack_args} C
function call.

@item 
gh-149590@footnote{https://github.com/python/cpython/issues/149590}: Fix crash when faulthandler is imported more than once.

@item 
gh-149816@footnote{https://github.com/python/cpython/issues/149816}: Fix a race condition in @code{_PyBytes_FromList} in free-threading
mode.

@item 
gh-149816@footnote{https://github.com/python/cpython/issues/149816}: Fix a race condition in @ref{166,,memoryview} with
free-threading.

@item 
gh-149805@footnote{https://github.com/python/cpython/issues/149805}: Fix a @ref{796,,SystemError} when compiling a compiling
@code{__classdict__} class annotation. Found by OSS-Fuzz in
#512907042@footnote{https://issues.oss-fuzz.com/issues/512907042}.

@item 
gh-149738@footnote{https://github.com/python/cpython/issues/149738}: @ref{d4,,sqlite3}: Disallow removing @code{row_factory} and
@code{text_factory} attributes of a connection to prevent a crash on a query.

@item 
gh-139808@footnote{https://github.com/python/cpython/issues/139808}: Add branch protections for AArch64 (BTI/PAC) in assembly code
used by @ref{170,,-X perf_jit} (Linux perf profiler integration).

@item 
gh-148450@footnote{https://github.com/python/cpython/issues/148450}: Fix @code{abc.register()} so it invalidates type version tags for
registered classes.
@end itemize

@node Library<2>,Documentation<3>,Core and Builtins<2>,Python 3 14 6 final
@anchor{whatsnew/changelog id3}@anchor{1772}
@subsubsection Library



@itemize -

@item 
gh-151039@footnote{https://github.com/python/cpython/issues/151039}: Fix a crash when static @ref{34,,datetime} types outlive the
@code{_datetime} module.

@item 
gh-150913@footnote{https://github.com/python/cpython/issues/150913}: Fix @ref{894,,sqlite3.Blob} slice assignment to raise
@ref{199,,TypeError} and @ref{1741,,IndexError} for type and size mismatches
respectively, even when the target slice is empty.

@item 
gh-143008@footnote{https://github.com/python/cpython/issues/143008}: Fix race conditions when re-initializing a
@ref{9c4,,io.TextIOWrapper} object.

@item 
gh-150750@footnote{https://github.com/python/cpython/issues/150750}: Fix a race condition in @ref{fd6,,collections.deque.index()} with
free-threading.

@item 
gh-150685@footnote{https://github.com/python/cpython/issues/150685}: Update bundled pip to 26.1.2

@item 
gh-150406@footnote{https://github.com/python/cpython/issues/150406}: Fix a possible crash occurring during @ref{d1,,socket} module
initialization when the system is out of memory on platforms without a
reentrant @code{gethostbyname}.

@item 
gh-150372@footnote{https://github.com/python/cpython/issues/150372}: @ref{bf,,readline}: Fix a potential crash during tab completion
caused by an out-of-memory error during module initialization.

@item 
gh-150157@footnote{https://github.com/python/cpython/issues/150157}: Fix a crash in free-threaded builds that occurs when pickling
by name objects without a @code{__module__} attribute while
@ref{1771,,sys.modules} is concurrently being modified.

@item 
gh-150175@footnote{https://github.com/python/cpython/issues/150175}: Fix race condition in @ref{1773,,unittest.mock.ThreadingMock}
where concurrent calls could lose increments to @code{call_count} and other
attributes due to a missing lock in @code{_increment_mock_call}.

@item 
gh-84353@footnote{https://github.com/python/cpython/issues/84353}: Preserve non-UTF-8 encoded filenames when appending to a
@ref{8d5,,zipfile.ZipFile}.  Previously, non-ASCII names stored in a legacy
encoding (without the UTF-8 flag bit set) could be corrupted when the
central directory was rewritten: they were decoded as cp437 and then
re-stored as UTF-8.

@item 
gh-149816@footnote{https://github.com/python/cpython/issues/149816}: Fix race condition in @ref{1774,,ssl.SSLContext.sni_callback}

@item 
gh-149995@footnote{https://github.com/python/cpython/issues/149995}: Update various docstrings in @ref{10b,,typing}.

@item 
gh-88726@footnote{https://github.com/python/cpython/issues/88726}: The @ref{3f,,email} package now uses standard MIME charset names
“gb2312” and “big5” instead of non-standard names “eucgb2312_cn” and
“big5_tw”.

@item 
gh-149571@footnote{https://github.com/python/cpython/issues/149571}: Fix the C implementation of
@ref{13e1,,xml.etree.ElementTree.Element.itertext()}: it no longer emits text
for comments and processing instructions.

@item 
gh-149921@footnote{https://github.com/python/cpython/issues/149921}: Fix reference leaks in error paths of the
@code{_interpchannels} and @code{_interpqueues} extension modules.

@item 
gh-149816@footnote{https://github.com/python/cpython/issues/149816}: Fix a race condition in @code{_random.Random.__init__} method in
free-threading mode.

@item 
gh-149801@footnote{https://github.com/python/cpython/issues/149801}: Add IANA registered names and aliases with leading zeros before
number (like IBM00858, CP00858, IBM01140, CP01140) for corresponding
codecs.

@item 
gh-149701@footnote{https://github.com/python/cpython/issues/149701}: Fix bad return code from Lib/venv/bin/activate if hashing is
disabled

@item 
gh-112821@footnote{https://github.com/python/cpython/issues/112821}: In the REPL, autocompletion might run arbitrary code in the
getter of a descriptor. If that getter raised an exception, autocompletion
would fail to present any options for the entire object.  Autocompletion
now works as expected for these objects.

@item 
gh-149489@footnote{https://github.com/python/cpython/issues/149489}: Fix @ref{12c,,ElementTree} serialization to HTML. The
content of elements “xmp”, “iframe”, “noembed”, “noframes”, and
“plaintext” is no longer escaped. The “plaintext” element no longer have
the closing tag.

@item 
gh-149231@footnote{https://github.com/python/cpython/issues/149231}: In @ref{103,,tomllib}, the number of parts in TOML keys is now
limited.

@item 
gh-149046@footnote{https://github.com/python/cpython/issues/149046}: @ref{83,,io}: Fix @ref{112f,,io.StringIO} serialization: no longer
call @code{str(obj)} on @ref{16a,,str} subclasses. Patch by Thomas Kowalski.

@item 
gh-148954@footnote{https://github.com/python/cpython/issues/148954}: Fix XML injection vulnerability in @ref{1775,,xmlrpc.client.dumps()}
where the @code{methodname} was not being escaped before interpolation into
the XML body.

@item 
gh-148441@footnote{https://github.com/python/cpython/issues/148441}: @ref{12d,,xml.parsers.expat}: prevent a crash in
@ref{1776,,CharacterDataHandler()} when the
character data size exceeds the parser’s @ref{1777,,buffer size}.

@item 
gh-146452@footnote{https://github.com/python/cpython/issues/146452}: Fix segfault in @ref{ab,,pickle} when pickling a dictionary
concurrently mutated by another thread in the free-threaded build.

@item 
gh-142831@footnote{https://github.com/python/cpython/issues/142831}: Fix a crash in the @ref{86,,json} module where a use-after-free
could occur if the object being encoded is modified during serialization.

@item 
gh-90949@footnote{https://github.com/python/cpython/issues/90949}: Add
@ref{1778,,SetBillionLaughsAttackProtectionActivationThreshold()}
and
@ref{1779,,SetBillionLaughsAttackProtectionMaximumAmplification()}
to @ref{177a,,xmlparser} objects to tune protections
against billion laughs@footnote{https://en.wikipedia.org/wiki/Billion_laughs_attack} attacks. Patch by
Bénédikt Tran.

@item 
gh-134261@footnote{https://github.com/python/cpython/issues/134261}: zip: On reproducible builds, ZipFile uses UTC instead of the
local time when writing file datetimes to avoid underflows.

@item 
gh-128110@footnote{https://github.com/python/cpython/issues/128110}: Fix bug in the parsing of @ref{3f,,email} address headers that
could result in extraneous spaces in the decoded text when using a modern
email policy. Space between pairs of adjacent 
@geindex RFC; RFC 2047
RFC 2047@footnote{https://datatracker.ietf.org/doc/html/rfc2047.html} encoded-words is
now ignored, per section 6.2 (and consistent with existing parsing of
unstructured headers like `Subject').

@item 
gh-107398@footnote{https://github.com/python/cpython/issues/107398}: Fix @ref{e4,,tarfile} stream mode exception when process the file
with the gzip extra field.

@item 
gh-123853@footnote{https://github.com/python/cpython/issues/123853}: Update the table of Windows language code identifiers (LCIDs)
used by @ref{930,,locale.getdefaultlocale()} on Windows to protocol version
16.0 (2024-04-23).

@item 
gh-91099@footnote{https://github.com/python/cpython/issues/91099}: @ref{177b,,imaplib.IMAP4.login()} now raises exceptions with
@ref{16a,,str} instead of @ref{193,,bytes}. Patch by Florian Best.
@end itemize

@node Documentation<3>,Tests<2>,Library<2>,Python 3 14 6 final
@anchor{whatsnew/changelog id4}@anchor{177c}
@subsubsection Documentation



@itemize -

@item 
gh-150319@footnote{https://github.com/python/cpython/issues/150319}: Generic builtin and standard library types now document the
meaning of their type parameters.

@item 
gh-109503@footnote{https://github.com/python/cpython/issues/109503}: Fix documentation for @ref{c57,,shutil.move()} on usage of
@ref{12fd,,os.rename()} since nonatomic move might be used even if the files are
on the same filesystem. Patch by Fang Li
@end itemize

@node Tests<2>,Build<2>,Documentation<3>,Python 3 14 6 final
@anchor{whatsnew/changelog id5}@anchor{177d}
@subsubsection Tests



@itemize -

@item 
gh-151130@footnote{https://github.com/python/cpython/issues/151130}: Add more tests for @code{PyWeakref_*} C API.

@item 
gh-149776@footnote{https://github.com/python/cpython/issues/149776}: Fix test_socket on Linux kernel 7.1 and newer: skip UDP Lite
tests if it’s not supported. Patch by Victor Stinner.
@end itemize

@node Build<2>,Windows,Tests<2>,Python 3 14 6 final
@anchor{whatsnew/changelog id6}@anchor{177e}
@subsubsection Build



@itemize -

@item 
gh-148294@footnote{https://github.com/python/cpython/issues/148294}: Corrected the use of @code{AC_PATH_TOOL} in @code{configure.ac} to
allow a C++ compiler to be found on @code{PATH}.
@end itemize

@node Windows,macOS,Build<2>,Python 3 14 6 final
@anchor{whatsnew/changelog windows}@anchor{177f}
@subsubsection Windows



@itemize -

@item 
gh-151159@footnote{https://github.com/python/cpython/issues/151159}: Updated bundled version of OpenSSL to 3.5.7.
@end itemize

@node macOS,IDLE<3>,Windows,Python 3 14 6 final
@anchor{whatsnew/changelog macos}@anchor{1780}
@subsubsection macOS



@itemize -

@item 
gh-151159@footnote{https://github.com/python/cpython/issues/151159}: Update macOS installer to use OpenSSL 3.5.7.

@item 
gh-150644@footnote{https://github.com/python/cpython/issues/150644}: When system logging is enabled (with
@code{config.use_system_logger}, messages are now tagged as public. This
allows the macOS 26 system logger to view messages without special
configuration.

@item 
gh-115119@footnote{https://github.com/python/cpython/issues/115119}: Update macOS installer to use libmpdecimal 4.0.1.
@end itemize

@node IDLE<3>,C API<2>,macOS,Python 3 14 6 final
@anchor{whatsnew/changelog idle}@anchor{1781}
@subsubsection IDLE



@itemize -

@item 
bpo-6699@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6699}: Warn the user if a file will be overwritten when saving.
@end itemize

@node C API<2>,,IDLE<3>,Python 3 14 6 final
@anchor{whatsnew/changelog id7}@anchor{1782}
@subsubsection C API



@itemize -

@item 
gh-150907@footnote{https://github.com/python/cpython/issues/150907}: Fix @code{dynamic_annotations.h} header file when built with C++
and Valgrind: add @code{extern "C++" scope} for the C++ template. Patch by
Victor Stinner.

@item 
gh-145235@footnote{https://github.com/python/cpython/issues/145235}: Made @ref{3ce,,PyDict_AddWatcher()},
@ref{1783,,PyDict_ClearWatcher()}, @ref{785,,PyDict_Watch()}, and
@ref{1784,,PyDict_Unwatch()} thread-safe on the @ref{1f6,,free threaded} build.
@end itemize

@node Python 3 14 5 final,Python 3 14 5 release candidate 1,Python 3 14 6 final,Changelog
@anchor{whatsnew/changelog python-3-14-5-final}@anchor{1785}
@subsection Python 3.14.5 final


`Release date: 2026-05-10'

@menu
* Security: Security<2>. 
* Core and Builtins: Core and Builtins<3>. 
* Library: Library<3>. 
* Tests: Tests<3>. 
* macOS: macOS<2>. 

@end menu

@node Security<2>,Core and Builtins<3>,,Python 3 14 5 final
@anchor{whatsnew/changelog id8}@anchor{1786}
@subsubsection Security



@itemize -

@item 
gh-148178@footnote{https://github.com/python/cpython/issues/148178}: Hardened @code{_remote_debugging} by validating remote debug
offset tables before using them to size memory reads or interpret remote
layouts.
@end itemize

@node Core and Builtins<3>,Library<3>,Security<2>,Python 3 14 5 final
@anchor{whatsnew/changelog id9}@anchor{1787}
@subsubsection Core and Builtins



@itemize -

@item 
gh-146270@footnote{https://github.com/python/cpython/issues/146270}: Fix a sequential consistency bug in @code{structmember.c}.

@item 
gh-137293@footnote{https://github.com/python/cpython/issues/137293}: Fix @ref{796,,SystemError} when searching ELF Files in
@ref{16e,,sys.remote_exec()}.
@end itemize

@node Library<3>,Tests<3>,Core and Builtins<3>,Python 3 14 5 final
@anchor{whatsnew/changelog id10}@anchor{1788}
@subsubsection Library



@itemize -

@item 
gh-149388@footnote{https://github.com/python/cpython/issues/149388}: Make @code{asyncio.windows_utils.PipeHandle} closing
idempotent.

@item 
gh-149377@footnote{https://github.com/python/cpython/issues/149377}: Update bundled pip to 26.1.1

@item 
gh-138907@footnote{https://github.com/python/cpython/issues/138907}: Support 
@geindex RFC; RFC 9309
RFC 9309@footnote{https://datatracker.ietf.org/doc/html/rfc9309.html} in @ref{114,,urllib.robotparser}.

@item 
gh-148615@footnote{https://github.com/python/cpython/issues/148615}: Fix @ref{aa,,pdb} to accept standard – end of options separator.
Reported by haampie. Patched by Shrey Naithani.

@item 
gh-130750@footnote{https://github.com/python/cpython/issues/130750}: Restore quoting of choices in @ref{7,,argparse} error messages
for improved clarity and consistency with documentation.

@item 
gh-141449@footnote{https://github.com/python/cpython/issues/141449}: Improve tests and documentation for non-function callables as
@ref{15e,,annotate functions}.
@end itemize

@node Tests<3>,macOS<2>,Library<3>,Python 3 14 5 final
@anchor{whatsnew/changelog id11}@anchor{1789}
@subsubsection Tests



@itemize -

@item 
gh-149425@footnote{https://github.com/python/cpython/issues/149425}: Increase time delta in
@code{test.test_zipfile.test_core.OtherTests.test_write_without_source_date_epoch}

@item 
gh-145736@footnote{https://github.com/python/cpython/issues/145736}: Fix test_tkinter test_configure_values test case backport miss
for Tk 9.
@end itemize

@node macOS<2>,,Tests<3>,Python 3 14 5 final
@anchor{whatsnew/changelog id12}@anchor{178a}
@subsubsection macOS



@itemize -

@item 
gh-142295@footnote{https://github.com/python/cpython/issues/142295}: For Python macOS framework builds, update Info.plist files to
be more compliant with current Apple guidelines. Original patch
contributed by Martinus Verburg.

@item 
gh-124111@footnote{https://github.com/python/cpython/issues/124111}: Update macOS installer to use Tcl/Tk 9.0.3.
@end itemize

@node Python 3 14 5 release candidate 1,Python 3 14 4 final,Python 3 14 5 final,Changelog
@anchor{whatsnew/changelog python-3-14-5-release-candidate-1}@anchor{178b}
@subsection Python 3.14.5 release candidate 1


`Release date: 2026-05-04'

@menu
* Security: Security<3>. 
* Core and Builtins: Core and Builtins<4>. 
* Library: Library<4>. 
* Documentation: Documentation<4>. 
* Build: Build<3>. 
* Windows: Windows<2>. 
* macOS: macOS<3>. 

@end menu

@node Security<3>,Core and Builtins<4>,,Python 3 14 5 release candidate 1
@anchor{whatsnew/changelog id13}@anchor{178c}
@subsubsection Security



@itemize -

@item 
gh-149254@footnote{https://github.com/python/cpython/issues/149254}: Update Android and iOS installer to use OpenSSL 3.0.20.

@item 
gh-149017@footnote{https://github.com/python/cpython/issues/149017}: Update bundled libexpat@footnote{https://libexpat.github.io/} to
version 2.8.0.

@item 
gh-90309@footnote{https://github.com/python/cpython/issues/90309}: Base64-encode values when embedding cookies to JavaScript using
the @ref{178d,,http.cookies.BaseCookie.js_output()} method to avoid injection
and escaping.

@item 
gh-148808@footnote{https://github.com/python/cpython/issues/148808}: Added buffer boundary check when using @code{nbytes} parameter
with @code{asyncio.AbstractEventLoop.sock_recvfrom_into()}. Only relevant
for Windows and the @ref{81e,,asyncio.ProactorEventLoop}.

@item 
gh-148395@footnote{https://github.com/python/cpython/issues/148395}: Fix a dangling input pointer in @ref{178e,,lzma.LZMADecompressor},
@ref{176f,,bz2.BZ2Decompressor}, and internal
@code{zlib._ZlibDecompressor} when memory allocation fails with
@ref{1761,,MemoryError}, which could let a subsequent @code{decompress()} call
read or write through a stale pointer to the already-released caller
buffer.

@item 
gh-148169@footnote{https://github.com/python/cpython/issues/148169}: A bypass in @ref{11c,,webbrowser} allowed URLs prefixed with
@code{%action} to pass the dash-prefix safety check.

@item 
gh-146581@footnote{https://github.com/python/cpython/issues/146581}: Fix vulnerability in @ref{697,,shutil.unpack_archive()} for ZIP
files on Windows which allowed to write files outside of the destination
tree if the patch in the archive contains a Windows drive prefix. Now such
invalid paths will be skipped. Files containing “..” in the name (like
“foo..bar”) are no longer skipped.

@item 
gh-146333@footnote{https://github.com/python/cpython/issues/146333}: Fix quadratic backtracking in
@ref{116a,,configparser.RawConfigParser} option parsing regexes (@code{OPTCRE}
and @code{OPTCRE_NV}). A crafted configuration line with many whitespace
characters could cause excessive CPU usage.

@item 
gh-146211@footnote{https://github.com/python/cpython/issues/146211}: Reject CR/LF characters in tunnel request headers for the
HTTPConnection.set_tunnel() method.
@end itemize

@node Core and Builtins<4>,Library<4>,Security<3>,Python 3 14 5 release candidate 1
@anchor{whatsnew/changelog id15}@anchor{178f}
@subsubsection Core and Builtins



@itemize -

@item 
gh-149122@footnote{https://github.com/python/cpython/issues/149122}: Fix a crash in optimized calls to @ref{162e,,all()}, @ref{162d,,any()},
@ref{614,,tuple()}, @ref{24f,,list()}, and @ref{185,,set()} with an async generator
expression argument (for example, @code{tuple(await x for x in y)}). These
calls now correctly raise @code{TypeError} instead of crashing.

@item 
gh-113956@footnote{https://github.com/python/cpython/issues/113956}: Fix a data race in @ref{14e7,,sys.intern()} in the free-threaded
build when interning a string owned by another thread. An interned copy
owned by the current thread is used instead when it is not safe to
immortalize the original.

@item 
gh-148820@footnote{https://github.com/python/cpython/issues/148820}: Fix a race in @code{_PyRawMutex} on the free-threaded build
where a @code{Py_PARK_INTR} return from @code{_PySemaphore_Wait} could let the
waiter destroy its semaphore before the unlocking thread’s
@code{_PySemaphore_Wakeup} completed, causing a fatal @code{ReleaseSemaphore}
error.

@item 
gh-148653@footnote{https://github.com/python/cpython/issues/148653}: Forbid @ref{91,,marshalling} recursive code objects and
@ref{695,,slice} objects which cannot be correctly unmarshalled.

@item 
gh-142516@footnote{https://github.com/python/cpython/issues/142516}: Forward-port the generational cycle garbage collector to the
default 3.14 build, replacing the incremental collector while leaving the
free-threaded collector unchanged.

@item 
gh-148390@footnote{https://github.com/python/cpython/issues/148390}: Fix an undefined behavior in @ref{166,,memoryview} when using the
native boolean format (@code{?}) in @ref{1790,,cast()}. Previously, on
some common platforms, calling @code{memoryview(b).cast("?").tolist()}
incorrectly returned @code{[False]} instead of @code{[True]} for any even byte
`b'. Patch by Bénédikt Tran.

@item 
gh-148418@footnote{https://github.com/python/cpython/issues/148418}: Fix a possible reference leak in a corrupted @code{TYPE_CODE}
marshal stream.

@item 
gh-148393@footnote{https://github.com/python/cpython/issues/148393}: Fix data races between @ref{785,,PyDict_Watch()} /
@ref{1784,,PyDict_Unwatch()} and concurrent dict mutation in the
@ref{1791,,free-threaded build}.

@item 
gh-148284@footnote{https://github.com/python/cpython/issues/148284}: Fix high stack consumption in Python’s interpreter loop on
Clang 22 by setting function limits for inlining when building with
computed gotos.

@item 
gh-148037@footnote{https://github.com/python/cpython/issues/148037}: Remove critical section from @code{PyCode_Addr2Line()} in
free-threading.

@item 
gh-148222@footnote{https://github.com/python/cpython/issues/148222}: Fix vectorcall support in @ref{9f2,,types.GenericAlias} when the
underlying type does not support the vectorcall protocol. Fix possible
leaks in @code{types.GenericAlias} and @ref{2a9,,types.UnionType} in case
of memory error.

@item 
gh-148208@footnote{https://github.com/python/cpython/issues/148208}: Fix recursion depth leak in @ref{1792,,PyObject_Print()}

@item 
gh-137814@footnote{https://github.com/python/cpython/issues/137814}: Fix the @code{__qualname__} attribute of @code{__annotate__}
functions on functions.

@item 
gh-147998@footnote{https://github.com/python/cpython/issues/147998}: Fixed a memory leak in interpreter helper calls so cleanup
works when an operation falls across interpreter boundaries. Patch by
Maurycy Pawłowski-Wieroński.

@item 
gh-146455@footnote{https://github.com/python/cpython/issues/146455}: Fix O(N²) compile-time regression in constant folding after it
was moved from AST to CFG optimizer.
@end itemize

@node Library<4>,Documentation<4>,Core and Builtins<4>,Python 3 14 5 release candidate 1
@anchor{whatsnew/changelog id16}@anchor{1793}
@subsubsection Library



@itemize -

@item 
gh-149221@footnote{https://github.com/python/cpython/issues/149221}: Catch rare math domain error for
@ref{6d8,,random.binomialvariate()}.

@item 
gh-149117@footnote{https://github.com/python/cpython/issues/149117}: Fix @ref{1794,,runpy.run_module()} and @ref{4a5,,runpy.run_path()} to set
the @ref{1795,,name} attribute on the @ref{65b,,ImportError} they
raise.

@item 
gh-149148@footnote{https://github.com/python/cpython/issues/149148}: @ref{59,,ensurepip}: Upgrade bundled pip to 26.1. This version
fixes the 
@geindex Common Vulnerabilities and Exposures; CVE 2026-3219
CVE 2026-3219@footnote{https://www.cve.org/CVERecord?id=CVE-2026-3219} vulnerability. Patch by Victor Stinner.

@item 
gh-148093@footnote{https://github.com/python/cpython/issues/148093}: Fix an out-of-bounds read of one byte in
@ref{1796,,binascii.a2b_uu()}. Raise @ref{122c,,binascii.Error}, instead of reading
past the buffer end.

@item 
gh-148914@footnote{https://github.com/python/cpython/issues/148914}: Fix memoization of in-band @ref{1797,,PickleBuffer} in the
Python implementation of @ref{ab,,pickle}. Previously, identical
@code{PickleBuffer}s did not preserve identity, and empty writable
@code{PickleBuffer} memoized an empty bytearray object in place of
@code{b'@w{'}}, so the following references to @code{b'@w{'}} were unpickled as an empty
bytearray object.

@item 
gh-148947@footnote{https://github.com/python/cpython/issues/148947}: Fix crash in @ref{4e2,,@@dataclasses.dataclass} with @code{slots=True}
that occurred when a function found within the class had an empty
@code{__class__} cell.

@item 
gh-148680@footnote{https://github.com/python/cpython/issues/148680}: @code{ForwardRef} objects that contain internal names to represent
known objects now show the @code{type_repr} of the known object rather than
the internal @code{__annotationlib_name_x__} name when evaluated as strings.

@item 
gh-148801@footnote{https://github.com/python/cpython/issues/148801}: @ref{12c,,xml.etree.ElementTree}: Fix a crash in
@ref{1798,,Element.__deepcopy__} on deeply nested trees.

@item 
gh-148735@footnote{https://github.com/python/cpython/issues/148735}: @ref{12c,,xml.etree.ElementTree}: Fix a use-after-free in
@ref{1799,,Element.findtext} when the
element tree is mutated concurrently during the search.

@item 
gh-148740@footnote{https://github.com/python/cpython/issues/148740}: Fix usage for @ref{117,,uuid} command-line interface to support a
custom namespace be provided for uuid3 and uuid5.

@item 
gh-148651@footnote{https://github.com/python/cpython/issues/148651}: Fix reference leak in
@ref{179a,,compression.zstd.ZstdDecompressor} when an invalid option key is
passed.

@item 
gh-146553@footnote{https://github.com/python/cpython/issues/146553}: Fix infinite loop in @ref{8c2,,typing.get_type_hints()} when
@code{__wrapped__} forms a cycle. Patch by Shamil Abdulaev.

@item 
gh-148508@footnote{https://github.com/python/cpython/issues/148508}: An intermittent timing error when running SSL tests on iOS has
been resolved.

@item 
gh-148518@footnote{https://github.com/python/cpython/issues/148518}: If an email containing an address header that ended in an open
double quote was parsed with a non-@code{compat32} policy, accessing the
@code{username} attribute of the mailbox accessed through that header object
would result in an @code{IndexError}. It now correctly returns an empty
string as the result.

@item 
gh-148464@footnote{https://github.com/python/cpython/issues/148464}: Add missing @code{__ctype_le/be__} attributes for
@ref{1ef,,c_float_complex} and @ref{1f0,,c_double_complex}.
Patch by Sergey B Kirpichev.

@item 
gh-148370@footnote{https://github.com/python/cpython/issues/148370}: @ref{26,,configparser}: prevent quadratic behavior when a
@ref{72a,,ParsingError} is raised after a parser fails to parse
multiple lines. Patch by Bénédikt Tran.

@item 
gh-148254@footnote{https://github.com/python/cpython/issues/148254}: Use singular “sec” instead of “secs” in @ref{f5,,timeit} verbose
output for consistency with other time units.

@item 
gh-148192@footnote{https://github.com/python/cpython/issues/148192}: @code{email.generator.Generator._make_boundary} could fail to
detect a duplicate boundary string if linesep was not n. It now correctly
detects boundary strings when linesep is rn as well.

@item 
gh-146313@footnote{https://github.com/python/cpython/issues/146313}: Fix a deadlock in @ref{98,,multiprocessing}’s resource tracker
where the parent process could hang indefinitely in @ref{fa0,,os.waitpid()}
during interpreter shutdown if a child created via @ref{4b6,,os.fork()} still
held the resource tracker’s pipe open.

@item 
gh-145831@footnote{https://github.com/python/cpython/issues/145831}: Fix @code{email.quoprimime.decode()} leaving a stray @code{\r}
when @code{eol='\r\n'} by stripping the full `eol' string instead of one
character.

@item 
gh-145105@footnote{https://github.com/python/cpython/issues/145105}: Fix crash in @ref{2d,,csv} reader when iterating with a re-entrant
iterator that calls @ref{9de,,next()} on the same reader from within
@code{__next__}.

@item 
gh-105936@footnote{https://github.com/python/cpython/issues/105936}: Attempting to mutate non-field attributes of @ref{33,,dataclasses}
with both `frozen' and `slots' being @code{True} now raises
@ref{179b,,FrozenInstanceError} instead of @ref{199,,TypeError}.
Their non-dataclass subclasses can now freely mutate non-field attributes,
and the original non-slotted class can be garbage collected.

@item 
gh-140287@footnote{https://github.com/python/cpython/issues/140287}: The @ref{b,,asyncio} REPL now handles exceptions when executing
@geindex PYTHONSTARTUP
@geindex environment variable; PYTHONSTARTUP
@ref{1ba,,PYTHONSTARTUP} scripts. Patch by Bartosz Sławecki.

@item 
gh-132631@footnote{https://github.com/python/cpython/issues/132631}: Fix “I/O operation on closed file” when parsing JSON Lines file
with @ref{87,,JSON CLI}.

@item 
gh-70039@footnote{https://github.com/python/cpython/issues/70039}: Fixed bug where @ref{1344,,smtplib.SMTP.starttls()} could fail if
@ref{179c,,smtplib.SMTP.connect()} is called explicitly rather than implicitly.

@item 
gh-83281@footnote{https://github.com/python/cpython/issues/83281}: @ref{3f,,email}: improve handling trailing garbage in address lists
to avoid throwing AttributeError in certain edge cases
@end itemize

@node Documentation<4>,Build<3>,Library<4>,Python 3 14 5 release candidate 1
@anchor{whatsnew/changelog id17}@anchor{179d}
@subsubsection Documentation



@itemize -

@item 
gh-148663@footnote{https://github.com/python/cpython/issues/148663}: Document that @ref{179e,,calendar.IllegalMonthError} is a subclass
of both @ref{2ee,,ValueError} and @ref{1741,,IndexError} since Python 3.12.

@item 
gh-146646@footnote{https://github.com/python/cpython/issues/146646}: Document that @ref{5a0,,glob.glob()}, @ref{a0e,,glob.iglob()},
@ref{538,,pathlib.Path.glob()}, and @ref{539,,pathlib.Path.rglob()} silently
suppress @ref{2c2,,OSError} exceptions raised from scanning the filesystem.
@end itemize

@node Build<3>,Windows<2>,Documentation<4>,Python 3 14 5 release candidate 1
@anchor{whatsnew/changelog id18}@anchor{179f}
@subsubsection Build



@itemize -

@item 
gh-149351@footnote{https://github.com/python/cpython/issues/149351}: Avoid possible broken macOS framework install names when
DESTDIR is specified during builds.

@item 
gh-146475@footnote{https://github.com/python/cpython/issues/146475}: Block Apple Clang from being used to build the JIT as it ships
without required LLVM tools.

@item 
gh-148535@footnote{https://github.com/python/cpython/issues/148535}: No longer use the @code{gcc -fprofile-update=atomic} flag on i686.
The flag has been added to fix a random GCC internal error on PGO build
(gh-145801@footnote{https://github.com/python/cpython/issues/145801}) caused by corruption of profile data (.gcda files). The
problem is that it makes the PGO build way slower (up to 47x slower) on
i686. Since the GCC internal error was not seen on i686 so far, don’t use
@code{-fprofile-update=atomic} on i686 anymore. Patch by Victor Stinner.

@item 
gh-146264@footnote{https://github.com/python/cpython/issues/146264}: Fix static module builds on non-WASI targets by linking HACL
dependencies as static libraries when @code{MODULE_BUILDTYPE=static},
preventing duplicate @code{_Py_LibHacl_*} symbol errors at link time.
@end itemize

@node Windows<2>,macOS<3>,Build<3>,Python 3 14 5 release candidate 1
@anchor{whatsnew/changelog id19}@anchor{17a0}
@subsubsection Windows



@itemize -

@item 
gh-149254@footnote{https://github.com/python/cpython/issues/149254}: Updated bundled version of OpenSSL to 3.0.20.

@item 
gh-146458@footnote{https://github.com/python/cpython/issues/146458}: Fix incorrect REPL height and width tracking on console window
resize on Windows.
@end itemize

@node macOS<3>,,Windows<2>,Python 3 14 5 release candidate 1
@anchor{whatsnew/changelog id20}@anchor{17a1}
@subsubsection macOS



@itemize -

@item 
gh-149254@footnote{https://github.com/python/cpython/issues/149254}: Update macOS installer to use OpenSSL 3.0.20.
@end itemize

@node Python 3 14 4 final,Python 3 14 3 final,Python 3 14 5 release candidate 1,Changelog
@anchor{whatsnew/changelog python-3-14-4-final}@anchor{17a2}
@subsection Python 3.14.4 final


`Release date: 2026-04-07'

@menu
* Security: Security<4>. 
* Core and Builtins: Core and Builtins<5>. 
* Library: Library<5>. 
* Documentation: Documentation<5>. 
* Tests: Tests<4>. 
* Build: Build<4>. 
* Windows: Windows<3>. 
* macOS: macOS<4>. 
* C API: C API<3>. 

@end menu

@node Security<4>,Core and Builtins<5>,,Python 3 14 4 final
@anchor{whatsnew/changelog id21}@anchor{17a3}
@subsubsection Security



@itemize -

@item 
gh-145986@footnote{https://github.com/python/cpython/issues/145986}: @ref{12d,,xml.parsers.expat}: Fixed a crash caused by unbounded C
recursion when converting deeply nested XML content models with
@ref{17a4,,ElementDeclHandler()}. This addresses
@geindex Common Vulnerabilities and Exposures; CVE 2026-4224
CVE 2026-4224@footnote{https://www.cve.org/CVERecord?id=CVE-2026-4224}.

@item 
gh-145599@footnote{https://github.com/python/cpython/issues/145599}: Reject control characters in @ref{e04,,http.cookies.Morsel}
@ref{10cf,,update()} and
@ref{178d,,js_output()}. This addresses
@geindex Common Vulnerabilities and Exposures; CVE 2026-3644
CVE 2026-3644@footnote{https://www.cve.org/CVERecord?id=CVE-2026-3644}.

@item 
gh-145506@footnote{https://github.com/python/cpython/issues/145506}: Fixes 
@geindex Common Vulnerabilities and Exposures; CVE 2026-2297
CVE 2026-2297@footnote{https://www.cve.org/CVERecord?id=CVE-2026-2297} by ensuring that
@code{SourcelessFileLoader} uses @ref{17a5,,io.open_code()} when opening @code{.pyc}
files.

@item 
gh-144370@footnote{https://github.com/python/cpython/issues/144370}: Disallow usage of control characters in status in
@ref{120,,wsgiref.handlers} to prevent HTTP header injections. Patch by
Benedikt Johannes.

@item 
gh-143930@footnote{https://github.com/python/cpython/issues/143930}: Reject leading dashes in URLs passed to
@ref{17a6,,webbrowser.open()}.
@end itemize

@node Core and Builtins<5>,Library<5>,Security<4>,Python 3 14 4 final
@anchor{whatsnew/changelog id22}@anchor{17a7}
@subsubsection Core and Builtins



@itemize -

@item 
gh-148157@footnote{https://github.com/python/cpython/issues/148157}: Fix an unlikely crash when parsing an invalid type comments for
function parameters. Found by OSS Fuzz in #492782951@footnote{https://issues.oss-fuzz.com/issues/492782951}.

@item 
gh-148144@footnote{https://github.com/python/cpython/issues/148144}: Initialize @code{_PyInterpreterFrame.visited} when copying
interpreter frames so incremental GC does not read an uninitialized byte
from generator and frame-object copies.

@item 
gh-146615@footnote{https://github.com/python/cpython/issues/146615}: Fix a crash in @ref{16f4,,__get__()} for
@ref{b6e,,METH_METHOD} descriptors when an invalid (non-type) object is
passed as the second argument. Patch by Steven Sun.

@item 
gh-146308@footnote{https://github.com/python/cpython/issues/146308}: Fixed several error handling issues in the
@code{_remote_debugging} module, including safer validation of remote
@code{int} objects, clearer asyncio task chain failures, and cache cleanup
fixes that avoid leaking or double-freeing metadata on allocation failure.
Patch by Pablo Galindo.

@item 
gh-146128@footnote{https://github.com/python/cpython/issues/146128}: Fix a bug which could cause constant values to be partially
corrupted in AArch64 JIT code. This issue is theoretical, and hasn’t
actually been observed in unmodified Python interpreters.

@item 
gh-146250@footnote{https://github.com/python/cpython/issues/146250}: Fixed a memory leak in @ref{18f,,SyntaxError} when re-initializing
it.

@item 
gh-146245@footnote{https://github.com/python/cpython/issues/146245}: Fixed reference leaks in @ref{d1,,socket} when audit hooks raise
exceptions in @ref{17a8,,socket.getaddrinfo()} and @code{socket.sendto()}.

@item 
gh-146196@footnote{https://github.com/python/cpython/issues/146196}: Fix potential Undefined Behavior in
@ref{3b7,,PyUnicodeWriter_WriteASCII()} by adding a zero-length check. Patch
by Shamil Abdulaev.

@item 
gh-146227@footnote{https://github.com/python/cpython/issues/146227}: Fix wrong type in @code{_Py_atomic_load_uint16} in the C11 atomics
backend (@code{pyatomic_std.h}), which used a 32-bit atomic load instead of
16-bit. Found by Mohammed Zuhaib.

@item 
gh-146056@footnote{https://github.com/python/cpython/issues/146056}: Fix @ref{1c3,,repr()} for lists and tuples containing @code{NULL}s.

@item 
gh-146092@footnote{https://github.com/python/cpython/issues/146092}: Handle properly memory allocation failures on str and float
opcodes. Patch by Victor Stinner.

@item 
gh-146041@footnote{https://github.com/python/cpython/issues/146041}: Fix free-threading scaling bottleneck in @ref{14e7,,sys.intern()} and
@ref{17a9,,PyObject_SetAttr()} by avoiding the interpreter-wide lock when the
string is already interned and immortalized.

@item 
gh-145990@footnote{https://github.com/python/cpython/issues/145990}: @code{python --help-env} sections are now sorted by environment
variable name.

@item 
gh-145990@footnote{https://github.com/python/cpython/issues/145990}: @code{python --help-xoptions} is now sorted by @code{-X} option name.

@item 
gh-145376@footnote{https://github.com/python/cpython/issues/145376}: Fix GC tracking in @code{structseq.__replace__()}.

@item 
gh-145792@footnote{https://github.com/python/cpython/issues/145792}: Fix out-of-bounds access when invoking faulthandler on a
CPython build compiled without support for VLAs.

@item 
gh-142183@footnote{https://github.com/python/cpython/issues/142183}: Avoid a pathological case where repeated calls at a specific
stack depth could be significantly slower.

@item 
gh-145779@footnote{https://github.com/python/cpython/issues/145779}: Improve scaling of @ref{48f,,classmethod()} and @ref{451,,staticmethod()}
calls in the free-threaded build by avoiding the descriptor @code{__get__}
call.

@item 
gh-145783@footnote{https://github.com/python/cpython/issues/145783}: Fix an unlikely crash in the parser when certain errors were
erroneously not propagated. Found by OSS Fuzz in #491369109@footnote{https://issues.oss-fuzz.com/issues/491369109}.

@item 
gh-145685@footnote{https://github.com/python/cpython/issues/145685}: Improve scaling of type attribute lookups in the
@ref{1791,,free-threaded build} by avoiding contention on the internal type
lock.

@item 
gh-145701@footnote{https://github.com/python/cpython/issues/145701}: Fix @ref{796,,SystemError} when @code{__classdict__} or
@code{__conditional_annotations__} is in a class-scope inlined comprehension.
Found by OSS Fuzz in #491105000@footnote{https://issues.oss-fuzz.com/issues/491105000}.

@item 
gh-145713@footnote{https://github.com/python/cpython/issues/145713}: Make @ref{17aa,,bytearray.resize()} thread-safe in the free-threaded
build by using a critical section and calling the lock-held variant of the
resize function.

@item 
gh-145615@footnote{https://github.com/python/cpython/issues/145615}: Fixed a memory leak in the @ref{1791,,free-threaded build} where
mimalloc pages could become permanently unreclaimable until the owning
thread exited.

@item 
gh-145566@footnote{https://github.com/python/cpython/issues/145566}: In the free threading build, skip the stop-the-world pause when
reassigning @code{__class__} on a newly created object.

@item 
gh-145335@footnote{https://github.com/python/cpython/issues/145335}: Fix a crash in @ref{1307,,os.pathconf()} when called with @code{-1} as
the path argument.

@item 
gh-145036@footnote{https://github.com/python/cpython/issues/145036}: In free-threaded build, fix race condition when calling
@code{__sizeof__()} on a @ref{24f,,list}

@item 
gh-145376@footnote{https://github.com/python/cpython/issues/145376}: Fix reference leaks in various unusual error scenarios.

@item 
gh-145234@footnote{https://github.com/python/cpython/issues/145234}: Fixed a @code{SystemError} in the parser when an encoding cookie
(for example, UTF-7) decodes to carriage returns (@code{\r}). Newlines are
now normalized after decoding in the string tokenizer.

Patch by Pablo Galindo.

@item 
gh-130555@footnote{https://github.com/python/cpython/issues/130555}: Fix use-after-free in @ref{17ab,,dict.clear()} when the dictionary
values are embedded in an object and a destructor causes re-entrant
mutation of the dictionary.

@item 
gh-145187@footnote{https://github.com/python/cpython/issues/145187}: Fix compiler assertion fail when a type parameter bound
contains an invalid expression in a conditional block.

@item 
gh-145142@footnote{https://github.com/python/cpython/issues/145142}: Fix a crash in the free-threaded build when the dictionary
argument to @ref{fdf,,str.maketrans()} is concurrently modified.

@item 
gh-144872@footnote{https://github.com/python/cpython/issues/144872}: Fix heap buffer overflow in the parser found by OSS-Fuzz.

@item 
gh-144766@footnote{https://github.com/python/cpython/issues/144766}: Fix a crash in fork child process when perf support is enabled.

@item 
gh-144759@footnote{https://github.com/python/cpython/issues/144759}: Fix undefined behavior in the lexer when @code{start} and
@code{multi_line_start} pointers are @code{NULL} in
@code{_PyLexer_remember_fstring_buffers()} and
@code{_PyLexer_restore_fstring_buffers()}. The @code{NULL} pointer arithmetic
(@code{NULL - valid_pointer}) is now guarded with explicit @code{NULL} checks.

@item 
gh-144563@footnote{https://github.com/python/cpython/issues/144563}: Fix interaction of the Tachyon profiler and @ref{2e,,ctypes} and
other modules that load the Python shared library (if present) in an
independent map as this was causing the mechanism that loads the binary
information to be confused. Patch by Pablo Galindo

@item 
gh-144601@footnote{https://github.com/python/cpython/issues/144601}: Fix crash when importing a module whose @code{PyInit} function
raises an exception from a subinterpreter.

@item 
gh-144438@footnote{https://github.com/python/cpython/issues/144438}: Align the QSBR thread state array to a 64-byte cache line
boundary to avoid false sharing in the @ref{1791,,free-threaded build}.

@item 
gh-144513@footnote{https://github.com/python/cpython/issues/144513}: Fix potential deadlock when using critical sections during
stop-the-world pauses in the free-threaded build.

@item 
gh-144446@footnote{https://github.com/python/cpython/issues/144446}: Fix data races in the free-threaded build when reading frame
object attributes while another thread is executing the frame.

@item 
gh-143636@footnote{https://github.com/python/cpython/issues/143636}: Fix a crash when calling @ref{4e6,,SimpleNamespace.__replace__()} on non-namespace instances. Patch by Bénédikt
Tran.

@item 
gh-143650@footnote{https://github.com/python/cpython/issues/143650}: Fix race condition in @ref{7b,,importlib} where a thread could
receive a stale module reference when another thread’s import fails.

@item 
gh-141732@footnote{https://github.com/python/cpython/issues/141732}: Ensure the @ref{830,,__repr__()} for @ref{4d3,,ExceptionGroup}
and @ref{566,,BaseExceptionGroup} does not change when the exception sequence
that was original passed in to its constructor is subsequently mutated.

@item 
gh-140594@footnote{https://github.com/python/cpython/issues/140594}: Fix an out of bounds read when a single NUL character is read
from the standard input. Patch by Shamil Abdulaev.

@item 
gh-91636@footnote{https://github.com/python/cpython/issues/91636}: While performing garbage collection, clear weakrefs to
unreachable objects that are created during running of finalizers.  If
those weakrefs were are not cleared, they could reveal unreachable
objects.

@item 
gh-130327@footnote{https://github.com/python/cpython/issues/130327}: Fix erroneous clearing of an object’s @ref{77e,,__dict__}
if overwritten at runtime.

@item 
gh-80667@footnote{https://github.com/python/cpython/issues/80667}: Literals using the @code{\N@{name@}} escape syntax can now construct
CJK ideographs and Hangul syllables using case-insensitive names.
@end itemize

@node Library<5>,Documentation<5>,Core and Builtins<5>,Python 3 14 4 final
@anchor{whatsnew/changelog id23}@anchor{17ac}
@subsubsection Library



@itemize -

@item 
gh-144503@footnote{https://github.com/python/cpython/issues/144503}: Fix a regression introduced in 3.14.3 and 3.13.12 where the
@ref{98,,multiprocessing} @code{forkserver} start method would fail with
@ref{1262,,BrokenPipeError} when the parent process had a very large
@ref{1470,,sys.argv}.  The argv is now passed to the forkserver as separate
command-line arguments rather than being embedded in the @code{-c} command
string, avoiding the operating system’s per-argument length limit.

@item 
gh-146613@footnote{https://github.com/python/cpython/issues/146613}: @ref{85,,itertools}: Fix a crash in @ref{17ad,,itertools.groupby()} when
the grouper iterator is concurrently mutated.

@item 
gh-146080@footnote{https://github.com/python/cpython/issues/146080}: @ref{d5,,ssl}: fix a crash when an SNI callback tries to use an
SSL object that has already been garbage-collected. Patch by Bénédikt
Tran.

@item 
gh-146556@footnote{https://github.com/python/cpython/issues/146556}: Fix @ref{457,,annotationlib.get_annotations()} hanging indefinitely
when called with @code{eval_str=True} on a callable that has a circular
@code{__wrapped__} chain (e.g. @code{f.__wrapped__ = f}). Cycle detection using
an id-based visited set now stops the traversal and falls back to the
globals found so far, mirroring the approach of @ref{1162,,inspect.unwrap()}.

@item 
gh-146090@footnote{https://github.com/python/cpython/issues/146090}: @ref{d4,,sqlite3}: fix a crash when
@ref{888,,sqlite3.Connection.create_collation()} fails with SQLITE_BUSY@footnote{https://sqlite.org/rescode.html#busy}. Patch by Bénédikt Tran.

@item 
gh-146090@footnote{https://github.com/python/cpython/issues/146090}: @ref{d4,,sqlite3}: properly raise @ref{1761,,MemoryError} instead of
@ref{796,,SystemError} when a context callback fails to be allocated. Patch by
Bénédikt Tran.

@item 
gh-145633@footnote{https://github.com/python/cpython/issues/145633}: Fix @code{struct.pack('f', float)}: use @ref{96f,,PyFloat_Pack4()} to
raise @ref{a87,,OverflowError}. Patch by Sergey B Kirpichev and Victor
Stinner.

@item 
gh-146310@footnote{https://github.com/python/cpython/issues/146310}: The @ref{59,,ensurepip} module no longer looks for @code{pip-*.whl}
wheel packages in the current directory.

@item 
gh-146083@footnote{https://github.com/python/cpython/issues/146083}: Update bundled libexpat@footnote{https://libexpat.github.io/} to
version 2.7.5.

@item 
gh-146076@footnote{https://github.com/python/cpython/issues/146076}: @ref{13b,,zoneinfo}: fix crashes when deleting @code{_weak_cache} from
a @ref{ae2,,zoneinfo.ZoneInfo} subclass.

@item 
gh-146054@footnote{https://github.com/python/cpython/issues/146054}: Limit the size of @ref{17ae,,encodings.search_function()} cache.
Found by OSS Fuzz in #493449985@footnote{https://issues.oss-fuzz.com/issues/493449985}.

@item 
gh-146004@footnote{https://github.com/python/cpython/issues/146004}: All @ref{170,,-X} options from the Python command line are now
propagated to child processes spawned by @ref{98,,multiprocessing}, not just
a hard-coded subset.  This makes the behavior consistent between default
“spawn” and “forkserver” start methods and the old “fork” start method.
The options that were previously not propagated are:
@code{context_aware_warnings}, @code{cpu_count}, @code{disable-remote-debug},
@code{int_max_str_digits}, @code{lazy_imports}, @code{no_debug_ranges},
@code{pathconfig_warnings}, @code{perf}, @code{perf_jit}, @code{presite},
@code{pycache_prefix}, @code{thread_inherit_context}, and
@code{warn_default_encoding}.

@item 
gh-145883@footnote{https://github.com/python/cpython/issues/145883}: @ref{13b,,zoneinfo}: Fix heap buffer overflow reads from malformed
TZif data. Found by OSS Fuzz, issues #492245058@footnote{https://issues.oss-fuzz.com/issues/492245058} and
#492230068@footnote{https://issues.oss-fuzz.com/issues/492230068}.

@item 
gh-145754@footnote{https://github.com/python/cpython/issues/145754}: Request signature during mock autospec with @code{FORWARDREF}
annotation format. This prevents runtime errors when an annotation uses a
name that is not defined at runtime.

@item 
gh-145750@footnote{https://github.com/python/cpython/issues/145750}: Avoid undefined behaviour from signed integer overflow when
parsing format strings in the @ref{db,,struct} module. Found by OSS Fuzz in
#488466741@footnote{https://issues.oss-fuzz.com/issues/488466741}.

@item 
gh-145492@footnote{https://github.com/python/cpython/issues/145492}: Fix infinite recursion in @ref{13c8,,collections.defaultdict}
@code{__repr__} when a @code{defaultdict} contains itself. Based on analysis by
KowalskiThomas in gh-145492@footnote{https://github.com/python/cpython/issues/145492}.

@item 
gh-145623@footnote{https://github.com/python/cpython/issues/145623}: Fix crash in @ref{db,,struct} when calling @ref{1c3,,repr()} or
@code{__sizeof__()} on an uninitialized @ref{17af,,struct.Struct} object created
via @code{Struct.__new__()} without calling @code{__init__()}.

@item 
gh-145616@footnote{https://github.com/python/cpython/issues/145616}: Detect Android sysconfig ABI correctly on 32-bit ARM Android on
64-bit ARM kernel

@item 
gh-145551@footnote{https://github.com/python/cpython/issues/145551}: Fix InvalidStateError when cancelling process created by
@ref{c71,,asyncio.create_subprocess_exec()} or
@ref{c72,,asyncio.create_subprocess_shell()}. Patch by Daan De Meyer.

@item 
gh-145446@footnote{https://github.com/python/cpython/issues/145446}: Now @ref{63,,functools} is safer in free-threaded build when using
keywords in @ref{219,,functools.partial()}

@item 
gh-145417@footnote{https://github.com/python/cpython/issues/145417}: @ref{118,,venv}: Prevent incorrect preservation of SELinux context
when copying the @code{Activate.ps1} script. The script inherited the SELinux
security context of the system template directory, rather than the
destination project directory.

@item 
gh-145376@footnote{https://github.com/python/cpython/issues/145376}: Fix double free and null pointer dereference in unusual error
scenarios in @ref{6c,,hashlib} and @ref{6e,,hmac} modules.

@item 
gh-145301@footnote{https://github.com/python/cpython/issues/145301}: @ref{6e,,hmac}: fix a crash when the initialization of the
underlying C extension module fails.

@item 
gh-145301@footnote{https://github.com/python/cpython/issues/145301}: @ref{6c,,hashlib}: fix a crash when the initialization of the
underlying C extension module fails.

@item 
gh-145264@footnote{https://github.com/python/cpython/issues/145264}: Base64 decoder (see @ref{17b0,,binascii.a2b_base64()},
@ref{17b1,,base64.b64decode()}, etc) no longer ignores excess data after the
first padded quad in non-strict (default) mode.  Instead, in conformance
with 
@geindex RFC; RFC 4648
RFC 4648@footnote{https://datatracker.ietf.org/doc/html/rfc4648.html}, section 3.3, it now ignores the pad character, “=”, if
it is present before the end of the encoded data.

@item 
gh-145158@footnote{https://github.com/python/cpython/issues/145158}: Avoid undefined behaviour from signed integer overflow when
parsing format strings in the @ref{db,,struct} module.

@item 
gh-144984@footnote{https://github.com/python/cpython/issues/144984}: Fix crash in
@ref{17b2,,xml.parsers.expat.xmlparser.ExternalEntityParserCreate()} when an
allocation fails. The error paths could dereference NULL @code{handlers} and
double-decrement the parent parser’s reference count.

@item 
gh-88091@footnote{https://github.com/python/cpython/issues/88091}: Fix @ref{17b3,,unicodedata.decomposition()} for Hangul characters.

@item 
gh-144986@footnote{https://github.com/python/cpython/issues/144986}: Fix a memory leak in @ref{a84,,atexit.register()}. Patch by Shamil
Abdulaev.

@item 
gh-144777@footnote{https://github.com/python/cpython/issues/144777}: Fix data races in @ref{17b4,,io.IncrementalNewlineDecoder} in the
@ref{1791,,free-threaded build}.

@item 
gh-144809@footnote{https://github.com/python/cpython/issues/144809}: Make @ref{7f5,,collections.deque} copy atomic in the
@ref{1791,,free-threaded build}.

@item 
gh-144835@footnote{https://github.com/python/cpython/issues/144835}: Added missing explanations for some parameters in
@ref{5a0,,glob.glob()} and @ref{a0e,,glob.iglob()}.

@item 
gh-144833@footnote{https://github.com/python/cpython/issues/144833}: Fixed a use-after-free in @ref{d5,,ssl} when @code{SSL_new()} returns
NULL in @code{newPySSLSocket()}. The error was reported via a dangling
pointer after the object had already been freed.

@item 
gh-144782@footnote{https://github.com/python/cpython/issues/144782}: Fix @ref{1bf,,argparse.ArgumentParser} to be @ref{ab,,pickleable}.

@item 
gh-144259@footnote{https://github.com/python/cpython/issues/144259}: Fix inconsistent display of long multiline pasted content in
the REPL.

@item 
gh-144156@footnote{https://github.com/python/cpython/issues/144156}: Fix the folding of headers by the @ref{3f,,email} library when
@geindex RFC; RFC 2047
RFC 2047@footnote{https://datatracker.ietf.org/doc/html/rfc2047.html} encoded words are used.  Now whitespace is correctly preserved
and also correctly added between adjacent encoded words.  The latter
property was broken by the fix for gh-92081@footnote{https://github.com/python/cpython/issues/92081}, which mostly fixed previous
failures to preserve whitespace.

@item 
gh-66305@footnote{https://github.com/python/cpython/issues/66305}: Fixed a hang on Windows in the @ref{e6,,tempfile} module when
trying to create a temporary file or subdirectory in a non-writable
directory.

@item 
gh-140814@footnote{https://github.com/python/cpython/issues/140814}: @ref{17b5,,multiprocessing.freeze_support()} no longer sets the
default start method as a side effect, which previously caused a
subsequent @ref{24d,,multiprocessing.set_start_method()} call to raise
@ref{246,,RuntimeError}.

@item 
gh-144475@footnote{https://github.com/python/cpython/issues/144475}: Calling @ref{1c3,,repr()} on @ref{219,,functools.partial()} is now safer
when the partial object’s internal attributes are replaced while the
string representation is being generated.

@item 
gh-144538@footnote{https://github.com/python/cpython/issues/144538}: Bump the version of pip bundled in ensurepip to version 26.0.1

@item 
gh-144494@footnote{https://github.com/python/cpython/issues/144494}: Fix performance regression in @ref{b55,,asyncio.all_tasks()} on
@ref{1791,,free-threaded builds}. Patch by Kumar Aditya.

@item 
gh-144316@footnote{https://github.com/python/cpython/issues/144316}: Fix crash in @code{_remote_debugging} that caused
@code{test_external_inspection} to intermittently fail. Patch by Taegyun Kim.

@item 
gh-144363@footnote{https://github.com/python/cpython/issues/144363}: Update bundled libexpat@footnote{https://libexpat.github.io/} to
2.7.4

@item 
gh-143637@footnote{https://github.com/python/cpython/issues/143637}: Fixed a crash in socket.sendmsg() that could occur if ancillary
data is mutated re-entrantly during argument parsing.

@item 
gh-143543@footnote{https://github.com/python/cpython/issues/143543}: Fix a crash in itertools.groupby that could occur when a
user-defined @ref{cf8,,__eq__()} method re-enters the iterator during
key comparison.

@item 
gh-140652@footnote{https://github.com/python/cpython/issues/140652}: Fix a crash in @code{_interpchannels.list_all()} after closing
a channel.

@item 
gh-143698@footnote{https://github.com/python/cpython/issues/143698}: Allow `scheduler' and `setpgroup' arguments to be explicitly
@ref{887,,None} when calling @ref{52f,,os.posix_spawn()} or
@ref{17b6,,os.posix_spawnp()}. Patch by Bénédikt Tran.

@item 
gh-143698@footnote{https://github.com/python/cpython/issues/143698}: Raise @ref{199,,TypeError} instead of @ref{796,,SystemError} when the
`scheduler' in @ref{52f,,os.posix_spawn()} or @ref{17b6,,os.posix_spawnp()} is not a
tuple. Patch by Bénédikt Tran.

@item 
gh-142516@footnote{https://github.com/python/cpython/issues/142516}: @ref{d5,,ssl}: fix reference leaks in @ref{355,,ssl.SSLContext}
objects. Patch by Bénédikt Tran.

@item 
gh-143304@footnote{https://github.com/python/cpython/issues/143304}: Fix @ref{be2,,ctypes.CDLL} to honor the @code{handle} parameter on
POSIX systems.

@item 
gh-142781@footnote{https://github.com/python/cpython/issues/142781}: @ref{13b,,zoneinfo}: fix a crash when instantiating
@ref{ae2,,ZoneInfo} objects for which the internal class-level
cache is inconsistent.

@item 
gh-142763@footnote{https://github.com/python/cpython/issues/142763}: Fix a race condition between @ref{ae2,,zoneinfo.ZoneInfo}
creation and @ref{17b7,,zoneinfo.ZoneInfo.clear_cache()} that could raise
@ref{5e7,,KeyError}.

@item 
gh-142787@footnote{https://github.com/python/cpython/issues/142787}: Fix assertion failure in @ref{d4,,sqlite3} blob subscript when
slicing with indices that result in an empty slice.

@item 
gh-142352@footnote{https://github.com/python/cpython/issues/142352}: Fix @ref{81a,,asyncio.StreamWriter.start_tls()} to transfer buffered
data from @ref{17b8,,StreamReader} to the SSL layer, preventing data
loss when upgrading a connection to TLS mid-stream (e.g., when
implementing PROXY protocol support).

@item 
gh-141707@footnote{https://github.com/python/cpython/issues/141707}: Don’t change @ref{141d,,tarfile.TarInfo} type from @code{AREGTYPE} to
@code{DIRTYPE} when parsing GNU long name or link headers.

@item 
gh-139933@footnote{https://github.com/python/cpython/issues/139933}: Improve @ref{5f0,,AttributeError} suggestions for classes with a
custom @ref{17b9,,__dir__()} method returning a list of unsortable
values. Patch by Bénédikt Tran.

@item 
gh-137335@footnote{https://github.com/python/cpython/issues/137335}: Get rid of any possibility of a name conflict for named pipes
in @ref{98,,multiprocessing} and @ref{b,,asyncio} on Windows, no matter how
small.

@item 
gh-80667@footnote{https://github.com/python/cpython/issues/80667}: Support lookup for Tangut Ideographs in @ref{10c,,unicodedata}.

@item 
bpo-40243@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40243}: Fix @code{unicodedata.ucd_3_2_0.numeric()} for non-decimal
values.
@end itemize

@node Documentation<5>,Tests<4>,Library<5>,Python 3 14 4 final
@anchor{whatsnew/changelog id26}@anchor{17ba}
@subsubsection Documentation



@itemize -

@item 
gh-126676@footnote{https://github.com/python/cpython/issues/126676}: Expand @ref{7,,argparse} documentation for @code{type=bool} with a
demonstration of the surprising behavior and pointers to common
alternatives.

@item 
gh-145649@footnote{https://github.com/python/cpython/issues/145649}: Fix text wrapping and formatting of @code{-X} option descriptions
in the @code{python(1)@footnote{https://manpages.debian.org/python(1)}} man page by using proper roff markup.

@item 
gh-145450@footnote{https://github.com/python/cpython/issues/145450}: Document missing public @ref{335,,wave.Wave_write} getter
methods.

@item 
gh-136246@footnote{https://github.com/python/cpython/issues/136246}: A new “Improve this page” link is available in the left-hand
sidebar of the docs, offering links to create GitHub issues, discussion
forum posts, or pull requests.
@end itemize

@node Tests<4>,Build<4>,Documentation<5>,Python 3 14 4 final
@anchor{whatsnew/changelog id27}@anchor{17bb}
@subsubsection Tests



@itemize -

@item 
gh-144418@footnote{https://github.com/python/cpython/issues/144418}: The Android testbed’s emulator RAM has been increased from 2 GB
to 4 GB.

@item 
gh-146202@footnote{https://github.com/python/cpython/issues/146202}: Fix a race condition in regrtest: make sure that the temporary
directory is created in the worker process. Previously, temp_cwd() could
fail on Windows if the “build” directory was not created.  Patch by Victor
Stinner.

@item 
gh-144739@footnote{https://github.com/python/cpython/issues/144739}: When Python was compiled with system expat older then 2.7.2 but
tests run with newer expat, still skip
@code{test.test_pyexpat.MemoryProtectionTest}.
@end itemize

@node Build<4>,Windows<3>,Tests<4>,Python 3 14 4 final
@anchor{whatsnew/changelog id28}@anchor{17bc}
@subsubsection Build



@itemize -

@item 
gh-146541@footnote{https://github.com/python/cpython/issues/146541}: The Android testbed can now be built for 32-bit ARM and x86
targets.

@item 
gh-146498@footnote{https://github.com/python/cpython/issues/146498}: The iOS XCframework build script now ensures libpython isn’t
included in installed app content, and is more robust in identifying
standard library binary content that requires processing.

@item 
gh-146450@footnote{https://github.com/python/cpython/issues/146450}: The Android build script was modified to improve parity with
other platform build scripts.

@item 
gh-146446@footnote{https://github.com/python/cpython/issues/146446}: The clean target for the Apple/iOS XCframework build script is
now more selective when targeting a single architecture.

@item 
gh-145801@footnote{https://github.com/python/cpython/issues/145801}: When Python build is optimized with GCC using PGO, use
@code{-fprofile-update=atomic} option to use atomic operations when updating
profile information. This option reduces the risk of gcov Data Files
(.gcda) corruption which can cause random GCC crashes. Patch by Victor
Stinner.
@end itemize

@node Windows<3>,macOS<4>,Build<4>,Python 3 14 4 final
@anchor{whatsnew/changelog id29}@anchor{17bd}
@subsubsection Windows



@itemize -

@item 
gh-145307@footnote{https://github.com/python/cpython/issues/145307}: Defers loading of the @code{psapi.dll} module until it is used by
@ref{1f2,,ctypes.util.dllist()}.

@item 
gh-144551@footnote{https://github.com/python/cpython/issues/144551}: Updated bundled version of OpenSSL to 3.0.19.

@item 
gh-140131@footnote{https://github.com/python/cpython/issues/140131}: Fix REPL cursor position on Windows when module completion
suggestion line hits console width.
@end itemize

@node macOS<4>,C API<3>,Windows<3>,Python 3 14 4 final
@anchor{whatsnew/changelog id30}@anchor{17be}
@subsubsection macOS



@itemize -

@item 
gh-144551@footnote{https://github.com/python/cpython/issues/144551}: Update macOS installer to use OpenSSL 3.0.19.

@item 
gh-137586@footnote{https://github.com/python/cpython/issues/137586}: Invoke @code{osascript} with absolute path in
@ref{11c,,webbrowser} and @code{turtledemo}.
@end itemize

@node C API<3>,,macOS<4>,Python 3 14 4 final
@anchor{whatsnew/changelog id31}@anchor{17bf}
@subsubsection C API



@itemize -

@item 
gh-146056@footnote{https://github.com/python/cpython/issues/146056}: @ref{3b9,,PyUnicodeWriter_WriteRepr()} now supports @code{NULL}
argument.

@item 
gh-145010@footnote{https://github.com/python/cpython/issues/145010}: Use GCC dialect alternatives for inline assembly in
@code{object.h} so that the Python headers compile correctly with
@code{-masm=intel}.

@item 
gh-144981@footnote{https://github.com/python/cpython/issues/144981}: Made @ref{17c0,,PyUnstable_Code_SetExtra()},
@ref{17c1,,PyUnstable_Code_GetExtra()}, and
@ref{17c2,,PyUnstable_Eval_RequestCodeExtraIndex()} thread-safe on the
@ref{1f6,,free threaded} build.
@end itemize

@node Python 3 14 3 final,Python 3 14 2 final,Python 3 14 4 final,Changelog
@anchor{whatsnew/changelog python-3-14-3-final}@anchor{17c3}
@subsection Python 3.14.3 final


`Release date: 2026-02-03'

@menu
* Windows: Windows<4>. 
* Tools/Demos:: 
* Tests: Tests<5>. 
* Security: Security<5>. 
* Library: Library<6>. 
* IDLE: IDLE<4>. 
* Documentation: Documentation<6>. 
* Core and Builtins: Core and Builtins<6>. 
* C API: C API<4>. 
* Build: Build<5>. 

@end menu

@node Windows<4>,Tools/Demos,,Python 3 14 3 final
@anchor{whatsnew/changelog id32}@anchor{17c4}
@subsubsection Windows



@itemize -

@item 
gh-128067@footnote{https://github.com/python/cpython/issues/128067}: Fix a bug in PyREPL on Windows where output without a trailing
newline was overwritten by the next prompt.
@end itemize

@node Tools/Demos,Tests<5>,Windows<4>,Python 3 14 3 final
@anchor{whatsnew/changelog tools-demos}@anchor{17c5}
@subsubsection Tools/Demos



@itemize -

@item 
gh-142095@footnote{https://github.com/python/cpython/issues/142095}: Make gdb ‘py-bt’ command use frame from thread local state when
available. Patch by Sam Gross and Victor Stinner.
@end itemize

@node Tests<5>,Security<5>,Tools/Demos,Python 3 14 3 final
@anchor{whatsnew/changelog id33}@anchor{17c6}
@subsubsection Tests



@itemize -

@item 
gh-144415@footnote{https://github.com/python/cpython/issues/144415}: The Android testbed now distinguishes between stdout/stderr
messages which were triggered by a newline, and those triggered by a
manual call to @code{flush}. This fixes logging of progress indicators and
similar content.

@item 
gh-143460@footnote{https://github.com/python/cpython/issues/143460}: Skip tests relying on infinite recusion if stack size is
unlimited.

@item 
gh-65784@footnote{https://github.com/python/cpython/issues/65784}: Add support for parametrized resource @code{wantobjects} in
regrtests, which allows to run Tkinter tests with the specified value of
@code{tkinter.wantobjects}, for example @code{-u wantobjects=0}.

@item 
gh-143553@footnote{https://github.com/python/cpython/issues/143553}: Add support for parametrized resources, such as @code{-u
xpickle=2.7}.

@item 
gh-142836@footnote{https://github.com/python/cpython/issues/142836}: Accommodated Solaris in
@code{test_pdb.test_script_target_anonymous_pipe}.

@item 
bpo-31391@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31391}: Forward-port test_xpickle from Python 2 to Python 3 and add the
resource back to test’s command line.
@end itemize

@node Security<5>,Library<6>,Tests<5>,Python 3 14 3 final
@anchor{whatsnew/changelog id34}@anchor{17c7}
@subsubsection Security



@itemize -

@item 
gh-144125@footnote{https://github.com/python/cpython/issues/144125}: @ref{13db,,BytesGenerator} will now refuse to
serialize (write) headers that are unsafely folded or delimited; see
@ref{4f3,,verify_generated_headers}. (Contributed by Bas
Bloemsaat and Petr Viktorin in gh-121650@footnote{https://github.com/python/cpython/issues/121650}).

@item 
gh-143935@footnote{https://github.com/python/cpython/issues/143935}: Fixed a bug in the folding of comments when flattening an email
message using a modern email policy. Comments consisting of a very long
sequence of non-foldable characters could trigger a forced line wrap that
omitted the required leading space on the continuation line, causing the
remainder of the comment to be interpreted as a new header field. This
enabled header injection with carefully crafted inputs.

@item 
gh-143925@footnote{https://github.com/python/cpython/issues/143925}: Reject control characters in @code{data:} URL media types.

@item 
gh-143919@footnote{https://github.com/python/cpython/issues/143919}: Reject control characters in @ref{e04,,http.cookies.Morsel}
fields and values.

@item 
gh-143916@footnote{https://github.com/python/cpython/issues/143916}: Reject C0 control characters within wsgiref.headers.Headers
fields, values, and parameters.
@end itemize

@node Library<6>,IDLE<4>,Security<5>,Python 3 14 3 final
@anchor{whatsnew/changelog id35}@anchor{17c8}
@subsubsection Library



@itemize -

@item 
gh-144380@footnote{https://github.com/python/cpython/issues/144380}: Improve performance of @ref{141a,,io.BufferedReader} line
iteration by ~49%.

@item 
gh-144169@footnote{https://github.com/python/cpython/issues/144169}: Fix three crashes when non-string keyword arguments are
supplied to objects in the @ref{9,,ast} module.

@item 
gh-144100@footnote{https://github.com/python/cpython/issues/144100}: Fixed a crash in ctypes when using a deprecated
@code{POINTER(str)} type in @code{argtypes}. Instead of aborting, ctypes now
raises a proper Python exception when the pointer target type is
unresolved.

@item 
gh-144050@footnote{https://github.com/python/cpython/issues/144050}: Fix @ref{1357,,stat.filemode()} in the pure-Python implementation to
avoid misclassifying invalid mode values as block devices.

@item 
gh-144023@footnote{https://github.com/python/cpython/issues/144023}: Fixed validation of file descriptor 0 in posix functions when
used with follow_symlinks parameter.

@item 
gh-143999@footnote{https://github.com/python/cpython/issues/143999}: Fix an issue where @ref{1442,,inspect.getgeneratorstate()} and
@ref{1020,,inspect.getcoroutinestate()} could fail for generators wrapped by
@ref{108e,,types.coroutine()} in the suspended state.

@item 
gh-143831@footnote{https://github.com/python/cpython/issues/143831}: @ref{17c9,,annotationlib.ForwardRef} objects are now hashable when
created from annotation scopes with closures. Previously, hashing such
objects would throw an exception. Patch by Bartosz Sławecki.

@item 
gh-143874@footnote{https://github.com/python/cpython/issues/143874}: Fixed a bug in @ref{aa,,pdb} where expression results were not
sent back to remote client.

@item 
gh-143880@footnote{https://github.com/python/cpython/issues/143880}: Fix data race in @ref{219,,functools.partial()} in the @ref{1f6,,free threading} build.

@item 
gh-143706@footnote{https://github.com/python/cpython/issues/143706}: Fix @ref{98,,multiprocessing} forkserver so that @ref{1470,,sys.argv}
is correctly set before @code{__main__} is preloaded. Previously,
@code{sys.argv} was empty during main module import in forkserver child
processes. This fixes a regression introduced in 3.13.8 and 3.14.1. Root
caused by Aaron Wieczorek, test provided by Thomas Watson, thanks!

@item 
gh-143638@footnote{https://github.com/python/cpython/issues/143638}: Forbid reentrant calls of the @ref{c19,,pickle.Pickler} and
@ref{17ca,,pickle.Unpickler} methods for the C implementation. Previously,
this could cause crash or data corruption, now concurrent calls of methods
of the same object raise @ref{246,,RuntimeError}.

@item 
gh-78724@footnote{https://github.com/python/cpython/issues/78724}: Raise @ref{246,,RuntimeError}’s when user attempts to call methods
on half-initialized @ref{17af,,Struct} objects, For example, created
by @code{Struct.__new__(Struct)}.  Patch by Sergey B Kirpichev.

@item 
gh-143196@footnote{https://github.com/python/cpython/issues/143196}: Fix crash when the internal encoder object returned by
undocumented function @code{json.encoder.c_make_encoder()} was called with
non-zero second (`_current_indent_level') argument.

@item 
gh-143191@footnote{https://github.com/python/cpython/issues/143191}: @ref{17cb,,_thread.stack_size()} now raises @ref{2ee,,ValueError} if the
stack size is too small. Patch by Victor Stinner.

@item 
gh-143602@footnote{https://github.com/python/cpython/issues/143602}: Fix a inconsistency issue in @ref{15b7,,write()} that
leads to unexpected buffer overwrite by deduplicating the buffer exports.

@item 
gh-143547@footnote{https://github.com/python/cpython/issues/143547}: Fix @ref{508,,sys.unraisablehook()} when the hook raises an
exception and changes @code{sys.unraisablehook()}: hold a strong reference
to the old hook. Patch by Victor Stinner.

@item 
gh-143517@footnote{https://github.com/python/cpython/issues/143517}: @ref{457,,annotationlib.get_annotations()} no longer raises a
@ref{18f,,SyntaxError} when evaluating a stringified starred annotation that
starts with one or more whitespace characters followed by a @code{*}. Patch
by Bartosz Sławecki.

@item 
gh-143378@footnote{https://github.com/python/cpython/issues/143378}: Fix use-after-free crashes when a @ref{10aa,,BytesIO} object
is concurrently mutated during @ref{15b7,,write()} or
@ref{17cc,,writelines()}.

@item 
gh-143346@footnote{https://github.com/python/cpython/issues/143346}: Fix incorrect wrapping of the Base64 data in
@code{plistlib._PlistWriter} when the indent contains a mix of tabs and
spaces.

@item 
gh-143310@footnote{https://github.com/python/cpython/issues/143310}: @ref{f6,,tkinter}: fix a crash when a Python @ref{24f,,list} is
mutated during the conversion to a Tcl object (e.g., when setting a Tcl
variable). Patch by Bénédikt Tran.

@item 
gh-143309@footnote{https://github.com/python/cpython/issues/143309}: Fix a crash in @ref{1305,,os.execve()} on non-Windows platforms when
given a custom environment mapping which is then mutated during parsing.
Patch by Bénédikt Tran.

@item 
gh-143308@footnote{https://github.com/python/cpython/issues/143308}: @ref{ab,,pickle}: fix use-after-free crashes when a
@ref{1797,,PickleBuffer} is concurrently mutated by a custom buffer
callback during pickling. Patch by Bénédikt Tran and Aaron Wieczorek.

@item 
gh-143237@footnote{https://github.com/python/cpython/issues/143237}: Fix support of named pipes in the rotating @ref{8b,,logging}
handlers.

@item 
gh-143249@footnote{https://github.com/python/cpython/issues/143249}: Fix possible buffer leaks in Windows overlapped I/O on error
handling.

@item 
gh-143241@footnote{https://github.com/python/cpython/issues/143241}: @ref{13b,,zoneinfo}: fix infinite loop in @ref{17cd,,ZoneInfo.from_file} when parsing a malformed TZif file. Patch
by Fatih Celik.

@item 
gh-142830@footnote{https://github.com/python/cpython/issues/142830}: @ref{d4,,sqlite3}: fix use-after-free crashes when the
connection’s callbacks are mutated during a callback execution. Patch by
Bénédikt Tran.

@item 
gh-143200@footnote{https://github.com/python/cpython/issues/143200}: @ref{12c,,xml.etree.ElementTree}: fix use-after-free crashes in
@ref{588,,__getitem__()} and @ref{14d7,,__setitem__()} methods of
@ref{361,,Element} when the element is concurrently
mutated. Patch by Bénédikt Tran.

@item 
gh-142195@footnote{https://github.com/python/cpython/issues/142195}: Updated timeout evaluation logic in @ref{dc,,subprocess} to be
compatible with deterministic environments like Shadow where time moves
exactly as requested.

@item 
gh-142164@footnote{https://github.com/python/cpython/issues/142164}: Fix the ctypes bitfield overflow error message to report the
correct offset and size calculation.

@item 
gh-143145@footnote{https://github.com/python/cpython/issues/143145}: Fixed a possible reference leak in ctypes when constructing
results with multiple output parameters on error.

@item 
gh-122431@footnote{https://github.com/python/cpython/issues/122431}: Corrected the error message in
@ref{1057,,readline.append_history_file()} to state that @code{nelements} must be
non-negative instead of positive.

@item 
gh-143004@footnote{https://github.com/python/cpython/issues/143004}: Fix a potential use-after-free in
@ref{17ce,,collections.Counter.update()} when user code mutates the Counter
during an update.

@item 
gh-143046@footnote{https://github.com/python/cpython/issues/143046}: The @ref{b,,asyncio} REPL no longer prints copyright and version
messages in the quiet mode (@ref{17cf,,-q}). Patch by Bartosz Sławecki.

@item 
gh-140648@footnote{https://github.com/python/cpython/issues/140648}: The @ref{b,,asyncio} REPL now respects the @ref{b5d,,-I} flag
(isolated mode). Previously, it would load and execute
@geindex PYTHONSTARTUP
@geindex environment variable; PYTHONSTARTUP
@ref{1ba,,PYTHONSTARTUP} even if the flag was set. Contributed by Bartosz
Sławecki.

@item 
gh-142991@footnote{https://github.com/python/cpython/issues/142991}: Fixed socket operations such as recvfrom() and sendto() for
FreeBSD divert(4) socket.

@item 
gh-143010@footnote{https://github.com/python/cpython/issues/143010}: Fixed a bug in @ref{8f,,mailbox} where the precise timing of an
external event could result in the library opening an existing file
instead of a file it expected to create.

@item 
gh-142881@footnote{https://github.com/python/cpython/issues/142881}: Fix concurrent and reentrant call of @ref{17d0,,atexit.unregister()}.

@item 
gh-112127@footnote{https://github.com/python/cpython/issues/112127}: Fix possible use-after-free in @ref{17d0,,atexit.unregister()} when
the callback is unregistered during comparison.

@item 
gh-142783@footnote{https://github.com/python/cpython/issues/142783}: Fix zoneinfo use-after-free with descriptor _weak_cache. a
descriptor as _weak_cache could cause crashes during object creation. The
fix ensures proper reference counting for descriptor-provided objects.

@item 
gh-142754@footnote{https://github.com/python/cpython/issues/142754}: Add the `ownerDocument' attribute to @ref{129,,xml.dom.minidom}
elements and attributes created by directly instantiating the @code{Element}
or @code{Attr} class. Note that this way of creating nodes is not supported;
creator functions like @ref{17d1,,xml.dom.Document.documentElement()} should
be used instead.

@item 
gh-142784@footnote{https://github.com/python/cpython/issues/142784}: The @ref{b,,asyncio} REPL now properly closes the loop upon the
end of interactive session. Previously, it could cause surprising
warnings. Contributed by Bartosz Sławecki.

@item 
gh-142555@footnote{https://github.com/python/cpython/issues/142555}: @ref{8,,array}: fix a crash in @code{a[i] = v} when converting `i'
to an index via @ref{19f,,i.__index__} or
@ref{bc7,,i.__float__} mutates the array.

@item 
gh-142594@footnote{https://github.com/python/cpython/issues/142594}: Fix crash in @code{TextIOWrapper.close()} when the underlying
buffer’s @code{closed} property calls @ref{17d2,,detach()}.

@item 
gh-142451@footnote{https://github.com/python/cpython/issues/142451}: @ref{6e,,hmac}: Ensure that the @ref{1150,,HMAC.block_size} attribute is correctly copied by @ref{17d3,,HMAC.copy}. Patch by Bénédikt Tran.

@item 
gh-142495@footnote{https://github.com/python/cpython/issues/142495}: @ref{13c8,,collections.defaultdict} now prioritizes
@ref{14d7,,__setitem__()} when inserting default values from
@code{default_factory}. This prevents race conditions where a default value
would overwrite a value set before @code{default_factory} returns.

@item 
gh-142651@footnote{https://github.com/python/cpython/issues/142651}: @ref{10e,,unittest.mock}: fix a thread safety issue where
@ref{17d4,,Mock.call_count} may return
inaccurate values when the mock is called concurrently from multiple
threads.

@item 
gh-142595@footnote{https://github.com/python/cpython/issues/142595}: Added type check during initialization of the @ref{3a,,decimal}
module to prevent a crash in case of broken stdlib.  Patch by Sergey B
Kirpichev.

@item 
gh-142556@footnote{https://github.com/python/cpython/issues/142556}: Fix crash when a task gets re-registered during finalization in
@ref{b,,asyncio}. Patch by Kumar Aditya.

@item 
gh-123241@footnote{https://github.com/python/cpython/issues/123241}: Avoid reference count operations in garbage collection of
@ref{2e,,ctypes} objects.

@item 
gh-142517@footnote{https://github.com/python/cpython/issues/142517}: The non-@code{compat32} @ref{3f,,email} policies now correctly handle
refolding encoded words that contain bytes that can not be decoded in
their specified character set.  Previously this resulted in an encoding
exception during folding.

@item 
gh-112527@footnote{https://github.com/python/cpython/issues/112527}: The help text for required options in @ref{7,,argparse} no longer
extended with “ (default: None)”.

@item 
gh-142346@footnote{https://github.com/python/cpython/issues/142346}: Fix usage formatting for mutually exclusive groups in
@ref{7,,argparse} when they are preceded by positional arguments or followed
or intermixed with other optional arguments.

@item 
gh-142315@footnote{https://github.com/python/cpython/issues/142315}: Pdb can now run scripts from anonymous pipes used in process
substitution. Patch by Bartosz Sławecki.

@item 
gh-142332@footnote{https://github.com/python/cpython/issues/142332}: Fix usage formatting for positional arguments in mutually
exclusive groups in @ref{7,,argparse}. in @code{argparse}.

@item 
gh-142282@footnote{https://github.com/python/cpython/issues/142282}: Fix @ref{17d5,,winreg.QueryValueEx()} to not accidentally read
garbage buffer under race condition.

@item 
gh-75949@footnote{https://github.com/python/cpython/issues/75949}: Fix @ref{7,,argparse} to preserve @code{|} separators in mutually
exclusive groups when the usage line wraps due to length.

@item 
gh-142267@footnote{https://github.com/python/cpython/issues/142267}: Improve @ref{7,,argparse} performance by caching the formatter
used for argument validation.

@item 
gh-68552@footnote{https://github.com/python/cpython/issues/68552}: @code{MisplacedEnvelopeHeaderDefect} and @code{Missing header name}
defects are now correctly passed to the @code{handle_defect} method of
@code{policy} in @ref{17d6,,FeedParser}.

@item 
gh-142006@footnote{https://github.com/python/cpython/issues/142006}: Fix a bug in the @ref{17d7,,email.policy.default} folding algorithm
which incorrectly resulted in a doubled newline when a line ending at
exactly max_line_length was followed by an unfoldable token.

@item 
gh-105836@footnote{https://github.com/python/cpython/issues/105836}: Fix @ref{a88,,asyncio.run_coroutine_threadsafe()} leaving underlying
cancelled asyncio task running.

@item 
gh-139971@footnote{https://github.com/python/cpython/issues/139971}: @ref{ba,,pydoc}: Ensure that the link to the online documentation
of a @ref{17d8,,stdlib} module is correct.

@item 
gh-139262@footnote{https://github.com/python/cpython/issues/139262}: Some keystrokes can be swallowed in the new @code{PyREPL} on
Windows, especially when used together with the ALT key. Fix by Chris
Eibl.

@item 
gh-138897@footnote{https://github.com/python/cpython/issues/138897}: Improved @ref{17d9,,license}/@ref{17da,,copyright}/@ref{17db,,credits}
display in the @ref{492,,REPL}: now uses a pager.

@item 
gh-79986@footnote{https://github.com/python/cpython/issues/79986}: Add parsing for @code{References} and @code{In-Reply-To} headers to
the @ref{3f,,email} library that parses the header content as lists of
message id tokens.  This prevents them from being folded incorrectly.

@item 
gh-136282@footnote{https://github.com/python/cpython/issues/136282}: Add support for @ref{17dc,,UNNAMED_SECTION} when
creating a section via the mapping protocol access

@item 
gh-109263@footnote{https://github.com/python/cpython/issues/109263}: Starting a process from spawn context in @ref{98,,multiprocessing}
no longer sets the start method globally.

@item 
gh-133253@footnote{https://github.com/python/cpython/issues/133253}: Fix thread-safety issues in @ref{89,,linecache}.

@item 
gh-132715@footnote{https://github.com/python/cpython/issues/132715}: Skip writing objects during marshalling once a failure has
occurred.
@end itemize

@node IDLE<4>,Documentation<6>,Library<6>,Python 3 14 3 final
@anchor{whatsnew/changelog id36}@anchor{17dd}
@subsubsection IDLE



@itemize -

@item 
gh-143774@footnote{https://github.com/python/cpython/issues/143774}: Better explain the operation of Format / Format Paragraph.
@end itemize

@node Documentation<6>,Core and Builtins<6>,IDLE<4>,Python 3 14 3 final
@anchor{whatsnew/changelog id37}@anchor{17de}
@subsubsection Documentation



@itemize -

@item 
gh-140806@footnote{https://github.com/python/cpython/issues/140806}: Add documentation for @ref{17df,,enum.bin()}.
@end itemize

@node Core and Builtins<6>,C API<4>,Documentation<6>,Python 3 14 3 final
@anchor{whatsnew/changelog id38}@anchor{17e0}
@subsubsection Core and Builtins



@itemize -

@item 
gh-144307@footnote{https://github.com/python/cpython/issues/144307}: Prevent a reference leak in module teardown at interpreter
finalization.

@item 
gh-144194@footnote{https://github.com/python/cpython/issues/144194}: Fix error handling in perf jitdump initialization on memory
allocation failure.

@item 
gh-144012@footnote{https://github.com/python/cpython/issues/144012}: Check if the result is @code{NULL} in @code{BINARY_OP_EXTENT} opcode.

@item 
gh-141805@footnote{https://github.com/python/cpython/issues/141805}: Fix crash in @ref{185,,set} when objects with the same hash are
concurrently added to the set after removing an element with the same hash
while the set still contains elements with the same hash.

@item 
gh-143670@footnote{https://github.com/python/cpython/issues/143670}: Fixes a crash in @code{ga_repr_items_list} function.

@item 
gh-143377@footnote{https://github.com/python/cpython/issues/143377}: Fix a crash in @code{_interpreters.capture_exception()} when
the exception is incorrectly formatted. Patch by Bénédikt Tran.

@item 
gh-136924@footnote{https://github.com/python/cpython/issues/136924}: The interactive help mode in the @ref{492,,REPL} no longer
incorrectly syntax highlights text input as Python code. Contributed by
Olga Matoula.

@item 
gh-143189@footnote{https://github.com/python/cpython/issues/143189}: Fix crash when inserting a non-@ref{16a,,str} key into a split
table dictionary when the key matches an existing key in the split table
but has no corresponding value in the dict.

@item 
gh-143228@footnote{https://github.com/python/cpython/issues/143228}: Fix use-after-free in perf trampoline when toggling profiling
while threads are running or during interpreter finalization with daemon
threads active. The fix uses reference counting to ensure trampolines are
not freed while any code object could still reference them. Pach by Pablo
Galindo

@item 
gh-142664@footnote{https://github.com/python/cpython/issues/142664}: Fix a use-after-free crash in @ref{cf9,,memoryview.__hash__} when the @code{__hash__} method of the referenced object
mutates that object or the view. Patch by Bénédikt Tran.

@item 
gh-142557@footnote{https://github.com/python/cpython/issues/142557}: Fix a use-after-free crash in @ref{f87,,bytearray.__mod__} when the @code{bytearray} is mutated while
formatting the @code{%}-style arguments. Patch by Bénédikt Tran.

@item 
gh-143195@footnote{https://github.com/python/cpython/issues/143195}: Fix use-after-free crashes in @ref{f6c,,bytearray.hex()} and
@ref{f6d,,memoryview.hex()} when the separator’s @ref{17e1,,__len__()}
mutates the original object. Patch by Bénédikt Tran.

@item 
gh-142975@footnote{https://github.com/python/cpython/issues/142975}: Fix crash after unfreezing all objects tracked by the garbage
collector on the @ref{1f6,,free threaded} build.

@item 
gh-143135@footnote{https://github.com/python/cpython/issues/143135}: Set @ref{17e2,,sys.flags.inspect} to @code{1} when
@geindex PYTHONINSPECT
@geindex environment variable; PYTHONINSPECT
@ref{16e6,,PYTHONINSPECT} is @code{0}. Previously, it was set to @code{0} in this
case.

@item 
gh-143003@footnote{https://github.com/python/cpython/issues/143003}: Fix an overflow of the shared empty buffer in
@ref{17e3,,bytearray.extend()} when @code{__length_hint__()} returns 0 for
non-empty iterator.

@item 
gh-143006@footnote{https://github.com/python/cpython/issues/143006}: Fix a possible assertion error when comparing negative
non-integer @code{float} and @code{int} with the same number of bits in the
integer part.

@item 
gh-143057@footnote{https://github.com/python/cpython/issues/143057}: Avoid locking in @ref{db5,,PyTraceMalloc_Track()} and
@ref{db6,,PyTraceMalloc_Untrack()} when @ref{106,,tracemalloc} is not enabled.

@item 
gh-142776@footnote{https://github.com/python/cpython/issues/142776}: Fix a file descriptor leak in import.c

@item 
gh-142829@footnote{https://github.com/python/cpython/issues/142829}: Fix a use-after-free crash in @ref{178,,contextvars.Context}
comparison when a custom @code{__eq__} method modifies the context via
@ref{17e4,,set()}.

@item 
gh-142766@footnote{https://github.com/python/cpython/issues/142766}: Clear the frame of a generator when @ref{17e5,,generator.close()} is
called.

@item 
gh-142737@footnote{https://github.com/python/cpython/issues/142737}: Tracebacks will be displayed in fallback mode even if
@ref{741,,io.open()} is lost. Previously, this would crash the interpreter.
Patch by Bartosz Sławecki.

@item 
gh-142554@footnote{https://github.com/python/cpython/issues/142554}: Fix a crash in @ref{b9f,,divmod()} when @code{_pylong.int_divmod()}
does not return a tuple of length two exactly. Patch by Bénédikt Tran.

@item 
gh-142560@footnote{https://github.com/python/cpython/issues/142560}: Fix use-after-free in @ref{342,,bytearray} search-like methods
(@ref{15af,,find()}, @ref{17e6,,count()},
@ref{17e7,,index()}, @ref{17e8,,rindex()}, and
@ref{15b0,,rfind()}) by marking the storage as exported which causes
reallocation attempts to raise @ref{17e9,,BufferError}. For
@ref{add,,contains()}, @ref{17ea,,split()}, and
@ref{17eb,,rsplit()} the @ref{262,,buffer protocol} is
used for this.

@item 
gh-142531@footnote{https://github.com/python/cpython/issues/142531}: Fix a free-threaded GC performance regression.  If there are
many untracked tuples, the GC will run too often, resulting in poor
performance.  The fix is to include untracked tuples in the “long lived”
object count. The number of frozen objects is also now included since the
free-threaded GC must scan those too.

@item 
gh-142402@footnote{https://github.com/python/cpython/issues/142402}: Fix reference counting when adjacent literal parts are merged
while constructing @ref{16b,,string.templatelib.Template}, preventing the
displaced string object from leaking.

@item 
gh-133932@footnote{https://github.com/python/cpython/issues/133932}: Fix crash in the free threading build when clearing frames that
hold tagged integers.

@item 
gh-142343@footnote{https://github.com/python/cpython/issues/142343}: Fix SIGILL crash on m68k due to incorrect assembly constraint.

@item 
gh-100964@footnote{https://github.com/python/cpython/issues/100964}: Fix reference cycle in exhausted generator frames. Patch by
Savannah Ostrowski.

@item 
gh-69605@footnote{https://github.com/python/cpython/issues/69605}: Fix edge-cases around already imported modules in the
@ref{492,,REPL} auto-completion of imports.

@item 
gh-138568@footnote{https://github.com/python/cpython/issues/138568}: Adjusted the built-in @ref{ada,,help()} function so that empty
inputs are ignored in interactive mode.

@item 
gh-137007@footnote{https://github.com/python/cpython/issues/137007}: Fix a bug during JIT compilation failure which caused garbage
collection debug assertions to fail.
@end itemize

@node C API<4>,Build<5>,Core and Builtins<6>,Python 3 14 3 final
@anchor{whatsnew/changelog id39}@anchor{17ec}
@subsubsection C API



@itemize -

@item 
gh-142589@footnote{https://github.com/python/cpython/issues/142589}: Fix @ref{3c5,,PyUnstable_Object_IsUniqueReferencedTemporary()}
handling of tagged ints on the interpreter stack.

@item 
gh-142571@footnote{https://github.com/python/cpython/issues/142571}: @code{PyUnstable_CopyPerfMapFile()} now checks that opening
the file succeeded before flushing.
@end itemize

@node Build<5>,,C API<4>,Python 3 14 3 final
@anchor{whatsnew/changelog id40}@anchor{17ed}
@subsubsection Build



@itemize -

@item 
gh-142454@footnote{https://github.com/python/cpython/issues/142454}: When calculating the digest of the JIT stencils input, sort the
hashed files by filenames before adding their content to the hasher. This
ensures deterministic hash input and hence deterministic hash, independent
on filesystem order.

@item 
gh-141808@footnote{https://github.com/python/cpython/issues/141808}: When running @code{make clean-retain-profile}, keep the generated
JIT stencils. That way, the stencils are not generated twice when
Profile-guided optimization (PGO) is used. It also allows distributors to
supply their own pre-built JIT stencils.

@item 
gh-138061@footnote{https://github.com/python/cpython/issues/138061}: Ensure reproducible builds by making JIT stencil header
generation deterministic.
@end itemize

@node Python 3 14 2 final,Python 3 14 1 final,Python 3 14 3 final,Changelog
@anchor{whatsnew/changelog python-3-14-2-final}@anchor{17ee}
@subsection Python 3.14.2 final


`Release date: 2025-12-05'

@menu
* Security: Security<6>. 
* Library: Library<7>. 
* Core and Builtins: Core and Builtins<7>. 
* Library: Library<8>. 

@end menu

@node Security<6>,Library<7>,,Python 3 14 2 final
@anchor{whatsnew/changelog id41}@anchor{17ef}
@subsubsection Security



@itemize -

@item 
gh-142145@footnote{https://github.com/python/cpython/issues/142145}: Remove quadratic behavior in @code{xml.minidom} node ID cache
clearing.

@item 
gh-119452@footnote{https://github.com/python/cpython/issues/119452}: Fix a potential memory denial of service in the
@ref{76,,http.server} module. When a malicious user is connected to the CGI
server on Windows, it could cause an arbitrary amount of memory to be
allocated. This could have led to symptoms including a @ref{1761,,MemoryError},
swapping, out of memory (OOM) killed processes or containers, or even
system crashes.
@end itemize

@node Library<7>,Core and Builtins<7>,Security<6>,Python 3 14 2 final
@anchor{whatsnew/changelog id42}@anchor{17f0}
@subsubsection Library



@itemize -

@item 
gh-140797@footnote{https://github.com/python/cpython/issues/140797}: Revert changes to the undocumented @code{re.Scanner} class.
Capturing groups are still allowed for backward compatibility, although
using them can lead to incorrect result. They will be forbidden in future
Python versions.

@item 
gh-142206@footnote{https://github.com/python/cpython/issues/142206}: The resource tracker in the @ref{98,,multiprocessing} module now
uses the original communication protocol, as in Python 3.14.0 and below,
by default. This avoids issues with upgrading Python while it is running.
(Note that such ‘in-place’ upgrades are not tested.) The tracker remains
compatible with subprocesses that use new protocol (that is, subprocesses
using Python 3.13.10, 3.14.1 and 3.15).

@item 
gh-142214@footnote{https://github.com/python/cpython/issues/142214}: Fix two regressions in @ref{33,,dataclasses} in Python 3.14.1
related to annotations.


@itemize *

@item 
An exception is no longer raised if @code{slots=True} is used and the
@code{__init__} method does not have an @code{__annotate__} attribute
(likely because @code{init=False} was used).

@item 
An exception is no longer raised if annotations are requested on the
@code{__init__} method and one of the fields is not present in the class
annotations. This can occur in certain dynamic scenarios.
@end itemize

Patch by Jelle Zijlstra.
@end itemize

@node Core and Builtins<7>,Library<8>,Library<7>,Python 3 14 2 final
@anchor{whatsnew/changelog id43}@anchor{17f1}
@subsubsection Core and Builtins



@itemize -

@item 
gh-142218@footnote{https://github.com/python/cpython/issues/142218}: Fix crash when inserting into a split table dictionary with a
non @ref{16a,,str} key that matches an existing key.
@end itemize

@node Library<8>,,Core and Builtins<7>,Python 3 14 2 final
@anchor{whatsnew/changelog id44}@anchor{17f2}
@subsubsection Library



@itemize -

@item 
gh-116738@footnote{https://github.com/python/cpython/issues/116738}: Fix @ref{19,,cmath} data race when initializing trigonometric
tables with subinterpreters.
@end itemize

@node Python 3 14 1 final,Python 3 14 0 final,Python 3 14 2 final,Changelog
@anchor{whatsnew/changelog python-3-14-1-final}@anchor{17f3}
@subsection Python 3.14.1 final


`Release date: 2025-12-02'

@menu
* Windows: Windows<5>. 
* Tools/Demos: Tools/Demos<2>. 
* Tests: Tests<6>. 
* Security: Security<7>. 
* Library: Library<9>. 
* IDLE: IDLE<5>. 
* Documentation: Documentation<7>. 
* Core and Builtins: Core and Builtins<8>. 
* Library: Library<10>. 
* Core and Builtins: Core and Builtins<9>. 
* Library: Library<11>. 
* Core and Builtins: Core and Builtins<10>. 
* Library: Library<12>. 
* Core and Builtins: Core and Builtins<11>. 
* Library: Library<13>. 
* Core and Builtins: Core and Builtins<12>. 
* Library: Library<14>. 
* Core and Builtins: Core and Builtins<13>. 
* Library: Library<15>. 
* Core and Builtins: Core and Builtins<14>. 
* C API: C API<5>. 
* Build: Build<6>. 

@end menu

@node Windows<5>,Tools/Demos<2>,,Python 3 14 1 final
@anchor{whatsnew/changelog id45}@anchor{17f4}
@subsubsection Windows



@itemize -

@item 
gh-139810@footnote{https://github.com/python/cpython/issues/139810}: Installing with @code{py install 3[.x]-dev} will now select final
versions as well as prereleases.
@end itemize

@node Tools/Demos<2>,Tests<6>,Windows<5>,Python 3 14 1 final
@anchor{whatsnew/changelog id46}@anchor{17f5}
@subsubsection Tools/Demos



@itemize -

@item 
gh-141692@footnote{https://github.com/python/cpython/issues/141692}: Each slice of an iOS XCframework now contains a @code{lib} folder
that contains a symlink to the libpython dylib. This allows binary modules
to be compiled for iOS using dynamic libreary linking, rather than
Framework linking.

@item 
gh-141442@footnote{https://github.com/python/cpython/issues/141442}: The iOS testbed now correctly handles test arguments that
contain spaces.

@item 
gh-140702@footnote{https://github.com/python/cpython/issues/140702}: The iOS testbed app will now expose the @code{GITHUB_ACTIONS}
environment variable to iOS apps being tested.

@item 
gh-137484@footnote{https://github.com/python/cpython/issues/137484}: Have @code{Tools/wasm/wasi} put the build Python into a directory
named after the build triple instead of “build”.

@item 
gh-137248@footnote{https://github.com/python/cpython/issues/137248}: Add a @code{--logdir} option to @code{Tools/wasm/wasi} for specifying
where to write log files.

@item 
gh-137243@footnote{https://github.com/python/cpython/issues/137243}: Have Tools/wasm/wasi detect a WASI SDK install in /opt when it
was directly extracted from a release tarball.
@end itemize

@node Tests<6>,Security<7>,Tools/Demos<2>,Python 3 14 1 final
@anchor{whatsnew/changelog id47}@anchor{17f6}
@subsubsection Tests



@itemize -

@item 
gh-140482@footnote{https://github.com/python/cpython/issues/140482}: Preserve and restore the state of @code{stty echo} as part of the
test environment.

@item 
gh-140082@footnote{https://github.com/python/cpython/issues/140082}: Update @code{python -m test} to set @code{FORCE_COLOR=1} when being
run with color enabled so that @ref{10d,,unittest} which is run by it with
redirected output will output in color.

@item 
gh-139208@footnote{https://github.com/python/cpython/issues/139208}: Fix regrtest @code{--fast-ci --verbose}: don’t ignore the
@code{--verbose} option anymore. Patch by Victor Stinner.

@item 
gh-136442@footnote{https://github.com/python/cpython/issues/136442}: Use exitcode @code{1} instead of @code{5} if
@ref{c49,,unittest.TestCase.setUpClass()} raises an exception
@end itemize

@node Security<7>,Library<9>,Tests<6>,Python 3 14 1 final
@anchor{whatsnew/changelog id48}@anchor{17f7}
@subsubsection Security



@itemize -

@item 
gh-139700@footnote{https://github.com/python/cpython/issues/139700}: Check consistency of the zip64 end of central directory record.
Support records with “zip64 extensible data” if there are no bytes
prepended to the ZIP file.

@item 
gh-139283@footnote{https://github.com/python/cpython/issues/139283}: @ref{d4,,sqlite3}: correctly handle maximum number of rows to
fetch in @ref{17f8,,Cursor.fetchmany} and reject
negative values for @ref{17f9,,Cursor.arraysize}.
Patch by Bénédikt Tran.

@item 
gh-137836@footnote{https://github.com/python/cpython/issues/137836}: Add support of the “plaintext” element, RAWTEXT elements “xmp”,
“iframe”, “noembed” and “noframes”, and optionally RAWTEXT element
“noscript” in @ref{a7d,,html.parser.HTMLParser}.

@item 
gh-136063@footnote{https://github.com/python/cpython/issues/136063}: @ref{48,,email.message}: ensure linear complexity for legacy HTTP
parameters parsing. Patch by Bénédikt Tran.

@item 
gh-136065@footnote{https://github.com/python/cpython/issues/136065}: Fix quadratic complexity in @ref{15e5,,os.path.expandvars()}.

@item 
gh-119451@footnote{https://github.com/python/cpython/issues/119451}: Fix a potential memory denial of service in the
@ref{73,,http.client} module. When connecting to a malicious server, it could
cause an arbitrary amount of memory to be allocated. This could have led
to symptoms including a @ref{1761,,MemoryError}, swapping, out of memory (OOM)
killed processes or containers, or even system crashes.

@item 
gh-119342@footnote{https://github.com/python/cpython/issues/119342}: Fix a potential memory denial of service in the @ref{b0,,plistlib}
module. When reading a Plist file received from untrusted source, it could
cause an arbitrary amount of memory to be allocated. This could have led
to symptoms including a @ref{1761,,MemoryError}, swapping, out of memory (OOM)
killed processes or containers, or even system crashes.
@end itemize

@node Library<9>,IDLE<5>,Security<7>,Python 3 14 1 final
@anchor{whatsnew/changelog id49}@anchor{17fa}
@subsubsection Library



@itemize -

@item 
gh-74389@footnote{https://github.com/python/cpython/issues/74389}: When the stdin being used by a @ref{4b8,,subprocess.Popen}
instance is closed, this is now ignored in
@ref{17fb,,subprocess.Popen.communicate()} instead of leaving the class in an
inconsistent state.

@item 
gh-87512@footnote{https://github.com/python/cpython/issues/87512}: Fix @ref{17fb,,subprocess.Popen.communicate()} timeout handling on
Windows when writing large input. Previously, the timeout was ignored
during stdin writing, causing the method to block indefinitely if the
child process did not consume input quickly. The stdin write is now
performed in a background thread, allowing the timeout to be properly
enforced.

@item 
gh-141473@footnote{https://github.com/python/cpython/issues/141473}: When @ref{17fb,,subprocess.Popen.communicate()} was called with
`input' and a `timeout' and is called for a second time after a
@ref{17fc,,TimeoutExpired} exception before the process has died,
it should no longer hang.

@item 
gh-59000@footnote{https://github.com/python/cpython/issues/59000}: Fix @ref{aa,,pdb} breakpoint resolution for class methods when the
module defining the class is not imported.

@item 
gh-141570@footnote{https://github.com/python/cpython/issues/141570}: Support @ref{17fd,,file-like object} raising @ref{2c2,,OSError} from
@ref{17fe,,fileno()} in color detection
(@code{_colorize.can_colorize()}). This can occur when @code{sys.stdout} is
redirected.

@item 
gh-141659@footnote{https://github.com/python/cpython/issues/141659}: Fix bad file descriptor errors from @code{_posixsubprocess} on
AIX.

@item 
gh-141600@footnote{https://github.com/python/cpython/issues/141600}: Fix musl version detection on Void Linux.

@item 
gh-141497@footnote{https://github.com/python/cpython/issues/141497}: @ref{84,,ipaddress}: ensure that the methods
@ref{17ff,,IPv4Network.hosts()} and
@ref{1800,,IPv6Network.hosts()} always return an
iterator.

@item 
gh-140938@footnote{https://github.com/python/cpython/issues/140938}: The @ref{8e5,,statistics.stdev()} and @ref{1801,,statistics.pstdev()}
functions now raise a @ref{2ee,,ValueError} when the input contains an
infinity or a NaN.

@item 
gh-124111@footnote{https://github.com/python/cpython/issues/124111}: Updated Tcl threading configuration in @ref{3,,_tkinter} to
assume that threads are always available in Tcl 9 and later.

@item 
gh-137109@footnote{https://github.com/python/cpython/issues/137109}: The @ref{4b6,,os.fork} and related forking APIs will no longer warn
in the common case where Linux or macOS platform APIs return the number of
threads in a process and find the answer to be 1 even when a
@ref{353,,os.register_at_fork()} @code{after_in_parent=} callback (re)starts a
thread.

@item 
gh-141314@footnote{https://github.com/python/cpython/issues/141314}: Fix assertion failure in @ref{1802,,io.TextIOWrapper.tell()} when
reading files with standalone carriage return (@code{\r}) line endings.

@item 
gh-141311@footnote{https://github.com/python/cpython/issues/141311}: Fix assertion failure in @code{io.BytesIO.readinto()} and
undefined behavior arising when read position is above capcity in
@ref{10aa,,io.BytesIO}.

@item 
gh-141141@footnote{https://github.com/python/cpython/issues/141141}: Fix a thread safety issue with @ref{1129,,base64.b85decode()}.
Contributed by Benel Tayar.

@item 
gh-137969@footnote{https://github.com/python/cpython/issues/137969}: Fix @ref{1803,,annotationlib.ForwardRef.evaluate()} returning
@ref{17c9,,ForwardRef} objects which don’t update with new
globals.

@item 
gh-140911@footnote{https://github.com/python/cpython/issues/140911}: @ref{1e,,collections}: Ensure that the methods
@code{UserString.rindex()} and @code{UserString.index()} accept
@ref{fd9,,collections.UserString} instances as the sub argument.

@item 
gh-140797@footnote{https://github.com/python/cpython/issues/140797}: The undocumented @code{re.Scanner} class now forbids regular
expressions containing capturing groups in its lexicon patterns. Patterns
using capturing groups could previously lead to crashes with segmentation
fault. Use non-capturing groups (?:…) instead.

@item 
gh-125115@footnote{https://github.com/python/cpython/issues/125115}: Refactor the @ref{aa,,pdb} parsing issue so positional arguments
can pass through intuitively.

@item 
gh-140815@footnote{https://github.com/python/cpython/issues/140815}: @ref{5c,,faulthandler} now detects if a frame or a code object is
invalid or freed. Patch by Victor Stinner.

@item 
gh-100218@footnote{https://github.com/python/cpython/issues/100218}: Correctly set @ref{1804,,errno} when
@ref{c29,,socket.if_nametoindex()} or @ref{c2a,,socket.if_indextoname()} raise an
@ref{2c2,,OSError}. Patch by Bénédikt Tran.

@item 
gh-140875@footnote{https://github.com/python/cpython/issues/140875}: Fix handling of unclosed character references (named and
numerical) followed by the end of file in @ref{a7d,,html.parser.HTMLParser}
with @code{convert_charrefs=False}.

@item 
gh-140734@footnote{https://github.com/python/cpython/issues/140734}: @ref{98,,multiprocessing}: fix off-by-one error when checking the
length of a temporary socket file path. Patch by Bénédikt Tran.

@item 
gh-140874@footnote{https://github.com/python/cpython/issues/140874}: Bump the version of pip bundled in ensurepip to version 25.3

@item 
gh-140691@footnote{https://github.com/python/cpython/issues/140691}: In @ref{112,,urllib.request}, when opening a FTP URL fails because
a data connection cannot be made, the control connection’s socket is now
closed to avoid a @ref{54d,,ResourceWarning}.

@item 
gh-103847@footnote{https://github.com/python/cpython/issues/103847}: Fix hang when cancelling process created by
@ref{c71,,asyncio.create_subprocess_exec()} or
@ref{c72,,asyncio.create_subprocess_shell()}. Patch by Kumar Aditya.

@item 
gh-120057@footnote{https://github.com/python/cpython/issues/120057}: Add @ref{25a,,os.reload_environ()} to @code{os.__all__}.

@item 
gh-140228@footnote{https://github.com/python/cpython/issues/140228}: Avoid making unnecessary filesystem calls for frozen modules in
@ref{89,,linecache} when the global module cache is not present.

@item 
gh-140590@footnote{https://github.com/python/cpython/issues/140590}: Fix arguments checking for the
@code{functools.partial.__setstate__()} that may lead to internal state
corruption and crash. Patch by Sergey Miryanov.

@item 
gh-125434@footnote{https://github.com/python/cpython/issues/125434}: Display thread name in @ref{5c,,faulthandler} on Windows. Patch by
Victor Stinner.

@item 
gh-140634@footnote{https://github.com/python/cpython/issues/140634}: Fix a reference counting bug in
@code{os.sched_param.__reduce__()}.

@item 
gh-140633@footnote{https://github.com/python/cpython/issues/140633}: Ignore @ref{5f0,,AttributeError} when setting a module’s
@code{__file__} attribute when loading an extension module packaged as Apple
Framework.

@item 
gh-140593@footnote{https://github.com/python/cpython/issues/140593}: @ref{12d,,xml.parsers.expat}: Fix a memory leak that could affect
users with @ref{17a4,,ElementDeclHandler()} set to
a custom element declaration handler. Patch by Sebastian Pipping.

@item 
gh-140607@footnote{https://github.com/python/cpython/issues/140607}: Inside @ref{1023,,io.RawIOBase.read()}, validate that the count of
bytes returned by @ref{1024,,io.RawIOBase.readinto()} is valid (inside the
provided buffer).

@item 
gh-138162@footnote{https://github.com/python/cpython/issues/138162}: Fix @ref{1501,,logging.LoggerAdapter} with @code{merge_extra=True}
and without the `extra' argument.

@item 
gh-138774@footnote{https://github.com/python/cpython/issues/138774}: @ref{ae8,,ast.unparse()} now generates full source code when
handling @ref{1805,,ast.Interpolation} nodes that do not have a specified
source.

@item 
gh-140474@footnote{https://github.com/python/cpython/issues/140474}: Fix memory leak in @ref{4bf,,array.array} when creating arrays
from an empty @ref{16a,,str} and the @code{u} type code.

@item 
gh-137530@footnote{https://github.com/python/cpython/issues/137530}: @ref{33,,dataclasses} Fix annotations for generated @code{__init__}
methods by replacing the annotations that were in-line in the generated
source code with @code{__annotate__} functions attached to the methods.

@item 
gh-140348@footnote{https://github.com/python/cpython/issues/140348}: Fix regression in Python 3.14.0 where using the @code{|} operator
on a @ref{2aa,,typing.Union} object combined with an object that is not a
type would raise an error.

@item 
gh-140272@footnote{https://github.com/python/cpython/issues/140272}: Fix memory leak in the @code{clear()} method of the
@ref{37,,dbm.gnu} database.

@item 
gh-140041@footnote{https://github.com/python/cpython/issues/140041}: Fix import of @ref{2e,,ctypes} on Android and Cygwin when ABI
flags are present.

@item 
gh-140120@footnote{https://github.com/python/cpython/issues/140120}: Fixed a memory leak in @ref{6e,,hmac} when it was using the
hacl-star backend. Discovered by @code{@@ashm-dev} using AddressSanitizer.

@item 
gh-139905@footnote{https://github.com/python/cpython/issues/139905}: Add suggestion to error message for @ref{1806,,typing.Generic}
subclasses when @code{cls.__parameters__} is missing due to a parent class
failing to call @ref{844,,super().__init_subclass__()} in its @code{__init_subclass__}.

@item 
gh-139894@footnote{https://github.com/python/cpython/issues/139894}: Fix incorrect sharing of current task with the child process
while forking in @ref{b,,asyncio}. Patch by Kumar Aditya.

@item 
gh-139845@footnote{https://github.com/python/cpython/issues/139845}: Fix to not print KeyboardInterrupt twice in default asyncio
REPL.

@item 
gh-139783@footnote{https://github.com/python/cpython/issues/139783}: Fix @ref{1807,,inspect.getsourcelines()} for the case when a
decorator is followed by a comment or an empty line.

@item 
gh-139809@footnote{https://github.com/python/cpython/issues/139809}: Prevent premature colorization of subparser @code{prog} in
@ref{e17,,argparse.ArgumentParser.add_subparsers()} to respect color
environment variable changes after parser creation.

@item 
gh-139736@footnote{https://github.com/python/cpython/issues/139736}: Fix excessive indentation in the default @ref{7,,argparse}
@code{HelpFormatter}. Patch by Alexander Edland.

@item 
gh-70765@footnote{https://github.com/python/cpython/issues/70765}: @ref{76,,http.server}: fix default handling of HTTP/0.9 requests in
@ref{12d7,,BaseHTTPRequestHandler}. Previously,
@code{BaseHTTPRequestHandler.parse_request()} incorrectly waited for
headers in the request although those are not supported in HTTP/0.9. Patch
by Bénédikt Tran.

@item 
gh-63161@footnote{https://github.com/python/cpython/issues/63161}: Fix @ref{1808,,tokenize.detect_encoding()}. Support non-UTF-8 shebang
and comments if non-UTF-8 encoding is specified. Detect decoding error for
non-UTF-8 encoding. Detect null bytes in source code.

@item 
gh-139391@footnote{https://github.com/python/cpython/issues/139391}: Fix an issue when, on non-Windows platforms, it was not
possible to gracefully exit a @code{python -m asyncio} process suspended by
Ctrl+Z and later resumed by @code{fg@footnote{https://manpages.debian.org/fg}} other than with @code{kill@footnote{https://manpages.debian.org/kill}}.

@item 
gh-101828@footnote{https://github.com/python/cpython/issues/101828}: Fix @code{'shift_jisx0213'}, @code{'shift_jis_2004'},
@code{'euc_jisx0213'} and @code{'euc_jis_2004'} codecs truncating null chars as
they were treated as part of multi-character sequences.

@item 
gh-139289@footnote{https://github.com/python/cpython/issues/139289}: Do a real lazy-import on @ref{c2,,rlcompleter} in @ref{aa,,pdb} and
restore the existing completer after importing @code{rlcompleter}.

@item 
gh-139246@footnote{https://github.com/python/cpython/issues/139246}: fix: paste zero-width in default repl width is wrong.

@item 
gh-90949@footnote{https://github.com/python/cpython/issues/90949}: Add
@ref{1809,,SetAllocTrackerActivationThreshold()}
and
@ref{180a,,SetAllocTrackerMaximumAmplification()}
to @ref{177a,,xmlparser} objects to tune protections
against disproportional amounts of dynamic memory usage from within an
Expat parser. Patch by Bénédikt Tran.

@item 
gh-139210@footnote{https://github.com/python/cpython/issues/139210}: Fix use-after-free when reporting unknown event in
@ref{57a,,xml.etree.ElementTree.iterparse()}. Patch by Ken Jin.

@item 
gh-138860@footnote{https://github.com/python/cpython/issues/138860}: Lazy import @ref{c2,,rlcompleter} in @ref{aa,,pdb} to avoid deadlock
in subprocess.

@item 
gh-112729@footnote{https://github.com/python/cpython/issues/112729}: Fix crash when calling @ref{180b,,concurrent.interpreters.create()}
when the process is out of memory.

@item 
gh-135729@footnote{https://github.com/python/cpython/issues/135729}: Fix unraisable exception during finalization when using
@ref{25,,concurrent.interpreters} in the REPL.

@item 
gh-139076@footnote{https://github.com/python/cpython/issues/139076}: Fix a bug in the @ref{ba,,pydoc} module that was hiding functions
in a Python module if they were implemented in an extension module and the
module did not have @code{__all__}.

@item 
gh-139065@footnote{https://github.com/python/cpython/issues/139065}: Fix trailing space before a wrapped long word if the line
length is exactly `width' in @ref{f2,,textwrap}.

@item 
gh-139001@footnote{https://github.com/python/cpython/issues/139001}: Fix race condition in @ref{268,,pathlib.Path} on the internal
@code{_raw_paths} field.

@item 
gh-138813@footnote{https://github.com/python/cpython/issues/138813}: @code{multiprocessing.BaseProcess} defaults @code{kwargs} to
@code{None} instead of a shared dictionary.

@item 
gh-138993@footnote{https://github.com/python/cpython/issues/138993}: Dedent @ref{17db,,credits} text.

@item 
gh-138891@footnote{https://github.com/python/cpython/issues/138891}: Fix @code{SyntaxError} when @code{inspect.get_annotations(f,
eval_str=True)} is called on a function annotated with a 
@geindex Python Enhancement Proposals; PEP 646
PEP 646@footnote{https://peps.python.org/pep-0646/}
@code{star_expression}

@item 
gh-130567@footnote{https://github.com/python/cpython/issues/130567}: Fix possible crash in @ref{180c,,locale.strxfrm()} due to a platform
bug on macOS.

@item 
gh-138859@footnote{https://github.com/python/cpython/issues/138859}: Fix generic type parameterization raising a @ref{199,,TypeError}
when omitting a @code{ParamSpec} that has a default which is not a list
of types.

@item 
gh-138764@footnote{https://github.com/python/cpython/issues/138764}: Prevent @ref{180d,,annotationlib.call_annotate_function()} from
calling @code{__annotate__} functions that don’t support
@code{VALUE_WITH_FAKE_GLOBALS} in a fake globals namespace with empty
globals.

Make @code{FORWARDREF} and @code{STRING} annotations fall back to using
@code{VALUE} annotations in the case that neither their own format, nor
@code{VALUE_WITH_FAKE_GLOBALS} are supported.

@item 
gh-138775@footnote{https://github.com/python/cpython/issues/138775}: Use of @code{python -m} with @ref{f,,base64} has been fixed to
detect input from a terminal so that it properly notices EOF.

@item 
gh-138779@footnote{https://github.com/python/cpython/issues/138779}: Support device numbers larger than @code{2**63-1} for the
@ref{180e,,st_rdev} field of the @ref{16cd,,os.stat_result}
structure.

@item 
gh-137706@footnote{https://github.com/python/cpython/issues/137706}: Fix the partial evaluation of annotations that use
@code{typing.Annotated[T, x]} where @code{T} is a forward reference.

@item 
gh-88375@footnote{https://github.com/python/cpython/issues/88375}: Fix normalization of the @code{robots.txt} rules and URLs in the
@ref{114,,urllib.robotparser} module. No longer ignore trailing @code{?}.
Distinguish raw special characters @code{?}, @code{=} and @code{&} from the
percent-encoded ones.

@item 
gh-111788@footnote{https://github.com/python/cpython/issues/111788}: Fix parsing errors in the @ref{114,,urllib.robotparser} module.
Don’t fail trying to parse weird paths. Don’t fail trying to decode
non-UTF-8 @code{robots.txt} files.

@item 
gh-98896@footnote{https://github.com/python/cpython/issues/98896}: Fix a failure in multiprocessing resource_tracker when
SharedMemory names contain colons. Patch by Rani Pinchuk.

@item 
gh-138425@footnote{https://github.com/python/cpython/issues/138425}: Fix partial evaluation of @ref{17c9,,annotationlib.ForwardRef}
objects which rely on names defined as globals.

@item 
gh-138432@footnote{https://github.com/python/cpython/issues/138432}: @ref{180f,,zoneinfo.reset_tzpath()} will now convert any
@ref{e51,,os.PathLike} objects it receives into strings before adding them
to @code{TZPATH}. It will raise @code{TypeError} if anything other than a string
is found after this conversion. If given an @code{os.PathLike} object
that represents a relative path, it will now raise @code{ValueError} instead
of @code{TypeError}, and present a more informative error message.

@item 
gh-138008@footnote{https://github.com/python/cpython/issues/138008}: Fix segmentation faults in the @ref{2e,,ctypes} module due to
invalid @ref{1810,,argtypes}. Patch by Dung Nguyen.

@item 
gh-60462@footnote{https://github.com/python/cpython/issues/60462}: Fix @ref{180c,,locale.strxfrm()} on Solaris (and possibly other
platforms).

@item 
gh-138239@footnote{https://github.com/python/cpython/issues/138239}: The REPL now highlights @ref{66d,,type} as a soft keyword in
@ref{66d,,type statements}.

@item 
gh-138204@footnote{https://github.com/python/cpython/issues/138204}: Forbid expansion of shared anonymous @ref{94,,memory maps}
on Linux, which caused a bus error.

@item 
gh-138010@footnote{https://github.com/python/cpython/issues/138010}: Fix an issue where defining a class with an
@ref{48a,,@@warnings.deprecated}-decorated base class
may not invoke the correct @ref{844,,__init_subclass__()} method in
cases involving multiple inheritance. Patch by Brian Schubert.

@item 
gh-138151@footnote{https://github.com/python/cpython/issues/138151}: In @ref{6,,annotationlib}, improve evaluation of forward
references to nonlocal variables that are not yet defined when the
annotations are initially evaluated.

@item 
gh-137317@footnote{https://github.com/python/cpython/issues/137317}: @ref{231,,inspect.signature()} now correctly handles classes that
use a descriptor on a wrapped @code{__init__()} or @code{__new__()}
method. Contributed by Yongyu Yan.

@item 
gh-137754@footnote{https://github.com/python/cpython/issues/137754}: Fix import of the @ref{13b,,zoneinfo} module if the C
implementation of the @ref{34,,datetime} module is not available.

@item 
gh-137490@footnote{https://github.com/python/cpython/issues/137490}: Handle @ref{1811,,ECANCELED} in the same way as
@ref{f8d,,EINTR} in @ref{fb1,,signal.sigwaitinfo()} on NetBSD.

@item 
gh-137477@footnote{https://github.com/python/cpython/issues/137477}: Fix @code{inspect.getblock()}, @ref{1807,,inspect.getsourcelines()}
and @ref{1812,,inspect.getsource()} for generator expressions.

@item 
gh-137044@footnote{https://github.com/python/cpython/issues/137044}: Return large limit values as positive integers instead of
negative integers in @ref{1813,,resource.getrlimit()}. Accept large values and
reject negative values (except @ref{1814,,RLIM_INFINITY}) for limits
in @ref{1815,,resource.setrlimit()}.

@item 
gh-75989@footnote{https://github.com/python/cpython/issues/75989}: @ref{29d,,tarfile.TarFile.extractall()} and
@ref{29e,,tarfile.TarFile.extract()} now overwrite symlinks when extracting
hardlinks. (Contributed by Alexander Enrique Urieles Nieto in
gh-75989@footnote{https://github.com/python/cpython/issues/75989}.)

@item 
gh-137017@footnote{https://github.com/python/cpython/issues/137017}: Fix @ref{b4c,,threading.Thread.is_alive} to remain @code{True} until
the underlying OS thread is fully cleaned up. This avoids false negatives
in edge cases involving thread monitoring or premature
@code{threading.Thread.is_alive} calls.

@item 
gh-137273@footnote{https://github.com/python/cpython/issues/137273}: Fix debug assertion failure in @ref{931,,locale.setlocale()} on
Windows.

@item 
gh-137239@footnote{https://github.com/python/cpython/issues/137239}: @ref{6d,,heapq}: Update @code{heapq.__all__} with @code{*_max}
functions.

@item 
gh-81325@footnote{https://github.com/python/cpython/issues/81325}: @ref{141c,,tarfile.TarFile} now accepts a @ref{5a1,,path-like} when working on a tar archive. (Contributed by
Alexander Enrique Urieles Nieto in gh-81325@footnote{https://github.com/python/cpython/issues/81325}.)

@item 
gh-137185@footnote{https://github.com/python/cpython/issues/137185}: Fix a potential async-signal-safety issue in
@ref{5c,,faulthandler} when printing C stack traces.

@item 
gh-136914@footnote{https://github.com/python/cpython/issues/136914}: Fix retrieval of @ref{1816,,doctest.DocTest.lineno} for objects
decorated with @ref{1817,,functools.cache()} or
@ref{764,,functools.cached_property}.

@item 
gh-136912@footnote{https://github.com/python/cpython/issues/136912}: @ref{d38,,hmac.digest()} now properly handles large keys and
messages by falling back to the pure Python implementation when necessary.
Patch by Bénédikt Tran.

@item 
gh-83424@footnote{https://github.com/python/cpython/issues/83424}: Allows creating a @ref{be2,,ctypes.CDLL} without name when passing
a handle as an argument.

@item 
gh-136234@footnote{https://github.com/python/cpython/issues/136234}: Fix @ref{1818,,asyncio.WriteTransport.writelines()} to be robust to
connection failure, by using the same behavior as
@ref{1819,,write()}.

@item 
gh-136507@footnote{https://github.com/python/cpython/issues/136507}: Fix mimetypes CLI to handle multiple file parameters.

@item 
gh-136057@footnote{https://github.com/python/cpython/issues/136057}: Fixed the bug in @ref{aa,,pdb} and @ref{10,,bdb} where @code{next} and
@code{step} can’t go over the line if a loop exists in the line.

@item 
gh-135386@footnote{https://github.com/python/cpython/issues/135386}: Fix opening a @ref{39,,dbm.sqlite3} database for reading from
read-only file or directory.

@item 
gh-135444@footnote{https://github.com/python/cpython/issues/135444}: Fix @ref{4cc,,asyncio.DatagramTransport.sendto()} to account for
datagram header size when data cannot be sent.

@item 
gh-126631@footnote{https://github.com/python/cpython/issues/126631}: Fix @ref{98,,multiprocessing} @code{forkserver} bug which prevented
@code{__main__} from being preloaded.

@item 
gh-135307@footnote{https://github.com/python/cpython/issues/135307}: @ref{3f,,email}: Fix exception in @code{set_content()} when encoding
text and max_line_length is set to @code{0} or @code{None} (unlimited).

@item 
gh-134453@footnote{https://github.com/python/cpython/issues/134453}: Fixed @ref{17fb,,subprocess.Popen.communicate()} @code{input=} handling
of @ref{166,,memoryview} instances that were non-byte shaped on POSIX
platforms. Those are now properly cast to a byte shaped view instead of
truncating the input.  Windows platforms did not have this bug.

@item 
gh-134698@footnote{https://github.com/python/cpython/issues/134698}: Fix a crash when calling methods of @ref{355,,ssl.SSLContext} or
@ref{aed,,ssl.SSLSocket} across multiple threads.

@item 
gh-125996@footnote{https://github.com/python/cpython/issues/125996}: Fix thread safety of @ref{7f4,,collections.OrderedDict}. Patch by
Kumar Aditya.

@item 
gh-133789@footnote{https://github.com/python/cpython/issues/133789}: Fix unpickling of @ref{a8,,pathlib} objects that were pickled in
Python 3.13.

@item 
gh-127081@footnote{https://github.com/python/cpython/issues/127081}: Fix libc thread safety issues with @ref{35,,dbm} by performing
stateful operations in critical sections.

@item 
gh-132551@footnote{https://github.com/python/cpython/issues/132551}: Make @ref{10aa,,io.BytesIO} safe in @ref{1f6,,free-threaded} build.

@item 
gh-131788@footnote{https://github.com/python/cpython/issues/131788}: Make @code{ResourceTracker.send} from @ref{98,,multiprocessing}
re-entrant safe

@item 
gh-118981@footnote{https://github.com/python/cpython/issues/118981}: Fix potential hang in @code{multiprocessing.popen_spawn_posix}
that can happen when the child proc dies early by closing the child fds
right away.

@item 
gh-102431@footnote{https://github.com/python/cpython/issues/102431}: Clarify constraints for “logical” arguments in methods of
@ref{12bb,,decimal.Context}.

@item 
gh-78319@footnote{https://github.com/python/cpython/issues/78319}: UTF8 support for the IMAP APPEND command has been made RFC
compliant.

@item 
bpo-38735@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38735}: Fix failure when importing a module from the root directory on
unix-like platforms with sys.pycache_prefix set.

@item 
bpo-41839@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41839}: Allow negative priority values from
@ref{1315,,os.sched_get_priority_min()} and @ref{1314,,os.sched_get_priority_max()}
functions.
@end itemize

@node IDLE<5>,Documentation<7>,Library<9>,Python 3 14 1 final
@anchor{whatsnew/changelog id50}@anchor{181a}
@subsubsection IDLE



@itemize -

@item 
gh-96491@footnote{https://github.com/python/cpython/issues/96491}: Deduplicate version number in IDLE shell title bar after saving
to a file.

@item 
gh-139742@footnote{https://github.com/python/cpython/issues/139742}: Colorize t-string prefixes for template strings in IDLE, as
done for f-string prefixes.
@end itemize

@node Documentation<7>,Core and Builtins<8>,IDLE<5>,Python 3 14 1 final
@anchor{whatsnew/changelog id51}@anchor{181b}
@subsubsection Documentation



@itemize -

@item 
gh-141994@footnote{https://github.com/python/cpython/issues/141994}: @ref{131,,xml.sax.handler}: Make Documentation of
@ref{181c,,xml.sax.handler.feature_external_ges} warn of opening up to
external entity attacks@footnote{https://en.wikipedia.org/wiki/XML_external_entity_attack}. Patch by
Sebastian Pipping.

@item 
gh-140578@footnote{https://github.com/python/cpython/issues/140578}: Remove outdated sencence in the documentation for
@ref{98,,multiprocessing}, that implied that
@ref{94e,,concurrent.futures.ThreadPoolExecutor} did not exist.
@end itemize

@node Core and Builtins<8>,Library<10>,Documentation<7>,Python 3 14 1 final
@anchor{whatsnew/changelog id52}@anchor{181d}
@subsubsection Core and Builtins



@itemize -

@item 
gh-142048@footnote{https://github.com/python/cpython/issues/142048}: Fix quadratically increasing garbage collection delays in
free-threaded build.
@end itemize

@node Library<10>,Core and Builtins<9>,Core and Builtins<8>,Python 3 14 1 final
@anchor{whatsnew/changelog id53}@anchor{181e}
@subsubsection Library



@itemize -

@item 
gh-116738@footnote{https://github.com/python/cpython/issues/116738}: Fix thread safety issue with @ref{be,,re} scanner objects in
free-threaded builds.
@end itemize

@node Core and Builtins<9>,Library<11>,Library<10>,Python 3 14 1 final
@anchor{whatsnew/changelog id54}@anchor{181f}
@subsubsection Core and Builtins



@itemize -

@item 
gh-141930@footnote{https://github.com/python/cpython/issues/141930}: When importing a module, use Python’s regular file object to
ensure that writes to @code{.pyc} files are complete or an appropriate error
is raised.

@item 
gh-120158@footnote{https://github.com/python/cpython/issues/120158}: Fix inconsistent state when enabling or disabling monitoring
events too many times.

@item 
gh-139653@footnote{https://github.com/python/cpython/issues/139653}: Only raise a @code{RecursionError} or trigger a fatal error if the
stack pointer is both below the limit pointer `and' above the stack base.
If outside of these bounds assume that it is OK. This prevents false
positives when user-space threads swap stacks.

@item 
gh-139103@footnote{https://github.com/python/cpython/issues/139103}: Improve multithreaded scaling of dataclasses on the
free-threaded build.

@item 
gh-141579@footnote{https://github.com/python/cpython/issues/141579}: Fix @ref{69b,,sys.activate_stack_trampoline()} to properly support
the @code{perf_jit} backend. Patch by Pablo Galindo.

@item 
gh-114203@footnote{https://github.com/python/cpython/issues/114203}: Skip locking if object is already locked by two-mutex critical
section.

@item 
gh-141528@footnote{https://github.com/python/cpython/issues/141528}: Suggest using @ref{1820,,concurrent.interpreters.Interpreter.close()}
instead of the private @code{_interpreters.destroy} function when warning
about remaining subinterpreters. Patch by Sergey Miryanov.

@item 
gh-141312@footnote{https://github.com/python/cpython/issues/141312}: Fix the assertion failure in the @code{__setstate__} method of the
range iterator when a non-integer argument is passed. Patch by Sergey
Miryanov.
@end itemize

@node Library<11>,Core and Builtins<10>,Core and Builtins<9>,Python 3 14 1 final
@anchor{whatsnew/changelog id55}@anchor{1821}
@subsubsection Library



@itemize -

@item 
gh-116738@footnote{https://github.com/python/cpython/issues/116738}: Make csv module thread-safe on the @ref{1f6,,free threaded} build.
@end itemize

@node Core and Builtins<10>,Library<12>,Library<11>,Python 3 14 1 final
@anchor{whatsnew/changelog id56}@anchor{1822}
@subsubsection Core and Builtins



@itemize -

@item 
gh-140939@footnote{https://github.com/python/cpython/issues/140939}: Fix memory leak when @ref{342,,bytearray} or @ref{193,,bytes} is
formated with the @code{%*b} format with a large width that results in a
@ref{1761,,MemoryError}.
@end itemize

@node Library<12>,Core and Builtins<11>,Core and Builtins<10>,Python 3 14 1 final
@anchor{whatsnew/changelog id57}@anchor{1823}
@subsubsection Library



@itemize -

@item 
gh-140260@footnote{https://github.com/python/cpython/issues/140260}: Fix @ref{db,,struct} data race in endian table initialization with
subinterpreters. Patch by Shamil Abdulaev.
@end itemize

@node Core and Builtins<11>,Library<13>,Library<12>,Python 3 14 1 final
@anchor{whatsnew/changelog id58}@anchor{1824}
@subsubsection Core and Builtins



@itemize -

@item 
gh-140530@footnote{https://github.com/python/cpython/issues/140530}: Fix a reference leak when @code{raise exc from cause} fails. Patch
by Bénédikt Tran.

@item 
gh-140373@footnote{https://github.com/python/cpython/issues/140373}: Correctly emit @code{PY_UNWIND} event when generator object is
closed. Patch by Mikhail Efimov.

@item 
gh-140576@footnote{https://github.com/python/cpython/issues/140576}: Fixed crash in @ref{702,,tokenize.generate_tokens()} in case of
specific incorrect input. Patch by Mikhail Efimov.

@item 
gh-140551@footnote{https://github.com/python/cpython/issues/140551}: Fixed crash in @ref{184,,dict} if @ref{17ab,,dict.clear()} is called at
the lookup stage. Patch by Mikhail Efimov and Inada Naoki.

@item 
gh-140517@footnote{https://github.com/python/cpython/issues/140517}: Fixed a reference leak when iterating over the result of
@ref{1a0,,map()} with @code{strict=True} when the input iterables have different
lengths. Patch by Mikhail Efimov.

@item 
gh-140471@footnote{https://github.com/python/cpython/issues/140471}: Fix potential buffer overflow in @ref{4c4,,ast.AST} node
initialization when encountering malformed @ref{1825,,_fields}
containing non-@ref{16a,,str}.

@item 
gh-140431@footnote{https://github.com/python/cpython/issues/140431}: Fix a crash in Python’s @ref{1826,,garbage collector} due to partially initialized @ref{6ba,,coroutine} objects when
coroutine origin tracking depth is enabled
(@ref{d8b,,sys.set_coroutine_origin_tracking_depth()}).
@end itemize

@node Library<13>,Core and Builtins<12>,Core and Builtins<11>,Python 3 14 1 final
@anchor{whatsnew/changelog id59}@anchor{1827}
@subsubsection Library



@itemize -

@item 
gh-140398@footnote{https://github.com/python/cpython/issues/140398}: Fix memory leaks in @ref{bf,,readline} functions
@ref{1828,,read_init_file()}, @ref{1829,,read_history_file()},
@ref{182a,,write_history_file()}, and
@ref{1057,,append_history_file()} when @ref{613,,PySys_Audit()} fails.
@end itemize

@node Core and Builtins<12>,Library<14>,Library<13>,Python 3 14 1 final
@anchor{whatsnew/changelog id60}@anchor{182b}
@subsubsection Core and Builtins



@itemize -

@item 
gh-140406@footnote{https://github.com/python/cpython/issues/140406}: Fix memory leak when an object’s @ref{cf9,,__hash__()}
method returns an object that isn’t an @ref{19c,,int}.

@item 
gh-140358@footnote{https://github.com/python/cpython/issues/140358}: Restore elapsed time and unreachable object count in GC debug
output. These were inadvertently removed during a refactor of @code{gc.c}.
The debug log now again reports elapsed collection time and the number of
unreachable objects. Contributed by Pål Grønås Drange.

@item 
gh-140306@footnote{https://github.com/python/cpython/issues/140306}: Fix memory leaks in cross-interpreter channel operations and
shared namespace handling.

@item 
gh-140301@footnote{https://github.com/python/cpython/issues/140301}: Fix memory leak of @code{PyConfig} in subinterpreters.

@item 
gh-140257@footnote{https://github.com/python/cpython/issues/140257}: Fix data race between interpreter_clear() and take_gil() on
eval_breaker during finalization with daemon threads.

@item 
gh-139951@footnote{https://github.com/python/cpython/issues/139951}: Fixes a regression in GC performance for a growing heap
composed mostly of small tuples.


@itemize *

@item 
Counts number of actually tracked objects, instead of trackable objects.
This ensures that untracking tuples has the desired effect of reducing GC overhead.

@item 
Does not track most untrackable tuples during creation.
This prevents large numbers of small tuples causing excessive GCs.
@end itemize

@item 
gh-140104@footnote{https://github.com/python/cpython/issues/140104}: Fix a bug with exception handling in the JIT. Patch by Ken Jin.
Bug reported by Daniel Diniz.

@item 
gh-140061@footnote{https://github.com/python/cpython/issues/140061}: Fixing the checking of whether an object is uniquely referenced
to ensure free-threaded compatibility. Patch by Sergey Miryanov.

@item 
gh-140067@footnote{https://github.com/python/cpython/issues/140067}: Fix memory leak in sub-interpreter creation.

@item 
gh-140000@footnote{https://github.com/python/cpython/issues/140000}: Fix potential memory leak when a reference cycle exists between
an instance of @ref{2b0,,typing.TypeAliasType}, @ref{487,,typing.TypeVar},
@ref{488,,typing.ParamSpec}, or @ref{489,,typing.TypeVarTuple} and its
@code{__name__} attribute. Patch by Mikhail Efimov.

@item 
gh-139914@footnote{https://github.com/python/cpython/issues/139914}: Restore support for HP PA-RISC, which has an upwards-growing
stack.

@item 
gh-139988@footnote{https://github.com/python/cpython/issues/139988}: Fix a memory leak when failing to create a
@ref{2aa,,Union} type. Patch by Bénédikt Tran.

@item 
gh-139748@footnote{https://github.com/python/cpython/issues/139748}: Fix reference leaks in error branches of functions accepting
path strings or bytes such as @ref{4b2,,compile()} and @ref{1669,,os.system()}. Patch
by Bénédikt Tran.

@item 
gh-139516@footnote{https://github.com/python/cpython/issues/139516}: Fix lambda colon erroneously start format spec in f-string in
tokenizer.

@item 
gh-139640@footnote{https://github.com/python/cpython/issues/139640}: @ref{1c4,,ast.parse()} no longer emits syntax warnings for
@code{return}/@code{break}/@code{continue} in @code{finally} (see 
@geindex Python Enhancement Proposals; PEP 765
PEP 765@footnote{https://peps.python.org/pep-0765/}) – they
are only emitted during compilation.

@item 
gh-139640@footnote{https://github.com/python/cpython/issues/139640}: Fix swallowing some syntax warnings in different modules if
they accidentally have the same message and are emitted from the same
line. Fix duplicated warnings in the @code{finally} block.

@item 
gh-63161@footnote{https://github.com/python/cpython/issues/63161}: Support non-UTF-8 shebang and comments in Python source files if
non-UTF-8 encoding is specified. Detect decoding error in comments for
default (UTF-8) encoding. Show the line and position of decoding error for
default encoding in a traceback. Show the line containing the coding
cookie when it conflicts with the BOM in a traceback.
@end itemize

@node Library<14>,Core and Builtins<13>,Core and Builtins<12>,Python 3 14 1 final
@anchor{whatsnew/changelog id61}@anchor{182c}
@subsubsection Library



@itemize -

@item 
gh-116738@footnote{https://github.com/python/cpython/issues/116738}: Make @ref{94,,mmap} thread-safe on the @ref{1f6,,free threaded} build.
@end itemize

@node Core and Builtins<13>,Library<15>,Library<14>,Python 3 14 1 final
@anchor{whatsnew/changelog id62}@anchor{182d}
@subsubsection Core and Builtins



@itemize -

@item 
gh-138558@footnote{https://github.com/python/cpython/issues/138558}: Fix handling of unusual t-string annotations in annotationlib.
Patch by Dave Peck.

@item 
gh-134466@footnote{https://github.com/python/cpython/issues/134466}: Don’t run PyREPL in a degraded environment where setting
termios attributes is not allowed.

@item 
gh-138944@footnote{https://github.com/python/cpython/issues/138944}: Fix @ref{18f,,SyntaxError} message when invalid syntax appears on
the same line as a valid @code{import ... as ...} or @code{from ... import ... as
...} statement. Patch by Brian Schubert.

@item 
gh-105487@footnote{https://github.com/python/cpython/issues/105487}: Remove non-existent @ref{182e,,__copy__()},
@ref{1798,,__deepcopy__()}, and @ref{16b8,,__bases__} from the
@ref{17b9,,__dir__()} entries of @ref{9f2,,types.GenericAlias}.

@item 
gh-69605@footnote{https://github.com/python/cpython/issues/69605}: Fix some standard library submodules missing from the
@ref{492,,REPL} auto-completion of imports.
@end itemize

@node Library<15>,Core and Builtins<14>,Core and Builtins<13>,Python 3 14 1 final
@anchor{whatsnew/changelog id63}@anchor{182f}
@subsubsection Library



@itemize -

@item 
gh-116738@footnote{https://github.com/python/cpython/issues/116738}: Make @ref{2b,,cProfile} thread-safe on the @ref{1f6,,free threaded} build.

@item 
gh-138004@footnote{https://github.com/python/cpython/issues/138004}: On Solaris/Illumos platforms, thread names are now encoded as
ASCII to avoid errors on systems (e.g. OpenIndiana) that don’t support
non-ASCII names.
@end itemize

@node Core and Builtins<14>,C API<5>,Library<15>,Python 3 14 1 final
@anchor{whatsnew/changelog id64}@anchor{1830}
@subsubsection Core and Builtins



@itemize -

@item 
gh-137433@footnote{https://github.com/python/cpython/issues/137433}: Fix a potential deadlock in the @ref{1f6,,free threading} build
when daemon threads enable or disable profiling or tracing while the main
thread is shutting down the interpreter.

@item 
gh-137400@footnote{https://github.com/python/cpython/issues/137400}: Fix a crash in the @ref{1f6,,free threading} build when disabling
profiling or tracing across all threads with
@ref{782,,PyEval_SetProfileAllThreads()} or
@ref{664,,PyEval_SetTraceAllThreads()} or their Python equivalents
@ref{6f0,,threading.settrace_all_threads()} and
@ref{6f1,,threading.setprofile_all_threads()}.

@item 
gh-58124@footnote{https://github.com/python/cpython/issues/58124}: Fix name of the Python encoding in Unicode errors of the code
page codec: use “cp65000” and “cp65001” instead of “CP_UTF7” and “CP_UTF8”
which are not valid Python code names. Patch by Victor Stinner.

@item 
gh-132657@footnote{https://github.com/python/cpython/issues/132657}: Improve performance of @ref{7f3,,frozenset} by removing locks in
the free-threading build.

@item 
gh-133400@footnote{https://github.com/python/cpython/issues/133400}: Fixed Ctrl+D (^D) behavior in _pyrepl module to match old
pre-3.13 REPL behavior.

@item 
gh-128640@footnote{https://github.com/python/cpython/issues/128640}: Fix a crash when using threads inside of a subinterpreter.
@end itemize

@node C API<5>,Build<6>,Core and Builtins<14>,Python 3 14 1 final
@anchor{whatsnew/changelog id65}@anchor{1831}
@subsubsection C API



@itemize -

@item 
gh-137422@footnote{https://github.com/python/cpython/issues/137422}: Fix @ref{1f6,,free threading} race condition in
@ref{5fb,,PyImport_AddModuleRef()}. It was previously possible for two calls
to the function return two different objects, only one of which was stored
in @ref{1771,,sys.modules}.

@item 
gh-140042@footnote{https://github.com/python/cpython/issues/140042}: Removed the sqlite3_shutdown call that could cause closing
connections for sqlite when used with multiple sub interpreters.

@item 
gh-141042@footnote{https://github.com/python/cpython/issues/141042}: Make qNaN in @ref{96e,,PyFloat_Pack2()} and
@ref{96f,,PyFloat_Pack4()}, if while conversion to a narrower precision
floating-point format — the remaining after truncation payload will be
zero.  Patch by Sergey B Kirpichev.

@item 
gh-140487@footnote{https://github.com/python/cpython/issues/140487}: Fix @ref{1832,,Py_RETURN_NOTIMPLEMENTED} in limited C API 3.11
and older: don’t treat @code{Py_NotImplemented} as immortal. Patch by Victor
Stinner.

@item 
gh-140153@footnote{https://github.com/python/cpython/issues/140153}: Fix @ref{2d1,,Py_REFCNT()} definition on limited C API 3.11-3.13.
Patch by Victor Stinner.

@item 
gh-139653@footnote{https://github.com/python/cpython/issues/139653}: Add @ref{464,,PyUnstable_ThreadState_SetStackProtection()} and
@ref{465,,PyUnstable_ThreadState_ResetStackProtection()} functions to set the
stack protection base address and stack protection size of a Python thread
state. Patch by Victor Stinner.
@end itemize

@node Build<6>,,C API<5>,Python 3 14 1 final
@anchor{whatsnew/changelog id66}@anchor{1833}
@subsubsection Build



@itemize -

@item 
gh-141808@footnote{https://github.com/python/cpython/issues/141808}: Do not generate the jit stencils twice in case of PGO builds on
Windows.

@item 
gh-141784@footnote{https://github.com/python/cpython/issues/141784}: Fix @code{_remote_debugging_module.c} compilation on 32-bit Linux.
Include Python.h before system headers to make sure that
@code{_remote_debugging_module.c} uses the same types (ABI) than Python.
Patch by Victor Stinner.

@item 
gh-140768@footnote{https://github.com/python/cpython/issues/140768}: Warn when the WASI SDK version doesn’t match what’s supported.

@item 
gh-140513@footnote{https://github.com/python/cpython/issues/140513}: Generate a clear compilation error when
@code{_Py_TAIL_CALL_INTERP} is enabled but either @code{preserve_none} or
@code{musttail} is not supported.

@item 
gh-140189@footnote{https://github.com/python/cpython/issues/140189}: iOS builds were added to CI.

@item 
gh-138489@footnote{https://github.com/python/cpython/issues/138489}: When cross-compiling for WASI by @code{build_wasm} or
@code{build_emscripten}, the @code{build-details.json} step is now included in
the build process, just like with native builds.

This fixes the @code{libinstall} task which requires the
@code{build-details.json} file during the process.

@item 
gh-137618@footnote{https://github.com/python/cpython/issues/137618}: @code{PYTHON_FOR_REGEN} now requires Python 3.10 to Python 3.15.
Patch by Adam Turner.

@item 
gh-123681@footnote{https://github.com/python/cpython/issues/123681}: Check the @code{strftime()} behavior at runtime instead of at the
compile time to support cross-compiling. Remove the internal macro
@code{_Py_NORMALIZE_CENTURY}.
@end itemize

@node Python 3 14 0 final,Python 3 14 0 release candidate 3,Python 3 14 1 final,Changelog
@anchor{whatsnew/changelog python-3-14-0-final}@anchor{1834}
@subsection Python 3.14.0 final


`Release date: 2025-10-07'

@menu
* macOS: macOS<5>. 
* Windows: Windows<6>. 
* Tools/Demos: Tools/Demos<3>. 
* Security: Security<8>. 
* Library: Library<16>. 

@end menu

@node macOS<5>,Windows<6>,,Python 3 14 0 final
@anchor{whatsnew/changelog id67}@anchor{1835}
@subsubsection macOS



@itemize -

@item 
gh-124111@footnote{https://github.com/python/cpython/issues/124111}: Update macOS installer to use Tcl/Tk 8.6.17.

@item 
gh-139573@footnote{https://github.com/python/cpython/issues/139573}: Updated bundled version of OpenSSL to 3.0.18.
@end itemize

@node Windows<6>,Tools/Demos<3>,macOS<5>,Python 3 14 0 final
@anchor{whatsnew/changelog id68}@anchor{1836}
@subsubsection Windows



@itemize -

@item 
gh-139573@footnote{https://github.com/python/cpython/issues/139573}: Updated bundled version of OpenSSL to 3.0.18.
@end itemize

@node Tools/Demos<3>,Security<8>,Windows<6>,Python 3 14 0 final
@anchor{whatsnew/changelog id69}@anchor{1837}
@subsubsection Tools/Demos



@itemize -

@item 
gh-139330@footnote{https://github.com/python/cpython/issues/139330}: SBOM generation tool didn’t cross-check the version and
checksum values against the @code{Modules/expat/refresh.sh} script, leading
to the values becoming out-of-date during routine updates.

@item 
gh-132006@footnote{https://github.com/python/cpython/issues/132006}: XCframeworks now include privacy manifests to satisfy Apple App
Store submission requirements.

@item 
gh-138171@footnote{https://github.com/python/cpython/issues/138171}: A script for building an iOS XCframework was added. As part of
this change, the top level @code{iOS} folder has been moved to be a
subdirectory of the @code{Apple} folder.
@end itemize

@node Security<8>,Library<16>,Tools/Demos<3>,Python 3 14 0 final
@anchor{whatsnew/changelog id70}@anchor{1838}
@subsubsection Security



@itemize -

@item 
gh-139400@footnote{https://github.com/python/cpython/issues/139400}: @ref{12d,,xml.parsers.expat}: Make sure that parent Expat parsers
are only garbage-collected once they are no longer referenced by
subparsers created by
@ref{17b2,,ExternalEntityParserCreate()}. Patch by
Sebastian Pipping.
@end itemize

@node Library<16>,,Security<8>,Python 3 14 0 final
@anchor{whatsnew/changelog id71}@anchor{1839}
@subsubsection Library



@itemize -

@item 
gh-139312@footnote{https://github.com/python/cpython/issues/139312}: Upgrade bundled libexpat to 2.7.3
@end itemize

@node Python 3 14 0 release candidate 3,Python 3 14 0 release candidate 2,Python 3 14 0 final,Changelog
@anchor{whatsnew/changelog python-3-14-0-release-candidate-3}@anchor{183a}
@subsection Python 3.14.0 release candidate 3


`Release date: 2025-09-18'

@menu
* Windows: Windows<7>. 
* Tools/Demos: Tools/Demos<4>. 
* Security: Security<9>. 
* Library: Library<17>. 
* Core and Builtins: Core and Builtins<15>. 

@end menu

@node Windows<7>,Tools/Demos<4>,,Python 3 14 0 release candidate 3
@anchor{whatsnew/changelog id72}@anchor{183b}
@subsubsection Windows



@itemize -

@item 
gh-138896@footnote{https://github.com/python/cpython/issues/138896}: Fix error installing C runtime on non-updated Windows machines
@end itemize

@node Tools/Demos<4>,Security<9>,Windows<7>,Python 3 14 0 release candidate 3
@anchor{whatsnew/changelog id73}@anchor{183c}
@subsubsection Tools/Demos



@itemize -

@item 
gh-137873@footnote{https://github.com/python/cpython/issues/137873}: The iOS test runner has been simplified, resolving some issues
that have been observed using the runner in GitHub Actions and Azure
Pipelines test environments.
@end itemize

@node Security<9>,Library<17>,Tools/Demos<4>,Python 3 14 0 release candidate 3
@anchor{whatsnew/changelog id74}@anchor{183d}
@subsubsection Security



@itemize -

@item 
gh-135661@footnote{https://github.com/python/cpython/issues/135661}: Fix CDATA section parsing in @ref{a7d,,html.parser.HTMLParser}
according to the HTML5 standard: @code{] ]>} and @code{]] >} no longer end the
CDATA section. Add private method @code{_set_support_cdata()} which can be
used to specify how to parse @code{<[CDATA[} — as a CDATA section in
foreign content (SVG or MathML) or as a bogus comment in the HTML
namespace.
@end itemize

@node Library<17>,Core and Builtins<15>,Security<9>,Python 3 14 0 release candidate 3
@anchor{whatsnew/changelog id75}@anchor{183e}
@subsubsection Library



@itemize -

@item 
gh-138998@footnote{https://github.com/python/cpython/issues/138998}: Update bundled libexpat to 2.7.2

@item 
gh-118803@footnote{https://github.com/python/cpython/issues/118803}: Add back @ref{340,,collections.abc.ByteString} and
@ref{343,,typing.ByteString}. Both had been removed in prior alpha, beta and
release candidates for Python 3.14, but their removal has now been
postponed to Python 3.17.

@item 
gh-137226@footnote{https://github.com/python/cpython/issues/137226}: Fix @ref{8c2,,typing.get_type_hints()} calls on generic
@ref{330,,typing.TypedDict} classes defined with string annotations.

@item 
gh-138804@footnote{https://github.com/python/cpython/issues/138804}: Raise @ref{199,,TypeError} instead of @ref{5f0,,AttributeError} when an
argument of incorrect type is passed to @ref{582,,shlex.quote()}. This restores
the behavior of the function prior to 3.14.

@item 
gh-128636@footnote{https://github.com/python/cpython/issues/128636}: Fix crash in PyREPL when os.environ is overwritten with an
invalid value for mac

@item 
gh-138514@footnote{https://github.com/python/cpython/issues/138514}: Raise @ref{2ee,,ValueError} when a multi-character string is passed
to the `echo_char' parameter of @ref{21f,,getpass.getpass()}. Patch by Benjamin
Johnson.

@item 
gh-138515@footnote{https://github.com/python/cpython/issues/138515}: @ref{3f,,email} is added to Emscripten build.

@item 
gh-99948@footnote{https://github.com/python/cpython/issues/99948}: @ref{f4b,,ctypes.util.find_library()} now works in Emscripten build.

@item 
gh-138253@footnote{https://github.com/python/cpython/issues/138253}: Add the `block' parameter in the @code{put()} and @code{get()}
methods of the @ref{25,,concurrent.interpreters} queues for compatibility
with the @ref{15a0,,queue.Queue} interface.

@item 
gh-138133@footnote{https://github.com/python/cpython/issues/138133}: Prevent infinite traceback loop when sending CTRL^C to Python
through @code{strace}.

@item 
gh-134869@footnote{https://github.com/python/cpython/issues/134869}: Fix an issue where pressing Ctrl+C during tab completion in the
REPL would leave the autocompletion menu in a corrupted state.

@item 
gh-90548@footnote{https://github.com/python/cpython/issues/90548}: Fix @code{musl} detection for @ref{183f,,platform.libc_ver()} on Alpine
Linux if compiled with –strip-all.

@item 
gh-136134@footnote{https://github.com/python/cpython/issues/136134}: @code{SMTP.auth_cram_md5()} now raises an
@ref{11a7,,SMTPException} instead of a @ref{2ee,,ValueError} if Python has
been built without MD5 support. In particular, @ref{b2d,,SMTP}
clients will not attempt to use this method even if the remote server is
assumed to support it. Patch by Bénédikt Tran.

@item 
gh-136134@footnote{https://github.com/python/cpython/issues/136134}: @ref{1840,,IMAP4.login_cram_md5} now
raises an @ref{1841,,IMAP4.error} if CRAM-MD5
authentication is not supported. Patch by Bénédikt Tran.

@item 
gh-134953@footnote{https://github.com/python/cpython/issues/134953}: Expand @code{_colorize} theme with @code{keyword_constant} and
implement in @ref{492,,repl}.
@end itemize

@node Core and Builtins<15>,,Library<17>,Python 3 14 0 release candidate 3
@anchor{whatsnew/changelog id76}@anchor{1842}
@subsubsection Core and Builtins



@itemize -

@item 
gh-71810@footnote{https://github.com/python/cpython/issues/71810}: Raise @ref{a87,,OverflowError} for @code{(-1).to_bytes()} for signed
conversions when bytes count is zero.  Patch by Sergey B Kirpichev.

@item 
gh-138192@footnote{https://github.com/python/cpython/issues/138192}: Fix @ref{28,,contextvars} initialization so that all
subinterpreters are assigned the @ref{1843,,MISSING} value.

@item 
gh-138479@footnote{https://github.com/python/cpython/issues/138479}: Fix a crash when a generic object’s @code{__typing_subst__}
returns an object that isn’t a @ref{614,,tuple}.

@item 
gh-138372@footnote{https://github.com/python/cpython/issues/138372}: Fix @ref{1af,,SyntaxWarning} emitted for erroneous subscript
expressions involving @ref{1844,,template string literals}. Patch
by Brian Schubert.

@item 
gh-138318@footnote{https://github.com/python/cpython/issues/138318}: The default REPL now avoids highlighting built-in names (for
instance @ref{185,,set} or @ref{19a,,format()}) when they are used as attribute
names (for instance in @code{value.set} or @code{text.format}).

@item 
gh-138349@footnote{https://github.com/python/cpython/issues/138349}: Fix crash in certain cases where a module contains both a
module-level annotation and a comprehension.

@item 
gh-137384@footnote{https://github.com/python/cpython/issues/137384}: Fix a crash when using the @ref{119,,warnings} module in a
finalizer at shutdown. Patch by Kumar Aditya.

@item 
gh-137883@footnote{https://github.com/python/cpython/issues/137883}: Fix runaway recursion when calling a function with keyword
arguments.

@item 
gh-137079@footnote{https://github.com/python/cpython/issues/137079}: Fix keyword typo recognition when parsing files. Patch by Pablo
Galindo.

@item 
gh-137728@footnote{https://github.com/python/cpython/issues/137728}: Fix the JIT’s handling of many local variables. This previously
caused a segfault.

@item 
gh-137576@footnote{https://github.com/python/cpython/issues/137576}: Fix for incorrect source code being shown in tracebacks from
the Basic REPL when 
@geindex PYTHONSTARTUP
@geindex environment variable; PYTHONSTARTUP
@ref{1ba,,PYTHONSTARTUP} is given. Patch by Adam Hartz.
@end itemize

@node Python 3 14 0 release candidate 2,Python 3 14 0 release candidate 1,Python 3 14 0 release candidate 3,Changelog
@anchor{whatsnew/changelog python-3-14-0-release-candidate-2}@anchor{1845}
@subsection Python 3.14.0 release candidate 2


`Release date: 2025-08-14'

@menu
* macOS: macOS<6>. 
* Windows: Windows<8>. 
* Library: Library<18>. 
* Documentation: Documentation<8>. 
* Core and Builtins: Core and Builtins<16>. 
* C API: C API<6>. 
* Build: Build<7>. 

@end menu

@node macOS<6>,Windows<8>,,Python 3 14 0 release candidate 2
@anchor{whatsnew/changelog id77}@anchor{1846}
@subsubsection macOS



@itemize -

@item 
gh-137450@footnote{https://github.com/python/cpython/issues/137450}: macOS installer shell path management improvements: separate
the installer @code{Shell profile updater} postinstall script from the
@code{Update Shell Profile.command} to enable more robust error handling.

@item 
gh-137134@footnote{https://github.com/python/cpython/issues/137134}: Update macOS installer to ship with SQLite version 3.50.4.
@end itemize

@node Windows<8>,Library<18>,macOS<6>,Python 3 14 0 release candidate 2
@anchor{whatsnew/changelog id78}@anchor{1847}
@subsubsection Windows



@itemize -

@item 
gh-137134@footnote{https://github.com/python/cpython/issues/137134}: Update Windows installer to ship with SQLite 3.50.4.
@end itemize

@node Library<18>,Documentation<8>,Windows<8>,Python 3 14 0 release candidate 2
@anchor{whatsnew/changelog id79}@anchor{1848}
@subsubsection Library



@itemize -

@item 
gh-137426@footnote{https://github.com/python/cpython/issues/137426}: Remove the code deprecation of
@code{importlib.abc.ResourceLoader}. It is documented as deprecated, but left
for backwards compatibility with other classes in @code{importlib.abc}.

@item 
gh-137282@footnote{https://github.com/python/cpython/issues/137282}: Fix tab completion and @ref{845,,dir()} on
@ref{24,,concurrent.futures}.

@item 
gh-137257@footnote{https://github.com/python/cpython/issues/137257}: Bump the version of pip bundled in ensurepip to version 25.2

@item 
gh-137226@footnote{https://github.com/python/cpython/issues/137226}: Fix behavior of @ref{1803,,annotationlib.ForwardRef.evaluate()} when
the `type_params' parameter is passed and the name of a type param is also
present in an enclosing scope.

@item 
gh-130522@footnote{https://github.com/python/cpython/issues/130522}: Fix unraisable @ref{199,,TypeError} raised during
@ref{47a,,interpreter shutdown} in the @ref{f3,,threading} module.

@item 
gh-137059@footnote{https://github.com/python/cpython/issues/137059}: Fix handling of file URLs with a Windows drive letter in the
URL authority by @ref{2bf,,urllib.request.url2pathname()}. This fixes a
regression in earlier pre-releases of Python 3.14.

@item 
gh-130577@footnote{https://github.com/python/cpython/issues/130577}: @ref{e4,,tarfile} now validates archives to ensure member offsets
are non-negative.  (Contributed by Alexander Enrique Urieles Nieto in
gh-130577@footnote{https://github.com/python/cpython/issues/130577}.)

@item 
gh-135228@footnote{https://github.com/python/cpython/issues/135228}: When @ref{33,,dataclasses} replaces a class with a slotted
dataclass, the original class can now be garbage collected again. Earlier
changes in Python 3.14 caused this class to always remain in existence
together with the replacement class synthesized by @code{dataclasses}.
@end itemize

@node Documentation<8>,Core and Builtins<16>,Library<18>,Python 3 14 0 release candidate 2
@anchor{whatsnew/changelog id80}@anchor{1849}
@subsubsection Documentation



@itemize -

@item 
gh-136155@footnote{https://github.com/python/cpython/issues/136155}: We are now checking for fatal errors in EPUB builds in CI.
@end itemize

@node Core and Builtins<16>,C API<6>,Documentation<8>,Python 3 14 0 release candidate 2
@anchor{whatsnew/changelog id81}@anchor{184a}
@subsubsection Core and Builtins



@itemize -

@item 
gh-137400@footnote{https://github.com/python/cpython/issues/137400}: Fix a crash in the @ref{1f6,,free threading} build when disabling
profiling or tracing across all threads with
@ref{782,,PyEval_SetProfileAllThreads()} or
@ref{664,,PyEval_SetTraceAllThreads()} or their Python equivalents
@ref{6f0,,threading.settrace_all_threads()} and
@ref{6f1,,threading.setprofile_all_threads()}.

@item 
gh-137314@footnote{https://github.com/python/cpython/issues/137314}: Fixed a regression where raw f-strings incorrectly interpreted
escape sequences in format specifications. Raw f-strings now properly
preserve literal backslashes in format specs, matching the behavior from
Python 3.11. For example, @code{rf"@{obj:\xFF@}"} now correctly produces
@code{'\\xFF'} instead of @code{'ÿ'}. Patch by Pablo Galindo.

@item 
gh-137308@footnote{https://github.com/python/cpython/issues/137308}: A standalone docstring in a node body is optimized as a
@ref{17f,,pass} statement to ensure that the node’s body is never empty.
There was a @ref{2ee,,ValueError} in @ref{4b2,,compile()} otherwise.

@item 
gh-137288@footnote{https://github.com/python/cpython/issues/137288}: Fix bug where some bytecode instructions of a boolean
expression are not associated with the correct exception handler.

@item 
gh-134291@footnote{https://github.com/python/cpython/issues/134291}: Remove some newer macOS API usage from the JIT compiler in
order to restore compatibility with older OSX 10.15 deployment targets.

@item 
gh-131338@footnote{https://github.com/python/cpython/issues/131338}: Disable computed stack limit checks on non-glibc linux
platforms to fix crashes on deep recursion.

@item 
gh-136870@footnote{https://github.com/python/cpython/issues/136870}: Fix data races while de-instrumenting bytecode of code objects
running concurrently in threads.
@end itemize

@node C API<6>,Build<7>,Core and Builtins<16>,Python 3 14 0 release candidate 2
@anchor{whatsnew/changelog id82}@anchor{184b}
@subsubsection C API



@itemize -

@item 
gh-137573@footnote{https://github.com/python/cpython/issues/137573}: Mark @code{_PyOptimizer_Optimize} as @ref{184c,,Py_NO_INLINE} to
prevent stack overflow crashes on macOS.
@end itemize

@node Build<7>,,C API<6>,Python 3 14 0 release candidate 2
@anchor{whatsnew/changelog id83}@anchor{184d}
@subsubsection Build



@itemize -

@item 
gh-132339@footnote{https://github.com/python/cpython/issues/132339}: Add support for OpenSSL 3.5.
@end itemize

@node Python 3 14 0 release candidate 1,Python 3 14 0 beta 4,Python 3 14 0 release candidate 2,Changelog
@anchor{whatsnew/changelog python-3-14-0-release-candidate-1}@anchor{184e}
@subsection Python 3.14.0 release candidate 1


`Release date: 2025-07-22'

@menu
* Tools/Demos: Tools/Demos<5>. 
* Security: Security<10>. 
* Library: Library<19>. 
* Core and Builtins: Core and Builtins<17>. 
* Library: Library<20>. 
* Core and Builtins: Core and Builtins<18>. 
* Library: Library<21>. 
* Core and Builtins: Core and Builtins<19>. 
* C API: C API<7>. 
* Build: Build<8>. 

@end menu

@node Tools/Demos<5>,Security<10>,,Python 3 14 0 release candidate 1
@anchor{whatsnew/changelog id84}@anchor{184f}
@subsubsection Tools/Demos



@itemize -

@item 
gh-136251@footnote{https://github.com/python/cpython/issues/136251}: Fixes and usability improvements for
@code{Tools/wasm/emscripten/web_example}
@end itemize

@node Security<10>,Library<19>,Tools/Demos<5>,Python 3 14 0 release candidate 1
@anchor{whatsnew/changelog id85}@anchor{1850}
@subsubsection Security



@itemize -

@item 
gh-135661@footnote{https://github.com/python/cpython/issues/135661}: Fix parsing attributes with whitespaces around the @code{=}
separator in @ref{a7d,,html.parser.HTMLParser} according to the HTML5
standard.

@item 
gh-118350@footnote{https://github.com/python/cpython/issues/118350}: Fix support of escapable raw text mode (elements “textarea” and
“title”) in @ref{a7d,,html.parser.HTMLParser}.
@end itemize

@node Library<19>,Core and Builtins<17>,Security<10>,Python 3 14 0 release candidate 1
@anchor{whatsnew/changelog id86}@anchor{1851}
@subsubsection Library



@itemize -

@item 
gh-136170@footnote{https://github.com/python/cpython/issues/136170}: Removed the unreleased @code{zipfile.ZipFile.data_offset} property
added in 3.14.0a7 as it wasn’t fully clear which behavior it should have
in some situations so the result was not always what a user might expect.

@item 
gh-124621@footnote{https://github.com/python/cpython/issues/124621}: pyrepl now works in Emscripten.

@item 
gh-136874@footnote{https://github.com/python/cpython/issues/136874}: Discard URL query and fragment in
@ref{2bf,,urllib.request.url2pathname()}.

@item 
gh-130645@footnote{https://github.com/python/cpython/issues/130645}: Enable color help by default in @ref{7,,argparse}.

@item 
gh-136549@footnote{https://github.com/python/cpython/issues/136549}: Fix signature of @ref{a51,,threading.excepthook()}.

@item 
gh-136523@footnote{https://github.com/python/cpython/issues/136523}: Fix @ref{335,,wave.Wave_write} emitting an unraisable when open
raises.

@item 
gh-52876@footnote{https://github.com/python/cpython/issues/52876}: Add missing @code{keepends} (default @code{True}) parameter to
@code{codecs.StreamReaderWriter.readline()} and
@code{codecs.StreamReaderWriter.readlines()}.

@item 
gh-136470@footnote{https://github.com/python/cpython/issues/136470}: Correct @ref{1d4,,concurrent.futures.InterpreterPoolExecutor}’s
default thread name.

@item 
gh-136476@footnote{https://github.com/python/cpython/issues/136476}: Fix a bug that was causing the @code{get_async_stack_trace}
function to miss some frames in the stack trace.

@item 
gh-136434@footnote{https://github.com/python/cpython/issues/136434}: Fix docs generation of @code{UnboundItem} in
@ref{25,,concurrent.interpreters} when running with @ref{fbb,,-OO}.

@item 
gh-136380@footnote{https://github.com/python/cpython/issues/136380}: Raises @ref{5f0,,AttributeError} when accessing
@ref{1d4,,concurrent.futures.InterpreterPoolExecutor} and subinterpreters
are not available.

@item 
gh-134759@footnote{https://github.com/python/cpython/issues/134759}: Fix @ref{1742,,UnboundLocalError} in
@ref{13d9,,email.message.Message.get_payload()} when the payload to decode is a
@ref{193,,bytes} object. Patch by Kliment Lamonov.

@item 
gh-134657@footnote{https://github.com/python/cpython/issues/134657}: @ref{b,,asyncio}: Remove some private names from
@code{asyncio.__all__}.
@end itemize

@node Core and Builtins<17>,Library<20>,Library<19>,Python 3 14 0 release candidate 1
@anchor{whatsnew/changelog id87}@anchor{1852}
@subsubsection Core and Builtins



@itemize -

@item 
gh-136801@footnote{https://github.com/python/cpython/issues/136801}: Fix PyREPL syntax highlighting on match cases after multi-line
case. Contributed by Olga Matoula.
@end itemize

@node Library<20>,Core and Builtins<18>,Core and Builtins<17>,Python 3 14 0 release candidate 1
@anchor{whatsnew/changelog id88}@anchor{1853}
@subsubsection Library



@itemize -

@item 
gh-136421@footnote{https://github.com/python/cpython/issues/136421}: Fix crash when initializing @ref{34,,datetime} concurrently.
@end itemize

@node Core and Builtins<18>,Library<21>,Library<20>,Python 3 14 0 release candidate 1
@anchor{whatsnew/changelog id89}@anchor{1854}
@subsubsection Core and Builtins



@itemize -

@item 
gh-136541@footnote{https://github.com/python/cpython/issues/136541}: Fix some issues with the perf trampolines on x86-64 and
aarch64.  The trampolines were not being generated correctly for some
cases, which could lead to the perf integration not working correctly.
Patch by Pablo Galindo.

@item 
gh-136517@footnote{https://github.com/python/cpython/issues/136517}: Fixed a typo that prevented printing of uncollectable objects
when the @ref{13ce,,gc.DEBUG_UNCOLLECTABLE} mode was set.

@item 
gh-136525@footnote{https://github.com/python/cpython/issues/136525}: Fix issue where per-thread bytecode was not instrumented for
newly created threads.

@item 
gh-132661@footnote{https://github.com/python/cpython/issues/132661}: @code{Interpolation.expression} now has a default, the empty
string.

@item 
gh-132661@footnote{https://github.com/python/cpython/issues/132661}: Reflect recent 
@geindex Python Enhancement Proposals; PEP 750
PEP 750@footnote{https://peps.python.org/pep-0750/} change.

Disallow concatenation of @code{string.templatelib.Template} and
@ref{16a,,str}. Also, disallow implicit concatenation of t-string literals
with string or f-string literals.
@end itemize

@node Library<21>,Core and Builtins<19>,Core and Builtins<18>,Python 3 14 0 release candidate 1
@anchor{whatsnew/changelog id90}@anchor{1855}
@subsubsection Library



@itemize -

@item 
gh-116738@footnote{https://github.com/python/cpython/issues/116738}: Make functions in @ref{6a,,grp} thread-safe on the @ref{1f6,,free threaded} build.
@end itemize

@node Core and Builtins<19>,C API<7>,Library<21>,Python 3 14 0 release candidate 1
@anchor{whatsnew/changelog id91}@anchor{1856}
@subsubsection Core and Builtins



@itemize -

@item 
gh-135148@footnote{https://github.com/python/cpython/issues/135148}: Fixed a bug where f-string debug expressions (using =) would
incorrectly strip out parts of strings containing escaped quotes and #
characters. Patch by Pablo Galindo.

@item 
gh-133136@footnote{https://github.com/python/cpython/issues/133136}: Limit excess memory usage in the @ref{1f6,,free threading} build
when a large dictionary or list is resized and accessed by multiple
threads.

@item 
gh-91153@footnote{https://github.com/python/cpython/issues/91153}: Fix a crash when a @ref{342,,bytearray} is concurrently mutated
during item assignment.

@item 
gh-127971@footnote{https://github.com/python/cpython/issues/127971}: Fix off-by-one read beyond the end of a string in string
search.
@end itemize

@node C API<7>,Build<8>,Core and Builtins<19>,Python 3 14 0 release candidate 1
@anchor{whatsnew/changelog id92}@anchor{1857}
@subsubsection C API



@itemize -

@item 
gh-112068@footnote{https://github.com/python/cpython/issues/112068}: Revert support of nullable arguments in @ref{1858,,PyArg_Parse()}.

@item 
gh-133296@footnote{https://github.com/python/cpython/issues/133296}: New variants for the critical section API that accept one or
two @ref{485,,PyMutex} pointers rather than @ref{5df,,PyObject} instances
are now public in the non-limited C API.

@item 
gh-134009@footnote{https://github.com/python/cpython/issues/134009}: Expose @ref{461,,PyMutex_IsLocked()} as part of the public C API.
@end itemize

@node Build<8>,,C API<7>,Python 3 14 0 release candidate 1
@anchor{whatsnew/changelog id93}@anchor{1859}
@subsubsection Build



@itemize -

@item 
gh-135621@footnote{https://github.com/python/cpython/issues/135621}: PyREPL no longer depends on the @ref{2f,,curses} standard library.
Contributed by Łukasz Langa.
@end itemize

@node Python 3 14 0 beta 4,Python 3 14 0 beta 3,Python 3 14 0 release candidate 1,Changelog
@anchor{whatsnew/changelog python-3-14-0-beta-4}@anchor{185a}
@subsection Python 3.14.0 beta 4


`Release date: 2025-07-08'

@menu
* Tools/Demos: Tools/Demos<6>. 
* Tests: Tests<7>. 
* Security: Security<11>. 
* Library: Library<22>. 
* Documentation: Documentation<9>. 
* Core and Builtins: Core and Builtins<20>. 
* C API: C API<8>. 
* Build: Build<9>. 

@end menu

@node Tools/Demos<6>,Tests<7>,,Python 3 14 0 beta 4
@anchor{whatsnew/changelog id94}@anchor{185b}
@subsubsection Tools/Demos



@itemize -

@item 
gh-135968@footnote{https://github.com/python/cpython/issues/135968}: Stubs for @code{strip} are now provided as part of an iOS install.

@item 
gh-133600@footnote{https://github.com/python/cpython/issues/133600}: Backport file reorganization for Tools/wasm/wasi.

This should make backporting future code changes easier. It also
simplifies instructions around how to do WASI builds in the devguide.
@end itemize

@node Tests<7>,Security<11>,Tools/Demos<6>,Python 3 14 0 beta 4
@anchor{whatsnew/changelog id95}@anchor{185c}
@subsubsection Tests



@itemize -

@item 
gh-135966@footnote{https://github.com/python/cpython/issues/135966}: The iOS testbed now handles the @code{app_packages} folder as a
site directory.

@item 
gh-135494@footnote{https://github.com/python/cpython/issues/135494}: Fix regrtest to support excluding tests from @code{--pgo} tests.
Patch by Victor Stinner.
@end itemize

@node Security<11>,Library<22>,Tests<7>,Python 3 14 0 beta 4
@anchor{whatsnew/changelog id96}@anchor{185d}
@subsubsection Security



@itemize -

@item 
gh-136053@footnote{https://github.com/python/cpython/issues/136053}: @ref{91,,marshal}: fix a possible crash when deserializing
@ref{695,,slice} objects.

@item 
gh-135661@footnote{https://github.com/python/cpython/issues/135661}: Fix parsing start and end tags in
@ref{a7d,,html.parser.HTMLParser} according to the HTML5 standard.


@itemize *

@item 
Whitespaces no longer accepted between @code{</} and the tag name.
E.g. @code{</ script>} does not end the script section.

@item 
Vertical tabulation (@code{\v}) and non-ASCII whitespaces no longer recognized
as whitespaces. The only whitespaces are @code{\t\n\r\f} and space.

@item 
Null character (U+0000) no longer ends the tag name.

@item 
Attributes and slashes after the tag name in end tags are now ignored,
instead of terminating after the first @code{>} in quoted attribute value.
E.g. @code{</script/foo=">"/>}.

@item 
Multiple slashes and whitespaces between the last attribute and closing @code{>}
are now ignored in both start and end tags. E.g. @code{<a foo=bar/ //>}.

@item 
Multiple @code{=} between attribute name and value are no longer collapsed.
E.g. @code{<a foo==bar>} produces attribute “foo” with value “=bar”.

@item 
[Reverted in gh-136927@footnote{https://github.com/python/cpython/issues/136927}] Whitespaces between the @code{=} separator and attribute name or value are no
longer ignored. E.g. @code{<a foo =bar>} produces two attributes “foo” and
“=bar”, both with value None; @code{<a foo= bar>} produces two attributes:
“foo” with value “” and “bar” with value None.
@end itemize

@item 
gh-102555@footnote{https://github.com/python/cpython/issues/102555}: Fix comment parsing in @ref{a7d,,html.parser.HTMLParser}
according to the HTML5 standard. @code{--!>} now ends the comment. @code{-- >}
no longer ends the comment. Support abnormally ended empty comments
@code{<-->} and @code{<--->}.
@end itemize

@node Library<22>,Documentation<9>,Security<11>,Python 3 14 0 beta 4
@anchor{whatsnew/changelog id97}@anchor{185e}
@subsubsection Library



@itemize -

@item 
gh-136286@footnote{https://github.com/python/cpython/issues/136286}: Fix pickling failures for protocols 0 and 1 for many objects
realted to subinterpreters.

@item 
gh-136316@footnote{https://github.com/python/cpython/issues/136316}: Improve support for evaluating nested forward references in
@ref{185f,,typing.evaluate_forward_ref()}.

@item 
gh-85702@footnote{https://github.com/python/cpython/issues/85702}: If @code{zoneinfo._common.load_tzdata} is given a package without a
resource a @ref{1860,,zoneinfo.ZoneInfoNotFoundError} is raised rather than a
@ref{f44,,PermissionError}. Patch by Victor Stinner.

@item 
gh-136028@footnote{https://github.com/python/cpython/issues/136028}: Fix parsing month names containing “İ” (U+0130, LATIN CAPITAL
LETTER I WITH DOT ABOVE) in @ref{1639,,time.strptime()}. This affects locales
az_AZ, ber_DZ, ber_MA and crh_UA.

@item 
gh-135995@footnote{https://github.com/python/cpython/issues/135995}: In the palmos encoding, make byte @code{0x9b} decode to @code{›}
(U+203A - SINGLE RIGHT-POINTING ANGLE QUOTATION MARK).

@item 
gh-53203@footnote{https://github.com/python/cpython/issues/53203}: Fix @ref{1639,,time.strptime()} for @code{%c} and @code{%x} formats on
locales byn_ER, wal_ET and lzh_TW, and for @code{%X} format on locales ar_SA,
bg_BG and lzh_TW.

@item 
gh-91555@footnote{https://github.com/python/cpython/issues/91555}: An earlier change, which was introduced in 3.14.0b2, has been
reverted. It disabled logging for a logger during handling of log messages
for that logger. Since the reversion, the behaviour should be as it was
before 3.14.0b2.

@item 
gh-135878@footnote{https://github.com/python/cpython/issues/135878}: Fixes a crash of @ref{4e6,,types.SimpleNamespace} on @ref{1f6,,free threading} builds, when several threads were calling its
@ref{830,,__repr__()} method at the same time.

@item 
gh-135836@footnote{https://github.com/python/cpython/issues/135836}: Fix @ref{1741,,IndexError} in @ref{819,,asyncio.loop.create_connection()}
that could occur when non-@ref{2c2,,OSError} exception is raised during
connection and socket’s @code{close()} raises @code{OSError}.

@item 
gh-135836@footnote{https://github.com/python/cpython/issues/135836}: Fix @ref{1741,,IndexError} in @ref{819,,asyncio.loop.create_connection()}
that could occur when the Happy Eyeballs algorithm resulted in an empty
exceptions list during connection attempts.

@item 
gh-135855@footnote{https://github.com/python/cpython/issues/135855}: Raise @ref{199,,TypeError} instead of @ref{796,,SystemError} when
@code{_interpreters.set___main___attrs()} is passed a non-dict object.
Patch by Brian Schubert.

@item 
gh-135815@footnote{https://github.com/python/cpython/issues/135815}: @ref{9f,,netrc}: skip security checks if @ref{1861,,os.getuid()} is
missing. Patch by Bénédikt Tran.

@item 
gh-135640@footnote{https://github.com/python/cpython/issues/135640}: Address bug where it was possible to call
@ref{c92,,xml.etree.ElementTree.ElementTree.write()} on an ElementTree object
with an invalid root element. This behavior blanked the file passed to
@code{write} if it already existed.

@item 
gh-135645@footnote{https://github.com/python/cpython/issues/135645}: Added @code{supports_isolated_interpreters} field to
@ref{73c,,sys.implementation}.

@item 
gh-135646@footnote{https://github.com/python/cpython/issues/135646}: Raise consistent @ref{450,,NameError} exceptions in
@ref{1803,,annotationlib.ForwardRef.evaluate()}

@item 
gh-135557@footnote{https://github.com/python/cpython/issues/135557}: Fix races on @ref{6d,,heapq} updates and @ref{24f,,list} reads on
the @ref{1f6,,free threaded} build.

@item 
gh-119180@footnote{https://github.com/python/cpython/issues/119180}: Only fetch globals and locals if necessary in
@ref{457,,annotationlib.get_annotations()}

@item 
gh-135561@footnote{https://github.com/python/cpython/issues/135561}: Fix a crash on DEBUG builds when an HACL* HMAC routine fails.
Patch by Bénédikt Tran.

@item 
gh-135487@footnote{https://github.com/python/cpython/issues/135487}: Fix @code{reprlib.Repr.repr_int()} when given integers with
more than @ref{1862,,sys.get_int_max_str_digits()} digits. Patch by Bénédikt
Tran.

@item 
gh-135335@footnote{https://github.com/python/cpython/issues/135335}: @ref{98,,multiprocessing}: Flush @code{stdout} and @code{stderr} after
preloading modules in the @code{forkserver}.

@item 
gh-135069@footnote{https://github.com/python/cpython/issues/135069}: Fix the “Invalid error handling” exception in
@code{encodings.idna.IncrementalDecoder} to correctly replace the
‘errors’ parameter.

@item 
gh-130662@footnote{https://github.com/python/cpython/issues/130662}: +Accept leading zeros in precision and width fields for
+:class:@ref{200,,Decimal} formatting, for example @code{format(Decimal(1.25),
'.016f')}.

@item 
gh-130662@footnote{https://github.com/python/cpython/issues/130662}: Accept leading zeros in precision and width fields for
@ref{215,,Fraction} formatting, for example @code{format(Fraction(1,
3), '.016f')}.

@item 
gh-87790@footnote{https://github.com/python/cpython/issues/87790}: Support underscore and comma as thousands separators in the
fractional part for @ref{215,,Fraction}’s formatting.  Patch by
Sergey B Kirpichev.

@item 
gh-87790@footnote{https://github.com/python/cpython/issues/87790}: Support underscore and comma as thousands separators in the
fractional part for @ref{200,,Decimal}’s formatting.  Patch by
Sergey B Kirpichev.

@item 
gh-130664@footnote{https://github.com/python/cpython/issues/130664}: Handle corner-case for @ref{215,,Fraction}’s
formatting: treat zero-padding (preceding the width field by a zero
(@code{'0'}) character) as an equivalent to a fill character of @code{'0'} with
an alignment type of @code{'='}, just as in case of @ref{197,,float}’s.
@end itemize

@node Documentation<9>,Core and Builtins<20>,Library<22>,Python 3 14 0 beta 4
@anchor{whatsnew/changelog id98}@anchor{1863}
@subsubsection Documentation



@itemize -

@item 
gh-136155@footnote{https://github.com/python/cpython/issues/136155}: EPUB builds are fixed by excluding non-XHTML-compatible tags.
@end itemize

@node Core and Builtins<20>,C API<8>,Documentation<9>,Python 3 14 0 beta 4
@anchor{whatsnew/changelog id99}@anchor{1864}
@subsubsection Core and Builtins



@itemize -

@item 
gh-109700@footnote{https://github.com/python/cpython/issues/109700}: Fix memory error handling in @ref{5e4,,PyDict_SetDefault()}.

@item 
gh-78465@footnote{https://github.com/python/cpython/issues/78465}: Fix error message for @code{cls.__new__(cls, ...)} where @code{cls} is
not instantiable builtin or extension type (with @code{tp_new} set to
@code{NULL}).

@item 
gh-129958@footnote{https://github.com/python/cpython/issues/129958}: Differentiate between t-strings and f-strings in syntax error
for newlines in format specifiers of single-quoted interpolated strings.

@item 
gh-135871@footnote{https://github.com/python/cpython/issues/135871}: Non-blocking mutex lock attempts now return immediately when
the lock is busy instead of briefly spinning in the @ref{1f6,,free threading}
build.

@item 
gh-135106@footnote{https://github.com/python/cpython/issues/135106}: Restrict the trashcan mechanism to GC’ed objects and untrack
them while in the trashcan to prevent the GC and trashcan mechanisms
conflicting.

@item 
gh-135607@footnote{https://github.com/python/cpython/issues/135607}: Fix potential @ref{11b,,weakref} races in an object’s destructor on
the @ref{1f6,,free threaded} build.

@item 
gh-135608@footnote{https://github.com/python/cpython/issues/135608}: Fix a crash in the JIT involving attributes of modules.

@item 
gh-135543@footnote{https://github.com/python/cpython/issues/135543}: Emit @code{sys.remote_exec} audit event when
@ref{16e,,sys.remote_exec()} is called and migrate @code{remote_debugger_script}
to @code{cpython.remote_debugger_script}.

@item 
gh-134280@footnote{https://github.com/python/cpython/issues/134280}: Disable constant folding for @code{~} with a boolean argument.
This moves the deprecation warning from compile time to runtime.
@end itemize

@node C API<8>,Build<9>,Core and Builtins<20>,Python 3 14 0 beta 4
@anchor{whatsnew/changelog id100}@anchor{1865}
@subsubsection C API



@itemize -

@item 
gh-135906@footnote{https://github.com/python/cpython/issues/135906}: Fix compilation errors when compiling the internal headers with
a C++ compiler.
@end itemize

@node Build<9>,,C API<8>,Python 3 14 0 beta 4
@anchor{whatsnew/changelog id101}@anchor{1866}
@subsubsection Build



@itemize -

@item 
gh-134273@footnote{https://github.com/python/cpython/issues/134273}: Add support for configuring compiler flags for the JIT with
@code{CFLAGS_JIT}
@end itemize

@node Python 3 14 0 beta 3,Python 3 14 0 beta 2,Python 3 14 0 beta 4,Changelog
@anchor{whatsnew/changelog python-3-14-0-beta-3}@anchor{1867}
@subsection Python 3.14.0 beta 3


`Release date: 2025-06-17'

@menu
* Windows: Windows<9>. 
* Tests: Tests<8>. 
* Security: Security<12>. 
* Library: Library<23>. 
* Documentation: Documentation<10>. 
* Core and Builtins: Core and Builtins<21>. 
* Library: Library<24>. 
* Core and Builtins: Core and Builtins<22>. 
* Library: Library<25>. 
* Core and Builtins: Core and Builtins<23>. 
* Library: Library<26>. 
* Core and Builtins: Core and Builtins<24>. 
* C API: C API<9>. 
* Build: Build<10>. 

@end menu

@node Windows<9>,Tests<8>,,Python 3 14 0 beta 3
@anchor{whatsnew/changelog id102}@anchor{1868}
@subsubsection Windows



@itemize -

@item 
gh-135099@footnote{https://github.com/python/cpython/issues/135099}: Fix a crash that could occur on Windows when a background
thread waits on a @ref{485,,PyMutex} while the main thread is shutting down
the interpreter.
@end itemize

@node Tests<8>,Security<12>,Windows<9>,Python 3 14 0 beta 3
@anchor{whatsnew/changelog id103}@anchor{1869}
@subsubsection Tests



@itemize -

@item 
gh-132815@footnote{https://github.com/python/cpython/issues/132815}: Fix test__opcode: add @code{JUMP_BACKWARD} to specialization
stats.

@item 
gh-135489@footnote{https://github.com/python/cpython/issues/135489}: Show verbose output for failing tests during PGO profiling step
with –enable-optimizations.

@item 
gh-135120@footnote{https://github.com/python/cpython/issues/135120}: Add @code{test.support.subTests()}.
@end itemize

@node Security<12>,Library<23>,Tests<8>,Python 3 14 0 beta 3
@anchor{whatsnew/changelog id104}@anchor{186a}
@subsubsection Security



@itemize -

@item 
gh-135462@footnote{https://github.com/python/cpython/issues/135462}: Fix quadratic complexity in processing specially crafted input
in @ref{a7d,,html.parser.HTMLParser}. End-of-file errors are now handled
according to the HTML5 specs – comments and declarations are
automatically closed, tags are ignored.

@item 
gh-135034@footnote{https://github.com/python/cpython/issues/135034}: Fixes multiple issues that allowed @code{tarfile} extraction
filters (@code{filter="data"} and @code{filter="tar"}) to be bypassed using
crafted symlinks and hard links.

Addresses 
@geindex Common Vulnerabilities and Exposures; CVE 2024-12718
CVE 2024-12718@footnote{https://www.cve.org/CVERecord?id=CVE-2024-12718}, 
@geindex Common Vulnerabilities and Exposures; CVE 2025-4138
CVE 2025-4138@footnote{https://www.cve.org/CVERecord?id=CVE-2025-4138}, 
@geindex Common Vulnerabilities and Exposures; CVE 2025-4330
CVE 2025-4330@footnote{https://www.cve.org/CVERecord?id=CVE-2025-4330}, and
@geindex Common Vulnerabilities and Exposures; CVE 2025-4517
CVE 2025-4517@footnote{https://www.cve.org/CVERecord?id=CVE-2025-4517}.
@end itemize

@node Library<23>,Documentation<10>,Security<12>,Python 3 14 0 beta 3
@anchor{whatsnew/changelog id105}@anchor{186b}
@subsubsection Library



@itemize -

@item 
gh-65697@footnote{https://github.com/python/cpython/issues/65697}: @ref{26,,configparser}’s error message when attempting to write
an invalid key is now more helpful.

@item 
gh-135497@footnote{https://github.com/python/cpython/issues/135497}: Fix @ref{186c,,os.getlogin()} failing for longer usernames on
BSD-based platforms.

@item 
gh-135429@footnote{https://github.com/python/cpython/issues/135429}: Fix the argument mismatch in @code{_lsprof} for @code{PY_THROW}
event.

@item 
gh-135368@footnote{https://github.com/python/cpython/issues/135368}: Fix @ref{c45,,unittest.mock.Mock} generation on
@ref{4e2,,dataclasses.dataclass()} objects. Now all special attributes are set
as it was before gh-124429@footnote{https://github.com/python/cpython/issues/124429}.

@item 
gh-133967@footnote{https://github.com/python/cpython/issues/133967}: Do not normalize @ref{8a,,locale} name ‘C.UTF-8’ to ‘en_US.UTF-8’.

@item 
gh-135321@footnote{https://github.com/python/cpython/issues/135321}: Raise a correct exception for values greater than 0x7fffffff
for the @code{BINSTRING} opcode in the C implementation of @ref{ab,,pickle}.

@item 
gh-135276@footnote{https://github.com/python/cpython/issues/135276}: Backported bugfixes in zipfile.Path from zipp 3.23. Fixed
@code{.name}, @code{.stem} and other basename-based properties on Windows when
working with a zipfile on disk.

@item 
gh-135244@footnote{https://github.com/python/cpython/issues/135244}: @ref{117,,uuid}: when the MAC address cannot be determined, the
48-bit node ID is now generated with a cryptographically-secure
pseudo-random number generator (CSPRNG) as per 
@geindex RFC; RFC 9562 Section 6.10-3
RFC 9562@comma{} §6.10.3@footnote{https://datatracker.ietf.org/doc/html/rfc9562.html#section-6.10-3}. This affects @ref{da7,,uuid1()} and
@ref{2c4,,uuid6()}.

@item 
gh-134970@footnote{https://github.com/python/cpython/issues/134970}: Fix the “unknown action” exception in
@ref{2ed,,argparse.ArgumentParser.add_argument_group()} to correctly replace
the action class.

@item 
gh-134718@footnote{https://github.com/python/cpython/issues/134718}: @ref{ae7,,ast.dump()} now only omits @code{None} and @code{[]} values if
they are default values.

@item 
gh-134939@footnote{https://github.com/python/cpython/issues/134939}: Add the @ref{25,,concurrent.interpreters} module.  See 
@geindex Python Enhancement Proposals; PEP 734
PEP 734@footnote{https://peps.python.org/pep-0734/}.

@item 
gh-134885@footnote{https://github.com/python/cpython/issues/134885}: Fix possible crash in the @ref{23,,compression.zstd} module
related to setting parameter types. Patch by Jelle Zijlstra.

@item 
gh-134857@footnote{https://github.com/python/cpython/issues/134857}: Improve error report for @ref{3e,,doctest}s run with
@ref{10d,,unittest}. Remove @code{doctest} module frames from tracebacks and
redundant newline character from a failure message.

@item 
gh-128840@footnote{https://github.com/python/cpython/issues/128840}: Fix parsing long IPv6 addresses with embedded IPv4 address.

@item 
gh-134637@footnote{https://github.com/python/cpython/issues/134637}: Fix performance regression in calling a @ref{2e,,ctypes} function
pointer in @ref{1f6,,free threading}.

@item 
gh-134696@footnote{https://github.com/python/cpython/issues/134696}: Built-in HACL* and OpenSSL implementations of hash function
constructors now correctly accept the same `documented' named arguments.
For instance, @ref{186d,,md5()} could be previously invoked as
@code{md5(data=data)} or @code{md5(string=string)} depending on the underlying
implementation but these calls were not compatible. Patch by Bénédikt
Tran.

@item 
gh-134151@footnote{https://github.com/python/cpython/issues/134151}: @ref{3f,,email}: Fix @ref{199,,TypeError} in
@ref{186e,,email.utils.decode_params()} when sorting 
@geindex RFC; RFC 2231
RFC 2231@footnote{https://datatracker.ietf.org/doc/html/rfc2231.html} continuations
that contain an unnumbered section.

@item 
gh-134210@footnote{https://github.com/python/cpython/issues/134210}: @ref{186f,,curses.window.getch()} now correctly handles signals.
Patch by Bénédikt Tran.

@item 
gh-134152@footnote{https://github.com/python/cpython/issues/134152}: @ref{3f,,email}: Fix parsing of email message ID with invalid
domain.

@item 
gh-133489@footnote{https://github.com/python/cpython/issues/133489}: @ref{1213,,random.getrandbits()} can now generate more that 2@w{^31} bits. @ref{1870,,random.randbytes()} can now generate more that 256
MiB.

@item 
gh-132813@footnote{https://github.com/python/cpython/issues/132813}: Improve error messages for incorrect types and values of
@ref{1871,,csv.Dialect} attributes.

@item 
gh-132969@footnote{https://github.com/python/cpython/issues/132969}: Prevent the @ref{1d8,,ProcessPoolExecutor}
executor thread, which remains running when @ref{af0,,shutdown(wait=False)}, from attempting to adjust the
pool’s worker processes after the object state has already been reset
during shutdown. A combination of conditions, including a worker process
having terminated abormally, resulted in an exception and a potential hang
when the still-running executor thread attempted to replace dead workers
within the pool.

@item 
gh-127081@footnote{https://github.com/python/cpython/issues/127081}: Fix libc thread safety issues with @ref{a5,,os} by replacing
@code{getlogin} with @code{getlogin_r} re-entrant version.

@item 
gh-131884@footnote{https://github.com/python/cpython/issues/131884}: Fix formatting issues in @ref{f46,,json.dump()} when both `indent'
and `skipkeys' are used.

@item 
gh-130999@footnote{https://github.com/python/cpython/issues/130999}: Avoid exiting the new REPL and offer suggestions even if there
are non-string candidates when errors occur.
@end itemize

@node Documentation<10>,Core and Builtins<21>,Library<23>,Python 3 14 0 beta 3
@anchor{whatsnew/changelog id106}@anchor{1872}
@subsubsection Documentation



@itemize -

@item 
gh-135171@footnote{https://github.com/python/cpython/issues/135171}: Document that the @ref{4c9,,iterator} for the leftmost
@code{for} clause in the generator expression is created immediately.

@item 
bpo-45210@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45210}: Document that error indicator may be set in tp_dealloc, and how
to avoid clobbering it.
@end itemize

@node Core and Builtins<21>,Library<24>,Documentation<10>,Python 3 14 0 beta 3
@anchor{whatsnew/changelog id107}@anchor{1873}
@subsubsection Core and Builtins



@itemize -

@item 
gh-135496@footnote{https://github.com/python/cpython/issues/135496}: Fix typo in the f-string conversion type error (“exclamanation”
-> “exclamation”).

@item 
gh-135371@footnote{https://github.com/python/cpython/issues/135371}: Fixed @ref{b,,asyncio} debugging tools to properly display
internal coroutine call stacks alongside external task dependencies. The
@code{python -m asyncio ps} and @code{python -m asyncio pstree} commands now
show complete execution context. Patch by Pablo Galindo.
@end itemize

@node Library<24>,Core and Builtins<22>,Core and Builtins<21>,Python 3 14 0 beta 3
@anchor{whatsnew/changelog id108}@anchor{1874}
@subsubsection Library



@itemize -

@item 
gh-127319@footnote{https://github.com/python/cpython/issues/127319}: Set the @code{allow_reuse_port} class variable to @code{False} on the
XMLRPC, logging, and HTTP servers. This matches the behavior in prior
Python releases, which is to not allow port reuse.
@end itemize

@node Core and Builtins<22>,Library<25>,Library<24>,Python 3 14 0 beta 3
@anchor{whatsnew/changelog id109}@anchor{1875}
@subsubsection Core and Builtins



@itemize -

@item 
gh-135171@footnote{https://github.com/python/cpython/issues/135171}: Reverts the behavior of async generator expressions when
created with object w/o __aiter__ method to the pre-3.13 behavior of
raising a TypeError.

@item 
gh-130077@footnote{https://github.com/python/cpython/issues/130077}: Properly raise custom syntax errors when incorrect syntax
containing names that are prefixes of soft keywords is encountered.  Patch
by Pablo Galindo.

@item 
gh-135171@footnote{https://github.com/python/cpython/issues/135171}: Reverts the behavior of generator expressions when created with
a non-iterable to the pre-3.13 behavior of raising a TypeError. It is no
longer possible to cause a crash in the debugger by altering the generator
expression’s local variables. This is achieved by moving the @code{GET_ITER}
instruction back to the creation of the generator expression and adding an
additional check to @code{FOR_ITER}.
@end itemize

@node Library<25>,Core and Builtins<23>,Core and Builtins<22>,Python 3 14 0 beta 3
@anchor{whatsnew/changelog id110}@anchor{1876}
@subsubsection Library



@itemize -

@item 
gh-116738@footnote{https://github.com/python/cpython/issues/116738}: Make methods in @ref{6d,,heapq} thread-safe on the @ref{1f6,,free threaded} build.
@end itemize

@node Core and Builtins<23>,Library<26>,Library<25>,Python 3 14 0 beta 3
@anchor{whatsnew/changelog id111}@anchor{1877}
@subsubsection Core and Builtins



@itemize -

@item 
gh-134876@footnote{https://github.com/python/cpython/issues/134876}: Add support to 
@geindex Python Enhancement Proposals; PEP 768
PEP 768@footnote{https://peps.python.org/pep-0768/} remote debugging for Linux kernels
which don’t have CONFIG_CROSS_MEMORY_ATTACH configured.

@item 
gh-134889@footnote{https://github.com/python/cpython/issues/134889}: Fix handling of a few opcodes that leave operands on the stack
when optimizing @code{LOAD_FAST}.
@end itemize

@node Library<26>,Core and Builtins<24>,Core and Builtins<23>,Python 3 14 0 beta 3
@anchor{whatsnew/changelog id112}@anchor{1878}
@subsubsection Library



@itemize -

@item 
gh-134908@footnote{https://github.com/python/cpython/issues/134908}: Fix crash when iterating over lines in a text file on the
@ref{1f6,,free threaded} build.
@end itemize

@node Core and Builtins<24>,C API<9>,Library<26>,Python 3 14 0 beta 3
@anchor{whatsnew/changelog id113}@anchor{1879}
@subsubsection Core and Builtins



@itemize -

@item 
gh-132617@footnote{https://github.com/python/cpython/issues/132617}: Fix @ref{1671,,dict.update()} modification check that could
incorrectly raise a “dict mutated during update” error when a different
dictionary was modified that happens to share the same underlying keys
object.

@item 
gh-134679@footnote{https://github.com/python/cpython/issues/134679}: Fix crash in the @ref{1f6,,free threading} build’s QSBR code that
could occur when changing an object’s @code{__dict__} attribute.

@item 
gh-127682@footnote{https://github.com/python/cpython/issues/127682}: No longer call @code{__iter__} twice in list comprehensions. This
brings the behavior of list comprehensions in line with other forms of
iteration

@item 
gh-133912@footnote{https://github.com/python/cpython/issues/133912}: Fix the C API function @code{PyObject_GenericSetDict} to handle
extension classes with inline values.
@end itemize

@node C API<9>,Build<10>,Core and Builtins<24>,Python 3 14 0 beta 3
@anchor{whatsnew/changelog id114}@anchor{187a}
@subsubsection C API



@itemize -

@item 
gh-134989@footnote{https://github.com/python/cpython/issues/134989}: Fix @code{Py_RETURN_NONE}, @code{Py_RETURN_TRUE} and
@code{Py_RETURN_FALSE} macros in the limited C API 3.11 and older: don’t
treat @code{Py_None}, @code{Py_True} and @code{Py_False} as immortal. Patch by
Victor Stinner.

@item 
gh-134989@footnote{https://github.com/python/cpython/issues/134989}: Implement @ref{187b,,PyObject_DelAttr()} and
@ref{187c,,PyObject_DelAttrString()} as macros in the limited C API 3.12 and
older. Patch by Victor Stinner.

@item 
gh-133968@footnote{https://github.com/python/cpython/issues/133968}: Add @ref{3b7,,PyUnicodeWriter_WriteASCII()} function to write an
ASCII string into a @ref{3b1,,PyUnicodeWriter}. The function is faster than
@ref{3bd,,PyUnicodeWriter_WriteUTF8()}, but has an undefined behavior if the
input string contains non-ASCII characters. Patch by Victor Stinner.
@end itemize

@node Build<10>,,C API<9>,Python 3 14 0 beta 3
@anchor{whatsnew/changelog id115}@anchor{187d}
@subsubsection Build



@itemize -

@item 
gh-119132@footnote{https://github.com/python/cpython/issues/119132}: Remove “experimental” tag from the CPython free-threading
build.

@item 
gh-135497@footnote{https://github.com/python/cpython/issues/135497}: Fix the detection of @code{MAXLOGNAME} in the @code{configure.ac}
script.

@item 
gh-134923@footnote{https://github.com/python/cpython/issues/134923}: Windows builds with profile-guided optimization enabled now use
@code{/GENPROFILE} and @code{/USEPROFILE} instead of deprecated @code{/LTCG:}
options.

@item 
gh-134774@footnote{https://github.com/python/cpython/issues/134774}: Fix @ref{187e,,Py_DEBUG} macro redefinition warnings on Windows
debug builds. Patch by Chris Eibl.

@item 
gh-134632@footnote{https://github.com/python/cpython/issues/134632}: Fixed @code{build-details.json} generation to use @code{INCLUDEPY},
in order to reference the @code{pythonX.Y} subdirectory of the include
directory, as required in 
@geindex Python Enhancement Proposals; PEP 739
PEP 739@footnote{https://peps.python.org/pep-0739/}, instead of the top-level include
directory.
@end itemize

@node Python 3 14 0 beta 2,Python 3 14 0 beta 1,Python 3 14 0 beta 3,Changelog
@anchor{whatsnew/changelog python-3-14-0-beta-2}@anchor{187f}
@subsection Python 3.14.0 beta 2


`Release date: 2025-05-26'

@menu
* Windows: Windows<10>. 
* Tools/Demos: Tools/Demos<7>. 
* Tests: Tests<9>. 
* Security: Security<13>. 
* Library: Library<27>. 
* Core and Builtins: Core and Builtins<25>. 
* C API: C API<10>. 
* Build: Build<11>. 

@end menu

@node Windows<10>,Tools/Demos<7>,,Python 3 14 0 beta 2
@anchor{whatsnew/changelog id116}@anchor{1880}
@subsubsection Windows



@itemize -

@item 
gh-130727@footnote{https://github.com/python/cpython/issues/130727}: Fix a race in internal calls into WMI that can result in an
“invalid handle” exception under high load. Patch by Chris Eibl.

@item 
gh-76023@footnote{https://github.com/python/cpython/issues/76023}: Make @ref{264,,os.path.realpath()} ignore Windows error 1005 when in
non-strict mode.

@item 
gh-133779@footnote{https://github.com/python/cpython/issues/133779}: Reverts the change to generate different @code{pyconfig.h}
files based on compiler settings, as it was frequently causing extension
builds to break. In particular, the @code{Py_GIL_DISABLED} preprocessor
variable must now always be defined explicitly when compiling for the
experimental free-threaded runtime. The @ref{175,,sysconfig.get_config_var()}
function can be used to determine whether the current runtime was compiled
with that flag or not.

@item 
gh-133626@footnote{https://github.com/python/cpython/issues/133626}: Ensures packages are not accidentally bundled into the
traditional installer.
@end itemize

@node Tools/Demos<7>,Tests<9>,Windows<10>,Python 3 14 0 beta 2
@anchor{whatsnew/changelog id117}@anchor{1881}
@subsubsection Tools/Demos



@itemize -

@item 
gh-134215@footnote{https://github.com/python/cpython/issues/134215}: @ref{492,,REPL} import autocomplete only suggests private modules
when explicitly specified.
@end itemize

@node Tests<9>,Security<13>,Tools/Demos<7>,Python 3 14 0 beta 2
@anchor{whatsnew/changelog id118}@anchor{1882}
@subsubsection Tests



@itemize -

@item 
gh-133744@footnote{https://github.com/python/cpython/issues/133744}: Fix multiprocessing interrupt test. Add an event to synchronize
the parent process with the child process: wait until the child process
starts sleeping. Patch by Victor Stinner.

@item 
gh-133682@footnote{https://github.com/python/cpython/issues/133682}: Fixed test case
@code{test.test_annotationlib.TestStringFormat.test_displays} which ensures
proper handling of complex data structures (lists, sets, dictionaries, and
tuples) in string annotations.

@item 
gh-133639@footnote{https://github.com/python/cpython/issues/133639}: Fix @code{TestPyReplAutoindent.test_auto_indent_default()} doesn’t
run @code{input_code}.
@end itemize

@node Security<13>,Library<27>,Tests<9>,Python 3 14 0 beta 2
@anchor{whatsnew/changelog id119}@anchor{1883}
@subsubsection Security



@itemize -

@item 
gh-133767@footnote{https://github.com/python/cpython/issues/133767}: Fix use-after-free in the “unicode-escape” decoder with a
non-“strict” error handler.

@item 
gh-128840@footnote{https://github.com/python/cpython/issues/128840}: Short-circuit the processing of long IPv6 addresses early in
@ref{84,,ipaddress} to prevent excessive memory consumption and a minor
denial-of-service.
@end itemize

@node Library<27>,Core and Builtins<25>,Security<13>,Python 3 14 0 beta 2
@anchor{whatsnew/changelog id120}@anchor{1884}
@subsubsection Library



@itemize -

@item 
gh-132710@footnote{https://github.com/python/cpython/issues/132710}: If possible, ensure that @ref{da6,,uuid.getnode()} returns the same
result even across different processes. Previously, the result was
constant only within the same process. Patch by Bénédikt Tran.

@item 
gh-80334@footnote{https://github.com/python/cpython/issues/80334}: @ref{17b5,,multiprocessing.freeze_support()} now checks for work on
any “spawn” start method platform rather than only on Windows.

@item 
gh-134582@footnote{https://github.com/python/cpython/issues/134582}: Fix tokenize.untokenize() round-trip errors related to
t-strings braces escaping

@item 
gh-134546@footnote{https://github.com/python/cpython/issues/134546}: Ensure @ref{aa,,pdb} remote debugging script is readable by remote
Python process.

@item 
gh-134451@footnote{https://github.com/python/cpython/issues/134451}: Converted @code{asyncio.tools.CycleFoundException} from dataclass
to a regular exception type.

@item 
gh-114177@footnote{https://github.com/python/cpython/issues/114177}: Fix @ref{b,,asyncio} to not close subprocess pipes which would
otherwise error out when the event loop is already closed.

@item 
gh-90871@footnote{https://github.com/python/cpython/issues/90871}: Fixed an off by one error concerning the backlog parameter in
@ref{4cb,,create_unix_server()}. Contributed by Christian
Harries.

@item 
gh-134323@footnote{https://github.com/python/cpython/issues/134323}: Fix the @ref{1885,,threading.RLock.locked()} method.

@item 
gh-86802@footnote{https://github.com/python/cpython/issues/86802}: Fixed asyncio memory leak in cancelled shield tasks. For
shielded tasks where the shield was cancelled, log potential exceptions
through the exception handler. Contributed by Christian Harries.

@item 
gh-134209@footnote{https://github.com/python/cpython/issues/134209}: @ref{2f,,curses}: The @ref{1886,,curses.window.instr()} and
@ref{1887,,curses.window.getstr()} methods now allocate their internal buffer on
the heap instead of the stack; in addition, the max buffer size is
increased from 1023 to 2047.

@item 
gh-134235@footnote{https://github.com/python/cpython/issues/134235}: Updated tab completion on REPL to include builtin modules.
Contributed by Tom Wang, Hunter Young

@item 
gh-134152@footnote{https://github.com/python/cpython/issues/134152}: Fixed @ref{1742,,UnboundLocalError} that could occur during
@ref{3f,,email} header parsing if an expected trailing delimiter is missing
in some contexts.

@item 
gh-134168@footnote{https://github.com/python/cpython/issues/134168}: @ref{76,,http.server}: Fix IPv6 address binding and
@ref{1888,,--directory} handling when using HTTPS.

@item 
gh-62184@footnote{https://github.com/python/cpython/issues/62184}: Remove import of C implementation of @ref{151b,,io.FileIO} from
Python implementation which has its own implementation

@item 
gh-133982@footnote{https://github.com/python/cpython/issues/133982}: Emit @ref{4d8,,RuntimeWarning} in the Python implementation of
@ref{83,,io} when the @ref{13cf,,file-like object} is not closed
explicitly in the presence of multiple I/O layers.

@item 
gh-133890@footnote{https://github.com/python/cpython/issues/133890}: The @ref{e4,,tarfile} module now handles @ref{889,,UnicodeEncodeError}
in the same way as @ref{2c2,,OSError} when cannot extract a member.

@item 
gh-134097@footnote{https://github.com/python/cpython/issues/134097}: Fix interaction of the new @ref{492,,REPL} and @ref{170,,-X showrefcount} command line option.

@item 
gh-133889@footnote{https://github.com/python/cpython/issues/133889}: The generated directory listing page in
@ref{d3e,,http.server.SimpleHTTPRequestHandler} now only shows the decoded
path component of the requested URL, and not the query and fragment.

@item 
gh-134098@footnote{https://github.com/python/cpython/issues/134098}: Fix handling paths that end with a percent-encoded slash
(@code{%2f} or @code{%2F}) in @ref{d3e,,http.server.SimpleHTTPRequestHandler}.

@item 
gh-132124@footnote{https://github.com/python/cpython/issues/132124}: On POSIX-compliant systems,
@code{multiprocessing.util.get_temp_dir()} now ignores 
@geindex TMPDIR
@geindex environment variable; TMPDIR
@code{TMPDIR}
(and similar environment variables) if the path length of @code{AF_UNIX}
socket files exceeds the platform-specific maximum length when using the
@ref{1d6,,forkserver} start method.
Patch by Bénédikt Tran.

@item 
gh-134062@footnote{https://github.com/python/cpython/issues/134062}: @ref{84,,ipaddress}: fix collisions in @ref{cf9,,__hash__()}
for @ref{50f,,IPv4Network} and @ref{510,,IPv6Network}
objects.

@item 
gh-133970@footnote{https://github.com/python/cpython/issues/133970}: Make @code{string.templatelib.Template} and
@code{string.templatelib.Interpolation} generic.

@item 
gh-71253@footnote{https://github.com/python/cpython/issues/71253}: Raise @ref{2ee,,ValueError} in @ref{318,,open()} if `opener' returns a
negative file-descriptor in the Python implementation of @ref{83,,io} to
match the C implementation.

@item 
gh-133960@footnote{https://github.com/python/cpython/issues/133960}: Simplify and improve @ref{185f,,typing.evaluate_forward_ref()}. It
now no longer raises errors on certain invalid types. In several
situations, it is now able to evaluate forward references that were
previously unsupported.

@item 
gh-133925@footnote{https://github.com/python/cpython/issues/133925}: Make the private class @code{typing._UnionGenericAlias} hashable.

@item 
gh-133653@footnote{https://github.com/python/cpython/issues/133653}: Fix @ref{1bf,,argparse.ArgumentParser} with the `formatter_class'
argument. Fix TypeError when `formatter_class' is a custom subclass of
@code{HelpFormatter}. Fix TypeError when `formatter_class' is not a
subclass of @code{HelpFormatter} and non-standard `prefix_char' is
used. Fix support of colorizing when `formatter_class' is not a subclass
of @code{HelpFormatter}.

@item 
gh-132641@footnote{https://github.com/python/cpython/issues/132641}: Fixed a race in @ref{be8,,functools.lru_cache()} under
free-threading.

@item 
gh-133783@footnote{https://github.com/python/cpython/issues/133783}: Fix bug with applying @ref{1c2,,copy.replace()} to @ref{9,,ast}
objects. Attributes that default to @code{None} were incorrectly treated as
required for manually created AST nodes.

@item 
gh-133684@footnote{https://github.com/python/cpython/issues/133684}: Fix bug where @ref{457,,annotationlib.get_annotations()} would
return the wrong result for certain classes that are part of a class
hierarchy where @code{from __future__ import annotations} is used.

@item 
gh-77057@footnote{https://github.com/python/cpython/issues/77057}: Fix handling of invalid markup declarations in
@ref{a7d,,html.parser.HTMLParser}.

@item 
gh-130328@footnote{https://github.com/python/cpython/issues/130328}: Speedup pasting in @code{PyREPL} on Windows in a legacy console.
Patch by Chris Eibl.

@item 
gh-133701@footnote{https://github.com/python/cpython/issues/133701}: Fix bug where @ref{330,,typing.TypedDict} classes defined under
@code{from __future__ import annotations} and inheriting from another
@code{TypedDict} had an incorrect @code{__annotations__} attribute.

@item 
gh-133581@footnote{https://github.com/python/cpython/issues/133581}: Improve unparsing of t-strings in @ref{ae8,,ast.unparse()} and
@code{from __future__ import annotations}. Empty t-strings now round-trip
correctly and formatting in interpolations is preserved. Patch by Jelle
Zijlstra.

@item 
gh-133551@footnote{https://github.com/python/cpython/issues/133551}: Support t-strings (
@geindex Python Enhancement Proposals; PEP 750
PEP 750@footnote{https://peps.python.org/pep-0750/}) in @ref{6,,annotationlib}. Patch
by Jelle Zijlstra.

@item 
gh-133439@footnote{https://github.com/python/cpython/issues/133439}: Fix dot commands with trailing spaces are mistaken for
multi-line SQL statements in the sqlite3 command-line interface.

@item 
gh-132493@footnote{https://github.com/python/cpython/issues/132493}: Avoid accessing @code{__annotations__} unnecessarily in
@ref{231,,inspect.signature()}.

@item 
gh-132876@footnote{https://github.com/python/cpython/issues/132876}: @code{ldexp()} on Windows doesn’t round subnormal results before
Windows 11, but should.  Python’s @ref{1889,,math.ldexp()} wrapper now does
round them, so results may change slightly, in rare cases of very small
results, on Windows versions before 11.

@item 
gh-133009@footnote{https://github.com/python/cpython/issues/133009}: @ref{12c,,xml.etree.ElementTree}: Fix a crash in
@ref{1798,,Element.__deepcopy__} when the element is
concurrently mutated. Patch by Bénédikt Tran.

@item 
gh-91555@footnote{https://github.com/python/cpython/issues/91555}: Ignore log messages generated during handling of log messages,
to avoid deadlock or infinite recursion. [NOTE: This change has since been
reverted.]

@item 
gh-125028@footnote{https://github.com/python/cpython/issues/125028}: @ref{218,,functools.Placeholder} cannot be passed to
@ref{219,,functools.partial()} as a keyword argument.

@item 
gh-62824@footnote{https://github.com/python/cpython/issues/62824}: Fix aliases for @code{iso8859_8} encoding. Patch by Dave Goncalves.

@item 
gh-86155@footnote{https://github.com/python/cpython/issues/86155}: @ref{188a,,html.parser.HTMLParser.close()} no longer loses data when
the @code{<script>} tag is not closed. Patch by Waylan Limberg.

@item 
gh-69426@footnote{https://github.com/python/cpython/issues/69426}: Fix @ref{a7d,,html.parser.HTMLParser} to not unescape character
entities in attribute values if they are followed by an ASCII alphanumeric
or an equals sign.

@item 
bpo-28494@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28494}: Improve Zip file validation false positive rate in
@ref{1536,,zipfile.is_zipfile()}.

@item 
gh-134381@footnote{https://github.com/python/cpython/issues/134381}: Fix @ref{246,,RuntimeError} when using a not-started
@ref{177,,threading.Thread} after calling @ref{4b6,,os.fork()}
@end itemize

@node Core and Builtins<25>,C API<10>,Library<27>,Python 3 14 0 beta 2
@anchor{whatsnew/changelog id121}@anchor{188b}
@subsubsection Core and Builtins



@itemize -

@item 
gh-127960@footnote{https://github.com/python/cpython/issues/127960}: PyREPL interactive shell no longer starts with @code{__package__}
and @code{__file__} global names set to @code{_pyrepl} package internals.
Contributed by Yuichiro Tachibana.

@item 
gh-130397@footnote{https://github.com/python/cpython/issues/130397}: Remove special-casing for C stack depth limits for WASI. Due to
WebAssembly’s built-in stack protection this does not pose a security
concern.

@item 
gh-128066@footnote{https://github.com/python/cpython/issues/128066}: Fixes an edge case where PyREPL improperly threw an error when
Python is invoked on a read only filesystem while trying to write history
file entries.

@item 
gh-69605@footnote{https://github.com/python/cpython/issues/69605}: When auto-completing an import in the @ref{492,,REPL}, finding no
candidates now issues no suggestion, rather than suggestions from the
current namespace.

@item 
gh-134158@footnote{https://github.com/python/cpython/issues/134158}: Fix coloring of double braces in f-strings and t-strings in the
@ref{492,,REPL}.

@item 
gh-134119@footnote{https://github.com/python/cpython/issues/134119}: Fix crash when calling @ref{9de,,next()} on an exhausted template
string iterator. Patch by Jelle Zijlstra.

@item 
gh-134100@footnote{https://github.com/python/cpython/issues/134100}: Fix a use-after-free bug that occurs when an imported module
isn’t in @ref{1771,,sys.modules} after its initial import. Patch by
Nico-Posada.

@item 
gh-133999@footnote{https://github.com/python/cpython/issues/133999}: Fix @ref{18f,,SyntaxError} regression in @ref{1ac,,except} parsing
after gh-123440@footnote{https://github.com/python/cpython/issues/123440}.

@item 
gh-133886@footnote{https://github.com/python/cpython/issues/133886}: Fix @ref{16e,,sys.remote_exec()} for non-ASCII paths in non-UTF-8
locales and non-UTF-8 paths in UTF-8 locales.

@item 
gh-133703@footnote{https://github.com/python/cpython/issues/133703}: Fix hashtable in dict can be bigger than intended in some
situations.

@item 
gh-133778@footnote{https://github.com/python/cpython/issues/133778}: Fix bug where assigning to the @ref{188c,,__annotations__}
attributes of classes defined under @code{from __future__ import annotations}
had no effect.

@item 
gh-132762@footnote{https://github.com/python/cpython/issues/132762}: @ref{250,,fromkeys()} no longer loops forever when adding a
small set of keys to a large base dict. Patch by Angela Liss.

@item 
gh-133541@footnote{https://github.com/python/cpython/issues/133541}: Inconsistent indentation in user input crashed the new REPL
when syntax highlighting was active. This is now fixed.

@item 
gh-133516@footnote{https://github.com/python/cpython/issues/133516}: Raise @ref{2ee,,ValueError} when constants @code{True}, @code{False} or
@code{None} are used as an identifier after NFKC normalization.

@item 
gh-132542@footnote{https://github.com/python/cpython/issues/132542}: Update @ref{c39,,Thread.native_id}
after @code{fork(2)@footnote{https://manpages.debian.org/fork(2)}} to ensure accuracy. Patch by Noam Cohen.
@end itemize

@node C API<10>,Build<11>,Core and Builtins<25>,Python 3 14 0 beta 2
@anchor{whatsnew/changelog id122}@anchor{188d}
@subsubsection C API



@itemize -

@item 
gh-134144@footnote{https://github.com/python/cpython/issues/134144}: Fix crash when calling @ref{188e,,Py_EndInterpreter()} with a
@ref{188f,,thread state} that isn’t the initial thread for the interpreter.
@end itemize

@node Build<11>,,C API<10>,Python 3 14 0 beta 2
@anchor{whatsnew/changelog id123}@anchor{1890}
@subsubsection Build



@itemize -

@item 
gh-134455@footnote{https://github.com/python/cpython/issues/134455}: Fixed @code{build-details.json} generation to use the correct
@code{c_api.headers} as defined in 
@geindex Python Enhancement Proposals; PEP 739
PEP 739@footnote{https://peps.python.org/pep-0739/}, instead of @code{c_api.include}.

@item 
gh-131769@footnote{https://github.com/python/cpython/issues/131769}: Fix detecting when the build Python in a cross-build is a
pydebug build.

@item 
gh-117088@footnote{https://github.com/python/cpython/issues/117088}: AIX linker don’t support -h option, so avoid it through
platform check
@end itemize

@node Python 3 14 0 beta 1,Python 3 14 0 alpha 7,Python 3 14 0 beta 2,Changelog
@anchor{whatsnew/changelog python-3-14-0-beta-1}@anchor{1891}
@subsection Python 3.14.0 beta 1


`Release date: 2025-05-06'

@menu
* Windows: Windows<11>. 
* Tools/Demos: Tools/Demos<8>. 
* Tests: Tests<10>. 
* Security: Security<14>. 
* Library: Library<28>. 
* IDLE: IDLE<6>. 
* Documentation: Documentation<11>. 
* Core and Builtins: Core and Builtins<26>. 
* Library: Library<29>. 
* Core and Builtins: Core and Builtins<27>. 
* Library: Library<30>. 
* Core and Builtins: Core and Builtins<28>. 
* Library: Library<31>. 
* C API: C API<11>. 
* Build: Build<12>. 

@end menu

@node Windows<11>,Tools/Demos<8>,,Python 3 14 0 beta 1
@anchor{whatsnew/changelog id124}@anchor{1892}
@subsubsection Windows



@itemize -

@item 
gh-132930@footnote{https://github.com/python/cpython/issues/132930}: Marks the installer for Windows as deprecated and updates
documentation to cover the new Python install manager.

@item 
gh-127405@footnote{https://github.com/python/cpython/issues/127405}: Add @code{ABIFLAGS} to @ref{29a,,sysconfig.get_config_vars()} on
Windows. Patch by Xuehai Pan.
@end itemize

@node Tools/Demos<8>,Tests<10>,Windows<11>,Python 3 14 0 beta 1
@anchor{whatsnew/changelog id125}@anchor{1893}
@subsubsection Tools/Demos



@itemize -

@item 
gh-130453@footnote{https://github.com/python/cpython/issues/130453}: Allow passing multiple keyword arguments with the same function
name in @code{pygettext}.

@item 
gh-130195@footnote{https://github.com/python/cpython/issues/130195}: Add warning messages when @code{pygettext} unimplemented
@code{-a/--extract-all} option is called.
@end itemize

@node Tests<10>,Security<14>,Tools/Demos<8>,Python 3 14 0 beta 1
@anchor{whatsnew/changelog id126}@anchor{1894}
@subsubsection Tests



@itemize -

@item 
gh-133131@footnote{https://github.com/python/cpython/issues/133131}: The iOS testbed will now select the most recently released
“SE-class” device for testing if a device isn’t explicitly specified.

@item 
gh-91048@footnote{https://github.com/python/cpython/issues/91048}: Add ability to externally inspect all pending asyncio tasks,
even if no task is currently entered on the event loop.

@item 
gh-109981@footnote{https://github.com/python/cpython/issues/109981}: The test helper that counts the list of open file descriptors
now uses the optimised @code{/dev/fd} approach on all Apple platforms, not
just macOS. This avoids crashes caused by guarded file descriptors.

@item 
gh-132678@footnote{https://github.com/python/cpython/issues/132678}: Add @code{--prioritize} to @code{-m test}. This option allows the
user to specify which selected tests should execute first, even if the
order is otherwise randomized. This is particularly useful for tests that
run the longest.

@item 
gh-131290@footnote{https://github.com/python/cpython/issues/131290}: Tests in @code{Lib/test} can now be correctly executed as
standalone scripts.
@end itemize

@node Security<14>,Library<28>,Tests<10>,Python 3 14 0 beta 1
@anchor{whatsnew/changelog id127}@anchor{1895}
@subsubsection Security



@itemize -

@item 
gh-115322@footnote{https://github.com/python/cpython/issues/115322}: The underlying extension modules behind @ref{bf,,readline}:,
@ref{dc,,subprocess}, and @ref{2e,,ctypes} now raise audit events on previously
uncovered code paths that could lead to file system access related to C
function calling and external binary execution.  The
@code{ctypes.call_function} audit hook has also been fixed to use an unsigned
value for its @code{function pointer}.
@end itemize

@node Library<28>,IDLE<6>,Security<14>,Python 3 14 0 beta 1
@anchor{whatsnew/changelog id128}@anchor{1896}
@subsubsection Library



@itemize -

@item 
gh-133490@footnote{https://github.com/python/cpython/issues/133490}: Add color support to PDB in remote mode.

@item 
gh-132493@footnote{https://github.com/python/cpython/issues/132493}: Avoid eagerly evaluating annotations in functions decorated
with @ref{13ff,,reprlib.recursive_repr()}.

@item 
gh-130645@footnote{https://github.com/python/cpython/issues/130645}: Add color to stdlib argparse CLIs. Patch by Hugo van Kemenade.

@item 
gh-119180@footnote{https://github.com/python/cpython/issues/119180}: Make @ref{457,,annotationlib.get_annotations()} succeed with the
@code{FORWARDREF} format if evaluating the annotations throws an exception
other than @ref{450,,NameError} or @ref{5f0,,AttributeError}.

@item 
gh-133351@footnote{https://github.com/python/cpython/issues/133351}: Fix remote PDB to correctly request tab completions for Python
expressions from the server when completing a continuation line of a
multi-line Python block.

@item 
gh-133367@footnote{https://github.com/python/cpython/issues/133367}: Add the @code{--feature-version}, @code{--optimize}, and
@code{--show-empty} options to the @ref{9,,ast} command-line interface. Patch
by Semyon Moroz.

@item 
gh-133363@footnote{https://github.com/python/cpython/issues/133363}: The @ref{1897,,cmd.Cmd} class has been fixed to reliably call the
@code{completedefault} method whenever the @code{do_shell} method is not defined
and tab completion is requested for a line beginning with @code{!}.

@item 
gh-113081@footnote{https://github.com/python/cpython/issues/113081}: Highlight syntax on source code in @ref{aa,,pdb}.

@item 
gh-133349@footnote{https://github.com/python/cpython/issues/133349}: Introduced auto-indent in @ref{aa,,pdb} multi-line input.

@item 
gh-133306@footnote{https://github.com/python/cpython/issues/133306}: Use @code{\z} instead of @code{\Z} in @ref{1898,,fnmatch.translate()} and
@ref{4fc,,glob.translate()}.

@item 
gh-133306@footnote{https://github.com/python/cpython/issues/133306}: Support @code{\z} as a synonym for @code{\Z} in @ref{be,,regular expressions}.

@item 
gh-133300@footnote{https://github.com/python/cpython/issues/133300}: Make @ref{1bf,,argparse.ArgumentParser}’s @code{suggest_on_error} a
keyword-only parameter. Patch by Hugo van Kemenade.

@item 
gh-133290@footnote{https://github.com/python/cpython/issues/133290}: Fix attribute caching issue when setting
@ref{1899,,ctypes._Pointer._type_} in the undocumented and deprecated
@code{ctypes.SetPointerType()} function and the undocumented
@code{set_type()} method.

@item 
gh-133223@footnote{https://github.com/python/cpython/issues/133223}: When PDB is attached to a remote process, do a better job of
intercepting Ctrl+C and forwarding it to the remote process.

@item 
gh-133153@footnote{https://github.com/python/cpython/issues/133153}: Do not complete @ref{aa,,pdb} commands in @code{interact} mode of
@code{pdb}.

@item 
gh-133139@footnote{https://github.com/python/cpython/issues/133139}: Add the @ref{1f8,,curses.assume_default_colors()} function, a
refinement of the @ref{1f9,,curses.use_default_colors()} function which allows
to change the color pair @code{0}.

@item 
gh-133089@footnote{https://github.com/python/cpython/issues/133089}: Use original timeout value for @ref{17fc,,subprocess.TimeoutExpired}
when the func @ref{d85,,subprocess.run()} is called with a timeout instead of
sometimes a confusing partial remaining time out value used internally on
the final @code{wait()}.

@item 
gh-133036@footnote{https://github.com/python/cpython/issues/133036}: @ref{317,,codecs.open()} is now deprecated. Use @ref{318,,open()}
instead. Contributed by Inada Naoki.

@item 
gh-132987@footnote{https://github.com/python/cpython/issues/132987}: Many builtin and extension functions which accept an unsigned
integer argument, now use @ref{19f,,__index__()} if available.

@item 
gh-124703@footnote{https://github.com/python/cpython/issues/124703}: Set return code to @code{1} when aborting process from @ref{aa,,pdb}.

@item 
gh-133005@footnote{https://github.com/python/cpython/issues/133005}: Support passing @code{preset} option to @ref{107d,,tarfile.open()} when
using @code{'w|xz'} mode.

@item 
gh-115032@footnote{https://github.com/python/cpython/issues/115032}: Support for custom logging handlers with the `strm' argument is
deprecated and scheduled for removal in Python 3.16. Define handlers with
the `stream' argument instead. Patch by Mariusz Felisiak.

@item 
gh-132991@footnote{https://github.com/python/cpython/issues/132991}: Add @code{socket.IP_FREEBIND} constant on Linux 2.4 and
later.

@item 
gh-132995@footnote{https://github.com/python/cpython/issues/132995}: Bump the version of pip bundled in ensurepip to version 25.1.1

@item 
gh-132933@footnote{https://github.com/python/cpython/issues/132933}: The zipapp module now applies the filter when creating the list
of files to add, rather than waiting until the file is being added to the
archive.

@item 
gh-121249@footnote{https://github.com/python/cpython/issues/121249}: Always support the float complex and double complex C types in the @ref{db,,struct} module.  Patch by Sergey B
Kirpichev.

@item 
gh-132915@footnote{https://github.com/python/cpython/issues/132915}: @ref{189a,,fcntl.fcntl()} and @ref{1687,,fcntl.ioctl()} can now detect a
buffer overflow and raise @ref{796,,SystemError}. The stack and memory can be
corrupted in such case, so treat this error as fatal.

@item 
gh-132017@footnote{https://github.com/python/cpython/issues/132017}: Fix error when @code{pyrepl} is suspended, then resumed and
terminated.

@item 
gh-132893@footnote{https://github.com/python/cpython/issues/132893}: Improved @ref{189b,,statistics.NormalDist.cdf()} accuracy for inputs
smaller than the mean.

@item 
gh-130328@footnote{https://github.com/python/cpython/issues/130328}: Speedup pasting in @code{PyREPL} on Windows. Fix by Chris Eibl.

@item 
gh-132882@footnote{https://github.com/python/cpython/issues/132882}: Fix copying of @ref{2aa,,typing.Union} objects containing objects
that do not support the @code{|} operator.

@item 
gh-93696@footnote{https://github.com/python/cpython/issues/93696}: Fixed the breakpoint display error for frozen modules in
@ref{aa,,pdb}.

@item 
gh-129965@footnote{https://github.com/python/cpython/issues/129965}: Add MIME types for @code{.7z}, @code{.apk}, @code{.deb}, @code{.glb},
@code{.gltf}, @code{.gz}, @code{.m4v}, @code{.php}, @code{.rar}, @code{.rpm}, @code{.stl} and
@code{.wmv}. Patch by Hugo van Kemenade.

@item 
gh-132742@footnote{https://github.com/python/cpython/issues/132742}: @ref{189a,,fcntl.fcntl()} now supports arbitrary @ref{194,,bytes-like objects}, not only @ref{193,,bytes}. @ref{1687,,fcntl.ioctl()}
now automatically retries system calls failing with EINTR and releases the
GIL during a system call even for large bytes-like object.

@item 
gh-132451@footnote{https://github.com/python/cpython/issues/132451}: The CLI for the PDB debugger now accepts a @code{-p PID} argument
to allow attaching to a running process. The process must be running the
same version of Python as the one running PDB.

@item 
gh-125618@footnote{https://github.com/python/cpython/issues/125618}: Add a `format' parameter to
@ref{1803,,annotationlib.ForwardRef.evaluate()}. Evaluating annotations in the
@code{FORWARDREF} format now succeeds in more cases that would previously
have raised an exception.

@item 
gh-132805@footnote{https://github.com/python/cpython/issues/132805}: Fix incorrect handling of nested non-constant values in the
FORWARDREF format in @ref{6,,annotationlib}.

@item 
gh-132734@footnote{https://github.com/python/cpython/issues/132734}: Add new constants for Bluetooth @ref{d1,,sockets}.

@item 
gh-132673@footnote{https://github.com/python/cpython/issues/132673}: Fix @ref{8ba,,AssertionError} raised on @ref{1e7,,ctypes.Structure}
with @code{_align_ = 0} and @code{_fields_ = []}.

@item 
gh-132578@footnote{https://github.com/python/cpython/issues/132578}: Rename the @code{threading.Thread._handle} field to avoid
shadowing methods defined on subclasses of @code{threading.Thread}.

@item 
gh-132561@footnote{https://github.com/python/cpython/issues/132561}: Fix the public @code{locked} method of @code{multiprocessing.SemLock}
class. Also adding 2 tests for the derivated @ref{189c,,multiprocessing.Lock}
and @ref{189d,,multiprocessing.RLock} classes.

@item 
gh-121468@footnote{https://github.com/python/cpython/issues/121468}: Add @ref{27b,,pdb.set_trace_async()} function to support
@ref{18e,,await} statements in @ref{aa,,pdb}.

@item 
gh-132493@footnote{https://github.com/python/cpython/issues/132493}: @ref{56b,,typing.Protocol} now uses
@ref{457,,annotationlib.get_annotations()} when checking whether or not an
instance implements the protocol with @ref{2af,,isinstance()}. This enables
support for @code{isinstance} checks against classes with deferred
annotations.

@item 
gh-132536@footnote{https://github.com/python/cpython/issues/132536}: Do not disable @ref{189e,,PY_THROW} event in @ref{10,,bdb}
because it can’t be disabled.

@item 
gh-132527@footnote{https://github.com/python/cpython/issues/132527}: Include the valid typecode ‘w’ in the error message when an
invalid typecode is passed to @ref{4bf,,array.array}.

@item 
gh-132099@footnote{https://github.com/python/cpython/issues/132099}: The Bluetooth socket with the @ref{283,,BTPROTO_HCI}
protocol on Linux now accepts an address in the format of an integer
@code{device_id}, not only a tuple  @code{(device_id,)}.

@item 
gh-81793@footnote{https://github.com/python/cpython/issues/81793}: Fix @ref{12fb,,os.link()} on platforms (like Linux) where the system
@code{link()} function does not follow symlinks. On Linux, it now
follows symlinks by default or if @code{follow_symlinks=True} is specified.
On Windows, it now raises an error if @code{follow_symlinks=True} is passed.
On macOS, it now raises an error if @code{follow_symlinks=False} is passed
and the system @code{linkat()} function is not available at runtime.

@item 
gh-132493@footnote{https://github.com/python/cpython/issues/132493}: Support creation of @ref{56b,,typing.Protocol} classes with
annotations that cannot be resolved at class creation time.

@item 
gh-132491@footnote{https://github.com/python/cpython/issues/132491}: Rename @code{annotationlib.value_to_string} to
@ref{189f,,annotationlib.type_repr()} and provide better handling for function
objects.

@item 
gh-132426@footnote{https://github.com/python/cpython/issues/132426}: Add @ref{459,,annotationlib.get_annotate_from_class_namespace()} as
a helper for accessing annotations in metaclasses, and remove
@code{annotationlib.get_annotate_function}.

@item 
gh-70145@footnote{https://github.com/python/cpython/issues/70145}: Add support for channels in Bluetooth HCI protocol
(@ref{283,,BTPROTO_HCI}).

@item 
gh-131913@footnote{https://github.com/python/cpython/issues/131913}: Add a shortcut function
@ref{253,,multiprocessing.Process.interrupt()} alongside the existing
@ref{18a0,,multiprocessing.Process.terminate()} and
@ref{d55,,multiprocessing.Process.kill()} for an improved control over child
process termination.

@item 
gh-132439@footnote{https://github.com/python/cpython/issues/132439}: Fix @code{PyREPL} on Windows: characters entered via AltGr are
swallowed. Patch by Chris Eibl.

@item 
gh-132429@footnote{https://github.com/python/cpython/issues/132429}: Fix support of Bluetooth sockets on NetBSD and DragonFly BSD.
Add support for `cid' and `bdaddr_type' in the BTPROTO_L2CAP address on
FreeBSD. Return `cid' in @code{getsockname()} for BTPROTO_L2CAP if it is not
zero.

@item 
gh-132106@footnote{https://github.com/python/cpython/issues/132106}: @ref{245,,QueueListener.start} now raises a @ref{246,,RuntimeError}
if the listener is already started.

@item 
gh-132417@footnote{https://github.com/python/cpython/issues/132417}: Fix a @code{NULL} pointer dereference when a C function called
using @ref{2e,,ctypes} with @code{restype} @ref{1f5,,py_object} returns
@code{NULL}.

@item 
gh-132385@footnote{https://github.com/python/cpython/issues/132385}: Fix instance error suggestions trigger potential exceptions in
@ref{6fb,,object.__getattr__()} in @ref{105,,traceback}.

@item 
gh-125866@footnote{https://github.com/python/cpython/issues/125866}: Add optional `add_scheme' argument to
@ref{2c1,,urllib.request.pathname2url()}; when set to true, a complete URL is
returned. Likewise add optional `require_scheme' argument to
@ref{2bf,,url2pathname()}; when set to true, a complete URL is
accepted.

@item 
gh-132308@footnote{https://github.com/python/cpython/issues/132308}: A @ref{563,,traceback.TracebackException} now correctly renders
the @code{__context__} and @code{__cause__} attributes from @ref{18a1,,falsey} @ref{bd3,,Exception}, and the @code{exceptions} attribute from falsey
@ref{4d3,,ExceptionGroup}.

@item 
gh-130645@footnote{https://github.com/python/cpython/issues/130645}: Add colour to @ref{7,,argparse} help output. Patch by Hugo van
Kemenade.

@item 
gh-127495@footnote{https://github.com/python/cpython/issues/127495}: In PyREPL, append a new entry to the @code{PYTHON_HISTORY} file
`after' every statement.  This should preserve command-line history after
interpreter is terminated.  Patch by Sergey B Kirpichev.

@item 
gh-129463@footnote{https://github.com/python/cpython/issues/129463}: Comparison of @ref{17c9,,annotationlib.ForwardRef} objects no
longer uses the internal @code{__code__} and @code{__ast_node__} attributes,
which are used as caches.

@item 
gh-132250@footnote{https://github.com/python/cpython/issues/132250}: Fixed the @ref{796,,SystemError} in @ref{2b,,cProfile} when locating
the actual C function of a method raises an exception.

@item 
gh-132064@footnote{https://github.com/python/cpython/issues/132064}: @ref{457,,annotationlib.get_annotations()} now uses the
@code{__annotate__} attribute if it is present, even if @code{__annotations__}
is not present. Additionally, the function now raises a
@ref{199,,TypeError} if it is passed an object that does not have any
annotatins.

@item 
gh-130664@footnote{https://github.com/python/cpython/issues/130664}: Support the @code{'_'} digit separator in formatting of the
integral part of @ref{200,,Decimal}’s.  Patch by Sergey B
Kirpichev.

@item 
gh-131952@footnote{https://github.com/python/cpython/issues/131952}: Add color output to the @code{json} CLI. Patch by Tomas
Roun.

@item 
gh-132063@footnote{https://github.com/python/cpython/issues/132063}: Prevent exceptions that evaluate as falsey (namely, when their
@code{__bool__} method returns @code{False} or their @code{__len__} method returns
0) from being ignored by @ref{1d8,,concurrent.futures.ProcessPoolExecutor}
and @ref{94e,,concurrent.futures.ThreadPoolExecutor}.

@item 
gh-132106@footnote{https://github.com/python/cpython/issues/132106}: @ref{244,,logging.handlers.QueueListener} now implements the
context manager protocol, allowing it to be used in a @ref{187,,with}
statement.

@item 
gh-132054@footnote{https://github.com/python/cpython/issues/132054}: The @code{application/yaml} mime type (
@geindex RFC; RFC 9512
RFC 9512@footnote{https://datatracker.ietf.org/doc/html/rfc9512.html}) is now
supported by @ref{93,,mimetypes}. Patch by Sasha “Nelie” Chernykh and Hugo
van Kemenade.

@item 
gh-119605@footnote{https://github.com/python/cpython/issues/119605}: Respect @code{follow_wrapped} for @code{__init__()} and
@code{__new__()} methods when getting the class signature for a class with
@ref{231,,inspect.signature()}. Preserve class signature after wrapping with
@ref{48a,,warnings.deprecated()}. Patch by Xuehai Pan.

@item 
gh-118761@footnote{https://github.com/python/cpython/issues/118761}: Improve import times by up to 33x for the @ref{c9,,shlex} module,
and improve the performance of @ref{582,,shlex.quote()} by up to 12x. Patch by
Adam Turner.

@item 
gh-85302@footnote{https://github.com/python/cpython/issues/85302}: Add support for @ref{284,,BTPROTO_SCO} in sockets on
FreeBSD.

@item 
gh-131757@footnote{https://github.com/python/cpython/issues/131757}: Make @ref{be8,,functools.lru_cache()} call the cached function
unlocked to allow concurrency.

@item 
gh-131423@footnote{https://github.com/python/cpython/issues/131423}: @ref{d5,,ssl} can show descriptions for errors added in OpenSSL
3.4.1. Patch by Bénédikt Tran.

@item 
gh-131434@footnote{https://github.com/python/cpython/issues/131434}: Improve error reporting for incorrect format in
@ref{1639,,time.strptime()}.

@item 
gh-131524@footnote{https://github.com/python/cpython/issues/131524}: Add help message to @ref{af,,platform} command-line interface.
Contributed by Harry Lees.

@item 
gh-100926@footnote{https://github.com/python/cpython/issues/100926}: Move @ref{1f3,,ctypes.POINTER()} types cache from a global internal
cache (@code{_pointer_type_cache}) to the
@ref{1f4,,ctypes._CData.__pointer_type__} attribute of the corresponding
@ref{2e,,ctypes} types. This will stop the cache from growing without limits
in some situations.

@item 
gh-85702@footnote{https://github.com/python/cpython/issues/85702}: If @code{zoneinfo._common.load_tzdata} is given a package without a
resource a @code{ZoneInfoNotFoundError} is raised rather than a
@ref{125f,,IsADirectoryError}.

@item 
gh-123471@footnote{https://github.com/python/cpython/issues/123471}: Make concurrent iterations over @ref{18a2,,itertools.repeat} safe
under free-threading.

@item 
gh-131127@footnote{https://github.com/python/cpython/issues/131127}: Systems using LibreSSL now successfully build.

@item 
gh-89157@footnote{https://github.com/python/cpython/issues/89157}: Make the pure Python implementation of
@ref{829,,datetime.date.fromisoformat()}, only accept ASCII strings for
consistency with the C implementation.

@item 
gh-130941@footnote{https://github.com/python/cpython/issues/130941}: Fix @ref{4df,,configparser.ConfigParser} parsing empty
interpolation with @code{allow_no_value} set to @code{True}.

@item 
gh-110067@footnote{https://github.com/python/cpython/issues/110067}: Make @ref{6d,,heapq} max-heap functions @ref{223,,heapq.heapify_max()},
@ref{224,,heapq.heappush_max()}, @ref{225,,heapq.heappop_max()}, and
@ref{226,,heapq.heapreplace_max()} public. Previous underscored naming is kept
for backwards compatibility. Additionally, the missing function
@ref{227,,heapq.heappushpop_max()} has been added to both the C and Python
implementations.

@item 
gh-129098@footnote{https://github.com/python/cpython/issues/129098}: Fix REPL traceback reporting when using @ref{4b2,,compile()} with an
inexisting file. Patch by Bénédikt Tran.

@item 
gh-130631@footnote{https://github.com/python/cpython/issues/130631}: @code{http.cookiejar.join_header_words()} is now more similar
to the original Perl version. It now quotes the same set of characters and
always quote values that end with @code{"\n"}.

@item 
gh-130482@footnote{https://github.com/python/cpython/issues/130482}: Add ability to specify name for @code{tkinter.OptionMenu}
and @code{tkinter.ttk.OptionMenu}.

@item 
gh-77065@footnote{https://github.com/python/cpython/issues/77065}: Add keyword-only optional argument `echo_char' for
@ref{21f,,getpass.getpass()} for optional visual keyboard feedback support.
Patch by Semyon Moroz.

@item 
gh-130317@footnote{https://github.com/python/cpython/issues/130317}: Fix @ref{96e,,PyFloat_Pack2()} and @ref{971,,PyFloat_Unpack2()} for
NaN’s with payload.  This corrects round-trip for @ref{18a3,,struct.unpack()}
and @ref{1482,,struct.pack()} in case of the IEEE 754 binary16 “half precision”
type. Patch by Sergey B Kirpichev.

@item 
gh-130402@footnote{https://github.com/python/cpython/issues/130402}: Joining running daemon threads during interpreter shutdown now
raises @ref{479,,PythonFinalizationError}.

@item 
gh-130167@footnote{https://github.com/python/cpython/issues/130167}: Improve speed of @ref{2d9,,difflib.IS_LINE_JUNK()}. Patch by Semyon
Moroz.

@item 
gh-101410@footnote{https://github.com/python/cpython/issues/101410}: Added more detailed messages for domain errors in the
@ref{92,,math} module.

@item 
gh-128384@footnote{https://github.com/python/cpython/issues/128384}: Make @ref{17a,,warnings.catch_warnings} use a context variable
for holding the warning filtering state if the
@ref{18b,,sys.flags.context_aware_warnings} flag is set to true.  This makes
using the context manager thread-safe in multi-threaded programs.  The
flag is true by default in free-threaded builds and is otherwise false.
The value of the flag can be overridden by the the @ref{170,,-X context_aware_warnings} command-line option or by the
@geindex PYTHON_CONTEXT_AWARE_WARNINGS
@geindex environment variable; PYTHON_CONTEXT_AWARE_WARNINGS
@ref{18a4,,PYTHON_CONTEXT_AWARE_WARNINGS} environment variable.

@item 
gh-129719@footnote{https://github.com/python/cpython/issues/129719}: Fix missing @code{socket.CAN_RAW_ERR_FILTER} constant in the
socket module on Linux systems. It was missing since Python 3.11.

@item 
gh-129027@footnote{https://github.com/python/cpython/issues/129027}: Raise @ref{1a4,,DeprecationWarning} for
@ref{294,,sys._clear_type_cache()}. This function was deprecated in Python 3.13
but it didn’t raise a runtime warning.

@item 
gh-128307@footnote{https://github.com/python/cpython/issues/128307}: Add @code{eager_start} keyword argument to
@ref{1cc,,asyncio.loop.create_task()}

@item 
gh-127604@footnote{https://github.com/python/cpython/issues/127604}: Add support for printing the C stack trace on systems that
support it via @ref{210,,faulthandler.dump_c_stack()} or via the `c_stack'
argument in @ref{211,,faulthandler.enable()}.

@item 
gh-127385@footnote{https://github.com/python/cpython/issues/127385}: Add the @code{F_DUPFD_QUERY} constant to the @ref{5d,,fcntl} module.

@item 
gh-126838@footnote{https://github.com/python/cpython/issues/126838}: Add `resolve_host' keyword-only parameter to
@ref{2bf,,urllib.request.url2pathname()}, and fix handling of file URLs with
authorities.

@item 
gh-82129@footnote{https://github.com/python/cpython/issues/82129}: Fix @ref{450,,NameError} when calling @ref{8c2,,typing.get_type_hints()}
on a @ref{4e2,,dataclasses.dataclass()} created by
@ref{18a5,,dataclasses.make_dataclass()} with un-annotated fields.

@item 
gh-122559@footnote{https://github.com/python/cpython/issues/122559}: Remove @code{__reduce__()} and @code{__reduce_ex__()} methods
that always raise @ref{199,,TypeError} in the C implementation of
@ref{151b,,io.FileIO}, @ref{141a,,io.BufferedReader}, @ref{15bd,,io.BufferedWriter}
and @ref{15be,,io.BufferedRandom} and replace them with default
@code{__getstate__()} methods that raise @code{TypeError}. This restores
fine details of behavior of Python 3.11 and older versions.

@item 
gh-122179@footnote{https://github.com/python/cpython/issues/122179}: @ref{855,,hashlib.file_digest()} now raises @ref{237,,BlockingIOError}
when no data is available during non-blocking I/O. Before, it added
spurious null bytes to the digest.

@item 
gh-53032@footnote{https://github.com/python/cpython/issues/53032}: Expose @ref{201,,decimal.IEEEContext()} to support creation of
contexts corresponding to the IEEE 754 (2008) decimal interchange formats.
Patch by Sergey B Kirpichev.

@item 
gh-120220@footnote{https://github.com/python/cpython/issues/120220}: Deprecate the @code{tkinter.Variable} methods
@code{trace_variable()}, @code{trace_vdelete()} and @code{trace_vinfo()}.
Methods @code{trace_add()}, @code{trace_remove()} and @code{trace_info()}
can be used instead.

@item 
gh-113539@footnote{https://github.com/python/cpython/issues/113539}: @ref{11c,,webbrowser}: Names in the 
@geindex BROWSER
@geindex environment variable; BROWSER
@code{BROWSER} environment
variable can now refer to already registered web browsers, instead of
always generating a new browser command.

This makes it possible to set 
@geindex BROWSER
@geindex environment variable; BROWSER
@code{BROWSER} to the value of one of the
supported browsers on macOS.

@item 
bpo-44172@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44172}: Keep a reference to original @ref{2f,,curses} windows in
subwindows so that the original window does not get deleted before
subwindows.

@item 
gh-75223@footnote{https://github.com/python/cpython/issues/75223}: Deprecate undotted extensions in
@ref{31b,,mimetypes.MimeTypes.add_type()}. Patch by Hugo van Kemenade.
@end itemize

@node IDLE<6>,Documentation<11>,Library<28>,Python 3 14 0 beta 1
@anchor{whatsnew/changelog id129}@anchor{18a6}
@subsubsection IDLE



@itemize -

@item 
gh-112936@footnote{https://github.com/python/cpython/issues/112936}: fix IDLE: no Shell menu item in single-process mode.
@end itemize

@node Documentation<11>,Core and Builtins<26>,IDLE<6>,Python 3 14 0 beta 1
@anchor{whatsnew/changelog id130}@anchor{18a7}
@subsubsection Documentation



@itemize -

@item 
gh-107006@footnote{https://github.com/python/cpython/issues/107006}: Move documentation and example code for
@ref{18a8,,threading.local} from its docstring to the official docs.

@item 
gh-125142@footnote{https://github.com/python/cpython/issues/125142}: As part of the builtin help intro text, show the keyboard
shortcuts for the new, non-basic REPL (F1, F2, and F3).
@end itemize

@node Core and Builtins<26>,Library<29>,Documentation<11>,Python 3 14 0 beta 1
@anchor{whatsnew/changelog id131}@anchor{18a9}
@subsubsection Core and Builtins



@itemize -

@item 
gh-133336@footnote{https://github.com/python/cpython/issues/133336}: @code{-J} is no longer reserved for use by Jython. Patch by
Adam Turner.

@item 
gh-133261@footnote{https://github.com/python/cpython/issues/133261}: Fix bug where the cycle GC could untrack objects in the
trashcan because they looked like they were immortal. When objects are
added to the trashcan, we take care to ensure they keep a mortal reference
count.

@item 
gh-133346@footnote{https://github.com/python/cpython/issues/133346}: Added experimental color theming support to the @code{_colorize}
module.

@item 
gh-132917@footnote{https://github.com/python/cpython/issues/132917}: For the free-threaded build, check the process memory usage
increase before triggering a full automatic garbage collection.  If the
memory used has not increased 10% since the last collection then defer it.

@item 
gh-91048@footnote{https://github.com/python/cpython/issues/91048}: Add a new @code{python -m asyncio ps PID} command-line interface to
inspect asyncio tasks in a running Python process. Displays a flat table
of await relationships. A variant showing a tree view is also available as
@code{python -m asyncio pstree PID}. Both are useful for debugging async
code. Patch by Pablo Galindo, Łukasz Langa, Yury Selivanov, and Marta
Gomez Macias.

@item 
gh-133304@footnote{https://github.com/python/cpython/issues/133304}: Workaround NaN’s “canonicalization” in @ref{96f,,PyFloat_Pack4()}
and @ref{972,,PyFloat_Unpack4()} on RISC-V.

@item 
gh-133197@footnote{https://github.com/python/cpython/issues/133197}: Improve @ref{18f,,SyntaxError} error messages for incompatible
string / bytes prefixes.

@item 
gh-133231@footnote{https://github.com/python/cpython/issues/133231}: Add new utilities of observing JIT compilation:
@ref{44d,,sys._jit.is_available()}, @ref{44e,,sys._jit.is_enabled()}, and
@ref{18aa,,sys._jit.is_active()}.
@end itemize

@node Library<29>,Core and Builtins<27>,Core and Builtins<26>,Python 3 14 0 beta 1
@anchor{whatsnew/changelog id132}@anchor{18ab}
@subsubsection Library



@itemize -

@item 
gh-133194@footnote{https://github.com/python/cpython/issues/133194}: @ref{1c4,,ast.parse()} will no longer parse new 
@geindex Python Enhancement Proposals; PEP 758
PEP 758@footnote{https://peps.python.org/pep-0758/} syntax
with older `feature_version' passed.
@end itemize

@node Core and Builtins<27>,Library<30>,Library<29>,Python 3 14 0 beta 1
@anchor{whatsnew/changelog id133}@anchor{18ac}
@subsubsection Core and Builtins



@itemize -

@item 
gh-131798@footnote{https://github.com/python/cpython/issues/131798}: Split @code{CALL_LEN} into several uops allowing the JIT to remove
them when optimizing. Patch by Diego Russo.

@item 
gh-131798@footnote{https://github.com/python/cpython/issues/131798}: Use @code{sym_new_type} instead of @code{sym_new_not_null} for
_BUILD_STRING, _BUILD_SET

@item 
gh-132942@footnote{https://github.com/python/cpython/issues/132942}: Fix two races in the type lookup cache.  This affected the
free-threaded build and could cause crashes (apparently quite difficult to
trigger).

@item 
gh-131798@footnote{https://github.com/python/cpython/issues/131798}: Propagate the return type of @code{_BINARY_OP_SUBSCR_TUPLE_INT} in
JIT. Patch by Tomas Roun

@item 
gh-132952@footnote{https://github.com/python/cpython/issues/132952}: Speed up startup with the @code{-S} argument by importing the
private @code{_io} module instead of @ref{83,,io}. This fixes a performance
regression introduced earlier in Python 3.14 development and restores
performance to the level of Python 3.13.

@item 
gh-131798@footnote{https://github.com/python/cpython/issues/131798}: Allow the JIT to remove int guards after @code{_CALL_LEN} by
setting the return type to int. Patch by Diego Russo

@item 
gh-131798@footnote{https://github.com/python/cpython/issues/131798}: Split @code{CALL_TUPLE_1} into several uops allowing the JIT to
remove some of them. Patch by Tomas Roun

@item 
gh-131798@footnote{https://github.com/python/cpython/issues/131798}: Split @code{CALL_STR_1} into several uops allowing the JIT to
remove some of them. Patch by Tomas Roun

@item 
gh-132825@footnote{https://github.com/python/cpython/issues/132825}: Enhance unhashable key/element error messages for @ref{184,,dict}
and @ref{185,,set}. Patch by Victor Stinner.

@item 
gh-131591@footnote{https://github.com/python/cpython/issues/131591}: Reset any 
@geindex Python Enhancement Proposals; PEP 768
PEP 768@footnote{https://peps.python.org/pep-0768/} remote debugging pending call in children
after @ref{4b6,,os.fork()} calls.

@item 
gh-132713@footnote{https://github.com/python/cpython/issues/132713}: Fix @code{repr(list)} race condition: hold a strong reference to
the item while calling @code{repr(item)}. Patch by Victor Stinner.

@item 
gh-132661@footnote{https://github.com/python/cpython/issues/132661}: Implement 
@geindex Python Enhancement Proposals; PEP 750
PEP 750@footnote{https://peps.python.org/pep-0750/} (Template Strings). Add new syntax for
t-strings and implement new internal @code{string.templatelib.Template}
and @code{string.templatelib.Interpolation} types.

@item 
gh-132479@footnote{https://github.com/python/cpython/issues/132479}: Fix compiler crash in certain circumstances where multiple
module-level annotations include comprehensions and other nested scopes.

@item 
gh-132747@footnote{https://github.com/python/cpython/issues/132747}: Fix a crash when calling @ref{16f4,,__get__()} of a
@ref{18ad,,method} with a @ref{887,,None} second argument.

@item 
gh-132744@footnote{https://github.com/python/cpython/issues/132744}: Certain calls now check for runaway recursion and respect the
system recursion limit.

@item 
gh-132449@footnote{https://github.com/python/cpython/issues/132449}: Syntax errors that look like misspellings of Python keywords
now provide a helpful fix suggestion for the typo.  Contributed by Pablo
Galindo Salgado.
@end itemize

@node Library<30>,Core and Builtins<28>,Core and Builtins<27>,Python 3 14 0 beta 1
@anchor{whatsnew/changelog id134}@anchor{18ae}
@subsubsection Library



@itemize -

@item 
gh-132737@footnote{https://github.com/python/cpython/issues/132737}: Support profiling code that requires @code{__main__}, such as
@ref{ab,,pickle}.
@end itemize

@node Core and Builtins<28>,Library<31>,Library<30>,Python 3 14 0 beta 1
@anchor{whatsnew/changelog id135}@anchor{18af}
@subsubsection Core and Builtins



@itemize -

@item 
gh-132639@footnote{https://github.com/python/cpython/issues/132639}: Added @ref{606,,PyLong_AsNativeBytes()},
@ref{607,,PyLong_FromNativeBytes()} and
@ref{608,,PyLong_FromUnsignedNativeBytes()} to the limited C API.

@item 
gh-100239@footnote{https://github.com/python/cpython/issues/100239}: Add specialisation for @code{BINARY_OP/SUBSCR} on list and slice.

@item 
gh-132508@footnote{https://github.com/python/cpython/issues/132508}: Uses tagged integers on the evaluation stack to represent the
instruction offsets when reraising an exception. This avoids the need to
box the integer which could fail in low memory conditions.

@item 
gh-124476@footnote{https://github.com/python/cpython/issues/124476}: Fix decoding from the locale encoding in the C.UTF-8 locale.

@item 
gh-131927@footnote{https://github.com/python/cpython/issues/131927}: Compiler warnings originating from the same module and line
number are now only emitted once, matching the behaviour of warnings
emitted from user code. This can also be configured with @ref{119,,warnings}
filters.

@item 
gh-132457@footnote{https://github.com/python/cpython/issues/132457}: Make @ref{451,,staticmethod()} and @ref{48f,,classmethod()} generic.

@item 
gh-131798@footnote{https://github.com/python/cpython/issues/131798}: Use @code{sym_new_type} instead of @code{sym_new_not_null} for
_BUILD_LIST, _BUILD_SET, _BUILD_MAP

@item 
gh-131798@footnote{https://github.com/python/cpython/issues/131798}: Split @code{CALL_TYPE_1} into several uops allowing the JIT to
remove some of them.

@item 
gh-132386@footnote{https://github.com/python/cpython/issues/132386}: Fix crash when passing a dict subclass as the @code{globals}
parameter to @ref{4a3,,exec()}.

@item 
gh-127682@footnote{https://github.com/python/cpython/issues/127682}: No longer call @code{__iter__} twice when creating and executing a
generator expression. Creating a generator expression from a non-interable
will raise only when the generator expression is executed. This brings the
behavior of generator expressions in line with other generators.

@item 
gh-132261@footnote{https://github.com/python/cpython/issues/132261}: The internal storage for annotations and annotate functions on
classes now uses different keys in the class dictionary. This eliminates
various edge cases where access to the @code{__annotate__} and
@code{__annotations__} attributes would behave unpredictably.

@item 
gh-132284@footnote{https://github.com/python/cpython/issues/132284}: Don’t wrap base @code{PyCFunction} slots on class creation if not
overridden.

@item 
gh-130415@footnote{https://github.com/python/cpython/issues/130415}: Improve the JIT’s ability to remove unused constant and local
variable loads, and fix an issue where deallocating unused values could
cause JIT code to crash or behave incorrectly.

@item 
gh-126703@footnote{https://github.com/python/cpython/issues/126703}: Fix possible use after free in cases where a method’s
definition has the same lifetime as its @code{self}.

@item 
gh-132286@footnote{https://github.com/python/cpython/issues/132286}: Fix that @ref{18b0,,type.__annotate__} was not deleted, when
@ref{188c,,type.__annotations__} was deleted.

@item 
gh-131798@footnote{https://github.com/python/cpython/issues/131798}: Allow the JIT to remove an extra @code{_TO_BOOL_BOOL} instruction
after @code{_CONTAINS_OP_DICT} by setting the return type to bool.

@item 
gh-124715@footnote{https://github.com/python/cpython/issues/124715}: Prevents against stack overflows when calling
@ref{791,,Py_DECREF()}. Third-party extension objects no longer need to use
the “trashcan” mechanism, as protection is now built into the
@code{Py_DECREF()} macro.

@item 
gh-131798@footnote{https://github.com/python/cpython/issues/131798}: Allow the JIT compiler to remove some type checks for
operations on lists, tuples, dictionaries, and sets.

@item 
gh-128398@footnote{https://github.com/python/cpython/issues/128398}: Improve error message when an object supporting the synchronous
(resp. asynchronous) context manager protocol is entered using
@ref{186,,async with} (resp. @ref{187,,with}) instead of @code{with}
(resp. @code{async with}). Patch by Bénédikt Tran.

@item 
gh-131798@footnote{https://github.com/python/cpython/issues/131798}: Allow the JIT to remove unicode guards after
@code{_BINARY_OP_SUBSCR_STR_INT} by setting the return type to string.

@item 
gh-131878@footnote{https://github.com/python/cpython/issues/131878}: Handle uncaught exceptions in the main input loop for the new
REPL.

@item 
gh-131878@footnote{https://github.com/python/cpython/issues/131878}: Fix support of unicode characters with two or more codepoints
on Windows in the new REPL.

@item 
gh-126835@footnote{https://github.com/python/cpython/issues/126835}: Move constant folding to the peephole optimizer. Rename AST
optimization related files (Python/ast_opt.c -> Python/ast_preprocess.c),
structs (_PyASTOptimizeState -> _PyASTPreprocessState) and functions
(_PyAST_Optimize -> _PyAST_Preprocess, _PyCompile_AstOptimize ->
_PyCompile_AstPreprocess).

@item 
gh-114809@footnote{https://github.com/python/cpython/issues/114809}: Add support for macOS multi-arch builds with the JIT enabled

@item 
gh-131507@footnote{https://github.com/python/cpython/issues/131507}: PyREPL now supports syntax highlighting. Contributed by Łukasz
Langa.

@item 
gh-130907@footnote{https://github.com/python/cpython/issues/130907}: If the @code{__annotations__} of a module object are accessed
while the module is executing, return the annotations that have been
defined so far, without caching them.

@item 
gh-130104@footnote{https://github.com/python/cpython/issues/130104}: Three-argument @ref{1a5,,pow()} now try calling
@ref{1a6,,__rpow__()} if necessary. Previously it was only called in
two-argument @code{pow()} and the binary power operator.

@item 
gh-130070@footnote{https://github.com/python/cpython/issues/130070}: Fixed an assertion error for @ref{4a3,,exec()} passed a string
@code{source} and a non-@code{None} @code{closure}. Patch by Bartosz Sławecki.

@item 
gh-129958@footnote{https://github.com/python/cpython/issues/129958}: Fix a bug that was allowing newlines inconsistently in format
specifiers for single-quoted f-strings. Patch by Pablo Galindo.

@item 
gh-129858@footnote{https://github.com/python/cpython/issues/129858}: @code{elif} statements that follow an @code{else} block now have a
specific error message.

@item 
gh-69605@footnote{https://github.com/python/cpython/issues/69605}: Add module autocomplete to PyREPL.

@item 
gh-128555@footnote{https://github.com/python/cpython/issues/128555}: Add the @ref{176,,sys.flags.thread_inherit_context} flag.


@itemize *

@item 
This flag is set to true by default on the free-threaded build
and false otherwise.  If the flag is true, starting a new thread using
@ref{177,,threading.Thread} will, by default, use a copy of the
@ref{178,,contextvars.Context} from the caller of
@ref{179,,threading.Thread.start()} rather than using an empty context.

@item 
Add the @ref{170,,-X thread_inherit_context} command-line option and
@geindex PYTHON_THREAD_INHERIT_CONTEXT
@geindex environment variable; PYTHON_THREAD_INHERIT_CONTEXT
@ref{18b1,,PYTHON_THREAD_INHERIT_CONTEXT} environment variable, which set the
@ref{176,,thread_inherit_context} flag.

@item 
Add the @code{context} keyword parameter to @ref{177,,Thread}.  It can
be used to explicitly pass a context value to be used by a new thread.

@item 
Make the @code{_contextvars} module built-in.
@end itemize

@item 
gh-123539@footnote{https://github.com/python/cpython/issues/123539}: Improve @ref{18f,,SyntaxError} message for using @code{import ... as}
and @code{from ... import ... as} with not a name.

@item 
gh-102567@footnote{https://github.com/python/cpython/issues/102567}: @ref{170,,-X importtime} now accepts value @code{2}, which
indicates that an @code{importtime} entry should also be printed if an
imported module has already been loaded. Patch by Noah Kim and Adam
Turner.

@item 
gh-116436@footnote{https://github.com/python/cpython/issues/116436}: Improve error message when @ref{199,,TypeError} occurs during
@ref{1671,,dict.update()}

@item 
gh-103997@footnote{https://github.com/python/cpython/issues/103997}: String arguments passed to “-c” are now automatically dedented
as if by @ref{1aa,,textwrap.dedent()}. This allows “python -c” invocations to
be indented in shell scripts without causing indentation errors. (Patch by
Jon Crall and Steven Sun)
@end itemize

@node Library<31>,C API<11>,Core and Builtins<28>,Python 3 14 0 beta 1
@anchor{whatsnew/changelog id136}@anchor{18b2}
@subsubsection Library



@itemize -

@item 
gh-89562@footnote{https://github.com/python/cpython/issues/89562}: Remove @code{hostflags} member from @code{PySSLContext} struct.
@end itemize

@node C API<11>,Build<12>,Library<31>,Python 3 14 0 beta 1
@anchor{whatsnew/changelog id137}@anchor{18b3}
@subsubsection C API



@itemize -

@item 
gh-133166@footnote{https://github.com/python/cpython/issues/133166}: Fix regression where @ref{635,,PyType_GetModuleByDef()} returns
NULL without setting @ref{199,,TypeError} when a static type is passed.

@item 
gh-133164@footnote{https://github.com/python/cpython/issues/133164}: Add @ref{3c5,,PyUnstable_Object_IsUniqueReferencedTemporary()}
function for determining if an object exists as a unique temporary
variable on the interpreter’s stack.  This is a replacement for some cases
where checking that @ref{2d1,,Py_REFCNT()} is one is no longer sufficient to
determine if it’s safe to modify a Python object in-place with no visible
side effects.

@item 
gh-133140@footnote{https://github.com/python/cpython/issues/133140}: Add @ref{3c4,,PyUnstable_Object_IsUniquelyReferenced()} as a
replacement for @code{Py_REFNCT(op) == 1} on @ref{1f6,,free threaded} builds of Python.

@item 
gh-131747@footnote{https://github.com/python/cpython/issues/131747}: On non-Windows platforms, deprecate using
@ref{319,,ctypes.Structure._pack_} to use a Windows-compatible layout on
non-Windows platforms. The layout should be specified explicitly by
setting @ref{1e9,,ctypes.Structure._layout_} to @code{'ms'}.

@item 
gh-128972@footnote{https://github.com/python/cpython/issues/128972}: For non-free-threaded builds, the memory layout of
@ref{1381,,PyASCIIObject} is reverted to match Python 3.13. (Note that the
structure is not part of stable ABI and so its memory layout is
`guaranteed' to remain stable.)

@item 
gh-133079@footnote{https://github.com/python/cpython/issues/133079}: The undocumented APIs @code{Py_C_RECURSION_LIMIT} and
@code{PyThreadState.c_recursion_remaining}, added in 3.13, are
removed without a deprecation period.

@item 
gh-132987@footnote{https://github.com/python/cpython/issues/132987}: The @code{k} and @code{K} formats in @ref{1858,,PyArg_Parse()} now
support the @ref{19f,,__index__()} special method, like all other
integer formats.

@item 
gh-132909@footnote{https://github.com/python/cpython/issues/132909}: Fix an overflow when handling the @ref{18b4,,K} format in @ref{3c0,,Py_BuildValue()}. Patch by
Bénédikt Tran.

@item 
gh-132798@footnote{https://github.com/python/cpython/issues/132798}: Deprecated and undocumented functions
@code{PyUnicode_AsEncodedObject()},
@code{PyUnicode_AsDecodedObject()},
@code{PyUnicode_AsEncodedUnicode()} and
@code{PyUnicode_AsDecodedUnicode()} are scheduled for removal in 3.15.

@item 
gh-132470@footnote{https://github.com/python/cpython/issues/132470}: Creating a @ref{1ea,,ctypes.CField} with a `byte_size' that does
not match the actual type size now raises a @ref{2ee,,ValueError} instead of
crashing the interpreter.

@item 
gh-112068@footnote{https://github.com/python/cpython/issues/112068}: [Reverted in gh-136991@footnote{https://github.com/python/cpython/issues/136991}] Add support of nullable arguments in
@ref{1858,,PyArg_Parse()} and similar functions. Adding @code{?} after any format
unit makes @code{None} be accepted as a value.

@item 
gh-50333@footnote{https://github.com/python/cpython/issues/50333}: Non-tuple sequences are deprecated as argument for the
@code{(items)} format unit in @ref{3bf,,PyArg_ParseTuple()} and other
@ref{3d3,,argument parsing} functions if `items' contains format
units which store a @ref{3d4,,borrowed buffer} or a
@ref{3d5,,borrowed reference}.
@end itemize

@node Build<12>,,C API<11>,Python 3 14 0 beta 1
@anchor{whatsnew/changelog id138}@anchor{18b5}
@subsubsection Build



@itemize -

@item 
gh-113464@footnote{https://github.com/python/cpython/issues/113464}: Use the cpython-bin-deps “externals” repository for Windows
LLVM dependency management. Installing LLVM manually is no longer
necessary for Windows JIT builds.

@item 
gh-133183@footnote{https://github.com/python/cpython/issues/133183}: iOS compiler shims now include @code{IPHONEOS_DEPLOYMENT_TARGET}
in target triples, ensuring that SDK version minimums are honored.

@item 
gh-133167@footnote{https://github.com/python/cpython/issues/133167}: Fix compilation process with @code{--enable-optimizations} and
@code{--without-docstrings}.

@item 
gh-133171@footnote{https://github.com/python/cpython/issues/133171}: Since free-threaded builds do not support the experimental JIT
compiler, prevent these configurations from being combined.

@item 
gh-132758@footnote{https://github.com/python/cpython/issues/132758}: Fix building with tail call interpreter and pystats.

@item 
gh-132649@footnote{https://github.com/python/cpython/issues/132649}: The @code{PClayout} script now allows passing
@code{--include-tcltk} on Windows ARM64.

@item 
gh-132257@footnote{https://github.com/python/cpython/issues/132257}: Change the default LTO flags on GCC to not pass
@code{-flto-partition=none}, and allow parallelization of LTO. For newer GNU
makes and GCC, this has a multiple factor speedup for LTO build times,
with no noticeable loss in performance.

@item 
gh-132026@footnote{https://github.com/python/cpython/issues/132026}: Fix use of undefined identifiers in platform triplet detection
on MIPS Linux platforms.
@end itemize

@node Python 3 14 0 alpha 7,Python 3 14 0 alpha 6,Python 3 14 0 beta 1,Changelog
@anchor{whatsnew/changelog python-3-14-0-alpha-7}@anchor{18b6}
@subsection Python 3.14.0 alpha 7


`Release date: 2025-04-08'

@menu
* macOS: macOS<7>. 
* Windows: Windows<12>. 
* Tools/Demos: Tools/Demos<9>. 
* Tests: Tests<11>. 
* Security: Security<15>. 
* Library: Library<32>. 
* Documentation: Documentation<12>. 
* Core and Builtins: Core and Builtins<29>. 
* Library: Library<33>. 
* Core and Builtins: Core and Builtins<30>. 
* C API: C API<12>. 
* Build: Build<13>. 

@end menu

@node macOS<7>,Windows<12>,,Python 3 14 0 alpha 7
@anchor{whatsnew/changelog id139}@anchor{18b7}
@subsubsection macOS



@itemize -

@item 
gh-124111@footnote{https://github.com/python/cpython/issues/124111}: Update macOS installer to use Tcl/Tk 8.6.16.

@item 
gh-131423@footnote{https://github.com/python/cpython/issues/131423}: Update macOS installer to use OpenSSL 3.0.16. Patch by Bénédikt
Tran.

@item 
gh-131025@footnote{https://github.com/python/cpython/issues/131025}: Update macOS installer to ship with SQLite 3.49.1.
@end itemize

@node Windows<12>,Tools/Demos<9>,macOS<7>,Python 3 14 0 alpha 7
@anchor{whatsnew/changelog id140}@anchor{18b8}
@subsubsection Windows



@itemize -

@item 
gh-131423@footnote{https://github.com/python/cpython/issues/131423}: Update bundled version of OpenSSL to 3.0.16. The new build also
disables uplink support, which may be relevant to embedders but has no
impact on normal use.

@item 
gh-131453@footnote{https://github.com/python/cpython/issues/131453}: Some @code{SND_*} and @code{MB_*} constants are added to
@ref{11e,,winsound}.

@item 
gh-91349@footnote{https://github.com/python/cpython/issues/91349}: Replaces our copy of @code{zlib} with @code{zlib-ng}, for performance
improvements in @ref{13a,,zlib}.

@item 
gh-131025@footnote{https://github.com/python/cpython/issues/131025}: Update Windows installer to ship with SQLite 3.49.1.
@end itemize

@node Tools/Demos<9>,Tests<11>,Windows<12>,Python 3 14 0 alpha 7
@anchor{whatsnew/changelog id141}@anchor{18b9}
@subsubsection Tools/Demos



@itemize -

@item 
gh-132121@footnote{https://github.com/python/cpython/issues/132121}: Always escape non-printable Unicode characters in
@code{pygettext}.

@item 
gh-131852@footnote{https://github.com/python/cpython/issues/131852}: @code{msgfmt} no longer adds the @code{POT-Creation-Date} to
generated @code{.mo} files for consistency with GNU @code{msgfmt}.
@end itemize

@node Tests<11>,Security<15>,Tools/Demos<9>,Python 3 14 0 alpha 7
@anchor{whatsnew/changelog id142}@anchor{18ba}
@subsubsection Tests



@itemize -

@item 
gh-131277@footnote{https://github.com/python/cpython/issues/131277}: Allow to unset one or more environment variables at once via
@ref{18bb,,EnvironmentVarGuard.unset()}. Patch by Bénédikt
Tran.

@item 
gh-131050@footnote{https://github.com/python/cpython/issues/131050}: @code{test_ssl.test_dh_params} is skipped if the underlying TLS
library does not support finite-field ephemeral Diffie-Hellman.
@end itemize

@node Security<15>,Library<32>,Tests<11>,Python 3 14 0 alpha 7
@anchor{whatsnew/changelog id143}@anchor{18bc}
@subsubsection Security



@itemize -

@item 
gh-131809@footnote{https://github.com/python/cpython/issues/131809}: Update bundled libexpat to 2.7.1

@item 
gh-131261@footnote{https://github.com/python/cpython/issues/131261}: Upgrade to libexpat 2.7.0

@item 
gh-121284@footnote{https://github.com/python/cpython/issues/121284}: Fix bug in the folding of rfc2047 encoded-words when flattening
an email message using a modern email policy. Previously when an
encoded-word was too long for a line, it would be decoded, split across
lines, and re-encoded. But commas and other special characters in the
original text could be left unencoded and unquoted. This could
theoretically be used to spoof header lines using a carefully constructed
encoded-word if the resulting rendered email was transmitted or re-parsed.
@end itemize

@node Library<32>,Documentation<12>,Security<15>,Python 3 14 0 alpha 7
@anchor{whatsnew/changelog id144}@anchor{18bd}
@subsubsection Library



@itemize -

@item 
gh-132174@footnote{https://github.com/python/cpython/issues/132174}: Fix function name in error message of
@code{_interpreters.run_string}.

@item 
gh-132171@footnote{https://github.com/python/cpython/issues/132171}: Fix crash of @code{_interpreters.run_string} on string subclasses.

@item 
gh-129204@footnote{https://github.com/python/cpython/issues/129204}: Introduce new @code{_PYTHON_SUBPROCESS_USE_POSIX_SPAWN}
environment variable knob in @ref{dc,,subprocess} to control the use of
@ref{52f,,os.posix_spawn()}.

@item 
gh-132159@footnote{https://github.com/python/cpython/issues/132159}: Do not shadow user arguments in generated @code{__new__()} by
decorator @ref{48a,,warnings.deprecated}. Patch by Xuehai Pan.

@item 
gh-132168@footnote{https://github.com/python/cpython/issues/132168}: The @ref{1f5,,ctypes.py_object} type now supports subscription,
making it a @ref{1a2,,generic type}.

@item 
gh-84481@footnote{https://github.com/python/cpython/issues/84481}: Add the @code{zipfile.ZipFile.data_offset} attribute, which
stores the offset to the beginning of ZIP data in a file when available.
When the @ref{8d5,,zipfile.ZipFile} is opened in either mode @code{'w'} or
@code{'x'} and the underlying file does not support @code{tell()}, the value
will be @code{None} instead.

@item 
gh-132075@footnote{https://github.com/python/cpython/issues/132075}: Fix possible use of @ref{d1,,socket} address structures with
uninitialized members. Now all structure members are initialized with
zeroes by default.

@item 
gh-118761@footnote{https://github.com/python/cpython/issues/118761}: Improve import times by up to 27x for the @ref{d8,,string} module.
Patch by Adam Turner.

@item 
gh-125434@footnote{https://github.com/python/cpython/issues/125434}: Display thread name in @ref{5c,,faulthandler}. Patch by Victor
Stinner.

@item 
gh-132002@footnote{https://github.com/python/cpython/issues/132002}: Fix crash when deallocating @ref{18be,,contextvars.ContextVar}
with weird unahashable string names.

@item 
gh-131938@footnote{https://github.com/python/cpython/issues/131938}: @ref{12c,,xml.etree.ElementTree}: update the error message when an
element to remove via @ref{18bf,,Element.remove} is not found. Patch by Bénédikt
Tran.

@item 
gh-115942@footnote{https://github.com/python/cpython/issues/115942}: Add @ref{1885,,threading.RLock.locked()},
@ref{18c0,,multiprocessing.Lock.locked()}, @ref{18c1,,multiprocessing.RLock.locked()},
and allow @ref{15a3,,multiprocessing.managers.SyncManager.Lock()} and
@ref{15a4,,multiprocessing.managers.SyncManager.RLock()} to proxy @code{locked()}
call.

@item 
gh-131974@footnote{https://github.com/python/cpython/issues/131974}: Fix several thread-safety issues in @ref{2e,,ctypes} on the
@ref{1f6,,free threaded} build.

@item 
gh-118761@footnote{https://github.com/python/cpython/issues/118761}: Improve the import time of the @ref{9,,ast} module by extracting
the @ref{ae8,,unparse()} function to a helper module.

@item 
gh-107369@footnote{https://github.com/python/cpython/issues/107369}: Improved performance of @ref{57d,,textwrap.indent()} by an average
of ~1.3x. Patch by Adam Turner.

@item 
gh-131792@footnote{https://github.com/python/cpython/issues/131792}: Improved performance of @ref{1aa,,textwrap.dedent()} by an average
of ~2.4x, (with improvements of up to 4x for large inputs), and fixed a
bug where blank lines with whitespace characters other than space or
horizontal tab were not normalised to the newline. Patch by Adam Turner,
Marius Juston, and Pieter Eendebak.

@item 
gh-131668@footnote{https://github.com/python/cpython/issues/131668}: @ref{d1,,socket}: Fix code parsing AF_BLUETOOTH socket addresses.

@item 
gh-60115@footnote{https://github.com/python/cpython/issues/60115}: Support frozen modules for @ref{242,,linecache.getline()}.

@item 
gh-131492@footnote{https://github.com/python/cpython/issues/131492}: Fix a resource leak when constructing a @ref{65c,,gzip.GzipFile}
with a filename fails, for example when passing an invalid
@code{compresslevel}.

@item 
gh-131435@footnote{https://github.com/python/cpython/issues/131435}: 10-20% performance improvement of @ref{143b,,random.randint()}.

@item 
gh-131461@footnote{https://github.com/python/cpython/issues/131461}: Fix @ref{54d,,ResourceWarning} when constructing a
@ref{65c,,gzip.GzipFile} in write mode with a broken file object.

@item 
gh-125866@footnote{https://github.com/python/cpython/issues/125866}: Deprecate the @code{nturl2path} module. Call
@ref{2bf,,urllib.request.url2pathname()} and
@ref{2c1,,pathname2url()} instead.

@item 
gh-126367@footnote{https://github.com/python/cpython/issues/126367}: Fix issue where @ref{2bf,,urllib.request.url2pathname()} raised
@ref{2c2,,OSError} when given a Windows URI containing a colon character not
following a drive letter, such as before an NTFS alternate data stream.

@item 
gh-120144@footnote{https://github.com/python/cpython/issues/120144}: Disable @code{CALL} event in @ref{10,,bdb} in @code{monitoring} backend
when we don’t need any new events on the code object to get a better
performance.

@item 
gh-131358@footnote{https://github.com/python/cpython/issues/131358}: Register @code{cseuckr} as an encoding alias for @code{euc_kr}.

@item 
gh-131325@footnote{https://github.com/python/cpython/issues/131325}: Fix sendfile fallback implementation to drain data after
writing to transport in @ref{b,,asyncio}.

@item 
gh-90548@footnote{https://github.com/python/cpython/issues/90548}: @ref{183f,,platform.libc_ver()} can now detect and report the version
of @code{musl} on Alpine Linux.

@item 
gh-129843@footnote{https://github.com/python/cpython/issues/129843}: Fix incorrect argument passing in
@ref{f03,,warnings.warn_explicit()}.

@item 
gh-70647@footnote{https://github.com/python/cpython/issues/70647}: When creating a @ref{34,,datetime} object with an out of range date
a more informative error is raised.

@item 
gh-130914@footnote{https://github.com/python/cpython/issues/130914}: Allow @ref{221,,graphlib.TopologicalSorter.prepare()} to be called
more than once as long as sorting has not started. Patch by Daniel Pope.

@item 
gh-131236@footnote{https://github.com/python/cpython/issues/131236}: Allow to generate multiple UUIDs at once via @ref{2c9,,python -m uuid --count}.

@item 
gh-126895@footnote{https://github.com/python/cpython/issues/126895}: Fix @ref{bf,,readline} in @ref{1f6,,free-threaded}
build.

@item 
gh-121468@footnote{https://github.com/python/cpython/issues/121468}: @code{$_asynctask} is added as a @ref{aa,,pdb} convenience variable
to access the current asyncio task if applicable.

@item 
gh-118761@footnote{https://github.com/python/cpython/issues/118761}: Improve import time of @ref{8a,,locale} using lazy import @code{re}.
Patch by Semyon Moroz.

@item 
gh-129598@footnote{https://github.com/python/cpython/issues/129598}: Fix @ref{ae8,,ast.unparse()} when @ref{18c2,,ast.Interactive} contains
multiple statements.

@item 
gh-85162@footnote{https://github.com/python/cpython/issues/85162}: The @ref{76,,http.server} module now includes built-in support for
HTTPS servers exposed by @ref{22a,,http.server.HTTPSServer}. This
functionality is exposed by the command-line interface (@code{python -m
http.server}) through the @code{--tls-cert}, @code{--tls-key} and
@code{--tls-password-file} options. Patch by Semyon Moroz.

@item 
gh-129463@footnote{https://github.com/python/cpython/issues/129463}: The implementations of equality and hashing for
@ref{17c9,,annotationlib.ForwardRef} now use all attributes on the object.
Two @code{ForwardRef} objects are equal only if all attributes are
equal.

@item 
gh-128593@footnote{https://github.com/python/cpython/issues/128593}: @ref{17c9,,annotationlib.ForwardRef} objects no longer cache their
value when they are successfully evaluated. Successive calls to
@ref{1803,,annotationlib.ForwardRef.evaluate()} may return different values.

@item 
gh-117779@footnote{https://github.com/python/cpython/issues/117779}: Fix reading duplicated entries in @ref{138,,zipfile} by name.
Reading duplicated entries (except the last one) by @code{ZipInfo} now emits
a warning instead of raising an exception.

@item 
gh-128715@footnote{https://github.com/python/cpython/issues/128715}: The class of @ref{1e7,,Structure}/@ref{1e8,,Union}
field descriptors is now available as @ref{1ea,,CField}, and has new
attributes to aid debugging and introspection.

@item 
gh-128055@footnote{https://github.com/python/cpython/issues/128055}: Fix @code{test.test_sysconfig.test_sysconfigdata_json} when
running outside the build directory (eg. after installing).

@item 
gh-126037@footnote{https://github.com/python/cpython/issues/126037}: @ref{12c,,xml.etree.ElementTree}: Fix a crash in
@ref{18c3,,Element.find},
@ref{1799,,Element.findtext} and
@ref{18c4,,Element.findall} when the
tag to find implements an @ref{cf8,,__eq__()} method mutating the
element being queried. Patch by Bénédikt Tran.

@item 
gh-127794@footnote{https://github.com/python/cpython/issues/127794}: When headers are added to @ref{581,,email.message.Message}
objects, either through @ref{18c5,,email.message.Message.__setitem__()} or
@ref{18c6,,email.message.Message.add_header()}, the field name is now validated
according to 
@geindex RFC; RFC 5322 Section 2.2
RFC 5322@comma{} Section 2.2@footnote{https://datatracker.ietf.org/doc/html/rfc5322.html#section-2.2} and a
@ref{2ee,,ValueError} is raised if the field name contains any invalid
characters.

@item 
gh-123599@footnote{https://github.com/python/cpython/issues/123599}: Deprecate @code{pathlib.PurePath.as_uri()}; use
@ref{31e,,pathlib.Path.as_uri()} instead.

@item 
gh-126033@footnote{https://github.com/python/cpython/issues/126033}: @ref{12c,,xml.etree.ElementTree}: Fix a crash in
@ref{18bf,,Element.remove} when the
element is concurrently mutated. Patch by Bénédikt Tran.

@item 
gh-120144@footnote{https://github.com/python/cpython/issues/120144}: Add the optional backend of @code{sys.monitoring} to @ref{10,,bdb}
and use it for @ref{aa,,pdb}.

@item 
gh-74598@footnote{https://github.com/python/cpython/issues/74598}: Add @ref{213,,fnmatch.filterfalse()} for excluding names matching a
pattern. Patch by Bénédikt Tran.

@item 
gh-114917@footnote{https://github.com/python/cpython/issues/114917}: Add support for AI_NUMERICSERV in getaddrinfo emulation

@item 
bpo-17254@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17254}: Added aliases for Thai Language using Microsoft Code Pages.
@end itemize

@node Documentation<12>,Core and Builtins<29>,Library<32>,Python 3 14 0 alpha 7
@anchor{whatsnew/changelog id145}@anchor{18c7}
@subsubsection Documentation



@itemize -

@item 
gh-131417@footnote{https://github.com/python/cpython/issues/131417}: Mention @ref{dcc,,asyncio.Future} and @ref{1c9,,asyncio.Task} in
generic classes list.
@end itemize

@node Core and Builtins<29>,Library<33>,Documentation<12>,Python 3 14 0 alpha 7
@anchor{whatsnew/changelog id146}@anchor{18c8}
@subsubsection Core and Builtins



@itemize -

@item 
gh-131798@footnote{https://github.com/python/cpython/issues/131798}: Allow the JIT to remove an extra @code{_TO_BOOL_BOOL} instruction
after @code{_CONTAINS_OP_SET} by setting the return type to bool.

@item 
gh-132011@footnote{https://github.com/python/cpython/issues/132011}: Fix crash when calling @ref{8de,,list.append()} as an unbound
method.

@item 
gh-131998@footnote{https://github.com/python/cpython/issues/131998}: Fix a crash when using an unbound method @ref{18c9,,descriptor}
object in a function where a bound method descriptor was used.

@item 
gh-131591@footnote{https://github.com/python/cpython/issues/131591}: Implement 
@geindex Python Enhancement Proposals; PEP 768
PEP 768@footnote{https://peps.python.org/pep-0768/} (Safe external debugger interface for
CPython). Add a new @ref{16e,,sys.remote_exec()} function to the @ref{df,,sys}
module. This function schedules the execution of a Python file in a
separate process. Patch by Pablo Galindo, Matt Wozniski and Ivona
Stojanovic.

@item 
gh-131798@footnote{https://github.com/python/cpython/issues/131798}: Allow JIT to omit str guard in truthiness test when str type is
known.

@item 
gh-131833@footnote{https://github.com/python/cpython/issues/131833}: Add support for optionally dropping grouping parentheses when
using multiple exception types as per 
@geindex Python Enhancement Proposals; PEP 758
PEP 758@footnote{https://peps.python.org/pep-0758/}. Patch by Pablo Galindo

@item 
gh-130924@footnote{https://github.com/python/cpython/issues/130924}: Usage of a name in a function-scope annotation no longer
triggers creation of a cell for that variable. This fixes a regression in
earlier alphas of Python 3.14.

@item 
gh-131800@footnote{https://github.com/python/cpython/issues/131800}: Improve the experimental JIT’s ability to remove type checks
for certain subscripting operations.

@item 
gh-131738@footnote{https://github.com/python/cpython/issues/131738}: Compiler emits optimized code for builtin any/all/tuple calls
over a generator expression.

@item 
gh-131719@footnote{https://github.com/python/cpython/issues/131719}: Fix missing NULL check in @code{_PyMem_FreeDelayed} in
@ref{1f6,,free-threaded} build.

@item 
gh-131670@footnote{https://github.com/python/cpython/issues/131670}: Fix @ref{9dc,,anext()} failing on sync @ref{18ca,,__anext__()}
raising an exception.

@item 
gh-131666@footnote{https://github.com/python/cpython/issues/131666}: Fix signature of @code{anext_awaitable.close} objects. Patch by
Bénédikt Tran.

@item 
gh-130415@footnote{https://github.com/python/cpython/issues/130415}: Optimize comparison of two constants in JIT builds

@item 
gh-129149@footnote{https://github.com/python/cpython/issues/129149}: Add fast path for small and medium-size integers in
@ref{3a1,,PyLong_FromInt32()}, @ref{3a3,,PyLong_FromUInt32()},
@ref{3a2,,PyLong_FromInt64()} and @ref{3a4,,PyLong_FromUInt64()}. Patch by Chris
Eibl.

@item 
gh-130887@footnote{https://github.com/python/cpython/issues/130887}: Optimize the AArch64 code generation for the JIT. Patch by
Diego Russo

@item 
gh-130956@footnote{https://github.com/python/cpython/issues/130956}: Optimize the AArch64 code generation for the JIT. Patch by
Diego Russo

@item 
gh-130928@footnote{https://github.com/python/cpython/issues/130928}: Fix error message when formatting bytes using the @code{'i'} flag.
Patch by Maxim Ageev.

@item 
gh-130935@footnote{https://github.com/python/cpython/issues/130935}: Annotations at the class and module level that are
conditionally defined are now only reflected in @code{__annotations__} if the
block they are in is executed. Patch by Jelle Zijlstra.

@item 
gh-130775@footnote{https://github.com/python/cpython/issues/130775}: Do not crash on negative @code{column} and @code{end_column} in
@ref{9,,ast} locations.

@item 
gh-130704@footnote{https://github.com/python/cpython/issues/130704}: Optimize @code{LOAD_FAST} and its superinstruction form to reduce
reference counting overhead. These instructions are replaced with faster
variants that load borrowed references onto the operand stack when we can
prove that the reference in the frame outlives the reference loaded onto
the stack.

@item 
gh-88887@footnote{https://github.com/python/cpython/issues/88887}: Fixing multiprocessing Resource Tracker process leaking, usually
observed when running Python as PID 1.

@item 
gh-130115@footnote{https://github.com/python/cpython/issues/130115}: Fix an issue with thread identifiers being sign-extended on
some platforms.
@end itemize

@node Library<33>,Core and Builtins<30>,Core and Builtins<29>,Python 3 14 0 alpha 7
@anchor{whatsnew/changelog id147}@anchor{18cb}
@subsubsection Library



@itemize -

@item 
gh-99108@footnote{https://github.com/python/cpython/issues/99108}: Add support for built-in implementation of HMAC (
@geindex RFC; RFC 2104
RFC 2104@footnote{https://datatracker.ietf.org/doc/html/rfc2104.html})
based on HACL*. Patch by Bénédikt Tran.
@end itemize

@node Core and Builtins<30>,C API<12>,Library<33>,Python 3 14 0 alpha 7
@anchor{whatsnew/changelog id148}@anchor{18cc}
@subsubsection Core and Builtins



@itemize -

@item 
gh-130080@footnote{https://github.com/python/cpython/issues/130080}: Implement PEP 765: Disallow return/break/continue that exit a
finally block.

@item 
gh-129900@footnote{https://github.com/python/cpython/issues/129900}: Fix return codes inside @ref{f42,,SystemExit} not getting returned
by the REPL.

@item 
gh-128632@footnote{https://github.com/python/cpython/issues/128632}: Disallow @code{__classdict__} as the name of a type parameter.
Using this name would previously crash the interpreter in some
circumstances.

@item 
gh-126703@footnote{https://github.com/python/cpython/issues/126703}: Improve performance of builtin methods by using a freelist.

@item 
gh-126703@footnote{https://github.com/python/cpython/issues/126703}: Improve performance of  @ref{b43,,range} by using a freelist.
@end itemize

@node C API<12>,Build<13>,Core and Builtins<30>,Python 3 14 0 alpha 7
@anchor{whatsnew/changelog id149}@anchor{18cd}
@subsubsection C API



@itemize -

@item 
gh-131740@footnote{https://github.com/python/cpython/issues/131740}: Update PyUnstable_GC_VisitObjects to traverse perm gen.

@item 
gh-131525@footnote{https://github.com/python/cpython/issues/131525}: The PyTupleObject now caches the computed hash value in the new
field ob_hash.
@end itemize

@node Build<13>,,C API<12>,Python 3 14 0 alpha 7
@anchor{whatsnew/changelog id150}@anchor{18ce}
@subsubsection Build



@itemize -

@item 
gh-131865@footnote{https://github.com/python/cpython/issues/131865}: The DTrace build now properly passes the @code{CC} and @code{CFLAGS}
variables to the @code{dtrace} command when utilizing SystemTap on Linux.

@item 
gh-131675@footnote{https://github.com/python/cpython/issues/131675}: Fix mimalloc library builds for 32-bit ARM targets.

@item 
gh-131691@footnote{https://github.com/python/cpython/issues/131691}: clang-cl on Windows needs option @code{/EHa} to support SEH
(structured exception handling) correctly. Fix by Chris Eibl.

@item 
gh-131278@footnote{https://github.com/python/cpython/issues/131278}: Add optimizing flag @code{WITH_COMPUTED_GOTOS} to Windows builds
for when using a compiler that supports it (currently clang-cl). Patch by
Chris Eibl.

@item 
gh-130213@footnote{https://github.com/python/cpython/issues/130213}: Update the vendored HACL* library to fix build issues with
older clang compilers.

@item 
gh-130673@footnote{https://github.com/python/cpython/issues/130673}: Fix potential @code{KeyError} when handling object sections during
JIT building process.
@end itemize

@node Python 3 14 0 alpha 6,Python 3 14 0 alpha 5,Python 3 14 0 alpha 7,Changelog
@anchor{whatsnew/changelog python-3-14-0-alpha-6}@anchor{18cf}
@subsection Python 3.14.0 alpha 6


`Release date: 2025-03-14'

@menu
* macOS: macOS<8>. 
* Windows: Windows<13>. 
* Tools/Demos: Tools/Demos<10>. 
* Tests: Tests<12>. 
* Security: Security<16>. 
* Library: Library<34>. 
* Documentation: Documentation<13>. 
* Core and Builtins: Core and Builtins<31>. 
* Library: Library<35>. 
* Core and Builtins: Core and Builtins<32>. 
* Library: Library<36>. 
* Core and Builtins: Core and Builtins<33>. 
* C API: C API<13>. 
* Build: Build<14>. 

@end menu

@node macOS<8>,Windows<13>,,Python 3 14 0 alpha 6
@anchor{whatsnew/changelog id151}@anchor{18d0}
@subsubsection macOS



@itemize -

@item 
gh-128540@footnote{https://github.com/python/cpython/issues/128540}: Ensure web browser is launched by @ref{17a6,,webbrowser.open()} on
macOS, even for @code{file://} URLs.
@end itemize

@node Windows<13>,Tools/Demos<10>,macOS<8>,Python 3 14 0 alpha 6
@anchor{whatsnew/changelog id152}@anchor{18d1}
@subsubsection Windows



@itemize -

@item 
gh-131020@footnote{https://github.com/python/cpython/issues/131020}: pylauncher@footnote{https://github.com/python/cpython/tree/3.14/PC/launcher2.c} correctly detects a BOM
when searching for the shebang. Fix by Chris Eibl.
@end itemize

@node Tools/Demos<10>,Tests<12>,Windows<13>,Python 3 14 0 alpha 6
@anchor{whatsnew/changelog id153}@anchor{18d2}
@subsubsection Tools/Demos



@itemize -

@item 
gh-130453@footnote{https://github.com/python/cpython/issues/130453}: Make it possible to override default keywords in
@code{pygettext}.

@item 
gh-85012@footnote{https://github.com/python/cpython/issues/85012}: Correctly reset @code{msgctxt} when compiling messages in
@code{msgfmt}.

@item 
gh-130453@footnote{https://github.com/python/cpython/issues/130453}: Extend support for specifying custom keywords in
@code{pygettext}.

@item 
gh-130195@footnote{https://github.com/python/cpython/issues/130195}: Add warning messages when @code{pygettext} unimplemented
@code{-a/--extract-all} option is called.

@item 
gh-130057@footnote{https://github.com/python/cpython/issues/130057}: Add support for translator comments in @code{pygettext.py}.

@item 
gh-130025@footnote{https://github.com/python/cpython/issues/130025}: The iOS testbed now correctly handles symlinks used as Python
framework references.

@item 
gh-129911@footnote{https://github.com/python/cpython/issues/129911}: Fix the keyword entry in the help output of
@code{pygettext}.
@end itemize

@node Tests<12>,Security<16>,Tools/Demos<10>,Python 3 14 0 alpha 6
@anchor{whatsnew/changelog id154}@anchor{18d3}
@subsubsection Tests



@itemize -

@item 
gh-129200@footnote{https://github.com/python/cpython/issues/129200}: Multiple iOS testbed runners can now be started at the same
time without introducing an ambiguity over simulator ownership.

@item 
gh-130292@footnote{https://github.com/python/cpython/issues/130292}: The iOS testbed will now run successfully on a machine that has
not previously run Xcode tests (such as CI configurations).

@item 
gh-130293@footnote{https://github.com/python/cpython/issues/130293}: The tests of terminal colorization are no longer sensitive to
the value of the @code{TERM} variable in the testing environment.

@item 
gh-129401@footnote{https://github.com/python/cpython/issues/129401}: Fix a flaky test in @code{test_repr_rlock} that checks the
representation of @ref{189d,,multiprocessing.RLock}.

@item 
gh-126332@footnote{https://github.com/python/cpython/issues/126332}: Add unit tests for pyrepl.
@end itemize

@node Security<16>,Library<34>,Tests<12>,Python 3 14 0 alpha 6
@anchor{whatsnew/changelog id155}@anchor{18d4}
@subsubsection Security



@itemize -

@item 
gh-127371@footnote{https://github.com/python/cpython/issues/127371}: Avoid unbounded buffering for
@code{tempfile.SpooledTemporaryFile.writelines()}. Previously, disk
spillover was only checked after the lines iterator had been exhausted.
This is now done after each line is written.
@end itemize

@node Library<34>,Documentation<13>,Security<16>,Python 3 14 0 alpha 6
@anchor{whatsnew/changelog id156}@anchor{18d5}
@subsubsection Library



@itemize -

@item 
gh-131204@footnote{https://github.com/python/cpython/issues/131204}: Use monospace font from System Font Stack for cross-platform
support in @ref{203,,difflib.HtmlDiff}.

@item 
gh-131196@footnote{https://github.com/python/cpython/issues/131196}: Improve performance of @ref{18d6,,uuid.UUID.hex} and
@ref{831,,uuid.UUID.__str__}.

@item 
gh-130940@footnote{https://github.com/python/cpython/issues/130940}: The behavior of @code{PyConfig.use_system_logger} was modified to
be enabled by default on iOS. It remains disabled by default on macOS.

@item 
gh-131123@footnote{https://github.com/python/cpython/issues/131123}: Supported completions for attributes of convenience variables
in @ref{aa,,pdb}.

@item 
gh-93096@footnote{https://github.com/python/cpython/issues/93096}: Removed undocumented CLI @code{python -m difflib}. Use @code{python -m
doctest Lib/difflib.py -v} instead. Patch by Semyon Moroz.

@item 
gh-93096@footnote{https://github.com/python/cpython/issues/93096}: Removed undocumented @code{-t} and @code{-v} arguments of @code{python -m
pickle}. Use @code{python -m doctest Lib/pickle.py -v} instead. Patch by
Semyon Moroz.

@item 
gh-81267@footnote{https://github.com/python/cpython/issues/81267}: Correct @ref{8ae,,time.sleep()} error message when an object that
cannot be interpreted as an integer or float is provided.

@item 
gh-93096@footnote{https://github.com/python/cpython/issues/93096}: Removed undocumented @code{-t} and @code{-v} arguments of @code{python -m
pickletools}. Use @code{python -m doctest Lib/pickletools.py -v} instead.
Patch by Semyon Moroz.

@item 
gh-131045@footnote{https://github.com/python/cpython/issues/131045}: Fix issue with @code{__contains__}, values, and pseudo-members for
@ref{836,,enum.Flag}.

@item 
gh-130959@footnote{https://github.com/python/cpython/issues/130959}: Fix pure-Python implementation of
@ref{82a,,datetime.time.fromisoformat()} to reject times with spaces in
fractional part (for example, @code{12:34:56.400 +02:00}), matching the C
implementation. Patch by Michał Gorny.

@item 
gh-130806@footnote{https://github.com/python/cpython/issues/130806}: Deleting @ref{65c,,gzip.GzipFile} before it is closed now emits a
@ref{54d,,ResourceWarning}.

@item 
gh-130637@footnote{https://github.com/python/cpython/issues/130637}: Add validation for numeric response data in poplib.POP3.stat()
method

@item 
gh-130665@footnote{https://github.com/python/cpython/issues/130665}: Only apply locale to @ref{1d2,,calendar CLI} when
set via @code{--locale} and not via @code{LANG} environment variable.

@item 
gh-130660@footnote{https://github.com/python/cpython/issues/130660}: @code{sys.ps1} and @code{sys.ps2} are now restored after
@ref{18d7,,code.interact()} call.

@item 
gh-130608@footnote{https://github.com/python/cpython/issues/130608}: Remove `dirs_exist_ok' argument from @ref{269,,pathlib.Path.copy()}
and @ref{26a,,copy_into()}. These methods are new in Python 3.14.

@item 
gh-130461@footnote{https://github.com/python/cpython/issues/130461}: Remove @code{.. index::} directives from the @ref{117,,uuid} module
documentation. These directives previously created entries in the general
index for @ref{da6,,getnode()} as well as the @ref{da7,,uuid1()},
@ref{2e7,,uuid3()}, @ref{2e9,,uuid4()}, @ref{2e8,,uuid5()}, and
@ref{2c6,,uuid8()} constructor functions.

@item 
gh-130379@footnote{https://github.com/python/cpython/issues/130379}: The zipapp module now calculates the list of files to be added
to the archive before creating the archive. This avoids accidentally
including the target when it is being created in the source directory.

@item 
gh-82987@footnote{https://github.com/python/cpython/issues/82987}: Inline breakpoints like @ref{273,,breakpoint()} or
@ref{274,,pdb.set_trace()} will always stop the program at calling frame,
ignoring the @code{skip} pattern (if any).

@item 
gh-125377@footnote{https://github.com/python/cpython/issues/125377}: @code{<tab>} at the beginning of the line in @ref{aa,,pdb} multi-line
input will fill in a 4-space indentation now, instead of inserting a
@code{\t} character.

@item 
gh-125413@footnote{https://github.com/python/cpython/issues/125413}: Ensure the path returned from @ref{269,,pathlib.Path.copy()} or
@ref{26b,,move()} has fresh @ref{26d,,info}.

@item 
gh-65697@footnote{https://github.com/python/cpython/issues/65697}: stdlib configparser will now attempt to validate that keys it
writes will not result in file corruption (creating a file unable to be
accurately parsed by a future read() call from the same parser).
Attempting a corrupting write() will raise an InvalidWriteError.

@item 
gh-125413@footnote{https://github.com/python/cpython/issues/125413}: Speed up @ref{269,,Path.copy} by making better
use of @ref{26d,,info} internally.

@item 
gh-130285@footnote{https://github.com/python/cpython/issues/130285}: Fix corner case for @ref{952,,random.sample()} allowing the `counts'
parameter to specify an empty population. So now, @code{sample([], 0,
counts=[])} and @code{sample('abc', k=0, counts=[0, 0, 0])} both give the
same result as @code{sample([], 0)}.

@item 
gh-124703@footnote{https://github.com/python/cpython/issues/124703}: Executing @code{quit} command in @ref{aa,,pdb} will raise
@ref{27a,,bdb.BdbQuit} when @code{pdb} is started from an interactive console
using @ref{273,,breakpoint()} or @ref{274,,pdb.set_trace()}.

@item 
gh-107773@footnote{https://github.com/python/cpython/issues/107773}: Make @ref{34,,datetime} subclass @ref{830,,__repr__()}
consistent both implementations. Patch by Semyon Moroz.

@item 
gh-130250@footnote{https://github.com/python/cpython/issues/130250}: Fix regression in @code{traceback.print_last()}.

@item 
gh-123471@footnote{https://github.com/python/cpython/issues/123471}: Make concurrent iterations over @ref{512,,itertools.batched} safe
under free-threading.

@item 
gh-57537@footnote{https://github.com/python/cpython/issues/57537}: Support breakpoints for @ref{139,,zipimport} modules on @ref{aa,,pdb}

@item 
gh-130230@footnote{https://github.com/python/cpython/issues/130230}: Fix crash in @ref{1a5,,pow()} with only @ref{200,,Decimal}
third argument.

@item 
gh-126944@footnote{https://github.com/python/cpython/issues/126944}: Show explicit errors when required arguments of @ref{aa,,pdb}
commands are missing

@item 
gh-127750@footnote{https://github.com/python/cpython/issues/127750}: Improve repr of @ref{be9,,functools.singledispatchmethod} methods
and descriptors.

@item 
gh-128520@footnote{https://github.com/python/cpython/issues/128520}: Apply type conversion consistently in @ref{6ce,,pathlib.PurePath}
and @ref{268,,Path} methods can accept a path object as an
argument, such as @ref{6d4,,match()} and
@ref{18d8,,rename()}. The argument is now converted to path object
if it lacks a @ref{6cf,,with_segments()} attribute, and not
otherwise.

@item 
gh-118761@footnote{https://github.com/python/cpython/issues/118761}: Reverts a change in the previous release attempting to make
some stdlib imports used within the @ref{dc,,subprocess} module lazy as this
was causing errors during @code{__del__} finalizers calling methods such as
@code{terminate}, or @code{kill}, or @code{send_signal}.

@item 
gh-130164@footnote{https://github.com/python/cpython/issues/130164}: Fixed failure to raise @ref{199,,TypeError} in
@ref{18d9,,inspect.Signature.bind()} for positional-only arguments provided by
keyword when a variadic keyword argument (e.g. @code{**kwargs}) is present.

@item 
gh-130151@footnote{https://github.com/python/cpython/issues/130151}: Fix reference leaks in @code{_hashlib.hmac_new()} and
@code{_hashlib.hmac_digest()}. Patch by Bénédikt Tran.

@item 
gh-130145@footnote{https://github.com/python/cpython/issues/130145}: Fix @code{asyncio.AbstractEventloop.run_forever()} when another
loop is already running.

@item 
gh-130139@footnote{https://github.com/python/cpython/issues/130139}: Fix bug where @ref{1c4,,ast.parse()} did not error on AST input
which is not of the correct type, when called with optimize=False.

@item 
gh-127260@footnote{https://github.com/python/cpython/issues/127260}: Forbid the use of colon (“:”) as a fractional component
separator and other improvements to the consistency of error raising
between the C and Python implementations of
@ref{82a,,datetime.time.fromisoformat()} and
@ref{82b,,datetime.datetime.fromisoformat()}. Patch by Semyon Moroz.

@item 
gh-85795@footnote{https://github.com/python/cpython/issues/85795}: Using @ref{1a7,,super()} and @code{__class__} @ref{18da,,closure variable}
in user-defined methods of @ref{32f,,typing.NamedTuple} subclasses is now
explicitly prohibited at runtime. Contributed by Bartosz Sławecki in
gh-130082@footnote{https://github.com/python/cpython/issues/130082}.

@item 
gh-118761@footnote{https://github.com/python/cpython/issues/118761}: Improve import time of @ref{1a,,cmd} by lazy importing
@ref{82,,inspect} and removing @ref{d8,,string}. Patch by Semyon Moroz.

@item 
gh-129726@footnote{https://github.com/python/cpython/issues/129726}: Fix @ref{65c,,gzip.GzipFile} raising an unraisable exception
during garbage collection when referring to a temporary object by breaking
the reference loop with @ref{11b,,weakref}.

@item 
gh-127750@footnote{https://github.com/python/cpython/issues/127750}: Remove broken @ref{be9,,functools.singledispatchmethod()} caching
introduced in gh-85160@footnote{https://github.com/python/cpython/issues/85160}. Achieve the same performance using different
optimization.

@item 
gh-129948@footnote{https://github.com/python/cpython/issues/129948}: Add support for shared @ref{185,,set} to
@ref{18db,,multiprocessing.managers.SyncManager} via @ref{251,,SyncManager.set()}.

@item 
gh-129965@footnote{https://github.com/python/cpython/issues/129965}: Update MIME types for @code{.avi} and @code{.wav}. Add MIME types for
@code{.docx}, @code{.pptx}, @code{.xlsx}, @code{.epub}, @code{.flac}, @code{.m4a}, @code{.odg},
@code{.odp}, @code{.ods}, @code{.odt}, @code{.oga}, @code{.ogg}, @code{.ogx} and @code{.weba}.
Patch by Hugo van Kemenade.

@item 
gh-129889@footnote{https://github.com/python/cpython/issues/129889}: Support context manager protocol by @ref{1e4,,contextvars.Token}.
Patch by Andrew Svetlov.

@item 
gh-97850@footnote{https://github.com/python/cpython/issues/97850}: Update the deprecation warning of
@ref{a6f,,importlib.abc.Loader.load_module()}.

@item 
gh-129678@footnote{https://github.com/python/cpython/issues/129678}: @ref{4df,,configparser.ConfigParser}: do not write an empty
unnamed section

@item 
gh-128641@footnote{https://github.com/python/cpython/issues/128641}: Restore @ref{1674,,configparser.ConfigParser.read()} performance.

@item 
gh-129569@footnote{https://github.com/python/cpython/issues/129569}: Fix @ref{8e6,,unicodedata.normalize()} to always return a built-in
@ref{16a,,str} object when given an input of a @code{str} subclass,
regardless of whether the string is already normalized.

@item 
gh-128231@footnote{https://github.com/python/cpython/issues/128231}: Execution of multiple statements in the new REPL now stops
immediately upon the first exception encountered. Patch by Bartosz
Sławecki.

@item 
gh-96092@footnote{https://github.com/python/cpython/issues/96092}: Fix bug in @ref{1087,,traceback.walk_stack()} called with None where
it was skipping more frames than in prior versions. This bug fix also
changes walk_stack to walk the stack in the frame where it was called
rather than where it first gets used.

@item 
gh-129288@footnote{https://github.com/python/cpython/issues/129288}: Add optional @code{l2_cid} and @code{l2_bdaddr_type} fields to
@ref{d1,,socket} @code{BTPROTO_L2CAP} sockaddr tuple.

@item 
gh-128703@footnote{https://github.com/python/cpython/issues/128703}: Fix @ref{518,,mimetypes.guess_type()} to use default mapping for
empty @code{Content-Type} in registry.

@item 
gh-128647@footnote{https://github.com/python/cpython/issues/128647}: Eagerly write to buffers passed to @ref{65c,,gzip.GzipFile}’s
@ref{18dc,,readinto()} and
@ref{1022,,readinto1()} implementations, avoiding unnecessary
allocations. Patch by Chris Markiewicz.

@item 
gh-128184@footnote{https://github.com/python/cpython/issues/128184}: Improve display of @ref{17c9,,annotationlib.ForwardRef} object
within @ref{4e4,,inspect.Signature} representations. This also fixes a
@ref{450,,NameError} that was raised when using @ref{4e2,,dataclasses.dataclass()}
on classes with unresolvable forward references.

@item 
gh-128041@footnote{https://github.com/python/cpython/issues/128041}: Add
@ref{1dc,,concurrent.futures.ProcessPoolExecutor.terminate_workers()} and
@ref{1dd,,concurrent.futures.ProcessPoolExecutor.kill_workers()} as ways to
terminate or kill all living worker processes in the given pool.
(Contributed by Charles Machalow in gh-130849@footnote{https://github.com/python/cpython/issues/130849}.)

@item 
gh-127647@footnote{https://github.com/python/cpython/issues/127647}: Add protocols @ref{238,,io.Reader} and @ref{239,,io.Writer} as
alternatives to @ref{23a,,typing.IO}, @ref{23b,,typing.TextIO}, and
@ref{23c,,typing.BinaryIO}.

@item 
gh-109798@footnote{https://github.com/python/cpython/issues/109798}: Added additional information into error messages in
@ref{34,,datetime}, and made the messages more consistent between the C and
Python implementations. Patch by Semyon Moroz.

@item 
gh-125746@footnote{https://github.com/python/cpython/issues/125746}: Delay deprecated @ref{336,,zipimport.zipimporter.load_module()}
removal time to 3.15. Use @ref{337,,zipimport.zipimporter.exec_module()}
instead.

@item 
gh-74028@footnote{https://github.com/python/cpython/issues/74028}: Add the optional @code{buffersize} parameter to
@ref{1de,,concurrent.futures.Executor.map()} to limit the number of submitted
tasks whose results have not yet been yielded. If the buffer is full,
iteration over the `iterables' pauses until a result is yielded from the
buffer.

@item 
gh-124927@footnote{https://github.com/python/cpython/issues/124927}: Non-printing characters are now properly handled in the new
REPL.

@item 
gh-124096@footnote{https://github.com/python/cpython/issues/124096}: Turn on virtual terminal mode and enable bracketed paste in
REPL on Windows console. (If the terminal does not support bracketed
paste, enabling it does nothing.)

@item 
gh-89083@footnote{https://github.com/python/cpython/issues/89083}: Add @ref{2c5,,uuid.uuid7()} for generating UUIDv7 objects as
specified in 
@geindex RFC; RFC 9562
RFC 9562@footnote{https://datatracker.ietf.org/doc/html/rfc9562.html}. Patch by Bénédikt Tran.

@item 
gh-89083@footnote{https://github.com/python/cpython/issues/89083}: Add @ref{2c4,,uuid.uuid6()} for generating UUIDv6 objects as
specified in 
@geindex RFC; RFC 9562
RFC 9562@footnote{https://datatracker.ietf.org/doc/html/rfc9562.html}. Patch by Bénédikt Tran.

@item 
gh-117151@footnote{https://github.com/python/cpython/issues/117151}: Increase @code{io.DEFAULT_BUFFER_SIZE} from 8k to 128k and adjust
@ref{318,,open()} on platforms where @ref{f92,,os.fstat()} provides a @code{st_blksize}
field (such as Linux) to use @code{max(min(blocksize, 8 MiB),
io.DEFAULT_BUFFER_SIZE)} rather than always using the device block size.
This should improve I/O performance. Patch by Romain Morotti.

@item 
gh-105499@footnote{https://github.com/python/cpython/issues/105499}: Make @ref{2a9,,types.UnionType} an alias for
@ref{2aa,,typing.Union}. Both @code{int | str} and @code{Union[int, str]} now
create instances of the same type. Patch by Jelle Zijlstra.

@item 
gh-93096@footnote{https://github.com/python/cpython/issues/93096}: Document the command-line for @ref{93,,mimetypes}. It now exits
with @code{1} on failure instead of @code{0} and @code{2} on incorrect command-line
parameters instead of @code{1}. Also, errors are printed to stderr instead of
stdout and their text is made tighter. Patch by Oleg Iarygin and Hugo van
Kemenade.
@end itemize

@node Documentation<13>,Core and Builtins<31>,Library<34>,Python 3 14 0 alpha 6
@anchor{whatsnew/changelog id157}@anchor{18dd}
@subsubsection Documentation



@itemize -

@item 
gh-125722@footnote{https://github.com/python/cpython/issues/125722}: Require Sphinx 8.2.0 or later to build the Python
documentation. Patch by Adam Turner.

@item 
gh-129712@footnote{https://github.com/python/cpython/issues/129712}: The wheel tags supported by each macOS universal SDK option are
now documented.

@item 
gh-46236@footnote{https://github.com/python/cpython/issues/46236}: C API: Document @ref{18de,,PyUnicode_RSplit()},
@ref{18df,,PyUnicode_Partition()} and @ref{18e0,,PyUnicode_RPartition()}.
@end itemize

@node Core and Builtins<31>,Library<35>,Documentation<13>,Python 3 14 0 alpha 6
@anchor{whatsnew/changelog id158}@anchor{18e1}
@subsubsection Core and Builtins



@itemize -

@item 
gh-131141@footnote{https://github.com/python/cpython/issues/131141}: Fix data race in @ref{e0,,sys.monitoring} instrumentation while
registering callback.

@item 
gh-130804@footnote{https://github.com/python/cpython/issues/130804}: Fix support of unicode characters on Windows in the new REPL.

@item 
gh-130932@footnote{https://github.com/python/cpython/issues/130932}: Fix incorrect exception handling in
@code{_PyModule_IsPossiblyShadowing}

@item 
gh-122029@footnote{https://github.com/python/cpython/issues/122029}: @ref{170a,,sys.setprofile()} and @ref{2e3,,sys.settrace()} will not
generate a @code{c_call} event for @code{INSTRUMENTED_CALL_FUNCTION_EX} if the
callable is a method with a C function wrapped, because we do not generate
@code{c_return} event in such case.

@item 
gh-129964@footnote{https://github.com/python/cpython/issues/129964}: Fix JIT crash on Windows on Arm. Patch by Diego Russo and
Brandt Bucher.

@item 
gh-130851@footnote{https://github.com/python/cpython/issues/130851}: Fix a crash in the @ref{1f6,,free threading} build when
constructing a @ref{1b,,code} object with @ref{18e2,,co_consts}
that contains instances of types that are not otherwise generated by the
bytecode compiler.

@item 
gh-128534@footnote{https://github.com/python/cpython/issues/128534}: Ensure that both left and right branches have the same source
for @code{async for} loops. Add these branches to the @code{co_branches()}
iterator.

@item 
gh-130794@footnote{https://github.com/python/cpython/issues/130794}: Fix memory leak in the @ref{1f6,,free threaded}
build when resizing a shared list or dictionary from multiple short-lived
threads.

@item 
gh-130415@footnote{https://github.com/python/cpython/issues/130415}: Improve JIT understanding of integers in boolean context.

@item 
gh-130382@footnote{https://github.com/python/cpython/issues/130382}: Fix @code{PyRefTracer_DESTROY} not being sent from
@code{Python/ceval.c} @code{Py_DECREF()}.

@item 
gh-130574@footnote{https://github.com/python/cpython/issues/130574}: Renumber @ref{5bb,,RESUME} from 149 to 128.

@item 
gh-124878@footnote{https://github.com/python/cpython/issues/124878}: Fix race conditions during runtime finalization that could lead
to accessing freed memory.

@item 
gh-130415@footnote{https://github.com/python/cpython/issues/130415}: Improve the experimental JIT’s ability to narrow boolean values
based on the results of truthiness tests.

@item 
gh-130618@footnote{https://github.com/python/cpython/issues/130618}: Fix a bug that was causing @code{UnicodeDecodeError} or
@code{SystemError} to be raised when using f-strings with @code{lambda}
expressions with non-ASCII characters. Patch by Pablo Galindo

@item 
gh-123044@footnote{https://github.com/python/cpython/issues/123044}: Make sure that the location of branch targets in @code{match}
cases is in the body, not the pattern.

@item 
gh-128534@footnote{https://github.com/python/cpython/issues/128534}: Add branch monitoring (@code{BRANCH_LEFT} and @code{BRANCH_RIGHT}
events) for @code{async for} loops.

@item 
gh-130163@footnote{https://github.com/python/cpython/issues/130163}: Fix possible crashes related to concurrent change and use of
the @ref{df,,sys} module attributes.

@item 
gh-122029@footnote{https://github.com/python/cpython/issues/122029}: @code{INSTRUMENTED_CALL_KW} will expand the method before
monitoring to reflect the actual behavior more accurately.

@item 
gh-130415@footnote{https://github.com/python/cpython/issues/130415}: Improve JIT’s ability to optimize strings in boolean contexts.

@item 
gh-130396@footnote{https://github.com/python/cpython/issues/130396}: Use actual stack limits (from
@code{pthread_getattr_np(3)@footnote{https://manpages.debian.org/pthread_getattr_np(3)}}) for linux, and other systems with
@code{_GNU_SOURCE} defined, when determining limits for C stack protection.

@item 
gh-128396@footnote{https://github.com/python/cpython/issues/128396}: Fix a crash that occurs when calling @ref{46f,,locals()} inside an
inline comprehension that uses the same local variable as the outer frame
scope where the variable is a free or cell var.

@item 
gh-129107@footnote{https://github.com/python/cpython/issues/129107}: Fix two more @ref{342,,bytearray} functions for @ref{1f6,,free threading}.

@item 
gh-127705@footnote{https://github.com/python/cpython/issues/127705}: Use tagged references (@code{_PyStackRef}) for the default build
as well as for the free-threading build. This has a small negative
performance impact short-term but will enable larger speedups in the
future and significantly reduce maintenance costs by allowing a single
implementation of tagged references in the future.

@item 
gh-130094@footnote{https://github.com/python/cpython/issues/130094}: Fix two race conditions involving concurrent imports that could
lead to spurious failures with @ref{d43,,ModuleNotFoundError}.

@item 
gh-129107@footnote{https://github.com/python/cpython/issues/129107}: Make @ref{342,,bytearray} iterator safe under @ref{1f6,,free threading}.

@item 
gh-115802@footnote{https://github.com/python/cpython/issues/115802}: Use the more efficient “medium” code model for JIT-compiled
code on supported platforms.

@item 
gh-107956@footnote{https://github.com/python/cpython/issues/107956}: A @code{build-details.json} file is now install in the
platform-independent standard library directory (
@geindex Python Enhancement Proposals; PEP 739
PEP 739@footnote{https://peps.python.org/pep-0739/}
implementation).

@item 
gh-116042@footnote{https://github.com/python/cpython/issues/116042}: Fix location for SyntaxErrors of invalid escapes in the
tokenizer. Patch by Pablo Galindo

@item 
gh-91079@footnote{https://github.com/python/cpython/issues/91079}: Change C stack overflow protection to consider the amount of
stack consumed, rather than a counter. This allows deeper recursion in
many cases, but remains safe.

@item 
gh-129715@footnote{https://github.com/python/cpython/issues/129715}: Improve the experimental JIT’s handling of returns to unknown
callers.
@end itemize

@node Library<35>,Core and Builtins<32>,Core and Builtins<31>,Python 3 14 0 alpha 6
@anchor{whatsnew/changelog id159}@anchor{18e3}
@subsubsection Library



@itemize -

@item 
gh-129983@footnote{https://github.com/python/cpython/issues/129983}: Fix data race in compile_template in @code{sre.c}.
@end itemize

@node Core and Builtins<32>,Library<36>,Library<35>,Python 3 14 0 alpha 6
@anchor{whatsnew/changelog id160}@anchor{18e4}
@subsubsection Core and Builtins



@itemize -

@item 
gh-129967@footnote{https://github.com/python/cpython/issues/129967}: Fix a race condition in the @ref{1f6,,free threading} build when
@code{repr(set)} is called concurrently with @code{set.clear()}.

@item 
gh-129953@footnote{https://github.com/python/cpython/issues/129953}: The internal (evaluation) stack is now spilled to memory
whenever execution escapes from the interpreter or JIT compiled code. This
should have no observable effect in either Python or builtin extensions,
but will allow various important optimizations in the future.

@item 
gh-129515@footnote{https://github.com/python/cpython/issues/129515}: Clarify syntax error messages for conditional expressions when
a statement is specified before an @ref{182,,if} or after an
@ref{17d,,else} keyword.

@item 
gh-129349@footnote{https://github.com/python/cpython/issues/129349}: @ref{191,,bytes.fromhex()} and @ref{192,,bytearray.fromhex()} now accepts
ASCII @ref{193,,bytes} and @ref{194,,bytes-like objects}.

@item 
gh-129149@footnote{https://github.com/python/cpython/issues/129149}: Add fast path for medium-size integers in
@ref{18e5,,PyLong_FromSsize_t()}. Patch by Chris Eibl.

@item 
gh-129107@footnote{https://github.com/python/cpython/issues/129107}: Make the @ref{342,,bytearray} safe under @ref{1f6,,free threading}.

@item 
gh-128974@footnote{https://github.com/python/cpython/issues/128974}: Fix a crash in @ref{831,,UnicodeError.__str__}
when custom attributes implement @code{__str__()} with
side-effects. Patch by Bénédikt Tran.

@item 
gh-126085@footnote{https://github.com/python/cpython/issues/126085}: @ref{2b0,,typing.TypeAliasType} now supports star unpacking.

@item 
gh-125331@footnote{https://github.com/python/cpython/issues/125331}: @code{from __future__ import barry_as_FLUFL} now works in more
contexts, including when it is used in files, with the @code{-c} flag, and in
the REPL when there are multiple statements on the same line. Previously,
it worked only on subsequent lines in the REPL, and when the appropriate
flags were passed directly to @ref{4b2,,compile()}. Patch by Pablo Galindo.

@item 
gh-121464@footnote{https://github.com/python/cpython/issues/121464}: Make concurrent iterations over the same @ref{168d,,enumerate()}
iterator safe under free-threading. See Strategy for Iterators in Free Threading@footnote{https://github.com/python/cpython/issues/124397}.

@item 
gh-87790@footnote{https://github.com/python/cpython/issues/87790}: Support underscore and comma as thousands separators in the
fractional part for floating-point presentation types of the new-style
string formatting (with @ref{19a,,format()} or @ref{19b,,f-strings}).  Patch by
Sergey B Kirpichev.

@item 
gh-124445@footnote{https://github.com/python/cpython/issues/124445}: Fix specialization of generic aliases that are generic over a
@ref{488,,typing.ParamSpec} and have been specialized with a nested type
variable.

@item 
gh-120608@footnote{https://github.com/python/cpython/issues/120608}: Adapt @ref{a6b,,reversed()} for use in the free-threading build. The
@code{reversed()} is still not thread-safe in the sense that concurrent
iterations may see the same object, but they will not corrupt the
interpreter state.
@end itemize

@node Library<36>,Core and Builtins<33>,Core and Builtins<32>,Python 3 14 0 alpha 6
@anchor{whatsnew/changelog id161}@anchor{18e6}
@subsubsection Library



@itemize -

@item 
gh-100388@footnote{https://github.com/python/cpython/issues/100388}: Fix the @code{platform._sys_version()} method when @code{__DATE__} is
undefined at buildtime by changing default buildtime datetime string to
the UNIX epoch.
@end itemize

@node Core and Builtins<33>,C API<13>,Library<36>,Python 3 14 0 alpha 6
@anchor{whatsnew/changelog id162}@anchor{18e7}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-44369@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44369}: Improve syntax errors for incorrectly closed strings. Patch by
Pablo Galindo
@end itemize

@node C API<13>,Build<14>,Core and Builtins<33>,Python 3 14 0 alpha 6
@anchor{whatsnew/changelog id163}@anchor{18e8}
@subsubsection C API



@itemize -

@item 
gh-111178@footnote{https://github.com/python/cpython/issues/111178}: Fix @ref{96d,,PyCMethod} API: replace @code{size_t nargs} with
@code{Py_ssize_t nargs} in @code{PyCMethod}. Patch by Victor Stinner.

@item 
gh-130947@footnote{https://github.com/python/cpython/issues/130947}: Add again @ref{18e9,,PySequence_Fast()} to the limited C API. Patch
by Victor Stinner.

@item 
gh-128863@footnote{https://github.com/python/cpython/issues/128863}: The following private functions are deprecated and planned for
removal in Python 3.18:


@itemize *

@item 
@code{_PyUnicodeWriter_Init()}:
replace @code{_PyUnicodeWriter_Init(&writer)} with
@ref{3b2,,writer = PyUnicodeWriter_Create(0)}.

@item 
@code{_PyUnicodeWriter_Finish()}:
replace @code{_PyUnicodeWriter_Finish(&writer)} with
@ref{3b5,,PyUnicodeWriter_Finish(writer)}.

@item 
@code{_PyUnicodeWriter_Dealloc()}:
replace @code{_PyUnicodeWriter_Dealloc(&writer)} with
@ref{3b4,,PyUnicodeWriter_Discard(writer)}.

@item 
@code{_PyUnicodeWriter_WriteChar()}:
replace @code{_PyUnicodeWriter_WriteChar(&writer, ch)} with
@ref{3b8,,PyUnicodeWriter_WriteChar(writer@comma{} ch)}.

@item 
@code{_PyUnicodeWriter_WriteStr()}:
replace @code{_PyUnicodeWriter_WriteStr(&writer, str)} with
@ref{3ba,,PyUnicodeWriter_WriteStr(writer@comma{} str)}.

@item 
@code{_PyUnicodeWriter_WriteSubstring()}:
replace @code{_PyUnicodeWriter_WriteSubstring(&writer, str, start, end)} with
@ref{3bb,,PyUnicodeWriter_WriteSubstring(writer@comma{} str@comma{} start@comma{} end)}.

@item 
@code{_PyUnicodeWriter_WriteASCIIString()}:
replace @code{_PyUnicodeWriter_WriteASCIIString(&writer, str)} with
@ref{3bd,,PyUnicodeWriter_WriteUTF8(writer@comma{} str)}.

@item 
@code{_PyUnicodeWriter_WriteLatin1String()}:
replace @code{_PyUnicodeWriter_WriteLatin1String(&writer, str)} with
@ref{3bd,,PyUnicodeWriter_WriteUTF8(writer@comma{} str)}.

@item 
@code{_PyUnicodeWriter_Prepare()}: (no replacement).

@item 
@code{_PyUnicodeWriter_PrepareKind()}: (no replacement).
@end itemize

The pythoncapi-compat project@footnote{https://github.com/python/pythoncapi-compat/} can be used to get these
new public functions on Python 3.13 and older.

Patch by Victor Stinner.

@item 
gh-45325@footnote{https://github.com/python/cpython/issues/45325}: Add a new @code{p} format parameter to @ref{3c0,,Py_BuildValue()} that
allows to take a C integer and produce a Python @ref{3c1,,bool} object.
Patch by Pablo Galindo.
@end itemize

@node Build<14>,,C API<13>,Python 3 14 0 alpha 6
@anchor{whatsnew/changelog id164}@anchor{18ea}
@subsubsection Build



@itemize -

@item 
gh-131035@footnote{https://github.com/python/cpython/issues/131035}: Use @code{-flto=thin} for faster build times using clang-cl on
Windows. Patch by Chris Eibl.

@item 
gh-130740@footnote{https://github.com/python/cpython/issues/130740}: Ensure that @code{Python.h} is included before @code{stdbool.h}
unless @code{pyconfig.h} is included before or in some platform-specific
contexts.

@item 
gh-130090@footnote{https://github.com/python/cpython/issues/130090}: Building with @code{PlatformToolset=ClangCL} on Windows now
supports PGO (profile guided optimization). Patch by Chris Eibl with
invaluable support from Steve Dover.

@item 
gh-129819@footnote{https://github.com/python/cpython/issues/129819}: Allow building the JIT with the tailcall interpreter.

@item 
gh-129989@footnote{https://github.com/python/cpython/issues/129989}: Fix a bug where the tailcall interpreter was enabled when
@code{--without-tail-call-interp} was provided to the configure script.

@item 
gh-129838@footnote{https://github.com/python/cpython/issues/129838}: Don’t redefine @code{_Py_NO_SANITIZE_UNDEFINED} when compiling
with a recent GCC version and undefined sanitizer enabled.

@item 
gh-82909@footnote{https://github.com/python/cpython/issues/82909}: @code{#pragma}-based linking with @code{python3*.lib} can now be
switched off with @ref{442,,Py_NO_LINK_LIB}. Patch by Jean-Christophe
Fillion-Robin.
@end itemize

@node Python 3 14 0 alpha 5,Python 3 14 0 alpha 4,Python 3 14 0 alpha 6,Changelog
@anchor{whatsnew/changelog python-3-14-0-alpha-5}@anchor{18eb}
@subsection Python 3.14.0 alpha 5


`Release date: 2025-02-11'

@menu
* macOS: macOS<9>. 
* Tools/Demos: Tools/Demos<11>. 
* Tests: Tests<13>. 
* Security: Security<17>. 
* Library: Library<37>. 
* IDLE: IDLE<7>. 
* Documentation: Documentation<14>. 
* Core and Builtins: Core and Builtins<34>. 
* Library: Library<38>. 
* Core and Builtins: Core and Builtins<35>. 
* Library: Library<39>. 
* Core and Builtins: Core and Builtins<36>. 
* Library: Library<40>. 
* C API: C API<14>. 
* Build: Build<15>. 

@end menu

@node macOS<9>,Tools/Demos<11>,,Python 3 14 0 alpha 5
@anchor{whatsnew/changelog id165}@anchor{18ec}
@subsubsection macOS



@itemize -

@item 
gh-91132@footnote{https://github.com/python/cpython/issues/91132}: Update macOS installer to use ncurses 6.5.
@end itemize

@node Tools/Demos<11>,Tests<13>,macOS<9>,Python 3 14 0 alpha 5
@anchor{whatsnew/changelog id166}@anchor{18ed}
@subsubsection Tools/Demos



@itemize -

@item 
gh-129248@footnote{https://github.com/python/cpython/issues/129248}: The iOS test runner now strips the log prefix from each line
output by the test suite.

@item 
gh-104400@footnote{https://github.com/python/cpython/issues/104400}: Fix several bugs in extraction by switching to an AST parser in
@code{pygettext}.
@end itemize

@node Tests<13>,Security<17>,Tools/Demos<11>,Python 3 14 0 alpha 5
@anchor{whatsnew/changelog id167}@anchor{18ee}
@subsubsection Tests



@itemize -

@item 
gh-129386@footnote{https://github.com/python/cpython/issues/129386}: Add @code{test.support.reset_code}, which can be used to reset
various bytecode-level optimizations and local instrumentation for a
function.

@item 
gh-128474@footnote{https://github.com/python/cpython/issues/128474}: Disable @code{test_embed} test cases that segfault on BOLT
instrument binaries. The tests are only disabled when BOLT is enabled.

@item 
gh-128003@footnote{https://github.com/python/cpython/issues/128003}: Add an option @code{--parallel-threads=N} to the regression test
runner that runs individual tests in multiple threads in parallel in order
to find concurrency bugs.  Note that most of the test suite is not yet
reviewed for thread-safety or annotated with @code{@@thread_unsafe} when
necessary.
@end itemize

@node Security<17>,Library<37>,Tests<13>,Python 3 14 0 alpha 5
@anchor{whatsnew/changelog id168}@anchor{18ef}
@subsubsection Security



@itemize -

@item 
gh-105704@footnote{https://github.com/python/cpython/issues/105704}: When using @ref{f40,,urllib.parse.urlsplit()} and
@ref{360,,urllib.parse.urlparse()} host parsing would not reject domain names
containing square brackets (@code{[} and @code{]}). Square brackets are only
valid for IPv6 and IPvFuture hosts according to RFC 3986 Section 3.2.2@footnote{https://www.rfc-editor.org/rfc/rfc3986#section-3.2.2}.

@item 
gh-126108@footnote{https://github.com/python/cpython/issues/126108}: Fix a possible @code{NULL} pointer dereference in
@code{PySys_AddWarnOptionUnicode()}.

@item 
gh-80222@footnote{https://github.com/python/cpython/issues/80222}: Fix bug in the folding of quoted strings when flattening an
email message using a modern email policy. Previously when a quoted string
was folded so that it spanned more than one line, the surrounding quotes
and internal escapes would be omitted. This could theoretically be used to
spoof header lines using a carefully constructed quoted string if the
resulting rendered email was transmitted or re-parsed.

@item 
gh-119511@footnote{https://github.com/python/cpython/issues/119511}: Fix a potential denial of service in the @ref{78,,imaplib} module.
When connecting to a malicious server, it could cause an arbitrary amount
of memory to be allocated. On many systems this is harmless as unused
virtual memory is only a mapping, but if this hit a virtual address size
limit it could lead to a @ref{1761,,MemoryError} or other process crash. On
unusual systems or builds where all allocated memory is touched and backed
by actual ram or storage it could’ve consumed resources doing so until
similarly crashing.
@end itemize

@node Library<37>,IDLE<7>,Security<17>,Python 3 14 0 alpha 5
@anchor{whatsnew/changelog id169}@anchor{18f0}
@subsubsection Library



@itemize -

@item 
gh-129939@footnote{https://github.com/python/cpython/issues/129939}: Comparison pages with highlighted changes generated by the
@ref{203,,difflib.HtmlDiff} class now support dark mode.

@item 
gh-129928@footnote{https://github.com/python/cpython/issues/129928}: Raise @ref{307,,sqlite3.ProgrammingError} if a user-defined SQL
function with invalid number of parameters is created. Patch by Erlend
Aasland.

@item 
gh-129583@footnote{https://github.com/python/cpython/issues/129583}: Update bundled pip to 25.0.1

@item 
gh-129766@footnote{https://github.com/python/cpython/issues/129766}: Fix crash in @ref{119,,warnings}, when calling @code{_release_lock()}
with no existing lock.

@item 
gh-129005@footnote{https://github.com/python/cpython/issues/129005}: @code{_pyio.FileIO.readall()} now allocates, resizes, and fills a
data buffer using the same algorithm @code{_io.FileIO.readall()} uses.

@item 
gh-129646@footnote{https://github.com/python/cpython/issues/129646}: Update the locale alias mapping in the @ref{8a,,locale} module to
match the latest X Org locale alias mapping and support new locales in
Glibc 2.41.

@item 
gh-128317@footnote{https://github.com/python/cpython/issues/128317}: Put CLI calendar highlighting in private class, removing
@code{highlight_day} from public @ref{18f1,,calendar.TextCalendar} API. Patch by
Hugo van Kemenade.

@item 
gh-129603@footnote{https://github.com/python/cpython/issues/129603}: Fix bugs where @ref{1077,,sqlite3.Row} objects could segfault if
their inherited @ref{18f2,,description} was set to @code{None}.
Patch by Erlend Aasland.

@item 
gh-129559@footnote{https://github.com/python/cpython/issues/129559}: Add @ref{17aa,,bytearray.resize()} method so @ref{342,,bytearray} can
be efficiently resized in place.

@item 
gh-129502@footnote{https://github.com/python/cpython/issues/129502}: Unlikely errors in preparing arguments for @ref{2e,,ctypes}
callback are now handled in the same way as errors raised in the callback
of in converting the result of the callback – using
@ref{508,,sys.unraisablehook()} instead of @ref{a12,,sys.excepthook()} and not
setting @ref{6e6,,sys.last_exc} and other variables.

@item 
gh-129403@footnote{https://github.com/python/cpython/issues/129403}: Corrected @ref{2ee,,ValueError} message for
@ref{817,,asyncio.Barrier} and @ref{13ef,,threading.Barrier}.

@item 
gh-129409@footnote{https://github.com/python/cpython/issues/129409}: Fix an integer overflow in the @ref{2d,,csv} module when writing a
data field larger than 2GB.

@item 
gh-126400@footnote{https://github.com/python/cpython/issues/126400}: Add a socket `timeout' keyword argument to
@ref{86e,,logging.handlers.SysLogHandler}.

@item 
gh-118761@footnote{https://github.com/python/cpython/issues/118761}: Always lazy import @code{warnings} in @ref{f3,,threading}. Patch by
Taneli Hukkinen.

@item 
gh-118761@footnote{https://github.com/python/cpython/issues/118761}: Improve import time of @ref{dc,,subprocess} by lazy importing
@code{locale} and @code{signal}. Patch by Taneli Hukkinen.

@item 
gh-129346@footnote{https://github.com/python/cpython/issues/129346}: In @ref{d4,,sqlite3}, handle out-of-memory when creating
user-defined SQL functions.

@item 
gh-129005@footnote{https://github.com/python/cpython/issues/129005}: Optimize @code{_pyio.FileIO.readinto} by avoiding unnecessary
objects and copies using @ref{261,,os.readinto()}.

@item 
gh-129195@footnote{https://github.com/python/cpython/issues/129195}: Support reporting call graph information from
@code{asyncio.staggered.staggered_race()}.

@item 
gh-129205@footnote{https://github.com/python/cpython/issues/129205}: Add @ref{261,,os.readinto()} to read into a @ref{262,,buffer object} from a file descriptor.

@item 
gh-128772@footnote{https://github.com/python/cpython/issues/128772}: Fix @ref{ba,,pydoc} for methods with the @code{__module__} attribute
equal to @code{None}.

@item 
gh-129061@footnote{https://github.com/python/cpython/issues/129061}: Fix FORCE_COLOR and NO_COLOR when empty strings. Patch by Hugo
van Kemenade.

@item 
gh-92897@footnote{https://github.com/python/cpython/issues/92897}: Scheduled the deprecation of the @code{check_home} argument of
@ref{32b,,sysconfig.is_python_build()} to Python 3.15.

@item 
gh-129064@footnote{https://github.com/python/cpython/issues/129064}: Deprecate @code{sysconfig.expand_makefile_vars()}, in favor of
using @ref{33e,,sysconfig.get_paths()} with the @code{vars} argument.

@item 
gh-128550@footnote{https://github.com/python/cpython/issues/128550}: Removed an incorrect optimization relating to eager tasks in
@ref{4d2,,asyncio.TaskGroup} that resulted in cancellations being missed.

@item 
gh-128991@footnote{https://github.com/python/cpython/issues/128991}: Release the enter frame reference within @ref{10,,bdb} callback

@item 
gh-118761@footnote{https://github.com/python/cpython/issues/118761}: Reduce import time of @ref{b5,,pstats} and @ref{138,,zipfile} by up to
20%, by removing unnecessary imports to @ref{10b,,typing}. Patch by Bénédikt
Tran.

@item 
gh-128978@footnote{https://github.com/python/cpython/issues/128978}: Fix a @ref{450,,NameError} in
@code{sysconfig.expand_makefile_vars()}. Patch by Bénédikt Tran.

@item 
gh-128961@footnote{https://github.com/python/cpython/issues/128961}: Fix a crash when setting state on an exhausted
@ref{4bf,,array.array} iterator.

@item 
gh-128894@footnote{https://github.com/python/cpython/issues/128894}: Fix @code{traceback.TracebackException._format_syntax_error} not
to fail on exceptions with custom metadata.

@item 
gh-128916@footnote{https://github.com/python/cpython/issues/128916}: Do not attempt to set @code{SO_REUSEPORT} on sockets of address
families other than @code{AF_INET} and @code{AF_INET6}, as it is meaningless
with these address families, and the call with fail with Linux kernel
6.12.9 and newer.

@item 
gh-118761@footnote{https://github.com/python/cpython/issues/118761}: Improve import time of @ref{103,,tomllib} by removing @code{typing},
@code{string}, and @code{tomllib._types} imports. Patch by Taneli Hukkinen.

@item 
gh-128679@footnote{https://github.com/python/cpython/issues/128679}: @ref{106,,tracemalloc}: Fix race conditions when
@ref{18f3,,tracemalloc.stop()} is called by a thread, while other threads are
tracing memory allocations. Patch by Victor Stinner.

@item 
gh-128891@footnote{https://github.com/python/cpython/issues/128891}: Add specialized opcodes to @code{opcode.opname}.

@item 
gh-118761@footnote{https://github.com/python/cpython/issues/118761}: Reduce import time of @ref{67,,gettext} by up to ten times, by
importing @ref{be,,re} on demand. In particular, @code{re} is no longer
implicitly exposed as @code{gettext.re}. Patch by Eli Schwartz.

@item 
gh-118761@footnote{https://github.com/python/cpython/issues/118761}: Reduce the import time of @ref{a4,,optparse} when no help text is
printed. Patch by Eli Schwartz.

@item 
gh-128657@footnote{https://github.com/python/cpython/issues/128657}: Fix possible extra reference when using objects returned by
@ref{18f4,,hashlib.sha256()} under @ref{1f6,,free threading}.

@item 
gh-118761@footnote{https://github.com/python/cpython/issues/118761}: Reduce the import time of @ref{2d,,csv} by up to five times, by
importing @ref{be,,re} on demand. In particular, @code{re} is no more implicitly
exposed as @code{csv.re}. Patch by Bénédikt Tran.

@item 
gh-128308@footnote{https://github.com/python/cpython/issues/128308}: Support the `name' keyword argument for eager tasks in
@ref{1cc,,asyncio.loop.create_task()},  @ref{1cb,,asyncio.create_task()} and
@ref{1cd,,asyncio.TaskGroup.create_task()}, by passing on all `kwargs' to the
task factory set by @ref{1ca,,asyncio.loop.set_task_factory()}.

@item 
gh-118761@footnote{https://github.com/python/cpython/issues/118761}: Improve the performance of @ref{2d5,,base64.b16decode()} by up to
ten times by more efficiently checking the byte-string for hexadecimal
digits. Reduce the import time of @ref{f,,base64} by up to six times, by no
longer importing @ref{be,,re}. Patch by Bénédikt Tran, Chris Markiewicz, and
Adam Turner.

@item 
gh-128156@footnote{https://github.com/python/cpython/issues/128156}: When using macOS system @code{libffi}, support for complex types
in @ref{2e,,ctypes} is now checked at runtime (macOS 10.15 or newer). The
types must also be available at build time.

@item 
gh-128636@footnote{https://github.com/python/cpython/issues/128636}: Fix PyREPL failure when @ref{25b,,os.environ} is overwritten with
an invalid value.

@item 
gh-128498@footnote{https://github.com/python/cpython/issues/128498}: Default to stdout isatty for color detection instead of stderr.
Patch by Hugo van Kemenade.

@item 
gh-128384@footnote{https://github.com/python/cpython/issues/128384}: Add locking to @ref{119,,warnings} to avoid some data races when
free-threading is used.  Change @code{_warnings_runtime_state.mutex} to be a
recursive mutex and expose it to @code{warnings}, via the
@code{_acquire_lock()} and @code{_release_lock()} functions. The lock is
held when @code{filters} and @code{_filters_version} are updated.

@item 
gh-128509@footnote{https://github.com/python/cpython/issues/128509}: Add @ref{291,,sys._is_immortal()} for identifying @ref{292,,immortal}
objects at runtime.

@item 
gh-128479@footnote{https://github.com/python/cpython/issues/128479}: Fix @code{asyncio.staggered.staggered_race()} leaking tasks and
issuing an unhandled exception.

@item 
gh-128427@footnote{https://github.com/python/cpython/issues/128427}: @ref{2c7,,uuid.NIL} and @ref{2c8,,uuid.MAX} are now available to
represent the Nil and Max UUID formats as defined by 
@geindex RFC; RFC 9562
RFC 9562@footnote{https://datatracker.ietf.org/doc/html/rfc9562.html}.

@item 
gh-91279@footnote{https://github.com/python/cpython/issues/91279}: @ref{2ce,,zipfile.ZipFile.writestr()} now respect
@code{SOURCE_DATE_EPOCH} that distributions can set centrally and have build
tools consume this in order to produce reproducible output.

@item 
gh-112064@footnote{https://github.com/python/cpython/issues/112064}: Fix incorrect handling of negative read sizes in
@ref{18f5,,HTTPResponse.read}. Patch by Yury
Manushkin.

@item 
gh-58956@footnote{https://github.com/python/cpython/issues/58956}: Fixed a frame reference leak in @ref{10,,bdb}.

@item 
gh-128131@footnote{https://github.com/python/cpython/issues/128131}: Completely support random access of uncompressed unencrypted
read-only zip files obtained by @ref{65d,,ZipFile.open}.

@item 
gh-127975@footnote{https://github.com/python/cpython/issues/127975}: Avoid reusing quote types in @ref{ae8,,ast.unparse()} if not needed.

@item 
gh-115514@footnote{https://github.com/python/cpython/issues/115514}: Fix exceptions and incomplete writes after
@code{asyncio._SelectorTransport} is closed before writes are
completed.

@item 
gh-121604@footnote{https://github.com/python/cpython/issues/121604}: Add missing Deprecation warnings for
@ref{18f6,,importlib.machinery.DEBUG_BYTECODE_SUFFIXES},
@ref{18f7,,importlib.machinery.OPTIMIZED_BYTECODE_SUFFIXES},
@ref{f2c,,importlib.machinery.WindowsRegistryFinder},
@ref{de8,,importlib.abc.ResourceLoader},
@ref{1395,,importlib.abc.SourceLoader.path_mtime()}.

@item 
gh-127873@footnote{https://github.com/python/cpython/issues/127873}: When @code{-E} is set, only ignore @code{PYTHON_COLORS} and not
@code{FORCE_COLOR}/@code{NO_COLOR}/@code{TERM} when colourising output. Patch by
Hugo van Kemenade.

@item 
gh-125413@footnote{https://github.com/python/cpython/issues/125413}: Add @ref{26d,,pathlib.Path.info} attribute, which stores an object
implementing the @ref{26e,,pathlib.types.PathInfo} protocol (also new). The
object supports querying the file type and internally caching
@ref{26f,,stat()} results. Path objects generated by
@ref{270,,iterdir()} are initialized with file type information
gleaned from scanning the parent directory.

@item 
gh-127712@footnote{https://github.com/python/cpython/issues/127712}: Fix handling of the @code{secure} argument of
@ref{18f8,,logging.handlers.SMTPHandler}.

@item 
gh-127096@footnote{https://github.com/python/cpython/issues/127096}: Do not recreate unnamed section on every read in
@ref{4df,,configparser.ConfigParser}. Patch by Andrey Efremov.

@item 
gh-124369@footnote{https://github.com/python/cpython/issues/124369}: Deprecate @code{pdb.Pdb.curframe_locals}

@item 
gh-126332@footnote{https://github.com/python/cpython/issues/126332}: Fix _pyrepl crash when entering a double CTRL-Z on an
overflowing line.

@item 
gh-125553@footnote{https://github.com/python/cpython/issues/125553}: Fix round-trip invariance for backslash continuations in
@ref{18f9,,tokenize.untokenize()}.

@item 
gh-91048@footnote{https://github.com/python/cpython/issues/91048}: Add @ref{1ce,,asyncio.capture_call_graph()} and
@ref{1cf,,asyncio.print_call_graph()} functions.

@item 
gh-124703@footnote{https://github.com/python/cpython/issues/124703}: Quitting @ref{aa,,pdb} in @code{inline} mode will emit a confirmation
prompt and exit gracefully now, instead of printing an exception
traceback.

@item 
gh-123987@footnote{https://github.com/python/cpython/issues/123987}: Fixed issue in NamespaceReader where a non-path item in a
namespace path, such as a sentinel added by an editable installer, would
break resource loading.

@item 
gh-119349@footnote{https://github.com/python/cpython/issues/119349}: Add the @ref{1f2,,ctypes.util.dllist()} function to list the loaded
shared libraries for the current process.

@item 
gh-55454@footnote{https://github.com/python/cpython/issues/55454}: Add IMAP4 @code{IDLE} support to the @ref{78,,imaplib} module.  Patch
by Forest.

@item 
gh-119257@footnote{https://github.com/python/cpython/issues/119257}: Show tab completions menu below the current line, which results
in less janky behaviour, and fixes a cursor movement bug. Patch by Daniel
Hollas

@item 
gh-101410@footnote{https://github.com/python/cpython/issues/101410}: Support custom messages for domain errors in the @ref{92,,math}
module (@ref{bff,,math.sqrt()}, @ref{16cc,,math.log()} and @ref{15e3,,math.atanh()} were
modified as examples).  Patch by Charlie Zhao and Sergey B Kirpichev.

@item 
gh-81340@footnote{https://github.com/python/cpython/issues/81340}: Use @ref{18fa,,os.copy_file_range()} in @ref{c55,,shutil.copy()},
@ref{c56,,shutil.copy2()}, and @ref{c54,,shutil.copyfile()} functions by default. An
underlying Linux system call gives filesystems an opportunity to implement
the use of copy-on-write (in case of btrfs and XFS) or server-side copy
(in the case of NFS.) Patch by Illia Volochii.

@item 
bpo-27307@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27307}: Add attribute and item access support to
@ref{10c3,,string.Formatter} in auto-numbering mode, which allows format
strings like ‘@{.name@}’ and ‘@{[1]@}’.
@end itemize

@node IDLE<7>,Documentation<14>,Library<37>,Python 3 14 0 alpha 5
@anchor{whatsnew/changelog id170}@anchor{18fb}
@subsubsection IDLE



@itemize -

@item 
gh-129873@footnote{https://github.com/python/cpython/issues/129873}: Simplify displaying the IDLE doc by only copying the text
section of idle.html to idlelib/help.html. Patch by Stan Ulbrych.
@end itemize

@node Documentation<14>,Core and Builtins<34>,IDLE<7>,Python 3 14 0 alpha 5
@anchor{whatsnew/changelog id171}@anchor{18fc}
@subsubsection Documentation



@itemize -

@item 
gh-125722@footnote{https://github.com/python/cpython/issues/125722}: Require Sphinx 8.1.3 or later to build the Python
documentation. Patch by Adam Turner.

@item 
gh-67206@footnote{https://github.com/python/cpython/issues/67206}: Document that @ref{18fd,,string.printable} is not printable in the
POSIX sense. In particular, @ref{fde,,string.printable.isprintable()} returns @ref{d31,,False}. Patch by Bénédikt Tran.
@end itemize

@node Core and Builtins<34>,Library<38>,Documentation<14>,Python 3 14 0 alpha 5
@anchor{whatsnew/changelog id172}@anchor{18fe}
@subsubsection Core and Builtins



@itemize -

@item 
gh-100239@footnote{https://github.com/python/cpython/issues/100239}: Replace the opcode BINARY_SUBSCR and its family by BINARY_OP
with oparg NB_SUBSCR.

@item 
gh-129732@footnote{https://github.com/python/cpython/issues/129732}: Fixed a race in @code{_Py_qsbr_reserve} in the free threading
build.

@item 
gh-129763@footnote{https://github.com/python/cpython/issues/129763}: Remove the internal @code{LLTRACE} macro (use @ref{187e,,Py_DEBUG}
instead).

@item 
gh-129715@footnote{https://github.com/python/cpython/issues/129715}: Improve JIT performance for generators.

@item 
gh-129643@footnote{https://github.com/python/cpython/issues/129643}: Fix thread safety of @ref{18ff,,PyList_Insert()} in free-threading
builds.

@item 
gh-129668@footnote{https://github.com/python/cpython/issues/129668}: Fix race condition when raising @ref{1761,,MemoryError} in the free
threaded build.

@item 
gh-129643@footnote{https://github.com/python/cpython/issues/129643}: Fix thread safety of @ref{1900,,PyList_SetItem()} in free-threading
builds. Patch by Kumar Aditya.

@item 
gh-128563@footnote{https://github.com/python/cpython/issues/128563}: Fix an issue where the “lltrace” debug feature could have been
incorrectly enabled for some frames.

@item 
gh-129393@footnote{https://github.com/python/cpython/issues/129393}: On FreeBSD, @ref{293,,sys.platform} doesn’t contain the major
version anymore. It is always @code{'freebsd'}, instead of @code{'freebsd13'} or
@code{'freebsd14'}.
@end itemize

@node Library<38>,Core and Builtins<35>,Core and Builtins<34>,Python 3 14 0 alpha 5
@anchor{whatsnew/changelog id173}@anchor{1901}
@subsubsection Library



@itemize -

@item 
gh-129345@footnote{https://github.com/python/cpython/issues/129345}: Fix null pointer dereference in @ref{761,,syslog.openlog()} when an
audit hook raises an exception.
@end itemize

@node Core and Builtins<35>,Library<39>,Library<38>,Python 3 14 0 alpha 5
@anchor{whatsnew/changelog id174}@anchor{1902}
@subsubsection Core and Builtins



@itemize -

@item 
gh-129231@footnote{https://github.com/python/cpython/issues/129231}: Improve memory layout of JIT traces. Patch by Diego Russo

@item 
gh-129149@footnote{https://github.com/python/cpython/issues/129149}: Add fast path for medium-size integers in
@ref{1903,,PyLong_FromUnsignedLong()}, @ref{1904,,PyLong_FromUnsignedLongLong()}
and @ref{1905,,PyLong_FromSize_t()}.

@item 
gh-129201@footnote{https://github.com/python/cpython/issues/129201}: The free-threaded version of the cyclic garbage collector has
been optimized to conditionally use CPU prefetch instructions during the
collection.  This can reduce collection times by making it more likely
that data is in the CPU cache when it is needed.  The prefetch
instructions are enabled if the number of long-lived objects (objects
surviving a full collection) exceeds a threshold.

@item 
gh-129093@footnote{https://github.com/python/cpython/issues/129093}: Fix f-strings such as @code{f'@{expr=@}'} sometimes not displaying
the full expression when the expression contains @code{!=}.

@item 
gh-124363@footnote{https://github.com/python/cpython/issues/124363}: Treat debug expressions in f-string as raw strings. Patch by
Pablo Galindo

@item 
gh-128714@footnote{https://github.com/python/cpython/issues/128714}: Fix the potential races in get/set dunder methods
@code{__annotations__}, @code{__annotate__} and @code{__type_params__} for function
object, and add related tests.

@item 
gh-128799@footnote{https://github.com/python/cpython/issues/128799}: Add frame of @code{except*} to traceback when it wraps a naked
exception.

@item 
gh-128842@footnote{https://github.com/python/cpython/issues/128842}: Collect JIT memory stats using pystats. Patch by Diego Russo.

@item 
gh-100239@footnote{https://github.com/python/cpython/issues/100239}: Specialize @code{BINARY_OP} for bitwise logical operations on
compact ints.

@item 
gh-128910@footnote{https://github.com/python/cpython/issues/128910}: Undocumented and unused private C-API functions
@code{_PyTrash_begin} and @code{_PyTrash_end} are removed.

@item 
gh-128807@footnote{https://github.com/python/cpython/issues/128807}: Add a marking phase to the free-threaded GC.  This is similar
to what was done in gh-126491@footnote{https://github.com/python/cpython/issues/126491}.  Since the free-threaded GC does not have
generations and is not incremental, the marking phase looks for all
objects reachable from known roots.  The roots are objects known to not be
garbage, like the module dictionary for @ref{df,,sys}.  For most programs,
this marking phase should make the GC a bit faster since typically less
work is done per object.

@item 
gh-100239@footnote{https://github.com/python/cpython/issues/100239}: Add opcode @code{BINARY_OP_EXTEND} which executes a pair of
functions (guard and specialization functions) accessed from the inline
cache.

@item 
gh-128563@footnote{https://github.com/python/cpython/issues/128563}: A new type of interpreter has been added to CPython. This
interpreter uses tail calls for its instruction handlers. Preliminary
benchmark results suggest 7-11% geometric mean faster on pyperformance
(depending on platform), and up to 30% faster on Python-intensive
workloads. This interpreter currently only works on newer compilers, such
as @code{clang-19}. Other compilers will continue using the old interpreter.
Patch by Ken Jin, with ideas on how to implement this in CPython by Mark
Shannon, Garret Gu, Haoran Xu, and Josh Haberman.

@item 
gh-126703@footnote{https://github.com/python/cpython/issues/126703}: Improve performance of iterating over lists and tuples by using
a freelist for the iterator objects.

@item 
gh-127953@footnote{https://github.com/python/cpython/issues/127953}: The time to handle a @code{LINE} event in sys.monitoring (and
sys.settrace) is now independent of the number of lines in the code
object.

@item 
gh-128330@footnote{https://github.com/python/cpython/issues/128330}: Restore terminal control characters on REPL exit.

@item 
gh-128016@footnote{https://github.com/python/cpython/issues/128016}: Improved the @code{SyntaxWarning} message for invalid escape
sequences to clarify that such sequences will raise a @code{SyntaxError} in
future Python releases. The new message also suggests a potential fix,
i.e., @code{Did you mean "\\e"?}.

@item 
gh-126004@footnote{https://github.com/python/cpython/issues/126004}: Fix handling of @ref{1906,,UnicodeError.start} and
@ref{1907,,UnicodeError.end} values in the @ref{1908,,codecs.replace_errors()} error
handler. Patch by Bénédikt Tran.

@item 
gh-126004@footnote{https://github.com/python/cpython/issues/126004}: Fix handling of @ref{1906,,UnicodeError.start} and
@ref{1907,,UnicodeError.end} values in the
@ref{1909,,codecs.backslashreplace_errors()} error handler. Patch by Bénédikt
Tran.

@item 
gh-126004@footnote{https://github.com/python/cpython/issues/126004}: Fix handling of @ref{1906,,UnicodeError.start} and
@ref{1907,,UnicodeError.end} values in the
@ref{190a,,codecs.xmlcharrefreplace_errors()} error handler. Patch by Bénédikt
Tran.

@item 
gh-127119@footnote{https://github.com/python/cpython/issues/127119}: Slightly optimize the @ref{19c,,int} deallocator.

@item 
gh-127349@footnote{https://github.com/python/cpython/issues/127349}: Fixed the error when resizing terminal in Python REPL. Patch by
Semyon Moroz.

@item 
gh-125723@footnote{https://github.com/python/cpython/issues/125723}: Fix crash with @code{gi_frame.f_locals} when generator frames
outlive their generator. Patch by Mikhail Efimov.
@end itemize

@node Library<39>,Core and Builtins<36>,Core and Builtins<35>,Python 3 14 0 alpha 5
@anchor{whatsnew/changelog id175}@anchor{190b}
@subsubsection Library



@itemize -

@item 
gh-126349@footnote{https://github.com/python/cpython/issues/126349}: Add @ref{2a5,,turtle.fill()}, @ref{2a6,,turtle.poly()} and
@ref{2a7,,turtle.no_animation()} context managers. Patch by Marie Roald and
Yngve Mardal Moe.
@end itemize

@node Core and Builtins<36>,Library<40>,Library<39>,Python 3 14 0 alpha 5
@anchor{whatsnew/changelog id176}@anchor{190c}
@subsubsection Core and Builtins



@itemize -

@item 
gh-115911@footnote{https://github.com/python/cpython/issues/115911}: If the current working directory cannot be determined due to
permissions, then import will no longer raise @ref{f44,,PermissionError}.
Patch by Alex Willmer.
@end itemize

@node Library<40>,C API<14>,Core and Builtins<36>,Python 3 14 0 alpha 5
@anchor{whatsnew/changelog id177}@anchor{190d}
@subsubsection Library



@itemize -

@item 
gh-112713@footnote{https://github.com/python/cpython/issues/112713}: Added support for the @code{Partitioned} cookie flag in
@ref{75,,http.cookies}.
@end itemize

@node C API<14>,Build<15>,Library<40>,Python 3 14 0 alpha 5
@anchor{whatsnew/changelog id178}@anchor{190e}
@subsubsection C API



@itemize -

@item 
gh-129533@footnote{https://github.com/python/cpython/issues/129533}: Update @ref{aaa,,PyGC_Enable()}, @ref{aab,,PyGC_Disable()},
@ref{aac,,PyGC_IsEnabled()} to use atomic operation for thread-safety at
free-threading build. Patch by Donghee Na.

@item 
gh-89188@footnote{https://github.com/python/cpython/issues/89188}: Implement @ref{1389,,PyUnicode_KIND()} and @ref{1385,,PyUnicode_DATA()}
as function, in addition to the macros with the same names. The macros
rely on C bit fields which have compiler-specific layout. Patch by Victor
Stinner.

@item 
gh-91417@footnote{https://github.com/python/cpython/issues/91417}: Remove @ref{18e9,,PySequence_Fast()} from the limited C API, since
this function has to be used with @ref{3c9,,PySequence_Fast_GET_ITEM}
which never worked in the limited C API. Patch by Victor Stinner.

@item 
gh-128509@footnote{https://github.com/python/cpython/issues/128509}: Add @ref{3c2,,PyUnstable_IsImmortal()} for determining whether an
object is @ref{292,,immortal}.

@item 
gh-129033@footnote{https://github.com/python/cpython/issues/129033}: Remove @code{_PyInterpreterState_GetConfigCopy()} and
@code{_PyInterpreterState_SetConfig()} private functions. Use instead
@ref{37a,,PyConfig_Get()} and @ref{37b,,PyConfig_Set()}, public C API added by
@geindex Python Enhancement Proposals; PEP 741
PEP 741@footnote{https://peps.python.org/pep-0741/} “Python Configuration C API”. Patch by Victor Stinner.

@item 
gh-129033@footnote{https://github.com/python/cpython/issues/129033}: Remove the private @code{_Py_InitializeMain()} function. It was a
@ref{3cf,,provisional API} added to Python 3.8 by 
@geindex Python Enhancement Proposals; PEP 587
PEP 587@footnote{https://peps.python.org/pep-0587/}. Patch by Victor
Stinner.

@item 
gh-128844@footnote{https://github.com/python/cpython/issues/128844}: Add @ref{190f,,PyUnstable_TryIncRef()} and
@ref{1910,,PyUnstable_EnableTryIncRef()} unstable APIs.  These are helpers for
dealing with unowned references in a thread-safe way, particularly in the
free threading build.

@item 
gh-128911@footnote{https://github.com/python/cpython/issues/128911}: Add @ref{394,,PyImport_ImportModuleAttr()} and
@ref{395,,PyImport_ImportModuleAttrString()} helper functions to import a
module and get an attribute of the module. Patch by Victor Stinner.

@item 
gh-128863@footnote{https://github.com/python/cpython/issues/128863}: The following private functions are deprecated and planned for
removal in Python 3.18:


@itemize *

@item 
@code{_PyBytes_Join()}: use @ref{381,,PyBytes_Join()}.

@item 
@code{_PyDict_GetItemStringWithError()}: use @ref{41f,,PyDict_GetItemStringRef()}.

@item 
@code{_PyDict_Pop()}: use @ref{420,,PyDict_Pop()}.

@item 
@code{_PyLong_Sign()}: use @ref{398,,PyLong_GetSign()}.

@item 
@code{_PyLong_FromDigits()} and @code{_PyLong_New()}:
use @ref{3a8,,PyLongWriter_Create()}.

@item 
@code{_PyThreadState_UncheckedGet()}: use @ref{421,,PyThreadState_GetUnchecked()}.

@item 
@code{_PyUnicode_AsString()}: use @ref{422,,PyUnicode_AsUTF8()}.

@item 
@code{_Py_HashPointer()}: use @ref{423,,Py_HashPointer()}.

@item 
@code{_Py_fopen_obj()}: use @ref{391,,Py_fopen()}.
@end itemize

The pythoncapi-compat project@footnote{https://github.com/python/pythoncapi-compat/} can be used to get these
new public functions on Python 3.13 and older.

Patch by Victor Stinner.

@item 
gh-126599@footnote{https://github.com/python/cpython/issues/126599}: Remove some internal test APIs for the experimental JIT
compiler.

@item 
gh-127925@footnote{https://github.com/python/cpython/issues/127925}: Convert the @ref{3a,,decimal} module to use 
@geindex Python Enhancement Proposals; PEP 757
PEP 757@footnote{https://peps.python.org/pep-0757/} C API
(export-import integers), offering some speed-up if the integer part of
the @ref{200,,Decimal} instance is small.  Patch by Sergey B
Kirpichev.
@end itemize

@node Build<15>,,C API<14>,Python 3 14 0 alpha 5
@anchor{whatsnew/changelog id179}@anchor{1911}
@subsubsection Build



@itemize -

@item 
gh-129660@footnote{https://github.com/python/cpython/issues/129660}: Drop @code{test_embed} from PGO training, whose contribution in
recent versions is considered to be ignorable.

@item 
gh-128902@footnote{https://github.com/python/cpython/issues/128902}: Fix compile errors with Clang 9 and older due to lack of
@code{__attribute__((fallthrough))} support.
@end itemize

@node Python 3 14 0 alpha 4,Python 3 14 0 alpha 3,Python 3 14 0 alpha 5,Changelog
@anchor{whatsnew/changelog python-3-14-0-alpha-4}@anchor{1912}
@subsection Python 3.14.0 alpha 4


`Release date: 2025-01-14'

@menu
* macOS: macOS<10>. 
* Tools/Demos: Tools/Demos<12>. 
* Tests: Tests<14>. 
* Library: Library<41>. 
* Core and Builtins: Core and Builtins<37>. 
* Library: Library<42>. 
* Core and Builtins: Core and Builtins<38>. 
* Library: Library<43>. 
* Core and Builtins: Core and Builtins<39>. 
* C API: C API<15>. 
* Build: Build<16>. 

@end menu

@node macOS<10>,Tools/Demos<12>,,Python 3 14 0 alpha 4
@anchor{whatsnew/changelog id180}@anchor{1913}
@subsubsection macOS



@itemize -

@item 
gh-127592@footnote{https://github.com/python/cpython/issues/127592}: Usage of the unified Apple System Log APIs was disabled when
the minimum macOS version is earlier than 10.12.
@end itemize

@node Tools/Demos<12>,Tests<14>,macOS<10>,Python 3 14 0 alpha 4
@anchor{whatsnew/changelog id181}@anchor{1914}
@subsubsection Tools/Demos



@itemize -

@item 
gh-128152@footnote{https://github.com/python/cpython/issues/128152}: Fix a bug where Argument Clinic’s C pre-processor parser tried
to parse pre-processor directives inside C comments. Patch by Erlend
Aasland.
@end itemize

@node Tests<14>,Library<41>,Tools/Demos<12>,Python 3 14 0 alpha 4
@anchor{whatsnew/changelog id182}@anchor{1915}
@subsubsection Tests



@itemize -

@item 
gh-128690@footnote{https://github.com/python/cpython/issues/128690}: Temporarily do not use test_embed in PGO profile builds until
the problem with test_init_pyvenv_cfg failing in some configurations is
resolved.
@end itemize

@node Library<41>,Core and Builtins<37>,Tests<14>,Python 3 14 0 alpha 4
@anchor{whatsnew/changelog id183}@anchor{1916}
@subsubsection Library



@itemize -

@item 
gh-128731@footnote{https://github.com/python/cpython/issues/128731}: Fix @ref{54d,,ResourceWarning} in
@ref{1917,,urllib.robotparser.RobotFileParser.read()}.

@item 
gh-71339@footnote{https://github.com/python/cpython/issues/71339}: Add new assertion methods for @ref{10d,,unittest}:
@ref{2b6,,assertHasAttr()},
@ref{2b7,,assertNotHasAttr()},
@ref{2b8,,assertIsSubclass()},
@ref{2b9,,assertNotIsSubclass()}
@ref{2ba,,assertStartsWith()},
@ref{2bb,,assertNotStartsWith()},
@ref{2bc,,assertEndsWith()} and
@ref{2bd,,assertNotEndsWith()}.

@item 
gh-118761@footnote{https://github.com/python/cpython/issues/118761}: Improve import time of @ref{ab,,pickle} by 25% by removing an
unnecessary regular expression. As such, @ref{be,,re} is no more implicitly
available as @code{pickle.re}. Patch by Bénédikt Tran.

@item 
gh-128661@footnote{https://github.com/python/cpython/issues/128661}: Fixes @ref{185f,,typing.evaluate_forward_ref()} not showing
deprecation when @code{type_params} arg is not passed.

@item 
gh-128562@footnote{https://github.com/python/cpython/issues/128562}: Fix possible conflicts in generated @ref{f6,,tkinter} widget names
if the widget class name ends with a digit.

@item 
gh-128559@footnote{https://github.com/python/cpython/issues/128559}: Improved import time of @ref{b,,asyncio}.

@item 
gh-128552@footnote{https://github.com/python/cpython/issues/128552}: Fix cyclic garbage introduced by
@ref{1cc,,asyncio.loop.create_task()} and @ref{1cd,,asyncio.TaskGroup.create_task()}
holding a reference to the created task if it is eager.

@item 
gh-128340@footnote{https://github.com/python/cpython/issues/128340}: Add internal thread safe handle to be used in
@ref{d01,,asyncio.loop.call_soon_threadsafe()} for thread safe cancellation.

@item 
gh-128182@footnote{https://github.com/python/cpython/issues/128182}: Fix crash when using @ref{2e,,ctypes} pointers concurrently on the
@ref{1f6,,free threaded} build.

@item 
gh-128400@footnote{https://github.com/python/cpython/issues/128400}: Only show the current thread in @ref{5c,,faulthandler} on the
@ref{1f6,,free threaded} build to prevent races.

@item 
gh-128400@footnote{https://github.com/python/cpython/issues/128400}: Fix crash when using @ref{1005,,faulthandler.dump_traceback()} while
other threads are active on the @ref{1f6,,free threaded}
build.

@item 
gh-128388@footnote{https://github.com/python/cpython/issues/128388}: Fix @code{PyREPL} on Windows to support more keybindings, like the
@code{Control}-@code{←} and @code{Control}-@code{→} word-skipping keybindings and those
with meta (i.e. @code{Alt}), e.g. @code{Alt}-@code{d} to @code{kill-word} or
@code{Alt}-@code{Backspace} @code{backward-kill-word}.

@item 
gh-88834@footnote{https://github.com/python/cpython/issues/88834}: Unify the instance check for @ref{2aa,,typing.Union} and
@ref{2a9,,types.UnionType}: @code{Union} now uses the instance checks
against its parameters instead of the subclass checks.

@item 
gh-128302@footnote{https://github.com/python/cpython/issues/128302}: Fix
@code{xml.dom.xmlbuilder.DOMEntityResolver.resolveEntity()}, which was
broken by the Python 3.0 transition.

@item 
gh-128317@footnote{https://github.com/python/cpython/issues/128317}: Highlight today in colour in @ref{15,,calendar}’s CLI output.
Patch by Hugo van Kemenade.

@item 
gh-128302@footnote{https://github.com/python/cpython/issues/128302}: Allow @code{xml.dom.xmlbuilder.DOMParser.parse()} to correctly
handle @code{xml.dom.xmlbuilder.DOMInputSource} instances that only
have a @code{systemId} attribute set.

@item 
gh-128151@footnote{https://github.com/python/cpython/issues/128151}: Improve generation of @ref{c5c,,UUID} objects version 3, 4,
5, and 8 via their dedicated functions by 30%. Patch by Bénédikt Tran.

@item 
gh-128118@footnote{https://github.com/python/cpython/issues/128118}: Improve performance of @ref{758,,copy.copy()} by 30% via a fast path
for atomic types and container types.

@item 
gh-127946@footnote{https://github.com/python/cpython/issues/127946}: Fix crash when modifying @ref{1918,,ctypes._CFuncPtr} objects
concurrently on the @ref{1f6,,free threaded} build.

@item 
gh-128062@footnote{https://github.com/python/cpython/issues/128062}: Revert the font of @ref{109,,turtledemo}’s menu bar to its default
value and display the shortcut keys in the correct position.

@item 
gh-128014@footnote{https://github.com/python/cpython/issues/128014}: Fix resetting the default window icon by passing @code{default='@w{'}}
to the @ref{f6,,tkinter} method @code{wm_iconbitmap()}.

@item 
gh-41872@footnote{https://github.com/python/cpython/issues/41872}: Fix quick extraction of module docstrings from a file in
@ref{ba,,pydoc}. It now supports docstrings with single quotes, escape
sequences, raw string literals, and other Python syntax.

@item 
gh-127060@footnote{https://github.com/python/cpython/issues/127060}: Set TERM environment variable to “dumb” to disable traceback
colors in IDLE, since IDLE doesn’t understand ANSI escape sequences. Patch
by Victor Stinner.

@item 
gh-126742@footnote{https://github.com/python/cpython/issues/126742}: Fix support of localized error messages reported by
@code{dlerror(3)@footnote{https://manpages.debian.org/dlerror(3)}} and @code{gdbm_strerror@footnote{https://manpages.debian.org/gdbm(3)}} in
@ref{2e,,ctypes} and @ref{37,,dbm.gnu} functions respectively. Patch by Bénédikt
Tran.

@item 
gh-122548@footnote{https://github.com/python/cpython/issues/122548}: Adds two new local events to sys.monitoring, @code{BRANCH_LEFT}
and @code{BRANCH_RIGHT}. This allows the two arms of the branch to be
disabled independently, which should hugely improve performance of
branch-level coverage tools. The old branch event, @code{BRANCH} is now
deprecated.

@item 
gh-127847@footnote{https://github.com/python/cpython/issues/127847}: Fix the position when doing interleaved seeks and reads in
uncompressed, unencrypted zip files returned by
@ref{65d,,zipfile.ZipFile.open()}.

@item 
gh-127688@footnote{https://github.com/python/cpython/issues/127688}: Add the @ref{25f,,SCHED_DEADLINE} and @ref{260,,SCHED_NORMAL}
constants to the @ref{a5,,os} module.

@item 
gh-83662@footnote{https://github.com/python/cpython/issues/83662}: Add missing @code{__class_getitem__} method to the Python
implementation of @ref{219,,functools.partial()}, to make it compatible with
the C version. This is mainly relevant for alternative Python
implementations like PyPy and GraalPy, because CPython will usually use
the C-implementation of that function.

@item 
gh-127586@footnote{https://github.com/python/cpython/issues/127586}: @ref{1171,,multiprocessing.pool.Pool} now properly restores
blocked signal handlers of the parent thread when creating processes via
either `spawn' or `forkserver'.

@item 
gh-98188@footnote{https://github.com/python/cpython/issues/98188}: Fix an issue in @ref{13d9,,email.message.Message.get_payload()} where
data cannot be decoded if the Content Transfer Encoding mechanism contains
trailing whitespaces or additional junk text. Patch by Hui Liu.

@item 
gh-127529@footnote{https://github.com/python/cpython/issues/127529}: Correct behavior of
@code{asyncio.selector_events.BaseSelectorEventLoop._accept_connection()}
in handling @ref{1263,,ConnectionAbortedError} in a loop. This improves
performance on OpenBSD.

@item 
gh-127360@footnote{https://github.com/python/cpython/issues/127360}: When a descriptive error message cannot be provided for an
@ref{1485,,ssl.SSLError}, the “unknown error” message now shows the internal
error code (as retrieved by @code{ERR_get_error} and similar OpenSSL
functions).

@item 
gh-127196@footnote{https://github.com/python/cpython/issues/127196}: Fix crash when dict with keys in invalid encoding were passed
to several functions in @code{_interpreters} module.

@item 
gh-124130@footnote{https://github.com/python/cpython/issues/124130}: Fix a bug in matching regular expression @code{\B} in empty input
string. Now it is always the opposite of @code{\b}. To get an old behavior,
use @code{(?!\A\Z)\B}. To get a new behavior in old Python versions, use
@code{(?!\b)}.

@item 
gh-126639@footnote{https://github.com/python/cpython/issues/126639}: @ref{6ee,,tempfile.NamedTemporaryFile} will now issue a
@ref{54d,,ResourceWarning} when it is finalized by the garbage collector
without being explicitly closed.

@item 
gh-126624@footnote{https://github.com/python/cpython/issues/126624}: Expose error code
@ref{1919,,XML_ERROR_NOT_STARTED} of Expat >=2.6.4
in @ref{12e,,xml.parsers.expat.errors}.

@item 
gh-126225@footnote{https://github.com/python/cpython/issues/126225}: @ref{65,,getopt} and @ref{a4,,optparse} are no longer marked as
deprecated. There are legitimate reasons to use one of these modules in
preference to @ref{7,,argparse}, and none of these modules are at risk of
being removed from the standard library. Of the three, @code{argparse}
remains the recommended default choice, `unless' one of the concerns noted
at the top of the @code{optparse} module documentation applies.

@item 
gh-124761@footnote{https://github.com/python/cpython/issues/124761}: Add @ref{191a,,SO_REUSEPORT_LB} constant to @ref{d1,,socket}
for FreeBSD.

@item 
gh-121720@footnote{https://github.com/python/cpython/issues/121720}: @ref{4f7,,enum.EnumDict} can now be used without resorting to
private API.

@item 
gh-123424@footnote{https://github.com/python/cpython/issues/123424}: Add @ref{2cc,,zipfile.ZipInfo._for_archive()} setting default
properties on @ref{2cd,,ZipInfo} objects. Patch by Bénédikt Tran
and Jason R. Coombs.

@item 
gh-121676@footnote{https://github.com/python/cpython/issues/121676}: Deprecate calling the Python implementation of
@ref{21c,,functools.reduce()} with a @code{function} or @code{sequence} as a
@ref{f14,,keyword argument}. This will be forbidden in Python 3.16 in order
to match the C implementation.

@item 
gh-112015@footnote{https://github.com/python/cpython/issues/112015}: @ref{1ed,,ctypes.memoryview_at()} now exists to create a
@ref{166,,memoryview} object that refers to the supplied pointer and length.
This works like @ref{1ee,,ctypes.string_at()} except it avoids a buffer copy,
and is typically useful when implementing pure Python callback functions
that are passed dynamically-sized buffers.

@item 
gh-95371@footnote{https://github.com/python/cpython/issues/95371}: Added support for other image formats (PNG, PGM, and PPM) to the
turtle module. Patch by Shin-myoung-serp.
@end itemize

@node Core and Builtins<37>,Library<42>,Library<41>,Python 3 14 0 alpha 4
@anchor{whatsnew/changelog id184}@anchor{191b}
@subsubsection Core and Builtins



@itemize -

@item 
gh-128078@footnote{https://github.com/python/cpython/issues/128078}: Fix a @ref{796,,SystemError} when using @ref{9dc,,anext()} with a
default tuple value. Patch by Bénédikt Tran.

@item 
gh-128717@footnote{https://github.com/python/cpython/issues/128717}: Fix a crash when setting the recursion limit while other
threads are active on the @ref{1f6,,free threaded} build.

@item 
gh-124483@footnote{https://github.com/python/cpython/issues/124483}: Treat @code{Py_DECREF} and variants as escaping when generating
opcode and uop metadata. This prevents the possibility of a @code{__del__}
method causing the JIT to behave incorrectly.

@item 
gh-126703@footnote{https://github.com/python/cpython/issues/126703}: Improve performance of class methods by using a freelist.

@item 
gh-128137@footnote{https://github.com/python/cpython/issues/128137}: Update @ref{1381,,PyASCIIObject} layout to handle interned field
with the atomic operation. Patch by Donghee Na.
@end itemize

@node Library<42>,Core and Builtins<38>,Core and Builtins<37>,Python 3 14 0 alpha 4
@anchor{whatsnew/changelog id185}@anchor{191c}
@subsubsection Library



@itemize -

@item 
gh-128192@footnote{https://github.com/python/cpython/issues/128192}: Upgrade HTTP digest authentication algorithm for
@ref{112,,urllib.request} by supporting SHA-256 digest authentication as
specified in 
@geindex RFC; RFC 7616
RFC 7616@footnote{https://datatracker.ietf.org/doc/html/rfc7616.html}.
@end itemize

@node Core and Builtins<38>,Library<43>,Library<42>,Python 3 14 0 alpha 4
@anchor{whatsnew/changelog id186}@anchor{191d}
@subsubsection Core and Builtins



@itemize -

@item 
gh-126868@footnote{https://github.com/python/cpython/issues/126868}: Increase usage of freelist for @ref{19c,,int} allocation.

@item 
gh-114203@footnote{https://github.com/python/cpython/issues/114203}: Optimize @code{Py_BEGIN_CRITICAL_SECTION} for simple recursive
calls.

@item 
gh-127705@footnote{https://github.com/python/cpython/issues/127705}: Adds stackref debugging when @code{Py_STACKREF_DEBUG} is set.
Finds all double-closes and leaks, logging the origin and last borrow.

Inspired by HPy’s debug mode.
@indicateurl{https://docs.hpyproject.org/en/latest/debug-mode.html}

@item 
gh-128079@footnote{https://github.com/python/cpython/issues/128079}: Fix a bug where @ref{1ad,,except*} does not
properly check the return value of an @ref{4d3,,ExceptionGroup}’s
@ref{191e,,split()} function, leading to a crash in some
cases. Now when @code{split()} returns an invalid
object, @code{except*} raises a @ref{199,,TypeError} with
the original raised @code{ExceptionGroup} object chained to it.

@item 
gh-128030@footnote{https://github.com/python/cpython/issues/128030}: Avoid error from calling @code{PyModule_GetFilenameObject} on a
non-module object when importing a non-existent symbol from a non-module
object.
@end itemize

@node Library<43>,Core and Builtins<39>,Core and Builtins<38>,Python 3 14 0 alpha 4
@anchor{whatsnew/changelog id187}@anchor{191f}
@subsubsection Library



@itemize -

@item 
gh-128035@footnote{https://github.com/python/cpython/issues/128035}: Indicate through @ref{288,,ssl.HAS_PHA} whether the @ref{d5,,ssl}
module supports TLSv1.3 post-handshake client authentication (PHA). Patch
by Will Childs-Klein.
@end itemize

@node Core and Builtins<39>,C API<15>,Library<43>,Python 3 14 0 alpha 4
@anchor{whatsnew/changelog id188}@anchor{1920}
@subsubsection Core and Builtins



@itemize -

@item 
gh-127274@footnote{https://github.com/python/cpython/issues/127274}: Add a new flag, @code{CO_METHOD}, to @ref{1921,,co_flags}
that indicates whether the code object belongs to a function defined in
class scope.

@item 
gh-66409@footnote{https://github.com/python/cpython/issues/66409}: During the @ref{1922,,path initialization}, we now
check if @code{base_exec_prefix} is the same as @code{base_prefix} before
falling back to searching the Python interpreter directory.

@item 
gh-127970@footnote{https://github.com/python/cpython/issues/127970}: We now use the location of the @code{libpython} runtime library
used in the current process to determine @ref{3e4,,sys.base_prefix} on all
platforms implementing the dladdr@footnote{https://pubs.opengroup.org/onlinepubs/9799919799/functions/dladdr.html}
function defined by the UNIX standard — this includes Linux, Android,
macOS, iOS, FreeBSD, etc. This was already the case on Windows and macOS
Framework builds.

@item 
gh-127773@footnote{https://github.com/python/cpython/issues/127773}: Do not use the type attribute cache for types with incompatible
@ref{1923,,MRO}.

@item 
gh-127903@footnote{https://github.com/python/cpython/issues/127903}: @code{Objects/unicodeobject.c}: fix a crash on DEBUG builds in
@code{_copy_characters} when there is nothing to copy.

@item 
gh-127809@footnote{https://github.com/python/cpython/issues/127809}: Fix an issue where the experimental JIT may infer an incorrect
result type for exponentiation (@code{**} and @code{**=}), leading to bugs or
crashes.

@item 
gh-126862@footnote{https://github.com/python/cpython/issues/126862}: Fix a possible overflow when a class inherits from an absurd
number of super-classes. Reported by Valery Fedorenko. Patch by Bénédikt
Tran.
@end itemize

@node C API<15>,Build<16>,Core and Builtins<39>,Python 3 14 0 alpha 4
@anchor{whatsnew/changelog id189}@anchor{1924}
@subsubsection C API



@itemize -

@item 
gh-128400@footnote{https://github.com/python/cpython/issues/128400}: @ref{b80,,Py_FatalError()} no longer shows all threads on the
@ref{1f6,,free threaded} build to prevent crashes.

@item 
gh-128629@footnote{https://github.com/python/cpython/issues/128629}: Add macros @ref{37d,,Py_PACK_VERSION()} and
@ref{37e,,Py_PACK_FULL_VERSION()} for bit-packing Python version numbers.

@item 
gh-128008@footnote{https://github.com/python/cpython/issues/128008}: Add @ref{1925,,PyWeakref_IsDead()} function, which tests if a weak
reference is dead.

@item 
gh-127350@footnote{https://github.com/python/cpython/issues/127350}: Add @ref{391,,Py_fopen()} function to open a file. Similar to the
@code{fopen()} function, but the `path' parameter is a Python object and
an exception is set on error. Add also @ref{392,,Py_fclose()} function to
close a file, function needed for Windows support. Patch by Victor
Stinner.
@end itemize

@node Build<16>,,C API<15>,Python 3 14 0 alpha 4
@anchor{whatsnew/changelog id190}@anchor{1926}
@subsubsection Build



@itemize -

@item 
gh-128627@footnote{https://github.com/python/cpython/issues/128627}: For Emscripten builds the function pointer cast call trampoline
now uses the wasm-gc ref.test instruction if it’s available instead of
Wasm JS type reflection.

@item 
gh-128472@footnote{https://github.com/python/cpython/issues/128472}: Skip BOLT optimization of functions using computed gotos,
fixing errors on build with LLVM 19.

@item 
gh-115765@footnote{https://github.com/python/cpython/issues/115765}: GNU Autoconf 2.72 is now required to generate
@code{configure}. Patch by Erlend Aasland.

@item 
gh-123925@footnote{https://github.com/python/cpython/issues/123925}: Fix building the @ref{2f,,curses} module on platforms with
libncurses but without libncursesw.

@item 
gh-90905@footnote{https://github.com/python/cpython/issues/90905}: Add support for cross-compiling to x86_64 on aarch64/arm64
macOS.

@item 
gh-128321@footnote{https://github.com/python/cpython/issues/128321}: Set @code{LIBS} instead of @code{LDFLAGS} when checking if
@ref{d4,,sqlite3} library functions are available. This fixes the ordering of
linked libraries during checks, which was incorrect when using a
statically linked @code{libsqlite3}.

@item 
gh-100384@footnote{https://github.com/python/cpython/issues/100384}: Error on @code{unguarded-availability} in macOS builds, preventing
invalid use of symbols that are not available in older versions of the OS.

@item 
gh-128104@footnote{https://github.com/python/cpython/issues/128104}: Remove @code{Py_STRFTIME_C99_SUPPORT} conditions in favor of
requiring C99 @code{strftime(3)@footnote{https://manpages.debian.org/strftime(3)}} specifier support at build time. When
cross-compiling, there is no build time check and support is assumed.

@item 
gh-127951@footnote{https://github.com/python/cpython/issues/127951}: Add option @code{--pystats} to the Windows build to enable
performance statistics collection.
@end itemize

@node Python 3 14 0 alpha 3,Python 3 14 0 alpha 2,Python 3 14 0 alpha 4,Changelog
@anchor{whatsnew/changelog python-3-14-0-alpha-3}@anchor{1927}
@subsection Python 3.14.0 alpha 3


`Release date: 2024-12-17'

@menu
* Windows: Windows<14>. 
* Tools/Demos: Tools/Demos<13>. 
* Tests: Tests<15>. 
* Security: Security<18>. 
* Library: Library<44>. 
* Documentation: Documentation<15>. 
* Core and Builtins: Core and Builtins<40>. 
* Library: Library<45>. 
* Core and Builtins: Core and Builtins<41>. 
* C API: C API<16>. 
* Build: Build<17>. 

@end menu

@node Windows<14>,Tools/Demos<13>,,Python 3 14 0 alpha 3
@anchor{whatsnew/changelog id191}@anchor{1928}
@subsubsection Windows



@itemize -

@item 
gh-127353@footnote{https://github.com/python/cpython/issues/127353}: Allow to force color output on Windows using environment
variables. Patch by Andrey Efremov.

@item 
gh-125729@footnote{https://github.com/python/cpython/issues/125729}: Makes the presence of the @ref{108,,turtle} module dependent on the
Tcl/Tk installer option. Previously, the module was always installed but
would be unusable without Tcl/Tk.
@end itemize

@node Tools/Demos<13>,Tests<15>,Windows<14>,Python 3 14 0 alpha 3
@anchor{whatsnew/changelog id192}@anchor{1929}
@subsubsection Tools/Demos



@itemize -

@item 
gh-126700@footnote{https://github.com/python/cpython/issues/126700}: Add support for multi-argument @ref{67,,gettext} functions in
@code{pygettext.py}.
@end itemize

@node Tests<15>,Security<18>,Tools/Demos<13>,Python 3 14 0 alpha 3
@anchor{whatsnew/changelog id193}@anchor{192a}
@subsubsection Tests



@itemize -

@item 
gh-127906@footnote{https://github.com/python/cpython/issues/127906}: Test the limited C API in test_cppext. Patch by Victor Stinner.

@item 
gh-127637@footnote{https://github.com/python/cpython/issues/127637}: Add tests for the @ref{3c,,dis} command-line interface. Patch by
Bénédikt Tran.

@item 
gh-126925@footnote{https://github.com/python/cpython/issues/126925}: iOS test results are now streamed during test execution, and
the deprecated xcresulttool is no longer used.

@item 
gh-127076@footnote{https://github.com/python/cpython/issues/127076}: Disable strace based system call tests when LD_PRELOAD is set.

@item 
gh-127076@footnote{https://github.com/python/cpython/issues/127076}: Filter out memory-related @code{mmap}, @code{munmap}, and
@code{mprotect}  calls from file-related ones when testing @ref{83,,io} behavior
using strace.
@end itemize

@node Security<18>,Library<44>,Tests<15>,Python 3 14 0 alpha 3
@anchor{whatsnew/changelog id194}@anchor{192b}
@subsubsection Security



@itemize -

@item 
gh-127655@footnote{https://github.com/python/cpython/issues/127655}: Fixed the
@code{asyncio.selector_events._SelectorSocketTransport} transport not
pausing writes for the protocol when the buffer reaches the high water
mark when using @ref{1818,,asyncio.WriteTransport.writelines()}.
@end itemize

@node Library<44>,Documentation<15>,Security<18>,Python 3 14 0 alpha 3
@anchor{whatsnew/changelog id195}@anchor{192c}
@subsubsection Library



@itemize -

@item 
gh-126907@footnote{https://github.com/python/cpython/issues/126907}: Fix crash when using @ref{d,,atexit} concurrently on the
@ref{1f6,,free-threaded} build.

@item 
gh-127870@footnote{https://github.com/python/cpython/issues/127870}: Detect recursive calls in ctypes @code{_as_parameter_} handling.
Patch by Victor Stinner.

@item 
gh-127732@footnote{https://github.com/python/cpython/issues/127732}: The @ref{af,,platform} module now correctly detects Windows Server
2025.

@item 
gh-126789@footnote{https://github.com/python/cpython/issues/126789}: Fixed @ref{29a,,sysconfig.get_config_vars()},
@ref{33e,,sysconfig.get_paths()}, and siblings, returning outdated cached data
if the value  of @ref{3e5,,sys.prefix} or @ref{3e9,,sys.exec_prefix} changes.
Overwriting @code{sys.prefix} or @code{sys.exec_prefix} still is
discouraged, as that might break other parts of the code.

@item 
gh-127718@footnote{https://github.com/python/cpython/issues/127718}: Add colour to @ref{e9,,test.regrtest} output. Patch by Hugo van
Kemenade.

@item 
gh-127610@footnote{https://github.com/python/cpython/issues/127610}: Added validation for more than one var-positional or
var-keyword parameters in @ref{4e4,,inspect.Signature}. Patch by Maxim
Ageev.

@item 
gh-127627@footnote{https://github.com/python/cpython/issues/127627}: Added @code{posix._emscripten_debugger()} to help with debugging
the test suite on the Emscripten target.

@item 
gh-126821@footnote{https://github.com/python/cpython/issues/126821}: macOS and iOS apps can now choose to redirect stdout and stderr
to the system log during interpreter configuration.

@item 
gh-93312@footnote{https://github.com/python/cpython/issues/93312}: Include @code{<sys/pidfd.h>} to get @code{os.PIDFD_NONBLOCK} constant.
Patch by Victor Stinner.

@item 
gh-127481@footnote{https://github.com/python/cpython/issues/127481}: Add the @code{EPOLLWAKEUP} constant to the @ref{c6,,select} module.

@item 
gh-127065@footnote{https://github.com/python/cpython/issues/127065}: Make @ref{103a,,operator.methodcaller()} thread-safe and re-entrant
safe.

@item 
gh-127321@footnote{https://github.com/python/cpython/issues/127321}: @ref{274,,pdb.set_trace()} will not stop at an opcode that does not
have an associated line number anymore.

@item 
gh-127429@footnote{https://github.com/python/cpython/issues/127429}: Fixed bug where, on cross-builds, the @ref{e1,,sysconfig} POSIX
data was being generated with the host Python’s @code{Makefile}. The data is
now generated from current build’s @code{Makefile}.

@item 
gh-127413@footnote{https://github.com/python/cpython/issues/127413}: Add the @ref{20b,,dis --specialized} command-line option to show
specialized bytecode. Patch by Bénédikt Tran.

@item 
gh-125413@footnote{https://github.com/python/cpython/issues/125413}: Revert addition of @code{pathlib.Path.scandir()}. This method
was added in 3.14.0a2. The optimizations remain for file system paths, but
other subclasses should only have to implement
@ref{270,,pathlib.Path.iterdir()}.

@item 
gh-127257@footnote{https://github.com/python/cpython/issues/127257}: In @ref{d5,,ssl}, system call failures that OpenSSL reports using
@code{ERR_LIB_SYS} are now raised as @ref{2c2,,OSError}.

@item 
gh-59705@footnote{https://github.com/python/cpython/issues/59705}: On Linux, @ref{177,,threading.Thread} now sets the thread name to
the operating system. Patch by Victor Stinner.

@item 
gh-127303@footnote{https://github.com/python/cpython/issues/127303}: Publicly expose @ref{192d,,EXACT_TOKEN_TYPES} in
@code{token.__all__}.

@item 
gh-127331@footnote{https://github.com/python/cpython/issues/127331}: @ref{d5,,ssl} can show descriptions for errors added in OpenSSL
3.4.

@item 
gh-123967@footnote{https://github.com/python/cpython/issues/123967}: Fix faulthandler for trampoline frames. If the top-most frame
is a trampoline frame, skip it. Patch by Victor Stinner.

@item 
gh-127178@footnote{https://github.com/python/cpython/issues/127178}: A @code{_sysconfig_vars_(...).json} file is now shipped in the
standard library directory. It contains the output of
@ref{29a,,sysconfig.get_config_vars()} on the default environment encoded as
JSON data. This is an implementation detail, and may change at any time.

@item 
gh-127072@footnote{https://github.com/python/cpython/issues/127072}: Remove outdated @code{socket.NETLINK_*} constants not present in
Linux kernels beyond 2.6.17.

@item 
gh-127255@footnote{https://github.com/python/cpython/issues/127255}: The @ref{1ec,,CopyComPointer()} function is now public.
Previously, this was private and only available in @code{_ctypes}.

@item 
gh-127182@footnote{https://github.com/python/cpython/issues/127182}: Fix @code{io.StringIO.__setstate__()} crash, when @ref{887,,None}
was passed as the first value.

@item 
gh-127217@footnote{https://github.com/python/cpython/issues/127217}: Fix @ref{2c1,,urllib.request.pathname2url()} for paths starting with
multiple slashes on Posix.

@item 
gh-125866@footnote{https://github.com/python/cpython/issues/125866}: @ref{2c1,,urllib.request.pathname2url()} now adds an empty authority
when generating a URL for a path that begins with exactly one slash. For
example, the path @code{/etc/hosts} is converted to the scheme-less URL
@code{///etc/hosts}. As a result of this change, URLs without authorities are
only generated for relative paths.

@item 
gh-127221@footnote{https://github.com/python/cpython/issues/127221}: Add colour to @ref{10d,,unittest} output. Patch by Hugo van
Kemenade.

@item 
gh-127035@footnote{https://github.com/python/cpython/issues/127035}: Fix @ref{6dc,,shutil.which} on Windows. Now it looks at direct
match if and only if the command ends with a PATHEXT extension or X_OK is
not in mode. Support extensionless files if “.” is in PATHEXT. Support
PATHEXT extensions that end with a dot.

@item 
gh-122273@footnote{https://github.com/python/cpython/issues/122273}: Support PyREPL history on Windows. Patch by devdanzin and
Victor Stinner.

@item 
gh-125866@footnote{https://github.com/python/cpython/issues/125866}: @ref{2c1,,urllib.request.pathname2url()} and
@ref{2bf,,url2pathname()} no longer convert Windows drive
letters to uppercase.

@item 
gh-127078@footnote{https://github.com/python/cpython/issues/127078}: Fix issue where @ref{2bf,,urllib.request.url2pathname()} failed to
discard an extra slash before a UNC drive in the URL path on Windows.

@item 
gh-126766@footnote{https://github.com/python/cpython/issues/126766}: Fix issue where @ref{2bf,,urllib.request.url2pathname()} failed to
discard any ‘localhost’ authority present in the URL.

@item 
gh-127065@footnote{https://github.com/python/cpython/issues/127065}: Fix crash when calling a @ref{103a,,operator.methodcaller()} instance
from multiple threads in the free threading build.

@item 
gh-127090@footnote{https://github.com/python/cpython/issues/127090}: Fix value of @ref{192e,,urllib.response.addinfourl.url} for
@code{file:} URLs that express relative paths and absolute Windows paths. The
canonical URL generated by @ref{2c1,,urllib.request.pathname2url()} is now
used.

@item 
gh-126992@footnote{https://github.com/python/cpython/issues/126992}: Fix LONG and INT opcodes to only use base 10 for string to
integer conversion in @ref{ab,,pickle}.

@item 
gh-126997@footnote{https://github.com/python/cpython/issues/126997}: Fix support of STRING and GLOBAL opcodes with non-ASCII
arguments in @ref{ac,,pickletools}. @ref{ec4,,pickletools.dis()} now outputs
non-ASCII bytes in STRING, BINSTRING and SHORT_BINSTRING arguments as
escaped (@code{\xXX}).

@item 
gh-126316@footnote{https://github.com/python/cpython/issues/126316}: @ref{6a,,grp}: Make @ref{192f,,grp.getgrall()} thread-safe by adding a
mutex. Patch by Victor Stinner.

@item 
gh-126618@footnote{https://github.com/python/cpython/issues/126618}: Fix the representation of @ref{148f,,itertools.count} objects when
the count value is @ref{13d1,,sys.maxsize}.

@item 
gh-126615@footnote{https://github.com/python/cpython/issues/126615}: The @ref{1eb,,COMError} exception is now public.
Previously, this was private and only available in @code{_ctypes}.

@item 
gh-126985@footnote{https://github.com/python/cpython/issues/126985}: When running under a virtual environment with the @ref{cc,,site}
disabled (see @ref{13b4,,-S}), @ref{3e5,,sys.prefix} and
@ref{3e4,,sys.base_prefix} will now point to the virtual environment, instead
of the base installation.

@item 
gh-112192@footnote{https://github.com/python/cpython/issues/112192}: In the @ref{104,,trace} module, increase the coverage precision
(@code{cov%}) to one decimal.

@item 
gh-118761@footnote{https://github.com/python/cpython/issues/118761}: Improve import time of @ref{93,,mimetypes} by around 11-16 times.
Patch by Hugo van Kemenade.

@item 
gh-126947@footnote{https://github.com/python/cpython/issues/126947}: Raise @ref{199,,TypeError} in
@code{_pydatetime.timedelta.__new__()} if the passed arguments are not
@ref{19c,,int} or @ref{197,,float}, so that the Python implementation is in
line with the C implementation.

@item 
gh-126946@footnote{https://github.com/python/cpython/issues/126946}: Improve the @ref{1930,,GetoptError} error message when a
long option prefix matches multiple accepted options in
@ref{16c7,,getopt.getopt()} and @ref{16c6,,getopt.gnu_getopt()}.

@item 
gh-126899@footnote{https://github.com/python/cpython/issues/126899}: Make tkinter widget methods @code{after()} and
@code{after_idle()} accept arguments passed by keyword.

@item 
gh-85168@footnote{https://github.com/python/cpython/issues/85168}: Fix issue where @ref{2bf,,urllib.request.url2pathname()} and
@ref{2c1,,pathname2url()} always used UTF-8 when quoting and
unquoting file URIs. They now use the @ref{75e,,filesystem encoding and error handler}.

@item 
gh-126780@footnote{https://github.com/python/cpython/issues/126780}: Fix @ref{1525,,os.path.normpath()} for drive-relative paths on
Windows.

@item 
gh-126775@footnote{https://github.com/python/cpython/issues/126775}: Make @ref{1931,,linecache.checkcache()} thread safe and GC
re-entrancy safe.

@item 
gh-126601@footnote{https://github.com/python/cpython/issues/126601}: Fix issue where @ref{2c1,,urllib.request.pathname2url()} raised
@ref{2c2,,OSError} when given a Windows path containing a colon character not
following a drive letter, such as before an NTFS alternate data stream.

@item 
gh-126727@footnote{https://github.com/python/cpython/issues/126727}: @code{locale.nl_langinfo(locale.ERA)} now returns multiple era
description segments separated by semicolons. Previously it only returned
the first segment on platforms with Glibc.

@item 
gh-85046@footnote{https://github.com/python/cpython/issues/85046}: Add @ref{20d,,EHWPOISON} error code to @ref{5b,,errno}.

@item 
gh-118201@footnote{https://github.com/python/cpython/issues/118201}: Fixed intermittent failures of @ref{1932,,os.confstr},
@ref{1307,,os.pathconf} and @ref{1933,,os.sysconf} on iOS and Android.

@item 
gh-86463@footnote{https://github.com/python/cpython/issues/86463}: The @code{usage} parameter of @ref{1bf,,argparse.ArgumentParser} no
longer affects the default value of the @code{prog} parameter in subparsers.

@item 
gh-124008@footnote{https://github.com/python/cpython/issues/124008}: Fix possible crash (in debug build), incorrect output or
returning incorrect value from raw binary @code{write()} when writing to
console on Windows.

@item 
gh-123401@footnote{https://github.com/python/cpython/issues/123401}: The @ref{75,,http.cookies} module now supports parsing obsolete
@geindex RFC; RFC 850
RFC 850@footnote{https://datatracker.ietf.org/doc/html/rfc850.html} date formats, in accordance with 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html} requirements.
Patch by Nano Zheng.

@item 
gh-122431@footnote{https://github.com/python/cpython/issues/122431}: @ref{1057,,readline.append_history_file()} now raises a
@ref{2ee,,ValueError} when given a negative value.

@item 
gh-122356@footnote{https://github.com/python/cpython/issues/122356}: Guarantee that the position of a file-like object passed to
@ref{1536,,zipfile.is_zipfile()} is left untouched after the call. Patch by
Bénédikt Tran.

@item 
gh-122288@footnote{https://github.com/python/cpython/issues/122288}: Improve the performances of @ref{1898,,fnmatch.translate()} by a
factor 1.7. Patch by Bénédikt Tran.

@item 
gh-88110@footnote{https://github.com/python/cpython/issues/88110}: Fixed @ref{254,,multiprocessing.Process} reporting a @code{.exitcode}
of 1 even on success when using the @code{"fork"} start method while using a
@ref{94e,,concurrent.futures.ThreadPoolExecutor}.

@item 
gh-97514@footnote{https://github.com/python/cpython/issues/97514}: Authentication was added to the @ref{98,,multiprocessing}
forkserver start method control socket so that only processes with the
authentication key generated by the process that spawned the forkserver
can control it.  This is an enhancement over the other gh-97514@footnote{https://github.com/python/cpython/issues/97514} fixes
so that access is no longer limited only by filesystem permissions.

The file descriptor exchange of control pipes with the forked worker
process now requires an explicit acknowledgement byte to be sent over the
socket after the exchange on all forkserver supporting platforms. That
makes testing the above much easier.
@end itemize

@node Documentation<15>,Core and Builtins<40>,Library<44>,Python 3 14 0 alpha 3
@anchor{whatsnew/changelog id196}@anchor{1934}
@subsubsection Documentation



@itemize -

@item 
gh-127347@footnote{https://github.com/python/cpython/issues/127347}: Publicly expose @ref{1935,,traceback.print_list()} in
@code{traceback.__all__}.
@end itemize

@node Core and Builtins<40>,Library<45>,Documentation<15>,Python 3 14 0 alpha 3
@anchor{whatsnew/changelog id197}@anchor{1936}
@subsubsection Core and Builtins



@itemize -

@item 
gh-127740@footnote{https://github.com/python/cpython/issues/127740}: Fix error message in @ref{191,,bytes.fromhex()} when given an odd
number of digits to properly indicate that an even number of hexadecimal
digits is required.

@item 
gh-127058@footnote{https://github.com/python/cpython/issues/127058}: @code{PySequence_Tuple} now creates the resulting tuple
atomically, preventing partially created tuples being visible to the
garbage collector or through @code{gc.get_referrers()}

@item 
gh-127599@footnote{https://github.com/python/cpython/issues/127599}: Fix statistics for increments of object reference counts (in
particular, when a reference count was increased by more than 1 in a
single operation).

@item 
gh-127651@footnote{https://github.com/python/cpython/issues/127651}: When raising @ref{65b,,ImportError} for missing symbols in @code{from}
imports, use @code{__file__} in the error message if @code{__spec__.origin} is
not a location

@item 
gh-127582@footnote{https://github.com/python/cpython/issues/127582}: Fix non-thread-safe object resurrection when calling finalizers
and watcher callbacks in the free threading build.

@item 
gh-127434@footnote{https://github.com/python/cpython/issues/127434}: The iOS compiler shims can now accept arguments with spaces.

@item 
gh-127536@footnote{https://github.com/python/cpython/issues/127536}: Add missing locks around some list assignment operations in the
free threading build.

@item 
gh-127085@footnote{https://github.com/python/cpython/issues/127085}: Fix race when exporting a buffer from a @ref{166,,memoryview}
object on the @ref{1f6,,free-threaded} build.

@item 
gh-127238@footnote{https://github.com/python/cpython/issues/127238}: Correct error message for @ref{1769,,sys.set_int_max_str_digits()}.

@item 
gh-113841@footnote{https://github.com/python/cpython/issues/113841}: Fix possible undefined behavior division by zero in
@ref{198,,complex}’s @ref{1937,,_Py_c_pow()}.
@end itemize

@node Library<45>,Core and Builtins<41>,Core and Builtins<40>,Python 3 14 0 alpha 3
@anchor{whatsnew/changelog id198}@anchor{1938}
@subsubsection Library



@itemize -

@item 
gh-127133@footnote{https://github.com/python/cpython/issues/127133}: Calling @ref{2ed,,argparse.ArgumentParser.add_argument_group()} on
an argument group, and calling
@code{argparse.ArgumentParser.add_argument_group()} or
@ref{2ef,,argparse.ArgumentParser.add_mutually_exclusive_group()} on a mutually
exclusive group now raise exceptions. This nesting was never supported,
often failed to work correctly, and was unintentionally exposed through
inheritance. This functionality has been deprecated since Python 3.11.
@end itemize

@node Core and Builtins<41>,C API<16>,Library<45>,Python 3 14 0 alpha 3
@anchor{whatsnew/changelog id199}@anchor{1939}
@subsubsection Core and Builtins



@itemize -

@item 
gh-126491@footnote{https://github.com/python/cpython/issues/126491}: Add a marking phase to the GC. All objects that can be
transitively reached from builtin modules or the stacks are marked as
reachable before cycle detection. This reduces the amount of work done by
the GC by approximately half.

@item 
gh-127020@footnote{https://github.com/python/cpython/issues/127020}: Fix a crash in the free threading build when
@ref{981,,PyCode_GetCode()}, @ref{982,,PyCode_GetVarnames()},
@ref{983,,PyCode_GetCellvars()}, or @ref{984,,PyCode_GetFreevars()} were called
from multiple threads at the same time.

@item 
gh-127010@footnote{https://github.com/python/cpython/issues/127010}: Simplify GC tracking of dictionaries. All dictionaries are
tracked when created, rather than being lazily tracked when a trackable
object was added to them. This simplifies the code considerably and
results in a slight speedup.

@item 
gh-126980@footnote{https://github.com/python/cpython/issues/126980}: Fix @ref{68d,,__buffer__()} of @ref{342,,bytearray} crashing
when @ref{193a,,READ} or
@ref{193b,,WRITE} are passed as flags.

@item 
gh-126937@footnote{https://github.com/python/cpython/issues/126937}: Fix @ref{199,,TypeError} when a @ref{1e7,,ctypes.Structure} has a
field size that doesn’t fit into an unsigned 16-bit integer. Instead, the
maximum number of `bits' is @ref{13d1,,sys.maxsize}.

@item 
gh-126868@footnote{https://github.com/python/cpython/issues/126868}: Increase performance of @ref{19c,,int} by adding a freelist for
compact ints.

@item 
gh-126881@footnote{https://github.com/python/cpython/issues/126881}: Fix crash in finalization of dtoa state. Patch by Kumar Aditya.

@item 
gh-126892@footnote{https://github.com/python/cpython/issues/126892}: Require cold or invalidated code to “warm up” before being JIT
compiled again.

@item 
gh-126091@footnote{https://github.com/python/cpython/issues/126091}: Ensure stack traces are complete when throwing into a generator
chain that ends in a custom generator.

@item 
gh-126024@footnote{https://github.com/python/cpython/issues/126024}: Optimize decoding of short UTF-8 sequences containing non-ASCII
characters by approximately 15%.

@item 
gh-125420@footnote{https://github.com/python/cpython/issues/125420}: Add @ref{193c,,memoryview.index()} to @ref{166,,memoryview} objects.
Patch by Bénédikt Tran.

@item 
gh-125420@footnote{https://github.com/python/cpython/issues/125420}: Add @ref{193d,,memoryview.count()} to @ref{166,,memoryview} objects.
Patch by Bénédikt Tran.

@item 
gh-124470@footnote{https://github.com/python/cpython/issues/124470}: Fix crash in free-threaded builds when replacing object
dictionary while reading attribute on another thread

@item 
gh-69639@footnote{https://github.com/python/cpython/issues/69639}: Implement mixed-mode arithmetic rules combining real and complex
numbers as specified by C standards since C99.  Patch by Sergey B
Kirpichev.

@item 
gh-120010@footnote{https://github.com/python/cpython/issues/120010}: Correct invalid corner cases which resulted in @code{(nan+nanj)}
output in complex multiplication, e.g., @code{(1e300+1j)*(nan+infj)}.  Patch
by Sergey B Kirpichev.

@item 
gh-109746@footnote{https://github.com/python/cpython/issues/109746}: If @code{_thread.start_new_thread()} fails to start a new
thread, it deletes its state from interpreter and thus avoids its repeated
cleanup on finalization.
@end itemize

@node C API<16>,Build<17>,Core and Builtins<41>,Python 3 14 0 alpha 3
@anchor{whatsnew/changelog id200}@anchor{193e}
@subsubsection C API



@itemize -

@item 
gh-127896@footnote{https://github.com/python/cpython/issues/127896}: The previously undocumented function @ref{3d6,,PySequence_In()} is
@ref{23f,,soft deprecated}. Use @ref{3d7,,PySequence_Contains()} instead.

@item 
gh-127791@footnote{https://github.com/python/cpython/issues/127791}: Fix loss of callbacks after more than one call to
@ref{193f,,PyUnstable_AtExit()}.

@item 
gh-127691@footnote{https://github.com/python/cpython/issues/127691}: The @ref{45f,,Unicode Exception Objects} C API
now raises a @ref{199,,TypeError} if its exception argument is not a
@ref{460,,UnicodeError} object. Patch by Bénédikt Tran.

@item 
gh-123378@footnote{https://github.com/python/cpython/issues/123378}: Ensure that the value of @ref{1907,,UnicodeEncodeError.end} retrieved by @ref{1940,,PyUnicodeEncodeError_GetEnd()}
lies in @code{[min(1, objlen), max(min(1, objlen), objlen)]} where `objlen'
is the length of @ref{1941,,UnicodeEncodeError.object}.
Similar arguments apply to @ref{c0e,,UnicodeDecodeError} and
@ref{1942,,UnicodeTranslateError} and their corresponding C interface. Patch by
Bénédikt Tran.

@item 
gh-127314@footnote{https://github.com/python/cpython/issues/127314}: Improve error message when calling the C API without an active
thread state on the @ref{1f6,,free-threaded} build.

@item 
gh-123378@footnote{https://github.com/python/cpython/issues/123378}: Ensure that the value of @ref{1906,,UnicodeEncodeError.start} retrieved by @ref{1943,,PyUnicodeEncodeError_GetStart()}
lies in @code{[0, max(0, objlen - 1)]} where `objlen' is the length of
@ref{1941,,UnicodeEncodeError.object}. Similar arguments
apply to @ref{c0e,,UnicodeDecodeError} and @ref{1942,,UnicodeTranslateError} and
their corresponding C interface. Patch by Bénédikt Tran.

@item 
gh-109523@footnote{https://github.com/python/cpython/issues/109523}: Reading text from a non-blocking stream with @code{read} may now
raise a @ref{237,,BlockingIOError} if the operation cannot immediately return
bytes.

@item 
gh-102471@footnote{https://github.com/python/cpython/issues/102471}: Add a new import and export API for Python @ref{19c,,int} objects
(
@geindex Python Enhancement Proposals; PEP 757
PEP 757@footnote{https://peps.python.org/pep-0757/}):


@itemize *

@item 
@ref{3a5,,PyLong_GetNativeLayout()};

@item 
@ref{3a6,,PyLong_Export()};

@item 
@ref{3a7,,PyLong_FreeExport()};

@item 
@ref{3a8,,PyLongWriter_Create()};

@item 
@ref{3a9,,PyLongWriter_Finish()};

@item 
@ref{3aa,,PyLongWriter_Discard()}.
@end itemize

Patch by Victor Stinner.

@item 
gh-121058@footnote{https://github.com/python/cpython/issues/121058}: @code{PyThreadState_Clear()} now warns (and calls
@code{sys.excepthook}) if the thread state still has an active exception.
@end itemize

@node Build<17>,,C API<16>,Python 3 14 0 alpha 3
@anchor{whatsnew/changelog id201}@anchor{1944}
@subsubsection Build



@itemize -

@item 
gh-127865@footnote{https://github.com/python/cpython/issues/127865}: Fix build failure on systems without thread-locals support.

@item 
gh-127629@footnote{https://github.com/python/cpython/issues/127629}: Emscripten builds now include ctypes support.

@item 
gh-127111@footnote{https://github.com/python/cpython/issues/127111}: Updated the Emscripten web example to use ES6 modules and be
built into a distinct @code{web_example} subfolder.

@item 
gh-115869@footnote{https://github.com/python/cpython/issues/115869}: Make @code{jit_stencils.h} (which is produced during JIT builds)
reproducible.

@item 
gh-126898@footnote{https://github.com/python/cpython/issues/126898}: The Emscripten build of Python is now based on ES6 modules.
@end itemize

@node Python 3 14 0 alpha 2,Python 3 14 0 alpha 1,Python 3 14 0 alpha 3,Changelog
@anchor{whatsnew/changelog python-3-14-0-alpha-2}@anchor{1945}
@subsection Python 3.14.0 alpha 2


`Release date: 2024-11-19'

@menu
* Windows: Windows<15>. 
* Tools/Demos: Tools/Demos<14>. 
* Tests: Tests<16>. 
* Security: Security<19>. 
* Library: Library<46>. 
* Documentation: Documentation<16>. 
* Core and Builtins: Core and Builtins<42>. 
* Library: Library<47>. 
* Core and Builtins: Core and Builtins<43>. 
* Library: Library<48>. 
* Core and Builtins: Core and Builtins<44>. 
* Library: Library<49>. 
* C API: C API<17>. 
* Build: Build<18>. 

@end menu

@node Windows<15>,Tools/Demos<14>,,Python 3 14 0 alpha 2
@anchor{whatsnew/changelog id202}@anchor{1946}
@subsubsection Windows



@itemize -

@item 
gh-126911@footnote{https://github.com/python/cpython/issues/126911}: Update credits command output.

@item 
gh-118973@footnote{https://github.com/python/cpython/issues/118973}: Ensures the experimental free-threaded install includes the
@code{_tkinter} module. The optional Tcl/Tk component must also be installed
in order for the module to work.

@item 
gh-126497@footnote{https://github.com/python/cpython/issues/126497}: Fixes venv failure due to missing redirector executables in
experimental free-threaded installs.

@item 
gh-126074@footnote{https://github.com/python/cpython/issues/126074}: Removed unnecessary DLLs from Windows embeddable package

@item 
gh-125315@footnote{https://github.com/python/cpython/issues/125315}: Avoid crashing in @ref{af,,platform} due to slow WMI calls on some
Windows machines.

@item 
gh-126084@footnote{https://github.com/python/cpython/issues/126084}: Fix venvwlauncher to launch pythonw instead of python so no
extra console window is created.

@item 
gh-125842@footnote{https://github.com/python/cpython/issues/125842}: Fix a @ref{796,,SystemError} when @ref{279,,sys.exit()} is called with
@code{0xffffffff} on Windows.

@item 
gh-125550@footnote{https://github.com/python/cpython/issues/125550}: Enable the @ref{7db,,Python install manager} to detect Python 3.14 installs from
the Windows Store.

@item 
gh-123803@footnote{https://github.com/python/cpython/issues/123803}: All Windows code pages are now supported as “cpXXX” codecs on
Windows.
@end itemize

@node Tools/Demos<14>,Tests<16>,Windows<15>,Python 3 14 0 alpha 2
@anchor{whatsnew/changelog id203}@anchor{1947}
@subsubsection Tools/Demos



@itemize -

@item 
gh-126807@footnote{https://github.com/python/cpython/issues/126807}: Fix extraction warnings in @code{pygettext.py} caused by
mistaking function definitions for function calls.

@item 
gh-126167@footnote{https://github.com/python/cpython/issues/126167}: The iOS testbed was modified so that it can be used by
third-party projects for testing purposes.
@end itemize

@node Tests<16>,Security<19>,Tools/Demos<14>,Python 3 14 0 alpha 2
@anchor{whatsnew/changelog id204}@anchor{1948}
@subsubsection Tests



@itemize -

@item 
gh-126909@footnote{https://github.com/python/cpython/issues/126909}: Fix test_os extended attribute tests to work on filesystems
with 1 KiB xattr size limit.

@item 
gh-125730@footnote{https://github.com/python/cpython/issues/125730}: Change @code{make test} to not run GUI tests by default. Use
@code{make ci} to run tests with GUI tests instead.

@item 
gh-124295@footnote{https://github.com/python/cpython/issues/124295}: Add translation tests to the @ref{7,,argparse} module.
@end itemize

@node Security<19>,Library<46>,Tests<16>,Python 3 14 0 alpha 2
@anchor{whatsnew/changelog id205}@anchor{1949}
@subsubsection Security



@itemize -

@item 
gh-126623@footnote{https://github.com/python/cpython/issues/126623}: Upgrade libexpat to 2.6.4
@end itemize

@node Library<46>,Documentation<16>,Security<19>,Python 3 14 0 alpha 2
@anchor{whatsnew/changelog id206}@anchor{194a}
@subsubsection Library



@itemize -

@item 
gh-85957@footnote{https://github.com/python/cpython/issues/85957}: Add missing MIME types for images with RFCs: emf, fits, g3fax,
jp2, jpm, jpx, t38, tiff-fx and wmf. Patch by Hugo van Kemenade.

@item 
gh-126920@footnote{https://github.com/python/cpython/issues/126920}: Fix the @code{prefix} and @code{exec_prefix} keys from
@ref{29a,,sysconfig.get_config_vars()} incorrectly having the same value as
@ref{3e4,,sys.base_prefix} and @ref{3e8,,sys.base_exec_prefix},
respectively, inside virtual environments. They now accurately reflect
@ref{3e5,,sys.prefix} and @ref{3e9,,sys.exec_prefix}.

@item 
gh-67877@footnote{https://github.com/python/cpython/issues/67877}: Fix memory leaks when @ref{be,,regular expression} matching
terminates abruptly, either because of a signal or because memory
allocation fails.

@item 
gh-125063@footnote{https://github.com/python/cpython/issues/125063}: @ref{91,,marshal} now supports @ref{695,,slice} objects. The marshal
format version was increased to 5.

@item 
gh-126789@footnote{https://github.com/python/cpython/issues/126789}: Fixed the values of @ref{29a,,sysconfig.get_config_vars()},
@ref{33e,,sysconfig.get_paths()}, and their siblings when the @ref{cc,,site}
initialization happens after @ref{e1,,sysconfig} has built a cache for
@code{sysconfig.get_config_vars()}.

@item 
gh-126188@footnote{https://github.com/python/cpython/issues/126188}: Update bundled pip to 24.3.1

@item 
gh-126766@footnote{https://github.com/python/cpython/issues/126766}: Fix issue where @ref{2bf,,urllib.request.url2pathname()} failed to
discard two leading slashes introducing an empty authority section.

@item 
gh-126705@footnote{https://github.com/python/cpython/issues/126705}: Allow @ref{e51,,os.PathLike} to be a base for Protocols.

@item 
gh-126699@footnote{https://github.com/python/cpython/issues/126699}: Allow @ref{fe4,,collections.abc.AsyncIterator} to be a base for
Protocols.

@item 
gh-126654@footnote{https://github.com/python/cpython/issues/126654}: Fix crash when non-dict was passed to several functions in
@code{_interpreters} module.

@item 
gh-104745@footnote{https://github.com/python/cpython/issues/104745}: Limit starting a patcher (from @ref{1098,,unittest.mock.patch()} or
@ref{194b,,unittest.mock.patch.object()}) more than once without stopping it

@item 
gh-126595@footnote{https://github.com/python/cpython/issues/126595}: Fix a crash when instantiating @ref{148f,,itertools.count} with an
initial count of @ref{13d1,,sys.maxsize} on debug builds. Patch by Bénédikt
Tran.

@item 
gh-120423@footnote{https://github.com/python/cpython/issues/120423}: Fix issue where @ref{2c1,,urllib.request.pathname2url()} mishandled
Windows paths with embedded forward slashes.

@item 
gh-126565@footnote{https://github.com/python/cpython/issues/126565}: Improve performances of @ref{194c,,zipfile.Path.open()} for
non-reading modes.

@item 
gh-126505@footnote{https://github.com/python/cpython/issues/126505}: Fix bugs in compiling case-insensitive @ref{be,,regular expressions} with character classes containing non-BMP characters:
upper-case non-BMP character did was ignored and the ASCII flag was
ignored when matching a character range whose upper bound is beyond the
BMP region.

@item 
gh-117378@footnote{https://github.com/python/cpython/issues/117378}: Fixed the @ref{98,,multiprocessing} @code{"forkserver"} start method
forkserver process to correctly inherit the parent’s @ref{3e2,,sys.path}
during the importing of @ref{194d,,multiprocessing.set_forkserver_preload()}
modules in the same manner as @code{sys.path} is configured in workers
before executing work items.

This bug caused some forkserver module preloading to silently fail to
preload. This manifested as a performance degradation in child processes
when the @code{sys.path} was required due to additional repeated work in
every worker.

It could also have a side effect of @code{""} remaining in @ref{3e2,,sys.path}
during forkserver preload imports instead of the absolute path from
@ref{194e,,os.getcwd()} at multiprocessing import time used in the worker
@code{sys.path}.

The @code{sys.path} differences between phases in the child process could
potentially have caused preload to import incorrect things from the wrong
location.  We are unaware of that actually having happened in practice.

@item 
gh-125679@footnote{https://github.com/python/cpython/issues/125679}: The @ref{189c,,multiprocessing.Lock} and
@ref{189d,,multiprocessing.RLock} @code{repr} values no longer say “unknown” on
macOS.

@item 
gh-126476@footnote{https://github.com/python/cpython/issues/126476}: Raise @ref{179e,,calendar.IllegalMonthError} (now a subclass of
@ref{1741,,IndexError}) for @ref{194f,,calendar.month()} when the input month is
not correct.

@item 
gh-126489@footnote{https://github.com/python/cpython/issues/126489}: The Python implementation of @ref{ab,,pickle} no longer calls
@ref{1950,,pickle.Pickler.persistent_id()} for the result of
@code{persistent_id()}.

@item 
gh-126451@footnote{https://github.com/python/cpython/issues/126451}: Register the @ref{178,,contextvars.Context} type to
@ref{acd,,collections.abc.Mapping}.

@item 
gh-126175@footnote{https://github.com/python/cpython/issues/126175}: Add @code{msg}, @code{doc}, @code{pos}, @code{lineno} and @code{colno}
attributes to @ref{1951,,tomllib.TOMLDecodeError}. Deprecate instantiating with
free-form arguments.

@item 
gh-89416@footnote{https://github.com/python/cpython/issues/89416}: Add 
@geindex RFC; RFC 9559
RFC 9559@footnote{https://datatracker.ietf.org/doc/html/rfc9559.html} MIME types for Matroska audiovisual container
formats. Patch by Hugo van Kemenade.

@item 
gh-126417@footnote{https://github.com/python/cpython/issues/126417}: Register the @code{multiprocessing.managers.DictProxy} and
@code{multiprocessing.managers.ListProxy} types in
@ref{9b,,multiprocessing.managers} to @ref{12b8,,collections.abc.MutableMapping}
and @ref{4c0,,collections.abc.MutableSequence}, respectively.

@item 
gh-126390@footnote{https://github.com/python/cpython/issues/126390}: Add support for returning intermixed options and non-option
arguments in order in @ref{16c6,,getopt.gnu_getopt()}.

@item 
gh-126374@footnote{https://github.com/python/cpython/issues/126374}: Add support for options with optional arguments in the
@ref{65,,getopt} module.

@item 
gh-126363@footnote{https://github.com/python/cpython/issues/126363}: Speed up pattern parsing in @ref{538,,pathlib.Path.glob()} by
skipping creation of a @ref{268,,pathlib.Path} object for the pattern.

@item 
gh-126353@footnote{https://github.com/python/cpython/issues/126353}: @ref{2f4,,asyncio.get_event_loop()} now does not implicitly creates
an event loop. It now raises a @ref{246,,RuntimeError} if there is no set
event loop. Patch by Kumar Aditya.

@item 
gh-126313@footnote{https://github.com/python/cpython/issues/126313}: Fix an issue in @ref{1952,,curses.napms()} when
@ref{1953,,curses.initscr()} has not yet been called. Patch by Bénédikt Tran.

@item 
gh-126303@footnote{https://github.com/python/cpython/issues/126303}: Fix pickling and copying of @ref{1954,,os.sched_param} objects.

@item 
gh-126138@footnote{https://github.com/python/cpython/issues/126138}: Fix a use-after-free crash on @ref{1c9,,asyncio.Task} objects
whose underlying coroutine yields an object that implements an evil
@ref{dd1,,__getattribute__()}. Patch by Nico Posada.

@item 
gh-120057@footnote{https://github.com/python/cpython/issues/120057}: Replace the @code{os.environ.refresh()} method with a new
@ref{25a,,os.reload_environ()} function. Patch by Victor Stinner.

@item 
gh-126220@footnote{https://github.com/python/cpython/issues/126220}: Fix crash in @code{cProfile.Profile} and
@code{_lsprof.Profiler} when their callbacks were directly called with
0 arguments.

@item 
gh-126212@footnote{https://github.com/python/cpython/issues/126212}: Fix issue where @ref{2c1,,urllib.request.pathname2url()} and
@ref{2bf,,url2pathname()} removed slashes from Windows DOS
drive paths and URLs.

@item 
gh-126223@footnote{https://github.com/python/cpython/issues/126223}: Raise a @ref{889,,UnicodeEncodeError} instead of a
@ref{796,,SystemError} upon calling @code{_interpreters.create()} with an
invalid Unicode character.

@item 
gh-126205@footnote{https://github.com/python/cpython/issues/126205}: Fix issue where @ref{2c1,,urllib.request.pathname2url()} generated
URLs beginning with four slashes (rather than two) when given a Windows
UNC path.

@item 
gh-126156@footnote{https://github.com/python/cpython/issues/126156}: Improved performances of creating
@ref{e04,,Morsel} objects by a factor of 3.8x.

@item 
gh-126105@footnote{https://github.com/python/cpython/issues/126105}: Fix a crash in @ref{9,,ast} when the @ref{1825,,ast.AST._fields}
attribute is deleted.

@item 
gh-126106@footnote{https://github.com/python/cpython/issues/126106}: Fixes a possible @code{NULL} pointer dereference in @ref{d5,,ssl}.

@item 
gh-126080@footnote{https://github.com/python/cpython/issues/126080}: Fix a use-after-free crash on @ref{1c9,,asyncio.Task} objects for
which the underlying event loop implements an evil
@ref{dd1,,__getattribute__()}. Reported by Nico-Posada. Patch by
Bénédikt Tran.

@item 
gh-125322@footnote{https://github.com/python/cpython/issues/125322}: Correct detection of complex numbers support in libffi.

@item 
gh-126083@footnote{https://github.com/python/cpython/issues/126083}: Fixed a reference leak in @ref{1c9,,asyncio.Task} objects when
reinitializing the same object with a non-@code{None} context. Patch by Nico
Posada.

@item 
gh-126068@footnote{https://github.com/python/cpython/issues/126068}: Fix exceptions in the @ref{7,,argparse} module so that only error
messages for ArgumentError and ArgumentTypeError are now translated.
ArgumentError is now only used for command line errors, not for logical
errors in the program. TypeError is now raised instead of ValueError for
some logical errors.

@item 
gh-125413@footnote{https://github.com/python/cpython/issues/125413}: Add @code{pathlib.Path.scandir()} method to efficiently fetch
directory children and their file attributes. This is a trivial wrapper of
@ref{c5a,,os.scandir()}.

@item 
gh-125984@footnote{https://github.com/python/cpython/issues/125984}: Fix use-after-free crashes on @ref{dcc,,asyncio.Future} objects
for which the underlying event loop implements an evil
@ref{dd1,,__getattribute__()}. Reported by Nico-Posada. Patch by
Bénédikt Tran.

@item 
gh-125926@footnote{https://github.com/python/cpython/issues/125926}: Fix @ref{109c,,urllib.parse.urljoin()} for base URI with undefined
authority. Although 
@geindex RFC; RFC 3986
RFC 3986@footnote{https://datatracker.ietf.org/doc/html/rfc3986.html} only specify reference resolution for
absolute base URI, @code{urljoin()} should continue to return sensible
result for relative base URI.

@item 
gh-125969@footnote{https://github.com/python/cpython/issues/125969}: Fix an out-of-bounds crash when an evil
@ref{d00,,asyncio.loop.call_soon()} mutates the length of the internal
callbacks list. Patch by Bénédikt Tran.

@item 
gh-125966@footnote{https://github.com/python/cpython/issues/125966}: Fix a use-after-free crash in
@ref{1955,,asyncio.Future.remove_done_callback()}. Patch by Bénédikt Tran.

@item 
gh-125789@footnote{https://github.com/python/cpython/issues/125789}: Fix possible crash when mutating list of callbacks returned by
@code{asyncio.Future._callbacks}. It now always returns a new copy in C
implementation @code{_asyncio}. Patch by Kumar Aditya.

@item 
gh-126916@footnote{https://github.com/python/cpython/issues/126916}: Allow the `initial' parameter of @ref{21c,,functools.reduce()} to be
passed as a keyword argument. Patch by Sayandip Dutta.

@item 
gh-124452@footnote{https://github.com/python/cpython/issues/124452}: Fix an issue in
@ref{1956,,email.policy.EmailPolicy.header_source_parse()} and
@ref{1957,,email.policy.Compat32.header_source_parse()} that introduced spurious
leading whitespaces into header values when the header includes a newline
character after the header name delimiter (@code{:}) and before the value.

@item 
gh-117941@footnote{https://github.com/python/cpython/issues/117941}: @code{argparse.BooleanOptionalAction} now rejects option
names starting with @code{--no-}.

@item 
gh-125884@footnote{https://github.com/python/cpython/issues/125884}: Fixed the bug for @ref{aa,,pdb} where it can’t set breakpoints on
functions with certain annotations.

@item 
gh-125355@footnote{https://github.com/python/cpython/issues/125355}: Fix several bugs in
@ref{cfd,,argparse.ArgumentParser.parse_intermixed_args()}.


@itemize *

@item 
The parser no longer changes temporarily during parsing.

@item 
Default values are not processed twice.

@item 
Required mutually exclusive groups containing positional arguments are now supported.

@item 
The missing arguments report now includes the names of all required optional and positional arguments.

@item 
Unknown options can be intermixed with positional arguments in parse_known_intermixed_args().
@end itemize

@item 
gh-125767@footnote{https://github.com/python/cpython/issues/125767}: @ref{1a7,,super} objects are now @ref{ab,,pickleable} and
@ref{29,,copyable}.

@item 
gh-124969@footnote{https://github.com/python/cpython/issues/124969}: @code{locale.nl_langinfo(locale.ALT_DIGITS)} now returns a string
again. The returned value consists of up to 100 semicolon-separated
symbols.

@item 
gh-84850@footnote{https://github.com/python/cpython/issues/84850}: Remove @code{URLopener} and @code{FancyURLopener} classes
from @ref{112,,urllib.request}. They had previously raised
@ref{1a4,,DeprecationWarning} since Python 3.3.

@item 
gh-125666@footnote{https://github.com/python/cpython/issues/125666}: Avoid the exiting the interpreter if a null byte is given as
input in the new REPL.

@item 
gh-125710@footnote{https://github.com/python/cpython/issues/125710}: [Enum] fix hashable<->nonhashable comparisons for member values

@item 
gh-125631@footnote{https://github.com/python/cpython/issues/125631}: Restore ability to set @ref{1950,,persistent_id}
and @ref{1958,,persistent_load} attributes of instances of
the @code{Pickler} and @code{Unpickler} classes in the @ref{ab,,pickle}
module.

@item 
gh-125378@footnote{https://github.com/python/cpython/issues/125378}: Fixed the bug in @ref{aa,,pdb} where after a multi-line command,
an empty line repeats the first line of the multi-line command, instead of
the full command.

@item 
gh-125682@footnote{https://github.com/python/cpython/issues/125682}: Reject non-ASCII digits in the Python implementation of
@ref{b54,,json.loads()} conforming to the JSON specification.

@item 
gh-125660@footnote{https://github.com/python/cpython/issues/125660}: Reject invalid unicode escapes for Python implementation of
@ref{b54,,json.loads()}.

@item 
gh-52551@footnote{https://github.com/python/cpython/issues/52551}: Use @code{wcsftime()} to implement @ref{13f5,,time.strftime()} on
Windows.

@item 
gh-125259@footnote{https://github.com/python/cpython/issues/125259}: Fix the notes removal logic for errors thrown in enum
initialization.

@item 
gh-125633@footnote{https://github.com/python/cpython/issues/125633}: Add function @ref{234,,inspect.ispackage()} to determine whether an
object is a @ref{235,,package} or not.

@item 
gh-125614@footnote{https://github.com/python/cpython/issues/125614}: In the @ref{160,,FORWARDREF} format of
@ref{6,,annotationlib}, fix bug where nested expressions were not returned
as @ref{17c9,,annotationlib.ForwardRef} format.

@item 
gh-125590@footnote{https://github.com/python/cpython/issues/125590}: Allow @code{FrameLocalsProxy} to delete and pop if the key is not
a fast variable.

@item 
gh-125600@footnote{https://github.com/python/cpython/issues/125600}: Only show stale code warning in @ref{aa,,pdb} when we display
source code.

@item 
gh-125542@footnote{https://github.com/python/cpython/issues/125542}: Deprecate passing keyword-only `prefix_chars' argument to
@ref{2ed,,argparse.ArgumentParser.add_argument_group()}.

@item 
gh-125541@footnote{https://github.com/python/cpython/issues/125541}: Pressing @code{Ctrl}-@code{C} while blocked in
@ref{8a9,,threading.Lock.acquire()}, @ref{1081,,threading.RLock.acquire()}, and
@ref{13f0,,threading.Thread.join()} now interrupts the function call and raises
a @ref{bcb,,KeyboardInterrupt} exception on Windows, similar to how those
functions behave on macOS and Linux.

@item 
gh-125519@footnote{https://github.com/python/cpython/issues/125519}: Improve traceback if @ref{73e,,importlib.reload()} is called with an
object that is not a module. Patch by Alex Waygood.

@item 
gh-125451@footnote{https://github.com/python/cpython/issues/125451}: Fix deadlock when
@ref{1d8,,concurrent.futures.ProcessPoolExecutor} shuts down concurrently
with an error when feeding a job to a worker process.

@item 
gh-125115@footnote{https://github.com/python/cpython/issues/125115}: Fixed a bug in @ref{aa,,pdb} where arguments starting with @code{-}
can’t be passed to the debugged script.

@item 
gh-125398@footnote{https://github.com/python/cpython/issues/125398}: Fix the conversion of the @code{VIRTUAL_ENV} path in the
activate script in @ref{118,,venv} when running in Git Bash for Windows.

@item 
gh-125245@footnote{https://github.com/python/cpython/issues/125245}: Fix race condition when importing @ref{1f,,collections.abc}, which
could incorrectly return an empty module.

@item 
gh-52551@footnote{https://github.com/python/cpython/issues/52551}: Fix encoding issues in @ref{13f5,,time.strftime()}, the
@ref{e94,,strftime()} method of the @ref{34,,datetime} classes
@ref{4e3,,datetime}, @ref{1fc,,date} and
@ref{1fd,,time} and formatting of these classes. Characters not
encodable in the current locale are now acceptable in the format string.
Surrogate pairs and sequence of surrogatescape-encoded bytes are no longer
recombinated. Embedded null character no longer terminates the format
string.

@item 
gh-124984@footnote{https://github.com/python/cpython/issues/124984}: Fixed thread safety in @ref{d5,,ssl} in the free-threaded build.
OpenSSL operations are now protected by a per-object lock.

@item 
gh-124651@footnote{https://github.com/python/cpython/issues/124651}: Properly quote template strings in @ref{118,,venv} activation
scripts.

@item 
gh-124694@footnote{https://github.com/python/cpython/issues/124694}: We’ve added
@ref{1d4,,concurrent.futures.InterpreterPoolExecutor}, which allows you to
run code in multiple isolated interpreters.  This allows you to circumvent
the limitations of CPU-bound threads (due to the GIL). Patch by Eric Snow.

This addition is unrelated to 
@geindex Python Enhancement Proposals; PEP 734
PEP 734@footnote{https://peps.python.org/pep-0734/}.

@item 
gh-58032@footnote{https://github.com/python/cpython/issues/58032}: Deprecate the @ref{30e,,argparse.FileType} type converter.

@item 
gh-99749@footnote{https://github.com/python/cpython/issues/99749}: Adds a feature to optionally enable suggestions for argument
choices and subparser names if mistyped by the user.

@item 
gh-58956@footnote{https://github.com/python/cpython/issues/58956}: Fixed a bug in @ref{aa,,pdb} where sometimes the breakpoint won’t
trigger if it was set on a function which is already in the call stack.

@item 
gh-124111@footnote{https://github.com/python/cpython/issues/124111}: The tkinter module can now be built to use either the new
version 9.0.0 of Tcl/Tk or the latest release 8.6.15 of Tcl/Tk 8.  Tcl/Tk
9 includes many improvements, both to the Tcl language and to the
appearance and utility of the graphical user interface provided by Tk.

@item 
gh-80958@footnote{https://github.com/python/cpython/issues/80958}: unittest discovery supports PEP 420 namespace packages as start
directory again.

@item 
gh-123370@footnote{https://github.com/python/cpython/issues/123370}: Fix the canvas not clearing after running turtledemo clock.

@item 
gh-89083@footnote{https://github.com/python/cpython/issues/89083}: Add @ref{2c6,,uuid.uuid8()} for generating UUIDv8 objects as
specified in 
@geindex RFC; RFC 9562
RFC 9562@footnote{https://datatracker.ietf.org/doc/html/rfc9562.html}. Patch by Bénédikt Tran

@item 
gh-122549@footnote{https://github.com/python/cpython/issues/122549}: Add @ref{27f,,platform.invalidate_caches()} to invalidate cached
results.

@item 
gh-120754@footnote{https://github.com/python/cpython/issues/120754}: Update unbounded @code{read} calls in @ref{138,,zipfile} to specify an
explicit @code{size} putting a limit on how much data they may read. This
also updates handling around ZIP max comment size to match the standard
instead of reading comments that are one byte too long.

@item 
gh-121267@footnote{https://github.com/python/cpython/issues/121267}: Improve the performance of @ref{e4,,tarfile} when writing files,
by caching user names and group names.

@item 
gh-70764@footnote{https://github.com/python/cpython/issues/70764}: Fixed an issue where @ref{12e1,,inspect.getclosurevars()} would
incorrectly classify an attribute name as a global variable when the name
exists both as an attribute name and a global variable.

@item 
gh-118289@footnote{https://github.com/python/cpython/issues/118289}: @code{posixpath.realpath()} now raises
@ref{1260,,NotADirectoryError} when `strict' mode is enabled and a
non-directory path with a trailing slash is supplied.

@item 
gh-119826@footnote{https://github.com/python/cpython/issues/119826}: Always return an absolute path for @ref{1526,,os.path.abspath()} on
Windows.

@item 
gh-97850@footnote{https://github.com/python/cpython/issues/97850}: Remove deprecated @code{pkgutil.get_loader()} and
@code{pkgutil.find_loader()}.

@item 
gh-118986@footnote{https://github.com/python/cpython/issues/118986}: Add @code{socket.IPV6_RECVERR} constant (available since
Linux 2.2).

@item 
gh-116897@footnote{https://github.com/python/cpython/issues/116897}: Accepting objects with false values (like @code{0} and @code{[]})
except empty strings, byte-like objects and @code{None} in
@ref{111,,urllib.parse} functions @ref{320,,parse_qsl()} and
@ref{321,,parse_qs()} is now deprecated.

@item 
gh-101955@footnote{https://github.com/python/cpython/issues/101955}: Fix SystemError when match regular expression pattern
containing some combination of possessive quantifier, alternative and
capture group.

@item 
gh-71936@footnote{https://github.com/python/cpython/issues/71936}: Fix a race condition in @ref{1171,,multiprocessing.pool.Pool}.

@item 
bpo-46128@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46128}: Strip @ref{35f,,unittest.IsolatedAsyncioTestCase} stack frames
from reported stacktraces.

@item 
gh-84852@footnote{https://github.com/python/cpython/issues/84852}: Add MIME types for MS Embedded OpenType, OpenType Layout,
TrueType, WOFF 1.0 and 2.0 fonts. Patch by Sahil Prajapati and Hugo van
Kemenade.
@end itemize

@node Documentation<16>,Core and Builtins<42>,Library<46>,Python 3 14 0 alpha 2
@anchor{whatsnew/changelog id207}@anchor{1959}
@subsubsection Documentation



@itemize -

@item 
gh-126622@footnote{https://github.com/python/cpython/issues/126622}: Added stub pages for removed modules explaining their removal,
where to find replacements, and linking to the last Python version that
supported them. Contributed by Ned Batchelder.

@item 
gh-125277@footnote{https://github.com/python/cpython/issues/125277}: Require Sphinx 7.2.6 or later to build the Python
documentation. Patch by Adam Turner.

@item 
gh-60712@footnote{https://github.com/python/cpython/issues/60712}: Include the @ref{c84,,object} type in the lists of documented
types. Change by Furkan Onder and Martin Panter.
@end itemize

@node Core and Builtins<42>,Library<47>,Documentation<16>,Python 3 14 0 alpha 2
@anchor{whatsnew/changelog id208}@anchor{195a}
@subsubsection Core and Builtins



@itemize -

@item 
gh-126795@footnote{https://github.com/python/cpython/issues/126795}: Increase the threshold for JIT code warmup. Depending on
platform and workload, this can result in performance gains of 1-9% and
memory savings of 3-5%.

@item 
gh-126341@footnote{https://github.com/python/cpython/issues/126341}: Now @ref{2ee,,ValueError} is raised instead of @ref{796,,SystemError}
when trying to iterate over a released @ref{166,,memoryview} object.

@item 
gh-126688@footnote{https://github.com/python/cpython/issues/126688}: Fix a crash when calling @ref{4b6,,os.fork()} on some operating
systems, including SerenityOS.
@end itemize

@node Library<47>,Core and Builtins<43>,Core and Builtins<42>,Python 3 14 0 alpha 2
@anchor{whatsnew/changelog id209}@anchor{195b}
@subsubsection Library



@itemize -

@item 
gh-126066@footnote{https://github.com/python/cpython/issues/126066}: Fix @ref{7b,,importlib} to not write an incomplete .pyc files when
a ulimit or some other operating system mechanism is preventing the write
to go through fully.
@end itemize

@node Core and Builtins<43>,Library<48>,Library<47>,Python 3 14 0 alpha 2
@anchor{whatsnew/changelog id210}@anchor{195c}
@subsubsection Core and Builtins



@itemize -

@item 
gh-126222@footnote{https://github.com/python/cpython/issues/126222}: Do not include count of “peek” items in @code{_PyUop_num_popped}.
This ensures that the correct number of items are popped from the stack
when a micro-op exits with an error.

@item 
gh-126366@footnote{https://github.com/python/cpython/issues/126366}: Fix crash when using @code{yield from} on an object that raises an
exception in its @code{__iter__}.
@end itemize

@node Library<48>,Core and Builtins<44>,Core and Builtins<43>,Python 3 14 0 alpha 2
@anchor{whatsnew/changelog id211}@anchor{195d}
@subsubsection Library



@itemize -

@item 
gh-126209@footnote{https://github.com/python/cpython/issues/126209}: Fix an issue with @code{skip_file_prefixes} parameter which
resulted in an inconsistent behaviour between the C and Python
implementations of @ref{1725,,warnings.warn()}. Patch by Daehee Kim.
@end itemize

@node Core and Builtins<44>,Library<49>,Library<48>,Python 3 14 0 alpha 2
@anchor{whatsnew/changelog id212}@anchor{195e}
@subsubsection Core and Builtins



@itemize -

@item 
gh-126312@footnote{https://github.com/python/cpython/issues/126312}: Fix crash during garbage collection on an object frozen by
@ref{d34,,gc.freeze()} on the free-threaded build.

@item 
gh-103951@footnote{https://github.com/python/cpython/issues/103951}: Relax optimization requirements to allow fast attribute access
to module subclasses.

@item 
gh-126072@footnote{https://github.com/python/cpython/issues/126072}: Following gh-126101@footnote{https://github.com/python/cpython/issues/126101}, for @ref{7d3,,Code Objects} like lambda,
annotation and type alias, we no longer  add @code{None} to its
@ref{18e2,,co_consts}.

@item 
gh-126195@footnote{https://github.com/python/cpython/issues/126195}: Improve JIT performance by 1.4% on macOS Apple Silicon by using
platform-specific memory protection APIs. Patch by Diego Russo.

@item 
gh-126139@footnote{https://github.com/python/cpython/issues/126139}: Provide better error location when attempting to use a
@ref{fb3,,future statement} with an unknown future feature.

@item 
gh-126072@footnote{https://github.com/python/cpython/issues/126072}: Add a new attribute in @ref{1921,,co_flags} to indicate
whether the first item in @ref{18e2,,co_consts} is the docstring.
If a code object has no docstring, @code{None} will `NOT' be inserted.

@item 
gh-126076@footnote{https://github.com/python/cpython/issues/126076}: Relocated objects such as @code{tuple}, @code{bytes} and @code{str}
objects are properly tracked by @ref{106,,tracemalloc} and its associated
hooks. Patch by Pablo Galindo.

@item 
gh-90370@footnote{https://github.com/python/cpython/issues/90370}: Avoid temporary tuple creation for vararg in argument passing
with Argument Clinic generated code (if arguments either vararg or
positional-only).

@item 
gh-126018@footnote{https://github.com/python/cpython/issues/126018}: Fix a crash in @ref{195f,,sys.audit()} when passing a non-string as
first argument and Python was compiled in debug mode.

@item 
gh-126012@footnote{https://github.com/python/cpython/issues/126012}: The @ref{166,,memoryview} type now supports subscription, making
it a @ref{1a2,,generic type}.

@item 
gh-125837@footnote{https://github.com/python/cpython/issues/125837}: Adds @ref{36c,,LOAD_SMALL_INT} and @ref{373,,LOAD_CONST_IMMORTAL}
instructions. @code{LOAD_SMALL_INT} pushes a small integer equal to the
@code{oparg} to the stack. @code{LOAD_CONST_IMMORTAL} does the same as
@code{LOAD_CONST} but is more efficient for immortal objects. Removes
@code{RETURN_CONST}  instruction.

@item 
gh-125942@footnote{https://github.com/python/cpython/issues/125942}: On Android, the @code{errors} setting of @ref{cd3,,sys.stdout} was
changed from @code{surrogateescape} to @code{backslashreplace}.

@item 
gh-125859@footnote{https://github.com/python/cpython/issues/125859}: Fix a crash in the free threading build when
@ref{a0a,,gc.get_objects()} or @ref{a0b,,gc.get_referrers()} is called during an
in-progress garbage collection.

@item 
gh-125868@footnote{https://github.com/python/cpython/issues/125868}: It was possible in 3.14.0a1 only for attribute lookup to give
the wrong value. This was due to an incorrect specialization in very
specific circumstances. This is fixed in 3.14.0a2.

@item 
gh-125498@footnote{https://github.com/python/cpython/issues/125498}: The JIT has been updated to leverage Clang 19’s new
@code{preserve_none} attribute, which supports more platforms and is more
useful than LLVM’s existing @code{ghccc} calling convention. This also
removes the need to manually patch the calling convention in LLVM IR,
simplifying the JIT compilation process.

@item 
gh-125703@footnote{https://github.com/python/cpython/issues/125703}: Correctly honour @ref{106,,tracemalloc} hooks in specialized
@code{Py_DECREF} paths. Patch by Pablo Galindo

@item 
gh-125593@footnote{https://github.com/python/cpython/issues/125593}: Use color to highlight error locations in traceback from
exception group

@item 
gh-125017@footnote{https://github.com/python/cpython/issues/125017}: Fix crash on certain accesses to the @code{__annotations__} of
@ref{451,,staticmethod} and @ref{48f,,classmethod} objects.

@item 
gh-125588@footnote{https://github.com/python/cpython/issues/125588}: The Python PEG generator can now use f-strings in the grammar
actions. Patch by Pablo Galindo

@item 
gh-125444@footnote{https://github.com/python/cpython/issues/125444}: Fix illegal instruction for older Arm architectures. Patch by
Diego Russo, testing by Ross Burton.

@item 
gh-118423@footnote{https://github.com/python/cpython/issues/118423}: Add a new @code{INSTRUCTION_SIZE} macro to the cases generator
which returns the current instruction size.

@item 
gh-125038@footnote{https://github.com/python/cpython/issues/125038}: Fix crash when iterating over a generator expression after
direct changes on @code{gi_frame.f_locals}. Patch by Mikhail Efimov.

@item 
gh-124855@footnote{https://github.com/python/cpython/issues/124855}: Don’t allow the JIT and perf support to be active at the same
time. Patch by Pablo Galindo

@item 
gh-123714@footnote{https://github.com/python/cpython/issues/123714}: Update JIT compilation to use LLVM 19

@item 
gh-123930@footnote{https://github.com/python/cpython/issues/123930}: Improve the error message when a script shadowing a module from
the standard library causes @ref{65b,,ImportError} to be raised during a
“from” import. Similarly, improve the error message when a script
shadowing a third party module attempts to “from” import an attribute from
that third party module while still initialising.

@item 
gh-119793@footnote{https://github.com/python/cpython/issues/119793}: The @ref{1a0,,map()} built-in now has an optional keyword-only
`strict' flag like @ref{1a1,,zip()} to check that all the iterables are of
equal length. Patch by Wannes Boeykens.
@end itemize

@node Library<49>,C API<17>,Core and Builtins<44>,Python 3 14 0 alpha 2
@anchor{whatsnew/changelog id213}@anchor{1960}
@subsubsection Library



@itemize -

@item 
gh-118950@footnote{https://github.com/python/cpython/issues/118950}: Fix bug where SSLProtocol.connection_lost wasn’t getting called
when OSError was thrown on writing to socket.

@item 
gh-113570@footnote{https://github.com/python/cpython/issues/113570}: Fixed a bug in @code{reprlib.repr} where it incorrectly called the
repr method on shadowed Python built-in types.
@end itemize

@node C API<17>,Build<18>,Library<49>,Python 3 14 0 alpha 2
@anchor{whatsnew/changelog id214}@anchor{1961}
@subsubsection C API



@itemize -

@item 
gh-126554@footnote{https://github.com/python/cpython/issues/126554}: Fix error handling in @ref{be2,,ctypes.CDLL} objects which could
result in a crash in rare situations.

@item 
gh-126061@footnote{https://github.com/python/cpython/issues/126061}: Add @ref{399,,PyLong_IsPositive()}, @ref{39a,,PyLong_IsNegative()}
and @ref{39b,,PyLong_IsZero()} for checking if a @ref{39c,,PyLongObject} is
positive, negative, or zero, respectively.

@item 
gh-125608@footnote{https://github.com/python/cpython/issues/125608}: Fix a bug where dictionary watchers (e.g.,
@ref{785,,PyDict_Watch()}) on an object’s attribute dictionary
(@ref{77e,,__dict__}) were not triggered when the object’s attributes
were modified.

@item 
gh-123619@footnote{https://github.com/python/cpython/issues/123619}: Added the @ref{3c3,,PyUnstable_Object_EnableDeferredRefcount()}
function for enabling 
@geindex Python Enhancement Proposals; PEP 703
PEP 703@footnote{https://peps.python.org/pep-0703/} deferred reference counting.

@item 
gh-121654@footnote{https://github.com/python/cpython/issues/121654}: Add @ref{3ad,,PyType_Freeze()} function to make a type immutable.
Patch by Victor Stinner.

@item 
gh-120026@footnote{https://github.com/python/cpython/issues/120026}: The @code{Py_HUGE_VAL} macro is @ref{23f,,soft deprecated}.
@end itemize

@node Build<18>,,C API<17>,Python 3 14 0 alpha 2
@anchor{whatsnew/changelog id215}@anchor{1962}
@subsubsection Build



@itemize -

@item 
gh-126691@footnote{https://github.com/python/cpython/issues/126691}: Removed the @code{--with-emscripten-target} configure flag. We
unified the @code{node} and @code{browser} options and the same build can now be
used, independent of target runtime.

@item 
gh-123877@footnote{https://github.com/python/cpython/issues/123877}: Use @code{wasm32-wasip1} as the target triple for WASI instead of
@code{wasm32-wasi}. The latter will eventually be reclaimed for WASI 1.0
while CPython currently only supports WASI preview1.

@item 
gh-126458@footnote{https://github.com/python/cpython/issues/126458}: Disable SIMD support for HACL under WASI.

@item 
gh-89640@footnote{https://github.com/python/cpython/issues/89640}: Hard-code float word ordering as little endian on WASM.

@item 
gh-126206@footnote{https://github.com/python/cpython/issues/126206}: @code{make clinic} now runs Argument Clinic using the @code{--force}
option, thus forcefully regenerating generated code.

@item 
gh-126187@footnote{https://github.com/python/cpython/issues/126187}: Introduced @code{Tools/wasm/emscripten.py} to simplify doing
Emscripten builds.

@item 
gh-124932@footnote{https://github.com/python/cpython/issues/124932}: For cross builds, there is now support for having a different
install @code{prefix} than the @code{host_prefix} used by @code{getpath.py}. This
is set to @code{/} by default for Emscripten, on other platforms the default
behavior is the same as before.

@item 
gh-125946@footnote{https://github.com/python/cpython/issues/125946}: The minimum supported Android version is now 7.0 (API level
24).

@item 
gh-125940@footnote{https://github.com/python/cpython/issues/125940}: The Android build now supports 16 KB page sizes@footnote{https://developer.android.com/guide/practices/page-sizes}.

@item 
gh-89640@footnote{https://github.com/python/cpython/issues/89640}: Improve detection of float word ordering on Linux when link-time
optimizations are enabled.

@item 
gh-124928@footnote{https://github.com/python/cpython/issues/124928}: Emscripten builds now require node >= 18.

@item 
gh-115382@footnote{https://github.com/python/cpython/issues/115382}: Fix cross compile failures when the host and target SOABIs
match.
@end itemize

@node Python 3 14 0 alpha 1,Python 3 13 0 beta 1,Python 3 14 0 alpha 2,Changelog
@anchor{whatsnew/changelog python-3-14-0-alpha-1}@anchor{1963}
@subsection Python 3.14.0 alpha 1


`Release date: 2024-10-15'

@menu
* macOS: macOS<11>. 
* Windows: Windows<16>. 
* Tools/Demos: Tools/Demos<15>. 
* Tests: Tests<17>. 
* Security: Security<20>. 
* Library: Library<50>. 
* IDLE: IDLE<8>. 
* Documentation: Documentation<17>. 
* Core and Builtins: Core and Builtins<45>. 
* Library: Library<51>. 
* Core and Builtins: Core and Builtins<46>. 
* Library: Library<52>. 
* Core and Builtins: Core and Builtins<47>. 
* Library: Library<53>. 
* Core and Builtins: Core and Builtins<48>. 
* Library: Library<54>. 
* Core and Builtins: Core and Builtins<49>. 
* Library: Library<55>. 
* Core and Builtins: Core and Builtins<50>. 
* Library: Library<56>. 
* Core and Builtins: Core and Builtins<51>. 
* Library: Library<57>. 
* Core and Builtins: Core and Builtins<52>. 
* C API: C API<18>. 
* Build: Build<19>. 

@end menu

@node macOS<11>,Windows<16>,,Python 3 14 0 alpha 1
@anchor{whatsnew/changelog id216}@anchor{1964}
@subsubsection macOS



@itemize -

@item 
gh-124448@footnote{https://github.com/python/cpython/issues/124448}: Update bundled Tcl/Tk in macOS installer to 8.6.15.

@item 
gh-123797@footnote{https://github.com/python/cpython/issues/123797}: Check for runtime availability of @code{ptsname_r} function on
macos.

@item 
gh-123418@footnote{https://github.com/python/cpython/issues/123418}: Updated macOS installer build to use OpenSSL 3.0.15.
@end itemize

@node Windows<16>,Tools/Demos<15>,macOS<11>,Python 3 14 0 alpha 1
@anchor{whatsnew/changelog id217}@anchor{1965}
@subsubsection Windows



@itemize -

@item 
gh-124487@footnote{https://github.com/python/cpython/issues/124487}: Increases Windows required OS and API level to Windows 10.

@item 
gh-124609@footnote{https://github.com/python/cpython/issues/124609}: Fix @code{_Py_ThreadId} for Windows builds using MinGW. Patch by
Tony Roberts.

@item 
gh-124448@footnote{https://github.com/python/cpython/issues/124448}: Updated bundled Tcl/Tk to 8.6.15.

@item 
gh-124254@footnote{https://github.com/python/cpython/issues/124254}: Ensures experimental free-threaded binaries remain installed
when updating.

@item 
gh-123915@footnote{https://github.com/python/cpython/issues/123915}: Ensure that @code{Tools\msi\buildrelease.bat} uses different
directories for AMD64 and ARM64 builds.

@item 
gh-123418@footnote{https://github.com/python/cpython/issues/123418}: Updated Windows build to use OpenSSL 3.0.15.

@item 
gh-123476@footnote{https://github.com/python/cpython/issues/123476}: Add support for @code{socket.TCP_QUICKACK} on Windows platforms.

@item 
gh-122573@footnote{https://github.com/python/cpython/issues/122573}: The Windows build of CPython now requires 3.10 or newer.

@item 
gh-100256@footnote{https://github.com/python/cpython/issues/100256}: @ref{93,,mimetypes} no longer fails when it encounters an
inaccessible registry key.

@item 
gh-119679@footnote{https://github.com/python/cpython/issues/119679}: Ensures correct import libraries are included in Windows
installs.

@item 
gh-119690@footnote{https://github.com/python/cpython/issues/119690}: Adds Unicode support and fixes audit events for
@code{_winapi.CreateNamedPipe}.

@item 
gh-111201@footnote{https://github.com/python/cpython/issues/111201}: Add support for new pyrepl on Windows

@item 
gh-119070@footnote{https://github.com/python/cpython/issues/119070}: Fixes @code{py.exe} handling of shebangs like @code{/usr/bin/env
python3.12}, which were previously interpreted as @code{python3.exe} instead
of @code{python3.12.exe}.

@item 
gh-117505@footnote{https://github.com/python/cpython/issues/117505}: Fixes an issue with the Windows installer not running ensurepip
in a fully isolated environment. This could cause unexpected interactions
with the user site-packages.

@item 
gh-118209@footnote{https://github.com/python/cpython/issues/118209}: Avoid crashing in @ref{94,,mmap} on Windows when the mapped memory
is inaccessible due to file system errors or access violations.

@item 
gh-79846@footnote{https://github.com/python/cpython/issues/79846}: Makes @code{ssl.create_default_context()} ignore invalid
certificates in the Windows certificate store
@end itemize

@node Tools/Demos<15>,Tests<17>,Windows<16>,Python 3 14 0 alpha 1
@anchor{whatsnew/changelog id218}@anchor{1966}
@subsubsection Tools/Demos



@itemize -

@item 
gh-123418@footnote{https://github.com/python/cpython/issues/123418}: Update GitHub CI workflows to use OpenSSL 3.0.15 and
multissltests to use 3.0.15, 3.1.7, and 3.2.3.
@end itemize

@node Tests<17>,Security<20>,Tools/Demos<15>,Python 3 14 0 alpha 1
@anchor{whatsnew/changelog id219}@anchor{1967}
@subsubsection Tests



@itemize -

@item 
gh-125041@footnote{https://github.com/python/cpython/issues/125041}: Re-enable skipped tests for @ref{13a,,zlib} on the s390x
architecture: only skip checks of the compressed bytes, which can be
different between zlib’s software implementation and the
hardware-accelerated implementation.

@item 
gh-124378@footnote{https://github.com/python/cpython/issues/124378}: Updated @code{test_ttk} to pass with Tcl/Tk 8.6.15.

@item 
gh-124213@footnote{https://github.com/python/cpython/issues/124213}: Detect whether the test suite is running inside a
systemd-nspawn container with @code{--suppress-sync=true} option, and skip
the @code{test_os} and @code{test_mmap} tests that are failing in this scenario.

@item 
gh-124190@footnote{https://github.com/python/cpython/issues/124190}: Add capability to ignore entire files or directories in check
warning CI tool

@item 
gh-121921@footnote{https://github.com/python/cpython/issues/121921}: Update @code{Lib/test/crashers/bogus_code_obj.py} so that it
crashes properly again.

@item 
gh-112301@footnote{https://github.com/python/cpython/issues/112301}: Add tooling to check for changes in compiler warnings. Patch by
Nate Ohlson.

@item 
gh-59022@footnote{https://github.com/python/cpython/issues/59022}: Add tests for @ref{1968,,pkgutil.extend_path()}. Patch by Andreas
Stocker.

@item 
gh-99242@footnote{https://github.com/python/cpython/issues/99242}: @ref{1969,,os.getloadavg()} may throw @ref{2c2,,OSError} when running
regression tests under certain conditions (e.g. chroot). This error is now
caught and ignored, since reporting load average is optional.

@item 
gh-121084@footnote{https://github.com/python/cpython/issues/121084}: Fix test_typing random leaks. Clear typing ABC caches when
running tests for refleaks (@code{-R} option): call @code{_abc_caches_clear()}
on typing abstract classes and their subclasses. Patch by Victor Stinner.

@item 
gh-121160@footnote{https://github.com/python/cpython/issues/121160}: Add a test for @ref{196a,,readline.set_history_length()}. Note that
this test may fail on readline libraries.

@item 
gh-121200@footnote{https://github.com/python/cpython/issues/121200}: Fix @code{test_expanduser_pwd2()} of @code{test_posixpath}.  Call
@code{getpwnam()} to get @code{pw_dir}, since it can be different than
@code{getpwall()} @code{pw_dir}. Patch by Victor Stinner.

@item 
gh-121188@footnote{https://github.com/python/cpython/issues/121188}: When creating the JUnit XML file, regrtest now escapes
characters which are invalid in XML, such as the chr(27) control character
used in ANSI escape sequences. Patch by Victor Stinner.

@item 
gh-120801@footnote{https://github.com/python/cpython/issues/120801}: Cleaned up fixtures for importlib.metadata tests and
consolidated behavior with ‘test.support.os_helper’.

@item 
gh-119727@footnote{https://github.com/python/cpython/issues/119727}: Add @code{--single-process} command line option to Python test
runner (regrtest). Patch by Victor Stinner.

@item 
gh-119273@footnote{https://github.com/python/cpython/issues/119273}: Python test runner no longer runs tests using TTY (ex:
test_ioctl) in a process group (using @code{setsid()}). Previously, tests
using TTY were skipped. Patch by Victor Stinner.

@item 
gh-119050@footnote{https://github.com/python/cpython/issues/119050}: regrtest test runner: Add XML support to the refleak checker
(-R option). Patch by Victor Stinner.

@item 
gh-101525@footnote{https://github.com/python/cpython/issues/101525}: Skip @code{test_gdb} if the binary is relocated by BOLT. Patch by
Donghee Na.

@item 
gh-107562@footnote{https://github.com/python/cpython/issues/107562}: Test certificates have been updated to expire far in the
future. This allows testing Y2038 with system time set to after that, so
that actual Y2038 issues can be exposed, and not masked by expired
certificate errors.
@end itemize

@node Security<20>,Library<50>,Tests<17>,Python 3 14 0 alpha 1
@anchor{whatsnew/changelog id220}@anchor{196b}
@subsubsection Security



@itemize -

@item 
gh-125140@footnote{https://github.com/python/cpython/issues/125140}: Remove the current directory from @code{sys.path} when using
PyREPL.

@item 
gh-123678@footnote{https://github.com/python/cpython/issues/123678}: Upgrade libexpat to 2.6.3

@item 
gh-112301@footnote{https://github.com/python/cpython/issues/112301}: Enable compiler options that warn of potential security
vulnerabilities.

@item 
gh-122792@footnote{https://github.com/python/cpython/issues/122792}: Changed IPv4-mapped @code{ipaddress.IPv6Address} to consistently
use the mapped IPv4 address value for deciding properties. Properties
which have their behavior fixed are @code{is_multicast}, @code{is_reserved},
@code{is_link_local}, @code{is_global}, and @code{is_unspecified}.

@item 
gh-112301@footnote{https://github.com/python/cpython/issues/112301}: Add ability to ignore warnings per file with warning count in
warning checking tooling. Patch by Nate Ohlson.

@item 
gh-112301@footnote{https://github.com/python/cpython/issues/112301}: Add macOS warning tracking to warning check tooling. Patch by
Nate Ohlson.

@item 
gh-122133@footnote{https://github.com/python/cpython/issues/122133}: Authenticate the socket connection for the
@code{socket.socketpair()} fallback on platforms where @code{AF_UNIX} is not
available like Windows.

Patch by Gregory P. Smith <@email{greg@@krypto.org}> and Seth Larson
<@email{seth@@python.org}>. Reported by Ellie <@email{el@@horse64.org}>

@item 
gh-121957@footnote{https://github.com/python/cpython/issues/121957}: Fixed missing audit events around interactive use of Python,
now also properly firing for @code{python -i}, as well as for @code{python -m
asyncio}. The events in question are @code{cpython.run_stdin} and
@code{cpython.run_startup}.

@item 
gh-112301@footnote{https://github.com/python/cpython/issues/112301}: Enable runtime protections for glibc to abort execution when
unsafe behavior is encountered, for all platforms except Windows.

@item 
gh-121285@footnote{https://github.com/python/cpython/issues/121285}: Remove backtracking from tarfile header parsing for
@code{hdrcharset}, PAX, and GNU sparse headers.

@item 
gh-112301@footnote{https://github.com/python/cpython/issues/112301}: Add default compiler options to improve security. Enable
-Wimplicit-fallthrough, -fstack-protector-strong, -Wtrampolines.

@item 
gh-118773@footnote{https://github.com/python/cpython/issues/118773}: Fixes creation of ACLs in @ref{52c,,os.mkdir()} on Windows to work
correctly on non-English machines.

@item 
gh-118486@footnote{https://github.com/python/cpython/issues/118486}: @ref{52c,,os.mkdir()} on Windows now accepts `mode' of @code{0o700} to
restrict the new directory to the current user. This fixes
@geindex Common Vulnerabilities and Exposures; CVE 2024-4030
CVE 2024-4030@footnote{https://www.cve.org/CVERecord?id=CVE-2024-4030} affecting @ref{52e,,tempfile.mkdtemp()} in scenarios where the
base temporary directory is more permissive than the default.
@end itemize

@node Library<50>,IDLE<8>,Security<20>,Python 3 14 0 alpha 1
@anchor{whatsnew/changelog id221}@anchor{196c}
@subsubsection Library



@itemize -

@item 
gh-125422@footnote{https://github.com/python/cpython/issues/125422}: Fixed the bug where @ref{aa,,pdb} and @ref{10,,bdb} can step into the
bottom caller frame.

@item 
gh-100141@footnote{https://github.com/python/cpython/issues/100141}: Fixed the bug where @ref{aa,,pdb} will be stuck in an infinite
loop when debugging an empty file.

@item 
gh-53203@footnote{https://github.com/python/cpython/issues/53203}: Fix @ref{1639,,time.strptime()} for @code{%c}, @code{%x} and @code{%X} formats
in many locales that use non-ASCII digits, like Persian, Burmese, Odia and
Shan.

@item 
gh-125206@footnote{https://github.com/python/cpython/issues/125206}: Workaround for old libffi versions is added. Module ctypes
supports double complex only with libffi >= 3.3.0. Patch by
Mikhail Efimov.

@item 
gh-89967@footnote{https://github.com/python/cpython/issues/89967}: Make @ref{196d,,WeakKeyDictionary} and
@ref{196e,,WeakValueDictionary} safe against concurrent mutations
from other threads. Patch by Kumar Aditya.

@item 
gh-125260@footnote{https://github.com/python/cpython/issues/125260}: The @ref{84f,,gzip.compress()} `mtime' parameter now defaults to 0
for reproducible output. Patch by Bernhard M. Wiedemann and Adam Turner.

@item 
gh-125243@footnote{https://github.com/python/cpython/issues/125243}: Fix data race when creating @ref{ae2,,zoneinfo.ZoneInfo} objects
in the free threading build.

@item 
gh-125254@footnote{https://github.com/python/cpython/issues/125254}: Fix a bug where ArgumentError includes the incorrect ambiguous
option in @ref{7,,argparse}.

@item 
gh-125235@footnote{https://github.com/python/cpython/issues/125235}: Keep @ref{f6,,tkinter} TCL paths in venv pointing to base
installation on Windows.

@item 
gh-61011@footnote{https://github.com/python/cpython/issues/61011}: Fix inheritance of nested mutually exclusive groups from parent
parser in @ref{1bf,,argparse.ArgumentParser}. Previously, all nested
mutually exclusive groups lost their connection to the group containing
them and were displayed as belonging directly to the parser.

@item 
gh-125118@footnote{https://github.com/python/cpython/issues/125118}: Don’t copy arbitrary values to _Bool in the
@ref{db,,struct} module.

@item 
gh-125069@footnote{https://github.com/python/cpython/issues/125069}: Fix an issue where providing a @ref{6ce,,pathlib.PurePath} object
as an initializer argument to a second @code{PurePath} object
with a different @ref{537,,parser} resulted in arguments to
the former object’s initializer being joined by the latter object’s
parser.

@item 
gh-125096@footnote{https://github.com/python/cpython/issues/125096}: If the 
@geindex PYTHON_BASIC_REPL
@geindex environment variable; PYTHON_BASIC_REPL
@ref{1b8,,PYTHON_BASIC_REPL} environment variable is set,
the @ref{cc,,site} module no longer imports the @code{_pyrepl} module.
Moreover, the @code{site} module now respects @ref{b5c,,-E} and
@ref{b5d,,-I} command line options: ignore 
@geindex PYTHON_BASIC_REPL
@geindex environment variable; PYTHON_BASIC_REPL
@code{PYTHON_BASIC_REPL} in
this case. Patch by Victor Stinner.

@item 
gh-124969@footnote{https://github.com/python/cpython/issues/124969}: Fix @code{locale.nl_langinfo(locale.ALT_DIGITS)}. Now it returns a
tuple of up to 100 strings (an empty tuple on most locales). Previously it
returned the first item of that tuple or an empty string.

@item 
gh-124960@footnote{https://github.com/python/cpython/issues/124960}: Fix support for the @code{barry_as_FLUFL} future flag in the new
REPL.

@item 
gh-69998@footnote{https://github.com/python/cpython/issues/69998}: Fix @ref{452,,locale.nl_langinfo()} in case when different categories
have different locales. The function now sets temporarily the @code{LC_CTYPE}
locale in some cases. This temporary change affects other threads.

@item 
gh-124958@footnote{https://github.com/python/cpython/issues/124958}: Fix refcycles in exceptions raised from
@ref{4d2,,asyncio.TaskGroup} and the python implementation of
@ref{dcc,,asyncio.Future}

@item 
gh-53203@footnote{https://github.com/python/cpython/issues/53203}: Fix @ref{1639,,time.strptime()} for @code{%c} and @code{%x} formats in many
locales: Arabic, Bislama, Breton, Bodo, Kashubian, Chuvash, Estonian,
French, Irish, Ge’ez, Gurajati, Manx Gaelic, Hebrew, Hindi, Chhattisgarhi,
Haitian Kreyol, Japanese, Kannada, Korean, Marathi, Malay, Norwegian,
Nynorsk, Punjabi, Rajasthani, Tok Pisin, Yoruba, Yue Chinese, Yau/Nungon
and Chinese.

@item 
gh-123961@footnote{https://github.com/python/cpython/issues/123961}: Convert @ref{2f,,curses} to multi-phase initialization
(
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}), thereby fixing reference leaks at interpreter shutdown.
Patch by Bénédikt Tran.

@item 
gh-124944@footnote{https://github.com/python/cpython/issues/124944}: Add @code{SO_ORIGINAL_DST} to the @ref{d1,,socket} module.

@item 
gh-117151@footnote{https://github.com/python/cpython/issues/117151}: The default buffer size used by @ref{c58,,shutil.copyfileobj()} has
been increased from 64k to 256k on non-Windows platforms. It was already
larger on Windows.

@item 
gh-90102@footnote{https://github.com/python/cpython/issues/90102}: Skip the @code{isatty} system call during open() when the file is
known to not be a character device. This provides a slight performance
improvement when reading whole files.

@item 
gh-124917@footnote{https://github.com/python/cpython/issues/124917}: Allow calling @ref{c09,,os.path.exists()} and
@ref{c0a,,os.path.lexists()} with keyword arguments on Windows. Fixes a
regression in 3.13.0.

@item 
gh-65865@footnote{https://github.com/python/cpython/issues/65865}: @ref{7,,argparse} now raises early error for invalid @code{help}
arguments to @ref{4bd,,add_argument()},
@ref{e17,,add_subparsers()} and @code{add_parser()}.

@item 
gh-124653@footnote{https://github.com/python/cpython/issues/124653}: Fix detection of the minimal Queue API needed by the
@ref{8b,,logging} module. Patch by Bénédikt Tran.

@item 
gh-91818@footnote{https://github.com/python/cpython/issues/91818}: The CLI of many modules (@ref{9,,ast}, @ref{59,,ensurepip},
@ref{86,,json}, @ref{aa,,pdb}, @ref{d4,,sqlite3}, @ref{102,,tokenize}, @ref{118,,venv}) now
uses the actual executable name instead of simply “python” to display in
the usage message.

@item 
gh-124858@footnote{https://github.com/python/cpython/issues/124858}: Fix reference cycles left in tracebacks in
@ref{d14,,asyncio.open_connection()} when used with @code{happy_eyeballs_delay}

@item 
gh-124390@footnote{https://github.com/python/cpython/issues/124390}: Fixed @ref{8ba,,AssertionError} when using
@code{asyncio.staggered.staggered_race()} with
@ref{6a3,,asyncio.eager_task_factory}.

@item 
gh-85935@footnote{https://github.com/python/cpython/issues/85935}: @ref{4bd,,argparse.ArgumentParser.add_argument()} now raises an
exception if an @ref{196f,,action} that does not consume arguments (like
‘store_const’ or ‘store_true’) or explicit @code{nargs=0} are specified for
positional arguments.

@item 
gh-124835@footnote{https://github.com/python/cpython/issues/124835}: Make @ref{1970,,tomllib.loads()} raise @ref{199,,TypeError} not
@ref{5f0,,AttributeError} on bad input types that do not have the @code{replace}
attribute. Improve error message when @ref{193,,bytes} is received.

@item 
gh-124693@footnote{https://github.com/python/cpython/issues/124693}: Fix a bug where @ref{7,,argparse} doesn’t recognize negative
complex numbers or negative numbers using scientific notation.

@item 
gh-124787@footnote{https://github.com/python/cpython/issues/124787}: Fix @ref{2b0,,typing.TypeAliasType} with incorrect
@code{type_params} argument. Now it raises a @ref{199,,TypeError} when a type
parameter without a default follows one with a default, and when an entry
in the @code{type_params} tuple is not a type parameter object.

@item 
gh-66436@footnote{https://github.com/python/cpython/issues/66436}: Improved @ref{1be,,prog} default value for
@ref{1bf,,argparse.ArgumentParser}. It will now include the name of the
Python executable along with the module or package name, or the path to a
directory, ZIP file, or directory within a ZIP file if the code was run
that way.

@item 
gh-116850@footnote{https://github.com/python/cpython/issues/116850}: Fix @ref{7,,argparse} for namespaces with not directly writable
dict (e.g. classes).

@item 
gh-101552@footnote{https://github.com/python/cpython/issues/101552}: Add an `annoation_format' parameter to
@ref{231,,inspect.signature()}. Add an `quote_annotation_strings' parameter to
@ref{233,,inspect.Signature.format()}. Use the new functionality to improve the
display of annotations in signatures in @ref{ba,,pydoc}. Patch by Jelle
Zijlstra.

@item 
gh-58573@footnote{https://github.com/python/cpython/issues/58573}: Fix conflicts between abbreviated long options in the parent
parser and subparsers in @ref{7,,argparse}.

@item 
gh-124594@footnote{https://github.com/python/cpython/issues/124594}: All @ref{b,,asyncio} REPL prompts run in the same @ref{178,,context}. Contributed by Bartosz Sławecki.

@item 
gh-61181@footnote{https://github.com/python/cpython/issues/61181}: Fix support of @ref{1971,,choices} with string value in
@ref{7,,argparse}. Substrings of the specified string no longer considered
valid values.

@item 
gh-116750@footnote{https://github.com/python/cpython/issues/116750}: Provide @ref{1972,,sys.monitoring.clear_tool_id()} to unregister all
events and callbacks set by the tool.

@item 
gh-124552@footnote{https://github.com/python/cpython/issues/124552}: Improve the accuracy of @ref{10,,bdb}’s check for the possibility
of breakpoint in a frame. This makes it possible to disable unnecessary
events in functions.

@item 
gh-124538@footnote{https://github.com/python/cpython/issues/124538}: Fixed crash when using @ref{a0c,,gc.get_referents()} on a capsule
object.

@item 
gh-80259@footnote{https://github.com/python/cpython/issues/80259}: Fix @ref{7,,argparse} support of positional arguments with
@code{nargs='?'}, @code{default=argparse.SUPPRESS} and specified @code{type}.

@item 
gh-120378@footnote{https://github.com/python/cpython/issues/120378}: Fix a crash related to an integer overflow in
@ref{1973,,curses.resizeterm()} and @ref{1974,,curses.resize_term()}.

@item 
gh-124498@footnote{https://github.com/python/cpython/issues/124498}: Fix @ref{2b0,,typing.TypeAliasType} not to be generic, when
@code{type_params} is an empty tuple.

@item 
gh-53834@footnote{https://github.com/python/cpython/issues/53834}: Fix support of arguments with @ref{1971,,choices} in @ref{7,,argparse}.
Positional arguments with @ref{1975,,nargs} equal to @code{'?'} or @code{'*'} no
longer check @ref{1976,,default} against @code{choices}. Optional arguments with
@code{nargs} equal to @code{'?'} no longer check @ref{1977,,const} against
@code{choices}.

@item 
gh-123884@footnote{https://github.com/python/cpython/issues/123884}: Fixed bug in itertools.tee() handling of other tee inputs (a
tee in a tee). The output now has the promised `n' independent new
iterators.  Formerly, the first iterator was identical (not independent)
to the input iterator. This would sometimes give surprising results.

@item 
gh-123017@footnote{https://github.com/python/cpython/issues/123017}: Due to unreliable results on some devices,
@ref{13f5,,time.strftime()} no longer accepts negative years on Android.

@item 
gh-123014@footnote{https://github.com/python/cpython/issues/123014}: @ref{6a5,,os.pidfd_open()} and @ref{b2b,,signal.pidfd_send_signal()} are
now unavailable when building against Android API levels older than 31,
since the underlying system calls may cause a crash.

@item 
gh-124176@footnote{https://github.com/python/cpython/issues/124176}: Add support for @ref{4e2,,dataclasses.dataclass()} in
@ref{1978,,unittest.mock.create_autospec()}. Now @code{create_autospec} will check
for potential dataclasses and use @ref{1979,,dataclasses.fields()} function to
retrieve the spec information.

@item 
gh-124345@footnote{https://github.com/python/cpython/issues/124345}: @ref{7,,argparse} supports abbreviated single-dash long options
separated by @code{=} from its value.

@item 
gh-124400@footnote{https://github.com/python/cpython/issues/124400}: Fixed a @ref{aa,,pdb} bug where @code{until} has no effect when it
appears in a @code{commands} sequence. Also avoid printing the frame
information at a breakpoint that has a command list containing a command
that resumes execution.

@item 
gh-90562@footnote{https://github.com/python/cpython/issues/90562}: Modify dataclasses to support zero-argument super() when
@code{slots=True} is specified.  This works by modifying all references to
@code{__class__} to point to the newly created class.

@item 
gh-104860@footnote{https://github.com/python/cpython/issues/104860}: Fix disallowing abbreviation of single-dash long options in
@ref{7,,argparse} with @code{allow_abbrev=False}.

@item 
gh-63143@footnote{https://github.com/python/cpython/issues/63143}: Fix parsing mutually exclusive arguments in @ref{7,,argparse}.
Arguments with the value identical to the default value (e.g. booleans,
small integers, empty or 1-character strings) are no longer considered
“not present”.

@item 
gh-72795@footnote{https://github.com/python/cpython/issues/72795}: Positional arguments with @ref{1975,,nargs} equal to @code{'*'} or
@code{argparse.REMAINDER} are no longer required. This allows to use
positional argument with @code{nargs='*'} and without @code{default} in mutually
exclusive group and improves error message about required arguments.

@item 
gh-59317@footnote{https://github.com/python/cpython/issues/59317}: Fix parsing positional argument with @ref{1975,,nargs} equal to
@code{'?'} or @code{'*'} if it is preceded by an option and another positional
argument.

@item 
gh-100980@footnote{https://github.com/python/cpython/issues/100980}: The @ref{197a,,_fields_} attribute of
@ref{1e7,,ctypes.Structure} and @ref{1e8,,Union} is no longer set if
the setattr operation raises an error.

@item 
gh-53780@footnote{https://github.com/python/cpython/issues/53780}: @ref{7,,argparse} now ignores the first @code{"--"} (double dash)
between an option and command.

@item 
gh-124217@footnote{https://github.com/python/cpython/issues/124217}: Add RFC 9637 reserved IPv6 block @code{3fff::/20} in
@ref{84,,ipaddress} module.

@item 
gh-111513@footnote{https://github.com/python/cpython/issues/111513}: Improve the error message that may be raised by
@ref{dd3,,datetime.date.fromtimestamp()}.

@item 
gh-124248@footnote{https://github.com/python/cpython/issues/124248}: Fixed potential crash when using @ref{db,,struct} to process
zero-width ‘Pascal string’ fields (@code{0p}).

@item 
gh-81691@footnote{https://github.com/python/cpython/issues/81691}: Fix handling of multiple @code{"--"} (double dashes) in
@ref{7,,argparse}. Only the first one has now been removed, all subsequent
ones are now taken literally.

@item 
gh-87041@footnote{https://github.com/python/cpython/issues/87041}: Fix a bug in @ref{7,,argparse} where lengthy subparser argument
help is incorrectly indented.

@item 
gh-84559@footnote{https://github.com/python/cpython/issues/84559}: The default @ref{98,,multiprocessing} start method on Linux and
other POSIX systems has been changed away from often unsafe @code{"fork"} to
@code{"forkserver"} (when the platform supports sending file handles over
pipes as most do) or @code{"spawn"}.  Mac and Windows are unchanged as they
already default to @code{"spawn"}.

@item 
gh-124212@footnote{https://github.com/python/cpython/issues/124212}: Fix invalid variable in @ref{118,,venv} handling of failed symlink
on Windows

@item 
gh-124171@footnote{https://github.com/python/cpython/issues/124171}: Add workaround for broken @code{fmod()} implementations on
Windows, that loose zero sign (e.g. @code{fmod(-10, 1)} returns @code{0.0}).
Patch by Sergey B Kirpichev.

@item 
gh-123978@footnote{https://github.com/python/cpython/issues/123978}: Remove broken @ref{b36,,time.thread_time()} and
@ref{d90,,time.thread_time_ns()} on NetBSD.

@item 
gh-123934@footnote{https://github.com/python/cpython/issues/123934}: Fix @ref{1095,,unittest.mock.MagicMock} resetting magic methods
return values after @code{.reset_mock(return_value=True)} was called.

@item 
gh-124016@footnote{https://github.com/python/cpython/issues/124016}: Update @ref{10c,,unicodedata} database to Unicode 16.0.0.

@item 
gh-123968@footnote{https://github.com/python/cpython/issues/123968}: Fix the command-line interface for the @ref{bd,,random} module to
select floats between 0 and N, not 1 and N.

@item 
gh-123945@footnote{https://github.com/python/cpython/issues/123945}: Fix a bug where @ref{7,,argparse} doesn’t recognize negative
numbers with underscores

@item 
gh-123935@footnote{https://github.com/python/cpython/issues/123935}: Fix parent slots detection for dataclasses that inherit from
classes with @code{__dictoffset__}.

@item 
gh-123892@footnote{https://github.com/python/cpython/issues/123892}: Add @code{"_wmi"} to @ref{a48,,sys.stdlib_module_names}. Patch by
Victor Stinner.

@item 
gh-84808@footnote{https://github.com/python/cpython/issues/84808}: Fix error handling in @ref{fa7,,socket} method
@ref{1745,,connect_ex()} on platforms where @code{errno}
can be negative.

@item 
gh-123756@footnote{https://github.com/python/cpython/issues/123756}: Added a new argument @code{mode} to @ref{275,,pdb.Pdb}. Only allow
@ref{aa,,pdb} from command line to use @code{restart} command.

@item 
gh-122765@footnote{https://github.com/python/cpython/issues/122765}: Fix unbalanced quote errors occurring when activate.csh in
@ref{118,,venv} was sourced with a custom prompt containing unpaired quotes or
newlines.

@item 
gh-123657@footnote{https://github.com/python/cpython/issues/123657}: Fix crash and memory leak in @ref{197b,,decimal.getcontext()}. It
crashed when using a thread-local context by
@code{--with-decimal-contextvar=no}.

@item 
gh-123339@footnote{https://github.com/python/cpython/issues/123339}: Fix @ref{1812,,inspect.getsource()} for classes in
@ref{1f,,collections.abc} and @ref{3a,,decimal} (for pure Python implementation)
modules. @ref{197c,,inspect.getcomments()} now raises OSError instead of
IndexError if the @code{__firstlineno__} value for a class is out of bound.

@item 
gh-123374@footnote{https://github.com/python/cpython/issues/123374}: Remove check for redefined memo entry in
@ref{ec4,,pickletools.dis()}.

@item 
gh-123504@footnote{https://github.com/python/cpython/issues/123504}: Fixed reference leak in the finalization of @ref{f6,,tkinter}.

@item 
gh-123430@footnote{https://github.com/python/cpython/issues/123430}: Pages generated by the @ref{76,,http.server} module allow the
browser to apply its default dark mode.

@item 
gh-123446@footnote{https://github.com/python/cpython/issues/123446}: Fix empty function name in @ref{199,,TypeError} when
@ref{6af,,csv.reader()}, @ref{6b0,,csv.writer()}, or @ref{197d,,csv.register_dialect()}
are used without the required args.

@item 
gh-123448@footnote{https://github.com/python/cpython/issues/123448}: Fixed memory leak of @ref{569,,typing.NoDefault} by moving it to
the static types array.

@item 
gh-123409@footnote{https://github.com/python/cpython/issues/123409}: Fix @ref{197e,,ipaddress.IPv6Address.reverse_pointer} output
according to 
@geindex RFC; RFC 3596 Section 2.5
RFC 3596@comma{} §2.5@footnote{https://datatracker.ietf.org/doc/html/rfc3596.html#section-2.5}.  Patch by Bénédikt
Tran.

@item 
gh-123089@footnote{https://github.com/python/cpython/issues/123089}: Make @ref{7f6,,weakref.WeakSet} safe against concurrent mutations
while it is being iterated. Patch by Kumar Aditya.

@item 
gh-123363@footnote{https://github.com/python/cpython/issues/123363}: Show string value of @ref{197f,,CONTAINS_OP} oparg in @ref{3c,,dis}
output. Patch by Alexandr153.

@item 
gh-123341@footnote{https://github.com/python/cpython/issues/123341}: Add @ref{948,,__class_getitem__()} to
@code{tkinter.Event} for type subscript support at runtime. Patch by
Adonis Rakateli.

@item 
gh-123340@footnote{https://github.com/python/cpython/issues/123340}: Show string value of @ref{1980,,IS_OP} oparg in @ref{3c,,dis}
output.

@item 
gh-119518@footnote{https://github.com/python/cpython/issues/119518}: Speed up normalization of @ref{6ce,,pathlib.PurePath} and
@ref{268,,Path} objects by not interning string parts.

@item 
gh-123270@footnote{https://github.com/python/cpython/issues/123270}: Applied a more surgical fix for malformed payloads in
@ref{8da,,zipfile.Path} causing infinite loops (gh-122905@footnote{https://github.com/python/cpython/issues/122905}) without breaking
contents using legitimate characters.

@item 
gh-73991@footnote{https://github.com/python/cpython/issues/73991}: Add @ref{26a,,pathlib.Path.copy_into()} and
@ref{26c,,move_into()}, which copy and move files and directories
into `existing' directories.

@item 
gh-123228@footnote{https://github.com/python/cpython/issues/123228}: Fix return type for
@code{_pyrepl.readline._ReadlineWrapper.get_line_buffer()} to be
@ref{16a,,str()}.  Patch by Sergey B Kirpichev.

@item 
gh-123240@footnote{https://github.com/python/cpython/issues/123240}: Raise audit events for the @ref{14e4,,input()} in the new REPL.

@item 
gh-76960@footnote{https://github.com/python/cpython/issues/76960}: Fix @ref{109c,,urllib.parse.urljoin()} and
@ref{1453,,urllib.parse.urldefrag()} for URIs containing empty components. For
example, @code{urljoin()} with relative reference “?” now sets empty query
and removes fragment. Preserve empty components (authority, params, query,
fragment) in @code{urljoin()}. Preserve empty components (authority,
params, query) in @code{urldefrag()}.

@item 
gh-116810@footnote{https://github.com/python/cpython/issues/116810}: Resolve a memory leak introduced in CPython 3.10’s @ref{d5,,ssl}
when the @ref{1981,,ssl.SSLSocket.session} property was accessed.  Speeds up
read and write access to said property by no longer unnecessarily cloning
session objects via serialization.

@item 
gh-123243@footnote{https://github.com/python/cpython/issues/123243}: Fix memory leak in @code{_decimal}.

@item 
gh-122546@footnote{https://github.com/python/cpython/issues/122546}: Consistently use same file name for different exceptions in the
new repl. Patch by Sergey B Kirpichev.

@item 
gh-123213@footnote{https://github.com/python/cpython/issues/123213}: @ref{13df,,xml.etree.ElementTree.Element.extend()} and
@ref{361,,Element} assignment no longer hide the
internal exception if an erroneous generator is passed. Patch by Bar
Harel.

@item 
gh-85110@footnote{https://github.com/python/cpython/issues/85110}: Preserve relative path in URL without netloc in
@ref{1982,,urllib.parse.urlunsplit()} and @ref{1983,,urllib.parse.urlunparse()}.

@item 
gh-123165@footnote{https://github.com/python/cpython/issues/123165}: Add support for rendering @ref{1984,,Positions} in
@ref{3c,,dis}.

@item 
gh-122909@footnote{https://github.com/python/cpython/issues/122909}: In urllib.request when URLError is raised opening an ftp URL,
the exception argument is now consistently a string. Earlier versions
passed either a string or an ftplib exception instance as the argument to
URLError.

@item 
gh-123084@footnote{https://github.com/python/cpython/issues/123084}: Deprecate @code{shutil.ExecError}, which hasn’t been raised
by any @ref{ca,,shutil} function since Python 3.4. It’s now an alias for
@ref{246,,RuntimeError}.

@item 
gh-123085@footnote{https://github.com/python/cpython/issues/123085}: In a bare call to @ref{6b7,,importlib.resources.files()}, ensure the
caller’s frame is properly detected when @code{importlib.resources} is itself
available as a compiled module only (no source).

@item 
gh-123067@footnote{https://github.com/python/cpython/issues/123067}: Fix quadratic complexity in parsing @code{"}-quoted cookie values
with backslashes by @ref{75,,http.cookies}.

@item 
gh-123049@footnote{https://github.com/python/cpython/issues/123049}: Add support for @ref{17dc,,UNNAMED_SECTION} in
@ref{1479,,configparser.ConfigParser.add_section()}.

@item 
gh-121735@footnote{https://github.com/python/cpython/issues/121735}: When working with zip archives, importlib.resources now
properly honors module-adjacent references (e.g. @code{files(pkg.mod)} and
not just @code{files(pkg)}).

@item 
gh-122981@footnote{https://github.com/python/cpython/issues/122981}: Fix @ref{1812,,inspect.getsource()} for generated classes with Python
base classes (e.g. enums).

@item 
gh-122903@footnote{https://github.com/python/cpython/issues/122903}: @code{zipfile.Path.glob} now correctly matches directories instead
of silently omitting them.

@item 
gh-122905@footnote{https://github.com/python/cpython/issues/122905}: @ref{8da,,zipfile.Path} objects now sanitize names from the
zipfile.

@item 
gh-122873@footnote{https://github.com/python/cpython/issues/122873}: Enable @ref{86,,json} module to work as a script using the
@ref{23e,,-m} switch: @code{python -m json}. See the @ref{240,,JSON command-line interface} documentation. Patch by Trey Hunner.

@item 
gh-122858@footnote{https://github.com/python/cpython/issues/122858}: Deprecate @code{asyncio.iscoroutinefunction()} in favor of
@ref{30f,,inspect.iscoroutinefunction()}.

@item 
gh-116263@footnote{https://github.com/python/cpython/issues/116263}: @ref{1985,,logging.handlers.RotatingFileHandler} no longer rolls
over empty log files.

@item 
gh-105376@footnote{https://github.com/python/cpython/issues/105376}: Restore the deprecated @ref{8b,,logging} @code{warn()} method. It was
removed in Python 3.13 alpha 1. Keep the deprecated @code{warn()} method in
Python 3.13. Patch by Victor Stinner.

@item 
gh-122311@footnote{https://github.com/python/cpython/issues/122311}: Improve errors in the @ref{ab,,pickle} module.
@ref{1986,,PicklingError} is now raised more often instead of
@ref{889,,UnicodeEncodeError}, @ref{2ee,,ValueError} and @ref{5f0,,AttributeError},
and the original exception is chained to it. Improve and unify error
messages in Python and C implementations.

@item 
gh-122744@footnote{https://github.com/python/cpython/issues/122744}: Bump the version of pip bundled in ensurepip to version 24.2.

@item 
gh-118761@footnote{https://github.com/python/cpython/issues/118761}: Improve import time of @ref{b3,,pprint} by around seven times.
Patch by Hugo van Kemenade.

@item 
gh-118974@footnote{https://github.com/python/cpython/issues/118974}: Add @code{decorator} parameter to
@ref{18a5,,dataclasses.make_dataclass()} to customize the functional creation of
dataclasses.

@item 
gh-118814@footnote{https://github.com/python/cpython/issues/118814}: Fix the @ref{487,,typing.TypeVar} constructor when name is passed
by keyword.

@item 
gh-122637@footnote{https://github.com/python/cpython/issues/122637}: Adjust @code{cmath.tanh(nanj)} and @code{cmath.tanh(infj)} for recent
C standards.

@item 
gh-122478@footnote{https://github.com/python/cpython/issues/122478}: Remove internal frames from tracebacks shown in
@ref{1987,,code.InteractiveInterpreter} with non-default
@ref{a12,,sys.excepthook()}. Save correct tracebacks in
@ref{6e9,,sys.last_traceback} and update @code{__traceback__} attribute of
@ref{6e8,,sys.last_value} and @ref{6e6,,sys.last_exc}.

@item 
gh-116622@footnote{https://github.com/python/cpython/issues/116622}: On Android, the @code{FICLONE} and @code{FICLONERANGE} constants are
no longer exposed by @ref{5d,,fcntl}, as these ioctls are blocked by SELinux.

@item 
gh-82378@footnote{https://github.com/python/cpython/issues/82378}: Make sure that the new @ref{492,,REPL} interprets
@ref{1988,,sys.tracebacklimit} in the same way that the classic REPL did.

@item 
gh-122334@footnote{https://github.com/python/cpython/issues/122334}: Fix crash when importing @ref{d5,,ssl} after the main interpreter
restarts.

@item 
gh-122459@footnote{https://github.com/python/cpython/issues/122459}: Optimize @ref{ab,,pickling} by name objects without the
@code{__module__} attribute.

@item 
gh-87320@footnote{https://github.com/python/cpython/issues/87320}: In @ref{1987,,code.InteractiveInterpreter}, handle exceptions
caused by calling a non-default @ref{a12,,sys.excepthook()}. Before, the
exception bubbled up to the caller, ending the @ref{492,,REPL}.

@item 
gh-122272@footnote{https://github.com/python/cpython/issues/122272}: On some platforms such as Linux, year with century was not
0-padded when formatted by @ref{e94,,strftime()} with C99-specific
specifiers @code{'%C'} or @code{'%F'}. The 0-padding behavior is now guaranteed
when the format specifiers @code{'%C'} and @code{'%F'} are supported by the C
library. Patch by Ben Hsing

@item 
gh-122400@footnote{https://github.com/python/cpython/issues/122400}: Handle @ref{2ee,,ValueError}s raised by @ref{26f,,os.stat()} in
@ref{1146,,filecmp.dircmp} and @ref{1989,,filecmp.cmpfiles()}. Patch by Bénédikt
Tran.

@item 
gh-122311@footnote{https://github.com/python/cpython/issues/122311}: Fix some error messages in @ref{ab,,pickle}.

@item 
gh-121650@footnote{https://github.com/python/cpython/issues/121650}: @ref{3f,,email} headers with embedded newlines are now quoted on
output. The @ref{44,,generator} will now refuse to serialize (write)
headers that are unsafely folded or delimited; see
@ref{4f3,,verify_generated_headers}. (Contributed by Bas
Bloemsaat and Petr Viktorin in gh-121650@footnote{https://github.com/python/cpython/issues/121650}.)

@item 
gh-122332@footnote{https://github.com/python/cpython/issues/122332}: Fixed segfault with @ref{bd5,,asyncio.Task.get_coro()} when using an
eager task factory.

@item 
gh-105733@footnote{https://github.com/python/cpython/issues/105733}: @ref{59e,,ctypes.ARRAY()} is now @ref{23f,,soft deprecated}: it no
longer emits deprecation warnings and is not scheduled for removal.

@item 
gh-122213@footnote{https://github.com/python/cpython/issues/122213}: Add notes for pickle serialization errors that allow to
identify the source of the error.

@item 
gh-119180@footnote{https://github.com/python/cpython/issues/119180}: As part of 
@geindex Python Enhancement Proposals; PEP 749
PEP 749@footnote{https://peps.python.org/pep-0749/}, add the following attributes for
customizing evaluation of annotation scopes:


@itemize *

@item 
@code{evaluate_value} on @ref{2b0,,typing.TypeAliasType}

@item 
@code{evaluate_bound}, @code{evaluate_constraints}, and @code{evaluate_default} on @ref{487,,typing.TypeVar}

@item 
@code{evaluate_default} on @ref{488,,typing.ParamSpec}

@item 
@code{evaluate_default} on @ref{489,,typing.TypeVarTuple}
@end itemize

@item 
gh-119180@footnote{https://github.com/python/cpython/issues/119180}: Fix handling of classes with custom metaclasses in
@code{annotationlib.get_annotations}.

@item 
gh-122170@footnote{https://github.com/python/cpython/issues/122170}: Handle @ref{2ee,,ValueError}s raised by @ref{26f,,os.stat()} in
@ref{89,,linecache}. Patch by Bénédikt Tran.

@item 
gh-122163@footnote{https://github.com/python/cpython/issues/122163}: Add notes for JSON serialization errors that allow to identify
the source of the error.

@item 
gh-122129@footnote{https://github.com/python/cpython/issues/122129}: Improve support of method descriptors and wrappers in the help
title.

@item 
gh-122145@footnote{https://github.com/python/cpython/issues/122145}: Fix an issue when reporting tracebacks corresponding to Python
code emitting an empty AST body. Patch by Nikita Sobolev and Bénédikt
Tran.

@item 
gh-121723@footnote{https://github.com/python/cpython/issues/121723}: Make @ref{13bc,,logging.config.dictConfig()} accept any object
implementing the Queue public API. See the @ref{198a,,queue configuration} section for details. Patch by Bénédikt Tran.

@item 
gh-82951@footnote{https://github.com/python/cpython/issues/82951}: Serializing objects with complex @code{__qualname__} (such as
unbound methods and nested classes) by name no longer involves serializing
parent objects by value in pickle protocols < 4.

@item 
gh-120754@footnote{https://github.com/python/cpython/issues/120754}: @code{Pathlib.read_bytes} no longer opens the file in Python’s
buffered I/O mode. This reduces overheads as the code reads a file in
whole leading to a modest speedup.

@item 
gh-113785@footnote{https://github.com/python/cpython/issues/113785}: @ref{2d,,csv} now correctly parses numeric fields (when used with
@ref{198b,,csv.QUOTE_NONNUMERIC} or @ref{6ae,,csv.QUOTE_STRINGS}) which start
with an escape character.

@item 
gh-122088@footnote{https://github.com/python/cpython/issues/122088}: @ref{48a,,@@warnings.deprecated} now copies the coroutine status of
functions and methods so that @ref{30f,,inspect.iscoroutinefunction()} returns
the correct result.

@item 
gh-122081@footnote{https://github.com/python/cpython/issues/122081}: Fix a crash in the @code{decimal.IEEEContext()} optional
function available via the @code{EXTRA_FUNCTIONALITY} configuration flag.

@item 
gh-73991@footnote{https://github.com/python/cpython/issues/73991}: Add @ref{26b,,pathlib.Path.move()}, which moves a file or directory
tree.

@item 
gh-121268@footnote{https://github.com/python/cpython/issues/121268}: Remove workarounds for non-IEEE 754 systems in @ref{19,,cmath}.

@item 
gh-119698@footnote{https://github.com/python/cpython/issues/119698}: Due to the lack of interest for
@ref{31f,,symtable.Class.get_methods()}, the method is marked as deprecated and
will be removed in Python 3.16. Patch by Bénédikt Tran.

@item 
gh-121889@footnote{https://github.com/python/cpython/issues/121889}: Adjusts @code{cmath.acosh(complex('0+nanj'))} for recent C
standards.

@item 
gh-121804@footnote{https://github.com/python/cpython/issues/121804}: Correctly show error locations, when @ref{18f,,SyntaxError} raised
in new repl. Patch by Sergey B Kirpichev.

@item 
gh-121797@footnote{https://github.com/python/cpython/issues/121797}: Add alternative @ref{215,,Fraction} constructor
@ref{216,,Fraction.from_number()}.

@item 
gh-121798@footnote{https://github.com/python/cpython/issues/121798}: Add alternative @ref{200,,Decimal} constructor
@ref{1ff,,Decimal.from_number()}.

@item 
gh-120930@footnote{https://github.com/python/cpython/issues/120930}: Fixed a bug introduced by gh-92081@footnote{https://github.com/python/cpython/issues/92081} that added an incorrect
extra blank to encoded words occurring in wrapped headers.

@item 
gh-57141@footnote{https://github.com/python/cpython/issues/57141}: The `shallow' argument to @ref{1146,,filecmp.dircmp} (new in Python
3.13) is now keyword-only.

@item 
gh-121245@footnote{https://github.com/python/cpython/issues/121245}: Simplify handling of the history file in
@code{site.register_readline()} helper. The @code{CAN_USE_PYREPL} variable now
will be initialized, when imported.  Patch by Sergey B Kirpichev.

@item 
gh-121249@footnote{https://github.com/python/cpython/issues/121249}: Support the float complex and double complex C types in the @ref{db,,struct} module if the compiler has C11
complex arithmetic.  Patch by Sergey B Kirpichev.

@item 
gh-121486@footnote{https://github.com/python/cpython/issues/121486}: @ref{92,,math} functions @ref{bfe,,isqrt()}, @ref{16cc,,log()},
@ref{12e7,,log2()} and @ref{198c,,log10()} now support integers larger
than @code{2**2**32} on 32-bit platforms.

@item 
gh-121474@footnote{https://github.com/python/cpython/issues/121474}: Fix missing sanity check for @code{parties} arg in
@ref{13ef,,threading.Barrier} constructor. Patch by Clinton Christian
(pygeek).

@item 
gh-121450@footnote{https://github.com/python/cpython/issues/121450}: Hard-coded breakpoints (@ref{273,,breakpoint()} and
@ref{274,,pdb.set_trace()}) now reuse the most recent @code{Pdb} instance that
calls @code{Pdb.set_trace()}, instead of creating a new one each time. As a
result, all the instance specific data like @code{display} and @code{commands}
are preserved across Hard-coded breakpoints.

@item 
gh-119169@footnote{https://github.com/python/cpython/issues/119169}: Slightly speed up @ref{6d1,,os.walk()} by simplifying exception
handling.

@item 
gh-121423@footnote{https://github.com/python/cpython/issues/121423}: Improve import time of @ref{d1,,socket} by lazy importing modules
and writing @code{socket.errorTab} as a constant.

@item 
gh-59110@footnote{https://github.com/python/cpython/issues/59110}: @ref{139,,zipimport} supports now namespace packages when no
directory entry exists.

@item 
gh-119004@footnote{https://github.com/python/cpython/issues/119004}: Fix a crash in @ref{198d,,OrderedDict.__eq__} when operands are mutated during the
check. Patch by Bénédikt Tran.

@item 
gh-121313@footnote{https://github.com/python/cpython/issues/121313}: Limit the reading size in the
@ref{12ec,,multiprocessing.connection.Connection} class to 64 KiB to prevent
memory overallocation and unnecessary memory management system calls.

@item 
gh-121332@footnote{https://github.com/python/cpython/issues/121332}: Fix constructor of @ref{9,,ast} nodes with custom
@code{_attributes}. Previously, passing custom attributes would raise a
@ref{1a4,,DeprecationWarning}. Passing arguments to the constructor that
are not in @code{_fields} or @code{_attributes} remains deprecated. Patch by
Jelle Zijlstra.

@item 
gh-121245@footnote{https://github.com/python/cpython/issues/121245}: Fix a bug in the handling of the command history of the new
@ref{492,,REPL} that caused the history file to be wiped at REPL exit.

@item 
gh-121210@footnote{https://github.com/python/cpython/issues/121210}: Handle AST nodes with missing runtime fields or attributes in
@ref{1c1,,ast.compare()}. Patch by Bénédikt Tran.

@item 
gh-121163@footnote{https://github.com/python/cpython/issues/121163}: Add support for @code{all} as an valid @code{action} for
@ref{8d2,,warnings.simplefilter()} and @ref{16b5,,warnings.filterwarnings()}.

@item 
gh-121151@footnote{https://github.com/python/cpython/issues/121151}: Fix wrapping of long usage text of arguments inside a mutually
exclusive group in @ref{7,,argparse}.

@item 
gh-121141@footnote{https://github.com/python/cpython/issues/121141}: Add support for @ref{1c2,,copy.replace()} to AST nodes. Patch by
Bénédikt Tran.

@item 
gh-87744@footnote{https://github.com/python/cpython/issues/87744}: Fix waitpid race while calling
@ref{198e,,send_signal()} in asyncio. Patch by Kumar
Aditya.

@item 
gh-121027@footnote{https://github.com/python/cpython/issues/121027}: Add a future warning in @code{functools.partial.__get__()}. In
future Python versions @ref{219,,functools.partial} will be a method
descriptor.

@item 
gh-121027@footnote{https://github.com/python/cpython/issues/121027}: Make the @ref{219,,functools.partial} object a method descriptor.

@item 
gh-117784@footnote{https://github.com/python/cpython/issues/117784}: CPython now detects whether its linked TLS library supports
TLSv1.3 post-handshake authentication and disables that feature if support
is lacking.

@item 
gh-121025@footnote{https://github.com/python/cpython/issues/121025}: Improve the @ref{830,,__repr__()} of
@ref{21a,,functools.partialmethod}. Patch by Bénédikt Tran.

@item 
gh-121018@footnote{https://github.com/python/cpython/issues/121018}: Fixed issues where @code{argparse.ArgumentParser.parse_args()}
did not honor @code{exit_on_error=False}. Based on patch by Ben Hsing.

@item 
gh-119614@footnote{https://github.com/python/cpython/issues/119614}: Fix truncation of strings with embedded null characters in some
internal operations in @ref{f6,,tkinter}.

@item 
gh-120910@footnote{https://github.com/python/cpython/issues/120910}: When reading installed files from an egg, use
@code{relative_to(walk_up=True)} to honor files installed outside of the
installation root.

@item 
gh-61103@footnote{https://github.com/python/cpython/issues/61103}: Support float complex, double complex and
long double complex C types in @ref{2e,,ctypes} as
@ref{1ef,,c_float_complex}, @ref{1f0,,c_double_complex} and
@ref{1f1,,c_longdouble_complex} if the compiler has C11 complex
arithmetic. Patch by Sergey B Kirpichev.

@item 
gh-120888@footnote{https://github.com/python/cpython/issues/120888}: Upgrade pip wheel bundled with ensurepip (pip 24.1.1)

@item 
gh-101830@footnote{https://github.com/python/cpython/issues/101830}: Accessing the @ref{f6,,tkinter} object’s string representation no
longer converts the underlying Tcl object to a string on Windows.

@item 
gh-120678@footnote{https://github.com/python/cpython/issues/120678}: Fix regression in the new REPL that meant that globals from
files passed using the @code{-i} argument would not be included in the REPL’s
global namespace. Patch by Alex Waygood.

@item 
gh-120811@footnote{https://github.com/python/cpython/issues/120811}: Fix possible memory leak in @ref{198f,,contextvars.Context.run()}.

@item 
gh-120782@footnote{https://github.com/python/cpython/issues/120782}: Fix wrong references of the @ref{34,,datetime} types after
reloading the module.

@item 
gh-120713@footnote{https://github.com/python/cpython/issues/120713}: @ref{e94,,datetime.datetime.strftime()} now 0-pads years with less
than four digits for the format specifiers @code{%Y} and @code{%G} on Linux.
Patch by Ben Hsing

@item 
gh-120769@footnote{https://github.com/python/cpython/issues/120769}: Make empty line in @ref{aa,,pdb} repeats the last command even
when the command is from @code{cmdqueue}.

@item 
gh-120780@footnote{https://github.com/python/cpython/issues/120780}: Show string value of LOAD_SPECIAL oparg in @ref{3c,,dis} output.

@item 
gh-41431@footnote{https://github.com/python/cpython/issues/41431}: Add @ref{1990,,datetime.time.strptime()} and
@ref{1fb,,datetime.date.strptime()}. Contributed by Wannes Boeykens.

@item 
gh-120743@footnote{https://github.com/python/cpython/issues/120743}: @ref{23f,,Soft deprecate} @ref{31c,,os.popen()} and
@ref{31d,,os.spawn*} functions. They should no longer be used to
write new code. The @ref{dc,,subprocess} module is recommended instead. Patch
by Victor Stinner.

@item 
gh-120732@footnote{https://github.com/python/cpython/issues/120732}: Fix @code{name} passing to @ref{c45,,unittest.mock.Mock} object when
using @ref{1978,,unittest.mock.create_autospec()}.

@item 
gh-111259@footnote{https://github.com/python/cpython/issues/111259}: @ref{be,,re} now handles patterns like @code{"[\s\S]"} or @code{"\s|\S"}
which match any character as effectively as a dot with the @code{DOTALL}
modifier (@code{"(?s:.)"}).

@item 
gh-120683@footnote{https://github.com/python/cpython/issues/120683}: Fix an error in @ref{11ec,,logging.LogRecord}, when the integer
part of the timestamp is rounded up, while the millisecond calculation
truncates, causing the log timestamp to be wrong by up to 999 ms (affected
roughly 1 in 8 million timestamps).

@item 
gh-118710@footnote{https://github.com/python/cpython/issues/118710}: @ref{50d,,ipaddress.IPv4Address} and
@ref{50e,,ipaddress.IPv6Address} attributes @code{version} and
@code{max_prefixlen} are now available on the class.

@item 
gh-120633@footnote{https://github.com/python/cpython/issues/120633}: Move scrollbar and remove tear-off menus in turtledemo.

@item 
gh-120606@footnote{https://github.com/python/cpython/issues/120606}: Allow users to use EOF to exit @code{commands} definition in
@ref{aa,,pdb}

@item 
gh-120284@footnote{https://github.com/python/cpython/issues/120284}: Allow @ref{1991,,asyncio.Runner.run()} to accept @ref{4ca,,awaitable}
objects instead of simply @ref{6ba,,coroutine}s.

@item 
gh-120541@footnote{https://github.com/python/cpython/issues/120541}: Improve the prompt in the “less” pager when @ref{ada,,help()} is
called with non-string argument.

@item 
gh-120495@footnote{https://github.com/python/cpython/issues/120495}: Fix incorrect exception handling in Tab Nanny. Patch by
Wulian233.

@item 
gh-120388@footnote{https://github.com/python/cpython/issues/120388}: Improve a warning message when a test method in @ref{10d,,unittest}
returns something other than @code{None}. Now we show the returned object
type and optional asyncio-related tip.

@item 
gh-120381@footnote{https://github.com/python/cpython/issues/120381}: Correct @ref{1992,,inspect.ismethoddescriptor()} to check also for
the lack of @ref{1993,,__delete__()}.  Patch by Jan Kaliszewski.

@item 
gh-90425@footnote{https://github.com/python/cpython/issues/90425}: The OS byte in gzip headers is now always set to 255 when using
@ref{84f,,gzip.compress()}.

@item 
gh-120343@footnote{https://github.com/python/cpython/issues/120343}: Fix column offset reporting for tokens that come after
multiline f-strings in the @ref{102,,tokenize} module.

@item 
gh-119180@footnote{https://github.com/python/cpython/issues/119180}: As part of implementing 
@geindex Python Enhancement Proposals; PEP 649
PEP 649@footnote{https://peps.python.org/pep-0649/} and 
@geindex Python Enhancement Proposals; PEP 749
PEP 749@footnote{https://peps.python.org/pep-0749/}, add a new
module @code{annotationlib}. Add support for unresolved forward references in
annotations to @ref{33,,dataclasses}, @ref{330,,typing.TypedDict}, and
@ref{32f,,typing.NamedTuple}.

@item 
gh-119600@footnote{https://github.com/python/cpython/issues/119600}: Fix @ref{1098,,unittest.mock.patch()} to not read attributes of the
target when @code{new_callable} is set. Patch by Robert Collins.

@item 
gh-120289@footnote{https://github.com/python/cpython/issues/120289}: Fixed the use-after-free issue in @ref{2b,,cProfile} by
disallowing @code{disable()} and @code{clear()} in external timers.

@item 
gh-82017@footnote{https://github.com/python/cpython/issues/82017}: Added support for converting any objects that have the
@code{as_integer_ratio()} method to a @ref{215,,Fraction}.

@item 
gh-114053@footnote{https://github.com/python/cpython/issues/114053}: Fix edge-case bug where @ref{8c2,,typing.get_type_hints()} would
produce incorrect results if type parameters in a class scope were
overridden by assignments in a class scope and @code{from __future__ import
annotations} semantics were enabled. Patch by Alex Waygood.

@item 
gh-114053@footnote{https://github.com/python/cpython/issues/114053}: Fix erroneous @ref{450,,NameError} when calling
@ref{a1a,,inspect.get_annotations()} with @code{eval_str=True`} on a class that
made use of 
@geindex Python Enhancement Proposals; PEP 695
PEP 695@footnote{https://peps.python.org/pep-0695/} type parameters in a module that had @code{from
__future__ import annotations} at the top of the file. Patch by Alex
Waygood.

@item 
gh-120268@footnote{https://github.com/python/cpython/issues/120268}: Prohibit passing @code{None} to pure-Python
@ref{dd3,,datetime.date.fromtimestamp()} to achieve consistency with
C-extension implementation.

@item 
gh-120244@footnote{https://github.com/python/cpython/issues/120244}: Fix memory leak in @ref{5a3,,re.sub()} when the replacement string
contains backreferences.

@item 
gh-120254@footnote{https://github.com/python/cpython/issues/120254}: Added @code{commands} argument to @ref{274,,pdb.set_trace()} which
allows users to send debugger commands from the source file.

@item 
gh-120211@footnote{https://github.com/python/cpython/issues/120211}: Fix @ref{100,,tkinter.ttk} with Tcl/Tk 9.0.

@item 
gh-71587@footnote{https://github.com/python/cpython/issues/71587}: Fix crash in C version of @ref{1994,,datetime.datetime.strptime()}
when called again on the restarted interpreter.

@item 
gh-117983@footnote{https://github.com/python/cpython/issues/117983}: Defer the @code{threading} import in @code{importlib.util} until lazy
loading is used.

@item 
gh-120157@footnote{https://github.com/python/cpython/issues/120157}: Remove unused constant
@code{concurrent.futures._base._FUTURE_STATES} in @ref{24,,concurrent.futures}.
Patch by Clinton Christian (pygeek).

@item 
gh-120161@footnote{https://github.com/python/cpython/issues/120161}: @ref{34,,datetime} no longer crashes in certain complex reference
cycle situations.

@item 
gh-119698@footnote{https://github.com/python/cpython/issues/119698}: Fix @ref{31f,,symtable.Class.get_methods()} and document its
behaviour. Patch by Bénédikt Tran.

@item 
gh-120121@footnote{https://github.com/python/cpython/issues/120121}: Add @ref{1995,,concurrent.futures.InvalidStateError} to module’s
@code{__all__}.

@item 
gh-119933@footnote{https://github.com/python/cpython/issues/119933}: Add the @ref{1996,,symtable.SymbolTableType} enumeration to
represent the possible outputs of the
@ref{1997,,symtable.SymbolTable.get_type} method. Patch by Bénédikt Tran.

@item 
gh-120029@footnote{https://github.com/python/cpython/issues/120029}: Expose @ref{28b,,symtable.Symbol} methods
@ref{28e,,is_free_class()},
@ref{28d,,is_comp_iter()} and
@ref{28c,,is_comp_cell()}. Patch by Bénédikt Tran.

@item 
gh-120108@footnote{https://github.com/python/cpython/issues/120108}: Fix calling @ref{d6b,,copy.deepcopy()} on @ref{9,,ast} trees that have
been modified to have references to parent nodes. Patch by Jelle Zijlstra.

@item 
gh-120056@footnote{https://github.com/python/cpython/issues/120056}: Add @code{socket.IP_RECVERR} and @code{socket.IP_RECVTTL}
constants (both available since Linux 2.2). And
@code{socket.IP_RECVORIGDSTADDR} constant (available since Linux
2.6.29).

@item 
gh-112672@footnote{https://github.com/python/cpython/issues/112672}: Support building @ref{f6,,tkinter} with Tcl 9.0.

@item 
gh-120057@footnote{https://github.com/python/cpython/issues/120057}: Added the @ref{25b,,os.environ.refresh()} method to
update @code{os.environ} with changes to the environment made by
@ref{25d,,os.putenv()}, by @ref{25e,,os.unsetenv()}, or made outside Python in the
same process. Patch by Victor Stinner.

@item 
gh-120029@footnote{https://github.com/python/cpython/issues/120029}: Expose @ref{1998,,symtable.Symbol.is_type_parameter()} in the
@ref{de,,symtable} module. Patch by Bénédikt Tran.

@item 
gh-119819@footnote{https://github.com/python/cpython/issues/119819}: Fix regression to allow logging configuration with
multiprocessing queue types.

@item 
gh-65454@footnote{https://github.com/python/cpython/issues/65454}: @ref{1999,,unittest.mock.Mock.attach_mock()} no longer triggers a call
to a @code{PropertyMock} being attached.

@item 
gh-117142@footnote{https://github.com/python/cpython/issues/117142}: The @ref{2e,,ctypes} module may now be imported in all
subinterpreters, including those that have their own GIL.

@item 
gh-118835@footnote{https://github.com/python/cpython/issues/118835}: Fix _pyrepl crash when using custom prompt with ANSI escape
codes.

@item 
gh-81936@footnote{https://github.com/python/cpython/issues/81936}: @code{help()} and @code{showtopic()} methods now respect a
configured `output' argument to @code{pydoc.Helper} and not use the
pager in such cases. Patch by Enrico Tröger.

@item 
gh-117398@footnote{https://github.com/python/cpython/issues/117398}: The @code{_datetime} module (C implementation for @ref{34,,datetime})
now supports being imported in multiple interpreters.

@item 
gh-119824@footnote{https://github.com/python/cpython/issues/119824}: Print stack entry in @ref{aa,,pdb} when and only when user input
is needed.

@item 
gh-119838@footnote{https://github.com/python/cpython/issues/119838}: In mixed arithmetic operations with
@ref{215,,Fraction} and complex, the fraction is now converted to
@ref{197,,float} instead of @ref{198,,complex}.

@item 
gh-119770@footnote{https://github.com/python/cpython/issues/119770}: Make @ref{e7,,termios} @code{ioctl()} constants positive. Patch by
Victor Stinner.

@item 
gh-89727@footnote{https://github.com/python/cpython/issues/89727}: Fix issue with @ref{354,,shutil.rmtree()} where a
@ref{f6e,,RecursionError} is raised on deep directory trees.

@item 
gh-119577@footnote{https://github.com/python/cpython/issues/119577}: The @ref{1a4,,DeprecationWarning} emitted when testing the truth
value of an @ref{361,,xml.etree.ElementTree.Element} now describes
unconditionally returning @code{True} in a future version rather than raising
an exception in Python 3.14.

@item 
gh-89727@footnote{https://github.com/python/cpython/issues/89727}: Partially fix issue with @ref{354,,shutil.rmtree()} where a
@ref{f6e,,RecursionError} is raised on deep directory trees. A recursion error
is no longer raised when @code{rmtree.avoids_symlink_attacks} is false.

@item 
gh-93963@footnote{https://github.com/python/cpython/issues/93963}: Remove deprecated names from @code{importlib.abc} as found in
@code{importlib.resources.abc}.

@item 
gh-119118@footnote{https://github.com/python/cpython/issues/119118}: Fix performance regression in the @ref{102,,tokenize} module by
caching the @code{line} token attribute and calculating the column offset
more efficiently.

@item 
gh-89727@footnote{https://github.com/python/cpython/issues/89727}: Fix issue with @ref{d58,,os.fwalk()} where a @ref{f6e,,RecursionError}
was raised on deep directory trees by adjusting the implementation to be
iterative instead of recursive.

@item 
gh-119594@footnote{https://github.com/python/cpython/issues/119594}: If one calls pow(fractions.Fraction, x, module) with modulo not
None, the error message now says that the types are incompatible rather
than saying pow only takes 2 arguments. Patch by Wim Jeantine-Glenn and
Mark Dickinson.

@item 
gh-119588@footnote{https://github.com/python/cpython/issues/119588}: @code{zipfile.Path.is_symlink} now assesses if the given path is a
symlink.

@item 
gh-119562@footnote{https://github.com/python/cpython/issues/119562}: Remove @code{ast.Num}, @code{ast.Str},
@code{ast.Bytes}, @code{ast.NameConstant} and
@code{ast.Ellipsis}. They had all emitted deprecation warnings since
Python 3.12. Patch by Alex Waygood.

@item 
gh-119555@footnote{https://github.com/python/cpython/issues/119555}: Catch @ref{18f,,SyntaxError} from @ref{4b2,,compile()} in the
runsource() method of the InteractiveColoredConsole.  Patch by Sergey B
Kirpichev.

@item 
gh-118908@footnote{https://github.com/python/cpython/issues/118908}: Limit exposed globals from internal imports and definitions on
new REPL startup. Patch by Eugene Triguba and Pablo Galindo.

@item 
gh-117865@footnote{https://github.com/python/cpython/issues/117865}: Improve the import time of the @ref{9,,ast} module by deferring
the import of @ref{be,,re}. Patch by Jelle Zijlstra.

@item 
gh-119127@footnote{https://github.com/python/cpython/issues/119127}: Positional arguments of @ref{219,,functools.partial()} objects now
support placeholders via @ref{218,,functools.Placeholder}.

@item 
gh-113892@footnote{https://github.com/python/cpython/issues/113892}: Now, the method @code{sock_connect} of
@ref{81e,,asyncio.ProactorEventLoop} raises a @ref{2ee,,ValueError} if given
socket is not in non-blocking mode, as well as in other loop
implementations.

@item 
gh-119506@footnote{https://github.com/python/cpython/issues/119506}: Fix @code{io.TextIOWrapper.write()} method breaks internal
buffer when the method is called again during flushing internal buffer.

@item 
gh-69214@footnote{https://github.com/python/cpython/issues/69214}: Fix @code{fcntl.ioctl()} `request' parameter: use an @code{unsigned
long} instead of an @code{unsigned int} for the `request' parameter of
@ref{1687,,fcntl.ioctl()} to support requests larger than @code{UINT_MAX}. Patch by
Victor Stinner.

@item 
gh-119105@footnote{https://github.com/python/cpython/issues/119105}: @code{difflib}’s @code{DIffer.compare()} (and so also @code{ndiff}) can
no longer be provoked into cubic-time behavior, or into unbounded
recursion, and should generally be faster in ordinary cases too. Results
may change in some cases, although that should be rare. Correctness of
diffs is not affected. Some similar lines far apart may be reported as
deleting one and adding the other, where before they were displayed on
adjacent output lines with markup showing the intraline differences.

@item 
gh-119443@footnote{https://github.com/python/cpython/issues/119443}: The interactive REPL no longer runs with @code{from __future__
import annotations} enabled. Patch by Jelle Zijlstra.

@item 
gh-119461@footnote{https://github.com/python/cpython/issues/119461}: Add @code{socket.VMADDR_CID_LOCAL} constant. Patch by Victor
Stinner.

@item 
gh-117398@footnote{https://github.com/python/cpython/issues/117398}: Objects in the datetime C-API are now all statically allocated,
which means better memory safety, especially when the module is reloaded.
This should be transparent to users.

@item 
gh-118894@footnote{https://github.com/python/cpython/issues/118894}: @ref{b,,asyncio} REPL now has the same capabilities as PyREPL.

@item 
gh-118830@footnote{https://github.com/python/cpython/issues/118830}: Bump @ref{ab,,pickle} default protocol to @code{5}.

@item 
gh-118911@footnote{https://github.com/python/cpython/issues/118911}: In PyREPL, updated @code{maybe-accept}’s logic so that if the user
hits @code{Enter} twice, they are able to terminate the block even if
there’s trailing whitespace. Also, now when the user hits arrow up, the
cursor is on the last functional line. This matches IPython’s behavior.
Patch by Aya Elsayed.

@item 
gh-115225@footnote{https://github.com/python/cpython/issues/115225}: Raise error on certain technically valid but pathological ISO
8601 strings passed to @ref{82a,,datetime.time.fromisoformat()} that were
previously parsed incorrectly.

@item 
gh-111201@footnote{https://github.com/python/cpython/issues/111201}: Remove dependency to @ref{bf,,readline} from the new Python REPL.

@item 
gh-119189@footnote{https://github.com/python/cpython/issues/119189}: When using the @code{**} operator or @ref{1a5,,pow()} with
@ref{215,,Fraction} as the base and an exponent that is not
rational, a float, or a complex, the fraction is no longer converted to a
float.

@item 
gh-119174@footnote{https://github.com/python/cpython/issues/119174}: Fix high DPI causes turtledemo(turtle-graphics examples)
windows blurry Patch by Wulian233 and Terry Jan Reedy

@item 
gh-119121@footnote{https://github.com/python/cpython/issues/119121}: Fix a NameError happening in
@code{asyncio.staggered.staggered_race}. This function is now tested.

@item 
gh-119105@footnote{https://github.com/python/cpython/issues/119105}: @code{difflib.Differ} is much faster for some cases of diffs where
many pairs of lines are equally similar.

@item 
gh-119113@footnote{https://github.com/python/cpython/issues/119113}: Fix issue where @ref{199a,,pathlib.PurePath.with_suffix()} didn’t
raise @ref{199,,TypeError} when given @code{None} as a suffix.

@item 
gh-118643@footnote{https://github.com/python/cpython/issues/118643}: Fix an AttributeError in the @ref{3f,,email} module when re-fold a
long address list. Also fix more cases of incorrect encoding of the
address separator in the address list.

@item 
gh-73991@footnote{https://github.com/python/cpython/issues/73991}: Add @ref{269,,pathlib.Path.copy()}, which copies a file or directory
to another.

@item 
gh-58933@footnote{https://github.com/python/cpython/issues/58933}: Make @ref{aa,,pdb} return to caller frame correctly when
@code{f_trace} of the caller frame is not set

@item 
gh-82805@footnote{https://github.com/python/cpython/issues/82805}: Support single-dot file extensions in
@ref{199b,,pathlib.PurePath.suffix} and related attributes and methods. For
example, the @ref{199c,,suffixes} of
@code{PurePath('foo.bar.')} are now @code{['.bar', '.']} rather than @code{[]}.
This brings file extension splitting in line with
@ref{199d,,os.path.splitext()}.

@item 
gh-118924@footnote{https://github.com/python/cpython/issues/118924}: Remove @code{version} and @code{version_info} from
@ref{d4,,sqlite3}. Patch by Hugo van Kemenade.

@item 
gh-118928@footnote{https://github.com/python/cpython/issues/118928}: Disallow using a sequence of parameters with named placeholders
in @ref{d4,,sqlite3} queries. Patch by Erlend E. Aasland.

@item 
gh-118895@footnote{https://github.com/python/cpython/issues/118895}: Setting attributes on @ref{569,,typing.NoDefault} now raises
@ref{5f0,,AttributeError} instead of @ref{199,,TypeError}.

@item 
gh-118868@footnote{https://github.com/python/cpython/issues/118868}: Fixed issue where kwargs were no longer passed to the logging
handler QueueHandler

@item 
gh-118827@footnote{https://github.com/python/cpython/issues/118827}: Remove deprecated @code{Quoter} class from
@ref{111,,urllib.parse}. It had previously raised a @ref{1a4,,DeprecationWarning}
since Python 3.11. Patch by Nikita Sobolev.

@item 
gh-118824@footnote{https://github.com/python/cpython/issues/118824}: Remove deprecated @code{pty.master_open()} and
@code{pty.slave_open()}. Use @ref{303,,pty.openpty()} instead. Patch by Nikita
Sobolev.

@item 
gh-118851@footnote{https://github.com/python/cpython/issues/118851}: @code{ctx} arguments to the constructors of @ref{9,,ast} node
classes now default to @ref{4c3,,ast.Load()}. Patch by Jelle
Zijlstra.

@item 
gh-101588@footnote{https://github.com/python/cpython/issues/101588}: Remove copy, deepcopy, and pickle from itertools. These had
previously raised a DeprecationWarning since Python 3.12.

@item 
gh-118805@footnote{https://github.com/python/cpython/issues/118805}: Remove `type', `choices', and `metavar' parameters of
@code{argparse.BooleanOptionalAction}. They were deprecated since
Python 3.12.

@item 
gh-118803@footnote{https://github.com/python/cpython/issues/118803}: @code{typing.ByteString} and
@code{collections.abc.ByteString} are removed. They had previously
raised a @ref{1a4,,DeprecationWarning} since Python 3.12.

@item 
gh-118798@footnote{https://github.com/python/cpython/issues/118798}: The `isdst' parameter has been removed from
@ref{2f9,,email.utils.localtime()}. Patch by Hugo van Kemenade.

@item 
gh-118760@footnote{https://github.com/python/cpython/issues/118760}: Restore the default value of @code{tkiter.wantobjects} to @code{1}.

@item 
gh-118760@footnote{https://github.com/python/cpython/issues/118760}: Fix errors in calling Tkinter bindings on Windows.

@item 
gh-74033@footnote{https://github.com/python/cpython/issues/74033}: Drop support for passing keyword arguments to
@ref{268,,pathlib.Path}.

@item 
gh-101357@footnote{https://github.com/python/cpython/issues/101357}: Suppress all @ref{2c2,,OSError} exceptions from
@ref{c11,,pathlib.Path.exists()} and @code{is_*()} methods, rather than a
selection of more common errors. The new behaviour is consistent with
@ref{c09,,os.path.exists()}, @ref{c0b,,os.path.isdir()}, etc. Use
@ref{a2a,,pathlib.Path.stat()} to retrieve the file status without suppressing
exceptions.

@item 
gh-78707@footnote{https://github.com/python/cpython/issues/78707}: Drop support for passing additional positional arguments to
@ref{2ff,,pathlib.PurePath.relative_to()} and
@ref{300,,is_relative_to()}.

@item 
gh-118507@footnote{https://github.com/python/cpython/issues/118507}: Fix @ref{c0c,,os.path.isfile()} on Windows for pipes. Speedup
@ref{6cb,,os.path.isjunction()} and @ref{c0a,,os.path.lexists()} on Windows with a
native implementation.

@item 
gh-118772@footnote{https://github.com/python/cpython/issues/118772}: Allow @ref{487,,typing.TypeVar} instances without a default to
follow instances without a default in some cases. Patch by Jelle Zijlstra.

@item 
gh-118714@footnote{https://github.com/python/cpython/issues/118714}: Allow @code{restart} in post-mortem debugging of @ref{aa,,pdb}.
Removed restart message when the user quits pdb from post-mortem mode.

@item 
gh-118673@footnote{https://github.com/python/cpython/issues/118673}: Removed executable bits and shebang from stdlib modules.

@item 
gh-110863@footnote{https://github.com/python/cpython/issues/110863}: @ref{264,,os.path.realpath()} now suppresses any @ref{2c2,,OSError} from
@ref{b20,,os.readlink()} when `strict' mode is disabled (the default).

@item 
gh-118263@footnote{https://github.com/python/cpython/issues/118263}: Speed up @ref{6cc,,os.path.splitroot()} & @ref{1525,,os.path.normpath()}
with a direct C call.

@item 
gh-110190@footnote{https://github.com/python/cpython/issues/110190}: Fix ctypes structs with array on SPARC by setting
@code{MAX_STRUCT_SIZE} to 32 in stgdict. Patch by Jakub Kulik

@item 
gh-118033@footnote{https://github.com/python/cpython/issues/118033}: Fix @ref{4e2,,dataclasses.dataclass()} not creating a
@code{__weakref__} slot when subclassing @ref{1806,,typing.Generic}.

@item 
gh-117766@footnote{https://github.com/python/cpython/issues/117766}: Always use @ref{16a,,str()} to print @code{choices} in @ref{7,,argparse}.

@item 
gh-106531@footnote{https://github.com/python/cpython/issues/106531}: In @ref{7f,,importlib.resources}, sync with importlib_resources 6.3.2@footnote{https://importlib-resources.readthedocs.io/en/latest/history.html#v6-3-2},
including: @code{MultiplexedPath} now expects @code{Traversable} paths,
deprecating string arguments to @code{MultiplexedPath}; Enabled support for
resources in namespace packages in zip files; Fixed @code{NotADirectoryError}
when calling files on a subdirectory of a namespace package.

@item 
gh-115937@footnote{https://github.com/python/cpython/issues/115937}: Removed extra preprocessing for the @code{__signature__}
attribute: the code just check if it’s a @ref{4e4,,inspect.Signature}
instance.  Patch by Sergey B Kirpichev.

@item 
gh-115808@footnote{https://github.com/python/cpython/issues/115808}: Add @ref{257,,operator.is_none()} and @ref{258,,operator.is_not_none()}
functions.

@item 
gh-114264@footnote{https://github.com/python/cpython/issues/114264}: Improve performance of @ref{d6b,,copy.deepcopy()} by adding a fast
path for atomic types.

@item 
gh-113878@footnote{https://github.com/python/cpython/issues/113878}: Add `doc' parameter to @ref{199e,,dataclasses.field()}, so it can be
stored and shown as a documentation / metadata. If
@code{@@dataclass(slots=True)} is used, then the supplied string is available
in the @ref{16f7,,__slots__} dict. Otherwise, the supplied string is
only available in the corresponding @ref{199f,,dataclasses.Field} object.

In order to support this feature we are changing the @code{__slots__} format
in dataclasses from @ref{614,,tuple} to @ref{184,,dict} when documentation /
metadata is present.

@item 
gh-113978@footnote{https://github.com/python/cpython/issues/113978}: Ignore warnings on text completion inside REPL.

@item 
gh-113008@footnote{https://github.com/python/cpython/issues/113008}: Correct argparse usage output for required, mutually exclusive
groups containing a positional argument

@item 
gh-108172@footnote{https://github.com/python/cpython/issues/108172}: @code{webbrowser} honors OS preferred browser on Linux when its
desktop entry name contains the text of a known browser name.

@item 
gh-109109@footnote{https://github.com/python/cpython/issues/109109}: You can now get the raw TLS certificate chains from TLS
connections via @ref{19a0,,ssl.SSLSocket.get_verified_chain()} and
@ref{19a1,,ssl.SSLSocket.get_unverified_chain()} methods.

Contributed by Mateusz Nowak.

@item 
gh-105623@footnote{https://github.com/python/cpython/issues/105623}: Fix performance degradation in
@ref{1985,,logging.handlers.RotatingFileHandler}. Patch by Craig Robson.

@item 
gh-102450@footnote{https://github.com/python/cpython/issues/102450}: Add missing ISO-8601 24:00 alternative to midnight of next day
to @ref{82b,,datetime.datetime.fromisoformat()} and
@ref{82a,,datetime.time.fromisoformat()}. Patch by Izan “TizzySaurus” Robinson
(@email{tizzysaurus@@gmail.com})

@item 
gh-103956@footnote{https://github.com/python/cpython/issues/103956}: Fix lack of newline characters in @ref{104,,trace} module output
when line tracing is enabled but source code line for current frame is not
available.

@item 
gh-92081@footnote{https://github.com/python/cpython/issues/92081}: Fix missing spaces in email headers when the spaces are mixed
with encoded 8-bit characters.

@item 
gh-103194@footnote{https://github.com/python/cpython/issues/103194}: Prepare Tkinter for C API changes in Tcl 8.7/9.0 to avoid
@code{_tkinter.Tcl_Obj} being unexpectedly returned instead of
@ref{3c1,,bool}, @ref{16a,,str}, @ref{342,,bytearray}, or @ref{19c,,int}.

@item 
gh-87106@footnote{https://github.com/python/cpython/issues/87106}: Fixed handling in @ref{18d9,,inspect.Signature.bind()} of keyword
arguments having the same name as positional-only arguments when a
variadic keyword argument (e.g. @code{**kwargs}) is present.

@item 
gh-103134@footnote{https://github.com/python/cpython/issues/103134}: Add additional methods to @ref{24e,,proxy objects} in the @code{multiprocessing} module:


@itemize *

@item 
@code{clear()} and @code{copy()} for proxies of @ref{24f,,list}

@item 
@ref{250,,fromkeys()}, @code{reversed(d)}, @code{d | @{@}}, @code{@{@} | d},
@code{d |= @{'b': 2@}} for proxies of @ref{184,,dict}
@end itemize

@item 
bpo-45767@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45767}: Fix integer conversion in @ref{19a2,,os.major()}, @ref{19a3,,os.minor()},
and @ref{19a4,,os.makedev()}. Support device numbers larger than @code{2**63-1}.
Support non-existent device number (@code{NODEV}).

@item 
bpo-44864@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44864}: Do not translate user-provided strings in
@ref{1bf,,argparse.ArgumentParser}.

@item 
bpo-41843@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41843}: Solaris now uses @ref{d0b,,os.sendfile()} fast-copy syscall for more
efficient @ref{ca,,shutil} file copy related functions.

@item 
bpo-15987@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15987}: Implemented @ref{1c1,,ast.compare()} for comparing two ASTs. Patch
by Batuhan Taskaya with some help from Jeremy Hylton.

@item 
gh-67693@footnote{https://github.com/python/cpython/issues/67693}: Fix @ref{1983,,urllib.parse.urlunparse()} and
@ref{1982,,urllib.parse.urlunsplit()} for URIs with path starting with multiple
slashes and no authority. Based on patch by Ashwin Ramaswami.

@item 
bpo-14074@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14074}: Fix @ref{7,,argparse} metavar processing to allow positional
arguments to have a tuple metavar.
@end itemize

@node IDLE<8>,Documentation<17>,Library<50>,Python 3 14 0 alpha 1
@anchor{whatsnew/changelog id222}@anchor{19a5}
@subsubsection IDLE



@itemize -

@item 
gh-122392@footnote{https://github.com/python/cpython/issues/122392}: Increase currently inadequate vertical spacing for the IDLE
browsers (path, module, and stack) on high-resolution monitors.

@item 
gh-112938@footnote{https://github.com/python/cpython/issues/112938}: Fix uninteruptable hang when Shell gets rapid continuous
output.

@item 
gh-122482@footnote{https://github.com/python/cpython/issues/122482}: Change About IDLE to direct users to discuss.python.org instead
of the now unused idle-dev email and mailing list.

@item 
gh-78889@footnote{https://github.com/python/cpython/issues/78889}: Stop Shell freezes by blocking user access to non-method
sys.stdout.shell attributes, which are all private.

@item 
gh-120083@footnote{https://github.com/python/cpython/issues/120083}: Add explicit black IDLE Hovertip foreground color needed for
recent macOS. Fixes Sonoma showing unreadable white on pale yellow.  Patch
by John Riggles.

@item 
gh-120104@footnote{https://github.com/python/cpython/issues/120104}: Fix padding in config and search dialog windows in IDLE.
@end itemize

@node Documentation<17>,Core and Builtins<45>,IDLE<8>,Python 3 14 0 alpha 1
@anchor{whatsnew/changelog id223}@anchor{19a6}
@subsubsection Documentation



@itemize -

@item 
gh-124872@footnote{https://github.com/python/cpython/issues/124872}: Added definitions for @ref{19a7,,context}, @ref{19a8,,current context},
and @ref{19a9,,context management protocol}, updated related definitions to be
consistent, and expanded the documentation for
@ref{178,,contextvars.Context}.

@item 
gh-125018@footnote{https://github.com/python/cpython/issues/125018}: The @ref{7e,,importlib.metadata} documentation now includes
semantic cross-reference targets for the significant documented APIs. This
means intersphinx references like @ref{19aa,,importlib.metadata.version()} will
now work as expected.

@item 
gh-124720@footnote{https://github.com/python/cpython/issues/124720}: Update “Using Python on a Mac” section of the “Python Setup and
Usage” document and include information on installing free-threading
support.

@item 
gh-124457@footnote{https://github.com/python/cpython/issues/124457}: Remove coverity scan from the CPython repo. It has not been
used since 2020 and is currently unmaintained.

@item 
gh-116622@footnote{https://github.com/python/cpython/issues/116622}: Add an Android platform guide, and flag modules not available
on Android.

@item 
gh-123976@footnote{https://github.com/python/cpython/issues/123976}: Refresh docs around custom providers.

@item 
gh-70870@footnote{https://github.com/python/cpython/issues/70870}: Clarified the dual usage of the term “free variable” (both the
formal meaning of any reference to names defined outside the local scope,
and the narrower pragmatic meaning of nonlocal variables named in
@code{co_freevars}).

@item 
gh-121277@footnote{https://github.com/python/cpython/issues/121277}: Writers of CPython’s documentation can now use @code{next} as the
version for the @code{versionchanged}, @code{versionadded}, @code{deprecated}
directives.

@item 
gh-117765@footnote{https://github.com/python/cpython/issues/117765}: Improved documentation for @ref{19ab,,unittest.mock.patch.dict()}

@item 
gh-121749@footnote{https://github.com/python/cpython/issues/121749}: Fix documentation for @ref{60a,,PyModule_AddObjectRef()}.

@item 
gh-120012@footnote{https://github.com/python/cpython/issues/120012}: Clarify the behaviours of @ref{19ac,,multiprocessing.Queue.empty()}
and @ref{19ad,,multiprocessing.SimpleQueue.empty()} on closed queues. Patch by
Bénédikt Tran.

@item 
gh-119574@footnote{https://github.com/python/cpython/issues/119574}: Added some missing environment variables to the output of
@ref{809,,--help-env}.

@item 
bpo-34008@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34008}: The @ref{e24,,Py_Main()} documentation moved from the “Very High
Level API” section to the “Initialization and Finalization” section.

Also make it explicit that we expect @code{Py_Main} to typically be called
instead of @code{Py_Initialize} rather than after it (since @code{Py_Main} makes
its own call to @code{Py_Initialize}). Document that calling both is
supported but is version dependent on which settings will be applied
correctly.
@end itemize

@node Core and Builtins<45>,Library<51>,Documentation<17>,Python 3 14 0 alpha 1
@anchor{whatsnew/changelog id224}@anchor{19ae}
@subsubsection Core and Builtins



@itemize -

@item 
gh-124375@footnote{https://github.com/python/cpython/issues/124375}: Fix a crash in the free threading build when the GC runs
concurrently with a new thread starting.

@item 
gh-125221@footnote{https://github.com/python/cpython/issues/125221}: Fix possible race condition when calling
@ref{19af,,__reduce_ex__()} for the first time in the free threading
build.

@item 
gh-125174@footnote{https://github.com/python/cpython/issues/125174}: Make the handling of reference counts of immortal objects more
robust. Immortal objects with reference counts that deviate from their
original reference count by up to a billion (half a billion on 32 bit
builds) are still counted as immortal.

@item 
gh-125039@footnote{https://github.com/python/cpython/issues/125039}: Make @code{this_instr} and @code{prev_instr} const in cases
generator.
@end itemize

@node Library<51>,Core and Builtins<46>,Core and Builtins<45>,Python 3 14 0 alpha 1
@anchor{whatsnew/changelog id225}@anchor{19b0}
@subsubsection Library



@itemize -

@item 
gh-125008@footnote{https://github.com/python/cpython/issues/125008}: Fix @ref{18f9,,tokenize.untokenize()} producing invalid syntax for
double braces preceded by certain escape characters.
@end itemize

@node Core and Builtins<46>,Library<52>,Library<51>,Python 3 14 0 alpha 1
@anchor{whatsnew/changelog id226}@anchor{19b1}
@subsubsection Core and Builtins



@itemize -

@item 
gh-124871@footnote{https://github.com/python/cpython/issues/124871}: Fix compiler bug (in some versions of 3.13) where an assertion
fails during reachability analysis.

@item 
gh-123378@footnote{https://github.com/python/cpython/issues/123378}: Fix a crash in the @ref{831,,__str__()} method of
@ref{460,,UnicodeError} objects when the @ref{1906,,UnicodeError.start} and
@ref{1907,,UnicodeError.end} values are invalid or out-of-range. Patch by
Bénédikt Tran.

@item 
gh-118093@footnote{https://github.com/python/cpython/issues/118093}: Improve the experimental JIT compiler’s ability to stay “on
trace” when encountering highly-biased branches.

@item 
gh-124642@footnote{https://github.com/python/cpython/issues/124642}: Fixed scalability issue in free-threaded builds for lock-free
reads from dictionaries in multi-threaded scenarios

@item 
gh-116510@footnote{https://github.com/python/cpython/issues/116510}: Fix a crash caused by immortal interned strings being shared
between sub-interpreters that use basic single-phase init.  In that case,
the string can be used by an interpreter that outlives the interpreter
that created and interned it.  For interpreters that share obmalloc state,
also share the interned dict with the main interpreter.

@item 
gh-116510@footnote{https://github.com/python/cpython/issues/116510}: Fix a bug that can cause a crash when sub-interpreters use
“basic” single-phase extension modules.  Shared objects could refer to
PyGC_Head nodes that had been freed as part of interpreter cleanup.

@item 
gh-119180@footnote{https://github.com/python/cpython/issues/119180}: The @code{__main__} module no longer always contains an
@code{__annotations__} dictionary in its global namespace.

@item 
gh-124547@footnote{https://github.com/python/cpython/issues/124547}: When deallocating an object with inline values whose
@code{__dict__} is still live: if memory allocation for the inline values
fails, clear the dictionary. Prevents an interpreter crash.

@item 
gh-124513@footnote{https://github.com/python/cpython/issues/124513}: Fix a crash in FrameLocalsProxy constructor: check the number
of arguments. Patch by Victor Stinner.

@item 
gh-124442@footnote{https://github.com/python/cpython/issues/124442}: Fix nondeterminism in compilation by sorting the value of
@ref{477,,__static_attributes__}. Patch by kp2pml30.

@item 
gh-124285@footnote{https://github.com/python/cpython/issues/124285}: Fix bug where @code{bool(a)} can be invoked more than once during
the evaluation of a compound boolean expression.

@item 
gh-123856@footnote{https://github.com/python/cpython/issues/123856}: Fix PyREPL failure when a keyboard interrupt is triggered after
using a history search

@item 
gh-65961@footnote{https://github.com/python/cpython/issues/65961}: Deprecate the setting and using @code{__package__} and
@code{__cached__}.

@item 
gh-119726@footnote{https://github.com/python/cpython/issues/119726}: The JIT now generates more efficient code for calls to C
functions resulting in up to 0.8% memory savings and 1.5% speed
improvement on AArch64. Patch by Diego Russo.

@item 
gh-122878@footnote{https://github.com/python/cpython/issues/122878}: Use the @code{pager} binary, if available (e.g. on Debian and
derivatives), to display REPL @code{help()}.

@item 
gh-124188@footnote{https://github.com/python/cpython/issues/124188}: Fix reading and decoding a line from the source file with
non-UTF-8 encoding for syntax errors raised in the compiler.

@item 
gh-124027@footnote{https://github.com/python/cpython/issues/124027}: Support @code{<page up>}, @code{<page down>}, and @code{<delete>} keys
in the Python REPL when @code{$TERM} is set to @code{vt100}.

@item 
gh-124022@footnote{https://github.com/python/cpython/issues/124022}: Fix bug where docstring is removed from classes in interactive
mode.

@item 
gh-123958@footnote{https://github.com/python/cpython/issues/123958}: docstrings are now removed from the optimized AST in
optimization level 2.

@item 
gh-123923@footnote{https://github.com/python/cpython/issues/123923}: The @code{f_executable} field in the internal
@ref{19b2,,_PyInterpreterFrame} struct now uses a tagged pointer.
Profilers and debuggers that uses this field should clear the least
significant bit to recover the @ref{5df,,PyObject}* pointer.

@item 
gh-77894@footnote{https://github.com/python/cpython/issues/77894}: Fix possible crash in the garbage collector when it tries to
break a reference loop containing a @ref{166,,memoryview} object. Now a
@code{memoryview} object can only be cleared if there are no buffers
that refer it.

@item 
gh-120221@footnote{https://github.com/python/cpython/issues/120221}: asyncio REPL is now again properly recognizing
KeyboardInterrupts. Display of exceptions raised in secondary threads is
fixed.

@item 
gh-119310@footnote{https://github.com/python/cpython/issues/119310}: Allow the new interactive shell to read history files written
with the editline library that use unicode-escaped entries.  Patch by
aorcajo and Łukasz Langa.

@item 
gh-123572@footnote{https://github.com/python/cpython/issues/123572}: Fix key mappings for various F-keys in Windows for the new
REPL. Patch by devdanzin
@end itemize

@node Library<52>,Core and Builtins<47>,Core and Builtins<46>,Python 3 14 0 alpha 1
@anchor{whatsnew/changelog id227}@anchor{19b3}
@subsubsection Library



@itemize -

@item 
gh-123614@footnote{https://github.com/python/cpython/issues/123614}: Add @ref{19b4,,turtle.save()} to easily save Turtle drawings as
PostScript files. Patch by Marie Roald and Yngve Mardal Moe.
@end itemize

@node Core and Builtins<47>,Library<53>,Library<52>,Python 3 14 0 alpha 1
@anchor{whatsnew/changelog id228}@anchor{19b5}
@subsubsection Core and Builtins



@itemize -

@item 
gh-123339@footnote{https://github.com/python/cpython/issues/123339}: Setting the @code{__module__} attribute for a class now
removes the @code{__firstlineno__} item from the type’s dict, so they will no
longer be inconsistent.

@item 
gh-119034@footnote{https://github.com/python/cpython/issues/119034}: Change @code{<page up>} and @code{<page down>} keys of the Python
REPL to history search forward/backward. Patch by Victor Stinner.

@item 
gh-123562@footnote{https://github.com/python/cpython/issues/123562}: Improve @ref{18f,,SyntaxError} message for using @code{case ... as
...} with not a name.

@item 
gh-123545@footnote{https://github.com/python/cpython/issues/123545}: Fix a double decref in rare cases on experimental JIT builds.

@item 
gh-123484@footnote{https://github.com/python/cpython/issues/123484}: Fix @code{_Py_DebugOffsets} for long objects to be relative to the
start of the object rather than the start of a subobject.

@item 
gh-123446@footnote{https://github.com/python/cpython/issues/123446}: Fix empty function name in @ref{199,,TypeError} when builtin magic
methods are used without the required args.

@item 
gh-123440@footnote{https://github.com/python/cpython/issues/123440}: Improve @ref{18f,,SyntaxError} message for using @code{except as} with
not a name.

@item 
gh-116017@footnote{https://github.com/python/cpython/issues/116017}: Improved JIT memory consumption by periodically freeing memory
used by infrequently-executed code. This change is especially likely to
improve the memory footprint of long-running programs.

@item 
gh-123344@footnote{https://github.com/python/cpython/issues/123344}: Add AST optimizations for type parameter defaults.

@item 
gh-123321@footnote{https://github.com/python/cpython/issues/123321}: Prevent Parser/myreadline race condition from segfaulting on
multi-threaded use. Patch by Bar Harel and Amit Wienner.

@item 
gh-123177@footnote{https://github.com/python/cpython/issues/123177}: Fix a bug causing stray prompts to appear in the middle of
wrapped lines in the new REPL.

@item 
gh-122982@footnote{https://github.com/python/cpython/issues/122982}: Extend the deprecation period for bool inversion (@code{~}) by two
years.

@item 
gh-123271@footnote{https://github.com/python/cpython/issues/123271}: Make concurrent iterations over the same @ref{1a1,,zip()} iterator
safe under free-threading.

@item 
gh-123275@footnote{https://github.com/python/cpython/issues/123275}: Support @ref{170,,-X gil=1} and 
@geindex PYTHON_GIL
@geindex environment variable; PYTHON_GIL
@ref{49b,,PYTHON_GIL=1} on non-free-threaded builds.

@item 
gh-123177@footnote{https://github.com/python/cpython/issues/123177}: Deactivate line wrap in the Apple Terminal via a ANSI escape
code. Patch by Pablo Galindo

@item 
gh-123229@footnote{https://github.com/python/cpython/issues/123229}: Fix valgrind warning by initializing the f-string buffers to 0
in the tokenizer. Patch by Pablo Galindo

@item 
gh-122298@footnote{https://github.com/python/cpython/issues/122298}: Restore printout of GC stats when
@code{gc.set_debug(gc.DEBUG_STATS)} is called. This feature was accidentally
removed when implementing incremental GC.

@item 
gh-121804@footnote{https://github.com/python/cpython/issues/121804}: Correctly show error locations when a @ref{18f,,SyntaxError} is
raised in the basic REPL. Patch by Sergey B Kirpichev.

@item 
gh-115776@footnote{https://github.com/python/cpython/issues/115776}: Enables inline values (Python’s equivalent of hidden classes)
on any class who’s instances are of a fixed size.

@item 
gh-123142@footnote{https://github.com/python/cpython/issues/123142}: Fix too-wide source location in exception tracebacks coming
from broken iterables in comprehensions.

@item 
gh-123048@footnote{https://github.com/python/cpython/issues/123048}: Fix a bug where pattern matching code could emit a
@ref{19b6,,JUMP_FORWARD} with no source location.

@item 
gh-118093@footnote{https://github.com/python/cpython/issues/118093}: Break up @code{CALL_ALLOC_AND_ENTER_INIT} into micro-ops and relax
requirement for exact args, in order to increase the amount of code
supported by tier 2.

@item 
gh-123123@footnote{https://github.com/python/cpython/issues/123123}: Fix displaying @ref{18f,,SyntaxError} exceptions covering multiple
lines. Patch by Pablo Galindo

@item 
gh-123083@footnote{https://github.com/python/cpython/issues/123083}: Fix a potential use-after-free in @code{STORE_ATTR_WITH_HINT}.

@item 
gh-123022@footnote{https://github.com/python/cpython/issues/123022}: Fix crash in free-threaded build when calling
@ref{45e,,Py_Initialize()} from a non-main thread.

@item 
gh-118093@footnote{https://github.com/python/cpython/issues/118093}: Add three specializations for @ref{370,,CALL_KW}:


@itemize *

@item 
@code{CALL_KW_PY} for calls to Python functions

@item 
@code{CALL_KW_BOUND_METHOD} for calls to bound methods

@item 
@code{CALL_KW_NON_PY} for all other calls
@end itemize

@item 
gh-122821@footnote{https://github.com/python/cpython/issues/122821}: Make sure that branches in @ref{19b7,,while} statements have
consistent offsets for @ref{e0,,sys.monitoring}. @code{while} statements
are now compiled with a simple jump at the end of the body, instead of
duplicating the test.

@item 
gh-122907@footnote{https://github.com/python/cpython/issues/122907}: Building with @code{HAVE_DYNAMIC_LOADING} now works as well as it
did in 3.12. Existing deficiences will be addressed separately. (See
@indicateurl{https://github.com/python/cpython/issues/122950}.)

@item 
gh-122888@footnote{https://github.com/python/cpython/issues/122888}: Fix crash on certain calls to @code{str()} with positional
arguments of the wrong type. Patch by Jelle Zijlstra.

@item 
gh-118093@footnote{https://github.com/python/cpython/issues/118093}: Improve the experimental JIT’s handling of polymorphic code.

@item 
gh-122697@footnote{https://github.com/python/cpython/issues/122697}: Fixed memory leaks at interpreter shutdown in the free-threaded
build, and also reporting of leaked memory blocks via @ref{170,,-X showrefcount}.

@item 
gh-116622@footnote{https://github.com/python/cpython/issues/116622}: Fix Android stdout and stderr messages being truncated or lost.

@item 
gh-122527@footnote{https://github.com/python/cpython/issues/122527}: Fix a crash that occurred when a @code{PyStructSequence} was
deallocated after its type’s dictionary was cleared by the GC.  The type’s
@ref{b84,,tp_basicsize} now accounts for non-sequence
fields that aren’t included in the @ref{98a,,Py_SIZE} of the sequence.

@item 
gh-122445@footnote{https://github.com/python/cpython/issues/122445}: Add only fields which are modified via self.* to
@ref{477,,__static_attributes__}.

@item 
gh-122417@footnote{https://github.com/python/cpython/issues/122417}: In the free-threaded build, the reference counts for heap type
objects are now partially stored in a distributed manner in per-thread
arrays.  This reduces contention on the heap type’s reference count fields
when creating or destroying instances of the same type from multiple
threads concurrently.

@item 
gh-116090@footnote{https://github.com/python/cpython/issues/116090}: Fix an issue in JIT builds that prevented some @ref{348,,for}
loops from correctly firing @ref{19b8,,RAISE} monitoring events.

@item 
gh-122300@footnote{https://github.com/python/cpython/issues/122300}: Preserve AST nodes for f-string with single-element format
specifiers. Patch by Pablo Galindo

@item 
gh-120906@footnote{https://github.com/python/cpython/issues/120906}: @ref{4a6,,frame.f_locals} now supports arbitrary hashable objects
as keys.

@item 
gh-122239@footnote{https://github.com/python/cpython/issues/122239}: When a @ref{24f,,list}, @ref{614,,tuple} or @ref{184,,dict} with too
many elements is unpacked, show the actual length in the error message.

@item 
gh-122245@footnote{https://github.com/python/cpython/issues/122245}: Detection of writes to @code{__debug__} is moved from the
compiler’s codegen stage to the symtable. This means that these errors are
now detected even in code that is optimized away before codegen (such as
assertions with the @ref{18d,,-O} command line option).

@item 
gh-122234@footnote{https://github.com/python/cpython/issues/122234}: Specializations for sums with float and complex inputs in
@ref{696,,sum()} now always use compensated summation.  Also, for integer items
in above specializations: @ref{19b9,,PyLong_AsDouble()} is used, instead of
@ref{1472,,PyLong_AsLongAndOverflow()}.  Patch by Sergey B Kirpichev.

@item 
gh-122208@footnote{https://github.com/python/cpython/issues/122208}: Dictionary watchers now only deliver the PyDict_EVENT_ADDED
event when the insertion is in a known good state to succeed.

@item 
gh-122160@footnote{https://github.com/python/cpython/issues/122160}: Remove the @code{BUILD_CONST_KEY_MAP} opcode. Use
@ref{367,,BUILD_MAP} instead.

@item 
gh-122029@footnote{https://github.com/python/cpython/issues/122029}: Emit @code{c_call} events in @ref{170a,,sys.setprofile()} when a
@code{PyMethodObject} pointing to a @code{PyCFunction} is called.

@item 
gh-122026@footnote{https://github.com/python/cpython/issues/122026}: Fix a bug that caused the tokenizer to not correctly identify
mismatched parentheses inside f-strings in some situations. Patch by Pablo
Galindo

@item 
gh-99108@footnote{https://github.com/python/cpython/issues/99108}: Python’s hashlib now unconditionally uses the vendored HACL*
library for Blake2. Python no longer accepts libb2 as an optional
dependency for Blake2.

We refreshed HACL* to the latest version, and now vendor HACL*’s 128-bit
and 256-bit wide vector implementations for Blake2, which are used on
x86/x64 toolchains when the required CPU features are available at
runtime.

HACL*’s 128-bit wide vector implementation of Blake2 can also run on ARM
NEON and Power8, but lacking evidence of a performance gain, these are not
enabled (yet).
@end itemize

@node Library<53>,Core and Builtins<48>,Core and Builtins<47>,Python 3 14 0 alpha 1
@anchor{whatsnew/changelog id229}@anchor{19ba}
@subsubsection Library



@itemize -

@item 
gh-121999@footnote{https://github.com/python/cpython/issues/121999}: The default extraction filter for the @ref{e4,,tarfile} module is
now set to @ref{29c,,'data'}.
@end itemize

@node Core and Builtins<48>,Library<54>,Library<53>,Python 3 14 0 alpha 1
@anchor{whatsnew/changelog id230}@anchor{19bb}
@subsubsection Core and Builtins



@itemize -

@item 
gh-121860@footnote{https://github.com/python/cpython/issues/121860}: Fix crash when rematerializing a managed dictionary after it
was deleted.

@item 
gh-121795@footnote{https://github.com/python/cpython/issues/121795}: Improve performance of set membership testing, @code{set.remove()}
and @code{set.discard()} when the argument is a set.

@item 
gh-121814@footnote{https://github.com/python/cpython/issues/121814}: Fixed the SegFault when @ref{663,,PyEval_SetTrace()} is used with
no Python frame on stack.

@item 
gh-121295@footnote{https://github.com/python/cpython/issues/121295}: Fix PyREPL console getting into a blocked state after
interrupting a long paste

@item 
gh-121794@footnote{https://github.com/python/cpython/issues/121794}: Fix bug in free-threaded Python where a resurrected object
could lead to a negative ref count assertion failure.

@item 
gh-121657@footnote{https://github.com/python/cpython/issues/121657}: Improve the @ref{18f,,SyntaxError} message if the user tries to use
@ref{bc8,,yield from} outside a function.

@item 
gh-121609@footnote{https://github.com/python/cpython/issues/121609}: Fix pasting of characters containing unicode character joiners
in the new REPL. Patch by Marta Gomez Macias

@item 
gh-121297@footnote{https://github.com/python/cpython/issues/121297}: Previously, incorrect usage of @ref{18e,,await} or asynchronous
comprehensions in code removed by the @ref{18d,,-O} option was not flagged
by the Python compiler. Now, such code raises @ref{18f,,SyntaxError}. Patch by
Jelle Zijlstra.

@item 
gh-117482@footnote{https://github.com/python/cpython/issues/117482}: Unexpected slot wrappers are no longer created for builtin
static types in subinterpreters.

@item 
gh-121562@footnote{https://github.com/python/cpython/issues/121562}: Optimized performance of hex_from_char by replacing switch-case
with a lookup table

@item 
gh-121499@footnote{https://github.com/python/cpython/issues/121499}: Fix a bug affecting how multi-line history was being rendered
in the new REPL after interacting with the new screen cache. Patch by
Pablo Galindo

@item 
gh-121497@footnote{https://github.com/python/cpython/issues/121497}: Fix a bug that was preventing the REPL to correctly respect the
history when an input hook was set. Patch by Pablo Galindo

@item 
gh-121012@footnote{https://github.com/python/cpython/issues/121012}: Tier 2 execution now ensures that list iterators remain
exhausted, once they become exhausted.

@item 
gh-121439@footnote{https://github.com/python/cpython/issues/121439}: Allow tuples of length 20 in the freelist to be reused.

@item 
gh-121288@footnote{https://github.com/python/cpython/issues/121288}: @ref{2ee,,ValueError} messages for @ref{15d0,,list.index()},
@ref{19bc,,range.index()}, @code{deque.index()}, @code{deque.remove()} and
@code{ShareableList.index()} no longer contain the repr of the searched
value (which can be arbitrary large) and are consistent with error
messages for other @ref{19bd,,index()} and @ref{19be,,remove()}
methods.

@item 
gh-121368@footnote{https://github.com/python/cpython/issues/121368}: Fix race condition in @code{_PyType_Lookup} in the free-threaded
build due to a missing memory fence.  This could lead to
@code{_PyType_Lookup} returning incorrect results on arm64.

@item 
gh-121149@footnote{https://github.com/python/cpython/issues/121149}: Added specialization for summation of complexes, this also
improves accuracy of builtin @ref{696,,sum()} for such inputs.  Patch by Sergey
B Kirpichev.

@item 
gh-121130@footnote{https://github.com/python/cpython/issues/121130}: Fix f-strings with debug expressions in format specifiers.
Patch by Pablo Galindo
@end itemize

@node Library<54>,Core and Builtins<49>,Core and Builtins<48>,Python 3 14 0 alpha 1
@anchor{whatsnew/changelog id231}@anchor{19bf}
@subsubsection Library



@itemize -

@item 
gh-121381@footnote{https://github.com/python/cpython/issues/121381}: Remove @code{subprocess._USE_VFORK} escape hatch code and
documentation. It was added just in case, and doesn’t have any known cases
that require it.
@end itemize

@node Core and Builtins<49>,Library<55>,Library<54>,Python 3 14 0 alpha 1
@anchor{whatsnew/changelog id232}@anchor{19c0}
@subsubsection Core and Builtins



@itemize -

@item 
gh-119726@footnote{https://github.com/python/cpython/issues/119726}: Optimize code layout for calls to C functions from the JIT on
AArch64. Patch by Diego Russo.

@item 
gh-121115@footnote{https://github.com/python/cpython/issues/121115}: @ref{606,,PyLong_AsNativeBytes()} no longer uses
@ref{19f,,__index__()} methods by default. The
@code{Py_ASNATIVEBYTES_ALLOW_INDEX} flag has been added to allow it.

@item 
gh-120838@footnote{https://github.com/python/cpython/issues/120838}: @ref{45d,,Py_Finalize()} and @ref{f17,,Py_FinalizeEx()} now
always run with the main interpreter active.

@item 
gh-113433@footnote{https://github.com/python/cpython/issues/113433}: Subinterpreters now get cleaned up automatically during runtime
finalization.

@item 
gh-119726@footnote{https://github.com/python/cpython/issues/119726}: Improve the speed and memory use of C function calls from JIT
code on AArch64. Patch by Diego Russo

@item 
gh-116017@footnote{https://github.com/python/cpython/issues/116017}: Simplify the warmup mechanism used for “side exits” in JIT
code, resulting in slightly better performance and slightly lower memory
usage for most platforms.

@item 
gh-98442@footnote{https://github.com/python/cpython/issues/98442}: Fix too wide source locations of the cleanup instructions of a
with statement.

@item 
gh-120754@footnote{https://github.com/python/cpython/issues/120754}: Reduce the number of system calls invoked when reading a whole
file (ex. @code{open('a.txt').read()}). For a sample program that reads the
contents of the 400+ @code{.rst} files in the cpython repository @code{Doc}
folder, there is an over 10% reduction in system call count.

@item 
gh-119462@footnote{https://github.com/python/cpython/issues/119462}: Make sure that invariants of type versioning are maintained: *
Superclasses always have their version number assigned before subclasses *
The version tag is always zero if the tag is not valid. * The version tag
is always non-if the tag is valid.

@item 
gh-120437@footnote{https://github.com/python/cpython/issues/120437}: Fix @code{_CHECK_STACK_SPACE} optimization problems introduced in
gh-118322@footnote{https://github.com/python/cpython/issues/118322}.

@item 
gh-120722@footnote{https://github.com/python/cpython/issues/120722}: Correctly set the bytecode position on return instructions
within lambdas. Patch by Jelle Zijlstra.

@item 
gh-120367@footnote{https://github.com/python/cpython/issues/120367}: Fix bug where compiler creates a redundant jump during
pseudo-op replacement. Can only happen with a synthetic AST that has a try
on the same line as the instruction following the exception handler.

@item 
gh-120507@footnote{https://github.com/python/cpython/issues/120507}: Remove the @code{BEFORE_WITH} and @code{BEFORE_ASYNC_WITH}
instructions. Add the new @ref{36d,,LOAD_SPECIAL} instruction. Generate
code for @code{with} and @code{async with} statements using the new instruction.

@item 
gh-113993@footnote{https://github.com/python/cpython/issues/113993}: Strings interned with @ref{14e7,,sys.intern()} are again
garbage-collected when no longer used, as per the documentation. Strings
interned with the C function @ref{ab4,,PyUnicode_InternInPlace()} are still
immortal. Internals of the string interning mechanism have been changed.
This may affect performance and identities of @ref{16a,,str} objects.
@end itemize

@node Library<55>,Core and Builtins<50>,Core and Builtins<49>,Python 3 14 0 alpha 1
@anchor{whatsnew/changelog id233}@anchor{19c1}
@subsubsection Library



@itemize -

@item 
gh-120485@footnote{https://github.com/python/cpython/issues/120485}: Add an override of @code{allow_reuse_port} on classes subclassing
@code{socketserver.TCPServer} where @code{allow_reuse_address} is also
overridden.
@end itemize

@node Core and Builtins<50>,Library<56>,Library<55>,Python 3 14 0 alpha 1
@anchor{whatsnew/changelog id234}@anchor{19c2}
@subsubsection Core and Builtins



@itemize -

@item 
gh-120384@footnote{https://github.com/python/cpython/issues/120384}: Fix an array out of bounds crash in @code{list_ass_subscript},
which could be invoked via some specifically tailored input: including
concurrent modification of a list object, where one thread assigns a slice
and another clears it.

@item 
gh-120367@footnote{https://github.com/python/cpython/issues/120367}: Fix crash in compiler on code with redundant NOPs and JUMPs
which show up after exception handlers are moved to the end of the code.
@end itemize

@node Library<56>,Core and Builtins<51>,Core and Builtins<50>,Python 3 14 0 alpha 1
@anchor{whatsnew/changelog id235}@anchor{19c3}
@subsubsection Library



@itemize -

@item 
gh-120380@footnote{https://github.com/python/cpython/issues/120380}: Fix Python implementation of @ref{c19,,pickle.Pickler} for
@ref{193,,bytes} and @ref{342,,bytearray} objects when using protocol version
5. Patch by Bénédikt Tran.
@end itemize

@node Core and Builtins<51>,Library<57>,Library<56>,Python 3 14 0 alpha 1
@anchor{whatsnew/changelog id236}@anchor{19c4}
@subsubsection Core and Builtins



@itemize -

@item 
gh-120397@footnote{https://github.com/python/cpython/issues/120397}: Improve the throughput by up to two times for the
@ref{19c5,,str.count()}, @ref{19c6,,bytes.count()} and @ref{17e6,,bytearray.count()} methods
for counting single characters.

@item 
gh-120221@footnote{https://github.com/python/cpython/issues/120221}: Deliver real signals on Ctrl-C and Ctrl-Z in the new REPL.
Patch by Pablo Galindo

@item 
gh-120346@footnote{https://github.com/python/cpython/issues/120346}: Respect 
@geindex PYTHON_BASIC_REPL
@geindex environment variable; PYTHON_BASIC_REPL
@ref{1b8,,PYTHON_BASIC_REPL} when running in interactive
inspect mode (@code{python -i}). Patch by Pablo Galindo

@item 
gh-93691@footnote{https://github.com/python/cpython/issues/93691}: Fix source locations of instructions generated for the iterator
of a for statement.

@item 
gh-120198@footnote{https://github.com/python/cpython/issues/120198}: Fix a crash when multiple threads read and write to the same
@code{__class__} of an object concurrently.

@item 
gh-120298@footnote{https://github.com/python/cpython/issues/120298}: Fix use-after free in @code{list_richcompare_impl} which can be
invoked via some specifically tailored evil input.

@item 
gh-119666@footnote{https://github.com/python/cpython/issues/119666}: Fix a compiler crash in the case where two comprehensions in
class scope both reference @code{__class__}.

@item 
gh-119726@footnote{https://github.com/python/cpython/issues/119726}: JIT: Re-use trampolines on AArch64 when creating stencils.
Patch by Diego Russo

@item 
gh-120225@footnote{https://github.com/python/cpython/issues/120225}: Fix crash in compiler on empty block at end of exception
handler.

@item 
gh-93691@footnote{https://github.com/python/cpython/issues/93691}: Fix source locations of instructions generated for with
statements.

@item 
gh-120097@footnote{https://github.com/python/cpython/issues/120097}: @code{FrameLocalsProxy} now subclasses @code{collections.abc.Mapping}
and can be matched as a mapping in @code{match} statements

@item 
gh-120080@footnote{https://github.com/python/cpython/issues/120080}: Direct call to the @code{int.__round__()} now accepts @code{None}
as a valid argument.

@item 
gh-119933@footnote{https://github.com/python/cpython/issues/119933}: Improve @ref{18f,,SyntaxError} messages for invalid expressions in
a type parameters bound, a type parameter constraint tuple or a default
type parameter. Patch by Bénédikt Tran.

@item 
gh-119724@footnote{https://github.com/python/cpython/issues/119724}: Reverted improvements to error messages for @code{elif}/@code{else}
statements not matching any valid statements, which made in hard to locate
the syntax errors inside those @code{elif}/@code{else} blocks.

@item 
gh-119879@footnote{https://github.com/python/cpython/issues/119879}: String search is now slightly faster for certain cases. It now
utilizes last character gap (good suffix rule) for two-way periodic
needles.

@item 
gh-119842@footnote{https://github.com/python/cpython/issues/119842}: Honor @ref{7a5,,PyOS_InputHook()} in the new REPL. Patch by Pablo
Galindo

@item 
gh-119180@footnote{https://github.com/python/cpython/issues/119180}: @ref{48f,,classmethod()} and @ref{451,,staticmethod()} now wrap the
@ref{456,,__annotations__} and @ref{19c7,,__annotate__}
attributes of their underlying callable lazily. See 
@geindex Python Enhancement Proposals; PEP 649
PEP 649@footnote{https://peps.python.org/pep-0649/}. Patch by
Jelle Zijlstra.

@item 
gh-119821@footnote{https://github.com/python/cpython/issues/119821}: Fix execution of @ref{4ac,,annotation scopes}
within classes when @code{globals} is set to a non-dict. Patch by Jelle
Zijlstra.

@item 
gh-118934@footnote{https://github.com/python/cpython/issues/118934}: Make @code{PyEval_GetLocals} return borrowed reference

@item 
gh-119740@footnote{https://github.com/python/cpython/issues/119740}: Remove the previously-deprecated delegation of @ref{19c,,int()} to
@ref{19d,,__trunc__()}.

@item 
gh-119689@footnote{https://github.com/python/cpython/issues/119689}: Generate stack effect metadata for pseudo instructions from
bytecodes.c.

@item 
gh-109218@footnote{https://github.com/python/cpython/issues/109218}: @ref{198,,complex()} accepts now a string only as a positional
argument. Passing a complex number as the “real” or “imag” argument is
deprecated; it should only be passed as a single positional argument.

@item 
gh-119548@footnote{https://github.com/python/cpython/issues/119548}: Add a @code{clear} command to the REPL. Patch by Pablo Galindo

@item 
gh-111999@footnote{https://github.com/python/cpython/issues/111999}: Fix the signature of @ref{fdd,,str.format_map()}.

@item 
gh-119560@footnote{https://github.com/python/cpython/issues/119560}: An invalid assert in beta 1 has been removed.  The assert would
fail if @code{PyState_FindModule()} was used in an extension module’s init
function before the module def had been initialized.

@item 
gh-119369@footnote{https://github.com/python/cpython/issues/119369}: Fix deadlock during thread deletion in free-threaded build,
which could occur when the GIL was enabled at runtime.

@item 
gh-119525@footnote{https://github.com/python/cpython/issues/119525}: Fix deadlock involving @code{_PyType_Lookup()} cache in the
free-threaded build when the GIL is dynamically enabled at runtime.

@item 
gh-119258@footnote{https://github.com/python/cpython/issues/119258}: Eliminate type version guards in the tier two interpreter.

Note that setting the @code{tp_version_tag} manually (which has never been
supported) may result in crashes.

@item 
gh-119311@footnote{https://github.com/python/cpython/issues/119311}: Fix bug where names are unexpectedly mangled in the bases of
generic classes.

@item 
gh-119395@footnote{https://github.com/python/cpython/issues/119395}: Fix bug where names appearing after a generic class are mangled
as if they are in the generic class.

@item 
gh-119372@footnote{https://github.com/python/cpython/issues/119372}: Correct invalid corner cases in complex division (resulted in
@code{(nan+nanj)} output), e.g.  @code{1/complex('(inf+infj)')}.  Patch by
Sergey B Kirpichev.

@item 
gh-119180@footnote{https://github.com/python/cpython/issues/119180}: Evaluation of annotations is now deferred. See 
@geindex Python Enhancement Proposals; PEP 649
PEP 649@footnote{https://peps.python.org/pep-0649/} for
details.

@item 
gh-119180@footnote{https://github.com/python/cpython/issues/119180}: Replace @code{LOAD_ASSERTION_ERROR} opcode with
@ref{368,,LOAD_COMMON_CONSTANT} and add support for
@ref{369,,NotImplementedError}.

@item 
gh-119213@footnote{https://github.com/python/cpython/issues/119213}: Non-builtin modules built with argument clinic were crashing if
used in a subinterpreter before the main interpreter.  The objects that
were causing the problem by leaking between interpreters carelessly have
been fixed.

@item 
gh-119011@footnote{https://github.com/python/cpython/issues/119011}: Fixes @code{type.__type_params__} to return an empty tuple instead
of a descriptor.

@item 
gh-118692@footnote{https://github.com/python/cpython/issues/118692}: Avoid creating unnecessary @ref{dfb,,StopIteration} instances for
monitoring.

@item 
gh-119180@footnote{https://github.com/python/cpython/issues/119180}: Add an @code{__annotate__} attribute to functions, classes, and
modules as part of 
@geindex Python Enhancement Proposals; PEP 649
PEP 649@footnote{https://peps.python.org/pep-0649/}. Patch by Jelle Zijlstra.

@item 
gh-119049@footnote{https://github.com/python/cpython/issues/119049}: Fix displaying the source line for warnings created by the C
API if the @ref{119,,warnings} module had not yet been imported.

@item 
gh-119057@footnote{https://github.com/python/cpython/issues/119057}: Improve @ref{b45,,ZeroDivisionError} error message. Now, all error
messages are harmonized: all @code{/}, @code{//}, and @code{%} operations just use
“division by zero” message. And @code{0 ** -1} operation uses “zero to a
negative power”.

@item 
gh-118844@footnote{https://github.com/python/cpython/issues/118844}: Fix build failures when configuring with both @code{--disable-gil}
and @code{--enable-experimental-jit}.

@item 
gh-118921@footnote{https://github.com/python/cpython/issues/118921}: Add @code{copy()} method for @code{FrameLocalsProxy} which returns a
snapshot @code{dict} for local variables.

@item 
gh-117657@footnote{https://github.com/python/cpython/issues/117657}: Fix data races on the field that stores a pointer to the
interpreter’s main thread that occur in free-threaded builds.

@item 
gh-118750@footnote{https://github.com/python/cpython/issues/118750}: If the C version of the @code{decimal} module is available,
@code{int(str)} now uses it to supply an asymptotically much faster
conversion. However, this only applies if the string contains over about 2
million digits.

@item 
gh-118767@footnote{https://github.com/python/cpython/issues/118767}: Using @ref{1a3,,NotImplemented} in a boolean context now raises
@ref{199,,TypeError}. Contributed by Jelle Zijlstra.

@item 
gh-118561@footnote{https://github.com/python/cpython/issues/118561}: Fix race condition in free-threaded build where
@ref{602,,list.extend()} could expose uninitialised memory to concurrent
readers.

@item 
gh-117139@footnote{https://github.com/python/cpython/issues/117139}: Convert the Python evaluation stack to use internal stack
references. The purpose is to support tagged pointers. In 
@geindex Python Enhancement Proposals; PEP 703
PEP 703@footnote{https://peps.python.org/pep-0703/}, this
will allow for its form of deferred reference counting. For both the
default and free-threaded builds, this sets up the infrastructure for
unboxed integers in the future.
@end itemize

@node Library<57>,Core and Builtins<52>,Core and Builtins<51>,Python 3 14 0 alpha 1
@anchor{whatsnew/changelog id237}@anchor{19c8}
@subsubsection Library



@itemize -

@item 
gh-115801@footnote{https://github.com/python/cpython/issues/115801}: Raise @code{TypeError} when passing a string to
@ref{19c9,,difflib.unified_diff()} and @ref{19ca,,difflib.context_diff()}.
@end itemize

@node Core and Builtins<52>,C API<18>,Library<57>,Python 3 14 0 alpha 1
@anchor{whatsnew/changelog id238}@anchor{19cb}
@subsubsection Core and Builtins



@itemize -

@item 
gh-117558@footnote{https://github.com/python/cpython/issues/117558}: Improve error messages when a string, bytes or bytearray object
of length 1 is expected.

@item 
gh-117195@footnote{https://github.com/python/cpython/issues/117195}: Avoid assertion failure for debug builds when calling
@code{object.__sizeof__(1)}

@item 
gh-116022@footnote{https://github.com/python/cpython/issues/116022}: Improve the @ref{830,,__repr__()} output of
@ref{4c4,,AST} nodes.

@item 
gh-114091@footnote{https://github.com/python/cpython/issues/114091}: Changed the error message for awaiting something that can’t be
awaited from “object <type> can’t be used in an await expression” to
“’<type>’ object can’t be awaited”.

@item 
gh-113190@footnote{https://github.com/python/cpython/issues/113190}: @ref{45d,,Py_Finalize()} now deletes all interned strings.

@item 
gh-84978@footnote{https://github.com/python/cpython/issues/84978}: Add class methods @ref{195,,float.from_number()} and
@ref{196,,complex.from_number()}.

@item 
gh-95144@footnote{https://github.com/python/cpython/issues/95144}: Improve the error message from @code{a in b} when @code{b} is not a
container to mention the term “container”.

@item 
bpo-24766@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24766}: Fix handling of @code{doc} argument to subclasses of @code{property}.
@end itemize

@node C API<18>,Build<19>,Core and Builtins<52>,Python 3 14 0 alpha 1
@anchor{whatsnew/changelog id239}@anchor{19cc}
@subsubsection C API



@itemize -

@item 
gh-123961@footnote{https://github.com/python/cpython/issues/123961}: Convert the @ref{19cd,,curses.window} static
type exposed by the @code{PyCursesWindow_Type} macro in
@code{Include/py_curses.h} to a @ref{b64,,heap type}. Patch by
Bénédikt Tran.

@item 
gh-124502@footnote{https://github.com/python/cpython/issues/124502}: Add @ref{3b0,,PyUnicode_Equal()} function to the limited C API:
test if two strings are equal. Patch by Victor Stinner.

@item 
gh-124296@footnote{https://github.com/python/cpython/issues/124296}: @ref{64f,,PyDictObject} no longer maintains a private version
tag field @code{ma_version_tag} per 
@geindex Python Enhancement Proposals; PEP 699
PEP 699@footnote{https://peps.python.org/pep-0699/}.  This field was originally
added in Python 3.6 (
@geindex Python Enhancement Proposals; PEP 509
PEP 509@footnote{https://peps.python.org/pep-0509/}) and deprecated in Python 3.12.

@item 
gh-124160@footnote{https://github.com/python/cpython/issues/124160}: Fix crash when importing modules containing state and
single-phase initialization in a subinterpreter.

@item 
gh-124153@footnote{https://github.com/python/cpython/issues/124153}: Add @ref{3ae,,PyType_GetBaseByToken()} and @ref{3af,,Py_tp_token}
slot for easier type checking, related to 
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/} and 
@geindex Python Enhancement Proposals; PEP 630
PEP 630@footnote{https://peps.python.org/pep-0630/}.

@item 
gh-124127@footnote{https://github.com/python/cpython/issues/124127}: In the limited C API 3.14 and newer, @ref{2d1,,Py_REFCNT()} is now
implemented as an opaque function call to hide implementation details.
Patch by Victor Stinner.

@item 
gh-123880@footnote{https://github.com/python/cpython/issues/123880}: Fixed a bug that prevented circular imports of extension
modules that use single-phase initialization.

@item 
gh-123909@footnote{https://github.com/python/cpython/issues/123909}: @ref{79e,,PyType_FromSpec()}, @ref{79f,,PyType_FromSpecWithBases()}
and @ref{774,,PyType_FromModuleAndSpec()} will now fail if the metaclass of
the new type has custom @ref{7a0,,tp_new}.

@item 
gh-107954@footnote{https://github.com/python/cpython/issues/107954}: Add functions to configure the Python initialization
(
@geindex Python Enhancement Proposals; PEP 741
PEP 741@footnote{https://peps.python.org/pep-0741/}):


@itemize *

@item 
@ref{385,,PyInitConfig_Create()}

@item 
@ref{386,,PyInitConfig_Free()}

@item 
@ref{388,,PyInitConfig_GetError()}

@item 
@ref{389,,PyInitConfig_GetExitCode()}

@item 
@ref{38d,,PyInitConfig_HasOption()}

@item 
@ref{38a,,PyInitConfig_GetInt()}

@item 
@ref{38b,,PyInitConfig_GetStr()}

@item 
@ref{38c,,PyInitConfig_GetStrList()}

@item 
@ref{387,,PyInitConfig_FreeStrList()}

@item 
@ref{38e,,PyInitConfig_SetInt()}

@item 
@ref{38f,,PyInitConfig_SetStr()}

@item 
@ref{390,,PyInitConfig_SetStrList()}

@item 
@ref{379,,PyInitConfig_AddModule()}

@item 
@ref{384,,Py_InitializeFromInitConfig()}
@end itemize

Patch by Victor Stinner.

@item 
gh-107954@footnote{https://github.com/python/cpython/issues/107954}: Add functions to get and set the current runtime Python
configuration:


@itemize *

@item 
@ref{37a,,PyConfig_Get()}

@item 
@ref{382,,PyConfig_GetInt()}

@item 
@ref{37b,,PyConfig_Set()}

@item 
@ref{383,,PyConfig_Names()}
@end itemize

Patch by Victor Stinner.

@item 
gh-123465@footnote{https://github.com/python/cpython/issues/123465}: @ref{771,,Py_RELATIVE_OFFSET} is now allowed in
@ref{772,,PyMemberDef} for the special offset member
@code{"__vectorcalloffset__"}, as well as the discouraged special offset
members @code{"__dictoffset__"} and @code{"__weaklistoffset__"}

@item 
gh-100554@footnote{https://github.com/python/cpython/issues/100554}: Added a slot @code{Py_tp_vectorcall} to set
@ref{19ce,,tp_vectorcall} via the @ref{79e,,PyType_FromSpec()}
function family. Limited API extensions can use this feature to provide
more efficient vector call-based implementation of @code{__new__} and
@code{__init__}.

@item 
gh-122854@footnote{https://github.com/python/cpython/issues/122854}: Add @ref{393,,Py_HashBuffer()} to compute and return the hash
value of a buffer. Patch by Antoine Pitrou and Victor Stinner.

@item 
gh-122728@footnote{https://github.com/python/cpython/issues/122728}: Fix @ref{5f8,,PyEval_GetLocals()} to avoid @ref{796,,SystemError}
(“bad argument to internal function”). Patch by Victor Stinner.

@item 
gh-116622@footnote{https://github.com/python/cpython/issues/116622}: Make @ref{1792,,PyObject_Print} work around a bug in Android and
OpenBSD which prevented it from throwing an exception when trying to write
to a read-only stream.

@item 
gh-105201@footnote{https://github.com/python/cpython/issues/105201}: Add @ref{396,,PyIter_NextItem()} to replace @ref{397,,PyIter_Next()},
which has an ambiguous return value. Patch by Irit Katriel and Erlend
Aasland.

@item 
gh-121489@footnote{https://github.com/python/cpython/issues/121489}: Export private @code{_PyBytes_Join()} again.

@item 
gh-121645@footnote{https://github.com/python/cpython/issues/121645}: Add @ref{381,,PyBytes_Join(sep@comma{} iterable)}
function, similar to @code{sep.join(iterable)} in Python. Patch by Victor
Stinner.

@item 
gh-89364@footnote{https://github.com/python/cpython/issues/89364}: Export the @ref{15e7,,PySignal_SetWakeupFd()} function. Previously,
the function was documented but it couldn’t be used in 3rd party code.
Patch by Victor Stinner.

@item 
gh-113993@footnote{https://github.com/python/cpython/issues/113993}: @ref{ab4,,PyUnicode_InternInPlace()} no longer prevents its
argument from being garbage collected.

Several functions that take @code{char *} are now documented as possibly
preventing string objects from being garbage collected; refer to their
documentation for details: @ref{19cf,,PyUnicode_InternFromString()},
@ref{19d0,,PyDict_SetItemString()}, @ref{19d1,,PyObject_SetAttrString()},
@ref{187c,,PyObject_DelAttrString()}, @code{PyUnicode_InternFromString()},
and @code{PyModule_Add*} convenience functions.

@item 
gh-113601@footnote{https://github.com/python/cpython/issues/113601}: Removed debug build assertions related to interning strings,
which were falsely triggered by stable ABI extensions.

@item 
gh-112136@footnote{https://github.com/python/cpython/issues/112136}: Restore the private @code{_PyArg_Parser} structure and the private
@code{_PyArg_ParseTupleAndKeywordsFast()} function, previously removed in
Python 3.13 alpha 1. Patch by Victor Stinner.

@item 
gh-120642@footnote{https://github.com/python/cpython/issues/120642}: Remove the private @code{_Py_CODEUNIT} type from the public C API.
The internal @code{pycore_code.h} header should now be used to get this
internal type. Patch by Victor Stinner.

@item 
gh-120858@footnote{https://github.com/python/cpython/issues/120858}: @ref{19d2,,PyDict_Next()} no longer locks the dictionary in the
free-threaded build.  The locking needs to be done by the caller around
the entire iteration loop.

@item 
gh-120642@footnote{https://github.com/python/cpython/issues/120642}: Remove the following unstable functions:


@itemize *

@item 
@code{PyUnstable_Replace_Executor()}

@item 
@code{PyUnstable_SetOptimizer()}

@item 
@code{PyUnstable_GetOptimizer()}

@item 
@code{PyUnstable_GetExecutor()}

@item 
@code{PyUnstable_Optimizer_NewCounter()}

@item 
@code{PyUnstable_Optimizer_NewUOpOptimizer()}
@end itemize

Patch by Victor Stinner.

@item 
gh-120389@footnote{https://github.com/python/cpython/issues/120389}: Add new functions to convert C @code{<stdint.h>} numbers from/to
Python @ref{19c,,int}:


@itemize *

@item 
@ref{3a1,,PyLong_FromInt32()}

@item 
@ref{3a3,,PyLong_FromUInt32()}

@item 
@ref{3a2,,PyLong_FromInt64()}

@item 
@ref{3a4,,PyLong_FromUInt64()}

@item 
@ref{39d,,PyLong_AsInt32()}

@item 
@ref{39f,,PyLong_AsUInt32()}

@item 
@ref{39e,,PyLong_AsInt64()}

@item 
@ref{3a0,,PyLong_AsUInt64()}
@end itemize

Patch by Victor Stinner.

@item 
gh-120600@footnote{https://github.com/python/cpython/issues/120600}: In the limited C API 3.14 and newer, @ref{3c7,,Py_TYPE()} is now
implemented as an opaque function call to hide implementation details.
Patch by Victor Stinner.

@item 
gh-70278@footnote{https://github.com/python/cpython/issues/70278}: @ref{62b,,PyUnicode_FromFormat()} no longer produces the ending
@code{\ufffd} character for truncated C string when use precision with @code{%s}
and @code{%V}. It now truncates the string before the start of truncated
multibyte sequences.

@item 
gh-119771@footnote{https://github.com/python/cpython/issues/119771}: Set @ref{5b,,errno} in @ref{1937,,_Py_c_pow()} on overflows.  Patch
by Sergey B Kirpichev.

@item 
gh-119182@footnote{https://github.com/python/cpython/issues/119182}: Add a new @ref{3b1,,PyUnicodeWriter} API to create a Python
@ref{16a,,str} object:


@itemize *

@item 
@ref{3b2,,PyUnicodeWriter_Create()}.

@item 
@ref{3b4,,PyUnicodeWriter_Discard()}.

@item 
@ref{3b5,,PyUnicodeWriter_Finish()}.

@item 
@ref{3b8,,PyUnicodeWriter_WriteChar()}.

@item 
@ref{3bd,,PyUnicodeWriter_WriteUTF8()}.

@item 
@ref{3bc,,PyUnicodeWriter_WriteUCS4()}.

@item 
@ref{3be,,PyUnicodeWriter_WriteWideChar()}.

@item 
@ref{3ba,,PyUnicodeWriter_WriteStr()}.

@item 
@ref{3b9,,PyUnicodeWriter_WriteRepr()}.

@item 
@ref{3bb,,PyUnicodeWriter_WriteSubstring()}.

@item 
@ref{3b6,,PyUnicodeWriter_Format()}.

@item 
@ref{3b3,,PyUnicodeWriter_DecodeUTF8Stateful()}.
@end itemize

Patch by Victor Stinner.

@item 
gh-119613@footnote{https://github.com/python/cpython/issues/119613}: Soft deprecate the @ref{19d3,,Py_MEMCPY} macro: use directly
@code{memcpy()} instead.  Patch by Victor Stinner.

@item 
gh-119775@footnote{https://github.com/python/cpython/issues/119775}: Creating @ref{3cd,,immutable types}
with mutable bases was deprecated since 3.12 and now raises a
@ref{199,,TypeError}.

@item 
gh-119585@footnote{https://github.com/python/cpython/issues/119585}: Fix crash when a thread state that was created by
@ref{64a,,PyGILState_Ensure()} calls a destructor that during
@ref{19d4,,PyThreadState_Clear()} that calls back into
@code{PyGILState_Ensure()} and @ref{64b,,PyGILState_Release()}. This might
occur when in the free-threaded build or when using thread-local variables
whose destructors call @code{PyGILState_Ensure()}.

@item 
gh-119613@footnote{https://github.com/python/cpython/issues/119613}: Macros @code{Py_IS_NAN}, @code{Py_IS_INFINITY} and @code{Py_IS_FINITE}
are @ref{23f,,soft deprecated}.

@item 
gh-119336@footnote{https://github.com/python/cpython/issues/119336}: Restore the removed @code{_PyLong_NumBits()} function. It is used
by the pywin32 project. Patch by Ethan Smith

@item 
gh-119344@footnote{https://github.com/python/cpython/issues/119344}: The critical section API is now public as part of the
non-limited C API.

@item 
gh-119333@footnote{https://github.com/python/cpython/issues/119333}: Add @ref{19d5,,PyContext_AddWatcher()} and
@ref{19d6,,PyContext_ClearWatcher()} APIs to register callbacks to receive
notification on enter and exit of context objects.

@item 
gh-119247@footnote{https://github.com/python/cpython/issues/119247}: Added @code{Py_BEGIN_CRITICAL_SECTION_SEQUENCE_FAST} and
@code{Py_END_CRITICAL_SECTION_SEQUENCE_FAST} macros to make it possible to
use PySequence_Fast APIs safely when free-threaded, and update str.join to
work without the GIL using them.

@item 
gh-111389@footnote{https://github.com/python/cpython/issues/111389}: Add @ref{19d7,,PyHASH_MULTIPLIER} constant: prime multiplier
used in string and various other hashes. Patch by Victor Stinner.

@item 
gh-118771@footnote{https://github.com/python/cpython/issues/118771}: Several C declarations with names that didn’t start with the
@code{Py} or @code{_Py} prefixes, which were added by mistake in 3.13 alpha and
beta releases, were moved to internal headers.

@item 
gh-116984@footnote{https://github.com/python/cpython/issues/116984}: Make mimalloc includes relative to the current file to avoid
embedders or extensions needing to include @code{Internal/mimalloc} if they
are already including internal CPython headers.

@item 
gh-118789@footnote{https://github.com/python/cpython/issues/118789}: Add @ref{19d8,,PyUnstable_Object_ClearWeakRefsNoCallbacks()}, which
clears weakrefs without calling their callbacks.

@item 
gh-118789@footnote{https://github.com/python/cpython/issues/118789}: Restore @code{_PyWeakref_ClearRef} that was previously removed in
Python 3.13 alpha 1.

@item 
gh-117511@footnote{https://github.com/python/cpython/issues/117511}: Make the @ref{485,,PyMutex} public in the non-limited C API.

@item 
gh-116560@footnote{https://github.com/python/cpython/issues/116560}: Add @ref{398,,PyLong_GetSign()} function.  Patch by Sergey B
Kirpichev.

@item 
gh-97588@footnote{https://github.com/python/cpython/issues/97588}: Fix creating bitfields in @ref{2e,,ctypes} structures and unions.
Fields no longer overlap.

@item 
gh-87135@footnote{https://github.com/python/cpython/issues/87135}: Attempting to acquire the GIL after runtime finalization has
begun in a different thread now causes the thread to hang rather than
terminate, which avoids potential crashes or memory corruption caused by
attempting to terminate a thread that is running code not specifically
designed to support termination. In most cases this hanging is harmless
since the process will soon exit anyway.

The @code{PyThread_exit_thread} function is now deprecated.  Its behavior is
inconsistent across platforms, and it can only be used safely in the
unlikely case that every function in the entire call stack has been
designed to support the platform-dependent termination mechanism.  It is
recommended that users of this function change their design to not require
thread termination.  In the unlikely case that thread termination is
needed and can be done safely, users may migrate to calling
platform-specific APIs such as @code{pthread_exit} (POSIX) or
@code{_endthreadex} (Windows) directly.

@item 
bpo-34008@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34008}: Added @code{Py_IsInitialized} to the list of APIs that are safe to
call before the interpreter is initialized, and updated the embedding
tests to cover it.
@end itemize

@node Build<19>,,C API<18>,Python 3 14 0 alpha 1
@anchor{whatsnew/changelog id240}@anchor{19d9}
@subsubsection Build



@itemize -

@item 
gh-125269@footnote{https://github.com/python/cpython/issues/125269}: Fix detection of whether @code{-latomic} is needed when
cross-compiling CPython using the configure script.

@item 
gh-123990@footnote{https://github.com/python/cpython/issues/123990}: Remove @code{WITH_FREELISTS} macro and @code{--without-freelists}
build configuration

@item 
gh-124102@footnote{https://github.com/python/cpython/issues/124102}: Update internal documentation under PCbuild, so it now
correctly states that Windows requires VS2017 or later and Python 3.10 or
later

@item 
gh-124043@footnote{https://github.com/python/cpython/issues/124043}: Building using @ref{636,,--with-trace-refs} is (temporarily)
disallowed when the GIL is disabled.

@item 
gh-123418@footnote{https://github.com/python/cpython/issues/123418}: Updated Android build to use OpenSSL 3.0.15.

@item 
gh-123297@footnote{https://github.com/python/cpython/issues/123297}: Propagate the value of @code{LDFLAGS} to @code{LDCXXSHARED} in
@ref{e1,,sysconfig}. Patch by Pablo Galindo

@item 
gh-121634@footnote{https://github.com/python/cpython/issues/121634}: Allow for specifying the target compile triple for WASI.

@item 
gh-122578@footnote{https://github.com/python/cpython/issues/122578}: Use WASI SDK 24 for testing.

@item 
gh-116622@footnote{https://github.com/python/cpython/issues/116622}: Rename build variable @code{MODULE_LDFLAGS} back to @code{LIBPYTHON},
as it’s used by package build systems (e.g. Meson).

@item 
gh-118943@footnote{https://github.com/python/cpython/issues/118943}: Fix an issue where the experimental JIT could be built several
times by the @code{make regen-all} target, leading to possible race
conditions on heavily parallelized builds.

@item 
gh-121996@footnote{https://github.com/python/cpython/issues/121996}: Introduce ./configure –disable-safety and
–enable-slower-safety options. Patch by Donghee Na.

@item 
gh-120522@footnote{https://github.com/python/cpython/issues/120522}: Added a @ref{19da,,--with-app-store-compliance} option to patch
out known issues with macOS/iOS App Store review processes.

@item 
gh-120371@footnote{https://github.com/python/cpython/issues/120371}: Support WASI SDK 22 by explicitly skipping functions that are
just stubs in wasi-libc.

@item 
gh-121731@footnote{https://github.com/python/cpython/issues/121731}: Fix mimalloc compile error on GNU/Hurd

@item 
gh-121487@footnote{https://github.com/python/cpython/issues/121487}: Fix deprecation warning for ATOMIC_VAR_INIT in mimalloc.

@item 
gh-121467@footnote{https://github.com/python/cpython/issues/121467}: Fix a Makefile bug that prevented mimalloc header files from
being installed.

@item 
gh-121103@footnote{https://github.com/python/cpython/issues/121103}: On POSIX systems, excluding macOS framework installs, the lib
directory for the free-threaded build now includes a “t” suffix to avoid
conflicts with a co-located default build installation.

@item 
gh-120831@footnote{https://github.com/python/cpython/issues/120831}: The default minimum iOS version was increased to 13.0.

@item 
gh-121082@footnote{https://github.com/python/cpython/issues/121082}: Fix build failure when the developer use @code{--enable-pystats}
arguments in configuration command after #118450.

@item 
gh-120671@footnote{https://github.com/python/cpython/issues/120671}: Fix failing configure tests due to a missing space when
appending to CFLAGS.

@item 
gh-120602@footnote{https://github.com/python/cpython/issues/120602}: Correctly handle LLVM installs with @code{LLVM_VERSION_SUFFIX}
when building with @code{--enable-experimental-jit}.

@item 
gh-120688@footnote{https://github.com/python/cpython/issues/120688}: On WASI in debug mode, Python is now built with compiler flag
@code{-O3} instead of @code{-Og}, to support more recursive calls. Patch by
Victor Stinner.

@item 
gh-118943@footnote{https://github.com/python/cpython/issues/118943}: Fix a possible race condition affecting parallel builds
configured with @code{--enable-experimental-jit}, in which
@ref{266,,FileNotFoundError} could be caused by another process already moving
@code{jit_stencils.h.new} to @code{jit_stencils.h}.

@item 
gh-120326@footnote{https://github.com/python/cpython/issues/120326}: On Windows, fix build error when @code{--disable-gil} and
@code{--experimental-jit} options are combined.

@item 
gh-120291@footnote{https://github.com/python/cpython/issues/120291}: Make the @code{python-config} shell script compatible with
non-bash shells.

@item 
gh-113565@footnote{https://github.com/python/cpython/issues/113565}: Improve @ref{2f,,curses} and @ref{31,,curses.panel} dependency checks
in @code{configure}.

@item 
gh-119729@footnote{https://github.com/python/cpython/issues/119729}: On POSIX systems, the pkg-config (@code{.pc}) filenames now
include the ABI flags, which may include debug (“d”) and free-threaded
(“t”).  For example: * @code{python-3.14.pc} (default, non-debug build) *
@code{python-3.14d.pc} (default, debug build) * @code{python-3.14t.pc}
(free-threaded build)

@item 
gh-119400@footnote{https://github.com/python/cpython/issues/119400}: @code{make_ssl_certs}, the script that prepares certificate data
for the test suite, now allows specifying expiration dates.

@item 
gh-115119@footnote{https://github.com/python/cpython/issues/115119}: Fall back to the bundled libmpdec if a system version cannot be
found.

@item 
gh-119132@footnote{https://github.com/python/cpython/issues/119132}: Update @ref{49d,,sys.version} to identify whether the build is
default build or free-threading build. Patch By Donghee Na.

@item 
gh-118836@footnote{https://github.com/python/cpython/issues/118836}: Fix an @code{AssertionError} when building with
@code{--enable-experimental-jit} and the compiler emits a @code{SHT_NOTE}
section.

@item 
gh-118943@footnote{https://github.com/python/cpython/issues/118943}: Fix a possible race condition affecting parallel builds
configured with @code{--enable-experimental-jit}, in which compilation errors
could be caused by an incompletely-generated header file.
@end itemize

@node Python 3 13 0 beta 1,Python 3 13 0 alpha 6,Python 3 14 0 alpha 1,Changelog
@anchor{whatsnew/changelog python-3-13-0-beta-1}@anchor{19db}
@subsection Python 3.13.0 beta 1


`Release date: 2024-05-08'

@menu
* Security: Security<21>. 
* Core and Builtins: Core and Builtins<53>. 
* Library: Library<58>. 
* Core and Builtins: Core and Builtins<54>. 
* Library: Library<59>. 
* Documentation: Documentation<18>. 
* Build: Build<20>. 
* Windows: Windows<17>. 
* macOS: macOS<12>. 
* IDLE: IDLE<9>. 
* C API: C API<19>. 

@end menu

@node Security<21>,Core and Builtins<53>,,Python 3 13 0 beta 1
@anchor{whatsnew/changelog id241}@anchor{19dc}
@subsubsection Security



@itemize -

@item 
gh-116741@footnote{https://github.com/python/cpython/issues/116741}: Update bundled libexpat to 2.6.2

@item 
gh-117233@footnote{https://github.com/python/cpython/issues/117233}: Detect BLAKE2, SHA3, Shake, & truncated SHA512 support in the
OpenSSL-ish libcrypto library at build time.  This allows @ref{6c,,hashlib}
to be used with libraries that do not to support every algorithm that
upstream OpenSSL does.
@end itemize

@node Core and Builtins<53>,Library<58>,Security<21>,Python 3 13 0 beta 1
@anchor{whatsnew/changelog id242}@anchor{19dd}
@subsubsection Core and Builtins



@itemize -

@item 
gh-118414@footnote{https://github.com/python/cpython/issues/118414}: Add instrumented opcodes to YIELD_VALUE assertion for tracing
cases.

@item 
gh-117953@footnote{https://github.com/python/cpython/issues/117953}: When a builtin or extension module is imported for the first
time, while a subinterpreter is active, the module’s init function is now
run by the main interpreter first before import continues in the
subinterpreter. Consequently, single-phase init modules now fail in an
isolated subinterpreter without the init function running under that
interpreter, whereas before it would run under the subinterpreter `before'
failing, potentially leaving behind global state and callbacks and
otherwise leaving the module in an inconsistent state.

@item 
gh-117549@footnote{https://github.com/python/cpython/issues/117549}: Don’t use designated initializer syntax in inline functions in
internal headers. They cause problems for C++ or MSVC users who aren’t yet
using the latest C++ standard (C++20). While internal, pycore_backoff.h,
is included (indirectly, via pycore_code.h) by some key 3rd party software
that does so for speed.
@end itemize

@node Library<58>,Core and Builtins<54>,Core and Builtins<53>,Python 3 13 0 beta 1
@anchor{whatsnew/changelog id243}@anchor{19de}
@subsubsection Library



@itemize -

@item 
gh-95382@footnote{https://github.com/python/cpython/issues/95382}: Improve performance of @ref{f47,,json.dumps()} and @ref{f46,,json.dump()}
when using the argument `indent'. Depending on the data the encoding using
@code{json.dumps()} with `indent' can be up to 2 to 3 times faster.
@end itemize

@node Core and Builtins<54>,Library<59>,Library<58>,Python 3 13 0 beta 1
@anchor{whatsnew/changelog id244}@anchor{19df}
@subsubsection Core and Builtins



@itemize -

@item 
gh-116322@footnote{https://github.com/python/cpython/issues/116322}: In @code{--disable-gil} builds, the GIL will be enabled while
loading C extension modules. If the module indicates that it supports
running without the GIL, the GIL will be disabled once loading is
complete. Otherwise, the GIL will remain enabled for the remainder of the
interpreter’s lifetime. This behavior does not apply if the GIL has been
explicitly enabled or disabled with @code{PYTHON_GIL} or @code{-Xgil}.

@item 
gh-118513@footnote{https://github.com/python/cpython/issues/118513}: Fix incorrect @ref{1742,,UnboundLocalError} when two comprehensions
in the same function both reference the same name, and in one
comprehension the name is bound while in the other it’s an implicit
global.

@item 
gh-118518@footnote{https://github.com/python/cpython/issues/118518}: Allow the Linux perf support to work without frame pointers
using perf’s advanced JIT support. The feature is activated when using the
@code{PYTHON_PERF_JIT_SUPPORT} environment variable or when running Python
with @code{-Xperf_jit}. Patch by Pablo Galindo.

@item 
gh-117514@footnote{https://github.com/python/cpython/issues/117514}: Add @code{sys._is_gil_enabled()} function that returns whether the
GIL is currently enabled.  In the default build it always returns @code{True}
because the GIL is always enabled.  In the free-threaded build, it may
return @code{True} or @code{False}.

@item 
gh-118164@footnote{https://github.com/python/cpython/issues/118164}: Break a loop between the Python implementation of the
@ref{3a,,decimal} module and the Python code for integer to string
conversion. Also optimize integer to string conversion for values in the
range from 9_000 to 135_000 decimal digits.

@item 
gh-118473@footnote{https://github.com/python/cpython/issues/118473}: Fix @ref{19e0,,sys.set_asyncgen_hooks()} not to be partially set when
raising @ref{199,,TypeError}.

@item 
gh-118465@footnote{https://github.com/python/cpython/issues/118465}: Compiler populates the new @code{__firstlineno__} field on a class
with the line number of the first line of the class definition.

@item 
gh-118492@footnote{https://github.com/python/cpython/issues/118492}: Fix an issue where the type cache can expose a previously
accessed attribute when a finalizer is run.

@item 
gh-117714@footnote{https://github.com/python/cpython/issues/117714}: update @code{async_generator.athrow().close()} and
@code{async_generator.asend().close()} to close their section of the
underlying async generator

@item 
gh-111201@footnote{https://github.com/python/cpython/issues/111201}: The @ref{1b7,,interactive} interpreter is now implemented in
Python, which allows for a number of new features like colors, multiline
input, history viewing, and paste mode. Contributed by Pablo Galindo,
Łukasz Langa and Lysandros Nikolaou based on code from the PyPy project.

@item 
gh-74929@footnote{https://github.com/python/cpython/issues/74929}: Implement PEP 667: converted @ref{4a6,,FrameType.f_locals} and @ref{661,,PyFrame_GetLocals()} to return a
write-through proxy object when the frame refers to a function or
comprehension.

@item 
gh-116767@footnote{https://github.com/python/cpython/issues/116767}: Fix crash in compiler on ‘async with’ that has many context
managers.

@item 
gh-118335@footnote{https://github.com/python/cpython/issues/118335}: Change how to use the tier 2 interpreter. Instead of running
Python with @code{-X uops} or setting the environment variable
@code{PYTHON_UOPS=1}, this choice is now made at build time by configuring
with @code{--enable-experimental-jit=interpreter}.

`Beware!' This changes the environment variable to enable or disable
micro-ops to @code{PYTHON_JIT}. The old @code{PYTHON_UOPS} is no longer used.

@item 
gh-118306@footnote{https://github.com/python/cpython/issues/118306}: Update JIT compilation to use LLVM 18

@item 
gh-118160@footnote{https://github.com/python/cpython/issues/118160}: @ref{4ac,,Annotation scopes} within classes can
now contain comprehensions. However, such comprehensions are not inlined
into their parent scope at runtime. Patch by Jelle Zijlstra.

@item 
gh-118272@footnote{https://github.com/python/cpython/issues/118272}: Fix bug where @code{generator.close} does not free the generator
frame’s locals.

@item 
gh-118216@footnote{https://github.com/python/cpython/issues/118216}: Don’t consider @ref{0,,__future__} imports with dots before the
module name.

@item 
gh-118074@footnote{https://github.com/python/cpython/issues/118074}: Make sure that the Executor objects in the COLD_EXITS array
aren’t assumed to be GC-able (which would access bytes outside the
object).

@item 
gh-107674@footnote{https://github.com/python/cpython/issues/107674}: Lazy load frame line number to improve performance of tracing

@item 
gh-118082@footnote{https://github.com/python/cpython/issues/118082}: Improve @ref{18f,,SyntaxError} message for imports without names,
like in @code{from x import} and @code{import} cases. It now points out to users
that @ref{7f9,,import} expects at least one name after it.

@item 
gh-118090@footnote{https://github.com/python/cpython/issues/118090}: Improve @ref{18f,,SyntaxError} message for empty type param
brackets.

@item 
gh-117958@footnote{https://github.com/python/cpython/issues/117958}: Added a @code{get_jit_code()} method to access JIT compiled
machine code from the UOp Executor when the experimental JIT is enabled.
Patch by Anthony Shaw.

@item 
gh-117901@footnote{https://github.com/python/cpython/issues/117901}: Add option for compiler’s codegen to save nested instruction
sequences for introspection.

@item 
gh-116622@footnote{https://github.com/python/cpython/issues/116622}: Redirect stdout and stderr to system log when embedded in an
Android app.

@item 
gh-109118@footnote{https://github.com/python/cpython/issues/109118}: @ref{4ac,,annotation scope} within class scopes
can now contain lambdas.

@item 
gh-117894@footnote{https://github.com/python/cpython/issues/117894}: Prevent @code{agen.aclose()} objects being re-used after
@code{.throw()}.

@item 
gh-117881@footnote{https://github.com/python/cpython/issues/117881}: prevent concurrent access to an async generator via
athrow().throw() or asend().throw()

@item 
gh-117536@footnote{https://github.com/python/cpython/issues/117536}: Fix a @ref{4d8,,RuntimeWarning} when calling
@code{agen.aclose().throw(Exception)}.

@item 
gh-117755@footnote{https://github.com/python/cpython/issues/117755}: Fix mimalloc allocator for huge memory allocation (around
8,589,934,592 GiB) on s390x. Patch by Victor Stinner.

@item 
gh-117750@footnote{https://github.com/python/cpython/issues/117750}: Fix issue where an object’s dict would get out of sync with the
object’s internal values when being cleared. @code{obj.__dict__.clear()} now
clears the internal values, but leaves the dict attached to the object.

@item 
gh-117431@footnote{https://github.com/python/cpython/issues/117431}: Improve the performance of the following @ref{193,,bytes} and
@ref{342,,bytearray} methods by adapting them to the
@ref{19e1,,METH_FASTCALL} calling convention:


@itemize *

@item 
@code{count()}

@item 
@code{find()}

@item 
@code{index()}

@item 
@code{rfind()}

@item 
@code{rindex()}
@end itemize

@item 
gh-117709@footnote{https://github.com/python/cpython/issues/117709}: Speed up calls to @ref{16a,,str()} with positional-only argument, by
using the 
@geindex Python Enhancement Proposals; PEP 590
PEP 590@footnote{https://peps.python.org/pep-0590/} @code{vectorcall} calling convention. Patch by Erlend
Aasland.

@item 
gh-117680@footnote{https://github.com/python/cpython/issues/117680}: Give @code{_PyInstructionSequence} a Python interface and use it
in tests.

@item 
gh-115776@footnote{https://github.com/python/cpython/issues/115776}: Statically allocated objects are, by definition, immortal so
must be marked as such regardless of whether they are in extension modules
or not.

@item 
gh-117385@footnote{https://github.com/python/cpython/issues/117385}: Remove unhandled @code{PY_MONITORING_EVENT_BRANCH} and
@code{PY_MONITORING_EVENT_EXCEPTION_HANDLED} events from
@ref{2e3,,sys.settrace()}.

@item 
gh-116322@footnote{https://github.com/python/cpython/issues/116322}: Extension modules may indicate to the runtime that they can run
without the GIL. Multi-phase init modules do so by calling providing
@code{Py_MOD_GIL_NOT_USED} for the @code{Py_mod_gil} slot, while single-phase
init modules call @code{PyUnstable_Module_SetGIL(mod, Py_MOD_GIL_NOT_USED)}
from their init function.

@item 
gh-116129@footnote{https://github.com/python/cpython/issues/116129}: Implement 
@geindex Python Enhancement Proposals; PEP 696
PEP 696@footnote{https://peps.python.org/pep-0696/}, adding support for defaults on type
parameters. Patch by Jelle Zijlstra.

@item 
gh-93502@footnote{https://github.com/python/cpython/issues/93502}: Add two new functions to the C-API,
@ref{610,,PyRefTracer_SetTracer()} and @ref{611,,PyRefTracer_GetTracer()}, that
allows to track object creation and destruction the same way the
@ref{106,,tracemalloc} module does. Patch by Pablo Galindo

@item 
gh-107674@footnote{https://github.com/python/cpython/issues/107674}: Improved the performance of @ref{2e3,,sys.settrace()} significantly

@item 
gh-95754@footnote{https://github.com/python/cpython/issues/95754}: Improve the error message when a script shadowing a module from
the standard library causes @ref{5f0,,AttributeError} to be raised. Similarly,
improve the error message when a script shadowing a third party module
attempts to access an attribute from that third party module while still
initialising.

@item 
gh-99180@footnote{https://github.com/python/cpython/issues/99180}: Elide uninformative traceback indicators in @code{return} and
simple @code{assignment} statements. Patch by Pablo Galindo.

@item 
gh-105879@footnote{https://github.com/python/cpython/issues/105879}: Allow the `globals' and `locals' arguments to @ref{4a3,,exec()} and
@ref{4a4,,eval()} to be passed as keywords.
@end itemize

@node Library<59>,Documentation<18>,Core and Builtins<54>,Python 3 13 0 beta 1
@anchor{whatsnew/changelog id245}@anchor{19e2}
@subsubsection Library



@itemize -

@item 
gh-118418@footnote{https://github.com/python/cpython/issues/118418}: A @ref{1a4,,DeprecationWarning} is now emitted if you fail to pass
a value to the new `type_params' parameter of @code{typing._eval_type()} or
@code{typing.ForwardRef._evaluate()}. (Using either of these private and
undocumented functions is discouraged to begin with, but failing to pass a
value to the @code{type_params} parameter may lead to incorrect behaviour on
Python 3.12 or newer.)

@item 
gh-118660@footnote{https://github.com/python/cpython/issues/118660}: Add an optional second type parameter to
@ref{e91,,typing.ContextManager} and @ref{19e3,,typing.AsyncContextManager},
representing the return types of @ref{150c,,__exit__()} and
@ref{19e4,,__aexit__()} respectively. This parameter defaults to @code{bool
| None}.

@item 
gh-118650@footnote{https://github.com/python/cpython/issues/118650}: The @code{enum} module allows method named @code{_repr_*} to be
defined on @code{Enum} types.

@item 
gh-118648@footnote{https://github.com/python/cpython/issues/118648}: Add type parameter defaults to @ref{19e5,,typing.Generator} and
@ref{19e6,,typing.AsyncGenerator}.

@item 
gh-101137@footnote{https://github.com/python/cpython/issues/101137}: Mime type @code{text/x-rst} is now supported by @ref{93,,mimetypes}.

@item 
gh-118164@footnote{https://github.com/python/cpython/issues/118164}: The Python implementation of the @code{decimal} module could
appear to hang in relatively small power cases (like @code{2**117}) if
context precision was set to a very high value. A different method to
check for exactly representable results is used now that doesn’t rely on
computing @code{10**precision} (which could be effectively too large to
compute).

@item 
gh-111744@footnote{https://github.com/python/cpython/issues/111744}: @code{breakpoint()} and @code{pdb.set_trace()} now enter the debugger
immediately after the call rather than before the next line is executed.

@item 
gh-118500@footnote{https://github.com/python/cpython/issues/118500}: Add @ref{aa,,pdb} support for zipapps

@item 
gh-118406@footnote{https://github.com/python/cpython/issues/118406}: Add signature for @ref{54e,,sqlite3.Connection} objects.

@item 
gh-101732@footnote{https://github.com/python/cpython/issues/101732}: Use a Y2038 compatible openssl time function when available.

@item 
gh-118404@footnote{https://github.com/python/cpython/issues/118404}: Fix @ref{231,,inspect.signature()} for non-comparable callables.

@item 
gh-118402@footnote{https://github.com/python/cpython/issues/118402}: Fix @ref{231,,inspect.signature()} for the result of the
@ref{13e6,,functools.cmp_to_key()} call.

@item 
gh-116622@footnote{https://github.com/python/cpython/issues/116622}: On Android, @ref{144e,,sysconfig.get_platform} now returns the
format specified by 
@geindex Python Enhancement Proposals; PEP 738
PEP 738@footnote{https://peps.python.org/pep-0738/}.

@item 
gh-118285@footnote{https://github.com/python/cpython/issues/118285}: Allow to specify the signature of custom callable instances of
extension type by the @code{__text_signature__} attribute. Specify signatures
of @ref{1039,,operator.attrgetter}, @ref{c5d,,operator.itemgetter}, and
@ref{103a,,operator.methodcaller} instances.

@item 
gh-118314@footnote{https://github.com/python/cpython/issues/118314}: Fix an edge case in @ref{17b0,,binascii.a2b_base64()} strict mode,
where excessive padding is not detected when no padding is necessary.

@item 
gh-118271@footnote{https://github.com/python/cpython/issues/118271}: Add the @code{PhotoImage} methods @code{read()} to read an
image from a file and @code{data()} to get the image data. Add
`background' and `grayscale' parameters to @code{PhotoImage} method
@code{write()}.

@item 
gh-118225@footnote{https://github.com/python/cpython/issues/118225}: Add the @code{PhotoImage} method @code{copy_replace()} to
copy a region from one image to other image, possibly with pixel zooming
and/or subsampling. Add `from_coords' parameter to @code{PhotoImage}
methods @code{copy()}, @code{zoom()} and @code{subsample()}. Add `zoom'
and `subsample' parameters to @code{PhotoImage} method @code{copy()}.

@item 
gh-118221@footnote{https://github.com/python/cpython/issues/118221}: Fix a bug where @ref{550,,sqlite3.Connection.iterdump()} could fail
if a custom @ref{19e7,,row factory} was used.
Patch by Erlend Aasland.

@item 
gh-118013@footnote{https://github.com/python/cpython/issues/118013}: Fix regression introduced in gh-103193@footnote{https://github.com/python/cpython/issues/103193} that meant that calling
@ref{6bd,,inspect.getattr_static()} on an instance would cause a strong
reference to that instance’s class to persist in an internal cache in the
@ref{82,,inspect} module. This caused unexpected memory consumption if the
class was dynamically created, the class held strong references to other
objects which took up a significant amount of memory, and the cache
contained the sole strong reference to the class. The fix for the
regression leads to a slowdown in @code{getattr_static()}, but the
function should still be significantly faster than it was in Python 3.11.
Patch by Alex Waygood.

@item 
gh-118218@footnote{https://github.com/python/cpython/issues/118218}: Speed up @ref{a1c,,itertools.pairwise()} in the common case by up to
1.8x.

@item 
gh-117486@footnote{https://github.com/python/cpython/issues/117486}: Improve the behavior of user-defined subclasses of
@ref{4c4,,ast.AST}. Such classes will now require no changes in the usual
case to conform with the behavior changes of the @ref{9,,ast} module in
Python 3.13. Patch by Jelle Zijlstra.

@item 
gh-90848@footnote{https://github.com/python/cpython/issues/90848}: Fixed @ref{1978,,unittest.mock.create_autospec()} to configure parent
mock with keyword arguments.

@item 
gh-118168@footnote{https://github.com/python/cpython/issues/118168}: Fix incorrect argument substitution when @ref{19e8,,typing.Unpack}
is used with the builtin @ref{614,,tuple}. @code{typing.Unpack} now raises
@ref{199,,TypeError} when used with certain invalid types. Patch by Jelle
Zijlstra.

@item 
gh-118131@footnote{https://github.com/python/cpython/issues/118131}: Add command-line interface for the @ref{bd,,random} module. Patch
by Hugo van Kemenade.

@item 
gh-118107@footnote{https://github.com/python/cpython/issues/118107}: Fix @ref{139,,zipimport} reading of ZIP64 files with file entries
that are too big or offset too far.

@item 
gh-102511@footnote{https://github.com/python/cpython/issues/102511}: Fix @ref{1525,,os.path.normpath()} for UNC paths on Windows. Speed up
@ref{6cc,,os.path.splitroot()} with a native implementation.

@item 
gh-117535@footnote{https://github.com/python/cpython/issues/117535}: Change the unknown filename of @ref{119,,warnings} from @code{sys} to
@code{<sys>} to clarify that it’s not a real filename.

@item 
gh-114053@footnote{https://github.com/python/cpython/issues/114053}: Fix erroneous @ref{450,,NameError} when calling
@ref{8c2,,typing.get_type_hints()} on a class that made use of 
@geindex Python Enhancement Proposals; PEP 695
PEP 695@footnote{https://peps.python.org/pep-0695/} type
parameters in a module that had @code{from __future__ import annotations} at
the top of the file. Patch by Alex Waygood.

@item 
gh-116931@footnote{https://github.com/python/cpython/issues/116931}: Add parameter `fileobj' check for
@ref{19e9,,tarfile.TarFile.addfile()}

@item 
gh-117995@footnote{https://github.com/python/cpython/issues/117995}: Don’t raise @ref{1a4,,DeprecationWarning} when a @ref{717,,sequence}
of parameters is used to bind indexed, nameless placeholders. See also
gh-100668@footnote{https://github.com/python/cpython/issues/100668}.

@item 
gh-80361@footnote{https://github.com/python/cpython/issues/80361}: Fix TypeError in @ref{13d9,,email.message.Message.get_payload()} when
the charset is 
@geindex RFC; RFC 2231
RFC 2231@footnote{https://datatracker.ietf.org/doc/html/rfc2231.html} encoded.

@item 
gh-86650@footnote{https://github.com/python/cpython/issues/86650}: Fix IndexError when parse some emails with invalid Message-ID
(including one-off addresses generated by Microsoft Outlook).

@item 
gh-117691@footnote{https://github.com/python/cpython/issues/117691}: Improve the error messages emitted by @ref{e4,,tarfile}
deprecation warnings relating to PEP 706. If a @code{filter} argument is not
provided to @code{extract()} or @code{extractall}, the deprecation warning now
points to the line in the user’s code where the relevant function was
called. Patch by Alex Waygood.

@item 
gh-115874@footnote{https://github.com/python/cpython/issues/115874}: Fixed a possible segfault during garbage collection of
@code{_asyncio.FutureIter} objects. Patch by Savannah Ostrowski.

@item 
gh-115060@footnote{https://github.com/python/cpython/issues/115060}: Speed up @ref{538,,pathlib.Path.glob()} by omitting an initial
@ref{53b,,is_dir()} call. As a result of this change,
@code{glob()} can no longer raise @ref{2c2,,OSError}.

@item 
gh-77102@footnote{https://github.com/python/cpython/issues/77102}: @ref{cc,,site} module now parses @code{.pth} file with UTF-8 first,
and @ref{54b,,locale encoding} if @code{UnicodeDecodeError} happened. It
supported only locale encoding before.

@item 
gh-76785@footnote{https://github.com/python/cpython/issues/76785}: We’ve exposed the low-level @code{_interpreters} module for the
sake of the PyPI implementation of 
@geindex Python Enhancement Proposals; PEP 734
PEP 734@footnote{https://peps.python.org/pep-0734/}.  It was sometimes available
as the @code{_xxsubinterpreters} module and was formerly used only for
testing. For the most part, it should be considered an internal module,
like @code{_thread} and @code{_imp}. See
@indicateurl{https://discuss.python.org/t/pep-734-multiple-interpreters-in-the-stdlib/41147/26}.

@item 
gh-115060@footnote{https://github.com/python/cpython/issues/115060}: Speed up @ref{538,,pathlib.Path.glob()} by not scanning directories
for non-wildcard pattern segments.

@item 
gh-117727@footnote{https://github.com/python/cpython/issues/117727}: Speed up @ref{270,,pathlib.Path.iterdir()} by using
@ref{c5a,,os.scandir()} internally.

@item 
gh-117586@footnote{https://github.com/python/cpython/issues/117586}: Speed up @ref{6d0,,pathlib.Path.walk()} by working with strings
internally.

@item 
gh-117722@footnote{https://github.com/python/cpython/issues/117722}: Change the new multi-separator support in
@ref{4d1,,asyncio.StreamReader.readuntil()} to only accept tuples of separators
rather than arbitrary iterables.

@item 
gh-117692@footnote{https://github.com/python/cpython/issues/117692}: Fixes a bug when @ref{19ea,,doctest.DocTestFinder} was failing on
wrapped @code{builtin_function_or_method}.

@item 
gh-117348@footnote{https://github.com/python/cpython/issues/117348}: Largely restored import time performance of configparser by
avoiding dataclasses.

@item 
gh-117641@footnote{https://github.com/python/cpython/issues/117641}: Speedup @ref{1043,,os.path.commonpath()} on Unix.

@item 
gh-117663@footnote{https://github.com/python/cpython/issues/117663}: Fix @code{_simple_enum} to detect aliases when multiple arguments
are present but only one is the member value.

@item 
gh-117636@footnote{https://github.com/python/cpython/issues/117636}: Speedup @ref{19eb,,os.path.join()}.

@item 
gh-117618@footnote{https://github.com/python/cpython/issues/117618}: Support @code{package.module} as @code{filename} for @code{break}
command of @ref{aa,,pdb}

@item 
gh-102247@footnote{https://github.com/python/cpython/issues/102247}: the status codes enum with constants in http.HTTPStatus are
updated to include the names from RFC9110. This RFC includes some HTTP
statuses previously only used for WEBDAV and assigns more generic names to
them.

The old constants are preserved for backwards compatibility.

@item 
gh-117607@footnote{https://github.com/python/cpython/issues/117607}: Speedup @ref{6d2,,os.path.relpath()}.

@item 
gh-117586@footnote{https://github.com/python/cpython/issues/117586}: Speed up @ref{538,,pathlib.Path.glob()} by working with strings
internally.

@item 
gh-117225@footnote{https://github.com/python/cpython/issues/117225}: Add colour to doctest output. Patch by Hugo van Kemenade.

@item 
gh-117566@footnote{https://github.com/python/cpython/issues/117566}: @ref{19ec,,ipaddress.IPv6Address.is_loopback()} will now return
@code{True} for IPv4-mapped loopback addresses, i.e. addresses in the
@code{::ffff:127.0.0.0/104} address space.

@item 
gh-117546@footnote{https://github.com/python/cpython/issues/117546}: Fix issue where @ref{264,,os.path.realpath()} stopped resolving
symlinks after encountering a symlink loop on POSIX.

@item 
gh-116720@footnote{https://github.com/python/cpython/issues/116720}: Improved behavior of @ref{4d2,,asyncio.TaskGroup} when an
external cancellation collides with an internal cancellation. For example,
when two task groups are nested and both experience an exception in a
child task simultaneously, it was possible that the outer task group would
misbehave, because its internal cancellation was swallowed by the inner
task group.

In the case where a task group is cancelled externally and also must raise
an @ref{4d3,,ExceptionGroup}, it will now call the parent task’s
@ref{4d4,,cancel()} method. This ensures that a
@ref{4d5,,asyncio.CancelledError} will be raised at the next @ref{18e,,await},
so the cancellation is not lost.

An added benefit of these changes is that task groups now preserve the
cancellation count (@ref{4d6,,asyncio.Task.cancelling()}).

In order to handle some corner cases, @ref{4d7,,asyncio.Task.uncancel()} may
now reset the undocumented @code{_must_cancel} flag when the cancellation
count reaches zero.

@item 
gh-117516@footnote{https://github.com/python/cpython/issues/117516}: Add @ref{48c,,typing.TypeIs}, implementing 
@geindex Python Enhancement Proposals; PEP 742
PEP 742@footnote{https://peps.python.org/pep-0742/}. Patch by
Jelle Zijlstra.

@item 
gh-117503@footnote{https://github.com/python/cpython/issues/117503}: Fix support of non-ASCII user names in bytes paths in
@ref{c0f,,os.path.expanduser()} on Posix.

@item 
gh-117394@footnote{https://github.com/python/cpython/issues/117394}: @ref{c0d,,os.path.ismount()} is now 2-3 times faster if the user has
permissions.

@item 
gh-117313@footnote{https://github.com/python/cpython/issues/117313}: Only treat @code{'\n'}, @code{'\r'} and @code{'\r\n'} as line separators
in re-folding the @ref{3f,,email} messages. Preserve control characters
@code{'\v'}, @code{'\f'}, @code{'\x1c'}, @code{'\x1d'} and @code{'\x1e'} and Unicode line
separators @code{'\x85'}, @code{'\u2028'} and @code{'\u2029'} as is.

@item 
gh-117142@footnote{https://github.com/python/cpython/issues/117142}: Convert @code{_ctypes} to multi-phase initialisation
(
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).

@item 
gh-66543@footnote{https://github.com/python/cpython/issues/66543}: Add the @ref{517,,mimetypes.guess_file_type()} function which works
with file path. Passing file path instead of URL in
@ref{518,,guess_type()} is @ref{23f,,soft deprecated}.

@item 
gh-68583@footnote{https://github.com/python/cpython/issues/68583}: webbrowser CLI: replace getopt with argparse, add long options.
Patch by Hugo van Kemenade.

@item 
gh-116871@footnote{https://github.com/python/cpython/issues/116871}: Name suggestions for @ref{5f0,,AttributeError} and
@ref{65b,,ImportError} now only include underscored names if the original name
was underscored.

@item 
gh-116023@footnote{https://github.com/python/cpython/issues/116023}: Don’t show empty fields (value @code{None} or @code{[]}) in
@ref{ae7,,ast.dump()} by default. Add @code{show_empty=False} parameter to
optionally show them.

@item 
gh-115961@footnote{https://github.com/python/cpython/issues/115961}: Added @code{name} and @code{mode} attributes for compressed
and archived file-like objects in modules @ref{14,,bz2}, @ref{8e,,lzma},
@ref{e4,,tarfile} and @ref{138,,zipfile}. The value of the @code{mode}
attribute of @ref{65c,,gzip.GzipFile} was changed from integer (@code{1} or
@code{2}) to string (@code{'rb'} or @code{'wb'}). The value of the @code{mode}
attribute of the readable file-like object returned by
@ref{65d,,zipfile.ZipFile.open()} was changed from @code{'r'} to @code{'rb'}.

@item 
gh-82062@footnote{https://github.com/python/cpython/issues/82062}: Fix @ref{231,,inspect.signature()} to correctly handle parameter
defaults on methods in extension modules that use names defined in the
module namespace.

@item 
gh-83856@footnote{https://github.com/python/cpython/issues/83856}: Honor @ref{d,,atexit} for all @ref{98,,multiprocessing} start methods

@item 
gh-113081@footnote{https://github.com/python/cpython/issues/113081}: Print colorized exception just like built-in traceback in
@ref{aa,,pdb}

@item 
gh-112855@footnote{https://github.com/python/cpython/issues/112855}: Speed up pickling of @ref{6ce,,pathlib.PurePath} objects. Patch
by Barney Gale.

@item 
gh-111744@footnote{https://github.com/python/cpython/issues/111744}: Support opcode events in @ref{10,,bdb}

@item 
gh-109617@footnote{https://github.com/python/cpython/issues/109617}: @code{ncurses}: fixed a crash that could occur on macOS 13 or
earlier when Python was built with Apple Xcode 15’s SDK.

@item 
gh-83151@footnote{https://github.com/python/cpython/issues/83151}: Enabled arbitrary statements and evaluations in @ref{aa,,pdb} shell
to access the local variables of the current frame, which made it possible
for multi-scope code like generators or nested function to work.

@item 
gh-110209@footnote{https://github.com/python/cpython/issues/110209}: Add @ref{948,,__class_getitem__()} to
@ref{19ed,,types.GeneratorType} and @ref{108f,,types.CoroutineType} for type
hinting purposes. Patch by James Hilton-Balfe.

@item 
gh-108191@footnote{https://github.com/python/cpython/issues/108191}: The @ref{4e6,,types.SimpleNamespace} now accepts an optional
positional argument which specifies initial values of attributes as a dict
or an iterable of key-value pairs.

@item 
gh-62090@footnote{https://github.com/python/cpython/issues/62090}: Fix assertion errors caused by whitespace in metavars or
@code{SUPPRESS}-ed groups in @ref{7,,argparse} by simplifying usage formatting.
Patch by Ali Hamdan.

@item 
gh-102402@footnote{https://github.com/python/cpython/issues/102402}: Adjust @code{logging.LogRecord} to use @code{time.time_ns()} and fix
minor bug related to floating-point math.

@item 
gh-100242@footnote{https://github.com/python/cpython/issues/100242}: Bring pure Python implementation @code{functools.partial.__new__}
more in line with the C-implementation by not just always checking for the
presence of the attribute @code{'func'} on the first argument of @code{partial}.
Instead, both the Python version and the C version perform an
@code{isinstance(func, partial)} check on the first argument of @code{partial}.

@item 
gh-99730@footnote{https://github.com/python/cpython/issues/99730}: HEAD requests are no longer upgraded to GET request during
redirects in urllib.

@item 
gh-66410@footnote{https://github.com/python/cpython/issues/66410}: Setting the @code{tkinter} module global @code{wantobjects}
to @code{2} before creating the @ref{19ee,,Tk} object or call the
@code{wantobjects()} method of the @code{Tk} object with argument @code{2}
makes now arguments to callbacks registered in the @ref{f6,,tkinter} module
to be passed as various Python objects (@code{int}, @code{float}, @code{bytes},
@code{tuple}), depending on their internal representation in Tcl, instead of
always @code{str}. @code{tkinter.wantobjects} is now set to @code{2} by
default.

@item 
bpo-40943@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40943}: Fix several IndexError when parse emails with truncated
Message-ID, address, routes, etc, e.g. @code{example@@}.

@item 
bpo-39324@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39324}: Add mime type mapping for .md <-> text/markdown

@item 
bpo-18108@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18108}: @ref{549,,shutil.chown()} now supports `dir_fd' and
`follow_symlinks' keyword arguments.

@item 
bpo-30988@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30988}: Fix parsing of emails with invalid address headers having a
leading or trailing dot. Patch by tsufeki.

@item 
bpo-32839@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32839}: Add the @code{after_info()} method for Tkinter widgets.
@end itemize

@node Documentation<18>,Build<20>,Library<59>,Python 3 13 0 beta 1
@anchor{whatsnew/changelog id246}@anchor{19ef}
@subsubsection Documentation



@itemize -

@item 
gh-117928@footnote{https://github.com/python/cpython/issues/117928}: The minimum Sphinx version required for the documentation is
now 6.2.1.
@end itemize

@node Build<20>,Windows<17>,Documentation<18>,Python 3 13 0 beta 1
@anchor{whatsnew/changelog id247}@anchor{19f0}
@subsubsection Build



@itemize -

@item 
gh-118734@footnote{https://github.com/python/cpython/issues/118734}: Fixes Windows build when invoked directly (not through the
@code{build.bat} script) without specifying a value for @code{UseTIER2}.

@item 
gh-115119@footnote{https://github.com/python/cpython/issues/115119}: The @code{configure} option @ref{657,,--with-system-libmpdec}
now defaults to @code{yes}. The bundled copy of @code{libmpdecimal} will be
removed in Python 3.15.

@item 
gh-117845@footnote{https://github.com/python/cpython/issues/117845}: Fix building against recent libedit versions by detecting
readline hook signatures in @code{configure}.

@item 
gh-116622@footnote{https://github.com/python/cpython/issues/116622}: A testbed project was added to run the test suite on Android.

@item 
gh-117645@footnote{https://github.com/python/cpython/issues/117645}: Increase WASI stack size from 512 KiB to 8 MiB and the initial
memory from 10 MiB to 20 MiB. Patch by Victor Stinner.

@item 
gh-115119@footnote{https://github.com/python/cpython/issues/115119}: @code{configure} now uses @code{pkg-config} to detect
@ref{3a,,decimal} dependencies if the @ref{657,,--with-system-libmpdec} option
is given.
@end itemize

@node Windows<17>,macOS<12>,Build<20>,Python 3 13 0 beta 1
@anchor{whatsnew/changelog id248}@anchor{19f1}
@subsubsection Windows



@itemize -

@item 
gh-115119@footnote{https://github.com/python/cpython/issues/115119}: Update Windows installer to use libmpdecimal 4.0.0.

@item 
gh-118486@footnote{https://github.com/python/cpython/issues/118486}: @ref{52c,,os.mkdir()} now accepts `mode' of @code{0o700} to restrict
the new directory to the current user.

@item 
gh-118347@footnote{https://github.com/python/cpython/issues/118347}: Fixes launcher updates not being installed.

@item 
gh-118293@footnote{https://github.com/python/cpython/issues/118293}: The @code{multiprocessing} module now passes the
@code{STARTF_FORCEOFFFEEDBACK} flag when spawning processes to tell Windows
not to change the mouse cursor.

@item 
gh-115009@footnote{https://github.com/python/cpython/issues/115009}: Update Windows installer to use SQLite 3.45.3.

@item 
gh-90329@footnote{https://github.com/python/cpython/issues/90329}: Suppress the warning displayed on virtual environment creation
when the requested and created paths differ only by a short (8.3 style)
name. Warnings will continue to be shown if a junction or symlink in the
path caused the venv to be created in a different location than originally
requested.

@item 
gh-117786@footnote{https://github.com/python/cpython/issues/117786}: Fixes virtual environments not correctly launching when created
from a Store install.
@end itemize

@node macOS<12>,IDLE<9>,Windows<17>,Python 3 13 0 beta 1
@anchor{whatsnew/changelog id249}@anchor{19f2}
@subsubsection macOS



@itemize -

@item 
gh-115119@footnote{https://github.com/python/cpython/issues/115119}: Update macOS installer to use libmpdecimal 4.0.0.

@item 
gh-114099@footnote{https://github.com/python/cpython/issues/114099}: iOS preprocessor symbol usage was made compatible with older
macOS SDKs.

@item 
gh-115009@footnote{https://github.com/python/cpython/issues/115009}: Update macOS installer to use SQLite 3.45.3.

@item 
gh-91629@footnote{https://github.com/python/cpython/issues/91629}: Use @code{~/.config/fish/conf.d} configs and
@code{fish_add_path} to set 
@geindex PATH
@geindex environment variable; PATH
@code{PATH} when installing for the
Fish shell.
@end itemize

@node IDLE<9>,C API<19>,macOS<12>,Python 3 13 0 beta 1
@anchor{whatsnew/changelog id250}@anchor{19f3}
@subsubsection IDLE



@itemize -

@item 
bpo-34774@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34774}: Use user-selected color theme for Help => IDLE Doc.
@end itemize

@node C API<19>,,IDLE<9>,Python 3 13 0 beta 1
@anchor{whatsnew/changelog id251}@anchor{19f4}
@subsubsection C API



@itemize -

@item 
gh-118124@footnote{https://github.com/python/cpython/issues/118124}: Fix @ref{19f5,,Py_BUILD_ASSERT} and
@ref{19f6,,Py_BUILD_ASSERT_EXPR} for non-constant expressions: use
@code{static_assert()} on C11 and newer. Patch by Victor Stinner.

@item 
gh-110850@footnote{https://github.com/python/cpython/issues/110850}: Add “Raw” variant of PyTime functions


@itemize *

@item 
@ref{5d8,,PyTime_MonotonicRaw()}

@item 
@ref{5da,,PyTime_PerfCounterRaw()}

@item 
@ref{5dc,,PyTime_TimeRaw()}
@end itemize

Patch by Victor Stinner.

@item 
gh-117987@footnote{https://github.com/python/cpython/issues/117987}: Restore functions removed in Python 3.13 alpha 1:


@itemize *

@item 
@ref{19f7,,Py_SetPythonHome()}

@item 
@ref{19f8,,Py_SetProgramName()}

@item 
@ref{19f9,,PySys_SetArgvEx()}

@item 
@ref{19fa,,PySys_SetArgv()}
@end itemize

Patch by Victor Stinner.

@item 
gh-117929@footnote{https://github.com/python/cpython/issues/117929}: Restore removed @ref{19fb,,PyEval_InitThreads()} function. Patch by
Victor Stinner.

@item 
gh-117534@footnote{https://github.com/python/cpython/issues/117534}: Improve validation logic in the C implementation of
@ref{82b,,datetime.datetime.fromisoformat()} to better handle invalid years.
Patch by Vlad Efanov.

@item 
gh-68114@footnote{https://github.com/python/cpython/issues/68114}: Fixed skipitem()’s handling of the old ‘w’ and ‘w#’ formatters.
These are no longer supported and now raise an exception if used.

@item 
gh-111997@footnote{https://github.com/python/cpython/issues/111997}: Add a C-API for firing monitoring events.
@end itemize

@node Python 3 13 0 alpha 6,Python 3 13 0 alpha 5,Python 3 13 0 beta 1,Changelog
@anchor{whatsnew/changelog python-3-13-0-alpha-6}@anchor{19fc}
@subsection Python 3.13.0 alpha 6


`Release date: 2024-04-09'

@menu
* Core and Builtins: Core and Builtins<55>. 
* Library: Library<60>. 
* Core and Builtins: Core and Builtins<56>. 
* Library: Library<61>. 
* Documentation: Documentation<19>. 
* Tests: Tests<18>. 
* Build: Build<21>. 
* Windows: Windows<18>. 
* C API: C API<20>. 

@end menu

@node Core and Builtins<55>,Library<60>,,Python 3 13 0 alpha 6
@anchor{whatsnew/changelog id252}@anchor{19fd}
@subsubsection Core and Builtins



@itemize -

@item 
gh-117494@footnote{https://github.com/python/cpython/issues/117494}: Refactored the instruction sequence data structure out of
compile.c into instruction_sequence.c.

@item 
gh-116968@footnote{https://github.com/python/cpython/issues/116968}: Introduce a unified 16-bit backoff counter type
(@code{_Py_BackoffCounter}), shared between the Tier 1 adaptive specializer
and the Tier 2 optimizer. The API used for adaptive specialization
counters is changed but the behavior is (supposed to be) identical.

The behavior of the Tier 2 counters is changed:


@itemize *

@item 
There are no longer dynamic thresholds (we never varied these).

@item 
All counters now use the same exponential backoff.

@item 
The counter for @code{JUMP_BACKWARD} starts counting down from 16.

@item 
The @code{temperature} in side exits starts counting down from 64.
@end itemize

@item 
gh-117431@footnote{https://github.com/python/cpython/issues/117431}: Improve the performance of the following @ref{193,,bytes} and
@ref{342,,bytearray} methods by adapting them to the
@ref{19e1,,METH_FASTCALL} calling convention:


@itemize *

@item 
@code{endswith()}

@item 
@code{startswith()}
@end itemize

@item 
gh-117431@footnote{https://github.com/python/cpython/issues/117431}: Improve the performance of the following @ref{16a,,str} methods
by adapting them to the @ref{19e1,,METH_FASTCALL} calling convention:


@itemize *

@item 
@ref{19c5,,count()}

@item 
@ref{10d2,,endswith()}

@item 
@ref{10ae,,find()}

@item 
@ref{19fe,,index()}

@item 
@ref{10af,,rfind()}

@item 
@ref{1463,,rindex()}

@item 
@ref{10d1,,startswith()}
@end itemize

@item 
gh-117411@footnote{https://github.com/python/cpython/issues/117411}: Move @code{PyFutureFeatures} to an internal header and make it
private.

@item 
gh-109120@footnote{https://github.com/python/cpython/issues/109120}: Added handle of incorrect star expressions, e.g @code{f(3, *)}.
Patch by Grigoryev Semyon

@item 
gh-117266@footnote{https://github.com/python/cpython/issues/117266}: Fix crashes for certain user-created subclasses of
@ref{4c4,,ast.AST}. Such classes are now expected to set the
@code{_field_types} attribute.

@item 
gh-99108@footnote{https://github.com/python/cpython/issues/99108}: Updated the @ref{6c,,hashlib} built-in HACL* project@footnote{https://github.com/hacl-star/hacl-star} C code
from upstream that we use for many implementations when they are not
present via OpenSSL in a given build.  This also avoids the rare potential
for a C symbol name one definition rule linking issue.

@item 
gh-117108@footnote{https://github.com/python/cpython/issues/117108}: Change the old space bit of objects in the young generation
from 0 to gcstate->visited, so that any objects created during GC will
have the old bit set correctly if they get moved into the old generation.

@item 
gh-117108@footnote{https://github.com/python/cpython/issues/117108}: The cycle GC now chooses the size of increments based on the
total heap size, instead of the rate of object creation. This ensures that
it can keep up with growing heaps.

@item 
gh-116735@footnote{https://github.com/python/cpython/issues/116735}: For @code{INSTRUMENTED_CALL_FUNCTION_EX}, set @code{arg0} to
@code{sys.monitoring.MISSING} instead of @code{None} for
@ref{19ff,,CALL} event.

@item 
gh-113964@footnote{https://github.com/python/cpython/issues/113964}: Starting new threads and process creation through
@ref{4b6,,os.fork()} are now only prevented once all non-daemon threads exit.

@item 
gh-116626@footnote{https://github.com/python/cpython/issues/116626}: Ensure @code{INSTRUMENTED_CALL_FUNCTION_EX} always emits
@ref{19ff,,CALL}

@item 
gh-116554@footnote{https://github.com/python/cpython/issues/116554}: @code{list.sort()} now exploits more cases of partial ordering,
particularly those with long descending runs with sub-runs of equal
values. Those are recognized as single runs now (previously, each block of
repeated values caused a new run to be created).

@item 
gh-114099@footnote{https://github.com/python/cpython/issues/114099}: Added a Loader that can discover extension modules in an
iOS-style Frameworks folder.

@item 
gh-115775@footnote{https://github.com/python/cpython/issues/115775}: Compiler populates the new @code{__static_attributes__} field on a
class with the names of attributes of this class which are accessed
through self.X from any function in its body.

@item 
gh-115776@footnote{https://github.com/python/cpython/issues/115776}: The array of values, the @code{PyDictValues} struct is now
embedded in the object during allocation. This provides better performance
in the common case, and does not degrade as much when the object’s
@code{__dict__} is materialized.

@item 
gh-108362@footnote{https://github.com/python/cpython/issues/108362}: Implement an incremental cyclic garbage collector. By
collecting the old generation in increments, there is no need for a full
heap scan. This can hugely reduce maximum pause time for programs with
large heaps.

Reduce the number of generations from three to two. The old generation is
split into two spaces, “visited” and “pending”.

Collection happens in two steps:: * An increment is formed from the young
generation and a small part of the pending space. * This increment is
scanned and the survivors moved to the end of the visited space.

When the collecting space becomes empty, the two spaces are swapped.
@end itemize

@node Library<60>,Core and Builtins<56>,Core and Builtins<55>,Python 3 13 0 alpha 6
@anchor{whatsnew/changelog id253}@anchor{1a00}
@subsubsection Library



@itemize -

@item 
gh-109870@footnote{https://github.com/python/cpython/issues/109870}: Dataclasses now calls @ref{4a3,,exec()} once per dataclass, instead
of once per method being added.  This can speed up dataclass creation by
up to 20%.

@item 
gh-97901@footnote{https://github.com/python/cpython/issues/97901}: Mime type @code{text/rtf} is now supported by @ref{93,,mimetypes}.
@end itemize

@node Core and Builtins<56>,Library<61>,Library<60>,Python 3 13 0 alpha 6
@anchor{whatsnew/changelog id254}@anchor{1a01}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-24612@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24612}: Improve the @ref{18f,,SyntaxError} that happens when ‘not’ appears
after an operator. Patch by Pablo Galindo
@end itemize

@node Library<61>,Documentation<19>,Core and Builtins<56>,Python 3 13 0 alpha 6
@anchor{whatsnew/changelog id255}@anchor{1a02}
@subsubsection Library



@itemize -

@item 
gh-117648@footnote{https://github.com/python/cpython/issues/117648}: Improve performance of @ref{19eb,,os.path.join()} and
@ref{c0f,,os.path.expanduser()}.

@item 
gh-117584@footnote{https://github.com/python/cpython/issues/117584}: Raise @ref{199,,TypeError} for non-paths in
@ref{6d2,,posixpath.relpath}.

@item 
gh-117467@footnote{https://github.com/python/cpython/issues/117467}: Preserve mailbox ownership when rewriting in
@ref{1a03,,mailbox.mbox.flush}. Patch by Tony
Mountifield.

@item 
gh-114848@footnote{https://github.com/python/cpython/issues/114848}: Raise @ref{266,,FileNotFoundError} when @code{getcwd()} returns
‘(unreachable)’, which can happen on Linux >= 2.6.36 with glibc < 2.27.

@item 
gh-117459@footnote{https://github.com/python/cpython/issues/117459}: @code{asyncio.asyncio.run_coroutine_threadsafe()} now keeps the
traceback of @code{CancelledError}, @ref{a3c,,TimeoutError} and
@code{InvalidStateError} which are raised in the coroutine.

@item 
gh-117381@footnote{https://github.com/python/cpython/issues/117381}: Fix error message for @code{ntpath.commonpath()}.

@item 
gh-117337@footnote{https://github.com/python/cpython/issues/117337}: Deprecate undocumented @code{glob.glob0()} and
@code{glob.glob1()} functions. Use @ref{5a0,,glob.glob()} and pass a directory
to its `root_dir' argument instead.

@item 
gh-117349@footnote{https://github.com/python/cpython/issues/117349}: Optimise several functions in @ref{a6,,os.path}.

@item 
gh-117348@footnote{https://github.com/python/cpython/issues/117348}: Refactored @code{configparser.RawConfigParser._read()} to reduce
cyclometric complexity and improve comprehensibility.

@item 
gh-117335@footnote{https://github.com/python/cpython/issues/117335}: Raise TypeError for non-sequences for
@code{ntpath.commonpath()}.

@item 
gh-66449@footnote{https://github.com/python/cpython/issues/66449}: @ref{4df,,configparser.ConfigParser} now accepts unnamed sections
before named ones, if configured to do so.

@item 
gh-88014@footnote{https://github.com/python/cpython/issues/88014}: In documentation of @ref{65c,,gzip.GzipFile} in module gzip,
explain data type of optional constructor argument `mtime', and recommend
@code{mtime = 0} for generating deterministic streams.

@item 
gh-117310@footnote{https://github.com/python/cpython/issues/117310}: Fixed an unlikely early & extra @code{Py_DECREF} triggered crash
in @ref{d5,,ssl} when creating a new @code{_ssl._SSLContext} if CPython was
built implausibly such that the default cipher list is empty `or' the
SSL library it was linked against reports a failure from its C
@code{SSL_CTX_set_cipher_list()} API.

@item 
gh-117294@footnote{https://github.com/python/cpython/issues/117294}: A @code{DocTestCase} now reports as skipped if all examples in the
doctest are skipped.

@item 
gh-98966@footnote{https://github.com/python/cpython/issues/98966}: In @ref{dc,,subprocess}, raise a more informative message when
@code{stdout=STDOUT}.

@item 
gh-117225@footnote{https://github.com/python/cpython/issues/117225}: doctest: only print “and X failed” when non-zero, don’t
pluralise “1 items”. Patch by Hugo van Kemenade.

@item 
gh-117205@footnote{https://github.com/python/cpython/issues/117205}: Speed up @ref{d21,,compileall.compile_dir()} by 20% when using
multiprocessing by increasing @code{chunksize}.

@item 
gh-117178@footnote{https://github.com/python/cpython/issues/117178}: Fix regression in lazy loading of self-referential modules,
introduced in gh-114781@footnote{https://github.com/python/cpython/issues/114781}.

@item 
gh-112383@footnote{https://github.com/python/cpython/issues/112383}: Fix @ref{3c,,dis} module’s handling of @code{ENTER_EXECUTOR}
instructions.

@item 
gh-117182@footnote{https://github.com/python/cpython/issues/117182}: Lazy-loading of modules that modify their own @code{__class__} no
longer reverts the @code{__class__} to @ref{101a,,types.ModuleType}.

@item 
gh-117084@footnote{https://github.com/python/cpython/issues/117084}: Fix @ref{138,,zipfile} extraction for directory entries with the
name containing backslashes on Windows.

@item 
gh-117114@footnote{https://github.com/python/cpython/issues/117114}: Make @ref{1a04,,os.path.isdevdrive()} available on all platforms. For
those that do not offer Dev Drives, it will always return @code{False}.

@item 
gh-117110@footnote{https://github.com/python/cpython/issues/117110}: Fix a bug that prevents subclasses of @ref{8bd,,typing.Any} to be
instantiated with arguments. Patch by Chris Fu.

@item 
gh-109653@footnote{https://github.com/python/cpython/issues/109653}: Deferred select imports in importlib.metadata and
importlib.resources for a 14% speedup.

@item 
gh-70647@footnote{https://github.com/python/cpython/issues/70647}: Start the deprecation period for the current behavior of
@ref{1994,,datetime.datetime.strptime()} and @ref{1639,,time.strptime()} which always
fails to parse a date string with a @ref{2ee,,ValueError} involving a day of
month such as @code{strptime("02-29", "%m-%d")} when a year is `not'
specified and the date happen to be February 29th.  This should help avoid
users finding new bugs every four years due to a natural mistaken
assumption about the API when parsing partial date values.

@item 
gh-116987@footnote{https://github.com/python/cpython/issues/116987}: Fixed @code{inspect.findsource()} for class code objects.

@item 
gh-114099@footnote{https://github.com/python/cpython/issues/114099}: Modify standard library to allow for iOS platform differences.

@item 
gh-90872@footnote{https://github.com/python/cpython/issues/90872}: On Windows, @ref{ee6,,subprocess.Popen.wait()} no longer calls
@code{WaitForSingleObject()} with a negative timeout: pass @code{0} ms if the
timeout is negative. Patch by Victor Stinner.

@item 
gh-116957@footnote{https://github.com/python/cpython/issues/116957}: configparser: Don’t leave ConfigParser values in an invalid
state (stored as a list instead of a str) after an earlier read raised
DuplicateSectionError or DuplicateOptionError.

@item 
gh-115538@footnote{https://github.com/python/cpython/issues/115538}: @code{_io.WindowsConsoleIO} now emit a warning if a boolean
value is passed as a filedescriptor argument.

@item 
gh-90095@footnote{https://github.com/python/cpython/issues/90095}: Ignore empty lines and comments in @code{.pdbrc}

@item 
gh-106531@footnote{https://github.com/python/cpython/issues/106531}: Refreshed zipfile._path from zipp 3.18@footnote{https://zipp.readthedocs.io/en/latest/history.html#v3-18-0}, providing
better compatibility for PyPy, better glob performance for deeply nested
zipfiles, and providing internal access to @code{CompleteDirs.inject} for use
in other tests (like importlib.resources).

@item 
gh-63207@footnote{https://github.com/python/cpython/issues/63207}: On Windows, @ref{55d,,time.time()} now uses the
@code{GetSystemTimePreciseAsFileTime()} clock to have a resolution better
than 1 us, instead of the @code{GetSystemTimeAsFileTime()} clock which has a
resolution of 15.6 ms. Patch by Victor Stinner.

@item 
gh-116764@footnote{https://github.com/python/cpython/issues/116764}: Restore support of @code{None} and other false values in
@ref{111,,urllib.parse} functions @ref{321,,parse_qs()} and
@ref{320,,parse_qsl()}. Also, they now raise a TypeError for
non-zero integers and non-empty sequences.

@item 
gh-116811@footnote{https://github.com/python/cpython/issues/116811}: In @code{PathFinder.invalidate_caches}, delegate to
@code{MetadataPathFinder.invalidate_caches}.

@item 
gh-116647@footnote{https://github.com/python/cpython/issues/116647}: Fix recursive child in dataclasses

@item 
gh-113171@footnote{https://github.com/python/cpython/issues/113171}: Fixed various false positives and false negatives in


@itemize *

@item 
@ref{1a05,,ipaddress.IPv4Address.is_private} (see these docs for details)

@item 
@ref{1165,,ipaddress.IPv4Address.is_global}

@item 
@ref{1a06,,ipaddress.IPv6Address.is_private}

@item 
@ref{1a07,,ipaddress.IPv6Address.is_global}
@end itemize

Also in the corresponding @ref{50f,,ipaddress.IPv4Network} and
@ref{510,,ipaddress.IPv6Network} attributes.

@item 
gh-63283@footnote{https://github.com/python/cpython/issues/63283}: In @ref{56,,encodings.idna}, any capitalization of the ACE prefix
(@code{xn--}) is now acceptable. Patch by Pepijn de Vos and Zackery Spytz.

@item 
gh-71042@footnote{https://github.com/python/cpython/issues/71042}: Add @ref{1a08,,platform.android_ver()}, which provides device and OS
information on Android.

@item 
gh-73468@footnote{https://github.com/python/cpython/issues/73468}: Added new @ref{515,,math.fma()} function, wrapping C99’s @code{fma()}
operation: fused multiply-add function. Patch by Mark Dickinson and Victor
Stinner.

@item 
gh-116608@footnote{https://github.com/python/cpython/issues/116608}: The @ref{7f,,importlib.resources} functions
@ref{4fe,,is_resource()},
@ref{4ff,,open_binary()},
@ref{500,,open_text()}, @ref{501,,path()},
@ref{502,,read_binary()}, and
@ref{503,,read_text()} are un-deprecated, and support
subdirectories via multiple positional arguments. The
@ref{504,,contents()} function also allows subdirectories,
but remains deprecated.

@item 
gh-116484@footnote{https://github.com/python/cpython/issues/116484}: Change automatically generated @ref{1a09,,tkinter.Checkbutton}
widget names to avoid collisions with automatically generated
@ref{1a0a,,tkinter.ttk.Checkbutton} widget names within the same parent
widget.

@item 
gh-114314@footnote{https://github.com/python/cpython/issues/114314}: In @ref{2e,,ctypes}, ctype data is now stored in type objects
directly rather than in a dict subclass. This is an internal change that
should not affect usage.

@item 
gh-116401@footnote{https://github.com/python/cpython/issues/116401}: Fix blocking @ref{d58,,os.fwalk()} and @ref{354,,shutil.rmtree()} on
opening named pipe.

@item 
gh-71052@footnote{https://github.com/python/cpython/issues/71052}: Implement @ref{f4b,,ctypes.util.find_library()} on Android.

@item 
gh-90535@footnote{https://github.com/python/cpython/issues/90535}: Fix support of `interval' values > 1 in
@code{logging.TimedRotatingFileHandler} for @code{when='MIDNIGHT'} and
@code{when='Wx'}.

@item 
gh-113308@footnote{https://github.com/python/cpython/issues/113308}: Remove some internal protected parts from @ref{117,,uuid}:
@code{_has_uuid_generate_time_safe}, @code{_netbios_getnode},
@code{_ipconfig_getnode}, and @code{_load_system_functions}. They were unused.

@item 
gh-115627@footnote{https://github.com/python/cpython/issues/115627}: Fix the @ref{d5,,ssl} module error handling of connection
terminate by peer. It now throws an OSError with the appropriate error
code instead of an EOFError.

@item 
gh-114847@footnote{https://github.com/python/cpython/issues/114847}: Speed up @ref{264,,os.path.realpath()} on non-Windows platforms.

@item 
gh-114271@footnote{https://github.com/python/cpython/issues/114271}: Fix a race in @code{threading.Thread.join()}.

@code{threading._MainThread} now always represents the main thread of the
main interpreter.

@code{PyThreadState.on_delete} and @code{PyThreadState.on_delete_data} have been
removed.

@item 
gh-113538@footnote{https://github.com/python/cpython/issues/113538}: Add @ref{4cf,,asyncio.Server.close_clients()} and
@ref{4d0,,asyncio.Server.abort_clients()} methods which allow to more
forcefully close an asyncio server.

@item 
gh-85287@footnote{https://github.com/python/cpython/issues/85287}: Changes Unicode codecs to return UnicodeEncodeError or
UnicodeDecodeError, rather than just UnicodeError.

@item 
gh-113548@footnote{https://github.com/python/cpython/issues/113548}: @ref{aa,,pdb} now allows CLI arguments to @code{pdb -m}.

@item 
gh-112948@footnote{https://github.com/python/cpython/issues/112948}: Make completion of @ref{aa,,pdb} similar to Python REPL

@item 
gh-105866@footnote{https://github.com/python/cpython/issues/105866}: Fixed @code{_get_slots} bug which caused error when defining
dataclasses with slots and a weakref_slot.

@item 
gh-96471@footnote{https://github.com/python/cpython/issues/96471}: Add @ref{c70,,asyncio.Queue} termination with
@ref{4cd,,shutdown()} method.

@item 
gh-89739@footnote{https://github.com/python/cpython/issues/89739}: The @ref{139,,zipimport} module can now read ZIP64 files.

@item 
bpo-33533@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33533}: @ref{4c7,,asyncio.as_completed()} now returns an object that is both
an asynchronous iterator and plain iterator. The new asynchronous
iteration pattern allows for easier correlation between prior tasks and
their completed results. This is a closer match to
@ref{1a0b,,concurrent.futures.as_completed()}’s iteration pattern. Patch by
Justin Arthur.

@item 
bpo-27578@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27578}: @ref{1812,,inspect.getsource()} (and related functions) work with
empty module files, returning @code{'\n'} (or reasonable equivalent) instead
of raising @code{OSError}. Patch by Kernc.

@item 
bpo-37141@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37141}: Accept an iterable of separators in
@ref{4d1,,asyncio.StreamReader.readuntil()}, stopping when one of them is
encountered.

@item 
gh-66543@footnote{https://github.com/python/cpython/issues/66543}: Make @ref{518,,mimetypes.guess_type()} properly parsing of URLs with
only a host name, URLs containing fragment or query, and filenames with
only a UNC sharepoint on Windows. Based on patch by Dong-hee Na.

@item 
bpo-15010@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15010}: @ref{11eb,,unittest.TestLoader.discover()} now saves the original
value of @code{unittest.TestLoader._top_level_dir} and restores it at the end
of the call.
@end itemize

@node Documentation<19>,Tests<18>,Library<61>,Python 3 13 0 alpha 6
@anchor{whatsnew/changelog id256}@anchor{1a0c}
@subsubsection Documentation



@itemize -

@item 
gh-115977@footnote{https://github.com/python/cpython/issues/115977}: Remove compatibility references to Emscripten.

@item 
gh-114099@footnote{https://github.com/python/cpython/issues/114099}: Add an iOS platform guide, and flag modules not available on
iOS.

@item 
gh-91565@footnote{https://github.com/python/cpython/issues/91565}: Changes to documentation files and config outputs to reflect the
new location for reporting bugs - i.e. GitHub rather than bugs.python.org.
@end itemize

@node Tests<18>,Build<21>,Documentation<19>,Python 3 13 0 alpha 6
@anchor{whatsnew/changelog id257}@anchor{1a0d}
@subsubsection Tests



@itemize -

@item 
gh-83434@footnote{https://github.com/python/cpython/issues/83434}: Disable JUnit XML output (@code{--junit-xml=FILE} command line
option) in regrtest when hunting for reference leaks (@code{-R} option).
Patch by Victor Stinner.

@item 
gh-117187@footnote{https://github.com/python/cpython/issues/117187}: Fix XML tests for vanilla Expat <2.6.0.

@item 
gh-116333@footnote{https://github.com/python/cpython/issues/116333}: Tests of TLS related things (error codes, etc) were updated to
be more lenient about specific error message strings and behaviors as seen
in the BoringSSL and AWS-LC forks of OpenSSL.

@item 
gh-117089@footnote{https://github.com/python/cpython/issues/117089}: Consolidated tests for importlib.metadata in their own
@code{metadata} package.

@item 
gh-115979@footnote{https://github.com/python/cpython/issues/115979}: Update test_importlib so that it passes under WASI SDK 21.

@item 
gh-112536@footnote{https://github.com/python/cpython/issues/112536}: Add –tsan to test.regrtest for running TSAN tests in
reasonable execution times. Patch by Donghee Na.

@item 
gh-116307@footnote{https://github.com/python/cpython/issues/116307}: Added import helper @code{isolated_modules} as @code{CleanImport}
does not remove modules imported during the context. Use it in
importlib.resources tests to avoid leaving @code{mod} around to impede
importlib.metadata tests.
@end itemize

@node Build<21>,Windows<18>,Tests<18>,Python 3 13 0 alpha 6
@anchor{whatsnew/changelog id258}@anchor{1a0e}
@subsubsection Build



@itemize -

@item 
gh-114736@footnote{https://github.com/python/cpython/issues/114736}: Have WASI builds use WASI SDK 21.

@item 
gh-115983@footnote{https://github.com/python/cpython/issues/115983}: Skip building test modules that must be built as shared under
WASI.

@item 
gh-71052@footnote{https://github.com/python/cpython/issues/71052}: Add Android build script and instructions.
@end itemize

@node Windows<18>,C API<20>,Build<21>,Python 3 13 0 alpha 6
@anchor{whatsnew/changelog id259}@anchor{1a0f}
@subsubsection Windows



@itemize -

@item 
gh-117267@footnote{https://github.com/python/cpython/issues/117267}: Ensure @code{DirEntry.stat().st_ctime} behaves consistently with
@ref{26f,,os.stat()} during the deprecation period of @code{st_ctime} by
containing the same value as @code{st_birthtime}. After the deprecation
period, @code{st_ctime} will be the metadata change time (or unavailable
through @code{DirEntry}), and only @code{st_birthtime} will contain the creation
time.

@item 
gh-116195@footnote{https://github.com/python/cpython/issues/116195}: Improves performance of @ref{1a10,,os.getppid()} by using an
alternate system API when available. Contributed by vxiiduu.

@item 
gh-88494@footnote{https://github.com/python/cpython/issues/88494}: On Windows, @ref{55c,,time.monotonic()} now uses the
@code{QueryPerformanceCounter()} clock to have a resolution better than 1 us,
instead of the @code{GetTickCount64()} clock which has a resolution of 15.6
ms. Patch by Victor Stinner.

@item 
gh-116773@footnote{https://github.com/python/cpython/issues/116773}: Fix instances of @code{<_overlapped.Overlapped object at 0xXXX>
still has pending operation at deallocation, the process may crash}.

@item 
gh-91227@footnote{https://github.com/python/cpython/issues/91227}: Fix the asyncio ProactorEventLoop implementation so that sending
a datagram to an address that is not listening does not prevent receiving
any more datagrams.

@item 
gh-115119@footnote{https://github.com/python/cpython/issues/115119}: Switched from vendored @code{libmpdecimal} code to a
separately-hosted external package in the @code{cpython-source-deps}
repository when building the @code{_decimal} module.
@end itemize

@node C API<20>,,Windows<18>,Python 3 13 0 alpha 6
@anchor{whatsnew/changelog id260}@anchor{1a11}
@subsubsection C API



@itemize -

@item 
gh-117642@footnote{https://github.com/python/cpython/issues/117642}: Fix 
@geindex Python Enhancement Proposals; PEP 737
PEP 737@footnote{https://peps.python.org/pep-0737/} implementation for @code{%#T} and @code{%#N}.

@item 
gh-87193@footnote{https://github.com/python/cpython/issues/87193}: @ref{1a12,,_PyBytes_Resize()} can now be called for bytes objects
with reference count > 1, including 1-byte bytes objects. It creates a new
bytes object and destroys the old one if it has reference count > 1.

@item 
gh-117021@footnote{https://github.com/python/cpython/issues/117021}: Fix integer overflow in @ref{1a13,,PyLong_AsPid()} on non-Windows
64-bit platforms.

@item 
gh-115756@footnote{https://github.com/python/cpython/issues/115756}: @code{PyCode_GetFirstFree()} is an ustable API now and has
been renamed to @ref{627,,PyUnstable_Code_GetFirstFree()}. (Contributed by
Bogdan Romanyuk in gh-115781@footnote{https://github.com/python/cpython/issues/115781})

@item 
gh-116869@footnote{https://github.com/python/cpython/issues/116869}: Add @code{test_cext} test: build a C extension to check if the
Python C API emits C compiler warnings. Patch by Victor Stinner.

@item 
gh-116869@footnote{https://github.com/python/cpython/issues/116869}: Make the C API compatible with
@code{-Werror=declaration-after-statement} compiler flag again. Patch by
Victor Stinner.

@item 
gh-116936@footnote{https://github.com/python/cpython/issues/116936}: Add @ref{635,,PyType_GetModuleByDef()} to the limited C API. Patch
by Victor Stinner.

@item 
gh-116809@footnote{https://github.com/python/cpython/issues/116809}: Restore removed private @code{_PyErr_ChainExceptions1()} function.
Patch by Victor Stinner.

@item 
gh-115754@footnote{https://github.com/python/cpython/issues/115754}: In the limited C API version 3.13, getting @code{Py_None},
@code{Py_False}, @code{Py_True}, @code{Py_Ellipsis} and @code{Py_NotImplemented}
singletons is now implemented as function calls at the stable ABI level to
hide implementation details. Getting these constants still return borrowed
references. Patch by Victor Stinner.

@item 
gh-115754@footnote{https://github.com/python/cpython/issues/115754}: Add @ref{5f9,,Py_GetConstant()} and
@ref{5fa,,Py_GetConstantBorrowed()} functions to get constants. For example,
@code{Py_GetConstant(Py_CONSTANT_ZERO)} returns a @ref{5e2,,strong reference} to
the constant zero. Patch by Victor Stinner.

@item 
gh-111696@footnote{https://github.com/python/cpython/issues/111696}: Add support for @code{%T}, @code{%T#}, @code{%N} and @code{%N#} formats to
@ref{62b,,PyUnicode_FromFormat()}: format the fully qualified name of an
object type and of a type: call @ref{618,,PyType_GetModuleName()}. See
@geindex Python Enhancement Proposals; PEP 737
PEP 737@footnote{https://peps.python.org/pep-0737/} for more information. Patch by Victor Stinner.

@item 
gh-111696@footnote{https://github.com/python/cpython/issues/111696}: Add @ref{618,,PyType_GetModuleName()} function to get the type’s
module name. Equivalent to getting the @code{type.__module__} attribute.
Patch by Eric Snow and Victor Stinner.

@item 
gh-111696@footnote{https://github.com/python/cpython/issues/111696}: Add @ref{616,,PyType_GetFullyQualifiedName()} function to get the
type’s fully qualified name. Equivalent to
@code{f"@{type.__module__@}.@{type.__qualname__@}"}, or @code{type.__qualname__} if
@code{type.__module__} is not a string or is equal to @code{"builtins"}. Patch
by Victor Stinner.

@item 
gh-85283@footnote{https://github.com/python/cpython/issues/85283}: The @code{fcntl}, @code{grp}, @code{pwd}, @code{termios}, @code{_statistics}
and @code{_testconsole} C extensions are now built with the @ref{637,,limited C API}. Patch by Victor Stinner.

@item 
gh-111140@footnote{https://github.com/python/cpython/issues/111140}: Add additional flags to @ref{606,,PyLong_AsNativeBytes()} and
@ref{607,,PyLong_FromNativeBytes()} to allow the caller to determine how to
handle edge cases around values that fill the entire buffer.

@item 
gh-113024@footnote{https://github.com/python/cpython/issues/113024}: Add @ref{60c,,PyObject_GenericHash()} function.
@end itemize

@node Python 3 13 0 alpha 5,Python 3 13 0 alpha 4,Python 3 13 0 alpha 6,Changelog
@anchor{whatsnew/changelog python-3-13-0-alpha-5}@anchor{1a14}
@subsection Python 3.13.0 alpha 5


`Release date: 2024-03-12'

@menu
* Security: Security<22>. 
* Core and Builtins: Core and Builtins<57>. 
* Library: Library<62>. 
* Core and Builtins: Core and Builtins<58>. 
* Library: Library<63>. 
* Core and Builtins: Core and Builtins<59>. 
* Library: Library<64>. 
* Documentation: Documentation<20>. 
* Tests: Tests<19>. 
* Build: Build<22>. 
* Windows: Windows<19>. 
* macOS: macOS<13>. 
* IDLE: IDLE<10>. 
* Tools/Demos: Tools/Demos<16>. 
* C API: C API<21>. 

@end menu

@node Security<22>,Core and Builtins<57>,,Python 3 13 0 alpha 5
@anchor{whatsnew/changelog id261}@anchor{1a15}
@subsubsection Security



@itemize -

@item 
gh-115398@footnote{https://github.com/python/cpython/issues/115398}: Allow controlling Expat >=2.6.0 reparse deferral
(
@geindex Common Vulnerabilities and Exposures; CVE 2023-52425
CVE 2023-52425@footnote{https://www.cve.org/CVERecord?id=CVE-2023-52425}) by adding five new methods:


@itemize *

@item 
@ref{576,,xml.etree.ElementTree.XMLParser.flush()}

@item 
@ref{577,,xml.etree.ElementTree.XMLPullParser.flush()}

@item 
@ref{578,,xml.parsers.expat.xmlparser.GetReparseDeferralEnabled()}

@item 
@ref{579,,xml.parsers.expat.xmlparser.SetReparseDeferralEnabled()}

@item 
@code{xml.sax.expatreader.ExpatParser.flush()}
@end itemize

@item 
gh-114572@footnote{https://github.com/python/cpython/issues/114572}: @ref{11b2,,ssl.SSLContext.cert_store_stats()} and
@ref{11b3,,ssl.SSLContext.get_ca_certs()} now correctly lock access to the
certificate store, when the @ref{355,,ssl.SSLContext} is shared across
multiple threads.
@end itemize

@node Core and Builtins<57>,Library<62>,Security<22>,Python 3 13 0 alpha 5
@anchor{whatsnew/changelog id262}@anchor{1a16}
@subsubsection Core and Builtins



@itemize -

@item 
gh-116604@footnote{https://github.com/python/cpython/issues/116604}: Respect the status of the garbage collector when indirect calls
are made via @ref{694,,PyErr_CheckSignals()} and the evaluation breaker.
Patch by Pablo Galindo

@item 
gh-112087@footnote{https://github.com/python/cpython/issues/112087}: @ref{24f,,list} is now compatible with the implementation of
@geindex Python Enhancement Proposals; PEP 703
PEP 703@footnote{https://peps.python.org/pep-0703/}.

@item 
gh-116381@footnote{https://github.com/python/cpython/issues/116381}: Add specialization for @code{CONTAINS_OP}.

@item 
gh-116296@footnote{https://github.com/python/cpython/issues/116296}: Fix possible refleak in @code{object.__reduce__()} internal
error handling.

@item 
gh-115823@footnote{https://github.com/python/cpython/issues/115823}: Properly calculate error ranges in the parser when raising
@ref{18f,,SyntaxError} exceptions caused by invalid byte sequences. Patch by
Pablo Galindo

@item 
gh-115778@footnote{https://github.com/python/cpython/issues/115778}: Add @code{tierN} annotation for instruction definition in
interpreter DSL.

@item 
gh-115733@footnote{https://github.com/python/cpython/issues/115733}: Fix crash when calling @code{next()} on exhausted list iterators.

@item 
gh-115700@footnote{https://github.com/python/cpython/issues/115700}: The regen-cases build stage now works on Windows.

@item 
gh-115347@footnote{https://github.com/python/cpython/issues/115347}: Fix bug where docstring was replaced by a redundant NOP when
Python is run with @code{-OO}.

@item 
gh-115323@footnote{https://github.com/python/cpython/issues/115323}: Make error message more meaningful for when
@ref{17e3,,bytearray.extend()} is called with a @ref{16a,,str} object.

@item 
gh-112175@footnote{https://github.com/python/cpython/issues/112175}: Every @code{PyThreadState} now has its own @code{eval_breaker},
allowing specific threads to be interrupted.
@end itemize

@node Library<62>,Core and Builtins<58>,Core and Builtins<57>,Python 3 13 0 alpha 5
@anchor{whatsnew/changelog id263}@anchor{1a17}
@subsubsection Library



@itemize -

@item 
gh-115154@footnote{https://github.com/python/cpython/issues/115154}: Fix a bug that was causing the @ref{18f9,,tokenize.untokenize()}
function to handle unicode named literals incorrectly. Patch by Pablo
Galindo
@end itemize

@node Core and Builtins<58>,Library<63>,Library<62>,Python 3 13 0 alpha 5
@anchor{whatsnew/changelog id264}@anchor{1a18}
@subsubsection Core and Builtins



@itemize -

@item 
gh-112433@footnote{https://github.com/python/cpython/issues/112433}: Add ability to force alignment of @ref{1e7,,ctypes.Structure} by
way of the new @code{_align_} attribute on the class.
@end itemize

@node Library<63>,Core and Builtins<59>,Core and Builtins<58>,Python 3 13 0 alpha 5
@anchor{whatsnew/changelog id265}@anchor{1a19}
@subsubsection Library



@itemize -

@item 
gh-104090@footnote{https://github.com/python/cpython/issues/104090}: The multiprocessing resource tracker now exits with non-zero
status code if a resource leak was detected. It still exits with status
code 0 otherwise.
@end itemize

@node Core and Builtins<59>,Library<64>,Library<63>,Python 3 13 0 alpha 5
@anchor{whatsnew/changelog id266}@anchor{1a1a}
@subsubsection Core and Builtins



@itemize -

@item 
gh-105858@footnote{https://github.com/python/cpython/issues/105858}: Improve the constructors for @ref{9,,ast} nodes. Arguments of
list types now default to an empty list if omitted, and optional fields
default to @code{None}. AST nodes now have an @code{__annotations__} attribute
with the expected types of their attributes. Passing unrecognized extra
arguments to AST nodes is deprecated and will become an error in Python
3.15. Omitting a required argument to an AST node is deprecated and will
become an error in Python 3.15. Patch by Jelle Zijlstra.

@item 
gh-101860@footnote{https://github.com/python/cpython/issues/101860}: Expose @code{__name__} attribute on property.

@item 
gh-96497@footnote{https://github.com/python/cpython/issues/96497}: Fix incorrect resolution of mangled class variables used in
assignment expressions in comprehensions.
@end itemize

@node Library<64>,Documentation<20>,Core and Builtins<59>,Python 3 13 0 alpha 5
@anchor{whatsnew/changelog id267}@anchor{1a1b}
@subsubsection Library



@itemize -

@item 
gh-116600@footnote{https://github.com/python/cpython/issues/116600}: Fix @ref{1c3,,repr()} for global @ref{836,,Flag} members.

@item 
gh-116349@footnote{https://github.com/python/cpython/issues/116349}: @ref{32a,,platform.java_ver()} is deprecated and will be removed in
3.15. It was largely untested, had a confusing API, and was only useful
for Jython support.

@item 
gh-116143@footnote{https://github.com/python/cpython/issues/116143}: Fix a race in pydoc @code{_start_server}, eliminating a window in
which @code{_start_server} can return a thread that is “serving” but without
a @code{docserver} set.

@item 
gh-116127@footnote{https://github.com/python/cpython/issues/116127}: @ref{10b,,typing}: implement 
@geindex Python Enhancement Proposals; PEP 705
PEP 705@footnote{https://peps.python.org/pep-0705/} which adds
@ref{48b,,typing.ReadOnly} support to @ref{330,,typing.TypedDict}.

@item 
gh-116325@footnote{https://github.com/python/cpython/issues/116325}: @ref{10b,,typing}: raise @ref{18f,,SyntaxError} instead of
@ref{5f0,,AttributeError} on forward references as empty strings.

@item 
gh-115957@footnote{https://github.com/python/cpython/issues/115957}: When @code{asyncio.TaskGroup.create_task} is called on an inactive
@code{asyncio.TaskGroup}, the given coroutine will be closed (which prevents
a @code{RuntimeWarning}).

@item 
gh-115978@footnote{https://github.com/python/cpython/issues/115978}: Disable preadv(), readv(), pwritev(), and writev() on WASI.

Under wasmtime for WASI 0.2, these functions don’t pass test_posix
(@indicateurl{https://github.com/bytecodealliance/wasmtime/issues/7830}).

@item 
gh-88352@footnote{https://github.com/python/cpython/issues/88352}: Fix the computation of the next rollover time in the
@code{logging.TimedRotatingFileHandler} handler.
@code{computeRollover()} now always returns a timestamp larger than the
specified time and works correctly during the DST change.
@code{doRollover()} no longer overwrite the already rolled over file,
saving from data loss when run at midnight or during repeated time at the
DST change.

@item 
gh-87115@footnote{https://github.com/python/cpython/issues/87115}: Set @code{__main__.__spec__} to @code{None} when running a script with
@ref{aa,,pdb}

@item 
gh-76511@footnote{https://github.com/python/cpython/issues/76511}: Fix UnicodeEncodeError in @code{email.Message.as_string()} that
results when a message that claims to be in the ascii character set
actually has non-ascii characters. Non-ascii characters are now replaced
with the U+FFFD replacement character, like in the @code{replace} error
handler.

@item 
gh-89547@footnote{https://github.com/python/cpython/issues/89547}: Add support for nested typing special forms like
Final[ClassVar[int]].

@item 
gh-65824@footnote{https://github.com/python/cpython/issues/65824}: Improve the @code{less} prompt in @ref{ba,,pydoc}.

@item 
gh-116040@footnote{https://github.com/python/cpython/issues/116040}: [Enum] fix by-value calls when second value is falsey; e.g.
Cardinal(1, 0)

@item 
gh-115821@footnote{https://github.com/python/cpython/issues/115821}: [Enum] Improve error message when calling super().__new__() in
custom __new__.

@item 
gh-85644@footnote{https://github.com/python/cpython/issues/85644}: Use the @code{XDG_CURRENT_DESKTOP} environment variable in
@ref{11c,,webbrowser} to check desktop. Prefer it to the deprecated
@code{GNOME_DESKTOP_SESSION_ID} for GNOME detection.

@item 
gh-75988@footnote{https://github.com/python/cpython/issues/75988}: Fixed @ref{1978,,unittest.mock.create_autospec()} to pass the call
through to the wrapped object to return the real result.

@item 
gh-115881@footnote{https://github.com/python/cpython/issues/115881}: Fix issue where @ref{1c4,,ast.parse()} would incorrectly flag
conditional context managers (such as @code{with (x() if y else z()): ...})
as invalid syntax if @code{feature_version=(3, 8)} was passed. This reverts
changes to the grammar made as part of gh-94949@footnote{https://github.com/python/cpython/issues/94949}.

@item 
gh-115886@footnote{https://github.com/python/cpython/issues/115886}: Fix silent truncation of the name with an embedded null
character in @ref{1a1c,,multiprocessing.shared_memory.SharedMemory}.

@item 
gh-115532@footnote{https://github.com/python/cpython/issues/115532}: Add kernel density estimation to the statistics module.

@item 
gh-115714@footnote{https://github.com/python/cpython/issues/115714}: On WASI, the @ref{f4,,time} module no longer get process time
using @code{times()} or @code{CLOCK_PROCESS_CPUTIME_ID}, system API is that is
unreliable and is likely to be removed from WASI. The affected clock
functions fall back to calling @code{clock()}.

@item 
gh-115809@footnote{https://github.com/python/cpython/issues/115809}: Improve algorithm for computing which rolled-over log files to
delete in @code{logging.TimedRotatingFileHandler}. It is now reliable
for handlers without @code{namer} and with arbitrary deterministic @code{namer}
that leaves the datetime part in the file name unmodified.

@item 
gh-74668@footnote{https://github.com/python/cpython/issues/74668}: @ref{111,,urllib.parse} functions @ref{321,,parse_qs()} and
@ref{320,,parse_qsl()} now support bytes arguments containing raw
and percent-encoded non-ASCII data.

@item 
gh-67044@footnote{https://github.com/python/cpython/issues/67044}: @ref{6b0,,csv.writer()} now always quotes or escapes @code{'\r'} and
@code{'\n'}, regardless of `lineterminator' value.

@item 
gh-115712@footnote{https://github.com/python/cpython/issues/115712}: Restore support of space delimiter with
@code{skipinitialspace=True} in @ref{2d,,csv}. @ref{6b0,,csv.writer()} now quotes
empty fields if delimiter is a space and skipinitialspace is true and
raises exception if quoting is not possible.

@item 
gh-112364@footnote{https://github.com/python/cpython/issues/112364}: Fixed @ref{ae8,,ast.unparse()} to handle format_spec with @code{"},
@code{'} or @code{\\}. Patched by Frank Hoffmann.

@item 
gh-112997@footnote{https://github.com/python/cpython/issues/112997}: Stop logging potentially sensitive callback arguments in
@ref{b,,asyncio} unless debug mode is active.

@item 
gh-114914@footnote{https://github.com/python/cpython/issues/114914}: Fix an issue where an abandoned @code{StreamWriter} would not
be garbage collected.

@item 
gh-111358@footnote{https://github.com/python/cpython/issues/111358}: Fix a bug in
@code{asyncio.BaseEventLoop.shutdown_default_executor()} to ensure the
timeout passed to the coroutine behaves as expected.

@item 
gh-115618@footnote{https://github.com/python/cpython/issues/115618}: Fix improper decreasing the reference count for @code{None}
argument in @ref{4b4,,property} methods @ref{1a1d,,getter()},
@ref{1a1e,,setter()} and @ref{1a1f,,deleter()}.

@item 
gh-112720@footnote{https://github.com/python/cpython/issues/112720}: Refactor @code{dis.ArgResolver} to make it possible to
subclass and change the way jump args are interpreted.

@item 
gh-112006@footnote{https://github.com/python/cpython/issues/112006}: Fix @ref{1162,,inspect.unwrap()} for types with the @code{__wrapper__}
data descriptor. Fix @ref{947,,inspect.Signature.from_callable()} for builtins
@ref{48f,,classmethod()} and @ref{451,,staticmethod()}.

@item 
gh-101293@footnote{https://github.com/python/cpython/issues/101293}: Support callables with the @code{__call__()} method and types with
@code{__new__()} and @code{__init__()} methods set to class methods, static
methods, bound methods, partial functions, and other types of methods and
descriptors in @ref{947,,inspect.Signature.from_callable()}.

@item 
gh-103092@footnote{https://github.com/python/cpython/issues/103092}: Isolate @code{_lsprof} (apply 
@geindex Python Enhancement Proposals; PEP 687
PEP 687@footnote{https://peps.python.org/pep-0687/}).

@item 
gh-113942@footnote{https://github.com/python/cpython/issues/113942}: @ref{ba,,pydoc} no longer skips global functions implemented as
builtin methods, such as @code{MethodDescriptorType} and
@code{WrapperDescriptorType}.

@item 
gh-115256@footnote{https://github.com/python/cpython/issues/115256}: Added DeprecationWarning when accessing the tarfile attribute
of TarInfo objects. The attribute is never used internally and is only
attached to TarInfos when the tarfile is opened in write-mode, not
read-mode. The attribute creates an unnecessary reference cycle which may
cause corruption when not closing the handle after writing a tarfile.

@item 
gh-115197@footnote{https://github.com/python/cpython/issues/115197}: @code{urllib.request} no longer resolves the hostname before
checking it against the system’s proxy bypass list on macOS and Windows.

@item 
gh-113812@footnote{https://github.com/python/cpython/issues/113812}: @code{DatagramTransport.sendto()} will now send zero-length
datagrams if called with an empty bytes object. The transport flow control
also now accounts for the datagram header when calculating the buffer
size.

@item 
gh-114763@footnote{https://github.com/python/cpython/issues/114763}: Protect modules loaded with @ref{eb1,,importlib.util.LazyLoader}
from race conditions when multiple threads try to access attributes before
the loading is complete.

@item 
gh-114709@footnote{https://github.com/python/cpython/issues/114709}: @code{posixpath.commonpath()} now raises a @ref{2ee,,ValueError}
exception when passed an empty iterable. Previously, @ref{1741,,IndexError} was
raised.

@code{posixpath.commonpath()} now raises a @ref{199,,TypeError} exception when
passed @code{None}. Previously, @ref{2ee,,ValueError} was raised.

@item 
gh-114610@footnote{https://github.com/python/cpython/issues/114610}: Fix bug where @ref{1a20,,pathlib.PurePath.with_stem()} converted a
non-empty path suffix to a stem when given an empty `stem' argument. It
now raises @ref{2ee,,ValueError}, just like
@ref{199a,,pathlib.PurePath.with_suffix()} does when called on a path with an
empty stem, given a non-empty `suffix' argument.

@item 
gh-107361@footnote{https://github.com/python/cpython/issues/107361}: Add @ref{481,,ssl.VERIFY_X509_PARTIAL_CHAIN} and
@code{VERIFY_X509_STRICT} to the default SSL context created with
@ref{480,,ssl.create_default_context()}.

@item 
gh-112281@footnote{https://github.com/python/cpython/issues/112281}: Allow creating @ref{9cb,,union of types} for
@ref{b3d,,typing.Annotated} with unhashable metadata.

@item 
gh-111775@footnote{https://github.com/python/cpython/issues/111775}: Fix @code{importlib.resources.simple.ResourceHandle.open()} for
text mode, added missed @code{stream} argument.

@item 
gh-90095@footnote{https://github.com/python/cpython/issues/90095}: Make .pdbrc and -c work with any valid pdb commands.

@item 
gh-107625@footnote{https://github.com/python/cpython/issues/107625}: Raise @ref{72a,,configparser.ParsingError} from
@ref{1674,,read()} and
@ref{72b,,read_file()} methods of
@ref{4df,,configparser.ConfigParser} if a key without a corresponding value
is continued (that is, followed by an indented line).

@item 
gh-107155@footnote{https://github.com/python/cpython/issues/107155}: Fix incorrect output of @code{help(x)} where @code{x} is a
@ref{14a9,,lambda} function, which has an @code{__annotations__} dictionary
attribute with a @code{"return"} key.

@item 
gh-57141@footnote{https://github.com/python/cpython/issues/57141}: Add option for `non-shallow' comparisons to
@ref{1146,,filecmp.dircmp} like @ref{1a21,,filecmp.cmp()}. Original patch by Steven
Ward. Enhanced by Tobias Rautenkranz

@item 
gh-69990@footnote{https://github.com/python/cpython/issues/69990}: @code{Profile.print_stats()} has been improved to accept multiple
sort arguments. Patched by Chiu-Hsiang Hsu and Furkan Onder.

@item 
gh-104061@footnote{https://github.com/python/cpython/issues/104061}: Add @code{socket.SO_BINDTOIFINDEX} constant.

@item 
gh-60346@footnote{https://github.com/python/cpython/issues/60346}: Fix ArgumentParser inconsistent with parse_known_args.

@item 
gh-102389@footnote{https://github.com/python/cpython/issues/102389}: Add @code{windows_31j} to aliases for @code{cp932} codec

@item 
gh-72249@footnote{https://github.com/python/cpython/issues/72249}: Always include the @ref{1a22,,module} name in the @ref{1c3,,repr()} of
@ref{219,,functools.partial()} objects.  Patch by Furkan Onder and Anilyka
Barry.

@item 
gh-100985@footnote{https://github.com/python/cpython/issues/100985}: Update HTTPSConnection to consistently wrap IPv6 Addresses when
using a proxy.

@item 
gh-100884@footnote{https://github.com/python/cpython/issues/100884}: email: fix misfolding of comma in address-lists over multiple
lines in combination with unicode encoding.

@item 
gh-95782@footnote{https://github.com/python/cpython/issues/95782}: Fix @code{io.BufferedReader.tell()},
@code{io.BufferedReader.seek()}, @code{_pyio.BufferedReader.tell()},
@code{io.BufferedRandom.tell()}, @code{io.BufferedRandom.seek()} and
@code{_pyio.BufferedRandom.tell()} being able to return negative offsets.

@item 
gh-96310@footnote{https://github.com/python/cpython/issues/96310}: Fix a traceback in @ref{7,,argparse} when all options in a
mutually exclusive group are suppressed.

@item 
gh-93205@footnote{https://github.com/python/cpython/issues/93205}: Fixed a bug in
@ref{1167,,logging.handlers.TimedRotatingFileHandler} where multiple rotating
handler instances pointing to files with the same name but different
extensions would conflict and not delete the correct files.

@item 
bpo-31116@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31116}: Add Z85 encoding to @code{base64}.

@item 
bpo-44865@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44865}: Add missing call to localization function in @ref{7,,argparse}.

@item 
bpo-43952@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43952}: Fix @ref{1a23,,multiprocessing.connection.Listener.accept()} to
accept empty bytes as authkey. Not accepting empty bytes as key causes it
to hang indefinitely.

@item 
bpo-42125@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42125}: linecache: get module name from @code{__spec__} if available. This
allows getting source code for the @code{__main__} module when a custom
loader is used.

@item 
bpo-41122@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41122}: Failing to pass arguments properly to
@ref{be9,,functools.singledispatchmethod()} now throws a TypeError instead of
hitting an index out of bounds internally.

@item 
bpo-40818@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40818}: The asyncio REPL now runs @ref{11ce,,sys.__interactivehook__} on
startup. The default implementation of @code{sys.__interactivehook__}
provides auto-completion to the asyncio REPL. Patch contributed by Rémi
Lapeyre.

@item 
bpo-33775@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33775}: Add ‘default’ and ‘version’ help text for localization in
argparse.
@end itemize

@node Documentation<20>,Tests<19>,Library<64>,Python 3 13 0 alpha 5
@anchor{whatsnew/changelog id268}@anchor{1a24}
@subsubsection Documentation



@itemize -

@item 
gh-115399@footnote{https://github.com/python/cpython/issues/115399}: Document 
@geindex Common Vulnerabilities and Exposures; CVE 2023-52425
CVE 2023-52425@footnote{https://www.cve.org/CVERecord?id=CVE-2023-52425} of Expat <2.6.0 under “XML
vulnerabilities”.

@item 
gh-109653@footnote{https://github.com/python/cpython/issues/109653}: Improve import time of @ref{117,,uuid} on Linux.
@end itemize

@node Tests<19>,Build<22>,Documentation<20>,Python 3 13 0 alpha 5
@anchor{whatsnew/changelog id269}@anchor{1a25}
@subsubsection Tests



@itemize -

@item 
gh-71052@footnote{https://github.com/python/cpython/issues/71052}: Add test exclusions to support running the test suite on
Android.

@item 
gh-71052@footnote{https://github.com/python/cpython/issues/71052}: Enable @code{test_concurrent_futures} on platforms that support
threading but not multiprocessing.

@item 
gh-115796@footnote{https://github.com/python/cpython/issues/115796}: Make ‘_testinternalcapi.assemble_code_object’ construct the
exception table for the code object.

@item 
gh-115720@footnote{https://github.com/python/cpython/issues/115720}: Leak tests (@code{-R}, @code{--huntrleaks}) now show a summary of the
number of leaks found in each iteration.

@item 
gh-115122@footnote{https://github.com/python/cpython/issues/115122}: Add @code{--bisect} option to regrtest test runner: run failed
tests with @code{test.bisect_cmd} to identify failing tests. Patch by Victor
Stinner.

@item 
gh-115596@footnote{https://github.com/python/cpython/issues/115596}: Fix @code{ProgramPriorityTests} in @code{test_os} permanently
changing the process priority.

@item 
gh-115556@footnote{https://github.com/python/cpython/issues/115556}: On Windows, commas passed in arguments to
@code{Tools\buildbot\test.bat} and @code{PCbuild\\rt.bat} are now properly
handled.

@item 
gh-115420@footnote{https://github.com/python/cpython/issues/115420}: Fix translation of exception handler targets by
@code{_testinternalcapi.optimize_cfg}.

@item 
gh-115376@footnote{https://github.com/python/cpython/issues/115376}: Fix segfault in @code{_testinternalcapi.compiler_codegen} on bad
input.
@end itemize

@node Build<22>,Windows<19>,Tests<19>,Python 3 13 0 alpha 5
@anchor{whatsnew/changelog id270}@anchor{1a26}
@subsubsection Build



@itemize -

@item 
gh-116313@footnote{https://github.com/python/cpython/issues/116313}: Get WASI builds to work under wasmtime 18 w/ WASI 0.2/preview2
primitives.

@item 
gh-71052@footnote{https://github.com/python/cpython/issues/71052}: Change Android’s @ref{293,,sys.platform} from @code{"linux"} to
@code{"android"}.

@item 
gh-116117@footnote{https://github.com/python/cpython/issues/116117}: Backport @code{libb2}’s PR #42 to fix compiling CPython on 32-bit
Windows with @code{clang-cl}.

@item 
gh-71052@footnote{https://github.com/python/cpython/issues/71052}: Fix several Android build issues

@item 
gh-114099@footnote{https://github.com/python/cpython/issues/114099}: A testbed project was added to run the test suite on iOS.

@item 
gh-115350@footnote{https://github.com/python/cpython/issues/115350}: Fix building ctypes module with -DWIN32_LEAN_AND_MEAN defined

@item 
gh-111225@footnote{https://github.com/python/cpython/issues/111225}: Link extension modules against libpython on Android.

@item 
gh-115737@footnote{https://github.com/python/cpython/issues/115737}: The install name for libPython is now correctly set for
non-framework macOS builds.

@item 
gh-114099@footnote{https://github.com/python/cpython/issues/114099}: Makefile targets were added to support compiling an
iOS-compatible framework build.
@end itemize

@node Windows<19>,macOS<13>,Build<22>,Python 3 13 0 alpha 5
@anchor{whatsnew/changelog id271}@anchor{1a27}
@subsubsection Windows



@itemize -

@item 
gh-116012@footnote{https://github.com/python/cpython/issues/116012}: Ensure the value of @code{GetLastError()} is preserved across GIL
operations.

@item 
gh-115582@footnote{https://github.com/python/cpython/issues/115582}: Building extensions intended for free-threaded builds of
CPython now require compiling with @code{/DPy_GIL_DISABLED} manually when
using a regular install. This is expected to change in future releases.

@item 
gh-115554@footnote{https://github.com/python/cpython/issues/115554}: The installer now has more strict rules about updating the
@ref{7db,,Python install manager}. In general, most users only have a single launcher
installed and will see no difference. When multiple launchers have been
installed, the option to install the launcher is disabled until all but
one have been removed. Downgrading the launcher (which was never allowed)
is now more obviously blocked.

@item 
gh-115543@footnote{https://github.com/python/cpython/issues/115543}: @ref{7db,,Python install manager} can now detect Python 3.13 when installed from
the Microsoft Store, and will install Python 3.12 by default when
@geindex PYLAUNCHER_ALLOW_INSTALL
@geindex environment variable; PYLAUNCHER_ALLOW_INSTALL
@code{PYLAUNCHER_ALLOW_INSTALL} is set.
@end itemize

@node macOS<13>,IDLE<10>,Windows<19>,Python 3 13 0 alpha 5
@anchor{whatsnew/changelog id272}@anchor{1a28}
@subsubsection macOS



@itemize -

@item 
gh-116145@footnote{https://github.com/python/cpython/issues/116145}: Update macOS installer to Tcl/Tk 8.6.14.
@end itemize

@node IDLE<10>,Tools/Demos<16>,macOS<13>,Python 3 13 0 alpha 5
@anchor{whatsnew/changelog id273}@anchor{1a29}
@subsubsection IDLE



@itemize -

@item 
gh-88516@footnote{https://github.com/python/cpython/issues/88516}: On macOS show a proxy icon in the title bar of editor windows to
match platform behaviour.
@end itemize

@node Tools/Demos<16>,C API<21>,IDLE<10>,Python 3 13 0 alpha 5
@anchor{whatsnew/changelog id274}@anchor{1a2a}
@subsubsection Tools/Demos



@itemize -

@item 
gh-100176@footnote{https://github.com/python/cpython/issues/100176}: Remove outdated Tools/@{io,cc,string@}bench

@item 
bpo-45101@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45101}: Add consistency in usage message IO between 2 versions of
python-config.
@end itemize

@node C API<21>,,Tools/Demos<16>,Python 3 13 0 alpha 5
@anchor{whatsnew/changelog id275}@anchor{1a2b}
@subsubsection C API



@itemize -

@item 
gh-114626@footnote{https://github.com/python/cpython/issues/114626}: Add again @code{_PyCFunctionFastWithKeywords} name, removed in
Python 3.13 alpha 4 by mistake.  Keep the old private
@code{_PyCFunctionFastWithKeywords} name (Python 3.7) as an alias to the new
public name @code{PyCFunctionFastWithKeywords} (Python 3.13a4). Patch by
Victor Stinner.

@item 
gh-111418@footnote{https://github.com/python/cpython/issues/111418}: Add @ref{1a2c,,PyHASH_MODULUS}, @ref{1a2d,,PyHASH_BITS},
@ref{1a2e,,PyHASH_INF} and @ref{1a2f,,PyHASH_IMAG} C macros.  Patch by
Sergey B Kirpichev.
@end itemize

@node Python 3 13 0 alpha 4,Python 3 13 0 alpha 3,Python 3 13 0 alpha 5,Changelog
@anchor{whatsnew/changelog python-3-13-0-alpha-4}@anchor{1a30}
@subsection Python 3.13.0 alpha 4


`Release date: 2024-02-15'

@menu
* Security: Security<23>. 
* Core and Builtins: Core and Builtins<60>. 
* Library: Library<65>. 
* Documentation: Documentation<21>. 
* Tests: Tests<20>. 
* Build: Build<23>. 
* Windows: Windows<20>. 
* macOS: macOS<14>. 
* IDLE: IDLE<11>. 
* Tools/Demos: Tools/Demos<17>. 
* C API: C API<22>. 

@end menu

@node Security<23>,Core and Builtins<60>,,Python 3 13 0 alpha 4
@anchor{whatsnew/changelog id276}@anchor{1a31}
@subsubsection Security



@itemize -

@item 
gh-115399@footnote{https://github.com/python/cpython/issues/115399}: Update bundled libexpat to 2.6.0

@item 
gh-115243@footnote{https://github.com/python/cpython/issues/115243}: Fix possible crashes in @ref{fd6,,collections.deque.index()} when
the deque is concurrently modified.
@end itemize

@node Core and Builtins<60>,Library<65>,Security<23>,Python 3 13 0 alpha 4
@anchor{whatsnew/changelog id277}@anchor{1a32}
@subsubsection Core and Builtins



@itemize -

@item 
gh-112087@footnote{https://github.com/python/cpython/issues/112087}: For an empty reverse iterator for list will be reduced to
@ref{a6b,,reversed()}. Patch by Donghee Na

@item 
gh-114570@footnote{https://github.com/python/cpython/issues/114570}: Add @ref{479,,PythonFinalizationError} exception. This exception
derived from @ref{246,,RuntimeError} is raised when an operation is blocked
during the @ref{47a,,Python finalization}. Patch by
Victor Stinner.

@item 
gh-114695@footnote{https://github.com/python/cpython/issues/114695}: Add @ref{362,,sys._clear_internal_caches()}, which clears all
internal performance-related caches (and deprecate the less-general
@ref{294,,sys._clear_type_cache()} function).

@item 
gh-114828@footnote{https://github.com/python/cpython/issues/114828}: Fix compilation crashes in uncommon code examples using
@ref{1a7,,super()} inside a comprehension in a class body.

@item 
gh-112069@footnote{https://github.com/python/cpython/issues/112069}: Adapt @ref{185,,set} and @ref{7f3,,frozenset} methods to Argument
Clinic.

@item 
gh-115011@footnote{https://github.com/python/cpython/issues/115011}: Setters for members with an unsigned integer type now support
the same range of valid values for objects that has a
@ref{19f,,__index__()} method as for @ref{19c,,int}.

@item 
gh-114887@footnote{https://github.com/python/cpython/issues/114887}: Changed socket type validation in
@ref{941,,create_datagram_endpoint()} to accept all non-stream
sockets. This fixes a regression in compatibility with raw sockets.

@item 
gh-114944@footnote{https://github.com/python/cpython/issues/114944}: Fixes a race between @code{PyParkingLot_Park} and
@code{_PyParkingLot_UnparkAll}.

@item 
gh-113462@footnote{https://github.com/python/cpython/issues/113462}: Limit the number of versions that a single class can use.
Prevents a few wayward classes using up all the version numbers.

@item 
gh-76763@footnote{https://github.com/python/cpython/issues/76763}: The @ref{1a33,,chr()} builtin function now always raises
@ref{2ee,,ValueError} for values outside the valid range. Previously it raised
@ref{a87,,OverflowError} for very large or small values.

@item 
gh-114806@footnote{https://github.com/python/cpython/issues/114806}: No longer specialize calls to classes, if those classes have
metaclasses. Fixes bug where the @code{__call__} method of the metaclass was
not being called.

@item 
gh-107944@footnote{https://github.com/python/cpython/issues/107944}: Improve error message for function calls with bad keyword
arguments via getargs

@item 
gh-112529@footnote{https://github.com/python/cpython/issues/112529}: The free-threaded build no longer allocates space for the
@code{PyGC_Head} structure in objects that support cyclic garbage collection.
A number of other fields and data structures are used as replacements,
including @code{ob_gc_bits}, @code{ob_tid}, and mimalloc internal data
structures.

@item 
gh-114456@footnote{https://github.com/python/cpython/issues/114456}: Lower the recursion limit under a debug build of WASI.

@item 
gh-114083@footnote{https://github.com/python/cpython/issues/114083}: Compiler applies folding of LOAD_CONST with following
instruction in a separate pass before other optimisations. This enables
jump threading in certain circumstances.

@item 
gh-114388@footnote{https://github.com/python/cpython/issues/114388}: Fix a @ref{4d8,,RuntimeWarning} emitted when assign an integer-like
value that is not an instance of @ref{19c,,int} to an attribute that
corresponds to a C struct member of @ref{1a34,,type} T_UINT
and T_ULONG. Fix a double @code{RuntimeWarning} emitted when assign a
negative integer value to an attribute that corresponds to a C struct
member of type T_UINT.

@item 
gh-114265@footnote{https://github.com/python/cpython/issues/114265}: Compiler propagates line numbers before optimization, leading
to more optimization opportunities and removing the need for the
@code{guarantee_lineno_for_exits} hack.

@item 
gh-112529@footnote{https://github.com/python/cpython/issues/112529}: The free-threaded build now has its own thread-safe GC
implementation that uses mimalloc to find GC tracked objects. It is
non-generational, unlike the existing GC implementation.

@item 
gh-114050@footnote{https://github.com/python/cpython/issues/114050}: Fix segmentation fault caused by an incorrect format string in
@code{TypeError} exception when more than two arguments are passed to
@code{int}.

@item 
gh-112354@footnote{https://github.com/python/cpython/issues/112354}: The @code{END_FOR} instruction now pops only one value. This is to
better support side exits in loops.

@item 
gh-113884@footnote{https://github.com/python/cpython/issues/113884}: Make @ref{d67,,queue.SimpleQueue} thread safe when the GIL is
disabled.

@item 
gh-114058@footnote{https://github.com/python/cpython/issues/114058}: Implement the foundations of the Tier 2 redundancy eliminator.

@item 
gh-113939@footnote{https://github.com/python/cpython/issues/113939}: frame.clear(): Clear frame.f_locals as well, and not only the
fast locals. This is relevant once frame.f_locals was accessed, which
would contain also references to all the locals.

@item 
gh-112050@footnote{https://github.com/python/cpython/issues/112050}: Convert @ref{7f5,,collections.deque} to use Argument Clinic.

@item 
gh-112050@footnote{https://github.com/python/cpython/issues/112050}: Make methods on @ref{7f5,,collections.deque} thread-safe when the
GIL is disabled.

@item 
gh-113464@footnote{https://github.com/python/cpython/issues/113464}: Add an option (@code{--enable-experimental-jit} for
@code{configure}-based builds or @code{--experimental-jit} for @code{PCbuild}-based
ones) to build an `experimental' just-in-time compiler, based on
copy-and-patch@footnote{https://fredrikbk.com/publications/copy-and-patch.pdf}

@item 
gh-113055@footnote{https://github.com/python/cpython/issues/113055}: Make interp->obmalloc a pointer. For interpreters that share
state with the main interpreter, this points to the same static memory
structure. For interpreters with their own obmalloc state, it is heap
allocated. Add free_obmalloc_arenas() which will free the obmalloc arenas
and radix tree structures for interpreters with their own obmalloc state.

@item 
gh-55664@footnote{https://github.com/python/cpython/issues/55664}: Add warning when creating @ref{f4a,,type} using a namespace
dictionary with non-string keys. Patched by Daniel Urban and Furkan Onder.

@item 
gh-104530@footnote{https://github.com/python/cpython/issues/104530}: Use native Win32 condition variables.
@end itemize

@node Library<65>,Documentation<21>,Core and Builtins<60>,Python 3 13 0 alpha 4
@anchor{whatsnew/changelog id278}@anchor{1a35}
@subsubsection Library



@itemize -

@item 
gh-115392@footnote{https://github.com/python/cpython/issues/115392}: Fix a bug in @ref{3e,,doctest} where incorrect line numbers would
be reported for decorated functions.

@item 
gh-114563@footnote{https://github.com/python/cpython/issues/114563}: Fix several @ref{19a,,format()} bugs when using the C implementation
of @ref{200,,Decimal}: * memory leak in some rare cases when using
the @code{z} format option (coerce negative 0) * incorrect output when
applying the @code{z} format option to type @code{F} (fixed-point with capital
@code{NAN} / @code{INF}) * incorrect output when applying the @code{#} format
option (alternate form)

@item 
gh-102840@footnote{https://github.com/python/cpython/issues/102840}: Fix confused traceback when floordiv, mod, or divmod operations
happens between instances of @ref{215,,fractions.Fraction} and
@ref{198,,complex}.

@item 
gh-115165@footnote{https://github.com/python/cpython/issues/115165}: Most exceptions are now ignored when attempting to set the
@code{__orig_class__} attribute on objects returned when calling
@ref{10b,,typing} generic aliases (including generic aliases created using
@ref{b3d,,typing.Annotated}). Previously only @ref{5f0,,AttributeError} was
ignored. Patch by Dave Shawley.

@item 
gh-112903@footnote{https://github.com/python/cpython/issues/112903}: Fix “issubclass() arg 1 must be a class” errors in certain
cases of multiple inheritance with generic aliases (regression in early
3.13 alpha releases).

@item 
gh-115133@footnote{https://github.com/python/cpython/issues/115133}: Fix tests for @ref{11f9,,XMLPullParser}
with Expat 2.6.0.

@item 
gh-115059@footnote{https://github.com/python/cpython/issues/115059}: @code{io.BufferedRandom.read1()} now flushes the underlying
write buffer.

@item 
gh-79382@footnote{https://github.com/python/cpython/issues/79382}: Trailing @code{**} no longer allows to match files and non-existing
paths in recursive @ref{5a0,,glob()}.

@item 
gh-67837@footnote{https://github.com/python/cpython/issues/67837}: Avoid race conditions in the creation of directories during
concurrent extraction in @ref{e4,,tarfile} and @ref{138,,zipfile}.

@item 
gh-115060@footnote{https://github.com/python/cpython/issues/115060}: Speed up @ref{538,,pathlib.Path.glob()} by removing redundant regex
matching.

@item 
gh-97928@footnote{https://github.com/python/cpython/issues/97928}: Partially revert the behavior of @ref{1a36,,tkinter.Text.count()}. By
default it preserves the behavior of older Python versions, except that
setting @code{wantobjects} to 0 no longer has effect. Add a new parameter
`return_ints': specifying @code{return_ints=True} makes @code{Text.count()}
always returning the single count as an integer instead of a 1-tuple or
@code{None}.

@item 
gh-114628@footnote{https://github.com/python/cpython/issues/114628}: When csv.Error is raised when handling TypeError, do not print
the TypeError traceback.

@item 
gh-85984@footnote{https://github.com/python/cpython/issues/85984}: Added @code{_POSIX_VDISABLE} from C’s @code{<unistd.h>} to
@ref{e7,,termios}.

@item 
gh-114965@footnote{https://github.com/python/cpython/issues/114965}: Update bundled pip to 24.0

@item 
gh-114959@footnote{https://github.com/python/cpython/issues/114959}: @ref{e4,,tarfile} no longer ignores errors when trying to extract
a directory on top of a file.

@item 
gh-114894@footnote{https://github.com/python/cpython/issues/114894}: Add @ref{4c1,,array.array.clear()}.

@item 
gh-114071@footnote{https://github.com/python/cpython/issues/114071}: Support tuple subclasses using auto() for enum member value.

@item 
gh-109475@footnote{https://github.com/python/cpython/issues/109475}: Fix support of explicit option value “–” in @ref{7,,argparse}
(e.g. @code{--option=--}).

@item 
gh-49766@footnote{https://github.com/python/cpython/issues/49766}: Fix @ref{1fc,,date}-@ref{4e3,,datetime}
comparison. Now the special comparison methods like @code{__eq__} and
@code{__lt__} return @ref{1a3,,NotImplemented} if one of comparands is
@code{date} and other is @code{datetime} instead of ignoring the
time part and the time zone or forcefully return “not equal” or raise
@ref{199,,TypeError}. It makes comparison of @code{date} and
@code{datetime} subclasses more symmetric and allows to change the
default behavior by overriding the special comparison methods in
subclasses.

@item 
gh-110190@footnote{https://github.com/python/cpython/issues/110190}: Fix ctypes structs with array on Windows ARM64 platform by
setting @code{MAX_STRUCT_SIZE} to 32 in stgdict. Patch by Diego Russo

@item 
gh-114678@footnote{https://github.com/python/cpython/issues/114678}: Ensure that deprecation warning for ‘N’ specifier in
@ref{200,,Decimal} format is not raised for cases where ‘N’ appears
in other places in the format specifier. Based on patch by Stefan Krah.

@item 
gh-70303@footnote{https://github.com/python/cpython/issues/70303}: Return both files and directories from @ref{538,,pathlib.Path.glob()}
if a pattern ends with “@code{**}”. Previously only directories were
returned.

@item 
gh-109653@footnote{https://github.com/python/cpython/issues/109653}: Improve import time of @ref{7e,,importlib.metadata} and
@ref{54,,email.utils}.

@item 
gh-113280@footnote{https://github.com/python/cpython/issues/113280}: Fix a leak of open socket in rare cases when error occurred in
@ref{aed,,ssl.SSLSocket} creation.

@item 
gh-77749@footnote{https://github.com/python/cpython/issues/77749}: @ref{1a37,,email.policy.EmailPolicy.fold()} now always encodes
non-ASCII characters in headers if @ref{fff,,utf8}
is false.

@item 
gh-83383@footnote{https://github.com/python/cpython/issues/83383}: Synchronization of the @ref{36,,dbm.dumb} database is now no-op if
there was no modification since opening or last synchronization. The
directory file for a newly created empty @code{dbm.dumb} database is now
created immediately after opening instead of deferring this until
synchronizing or closing.

@item 
gh-91602@footnote{https://github.com/python/cpython/issues/91602}: Add `filter' keyword-only parameter to
@ref{550,,sqlite3.Connection.iterdump()} for filtering database objects to
dump. Patch by Mariusz Felisiak.

@item 
gh-112451@footnote{https://github.com/python/cpython/issues/112451}: Prohibit subclassing pure-Python @ref{12cb,,datetime.timezone}.
This is consistent with C-extension implementation. Patch by Mariusz
Felisiak.

@item 
gh-69893@footnote{https://github.com/python/cpython/issues/69893}: Add the @code{close()} method for the iterator returned by
@ref{57a,,xml.etree.ElementTree.iterparse()}.

@item 
gh-109653@footnote{https://github.com/python/cpython/issues/109653}: Reduce the import time of @ref{f3,,threading} module by ~50%.
Patch by Daniel Hollas.

@item 
gh-114492@footnote{https://github.com/python/cpython/issues/114492}: Make the result of @ref{1a38,,termios.tcgetattr()} reproducible on
Alpine Linux. Previously it could leave a random garbage in some fields.

@item 
gh-114315@footnote{https://github.com/python/cpython/issues/114315}: Make @ref{1a39,,threading.Lock} a real class, not a factory
function. Add @code{__new__} to @code{_thread.lock} type.

@item 
gh-100414@footnote{https://github.com/python/cpython/issues/100414}: Add @ref{39,,dbm.sqlite3} as a backend to @ref{35,,dbm}, and make it
the new default @code{dbm} backend. Patch by Raymond Hettinger and Erlend
E. Aasland.

@item 
gh-113267@footnote{https://github.com/python/cpython/issues/113267}: Revert changes in gh-106584@footnote{https://github.com/python/cpython/issues/106584} which made calls of
@code{TestResult} methods @code{startTest()} and @code{stopTest()} unbalanced.

@item 
gh-75128@footnote{https://github.com/python/cpython/issues/75128}: Ignore an @ref{2c2,,OSError} in
@code{asyncio.BaseEventLoop.create_server()} when IPv6 is available but the
interface cannot actually support it.

@item 
gh-114423@footnote{https://github.com/python/cpython/issues/114423}: @code{_DummyThread} entries in @code{threading._active} are now
automatically removed when the related thread dies.

@item 
gh-114257@footnote{https://github.com/python/cpython/issues/114257}: Dismiss the @code{FileNotFound} error in
@ref{f4b,,ctypes.util.find_library()} and just return @code{None} on Linux.

@item 
gh-114321@footnote{https://github.com/python/cpython/issues/114321}: Expose more platform specific constants in the @ref{5d,,fcntl}
module on Linux, macOS, FreeBSD and NetBSD.

@item 
gh-114328@footnote{https://github.com/python/cpython/issues/114328}: The @ref{1a3a,,tty.setcbreak()} and new @ref{1a3b,,tty.cfmakecbreak()} no
longer clears the terminal input ICRLF flag. This fixes a regression
introduced in 3.12 that no longer matched how OSes define cbreak mode in
their @code{stty(1)} manual pages.

@item 
gh-114281@footnote{https://github.com/python/cpython/issues/114281}: Remove type hints from @code{Lib/asyncio/staggered.py}. The
annotations in the typeshed@footnote{https://github.com/python/typeshed}
project should be used instead.

@item 
gh-101438@footnote{https://github.com/python/cpython/issues/101438}: Avoid reference cycle in ElementTree.iterparse. The iterator
returned by @code{ElementTree.iterparse} may hold on to a file descriptor.
The reference cycle prevented prompt clean-up of the file descriptor if
the returned iterator was not exhausted.

@item 
gh-114198@footnote{https://github.com/python/cpython/issues/114198}: The signature for the @code{__replace__} method on
@ref{33,,dataclasses} now has the first argument named @code{self}, rather than
@code{obj}.

@item 
gh-104522@footnote{https://github.com/python/cpython/issues/104522}: @ref{2c2,,OSError} raised when run a subprocess now only has
`filename' attribute set to `cwd' if the error was caused by a failed
attempt to change the current directory.

@item 
gh-114149@footnote{https://github.com/python/cpython/issues/114149}: Enum: correctly handle tuple subclasses in custom @code{__new__}.

@item 
gh-83648@footnote{https://github.com/python/cpython/issues/83648}: Support deprecation of options, positional arguments and
subcommands in @ref{7,,argparse}.

@item 
gh-114087@footnote{https://github.com/python/cpython/issues/114087}: Speed up @code{dataclasses.asdict} up to 1.35x.

@item 
gh-109534@footnote{https://github.com/python/cpython/issues/109534}: Fix a reference leak in
@code{asyncio.selector_events.BaseSelectorEventLoop} when SSL handshakes
fail. Patch contributed by Jamie Phan.

@item 
gh-79634@footnote{https://github.com/python/cpython/issues/79634}: Accept @ref{5a1,,path-like objects} as patterns
in @ref{538,,pathlib.Path.glob()} and @ref{539,,rglob()}.

@item 
gh-112202@footnote{https://github.com/python/cpython/issues/112202}: Ensure that a @ref{1a3c,,asyncio.Condition.notify()} call does not
get lost if the awakened @code{Task} is simultaneously cancelled or
encounters any other error.

@item 
gh-113951@footnote{https://github.com/python/cpython/issues/113951}: Fix the behavior of @code{tag_unbind()} methods of
@ref{1a3d,,tkinter.Text} and @ref{1a3e,,tkinter.Canvas} classes with three
arguments. Previously, @code{widget.tag_unbind(tag, sequence, funcid)}
destroyed the current binding for `sequence', leaving `sequence' unbound,
and deleted the `funcid' command. Now it removes only `funcid' from the
binding for `sequence', keeping other commands, and deletes the `funcid'
command. It leaves `sequence' unbound only if `funcid' was the last bound
command.

@item 
gh-97959@footnote{https://github.com/python/cpython/issues/97959}: Fix rendering class methods, bound methods, method and function
aliases in @ref{ba,,pydoc}. Class methods no longer have “method of
builtins.type instance” note. Corresponding notes are now added for class
and unbound methods. Method and function aliases now have references to
the module or the class where the origin was defined if it differs from
the current. Bound methods are now listed in the static methods section.
Methods of builtin classes are now supported as well as methods of Python
classes.

@item 
gh-113796@footnote{https://github.com/python/cpython/issues/113796}: Add more validation checks in the @ref{1871,,csv.Dialect}
constructor. @ref{2ee,,ValueError} is now raised if the same character is used
in different roles.

@item 
gh-113732@footnote{https://github.com/python/cpython/issues/113732}: Fix support of @ref{6ad,,QUOTE_NOTNULL} and
@ref{6ae,,QUOTE_STRINGS} in @ref{6af,,csv.reader()}.

@item 
gh-113225@footnote{https://github.com/python/cpython/issues/113225}: Speed up @ref{6d0,,pathlib.Path.walk()} by using
@ref{1a3f,,os.DirEntry.path} where possible.

@item 
gh-89039@footnote{https://github.com/python/cpython/issues/89039}: When replace() method is called on a subclass of datetime, date
or time, properly call derived constructor. Previously, only the base
class’s constructor was called.

Also, make sure to pass non-zero fold values when creating subclasses in
various methods. Previously, fold was silently ignored.

@item 
gh-112919@footnote{https://github.com/python/cpython/issues/112919}: Speed-up @ref{16d7,,datetime.datetime.replace()},
@ref{1a40,,datetime.date.replace()} and @ref{1a41,,datetime.time.replace()}.

@item 
gh-59013@footnote{https://github.com/python/cpython/issues/59013}: Set breakpoint on the first executable line of the function,
instead of the line of function definition when the user do @code{break func}
using @ref{aa,,pdb}

@item 
gh-112343@footnote{https://github.com/python/cpython/issues/112343}: Improve handling of pdb convenience variables to avoid
replacing string contents.

@item 
gh-112240@footnote{https://github.com/python/cpython/issues/112240}: Add option to calendar module CLI to specify the weekday to
start each week. Patch by Steven Ward.

@item 
gh-111741@footnote{https://github.com/python/cpython/issues/111741}: Recognise @code{image/webp} as a standard format in the
@ref{93,,mimetypes} module.

@item 
gh-43457@footnote{https://github.com/python/cpython/issues/43457}: Fix the @ref{f6,,tkinter} widget method @code{wm_attributes()}. It
now accepts the attribute name without the minus prefix to get window
attributes and allows to specify attributes and values to set as keyword
arguments. Add new optional keyword argument `return_python_dict': calling
@code{w.wm_attributes(return_python_dict=True)} returns the attributes as a
dict instead of a tuple. Calling @code{w.wm_attributes()} now returns a tuple
instead of string if `wantobjects' was set to 0.

@item 
gh-82626@footnote{https://github.com/python/cpython/issues/82626}: Many functions now emit a warning if a boolean value is passed
as a file descriptor argument.

@item 
gh-111051@footnote{https://github.com/python/cpython/issues/111051}: Added check for file modification during debugging with
@ref{aa,,pdb}

@item 
gh-110345@footnote{https://github.com/python/cpython/issues/110345}: Show the Tcl/Tk patchlevel (rather than version) in
@code{tkinter._test()}.

@item 
gh-38807@footnote{https://github.com/python/cpython/issues/38807}: Fix race condition in @ref{104,,trace}. Instead of checking if a
directory exists and creating it, directly call @ref{52d,,os.makedirs()} with
the kwarg @code{exist_ok=True}.

@item 
gh-75705@footnote{https://github.com/python/cpython/issues/75705}: Set unixfrom envelope in @ref{1a42,,mailbox.mbox} and
@ref{1a43,,mailbox.MMDF}.

@item 
gh-106233@footnote{https://github.com/python/cpython/issues/106233}: Fix stacklevel in @code{InvalidTZPathWarning} during
@ref{13b,,zoneinfo} module import.

@item 
gh-105102@footnote{https://github.com/python/cpython/issues/105102}: Allow @ref{1e8,,ctypes.Union} to be nested in
@ref{1e7,,ctypes.Structure} when the system endianness is the opposite of
the classes.

@item 
gh-104282@footnote{https://github.com/python/cpython/issues/104282}: Fix null pointer dereference in
@code{lzma._decode_filter_properties()} due to improper handling of BCJ
filters with properties of zero length. Patch by Radislav Chugunov.

@item 
gh-96471@footnote{https://github.com/python/cpython/issues/96471}: Add @ref{15a0,,queue.Queue} termination with
@ref{543,,shutdown()}.

@item 
gh-101599@footnote{https://github.com/python/cpython/issues/101599}: Changed argparse flag options formatting to remove redundancy.

@item 
gh-85984@footnote{https://github.com/python/cpython/issues/85984}: Add POSIX pseudo-terminal functions @ref{1a44,,os.posix_openpt()},
@ref{1a45,,os.grantpt()}, @ref{1a46,,os.unlockpt()}, and @ref{1a47,,os.ptsname()}.

@item 
gh-102512@footnote{https://github.com/python/cpython/issues/102512}: When @ref{4b6,,os.fork()} is called from a foreign thread (aka
@code{_DummyThread}), the type of the thread in a child process is changed to
@code{_MainThread}. Also changed its name and daemonic status, it can be now
joined.

@item 
gh-88569@footnote{https://github.com/python/cpython/issues/88569}: Add @ref{329,,os.path.isreserved()}, which identifies reserved
pathnames such as “NUL”, “AUX” and “CON”. This function is only available
on Windows.

Deprecate @ref{328,,pathlib.PurePath.is_reserved()}.

@item 
bpo-38364@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38364}: The @code{inspect} functions @code{isgeneratorfunction},
@code{iscoroutinefunction}, @code{isasyncgenfunction} now support
@code{functools.partialmethod} wrapped functions the same way they support
@code{functools.partial}.
@end itemize

@node Documentation<21>,Tests<20>,Library<65>,Python 3 13 0 alpha 4
@anchor{whatsnew/changelog id279}@anchor{1a48}
@subsubsection Documentation



@itemize -

@item 
gh-115233@footnote{https://github.com/python/cpython/issues/115233}: Fix an example for @ref{1501,,LoggerAdapter} in the
Logging Cookbook.

@item 
gh-114123@footnote{https://github.com/python/cpython/issues/114123}: Move the @ref{2d,,csv} module docstring to the @code{csv} module
instead of reexporting it from the internal @code{_csv} module, and
remove @code{__doc__} from @code{csv.__all__}.

Move @code{csv.__version__} to the @code{csv} module instead of
reexporting it from the internal @code{_csv} module, and remove
@code{__version__} from @code{csv.__all__}.
@end itemize

@node Tests<20>,Build<23>,Documentation<21>,Python 3 13 0 alpha 4
@anchor{whatsnew/changelog id280}@anchor{1a49}
@subsubsection Tests



@itemize -

@item 
gh-114099@footnote{https://github.com/python/cpython/issues/114099}: Added test exclusions required to run the test suite on iOS.

@item 
gh-105089@footnote{https://github.com/python/cpython/issues/105089}: Fix
@code{test.test_zipfile.test_core.TestWithDirectory.test_create_directory_with_write}
test in AIX by doing a bitwise AND of 0xFFFF on mode , so that it will be
in sync with @code{zinfo.external_attr}
@end itemize

@node Build<23>,Windows<20>,Tests<20>,Python 3 13 0 alpha 4
@anchor{whatsnew/changelog id281}@anchor{1a4a}
@subsubsection Build



@itemize -

@item 
gh-115167@footnote{https://github.com/python/cpython/issues/115167}: Avoid vendoring @code{vcruntime140_threads.dll} when building with
Visual Studio 2022 version 17.8.

@item 
gh-113632@footnote{https://github.com/python/cpython/issues/113632}: Promote WASI to a tier 2 platform and drop Emscripten from tier
3 in configure.ac.

@item 
gh-114099@footnote{https://github.com/python/cpython/issues/114099}: configure and Makefile were refactored to accommodate framework
builds on Apple platforms other than macOS.

@item 
gh-114875@footnote{https://github.com/python/cpython/issues/114875}: Add @code{getgrent()} as a prerequisite for building the
@ref{6a,,grp} module.
@end itemize

@node Windows<20>,macOS<14>,Build<23>,Python 3 13 0 alpha 4
@anchor{whatsnew/changelog id282}@anchor{1a4b}
@subsubsection Windows



@itemize -

@item 
gh-115049@footnote{https://github.com/python/cpython/issues/115049}: Fixes @code{py.exe} launcher failing when run as users without
user profiles.

@item 
gh-115009@footnote{https://github.com/python/cpython/issues/115009}: Update Windows installer to use SQLite 3.45.1.

@item 
gh-109991@footnote{https://github.com/python/cpython/issues/109991}: Update Windows build to use OpenSSL 3.0.13.

@item 
gh-111239@footnote{https://github.com/python/cpython/issues/111239}: Update Windows builds to use zlib v1.3.1.

@item 
gh-100107@footnote{https://github.com/python/cpython/issues/100107}: The @code{py.exe} launcher will no longer attempt to run the
Microsoft Store redirector when launching a script containing a
@code{/usr/bin/env} shebang

@item 
gh-112984@footnote{https://github.com/python/cpython/issues/112984}: Adds free-threaded binaries to Windows installer as an optional
component.

@item 
gh-89240@footnote{https://github.com/python/cpython/issues/89240}: Allows @ref{98,,multiprocessing} to create pools of greater than 62
processes.
@end itemize

@node macOS<14>,IDLE<11>,Windows<20>,Python 3 13 0 alpha 4
@anchor{whatsnew/changelog id283}@anchor{1a4c}
@subsubsection macOS



@itemize -

@item 
gh-115009@footnote{https://github.com/python/cpython/issues/115009}: Update macOS installer to use SQLite 3.45.1.

@item 
gh-109991@footnote{https://github.com/python/cpython/issues/109991}: Update macOS installer to use OpenSSL 3.0.13.

@item 
gh-114490@footnote{https://github.com/python/cpython/issues/114490}: Add Mach-O linkage support for @ref{1a4d,,platform.architecture()}.

@item 
gh-87804@footnote{https://github.com/python/cpython/issues/87804}: On macOS the result of @code{os.statvfs} and @code{os.fstatvfs} now
correctly report the size of very large disks, in previous versions the
reported number of blocks was wrong for disks with at least 2**32 blocks.
@end itemize

@node IDLE<11>,Tools/Demos<17>,macOS<14>,Python 3 13 0 alpha 4
@anchor{whatsnew/changelog id284}@anchor{1a4e}
@subsubsection IDLE



@itemize -

@item 
gh-96905@footnote{https://github.com/python/cpython/issues/96905}: In idlelib code, stop redefining built-ins ‘dict’ and ‘object’.

@item 
gh-103820@footnote{https://github.com/python/cpython/issues/103820}: Revise IDLE bindings so that events from mouse button 4/5 on
non-X11 windowing systems (i.e. Win32 and Aqua) are not mistaken for
scrolling.
@end itemize

@node Tools/Demos<17>,C API<22>,IDLE<11>,Python 3 13 0 alpha 4
@anchor{whatsnew/changelog id285}@anchor{1a4f}
@subsubsection Tools/Demos



@itemize -

@item 
gh-113516@footnote{https://github.com/python/cpython/issues/113516}: Don’t set @code{LDSHARED} when building for WASI.

@item 
gh-109991@footnote{https://github.com/python/cpython/issues/109991}: Update GitHub CI workflows to use OpenSSL 3.0.13 and
multissltests to use 1.1.1w, 3.0.13, 3.1.5, and 3.2.1.

@item 
gh-115015@footnote{https://github.com/python/cpython/issues/115015}: Fix a bug in Argument Clinic that generated incorrect code for
methods with no parameters that use the @ref{1a50,,METH_METHOD | METH_FASTCALL | METH_KEYWORDS} calling
convention. Only the positional parameter count was checked; any keyword
argument passed would be silently accepted.
@end itemize

@node C API<22>,,Tools/Demos<17>,Python 3 13 0 alpha 4
@anchor{whatsnew/changelog id286}@anchor{1a51}
@subsubsection C API



@itemize -

@item 
gh-111140@footnote{https://github.com/python/cpython/issues/111140}: Adds @ref{606,,PyLong_AsNativeBytes()},
@ref{607,,PyLong_FromNativeBytes()} and
@ref{608,,PyLong_FromUnsignedNativeBytes()} functions.

@item 
gh-114685@footnote{https://github.com/python/cpython/issues/114685}: @ref{969,,PyBuffer_FillInfo()} now raises a @ref{796,,SystemError} if
called with @ref{1a52,,PyBUF_READ} or @ref{1a53,,PyBUF_WRITE} as flags.
These flags should only be used with the @code{PyMemoryView_*} C API.

@item 
gh-114685@footnote{https://github.com/python/cpython/issues/114685}: @ref{63a,,PyObject_GetBuffer()} now raises a @ref{796,,SystemError} if
called with @ref{1a52,,PyBUF_READ} or @ref{1a53,,PyBUF_WRITE} as flags.
These flags should only be used with the @code{PyMemoryView_*} C API.

@item 
gh-114626@footnote{https://github.com/python/cpython/issues/114626}: Add @code{PyCFunctionFast} and @code{PyCFunctionFastWithKeywords}
typedefs (identical to the existing @code{_PyCFunctionFast} and
@code{_PyCFunctionFastWithKeywords} typedefs, just without a leading @code{_}
prefix).

@item 
gh-114329@footnote{https://github.com/python/cpython/issues/114329}: Add @ref{5fe,,PyList_GetItemRef()}, which is similar to
@ref{5ff,,PyList_GetItem()} but returns a @ref{5e2,,strong reference} instead of
a @ref{3d5,,borrowed reference}.

@item 
gh-110850@footnote{https://github.com/python/cpython/issues/110850}: Add PyTime C API:


@itemize *

@item 
@ref{5d3,,PyTime_t} type.

@item 
@ref{5d4,,PyTime_MIN} and @ref{5d5,,PyTime_MAX} constants.

@item 
@ref{5d6,,PyTime_AsSecondsDouble()},
@ref{5d7,,PyTime_Monotonic()}, @ref{5d9,,PyTime_PerfCounter()}, and
@ref{5db,,PyTime_Time()} functions.
@end itemize

Patch by Victor Stinner.

@item 
gh-112066@footnote{https://github.com/python/cpython/issues/112066}: Add @ref{5e3,,PyDict_SetDefaultRef()}: insert a key and value into
a dictionary if the key is not already present. This is similar to
@ref{127f,,dict.setdefault()}, but returns an integer value indicating if the
key was already present. It is also similar to
@ref{5e4,,PyDict_SetDefault()}, but returns a strong reference instead of a
borrowed reference.
@end itemize

@node Python 3 13 0 alpha 3,Python 3 13 0 alpha 2,Python 3 13 0 alpha 4,Changelog
@anchor{whatsnew/changelog python-3-13-0-alpha-3}@anchor{1a54}
@subsection Python 3.13.0 alpha 3


`Release date: 2024-01-17'

@menu
* Security: Security<24>. 
* Core and Builtins: Core and Builtins<61>. 
* Library: Library<66>. 
* Documentation: Documentation<22>. 
* Tests: Tests<21>. 
* Build: Build<24>. 
* Windows: Windows<21>. 
* macOS: macOS<15>. 
* IDLE: IDLE<12>. 
* C API: C API<23>. 

@end menu

@node Security<24>,Core and Builtins<61>,,Python 3 13 0 alpha 3
@anchor{whatsnew/changelog id287}@anchor{1a55}
@subsubsection Security



@itemize -

@item 
gh-113659@footnote{https://github.com/python/cpython/issues/113659}: Skip @code{.pth} files with names starting with a dot or hidden
file attribute.

@item 
gh-112302@footnote{https://github.com/python/cpython/issues/112302}: Created a Software Bill-of-Materials document and tooling for
tracking dependencies.
@end itemize

@node Core and Builtins<61>,Library<66>,Security<24>,Python 3 13 0 alpha 3
@anchor{whatsnew/changelog id288}@anchor{1a56}
@subsubsection Core and Builtins



@itemize -

@item 
gh-107901@footnote{https://github.com/python/cpython/issues/107901}: Compiler duplicates basic blocks that have an eval breaker
check, no line number, and multiple predecessors.

@item 
gh-107901@footnote{https://github.com/python/cpython/issues/107901}: A jump leaving an exception handler back to normal code no
longer checks the eval breaker.

@item 
gh-113655@footnote{https://github.com/python/cpython/issues/113655}: Set the C recursion limit to 4000 on Windows, and 10000 on
Linux/OSX. This seems to be near the sweet spot to maintain safety, but
not compromise backwards compatibility.

@item 
gh-113710@footnote{https://github.com/python/cpython/issues/113710}: Add typed stack effects to the interpreter DSL, along with
various instruction annotations.

@item 
gh-77046@footnote{https://github.com/python/cpython/issues/77046}: On Windows, file descriptors wrapping Windows handles are now
created non inheritable by default (
@geindex Python Enhancement Proposals; PEP 446
PEP 446@footnote{https://peps.python.org/pep-0446/}). Patch by Zackery Spytz
and Victor Stinner.

@item 
gh-113853@footnote{https://github.com/python/cpython/issues/113853}: Guarantee that all executors make progress. This then
guarantees that tier 2 execution always makes progress.

@item 
gh-113753@footnote{https://github.com/python/cpython/issues/113753}: Fix an issue where the finalizer of @code{PyAsyncGenASend} objects
might not be called if they were allocated from a free list.

@item 
gh-107901@footnote{https://github.com/python/cpython/issues/107901}: Compiler changed so that synthetic jumps which are not at loop
end no longer check the eval breaker.

@item 
gh-113703@footnote{https://github.com/python/cpython/issues/113703}: Fix a regression in the @ref{1d,,codeop} module that was causing
it to incorrectly identify incomplete f-strings. Patch by Pablo Galindo

@item 
gh-89811@footnote{https://github.com/python/cpython/issues/89811}: Check for a valid @code{tp_version_tag} before performing bytecode
specializations that rely on this value being usable.

@item 
gh-111488@footnote{https://github.com/python/cpython/issues/111488}: Changed error message in case of no ‘in’ keyword after ‘for’ in
list comprehensions

@item 
gh-113657@footnote{https://github.com/python/cpython/issues/113657}: Fix an issue that caused important instruction pointer updates
to be optimized out of tier two traces.

@item 
gh-113603@footnote{https://github.com/python/cpython/issues/113603}: Fixed bug where a redundant NOP is not removed, causing an
assertion to fail in the compiler in debug mode.

@item 
gh-113602@footnote{https://github.com/python/cpython/issues/113602}: Fix an error that was causing the parser to try to overwrite
existing errors and crashing in the process. Patch by Pablo Galindo

@item 
gh-113486@footnote{https://github.com/python/cpython/issues/113486}: No longer issue spurious @code{PY_UNWIND} events for optimized
calls to classes.

@item 
gh-113297@footnote{https://github.com/python/cpython/issues/113297}: Fix segfault in the compiler on with statement with 19 context
managers.

@item 
gh-113212@footnote{https://github.com/python/cpython/issues/113212}: Improve @ref{1a7,,super} error messages.

@item 
gh-111375@footnote{https://github.com/python/cpython/issues/111375}: Only use @code{NULL} in the exception stack to indicate an
exception was handled. Patch by Carey Metcalfe.

@item 
gh-112215@footnote{https://github.com/python/cpython/issues/112215}: Increase the C recursion limit by a factor of 3 for non-debug
builds, except for webassembly and s390 platforms which are unchanged.
This mitigates some regressions in 3.12 with deep recursion mixing builtin
(C) and Python code.

@item 
gh-113054@footnote{https://github.com/python/cpython/issues/113054}: Fixed bug where a redundant NOP is not removed, causing an
assertion to fail in the compiler in debug mode.

@item 
gh-106905@footnote{https://github.com/python/cpython/issues/106905}: Use per AST-parser state rather than global state to track
recursion depth within the AST parser to prevent potential race condition
due to simultaneous parsing.

The issue primarily showed up in 3.11 by multithreaded users of
@ref{1c4,,ast.parse()}.  In 3.12 a change to when garbage collection can be
triggered prevented the race condition from occurring.

@item 
gh-108866@footnote{https://github.com/python/cpython/issues/108866}: Change the API and contract of @code{_PyExecutorObject} to return
the next_instr pointer, instead of the frame, and to always execute at
least one instruction.

@item 
gh-90350@footnote{https://github.com/python/cpython/issues/90350}: Optimize builtin functions @ref{1111,,min()} and @ref{1112,,max()}.

@item 
gh-112943@footnote{https://github.com/python/cpython/issues/112943}: Correctly compute end column offsets for multiline tokens in
the @ref{102,,tokenize} module. Patch by Pablo Galindo

@item 
gh-112125@footnote{https://github.com/python/cpython/issues/112125}: Fix @code{None.__ne__(None)} returning @code{NotImplemented} instead
of @code{False}.

@item 
gh-74616@footnote{https://github.com/python/cpython/issues/74616}: @ref{14e4,,input()} now raises a ValueError when output on the
terminal if the prompt contains embedded null characters instead of
silently truncating it.

@item 
gh-112716@footnote{https://github.com/python/cpython/issues/112716}: Fix SystemError in the @code{import} statement and in
@code{__reduce__()} methods of builtin types when @code{__builtins__} is not a
dict.

@item 
gh-112730@footnote{https://github.com/python/cpython/issues/112730}: Use color to highlight error locations in tracebacks. Patch by
Pablo Galindo

@item 
gh-112625@footnote{https://github.com/python/cpython/issues/112625}: Fixes a bug where a bytearray object could be cleared while
iterating over an argument in the @code{bytearray.join()} method that could
result in reading memory after it was freed.

@item 
gh-112660@footnote{https://github.com/python/cpython/issues/112660}: Do not clear unexpected errors during formatting error messages
for ImportError and AttributeError for modules.

@item 
gh-105967@footnote{https://github.com/python/cpython/issues/105967}: Workaround a bug in Apple’s macOS platform zlib library where
@ref{1a57,,zlib.crc32()} and @ref{1a58,,binascii.crc32()} could produce incorrect
results on multi-gigabyte inputs. Including when using @ref{138,,zipfile} on
zips containing large data.

@item 
gh-95754@footnote{https://github.com/python/cpython/issues/95754}: Provide a better error message when accessing invalid attributes
on partially initialized modules. The origin of the module being accessed
is now included in the message to help with the common issue of shadowing
other modules.

@item 
gh-112217@footnote{https://github.com/python/cpython/issues/112217}: Add check for the type of @code{__cause__} returned from calling
the type @code{T} in @code{raise from T}.

@item 
gh-111058@footnote{https://github.com/python/cpython/issues/111058}: Change coro.cr_frame/gen.gi_frame to return @code{None} after the
coroutine/generator has been closed. This fixes a bug where
@ref{1020,,getcoroutinestate()} and @ref{1442,,getgeneratorstate()}
return the wrong state for a closed coroutine/generator.

@item 
gh-112388@footnote{https://github.com/python/cpython/issues/112388}: Fix an error that was causing the parser to try to overwrite
tokenizer errors. Patch by pablo Galindo

@item 
gh-112387@footnote{https://github.com/python/cpython/issues/112387}: Fix error positions for decoded strings with backwards tokenize
errors. Patch by Pablo Galindo

@item 
gh-99606@footnote{https://github.com/python/cpython/issues/99606}: Make code generated for an empty f-string identical to the code
of an empty normal string.

@item 
gh-112367@footnote{https://github.com/python/cpython/issues/112367}: Avoid undefined behaviour when using the perf trampolines by
not freeing the code arenas until shutdown. Patch by Pablo Galindo

@item 
gh-112320@footnote{https://github.com/python/cpython/issues/112320}: The Tier 2 translator now tracks the confidence level for
staying “on trace” (i.e. not exiting back to the Tier 1 interpreter) for
branch instructions based on the number of bits set in the branch
“counter”. Trace translation ends when the confidence drops below 1/3rd.

@item 
gh-109598@footnote{https://github.com/python/cpython/issues/109598}:
@ref{1a59,,PyComplex_RealAsDouble()}/@ref{1a5a,,PyComplex_ImagAsDouble()} now
tries to convert an object to a @ref{198,,complex} instance using its
@code{__complex__()} method before falling back to the @code{__float__()}
method. Patch by Sergey B Kirpichev.

@item 
gh-94606@footnote{https://github.com/python/cpython/issues/94606}: Fix UnicodeEncodeError when @code{email.message.get_payload()}
reads a message with a Unicode surrogate character and the message content
is not well-formed for surrogateescape encoding. Patch by Sidney
Markowitz.

@item 
bpo-21861@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21861}: Use the object’s actual class name in
@code{_io.FileIO.__repr__()}, @code{_io._WindowsConsoleIO()} and
@code{_io.TextIOWrapper.__repr__()}, to make these methods subclass
friendly.

@item 
bpo-45369@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45369}: Remove LibreSSL workarounds as per 
@geindex Python Enhancement Proposals; PEP 644
PEP 644@footnote{https://peps.python.org/pep-0644/}.

@item 
bpo-34392@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34392}: Added @ref{559,,sys._is_interned()}.
@end itemize

@node Library<66>,Documentation<22>,Core and Builtins<61>,Python 3 13 0 alpha 3
@anchor{whatsnew/changelog id289}@anchor{1a5b}
@subsubsection Library



@itemize -

@item 
gh-114077@footnote{https://github.com/python/cpython/issues/114077}: Fix possible @ref{a87,,OverflowError} in
@ref{1063,,socket.socket.sendfile()} when pass `count' larger than 2 GiB on
32-bit platform.

@item 
gh-111803@footnote{https://github.com/python/cpython/issues/111803}: @ref{b0,,plistlib} now supports loading more deeply nested lists
in binary format.

@item 
gh-114014@footnote{https://github.com/python/cpython/issues/114014}: Fixed a bug in @ref{215,,fractions.Fraction} where an invalid
string using @code{d} in the decimals part creates a different error compared
to other invalid letters/characters. Patch by Jeremiah Gabriel Pascual.

@item 
gh-108364@footnote{https://github.com/python/cpython/issues/108364}: @ref{550,,sqlite3.Connection.iterdump()} now ensures that foreign
key support is disabled before dumping the database schema, if there is
any foreign key violation. Patch by Erlend E. Aasland and Mariusz
Felisiak.

@item 
gh-113971@footnote{https://github.com/python/cpython/issues/113971}: The @ref{2cd,,zipfile.ZipInfo} previously protected
@code{._compresslevel} attribute has been made public as @code{.compress_level}
with the old @code{_compresslevel} name remaining available as a property to
retain compatibility.

@item 
gh-113877@footnote{https://github.com/python/cpython/issues/113877}: Fix @ref{f6,,tkinter} method @code{winfo_pathname()} on 64-bit
Windows.

@item 
gh-113868@footnote{https://github.com/python/cpython/issues/113868}: Added @ref{1a5c,,mmap.MAP_NORESERVE}, @ref{1a5d,,mmap.MAP_NOEXTEND},
@ref{1a5e,,mmap.MAP_HASSEMAPHORE}, @ref{1a5f,,mmap.MAP_NOCACHE},
@ref{1a60,,mmap.MAP_JIT}, @ref{1a61,,mmap.MAP_RESILIENT_CODESIGN},
@ref{1a62,,mmap.MAP_RESILIENT_MEDIA}, @ref{1a63,,mmap.MAP_32BIT},
@ref{1a64,,mmap.MAP_TRANSLATED_ALLOW_EXECUTE}, @ref{1a65,,mmap.MAP_UNIX03} and
@ref{1a66,,mmap.MAP_TPRO}. All of them are @code{mmap(2)} flags on macOS.

@item 
gh-113848@footnote{https://github.com/python/cpython/issues/113848}: @ref{4d2,,asyncio.TaskGroup()} and @ref{815,,asyncio.timeout()} context
managers now handle @ref{4d5,,CancelledError} subclasses as well as
exact @code{CancelledError}.

@item 
gh-113661@footnote{https://github.com/python/cpython/issues/113661}: unittest runner: Don’t exit 5 if tests were skipped. The
intention of exiting 5 was to detect issues where the test suite wasn’t
discovered at all. If we skipped tests, it was correctly discovered.

@item 
gh-96037@footnote{https://github.com/python/cpython/issues/96037}: Insert @ref{a3c,,TimeoutError} in the context of the exception that
was raised during exiting an expired @ref{815,,asyncio.timeout()} block.

@item 
gh-113781@footnote{https://github.com/python/cpython/issues/113781}: Silence unraisable AttributeError when warnings are emitted
during Python finalization.

@item 
gh-113238@footnote{https://github.com/python/cpython/issues/113238}: Add @code{Anchor} to @code{importlib.resources} (in order for the
code to comply with the documentation)

@item 
gh-111693@footnote{https://github.com/python/cpython/issues/111693}: @ref{1a67,,asyncio.Condition.wait()} now re-raises the same
@code{CancelledError} instance that may have caused it to be interrupted.
Fixed race condition in @ref{1a68,,asyncio.Semaphore.acquire()} when interrupted
with a @code{CancelledError}.

@item 
gh-113791@footnote{https://github.com/python/cpython/issues/113791}: Add @code{CLOCK_MONOTONIC_RAW_APPROX} and
@code{CLOCK_UPTIME_RAW_APPROX} to @ref{f4,,time} on macOS. These are clocks
available on macOS 10.12 or later.

@item 
gh-112932@footnote{https://github.com/python/cpython/issues/112932}: Restore the ability for @ref{138,,zipfile} to @code{extractall} from
zip files with a “/” directory entry in them as is commonly added to zips
by some wiki or bug tracker data exporters.

@item 
gh-113568@footnote{https://github.com/python/cpython/issues/113568}: Raise deprecation warnings from @ref{6ce,,pathlib.PurePath} and
not its private base class @code{PurePathBase}.

@item 
gh-113594@footnote{https://github.com/python/cpython/issues/113594}: Fix @ref{889,,UnicodeEncodeError} in @ref{3f,,email} when re-fold
lines that contain unknown-8bit encoded part followed by non-unknown-8bit
encoded part.

@item 
gh-113538@footnote{https://github.com/python/cpython/issues/113538}: In @code{asyncio.StreamReaderProtocol.connection_made()}, there
is callback that logs an error if the task wrapping the “connected
callback” fails. This callback would itself fail if the task was
cancelled. Prevent this by checking whether the task was cancelled first.
If so, close the transport but don’t log an error.

@item 
gh-113626@footnote{https://github.com/python/cpython/issues/113626}: Add support for the `allow_code' argument in the @ref{91,,marshal}
module. Passing @code{allow_code=False} prevents serialization and
de-serialization of code objects which is incompatible between Python
versions.

@item 
gh-85567@footnote{https://github.com/python/cpython/issues/85567}: Fix resource warnings for unclosed files in @ref{ab,,pickle} and
@ref{ac,,pickletools} command line interfaces.

@item 
gh-113537@footnote{https://github.com/python/cpython/issues/113537}: Support loads @code{str} in @ref{b4f,,plistlib.loads()}.

@item 
gh-89850@footnote{https://github.com/python/cpython/issues/89850}: Add default implementations of
@ref{1950,,pickle.Pickler.persistent_id()} and
@ref{1958,,pickle.Unpickler.persistent_load()} methods in the C implementation.
Calling @code{super().persistent_id()} and @code{super().persistent_load()} in
subclasses of the C implementation of @ref{c19,,pickle.Pickler} and
@ref{17ca,,pickle.Unpickler} classes no longer causes infinite recursion.

@item 
gh-113569@footnote{https://github.com/python/cpython/issues/113569}: Indicate if there were no actual calls in unittest
@ref{1a69,,assert_has_calls()} failure.

@item 
gh-101225@footnote{https://github.com/python/cpython/issues/101225}: Increase the backlog for
@ref{1a6a,,multiprocessing.connection.Listener} objects created by
@code{multiprocessing.manager} and @code{multiprocessing.resource_sharer}
to significantly reduce the risk of getting a connection refused error
when creating a @ref{12ec,,multiprocessing.connection.Connection} to them.

@item 
gh-113568@footnote{https://github.com/python/cpython/issues/113568}: Raise audit events from @ref{268,,pathlib.Path} and not its
private base class @code{PathBase}.

@item 
gh-113543@footnote{https://github.com/python/cpython/issues/113543}: Make sure that @code{webbrowser.MacOSXOSAScript} sends
@code{webbrowser.open} audit event.

@item 
gh-113028@footnote{https://github.com/python/cpython/issues/113028}: When a second reference to a string appears in the input to
@ref{ab,,pickle}, and the Python implementation is in use, we are guaranteed
that a single copy gets pickled and a single object is shared when
reloaded. Previously, in protocol 0, when a string contained certain
characters (e.g. newline) it resulted in duplicate objects.

@item 
gh-113421@footnote{https://github.com/python/cpython/issues/113421}: Fix multiprocessing logger for @code{%(filename)s}.

@item 
gh-111784@footnote{https://github.com/python/cpython/issues/111784}: Fix segfaults in the @code{_elementtree} module. Fix first
segfault during deallocation of @code{_elementtree.XMLParser} instances by
keeping strong reference to @code{pyexpat} module in module state for capsule
lifetime. Fix second segfault which happens in the same deallocation
process  by keeping strong reference to @code{_elementtree} module in
@code{XMLParser} structure for @code{_elementtree} module lifetime.

@item 
gh-113407@footnote{https://github.com/python/cpython/issues/113407}: Fix import of @ref{10e,,unittest.mock} when CPython is built
without docstrings.

@item 
gh-113320@footnote{https://github.com/python/cpython/issues/113320}: Fix regression in Python 3.12 where @ref{56b,,Protocol}
classes that were not marked as @ref{675,,runtime-checkable} would be unnecessarily introspected,
potentially causing exceptions to be raised if the protocol had
problematic members. Patch by Alex Waygood.

@item 
gh-53502@footnote{https://github.com/python/cpython/issues/53502}: Add a new option @code{aware_datetime} in @ref{b0,,plistlib} to loads
or dumps aware datetime.

@item 
gh-113358@footnote{https://github.com/python/cpython/issues/113358}: Fix rendering tracebacks with exceptions with a broken
__getattr__

@item 
gh-113214@footnote{https://github.com/python/cpython/issues/113214}: Fix an @code{AttributeError} during asyncio SSL protocol aborts in
SSL-over-SSL scenarios.

@item 
gh-113246@footnote{https://github.com/python/cpython/issues/113246}: Update bundled pip to 23.3.2.

@item 
gh-87264@footnote{https://github.com/python/cpython/issues/87264}: Fixed tarfile list() method to show file type.

@item 
gh-112182@footnote{https://github.com/python/cpython/issues/112182}: @code{asyncio.futures.Future.set_exception()} now transforms
@ref{dfb,,StopIteration} into @ref{246,,RuntimeError} instead of hanging or other
misbehavior. Patch contributed by Jamie Phan.

@item 
gh-113225@footnote{https://github.com/python/cpython/issues/113225}: Speed up @ref{538,,pathlib.Path.glob()} by using
@ref{1a3f,,os.DirEntry.path} where possible.

@item 
gh-113149@footnote{https://github.com/python/cpython/issues/113149}: Improve error message when a JSON array or object contains a
trailing comma. Patch by Carson Radtke.

@item 
gh-113117@footnote{https://github.com/python/cpython/issues/113117}: The @ref{dc,,subprocess} module can now use the
@ref{52f,,os.posix_spawn()} function with @code{close_fds=True} on platforms where
@code{posix_spawn_file_actions_addclosefrom_np} is available. Patch by Jakub
Kulik.

@item 
gh-113199@footnote{https://github.com/python/cpython/issues/113199}: Make @code{http.client.HTTPResponse.read1} and
@code{http.client.HTTPResponse.readline} close IO after reading all data when
content length is known. Patch by Illia Volochii.

@item 
gh-113191@footnote{https://github.com/python/cpython/issues/113191}: Add support of @ref{52b,,os.fchmod()} and a file descriptor in
@ref{52a,,os.chmod()} on Windows.

@item 
gh-113188@footnote{https://github.com/python/cpython/issues/113188}: Fix @ref{1a6b,,shutil.copymode()} and @ref{133a,,shutil.copystat()} on
Windows. Previously they worked differently if `dst' is a symbolic link:
they modified the permission bits of `dst' itself rather than the file it
points to if `follow_symlinks' is true or `src' is not a symbolic link,
and did not modify the permission bits if `follow_symlinks' is false and
`src' is a symbolic link.

@item 
gh-113119@footnote{https://github.com/python/cpython/issues/113119}: @ref{52f,,os.posix_spawn()} now accepts @code{env=None}, which makes
the newly spawned process use the current process environment. Patch by
Jakub Kulik.

@item 
gh-113202@footnote{https://github.com/python/cpython/issues/113202}: Add a @code{strict} option to @code{batched()} in the @code{itertools}
module.

@item 
gh-61648@footnote{https://github.com/python/cpython/issues/61648}: Detect line numbers of properties in doctests.

@item 
gh-113175@footnote{https://github.com/python/cpython/issues/113175}: Sync with importlib_metadata 7.0, including improved type
annotations, fixed issue with symlinked packages in
@code{package_distributions}, added @code{EntryPoints.__repr__}, introduced the
@code{diagnose} script, added @code{Distribution.origin} property, and removed
deprecated @code{EntryPoint} access by numeric index (tuple behavior).

@item 
gh-59616@footnote{https://github.com/python/cpython/issues/59616}: Add support of @ref{529,,os.lchmod()} and the `follow_symlinks'
argument in @ref{52a,,os.chmod()} on Windows. Note that the default value of
`follow_symlinks' in @code{os.lchmod()} is @code{False} on Windows.

@item 
gh-112559@footnote{https://github.com/python/cpython/issues/112559}: @ref{1340,,signal.signal()} and @ref{1a6c,,signal.getsignal()} no longer
call @code{repr} on callable handlers. @ref{2f5,,asyncio.run()} and
@ref{1991,,asyncio.Runner.run()} no longer call @code{repr} on the task results.
Patch by Yilei Yang.

@item 
gh-112962@footnote{https://github.com/python/cpython/issues/112962}: @ref{3c,,dis} module functions add cache information to the
@ref{205,,Instruction} instance rather than creating fake
@code{Instruction} instances to represent the cache entries.

@item 
gh-112989@footnote{https://github.com/python/cpython/issues/112989}: Reduce overhead to connect sockets with @ref{b,,asyncio}
SelectorEventLoop.

@item 
gh-112970@footnote{https://github.com/python/cpython/issues/112970}: Use @code{closefrom()} on Linux where available (e.g.
glibc-2.34), rather than only FreeBSD.

@item 
gh-110190@footnote{https://github.com/python/cpython/issues/110190}: Fix ctypes structs with array on PPC64LE platform by setting
@code{MAX_STRUCT_SIZE} to 64 in stgdict. Patch by Diego Russo.

@item 
gh-112540@footnote{https://github.com/python/cpython/issues/112540}: The statistics.geometric_mean() function now returns zero for
datasets containing a zero.  Formerly, it would raise an exception.

@item 
gh-87286@footnote{https://github.com/python/cpython/issues/87286}: Added @code{LOG_FTP}, @code{LOG_NETINFO},
@code{LOG_REMOTEAUTH}, @code{LOG_INSTALL}, @code{LOG_RAS}, and
@code{LOG_LAUNCHD} tot the @ref{e2,,syslog} module, all of them constants
on used on macOS.

@item 
gh-112800@footnote{https://github.com/python/cpython/issues/112800}: Fix @ref{b,,asyncio} @code{SubprocessTransport.close()} not to throw
@code{PermissionError} when used with setuid executables.

@item 
gh-51944@footnote{https://github.com/python/cpython/issues/51944}: Add the following constants to the @ref{e7,,termios} module. These
values are present in macOS system headers: @code{ALTWERASE}, @code{B14400},
@code{B28800}, @code{B7200}, @code{B76800}, @code{CCAR_OFLOW}, @code{CCTS_OFLOW},
@code{CDSR_OFLOW}, @code{CDTR_IFLOW}, @code{CIGNORE}, @code{CRTS_IFLOW}, @code{EXTPROC},
@code{IUTF8}, @code{MDMBUF}, @code{NL2}, @code{NL3}, @code{NOKERNINFO}, @code{ONOEOT},
@code{OXTABS}, @code{VDSUSP}, @code{VSTATUS}.

@item 
gh-79325@footnote{https://github.com/python/cpython/issues/79325}: Fix an infinite recursion error in
@ref{1440,,tempfile.TemporaryDirectory()} cleanup on Windows.

@item 
gh-94692@footnote{https://github.com/python/cpython/issues/94692}: @ref{354,,shutil.rmtree()} now only catches OSError exceptions.
Previously a symlink attack resistant version of @code{shutil.rmtree()} could
ignore or pass to the error handler arbitrary exception when invalid
arguments were provided.

@item 
gh-112736@footnote{https://github.com/python/cpython/issues/112736}: The use of del-safe symbols in @code{subprocess} was refactored to
allow for use in cross-platform build environments.

@item 
gh-112727@footnote{https://github.com/python/cpython/issues/112727}: Speed up @ref{1a6d,,pathlib.Path.absolute()}. Patch by Barney Gale.

@item 
gh-74690@footnote{https://github.com/python/cpython/issues/74690}: Speedup @ref{9ca,,issubclass()} checks against simple
@ref{675,,runtime-checkable protocols} by around
6%. Patch by Alex Waygood.

@item 
gh-74690@footnote{https://github.com/python/cpython/issues/74690}: Speedup @ref{2af,,isinstance()} checks by roughly 20% for
@ref{675,,runtime-checkable protocols} that only
have one callable member. Speedup @ref{9ca,,issubclass()} checks for these
protocols by roughly 10%. Patch by Alex Waygood.

@item 
gh-112645@footnote{https://github.com/python/cpython/issues/112645}: Remove deprecation error on passing @code{onerror} to
@ref{354,,shutil.rmtree()}.

@item 
gh-112640@footnote{https://github.com/python/cpython/issues/112640}: Add @code{kwdefaults} parameter to @ref{a89,,types.FunctionType} to
set default keyword argument values.

@item 
gh-112622@footnote{https://github.com/python/cpython/issues/112622}: Ensure @code{name} parameter is passed to event loop in
@ref{1cb,,asyncio.create_task()}.

@item 
gh-112618@footnote{https://github.com/python/cpython/issues/112618}: Fix a caching bug relating to @ref{b3d,,typing.Annotated}.
@code{Annotated[str, True]} is no longer identical to @code{Annotated[str, 1]}.

@item 
gh-112334@footnote{https://github.com/python/cpython/issues/112334}: Fixed a performance regression in 3.12’s @ref{dc,,subprocess} on
Linux where it would no longer use the fast-path @code{vfork()} system call
when it could have due to a logic bug, instead falling back to the safe
but slower @code{fork()}.

Also fixed a second 3.12.0 potential security bug.  If a value of
@code{extra_groups=[]} was passed to @ref{4b8,,subprocess.Popen} or related APIs,
the underlying @code{setgroups(0, NULL)} system call to clear the groups list
would not be made in the child process prior to @code{exec()}.

This was identified via code inspection in the process of fixing the first
bug.

@item 
gh-110190@footnote{https://github.com/python/cpython/issues/110190}: Fix ctypes structs with array on Arm platform by setting
@code{MAX_STRUCT_SIZE} to 32 in stgdict. Patch by Diego Russo.

@item 
gh-81194@footnote{https://github.com/python/cpython/issues/81194}: Fix a crash in @ref{c2a,,socket.if_indextoname()} with specific value
(UINT_MAX). Fix an integer overflow in @code{socket.if_indextoname()} on
64-bit non-Windows platforms.

@item 
gh-112578@footnote{https://github.com/python/cpython/issues/112578}: Fix a spurious @ref{4d8,,RuntimeWarning} when executing the
@ref{138,,zipfile} module.

@item 
gh-112516@footnote{https://github.com/python/cpython/issues/112516}: Update the bundled copy of pip to version 23.3.1.

@item 
gh-112510@footnote{https://github.com/python/cpython/issues/112510}: Add @ref{1a6e,,readline.backend} for the backend readline uses
(@code{editline} or @code{readline})

@item 
gh-112328@footnote{https://github.com/python/cpython/issues/112328}: [Enum] Make @code{EnumDict}, @code{EnumDict.member_names},
@code{EnumType._add_alias_} and @code{EnumType._add_value_alias_} public.

@item 
gh-112509@footnote{https://github.com/python/cpython/issues/112509}: Fix edge cases that could cause a key to be present in both the
@code{__required_keys__} and @code{__optional_keys__} attributes of a
@ref{330,,typing.TypedDict}. Patch by Jelle Zijlstra.

@item 
gh-101336@footnote{https://github.com/python/cpython/issues/101336}: Add @code{keep_alive} keyword parameter for
@code{AbstractEventLoop.create_server()} and
@code{BaseEventLoop.create_server()}.

@item 
gh-63284@footnote{https://github.com/python/cpython/issues/63284}: Added support for TLS-PSK (pre-shared key) mode to the
@ref{d5,,ssl} module.

@item 
gh-112414@footnote{https://github.com/python/cpython/issues/112414}: Fix regression in Python 3.12 where calling @ref{1c3,,repr()} on a
module that had been imported using a custom @ref{1a6f,,loader} could fail
with @ref{5f0,,AttributeError}. Patch by Alex Waygood.

@item 
gh-112358@footnote{https://github.com/python/cpython/issues/112358}: Revert change to @ref{17af,,struct.Struct} initialization that
broke some cases of subclassing.

@item 
gh-112405@footnote{https://github.com/python/cpython/issues/112405}: Optimize @ref{2ff,,pathlib.PurePath.relative_to()}. Patch by Alex
Waygood.

@item 
gh-94722@footnote{https://github.com/python/cpython/issues/94722}: Fix bug where comparison between instances of
@ref{1a70,,DocTest} fails if one of them has @code{None} as its lineno.

@item 
gh-112361@footnote{https://github.com/python/cpython/issues/112361}: Speed up a small handful of @ref{a8,,pathlib} methods by removing
some temporary objects.

@item 
gh-112345@footnote{https://github.com/python/cpython/issues/112345}: Improve error message when trying to call @ref{9ca,,issubclass()}
against a @ref{56b,,typing.Protocol} that has non-method members. Patch by
Randolf Scholz.

@item 
gh-112137@footnote{https://github.com/python/cpython/issues/112137}: Change @ref{3c,,dis} output to display no-lineno as “–” instead
of “None”.

@item 
gh-112332@footnote{https://github.com/python/cpython/issues/112332}: Deprecate the @code{exc_type} field of
@ref{563,,traceback.TracebackException}. Add @code{exc_type_str} to replace it.

@item 
gh-81620@footnote{https://github.com/python/cpython/issues/81620}: Add extra tests for @ref{6d8,,random.binomialvariate()}

@item 
gh-112292@footnote{https://github.com/python/cpython/issues/112292}: Fix a crash in @ref{bf,,readline} when imported from a sub
interpreter. Patch by Anthony Shaw

@item 
gh-77621@footnote{https://github.com/python/cpython/issues/77621}: Slightly improve the import time of the @ref{a8,,pathlib} module by
deferring some imports. Patch by Barney Gale.

@item 
gh-112137@footnote{https://github.com/python/cpython/issues/112137}: Change @ref{3c,,dis} output to display logical labels for jump
targets instead of offsets.

@item 
gh-112139@footnote{https://github.com/python/cpython/issues/112139}: Add @code{Signature.format()} to format signatures to string
with extra options. And use it in @ref{ba,,pydoc} to render more readable
signatures that have new lines between parameters.

@item 
gh-112105@footnote{https://github.com/python/cpython/issues/112105}: Make @ref{1a71,,readline.set_completer_delims()} work with libedit

@item 
gh-106922@footnote{https://github.com/python/cpython/issues/106922}: Display multiple lines with @code{traceback} when errors span
multiple lines.

@item 
gh-111874@footnote{https://github.com/python/cpython/issues/111874}: When creating a @ref{32f,,typing.NamedTuple} class, ensure
@ref{e4e,,__set_name__()} is called on all objects that define
@code{__set_name__} and exist in the values of the @code{NamedTuple} class’s
class dictionary. Patch by Alex Waygood.

@item 
gh-68166@footnote{https://github.com/python/cpython/issues/68166}: Add support of the “vsapi” element type in
@ref{55f,,tkinter.ttk.Style.element_create()}.

@item 
gh-110275@footnote{https://github.com/python/cpython/issues/110275}: Named tuple’s methods @code{_replace()} and @code{__replace__()} now
raise TypeError instead of ValueError for invalid keyword arguments.

@item 
gh-99367@footnote{https://github.com/python/cpython/issues/99367}: Do not mangle @code{sys.path[0]} in @ref{aa,,pdb} if safe_path is set

@item 
gh-111615@footnote{https://github.com/python/cpython/issues/111615}: Fix a regression caused by a fix to gh-93162@footnote{https://github.com/python/cpython/issues/93162} whereby you
couldn’t configure a @code{QueueHandler} without specifying handlers.

@item 
gh-75666@footnote{https://github.com/python/cpython/issues/75666}: Fix the behavior of @ref{f6,,tkinter} widget’s @code{unbind()} method
with two arguments. Previously, @code{widget.unbind(sequence, funcid)}
destroyed the current binding for `sequence', leaving `sequence' unbound,
and deleted the `funcid' command. Now it removes only `funcid' from the
binding for `sequence', keeping other commands, and deletes the `funcid'
command. It leaves `sequence' unbound only if `funcid' was the last bound
command.

@item 
gh-67790@footnote{https://github.com/python/cpython/issues/67790}: Implement basic formatting support (minimum width, alignment,
fill) for @ref{215,,fractions.Fraction}.

@item 
gh-111049@footnote{https://github.com/python/cpython/issues/111049}: Fix crash during garbage collection of the @ref{10aa,,io.BytesIO}
buffer object.

@item 
gh-102980@footnote{https://github.com/python/cpython/issues/102980}: Redirect the output of @code{interact} command of @ref{aa,,pdb} to
the same channel as the debugger. Add tests and improve docs.

@item 
gh-102988@footnote{https://github.com/python/cpython/issues/102988}: @ref{4f4,,email.utils.getaddresses()} and
@ref{4f5,,email.utils.parseaddr()} now return @code{('@w{'}, '@w{'})} 2-tuples in more
situations where invalid email addresses are encountered instead of
potentially inaccurate values. Add optional `strict' parameter to these
two functions: use @code{strict=False} to get the old behavior, accept
malformed inputs. @code{getattr(email.utils, 'supports_strict_parsing',
False)} can be use to check if the `strict' parameter is available. Patch
by Thomas Dwyer and Victor Stinner to improve the 
@geindex Common Vulnerabilities and Exposures; CVE 2023-27043
CVE 2023-27043@footnote{https://www.cve.org/CVERecord?id=CVE-2023-27043} fix.

@item 
gh-52161@footnote{https://github.com/python/cpython/issues/52161}: @ref{1a72,,cmd.Cmd.do_help()} now cleans docstrings with
@ref{1a73,,inspect.cleandoc()} before writing them. Patch by Filip Łapkiewicz.

@item 
gh-82300@footnote{https://github.com/python/cpython/issues/82300}: Add @code{track} parameter to
@ref{1a1c,,multiprocessing.shared_memory.SharedMemory} that allows using
shared memory blocks without having to register with the POSIX resource
tracker that automatically releases them upon process exit.

@item 
gh-110109@footnote{https://github.com/python/cpython/issues/110109}: Add private @code{pathlib._PurePathBase} class: a base class for
@ref{6ce,,pathlib.PurePath} that omits certain magic methods. It may be made
public (along with @code{_PathBase}) in future.

@item 
gh-109858@footnote{https://github.com/python/cpython/issues/109858}: Protect @ref{138,,zipfile} from “quoted-overlap” zipbomb. It now
raises BadZipFile when try to read an entry that overlaps with other entry
or central directory.

@item 
gh-109786@footnote{https://github.com/python/cpython/issues/109786}: Fix possible reference leaks and crash when re-enter the
@code{__next__()} method of @ref{a1c,,itertools.pairwise}.

@item 
gh-91539@footnote{https://github.com/python/cpython/issues/91539}: Small (10 - 20%) and trivial performance improvement of
@code{urllib.request.getproxies_environment()}, typically useful when there
are many environment variables to go over.

@item 
gh-103363@footnote{https://github.com/python/cpython/issues/103363}: Add `follow_symlinks' keyword-only argument to
@ref{53c,,pathlib.Path.owner()} and @ref{53d,,group()}, defaulting to
@code{True}.

@item 
gh-102130@footnote{https://github.com/python/cpython/issues/102130}: Support tab completion in @ref{1a,,cmd} for @code{editline}.

@item 
gh-99437@footnote{https://github.com/python/cpython/issues/99437}: @ref{4a5,,runpy.run_path()} now decodes path-like objects, making
sure __file__ and sys.argv[0] of the module being run are always strings.

@item 
gh-104003@footnote{https://github.com/python/cpython/issues/104003}: Add @ref{48a,,warnings.deprecated()}, a decorator to mark deprecated
functions to static type checkers and to warn on usage of deprecated
classes and functions. See 
@geindex Python Enhancement Proposals; PEP 702
PEP 702@footnote{https://peps.python.org/pep-0702/}. Patch by Jelle Zijlstra.

@item 
gh-103708@footnote{https://github.com/python/cpython/issues/103708}: Make hardcoded python name, a configurable parameter so that
different implementations of python can override it instead of making huge
diffs in sysconfig.py

@item 
gh-66515@footnote{https://github.com/python/cpython/issues/66515}: @ref{1a74,,mailbox.MH} now supports folders that do not contain a
@code{.mh_sequences} file (e.g. Claws Mail IMAP-cache folders). Patch by
Serhiy Storchaka.

@item 
gh-83162@footnote{https://github.com/python/cpython/issues/83162}: Renamed @code{re.error} to @code{PatternError} for clarity, and
kept @code{re.error} for backward compatibility. Patch by Matthias
Bussonnier and Adam Chhina.

@item 
gh-91133@footnote{https://github.com/python/cpython/issues/91133}: Fix a bug in @ref{1440,,tempfile.TemporaryDirectory} cleanup, which
now no longer dereferences symlinks when working around file system
permission errors.

@item 
bpo-43153@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43153}: On Windows, @code{tempfile.TemporaryDirectory} previously masked a
@code{PermissionError} with @code{NotADirectoryError} during directory cleanup.
It now correctly raises @code{PermissionError} if errors are not ignored.
Patch by Andrei Kulakov and Ken Jin.

@item 
bpo-32731@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32731}: @ref{65a,,getpass.getuser()} now raises @ref{2c2,,OSError} for all
failures rather than @ref{65b,,ImportError} on systems lacking the @ref{b7,,pwd}
module or @ref{5e7,,KeyError} if the password database is empty.

@item 
bpo-34321@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34321}: @ref{51a,,mmap.mmap} now has a `trackfd' parameter on Unix; if it
is @code{False}, the file descriptor specified by `fileno' will not be
duplicated.

@item 
bpo-35332@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35332}: The @ref{354,,shutil.rmtree()} function now ignores errors when
calling @ref{d71,,os.close()} when `ignore_errors' is @code{True}, and
@code{os.close()} no longer retried after error.

@item 
bpo-35928@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35928}: @ref{9c4,,io.TextIOWrapper} now correctly handles the decoding
buffer after @code{read()} and @code{write()}.

@item 
bpo-26791@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26791}: @ref{c57,,shutil.move()} now moves a symlink into a directory when
that directory is the target of the symlink.  This provides the same
behavior as the mv shell command.  The previous behavior raised an
exception.  Patch by Jeffrey Kintscher.

@item 
bpo-41422@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41422}: Fixed memory leaks of @ref{c19,,pickle.Pickler} and
@ref{17ca,,pickle.Unpickler} involving cyclic references via the internal
memo mapping.

@item 
bpo-19821@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19821}: The @code{pydoc.ispackage()} function has been deprecated.

@item 
bpo-40262@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40262}: The @code{ssl.SSLSocket.recv_into()} method no longer requires
the `buffer' argument to implement @code{__len__} and supports buffers with
arbitrary item size.

@item 
bpo-39912@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39912}: @ref{16b5,,warnings.filterwarnings()} and
@ref{8d2,,warnings.simplefilter()} now raise appropriate exceptions instead of
@code{AssertionError}. Patch contributed by Rémi Lapeyre.

@item 
bpo-37260@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37260}: Fixed a race condition in @ref{354,,shutil.rmtree()} in which
directory entries removed by another process or thread while
@code{shutil.rmtree()} is running can cause it to raise FileNotFoundError.
Patch by Jeffrey Kintscher.

@item 
bpo-36959@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36959}: Fix some error messages for invalid ISO format string
combinations in @code{strptime()} that referred to directives not contained
in the format string. Patch by Gordon P. Hemsley.

@item 
bpo-18060@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18060}: Fixed a class inheritance issue that can cause segfaults when
deriving two or more levels of subclasses from a base class of Structure
or Union.

@item 
bpo-29779@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29779}: Add a new 
@geindex PYTHON_HISTORY
@geindex environment variable; PYTHON_HISTORY
@ref{4b1,,PYTHON_HISTORY} environment variable to set
the location of a @code{.python_history} file.

@item 
bpo-21360@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21360}: @ref{65e,,mailbox.Maildir} now ignores files with a leading dot.
@end itemize

@node Documentation<22>,Tests<21>,Library<66>,Python 3 13 0 alpha 3
@anchor{whatsnew/changelog id290}@anchor{1a75}
@subsubsection Documentation



@itemize -

@item 
gh-111699@footnote{https://github.com/python/cpython/issues/111699}: Relocate @code{smtpd} deprecation notice to its own section rather
than under @code{locale} in What’s New in Python 3.12 document

@item 
gh-110746@footnote{https://github.com/python/cpython/issues/110746}: Improved markup for valid options/values for methods
ttk.treeview.column and ttk.treeview.heading, and for Layouts.

@item 
gh-95649@footnote{https://github.com/python/cpython/issues/95649}: Document that the @ref{b,,asyncio} module contains code taken from
v0.16.0 of the uvloop project@footnote{https://github.com/MagicStack/uvloop/tree/v0.16.0}, as well as the
required MIT licensing information.
@end itemize

@node Tests<21>,Build<24>,Documentation<22>,Python 3 13 0 alpha 3
@anchor{whatsnew/changelog id291}@anchor{1a76}
@subsubsection Tests



@itemize -

@item 
gh-111798@footnote{https://github.com/python/cpython/issues/111798}: Disable @code{test_super_deep()} from @code{test_call} under pydebug
builds on WASI; the stack depth is too small to make the test useful.

@item 
gh-111801@footnote{https://github.com/python/cpython/issues/111801}: Lower the recursion limit in @code{test_isinstance} for
@code{test_infinitely_many_bases()}. This prevents a stack overflow on a
pydebug build of WASI.

@item 
gh-111802@footnote{https://github.com/python/cpython/issues/111802}: Specify a low recursion depth for @code{test_bad_getattr()} in
@code{test.pickletester} to avoid exhausting the stack under a pydebug build
for WASI.

@item 
gh-44626@footnote{https://github.com/python/cpython/issues/44626}: Fix @ref{532,,os.path.isabs()} incorrectly returning @code{True} when
given a path that starts with exactly one (back)slash on Windows.

Fix @code{pathlib.PureWindowsPath.is_absolute()} incorrectly returning
@code{False} for some paths beginning with two (back)slashes.

@item 
gh-113633@footnote{https://github.com/python/cpython/issues/113633}: Use module state for the _testcapi extension module.

@item 
gh-109980@footnote{https://github.com/python/cpython/issues/109980}: Fix @code{test_tarfile_vs_tar} in @code{test_shutil} for macOS, where
system tar can include more information in the archive than
@ref{6db,,shutil.make_archive}.

@item 
gh-112769@footnote{https://github.com/python/cpython/issues/112769}: The tests now correctly compare zlib version when
@ref{137a,,zlib.ZLIB_RUNTIME_VERSION} contains non-integer suffixes. For
example zlib-ng defines the version as @code{1.3.0.zlib-ng}.

@item 
gh-112334@footnote{https://github.com/python/cpython/issues/112334}: Adds a regression test to verify that @code{vfork()} is used when
expected by @ref{dc,,subprocess} on vfork enabled POSIX systems (Linux).

@item 
gh-108927@footnote{https://github.com/python/cpython/issues/108927}: Fixed order dependence in running tests in the same process
when a test that has submodules (e.g. test_importlib) follows a test that
imports its submodule (e.g. test_importlib.util) and precedes a test (e.g.
test_unittest or test_compileall) that uses that submodule.

@item 
bpo-40648@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40648}: Test modes that file can get with chmod() on Windows.
@end itemize

@node Build<24>,Windows<21>,Tests<21>,Python 3 13 0 alpha 3
@anchor{whatsnew/changelog id292}@anchor{1a77}
@subsubsection Build



@itemize -

@item 
gh-114013@footnote{https://github.com/python/cpython/issues/114013}: Fix @code{Tools/wasm/wasi.py} to not include the path to
@code{python.wasm} as part of @code{HOSTRUNNER}. The environment variable is
meant to specify how to run the WASI host only, having @code{python.wasm} and
relevant flags appended to the @code{HOSTRUNNER}. This fixes @code{make test}
work.

@item 
gh-113258@footnote{https://github.com/python/cpython/issues/113258}: Changed the Windows build to write out generated frozen modules
into the build tree instead of the source tree.

@item 
gh-112305@footnote{https://github.com/python/cpython/issues/112305}: Fixed the @code{check-clean-src} step performed on out of tree
builds to detect errant @code{$(srcdir)/Python/frozen_modules/*.h} files and
recommend appropriate source tree cleanup steps to get a working build
again.

@item 
gh-112536@footnote{https://github.com/python/cpython/issues/112536}: Add support for thread sanitizer (TSAN)

@item 
gh-112867@footnote{https://github.com/python/cpython/issues/112867}: Fix the build for the case that WITH_PYMALLOC_RADIX_TREE=0 set.

@item 
gh-103065@footnote{https://github.com/python/cpython/issues/103065}: Introduce @code{Tools/wasm/wasi.py} to simplify doing a WASI
build.

@item 
bpo-11102@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11102}: The @ref{19a2,,os.major()}, @ref{19a4,,os.makedev()}, and @ref{19a3,,os.minor()}
functions are now available on HP-UX v3.

@item 
bpo-36351@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36351}: Do not set ipv6type when cross-compiling.
@end itemize

@node Windows<21>,macOS<15>,Build<24>,Python 3 13 0 alpha 3
@anchor{whatsnew/changelog id293}@anchor{1a78}
@subsubsection Windows



@itemize -

@item 
gh-114096@footnote{https://github.com/python/cpython/issues/114096}: Process privileges that are activated for creating directory
junctions are now restored afterwards, avoiding behaviour changes in other
parts of the program.

@item 
gh-111877@footnote{https://github.com/python/cpython/issues/111877}: @ref{26f,,os.stat()} calls were returning incorrect time values for
files that could not be accessed directly.

@item 
gh-111973@footnote{https://github.com/python/cpython/issues/111973}: Update Windows installer to use SQLite 3.44.2.

@item 
gh-113009@footnote{https://github.com/python/cpython/issues/113009}: @ref{98,,multiprocessing}: On Windows, fix a race condition in
@code{Process.terminate()}: no longer set the @code{returncode} attribute to
always call @code{WaitForSingleObject()} in @code{Process.wait()}.  Previously,
sometimes the process was still running after @code{TerminateProcess()} even
if @code{GetExitCodeProcess()} is not @code{STILL_ACTIVE}. Patch by Victor
Stinner.

@item 
gh-86179@footnote{https://github.com/python/cpython/issues/86179}: Fixes path calculations when launching Python on Windows through
a symlink.

@item 
gh-71383@footnote{https://github.com/python/cpython/issues/71383}: Update Tcl/Tk in Windows installer to 8.6.13 with a patch to
suppress incorrect ThemeChanged warnings.

@item 
gh-111650@footnote{https://github.com/python/cpython/issues/111650}: Ensures the @code{Py_GIL_DISABLED} preprocessor variable is
defined in @code{pyconfig.h} so that extension modules written in C are
able to use it.

@item 
gh-112278@footnote{https://github.com/python/cpython/issues/112278}: Reduce the time cost for some functions in @ref{af,,platform} on
Windows if current user has no permission to the WMI.

@item 
gh-73427@footnote{https://github.com/python/cpython/issues/73427}: Deprecate @ref{33c,,sys._enablelegacywindowsfsencoding()}. Use
@geindex PYTHONLEGACYWINDOWSFSENCODING
@geindex environment variable; PYTHONLEGACYWINDOWSFSENCODING
@ref{33d,,PYTHONLEGACYWINDOWSFSENCODING} instead. Patch by Inada Naoki.

@item 
gh-87868@footnote{https://github.com/python/cpython/issues/87868}: Correctly sort and remove duplicate environment variables in
@code{_winapi.CreateProcess()}.

@item 
bpo-37308@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37308}: Fix mojibake in @ref{51a,,mmap.mmap} when using a non-ASCII
`tagname' argument on Windows.
@end itemize

@node macOS<15>,IDLE<12>,Windows<21>,Python 3 13 0 alpha 3
@anchor{whatsnew/changelog id294}@anchor{1a79}
@subsubsection macOS



@itemize -

@item 
gh-113666@footnote{https://github.com/python/cpython/issues/113666}: Add the following constants to module @ref{d6,,stat}:
@code{UF_SETTABLE}, @code{UF_TRACKED}, @code{UF_DATAVAULT}, @code{SF_SUPPORTED},
@code{SF_SETTABLE}, @code{SF_SYNTHETIC}, @code{SF_RESTRICTED}, @code{SF_FIRMLINK} and
@code{SF_DATALESS}. The values @code{UF_SETTABLE}, @code{SF_SUPPORTED},
@code{SF_SETTABLE} and @code{SF_SYNTHETIC} are only available on macOS.

@item 
gh-113536@footnote{https://github.com/python/cpython/issues/113536}: @ref{f9f,,os.waitid()} is now available on macOS

@item 
gh-110459@footnote{https://github.com/python/cpython/issues/110459}: Running @code{configure ... --with-openssl-rpath=X/Y/Z} no longer
fails to detect OpenSSL on macOS.

@item 
gh-74573@footnote{https://github.com/python/cpython/issues/74573}: Document that @ref{38,,dbm.ndbm} can silently corrupt DBM files on
updates when exceeding undocumented platform limits, and can crash
(segmentation fault) when reading such a corrupted file. (FB8919203)

@item 
gh-65701@footnote{https://github.com/python/cpython/issues/65701}: The @code{freeze} tool doesn’t work with framework builds of
Python. Document this and bail out early when running the tool with such a
build.

@item 
gh-87277@footnote{https://github.com/python/cpython/issues/87277}: webbrowser: Don’t look for X11 browsers on macOS. Those are
generally not used and probing for them can result in starting XQuartz
even if it isn’t used otherwise.

@item 
gh-111973@footnote{https://github.com/python/cpython/issues/111973}: Update macOS installer to use SQLite 3.44.2.

@item 
gh-108269@footnote{https://github.com/python/cpython/issues/108269}: Set @code{CFBundleAllowMixedLocalizations} to true in the
Info.plist for the framework, embedded Python.app and IDLE.app with
framework installs on macOS.  This allows applications to pick up the
user’s preferred locale when that’s different from english.

@item 
gh-102362@footnote{https://github.com/python/cpython/issues/102362}: Make sure the result of @code{sysconfig.get_plaform()} includes
at least a major and minor versions, even if @code{MACOSX_DEPLOYMENT_TARGET}
is set to only a major version during build to match the format expected
by pip.

@item 
gh-110017@footnote{https://github.com/python/cpython/issues/110017}: Disable a signal handling stress test on macOS due to a bug in
macOS (FB13453490).

@item 
gh-110820@footnote{https://github.com/python/cpython/issues/110820}: Make sure the preprocessor definitions for
@code{ALIGNOF_MAX_ALIGN_T}, @code{SIZEOF_LONG_DOUBLE} and
@code{HAVE_GCC_ASM_FOR_X64} are correct for Universal 2 builds on macOS.

@item 
gh-109981@footnote{https://github.com/python/cpython/issues/109981}: Use @code{/dev/fd} on macOS to determine the number of open files
in @code{test.support.os_helper.fd_count} to avoid a crash with “guarded”
file descriptors when probing for open files.
@end itemize

@node IDLE<12>,C API<23>,macOS<15>,Python 3 13 0 alpha 3
@anchor{whatsnew/changelog id295}@anchor{1a7a}
@subsubsection IDLE



@itemize -

@item 
gh-72284@footnote{https://github.com/python/cpython/issues/72284}: Improve the lists of features, editor key bindings, and shell
key bingings in the IDLE doc.

@item 
gh-113903@footnote{https://github.com/python/cpython/issues/113903}: Fix rare failure of test.test_idle, in test_configdialog.

@item 
gh-113729@footnote{https://github.com/python/cpython/issues/113729}: Fix the “Help -> IDLE Doc” menu bug in 3.11.7 and 3.12.1.

@item 
gh-113269@footnote{https://github.com/python/cpython/issues/113269}: Fix test_editor hang on macOS Catalina.

@item 
gh-112898@footnote{https://github.com/python/cpython/issues/112898}: Fix processing unsaved files when quitting IDLE on macOS.

@item 
bpo-13586@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13586}: Enter the selected text when opening the “Replace” dialog.
@end itemize

@node C API<23>,,IDLE<12>,Python 3 13 0 alpha 3
@anchor{whatsnew/changelog id296}@anchor{1a7b}
@subsubsection C API



@itemize -

@item 
gh-106560@footnote{https://github.com/python/cpython/issues/106560}: Fix redundant declarations in the public C API. Declare
PyBool_Type, PyLong_Type and PySys_Audit() only once. Patch by Victor
Stinner.

@item 
gh-112438@footnote{https://github.com/python/cpython/issues/112438}: Fix support of format units “es”, “et”, “es#”, and “et#” in
nested tuples in @ref{3bf,,PyArg_ParseTuple()}-like functions.

@item 
gh-111545@footnote{https://github.com/python/cpython/issues/111545}: Add @ref{423,,Py_HashPointer()} function to hash a pointer. Patch
by Victor Stinner.

@item 
gh-65210@footnote{https://github.com/python/cpython/issues/65210}: Change the declaration of the `keywords' parameter of
@ref{624,,PyArg_ParseTupleAndKeywords()} and
@ref{625,,PyArg_VaParseTupleAndKeywords()} for better compatibility with C++.
@end itemize

@node Python 3 13 0 alpha 2,Python 3 13 0 alpha 1,Python 3 13 0 alpha 3,Changelog
@anchor{whatsnew/changelog python-3-13-0-alpha-2}@anchor{1a7c}
@subsection Python 3.13.0 alpha 2


`Release date: 2023-11-22'

@menu
* Core and Builtins: Core and Builtins<62>. 
* Library: Library<67>. 
* Tests: Tests<22>. 
* Build: Build<25>. 
* Windows: Windows<22>. 
* macOS: macOS<16>. 
* IDLE: IDLE<13>. 
* Tools/Demos: Tools/Demos<18>. 
* C API: C API<24>. 

@end menu

@node Core and Builtins<62>,Library<67>,,Python 3 13 0 alpha 2
@anchor{whatsnew/changelog id297}@anchor{1a7d}
@subsubsection Core and Builtins



@itemize -

@item 
gh-112243@footnote{https://github.com/python/cpython/issues/112243}: Don’t include comments in f-string debug expressions. Patch by
Pablo Galindo

@item 
gh-112287@footnote{https://github.com/python/cpython/issues/112287}: Slightly optimize the Tier 2 (uop) interpreter by only loading
@code{oparg} and @code{operand} when needed. Also double the trace size limit
again, to 512 this time.

@item 
gh-112266@footnote{https://github.com/python/cpython/issues/112266}: Change docstrings of @ref{77e,,__dict__} and
@code{__weakref__}.

@item 
gh-111807@footnote{https://github.com/python/cpython/issues/111807}: Lower the max parser stack depth to 1000 under WASI debug
builds.

@item 
gh-111798@footnote{https://github.com/python/cpython/issues/111798}: When Python is built in debug mode, set the C recursion limit
to 500 instead of 1500. A debug build is likely built with low
optimization level which implies higher stack memory usage than a release
build. Patch by Victor Stinner.

@item 
gh-106529@footnote{https://github.com/python/cpython/issues/106529}: Enable translating unspecialized @code{FOR_ITER} to Tier 2.

@item 
gh-111916@footnote{https://github.com/python/cpython/issues/111916}: Make hashlib related modules thread-safe without the GIL

@item 
gh-81137@footnote{https://github.com/python/cpython/issues/81137}: Deprecate assignment to a function’s @code{__code__} field when the
new code object is of a mismatched type (e.g., from a generator to a plain
function).

@item 
gh-79932@footnote{https://github.com/python/cpython/issues/79932}: Raise exception if @ref{585,,frame.clear()} is called on a suspended
frame.

@item 
gh-81925@footnote{https://github.com/python/cpython/issues/81925}: Implement native thread ids for GNU KFreeBSD.

@item 
gh-111843@footnote{https://github.com/python/cpython/issues/111843}: Use exponential backoff to reduce the number of failed tier 2
optimization attempts by over 99%.

@item 
gh-110829@footnote{https://github.com/python/cpython/issues/110829}: Joining a thread now ensures the underlying OS thread has
exited. This is required for safer fork() in multi-threaded processes.

@item 
gh-109369@footnote{https://github.com/python/cpython/issues/109369}: Make sure that tier 2 traces are de-optimized if the code is
instrumented

@item 
gh-111772@footnote{https://github.com/python/cpython/issues/111772}: Specialize slot loads and stores for _Py_T_OBJECT as well as
Py_T_OBJECT_EX

@item 
gh-111666@footnote{https://github.com/python/cpython/issues/111666}: Speed up @ref{1a7e,,BaseExceptionGroup.derive()},
@ref{1a7f,,BaseExceptionGroup.subgroup()}, and @ref{191e,,BaseExceptionGroup.split()}
by changing how they parse passed arguments.

@item 
gh-111654@footnote{https://github.com/python/cpython/issues/111654}: Fix runtime crash when some error happens in opcode
@code{LOAD_FROM_DICT_OR_DEREF}.

@item 
gh-111623@footnote{https://github.com/python/cpython/issues/111623}: Add support for sharing tuples between interpreters using the
cross-interpreter API.  Patch by Anthony Shaw.

@item 
gh-111354@footnote{https://github.com/python/cpython/issues/111354}: The oparg of @ref{5ba,,YIELD_VALUE} is now @code{1} if the
instruction is part of a yield-from or await, and @code{0} otherwise.

The SUSPENDED frame state is now split into @code{SUSPENDED} and
@code{SUSPENDED_YIELD_FROM}. This simplifies the code in @code{_PyGen_yf}.

@item 
gh-111520@footnote{https://github.com/python/cpython/issues/111520}: Merge the Tier 1 (bytecode) and Tier 2 (micro-ops) interpreters
together, moving the Tier 2 interpreter loop and switch into
@code{_PyEval_EvalFrameDefault()} in @code{Python/ceval.c}. The
@code{Python/executor.c} file is gone. Also the @code{TIER_ONE} and @code{TIER_TWO}
macros are now handled by the code generator.

`Beware!' This changes the environment variables to enable micro-ops and
their debugging to @code{PYTHON_UOPS} and @code{PYTHON_LLTRACE}.

@item 
gh-109181@footnote{https://github.com/python/cpython/issues/109181}: Speed up @code{Traceback} object creation by lazily compute
the line number. Patch by Pablo Galindo

@item 
gh-111420@footnote{https://github.com/python/cpython/issues/111420}: Allow type comments in parenthesized @code{with} statements

@item 
gh-111438@footnote{https://github.com/python/cpython/issues/111438}: Add support for sharing floats between interpreters using the
cross-interpreter API.  Patch by Anthony Shaw.

@item 
gh-111435@footnote{https://github.com/python/cpython/issues/111435}: Add support for sharing of @code{True} and @code{False} between
interpreters using the cross-interpreter API.  Patch by Anthony Shaw.

@item 
gh-102388@footnote{https://github.com/python/cpython/issues/102388}: Fix a bug where @code{iso2022_jp_3} and @code{iso2022_jp_2004} codecs
read out of bounds

@item 
gh-111366@footnote{https://github.com/python/cpython/issues/111366}: Fix an issue in the @ref{1d,,codeop} that was causing
@ref{18f,,SyntaxError} exceptions raised in the presence of invalid syntax to
not contain precise error messages. Patch by Pablo Galindo

@item 
gh-111380@footnote{https://github.com/python/cpython/issues/111380}: Fix a bug that was causing @ref{1af,,SyntaxWarning} to appear twice
when parsing if invalid syntax is encountered later. Patch by Pablo
galindo

@item 
gh-111374@footnote{https://github.com/python/cpython/issues/111374}: Added a new environment variable
@geindex PYTHON_FROZEN_MODULES
@geindex environment variable; PYTHON_FROZEN_MODULES
@ref{4ae,,PYTHON_FROZEN_MODULES}. It determines whether or not frozen
modules are ignored by the import machinery, equivalent of the @ref{170,,-X frozen_modules} command-line option.

@item 
gh-111354@footnote{https://github.com/python/cpython/issues/111354}: Remove @code{oparg} from @ref{5ba,,YIELD_VALUE}. Change @code{oparg}
of @ref{5bb,,RESUME} to include information about the except-depth. These
changes make it possible to simplify the code in generator close.

@item 
gh-94438@footnote{https://github.com/python/cpython/issues/94438}: Fix a regression that prevented jumping across @code{is None} and
@code{is not None} when debugging. Patch by Savannah Ostrowski.

@item 
gh-67224@footnote{https://github.com/python/cpython/issues/67224}: Show source lines in tracebacks when using the @code{-c} option
when running Python. Patch by Pablo Galindo

@item 
gh-111123@footnote{https://github.com/python/cpython/issues/111123}: Fix a bug where a @ref{4ad,,global} declaration in an
@ref{1ac,,except} block is rejected when the global is used in the
@ref{17d,,else} block.

@item 
gh-110938@footnote{https://github.com/python/cpython/issues/110938}: Fix error messages for indented blocks with functions and
classes with generic type parameters. Patch by Pablo Galindo

@item 
gh-109214@footnote{https://github.com/python/cpython/issues/109214}: Remove unnecessary instruction pointer updates before returning
from frames.

@item 
gh-110912@footnote{https://github.com/python/cpython/issues/110912}: Correctly display the traceback for @ref{1761,,MemoryError}
exceptions using the @ref{105,,traceback} module. Patch by Pablo Galindo

@item 
gh-109894@footnote{https://github.com/python/cpython/issues/109894}: Fixed crash due to improperly initialized static
@ref{1761,,MemoryError} in subinterpreter.

@item 
gh-110892@footnote{https://github.com/python/cpython/issues/110892}: Return @code{NULL} for @code{PyTrace_RETURN} events caused by an
exception

@item 
gh-110864@footnote{https://github.com/python/cpython/issues/110864}: Fix argument parsing by @code{_PyArg_UnpackKeywordsWithVararg} for
functions defining pos-or-keyword, vararg, and kw-only parameters.

@item 
gh-109094@footnote{https://github.com/python/cpython/issues/109094}: Replace @code{prev_instr} on the interpreter frame by
@code{instr_ptr} which points to the beginning of the instruction that is
currently executing (or will execute once the frame resumes).

@item 
gh-110805@footnote{https://github.com/python/cpython/issues/110805}: Allow the repl to show source code and complete tracebacks.
Patch by Pablo Galindo

@item 
gh-110722@footnote{https://github.com/python/cpython/issues/110722}: Add 
@geindex PYTHON_PRESITE=package.module
@geindex environment variable; PYTHON_PRESITE=package.module
@code{PYTHON_PRESITE=package.module} to import a module
early in the interpreter lifecycle before @code{site.py} is executed.  Python
needs to be @ref{50a,,built in debug mode} for this option to
exist.

@item 
gh-110481@footnote{https://github.com/python/cpython/issues/110481}: Implement biased reference counting in @code{--disable-gil}
builds.

@item 
gh-110543@footnote{https://github.com/python/cpython/issues/110543}: Fix regression in Python 3.12 where
@code{types.CodeType.replace()} would produce a broken code object if
called on a module or class code object that contains a comprehension.
Patch by Jelle Zijlstra.

@item 
gh-89519@footnote{https://github.com/python/cpython/issues/89519}: Removed chained @ref{48f,,classmethod} descriptors (introduced in
bpo-19072@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19072}).  This can no longer be used to wrap other descriptors
such as @ref{4b4,,property}.  The core design of this feature was flawed and
caused a number of downstream problems.  To “pass-through” a
@code{classmethod}, consider using the @code{__wrapped__} attribute
that was added in Python 3.10.

@item 
gh-103615@footnote{https://github.com/python/cpython/issues/103615}: Use local events for opcode tracing

@item 
bpo-46657@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46657}: Add mimalloc memory allocator support.

@item 
gh-106718@footnote{https://github.com/python/cpython/issues/106718}: When PyConfig.stdlib_dir is explicitly set, it’s now respected
and won’t be overridden by PyConfig.home.

@item 
gh-106905@footnote{https://github.com/python/cpython/issues/106905}: Fix incorrect SystemError about AST constructor recursion depth
mismatch.

@item 
gh-100445@footnote{https://github.com/python/cpython/issues/100445}: Improve error message for unterminated strings with escapes.

@item 
bpo-45759@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45759}: Improved error messages for @code{elif}/@code{else} statements not
matching any valid statements. Patch by Jeremiah Vivian.
@end itemize

@node Library<67>,Tests<22>,Core and Builtins<62>,Python 3 13 0 alpha 2
@anchor{whatsnew/changelog id298}@anchor{1a80}
@subsubsection Library



@itemize -

@item 
gh-111942@footnote{https://github.com/python/cpython/issues/111942}: Fix SystemError in the TextIOWrapper constructor with
non-encodable “errors” argument in non-debug mode.

@item 
gh-111995@footnote{https://github.com/python/cpython/issues/111995}: Added the @code{NI_IDN} constant to the @ref{d1,,socket} module when
present in C at build time for use with @ref{1a81,,socket.getnameinfo()}.

@item 
gh-109538@footnote{https://github.com/python/cpython/issues/109538}: Issue warning message instead of having @ref{246,,RuntimeError}
be displayed when event loop has already been closed at
@code{StreamWriter.__del__()}.

@item 
gh-111942@footnote{https://github.com/python/cpython/issues/111942}: Fix crashes in @ref{d46,,io.TextIOWrapper.reconfigure()} when pass
invalid arguments, e.g. non-string encoding.

@item 
gh-111460@footnote{https://github.com/python/cpython/issues/111460}: @ref{2f,,curses}: restore wide character support (including
@ref{12a4,,curses.unget_wch()} and @ref{12a3,,get_wch()}) on macOS,
which was unavailable due to a regression in Python 3.12.

@item 
gh-103791@footnote{https://github.com/python/cpython/issues/103791}: @ref{112e,,contextlib.suppress} now supports suppressing
exceptions raised as part of a @ref{566,,BaseExceptionGroup}, in addition to
the recent support for @ref{4d3,,ExceptionGroup}.

@item 
gh-111835@footnote{https://github.com/python/cpython/issues/111835}: The @ref{51a,,mmap.mmap} class now has an
@ref{51b,,seekable()} method that can be used when a seekable
file-like object is required. The @ref{51c,,seek()} method now
returns the new absolute position. Patch by Donghee Na.

@item 
gh-111804@footnote{https://github.com/python/cpython/issues/111804}: Remove posix.fallocate() under WASI as the underlying
posix_fallocate() is not available in WASI preview2.

@item 
gh-111841@footnote{https://github.com/python/cpython/issues/111841}: Fix truncating arguments on an embedded null character in
@ref{25d,,os.putenv()} and @ref{25e,,os.unsetenv()} on Windows.

@item 
gh-111768@footnote{https://github.com/python/cpython/issues/111768}: @ref{1a82,,wsgiref.util.is_hop_by_hop()} is now exposed correctly in
@code{__all__}.

@item 
gh-80731@footnote{https://github.com/python/cpython/issues/80731}: Avoid executing the default function in @ref{1897,,cmd.Cmd} in an
except block

@item 
gh-111541@footnote{https://github.com/python/cpython/issues/111541}: Fix @ref{3e,,doctest} for @ref{18f,,SyntaxError} not-builtin
subclasses.

@item 
gh-111719@footnote{https://github.com/python/cpython/issues/111719}: Add extra argument validation for @code{alias} command in
@ref{aa,,pdb}

@item 
gh-111482@footnote{https://github.com/python/cpython/issues/111482}: @ref{f4,,time}: Make @ref{136a,,time.clock_gettime()} and
@ref{ce1,,time.clock_gettime_ns()} functions up to 2x faster by faster calling
convention. Patch by Victor Stinner.

@item 
gh-110894@footnote{https://github.com/python/cpython/issues/110894}: Call loop exception handler for exceptions in
@code{client_connected_cb} of @ref{d15,,asyncio.start_server()} so that
applications can handle it. Patch by Kumar Aditya.

@item 
gh-111531@footnote{https://github.com/python/cpython/issues/111531}: Fix reference leaks in @code{bind_class()} and @code{bind_all()}
methods of @ref{f6,,tkinter} widgets.

@item 
gh-111246@footnote{https://github.com/python/cpython/issues/111246}: @ref{4cb,,asyncio.loop.create_unix_server()} will now automatically
remove the Unix socket when the server is closed.

@item 
gh-111356@footnote{https://github.com/python/cpython/issues/111356}: Added @ref{1a83,,io.text_encoding()}, @ref{1a84,,io.DEFAULT_BUFFER_SIZE},
and @ref{17b4,,io.IncrementalNewlineDecoder} to @code{io.__all__}.

@item 
gh-66425@footnote{https://github.com/python/cpython/issues/66425}: Remove the code to set the REMOTE_HOST header from wsgiref
module, as it is unreachable. This header is used for performance reasons,
which is not necessary in the wsgiref module.

@item 
gh-111429@footnote{https://github.com/python/cpython/issues/111429}: Speed up @ref{2ff,,pathlib.PurePath.relative_to()} and
@ref{300,,is_relative_to()}.

@item 
gh-111342@footnote{https://github.com/python/cpython/issues/111342}: Fixed typo in @ref{6c0,,math.sumprod()}.

@item 
gh-68166@footnote{https://github.com/python/cpython/issues/68166}: Remove mention of not supported “vsapi” element type in
@ref{55f,,tkinter.ttk.Style.element_create()}. Add tests for
@code{element_create()} and other @code{ttk.Style} methods. Add examples for
@code{element_create()} in the documentation.

@item 
gh-111388@footnote{https://github.com/python/cpython/issues/111388}: Add @code{show_group} parameter to
@ref{a54,,traceback.format_exception_only()}, which allows to format
@ref{4d3,,ExceptionGroup} instances.

@item 
gh-79033@footnote{https://github.com/python/cpython/issues/79033}: Another attempt at fixing @ref{1a85,,asyncio.Server.wait_closed()}. It
now blocks until both conditions are true: the server is closed, `and'
there are no more active connections. (This means that in some cases where
in 3.12.0 this function would `incorrectly' have returned immediately, it
will now block; in particular, when there are no active connections but
the server hasn’t been closed yet.)

@item 
gh-111259@footnote{https://github.com/python/cpython/issues/111259}: Optimize recursive wildcards in @ref{a8,,pathlib}.

@item 
gh-111295@footnote{https://github.com/python/cpython/issues/111295}: Fix @ref{f4,,time} not checking for errors when initializing.

@item 
gh-111253@footnote{https://github.com/python/cpython/issues/111253}: Add error checking during @code{_socket} module init.

@item 
gh-111251@footnote{https://github.com/python/cpython/issues/111251}: Fix @code{_blake2} not checking for errors when initializing.

@item 
gh-111233@footnote{https://github.com/python/cpython/issues/111233}: Fix @ref{c6,,select} not checking for errors when initializing.

@item 
gh-111230@footnote{https://github.com/python/cpython/issues/111230}: Fix @ref{d5,,ssl} not checking for errors when initializing.

@item 
gh-111174@footnote{https://github.com/python/cpython/issues/111174}: Fix crash in @ref{13fd,,io.BytesIO.getbuffer()} called repeatedly for
empty BytesIO.

@item 
gh-111187@footnote{https://github.com/python/cpython/issues/111187}: Postpone removal version for locale.getdefaultlocale() to
Python 3.15.

@item 
gh-111159@footnote{https://github.com/python/cpython/issues/111159}: Fix @ref{3e,,doctest} output comparison for exceptions with notes.

@item 
gh-110910@footnote{https://github.com/python/cpython/issues/110910}: Fix invalid state handling in @ref{4d2,,asyncio.TaskGroup} and
@ref{1a86,,asyncio.Timeout}. They now raise proper RuntimeError if they are
improperly used and are left in consistent state after this.

@item 
gh-111092@footnote{https://github.com/python/cpython/issues/111092}: Make turtledemo run without default root enabled.

@item 
gh-110944@footnote{https://github.com/python/cpython/issues/110944}: Support alias and convenience vars for @ref{aa,,pdb} completion

@item 
gh-110745@footnote{https://github.com/python/cpython/issues/110745}: Added `newline' parameter to @ref{104b,,pathlib.Path.read_text()}.
Patch by Junya Okabe.

@item 
gh-84583@footnote{https://github.com/python/cpython/issues/84583}: Make @ref{aa,,pdb} enter post-mortem mode even for
@ref{18f,,SyntaxError}

@item 
gh-80675@footnote{https://github.com/python/cpython/issues/80675}: Set @code{f_trace_lines = True} on all frames upon
@ref{274,,pdb.set_trace()}

@item 
gh-110771@footnote{https://github.com/python/cpython/issues/110771}: Expose the setup and cleanup portions of
@code{asyncio.run_forever()} as the standalone methods
@code{asyncio.run_forever_setup()} and @code{asyncio.run_forever_cleanup()}.
This allows for tighter integration with GUI event loops.

@item 
gh-110774@footnote{https://github.com/python/cpython/issues/110774}: Support setting the @ref{2f7,,asyncio.Runner} loop_factory kwarg
in @ref{35f,,unittest.IsolatedAsyncioTestCase}

@item 
gh-110392@footnote{https://github.com/python/cpython/issues/110392}: Fix @ref{1a87,,tty.setraw()} and @ref{1a3a,,tty.setcbreak()}: previously
they returned partially modified list of the original tty attributes.
@ref{1a88,,tty.cfmakeraw()} and @ref{1a3b,,tty.cfmakecbreak()} now make a copy of the
list of special characters before modifying it.

@item 
gh-59013@footnote{https://github.com/python/cpython/issues/59013}: Make line number of function breakpoint more precise in
@ref{aa,,pdb}

@item 
gh-88434@footnote{https://github.com/python/cpython/issues/88434}: Emit deprecation warning for non-integer numbers in
@ref{67,,gettext} functions and methods that consider plural forms even if
the translation was not found.

@item 
gh-110395@footnote{https://github.com/python/cpython/issues/110395}: Ensure that @ref{1a89,,select.kqueue()} objects correctly appear as
closed in forked children, to prevent operations on an invalid file
descriptor.

@item 
gh-110196@footnote{https://github.com/python/cpython/issues/110196}: Add @code{__reduce__} method to @code{IPv6Address} in order to
keep @code{scope_id}

@item 
gh-109747@footnote{https://github.com/python/cpython/issues/109747}: Improve errors for unsupported look-behind patterns. Now
re.error is raised instead of OverflowError or RuntimeError for too large
width of look-behind pattern.

@item 
gh-109466@footnote{https://github.com/python/cpython/issues/109466}: Add the @ref{50c,,ipaddress.IPv4Address.ipv6_mapped} property,
which returns the IPv4-mapped IPv6 address.

@item 
gh-85098@footnote{https://github.com/python/cpython/issues/85098}: Implement the CLI of the @ref{de,,symtable} module and improve the
repr of @ref{28b,,Symbol}.

@item 
gh-108791@footnote{https://github.com/python/cpython/issues/108791}: Improved error handling in @ref{aa,,pdb} command line interface,
making it produce more concise error messages.

@item 
gh-105931@footnote{https://github.com/python/cpython/issues/105931}: Change @ref{21,,compileall} to only strip the stripdir prefix from
the full path recorded in the compiled @code{.pyc} file, when the prefix
matches the start of the full path in its entirety. When the prefix does
not match, no stripping is performed and a warning to this effect is
displayed.

Previously all path components of the stripdir prefix that matched the
full path were removed, while those that did not match were left alone
(including ones interspersed between matching components).

@item 
gh-107431@footnote{https://github.com/python/cpython/issues/107431}: Make the @code{DictProxy} and @code{ListProxy} types in
@ref{9b,,multiprocessing.managers} @ref{8c3,,Generic Alias Types} for @code{[]} use in typing contexts.

@item 
gh-72904@footnote{https://github.com/python/cpython/issues/72904}: Add @ref{4fc,,glob.translate()}. This function converts a pathname
with shell-style wildcards to a regular expression.

@item 
gh-90026@footnote{https://github.com/python/cpython/issues/90026}: Define @code{USE_XATTRS} on Cygwin so that XATTR-related functions
in the @ref{a5,,os} module become available.

@item 
gh-90890@footnote{https://github.com/python/cpython/issues/90890}: New methods @ref{1a8a,,mailbox.Maildir.get_info()},
@ref{1a8b,,mailbox.Maildir.set_info()}, @ref{1a8c,,mailbox.Maildir.get_flags()},
@ref{1a8d,,mailbox.Maildir.set_flags()}, @ref{1a8e,,mailbox.Maildir.add_flag()},
@ref{1a8f,,mailbox.Maildir.remove_flag()}. These methods speed up accessing a
message’s info and/or flags and are useful when it is not necessary to
access the message’s contents, as when iterating over a Maildir to find
messages with specific flags.

@item 
gh-102956@footnote{https://github.com/python/cpython/issues/102956}: Fix returning of empty byte strings after seek in zipfile
module

@item 
gh-102895@footnote{https://github.com/python/cpython/issues/102895}: Added a parameter @code{local_exit} for @ref{18d7,,code.interact()} to
prevent @code{exit()} and @code{quit} from closing @code{sys.stdin} and raise
@code{SystemExit}.

@item 
gh-97928@footnote{https://github.com/python/cpython/issues/97928}: Change the behavior of @ref{1a36,,tkinter.Text.count()}. It now always
returns an integer if one or less counting options are specified.
Previously it could return a single count as a 1-tuple, an integer (only
if option @code{"update"} was specified) or @code{None} if no items found. The
result is now the same if @code{wantobjects} is set to @code{0}.

@item 
gh-96954@footnote{https://github.com/python/cpython/issues/96954}: Switch the storage of the unicode codepoint names to use a
different data-structure, a directed acyclic word graph@footnote{https://en.wikipedia.org/wiki/Deterministic_acyclic_finite_state_automaton}.
This makes the unicodedata shared library about 440 KiB smaller.
Contributed by Carl Friedrich Bolz-Tereick using code from the PyPy
project.

@item 
gh-73561@footnote{https://github.com/python/cpython/issues/73561}: Omit the interface scope from an IPv6 address when used as Host
header by @ref{73,,http.client}.

@item 
gh-86826@footnote{https://github.com/python/cpython/issues/86826}: @code{zipinfo} now supports the full range of values in the TZ
string determined by RFC 8536 and detects all invalid formats. Both Python
and C implementations now raise exceptions of the same type on invalid
data.
@end itemize

@node Tests<22>,Build<25>,Library<67>,Python 3 13 0 alpha 2
@anchor{whatsnew/changelog id299}@anchor{1a90}
@subsubsection Tests



@itemize -

@item 
gh-111808@footnote{https://github.com/python/cpython/issues/111808}: Make the default value of @code{test.support.infinite_recursion()}
to be conditional based on whether optimizations were used when compiling
the interpreter. This helps with platforms like WASI whose stack size is
greatly restricted in debug builds.

@item 
gh-110722@footnote{https://github.com/python/cpython/issues/110722}: Gathering line coverage of standard libraries within the
regression test suite is now precise, as well as much faster. Patch by
Łukasz Langa.

@item 
gh-110367@footnote{https://github.com/python/cpython/issues/110367}: Make regrtest @code{--verbose3} option compatible with
@code{--huntrleaks -jN} options. The @code{./python -m test -j1 -R 3:3
--verbose3} command now works as expected. Patch by Victor Stinner.

@item 
gh-111165@footnote{https://github.com/python/cpython/issues/111165}: Remove no longer used functions @code{run_unittest()} and
@code{run_doctest()} from the @ref{ea,,test.support} module.

@item 
gh-110932@footnote{https://github.com/python/cpython/issues/110932}: Fix regrtest if the @code{SOURCE_DATE_EPOCH} environment variable
is defined: use the variable value as the random seed. Patch by Victor
Stinner.

@item 
gh-110995@footnote{https://github.com/python/cpython/issues/110995}: test_gdb: Fix detection of gdb built without Python scripting
support. Patch by Victor Stinner.

@item 
gh-110918@footnote{https://github.com/python/cpython/issues/110918}: Test case matching patterns specified by options @code{--match},
@code{--ignore}, @code{--matchfile} and @code{--ignorefile} are now tested in the
order of specification, and the last match determines whether the test
case be run or ignored.

@item 
gh-108747@footnote{https://github.com/python/cpython/issues/108747}: Add unit test for @code{usercustomize} and @code{sitecustomize} hooks
from @ref{cc,,site}.
@end itemize

@node Build<25>,Windows<22>,Tests<22>,Python 3 13 0 alpha 2
@anchor{whatsnew/changelog id300}@anchor{1a91}
@subsubsection Build



@itemize -

@item 
gh-96954@footnote{https://github.com/python/cpython/issues/96954}: Make @code{make regen-unicodedata} work for out-of-tree builds of
CPython.

@item 
gh-112088@footnote{https://github.com/python/cpython/issues/112088}: Add @code{Tools/build/regen-configure.sh} script to regenerate the
@code{configure} with an Ubuntu container image. The
@code{quay.io/tiran/cpython_autoconf:271} container image
(tiran/cpython_autoconf@footnote{https://github.com/tiran/cpython_autoconf}) is
no longer used. Patch by Victor Stinner.

@item 
gh-111046@footnote{https://github.com/python/cpython/issues/111046}: For wasi-threads, memory is now exported to fix compatibility
issues with some wasm runtimes.

@item 
gh-110828@footnote{https://github.com/python/cpython/issues/110828}: AIX 32bit needs @code{-latomic} to build the @code{_testcapi}
extension module.

@item 
gh-85283@footnote{https://github.com/python/cpython/issues/85283}: The @code{errno}, @code{md5}, @code{resource}, @code{winsound},
@code{_ctypes_test}, @code{_multiprocessing.posixshmem}, @code{_scproxy},
@code{_stat}, @code{_testimportmultiple} and @code{_uuid} C extensions are now
built with the @ref{637,,limited C API}. Patch by Victor
Stinner.
@end itemize

@node Windows<22>,macOS<16>,Build<25>,Python 3 13 0 alpha 2
@anchor{whatsnew/changelog id301}@anchor{1a92}
@subsubsection Windows



@itemize -

@item 
gh-111856@footnote{https://github.com/python/cpython/issues/111856}: Fixes @ref{f92,,fstat()} on file systems that do not support
file ID requests. This includes FAT32 and exFAT.

@item 
gh-111293@footnote{https://github.com/python/cpython/issues/111293}: Fix @ref{1a93,,os.DirEntry.inode} dropping higher 64 bits of a file
id on some filesystems on Windows.

@item 
gh-110913@footnote{https://github.com/python/cpython/issues/110913}: WindowsConsoleIO now correctly chunks large buffers without
splitting up UTF-8 sequences.
@end itemize

@node macOS<16>,IDLE<13>,Windows<22>,Python 3 13 0 alpha 2
@anchor{whatsnew/changelog id302}@anchor{1a94}
@subsubsection macOS



@itemize -

@item 
gh-59703@footnote{https://github.com/python/cpython/issues/59703}: For macOS framework builds, in @code{getpath.c} use the system
@code{dladdr} function to find the path to the shared library rather than
depending on deprecated macOS APIs.

@item 
gh-110950@footnote{https://github.com/python/cpython/issues/110950}: Update macOS installer to include an upstream Tcl/Tk fix for
the @code{Secure coding is not enabled for restorable state!} warning
encountered in Tkinter on macOS 14 Sonoma.

@item 
gh-111015@footnote{https://github.com/python/cpython/issues/111015}: Ensure that IDLE.app and Python Launcher.app are installed with
appropriate permissions on macOS builds.

@item 
gh-71383@footnote{https://github.com/python/cpython/issues/71383}: Update macOS installer to include an upstream Tcl/Tk fix for the
@code{ttk::ThemeChanged} error encountered in Tkinter.

@item 
gh-92603@footnote{https://github.com/python/cpython/issues/92603}: Update macOS installer to include a fix accepted by upstream
Tcl/Tk for a crash encountered after the first @ref{19ee,,tkinter.Tk()} instance
is destroyed.
@end itemize

@node IDLE<13>,Tools/Demos<18>,macOS<16>,Python 3 13 0 alpha 2
@anchor{whatsnew/changelog id303}@anchor{1a95}
@subsubsection IDLE



@itemize -

@item 
bpo-35668@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35668}: Add docstrings to the IDLE debugger module. Fix two bugs:
initialize @code{Idb.botframe} (should be in Bdb); in @code{Idb.in_rpc_code},
check whether @code{prev_frame} is @code{None} before trying to use it. Greatly
expand test_debugger.
@end itemize

@node Tools/Demos<18>,C API<24>,IDLE<13>,Python 3 13 0 alpha 2
@anchor{whatsnew/changelog id304}@anchor{1a96}
@subsubsection Tools/Demos



@itemize -

@item 
gh-111903@footnote{https://github.com/python/cpython/issues/111903}: Argument Clinic now supports the @code{@@critical_section}
directive that instructs Argument Clinic to generate a critical section
around the function call, which locks the @code{self} object in
@code{--disable-gil} builds. Patch by Sam Gross.
@end itemize

@node C API<24>,,Tools/Demos<18>,Python 3 13 0 alpha 2
@anchor{whatsnew/changelog id305}@anchor{1a97}
@subsubsection C API



@itemize -

@item 
gh-112026@footnote{https://github.com/python/cpython/issues/112026}: Add again the private @code{_PyThreadState_UncheckedGet()}
function as an alias to the new public
@ref{421,,PyThreadState_GetUnchecked()} function. Patch by Victor Stinner.

@item 
gh-112026@footnote{https://github.com/python/cpython/issues/112026}: Restore the removed @code{_PyDict_GetItemStringWithError()}
function. It is used by numpy. Patch by Victor Stinner.

@item 
gh-112026@footnote{https://github.com/python/cpython/issues/112026}: Restore removed private C API functions, macros and structures
which have no simple replacement for now:


@itemize *

@item 
_PyDict_GetItem_KnownHash()

@item 
_PyDict_NewPresized()

@item 
_PyHASH_BITS

@item 
_PyHASH_IMAG

@item 
_PyHASH_INF

@item 
_PyHASH_MODULUS

@item 
_PyHASH_MULTIPLIER

@item 
_PyLong_Copy()

@item 
_PyLong_FromDigits()

@item 
_PyLong_New()

@item 
_PyLong_Sign()

@item 
_PyObject_CallMethodId()

@item 
_PyObject_CallMethodNoArgs()

@item 
_PyObject_CallMethodOneArg()

@item 
_PyObject_CallOneArg()

@item 
_PyObject_EXTRA_INIT

@item 
_PyObject_FastCallDict()

@item 
_PyObject_GetAttrId()

@item 
_PyObject_Vectorcall()

@item 
_PyObject_VectorcallMethod()

@item 
_PyStack_AsDict()

@item 
_PyThread_CurrentFrames()

@item 
_PyUnicodeWriter structure

@item 
_PyUnicodeWriter_Dealloc()

@item 
_PyUnicodeWriter_Finish()

@item 
_PyUnicodeWriter_Init()

@item 
_PyUnicodeWriter_Prepare()

@item 
_PyUnicodeWriter_PrepareKind()

@item 
_PyUnicodeWriter_WriteASCIIString()

@item 
_PyUnicodeWriter_WriteChar()

@item 
_PyUnicodeWriter_WriteLatin1String()

@item 
_PyUnicodeWriter_WriteStr()

@item 
_PyUnicodeWriter_WriteSubstring()

@item 
_PyUnicode_AsString()

@item 
_PyUnicode_FromId()

@item 
_PyVectorcall_Function()

@item 
_Py_IDENTIFIER()

@item 
_Py_c_abs()

@item 
_Py_c_diff()

@item 
_Py_c_neg()

@item 
_Py_c_pow()

@item 
_Py_c_prod()

@item 
_Py_c_quot()

@item 
_Py_c_sum()

@item 
_Py_static_string()

@item 
_Py_static_string_init()
@end itemize

Patch by Victor Stinner.

@item 
gh-112026@footnote{https://github.com/python/cpython/issues/112026}: Add again @code{<ctype.h>} and @code{<unistd.h>} includes in
@code{Python.h}, but don’t include them in the limited C API version 3.13 and
newer. Patch by Victor Stinner.

@item 
gh-111956@footnote{https://github.com/python/cpython/issues/111956}: Add internal-only one-time initialization API: @code{_PyOnceFlag}
and @code{_PyOnceFlag_CallOnce}.

@item 
gh-111262@footnote{https://github.com/python/cpython/issues/111262}: Add @ref{420,,PyDict_Pop()} and @ref{5e5,,PyDict_PopString()}
functions: remove a key from a dictionary and optionally return the
removed value. This is similar to @ref{5e6,,dict.pop()}, but without the
default value and not raising @ref{5e7,,KeyError} if the key missing. Patch by
Stefan Behnel and Victor Stinner.

@item 
gh-111863@footnote{https://github.com/python/cpython/issues/111863}: Rename @code{Py_NOGIL} to @code{Py_GIL_DISABLED}. Patch by Hugo van
Kemenade.

@item 
gh-111138@footnote{https://github.com/python/cpython/issues/111138}: Add @ref{600,,PyList_Extend()} and @ref{601,,PyList_Clear()}
functions: similar to Python @code{list.extend()} and @code{list.clear()}
methods. Patch by Victor Stinner.

@item 
gh-108765@footnote{https://github.com/python/cpython/issues/108765}: On Windows, @code{Python.h} no longer includes the @code{<stddef.h>}
standard header file. If needed, it should now be included explicitly.
Patch by Victor Stinner.

@item 
gh-111569@footnote{https://github.com/python/cpython/issues/111569}: Implement “Python Critical Sections” from 
@geindex Python Enhancement Proposals; PEP 703
PEP 703@footnote{https://peps.python.org/pep-0703/}. These are
macros to help replace the GIL with per-object locks in the
@code{--disable-gil} build of CPython. The macros are no-ops in the default
build.

@item 
gh-111506@footnote{https://github.com/python/cpython/issues/111506}: In the limited C API version 3.13, @ref{aae,,Py_SET_REFCNT()}
function is now implemented as an opaque function call. Patch by Victor
Stinner.

@item 
gh-108082@footnote{https://github.com/python/cpython/issues/108082}: Add @ref{5f1,,PyErr_FormatUnraisable()} function.

@item 
gh-110964@footnote{https://github.com/python/cpython/issues/110964}: Move the undocumented private _PyArg functions and
_PyArg_Parser structure to internal C API (@code{pycore_modsupport.h}). Patch
by Victor Stinner.

@item 
gh-110815@footnote{https://github.com/python/cpython/issues/110815}: Support non-ASCII keyword names in
@ref{624,,PyArg_ParseTupleAndKeywords()}.

@item 
gh-109587@footnote{https://github.com/python/cpython/issues/109587}: Introduced @code{PyUnstable_PerfTrampoline_CompileCode()},
@code{PyUnstable_PerfTrampoline_SetPersistAfterFork()} and
@code{PyUnstable_CopyPerfMapFile()}. These functions allow extension
modules to initialize trampolines eagerly, after the application is
“warmed up”. This makes it possible to have perf-trampolines running in an
always-enabled fashion.

@item 
gh-85283@footnote{https://github.com/python/cpython/issues/85283}: Add the @ref{613,,PySys_Audit()} function to the limited C API.
Patch by Victor Stinner.

@item 
gh-85283@footnote{https://github.com/python/cpython/issues/85283}: Add @ref{631,,PyMem_RawMalloc()}, @ref{632,,PyMem_RawCalloc()},
@ref{633,,PyMem_RawRealloc()} and @ref{634,,PyMem_RawFree()} to the limited C
API. Patch by Victor Stinner.

@item 
gh-106672@footnote{https://github.com/python/cpython/issues/106672}: Functions @ref{628,,PyDict_GetItem()},
@ref{629,,PyDict_GetItemString()}, @ref{620,,PyMapping_HasKey()},
@ref{622,,PyMapping_HasKeyString()}, @ref{61c,,PyObject_HasAttr()},
@ref{61e,,PyObject_HasAttrString()}, and @ref{62a,,PySys_GetObject()}, which
clear all errors occurred during calling the function, report now them
using @ref{508,,sys.unraisablehook()}.

@item 
gh-67565@footnote{https://github.com/python/cpython/issues/67565}: Remove redundant C-contiguity check in @code{getargs.c},
@ref{11,,binascii}, @ref{d5,,ssl} and Argument Clinic. Patched by Stefan Krah
and Furkan Onder
@end itemize

@node Python 3 13 0 alpha 1,Python 3 12 0 beta 1,Python 3 13 0 alpha 2,Changelog
@anchor{whatsnew/changelog python-3-13-0-alpha-1}@anchor{1a98}
@subsection Python 3.13.0 alpha 1


`Release date: 2023-10-13'

@menu
* Security: Security<25>. 
* Core and Builtins: Core and Builtins<63>. 
* Library: Library<68>. 
* Documentation: Documentation<23>. 
* Tests: Tests<23>. 
* Build: Build<26>. 
* Windows: Windows<23>. 
* macOS: macOS<17>. 
* IDLE: IDLE<14>. 
* Tools/Demos: Tools/Demos<19>. 
* C API: C API<25>. 

@end menu

@node Security<25>,Core and Builtins<63>,,Python 3 13 0 alpha 1
@anchor{whatsnew/changelog id306}@anchor{1a99}
@subsubsection Security



@itemize -

@item 
gh-108310@footnote{https://github.com/python/cpython/issues/108310}: Fixed an issue where instances of @ref{aed,,ssl.SSLSocket} were
vulnerable to a bypass of the TLS handshake and included protections (like
certificate verification) and treating sent unencrypted data as if it were
post-handshake TLS encrypted data.  Security issue reported as
@geindex Common Vulnerabilities and Exposures; CVE 2023-40217
CVE 2023-40217@footnote{https://www.cve.org/CVERecord?id=CVE-2023-40217} by Aapo Oksman. Patch by Gregory P. Smith.

@item 
gh-107774@footnote{https://github.com/python/cpython/issues/107774}: PEP 669 specifies that @code{sys.monitoring.register_callback}
will generate an audit event. Pre-releases of Python 3.12 did not generate
the audit event. This is now fixed.

@item 
gh-102988@footnote{https://github.com/python/cpython/issues/102988}: Reverted the @ref{54,,email.utils} security improvement change
released in 3.12beta4 that unintentionally caused
@ref{4f4,,email.utils.getaddresses} to fail to parse email addresses with a
comma in the quoted name field. See gh-106669@footnote{https://github.com/python/cpython/issues/106669}.

@item 
gh-99108@footnote{https://github.com/python/cpython/issues/99108}: Refresh our new HACL* built-in @ref{6c,,hashlib} code from
upstream. Built-in SHA2 should be faster and an issue with SHA3 on 32-bit
platforms is fixed.

@item 
gh-102509@footnote{https://github.com/python/cpython/issues/102509}: Start initializing @code{ob_digit} during creation of
@ref{39c,,PyLongObject} objects. Patch by Illia Volochii.
@end itemize

@node Core and Builtins<63>,Library<68>,Security<25>,Python 3 13 0 alpha 1
@anchor{whatsnew/changelog id307}@anchor{1a9a}
@subsubsection Core and Builtins



@itemize -

@item 
gh-110782@footnote{https://github.com/python/cpython/issues/110782}: Fix crash when @ref{487,,typing.TypeVar} is constructed with a
keyword argument. Patch by Jelle Zijlstra.

@item 
gh-110752@footnote{https://github.com/python/cpython/issues/110752}: Reset @code{ceval.eval_breaker} in @code{interpreter_clear()}

@item 
gh-110721@footnote{https://github.com/python/cpython/issues/110721}: Use the @ref{105,,traceback} implementation for the default
@code{PyErr_Display()} functionality. Patch by Pablo Galindo

@item 
gh-110696@footnote{https://github.com/python/cpython/issues/110696}: Fix incorrect error message for invalid argument unpacking.
Patch by Pablo Galindo

@item 
gh-104169@footnote{https://github.com/python/cpython/issues/104169}: Split the tokenizer into two separate directories: - One part
includes the actual lexeme producing logic and lives in @code{Parser/lexer}.
- The second part wraps the lexer according to the different tokenization
modes   we have (string, utf-8, file, interactive, readline) and lives in
@code{Parser/tokenizer}.

@item 
gh-110688@footnote{https://github.com/python/cpython/issues/110688}: Remove undocumented @code{test_c_api} method from @ref{185,,set},
which was only defined for testing purposes under @code{Py_DEBUG}. Now we
have proper CAPI tests.

@item 
gh-104584@footnote{https://github.com/python/cpython/issues/104584}: Fix a reference leak when running with 
@geindex PYTHONUOPS
@geindex environment variable; PYTHONUOPS
@code{PYTHONUOPS} or
@ref{170,,-X uops} enabled.

@item 
gh-110514@footnote{https://github.com/python/cpython/issues/110514}: Add @code{PY_THROW} to @ref{170a,,sys.setprofile()} events

@item 
gh-110489@footnote{https://github.com/python/cpython/issues/110489}: Optimise @ref{15ca,,math.ceil()} when the input is exactly a float,
resulting in about a 10% improvement.

@item 
gh-110455@footnote{https://github.com/python/cpython/issues/110455}: Guard @code{assert(tstate->thread_id > 0)} with @code{#ifndef
HAVE_PTHREAD_STUBS}. This allows for for pydebug builds to work under
WASI which (currently) lacks thread support.

@item 
gh-110309@footnote{https://github.com/python/cpython/issues/110309}: Remove unnecessary empty constant nodes in the ast of f-string
specs.

@item 
gh-110259@footnote{https://github.com/python/cpython/issues/110259}: Correctly identify the format spec in f-strings (with single or
triple quotes) that have multiple lines in the expression part and include
a formatting spec. Patch by Pablo Galindo

@item 
gh-110237@footnote{https://github.com/python/cpython/issues/110237}: Fix missing error checks for calls to @code{PyList_Append} in
@code{_PyEval_MatchClass}.

@item 
gh-110164@footnote{https://github.com/python/cpython/issues/110164}: regrtest: If the @code{SOURCE_DATE_EPOCH} environment variable is
defined, regrtest now disables tests randomization. Patch by Victor
Stinner.

@item 
gh-109889@footnote{https://github.com/python/cpython/issues/109889}: Fix the compiler’s redundant NOP detection algorithm to skip
over NOPs with no line number when looking for the next instruction’s
lineno.

@item 
gh-109853@footnote{https://github.com/python/cpython/issues/109853}: @code{sys.path[0]} is now set correctly for subinterpreters.

@item 
gh-109923@footnote{https://github.com/python/cpython/issues/109923}: Set line number on the @code{POP_TOP} that follows a
@code{RETURN_GENERATOR}.

@item 
gh-105716@footnote{https://github.com/python/cpython/issues/105716}: Subinterpreters now correctly handle the case where they have
threads running in the background.  Before, such threads would interfere
with cleaning up and destroying them, as well as prevent running another
script.

@item 
gh-109369@footnote{https://github.com/python/cpython/issues/109369}: The internal eval_breaker and supporting flags, plus the
monitoring version have been merged into a single atomic integer to speed
up checks.

@item 
gh-109823@footnote{https://github.com/python/cpython/issues/109823}: Fix bug where compiler does not adjust labels when removing an
empty basic block which is a jump target.

@item 
gh-109793@footnote{https://github.com/python/cpython/issues/109793}: The main thread no longer exits prematurely when a
subinterpreter is cleaned up during runtime finalization.  The bug was a
problem particularly because, when triggered, the Python process would
always return with a 0 exitcode, even if it failed.

@item 
gh-109719@footnote{https://github.com/python/cpython/issues/109719}: Fix missing jump target labels when compiler reorders cold/warm
blocks.

@item 
gh-109595@footnote{https://github.com/python/cpython/issues/109595}: Add @ref{170,,-X cpu_count}  command line option to
override return results of @ref{4dc,,os.cpu_count()} and
@ref{4db,,os.process_cpu_count()}. This option is useful for users who need to
limit CPU resources of a container system without having to modify the
container (application code). Patch by Donghee Na.

@item 
gh-109627@footnote{https://github.com/python/cpython/issues/109627}: Fix bug where the compiler does not assign a new jump target
label to a duplicated small exit block.

@item 
gh-109596@footnote{https://github.com/python/cpython/issues/109596}: Fix some tokens in the grammar that were incorrectly marked as
soft keywords. Also fix some repeated rule names and ensure that repeated
rules are not allowed. Patch by Pablo Galindo

@item 
gh-109496@footnote{https://github.com/python/cpython/issues/109496}: On a Python built in debug mode, @ref{791,,Py_DECREF()} now
calls @code{_Py_NegativeRefcount()} if the object is a dangling pointer to
deallocated memory: memory filled with @code{0xDD} “dead byte” by the debug
hook on memory allocators. The fix is to check the reference count
`before' checking for @code{_Py_IsImmortal()}. Patch by Victor Stinner.

@item 
gh-107265@footnote{https://github.com/python/cpython/issues/107265}: Deopt opcodes hidden by the executor when base opcode is needed

@item 
gh-109371@footnote{https://github.com/python/cpython/issues/109371}: Deopted instructions correctly for tool initialization and
modified the incorrect assertion in instrumentation, when a previous tool
already sets INSTRUCTION events

@item 
gh-105658@footnote{https://github.com/python/cpython/issues/105658}: Fix bug where the line trace of an except block ending with a
conditional includes an excess event with the line of the conditional
expression.

@item 
gh-109219@footnote{https://github.com/python/cpython/issues/109219}: Fix compiling type param scopes that use a name which is also
free in an inner scope.

@item 
gh-109351@footnote{https://github.com/python/cpython/issues/109351}: Fix crash when compiling an invalid AST involving a named
(walrus) expression.

@item 
gh-109341@footnote{https://github.com/python/cpython/issues/109341}: Fix crash when compiling an invalid AST involving a
@ref{1a9b,,ast.TypeAlias}.

@item 
gh-109195@footnote{https://github.com/python/cpython/issues/109195}: Fix source location for the @code{LOAD_*} instruction preceding a
@code{LOAD_SUPER_ATTR} to load the @code{super} global (or shadowing variable)
so that it encompasses only the name @code{super} and not the following
parentheses.

@item 
gh-109256@footnote{https://github.com/python/cpython/issues/109256}: Opcode IDs for specialized opcodes are allocated in their own
range to improve stability of the IDs for the ‘real’ opcodes.

@item 
gh-109216@footnote{https://github.com/python/cpython/issues/109216}: Fix possible memory leak in @ref{367,,BUILD_MAP}.

@item 
gh-109207@footnote{https://github.com/python/cpython/issues/109207}: Fix a SystemError in @code{__repr__} of symtable entry object.

@item 
gh-109179@footnote{https://github.com/python/cpython/issues/109179}: Fix bug where the C traceback display drops notes from
@ref{18f,,SyntaxError}.

@item 
gh-109118@footnote{https://github.com/python/cpython/issues/109118}: Disallow nested scopes (lambdas, generator expressions, and
comprehensions) within PEP 695 annotation scopes that are nested within
classes.

@item 
gh-109156@footnote{https://github.com/python/cpython/issues/109156}: Add tests for de-instrumenting instructions while keeping the
instrumentation for lines

@item 
gh-109114@footnote{https://github.com/python/cpython/issues/109114}: Relax the detection of the error message for invalid lambdas
inside f-strings to not search for arbitrary replacement fields to avoid
false positives. Patch by Pablo Galindo

@item 
gh-105848@footnote{https://github.com/python/cpython/issues/105848}: Add a new @ref{370,,CALL_KW} opcode, used for calls containing
keyword arguments. Also, fix a possible crash when jumping over method
calls in a debugger.

@item 
gh-109052@footnote{https://github.com/python/cpython/issues/109052}: Use the base opcode when comparing code objects to avoid
interference from instrumentation

@item 
gh-109118@footnote{https://github.com/python/cpython/issues/109118}: Fix interpreter crash when a NameError is raised inside the
type parameters of a generic class.

@item 
gh-88943@footnote{https://github.com/python/cpython/issues/88943}: Improve syntax error for non-ASCII character that follows a
numerical literal. It now points on the invalid non-ASCII character, not
on the valid numerical literal.

@item 
gh-108976@footnote{https://github.com/python/cpython/issues/108976}: Fix crash that occurs after de-instrumenting a code object in a
monitoring callback.

@item 
gh-108732@footnote{https://github.com/python/cpython/issues/108732}: Make iteration variables of module- and class-scoped
comprehensions visible to pdb and other tools that use @code{frame.f_locals}
again.

@item 
gh-108959@footnote{https://github.com/python/cpython/issues/108959}: Fix caret placement for error locations for subscript and
binary operations that involve non-semantic parentheses and spaces. Patch
by Pablo Galindo

@item 
gh-104584@footnote{https://github.com/python/cpython/issues/104584}: Fix a crash when running with 
@geindex PYTHONUOPS
@geindex environment variable; PYTHONUOPS
@code{PYTHONUOPS} or
@ref{170,,-X uops} enabled and an error occurs during optimization.

@item 
gh-108727@footnote{https://github.com/python/cpython/issues/108727}: Define @code{tp_dealloc} for @code{CounterOptimizer_Type}. This fixes
a segfault on deallocation.

@item 
gh-108520@footnote{https://github.com/python/cpython/issues/108520}: Fix @code{multiprocessing.synchronize.SemLock.__setstate__()} to
properly initialize
@code{multiprocessing.synchronize.SemLock._is_fork_ctx}. This fixes a
regression when passing a SemLock across nested processes.

Rename @code{multiprocessing.synchronize.SemLock.is_fork_ctx} to
@code{multiprocessing.synchronize.SemLock._is_fork_ctx} to avoid exposing
it as public API.

@item 
gh-108654@footnote{https://github.com/python/cpython/issues/108654}: Restore locals shadowed by an inlined comprehension if the
comprehension raises an exception.

@item 
gh-108488@footnote{https://github.com/python/cpython/issues/108488}: Change the initialization of inline cache entries so that the
cache entry for @code{JUMP_BACKWARD} is initialized to zero, instead of the
@code{adaptive_counter_warmup()} value used for all other instructions. This
counter, unique among instructions, counts up from zero.

@item 
gh-108716@footnote{https://github.com/python/cpython/issues/108716}: Turn off deep-freezing of code objects. Modules are still
frozen, so that a file system search is not needed for common modules.

@item 
gh-108614@footnote{https://github.com/python/cpython/issues/108614}: Add RESUME_CHECK instruction, to avoid having to handle
instrumentation, signals, and contexts switches in the tier 2 execution
engine.

@item 
gh-108487@footnote{https://github.com/python/cpython/issues/108487}: Move an assert that would cause a spurious crash in a devious
case that should only trigger deoptimization.

@item 
gh-106176@footnote{https://github.com/python/cpython/issues/106176}: Use a @code{WeakValueDictionary} to track the lists containing the
modules each thread is currently importing. This helps avoid a reference
leak from keeping the list around longer than necessary. Weakrefs are used
as GC can’t interrupt the cleanup.

@item 
gh-105481@footnote{https://github.com/python/cpython/issues/105481}: The regen-opcode build stage was removed and its work is now
done in regen-cases.

@item 
gh-107901@footnote{https://github.com/python/cpython/issues/107901}: Fix missing line number on @ref{91c,,JUMP_BACKWARD} at the end
of a for loop.

@item 
gh-108113@footnote{https://github.com/python/cpython/issues/108113}: The @ref{4b2,,compile()} built-in can now accept a new flag,
@code{ast.PyCF_OPTIMIZED_AST}, which is similar to @code{ast.PyCF_ONLY_AST}
except that the returned @code{AST} is optimized according to the value of
the @code{optimize} argument.

@ref{1c4,,ast.parse()} now accepts an optional argument @code{optimize} which is
passed on to the @ref{4b2,,compile()} built-in. This makes it possible to
obtain an optimized @code{AST}.

@item 
gh-107971@footnote{https://github.com/python/cpython/issues/107971}: Opcode IDs are generated from bytecodes.c instead of being hard
coded in opcode.py.

@item 
gh-107944@footnote{https://github.com/python/cpython/issues/107944}: Improve error message for function calls with bad keyword
arguments. Patch by Pablo Galindo

@item 
gh-108390@footnote{https://github.com/python/cpython/issues/108390}: Raise an exception when setting a non-local event (@code{RAISE},
@code{EXCEPTION_HANDLED}, etc.) in @code{sys.monitoring.set_local_events}.

Fixes crash when tracing in recursive calls to Python classes.

@item 
gh-108035@footnote{https://github.com/python/cpython/issues/108035}: Remove the @code{_PyCFrame} struct, moving the pointer to the
current interpreter frame back to the threadstate, as it was for 3.10 and
earlier. The @code{_PyCFrame} existed as a performance optimization for
tracing. Since PEP 669 has been implemented, this optimization no longer
applies.

@item 
gh-91051@footnote{https://github.com/python/cpython/issues/91051}: Fix abort / segfault when using all eight type watcher slots, on
platforms where @code{char} is signed by default.

@item 
gh-106581@footnote{https://github.com/python/cpython/issues/106581}: Fix possible assertion failures and missing instrumentation
events when 
@geindex PYTHONUOPS
@geindex environment variable; PYTHONUOPS
@code{PYTHONUOPS} or @ref{170,,-X uops} is enabled.

@item 
gh-107526@footnote{https://github.com/python/cpython/issues/107526}: Revert converting @code{vars}, @code{dir}, @code{next}, @code{getattr}, and
@code{iter} to argument clinic.

@item 
gh-84805@footnote{https://github.com/python/cpython/issues/84805}: Autogenerate signature for @ref{16e0,,METH_NOARGS} and
@ref{1713,,METH_O} extension functions.

@item 
gh-107758@footnote{https://github.com/python/cpython/issues/107758}: Make the @code{dump_stack()} routine used by the @code{lltrace}
feature (low-level interpreter debugging) robust against recursion by
ensuring that it never calls a @code{__repr__} method implemented in Python.
Also make the similar output for Tier-2 uops appear on @code{stdout} (instead
of @code{stderr}), to match the @code{lltrace} code in ceval.c.

@item 
gh-107659@footnote{https://github.com/python/cpython/issues/107659}: Add docstrings for @ref{1a9c,,ctypes.pointer()} and
@ref{1f3,,ctypes.POINTER()}.

@item 
gh-105848@footnote{https://github.com/python/cpython/issues/105848}: Modify the bytecode so that the actual callable for a
@ref{917,,CALL} is at a consistent position on the stack (regardless of
whether or not bound-method-calling optimizations are active).

@item 
gh-107674@footnote{https://github.com/python/cpython/issues/107674}: Fixed performance regression in @code{sys.settrace}.

@item 
gh-107724@footnote{https://github.com/python/cpython/issues/107724}: In pre-release versions of 3.12, up to rc1, the sys.monitoring
callback function for the @code{PY_THROW} event was missing the third,
exception argument. That is now fixed.

@item 
gh-84436@footnote{https://github.com/python/cpython/issues/84436}: Skip reference count modifications for many known immortal
objects.

@item 
gh-107596@footnote{https://github.com/python/cpython/issues/107596}: Specialize subscripting @ref{16a,,str} objects by @ref{19c,,int}
indexes.

@item 
gh-107080@footnote{https://github.com/python/cpython/issues/107080}: Trace refs builds (@code{--with-trace-refs}) were crashing when
used with isolated subinterpreters.  The problematic global state has been
isolated to each interpreter.  Other fixing the crashes, this change does
not affect users.

@item 
gh-107557@footnote{https://github.com/python/cpython/issues/107557}: Generate the cases needed for the barebones tier 2 abstract
interpreter for optimization passes in CPython.

@item 
gh-106608@footnote{https://github.com/python/cpython/issues/106608}: Make @code{_PyUOpExecutorObject} variable length.

@item 
gh-100964@footnote{https://github.com/python/cpython/issues/100964}: Clear generators’ exception state after @code{return} to break
reference cycles.

@item 
gh-107455@footnote{https://github.com/python/cpython/issues/107455}: Improve error messages when converting an incompatible type to
@ref{1a9d,,ctypes.c_char_p}, @ref{1a9e,,ctypes.c_wchar_p} and
@ref{1a9f,,ctypes.c_void_p}.

@item 
gh-107263@footnote{https://github.com/python/cpython/issues/107263}: Increase C recursion limit for functions other than the main
interpreter from 800 to 1500. This should allow functions like
@code{list.__repr__} and @code{json.dumps} to handle all the inputs that they
could prior to 3.12

@item 
gh-104584@footnote{https://github.com/python/cpython/issues/104584}: Fix an issue which caused incorrect inline caches to be read
when running with 
@geindex PYTHONUOPS
@geindex environment variable; PYTHONUOPS
@code{PYTHONUOPS} or @ref{170,,-X uops} enabled.

@item 
gh-104432@footnote{https://github.com/python/cpython/issues/104432}: Fix potential unaligned memory access on C APIs involving
returned sequences of @code{char *} pointers within the @ref{6a,,grp} and
@ref{d1,,socket} modules. These were revealed using a
@code{-fsaniziter=alignment} build on ARM macOS. Patch by Christopher Chavez.

@item 
gh-106078@footnote{https://github.com/python/cpython/issues/106078}: Isolate @code{_decimal} (apply 
@geindex Python Enhancement Proposals; PEP 687
PEP 687@footnote{https://peps.python.org/pep-0687/}). Patch by Charlie
Zhao.

@item 
gh-106898@footnote{https://github.com/python/cpython/issues/106898}: Add the exception as the third argument to @code{PY_UNIND}
callbacks in @code{sys.monitoring}. This makes the @code{PY_UNWIND} callback
consistent with the other exception handling callbacks.

@item 
gh-106895@footnote{https://github.com/python/cpython/issues/106895}: Raise a @code{ValueError} when a monitoring callback function
returns @code{DISABLE} for events that cannot be disabled locally.

@item 
gh-106897@footnote{https://github.com/python/cpython/issues/106897}: Add a @code{RERAISE} event to @code{sys.monitoring}, which occurs
when an exception is reraise, either explicitly by a plain @code{raise}
statement, or implicitly in an @code{except} or @code{finally} block.

@item 
gh-77377@footnote{https://github.com/python/cpython/issues/77377}: Ensure that multiprocessing synchronization objects created in a
fork context are not sent to a different process created in a spawn
context. This changes a segfault into an actionable RuntimeError in the
parent process.

@item 
gh-106931@footnote{https://github.com/python/cpython/issues/106931}: Statically allocated string objects are now interned globally
instead of per-interpreter.  This fixes a situation where such a string
would only be interned in a single interpreter. Normal string objects are
unaffected.

@item 
gh-104621@footnote{https://github.com/python/cpython/issues/104621}: Unsupported modules now always fail to be imported.

@item 
gh-107122@footnote{https://github.com/python/cpython/issues/107122}: Add @code{dbm.ndbm.ndbm.clear()} to @ref{38,,dbm.ndbm}. Patch By
Donghee Na.

@item 
gh-107122@footnote{https://github.com/python/cpython/issues/107122}: Add @code{dbm.gnu.gdbm.clear()} to @ref{37,,dbm.gnu}. Patch By
Donghee Na.

@item 
gh-107015@footnote{https://github.com/python/cpython/issues/107015}: The ASYNC and AWAIT tokens are removed from the Grammar, which
removes the possibility of making @code{async} and @code{await} soft keywords
when using @code{feature_version<7} in @ref{1c4,,ast.parse()}.

@item 
gh-106917@footnote{https://github.com/python/cpython/issues/106917}: Fix classmethod-style @ref{1a7,,super()} method calls (i.e., where
the second argument to @code{super()}, or the implied second argument drawn
from @code{self/cls} in the case of zero-arg super, is a type) when the
target of the call is not a classmethod.

@item 
gh-105699@footnote{https://github.com/python/cpython/issues/105699}: Python no longer crashes due an infrequent race when
initializing per-interpreter interned strings.  The crash would manifest
when the interpreter was finalized.

@item 
gh-105699@footnote{https://github.com/python/cpython/issues/105699}: Python no longer crashes due to an infrequent race in setting
@code{Py_FileSystemDefaultEncoding} and @code{Py_FileSystemDefaultEncodeErrors}
(both deprecated), when simultaneously initializing two isolated
subinterpreters.  Now they are only set during runtime initialization.

@item 
gh-106908@footnote{https://github.com/python/cpython/issues/106908}: Fix various hangs, reference leaks, test failures, and
tracing/introspection bugs when running with 
@geindex PYTHONUOPS
@geindex environment variable; PYTHONUOPS
@code{PYTHONUOPS} or
@ref{170,,-X uops} enabled.

@item 
gh-106092@footnote{https://github.com/python/cpython/issues/106092}: Fix a segmentation fault caused by a use-after-free bug in
@code{frame_dealloc} when the trashcan delays the deallocation of a
@code{PyFrameObject}.

@item 
gh-106485@footnote{https://github.com/python/cpython/issues/106485}: Reduce the number of materialized instances dictionaries by
dematerializing them when possible.

@item 
gh-106719@footnote{https://github.com/python/cpython/issues/106719}: No longer suppress arbitrary errors in the @code{__annotations__}
getter and setter in the type and module types.

@item 
gh-106723@footnote{https://github.com/python/cpython/issues/106723}: Propagate @code{frozen_modules} to multiprocessing spawned process
interpreters.

@item 
gh-104909@footnote{https://github.com/python/cpython/issues/104909}: Split @code{LOAD_ATTR_INSTANCE_VALUE} into micro-ops.

@item 
gh-104909@footnote{https://github.com/python/cpython/issues/104909}: Split @ref{1aa0,,LOAD_GLOBAL} specializations into micro-ops.

@item 
gh-106597@footnote{https://github.com/python/cpython/issues/106597}: A new debug structure of offsets has been added to the
@code{_PyRuntimeState} that will help out-of-process debuggers and profilers
to obtain the offsets to relevant interpreter structures in a way that is
agnostic of how Python was compiled and that doesn’t require copying the
headers. Patch by Pablo Galindo

@item 
gh-106487@footnote{https://github.com/python/cpython/issues/106487}: Allow the `count' argument of @ref{4b9,,str.replace()} to be a
keyword. Patch by Hugo van Kemenade.

@item 
gh-96844@footnote{https://github.com/python/cpython/issues/96844}: Improve error message of @ref{1aa1,,list.remove()}. Patch by Donghee
Na.

@item 
gh-81283@footnote{https://github.com/python/cpython/issues/81283}: Compiler now strips indents from docstrings. It reduces @code{pyc}
file size 5% when the module is heavily documented. This change affects to
@code{__doc__} so tools like doctest will be affected.

@item 
gh-106396@footnote{https://github.com/python/cpython/issues/106396}: When the format specification of an f-string expression is
empty, the parser now generates an empty @ref{1aa2,,ast.JoinedStr} node for
it instead of an one-element @code{ast.JoinedStr} with an empty string
@ref{2f1,,ast.Constant}.

@item 
gh-100288@footnote{https://github.com/python/cpython/issues/100288}: Specialize @ref{705,,LOAD_ATTR} for non-descriptors on the
class. Adds @code{LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES} and
@code{LOAD_ATTR_NONDESCRIPTOR_NO_DICT}.

@item 
gh-106008@footnote{https://github.com/python/cpython/issues/106008}: Fix possible reference leaks when failing to optimize
comparisons with @ref{887,,None} in the bytecode compiler.

@item 
gh-106145@footnote{https://github.com/python/cpython/issues/106145}: Make @code{end_lineno} and @code{end_col_offset} required on
@code{type_param} ast nodes.

@item 
gh-106213@footnote{https://github.com/python/cpython/issues/106213}: Changed the way that Emscripten call trampolines work for
compatibility with Wasm/JS Promise integration.

@item 
gh-106182@footnote{https://github.com/python/cpython/issues/106182}: @ref{e59,,sys.getfilesystemencoding()} and
@ref{ee8,,sys.getfilesystemencodeerrors} now return interned Unicode object.

@item 
gh-106210@footnote{https://github.com/python/cpython/issues/106210}: Removed Emscripten import trampoline as it was no longer
necessary for Pyodide.

@item 
gh-104584@footnote{https://github.com/python/cpython/issues/104584}: Added a new, experimental, tracing optimizer and interpreter
(a.k.a. “tier 2”). This currently pessimizes, so don’t use yet – this is
infrastructure so we can experiment with optimizing passes. To enable it,
pass @code{-Xuops} or set @code{PYTHONUOPS=1}. To get debug output, set
@code{PYTHONUOPSDEBUG=N} where @code{N} is a debug level (0-4, where 0 is no
debug output and 4 is excessively verbose).

@item 
gh-105775@footnote{https://github.com/python/cpython/issues/105775}: @ref{1aa3,,LOAD_CLOSURE} is now a pseudo-op.

@item 
gh-105730@footnote{https://github.com/python/cpython/issues/105730}: Allow any callable other than type objects as the condition
predicate in @ref{191e,,BaseExceptionGroup.split()} and
@ref{1a7f,,BaseExceptionGroup.subgroup()}.

@item 
gh-105979@footnote{https://github.com/python/cpython/issues/105979}: Fix crash in @code{_imp.get_frozen_object()} due to improper
exception handling.

@item 
gh-106003@footnote{https://github.com/python/cpython/issues/106003}: Add a new @ref{1aa4,,TO_BOOL} instruction, which performs boolean
conversions for @ref{1aa5,,POP_JUMP_IF_TRUE}, @ref{1aa6,,POP_JUMP_IF_FALSE},
and @ref{1aa7,,UNARY_NOT} (which all expect exact @ref{3c1,,bool} values now).
Also, modify the oparg of @ref{b67,,COMPARE_OP} to include an optional
“boolean conversion” flag.

@item 
gh-98931@footnote{https://github.com/python/cpython/issues/98931}: Ensure custom @ref{18f,,SyntaxError} error messages are raised for
invalid imports with multiple targets. Patch by Pablo Galindo

@item 
gh-105724@footnote{https://github.com/python/cpython/issues/105724}: Improve @code{assert} error messages by providing exact error
range.

@item 
gh-105908@footnote{https://github.com/python/cpython/issues/105908}: Fixed bug where gh-99111@footnote{https://github.com/python/cpython/issues/99111} breaks future import
@code{barry_as_FLUFL} in the Python REPL.

@item 
gh-105840@footnote{https://github.com/python/cpython/issues/105840}: Fix possible crashes when specializing function calls with too
many @code{__defaults__}.

@item 
gh-105831@footnote{https://github.com/python/cpython/issues/105831}: Fix an f-string bug, where using a debug expression (the @code{=}
sign) that appears in the last line of a file results to the debug buffer
that holds the expression text being one character too small.

@item 
gh-105800@footnote{https://github.com/python/cpython/issues/105800}: Correctly issue @ref{1af,,SyntaxWarning} in f-strings if invalid
sequences are used. Patch by Pablo Galindo

@item 
gh-105340@footnote{https://github.com/python/cpython/issues/105340}: Include the comprehension iteration variable in @code{locals()}
inside a module- or class-scope comprehension.

@item 
gh-105331@footnote{https://github.com/python/cpython/issues/105331}: Raise @ref{2ee,,ValueError} if the @code{delay} argument to
@ref{c6a,,asyncio.sleep()} is a NaN (matching @ref{8ae,,time.sleep()}).

@item 
gh-105587@footnote{https://github.com/python/cpython/issues/105587}: The runtime can’t guarantee that immortal objects will not be
mutated by Extensions. Thus, this modifies _PyStaticObject_CheckRefcnt to
warn instead of asserting.

@item 
gh-105564@footnote{https://github.com/python/cpython/issues/105564}: Don’t include artificil newlines in the @code{line} attribute of
tokens in the APIs of the @ref{102,,tokenize} module. Patch by Pablo Galindo

@item 
gh-105549@footnote{https://github.com/python/cpython/issues/105549}: Tokenize separately @code{NUMBER} and @code{NAME} tokens that are not
ambiguous. Patch by Pablo Galindo.

@item 
gh-105588@footnote{https://github.com/python/cpython/issues/105588}: Fix an issue that could result in crashes when compiling
malformed @ref{9,,ast} nodes.

@item 
gh-100987@footnote{https://github.com/python/cpython/issues/100987}: Allow objects other than code objects as the “executable” in
internal frames. In the long term, this can help tools like Cython and
PySpy interact more efficiently. In the shorter term, it allows us to
perform some optimizations more simply.

@item 
gh-105375@footnote{https://github.com/python/cpython/issues/105375}: Fix bugs in the @ref{13,,builtins} module where exceptions could
end up being overwritten.

@item 
gh-105375@footnote{https://github.com/python/cpython/issues/105375}: Fix bug in the compiler where an exception could end up being
overwritten.

@item 
gh-105375@footnote{https://github.com/python/cpython/issues/105375}: Improve error handling in @ref{1aa8,,PyUnicode_BuildEncodingMap()}
where an exception could end up being overwritten.

@item 
gh-105486@footnote{https://github.com/python/cpython/issues/105486}: Change the repr of @code{ParamSpec} list of args in
@code{types.GenericAlias}.

@item 
gh-105678@footnote{https://github.com/python/cpython/issues/105678}: Break the @code{MAKE_FUNCTION} instruction into two parts,
@code{MAKE_FUNCTION} which makes the function and @code{SET_FUNCTION_ATTRIBUTE}
which sets the attributes on the function. This makes the stack effect of
@code{MAKE_FUNCTION} regular to ease optimization and code generation.

@item 
gh-105435@footnote{https://github.com/python/cpython/issues/105435}: Fix spurious newline character if file ends on a comment
without a newline. Patch by Pablo Galindo

@item 
gh-105390@footnote{https://github.com/python/cpython/issues/105390}: Correctly raise @ref{765,,tokenize.TokenError} exceptions instead
of @ref{18f,,SyntaxError} for tokenize errors such as incomplete input. Patch
by Pablo Galindo

@item 
gh-105259@footnote{https://github.com/python/cpython/issues/105259}: Don’t include newline character for trailing @code{NEWLINE} tokens
emitted in the @ref{102,,tokenize} module. Patch by Pablo Galindo

@item 
gh-104635@footnote{https://github.com/python/cpython/issues/104635}: Eliminate redundant @ref{1aa9,,STORE_FAST} instructions in the
compiler. Patch by Donghee Na and Carl Meyer.

@item 
gh-105324@footnote{https://github.com/python/cpython/issues/105324}: Fix the main function of the @ref{102,,tokenize} module when
reading from @code{sys.stdin}. Patch by Pablo Galindo

@item 
gh-33092@footnote{https://github.com/python/cpython/issues/33092}: Simplify and speed up interpreter for f-strings. Removes
@code{FORMAT_VALUE} opcode. Add @code{CONVERT_VALUE}, @code{FORMAT_SIMPLE} and
@code{FORMAT_WITH_SPEC} opcode. Compiler emits more efficient sequence for
each format expression.

@item 
gh-105229@footnote{https://github.com/python/cpython/issues/105229}: Remove remaining two-codeunit superinstructions. All remaining
superinstructions only take a single codeunit, simplifying instrumentation
and quickening.

@item 
gh-105235@footnote{https://github.com/python/cpython/issues/105235}: Prevent out-of-bounds memory access during @code{mmap.find()}
calls.

@item 
gh-98963@footnote{https://github.com/python/cpython/issues/98963}: Restore the ability for a subclass of @ref{4b4,,property} to
define @code{__slots__} or otherwise be dict-less by ignoring failures to set
a docstring on such a class.  This behavior had regressed in 3.12beta1.
An @ref{5f0,,AttributeError} where there had not previously been one was
disruptive to existing code.

@item 
gh-104812@footnote{https://github.com/python/cpython/issues/104812}: The “pending call” machinery now works for all interpreters,
not just the main interpreter, and runs in all threads, not just the main
thread. Some calls are still only done in the main thread, ergo in the
main interpreter. This change does not affect signal handling nor the
existing public C-API (@code{Py_AddPendingCall()}), which both still only
target the main thread. The new functionality is meant strictly for
internal use for now, since consequences of its use are not well
understood yet outside some very restricted cases.  This change brings the
capability in line with the intention when the state was made
per-interpreter several years ago.

@item 
gh-105194@footnote{https://github.com/python/cpython/issues/105194}: Do not escape with backslashes f-string format specifiers.
Patch by Pablo Galindo

@item 
gh-105229@footnote{https://github.com/python/cpython/issues/105229}: Replace some dynamic superinstructions with single instruction
equivalents.

@item 
gh-105162@footnote{https://github.com/python/cpython/issues/105162}: Fixed bug in generator.close()/throw() where an inner iterator
would be ignored when the outer iterator was instrumented.

@item 
gh-105164@footnote{https://github.com/python/cpython/issues/105164}: Ensure annotations are set up correctly if the only annotation
in a block is within a @ref{a14,,match} block. Patch by Jelle Zijlstra.

@item 
gh-105148@footnote{https://github.com/python/cpython/issues/105148}: Make @code{_PyASTOptimizeState} internal to ast_opt.c. Make
@code{_PyAST_Optimize} take two integers instead of a pointer to this struct.
This avoids the need to include pycore_compile.h in ast_opt.c.

@item 
gh-104799@footnote{https://github.com/python/cpython/issues/104799}: Attributes of @ref{9,,ast} nodes that are lists now default to
the empty list if omitted. This means that some code that previously
raised @ref{199,,TypeError} when the AST node was used will now proceed with
the empty list instead. Patch by Jelle Zijlstra.

@item 
gh-105111@footnote{https://github.com/python/cpython/issues/105111}: Remove the old trashcan macros @code{Py_TRASHCAN_SAFE_BEGIN} and
@code{Py_TRASHCAN_SAFE_END}. They should be replaced by the new macros
@code{Py_TRASHCAN_BEGIN} and @code{Py_TRASHCAN_END}.

@item 
gh-105035@footnote{https://github.com/python/cpython/issues/105035}: Fix @ref{1a7,,super()} calls on types with custom
@ref{1aaa,,tp_getattro} implementation (e.g. meta-types.)

@item 
gh-105017@footnote{https://github.com/python/cpython/issues/105017}: Show CRLF lines in the tokenize string attribute in both NL and
NEWLINE tokens. Patch by Marta Gómez.

@item 
gh-105013@footnote{https://github.com/python/cpython/issues/105013}: Fix handling of multiline parenthesized lambdas in
@ref{1812,,inspect.getsource()}. Patch by Pablo Galindo

@item 
gh-105017@footnote{https://github.com/python/cpython/issues/105017}: Do not include an additional final @code{NL} token when parsing
files having CRLF lines. Patch by Marta Gómez.

@item 
gh-104976@footnote{https://github.com/python/cpython/issues/104976}: Ensure that trailing @code{DEDENT} @code{tokenize.TokenInfo}
objects emitted by the @ref{102,,tokenize} module are reported as in Python
3.11. Patch by Pablo Galindo

@item 
gh-104972@footnote{https://github.com/python/cpython/issues/104972}: Ensure that the @code{line} attribute in
@code{tokenize.TokenInfo} objects in the @ref{102,,tokenize} module are
always correct. Patch by Pablo Galindo

@item 
gh-104955@footnote{https://github.com/python/cpython/issues/104955}: Fix signature for the new @ref{1aab,,__release_buffer__()}
slot. Patch by Jelle Zijlstra.

@item 
gh-104690@footnote{https://github.com/python/cpython/issues/104690}: Starting new threads and process creation through
@ref{4b6,,os.fork()} during interpreter shutdown (such as from @ref{d,,atexit}
handlers) is no longer supported.  It can lead to race condition between
the main Python runtime thread freeing thread states while internal
@ref{f3,,threading} routines are trying to allocate and use the state of just
created threads. Or forked children trying to use the mid-shutdown runtime
and thread state in the child process.

@item 
gh-104879@footnote{https://github.com/python/cpython/issues/104879}: Fix crash when accessing the @code{__module__} attribute of type
aliases defined outside a module. Patch by Jelle Zijlstra.

@item 
gh-104825@footnote{https://github.com/python/cpython/issues/104825}: Tokens emitted by the @ref{102,,tokenize} module do not include an
implicit @code{\n} character in the @code{line} attribute anymore. Patch by
Pablo Galindo

@item 
gh-104770@footnote{https://github.com/python/cpython/issues/104770}: If a generator returns a value upon being closed, the value is
now returned by @ref{17e5,,generator.close()}.

@item 
gh-89091@footnote{https://github.com/python/cpython/issues/89091}: Raise @ref{4d8,,RuntimeWarning} for unawaited async generator
methods like @ref{adc,,asend()}, @ref{71e,,athrow()} and
@ref{adb,,aclose()}. Patch by Kumar Aditya.

@item 
gh-96663@footnote{https://github.com/python/cpython/issues/96663}: Add a better, more introspect-able error message when setting
attributes on classes without a @code{__dict__} and no slot member for the
attribute.

@item 
gh-93627@footnote{https://github.com/python/cpython/issues/93627}: Update the Python pickle module implementation to match the C
implementation of the pickle module. For objects setting reduction methods
like @ref{19af,,__reduce_ex__()} or @ref{bcc,,__reduce__()} to
@code{None}, pickling will result in a @ref{199,,TypeError}.

@item 
gh-101006@footnote{https://github.com/python/cpython/issues/101006}: Improve error handling when read @ref{91,,marshal} data.

@item 
gh-91095@footnote{https://github.com/python/cpython/issues/91095}: Specializes calls to most Python classes. Specifically, any
class that inherits from @code{object}, or another Python class, and does not
override @code{__new__}.

The specialized instruction does the following:


@enumerate 

@item 
Creates the object (by calling @code{object.__new__})

@item 
Pushes a shim frame to the frame stack (to cleanup after @code{__init__})

@item 
Pushes the frame for @code{__init__} to the frame stack
@end enumerate

Speeds up the instantiation of most Python classes.
@end itemize

@node Library<68>,Documentation<23>,Core and Builtins<63>,Python 3 13 0 alpha 1
@anchor{whatsnew/changelog id308}@anchor{1aac}
@subsubsection Library



@itemize -

@item 
gh-110786@footnote{https://github.com/python/cpython/issues/110786}: @ref{e1,,sysconfig}’s CLI now ignores @ref{1262,,BrokenPipeError},
making it exit normally if its output is being piped and the pipe closes.

@item 
gh-103480@footnote{https://github.com/python/cpython/issues/103480}: The @ref{e1,,sysconfig} module is now a package, instead of a
single-file module.

@item 
gh-110733@footnote{https://github.com/python/cpython/issues/110733}: Micro-optimization: Avoid calling @code{min()}, @code{max()} in
@code{BaseEventLoop._run_once()}.

@item 
gh-94597@footnote{https://github.com/python/cpython/issues/94597}: Added @ref{1aad,,asyncio.EventLoop} for use with the
@ref{2f5,,asyncio.run()} `loop_factory' kwarg to avoid calling the asyncio
policy system.

@item 
gh-110682@footnote{https://github.com/python/cpython/issues/110682}: @ref{675,,runtime-checkable protocols}
used to consider @code{__match_args__} a protocol member in
@code{__instancecheck__} if it was present on the protocol. Now, this
attribute is ignored if it is present.

@item 
gh-110488@footnote{https://github.com/python/cpython/issues/110488}: Fix a couple of issues in @ref{1aae,,pathlib.PurePath.with_name()}: a
single dot was incorrectly considered a valid name, and in
@code{PureWindowsPath}, a name with an NTFS alternate data stream, like
@code{a:b}, was incorrectly considered invalid.

@item 
gh-110590@footnote{https://github.com/python/cpython/issues/110590}: Fix a bug in @code{_sre.compile()} where @ref{199,,TypeError} would
be overwritten by @ref{a87,,OverflowError} when the `code' argument was a list
of non-ints.

@item 
gh-65052@footnote{https://github.com/python/cpython/issues/65052}: Prevent @ref{aa,,pdb} from crashing when trying to display
undisplayable objects

@item 
gh-110519@footnote{https://github.com/python/cpython/issues/110519}: Deprecation warning about non-integer number in @ref{67,,gettext}
now always refers to the line in the user code where gettext function or
method is used. Previously it could refer to a line in @code{gettext} code.

@item 
gh-89902@footnote{https://github.com/python/cpython/issues/89902}: Deprecate non-standard format specifier “N” for
@ref{200,,decimal.Decimal}. It was not documented and only supported in the
C implementation.

@item 
gh-110378@footnote{https://github.com/python/cpython/issues/110378}: @ref{140e,,contextmanager()} and
@ref{d25,,asynccontextmanager()} context managers now close an
invalid underlying generator object that yields more then one value.

@item 
gh-106670@footnote{https://github.com/python/cpython/issues/106670}: In @ref{aa,,pdb}, set convenience variable @code{$_exception} for
post mortem debugging.

@item 
gh-110365@footnote{https://github.com/python/cpython/issues/110365}: Fix @ref{1aaf,,termios.tcsetattr()} bug that was overwriting existing
errors during parsing integers from @code{term} list.

@item 
gh-109653@footnote{https://github.com/python/cpython/issues/109653}: Slightly improve the import time of several standard-library
modules by deferring imports of @ref{119,,warnings} within those modules.
Patch by Alex Waygood.

@item 
gh-110273@footnote{https://github.com/python/cpython/issues/110273}: @ref{1ab0,,dataclasses.replace()} now raises TypeError instead of
ValueError if specify keyword argument for a field declared with
init=False or miss keyword argument for required InitVar field.

@item 
gh-110249@footnote{https://github.com/python/cpython/issues/110249}: Add @code{--inline-caches} flag to @code{dis} command line.

@item 
gh-109653@footnote{https://github.com/python/cpython/issues/109653}: Fix a Python 3.12 regression in the import time of
@ref{bd,,random}. Patch by Alex Waygood.

@item 
gh-110222@footnote{https://github.com/python/cpython/issues/110222}: Add support of struct sequence objects in @ref{1c2,,copy.replace()}.
Patched by Xuehai Pan.

@item 
gh-109649@footnote{https://github.com/python/cpython/issues/109649}: @ref{98,,multiprocessing}, @ref{24,,concurrent.futures},
@ref{21,,compileall}: Replace @ref{4dc,,os.cpu_count()} with
@ref{4db,,os.process_cpu_count()} to select the default number of worker
threads and processes. Get the CPU affinity if supported. Patch by Victor
Stinner.

@item 
gh-110150@footnote{https://github.com/python/cpython/issues/110150}: Fix base case handling in statistics.quantiles.  Now allows a
single data point.

@item 
gh-110036@footnote{https://github.com/python/cpython/issues/110036}: On Windows, multiprocessing @code{Popen.terminate()} now catches
@ref{f44,,PermissionError} and get the process exit code. If the process is
still running, raise again the @code{PermissionError}. Otherwise, the
process terminated as expected: store its exit code. Patch by Victor
Stinner.

@item 
gh-110038@footnote{https://github.com/python/cpython/issues/110038}: Fixed an issue that caused @code{KqueueSelector.select()} to not
return all the ready events in some cases when a file descriptor is
registered for both read and write.

@item 
gh-110045@footnote{https://github.com/python/cpython/issues/110045}: Update the @ref{de,,symtable} module to support the new scopes
introduced by 
@geindex Python Enhancement Proposals; PEP 695
PEP 695@footnote{https://peps.python.org/pep-0695/}.

@item 
gh-88402@footnote{https://github.com/python/cpython/issues/88402}: Add new variables to @ref{29a,,sysconfig.get_config_vars()} on
Windows: @code{LIBRARY}, @code{LDLIBRARY}, @code{LIBDIR}, @code{SOABI}, and
@code{Py_NOGIL}.

@item 
gh-109631@footnote{https://github.com/python/cpython/issues/109631}: @ref{be,,re} functions such as @ref{1230,,re.findall()},
@ref{5a2,,re.split()}, @ref{1438,,re.search()} and @ref{5a3,,re.sub()} which perform short
repeated matches can now be interrupted by user.

@item 
gh-109653@footnote{https://github.com/python/cpython/issues/109653}: Reduce the import time of @ref{54,,email.utils} by around 43%.
This results in the import time of @ref{48,,email.message} falling by around
18%, which in turn reduces the import time of @ref{7e,,importlib.metadata} by
around 6%. Patch by Alex Waygood.

@item 
gh-109818@footnote{https://github.com/python/cpython/issues/109818}: Fix @ref{13ff,,reprlib.recursive_repr()} not copying
@code{__type_params__} from decorated function.

@item 
gh-109047@footnote{https://github.com/python/cpython/issues/109047}: @ref{24,,concurrent.futures}: The `executor manager thread' now
catches exceptions when adding an item to the `call queue'. During Python
finalization, creating a new thread can now raise @ref{246,,RuntimeError}.
Catch the exception and call @code{terminate_broken()} in this case. Patch by
Victor Stinner.

@item 
gh-109782@footnote{https://github.com/python/cpython/issues/109782}: Ensure the signature of @ref{c0b,,os.path.isdir()} is identical on
all platforms. Patch by Amin Alaee.

@item 
gh-109653@footnote{https://github.com/python/cpython/issues/109653}: Improve import time of @ref{63,,functools} by around 13%. Patch by
Alex Waygood.

@item 
gh-109590@footnote{https://github.com/python/cpython/issues/109590}: @ref{6dc,,shutil.which()} will prefer files with an extension in
@code{PATHEXT} if the given mode includes @code{os.X_OK} on win32. If no
@code{PATHEXT} match is found, a file without an extension in @code{PATHEXT} can
be returned. This change will have @code{shutil.which()} act more similarly
to previous behavior in Python 3.11.

@item 
gh-109653@footnote{https://github.com/python/cpython/issues/109653}: Reduce the import time of @ref{5a,,enum} by over 50%. Patch by
Alex Waygood.

@item 
gh-109593@footnote{https://github.com/python/cpython/issues/109593}: Avoid deadlocking on a reentrant call to the multiprocessing
resource tracker. Such a reentrant call, though unlikely, can happen if a
GC pass invokes the finalizer for a multiprocessing object such as
SemLock.

@item 
gh-109653@footnote{https://github.com/python/cpython/issues/109653}: Reduce the import time of @ref{10b,,typing} by around a third.
Patch by Alex Waygood.

@item 
gh-109649@footnote{https://github.com/python/cpython/issues/109649}: Add @ref{4db,,os.process_cpu_count()} function to get the number of
logical CPUs usable by the calling thread of the current process. Patch by
Victor Stinner.

@item 
gh-74481@footnote{https://github.com/python/cpython/issues/74481}: Add @code{set_error_mode} related constants in @code{msvcrt} module in
Python debug build.

@item 
gh-109613@footnote{https://github.com/python/cpython/issues/109613}: Fix @ref{26f,,os.stat()} and @ref{1ab1,,os.DirEntry.stat()}: check for
exceptions. Previously, on Python built in debug mode, these functions
could trigger a fatal Python error (and abort the process) when a function
succeeded with an exception set. Patch by Victor Stinner.

@item 
gh-109599@footnote{https://github.com/python/cpython/issues/109599}: Expose the type of PyCapsule objects as @code{types.CapsuleType}.

@item 
gh-109109@footnote{https://github.com/python/cpython/issues/109109}: You can now get the raw TLS certificate chains from TLS
connections via @ref{19a0,,ssl.SSLSocket.get_verified_chain()} and
@ref{19a1,,ssl.SSLSocket.get_unverified_chain()} methods.

Contributed by Mateusz Nowak.

@item 
gh-109559@footnote{https://github.com/python/cpython/issues/109559}: Update @ref{10c,,unicodedata} database to Unicode 15.1.0.

@item 
gh-109543@footnote{https://github.com/python/cpython/issues/109543}: Remove unnecessary @ref{6fa,,hasattr()} check during
@ref{330,,typing.TypedDict} creation.

@item 
gh-109495@footnote{https://github.com/python/cpython/issues/109495}: Remove unnecessary extra @code{__slots__} in
@ref{4e3,,datetime}'s pure python implementation to reduce memory
size, as they are defined in the superclass. Patch by James Hilton-Balfe

@item 
gh-109461@footnote{https://github.com/python/cpython/issues/109461}: @ref{8b,,logging}: Use a context manager for lock acquisition.

@item 
gh-109096@footnote{https://github.com/python/cpython/issues/109096}: @ref{327,,http.server.CGIHTTPRequestHandler} has been deprecated
for removal in 3.15.  Its design is old and the web world has long since
moved beyond CGI.

@item 
gh-109409@footnote{https://github.com/python/cpython/issues/109409}: Fix error when it was possible to inherit a frozen dataclass
from multiple parents some of which were possibly not frozen.

@item 
gh-109375@footnote{https://github.com/python/cpython/issues/109375}: The @ref{aa,,pdb} @code{alias} command now prevents registering
aliases without arguments.

@item 
gh-109319@footnote{https://github.com/python/cpython/issues/109319}: Deprecate the @code{dis.HAVE_ARGUMENT} field in favour of
@code{dis.hasarg}.

@item 
gh-107219@footnote{https://github.com/python/cpython/issues/107219}: Fix a race condition in @code{concurrent.futures}. When a process
in the process pool was terminated abruptly (while the future was running
or pending), close the connection write end. If the call queue is blocked
on sending bytes to a worker process, closing the connection write end
interrupts the send, so the queue can be closed. Patch by Victor Stinner.

@item 
gh-66143@footnote{https://github.com/python/cpython/issues/66143}: The @ref{1ab2,,codecs.CodecInfo} object has been made copyable and
pickleable. Patched by Robert Lehmann and Furkan Onder.

@item 
gh-109187@footnote{https://github.com/python/cpython/issues/109187}: @ref{1ab3,,pathlib.Path.resolve()} now treats symlink loops like
other errors: in strict mode, @ref{2c2,,OSError} is raised, and in non-strict
mode, no exception is raised.

@item 
gh-50644@footnote{https://github.com/python/cpython/issues/50644}: Attempts to pickle or create a shallow or deep copy of
@ref{1c,,codecs} streams now raise a TypeError. Previously, copying failed
with a RecursionError, while pickling produced wrong results that
eventually caused unpickling to fail with a RecursionError.

@item 
gh-109174@footnote{https://github.com/python/cpython/issues/109174}: Add support of @ref{4e6,,types.SimpleNamespace} in
@ref{1c2,,copy.replace()}.

@item 
gh-109164@footnote{https://github.com/python/cpython/issues/109164}: @ref{aa,,pdb}: Replace @ref{65,,getopt} with @ref{7,,argparse} for
parsing command line arguments.

@item 
gh-109151@footnote{https://github.com/python/cpython/issues/109151}: Enable @code{readline} editing features in the @ref{674,,sqlite3 command-line interface} (@code{python -m sqlite3}).

@item 
gh-108987@footnote{https://github.com/python/cpython/issues/108987}: Fix @ref{4b5,,_thread.start_new_thread()} race condition. If a
thread is created during Python finalization, the newly spawned thread now
exits immediately instead of trying to access freed memory and lead to a
crash. Patch by Victor Stinner.

@item 
gh-108682@footnote{https://github.com/python/cpython/issues/108682}: Enum: require @code{names=()} or @code{type=...} to create an empty
enum using the functional syntax.

@item 
gh-109033@footnote{https://github.com/python/cpython/issues/109033}: Exceptions raised by os.utime builtin function now include the
related filename

@item 
gh-108843@footnote{https://github.com/python/cpython/issues/108843}: Fix an issue in @ref{ae8,,ast.unparse()} when unparsing f-strings
containing many quote types.

@item 
gh-108469@footnote{https://github.com/python/cpython/issues/108469}: @ref{ae8,,ast.unparse()} now supports new @ref{66b,,f-string} syntax
introduced in Python 3.12. Note that the f-string quotes are
reselected for simplicity under the new syntax. (Patch by Steven Sun)

@item 
gh-108751@footnote{https://github.com/python/cpython/issues/108751}: Add @ref{1c2,,copy.replace()} function which allows to create a
modified copy of an object. It supports named tuples, dataclasses, and
many other objects.

@item 
gh-108682@footnote{https://github.com/python/cpython/issues/108682}: Enum: raise @ref{199,,TypeError} if @code{super().__new__()} is called
from a custom @code{__new__}.

@item 
gh-108278@footnote{https://github.com/python/cpython/issues/108278}: Deprecate passing the callback callable by keyword for the
following @ref{54e,,sqlite3.Connection} APIs:


@itemize *

@item 
@ref{5a9,,set_authorizer()}

@item 
@ref{5aa,,set_progress_handler()}

@item 
@ref{5ab,,set_trace_callback()}
@end itemize

The affected parameters will become positional-only in Python 3.15.

Patch by Erlend E. Aasland.

@item 
gh-105829@footnote{https://github.com/python/cpython/issues/105829}: Fix concurrent.futures.ProcessPoolExecutor deadlock

@item 
gh-108295@footnote{https://github.com/python/cpython/issues/108295}: Fix crashes related to use of weakrefs on
@ref{487,,typing.TypeVar}.

@item 
gh-108463@footnote{https://github.com/python/cpython/issues/108463}: Make expressions/statements work as expected in pdb

@item 
gh-108277@footnote{https://github.com/python/cpython/issues/108277}: Add @ref{520,,os.timerfd_create()}, @ref{521,,os.timerfd_settime()},
@ref{523,,os.timerfd_gettime()}, @ref{522,,os.timerfd_settime_ns()}, and
@ref{524,,os.timerfd_gettime_ns()} to provide a low level interface for Linux’s
timer notification file descriptor.

@item 
gh-107811@footnote{https://github.com/python/cpython/issues/107811}: @ref{e4,,tarfile}: extraction of members with overly large UID or
GID (e.g. on an OS with 32-bit @code{id_t}) now fails in the same way
as failing to set the ID.

@item 
gh-64662@footnote{https://github.com/python/cpython/issues/64662}: Fix support for virtual tables in
@ref{550,,sqlite3.Connection.iterdump()}. Patch by Aviv Palivoda.

@item 
gh-108111@footnote{https://github.com/python/cpython/issues/108111}: Fix a regression introduced in gh-101251@footnote{https://github.com/python/cpython/issues/101251} for 3.12, resulting in
an incorrect offset calculation in @code{gzip.GzipFile.seek()}.

@item 
gh-108294@footnote{https://github.com/python/cpython/issues/108294}: @ref{8ae,,time.sleep()} now raises an auditing event.

@item 
gh-108278@footnote{https://github.com/python/cpython/issues/108278}: Deprecate passing name, number of arguments, and the callable
as keyword arguments, for the following @ref{54e,,sqlite3.Connection} APIs:


@itemize *

@item 
@ref{5a7,,create_function()}

@item 
@ref{5a8,,create_aggregate()}
@end itemize

The affected parameters will become positional-only in Python 3.15.

Patch by Erlend E. Aasland.

@item 
gh-108322@footnote{https://github.com/python/cpython/issues/108322}: Speed-up NormalDist.samples() by using the inverse CDF method
instead of calling random.gauss().

@item 
gh-83417@footnote{https://github.com/python/cpython/issues/83417}: Add the ability for venv to create a @code{.gitignore} file which
causes the created environment to be ignored by Git. It is on by default
when venv is called via its CLI.

@item 
gh-105736@footnote{https://github.com/python/cpython/issues/105736}: Harmonized the pure Python version of
@ref{7f4,,OrderedDict} with the C version. Now, both versions
set up their internal state in @code{__new__}.  Formerly, the pure Python
version did the set up in @code{__init__}.

@item 
gh-108083@footnote{https://github.com/python/cpython/issues/108083}: Fix bugs in the constructor of @ref{54e,,sqlite3.Connection} and
@ref{54f,,sqlite3.Connection.close()} where exceptions could be leaked. Patch
by Erlend E. Aasland.

@item 
gh-107932@footnote{https://github.com/python/cpython/issues/107932}: Fix @code{dis} module to properly report and display bytecode that
do not have source lines.

@item 
gh-105539@footnote{https://github.com/python/cpython/issues/105539}: @ref{d4,,sqlite3} now emits an @ref{54d,,ResourceWarning} if a
@ref{54e,,sqlite3.Connection} object is not @code{closed} explicitly. Patch by Erlend E. Aasland.

@item 
gh-107995@footnote{https://github.com/python/cpython/issues/107995}: The @code{__module__} attribute on instances of
@ref{764,,functools.cached_property} is now set to the name of the module in
which the cached_property is defined, rather than “functools”. This means
that doctests in @code{cached_property} docstrings are now properly collected
by the @ref{3e,,doctest} module. Patch by Tyler Smart.

@item 
gh-107963@footnote{https://github.com/python/cpython/issues/107963}: Fix @ref{194d,,multiprocessing.set_forkserver_preload()} to check the
given list of modules names. Patch by Donghee Na.

@item 
gh-106242@footnote{https://github.com/python/cpython/issues/106242}: Fixes @ref{1525,,os.path.normpath()} to handle embedded null
characters without truncating the path.

@item 
gh-81555@footnote{https://github.com/python/cpython/issues/81555}: @ref{129,,xml.dom.minidom} now only quotes @code{"} in attributes.

@item 
gh-50002@footnote{https://github.com/python/cpython/issues/50002}: @ref{129,,xml.dom.minidom} now preserves whitespaces in attributes.

@item 
gh-93057@footnote{https://github.com/python/cpython/issues/93057}: Passing more than one positional argument to
@ref{5a6,,sqlite3.connect()} and the @ref{54e,,sqlite3.Connection} constructor is
deprecated. The remaining parameters will become keyword-only in Python
3.15. Patch by Erlend E. Aasland.

@item 
gh-76913@footnote{https://github.com/python/cpython/issues/76913}: Add `merge_extra' parameter/feature to
@ref{1501,,logging.LoggerAdapter}

@item 
gh-107913@footnote{https://github.com/python/cpython/issues/107913}: Fix possible losses of @code{errno} and @code{winerror} values in
@ref{2c2,,OSError} exceptions if they were cleared or modified by the cleanup
code before creating the exception object.

@item 
gh-107845@footnote{https://github.com/python/cpython/issues/107845}: @ref{29c,,tarfile.data_filter()} now takes the location of symlinks
into account when determining their target, so it will no longer reject
some valid tarballs with @code{LinkOutsideDestinationError}.

@item 
gh-107812@footnote{https://github.com/python/cpython/issues/107812}: Extend socket’s netlink support to the FreeBSD platform.

@item 
gh-107805@footnote{https://github.com/python/cpython/issues/107805}: Fix signatures of module-level generated functions in
@ref{108,,turtle}.

@item 
gh-107782@footnote{https://github.com/python/cpython/issues/107782}: @ref{ba,,pydoc} is now able to show signatures which are not
representable in Python, e.g. for @code{getattr} and @code{dict.pop}.

@item 
gh-56166@footnote{https://github.com/python/cpython/issues/56166}: Deprecate passing optional arguments `maxsplit', `count' and
`flags' in module-level functions @ref{5a2,,re.split()}, @ref{5a3,,re.sub()} and
@ref{5a4,,re.subn()} as positional. They should only be passed by keyword.

@item 
gh-107710@footnote{https://github.com/python/cpython/issues/107710}: Speed up @ref{1ab4,,logging.getHandlerNames()}.

@item 
gh-107715@footnote{https://github.com/python/cpython/issues/107715}: Fix @ref{1ab5,,doctest.DocTestFinder.find()} in presence of class
names with special characters. Patch by Gertjan van Zwieten.

@item 
gh-100814@footnote{https://github.com/python/cpython/issues/100814}: Passing a callable object as an option value to a Tkinter image
now raises the expected TclError instead of an AttributeError.

@item 
gh-72684@footnote{https://github.com/python/cpython/issues/72684}: Add @ref{f6,,tkinter} widget methods: @code{tk_busy_hold()},
@code{tk_busy_configure()}, @code{tk_busy_cget()},
@code{tk_busy_forget()}, @code{tk_busy_current()}, and
@code{tk_busy_status()}.

@item 
gh-106684@footnote{https://github.com/python/cpython/issues/106684}: Raise @ref{54d,,ResourceWarning} when @ref{1ab6,,asyncio.StreamWriter}
is not closed leading to memory leaks. Patch by Kumar Aditya.

@item 
gh-107465@footnote{https://github.com/python/cpython/issues/107465}: Add @ref{535,,pathlib.Path.from_uri()} classmethod.

@item 
gh-107077@footnote{https://github.com/python/cpython/issues/107077}: Seems that in some conditions, OpenSSL will return
@code{SSL_ERROR_SYSCALL} instead of @code{SSL_ERROR_SSL} when a certification
verification has failed, but the error parameters will still contain
@code{ERR_LIB_SSL} and @code{SSL_R_CERTIFICATE_VERIFY_FAILED}. We are now
detecting this situation and raising the appropriate
@code{ssl.SSLCertVerificationError}. Patch by Pablo Galindo

@item 
gh-107576@footnote{https://github.com/python/cpython/issues/107576}: Fix @ref{6f6,,types.get_original_bases()} to only return
@code{__orig_bases__} if it is present on @code{cls} directly. Patch by
James Hilton-Balfe.

@item 
gh-105481@footnote{https://github.com/python/cpython/issues/105481}: Remove @code{opcode.is_pseudo}, @code{opcode.MIN_PSEUDO_OPCODE} and
@code{opcode.MAX_PSEUDO_OPCODE}, which were added in 3.12, were never
documented and were not intended to be used externally.

@item 
gh-105481@footnote{https://github.com/python/cpython/issues/105481}: @code{opcode.ENABLE_SPECIALIZATION} (which was added in 3.12
but never documented or intended for external usage) is moved to
@code{_opcode.ENABLE_SPECIALIZATION} where tests can access it.

@item 
gh-107396@footnote{https://github.com/python/cpython/issues/107396}: tarfiles; Fixed use before assignment of self.exception for
gzip decompression

@item 
gh-107409@footnote{https://github.com/python/cpython/issues/107409}: Set @code{__wrapped__} attribute in
@ref{13ff,,reprlib.recursive_repr()}.

@item 
gh-107406@footnote{https://github.com/python/cpython/issues/107406}: Implement new @code{__repr__()} method for
@ref{17af,,struct.Struct}. Now it returns @code{Struct(<format repr>)}.

@item 
gh-107369@footnote{https://github.com/python/cpython/issues/107369}: Optimize @ref{57d,,textwrap.indent()}. It is ~30% faster for large
input. Patch by Inada Naoki.

@item 
gh-78722@footnote{https://github.com/python/cpython/issues/78722}: Fix issue where @ref{270,,pathlib.Path.iterdir()} did not raise
@ref{2c2,,OSError} until iterated.

@item 
gh-105578@footnote{https://github.com/python/cpython/issues/105578}: Deprecate @ref{5ac,,typing.AnyStr} in favor of the new Type
Parameter syntax. See PEP 695.

@item 
gh-62519@footnote{https://github.com/python/cpython/issues/62519}: Make @ref{bee,,gettext.pgettext()} search plural definitions when
translation is not found.

@item 
gh-107089@footnote{https://github.com/python/cpython/issues/107089}: Shelves opened with @ref{1ab7,,shelve.open()} have a much faster
@code{clear()} method. Patch by James Cave.

@item 
gh-82500@footnote{https://github.com/python/cpython/issues/82500}: Fix overflow on 32-bit systems with @ref{b,,asyncio}
@ref{d0b,,os.sendfile()} implementation.

@item 
gh-83006@footnote{https://github.com/python/cpython/issues/83006}: Document behavior of @ref{1339,,shutil.disk_usage()} for non-mounted
filesystems on Unix.

@item 
gh-65495@footnote{https://github.com/python/cpython/issues/65495}: Use lowercase @code{mail from} and @code{rcpt to} in
@code{smptlib.SMTP}.

@item 
gh-106186@footnote{https://github.com/python/cpython/issues/106186}: Do not report @code{MultipartInvariantViolationDefect} defect when
the @ref{13a9,,email.parser.Parser} class is used to parse emails with
@code{headersonly=True}.

@item 
gh-105002@footnote{https://github.com/python/cpython/issues/105002}: Fix invalid result from @code{PurePath.relative_to()} method
when attempting to walk a “@code{..}” segment in `other' with `walk_up'
enabled. A @ref{2ee,,ValueError} exception is now raised in this case.

@item 
gh-106739@footnote{https://github.com/python/cpython/issues/106739}: Add the @code{rtype_cache} to the warning message (as an addition
to the type of leaked objects and the number of leaked objects already
included in the message) to make debugging leaked objects easier when the
multiprocessing resource tracker process finds leaked objects at shutdown.
This helps more quickly identify what was leaked and/or why the leaked
object was not properly cleaned up.

@item 
gh-106751@footnote{https://github.com/python/cpython/issues/106751}: Optimize @code{SelectSelector.select()} for many iteration case.
Patch By Donghee Na.

@item 
gh-106751@footnote{https://github.com/python/cpython/issues/106751}: Optimize @code{_PollLikeSelector.select()} for many iteration
case.

@item 
gh-106751@footnote{https://github.com/python/cpython/issues/106751}: Optimize @code{KqueueSelector.select()} for many iteration case.
Patch By Donghee Na.

@item 
gh-106831@footnote{https://github.com/python/cpython/issues/106831}: Fix potential missing @code{NULL} check of @code{d2i_SSL_SESSION}
result in @code{_ssl.c}.

@item 
gh-105481@footnote{https://github.com/python/cpython/issues/105481}: The various opcode lists in the @ref{3c,,dis} module are now
generated from bytecodes.c instead of explicitly constructed in opcode.py.

@item 
gh-106727@footnote{https://github.com/python/cpython/issues/106727}: Make @ref{1812,,inspect.getsource()} smarter for class for same name
definitions

@item 
gh-106789@footnote{https://github.com/python/cpython/issues/106789}: Remove import of @ref{b3,,pprint} from @ref{e1,,sysconfig}.

@item 
gh-105726@footnote{https://github.com/python/cpython/issues/105726}: Added @code{__slots__} to
@ref{e90,,contextlib.AbstractContextManager} and
@ref{d26,,contextlib.AbstractAsyncContextManager} so that child classes can
use @code{__slots__}.

@item 
gh-106774@footnote{https://github.com/python/cpython/issues/106774}: Update the bundled copy of pip to version 23.2.1.

@item 
gh-106751@footnote{https://github.com/python/cpython/issues/106751}: @ref{c7,,selectors}: Optimize @code{EpollSelector.select()} code by
moving some code outside of the loop.

@item 
gh-106752@footnote{https://github.com/python/cpython/issues/106752}: Fixed several bugs in zipfile.Path, including: in
@code{zipfile.Path.match()}, Windows separators are no longer honored (and
never were meant to be); Fixed @code{name}/@code{suffix}/@code{suffixes}/@code{stem}
operations when no filename is present and the Path is not at the root of
the zipfile; Reworked glob for performance and more correct matching
behavior.

@item 
gh-105293@footnote{https://github.com/python/cpython/issues/105293}: Remove call to @code{SSL_CTX_set_session_id_context} during client
side context creation in the @ref{d5,,ssl} module.

@item 
gh-106734@footnote{https://github.com/python/cpython/issues/106734}: Disable tab completion in multiline mode of @ref{aa,,pdb}

@item 
gh-105481@footnote{https://github.com/python/cpython/issues/105481}: Expose opcode metadata through @code{_opcode}.

@item 
gh-106670@footnote{https://github.com/python/cpython/issues/106670}: Add the new @code{exceptions} command to the Pdb debugger. It
makes it possible to move between chained exceptions when using post
mortem debugging.

@item 
gh-106602@footnote{https://github.com/python/cpython/issues/106602}: Add __copy__ and __deepcopy__ in @ref{5a,,enum}

@item 
gh-106664@footnote{https://github.com/python/cpython/issues/106664}: @ref{c7,,selectors}: Add @code{_SelectorMapping.get()} method and
optimize @code{_SelectorMapping.__getitem__()}.

@item 
gh-106628@footnote{https://github.com/python/cpython/issues/106628}: Speed up parsing of emails by about 20% by not compiling a new
regular expression for every single email.

@item 
gh-89427@footnote{https://github.com/python/cpython/issues/89427}: Set the environment variable @code{VIRTUAL_ENV_PROMPT} at
@ref{118,,venv} activation, even when @code{VIRTUAL_ENV_DISABLE_PROMPT} is set.

@item 
gh-106530@footnote{https://github.com/python/cpython/issues/106530}: Revert a change to @ref{1ab8,,colorsys.rgb_to_hls()} that caused
division by zero for certain almost-white inputs.  Patch by Terry Jan
Reedy.

@item 
gh-106584@footnote{https://github.com/python/cpython/issues/106584}: Fix exit code for @code{unittest} if all tests are skipped. Patch
by Egor Eliseev.

@item 
gh-106566@footnote{https://github.com/python/cpython/issues/106566}: Optimize @code{(?!)} (pattern which always fails) in regular
expressions.

@item 
gh-106554@footnote{https://github.com/python/cpython/issues/106554}: @ref{c7,,selectors}: Reduce Selector overhead by using a
@code{dict.get()} to lookup file descriptors.

@item 
gh-106558@footnote{https://github.com/python/cpython/issues/106558}: Remove ref cycle in callers of
@code{convert_to_error()} by deleting @code{result}
from scope in a @code{finally} block.

@item 
gh-100502@footnote{https://github.com/python/cpython/issues/100502}: Add @code{pathlib.PurePath.pathmod} class attribute that
stores the implementation of @ref{a6,,os.path} used for low-level path
operations: either @code{posixpath} or @code{ntpath}.

@item 
gh-106527@footnote{https://github.com/python/cpython/issues/106527}: Reduce overhead to add and remove @ref{b,,asyncio} readers and
writers.

@item 
gh-106524@footnote{https://github.com/python/cpython/issues/106524}: Fix crash in @code{_sre.template()} with templates containing
invalid group indices.

@item 
gh-106531@footnote{https://github.com/python/cpython/issues/106531}: Removed @code{_legacy} and the names it provided from
@code{importlib.resources}: @code{Resource}, @code{contents}, @code{is_resource},
@code{open_binary}, @code{open_text}, @code{path}, @code{read_binary}, and
@code{read_text}.

@item 
gh-106052@footnote{https://github.com/python/cpython/issues/106052}: @ref{be,,re} module: fix the matching of possessive quantifiers in
the case of a subpattern containing backtracking.

@item 
gh-106510@footnote{https://github.com/python/cpython/issues/106510}: Improve debug output for atomic groups in regular expressions.

@item 
gh-106503@footnote{https://github.com/python/cpython/issues/106503}: Fix ref cycle in @code{asyncio._SelectorSocketTransport} by
removing @code{_write_ready} in @code{close}.

@item 
gh-105497@footnote{https://github.com/python/cpython/issues/105497}: Fix flag mask inversion when unnamed flags exist.

@item 
gh-90876@footnote{https://github.com/python/cpython/issues/90876}: Prevent @code{multiprocessing.spawn} from failing to `import' in
environments where @code{sys.executable} is @code{None}.  This regressed in 3.11
with the addition of support for path-like objects in multiprocessing.

@item 
gh-106403@footnote{https://github.com/python/cpython/issues/106403}: Instances of @ref{487,,typing.TypeVar},
@ref{488,,typing.ParamSpec}, @ref{9cf,,typing.ParamSpecArgs},
@ref{9d0,,typing.ParamSpecKwargs}, and @ref{489,,typing.TypeVarTuple} once
again support weak references, fixing a regression introduced in Python
3.12.0 beta 1. Patch by Jelle Zijlstra.

@item 
gh-89812@footnote{https://github.com/python/cpython/issues/89812}: Add private @code{pathlib._PathBase} class, which provides
experimental support for virtual filesystems, and may be made public in a
future version of Python.

@item 
gh-106292@footnote{https://github.com/python/cpython/issues/106292}: Check for an instance-dict cached value in the @code{__get__()}
method of @ref{764,,functools.cached_property()}. This better matches the
pre-3.12 behavior and improves compatibility for users subclassing
@code{functools.cached_property()} and adding a @code{__set__()} method.

@item 
gh-106350@footnote{https://github.com/python/cpython/issues/106350}: Detect possible memory allocation failure in the libtommath
function @code{mp_init()} used by the @code{_tkinter} module.

@item 
gh-106330@footnote{https://github.com/python/cpython/issues/106330}: Fix incorrect matching of empty paths in
@ref{6d4,,pathlib.PurePath.match()}. This bug was introduced in Python 3.12.0
beta 1.

@item 
gh-106309@footnote{https://github.com/python/cpython/issues/106309}: Deprecate @ref{331,,typing.no_type_check_decorator()}. No major type
checker ever added support for this decorator. Patch by Alex Waygood.

@item 
gh-102541@footnote{https://github.com/python/cpython/issues/102541}: Make @code{pydoc.doc()} catch bad module @ref{65b,,ImportError} when
output stream is not @code{None}.

@item 
gh-106263@footnote{https://github.com/python/cpython/issues/106263}: Fix crash when calling @code{repr} with a manually constructed
SignalDict object. Patch by Charlie Zhao.

@item 
gh-106236@footnote{https://github.com/python/cpython/issues/106236}: Replace @code{assert} statements with @code{raise RuntimeError} in
@ref{f3,,threading}, so that @code{_DummyThread} cannot be joined even with
@code{-OO}.

@item 
gh-106238@footnote{https://github.com/python/cpython/issues/106238}: Fix rare concurrency bug in lock acquisition by the logging
package.

@item 
gh-106152@footnote{https://github.com/python/cpython/issues/106152}: Added PY_THROW event hook for @ref{2b,,cProfile} for generators

@item 
gh-106075@footnote{https://github.com/python/cpython/issues/106075}: Added @code{asyncio.taskgroups.__all__} to @code{asyncio.__all__} for
export in star imports.

@item 
gh-104527@footnote{https://github.com/python/cpython/issues/104527}: Zipapp will now skip over appending an archive to itself.

@item 
gh-106046@footnote{https://github.com/python/cpython/issues/106046}: Improve the error message from @ref{e53,,os.fspath()} if called on
an object where @code{__fspath__} is set to @code{None}. Patch by Alex Waygood.

@item 
gh-105987@footnote{https://github.com/python/cpython/issues/105987}: Fix crash due to improper reference counting in @ref{b,,asyncio}
eager task factory internal routines.

@item 
gh-105974@footnote{https://github.com/python/cpython/issues/105974}: Fix bug where a @ref{56b,,typing.Protocol} class that had one or
more non-callable members would raise @ref{199,,TypeError} when
@ref{9ca,,issubclass()} was called against it, even if it defined a custom
@code{__subclasshook__} method. The behaviour in Python 3.11 and lower –
which has now been restored – was not to raise @code{TypeError} in these
situations if a custom @code{__subclasshook__} method was defined. Patch by
Alex Waygood.

@item 
gh-96145@footnote{https://github.com/python/cpython/issues/96145}: Reverted addition of @code{json.AttrDict}.

@item 
gh-89812@footnote{https://github.com/python/cpython/issues/89812}: Add @ref{534,,pathlib.UnsupportedOperation}, which is raised instead
of @ref{369,,NotImplementedError} when a path operation isn’t supported.

@item 
gh-105808@footnote{https://github.com/python/cpython/issues/105808}: Fix a regression introduced in gh-101251@footnote{https://github.com/python/cpython/issues/101251} for 3.12, causing
@code{gzip.GzipFile.flush()} to not flush the compressor (nor pass along
the @code{zip_mode} argument).

@item 
gh-105481@footnote{https://github.com/python/cpython/issues/105481}: @ref{1137,,stack_effect()} no longer raises an exception if an
@code{oparg} is provided for an @code{opcode} that doesn’t use its arg, or when
it is not provided for an @code{opcode} that does use it. In the latter case,
the stack effect is returned for @code{oparg=0}.

@item 
gh-104799@footnote{https://github.com/python/cpython/issues/104799}: Enable @ref{ae8,,ast.unparse()} to unparse function and class
definitions created without the new @code{type_params} field from 
@geindex Python Enhancement Proposals; PEP 695
PEP 695@footnote{https://peps.python.org/pep-0695/}.
Patch by Jelle Zijlstra.

@item 
gh-105793@footnote{https://github.com/python/cpython/issues/105793}: Add `follow_symlinks' keyword-only argument to
@ref{53b,,pathlib.Path.is_dir()} and @ref{53a,,is_file()}, defaulting
to @code{True}.

@item 
gh-105570@footnote{https://github.com/python/cpython/issues/105570}: Deprecate two methods of creating @ref{330,,typing.TypedDict}
classes with 0 fields using the functional syntax: @code{TD =
TypedDict("TD")} and @code{TD = TypedDict("TD", None)}. Both will be
disallowed in Python 3.15. To create a @code{TypedDict} class with 0 fields,
either use @code{class TD(TypedDict): pass} or @code{TD = TypedDict("TD", @{@})}.

@item 
gh-105745@footnote{https://github.com/python/cpython/issues/105745}: Fix @code{webbrowser.Konqueror.open} method.

@item 
gh-105733@footnote{https://github.com/python/cpython/issues/105733}: @ref{2e,,ctypes}: Deprecate undocumented
@code{ctypes.SetPointerType()} and @code{ctypes.ARRAY()} functions. Patch
by Victor Stinner.

@item 
gh-105687@footnote{https://github.com/python/cpython/issues/105687}: Remove deprecated @code{re.template}, @code{re.T}, @code{re.TEMPLATE},
@code{sre_constans.SRE_FLAG_TEMPLATE}.

@item 
gh-105684@footnote{https://github.com/python/cpython/issues/105684}: Supporting @ref{bd6,,asyncio.Task.set_name()} is now mandatory for
third party task implementations. The undocumented @code{_set_task_name()}
function (deprecated since 3.8) has been removed. Patch by Kumar Aditya.

@item 
gh-105375@footnote{https://github.com/python/cpython/issues/105375}: Fix a bug in @code{_Unpickler_SetInputStream()} where an
exception could end up being overwritten in case of failure.

@item 
gh-105626@footnote{https://github.com/python/cpython/issues/105626}: Change the default return value of
@ref{1ab9,,http.client.HTTPConnection.get_proxy_response_headers()} to be
@code{None} and not @code{@{@}}.

@item 
gh-105375@footnote{https://github.com/python/cpython/issues/105375}: Fix bugs in @ref{df,,sys} where exceptions could end up being
overwritten because of deferred error handling.

@item 
gh-105605@footnote{https://github.com/python/cpython/issues/105605}: Harden @code{pyexpat} error handling during module
initialisation to prevent exceptions from possibly being overwritten, and
objects from being dereferenced twice.

@item 
gh-105375@footnote{https://github.com/python/cpython/issues/105375}: Fix bug in @ref{3a,,decimal} where an exception could end up being
overwritten.

@item 
gh-105375@footnote{https://github.com/python/cpython/issues/105375}: Fix bugs in @code{_datetime} where exceptions could be
overwritten in case of module initialisation failure.

@item 
gh-105375@footnote{https://github.com/python/cpython/issues/105375}: Fix bugs in @code{_ssl} initialisation which could lead to
leaked references and overwritten exceptions.

@item 
gh-105375@footnote{https://github.com/python/cpython/issues/105375}: Fix a bug in @ref{4bf,,array.array} where an exception could end
up being overwritten.

@item 
gh-105375@footnote{https://github.com/python/cpython/issues/105375}: Fix bugs in @code{_ctypes} where exceptions could end up being
overwritten.

@item 
gh-105375@footnote{https://github.com/python/cpython/issues/105375}: Fix a bug in the @ref{b2,,posix} module where an exception could
be overwritten.

@item 
gh-105375@footnote{https://github.com/python/cpython/issues/105375}: Fix bugs in @code{_elementtree} where exceptions could be
overwritten.

@item 
gh-105375@footnote{https://github.com/python/cpython/issues/105375}: Fix bugs in @ref{13b,,zoneinfo} where exceptions could be
overwritten.

@item 
gh-105375@footnote{https://github.com/python/cpython/issues/105375}: Fix bugs in @ref{5b,,errno} where exceptions could be overwritten.

@item 
gh-105566@footnote{https://github.com/python/cpython/issues/105566}: Deprecate creating a @ref{32f,,typing.NamedTuple} class using
keyword arguments to denote the fields (@code{NT = NamedTuple("NT", x=int,
y=str)}). This will be disallowed in Python 3.15. Use the class-based
syntax or the functional syntax instead.

Two methods of creating @code{NamedTuple} classes with 0 fields using the
functional syntax are also deprecated, and will be disallowed in Python
3.15: @code{NT = NamedTuple("NT")} and @code{NT = NamedTuple("NT", None)}. To
create a @code{NamedTuple} class with 0 fields, either use @code{class
NT(NamedTuple): pass} or @code{NT = NamedTuple("NT", [])}.

@item 
gh-105545@footnote{https://github.com/python/cpython/issues/105545}: Remove deprecated in 3.11 @code{webbrowser.MacOSXOSAScript._name}
attribute.

@item 
gh-105497@footnote{https://github.com/python/cpython/issues/105497}: Fix flag inversion when alias/mask members exist.

@item 
gh-105509@footnote{https://github.com/python/cpython/issues/105509}: @ref{b3d,,typing.Annotated} is now implemented as an instance of
@code{typing._SpecialForm} rather than a class. This should have no
user-facing impact for users of the @ref{10b,,typing} module public API.

@item 
gh-105375@footnote{https://github.com/python/cpython/issues/105375}: Fix bugs in @ref{ab,,pickle} where exceptions could be
overwritten.

@item 
gh-70303@footnote{https://github.com/python/cpython/issues/70303}: Emit @ref{659,,FutureWarning} from @ref{538,,pathlib.Path.glob()} and
@ref{539,,rglob()} if the given pattern ends with “@code{**}”. In a
future Python release, patterns with this ending will match both files and
directories. Add a trailing slash to only match directories.

@item 
gh-105375@footnote{https://github.com/python/cpython/issues/105375}: Fix a bug in @ref{d4,,sqlite3} where an exception could be
overwritten in the @ref{888,,collation}
callback.

@item 
gh-105382@footnote{https://github.com/python/cpython/issues/105382}: Remove `cafile', `capath' and `cadefault' parameters of the
@ref{309,,urllib.request.urlopen()} function, deprecated in Python 3.6. Patch
by Victor Stinner.

@item 
gh-105376@footnote{https://github.com/python/cpython/issues/105376}: @ref{8b,,logging}: Remove undocumented and untested
@code{Logger.warn()} and @code{LoggerAdapter.warn()} methods and
@code{logging.warn()} function. Deprecated since Python 3.3, they were
aliases to the @ref{1aba,,logging.Logger.warning()} method,
@code{logging.LoggerAdapter.warning()} method and @ref{352,,logging.warning()}
function. Patch by Victor Stinner.

@item 
gh-105332@footnote{https://github.com/python/cpython/issues/105332}: Revert pickling method from by-name back to by-value.

@item 
gh-104554@footnote{https://github.com/python/cpython/issues/104554}: Add RTSPS scheme support in urllib.parse

@item 
gh-105292@footnote{https://github.com/python/cpython/issues/105292}: Add option to @ref{a54,,traceback.format_exception_only()} to
recurse into the nested exception of a @ref{566,,BaseExceptionGroup}.

@item 
gh-105280@footnote{https://github.com/python/cpython/issues/105280}: Fix bug where @code{isinstance([], collections.abc.Mapping)} could
evaluate to @code{True} if garbage collection happened at the wrong time. The
bug was caused by changes to the implementation of
@ref{56b,,typing.Protocol} in Python 3.12.

@item 
gh-80480@footnote{https://github.com/python/cpython/issues/80480}: @ref{8,,array}: Add @code{'w'} typecode that represents @code{Py_UCS4}.

@item 
gh-105239@footnote{https://github.com/python/cpython/issues/105239}: Fix longstanding bug where @code{issubclass(object,
typing.Protocol)} would evaluate to @code{True} in some edge cases. Patch by
Alex Waygood.

@item 
gh-104310@footnote{https://github.com/python/cpython/issues/104310}: In the beta 1 release we added a utility function for extension
module authors, to use when testing their module for support in multiple
interpreters or under a per-interpreter GIL.  The name of that function
has changed from @code{allowing_all_extensions} to
@code{_incompatible_extension_module_restrictions}.  The default for the
“disable_check” argument has change from @code{True} to @code{False}, to better
match the new function name.

@item 
gh-105080@footnote{https://github.com/python/cpython/issues/105080}: Fixed inconsistent signature on derived classes for
@ref{231,,inspect.signature()}

@item 
gh-105144@footnote{https://github.com/python/cpython/issues/105144}: Fix a recent regression in the @ref{10b,,typing} module. The
regression meant that doing @code{class Foo(X, typing.Protocol)}, where @code{X}
was a class that had @ref{1121,,abc.ABCMeta} as its metaclass, would then
cause subsequent @code{isinstance(1, X)} calls to erroneously raise
@ref{199,,TypeError}. Patch by Alex Waygood.

@item 
gh-62948@footnote{https://github.com/python/cpython/issues/62948}: The @ref{506,,io.IOBase} finalizer now logs the @code{close()} method
errors with @ref{508,,sys.unraisablehook}. Previously, errors were ignored
silently by default, and only logged in @ref{509,,Python Development Mode} or on @ref{50a,,Python built on debug mode}.  Patch
by Victor Stinner.

@item 
gh-105096@footnote{https://github.com/python/cpython/issues/105096}: @ref{11a,,wave}: Deprecate the @code{getmark()}, @code{setmark()} and
@code{getmarkers()} methods of the @ref{334,,wave.Wave_read} and
@ref{335,,wave.Wave_write} classes. They will be removed in Python 3.15.
Patch by Victor Stinner.

@item 
gh-104992@footnote{https://github.com/python/cpython/issues/104992}: Remove the untested and undocumented
@code{unittest.TestProgram.usageExit()} method, deprecated in Python 3.11.
Patch by Hugo van Kemenade.

@item 
gh-104996@footnote{https://github.com/python/cpython/issues/104996}: Improve performance of @ref{6ce,,pathlib.PurePath} initialisation
by deferring joining of paths when multiple arguments are given.

@item 
gh-101588@footnote{https://github.com/python/cpython/issues/101588}: Deprecate undocumented copy/deepcopy/pickle support for
itertools.

@item 
gh-103631@footnote{https://github.com/python/cpython/issues/103631}: Fix @code{pathlib.PurePosixPath(pathlib.PureWindowsPath(...))} not
converting path separators to restore 3.11 compatible behavior.

@item 
gh-104947@footnote{https://github.com/python/cpython/issues/104947}: Make comparisons between @ref{1abb,,pathlib.PureWindowsPath}
objects consistent across Windows and Posix to match 3.11 behavior.

@item 
gh-104773@footnote{https://github.com/python/cpython/issues/104773}: 
@geindex Python Enhancement Proposals; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}: Remove the @code{audioop} module, deprecated in
Python 3.11. Patch by Victor Stinner.

@item 
gh-104773@footnote{https://github.com/python/cpython/issues/104773}: 
@geindex Python Enhancement Proposals; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}: Remove the @code{aifc} module, deprecated in
Python 3.11. Patch by Victor Stinner.

@item 
gh-104773@footnote{https://github.com/python/cpython/issues/104773}: 
@geindex Python Enhancement Proposals; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}: Remove the @code{uu} module, deprecated in Python
3.11. Patch by Victor Stinner.

@item 
gh-104935@footnote{https://github.com/python/cpython/issues/104935}: Fix bugs with the interaction between
@ref{675,,typing.runtime_checkable()} and @ref{1806,,typing.Generic} that were
introduced by the 
@geindex Python Enhancement Proposals; PEP 695
PEP 695@footnote{https://peps.python.org/pep-0695/} implementation. Patch by Jelle Zijlstra.

@item 
gh-104773@footnote{https://github.com/python/cpython/issues/104773}: 
@geindex Python Enhancement Proposals; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}: Remove the @code{crypt} module and its private
@code{_crypt} extension, deprecated in Python 3.11. Patch by Victor
Stinner.

@item 
gh-104773@footnote{https://github.com/python/cpython/issues/104773}: 
@geindex Python Enhancement Proposals; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}: Remove the @code{nis} module, deprecated in Python
3.11. Patch by Victor Stinner.

@item 
gh-104898@footnote{https://github.com/python/cpython/issues/104898}: Add missing @ref{16f7,,__slots__} to @ref{e51,,os.PathLike}.

@item 
gh-104773@footnote{https://github.com/python/cpython/issues/104773}: 
@geindex Python Enhancement Proposals; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}: Remove the @code{xdrlib} module, deprecated in
Python 3.11. Patch by Victor Stinner.

@item 
gh-104773@footnote{https://github.com/python/cpython/issues/104773}: 
@geindex Python Enhancement Proposals; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}: Remove the @code{nntplib} module, deprecated in
Python 3.11. Patch by Victor Stinner.

@item 
gh-104886@footnote{https://github.com/python/cpython/issues/104886}: Remove the undocumented
@code{configparser.LegacyInterpolation} class, deprecated in the
docstring since Python 3.2, and with a deprecation warning since Python
3.11. Patch by Hugo van Kemenade.

@item 
gh-104786@footnote{https://github.com/python/cpython/issues/104786}: Remove kwargs-based @ref{330,,typing.TypedDict} creation

@item 
gh-104876@footnote{https://github.com/python/cpython/issues/104876}: Remove the @code{turtle.RawTurtle.settiltangle()} method,
deprecated in docs since Python 3.1 and with a deprecation warning since
Python 3.11. Patch by Hugo van Kemenade.

@item 
gh-104773@footnote{https://github.com/python/cpython/issues/104773}: 
@geindex Python Enhancement Proposals; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}: Removed the @code{msilib} package, deprecated in
Python 3.11.

@item 
gh-104773@footnote{https://github.com/python/cpython/issues/104773}: 
@geindex Python Enhancement Proposals; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}: Remove the @code{spwd} module, deprecated in
Python 3.11: the python-pam@footnote{https://pypi.org/project/python-pam/} project can be used instead. Patch by
Victor Stinner.

@item 
gh-75552@footnote{https://github.com/python/cpython/issues/75552}: Removed the @code{tkinter.tix} module, deprecated since Python 3.6.

@item 
gh-104773@footnote{https://github.com/python/cpython/issues/104773}: 
@geindex Python Enhancement Proposals; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}: Remove the @code{chunk} module, deprecated in
Python 3.11. Patch by Victor Stinner.

@item 
gh-104773@footnote{https://github.com/python/cpython/issues/104773}: 
@geindex Python Enhancement Proposals; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}: Remove the @code{mailcap} module, deprecated in
Python 3.11. Patch by Victor Stinner.

@item 
gh-104773@footnote{https://github.com/python/cpython/issues/104773}: 
@geindex Python Enhancement Proposals; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}: Remove the @code{sunau} module, deprecated in
Python 3.11. Patch by Victor Stinner.

@item 
gh-104780@footnote{https://github.com/python/cpython/issues/104780}: 
@geindex Python Enhancement Proposals; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}: Remove the @code{ossaudiodev} module, deprecated
in Python 3.11. Patch Victor Stinner.

@item 
gh-104773@footnote{https://github.com/python/cpython/issues/104773}: 
@geindex Python Enhancement Proposals; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}: Remove the @code{pipes} module, deprecated in
Python 3.11. Patch by Victor Stinner.

@item 
gh-104873@footnote{https://github.com/python/cpython/issues/104873}: Add @ref{56a,,typing.get_protocol_members()} to return the set of
members defining a @ref{56b,,typing.Protocol}.  Add
@ref{56c,,typing.is_protocol()} to check whether a class is a
@code{typing.Protocol}. Patch by Jelle Zijlstra.

@item 
gh-104874@footnote{https://github.com/python/cpython/issues/104874}: Document the @code{__name__} and @code{__supertype__} attributes of
@ref{ef7,,typing.NewType}. Patch by Jelle Zijlstra.

@item 
gh-104835@footnote{https://github.com/python/cpython/issues/104835}: Removed the following @ref{10d,,unittest} functions, deprecated in
Python 3.11:


@itemize *

@item 
@code{unittest.findTestCases()}

@item 
@code{unittest.makeSuite()}

@item 
@code{unittest.getTestCaseNames()}
@end itemize

Use @ref{593,,TestLoader} methods instead:


@itemize *

@item 
@ref{594,,unittest.TestLoader.loadTestsFromModule()}

@item 
@ref{595,,unittest.TestLoader.loadTestsFromTestCase()}

@item 
@ref{596,,unittest.TestLoader.getTestCaseNames()}
@end itemize

Patch by Hugo van Kemenade.

@item 
gh-104804@footnote{https://github.com/python/cpython/issues/104804}: Remove the untested and undocumented @ref{11c,,webbrowser}
@code{MacOSX} class, deprecated in Python 3.11. Patch by Hugo van
Kemenade.

@item 
gh-83863@footnote{https://github.com/python/cpython/issues/83863}: Support for using @ref{268,,pathlib.Path} objects as context
managers has been removed. Before Python 3.9, exiting the context manager
marked a path as “closed”, which caused some (but not all!) methods to
raise when called. Since Python 3.9, using a path as a context manager
does nothing.

@item 
gh-104799@footnote{https://github.com/python/cpython/issues/104799}: Adjust the location of the (see 
@geindex Python Enhancement Proposals; PEP 695
PEP 695@footnote{https://peps.python.org/pep-0695/}) @code{type_params}
field on @ref{1abc,,ast.ClassDef}, @ref{1abd,,ast.AsyncFunctionDef}, and
@ref{1abe,,ast.FunctionDef} to better preserve backward compatibility. Patch
by Jelle Zijlstra

@item 
gh-104797@footnote{https://github.com/python/cpython/issues/104797}: Allow @ref{56b,,typing.Protocol} classes to inherit from
@ref{341,,collections.abc.Buffer}. Patch by Jelle Zijlstra.

@item 
gh-104783@footnote{https://github.com/python/cpython/issues/104783}: Remove @code{locale.resetlocale()} function deprecated in Python
3.11. Patch by Victor Stinner.

@item 
gh-104780@footnote{https://github.com/python/cpython/issues/104780}: Remove the @code{2to3} program and the @code{lib2to3} module,
deprecated in Python 3.11. Patch by Victor Stinner.

@item 
gh-104773@footnote{https://github.com/python/cpython/issues/104773}: 
@geindex Python Enhancement Proposals; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}: Remove the @code{telnetlib} module, deprecated in
Python 3.11. Patch by Victor Stinner.

@item 
gh-104773@footnote{https://github.com/python/cpython/issues/104773}: 
@geindex Python Enhancement Proposals; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}: Remove the @code{imghdr} module, deprecated in
Python 3.11. Patch by Victor Stinner.

@item 
gh-104773@footnote{https://github.com/python/cpython/issues/104773}: 
@geindex Python Enhancement Proposals; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}: Remove the @code{cgi} and @code{cgitb} modules,
deprecated in Python 3.11. Patch by Victor Stinner.

@item 
gh-104773@footnote{https://github.com/python/cpython/issues/104773}: 
@geindex Python Enhancement Proposals; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}: Remove the @code{sndhdr} module, deprecated in
Python 3.11. Patch by Victor Stinner.

@item 
gh-104372@footnote{https://github.com/python/cpython/issues/104372}: On Linux where @ref{dc,,subprocess} can use the @code{vfork()}
syscall for faster spawning, prevent the parent process from blocking
other threads by dropping the GIL while it waits for the vfork’ed child
process @code{exec()} outcome. This prevents spawning a binary from a slow
filesystem from blocking the rest of the application.

@item 
gh-99108@footnote{https://github.com/python/cpython/issues/99108}: We now release the GIL around built-in @ref{6c,,hashlib}
computations of reasonable size for the SHA families and MD5 hash
functions, matching what our OpenSSL backed hash computations already
does.

@item 
gh-102613@footnote{https://github.com/python/cpython/issues/102613}: Improve performance of @ref{538,,pathlib.Path.glob()} when expanding
a pattern with a non-terminal “@code{**}” component by filtering walked paths
through a regular expression, rather than calling @ref{c5a,,os.scandir()} more
than once on each directory.

@item 
gh-104399@footnote{https://github.com/python/cpython/issues/104399}: Prepare the @code{_tkinter} module for building with Tcl 9.0 and
future libtommath by replacing usage of deprecated functions
@code{mp_to_unsigned_bin_n()} and @code{mp_unsigned_bin_size()} when
necessary.

@item 
gh-102676@footnote{https://github.com/python/cpython/issues/102676}: Add fields @code{start_offset}, @code{cache_offset}, @code{end_offset},
@code{baseopname}, @code{baseopcode}, @code{jump_target} and @code{oparg} to
@ref{205,,dis.Instruction}.

@item 
gh-103558@footnote{https://github.com/python/cpython/issues/103558}: Fixed @code{parent} argument validation mechanism of
@ref{7,,argparse}. Improved test coverage.

@item 
gh-103464@footnote{https://github.com/python/cpython/issues/103464}: Provide helpful usage messages when parsing incorrect
@ref{aa,,pdb} commands.

@item 
gh-103384@footnote{https://github.com/python/cpython/issues/103384}: Generalize the regex pattern @code{BaseConfigurator.INDEX_PATTERN}
to allow spaces and non-alphanumeric characters in keys.

@item 
gh-103124@footnote{https://github.com/python/cpython/issues/103124}: Added multiline statement support for @ref{aa,,pdb}

@item 
gh-101162@footnote{https://github.com/python/cpython/issues/101162}: Forbid using @code{builtins.issubclass()} with
@ref{9f2,,types.GenericAlias} as the first argument.

@item 
gh-103200@footnote{https://github.com/python/cpython/issues/103200}: Fix cache repopulation semantics of
zipimport.invalidate_caches(). The cache is now repopulated upon
retrieving files with an invalid cache, not when the cache is invalidated.

@item 
gh-100061@footnote{https://github.com/python/cpython/issues/100061}: Fix a bug that causes wrong matches for regular expressions
with possessive qualifier.

@item 
gh-77609@footnote{https://github.com/python/cpython/issues/77609}: Add `follow_symlinks' argument to @ref{538,,pathlib.Path.glob()} and
@ref{539,,rglob()}, defaulting to false.

@item 
gh-102541@footnote{https://github.com/python/cpython/issues/102541}: Hide traceback in @ref{ada,,help()} prompt, when import failed.

@item 
gh-102120@footnote{https://github.com/python/cpython/issues/102120}: Added a stream mode to @code{tarfile} that allows for reading
archives without caching info about the inner files.

@item 
gh-102029@footnote{https://github.com/python/cpython/issues/102029}: Deprecate passing any arguments to @ref{32c,,threading.RLock()}.

@item 
gh-88233@footnote{https://github.com/python/cpython/issues/88233}: Refactored @code{zipfile._strip_extra} to use higher level
abstractions for extras instead of a heavy-state loop.

@item 
gh-102024@footnote{https://github.com/python/cpython/issues/102024}: Reduce calls of @code{_idle_semaphore.release()} in
@code{concurrent.futures.thread._worker()}.

@item 
gh-73435@footnote{https://github.com/python/cpython/issues/73435}: Add support for recursive wildcards in
@ref{6d4,,pathlib.PurePath.match()}.

@item 
gh-84867@footnote{https://github.com/python/cpython/issues/84867}: @ref{593,,unittest.TestLoader} no longer loads test cases from
exact @ref{2b5,,unittest.TestCase} and @ref{1abf,,unittest.FunctionTestCase}
classes.

@item 
gh-99203@footnote{https://github.com/python/cpython/issues/99203}: Restore following CPython <= 3.10.5 behavior of
@ref{6db,,shutil.make_archive()}: do not create an empty archive if
@code{root_dir} is not a directory, and, in that case, raise
@ref{266,,FileNotFoundError} or @ref{1260,,NotADirectoryError} regardless of
@code{format} choice. Beyond the brought-back behavior, the function may now
also raise these exceptions in @code{dry_run} mode.

@item 
gh-80480@footnote{https://github.com/python/cpython/issues/80480}: Emit @ref{1a4,,DeprecationWarning} for @ref{8,,array}’s @code{'u'} type
code, deprecated in docs since Python 3.3.

@item 
gh-94924@footnote{https://github.com/python/cpython/issues/94924}: @ref{1978,,unittest.mock.create_autospec()} now properly returns
coroutine functions compatible with @ref{30f,,inspect.iscoroutinefunction()}

@item 
gh-94777@footnote{https://github.com/python/cpython/issues/94777}: Fix hanging @ref{98,,multiprocessing} @code{ProcessPoolExecutor} when
a child process crashes while data is being written in the call queue.

@item 
gh-92871@footnote{https://github.com/python/cpython/issues/92871}: Remove the @code{typing.io} and @code{typing.re} namespaces,
deprecated since Python 3.8. All items are still available from the main
@ref{10b,,typing} module.

@item 
bpo-43633@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43633}: Improve the textual representation of IPv4-mapped IPv6
addresses (
@geindex RFC; RFC 4291
RFC 4291@footnote{https://datatracker.ietf.org/doc/html/rfc4291.html} Sections 2.2, 2.5.5.2) in @ref{84,,ipaddress}. Patch
by Oleksandr Pavliuk.

@item 
bpo-44850@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44850}: Improve performance of @ref{103a,,operator.methodcaller()} using the
@geindex Python Enhancement Proposals; PEP 590
PEP 590@footnote{https://peps.python.org/pep-0590/} @code{vectorcall} convention. Patch by Anthony Lee and Pieter
Eendebak.

@item 
bpo-44185@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44185}: @ref{11ed,,unittest.mock.mock_open()} will call the @code{close()}
method of the file handle mock when it is exiting from the context
manager. Patch by Samet Yaslan.

@item 
bpo-40988@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40988}: Improve performance of @ref{be9,,functools.singledispatchmethod}
by caching the generated dispatch wrapper. Optimization suggested by
frederico. Patch by @@mental32, Alex Waygood and Pieter Eendebak.

@item 
bpo-41768@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41768}: @ref{10e,,unittest.mock} speccing no longer calls class properties.
Patch by Melanie Witt.

@item 
bpo-18319@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18319}: Ensure @code{gettext(msg)} retrieve translations even if a plural
form exists. In other words: @code{gettext(msg) == ngettext(msg, '@w{'}, 1)}.

@item 
bpo-17013@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17013}: Add @code{ThreadingMock} to @ref{10e,,unittest.mock} that can be used
to create Mock objects that can wait until they are called. Patch by
Karthikeyan Singaravelan and Mario Corchero.
@end itemize

@node Documentation<23>,Tests<23>,Library<68>,Python 3 13 0 alpha 1
@anchor{whatsnew/changelog id309}@anchor{1ac0}
@subsubsection Documentation



@itemize -

@item 
gh-109209@footnote{https://github.com/python/cpython/issues/109209}: The minimum Sphinx version required for the documentation is
now 4.2.

@item 
gh-108826@footnote{https://github.com/python/cpython/issues/108826}: @ref{3c,,dis} module command-line interface is now mentioned in
documentation.

@item 
gh-107305@footnote{https://github.com/python/cpython/issues/107305}: Add documentation for @ref{78f,,PyInterpreterConfig} and
@ref{68a,,Py_NewInterpreterFromConfig()}.  Also clarify some of the nearby
docs relative to per-interpreter GIL.

@item 
gh-107008@footnote{https://github.com/python/cpython/issues/107008}: Document the @ref{2f,,curses} module variables
@ref{ff2,,LINES} and @ref{ff3,,COLS}.

@item 
gh-106948@footnote{https://github.com/python/cpython/issues/106948}: Add a number of standard external names to @code{nitpick_ignore}.

@item 
gh-106232@footnote{https://github.com/python/cpython/issues/106232}: Make timeit doc command lines compatible with Windows by using
double quotes for arguments.  This works on linux and macOS also.

@item 
gh-105172@footnote{https://github.com/python/cpython/issues/105172}: Fixed @ref{be8,,functools.lru_cache()} docstring accounting for
@code{typed} argument’s different handling of str and int. Patch by Bar
Harel.

@item 
gh-105052@footnote{https://github.com/python/cpython/issues/105052}: Update @code{timeit} doc to specify that time in seconds is just
the default.

@item 
gh-89455@footnote{https://github.com/python/cpython/issues/89455}: Add missing documentation for the @code{max_group_depth} and
@code{max_group_width} parameters and the @code{exceptions} attribute of the
@ref{563,,traceback.TracebackException} class.

@item 
gh-89412@footnote{https://github.com/python/cpython/issues/89412}: Add missing documentation for the @code{end_lineno} and
@code{end_offset} attributes of the @ref{563,,traceback.TracebackException}
class.

@item 
gh-104943@footnote{https://github.com/python/cpython/issues/104943}: Remove mentions of old Python versions in
@ref{32f,,typing.NamedTuple}.

@item 
gh-54738@footnote{https://github.com/python/cpython/issues/54738}: Add documentation on how to localize the @ref{7,,argparse} module.

@item 
gh-102823@footnote{https://github.com/python/cpython/issues/102823}: Document the return type of @code{x // y} when @code{x} and @code{y}
have type @ref{197,,float}.

@item 
gh-102759@footnote{https://github.com/python/cpython/issues/102759}: Align function signature for @code{functools.reduce} in
documentation and docstring with the C implementation.
@end itemize

@node Tests<23>,Build<26>,Documentation<23>,Python 3 13 0 alpha 1
@anchor{whatsnew/changelog id310}@anchor{1ac1}
@subsubsection Tests



@itemize -

@item 
gh-110647@footnote{https://github.com/python/cpython/issues/110647}: Fix test_stress_modifying_handlers() of test_signal. Patch by
Victor Stinner.

@item 
gh-103053@footnote{https://github.com/python/cpython/issues/103053}: Fix test_tools.test_freeze on FreeBSD: run “make distclean”
instead of “make clean” in the copied source directory to remove also the
“python” program. Patch by Victor Stinner.

@item 
gh-110167@footnote{https://github.com/python/cpython/issues/110167}: Fix a deadlock in test_socket when server fails with a timeout
but the client is still running in its thread. Don’t hold a lock to call
cleanup functions in doCleanups(). One of the cleanup function waits until
the client completes, whereas the client could deadlock if it called
addCleanup() in such situation. Patch by Victor Stinner.

@item 
gh-110388@footnote{https://github.com/python/cpython/issues/110388}: Add tests for @ref{107,,tty}.

@item 
gh-81002@footnote{https://github.com/python/cpython/issues/81002}: Add tests for @ref{e7,,termios}.

@item 
gh-110367@footnote{https://github.com/python/cpython/issues/110367}: regrtest: When using worker processes (-jN) with –verbose3
option, regrtest can now display the worker output even if a worker
process does crash. Previously, sys.stdout and sys.stderr were replaced
and so the worker output was lost on a crash. Patch by Victor Stinner.

@item 
gh-110267@footnote{https://github.com/python/cpython/issues/110267}: Add tests for pickling and copying PyStructSequence objects.
Patched by Xuehai Pan.

@item 
gh-110171@footnote{https://github.com/python/cpython/issues/110171}: @code{libregrtest} now always sets and shows @code{random.seed}, so
tests are more reproducible. Use @code{--randseed} flag to pass the explicit
random seed for tests.

@item 
gh-110152@footnote{https://github.com/python/cpython/issues/110152}: Remove @code{Tools/scripts/run_tests.py} and @code{make
hostrunnertest}. Just run @code{./python -m test --slow-ci}, @code{make
buildbottest} or @code{make test} instead. Python test runner (regrtest) now
handles cross-compilation and HOSTRUNNER. It also adds options to Python
such fast @code{-u -E -W default -bb} when @code{--fast-ci} or @code{--slow-ci}
option is used. Patch by Victor Stinner.

@item 
gh-110031@footnote{https://github.com/python/cpython/issues/110031}: Skip test_threading tests using thread+fork if Python is built
with Address Sanitizer (ASAN). Patch by Victor Stinner.

@item 
gh-110088@footnote{https://github.com/python/cpython/issues/110088}: Fix test_asyncio timeouts: don’t measure the maximum duration,
a test should not measure a CI performance. Only measure the minimum
duration when a task has a timeout or delay. Add @code{CLOCK_RES} to
@code{test_asyncio.utils}. Patch by Victor Stinner.

@item 
gh-109974@footnote{https://github.com/python/cpython/issues/109974}: Fix race conditions in test_threading lock tests. Wait until a
condition is met rather than using @ref{8ae,,time.sleep()} with a hardcoded
number of seconds. Patch by Victor Stinner.

@item 
gh-110033@footnote{https://github.com/python/cpython/issues/110033}: Fix @code{test_interprocess_signal()} of @code{test_signal}. Make
sure that the @code{subprocess.Popen} object is deleted before the test
raising an exception in a signal handler. Otherwise, @code{Popen.__del__()}
can get the exception which is logged as @code{Exception ignored in: ...} and
the test fails. Patch by Victor Stinner.

@item 
gh-109594@footnote{https://github.com/python/cpython/issues/109594}: Fix test_timeout() of test_concurrent_futures.test_wait. Remove
the future which may or may not complete depending if it takes longer than
the timeout or not. Keep the second future which does not complete before
wait() timeout. Patch by Victor Stinner.

@item 
gh-109972@footnote{https://github.com/python/cpython/issues/109972}: Split test_gdb.py file into a test_gdb package made of multiple
tests, so tests can now be run in parallel. Patch by Victor Stinner.

@item 
gh-109566@footnote{https://github.com/python/cpython/issues/109566}: regrtest: When @code{--fast-ci} or @code{--slow-ci} option is used,
regrtest now replaces the current process with a new process to add @code{-u
-W default -bb -E} options to Python. Patch by Victor Stinner.

@item 
gh-109748@footnote{https://github.com/python/cpython/issues/109748}: Fix @code{test_zippath_from_non_installed_posix()} of test_venv:
don’t copy @code{__pycache__/} sub-directories, because they can be modified
by other Python tests running in parallel. Patch by Victor Stinner.

@item 
gh-109739@footnote{https://github.com/python/cpython/issues/109739}: regrtest: Fix reference leak check on Windows. Disable the load
tracker on Windows in the reference leak check mode (-R option). Patch by
Victor Stinner.

@item 
gh-109276@footnote{https://github.com/python/cpython/issues/109276}: regrtest: When a test fails with “env changed” and the –rerun
option is used, the test is now re-run in verbose mode in a fresh process.
Patch by Victor Stinner.

@item 
gh-103053@footnote{https://github.com/python/cpython/issues/103053}: Skip test_freeze_simple_script() of test_tools.test_freeze if
Python is built with @code{./configure --enable-optimizations}, which means
with Profile Guided Optimization (PGO): it just makes the test too slow.
The freeze tool is tested by many other CIs with other (faster) compiler
flags. Patch by Victor Stinner.

@item 
gh-109580@footnote{https://github.com/python/cpython/issues/109580}: Skip @code{test_perf_profiler} if Python is built with ASAN, MSAN
or UBSAN sanitizer. Python does crash randomly in this test on such build.
Patch by Victor Stinner.

@item 
gh-109566@footnote{https://github.com/python/cpython/issues/109566}: regrtest: Add @code{--fast-ci} and @code{--slow-ci} options.
@code{--fast-ci} uses a default timeout of 10 minutes and @code{-u all,-cpu}
(skip slowest tests). @code{--slow-ci} uses a default timeout of 20 minutes
and @code{-u all} (run all tests). Patch by Victor Stinner.

@item 
gh-109425@footnote{https://github.com/python/cpython/issues/109425}: libregrtest now decodes stdout of test worker processes with
the “backslashreplace” error handler to log corrupted stdout, instead of
failing with an error and not logging the stdout. Patch by Victor Stinner.

@item 
gh-109396@footnote{https://github.com/python/cpython/issues/109396}: Fix @code{test_socket.test_hmac_sha1()} in FIPS mode. Use a longer
key: FIPS mode requires at least of at least 112 bits. The previous key
was only 32 bits. Patch by Victor Stinner.

@item 
gh-104736@footnote{https://github.com/python/cpython/issues/104736}: Fix test_gdb on Python built with LLVM clang 16 on Linux
ppc64le (ex: Fedora 38). Search patterns in gdb “bt” command output to
detect when gdb fails to retrieve the traceback. For example, skip a test
if @code{Backtrace stopped: frame did not save the PC} is found. Patch by
Victor Stinner.

@item 
gh-109276@footnote{https://github.com/python/cpython/issues/109276}: libregrtest now calls @ref{147f,,random.seed()} before running each
test file when @code{-r/--randomize} command line option is used. Moreover,
it’s also called in worker processes.  It should help to make tests more
deterministic. Previously, it was only called once in the main process
before running all test files and it was not called in worker processes.
Patch by Victor Stinner.

@item 
gh-109276@footnote{https://github.com/python/cpython/issues/109276}: libregrtest now uses a separated file descriptor to write test
result as JSON. Previously, if a test wrote debug messages late around the
JSON, the main test process failed to parse JSON. Patch by Victor Stinner.

@item 
gh-108996@footnote{https://github.com/python/cpython/issues/108996}: Fix and enable @code{test_msvcrt}.

@item 
gh-109237@footnote{https://github.com/python/cpython/issues/109237}: Fix @code{test_site.test_underpth_basic()} when the working
directory contains at least one non-ASCII character: encode the @code{._pth}
file to UTF-8 and enable the UTF-8 Mode to use UTF-8 for the child process
stdout. Patch by Victor Stinner.

@item 
gh-109230@footnote{https://github.com/python/cpython/issues/109230}: Fix @code{test_pyexpat.test_exception()}: it can now be run from a
directory different than Python source code directory. Before, the test
failed in this case.  Skip the test if Modules/pyexpat.c source is not
available. Skip also the test on Python implementations other than
CPython. Patch by Victor Stinner.

@item 
gh-108996@footnote{https://github.com/python/cpython/issues/108996}: Add tests for @code{msvcrt}.

@item 
gh-109015@footnote{https://github.com/python/cpython/issues/109015}: Fix test_asyncio, test_imaplib and test_socket tests on FreeBSD
if the TCP blackhole is enabled (@code{sysctl net.inet.tcp.blackhole}). Skip
the few tests which failed with @code{ETIMEDOUT} which such non standard
configuration. Currently, the FreeBSD GCP image enables TCP and UDP blackhole@footnote{https://reviews.freebsd.org/D41751} (@code{sysctl
net.inet.tcp.blackhole=2} and @code{sysctl net.inet.udp.blackhole=1}).
Patch by Victor Stinner.

@item 
gh-91960@footnote{https://github.com/python/cpython/issues/91960}: Skip @code{test_gdb} if gdb is unable to retrieve Python frame
objects: if a frame is @code{<optimized out>}. When Python is built with
“clang -Og”, gdb can fail to retrieve the `frame' parameter of
@code{_PyEval_EvalFrameDefault()}. In this case, tests like @code{py_bt()} are
likely to fail. Without getting access to Python frames, @code{python-gdb.py}
is mostly clueless on retrieving the Python traceback. Moreover,
@code{test_gdb} is no longer skipped on macOS if Python is built with Clang.
Patch by Victor Stinner.

@item 
gh-108962@footnote{https://github.com/python/cpython/issues/108962}: Skip @code{test_tempfile.test_flags()} if @code{chflags()} fails with
“OSError: [Errno 45] Operation not supported” (ex: on FreeBSD 13). Patch
by Victor Stinner.

@item 
gh-91960@footnote{https://github.com/python/cpython/issues/91960}: FreeBSD 13.2 CI coverage for pull requests is now provided by
Cirrus-CI (a hosted CI service that supports Linux, macOS, Windows, and
FreeBSD).

@item 
gh-89392@footnote{https://github.com/python/cpython/issues/89392}: Removed support of @code{test_main()} function in tests. They now
always use normal unittest test runner.

@item 
gh-108851@footnote{https://github.com/python/cpython/issues/108851}: Fix @code{test_tomllib} recursion tests for WASI buildbots: reduce
the recursion limit and compute the maximum nested array/dict depending on
the current available recursion limit. Patch by Victor Stinner.

@item 
gh-108851@footnote{https://github.com/python/cpython/issues/108851}: Add @code{get_recursion_available()} and @code{get_recursion_depth()}
functions to the @ref{ea,,test.support} module. Patch by Victor Stinner.

@item 
gh-108834@footnote{https://github.com/python/cpython/issues/108834}: Add @code{--fail-rerun option} option to regrtest: if a test
failed when then passed when rerun in verbose mode, exit the process with
exit code 2 (error), instead of exit code 0 (success). Patch by Victor
Stinner.

@item 
gh-108834@footnote{https://github.com/python/cpython/issues/108834}: Rename regrtest @code{--verbose2} option (@code{-w}) to @code{--rerun}.
Keep @code{--verbose2} as a deprecated alias. Patch by Victor Stinner.

@item 
gh-108834@footnote{https://github.com/python/cpython/issues/108834}: When regrtest reruns failed tests in verbose mode (@code{./python
-m test --rerun}), tests are now rerun in fresh worker processes rather
than being executed in the main process. If a test does crash or is killed
by a timeout, the main process can detect and handle the killed worker
process. Tests are rerun in parallel if the @code{-jN} option is used to run
tests in parallel. Patch by Victor Stinner.

@item 
gh-108822@footnote{https://github.com/python/cpython/issues/108822}: @code{regrtest} now computes statistics on all tests: successes,
failures and skipped. @code{test_netrc}, @code{test_pep646_syntax} and
@code{test_xml_etree} now return results in their @code{test_main()} function.
Patch by Victor Stinner and Alex Waygood.

@item 
gh-108794@footnote{https://github.com/python/cpython/issues/108794}: The @ref{4ef,,doctest.DocTestRunner.run()} method now counts the
number of skipped tests. Add @ref{4f0,,doctest.DocTestRunner.skips} and
@ref{4f1,,doctest.TestResults.skipped} attributes. Patch by Victor Stinner.

@item 
gh-108388@footnote{https://github.com/python/cpython/issues/108388}: Convert test_concurrent_futures to a package of 7 sub-tests.
Patch by Victor Stinner.

@item 
gh-108388@footnote{https://github.com/python/cpython/issues/108388}: Split test_multiprocessing_fork,
test_multiprocessing_forkserver and test_multiprocessing_spawn into test
packages. Each package is made of 4 sub-tests: processes, threads, manager
and misc. It allows running more tests in parallel and so reduce the total
test duration. Patch by Victor Stinner.

@item 
gh-105776@footnote{https://github.com/python/cpython/issues/105776}: Fix test_cppext when the C compiler command @code{-std=c11}
option: remove @code{-std=} options from the compiler command. Patch by
Victor Stinner.

@item 
gh-107652@footnote{https://github.com/python/cpython/issues/107652}: Set up CIFuzz to run fuzz targets in GitHub Actions. Patch by
Illia Volochii.

@item 
gh-107237@footnote{https://github.com/python/cpython/issues/107237}: @code{test_logging}: Fix @code{test_udp_reconnection()} by increasing
the timeout from 100 ms to 5 minutes (LONG_TIMEOUT). Patch by Victor
Stinner.

@item 
gh-107178@footnote{https://github.com/python/cpython/issues/107178}: Add the C API test for functions in the Mapping Protocol, the
Sequence Protocol and some functions in the Object Protocol.

@item 
gh-106714@footnote{https://github.com/python/cpython/issues/106714}: test_capi: Fix test_no_FatalError_infinite_loop() to no longer
write a coredump, by using test.support.SuppressCrashReport. Patch by
Victor Stinner.

@item 
gh-104090@footnote{https://github.com/python/cpython/issues/104090}: Avoid creating a reference to the test object in
@ref{1ac2,,collectedDurations()}.

@item 
gh-106752@footnote{https://github.com/python/cpython/issues/106752}: Moved tests for @code{zipfile.Path} into
@code{Lib/test/test_zipfile/_path}. Made @code{zipfile._path} a package.

@item 
gh-106690@footnote{https://github.com/python/cpython/issues/106690}: Add .coveragerc to cpython repository for use with coverage
package.

@item 
gh-101634@footnote{https://github.com/python/cpython/issues/101634}: When running the Python test suite with @code{-jN} option, if a
worker stdout cannot be decoded from the locale encoding report a failed
testn so the exitcode is non-zero. Patch by Victor Stinner.

@item 
gh-105084@footnote{https://github.com/python/cpython/issues/105084}: When the Python build is configured @code{--with-wheel-pkg-dir},
tests requiring the @code{setuptools} and @code{wheel} wheels will search for
the wheels in @code{WHEEL_PKG_DIR}.

@item 
gh-81005@footnote{https://github.com/python/cpython/issues/81005}: String tests are modified to reflect that @code{str} and
@code{unicode} are merged in Python 3. Patch by Daniel Fortunov.

@item 
gh-103186@footnote{https://github.com/python/cpython/issues/103186}: Suppress and assert expected RuntimeWarnings in
test_sys_settrace.py

@item 
gh-69714@footnote{https://github.com/python/cpython/issues/69714}: Add additional tests to @ref{15,,calendar} to achieve full test
coverage.
@end itemize

@node Build<26>,Windows<23>,Tests<23>,Python 3 13 0 alpha 1
@anchor{whatsnew/changelog id311}@anchor{1ac3}
@subsubsection Build



@itemize -

@item 
gh-103053@footnote{https://github.com/python/cpython/issues/103053}: “make check-clean-src” now also checks if the “python” program
is found in the source directory: fail with an error if it does exist.
Patch by Victor Stinner.

@item 
gh-109191@footnote{https://github.com/python/cpython/issues/109191}: Fix compile error when building with recent versions of
libedit.

@item 
gh-110276@footnote{https://github.com/python/cpython/issues/110276}: No longer ignore 
@geindex PROFILE_TASK
@geindex environment variable; PROFILE_TASK
@ref{1ac4,,PROFILE_TASK} failure silently:
command used by Profile Guided Optimization (PGO). Patch by Victor
Stinner.

@item 
gh-109566@footnote{https://github.com/python/cpython/issues/109566}: Remove @code{make testall} target: use @code{make buildbottest}
instead. Patch by Victor Stinner.

@item 
gh-109740@footnote{https://github.com/python/cpython/issues/109740}: The experimental @code{--disable-gil} configure flag now includes
“t” (for “threaded”) in extension ABI tags.

@item 
gh-109054@footnote{https://github.com/python/cpython/issues/109054}: Fix building the @code{_testcapi} extension on Linux AArch64 which
requires linking to libatomic when @code{<cpython/pyatomic.h>} is used: the
@code{_Py_atomic_or_uint64()} function requires libatomic
@code{__atomic_fetch_or_8()} on this platform. The configure script now
checks if linking to libatomic is needed and generates a new LIBATOMIC
variable used to build the _testcapi extension. Patch by Victor Stinner.

@item 
gh-63760@footnote{https://github.com/python/cpython/issues/63760}: Fix Solaris build: no longer redefine the @code{gethostname()}
function. Solaris defines the function since 2005. Patch by Victor
Stinner, original patch by Jakub Kulík.

@item 
gh-108740@footnote{https://github.com/python/cpython/issues/108740}: Fix a race condition in @code{make regen-all}. The
@code{deepfreeze.c} source and files generated by Argument Clinic are now
generated or updated before generating “global objects”. Previously, some
identifiers may miss depending on the order in which these files were
generated. Patch by Victor Stinner.

@item 
gh-108634@footnote{https://github.com/python/cpython/issues/108634}: Python built with @code{configure} @ref{636,,--with-trace-refs}
(tracing references) is now ABI compatible with Python release build and
@ref{50a,,debug build}. Patch by Victor Stinner.

@item 
gh-85283@footnote{https://github.com/python/cpython/issues/85283}: The @code{_stat} C extension is now built with the @ref{637,,limited C API}. Patch by Victor Stinner.

@item 
gh-108447@footnote{https://github.com/python/cpython/issues/108447}: Fix x86_64 GNU/Hurd build

@item 
gh-107814@footnote{https://github.com/python/cpython/issues/107814}: When calling @code{find_python.bat} with @code{-q} it did not
properly silence the output of nuget. That is now fixed.

@item 
gh-105481@footnote{https://github.com/python/cpython/issues/105481}: Remove the make target @code{regen-opcode-targets}, merge its work
into @code{regen-opcode} which repeats most of the calculation. This
simplifies the code for the build and reduces code duplication.

@item 
gh-106881@footnote{https://github.com/python/cpython/issues/106881}: Check for @code{linux/limits.h} before including it in
@code{Modules/posixmodule.c}.

@item 
gh-95855@footnote{https://github.com/python/cpython/issues/95855}: Refactor platform triplet detection code and add detection for
MIPS soft float and musl libc.

@item 
gh-106962@footnote{https://github.com/python/cpython/issues/106962}: Detect MPI compilers in @code{configure}.

@item 
gh-106118@footnote{https://github.com/python/cpython/issues/106118}: Fix compilation for platforms without @code{O_CLOEXEC}. The
issue was introduced with Python 3.12b1 in gh-103295@footnote{https://github.com/python/cpython/issues/103295}. Patch by Erlend
Aasland.

@item 
gh-105875@footnote{https://github.com/python/cpython/issues/105875}: SQLite 3.15.2 or newer is required to build the @ref{d4,,sqlite3}
extension module. Patch by Erlend Aasland.

@item 
gh-90005@footnote{https://github.com/python/cpython/issues/90005}: Fix a regression in @code{configure} where we could end up
unintentionally linking with @code{libbsd}.

@item 
gh-102404@footnote{https://github.com/python/cpython/issues/102404}: Document how to perform a WASI build on Linux. Also add
Tools/wasm/build_wasi.sh as a reference implementation of the docs.

@item 
gh-89886@footnote{https://github.com/python/cpython/issues/89886}: Autoconf 2.71 and aclocal 1.16.4 is now required to regenerate
@code{configure}.

@item 
gh-104692@footnote{https://github.com/python/cpython/issues/104692}: Include @code{commoninstall} as a prerequisite for @code{bininstall}

This ensures that @code{commoninstall} is completed before @code{bininstall} is
started when parallel builds are used (@code{make -j install}), and so the
@code{python3} symlink is only installed after all standard library modules
are installed.

@item 
gh-101538@footnote{https://github.com/python/cpython/issues/101538}: Add experimental wasi-threads support. Patch by Takashi
Yamamoto.
@end itemize

@node Windows<23>,macOS<17>,Build<26>,Python 3 13 0 alpha 1
@anchor{whatsnew/changelog id312}@anchor{1ac5}
@subsubsection Windows



@itemize -

@item 
gh-110437@footnote{https://github.com/python/cpython/issues/110437}: Allows overriding the source of VC redistributables so that
releases can be guaranteed to never downgrade between updates.

@item 
gh-109286@footnote{https://github.com/python/cpython/issues/109286}: Update Windows installer to use SQLite 3.43.1.

@item 
gh-82367@footnote{https://github.com/python/cpython/issues/82367}: @ref{264,,os.path.realpath()} now resolves MS-DOS style file names
even if the file is not accessible. Patch by Moonsik Park.

@item 
gh-109991@footnote{https://github.com/python/cpython/issues/109991}: Update Windows build to use OpenSSL 3.0.11.

@item 
gh-106242@footnote{https://github.com/python/cpython/issues/106242}: Fixes @ref{264,,realpath()} to behave consistently when
passed a path containing an embedded null character on Windows. In strict
mode, it now raises @ref{2c2,,OSError} instead of the unexpected
@ref{2ee,,ValueError}, and in non-strict mode will make the path absolute.

@item 
gh-83180@footnote{https://github.com/python/cpython/issues/83180}: Changes the @ref{7db,,Python install manager} to prefer an active virtual
environment when the launched script has a shebang line using a Unix-like
virtual command, even if the command requests a specific version of
Python.

@item 
gh-106844@footnote{https://github.com/python/cpython/issues/106844}: Fix integer overflow and truncating by the null character in
@code{_winapi.LCMapStringEx()} which affects @code{ntpath.normcase()}.

@item 
gh-105436@footnote{https://github.com/python/cpython/issues/105436}: Ensure that an empty environment block is terminated by two
null characters, as is required by Windows.

@item 
gh-105146@footnote{https://github.com/python/cpython/issues/105146}: Updated the links at the end of the installer to point to
Discourse rather than the mailing lists.

@item 
gh-103646@footnote{https://github.com/python/cpython/issues/103646}: When installed from the Microsoft Store, @code{pip} no longer
defaults to per-user installs. However, as the install directory is
unwritable, it should automatically decide to do a per-user install
anyway. This should resolve issues when @code{pip} is passed an option that
conflicts with @code{--user}.

@item 
gh-88745@footnote{https://github.com/python/cpython/issues/88745}: Improve performance of @ref{c56,,shutil.copy2()} by using the
operating system’s @code{CopyFile2} function. This may result in subtle
changes to metadata copied along with some files, bringing them in line
with normal OS behavior.

@item 
gh-104820@footnote{https://github.com/python/cpython/issues/104820}: Fixes @ref{26f,,stat()} and related functions on file systems
that do not support file ID requests. This includes FAT32 and exFAT.

@item 
gh-104803@footnote{https://github.com/python/cpython/issues/104803}: Add @ref{1a04,,os.path.isdevdrive()} to detect whether a path is on a
Windows Dev Drive. Returns @code{False} on platforms that do not support Dev
Drive, and is absent on non-Windows platforms.
@end itemize

@node macOS<17>,IDLE<14>,Windows<23>,Python 3 13 0 alpha 1
@anchor{whatsnew/changelog id313}@anchor{1ac6}
@subsubsection macOS



@itemize -

@item 
gh-109286@footnote{https://github.com/python/cpython/issues/109286}: Update macOS installer to use SQLite 3.43.1.

@item 
gh-109991@footnote{https://github.com/python/cpython/issues/109991}: Update macOS installer to use OpenSSL 3.0.11.

@item 
gh-99079@footnote{https://github.com/python/cpython/issues/99079}: Update macOS installer to use OpenSSL 3.0.9.
@end itemize

@node IDLE<14>,Tools/Demos<19>,macOS<17>,Python 3 13 0 alpha 1
@anchor{whatsnew/changelog id314}@anchor{1ac7}
@subsubsection IDLE



@itemize -

@item 
gh-104719@footnote{https://github.com/python/cpython/issues/104719}: Remove IDLE’s modification of tokenize.tabsize and test other
uses of tokenize data and methods.
@end itemize

@node Tools/Demos<19>,C API<25>,IDLE<14>,Python 3 13 0 alpha 1
@anchor{whatsnew/changelog id315}@anchor{1ac8}
@subsubsection Tools/Demos



@itemize -

@item 
gh-109991@footnote{https://github.com/python/cpython/issues/109991}: Update GitHub CI workflows to use OpenSSL 3.0.11 and
multissltests to use 1.1.1w, 3.0.11, and 3.1.3.

@item 
gh-108494@footnote{https://github.com/python/cpython/issues/108494}: Argument Clinic@footnote{https://devguide.python.org/development-tools/clinic/} now has a
partial support of the @ref{637,,Limited API}: see
documentation in the Python Developer's Guide@footnote{https://devguide.python.org/development-tools/clinic/#clinic-howto-limited-capi}
Patch by Victor Stinner.

@item 
gh-107704@footnote{https://github.com/python/cpython/issues/107704}: It is now possible to deprecate passing keyword arguments for
keyword-or-positional parameters with Argument Clinic, using the new @code{/
[from X.Y]} syntax. (To be read as `“positional-only from Python version
X.Y”'.) See documentation in the Python Developer's Guide@footnote{https://devguide.python.org/development-tools/clinic/#clinic-howto-deprecate-keyword}
for more information.

@item 
gh-107880@footnote{https://github.com/python/cpython/issues/107880}: Argument Clinic can now clone @code{__init__()} and
@code{__new__()} methods.

@item 
gh-104683@footnote{https://github.com/python/cpython/issues/104683}: Add @code{--exclude} option to Argument Clinic CLI.

@item 
gh-95065@footnote{https://github.com/python/cpython/issues/95065}: Argument Clinic now supports overriding automatically generated
signature by using directive @code{@@text_signature}. See documentation in the Python Developer's Guide@footnote{https://devguide.python.org/development-tools/clinic/#clinic-howto-override-signature}

@item 
gh-107609@footnote{https://github.com/python/cpython/issues/107609}: Fix duplicate module check in Argument Clinic. Previously, a
duplicate definition would incorrectly be silently accepted. Patch by
Erlend E. Aasland.

@item 
gh-107467@footnote{https://github.com/python/cpython/issues/107467}: The Argument Clinic command-line tool now prints to stderr
instead of stdout on failure.

@item 
gh-106970@footnote{https://github.com/python/cpython/issues/106970}: Fix bugs in the Argument Clinic @code{destination <name> clear}
command; the destination buffers would never be cleared, and the
@code{destination} directive parser would simply continue to the fault
handler after processing the command. Patch by Erlend E. Aasland.

@item 
gh-106706@footnote{https://github.com/python/cpython/issues/106706}: Change bytecode syntax for families to remove redundant name
matching pseudo syntax.

@item 
gh-106359@footnote{https://github.com/python/cpython/issues/106359}: Argument Clinic now explicitly forbids “kwarg splats” in
function calls used as annotations.

@item 
gh-103186@footnote{https://github.com/python/cpython/issues/103186}: @code{freeze} now fetches @code{CONFIG_ARGS} from the original
CPython instance the Makefile uses to call utility scripts. Patch by
Ijtaba Hussain.

@item 
gh-95065@footnote{https://github.com/python/cpython/issues/95065}: It is now possible to deprecate passing parameters positionally
with Argument Clinic, using the new @code{* [from X.Y]} syntax. (To be read
as `“keyword-only from Python version X.Y”'.) See documentation in the Python Developer's Guide@footnote{https://devguide.python.org/development-tools/clinic/#clinic-howto-deprecate-positional}
for more information. Patch by Erlend E. Aasland with help from Alex
Waygood, Nikita Sobolev, and Serhiy Storchaka.
@end itemize

@node C API<25>,,Tools/Demos<19>,Python 3 13 0 alpha 1
@anchor{whatsnew/changelog id316}@anchor{1ac9}
@subsubsection C API



@itemize -

@item 
gh-85283@footnote{https://github.com/python/cpython/issues/85283}: If the @ref{660,,Py_LIMITED_API} macro is defined,
@code{Py_BUILD_CORE}, @code{Py_BUILD_CORE_BUILTIN} and
@code{Py_BUILD_CORE_MODULE} macros are now undefined by
@code{<Python.h>}. Patch by Victor Stinner.

@item 
gh-110289@footnote{https://github.com/python/cpython/issues/110289}: Add @ref{619,,PyUnicode_EqualToUTF8AndSize()} and
@ref{61a,,PyUnicode_EqualToUTF8()} functions.

@item 
gh-110235@footnote{https://github.com/python/cpython/issues/110235}: Raise @ref{199,,TypeError} for duplicate/unknown fields in
@code{PyStructSequence} constructor. Patched by Xuehai Pan.

@item 
gh-110014@footnote{https://github.com/python/cpython/issues/110014}: Remove undocumented @code{PY_TIMEOUT_MAX} constant from the
limited C API. Patch by Victor Stinner.

@item 
gh-109521@footnote{https://github.com/python/cpython/issues/109521}: @ref{1aca,,PyImport_GetImporter()} now sets RuntimeError if it
fails to get @ref{122a,,sys.path_hooks} or @ref{7fb,,sys.path_importer_cache} or
they are not list and dict correspondingly. Previously it could return
NULL without setting error in obscure cases, crash or raise SystemError if
these attributes have wrong type.

@item 
gh-108724@footnote{https://github.com/python/cpython/issues/108724}: Add @ref{485,,PyMutex} internal-only lightweight locking API.

@item 
gh-85283@footnote{https://github.com/python/cpython/issues/85283}: Add @ref{612,,PySys_AuditTuple()} function: similar to
@ref{613,,PySys_Audit()}, but pass event arguments as a Python @ref{614,,tuple}
object.  Patch by Victor Stinner.

@item 
gh-108867@footnote{https://github.com/python/cpython/issues/108867}: Add @ref{421,,PyThreadState_GetUnchecked()} function: similar to
@ref{615,,PyThreadState_Get()}, but don’t kill the process with a fatal
error if it is NULL. The caller is responsible to check if the result is
NULL. Previously, the function was private and known as
@code{_PyThreadState_UncheckedGet()}. Patch by Victor Stinner.

@item 
gh-108765@footnote{https://github.com/python/cpython/issues/108765}: @code{Python.h} no longer includes the @code{<ctype.h>} standard
header file. If needed, it should now be included explicitly. For example,
it provides @code{isalpha()} and @code{tolower()} functions which are locale
dependent. Python provides locale independent functions, like
@code{Py_ISALPHA()} and @code{Py_TOLOWER()}. Patch by Victor Stinner.

@item 
gh-108765@footnote{https://github.com/python/cpython/issues/108765}: @code{Python.h} no longer includes the @code{<unistd.h>} standard
header file. If needed, it should now be included explicitly. For example,
it provides the functions: @code{close()}, @code{getpagesize()}, @code{getpid()}
and @code{sysconf()}. Patch by Victor Stinner.

@item 
gh-108765@footnote{https://github.com/python/cpython/issues/108765}: @code{Python.h} no longer includes the @code{<ieeefp.h>} standard
header. It was included for the @code{finite()} function which is now
provided by the @code{<math.h>} header. It should now be included explicitly
if needed. Remove also the @code{HAVE_IEEEFP_H} macro. Patch by Victor
Stinner.

@item 
gh-108765@footnote{https://github.com/python/cpython/issues/108765}: @code{Python.h} no longer includes these standard header files:
@code{<time.h>}, @code{<sys/select.h>} and @code{<sys/time.h>}. If needed, they
should now be included explicitly. For example, @code{<time.h>} provides the
@code{clock()} and @code{gmtime()} functions, @code{<sys/select.h>} provides the
@code{select()} function, and @code{<sys/time.h>} provides the @code{futimes()},
@code{gettimeofday()} and @code{setitimer()} functions. Patch by Victor Stinner.

@item 
gh-108511@footnote{https://github.com/python/cpython/issues/108511}: Add functions @ref{61b,,PyObject_HasAttrWithError()},
@ref{61d,,PyObject_HasAttrStringWithError()},
@ref{61f,,PyMapping_HasKeyWithError()} and
@ref{621,,PyMapping_HasKeyStringWithError()}.

@item 
gh-107073@footnote{https://github.com/python/cpython/issues/107073}: Add @ref{60d,,PyObject_VisitManagedDict()} and
@ref{60e,,PyObject_ClearManagedDict()} functions which must be called by the
traverse and clear functions of a type using
@ref{60f,,Py_TPFLAGS_MANAGED_DICT} flag. Patch by Victor Stinner.

@item 
gh-108634@footnote{https://github.com/python/cpython/issues/108634}: Python built with @code{configure} @ref{636,,--with-trace-refs}
(tracing references) now supports the @ref{637,,Limited API}.
Patch by Victor Stinner.

@item 
gh-108014@footnote{https://github.com/python/cpython/issues/108014}: Add @ref{604,,PyLong_AsInt()} function: similar to
@ref{605,,PyLong_AsLong()}, but store the result in a C int instead
of a C long. Previously, it was known as the private function
@code{_PyLong_AsInt()} (with an underscore prefix). Patch by Victor
Stinner.

@item 
gh-108314@footnote{https://github.com/python/cpython/issues/108314}: Add @ref{5dd,,PyDict_ContainsString()} function: same as
@ref{5de,,PyDict_Contains()}, but `key' is specified as a const char* UTF-8 encoded bytes string, rather than a @ref{5df,,PyObject}*.
Patch by Victor Stinner.

@item 
gh-108337@footnote{https://github.com/python/cpython/issues/108337}: Add atomic operations on additional data types in pyatomic.h.

@item 
gh-108014@footnote{https://github.com/python/cpython/issues/108014}: Add @ref{5fd,,Py_IsFinalizing()} function: check if the main
Python interpreter is @ref{47a,,shutting down}. Patch
by Victor Stinner.

@item 
gh-107916@footnote{https://github.com/python/cpython/issues/107916}: C API functions @ref{1acb,,PyErr_SetFromErrnoWithFilename()},
@ref{1acc,,PyErr_SetExcFromWindowsErrWithFilename()} and
@ref{1acd,,PyErr_SetFromWindowsErrWithFilename()} save now the error code
before calling @ref{1ace,,PyUnicode_DecodeFSDefault()}.

@item 
gh-107915@footnote{https://github.com/python/cpython/issues/107915}: Such C API functions as @code{PyErr_SetString()},
@code{PyErr_Format()}, @code{PyErr_SetFromErrnoWithFilename()} and many others
no longer crash or ignore errors if it failed to format the error message
or decode the filename. Instead, they keep a corresponding error.

@item 
gh-107810@footnote{https://github.com/python/cpython/issues/107810}: Improve @ref{1a4,,DeprecationWarning} for uses of
@ref{1acf,,PyType_Spec} with metaclasses that have custom @code{tp_new}.

@item 
gh-107249@footnote{https://github.com/python/cpython/issues/107249}: Implement the @ref{1ad0,,Py_UNUSED} macro for Windows MSVC
compiler. Patch by Victor Stinner.

@item 
gh-107226@footnote{https://github.com/python/cpython/issues/107226}: @ref{60a,,PyModule_AddObjectRef()} is now only available in the
limited API version 3.10 or later.

@item 
gh-106320@footnote{https://github.com/python/cpython/issues/106320}: Remove private @code{_PyUnicode_AsString()} alias to
@ref{422,,PyUnicode_AsUTF8()}. It was kept for backward compatibility with
Python 3.0 - 3.2. The @code{PyUnicode_AsUTF8()} is available since Python
3.3. The @ref{139a,,PyUnicode_AsUTF8String()} function can be used to keep
compatibility with Python 3.2 and older. Patch by Victor Stinner.

@item 
gh-106572@footnote{https://github.com/python/cpython/issues/106572}: Convert @ref{187b,,PyObject_DelAttr()} and
@ref{187c,,PyObject_DelAttrString()} macros to functions. Patch by Victor
Stinner.

@item 
gh-106307@footnote{https://github.com/python/cpython/issues/106307}: Add @ref{5e8,,PyMapping_GetOptionalItem()} function.

@item 
gh-106521@footnote{https://github.com/python/cpython/issues/106521}: Add @ref{5ec,,PyObject_GetOptionalAttr()} and
@ref{5ed,,PyObject_GetOptionalAttrString()} functions.

@item 
gh-106320@footnote{https://github.com/python/cpython/issues/106320}: Remove @code{_PyInterpreterState_Get()} alias to
@ref{64c,,PyInterpreterState_Get()} which was kept for backward
compatibility with Python 3.8. Patch by Victor Stinner.

@item 
gh-106316@footnote{https://github.com/python/cpython/issues/106316}: Remove @code{cpython/pytime.h} header file: it only contained
private functions. Patch by Victor Stinner.

@item 
gh-106023@footnote{https://github.com/python/cpython/issues/106023}: Remove private @code{_PyObject_FastCall()} function: use
@code{PyObject_Vectorcall()} which is available since Python 3.8
(
@geindex Python Enhancement Proposals; PEP 590
PEP 590@footnote{https://peps.python.org/pep-0590/}). Patch by Victor Stinner.

@item 
gh-106168@footnote{https://github.com/python/cpython/issues/106168}: If Python is built in @ref{50a,,debug mode} or
@ref{62d,,with assertions}, @ref{62e,,PyTuple_SET_ITEM()}
and @ref{62f,,PyList_SET_ITEM()} now check the index argument with an
assertion. If the assertion fails, make sure that the size is set before.
Patch by Victor Stinner.

@item 
gh-106084@footnote{https://github.com/python/cpython/issues/106084}: Remove the old aliases to functions calling functions which
were kept for backward compatibility with Python 3.8 provisional API:


@itemize *

@item 
@code{_PyObject_CallMethodNoArgs()}: use @code{PyObject_CallMethodNoArgs()}

@item 
@code{_PyObject_CallMethodOneArg()}: use @code{PyObject_CallMethodOneArg()}

@item 
@code{_PyObject_CallOneArg()}: use @code{PyObject_CallOneArg()}

@item 
@code{_PyObject_FastCallDict()}: use @code{PyObject_VectorcallDict()}

@item 
@code{_PyObject_Vectorcall()}: use @code{PyObject_Vectorcall()}

@item 
@code{_PyObject_VectorcallMethod()}: use @code{PyObject_VectorcallMethod()}

@item 
@code{_PyVectorcall_Function()}: use @code{PyVectorcall_Function()}
@end itemize

Just remove the underscore prefix to update your code. Patch by Victor
Stinner.

@item 
gh-106004@footnote{https://github.com/python/cpython/issues/106004}: Adds @ref{5e0,,PyDict_GetItemRef()} and
@ref{41f,,PyDict_GetItemStringRef()} functions: similar to
@ref{5e1,,PyDict_GetItemWithError()} but returning a @ref{5e2,,strong reference}
instead of a @ref{3d5,,borrowed reference}. Patch by Victor Stinner.

@item 
gh-105927@footnote{https://github.com/python/cpython/issues/105927}: Deprecate the @ref{3db,,PyWeakref_GetObject()} and
@ref{3dc,,PyWeakref_GET_OBJECT()} functions: use the new
@ref{3dd,,PyWeakref_GetRef()} function instead. Patch by Victor Stinner.

@item 
gh-105927@footnote{https://github.com/python/cpython/issues/105927}: Add @ref{3dd,,PyWeakref_GetRef()} function: similar to
@ref{3db,,PyWeakref_GetObject()} but returns a @ref{5e2,,strong reference}, or
@code{NULL} if the referent is no longer live. Patch by Victor Stinner.

@item 
gh-105922@footnote{https://github.com/python/cpython/issues/105922}: Add @ref{5fb,,PyImport_AddModuleRef()}: similar to
@ref{5fc,,PyImport_AddModule()}, but return a @ref{5e2,,strong reference}
instead of a @ref{3d5,,borrowed reference}. Patch by Victor Stinner.

@item 
gh-105227@footnote{https://github.com/python/cpython/issues/105227}: The new @ref{1ad1,,PyType_GetDict()} provides the dictionary for
the given type object that is normally exposed by @code{cls.__dict__}.
Normally it’s sufficient to use @ref{1ad2,,tp_dict}, but for
the static builtin types @code{tp_dict} is now always @code{NULL}.
@code{PyType_GetDict()} provides the correct dict object instead.

@item 
gh-105375@footnote{https://github.com/python/cpython/issues/105375}: Fix a bug in @ref{1ad3,,PyErr_WarnExplicit()} where an exception
could end up being overwritten if the API failed internally.

@item 
gh-105603@footnote{https://github.com/python/cpython/issues/105603}: We’ve renamed the new (in 3.12) @code{PyInterpreterConfig.own_gil}
to @code{PyInterpreterConfig.gil} and changed the meaning of the value from
“bool” to an integer with supported values of
@code{PyInterpreterConfig_DEFAULT_GIL}, @code{PyInterpreterConfig_SHARED_GIL},
and @code{PyInterpreterConfig_OWN_GIL}. The default is “shared”.

@item 
gh-105387@footnote{https://github.com/python/cpython/issues/105387}: In the limited C API version 3.12, @ref{790,,Py_INCREF()} and
@ref{791,,Py_DECREF()} functions are now implemented as opaque function calls
to hide implementation details. Patch by Victor Stinner.

@item 
gh-105396@footnote{https://github.com/python/cpython/issues/105396}: Deprecate the @ref{3d9,,PyImport_ImportModuleNoBlock()} function
which is just an alias to @ref{3da,,PyImport_ImportModule()} since Python
3.3. Patch by Victor Stinner.

@item 
gh-103968@footnote{https://github.com/python/cpython/issues/103968}: @ref{773,,PyType_FromMetaclass()} now allows metaclasses with
@code{tp_new} set to @code{NULL}.

@item 
gh-105268@footnote{https://github.com/python/cpython/issues/105268}: Remove the old private, undocumented and untested
@code{_PyGC_FINALIZED()} macro which was kept for backward compatibility with
Python 3.8 and older. Patch by Victor Stinner.

@item 
gh-105182@footnote{https://github.com/python/cpython/issues/105182}: Remove @code{PyEval_AcquireLock()} and @code{PyEval_ReleaseLock()}
functions, deprecated in Python 3.2. Patch by Victor Stinner.

@item 
gh-105182@footnote{https://github.com/python/cpython/issues/105182}: Remove @code{PyEval_InitThreads()} and
@code{PyEval_ThreadsInitialized()} functions, deprecated in Python 3.9. Patch
by Victor Stinner.

@item 
gh-105145@footnote{https://github.com/python/cpython/issues/105145}: Deprecate old Python initialization functions:


@itemize *

@item 
@ref{3f2,,PySys_ResetWarnOptions()}

@item 
@ref{3e7,,Py_GetExecPrefix()}

@item 
@ref{3e1,,Py_GetPath()}

@item 
@ref{3e3,,Py_GetPrefix()}

@item 
@ref{3ea,,Py_GetProgramFullPath()}

@item 
@ref{3ec,,Py_GetProgramName()}

@item 
@ref{3ed,,Py_GetPythonHome()}
@end itemize

Patch by Victor Stinner.

@item 
gh-85275@footnote{https://github.com/python/cpython/issues/85275}: @code{PyObject_AsCharBuffer()}, @code{PyObject_AsReadBuffer()},
@code{PyObject_CheckReadBuffer()}, and @code{PyObject_AsWriteBuffer()} are
removed. Please migrate to new buffer protocol;
@ref{63a,,PyObject_GetBuffer()} and @ref{63b,,PyBuffer_Release()}.

@item 
gh-105156@footnote{https://github.com/python/cpython/issues/105156}: Deprecate the old @code{Py_UNICODE} and @code{PY_UNICODE_TYPE} types:
use directly the @code{wchar_t} type instead. Since Python 3.3,
@code{Py_UNICODE} and @code{PY_UNICODE_TYPE} are just aliases to
@code{wchar_t}. Patch by Victor Stinner.

@item 
gh-105145@footnote{https://github.com/python/cpython/issues/105145}: Remove the following old functions to configure the Python
initialization, deprecated in Python 3.11:


@itemize *

@item 
@code{PySys_AddWarnOptionUnicode()}

@item 
@code{PySys_AddWarnOption()}

@item 
@code{PySys_AddXOption()}

@item 
@code{PySys_HasWarnOptions()}

@item 
@code{PySys_SetArgvEx()}

@item 
@code{PySys_SetArgv()}

@item 
@code{PySys_SetPath()}

@item 
@code{Py_SetPath()}

@item 
@code{Py_SetProgramName()}

@item 
@code{Py_SetPythonHome()}

@item 
@code{Py_SetStandardStreamEncoding()}

@item 
@code{_Py_SetProgramFullPath()}
@end itemize

Patch by Victor Stinner.

@item 
gh-105107@footnote{https://github.com/python/cpython/issues/105107}: Remove functions deprecated in Python 3.9.


@itemize *

@item 
@code{PyEval_CallObject()}, @code{PyEval_CallObjectWithKeywords()}: use
@ref{63c,,PyObject_CallNoArgs()} and @ref{63d,,PyObject_Call()} (positional
arguments must not be `NULL') instead.

@item 
@code{PyEval_CallFunction()}: use @ref{63f,,PyObject_CallFunction()} instead.

@item 
@code{PyEval_CallMethod()}: use @ref{640,,PyObject_CallMethod()} instead.

@item 
@code{PyCFunction_Call()}: use @ref{63d,,PyObject_Call()} instead.
@end itemize

Patch by Victor Stinner.

@item 
gh-105115@footnote{https://github.com/python/cpython/issues/105115}: @code{PyTypeObject.tp_bases} (and @code{tp_mro}) for builtin static
types are now shared by all interpreters, whereas in 3.12-beta1 they were
stored on @code{PyInterpreterState}.  Also note that now the tuples are
immortal objects.

@item 
gh-105071@footnote{https://github.com/python/cpython/issues/105071}: Add @code{PyUnstable_Exc_PrepReraiseStar} to the unstable C api to
expose the implementation of @ref{1ad,,except*}.

@item 
gh-104922@footnote{https://github.com/python/cpython/issues/104922}: @code{PY_SSIZE_T_CLEAN} is no longer required to use @code{'#'}
formats in APIs like @ref{3bf,,PyArg_ParseTuple()} and
@ref{3c0,,Py_BuildValue()}. They uses @code{Py_ssize_t} for @code{'#'} regardless
@code{PY_SSIZE_T_CLEAN}.

@item 
gh-104584@footnote{https://github.com/python/cpython/issues/104584}: Add an unstable C API for hooking in an optimizer. This is
mainly internal, but marked “unstable” to allow third-party
experimentation.

@item 
gh-104668@footnote{https://github.com/python/cpython/issues/104668}: Don’t call @ref{7a5,,PyOS_InputHook} or
@ref{7a6,,PyOS_ReadlineFunctionPointer} in subinterpreters, since it’s
generally difficult to avoid using global state in their registered
callbacks. This also avoids situations where extensions may find
themselves running in a subinterpreter they don’t support (or haven’t yet
been loaded in).

@item 
bpo-42327@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42327}: Add @ref{609,,PyModule_Add()} function: similar to
@ref{60a,,PyModule_AddObjectRef()} and @ref{60b,,PyModule_AddObject()}, but
always steals a reference to the value.

@item 
bpo-40309@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40309}: Properly handle trailing spaces before closing parenthesis in
@ref{3c0,,Py_BuildValue()} format strings.
@end itemize

@node Python 3 12 0 beta 1,Python 3 12 0 alpha 7,Python 3 13 0 alpha 1,Changelog
@anchor{whatsnew/changelog python-3-12-0-beta-1}@anchor{1ad4}
@subsection Python 3.12.0 beta 1


`Release date: 2023-05-22'

@menu
* Security: Security<26>. 
* Library: Library<69>. 
* Core and Builtins: Core and Builtins<64>. 
* Library: Library<70>. 
* Core and Builtins: Core and Builtins<65>. 
* Library: Library<71>. 
* Documentation: Documentation<24>. 
* Tests: Tests<24>. 
* Build: Build<27>. 
* Windows: Windows<24>. 
* macOS: macOS<18>. 
* IDLE: IDLE<15>. 
* Tools/Demos: Tools/Demos<20>. 
* C API: C API<26>. 

@end menu

@node Security<26>,Library<69>,,Python 3 12 0 beta 1
@anchor{whatsnew/changelog id317}@anchor{1ad5}
@subsubsection Security



@itemize -

@item 
gh-99889@footnote{https://github.com/python/cpython/issues/99889}: Fixed a security in flaw in @code{uu.decode()} that could allow
for directory traversal based on the input if no @code{out_file} was
specified.

@item 
gh-104049@footnote{https://github.com/python/cpython/issues/104049}: Do not expose the local on-disk location in directory indexes
produced by @code{http.client.SimpleHTTPRequestHandler}.

@item 
gh-99108@footnote{https://github.com/python/cpython/issues/99108}: Upgrade built-in @ref{6c,,hashlib} SHA3 implementation to a
verified implementation from the @code{HACL*} project.  Used when OpenSSL is
not present or lacks SHA3.

@item 
gh-102153@footnote{https://github.com/python/cpython/issues/102153}: @ref{f40,,urllib.parse.urlsplit()} now strips leading C0 control and
space characters following the specification for URLs defined by WHATWG in
response to 
@geindex Common Vulnerabilities and Exposures; CVE 2023-24329
CVE 2023-24329@footnote{https://www.cve.org/CVERecord?id=CVE-2023-24329}. Patch by Illia Volochii.
@end itemize

@node Library<69>,Core and Builtins<64>,Security<26>,Python 3 12 0 beta 1
@anchor{whatsnew/changelog id318}@anchor{1ad6}
@subsubsection Library



@itemize -

@item 
gh-102856@footnote{https://github.com/python/cpython/issues/102856}: Implement PEP 701 changes in the @ref{102,,tokenize} module. Patch
by Marta Gómez Macías and Pablo Galindo Salgado
@end itemize

@node Core and Builtins<64>,Library<70>,Library<69>,Python 3 12 0 beta 1
@anchor{whatsnew/changelog id319}@anchor{1ad7}
@subsubsection Core and Builtins



@itemize -

@item 
gh-104615@footnote{https://github.com/python/cpython/issues/104615}: Fix wrong ordering of assignments in code like @code{a, a = x, y}.
Contributed by Carl Meyer.

@item 
gh-104572@footnote{https://github.com/python/cpython/issues/104572}: Improve syntax error message for invalid constructs in
@geindex Python Enhancement Proposals; PEP 695
PEP 695@footnote{https://peps.python.org/pep-0695/} contexts and in annotations when @code{from __future__ import
annotations} is active.

@item 
gh-104482@footnote{https://github.com/python/cpython/issues/104482}: Fix three error handling bugs in ast.c’s validation of pattern
matching statements.

@item 
gh-102818@footnote{https://github.com/python/cpython/issues/102818}: Do not add a frame to the traceback in the @code{sys.setprofile}
and @code{sys.settrace} trampoline functions. This ensures that frames are
not duplicated if an exception is raised in the callback function, and
ensures that frames are not omitted if a C callback is used and that does
not add the frame.

@item 
gh-104405@footnote{https://github.com/python/cpython/issues/104405}: Fix an issue where some @ref{4ab,,bytecode} instructions could
ignore 
@geindex Python Enhancement Proposals; PEP 523
PEP 523@footnote{https://peps.python.org/pep-0523/} when “inlining” calls.

@item 
gh-103082@footnote{https://github.com/python/cpython/issues/103082}: Change behavior of @code{sys.monitoring.events.LINE} events in
@code{sys.monitoring}: Line events now occur when a new line is reached
dynamically, instead of using a static approximation, as before. This
makes the behavior very similar to that of “line” events in
@code{sys.settrace}. This should ease porting of tools from 3.11 to 3.12.

@item 
gh-104263@footnote{https://github.com/python/cpython/issues/104263}: Fix @code{float("nan")} to produce a quiet NaN on platforms (like
MIPS) where the meaning of the signalling / quiet bit is inverted from its
usual meaning. Also introduce a new macro @code{Py_INFINITY} matching C99’s
@code{INFINITY}, and refactor internals to rely on C99’s @code{NAN} and
@code{INFINITY} macros instead of hard-coding bit patterns for infinities and
NaNs. Thanks Sebastian Berg.

@item 
gh-99113@footnote{https://github.com/python/cpython/issues/99113}: Multi-phase init extension modules may now indicate that they
support running in subinterpreters that have their own GIL.  This is done
by using @code{Py_MOD_PER_INTERPRETER_GIL_SUPPORTED} as the value for the
@code{Py_mod_multiple_interpreters} module def slot.  Otherwise the module,
by default, cannot be imported in such subinterpreters.  (This does not
affect the main interpreter or subinterpreters that do not have their own
GIL.)  In addition to the isolation that multi-phase init already normally
requires, support for per-interpreter GIL involves one additional
constraint: thread-safety.  If the module has external (linked)
dependencies and those libraries have any state that isn’t thread-safe
then the module must do the additional work to add thread-safety.  This
should be an uncommon case.

@item 
gh-99113@footnote{https://github.com/python/cpython/issues/99113}: The GIL is now (optionally) per-interpreter.  This is the
fundamental change for PEP 684.  This is all made possible by virtue of
the isolated state of each interpreter in the process.  The behavior of
the main interpreter remains unchanged.  Likewise, interpreters created
using @code{Py_NewInterpreter()} are not affected.  To get an interpreter
with its own GIL, call @code{Py_NewInterpreterFromConfig()}.

@item 
gh-104108@footnote{https://github.com/python/cpython/issues/104108}: Multi-phase init extension modules may now indicate whether or
not they actually support multiple interpreters.  By default such modules
are expected to support use in multiple interpreters.  In the uncommon
case that one does not, it may use the new
@code{Py_mod_multiple_interpreters} module def slot.  A value of @code{0} means
the module does not support them. @code{1} means it does.  The default is
@code{1}.

@item 
gh-104142@footnote{https://github.com/python/cpython/issues/104142}: Fix an issue where @ref{24f,,list} or @ref{614,,tuple} repetition
could fail to respect 
@geindex Python Enhancement Proposals; PEP 683
PEP 683@footnote{https://peps.python.org/pep-0683/}.

@item 
gh-104078@footnote{https://github.com/python/cpython/issues/104078}: Improve the performance of @ref{61e,,PyObject_HasAttrString()}

@item 
gh-104066@footnote{https://github.com/python/cpython/issues/104066}: Improve the performance of @ref{6fa,,hasattr()} for module objects
with a missing attribute.

@item 
gh-104028@footnote{https://github.com/python/cpython/issues/104028}: Reduce object creation while calling callback function from gc.
Patch by Donghee Na.

@item 
gh-104018@footnote{https://github.com/python/cpython/issues/104018}: Disallow the “z” format specifier in %-format of bytes objects.

@item 
gh-102213@footnote{https://github.com/python/cpython/issues/102213}: Fix performance loss when accessing an object’s attributes with
@code{__getattr__}  defined.

@item 
gh-103895@footnote{https://github.com/python/cpython/issues/103895}: Improve handling of edge cases in showing
@code{Exception.__notes__}. Ensures that the messages always end with a
newline and that string/bytes are not exploded over multiple lines. Patch
by Carey Metcalfe.

@item 
gh-103907@footnote{https://github.com/python/cpython/issues/103907}: Don’t modify the refcounts of known immortal objects
(@ref{e0d,,True}, @ref{d31,,False}, and @ref{887,,None}) in the main interpreter
loop.

@item 
gh-103899@footnote{https://github.com/python/cpython/issues/103899}: Provide a helpful hint in the @ref{199,,TypeError} message when
accidentally calling a @ref{1a22,,module} object that has a callable attribute
of the same name (such as @ref{207,,dis.dis()} or @ref{4e3,,datetime.datetime}).

@item 
gh-103845@footnote{https://github.com/python/cpython/issues/103845}: Remove both line and instruction instrumentation before adding
new ones for monitoring, to avoid newly added instrumentation being
removed immediately.

@item 
gh-103763@footnote{https://github.com/python/cpython/issues/103763}: Implement 
@geindex Python Enhancement Proposals; PEP 695
PEP 695@footnote{https://peps.python.org/pep-0695/}, adding syntactic support for generic
classes, generic functions, and type aliases.

A new @code{type X = ...} syntax is added for type aliases, which resolves at
runtime to an instance of the new class @code{typing.TypeAliasType}. The
value is lazily evaluated and is accessible through the @code{.__value__}
attribute. This is implemented as a new AST node @code{ast.TypeAlias}.

New syntax (@code{class X[T]: ...}, @code{def func[T](): ...}) is added for
defining generic functions and classes. This is implemented as a new
@code{type_params} attribute on the AST nodes for classes and functions. This
node holds instances of the new AST classes @code{ast.TypeVar},
@code{ast.ParamSpec}, and @code{ast.TypeVarTuple}.

@code{typing.TypeVar}, @code{typing.ParamSpec}, @code{typing.ParamSpecArgs},
@code{typing.ParamSpecKwargs}, @code{typing.TypeVarTuple}, and
@code{typing.Generic} are now implemented in C rather than Python.

There are new bytecode instructions @code{LOAD_LOCALS},
@code{LOAD_CLASSDICT_OR_GLOBAL}, and @code{LOAD_CLASSDICT_OR_DEREF} to support
correct resolution of names in class namespaces.

Patch by Eric Traut, Larry Hastings, and Jelle Zijlstra.
@end itemize

@node Library<70>,Core and Builtins<65>,Core and Builtins<64>,Python 3 12 0 beta 1
@anchor{whatsnew/changelog id320}@anchor{1ad8}
@subsubsection Library



@itemize -

@item 
gh-103801@footnote{https://github.com/python/cpython/issues/103801}: Adds three minor linting fixes to the wasm module caught that
were caught by ruff.

@item 
gh-103793@footnote{https://github.com/python/cpython/issues/103793}: Optimized asyncio Task creation by deferring expensive string
formatting (task name generation) from Task creation to the first time
@code{get_name} is called. This makes asyncio benchmarks up to 5% faster.
@end itemize

@node Core and Builtins<65>,Library<71>,Library<70>,Python 3 12 0 beta 1
@anchor{whatsnew/changelog id321}@anchor{1ad9}
@subsubsection Core and Builtins



@itemize -

@item 
gh-102310@footnote{https://github.com/python/cpython/issues/102310}: Change the error range for invalid bytes literals.

@item 
gh-103590@footnote{https://github.com/python/cpython/issues/103590}: Do not wrap a single exception raised from a @code{try-except*}
construct in an @ref{4d3,,ExceptionGroup}.

@item 
gh-103650@footnote{https://github.com/python/cpython/issues/103650}: Change the perf map format to remove the ‘0x’ prefix from the
addresses

@item 
gh-102856@footnote{https://github.com/python/cpython/issues/102856}: Implement the required C tokenizer changes for PEP 701. Patch
by Pablo Galindo Salgado, Lysandros Nikolaou, Batuhan Taskaya, Marta Gómez
Macías and sunmy2019.

@item 
gh-100530@footnote{https://github.com/python/cpython/issues/100530}: Clarify the error message raised when the called part of a
class pattern isn’t actually a class.

@item 
gh-101517@footnote{https://github.com/python/cpython/issues/101517}: Fix bug in line numbers of instructions emitted for
@ref{1ad,,except*}.

@item 
gh-103492@footnote{https://github.com/python/cpython/issues/103492}: Clarify @ref{1af,,SyntaxWarning} with literal @code{is} comparison by
specifying which literal is problematic, since comparisons using @code{is}
with e.g. @code{None} and bool literals are idiomatic.

@item 
gh-87729@footnote{https://github.com/python/cpython/issues/87729}: Add @ref{703,,LOAD_SUPER_ATTR} (and a specialization for
@code{super().method()}) to speed up @code{super().method()} and
@code{super().attr}. This makes @code{super().method()} roughly 2.3x faster and
brings it within 20% of the performance of a simple method call. Patch by
Vladimir Matveev and Carl Meyer.

@item 
gh-103488@footnote{https://github.com/python/cpython/issues/103488}: Change the internal offset distinguishing yield and return
target addresses, so that the instruction pointer is correct for exception
handling and other stack unwinding.

@item 
gh-82012@footnote{https://github.com/python/cpython/issues/82012}: The bitwise inversion operator (@code{~}) on bool is deprecated. It
returns the bitwise inversion of the underlying @code{int} representation
such that @code{bool(~True) == True}, which can be confusing. Use @code{not} for
logical negation of bools. In the rare case that you really need the
bitwise inversion of the underlying @code{int}, convert to int explicitly
@code{~int(x)}.

@item 
gh-77757@footnote{https://github.com/python/cpython/issues/77757}: Exceptions raised in a typeobject’s @code{__set_name__} method are
no longer wrapped by a @ref{246,,RuntimeError}. Context information is added
to the exception as a 
@geindex Python Enhancement Proposals; PEP 678
PEP 678@footnote{https://peps.python.org/pep-0678/} note.

@item 
gh-103333@footnote{https://github.com/python/cpython/issues/103333}: @ref{5f0,,AttributeError} now retains the @code{name} attribute when
pickled and unpickled.

@item 
gh-103242@footnote{https://github.com/python/cpython/issues/103242}: Migrate @ref{134f,,set_ecdh_curve()} method not to
use deprecated OpenSSL APIs. Patch by Donghee Na.

@item 
gh-103323@footnote{https://github.com/python/cpython/issues/103323}: We’ve replaced our use of @code{_PyRuntime.tstate_current} with a
thread-local variable.  This is a fairly low-level implementation detail,
and there should be no change in behavior.

@item 
gh-84436@footnote{https://github.com/python/cpython/issues/84436}: The implementation of PEP-683 which adds Immortal Objects by
using a fixed reference count that skips reference counting to make
objects truly immutable.

@item 
gh-102700@footnote{https://github.com/python/cpython/issues/102700}: Allow built-in modules to be submodules. This allows submodules
to be statically linked into a CPython binary.

@item 
gh-103082@footnote{https://github.com/python/cpython/issues/103082}: Implement 
@geindex Python Enhancement Proposals; PEP 669
PEP 669@footnote{https://peps.python.org/pep-0669/} Low Impact Monitoring for CPython.

@item 
gh-88691@footnote{https://github.com/python/cpython/issues/88691}: Reduce the number of inline @ref{90a,,CACHE} entries for
@ref{917,,CALL}.

@item 
gh-102500@footnote{https://github.com/python/cpython/issues/102500}: Make the buffer protocol accessible in Python code using the
new @code{__buffer__} and @code{__release_buffer__} magic methods. See
@geindex Python Enhancement Proposals; PEP 688
PEP 688@footnote{https://peps.python.org/pep-0688/} for details. Patch by Jelle Zijlstra.

@item 
gh-97933@footnote{https://github.com/python/cpython/issues/97933}: 
@geindex Python Enhancement Proposals; PEP 709
PEP 709@footnote{https://peps.python.org/pep-0709/}: inline list, dict and set comprehensions to improve
performance and reduce bytecode size.

@item 
gh-99184@footnote{https://github.com/python/cpython/issues/99184}: Bypass instance attribute access of @code{__name__} in @code{repr} of
@ref{11f6,,weakref.ref}.

@item 
gh-98003@footnote{https://github.com/python/cpython/issues/98003}: Complex function calls are now faster and consume no C stack
space.

@item 
bpo-39610@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39610}: @code{len()} for 0-dimensional @ref{166,,memoryview} objects (such
as @code{memoryview(ctypes.c_uint8(42))}) now raises a @ref{199,,TypeError}.
Previously this returned @code{1}, which was not consistent with
@code{mem_0d[0]} raising an @ref{1741,,IndexError}.
@end itemize

@node Library<71>,Documentation<24>,Core and Builtins<65>,Python 3 12 0 beta 1
@anchor{whatsnew/changelog id322}@anchor{1ada}
@subsubsection Library



@itemize -

@item 
bpo-31821@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31821}: Fix @code{pause_reading()} to work when called from
@code{connection_made()} in @ref{b,,asyncio}.

@item 
gh-104600@footnote{https://github.com/python/cpython/issues/104600}: @ref{1228,,functools.update_wrapper()} now sets the
@code{__type_params__} attribute (added by 
@geindex Python Enhancement Proposals; PEP 695
PEP 695@footnote{https://peps.python.org/pep-0695/}).

@item 
gh-104340@footnote{https://github.com/python/cpython/issues/104340}: When an @code{asyncio} pipe protocol loses its connection due to
an error, and the caller doesn’t await @code{wait_closed()} on the
corresponding @code{StreamWriter}, don’t log a warning about an exception
that was never retrieved. After all, according to the
@code{StreamWriter.close()} docs, the @code{wait_closed()} call is optional
(“not mandatory”).

@item 
gh-104555@footnote{https://github.com/python/cpython/issues/104555}: Fix issue where an @ref{9ca,,issubclass()} check comparing a class
@code{X} against a @ref{675,,runtime-checkable protocol} @code{Y} with non-callable members would not
cause @ref{199,,TypeError} to be raised if an @ref{2af,,isinstance()} call had
previously been made comparing an instance of @code{X} to @code{Y}. This issue
was present in edge cases on Python 3.11, but became more prominent in
3.12 due to some unrelated changes that were made to runtime-checkable
protocols. Patch by Alex Waygood.

@item 
gh-104372@footnote{https://github.com/python/cpython/issues/104372}: Refactored the @code{_posixsubprocess} internals to avoid Python C
API usage between fork and exec when marking @code{pass_fds=} file
descriptors inheritable.

@item 
gh-104484@footnote{https://github.com/python/cpython/issues/104484}: Added `case_sensitive' argument to
@ref{6d4,,pathlib.PurePath.match()}

@item 
gh-75367@footnote{https://github.com/python/cpython/issues/75367}: Fix data descriptor detection in
@ref{6bd,,inspect.getattr_static()}.

@item 
gh-104536@footnote{https://github.com/python/cpython/issues/104536}: Fix a race condition in the internal
@code{multiprocessing.process} cleanup logic that could manifest as an
unintended @code{AttributeError} when calling @code{process.close()}.

@item 
gh-103857@footnote{https://github.com/python/cpython/issues/103857}: Update datetime deprecations’ stracktrace to point to the
calling line

@item 
gh-101520@footnote{https://github.com/python/cpython/issues/101520}: Move the core functionality of the @code{tracemalloc} module in
the @code{Python/} folder, leaving just the module wrapper in @code{Modules/}.

@item 
gh-104392@footnote{https://github.com/python/cpython/issues/104392}: Remove undocumented and unused @code{_paramspec_tvars} attribute
from some classes in @ref{10b,,typing}.

@item 
gh-102613@footnote{https://github.com/python/cpython/issues/102613}: Fix issue where @ref{538,,pathlib.Path.glob()} raised
@ref{f6e,,RecursionError} when walking deep directory trees.

@item 
gh-103000@footnote{https://github.com/python/cpython/issues/103000}: Improve performance of @ref{1adb,,dataclasses.asdict()} for the
common case where `dict_factory' is @code{dict}. Patch by David C Ellis.

@item 
gh-104301@footnote{https://github.com/python/cpython/issues/104301}: Allow leading whitespace in disambiguated statements in
@ref{aa,,pdb}.

@item 
gh-104139@footnote{https://github.com/python/cpython/issues/104139}: Teach @code{urllib.parse.unsplit()} to retain the @code{"//"} when
assembling @code{itms-services://?action=generate-bugs} style Apple Platform Deployment@footnote{https://support.apple.com/en-gb/guide/deployment/depce7cefc4d/web}
URLs.

@item 
gh-104307@footnote{https://github.com/python/cpython/issues/104307}: @ref{1a81,,socket.getnameinfo()} now releases the GIL while
contacting the DNS server

@item 
gh-104310@footnote{https://github.com/python/cpython/issues/104310}: Users may now use @code{importlib.util.allowing_all_extensions()}
(a context manager) to temporarily disable the strict compatibility checks
for importing extension modules in subinterpreters.

@item 
gh-87695@footnote{https://github.com/python/cpython/issues/87695}: Fix issue where @ref{538,,pathlib.Path.glob()} raised @ref{2c2,,OSError}
when it encountered a symlink to an overly long path.

@item 
gh-104265@footnote{https://github.com/python/cpython/issues/104265}: Prevent possible crash by disallowing instantiation of the
@code{_csv.Reader} and @code{_csv.Writer} types. The regression was
introduced in 3.10.0a4 with PR 23224 (bpo-14935@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14935}). Patch by Radislav
Chugunov.

@item 
gh-102613@footnote{https://github.com/python/cpython/issues/102613}: Improve performance of @ref{538,,pathlib.Path.glob()} when expanding
recursive wildcards (”@code{**}”) by merging adjacent wildcards and
de-duplicating results only when necessary.

@item 
gh-65772@footnote{https://github.com/python/cpython/issues/65772}: Remove unneeded comments and code in turtle.py.

@item 
gh-90208@footnote{https://github.com/python/cpython/issues/90208}: Fixed issue where @ref{538,,pathlib.Path.glob()} returned incomplete
results when it encountered a @ref{f44,,PermissionError}. This method now
suppresses all @ref{2c2,,OSError} exceptions, except those raised from calling
@ref{53b,,is_dir()} on the top-level path.

@item 
gh-104144@footnote{https://github.com/python/cpython/issues/104144}: Optimize @ref{4d2,,asyncio.TaskGroup} when using
@ref{6a3,,asyncio.eager_task_factory()}. Skip scheduling a done callback if a
TaskGroup task completes eagerly.

@item 
gh-104144@footnote{https://github.com/python/cpython/issues/104144}: Optimize @ref{814,,asyncio.gather()} when using
@ref{6a3,,asyncio.eager_task_factory()} to complete eagerly if all fututres
completed eagerly. Avoid scheduling done callbacks for futures that
complete eagerly.

@item 
gh-104114@footnote{https://github.com/python/cpython/issues/104114}: Fix issue where @ref{538,,pathlib.Path.glob()} returns paths using
the case of non-wildcard segments for corresponding path segments, rather
than the real filesystem case.

@item 
gh-104104@footnote{https://github.com/python/cpython/issues/104104}: Improve performance of @ref{538,,pathlib.Path.glob()} by using
@ref{1adc,,re.IGNORECASE} to implement case-insensitive matching.

@item 
gh-104102@footnote{https://github.com/python/cpython/issues/104102}: Improve performance of @ref{538,,pathlib.Path.glob()} when
evaluating patterns that contain @code{'../'} segments.

@item 
gh-103822@footnote{https://github.com/python/cpython/issues/103822}: Update the return type of @code{weekday} to the newly added Day
attribute

@item 
gh-103629@footnote{https://github.com/python/cpython/issues/103629}: Update the @code{repr} of @ref{19e8,,typing.Unpack} according to
@geindex Python Enhancement Proposals; PEP 692
PEP 692@footnote{https://peps.python.org/pep-0692/}.

@item 
gh-103963@footnote{https://github.com/python/cpython/issues/103963}: Make @ref{3c,,dis} display the names of the args for
@code{CALL_INTRINSIC_*}.

@item 
gh-104035@footnote{https://github.com/python/cpython/issues/104035}: Do not ignore user-defined @code{__getstate__} and
@code{__setstate__} methods for slotted frozen dataclasses.

@item 
gh-103987@footnote{https://github.com/python/cpython/issues/103987}: In @ref{94,,mmap}, fix several bugs that could lead to access to
memory-mapped files after they have been invalidated.

@item 
gh-103977@footnote{https://github.com/python/cpython/issues/103977}: Improve import time of @ref{af,,platform} module.

@item 
gh-88773@footnote{https://github.com/python/cpython/issues/88773}: Added @ref{1add,,turtle.teleport()} to the @ref{108,,turtle} module to
move a turtle to a new point without tracing a line, visible or invisible.
Patch by Liam Gersten.

@item 
gh-103935@footnote{https://github.com/python/cpython/issues/103935}: Use @ref{17a5,,io.open_code()} for files to be executed instead of
raw @ref{318,,open()}

@item 
gh-68968@footnote{https://github.com/python/cpython/issues/68968}: Fixed garbled output of @ref{74d,,assertEqual()}
when an input lacks final newline.

@item 
gh-100370@footnote{https://github.com/python/cpython/issues/100370}: Fix potential @ref{a87,,OverflowError} in
@ref{893,,sqlite3.Connection.blobopen()} for 32-bit builds. Patch by Erlend E.
Aasland.

@item 
gh-102628@footnote{https://github.com/python/cpython/issues/102628}: Substitute CTRL-D with CTRL-Z in @ref{d4,,sqlite3} CLI banner when
running on Windows.

@item 
gh-103636@footnote{https://github.com/python/cpython/issues/103636}: Module-level attributes @code{January} and @code{February} are
deprecated from @ref{15,,calendar}.

@item 
gh-103583@footnote{https://github.com/python/cpython/issues/103583}: Isolate @code{_multibytecodec} and codecs extension modules.
Patches by Erlend E. Aasland.

@item 
gh-103848@footnote{https://github.com/python/cpython/issues/103848}: Add checks to ensure that @code{[} bracketed @code{]} hosts found by
@ref{f40,,urllib.parse.urlsplit()} are of IPv6 or IPvFuture format.

@item 
gh-103872@footnote{https://github.com/python/cpython/issues/103872}: Update the bundled copy of pip to version 23.1.2.

@item 
gh-99944@footnote{https://github.com/python/cpython/issues/99944}: Make @ref{3c,,dis} display the value of oparg of
@code{KW_NAMES}.

@item 
gh-74940@footnote{https://github.com/python/cpython/issues/74940}: The C.UTF-8 locale is no longer converted to en_US.UTF-8,
enabling the use of UTF-8 encoding on systems which have no locales
installed.

@item 
gh-103861@footnote{https://github.com/python/cpython/issues/103861}: Fix @code{zipfile.Zipfile} creating invalid zip files when
@code{force_zip64} was used to add files to them. Patch by Carey Metcalfe.

@item 
gh-103857@footnote{https://github.com/python/cpython/issues/103857}: Deprecated @ref{34f,,datetime.datetime.utcnow()} and
@ref{350,,datetime.datetime.utcfromtimestamp()}. (Patch by Paul Ganssle)

@item 
gh-103839@footnote{https://github.com/python/cpython/issues/103839}: Avoid compilation error due to tommath.h not being found when
building Tkinter against Tcl 8.7 built with bundled libtommath.

@item 
gh-103791@footnote{https://github.com/python/cpython/issues/103791}: @ref{112e,,contextlib.suppress} now supports suppressing
exceptions raised as part of an @ref{4d3,,ExceptionGroup}. If other exceptions
exist on the group, they are re-raised in a group that does not contain
the suppressed exceptions.

@item 
gh-90750@footnote{https://github.com/python/cpython/issues/90750}: Use @ref{be6,,datetime.datetime.fromisocalendar()} in the
implementation of @ref{1994,,datetime.datetime.strptime()}, which should now
accept only valid ISO dates. (Patch by Paul Ganssle)

@item 
gh-103685@footnote{https://github.com/python/cpython/issues/103685}: Prepare @ref{1ade,,tkinter.Menu.index()} for Tk 8.7 so that it does
not raise @code{TclError: expected integer but got ""} when it should return
@code{None}.

@item 
gh-81403@footnote{https://github.com/python/cpython/issues/81403}: @ref{1adf,,urllib.request.CacheFTPHandler} no longer raises
@code{URLError} if a cached FTP instance is reused. ftplib’s endtransfer
method calls voidresp to drain the connection to handle FTP instance reuse
properly.

@item 
gh-103699@footnote{https://github.com/python/cpython/issues/103699}: Add @code{__orig_bases__} to non-generic TypedDicts, call-based
TypedDicts, and call-based NamedTuples. Other TypedDicts and NamedTuples
already had the attribute.

@item 
gh-103693@footnote{https://github.com/python/cpython/issues/103693}: Add convenience variable feature to @ref{aa,,pdb}

@item 
gh-92248@footnote{https://github.com/python/cpython/issues/92248}: Deprecate @code{type}, @code{choices}, and @code{metavar} parameters of
@code{argparse.BooleanOptionalAction}.

@item 
gh-89415@footnote{https://github.com/python/cpython/issues/89415}: Add @ref{d1,,socket} constants for source-specific multicast. Patch
by Reese Hyde.

@item 
gh-103673@footnote{https://github.com/python/cpython/issues/103673}: @ref{d2,,socketserver} gains @code{ForkingUnixStreamServer} and
@code{ForkingUnixDatagramServer} classes. Patch by Jay Berry.

@item 
gh-103636@footnote{https://github.com/python/cpython/issues/103636}: Added Enum for months and days in the calendar module.

@item 
gh-84976@footnote{https://github.com/python/cpython/issues/84976}: Create a new @code{Lib/_pydatetime.py} file that defines the Python
version of the @code{datetime} module, and make @code{datetime} import the
contents of the new library only if the C implementation is missing.
Currently, the full Python implementation is defined and then deleted if
the C implementation is not available, slowing down @code{import datetime}
unnecessarily.

@item 
gh-103596@footnote{https://github.com/python/cpython/issues/103596}: Attributes/methods are no longer shadowed by same-named enum
members, although they may be shadowed by enum.property’s.

@item 
gh-103584@footnote{https://github.com/python/cpython/issues/103584}: Updated @code{importlib.metadata} with changes from
@code{importlib_metadata} 5.2 through 6.5.0, including: Support
@code{installed-files.txt} for @code{Distribution.files} when present.
@code{PackageMetadata} now stipulates an additional @code{get} method allowing
for easy querying of metadata keys that may not be present.
@code{packages_distributions} now honors packages and modules with Python
modules that not @code{.py} sources (e.g. @code{.pyc}, @code{.so}). Expand protocol
for @code{PackageMetadata.get_all} to match the upstream implementation of
@code{email.message.Message.get_all} in python/typeshed#9620. Deprecated use
of @code{Distribution} without defining abstract methods. Deprecated
expectation that @code{PackageMetadata.__getitem__} will return @code{None} for
missing keys. In the future, it will raise a @code{KeyError}.

@item 
gh-103578@footnote{https://github.com/python/cpython/issues/103578}: Fixed a bug where @ref{aa,,pdb} crashes when reading source file
with different encoding by replacing @ref{741,,io.open()} with
@ref{17a5,,io.open_code()}. The new method would also call into the hook set by
@ref{1ae0,,PyFile_SetOpenCodeHook()}.

@item 
gh-103556@footnote{https://github.com/python/cpython/issues/103556}: Now creating @ref{4e4,,inspect.Signature} objects with
positional-only parameter with a default followed by a
positional-or-keyword parameter without one is impossible.

@item 
gh-103559@footnote{https://github.com/python/cpython/issues/103559}: Update the bundled copy of pip to version 23.1.1.

@item 
gh-103548@footnote{https://github.com/python/cpython/issues/103548}: Improve performance of @ref{1a6d,,pathlib.Path.absolute()} and
@ref{1ae1,,cwd()} by joining paths only when necessary. Also
improve performance of @ref{1ae2,,pathlib.PurePath.is_absolute()} on Posix by
skipping path parsing and normalization.

@item 
gh-103538@footnote{https://github.com/python/cpython/issues/103538}: Remove @code{_tkinter} module code guarded by definition of the
@code{TK_AQUA} macro which was only needed for Tk 8.4.7 or earlier and was
never actually defined by any build system or documented for manual use.

@item 
gh-103533@footnote{https://github.com/python/cpython/issues/103533}: Update @ref{2b,,cProfile} to use PEP 669 API

@item 
gh-103525@footnote{https://github.com/python/cpython/issues/103525}: Fix misleading exception message when mixed @code{str} and
@code{bytes} arguments are supplied to @ref{6ce,,pathlib.PurePath} and
@ref{268,,Path}.

@item 
gh-103489@footnote{https://github.com/python/cpython/issues/103489}: Add @ref{6e1,,getconfig()} and
@ref{6e2,,setconfig()} to @ref{54e,,Connection} to
make configuration changes to a database connection. Patch by Erlend E.
Aasland.

@item 
gh-103365@footnote{https://github.com/python/cpython/issues/103365}: Set default Flag boundary to @code{STRICT} and fix bitwise
operations.

@item 
gh-103472@footnote{https://github.com/python/cpython/issues/103472}: Avoid a potential @ref{54d,,ResourceWarning} in
@ref{d3b,,http.client.HTTPConnection} by closing the proxy / tunnel’s
CONNECT response explicitly.

@item 
gh-103462@footnote{https://github.com/python/cpython/issues/103462}: Fixed an issue with using
@ref{1818,,writelines()} in @ref{b,,asyncio} to send very
large payloads that exceed the amount of data that can be written in one
call to @ref{fad,,socket.socket.send()} or @ref{6a2,,socket.socket.sendmsg()},
resulting in the remaining buffer being left unwritten.

@item 
gh-103449@footnote{https://github.com/python/cpython/issues/103449}: Fix a bug in doc string generation in
@ref{4e2,,dataclasses.dataclass()}.

@item 
gh-103092@footnote{https://github.com/python/cpython/issues/103092}: Isolate @code{_collections} (apply 
@geindex Python Enhancement Proposals; PEP 687
PEP 687@footnote{https://peps.python.org/pep-0687/}). Patch by
Erlend E. Aasland.

@item 
gh-103357@footnote{https://github.com/python/cpython/issues/103357}: Added support for @ref{16a3,,logging.Formatter} @code{defaults}
parameter to @ref{13bc,,logging.config.dictConfig()} and
@ref{d4e,,logging.config.fileConfig()}. Patch by Bar Harel.

@item 
gh-103092@footnote{https://github.com/python/cpython/issues/103092}: Adapt the @ref{11d,,winreg} extension module to 
@geindex Python Enhancement Proposals; PEP 687
PEP 687@footnote{https://peps.python.org/pep-0687/}.

@item 
gh-74690@footnote{https://github.com/python/cpython/issues/74690}: The performance of @ref{2af,,isinstance()} checks against
@ref{675,,runtime-checkable protocols} has been
considerably improved for protocols that only have a few members. To
achieve this improvement, several internal implementation details of the
@ref{10b,,typing} module have been refactored, including
@code{typing._ProtocolMeta.__instancecheck__},
@code{typing._is_callable_members_only}, and @code{typing._get_protocol_attrs}.
Patches by Alex Waygood.

@item 
gh-74690@footnote{https://github.com/python/cpython/issues/74690}: The members of a runtime-checkable protocol are now considered
“frozen” at runtime as soon as the class has been created. See
@ref{6f9,,“What’s new in Python 3.12”} for more
details.

@item 
gh-103256@footnote{https://github.com/python/cpython/issues/103256}: Fixed a bug that caused @ref{6e,,hmac} to raise an exception when
the requested hash algorithm was not available in OpenSSL despite being
available separately as part of @code{hashlib} itself.  It now falls back
properly to the built-in. This could happen when, for example, your
OpenSSL does not include SHA3 support and you want to compute
@code{hmac.digest(b'K', b'M', 'sha3_256')}.

@item 
gh-102778@footnote{https://github.com/python/cpython/issues/102778}: Support @code{sys.last_exc} in @ref{77,,idlelib}.

@item 
gh-103285@footnote{https://github.com/python/cpython/issues/103285}: Improve performance of @ref{bd1,,ast.get_source_segment()}.

@item 
gh-103225@footnote{https://github.com/python/cpython/issues/103225}: Fix a bug in @ref{aa,,pdb} when displaying line numbers of
module-level source code.

@item 
gh-103092@footnote{https://github.com/python/cpython/issues/103092}: Adapt the @ref{97,,msvcrt} extension module to 
@geindex Python Enhancement Proposals; PEP 687
PEP 687@footnote{https://peps.python.org/pep-0687/}.

@item 
gh-103092@footnote{https://github.com/python/cpython/issues/103092}: Adapt the @ref{11e,,winsound} extension module to 
@geindex Python Enhancement Proposals; PEP 687
PEP 687@footnote{https://peps.python.org/pep-0687/}.

@item 
gh-93910@footnote{https://github.com/python/cpython/issues/93910}: Remove deprecation of enum @code{member.member} access.

@item 
gh-102978@footnote{https://github.com/python/cpython/issues/102978}: Fixes @ref{1098,,unittest.mock.patch()} not enforcing function
signatures for methods decorated with @code{@@classmethod} or
@code{@@staticmethod} when patch is called with @code{autospec=True}.

@item 
gh-103092@footnote{https://github.com/python/cpython/issues/103092}: Isolate @code{_socket} (apply 
@geindex Python Enhancement Proposals; PEP 687
PEP 687@footnote{https://peps.python.org/pep-0687/}). Patch by Erlend E.
Aasland.

@item 
gh-100479@footnote{https://github.com/python/cpython/issues/100479}: Add @ref{6cf,,pathlib.PurePath.with_segments()}, which creates a
path object from arguments. This method is called whenever a derivative
path is created, such as from @ref{1ae3,,pathlib.PurePath.parent}. Subclasses
may override this method to share information between path objects.

@item 
gh-103220@footnote{https://github.com/python/cpython/issues/103220}: Fix issue where @ref{19eb,,os.path.join()} added a slash when joining
onto an incomplete UNC drive with a trailing slash on Windows.

@item 
gh-103204@footnote{https://github.com/python/cpython/issues/103204}: Fixes @ref{76,,http.server} accepting HTTP requests with HTTP
version numbers preceded by ‘+’, or ‘-’, or with digit-separating ‘_’
characters.  The length of the version numbers is also constrained.

@item 
gh-75586@footnote{https://github.com/python/cpython/issues/75586}: Fix various Windows-specific issues with @code{shutil.which}.

@item 
gh-103193@footnote{https://github.com/python/cpython/issues/103193}: Improve performance of @ref{6bd,,inspect.getattr_static()}. Patch by
Alex Waygood.

@item 
gh-103176@footnote{https://github.com/python/cpython/issues/103176}: @ref{6ea,,sys._current_exceptions()} now returns a mapping from
thread-id to an exception instance, rather than to a @code{(typ, exc, tb)}
tuple.

@item 
gh-103143@footnote{https://github.com/python/cpython/issues/103143}: Polish the help messages and docstrings of @ref{aa,,pdb}.

@item 
gh-103015@footnote{https://github.com/python/cpython/issues/103015}: Add `entrypoint' keyword-only parameter to
@ref{6e0,,sqlite3.Connection.load_extension()}, for overriding the SQLite
extension entry point. Patch by Erlend E. Aasland.

@item 
gh-103000@footnote{https://github.com/python/cpython/issues/103000}: Improve performance of @ref{1ae4,,dataclasses.astuple()} and
@ref{1adb,,dataclasses.asdict()} in cases where the contents are common Python
types.

@item 
gh-102953@footnote{https://github.com/python/cpython/issues/102953}: The extraction methods in @ref{e4,,tarfile}, and
@ref{697,,shutil.unpack_archive()}, have a new a `filter' argument that allows
limiting tar features than may be surprising or dangerous, such as
creating files outside the destination directory. See
@ref{698,,Extraction filters} for details.

@item 
gh-97696@footnote{https://github.com/python/cpython/issues/97696}: Implemented an eager task factory in asyncio. When used as a
task factory on an event loop, it performs eager execution of coroutines.
Coroutines that are able to complete synchronously (e.g. return or raise
without blocking) are returned immediately as a finished task, and the
task is never scheduled to the event loop. If the coroutine blocks, the
(pending) task is scheduled and returned.

@item 
gh-81079@footnote{https://github.com/python/cpython/issues/81079}: Add `case_sensitive' keyword-only argument to
@ref{538,,pathlib.Path.glob()} and @ref{539,,rglob()}.

@item 
gh-101819@footnote{https://github.com/python/cpython/issues/101819}: Isolate the @ref{83,,io} extension module by applying 
@geindex Python Enhancement Proposals; PEP 687
PEP 687@footnote{https://peps.python.org/pep-0687/}.
Patch by Kumar Aditya, Victor Stinner, and Erlend E. Aasland.

@item 
gh-91896@footnote{https://github.com/python/cpython/issues/91896}: Deprecate @ref{340,,collections.abc.ByteString}

@item 
gh-101362@footnote{https://github.com/python/cpython/issues/101362}: Speed up @ref{268,,pathlib.Path} construction by omitting the
path anchor from the internal list of path parts.

@item 
gh-102114@footnote{https://github.com/python/cpython/issues/102114}: Functions in the @ref{3c,,dis} module that accept a source code
string as argument now print a more concise traceback when the string
contains a syntax or indentation error.

@item 
gh-62432@footnote{https://github.com/python/cpython/issues/62432}: The @ref{10d,,unittest} runner will now exit with status code 5 if
no tests were run. It is common for test runner misconfiguration to fail
to find any tests, this should be an error.

@item 
gh-78079@footnote{https://github.com/python/cpython/issues/78079}: Fix incorrect normalization of UNC device path roots, and
partial UNC share path roots, in @ref{6ce,,pathlib.PurePath}. Pathlib no
longer appends a trailing slash to such paths.

@item 
gh-85984@footnote{https://github.com/python/cpython/issues/85984}: Add @ref{1a88,,tty.cfmakeraw()} and @ref{1a3b,,tty.cfmakecbreak()} to
@ref{107,,tty} and modernize, the behavior of @ref{1a87,,tty.setraw()} and
@ref{1a3a,,tty.setcbreak()} to use POSIX.1-2017 Chapter 11 “General Terminal
Interface” flag masks by default.

@item 
gh-101688@footnote{https://github.com/python/cpython/issues/101688}: Implement @ref{6f6,,types.get_original_bases()} to provide further
introspection for types.

@item 
gh-101640@footnote{https://github.com/python/cpython/issues/101640}: @ref{1bf,,argparse.ArgumentParser} now catches errors when
writing messages, such as when @ref{b39,,sys.stderr} is @code{None}. Patch by
Oleg Iarygin.

@item 
gh-83861@footnote{https://github.com/python/cpython/issues/83861}: Fix datetime.astimezone method return value when invoked on a
naive datetime instance that represents local time falling in a timezone
transition gap. PEP 495 requires that instances with fold=1 produce
earlier times than those with fold=0 in this case.

@item 
gh-89550@footnote{https://github.com/python/cpython/issues/89550}: Decrease execution time of some @ref{6b,,gzip} file writes by 15%
by adding more appropriate buffering.

@item 
gh-95299@footnote{https://github.com/python/cpython/issues/95299}: Remove the bundled setuptools wheel from @code{ensurepip}, and stop
installing setuptools in environments created by @code{venv}.

@item 
gh-99353@footnote{https://github.com/python/cpython/issues/99353}: Respect the @ref{d3b,,http.client.HTTPConnection} @code{.debuglevel}
flag in @code{urllib.request.AbstractHTTPHandler} when its constructor
parameter @code{debuglevel} is not set. And do the same for @code{*HTTPS*}.

@item 
gh-98040@footnote{https://github.com/python/cpython/issues/98040}: Remove the long-deprecated @code{imp} module.

@item 
gh-97850@footnote{https://github.com/python/cpython/issues/97850}: Deprecate @code{pkgutil.find_loader()} and
@code{pkgutil.get_loader()} in favor of @ref{5af,,importlib.util.find_spec()}.

@item 
gh-94473@footnote{https://github.com/python/cpython/issues/94473}: Flatten arguments in @ref{1ae5,,tkinter.Canvas.coords()}. It now
accepts not only @code{x1, y1, x2, y2, ...} and @code{[x1, y1, x2, y2, ...]},
but also @code{(x1, y1), (x2, y2), ...} and @code{[(x1, y1), (x2, y2), ...]}.

@item 
gh-98040@footnote{https://github.com/python/cpython/issues/98040}: Remove more deprecated importlib APIs: @code{find_loader()},
@code{find_module()}, @code{importlib.abc.Finder}, @code{pkgutil.ImpImporter},
@code{pkgutil.ImpLoader}.

@item 
gh-96522@footnote{https://github.com/python/cpython/issues/96522}: Fix potential deadlock in pty.spawn()

@item 
gh-96534@footnote{https://github.com/python/cpython/issues/96534}: Support divert(4) added in FreeBSD 14.

@item 
gh-87474@footnote{https://github.com/python/cpython/issues/87474}: Fix potential file descriptor leaks in
@ref{4b8,,subprocess.Popen}.

@item 
gh-94906@footnote{https://github.com/python/cpython/issues/94906}: Support multiple steps in @ref{6c1,,math.nextafter()}. Patch by
Shantanu Jain and Matthias Gorgens.

@item 
gh-51574@footnote{https://github.com/python/cpython/issues/51574}: Make @ref{52e,,tempfile.mkdtemp()} return absolute paths when its
`dir' parameter is relative.

@item 
gh-94518@footnote{https://github.com/python/cpython/issues/94518}: Convert private @code{_posixsubprocess.fork_exec()} to use
Argument Clinic.

@item 
gh-92184@footnote{https://github.com/python/cpython/issues/92184}: When creating zip files using @ref{138,,zipfile}, @code{os.altsep}, if
not @code{None}, will always be treated as a path separator even when it is
not @code{/}. Patch by Carey Metcalfe.

@item 
bpo-46797@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46797}: Deprecation warnings are now emitted for @code{ast.Num},
@code{ast.Bytes}, @code{ast.Str}, @code{ast.NameConstant} and
@code{ast.Ellipsis}. These have been documented as deprecated since
Python 3.8, and will be removed in Python 3.14.

@item 
bpo-44844@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44844}: Enables @ref{11c,,webbrowser} to detect and launch Microsoft Edge
browser.

@item 
bpo-45606@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45606}: Fixed the bug in @ref{538,,pathlib.Path.glob()} – previously a
dangling symlink would not be found by this method when the pattern is an
exact match, but would be found when the pattern contains a wildcard or
the recursive wildcard (@code{**}). With this change, a dangling symlink will
be found in both cases.

@item 
bpo-23041@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23041}: Add @ref{6ae,,QUOTE_STRINGS} and @ref{6ad,,QUOTE_NOTNULL}
to the suite of @ref{2d,,csv} module quoting styles.

@item 
bpo-24964@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24964}: Added
@ref{1ab9,,http.client.HTTPConnection.get_proxy_response_headers()} that
provides access to the HTTP headers on a proxy server response to the
@code{CONNECT} request.

@item 
bpo-17258@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17258}: @ref{98,,multiprocessing} now supports stronger HMAC algorithms
for inter-process connection authentication rather than only HMAC-MD5.

@item 
bpo-39744@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39744}: Make @ref{1ae6,,asyncio.subprocess.Process.communicate()} close the
subprocess’s stdin even when called with @code{input=None}.

@item 
bpo-22708@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22708}: http.client CONNECT method tunnel improvements: Use HTTP 1.1
protocol; send a matching Host: header with CONNECT, if one is not
provided; convert IDN domain names to Punycode. Patch by Michael Handler.
@end itemize

@node Documentation<24>,Tests<24>,Library<71>,Python 3 12 0 beta 1
@anchor{whatsnew/changelog id323}@anchor{1ae7}
@subsubsection Documentation



@itemize -

@item 
gh-67056@footnote{https://github.com/python/cpython/issues/67056}: Document that the effect of registering or unregistering an
@ref{d,,atexit} cleanup function from within a registered cleanup function
is undefined.

@item 
gh-103629@footnote{https://github.com/python/cpython/issues/103629}: Mention the new way of typing @code{**kwargs} with @code{Unpack} and
@code{TypedDict} introduced in 
@geindex Python Enhancement Proposals; PEP 692
PEP 692@footnote{https://peps.python.org/pep-0692/}.

@item 
gh-48241@footnote{https://github.com/python/cpython/issues/48241}: Clarifying documentation about the url parameter to
urllib.request.urlopen and urllib.request.Request needing to be encoded
properly.

@item 
gh-86094@footnote{https://github.com/python/cpython/issues/86094}: Add support for Unicode Path Extra Field in ZipFile. Patch by
Yeojin Kim and Andrea Giudiceandrea

@item 
gh-99202@footnote{https://github.com/python/cpython/issues/99202}: Fix extension type from documentation for compiling in C++20
mode
@end itemize

@node Tests<24>,Build<27>,Documentation<24>,Python 3 12 0 beta 1
@anchor{whatsnew/changelog id324}@anchor{1ae8}
@subsubsection Tests



@itemize -

@item 
gh-104494@footnote{https://github.com/python/cpython/issues/104494}: Update @code{test_pack_configure_in} and
@code{test_place_configure_in} for changes to error message formatting in Tk
8.7.

@item 
gh-104461@footnote{https://github.com/python/cpython/issues/104461}: Run test_configure_screen on X11 only, since the @code{DISPLAY}
environment variable and @code{-screen} option for toplevels are not useful
on Tk for Win32 or Aqua.

@item 
gh-86275@footnote{https://github.com/python/cpython/issues/86275}: Added property-based tests to the @ref{13b,,zoneinfo} tests, along
with stubs for the @code{hypothesis} interface. (Patch by Paul Ganssle)

@item 
gh-103329@footnote{https://github.com/python/cpython/issues/103329}: Regression tests for the behaviour of
@code{unittest.mock.PropertyMock} were added.

@item 
gh-102795@footnote{https://github.com/python/cpython/issues/102795}: fix use of poll in test_epoll’s test_control_and_wait

@item 
gh-75729@footnote{https://github.com/python/cpython/issues/75729}: Fix the @ref{31d,,os.spawn*} tests failing on Windows
when the working directory or interpreter path contains spaces.
@end itemize

@node Build<27>,Windows<24>,Tests<24>,Python 3 12 0 beta 1
@anchor{whatsnew/changelog id325}@anchor{1ae9}
@subsubsection Build



@itemize -

@item 
gh-101282@footnote{https://github.com/python/cpython/issues/101282}: BOLT optimization is now applied to the libpython shared
library if building a shared library. BOLT instrumentation and application
settings can now be influenced via the @code{BOLT_INSTRUMENT_FLAGS} and
@code{BOLT_APPLY_FLAGS} configure variables.

@item 
gh-99017@footnote{https://github.com/python/cpython/issues/99017}: @code{PYTHON_FOR_REGEN} now require Python 3.10 or newer.

@item 
gh-104490@footnote{https://github.com/python/cpython/issues/104490}: Define @code{.PHONY} / virtual make targets consistently and
properly.

@item 
gh-104106@footnote{https://github.com/python/cpython/issues/104106}: Add gcc fallback of mkfifoat/mknodat for macOS. Patch by
Donghee Na.

@item 
gh-103532@footnote{https://github.com/python/cpython/issues/103532}: The @code{TKINTER_PROTECT_LOADTK} macro is no longer defined or
used in the @code{_tkinter} module.  It was previously only defined when
building against Tk 8.4.13 and older, but Tk older than 8.5.12 has been
unsupported since gh-91152@footnote{https://github.com/python/cpython/issues/91152}.

@item 
gh-99069@footnote{https://github.com/python/cpython/issues/99069}: Extended workaround defining @code{static_assert} when missing from
the libc headers to all clang and gcc builds. In particular, this fixes
building on macOS <= 10.10.

@item 
gh-100220@footnote{https://github.com/python/cpython/issues/100220}: Changed the default value of the @code{SHELL} Makefile variable
from @code{/bin/sh} to @code{/bin/sh -e} to ensure that complex recipes
correctly fail after an error. Previously, @code{make install} could fail to
install some files and yet return a successful result.

@item 
gh-90656@footnote{https://github.com/python/cpython/issues/90656}: Add platform triplets for 64-bit LoongArch:


@itemize *

@item 
loongarch64-linux-gnusf

@item 
loongarch64-linux-gnuf32

@item 
loongarch64-linux-gnu
@end itemize

Patch by Zhang Na.
@end itemize

@node Windows<24>,macOS<18>,Build<27>,Python 3 12 0 beta 1
@anchor{whatsnew/changelog id326}@anchor{1aea}
@subsubsection Windows



@itemize -

@item 
gh-104623@footnote{https://github.com/python/cpython/issues/104623}: Update Windows installer to use SQLite 3.42.0.

@item 
gh-82814@footnote{https://github.com/python/cpython/issues/82814}: Fix a potential @code{[Errno 13] Permission denied} when using
@ref{133a,,shutil.copystat()} within Windows Subsystem for Linux (WSL) on a
mounted filesystem by adding @code{errno.EACCES} to the list of ignored
errors within the internal implementation.

@item 
gh-103088@footnote{https://github.com/python/cpython/issues/103088}: Fix virtual environment @code{activate} script having
incorrect line endings for Cygwin.

@item 
gh-103088@footnote{https://github.com/python/cpython/issues/103088}: Fixes venvs not working in bash on Windows across different
disks

@item 
gh-102997@footnote{https://github.com/python/cpython/issues/102997}: Update Windows installer to use SQLite 3.41.2.

@item 
gh-88013@footnote{https://github.com/python/cpython/issues/88013}: Fixed a bug where @ref{199,,TypeError} was raised when calling
@code{ntpath.realpath()} with a bytes parameter in some cases.
@end itemize

@node macOS<18>,IDLE<15>,Windows<24>,Python 3 12 0 beta 1
@anchor{whatsnew/changelog id327}@anchor{1aeb}
@subsubsection macOS



@itemize -

@item 
gh-99834@footnote{https://github.com/python/cpython/issues/99834}: Update macOS installer to Tcl/Tk 8.6.13.

@item 
gh-104623@footnote{https://github.com/python/cpython/issues/104623}: Update macOS installer to SQLite 3.42.0.

@item 
gh-103545@footnote{https://github.com/python/cpython/issues/103545}: Add @code{os.PRIO_DARWIN_THREAD}, @code{os.PRIO_DARWIN_PROCESS},
@code{os.PRIO_DARWIN_BG} and @code{os.PRIO_DARWIN_NONUI}. These can be used with
@code{os.setpriority} to run the process at a lower priority and make use of
the efficiency cores on Apple Silicon systems.

@item 
gh-104180@footnote{https://github.com/python/cpython/issues/104180}: Support reading SOCKS proxy configuration from macOS System
Configuration. Patch by Sam Schott.

@item 
gh-60436@footnote{https://github.com/python/cpython/issues/60436}: update curses textbox to additionally handle backspace using the
@code{curses.ascii.DEL} key press.

@item 
gh-102997@footnote{https://github.com/python/cpython/issues/102997}: Update macOS installer to SQLite 3.41.2.
@end itemize

@node IDLE<15>,Tools/Demos<20>,macOS<18>,Python 3 12 0 beta 1
@anchor{whatsnew/changelog id328}@anchor{1aec}
@subsubsection IDLE



@itemize -

@item 
gh-104499@footnote{https://github.com/python/cpython/issues/104499}: Fix completions for Tk Aqua 8.7 (currently blank).

@item 
gh-104496@footnote{https://github.com/python/cpython/issues/104496}: About prints both tcl and tk versions if different (expected
someday).

@item 
gh-88496@footnote{https://github.com/python/cpython/issues/88496}: Fix IDLE test hang on macOS.
@end itemize

@node Tools/Demos<20>,C API<26>,IDLE<15>,Python 3 12 0 beta 1
@anchor{whatsnew/changelog id329}@anchor{1aed}
@subsubsection Tools/Demos



@itemize -

@item 
gh-104389@footnote{https://github.com/python/cpython/issues/104389}: Argument Clinic C converters now accept the @code{unused} keyword,
for wrapping a parameter with @ref{1ad0,,Py_UNUSED}. Patch by Erlend E.
Aasland.
@end itemize

@node C API<26>,,Tools/Demos<20>,Python 3 12 0 beta 1
@anchor{whatsnew/changelog id330}@anchor{1aee}
@subsubsection C API



@itemize -

@item 
gh-101291@footnote{https://github.com/python/cpython/issues/101291}: Added unstable C API for extracting the value of “compact”
integers: @ref{7a7,,PyUnstable_Long_IsCompact()} and
@ref{7a8,,PyUnstable_Long_CompactValue()}.

@item 
gh-104109@footnote{https://github.com/python/cpython/issues/104109}: We’ve added @code{Py_NewInterpreterFromConfig()} and
@code{PyInterpreterConfig} to the public C-API (but not the stable ABI; not
yet at least).  The new function may be used to create a new interpreter
with various features configured.  The function was added to support PEP
684 (per-interpreter GIL).

@item 
gh-103968@footnote{https://github.com/python/cpython/issues/103968}: @ref{79e,,PyType_FromSpec()} and its variants now allow creating
classes whose metaclass overrides @ref{7a0,,tp_new}. The
@code{tp_new} is ignored. This behavior is deprecated and will be disallowed
in 3.14+. The new @ref{773,,PyType_FromMetaclass()} already disallows it.

@item 
gh-103743@footnote{https://github.com/python/cpython/issues/103743}: Add @ref{1aef,,PyUnstable_Object_GC_NewWithExtraData()} function
that can be used to allocate additional memory after an object for data
not managed by Python.

@item 
gh-103295@footnote{https://github.com/python/cpython/issues/103295}: Introduced @ref{1af0,,PyUnstable_WritePerfMapEntry()},
@ref{1af1,,PyUnstable_PerfMapState_Init()} and
@ref{1af2,,PyUnstable_PerfMapState_Fini()}. These allow extension modules (JIT
compilers in particular) to write to perf-map files in a thread safe
manner. The @ref{1af3,,Python support for the Linux perf profiler} also uses these APIs to write
entries in the perf-map file.

@item 
gh-103509@footnote{https://github.com/python/cpython/issues/103509}: Added C API for extending types whose instance memory layout is
opaque: @ref{76b,,PyType_Spec.basicsize} can now be zero or negative,
@ref{76c,,PyObject_GetTypeData()} can be used to get subclass-specific data,
and @ref{76e,,Py_TPFLAGS_ITEMS_AT_END} can be used to safely extend
variable-size objects. See 
@geindex Python Enhancement Proposals; PEP 697
PEP 697@footnote{https://peps.python.org/pep-0697/} for details.

@item 
gh-103091@footnote{https://github.com/python/cpython/issues/103091}: Add a new C-API function to eagerly assign a version tag to a
PyTypeObject: @code{PyUnstable_Type_AssignVersionTag()}.

@item 
gh-101408@footnote{https://github.com/python/cpython/issues/101408}: @ref{1af4,,PyObject_GC_Resize} should calculate preheader size
if needed. Patch by Donghee Na.

@item 
gh-98836@footnote{https://github.com/python/cpython/issues/98836}: Add support of more formatting options (left aligning, octals,
uppercase hexadecimals, @code{intmax_t}, @code{ptrdiff_t},
@code{wchar_t} C strings, variable width and precision) in
@ref{62b,,PyUnicode_FromFormat()} and @ref{795,,PyUnicode_FromFormatV()}.

@item 
gh-96803@footnote{https://github.com/python/cpython/issues/96803}: Add unstable C-API functions to get the code object, lasti and
line number from the internal @code{_PyInterpreterFrame} in the limited API.
The functions are:


@itemize *

@item 
@code{PyCodeObject * PyUnstable_InterpreterFrame_GetCode(struct _PyInterpreterFrame *frame)}

@item 
@code{int PyUnstable_InterpreterFrame_GetLasti(struct _PyInterpreterFrame *frame)}

@item 
@code{int PyUnstable_InterpreterFrame_GetLine(struct _PyInterpreterFrame *frame)}
@end itemize
@end itemize

@node Python 3 12 0 alpha 7,Python 3 12 0 alpha 6,Python 3 12 0 beta 1,Changelog
@anchor{whatsnew/changelog python-3-12-0-alpha-7}@anchor{1af5}
@subsection Python 3.12.0 alpha 7


`Release date: 2023-04-04'

@menu
* Core and Builtins: Core and Builtins<66>. 
* Library: Library<72>. 
* Core and Builtins: Core and Builtins<67>. 
* Build: Build<28>. 
* Core and Builtins: Core and Builtins<68>. 
* Library: Library<73>. 
* Documentation: Documentation<25>. 
* Tests: Tests<25>. 
* Build: Build<29>. 
* Windows: Windows<25>. 
* Tools/Demos: Tools/Demos<21>. 
* C API: C API<27>. 

@end menu

@node Core and Builtins<66>,Library<72>,,Python 3 12 0 alpha 7
@anchor{whatsnew/changelog id331}@anchor{1af6}
@subsubsection Core and Builtins



@itemize -

@item 
gh-102192@footnote{https://github.com/python/cpython/issues/102192}: Deprecated @code{_PyErr_ChainExceptions} in favour of
@code{_PyErr_ChainExceptions1}.

@item 
gh-89987@footnote{https://github.com/python/cpython/issues/89987}: Reduce the number of inline @ref{90a,,CACHE} entries for
@code{BINARY_SUBSCR}.

@item 
gh-102859@footnote{https://github.com/python/cpython/issues/102859}: Removed @code{JUMP_IF_FALSE_OR_POP} and
@code{JUMP_IF_TRUE_OR_POP} instructions.

@item 
gh-101975@footnote{https://github.com/python/cpython/issues/101975}: Fixed @code{stacktop} value on tracing entries to avoid corruption
on garbage collection.

@item 
gh-102778@footnote{https://github.com/python/cpython/issues/102778}: Add @ref{6e6,,sys.last_exc} and deprecate @ref{6e7,,sys.last_type},
@ref{6e8,,sys.last_value} and @ref{6e9,,sys.last_traceback}, which hold the same
information in its legacy form.

@item 
gh-100982@footnote{https://github.com/python/cpython/issues/100982}: Replace all occurrences of @code{COMPARE_AND_BRANCH} with
@ref{b67,,COMPARE_OP}.

@item 
gh-102701@footnote{https://github.com/python/cpython/issues/102701}: Fix overflow when creating very large dict.

@item 
gh-102755@footnote{https://github.com/python/cpython/issues/102755}: Add @ref{433,,PyErr_DisplayException()} which takes just an
exception instance, to replace the legacy @code{PyErr_Display()} which
takes the @code{(typ, exc, tb)} triplet.

@item 
gh-102594@footnote{https://github.com/python/cpython/issues/102594}: Add note to exception raised in @code{PyErr_SetObject} when
normalization fails.

@item 
gh-90997@footnote{https://github.com/python/cpython/issues/90997}: Shrink the number of inline @ref{90a,,CACHE} entries used by
@ref{1aa0,,LOAD_GLOBAL}.
@end itemize

@node Library<72>,Core and Builtins<67>,Core and Builtins<66>,Python 3 12 0 alpha 7
@anchor{whatsnew/changelog id332}@anchor{1af7}
@subsubsection Library



@itemize -

@item 
gh-102491@footnote{https://github.com/python/cpython/issues/102491}: Improve import time of @code{platform} by removing IronPython
version parsing. The IronPython version parsing was not functional (see
@indicateurl{https://github.com/IronLanguages/ironpython3/issues/1667}).
@end itemize

@node Core and Builtins<67>,Build<28>,Library<72>,Python 3 12 0 alpha 7
@anchor{whatsnew/changelog id333}@anchor{1af8}
@subsubsection Core and Builtins



@itemize -

@item 
gh-101291@footnote{https://github.com/python/cpython/issues/101291}: Rearrage bits in first field (after header) of PyLongObject. *
Bits 0 and 1: 1 - sign. I.e. 0 for positive numbers, 1 for zero and 2 for
negative numbers. * Bit 2 reserved (probably for the immortal bit) * Bits
3+ the unsigned size.

This makes a few operations slightly more efficient, and will enable a
more compact and faster 2s-complement representation of most ints in
future.

@item 
gh-102397@footnote{https://github.com/python/cpython/issues/102397}: Fix segfault from race condition in signal handling during
garbage collection. Patch by Kumar Aditya.

@item 
gh-102406@footnote{https://github.com/python/cpython/issues/102406}: @ref{1c,,codecs} encoding/decoding errors now get the context
information (which operation and which codecs) attached as 
@geindex Python Enhancement Proposals; PEP 678
PEP 678@footnote{https://peps.python.org/pep-0678/}
notes instead of through chaining a new instance of the exception.

@item 
gh-102281@footnote{https://github.com/python/cpython/issues/102281}: Fix potential nullptr dereference and use of uninitialized
memory in fileutils. Patch by Max Bachmann.

@item 
gh-102300@footnote{https://github.com/python/cpython/issues/102300}: Reuse operands with refcount of 1 in float specializations of
BINARY_OP.

@item 
gh-102213@footnote{https://github.com/python/cpython/issues/102213}: Fix performance loss when accessing an object’s attributes with
@code{__getattr__}  defined.

@item 
gh-102255@footnote{https://github.com/python/cpython/issues/102255}: Improve build support for the Xbox. Patch by Max Bachmann.
@end itemize

@node Build<28>,Core and Builtins<68>,Core and Builtins<67>,Python 3 12 0 alpha 7
@anchor{whatsnew/changelog id334}@anchor{1af9}
@subsubsection Build



@itemize -

@item 
gh-102027@footnote{https://github.com/python/cpython/issues/102027}: Fix SSE2 and SSE3 detection in @code{_blake2} internal module.
Patch by Max Bachmann.
@end itemize

@node Core and Builtins<68>,Library<73>,Build<28>,Python 3 12 0 alpha 7
@anchor{whatsnew/changelog id335}@anchor{1afa}
@subsubsection Core and Builtins



@itemize -

@item 
gh-101865@footnote{https://github.com/python/cpython/issues/101865}: Deprecate @code{co_lnotab} in code objects, schedule it for
removal in Python 3.14
@end itemize

@node Library<73>,Documentation<25>,Core and Builtins<68>,Python 3 12 0 alpha 7
@anchor{whatsnew/changelog id336}@anchor{1afb}
@subsubsection Library



@itemize -

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Adapt @code{_pickle} to 
@geindex Python Enhancement Proposals; PEP 687
PEP 687@footnote{https://peps.python.org/pep-0687/}. Patch by Mohamed Koubaa
and Erlend Aasland.

@item 
gh-103085@footnote{https://github.com/python/cpython/issues/103085}: Pure python @ref{867,,locale.getencoding()} will not warn
deprecation.

@item 
gh-103068@footnote{https://github.com/python/cpython/issues/103068}: It’s no longer possible to register conditional breakpoints in
@ref{275,,Pdb} that raise @ref{18f,,SyntaxError}. Patch by Tian Gao.

@item 
gh-102549@footnote{https://github.com/python/cpython/issues/102549}: Don’t ignore exceptions in member type creation.

@item 
gh-103056@footnote{https://github.com/python/cpython/issues/103056}: Ensure final @code{_generate_next_value_} is a @code{staticmethod}.

@item 
gh-103046@footnote{https://github.com/python/cpython/issues/103046}: Display current line label correctly in @ref{3c,,dis} when
@code{show_caches} is False and @code{lasti} points to a CACHE entry.

@item 
gh-102433@footnote{https://github.com/python/cpython/issues/102433}: @ref{2af,,isinstance()} checks against @ref{675,,runtime-checkable protocols} now use
@ref{6bd,,inspect.getattr_static()} rather than @ref{6fa,,hasattr()} to lookup
whether attributes exist. This means that descriptors and
@ref{6fb,,__getattr__()} methods are no longer unexpectedly evaluated
during @code{isinstance()} checks against runtime-checkable protocols.
However, it may also mean that some objects which used to be considered
instances of a runtime-checkable protocol may no longer be considered
instances of that protocol on Python 3.12+, and vice versa. Most users are
unlikely to be affected by this change. Patch by Alex Waygood.

@item 
gh-103023@footnote{https://github.com/python/cpython/issues/103023}: It’s no longer possible to register expressions to display in
@ref{275,,Pdb} that raise @ref{18f,,SyntaxError}. Patch by Tian Gao.

@item 
gh-102947@footnote{https://github.com/python/cpython/issues/102947}: Improve traceback when @ref{1979,,dataclasses.fields()} is called on
a non-dataclass. Patch by Alex Waygood

@item 
gh-102780@footnote{https://github.com/python/cpython/issues/102780}: The @ref{1a86,,asyncio.Timeout} context manager now works reliably
even when performing cleanup due to task cancellation.  Previously it
could raise a @ref{4d5,,CancelledError} instead of an
@ref{1afc,,TimeoutError} in such cases.

@item 
gh-102871@footnote{https://github.com/python/cpython/issues/102871}: Remove support for obsolete browsers from @ref{11c,,webbrowser}.
Removed browsers include Grail, Mosaic, Netscape, Galeon, Skipstone,
Iceape, Firebird, and Firefox versions 35 and below.

@item 
gh-102839@footnote{https://github.com/python/cpython/issues/102839}: Improve performance of @ref{16cc,,math.log()} arguments handling by
removing the argument clinic.

@item 
gh-102828@footnote{https://github.com/python/cpython/issues/102828}: Add the @code{onexc} arg to @ref{354,,shutil.rmtree()}, which is like
@code{onerror} but expects an exception instance rather than an exc_info
tuple. Deprecate @code{onerror}.

@item 
gh-88965@footnote{https://github.com/python/cpython/issues/88965}: typing: Fix a bug relating to substitution in custom classes
generic over a @ref{488,,ParamSpec}. Previously, if the
@code{ParamSpec} was substituted with a parameters list that itself contained
a @ref{487,,TypeVar}, the @code{TypeVar} in the parameters list could
not be subsequently substituted. This is now fixed.

Patch by Nikita Sobolev.

@item 
gh-76846@footnote{https://github.com/python/cpython/issues/76846}: Fix issue where @code{__new__()} and @code{__init__()} methods of
@ref{6ce,,pathlib.PurePath} and @ref{268,,Path} subclasses were not
called in some circumstances.

@item 
gh-78530@footnote{https://github.com/python/cpython/issues/78530}: @ref{6a8,,asyncio.wait()} now accepts generators yielding tasks.
Patch by Kumar Aditya.

@item 
gh-102748@footnote{https://github.com/python/cpython/issues/102748}: @ref{6a7,,asyncio.iscoroutine()} now returns @code{False} for
generators as @ref{b,,asyncio} does not support legacy generator-based
coroutines. Patch by Kumar Aditya.

@item 
gh-102670@footnote{https://github.com/python/cpython/issues/102670}: Optimized fmean(), correlation(), covariance(), and
linear_regression() using the new math.sumprod() function.

@item 
gh-102615@footnote{https://github.com/python/cpython/issues/102615}: Typing: Improve the @code{repr} of generic aliases for classes
generic over a @ref{488,,ParamSpec}. (Use square brackets to
represent a parameter list.)

@item 
gh-100112@footnote{https://github.com/python/cpython/issues/100112}: @ref{bd5,,asyncio.Task.get_coro()} now always returns a coroutine
when wrapping an awaitable object. Patch by Kumar Aditya.

@item 
gh-102578@footnote{https://github.com/python/cpython/issues/102578}: Speed up setting or deleting mutable attributes on
non-dataclass subclasses of frozen dataclasses. Due to the implementation
of @code{__setattr__} and @code{__delattr__} for frozen dataclasses, this
previously had a time complexity of `O'(`n'). It now has a time
complexity of `O'(1).

@item 
gh-102519@footnote{https://github.com/python/cpython/issues/102519}: Add @ref{6c6,,os.listdrives()}, @ref{6c7,,os.listvolumes()} and
@ref{6c8,,os.listmounts()} functions on Windows for enumerating drives, volumes
and mount points

@item 
gh-74468@footnote{https://github.com/python/cpython/issues/74468}: Attribute name of the extracted @ref{e4,,tarfile} file object now
holds filename of itself rather than of the archive it is contained in.
Patch by Oleg Iarygin.

@item 
gh-102378@footnote{https://github.com/python/cpython/issues/102378}: Private helper method
@code{inspect._signature_strip_non_python_syntax} will no longer strip @code{/}
from the input string.

@item 
gh-79940@footnote{https://github.com/python/cpython/issues/79940}: Add @ref{6bb,,inspect.getasyncgenstate()} and
@ref{6bc,,inspect.getasyncgenlocals()}. Patch by Thomas Krennwallner.

@item 
gh-102103@footnote{https://github.com/python/cpython/issues/102103}: Add @code{module} argument to @ref{18a5,,dataclasses.make_dataclass()}
and make classes produced by it pickleable.

@item 
gh-102069@footnote{https://github.com/python/cpython/issues/102069}: Fix @code{__weakref__} descriptor generation for custom
dataclasses.

@item 
gh-102038@footnote{https://github.com/python/cpython/issues/102038}: Skip a @code{stat} in @ref{cc,,site} if we have already found a
@code{pyvenv.cfg}

@item 
gh-98886@footnote{https://github.com/python/cpython/issues/98886}: Fix issues when defining dataclasses that have fields with
specific underscore names that aren’t clearly reserved by
@ref{33,,dataclasses}.

@item 
gh-101673@footnote{https://github.com/python/cpython/issues/101673}: Fix a @ref{aa,,pdb} bug where @code{ll} clears the changes to local
variables.

@item 
gh-101313@footnote{https://github.com/python/cpython/issues/101313}: Added -h and –help arguments to the webbrowser CLI

@item 
gh-100372@footnote{https://github.com/python/cpython/issues/100372}: @ref{10f4,,ssl.SSLContext.load_verify_locations()} no longer
incorrectly accepts some cases of trailing data when parsing DER.

@item 
gh-89727@footnote{https://github.com/python/cpython/issues/89727}: Fix pathlib.Path.walk RecursionError on deep directory trees by
rewriting it using iteration instead of recursion.

@item 
gh-100131@footnote{https://github.com/python/cpython/issues/100131}: Added an optional @code{delete} keyword argument to
@ref{1440,,tempfile.TemporaryDirectory}.

@item 
gh-48330@footnote{https://github.com/python/cpython/issues/48330}: Added @code{--durations} command line option, showing the N slowest
test cases. @ref{1afd,,unittest.TextTestRunner} and
@ref{755,,unittest.TextTestResult} constructors accept a new `durations'
keyword argument. Subclasses should take this into account or accept
@code{**kwargs}. Added @ref{1afe,,unittest.TestResult.addDuration()} method and
@ref{1ac2,,unittest.TestResult.collectedDurations} attribute.

(Contributed by Giampaolo Rodola)

@item 
gh-98169@footnote{https://github.com/python/cpython/issues/98169}: Fix @ref{1ae4,,dataclasses.astuple()} crash when
@ref{13c8,,collections.defaultdict} is present in the attributes.

@item 
gh-96931@footnote{https://github.com/python/cpython/issues/96931}: Fix incorrect results from @ref{1072,,ssl.SSLSocket.shared_ciphers()}

@item 
gh-95495@footnote{https://github.com/python/cpython/issues/95495}: When built against OpenSSL 3.0, the @ref{d5,,ssl} module had a bug
where it reported unauthenticated EOFs (i.e. without close_notify) as a
clean TLS-level EOF. It now raises @ref{1aff,,SSLEOFError}, matching the
behavior in previous versions of OpenSSL. The
@ref{a3f,,options} attribute on @ref{355,,SSLContext} also
no longer includes @ref{a3e,,OP_IGNORE_UNEXPECTED_EOF} by default. This
option may be set to specify the previous OpenSSL 3.0 behavior.

@item 
gh-94684@footnote{https://github.com/python/cpython/issues/94684}: Now @ref{2e7,,uuid.uuid3()} and @ref{2e8,,uuid.uuid5()} functions support
@ref{193,,bytes} objects as their `name' argument.

@item 
gh-94440@footnote{https://github.com/python/cpython/issues/94440}: Fix a @code{concurrent.futures.process} bug where
@code{ProcessPoolExecutor} shutdown could hang after a future has been
quickly submitted and canceled.

@item 
gh-72346@footnote{https://github.com/python/cpython/issues/72346}: Added deprecation warning to `isdst' parameter of
@ref{2f9,,email.utils.localtime()}.

@item 
bpo-36305@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36305}: Fix handling of Windows filenames that resemble drives, such as
@code{./a:b}, in @ref{a8,,pathlib}.
@end itemize

@node Documentation<25>,Tests<25>,Library<73>,Python 3 12 0 alpha 7
@anchor{whatsnew/changelog id337}@anchor{1b00}
@subsubsection Documentation



@itemize -

@item 
gh-103112@footnote{https://github.com/python/cpython/issues/103112}: Add docstring to @ref{18f5,,http.client.HTTPResponse.read()} to fix
@code{pydoc} output.
@end itemize

@node Tests<25>,Build<29>,Documentation<25>,Python 3 12 0 alpha 7
@anchor{whatsnew/changelog id338}@anchor{1b01}
@subsubsection Tests



@itemize -

@item 
gh-102980@footnote{https://github.com/python/cpython/issues/102980}: Improve test coverage on @ref{aa,,pdb}.

@item 
gh-102537@footnote{https://github.com/python/cpython/issues/102537}: Adjust the error handling strategy in
@code{test_zoneinfo.TzPathTest.python_tzpath_context}. Patch by Paul Ganssle.

@item 
gh-101377@footnote{https://github.com/python/cpython/issues/101377}: Improved test_locale_calendar_formatweekday of calendar.
@end itemize

@node Build<29>,Windows<25>,Tests<25>,Python 3 12 0 alpha 7
@anchor{whatsnew/changelog id339}@anchor{1b02}
@subsubsection Build



@itemize -

@item 
gh-102973@footnote{https://github.com/python/cpython/issues/102973}: Add a dev container (along with accompanying Dockerfile) for
development purposes.

@item 
gh-102711@footnote{https://github.com/python/cpython/issues/102711}: Fix @code{-Wstrict-prototypes} compiler warnings.
@end itemize

@node Windows<25>,Tools/Demos<21>,Build<29>,Python 3 12 0 alpha 7
@anchor{whatsnew/changelog id340}@anchor{1b03}
@subsubsection Windows



@itemize -

@item 
gh-102690@footnote{https://github.com/python/cpython/issues/102690}: Update @ref{11c,,webbrowser} to fall back to Microsoft Edge instead
of Internet Explorer.

@item 
gh-99726@footnote{https://github.com/python/cpython/issues/99726}: Improves correctness of stat results for Windows, and uses
faster API when available
@end itemize

@node Tools/Demos<21>,C API<27>,Windows<25>,Python 3 12 0 alpha 7
@anchor{whatsnew/changelog id341}@anchor{1b04}
@subsubsection Tools/Demos



@itemize -

@item 
gh-102809@footnote{https://github.com/python/cpython/issues/102809}: @code{Misc/gdbinit} was removed.
@end itemize

@node C API<27>,,Tools/Demos<21>,Python 3 12 0 alpha 7
@anchor{whatsnew/changelog id342}@anchor{1b05}
@subsubsection C API



@itemize -

@item 
gh-102013@footnote{https://github.com/python/cpython/issues/102013}: Add a new (unstable) C-API function for iterating over GC’able
objects using a callback: @code{PyUnstable_VisitObjects}.
@end itemize

@node Python 3 12 0 alpha 6,Python 3 12 0 alpha 5,Python 3 12 0 alpha 7,Changelog
@anchor{whatsnew/changelog python-3-12-0-alpha-6}@anchor{1b06}
@subsection Python 3.12.0 alpha 6


`Release date: 2023-03-07'

@menu
* Security: Security<27>. 
* Core and Builtins: Core and Builtins<69>. 
* Library: Library<74>. 
* Documentation: Documentation<26>. 
* Tests: Tests<26>. 
* Build: Build<30>. 
* Windows: Windows<26>. 
* macOS: macOS<19>. 
* C API: C API<28>. 

@end menu

@node Security<27>,Core and Builtins<69>,,Python 3 12 0 alpha 6
@anchor{whatsnew/changelog id343}@anchor{1b07}
@subsubsection Security



@itemize -

@item 
gh-99108@footnote{https://github.com/python/cpython/issues/99108}: Replace builtin hashlib implementations of MD5 and SHA1 with
verified ones from the HACL* project.

@item 
gh-101727@footnote{https://github.com/python/cpython/issues/101727}: Updated the OpenSSL version used in Windows and macOS binary
release builds to 1.1.1t to address 
@geindex Common Vulnerabilities and Exposures; CVE 2023-0286
CVE 2023-0286@footnote{https://www.cve.org/CVERecord?id=CVE-2023-0286}, 
@geindex Common Vulnerabilities and Exposures; CVE 2022-4303
CVE 2022-4303@footnote{https://www.cve.org/CVERecord?id=CVE-2022-4303},
and 
@geindex Common Vulnerabilities and Exposures; CVE 2022-4303
CVE 2022-4303@footnote{https://www.cve.org/CVERecord?id=CVE-2022-4303} per the OpenSSL 2023-02-07 security advisory@footnote{https://openssl-library.org/news/secadv/20230207.txt}.

@item 
gh-99108@footnote{https://github.com/python/cpython/issues/99108}: Replace the builtin @ref{6c,,hashlib} implementations of SHA2-384
and SHA2-512 originally from LibTomCrypt with formally verified,
side-channel resistant code from the HACL*@footnote{https://github.com/hacl-star/hacl-star/} project. The builtins remain a
fallback only used when OpenSSL does not provide them.

@item 
gh-101283@footnote{https://github.com/python/cpython/issues/101283}: @ref{4b8,,subprocess.Popen} now uses a safer approach to find
@code{cmd.exe} when launching with @code{shell=True}. Patch by Eryk Sun, based
on a patch by Oleg Iarygin.
@end itemize

@node Core and Builtins<69>,Library<74>,Security<27>,Python 3 12 0 alpha 6
@anchor{whatsnew/changelog id344}@anchor{1b08}
@subsubsection Core and Builtins



@itemize -

@item 
gh-102493@footnote{https://github.com/python/cpython/issues/102493}: Fix regression in semantics of normalisation in
@code{PyErr_SetObject}.

@item 
gh-102416@footnote{https://github.com/python/cpython/issues/102416}: Do not memoize incorrectly automatically generated loop rules
in the parser. Patch by Pablo Galindo.

@item 
gh-102356@footnote{https://github.com/python/cpython/issues/102356}: Fix a bug that caused a crash when deallocating deeply nested
filter objects. Patch by Marta Gómez Macías.

@item 
gh-102336@footnote{https://github.com/python/cpython/issues/102336}: Cleanup Windows 7 specific special handling. Patch by Max
Bachmann.

@item 
gh-102250@footnote{https://github.com/python/cpython/issues/102250}: Fixed a segfault occurring when the interpreter calls a
@code{__bool__} method that raises.

@item 
gh-102126@footnote{https://github.com/python/cpython/issues/102126}: Fix deadlock at shutdown when clearing thread states if any
finalizer tries to acquire the runtime head lock. Patch by Kumar Aditya.

@item 
gh-102027@footnote{https://github.com/python/cpython/issues/102027}: Use @code{GetCurrentProcessId} on Windows when @code{getpid} is
unavailable. Patch by Max Bachmann.

@item 
gh-102056@footnote{https://github.com/python/cpython/issues/102056}: Fix error handling bugs in interpreter’s exception printing
code, which could cause a crash on infinite recursion.

@item 
gh-100982@footnote{https://github.com/python/cpython/issues/100982}: Restrict the scope of the @code{FOR_ITER_RANGE} instruction
to the scope of the original @ref{1b09,,FOR_ITER} instruction, to allow
instrumentation.

@item 
gh-101967@footnote{https://github.com/python/cpython/issues/101967}: Fix possible segfault in @code{positional_only_passed_as_keyword}
function, when new list created.

@item 
gh-101952@footnote{https://github.com/python/cpython/issues/101952}: Fix possible segfault in @code{BUILD_SET} opcode, when new set
created.

@item 
gh-74895@footnote{https://github.com/python/cpython/issues/74895}: @ref{17a8,,socket.getaddrinfo} no longer raises
@ref{a87,,OverflowError} for @ref{19c,,int} `port' values outside of the C
long range. Out of range values are left up to the underlying string based
C library API to report. A @ref{1b0a,,socket.gaierror} @code{SAI_SERVICE} may
occur instead, or no error at all as not all platform C libraries generate
an error.

@item 
gh-101799@footnote{https://github.com/python/cpython/issues/101799}: Add @ref{709,,CALL_INTRINSIC_2} and use it instead of
@code{PREP_RERAISE_STAR}.

@item 
gh-101857@footnote{https://github.com/python/cpython/issues/101857}: Fix xattr support detection on Linux systems by widening the
check to linux, not just glibc. This fixes support for musl.

@item 
gh-84783@footnote{https://github.com/python/cpython/issues/84783}: Make the slice object hashable. Patch by Will Bradshaw and
Furkan Onder.

@item 
gh-87849@footnote{https://github.com/python/cpython/issues/87849}: Change the @code{SEND} instruction to leave the receiver on the
stack. This allows the specialized form of @code{SEND} to skip the chain of C
calls and jump directly to the @code{RESUME} in the generator or coroutine.

@item 
gh-101765@footnote{https://github.com/python/cpython/issues/101765}: Fix SystemError / segmentation fault in iter @code{__reduce__}
when internal access of @code{builtins.__dict__} keys mutates the iter
object.

@item 
gh-101430@footnote{https://github.com/python/cpython/issues/101430}: Update @ref{106,,tracemalloc} to handle presize of object properly.
Patch by Donghee Na.

@item 
gh-101696@footnote{https://github.com/python/cpython/issues/101696}: Invalidate type version tag in @code{_PyStaticType_Dealloc} for
static types, avoiding bug where a false cache hit could crash the
interpreter. Patch by Kumar Aditya.

@item 
gh-101632@footnote{https://github.com/python/cpython/issues/101632}: Adds a new @code{RETURN_CONST} instruction.

@item 
gh-100719@footnote{https://github.com/python/cpython/issues/100719}: Remove gi_code field from generator (and coroutine and async
generator) objects as it is redundant. The frame already includes a
reference to the code object.

@item 
gh-98627@footnote{https://github.com/python/cpython/issues/98627}: When an interpreter is configured to check (and only then),
importing an extension module will now fail when the extension does not
support multiple interpreters (i.e. doesn’t implement PEP 489 multi-phase
init). This does not apply to the main interpreter, nor to subinterpreters
created with @code{Py_NewInterpreter()}.
@end itemize

@node Library<74>,Documentation<26>,Core and Builtins<69>,Python 3 12 0 alpha 6
@anchor{whatsnew/changelog id345}@anchor{1b0b}
@subsubsection Library



@itemize -

@item 
gh-102302@footnote{https://github.com/python/cpython/issues/102302}: Micro-optimise hashing of @ref{4e5,,inspect.Parameter}, reducing
the time it takes to hash an instance by around 40%.

@item 
gh-101979@footnote{https://github.com/python/cpython/issues/101979}: Fix a bug where parentheses in the @code{metavar} argument to
@ref{4bd,,argparse.ArgumentParser.add_argument()} were dropped. Patch by Yeojin
Kim.

@item 
gh-91038@footnote{https://github.com/python/cpython/issues/91038}: @ref{1b0c,,platform.platform()} now has boolean default arguments.

@item 
gh-81652@footnote{https://github.com/python/cpython/issues/81652}: Add @ref{1b0d,,mmap.MAP_ALIGNED_SUPER} FreeBSD and
@ref{1b0e,,mmap.MAP_CONCEAL} OpenBSD constants to @ref{94,,mmap}. Patch by
Yeojin Kim.

@item 
gh-102179@footnote{https://github.com/python/cpython/issues/102179}: Fix @ref{d60,,os.dup2()} error message for negative fds.

@item 
gh-101961@footnote{https://github.com/python/cpython/issues/101961}: For the binary mode, @code{fileinput.hookcompressed()} doesn’t
set the @code{encoding} value even if the value is @code{None}. Patch by Gihwan
Kim.

@item 
gh-101936@footnote{https://github.com/python/cpython/issues/101936}: The default value of @code{fp} becomes @ref{10aa,,io.BytesIO} if
@ref{11e4,,HTTPError} is initialized without a designated @code{fp}
parameter. Patch by Long Vo.

@item 
gh-101566@footnote{https://github.com/python/cpython/issues/101566}: In zipfile, sync Path with zipp 3.14@footnote{https://zipp.readthedocs.io/en/latest/history.html#v3-14-0}, including
fix for extractall on the underlying zipfile after being wrapped in
@code{Path}.

@item 
gh-97930@footnote{https://github.com/python/cpython/issues/97930}: Apply changes from importlib_resources 5.12@footnote{https://importlib-resources.readthedocs.io/en/latest/history.html#v5-12-0},
including fix for @code{MultiplexedPath} to support directories in multiple
namespaces (python/importlib_resources#265).

@item 
gh-101997@footnote{https://github.com/python/cpython/issues/101997}: Upgrade pip wheel bundled with ensurepip (pip 23.0.1)

@item 
gh-99108@footnote{https://github.com/python/cpython/issues/99108}: The built-in extension modules for @ref{6c,,hashlib} SHA2
algorithms, used when OpenSSL does not provide them, now live in a single
internal @code{_sha2} module instead of separate @code{_sha256} and @code{_sha512}
modules.

@item 
gh-101892@footnote{https://github.com/python/cpython/issues/101892}: Callable iterators no longer raise @ref{796,,SystemError} when
the callable object exhausts the iterator but forgets to either return a
sentinel value or raise @ref{dfb,,StopIteration}.

@item 
gh-87634@footnote{https://github.com/python/cpython/issues/87634}: Remove locking behavior from @ref{764,,functools.cached_property()}.

@item 
gh-97786@footnote{https://github.com/python/cpython/issues/97786}: Fix potential undefined behaviour in corner cases of
floating-point-to-time conversions.

@item 
gh-101517@footnote{https://github.com/python/cpython/issues/101517}: Fixed bug where @ref{10,,bdb} looks up the source line with
@ref{89,,linecache} with a @code{lineno=None}, which causes it to fail with an
unhandled exception.

@item 
gh-101773@footnote{https://github.com/python/cpython/issues/101773}: Optimize @ref{215,,fractions.Fraction} for small components. The
private argument @code{_normalize} of the @code{fractions.Fraction}
constructor has been removed.

@item 
gh-101693@footnote{https://github.com/python/cpython/issues/101693}: In @ref{5b0,,sqlite3.Cursor.execute()}, @ref{1a4,,DeprecationWarning} is
now emitted when @ref{5b2,,named placeholders} are used
together with parameters supplied as a @ref{717,,sequence} instead of as a
@ref{184,,dict}. Starting from Python 3.14, using named placeholders with
parameters supplied as a sequence will raise a
@ref{307,,ProgrammingError}. Patch by Erlend E. Aasland.

@item 
gh-101446@footnote{https://github.com/python/cpython/issues/101446}: Change repr of @ref{7f4,,collections.OrderedDict} to use regular
dictionary formatting instead of pairs of keys and values.

@item 
gh-101362@footnote{https://github.com/python/cpython/issues/101362}: Speed up @ref{6ce,,pathlib.PurePath} construction by handling
arguments more uniformly. When a @ref{268,,pathlib.Path} argument is
supplied, we use its string representation rather than joining its parts
with @ref{19eb,,os.path.join()}.

@item 
gh-101362@footnote{https://github.com/python/cpython/issues/101362}: Speed up @ref{6ce,,pathlib.PurePath} construction by calling
@ref{19eb,,os.path.join()} only when two or more arguments are given.

@item 
gh-101362@footnote{https://github.com/python/cpython/issues/101362}: Speed up @ref{268,,pathlib.Path} construction by running the path
flavour compatibility check only when pathlib is imported.

@item 
gh-85984@footnote{https://github.com/python/cpython/issues/85984}: Refactored the implementation of @ref{1b0f,,pty.fork()} to use
@ref{1b10,,os.login_tty()}.

A @ref{1a4,,DeprecationWarning} is now raised by @code{pty.master_open()} and
@code{pty.slave_open()}. They were undocumented and deprecated long long ago
in the docstring in favor of @ref{303,,pty.openpty()}.

@item 
gh-101561@footnote{https://github.com/python/cpython/issues/101561}: Add a new decorator @ref{67d,,typing.override()}. See 
@geindex Python Enhancement Proposals; PEP 698
PEP 698@footnote{https://peps.python.org/pep-0698/} for
details. Patch by Steven Troxler.

@item 
gh-63301@footnote{https://github.com/python/cpython/issues/63301}: Set exit code when @ref{e3,,tabnanny} CLI exits on error.

@item 
gh-101360@footnote{https://github.com/python/cpython/issues/101360}: Fix anchor matching in @code{pathlib.PureWindowsPath.match()}.
Path and pattern anchors are now matched with @ref{60,,fnmatch}, just like
other path parts. This allows patterns such as @code{"*:/Users/*"} to be
matched.

@item 
gh-101277@footnote{https://github.com/python/cpython/issues/101277}: Remove global state from @ref{85,,itertools} module (
@geindex Python Enhancement Proposals; PEP 687
PEP 687@footnote{https://peps.python.org/pep-0687/}).
Patches by Erlend E. Aasland.

@item 
gh-100809@footnote{https://github.com/python/cpython/issues/100809}: Fix handling of drive-relative paths (like ‘C:’ and ‘C:foo’) in
@ref{1a6d,,pathlib.Path.absolute()}. This method now uses the OS API to retrieve
the correct current working directory for the drive.

@item 
gh-99138@footnote{https://github.com/python/cpython/issues/99138}: Apply 
@geindex Python Enhancement Proposals; PEP 687
PEP 687@footnote{https://peps.python.org/pep-0687/} to @ref{13b,,zoneinfo}. Patch by Erlend E. Aasland.

@item 
gh-96764@footnote{https://github.com/python/cpython/issues/96764}: @ref{816,,asyncio.wait_for()} now uses @ref{815,,asyncio.timeout()} as its
underlying implementation. Patch by Kumar Aditya.

@item 
gh-88233@footnote{https://github.com/python/cpython/issues/88233}: Correctly preserve “extra” fields in @code{zipfile} regardless of
their ordering relative to a zip64 “extra.”

@item 
bpo-23224@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23224}: Fix segfaults when creating @ref{178e,,lzma.LZMADecompressor} and
@ref{176f,,bz2.BZ2Decompressor} objects without calling @code{__init__()}, and
fix leakage of locks and internal buffers when calling the @code{__init__()}
methods of @code{lzma.LZMADecompressor}, @ref{1b11,,lzma.LZMACompressor},
@ref{1b12,,bz2.BZ2Compressor}, and @code{bz2.BZ2Decompressor} objects
multiple times.
@end itemize

@node Documentation<26>,Tests<26>,Library<74>,Python 3 12 0 alpha 6
@anchor{whatsnew/changelog id346}@anchor{1b13}
@subsubsection Documentation



@itemize -

@item 
gh-85417@footnote{https://github.com/python/cpython/issues/85417}: Update @ref{19,,cmath} documentation to clarify behaviour on branch
cuts.

@item 
gh-97725@footnote{https://github.com/python/cpython/issues/97725}: Fix @ref{1b14,,asyncio.Task.print_stack()} description for
@code{file=None}. Patch by Oleg Iarygin.
@end itemize

@node Tests<26>,Build<30>,Documentation<26>,Python 3 12 0 alpha 6
@anchor{whatsnew/changelog id347}@anchor{1b15}
@subsubsection Tests



@itemize -

@item 
gh-102019@footnote{https://github.com/python/cpython/issues/102019}: Fix deadlock on shutdown if @code{test_current_@{exception,frames@}}
fails. Patch by Jacob Bower.

@item 
gh-85984@footnote{https://github.com/python/cpython/issues/85984}: Utilize new “winsize” functions from termios in pty tests.

@item 
gh-89792@footnote{https://github.com/python/cpython/issues/89792}: @code{test_tools} now copies up to 10x less source data to a
temporary directory during the @code{freeze} test by ignoring git metadata
and other artifacts.  It also limits its python build parallelism based on
os.cpu_count instead of hard coding it as 8 cores.
@end itemize

@node Build<30>,Windows<26>,Tests<26>,Python 3 12 0 alpha 6
@anchor{whatsnew/changelog id348}@anchor{1b16}
@subsubsection Build



@itemize -

@item 
gh-99942@footnote{https://github.com/python/cpython/issues/99942}: On Android, in a static build, python-config in embed mode no
longer incorrectly reports a library to link to.

@item 
gh-99942@footnote{https://github.com/python/cpython/issues/99942}: On Android, python.pc now correctly reports the library to link
to, the same as python-config.sh.

@item 
gh-100221@footnote{https://github.com/python/cpython/issues/100221}: Fix creating install directories in @code{make sharedinstall} if
they exist outside @code{DESTDIR} already.

@item 
gh-96821@footnote{https://github.com/python/cpython/issues/96821}: Explicitly mark C extension modules that need defined signed
integer overflow, and add a configure option
@ref{1b17,,--with-strict-overflow}. Patch by Matthias Görgens and Shantanu
Jain.
@end itemize

@node Windows<26>,macOS<19>,Build<30>,Python 3 12 0 alpha 6
@anchor{whatsnew/changelog id349}@anchor{1b18}
@subsubsection Windows



@itemize -

@item 
gh-102344@footnote{https://github.com/python/cpython/issues/102344}: Implement @code{winreg.QueryValue} using @code{QueryValueEx} and
@code{winreg.SetValue} using @code{SetValueEx}. Patch by Max Bachmann.

@item 
gh-101881@footnote{https://github.com/python/cpython/issues/101881}: Handle read and write operations on non-blocking pipes properly
on Windows.

@item 
gh-101881@footnote{https://github.com/python/cpython/issues/101881}: Add support for the os.get_blocking() and os.set_blocking()
functions on Windows.

@item 
gh-101849@footnote{https://github.com/python/cpython/issues/101849}: Ensures installer will correctly upgrade existing @code{py.exe}
launcher installs.

@item 
gh-101763@footnote{https://github.com/python/cpython/issues/101763}: Updates copy of libffi bundled with Windows installs to 3.4.4.

@item 
gh-101759@footnote{https://github.com/python/cpython/issues/101759}: Update Windows installer to SQLite 3.40.1.

@item 
gh-101614@footnote{https://github.com/python/cpython/issues/101614}: Correctly handle extensions built against debug binaries that
reference @code{python3_d.dll}.

@item 
gh-101196@footnote{https://github.com/python/cpython/issues/101196}: The functions @code{os.path.isdir}, @code{os.path.isfile},
@code{os.path.islink} and @code{os.path.exists} are now 13% to 28% faster on
Windows, by making fewer Win32 API calls.
@end itemize

@node macOS<19>,C API<28>,Windows<26>,Python 3 12 0 alpha 6
@anchor{whatsnew/changelog id350}@anchor{1b19}
@subsubsection macOS



@itemize -

@item 
gh-101759@footnote{https://github.com/python/cpython/issues/101759}: Update macOS installer to SQLite 3.40.1.
@end itemize

@node C API<28>,,macOS<19>,Python 3 12 0 alpha 6
@anchor{whatsnew/changelog id351}@anchor{1b1a}
@subsubsection C API



@itemize -

@item 
gh-101907@footnote{https://github.com/python/cpython/issues/101907}: Removes use of non-standard C++ extension in public header
files.

@item 
gh-99293@footnote{https://github.com/python/cpython/issues/99293}: Document that the Py_TPFLAGS_VALID_VERSION_TAG is an internal
feature, should not be used, and will be removed.

@item 
gh-101578@footnote{https://github.com/python/cpython/issues/101578}: Add @ref{427,,PyErr_GetRaisedException()} and
@ref{42a,,PyErr_SetRaisedException()} for saving and restoring the current
exception. These functions return and accept a single exception object,
rather than the triple arguments of the now-deprecated
@ref{426,,PyErr_Fetch()} and @ref{429,,PyErr_Restore()}. This is less error
prone and a bit more efficient.

Add @ref{78c,,PyException_GetArgs()} and @ref{78d,,PyException_SetArgs()} as
convenience functions for retrieving and modifying the
@ref{78e,,args} passed to the exception’s constructor.

@item 
gh-91744@footnote{https://github.com/python/cpython/issues/91744}: Introduced the `Unstable C API tier', marking APi that is
allowed to change in minor releases without a deprecation period. See
@geindex Python Enhancement Proposals; PEP 689
PEP 689@footnote{https://peps.python.org/pep-0689/} for details.
@end itemize

@node Python 3 12 0 alpha 5,Python 3 12 0 alpha 4,Python 3 12 0 alpha 6,Changelog
@anchor{whatsnew/changelog python-3-12-0-alpha-5}@anchor{1b1b}
@subsection Python 3.12.0 alpha 5


`Release date: 2023-02-07'

@menu
* Security: Security<28>. 
* Core and Builtins: Core and Builtins<70>. 
* Library: Library<75>. 
* Documentation: Documentation<27>. 
* Tests: Tests<27>. 
* Build: Build<31>. 
* Windows: Windows<27>. 

@end menu

@node Security<28>,Core and Builtins<70>,,Python 3 12 0 alpha 5
@anchor{whatsnew/changelog id352}@anchor{1b1c}
@subsubsection Security



@itemize -

@item 
gh-99108@footnote{https://github.com/python/cpython/issues/99108}: Replace the builtin @ref{6c,,hashlib} implementations of SHA2-224
and SHA2-256 originally from LibTomCrypt with formally verified,
side-channel resistant code from the HACL*@footnote{https://github.com/hacl-star/hacl-star/} project. The builtins remain a
fallback only used when OpenSSL does not provide them.
@end itemize

@node Core and Builtins<70>,Library<75>,Security<28>,Python 3 12 0 alpha 5
@anchor{whatsnew/changelog id354}@anchor{1b1d}
@subsubsection Core and Builtins



@itemize -

@item 
gh-92173@footnote{https://github.com/python/cpython/issues/92173}: Fix the @code{defs} and @code{kwdefs} arguments to
@ref{1b1e,,PyEval_EvalCodeEx()} and a reference leak in that function.

@item 
gh-59956@footnote{https://github.com/python/cpython/issues/59956}: The GILState API is now partially compatible with
subinterpreters. Previously, @code{PyThreadState_GET()} and
@code{PyGILState_GetThisThreadState()} would get out of sync, causing
inconsistent behavior and crashes.

@item 
gh-101400@footnote{https://github.com/python/cpython/issues/101400}: Fix wrong lineno in exception message on @ref{181,,continue} or
@ref{180,,break} which are not in a loop. Patch by Donghee Na.

@item 
gh-101372@footnote{https://github.com/python/cpython/issues/101372}: Fix @ref{c42,,is_normalized()} to properly handle the
UCD 3.2.0 cases. Patch by Donghee Na.

@item 
gh-101266@footnote{https://github.com/python/cpython/issues/101266}: Fix @ref{1b1f,,sys.getsizeof()} reporting for @ref{19c,,int}
subclasses.

@item 
gh-101291@footnote{https://github.com/python/cpython/issues/101291}: Refactor the @code{PyLongObject} struct into a normal Python
object header and a @code{PyLongValue} struct.

@item 
gh-101046@footnote{https://github.com/python/cpython/issues/101046}: Fix a possible memory leak in the parser when raising
@ref{1761,,MemoryError}. Patch by Pablo Galindo

@item 
gh-101037@footnote{https://github.com/python/cpython/issues/101037}: Fix potential memory underallocation issue for instances of
@ref{19c,,int} subclasses with value zero.

@item 
gh-100762@footnote{https://github.com/python/cpython/issues/100762}: Record the (virtual) exception block depth in the oparg of
@ref{5ba,,YIELD_VALUE}. Use this to avoid the expensive @code{throw()} when
closing generators (and coroutines) that can be closed trivially.

@item 
gh-100982@footnote{https://github.com/python/cpython/issues/100982}: Adds a new @code{COMPARE_AND_BRANCH} instruction. This is a
bit more efficient when performing a comparison immediately followed by a
branch, and restores the design intent of PEP 659 that specializations are
local to a single instruction.

@item 
gh-100942@footnote{https://github.com/python/cpython/issues/100942}: Fixed segfault in property.getter/setter/deleter that occurred
when a property subclass overrode the @code{__new__} method to return a
non-property instance.

@item 
gh-100923@footnote{https://github.com/python/cpython/issues/100923}: Remove the @code{mask} cache entry for the @ref{b67,,COMPARE_OP}
instruction and embed the mask into the oparg.

@item 
gh-100892@footnote{https://github.com/python/cpython/issues/100892}: Fix race while iterating over thread states in clearing
@ref{18a8,,threading.local}. Patch by Kumar Aditya.

@item 
gh-91351@footnote{https://github.com/python/cpython/issues/91351}: Fix a case where re-entrant imports could corrupt the import
deadlock detection code and cause a @ref{5e7,,KeyError} to be raised out of
@code{importlib/_bootstrap}.  In addition to the straightforward cases,
this could also happen when garbage collection leads to a warning being
emitted – as happens when it collects an open socket or file)

@item 
gh-100726@footnote{https://github.com/python/cpython/issues/100726}: Optimize construction of @code{range} object for medium size
integers.

@item 
gh-100712@footnote{https://github.com/python/cpython/issues/100712}: Added option to build cpython with specialization disabled, by
setting @code{ENABLE_SPECIALIZATION=False} in @code{opcode}, followed by
@code{make regen-all}.
@end itemize

@node Library<75>,Documentation<27>,Core and Builtins<70>,Python 3 12 0 alpha 5
@anchor{whatsnew/changelog id355}@anchor{1b20}
@subsubsection Library



@itemize -

@item 
bpo-32780@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32780}: Inter-field padding is now inserted into the PEP3118 format
strings obtained from @ref{1e7,,ctypes.Structure} objects, reflecting their
true representation in memory.

@item 
gh-101541@footnote{https://github.com/python/cpython/issues/101541}: [Enum] - fix psuedo-flag creation

@item 
gh-101570@footnote{https://github.com/python/cpython/issues/101570}: Upgrade pip wheel bundled with ensurepip (pip 23.0)

@item 
gh-101323@footnote{https://github.com/python/cpython/issues/101323}: Fix a bug where errors where not thrown by
zlib._ZlibDecompressor if encountered during decompressing.

@item 
gh-101317@footnote{https://github.com/python/cpython/issues/101317}: Add `ssl_shutdown_timeout' parameter for
@ref{81a,,asyncio.StreamWriter.start_tls()}.

@item 
gh-101326@footnote{https://github.com/python/cpython/issues/101326}: Fix regression when passing @code{None} as second or third
argument to @code{FutureIter.throw}.

@item 
gh-92123@footnote{https://github.com/python/cpython/issues/92123}: Adapt the @code{_elementtree} extension module to multi-phase init
(
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}). Patches by Erlend E. Aasland.

@item 
gh-100795@footnote{https://github.com/python/cpython/issues/100795}: Avoid potential unexpected @code{freeaddrinfo} call (double free)
in @ref{d1,,socket} when when a libc @code{getaddrinfo()} implementation leaves
garbage in an output pointer when returning an error. Original patch by
Sergey G. Brester.

@item 
gh-101143@footnote{https://github.com/python/cpython/issues/101143}: Remove unused references to @ref{1b21,,TimerHandle} in
@code{asyncio.base_events.BaseEventLoop._add_callback}.

@item 
gh-101144@footnote{https://github.com/python/cpython/issues/101144}: Make @ref{194c,,zipfile.Path.open()} and
@ref{1b22,,zipfile.Path.read_text()} also accept @code{encoding} as a positional
argument. This was the behavior in Python 3.9 and earlier.  3.10
introduced a regression where supplying it as a positional argument would
lead to a @ref{199,,TypeError}.

@item 
gh-94518@footnote{https://github.com/python/cpython/issues/94518}: Group-related variables of @code{_posixsubprocess} module are
renamed to stress that supplementary group affinity is added to a fork,
not replace the inherited ones. Patch by Oleg Iarygin.

@item 
gh-101015@footnote{https://github.com/python/cpython/issues/101015}: Fix @ref{8c2,,typing.get_type_hints()} on @code{'*tuple[...]'} and
@code{*tuple[...]}. It must not drop the @code{Unpack} part.

@item 
gh-101000@footnote{https://github.com/python/cpython/issues/101000}: Add @ref{6cc,,os.path.splitroot()}, which splits a path into a
3-item tuple @code{(drive, root, tail)}. This new function is used by
@ref{a8,,pathlib} to improve the performance of path construction by up to a
third.

@item 
gh-100573@footnote{https://github.com/python/cpython/issues/100573}: Fix a Windows @ref{b,,asyncio} bug with named pipes where a
client doing @code{os.stat()} on the pipe would cause an error in the server
that disabled serving future requests.

@item 
gh-39615@footnote{https://github.com/python/cpython/issues/39615}: @ref{1725,,warnings.warn()} now has the ability to skip stack frames
based on code filename prefix rather than only a numeric @code{stacklevel}
via the new @code{skip_file_prefixes} keyword argument.

@item 
gh-100750@footnote{https://github.com/python/cpython/issues/100750}: pass encoding kwarg to subprocess in platform

@item 
gh-100160@footnote{https://github.com/python/cpython/issues/100160}: Emit a deprecation warning in
@code{asyncio.DefaultEventLoopPolicy.get_event_loop()} if there is no
current event loop set and it decides to create one.

@item 
gh-96290@footnote{https://github.com/python/cpython/issues/96290}: Fix handling of partial and invalid UNC drives in
@code{ntpath.splitdrive()}, and in @code{ntpath.normpath()} on non-Windows
systems. Paths such as ‘\server’ and ‘\’ are now considered by
@code{splitdrive()} to contain only a drive, and consequently are not
modified by @code{normpath()} on non-Windows systems. The behaviour of
@code{normpath()} on Windows systems is unaffected, as native OS APIs are
used. Patch by Eryk Sun, with contributions by Barney Gale.

@item 
gh-99952@footnote{https://github.com/python/cpython/issues/99952}: Fix a reference undercounting issue in @ref{1e7,,ctypes.Structure}
with @code{from_param()} results larger than a C pointer.

@item 
gh-67790@footnote{https://github.com/python/cpython/issues/67790}: Add float-style formatting support for
@ref{215,,fractions.Fraction} instances.

@item 
gh-99266@footnote{https://github.com/python/cpython/issues/99266}: Preserve more detailed error messages in @ref{2e,,ctypes}.

@item 
gh-86682@footnote{https://github.com/python/cpython/issues/86682}: Ensure runtime-created collections have the correct module name
using the newly added (internal) @ref{1b23,,sys._getframemodulename()}.

@item 
gh-88597@footnote{https://github.com/python/cpython/issues/88597}: @ref{117,,uuid} now has a command line interface. Try @code{python -m
uuid -h}.

@item 
gh-60580@footnote{https://github.com/python/cpython/issues/60580}: @code{ctypes.wintypes.BYTE} definition changed from
@ref{1b24,,c_byte} to @ref{1b25,,c_ubyte} to match Windows SDK.
Patch by Anatoly Techtonik and Oleg Iarygin.

@item 
gh-94518@footnote{https://github.com/python/cpython/issues/94518}: @code{_posixsubprocess} now initializes all UID and GID variables
using a reserved @code{-1} value instead of a separate flag. Patch by Oleg
Iarygin.

@item 
bpo-38941@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38941}: The @ref{12c,,xml.etree.ElementTree} module now emits
@ref{1a4,,DeprecationWarning} when testing the truth value of an
@ref{361,,xml.etree.ElementTree.Element}. Before, the Python implementation
emitted @ref{659,,FutureWarning}, and the C implementation emitted nothing.

@item 
bpo-40077@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40077}: Convert @code{elementtree} types to heap types. Patch by Erlend
E. Aasland.

@item 
bpo-29847@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29847}: Fix a bug where @ref{268,,pathlib.Path} accepted and ignored
keyword arguments. Patch provided by Yurii Karabas.

@item 
gh-77772@footnote{https://github.com/python/cpython/issues/77772}: @ref{be2,,ctypes.CDLL}, @ref{1b26,,ctypes.OleDLL},
@ref{1b27,,ctypes.WinDLL}, and @ref{1b28,,ctypes.PyDLL} now accept
@ref{5a1,,path-like objects} as their @code{name} argument.
Patch by Robert Hoelzl.
@end itemize

@node Documentation<27>,Tests<27>,Library<75>,Python 3 12 0 alpha 5
@anchor{whatsnew/changelog id356}@anchor{1b29}
@subsubsection Documentation



@itemize -

@item 
gh-88324@footnote{https://github.com/python/cpython/issues/88324}: Reword @ref{dc,,subprocess} to emphasize default behavior of
`stdin', `stdout', and `stderr' arguments. Remove inaccurate statement
about child file handle inheritance.
@end itemize

@node Tests<27>,Build<31>,Documentation<27>,Python 3 12 0 alpha 5
@anchor{whatsnew/changelog id357}@anchor{1b2a}
@subsubsection Tests



@itemize -

@item 
gh-101334@footnote{https://github.com/python/cpython/issues/101334}: @code{test_tarfile} has been updated to pass when run as a high
UID.
@end itemize

@node Build<31>,Windows<27>,Tests<27>,Python 3 12 0 alpha 5
@anchor{whatsnew/changelog id358}@anchor{1b2b}
@subsubsection Build



@itemize -

@item 
gh-101282@footnote{https://github.com/python/cpython/issues/101282}: Update BOLT configuration not to use deprecated usage of
@code{--split functions}. Patch by Donghee Na.

@item 
gh-101522@footnote{https://github.com/python/cpython/issues/101522}: Allow overriding Windows dependencies versions and paths using
MSBuild properties.

@item 
gh-77532@footnote{https://github.com/python/cpython/issues/77532}: Minor fixes to allow building with @code{PlatformToolset=ClangCL}
on Windows.

@item 
gh-101152@footnote{https://github.com/python/cpython/issues/101152}: In accordance with 
@geindex Python Enhancement Proposals; PEP 699
PEP 699@footnote{https://peps.python.org/pep-0699/}, the @code{ma_version_tag} field in
@ref{64f,,PyDictObject} is deprecated for extension modules. Accessing this
field will generate a compiler warning at compile time. This field will be
removed in Python 3.14.

@item 
gh-100340@footnote{https://github.com/python/cpython/issues/100340}: Allows -Wno-int-conversion for wasm-sdk 17 and onwards, thus
enables building WASI builds once against the latest sdk.

@item 
gh-101060@footnote{https://github.com/python/cpython/issues/101060}: Conditionally add @code{-fno-reorder-blocks-and-partition} in
configure. Effectively fixes @code{--enable-bolt} when using Clang, as this
appears to be a GCC-only flag.

@item 
gh-98705@footnote{https://github.com/python/cpython/issues/98705}: @code{__bool__} is defined in AIX system header files which breaks
the build in AIX, so undefine it.

@item 
gh-98636@footnote{https://github.com/python/cpython/issues/98636}: Fix a regression in detecting @code{gdbm_compat} library for the
@code{_gdbm} module build.

@item 
gh-96305@footnote{https://github.com/python/cpython/issues/96305}: @code{_aix_support} now uses a simple code to get platform details
rather than the now non-existent @code{_bootsubprocess} during bootstrap.
@end itemize

@node Windows<27>,,Build<31>,Python 3 12 0 alpha 5
@anchor{whatsnew/changelog id359}@anchor{1b2c}
@subsubsection Windows



@itemize -

@item 
gh-101543@footnote{https://github.com/python/cpython/issues/101543}: Ensure the install path in the registry is only used when the
standard library hasn’t been located in any other way.

@item 
gh-101467@footnote{https://github.com/python/cpython/issues/101467}: The @code{py.exe} launcher now correctly filters when only a
single runtime is installed. It also correctly handles prefix matches on
tags so that @code{-3.1} does not match @code{3.11}, but would still match
@code{3.1-32}.

@item 
gh-99834@footnote{https://github.com/python/cpython/issues/99834}: Updates bundled copy of Tcl/Tk to 8.6.13.0

@item 
gh-101135@footnote{https://github.com/python/cpython/issues/101135}: Restore ability to launch older 32-bit versions from the
@code{py.exe} launcher when both 32-bit and 64-bit installs of the same
version are available.

@item 
gh-82052@footnote{https://github.com/python/cpython/issues/82052}: Fixed an issue where writing more than 32K of Unicode output to
the console screen in one go can result in mojibake.

@item 
gh-100320@footnote{https://github.com/python/cpython/issues/100320}: Ensures the @code{PythonPath} registry key from an install is used
when launching from a different copy of Python that relies on an existing
install to provide a copy of its modules and standard library.

@item 
gh-100247@footnote{https://github.com/python/cpython/issues/100247}: Restores support for the @code{py.exe} launcher finding
shebang commands in its configuration file using the full command name.
@end itemize

@node Python 3 12 0 alpha 4,Python 3 12 0 alpha 3,Python 3 12 0 alpha 5,Changelog
@anchor{whatsnew/changelog python-3-12-0-alpha-4}@anchor{1b2d}
@subsection Python 3.12.0 alpha 4


`Release date: 2023-01-10'

@menu
* Core and Builtins: Core and Builtins<71>. 
* Library: Library<76>. 
* Core and Builtins: Core and Builtins<72>. 
* Library: Library<77>. 
* Core and Builtins: Core and Builtins<73>. 
* Library: Library<78>. 
* Documentation: Documentation<28>. 
* Tests: Tests<28>. 
* Build: Build<32>. 
* Windows: Windows<28>. 
* macOS: macOS<20>. 
* Tools/Demos: Tools/Demos<22>. 
* C API: C API<29>. 

@end menu

@node Core and Builtins<71>,Library<76>,,Python 3 12 0 alpha 4
@anchor{whatsnew/changelog id360}@anchor{1b2e}
@subsubsection Core and Builtins



@itemize -

@item 
gh-100776@footnote{https://github.com/python/cpython/issues/100776}: Fix misleading default value in @ref{14e4,,input()}’s
@code{__text_signature__}.

@item 
gh-99005@footnote{https://github.com/python/cpython/issues/99005}: Remove @code{UNARY_POSITIVE}, @code{ASYNC_GEN_WRAP} and
@code{LIST_TO_TUPLE}, replacing them with intrinsics.

@item 
gh-99005@footnote{https://github.com/python/cpython/issues/99005}: Add new @ref{708,,CALL_INTRINSIC_1} instruction. Remove
@code{IMPORT_STAR}, @code{PRINT_EXPR} and
@code{STOPITERATION_ERROR}, replacing them with the
@code{CALL_INTRINSIC_1} instruction.

@item 
gh-100288@footnote{https://github.com/python/cpython/issues/100288}: Remove the LOAD_ATTR_METHOD_WITH_DICT specialized instruction.
Stats show it is not useful.

@item 
gh-100720@footnote{https://github.com/python/cpython/issues/100720}: Added @code{_PyFrame_NumSlotsForCodeObject}, which returns the
number of slots needed in a frame for a given code object.

@item 
gh-100719@footnote{https://github.com/python/cpython/issues/100719}: Removed the co_nplaincellvars field from the code object, as it
is redundant.

@item 
gh-100637@footnote{https://github.com/python/cpython/issues/100637}: Fix @code{int.__sizeof__()} calculation to include the 1-element
@code{ob_digit} array for @code{0} and @code{False}.

@item 
gh-100649@footnote{https://github.com/python/cpython/issues/100649}: Update the native_thread_id field of PyThreadState after fork.

@item 
gh-100126@footnote{https://github.com/python/cpython/issues/100126}: Fix an issue where “incomplete” frames could be briefly visible
to C code while other frames are being torn down, possibly resulting in
corruption or hard crashes of the interpreter while running finalizers.

@item 
gh-87447@footnote{https://github.com/python/cpython/issues/87447}: Fix @ref{18f,,SyntaxError} on comprehension rebind checking with
names that are not actually redefined.

Now reassigning @code{b} in @code{[(b := 1) for a, b.prop in some_iter]} is
allowed. Reassigning @code{a} is still disallowed as per 
@geindex Python Enhancement Proposals; PEP 572
PEP 572@footnote{https://peps.python.org/pep-0572/}.

@item 
gh-100268@footnote{https://github.com/python/cpython/issues/100268}: Add @ref{1b2f,,int.is_integer()} to improve duck type compatibility
between @ref{19c,,int} and @ref{197,,float}.

@item 
gh-100425@footnote{https://github.com/python/cpython/issues/100425}: Improve the accuracy of @code{sum()} with compensated summation.
@end itemize

@node Library<76>,Core and Builtins<72>,Core and Builtins<71>,Python 3 12 0 alpha 4
@anchor{whatsnew/changelog id361}@anchor{1b30}
@subsubsection Library



@itemize -

@item 
gh-100374@footnote{https://github.com/python/cpython/issues/100374}: Fix incorrect result and delay in @ref{1b31,,socket.getfqdn()}. Patch
by Dominic Socular.
@end itemize

@node Core and Builtins<72>,Library<77>,Library<76>,Python 3 12 0 alpha 4
@anchor{whatsnew/changelog id362}@anchor{1b32}
@subsubsection Core and Builtins



@itemize -

@item 
gh-100357@footnote{https://github.com/python/cpython/issues/100357}: Convert @code{vars}, @code{dir}, @code{next}, @code{getattr}, and @code{iter}
to argument clinic.

@item 
gh-100117@footnote{https://github.com/python/cpython/issues/100117}: Improve the output of @ref{34e,,codeobject.co_lines()} by emitting
only one entry for each line range.

@item 
gh-90043@footnote{https://github.com/python/cpython/issues/90043}: Handle NaNs when specializing @ref{b67,,COMPARE_OP} for
@ref{197,,float} values.

@item 
gh-100222@footnote{https://github.com/python/cpython/issues/100222}: Redefine the @code{_Py_CODEUNIT} typedef as a union to describe
its layout to the C compiler, avoiding type punning and improving clarity.

@item 
gh-99955@footnote{https://github.com/python/cpython/issues/99955}: Internal compiler functions (in compile.c) now consistently
return -1 on error and 0 on success.

@item 
gh-100188@footnote{https://github.com/python/cpython/issues/100188}: The @code{BINARY_SUBSCR_LIST_INT} and @code{BINARY_SUBSCR_TUPLE_INT}
instructions are no longer used for negative integers because those
instructions always miss when encountering negative integers.

@item 
gh-99110@footnote{https://github.com/python/cpython/issues/99110}: Initialize frame->previous in frameobject.c to fix a
segmentation fault when accessing frames created by @ref{1b33,,PyFrame_New()}.

@item 
gh-94155@footnote{https://github.com/python/cpython/issues/94155}: Improved the hashing algorithm for code objects, mitigating some
hash collisions.

@item 
gh-99540@footnote{https://github.com/python/cpython/issues/99540}: @code{None} now hashes to a constant value. This is not a
requirements change.

@item 
gh-100143@footnote{https://github.com/python/cpython/issues/100143}: When built with @code{--enable-pystats}, stats collection is now
off by default. To enable it early at startup, pass the @code{-Xpystats}
flag.  Stats are now always dumped, even if switched off.

@item 
gh-100146@footnote{https://github.com/python/cpython/issues/100146}: Improve @code{BUILD_LIST} opcode so that it works similarly to the
@code{BUILD_TUPLE} opcode, by stealing references from the stack rather than
repeatedly using stack operations to set list elements.  Implementation
details are in a new private API @code{_PyList_FromArraySteal()}.

@item 
gh-100110@footnote{https://github.com/python/cpython/issues/100110}: Specialize @code{FOR_ITER} for tuples.

@item 
gh-100050@footnote{https://github.com/python/cpython/issues/100050}: Honor existing errors obtained when searching for mismatching
parentheses in the tokenizer. Patch by Pablo Galindo

@item 
gh-92216@footnote{https://github.com/python/cpython/issues/92216}: Improve the performance of @ref{6fa,,hasattr()} for type objects with
a missing attribute.

@item 
gh-99582@footnote{https://github.com/python/cpython/issues/99582}: Freeze @ref{139,,zipimport} module into @code{_bootstrap_python}.

@item 
gh-99554@footnote{https://github.com/python/cpython/issues/99554}: Pack debugging location tables more efficiently during bytecode
compilation.

@item 
gh-98522@footnote{https://github.com/python/cpython/issues/98522}: Add an internal version number to code objects, to give better
versioning of inner functions and comprehensions, and thus better
specialization of those functions. This change is invisible to both Python
and C extensions.

@item 
gh-94603@footnote{https://github.com/python/cpython/issues/94603}: Improve performance of @code{list.pop} for small lists.
@end itemize

@node Library<77>,Core and Builtins<73>,Core and Builtins<72>,Python 3 12 0 alpha 4
@anchor{whatsnew/changelog id363}@anchor{1b34}
@subsubsection Library



@itemize -

@item 
gh-89051@footnote{https://github.com/python/cpython/issues/89051}: Add @ref{1b35,,ssl.OP_LEGACY_SERVER_CONNECT}
@end itemize

@node Core and Builtins<73>,Library<78>,Library<77>,Python 3 12 0 alpha 4
@anchor{whatsnew/changelog id364}@anchor{1b36}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-32782@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32782}: @code{ctypes} arrays of length 0 now report a correct itemsize
when a @code{memoryview} is constructed from them, rather than always giving
a value of 0.
@end itemize

@node Library<78>,Documentation<28>,Core and Builtins<73>,Python 3 12 0 alpha 4
@anchor{whatsnew/changelog id365}@anchor{1b37}
@subsubsection Library



@itemize -

@item 
gh-100833@footnote{https://github.com/python/cpython/issues/100833}: Speed up @ref{15e0,,math.fsum()} by removing defensive @code{volatile}
qualifiers.

@item 
gh-100805@footnote{https://github.com/python/cpython/issues/100805}: Modify @ref{143c,,random.choice()} implementation to once again work
with NumPy arrays.

@item 
gh-100813@footnote{https://github.com/python/cpython/issues/100813}: Add @code{socket.IP_PKTINFO} constant.

@item 
gh-100792@footnote{https://github.com/python/cpython/issues/100792}: Make @ref{1b38,,email.message.Message.__contains__()} twice as fast.

@item 
gh-91851@footnote{https://github.com/python/cpython/issues/91851}: Microoptimizations for @ref{1b39,,fractions.Fraction.__round__()},
@ref{1b3a,,fractions.Fraction.__ceil__()} and
@ref{1b3b,,fractions.Fraction.__floor__()}.

@item 
gh-90104@footnote{https://github.com/python/cpython/issues/90104}: Avoid RecursionError on @code{repr} if a dataclass field definition
has a cyclic reference.

@item 
gh-100689@footnote{https://github.com/python/cpython/issues/100689}: Fix crash in @code{pyexpat} by statically allocating
@code{PyExpat_CAPI} capsule.

@item 
gh-100740@footnote{https://github.com/python/cpython/issues/100740}: Fix @code{unittest.mock.Mock} not respecting the spec for
attribute names prefixed with @code{assert}.

@item 
gh-91219@footnote{https://github.com/python/cpython/issues/91219}: Change @code{SimpleHTTPRequestHandler} to support subclassing to
provide a different set of index file names instead of using @code{__init__}
parameters.

@item 
gh-100690@footnote{https://github.com/python/cpython/issues/100690}: @code{Mock} objects which are not unsafe will now raise an
@code{AttributeError} when accessing an attribute that matches the name of an
assertion but without the prefix @code{assert_}, e.g. accessing
@code{called_once} instead of @code{assert_called_once}. This is in addition to
this already happening for accessing attributes with prefixes @code{assert},
@code{assret}, @code{asert}, @code{aseert}, and @code{assrt}.

@item 
gh-89727@footnote{https://github.com/python/cpython/issues/89727}: Simplify and optimize @ref{6d1,,os.walk()} by using
@ref{2af,,isinstance()} checks to check the top of the stack.

@item 
gh-100485@footnote{https://github.com/python/cpython/issues/100485}: Add math.sumprod() to compute the sum of products.

@item 
gh-86508@footnote{https://github.com/python/cpython/issues/86508}: Fix @ref{d14,,asyncio.open_connection()} to skip binding to local
addresses of different family. Patch by Kumar Aditya.

@item 
gh-97930@footnote{https://github.com/python/cpython/issues/97930}: @code{importlib.resources.files} now accepts a module as an anchor
instead of only accepting packages. If a module is passed, resources are
resolved adjacent to that module (in the same package or at the package
root). The parameter was renamed from @code{package} to @code{anchor} with a
compatibility shim for those passing by keyword. Additionally, the new
@code{anchor} parameter is now optional and will default to the caller’s
module.

@item 
gh-100585@footnote{https://github.com/python/cpython/issues/100585}: Fixed a bug where importlib.resources.as_file was leaving file
pointers open

@item 
gh-100562@footnote{https://github.com/python/cpython/issues/100562}: Improve performance of @ref{1a6d,,pathlib.Path.absolute()} by nearly
2x. This comes at the cost of a performance regression in
@ref{1ae1,,pathlib.Path.cwd()}, which is generally used less frequently in user
code.

@item 
gh-100519@footnote{https://github.com/python/cpython/issues/100519}: Small simplification of @code{http.cookiejar.eff_request_host()}
that improves readability and better matches the RFC wording.

@item 
gh-100287@footnote{https://github.com/python/cpython/issues/100287}: Fix the interaction of @ref{da0,,unittest.mock.seal()} with
@ref{c44,,unittest.mock.AsyncMock}.

@item 
gh-100488@footnote{https://github.com/python/cpython/issues/100488}: Add @code{Fraction.is_integer()} to check whether a
@ref{215,,fractions.Fraction} is an integer. This improves duck type
compatibility with @ref{197,,float} and @ref{19c,,int}.

@item 
gh-100474@footnote{https://github.com/python/cpython/issues/100474}: @ref{76,,http.server} now checks that an index page is actually a
regular file before trying to serve it.  This avoids issues with
directories named @code{index.html}.

@item 
gh-100363@footnote{https://github.com/python/cpython/issues/100363}: Speed up @ref{d07,,asyncio.get_running_loop()} by removing redundant
@code{getpid} checks. Patch by Kumar Aditya.

@item 
gh-78878@footnote{https://github.com/python/cpython/issues/78878}: Fix crash when creating an instance of @code{_ctypes.CField}.

@item 
gh-100348@footnote{https://github.com/python/cpython/issues/100348}: Fix ref cycle in @code{asyncio._SelectorSocketTransport} by
removing @code{_read_ready_cb} in @code{close}.

@item 
gh-100344@footnote{https://github.com/python/cpython/issues/100344}: Provide C implementation for @ref{6a6,,asyncio.current_task()} for a
4x-6x speedup.

@item 
gh-100272@footnote{https://github.com/python/cpython/issues/100272}: Fix JSON serialization of OrderedDict.  It now preserves the
order of keys.

@item 
gh-83076@footnote{https://github.com/python/cpython/issues/83076}: Instantiation of @code{Mock()} and @code{AsyncMock()} is now 3.8x
faster.

@item 
gh-100234@footnote{https://github.com/python/cpython/issues/100234}: Set a default value of 1.0 for the @code{lambd} parameter in
random.expovariate().

@item 
gh-100228@footnote{https://github.com/python/cpython/issues/100228}: A @ref{1a4,,DeprecationWarning} may be raised when @ref{4b6,,os.fork()}
or @ref{4b7,,os.forkpty()} is called from multi-threaded processes.  Forking
with threads is unsafe and can cause deadlocks, crashes and subtle
problems. Lack of a warning does not indicate that the fork call was
actually safe, as Python may not be aware of all threads.

@item 
gh-100039@footnote{https://github.com/python/cpython/issues/100039}: Improve signatures for enums and flags.

@item 
gh-100133@footnote{https://github.com/python/cpython/issues/100133}: Fix regression in @ref{b,,asyncio} where a subprocess would
sometimes lose data received from pipe.

@item 
bpo-44592@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44592}: Fixes inconsistent handling of case sensitivity of
`extrasaction' arg in @ref{140a,,csv.DictWriter}.

@item 
gh-100098@footnote{https://github.com/python/cpython/issues/100098}: Fix @code{tuple} subclasses being cast to @code{tuple} when used as
enum values.

@item 
gh-85432@footnote{https://github.com/python/cpython/issues/85432}: Rename the `fmt' parameter of the pure-Python implementation of
@ref{1b3c,,datetime.time.strftime()} to `format'. Rename the `t' parameter of
@ref{713,,datetime.datetime.fromtimestamp()} to `timestamp'. These changes mean
the parameter names in the pure-Python implementation now match the
parameter names in the C implementation. Patch by Alex Waygood.

@item 
gh-98778@footnote{https://github.com/python/cpython/issues/98778}: Update @ref{11e4,,HTTPError} to be initialized
properly, even if the @code{fp} is @code{None}. Patch by Donghee Na.

@item 
gh-99925@footnote{https://github.com/python/cpython/issues/99925}: Unify error messages in JSON serialization between
@code{json.dumps(float('nan'), allow_nan=False)} and
@code{json.dumps(float('nan'), allow_nan=False, indent=<SOMETHING>)}. Now
both include the representation of the value that could not be serialized.

@item 
gh-89727@footnote{https://github.com/python/cpython/issues/89727}: Fix issue with @ref{6d1,,os.walk()} where a @ref{f6e,,RecursionError}
would occur on deep directory structures by adjusting the implementation
of @code{os.walk()} to be iterative instead of recursive.

@item 
gh-94943@footnote{https://github.com/python/cpython/issues/94943}: Add @ref{1b3d,,Dataclass support} to the @ref{843,,Enum}
@ref{1b3e,,__repr__()}. When inheriting from a
@ref{4e2,,dataclass}, only show the field names in the value
section of the member @ref{1c3,,repr()}, and not the dataclass’ class name.

@item 
gh-83035@footnote{https://github.com/python/cpython/issues/83035}: Fix @ref{1812,,inspect.getsource()} handling of decorator calls with
nested parentheses.

@item 
gh-99576@footnote{https://github.com/python/cpython/issues/99576}: Fix @code{.save()} method for @code{LWPCookieJar} and
@code{MozillaCookieJar}: saved file was not truncated on repeated save.

@item 
gh-94912@footnote{https://github.com/python/cpython/issues/94912}: Add @ref{6b9,,inspect.markcoroutinefunction()} decorator which
manually marks a function as a coroutine for the benefit of
@code{iscoroutinefunction()}.

@item 
gh-99509@footnote{https://github.com/python/cpython/issues/99509}: Add 
@geindex Python Enhancement Proposals; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} support for
@code{multiprocessing.queues.Queue}.

@item 
gh-99482@footnote{https://github.com/python/cpython/issues/99482}: Remove @code{Jython} partial compatibility code from several stdlib
modules.

@item 
gh-99433@footnote{https://github.com/python/cpython/issues/99433}: Fix @ref{3e,,doctest} failure on @ref{85c,,types.MethodWrapperType}
in modules.

@item 
gh-85267@footnote{https://github.com/python/cpython/issues/85267}: Several improvements to @ref{231,,inspect.signature()}’s handling of
@code{__text_signature}. - Fixes a case where @code{inspect.signature()}
dropped parameters - Fixes a case where @code{inspect.signature()} raised
@ref{765,,tokenize.TokenError} - Allows @code{inspect.signature()} to
understand defaults involving binary operations of constants -
@code{inspect.signature()} is documented as only raising @ref{199,,TypeError}
or @ref{2ee,,ValueError}, but sometimes raised @ref{246,,RuntimeError}. These
cases now raise @code{ValueError} - Removed a dead code path

@item 
gh-91166@footnote{https://github.com/python/cpython/issues/91166}: @ref{b,,asyncio} is optimized to avoid excessive copying when
writing to socket and use @ref{6a2,,sendmsg()} if the platform
supports it. Patch by Kumar Aditya.

@item 
gh-98030@footnote{https://github.com/python/cpython/issues/98030}: Add missing TCP socket options from Linux: @code{TCP_MD5SIG},
@code{TCP_THIN_LINEAR_TIMEOUTS}, @code{TCP_THIN_DUPACK}, @code{TCP_REPAIR},
@code{TCP_REPAIR_QUEUE}, @code{TCP_QUEUE_SEQ}, @code{TCP_REPAIR_OPTIONS},
@code{TCP_TIMESTAMP}, @code{TCP_CC_INFO}, @code{TCP_SAVE_SYN}, @code{TCP_SAVED_SYN},
@code{TCP_REPAIR_WINDOW}, @code{TCP_FASTOPEN_CONNECT}, @code{TCP_ULP},
@code{TCP_MD5SIG_EXT}, @code{TCP_FASTOPEN_KEY}, @code{TCP_FASTOPEN_NO_COOKIE},
@code{TCP_ZEROCOPY_RECEIVE}, @code{TCP_INQ}, @code{TCP_TX_DELAY}.

@item 
gh-88500@footnote{https://github.com/python/cpython/issues/88500}: Reduced the memory usage of @ref{1b3f,,urllib.parse.unquote()} and
@ref{1b40,,urllib.parse.unquote_to_bytes()} on large values.

@item 
gh-96127@footnote{https://github.com/python/cpython/issues/96127}: @code{inspect.signature} was raising @code{TypeError} on call with
mock objects. Now it correctly returns @code{(*args, **kwargs)} as inferred
signature.

@item 
gh-95882@footnote{https://github.com/python/cpython/issues/95882}: Fix a 3.11 regression in
@ref{d25,,asynccontextmanager()}, which caused it to propagate
exceptions with incorrect tracebacks and fix a 3.11 regression in
@ref{140e,,contextmanager()}, which caused it to propagate
exceptions with incorrect tracebacks for @ref{dfb,,StopIteration}.

@item 
gh-78707@footnote{https://github.com/python/cpython/issues/78707}: Deprecate passing more than one positional argument to
@ref{2ff,,pathlib.PurePath.relative_to()} and
@ref{300,,is_relative_to()}.

@item 
gh-92122@footnote{https://github.com/python/cpython/issues/92122}: Fix reStructuredText syntax errors in docstrings in the
@ref{5a,,enum} module.

@item 
gh-91851@footnote{https://github.com/python/cpython/issues/91851}: Optimize the @ref{215,,Fraction} arithmetics for small
components.

@item 
bpo-24132@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24132}: Make @ref{6ce,,pathlib.PurePath} and @ref{268,,Path}
subclassable (private to start). Previously, attempting to instantiate a
subclass resulted in an @ref{5f0,,AttributeError} being raised. Patch by
Barney Gale.

@item 
bpo-40447@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40447}: Accept @ref{e51,,os.PathLike} (such as @ref{268,,pathlib.Path}) in
the @code{stripdir} arguments of @ref{fe7,,compileall.compile_file()} and
@ref{d21,,compileall.compile_dir()}.

@item 
bpo-36880@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36880}: Fix a reference counting issue when a @ref{2e,,ctypes} callback
with return type @ref{1f5,,py_object} returns @code{None}, which could
cause crashes.
@end itemize

@node Documentation<28>,Tests<28>,Library<78>,Python 3 12 0 alpha 4
@anchor{whatsnew/changelog id366}@anchor{1b41}
@subsubsection Documentation



@itemize -

@item 
gh-100616@footnote{https://github.com/python/cpython/issues/100616}: Document existing @code{attr} parameter to
@ref{1b42,,curses.window.vline()} function in @ref{2f,,curses}.

@item 
gh-100472@footnote{https://github.com/python/cpython/issues/100472}: Remove claim in documentation that the @code{stripdir},
@code{prependdir} and @code{limit_sl_dest} parameters of
@ref{d21,,compileall.compile_dir()} and @ref{fe7,,compileall.compile_file()} could
be @ref{193,,bytes}.

@item 
bpo-25377@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25377}: Clarify use of octal format of mode argument in help(os.chmod)
as well as help(os.fchmod)
@end itemize

@node Tests<28>,Build<32>,Documentation<28>,Python 3 12 0 alpha 4
@anchor{whatsnew/changelog id367}@anchor{1b43}
@subsubsection Tests



@itemize -

@item 
gh-100454@footnote{https://github.com/python/cpython/issues/100454}: Start running SSL tests with OpenSSL 3.1.0-beta1.

@item 
gh-100086@footnote{https://github.com/python/cpython/issues/100086}: The Python test runner (libregrtest) now logs Python build
information like “debug” vs “release” build, or LTO and PGO optimizations.
Patch by Victor Stinner.

@item 
gh-93018@footnote{https://github.com/python/cpython/issues/93018}: Make two tests forgiving towards host system libexpat with
backported security fixes applied.
@end itemize

@node Build<32>,Windows<28>,Tests<28>,Python 3 12 0 alpha 4
@anchor{whatsnew/changelog id368}@anchor{1b44}
@subsubsection Build



@itemize -

@item 
gh-100540@footnote{https://github.com/python/cpython/issues/100540}: Removed the @code{--with-system-ffi} @code{configure} option;
@code{libffi} must now always be supplied by the system on all non-Windows
platforms.  The option has had no effect on non-Darwin platforms for
several releases, and in 3.11 only had the non-obvious effect of invoking
@code{pkg-config} to find @code{libffi} and never setting
@code{-DUSING_APPLE_OS_LIBFFI}.  Now on Darwin platforms @code{configure} will
first check for the OS @code{libffi} and then fall back to the same
processing as other platforms if it is not found.

@item 
gh-88267@footnote{https://github.com/python/cpython/issues/88267}: Avoid exporting Python symbols in linked Windows applications
when the core is built as static.

@item 
bpo-41916@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41916}: Allow override of ac_cv_cxx_thread so that cross compiled
python can set -pthread for CXX.
@end itemize

@node Windows<28>,macOS<20>,Build<32>,Python 3 12 0 alpha 4
@anchor{whatsnew/changelog id369}@anchor{1b45}
@subsubsection Windows



@itemize -

@item 
gh-100180@footnote{https://github.com/python/cpython/issues/100180}: Update Windows installer to OpenSSL 1.1.1s

@item 
gh-99191@footnote{https://github.com/python/cpython/issues/99191}: Use @code{_MSVC_LANG >= 202002L} instead of less-precise @code{_MSC_VER
>=1929} to more accurately test for C++20 support in
@code{PC/_wmimodule.cpp}.

@item 
gh-79218@footnote{https://github.com/python/cpython/issues/79218}: Define @code{MS_WIN64} for Mingw-w64 64bit, fix cython compilation
failure.

@item 
gh-99941@footnote{https://github.com/python/cpython/issues/99941}: Ensure that @ref{1b46,,asyncio.Protocol.data_received()} receives an
immutable @ref{193,,bytes} object (as documented), instead of
@ref{342,,bytearray}.

@item 
bpo-43984@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43984}: @ref{1b47,,winreg.SetValueEx()} now leaves the target value untouched
in the case of conversion errors. Previously, @code{-1} would be written in
case of such errors.

@item 
bpo-34816@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34816}: @code{hasattr(ctypes.windll, 'nonexistant')} now returns @code{False}
instead of raising @ref{2c2,,OSError}.
@end itemize

@node macOS<20>,Tools/Demos<22>,Windows<28>,Python 3 12 0 alpha 4
@anchor{whatsnew/changelog id370}@anchor{1b48}
@subsubsection macOS



@itemize -

@item 
gh-100180@footnote{https://github.com/python/cpython/issues/100180}: Update macOS installer to OpenSSL 1.1.1s

@item 
gh-100540@footnote{https://github.com/python/cpython/issues/100540}: Removed obsolete @code{dlfcn.h} shim from the @code{_ctypes}
extension module, which has not been necessary since Mac OS X 10.2.
@end itemize

@node Tools/Demos<22>,C API<29>,macOS<20>,Python 3 12 0 alpha 4
@anchor{whatsnew/changelog id371}@anchor{1b49}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-45256@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45256}: Fix a bug that caused an @ref{5f0,,AttributeError} to be raised in
@code{python-gdb.py} when @code{py-locals} is used without a frame.

@item 
gh-100342@footnote{https://github.com/python/cpython/issues/100342}: Add missing @code{NULL} check for possible allocation failure in
@code{*args} parsing in Argument Clinic.
@end itemize

@node C API<29>,,Tools/Demos<22>,Python 3 12 0 alpha 4
@anchor{whatsnew/changelog id372}@anchor{1b4a}
@subsubsection C API



@itemize -

@item 
gh-99947@footnote{https://github.com/python/cpython/issues/99947}: Raising SystemError on import will now have its cause be set to
the original unexpected exception.

@item 
gh-99240@footnote{https://github.com/python/cpython/issues/99240}: In argument parsing, after deallocating newly allocated memory,
reset its pointer to NULL.

@item 
gh-98724@footnote{https://github.com/python/cpython/issues/98724}: The @ref{799,,Py_CLEAR}, @ref{79a,,Py_SETREF} and
@ref{79b,,Py_XSETREF} macros now only evaluate their arguments once. If an
argument has side effects, these side effects are no longer duplicated.
Patch by Victor Stinner.
@end itemize

@node Python 3 12 0 alpha 3,Python 3 12 0 alpha 2,Python 3 12 0 alpha 4,Changelog
@anchor{whatsnew/changelog python-3-12-0-alpha-3}@anchor{1b4b}
@subsection Python 3.12.0 alpha 3


`Release date: 2022-12-06'

@menu
* Security: Security<29>. 
* Core and Builtins: Core and Builtins<74>. 
* Library: Library<79>. 
* Core and Builtins: Core and Builtins<75>. 
* Library: Library<80>. 
* Documentation: Documentation<29>. 
* Tests: Tests<29>. 
* Build: Build<33>. 
* Windows: Windows<29>. 
* macOS: macOS<21>. 
* Tools/Demos: Tools/Demos<23>. 
* C API: C API<30>. 

@end menu

@node Security<29>,Core and Builtins<74>,,Python 3 12 0 alpha 3
@anchor{whatsnew/changelog id373}@anchor{1b4c}
@subsubsection Security



@itemize -

@item 
gh-100001@footnote{https://github.com/python/cpython/issues/100001}: @code{python -m http.server} no longer allows terminal control
characters sent within a garbage request to be printed to the stderr
server log.

This is done by changing the @ref{76,,http.server}
@code{BaseHTTPRequestHandler} @code{.log_message} method to replace control
characters with a @code{\x@var{HH}} hex escape before printing.

@item 
gh-87604@footnote{https://github.com/python/cpython/issues/87604}: Avoid publishing list of active per-interpreter audit hooks via
the @ref{64,,gc} module
@end itemize

@node Core and Builtins<74>,Library<79>,Security<29>,Python 3 12 0 alpha 3
@anchor{whatsnew/changelog id374}@anchor{1b4d}
@subsubsection Core and Builtins



@itemize -

@item 
gh-99891@footnote{https://github.com/python/cpython/issues/99891}: Fix a bug in the tokenizer that could cause infinite recursion
when showing syntax warnings that happen in the first line of the source.
Patch by Pablo Galindo

@item 
gh-91054@footnote{https://github.com/python/cpython/issues/91054}: Add @ref{788,,PyCode_AddWatcher()} and
@ref{789,,PyCode_ClearWatcher()} APIs to register callbacks to receive
notification on creation and destruction of code objects.

@item 
gh-99729@footnote{https://github.com/python/cpython/issues/99729}: Fix an issue that could cause frames to be visible to Python
code as they are being torn down, possibly leading to memory corruption or
hard crashes of the interpreter.

@item 
gh-99708@footnote{https://github.com/python/cpython/issues/99708}: Fix bug where compiler crashes on an if expression with an empty
body block.

@item 
gh-99578@footnote{https://github.com/python/cpython/issues/99578}: Fix a reference bug in @code{_imp.create_builtin()} after the
creation of the first sub-interpreter for modules @code{builtins} and
@code{sys}. Patch by Victor Stinner.

@item 
gh-99581@footnote{https://github.com/python/cpython/issues/99581}: Fixed a bug that was causing a buffer overflow if the tokenizer
copies a line missing the newline character from a file that is as long as
the available tokenizer buffer. Patch by Pablo galindo

@item 
gh-99553@footnote{https://github.com/python/cpython/issues/99553}: Fix bug where an @ref{4d3,,ExceptionGroup} subclass can wrap a
@ref{7d8,,BaseException}.
@end itemize

@node Library<79>,Core and Builtins<75>,Core and Builtins<74>,Python 3 12 0 alpha 3
@anchor{whatsnew/changelog id375}@anchor{1b4e}
@subsubsection Library



@itemize -

@item 
gh-99547@footnote{https://github.com/python/cpython/issues/99547}: Add a function to os.path to check if a path is a junction:
isjunction. Add similar functionality to pathlib.Path as is_junction.

@item 
gh-99370@footnote{https://github.com/python/cpython/issues/99370}: Fix zip path for venv created from a non-installed python on
POSIX platforms.
@end itemize

@node Core and Builtins<75>,Library<80>,Library<79>,Python 3 12 0 alpha 3
@anchor{whatsnew/changelog id376}@anchor{1b4f}
@subsubsection Core and Builtins



@itemize -

@item 
gh-99377@footnote{https://github.com/python/cpython/issues/99377}: Add audit events for thread creation and clear operations.

@item 
gh-98686@footnote{https://github.com/python/cpython/issues/98686}: Remove the @code{BINARY_OP_GENERIC} and @code{COMPARE_OP_GENERIC}
“specializations”.

@item 
gh-99298@footnote{https://github.com/python/cpython/issues/99298}: Remove the remaining error paths for attribute specializations,
and refuse to specialize attribute accesses on types that haven’t had
@ref{985,,PyType_Ready()} called on them yet.

@item 
gh-99127@footnote{https://github.com/python/cpython/issues/99127}: Allow some features of @ref{e2,,syslog} to the main interpreter
only. Patch by Donghee Na.

@item 
gh-91053@footnote{https://github.com/python/cpython/issues/91053}: Optimizing interpreters and JIT compilers may need to invalidate
internal metadata when functions are modified. This change adds the
ability to provide a callback that will be invoked each time a function is
created, modified, or destroyed.

@item 
gh-90994@footnote{https://github.com/python/cpython/issues/90994}: Improve error messages when there’s a syntax error with call
arguments. The following three cases are covered: - No value is assigned
to a named argument, eg @code{foo(a=)}. - A value is assigned to a star
argument, eg @code{foo(*args=[0])}. - A value is assigned to a double-star
keyword argument, eg @code{foo(**kwarg=@{'a': 0@})}.

@item 
bpo-45026@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45026}: Optimize the @ref{b43,,range} object iterator. It is now smaller,
faster iteration of ranges containing large numbers. Smaller pickles,
faster unpickling.

@item 
bpo-31718@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31718}: Raise @ref{2ee,,ValueError} instead of @ref{796,,SystemError} when
methods of uninitialized @ref{17b4,,io.IncrementalNewlineDecoder} objects are
called. Patch by Oren Milman.

@item 
bpo-38031@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38031}: Fix a possible assertion failure in @ref{151b,,io.FileIO} when the
opener returns an invalid file descriptor.
@end itemize

@node Library<80>,Documentation<29>,Core and Builtins<75>,Python 3 12 0 alpha 3
@anchor{whatsnew/changelog id377}@anchor{1b50}
@subsubsection Library



@itemize -

@item 
gh-100001@footnote{https://github.com/python/cpython/issues/100001}: Also escape s in the http.server
BaseHTTPRequestHandler.log_message so that it is technically possible to
parse the line and reconstruct what the original data was.  Without this a
xHH is ambiguous as to if it is a hex replacement we put in or the
characters r”x” came through in the original request line.

@item 
gh-99957@footnote{https://github.com/python/cpython/issues/99957}: Add @code{frozen_default} parameter to
@ref{6fc,,typing.dataclass_transform()}.

@item 
gh-79033@footnote{https://github.com/python/cpython/issues/79033}: Fix @ref{1a85,,asyncio.Server.wait_closed()} to actually do what the
docs promise – wait for all existing connections to complete, after
closing the server.

@item 
gh-51524@footnote{https://github.com/python/cpython/issues/51524}: Fix bug when calling trace.CoverageResults with valid infile.

@item 
gh-99645@footnote{https://github.com/python/cpython/issues/99645}: Fix a bug in handling class cleanups in
@ref{2b5,,unittest.TestCase}.  Now @code{addClassCleanup()} uses separate lists
for different @code{TestCase} subclasses, and @code{doClassCleanups()} only
cleans up the particular class.

@item 
gh-99508@footnote{https://github.com/python/cpython/issues/99508}: Fix @code{TypeError} in @code{Lib/importlib/_bootstrap_external.py}
while calling @code{_imp.source_hash()}.

@item 
gh-66285@footnote{https://github.com/python/cpython/issues/66285}: Fix @ref{b,,asyncio} to not share event loop and signal wakeupfd
in forked processes. Patch by Kumar Aditya.

@item 
gh-97001@footnote{https://github.com/python/cpython/issues/97001}: Release the GIL when calling termios APIs to avoid blocking
threads.

@item 
gh-92647@footnote{https://github.com/python/cpython/issues/92647}: Use final status of an enum to determine lookup or creation
branch of functional API.

@item 
gh-99388@footnote{https://github.com/python/cpython/issues/99388}: Add `loop_factory' parameter to @ref{2f5,,asyncio.run()} to allow
specifying a custom event loop factory. Patch by Kumar Aditya.

@item 
gh-99341@footnote{https://github.com/python/cpython/issues/99341}: Fix @ref{1b51,,ast.increment_lineno()} to also cover
@ref{1b52,,ast.TypeIgnore} when changing line numbers.

@item 
gh-99382@footnote{https://github.com/python/cpython/issues/99382}: Check the number of arguments in substitution in user generics
containing a @ref{489,,TypeVarTuple} and one or more
@ref{487,,TypeVar}.

@item 
gh-99379@footnote{https://github.com/python/cpython/issues/99379}: Fix substitution of @ref{488,,ParamSpec} followed by
@ref{489,,TypeVarTuple} in generic aliases.

@item 
gh-99344@footnote{https://github.com/python/cpython/issues/99344}: Fix substitution of @ref{489,,TypeVarTuple} and
@ref{488,,ParamSpec} together in user generics.

@item 
gh-99284@footnote{https://github.com/python/cpython/issues/99284}: Remove @code{_use_broken_old_ctypes_structure_semantics_} old
untested and undocumented hack from @ref{2e,,ctypes}.

@item 
gh-99201@footnote{https://github.com/python/cpython/issues/99201}: Fix @ref{1741,,IndexError} when initializing the config variables on
Windows if @code{HAVE_DYNAMIC_LOADING} is not set.

@item 
gh-99240@footnote{https://github.com/python/cpython/issues/99240}: Fix double-free bug in Argument Clinic @code{str_converter} by
extracting memory clean up to a new @code{post_parsing} section.

@item 
gh-64490@footnote{https://github.com/python/cpython/issues/64490}: Fix refcount error when arguments are packed to tuple in
Argument Clinic.

@item 
gh-99029@footnote{https://github.com/python/cpython/issues/99029}: @ref{2ff,,pathlib.PurePath.relative_to()} now treats naked Windows
drive paths as relative. This brings its behaviour in line with other
parts of pathlib.

@item 
gh-98253@footnote{https://github.com/python/cpython/issues/98253}: The implementation of the typing module is now more resilient to
reference leaks in binary extension modules.

Previously, a reference leak in a typed C API-based extension module could
leak internals of the typing module, which could in turn introduce leaks
in essentially any other package with typed function signatures. Although
the typing package is not the original source of the problem, such
non-local dependences exacerbate debugging of large-scale projects, and
the implementation was therefore changed to reduce harm by providing
better isolation.

@item 
gh-98458@footnote{https://github.com/python/cpython/issues/98458}: Fix infinite loop in unittest when a self-referencing chained
exception is raised

@item 
gh-93453@footnote{https://github.com/python/cpython/issues/93453}: @ref{2f4,,asyncio.get_event_loop()} and many other @ref{b,,asyncio}
functions like @ref{e77,,asyncio.ensure_future()}, @ref{c6b,,asyncio.shield()} or
@ref{814,,asyncio.gather()}, and also the
@code{get_event_loop()} method of
@code{asyncio.BaseDefaultEventLoopPolicy} now raise a
@ref{246,,RuntimeError} if called when there is no running event loop and the
current event loop was not set. Previously they implicitly created and set
a new current event loop. @ref{1a4,,DeprecationWarning} is no longer emitted
if there is no running event loop but the current event loop was set.

@item 
gh-97966@footnote{https://github.com/python/cpython/issues/97966}: On @code{uname_result}, restored expectation that @code{_fields} and
@code{_asdict} would include all six properties including @code{processor}.

@item 
gh-98248@footnote{https://github.com/python/cpython/issues/98248}: Provide informative error messages in @ref{1482,,struct.pack()} when
its integral arguments are not in range.

@item 
gh-98108@footnote{https://github.com/python/cpython/issues/98108}: @code{zipfile.Path} is now pickleable if its initialization
parameters were pickleable (e.g. for file system paths).

@item 
gh-98098@footnote{https://github.com/python/cpython/issues/98098}: Created packages from zipfile and test_zipfile modules,
separating @code{zipfile.Path} functionality.

@item 
gh-82836@footnote{https://github.com/python/cpython/issues/82836}: Fix @ref{1a05,,is_private} properties in the
@ref{84,,ipaddress} module. Previously non-private networks (0.0.0.0/0) would
return @code{True} from this method; now they correctly return @code{False}.

@item 
gh-96828@footnote{https://github.com/python/cpython/issues/96828}: Add an @ref{1b53,,OP_ENABLE_KTLS} option for enabling the use
of the kernel TLS (kTLS). Patch by Illia Volochii.

@item 
gh-88863@footnote{https://github.com/python/cpython/issues/88863}: To avoid apparent memory leaks when
@ref{d14,,asyncio.open_connection()} raises, break reference cycles generated
by local exception and future instances (which has exception instance as
its member var). Patch by Dong Uk, Kang.

@item 
gh-91078@footnote{https://github.com/python/cpython/issues/91078}: @code{TarFile.next()} now returns @code{None} when called on an
empty tarfile.

@item 
bpo-47220@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47220}: Document the optional `callback' parameter of
@code{WeakMethod}. Patch by Géry Ogam.

@item 
bpo-44817@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44817}: Ignore WinError 53 (ERROR_BAD_NETPATH), 65
(ERROR_NETWORK_ACCESS_DENIED) and 161 (ERROR_BAD_PATHNAME) when using
ntpath.realpath().

@item 
bpo-41260@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41260}: Rename the `fmt' parameter of the pure Python implementation of
@ref{e95,,datetime.date.strftime()} to `format'.

@item 
bpo-15999@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15999}: All built-in functions now accept arguments of any type instead
of just @code{bool} and @code{int} for boolean parameters.
@end itemize

@node Documentation<29>,Tests<29>,Library<80>,Python 3 12 0 alpha 3
@anchor{whatsnew/changelog id378}@anchor{1b54}
@subsubsection Documentation



@itemize -

@item 
gh-99931@footnote{https://github.com/python/cpython/issues/99931}: Use sphinxext-opengraph@footnote{https://sphinxext-opengraph.readthedocs.io/} to generate OpenGraph metadata@footnote{https://ogp.me/}.

@item 
gh-89682@footnote{https://github.com/python/cpython/issues/89682}: Reworded docstring of the default @code{__contains__} to clarify
that it returns a @ref{3c1,,bool}.

@item 
gh-88330@footnote{https://github.com/python/cpython/issues/88330}: Improved the description of what a resource is in
importlib.resources docs.

@item 
gh-92892@footnote{https://github.com/python/cpython/issues/92892}: Document that calling variadic functions with ctypes requires
special care on macOS/arm64 (and possibly other platforms).

@item 
bpo-41825@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41825}: Restructured the documentation for the @ref{f9e,,os.wait*} family of functions, and improved the docs for
@ref{f9f,,os.waitid()} with more explanation of the possible argument
constants.
@end itemize

@node Tests<29>,Build<33>,Documentation<29>,Python 3 12 0 alpha 3
@anchor{whatsnew/changelog id379}@anchor{1b55}
@subsubsection Tests



@itemize -

@item 
gh-99892@footnote{https://github.com/python/cpython/issues/99892}: Skip test_normalization() of test_unicodedata if it fails to
download NormalizationTest.txt file from pythontest.net. Patch by Victor
Stinner.

@item 
gh-99934@footnote{https://github.com/python/cpython/issues/99934}: Correct test_marsh on (32 bit) x86: test_deterministic sets was
failing.

@item 
gh-99741@footnote{https://github.com/python/cpython/issues/99741}: We’ve implemented multi-phase init (PEP 489/630/687) for the
internal (for testing) _xxsubinterpreters module.

@item 
gh-99659@footnote{https://github.com/python/cpython/issues/99659}: Optional big memory tests in @code{test_sqlite3} now catch the
correct @code{sqlite.DataError} exception type in case of too large
strings and/or blobs passed.

@item 
gh-99593@footnote{https://github.com/python/cpython/issues/99593}: Cover the Unicode C API with tests.

@item 
gh-96002@footnote{https://github.com/python/cpython/issues/96002}: Add functional test for Argument Clinic.
@end itemize

@node Build<33>,Windows<29>,Tests<29>,Python 3 12 0 alpha 3
@anchor{whatsnew/changelog id380}@anchor{1b56}
@subsubsection Build



@itemize -

@item 
gh-99086@footnote{https://github.com/python/cpython/issues/99086}: Fix @code{-Wimplicit-int}, @code{-Wstrict-prototypes}, and
@code{-Wimplicit-function-declaration} compiler warnings in
@code{configure} checks.

@item 
gh-99337@footnote{https://github.com/python/cpython/issues/99337}: Fix a compilation issue with GCC 12 on macOS.

@item 
gh-99289@footnote{https://github.com/python/cpython/issues/99289}: Add a @code{COMPILEALL_OPTS} variable in Makefile to override
@ref{21,,compileall} options (default: @code{-j0}) in @code{make install}. Also
merged the @code{compileall} commands into a single command building .pyc
files for the all optimization levels (0, 1, 2) at once. Patch by Victor
Stinner.

@item 
gh-98872@footnote{https://github.com/python/cpython/issues/98872}: Fix a possible fd leak in @code{Programs/_freeze_module.c}
introduced in Python 3.11.

@item 
gh-88226@footnote{https://github.com/python/cpython/issues/88226}: Always define @code{TARGET_*} labels in @code{Python/ceval.c}, even if
@code{USE_COMPUTED_GOTOS} is disabled.  This allows breakpoints to be set at
those labels in (for instance) @code{gdb}.
@end itemize

@node Windows<29>,macOS<21>,Build<33>,Python 3 12 0 alpha 3
@anchor{whatsnew/changelog id381}@anchor{1b57}
@subsubsection Windows



@itemize -

@item 
gh-99345@footnote{https://github.com/python/cpython/issues/99345}: Use faster initialization functions to detect install location
for Windows Store package

@item 
gh-98629@footnote{https://github.com/python/cpython/issues/98629}: Fix initialization of @ref{49d,,sys.version} and @code{sys._git} on
Windows

@item 
gh-99442@footnote{https://github.com/python/cpython/issues/99442}: Fix handling in @ref{7db,,Python install manager} when @code{argv[0]} does not
include a file extension.

@item 
bpo-40882@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40882}: Fix a memory leak in
@ref{1a1c,,multiprocessing.shared_memory.SharedMemory} on Windows.
@end itemize

@node macOS<21>,Tools/Demos<23>,Windows<29>,Python 3 12 0 alpha 3
@anchor{whatsnew/changelog id382}@anchor{1b58}
@subsubsection macOS



@itemize -

@item 
gh-87235@footnote{https://github.com/python/cpython/issues/87235}: On macOS @code{python3 /dev/fd/9 9</path/to/script.py} failed for
any script longer than a couple of bytes.

@item 
gh-98940@footnote{https://github.com/python/cpython/issues/98940}: Fix @code{Mac/Extras.install.py} file filter bug.
@end itemize

@node Tools/Demos<23>,C API<30>,macOS<21>,Python 3 12 0 alpha 3
@anchor{whatsnew/changelog id383}@anchor{1b59}
@subsubsection Tools/Demos



@itemize -

@item 
gh-64490@footnote{https://github.com/python/cpython/issues/64490}: Argument Clinic varargs bugfixes


@itemize *

@item 
Fix out-of-bounds error in @code{_PyArg_UnpackKeywordsWithVararg()}.

@item 
Fix incorrect check which allowed more than one varargs in clinic.py.

@item 
Fix miscalculation of @code{noptargs} in generated code.

@item 
Do not generate @code{noptargs} when there is a vararg argument and no optional argument.
@end itemize
@end itemize

@node C API<30>,,Tools/Demos<23>,Python 3 12 0 alpha 3
@anchor{whatsnew/changelog id384}@anchor{1b5a}
@subsubsection C API



@itemize -

@item 
gh-98680@footnote{https://github.com/python/cpython/issues/98680}: @code{PyBUF_*} constants were marked as part of Limited API of
Python 3.11+. These were available in 3.11.0 with
@ref{660,,Py_LIMITED_API} defined for 3.11, and are necessary to use the
buffer API.

@item 
gh-99612@footnote{https://github.com/python/cpython/issues/99612}: Fix @ref{1b5b,,PyUnicode_DecodeUTF8Stateful()} for ASCII-only data:
@code{*consumed} was not set.

@item 
gh-47146@footnote{https://github.com/python/cpython/issues/47146}: The @code{structmember.h} header is deprecated. Its non-deprecated
contents are now available just by including @code{Python.h}, with a @code{Py_}
prefix added if it was missing. (Deprecated contents are
@ref{7b1,,T_OBJECT}, @ref{7b3,,T_NONE}, and no-op flags.) Patch by Petr
Viktorin, based on earlier work by Alexander Belopolsky and Matthias
Braun.
@end itemize

@node Python 3 12 0 alpha 2,Python 3 12 0 alpha 1,Python 3 12 0 alpha 3,Changelog
@anchor{whatsnew/changelog python-3-12-0-alpha-2}@anchor{1b5c}
@subsection Python 3.12.0 alpha 2


`Release date: 2022-11-14'

@menu
* Security: Security<30>. 
* Core and Builtins: Core and Builtins<76>. 
* Build: Build<34>. 
* Core and Builtins: Core and Builtins<77>. 
* Library: Library<81>. 
* Documentation: Documentation<30>. 
* Tests: Tests<30>. 
* Build: Build<35>. 
* Windows: Windows<30>. 
* macOS: macOS<22>. 
* C API: C API<31>. 

@end menu

@node Security<30>,Core and Builtins<76>,,Python 3 12 0 alpha 2
@anchor{whatsnew/changelog id385}@anchor{1b5d}
@subsubsection Security



@itemize -

@item 
gh-98433@footnote{https://github.com/python/cpython/issues/98433}: The IDNA codec decoder used on DNS hostnames by @ref{d1,,socket} or
@ref{b,,asyncio} related name resolution functions no longer involves a
quadratic algorithm. This prevents a potential CPU denial of service if an
out-of-spec excessive length hostname involving bidirectional characters
were decoded. Some protocols such as @ref{10f,,urllib} http @code{3@var{xx}}
redirects potentially allow for an attacker to supply such a name.

Individual labels within an IDNA encoded DNS name will now raise an error
early during IDNA decoding if they are longer than 1024 unicode characters
given that each decoded DNS label must be 63 or fewer characters and the
entire decoded DNS name is limited to 255. Only an application presenting
a hostname or label consisting primarily of 
@geindex RFC; RFC 3454
RFC 3454@footnote{https://datatracker.ietf.org/doc/html/rfc3454.html} section 3.1
“Nothing” characters to be removed would run into of this new limit. See
also 
@geindex RFC; RFC 5894
RFC 5894@footnote{https://datatracker.ietf.org/doc/html/rfc5894.html} section 6 and 
@geindex RFC; RFC 3491
RFC 3491@footnote{https://datatracker.ietf.org/doc/html/rfc3491.html}.

@item 
gh-98739@footnote{https://github.com/python/cpython/issues/98739}: Update bundled libexpat to 2.5.0
@end itemize

@node Core and Builtins<76>,Build<34>,Security<30>,Python 3 12 0 alpha 2
@anchor{whatsnew/changelog id386}@anchor{1b5e}
@subsubsection Core and Builtins



@itemize -

@item 
gh-81057@footnote{https://github.com/python/cpython/issues/81057}: The docs clearly say that @ref{1b5f,,PyImport_Inittab},
@ref{1b60,,PyImport_AppendInittab()}, and @ref{1b61,,PyImport_ExtendInittab()}
should not be used after @ref{45e,,Py_Initialize()} has been called. We now
enforce this for the two functions.  Additionally, the runtime now uses an
internal copy of @code{PyImport_Inittab}, to guard against
modification.

@item 
gh-99298@footnote{https://github.com/python/cpython/issues/99298}: Fix an issue that could potentially cause incorrect error
handling for some bytecode instructions.

@item 
gh-99254@footnote{https://github.com/python/cpython/issues/99254}: The compiler now removes all unused constants from code objects
(except the first one, which may be a docstring).

@item 
gh-99205@footnote{https://github.com/python/cpython/issues/99205}: Fix an issue that prevented @ref{995,,PyThreadState} and
@ref{ac0,,PyInterpreterState} memory from being freed properly.

@item 
gh-81057@footnote{https://github.com/python/cpython/issues/81057}: The 18 global C variables holding the state of the allocators
have been moved to @code{_PyRuntimeState}.  This is a strictly internal
change with no change in behavior.

@item 
gh-99181@footnote{https://github.com/python/cpython/issues/99181}: Fix failure in @ref{1ad,,except*} with unhashable
exceptions.

@item 
gh-99204@footnote{https://github.com/python/cpython/issues/99204}: Fix calculation of @code{sys._base_executable} when inside a
POSIX virtual environment using copies of the python binary when the base
installation does not provide the executable name used by the venv.
Calculation will fall back to alternative names (“python<MAJOR>”,
“python<MAJOR>.<MINOR>”).

@item 
gh-96055@footnote{https://github.com/python/cpython/issues/96055}: Update @ref{5c,,faulthandler} to emit an error message with the
proper unexpected signal number. Patch by Donghee Na.

@item 
gh-99153@footnote{https://github.com/python/cpython/issues/99153}: Fix location of @ref{18f,,SyntaxError} for a @ref{8fa,,try} block
with both @ref{1ac,,except} and @ref{1ad,,except*}.

@item 
gh-98686@footnote{https://github.com/python/cpython/issues/98686}: Merge the adaptive opcode logic into each instruction’s
unquickened variant, and merge the logic in @code{EXTENDED_ARG_QUICK} into
@ref{1b62,,EXTENDED_ARG}. With these changes, the quickening that happens at
code object creation is now only responsible for initializing warmup
counters and inserting superinstructions.

@item 
gh-99103@footnote{https://github.com/python/cpython/issues/99103}: Fix the error reporting positions of specialized traceback
anchors when the source line contains Unicode characters.

@item 
gh-99139@footnote{https://github.com/python/cpython/issues/99139}: Improve the error suggestion for @ref{450,,NameError} exceptions for
instances. Now if a @code{NameError} is raised in a method and the
instance has an attribute that’s exactly equal to the name in the
exception, the suggestion will include @code{self.<NAME>} instead of the
closest match in the method scope. Patch by Pablo Galindo

@item 
gh-98401@footnote{https://github.com/python/cpython/issues/98401}: Octal escapes with value larger than @code{0o377} (ex: @code{"\477"}),
deprecated in Python 3.11, now produce a @ref{1af,,SyntaxWarning}, instead of
@ref{1a4,,DeprecationWarning}. In a future Python version they will be
eventually a @ref{18f,,SyntaxError}. Patch by Victor Stinner.

@item 
gh-98401@footnote{https://github.com/python/cpython/issues/98401}: A backslash-character pair that is not a valid escape sequence
now generates a @ref{1af,,SyntaxWarning}, instead of
@ref{1a4,,DeprecationWarning}.  For example, @code{re.compile("\d+\.\d+")} now
emits a @code{SyntaxWarning} (@code{"\d"} is an invalid escape sequence), use
raw strings for regular expression: @code{re.compile(r"\d+\.\d+")}. In a
future Python version, @ref{18f,,SyntaxError} will eventually be raised,
instead of @code{SyntaxWarning}. Patch by Victor Stinner.

@item 
gh-96793@footnote{https://github.com/python/cpython/issues/96793}: Handle StopIteration and StopAsyncIteration raised in generator
or coroutines in the bytecode, rather than in wrapping C code.

@item 
gh-98931@footnote{https://github.com/python/cpython/issues/98931}: Improve the @ref{18f,,SyntaxError} error message when the user types
@code{import x from y} instead of @code{from y import x}. Patch by Pablo Galindo

@item 
gh-98852@footnote{https://github.com/python/cpython/issues/98852}: Fix subscription of type aliases containing bare generic types
or types like @ref{487,,TypeVar}: for example @code{tuple[A, T][int]}
and @code{tuple[TypeVar, T][int]}, where @code{A} is a generic type, and @code{T}
is a type variable.

@item 
gh-98925@footnote{https://github.com/python/cpython/issues/98925}: Lower the recursion depth for marshal on WASI to support
(in-development) wasmtime 2.0.

@item 
gh-98783@footnote{https://github.com/python/cpython/issues/98783}: Fix multiple crashes in debug mode when @code{str} subclasses are
used instead of @code{str} itself.

@item 
gh-98811@footnote{https://github.com/python/cpython/issues/98811}: Use complete source locations to simplify detection of
@code{__future__} imports which are not at the beginning of the file. Also
corrects the offset in the exception raised in one case, which was off by
one and impeded highlighting.

@item 
gh-96793@footnote{https://github.com/python/cpython/issues/96793}: Add specialization of @ref{1b09,,FOR_ITER} for generators. Saves
multiple layers of dispatch and checking to get from the
@code{FOR_ITER} instruction in the caller to the @ref{5bb,,RESUME} in
the generator.

@item 
gh-98762@footnote{https://github.com/python/cpython/issues/98762}: Fix source locations of @ref{a14,,match} sub-patterns.

@item 
gh-98586@footnote{https://github.com/python/cpython/issues/98586}: Added the methods @ref{77f,,PyObject_Vectorcall()} and
@ref{780,,PyObject_VectorcallMethod()} to the @ref{776,,Limited API}
along with the auxiliary macro constant
@ref{781,,PY_VECTORCALL_ARGUMENTS_OFFSET}.

The availability of these functions enables more efficient 
@geindex Python Enhancement Proposals; PEP 590
PEP 590@footnote{https://peps.python.org/pep-0590/}
vector calls from binary extension modules that avoid argument
boxing/unboxing overheads.

@item 
gh-99257@footnote{https://github.com/python/cpython/issues/99257}: Fix an issue where member descriptors (such as those for
@ref{16f7,,__slots__}) could behave incorrectly or crash instead of
raising a @ref{199,,TypeError} when accessed via an instance of an invalid
type.

@item 
gh-93143@footnote{https://github.com/python/cpython/issues/93143}: Rather than changing @code{co_code}, the
interpreter will now display a @ref{4d8,,RuntimeWarning} and assign
@ref{887,,None} to any fast locals that are left unbound after jumps or
@ref{1b63,,del} statements executed while tracing.

@item 
gh-96421@footnote{https://github.com/python/cpython/issues/96421}: When calling into Python code from C code, through
@ref{1234,,PyEval_EvalFrameEx()} or a related C-API function, a shim frame in
inserted into the call stack. This occurs in the
@code{_PyEval_EvalFrameDefault()} function. The extra frame should be
invisible to all Python and most C extensions, but out-of-process
profilers and debuggers need to be aware of it. These shim frames can be
detected by checking @code{frame->owner == FRAME_OWNED_BY_CSTACK}.

Extensions implementing their own interpreters using PEP 523 need to be
aware of this shim frame and the changes to the semantics of
@ref{1b64,,RETURN_VALUE}, @ref{5ba,,YIELD_VALUE}, and
@ref{90d,,RETURN_GENERATOR}, which now clear the frame.
@end itemize

@node Build<34>,Core and Builtins<77>,Core and Builtins<76>,Python 3 12 0 alpha 2
@anchor{whatsnew/changelog id387}@anchor{1b65}
@subsubsection Build



@itemize -

@item 
gh-98415@footnote{https://github.com/python/cpython/issues/98415}: Fix detection of MAC addresses for @ref{117,,uuid} on certain OSs.
Patch by Chaim Sanders
@end itemize

@node Core and Builtins<77>,Library<81>,Build<34>,Python 3 12 0 alpha 2
@anchor{whatsnew/changelog id388}@anchor{1b66}
@subsubsection Core and Builtins



@itemize -

@item 
gh-98686@footnote{https://github.com/python/cpython/issues/98686}: Quicken all code objects, and specialize adaptive bytecode
instructions more aggressively.

@item 
gh-92119@footnote{https://github.com/python/cpython/issues/92119}: Print exception class name instead of its string representation
when raising errors from @ref{2e,,ctypes} calls.

@item 
gh-91058@footnote{https://github.com/python/cpython/issues/91058}: @ref{65b,,ImportError} raised from failed @code{from <module> import
<name>} now include suggestions for the value of @code{<name>} based on the
available names in @code{<module>}. Patch by Pablo Galindo

@item 
gh-96793@footnote{https://github.com/python/cpython/issues/96793}: The @ref{1b09,,FOR_ITER} now leaves the iterator on the stack on
termination of the loop. This is to assist specialization of loops for
generators.

@item 
gh-90716@footnote{https://github.com/python/cpython/issues/90716}: Add _pylong.py module.  It includes asymptotically faster
algorithms that can be used for operations on integers with many digits.
It is used by longobject.c to speed up some operations.

@item 
gh-95389@footnote{https://github.com/python/cpython/issues/95389}: Expose @ref{1b67,,ETH_P_ALL} and some of the
@ref{1b68,,ETHERTYPE_* constants} in @ref{d1,,socket}.
Patch by Noam Cohen.
@end itemize

@node Library<81>,Documentation<30>,Core and Builtins<77>,Python 3 12 0 alpha 2
@anchor{whatsnew/changelog id389}@anchor{1b69}
@subsubsection Library



@itemize -

@item 
gh-93696@footnote{https://github.com/python/cpython/issues/93696}: Allow @ref{aa,,pdb} to locate source for frozen modules in the
standard library.

@item 
gh-99418@footnote{https://github.com/python/cpython/issues/99418}: Fix bug in @ref{360,,urllib.parse.urlparse()} that causes URL schemes
that begin with a digit, a plus sign, or a minus sign to be parsed
incorrectly.

@item 
gh-94597@footnote{https://github.com/python/cpython/issues/94597}: Deprecate @code{asyncio.AbstractChildWatcher} to be removed in
Python 3.14. Patch by Kumar Aditya.

@item 
gh-99305@footnote{https://github.com/python/cpython/issues/99305}: Improve performance of @ref{1b6a,,secrets.token_hex()}.

@item 
gh-74044@footnote{https://github.com/python/cpython/issues/74044}: Fixed bug where @ref{231,,inspect.signature()} reported incorrect
arguments for decorated methods.

@item 
gh-99275@footnote{https://github.com/python/cpython/issues/99275}: Fix @code{SystemError} in @ref{2e,,ctypes} when exception was not set
during @code{__initsubclass__}.

@item 
gh-99277@footnote{https://github.com/python/cpython/issues/99277}: Remove older version of
@code{_SSLProtocolTransport.get_write_buffer_limits} in
@code{asyncio.sslproto}

@item 
gh-99248@footnote{https://github.com/python/cpython/issues/99248}: fix negative numbers failing in verify()

@item 
gh-99155@footnote{https://github.com/python/cpython/issues/99155}: Fix @ref{c33,,statistics.NormalDist} pickle with @code{0} and @code{1}
protocols.

@item 
gh-93464@footnote{https://github.com/python/cpython/issues/93464}: @code{enum.auto()} is now correctly activated when combined with
other assignment values.  E.g. @code{ONE = auto(), 'some text'} will now
evaluate as @code{(1, 'some text')}.

@item 
gh-99134@footnote{https://github.com/python/cpython/issues/99134}: Update the bundled copy of pip to version 22.3.1.

@item 
gh-92584@footnote{https://github.com/python/cpython/issues/92584}: Remove the @code{distutils} package. It was deprecated in Python
3.10 by 
@geindex Python Enhancement Proposals; PEP 632
PEP 632@footnote{https://peps.python.org/pep-0632/} “Deprecate distutils module”. For projects still using
@code{distutils} and cannot be updated to something else, the @code{setuptools}
project can be installed: it still provides @code{distutils}. Patch by Victor
Stinner.

@item 
gh-98999@footnote{https://github.com/python/cpython/issues/98999}: Now @code{_pyio} is consistent with @code{_io} in raising
@code{ValueError} when executing methods over closed buffers.

@item 
gh-83004@footnote{https://github.com/python/cpython/issues/83004}: Clean up refleak on failed module initialisation in
@code{_zoneinfo}

@item 
gh-83004@footnote{https://github.com/python/cpython/issues/83004}: Clean up refleaks on failed module initialisation in
@code{_pickle}

@item 
gh-83004@footnote{https://github.com/python/cpython/issues/83004}: Clean up refleak on failed module initialisation in @code{_io}.

@item 
gh-98897@footnote{https://github.com/python/cpython/issues/98897}: Fix memory leak in @ref{bfb,,math.dist()} when both points don’t have
the same dimension. Patch by Kumar Aditya.

@item 
gh-98878@footnote{https://github.com/python/cpython/issues/98878}: Use the frame bound builtins when offering a name suggestion in
@ref{105,,traceback} to prevent crashing when @code{__builtins__} is not a dict.

@item 
gh-98139@footnote{https://github.com/python/cpython/issues/98139}: In @code{importlib._bootstrap}, enhance namespace package repr
to @code{<module 'x' (namespace) from ['path']>}.

@item 
gh-90352@footnote{https://github.com/python/cpython/issues/90352}: Fix @code{_SelectorDatagramTransport} to inherit from
@ref{1b6b,,DatagramTransport} in @ref{b,,asyncio}. Patch by Kumar
Aditya.

@item 
gh-98793@footnote{https://github.com/python/cpython/issues/98793}: Fix argument typechecks in @code{_overlapped.WSAConnect()} and
@code{_overlapped.Overlapped.WSASendTo()} functions.

@item 
gh-98744@footnote{https://github.com/python/cpython/issues/98744}: Prevent crashing in @ref{105,,traceback} when retrieving the
byte-offset for some source files that contain certain unicode characters.

@item 
gh-98740@footnote{https://github.com/python/cpython/issues/98740}: Fix internal error in the @ref{be,,re} module which in very rare
circumstances prevented compilation of a regular expression containing a
@ref{1b6c,,conditional expression} without the
“else” branch.

@item 
gh-98703@footnote{https://github.com/python/cpython/issues/98703}: Fix @ref{1b6d,,asyncio.StreamWriter.drain()} to call
@code{protocol.connection_lost} callback only once on Windows.

@item 
gh-98624@footnote{https://github.com/python/cpython/issues/98624}: Add a mutex to unittest.mock.NonCallableMock to protect
concurrent access to mock attributes.

@item 
gh-98658@footnote{https://github.com/python/cpython/issues/98658}: The @ref{4bf,,array.array} class now supports subscripting, making
it a @ref{1a2,,generic type}.

@item 
gh-98284@footnote{https://github.com/python/cpython/issues/98284}: Improved @ref{199,,TypeError} message for undefined abstract
methods of a @ref{1120,,abc.ABC} instance. The names of the missing methods
are surrounded by single-quotes to highlight them.

@item 
gh-96151@footnote{https://github.com/python/cpython/issues/96151}: Allow @code{BUILTINS} to be a valid field name for frozen
dataclasses.

@item 
gh-98086@footnote{https://github.com/python/cpython/issues/98086}: Make sure @code{patch.dict()} can be applied on async functions.

@item 
gh-72719@footnote{https://github.com/python/cpython/issues/72719}: Remove modules @code{asyncore} and @code{asynchat}, which were
deprecated by 
@geindex Python Enhancement Proposals; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}.

@item 
gh-96192@footnote{https://github.com/python/cpython/issues/96192}: Fix handling of @code{bytes} @ref{5a1,,path-like objects} in @code{os.ismount()}.

@item 
gh-94172@footnote{https://github.com/python/cpython/issues/94172}: @ref{62,,ftplib}: Remove the @code{FTP_TLS.ssl_version} class
attribute: use the `context' parameter instead. Patch by Victor Stinner

@item 
gh-94172@footnote{https://github.com/python/cpython/issues/94172}: Remove the `keyfile' and `certfile' parameters from the
@ref{62,,ftplib}, @ref{78,,imaplib}, @ref{b1,,poplib} and @ref{cf,,smtplib} modules,
and the `key_file', `cert_file' and `check_hostname' parameters from the
@ref{73,,http.client} module, all deprecated since Python 3.6. Use the
`context' parameter (`ssl_context' in @code{imaplib}) instead. Patch by
Victor Stinner.

@item 
gh-83638@footnote{https://github.com/python/cpython/issues/83638}: Add the @ref{6de,,autocommit} attribute to
@ref{54e,,sqlite3.Connection} and the `autocommit' parameter to
@ref{5a6,,sqlite3.connect()} to control 
@geindex Python Enhancement Proposals; PEP 249
PEP 249@footnote{https://peps.python.org/pep-0249/}-compliant @ref{6df,,transaction handling}. Patch by Erlend E.
Aasland.

@item 
gh-92452@footnote{https://github.com/python/cpython/issues/92452}: Fixed a race condition that could cause
@ref{175,,sysconfig.get_config_var()} to incorrectly return @ref{887,,None} in
multi-threaded programs.

@item 
gh-91803@footnote{https://github.com/python/cpython/issues/91803}: Fix an error when using a method of objects mocked with
@ref{1978,,unittest.mock.create_autospec()} after it was sealed with
@ref{da0,,unittest.mock.seal()} function.

@item 
bpo-38523@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38523}: @ref{c24,,shutil.copytree()} now applies the
`ignore_dangling_symlinks' argument recursively.

@item 
bpo-40358@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40358}: Add walk_up argument in @ref{2ff,,pathlib.PurePath.relative_to()}.

@item 
bpo-36267@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36267}: Fix IndexError in @ref{1bf,,argparse.ArgumentParser} when a
@code{store_true} action is given an explicit argument.
@end itemize

@node Documentation<30>,Tests<30>,Library<81>,Python 3 12 0 alpha 2
@anchor{whatsnew/changelog id390}@anchor{1b6e}
@subsubsection Documentation



@itemize -

@item 
gh-98832@footnote{https://github.com/python/cpython/issues/98832}: Changes wording of docstring for @ref{270,,pathlib.Path.iterdir()}.

@item 
gh-97966@footnote{https://github.com/python/cpython/issues/97966}: Update uname docs to clarify the special nature of the platform
attribute and to indicate when it became late-bound.
@end itemize

@node Tests<30>,Build<35>,Documentation<30>,Python 3 12 0 alpha 2
@anchor{whatsnew/changelog id391}@anchor{1b6f}
@subsubsection Tests



@itemize -

@item 
gh-98903@footnote{https://github.com/python/cpython/issues/98903}: The Python test suite now fails with exit code 4 if no tests
ran. It should help detecting typos in test names and test methods.

@item 
gh-98713@footnote{https://github.com/python/cpython/issues/98713}: Fix a bug in the @ref{10b,,typing} tests where a test relying on
CPython-specific implementation details was not decorated with
@code{@@cpython_only} and was not skipped on other implementations.

@item 
gh-87390@footnote{https://github.com/python/cpython/issues/87390}: Add tests for star-unpacking with PEP 646, and some other
miscellaneous PEP 646 tests.

@item 
gh-96853@footnote{https://github.com/python/cpython/issues/96853}: Added explicit coverage of @code{Py_Initialize} (and hence
@code{Py_InitializeEx}) back to the embedding tests (all other embedding
tests migrated to @code{Py_InitializeFromConfig} in Python 3.11)

@item 
bpo-34272@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34272}: Some C API tests were moved into the new Lib/test/test_capi/
directory.
@end itemize

@node Build<35>,Windows<30>,Tests<30>,Python 3 12 0 alpha 2
@anchor{whatsnew/changelog id392}@anchor{1b70}
@subsubsection Build



@itemize -

@item 
gh-99086@footnote{https://github.com/python/cpython/issues/99086}: Fix @code{-Wimplicit-int} compiler warning in @code{configure}
check for @code{PTHREAD_SCOPE_SYSTEM}.

@item 
gh-99016@footnote{https://github.com/python/cpython/issues/99016}: Fix build with @code{PYTHON_FOR_REGEN=python3.8}.

@item 
gh-97731@footnote{https://github.com/python/cpython/issues/97731}: Specify the full path to the source location for @code{make
docclean} (needed for cross-builds).

@item 
gh-98949@footnote{https://github.com/python/cpython/issues/98949}: Drop unused build dependency on @code{readelf}.

@item 
gh-98989@footnote{https://github.com/python/cpython/issues/98989}: Use @code{python3.11}, if available, for regeneration and freezing.

@item 
gh-98831@footnote{https://github.com/python/cpython/issues/98831}: Add new tooling, in @code{Tools/cases_generator}, to generate the
interpreter switch statement from a list of opcode definitions. This only
affects adding, modifying or removing instruction definitions. The
instruction definitions now live in @code{Python/bytecodes.c}, in the form of
a custom DSL (under development)@footnote{https://github.com/faster-cpython/ideas/blob/main/3.12/interpreter_definition.md}.
The tooling reads this file and writes @code{Python/generated_cases.c.h},
which is then included by @code{Python/ceval.c} to provide most of the cases
of the main interpreter switch.

@item 
gh-98817@footnote{https://github.com/python/cpython/issues/98817}: Remove PCbuild/lib.pyproj: it’s not used for anything, is only a
minor convenience for Visual Studio users (who probably mostly don’t even
know about it), and it takes a lot of maintenance effort to keep updated.

@item 
gh-98776@footnote{https://github.com/python/cpython/issues/98776}: Fix @code{make regen-test-levenshtein} for out-of-tree builds.

@item 
gh-98707@footnote{https://github.com/python/cpython/issues/98707}: Don’t use vendored @code{libmpdec} headers if
@ref{657,,--with-system-libmpdec} is passed to @code{configure}. Don’t
use vendored @code{libexpat} headers if @ref{1b71,,--with-system-expat} is
passed to @code{configure}.
@end itemize

@node Windows<30>,macOS<22>,Build<35>,Python 3 12 0 alpha 2
@anchor{whatsnew/changelog id393}@anchor{1b72}
@subsubsection Windows



@itemize -

@item 
gh-98689@footnote{https://github.com/python/cpython/issues/98689}: Update Windows builds to zlib v1.2.13.  v1.2.12 has
@geindex Common Vulnerabilities and Exposures; CVE 2022-37434
CVE 2022-37434@footnote{https://www.cve.org/CVERecord?id=CVE-2022-37434}, but the vulnerable @code{inflateGetHeader} API is not used
by Python.

@item 
gh-98790@footnote{https://github.com/python/cpython/issues/98790}: Assumes that a missing @code{DLLs} directory means that standard
extension modules are in the executable’s directory.

@item 
gh-98745@footnote{https://github.com/python/cpython/issues/98745}: Update @code{py.exe} launcher to install 3.11 by default and
3.12 on request.

@item 
gh-98692@footnote{https://github.com/python/cpython/issues/98692}: Fix the @ref{7db,,Python install manager} ignoring unrecognized shebang lines
instead of treating them as local paths

@item 
gh-94328@footnote{https://github.com/python/cpython/issues/94328}: Update Windows installer to use SQLite 3.39.4.
@end itemize

@node macOS<22>,C API<31>,Windows<30>,Python 3 12 0 alpha 2
@anchor{whatsnew/changelog id394}@anchor{1b73}
@subsubsection macOS



@itemize -

@item 
gh-94328@footnote{https://github.com/python/cpython/issues/94328}: Update macOS installer to SQLite 3.39.4.
@end itemize

@node C API<31>,,macOS<22>,Python 3 12 0 alpha 2
@anchor{whatsnew/changelog id395}@anchor{1b74}
@subsubsection C API



@itemize -

@item 
gh-98724@footnote{https://github.com/python/cpython/issues/98724}: The @ref{799,,Py_CLEAR}, @ref{79a,,Py_SETREF} and
@ref{79b,,Py_XSETREF} macros now only evaluate their argument once. If the
argument has side effects, these side effects are no longer duplicated.
Patch by Victor Stinner.

@item 
gh-98978@footnote{https://github.com/python/cpython/issues/98978}: Fix use-after-free in @code{Py_SetPythonHome(NULL)},
@code{Py_SetProgramName(NULL)} and @code{_Py_SetProgramFullPath(NULL)} function
calls. Issue reported by Benedikt Reinartz. Patch by Victor Stinner.

@item 
gh-98410@footnote{https://github.com/python/cpython/issues/98410}: Add @code{getbufferproc} and @code{releasebufferproc} to the stable
API.

@item 
gh-98610@footnote{https://github.com/python/cpython/issues/98610}: Some configurable capabilities of sub-interpreters have changed.
They always allow subprocesses (@ref{dc,,subprocess}) now, whereas before
subprocesses could be optionally disallowed for a sub-interpreter. Instead
@code{os.exec()} can now be disallowed. Disallowing daemon threads is now
supported.  Disallowing all threads is still allowed, but is never done by
default. Note that the optional restrictions are only available through
@code{_Py_NewInterpreterFromConfig()}, which isn’t a public API. They do not
affect the main interpreter, nor @ref{1b75,,Py_NewInterpreter()}.

@item 
gh-98608@footnote{https://github.com/python/cpython/issues/98608}: A @code{_PyInterpreterConfig} has been added and
@code{_Py_NewInterpreter()} has been renamed to
@code{_Py_NewInterpreterFromConfig()}.  The “isolated_subinterpreters”
argument is now a granular config that captures the previous behavior.
Note that this is all “private” API.

@item 
gh-96853@footnote{https://github.com/python/cpython/issues/96853}: @code{Py_InitializeEx} now correctly calls @code{PyConfig_Clear} after
initializing the interpreter (the omission didn’t cause a memory leak only
because none of the dynamically allocated config fields are populated by
the wrapper function)

@item 
gh-91248@footnote{https://github.com/python/cpython/issues/91248}: Add @ref{78a,,PyFrame_GetVar()} and @ref{78b,,PyFrame_GetVarString()}
functions to get a frame variable by its name. Patch by Victor Stinner.
@end itemize

@node Python 3 12 0 alpha 1,Python 3 11 0 beta 1,Python 3 12 0 alpha 2,Changelog
@anchor{whatsnew/changelog python-3-12-0-alpha-1}@anchor{1b76}
@subsection Python 3.12.0 alpha 1


`Release date: 2022-10-25'

@menu
* Security: Security<31>. 
* Core and Builtins: Core and Builtins<78>. 
* Library: Library<82>. 
* Core and Builtins: Core and Builtins<79>. 
* Library: Library<83>. 
* Core and Builtins: Core and Builtins<80>. 
* Library: Library<84>. 
* Core and Builtins: Core and Builtins<81>. 
* Library: Library<85>. 
* Core and Builtins: Core and Builtins<82>. 
* Library: Library<86>. 
* Core and Builtins: Core and Builtins<83>. 
* Library: Library<87>. 
* Core and Builtins: Core and Builtins<84>. 
* Library: Library<88>. 
* Core and Builtins: Core and Builtins<85>. 
* Library: Library<89>. 
* Core and Builtins: Core and Builtins<86>. 
* Library: Library<90>. 
* Core and Builtins: Core and Builtins<87>. 
* Library: Library<91>. 
* Documentation: Documentation<31>. 
* Tests: Tests<31>. 
* Build: Build<36>. 
* Windows: Windows<31>. 
* macOS: macOS<23>. 
* IDLE: IDLE<16>. 
* Tools/Demos: Tools/Demos<24>. 
* C API: C API<32>. 

@end menu

@node Security<31>,Core and Builtins<78>,,Python 3 12 0 alpha 1
@anchor{whatsnew/changelog id396}@anchor{1b77}
@subsubsection Security



@itemize -

@item 
gh-97616@footnote{https://github.com/python/cpython/issues/97616}: Fix multiplying a list by an integer (@code{list *= int}): detect
the integer overflow when the new allocated length is close to the maximum
size. Issue reported by Jordan Limor.  Patch by Victor Stinner.

@item 
gh-97514@footnote{https://github.com/python/cpython/issues/97514}: On Linux the @ref{98,,multiprocessing} module returns to using
filesystem backed unix domain sockets for communication with the
`forkserver' process instead of the Linux abstract socket namespace.  Only
code that chooses to use the @ref{1d7,,“forkserver” start method} is affected.

Abstract sockets have no permissions and could allow any user on the
system in the same network namespace@footnote{https://man7.org/linux/man-pages/man7/network_namespaces.7.html} (often
the whole system) to inject code into the multiprocessing `forkserver'
process. This was a potential privilege escalation. Filesystem based
socket permissions restrict this to the `forkserver' process user as was
the default in Python 3.8 and earlier.

This prevents Linux 
@geindex Common Vulnerabilities and Exposures; CVE 2022-42919
CVE 2022-42919@footnote{https://www.cve.org/CVERecord?id=CVE-2022-42919}.

@item 
gh-87389@footnote{https://github.com/python/cpython/issues/87389}: @ref{76,,http.server}: Fix an open redirection vulnerability in the
HTTP server when an URI path starts with @code{//}.  Vulnerability
discovered, and initial fix proposed, by Hamza Avvan.

@item 
gh-79096@footnote{https://github.com/python/cpython/issues/79096}: LWPCookieJar and MozillaCookieJar create files with file mode
600 instead of 644 (Microsoft Windows is not affected)

@item 
gh-92888@footnote{https://github.com/python/cpython/issues/92888}: Fix @code{memoryview} use after free when accessing the backing
buffer in certain cases.

@item 
gh-68966@footnote{https://github.com/python/cpython/issues/68966}: The deprecated mailcap module now refuses to inject unsafe text
(filenames, MIME types, parameters) into shell commands. Instead of using
such text, it will warn and act as if a match was not found (or for test
commands, as if the test failed).
@end itemize

@node Core and Builtins<78>,Library<82>,Security<31>,Python 3 12 0 alpha 1
@anchor{whatsnew/changelog id397}@anchor{1b78}
@subsubsection Core and Builtins



@itemize -

@item 
gh-98374@footnote{https://github.com/python/cpython/issues/98374}: Suppress ImportError for invalid query for help() command. Patch
by Donghee Na.

@item 
gh-98461@footnote{https://github.com/python/cpython/issues/98461}: Fix source location in bytecode for list, set and dict
comprehensions as well as generator expressions.

@item 
gh-98354@footnote{https://github.com/python/cpython/issues/98354}: Added unicode check for @code{name} attribute of @code{spec} argument
passed in @code{_imp.create_builtin()} function.

@item 
gh-98398@footnote{https://github.com/python/cpython/issues/98398}: Fix source location of ‘assert’ bytecodes.

@item 
gh-98390@footnote{https://github.com/python/cpython/issues/98390}: Fix location of sub-expressions of boolean expressions, by
reducing their scope to that of the sub-expression.

@item 
gh-98254@footnote{https://github.com/python/cpython/issues/98254}: Modules from the standard library are now potentially suggested
as part of the error messages displayed by the interpreter when an
@ref{450,,NameError} is raised to the top level. Patch by Pablo Galindo

@item 
gh-97997@footnote{https://github.com/python/cpython/issues/97997}: Add running column offset to the tokenizer state to avoid
calculating AST column information with pointer arithmetic.

@item 
gh-97973@footnote{https://github.com/python/cpython/issues/97973}: Modify the tokenizer to return all necessary information the
parser needs to set location information in the AST nodes, so that the
parser does not have to calculate those doing pointer arithmetic.
@end itemize

@node Library<82>,Core and Builtins<79>,Core and Builtins<78>,Python 3 12 0 alpha 1
@anchor{whatsnew/changelog id398}@anchor{1b79}
@subsubsection Library



@itemize -

@item 
gh-96078@footnote{https://github.com/python/cpython/issues/96078}: @ref{131d,,os.sched_yield()} now release the GIL while calling
sched_yield(2). Patch by Donghee Na.

@item 
gh-97955@footnote{https://github.com/python/cpython/issues/97955}: Migrate @ref{13b,,zoneinfo} to Argument Clinic.
@end itemize

@node Core and Builtins<79>,Library<83>,Library<82>,Python 3 12 0 alpha 1
@anchor{whatsnew/changelog id399}@anchor{1b7a}
@subsubsection Core and Builtins



@itemize -

@item 
gh-97912@footnote{https://github.com/python/cpython/issues/97912}: The compiler now avoids quadratic behavior when finding which
instructions should use the @ref{70c,,LOAD_FAST_CHECK} opcode.

@item 
gh-97002@footnote{https://github.com/python/cpython/issues/97002}: Fix an issue where several frame objects could be backed by the
same interpreter frame, possibly leading to corrupted memory and hard
crashes of the interpreter.

@item 
gh-97943@footnote{https://github.com/python/cpython/issues/97943}: Bugfix: @ref{1b7b,,PyFunction_GetAnnotations()} should return a
borrowed reference. It was returning a new reference.

@item 
gh-97922@footnote{https://github.com/python/cpython/issues/97922}: The Garbage Collector now runs only on the eval breaker
mechanism of the Python bytecode evaluation loop instead on object
allocations. The GC can also run when @ref{694,,PyErr_CheckSignals()} is
called so C extensions that need to run for a long time without executing
any Python code also have a chance to execute the GC periodically.

@item 
gh-65961@footnote{https://github.com/python/cpython/issues/65961}: When @code{__package__} is different than @code{__spec__.parent},
raise a @code{DeprecationWarning} instead of @code{ImportWarning}.

Also remove @code{importlib.util.set_package()} which was scheduled for
removal.

@item 
gh-97850@footnote{https://github.com/python/cpython/issues/97850}: Long deprecated, @code{module_repr()} should now be completely
eradicated.

@item 
gh-86298@footnote{https://github.com/python/cpython/issues/86298}: In cases where @code{warnings.warn_explicit()} consults the
module’s loader, an @code{DeprecationWarning} is issued when @code{m.__loader__}
differs from @code{m.__spec__.loader}.

@item 
gh-97779@footnote{https://github.com/python/cpython/issues/97779}: Ensure that all Python frame objects are backed by “complete”
frames.

@item 
gh-91052@footnote{https://github.com/python/cpython/issues/91052}: Add API for subscribing to modification events on selected
dictionaries.

@item 
gh-97752@footnote{https://github.com/python/cpython/issues/97752}: Fix possible data corruption or crashes when accessing the
@code{f_back} member of newly-created generator or coroutine frames.

@item 
gh-97591@footnote{https://github.com/python/cpython/issues/97591}: Fixed a missing incref/decref pair in
@code{Exception.__setstate__()}. Patch by Ofey Chan.

@item 
gh-97670@footnote{https://github.com/python/cpython/issues/97670}: Remove the @code{sys.getdxp()} function and the
@code{Tools/scripts/analyze_dxp.py} script. DXP stands for “dynamic execution
pairs”. They were related to @code{DYNAMIC_EXECUTION_PROFILE} and @code{DXPAIRS}
macros which have been removed in Python 3.11. Python can now be built
with @ref{1b7c,,./configure --enable-pystats} to gather
statistics on Python opcodes.  Patch by Victor Stinner.

@item 
gh-94526@footnote{https://github.com/python/cpython/issues/94526}: Fix the Python path configuration used to initialized
@ref{3e2,,sys.path} at Python startup. Paths are no longer encoded to
UTF-8/strict to avoid encoding errors if it contains surrogate characters
(bytes paths are decoded with the surrogateescape error handler). Patch by
Victor Stinner.

@item 
gh-96670@footnote{https://github.com/python/cpython/issues/96670}: The parser now raises @ref{18f,,SyntaxError} when parsing source
code containing null bytes. Patch by Pablo Galindo

@item 
gh-96975@footnote{https://github.com/python/cpython/issues/96975}: Fix a crash occurring when @ref{1b7d,,PyEval_GetFrame()} is called
while the topmost Python frame is in a partially-initialized state.

@item 
gh-96848@footnote{https://github.com/python/cpython/issues/96848}: Fix command line parsing: reject @ref{170,,-X int_max_str_digits} option with no value (invalid) when the
@geindex PYTHONINTMAXSTRDIGITS
@geindex environment variable; PYTHONINTMAXSTRDIGITS
@ref{1b7e,,PYTHONINTMAXSTRDIGITS} environment variable is set to a valid
limit. Patch by Victor Stinner.

@item 
gh-95921@footnote{https://github.com/python/cpython/issues/95921}: Fix overly-broad source position information for chained
comparisons used as branching conditions.
@end itemize

@node Library<83>,Core and Builtins<80>,Core and Builtins<79>,Python 3 12 0 alpha 1
@anchor{whatsnew/changelog id400}@anchor{1b7f}
@subsubsection Library



@itemize -

@item 
gh-96821@footnote{https://github.com/python/cpython/issues/96821}: Fix undefined behaviour in @code{audioop.c}.
@end itemize

@node Core and Builtins<80>,Library<84>,Library<83>,Python 3 12 0 alpha 1
@anchor{whatsnew/changelog id401}@anchor{1b80}
@subsubsection Core and Builtins



@itemize -

@item 
gh-96821@footnote{https://github.com/python/cpython/issues/96821}: Fix undefined behaviour in @code{_testcapimodule.c}.

@item 
gh-95778@footnote{https://github.com/python/cpython/issues/95778}: When @ref{2ee,,ValueError} is raised if an integer is larger than
the limit, mention the @ref{1769,,sys.set_int_max_str_digits()} function in the
error message. Patch by Victor Stinner.

@item 
gh-96387@footnote{https://github.com/python/cpython/issues/96387}: At Python exit, sometimes a thread holding the GIL can wait
forever for a thread (usually a daemon thread) which requested to drop the
GIL, whereas the thread already exited. To fix the race condition, the
thread which requested the GIL drop now resets its request before exiting.
Issue discovered and analyzed by Mingliang ZHAO. Patch by Victor Stinner.

@item 
gh-96864@footnote{https://github.com/python/cpython/issues/96864}: Fix a possible assertion failure, fatal error, or
@ref{796,,SystemError} if a line tracing event raises an exception while
opcode tracing is enabled.

@item 
gh-95778@footnote{https://github.com/python/cpython/issues/95778}: The @code{PyLong_FromString} function was refactored to make it
more maintainable and extensible.

@item 
gh-96678@footnote{https://github.com/python/cpython/issues/96678}: Fix undefined behaviour in C code of null pointer arithmetic.

@item 
gh-96754@footnote{https://github.com/python/cpython/issues/96754}: Make sure that all frame objects created are created from valid
interpreter frames. Prevents the possibility of invalid frames in
backtraces and signal handlers.

@item 
gh-90997@footnote{https://github.com/python/cpython/issues/90997}: Improve the performance of reading and writing inline bytecode
caches on some platforms.

@item 
gh-96751@footnote{https://github.com/python/cpython/issues/96751}: Remove dead code from @code{CALL_FUNCTION_EX} opcode.

@item 
gh-90751@footnote{https://github.com/python/cpython/issues/90751}: @ref{166,,memoryview} now supports half-floats. Patch by Donghee
Na and Antoine Pitrou.

@item 
gh-96678@footnote{https://github.com/python/cpython/issues/96678}: Fix case of undefined behavior in ceval.c
@end itemize

@node Library<84>,Core and Builtins<81>,Core and Builtins<80>,Python 3 12 0 alpha 1
@anchor{whatsnew/changelog id402}@anchor{1b81}
@subsubsection Library



@itemize -

@item 
gh-64373@footnote{https://github.com/python/cpython/issues/64373}: Convert @code{_functools} to argument clinic.

@item 
gh-96641@footnote{https://github.com/python/cpython/issues/96641}: Do not expose @code{KeyWrapper} in @code{_functools}.
@end itemize

@node Core and Builtins<81>,Library<85>,Library<84>,Python 3 12 0 alpha 1
@anchor{whatsnew/changelog id403}@anchor{1b82}
@subsubsection Core and Builtins



@itemize -

@item 
gh-96636@footnote{https://github.com/python/cpython/issues/96636}: Ensure that tracing, @code{sys.setrace()}, is turned on
immediately. In pre-release versions of 3.11, some tracing events might
have been lost when turning on tracing in a @code{__del__} method or
interrupt.

@item 
gh-96572@footnote{https://github.com/python/cpython/issues/96572}: Fix use after free in trace refs build mode. Patch by Kumar
Aditya.

@item 
gh-96611@footnote{https://github.com/python/cpython/issues/96611}: When loading a file with invalid UTF-8 inside a multi-line
string, a correct SyntaxError is emitted.

@item 
gh-96612@footnote{https://github.com/python/cpython/issues/96612}: Make sure that incomplete frames do not show up in tracemalloc
traces.

@item 
gh-90230@footnote{https://github.com/python/cpython/issues/90230}: Fix compiler warnings and test failures when building with
@code{--enable-pystats}.

@item 
gh-96587@footnote{https://github.com/python/cpython/issues/96587}: Correctly raise @code{SyntaxError} on exception groups (
@geindex Python Enhancement Proposals; PEP 654
PEP 654@footnote{https://peps.python.org/pep-0654/})
on python versions prior to 3.11

@item 
gh-96569@footnote{https://github.com/python/cpython/issues/96569}: Remove two cases of undefined behavior, by adding NULL checks.

@item 
gh-96582@footnote{https://github.com/python/cpython/issues/96582}: Fix possible @code{NULL} pointer dereference in
@code{_PyThread_CurrentFrames}. Patch by Kumar Aditya.

@item 
gh-91079@footnote{https://github.com/python/cpython/issues/91079}: Separate Python recursion checking from C recursion checking
which reduces the chance of C stack overflow and allows the recursion
limit to be increased safely.

@item 
gh-93911@footnote{https://github.com/python/cpython/issues/93911}: Fix an issue that could prevent @ref{705,,LOAD_ATTR} from
specializing properly when accessing properties.

@item 
gh-96348@footnote{https://github.com/python/cpython/issues/96348}: Emit a DeprecationWarning when @ref{71d,,throw()},
@ref{71c,,throw()} or @ref{71e,,athrow()} are called with more than
one argument.

@item 
gh-95196@footnote{https://github.com/python/cpython/issues/95196}: Disable incorrect pickling of the C implemented classmethod
descriptors.

@item 
gh-96364@footnote{https://github.com/python/cpython/issues/96364}: Fix text signatures of @code{list.__getitem__} and
@code{dict.__getitem__}.

@item 
gh-96352@footnote{https://github.com/python/cpython/issues/96352}: Fix @ref{5f0,,AttributeError} missing @code{name} and @code{obj}
attributes in @ref{dd1,,object.__getattribute__()}. Patch by Philip Georgi.

@item 
gh-93554@footnote{https://github.com/python/cpython/issues/93554}: Change the jump opcodes so that all conditional jumps are
forward jumps. Backward jumps are converted by the assembler into a
conditional forward jump whose target is the fallthrough block (and with a
reversed condition), followed by an unconditional backward jump. For
example:

@code{POP_JUMP_IF_TRUE BACKWARD_TARGET} becomes @code{POP_JUMP_IF_FALSE
NEXT_BLOCK; JUMP BACKWARD_TARGET}.

All the directed conditional jump opcodes were removed:
@code{POP_JUMP_FORWARD_IF_TRUE}, @code{POP_JUMP_BACKWARD_IF_TRUE},
@code{POP_JUMP_FORWARD_IF_FALSE}, @code{POP_JUMP_BACKWARD_IF_FALSE},
@code{POP_JUMP_FORWARD_IF_NONE}, @code{POP_JUMP_BACKWARD_IF_NONE},
@code{POP_JUMP_FORWARD_IF_NOT_NONE}, @code{POP_JUMP_BACKWARD_IF_NOT_NONE}.

The corresponding opcodes without direction are no longer
pseudo-instructions, and they implement the forward conditional jumps.

@item 
gh-96268@footnote{https://github.com/python/cpython/issues/96268}: Loading a file with invalid UTF-8 will now report the broken
character at the correct location.

@item 
gh-96237@footnote{https://github.com/python/cpython/issues/96237}: The internal field @code{_PyInterpreterFrame.f_func} is renamed to
@code{_PyInterpreterFrame.f_funcobj} and may be any object. The @code{f_globals}
and @code{f_builtin} fields may hold junk values.

It is safest to treat the @code{_PyInterpreterFrame} struct as opaque.

@item 
gh-96187@footnote{https://github.com/python/cpython/issues/96187}: Fixed a bug that caused @code{_PyCode_GetExtra} to return garbage
for negative indexes. Patch by Pablo Galindo

@item 
gh-96143@footnote{https://github.com/python/cpython/issues/96143}: Add a new @code{-X perf} Python command line option as well as
@ref{69b,,sys.activate_stack_trampoline()} and
@ref{69c,,sys.deactivate_stack_trampoline()} function in the @ref{df,,sys} module
that allows to set/unset the interpreter in a way that the Linux @code{perf}
profiler can detect Python calls. The new
@ref{69d,,sys.is_stack_trampoline_active()} function allows to query the state
of the perf trampoline. Design by Pablo Galindo. Patch by Pablo Galindo
and Christian Heimes with contributions from Gregory P. Smith [Google] and
Mark Shannon.

@item 
gh-96071@footnote{https://github.com/python/cpython/issues/96071}: Fix a deadlock in @ref{64a,,PyGILState_Ensure()} when allocating
new thread state. Patch by Kumar Aditya.

@item 
gh-96046@footnote{https://github.com/python/cpython/issues/96046}: @ref{985,,PyType_Ready()} now initializes @code{ht_cached_keys} and
performs additional checks to ensure that type objects are properly
configured. This avoids crashes in 3rd party packages that don’t use
regular API to create new types.

@item 
gh-96005@footnote{https://github.com/python/cpython/issues/96005}: On WASI @ref{1b83,,ENOTCAPABLE} is now mapped to
@ref{f44,,PermissionError}. The @ref{5b,,errno} modules exposes the new error
number. @code{getpath.py} now ignores @code{PermissionError} when it cannot
open landmark files @code{pybuilddir.txt} and @code{pyenv.cfg}.

@item 
gh-93678@footnote{https://github.com/python/cpython/issues/93678}: Added test a harness for direct unit tests of the compiler’s
optimization stage. The @code{_testinternalcapi.optimize_cfg()} function runs
the optimiser on a sequence of instructions. The
@code{CfgOptimizationTestCase} class in @code{test.support} has utilities for
invoking the optimizer and checking the output.

@item 
gh-95245@footnote{https://github.com/python/cpython/issues/95245}: Reduces the size of a “simple” Python object from 8 to 6 words
by moving the weakreflist pointer into the pre-header directly before the
object’s dict/values pointer.

@item 
gh-90997@footnote{https://github.com/python/cpython/issues/90997}: Compile virtual @ref{8fa,,try}/@ref{1ac,,except} blocks to
handle exceptions raised during @ref{17e5,,close()} or
@ref{71d,,throw()} calls through a suspended frame.

@item 
gh-95977@footnote{https://github.com/python/cpython/issues/95977}: Optimized calling @ref{16f4,,__get__()} with vectorcall. Patch
by Kumar Aditya.

@item 
gh-91210@footnote{https://github.com/python/cpython/issues/91210}: Improve error message when a parameter without a default value
follows one with a default value, and show the same message, even when the
non-default/default sequence is preceded by positional-only parameters.

@item 
gh-95922@footnote{https://github.com/python/cpython/issues/95922}: Fixed bug where the compiler’s @code{eliminate_empty_basic_blocks}
function ignores the last block of the code unit.

@item 
gh-95818@footnote{https://github.com/python/cpython/issues/95818}: Skip over incomplete frames in @ref{996,,PyThreadState_GetFrame()}.

@item 
gh-95876@footnote{https://github.com/python/cpython/issues/95876}: Fix format string in @code{_PyPegen_raise_error_known_location}
that can lead to memory corruption on some 64bit systems. The function was
building a tuple with @code{i} (int) instead of @code{n} (Py_ssize_t) for
Py_ssize_t arguments.

@item 
gh-95605@footnote{https://github.com/python/cpython/issues/95605}: Fix misleading contents of error message when converting an
all-whitespace string to @ref{197,,float}.

@item 
gh-95150@footnote{https://github.com/python/cpython/issues/95150}: Update code object hashing and equality to consider all
debugging and exception handling tables. This fixes an issue where certain
non-identical code objects could be “deduplicated” during compilation.

@item 
gh-91146@footnote{https://github.com/python/cpython/issues/91146}: Reduce allocation size of @ref{24f,,list} from @ref{10b0,,str.split()}
and @ref{1461,,str.rsplit()}. Patch by Donghee Na and Inada Naoki.

@item 
gh-87092@footnote{https://github.com/python/cpython/issues/87092}: Create a ‘jump target label’ abstraction in the compiler so that
the compiler’s codegen stage does not work directly with basic blocks.
This prepares the code for changes to the underlying CFG generation
mechanism.

@item 
gh-95355@footnote{https://github.com/python/cpython/issues/95355}: @code{_PyPegen_Parser_New} now properly detects token memory
allocation errors. Patch by Honglin Zhu.

@item 
gh-90081@footnote{https://github.com/python/cpython/issues/90081}: Run Python code in tracer/profiler function at full speed. Fixes
slowdown in earlier versions of 3.11.

@item 
gh-95324@footnote{https://github.com/python/cpython/issues/95324}: Emit a warning in debug mode if an object does not call
@ref{1711,,PyObject_GC_UnTrack()} before deallocation. Patch by Pablo Galindo.

@item 
gh-95245@footnote{https://github.com/python/cpython/issues/95245}: Merge managed dict and values pointer into a single tagged
pointer to save one word in the pre-header.

@item 
gh-93678@footnote{https://github.com/python/cpython/issues/93678}: Add cfg_builder struct and refactor the relevant code so that a
cfg can be constructed without an instance of the compiler struct.

@item 
gh-95185@footnote{https://github.com/python/cpython/issues/95185}: Prevented crashes in the AST constructor when compiling some
absurdly long expressions like @code{"+0"*1000000}. @ref{f6e,,RecursionError} is
now raised instead. Patch by Pablo Galindo

@item 
gh-93351@footnote{https://github.com/python/cpython/issues/93351}: @ref{4c4,,ast.AST} node positions are now validated when provided
to @ref{4b2,,compile()} and other related functions. If invalid positions are
detected, a @ref{2ee,,ValueError} will be raised.

@item 
gh-94438@footnote{https://github.com/python/cpython/issues/94438}: Fix an issue that caused extended opcode arguments and some
conditional pops to be ignored when calculating valid jump targets for
assignments to the @code{f_lineno} attribute of frame objects. In some cases,
this could cause inconsistent internal state, resulting in a hard crash of
the interpreter.

@item 
gh-95060@footnote{https://github.com/python/cpython/issues/95060}: Undocumented @code{PyCode_Addr2Location} function now properly
returns when @code{addrq} argument is less than zero.

@item 
gh-95113@footnote{https://github.com/python/cpython/issues/95113}: Replace all @code{EXTENDED_ARG_QUICK} instructions with basic
@ref{1b62,,EXTENDED_ARG} instructions in unquickened code. Consumers of
non-adaptive bytecode should be able to handle extended arguments the same
way they were handled in CPython 3.10 and older.

@item 
gh-91409@footnote{https://github.com/python/cpython/issues/91409}: Fix incorrect source location info caused by certain
optimizations in the bytecode compiler.
@end itemize

@node Library<85>,Core and Builtins<82>,Core and Builtins<81>,Python 3 12 0 alpha 1
@anchor{whatsnew/changelog id404}@anchor{1b84}
@subsubsection Library



@itemize -

@item 
gh-95023@footnote{https://github.com/python/cpython/issues/95023}: Implement @ref{1b85,,os.setns()} and  @ref{1b86,,os.unshare()} for Linux.
Patch by Noam Cohen.
@end itemize

@node Core and Builtins<82>,Library<86>,Library<85>,Python 3 12 0 alpha 1
@anchor{whatsnew/changelog id405}@anchor{1b87}
@subsubsection Core and Builtins



@itemize -

@item 
gh-94036@footnote{https://github.com/python/cpython/issues/94036}: Fix incorrect source location info for some multi-line attribute
accesses and method calls.

@item 
gh-94938@footnote{https://github.com/python/cpython/issues/94938}: Fix error detection in some builtin functions when keyword
argument name is an instance of a str subclass with overloaded @code{__eq__}
and @code{__hash__}. Previously it could cause SystemError or other undesired
behavior.
@end itemize

@node Library<86>,Core and Builtins<83>,Core and Builtins<82>,Python 3 12 0 alpha 1
@anchor{whatsnew/changelog id406}@anchor{1b88}
@subsubsection Library



@itemize -

@item 
gh-94996@footnote{https://github.com/python/cpython/issues/94996}: @ref{1c4,,ast.parse()} will no longer parse function definitions with
positional-only params when passed @code{feature_version} less than @code{(3,
8)}. Patch by Shantanu Jain.
@end itemize

@node Core and Builtins<83>,Library<87>,Library<86>,Python 3 12 0 alpha 1
@anchor{whatsnew/changelog id407}@anchor{1b89}
@subsubsection Core and Builtins



@itemize -

@item 
gh-94739@footnote{https://github.com/python/cpython/issues/94739}: Allow jumping within, out of, and across exception handlers in
the debugger.
@end itemize

@node Library<87>,Core and Builtins<84>,Core and Builtins<83>,Python 3 12 0 alpha 1
@anchor{whatsnew/changelog id408}@anchor{1b8a}
@subsubsection Library



@itemize -

@item 
gh-94949@footnote{https://github.com/python/cpython/issues/94949}: @ref{1c4,,ast.parse()} will no longer parse parenthesized context
managers when passed @code{feature_version} less than @code{(3, 9)}. Patch by
Shantanu Jain.

@item 
gh-94947@footnote{https://github.com/python/cpython/issues/94947}: @ref{1c4,,ast.parse()} will no longer parse assignment expressions
when passed @code{feature_version} less than @code{(3, 8)}. Patch by Shantanu
Jain.
@end itemize

@node Core and Builtins<84>,Library<88>,Library<87>,Python 3 12 0 alpha 1
@anchor{whatsnew/changelog id409}@anchor{1b8b}
@subsubsection Core and Builtins



@itemize -

@item 
gh-91256@footnote{https://github.com/python/cpython/issues/91256}: Ensures the program name is known for help text during
interpreter startup.

@item 
gh-94869@footnote{https://github.com/python/cpython/issues/94869}: Fix the column offsets for some expressions in multi-line
f-strings @ref{9,,ast} nodes. Patch by Pablo Galindo.

@item 
gh-94893@footnote{https://github.com/python/cpython/issues/94893}: Fix an issue where frame object manipulations could corrupt
inline bytecode caches.

@item 
gh-94822@footnote{https://github.com/python/cpython/issues/94822}: Fix an issue where lookups of metaclass descriptors may be
ignored when an identically-named attribute also exists on the class
itself.

@item 
gh-91153@footnote{https://github.com/python/cpython/issues/91153}: Fix an issue where a @ref{342,,bytearray} item assignment could
crash if it’s resized by the new value’s @code{__index__()} method.

@item 
gh-90699@footnote{https://github.com/python/cpython/issues/90699}: Fix reference counting bug in @code{bool.__repr__()}. Patch by
Kumar Aditya.

@item 
gh-94694@footnote{https://github.com/python/cpython/issues/94694}: Fix an issue that could cause code with multi-line method
lookups to have misleading or incorrect column offset information. In some
cases (when compiling a hand-built AST) this could have resulted in a hard
crash of the interpreter.

@item 
gh-93252@footnote{https://github.com/python/cpython/issues/93252}: Fix an issue that caused internal frames to outlive failed
Python function calls, possibly resulting in memory leaks or hard
interpreter crashes.

@item 
gh-94215@footnote{https://github.com/python/cpython/issues/94215}: Fix an issue where exceptions raised by line-tracing events
would cause frames to be left in an invalid state, possibly resulting in a
hard crash of the interpreter.

@item 
gh-92228@footnote{https://github.com/python/cpython/issues/92228}: Disable the compiler’s inline-small-exit-blocks optimization for
exit blocks that are associated with source code lines. This fixes a bug
where the debugger cannot tell where an exception handler ends and the
following code block begins.

@item 
gh-94485@footnote{https://github.com/python/cpython/issues/94485}: Line number of a module’s @code{RESUME} instruction is set to 0 as
specified in 
@geindex Python Enhancement Proposals; PEP 626
PEP 626@footnote{https://peps.python.org/pep-0626/}.

@item 
gh-94438@footnote{https://github.com/python/cpython/issues/94438}: Account for instructions that can push NULL to the stack when
setting line number in a frame. Prevents some (unlikely) crashes.

@item 
gh-91719@footnote{https://github.com/python/cpython/issues/91719}: Reload @code{opcode} when raising @code{unknown opcode error} in the
interpreter main loop, for C compilers to generate dispatching code
independently.

@item 
gh-94329@footnote{https://github.com/python/cpython/issues/94329}: Compile and run code with unpacking of extremely large sequences
(1000s of elements). Such code failed to compile. It now compiles and runs
correctly.

@item 
gh-94360@footnote{https://github.com/python/cpython/issues/94360}: Fixed a tokenizer crash when reading encoded files with syntax
errors from @code{stdin} with non utf-8 encoded text. Patch by Pablo Galindo

@item 
gh-88116@footnote{https://github.com/python/cpython/issues/88116}: Fix an issue when reading line numbers from code objects if the
encoded line numbers are close to @code{INT_MIN}. Patch by Pablo Galindo

@item 
gh-94262@footnote{https://github.com/python/cpython/issues/94262}: Don’t create frame objects for incomplete frames. Prevents the
creation of generators and closures from being observable to Python and C
extensions, restoring the behavior of 3.10 and earlier.

@item 
gh-94192@footnote{https://github.com/python/cpython/issues/94192}: Fix error for dictionary literals with invalid expression as
value.

@item 
gh-87995@footnote{https://github.com/python/cpython/issues/87995}: @ref{699,,types.MappingProxyType} instances are now hashable if
the underlying mapping is hashable.

@item 
gh-93883@footnote{https://github.com/python/cpython/issues/93883}: Revise the display strategy of traceback enhanced error
locations.  The indicators are only shown when the location doesn’t span
the whole line.

@item 
gh-94163@footnote{https://github.com/python/cpython/issues/94163}: Add @ref{706,,BINARY_SLICE} and @ref{707,,STORE_SLICE}
instructions for more efficient handling and better specialization of
slicing operations, where the slice is explicit in the source code.

@item 
gh-94021@footnote{https://github.com/python/cpython/issues/94021}: Fix unreachable code warning in @code{Python/specialize.c}.

@item 
gh-93911@footnote{https://github.com/python/cpython/issues/93911}: Specialize @code{LOAD_ATTR} for objects with custom
@code{__getattribute__}.

@item 
gh-93955@footnote{https://github.com/python/cpython/issues/93955}: Improve performance of attribute lookups on objects with custom
@code{__getattribute__} and @code{__getattr__}. Patch by Ken Jin.

@item 
gh-93911@footnote{https://github.com/python/cpython/issues/93911}: Specialize @code{LOAD_ATTR} for @code{property()} attributes.

@item 
gh-93678@footnote{https://github.com/python/cpython/issues/93678}: Refactor compiler optimisation code so that it no longer needs
the @code{struct assembler} and @code{struct compiler} passed around. Instead,
each function takes the CFG and other data that it actually needs. This
will make it possible to test this code directly.

@item 
gh-93841@footnote{https://github.com/python/cpython/issues/93841}: When built with @code{-enable-pystats}, @code{sys._stats_on()},
@code{sys._stats_off()}, @code{sys._stats_clear()} and @code{sys._stats_dump()}
functions have been added to enable gathering stats for parts of programs.

@item 
gh-93516@footnote{https://github.com/python/cpython/issues/93516}: Store offset of first traceable instruction in code object to
avoid having to recompute it for each instruction when tracing.

@item 
gh-93516@footnote{https://github.com/python/cpython/issues/93516}: Lazily create a table mapping bytecode offsets to line numbers
to speed up calculation of line numbers when tracing.

@item 
gh-89828@footnote{https://github.com/python/cpython/issues/89828}: @ref{9f2,,types.GenericAlias} no longer relays the @code{__class__}
attribute. For example, @code{isinstance(list[int], type)} no longer returns
@code{True}.

@item 
gh-93678@footnote{https://github.com/python/cpython/issues/93678}: Refactor the compiler to reduce boilerplate and repetition.

@item 
gh-93671@footnote{https://github.com/python/cpython/issues/93671}: Fix some exponential backtrace case happening with deeply nested
sequence patterns in match statements. Patch by Pablo Galindo

@item 
gh-93662@footnote{https://github.com/python/cpython/issues/93662}: Make sure that the end column offsets are correct in multi-line
method calls. Previously, the end column could precede the column offset.
@end itemize

@node Library<88>,Core and Builtins<85>,Core and Builtins<84>,Python 3 12 0 alpha 1
@anchor{whatsnew/changelog id410}@anchor{1b8c}
@subsubsection Library



@itemize -

@item 
gh-93461@footnote{https://github.com/python/cpython/issues/93461}: @ref{e10,,importlib.invalidate_caches()} now drops entries from
@ref{7fb,,sys.path_importer_cache} with a relative path as name. This solves
a caching issue when a process changes its current working directory.

@code{FileFinder} no longer inserts a dot in the path, e.g. @code{/egg/./spam}
is now @code{/egg/spam}.
@end itemize

@node Core and Builtins<85>,Library<89>,Library<88>,Python 3 12 0 alpha 1
@anchor{whatsnew/changelog id411}@anchor{1b8d}
@subsubsection Core and Builtins



@itemize -

@item 
gh-93621@footnote{https://github.com/python/cpython/issues/93621}: Change order of bytecode instructions emitted for
@ref{187,,with} and @ref{186,,async with} to reduce the number of entries
in the exception table.

@item 
gh-93533@footnote{https://github.com/python/cpython/issues/93533}: Reduce the size of the inline cache for @code{LOAD_METHOD} by 2
bytes.

@item 
gh-93444@footnote{https://github.com/python/cpython/issues/93444}: Removed redundant fields from the compiler’s basicblock struct:
@code{b_nofallthrough}, @code{b_exit}, @code{b_return}. They can be easily
calculated from the opcode of the last instruction of the block.

@item 
gh-93429@footnote{https://github.com/python/cpython/issues/93429}: @code{LOAD_METHOD} instruction has been removed. It was merged back
into @code{LOAD_ATTR}.

@item 
gh-93418@footnote{https://github.com/python/cpython/issues/93418}: Fixed an assert where an f-string has an equal sign ‘=’
following an expression, but there’s no trailing brace. For example,
f”@{i=”.

@item 
gh-93382@footnote{https://github.com/python/cpython/issues/93382}: Cache the result of @ref{981,,PyCode_GetCode()} function to restore
the `O'(1) lookup of the @code{co_code} attribute.

@item 
gh-93359@footnote{https://github.com/python/cpython/issues/93359}: Ensure that custom @ref{9,,ast} nodes without explicit end
positions can be compiled. Patch by Pablo Galindo.

@item 
gh-93356@footnote{https://github.com/python/cpython/issues/93356}: Code for exception handlers is emitted at the end of the code
unit’s bytecode. This avoids one jump when no exception is raised.

@item 
gh-93354@footnote{https://github.com/python/cpython/issues/93354}: Use exponential backoff for specialization counters in the
interpreter. Can reduce the number of failed specializations significantly
and avoid slowdown for those parts of a program that are not suitable for
specialization.

@item 
gh-93283@footnote{https://github.com/python/cpython/issues/93283}: Improve error message for invalid syntax of conversion character
in f-string expressions.

@item 
gh-93345@footnote{https://github.com/python/cpython/issues/93345}: Fix a crash in substitution of a @code{TypeVar} in nested generic
alias after @code{TypeVarTuple}.

@item 
gh-93223@footnote{https://github.com/python/cpython/issues/93223}: When a bytecode instruction jumps to an unconditional jump
instruction, the first instruction can often be optimized to target the
unconditional jump’s target directly. For tracing reasons, this would
previously only occur if both instructions have the same line number. This
also now occurs if the unconditional jump is artificial, i.e., if it has
no associated line number.

@item 
gh-84694@footnote{https://github.com/python/cpython/issues/84694}: The @code{--experimental-isolated-subinterpreters} configure option
and @code{EXPERIMENTAL_ISOLATED_SUBINTERPRETERS} macro have been removed.

@item 
gh-91924@footnote{https://github.com/python/cpython/issues/91924}: Fix @code{__lltrace__} debug feature if the stdout encoding is not
UTF-8. Patch by Victor Stinner.

@item 
gh-93040@footnote{https://github.com/python/cpython/issues/93040}: Wraps unused parameters in @code{Objects/obmalloc.c} with
@code{Py_UNUSED}.

@item 
gh-93143@footnote{https://github.com/python/cpython/issues/93143}: Avoid @code{NULL} checks for uninitialized local variables by
determining at compile time which variables must be initialized.

@item 
gh-93061@footnote{https://github.com/python/cpython/issues/93061}: Backward jumps after @code{async for} loops are no longer given
dubious line numbers.

@item 
gh-93065@footnote{https://github.com/python/cpython/issues/93065}: Fix contextvars HAMT implementation to handle iteration over
deep trees.

The bug was discovered and fixed by Eli Libman. See
MagicStack/immutables#84@footnote{https://github.com/MagicStack/immutables/issues/84} for more details.

@item 
gh-93012@footnote{https://github.com/python/cpython/issues/93012}: Added the new function @ref{773,,PyType_FromMetaclass()}, which
generalizes the existing @ref{774,,PyType_FromModuleAndSpec()} using an
additional metaclass argument. This is useful for language binding tools,
where it can be used to intercept type-related operations like subclassing
or static attribute access by specifying a metaclass with custom slots.

Importantly, @ref{773,,PyType_FromMetaclass()} is available in the Limited
API, which provides a path towards migrating more binding tools onto the
Stable ABI.

@item 
gh-93021@footnote{https://github.com/python/cpython/issues/93021}: Fix the @code{__text_signature__} for @code{__get__()} methods
implemented in C. Patch by Jelle Zijlstra.

@item 
gh-89914@footnote{https://github.com/python/cpython/issues/89914}: The operand of the @code{YIELD_VALUE} instruction is set to the
stack depth. This is done to help frame handling on @code{yield} and may
assist debuggers.

@item 
gh-92955@footnote{https://github.com/python/cpython/issues/92955}: Fix memory leak in code object’s lines and positions iterators
as they were not finalized at exit. Patch by Kumar Aditya.

@item 
gh-92930@footnote{https://github.com/python/cpython/issues/92930}: Fixed a crash in @code{_pickle.c} from mutating collections during
@code{__reduce__} or @code{persistent_id}.

@item 
gh-90690@footnote{https://github.com/python/cpython/issues/90690}: The PRECALL instruction has been removed. It offered only a
small advantage for specialization and is not needed in the vast majority
of cases.

@item 
gh-92914@footnote{https://github.com/python/cpython/issues/92914}: Always round the allocated size for lists up to the nearest even
number.

@item 
gh-92858@footnote{https://github.com/python/cpython/issues/92858}: Improve error message for some suites with syntax error before
‘:’

@item 
gh-90473@footnote{https://github.com/python/cpython/issues/90473}: Decrease default recursion limit on WASI to address limited call
stack size.

@item 
gh-92804@footnote{https://github.com/python/cpython/issues/92804}: Fix memory leak in @code{memoryview} iterator as it was not
finalized at exit. Patch by Kumar Aditya.

@item 
gh-92777@footnote{https://github.com/python/cpython/issues/92777}: Specialize @code{LOAD_METHOD} for objects with lazy dictionaries.
Patch by Ken Jin.

@item 
gh-92658@footnote{https://github.com/python/cpython/issues/92658}: Add support for connecting and binding to Hyper-V sockets on
Windows Hyper-V hosts and guests.

@item 
gh-92236@footnote{https://github.com/python/cpython/issues/92236}: Remove spurious “LINE” event when starting a generator or
coroutine, visible tracing functions implemented in C.
@end itemize

@node Library<89>,Core and Builtins<86>,Core and Builtins<85>,Python 3 12 0 alpha 1
@anchor{whatsnew/changelog id412}@anchor{1b8e}
@subsubsection Library



@itemize -

@item 
gh-91102@footnote{https://github.com/python/cpython/issues/91102}: @code{_warnings.warn_explicit()} is ported to Argument Clinic.
@end itemize

@node Core and Builtins<86>,Library<90>,Library<89>,Python 3 12 0 alpha 1
@anchor{whatsnew/changelog id413}@anchor{1b8f}
@subsubsection Core and Builtins



@itemize -

@item 
gh-92619@footnote{https://github.com/python/cpython/issues/92619}: Make the compiler duplicate an exit block only if none of its
instructions have a lineno (previously only the first instruction in the
block was checked, leading to unnecessarily duplicated blocks).

@item 
gh-88750@footnote{https://github.com/python/cpython/issues/88750}: The deprecated debug build only @code{PYTHONTHREADDEBUG}
environment variable no longer does anything.
@end itemize

@node Library<90>,Core and Builtins<87>,Core and Builtins<86>,Python 3 12 0 alpha 1
@anchor{whatsnew/changelog id414}@anchor{1b90}
@subsubsection Library



@itemize -

@item 
gh-92261@footnote{https://github.com/python/cpython/issues/92261}: Fix hang when trying to iterate over a @code{typing.Union}.
@end itemize

@node Core and Builtins<87>,Library<91>,Library<90>,Python 3 12 0 alpha 1
@anchor{whatsnew/changelog id415}@anchor{1b91}
@subsubsection Core and Builtins



@itemize -

@item 
gh-91432@footnote{https://github.com/python/cpython/issues/91432}: Specialized the @ref{1b09,,FOR_ITER} opcode using the PEP 659
machinery

@item 
gh-91399@footnote{https://github.com/python/cpython/issues/91399}: Removed duplicate ‘@{0, 0, 0, 0, 0, 0@}’ entry in
‘Objects/unicodetype_db.h’.

@item 
gh-91578@footnote{https://github.com/python/cpython/issues/91578}: Updates the error message for abstract class.

@item 
bpo-47091@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47091}: Improve performance of repetition of @ref{24f,,list} and
@ref{614,,tuple} by using @code{memcpy} to copy data and performing the
reference increments in one step.

@item 
bpo-46142@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46142}: Make @code{--help} output shorter by moving some info to the new
@code{--help-env} and @code{--help-xoptions} command-line options. Also add
@code{--help-all} option to print complete usage.

@item 
bpo-42316@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42316}: Document some places where an assignment expression needs
parentheses.
@end itemize

@node Library<91>,Documentation<31>,Core and Builtins<87>,Python 3 12 0 alpha 1
@anchor{whatsnew/changelog id416}@anchor{1b92}
@subsubsection Library



@itemize -

@item 
gh-89237@footnote{https://github.com/python/cpython/issues/89237}: Fix hang on Windows in @code{subprocess.wait_closed()} in
@ref{b,,asyncio} with @ref{81e,,ProactorEventLoop}. Patch by Kumar
Aditya.

@item 
gh-97928@footnote{https://github.com/python/cpython/issues/97928}: @ref{1a36,,tkinter.Text.count()} raises now an exception for options
starting with “-” instead of silently ignoring them.

@item 
gh-98393@footnote{https://github.com/python/cpython/issues/98393}: The @ref{a5,,os} module no longer accepts bytes-like paths, like
@ref{342,,bytearray} and @ref{166,,memoryview} types: only the exact
@ref{193,,bytes} type is accepted for bytes strings. Patch by Victor
Stinner.

@item 
gh-98363@footnote{https://github.com/python/cpython/issues/98363}: Added itertools.batched() to batch data into lists of a given
length with the last list possibly being shorter than the others.

@item 
gh-98331@footnote{https://github.com/python/cpython/issues/98331}: Update the bundled copies of pip and setuptools to versions 22.3
and 65.5.0 respectively.

@item 
gh-98307@footnote{https://github.com/python/cpython/issues/98307}: A @ref{86d,,createSocket()} method
was added to @ref{86e,,SysLogHandler}.

@item 
gh-96035@footnote{https://github.com/python/cpython/issues/96035}: Fix bug in @ref{360,,urllib.parse.urlparse()} that causes certain
port numbers containing whitespace, underscores, plus and minus signs, or
non-ASCII digits to be incorrectly accepted.

@item 
gh-98257@footnote{https://github.com/python/cpython/issues/98257}: Make @ref{170a,,sys.setprofile()} and @ref{2e3,,sys.settrace()} functions
reentrant. They can no long fail with: @code{RuntimeError("Cannot install a
trace function while another trace function is being installed")}. Patch
by Victor Stinner.

@item 
gh-98251@footnote{https://github.com/python/cpython/issues/98251}: Allow @ref{118,,venv} to pass along @code{PYTHON*} variables to
@code{ensurepip} and @code{pip} when they do not impact path resolution

@item 
gh-94597@footnote{https://github.com/python/cpython/issues/94597}: Deprecated
@code{asyncio.AbstractEventLoopPolicy.get_child_watcher()} and
@code{asyncio.AbstractEventLoopPolicy.set_child_watcher()} methods to be
removed in Python 3.14. Patch by Kumar Aditya.

@item 
gh-98178@footnote{https://github.com/python/cpython/issues/98178}: On macOS, fix a crash in @ref{763,,syslog.syslog()} in multi-threaded
applications. On macOS, the libc @code{syslog()} function is not thread-safe,
so @code{syslog.syslog()} no longer releases the GIL to call it. Patch by
Victor Stinner.

@item 
gh-44098@footnote{https://github.com/python/cpython/issues/44098}: Release the GIL when creating @ref{51a,,mmap.mmap} objects on
Unix.

@item 
gh-87730@footnote{https://github.com/python/cpython/issues/87730}: Wrap network errors consistently in urllib FTP support, so the
test suite doesn’t fail when a network is available but the public
internet is not reachable.

@item 
gh-94597@footnote{https://github.com/python/cpython/issues/94597}: The child watcher classes
@code{MultiLoopChildWatcher},
@code{FastChildWatcher} and @code{SafeChildWatcher}
are deprecated and will be removed in Python 3.14. Patch by Kumar Aditya.

@item 
gh-98023@footnote{https://github.com/python/cpython/issues/98023}: Change default child watcher to
@code{PidfdChildWatcher} on Linux systems which supports it.
Patch by Kumar Aditya.

@item 
gh-90985@footnote{https://github.com/python/cpython/issues/90985}: Earlier in 3.11 we deprecated
@code{asyncio.Task.cancel("message")}. We realized we were too harsh, and
have undeprecated it.

@item 
gh-65961@footnote{https://github.com/python/cpython/issues/65961}: Do not rely solely on @code{__cached__} on modules; code will also
support @code{__spec__.cached}.

@item 
gh-97646@footnote{https://github.com/python/cpython/issues/97646}: Replace deprecated @code{application/javascript} with
@code{text/javascript} in @ref{93,,mimetypes}. See 
@geindex RFC; RFC 9239
RFC 9239@footnote{https://datatracker.ietf.org/doc/html/rfc9239.html}. Patch by Noam
Cohen.

@item 
gh-97930@footnote{https://github.com/python/cpython/issues/97930}: Apply changes from importlib_resources 5.8 and 5.9:
@code{Traversable.joinpath} provides a concrete implementation. @code{as_file}
now supports directories of resources.

@item 
gh-97850@footnote{https://github.com/python/cpython/issues/97850}: Remove deprecated @code{importlib.util.set_loader()} and
@code{importlib.util.module_for_loader()} from @ref{81,,importlib.util}.

@item 
gh-97837@footnote{https://github.com/python/cpython/issues/97837}: Change deprecate warning message in @ref{10d,,unittest} from

@code{It is deprecated to return a value!=None}

to

@code{It is deprecated to return a value that is not None from a test case}

@item 
gh-97825@footnote{https://github.com/python/cpython/issues/97825}: Fixes @ref{5f0,,AttributeError} when @ref{11c8,,subprocess.check_output()}
is used with argument @code{input=None} and either of the arguments
`encoding' or `errors' are used.

@item 
gh-97008@footnote{https://github.com/python/cpython/issues/97008}: @ref{450,,NameError} and @ref{5f0,,AttributeError} spelling suggestions
provided since gh-82711@footnote{https://github.com/python/cpython/issues/82711} are now also emitted by the pure Python
@ref{105,,traceback} module. Tests for those suggestions now exercise both
implementations to ensure they are equivalent. Patch by Carl Friedrich
Bolz-Tereick and Łukasz Langa.

@item 
gh-97799@footnote{https://github.com/python/cpython/issues/97799}: @code{dataclass} now uses @ref{a1a,,inspect.get_annotations()} to
examine the annotations on class objects.

@item 
gh-97781@footnote{https://github.com/python/cpython/issues/97781}: Removed deprecated interfaces in @code{importlib.metadata} (entry
points accessed as dictionary, implicit dictionary construction of
sequence of @code{EntryPoint} objects, mutablility of @code{EntryPoints} result,
access of entry point by index). @code{entry_points} now has a simpler, more
straightforward API (returning @code{EntryPoints}).

@item 
gh-96827@footnote{https://github.com/python/cpython/issues/96827}: Avoid spurious tracebacks from @ref{b,,asyncio} when default
executor cleanup is delayed until after the event loop is closed (e.g. as
the result of a keyboard interrupt).

@item 
gh-95534@footnote{https://github.com/python/cpython/issues/95534}: @code{gzip.GzipFile.read()} reads 10% faster.

@item 
gh-97592@footnote{https://github.com/python/cpython/issues/97592}: Avoid a crash in the C version of
@ref{1955,,asyncio.Future.remove_done_callback()} when an evil argument is
passed.

@item 
gh-97639@footnote{https://github.com/python/cpython/issues/97639}: Remove @code{tokenize.NL} check from @ref{e3,,tabnanny}.

@item 
gh-97545@footnote{https://github.com/python/cpython/issues/97545}: Make Semaphore run faster.

@item 
gh-73588@footnote{https://github.com/python/cpython/issues/73588}: Fix generation of the default name of
@ref{1a09,,tkinter.Checkbutton}. Previously, checkbuttons in different parent
widgets could have the same short name and share the same state if
arguments “name” and “variable” are not specified. Now they are globally
unique.

@item 
gh-96865@footnote{https://github.com/python/cpython/issues/96865}: fix Flag to use boundary CONFORM

This restores previous Flag behavior of allowing flags with non-sequential
values to be combined; e.g.

class Skip(Flag):         TWO = 2         EIGHT = 8

Skip.TWO | Skip.EIGHT -> <Skip.TWO|EIGHT: 10>

@item 
gh-97005@footnote{https://github.com/python/cpython/issues/97005}: Update bundled libexpat to 2.4.9

@item 
gh-85760@footnote{https://github.com/python/cpython/issues/85760}: Fix race condition in @ref{b,,asyncio} where
@ref{1b93,,process_exited()} called before the
@ref{1b94,,pipe_data_received()} leading to
inconsistent output. Patch by Kumar Aditya.

@item 
gh-96704@footnote{https://github.com/python/cpython/issues/96704}: Pass the correct @code{contextvars.Context} when a @code{asyncio}
exception handler is called on behalf of a task or callback handle. This
adds a new @code{Task} method, @code{get_context}, and also a new @code{Handle}
method with the same name. If this method is not found on a task object
(perhaps because it is a third-party library that does not yet provide
this method), the context prevailing at the time the exception handler is
called is used.

@item 
gh-96819@footnote{https://github.com/python/cpython/issues/96819}: Fixed check in @code{multiprocessing.resource_tracker} that
guarantees that the length of a write to a pipe is not greater than
@code{PIPE_BUF}.

@item 
gh-95865@footnote{https://github.com/python/cpython/issues/95865}: Reduce @ref{1b95,,urllib.parse.quote_from_bytes()} memory use on large
values.

Contributed by Dennis Sweeney.

@item 
gh-96741@footnote{https://github.com/python/cpython/issues/96741}: Corrected type annotation for dataclass attribute
@code{pstats.FunctionProfile.ncalls} to be @code{str}.

@item 
gh-96734@footnote{https://github.com/python/cpython/issues/96734}: Update @ref{10c,,unicodedata} database to Unicode 15.0.0.

@item 
gh-96735@footnote{https://github.com/python/cpython/issues/96735}: Fix undefined behaviour in @ref{18a3,,struct.unpack()}.

@item 
gh-46412@footnote{https://github.com/python/cpython/issues/46412}: Improve performance of @code{bool(db)} for large ndb/gdb databases.
Previously this would call @code{len(db)} which would iterate over all keys
– the answer (empty or not) is known after the first key.

@item 
gh-96652@footnote{https://github.com/python/cpython/issues/96652}: Fix the faulthandler implementation of
@code{faulthandler.register(signal, chain=True)} if the @code{sigaction()}
function is not available: don’t call the previous signal handler if it’s
NULL. Patch by Victor Stinner.

@item 
gh-68163@footnote{https://github.com/python/cpython/issues/68163}: Correct conversion of @ref{14ca,,numbers.Rational}’s to
@ref{197,,float}.

@item 
gh-96538@footnote{https://github.com/python/cpython/issues/96538}: Speed up @code{bisect.bisect()} functions by taking advantage of
type-stability.

@item 
gh-96465@footnote{https://github.com/python/cpython/issues/96465}: Fraction hashes are now cached.

@item 
gh-96079@footnote{https://github.com/python/cpython/issues/96079}: In @ref{10b,,typing}, fix missing field @code{name} and incorrect
@code{__module__} in _AnnotatedAlias.

@item 
gh-96415@footnote{https://github.com/python/cpython/issues/96415}: Remove @code{types._cell_factory} from module namespace.

@item 
gh-95987@footnote{https://github.com/python/cpython/issues/95987}: Fix @code{repr} of @code{Any} subclasses.

@item 
gh-96388@footnote{https://github.com/python/cpython/issues/96388}: Work around missing socket functions in
@ref{fa7,,socket}’s @code{__repr__}.

@item 
gh-96385@footnote{https://github.com/python/cpython/issues/96385}: Fix @code{TypeVarTuple.__typing_prepare_subst__}. @code{TypeError} was
not raised when using more than one @code{TypeVarTuple}, like @code{[*T, *V]} in
type alias substitutions.

@item 
gh-96142@footnote{https://github.com/python/cpython/issues/96142}: Add @code{match_args}, @code{kw_only}, @code{slots}, and @code{weakref_slot}
to @code{_DataclassParams}.

@item 
gh-96073@footnote{https://github.com/python/cpython/issues/96073}: In @ref{82,,inspect}, fix overeager replacement of “@code{typing.}” in
formatting annotations.

@item 
gh-89258@footnote{https://github.com/python/cpython/issues/89258}: Added a @ref{1b96,,getChildren()} method to
@ref{d4c,,logging.Logger}, to get the immediate child loggers of a logger.

@item 
gh-96346@footnote{https://github.com/python/cpython/issues/96346}: Use double caching for compiled RE patterns.

@item 
gh-96349@footnote{https://github.com/python/cpython/issues/96349}: Fixed a minor performance regression in
@code{threading.Event.__init__()}

@item 
gh-90467@footnote{https://github.com/python/cpython/issues/90467}: Fix @code{asyncio.streams.StreamReaderProtocol} to keep a
strong reference to the created task, so that it’s not garbage collected

@item 
gh-96172@footnote{https://github.com/python/cpython/issues/96172}: Fix a bug in @code{unicodedata}: @code{east_asian_width} used to
return the wrong value for unassigned characters; and for yet unassigned,
but reserved characters.

@item 
gh-96159@footnote{https://github.com/python/cpython/issues/96159}: Fix a performance regression in logging
TimedRotatingFileHandler. Only check for special files when the rollover
time has passed.

@item 
gh-96175@footnote{https://github.com/python/cpython/issues/96175}: Fix unused @code{localName} parameter in the @code{Attr} class in
@ref{129,,xml.dom.minidom}.

@item 
gh-96145@footnote{https://github.com/python/cpython/issues/96145}: Add AttrDict to JSON module for use with object_hook.

@item 
gh-96052@footnote{https://github.com/python/cpython/issues/96052}: Fix handling compiler warnings (SyntaxWarning and
DeprecationWarning) in @ref{1b97,,codeop.compile_command()} when checking for
incomplete input. Previously it emitted warnings and raised a SyntaxError.
Now it always returns @code{None} for incomplete input without emitting any
warnings.

@item 
gh-96125@footnote{https://github.com/python/cpython/issues/96125}: Fix incorrect condition that causes @code{sys.thread_info.name} to
be wrong on pthread platforms.

@item 
gh-96019@footnote{https://github.com/python/cpython/issues/96019}: Fix a bug in the @code{makeunicodedata.py} script leading to about
13 KiB of space saving in the @code{unicodedata} module, specifically the
character decomposition data.

@item 
gh-95463@footnote{https://github.com/python/cpython/issues/95463}: Remove an incompatible change from bpo-28080@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28080} that caused a
regression that ignored the utf8 in @code{ZipInfo.flag_bits}. Patch by Pablo
Galindo.

@item 
gh-69142@footnote{https://github.com/python/cpython/issues/69142}: Add @code{%:z} strftime format code (generates tzoffset with colons
as separator), see @ref{1b98,,strftime() and strptime() behavior}.

@item 
gh-95899@footnote{https://github.com/python/cpython/issues/95899}: Fix @ref{2f7,,asyncio.Runner} to call
@ref{1b99,,asyncio.set_event_loop()} only once to avoid calling
@code{attach_loop()} multiple times on child
watchers. Patch by Kumar Aditya.

@item 
gh-95736@footnote{https://github.com/python/cpython/issues/95736}: Fix @ref{35f,,unittest.IsolatedAsyncioTestCase} to set event loop
before calling setup functions. Patch by Kumar Aditya.

@item 
gh-95865@footnote{https://github.com/python/cpython/issues/95865}: Speed up @ref{1b95,,urllib.parse.quote_from_bytes()} by replacing a
list comprehension with @code{map()}.

@item 
gh-95861@footnote{https://github.com/python/cpython/issues/95861}: Add support for computing Spearman’s correlation coefficient to
the existing statistics.correlation() function.

@item 
gh-95804@footnote{https://github.com/python/cpython/issues/95804}: Fix @code{logging} shutdown handler so it respects
@code{MemoryHandler.flushOnClose}.

@item 
gh-95704@footnote{https://github.com/python/cpython/issues/95704}: When a task catches @ref{4d5,,asyncio.CancelledError} and raises
some other error, the other error should generally not silently be
suppressed.

@item 
gh-95149@footnote{https://github.com/python/cpython/issues/95149}: The @ref{b02,,HTTPStatus} enum offers a couple
of properties to indicate the HTTP status category e.g.
@code{HTTPStatus.OK.is_success}.

@item 
gh-95609@footnote{https://github.com/python/cpython/issues/95609}: Update bundled pip to 22.2.2.

@item 
gh-95289@footnote{https://github.com/python/cpython/issues/95289}: Fix @ref{4d2,,asyncio.TaskGroup} to propagate exception when
@ref{4d5,,asyncio.CancelledError} was replaced with another exception by a
context manager. Patch by Kumar Aditya and Guido van Rossum.

@item 
gh-94909@footnote{https://github.com/python/cpython/issues/94909}: Fix incorrect joining of relative Windows paths with drives in
@ref{6ce,,pathlib.PurePath} initializer.

@item 
gh-95385@footnote{https://github.com/python/cpython/issues/95385}: Faster @code{json.dumps()} when sorting of keys is not requested
(default).

@item 
gh-83901@footnote{https://github.com/python/cpython/issues/83901}: Improve @ref{18d9,,Signature.bind} error
message for missing keyword-only arguments.

@item 
gh-95339@footnote{https://github.com/python/cpython/issues/95339}: Update bundled pip to 22.2.1.

@item 
gh-95045@footnote{https://github.com/python/cpython/issues/95045}: Fix GC crash when deallocating @code{_lsprof.Profiler} by
untracking it before calling any callbacks. Patch by Kumar Aditya.

@item 
gh-95231@footnote{https://github.com/python/cpython/issues/95231}: Fail gracefully if @ref{1b9a,,EPERM} or
@ref{1b9b,,ENOSYS} is raised when loading @code{crypt} methods. This
may happen when trying to load @code{MD5} on a Linux kernel with @abbr{FIPS,Federal Information Processing Standard} enabled.

@item 
gh-95097@footnote{https://github.com/python/cpython/issues/95097}: Fix @ref{2f5,,asyncio.run()} for @ref{1c9,,asyncio.Task}
implementations without @ref{4d7,,uncancel()} method. Patch by
Kumar Aditya.

@item 
gh-95087@footnote{https://github.com/python/cpython/issues/95087}: Fix IndexError in parsing invalid date in the @ref{3f,,email}
module.

@item 
gh-95199@footnote{https://github.com/python/cpython/issues/95199}: Upgrade bundled setuptools to 63.2.0.

@item 
gh-95194@footnote{https://github.com/python/cpython/issues/95194}: Upgrade bundled pip to 22.2.

@item 
gh-93899@footnote{https://github.com/python/cpython/issues/93899}: Fix check for existence of @ref{1b9c,,os.EFD_CLOEXEC},
@ref{1b9d,,os.EFD_NONBLOCK} and @ref{1b9e,,os.EFD_SEMAPHORE} flags on older
kernel versions where these flags are not present. Patch by Kumar Aditya.

@item 
gh-95166@footnote{https://github.com/python/cpython/issues/95166}: Fix @ref{1de,,concurrent.futures.Executor.map()} to cancel the
currently waiting on future on an error - e.g. TimeoutError or
KeyboardInterrupt.

@item 
gh-95132@footnote{https://github.com/python/cpython/issues/95132}: Fix a @ref{d4,,sqlite3} regression where @code{*args} and @code{**kwds}
were incorrectly relayed from @ref{5a6,,connect()} to the
@ref{54e,,Connection} factory. The regression was introduced in
3.11a1 with PR 24421 (gh-85128@footnote{https://github.com/python/cpython/issues/85128}). Patch by Erlend E. Aasland.

@item 
gh-93157@footnote{https://github.com/python/cpython/issues/93157}: Fix @ref{5f,,fileinput} module didn’t support @code{errors} option
when @code{inplace} is true.

@item 
gh-91212@footnote{https://github.com/python/cpython/issues/91212}: Fixed flickering of the turtle window when the tracer is turned
off. Patch by Shin-myoung-serp.

@item 
gh-95077@footnote{https://github.com/python/cpython/issues/95077}: Add deprecation warning for enum @code{member.member} access (e.g.
@code{Color.RED.BLUE}). Remove @code{EnumMeta.__getattr__}.

@item 
gh-95109@footnote{https://github.com/python/cpython/issues/95109}: Ensure that timeouts scheduled with @ref{1a86,,asyncio.Timeout}
that have already expired are delivered promptly.

@item 
gh-95105@footnote{https://github.com/python/cpython/issues/95105}: @code{wsgiref.types.InputStream.__iter__()} should return
@code{Iterator[bytes]}, not @code{Iterable[bytes]}. Patch by Shantanu Jain.

@item 
gh-95066@footnote{https://github.com/python/cpython/issues/95066}: Replaced assert with exception in @ref{1c4,,ast.parse()}, when
@code{feature_version} has an invalid major version. Patch by Shantanu Jain.

@item 
gh-77617@footnote{https://github.com/python/cpython/issues/77617}: Add @ref{d4,,sqlite3} @ref{674,,command-line interface}.
Patch by Erlend Aasland.

@item 
gh-95005@footnote{https://github.com/python/cpython/issues/95005}: Replace _PyAccu with _PyUnicodeWriter in
JSON encoder and StringIO and remove the _PyAccu implementation.

@item 
gh-90085@footnote{https://github.com/python/cpython/issues/90085}: Remove @code{-c/--clock} and @code{-t/--time} CLI options of
@ref{f5,,timeit}. The options had been deprecated since Python 3.3 and the
functionality was removed in Python 3.7. Patch by Shantanu Jain.

@item 
gh-94857@footnote{https://github.com/python/cpython/issues/94857}: Fix refleak in @code{_io.TextIOWrapper.reconfigure}. Patch by Kumar
Aditya.

@item 
gh-94821@footnote{https://github.com/python/cpython/issues/94821}: Fix binding of unix socket to empty address on Linux to use an
available address from the abstract namespace, instead of “0”.

@item 
gh-94736@footnote{https://github.com/python/cpython/issues/94736}: Fix crash when deallocating an instance of a subclass of
@code{_multiprocessing.SemLock}. Patch by Kumar Aditya.

@item 
gh-81620@footnote{https://github.com/python/cpython/issues/81620}: Add random.binomialvariate().

@item 
gh-74116@footnote{https://github.com/python/cpython/issues/74116}: Allow @ref{1b6d,,asyncio.StreamWriter.drain()} to be awaited
concurrently by multiple tasks. Patch by Kumar Aditya.

@item 
gh-87822@footnote{https://github.com/python/cpython/issues/87822}: When called with @code{capture_locals=True}, the @ref{105,,traceback}
module functions swallow exceptions raised from calls to @code{repr()} on
local variables of frames. This is in order to prioritize the original
exception over rendering errors.  An indication of the failure is printed
in place of the missing value.  (Patch by Simon-Martin Schroeder).

@item 
gh-88050@footnote{https://github.com/python/cpython/issues/88050}: Fix @ref{b,,asyncio} subprocess transport to kill process cleanly
when process is blocked and avoid @code{RuntimeError} when loop is closed.
Patch by Kumar Aditya.

@item 
gh-94637@footnote{https://github.com/python/cpython/issues/94637}: @code{SSLContext.set_default_verify_paths()} now releases the GIL
around @code{SSL_CTX_set_default_verify_paths} call. The function call
performs I/O and CPU intensive work.

@item 
gh-94309@footnote{https://github.com/python/cpython/issues/94309}: Deprecate aliases @ref{718,,typing.Hashable} and
@ref{719,,typing.Sized}

@item 
gh-92546@footnote{https://github.com/python/cpython/issues/92546}: An undocumented @code{python -m pprint} benchmark is moved into
@code{pprint} suite of pyperformance. Patch by Oleg Iarygin.

@item 
gh-94607@footnote{https://github.com/python/cpython/issues/94607}: Fix subclassing complex generics with type variables in
@ref{10b,,typing}. Previously an error message saying @code{Some type variables
... are not listed in Generic[...]} was shown. @code{typing} no longer
populates @code{__parameters__} with the @code{__parameters__} of a Python
class.

@item 
gh-94619@footnote{https://github.com/python/cpython/issues/94619}: Remove the long-deprecated @code{module_repr()} from
@ref{7b,,importlib}.

@item 
gh-93910@footnote{https://github.com/python/cpython/issues/93910}: The ability to access the other values of an enum on an enum
(e.g. @code{Color.RED.BLUE}) has been restored in order to fix a performance
regression.

@item 
gh-93896@footnote{https://github.com/python/cpython/issues/93896}: Fix @ref{2f5,,asyncio.run()} and
@ref{35f,,unittest.IsolatedAsyncioTestCase} to always the set event loop as
it was done in Python 3.10 and earlier. Patch by Kumar Aditya.

@item 
gh-94343@footnote{https://github.com/python/cpython/issues/94343}: Allow setting the attributes of @code{reprlib.Repr} during object
initialization

@item 
gh-94382@footnote{https://github.com/python/cpython/issues/94382}: Port static types of @code{_multiprocessing} module to heap types.
Patch by Kumar Aditya.

@item 
gh-78724@footnote{https://github.com/python/cpython/issues/78724}: Fix crash in @ref{17af,,struct.Struct} when it was not completely
initialized by initializing it in @ref{7a1,,__new__()}.  Patch by Kumar
Aditya.

@item 
gh-94510@footnote{https://github.com/python/cpython/issues/94510}: Re-entrant calls to @ref{170a,,sys.setprofile()} and
@ref{2e3,,sys.settrace()} now raise @ref{246,,RuntimeError}. Patch by Pablo
Galindo.

@item 
gh-92336@footnote{https://github.com/python/cpython/issues/92336}: Fix bug where @ref{242,,linecache.getline()} fails on bad files with
@ref{c0e,,UnicodeDecodeError} or @ref{18f,,SyntaxError}. It now returns an empty
string as per the documentation.

@item 
gh-94398@footnote{https://github.com/python/cpython/issues/94398}: Once a @ref{4d2,,asyncio.TaskGroup} has started shutting down
(i.e., at least one task has failed and the task group has started
cancelling the remaining tasks), it should not be possible to add new
tasks to the task group.

@item 
gh-94383@footnote{https://github.com/python/cpython/issues/94383}: @code{xml.etree}: Remove the @code{ElementTree.Element.copy()}
method of the pure Python implementation, deprecated in Python 3.10, use
the @ref{758,,copy.copy()} function instead. The C implementation of
@code{xml.etree} has no @code{copy()} method, only a @code{__copy__()} method.
Patch by Victor Stinner.

@item 
gh-94379@footnote{https://github.com/python/cpython/issues/94379}: @ref{139,,zipimport}: Remove @code{find_loader()} and @code{find_module()}
methods, deprecated in Python 3.10: use the @code{find_spec()} method
instead. See 
@geindex Python Enhancement Proposals; PEP 451
PEP 451@footnote{https://peps.python.org/pep-0451/} for the rationale. Patch by Victor Stinner.

@item 
gh-94352@footnote{https://github.com/python/cpython/issues/94352}: @ref{75f,,shlex.split()}: Passing @code{None} for `s' argument now
raises an exception, rather than reading @ref{760,,sys.stdin}. The feature
was deprecated in Python 3.9. Patch by Victor Stinner.

@item 
gh-94318@footnote{https://github.com/python/cpython/issues/94318}: Strip trailing spaces in @ref{ba,,pydoc} text output.

@item 
gh-89988@footnote{https://github.com/python/cpython/issues/89988}: Fix memory leak in @ref{c19,,pickle.Pickler} when looking up
@code{dispatch_table}. Patch by Kumar Aditya.

@item 
gh-90016@footnote{https://github.com/python/cpython/issues/90016}: Deprecate @ref{d4,,sqlite3} @ref{715,,default adapters and converters}. Patch by Erlend E. Aasland.

@item 
gh-94254@footnote{https://github.com/python/cpython/issues/94254}: Fixed types of @ref{db,,struct} module to be immutable. Patch by
Kumar Aditya.

@item 
gh-93259@footnote{https://github.com/python/cpython/issues/93259}: Now raise @code{ValueError} when @code{None} or an empty string are
passed to @code{Distribution.from_name} (and other callers).

@item 
gh-74696@footnote{https://github.com/python/cpython/issues/74696}: @ref{6db,,shutil.make_archive()} now passes the `root_dir' argument
to custom archivers which support it.

@item 
gh-94216@footnote{https://github.com/python/cpython/issues/94216}: The @ref{3c,,dis} module now has the opcodes for pseudo
instructions (those which are used by the compiler during code generation
but then removed or replaced by real opcodes before the final bytecode is
emitted).

@item 
gh-93096@footnote{https://github.com/python/cpython/issues/93096}: Removed undocumented @code{python -m codecs}. Use @code{python -m
unittest test.test_codecs.EncodedFileTest} instead.

@item 
gh-94207@footnote{https://github.com/python/cpython/issues/94207}: Made @code{_struct.Struct} GC-tracked in order to fix a
reference leak in the @code{_struct} module.

@item 
gh-93096@footnote{https://github.com/python/cpython/issues/93096}: Removed undocumented @code{-t} argument of @code{python -m base64}.
Use @code{python -m unittest
test.test_base64.LegacyBase64TestCase.test_encodebytes} instead.

@item 
gh-94226@footnote{https://github.com/python/cpython/issues/94226}: Remove the @code{locale.format()} function, deprecated in Python
3.7: use @ref{743,,locale.format_string()} instead. Patch by Victor Stinner.

@item 
gh-94199@footnote{https://github.com/python/cpython/issues/94199}: Remove the @code{ssl.match_hostname()} function. The
@code{ssl.match_hostname()} was deprecated in Python 3.7. OpenSSL performs
hostname matching since Python 3.7, Python no longer uses the
@code{ssl.match_hostname()} function. Patch by Victor Stinner.

@item 
gh-94214@footnote{https://github.com/python/cpython/issues/94214}: Document the @code{context} object used in the @code{venv.EnvBuilder}
class, and add the new environment’s library path to it.

@item 
gh-94199@footnote{https://github.com/python/cpython/issues/94199}: Remove the @code{ssl.wrap_socket()} function, deprecated in
Python 3.7: instead, create a @ref{355,,ssl.SSLContext} object and call its
@ref{749,,ssl.SSLContext.wrap_socket} method. Any package that still uses
@code{ssl.wrap_socket()} is broken and insecure. The function neither sends
a SNI TLS extension nor validates server hostname. Code is subject to
@geindex Common Weakness Enumeration; CWE 295
CWE 295@footnote{https://cwe.mitre.org/data/definitions/295.html} Improper Certificate Validation. Patch by Victor Stinner.

@item 
gh-94199@footnote{https://github.com/python/cpython/issues/94199}: Remove the @code{ssl.RAND_pseudo_bytes()} function, deprecated in
Python 3.6: use @ref{747,,os.urandom()} or @ref{748,,ssl.RAND_bytes()} instead.
Patch by Victor Stinner.

@item 
gh-94199@footnote{https://github.com/python/cpython/issues/94199}: @ref{6c,,hashlib}: Remove the pure Python implementation of
@ref{734,,hashlib.pbkdf2_hmac()}, deprecated in Python 3.10. Python 3.10 and
newer requires OpenSSL 1.1.1 (
@geindex Python Enhancement Proposals; PEP 644
PEP 644@footnote{https://peps.python.org/pep-0644/}): this OpenSSL version provides a
C implementation of @code{pbkdf2_hmac()} which is faster. Patch by
Victor Stinner.

@item 
gh-94196@footnote{https://github.com/python/cpython/issues/94196}: @ref{6b,,gzip}: Remove the @code{filename} attribute of
@ref{65c,,gzip.GzipFile}, deprecated since Python 2.6, use the
@ref{732,,name} attribute instead. In write mode, the
@code{filename} attribute added @code{'.gz'} file extension if it was not
present. Patch by Victor Stinner.

@item 
gh-94182@footnote{https://github.com/python/cpython/issues/94182}: run the @code{asyncio.PidfdChildWatcher} on the running loop,
this allows event loops to run subprocesses when there is no default event
loop running on the main thread

@item 
gh-94169@footnote{https://github.com/python/cpython/issues/94169}: Remove @code{io.OpenWrapper} and @code{_pyio.OpenWrapper}, deprecated
in Python 3.10: just use @ref{318,,open()} instead. The @code{open()}
(@ref{741,,io.open()}) function is a built-in function. Since Python 3.10,
@code{_pyio.open()} is also a static method. Patch by Victor Stinner.

@item 
gh-91742@footnote{https://github.com/python/cpython/issues/91742}: Fix @ref{aa,,pdb} crash after jump caused by a null pointer
dereference. Patch by Kumar Aditya.

@item 
gh-94101@footnote{https://github.com/python/cpython/issues/94101}: Manual instantiation of @ref{edf,,ssl.SSLSession} objects is no
longer allowed as it lead to misconfigured instances that crashed the
interpreter when attributes where accessed on them.

@item 
gh-84753@footnote{https://github.com/python/cpython/issues/84753}: @ref{30f,,inspect.iscoroutinefunction()},
@ref{1b9f,,inspect.isgeneratorfunction()}, and
@ref{1ba0,,inspect.isasyncgenfunction()} now properly return @code{True} for
duck-typed function-like objects like instances of
@ref{c44,,unittest.mock.AsyncMock}.

This makes @ref{30f,,inspect.iscoroutinefunction()} consistent with the
behavior of @code{asyncio.iscoroutinefunction()}.  Patch by Mehdi ABAAKOUK.

@item 
gh-94028@footnote{https://github.com/python/cpython/issues/94028}: Fix a regression in the @ref{d4,,sqlite3} where statement objects
were not properly cleared and reset after use in cursor iters. The
regression was introduced by PR 27884 in Python 3.11a1. Patch by Erlend E.
Aasland.

@item 
gh-93973@footnote{https://github.com/python/cpython/issues/93973}: Add keyword argument @code{all_errors} to
@code{asyncio.create_connection} so that multiple connection errors can be
raised as an @code{ExceptionGroup}.

@item 
gh-93963@footnote{https://github.com/python/cpython/issues/93963}: Officially deprecate from @code{importlib.abc} classes moved to
@code{importlib.resources.abc}.

@item 
gh-93858@footnote{https://github.com/python/cpython/issues/93858}: Prevent error when activating venv in nested fish instances.

@item 
gh-93820@footnote{https://github.com/python/cpython/issues/93820}: Pickle @ref{836,,enum.Flag} by name.

@item 
gh-93847@footnote{https://github.com/python/cpython/issues/93847}: Fix repr of enum of generic aliases.

@item 
gh-91404@footnote{https://github.com/python/cpython/issues/91404}: Revert the @ref{be,,re} memory leak when a match is terminated by a
signal or memory allocation failure as the implemented fix caused a major
performance regression.

@item 
gh-83499@footnote{https://github.com/python/cpython/issues/83499}: Fix double closing of file description in @ref{e6,,tempfile}.

@item 
gh-93820@footnote{https://github.com/python/cpython/issues/93820}: Fixed a regression when @ref{758,,copy.copy()}-ing @ref{836,,enum.Flag}
with multiple flag members.

@item 
gh-79512@footnote{https://github.com/python/cpython/issues/79512}: Fixed names and @code{__module__} value of @ref{11b,,weakref} classes
@ref{1ba1,,ReferenceType}, @ref{1ba2,,ProxyType},
@ref{1ba3,,CallableProxyType}. It makes them pickleable.

@item 
gh-91389@footnote{https://github.com/python/cpython/issues/91389}: Fix an issue where @ref{3c,,dis} utilities could report missing or
incorrect position information in the presence of @code{CACHE} entries.

@item 
gh-93626@footnote{https://github.com/python/cpython/issues/93626}: Set @code{__future__.annotations} to have a @code{None}
mandatoryRelease to indicate that it is currently ‘TBD’.

@item 
gh-90473@footnote{https://github.com/python/cpython/issues/90473}: Emscripten and WASI have no home directory and cannot provide
@geindex Python Enhancement Proposals; PEP 370
PEP 370@footnote{https://peps.python.org/pep-0370/} user site directory.

@item 
gh-90494@footnote{https://github.com/python/cpython/issues/90494}: @ref{758,,copy.copy()} and @ref{d6b,,copy.deepcopy()} now always raise a
TypeError if @code{__reduce__()} returns a tuple with length 6 instead of
silently ignore the 6th item or produce incorrect result.

@item 
gh-90549@footnote{https://github.com/python/cpython/issues/90549}: Fix a multiprocessing bug where a global named resource (such as
a semaphore) could leak when a child process is spawned (as opposed to
forked).

@item 
gh-93521@footnote{https://github.com/python/cpython/issues/93521}: Fixed a case where dataclasses would try to add @code{__weakref__}
into the @code{__slots__} for a dataclass that specified
@code{weakref_slot=True} when it was already defined in one of its bases.
This resulted in a @code{TypeError} upon the new class being created.

@item 
gh-79579@footnote{https://github.com/python/cpython/issues/79579}: @ref{d4,,sqlite3} now correctly detects DML queries with leading
comments. Patch by Erlend E. Aasland.

@item 
gh-93421@footnote{https://github.com/python/cpython/issues/93421}: Update @ref{1ba4,,sqlite3.Cursor.rowcount} when a DML statement has
run to completion. This fixes the row count for SQL queries like @code{UPDATE
... RETURNING}. Patch by Erlend E. Aasland.

@item 
gh-93475@footnote{https://github.com/python/cpython/issues/93475}: Expose @code{FICLONE} and @code{FICLONERANGE} constants in
@ref{5d,,fcntl}. Patch by Illia Volochii.

@item 
gh-93370@footnote{https://github.com/python/cpython/issues/93370}: Deprecate @code{version} and @code{version_info}.

@item 
gh-91810@footnote{https://github.com/python/cpython/issues/91810}: Suppress writing an XML declaration in open files in
@code{ElementTree.write()} with @code{encoding='unicode'} and
@code{xml_declaration=None}.

@item 
gh-91162@footnote{https://github.com/python/cpython/issues/91162}: Support splitting of unpacked arbitrary-length tuple over
@code{TypeVar} and @code{TypeVarTuple} parameters. For example:


@itemize *

@item 
@code{A[T, *Ts][*tuple[int, ...]]} -> @code{A[int, *tuple[int, ...]]}

@item 
@code{A[*Ts, T][*tuple[int, ...]]} -> @code{A[*tuple[int, ...], int]}
@end itemize

@item 
gh-93353@footnote{https://github.com/python/cpython/issues/93353}: Fix the @ref{6b6,,importlib.resources.as_file()} context manager to
remove the temporary file if destroyed late during Python finalization:
keep a local reference to the @ref{12fc,,os.remove()} function. Patch by Victor
Stinner.

@item 
gh-83658@footnote{https://github.com/python/cpython/issues/83658}: Make @code{multiprocessing.Pool} raise an exception if
@code{maxtasksperchild} is not @code{None} or a positive int.

@item 
gh-93312@footnote{https://github.com/python/cpython/issues/93312}: Add @ref{6c3,,os.PIDFD_NONBLOCK} flag to open a file descriptor
for a process with @ref{6a5,,os.pidfd_open()} in non-blocking mode. Patch by
Kumar Aditya.

@item 
gh-88123@footnote{https://github.com/python/cpython/issues/88123}: Implement @code{Enum.__contains__} that returns @code{True} or
@code{False} to replace the deprecated behaviour that would sometimes raise a
@ref{199,,TypeError}.

@item 
gh-93297@footnote{https://github.com/python/cpython/issues/93297}: Make asyncio task groups prevent child tasks from being GCed

@item 
gh-85308@footnote{https://github.com/python/cpython/issues/85308}: Changed @ref{1bf,,argparse.ArgumentParser} to use
@ref{75e,,filesystem encoding and error handler} instead of default text
encoding to read arguments from file (e.g. @code{fromfile_prefix_chars}
option). This change affects Windows; argument file should be encoded with
UTF-8 instead of ANSI Codepage.

@item 
gh-93156@footnote{https://github.com/python/cpython/issues/93156}: Accessing the @ref{a27,,pathlib.PurePath.parents} sequence of an
absolute path using negative index values produced incorrect results.

@item 
gh-93162@footnote{https://github.com/python/cpython/issues/93162}: Add the ability for @ref{13bc,,logging.config.dictConfig()} to
usefully configure @ref{1ba5,,QueueHandler} and
@ref{244,,QueueListener} as a pair, and add
@ref{1ba6,,logging.getHandlerByName()} and @ref{1ab4,,logging.getHandlerNames()} APIs
to allow access to handlers by name.

@item 
gh-93243@footnote{https://github.com/python/cpython/issues/93243}: The @code{smtpd} module was removed per the schedule in
@geindex Python Enhancement Proposals; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}.

@item 
gh-92886@footnote{https://github.com/python/cpython/issues/92886}: Replace @code{assert} statements with @code{raise AssertionError()} in
@code{BaseHandler} so that the tested behaviour is maintained
running with optimizations @code{(-O)}.

@item 
gh-90155@footnote{https://github.com/python/cpython/issues/90155}: Fix broken @ref{c6e,,asyncio.Semaphore} when acquire is cancelled.

@item 
gh-90817@footnote{https://github.com/python/cpython/issues/90817}: The @code{locale.resetlocale()} function is deprecated and will
be removed in Python 3.13. Use @code{locale.setlocale(locale.LC_ALL, "")}
instead. Patch by Victor Stinner.

@item 
gh-91513@footnote{https://github.com/python/cpython/issues/91513}: Added @code{taskName} attribute to @ref{8b,,logging} module for use
with @ref{b,,asyncio} tasks.

@item 
gh-74696@footnote{https://github.com/python/cpython/issues/74696}: @ref{6db,,shutil.make_archive()} no longer temporarily changes the
current working directory during creation of standard @code{.zip} or tar
archives.

@item 
gh-92728@footnote{https://github.com/python/cpython/issues/92728}: The @code{re.template()} function and the corresponding
@code{re.TEMPLATE} and @code{re.T} flags are restored after they were
removed in 3.11.0b1, but they are now deprecated, so they might be removed
from Python 3.13.

@item 
gh-93033@footnote{https://github.com/python/cpython/issues/93033}: Search in some strings (platform dependent i.e [U+0xFFFF,
U+0x0100] on Windows or [U+0xFFFFFFFF, U+0x00010000] on Linux 64-bit) are
now up to 10 times faster.

@item 
gh-89973@footnote{https://github.com/python/cpython/issues/89973}: Fix @code{re.error} raised in @ref{60,,fnmatch} if the pattern
contains a character range with upper bound lower than lower bound (e.g.
@code{[c-a]}). Now such ranges are interpreted as empty ranges.

@item 
gh-93044@footnote{https://github.com/python/cpython/issues/93044}: No longer convert the database argument of
@ref{5a6,,sqlite3.connect()} to bytes before passing it to the factory.

@item 
gh-93010@footnote{https://github.com/python/cpython/issues/93010}: In a very special case, the email package tried to append the
nonexistent @code{InvalidHeaderError} to the defect list. It should have been
@code{InvalidHeaderDefect}.

@item 
gh-92986@footnote{https://github.com/python/cpython/issues/92986}: Fix @ref{ae8,,ast.unparse()} when @code{ImportFrom.level} is @code{None}

@item 
gh-92932@footnote{https://github.com/python/cpython/issues/92932}: Now @ref{207,,dis()} and @ref{4ed,,get_instructions()} handle
operand values for instructions prefixed by @code{EXTENDED_ARG_QUICK}. Patch
by Sam Gross and Donghee Na.

@item 
gh-92675@footnote{https://github.com/python/cpython/issues/92675}: Fix @code{venv.ensure_directories()} to accept
@ref{268,,pathlib.Path} arguments in addition to @ref{16a,,str} paths. Patch
by David Foster.

@item 
gh-87901@footnote{https://github.com/python/cpython/issues/87901}: Removed the @code{encoding} argument from @ref{31c,,os.popen()} that was
added in 3.11b1.

@item 
gh-91922@footnote{https://github.com/python/cpython/issues/91922}: Fix function @code{sqlite.connect()} and the
@code{sqlite.Connection} constructor on non-UTF-8 locales. Also, they
now support bytes paths non-decodable with the current FS encoding.

@item 
gh-92869@footnote{https://github.com/python/cpython/issues/92869}: Added @ref{1ba7,,c_time_t} to @ref{2e,,ctypes}, which has the
same size as the @code{time_t} type in C.

@item 
gh-92839@footnote{https://github.com/python/cpython/issues/92839}: Fixed crash resulting from calling bisect.insort() or
bisect.insort_left() with the key argument not equal to @code{None}.

@item 
gh-90473@footnote{https://github.com/python/cpython/issues/90473}: @ref{dc,,subprocess} now fails early on Emscripten and WASI
platforms to work around missing @ref{1ba8,,os.pipe()} on WASI.

@item 
gh-89325@footnote{https://github.com/python/cpython/issues/89325}: Removed many old deprecated @ref{10d,,unittest} features:
@ref{2b5,,TestCase} method aliases, undocumented and broken
@code{TestCase} method @code{assertDictContainsSubset},
undocumented @ref{594,,TestLoader.loadTestsFromModule} parameter `use_load_tests', and
an underscored alias of the @ref{755,,TextTestResult} class.

@item 
gh-92734@footnote{https://github.com/python/cpython/issues/92734}: Allow multi-element reprs emitted by @ref{c0,,reprlib} to be
pretty-printed using configurable indentation.

@item 
gh-92671@footnote{https://github.com/python/cpython/issues/92671}: Fixed @ref{ae8,,ast.unparse()} for empty tuples in the assignment
target context.

@item 
gh-91581@footnote{https://github.com/python/cpython/issues/91581}: @ref{350,,utcfromtimestamp()} no longer attempts
to resolve @code{fold} in the pure Python implementation, since the fold is
never 1 in UTC. In addition to being slightly faster in the common case,
this also prevents some errors when the timestamp is close to
@ref{1ba9,,datetime.min}.  Patch by Paul Ganssle.

@item 
gh-86388@footnote{https://github.com/python/cpython/issues/86388}: Removed randrange() functionality deprecated since Python 3.10.
Formerly, randrange(10.0) losslessly converted to randrange(10). Now, it
raises a TypeError. Also, the exception raised for non-integral values
such as randrange(10.5) or randrange(‘10’) has been changed from
ValueError to TypeError.

@item 
gh-90385@footnote{https://github.com/python/cpython/issues/90385}: Add @ref{6d0,,pathlib.Path.walk()} as an alternative to
@ref{6d1,,os.walk()}.

@item 
gh-92550@footnote{https://github.com/python/cpython/issues/92550}: Fix @ref{539,,pathlib.Path.rglob()} for empty pattern.

@item 
gh-92591@footnote{https://github.com/python/cpython/issues/92591}: Allow @ref{8b,,logging} filters to return a
@ref{11ec,,logging.LogRecord} instance so that filters attached to
@ref{16a2,,logging.Handler}s can enrich records without side effects on
other handlers.

@item 
gh-92445@footnote{https://github.com/python/cpython/issues/92445}: Fix a bug in @ref{7,,argparse} where @code{nargs="*"} would raise an
error instead of returning an empty list when 0 arguments were supplied if
choice was also defined in @code{parser.add_argument}.

@item 
gh-92547@footnote{https://github.com/python/cpython/issues/92547}: Remove undocumented @ref{d4,,sqlite3} features deprecated in Python
3.10:


@itemize *

@item 
@code{sqlite3.enable_shared_cache()}

@item 
@code{sqlite3.OptimizedUnicode}
@end itemize

Patch by Erlend E. Aasland.

@item 
gh-92530@footnote{https://github.com/python/cpython/issues/92530}: Fix an issue that occurred after interrupting
@ref{1baa,,threading.Condition.notify()}.

@item 
gh-92531@footnote{https://github.com/python/cpython/issues/92531}: The statistics.median_grouped() function now always return a
float. Formerly, it did not convert the input type when for sequences of
length one.

@item 
gh-84131@footnote{https://github.com/python/cpython/issues/84131}: The @ref{268,,pathlib.Path} deprecated method @code{link_to} has been
removed. Use 3.10’s @ref{a28,,hardlink_to()} method instead as
its semantics are consistent with that of
@ref{a29,,symlink_to()}.

@item 
gh-89336@footnote{https://github.com/python/cpython/issues/89336}: Removed @ref{26,,configparser} module APIs: the
@code{SafeConfigParser} class alias, the @code{ParsingError.filename} property
and parameter, and the @code{ConfigParser.readfp} method, all of which were
deprecated since Python 3.2.

@item 
gh-92391@footnote{https://github.com/python/cpython/issues/92391}: Add @ref{948,,__class_getitem__()} to
@ref{bde,,csv.DictReader} and @ref{140a,,csv.DictWriter}, allowing them to be
parameterized at runtime. Patch by Marc Mueller.

@item 
gh-91968@footnote{https://github.com/python/cpython/issues/91968}: Add @code{SO_RTABLE} and @code{SO_USER_COOKIE} constants to
@ref{d1,,socket}.

@item 
gh-91810@footnote{https://github.com/python/cpython/issues/91810}: @ref{b4d,,ElementTree} method
@ref{c92,,write()} and function
@ref{11fb,,tostring()} now use the text file’s encoding
(“UTF-8” if not available) instead of locale encoding in XML declaration
when @code{encoding="unicode"} is specified.

@item 
gh-81790@footnote{https://github.com/python/cpython/issues/81790}: @ref{df5,,os.path.splitdrive()} now understands DOS device paths with
UNC links (beginning @code{\\?\UNC\}). Contributed by Barney Gale.

@item 
gh-91760@footnote{https://github.com/python/cpython/issues/91760}: Apply more strict rules for numerical group references and group
names in regular expressions. Only sequence of ASCII digits is now
accepted as a numerical reference. The group name in bytes patterns and
replacement strings can now only contain ASCII letters and digits and
underscore.

@item 
gh-90622@footnote{https://github.com/python/cpython/issues/90622}: Worker processes for
@ref{1d8,,concurrent.futures.ProcessPoolExecutor} are no longer spawned on
demand (a feature added in 3.9) when the multiprocessing context start
method is @code{"fork"} as that can lead to deadlocks in the child processes
due to a fork happening while threads are running.

@item 
gh-91577@footnote{https://github.com/python/cpython/issues/91577}: Move imports in @code{SharedMemory} methods
to module level so that they can be executed late in python finalization.

@item 
gh-91581@footnote{https://github.com/python/cpython/issues/91581}: Remove an unhandled error case in the C implementation of calls
to @ref{713,,datetime.fromtimestamp} with
no time zone (i.e. getting a local time from an epoch timestamp). This
should have no user-facing effect other than giving a possibly more
accurate error message when called with timestamps that fall on
10000-01-01 in the local time. Patch by Paul Ganssle.

@item 
gh-91539@footnote{https://github.com/python/cpython/issues/91539}: Improve performance of @code{urllib.request.getproxies_environment}
when there are many environment variables

@item 
gh-91524@footnote{https://github.com/python/cpython/issues/91524}: Speed up the regular expression substitution (functions
@ref{5a3,,re.sub()} and @ref{5a4,,re.subn()} and corresponding @ref{1bab,,re.Pattern}
methods) for replacement strings containing group references by 2–3
times.

@item 
gh-91447@footnote{https://github.com/python/cpython/issues/91447}: Fix findtext in the xml module to only give an empty string when
the text attribute is set to @code{None}.

@item 
gh-91456@footnote{https://github.com/python/cpython/issues/91456}: Deprecate current default auto() behavior:  In 3.13 the default
will be for for auto() to always return the largest member value
incremented by 1, and to raise if incompatible value types are used.

@item 
bpo-47231@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47231}: Fixed an issue with inconsistent trailing slashes in tarfile
longname directories.

@item 
bpo-39064@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39064}: @ref{8d5,,zipfile.ZipFile} now raises @ref{1bac,,zipfile.BadZipFile}
instead of @code{ValueError} when reading a corrupt zip file in which the
central directory offset is negative.

@item 
bpo-41287@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41287}: Fix handling of the @code{doc} argument in subclasses of
@ref{4b4,,property()}.

@item 
gh-90005@footnote{https://github.com/python/cpython/issues/90005}: @ref{2e,,ctypes} dependency @code{libffi} is now detected with
@code{pkg-config}.

@item 
bpo-32547@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32547}: The constructors for @ref{140a,,DictWriter} and
@ref{bde,,DictReader} now coerce the @code{fieldnames} argument to a
@ref{24f,,list} if it is an iterator.

@item 
bpo-35540@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35540}: Fix @ref{1adb,,dataclasses.asdict()} crash when
@ref{13c8,,collections.defaultdict} is present in the attributes.

@item 
bpo-47063@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47063}: Add an index_pages parameter to support using non-default index
page names.

@item 
bpo-47025@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47025}: Drop support for @ref{193,,bytes} on @ref{3e2,,sys.path}.

@item 
bpo-46951@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46951}: Order the contents of zipapp archives, to make builds more
reproducible.

@item 
bpo-42777@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42777}: Implement @ref{c12,,pathlib.Path.is_mount()} for Windows paths.

@item 
bpo-46755@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46755}: In @code{QueueHandler}, clear @code{stack_info} from
@code{LogRecord} to prevent stack trace from being written twice.

@item 
bpo-45393@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45393}: Fix the formatting for @code{await x} and @code{not x} in the
operator precedence table when using the @ref{ada,,help()} system.

@item 
bpo-46642@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46642}: Improve error message when trying to subclass an instance of
@ref{487,,typing.TypeVar}, @ref{488,,typing.ParamSpec},
@ref{489,,typing.TypeVarTuple}, etc. Based on patch by Gregory Beauregard.

@item 
bpo-46364@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46364}: Restrict use of sockets instead of pipes for stdin of
subprocesses created by @ref{b,,asyncio} to AIX platform only.

@item 
bpo-28249@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28249}: Set @ref{1816,,doctest.DocTest.lineno} to @code{None} when an object
does not have @ref{b27,,__doc__}.

@item 
bpo-46197@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46197}: Fix @ref{59,,ensurepip} environment isolation for subprocess
running @code{pip}.

@item 
bpo-45924@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45924}: Fix @ref{b,,asyncio} incorrect traceback when future’s exception
is raised multiple times. Patch by Kumar Aditya.

@item 
bpo-45046@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45046}: Add support of context managers in @ref{10d,,unittest}: methods
@ref{8ca,,enterContext()} and
@ref{8cb,,enterClassContext()} of class
@ref{2b5,,TestCase}, method
@ref{8cc,,enterAsyncContext()} of class
@ref{35f,,IsolatedAsyncioTestCase} and function
@ref{8cd,,unittest.enterModuleContext()}.

@item 
bpo-44173@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44173}: Enable fast seeking of uncompressed unencrypted
@code{zipfile.ZipExtFile}

@item 
bpo-42627@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42627}: Fix incorrect parsing of Windows registry proxy settings

@item 
bpo-42047@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42047}: Add @ref{c38,,threading.get_native_id()} support for DragonFly BSD.
Patch by David Carlier.

@item 
bpo-14243@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14243}: The @ref{6ee,,tempfile.NamedTemporaryFile} function has a new
optional parameter `delete_on_close'

@item 
bpo-41246@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41246}: Give the same callback function for when the overlapped
operation is done to the functions @code{recv}, @code{recv_into}, @code{recvfrom},
@code{sendto}, @code{send} and @code{sendfile} inside @code{IocpProactor}.

@item 
bpo-39264@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39264}: Fixed @code{collections.UserDict.get()} to not call
@ref{13c9,,__missing__()} when a value is not found. This matches the
behavior of @ref{184,,dict}. Patch by Bar Harel.

@item 
bpo-38693@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38693}: @ref{7b,,importlib} now uses f-strings internally instead of
@code{str.format}.

@item 
bpo-38267@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38267}: Add `timeout' parameter to
@ref{aea,,asyncio.loop.shutdown_default_executor()}. The default value is
@code{None}, which means the executor will be given an unlimited amount of
time. When called from @ref{2f7,,asyncio.Runner} or @ref{2f5,,asyncio.run()}, the
default timeout is 5 minutes.

@item 
bpo-34828@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34828}: @ref{550,,sqlite3.Connection.iterdump()} now handles databases that
use @code{AUTOINCREMENT} in one or more tables.

@item 
bpo-32990@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32990}: Support reading wave files with the @code{WAVE_FORMAT_EXTENSIBLE}
format in the @ref{11a,,wave} module.

@item 
bpo-26253@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26253}: Allow adjustable compression level for tarfile streams in
@ref{107d,,tarfile.open()}.
@end itemize

@node Documentation<31>,Tests<31>,Library<91>,Python 3 12 0 alpha 1
@anchor{whatsnew/changelog id417}@anchor{1bad}
@subsubsection Documentation



@itemize -

@item 
gh-85525@footnote{https://github.com/python/cpython/issues/85525}: Remove extra row

@item 
gh-86404@footnote{https://github.com/python/cpython/issues/86404}: Deprecated tools @code{make suspicious} and @code{rstlint.py} are now
removed. They have been replaced by sphinx-lint@footnote{https://pypi.org/project/sphinx-lint/}.

@item 
gh-97741@footnote{https://github.com/python/cpython/issues/97741}: Fix @code{!} in c domain ref target syntax via a @code{conf.py} patch,
so it works as intended to disable ref target resolution.

@item 
gh-96432@footnote{https://github.com/python/cpython/issues/96432}: Fraction literals now support whitespace around the forward
slash, @code{Fraction('2 / 3')}.

@item 
gh-96098@footnote{https://github.com/python/cpython/issues/96098}: Improve discoverability of the higher level concurrent.futures
module by providing clearer links from the lower level threading and
multiprocessing modules.

@item 
gh-95957@footnote{https://github.com/python/cpython/issues/95957}: What’s New 3.11 now has instructions for how to provide compiler
and linker flags for Tcl/Tk and OpenSSL on RHEL 7 and CentOS 7.

@item 
gh-95588@footnote{https://github.com/python/cpython/issues/95588}: Clarified the conflicting advice given in the @ref{9,,ast}
documentation about @ref{e18,,ast.literal_eval()} being “safe” for use on
untrusted input while at the same time warning that it can crash the
process. The latter statement is true and is deemed unfixable without a
large amount of work unsuitable for a bugfix. So we keep the warning and
no longer claim that @code{literal_eval} is safe.

@item 
gh-91207@footnote{https://github.com/python/cpython/issues/91207}: Fix stylesheet not working in Windows CHM htmlhelp docs and add
warning that they are deprecated. Contributed by C.A.M. Gerlach.

@item 
gh-95454@footnote{https://github.com/python/cpython/issues/95454}: Replaced incorrectly written true/false values in documentation.
Patch by Robert O’Shea

@item 
gh-95451@footnote{https://github.com/python/cpython/issues/95451}: Update library documentation with @ref{1bae,,availability information} on WebAssembly platforms @code{wasm32-emscripten} and
@code{wasm32-wasi}.

@item 
gh-95415@footnote{https://github.com/python/cpython/issues/95415}: Use consistent syntax for platform availability. The directive
now supports a content body and emits a warning when it encounters an
unknown platform.

@item 
gh-94321@footnote{https://github.com/python/cpython/issues/94321}: Document the 
@geindex Python Enhancement Proposals; PEP 246
PEP 246@footnote{https://peps.python.org/pep-0246/} style protocol type
@ref{1baf,,sqlite3.PrepareProtocol}.

@item 
gh-86128@footnote{https://github.com/python/cpython/issues/86128}: Document a limitation in ThreadPoolExecutor where its exit
handler is executed before any handlers in atexit.

@item 
gh-61162@footnote{https://github.com/python/cpython/issues/61162}: Clarify @ref{d4,,sqlite3} behavior when
@ref{1bb0,,How to use the connection context manager}.

@item 
gh-87260@footnote{https://github.com/python/cpython/issues/87260}: Align @ref{d4,,sqlite3} argument specs with the actual
implementation.

@item 
gh-86986@footnote{https://github.com/python/cpython/issues/86986}: The minimum Sphinx version required to build the documentation
is now 3.2.

@item 
gh-88831@footnote{https://github.com/python/cpython/issues/88831}: Augmented documentation of asyncio.create_task(). Clarified the
need to keep strong references to tasks and added a code snippet detailing
how to do this.

@item 
gh-86438@footnote{https://github.com/python/cpython/issues/86438}: Clarify that @ref{acb,,-W} and 
@geindex PYTHONWARNINGS
@geindex environment variable; PYTHONWARNINGS
@ref{da9,,PYTHONWARNINGS} are
matched literally and case-insensitively, rather than as regular
expressions, in @ref{119,,warnings}.

@item 
gh-93031@footnote{https://github.com/python/cpython/issues/93031}: Update tutorial introduction output to use 3.10+ SyntaxError
invalid range.

@item 
gh-92240@footnote{https://github.com/python/cpython/issues/92240}: Added release dates for “What’s New in Python 3.X” for 3.0, 3.1,
3.2, 3.8 and 3.10

@item 
bpo-47161@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47161}: Document that @ref{6ce,,pathlib.PurePath} does not collapse
initial double slashes because they denote UNC paths.

@item 
bpo-40838@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40838}: Document that @ref{bf3,,inspect.getdoc()},
@ref{1bb1,,inspect.getmodule()}, and @ref{1bb2,,inspect.getsourcefile()} might return
@code{None}.

@item 
bpo-43689@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43689}: The @code{Differ} documentation now also mentions other whitespace
characters, which make it harder to understand the diff output.

@item 
bpo-38056@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38056}: Overhaul the @ref{1bb3,,Error Handlers} documentation in
@ref{1c,,codecs}.

@item 
bpo-13553@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13553}: Document tkinter.Tk args.
@end itemize

@node Tests<31>,Build<36>,Documentation<31>,Python 3 12 0 alpha 1
@anchor{whatsnew/changelog id418}@anchor{1bb4}
@subsubsection Tests



@itemize -

@item 
gh-95027@footnote{https://github.com/python/cpython/issues/95027}: On Windows, when the Python test suite is run with the @code{-jN}
option, the ANSI code page is now used as the encoding for the stdout
temporary file, rather than using UTF-8 which can lead to decoding errors.
Patch by Victor Stinner.

@item 
gh-96624@footnote{https://github.com/python/cpython/issues/96624}: Fixed the failure of repeated runs of @code{test.test_unittest}
caused by side effects in @code{test_dotted_but_module_not_loaded}.

@item 
gh-95243@footnote{https://github.com/python/cpython/issues/95243}: Mitigate the inherent race condition from using
find_unused_port() in testSockName() by trying to find an unused port a
few times before failing. Patch by Ross Burton.

@item 
gh-95573@footnote{https://github.com/python/cpython/issues/95573}: Lib/test/test_asyncio/test_ssl.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/test/test_asyncio/test_ssl.py} exposed a bug in the
macOS kernel where intense concurrent load on non-blocking sockets
occasionally causes @ref{1bb5,,errno.ENOBUFS} (“No buffer space available”)
to be emitted. FB11063974 filed with Apple, in the mean time as a
workaround buffer size used in tests on macOS is decreased to avoid
intermittent failures.  Patch by Fantix King.

@item 
gh-95280@footnote{https://github.com/python/cpython/issues/95280}: Fix problem with @code{test_ssl} @code{test_get_ciphers} on systems
that require perfect forward secrecy (PFS) ciphers.

@item 
gh-95212@footnote{https://github.com/python/cpython/issues/95212}: Make multiprocessing test case @code{test_shared_memory_recreate}
parallel-safe.

@item 
gh-95218@footnote{https://github.com/python/cpython/issues/95218}: Move tests for importlib.resources into
test_importlib.resources.

@item 
gh-93963@footnote{https://github.com/python/cpython/issues/93963}: Updated tests to use preferred location for
@code{importlib.resources} ABCs.

@item 
gh-94675@footnote{https://github.com/python/cpython/issues/94675}: Add a regression test for @ref{be,,re} exponentional slowdown when
using rjsmin.

@item 
gh-91330@footnote{https://github.com/python/cpython/issues/91330}: Added more tests for @ref{33,,dataclasses} to cover behavior with
data descriptor-based fields.

@item 
gh-94208@footnote{https://github.com/python/cpython/issues/94208}: @code{test_ssl} is now checking for supported TLS version and
protocols in more tests.

@item 
gh-94315@footnote{https://github.com/python/cpython/issues/94315}: Tests now check for DAC override capability instead of relying
on @ref{1bb6,,os.geteuid()}.

@item 
gh-54781@footnote{https://github.com/python/cpython/issues/54781}: Rename test_tk to test_tkinter, and rename test_ttk_guionly to
test_ttk. Patch by Victor Stinner.

@item 
gh-93839@footnote{https://github.com/python/cpython/issues/93839}: Move @code{Lib/ctypes/test/} to @code{Lib/test/test_ctypes/}. Patch by
Victor Stinner.

@item 
gh-93951@footnote{https://github.com/python/cpython/issues/93951}: In test_bdb.StateTestCase.test_skip, avoid including auxiliary
importers.

@item 
gh-93957@footnote{https://github.com/python/cpython/issues/93957}: Provide nicer error reporting from subprocesses in
test_venv.EnsurePipTest.test_with_pip.

@item 
gh-93884@footnote{https://github.com/python/cpython/issues/93884}: Add test cases for @ref{1bb7,,PyNumber_ToBase()} that take a large
number or a non-int object as parameter.

@item 
gh-93852@footnote{https://github.com/python/cpython/issues/93852}: test_asyncio, test_logging, test_socket and test_socketserver
now create AF_UNIX domains in the current directory to no longer fail with
@code{OSError("AF_UNIX path too long")} if the temporary directory (the
@geindex TMPDIR
@geindex environment variable; TMPDIR
@code{TMPDIR} environment variable) is too long. Patch by Victor
Stinner.

@item 
gh-93353@footnote{https://github.com/python/cpython/issues/93353}: regrtest now checks if a test leaks temporary files or
directories if run with -jN option. Patch by Victor Stinner.

@item 
gh-84461@footnote{https://github.com/python/cpython/issues/84461}: @code{run_tests.py} now handles cross compiling env vars correctly
and pass @code{HOSTRUNNER} to regression tests.

@item 
gh-93616@footnote{https://github.com/python/cpython/issues/93616}: @code{test_modulefinder} now creates a temporary directory in
@code{ModuleFinderTest.setUp()} instead of module scope.

@item 
gh-93575@footnote{https://github.com/python/cpython/issues/93575}: Fix issue with test_unicode test_raiseMemError. The test case
now use @code{test.support.calcobjsize} to calculate size of PyUnicode
structs. @ref{1b1f,,sys.getsizeof()} may return different size when string has
UTF-8 memory.

@item 
gh-90473@footnote{https://github.com/python/cpython/issues/90473}: WASI does not have a @code{chmod(2)} syscall. @ref{52a,,os.chmod()} is
now a dummy function on WASI. Skip all tests that depend on working
@code{os.chmod()}.

@item 
gh-90473@footnote{https://github.com/python/cpython/issues/90473}: Skip tests on WASI that require symlinks with absolute paths.

@item 
gh-57539@footnote{https://github.com/python/cpython/issues/57539}: Increase calendar test coverage for
@code{calendar.LocaleTextCalendar.formatweekday()}.

@item 
gh-90473@footnote{https://github.com/python/cpython/issues/90473}: Skip symlink tests on WASI. wasmtime uses @code{openat2(2)} with
@code{RESOLVE_BENEATH} flag, which prevents symlinks with absolute paths.

@item 
gh-89858@footnote{https://github.com/python/cpython/issues/89858}: Fix @code{test_embed} for out-of-tree builds. Patch by Kumar
Aditya.

@item 
gh-92886@footnote{https://github.com/python/cpython/issues/92886}: Fixing tests that fail when running with optimizations (@code{-O})
in @code{test_imaplib.py}.

@item 
gh-92886@footnote{https://github.com/python/cpython/issues/92886}: Fixing tests that fail when running with optimizations (@code{-O})
in @code{test_zipimport.py}

@item 
gh-92886@footnote{https://github.com/python/cpython/issues/92886}: Fixing tests that fail when running with optimizations (@code{-O})
in @code{test_py_compile.py}

@item 
gh-92886@footnote{https://github.com/python/cpython/issues/92886}: Fixing tests that fail when running with optimizations (@code{-O})
in @code{test_sys_settrace.py}.

@item 
gh-92886@footnote{https://github.com/python/cpython/issues/92886}: Fixing tests that fail when running with optimizations (@code{-O})
in @code{_test_multiprocessing.py}

@item 
gh-92670@footnote{https://github.com/python/cpython/issues/92670}: Skip @code{test_shutil.TestCopy.test_copyfile_nonexistent_dir} test
on AIX as the test uses a trailing slash to force the OS consider the path
as a directory, but on AIX the trailing slash has no effect and is
considered as a file.

@item 
gh-92514@footnote{https://github.com/python/cpython/issues/92514}: Remove unused @code{test.support.BasicTestRunner}. Patch by Jelle
Zijlstra.

@item 
bpo-47016@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47016}: Create a GitHub Actions workflow for verifying bundled pip and
setuptools. Patch by Illia Volochii and Adam Turner.
@end itemize

@node Build<36>,Windows<31>,Tests<31>,Python 3 12 0 alpha 1
@anchor{whatsnew/changelog id419}@anchor{1bb8}
@subsubsection Build



@itemize -

@item 
gh-96761@footnote{https://github.com/python/cpython/issues/96761}: Fix the build process of clang compiler for
@code{_bootstrap_python} if LTO optimization is applied. Patch by
Matthias Görgens and Donghee Na.

@item 
gh-96883@footnote{https://github.com/python/cpython/issues/96883}: @code{wasm32-emscripten} builds for browsers now include
@ref{24,,concurrent.futures} for @ref{b,,asyncio} and @ref{10e,,unittest.mock}.

@item 
gh-85936@footnote{https://github.com/python/cpython/issues/85936}: CPython now uses the ThinLTO option as the default policy if the
Clang compiler accepts the flag. Patch by Donghee Na.

@item 
gh-96729@footnote{https://github.com/python/cpython/issues/96729}: Ensure that Windows releases built with
@code{Tools\msi\buildrelease.bat} are upgradable to and from official Python
releases.

@item 
gh-96269@footnote{https://github.com/python/cpython/issues/96269}: Shared module targets now depend on new @code{MODULE_DEPS}
variable, which includes @code{EXPORTSYMS}. This fixes a build order issue on
unsupported AIX platform.

@item 
gh-84461@footnote{https://github.com/python/cpython/issues/84461}: @code{wasm32-emscripten} platform no longer builds @ref{c1,,resource}
module, @ref{1521,,getresuid()}, @ref{1520,,getresgid()}, and their setters.
The APIs are stubs and not functional.

@item 
gh-95973@footnote{https://github.com/python/cpython/issues/95973}: Add a new @code{--with-dsymutil} configure option to link debug
information in macOS. Patch by Pablo Galindo.

@item 
gh-90536@footnote{https://github.com/python/cpython/issues/90536}: Use the BOLT post-link optimizer to improve performance,
particularly on medium-to-large applications.

@item 
gh-93744@footnote{https://github.com/python/cpython/issues/93744}: Remove the @code{configure --with-cxx-main} build option: it didn’t
work for many years. Remove the @code{MAINCC} variable from @code{configure} and
@code{Makefile}. Patch by Victor Stinner.

@item 
gh-94801@footnote{https://github.com/python/cpython/issues/94801}: Fix a regression in @code{configure} script that caused some header
checks to ignore custom @code{CPPFLAGS}. The regression was introduced in
gh-94802@footnote{https://github.com/python/cpython/issues/94802}.

@item 
gh-95145@footnote{https://github.com/python/cpython/issues/95145}: wasm32-wasi builds no longer depend on WASIX’s pthread stubs.
Python now has its own stubbed pthread API.

@item 
gh-95174@footnote{https://github.com/python/cpython/issues/95174}: Python now detects missing @code{dup} function in WASI and works
around some missing @ref{5b,,errno}, @ref{c6,,select}, and @ref{d1,,socket}
constants.

@item 
gh-95174@footnote{https://github.com/python/cpython/issues/95174}: Python now skips missing @ref{d1,,socket} functions and methods on
WASI. WASI can only create sockets from existing fd / accept and has no
netdb.

@item 
gh-95085@footnote{https://github.com/python/cpython/issues/95085}: Platforms @code{wasm32-unknown-emscripten} and
@code{wasm32-unknown-wasi} have been promoted to 
@geindex Python Enhancement Proposals; PEP 11
PEP 11@footnote{https://peps.python.org/pep-0011/} tier 3 platform
support.

@item 
gh-94847@footnote{https://github.com/python/cpython/issues/94847}: Fixed @code{_decimal} module build issue on GCC when compiling with
LTO and pydebug. Debug builds no longer force inlining of functions.

@item 
gh-94841@footnote{https://github.com/python/cpython/issues/94841}: Fix the possible performance regression of
@ref{e65,,PyObject_Free()} compiled with MSVC version 1932.

@item 
gh-94801@footnote{https://github.com/python/cpython/issues/94801}: @code{configure} now uses custom flags like @code{ZLIB_CFLAGS} and
@code{ZLIB_LIBS} when searching for headers and libraries.

@item 
gh-94773@footnote{https://github.com/python/cpython/issues/94773}: @code{deepfreeze.py} now supports code object with frozensets that
contain incompatible, unsortable types.

@item 
gh-94682@footnote{https://github.com/python/cpython/issues/94682}: Build and test with OpenSSL 1.1.1q

@item 
gh-90005@footnote{https://github.com/python/cpython/issues/90005}: Dependencies of @ref{bf,,readline} and @ref{2f,,curses} module are now
detected in @code{configure} script with @code{pkg-config}. Only @code{ncurses} /
@code{ncursesw} are detected automatically. The old @code{curses} library is not
configured automatically. Workaround for missing @code{termcap} or @code{tinfo}
library has been removed.

@item 
gh-90005@footnote{https://github.com/python/cpython/issues/90005}: Fix building @code{_ctypes} extension without @code{pkg-config}.

@item 
gh-90005@footnote{https://github.com/python/cpython/issues/90005}: @code{_dbm} module dependencies are now detected by configure.

@item 
gh-94404@footnote{https://github.com/python/cpython/issues/94404}: @code{makesetup} now works around an issue with sed on macOS and
uses correct CFLAGS for object files that end up in a shared extension.
Module CFLAGS are used before PY_STDMODULE_CFLAGS to avoid clashes with
system headers.

@item 
gh-93939@footnote{https://github.com/python/cpython/issues/93939}: C extension modules are now built by @code{configure} and @code{make}
instead of @code{distutils} and @code{setup.py}.

@item 
gh-93939@footnote{https://github.com/python/cpython/issues/93939}: The @code{2to3}, @code{idle}, and @code{pydoc} scripts are now generated
and installed by @code{Makefile} instead of @code{setup.py}.

@item 
gh-94280@footnote{https://github.com/python/cpython/issues/94280}: Updated pegen regeneration script on Windows to find and use
Python 3.9 or higher.  Prior to this, pegen regeneration already required
3.9 or higher, but the script may have used lower versions of Python.

@item 
gh-93584@footnote{https://github.com/python/cpython/issues/93584}: Address race condition in @code{Makefile} when installing a PGO
build. All @code{test} and @code{install} targets now depend on @code{all} target.

@item 
gh-93491@footnote{https://github.com/python/cpython/issues/93491}: @code{configure} now detects and reports 
@geindex Python Enhancement Proposals; PEP 11
PEP 11@footnote{https://peps.python.org/pep-0011/} support tiers.

@item 
gh-69093@footnote{https://github.com/python/cpython/issues/69093}: Fix @code{Modules/Setup.stdlib.in} rule for @code{_sqlite3} extension.

@item 
gh-93207@footnote{https://github.com/python/cpython/issues/93207}: @code{va_start()} with two parameters, like @code{va_start(args,
format),} is now required to build Python. @code{va_start()} is no longer
called with a single parameter. Patch by Kumar Aditya.

@item 
gh-93202@footnote{https://github.com/python/cpython/issues/93202}: Python now always use the @code{%zu} and @code{%zd} printf formats to
format a @code{size_t} or @code{Py_ssize_t} number. Building Python 3.12
requires a C11 compiler, so these printf formats are now always supported.
Patch by Victor Stinner.

@item 
gh-90473@footnote{https://github.com/python/cpython/issues/90473}: Disable pymalloc and increase stack size on @code{wasm32-wasi}.

@item 
bpo-34449@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34449}: Drop invalid compiler switch @code{-fPIC} for HP aCC on HP-UX.
Patch by Michael Osipov.
@end itemize

@node Windows<31>,macOS<23>,Build<36>,Python 3 12 0 alpha 1
@anchor{whatsnew/changelog id420}@anchor{1bb9}
@subsubsection Windows



@itemize -

@item 
gh-98360@footnote{https://github.com/python/cpython/issues/98360}: Fixes @ref{98,,multiprocessing} spawning child processes on Windows
from a virtual environment to ensure that child processes that also use
@code{multiprocessing} to spawn more children will recognize that they are
in a virtual environment.

@item 
gh-98414@footnote{https://github.com/python/cpython/issues/98414}: Fix @code{py.exe} launcher handling of @code{-V:@var{<company>}/}
option when default preferences have been set in environment variables or
configuration files.

@item 
gh-97728@footnote{https://github.com/python/cpython/issues/97728}: Fix possible crashes caused by the use of uninitialized
variables when pass invalid arguments in @ref{1669,,os.system()} on Windows and
in Windows-specific modules (like @code{winreg}).

@item 
gh-90989@footnote{https://github.com/python/cpython/issues/90989}: Made @ref{7db,,Python install manager} install per-user by default (unless an all
users install already exists), and clarify some text in the installer.

@item 
gh-97649@footnote{https://github.com/python/cpython/issues/97649}: The @code{Tools} directory is no longer installed on Windows

@item 
gh-96965@footnote{https://github.com/python/cpython/issues/96965}: Update libffi to 3.4.3

@item 
gh-96577@footnote{https://github.com/python/cpython/issues/96577}: Fixes a potential buffer overrun in @code{msilib}.

@item 
gh-96559@footnote{https://github.com/python/cpython/issues/96559}: Fixes the Windows launcher not using the compatible
interpretation of default tags found in configuration files when no tag
was passed to the command.

@item 
gh-94781@footnote{https://github.com/python/cpython/issues/94781}: Fix @code{pcbuild.proj} to clean previous instances of output
files in @code{Python\deepfreeze} and @code{Python\frozen_modules} directories
on Windows. Patch by Charlie Zhao.

@item 
gh-89545@footnote{https://github.com/python/cpython/issues/89545}: Updates @ref{af,,platform} code getting the Windows version to use
native Windows Management Instrumentation (WMI) queries to determine OS
version, type, and architecture.

@item 
gh-95733@footnote{https://github.com/python/cpython/issues/95733}: Make certain requirements of the Windows Store package optional
to allow installing on earlier updates of Windows.

@item 
gh-95656@footnote{https://github.com/python/cpython/issues/95656}: Enable the @ref{a45,,enable_load_extension()}
@ref{d4,,sqlite3} API.

@item 
gh-95587@footnote{https://github.com/python/cpython/issues/95587}: Fixes some issues where the Windows installer would incorrectly
detect certain features of an existing install when upgrading.

@item 
gh-94399@footnote{https://github.com/python/cpython/issues/94399}: Restores the behaviour of @ref{7db,,Python install manager} for @code{/usr/bin/env}
shebang lines, which will now search 
@geindex PATH
@geindex environment variable; PATH
@code{PATH} for an executable
matching the given command. If none is found, the usual search process is
used.

@item 
gh-95445@footnote{https://github.com/python/cpython/issues/95445}: Fixes the unsuccessful removal of the HTML document directory
when uninstalling with Windows msi.

@item 
gh-95359@footnote{https://github.com/python/cpython/issues/95359}: Fix @ref{7db,,Python install manager} handling of @code{py.ini} commands (it was
incorrectly expecting a @code{py_} prefix on keys) and crashes when reading
per-user configuration file.

@item 
gh-95285@footnote{https://github.com/python/cpython/issues/95285}: Fix @ref{7db,,Python install manager} handling of command lines where it is only
passed a short executable name.

@item 
gh-90844@footnote{https://github.com/python/cpython/issues/90844}: Allow virtual environments to correctly launch when they have
spaces in the path.

@item 
gh-94772@footnote{https://github.com/python/cpython/issues/94772}: Fix incorrect handling of shebang lines in py.exe launcher

@item 
gh-94018@footnote{https://github.com/python/cpython/issues/94018}: @ref{138,,zipfile} will now remove trailing spaces from path
components when extracting files on Windows.

@item 
gh-93824@footnote{https://github.com/python/cpython/issues/93824}: Drag and drop of files onto Python files in Windows Explorer has
been enabled for Windows ARM64.

@item 
gh-43414@footnote{https://github.com/python/cpython/issues/43414}: @ref{130e,,os.get_terminal_size()} now attempts to read the size from
any provided handle, rather than only supporting file descriptors 0, 1 and
2.

@item 
gh-92817@footnote{https://github.com/python/cpython/issues/92817}: Ensures that @code{py.exe} will prefer an active virtual
environment over default tags specified with environment variables or
through a @code{py.ini} file.

@item 
gh-92984@footnote{https://github.com/python/cpython/issues/92984}: Explicitly disable incremental linking for non-Debug builds

@item 
gh-92841@footnote{https://github.com/python/cpython/issues/92841}: @ref{b,,asyncio} no longer throws @code{RuntimeError: Event loop is
closed} on interpreter exit after asynchronous socket activity. Patch by
Oleg Iarygin.

@item 
bpo-46907@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46907}: Update Windows installer to use SQLite 3.38.4.

@item 
gh-91061@footnote{https://github.com/python/cpython/issues/91061}: Accept os.PathLike for the argument to winsound.PlaySound

@item 
bpo-42658@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42658}: Support native Windows case-insensitive path comparisons by
using @code{LCMapStringEx} instead of @ref{1bba,,str.lower()} in
@code{ntpath.normcase()}. Add @code{LCMapStringEx} to the @code{_winapi}
module.

@item 
bpo-38704@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38704}: Prevent installation on unsupported Windows versions.
@end itemize

@node macOS<23>,IDLE<16>,Windows<31>,Python 3 12 0 alpha 1
@anchor{whatsnew/changelog id421}@anchor{1bbb}
@subsubsection macOS



@itemize -

@item 
gh-97897@footnote{https://github.com/python/cpython/issues/97897}: The macOS 13 SDK includes support for the @code{mkfifoat} and
@code{mknodat} system calls. Using the @code{dir_fd} option with either
@ref{f96,,os.mkfifo()} or @ref{f97,,os.mknod()} could result in a segfault if
cpython is built with the macOS 13 SDK but run on an earlier version of
macOS. Prevent this by adding runtime support for detection of these
system calls (“weaklinking”) as is done for other newer syscalls on macOS.
@end itemize

@node IDLE<16>,Tools/Demos<24>,macOS<23>,Python 3 12 0 alpha 1
@anchor{whatsnew/changelog id422}@anchor{1bbc}
@subsubsection IDLE



@itemize -

@item 
gh-97527@footnote{https://github.com/python/cpython/issues/97527}: Fix a bug in the previous bugfix that caused IDLE to not start
when run with 3.10.8, 3.12.0a1, and at least Microsoft Python 3.10.2288.0
installed without the Lib/test package.  3.11.0 was never affected.

@item 
gh-65802@footnote{https://github.com/python/cpython/issues/65802}: Document handling of extensions in Save As dialogs.

@item 
gh-95191@footnote{https://github.com/python/cpython/issues/95191}: Include prompts when saving Shell (interactive input and
output).

@item 
gh-95511@footnote{https://github.com/python/cpython/issues/95511}: Fix the Shell context menu copy-with-prompts bug of copying an
extra line when one selects whole lines.

@item 
gh-95471@footnote{https://github.com/python/cpython/issues/95471}: In the Edit menu, move @code{Select All} and add a new separator.

@item 
gh-95411@footnote{https://github.com/python/cpython/issues/95411}: Enable using IDLE’s module browser with .pyw files.

@item 
gh-89610@footnote{https://github.com/python/cpython/issues/89610}: Add .pyi as a recognized extension for IDLE on macOS.    This
allows opening stub files by double clicking on them in the Finder.
@end itemize

@node Tools/Demos<24>,C API<32>,IDLE<16>,Python 3 12 0 alpha 1
@anchor{whatsnew/changelog id423}@anchor{1bbd}
@subsubsection Tools/Demos



@itemize -

@item 
gh-68686@footnote{https://github.com/python/cpython/issues/68686}: Remove ptags and eptags scripts.

@item 
gh-97681@footnote{https://github.com/python/cpython/issues/97681}: Remove the @code{Tools/demo/} directory which contained old demo
scripts. A copy can be found in the old-demos project@footnote{https://github.com/gvanrossum/old-demos}.  Patch by Victor Stinner.

@item 
gh-97669@footnote{https://github.com/python/cpython/issues/97669}: Remove outdated example scripts of the @code{Tools/scripts/}
directory. A copy can be found in the old-demos project@footnote{https://github.com/gvanrossum/old-demos}. Patch by Victor Stinner.

@item 
gh-95853@footnote{https://github.com/python/cpython/issues/95853}: The @code{wasm_build.py} script now pre-builds Emscripten ports,
checks for broken EMSDK versions, and warns about pkg-config env vars.

@item 
gh-95853@footnote{https://github.com/python/cpython/issues/95853}: The new tool @code{Tools/wasm/wasm_builder.py} automates configure,
compile, and test steps for building CPython on WebAssembly platforms.

@item 
gh-95731@footnote{https://github.com/python/cpython/issues/95731}: Fix handling of module docstrings in
@code{Tools/i18n/pygettext.py}.

@item 
gh-93939@footnote{https://github.com/python/cpython/issues/93939}: Add script @code{Tools/scripts/check_modules.py} to check and
validate builtin and shared extension modules. The script also handles
@code{Modules/Setup} and will eventually replace @code{setup.py}.

@item 
gh-94538@footnote{https://github.com/python/cpython/issues/94538}: Fix Argument Clinic output to custom file destinations. Patch by
Erlend E. Aasland.

@item 
gh-94430@footnote{https://github.com/python/cpython/issues/94430}: Allow parameters named @code{module} and @code{self} with custom C
names in Argument Clinic. Patch by Erlend E. Aasland

@item 
gh-86087@footnote{https://github.com/python/cpython/issues/86087}: The @code{Tools/scripts/parseentities.py} script used to parse
HTML4 entities has been removed.
@end itemize

@node C API<32>,,Tools/Demos<24>,Python 3 12 0 alpha 1
@anchor{whatsnew/changelog id425}@anchor{1bbe}
@subsubsection C API



@itemize -

@item 
gh-98393@footnote{https://github.com/python/cpython/issues/98393}: The @ref{798,,PyUnicode_FSDecoder()} function no longer accepts
bytes-like paths, like @ref{342,,bytearray} and @ref{166,,memoryview} types:
only the exact @ref{193,,bytes} type is accepted for bytes strings. Patch by
Victor Stinner.

@item 
gh-91051@footnote{https://github.com/python/cpython/issues/91051}: Add @ref{787,,PyType_Watch()} and related APIs to allow callbacks
on @ref{1bbf,,PyType_Modified()}.

@item 
gh-95756@footnote{https://github.com/python/cpython/issues/95756}: Lazily create and cache @code{co_} attributes for better
performance for code getters.

@item 
gh-96512@footnote{https://github.com/python/cpython/issues/96512}: Configuration for the @ref{80c,,integer string conversion length limitation} now lives in the PyConfig C API struct.

@item 
gh-95589@footnote{https://github.com/python/cpython/issues/95589}: Extensions classes that set @code{tp_dictoffset} and
@code{tp_weaklistoffset} lose the support for multiple inheritance, but are
now safe. Extension classes should use @ref{60f,,Py_TPFLAGS_MANAGED_DICT}
and @ref{77d,,Py_TPFLAGS_MANAGED_WEAKREF} instead.

@item 
gh-95781@footnote{https://github.com/python/cpython/issues/95781}: An unrecognized format character in
@ref{62b,,PyUnicode_FromFormat()} and @ref{795,,PyUnicode_FromFormatV()} now
sets a @ref{796,,SystemError}. In previous versions it caused all the rest of
the format string to be copied as-is to the result string, and any extra
arguments discarded.

@item 
gh-92678@footnote{https://github.com/python/cpython/issues/92678}: Restore the 3.10 behavior for multiple inheritance of C
extension classes that store their dictionary at the end of the struct.

@item 
gh-92678@footnote{https://github.com/python/cpython/issues/92678}: Support C extensions using managed dictionaries by setting the
@code{Py_TPFLAGS_MANAGED_DICT} flag.

@item 
gh-93274@footnote{https://github.com/python/cpython/issues/93274}: API for implementing vectorcall
(@ref{777,,Py_TPFLAGS_HAVE_VECTORCALL}, @ref{778,,PyVectorcall_NARGS()} and
@ref{779,,PyVectorcall_Call()}) was added to the limited API and stable ABI.

@item 
gh-95504@footnote{https://github.com/python/cpython/issues/95504}: Fix sign placement when specifying width or precision in
@ref{62b,,PyUnicode_FromFormat()} and @ref{795,,PyUnicode_FromFormatV()}. Patch
by Philip Georgi.

@item 
gh-93012@footnote{https://github.com/python/cpython/issues/93012}: The @ref{777,,Py_TPFLAGS_HAVE_VECTORCALL} flag is now removed
from a class when the class’s @ref{77b,,__call__()} method is
reassigned. This makes vectorcall safe to use with mutable types (i.e.
heap types without the @code{immutable}
flag). Mutable types that do not override
@ref{77c,,tp_call} now inherit the
@code{Py_TPFLAGS_HAVE_VECTORCALL} flag.

@item 
gh-95388@footnote{https://github.com/python/cpython/issues/95388}: Creating @ref{3cd,,immutable types}
with mutable bases is deprecated and is planned to be disabled in Python
3.14.

@item 
gh-92678@footnote{https://github.com/python/cpython/issues/92678}: Adds unstable C-API functions @code{_PyObject_VisitManagedDict} and
@code{_PyObject_ClearManagedDict} to allow C extensions to allow the VM to
manage their object’s dictionaries.

@item 
gh-94936@footnote{https://github.com/python/cpython/issues/94936}: Added @ref{982,,PyCode_GetVarnames()}, @ref{983,,PyCode_GetCellvars()}
and @ref{984,,PyCode_GetFreevars()} for accessing @code{co_varnames},
@code{co_cellvars} and @code{co_freevars} respectively via the C API.

@item 
gh-94930@footnote{https://github.com/python/cpython/issues/94930}: Fix @code{SystemError} raised when
@ref{624,,PyArg_ParseTupleAndKeywords()} is used with @code{#} in @code{(...)} but
without @code{PY_SSIZE_T_CLEAN} defined.

@item 
gh-94731@footnote{https://github.com/python/cpython/issues/94731}: Python again uses C-style casts for most casting operations when
compiled with C++. This may trigger compiler warnings, if they are enabled
with e.g. @code{-Wold-style-cast} or @code{-Wzero-as-null-pointer-constant}
options for @code{g++}.

@item 
gh-93937@footnote{https://github.com/python/cpython/issues/93937}: The following frame functions and type are now directly
available with @code{#include <Python.h>}, it’s no longer needed to add
@code{#include <frameobject.h>}:


@itemize *

@item 
@ref{98d,,PyFrame_Check()}

@item 
@ref{98e,,PyFrame_GetBack()}

@item 
@ref{974,,PyFrame_GetBuiltins()}

@item 
@ref{975,,PyFrame_GetGenerator()}

@item 
@ref{976,,PyFrame_GetGlobals()}

@item 
@ref{977,,PyFrame_GetLasti()}

@item 
@ref{661,,PyFrame_GetLocals()}

@item 
@ref{98f,,PyFrame_Type}
@end itemize

Patch by Victor Stinner.

@item 
gh-91321@footnote{https://github.com/python/cpython/issues/91321}: Fix the compatibility of the Python C API with C++ older than
C++11. Patch by Victor Stinner.

@item 
gh-91731@footnote{https://github.com/python/cpython/issues/91731}: Avoid defining the @code{static_assert} when compiling with C++ 11,
where this is a keyword and redefining it can lead to undefined behavior.
Patch by Pablo Galindo

@item 
gh-89546@footnote{https://github.com/python/cpython/issues/89546}: @ref{773,,PyType_FromMetaclass()} (and other @code{PyType_From*}
functions) now check that offsets and the base class’s
@ref{b84,,tp_basicsize} fit in the new class’s
@code{tp_basicsize}.

@item 
gh-93503@footnote{https://github.com/python/cpython/issues/93503}: Add two new public functions to the public C-API,
@ref{782,,PyEval_SetProfileAllThreads()} and
@ref{664,,PyEval_SetTraceAllThreads()}, that allow to set tracing and
profiling functions in all running threads in addition to the calling one.
Also, two analogous functions to the @ref{f3,,threading} module
(@ref{6f1,,threading.setprofile_all_threads()} and
@ref{6f0,,threading.settrace_all_threads()}) that allow to do the same from
Python. Patch by Pablo Galindo

@item 
gh-93442@footnote{https://github.com/python/cpython/issues/93442}: Add C++ overloads for _Py_CAST_impl() to handle 0/NULL.  This
will allow C++ extensions that pass 0 or NULL to macros using _Py_CAST()
to continue to compile.

@item 
gh-93466@footnote{https://github.com/python/cpython/issues/93466}: Slot IDs in PyType_Spec may not be repeated. The documentation
was updated to mention this. For some cases of repeated slots,
PyType_FromSpec and related functions will now raise an exception.

@item 
gh-92898@footnote{https://github.com/python/cpython/issues/92898}: Fix C++ compiler warnings when casting function arguments to
@code{PyObject*}. Patch by Serge Guelton.

@item 
gh-93103@footnote{https://github.com/python/cpython/issues/93103}: Deprecate global configuration variables, like
@ref{408,,Py_IgnoreEnvironmentFlag}, in the documentation: the
@ref{3f4,,Py_InitializeFromConfig()} API should be instead. Patch by Victor
Stinner.

@item 
gh-77782@footnote{https://github.com/python/cpython/issues/77782}: Deprecate global configuration variable like
@ref{408,,Py_IgnoreEnvironmentFlag}: the @ref{3f4,,Py_InitializeFromConfig()}
API should be instead. Patch by Victor Stinner.

@item 
gh-92913@footnote{https://github.com/python/cpython/issues/92913}: Ensures changes to @ref{643,,PyConfig.module_search_paths} are
ignored unless @ref{806,,PyConfig.module_search_paths_set} is set

@item 
gh-92781@footnote{https://github.com/python/cpython/issues/92781}: Avoid mixing declarations and code in the C API to fix the
compiler warning: “ISO C90 forbids mixed declarations and code”
[-Werror=declaration-after-statement]. Patch by Victor Stinner.

@item 
gh-92651@footnote{https://github.com/python/cpython/issues/92651}: Remove the @code{token.h} header file. There was never any public
tokenizer C API. The @code{token.h} header file was only designed to be used
by Python internals. Patch by Victor Stinner.

@item 
gh-92536@footnote{https://github.com/python/cpython/issues/92536}: Remove legacy Unicode APIs based on @code{Py_UNICODE*}.

@item 
gh-85858@footnote{https://github.com/python/cpython/issues/85858}: Remove the @code{PyUnicode_InternImmortal()} function and the
@code{SSTATE_INTERNED_IMMORTAL} macro. Patch by Victor Stinner.

@item 
gh-92193@footnote{https://github.com/python/cpython/issues/92193}: Add new function @ref{783,,PyFunction_SetVectorcall()} to the C API
which sets the vectorcall field of a given @ref{784,,PyFunctionObject}.

Warning: extensions using this API must preserve the behavior of the
unaltered function!

@item 
gh-59121@footnote{https://github.com/python/cpython/issues/59121}: Fixed an assert that prevented @code{PyRun_InteractiveOne} from
providing tracebacks when parsing from the provided FD.

@item 
bpo-45383@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45383}: The @ref{79e,,PyType_FromSpec()} API will now find and use a
metaclass based on the provided bases. An error will be raised if there is
a metaclass conflict.
@end itemize

@node Python 3 11 0 beta 1,Python 3 11 0 alpha 7,Python 3 12 0 alpha 1,Changelog
@anchor{whatsnew/changelog python-3-11-0-beta-1}@anchor{1bc0}
@subsection Python 3.11.0 beta 1


`Release date: 2022-05-06'

@menu
* Security: Security<32>. 
* Core and Builtins: Core and Builtins<88>. 
* Library: Library<92>. 
* Core and Builtins: Core and Builtins<89>. 
* Build: Build<37>. 
* Core and Builtins: Core and Builtins<90>. 
* Library: Library<93>. 
* Documentation: Documentation<32>. 
* Tests: Tests<32>. 
* Build: Build<38>. 
* Windows: Windows<32>. 
* macOS: macOS<24>. 
* Tools/Demos: Tools/Demos<25>. 
* C API: C API<33>. 

@end menu

@node Security<32>,Core and Builtins<88>,,Python 3 11 0 beta 1
@anchor{whatsnew/changelog id426}@anchor{1bc1}
@subsubsection Security



@itemize -

@item 
gh-57684@footnote{https://github.com/python/cpython/issues/57684}: Add the @ref{7c2,,-P} command line option and the
@geindex PYTHONSAFEPATH
@geindex environment variable; PYTHONSAFEPATH
@ref{7c3,,PYTHONSAFEPATH} environment variable to not prepend a potentially
unsafe path to @ref{3e2,,sys.path}. Patch by Victor Stinner.
@end itemize

@node Core and Builtins<88>,Library<92>,Security<32>,Python 3 11 0 beta 1
@anchor{whatsnew/changelog id427}@anchor{1bc2}
@subsubsection Core and Builtins



@itemize -

@item 
gh-89519@footnote{https://github.com/python/cpython/issues/89519}: Chaining classmethod descriptors (introduced in bpo-19072@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19072}) is
deprecated. It can no longer be used to wrap other descriptors such as
property().  The core design of this feature was flawed, and it caused a
number of downstream problems.

@item 
gh-92345@footnote{https://github.com/python/cpython/issues/92345}: @code{pymain_run_python()} now imports @code{readline} and
@code{rlcompleter} before sys.path is extended to include the current working
directory of an interactive interpreter. Non-interactive interpreters are
not affected.

@item 
bpo-43857@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43857}: Improve the @ref{5f0,,AttributeError} message when deleting a
missing attribute. Patch by Géry Ogam.

@item 
gh-92245@footnote{https://github.com/python/cpython/issues/92245}: Make sure that PEP 523 is respected in all cases. In 3.11a7,
specialization may have prevented Python-to-Python calls respecting PEP
523.

@item 
gh-92203@footnote{https://github.com/python/cpython/issues/92203}: Add a closure keyword-only parameter to @ref{4a3,,exec()}. It can
only be specified when exec-ing a code object that uses free variables.
When specified, it must be a tuple, with exactly the number of cell
variables referenced by the code object. closure has a default value of
@code{None}, and it must be @code{None} if the code object doesn’t refer to any
free variables.

@item 
gh-91173@footnote{https://github.com/python/cpython/issues/91173}: Disable frozen modules in debug builds. Patch by Kumar Aditya.

@item 
gh-92114@footnote{https://github.com/python/cpython/issues/92114}: Improve error message when subscript a type with
@code{__class_getitem__} set to @code{None}.

@item 
gh-92112@footnote{https://github.com/python/cpython/issues/92112}: Fix crash triggered by an evil custom @code{mro()} on a metaclass.

@item 
gh-92063@footnote{https://github.com/python/cpython/issues/92063}: The @code{PRECALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS} instruction
now ensures methods are called only on objects of the correct type.

@item 
gh-92031@footnote{https://github.com/python/cpython/issues/92031}: Deoptimize statically allocated code objects during
@code{Py_FINALIZE()} so that future @code{_PyCode_Quicken} calls always start
with unquickened code.

@item 
gh-92036@footnote{https://github.com/python/cpython/issues/92036}: Fix a crash in subinterpreters related to the garbage collector.
When a subinterpreter is deleted, untrack all objects tracked by its GC.
To prevent a crash in deallocator functions expecting objects to be
tracked by the GC, leak a strong reference to these objects on purpose, so
they are never deleted and their deallocator functions are not called.
Patch by Victor Stinner.

@item 
gh-92032@footnote{https://github.com/python/cpython/issues/92032}: The interpreter can now autocomplete soft keywords, as of now
@code{match}, @code{case}, and @code{_} (wildcard pattern) from 
@geindex Python Enhancement Proposals; PEP 634
PEP 634@footnote{https://peps.python.org/pep-0634/}.

@item 
gh-87999@footnote{https://github.com/python/cpython/issues/87999}: The warning emitted by the Python parser for a numeric literal
immediately followed by keyword has been changed from deprecation warning
to syntax warning.

@item 
gh-91869@footnote{https://github.com/python/cpython/issues/91869}: Fix an issue where specialized opcodes with extended arguments
could produce incorrect tracing output or lead to assertion failures.

@item 
gh-91603@footnote{https://github.com/python/cpython/issues/91603}: Speed up @ref{2a9,,types.UnionType} instantiation. Based on patch
provided by Yurii Karabas.

@item 
gh-89373@footnote{https://github.com/python/cpython/issues/89373}: If Python is built in debug mode, Python now ensures that
deallocator functions leave the current exception unchanged. Patch by
Victor Stinner.

@item 
gh-91632@footnote{https://github.com/python/cpython/issues/91632}: Fix a minor memory leak at exit: release the memory of the
@code{generic_alias_iterator} type. Patch by Donghee Na.

@item 
gh-81548@footnote{https://github.com/python/cpython/issues/81548}: Octal escapes with value larger than @code{0o377} now produce a
@ref{1a4,,DeprecationWarning}. In a future Python version they will be a
@ref{1af,,SyntaxWarning} and eventually a @ref{18f,,SyntaxError}.

@item 
bpo-43950@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43950}: Use a single compact table for line starts, ends and column
offsets. Reduces memory consumption for location info by half

@item 
gh-91102@footnote{https://github.com/python/cpython/issues/91102}: Use Argument Clinic for @code{EncodingMap}.  Patch by Oleg
Iarygin.

@item 
gh-91636@footnote{https://github.com/python/cpython/issues/91636}: Fixed a crash in a garbage-collection edge-case, in which a
@code{PyFunction_Type.tp_clear} function could leave a python function object
in an inconsistent state.

@item 
gh-91603@footnote{https://github.com/python/cpython/issues/91603}: Speed up @ref{2af,,isinstance()} and @ref{9ca,,issubclass()} checks for
@ref{2a9,,types.UnionType}. Patch by Yurii Karabas.

@item 
gh-91625@footnote{https://github.com/python/cpython/issues/91625}: Fixed a bug in which adaptive opcodes ignored any preceding
@code{EXTENDED_ARG}s on specialization failure.

@item 
gh-78607@footnote{https://github.com/python/cpython/issues/78607}: The LLTRACE special build now looks for the name @code{__lltrace__}
defined in module globals, rather than the name @code{__ltrace__}, which had
been introduced as a typo.

@item 
gh-91576@footnote{https://github.com/python/cpython/issues/91576}: Speed up iteration of ascii strings by 50%. Patch by Kumar
Aditya.

@item 
gh-89279@footnote{https://github.com/python/cpython/issues/89279}: Improve interpreter performance on Windows by inlining a few
specific macros.

@item 
gh-91502@footnote{https://github.com/python/cpython/issues/91502}: Add a new @code{_PyFrame_IsEntryFrame()} API function, to
check if a @ref{991,,PyFrameObject} is an entry frame. Patch by Pablo
Galindo.

@item 
gh-91266@footnote{https://github.com/python/cpython/issues/91266}: Refactor the @code{bytearray} strip methods @code{strip}, @code{lstrip}
and @code{rstrip} to use a common implementation.

@item 
gh-91479@footnote{https://github.com/python/cpython/issues/91479}: Replaced the @code{__note__} field of @ref{7d8,,BaseException} (added
in an earlier version of 3.11) with the final design of 
@geindex Python Enhancement Proposals; PEP 678
PEP 678@footnote{https://peps.python.org/pep-0678/}.
Namely, @code{BaseException} gets an @code{add_note()} method, and its
@code{__notes__} field is created when necessary.

@item 
gh-46055@footnote{https://github.com/python/cpython/issues/46055}: Speed up right shift of negative integers, by removing
unnecessary creation of temporaries. Original patch by Xinhang Xu,
reworked by Mark Dickinson.

@item 
gh-91462@footnote{https://github.com/python/cpython/issues/91462}: Make the interpreter’s low-level tracing (lltrace) feature
output more readable by displaying opcode names (rather than just
numbers), and by displaying stack contents before each opcode.

@item 
gh-89455@footnote{https://github.com/python/cpython/issues/89455}: Fixed an uninitialized bool value in the traceback printing code
path that was introduced by the initial bpo-45292@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45292} exception groups work.

@item 
gh-91421@footnote{https://github.com/python/cpython/issues/91421}: Fix a potential integer overflow in _Py_DecodeUTF8Ex.

@item 
gh-91428@footnote{https://github.com/python/cpython/issues/91428}: Add @code{static const char *const _PyOpcode_OpName[256] = @{...@};}
to @code{opcode.h} for debug builds to assist in debugging the Python
interpreter. It is now more convenient to make various forms of debugging
output more human-readable by including opcode names rather than just the
corresponding decimal digits.

@item 
bpo-47120@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47120}: Make @ref{1aa5,,POP_JUMP_IF_TRUE}, @ref{1aa6,,POP_JUMP_IF_FALSE},
@ref{1bc3,,POP_JUMP_IF_NONE} and @ref{1bc4,,POP_JUMP_IF_NOT_NONE} virtual,
mapping to new relative jump opcodes.

@item 
bpo-45317@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45317}: Add internal documentation explaining design of new (for 3.11)
frame stack.
@end itemize

@node Library<92>,Core and Builtins<89>,Core and Builtins<88>,Python 3 11 0 beta 1
@anchor{whatsnew/changelog id428}@anchor{1bc5}
@subsubsection Library



@itemize -

@item 
bpo-47197@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47197}: ctypes used to mishandle @code{void} return types, so that for
instance a function declared like @code{ctypes.CFUNCTYPE(None, ctypes.c_int)}
would be called with signature @code{int f(int)} instead of @code{void f(int)}.
Wasm targets require function pointers to be called with the correct
signatures so this led to crashes. The problem is now fixed.
@end itemize

@node Core and Builtins<89>,Build<37>,Library<92>,Python 3 11 0 beta 1
@anchor{whatsnew/changelog id429}@anchor{1bc6}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-47120@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47120}: Make opcodes @code{JUMP_IF_TRUE_OR_POP} and
@code{JUMP_IF_FALSE_OR_POP} relative rather than absolute.

@item 
bpo-47177@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47177}: Replace the @code{f_lasti} member of the internal
@code{_PyInterpreterFrame} structure with a @code{prev_instr} pointer, which
reduces overhead in the main interpreter loop. The @code{f_lasti} attribute
of Python-layer frame objects is preserved for backward-compatibility.

@item 
bpo-46961@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46961}: Integer mod/remainder operations, including the three-argument
form of @ref{1a5,,pow()}, now consistently return ints from the global small
integer cache when applicable.

@item 
bpo-46962@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46962}: Classes and functions that unconditionally declared their
docstrings ignoring the @code{--without-doc-strings} compilation flag no
longer do so.

The classes affected are @code{ctypes.UnionType},
@ref{1797,,pickle.PickleBuffer}, @code{testcapi.RecursingInfinitelyError},
and @ref{9f2,,types.GenericAlias}.

The functions affected are 24 methods in @ref{2e,,ctypes}.

Patch by Oleg Iarygin.

@item 
bpo-46942@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46942}: Use Argument Clinic for the @ref{1bc7,,types.MethodType}
constructor.  Patch by Oleg Iarygin.

@item 
bpo-46764@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46764}: Fix wrapping bound methods with @@classmethod

@item 
bpo-43464@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43464}: Optimize @ref{1bc8,,set.intersection()} for non-set arguments.

@item 
bpo-46721@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46721}: Optimize @ref{1bc9,,set.issuperset()} for non-set argument.

@item 
bpo-46509@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46509}: Add type-specialized versions of the @code{Py_DECREF()}, and use
them for @code{float}, @code{int}, @code{str}, @code{bool}, and @code{None} to avoid
pointer-chasing at runtime where types are known at C compile time.
@end itemize

@node Build<37>,Core and Builtins<90>,Core and Builtins<89>,Python 3 11 0 beta 1
@anchor{whatsnew/changelog id430}@anchor{1bca}
@subsubsection Build



@itemize -

@item 
bpo-46045@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46045}: Do not use POSIX semaphores on NetBSD
@end itemize

@node Core and Builtins<90>,Library<93>,Build<37>,Python 3 11 0 beta 1
@anchor{whatsnew/changelog id431}@anchor{1bcb}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-36819@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36819}: Fix crashes in built-in encoders with error handlers that
return position less or equal than the starting position of non-encodable
characters.

@item 
bpo-34093@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34093}: @code{marshal.dumps()} uses @code{FLAG_REF} for all interned strings.
This makes output more deterministic and helps reproducible build.

@item 
bpo-26579@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26579}: Added @code{object.__getstate__} which provides the default
implementation of the @code{__getstate__()} method.

Copying and pickling instances of subclasses of builtin types bytearray,
set, frozenset, collections.OrderedDict, collections.deque,
weakref.WeakSet, and datetime.tzinfo now copies and pickles instance
attributes implemented as slots.
@end itemize

@node Library<93>,Documentation<32>,Core and Builtins<90>,Python 3 11 0 beta 1
@anchor{whatsnew/changelog id432}@anchor{1bcc}
@subsubsection Library



@itemize -

@item 
gh-87901@footnote{https://github.com/python/cpython/issues/87901}: Add the `encoding' parameter to @ref{31c,,os.popen()}.

@item 
gh-90997@footnote{https://github.com/python/cpython/issues/90997}: Fix an issue where @ref{3c,,dis} utilities may interpret populated
inline cache entries as valid instructions.

@item 
gh-92332@footnote{https://github.com/python/cpython/issues/92332}: Deprecate @ref{35e,,typing.Text} (removal of the class is
currently not planned). Patch by Alex Waygood.

@item 
gh-78157@footnote{https://github.com/python/cpython/issues/78157}: Deprecate nested classes in enum definitions becoming members –
in 3.13 they will be normal classes; add @code{member} and @code{nonmember}
functions to allow control over results now.

@item 
gh-92356@footnote{https://github.com/python/cpython/issues/92356}: Fixed a performance regression in ctypes function calls.

@item 
gh-90997@footnote{https://github.com/python/cpython/issues/90997}: Show the actual named values stored in inline caches when
@code{show_caches=True} is passed to @ref{3c,,dis} utilities.

@item 
gh-92301@footnote{https://github.com/python/cpython/issues/92301}: Prefer @code{close_range()} to iterating over procfs for file
descriptor closing in @ref{dc,,subprocess} for better performance.

@item 
gh-67248@footnote{https://github.com/python/cpython/issues/67248}: Sort the miscellaneous topics in Cmd.do_help()

@item 
gh-92210@footnote{https://github.com/python/cpython/issues/92210}: Port @code{socket.__init__} to Argument Clinic. Patch by Cinder.

@item 
gh-80010@footnote{https://github.com/python/cpython/issues/80010}: Add support for generalized ISO 8601 parsing to
@ref{82b,,datetime.datetime.fromisoformat()},
@ref{829,,datetime.date.fromisoformat()} and
@ref{82a,,datetime.time.fromisoformat()}. Patch by Paul Ganssle.

@item 
gh-92118@footnote{https://github.com/python/cpython/issues/92118}: Fix a 3.11 regression in @ref{140e,,contextmanager()},
which caused it to propagate exceptions with incorrect tracebacks.

@item 
gh-90887@footnote{https://github.com/python/cpython/issues/90887}: Adding @code{COPYFILE_STAT}, @code{COPYFILE_ACL} and
@code{COPYFILE_XATTR} constants for @code{os.fcopyfile()} available in macOs.

@item 
gh-91215@footnote{https://github.com/python/cpython/issues/91215}: For @ref{4e2,,@@~dataclasses.dataclass}, add `weakref_slot'. The new
parameter defaults to @code{False}. If true, and if @code{slots=True}, add a
slot named @code{"__weakref__"}, which will allow instances to be weakref’d.
Contributed by Eric V. Smith

@item 
gh-85984@footnote{https://github.com/python/cpython/issues/85984}: New function os.login_tty() for Unix.

@item 
gh-92128@footnote{https://github.com/python/cpython/issues/92128}: Add @ref{948,,__class_getitem__()} to
@ref{1501,,logging.LoggerAdapter} and @ref{1404,,logging.StreamHandler},
allowing them to be parameterized at runtime. Patch by Alex Waygood.

@item 
gh-92049@footnote{https://github.com/python/cpython/issues/92049}: Forbid pickling constants @code{re._constants.SUCCESS} etc.
Previously, pickling did not fail, but the result could not be unpickled.

@item 
gh-92062@footnote{https://github.com/python/cpython/issues/92062}: @ref{4e5,,inspect.Parameter} now raises @ref{2ee,,ValueError} if
@code{name} is a keyword, in addition to the existing check that it is an
identifier.

@item 
gh-87390@footnote{https://github.com/python/cpython/issues/87390}: Add an @code{__unpacked__} attribute to
@ref{9f2,,types.GenericAlias}. Patch by Jelle Zijlstra.

@item 
gh-88089@footnote{https://github.com/python/cpython/issues/88089}: Add support for generic @ref{32f,,typing.NamedTuple}.

@item 
gh-91996@footnote{https://github.com/python/cpython/issues/91996}: New http.HTTPMethod enum to represent all the available HTTP
request methods in a convenient way

@item 
gh-91984@footnote{https://github.com/python/cpython/issues/91984}: Modified test strings in test_argparse.py to not contain
trailing spaces before end of line.

@item 
gh-91952@footnote{https://github.com/python/cpython/issues/91952}: Add @code{encoding="locale"} support to
@code{TextIOWrapper.reconfigure()}.

@item 
gh-91954@footnote{https://github.com/python/cpython/issues/91954}: Add `encoding' and `errors' arguments to
@ref{11c9,,subprocess.getoutput()} and @ref{11ca,,subprocess.getstatusoutput()}.

@item 
bpo-47029@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47029}: Always close the read end of the pipe used by
@ref{1bcd,,multiprocessing.Queue} `after' the last write of buffered data to
the write end of the pipe to avoid @ref{1262,,BrokenPipeError} at garbage
collection and at @ref{1bce,,multiprocessing.Queue.close()} calls. Patch by Géry
Ogam.

@item 
gh-91928@footnote{https://github.com/python/cpython/issues/91928}: Add @code{datetime.UTC} alias for @code{datetime.timezone.utc}.

Patch by Kabir Kwatra.

@item 
gh-68966@footnote{https://github.com/python/cpython/issues/68966}: The @code{mailcap} module is now deprecated and will be removed
in Python 3.13. See 
@geindex Python Enhancement Proposals; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/} for the rationale and the @ref{93,,mimetypes}
module for an alternative. Patch by Victor Stinner.

@item 
gh-91401@footnote{https://github.com/python/cpython/issues/91401}: Provide a way to disable @ref{dc,,subprocess} use of @code{vfork()}
just in case it is ever needed and document the existing mechanism for
@code{posix_spawn()}.

@item 
gh-64783@footnote{https://github.com/python/cpython/issues/64783}: Fix @ref{1bcf,,signal.NSIG} value on FreeBSD to accept signal
numbers greater than 32, like @code{signal.SIGRTMIN} and
@code{signal.SIGRTMAX}. Patch by Victor Stinner.

@item 
gh-91910@footnote{https://github.com/python/cpython/issues/91910}: Add missing f prefix to f-strings in error messages from the
@ref{98,,multiprocessing} and @ref{b,,asyncio} modules.

@item 
gh-91860@footnote{https://github.com/python/cpython/issues/91860}: Add @ref{6fc,,typing.dataclass_transform()}, implementing 
@geindex Python Enhancement Proposals; PEP 681
PEP 681@footnote{https://peps.python.org/pep-0681/}.
Patch by Jelle Zijlstra.

@item 
gh-91832@footnote{https://github.com/python/cpython/issues/91832}: Add @code{required} attribute to @ref{1bd0,,argparse.Action} repr
output.

@item 
gh-91827@footnote{https://github.com/python/cpython/issues/91827}: In the @ref{f6,,tkinter} module add method @code{info_patchlevel()}
which returns the exact version of the Tcl library as a named tuple
similar to @ref{8b1,,sys.version_info}.

@item 
gh-84461@footnote{https://github.com/python/cpython/issues/84461}: Add @ref{1bd1,,--enable-wasm-pthreads} to enable pthreads support
for WASM builds. @code{Emscripten/node} no longer has threading enabled by
default. Include additional file systems.

@item 
gh-91821@footnote{https://github.com/python/cpython/issues/91821}: Fix unstable @code{test_from_tuple} test in @code{test_decimal.py}.

@item 
gh-91217@footnote{https://github.com/python/cpython/issues/91217}: Deprecate the xdrlib module.

@item 
gh-91217@footnote{https://github.com/python/cpython/issues/91217}: Deprecate the uu module.

@item 
gh-91760@footnote{https://github.com/python/cpython/issues/91760}: More strict rules will be applied for numerical group references
and group names in regular expressions. For now, a deprecation warning is
emitted for group references and group names which will be errors in
future Python versions.

@item 
gh-84461@footnote{https://github.com/python/cpython/issues/84461}: Add provisional @ref{1bd2,,sys._emscripten_info} named tuple with
build-time and run-time information about Emscripten platform.

@item 
gh-90623@footnote{https://github.com/python/cpython/issues/90623}: @ref{1bd3,,signal.raise_signal()} and @ref{1573,,os.kill()} now check
immediately for pending signals. Patch by Victor Stinner.

@item 
gh-91734@footnote{https://github.com/python/cpython/issues/91734}: Fix OSS audio support on Solaris.

@item 
gh-90633@footnote{https://github.com/python/cpython/issues/90633}: Include the passed value in the exception thrown by
@ref{8b8,,typing.assert_never()}. Patch by Jelle Zijlstra.

@item 
gh-91700@footnote{https://github.com/python/cpython/issues/91700}: Compilation of regular expression containing a conditional
expression @code{(?(group)...)} now raises an appropriate @code{re.error} if
the group number refers to not defined group. Previously an internal
RuntimeError was raised.

@item 
gh-91231@footnote{https://github.com/python/cpython/issues/91231}: Add an optional keyword `shutdown_timeout' parameter to the
@code{multiprocessing.BaseManager} constructor. Kill the process if
terminate() takes longer than the timeout. Patch by Victor Stinner.

@item 
gh-91621@footnote{https://github.com/python/cpython/issues/91621}: Fix @ref{8c2,,typing.get_type_hints()} for
@ref{9f1,,collections.abc.Callable}. Patch by Shantanu Jain.

@item 
gh-90568@footnote{https://github.com/python/cpython/issues/90568}: Parsing @code{\N} escapes of Unicode Named Character Sequences in a
@ref{be,,regular expression} raises now @code{re.error} instead of
@code{TypeError}.

@item 
gh-91670@footnote{https://github.com/python/cpython/issues/91670}: Remove deprecated @code{SO} config variable in @ref{e1,,sysconfig}.

@item 
gh-91217@footnote{https://github.com/python/cpython/issues/91217}: Deprecate the telnetlib module.

@item 
gh-91217@footnote{https://github.com/python/cpython/issues/91217}: Deprecate the sunau module.

@item 
gh-91217@footnote{https://github.com/python/cpython/issues/91217}: Deprecate the spwd module.

@item 
gh-91217@footnote{https://github.com/python/cpython/issues/91217}: Deprecate the sndhdr module, as well as inline needed
functionality for @code{email.mime.MIMEAudio}.

@item 
gh-91616@footnote{https://github.com/python/cpython/issues/91616}: @ref{be,,re} module, fix @ref{118c,,fullmatch()} mismatch
when using Atomic Grouping or Possessive Quantifiers.

@item 
gh-91217@footnote{https://github.com/python/cpython/issues/91217}: Deprecate the ‘pipes’ module.

@item 
gh-91217@footnote{https://github.com/python/cpython/issues/91217}: Deprecate the ossaudiodev module.

@item 
bpo-47256@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47256}: @ref{be,,re} module, limit the maximum capturing group to
1,073,741,823 in 64-bit build, this increases the depth of backtracking.

@item 
gh-91217@footnote{https://github.com/python/cpython/issues/91217}: Deprecate the nis module.

@item 
gh-91595@footnote{https://github.com/python/cpython/issues/91595}: Fix the comparison of character and integer inside
@code{Tools.gdb.libpython.write_repr()}. Patch by Yu Liu.

@item 
gh-74166@footnote{https://github.com/python/cpython/issues/74166}: Add option to raise all errors from
@ref{884,,create_connection()} in an @ref{4d3,,ExceptionGroup} when it
fails to create a connection. The default remains to raise only the last
error that had occurred when multiple addresses were tried.

@item 
gh-91487@footnote{https://github.com/python/cpython/issues/91487}: Optimize asyncio UDP speed, over 100 times faster when
transferring a large file.

@item 
gh-91575@footnote{https://github.com/python/cpython/issues/91575}: Update case-insensitive matching in the @ref{be,,re} module to the
latest Unicode version.

@item 
gh-90622@footnote{https://github.com/python/cpython/issues/90622}: In @code{concurrent.futures.process.ProcessPoolExecutor} disallow
the “fork” multiprocessing start method when the new
@code{max_tasks_per_child} feature is used as the mix of threads+fork can
hang the child processes. Default to using the safe “spawn” start method
in that circumstance if no @code{mp_context} was supplied.

@item 
gh-89022@footnote{https://github.com/python/cpython/issues/89022}: In @ref{d4,,sqlite3}, @code{SQLITE_MISUSE} result codes are now mapped
to @ref{88f,,InterfaceError} instead of
@ref{307,,ProgrammingError}. Also, more accurate exceptions are
raised when binding parameters fail. Patch by Erlend E. Aasland.

@item 
gh-91526@footnote{https://github.com/python/cpython/issues/91526}: Stop calling @code{os.device_encoding(file.fileno())} in
@code{TextIOWrapper}. It was complex, never documented, and didn’t work
for most cases. (Patch by Inada Naoki.)

@item 
gh-88116@footnote{https://github.com/python/cpython/issues/88116}: Change the frame-related functions in the @ref{82,,inspect} module
to return a regular object (that is backwards compatible with the old
tuple-like interface) that include the extended 
@geindex Python Enhancement Proposals; PEP 657
PEP 657@footnote{https://peps.python.org/pep-0657/} position
information (end line number, column and end column). The affected
functions are: @ref{860,,inspect.getframeinfo()},
@ref{861,,inspect.getouterframes()}, @ref{862,,inspect.getinnerframes()},
@ref{863,,inspect.stack()} and @ref{864,,inspect.trace()}. Patch by Pablo Galindo.

@item 
gh-69093@footnote{https://github.com/python/cpython/issues/69093}: Add indexing and slicing support to @ref{894,,sqlite3.Blob}. Patch
by Aviv Palivoda and Erlend E. Aasland.

@item 
gh-69093@footnote{https://github.com/python/cpython/issues/69093}: Add @ref{1e3,,context manager} support to @ref{894,,sqlite3.Blob}.
Patch by Aviv Palivoda and Erlend E. Aasland.

@item 
gh-91217@footnote{https://github.com/python/cpython/issues/91217}: Deprecate nntplib.

@item 
gh-91217@footnote{https://github.com/python/cpython/issues/91217}: Deprecate msilib.

@item 
gh-91404@footnote{https://github.com/python/cpython/issues/91404}: Improve the performance of @ref{be,,re} matching by using computed
gotos (or “threaded code”) on supported platforms and removing expensive
pointer indirections.

@item 
gh-91217@footnote{https://github.com/python/cpython/issues/91217}: Deprecate the imghdr module.

@item 
gh-91217@footnote{https://github.com/python/cpython/issues/91217}: Deprecate the crypt module.

@item 
gh-91276@footnote{https://github.com/python/cpython/issues/91276}: Make space for longer opcodes in @ref{3c,,dis} output.

@item 
bpo-47000@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47000}: Make @code{TextIOWrapper} uses locale encoding when
@code{encoding="locale"} is specified even in UTF-8 mode.

@item 
gh-91230@footnote{https://github.com/python/cpython/issues/91230}: @ref{17a,,warnings.catch_warnings()} now accepts arguments for
@ref{8d2,,warnings.simplefilter()}, providing a more concise way to locally
ignore warnings or convert them to errors.

@item 
gh-91217@footnote{https://github.com/python/cpython/issues/91217}: Deprecate the chunk module.

@item 
gh-91498@footnote{https://github.com/python/cpython/issues/91498}: Add the @code{TCP_CONNECTION_INFO} option (available on macOS) to
@ref{d1,,socket}.

@item 
bpo-47260@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47260}: Fix @code{os.closerange()} potentially being a no-op in a Linux
seccomp sandbox.

@item 
bpo-47087@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47087}: Implement @code{typing.Required} and @code{typing.NotRequired}
(
@geindex Python Enhancement Proposals; PEP 655
PEP 655@footnote{https://peps.python.org/pep-0655/}). Patch by David Foster and Jelle Zijlstra.

@item 
bpo-47061@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47061}: Deprecate cgi and cgitb.

@item 
bpo-47061@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47061}: Deprecate audioop.

@item 
bpo-47000@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47000}: Add @ref{867,,locale.getencoding()} to get the current locale
encoding. It is similar to @code{locale.getpreferredencoding(False)} but
ignores the @ref{868,,Python UTF-8 Mode}.

@item 
bpo-42012@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42012}: Add @ref{123,,wsgiref.types}, containing WSGI-specific types for
static type checking.

@item 
bpo-47227@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47227}: Suppress expression chaining for more @ref{be,,re} parsing errors.

@item 
bpo-47211@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47211}: Remove undocumented and never working function
@code{re.template()} and flag @code{re.TEMPLATE}. This was later reverted in
3.11.0b2 and deprecated instead.

@item 
bpo-47135@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47135}: @ref{1592,,decimal.localcontext()} now accepts context attributes via
keyword arguments

@item 
bpo-43323@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43323}: Fix errors in the @ref{3f,,email} module if the charset itself
contains undecodable/unencodable characters.

@item 
bpo-46841@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46841}: Disassembly of quickened code.

@item 
bpo-46681@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46681}: Forward gzip.compress() compresslevel to zlib.

@item 
bpo-45100@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45100}: Add @ref{8bf,,typing.get_overloads()} and
@ref{8c0,,typing.clear_overloads()}. Patch by Jelle Zijlstra.

@item 
bpo-44807@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44807}: @ref{56b,,typing.Protocol} no longer silently replaces
@code{__init__()} methods defined on subclasses. Patch by Adrian Garcia
Badaracco.

@item 
bpo-46787@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46787}: Fix @ref{1d8,,concurrent.futures.ProcessPoolExecutor} exception
memory leak

@item 
bpo-46720@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46720}: Add support for path-like objects to
@ref{1bd4,,multiprocessing.set_executable()} for Windows to be on a par with
Unix-like systems. Patch by Géry Ogam.

@item 
bpo-46696@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46696}: Add @code{SO_INCOMING_CPU} constant to @ref{d1,,socket}.

@item 
bpo-46053@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46053}: Fix OSS audio support on NetBSD.

@item 
bpo-45639@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45639}: @code{image/avif} and @code{image/webp} were added to
@ref{93,,mimetypes}.

@item 
bpo-46285@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46285}: Add command-line option @code{-p}/@code{--protocol} to module
@ref{76,,http.server} which specifies the HTTP version to which the server is
conformant (HTTP/1.1 conformant servers can now be run from the
command-line interface of module @code{http.server}). Patch by Géry Ogam.

@item 
bpo-44791@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44791}: Accept ellipsis as the last argument of
@ref{9cd,,typing.Concatenate}.

@item 
bpo-46547@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46547}: Remove variables leaking into @code{pydoc.Helper} class namespace.

@item 
bpo-46415@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46415}: Fix ipaddress.ip_@{address,interface,network@} raising TypeError
instead of ValueError if given invalid tuple as address parameter.

@item 
bpo-46075@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46075}: @code{CookieJar} with @code{DefaultCookiePolicy} now can process
cookies from localhost with domain=localhost explicitly specified in
Set-Cookie header.

@item 
bpo-45995@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45995}: Add a “z” option to the string formatting specification that
coerces negative zero floating-point values to positive zero after
rounding to the format precision.  Contributed by John Belmonte.

@item 
bpo-26175@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26175}: Fully implement the @ref{8a5,,io.BufferedIOBase} or
@ref{8a6,,io.TextIOBase} interface for
@ref{8a4,,tempfile.SpooledTemporaryFile} objects. This lets them work
correctly with higher-level layers (like compression modules). Patch by
Carey Metcalfe.

@item 
bpo-45138@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45138}: Fix a regression in the @ref{d4,,sqlite3} trace callback where
bound parameters were not expanded in the passed statement string. The
regression was introduced in Python 3.10 by bpo-40318@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40318}. Patch by
Erlend E. Aasland.

@item 
bpo-44863@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44863}: Allow @ref{330,,TypedDict} subclasses to also include
@ref{1806,,Generic} as a base class in class based syntax. Thereby
allowing the user to define a generic @code{TypedDict}, just like a
user-defined generic but with @code{TypedDict} semantics.

@item 
bpo-44587@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44587}: Fix BooleanOptionalAction to not automatically add a default
string.  If a default string is desired, use a formatter to add it.

@item 
bpo-43827@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43827}: All positional-or-keyword parameters to @code{ABCMeta.__new__} are
now positional-only to avoid conflicts with keyword arguments to be passed
to @code{__init_subclass__()}.

@item 
bpo-43218@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43218}: Prevent creation of a venv whose path contains the PATH
separator. This could affect the usage of the activate script. Patch by
Dustin Rodrigues.

@item 
bpo-38435@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38435}: Add a @code{process_group} parameter to @ref{4b8,,subprocess.Popen}
to help move more things off of the unsafe @code{preexec_fn} parameter.

@item 
bpo-42066@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42066}: Fix cookies getting sorted in @code{CookieJar.__iter__()} which
is an extra behavior and not mentioned in RFC 2965 or Netscape cookie
protocol. Now the cookies in @code{CookieJar} follows the order of the
@code{Set-Cookie} header. Patch by Iman Kermani.

@item 
bpo-40617@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40617}: Add @ref{892,,create_window_function()} to
@ref{54e,,sqlite3.Connection} for creating aggregate window functions. Patch
by Erlend E. Aasland.

@item 
bpo-40676@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40676}: Convert @ref{2d,,csv} to use Argument Clinic for
@ref{1bd5,,csv.field_size_limit()}, @ref{1bd6,,csv.get_dialect()},
@ref{1bd7,,csv.unregister_dialect()} and @ref{1bd8,,csv.list_dialects()}.

@item 
bpo-39716@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39716}: Raise an @code{ArgumentError} when the same subparser name is
added twice to an @code{argparse.ArgumentParser}.  This is consistent with
the (default) behavior when the same option string is added twice to an
@code{ArgumentParser}.

@item 
bpo-36073@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36073}: Raise @ref{307,,ProgrammingError} instead of segfaulting
on recursive usage of cursors in @ref{d4,,sqlite3} converters. Patch by
Sergey Fedoseev.

@item 
bpo-34975@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34975}: Adds a @code{start_tls()} method to
@code{StreamWriter}, which upgrades the connection with
TLS using the given @ref{355,,SSLContext}.

@item 
bpo-22276@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22276}: @ref{268,,Path} methods @ref{538,,glob()} and
@ref{539,,rglob()} return only directories if `pattern' ends with
a pathname components separator (@code{/} or @ref{87c,,sep}). Patch by
Eisuke Kawashima.

@item 
bpo-24905@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24905}: Add @ref{893,,blobopen()} to
@ref{54e,,sqlite3.Connection}. @ref{894,,sqlite3.Blob} allows incremental I/O
operations on blobs. Patch by Aviv Palivoda and Erlend E. Aasland.
@end itemize

@node Documentation<32>,Tests<32>,Library<93>,Python 3 11 0 beta 1
@anchor{whatsnew/changelog id433}@anchor{1bd9}
@subsubsection Documentation



@itemize -

@item 
gh-91888@footnote{https://github.com/python/cpython/issues/91888}: Add a new @code{gh} role to the documentation to link to GitHub
issues.

@item 
gh-91783@footnote{https://github.com/python/cpython/issues/91783}: Document security issues concerning the use of the function
@ref{697,,shutil.unpack_archive()}

@item 
gh-91547@footnote{https://github.com/python/cpython/issues/91547}: Remove “Undocumented modules” page.

@item 
gh-91298@footnote{https://github.com/python/cpython/issues/91298}: In @code{importlib.resources.abc}, refined the documentation of the
Traversable Protocol, applying changes from importlib_resources 5.7.1.

@item 
bpo-44347@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44347}: Clarify the meaning of `dirs_exist_ok', a kwarg of
@ref{c24,,shutil.copytree()}.

@item 
bpo-36329@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36329}: Remove ‘make -C Doc serve’ in favour of ‘make -C Doc htmlview’

@item 
bpo-47189@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47189}: Add a What’s New in Python 3.11 entry for the Faster CPython
project. Documentation by Ken Jin and Kumar Aditya.

@item 
bpo-38668@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38668}: Update the introduction to documentation for @ref{a6,,os.path} to
remove warnings that became irrelevant after the implementations of
@geindex Python Enhancement Proposals; PEP 383
PEP 383@footnote{https://peps.python.org/pep-0383/} and 
@geindex Python Enhancement Proposals; PEP 529
PEP 529@footnote{https://peps.python.org/pep-0529/}.

@item 
bpo-47115@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47115}: The documentation now lists which members of C structs are part
of the @ref{776,,Limited API/Stable ABI}.

@item 
bpo-46962@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46962}: All docstrings in code snippets are now wrapped into
@ref{1bda,,PyDoc_STR} to follow the guideline of 
@geindex Python Enhancement Proposals; PEP 0007#documentation-strings
PEP 7’s Documentation Strings paragraph@footnote{https://peps.python.org/pep-0007/#documentation-strings}. Patch by
Oleg Iarygin.

@item 
bpo-26792@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26792}: Improve the docstrings of @ref{1794,,runpy.run_module()} and
@ref{4a5,,runpy.run_path()}. Original patch by Andrew Brezovsky.
@end itemize

@node Tests<32>,Build<38>,Documentation<32>,Python 3 11 0 beta 1
@anchor{whatsnew/changelog id434}@anchor{1bdb}
@subsubsection Tests



@itemize -

@item 
gh-92169@footnote{https://github.com/python/cpython/issues/92169}: Use @code{warnings_helper.import_deprecated()} to import deprecated
modules uniformly in tests. Patch by Hugo van Kemenade.

@item 
gh-84461@footnote{https://github.com/python/cpython/issues/84461}: When multiprocessing is enabled, libregrtest can now use a
Python executable other than @code{sys.executable} via the @code{--python}
flag.

@item 
gh-91904@footnote{https://github.com/python/cpython/issues/91904}: Fix initialization of 
@geindex PYTHONREGRTEST_UNICODE_GUARD
@geindex environment variable; PYTHONREGRTEST_UNICODE_GUARD
@code{PYTHONREGRTEST_UNICODE_GUARD}
which prevented running regression tests on non-UTF-8 locale.

@item 
gh-91752@footnote{https://github.com/python/cpython/issues/91752}: Added @@requires_zlib to test.test_tools.test_freeze.TestFreeze.

@item 
gh-91607@footnote{https://github.com/python/cpython/issues/91607}: Fix @code{test_concurrent_futures} to test the correct
multiprocessing start method context in several cases where the test logic
mixed this up.

@item 
bpo-40280@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40280}: Threading tests are now skipped on WASM targets without pthread
support.

@item 
bpo-47109@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47109}: Test for @code{ctypes.macholib.dyld},
@code{ctypes.macholib.dylib}, and @code{ctypes.macholib.framework} are
brought from manual pre-@ref{10d,,unittest} times to @code{ctypes.test}
location and structure. Patch by Oleg Iarygin.

@item 
bpo-29890@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29890}: Add tests for @ref{1bdc,,ipaddress.IPv4Interface} and
@ref{1bdd,,ipaddress.IPv6Interface} construction with tuple arguments.
Original patch and tests by louisom.
@end itemize

@node Build<38>,Windows<32>,Tests<32>,Python 3 11 0 beta 1
@anchor{whatsnew/changelog id435}@anchor{1bde}
@subsubsection Build



@itemize -

@item 
gh-89452@footnote{https://github.com/python/cpython/issues/89452}: gdbm-compat is now preferred over ndbm if both are available on
the system. This allows avoiding the problematic ndbm.h on macOS.

@item 
gh-91731@footnote{https://github.com/python/cpython/issues/91731}: Python is now built with @code{-std=c11} compiler option, rather
than @code{-std=c99}. Patch by Victor Stinner.

@item 
bpo-47152@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47152}: Add script and make target for generating @code{sre_constants.h}.

@item 
bpo-47103@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47103}: Windows @code{PGInstrument} builds now copy a required DLL into
the output directory, making it easier to run the profile stage of a PGO
build.
@end itemize

@node Windows<32>,macOS<24>,Build<38>,Python 3 11 0 beta 1
@anchor{whatsnew/changelog id436}@anchor{1bdf}
@subsubsection Windows



@itemize -

@item 
bpo-46907@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46907}: Update Windows installer to use SQLite 3.38.3.

@item 
bpo-47239@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47239}: Fixed –list and –list-paths output for @ref{7db,,Python install manager} when
used in an active virtual environment.

@item 
bpo-46907@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46907}: Update Windows installer to use SQLite 3.38.2.

@item 
bpo-46785@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46785}: Fix race condition between @ref{26f,,os.stat()} and unlinking a file
on Windows, by using errors codes returned by @code{FindFirstFileW()} when
appropriate in @code{win32_xstat_impl}.

@item 
bpo-40859@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40859}: Update Windows build to use xz-5.2.5
@end itemize

@node macOS<24>,Tools/Demos<25>,Windows<32>,Python 3 11 0 beta 1
@anchor{whatsnew/changelog id437}@anchor{1be0}
@subsubsection macOS



@itemize -

@item 
bpo-46907@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46907}: Update macOS installer to SQLite 3.38.4.
@end itemize

@node Tools/Demos<25>,C API<33>,macOS<24>,Python 3 11 0 beta 1
@anchor{whatsnew/changelog id438}@anchor{1be1}
@subsubsection Tools/Demos



@itemize -

@item 
gh-91583@footnote{https://github.com/python/cpython/issues/91583}: Fix regression in the code generated by Argument Clinic for
functions with the @code{defining_class} parameter.

@item 
gh-91575@footnote{https://github.com/python/cpython/issues/91575}: Add script @code{Tools/scripts/generate_re_casefix.py} and the make
target @code{regen-re} for generating additional data for case-insensitive
matching according to the current Unicode version.

@item 
gh-91551@footnote{https://github.com/python/cpython/issues/91551}: Remove the ancient Pynche color editor.  It has moved to
@indicateurl{https://gitlab.com/warsaw/pynche}
@end itemize

@node C API<33>,,Tools/Demos<25>,Python 3 11 0 beta 1
@anchor{whatsnew/changelog id439}@anchor{1be2}
@subsubsection C API



@itemize -

@item 
gh-88279@footnote{https://github.com/python/cpython/issues/88279}: Deprecate the C functions: @code{PySys_SetArgv()},
@code{PySys_SetArgvEx()}, @code{PySys_SetPath()}. Patch by Victor
Stinner.

@item 
gh-92154@footnote{https://github.com/python/cpython/issues/92154}: Added the @ref{981,,PyCode_GetCode()} function. This function does
the equivalent of the Python code @code{getattr(code_object, 'co_code')}.

@item 
gh-92173@footnote{https://github.com/python/cpython/issues/92173}: Fix the @code{closure} argument to @ref{1b1e,,PyEval_EvalCodeEx()}.

@item 
gh-91320@footnote{https://github.com/python/cpython/issues/91320}: Fix C++ compiler warnings about “old-style cast” (@code{g++
-Wold-style-cast}) in the Python C API. Use C++ @code{reinterpret_cast<>}
and @code{static_cast<>} casts when the Python C API is used in C++. Patch by
Victor Stinner.

@item 
gh-80527@footnote{https://github.com/python/cpython/issues/80527}: Mark functions as deprecated by 
@geindex Python Enhancement Proposals; PEP 623
PEP 623@footnote{https://peps.python.org/pep-0623/}:
@code{PyUnicode_AS_DATA()}, @code{PyUnicode_AS_UNICODE()},
@code{PyUnicode_GET_DATA_SIZE()}, @code{PyUnicode_GET_SIZE()}. Patch
by Victor Stinner.

@item 
gh-91768@footnote{https://github.com/python/cpython/issues/91768}: @ref{2d1,,Py_REFCNT()}, @ref{3c7,,Py_TYPE()}, @ref{98a,,Py_SIZE()} and
@ref{1be3,,Py_IS_TYPE()} functions argument type is now @code{PyObject*}, rather
than @code{const PyObject*}. Patch by Victor Stinner.

@item 
gh-91020@footnote{https://github.com/python/cpython/issues/91020}: Add @code{PyBytes_Type.tp_alloc} to initialize
@code{PyBytesObject.ob_shash} for bytes subclasses.

@item 
bpo-40421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40421}: Add @code{PyFrame_GetLasti} C-API function to access frame
object’s @code{f_lasti} attribute safely from C code.

@item 
bpo-35134@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35134}: Remove the @code{Include/code.h} header file. C extensions should
only include the main @code{<Python.h>} header file. Patch by Victor Stinner.

@item 
bpo-47169@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47169}: @ref{1be4,,PyOS_CheckStack()} is now exported in the Stable ABI on
Windows.

@item 
bpo-47169@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47169}: @ref{1be5,,PyThread_get_thread_native_id()} is excluded from the
stable ABI on platforms where it doesn’t exist (like Solaris).

@item 
bpo-46343@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46343}: Added @ref{978,,PyErr_GetHandledException()} and
@ref{979,,PyErr_SetHandledException()} as simpler alternatives to
@ref{97b,,PyErr_GetExcInfo()} and @ref{97a,,PyErr_SetExcInfo()}.

They are included in the stable ABI.
@end itemize

@node Python 3 11 0 alpha 7,Python 3 11 0 alpha 6,Python 3 11 0 beta 1,Changelog
@anchor{whatsnew/changelog python-3-11-0-alpha-7}@anchor{1be6}
@subsection Python 3.11.0 alpha 7


`Release date: 2022-04-05'

@menu
* Core and Builtins: Core and Builtins<91>. 
* Library: Library<94>. 
* Core and Builtins: Core and Builtins<92>. 
* Library: Library<95>. 
* Core and Builtins: Core and Builtins<93>. 
* Library: Library<96>. 
* Documentation: Documentation<33>. 
* Tests: Tests<33>. 
* Build: Build<39>. 
* Windows: Windows<33>. 
* macOS: macOS<25>. 
* Tools/Demos: Tools/Demos<26>. 
* C API: C API<34>. 

@end menu

@node Core and Builtins<91>,Library<94>,,Python 3 11 0 alpha 7
@anchor{whatsnew/changelog id440}@anchor{1be7}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-47212@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47212}: Raise @ref{9b1,,IndentationError} instead of @ref{18f,,SyntaxError} for
a bare @code{except} with no following indent. Improve @code{SyntaxError}
locations for an un-parenthesized generator used as arguments. Patch by
Matthieu Dartiailh.

@item 
bpo-47186@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47186}: Replace @code{JUMP_IF_NOT_EG_MATCH} by
@ref{913,,CHECK_EG_MATCH} + jump.

@item 
bpo-47176@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47176}: Emscripten builds cannot handle signals in the usual way due to
platform limitations. Python can now handle signals. To use, set
Module.Py_EmscriptenSignalBuffer to be a single byte SharedArrayBuffer and
set Py_EMSCRIPTEN_SIGNAL_HANDLING to 1. Writing a number into the
SharedArrayBuffer will cause the corresponding signal to be raised into
the Python thread.

@item 
bpo-47186@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47186}: Replace @code{JUMP_IF_NOT_EXC_MATCH} by
@ref{91b,,CHECK_EXC_MATCH} + jump.

@item 
bpo-47120@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47120}: Replace the absolute jump opcode @ref{1be8,,JUMP_NO_INTERRUPT} by
the relative @ref{910,,JUMP_BACKWARD_NO_INTERRUPT}.

@item 
bpo-46841@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46841}: Avoid unnecessary allocations when comparing code objects.

@item 
bpo-47182@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47182}: Fix a crash when using a named unicode character like
@code{"\N@{digit nine@}"} after the main interpreter has been initialized a
second time.

@item 
bpo-47162@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47162}: WebAssembly cannot deal with bad function pointer casts
(different count or types of arguments). Python can now use call
trampolines to mitigate the problem. Define @code{PY_CALL_TRAMPOLINE}
to enable call trampolines.

@item 
bpo-46775@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46775}: Some Windows system error codes(>= 10000) are now mapped into
the correct errno and may now raise a subclass of @ref{2c2,,OSError}. Patch by
Donghee Na.

@item 
bpo-47129@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47129}: Improve error messages in f-string syntax errors concerning
empty expressions.

@item 
bpo-47117@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47117}: Fix a crash if we fail to decode characters in interactive mode
if the tokenizer buffers are uninitialized. Patch by Pablo Galindo.

@item 
bpo-47127@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47127}: Speed up calls to c functions with keyword arguments by 25%
with specialization. Patch by Kumar Aditya.

@item 
bpo-47120@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47120}: Replaced @code{JUMP_ABSOLUTE} by the relative jump
@ref{91c,,JUMP_BACKWARD}.

@item 
bpo-42197@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42197}: @code{PyFrame_FastToLocalsWithError()} and
@code{PyFrame_LocalsToFast()} are no longer called during profiling nor
tracing. C code can access the @code{f_locals} attribute of
@ref{991,,PyFrameObject} by calling @ref{661,,PyFrame_GetLocals()}.

@item 
bpo-47070@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47070}: Improve performance of @code{array_inplace_repeat} by reducing the
number of invocations of @code{memcpy}. Refactor the @code{repeat} and inplace
@code{repeat} methods of @code{array}, @code{bytes}, @code{bytearray} and
@code{unicodeobject} to use the common @code{_PyBytes_Repeat}.

@item 
bpo-47053@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47053}: Reduce de-optimization in the specialized
@code{BINARY_OP_INPLACE_ADD_UNICODE} opcode.

@item 
bpo-47045@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47045}: Remove the @code{f_state} field from the _PyInterpreterFrame
struct. Add the @code{owner} field to the _PyInterpreterFrame struct to make
ownership explicit to simplify clearing and deallocing frames and
generators.
@end itemize

@node Library<94>,Core and Builtins<92>,Core and Builtins<91>,Python 3 11 0 alpha 7
@anchor{whatsnew/changelog id441}@anchor{1be9}
@subsubsection Library



@itemize -

@item 
bpo-46968@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46968}: Check for the existence of the “sys/auxv.h” header in
@ref{5c,,faulthandler} to avoid compilation problems in systems where this
header doesn’t exist. Patch by Pablo Galindo
@end itemize

@node Core and Builtins<92>,Library<95>,Library<94>,Python 3 11 0 alpha 7
@anchor{whatsnew/changelog id442}@anchor{1bea}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-46329@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46329}: Use low bit of @code{LOAD_GLOBAL} to indicate whether to push a
@code{NULL} before the global. Helps streamline the call sequence a bit.

@item 
bpo-46841@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46841}: Quicken bytecode in-place by storing it as part of the
corresponding @code{PyCodeObject}.

@item 
bpo-47012@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47012}: Speed up iteration of @ref{193,,bytes} and @ref{342,,bytearray} by
30%. Patch by Kumar Aditya.

@item 
bpo-47009@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47009}: Improved the performance of @ref{8de,,list.append()} and list
comprehensions by optimizing for the common case, where no resize is
needed. Patch by Dennis Sweeney.

@item 
bpo-47005@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47005}: Improve performance of @code{bytearray_repeat} and
@code{bytearray_irepeat} by reducing the number of invocations of @code{memcpy}.
@end itemize

@node Library<95>,Core and Builtins<93>,Core and Builtins<92>,Python 3 11 0 alpha 7
@anchor{whatsnew/changelog id443}@anchor{1beb}
@subsubsection Library



@itemize -

@item 
bpo-46829@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46829}: Deprecate passing a message into @ref{1bec,,asyncio.Future.cancel()}
and @ref{4d4,,asyncio.Task.cancel()}
@end itemize

@node Core and Builtins<93>,Library<96>,Library<95>,Python 3 11 0 alpha 7
@anchor{whatsnew/changelog id444}@anchor{1bed}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-46993@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46993}: Speed up @ref{342,,bytearray} creation from @ref{24f,,list} and
@ref{614,,tuple} by 40%. Patch by Kumar Aditya.

@item 
bpo-39829@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39829}: Removed the @code{__len__()} call when initializing a list and
moved initializing to @code{list_extend}. Patch by Jeremiah Pascual.

@item 
bpo-46944@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46944}: Speed up throwing exception in generator with
@ref{19e1,,METH_FASTCALL} calling convention. Patch by Kumar Aditya.

@item 
bpo-46841@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46841}: Modify @ref{1bee,,STORE_SUBSCR} to use an inline cache entry
(rather than its oparg) as an adaptive counter.

@item 
bpo-46841@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46841}: Use inline caching for @code{PRECALL} and @ref{917,,CALL},
and remove the internal machinery for managing the (now unused) non-inline
caches.

@item 
bpo-46881@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46881}: Statically allocate and initialize the latin1 characters.

@item 
bpo-46838@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46838}: Improve syntax errors for incorrect function definitions. Patch
by Pablo Galindo

@item 
bpo-43721@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43721}: Fix docstrings of @ref{1a1d,,getter},
@ref{1a1e,,setter}, and @ref{1a1f,,deleter} to clarify that
they create a new copy of the property.

@item 
bpo-43224@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43224}: Make grammar changes required for PEP 646.
@end itemize

@node Library<96>,Documentation<33>,Core and Builtins<93>,Python 3 11 0 alpha 7
@anchor{whatsnew/changelog id445}@anchor{1bef}
@subsubsection Library



@itemize -

@item 
bpo-47208@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47208}: Allow vendors to override @code{CTYPES_MAX_ARGCOUNT}.

@item 
bpo-23689@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23689}: @ref{be,,re} module: fix memory leak when a match is terminated by
a signal or memory allocation failure. Patch by Ma Lin.

@item 
bpo-47167@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47167}: Allow overriding a future compliance check in
@ref{1c9,,asyncio.Task}.

@item 
bpo-47151@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47151}: When subprocess tries to use vfork, it now falls back to fork
if vfork returns an error. This allows use in situations where vfork isn’t
allowed by the OS kernel.

@item 
bpo-47152@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47152}: Convert the @ref{be,,re} module into a package. Deprecate modules
@code{sre_compile}, @code{sre_constants} and @code{sre_parse}.

@item 
bpo-4833@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4833}: Add @code{ZipFile.mkdir()}

@item 
bpo-27929@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27929}: Fix @ref{fce,,asyncio.loop.sock_connect()} to only resolve names for
@ref{1bf0,,socket.AF_INET} or @ref{1bf1,,socket.AF_INET6} families. Resolution
may not make sense for other families, like @ref{1bf2,,socket.AF_BLUETOOTH}
and @ref{1bf3,,socket.AF_UNIX}.

@item 
bpo-14265@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14265}: Adds the fully qualified test name to unittest output

@item 
bpo-47061@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47061}: Deprecate the aifc module.

@item 
bpo-39622@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39622}: Handle Ctrl+C in asyncio programs to interrupt the main task.

@item 
bpo-47101@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47101}: @ref{1580,,hashlib.algorithms_available} now lists only algorithms
that are provided by activated crypto providers on OpenSSL 3.0. Legacy
algorithms are not listed unless the legacy provider has been loaded into
the default OSSL context.

@item 
bpo-47099@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47099}: All @code{URLError} exception messages raised in
@code{urllib.request.URLopener} now contain a colon between @code{ftp
error} and the rest of the message. Previously,
@code{open_ftp()} missed the colon. Patch by Oleg
Iarygin.

@item 
bpo-47099@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47099}: Exception chaining is changed from
@code{Exception.with_traceback()}/@ref{89c,,sys.exc_info()} to 
@geindex Python Enhancement Proposals; PEP 3134
PEP 3134@footnote{https://peps.python.org/pep-3134/}.
Patch by Oleg Iarygin.

@item 
bpo-47095@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47095}: @ref{6c,,hashlib}’s internal @code{_blake2} module now prefers
@code{libb2} from @indicateurl{https://www.blake2.net/} over Python’s vendored copy of
blake2.

@item 
bpo-47098@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47098}: The Keccak Code Package for @ref{6c,,hashlib}’s internal @code{_sha3}
module has been replaced with tiny_sha3. The module is used as fallback
when Python is built without OpenSSL.

@item 
bpo-47088@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47088}: Implement @ref{7e7,,typing.LiteralString}, part of 
@geindex Python Enhancement Proposals; PEP 675
PEP 675@footnote{https://peps.python.org/pep-0675/}.
Patch by Jelle Zijlstra.

@item 
bpo-42885@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42885}: Optimize @ref{1438,,re.search()}, @ref{5a2,,re.split()},
@ref{1230,,re.findall()}, @ref{1706,,re.finditer()} and @ref{5a3,,re.sub()} for regular
expressions starting with @code{\A} or @code{^}.

@item 
bpo-23691@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23691}: Protect the @ref{1706,,re.finditer()} iterator from re-entering.

@item 
bpo-47067@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47067}: Optimize calling @code{GenericAlias} objects by using 
@geindex Python Enhancement Proposals; PEP 590
PEP 590@footnote{https://peps.python.org/pep-0590/}
@code{vectorcall} and by replacing @code{PyObject_SetAttrString} with
@code{PyObject_SetAttr}.

@item 
bpo-28080@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28080}: Add the `metadata_encoding' parameter in the
@ref{8d5,,zipfile.ZipFile} constructor and the @code{--metadata-encoding}
option in the @ref{138,,zipfile} CLI to allow reading zipfiles using
non-standard codecs to encode the filenames within the archive.

@item 
bpo-47000@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47000}: Make @ref{1a83,,io.text_encoding()} returns “utf-8” when UTF-8 mode
is enabled.

@item 
bpo-42369@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42369}: Fix thread safety of @code{zipfile._SharedFile.tell()} to avoid
a “zipfile.BadZipFile: Bad CRC-32 for file” exception when reading a
@code{ZipFile} from multiple threads.

@item 
bpo-38256@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38256}: Fix @ref{1a58,,binascii.crc32()} when it is compiled to use zlib’c
crc32 to work properly on inputs 4+GiB in length instead of returning the
wrong result. The workaround prior to this was to always feed the function
data in increments smaller than 4GiB or to just call the zlib module
function.

We also have @ref{1a58,,binascii.crc32()} release the GIL when computing on
larger inputs as @ref{1a57,,zlib.crc32()} and @ref{6c,,hashlib} do.

This also boosts performance on Windows as it now uses the zlib crc32
implementation for @ref{1a58,,binascii.crc32()} for a 2-3x speedup.

That the stdlib has a crc32 API in two modules is a known historical
oddity. This moves us closer to a single implementation behind them.

@item 
bpo-47066@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47066}: Global inline flags (e.g. @code{(?i)}) can now only be used at the
start of the regular expressions.  Using them not at the start of
expression was deprecated since Python 3.6.

@item 
bpo-39394@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39394}: A warning about inline flags not at the start of the regular
expression now contains the position of the flag.

@item 
bpo-433030@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=433030}: Add support of atomic grouping (@code{(?>...)}) and possessive
quantifiers (@code{*+}, @code{++}, @code{?+}, @code{@{m,n@}+}) in @ref{be,,regular expressions}.

@item 
bpo-47062@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47062}: Implement @ref{2f7,,asyncio.Runner} context manager.

@item 
bpo-46382@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46382}: @ref{4e2,,dataclass()} @code{slots=True} now correctly
omits slots already defined in base classes. Patch by Arie Bovenberg.

@item 
bpo-47057@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47057}: Use FASTCALL convention for @code{FutureIter.throw()}

@item 
bpo-47061@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47061}: Deprecate the various modules listed by 
@geindex Python Enhancement Proposals; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}:

aifc, asynchat, asyncore, audioop, cgi, cgitb, chunk, crypt, imghdr,
msilib, nntplib, nis, ossaudiodev, pipes, smtpd, sndhdr, spwd, sunau,
telnetlib, uu, xdrlib

@item 
bpo-34790@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34790}: Remove passing coroutine objects to @ref{6a8,,asyncio.wait()}.

@item 
bpo-47039@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47039}: Normalize @code{repr()} of asyncio future and task objects.

@item 
bpo-2604@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2604}: Fix bug where doctests using globals would fail when run
multiple times.

@item 
bpo-45150@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45150}: Add @ref{855,,hashlib.file_digest()} helper for efficient hashing of
file object.

@item 
bpo-34861@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34861}: Made cumtime the default sorting key for cProfile

@item 
bpo-45997@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45997}: Fix @ref{c6e,,asyncio.Semaphore} re-aquiring FIFO order.

@item 
bpo-47022@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47022}: The @code{asynchat}, @code{asyncore} and  @code{smtpd}
modules have been deprecated since at least Python 3.6. Their
documentation and deprecation warnings and have now been updated to note
they will removed in Python 3.12 (
@geindex Python Enhancement Proposals; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}).

@item 
bpo-43253@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43253}: Fix a crash when closing transports where the underlying socket
handle is already invalid on the Proactor event loop.

@item 
bpo-40280@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40280}: @ref{fa6,,select.select()} now passes @code{NULL} to @code{select} for
each empty fdset.

@item 
bpo-47004@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47004}: Apply bugfixes from importlib_metadata 4.11.3, including bugfix
for EntryPoint.extras, which was returning match objects and not the
extras strings.

@item 
bpo-46998@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46998}: Allow subclassing of @ref{8bd,,typing.Any}. Patch by Shantanu
Jain.

@item 
bpo-46995@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46995}: Deprecate missing @ref{bd6,,asyncio.Task.set_name()} for third-party
task implementations, schedule making it mandatory in Python 3.13.

@item 
bpo-46994@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46994}: Accept explicit contextvars.Context in
@ref{1cb,,asyncio.create_task()} and @ref{1cc,,asyncio.loop.create_task()}.

@item 
bpo-46981@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46981}: @code{typing.get_args(typing.Tuple[()])} now returns @code{()}
instead of @code{((),)}.

@item 
bpo-46968@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46968}: Add @code{os.sysconf_names['SC_MINSIGSTKSZ']}.

@item 
bpo-46985@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46985}: Upgrade pip wheel bundled with ensurepip (pip 22.0.4)

@item 
bpo-46968@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46968}: @ref{5c,,faulthandler}: On Linux 5.14 and newer, dynamically
determine size of signal handler stack size CPython allocates using
@code{getauxval(AT_MINSIGSTKSZ)}. This changes allows for Python extension’s
request to Linux kernel to use AMX_TILE instruction set on Sapphire Rapids
Xeon processor to succeed, unblocking use of the ISA in frameworks.

@item 
bpo-46917@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46917}: The @ref{875,,math.nan} value is now always available. Patch by
Victor Stinner.

@item 
bpo-46955@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46955}: Expose @code{asyncio.base_events.Server} as
@ref{d0e,,asyncio.Server}. Patch by Stefan Zabka.

@item 
bpo-23325@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23325}: The @ref{cb,,signal} module no longer assumes that
@ref{1bf4,,SIG_IGN} and @ref{1bf5,,SIG_DFL} are small int
singletons.

@item 
bpo-46932@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46932}: Update bundled libexpat to 2.4.7

@item 
bpo-46933@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46933}: The @ref{b7,,pwd} module is now optional.
@ref{c0f,,os.path.expanduser()} returns the path when the @code{pwd} module is
not available.

@item 
bpo-40059@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40059}: 
@geindex Python Enhancement Proposals; PEP 680
PEP 680@footnote{https://peps.python.org/pep-0680/}, the @ref{103,,tomllib} module. Adds support for parsing
TOML.

@item 
bpo-464471@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=464471}: @ref{815,,asyncio.timeout()} and @ref{1bf6,,asyncio.timeout_at()} context
managers added. Patch by Tin Tvrtković and Andrew Svetlov.

@item 
bpo-46805@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46805}: Added raw datagram socket functions for asyncio:
@code{sock_sendto()},
@code{sock_recvfrom()} and
@code{sock_recvfrom_into()}.

@item 
bpo-46644@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46644}: No longer require valid typeforms to be callable. This allows
@ref{b3d,,typing.Annotated} to wrap @ref{9cf,,typing.ParamSpecArgs} and
@ref{1bf7,,dataclasses.InitVar}. Patch by Gregory Beauregard.

@item 
bpo-46581@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46581}: Brings @code{ParamSpec} propagation for @code{GenericAlias}
in line with @code{Concatenate} (and others).

@item 
bpo-45413@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45413}: Define `posix_venv' and `nt_venv' @ref{447,,sysconfig installation schemes} to be used for bootstrapping new virtual
environments. Add `venv' sysconfig installation scheme to get the
appropriate one of the above. The schemes are identical to the
pre-existing `posix_prefix' and `nt' install schemes. The @ref{118,,venv}
module now uses the `venv' scheme to create new virtual environments
instead of hardcoding the paths depending only on the platform. Downstream
Python distributors customizing the `posix_prefix' or `nt' install scheme
in a way that is not compatible with the install scheme used in virtual
environments are encouraged not to customize the `venv' schemes. When
Python itself runs in a virtual environment,
@ref{1bf8,,sysconfig.get_default_scheme()} and
@ref{8a1,,sysconfig.get_preferred_scheme()} with @code{key="prefix"} returns
`venv'.

@item 
bpo-43224@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43224}: Implement support for PEP 646 in typing.py.

@item 
bpo-43224@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43224}: Allow unpacking types.GenericAlias objects, e.g. @code{*tuple[int,
str]}.

@item 
bpo-46557@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46557}: Warnings captured by the logging module are now logged without
a format string to prevent systems that group logs by the msg argument
from grouping captured warnings together.

@item 
bpo-41370@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41370}: @ref{8c2,,typing.get_type_hints()} now supports evaluating strings
as forward references in @ref{8c3,,PEP 585 generic aliases}.

@item 
bpo-46607@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46607}: Add @ref{1a4,,DeprecationWarning} to @code{LegacyInterpolation},
deprecated in the docstring since Python 3.2. Will be removed in Python
3.13. Use @code{BasicInterpolation} or @code{ExtendedInterpolation}
instead.

@item 
bpo-26120@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26120}: @ref{ba,,pydoc} now excludes __future__ imports from the module’s
data items.

@item 
bpo-46480@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46480}: Add @ref{8bc,,typing.assert_type()}. Patch by Jelle Zijlstra.

@item 
bpo-46421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46421}: Fix a unittest issue where if the command was invoked as
@code{python -m unittest} and the filename(s) began with a dot (.), a
@code{ValueError} is returned.

@item 
bpo-46245@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46245}: Add optional parameter `dir_fd' in @ref{354,,shutil.rmtree()}.

@item 
bpo-22859@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22859}: @code{unittest.TestProgram.usageExit()} is marked as
deprecated, to be removed in Python 3.13.

@item 
bpo-46170@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46170}: Improve the error message when you try to subclass an instance
of @ref{ef7,,typing.NewType}.

@item 
bpo-40296@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40296}: Fix supporting generic aliases in @ref{ba,,pydoc}.

@item 
bpo-20392@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20392}: Fix inconsistency with uppercase file extensions in
@code{MimeTypes.guess_type()}. Patch by Kumar Aditya.

@item 
bpo-46030@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46030}: Add @code{LOCAL_CREDS}, @code{LOCAL_CREDS_PERSISTENT} and
@code{SCM_CREDS2} FreeBSD constants to the socket module.

@item 
bpo-44439@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44439}: Fix @code{.write()} method of a member file in @code{ZipFile}, when
the input data is an object that supports the buffer protocol, the file
length may be wrong.

@item 
bpo-45171@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45171}: Fix handling of the @code{stacklevel} argument to logging
functions in the @ref{8b,,logging} module so that it is consistent across all
logging functions and, as advertised, similar to the @code{stacklevel}
argument used in @ref{1725,,warn()}.

@item 
bpo-24959@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24959}: Fix bug where @ref{10d,,unittest} sometimes drops frames from
tracebacks of exceptions raised in tests.

@item 
bpo-44859@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44859}: Raise more accurate and 
@geindex Python Enhancement Proposals; PEP 249
PEP 249@footnote{https://peps.python.org/pep-0249/} compatible exceptions in
@ref{d4,,sqlite3}.


@itemize *

@item 
Raise @ref{88f,,InterfaceError} instead of
@ref{307,,ProgrammingError} for @code{SQLITE_MISUSE} errors.

@item 
Don’t overwrite @ref{17e9,,BufferError} with @ref{2ee,,ValueError} when conversion to
BLOB fails.

@item 
Raise @ref{307,,ProgrammingError} instead of @ref{1bf9,,Warning} if
user tries to @ref{5b0,,execute()} more than one SQL statement.

@item 
Raise @ref{307,,ProgrammingError} instead of @ref{2ee,,ValueError} if an SQL
query contains null characters.
@end itemize

@item 
bpo-44493@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44493}: Add missing terminated NUL in sockaddr_un’s length

This was potentially observable when using non-abstract AF_UNIX datagram
sockets to processes written in another programming language.

@item 
bpo-41930@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41930}: Add @ref{890,,serialize()} and
@ref{891,,deserialize()} support to @ref{d4,,sqlite3}. Patch
by Erlend E. Aasland.

@item 
bpo-33178@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33178}: Added @ref{1bfa,,ctypes.BigEndianUnion} and
@ref{1bfb,,ctypes.LittleEndianUnion} classes, as originally documented in the
library docs but not yet implemented.

@item 
bpo-43352@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43352}: Add an Barrier object in synchronization primitives of
`asyncio' Lib in order to be consistent with Barrier from `threading' and
`multiprocessing' libs*

@item 
bpo-35859@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35859}: @ref{be,,re} module, fix a few bugs about capturing group. In rare
cases, capturing group gets an incorrect string. Patch by Ma Lin.
@end itemize

@node Documentation<33>,Tests<33>,Library<96>,Python 3 11 0 alpha 7
@anchor{whatsnew/changelog id446}@anchor{1bfc}
@subsubsection Documentation



@itemize -

@item 
bpo-45099@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45099}: Document internal @ref{b,,asyncio} API.

@item 
bpo-47126@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47126}: Update PEP URLs to 
@geindex Python Enhancement Proposals; PEP 676
PEP 676@footnote{https://peps.python.org/pep-0676/}’s new canonical form.

@item 
bpo-47040@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47040}: Clarified the old Python versions compatibility note of
@ref{1a58,,binascii.crc32()} / @ref{1bfd,,zlib.adler32()} / @ref{1a57,,zlib.crc32()}
functions.

@item 
bpo-46033@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46033}: Clarify @code{for} statement execution in its doc.

@item 
bpo-45790@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45790}: Adjust inaccurate phrasing in
@ref{1bfe,,Defining Extension Types; Tutorial} about the @code{ob_base} field and the
macros used to access its contents.

@item 
bpo-42340@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42340}: Document that in some circumstances @ref{bcb,,KeyboardInterrupt}
may cause the code to enter an inconsistent state. Provided a sample
workaround to avoid it if needed.

@item 
bpo-41233@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41233}: Link the errnos referenced in @code{Doc/library/exceptions.rst} to
their respective section in @code{Doc/library/errno.rst}, and vice versa.
Previously this was only done for EINTR and InterruptedError. Patch by Yan
“yyyyyyyan” Orestes.
@end itemize

@node Tests<33>,Build<39>,Documentation<33>,Python 3 11 0 alpha 7
@anchor{whatsnew/changelog id447}@anchor{1bff}
@subsubsection Tests



@itemize -

@item 
bpo-47205@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47205}: Skip test for @ref{1316,,sched_getaffinity()} and
@ref{131a,,sched_setaffinity()} error case on FreeBSD.

@item 
bpo-46126@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46126}: Restore ‘descriptions’ when running tests internally.

@item 
bpo-47104@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47104}: Rewrite @ref{aeb,,asyncio.to_thread()} tests to use
@ref{35f,,unittest.IsolatedAsyncioTestCase}.

@item 
bpo-40280@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40280}: The test suite is now passing on the Emscripten platform. All
fork, socket, and subprocess-based tests are skipped.

@item 
bpo-47037@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47037}: Skip @code{strftime("%4Y")} feature test on Windows. It can cause
an assertion error in debug builds.

@item 
bpo-46587@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46587}: Skip tests if platform’s @code{strftime} does not support
non-portable glibc extensions.

@item 
bpo-47015@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47015}: A test case for @ref{d0b,,os.sendfile()} is converted from
deprecated @code{asyncore} (see 
@geindex Python Enhancement Proposals; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}) to @ref{b,,asyncio}. Patch by
Oleg Iarygin.
@end itemize

@node Build<39>,Windows<33>,Tests<33>,Python 3 11 0 alpha 7
@anchor{whatsnew/changelog id448}@anchor{1c00}
@subsubsection Build



@itemize -

@item 
bpo-40280@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40280}: Add configure option @ref{1c01,,--enable-wasm-dynamic-linking} to
enable @code{dlopen} and MAIN_MODULE / SIDE_MODULE on @code{wasm32-emscripten}.

@item 
bpo-46023@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46023}: @code{makesetup} now detects and skips all duplicated module
definitions. The first entry wins.

@item 
bpo-40280@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40280}: Add SOABI @code{wasm32-emscripten} for Emscripten and
@code{wasm32-wasi} for WASI on 32bit WASM as well as @code{wasm64} counter
parts.

@item 
bpo-47032@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47032}: Ensure Windows install builds fail correctly with a non-zero
exit code when part of the build fails.

@item 
bpo-47024@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47024}: Update OpenSSL to 1.1.1n for macOS installers and all Windows
builds.

@item 
bpo-46996@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46996}: The @ref{f6,,tkinter} package now requires Tcl/Tk version 8.5.12
or newer.

@item 
bpo-46973@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46973}: Add @code{regen-configure} make target to regenerate configure
script with Christian’s container image
@code{quay.io/tiran/cpython_autoconf:269}.

@item 
bpo-46917@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46917}: Building Python now requires support of IEEE 754 floating-point
numbers. Patch by Victor Stinner.

@item 
bpo-45774@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45774}: @code{configure} now verifies that all SQLite C APIs needed for
the @ref{d4,,sqlite3} extension module are found.
@end itemize

@node Windows<33>,macOS<25>,Build<39>,Python 3 11 0 alpha 7
@anchor{whatsnew/changelog id449}@anchor{1c02}
@subsubsection Windows



@itemize -

@item 
bpo-47194@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47194}: Update @code{zlib} to v1.2.12 to resolve 
@geindex Common Vulnerabilities and Exposures; CVE 2018-25032
CVE 2018-25032@footnote{https://www.cve.org/CVERecord?id=CVE-2018-25032}.

@item 
bpo-47171@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47171}: Enables installing the @code{py.exe} launcher on Windows
ARM64.

@item 
bpo-46566@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46566}: Upgraded @ref{7db,,Python install manager} to support a new @code{-V:company/tag}
argument for full 
@geindex Python Enhancement Proposals; PEP 514
PEP 514@footnote{https://peps.python.org/pep-0514/} support and to detect ARM64 installs. The
@code{-64} suffix on arguments is deprecated, but still selects any
non-32-bit install. Setting 
@geindex PYLAUNCHER_ALLOW_INSTALL
@geindex environment variable; PYLAUNCHER_ALLOW_INSTALL
@code{PYLAUNCHER_ALLOW_INSTALL} and
specifying a version that is not installed will attempt to install the
requested version from the Microsoft Store.

@item 
bpo-47086@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47086}: The installer for Windows now includes documentation as loose
HTML files rather than a single compiled @code{.chm} file.

@item 
bpo-46907@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46907}: Update Windows installer to use SQLite 3.38.1.

@item 
bpo-44549@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44549}: Update bzip2 to 1.0.8 in Windows builds to mitigate
@geindex Common Vulnerabilities and Exposures; CVE 2016-3189
CVE 2016-3189@footnote{https://www.cve.org/CVERecord?id=CVE-2016-3189} and 
@geindex Common Vulnerabilities and Exposures; CVE 2019-12900
CVE 2019-12900@footnote{https://www.cve.org/CVERecord?id=CVE-2019-12900}.

@item 
bpo-46948@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46948}: Prevent 
@geindex Common Vulnerabilities and Exposures; CVE 2022-26488
CVE 2022-26488@footnote{https://www.cve.org/CVERecord?id=CVE-2022-26488} by ensuring the Add to PATH option in
the Windows installer uses the correct path when being repaired.
@end itemize

@node macOS<25>,Tools/Demos<26>,Windows<33>,Python 3 11 0 alpha 7
@anchor{whatsnew/changelog id450}@anchor{1c03}
@subsubsection macOS



@itemize -

@item 
bpo-46890@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46890}: Fix a regression in the setting of @code{sys._base_executable} in
framework builds, and thereby fix a regression in @ref{118,,venv} virtual
environments with such builds.

@item 
bpo-46907@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46907}: Update macOS installer to SQLite 3.38.1.
@end itemize

@node Tools/Demos<26>,C API<34>,macOS<25>,Python 3 11 0 alpha 7
@anchor{whatsnew/changelog id451}@anchor{1c04}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-40280@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40280}: Replace Emscripten’s limited shell with Katie Bell’s browser-ui
REPL from python-wasm project.
@end itemize

@node C API<34>,,Tools/Demos<26>,Python 3 11 0 alpha 7
@anchor{whatsnew/changelog id452}@anchor{1c05}
@subsubsection C API



@itemize -

@item 
bpo-40421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40421}: Add @code{PyFrame_GetBuiltins}, @code{PyFrame_GetGenerator} and
@code{PyFrame_GetGlobals} C-API functions to access frame object attributes
safely from C code.

@item 
bpo-46850@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46850}: Move the private @code{_PyFrameEvalFunction} type, and private
@code{_PyInterpreterState_GetEvalFrameFunc()} and
@code{_PyInterpreterState_SetEvalFrameFunc()} functions to the internal C
API. The @code{_PyFrameEvalFunction} callback function type now uses the
@code{_PyInterpreterFrame} type which is part of the internal C API. Patch by
Victor Stinner.

@item 
bpo-46850@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46850}: Move the private undocumented @code{_PyEval_EvalFrameDefault()}
function to the internal C API. The function now uses the
@code{_PyInterpreterFrame} type which is part of the internal C API. Patch by
Victor Stinner.

@item 
bpo-46850@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46850}: Remove the private undocumented function
@code{_PyEval_CallTracing()} from the C API. Call the public
@ref{1c06,,sys.call_tracing()} function instead. Patch by Victor Stinner.

@item 
bpo-46850@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46850}: Remove the private undocumented function
@code{_PyEval_GetCoroutineOriginTrackingDepth()} from the C API. Call the
public @ref{d8a,,sys.get_coroutine_origin_tracking_depth()} function instead.
Patch by Victor Stinner.

@item 
bpo-46850@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46850}: Remove the following private undocumented functions from the C
API:


@itemize *

@item 
@code{_PyEval_GetAsyncGenFirstiter()}

@item 
@code{_PyEval_GetAsyncGenFinalizer()}

@item 
@code{_PyEval_SetAsyncGenFirstiter()}

@item 
@code{_PyEval_SetAsyncGenFinalizer()}
@end itemize

Call the public @ref{1c07,,sys.get_asyncgen_hooks()} and
@ref{19e0,,sys.set_asyncgen_hooks()} functions instead. Patch by Victor Stinner.

@item 
bpo-46987@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46987}: Remove private functions @code{_PySys_GetObjectId()} and
@code{_PySys_SetObjectId()}. Patch by Donghee Na.

@item 
bpo-46906@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46906}: Add new functions to pack and unpack C double (serialize and
deserialize): @ref{96e,,PyFloat_Pack2()}, @ref{96f,,PyFloat_Pack4()},
@ref{970,,PyFloat_Pack8()}, @ref{971,,PyFloat_Unpack2()},
@ref{972,,PyFloat_Unpack4()} and @ref{973,,PyFloat_Unpack8()}. Patch by Victor
Stinner.
@end itemize

@node Python 3 11 0 alpha 6,Python 3 11 0 alpha 5,Python 3 11 0 alpha 7,Changelog
@anchor{whatsnew/changelog python-3-11-0-alpha-6}@anchor{1c08}
@subsection Python 3.11.0 alpha 6


`Release date: 2022-03-07'

@menu
* Core and Builtins: Core and Builtins<94>. 
* Library: Library<97>. 
* Core and Builtins: Core and Builtins<95>. 
* Library: Library<98>. 
* Core and Builtins: Core and Builtins<96>. 
* Library: Library<99>. 
* Core and Builtins: Core and Builtins<97>. 
* Library: Library<100>. 
* Documentation: Documentation<34>. 
* Tests: Tests<34>. 
* Build: Build<40>. 
* Windows: Windows<34>. 
* IDLE: IDLE<17>. 
* C API: C API<35>. 

@end menu

@node Core and Builtins<94>,Library<97>,,Python 3 11 0 alpha 6
@anchor{whatsnew/changelog id453}@anchor{1c09}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-46940@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46940}: Avoid overriding @ref{5f0,,AttributeError} metadata information for
nested attribute access calls. Patch by Pablo Galindo.

@item 
bpo-46927@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46927}: Include the type’s name in the error message for subscripting
non-generic types.

@item 
bpo-46921@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46921}: Support vectorcall for @code{super()}. Patch by Ken Jin.

@item 
bpo-46841@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46841}: Fix incorrect handling of inline cache entries when
specializing @ref{364,,BINARY_OP}.

@item 
bpo-46841@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46841}: Use an oparg to simplify the construction of helpful error
messages in @ref{1c0a,,GET_AWAITABLE}.

@item 
bpo-46903@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46903}: Make sure that str subclasses can be used as attribute names
for instances with virtual dictionaries. Fixes regression in 3.11alpha

@item 
bpo-46841@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46841}: Add more detailed specialization failure stats for
@ref{b67,,COMPARE_OP} followed by @ref{1b62,,EXTENDED_ARG}.

@item 
bpo-46891@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46891}: Fix bug introduced during 3.11alpha where subclasses of
@code{types.ModuleType} with @code{__slots__} were not initialized correctly,
resulting in an interpreter crash.

@item 
bpo-46841@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46841}: Use inline caching for @ref{705,,LOAD_ATTR},
@code{LOAD_METHOD}, and @ref{1c0b,,STORE_ATTR}.

@item 
bpo-46841@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46841}: Use inline cache for @code{BINARY_SUBSCR}.

@item 
bpo-46841@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46841}: Use inline caching for @ref{b67,,COMPARE_OP}.

@item 
bpo-46864@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46864}: Deprecate @code{PyBytesObject.ob_shash}. It will be removed in
Python 3.13.

@item 
bpo-46841@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46841}: Use inline caching for @ref{1c0c,,UNPACK_SEQUENCE}.

@item 
bpo-46845@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46845}: Reduces dict size by removing hash value from hash table when
all inserted keys are Unicode. For example,
@code{sys.getsizeof(dict.fromkeys("abcdefg"))} becomes 272 bytes from 352
bytes on 64bit platform.

@item 
bpo-46841@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46841}: Use inline cache for @ref{1aa0,,LOAD_GLOBAL}.

@item 
bpo-46852@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46852}: Rename the private undocumented @code{float.__set_format__()}
method to @code{float.__setformat__()} to fix a typo introduced in Python
3.7. The method is only used by test_float. Patch by Victor Stinner.

@item 
bpo-46852@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46852}: Remove the undocumented private @code{float.__set_format__()}
method, previously known as @code{float.__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.” Patch by Victor Stinner.

@item 
bpo-40116@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40116}: Fix regression that dict.update(other) may don’t respect
iterate order of other when other is key sharing dict.

@item 
bpo-46712@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46712}: Share global string identifiers in deep-frozen modules.

@item 
bpo-46430@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46430}: Fix memory leak in interned strings of deep-frozen modules.

@item 
bpo-46841@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46841}: Store @ref{364,,BINARY_OP} caches inline using a new
@ref{90a,,CACHE} instruction.

@item 
bpo-45107@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45107}: Specialize @code{LOAD_METHOD} for instances with a dict.

@item 
bpo-44337@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44337}: Reduce the memory usage of specialized @ref{705,,LOAD_ATTR} and
@ref{1c0b,,STORE_ATTR} instructions.

@item 
bpo-46729@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46729}: Add number of sub-exceptions to @code{BaseException.__str__()}.

@item 
bpo-45885@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45885}: Don’t un-adapt @ref{b67,,COMPARE_OP} when collecting
specialization stats.

@item 
bpo-46329@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46329}: Fix specialization stats gathering for @code{PRECALL}
instructions.
@end itemize

@node Library<97>,Core and Builtins<95>,Core and Builtins<94>,Python 3 11 0 alpha 6
@anchor{whatsnew/changelog id454}@anchor{1c0d}
@subsubsection Library



@itemize -

@item 
bpo-46794@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46794}: Bump up the libexpat version into 2.4.6
@end itemize

@node Core and Builtins<95>,Library<98>,Library<97>,Python 3 11 0 alpha 6
@anchor{whatsnew/changelog id455}@anchor{1c0e}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-46823@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46823}: Implement a specialized combined opcode
@code{LOAD_FAST__LOAD_ATTR_INSTANCE_VALUE}.  Patch by Dennis Sweeney.

@item 
bpo-46820@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46820}: Fix parsing a numeric literal immediately (without spaces)
followed by “not in” keywords, like in @code{1not in x}. Now the parser only
emits a warning, not a syntax error.

@item 
bpo-46329@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46329}: Move @code{KW_NAMES} before @code{PRECALL} instruction in call
sequence. Change @code{operand} of @code{CALL} to match @code{PRECALL} for easier
specialization.

@item 
bpo-46808@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46808}: Remove the @code{NEXT_BLOCK} macro from compile.c, and make the
compiler automatically generate implicit blocks when they are needed.

@item 
bpo-46329@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46329}: Add @code{PUSH_NULL} instruction. This is used as a prefix when
evaluating a callable, so that the stack has the same shape for methods
and other calls. @code{PRECALL_FUNCTION} and @code{PRECALL_METHOD} are merged
into a single @code{PRECALL} instruction.

There is no change in semantics.

@item 
bpo-46762@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46762}: Fix an assert failure in debug builds when a ‘<’, ‘>’, or ‘=’
is the last character in an f-string that’s missing a closing right brace.

@item 
bpo-46730@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46730}: Message of AttributeError caused by getting, setting or
deleting a property without the corresponding function now mentions that
the attribute is in fact a property and also specifies type of the class
that it belongs to.

@item 
bpo-46724@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46724}: Make sure that all backwards jumps use the @code{JUMP_ABSOLUTE}
instruction, rather than @code{JUMP_FORWARD} with an argument of
@code{(2**32)+offset}.

@item 
bpo-46732@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46732}: Correct the docstring for the @ref{14e1,,__bool__()} method.
Patch by Jelle Zijlstra.

@item 
bpo-46072@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46072}: Add more detailed specialization failure statistics for
@ref{364,,BINARY_OP}.

@item 
bpo-46707@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46707}: Avoid potential exponential backtracking when producing some
syntax errors involving lots of brackets. Patch by Pablo Galindo.
@end itemize

@node Library<98>,Core and Builtins<96>,Core and Builtins<95>,Python 3 11 0 alpha 6
@anchor{whatsnew/changelog id456}@anchor{1c0f}
@subsubsection Library



@itemize -

@item 
bpo-46323@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46323}: @ref{2e,,ctypes} now allocates memory on the stack instead of on
the heap to pass arguments while calling a Python callback function. Patch
by Donghee Na.
@end itemize

@node Core and Builtins<96>,Library<99>,Library<98>,Python 3 11 0 alpha 6
@anchor{whatsnew/changelog id457}@anchor{1c10}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-45923@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45923}: Add a quickened form of @ref{5bb,,RESUME} that skips quickening
checks.

@item 
bpo-46702@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46702}: Specialize @ref{1c0c,,UNPACK_SEQUENCE} for @ref{614,,tuple} and
@ref{24f,,list} unpackings.

@item 
bpo-46072@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46072}: Opcode pair stats are now gathered with @code{--enable-pystats}.
Defining @code{DYNAMIC_EXECUTION_PROFILE} or  @code{DXPAIRS} no longer has any
effect.

@item 
bpo-46675@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46675}: Allow more than 16 items in a split dict before it is combined.
The limit is now 254.
@end itemize

@node Library<99>,Core and Builtins<97>,Core and Builtins<96>,Python 3 11 0 alpha 6
@anchor{whatsnew/changelog id458}@anchor{1c11}
@subsubsection Library



@itemize -

@item 
bpo-40479@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40479}: Add a missing call to @code{va_end()} in
@code{Modules/_hashopenssl.c}.

@item 
bpo-46323@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46323}: Use @ref{77f,,PyObject_Vectorcall()} while calling ctypes callback
function. Patch by Donghee Na.
@end itemize

@node Core and Builtins<97>,Library<100>,Library<99>,Python 3 11 0 alpha 6
@anchor{whatsnew/changelog id459}@anchor{1c12}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-46615@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46615}: When iterating over sets internally in @code{setobject.c}, acquire
strong references to the resulting items from the set.  This prevents
crashes in corner-cases of various set operations where the set gets
mutated.

@item 
bpo-45828@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45828}: The bytecode compiler now attempts to apply runtime stack
manipulations at compile-time (whenever it is feasible to do so).

@item 
bpo-30496@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30496}: Fixed a minor portability issue in the implementation of
@ref{1c13,,PyLong_FromLong()}, and added a fast path for single-digit integers
to @ref{1c14,,PyLong_FromLongLong()}.
@end itemize

@node Library<100>,Documentation<34>,Core and Builtins<97>,Python 3 11 0 alpha 6
@anchor{whatsnew/changelog id460}@anchor{1c15}
@subsubsection Library



@itemize -

@item 
bpo-25707@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25707}: Fixed a file leak in @ref{57a,,xml.etree.ElementTree.iterparse()}
when the iterator is not exhausted. Patch by Jacob Walls.

@item 
bpo-46877@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46877}: Export @ref{1c16,,unittest.doModuleCleanups()} in @ref{10d,,unittest}.
Patch by Kumar Aditya.

@item 
bpo-46848@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46848}: For performance, use the optimized string-searching
implementations from @ref{1c17,,find()} and @ref{1c18,,rfind()} for
@code{find()} and @code{rfind()}.

@item 
bpo-46736@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46736}: @ref{d3e,,SimpleHTTPRequestHandler} now uses HTML5
grammar. Patch by Donghee Na.

@item 
bpo-44886@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44886}: Inherit asyncio proactor datagram transport from
@ref{1b6b,,asyncio.DatagramTransport}.

@item 
bpo-46827@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46827}: Support UDP sockets in  @ref{fce,,asyncio.loop.sock_connect()} for
selector-based event loops.  Patch by Thomas Grainger.

@item 
bpo-46811@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46811}: Make test suite support Expat >=2.4.5

@item 
bpo-46252@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46252}: Raise @ref{199,,TypeError} if @ref{aed,,ssl.SSLSocket} is passed to
transport-based APIs.

@item 
bpo-46784@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46784}: Fix libexpat symbols collisions with user dynamically loaded or
statically linked libexpat in embedded Python.

@item 
bpo-46786@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46786}: The HTML serialisation in xml.etree.ElementTree now writes
@code{embed}, @code{source}, @code{track} and @code{wbr} as empty tags, as defined in
HTML 5.

@item 
bpo-39327@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39327}: @ref{354,,shutil.rmtree()} can now work with VirtualBox shared
folders when running from the guest operating-system.

@item 
bpo-45390@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45390}: Propagate @ref{4d5,,asyncio.CancelledError} message from inner task
to outer awaiter.

@item 
bpo-46756@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46756}: Fix a bug in
@ref{1c19,,urllib.request.HTTPPasswordMgr.find_user_password()} and
@ref{1c1a,,urllib.request.HTTPPasswordMgrWithPriorAuth.is_authenticated()} which
allowed to bypass authorization. For example, access to URI
@code{example.org/foobar} was allowed if the user was authorized for URI
@code{example.org/foo}.

@item 
bpo-46737@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46737}: @ref{1c1b,,random.gauss()} and @ref{1c1c,,random.normalvariate()} now have
default arguments.

@item 
bpo-46752@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46752}: Add task groups to asyncio (structured concurrency, inspired by
Trio’s nurseries). This also introduces a change to task cancellation,
where a cancelled task can’t be cancelled again until it calls
.uncancel().

@item 
bpo-46724@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46724}: Fix @ref{3c,,dis} behavior on negative jump offsets.

@item 
bpo-46333@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46333}: The @code{__repr__()} method of @ref{1c1d,,typing.ForwardRef} now
includes the @code{module} parameter of @code{typing.ForwardRef} when it is
set.

@item 
bpo-46643@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46643}: In @ref{8c2,,typing.get_type_hints()}, support evaluating
stringified @code{ParamSpecArgs} and @code{ParamSpecKwargs} annotations. Patch
by Gregory Beauregard.

@item 
bpo-45863@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45863}: When the @ref{e4,,tarfile} module creates a pax format archive, it
will put an integer representation of timestamps in the ustar header (if
possible) for the benefit of older unarchivers, in addition to the
existing full-precision timestamps in the pax extended header.

@item 
bpo-46066@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46066}: Deprecate kwargs-based syntax for @ref{330,,typing.TypedDict}
definitions. It had confusing semantics when specifying totality, and was
largely unused. Patch by Jingchen Ye.

@item 
bpo-46676@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46676}: Make @ref{488,,typing.ParamSpec} args and kwargs equal to
themselves. Patch by Gregory Beauregard.

@item 
bpo-46323@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46323}: @code{ctypes.CFUNCTYPE()} and @code{ctypes.WINFUNCTYPE()} now fail to
create the type if its @code{_argtypes_} member contains too many arguments.
Previously, the error was only raised when calling a function. Patch by
Victor Stinner.

@item 
bpo-46672@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46672}: Fix @code{NameError} in @ref{814,,asyncio.gather()} when initial type
check fails.

@item 
bpo-46659@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46659}: The @ref{950,,calendar.LocaleTextCalendar} and
@ref{951,,calendar.LocaleHTMLCalendar} classes now use
@ref{932,,locale.getlocale()}, instead of using
@ref{930,,locale.getdefaultlocale()}, if no locale is specified. Patch by
Victor Stinner.

@item 
bpo-46659@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46659}: The @ref{930,,locale.getdefaultlocale()} function is deprecated and
will be removed in Python 3.13. Use @ref{931,,locale.setlocale()},
@ref{75d,,locale.getpreferredencoding(False)}
and @ref{932,,locale.getlocale()} functions instead.  Patch by Victor Stinner.

@item 
bpo-46655@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46655}: In @ref{8c2,,typing.get_type_hints()}, support evaluating bare
stringified @code{TypeAlias} annotations. Patch by Gregory Beauregard.

@item 
bpo-45948@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45948}: Fixed a discrepancy in the C implementation of the
@ref{12c,,xml.etree.ElementTree} module. Now, instantiating an
@ref{c4f,,xml.etree.ElementTree.XMLParser} with a @code{target=None} keyword
provides a default @ref{c50,,xml.etree.ElementTree.TreeBuilder} target as
the Python implementation does.

@item 
bpo-46626@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46626}: Expose Linux’s @code{IP_BIND_ADDRESS_NO_PORT} option in
@ref{d1,,socket}.

@item 
bpo-46521@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46521}: Fix a bug in the @ref{1d,,codeop} module that was incorrectly
identifying invalid code involving string quotes as valid code.

@item 
bpo-46571@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46571}: Improve @ref{8c5,,typing.no_type_check()}.

Now it does not modify external classes and functions. We also now
correctly mark classmethods as not to be type checked.

@item 
bpo-46400@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46400}: expat: Update libexpat from 2.4.1 to 2.4.4

@item 
bpo-46556@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46556}: Deprecate undocumented support for using a
@ref{268,,pathlib.Path} object as a context manager.

@item 
bpo-46534@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46534}: Implement 
@geindex Python Enhancement Proposals; PEP 673
PEP 673@footnote{https://peps.python.org/pep-0673/} @ref{7e4,,typing.Self}. Patch by James
Hilton-Balfe.

@item 
bpo-46522@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46522}: Make various module @code{__getattr__} AttributeErrors more
closely match a typical AttributeError

@item 
bpo-46475@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46475}: Add @ref{8b9,,typing.Never} and @ref{8b8,,typing.assert_never()}. Patch
by Jelle Zijlstra.

@item 
bpo-46333@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46333}: The @code{__eq__()} and @code{__hash__()} methods of
@ref{1c1d,,typing.ForwardRef} now honor the @code{module} parameter of
@code{typing.ForwardRef}. Forward references from different modules are
now differentiated.

@item 
bpo-46246@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46246}: Add missing @code{__slots__} to
@code{importlib.metadata.DeprecatedList}. Patch by Arie Bovenberg.

@item 
bpo-46232@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46232}: The @ref{d5,,ssl} module now handles certificates with bit strings
in DN correctly.

@item 
bpo-46195@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46195}: @ref{8c2,,typing.get_type_hints()} no longer adds @code{Optional} to
parameters with @code{None} as a default. This aligns to changes to PEP 484
in @indicateurl{https://github.com/python/peps/pull/689}

@item 
bpo-31369@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31369}: Add @ref{840,,RegexFlag} to @code{re.__all__} and documented it.
Add @code{NOFLAG} to indicate no flags being set.

@item 
bpo-45898@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45898}: @ref{2e,,ctypes} no longer defines @code{ffi_type_*} symbols in
@code{cfield.c}. The symbols have been provided by libffi for over a decade.

@item 
bpo-44953@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44953}: Calling @code{operator.itemgetter} objects and
@code{operator.attrgetter} objects is now faster due to use of the vectorcall
calling convention.

@item 
bpo-44289@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44289}: Fix an issue with @ref{1c1e,,is_tarfile()} method when using
`fileobj' argument: position in the `fileobj' was advanced forward which
made it unreadable with @ref{1c1f,,tarfile.TarFile.open()}.

@item 
bpo-44011@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44011}: Reimplement SSL/TLS support in asyncio, borrow the
implementation from uvloop library.

@item 
bpo-41086@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41086}: Make the @ref{4df,,configparser.ConfigParser} constructor raise
@ref{199,,TypeError} if the @code{interpolation} parameter is not of type
@code{configparser.Interpolation}

@item 
bpo-29418@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29418}: Implement @ref{85b,,inspect.ismethodwrapper()} and fix
@ref{1c20,,inspect.isroutine()} for cases where methodwrapper is given. Patch by
Hakan Çelik.

@item 
bpo-14156@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14156}: argparse.FileType now supports an argument of ‘-’ in binary
mode, returning the .buffer attribute of sys.stdin/sys.stdout as
appropriate. Modes including ‘x’ and ‘a’ are treated equivalently to ‘w’
when argument is ‘-’. Patch contributed by Josh Rosenberg
@end itemize

@node Documentation<34>,Tests<34>,Library<100>,Python 3 11 0 alpha 6
@anchor{whatsnew/changelog id461}@anchor{1c21}
@subsubsection Documentation



@itemize -

@item 
bpo-42238@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42238}: @code{Doc/tools/rstlint.py} has moved to its own repository and is
now packaged on PyPI as @code{sphinx-lint}.
@end itemize

@node Tests<34>,Build<40>,Documentation<34>,Python 3 11 0 alpha 6
@anchor{whatsnew/changelog id462}@anchor{1c22}
@subsubsection Tests



@itemize -

@item 
bpo-46913@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46913}: Fix test_faulthandler.test_sigfpe() if Python is built with
undefined behavior sanitizer (UBSAN): disable UBSAN on the
faulthandler_sigfpe() function. Patch by Victor Stinner.

@item 
bpo-46760@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46760}: Remove bytecode offsets from expected values in test.test_dis
module. Reduces the obstacles to modifying the VM or compiler.

@item 
bpo-46708@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46708}: Prevent default asyncio event loop policy modification warning
after @code{test_asyncio} execution.

@item 
bpo-46678@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46678}: The function @code{make_legacy_pyc} in
@code{Lib/test/support/import_helper.py} no longer fails when
@code{PYTHONPYCACHEPREFIX} is set to a directory on a different device from
where tempfiles are stored.

@item 
bpo-46623@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46623}: Skip test_pair() and test_speech128() of test_zlib on s390x
since they fail if zlib uses the s390x hardware accelerator. Patch by
Victor Stinner.
@end itemize

@node Build<40>,Windows<34>,Tests<34>,Python 3 11 0 alpha 6
@anchor{whatsnew/changelog id463}@anchor{1c23}
@subsubsection Build



@itemize -

@item 
bpo-46860@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46860}: Respect @code{--with-suffix} when building on case-insensitive
file systems.

@item 
bpo-46656@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46656}: Building Python now requires a C11 compiler. Optional C11
features are not required. Patch by Victor Stinner.

@item 
bpo-46656@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46656}: Building Python now requires support for floating-point
Not-a-Number (NaN): remove the @code{Py_NO_NAN} macro. Patch by Victor
Stinner.

@item 
bpo-46640@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46640}: Building Python now requires a C99 @code{<math.h>} header file
providing a @code{NAN} constant, or the @code{__builtin_nan()} built-in
function. Patch by Victor Stinner.

@item 
bpo-46608@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46608}: Exclude marshalled-frozen data if deep-freezing to save 300 KB
disk space. This includes adding a new @code{is_package} field to
@ref{97e,,_frozen}. Patch by Kumar Aditya.

@item 
bpo-40280@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40280}: Fix wasm32-emscripten test failures and platform issues. -
Disable syscalls that are not supported or don’t work, e.g.   wait,
getrusage, prlimit, mkfifo, mknod, setres[gu]id, setgroups. - Use fd_count
to count open fds. - Add more checks for subprocess and fork. - Add
workarounds for missing _multiprocessing and failing socket.accept(). -
Enable bzip2. - Disable large file support. - Disable signal.alarm.

@item 
bpo-46430@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46430}: Intern strings in deep-frozen modules. Patch by Kumar Aditya.
@end itemize

@node Windows<34>,IDLE<17>,Build<40>,Python 3 11 0 alpha 6
@anchor{whatsnew/changelog id464}@anchor{1c24}
@subsubsection Windows



@itemize -

@item 
bpo-46744@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46744}: The default all users install directory for ARM64 is now under
the native @code{Program Files} folder, rather than @code{Program Files (Arm)}
which is intended for ARM (32-bit) files.

@item 
bpo-46567@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46567}: Adds Tcl and Tk support for Windows ARM64. This also adds IDLE
to the installation.

@item 
bpo-46638@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46638}: Ensures registry virtualization is consistently disabled. For
3.10 and earlier, it remains enabled (some registry writes are protected),
while for 3.11 and later it is disabled (registry modifications affect all
applications).
@end itemize

@node IDLE<17>,C API<35>,Windows<34>,Python 3 11 0 alpha 6
@anchor{whatsnew/changelog id465}@anchor{1c25}
@subsubsection IDLE



@itemize -

@item 
bpo-46630@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46630}: Make query dialogs on Windows start with a cursor in the entry
box.

@item 
bpo-45447@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45447}: Apply IDLE syntax highlighting to @code{.pyi} files. Patch by Alex
Waygood and Terry Jan Reedy.
@end itemize

@node C API<35>,,IDLE<17>,Python 3 11 0 alpha 6
@anchor{whatsnew/changelog id466}@anchor{1c26}
@subsubsection C API



@itemize -

@item 
bpo-46748@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46748}: Python’s public headers no longer import @code{<stdbool.h>},
leaving code that embeds/extends Python free to define @code{bool}, @code{true}
and @code{false}.

@item 
bpo-46836@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46836}: Move the @ref{991,,PyFrameObject} type definition (@code{struct
_frame}) to the internal C API @code{pycore_frame.h} header file. Patch by
Victor Stinner.

@item 
bpo-45459@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45459}: Rename @code{Include/buffer.h} header file to
@code{Include/pybuffer.h} to avoid conflicts with projects having an existing
@code{buffer.h} header file. Patch by Victor Stinner.

@item 
bpo-45412@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45412}: Remove the @code{HAVE_PY_SET_53BIT_PRECISION} macro (moved to the
internal C API). Patch by Victor Stinner.

@item 
bpo-46613@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46613}: Added function @ref{635,,PyType_GetModuleByDef()}, which allows
access to module state when a method’s defining class is not available.
@end itemize

@node Python 3 11 0 alpha 5,Python 3 11 0 alpha 4,Python 3 11 0 alpha 6,Changelog
@anchor{whatsnew/changelog python-3-11-0-alpha-5}@anchor{1c27}
@subsection Python 3.11.0 alpha 5


`Release date: 2022-02-03'

@menu
* Core and Builtins: Core and Builtins<98>. 
* Library: Library<101>. 
* Core and Builtins: Core and Builtins<99>. 
* Library: Library<102>. 
* Build: Build<41>. 
* Core and Builtins: Core and Builtins<100>. 
* Library: Library<103>. 
* Documentation: Documentation<35>. 
* Tests: Tests<35>. 
* Build: Build<42>. 
* Windows: Windows<35>. 
* macOS: macOS<26>. 
* IDLE: IDLE<18>. 
* C API: C API<36>. 

@end menu

@node Core and Builtins<98>,Library<101>,,Python 3 11 0 alpha 5
@anchor{whatsnew/changelog id467}@anchor{1c28}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-45773@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45773}: Remove two invalid “peephole” optimizations from the bytecode
compiler.

@item 
bpo-46564@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46564}: Do not create frame objects when creating @ref{1a7,,super}
object. Patch by Kumar Aditya.

@item 
bpo-45885@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45885}: Added more fined-grained specialization failure stats regarding
the @code{COMPARE_OP} bytecode.

@item 
bpo-44977@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44977}: The delegation of @ref{19c,,int()} to @code{__trunc__()} is now
deprecated. Calling @code{int(a)} when @code{type(a)} implements
@code{__trunc__()} but not @code{__int__()} or @code{__index__()} now raises
a @ref{1a4,,DeprecationWarning}.

@item 
bpo-46458@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46458}: Reorder code emitted by the compiler for a
@ref{8fa,,try}-@ref{1ac,,except} block so that the @ref{17d,,else} block’s
code immediately follows the @code{try} body (without a jump). This is
more optimal for the happy path.

@item 
bpo-46527@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46527}: Allow passing @code{iterable} as a keyword argument to
@ref{168d,,enumerate()} again. Patch by Jelle Zijlstra.

@item 
bpo-46528@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46528}: Replace several stack manipulation instructions (@code{DUP_TOP},
@code{DUP_TOP_TWO}, @code{ROT_TWO}, @code{ROT_THREE}, @code{ROT_FOUR}, and @code{ROT_N})
with new @ref{919,,COPY} and @ref{91a,,SWAP} instructions.

@item 
bpo-46329@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46329}: Use two or three bytecodes to implement most calls.

Calls without named arguments are implemented as a sequence of two
instructions: @code{PRECALL; CALL}. Calls with named arguments are
implemented as a sequence of three instructions: @code{PRECALL; KW_NAMES;
CALL}. There are two different @code{PRECALL} instructions:
@code{PRECALL_FUNTION} and @code{PRECALL_METHOD}. The latter pairs with
@code{LOAD_METHOD}.

This partition into pre-call and call allows better specialization, and
thus better performance ultimately.

There is no change in semantics.

@item 
bpo-46503@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46503}: Fix an assert when parsing some invalid N escape sequences in
f-strings.

@item 
bpo-46431@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46431}: Improve error message on invalid calls to
@code{BaseExceptionGroup.__new__()}.

@item 
bpo-46476@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46476}: Fix memory leak in code objects generated by deepfreeze. Patch
by Kumar Aditya.

@item 
bpo-46481@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46481}: Speed up calls to @code{weakref.ref.__call__()} by using the
@geindex Python Enhancement Proposals; PEP 590
PEP 590@footnote{https://peps.python.org/pep-0590/} @code{vectorcall} calling convention. Patch by Donghee Na.

@item 
bpo-46417@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46417}: Fix a race condition on setting a type @code{__bases__} attribute:
the internal function @code{add_subclass()} now gets the
@code{PyTypeObject.tp_subclasses} member after calling
@ref{1c29,,PyWeakref_NewRef()} which can trigger a garbage collection which
can indirectly modify @code{PyTypeObject.tp_subclasses}. Patch by Victor
Stinner.

@item 
bpo-46417@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46417}: @code{python -X showrefcount} now shows the total reference count
after clearing and destroyed the main Python interpreter. Previously, it
was shown before. Patch by Victor Stinner.

@item 
bpo-43683@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43683}: Add ASYNC_GEN_WRAP opcode to wrap the value to be yielded in
async generators. Removes the need to special case async generators in the
@code{YIELD_VALUE} instruction.

@item 
bpo-46407@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46407}: Optimize some modulo operations in @code{Objects/longobject.c}.
Patch by Jeremiah Vivian.

@item 
bpo-46409@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46409}: Add new @code{RETURN_GENERATOR} bytecode to make generators.
Simplifies calling Python functions in the VM, as they no longer any need
to special case generator functions.

Also add @code{JUMP_NO_INTERRUPT} bytecode that acts like @code{JUMP_ABSOLUTE},
but does not check for interrupts.

@item 
bpo-46406@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46406}: The integer division @code{//} implementation has been optimized
to better let the compiler understand its constraints. It can be 20%
faster on the amd64 platform when dividing an int by a value smaller than
@code{2**30}.
@end itemize

@node Library<101>,Core and Builtins<99>,Core and Builtins<98>,Python 3 11 0 alpha 5
@anchor{whatsnew/changelog id468}@anchor{1c2a}
@subsubsection Library



@itemize -

@item 
bpo-46383@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46383}: Fix invalid signature of @code{_zoneinfo}’s @code{module_free}
function to resolve a crash on wasm32-emscripten platform.
@end itemize

@node Core and Builtins<99>,Library<102>,Library<101>,Python 3 11 0 alpha 5
@anchor{whatsnew/changelog id469}@anchor{1c2b}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-46361@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46361}: Ensure that “small” integers created by @ref{1c2c,,int.from_bytes()}
and @ref{200,,decimal.Decimal} are properly cached.

@item 
bpo-46161@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46161}: Fix the class building error when the arguments are constants
and CALL_FUNCTION_EX is used.

@item 
bpo-46028@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46028}: Fixes calculation of @code{sys._base_executable} when inside a
virtual environment that uses symlinks with different binary names than
the base environment provides.

@item 
bpo-46091@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46091}: Correctly calculate indentation levels for lines with
whitespace character that are ended by line continuation characters. Patch
by Pablo Galindo
@end itemize

@node Library<102>,Build<41>,Core and Builtins<99>,Python 3 11 0 alpha 5
@anchor{whatsnew/changelog id470}@anchor{1c2d}
@subsubsection Library



@itemize -

@item 
bpo-30512@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30512}: Add CAN Socket support for NetBSD.
@end itemize

@node Build<41>,Core and Builtins<100>,Library<102>,Python 3 11 0 alpha 5
@anchor{whatsnew/changelog id471}@anchor{1c2e}
@subsubsection Build



@itemize -

@item 
bpo-46045@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46045}: Do not use POSIX semaphores on NetBSD
@end itemize

@node Core and Builtins<100>,Library<103>,Build<41>,Python 3 11 0 alpha 5
@anchor{whatsnew/changelog id472}@anchor{1c2f}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-44024@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44024}: Improve the @ref{199,,TypeError} message for non-string second
arguments passed to the built-in functions @ref{dd0,,getattr()} and
@ref{6fa,,hasattr()}. Patch by Géry Ogam.
@end itemize

@node Library<103>,Documentation<35>,Core and Builtins<100>,Python 3 11 0 alpha 5
@anchor{whatsnew/changelog id473}@anchor{1c30}
@subsubsection Library



@itemize -

@item 
bpo-46624@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46624}: Restore support for non-integer arguments of
@ref{a71,,random.randrange()} and @ref{143b,,random.randint()}.

@item 
bpo-46591@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46591}: Make the IDLE doc URL on the About IDLE dialog clickable.

@item 
bpo-46565@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46565}: Remove loop variables that are leaking into modules’
namespaces.

@item 
bpo-46553@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46553}: In @ref{8c2,,typing.get_type_hints()}, support evaluating bare
stringified @code{ClassVar} annotations. Patch by Gregory Beauregard.

@item 
bpo-46544@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46544}: Don’t leak @code{x} & @code{uspace} intermediate vars in
@ref{11d3,,textwrap.TextWrapper}.

@item 
bpo-46487@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46487}: Add the @code{get_write_buffer_limits} method to
@code{asyncio.transports.WriteTransport} and to the SSL transport.

@item 
bpo-45173@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45173}: Note the configparser deprecations will be removed in Python
3.12.

@item 
bpo-45162@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45162}: The deprecated @ref{10d,,unittest} APIs removed in 3.11a1 have been
temporarily restored to be removed in 3.12 while cleanups in external
projects go in.

@item 
bpo-46539@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46539}: In @ref{8c2,,typing.get_type_hints()}, support evaluating
stringified @code{ClassVar} and @code{Final} annotations inside @code{Annotated}.
Patch by Gregory Beauregard.

@item 
bpo-46510@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46510}: Add missing test for @ref{cf0,,types.TracebackType} and
@ref{1c31,,types.FrameType}. Calculate them directly from the caught
exception without calling @ref{89c,,sys.exc_info()}.

@item 
bpo-46491@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46491}: Allow @ref{b3d,,typing.Annotated} to wrap @ref{56e,,typing.Final} and
@ref{56d,,typing.ClassVar}. Patch by Gregory Beauregard.

@item 
bpo-46483@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46483}: Remove @ref{948,,__class_getitem__()} from
@ref{6ce,,pathlib.PurePath} as this class was not supposed to be generic.

@item 
bpo-46436@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46436}: Fix command-line option @code{-d}/@code{--directory} in module
@ref{76,,http.server} which is ignored when combined with command-line option
@code{--cgi}. Patch by Géry Ogam.

@item 
bpo-41403@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41403}: Make @code{mock.patch()} raise a @ref{199,,TypeError} with a
relevant error message on invalid arg. Previously it allowed a cryptic
@ref{5f0,,AttributeError} to escape.

@item 
bpo-46474@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46474}: In @code{importlib.metadata.EntryPoint.pattern}, avoid potential
REDoS by limiting ambiguity in consecutive whitespace.

@item 
bpo-46474@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46474}: Removed private method from @code{importlib.metadata.Path}. Sync
with importlib_metadata 4.10.0.

@item 
bpo-46470@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46470}: Remove unused branch from @code{typing._remove_dups_flatten}

@item 
bpo-46469@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46469}: @ref{b,,asyncio} generic classes now return
@ref{9f2,,types.GenericAlias} in @code{__class_getitem__} instead of the same
class.

@item 
bpo-41906@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41906}: Support passing filter instances in the @code{filters} values of
@code{handlers} and @code{loggers} in the dictionary passed to
@ref{13bc,,logging.config.dictConfig()}.

@item 
bpo-46422@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46422}: Use @code{dis.Positions} in @code{dis.Instruction} instead of a
regular @code{tuple}.

@item 
bpo-46434@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46434}: @ref{aa,,pdb} now gracefully handles @code{help} when
@ref{1c32,,__doc__} is missing, for example when run with pregenerated
optimized @code{.pyc} files.

@item 
bpo-43869@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43869}: Python uses the same time Epoch on all platforms. Add an
explicit unit test to ensure that it’s the case. Patch by Victor Stinner.

@item 
bpo-46414@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46414}: Add @ref{8bb,,typing.reveal_type()}. Patch by Jelle Zijlstra.

@item 
bpo-40280@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40280}: @ref{dc,,subprocess} now imports Windows-specific imports when
@code{msvcrt} module is available, and POSIX-specific imports on all other
platforms. This gives a clean exception when @code{_posixsubprocess} is not
available (e.g. Emscripten browser target).

@item 
bpo-40066@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40066}: @code{IntEnum}, @code{IntFlag}, and @code{StrEnum} use the mixed-in type
for their @code{str()} and @code{format()} output.

@item 
bpo-46316@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46316}: Optimize @ref{270,,pathlib.Path.iterdir()} by removing an
unnecessary check for special entries.

@item 
bpo-29688@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29688}: Document @ref{1a6d,,pathlib.Path.absolute()} (which has always
existed).

@item 
bpo-43012@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43012}: The pathlib module’s obsolete and internal @code{_Accessor} class
has been removed to prepare the terrain for upcoming enhancements to the
module.

@item 
bpo-46258@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46258}: Speed up @ref{bfe,,math.isqrt()} for small positive integers by
replacing two division steps with a lookup table.

@item 
bpo-46242@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46242}: Improve error message when creating a new @ref{843,,enum.Enum}
type subclassing an existing @code{Enum} with @code{_member_names_} using
@code{enum.Enum.__call__()}.

@item 
bpo-43118@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43118}: Fix a bug in @ref{231,,inspect.signature()} that was causing it to
fail on some subclasses of classes with a @code{__text_signature__}
referencing module globals. Patch by Weipeng Hong.

@item 
bpo-26552@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26552}: Fixed case where failing @ref{e77,,asyncio.ensure_future()} did not
close the coroutine. Patch by Kumar Aditya.

@item 
bpo-21987@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21987}: Fix an issue with @ref{1c33,,tarfile.TarFile.getmember()} getting a
directory name with a trailing slash.

@item 
bpo-46124@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46124}: Update @ref{13b,,zoneinfo} to rely on importlib.resources
traversable API.

@item 
bpo-46103@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46103}: Now @ref{1c34,,inspect.getmembers()} only gets @code{__bases__}
attribute from class type. Patch by Weipeng Hong.

@item 
bpo-46080@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46080}: Fix exception in argparse help text generation if a
@ref{1c35,,argparse.BooleanOptionalAction} argument’s default is
@code{argparse.SUPPRESS} and it has @code{help} specified.  Patch by Felix
Fontein.

@item 
bpo-44791@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44791}: Fix substitution of @ref{488,,ParamSpec} in
@ref{9cd,,Concatenate} with different parameter expressions.
Substitution with a list of types returns now a tuple of types.
Substitution with @code{Concatenate} returns now a @code{Concatenate} with
concatenated lists of arguments.
@end itemize

@node Documentation<35>,Tests<35>,Library<103>,Python 3 11 0 alpha 5
@anchor{whatsnew/changelog id474}@anchor{1c36}
@subsubsection Documentation



@itemize -

@item 
bpo-46463@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46463}: Fixes @code{escape4chm.py} script used when building the CHM
documentation file
@end itemize

@node Tests<35>,Build<42>,Documentation<35>,Python 3 11 0 alpha 5
@anchor{whatsnew/changelog id475}@anchor{1c37}
@subsubsection Tests



@itemize -

@item 
bpo-43478@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43478}: Mocks can no longer be provided as the specs for other Mocks.
As a result, an already-mocked object cannot be passed to @code{mock.Mock()}.
This can uncover bugs in tests since these Mock-derived Mocks will always
pass certain tests (e.g. isinstance) and builtin assert functions (e.g.
assert_called_once_with) will unconditionally pass.

@item 
bpo-46616@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46616}: Ensures @code{test_importlib.test_windows} cleans up registry keys
after completion.

@item 
bpo-44359@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44359}: test_ftplib now silently ignores socket errors to prevent
logging unhandled threading exceptions. Patch by Victor Stinner.

@item 
bpo-46600@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46600}: Fix test_gdb.test_pycfunction() for Python built with @code{clang
-Og}. Tolerate inlined functions in the gdb traceback. Patch by Victor
Stinner.

@item 
bpo-46542@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46542}: Fix a Python crash in test_lib2to3 when using Python built in
debug mode: limit the recursion limit. Patch by Victor Stinner.

@item 
bpo-46576@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46576}: test_peg_generator now disables compiler optimization when
testing compilation of its own C extensions to significantly speed up the
testing on non-debug builds of CPython.

@item 
bpo-46542@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46542}: Fix @code{test_json} tests checking for @ref{f6e,,RecursionError}:
modify these tests to use @code{support.infinite_recursion()}. Patch by
Victor Stinner.

@item 
bpo-13886@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13886}: Skip test_builtin PTY tests on non-ASCII characters if the
readline module is loaded. The readline module changes input() behavior,
but test_builtin is not intended to test the readline module. Patch by
Victor Stinner.

@item 
bpo-40280@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40280}: Add @code{test.support.requires_fork()} decorators to mark tests
that require a working @ref{4b6,,os.fork()}.

@item 
bpo-40280@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40280}: Add @code{test.support.requires_subprocess()} decorator to mark
tests which require working @ref{dc,,subprocess} module or @code{os.spawn*}. The
wasm32-emscripten platform has no support for processes.

@item 
bpo-46126@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46126}: Disable ‘descriptions’ when running tests internally.
@end itemize

@node Build<42>,Windows<35>,Tests<35>,Python 3 11 0 alpha 5
@anchor{whatsnew/changelog id476}@anchor{1c38}
@subsubsection Build



@itemize -

@item 
bpo-46602@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46602}: Tidied up configure.ac so that conftest.c is truncated rather
than appended. This assists in the case where the ‘rm’ of conftest.c fails
to happen between tests.  Downstream issues such as a clobbered SOABI can
result.

@item 
bpo-46600@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46600}: Fix the test checking if the C compiler supports @code{-Og} option
in the @code{./configure} script to also use @code{-Og} on clang which supports
it. Patch by Victor Stinner.

@item 
bpo-38472@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38472}: Fix GCC detection in setup.py when cross-compiling. The C
compiler is now run with LC_ALL=C. Previously, the detection failed with a
German locale.

@item 
bpo-46513@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46513}: @code{configure} no longer uses @code{AC_C_CHAR_UNSIGNED}
macro and @code{pyconfig.h} no longer defines reserved symbol
@code{__CHAR_UNSIGNED__}.

@item 
bpo-46471@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46471}: Use global singletons for single byte bytes objects in
deepfreeze.

@item 
bpo-46443@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46443}: Deepfreeze now uses cached small integers as it saves some
space for common small integers.

@item 
bpo-46429@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46429}: Merge all deep-frozen files into one for space savings. Patch
by Kumar Aditya.

@item 
bpo-45569@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45569}: The build now defaults to using 30-bit digits for Python
integers. Previously either 15-bit or 30-bit digits would be selected,
depending on the platform. 15-bit digits may still be selected using the
@code{--enable-big-digits=15} option to the @code{configure} script, or by
defining @code{PYLONG_BITS_IN_DIGIT} in @code{pyconfig.h}.

@item 
bpo-45925@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45925}: Update Windows installer to use SQLite 3.37.2.

@item 
bpo-43112@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43112}: Detect musl libc as a separate SOABI (tagged as
@code{linux-musl}).
@end itemize

@node Windows<35>,macOS<26>,Build<42>,Python 3 11 0 alpha 5
@anchor{whatsnew/changelog id477}@anchor{1c39}
@subsubsection Windows



@itemize -

@item 
bpo-33125@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33125}: The traditional EXE/MSI based installer for Windows is now
available for ARM64

@item 
bpo-46362@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46362}: os.path.abspath(“C:CON”) is now fixed to return “\.CON”, not
the same path. The regression was true of all legacy DOS devices such as
COM1, LPT1, or NUL.

@item 
bpo-44934@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44934}: The installer now offers a command-line only option to add the
installation directory to the end of 
@geindex PATH
@geindex environment variable; PATH
@code{PATH} instead of at the
start.
@end itemize

@node macOS<26>,IDLE<18>,Windows<35>,Python 3 11 0 alpha 5
@anchor{whatsnew/changelog id478}@anchor{1c3a}
@subsubsection macOS



@itemize -

@item 
bpo-45925@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45925}: Update macOS installer to SQLite 3.37.2.
@end itemize

@node IDLE<18>,C API<36>,macOS<26>,Python 3 11 0 alpha 5
@anchor{whatsnew/changelog id479}@anchor{1c3b}
@subsubsection IDLE



@itemize -

@item 
bpo-45296@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45296}: Clarify close, quit, and exit in IDLE.  In the File menu,
‘Close’ and ‘Exit’ are now ‘Close Window’ (the current one) and ‘Exit’ is
now ‘Exit IDLE’ (by closing all windows).  In Shell, ‘quit()’ and ‘exit()’
mean ‘close Shell’. If there are no other windows, this also exits IDLE.
@end itemize

@node C API<36>,,IDLE<18>,Python 3 11 0 alpha 5
@anchor{whatsnew/changelog id480}@anchor{1c3c}
@subsubsection C API



@itemize -

@item 
bpo-40170@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40170}: Remove the @code{PyHeapType_GET_MEMBERS()} macro. It was exposed
in the public C API by mistake, it must only be used by Python internally.
Use the @code{PyTypeObject.tp_members} member instead. Patch by Victor
Stinner.

@item 
bpo-40170@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40170}: Move _Py_GetAllocatedBlocks() and _PyObject_DebugMallocStats()
private functions to the internal C API. Patch by Victor Stinner.

@item 
bpo-46433@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46433}: The internal function _PyType_GetModuleByDef now correctly
handles inheritance patterns involving static types.

@item 
bpo-45459@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45459}: @ref{961,,Py_buffer} and various @code{Py_buffer} related functions
are now part of the limited API and stable ABI.

@item 
bpo-14916@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14916}: Fixed bug in the tokenizer that prevented
@code{PyRun_InteractiveOne} from parsing from the provided FD.
@end itemize

@node Python 3 11 0 alpha 4,Python 3 11 0 alpha 3,Python 3 11 0 alpha 5,Changelog
@anchor{whatsnew/changelog python-3-11-0-alpha-4}@anchor{1c3d}
@subsection Python 3.11.0 alpha 4


`Release date: 2022-01-13'

@menu
* Core and Builtins: Core and Builtins<101>. 
* Library: Library<104>. 
* Core and Builtins: Core and Builtins<102>. 
* Library: Library<105>. 
* Core and Builtins: Core and Builtins<103>. 
* Library: Library<106>. 
* Core and Builtins: Core and Builtins<104>. 
* Library: Library<107>. 
* Documentation: Documentation<36>. 
* Tests: Tests<36>. 
* Build: Build<43>. 
* Windows: Windows<36>. 
* macOS: macOS<27>. 
* C API: C API<37>. 

@end menu

@node Core and Builtins<101>,Library<104>,,Python 3 11 0 alpha 4
@anchor{whatsnew/changelog id481}@anchor{1c3e}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-46070@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46070}: @ref{188e,,Py_EndInterpreter()} now explicitly untracks all objects
currently tracked by the GC. Previously, if an object was used later by
another interpreter, calling @ref{1711,,PyObject_GC_UnTrack()} on the object
crashed if the previous or the next object of the @code{PyGC_Head}
structure became a dangling pointer. Patch by Victor Stinner.

@item 
bpo-46347@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46347}: Fix memory leak in PyEval_EvalCodeEx.

@item 
bpo-46339@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46339}: Fix a crash in the parser when retrieving the error text for
multi-line f-strings expressions that do not start in the first line of
the string. Patch by Pablo Galindo

@item 
bpo-46331@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46331}: Do not set line number of instruction storing doc-string. Fixes
regression introduced in 3.11 alpha.

@item 
bpo-46314@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46314}: Remove spurious “call” event when creating a lambda function
that was accidentally introduced in 3.11a4.

@item 
bpo-46289@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46289}: ASDL declaration of @code{FormattedValue} has changed to reflect
@code{conversion} field is not optional.

@item 
bpo-46297@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46297}: Fixed an interpreter crash on bootup with multiple PythonPaths
set in the Windows registry. Patch by Derzsi Dániel.

@item 
bpo-46237@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46237}: Fix the line number of tokenizer errors inside f-strings. Patch
by Pablo Galindo.

@item 
bpo-46263@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46263}: We always expect the “use_frozen_modules” config to be set, now
that getpath.c was rewritten in pure Python and the logic improved.

@item 
bpo-46006@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46006}: Fix a regression when a type method like @code{__init__()} is
modified in a subinterpreter. Fix a regression in
@code{_PyUnicode_EqualToASCIIId()} and type @code{update_slot()}. Revert the
change which made the Unicode dictionary of interned strings compatible
with subinterpreters: the internal interned dictionary is shared again by
all interpreters. Patch by Victor Stinner.

@item 
bpo-45923@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45923}: Add RESUME opcode. This is a logical no-op. It is emitted by
the compiler anywhere a Python function can be entered. It is used by the
interpreter to perform tracing and optimizer checks.
@end itemize

@node Library<104>,Core and Builtins<102>,Core and Builtins<101>,Python 3 11 0 alpha 4
@anchor{whatsnew/changelog id482}@anchor{1c3f}
@subsubsection Library



@itemize -

@item 
bpo-46208@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46208}: Fix the regression of os.path.normpath(“A/../../B”) not
returning expected “../B” but “B”.
@end itemize

@node Core and Builtins<102>,Library<105>,Library<104>,Python 3 11 0 alpha 4
@anchor{whatsnew/changelog id483}@anchor{1c40}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-46240@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46240}: Correct the error message for unclosed parentheses when the
tokenizer doesn’t reach the end of the source when the error is reported.
Patch by Pablo Galindo

@item 
bpo-46009@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46009}: Remove the @code{GEN_START} opcode.

@item 
bpo-46235@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46235}: Certain sequence multiplication operations like @code{[0] * 1_000}
are now faster due to reference-counting optimizations. Patch by Dennis
Sweeney.

@item 
bpo-46221@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46221}: @code{PREP_RERAISE_STAR} no longer pushes @code{lasti} to the
stack.

@item 
bpo-46202@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46202}: Remove @code{POP_EXCEPT_AND_RERAISE} and replace it by an
equivalent sequence of other opcodes.
@end itemize

@node Library<105>,Core and Builtins<103>,Core and Builtins<102>,Python 3 11 0 alpha 4
@anchor{whatsnew/changelog id484}@anchor{1c41}
@subsubsection Library



@itemize -

@item 
bpo-46085@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46085}: Fix iterator cache mechanism of @code{OrderedDict}.
@end itemize

@node Core and Builtins<103>,Library<106>,Library<105>,Python 3 11 0 alpha 4
@anchor{whatsnew/changelog id485}@anchor{1c42}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-46055@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46055}: Speed up shifting operation involving integers less than
@ref{1c43,,PyLong_BASE}. Patch by Xinhang Xu.

@item 
bpo-46110@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46110}: Add a maximum recursion check to the PEG parser to avoid stack
overflow. Patch by Pablo Galindo

@item 
bpo-46107@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46107}: Fix bug where @code{ExceptionGroup.split()} and
@code{ExceptionGroup.subgroup()} did not copy the exception group’s
@code{__note__} field to the parts.

@item 
bpo-45711@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45711}: The interpreter state’s representation of handled exceptions
(a.k.a exc_info, or _PyErr_StackItem) now has only the @code{exc_value}
field, @code{exc_type} and @code{exc_traceback} have been removed as their
values can be derived from @code{exc_value}.

@item 
bpo-44525@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44525}: Replace the four call bytecode instructions which one pre-call
instruction and two call instructions.

Removes @code{CALL_FUNCTION}, @code{CALL_FUNCTION_KW}, @code{CALL_METHOD} and
@code{CALL_METHOD_KW}.

Adds @code{CALL_NO_KW} and @code{CALL_KW} call instructions, and
@code{PRECALL_METHOD} prefix for pairing with @code{LOAD_METHOD}.

@item 
bpo-46039@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46039}: Remove the @code{YIELD_FROM} instruction and replace it with the
@code{SEND} instruction which performs the same operation, but without the
loop.

@item 
bpo-45635@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45635}: The code called from @code{_PyErr_Display()} was refactored
to improve error handling. It now exits immediately upon an unrecoverable
error.

@item 
bpo-46054@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46054}: Fix parser error when parsing non-utf8 characters in source
files. Patch by Pablo Galindo.

@item 
bpo-46042@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46042}: Improve the location of the caret in @ref{18f,,SyntaxError}
exceptions emitted by the symbol table. Patch by Pablo Galindo.

@item 
bpo-46049@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46049}: Ensure @code{._pth} files work as intended on platforms other
than Windows.

@item 
bpo-46048@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46048}: Fixes parsing of @code{._pth} files on startup so that
single-character paths are correctly read.

@item 
bpo-37971@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37971}: Fix a bug where the line numbers given in a traceback when a
decorator application raised an exception were wrong.

@item 
bpo-46031@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46031}: Add @ref{1bc4,,POP_JUMP_IF_NOT_NONE} and
@ref{1bc3,,POP_JUMP_IF_NONE} opcodes to speed up conditional jumps.

@item 
bpo-45654@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45654}: Deepfreeze @ref{c3,,runpy}, patch by Kumar Aditya.

@item 
bpo-46025@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46025}: Fix a crash in the @ref{d,,atexit} module involving functions
that unregister themselves before raising exceptions. Patch by Pablo
Galindo.
@end itemize

@node Library<106>,Core and Builtins<104>,Core and Builtins<103>,Python 3 11 0 alpha 4
@anchor{whatsnew/changelog id486}@anchor{1c44}
@subsubsection Library



@itemize -

@item 
bpo-46000@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46000}: Improve compatibility of the @ref{2f,,curses} module with NetBSD
curses.
@end itemize

@node Core and Builtins<104>,Library<107>,Library<106>,Python 3 11 0 alpha 4
@anchor{whatsnew/changelog id487}@anchor{1c45}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-44525@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44525}: Specialize the CALL_FUNCTION instruction for calls to builtin
types with a single argument. Speeds up @code{range(x)}, @code{list(x)}, and
specifically @code{type(obj)}.

@item 
bpo-42918@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42918}: Fix bug where the built-in @ref{4b2,,compile()} function did not
always raise a @ref{18f,,SyntaxError} when passed multiple statements in
‘single’ mode. Patch by Weipeng Hong.

@item 
bpo-45953@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45953}: The main interpreter in _PyRuntimeState.interpreters is now
statically allocated (as part of _PyRuntime).  Likewise for the initial
thread state of each interpreter.  This means less allocation during
runtime init, as well as better memory locality for these key state
objects.

@item 
bpo-45292@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45292}: Complete the 
@geindex Python Enhancement Proposals; PEP 654
PEP 654@footnote{https://peps.python.org/pep-0654/} implementation: add @code{except*}.

@item 
bpo-43413@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43413}: Revert changes in @code{set.__init__}. Subclass of @ref{185,,set}
needs to define a @code{__init__()} method if it defines a @code{__new__()}
method with additional keyword parameters.

@item 
bpo-43931@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43931}: Added the @ref{37f,,Py_Version} constant which bears the same
value as @ref{380,,PY_VERSION_HEX}. Patch by Gabriele N. Tornetta.
@end itemize

@node Library<107>,Documentation<36>,Core and Builtins<104>,Python 3 11 0 alpha 4
@anchor{whatsnew/changelog id488}@anchor{1c46}
@subsubsection Library



@itemize -

@item 
bpo-46342@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46342}: The @code{@@typing.final} decorator now sets the @code{__final__}
attribute on the decorated object to allow runtime introspection. Patch by
Jelle Zijlstra.

@item 
bpo-46328@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46328}: Added the @ref{89d,,sys.exception()} method which returns the active
exception instance.

@item 
bpo-46307@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46307}: Add @ref{898,,string.Template.is_valid()} and
@ref{897,,string.Template.get_identifiers()} methods.

@item 
bpo-46306@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46306}: Assume that @ref{32d,,types.CodeType} always has
@code{types.CodeType.co_firstlineno} in @ref{3e,,doctest}.

@item 
bpo-40479@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40479}: Fix @ref{6c,,hashlib} `usedforsecurity' option to work correctly
with OpenSSL 3.0.0 in FIPS mode.

@item 
bpo-46070@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46070}: Fix possible segfault when importing the @ref{b,,asyncio} module
from different sub-interpreters in parallel. Patch by Erlend E. Aasland.

@item 
bpo-46244@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46244}: Removed @code{__slots__} from @ref{488,,typing.ParamSpec} and
@ref{487,,typing.TypeVar}. They served no purpose. Patch by Arie Bovenberg.

@item 
bpo-46278@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46278}: Reflect @code{context} argument in @code{AbstractEventLoop.call_*()}
methods. Loop implementations already support it.

@item 
bpo-46269@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46269}: Remove special-casing of @code{__new__} in
@ref{1c47,,enum.Enum.__dir__()}.

@item 
bpo-46266@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46266}: Improve day constants in @ref{15,,calendar}.

Now all constants (@code{MONDAY} … @code{SUNDAY}) are documented, tested, and
added to @code{__all__}.

@item 
bpo-46257@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46257}: Optimized the mean, variance, and stdev functions in the
statistics module. If the input is an iterator, it is consumed in a single
pass rather than eating memory by conversion to a list.  The single pass
algorithm is about twice as fast as the previous two pass code.

@item 
bpo-41011@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41011}: Added two new variables to `pyvenv.cfg' which is generated by
@ref{118,,venv} module: `executable' for the executable and `command' for the
command line used to create the environment.

@item 
bpo-46239@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46239}: Improve error message when importing
@code{asyncio.windows_events} on non-Windows.

@item 
bpo-46238@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46238}: Reuse @code{_winapi} constants in @code{asyncio.windows_events}.

@item 
bpo-46222@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46222}: Adding @code{SF_NOCACHE} sendfile constant for FreeBSD for the
posixmodule.

@item 
bpo-37295@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37295}: Add fast path for @code{0 <= k <= n <= 67} for @ref{8e1,,math.comb()}.

@item 
bpo-46176@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46176}: Adding the @code{MAP_STACK} constant for the mmap module.

@item 
bpo-43424@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43424}: Deprecate @code{webbrowser.MacOSXOSAScript._name} and use
@code{name} instead.

@item 
bpo-45321@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45321}: Added missing error codes to module
@code{xml.parsers.expat.errors}.

@item 
bpo-46125@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46125}: Refactor tests to test traversable API directly. Includes
changes from importlib 5.4.0.

@item 
bpo-46118@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46118}: Moved importlib.resources and its related functionality to a
package.

@item 
bpo-37578@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37578}: Add `include_hidden' parameter to @ref{5a0,,glob()} and
@ref{a0e,,iglob()} to match hidden files and directories when using
special characters like @code{*}, @code{**}, @code{?} and @code{[]}.

@item 
bpo-20369@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20369}: @ref{1c48,,concurrent.futures.wait()} no longer blocks forever when
given duplicate Futures. Patch by Kumar Aditya.

@item 
bpo-46105@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46105}: Honor spec when generating requirement specs with urls and
extras (importlib_metadata 4.8.3).

@item 
bpo-44893@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44893}: EntryPoint objects are no longer tuples. Recommended means to
access is by attribute (‘.name’, ‘.group’) or accessor (‘.load()’). Access
by index is deprecated and will raise deprecation warning.

@item 
bpo-22815@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22815}: Print unexpected successes together with failures and errors in
summary in @ref{755,,unittest.TextTestResult}.

@item 
bpo-22047@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22047}: Calling @code{add_argument_group()} on an argument group is
deprecated. Calling @code{add_argument_group()} or
@code{add_mutually_exclusive_group()} on a mutually exclusive group is
deprecated.

These features were never supported and do not always work correctly. The
functions exist on the API by accident through inheritance and will be
removed in the future.

@item 
bpo-26952@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26952}: @ref{7,,argparse} raises @ref{2ee,,ValueError} with clear message
when trying to render usage for an empty mutually exclusive group.
Previously it raised a cryptic @ref{1741,,IndexError}.

@item 
bpo-45615@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45615}: Functions in the @ref{105,,traceback} module raise @ref{199,,TypeError}
rather than @ref{5f0,,AttributeError} when an exception argument is not of
type @ref{7d8,,BaseException}.

@item 
bpo-16594@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16594}: Add allow allow_reuse_port flag in socketserver.

@item 
bpo-27718@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27718}: Fix help for the @ref{cb,,signal} module. Some functions (e.g.
@code{signal()} and @code{getsignal()}) were omitted.

@item 
bpo-46032@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46032}: The @code{registry()} method of @ref{84c,,functools.singledispatch()}
functions checks now the first argument or the first parameter annotation
and raises a TypeError if it is not supported. Previously unsupported
“types” were ignored (e.g. @code{typing.List[int]}) or caused an error at
calling time (e.g. @code{list[int]}).

@item 
bpo-46014@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46014}: Add ability to use @code{typing.Union} and @code{types.UnionType} as
dispatch argument to @code{functools.singledispatch}. Patch provided by Yurii
Karabas.

@item 
bpo-27062@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27062}: Add @code{__all__} to @ref{82,,inspect}, patch by Kumar Aditya.

@item 
bpo-46018@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46018}: Ensure that @ref{13f8,,math.expm1()} does not raise on underflow.

@item 
bpo-46016@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46016}: Adding @code{F_DUP2FD} and @code{F_DUP2FD_CLOEXEC}
constants from FreeBSD into the @ref{5d,,fcntl} module.

@item 
bpo-45755@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45755}: @ref{10b,,typing} generic aliases now reveal the class attributes
of the original generic class when passed to @code{dir()}. This was the
behavior up to Python 3.6, but was changed in 3.7-3.9.

@item 
bpo-45874@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45874}: The empty query string, consisting of no query arguments, is
now handled correctly in @code{urllib.parse.parse_qsl}. This caused problems
before when strict parsing was enabled.

@item 
bpo-44674@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44674}: Change how dataclasses disallows mutable default values.  It
used to use a list of known types (list, dict, set).  Now it disallows
unhashable objects to be defaults.  It’s using unhashability as a proxy
for mutability.  Patch by Eric V. Smith, idea by Raymond Hettinger.

@item 
bpo-23882@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23882}: Remove namespace package (PEP 420) support from unittest
discovery. It was introduced in Python 3.4 but has been broken since
Python 3.7.

@item 
bpo-25066@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25066}: Added a @code{__repr__()} method to
@ref{1c49,,multiprocessing.Event} objects, patch by Kumar Aditya.

@item 
bpo-45643@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45643}: Added @ref{1c4a,,signal.SIGSTKFLT} on platforms where this signal
is defined.

@item 
bpo-44092@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44092}: Fetch across rollback no longer raises
@ref{88f,,InterfaceError}. Instead we leave it to the SQLite library
to handle these cases. Patch by Erlend E. Aasland.

@item 
bpo-42413@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42413}: Replace @code{concurrent.futures.TimeoutError} and
@code{asyncio.TimeoutError} with builtin @ref{a3c,,TimeoutError}, keep these
names as deprecated aliases.
@end itemize

@node Documentation<36>,Tests<36>,Library<107>,Python 3 11 0 alpha 4
@anchor{whatsnew/changelog id489}@anchor{1c4b}
@subsubsection Documentation



@itemize -

@item 
bpo-46196@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46196}: Document method @ref{1c4c,,cmd.Cmd.columnize()}.

@item 
bpo-46120@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46120}: State that @code{|} is preferred for readability over @code{Union} in
the @ref{10b,,typing} docs.

@item 
bpo-46109@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46109}: Extracted @code{importlib.resources} and
@code{importlib.resources.abc} documentation into separate files.

@item 
bpo-19737@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19737}: Update the documentation for the @ref{1c4d,,globals()} function.
@end itemize

@node Tests<36>,Build<43>,Documentation<36>,Python 3 11 0 alpha 4
@anchor{whatsnew/changelog id490}@anchor{1c4e}
@subsubsection Tests



@itemize -

@item 
bpo-46296@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46296}: Add a test case for @ref{5a,,enum} with @code{_use_args_ == True} and
@code{_member_type_ == object}.

@item 
bpo-46205@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46205}: Fix hang in runtest_mp due to race condition

@item 
bpo-46263@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46263}: Fix test_capi on FreeBSD 14-dev: instruct jemalloc to not fill
freed memory with junk byte.

@item 
bpo-46262@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46262}: Cover @code{ValueError} path in tests for
@code{enum.Flag._missing_()}.

@item 
bpo-46150@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46150}: Now @code{fakename} in
@code{test_pathlib.PosixPathTest.test_expanduser} is checked to be
non-existent.

@item 
bpo-46129@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46129}: Rewrite @code{asyncio.locks} tests with
@ref{35f,,unittest.IsolatedAsyncioTestCase} usage.

@item 
bpo-23819@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23819}: Fixed @ref{b,,asyncio} tests in python optimized mode. Patch by
Kumar Aditya.

@item 
bpo-46114@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46114}: Fix test case for OpenSSL 3.0.1 version. OpenSSL 3.0 uses
@code{0xMNN00PP0L}.
@end itemize

@node Build<43>,Windows<36>,Tests<36>,Python 3 11 0 alpha 4
@anchor{whatsnew/changelog id491}@anchor{1c4f}
@subsubsection Build



@itemize -

@item 
bpo-44133@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44133}: When Python is configured with
@ref{a94,,--without-static-libpython}, the Python static library
(libpython.a) is no longer built. Patch by Victor Stinner.

@item 
bpo-44133@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44133}: When Python is built without @ref{a69,,--enable-shared}, the
@code{python} program is now linked to object files, rather than being linked
to the Python static library (libpython.a), to make sure that all symbols
are exported. Previously, the linker omitted some symbols like the
@code{Py_FrozenMain()} function. Patch by Victor Stinner.

@item 
bpo-40280@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40280}: The @code{configure} script has a new option
@code{--with-emscripten-target} to select browser or node as Emscripten build
target.

@item 
bpo-46315@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46315}: Added and fixed @code{#ifdef HAVE_FEATURE} checks for
functionality that is not available on WASI platform.

@item 
bpo-45723@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45723}: Fixed a regression in @code{configure} check for
@ref{119a,,select.epoll()}.

@item 
bpo-46263@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46263}: @code{configure} no longer sets @code{MULTIARCH} on FreeBSD
platforms.

@item 
bpo-46106@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46106}: Updated OpenSSL to 1.1.1m in Windows builds, macOS installer
builds, and CI. Patch by Kumar Aditya.

@item 
bpo-46088@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46088}: Automatically detect or install bootstrap Python runtime when
building from Visual Studio.

@item 
bpo-46072@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46072}: Add a –with-pystats configure option to turn on internal
statistics gathering.

@item 
bpo-40280@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40280}: A new directory @code{Tools/wasm} contains WebAssembly-related
helpers like @code{config.site} override for wasm32-emscripten, wasm assets
generator to bundle the stdlib, and a README.

@item 
bpo-46023@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46023}: @code{makesetup} no longer builds extensions that have been
marked as `disabled'. This allows users to disable modules in
@code{Modules/Setup.local}.

@item 
bpo-45949@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45949}: Use pure Python @code{freeze_module} for all but importlib
bootstrap files. @code{--with-freeze-module} @code{configure} option is
no longer needed for cross builds.
@end itemize

@node Windows<36>,macOS<27>,Build<43>,Python 3 11 0 alpha 4
@anchor{whatsnew/changelog id492}@anchor{1c50}
@subsubsection Windows



@itemize -

@item 
bpo-46217@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46217}: Removed parameter that is unsupported on Windows 8.1 and early
Windows 10 and may have caused build or runtime failures.
@end itemize

@node macOS<27>,C API<37>,Windows<36>,Python 3 11 0 alpha 4
@anchor{whatsnew/changelog id493}@anchor{1c51}
@subsubsection macOS



@itemize -

@item 
bpo-40477@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40477}: The Python Launcher app for macOS now properly launches scripts
and, if necessary, the Terminal app when running on recent macOS releases.
@end itemize

@node C API<37>,,macOS<27>,Python 3 11 0 alpha 4
@anchor{whatsnew/changelog id494}@anchor{1c52}
@subsubsection C API



@itemize -

@item 
bpo-46236@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46236}: Fix a bug in @ref{1b7b,,PyFunction_GetAnnotations()} that caused it
to return a @code{tuple} instead of a @code{dict}.

@item 
bpo-46140@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46140}: @ref{962,,PyBuffer_GetPointer()},
@ref{965,,PyBuffer_FromContiguous()}, @ref{964,,PyBuffer_ToContiguous()} and
@ref{96a,,PyMemoryView_FromBuffer()} now take buffer info by @code{const
Py_buffer *} instead of @code{Py_buffer *}, as they do not need mutability.
@code{PyBuffer_FromContiguous()} also now takes the source buffer as
@code{const void *}, and similarly @code{PyBuffer_GetPointer()} takes the
strides as @code{const Py_ssize_t *}.

@item 
bpo-45855@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45855}: Document that the `no_block' argument to
@ref{1c53,,PyCapsule_Import()} is a no-op now.

@item 
bpo-45855@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45855}: Replaced deprecated usage of
@ref{3d9,,PyImport_ImportModuleNoBlock()} with
@ref{3da,,PyImport_ImportModule()} in stdlib modules. Patch by Kumar Aditya.

@item 
bpo-46007@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46007}: The @code{PyUnicode_CHECK_INTERNED()} macro has been excluded
from the limited C API. It was never usable there, because it used
internal structures which are not available in the limited C API. Patch by
Victor Stinner.
@end itemize

@node Python 3 11 0 alpha 3,Python 3 11 0 alpha 2,Python 3 11 0 alpha 4,Changelog
@anchor{whatsnew/changelog python-3-11-0-alpha-3}@anchor{1c54}
@subsection Python 3.11.0 alpha 3


`Release date: 2021-12-08'

@menu
* Core and Builtins: Core and Builtins<105>. 
* Library: Library<108>. 
* Core and Builtins: Core and Builtins<106>. 
* Library: Library<109>. 
* Documentation: Documentation<37>. 
* Tests: Tests<37>. 
* Build: Build<44>. 
* Windows: Windows<37>. 
* macOS: macOS<28>. 
* C API: C API<38>. 

@end menu

@node Core and Builtins<105>,Library<108>,,Python 3 11 0 alpha 3
@anchor{whatsnew/changelog id495}@anchor{1c55}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-46009@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46009}: Restore behavior from 3.9 and earlier when sending non-None to
newly started generator. In 3.9 this did not affect the state of the
generator. In 3.10.0 and 3.10.1 @code{gen_func().send(0)} is equivalent to
@code{gen_func().throw(TypeError(...)} which exhausts the generator. In
3.10.2 onward, the behavior has been reverted to that of 3.9.

@item 
bpo-46004@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46004}: Fix the @ref{18f,,SyntaxError} location for errors involving for
loops with invalid targets. Patch by Pablo Galindo

@item 
bpo-45711@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45711}: @code{_PyErr_ChainStackItem()} no longer normalizes
@code{exc_info} (including setting the traceback on the exception instance)
because @code{exc_info} is always normalized.

@item 
bpo-45607@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45607}: The @code{__note__} field was added to @ref{7d8,,BaseException}. It is
@code{None} by default but can be set to a string which is added to the
exception’s traceback.

@item 
bpo-45947@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45947}: Place pointers to dict and values immediately before GC header.
This reduces number of dependent memory loads to access either dict or
values from 3 to 1.

@item 
bpo-45915@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45915}: @code{is_valid_fd} now uses faster @code{fcntl(fd, F_GETFD)} on
Linux, macOS, and Windows.

@item 
bpo-44530@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44530}: Reverts a change to the @code{code.__new__} @ref{1c56,,audit event} from an earlier prerelease.

@item 
bpo-42268@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42268}: Fail the configure step if the selected compiler doesn’t
support memory sanitizer. Patch by Pablo Galindo

@item 
bpo-45711@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45711}: The three values of @code{exc_info} are now always consistent with
each other. In particular, the @code{type} and @code{traceback} fields are now
derived from the exception instance. This impacts the return values of
@ref{89c,,sys.exc_info()} and @ref{97b,,PyErr_GetExcInfo()} if the exception
instance is modified while the exception is handled, as well as
@ref{97a,,PyErr_SetExcInfo()}, which now ignores the @code{type} and
@code{traceback} arguments provided to it.

@item 
bpo-45727@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45727}: Refine the custom syntax error that suggests that a comma may
be missing to trigger only when the expressions are detected between
parentheses or brackets. Patch by Pablo Galindo

@item 
bpo-45885@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45885}: Specialized the @code{COMPARE_OP} opcode using the PEP 659
machinery.

@item 
bpo-45786@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45786}: Allocate space for the interpreter frame in the frame object,
to avoid an additional allocation when the frame object outlives the frame
activation.
@end itemize

@node Library<108>,Core and Builtins<106>,Core and Builtins<105>,Python 3 11 0 alpha 3
@anchor{whatsnew/changelog id496}@anchor{1c57}
@subsubsection Library



@itemize -

@item 
bpo-45614@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45614}: Fix @ref{105,,traceback} display for exceptions with invalid module
name.
@end itemize

@node Core and Builtins<106>,Library<109>,Library<108>,Python 3 11 0 alpha 3
@anchor{whatsnew/changelog id497}@anchor{1c58}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-45813@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45813}: Fix crash when calling coro.cr_frame.clear() after coroutine
has been freed.

@item 
bpo-45811@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45811}: Improve the tokenizer errors when encountering invisible
control characters in the parser. Patch by Pablo Galindo

@item 
bpo-45848@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45848}: Allow the parser to obtain error lines directly from encoded
files. Patch by Pablo Galindo

@item 
bpo-45709@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45709}: Restore behavior from 3.10 when tracing an exception raised
within a with statement.

@item 
bpo-44525@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44525}: Adds new @ref{90f,,COPY_FREE_VARS} opcode, to make copying of
free variables from function to frame explicit. Helps optimization of
calls to Python function.

@item 
bpo-45829@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45829}: Specialize @code{BINARY_SUBSCR} for classes with a
@code{__getitem__} method implemented in Python

@item 
bpo-45826@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45826}: Fixed a crash when calling @code{.with_traceback(None)} on
@code{NameError}. This occurs internally in
@code{unittest.TestCase.assertRaises()}.

@item 
bpo-45822@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45822}: Fixed a bug in the parser that was causing it to not respect
@geindex Python Enhancement Proposals; PEP 263
PEP 263@footnote{https://peps.python.org/pep-0263/} coding cookies when no flags are provided. Patch by Pablo
Galindo

@item 
bpo-45820@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45820}: Fix a segfault when the parser fails without reading any input.
Patch by Pablo Galindo

@item 
bpo-45636@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45636}: Simplify the implementation of @ref{364,,BINARY_OP} by indexing
into an array of function pointers (rather than switching on the oparg).

@item 
bpo-42540@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42540}: Fix crash when @ref{4b6,,os.fork()} is called with an active
non-default memory allocator.

@item 
bpo-45738@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45738}: Fix computation of error location for invalid continuation
characters in the parser. Patch by Pablo Galindo.

@item 
bpo-45636@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45636}: Remove an existing “fast path” for old-style string formatting,
since it no longer appears to have any measurable impact.

@item 
bpo-45753@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45753}: Make recursion checks a bit more efficient by tracking amount
of calls left before overflow.

@item 
bpo-45773@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45773}: Fix a compiler hang when attempting to optimize certain jump
patterns.

@item 
bpo-45764@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45764}: The parser now gives a better error message when leaving out
the opening parenthesis @code{(} after a @code{def}-statement:

@example
>>> def f:
  File "<stdin>", line 1
    def f:
         ^
SyntaxError: expected '('
@end example

@item 
bpo-45609@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45609}: Specialized the @code{STORE_SUBSCR} opcode using the PEP 659
machinery.

@item 
bpo-45636@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45636}: Replace all numeric @code{BINARY_*} and @code{INPLACE_*} instructions
with a single @ref{364,,BINARY_OP} implementation.

@item 
bpo-45582@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45582}: Path calculation (known as @code{getpath}) has been reimplemented
as a frozen Python module. This should have no visible impact, but may
affect calculation of all paths referenced in @ref{df,,sys} and
@ref{e1,,sysconfig}.

@item 
bpo-45450@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45450}: Improve the syntax error message for parenthesized arguments.
Patch by Pablo Galindo.
@end itemize

@node Library<109>,Documentation<37>,Core and Builtins<106>,Python 3 11 0 alpha 3
@anchor{whatsnew/changelog id498}@anchor{1c59}
@subsubsection Library



@itemize -

@item 
bpo-27946@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27946}: Fix possible crash when getting an attribute of
@ref{361,,xml.etree.ElementTree.Element} simultaneously with replacing the
@code{attrib} dict.

@item 
bpo-45711@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45711}: Make @ref{b,,asyncio} normalize exceptions as soon as they are
captured with @ref{426,,PyErr_Fetch()}, and before they are stored as an
exc_info triplet. This brings @code{asyncio} in line with the rest of the
codebase, where an exc_info triplet is always normalized.

@item 
bpo-23819@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23819}: Replaced asserts with exceptions in asyncio, patch by Kumar
Aditya.

@item 
bpo-13236@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13236}: @ref{755,,unittest.TextTestResult} and
@ref{1afd,,unittest.TextTestRunner} flush now the output stream more often.

@item 
bpo-45917@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45917}: Added @ref{872,,math.exp2()}:, which returns 2 raised to the power
of x.

@item 
bpo-37658@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37658}: Fix issue when on certain conditions @code{asyncio.wait_for()} may
allow a coroutine to complete successfully, but fail to return the result,
potentially causing memory leaks or other issues.

@item 
bpo-45876@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45876}: Improve the accuracy of stdev() and pstdev() in the statistics
module.  When the inputs are floats or fractions, the output is a
correctly rounded float

@item 
bpo-44649@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44649}: Handle dataclass(slots=True) with a field that has default a
default value, but for which init=False.

@item 
bpo-45803@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45803}: Added missing kw_only parameter to
dataclasses.make_dataclass().

@item 
bpo-45837@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45837}: The @code{turtle.RawTurtle.settiltangle()} is deprecated since
Python 3.1, it now emits a deprecation warning and will be removed in
Python 3.13.

Use @code{turtle.RawTurtle.tiltangle()} instead.

@code{turtle.RawTurtle.tiltangle()} was earlier incorrectly marked as
deprecated, its docstring has been corrected.

Patch by Hugo van Kemenade.

@item 
bpo-45831@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45831}: @ref{5c,,faulthandler} can now write ASCII-only strings (like
filenames and function names) with a single write() syscall when dumping a
traceback. It reduces the risk of getting an unreadable dump when two
threads or two processes dump a traceback to the same file (like stderr)
at the same time. Patch by Victor Stinner.

@item 
bpo-45828@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45828}: @code{sqlite} C callbacks now use unraisable exceptions if
callback tracebacks are enabled. Patch by Erlend E. Aasland.

@item 
bpo-41735@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41735}: Fix thread lock in @code{zlib.Decompress.flush()} method before
@code{PyObject_GetBuffer}.

@item 
bpo-45235@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45235}: Reverted an argparse bugfix that caused regression in the
handling of default arguments for subparsers.  This prevented leaf level
arguments from taking precedence over root level arguments.

@item 
bpo-45754@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45754}: Fix a regression in Python 3.11a1 and 3.11a2 where
@ref{d4,,sqlite3} incorrectly would use @code{SQLITE_LIMIT_LENGTH} when checking
SQL statement lengths. Now, @code{SQLITE_LIMIT_SQL_LENGTH} is used. Patch by
Erlend E. Aasland.

@item 
bpo-45766@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45766}: Added `proportional' option to
@ref{a38,,statistics.linear_regression()}.

@item 
bpo-45765@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45765}: In importlib.metadata, fix distribution discovery for an empty
path.

@item 
bpo-45757@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45757}: Fix bug where @ref{3c,,dis} produced an incorrect oparg when
@ref{1b62,,EXTENDED_ARG} is followed by an opcode that does not use its
argument.

@item 
bpo-45644@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45644}: In-place JSON file formatting using @code{python3 -m json.tool
infile infile} now works correctly, previously it left the file empty.
Patch by Chris Wesseling.

@item 
bpo-45703@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45703}: When a namespace package is imported before another module from
the same namespace is created/installed in a different @ref{3e2,,sys.path}
location while the program is running, calling the
@ref{e10,,importlib.invalidate_caches()} function will now also guarantee the
new module is noticed.

@item 
bpo-45535@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45535}: Improve output of @code{dir()} with Enums.

@item 
bpo-45664@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45664}: Fix @ref{d9b,,types.resolve_bases()} and @ref{136d,,types.new_class()} for
@ref{9f2,,types.GenericAlias} instance as a base.

@item 
bpo-45663@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45663}: Fix @ref{1c5a,,dataclasses.is_dataclass()} for dataclasses which are
subclasses of @ref{9f2,,types.GenericAlias}.

@item 
bpo-45662@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45662}: Fix the repr of @ref{1bf7,,dataclasses.InitVar} with a type alias
to the built-in class, e.g. @code{InitVar[list[int]]}.

@item 
bpo-43137@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43137}: Launch GNOME web browsers via gio tool instead of obsolete
gvfs-open

@item 
bpo-45429@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45429}: On Windows, @ref{8ae,,time.sleep()} now uses a waitable timer which
supports high-resolution timers. Patch by Donghee Na and Eryk Sun.

@item 
bpo-37295@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37295}: Optimize @ref{8e1,,math.comb()} and @ref{8e2,,math.perm()}.

@item 
bpo-45514@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45514}: Deprecated legacy functions in @ref{7f,,importlib.resources}.

@item 
bpo-45507@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45507}: Add tests for truncated/missing trailers in gzip.decompress
implementation.

@item 
bpo-45359@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45359}: Implement 
@geindex Python Enhancement Proposals; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} for @ref{ae4,,graphlib.TopologicalSorter}.

@item 
bpo-44733@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44733}: Add @code{max_tasks_per_child} to
@ref{1d8,,concurrent.futures.ProcessPoolExecutor}. This allows users to
specify the maximum number of tasks a single process should execute before
the process needs to be restarted.

@item 
bpo-28806@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28806}: Improve netrc library. netrc file no longer needs to contain
all tokens. And if the login name is anonymous, security check is no
longer need.

@item 
bpo-43498@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43498}: Avoid a possible `“RuntimeError: dictionary changed size during
iteration”' when adjusting the process count of
@code{ProcessPoolExecutor}.

@item 
bpo-42158@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42158}: Add MIME types for N-quads, N-triples, Notation3 and TriG to
@code{mimetypes}.

@item 
bpo-30533@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30533}: Add @ref{85a,,inspect.getmembers_static()} , it return all members
without triggering dynamic lookup via the descriptor protocol. Patch by
Weipeng Hong.
@end itemize

@node Documentation<37>,Tests<37>,Library<109>,Python 3 11 0 alpha 3
@anchor{whatsnew/changelog id499}@anchor{1c5b}
@subsubsection Documentation



@itemize -

@item 
bpo-42238@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42238}: @code{make -C Doc suspicious} will be removed soon in favor of
@code{make -C Doc check}, mark it as deprecated.

@item 
bpo-45840@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45840}: Improve cross-references in the documentation for the data
model.

@item 
bpo-45640@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45640}: Properly marked-up grammar tokens in the documentation are now
clickable and take you to the definition of a given piece of grammar.
Patch by Arthur Milchior.

@item 
bpo-45788@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45788}: Link doc for sys.prefix to sysconfig doc on installation paths.

@item 
bpo-45772@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45772}: @code{socket.socket} documentation is corrected to a class from a
function.

@item 
bpo-45392@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45392}: Update the docstring of the @ref{f4a,,type} built-in to remove a
redundant line and to mention keyword arguments for the constructor.

@item 
bpo-45250@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45250}: Update the documentation to note that CPython does not
consistently require iterators to define @code{__iter__}.

@item 
bpo-25381@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25381}: In the extending chapter of the extending doc, update a
paragraph about the global variables containing exception information.

@item 
bpo-43905@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43905}: Expanded @ref{1ae4,,astuple()} and
@ref{1adb,,asdict()} docs, warning about deepcopy being applied and
providing a workaround.
@end itemize

@node Tests<37>,Build<44>,Documentation<37>,Python 3 11 0 alpha 3
@anchor{whatsnew/changelog id500}@anchor{1c5c}
@subsubsection Tests



@itemize -

@item 
bpo-45695@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45695}: Out-of-tree builds with a read-only source directory are now
tested by CI.

@item 
bpo-19460@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19460}: Add new Test for
@code{Lib/email/mime/nonmultipart.py::MIMENonMultipart}.

@item 
bpo-45835@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45835}: Fix race condition in test_queue tests with multiple “feeder”
threads.

@item 
bpo-45783@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45783}: The test for the freeze tool now handles file moves and
deletions.

@item 
bpo-45745@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45745}: Remove the @code{--findleaks} command line option of regrtest: use
the @code{--fail-env-changed} option instead. Since Python 3.7, it was a
deprecated alias to the @code{--fail-env-changed} option.

@item 
bpo-45701@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45701}: Add tests with @code{tuple} type with @ref{be8,,functools.lru_cache()}
to @code{test_functools}.
@end itemize

@node Build<44>,Windows<37>,Tests<37>,Python 3 11 0 alpha 3
@anchor{whatsnew/changelog id501}@anchor{1c5d}
@subsubsection Build



@itemize -

@item 
bpo-44035@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44035}: CI now verifies that autoconf files have been regenerated with
a current and unpatched autoconf package.

@item 
bpo-45950@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45950}: The build system now uses a @code{_bootstrap_python}
interpreter for freezing and deepfreezing again. To speed up build process
the build tools @code{_bootstrap_python} and @code{_freeze_module}
are no longer build with LTO.

@item 
bpo-45881@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45881}: The @code{configure} script now accepts
@code{--with-build-python} and @code{--with-freeze-module} options to make cross
compiling easier.

@item 
bpo-40280@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40280}: Emscripten platform now uses @code{.wasm} suffix by default.

@item 
bpo-40280@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40280}: Disable unusable core extension modules on WASM/Emscripten
targets.

@item 
bpo-40280@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40280}: @code{configure} now checks for socket @code{shutdown} function. The
check makes it possible to disable @code{SYS_shutdown} with
@code{ac_cv_func_shutdown=no} in CONFIG_SITE.

@item 
bpo-40280@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40280}: @code{configure} now checks for functions @code{fork1, getegid,
geteuid, getgid, getppid, getuid, opendir, pipe, system, wait, ttyname}.

@item 
bpo-33393@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33393}: Update @code{config.guess} to 2021-06-03 and @code{config.sub} to
2021-08-14. @code{Makefile} now has an @code{update-config} target to make
updating more convenient.

@item 
bpo-45866@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45866}: @code{make regen-all} now produces the same output when run from a
directory other than the source tree: when building Python out of the
source tree. pegen now strips directory of the “generated by pygen from
<FILENAME>” header Patch by Victor Stinner.

@item 
bpo-40280@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40280}: @code{configure} now accepts machine @code{wasm32} or @code{wasm64} and
OS @code{wasi} or @code{emscripten} for cross building, e.g.
@code{wasm32-unknown-emscripten}, @code{wasm32-wasi}, or
@code{wasm32-unknown-wasi}.

@item 
bpo-41498@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41498}: Python now compiles on platforms without @code{sigset_t}. Several
functions in @ref{cb,,signal} are not available when @code{sigset_t} is missing.

Based on patch by Roman Yurchak for pyodide.

@item 
bpo-45881@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45881}: @code{setup.py} now uses @code{CC} from environment first to discover
multiarch and cross compile paths.

@item 
bpo-45886@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45886}: The @code{_freeze_module} program path can now be overridden on
the command line, e.g. @code{make
FREEZE_MODULE=../x86_64/Program/_freeze_module}.

@item 
bpo-45873@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45873}: Get rid of the @code{_bootstrap_python} build step. The
deepfreeze.py script is now run using @code{$(PYTHON_FOR_REGEN)} which can be
Python 3.7 or newer (on Windows, 3.8 or newer).

@item 
bpo-45847@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45847}: Port builtin hashlib extensions to @code{PY_STDLIB_MOD} macro and
@code{addext()}.

@item 
bpo-45723@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45723}: Add @code{autoconf} helpers for saving and restoring environment
variables:


@itemize *

@item 
@code{SAVE_ENV}: Save @code{$CFLAGS}, @code{$LDFLAGS}, @code{$LIBS}, and
@code{$CPPFLAGS}.

@item 
@code{RESTORE_ENV}: Restore @code{$CFLAGS}, @code{$LDFLAGS}, @code{$LIBS}, and
@code{$CPPFLAGS}.

@item 
@code{WITH_SAVE_ENV([SCRIPT])}: Run @code{SCRIPT} wrapped with @code{SAVE_ENV} and
@code{RESTORE_ENV}.
@end itemize

Patch by Erlend E. Aasland.

@item 
bpo-45573@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45573}: Mandatory core modules, that are required to bootstrap Python,
are now in @code{Modules/Setup.bootstrap}.

@item 
bpo-45573@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45573}: @code{configure} now creates @code{Modules/Setup.stdlib} with
conditionally enabled/disabled extension module lines. The file is not
used, yet.

@item 
bpo-45573@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45573}: @code{configure} now uses a unified format to set state, compiler
flags, and linker flags in Makefile. The new macro @code{PY_STDLIB_MOD} sets
three variables that are consumed by @code{Modules/Setup} and @code{setup.py}.

@item 
bpo-45816@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45816}: Python now supports building with Visual Studio 2022 (MSVC
v143, VS Version 17.0). Patch by Jeremiah Vivian.

@item 
bpo-45800@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45800}: Settings for @code{pyexpat} C extension are now detected by
@code{configure}. The bundled @code{expat} library is built in @code{Makefile}.

@item 
bpo-45798@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45798}: Settings for @ref{3a,,decimal} internal C extension are now
detected by @code{configure}. The bundled @code{libmpdec} library is built in
@code{Makefile}.

@item 
bpo-45723@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45723}: @code{configure} has a new option @code{--with-pkg-config} to
disable or require pkg-config.

@item 
bpo-45774@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45774}: The build dependencies for @ref{d4,,sqlite3} are now detected by
@code{configure} and @code{pkg-config}. Patch by Erlend E. Aasland.

@item 
bpo-45763@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45763}: The build dependencies for @ref{13a,,zlib}, @ref{14,,bz2}, and
@ref{8e,,lzma} are now detected by @code{configure}.

@item 
bpo-45747@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45747}: gdbm and dbm build dependencies are now detected by
@code{configure}.

@item 
bpo-45743@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45743}: On macOS, the build system no longer passes
@code{search_paths_first} to the linker. The flag has been the default since
Xcode 4 / macOS 10.6.

@item 
bpo-45723@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45723}: @code{configure.ac} is now compatible with autoconf 2.71.
Deprecated checks @code{STDC_HEADERS} and @code{AC_HEADER_TIME} have been
removed.

@item 
bpo-45723@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45723}: @code{configure} now prints a warning when pkg-config is missing.

@item 
bpo-45731@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45731}: @code{configure --enable-loadable-sqlite-extensions} is now
handled by new @code{PY_SQLITE_ENABLE_LOAD_EXTENSION} macro instead of logic
in setup.py.

@item 
bpo-45723@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45723}: configure.ac now uses custom helper macros and
@code{AC_CACHE_CHECK} to simplify and speed up configure runs.

@item 
bpo-45696@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45696}: Skip the marshal step for frozen modules by generating C code
that produces a set of ready-to-use code objects. This speeds up startup
time by another 10% or more.

@item 
bpo-45561@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45561}: Run smelly.py tool from $(srcdir).
@end itemize

@node Windows<37>,macOS<28>,Build<44>,Python 3 11 0 alpha 3
@anchor{whatsnew/changelog id502}@anchor{1c5e}
@subsubsection Windows



@itemize -

@item 
bpo-46105@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46105}: Fixed calculation of @ref{3e2,,sys.path} in a venv on Windows.

@item 
bpo-45901@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45901}: When installed through the Microsoft Store and set as the
default app for @code{*.py} files, command line arguments will now be
passed to Python when invoking a script without explicitly launching
Python (that is, @code{script.py args} rather than @code{python script.py
args}).

@item 
bpo-45616@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45616}: Fix Python Launcher’s ability to distinguish between versions
3.1 and 3.10 when either one is explicitly requested.  Previously, 3.1
would be used if 3.10 was requested but not installed, and 3.10 would be
used if 3.1 was requested but 3.10 was installed.

@item 
bpo-45850@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45850}: Implement changes to build with deep-frozen modules on Windows.
Note that we now require Python 3.10 as the “bootstrap” or “host” Python.

@item 
bpo-45732@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45732}: Updates bundled Tcl/Tk to 8.6.12.

@item 
bpo-45720@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45720}: Internal reference to @code{shlwapi.dll} was dropped to help
improve startup time. This DLL will no longer be loaded at the start of
every Python process.
@end itemize

@node macOS<28>,C API<38>,Windows<37>,Python 3 11 0 alpha 3
@anchor{whatsnew/changelog id503}@anchor{1c5f}
@subsubsection macOS



@itemize -

@item 
bpo-45732@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45732}: Update python.org macOS installer to use Tcl/Tk 8.6.12.
@end itemize

@node C API<38>,,macOS<28>,Python 3 11 0 alpha 3
@anchor{whatsnew/changelog id504}@anchor{1c60}
@subsubsection C API



@itemize -

@item 
bpo-39026@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39026}: Fix Python.h to build C extensions with Xcode: remove a
relative include from @code{Include/cpython/pystate.h}.
@end itemize

@node Python 3 11 0 alpha 2,Python 3 11 0 alpha 1,Python 3 11 0 alpha 3,Changelog
@anchor{whatsnew/changelog python-3-11-0-alpha-2}@anchor{1c61}
@subsection Python 3.11.0 alpha 2


`Release date: 2021-11-05'

@menu
* Core and Builtins: Core and Builtins<107>. 
* Library: Library<110>. 
* Documentation: Documentation<38>. 
* Tests: Tests<38>. 
* Build: Build<45>. 
* Windows: Windows<38>. 
* macOS: macOS<29>. 
* IDLE: IDLE<19>. 
* C API: C API<39>. 

@end menu

@node Core and Builtins<107>,Library<110>,,Python 3 11 0 alpha 2
@anchor{whatsnew/changelog id505}@anchor{1c62}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-45716@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45716}: Improve the @ref{18f,,SyntaxError} message when using @code{True},
@code{None} or @code{False} as keywords in a function call. Patch by Pablo
Galindo.

@item 
bpo-45688@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45688}: @ref{a48,,sys.stdlib_module_names} now contains the macOS-specific
module @code{_scproxy}.

@item 
bpo-45379@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45379}: Clarify @ref{65b,,ImportError} message when we try to explicitly
import a frozen module but frozen modules are disabled.

@item 
bpo-44525@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44525}: Specialize simple calls to Python functions (no starargs,
keyword dict, or closure)

@item 
bpo-45530@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45530}: Cases of sorting using tuples as keys may now be significantly
faster in some cases. Patch by Tim Peters.

The order of the result may differ from earlier releases if the tuple
elements don’t define a total ordering (see
@ref{1c63,,Value comparisons} for information on total ordering).
It’s generally true that the result of sorting simply isn’t well-defined
in the absence of a total ordering on list elements.

@item 
bpo-45526@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45526}: In obmalloc, set ADDRESS_BITS to not ignore any bits (ignored
16 before). That is safer in the case that the kernel gives user-space
virtual addresses that span a range greater than 48 bits.

@item 
bpo-30570@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30570}: Fixed a crash in @code{issubclass()} from infinite recursion when
searching pathological @code{__bases__} tuples.

@item 
bpo-45521@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45521}: Fix a bug in the obmalloc radix tree code.  On 64-bit machines,
the bug causes the tree to hold 46-bits of virtual addresses, rather than
the intended 48-bits.

@item 
bpo-45494@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45494}: Fix parser crash when reporting errors involving invalid
continuation characters. Patch by Pablo Galindo.

@item 
bpo-45445@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45445}: Python now fails to initialize if it finds an invalid
@ref{170,,-X} option in the command line. Patch by Pablo Galindo.

@item 
bpo-45340@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45340}: Object attributes are held in an array instead of a dictionary.
An object’s dictionary are created lazily, only when needed. Reduces the
memory consumption of a typical Python object by about 30%. Patch by Mark
Shannon.

@item 
bpo-45408@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45408}: Fix a crash in the parser when reporting tokenizer errors that
occur at the same time unclosed parentheses are detected. Patch by Pablo
Galindo.

@item 
bpo-29410@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29410}: Add SipHash13 for string hash algorithm and use it by default.

@item 
bpo-45385@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45385}: Fix reference leak from descr_check. Patch by Donghee Na.

@item 
bpo-45367@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45367}: Specialized the @code{BINARY_MULTIPLY} opcode to
@code{BINARY_MULTIPLY_INT} and @code{BINARY_MULTIPLY_FLOAT} using the PEP 659
machinery.

@item 
bpo-21736@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21736}: Frozen stdlib modules now have @code{__file__} to the .py file
they would otherwise be loaded from, if possible.  For packages,
@code{__path__} now has the correct entry instead of being an empty list,
which allows unfrozen submodules to be imported.  These are set only if
the stdlib directory is known when the runtime is initialized.  Note that
the file at @code{__file__} is not guaranteed to exist.  None of this affects
non-stdlib frozen modules nor, for now, frozen modules imported using
@code{PyImport_ImportFrozenModule()}.  Also, at the moment @code{co_filename} is
not updated for the module.

@item 
bpo-45020@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45020}: For frozen stdlib modules, record the original module name as
@code{module.__spec__.loader_state.origname}.  If the value is different than
@code{module.__spec__.name} then the module was defined as an alias in
Tools/scripts/freeze_modules.py.  If it is @code{None} then the module comes
from a source file outside the stdlib.

@item 
bpo-45324@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45324}: In FrozenImporter.find_spec(), we now preserve the information
needed in exec_module() to load the module.  This change mostly impacts
internal details, rather than changing the importer’s behavior.

@item 
bpo-45292@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45292}: Implement 
@geindex Python Enhancement Proposals; PEP 654
PEP 654@footnote{https://peps.python.org/pep-0654/}. Add @ref{4d3,,ExceptionGroup} and
@ref{566,,BaseExceptionGroup}. Update traceback display code.

@item 
bpo-40116@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40116}: Change to the implementation of split dictionaries. Classes
where the instances differ either in the exact set of attributes, or in
the order in which those attributes are set, can still share keys. This
should have no observable effect on users of Python or the C-API. Patch by
Mark Shannon.

@item 
bpo-44050@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44050}: Extensions that indicate they use global state (by setting
@code{m_size} to -1) can again be used in multiple interpreters. This reverts
to behavior of Python 3.8.

@item 
bpo-44525@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44525}: Setup initial specialization infrastructure for the
@code{CALL_FUNCTION} opcode. Implemented initial specializations for C
function calls:


@itemize *

@item 
@code{CALL_FUNCTION_BUILTIN_O} for @code{METH_O} flag.

@item 
@code{CALL_FUNCTION_BUILTIN_FAST} for @code{METH_FASTCALL} flag without keywords.

@item 
@code{CALL_FUNCTION_LEN} for @code{len(o)}.

@item 
@code{CALL_FUNCTION_ISINSTANCE} for @code{isinstance(o, t)}.
@end itemize

@item 
bpo-44511@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44511}: Improve the generated bytecode for class and mapping patterns.

@item 
bpo-43706@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43706}: Speed up calls to @code{enumerate()} by using the 
@geindex Python Enhancement Proposals; PEP 590
PEP 590@footnote{https://peps.python.org/pep-0590/}
@code{vectorcall} calling convention. Patch by Donghee Na.
@end itemize

@node Library<110>,Documentation<38>,Core and Builtins<107>,Python 3 11 0 alpha 2
@anchor{whatsnew/changelog id506}@anchor{1c64}
@subsubsection Library



@itemize -

@item 
bpo-45679@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45679}: Fix caching of multi-value @ref{a5b,,typing.Literal}.
@code{Literal[True, 2]} is no longer equal to @code{Literal[1, 2]}.

@item 
bpo-42064@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42064}: Convert @ref{d4,,sqlite3} to multi-phase initialisation (PEP 489).
Patches by Erlend E. Aasland.

@item 
bpo-45438@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45438}: Fix typing.Signature string representation for generic builtin
types.

@item 
bpo-45613@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45613}: @ref{d4,,sqlite3} now sets @ref{88e,,sqlite3.threadsafety} based on
the default threading mode the underlying SQLite library has been compiled
with. Patch by Erlend E. Aasland.

@item 
bpo-45574@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45574}: Fix warning about @code{print_escape} being unused.

@item 
bpo-45581@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45581}: @ref{5a6,,sqlite3.connect()} now correctly raises @ref{1761,,MemoryError}
if the underlying SQLite API signals memory error. Patch by Erlend E.
Aasland.

@item 
bpo-45557@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45557}: @ref{a2f,,pprint.pprint()} now handles `underscore_numbers'
correctly. Previously it was always setting it to @code{False}.

@item 
bpo-44019@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44019}: Add @ref{1c65,,operator.call()} to @code{operator.__all__}. Patch by
Kreusada.

@item 
bpo-42174@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42174}: @ref{130f,,shutil.get_terminal_size()} now falls back to sane values
if the column or line count are 0.

@item 
bpo-35673@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35673}: Improve the introspectability of the @code{__loader__} attribute
for namespace packages.  @ref{115c,,importlib.machinery.NamespaceLoader} is
now public, and implements the @ref{115a,,importlib.abc.InspectLoader}
interface. @code{_NamespaceLoader} is kept for backward compatibility.

@item 
bpo-45515@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45515}: Add references to @ref{13b,,zoneinfo} in the @ref{34,,datetime}
documentation, mostly replacing outdated references to @code{dateutil.tz}.
Change by Paul Ganssle.

@item 
bpo-45475@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45475}: Reverted optimization of iterating @ref{65c,,gzip.GzipFile},
@ref{a6c,,bz2.BZ2File}, and @ref{1212,,lzma.LZMAFile} (see bpo-43787@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43787}) because
it caused regression when user iterate them without having reference of
them. Patch by Inada Naoki.

@item 
bpo-45489@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45489}: Update @ref{1c1d,,ForwardRef} to support @code{|} operator.
Patch by Donghee Na.

@item 
bpo-42222@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42222}: Removed deprecated support for float arguments in
`randrange()'.

@item 
bpo-45428@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45428}: Fix a regression in py_compile when reading filenames from
standard input.

@item 
bpo-45467@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45467}: Fix incremental decoder and stream reader in the
“raw-unicode-escape” codec. Previously they failed if the escape sequence
was split.

@item 
bpo-45461@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45461}: Fix incremental decoder and stream reader in the
“unicode-escape” codec. Previously they failed if the escape sequence was
split.

@item 
bpo-45239@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45239}: Fixed @ref{1c66,,email.utils.parsedate_tz()} crashing with
@ref{1742,,UnboundLocalError} on certain invalid input instead of returning
@code{None}. Patch by Ben Hoyt.

@item 
bpo-45417@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45417}: Fix quadratic behaviour in the enum module: Creation of enum
classes with a lot of entries was quadratic.

@item 
bpo-45249@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45249}: Fix the behaviour of @ref{1c67,,traceback.print_exc()} when
displaying the caret when the @code{end_offset} in the exception is set to 0.
Patch by Pablo Galindo

@item 
bpo-45416@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45416}: Fix use of @ref{c6d,,asyncio.Condition} with explicit
@ref{c6c,,asyncio.Lock} objects, which was a regression due to removal of
explicit loop arguments. Patch by Joongi Kim.

@item 
bpo-20028@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20028}: Empty escapechar/quotechar is not allowed when initializing
@ref{1871,,csv.Dialect}. Patch by Vajrasky Kok and Donghee Na.

@item 
bpo-44904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44904}: Fix bug in the @ref{3e,,doctest} module that caused it to fail if
a docstring included an example with a @code{classmethod} @code{property}. Patch
by Alex Waygood.

@item 
bpo-45406@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45406}: Make @ref{1bb1,,inspect.getmodule()} catch @code{FileNotFoundError}
raised by @code{inspect.getabsfile()}, and return @code{None} to indicate that
the module could not be determined.

@item 
bpo-45411@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45411}: Add extensions for files containing subtitles - .srt & .vtt -
to the mimetypes.py module.

@item 
bpo-10716@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10716}: Migrated pydoc to HTML5 (without changing the look of it). Side
effect is to update xmlrpc’s @code{ServerHTMLDoc} which now uses the CSS too.
cgitb now relies less on pydoc (as it can’t use the CSS file).

@item 
bpo-27580@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27580}: Add support of null characters in @ref{2d,,csv}.

@item 
bpo-45262@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45262}: Prevent use-after-free in asyncio. Make sure the cached running
loop holder gets cleared on dealloc to prevent use-after-free in
get_running_loop

@item 
bpo-45386@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45386}: Make @ref{135,,xmlrpc.client} more robust to C runtimes where the
underlying C @code{strftime} function results in a @code{ValueError} when
testing for year formatting options.

@item 
bpo-20028@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20028}: Improve error message of @ref{1871,,csv.Dialect} when
initializing. Patch by Vajrasky Kok and Donghee Na.

@item 
bpo-45343@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45343}: Update bundled pip to 21.2.4 and setuptools to 58.1.0

@item 
bpo-45328@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45328}: Fixed @ref{d3b,,http.client.HTTPConnection} to work properly in
OSs that don’t support the @code{TCP_NODELAY} socket option.

@item 
bpo-45243@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45243}: Add @ref{88c,,setlimit()} and
@ref{88d,,getlimit()} to @ref{54e,,sqlite3.Connection} for
setting and getting SQLite limits by connection basis. Patch by Erlend E.
Aasland.

@item 
bpo-45320@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45320}: Removed from the @ref{82,,inspect} module:


@itemize *

@item 

@table @asis

@item the @code{getargspec} function, deprecated since Python 3.0;

use @ref{231,,inspect.signature()} or @ref{946,,inspect.getfullargspec()} instead.
@end table

@item 
the @code{formatargspec} function, deprecated since Python 3.5;
use the @ref{231,,inspect.signature()} function and @code{Signature} object
directly.

@item 
the undocumented @code{Signature.from_builtin} and @code{Signature.from_function}
functions, deprecated since Python 3.5; use the
@ref{947,,Signature.from_callable()} method
instead.
@end itemize

Patch by Hugo van Kemenade.

@item 
bpo-45192@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45192}: Fix the @code{tempfile._infer_return_type} function so that the
@code{dir} argument of the @ref{e6,,tempfile} functions accepts an object
implementing the @code{os.PathLike} protocol.

Patch by Kyungmin Lee.

@item 
bpo-45160@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45160}: When tracing a tkinter variable used by a ttk OptionMenu,
callbacks are no longer made twice.

@item 
bpo-25625@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25625}: Added non parallel-safe @ref{821,,chdir()} context
manager to change the current working directory and then restore it on
exit. Simple wrapper around @ref{822,,chdir()}.

@item 
bpo-24139@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24139}: Add support for SQLite extended result codes in
@ref{1c68,,sqlite3.Error}. Patch by Erlend E. Aasland.

@item 
bpo-24444@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24444}: Fixed an error raised in @ref{7,,argparse} help display when help
for an option is set to 1+ blank spaces or when `choices' arg is an empty
container.

@item 
bpo-44547@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44547}: Implement @code{Fraction.__int__}, so that a
@ref{215,,fractions.Fraction} instance @code{f} passes an @code{isinstance(f,
typing.SupportsInt)} check.

@item 
bpo-40321@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40321}: Adds support for HTTP 308 redirects to @ref{10f,,urllib}. See
@geindex RFC; RFC 7538
RFC 7538@footnote{https://datatracker.ietf.org/doc/html/rfc7538.html} for details. Patch by Jochem Schulenklopper.

@item 
bpo-41374@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41374}: Ensure that @code{socket.TCP_*} constants are exposed on Cygwin
3.1.6 and greater.

@item 
bpo-35970@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35970}: Add help flag to the base64 module’s command line interface.
Patch contributed by Robert Kuska.
@end itemize

@node Documentation<38>,Tests<38>,Library<110>,Python 3 11 0 alpha 2
@anchor{whatsnew/changelog id507}@anchor{1c69}
@subsubsection Documentation



@itemize -

@item 
bpo-45726@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45726}: Improve documentation for @ref{84c,,functools.singledispatch()} and
@ref{be9,,functools.singledispatchmethod}.

@item 
bpo-45680@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45680}: Amend the docs on @code{GenericAlias} objects to clarify that
non-container classes can also implement @code{__class_getitem__}. Patch
contributed by Alex Waygood.

@item 
bpo-45618@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45618}: Update Sphinx version used to build the documentation to 4.2.0.
Patch by Maciej Olko.

@item 
bpo-45655@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45655}: Add a new “relevant PEPs” section to the top of the
documentation for the @code{typing} module. Patch by Alex Waygood.

@item 
bpo-45604@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45604}: Add @code{level} argument to @code{multiprocessing.log_to_stderr}
function docs.

@item 
bpo-45516@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45516}: Add protocol description to the
@code{importlib.abc.TraversableResources} documentation.

@item 
bpo-45464@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45464}: Mention in the documentation of @ref{1c6a,,Built-in Exceptions} that inheriting from multiple exception types in a
single subclass is not recommended due to possible memory layout
incompatibility.

@item 
bpo-45449@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45449}: Add note about 
@geindex Python Enhancement Proposals; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} in @ref{1f,,collections.abc}.

@item 
bpo-45516@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45516}: Add protocol description to the
@code{importlib.abc.Traversable} documentation.

@item 
bpo-20692@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20692}: Add Programming FAQ entry explaining that int literal attribute
access requires either a space after or parentheses around the literal.
@end itemize

@node Tests<38>,Build<45>,Documentation<38>,Python 3 11 0 alpha 2
@anchor{whatsnew/changelog id508}@anchor{1c6b}
@subsubsection Tests



@itemize -

@item 
bpo-45678@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45678}: Add tests for scenarios in which
@ref{be9,,functools.singledispatchmethod} is stacked on top of a method that
has already been wrapped by two other decorators. Patch by Alex Waygood.

@item 
bpo-45578@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45578}: Add tests for @ref{208,,dis.distb()}

@item 
bpo-45678@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45678}: Add tests to ensure that @code{functools.singledispatchmethod}
correctly wraps the attributes of the target function.

@item 
bpo-45668@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45668}: PGO tests now pass when Python is built without test extension
modules.

@item 
bpo-45577@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45577}: Add subtests for all @code{pickle} protocols in @code{test_zoneinfo}.

@item 
bpo-45566@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45566}: Fix @code{test_frozen_pickle} in @code{test_dataclasses} to check all
@code{pickle} versions.

@item 
bpo-43592@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43592}: @code{test.libregrtest} now raises the soft resource limit for
the maximum number of file descriptors when the default is too low for our
test suite as was often the case on macOS.

@item 
bpo-39679@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39679}: Add more test cases for @code{@@functools.singledispatchmethod}
when combined with @code{@@classmethod} or @code{@@staticmethod}.

@item 
bpo-45410@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45410}: When libregrtest spawns a worker process, stderr is now written
into stdout to keep messages order. Use a single pipe for stdout and
stderr, rather than two pipes. Previously, messages were out of order
which made analysis of buildbot logs harder Patch by Victor Stinner.

@item 
bpo-45402@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45402}: Fix test_tools.test_sundry() when Python is built out of tree:
fix how the freeze_modules.py tool locates the _freeze_module program.
Patch by Victor Stinner.

@item 
bpo-45403@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45403}: Fix test_sys.test_stdlib_dir() when Python is built outside the
source tree: compare normalized paths. Patch by Victor Stinner.

@item 
bpo-45400@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45400}: Fix
test_name_error_suggestions_do_not_trigger_for_too_many_locals() of
test_exceptions if a directory name contains “a1” (like
“Python-3.11.0a1”): use a stricter regular expression. Patch by Victor
Stinner.

@item 
bpo-10572@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10572}: Rename @ref{d4,,sqlite3} tests from @code{test_sqlite} to
@code{test_sqlite3}, and relocate them to @code{Lib/test/test_sqlite3}. Patch by
Erlend E. Aasland.
@end itemize

@node Build<45>,Windows<38>,Tests<38>,Python 3 11 0 alpha 2
@anchor{whatsnew/changelog id509}@anchor{1c6c}
@subsubsection Build



@itemize -

@item 
bpo-43158@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43158}: @code{setup.py} now uses values from configure script to build the
@code{_uuid} extension module. Configure now detects util-linux’s
@code{libuuid}, too.

@item 
bpo-45666@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45666}: Fix warning of @code{swprintf} and @code{%s} usage in
@code{_testembed.c}

@item 
bpo-45548@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45548}: @code{Modules/Setup} and @code{Modules/makesetup} have been improved.
The @code{Setup} file now contains working rules for all extensions. Outdated
comments have been removed. Rules defined by @code{makesetup} track
dependencies correctly.

@item 
bpo-45548@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45548}: The @ref{92,,math} and @ref{19,,cmath} implementation now require a
C99 compatible @code{libm} and no longer ship with workarounds for missing
acosh, asinh, atanh, expm1, and log1p functions.

@item 
bpo-45595@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45595}: @code{setup.py} and @code{makesetup} now track build dependencies on
all Python header files and module specific header files.

@item 
bpo-45571@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45571}: @code{Modules/Setup} now use @code{PY_CFLAGS_NODIST} instead of
@code{PY_CFLAGS} to compile shared modules.

@item 
bpo-45570@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45570}: @code{pyexpat} and @code{_elementtree} no longer define
obsolete macros @code{HAVE_EXPAT_CONFIG_H} and @code{USE_PYEXPAT_CAPI}.
@code{XML_POOR_ENTROPY} is now defined in @code{expat_config.h}.

@item 
bpo-43974@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43974}: @code{setup.py} no longer defines @code{Py_BUILD_CORE_MODULE}.
Instead every module, that uses the internal API, defines the macro.

@item 
bpo-45548@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45548}: Fill in missing entries in Modules/Setup.

@item 
bpo-45532@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45532}: Update @ref{49d,,sys.version} to use @code{main} as fallback
information. Patch by Jeong YunWon.

@item 
bpo-45536@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45536}: The @code{configure} script now checks whether OpenSSL headers and
libraries provide required APIs. Most common APIs are verified. The check
detects outdated or missing OpenSSL. Failures do not stop configure.

@item 
bpo-45221@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45221}: Fixed regression in handling of @code{LDFLAGS} and @code{CPPFLAGS}
options where @code{argparse.parse_known_args()} could interpret an option
as one of the built-in command line argument, for example @code{-h} for help.

@item 
bpo-45440@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45440}: Building Python now requires a C99 @code{<math.h>} header file
providing the following functions: @code{copysign()}, @code{hypot()},
@code{isfinite()}, @code{isinf()}, @code{isnan()}, @code{round()}. Patch by Victor
Stinner.

@item 
bpo-45405@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45405}: Prevent @code{internal configure error} when running @code{configure}
with recent versions of non-Apple clang.  Patch by David Bohman.

@item 
bpo-45433@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45433}: Avoid linking libpython with libcrypt.
@end itemize

@node Windows<38>,macOS<29>,Build<45>,Python 3 11 0 alpha 2
@anchor{whatsnew/changelog id510}@anchor{1c6d}
@subsubsection Windows



@itemize -

@item 
bpo-43652@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43652}: Update Tcl/Tk to 8.6.11, actually this time. The previous
update incorrectly included 8.6.10.

@item 
bpo-45337@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45337}: venv now warns when the created environment may need to be
accessed at a different path, due to redirections, links or junctions. It
also now correctly installs or upgrades components when the alternate path
is required.

@item 
bpo-43851@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43851}: Build SQLite @code{SQLITE_OMIT_AUTOINIT} on Windows. Patch by
Erlend E. Aasland.
@end itemize

@node macOS<29>,IDLE<19>,Windows<38>,Python 3 11 0 alpha 2
@anchor{whatsnew/changelog id511}@anchor{1c6e}
@subsubsection macOS



@itemize -

@item 
bpo-44828@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44828}: Avoid tkinter file dialog failure on macOS 12 Monterey when
using the Tk 8.6.11 provided by python.org macOS installers. Patch by Marc
Culler of the Tk project.
@end itemize

@node IDLE<19>,C API<39>,macOS<29>,Python 3 11 0 alpha 2
@anchor{whatsnew/changelog id512}@anchor{1c6f}
@subsubsection IDLE



@itemize -

@item 
bpo-45495@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45495}: Add context keywords ‘case’ and ‘match’ to completions list.
@end itemize

@node C API<39>,,IDLE<19>,Python 3 11 0 alpha 2
@anchor{whatsnew/changelog id513}@anchor{1c70}
@subsubsection C API



@itemize -

@item 
bpo-29103@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29103}: @ref{774,,PyType_FromSpec*} now
copies the class name from the spec to a buffer owned by the class, so the
original can be safely deallocated. Patch by Petr Viktorin.

@item 
bpo-45522@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45522}: The internal freelists for frame, float, list, dict, async
generators, and context objects can now be disabled.

@item 
bpo-35134@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35134}: Exclude @ref{3dc,,PyWeakref_GET_OBJECT()} from the limited C API.
It never worked since the @code{PyWeakReference} structure is opaque
in the limited C API.

@item 
bpo-35081@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35081}: Move the @code{interpreteridobject.h} header file from
@code{Include/} to @code{Include/internal/}. It only provides private functions.
Patch by Victor Stinner.

@item 
bpo-35134@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35134}: The non-limited API files @code{cellobject.h}, @code{classobject.h},
@code{context.h}, @code{funcobject.h}, @code{genobject.h} and @code{longintrepr.h}
have been moved to the @code{Include/cpython} directory. Moreover, the
@code{eval.h} header file was removed. These files must not be included
directly, as they are already included in @code{Python.h}: @ref{98c,,Include Files}. If they have been included directly, consider
including @code{Python.h} instead. Patch by Victor Stinner.

@item 
bpo-45474@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45474}: The following items are no longer available when
@code{Py_LIMITED_API} is defined:


@itemize *

@item 
@ref{99e,,PyMarshal_WriteLongToFile()}

@item 
@ref{99f,,PyMarshal_WriteObjectToFile()}

@item 
@ref{9a0,,PyMarshal_ReadObjectFromString()}

@item 
@ref{9a1,,PyMarshal_WriteObjectToString()}

@item 
the @code{Py_MARSHAL_VERSION} macro
@end itemize

These are not part of the @ref{9a2,,limited API}.

Patch by Victor Stinner.

@item 
bpo-45434@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45434}: Remove the @code{pystrhex.h} header file. It only contains private
functions. C extensions should only include the main @code{<Python.h>} header
file. Patch by Victor Stinner.

@item 
bpo-45440@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45440}: Remove the @code{Py_FORCE_DOUBLE()} macro. It was used by the
@code{Py_IS_INFINITY()} macro. Patch by Victor Stinner.

@item 
bpo-45434@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45434}: @code{<Python.h>} no longer includes the header files
@code{<stdlib.h>}, @code{<stdio.h>}, @code{<errno.h>} and @code{<string.h>} when the
@code{Py_LIMITED_API} macro is set to @code{0x030b0000} (Python 3.11) or higher.
C extensions should explicitly include the header files after @code{#include
<Python.h>}. Patch by Victor Stinner.

@item 
bpo-41123@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41123}: Remove @code{Py_UNICODE_COPY()} and @code{Py_UNICODE_FILL()} macros,
deprecated since Python 3.3. Use @code{PyUnicode_CopyCharacters()} or
@code{memcpy()} (@code{wchar_t*} string), and @code{PyUnicode_Fill()} functions
instead. Patch by Victor Stinner.

@item 
bpo-45412@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45412}: Remove the following math macros using the @code{errno} variable:


@itemize *

@item 
@code{Py_ADJUST_ERANGE1()}

@item 
@code{Py_ADJUST_ERANGE2()}

@item 
@code{Py_OVERFLOWED()}

@item 
@code{Py_SET_ERANGE_IF_OVERFLOW()}

@item 
@code{Py_SET_ERRNO_ON_MATH_ERROR()}
@end itemize

Patch by Victor Stinner.

@item 
bpo-45395@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45395}: Custom frozen modules (the array set to
@code{PyImport_FrozenModules}) are now treated as additions, rather than
replacing all the default frozen modules. Frozen stdlib modules can still
be disabled by setting the “code” field of the custom array entry to NULL.

@item 
bpo-43760@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43760}: Add new @ref{95f,,PyThreadState_EnterTracing()}, and
@ref{960,,PyThreadState_LeaveTracing()} functions to the limited C API to
suspend and resume tracing and profiling. Patch by Victor Stinner.

@item 
bpo-44220@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44220}: @ref{b7f,,PyStructSequence_UnnamedField} is added to the Stable
ABI.
@end itemize

@node Python 3 11 0 alpha 1,Python 3 10 0 beta 1,Python 3 11 0 alpha 2,Changelog
@anchor{whatsnew/changelog python-3-11-0-alpha-1}@anchor{1c71}
@subsection Python 3.11.0 alpha 1


`Release date: 2021-10-05'

@menu
* Security: Security<33>. 
* Core and Builtins: Core and Builtins<108>. 
* Library: Library<111>. 
* Core and Builtins: Core and Builtins<109>. 
* Library: Library<112>. 
* Core and Builtins: Core and Builtins<110>. 
* Library: Library<113>. 
* Core and Builtins: Core and Builtins<111>. 
* Library: Library<114>. 
* Core and Builtins: Core and Builtins<112>. 
* Library: Library<115>. 
* Core and Builtins: Core and Builtins<113>. 
* Library: Library<116>. 
* Core and Builtins: Core and Builtins<114>. 
* Library: Library<117>. 
* Core and Builtins: Core and Builtins<115>. 
* Library: Library<118>. 
* Core and Builtins: Core and Builtins<116>. 
* Library: Library<119>. 
* Core and Builtins: Core and Builtins<117>. 
* Library: Library<120>. 
* Documentation: Documentation<39>. 
* Tests: Tests<39>. 
* Build: Build<46>. 
* Windows: Windows<39>. 
* macOS: macOS<30>. 
* IDLE: IDLE<20>. 
* Tools/Demos: Tools/Demos<27>. 
* C API: C API<40>. 

@end menu

@node Security<33>,Core and Builtins<108>,,Python 3 11 0 alpha 1
@anchor{whatsnew/changelog id514}@anchor{1c72}
@subsubsection Security



@itemize -

@item 
bpo-42278@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42278}: Replaced usage of @ref{1c73,,tempfile.mktemp()} with
@ref{1440,,TemporaryDirectory} to avoid a potential race condition.

@item 
bpo-44600@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44600}: Fix incorrect line numbers while tracing some failed patterns
in @ref{a14,,match} statements. Patch by Charles Burkland.

@item 
bpo-41180@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41180}: Add auditing events to the @ref{91,,marshal} module, and stop
raising @code{code.__init__} events for every unmarshalled code object.
Directly instantiated code objects will continue to raise an event, and
audit event handlers should inspect or collect the raw marshal data. This
reduces a significant performance overhead when loading from @code{.pyc}
files.

@item 
bpo-44394@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44394}: Update the vendored copy of libexpat to 2.4.1 (from 2.2.8) to
get the fix for the 
@geindex Common Vulnerabilities and Exposures; CVE 2013-0340
CVE 2013-0340@footnote{https://www.cve.org/CVERecord?id=CVE-2013-0340} “Billion Laughs” vulnerability. This
copy is most used on Windows and macOS.

@item 
bpo-43124@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43124}: Made the internal @code{putcmd} function in @ref{cf,,smtplib}
sanitize input for presence of @code{\r} and @code{\n} characters to avoid
(unlikely) command injection.

@item 
bpo-44022@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44022}: @ref{73,,http.client} now avoids infinitely reading potential HTTP
headers after a @code{100 Continue} status response from the server.
@end itemize

@node Core and Builtins<108>,Library<111>,Security<33>,Python 3 11 0 alpha 1
@anchor{whatsnew/changelog id515}@anchor{1c74}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-43760@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43760}: The number of hardware branches per instruction dispatch is
reduced from two to one by adding a special instruction for tracing. Patch
by Mark Shannon.

@item 
bpo-45061@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45061}: Add a deallocator to the bool type to detect refcount bugs in C
extensions which call Py_DECREF(Py_True) or Py_DECREF(Py_False) by
mistake. Detect also refcount bugs when the empty tuple singleton or the
Unicode empty string singleton is destroyed by mistake. Patch by Victor
Stinner.

@item 
bpo-24076@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24076}: sum() was further optimised for summing up single digit
integers.

@item 
bpo-45190@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45190}: Update Unicode databases to Unicode 14.0.0.

@item 
bpo-45167@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45167}: Fix deepcopying of @ref{9f2,,types.GenericAlias} objects.

@item 
bpo-45155@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45155}: @ref{1c75,,int.to_bytes()} and @ref{1c2c,,int.from_bytes()} now take a
default value of @code{"big"} for the @code{byteorder} argument.
@code{int.to_bytes()} also takes a default value of @code{1} for the
@code{length} argument.
@end itemize

@node Library<111>,Core and Builtins<109>,Core and Builtins<108>,Python 3 11 0 alpha 1
@anchor{whatsnew/changelog id516}@anchor{1c76}
@subsubsection Library



@itemize -

@item 
bpo-44219@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44219}: Release the GIL while performing @code{isatty} system calls on
arbitrary file descriptors. In particular, this affects @ref{1c77,,os.isatty()},
@ref{1c78,,os.device_encoding()} and @ref{9c4,,io.TextIOWrapper}. By extension,
@ref{741,,io.open()} in text mode is also affected. This change solves a
deadlock in @code{os.isatty()}. Patch by Vincent Michel in bpo-44219@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44219}.
@end itemize

@node Core and Builtins<109>,Library<112>,Library<111>,Python 3 11 0 alpha 1
@anchor{whatsnew/changelog id517}@anchor{1c79}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-44959@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44959}: Added fallback to extension modules with ‘.sl’ suffix on HP-UX
@end itemize

@node Library<112>,Core and Builtins<110>,Core and Builtins<109>,Python 3 11 0 alpha 1
@anchor{whatsnew/changelog id518}@anchor{1c7a}
@subsubsection Library



@itemize -

@item 
bpo-45121@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45121}: Fix issue where @code{Protocol.__init__} raises @code{RecursionError}
when it’s called directly or via @code{super()}. Patch provided by Yurii
Karabas.
@end itemize

@node Core and Builtins<110>,Library<113>,Library<112>,Python 3 11 0 alpha 1
@anchor{whatsnew/changelog id519}@anchor{1c7b}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-44348@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44348}: The deallocator function of the @ref{7d8,,BaseException} type now
uses the trashcan mechanism to prevent stack overflow. For example, when a
@ref{f6e,,RecursionError} instance is raised, it can be linked to another
RecursionError through the @code{__context__} attribute or the
@code{__traceback__} attribute, and then a chain of exceptions is created.
When the chain is destroyed, nested deallocator function calls can crash
with a stack overflow if the chain is too long compared to the available
stack memory. Patch by Victor Stinner.

@item 
bpo-45123@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45123}: Fix PyAiter_Check to only check for the __anext__ presence (not
for __aiter__). Rename PyAiter_Check to PyAIter_Check, PyObject_GetAiter
-> PyObject_GetAIter.

@item 
bpo-1514420@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1514420}: Interpreter no longer attempts to open files with names in
angle brackets (like “<string>” or “<stdin>”) when formatting an
exception.

@item 
bpo-41031@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41031}: Match C and Python code formatting of unprintable exceptions
and exceptions in the @ref{1,,__main__} module.

@item 
bpo-37330@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37330}: @ref{318,,open()}, @ref{741,,io.open()}, @ref{317,,codecs.open()} and
@ref{945,,fileinput.FileInput} no longer accept @code{'U'} (“universal
newline”) in the file mode. This flag was deprecated since Python 3.3.
Patch by Victor Stinner.

@item 
bpo-45083@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45083}: When the interpreter renders an exception, its name now has a
complete qualname. Previously only the class name was concatenated to the
module name, which sometimes resulted in an incorrect full name being
displayed.

(This issue impacted only the C code exception rendering, the
@ref{105,,traceback} module was using qualname already).

@item 
bpo-34561@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34561}: List sorting now uses the merge-ordering strategy from Munro
and Wild’s @code{powersort()}. Unlike the former strategy, this is provably
near-optimal in the entropy of the distribution of run lengths. Most uses
of @code{list.sort()} probably won’t see a significant time difference, but
may see significant improvements in cases where the former strategy was
exceptionally poor. However, as these are all fast linear-time
approximations to a problem that’s inherently at best quadratic-time to
solve truly optimally, it’s also possible to contrive cases where the
former strategy did better.

@item 
bpo-45056@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45056}: Compiler now removes trailing unused constants from co_consts.

@item 
bpo-45020@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45020}: Add a new command line option, “-X frozen_modules=[on|off]” to
opt out of (or into) using optional frozen modules.  This defaults to “on”
(or “off” if it’s running out of the source tree).
@end itemize

@node Library<113>,Core and Builtins<111>,Core and Builtins<110>,Python 3 11 0 alpha 1
@anchor{whatsnew/changelog id520}@anchor{1c7c}
@subsubsection Library



@itemize -

@item 
bpo-45012@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45012}: In @ref{b2,,posix}, release GIL during @code{stat()}, @code{lstat()},
and @code{fstatat()} syscalls made by @ref{1ab1,,os.DirEntry.stat()}. Patch by
Stanisław Skonieczny.
@end itemize

@node Core and Builtins<111>,Library<114>,Library<113>,Python 3 11 0 alpha 1
@anchor{whatsnew/changelog id521}@anchor{1c7d}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-45018@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45018}: Fixed pickling of range iterators that iterated for over
@code{2**32} times.

@item 
bpo-45000@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45000}: A @ref{18f,,SyntaxError} is now raised when trying to delete
@ref{9e0,,__debug__}. Patch by Donghee Na.

@item 
bpo-44963@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44963}: Implement @code{send()} and @code{throw()} methods for
@code{anext_awaitable} objects. Patch by Pablo Galindo.
@end itemize

@node Library<114>,Core and Builtins<112>,Core and Builtins<111>,Python 3 11 0 alpha 1
@anchor{whatsnew/changelog id522}@anchor{1c7e}
@subsubsection Library



@itemize -

@item 
bpo-44962@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44962}: Fix a race in WeakKeyDictionary, WeakValueDictionary and
WeakSet when two threads attempt to commit the last pending removal. This
fixes asyncio.create_task and fixes a data loss in asyncio.run where
shutdown_asyncgens is not run
@end itemize

@node Core and Builtins<112>,Library<115>,Library<114>,Python 3 11 0 alpha 1
@anchor{whatsnew/changelog id523}@anchor{1c7f}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-24234@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24234}: Implement the @code{__bytes__()} special method on the
@ref{193,,bytes} type, so a bytes object @code{b}  passes an @code{isinstance(b,
typing.SupportsBytes)} check.

@item 
bpo-24234@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24234}: Implement the @code{__complex__()} special method on the
@ref{198,,complex} type, so a complex number @code{z} passes an @code{isinstance(z,
typing.SupportsComplex)} check.

@item 
bpo-44954@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44954}: Fixed a corner case bug where the result of
@code{float.fromhex('0x.8p-1074')} was rounded the wrong way.

@item 
bpo-44947@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44947}: Refine the syntax error for trailing commas in import
statements. Patch by Pablo Galindo.

@item 
bpo-44945@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44945}: Specialize the BINARY_ADD instruction using the PEP 659
machinery. Adds five new instructions:


@itemize *

@item 
BINARY_ADD_ADAPTIVE

@item 
BINARY_ADD_FLOAT

@item 
BINARY_ADD_INT

@item 
BINARY_ADD_UNICODE

@item 
BINARY_ADD_UNICODE_INPLACE_FAST
@end itemize
@end itemize

@node Library<115>,Core and Builtins<113>,Core and Builtins<112>,Python 3 11 0 alpha 1
@anchor{whatsnew/changelog id524}@anchor{1c80}
@subsubsection Library



@itemize -

@item 
bpo-44929@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44929}: Fix some edge cases of @code{enum.Flag} string representation in
the REPL. Patch by Pablo Galindo.
@end itemize

@node Core and Builtins<113>,Library<116>,Library<115>,Python 3 11 0 alpha 1
@anchor{whatsnew/changelog id525}@anchor{1c81}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-44914@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44914}: Class version tags are no longer recycled.

This means that a version tag serves as a unique identifier for the state
of a class. We rely on this for effective specialization of the LOAD_ATTR
and other instructions.

@item 
bpo-44698@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44698}: Restore behaviour of complex exponentiation with integer-valued
exponent of type @ref{197,,float} or @ref{198,,complex}.

@item 
bpo-44895@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44895}: A debug variable 
@geindex PYTHONDUMPREFSFILE
@geindex environment variable; PYTHONDUMPREFSFILE
@ref{1c82,,PYTHONDUMPREFSFILE} is added for
creating a dump file which is generated by @ref{636,,--with-trace-refs}.
Patch by Donghee Na.

@item 
bpo-44900@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44900}: Add five superinstructions for PEP 659 quickening:


@itemize *

@item 
LOAD_FAST LOAD_FAST

@item 
STORE_FAST LOAD_FAST

@item 
LOAD_FAST LOAD_CONST

@item 
LOAD_CONST LOAD_FAST

@item 
STORE_FAST STORE_FAST
@end itemize

@item 
bpo-44889@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44889}: Initial implementation of adaptive specialization of
@code{LOAD_METHOD}. The following specialized forms were added:


@itemize *

@item 
@code{LOAD_METHOD_CACHED}

@item 
@code{LOAD_METHOD_MODULE}

@item 
@code{LOAD_METHOD_CLASS}
@end itemize

@item 
bpo-44890@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44890}: Specialization stats are always collected in debug builds.

@item 
bpo-44885@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44885}: Correct the ast locations of f-strings with format specs and
repeated expressions. Patch by Pablo Galindo

@item 
bpo-44878@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44878}: Remove the loop from the bytecode interpreter. All instructions
end with a DISPATCH macro, so the loop is now redundant.

@item 
bpo-44878@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44878}: Remove switch statement for interpreter loop when using
computed gotos. This makes sure that we only have one dispatch table in
the interpreter.

@item 
bpo-44874@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44874}: Deprecate the old trashcan macros
(@code{Py_TRASHCAN_SAFE_BEGIN}/@code{Py_TRASHCAN_SAFE_END}). They should be
replaced by the new macros @code{Py_TRASHCAN_BEGIN} and @code{Py_TRASHCAN_END}.

@item 
bpo-44872@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44872}: Use new trashcan macros (Py_TRASHCAN_BEGIN/END) in
frameobject.c instead of the old ones (Py_TRASHCAN_SAFE_BEGIN/END).

@item 
bpo-33930@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33930}: Fix segmentation fault with deep recursion when cleaning method
objects. Patch by Augusto Goulart and Pablo Galindo.

@item 
bpo-25782@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25782}: Fix bug where @code{PyErr_SetObject} hangs when the current
exception has a cycle in its context chain.

@item 
bpo-44856@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44856}: Fix reference leaks in the error paths of @code{update_bases()}
and @code{__build_class__}. Patch by Pablo Galindo.

@item 
bpo-44826@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44826}: Initial implementation of adaptive specialization of STORE_ATTR

Three specialized forms of STORE_ATTR are added:


@itemize *

@item 
STORE_ATTR_SLOT

@item 
STORE_ATTR_SPLIT_KEYS

@item 
STORE_ATTR_WITH_HINT
@end itemize

@item 
bpo-44838@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44838}: Fixed a bug that was causing the parser to raise an incorrect
custom @ref{18f,,SyntaxError} for invalid ‘if’ expressions. Patch by Pablo
Galindo.

@item 
bpo-44821@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44821}: Create instance dictionaries (__dict__) eagerly, to improve
regularity of object layout and assist specialization.

@item 
bpo-44792@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44792}: Improve syntax errors for if expressions. Patch by Miguel Brito

@item 
bpo-34013@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34013}: Generalize the invalid legacy statement custom error message
(like the one generated when “print” is called without parentheses) to
include more generic expressions. Patch by Pablo Galindo

@item 
bpo-44732@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44732}: Rename @code{types.Union} to @code{types.UnionType}.

@item 
bpo-44725@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44725}: Expose specialization stats in python via
@code{_opcode.get_specialization_stats()}.

@item 
bpo-44717@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44717}: Improve AttributeError on circular imports of submodules.

@item 
bpo-44698@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44698}: Fix undefined behaviour in complex object exponentiation.

@item 
bpo-44653@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44653}: Support @ref{10b,,typing} types in parameter substitution in the
union type.

@item 
bpo-44676@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44676}: Add ability to serialise @code{types.Union} objects. Patch
provided by Yurii Karabas.

@item 
bpo-44633@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44633}: Parameter substitution of the union type with wrong types now
raises @code{TypeError} instead of returning @ref{1a3,,NotImplemented}.

@item 
bpo-44661@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44661}: Update @code{property_descr_set} to use vectorcall if possible.
Patch by Donghee Na.

@item 
bpo-44662@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44662}: Add @code{__module__} to @code{types.Union}. This also fixes
@code{types.Union} issues with @code{typing.Annotated}. Patch provided by Yurii
Karabas.

@item 
bpo-44655@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44655}: Include the name of the type in unset __slots__ attribute
errors. Patch by Pablo Galindo

@item 
bpo-44655@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44655}: Don’t include a missing attribute with the same name as the
failing one when offering suggestions for missing attributes. Patch by
Pablo Galindo

@item 
bpo-44646@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44646}: Fix the hash of the union type: it no longer depends on the
order of arguments.

@item 
bpo-44636@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44636}: Collapse union of equal types. E.g. the result of @code{int | int}
is now @code{int}. Fix comparison of the union type with non-hashable
objects. E.g. @code{int | str == @{@}} no longer raises a TypeError.
@end itemize

@node Library<116>,Core and Builtins<114>,Core and Builtins<113>,Python 3 11 0 alpha 1
@anchor{whatsnew/changelog id526}@anchor{1c83}
@subsubsection Library



@itemize -

@item 
bpo-44611@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44611}: On Windows, @ref{747,,os.urandom()}: uses BCryptGenRandom API
instead of CryptGenRandom API which is deprecated from Microsoft Windows
API. Patch by Donghee Na.
@end itemize

@node Core and Builtins<114>,Library<117>,Library<116>,Python 3 11 0 alpha 1
@anchor{whatsnew/changelog id527}@anchor{1c84}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-44635@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44635}: Convert @code{None} to @code{type(None)} in the union type
constructor.

@item 
bpo-26280@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26280}: Implement adaptive specialization for BINARY_SUBSCR

Three specialized forms of BINARY_SUBSCR are added:


@itemize *

@item 
BINARY_SUBSCR_LIST_INT

@item 
BINARY_SUBSCR_TUPLE_INT

@item 
BINARY_SUBSCR_DICT
@end itemize

@item 
bpo-44589@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44589}: Mapping patterns in @code{match} statements with two or more equal
literal keys will now raise a @ref{18f,,SyntaxError} at compile-time.

@item 
bpo-44606@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44606}: Fix @code{__instancecheck__} and @code{__subclasscheck__} for the
union type.

@item 
bpo-42073@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42073}: The @code{@@classmethod} decorator can now wrap other
classmethod-like descriptors.

@item 
bpo-41972@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41972}: Tuned the string-searching algorithm of fastsearch.h to have a
shorter inner loop for most cases.

@item 
bpo-44590@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44590}: All necessary data for executing a Python function (local
variables, stack, etc) is now kept in a per-thread stack. Frame objects
are lazily allocated on demand. This increases performance by about 7% on
the standard benchmark suite. Introspection and debugging are unaffected
as frame objects are always available when needed. Patch by Mark Shannon.

@item 
bpo-44584@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44584}: The threading debug (@code{PYTHONTHREADDEBUG} environment
variable) is deprecated in Python 3.10 and will be removed in Python 3.12.
This feature requires a debug build of Python. Patch by Victor Stinner.

@item 
bpo-43895@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43895}: An obsolete internal cache of shared object file handles added
in 1995 that attempted, but did not guarantee, that a .so would not be
dlopen’ed twice to work around flaws in mid-1990s posix-ish operating
systems has been removed from dynload_shlib.c.
@end itemize

@node Library<117>,Core and Builtins<115>,Core and Builtins<114>,Python 3 11 0 alpha 1
@anchor{whatsnew/changelog id528}@anchor{1c85}
@subsubsection Library



@itemize -

@item 
bpo-44490@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44490}: @ref{10b,,typing} now searches for type parameters in
@code{types.Union} objects. @code{get_type_hints} will also properly resolve
annotations with nested @code{types.Union} objects. Patch provided by Yurii
Karabas.
@end itemize

@node Core and Builtins<115>,Library<118>,Library<117>,Python 3 11 0 alpha 1
@anchor{whatsnew/changelog id529}@anchor{1c86}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-43950@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43950}: Code objects can now provide the column information for
instructions when available. This is levaraged during traceback printing
to show the expressions responsible for errors.

Contributed by Pablo Galindo, Batuhan Taskaya and Ammar Askar as part of
@geindex Python Enhancement Proposals; PEP 657
PEP 657@footnote{https://peps.python.org/pep-0657/}.

@item 
bpo-44562@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44562}: Remove uses of @ref{170f,,PyObject_GC_Del()} in error path when
initializing @ref{9f2,,types.GenericAlias}.
@end itemize

@node Library<118>,Core and Builtins<116>,Core and Builtins<115>,Python 3 11 0 alpha 1
@anchor{whatsnew/changelog id530}@anchor{1c87}
@subsubsection Library



@itemize -

@item 
bpo-41486@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41486}: Fix a memory consumption and copying performance regression in
earlier 3.10 beta releases if someone used an output buffer larger than
4GiB with zlib.decompress on input data that expands that large.
@end itemize

@node Core and Builtins<116>,Library<119>,Library<118>,Python 3 11 0 alpha 1
@anchor{whatsnew/changelog id531}@anchor{1c88}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-43908@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43908}: Heap types with the @ref{3cd,,Py_TPFLAGS_IMMUTABLETYPE} flag
can now inherit the 
@geindex Python Enhancement Proposals; PEP 590
PEP 590@footnote{https://peps.python.org/pep-0590/} vectorcall protocol.  Previously, this was
only possible for @ref{988,,static types}.  Patch by Erlend E.
Aasland.

@item 
bpo-44553@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44553}: Implement GC methods for @code{types.Union} to break reference
cycles and prevent memory leaks.

@item 
bpo-44490@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44490}: Add @code{__parameters__} attribute and @code{__getitem__} operator
to @code{types.Union}. Patch provided by Yurii Karabas.

@item 
bpo-44523@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44523}: Remove the pass-through for @ref{802,,hash()} of
@ref{c4c,,weakref.proxy} objects to prevent unintended consequences when the
original referred object dies while the proxy is part of a hashable
object. Patch by Pablo Galindo.

@item 
bpo-44483@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44483}: Fix a crash in @code{types.Union} objects when creating a union of
an object with bad @code{__module__} field.

@item 
bpo-44486@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44486}: Modules will always have a dictionary, even when created by
@code{types.ModuleType.__new__()}

@item 
bpo-44472@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44472}: Fix ltrace functionality when exceptions are raised. Patch by
Pablo Galindo

@item 
bpo-12022@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12022}: A @ref{199,,TypeError} is now raised instead of an
@ref{5f0,,AttributeError} in @ref{187,,with} and @ref{186,,async with}
statements for objects which do not support the @ref{1e3,,context manager} or
@ref{7f1,,asynchronous context manager} protocols correspondingly.

@item 
bpo-44297@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44297}: Make sure that the line number is set when entering a
comprehension scope. This ensures that backtraces including generator
expressions show the correct line number.

@item 
bpo-44456@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44456}: Improve the syntax error when mixing positional and keyword
patterns. Patch by Pablo Galindo.

@item 
bpo-44409@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44409}: Fix error location information for tokenizer errors raised on
initialization of the tokenizer. Patch by Pablo Galindo.

@item 
bpo-44396@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44396}: Fix a possible crash in the tokenizer when raising syntax
errors for unclosed strings. Patch by Pablo Galindo.

@item 
bpo-44376@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44376}: Exact integer exponentiation (like @code{i**2} or @code{pow(i, 2)})
with a small exponent is much faster, due to reducing overhead in such
cases.

@item 
bpo-44313@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44313}: Directly imported objects and modules (through import and from
import statements) don’t generate @code{LOAD_METHOD}/@code{CALL_METHOD} for
directly accessed objects on their namespace. They now use the regular
@code{LOAD_ATTR}/@code{CALL_FUNCTION}.

@item 
bpo-44338@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44338}: Implement adaptive specialization for LOAD_GLOBAL

Two specialized forms of LOAD_GLOBAL are added:


@itemize *

@item 
LOAD_GLOBAL_MODULE

@item 
LOAD_GLOBAL_BUILTIN
@end itemize

@item 
bpo-44368@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44368}: Improve syntax errors for invalid “as” targets. Patch by Pablo
Galindo

@item 
bpo-44349@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44349}: Fix an edge case when displaying text from files with encoding
in syntax errors. Patch by Pablo Galindo.

@item 
bpo-44337@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44337}: Initial implementation of adaptive specialization of LOAD_ATTR

Four specialized forms of LOAD_ATTR are added:


@itemize *

@item 
LOAD_ATTR_SLOT

@item 
LOAD_ATTR_SPLIT_KEYS

@item 
LOAD_ATTR_WITH_HINT

@item 
LOAD_ATTR_MODULE
@end itemize

@item 
bpo-44335@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44335}: Fix a regression when identifying incorrect characters in
syntax errors. Patch by Pablo Galindo

@item 
bpo-43693@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43693}: Computation of the offsets of cell variables is done in the
compiler instead of at runtime. This reduces the overhead of handling cell
and free variables, especially in the case where a variable is both an
argument and cell variable.

@item 
bpo-44317@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44317}: Improve tokenizer error with improved locations. Patch by Pablo
Galindo.
@end itemize

@node Library<119>,Core and Builtins<117>,Core and Builtins<116>,Python 3 11 0 alpha 1
@anchor{whatsnew/changelog id532}@anchor{1c89}
@subsubsection Library



@itemize -

@item 
bpo-44304@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44304}: Fix a crash in the @ref{d4,,sqlite3} module that happened when the
garbage collector clears @code{sqlite.Statement} objects. Patch by Pablo
Galindo
@end itemize

@node Core and Builtins<117>,Library<120>,Library<119>,Python 3 11 0 alpha 1
@anchor{whatsnew/changelog id533}@anchor{1c8a}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-44305@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44305}: Improve error message for @code{try} blocks without @code{except} or
@code{finally} blocks. Patch by Pablo Galindo.

@item 
bpo-43413@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43413}: Constructors of subclasses of some builtin classes (e.g.
@ref{614,,tuple}, @ref{24f,,list}, @ref{7f3,,frozenset}) no longer accept
arbitrary keyword arguments. [reverted in 3.11a4] Subclass of @ref{185,,set}
can now define a @code{__new__()} method with additional keyword parameters
without overriding also @code{__init__()}.

@item 
bpo-43667@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43667}: Improve Unicode support in non-UTF locales on Oracle Solaris.
This issue does not affect other Solaris systems.

@item 
bpo-43693@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43693}: A new opcode MAKE_CELL has been added that effectively moves
some of the work done on function entry into the compiler and into the
eval loop.  In addition to creating the required cell objects, the new
opcode converts relevant arguments (and other locals) to cell variables on
function entry.

@item 
bpo-44232@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44232}: Fix a regression in @ref{f4a,,type()} when a metaclass raises an
exception. The C function @code{type_new()} must properly report the
exception when a metaclass constructor raises an exception and the winner
class is not the metaclass. Patch by Victor Stinner.

@item 
bpo-44201@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44201}: Avoid side effects of checking for specialized syntax errors in
the REPL that was causing it to ask for extra tokens after a syntax error
had been detected. Patch by Pablo Galindo

@item 
bpo-43693@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43693}: @code{PyCodeObject} gained @code{co_fastlocalnames} and
@code{co_fastlocalkinds} as the authoritative source of fast locals info.
Marshaled code objects have changed accordingly.

@item 
bpo-44184@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44184}: Fix a crash at Python exit when a deallocator function removes
the last strong reference to a heap type. Patch by Victor Stinner.

@item 
bpo-44187@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44187}: Implement quickening in the interpreter. This offers no
advantages as yet, but is an enabler of future optimizations. See PEP 659
for full explanation.

@item 
bpo-44180@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44180}: The parser doesn’t report generic syntax errors that happen in
a position further away that the one it reached in the first pass. Patch
by Pablo Galindo

@item 
bpo-44168@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44168}: Fix error message in the parser involving keyword arguments
with invalid expressions. Patch by Pablo Galindo

@item 
bpo-44156@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44156}: String caches in @code{compile.c} are now subinterpreter
compatible.

@item 
bpo-44143@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44143}: Fixed a crash in the parser that manifest when raising
tokenizer errors when an existing exception was present. Patch by Pablo
Galindo.

@item 
bpo-44032@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44032}: Move ‘fast’ locals and other variables from the frame object to
a per-thread datastack.

@item 
bpo-44114@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44114}: Fix incorrect dictkeys_reversed and dictitems_reversed function
signatures in C code, which broke webassembly builds.

@item 
bpo-44110@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44110}: Improve @code{str.__getitem__()} error message

@item 
bpo-26110@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26110}: Add @code{CALL_METHOD_KW} opcode to speed up method calls with
keyword arguments.  Idea originated from PyPy.  A side effect is executing
@code{CALL_METHOD} is now branchless in the evaluation loop.

@item 
bpo-28307@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28307}: Compiler now optimizes simple C-style formatting with literal
format containing only format codes %s, %r and %a by converting them to
f-string expressions.

@item 
bpo-43149@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43149}: Correct the syntax error message regarding multiple exception
types to not refer to “exception groups”. Patch by Pablo Galindo

@item 
bpo-43822@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43822}: The parser will prioritize tokenizer errors over custom syntax
errors when raising exceptions. Patch by Pablo Galindo.

@item 
bpo-40222@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40222}: “Zero cost” exception handling.


@itemize *

@item 
Uses a lookup table to determine how to handle exceptions.

@item 
Removes SETUP_FINALLY and POP_TOP block instructions, eliminating the runtime overhead of try statements.

@item 
Reduces the size of the frame object by about 60%.
@end itemize

Patch by Mark Shannon

@item 
bpo-43918@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43918}: Document the signature and @code{default} argument in the
docstring of the new @code{anext} builtin.

@item 
bpo-43833@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43833}: Emit a deprecation warning if the numeric literal is
immediately followed by one of keywords: and, else, for, if, in, is, or.
Raise a syntax error with more informative message if it is immediately
followed by other keyword or identifier.

@item 
bpo-43879@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43879}: Add native_thread_id to PyThreadState. Patch by Gabriele N.
Tornetta.

@item 
bpo-43693@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43693}: Compute cell offsets relative to locals in compiler. Allows the
interpreter to treats locals and cells a single array, which is slightly
more efficient. Also make the LOAD_CLOSURE opcode an alias for LOAD_FAST.
Preserving LOAD_CLOSURE helps keep bytecode a bit more readable.

@item 
bpo-17792@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17792}: More accurate error messages for access of unbound locals or
free vars.

@item 
bpo-28146@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28146}: Fix a confusing error message in @ref{834,,str.format()}.

@item 
bpo-11105@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11105}: When compiling @ref{4c4,,ast.AST} objects with recursive
references through @ref{4b2,,compile()}, the interpreter doesn’t crash anymore
instead it raises a @ref{f6e,,RecursionError}.

@item 
bpo-39091@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39091}: Fix crash when using passing a non-exception to a generator’s
@code{throw()} method. Patch by Noah Oxer

@item 
bpo-33346@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33346}: Asynchronous comprehensions are now allowed inside
comprehensions in asynchronous functions.  Outer comprehensions implicitly
become asynchronous.
@end itemize

@node Library<120>,Documentation<39>,Core and Builtins<117>,Python 3 11 0 alpha 1
@anchor{whatsnew/changelog id534}@anchor{1c8b}
@subsubsection Library



@itemize -

@item 
bpo-45371@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45371}: Fix clang rpath issue in @code{distutils}. The UnixCCompiler now
uses correct clang option to add a runtime library directory (rpath) to a
shared library.

@item 
bpo-45329@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45329}: Fix freed memory access in @code{pyexpat.xmlparser} when
building it with an installed expat library <= 2.2.0.

@item 
bpo-41710@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41710}: On Unix, if the @code{sem_clockwait()} function is available in
the C library (glibc 2.30 and newer), the @ref{8a9,,threading.Lock.acquire()}
method now uses the monotonic clock (@ref{8aa,,time.CLOCK_MONOTONIC}) for
the timeout, rather than using the system clock
(@ref{8ab,,time.CLOCK_REALTIME}), to not be affected by system clock
changes. Patch by Victor Stinner.

@item 
bpo-1596321@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1596321}: Fix the @code{threading._shutdown()} function when the
@ref{f3,,threading} module was imported first from a thread different than
the main thread: no longer log an error at Python exit.

@item 
bpo-45274@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45274}: Fix a race condition in the @ref{13f0,,Thread.join()} method of the @ref{f3,,threading} module. If the
function is interrupted by a signal and the signal handler raises an
exception, make sure that the thread remains in a consistent state to
prevent a deadlock. Patch by Victor Stinner.

@item 
bpo-21302@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21302}: In Unix operating systems, @ref{8ae,,time.sleep()} now uses the
@code{nanosleep()} function, if @code{clock_nanosleep()} is not available but
@code{nanosleep()} is available. @code{nanosleep()} allows to sleep with
nanosecond precision.

@item 
bpo-21302@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21302}: On Windows, @ref{8ae,,time.sleep()} now uses a waitable timer which
has a resolution of 100 nanoseconds (10@w{^-7} seconds). Previously,
it had a resolution of 1 millisecond (10@w{^-3} seconds). Patch by
Benjamin Szőke and Victor Stinner.

@item 
bpo-45238@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45238}: Fix @code{unittest.IsolatedAsyncioTestCase.debug()}: it runs now
asynchronous methods and callbacks.

@item 
bpo-36674@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36674}: @ref{1c8c,,unittest.TestCase.debug()} raises now a
@ref{11ea,,unittest.SkipTest} if the class or the test method are decorated
with the skipping decorator.

@item 
bpo-45235@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45235}: Fix an issue where argparse would not preserve values in a
provided namespace when using a subparser with defaults.

@item 
bpo-45183@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45183}: Have zipimport.zipimporter.find_spec() not raise an exception
when the underlying zip file has been deleted and the internal cache has
been reset via invalidate_cache().

@item 
bpo-45234@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45234}: Fixed a regression in @ref{c54,,copyfile()},
@ref{c55,,copy()}, @ref{c56,,copy2()} raising
@ref{266,,FileNotFoundError} when source is a directory, which should raise
@ref{125f,,IsADirectoryError}

@item 
bpo-45228@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45228}: Fix stack buffer overflow in parsing J1939 network address.

@item 
bpo-45225@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45225}: use map function instead of genexpr in capwords.

@item 
bpo-42135@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42135}: Fix typo: @code{importlib.find_loader} is really slated for
removal in Python 3.12 not 3.10, like the others in PR 25169.

Patch by Hugo van Kemenade.

@item 
bpo-20524@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20524}: Improves error messages on @code{.format()} operation for @code{str},
@code{float}, @code{int}, and @code{complex}. New format now shows the problematic
pattern and the object type.

@item 
bpo-45168@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45168}: Change @ref{207,,dis.dis()} output to omit op arg values that cannot
be resolved due to @code{co_consts}, @code{co_names} etc not being provided.
Previously the oparg itself was repeated in the value field, which is not
useful and can be confusing.

@item 
bpo-21302@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21302}: In Unix operating systems, @ref{8ae,,time.sleep()} now uses the
@code{clock_nanosleep()} function, if available, which allows to sleep for an
interval specified with nanosecond precision.

@item 
bpo-45173@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45173}: Remove from the @ref{26,,configparser} module: the
@code{SafeConfigParser} class, the @code{filename} property of the
@ref{72a,,ParsingError} class, the @code{readfp()} method of
the @ref{4df,,ConfigParser} class, deprecated since Python
3.2.

Patch by Hugo van Kemenade.

@item 
bpo-44987@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44987}: Pure ASCII strings are now normalized in constant time by
@ref{8e6,,unicodedata.normalize()}. Patch by Donghee Na.

@item 
bpo-35474@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35474}: Calling @ref{1c8d,,mimetypes.guess_all_extensions()} with
@code{strict=False} no longer affects the result of the following call with
@code{strict=True}. Also, mutating the returned list no longer affects the
global state.

@item 
bpo-45166@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45166}: @ref{8c2,,typing.get_type_hints()} now works with
@ref{56e,,Final} wrapped in @ref{1c1d,,ForwardRef}.

@item 
bpo-45162@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45162}: Remove many old deprecated @ref{10d,,unittest} features:


@itemize *

@item 
“@code{fail*}” and “@code{assert*}” aliases of @ref{2b5,,TestCase} methods.

@item 
Broken from start @ref{2b5,,TestCase} method @code{assertDictContainsSubset()}.

@item 
Ignored @code{<unittest.TestLoader.loadTestsFromModule> TestLoader.loadTestsFromModule()} parameter `use_load_tests'.

@item 
Old alias @code{_TextTestResult} of @ref{755,,TextTestResult}.
@end itemize

@item 
bpo-38371@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38371}: Remove the deprecated @code{split()} method of
@code{_tkinter.TkappType}. Patch by Erlend E. Aasland.

@item 
bpo-20499@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20499}: Improve the speed and accuracy of statistics.pvariance().

@item 
bpo-45132@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45132}: Remove @ref{588,,__getitem__()} methods of
@ref{943,,xml.dom.pulldom.DOMEventStream}, @ref{944,,wsgiref.util.FileWrapper}
and @ref{945,,fileinput.FileInput}, deprecated since Python 3.9.

Patch by Hugo van Kemenade.

@item 
bpo-45129@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45129}: Due to significant security concerns, the `reuse_address'
parameter of @ref{941,,asyncio.loop.create_datagram_endpoint()}, disabled in
Python 3.9, is now entirely removed. This is because of the behavior of
the socket option @code{SO_REUSEADDR} in UDP.

Patch by Hugo van Kemenade.

@item 
bpo-45124@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45124}: The @code{bdist_msi} command, deprecated in Python 3.9, is now
removed.

Use @code{bdist_wheel} (wheel packages) instead.

Patch by Hugo van Kemenade.

@item 
bpo-30856@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30856}: @ref{1373,,unittest.TestResult} methods
@ref{1c8e,,addFailure()},
@ref{1c8f,,addError()},
@ref{1c90,,addSkip()} and
@ref{1c91,,addSubTest()} are now called immediately after
raising an exception in test or finishing a subtest. Previously they were
called only after finishing the test clean up.

@item 
bpo-45034@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45034}: Changes how error is formatted for @code{struct.pack} with @code{'H'}
and @code{'h'} modes and too large / small numbers. Now it shows the actual
numeric limits, while previously it was showing arithmetic expressions.

@item 
bpo-25894@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25894}: @ref{10d,,unittest} now always reports skipped and failed subtests
separately: separate characters in default mode and separate lines in
verbose mode. Also the test description is now output for errors in test
method, class and module cleanups.

@item 
bpo-45081@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45081}: Fix issue when dataclasses that inherit from
@code{typing.Protocol} subclasses have wrong @code{__init__}. Patch provided by
Yurii Karabas.

@item 
bpo-45085@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45085}: The @code{binhex} module, deprecated in Python 3.9, is now
removed. The following @ref{11,,binascii} functions, deprecated in Python
3.9, are now also removed:


@itemize *

@item 
@code{a2b_hqx()}, @code{b2a_hqx()};

@item 
@code{rlecode_hqx()}, @code{rledecode_hqx()}.
@end itemize

The @ref{942,,binascii.crc_hqx()} function remains available.

Patch by Victor Stinner.

@item 
bpo-40360@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40360}: The @code{lib2to3} package is now deprecated and may not be
able to parse Python 3.10 or newer. See the 
@geindex Python Enhancement Proposals; PEP 617
PEP 617@footnote{https://peps.python.org/pep-0617/} (New PEG parser for
CPython). Patch by Victor Stinner.

@item 
bpo-45075@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45075}: Rename @code{traceback.StackSummary.format_frame()} to
@ref{8b4,,traceback.StackSummary.format_frame_summary()}. This method was added
for 3.11 so it was not released yet.

Updated code and docs to better distinguish frame and FrameSummary.

@item 
bpo-31299@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31299}: Add option to completely drop frames from a traceback by
returning @code{None} from a @code{format_frame()}
override.

@item 
bpo-41620@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41620}: @ref{1372,,run()} now always return a
@ref{1373,,TestResult} instance. Previously it returned @code{None} if
the test class or method was decorated with a skipping decorator.

@item 
bpo-45021@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45021}: Fix a potential deadlock at shutdown of forked children when
using @ref{24,,concurrent.futures} module

@item 
bpo-43913@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43913}: Fix bugs in cleaning up classes and modules in @ref{10d,,unittest}:


@itemize *

@item 
Functions registered with @ref{c46,,addModuleCleanup()} were not called unless the user defines @code{tearDownModule()} in their test module.

@item 
Functions registered with @ref{c47,,addClassCleanup()} were not called if @code{tearDownClass} is set to @code{None}.

@item 
Buffering in @ref{1373,,TestResult} did not work with functions registered with @code{addClassCleanup()} and @code{addModuleCleanup()}.

@item 
Errors in functions registered with @code{addClassCleanup()} and @code{addModuleCleanup()} were not handled correctly in buffered and debug modes.

@item 
Errors in @code{setUpModule()} and functions registered with @code{addModuleCleanup()} were reported in wrong order.

@item 
And several lesser bugs.
@end itemize

@item 
bpo-45030@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45030}: Fix integer overflow in pickling and copying the range
iterator.

@item 
bpo-45001@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45001}: Made email date parsing more robust against malformed input,
namely a whitespace-only @code{Date:} header. Patch by Wouter Bolsterlee.

@item 
bpo-45010@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45010}: Remove support of special method @code{__div__} in
@ref{10e,,unittest.mock}. It is not used in Python 3.

@item 
bpo-39218@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39218}: Improve accuracy of variance calculations by using @code{x*x}
instead of @code{x**2}.

@item 
bpo-43613@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43613}: Improve the speed of @ref{84f,,gzip.compress()} and
@ref{1419,,gzip.decompress()} by compressing and decompressing at once in memory
instead of in a streamed fashion.

@item 
bpo-37596@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37596}: Ensure that @ref{185,,set} and @ref{7f3,,frozenset} objects are
always @ref{91,,marshalled} reproducibly.

@item 
bpo-44019@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44019}: A new function @code{operator.call} has been added, such that
@code{operator.call(obj, *args, **kwargs) == obj(*args, **kwargs)}.

@item 
bpo-42255@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42255}: @code{webbrowser.MacOSX} is deprecated and will be removed
in Python 3.13. It is untested and undocumented and also not used by
@ref{11c,,webbrowser} itself. Patch by Donghee Na.

@item 
bpo-44955@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44955}: Method @ref{1556,,stopTestRun()} is now always
called in pair with method @ref{1555,,startTestRun()} for
@ref{1373,,TestResult} objects implicitly created in
@ref{1372,,run()}. Previously it was not called for test
methods and classes decorated with a skipping decorator.

@item 
bpo-39039@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39039}: tarfile.open raises @ref{1c92,,ReadError} when a zlib error
occurs during file extraction.

@item 
bpo-44935@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44935}: @ref{dc,,subprocess} on Solaris now also uses
@ref{52f,,os.posix_spawn()} for better performance.

@item 
bpo-44911@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44911}: @ref{35f,,IsolatedAsyncioTestCase} will no longer throw
an exception while cancelling leaked tasks. Patch by Bar Harel.

@item 
bpo-41322@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41322}: Added @code{DeprecationWarning} for tests and async tests that
return a value!=None (as this may indicate an improperly written test, for
example a test written as a generator function).

@item 
bpo-44524@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44524}: Make exception message more useful when subclass from typing
special form alias. Patch provided by Yurii Karabas.

@item 
bpo-38956@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38956}: @ref{1c35,,argparse.BooleanOptionalAction}’s default value is no
longer printed twice when used with
@ref{1c93,,argparse.ArgumentDefaultsHelpFormatter}.

@item 
bpo-44860@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44860}: Fix the @code{posix_user} scheme in @ref{e1,,sysconfig} to not depend
on @ref{b38,,sys.platlibdir}.

@item 
bpo-44859@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44859}: Improve error handling in @ref{d4,,sqlite3} and raise more
accurate exceptions.


@itemize *

@item 
@ref{1761,,MemoryError} is now raised instead of @ref{1bf9,,sqlite3.Warning} when memory is not enough for encoding a statement to UTF-8 in @code{Connection.__call__()} and @code{Cursor.execute()}.

@item 
@code{UnicodEncodeError} is now raised instead of @ref{1bf9,,sqlite3.Warning} when the statement contains surrogate characters in @code{Connection.__call__()} and @code{Cursor.execute()}.

@item 
@ref{199,,TypeError} is now raised instead of @ref{2ee,,ValueError} for non-string script argument in @code{Cursor.executescript()}.

@item 
@ref{2ee,,ValueError} is now raised for script containing the null character instead of truncating it in @code{Cursor.executescript()}.

@item 
Correctly handle exceptions raised when getting boolean value of the result of the progress handler.

@item 
Add many tests covering different corner cases.
@end itemize

@item 
bpo-44581@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44581}: Upgrade bundled pip to 21.2.3 and setuptools to 57.4.0

@item 
bpo-44849@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44849}: Fix the @ref{1104,,os.set_inheritable()} function on FreeBSD 14 for
file descriptor opened with the @ref{1178,,O_PATH} flag: ignore the
@ref{b5a,,EBADF} error on @code{ioctl()}, fallback on the @code{fcntl()}
implementation. Patch by Victor Stinner.

@item 
bpo-44605@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44605}: The @@functools.total_ordering() decorator now works with
metaclasses.

@item 
bpo-44524@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44524}: Fixed an issue wherein the @code{__name__} and @code{__qualname__}
attributes of subscribed specialforms could be @code{None}.

@item 
bpo-44839@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44839}: @ref{1761,,MemoryError} raised in user-defined functions will now
produce a @code{MemoryError} in @ref{d4,,sqlite3}. @ref{a87,,OverflowError} will
now be converted to @ref{1c94,,DataError}. Previously
@ref{1c95,,OperationalError} was produced in these cases.

@item 
bpo-44822@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44822}: @ref{d4,,sqlite3} user-defined functions and aggregators returning
@ref{16a,,strings} with embedded NUL characters are no longer
truncated. Patch by Erlend E. Aasland.

@item 
bpo-44801@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44801}: Ensure that the @ref{488,,ParamSpec} variable in Callable
can only be substituted with a parameters expression (a list of types, an
ellipsis, ParamSpec or Concatenate).

@item 
bpo-44806@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44806}: Non-protocol subclasses of @ref{56b,,typing.Protocol} ignore now
the @code{__init__} method inherited from protocol base classes.

@item 
bpo-27275@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27275}: @ref{14f9,,collections.OrderedDict.popitem()} and
@code{collections.OrderedDict.pop()} no longer call @code{__getitem__} and
@code{__delitem__} methods of the OrderedDict subclasses.

@item 
bpo-44793@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44793}: Fix checking the number of arguments when subscribe a generic
type with @code{ParamSpec} parameter.

@item 
bpo-44784@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44784}: In importlib.metadata tests, override warnings behavior under
expected DeprecationWarnings (importlib_metadata 4.6.3).

@item 
bpo-44667@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44667}: The @ref{701,,tokenize.tokenize()} doesn’t incorrectly generate a
@code{NEWLINE} token if the source doesn’t end with a new line character but
the last line is a comment, as the function is already generating a @code{NL}
token. Patch by Pablo Galindo

@item 
bpo-44771@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44771}: Added @code{importlib.simple} module implementing adapters from a
low-level resources reader interface to a @code{TraversableResources}
interface. Legacy API (@code{path}, @code{contents}, …) is now supported
entirely by the @code{.files()} API with a compatibility shim supplied for
resource loaders without that functionality. Feature parity with
@code{importlib_resources} 5.2.

@item 
bpo-44752@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44752}: @code{rcompleter} does not call @ref{dd0,,getattr()} on
@ref{4b4,,property} objects to avoid the side-effect of  evaluating the
corresponding method.

@item 
bpo-44747@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44747}: Refactor usage of @code{sys._getframe} in @code{typing} module. Patch
provided by Yurii Karabas.

@item 
bpo-42378@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42378}: Fixes the issue with log file being overwritten when
@ref{1c96,,logging.FileHandler} is used in @ref{d,,atexit} with `filemode' set
to @code{'w'}. Note this will cause the message in `atexit' not being logged
if the log stream is already closed due to shutdown of logging.

@item 
bpo-44720@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44720}: @code{weakref.proxy} objects referencing non-iterators now raise
@code{TypeError} rather than dereferencing the null @code{tp_iternext} slot and
crashing.

@item 
bpo-44704@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44704}: The implementation of @code{collections.abc.Set._hash()} now
matches that of @code{frozenset.__hash__()}.

@item 
bpo-44666@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44666}: Fixed issue in @ref{fe7,,compileall.compile_file()} when
@code{sys.stdout} is redirected. Patch by Stefan Hölzl.

@item 
bpo-44688@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44688}: @ref{888,,sqlite3.Connection.create_collation()} now accepts
non-ASCII collation names. Patch by Erlend E. Aasland.

@item 
bpo-44690@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44690}: Adopt `binacii.a2b_base64'’s strict mode in `base64.b64decode'.

@item 
bpo-42854@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42854}: Fixed a bug in the @code{_ssl} module that was throwing
@ref{a87,,OverflowError} when using @code{_ssl._SSLSocket.write()} and
@code{_ssl._SSLSocket.read()} for a big value of the @code{len} parameter.
Patch by Pablo Galindo.

@item 
bpo-44686@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44686}: Replace @code{unittest.mock._importer} with
@code{pkgutil.resolve_name}.

@item 
bpo-44353@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44353}: Make @code{NewType.__call__} faster by implementing it in C. Patch
provided by Yurii Karabas.

@item 
bpo-44682@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44682}: Change the @ref{aa,,pdb} `commands' directive to disallow setting
commands for an invalid breakpoint and to display an appropriate error.

@item 
bpo-44353@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44353}: Refactor @code{typing.NewType} from function into callable class.
Patch provided by Yurii Karabas.

@item 
bpo-44678@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44678}: Added a separate error message for discontinuous padding in
`binascii.a2b_base64' strict mode.

@item 
bpo-44524@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44524}: Add missing @code{__name__} and @code{__qualname__} attributes to
@code{typing} module classes. Patch provided by Yurii Karabas.

@item 
bpo-40897@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40897}: Give priority to using the current class constructor in
@ref{231,,inspect.signature()}. Patch by Weipeng Hong.

@item 
bpo-44638@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44638}: Add a reference to the zipp project and hint as to how to use
it.

@item 
bpo-44648@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44648}: Fixed wrong error being thrown by @ref{1812,,inspect.getsource()}
when examining a class in the interactive session. Instead of
@ref{199,,TypeError}, it should be @ref{2c2,,OSError} with appropriate error
message.

@item 
bpo-44608@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44608}: Fix memory leak in @code{_tkinter._flatten()} if it is called
with a sequence or set, but not list or tuple.

@item 
bpo-44594@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44594}: Fix an edge case of @code{ExitStack} and
@code{AsyncExitStack} exception chaining.  They will now match @code{with}
block behavior when @code{__context__} is explicitly set to @code{None} when the
exception is in flight.

@item 
bpo-42799@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42799}: In @ref{60,,fnmatch}, the cache size for compiled regex patterns
(@ref{be8,,functools.lru_cache()}) was bumped up from 256 to 32768, affecting
functions: @ref{1c97,,fnmatch.fnmatch()}, @ref{1c98,,fnmatch.fnmatchcase()},
@ref{1c99,,fnmatch.filter()}.

@item 
bpo-41928@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41928}: Update @ref{c54,,shutil.copyfile()} to raise
@ref{266,,FileNotFoundError} instead of confusing @ref{125f,,IsADirectoryError}
when a path ending with a @code{os.path.sep} does not exist;
@ref{c55,,shutil.copy()} and @ref{c56,,shutil.copy2()} are also affected.

@item 
bpo-44569@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44569}: Added the @code{StackSummary.format_frame()} function in
@ref{105,,traceback}. This allows users to customize the way individual lines
are formatted in tracebacks without re-implementing logic to handle
recursive tracebacks.

@item 
bpo-44566@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44566}: handle StopIteration subclass raised from
@@contextlib.contextmanager generator

@item 
bpo-44558@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44558}: Make the implementation consistency of
@ref{ade,,indexOf()} between C and Python versions. Patch by Donghee
Na.

@item 
bpo-41249@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41249}: Fixes @code{TypedDict} to work with @code{typing.get_type_hints()}
and postponed evaluation of annotations across modules.

@item 
bpo-44554@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44554}: Refactor argument processing in @code{pdb.main()} to simplify
detection of errors in input loading and clarify behavior around module or
script invocation.

@item 
bpo-34798@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34798}: Break up paragraph about @ref{1185,,pprint.PrettyPrinter}
construction parameters to make it easier to read.

@item 
bpo-44539@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44539}: Added support for recognizing JPEG files without JFIF or Exif
markers.

@item 
bpo-44461@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44461}: Fix bug with @ref{aa,,pdb}’s handling of import error due to a
package which does not have a @code{__main__} module

@item 
bpo-43625@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43625}: Fix a bug in the detection of CSV file headers by
@ref{1c9a,,csv.Sniffer.has_header()} and improve documentation of same.

@item 
bpo-44516@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44516}: Update vendored pip to 21.1.3

@item 
bpo-42892@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42892}: Fixed an exception thrown while parsing a malformed multipart
email by @ref{580,,email.message.EmailMessage}.

@item 
bpo-44468@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44468}: @ref{8c2,,typing.get_type_hints()} now finds annotations in classes
and base classes with unexpected @code{__module__}. Previously, it skipped
those MRO elements.

@item 
bpo-44491@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44491}: Allow clearing the @ref{d4,,sqlite3} authorizer callback by
passing @ref{887,,None} to @ref{5a9,,set_authorizer()}. Patch
by Erlend E. Aasland.

@item 
bpo-43977@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43977}: Set the proper @ref{1c9b,,Py_TPFLAGS_MAPPING} and
@ref{1c9c,,Py_TPFLAGS_SEQUENCE} flags for subclasses created before a
parent has been registered as a @ref{acd,,collections.abc.Mapping} or
@ref{13d0,,collections.abc.Sequence}.

@item 
bpo-44482@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44482}: Fix very unlikely resource leak in @ref{68,,glob} in alternate
Python implementations.

@item 
bpo-44466@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44466}: The @ref{5c,,faulthandler} module now detects if a fatal error
occurs during a garbage collector collection. Patch by Victor Stinner.

@item 
bpo-44471@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44471}: A @ref{199,,TypeError} is now raised instead of an
@ref{5f0,,AttributeError} in @ref{7ef,,contextlib.ExitStack.enter_context()} and
@ref{7f0,,contextlib.AsyncExitStack.enter_async_context()} for objects which do
not support the @ref{1e3,,context manager} or @ref{7f1,,asynchronous context manager} protocols correspondingly.

@item 
bpo-44404@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44404}: @ref{f6,,tkinter}’s @code{after()} method now supports callables
without the @code{__name__} attribute.

@item 
bpo-41546@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41546}: Make @ref{b3,,pprint} (like the builtin @code{print}) not attempt to
write to @code{stdout} when it is @code{None}.

@item 
bpo-44458@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44458}: @code{BUFFER_BLOCK_SIZE} is now declared static, to avoid linking
collisions when bz2, lmza or zlib are statically linked.

@item 
bpo-44464@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44464}: Remove exception for flake8 in deprecated importlib.metadata
interfaces. Sync with importlib_metadata 4.6.

@item 
bpo-44446@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44446}: Take into account that @code{lineno} might be @code{None} in
@ref{108a,,traceback.FrameSummary}.

@item 
bpo-44439@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44439}: Fix in @code{bz2.BZ2File.write()} / @code{lzma.LZMAFile.write()}
methods, when the input data is an object that supports the buffer
protocol, the file length may be wrong.

@item 
bpo-44434@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44434}: _thread.start_new_thread() no longer calls
PyThread_exit_thread() explicitly at the thread exit, the call was
redundant. On Linux with the glibc, pthread_exit() aborts the whole
process if dlopen() fails to open libgcc_s.so file (ex: EMFILE error).
Patch by Victor Stinner.

@item 
bpo-42972@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42972}: The _thread.RLock type now fully implement the GC protocol: add
a traverse function and the @ref{986,,Py_TPFLAGS_HAVE_GC} flag. Patch by
Victor Stinner.

@item 
bpo-44422@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44422}: The @ref{1c9d,,threading.enumerate()} function now uses a reentrant
lock to prevent a hang on reentrant call. Patch by Victor Stinner.

@item 
bpo-38291@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38291}: Importing typing.io or typing.re now prints a
@code{DeprecationWarning}.

@item 
bpo-37880@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37880}: argparse actions store_const and append_const each receive a
default value of @code{None} when the @code{const} kwarg is not provided.
Previously, this raised a @ref{199,,TypeError}.

@item 
bpo-44389@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44389}: Fix deprecation of @ref{1c9e,,ssl.OP_NO_TLSv1_3}

@item 
bpo-27827@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27827}: @code{pathlib.PureWindowsPath.is_reserved()} now identifies a
greater range of reserved filenames, including those with trailing spaces
or colons.

@item 
bpo-44395@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44395}: Fix @code{as_string()} to pass unixfrom
properly. Patch by Donghee Na.

@item 
bpo-34266@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34266}: Handle exceptions from parsing the arg of @ref{aa,,pdb}’s
run/restart command.

@item 
bpo-44362@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44362}: Improve @ref{d5,,ssl} module’s deprecation messages, error
reporting, and documentation for deprecations.

@item 
bpo-44342@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44342}: [Enum] Change pickling from by-value to by-name.

@item 
bpo-44356@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44356}: [Enum] Allow multiple data-type mixins if they are all the
same.

@item 
bpo-44351@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44351}: Restore back @code{parse_makefile()} in @code{distutils.sysconfig}
because it behaves differently than the similar implementation in
@ref{e1,,sysconfig}.

@item 
bpo-35800@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35800}: @code{smtpd.MailmanProxy} is now removed as it is unusable
without an external module, @code{mailman}. Patch by Donghee Na.

@item 
bpo-44357@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44357}: Added a function that returns cube root of the given number
@ref{873,,math.cbrt()}

@item 
bpo-44339@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44339}: Change @code{math.pow(±0.0, -math.inf)} to return @code{inf} instead
of raising @code{ValueError}. This brings the special-case handling of
@code{math.pow} into compliance with the IEEE 754 standard.

@item 
bpo-44242@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44242}: Remove missing flag check from Enum creation and move into a
@code{verify} decorator.

@item 
bpo-44246@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44246}: In @code{importlib.metadata}, restore compatibility in the result
from @code{Distribution.entry_points} (@code{EntryPoints}) to honor expectations
in older implementations and issuing deprecation warnings for these cases:
A. @code{EntryPoints} objects are once again mutable, allowing   for
@code{sort()} and other list-based mutation operations.   Avoid deprecation
warnings by casting to a   mutable sequence (e.g.
@code{list(dist.entry_points).sort()}). B. @code{EntryPoints} results once again
allow   for access by index. To avoid deprecation warnings,   cast the
result to a Sequence first   (e.g. @code{tuple(dist.entry_points)[0]}).

@item 
bpo-44246@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44246}: In importlib.metadata.entry_points, de-duplication of
distributions no longer requires loading the full metadata for
PathDistribution objects, improving entry point loading performance by
~10x.

@item 
bpo-43858@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43858}: Added a function that returns a copy of a dict of logging
levels: @ref{86b,,logging.getLevelNamesMapping()}

@item 
bpo-44260@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44260}: The @ref{1c9f,,random.Random} constructor no longer reads system
entropy without need.

@item 
bpo-44254@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44254}: On Mac, give turtledemo button text a color that works on both
light or dark background.  Programmers cannot control the latter.

@item 
bpo-44258@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44258}: Support PEP 515 for Fraction’s initialization from string.

@item 
bpo-44235@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44235}: Remove deprecated functions in the @ref{67,,gettext}. Patch by
Donghee Na.

@item 
bpo-38693@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38693}: Prefer f-strings to @code{.format} in importlib.resources.

@item 
bpo-33693@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33693}: Importlib.metadata now prefers f-strings to .format.

@item 
bpo-44241@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44241}: Incorporate minor tweaks from importlib_metadata 4.1:
SimplePath protocol, support for Metadata 2.2.

@item 
bpo-43216@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43216}: Remove the @code{@@asyncio.coroutine} @ref{93f,,decorator} enabling
legacy generator-based coroutines to be compatible with async/await code;
remove @code{asyncio.coroutines.CoroWrapper} used for wrapping legacy
coroutine objects in the debug mode. The decorator has been deprecated
since Python 3.8 and the removal was initially scheduled for Python 3.10.
Patch by Illia Volochii.

@item 
bpo-44210@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44210}: Make importlib.metadata._meta.PackageMetadata public.

@item 
bpo-43643@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43643}: Declare readers.MultiplexedPath.name as a property per the
spec.

@item 
bpo-27334@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27334}: The @ref{d4,,sqlite3} context manager now performs a rollback
(thus releasing the database lock) if commit failed.  Patch by Luca Citi
and Erlend E. Aasland.

@item 
bpo-4928@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4928}: Documented existing behavior on POSIX: NamedTemporaryFiles are
not deleted when creating process is killed with SIGKILL

@item 
bpo-44154@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44154}: Optimize @ref{215,,fractions.Fraction} pickling for large
components.

@item 
bpo-33433@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33433}: For IPv4 mapped IPv6 addresses (
@geindex RFC; RFC 4291
RFC 4291@footnote{https://datatracker.ietf.org/doc/html/rfc4291.html} Section 2.5.5.2),
the @ref{1a06,,ipaddress.IPv6Address.is_private} check is deferred to the
mapped IPv4 address. This solves a bug where public mapped IPv4 addresses
were considered private by the IPv6 check.

@item 
bpo-44150@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44150}: Add optional `weights' argument to statistics.fmean().

@item 
bpo-44142@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44142}: @ref{ae8,,ast.unparse()} will now drop the redundant parentheses
when tuples used as assignment targets (e.g in for loops).

@item 
bpo-44145@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44145}: @ref{6e,,hmac} computations were not releasing the GIL while
calling the OpenSSL @code{HMAC_Update} C API (a new feature in 3.9).  This
unintentionally prevented parallel computation as other @ref{6c,,hashlib}
algorithms support.

@item 
bpo-44095@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44095}: @ref{8da,,zipfile.Path} now supports @ref{8d7,,zipfile.Path.stem},
@ref{8d9,,zipfile.Path.suffixes}, and @ref{8d8,,zipfile.Path.suffix} attributes.

@item 
bpo-44077@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44077}: It’s now possible to receive the type of service (ToS), a.k.a.
differentiated services (DS), a.k.a. differentiated services code point
(DSCP) and explicit congestion notification (ECN) IP header fields with
@code{socket.IP_RECVTOS}.

@item 
bpo-37788@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37788}: Fix a reference leak when a Thread object is never joined.

@item 
bpo-38908@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38908}: Subclasses of @code{typing.Protocol} which only have data
variables declared will now raise a @code{TypeError} when checked with
@code{isinstance} unless they are decorated with @code{runtime_checkable()}.
Previously, these checks passed silently. Patch provided by Yurii Karabas.

@item 
bpo-44098@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44098}: @code{typing.ParamSpec} will no longer be found in the
@code{__parameters__} of most @ref{10b,,typing} generics except in valid use
locations specified by 
@geindex Python Enhancement Proposals; PEP 612
PEP 612@footnote{https://peps.python.org/pep-0612/}. This prevents incorrect usage like
@code{typing.List[P][int]}. This change means incorrect usage which may have
passed silently in 3.10 beta 1 and earlier will now error.

@item 
bpo-44089@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44089}: Allow subclassing @code{csv.Error} in 3.10 (it was allowed in 3.9
and earlier but was disallowed in early versions of 3.10).

@item 
bpo-44081@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44081}: @ref{ae8,,ast.unparse()} now doesn’t use redundant spaces to
separate @code{lambda} and the @code{:} if there are no parameters.

@item 
bpo-44061@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44061}: Fix regression in previous release when calling
@ref{f4d,,pkgutil.iter_modules()} with a list of @ref{268,,pathlib.Path} objects

@item 
bpo-44059@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44059}: Register the SerenityOS Browser in the @ref{11c,,webbrowser}
module.

@item 
bpo-36515@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36515}: The @ref{6c,,hashlib} module no longer does unaligned memory
accesses when compiled for ARM platforms.

@item 
bpo-40465@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40465}: Remove random module features deprecated in Python 3.9.

@item 
bpo-44018@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44018}: random.seed() no longer mutates bytearray inputs.

@item 
bpo-38352@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38352}: Add @code{IO}, @code{BinaryIO}, @code{TextIO}, @code{Match}, and
@code{Pattern} to @code{typing.__all__}. Patch by Jelle Zijlstra.

@item 
bpo-44002@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44002}: @ref{111,,urllib.parse} now uses @code{functool.lru_cache()} for its
internal URL splitting and quoting caches instead of rolling its own like
its the ’90s.

The undocumented internal @ref{111,,urllib.parse} @code{Quoted} class API is now
deprecated, for removal in 3.14.

@item 
bpo-43972@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43972}: When @ref{d3e,,http.server.SimpleHTTPRequestHandler} sends a
@code{301 (Moved Permanently)} for a directory path not ending with @code{/},
add a @code{Content-Length: 0} header. This improves the behavior for certain
clients.

@item 
bpo-28528@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28528}: Fix a bug in @ref{aa,,pdb} where @code{checkline()} raises
@ref{5f0,,AttributeError} if it is called after @code{reset()}.

@item 
bpo-43853@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43853}: Improved string handling for @ref{d4,,sqlite3} user-defined
functions and aggregates:


@itemize *

@item 
It is now possible to pass strings with embedded null characters to UDFs

@item 
Conversion failures now correctly raise @ref{1761,,MemoryError}
@end itemize

Patch by Erlend E. Aasland.

@item 
bpo-43666@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43666}: AIX: @code{Lib/_aix_support.get_platform()} may fail in an AIX
WPAR. The fileset bos.rte appears to have a builddate in both LPAR and
WPAR so this fileset is queried rather than bos.mp64. To prevent a similar
situation (no builddate in ODM) a value (9988) sufficient for completing a
build is provided. Patch by M Felt.

@item 
bpo-43650@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43650}: Fix @ref{1761,,MemoryError} in @ref{697,,shutil.unpack_archive()} which
fails inside @code{shutil._unpack_zipfile()} on large files. Patch by Igor
Bolshakov.

@item 
bpo-43612@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43612}: @ref{850,,zlib.compress()} now accepts a wbits parameter which
allows users to compress data as a raw deflate block without zlib headers
and trailers in one go. Previously this required instantiating a
@code{zlib.compressobj}. It also provides a faster alternative to
@code{gzip.compress} when wbits=31 is used.

@item 
bpo-43392@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43392}: @code{importlib._bootstrap._find_and_load()} now implements a
two-step check to avoid locking when modules have been already imported
and are ready. This improves performance of repeated calls to
@ref{73d,,importlib.import_module()} and @ref{1273,,importlib.__import__()}.

@item 
bpo-43318@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43318}: Fix a bug where @ref{aa,,pdb} does not always echo cleared
breakpoints.

@item 
bpo-43234@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43234}: Prohibit passing
non-@ref{94e,,concurrent.futures.ThreadPoolExecutor} executors to
@code{loop.set_default_executor()} following a deprecation in Python 3.8.
Patch by Illia Volochii.

@item 
bpo-43232@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43232}: Prohibit previously deprecated potentially disruptive
operations on @code{asyncio.trsock.TransportSocket}. Patch by Illia
Volochii.

@item 
bpo-30077@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30077}: Added support for Apple’s aifc/sowt pseudo-compression

@item 
bpo-42971@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42971}: Add definition of @code{errno.EQFULL} for platforms that define
this constant (such as macOS).

@item 
bpo-43086@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43086}: Added a new optional @code{strict_mode} parameter to
`binascii.a2b_base64'. When @code{scrict_mode} is set to @code{True},
the `a2b_base64' function will accept only valid base64 content. More
details about what “valid base64 content” is, can be found in the
function’s documentation.

@item 
bpo-43024@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43024}: Improve the help signature of
@ref{a55,,traceback.print_exception()}, @ref{a53,,traceback.format_exception()} and
@ref{a54,,traceback.format_exception_only()}.

@item 
bpo-33809@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33809}: Add the @ref{8b5,,traceback.TracebackException.print()} method which
prints the formatted exception information.

@item 
bpo-42862@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42862}: @ref{d4,,sqlite3} now utilizes @ref{be8,,functools.lru_cache()} to
implement the connection statement cache. As a small optimisation, the
default statement cache size has been increased from 100 to 128. Patch by
Erlend E. Aasland.

@item 
bpo-41818@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41818}: Soumendra Ganguly: add termios.tcgetwinsize(),
termios.tcsetwinsize().

@item 
bpo-40497@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40497}: @ref{11c8,,subprocess.check_output()} now raises @ref{2ee,,ValueError}
when the invalid keyword argument `check' is passed by user code.
Previously such use would fail later with a @ref{199,,TypeError}. Patch by
Rémi Lapeyre.

@item 
bpo-37449@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37449}: @code{ensurepip} now uses @code{importlib.resources.files()}
traversable APIs

@item 
bpo-40956@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40956}: Use Argument Clinic in @ref{d4,,sqlite3}.  Patches by Erlend E.
Aasland.

@item 
bpo-41730@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41730}: @code{DeprecationWarning} is now raised when importing
@code{tkinter.tix}, which has been deprecated in documentation since
Python 3.6.

@item 
bpo-20684@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20684}: Remove unused @code{_signature_get_bound_param} function from
@ref{82,,inspect} - by Anthony Sottile.

@item 
bpo-41402@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41402}: Fix @ref{1ca0,,email.message.EmailMessage.set_content()} when called
with binary data and @code{7bit} content transfer encoding.

@item 
bpo-32695@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32695}: The `compresslevel' and `preset' keyword arguments of
@ref{107d,,tarfile.open()} are now both documented and tested.

@item 
bpo-41137@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41137}: Use utf-8 encoding while reading .pdbrc files. Patch by
Srinivas Reddy Thatiparthy

@item 
bpo-24391@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24391}: Improved reprs of @ref{f3,,threading} synchronization objects:
@ref{1362,,Semaphore}, @ref{1363,,BoundedSemaphore},
@ref{1364,,Event} and @ref{13ef,,Barrier}.

@item 
bpo-5846@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5846}: Deprecated the following @ref{10d,,unittest} functions, scheduled
for removal in Python 3.13:


@itemize *

@item 
@code{findTestCases()}

@item 
@code{makeSuite()}

@item 
@code{getTestCaseNames()}
@end itemize

Use @ref{593,,TestLoader} methods instead:


@itemize *

@item 
@ref{594,,unittest.TestLoader.loadTestsFromModule()}

@item 
@ref{595,,unittest.TestLoader.loadTestsFromTestCase()}

@item 
@ref{596,,unittest.TestLoader.getTestCaseNames()}
@end itemize

Patch by Erlend E. Aasland.

@item 
bpo-40563@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40563}: Support pathlike objects on dbm/shelve. Patch by Hakan Çelik
and Henry-Joseph Audéoud.

@item 
bpo-34990@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34990}: Fixed a Y2k38 bug in the compileall module where it would fail
to compile files with a modification time after the year 2038.

@item 
bpo-39549@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39549}: Whereas the code for reprlib.Repr had previously used a
hardcoded string value of ‘…’, this PR updates it to use of a
“fillvalue” attribute, whose value defaults to ‘…’ and can be reset in
either individual reprlib.Repr instances or in subclasses thereof.

@item 
bpo-37022@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37022}: @ref{aa,,pdb} now displays exceptions from @code{repr()} with its
@code{p} and @code{pp} commands.

@item 
bpo-38840@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38840}: Fix @code{test___all__} on platforms lacking a shared memory
implementation.

@item 
bpo-39359@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39359}: Add one missing check that the password is a bytes object for
an encrypted zipfile.

@item 
bpo-38741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38741}: @ref{26,,configparser}: using ‘]’ inside a section header will no
longer cut the section name short at the ‘]’

@item 
bpo-38415@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38415}: Added missing behavior to
@ref{d25,,contextlib.asynccontextmanager()} to match
@ref{140e,,contextlib.contextmanager()} so decorated functions can themselves be
decorators.

@item 
bpo-30256@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30256}: Pass multiprocessing BaseProxy argument @code{manager_owned}
through AutoProxy.

@item 
bpo-27513@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27513}: @ref{4f4,,email.utils.getaddresses()} now accepts
@ref{1ca1,,email.header.Header} objects along with string values. Patch by
Zackery Spytz.

@item 
bpo-16379@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16379}: Add SQLite error code and name to @ref{d4,,sqlite3} exceptions.
Patch by Aviv Palivoda, Daniel Shahaf, and Erlend E. Aasland.

@item 
bpo-26228@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26228}: pty.spawn no longer hangs on FreeBSD, macOS, and Solaris.

@item 
bpo-33349@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33349}: lib2to3 now recognizes async generators everywhere.

@item 
bpo-29298@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29298}: Fix @code{TypeError} when required subparsers without @code{dest} do
not receive arguments. Patch by Anthony Sottile.
@end itemize

@node Documentation<39>,Tests<39>,Library<120>,Python 3 11 0 alpha 1
@anchor{whatsnew/changelog id535}@anchor{1ca2}
@subsubsection Documentation



@itemize -

@item 
bpo-45216@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45216}: Remove extra documentation listing methods in @code{difflib}. It
was rendering twice in pydoc and was outdated in some places.

@item 
bpo-45024@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45024}: @ref{1f,,collections.abc} documentation has been expanded to
explicitly cover how instance and subclass checks work, with additional
doctest examples and an exhaustive list of ABCs which test membership
purely by presence of the right @ref{1ca3,,special method}s. Patch by Raymond
Hettinger.

@item 
bpo-44957@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44957}: Promote PEP 604 union syntax by using it where possible. Also,
mention @code{X | Y} more prominently in section about @code{Union} and mention
@code{X | None} at all in section about @code{Optional}.

@item 
bpo-16580@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16580}: Added code equivalents for the @ref{1c75,,int.to_bytes()} and
@ref{1c2c,,int.from_bytes()} methods, as well as tests ensuring that these code
equivalents are valid.

@item 
bpo-44903@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44903}: Removed the @code{othergui.rst} file, any references to it, and
the list of GUI frameworks in the FAQ. In their place I’ve added links to
the Python Wiki page on GUI frameworks@footnote{https://wiki.python.org/moin/GuiProgramming}.

@item 
bpo-33479@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33479}: Tkinter documentation has been greatly expanded with new
“Architecture” and “Threading model” sections.

@item 
bpo-36700@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36700}: @ref{f,,base64} RFC references were updated to point to
@geindex RFC; RFC 4648
RFC 4648@footnote{https://datatracker.ietf.org/doc/html/rfc4648.html}; a section was added to point users to the new “security
considerations” section of the RFC.

@item 
bpo-44740@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44740}: Replaced occurrences of uppercase “Web” and “Internet” with
lowercase versions per the 2016 revised Associated Press Style Book.

@item 
bpo-44693@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44693}: Update the definition of __future__ in the glossary by
replacing the confusing word “pseudo-module” with a more accurate
description.

@item 
bpo-35183@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35183}: Add typical examples to os.path.splitext docs

@item 
bpo-30511@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30511}: Clarify that @ref{6db,,shutil.make_archive()} is not thread-safe due
to reliance on changing the current working directory.

@item 
bpo-44561@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44561}: Update of three expired hyperlinks in
Doc/distributing/index.rst: “Project structure”, “Building and packaging
the project”, and “Uploading the project to the Python Packaging Index”.

@item 
bpo-44651@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44651}: Delete entry “coercion” in Doc/glossary.rst for its outdated
definition.

@item 
bpo-42958@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42958}: Updated the docstring and docs of @ref{1a21,,filecmp.cmp()} to be
more accurate and less confusing especially in respect to `shallow' arg.

@item 
bpo-44631@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44631}: Refactored the @code{repr()} code of the @code{_Environ} (os module).

@item 
bpo-44613@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44613}: importlib.metadata is no longer provisional.

@item 
bpo-44558@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44558}: Match the docstring and python implementation of
@ref{adf,,countOf()} to the behavior of its c implementation.

@item 
bpo-44544@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44544}: List all kwargs for @ref{16d3,,textwrap.wrap()},
@ref{16d2,,textwrap.fill()}, and @ref{11d6,,textwrap.shorten()}. Now, there are nav
links to attributes of @code{TextWrap}, which makes navigation much
easier while minimizing duplication in the documentation.

@item 
bpo-38062@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38062}: Clarify that atexit uses equality comparisons internally.

@item 
bpo-40620@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40620}: Convert examples in tutorial controlflow.rst section 4.3 to be
interpreter-demo style.

@item 
bpo-43066@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43066}: Added a warning to @ref{138,,zipfile} docs: filename arg with a
leading slash may cause archive to be un-openable on Windows systems.

@item 
bpo-39452@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39452}: Rewrote @code{Doc/library/__main__.rst}. Broadened scope of the
document to explicitly discuss and differentiate between @code{__main__.py}
in packages versus the @code{__name__ == '__main__'} expression (and the
idioms that surround it).

@item 
bpo-13814@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13814}: In the Design FAQ, answer “Why don’t generators support the
with statement?”

@item 
bpo-27752@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27752}: Documentation of csv.Dialect is more descriptive.

@item 
bpo-44453@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44453}: Fix documentation for the return type of
@ref{1539,,sysconfig.get_path()}.

@item 
bpo-44392@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44392}: Added a new section in the C API documentation for types used
in type hinting.  Documented @code{Py_GenericAlias} and
@code{Py_GenericAliasType}.

@item 
bpo-38291@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38291}: Mark @code{typing.io} and @code{typing.re} as deprecated since Python
3.8 in the documentation. They were never properly supported by type
checkers.

@item 
bpo-44322@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44322}: Document that SyntaxError args have a details tuple and that
details are adjusted for errors in f-string field replacement expressions.

@item 
bpo-42392@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42392}: Document the deprecation and removal of the @code{loop} parameter
for many functions and classes in @ref{b,,asyncio}.

@item 
bpo-44195@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44195}: Corrected references to @code{TraversableResources} in docs. There
is no @code{TraversableReader}.

@item 
bpo-41963@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41963}: Document that @code{ConfigParser} strips off comments when reading
configuration files.

@item 
bpo-44072@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44072}: Correct where in the numeric ABC hierarchy @code{**} support is
added, i.e., in numbers.Complex, not numbers.Integral.

@item 
bpo-43558@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43558}: Add the remark to @ref{33,,dataclasses} documentation that the
@code{__init__()} of any base class has to be called in
@code{__post_init__()}, along with a code example.

@item 
bpo-44025@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44025}: Clarify when ‘_’ in match statements is a keyword, and when
not.

@item 
bpo-41706@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41706}: Fix docs about how methods like @code{__add__} are invoked when
evaluating operator expressions.

@item 
bpo-41621@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41621}: Document that @ref{13c8,,collections.defaultdict} parameter
@code{default_factory} defaults to @code{None} and is positional-only.

@item 
bpo-41576@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41576}: document BaseException in favor of bare except

@item 
bpo-21760@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21760}: The description for __file__ fixed. Patch by Furkan Onder

@item 
bpo-39498@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39498}: Add a “Security Considerations” index which links to standard
library modules that have explicitly documented security considerations.

@item 
bpo-33479@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33479}: Remove the unqualified claim that tkinter is threadsafe. It has
not been true for several years and likely never was. An explanation of
what is true may be added later, after more discussion, and possibly after
patching _tkinter.c,
@end itemize

@node Tests<39>,Build<46>,Documentation<39>,Python 3 11 0 alpha 1
@anchor{whatsnew/changelog id536}@anchor{1ca4}
@subsubsection Tests



@itemize -

@item 
bpo-40173@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40173}: Fix @ref{1ca5,,test.support.import_helper.import_fresh_module()}.

@item 
bpo-45280@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45280}: Add a test case for empty @ref{32f,,typing.NamedTuple}.

@item 
bpo-45269@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45269}: Cover case when invalid @code{markers} type is supplied to
@code{c_make_encoder}.

@item 
bpo-45128@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45128}: Fix @code{test_multiprocessing_fork} failure due to
@code{test_logging} and @code{sys.modules} manipulation.

@item 
bpo-45209@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45209}: Fix @code{UserWarning: resource_tracker} warning in
@code{_test_multiprocessing._TestSharedMemory.test_shared_memory_cleaned_after_process_termination}

@item 
bpo-45185@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45185}: Enables @code{TestEnumerations} test cases in @code{test_ssl} suite.

@item 
bpo-45195@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45195}: Fix test_readline.test_nonascii(): sometimes, the newline
character is not written at the end, so don’t expect it in the output.
Patch by Victor Stinner.

@item 
bpo-45156@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45156}: Fixes infinite loop on @ref{da0,,unittest.mock.seal()} of mocks
created by @code{create_autospec()}.

@item 
bpo-45125@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45125}: Improves pickling tests and docs of @code{SharedMemory} and
@code{SharableList} objects.

@item 
bpo-44860@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44860}: Update @code{test_sysconfig.test_user_similar()} for the
posix_user scheme: @code{platlib} doesn’t use @ref{b38,,sys.platlibdir}. Patch
by Victor Stinner.

@item 
bpo-45052@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45052}: @code{WithProcessesTestSharedMemory.test_shared_memory_basics}
test was ignored, because @code{self.assertEqual(sms.size, sms2.size)} line
was failing. It is now removed and test is unskipped.

The main motivation for this line to be removed from the test is that the
@code{size} of @code{SharedMemory} is not ever guaranteed to be the same. It is
decided by the platform.

@item 
bpo-44895@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44895}: libregrtest now clears the type cache later to reduce the risk
of false alarm when checking for reference leaks. Previously, the type
cache was cleared too early and libregrtest raised a false alarm about
reference leaks under very specific conditions. Patch by Irit Katriel and
Victor Stinner.

@item 
bpo-45042@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45042}: Fixes that test classes decorated with
@code{@@hashlib_helper.requires_hashdigest} were skipped all the time.

@item 
bpo-25130@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25130}: Add calls of @ref{1b5,,gc.collect()} in tests to support PyPy.

@item 
bpo-45011@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45011}: Made tests relying on the @code{_asyncio} C extension module
optional to allow running on alternative Python implementations. Patch by
Serhiy Storchaka.

@item 
bpo-44949@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44949}: Fix auto history tests of test_readline: sometimes, the newline
character is not written at the end, so don’t expect it in the output.

@item 
bpo-44891@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44891}: Tests were added to clarify @ref{162f,,id()} is preserved when @code{obj
* 1} is used on @ref{16a,,str} and @ref{193,,bytes} objects. Patch by Nikita
Sobolev.

@item 
bpo-44852@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44852}: Add ability to wholesale silence DeprecationWarnings while
running the regression test suite.

@item 
bpo-40928@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40928}: Notify users running test_decimal regression tests on macOS of
potential harmless “malloc can’t allocate region” messages spewed by
test_decimal.

@item 
bpo-44734@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44734}: Fixed floating-point precision issue in turtle tests.

@item 
bpo-44708@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44708}: Regression tests, when run with -w, are now re-running only the
affected test methods instead of re-running the entire test file.

@item 
bpo-42095@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42095}: Added interop tests for Apple plists: generate plist files with
Python plistlib and parse with Apple plutil; and the other way round.

@item 
bpo-44647@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44647}: Added a permanent Unicode-valued environment variable to
regression tests to ensure they handle this use case in the future. If
your test environment breaks because of that, report a bug to us, and
temporarily set PYTHONREGRTEST_UNICODE_GUARD=0 in your test environment.

@item 
bpo-44515@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44515}: Adjust recently added contextlib tests to avoid assuming the
use of a refcounted GC

@item 
bpo-44287@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44287}: Fix asyncio test_popen() of test_windows_utils by using a
longer timeout. Use military grade battle-tested
@ref{1ca6,,test.support.SHORT_TIMEOUT} timeout rather than a hardcoded timeout
of 10 seconds: it’s 30 seconds by default, but it is made longer on slow
buildbots. Patch by Victor Stinner.

@item 
bpo-44451@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44451}: Reset @code{DeprecationWarning} filters in
@code{test.test_importlib.test_metadata_api.APITests.test_entry_points_by_index}
to avoid @code{StopIteration} error if @code{DeprecationWarnings} are ignored.

@item 
bpo-44363@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44363}: Account for address sanitizer in test_capi. test_capi now
passes when run GCC address sanitizer.

@item 
bpo-44364@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44364}: Add non integral tests for @ref{bff,,math.sqrt()} function.

@item 
bpo-43921@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43921}: Fix test_ssl.test_wrong_cert_tls13(): use
@code{suppress_ragged_eofs=False}, since @code{read()} can raise
@ref{1aff,,ssl.SSLEOFError} on Windows. Patch by Victor Stinner.

@item 
bpo-43921@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43921}: Fix test_pha_required_nocert() of test_ssl: catch two more EOF
cases (when the @code{recv()} method returns an empty string). Patch by
Victor Stinner.

@item 
bpo-44131@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44131}: Add test_frozenmain to test_embed to test the
@code{Py_FrozenMain()} C function. Patch by Victor Stinner.

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: Ignore error string case in test_file_not_exists().

@item 
bpo-42083@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42083}: Add test to check that @code{PyStructSequence_NewType} accepts a
@code{PyStructSequence_Desc} with @code{doc} field set to @code{NULL}.

@item 
bpo-35753@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35753}: Fix crash in doctest when doctest parses modules that include
unwrappable functions by skipping those functions.

@item 
bpo-30256@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30256}: Add test for nested queues when using @code{multiprocessing}
shared objects @code{AutoProxy[Queue]} inside @code{ListProxy} and @code{DictProxy}
@end itemize

@node Build<46>,Windows<39>,Tests<39>,Python 3 11 0 alpha 1
@anchor{whatsnew/changelog id537}@anchor{1ca7}
@subsubsection Build



@itemize -

@item 
bpo-45220@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45220}: Avoid building with the Windows 11 SDK previews automatically.
This may be overridden by setting the @code{DefaultWindowsSDKVersion}
environment variable before building.

@item 
bpo-45020@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45020}: Freeze stdlib modules that are imported during startup.  This
provides significant performance improvements to startup.  If necessary,
use the previously added “-X frozen_modules=off” commandline option to
force importing the source modules.

@item 
bpo-45188@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45188}: Windows builds now regenerate frozen modules as the first part
of the build. Previously the regeneration was later in the build, which
would require it to be restarted if any modules had changed.

@item 
bpo-45163@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45163}: Fixes Haiku platform build.

@item 
bpo-45067@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45067}: The ncurses function extended_color_content was introduced in
2017

(@indicateurl{https://invisible-island.net/ncurses/NEWS.html#index-t20170401}).  The

ncurses-devel package in CentOS 7 had a older version ncurses resulted in
compilation error.  For compiling ncurses with extended color support, we
verify the version of the ncurses library >= 20170401.

@item 
bpo-45019@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45019}: Generate lines in relevant files for frozen modules.  Up until
now each of the files had to be edited manually.  This change makes it
easier to add to and modify the frozen modules.

@item 
bpo-44340@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44340}: Add support for building with clang thin lto via
–with-lto=thin/full. Patch by Donghee Na and Brett Holman.

@item 
bpo-44535@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44535}: Enable building using a Visual Studio 2022 install on Windows.

@item 
bpo-43298@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43298}: Improved error message when building without a Windows SDK
installed.

@item 
bpo-44381@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44381}: The Windows build now accepts 
@geindex EnableControlFlowGuard
@geindex environment variable; EnableControlFlowGuard
@code{EnableControlFlowGuard}
set to @code{guard} to enable CFG.

@item 
bpo-41282@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41282}: Fix broken @code{make install} that caused standard library
extension modules to be unnecessarily and incorrectly rebuilt during the
install phase of cpython.
@end itemize

@node Windows<39>,macOS<30>,Build<46>,Python 3 11 0 alpha 1
@anchor{whatsnew/changelog id538}@anchor{1ca8}
@subsubsection Windows



@itemize -

@item 
bpo-45375@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45375}: Fixes an assertion failure due to searching for the standard
library in unnormalised paths.

@item 
bpo-45022@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45022}: Update Windows release to include libffi 3.4.2

@item 
bpo-45007@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45007}: Update to OpenSSL 1.1.1l in Windows build

@item 
bpo-44848@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44848}: Upgrade Windows installer to use SQLite 3.36.0.

@item 
bpo-44572@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44572}: Avoid consuming standard input in the @ref{af,,platform} module

@item 
bpo-44582@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44582}: Accelerate speed of @ref{93,,mimetypes} initialization using a
native implementation of the registry scan.

@item 
bpo-41299@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41299}: Fix 16 milliseconds jitter when using timeouts in
@ref{f3,,threading}, such as with @ref{8a9,,threading.Lock.acquire()} or
@ref{1ca9,,threading.Condition.wait()}.

@item 
bpo-42686@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42686}: Build @ref{d4,,sqlite3} with math functions enabled. Patch by
Erlend E. Aasland.

@item 
bpo-40263@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40263}: This is a follow-on bug from
@indicateurl{https://bugs.python.org/issue26903}. Once that is applied we run into an
off-by-one assertion problem. The assert was not correct.
@end itemize

@node macOS<30>,IDLE<20>,Windows<39>,Python 3 11 0 alpha 1
@anchor{whatsnew/changelog id539}@anchor{1caa}
@subsubsection macOS



@itemize -

@item 
bpo-45007@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45007}: Update macOS installer builds to use OpenSSL 1.1.1l.

@item 
bpo-34602@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34602}: When building CPython on macOS with @code{./configure
--with-undefined-behavior-sanitizer --with-pydebug}, the stack size is
now quadrupled to allow for the entire test suite to pass.

@item 
bpo-44848@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44848}: Update macOS installer to use SQLite 3.36.0.

@item 
bpo-44689@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44689}: @ref{f4b,,ctypes.util.find_library()} now works correctly on macOS
11 Big Sur even if Python is built on an older version of macOS.
Previously, when built on older macOS systems, @code{find_library} was not
able to find  macOS system libraries when running on Big Sur due to
changes in  how system libraries are stored.

@item 
bpo-41972@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41972}: The framework build’s user header path in sysconfig is changed
to add a ‘pythonX.Y’ component to match distutils’s behavior.

@item 
bpo-43109@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43109}: Allow –with-lto configure option to work with Apple-supplied
Xcode or Command Line Tools.

@item 
bpo-34932@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34932}: Add socket.TCP_KEEPALIVE support for macOS. Patch by Shane
Harvey.
@end itemize

@node IDLE<20>,Tools/Demos<27>,macOS<30>,Python 3 11 0 alpha 1
@anchor{whatsnew/changelog id540}@anchor{1cab}
@subsubsection IDLE



@itemize -

@item 
bpo-45296@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45296}: On Windows, change exit/quit message to suggest Ctrl-D, which
works, instead of <Ctrl-Z Return>, which does not work in IDLE.

@item 
bpo-45193@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45193}: Make completion boxes appear on Ubuntu again.

@item 
bpo-40128@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40128}: Mostly fix completions on macOS when not using tcl/tk 8.6.11
(as with 3.9). The added update_idletask call should be harmless and
possibly helpful otherwise.

@item 
bpo-33962@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33962}: Move the indent space setting from the Font tab to the new
Windows tab. Patch by Mark Roseman and Terry Jan Reedy.

@item 
bpo-40468@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40468}: Split the settings dialog General tab into Windows and Shell/ED
tabs. Move help sources, which extend the Help menu, to the Extensions
tab. Make space for new options and shorten the dialog. The latter makes
the dialog better fit small screens.

@item 
bpo-41611@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41611}: Avoid uncaught exceptions in
@code{AutoCompleteWindow.winconfig_event()}.

@item 
bpo-41611@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41611}: Fix IDLE sometimes freezing upon tab-completion on macOS.

@item 
bpo-44010@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44010}: Highlight the new @ref{a14,,match} statement’s @ref{a13,,soft keywords}: @ref{a14,,match}, @code{case}, and
@ref{a15,,_}. However, this highlighting is not
perfect and will be incorrect in some rare cases, including some @code{_}-s
in @code{case} patterns.

@item 
bpo-44026@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44026}: Include interpreter’s typo fix suggestions in message line for
NameErrors and AttributeErrors.  Patch by E. Paine.
@end itemize

@node Tools/Demos<27>,C API<40>,IDLE<20>,Python 3 11 0 alpha 1
@anchor{whatsnew/changelog id541}@anchor{1cac}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-44786@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44786}: Fix a warning in regular expression in the c-analyzer script.

@item 
bpo-44967@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44967}: pydoc now returns a non-zero status code when a module cannot
be found.

@item 
bpo-44978@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44978}: Allow the Argument Clinic tool to handle @code{__complex__}
special methods.

@item 
bpo-43425@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43425}: Removed the ‘test2to3’ demo project that demonstrated using
lib2to3 to support Python 2.x and Python 3.x from a single source in a
distutils package. Patch by Donghee Na

@item 
bpo-44074@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44074}: Make patchcheck automatically detect the correct base branch
name (previously it was hardcoded to ‘master’)

@item 
bpo-20291@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20291}: Added support for variadic positional parameters in Argument
Clinic.
@end itemize

@node C API<40>,,Tools/Demos<27>,Python 3 11 0 alpha 1
@anchor{whatsnew/changelog id542}@anchor{1cad}
@subsubsection C API



@itemize -

@item 
bpo-41710@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41710}: The PyThread_acquire_lock_timed() function now clamps the
timeout if it is too large, rather than aborting the process. Patch by
Victor Stinner.

@item 
bpo-44687@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44687}: @code{BufferedReader.peek()} no longer raises @ref{2ee,,ValueError}
when the entire file has already been buffered.

@item 
bpo-45116@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45116}: Add the @ref{1cae,,Py_ALWAYS_INLINE} macro to ask the compiler
to always inline a static inline function. The compiler can ignore it and
decides to not inline the function. Patch by Victor Stinner.

@item 
bpo-45094@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45094}: Add the @ref{184c,,Py_NO_INLINE} macro to disable inlining on a
function. Patch by Victor Stinner.

@item 
bpo-45061@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45061}: Add a deallocator to the @ref{3c1,,bool} type to detect refcount
bugs in C extensions which call @code{Py_DECREF(Py_True);} or
@code{Py_DECREF(Py_False);} by mistake. Patch by Victor Stinner.

@item 
bpo-42035@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42035}: Add a new @ref{95e,,PyType_GetQualName()} function to get type’s
qualified name.

@item 
bpo-41103@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41103}: Reverts removal of the old buffer protocol because they are
part of stable ABI.

@item 
bpo-44751@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44751}: Remove @code{crypt.h} include from the public @code{Python.h} header.

@item 
bpo-42747@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42747}: The @code{Py_TPFLAGS_HAVE_VERSION_TAG} type flag now does nothing.
The @code{Py_TPFLAGS_HAVE_AM_SEND} flag (which was added in 3.10) is removed.
Both were unnecessary because it is not possible to have type objects with
the relevant fields missing.

@item 
bpo-44530@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44530}: Added the @code{co_qualname} to the @code{PyCodeObject} structure to
propagate the qualified name from the compiler to code objects.

Patch by Gabriele N. Tornetta

@item 
bpo-44441@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44441}: @ref{bc2,,Py_RunMain()} now resets @ref{1b5f,,PyImport_Inittab} to
its initial value at exit. It must be possible to call
@ref{1b60,,PyImport_AppendInittab()} or @ref{1b61,,PyImport_ExtendInittab()} at
each Python initialization. Patch by Victor Stinner.

@item 
bpo-39947@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39947}: Remove 4 private trashcan C API functions which were only kept
for the backward compatibility of the stable ABI with Python 3.8 and
older, since the trashcan API was not usable with the limited C API on
Python 3.8 and older. The trashcan API was excluded from the limited C API
in Python 3.9.

Removed functions:


@itemize *

@item 
_PyTrash_deposit_object()

@item 
_PyTrash_destroy_chain()

@item 
_PyTrash_thread_deposit_object()

@item 
_PyTrash_thread_destroy_chain()
@end itemize

The trashcan C API was never usable with the limited C API, since old
trashcan macros accessed directly @ref{995,,PyThreadState} members like
@code{_tstate->trash_delete_nesting}, whereas the @code{PyThreadState}
structure is opaque in the limited C API.

Exclude also the @code{PyTrash_UNWIND_LEVEL} constant from the C API.

Patch by Victor Stinner.

@item 
bpo-40939@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40939}: Removed documentation for the removed @code{PyParser_*} C API.

@item 
bpo-43795@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43795}: The list in @ref{9a2,,Contents of Limited API} now shows the public name
@ref{991,,PyFrameObject} rather than @code{_frame}. The non-existing entry
@code{_node} no longer appears in the list.

@item 
bpo-44378@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44378}: @ref{1be3,,Py_IS_TYPE()} no longer uses @ref{3c7,,Py_TYPE()} to avoid
a compiler warning: no longer cast @code{const PyObject*} to @code{PyObject*}.
Patch by Victor Stinner.

@item 
bpo-39573@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39573}: Convert the @ref{3c7,,Py_TYPE()} and @ref{98a,,Py_SIZE()} macros to
static inline functions. The @ref{989,,Py_SET_TYPE()} and
@ref{98b,,Py_SET_SIZE()} functions must now be used to set an object type and
size. Patch by Victor Stinner.

@item 
bpo-44263@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44263}: The @ref{985,,PyType_Ready()} function now raises an error if a
type is defined with the @ref{986,,Py_TPFLAGS_HAVE_GC} flag set but has no
traverse function (@ref{987,,PyTypeObject.tp_traverse}). Patch by Victor
Stinner.

@item 
bpo-43795@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43795}: The undocumented function @code{Py_FrozenMain()} is removed
from the Limited API.

@item 
bpo-44113@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44113}: Deprecate the following functions to configure the Python
initialization:


@itemize *

@item 
@code{PySys_AddWarnOptionUnicode()}

@item 
@code{PySys_AddWarnOption()}

@item 
@code{PySys_AddXOption()}

@item 
@code{PySys_HasWarnOptions()}

@item 
@code{Py_SetPath()}

@item 
@code{Py_SetProgramName()}

@item 
@code{Py_SetPythonHome()}

@item 
@code{Py_SetStandardStreamEncoding()}

@item 
@code{_Py_SetProgramFullPath()}
@end itemize

Use the new @ref{3f5,,PyConfig} API of the @ref{646,,Python Initialization Configuration} instead (
@geindex Python Enhancement Proposals; PEP 587
PEP 587@footnote{https://peps.python.org/pep-0587/}).

@item 
bpo-44094@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44094}: Remove @code{PyErr_SetFromErrnoWithUnicodeFilename()},
@code{PyErr_SetFromWindowsErrWithUnicodeFilename()}, and
@code{PyErr_SetExcFromWindowsErrWithUnicodeFilename()}. They are not
documented and have been deprecated since Python 3.3.

@item 
bpo-43795@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43795}: @ref{a9d,,PyCodec_Unregister()} is now properly exported as a
function in the Windows Stable ABI DLL.

@item 
bpo-44029@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44029}: Remove deprecated @code{Py_UNICODE} APIs: @code{PyUnicode_Encode},
@code{PyUnicode_EncodeUTF7}, @code{PyUnicode_EncodeUTF8},
@code{PyUnicode_EncodeUTF16}, @code{PyUnicode_EncodeUTF32},
@code{PyUnicode_EncodeLatin1}, @code{PyUnicode_EncodeMBCS},
@code{PyUnicode_EncodeDecimal}, @code{PyUnicode_EncodeRawUnicodeEscape},
@code{PyUnicode_EncodeCharmap}, @code{PyUnicode_EncodeUnicodeEscape},
@code{PyUnicode_TransformDecimalToASCII}, @code{PyUnicode_TranslateCharmap},
@code{PyUnicodeEncodeError_Create}, @code{PyUnicodeTranslateError_Create}. See
@geindex Python Enhancement Proposals; PEP 393
PEP 393@footnote{https://peps.python.org/pep-0393/} and 
@geindex Python Enhancement Proposals; PEP 624
PEP 624@footnote{https://peps.python.org/pep-0624/} for reference.

@item 
bpo-42035@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42035}: Add a new @ref{95d,,PyType_GetName()} function to get type’s short
name.
@end itemize

@node Python 3 10 0 beta 1,Python 3 10 0 alpha 7,Python 3 11 0 alpha 1,Changelog
@anchor{whatsnew/changelog python-3-10-0-beta-1}@anchor{1caf}
@subsection Python 3.10.0 beta 1


`Release date: 2021-05-03'

@menu
* Security: Security<34>. 
* Core and Builtins: Core and Builtins<118>. 
* Library: Library<121>. 
* Core and Builtins: Core and Builtins<119>. 
* Library: Library<122>. 
* Core and Builtins: Core and Builtins<120>. 
* Library: Library<123>. 
* Documentation: Documentation<40>. 
* Tests: Tests<40>. 
* Build: Build<47>. 
* Windows: Windows<40>. 
* macOS: macOS<31>. 
* IDLE: IDLE<21>. 
* C API: C API<41>. 

@end menu

@node Security<34>,Core and Builtins<118>,,Python 3 10 0 beta 1
@anchor{whatsnew/changelog id543}@anchor{1cb0}
@subsubsection Security



@itemize -

@item 
bpo-43434@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43434}: Creating @ref{54e,,sqlite3.Connection} objects now also produces
@code{sqlite3.connect} and @code{sqlite3.connect/handle} @ref{1cb1,,auditing events}. Previously these events were only produced by
@ref{5a6,,sqlite3.connect()} calls. Patch by Erlend E. Aasland.

@item 
bpo-43998@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43998}: The @ref{d5,,ssl} module sets more secure cipher suites defaults.
Ciphers without forward secrecy and with SHA-1 MAC are disabled by
default. Security level 2 prohibits weak RSA, DH, and ECC keys with less
than 112 bits of security. @ref{355,,SSLContext} defaults to minimum
protocol version TLS 1.2. Settings are based on Hynek Schlawack’s
research.

@item 
bpo-43882@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43882}: The presence of newline or tab characters in parts of a URL
could allow some forms of attacks.

Following the controlling specification for URLs defined by WHATWG
@ref{111,,urllib.parse()} now removes ASCII newlines and tabs from URLs,
preventing such attacks.

@item 
bpo-43472@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43472}: Ensures interpreter-level audit hooks receive the
@code{cpython.PyInterpreterState_New} event when called through the
@code{_xxsubinterpreters} module.

@item 
bpo-43362@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43362}: Fix invalid free in _sha3 module. The issue was introduced in
3.10.0a1. Python 3.9 and earlier are not affected.

@item 
bpo-43762@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43762}: Add audit events for @code{sqlite3.connect/handle()},
@ref{a45,,sqlite3.Connection.enable_load_extension()}, and
@ref{6e0,,sqlite3.Connection.load_extension()}. Patch by Erlend E. Aasland.

@item 
bpo-43756@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43756}: Add new audit event @code{glob.glob/2} to incorporate the new
`root_dir' and `dir_fd' arguments added to @ref{5a0,,glob.glob()} and
@ref{a0e,,glob.iglob()}.

@item 
bpo-36384@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36384}: @ref{84,,ipaddress} module no longer accepts any leading zeros in
IPv4 address strings. Leading zeros are ambiguous and interpreted as octal
notation by some libraries. For example the legacy function
@ref{b60,,socket.inet_aton()} treats leading zeros as octal notation. glibc
implementation of modern @ref{b61,,inet_pton()} does not accept any
leading zeros. For a while the @code{ipaddress} module used to accept
ambiguous leading zeros.

@item 
bpo-43075@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43075}: Fix Regular Expression Denial of Service (ReDoS) vulnerability
in @ref{1cb2,,urllib.request.AbstractBasicAuthHandler}.  The ReDoS-vulnerable
regex has quadratic worst-case complexity and it allows cause a denial of
service when identifying crafted invalid RFCs. This ReDoS issue is on the
client side and needs remote attackers to control the HTTP server.

@item 
bpo-42800@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42800}: Audit hooks are now fired for frame.f_code, traceback.tb_frame,
and generator code/frame attribute access.

@item 
bpo-37363@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37363}: Add audit events to the @ref{73,,http.client} module.
@end itemize

@node Core and Builtins<118>,Library<121>,Security<34>,Python 3 10 0 beta 1
@anchor{whatsnew/changelog id544}@anchor{1cb3}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-43977@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43977}: Prevent classes being both a sequence and a mapping when
pattern matching.

@item 
bpo-43977@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43977}: Use @ref{1cb4,,tp_flags} on the class object to
determine if the subject is a sequence or mapping when pattern matching.
Avoids the need to import @ref{1f,,collections.abc} when pattern matching.

@item 
bpo-43892@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43892}: Restore proper validation of complex literal value patterns
when parsing @code{match} blocks.

@item 
bpo-43933@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43933}: Set frame.f_lineno to the line number of the ‘with’ kweyword
when executing the call to @code{__exit__}.

@item 
bpo-43933@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43933}: If the current position in a frame has no line number then set
the f_lineno attribute to None, instead of -1, to conform to PEP 626. This
should not normally be possible, but might occur in some unusual
circumstances.

@item 
bpo-43963@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43963}: Importing the @code{_signal} module in a subinterpreter has no
longer side effects.

@item 
bpo-42739@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42739}: The internal representation of line number tables is changed to
not use sentinels, and an explicit length parameter is added to the out of
process API function @code{PyLineTable_InitAddressRange}. This makes the
handling of line number tables more robust in some circumstances.
@end itemize

@node Library<121>,Core and Builtins<119>,Core and Builtins<118>,Python 3 10 0 beta 1
@anchor{whatsnew/changelog id545}@anchor{1cb5}
@subsubsection Library



@itemize -

@item 
bpo-43908@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43908}: Make @ref{be,,re} types immutable. Patch by Erlend E. Aasland.

@item 
bpo-43908@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43908}: Make the @ref{4bf,,array.array} type immutable. Patch by Erlend
E. Aasland.
@end itemize

@node Core and Builtins<119>,Library<122>,Library<121>,Python 3 10 0 beta 1
@anchor{whatsnew/changelog id546}@anchor{1cb6}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-43901@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43901}: Change class and module objects to lazy-create empty
annotations dicts on demand.  The annotations dicts are stored in the
object’s __dict__ for backwards compatibility.

@item 
bpo-43892@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43892}: Match patterns now use new dedicated AST nodes (@code{MatchValue},
@code{MatchSingleton}, @code{MatchSequence}, @code{MatchStar}, @code{MatchMapping},
@code{MatchClass}) rather than reusing expression AST nodes. @code{MatchAs} and
@code{MatchOr} are now defined as pattern nodes rather than as expression
nodes. Patch by Nick Coghlan.

@item 
bpo-42725@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42725}: Usage of @code{await}/@code{yield}/@code{yield from} and named
expressions within an annotation is now forbidden when PEP 563 is
activated.

@item 
bpo-43754@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43754}: When performing structural pattern matching (
@geindex Python Enhancement Proposals; PEP 634
PEP 634@footnote{https://peps.python.org/pep-0634/}),
captured names are now left unbound until the `entire' pattern has matched
successfully.

@item 
bpo-42737@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42737}: Annotations for complex targets (everything beside simple
names) no longer cause any runtime effects with @code{from __future__ import
annotations}.

@item 
bpo-43914@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43914}: @ref{18f,,SyntaxError} exceptions raised by the interpreter will
highlight the full error range of the expression that constitutes the
syntax error itself, instead of just where the problem is detected. Patch
by Pablo Galindo.

@item 
bpo-38605@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38605}: Revert making @code{from __future__ import annotations} the
default. This follows the Steering Council decision to postpone PEP 563
changes to at least Python 3.11. See the original email for more
information regarding the decision:
@indicateurl{https://mail.python.org/archives/list/python-dev@@python.org/thread/CLVXXPQ2T2LQ5MP2Y53VVQFCXYWQJHKZ/}.
Patch by Pablo Galindo.

@item 
bpo-43475@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43475}: Hashes of NaN values now depend on object identity.  Formerly,
they always hashed to 0 even though NaN values are not equal to one
another.  Having the same hash for unequal values caused pile-ups in hash
tables.

@item 
bpo-43859@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43859}: Improve the error message for @ref{9b1,,IndentationError}
exceptions. Patch by Pablo Galindo

@item 
bpo-41323@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41323}: Constant tuple folding in bytecode optimizer now reuses tuple
in constant table.

@item 
bpo-43846@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43846}: Data stack usage is much reduced for large literal and call
expressions.

@item 
bpo-38530@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38530}: When printing @ref{450,,NameError} raised by the interpreter,
@code{PyErr_Display()} will offer suggestions of similar variable names
in the function that the exception was raised from. Patch by Pablo Galindo

@item 
bpo-43823@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43823}: Improve syntax errors for invalid dictionary literals. Patch by
Pablo Galindo.

@item 
bpo-43822@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43822}: Improve syntax errors in the parser for missing commas between
expressions. Patch by Pablo Galindo.

@item 
bpo-43798@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43798}: @ref{1cb7,,ast.alias} nodes now include source location metadata
attributes e.g. lineno, col_offset.

@item 
bpo-43797@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43797}: Improve @code{SyntaxError} error messages for invalid comparisons.
Patch by Pablo Galindo.

@item 
bpo-43760@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43760}: Move the flag for checking whether tracing is enabled to the C
stack, from the heap. Should speed up dispatch in the interpreter.

@item 
bpo-43682@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43682}: Static methods (@ref{451,,@@staticmethod}) and class methods
(@ref{48f,,@@classmethod}) now inherit the method attributes (@code{__module__},
@code{__name__}, @code{__qualname__}, @code{__doc__}, @code{__annotations__}) and have
a new @code{__wrapped__} attribute. Patch by Victor Stinner.

@item 
bpo-43751@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43751}: Fixed a bug where @code{anext(ait, default)} would erroneously
return None.

@item 
bpo-42128@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42128}: @ref{1cb8,,__match_args__} is no longer allowed to be a
list.

@item 
bpo-43683@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43683}: Add GEN_START opcode. Marks start of generator, including
async, or coroutine and handles sending values to a newly created
generator or coroutine.
@end itemize

@node Library<122>,Core and Builtins<120>,Core and Builtins<119>,Python 3 10 0 beta 1
@anchor{whatsnew/changelog id547}@anchor{1cb9}
@subsubsection Library



@itemize -

@item 
bpo-43105@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43105}: Importlib now resolves relative paths when creating module spec
objects from file locations.
@end itemize

@node Core and Builtins<120>,Library<123>,Library<122>,Python 3 10 0 beta 1
@anchor{whatsnew/changelog id548}@anchor{1cba}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-43682@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43682}: Static methods (@ref{451,,@@staticmethod}) are now callable as
regular functions. Patch by Victor Stinner.

@item 
bpo-42609@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42609}: Prevented crashes in the AST validator and optimizer when
compiling some absurdly long expressions like @code{"+0"*1000000}.
@ref{f6e,,RecursionError} is now raised instead.

@item 
bpo-38530@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38530}: When printing @ref{5f0,,AttributeError}, @code{PyErr_Display()}
will offer suggestions of similar attribute names in the object that the
exception was raised from. Patch by Pablo Galindo
@end itemize

@node Library<123>,Documentation<40>,Core and Builtins<120>,Python 3 10 0 beta 1
@anchor{whatsnew/changelog id549}@anchor{1cbb}
@subsubsection Library



@itemize -

@item 
bpo-44015@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44015}: In @@dataclass(), raise a TypeError if KW_ONLY is specified more
than once.

@item 
bpo-25478@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25478}: Added a `total()' method to collections.Counter() to compute
the sum of the counts.

@item 
bpo-43733@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43733}: Change @ref{1cbc,,netrc.netrc} to use UTF-8 encoding before using
locale encoding.

@item 
bpo-43979@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43979}: Removed an unnecessary list comprehension before looping from
@ref{320,,urllib.parse.parse_qsl()}.  Patch by Christoph Zwerschke and Donghee
Na.

@item 
bpo-43993@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43993}: Update bundled pip to 21.1.1.

@item 
bpo-43957@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43957}: [Enum] Deprecate @code{TypeError} when non-member is used in a
containment check; In 3.12 @code{True} or @code{False} will be returned instead,
and containment will return @code{True} if the value is either a member of
that enum or one of its members’ value.

@item 
bpo-42904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42904}: For backwards compatibility with previous minor versions of
Python, if @ref{8c2,,typing.get_type_hints()} receives no namespace dictionary
arguments, @code{typing.get_type_hints()} will search through the global
then local namespaces during evaluation of stringized type annotations
(string forward references) inside a class.

@item 
bpo-43945@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43945}: [Enum] Deprecate non-standard mixin format() behavior: in 3.12
the enum member, not the member’s value, will be used for format() calls.

@item 
bpo-41139@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41139}: Deprecate undocumented @code{cgi.log()} API.

@item 
bpo-43937@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43937}: Fixed the @ref{108,,turtle} module working with non-default root
window.

@item 
bpo-43930@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43930}: Update bundled pip to 21.1 and setuptools to 56.0.0

@item 
bpo-43907@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43907}: Fix a bug in the pure-Python pickle implementation when using
protocol 5, where bytearray instances that occur several time in the
pickled object graph would incorrectly unpickle into repeated copies of
the bytearray object.

@item 
bpo-43926@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43926}: In @code{importlib.metadata}, provide a uniform interface to
@code{Description}, allow for any field to be encoded with multiline values,
remove continuation lines from multiline values, and add a @code{.json}
property for easy access to the PEP 566 JSON-compatible form. Sync with
@code{importlib_metadata 4.0}.

@item 
bpo-43920@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43920}: OpenSSL 3.0.0: @ref{10f4,,load_verify_locations()}
now returns a consistent error message when cadata contains no valid
certificate.

@item 
bpo-43607@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43607}: @ref{10f,,urllib} can now convert Windows paths with @code{\\?\}
prefixes into URL paths.

@item 
bpo-43817@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43817}: Add @ref{a1a,,inspect.get_annotations()}, which safely computes the
annotations defined on an object.  It works around the quirks of accessing
the annotations from various types of objects, and makes very few
assumptions about the object passed in. @code{inspect.get_annotations()}
can also correctly un-stringize stringized annotations.

@ref{231,,inspect.signature()}, @code{inspect.from_callable()}, and
@code{inspect.from_function()} now call @ref{a1a,,inspect.get_annotations()} to
retrieve annotations.  This means @code{inspect.signature()} and
@code{inspect.from_callable()} can now un-stringize stringized annotations,
too.

@item 
bpo-43284@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43284}: platform.win32_ver derives the windows version from
sys.getwindowsversion().platform_version which in turn derives the version
from kernel32.dll (which can be of a different version than Windows
itself). Therefore change the platform.win32_ver to determine the version
using the platform module’s _syscmd_ver private function to return an
accurate version.

@item 
bpo-42854@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42854}: The @ref{d5,,ssl} module now uses @code{SSL_read_ex} and
@code{SSL_write_ex} internally. The functions support reading and writing of
data larger than 2 GB. Writing zero-length data no longer fails with a
protocol violation error.

@item 
bpo-42333@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42333}: Port @code{_ssl} extension module to multiphase initialization.

@item 
bpo-43880@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43880}: @ref{d5,,ssl} now raises DeprecationWarning for OP_NO_SSL/TLS*
options, old TLS versions, old protocols, and other features that have
been deprecated since Python 3.6, 3.7, or OpenSSL 1.1.0.

@item 
bpo-41559@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41559}: 
@geindex Python Enhancement Proposals; PEP 612
PEP 612@footnote{https://peps.python.org/pep-0612/} is now implemented purely in Python; builtin
@code{types.GenericAlias} objects no longer include @code{typing.ParamSpec} in
@code{__parameters__} (with the exception of @code{collections.abc.Callable}‘s
@code{GenericAlias}). This means previously invalid uses of @code{ParamSpec}
(such as @code{list[P]}) which worked in earlier versions of Python 3.10
alpha, will now raise @code{TypeError} during substitution.

@item 
bpo-43867@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43867}: The @ref{98,,multiprocessing} @code{Server} class now explicitly
catches @ref{f42,,SystemExit} and closes the client connection in this case.
It happens when the @code{Server.serve_client()} method reaches the end of
file (EOF).

@item 
bpo-40443@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40443}: Remove unused imports: pyclbr no longer uses copy, and typing
no longer uses ast. Patch by Victor Stinner.

@item 
bpo-43820@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43820}: Remove an unneeded copy of the namespace passed to
dataclasses.make_dataclass().

@item 
bpo-43787@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43787}: Add @code{__iter__()} method to @ref{a6c,,bz2.BZ2File},
@ref{65c,,gzip.GzipFile}, and @ref{1212,,lzma.LZMAFile}. It makes iterating
them about 2x faster. Patch by Inada Naoki.

@item 
bpo-43680@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43680}: Deprecate io.OpenWrapper and _pyio.OpenWrapper: use io.open and
_pyio.open instead. Until Python 3.9, _pyio.open was not a static method
and builtins.open was set to OpenWrapper to not become a bound method when
set to a class variable. _io.open is a built-in function whereas
_pyio.open is a Python function. In Python 3.10, _pyio.open() is now a
static method, and builtins.open() is now io.open().

@item 
bpo-43680@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43680}: The Python @code{_pyio.open()} function becomes a static method
to behave as @ref{741,,io.open()} built-in function: don’t become a bound
method when stored as a class variable. It becomes possible since static
methods are now callable in Python 3.10. Moreover,
@code{_pyio.OpenWrapper()} becomes a simple alias to @code{_pyio.open()}.
Patch by Victor Stinner.

@item 
bpo-41515@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41515}: Fix @ref{5e7,,KeyError} raised in @ref{8c2,,typing.get_type_hints()} due
to synthetic modules that don’t appear in @code{sys.modules}.

@item 
bpo-43776@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43776}: When @ref{4b8,,subprocess.Popen} args are provided as a string or
as @ref{268,,pathlib.Path}, the Popen instance repr now shows the right
thing.

@item 
bpo-42248@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42248}: [Enum] ensure exceptions raised in @code{_missing__} are released

@item 
bpo-43744@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43744}: fix issue with enum member name matching the start of a private
variable name

@item 
bpo-43772@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43772}: Fixed the return value of @code{TypeVar.__ror__}. Patch by Jelle
Zijlstra.

@item 
bpo-43764@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43764}: Add match_args parameter to @@dataclass decorator to allow
suppression of __match_args__ generation.

@item 
bpo-43799@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43799}: OpenSSL 3.0.0: define @code{OPENSSL_API_COMPAT} 1.1.1 to suppress
deprecation warnings. Python requires OpenSSL 1.1.1 APIs.

@item 
bpo-43478@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43478}: Mocks can no longer be used as the specs for other Mocks. As a
result, an already-mocked object cannot have an attribute mocked using
@code{autospec=True} or be the subject of a @code{create_autospec(...)} call.
This can uncover bugs in tests since these Mock-derived Mocks will always
pass certain tests (e.g. @ref{2af,,isinstance()}) and builtin assert functions
(e.g. assert_called_once_with) will unconditionally pass.

@item 
bpo-43794@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43794}: Add @ref{a3e,,ssl.OP_IGNORE_UNEXPECTED_EOF} constants (OpenSSL
3.0.0)

@item 
bpo-43785@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43785}: Improve @code{bz2.BZ2File} performance by removing the RLock from
BZ2File. This makes BZ2File thread unsafe in the face of multiple
simultaneous readers or writers, just like its equivalent classes in
@ref{6b,,gzip} and @ref{8e,,lzma} have always been.  Patch by Inada Naoki.

@item 
bpo-43789@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43789}: OpenSSL 3.0.0: Don’t call the password callback function a
second time when first call has signaled an error condition.

@item 
bpo-43788@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43788}: The header files for @ref{d5,,ssl} error codes are now OpenSSL
version-specific. Exceptions will now show correct reason and library
codes. The @code{make_ssl_data.py} script has been rewritten to use OpenSSL’s
text file with error codes.

@item 
bpo-43766@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43766}: Implement 
@geindex Python Enhancement Proposals; PEP 647
PEP 647@footnote{https://peps.python.org/pep-0647/} in the @ref{10b,,typing} module by adding
@code{TypeGuard}.

@item 
bpo-25264@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25264}: @ref{264,,os.path.realpath()} now accepts a `strict' keyword-only
argument. When set to @code{True}, @ref{2c2,,OSError} is raised if a path doesn’t
exist or a symlink loop is encountered.

@item 
bpo-43780@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43780}: In @code{importlib.metadata}, incorporate changes from
importlib_metadata 3.10: Add mtime-based caching during distribution
discovery. Flagged use of dict result from @code{entry_points()} as
deprecated.

@item 
gh-47383@footnote{https://github.com/python/cpython/issues/47383}: The @code{P.args} and @code{P.kwargs} attributes of
@ref{488,,typing.ParamSpec} are now instances of the new classes
@ref{9cf,,typing.ParamSpecArgs} and @ref{9d0,,typing.ParamSpecKwargs}, which
enables a more useful @code{repr()}. Patch by Jelle Zijlstra.

@item 
bpo-43731@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43731}: Add an @code{encoding} parameter @code{logging.fileConfig()}.

@item 
bpo-43712@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43712}: Add @code{encoding} and @code{errors} parameters to
@ref{a06,,fileinput.input()} and @ref{945,,fileinput.FileInput}.

@item 
bpo-38659@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38659}: A @code{simple_enum} decorator is added to the @code{enum} module to
convert a normal class into an Enum. @code{test_simple_enum} added to test
simple enums against a corresponding normal Enum.  Standard library
modules updated to use @code{simple_enum}.

@item 
bpo-43764@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43764}: Fix an issue where @ref{1cb8,,__match_args__} generation
could fail for some @ref{33,,dataclasses}.

@item 
bpo-43752@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43752}: Fix @ref{d4,,sqlite3} regression for zero-sized blobs with
converters, where @code{b""} was returned instead of @code{None}. The regression
was introduced by PR 24723. Patch by Erlend E. Aasland.

@item 
bpo-43655@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43655}: @ref{f6,,tkinter} dialog windows are now recognized as dialogs by
window managers on macOS and X Window.

@item 
bpo-43723@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43723}: The following @code{threading} methods are now deprecated and
should be replaced:


@itemize -

@item 
@code{currentThread} => @ref{35c,,threading.current_thread()}

@item 
@code{activeCount} => @ref{35d,,threading.active_count()}

@item 
@code{Condition.notifyAll} => @ref{357,,threading.Condition.notify_all()}

@item 
@code{Event.isSet} => @ref{358,,threading.Event.is_set()}

@item 
@code{Thread.setName} => @ref{2a2,,threading.Thread.name}

@item 
@code{thread.getName} => @ref{2a2,,threading.Thread.name}

@item 
@code{Thread.isDaemon} => @ref{35a,,threading.Thread.daemon}

@item 
@code{Thread.setDaemon} => @ref{35a,,threading.Thread.daemon}
@end itemize

Patch by Jelle Zijlstra.

@item 
bpo-2135@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2135}: Deprecate find_module() and find_loader() implementations in
importlib and zipimport.

@item 
bpo-43534@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43534}: @ref{1cbd,,turtle.textinput()} and @ref{1cbe,,turtle.numinput()} create now
a transient window working on behalf of the canvas window.

@item 
bpo-43532@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43532}: Add the ability to specify keyword-only fields to dataclasses.
These fields will become keyword-only arguments to the generated __init__.

@item 
bpo-43522@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43522}: Fix problem with
@ref{d7c,,hostname_checks_common_name}. OpenSSL does not copy
hostflags from `struct SSL_CTX' to `struct SSL'.

@item 
bpo-8978@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8978}: Improve error message for @ref{107d,,tarfile.open()} when @ref{8e,,lzma}
/ @ref{14,,bz2} are unavailable.  Patch by Anthony Sottile.

@item 
bpo-42967@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42967}: Allow @ref{193,,bytes} @code{separator} argument in
@code{urllib.parse.parse_qs} and @code{urllib.parse.parse_qsl} when parsing
@ref{16a,,str} query strings. Previously, this raised a @code{TypeError}.

@item 
bpo-43296@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43296}: Improve @ref{d4,,sqlite3} error handling: @code{sqlite3_value_blob()}
errors that set @code{SQLITE_NOMEM} now raise @ref{1761,,MemoryError}. Patch by
Erlend E. Aasland.

@item 
bpo-43312@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43312}: New functions @ref{8a1,,sysconfig.get_preferred_scheme()} and
@ref{1bf8,,sysconfig.get_default_scheme()} are added to query a platform for its
preferred “user”, “home”, and “prefix” (default) scheme names.

@item 
bpo-43265@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43265}: Improve @ref{d79,,sqlite3.Connection.backup()} error handling. The
error message for non-existent target database names is now @code{unknown
database <database name>} instead of @code{SQL logic error}. Patch by Erlend
E. Aasland.

@item 
bpo-41282@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41282}: Install schemes in @code{distutils.command.install} are now loaded
from @ref{e1,,sysconfig}.

@item 
bpo-41282@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41282}: @code{distutils.sysconfig} has been merged to @ref{e1,,sysconfig}.

@item 
bpo-43176@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43176}: Fixed processing of a dataclass that inherits from a frozen
dataclass with no fields.  It is now correctly detected as an error.

@item 
bpo-43080@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43080}: @ref{b3,,pprint} now has support for
@ref{4e2,,dataclasses.dataclass}. Patch by Lewis Gaul.

@item 
bpo-39950@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39950}: Add @code{pathlib.Path.hardlink_to()} method that supersedes
@code{link_to()}. The new method has the same argument order as
@code{symlink_to()}.

@item 
bpo-42904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42904}: @ref{8c2,,typing.get_type_hints()} now checks the local namespace of
a class when evaluating 
@geindex Python Enhancement Proposals; PEP 563
PEP 563@footnote{https://peps.python.org/pep-0563/} annotations inside said class.

@item 
bpo-42269@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42269}: Add @code{slots} parameter to @code{dataclasses.dataclass} decorator
to automatically generate @code{__slots__} for class. Patch provided by Yurii
Karabas.

@item 
bpo-39529@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39529}: Deprecated use of @ref{2f4,,asyncio.get_event_loop()} without
running event loop. Emit deprecation warning for @ref{b,,asyncio} functions
which implicitly create a @ref{dcc,,Future} or
@ref{1c9,,Task} objects if there is no running event loop and no
explicit `loop' argument is passed: @ref{e77,,ensure_future()},
@ref{1cbf,,wrap_future()}, @ref{814,,gather()},
@ref{c6b,,shield()}, @ref{4c7,,as_completed()} and constructors of
@code{Future}, @code{Task},
@ref{17b8,,StreamReader}, @code{StreamReaderProtocol}.

@item 
bpo-18369@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18369}: Certificate and PrivateKey classes were added to the ssl
module. Certificates and keys can now be loaded from memory buffer, too.

@item 
bpo-41486@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41486}: Use a new output buffer management code for @ref{14,,bz2} /
@ref{8e,,lzma} / @ref{13a,,zlib} modules, and add @code{.readall()} function to
@code{_compression.DecompressReader} class. These bring some performance
improvements. Patch by Ma Lin.

@item 
bpo-31870@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31870}: The @ref{a43,,ssl.get_server_certificate()} function now has a
`timeout' parameter.

@item 
bpo-41735@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41735}: Fix thread locks in zlib module may go wrong in rare case.
Patch by Ma Lin.

@item 
bpo-36470@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36470}: Fix dataclasses with @code{InitVar}s and
@ref{1ab0,,replace()}. Patch by Claudiu Popa.

@item 
bpo-40849@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40849}: Expose X509_V_FLAG_PARTIAL_CHAIN ssl flag

@item 
bpo-35114@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35114}: @ref{1cc0,,ssl.RAND_status()} now returns a boolean value (as
documented) instead of @code{1} or @code{0}.

@item 
bpo-39906@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39906}: @ref{a2a,,pathlib.Path.stat()} and @ref{a2b,,chmod()} now
accept a `follow_symlinks' keyword-only argument for consistency with
corresponding functions in the @ref{a5,,os} module.

@item 
bpo-39899@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39899}: @ref{c0f,,os.path.expanduser()} now refuses to guess Windows home
directories if the basename of current user’s home directory does not
match their username.

@ref{1048,,pathlib.Path.expanduser()} and @ref{1049,,home()} now
consistently raise @ref{246,,RuntimeError} exception when a home directory
cannot be resolved. Previously a @ref{5e7,,KeyError} exception could be raised
on Windows when the @code{"USERNAME"}  environment variable was unset.

@item 
bpo-36076@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36076}: Added SNI support to @ref{a43,,ssl.get_server_certificate()}.

@item 
bpo-38490@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38490}: Covariance, Pearson’s correlation, and simple linear regression
functionality was added to statistics module. Patch by Tymoteusz Wołodźko.

@item 
bpo-33731@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33731}: Provide a locale.localize() function, which converts a
normalized number string into a locale format.

@item 
bpo-32745@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32745}: Fix a regression in the handling of ctypes’
@ref{1a9e,,ctypes.c_wchar_p} type: embedded null characters would cause a
@ref{2ee,,ValueError} to be raised. Patch by Zackery Spytz.
@end itemize

@node Documentation<40>,Tests<40>,Library<123>,Python 3 10 0 beta 1
@anchor{whatsnew/changelog id550}@anchor{1cc1}
@subsubsection Documentation



@itemize -

@item 
bpo-43987@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43987}: Add “Annotations Best Practices” document as a new HOWTO.

@item 
bpo-43977@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43977}: Document the new @ref{1c9b,,Py_TPFLAGS_MAPPING} and
@ref{1c9c,,Py_TPFLAGS_SEQUENCE} type flags.

@item 
bpo-43959@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43959}: The documentation on the PyContextVar C-API was clarified.

@item 
bpo-43938@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43938}: Update dataclasses documentation to express that
FrozenInstanceError is derived from AttributeError.

@item 
bpo-43778@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43778}: Fix the Sphinx glossary_search extension: create the _static/
sub-directory if it doesn’t exist.

@item 
bpo-43755@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43755}: Update documentation to reflect that unparenthesized lambda
expressions can no longer be the expression part in an @code{if} clause in
comprehensions and generator expressions since Python 3.9.

@item 
bpo-43739@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43739}: Fixing the example code in Doc/extending/extending.rst to
declare and initialize the pmodule variable to be of the right type.
@end itemize

@node Tests<40>,Build<47>,Documentation<40>,Python 3 10 0 beta 1
@anchor{whatsnew/changelog id551}@anchor{1cc2}
@subsubsection Tests



@itemize -

@item 
bpo-43961@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43961}: Fix test_logging.test_namer_rotator_inheritance() on Windows:
use @ref{12fe,,os.replace()} rather than @ref{12fd,,os.rename()}. Patch by Victor
Stinner.

@item 
bpo-43842@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43842}: Fix a race condition in the SMTP test of test_logging. Don’t
close a file descriptor (socket) from a different thread while
asyncore.loop() is polling the file descriptor. Patch by Victor Stinner.

@item 
bpo-43843@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43843}: @code{test.libregrtest} now marks a test as ENV_CHANGED
(altered the execution environment) if a thread raises an exception but
does not catch it. It sets a hook on @ref{a51,,threading.excepthook()}. Use
@code{--fail-env-changed} option to mark the test as failed. Patch by Victor
Stinner.

@item 
bpo-43811@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43811}: Tests multiple OpenSSL versions on GitHub Actions. Use ccache
to speed up testing.

@item 
bpo-43791@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43791}: OpenSSL 3.0.0: Disable testing of legacy protocols TLS 1.0 and
1.1. Tests are failing with TLSV1_ALERT_INTERNAL_ERROR.
@end itemize

@node Build<47>,Windows<40>,Tests<40>,Python 3 10 0 beta 1
@anchor{whatsnew/changelog id552}@anchor{1cc3}
@subsubsection Build



@itemize -

@item 
bpo-43567@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43567}: Improved generated code refresh (AST/tokens/opcodes/keywords)
on Windows.

@item 
bpo-43669@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43669}: Implement 
@geindex Python Enhancement Proposals; PEP 644
PEP 644@footnote{https://peps.python.org/pep-0644/}. Python now requires OpenSSL 1.1.1 or
newer.
@end itemize

@node Windows<40>,macOS<31>,Build<47>,Python 3 10 0 beta 1
@anchor{whatsnew/changelog id553}@anchor{1cc4}
@subsubsection Windows



@itemize -

@item 
bpo-35306@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35306}: Adds additional arguments to @ref{1cc5,,os.startfile()} function.

@item 
bpo-43538@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43538}: Avoid raising errors from @ref{c11,,pathlib.Path.exists()} when
passed an invalid filename.

@item 
bpo-38822@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38822}: Fixed @ref{26f,,os.stat()} failing on inaccessible directories with
a trailing slash, rather than falling back to the parent directory’s
metadata. This implicitly affected @ref{c09,,os.path.exists()} and
@ref{c0b,,os.path.isdir()}.

@item 
bpo-26227@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26227}: Fixed decoding of host names in @ref{1cc6,,socket.gethostbyaddr()}
and @ref{1cc7,,socket.gethostbyname_ex()}.

@item 
bpo-40432@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40432}: Updated pegen regeneration script on Windows to find and use
Python 3.8 or higher.  Prior to this, pegen regeneration already required
3.8 or higher, but the script may have used lower versions of Python.

@item 
bpo-43745@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43745}: Actually updates Windows release to OpenSSL 1.1.1k. Earlier
releases were mislabelled and actually included 1.1.1i again.

@item 
bpo-43652@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43652}: Update Tcl and Tk to 8.6.11 in Windows installer.

@item 
bpo-43492@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43492}: Upgrade Windows installer to use SQLite 3.35.5.

@item 
bpo-30555@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30555}: Fix @code{WindowsConsoleIO} errors in the presence of fd
redirection. Patch by Segev Finer.
@end itemize

@node macOS<31>,IDLE<21>,Windows<40>,Python 3 10 0 beta 1
@anchor{whatsnew/changelog id554}@anchor{1cc8}
@subsubsection macOS



@itemize -

@item 
bpo-42119@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42119}: Fix check for macOS SDK paths when building Python. Narrow
search to match contents of SDKs, namely only files in
@code{/System/Library}, @code{/System/IOSSupport}, and @code{/usr} other than
@code{/usr/local}. Previously, anything under @code{/System} was assumed to be
in an SDK which causes problems with the new file system layout in 10.15+
where user file systems may appear to be mounted under @code{/System}.  Paths
in @code{/Library} were also incorrectly treated as SDK locations.

@item 
bpo-43568@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43568}: Drop support for MACOSX_DEPLOYMENT_TARGET < 10.3

@item 
bpo-44009@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44009}: Provide “python3.x-intel64” executable to allow reliably
forcing macOS universal2 framework builds to run under Rosetta 2 Intel-64
emulation on Apple Silicon Macs.  This can be useful for testing or when
universal2 wheels are not yet available.

@item 
bpo-43851@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43851}: Build SQLite with @code{SQLITE_OMIT_AUTOINIT} on macOS. Patch by
Erlend E. Aasland.

@item 
bpo-43492@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43492}: Update macOS installer to use SQLite 3.35.4.

@item 
bpo-42235@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42235}: @code{Mac/BuildScript/build-installer.py} will now use
“–enable-optimizations” and @code{--with-lto} when building on macOS 10.15
or later.
@end itemize

@node IDLE<21>,C API<41>,macOS<31>,Python 3 10 0 beta 1
@anchor{whatsnew/changelog id555}@anchor{1cc9}
@subsubsection IDLE



@itemize -

@item 
bpo-37903@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37903}: Add mouse actions to the shell sidebar.  Left click and
optional drag selects one or more lines, as with the editor line number
sidebar.  Right click after selecting raises a context menu with ‘copy
with prompts’.  This zips together prompts from the sidebar with lines
from the selected text.

@item 
bpo-43981@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43981}: Fix reference leak in test_sidebar and test_squeezer. Patches
by Terry Jan Reedy and Pablo Galindo

@item 
bpo-37892@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37892}: Indent IDLE Shell input with spaces instead of tabs

@item 
bpo-43655@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43655}: IDLE dialog windows are now recognized as dialogs by window
managers on macOS and X Window.

@item 
bpo-37903@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37903}: IDLE’s shell now shows prompts in a separate side-bar.
@end itemize

@node C API<41>,,IDLE<21>,Python 3 10 0 beta 1
@anchor{whatsnew/changelog id556}@anchor{1cca}
@subsubsection C API



@itemize -

@item 
bpo-43916@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43916}: Add a new @ref{7a3,,Py_TPFLAGS_DISALLOW_INSTANTIATION} type
flag to disallow creating type instances. Patch by Victor Stinner.

@item 
bpo-43774@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43774}: Remove the now unused @code{PYMALLOC_DEBUG} macro. Debug hooks on
memory allocators are now installed by default if Python is built in debug
mode (if @code{Py_DEBUG} macro is defined). Moreover, they can now be used on
Python build in release mode (ex: using @code{PYTHONMALLOC=debug} environment
variable).

@item 
bpo-43962@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43962}: _PyInterpreterState_IDIncref() now calls
_PyInterpreterState_IDInitref() and always increments id_refcount.
Previously, calling _xxsubinterpreters.get_current() could create an
id_refcount inconsistency when a _xxsubinterpreters.InterpreterID object
was deallocated. Patch by Victor Stinner.

@item 
bpo-28254@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28254}: Add new C-API functions to control the state of the garbage
collector: @ref{aaa,,PyGC_Enable()}, @ref{aab,,PyGC_Disable()},
@ref{aac,,PyGC_IsEnabled()}, corresponding to the functions in the
@ref{64,,gc} module.

@item 
bpo-43908@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43908}: Introduce @ref{3cd,,Py_TPFLAGS_IMMUTABLETYPE} flag for
immutable type objects, and modify @ref{985,,PyType_Ready()} to set it for
static types. Patch by Erlend E. Aasland.

@item 
bpo-43795@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43795}: @ref{10b3,,PyMem_Calloc()} is now available in the limited C API
(@code{Py_LIMITED_API}).

@item 
bpo-43868@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43868}: @ref{7a6,,PyOS_ReadlineFunctionPointer()} is no longer exported by
limited C API headers and by @code{python3.dll} on Windows. Like any function
that takes @code{FILE*}, it is not part of the stable ABI.

@item 
bpo-43795@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43795}: Stable ABI and limited API definitions are generated from a
central manifest (
@geindex Python Enhancement Proposals; PEP 652
PEP 652@footnote{https://peps.python.org/pep-0652/}).

@item 
bpo-43753@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43753}: Add the @ref{aa6,,Py_Is(x@comma{} y)} function to test if the
`x' object is the `y' object, the same as @code{x is y} in Python. Add also
the @ref{aa7,,Py_IsNone()}, @ref{aa8,,Py_IsTrue()}, @ref{aa9,,Py_IsFalse()}
functions to test if an object is, respectively, the @code{None} singleton,
the @code{True} singleton or the @code{False} singleton. Patch by Victor
Stinner.
@end itemize

@node Python 3 10 0 alpha 7,Python 3 10 0 alpha 6,Python 3 10 0 beta 1,Changelog
@anchor{whatsnew/changelog python-3-10-0-alpha-7}@anchor{1ccb}
@subsection Python 3.10.0 alpha 7


`Release date: 2021-04-05'

@menu
* Security: Security<35>. 
* Core and Builtins: Core and Builtins<121>. 
* Library: Library<124>. 
* Core and Builtins: Core and Builtins<122>. 
* Library: Library<125>. 
* Documentation: Documentation<41>. 
* Tests: Tests<41>. 
* Build: Build<48>. 
* Windows: Windows<41>. 
* IDLE: IDLE<22>. 
* C API: C API<42>. 

@end menu

@node Security<35>,Core and Builtins<121>,,Python 3 10 0 alpha 7
@anchor{whatsnew/changelog id557}@anchor{1ccc}
@subsubsection Security



@itemize -

@item 
bpo-42988@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42988}: 
@geindex Common Vulnerabilities and Exposures; CVE 2021-3426
CVE 2021-3426@footnote{https://www.cve.org/CVERecord?id=CVE-2021-3426}: Remove the @code{getfile} feature of the
@ref{ba,,pydoc} module which could be abused to read arbitrary files on the
disk (directory traversal vulnerability). Moreover, even source code of
Python modules can contain sensitive data like passwords. Vulnerability
reported by David Schwörer.

@item 
bpo-43285@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43285}: @ref{62,,ftplib} no longer trusts the IP address value returned
from the server in response to the PASV command by default.  This prevents
a malicious FTP server from using the response to probe IPv4 address and
port combinations on the client network.

Code that requires the former vulnerable behavior may set a
@code{trust_server_pasv_ipv4_address} attribute on their @ref{afc,,ftplib.FTP}
instances to @code{True} to re-enable it.

@item 
bpo-43439@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43439}: Add audit hooks for @ref{a0a,,gc.get_objects()},
@ref{a0b,,gc.get_referrers()} and @ref{a0c,,gc.get_referents()}. Patch by Pablo
Galindo.
@end itemize

@node Core and Builtins<121>,Library<124>,Security<35>,Python 3 10 0 alpha 7
@anchor{whatsnew/changelog id558}@anchor{1ccd}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-27129@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27129}: Update CPython bytecode magic number.

@item 
bpo-43672@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43672}: Raise ImportWarning when calling find_loader().

@item 
bpo-43660@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43660}: Fix crash that happens when replacing @code{sys.stderr} with a
callable that can remove the object while an exception is being printed.
Patch by Pablo Galindo.

@item 
bpo-27129@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27129}: The bytecode interpreter uses instruction, rather byte, offsets
internally. This reduces the number of EXTENDED_ARG instructions needed
and streamlines instruction dispatch a bit.
@end itemize

@node Library<124>,Core and Builtins<122>,Core and Builtins<121>,Python 3 10 0 alpha 7
@anchor{whatsnew/changelog id559}@anchor{1cce}
@subsubsection Library



@itemize -

@item 
bpo-40645@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40645}: Fix reference leak in the @code{_hashopenssl} extension. Patch
by Pablo Galindo.
@end itemize

@node Core and Builtins<122>,Library<125>,Library<124>,Python 3 10 0 alpha 7
@anchor{whatsnew/changelog id560}@anchor{1ccf}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-42134@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42134}: Calls to find_module() by the import system now raise
ImportWarning.

@item 
bpo-41064@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41064}: Improve the syntax error for invalid usage of double starred
elements (‘**’) in f-strings. Patch by Pablo Galindo.

@item 
bpo-43575@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43575}: Speed up calls to @code{map()} by using the 
@geindex Python Enhancement Proposals; PEP 590
PEP 590@footnote{https://peps.python.org/pep-0590/}
@code{vectorcall} calling convention. Patch by Donghee Na.

@item 
bpo-42137@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42137}: The import system now prefers using @code{__spec__} for
@code{ModuleType.__repr__} over @code{module_repr()}.

@item 
bpo-43452@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43452}: Added micro-optimizations to @code{_PyType_Lookup()} to improve
cache lookup performance in the common case of cache hits.

@item 
bpo-43555@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43555}: Report the column offset for @ref{18f,,SyntaxError} for invalid
line continuation characters. Patch by Pablo Galindo.

@item 
bpo-43517@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43517}: Fix misdetection of circular imports when using @code{from pkg.mod
import attr}, which caused false positives in non-trivial multi-threaded
code.

@item 
bpo-43497@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43497}: Emit SyntaxWarnings for assertions with tuple constants, this
is a regression introduced in python3.7

@item 
bpo-39316@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39316}: Tracing now has correct line numbers for attribute accesses
when the attribute is on a different line from the object. Improves
debugging and profiling for multi-line method chains.

@item 
bpo-35883@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35883}: Python no longer fails at startup with a fatal error if a
command line argument contains an invalid Unicode character. The
@ref{dc6,,Py_DecodeLocale()} function now escapes byte sequences which would
be decoded as Unicode characters outside the [U+0000; U+10ffff] range.

@item 
bpo-43410@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43410}: Fix a bug that was causing the parser to crash when emitting
syntax errors when reading input from stdin. Patch by Pablo Galindo

@item 
bpo-43406@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43406}: Fix a possible race condition where @code{PyErr_CheckSignals}
tries to execute a non-Python signal handler.

@item 
bpo-42128@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42128}: Add @code{__match_args__} to @ref{13cb,,struct sequence objects}. Patch by Pablo Galindo.

@item 
bpo-43390@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43390}: CPython now sets the @code{SA_ONSTACK} flag in @code{PyOS_setsig} for
the VM’s default signal handlers.  This is friendlier to other in-process
code that an extension module or embedding use could pull in (such as
Golang’s cgo) where tiny thread stacks are the norm and @code{sigaltstack()}
has been used to provide for signal handlers.  This is a no-op change for
the vast majority of processes that don’t use sigaltstack.

@item 
bpo-43287@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43287}: Speed up calls to @code{filter()} by using the 
@geindex Python Enhancement Proposals; PEP 590
PEP 590@footnote{https://peps.python.org/pep-0590/}
@code{vectorcall} calling convention. Patch by Donghee Na.

@item 
bpo-37448@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37448}: Add a radix tree based memory map to track in-use obmalloc
arenas. Use to replace the old implementation of address_in_range(). The
radix tree approach makes it easy to increase pool sizes beyond the OS
page size. Boosting the pool and arena size allows obmalloc to handle a
significantly higher percentage of requests from its ultra-fast paths.

It also has the advantage of eliminating the memory unsanitary behavior of
the previous address_in_range(). The old address_in_range() was marked
with the annotations _Py_NO_SANITIZE_ADDRESS, _Py_NO_SANITIZE_THREAD, and
_Py_NO_SANITIZE_MEMORY. Those annotations are no longer needed.

To disable the radix tree map, set a preprocessor flag as follows:
@code{-DWITH_PYMALLOC_RADIX_TREE=0}.

Co-authored-by: Tim Peters <@email{tim.peters@@gmail.com}>

@item 
bpo-29988@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29988}: Only handle asynchronous exceptions and requests to drop the
GIL when returning from a call or on the back edges of loops. Makes sure
that @ref{150c,,__exit__()} is always called in with statements, even
for interrupts.
@end itemize

@node Library<125>,Documentation<41>,Core and Builtins<122>,Python 3 10 0 alpha 7
@anchor{whatsnew/changelog id561}@anchor{1cd0}
@subsubsection Library



@itemize -

@item 
bpo-43720@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43720}: Document various stdlib deprecations in imp, pkgutil, and
importlib.util for removal in Python 3.12.

@item 
bpo-43433@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43433}: @ref{c52,,xmlrpc.client.ServerProxy} no longer ignores query and
fragment in the URL of the server.

@item 
bpo-31956@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31956}: The @ref{9e7,,index()} method of @ref{4bf,,array.array}
now has optional `start' and `stop' parameters.

@item 
bpo-40066@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40066}: Enum: adjust @code{repr()} to show only enum and member name (not
value, nor angle brackets) and @code{str()} to show only member name.  Update
and improve documentation to match.

@item 
bpo-42136@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42136}: Deprecate all module_repr() methods found in importlib as their
use is being phased out by Python 3.12.

@item 
bpo-35930@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35930}: Raising an exception raised in a “future” instance will create
reference cycles.

@item 
bpo-41369@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41369}: Finish updating the vendored libmpdec to version 2.5.1.  Patch
by Stefan Krah.

@item 
bpo-43422@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43422}: Revert the _decimal C API which was added in bpo-41324@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41324}.

@item 
bpo-43577@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43577}: Fix deadlock when using @ref{355,,ssl.SSLContext} debug callback
with @ref{1774,,ssl.SSLContext.sni_callback()}.

@item 
bpo-43571@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43571}: It’s now possible to create MPTCP sockets with IPPROTO_MPTCP

@item 
bpo-43542@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43542}: @code{image/heic} and @code{image/heif} were added to
@ref{93,,mimetypes}.

@item 
bpo-40645@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40645}: The @ref{6e,,hmac} module now uses OpenSSL’s HMAC implementation
when digestmod argument is a hash name or builtin hash function.

@item 
bpo-43510@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43510}: Implement 
@geindex Python Enhancement Proposals; PEP 597
PEP 597@footnote{https://peps.python.org/pep-0597/}: Add @code{EncodingWarning} warning, @code{-X
warn_default_encoding} option, 
@geindex PYTHONWARNDEFAULTENCODING
@geindex environment variable; PYTHONWARNDEFAULTENCODING
@ref{9c5,,PYTHONWARNDEFAULTENCODING}
environment variable and @code{encoding="locale"} argument value.

@item 
bpo-43521@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43521}: @code{ast.unparse} can now render NaNs and empty sets.

@item 
bpo-42914@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42914}: @ref{a2f,,pprint.pprint()} gains a new boolean
@code{underscore_numbers} optional argument to emit integers with thousands
separated by an underscore character for improved readability (for example
@code{1_000_000} instead of @code{1000000}).

@item 
bpo-41361@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41361}: @ref{1cd1,,rotate()} calls are now slightly faster
due to faster argument parsing.

@item 
bpo-43423@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43423}: @code{subprocess.communicate()} no longer raises an IndexError
when there is an empty stdout or stderr IO buffer during a timeout on
Windows.

@item 
bpo-27820@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27820}: Fixed long-standing bug of smtplib.SMTP where doing AUTH LOGIN
with initial_response_ok=False will fail.

The cause is that SMTP.auth_login _always_ returns a password if provided
with a challenge string, thus non-compliant with the standard for AUTH
LOGIN.

Also fixes bug with the test for smtpd.

@item 
bpo-43445@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43445}: Add frozen modules to @ref{a48,,sys.stdlib_module_names}. For
example, add @code{"_frozen_importlib"} and @code{"_frozen_importlib_external"}
names.

@item 
bpo-43245@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43245}: Add keyword arguments support to @code{ChainMap.new_child()}.

@item 
bpo-29982@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29982}: Add optional parameter `ignore_cleanup_errors' to
@ref{1440,,tempfile.TemporaryDirectory()} and allow multiple @code{cleanup()}
attempts. Contributed by C.A.M. Gerlach.

@item 
bpo-43428@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43428}: Include changes from importlib_metadata 3.7@footnote{https://importlib-metadata.readthedocs.io/en/latest/history.html#v3-7-0}:

Performance enhancements to distribution discovery.

@code{entry_points} only returns unique distributions.

Introduces new @code{EntryPoints} object for containing a set of entry points
with convenience methods for selecting entry points by group or name.
@code{entry_points} now returns this object if selection parameters are
supplied but continues to return a dict object for compatibility. Users
are encouraged to rely on the selection interface. The dict object result
is likely to be deprecated in the future.

Added packages_distributions function to return a mapping of packages to
the distributions that provide them.

@item 
bpo-43332@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43332}: Improves the networking efficiency of @ref{73,,http.client} when
using a proxy via @code{set_tunnel()}.  Fewer small send
calls are made during connection setup.

@item 
bpo-43420@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43420}: Improve performance of @ref{215,,fractions.Fraction} arithmetics
for large components.  Contributed by Sergey B. Kirpichev.

@item 
bpo-43356@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43356}: Allow passing a signal number to @code{_thread.interrupt_main()}.

@item 
bpo-43399@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43399}: Fix @code{ElementTree.extend} not working on iterators when using
the Python implementation

@item 
bpo-43369@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43369}: Improve @ref{d4,,sqlite3} error handling: If
@code{sqlite3_column_text()} and @code{sqlite3_column_blob()} set
@code{SQLITE_NOMEM}, @ref{1761,,MemoryError} is now raised. Patch by Erlend E.
Aasland.

@item 
bpo-43368@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43368}: Fix a regression introduced in PR 24562, where an empty
bytestring was fetched as @code{None} instead of @code{b'@w{'}} in @ref{d4,,sqlite3}.
Patch by Mariusz Felisiak.

@item 
bpo-41282@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41282}: Fixed stacklevel of @code{DeprecationWarning} emitted from
@code{import distutils}.

@item 
bpo-42129@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42129}: @code{importlib.resources} now honors namespace packages, merging
resources from each location in the namespace as introduced in
@code{importlib_resources} 3.2 and including incidental changes through
5.0.3.

@item 
bpo-43295@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43295}: @ref{1994,,datetime.datetime.strptime()} now raises @code{ValueError}
instead of @code{IndexError} when matching @code{'z'} with the @code{%z} format
specifier.

@item 
bpo-43125@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43125}: Return empty string if base64mime.body_encode receive empty
bytes

@item 
bpo-43084@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43084}: @ref{1cd2,,curses.window.enclose()} returns now @code{True} or @code{False}
(as was documented) instead of @code{1} or @code{0}.

@item 
bpo-42994@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42994}: Add MIME types for opus, AAC, 3gpp and 3gpp2

@item 
bpo-14678@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14678}: Add an invalidate_caches() method to the zipimport.zipimporter
class to support importlib.invalidate_caches(). Patch by Desmond Cheong.

@item 
bpo-42782@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42782}: Fail fast in @ref{c57,,shutil.move()} to avoid creating destination
directories on failure.

@item 
bpo-40066@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40066}: Enum’s @code{repr()} and @code{str()} have changed: @code{repr()} is now
`EnumClass.MemberName' and @code{str()} is `MemberName'.  Additionally,
stdlib Enum’s whose contents are available as module attributes, such as
@code{RegexFlag.IGNORECASE}, have their @code{repr()} as `module.name', e.g.
@code{re.IGNORECASE}.

@item 
bpo-26053@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26053}: Fixed bug where the @ref{aa,,pdb} interactive run command echoed
the args from the shell command line, even if those have been overridden
at the pdb prompt.

@item 
bpo-24160@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24160}: Fixed bug where breakpoints did not persist across multiple
debugger sessions in @ref{aa,,pdb}’s interactive mode.

@item 
bpo-40701@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40701}: When the @ref{1cd3,,tempfile.tempdir} global variable is set to a
value of type bytes, it is now handled consistently.  Previously
exceptions could be raised from some tempfile APIs when the directory did
not already exist in this situation.  Also ensures that the
@ref{1cd4,,tempfile.gettempdir()} and @ref{1cd5,,tempfile.gettempdirb()} functions
`always' return @code{str} and @code{bytes} respectively.

@item 
bpo-39342@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39342}: Expose @code{X509_V_FLAG_ALLOW_PROXY_CERTS} as
@ref{1cd6,,VERIFY_ALLOW_PROXY_CERTS} to allow proxy certificate
validation as explained in
@indicateurl{https://docs.openssl.org/1.1.1/man7/proxy-certificates/}.

@item 
bpo-31861@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31861}: Add builtins.aiter and builtins.anext. Patch by Joshua Bronson
(@@jab), Daniel Pope (@@lordmauve), and Justin Wang (@@justin39).
@end itemize

@node Documentation<41>,Tests<41>,Library<125>,Python 3 10 0 alpha 7
@anchor{whatsnew/changelog id562}@anchor{1cd7}
@subsubsection Documentation



@itemize -

@item 
bpo-43199@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43199}: Answer “Why is there no goto?” in the Design and History FAQ.

@item 
bpo-43407@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43407}: Clarified that a result from @ref{55c,,time.monotonic()},
@ref{c80,,time.perf_counter()}, @ref{c81,,time.process_time()}, or
@ref{b36,,time.thread_time()} can be compared with the result from any
following call to the same function - not just the next immediate call.

@item 
bpo-43354@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43354}: Fix type documentation for @code{Fault.faultCode}; the type has to
be @code{int} instead of @code{str}.

@item 
bpo-41933@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41933}: Clarified wording of s * n in the Common Sequence Operations
@end itemize

@node Tests<41>,Build<48>,Documentation<41>,Python 3 10 0 alpha 7
@anchor{whatsnew/changelog id563}@anchor{1cd8}
@subsubsection Tests



@itemize -

@item 
bpo-37945@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37945}: Fix test_getsetlocale_issue1813() of test_locale: skip the test
if @code{setlocale()} fails. Patch by Victor Stinner.

@item 
bpo-41561@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41561}: Add workaround for Ubuntu’s custom OpenSSL security level
policy.
@end itemize

@node Build<48>,Windows<41>,Tests<41>,Python 3 10 0 alpha 7
@anchor{whatsnew/changelog id564}@anchor{1cd9}
@subsubsection Build



@itemize -

@item 
bpo-43179@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43179}: Introduce and correctly use ALIGNOF_X in place of SIZEOF_X for
alignment-related code in optimized string routines. Patch by Jessica
Clarke.

@item 
bpo-43631@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43631}: Update macOS, Windows, and CI to OpenSSL 1.1.1k.

@item 
bpo-43617@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43617}: Improve configure.ac: Check for presence of autoconf-archive
package and remove our copies of M4 macros.

@item 
bpo-43466@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43466}: The @code{configure} script now supports @code{--with-openssl-rpath}
option.

@item 
bpo-43372@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43372}: Use @code{_freeze_importlib} to generate code for the
@code{__hello__} module. This approach ensures the code matches the
interpreter version.  Previously, PYTHON_FOR_REGEN was used to generate
the code, which might be wrong.  The marshal format for code objects has
changed with bpo-42246@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42246}, commit 877df851. Update the code and the expected
code sizes in ctypes test_frozentable.
@end itemize

@node Windows<41>,IDLE<22>,Build<48>,Python 3 10 0 alpha 7
@anchor{whatsnew/changelog id565}@anchor{1cda}
@subsubsection Windows



@itemize -

@item 
bpo-43440@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43440}: Build @ref{d4,,sqlite3} with the @code{R*Tree} module enabled. Patch
by Erlend E. Aasland.
@end itemize

@node IDLE<22>,C API<42>,Windows<41>,Python 3 10 0 alpha 7
@anchor{whatsnew/changelog id566}@anchor{1cdb}
@subsubsection IDLE



@itemize -

@item 
bpo-42225@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42225}: Document that IDLE can fail on Unix either from misconfigured
IP masquerade rules or failure displaying complex colored (non-ascii)
characters.
@end itemize

@node C API<42>,,IDLE<22>,Python 3 10 0 alpha 7
@anchor{whatsnew/changelog id567}@anchor{1cdc}
@subsubsection C API



@itemize -

@item 
bpo-43688@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43688}: The limited C API is now supported if Python is built in debug
mode (if the @code{Py_DEBUG} macro is defined). In the limited C API, the
@ref{790,,Py_INCREF()} and @ref{791,,Py_DECREF()} functions are now implemented
as opaque function calls, rather than accessing directly the
@ref{aa5,,PyObject.ob_refcnt} member, if Python is built in debug mode
and the @code{Py_LIMITED_API} macro targets Python 3.10 or newer. It became
possible to support the limited C API in debug mode because the
@ref{5df,,PyObject} structure is the same in release and debug mode since
Python 3.8 (see bpo-36465@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36465}).

The limited C API is still not supported in the @code{--with-trace-refs}
special build (@code{Py_TRACE_REFS} macro).

Patch by Victor Stinner.

@item 
bpo-43244@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43244}: Remove the @code{pyarena.h} header file with functions:


@itemize *

@item 
@code{PyArena_New()}

@item 
@code{PyArena_Free()}

@item 
@code{PyArena_Malloc()}

@item 
@code{PyArena_AddPyObject()}
@end itemize

These functions were undocumented, excluded from the limited C API, and
were only used internally by the compiler. Patch by Victor Stinner.

@item 
bpo-43244@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43244}: Remove the compiler and parser functions using @code{struct _mod}
type, because the public AST C API was removed:


@itemize *

@item 
@code{PyAST_Compile()}

@item 
@code{PyAST_CompileEx()}

@item 
@code{PyAST_CompileObject()}

@item 
@code{PyFuture_FromAST()}

@item 
@code{PyFuture_FromASTObject()}

@item 
@code{PyParser_ASTFromFile()}

@item 
@code{PyParser_ASTFromFileObject()}

@item 
@code{PyParser_ASTFromFilename()}

@item 
@code{PyParser_ASTFromString()}

@item 
@code{PyParser_ASTFromStringObject()}
@end itemize

These functions were undocumented and excluded from the limited C API.
Patch by Victor Stinner.

@item 
bpo-43244@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43244}: Remove @code{ast.h}, @code{asdl.h}, and @code{Python-ast.h} header
files. These functions were undocumented and excluded from the limited C
API. Most names defined by these header files were not prefixed by @code{Py}
and so could create names conflicts. For example, @code{Python-ast.h} defined
a @code{Yield} macro which was conflict with the @code{Yield} name used by the
Windows @code{<winbase.h>} header. Use the Python @ref{9,,ast} module instead.
Patch by Victor Stinner.

@item 
bpo-43541@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43541}: Fix a @code{PyEval_EvalCodeEx()} regression: fix reference
counting on builtins. Patch by Victor Stinner.

@item 
bpo-43244@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43244}: Remove the @code{symtable.h} header file and the undocumented
functions:


@itemize *

@item 
@code{PyST_GetScope()}

@item 
@code{PySymtable_Build()}

@item 
@code{PySymtable_BuildObject()}

@item 
@code{PySymtable_Free()}

@item 
@code{Py_SymtableString()}

@item 
@code{Py_SymtableStringObject()}
@end itemize

The @code{Py_SymtableString()} function was part the stable ABI by mistake
but it could not be used, because the @code{symtable.h} header file was
excluded from the limited C API.

The Python @ref{de,,symtable} module remains available and is unchanged.

Patch by Victor Stinner.

@item 
bpo-43244@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43244}: Remove the @code{PyAST_Validate()} function. It is no longer
possible to build a AST object (@code{mod_ty} type) with the public C API.
The function was already excluded from the limited C API (
@geindex Python Enhancement Proposals; PEP 384
PEP 384@footnote{https://peps.python.org/pep-0384/}).
Patch by Victor Stinner.
@end itemize

@node Python 3 10 0 alpha 6,Python 3 10 0 alpha 5,Python 3 10 0 alpha 7,Changelog
@anchor{whatsnew/changelog python-3-10-0-alpha-6}@anchor{1cdd}
@subsection Python 3.10.0 alpha 6


`Release date: 2021-03-01'

@menu
* Security: Security<36>. 
* Core and Builtins: Core and Builtins<123>. 
* Library: Library<126>. 
* Core and Builtins: Core and Builtins<124>. 
* Library: Library<127>. 
* Core and Builtins: Core and Builtins<125>. 
* Library: Library<128>. 
* Documentation: Documentation<42>. 
* Tests: Tests<42>. 
* Build: Build<49>. 
* Windows: Windows<42>. 
* macOS: macOS<32>. 
* IDLE: IDLE<23>. 
* C API: C API<43>. 

@end menu

@node Security<36>,Core and Builtins<123>,,Python 3 10 0 alpha 6
@anchor{whatsnew/changelog id568}@anchor{1cde}
@subsubsection Security



@itemize -

@item 
bpo-42967@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42967}: Fix web cache poisoning vulnerability by defaulting the query
args separator to @code{&}, and allowing the user to choose a custom
separator.
@end itemize

@node Core and Builtins<123>,Library<126>,Security<36>,Python 3 10 0 alpha 6
@anchor{whatsnew/changelog id569}@anchor{1cdf}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-43321@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43321}: Fix @code{SystemError} raised when @code{PyArg_Parse*()} is used with
@code{#} but without @code{PY_SSIZE_T_CLEAN} defined.

@item 
bpo-36346@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36346}: @code{PyArg_Parse*()} functions now emits @code{DeprecationWarning}
when @code{u} or @code{Z} format is used. See 
@geindex Python Enhancement Proposals; PEP 623
PEP 623@footnote{https://peps.python.org/pep-0623/} for detail.

@item 
bpo-43277@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43277}: Add a new @ref{aa3,,PySet_CheckExact()} function to the C-API to
check if an object is an instance of @ref{185,,set} but not an instance of a
subtype. Patch by Pablo Galindo.

@item 
bpo-42990@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42990}: The @ref{a89,,types.FunctionType} constructor now inherits the
current builtins if the `globals' dictionary has no @code{"__builtins__"}
key, rather than using @code{@{"None": None@}} as builtins: same behavior as
@ref{4a4,,eval()} and @ref{4a3,,exec()} functions. Defining a function with @code{def
function(...): ...} in Python is not affected, globals cannot be
overridden with this syntax: it also inherits the current builtins. Patch
by Victor Stinner.

@item 
bpo-42990@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42990}: Functions have a new @code{__builtins__} attribute which is used
to look for builtin symbols when a function is executed, instead of
looking into @code{__globals__['__builtins__']}. Patch by Mark Shannon and
Victor Stinner.

@item 
bpo-43149@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43149}: Improve the error message in the parser for exception groups
without parentheses. Patch by Pablo Galindo.

@item 
bpo-43121@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43121}: Fixed an incorrect @ref{18f,,SyntaxError} message for missing comma
in literals. Patch by Pablo Galindo.
@end itemize

@node Library<126>,Core and Builtins<124>,Core and Builtins<123>,Python 3 10 0 alpha 6
@anchor{whatsnew/changelog id570}@anchor{1ce0}
@subsubsection Library



@itemize -

@item 
bpo-42819@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42819}: @ref{bf,,readline}: Explicitly disable bracketed paste in the
interactive interpreter, even if it’s set in the inputrc, is enabled by
default (eg GNU Readline 8.1), or a user calls
@code{readline.read_init_file()}. The Python REPL has not implemented
bracketed paste support. Also, bracketed mode writes the @code{"\x1b[?2004h"}
escape sequence into stdout which causes test failures in applications
that don’t support it. It can still be explicitly enabled by calling
@code{readline.parse_and_bind("set enable-bracketed-paste on")}. Patch by
Dustin Rodrigues.
@end itemize

@node Core and Builtins<124>,Library<127>,Library<126>,Python 3 10 0 alpha 6
@anchor{whatsnew/changelog id571}@anchor{1ce1}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-42808@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42808}: Simple calls to @code{type(object)} are now faster due to the
@code{vectorcall} calling convention. Patch by Dennis Sweeney.

@item 
bpo-42217@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42217}: Make the compiler merges same co_code and co_linetable objects
in a module like already did for co_consts.

@item 
bpo-41972@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41972}: Substring search functions such as @code{str1 in str2} and
@code{str2.find(str1)} now sometimes use the “Two-Way” string comparison
algorithm to avoid quadratic behavior on long strings.

@item 
bpo-42128@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42128}: Implement 
@geindex Python Enhancement Proposals; PEP 634
PEP 634@footnote{https://peps.python.org/pep-0634/} (structural pattern matching). Patch by
Brandt Bucher.
@end itemize

@node Library<127>,Core and Builtins<125>,Core and Builtins<124>,Python 3 10 0 alpha 6
@anchor{whatsnew/changelog id572}@anchor{1ce2}
@subsubsection Library



@itemize -

@item 
bpo-40692@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40692}: In the @ref{1d8,,concurrent.futures.ProcessPoolExecutor},
validate that @code{multiprocess.synchronize()} is available on a given
platform and rely on that check in the @ref{24,,concurrent.futures} test
suite so we can run tests that are unrelated to
@code{ProcessPoolExecutor} on those platforms.
@end itemize

@node Core and Builtins<125>,Library<128>,Library<127>,Python 3 10 0 alpha 6
@anchor{whatsnew/changelog id573}@anchor{1ce3}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-38302@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38302}: If @ref{9d9,,object.__ipow__()} returns @ref{1a3,,NotImplemented}, the
operator will correctly fall back to @ref{9da,,object.__pow__()} and
@ref{1a6,,object.__rpow__()} as expected.
@end itemize

@node Library<128>,Documentation<42>,Core and Builtins<125>,Python 3 10 0 alpha 6
@anchor{whatsnew/changelog id574}@anchor{1ce4}
@subsubsection Library



@itemize -

@item 
bpo-43316@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43316}: The @code{python -m gzip} command line application now properly
fails when detecting an unsupported extension. It exits with a non-zero
exit code and prints an error message to stderr.

@item 
bpo-43317@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43317}: Set the chunk size for the @code{gzip} module main function to
io.DEFAULT_BUFFER_SIZE. This is slightly faster than the 1024 bytes
constant that was used previously.

@item 
bpo-43146@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43146}: Handle None in single-arg versions of
@ref{a55,,print_exception()} and
@ref{a53,,format_exception()}.

@item 
bpo-43260@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43260}: Fix TextIOWrapper can not flush internal buffer forever after
very large text is written.

@item 
bpo-43258@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43258}: Prevent needless allocation of @ref{d4,,sqlite3} aggregate
function context when no rows match an aggregate query. Patch by Erlend E.
Aasland.

@item 
bpo-43251@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43251}: Improve @ref{d4,,sqlite3} error handling:
@code{sqlite3_column_name()} failures now result in @ref{1761,,MemoryError}. Patch
by Erlend E. Aasland.

@item 
bpo-40956@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40956}: Fix segfault in @ref{d79,,sqlite3.Connection.backup()} if no
argument was provided. The regression was introduced by PR 23838. Patch by
Erlend E. Aasland.

@item 
bpo-43172@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43172}: The readline module now passes its tests when built directly
against libedit. Existing irreconcilable API differences remain in
@ref{1ce5,,readline.get_begidx()} and @ref{1ce6,,readline.get_endidx()} behavior based
on libreadline vs libedit use.

@item 
bpo-43163@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43163}: Fix a bug in @ref{1d,,codeop} that was causing it to not ask for
more input when multi-line snippets have unclosed parentheses. Patch by
Pablo Galindo

@item 
bpo-43162@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43162}: deprecate unsupported ability to access enum members as
attributes of other enum members

@item 
bpo-43146@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43146}: Fix recent regression in None argument handling in
@ref{105,,traceback} module functions.

@item 
bpo-43102@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43102}: The namedtuple __new__ method had its __builtins__ set to None
instead of an actual dictionary.  This created problems for introspection
tools.

@item 
bpo-43106@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43106}: Added @ref{a21,,O_EVTONLY}, @ref{a22,,O_FSYNC},
@ref{a23,,O_SYMLINK} and @ref{a24,,O_NOFOLLOW_ANY} for macOS. Patch by
Donghee Na.

@item 
bpo-42960@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42960}: Adds @ref{1ce7,,resource.RLIMIT_KQUEUES} constant from FreeBSD to
the @ref{c1,,resource} module.

@item 
bpo-42151@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42151}: Make the pure Python implementation of
@ref{12c,,xml.etree.ElementTree} behave the same as the C implementation
(@code{_elementree}) regarding default attribute values (by not setting
@code{specified_attributes=1}).

@item 
bpo-29753@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29753}: In ctypes, now packed bitfields are calculated properly and the
first item of packed bitfields is now shrank correctly.
@end itemize

@node Documentation<42>,Tests<42>,Library<128>,Python 3 10 0 alpha 6
@anchor{whatsnew/changelog id575}@anchor{1ce8}
@subsubsection Documentation



@itemize -

@item 
bpo-27646@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27646}: Clarify that ‘yield from <expr>’ works with any iterable, not
just iterators.

@item 
bpo-36346@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36346}: Update some deprecated unicode APIs which are documented as
“will be removed in 4.0” to “3.12”. See 
@geindex Python Enhancement Proposals; PEP 623
PEP 623@footnote{https://peps.python.org/pep-0623/} for detail.
@end itemize

@node Tests<42>,Build<49>,Documentation<42>,Python 3 10 0 alpha 6
@anchor{whatsnew/changelog id576}@anchor{1ce9}
@subsubsection Tests



@itemize -

@item 
bpo-43288@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43288}: Fix test_importlib to correctly skip Unicode file tests if the
filesystem does not support them.
@end itemize

@node Build<49>,Windows<42>,Tests<42>,Python 3 10 0 alpha 6
@anchor{whatsnew/changelog id577}@anchor{1cea}
@subsubsection Build



@itemize -

@item 
bpo-43174@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43174}: Windows build now uses @code{/utf-8} compiler option.

@item 
bpo-43103@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43103}: Add a new configure @code{--without-static-libpython} option to
not build the @code{libpythonMAJOR.MINOR.a} static library and not install
the @code{python.o} object file.

@item 
bpo-13501@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13501}: The configure script can now use `libedit' instead of
`readline' with the command line option @code{--with-readline=editline}.

@item 
bpo-42603@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42603}: Make configure script use pkg-config to detect the location of
Tcl/Tk headers and libraries, used to build tkinter.

On macOS, a Tcl/Tk configuration provided by pkg-config will be preferred
over Tcl/Tk frameworks installed in @code{/@{System/,@}Library/Frameworks}. If
both exist and the latter is preferred, the appropriate @code{--with-tcltk-*}
configuration options need to be explicitly set.

@item 
bpo-39448@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39448}: Add the “regen-frozen” makefile target that regenerates the
code for the frozen @code{__hello__} module.
@end itemize

@node Windows<42>,macOS<32>,Build<49>,Python 3 10 0 alpha 6
@anchor{whatsnew/changelog id578}@anchor{1ceb}
@subsubsection Windows



@itemize -

@item 
bpo-43155@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43155}: @ref{1cec,,PyCMethod_New()} is now present in @code{python3.lib}.
@end itemize

@node macOS<32>,IDLE<23>,Windows<42>,Python 3 10 0 alpha 6
@anchor{whatsnew/changelog id579}@anchor{1ced}
@subsubsection macOS



@itemize -

@item 
bpo-41837@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41837}: Update macOS installer build to use OpenSSL 1.1.1j.
@end itemize

@node IDLE<23>,C API<43>,macOS<32>,Python 3 10 0 alpha 6
@anchor{whatsnew/changelog id580}@anchor{1cee}
@subsubsection IDLE



@itemize -

@item 
bpo-43283@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43283}: Document why printing to IDLE’s Shell is often slower than
printing to a system terminal and that it can be made faster by
pre-formatting a single string before printing.
@end itemize

@node C API<43>,,IDLE<23>,Python 3 10 0 alpha 6
@anchor{whatsnew/changelog id581}@anchor{1cef}
@subsubsection C API



@itemize -

@item 
bpo-43278@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43278}: Always put compiler and system information on the first line of
the REPL welcome message.

@item 
bpo-43270@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43270}: Remove the private @code{_PyErr_OCCURRED()} macro: use the public
@ref{1cf0,,PyErr_Occurred()} function instead.

@item 
bpo-35134@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35134}: Move odictobject.h, parser_interface.h, picklebufobject.h,
pydebug.h, and pyfpe.h into the cpython/ directory. They must not be
included directly, as they are already included by Python.h: @ref{98c,,Include Files}.

@item 
bpo-35134@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35134}: Move pyarena.h, pyctype.h, and pytime.h into the cpython/
directory. They must not be included directly, as they are already
included by Python.h: @ref{98c,,Include Files}.

@item 
bpo-40170@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40170}: @ref{c61,,PyExceptionClass_Name()} is now always declared as a
function, in order to hide implementation details. The macro accessed
@ref{1cf1,,PyTypeObject.tp_name} directly.  Patch by Erlend E. Aasland.

@item 
bpo-43239@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43239}: The @ref{1cf2,,PyCFunction_New()} function is now exported in the
ABI when compiled with @code{-fvisibility=hidden}.

@item 
bpo-40170@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40170}: @ref{1cf3,,PyIter_Check()} is now always declared as a function, in
order to hide implementation details. The macro accessed
@ref{16fc,,PyTypeObject.tp_iternext} directly. Patch by Erlend E. Aasland.

@item 
bpo-40170@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40170}: Convert @ref{1cf4,,PyDescr_IsData()} macro to a function to hide
implementation details: The macro accessed
@ref{1cf5,,PyTypeObject.tp_descr_set} directly. Patch by Erlend E.
Aasland.

@item 
bpo-43181@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43181}: Convert @ref{1cf6,,PyObject_TypeCheck()} macro to a static inline
function. Patch by Erlend E. Aasland.
@end itemize

@node Python 3 10 0 alpha 5,Python 3 10 0 alpha 4,Python 3 10 0 alpha 6,Changelog
@anchor{whatsnew/changelog python-3-10-0-alpha-5}@anchor{1cf7}
@subsection Python 3.10.0 alpha 5


`Release date: 2021-02-02'

@menu
* Security: Security<37>. 
* Core and Builtins: Core and Builtins<126>. 
* Library: Library<129>. 
* Core and Builtins: Core and Builtins<127>. 
* Library: Library<130>. 
* Documentation: Documentation<43>. 
* Tests: Tests<43>. 
* Build: Build<50>. 
* Windows: Windows<43>. 
* macOS: macOS<33>. 
* IDLE: IDLE<24>. 
* C API: C API<44>. 

@end menu

@node Security<37>,Core and Builtins<126>,,Python 3 10 0 alpha 5
@anchor{whatsnew/changelog id582}@anchor{1cf8}
@subsubsection Security



@itemize -

@item 
bpo-42938@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42938}: Avoid static buffers when computing the repr of
@ref{1cf9,,ctypes.c_double} and @ref{1cfa,,ctypes.c_longdouble} values.
@end itemize

@node Core and Builtins<126>,Library<129>,Security<37>,Python 3 10 0 alpha 5
@anchor{whatsnew/changelog id583}@anchor{1cfb}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-42990@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42990}: Refactor the @code{PyEval_} family of functions.


@itemize *

@item 
An new function @code{_PyEval_Vector} is added to simplify calls to Python from C.

@item 
@code{_PyEval_EvalCodeWithName} is removed

@item 
@code{PyEval_EvalCodeEx} is retained as part of the API, but is not used internally
@end itemize

@item 
bpo-38631@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38631}: Replace @ref{b80,,Py_FatalError()} calls in the compiler with
regular @ref{796,,SystemError} exceptions. Patch by Victor Stinner.

@item 
bpo-42997@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42997}: Improve error message for missing “:” before blocks. Patch by
Pablo Galindo.

@item 
bpo-43017@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43017}: Improve error message in the parser when using un-parenthesised
tuples in comprehensions. Patch by Pablo Galindo.

@item 
bpo-42986@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42986}: Fix parser crash when reporting syntax errors in f-string with
newlines. Patch by Pablo Galindo.

@item 
bpo-40176@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40176}: Syntax errors for unterminated string literals now point to the
start of the string instead of reporting EOF/EOL.

@item 
bpo-42927@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42927}: The inline cache for @code{LOAD_ATTR} now also optimizes access to
attributes defined by @code{__slots__}. This makes reading such attribute up
to 30% faster.

@item 
bpo-42864@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42864}: Improve error messages in the parser when parentheses are not
closed. Patch by Pablo Galindo.

@item 
bpo-42924@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42924}: Fix @code{bytearray} repetition incorrectly copying data from the
start of the buffer, even if the data is offset within the buffer (e.g.
after reassigning a slice at the start of the @code{bytearray} to a shorter
byte string).

@item 
bpo-42882@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42882}: Fix the @code{_PyUnicode_FromId()} function
(_Py_IDENTIFIER(var) API) when @ref{45e,,Py_Initialize()} /
@ref{45d,,Py_Finalize()} is called multiple times: preserve
@code{_PyRuntime.unicode_ids.next_index} value.

@item 
bpo-42827@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42827}: Fix a crash when working out the error line of a
@ref{18f,,SyntaxError} in some multi-line expressions.

@item 
bpo-42823@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42823}: frame.f_lineno is correct even if frame.f_trace is set to True
@end itemize

@node Library<129>,Core and Builtins<127>,Core and Builtins<126>,Python 3 10 0 alpha 5
@anchor{whatsnew/changelog id584}@anchor{1cfc}
@subsubsection Library



@itemize -

@item 
bpo-37324@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37324}: Remove deprecated aliases to
@ref{a7e,,Collections Abstract Base Classes} from the @ref{1e,,collections}
module.
@end itemize

@node Core and Builtins<127>,Library<130>,Library<129>,Python 3 10 0 alpha 5
@anchor{whatsnew/changelog id585}@anchor{1cfd}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-41994@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41994}: Fixed possible leak in @code{import} when @code{sys.modules} is not a
@code{dict}.

@item 
bpo-27772@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27772}: In string formatting, preceding the `width' field by @code{'0'} no
longer affects the default alignment for strings.
@end itemize

@node Library<130>,Documentation<43>,Core and Builtins<127>,Python 3 10 0 alpha 5
@anchor{whatsnew/changelog id586}@anchor{1cfe}
@subsubsection Library



@itemize -

@item 
bpo-43108@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43108}: Fixed a reference leak in the @ref{2f,,curses} module. Patch by
Pablo Galindo

@item 
bpo-43077@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43077}: Update the bundled pip to 21.0.1 and setuptools to 52.0.0.

@item 
bpo-41282@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41282}: Deprecate @code{distutils} in documentation and add warning on
import.

@item 
bpo-43014@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43014}: Improve performance of @ref{102,,tokenize} by 20-30%.  Patch by
Anthony Sottile.

@item 
bpo-42323@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42323}: Fix @ref{6c1,,math.nextafter()} for NaN on AIX.

@item 
bpo-42955@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42955}: Add @ref{a48,,sys.stdlib_module_names}, containing the list of the
standard library module names. Patch by Victor Stinner.

@item 
bpo-42944@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42944}: Fix @code{random.Random.sample} when @code{counts} argument is not
@code{None}.

@item 
bpo-42934@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42934}: Use @ref{563,,TracebackException}’s new @code{compact}
param in @ref{1373,,TestResult} to reduce time and memory consumed
by traceback formatting.

@item 
bpo-42931@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42931}: Add @code{randbytes()} to @code{random.__all__}.

@item 
bpo-38250@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38250}: [Enum] Flags consisting of a single bit are now considered
canonical, and will be the only flags returned from listing and iterating
over a Flag class or a Flag member.  Multi-bit flags are considered
aliases; they will be returned from lookups and operations that result in
their value. Iteration for both Flag and Flag members is in definition
order.

@item 
bpo-42877@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42877}: Added the @code{compact} parameter to the constructor of
@ref{563,,traceback.TracebackException} to reduce time and memory for use
cases that only need to call @code{TracebackException.format()} and
@code{TracebackException.format_exception_only()}.

@item 
bpo-42923@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42923}: The @ref{b80,,Py_FatalError()} function and the
@ref{5c,,faulthandler} module now dump the list of extension modules on a
fatal error.

@item 
bpo-42848@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42848}: Removed recursion from @ref{563,,TracebackException}
to allow it to handle long exception chains.

@item 
bpo-42901@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42901}: [Enum] move member creation from @code{EnumMeta.__new__} to
@code{_proto_member.__set_name__}, allowing members to be created and visible
in @code{__init_subclass__}.

@item 
bpo-42780@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42780}: Fix os.set_inheritable() for O_PATH file descriptors on Linux.

@item 
bpo-42866@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42866}: Fix a reference leak in the @code{getcodec()} function of CJK
codecs. Patch by Victor Stinner.

@item 
bpo-42846@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42846}: Convert the 6 CJK codec extension modules (_codecs_cn,
_codecs_hk, _codecs_iso2022, _codecs_jp, _codecs_kr and _codecs_tw) to the
multiphase initialization API (
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}). Patch by Victor Stinner.

@item 
bpo-42851@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42851}: remove __init_subclass__ support for Enum members

@item 
bpo-42834@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42834}: Make internal caches of the @code{_json} module compatible with
subinterpreters.

@item 
bpo-41748@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41748}: Fix HTMLParser parsing rules for element attributes containing
commas with spaces. Patch by Karl Dubost.

@item 
bpo-40810@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40810}: Require SQLite 3.7.15 or newer. Patch by Erlend E. Aasland.

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Convert the _multibytecodec extension module (CJK codecs) to
multi-phase initialization (
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).  Patch by Erlend E. Aasland.

@item 
bpo-42802@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42802}: The distutils @code{bdist_wininst} command deprecated in Python
3.8 has been removed. The distutils @code{bdist_wheel} command is now
recommended to distribute binary packages on Windows.

@item 
bpo-24464@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24464}: The undocumented built-in function
@code{sqlite3.enable_shared_cache} is now deprecated, scheduled for removal
in Python 3.12.  Its use is strongly discouraged by the SQLite3
documentation.  Patch by Erlend E. Aasland.

@item 
bpo-42384@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42384}: Make pdb populate sys.path[0] exactly the same as regular
python execution.

@item 
bpo-42383@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42383}: Fix pdb: previously pdb would fail to restart the debugging
target if it was specified using a relative path and the current directory
changed.

@item 
bpo-42005@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42005}: Fix CLI of @ref{2b,,cProfile} and @ref{b4,,profile} to catch
@ref{1262,,BrokenPipeError}.

@item 
bpo-41604@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41604}: Don’t decrement the reference count of the previous user_ptr
when set_panel_userptr fails.

@item 
bpo-41149@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41149}: Allow executing callables that have a boolean value of
@code{False} when passed to @code{Threading.thread} as the target. Patch
contributed by Barney Stratford.

@item 
bpo-38307@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38307}: Add an ‘end_lineno’ attribute to the Class and Function objects
that appear in the tree returned by pyclbr functions.  This and the
existing ‘lineno’ attribute define the extent of class and def statements.
Patch by Aviral Srivastava.

@item 
bpo-39273@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39273}: The @code{BUTTON5_*} constants are now exposed in the
@ref{2f,,curses} module if available.

@item 
bpo-33289@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33289}: Correct call to @ref{f7,,tkinter.colorchooser} to return RGB
triplet of ints instead of floats.  Patch by Cheryl Sabella.
@end itemize

@node Documentation<43>,Tests<43>,Library<130>,Python 3 10 0 alpha 5
@anchor{whatsnew/changelog id587}@anchor{1cff}
@subsubsection Documentation



@itemize -

@item 
bpo-40304@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40304}: Fix doc for type(name, bases, dict).  Patch by Boris
Verkhovskiy and Éric Araujo.

@item 
bpo-42811@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42811}: Updated importlib.util.resolve_name() doc to use
__spec__.parent instead of __package__. (Thanks Yair Frid.)
@end itemize

@node Tests<43>,Build<50>,Documentation<43>,Python 3 10 0 alpha 5
@anchor{whatsnew/changelog id588}@anchor{1d00}
@subsubsection Tests



@itemize -

@item 
bpo-40823@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40823}: Use @code{unittest.TestLoader().loadTestsFromTestCase()} instead
of @code{unittest.makeSuite()} in @ref{d4,,sqlite3} tests. Patch by Erlend E.
Aasland.

@item 
bpo-40810@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40810}: In @ref{d4,,sqlite3}, fix @code{CheckTraceCallbackContent} for SQLite
pre 3.7.15.
@end itemize

@node Build<50>,Windows<43>,Tests<43>,Python 3 10 0 alpha 5
@anchor{whatsnew/changelog id589}@anchor{1d01}
@subsubsection Build



@itemize -

@item 
bpo-43031@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43031}: Pass @code{--timeout=$(TESTTIMEOUT)} option to the default profile
task @code{./python -m test --pgo} command.

@item 
bpo-36143@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36143}: @code{make regen-all} now also runs @code{regen-keyword}. Patch by
Victor Stinner.

@item 
bpo-42874@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42874}: Removed the grep -q and -E flags in the tzpath validation
section of the configure script to better accommodate users of some
platforms (specifically Solaris 10).

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: Add library search path by wr-cc in add_cross_compiling_paths()
for VxWorks.

@item 
bpo-42856@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42856}: Add @code{--with-wheel-pkg-dir=PATH} option to the @code{./configure}
script. If specified, the @ref{59,,ensurepip} module looks for @code{setuptools}
and @code{pip} wheel packages in this directory: if both are present, these
wheel packages are used instead of ensurepip bundled wheel packages.

Some Linux distribution packaging policies recommend against bundling
dependencies. For example, Fedora installs wheel packages in the
@code{/usr/share/python-wheels/} directory and don’t install the
@code{ensurepip._bundled} package.
@end itemize

@node Windows<43>,macOS<33>,Build<50>,Python 3 10 0 alpha 5
@anchor{whatsnew/changelog id590}@anchor{1d02}
@subsubsection Windows



@itemize -

@item 
bpo-41837@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41837}: Updated Windows installer to include OpenSSL 1.1.1i

@item 
bpo-42584@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42584}: Upgrade Windows installer to use SQLite 3.34.0.
@end itemize

@node macOS<33>,IDLE<24>,Windows<43>,Python 3 10 0 alpha 5
@anchor{whatsnew/changelog id591}@anchor{1d03}
@subsubsection macOS



@itemize -

@item 
bpo-42504@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42504}: Ensure that the value of
sysconfig.get_config_var(‘MACOSX_DEPLOYMENT_TARGET’) is always a string,
even in when the value is parsable as an integer.
@end itemize

@node IDLE<24>,C API<44>,macOS<33>,Python 3 10 0 alpha 5
@anchor{whatsnew/changelog id592}@anchor{1d04}
@subsubsection IDLE



@itemize -

@item 
bpo-43008@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43008}: Make IDLE invoke @ref{a12,,sys.excepthook()} in normal, 2-process
mode. Patch by Ken Hilton.

@item 
bpo-33065@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33065}: Fix problem debugging user classes with __repr__ method.

@item 
bpo-23544@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23544}: Disable Debug=>Stack Viewer when user code is running or
Debugger is active, to prevent hang or crash.  Patch by Zackery Spytz.

@item 
bpo-32631@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32631}: Finish zzdummy example extension module: make menu entries
work; add docstrings and tests with 100% coverage.
@end itemize

@node C API<44>,,IDLE<24>,Python 3 10 0 alpha 5
@anchor{whatsnew/changelog id593}@anchor{1d05}
@subsubsection C API



@itemize -

@item 
bpo-42979@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42979}: When Python is built in debug mode (with C assertions), calling
a type slot like @code{sq_length} (@code{__len__()} in Python) now fails with a
fatal error if the slot succeeded with an exception set, or failed with no
exception set. The error message contains the slot, the type name, and the
current exception (if an exception is set). Patch by Victor Stinner.

@item 
bpo-43030@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43030}: Fixed a compiler warning in @ref{1d06,,Py_UNICODE_ISSPACE()} on
platforms with signed @code{wchar_t}.
@end itemize

@node Python 3 10 0 alpha 4,Python 3 10 0 alpha 3,Python 3 10 0 alpha 5,Changelog
@anchor{whatsnew/changelog python-3-10-0-alpha-4}@anchor{1d07}
@subsection Python 3.10.0 alpha 4


`Release date: 2021-01-04'

@menu
* Core and Builtins: Core and Builtins<128>. 
* Library: Library<131>. 
* Core and Builtins: Core and Builtins<129>. 
* Library: Library<132>. 
* Core and Builtins: Core and Builtins<130>. 
* Library: Library<133>. 
* Documentation: Documentation<44>. 
* Tests: Tests<44>. 
* Build: Build<51>. 
* macOS: macOS<34>. 
* Tools/Demos: Tools/Demos<28>. 
* C API: C API<45>. 

@end menu

@node Core and Builtins<128>,Library<131>,,Python 3 10 0 alpha 4
@anchor{whatsnew/changelog id594}@anchor{1d08}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-42814@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42814}: Fix undefined behavior in @code{Objects/genericaliasobject.c}.

@item 
bpo-42806@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42806}: Fix the column offsets for f-strings @ref{9,,ast} nodes
surrounded by parentheses and for nodes that spawn multiple lines. Patch
by Pablo Galindo.

@item 
bpo-40631@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40631}: Fix regression where a single parenthesized starred expression
was a valid assignment target.

@item 
bpo-27794@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27794}: Improve the error message for failed writes/deletes to property
objects. When possible, the attribute name is now shown. Patch provided by
Yurii Karabas.

@item 
bpo-42745@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42745}: Make the type attribute lookup cache per-interpreter. Patch by
Victor Stinner.

@item 
bpo-42246@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42246}: Jumps to jumps are not eliminated when it would break PEP 626.

@item 
bpo-42246@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42246}: Make sure that the @code{f_lasti} and @code{f_lineno} attributes of a
frame are set correctly when an exception is raised or re-raised. Required
for PEP 626.

@item 
bpo-32381@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32381}: The coding cookie (ex: @code{# coding: latin1}) is now ignored in
the command passed to the @ref{1a9,,-c} command line option. Patch by
Victor Stinner.

@item 
bpo-30858@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30858}: Improve error location in expressions that contain assignments.
Patch by Pablo Galindo and Lysandros Nikolaou.

@item 
bpo-42615@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42615}: Remove jump commands made redundant by the deletion of
unreachable bytecode blocks
@end itemize

@node Library<131>,Core and Builtins<129>,Core and Builtins<128>,Python 3 10 0 alpha 4
@anchor{whatsnew/changelog id595}@anchor{1d09}
@subsubsection Library



@itemize -

@item 
bpo-42639@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42639}: Make the @ref{d,,atexit} module state per-interpreter. It is now
safe have more than one @code{atexit} module instance. Patch by Donghee Na
and Victor Stinner.
@end itemize

@node Core and Builtins<129>,Library<132>,Library<131>,Python 3 10 0 alpha 4
@anchor{whatsnew/changelog id596}@anchor{1d0a}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-32381@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32381}: Fix encoding name when running a @code{.pyc} file on Windows:
@ref{1d0b,,PyRun_SimpleFileExFlags()} now uses the correct encoding to
decode the filename.
@end itemize

@node Library<132>,Core and Builtins<130>,Core and Builtins<129>,Python 3 10 0 alpha 4
@anchor{whatsnew/changelog id597}@anchor{1d0c}
@subsubsection Library



@itemize -

@item 
bpo-42195@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42195}: The @code{__args__} of the parameterized generics for
@ref{9ce,,typing.Callable} and @ref{9f1,,collections.abc.Callable} are now
consistent.  The @code{__args__} for @code{collections.abc.Callable} are
now flattened while @code{typing.Callable}’s have not changed.  To allow
this change, @ref{9f2,,types.GenericAlias} can now be subclassed and
@code{collections.abc.Callable}’s @code{__class_getitem__} will now return a
subclass of @code{types.GenericAlias}.  Tests for typing were also updated to
not subclass things like @code{Callable[..., T]} as that is not a valid base
class.  Finally, both @code{Callable}s no longer validate their
@code{argtypes}, in @code{Callable[[argtypes], resulttype]} to prepare for
@geindex Python Enhancement Proposals; PEP 612
PEP 612@footnote{https://peps.python.org/pep-0612/}.  Patch by Ken Jin.

@item 
bpo-40137@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40137}: Convert functools module to use
@ref{774,,PyType_FromModuleAndSpec()}.

@item 
bpo-40077@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40077}: Convert @ref{8,,array} to use heap types, and establish module
state for these.

@item 
bpo-42008@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42008}: Fix _random.Random() seeding.

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port the @code{pyexpat} extension module to multi-phase
initialization (
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).
@end itemize

@node Core and Builtins<130>,Library<133>,Library<132>,Python 3 10 0 alpha 4
@anchor{whatsnew/changelog id598}@anchor{1d0d}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-40521@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40521}: Make the Unicode dictionary of interned strings compatible with
subinterpreters. Patch by Victor Stinner.

@item 
bpo-39465@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39465}: Make @code{_PyUnicode_FromId()} function compatible with
subinterpreters. Each interpreter now has an array of identifier objects
(interned strings decoded from UTF-8). Patch by Victor Stinner.
@end itemize

@node Library<133>,Documentation<44>,Core and Builtins<130>,Python 3 10 0 alpha 4
@anchor{whatsnew/changelog id599}@anchor{1d0e}
@subsubsection Library



@itemize -

@item 
bpo-42257@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42257}: Handle empty string in variable executable in
platform.libc_ver()

@item 
bpo-42772@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42772}: randrange() now raises a TypeError when step is specified
without a stop argument.  Formerly, it silently ignored the step argument.

@item 
bpo-42759@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42759}: Fixed equality comparison of @ref{1d0f,,tkinter.Variable} and
@ref{1d10,,tkinter.font.Font}. Objects which belong to different Tcl
interpreters are now always different, even if they have the same name.

@item 
bpo-42756@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42756}: Configure LMTP Unix-domain socket to use socket global default
timeout when a timeout is not explicitly provided.

@item 
bpo-23328@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23328}: Allow / character in username, password fields on _PROXY
envars.

@item 
bpo-42740@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42740}: @ref{2ae,,typing.get_args()} and @ref{2ad,,typing.get_origin()} now
support 
@geindex Python Enhancement Proposals; PEP 604
PEP 604@footnote{https://peps.python.org/pep-0604/} union types and 
@geindex Python Enhancement Proposals; PEP 612
PEP 612@footnote{https://peps.python.org/pep-0612/} additions to @code{Callable}.

@item 
bpo-42655@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42655}: @ref{dc,,subprocess} `extra_groups' is now correctly passed into
setgroups() system call.

@item 
bpo-42727@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42727}: @code{EnumMeta.__prepare__} now accepts @code{**kwds} to properly
support @code{__init_subclass__}

@item 
bpo-38308@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38308}: Add optional `weights' to `statistics.harmonic_mean()'.

@item 
bpo-42721@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42721}: When simple query dialogs (@ref{ff,,tkinter.simpledialog}),
message boxes (@ref{fd,,tkinter.messagebox}) or color choose dialog
(@ref{f7,,tkinter.colorchooser}) are created without arguments `master' and
`parent', and the default root window is not yet created, and
@ref{1d11,,NoDefaultRoot()} was not called, a new temporal hidden root
window will be created automatically. It will not be set as the default
root window and will be destroyed right after closing the dialog window.
It will help to use these simple dialog windows in programs which do not
need other GUI.

@item 
bpo-25246@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25246}: Optimized @ref{1d12,,collections.deque.remove()}.

@item 
bpo-35728@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35728}: Added a root parameter to @ref{1d13,,tkinter.font.nametofont()}.

@item 
bpo-15303@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15303}: @ref{f6,,tkinter} supports now widgets with boolean value False.

@item 
bpo-42681@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42681}: Fixed range checks for color and pair numbers in @ref{2f,,curses}.

@item 
bpo-42685@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42685}: Improved placing of simple query windows in Tkinter (such as
@ref{1d14,,tkinter.simpledialog.askinteger()}). They are now centered at the
center of the parent window if it is specified and shown, otherwise at the
center of the screen.

@item 
bpo-9694@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9694}: Argparse help no longer uses the confusing phrase, “optional
arguments”. It uses “options” instead.

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port the @code{_thread} extension module to the multiphase
initialization API (
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}) and convert its static types to heap
types.

@item 
bpo-37961@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37961}: Fix crash in @code{tracemalloc.Traceback.__repr__()} (regressed
in Python 3.9).

@item 
bpo-42630@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42630}: @ref{f6,,tkinter} functions and constructors which need a default
root window raise now @ref{246,,RuntimeError} with descriptive message instead
of obscure @ref{5f0,,AttributeError} or @ref{450,,NameError} if it is not created
yet or cannot be created automatically.

@item 
bpo-42639@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42639}: @code{atexit._run_exitfuncs()} now logs callback exceptions
using @ref{508,,sys.unraisablehook}, rather than logging them directly into
@ref{b39,,sys.stderr} and raise the last exception.

@item 
bpo-42644@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42644}: @code{logging.disable} will now validate the types and value of
its parameter. It also now accepts strings representing the levels (as
does @code{logging.setLevel}) instead of only the numerical values.

@item 
bpo-42639@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42639}: At Python exit, if a callback registered with
@ref{a84,,atexit.register()} fails, its exception is now logged. Previously,
only some exceptions were logged, and the last exception was always
silently ignored.

@item 
bpo-36541@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36541}: Fixed lib2to3.pgen2 to be able to parse PEP-570 positional only
argument syntax.

@item 
bpo-42382@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42382}: In @code{importlib.metadata}: -  @code{EntryPoint} objects now expose
a @code{.dist} object referencing the @code{Distribution} when constructed from
a @code{Distribution}. - Add support for package discovery under package
normalization rules. - The object returned by @code{metadata()} now has a
formally defined protocol called @code{PackageMetadata} with declared support
for the @code{.get_all()} method. - Synced with importlib_metadata 3.3.

@item 
bpo-41877@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41877}: A check is added against misspellings of autospect, auto_spec
and set_spec being passed as arguments to patch, patch.object and
create_autospec.

@item 
bpo-39717@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39717}: [tarfile] update nested exception raising to use @code{from None}
or @code{from e}

@item 
bpo-41877@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41877}: AttributeError for suspected misspellings of assertions on
mocks are now pointing out that the cause are misspelled assertions and
also what to do if the misspelling is actually an intended attribute name.
The unittest.mock document is also updated to reflect the current set of
recognised misspellings.

@item 
bpo-41559@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41559}: Implemented 
@geindex Python Enhancement Proposals; PEP 612
PEP 612@footnote{https://peps.python.org/pep-0612/}: added @code{ParamSpec} and @code{Concatenate}
to @ref{10b,,typing}.  Patch by Ken Jin.

@item 
bpo-42385@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42385}: StrEnum: fix _generate_next_value_ to return a str

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: Define THREAD_STACK_SIZE for VxWorks.

@item 
bpo-34750@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34750}: [Enum] @code{_EnumDict.update()} is now supported.

@item 
bpo-42517@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42517}: Enum: private names do not become members / do not generate
errors – they remain normal attributes

@item 
bpo-42678@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42678}: @code{Enum}: call @code{__init_subclass__} after members have been
added

@item 
bpo-28964@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28964}: @ref{e18,,ast.literal_eval()} adds line number information (if
available) in error message for malformed nodes.

@item 
bpo-42470@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42470}: @ref{952,,random.sample()} no longer warns on a sequence which is
also a set.

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: @code{posixpath.expanduser()} returns the input `path' unchanged
if user home directory is None on VxWorks.

@item 
bpo-42388@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42388}: Fix subprocess.check_output(…, input=None) behavior when
text=True to be consistent with that of the documentation and
universal_newlines=True.

@item 
bpo-34463@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34463}: Fixed discrepancy between @ref{105,,traceback} and the interpreter
in formatting of SyntaxError with lineno not set (@code{traceback} was
changed to match interpreter).

@item 
bpo-42393@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42393}: Raise @ref{a87,,OverflowError} instead of silent truncation in
@ref{a86,,socket.ntohs()} and @ref{a85,,socket.htons()}.  Silent truncation was
deprecated in Python 3.7. Patch by Erlend E. Aasland

@item 
bpo-42222@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42222}: Harmonized @ref{a71,,random.randrange()} argument handling to match
@ref{b43,,range()}.


@itemize *

@item 
The integer test and conversion in @code{randrange()} now uses
@ref{1d15,,operator.index()}.

@item 
Non-integer arguments to @code{randrange()} are deprecated.

@item 
The @code{ValueError} is deprecated in favor of a @code{TypeError}.

@item 
It now runs a little faster than before.
@end itemize

(Contributed by Raymond Hettinger and Serhiy Storchaka.)

@item 
bpo-42163@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42163}: Restore compatibility for @code{uname_result} around deepcopy and
_replace.

@item 
bpo-42090@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42090}: @code{zipfile.Path.joinpath} now accepts arbitrary arguments, same
as @code{pathlib.Path.joinpath}.

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port the _csv module to the multi-phase initialization API
(
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).

@item 
bpo-42059@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42059}: @ref{330,,typing.TypedDict} types created using the alternative
call-style syntax now correctly respect the @code{total} keyword argument
when setting their @code{__required_keys__} and @code{__optional_keys__} class
attributes.

@item 
bpo-41960@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41960}: Add @code{globalns} and @code{localns} parameters to the
@ref{231,,inspect.signature()} and @ref{947,,inspect.Signature.from_callable()}.

@item 
bpo-41907@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41907}: fix @code{format()} behavior for @code{IntFlag}

@item 
bpo-41891@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41891}: Ensure asyncio.wait_for waits for task completion

@item 
bpo-24792@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24792}: Fixed bug where @code{zipimporter} sometimes reports an
incorrect cause of import errors.

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: Fix site and sysconfig modules for VxWorks RTOS which has no
home directories.

@item 
bpo-41462@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41462}: Add @ref{1040,,os.set_blocking()} support for VxWorks RTOS.

@item 
bpo-40219@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40219}: Lowered @ref{1d16,,tkinter.ttk.LabeledScale} dummy widget to
prevent hiding part of the content label.

@item 
bpo-37193@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37193}: Fixed memory leak in @code{socketserver.ThreadingMixIn} introduced
in Python 3.7.

@item 
bpo-39068@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39068}: Fix initialization race condition in @code{a85encode()} and
@code{b85encode()} in @ref{f,,base64}. Patch by Brandon Stansbury.
@end itemize

@node Documentation<44>,Tests<44>,Library<133>,Python 3 10 0 alpha 4
@anchor{whatsnew/changelog id600}@anchor{1d17}
@subsubsection Documentation



@itemize -

@item 
bpo-17140@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17140}: Add documentation for the
@ref{1d18,,multiprocessing.pool.ThreadPool} class.

@item 
bpo-34398@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34398}: Prominently feature listings from the glossary in documentation
search results. Patch by Ammar Askar.
@end itemize

@node Tests<44>,Build<51>,Documentation<44>,Python 3 10 0 alpha 4
@anchor{whatsnew/changelog id601}@anchor{1d19}
@subsubsection Tests



@itemize -

@item 
bpo-42794@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42794}: Update test_nntplib to use official group name of news.aioe.org
for testing. Patch by Donghee Na.

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: Skip some asyncio tests on VxWorks.

@item 
bpo-42641@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42641}: Enhance @code{test_select.test_select()}: it now takes 500
milliseconds rather than 10 seconds. Use Python rather than a shell to
make the test more portable.

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: Skip some tests in _test_all_chown_common() on VxWorks.

@item 
bpo-42199@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42199}: Fix bytecode helper assertNotInBytecode.

@item 
bpo-41443@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41443}: Add more attribute checking in test_posix.py

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: Disable os.popen and impacted tests on VxWorks

@item 
bpo-41439@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41439}: Port test_ssl and test_uuid to VxWorks RTOS.
@end itemize

@node Build<51>,macOS<34>,Tests<44>,Python 3 10 0 alpha 4
@anchor{whatsnew/changelog id602}@anchor{1d1a}
@subsubsection Build



@itemize -

@item 
bpo-42692@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42692}: Fix __builtin_available check on older compilers. Patch by
Joshua Root.

@item 
bpo-27640@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27640}: Added @code{--disable-test-modules} option to the @code{configure}
script: don’t build nor install test modules. Patch by Xavier de Gaye,
Thomas Petazzoni and Peixing Xin.

@item 
bpo-42604@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42604}: Now all platforms use a value for the “EXT_SUFFIX” build
variable derived from SOABI (for instance in freeBSD, “EXT_SUFFIX” is now
“.cpython-310d.so” instead of “.so”). Previously only Linux, Mac and
VxWorks were using a value for “EXT_SUFFIX” that included “SOABI”.

@item 
bpo-42598@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42598}: Fix implicit function declarations in configure which could
have resulted in incorrect configuration checks.  Patch contributed by
Joshua Root.

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: Enable libpython3.so for VxWorks.

@item 
bpo-29076@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29076}: Add fish shell support to macOS installer.
@end itemize

@node macOS<34>,Tools/Demos<28>,Build<51>,Python 3 10 0 alpha 4
@anchor{whatsnew/changelog id603}@anchor{1d1b}
@subsubsection macOS



@itemize -

@item 
bpo-42361@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42361}: Update macOS installer build to use Tcl/Tk 8.6.11 (rc2,
expected to be final release).

@item 
bpo-41837@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41837}: Update macOS installer build to use OpenSSL 1.1.1i.

@item 
bpo-42584@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42584}: Update macOS installer to use SQLite 3.34.0.
@end itemize

@node Tools/Demos<28>,C API<45>,macOS<34>,Python 3 10 0 alpha 4
@anchor{whatsnew/changelog id604}@anchor{1d1c}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-42726@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42726}: Fixed Python 3 compatibility issue with gdb/libpython.py
handling of attribute dictionaries.

@item 
bpo-42613@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42613}: Fix @code{freeze.py} tool to use the prope config and library
directories. Patch by Victor Stinner.
@end itemize

@node C API<45>,,Tools/Demos<28>,Python 3 10 0 alpha 4
@anchor{whatsnew/changelog id605}@anchor{1d1d}
@subsubsection C API



@itemize -

@item 
bpo-42591@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42591}: Export the @code{Py_FrozenMain()} function: fix a Python 3.9.0
regression. Python 3.9 uses @code{-fvisibility=hidden} and the function was
not exported explicitly and so not exported.

@item 
bpo-32381@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32381}: Remove the private @code{_Py_fopen()} function which is no
longer needed. Use @code{_Py_wfopen()} or @code{_Py_fopen_obj()}
instead. Patch by Victor Stinner.

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port @ref{c1,,resource} extension module to module state

@item 
bpo-42111@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42111}: Update the @code{xxlimited} module to be a better example of how
to use the limited C API.

@item 
bpo-40052@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40052}: Fix an alignment build warning/error in function
@code{PyVectorcall_Function()}. Patch by Andreas Schneider, Antoine Pitrou
and Petr Viktorin.
@end itemize

@node Python 3 10 0 alpha 3,Python 3 10 0 alpha 2,Python 3 10 0 alpha 4,Changelog
@anchor{whatsnew/changelog python-3-10-0-alpha-3}@anchor{1d1e}
@subsection Python 3.10.0 alpha 3


`Release date: 2020-12-07'

@menu
* Security: Security<38>. 
* Core and Builtins: Core and Builtins<131>. 
* Library: Library<134>. 
* Core and Builtins: Core and Builtins<132>. 
* Library: Library<135>. 
* Core and Builtins: Core and Builtins<133>. 
* Library: Library<136>. 
* Core and Builtins: Core and Builtins<134>. 
* Library: Library<137>. 
* Documentation: Documentation<45>. 
* Tests: Tests<45>. 
* Build: Build<52>. 
* Windows: Windows<44>. 
* macOS: macOS<35>. 
* IDLE: IDLE<25>. 
* Tools/Demos: Tools/Demos<29>. 
* C API: C API<46>. 

@end menu

@node Security<38>,Core and Builtins<131>,,Python 3 10 0 alpha 3
@anchor{whatsnew/changelog id606}@anchor{1d1f}
@subsubsection Security



@itemize -

@item 
bpo-40791@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40791}: Add @code{volatile} to the accumulator variable in
@code{hmac.compare_digest}, making constant-time-defeating optimizations less
likely.
@end itemize

@node Core and Builtins<131>,Library<134>,Security<38>,Python 3 10 0 alpha 3
@anchor{whatsnew/changelog id607}@anchor{1d20}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-42576@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42576}: @code{types.GenericAlias} will now raise a @code{TypeError} when
attempting to initialize with a keyword argument.  Previously, this would
cause the interpreter to crash if the interpreter was compiled with debug
symbols. This does not affect interpreters compiled for release.  Patch by
Ken Jin.

@item 
bpo-42536@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42536}: Several built-in and standard library types now ensure that
their internal result tuples are always tracked by the @ref{1826,,garbage collector}:


@itemize -

@item 
@ref{7f4,,collections.OrderedDict.items()}

@item 
@ref{9d8,,dict.items()}

@item 
@ref{168d,,enumerate()}

@item 
@ref{21c,,functools.reduce()}

@item 
@ref{151d,,itertools.combinations()}

@item 
@ref{148d,,itertools.combinations_with_replacement()}

@item 
@ref{1d21,,itertools.permutations()}

@item 
@ref{151e,,itertools.product()}

@item 
@ref{14aa,,itertools.zip_longest()}

@item 
@ref{1a1,,zip()}
@end itemize

Previously, they could have become untracked by a prior garbage
collection. Patch by Brandt Bucher.

@item 
bpo-42500@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42500}: Improve handling of exceptions near recursion limit. Converts a
number of Fatal Errors in RecursionErrors.

@item 
bpo-42246@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42246}: PEP 626: After a return, the f_lineno attribute of a frame is
always the last line executed.

@item 
bpo-42435@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42435}: Speed up comparison of bytes objects with non-bytes objects
when option @ref{7fa,,-b} is specified. Speed up comparison of bytarray
objects with non-buffer object.
@end itemize

@node Library<134>,Core and Builtins<132>,Core and Builtins<131>,Python 3 10 0 alpha 3
@anchor{whatsnew/changelog id608}@anchor{1d22}
@subsubsection Library



@itemize -

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port the @code{_warnings} extension module to the multi-phase
initialization API (
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}). Patch by Victor Stinner.
@end itemize

@node Core and Builtins<132>,Library<135>,Library<134>,Python 3 10 0 alpha 3
@anchor{whatsnew/changelog id609}@anchor{1d23}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-41686@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41686}: On Windows, the @code{SIGINT} event, @code{_PyOS_SigintEvent()}, is
now created even if Python is configured to not install signal handlers
(if @ref{ac1,,PyConfig.install_signal_handlers} equals to 0, or
@code{Py_InitializeEx(0)}).

@item 
bpo-42381@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42381}: Allow assignment expressions in set literals and set
comprehensions as per PEP 572. Patch by Pablo Galindo.

@item 
bpo-42202@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42202}: Change function parameters annotations internal representation
to tuple of strings. Patch provided by Yurii Karabas.

@item 
bpo-42374@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42374}: Fix a regression introduced by the new parser, where an
unparenthesized walrus operator was not allowed within generator
expressions.

@item 
bpo-42316@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42316}: Allow an unparenthesized walrus in subscript indexes.

@item 
bpo-42349@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42349}: Make sure that the compiler front-end produces a well-formed
control flow graph. Be more aggressive in the compiler back-end, as it is
now safe to do so.

@item 
bpo-42296@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42296}: On Windows, fix a regression in signal handling which prevented
to interrupt a program using CTRL+C. The signal handler can be run in a
thread different than the Python thread, in which case the test deciding
if the thread can handle signals is wrong.

@item 
bpo-42332@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42332}: @ref{9f2,,types.GenericAlias} objects can now be the targets of
weakrefs.

@item 
bpo-42282@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42282}: Optimise constant subexpressions that appear as part of named
expressions (previously the AST optimiser did not descend into named
expressions). Patch by Nick Coghlan.

@item 
bpo-42266@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42266}: Fixed a bug with the LOAD_ATTR opcode cache that was not
respecting monkey-patching a class-level attribute to make it a
descriptor. Patch by Pablo Galindo.
@end itemize

@node Library<135>,Core and Builtins<133>,Core and Builtins<132>,Python 3 10 0 alpha 3
@anchor{whatsnew/changelog id610}@anchor{1d24}
@subsubsection Library



@itemize -

@item 
bpo-40077@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40077}: Convert @ref{bb,,queue} to use heap types.
@end itemize

@node Core and Builtins<133>,Library<136>,Library<135>,Python 3 10 0 alpha 3
@anchor{whatsnew/changelog id611}@anchor{1d25}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-42246@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42246}: Improved accuracy of line tracing events and f_lineno attribute
of Frame objects. See PEP 626 for details.
@end itemize

@node Library<136>,Core and Builtins<134>,Core and Builtins<133>,Python 3 10 0 alpha 3
@anchor{whatsnew/changelog id612}@anchor{1d26}
@subsubsection Library



@itemize -

@item 
bpo-40077@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40077}: Convert @ref{94,,mmap} to use heap types.
@end itemize

@node Core and Builtins<134>,Library<137>,Library<136>,Python 3 10 0 alpha 3
@anchor{whatsnew/changelog id613}@anchor{1d27}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-42233@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42233}: Allow @code{GenericAlias} objects to use @ref{9cb,,union type expressions}. This allows expressions like @code{list[int] |
dict[float, str]} where previously a @code{TypeError} would have been
thrown.  This also fixes union type expressions not de-duplicating
@code{GenericAlias} objects. (Contributed by Ken Jin in bpo-42233@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42233}.)

@item 
bpo-26131@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26131}: The import system triggers a @code{ImportWarning} when it falls
back to using @code{load_module()}.
@end itemize

@node Library<137>,Documentation<45>,Core and Builtins<134>,Python 3 10 0 alpha 3
@anchor{whatsnew/changelog id614}@anchor{1d28}
@subsubsection Library



@itemize -

@item 
bpo-5054@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5054}: CGIHTTPRequestHandler.run_cgi() HTTP_ACCEPT improperly parsed.
Replace the special purpose getallmatchingheaders with generic get_all
method and add relevant tests.

Original Patch by Martin Panter. Modified by Senthil Kumaran.

@item 
bpo-42562@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42562}: Fix issue when dis failed to parse function that has no line
numbers. Patch provided by Yurii Karabas.

@item 
bpo-17735@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17735}: @code{inspect.findsource()} now raises @ref{2c2,,OSError} instead of
@ref{1741,,IndexError} when @code{co_lineno} of a code object is greater than
the file length. This can happen, for example, when a file is edited after
it was imported.  PR by Irit Katriel.

@item 
bpo-42116@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42116}: Fix handling of trailing comments by @ref{1812,,inspect.getsource()}.

@item 
bpo-42532@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42532}: Remove unexpected call of @code{__bool__} when passing a
@code{spec_arg} argument to a Mock.

@item 
bpo-38200@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38200}: Added itertools.pairwise()

@item 
bpo-41818@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41818}: Fix test_master_read() so that it succeeds on all platforms
that either raise OSError or return b”” upon reading from master.

@item 
bpo-42487@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42487}: ChainMap.__iter__ no longer calls __getitem__ on underlying
maps

@item 
bpo-42482@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42482}: @ref{563,,TracebackException} no longer holds a
reference to the exception’s traceback object. Consequently, instances of
TracebackException for equivalent but non-equal exceptions now compare as
equal.

@item 
bpo-41818@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41818}: Make test_openpty() avoid unexpected success due to number of
rows and/or number of columns being == 0.

@item 
bpo-42392@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42392}: Remove loop parameter from @code{asyncio.subprocess} and
@code{asyncio.tasks} functions. Patch provided by Yurii Karabas.

@item 
bpo-42392@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42392}: Remove loop parameter from @code{asyncio.open_connection} and
@code{asyncio.start_server} functions. Patch provided by Yurii Karabas.

@item 
bpo-28468@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28468}: Add @ref{a2d,,platform.freedesktop_os_release()} function to parse
freedesktop.org @code{os-release} files.

@item 
bpo-42299@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42299}: Removed the @code{formatter} module, which was deprecated in
Python 3.4. It is somewhat obsolete, little used, and not tested. It was
originally scheduled to be removed in Python 3.6, but such removals were
delayed until after Python 2.7 EOL. Existing users should copy whatever
classes they use into their code. Patch by Donghee Na and and Terry J.
Reedy.

@item 
bpo-26131@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26131}: Deprecate zipimport.zipimporter.load_module() in favour of
exec_module().

@item 
bpo-41818@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41818}: Updated tests for the pty library. test_basic() has been
changed to test_openpty(); this additionally checks if slave termios and
slave winsize are being set properly by pty.openpty(). In order to add
support for FreeBSD, NetBSD, OpenBSD, and Darwin, this also adds
test_master_read(), which demonstrates that pty.spawn() should not depend
on an OSError to exit from its copy loop.

@item 
bpo-42392@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42392}: Remove loop parameter from @code{__init__} in all
@code{asyncio.locks} and @code{asyncio.Queue} classes. Patch provided by Yurii
Karabas.

@item 
bpo-15450@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15450}: Make @ref{1146,,filecmp.dircmp} respect subclassing. Now the
@ref{1d29,,filecmp.dircmp.subdirs} behaves as expected when subclassing
dircmp.

@item 
bpo-42413@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42413}: The exception @ref{a3b,,socket.timeout} is now an alias of
@ref{a3c,,TimeoutError}.

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: Support signal module on VxWorks.

@item 
bpo-42406@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42406}: We fixed an issue in @code{pickle.whichmodule} in which importing
@code{multiprocessing} could change the how pickle identifies which module an
object belongs to, potentially breaking the unpickling of those objects.

@item 
bpo-42403@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42403}: Simplify the @ref{7b,,importlib} external bootstrap code:
@code{importlib._bootstrap_external} now uses regular imports to import
builtin modules. When it is imported, the builtin @ref{ad7,,__import__()}
function is already fully working and so can be used to import builtin
modules like @ref{df,,sys}. Patch by Victor Stinner.

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Convert _sre module types to heap types (PEP 384). Patch by
Erlend E. Aasland.

@item 
bpo-42375@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42375}: subprocess module update for DragonFlyBSD support.

@item 
bpo-41713@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41713}: Port the @code{_signal} extension module to the multi-phase
initialization API (
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}). Patch by Victor Stinner and Mohamed
Koubaa.

@item 
bpo-37205@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37205}: @ref{55d,,time.time()}, @ref{c80,,time.perf_counter()} and
@ref{55c,,time.monotonic()} functions can no longer fail with a Python fatal
error, instead raise a regular Python exception on failure.

@item 
bpo-42328@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42328}: Fixed @ref{1d2a,,tkinter.ttk.Style.map()}. The function accepts now
the representation of the default state as empty sequence (as returned by
@code{Style.map()}). The structure of the result is now the same on all
platform and does not depend on the value of @code{wantobjects}.

@item 
bpo-42345@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42345}: Fix various issues with @code{typing.Literal} parameter handling
(flatten, deduplicate, use type to cache key). Patch provided by Yurii
Karabas.

@item 
bpo-37205@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37205}: @ref{c80,,time.perf_counter()} on Windows and @ref{55c,,time.monotonic()}
on macOS are now system-wide. Previously, they used an offset computed at
startup to reduce the precision loss caused by the float type. Use
@ref{ce4,,time.perf_counter_ns()} and @ref{ce3,,time.monotonic_ns()} added in Python
3.7 to avoid this precision loss.

@item 
bpo-42318@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42318}: Fixed support of non-BMP characters in @ref{f6,,tkinter} on macOS.

@item 
bpo-42350@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42350}: Fix the @ref{177,,threading.Thread} class at fork: do nothing if
the thread is already stopped (ex: fork called at Python exit).
Previously, an error was logged in the child process.

@item 
bpo-42333@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42333}: Port _ssl extension module to heap types.

@item 
bpo-42014@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42014}: The @code{onerror} callback from @code{shutil.rmtree} now receives
correct function when @code{os.open} fails.

@item 
bpo-42237@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42237}: Fix @code{os.sendfile()} on illumos.

@item 
bpo-42308@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42308}: Add @ref{a50,,threading.__excepthook__} to allow retrieving the
original value of @ref{a51,,threading.excepthook()} in case it is set to a
broken or a different value. Patch by Mario Corchero.

@item 
bpo-42131@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42131}: Implement PEP 451/spec methods on zipimport.zipimporter:
find_spec(), create_module(), and exec_module().

This also allows for the documented deprecation of find_loader(),
find_module(), and load_module().

@item 
bpo-41877@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41877}: Mock objects which are not unsafe will now raise an
AttributeError if an attribute with the prefix asert, aseert, or assrt is
accessed, in addition to this already happening for the prefixes assert or
assret.

@item 
bpo-42264@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42264}: @code{sqlite3.OptimizedUnicode} has been undocumented and obsolete
since Python 3.3, when it was made an alias to @ref{16a,,str}.  It is now
deprecated, scheduled for removal in Python 3.12.

@item 
bpo-42251@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42251}: Added @ref{a4c,,threading.gettrace()} and
@ref{a4d,,threading.getprofile()} to retrieve the functions set by
@ref{a4e,,threading.settrace()} and @ref{a4f,,threading.setprofile()} respectively.
Patch by Mario Corchero.

@item 
bpo-42249@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42249}: Fixed writing binary Plist files larger than 4 GiB.

@item 
bpo-42236@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42236}: On Unix, the @ref{1c78,,os.device_encoding()} function now returns
@code{'UTF-8'} rather than the device encoding if the @ref{868,,Python UTF-8 Mode} is enabled.

@item 
bpo-41754@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41754}: webbrowser: Ignore `NotADirectoryError' when calling
@code{xdg-settings}.

@item 
bpo-42183@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42183}: Fix a stack overflow error for asyncio Task or Future repr().

The overflow occurs under some circumstances when a Task or Future
recursively returns itself.

@item 
bpo-42140@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42140}: Improve asyncio.wait function to create the futures set just
one time.

@item 
bpo-42133@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42133}: Update various modules in the stdlib to fall back on
@code{__spec__.loader} when @code{__loader__} isn’t defined on a module.

@item 
bpo-26131@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26131}: The @code{load_module()} methods found in @code{importlib} now
trigger a @code{DeprecationWarning}.

@item 
bpo-39825@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39825}: Windows: Change @code{sysconfig.get_config_var('EXT_SUFFIX')} to
the expected full @code{platform_tag.extension} format. Previously it was
hard-coded to @code{.pyd}, now it is compatible with @code{distutils.sysconfig}
and will result in something like @code{.cp38-win_amd64.pyd}. This brings
windows into conformance with the other platforms.

@item 
bpo-26389@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26389}: The @ref{a53,,traceback.format_exception()},
@ref{a54,,traceback.format_exception_only()}, and
@ref{a55,,traceback.print_exception()} functions can now take an exception
object as a positional-only argument.

@item 
bpo-41889@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41889}: Enum: fix regression involving inheriting a multiply inherited
enum

@item 
bpo-41861@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41861}: Convert @ref{d4,,sqlite3} to use heap types (PEP 384). Patch by
Erlend E. Aasland.

@item 
bpo-40624@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40624}: Added support for the XPath @code{!=} operator in xml.etree

@item 
bpo-28850@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28850}: Fix @ref{1d2b,,pprint.PrettyPrinter.format()} overrides being ignored
for contents of small containers. The @code{pprint._safe_repr()} function
was removed.

@item 
bpo-41625@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41625}: Expose the @code{splice()} as @ref{a20,,os.splice()} in the
@ref{a5,,os} module. Patch by Pablo Galindo

@item 
bpo-34215@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34215}: Clarify the error message for
@ref{1d2c,,asyncio.IncompleteReadError} when @code{expected} is @code{None}.

@item 
bpo-41543@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41543}: Add async context manager support for contextlib.nullcontext.

@item 
bpo-21041@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21041}: @ref{a27,,pathlib.PurePath.parents} now supports negative
indexing. Patch contributed by Yaroslav Pankovych.

@item 
bpo-41332@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41332}: Added missing connect_accepted_socket() method to
@code{asyncio.AbstractEventLoop}.

@item 
bpo-12800@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12800}: Extracting a symlink from a tarball should succeed and
overwrite the symlink if it already exists. The fix is to remove the
existing file or symlink before extraction. Based on patch by Chris AtLee,
Jeffrey Kintscher, and Senthil Kumaran.

@item 
bpo-40968@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40968}: @ref{112,,urllib.request} and @ref{73,,http.client} now send
@code{http/1.1} ALPN extension during TLS handshake when no custom context is
supplied.

@item 
bpo-41001@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41001}: Add @ref{a1f,,os.eventfd()} to provide a low level interface for
Linux’s event notification file descriptor.

@item 
bpo-40816@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40816}: Add AsyncContextDecorator to contextlib to support async
context manager as a decorator.

@item 
bpo-40550@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40550}: Fix time-of-check/time-of-action issue in
subprocess.Popen.send_signal.

@item 
bpo-39411@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39411}: Add an @code{is_async} identifier to @ref{b9,,pyclbr}’s @code{Function}
objects. Patch by Batuhan Taskaya

@item 
bpo-35498@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35498}: Add slice support to @ref{a27,,pathlib.PurePath.parents}.
@end itemize

@node Documentation<45>,Tests<45>,Library<137>,Python 3 10 0 alpha 3
@anchor{whatsnew/changelog id615}@anchor{1d2d}
@subsubsection Documentation



@itemize -

@item 
bpo-42238@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42238}: Tentative to deprecate @code{make suspicious} by first removing it
from the CI and documentation builds, but keeping it around for manual
uses.

@item 
bpo-42153@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42153}: Fix the URL for the IMAP protocol documents.

@item 
bpo-41028@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41028}: Language and version switchers, previously maintained in every
cpython branches, are now handled by docsbuild-script.
@end itemize

@node Tests<45>,Build<52>,Documentation<45>,Python 3 10 0 alpha 3
@anchor{whatsnew/changelog id616}@anchor{1d2e}
@subsubsection Tests



@itemize -

@item 
bpo-41473@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41473}: Re-enable test_gdb on gdb 9.2 and newer:
@indicateurl{https://bugzilla.redhat.com/show_bug.cgi?id=1866884} bug is fixed in gdb
10.1.

@item 
bpo-42553@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42553}: Fix @code{test_asyncio.test_call_later()} race condition: don’t
measure asyncio performance in the @code{call_later()} unit test. The test
failed randomly on the CI.

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: Fix test_netrc on VxWorks: create temporary directories using
temp_cwd().

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: skip test_getaddrinfo_ipv6_scopeid_symbolic and
test_getnameinfo_ipv6_scopeid_symbolic on VxWorks

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: skip test_test of test_mailcap on VxWorks

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: add shell requirement for test_pipes

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: skip some tests related to fifo on VxWorks

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: Fix test_doctest.py failures for VxWorks.

@item 
bpo-40754@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40754}: Include @code{_testinternalcapi} module in Windows installer for
test suite

@item 
bpo-41561@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41561}: test_ssl: skip test_min_max_version_mismatch when TLS 1.0 is
not available

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: Fix os module failures for VxWorks RTOS.

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: Fix fifo test cases for VxWorks RTOS.
@end itemize

@node Build<52>,Windows<44>,Tests<45>,Python 3 10 0 alpha 3
@anchor{whatsnew/changelog id617}@anchor{1d2f}
@subsubsection Build



@itemize -

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: remove libnet dependency from detect_socket() for VxWorks

@item 
bpo-42398@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42398}: Fix a race condition in “make regen-all” when make -jN option
is used to run jobs in parallel. The clinic.py script now only use atomic
write to write files. Moveover, generated files are now left unchanged if
the content does not change, to not change the file modification time.

@item 
bpo-41617@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41617}: Fix building @code{pycore_bitutils.h} internal header on old clang
version without @code{__builtin_bswap16()} (ex: Xcode 4.6.3 on Mac OS X
10.7). Patch by Joshua Root and Victor Stinner.

@item 
bpo-38823@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38823}: It is no longer possible to build the @code{_ctypes} extension
module without @code{wchar_t} type: remove @code{CTYPES_UNICODE} macro.
Anyway, the @code{wchar_t} type is required to build Python. Patch by
Victor Stinner.

@item 
bpo-42087@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42087}: Support was removed for AIX 5.3 and below. See bpo-40680@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40680}.

@item 
bpo-40998@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40998}: Addressed three compiler warnings found by undefined behavior
sanitizer (ubsan).
@end itemize

@node Windows<44>,macOS<35>,Build<52>,Python 3 10 0 alpha 3
@anchor{whatsnew/changelog id618}@anchor{1d30}
@subsubsection Windows



@itemize -

@item 
bpo-42120@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42120}: Remove macro definition of @code{copysign} (to @code{_copysign}) in
headers.

@item 
bpo-38506@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38506}: The Windows launcher now properly handles Python 3.10 when
listing installed Python versions.
@end itemize

@node macOS<35>,IDLE<25>,Windows<44>,Python 3 10 0 alpha 3
@anchor{whatsnew/changelog id619}@anchor{1d31}
@subsubsection macOS



@itemize -

@item 
bpo-42504@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42504}: Fix build on macOS Big Sur when MACOSX_DEPLOYMENT_TARGET=11

@item 
bpo-41116@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41116}: Ensure distutils.unixxcompiler.find_library_file can find
system provided libraries on macOS 11.

@item 
bpo-41100@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41100}: Add support for macOS 11 and Apple Silicon systems.

It is now possible to build “Universal 2” binaries using
“–enable-universalsdk –with-universal-archs=universal2”.

Binaries build on later macOS versions can be deployed back to older
versions (tested up to macOS 10.9), when using the correct deployment
target. This is tested using Xcode 11 and later.

@item 
bpo-42232@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42232}: Added Darwin specific madvise options to mmap module.

@item 
bpo-38443@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38443}: The @code{--enable-universalsdk} and @code{--with-universal-archs}
options for the configure script now check that the specified
architectures can be used.
@end itemize

@node IDLE<25>,Tools/Demos<29>,macOS<35>,Python 3 10 0 alpha 3
@anchor{whatsnew/changelog id620}@anchor{1d32}
@subsubsection IDLE



@itemize -

@item 
bpo-42508@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42508}: Keep IDLE running on macOS.  Remove obsolete workaround that
prevented running files with shortcuts when using new universal2
installers built on macOS 11.

@item 
bpo-42426@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42426}: Fix reporting offset of the RE error in searchengine.

@item 
bpo-42415@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42415}: Get docstrings for IDLE calltips more often by using
inspect.getdoc.
@end itemize

@node Tools/Demos<29>,C API<46>,IDLE<25>,Python 3 10 0 alpha 3
@anchor{whatsnew/changelog id621}@anchor{1d33}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-42212@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42212}: The smelly.py script now also checks the Python dynamic library
and extension modules, not only the Python static library. Make also the
script more verbose: explain what it does.

@item 
bpo-36310@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36310}: Allow @code{Tools/i18n/pygettext.py} to detect calls to
@code{gettext} in f-strings.
@end itemize

@node C API<46>,,Tools/Demos<29>,Python 3 10 0 alpha 3
@anchor{whatsnew/changelog id622}@anchor{1d34}
@subsubsection C API



@itemize -

@item 
bpo-42423@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42423}: The @ref{79f,,PyType_FromSpecWithBases()} and
@ref{774,,PyType_FromModuleAndSpec()} functions now accept a single class as
the `bases' argument.

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port @ref{c6,,select} extension module to multiphase
initialization (
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port _posixsubprocess extension module to multiphase
initialization (
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port _posixshmem extension module to multiphase
initialization (
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/})

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port _struct extension module to multiphase initialization
(
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/})

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port @code{spwd} extension module to multiphase
initialization (
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/})

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port @ref{64,,gc} extension module to multiphase initialization
(
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/})

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port _queue extension module to multiphase initialization
(
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/})

@item 
bpo-39573@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39573}: Convert @ref{3c7,,Py_TYPE()} and @ref{98a,,Py_SIZE()} back to macros
to allow using them as an l-value. Many third party C extension modules
rely on the ability of using Py_TYPE() and Py_SIZE() to set an object type
and size: @code{Py_TYPE(obj) = type;} and @code{Py_SIZE(obj) = size;}.

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port @ref{de,,symtable} extension module to multiphase
initialization (
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/})

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port @ref{6a,,grp} and @ref{b7,,pwd} extension modules to
multiphase initialization (
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/})

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port _random extension module to multiphase initialization
(
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/})

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port _hashlib extension module to multiphase initialization
(
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/})

@item 
bpo-41713@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41713}: Removed the undocumented @code{PyOS_InitInterrupts()} function.
Initializing Python already implicitly installs signal handlers: see
@ref{ac1,,PyConfig.install_signal_handlers}. Patch by Victor Stinner.

@item 
bpo-40170@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40170}: The @code{Py_TRASHCAN_BEGIN} macro no longer accesses PyTypeObject
attributes, but now can get the condition by calling the new private
@code{_PyTrash_cond()} function which hides implementation details.

@item 
bpo-42260@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42260}: @ref{3e1,,Py_GetPath()}, @ref{3e3,,Py_GetPrefix()},
@ref{3e7,,Py_GetExecPrefix()}, @ref{3ea,,Py_GetProgramFullPath()},
@ref{3ed,,Py_GetPythonHome()} and @ref{3ec,,Py_GetProgramName()} functions now
return @code{NULL} if called before @ref{45e,,Py_Initialize()} (before Python is
initialized). Use the new @ref{646,,Python Initialization Configuration API} to get the @ref{ab0,,Python Path Configuration.}. Patch by Victor Stinner.

@item 
bpo-42260@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42260}: The @ref{998,,PyConfig_Read()} function now only parses
@ref{3ef,,PyConfig.argv} arguments once: @ref{1d35,,PyConfig.parse_argv}
is set to @code{2} after arguments are parsed. Since Python arguments are
strippped from @code{PyConfig.argv}, parsing arguments twice would
parse the application options as Python options.

@item 
bpo-42262@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42262}: Added @ref{aa0,,Py_NewRef()} and @ref{aa1,,Py_XNewRef()} functions to
increment the reference count of an object and return the object. Patch by
Victor Stinner.

@item 
bpo-42260@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42260}: When @ref{45e,,Py_Initialize()} is called twice, the second call
now updates more @ref{df,,sys} attributes for the configuration, rather than
only @ref{1470,,sys.argv}. Patch by Victor Stinner.

@item 
bpo-41832@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41832}: The @ref{774,,PyType_FromModuleAndSpec()} function now accepts
NULL @code{tp_doc} slot.

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Added @ref{60a,,PyModule_AddObjectRef()} function: similar to
@ref{60b,,PyModule_AddObject()} but don’t steal a reference to the value on
success. Patch by Victor Stinner.

@item 
bpo-42171@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42171}: The @ref{19e1,,METH_FASTCALL} calling convention is added to the
limited API. The functions  @ref{b72,,PyModule_AddType()},
@ref{774,,PyType_FromModuleAndSpec()}, @ref{b6c,,PyType_GetModule()} and
@ref{b6d,,PyType_GetModuleState()} are added to the limited API on Windows.

@item 
bpo-42085@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42085}: Add dedicated entry to PyAsyncMethods for sending values

@item 
bpo-41073@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41073}: @ref{aa2,,PyType_GetSlot()} can now accept static types.

@item 
bpo-30459@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30459}: @ref{62f,,PyList_SET_ITEM()}, @ref{62e,,PyTuple_SET_ITEM()} and
@ref{ab1,,PyCell_SET()} macros can no longer be used as l-value or r-value.
For example, @code{x = PyList_SET_ITEM(a, b, c)} and @code{PyList_SET_ITEM(a, b,
c) = x} now fail with a compiler error. It prevents bugs like @code{if
(PyList_SET_ITEM (a, b, c) < 0) ...} test. Patch by Zackery Spytz and
Victor Stinner.
@end itemize

@node Python 3 10 0 alpha 2,Python 3 10 0 alpha 1,Python 3 10 0 alpha 3,Changelog
@anchor{whatsnew/changelog python-3-10-0-alpha-2}@anchor{1d36}
@subsection Python 3.10.0 alpha 2


`Release date: 2020-11-03'

@menu
* Security: Security<39>. 
* Core and Builtins: Core and Builtins<135>. 
* Library: Library<138>. 
* Core and Builtins: Core and Builtins<136>. 
* Library: Library<139>. 
* Documentation: Documentation<46>. 
* Tests: Tests<46>. 
* Build: Build<53>. 
* Windows: Windows<45>. 
* macOS: macOS<36>. 
* IDLE: IDLE<26>. 
* C API: C API<47>. 

@end menu

@node Security<39>,Core and Builtins<135>,,Python 3 10 0 alpha 2
@anchor{whatsnew/changelog id623}@anchor{1d37}
@subsubsection Security



@itemize -

@item 
bpo-42103@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42103}: Prevented potential DoS attack via CPU and RAM exhaustion when
processing malformed Apple Property List files in binary format.

@item 
bpo-42051@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42051}: The @ref{b0,,plistlib} module no longer accepts entity
declarations in XML plist files to avoid XML vulnerabilities. This should
not affect users as entity declarations are not used in regular plist
files.
@end itemize

@node Core and Builtins<135>,Library<138>,Security<39>,Python 3 10 0 alpha 2
@anchor{whatsnew/changelog id624}@anchor{1d38}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-42236@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42236}: If the @code{nl_langinfo(CODESET)} function returns an empty
string, Python now uses UTF-8 as the filesystem encoding. Patch by Victor
Stinner.

@item 
bpo-42218@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42218}: Fixed a bug in the PEG parser that was causing crashes in debug
mode. Now errors are checked in left-recursive rules to avoid cases where
such errors do not get handled in time and appear as long-distance crashes
in other places.

@item 
bpo-42214@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42214}: Fixed a possible crash in the PEG parser when checking for the
‘!=’ token in the @code{barry_as_flufl} rule. Patch by Pablo Galindo.

@item 
bpo-42206@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42206}: Propagate and raise the errors caused by
@code{PyAST_Validate()} in the parser.

@item 
bpo-41796@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41796}: The @ref{9,,ast} module internal state is now per interpreter.
Patch by Victor Stinner.

@item 
bpo-42143@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42143}: Fix handling of errors during creation of @code{PyFunctionObject},
which resulted in operations on uninitialized memory. Patch by Yonatan
Goldschmidt.

@item 
bpo-41659@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41659}: Fix a bug in the parser, where a curly brace following a
@code{primary} didn’t fail immediately. This led to invalid expressions like
@code{a @{b@}} to throw a @ref{18f,,SyntaxError} with a wrong offset, or invalid
expressions ending with a curly brace like @code{a @{} to not fail immediately
in the REPL.

@item 
bpo-42150@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42150}: Fix possible buffer overflow in the new parser when checking
for continuation lines. Patch by Pablo Galindo.

@item 
bpo-42123@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42123}: Run the parser two times. On the first run, disable all the
rules that only generate better error messages to gain performance. If
there’s a parse failure, run the parser a second time with those enabled.

@item 
bpo-42093@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42093}: The @code{LOAD_ATTR} instruction now uses new “per opcode cache”
mechanism and it is about 36% faster now. Patch by Pablo Galindo and Yury
Selivanov.

@item 
bpo-42030@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42030}: Support for the legacy AIX-specific shared library loading
support has been removed. All versions of AIX since 4.3 have supported and
defaulted to using the common Unix mechanism instead.

@item 
bpo-41984@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41984}: The garbage collector now tracks all user-defined classes.
Patch by Brandt Bucher.

@item 
bpo-41993@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41993}: Fixed potential issues with removing not completely initialized
module from @code{sys.modules} when import fails.

@item 
bpo-41979@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41979}: Star-unpacking is now allowed for with item’s targets in the
PEG parser.

@item 
bpo-41974@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41974}: Removed special methods @code{__int__}, @code{__float__},
@code{__floordiv__}, @code{__mod__}, @code{__divmod__}, @code{__rfloordiv__},
@code{__rmod__} and @code{__rdivmod__} of the @ref{198,,complex} class.  They
always raised a @ref{199,,TypeError}.

@item 
bpo-41902@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41902}: Micro optimization when compute
@ref{1d39,,sq_item} and
@ref{1d3a,,mp_subscript} of @ref{b43,,range}. Patch by
Donghee Na.

@item 
bpo-41894@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41894}: When loading a native module and a load failure occurs, prevent
a possible UnicodeDecodeError when not running in a UTF-8 locale by
decoding the load error message using the current locale’s encoding.

@item 
bpo-41902@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41902}: Micro optimization for range.index if step is 1. Patch by
Donghee Na.
@end itemize

@node Library<138>,Core and Builtins<136>,Core and Builtins<135>,Python 3 10 0 alpha 2
@anchor{whatsnew/changelog id625}@anchor{1d3b}
@subsubsection Library



@itemize -

@item 
bpo-41435@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41435}: Add @code{sys._current_exceptions()} function to retrieve a
dictionary mapping each thread’s identifier to the topmost exception
currently active in that thread at the time the function is called.
@end itemize

@node Core and Builtins<136>,Library<139>,Library<138>,Python 3 10 0 alpha 2
@anchor{whatsnew/changelog id626}@anchor{1d3c}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-38605@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38605}: Enable @code{from __future__ import annotations} (
@geindex Python Enhancement Proposals; PEP 563
PEP 563@footnote{https://peps.python.org/pep-0563/}) by
default. The values found in @ref{456,,__annotations__} dicts are now
strings, for example @code{@{"x": "int"@}} instead of @code{@{"x": int@}}.
@end itemize

@node Library<139>,Documentation<46>,Core and Builtins<136>,Python 3 10 0 alpha 2
@anchor{whatsnew/changelog id627}@anchor{1d3d}
@subsubsection Library



@itemize -

@item 
bpo-35455@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35455}: On Solaris, @ref{b36,,thread_time()} is now implemented with
@code{gethrvtime()} because @code{clock_gettime(CLOCK_THREAD_CPUTIME_ID)} is not
always available. Patch by Jakub Kulik.

@item 
bpo-42233@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42233}: The @ref{1c3,,repr()} of @ref{10b,,typing} types containing
@ref{8c3,,Generic Alias Types} previously did not show
the parameterized types in the @code{GenericAlias}.  They have now been
changed to do so.

@item 
bpo-29566@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29566}: @code{binhex.binhex()} consistently writes macOS 9 line endings.

@item 
bpo-26789@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26789}: The @ref{1c96,,logging.FileHandler} class now keeps a reference to
the builtin @ref{318,,open()} function to be able to open or reopen the file
during Python finalization. Fix errors like: @code{NameError: name 'open' is
not defined}. Patch by Victor Stinner.

@item 
bpo-42157@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42157}: Removed the @code{unicodedata.ucnhash_CAPI} attribute which was an
internal PyCapsule object. The related private @code{_PyUnicode_Name_CAPI}
structure was moved to the internal C API. Patch by Victor Stinner.

@item 
bpo-42157@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42157}: Convert the @ref{10c,,unicodedata} extension module to the
multiphase initialization API (
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}) and convert the
@code{unicodedata.UCD} static type to a heap type. Patch by Mohamed Koubaa
and Victor Stinner.

@item 
bpo-42146@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42146}: Fix memory leak in @ref{4b8,,subprocess.Popen()} in case an uid
(gid) specified in @code{user} (@code{group}, @code{extra_groups}) overflows
@code{uid_t} (@code{gid_t}).

@item 
bpo-42103@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42103}: @ref{1d3e,,InvalidFileException} and @ref{f6e,,RecursionError}
are now the only errors caused by loading malformed binary Plist file
(previously ValueError and TypeError could be raised in some specific
cases).

@item 
bpo-41490@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41490}: In @code{importlib.resources}, @code{.path} method is more aggressive
about releasing handles to zipfile objects early, enabling use-cases like
certifi to leave the context open but delete the underlying zip file.

@item 
bpo-41052@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41052}: Pickling heap types implemented in C with protocols 0 and 1
raises now an error instead of producing incorrect data.

@item 
bpo-42089@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42089}: In @code{importlib.metadata.PackageNotFoundError}, make reference
to the package metadata being missing to improve the user experience.

@item 
bpo-41491@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41491}: plistlib: fix parsing XML plists with hexadecimal integer
values

@item 
bpo-42065@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42065}: Fix an incorrectly formatted error from
@code{_codecs.charmap_decode()} when called with a mapped value outside
the range of valid Unicode code points. PR by Max Bernstein.

@item 
bpo-41966@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41966}: Fix pickling pure Python @ref{1fd,,datetime.time} subclasses.
Patch by Dean Inwood.

@item 
bpo-19270@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19270}: @ref{1d3f,,sched.scheduler.cancel()} will now cancel the correct
event, if two events with same priority are scheduled for the same time.
Patch by Bar Harel.

@item 
bpo-28660@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28660}: @ref{16d3,,textwrap.wrap()} now attempts to break long words after
hyphens when @code{break_long_words=True} and @code{break_on_hyphens=True}.

@item 
bpo-35823@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35823}: Use @code{vfork()} instead of @code{fork()} for
@ref{4b8,,subprocess.Popen()} on Linux to improve performance in cases where it
is deemed safe.

@item 
bpo-42043@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42043}: Add support for @code{zipfile.Path} inheritance.
@code{zipfile.Path.is_file()} now returns False for non-existent names.
@code{zipfile.Path} objects now expose a @code{.filename} attribute and rely on
that to resolve @code{.name} and @code{.parent} when the @code{Path} object is at
the root of the zipfile.

@item 
bpo-42021@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42021}: Fix possible ref leaks in @ref{d4,,sqlite3} module init.

@item 
bpo-39101@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39101}: Fixed tests using IsolatedAsyncioTestCase from hanging on
BaseExceptions.

@item 
bpo-41976@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41976}: Fixed a bug that was causing @ref{f4b,,ctypes.util.find_library()}
to return @code{None} when triying to locate a library in an environment when
gcc>=9 is available and @code{ldconfig} is not. Patch by Pablo Galindo

@item 
bpo-41943@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41943}: Fix bug where TestCase.assertLogs doesn’t correctly filter
messages by level.

@item 
bpo-41923@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41923}: Implement 
@geindex Python Enhancement Proposals; PEP 613
PEP 613@footnote{https://peps.python.org/pep-0613/}, introducing @ref{9d2,,typing.TypeAlias}
annotation.

@item 
bpo-41905@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41905}: A new function in abc: `update_abstractmethods' to re-calculate
an abstract class’s abstract status. In addition, `dataclass' has been
changed to call this function.

@item 
bpo-23706@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23706}: Added `newline' parameter to @code{pathlib.Path.write_text()}.

@item 
bpo-41876@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41876}: Tkinter font class repr uses font name

@item 
bpo-41831@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41831}: @code{str()} for the @code{type} attribute of the @code{tkinter.Event}
object always returns now the numeric code returned by Tk instead of the
name of the event type.

@item 
bpo-39337@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39337}: @ref{a03,,encodings.normalize_encoding()} now ignores non-ASCII
characters.

@item 
bpo-41747@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41747}: Ensure all methods that generated from
@ref{4e2,,dataclasses.dataclass()} objects now have the proper @code{__qualname__}
attribute referring to the class they belong to. Patch by Batuhan Taskaya.

@item 
bpo-30681@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30681}: Handle exceptions caused by unparsable date headers when using
email “default” policy.  Patch by Tim Bell, Georges Toth

@item 
bpo-41586@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41586}: Add F_SETPIPE_SZ and F_GETPIPE_SZ to fcntl module. Allow
setting pipesize on subprocess.Popen.

@item 
bpo-41229@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41229}: Add @code{contextlib.aclosing} for deterministic cleanup of async
generators which is analogous to @code{contextlib.closing} for non-async
generators. Patch by Joongi Kim and John Belmonte.

@item 
bpo-16396@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16396}: Allow @code{ctypes.wintypes} to be imported on non-Windows
systems.

@item 
bpo-4356@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4356}: Add a key function to the bisect module.

@item 
bpo-40592@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40592}: @ref{6dc,,shutil.which()} now ignores empty entries in
@geindex PATHEXT
@geindex environment variable; PATHEXT
@code{PATHEXT} instead of treating them as a match.

@item 
bpo-40492@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40492}: Fix @code{--outfile} for @ref{2b,,cProfile} / @ref{b4,,profile} not
writing the output file in the original directory when the program being
profiled changes the working directory.  PR by Anthony Sottile.

@item 
bpo-34204@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34204}: The @ref{c8,,shelve} module now uses
@ref{a35,,pickle.DEFAULT_PROTOCOL} by default instead of @ref{ab,,pickle}
protocol @code{3}.

@item 
bpo-27321@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27321}: Fixed KeyError exception when flattening an email to a string
attempts to replace a non-existent Content-Transfer-Encoding header.

@item 
bpo-38976@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38976}: The @ref{74,,http.cookiejar} module now supports the parsing of
cookies in CURL-style cookiejar files through MozillaCookieJar on all
platforms. Previously, such cookie entries would be silently ignored when
loading a cookiejar with such entries.

Additionally, the HTTP Only attribute is persisted in the object, and will
be correctly written to file if the MozillaCookieJar object is
subsequently dumped.
@end itemize

@node Documentation<46>,Tests<46>,Library<139>,Python 3 10 0 alpha 2
@anchor{whatsnew/changelog id628}@anchor{1d40}
@subsubsection Documentation



@itemize -

@item 
bpo-42061@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42061}: Document __format__ functionality for IP addresses.

@item 
bpo-41910@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41910}: Document the default implementation of @code{object.__eq__}.

@item 
bpo-42010@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42010}: Clarify that subscription expressions are also valid for
certain @ref{1d41,,classes} and @ref{1d42,,types} in the standard
library, and for user-defined classes and types if the classmethod
@code{__class_getitem__()} is provided.

@item 
bpo-41805@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41805}: Documented @ref{8c3,,generic alias type} and
@ref{9f2,,types.GenericAlias}. Also added an entry in glossary for
@ref{1a2,,generic types}.

@item 
bpo-39693@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39693}: Fix tarfile’s extractfile documentation

@item 
bpo-39416@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39416}: Document some restrictions on the default string
representations of numeric classes.
@end itemize

@node Tests<46>,Build<53>,Documentation<46>,Python 3 10 0 alpha 2
@anchor{whatsnew/changelog id629}@anchor{1d43}
@subsubsection Tests



@itemize -

@item 
bpo-41739@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41739}: Fix test_logging.test_race_between_set_target_and_flush(): the
test now waits until all threads complete to avoid leaking running
threads.

@item 
bpo-41970@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41970}: Avoid a test failure in @code{test_lib2to3} if the module has
already imported at the time the test executes. Patch by Pablo Galindo.

@item 
bpo-41944@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41944}: Tests for CJK codecs no longer call @code{eval()} on content
received via HTTP.

@item 
bpo-41306@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41306}: Fixed a failure in @code{test_tk.test_widgets.ScaleTest} happening
when executing the test with Tk 8.6.10.
@end itemize

@node Build<53>,Windows<45>,Tests<46>,Python 3 10 0 alpha 2
@anchor{whatsnew/changelog id630}@anchor{1d44}
@subsubsection Build



@itemize -

@item 
bpo-38980@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38980}: Add @code{-fno-semantic-interposition} to both the compile and
link line when building with @code{--enable-optimizations}. Patch by Victor
Stinner and Pablo Galindo.
@end itemize

@node Windows<45>,macOS<36>,Build<53>,Python 3 10 0 alpha 2
@anchor{whatsnew/changelog id631}@anchor{1d45}
@subsubsection Windows



@itemize -

@item 
bpo-38439@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38439}: Updates the icons for IDLE in the Windows Store package.

@item 
bpo-38252@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38252}: Use 8-byte step to detect ASCII sequence in 64-bit Windows
build.

@item 
bpo-39107@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39107}: Update Tcl and Tk to 8.6.10 in Windows installer.

@item 
bpo-41557@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41557}: Update Windows installer to use SQLite 3.33.0.

@item 
bpo-38324@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38324}: Avoid Unicode errors when accessing certain locale data on
Windows.
@end itemize

@node macOS<36>,IDLE<26>,Windows<45>,Python 3 10 0 alpha 2
@anchor{whatsnew/changelog id632}@anchor{1d46}
@subsubsection macOS



@itemize -

@item 
bpo-41471@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41471}: Ignore invalid prefix lengths in system proxy excludes.
@end itemize

@node IDLE<26>,C API<47>,macOS<36>,Python 3 10 0 alpha 2
@anchor{whatsnew/changelog id633}@anchor{1d47}
@subsubsection IDLE



@itemize -

@item 
bpo-33987@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33987}: Mostly finish using ttk widgets, mainly for editor, settings,
and searches. Some patches by Mark Roseman.

@item 
bpo-40511@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40511}: Typing opening and closing parentheses inside the parentheses
of a function call will no longer cause unnecessary “flashing” off and on
of an existing open call-tip, e.g. when typed in a string literal.

@item 
bpo-38439@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38439}: Add a 256×256 pixel IDLE icon to the Windows .ico file. Created
by Andrew Clover. Remove the low-color gif variations from the .ico file.
@end itemize

@node C API<47>,,IDLE<26>,Python 3 10 0 alpha 2
@anchor{whatsnew/changelog id634}@anchor{1d48}
@subsubsection C API



@itemize -

@item 
bpo-42157@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42157}: The private @code{_PyUnicode_Name_CAPI} structure of the PyCapsule
API @code{unicodedata.ucnhash_CAPI} has been moved to the internal C API.
Patch by Victor Stinner.

@item 
bpo-42015@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42015}: Fix potential crash in deallocating method objects when
dynamically allocated @ref{16e3,,PyMethodDef}’s lifetime is managed through
the @code{self} argument of a @ref{1684,,PyCFunction}.

@item 
bpo-40423@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40423}: The @ref{dc,,subprocess} module and @code{os.closerange} will now use
the @code{close_range(low, high, flags)} syscall when it is available for
more efficient closing of ranges of descriptors.

@item 
bpo-41845@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41845}: @ref{1d49,,PyObject_GenericGetDict()} is available again in the
limited API when targeting 3.10 or later.

@item 
bpo-40422@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40422}: Add @code{_Py_closerange} function to provide performant closing
of a range of file descriptors.

@item 
bpo-41986@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41986}: @code{Py_FileSystemDefaultEncodeErrors} and
@code{Py_UTF8Mode} are available again in limited API.

@item 
bpo-41756@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41756}: Add @code{PyIter_Send} function to allow sending value into
generator/coroutine/iterator without raising StopIteration exception to
signal return.

@item 
bpo-41784@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41784}: Added @code{PyUnicode_AsUTF8AndSize} to the limited C API.
@end itemize

@node Python 3 10 0 alpha 1,Python 3 9 0 beta 1,Python 3 10 0 alpha 2,Changelog
@anchor{whatsnew/changelog python-3-10-0-alpha-1}@anchor{1d4a}
@subsection Python 3.10.0 alpha 1


`Release date: 2020-10-05'

@menu
* Security: Security<40>. 
* Core and Builtins: Core and Builtins<137>. 
* Library: Library<140>. 
* Core and Builtins: Core and Builtins<138>. 
* Library: Library<141>. 
* Core and Builtins: Core and Builtins<139>. 
* Library: Library<142>. 
* Core and Builtins: Core and Builtins<140>. 
* Library: Library<143>. 
* Core and Builtins: Core and Builtins<141>. 
* Library: Library<144>. 
* Core and Builtins: Core and Builtins<142>. 
* Library: Library<145>. 
* Core and Builtins: Core and Builtins<143>. 
* Library: Library<146>. 
* Core and Builtins: Core and Builtins<144>. 
* Library: Library<147>. 
* Core and Builtins: Core and Builtins<145>. 
* Library: Library<148>. 
* Core and Builtins: Core and Builtins<146>. 
* Library: Library<149>. 
* Core and Builtins: Core and Builtins<147>. 
* Library: Library<150>. 
* Core and Builtins: Core and Builtins<148>. 
* Library: Library<151>. 
* Core and Builtins: Core and Builtins<149>. 
* Library: Library<152>. 
* Core and Builtins: Core and Builtins<150>. 
* Library: Library<153>. 
* Core and Builtins: Core and Builtins<151>. 
* Library: Library<154>. 
* Documentation: Documentation<47>. 
* Tests: Tests<47>. 
* Build: Build<54>. 
* Windows: Windows<46>. 
* macOS: macOS<37>. 
* IDLE: IDLE<27>. 
* C API: C API<48>. 

@end menu

@node Security<40>,Core and Builtins<137>,,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id635}@anchor{1d4b}
@subsubsection Security



@itemize -

@item 
bpo-41304@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41304}: Fixes @code{python3x._pth} being ignored on Windows, caused by the
fix for bpo-29778@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29778} (
@geindex Common Vulnerabilities and Exposures; CVE 2020-15801
CVE 2020-15801@footnote{https://www.cve.org/CVERecord?id=CVE-2020-15801}).

@item 
bpo-41162@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41162}: Audit hooks are now cleared later during finalization to avoid
missing events.

@item 
bpo-29778@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29778}: Ensure @code{python3.dll} is loaded from correct locations
when Python is embedded (
@geindex Common Vulnerabilities and Exposures; CVE 2020-15523
CVE 2020-15523@footnote{https://www.cve.org/CVERecord?id=CVE-2020-15523}).

@item 
bpo-41004@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41004}: The __hash__() methods of  ipaddress.IPv4Interface and
ipaddress.IPv6Interface incorrectly generated constant hash values of 32
and 128 respectively. This resulted in always causing hash collisions. The
fix uses hash() to generate hash values for the tuple of (address, mask
length, network address).

@item 
bpo-39603@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39603}: Prevent http header injection by rejecting control characters
in http.client.putrequest(…).
@end itemize

@node Core and Builtins<137>,Library<140>,Security<40>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id636}@anchor{1d4c}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-41909@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41909}: Fixed stack overflow in @ref{9ca,,issubclass()} and
@ref{2af,,isinstance()} when getting the @code{__bases__} attribute leads to
infinite recursion.

@item 
bpo-41922@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41922}: Speed up calls to @code{reversed()} by using the 
@geindex Python Enhancement Proposals; PEP 590
PEP 590@footnote{https://peps.python.org/pep-0590/}
@code{vectorcall} calling convention. Patch by Donghee Na.

@item 
bpo-41873@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41873}: Calls to @code{float()} are now faster due to the @code{vectorcall}
calling convention. Patch by Dennis Sweeney.

@item 
bpo-41870@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41870}: Speed up calls to @code{bool()} by using the 
@geindex Python Enhancement Proposals; PEP 590
PEP 590@footnote{https://peps.python.org/pep-0590/}
@code{vectorcall} calling convention. Patch by Donghee Na.
@end itemize

@node Library<140>,Core and Builtins<138>,Core and Builtins<137>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id637}@anchor{1d4d}
@subsubsection Library



@itemize -

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port the @code{_bisect} module to the multi-phase
initialization API (
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).
@end itemize

@node Core and Builtins<138>,Library<141>,Library<140>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id638}@anchor{1d4e}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-39934@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39934}: Correctly count control blocks in ‘except’ in compiler. Ensures
that a syntax error, rather a fatal error, occurs for deeply nested, named
exception handlers.

@item 
bpo-41780@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41780}: Fix @code{__dir__()} of @ref{9f2,,types.GenericAlias}. Patch by
Batuhan Taskaya.
@end itemize

@node Library<141>,Core and Builtins<139>,Core and Builtins<138>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id639}@anchor{1d4f}
@subsubsection Library



@itemize -

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port the @code{_lsprof} extension module to multi-phase
initialization (
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port the @ref{19,,cmath} extension module to multi-phase
initialization (
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port the @code{_scproxy} extension module to multi-phase
initialization (
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port the @ref{e7,,termios} extension module to multi-phase
initialization (
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Convert the @code{_sha256} extension module types to heap
types.
@end itemize

@node Core and Builtins<139>,Library<142>,Library<141>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id640}@anchor{1d50}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-41690@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41690}: Fix a possible stack overflow in the parser when parsing
functions and classes with a huge amount of arguments. Patch by Pablo
Galindo.
@end itemize

@node Library<142>,Core and Builtins<140>,Core and Builtins<139>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id641}@anchor{1d51}
@subsubsection Library



@itemize -

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port the @code{_overlapped} extension module to multi-phase
initialization (
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port the @code{_curses_panel} extension module to
multi-phase initialization (
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port the @code{_opcode} extension module to multi-phase
initialization (
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).
@end itemize

@node Core and Builtins<140>,Library<143>,Library<142>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id642}@anchor{1d52}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-41681@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41681}: Fixes the wrong error description in the error raised by using
2 @code{,} in format string in f-string and @ref{834,,str.format()}.
@end itemize

@node Library<143>,Core and Builtins<141>,Core and Builtins<140>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id643}@anchor{1d53}
@subsubsection Library



@itemize -

@item 
bpo-41675@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41675}: The implementation of @ref{1341,,signal.siginterrupt()} now uses
@code{sigaction()} (if it is available in the system) instead of the
deprecated @code{siginterrupt()}. Patch by Pablo Galindo.
@end itemize

@node Core and Builtins<141>,Library<144>,Library<143>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id644}@anchor{1d54}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-41670@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41670}: Prevent line trace being skipped on platforms not compiled with
@code{USE_COMPUTED_GOTOS}. Fixes issue where some lines nested within a
try-except block were not being traced on Windows.

@item 
bpo-41654@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41654}: Fix a crash that occurred when destroying subclasses of
@ref{1761,,MemoryError}. Patch by Pablo Galindo.
@end itemize

@node Library<144>,Core and Builtins<142>,Core and Builtins<141>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id645}@anchor{1d55}
@subsubsection Library



@itemize -

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port the @ref{13a,,zlib} extension module to multi-phase
initialization (
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).
@end itemize

@node Core and Builtins<142>,Library<145>,Library<144>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id646}@anchor{1d56}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-41631@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41631}: The @code{_ast} module uses again a global state. Using a module
state per module instance is causing subtle practical problems. For
example, the Mercurial project replaces the @code{__import__()} function to
implement lazy import, whereas Python expected that @code{import _ast} always
return a fully initialized @code{_ast} module.
@end itemize

@node Library<145>,Core and Builtins<143>,Core and Builtins<142>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id647}@anchor{1d57}
@subsubsection Library



@itemize -

@item 
bpo-40077@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40077}: Convert @code{_operator} to use @ref{79e,,PyType_FromSpec()}.
@end itemize

@node Core and Builtins<143>,Library<146>,Library<145>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id648}@anchor{1d58}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-1653741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1653741}: Port @code{_sha3} to multi-phase init.  Convert static types
to heap types.
@end itemize

@node Library<146>,Core and Builtins<144>,Core and Builtins<143>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id649}@anchor{1d59}
@subsubsection Library



@itemize -

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port the @code{_blake2} extension module to the multi-phase
initialization API (
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).
@end itemize

@node Core and Builtins<144>,Library<147>,Library<146>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id650}@anchor{1d5a}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-41533@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41533}: Free the stack allocated in @code{va_build_stack} if
@code{do_mkstack} fails and the stack is not a @code{small_stack}.

@item 
bpo-41531@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41531}: Fix a bug that was dropping keys when compiling dict literals
with more than 0xFFFF elements. Patch by Pablo Galindo.

@item 
bpo-41525@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41525}: The output of @code{python --help} contains now only ASCII
characters.
@end itemize

@node Library<147>,Core and Builtins<145>,Core and Builtins<144>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id651}@anchor{1d5b}
@subsubsection Library



@itemize -

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port the @code{_sha1}, @code{_sha512}, and @code{_md5}
extension modules to multi-phase initialization API (
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).
@end itemize

@node Core and Builtins<145>,Library<148>,Library<147>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id652}@anchor{1d5c}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-41431@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41431}: Optimize @code{dict_merge()} for copying dict (e.g. @code{dict(d)}
and @code{@{@}.update(d)}).

@item 
bpo-41428@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41428}: Implement PEP 604. This supports (int | str) etc. in place of
Union[str, int].

@item 
bpo-41340@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41340}: Removed fallback implementation for @code{strdup}.

@item 
bpo-38156@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38156}: Handle interrupts that come after EOF correctly in
@code{PyOS_StdioReadline}.

@item 
bpo-41342@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41342}: @ref{14e6,,round()} with integer argument is now faster (9–60%).

@item 
bpo-41334@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41334}: Constructors @ref{16a,,str()}, @ref{193,,bytes()} and @ref{342,,bytearray()}
are now faster (around 30–40% for small objects).

@item 
bpo-41295@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41295}: Resolve a regression in CPython 3.8.4 where defining
“__setattr__” in a multi-inheritance setup and calling up the hierarchy
chain could fail if builtins/extension types were involved in the base
types.

@item 
bpo-41323@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41323}: Bytecode optimizations are performed directly on the control
flow graph. This will result in slightly more compact code objects in some
circumstances.

@item 
bpo-41247@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41247}: Always cache the running loop holder when running
@code{asyncio.set_running_loop}.

@item 
bpo-41252@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41252}: Fix incorrect refcounting in _ssl.c’s
@code{_servername_callback()}.

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port @ref{98,,multiprocessing} to multi-phase initialization
@end itemize

@node Library<148>,Core and Builtins<146>,Core and Builtins<145>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id653}@anchor{1d5d}
@subsubsection Library



@itemize -

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port @code{winapi} to multiphase initialization
@end itemize

@node Core and Builtins<146>,Library<149>,Library<148>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id654}@anchor{1d5e}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-41215@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41215}: Use non-NULL default values in the PEG parser keyword list to
overcome a bug that was preventing Python from being properly compiled
when using the XLC compiler. Patch by Pablo Galindo.

@item 
bpo-41218@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41218}: Python 3.8.3 had a regression where compiling with
ast.PyCF_ALLOW_TOP_LEVEL_AWAIT would aggressively mark list comprehension
with CO_COROUTINE. Now only list comprehension making use of async/await
will tagged as so.
@end itemize

@node Library<149>,Core and Builtins<147>,Core and Builtins<146>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id655}@anchor{1d5f}
@subsubsection Library



@itemize -

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port @ref{5c,,faulthandler} to multiphase initialization.

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port @code{sha256} to multiphase initialization
@end itemize

@node Core and Builtins<147>,Library<150>,Library<149>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id656}@anchor{1d60}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-41175@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41175}: Guard against a NULL pointer dereference within bytearrayobject
triggered by the @code{bytearray() + bytearray()} operation.

@item 
bpo-41100@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41100}: add arm64 to the allowable Mac OS arches in mpdecimal.h

@item 
bpo-41094@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41094}: Fix decoding errors with audit when open files with non-ASCII
names on non-UTF-8 locale.

@item 
bpo-39960@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39960}: The “hackcheck” that prevents sneaking around a type’s
__setattr__() by calling the superclass method was rewritten to allow C
implemented heap types.

@item 
bpo-41084@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41084}: Prefix the error message with ‘f-string: ‘, when parsing an
f-string expression which throws a @ref{18f,,SyntaxError}.

@item 
bpo-40521@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40521}: Empty frozensets are no longer singletons.

@item 
bpo-41076@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41076}: Pre-feed the parser with the location of the f-string
expression, not the f-string itself, which allows us to skip the shifting
of the AST node locations after the parsing is completed.

@item 
bpo-41056@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41056}: Fixes a reference to deallocated stack space during startup
when constructing sys.path involving a relative symlink when code was
supplied via -c.  (discovered via Coverity)

@item 
bpo-41061@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41061}: Fix incorrect expressions and asserts in hashtable code and
tests.

@item 
bpo-41052@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41052}: Opt out serialization/deserialization for _random.Random

@item 
bpo-40939@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40939}: Rename @code{PyPegen*} functions to @code{PyParser*}, so that we can
remove the old set of @code{PyParser*} functions that were using the old
parser, but keep everything backwards-compatible.

@item 
bpo-35975@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35975}: Stefan Behnel reported that cf_feature_version is used even
when PyCF_ONLY_AST is not set. This is against the intention and against
the documented behavior, so it’s been fixed.

@item 
bpo-40939@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40939}: Remove the remaining files from the old parser and the
@code{symbol} module.
@end itemize

@node Library<150>,Core and Builtins<148>,Core and Builtins<147>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id657}@anchor{1d61}
@subsubsection Library



@itemize -

@item 
bpo-40077@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40077}: Convert @code{_bz2} to use @ref{79e,,PyType_FromSpec()}.
@end itemize

@node Core and Builtins<148>,Library<151>,Library<150>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id658}@anchor{1d62}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-41006@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41006}: The @code{encodings.latin_1} module is no longer imported at
startup. Now it is only imported when it is the filesystem encoding or the
stdio encoding.

@item 
bpo-40636@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40636}: @ref{1a1,,zip()} now supports 
@geindex Python Enhancement Proposals; PEP 618
PEP 618@footnote{https://peps.python.org/pep-0618/}’s @code{strict} parameter,
which raises a @ref{2ee,,ValueError} if the arguments are exhausted at
different lengths. Patch by Brandt Bucher.

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port @code{_gdbm} to multiphase initialization.

@item 
bpo-40985@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40985}: Fix a bug that caused the @ref{18f,,SyntaxError} text to be empty
when a file ends with a line ending in a line continuation character (i.e.
backslash). The error text should contain the text of the last line.

@item 
bpo-40958@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40958}: Fix a possible buffer overflow in the PEG parser when gathering
information for emitting syntax errors. Patch by Pablo Galindo.

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port @code{_dbm} to multiphase initialization.

@item 
bpo-40957@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40957}: Fix refleak in _Py_fopen_obj() when PySys_Audit() fails
@end itemize

@node Library<151>,Core and Builtins<149>,Core and Builtins<148>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id659}@anchor{1d63}
@subsubsection Library



@itemize -

@item 
bpo-40950@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40950}: Add a state to the @code{nis} module (
@geindex Python Enhancement Proposals; PEP 3121
PEP 3121@footnote{https://peps.python.org/pep-3121/}) and apply
the multiphase initialization. Patch by Donghee Na.
@end itemize

@node Core and Builtins<149>,Library<152>,Library<151>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id660}@anchor{1d64}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-40947@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40947}: The Python @ref{ab0,,Path Configuration} now
takes @ref{1d65,,PyConfig.platlibdir} in account.

@item 
bpo-40939@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40939}: Remove the old parser, the @code{parser} module and all
associated support code, command-line options and environment variables.
Patch by Pablo Galindo.

@item 
bpo-40847@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40847}: Fix a bug where a line with only a line continuation character
is not considered a blank line at tokenizer level. In such cases, more
than a single @code{NEWLINE} token was emitted. The old parser was working
around the issue, but the new parser threw a @ref{18f,,SyntaxError} for valid
input due to this. For example, an empty line following a line
continuation character was interpreted as a @code{SyntaxError}.

@item 
bpo-40890@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40890}: Each dictionary view now has a @code{mapping} attribute that
provides a @ref{699,,types.MappingProxyType} wrapping the original
dictionary.  Patch contributed by Dennis Sweeney.

@item 
bpo-40889@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40889}: Improved the performance of symmetric difference operations on
dictionary item views.  Patch by Dennis Sweeney.

@item 
bpo-40904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40904}: Fix possible segfault in the new PEG parser when parsing
f-string containing yield statements with no value (@code{f"@{yield@}"}).
Patch by Pablo Galindo

@item 
bpo-40903@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40903}: Fixed a possible segfault in the new PEG parser when producing
error messages for invalid assignments of the form @code{p=p=}. Patch by
Pablo Galindo

@item 
bpo-40880@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40880}: Fix invalid memory read in the new parser when checking
newlines in string literals. Patch by Pablo Galindo.

@item 
bpo-40883@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40883}: Fix memory leak in when parsing f-strings in the new parser.
Patch by Pablo Galindo

@item 
bpo-40870@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40870}: Raise @ref{2ee,,ValueError} when validating custom AST’s where the
constants @code{True}, @code{False} and @code{None} are used within a
@ref{1d66,,ast.Name} node.

@item 
bpo-40854@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40854}: Allow overriding @ref{b38,,sys.platlibdir} via a new
@geindex PYTHONPLATLIBDIR
@geindex environment variable; PYTHONPLATLIBDIR
@ref{1d67,,PYTHONPLATLIBDIR} environment variable.

@item 
bpo-40826@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40826}: Fix GIL usage in @code{PyOS_Readline()}: lock the GIL to set
an exception and pass the Python thread state when checking if there is a
pending signal.

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port @ref{5d,,fcntl} to multiphase initialization.

@item 
bpo-19468@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19468}: Delete unnecessary instance check in importlib.reload(). Patch
by Furkan Önder.

@item 
bpo-40824@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40824}: Unexpected errors in calling the @code{__iter__} method are no
longer masked by @code{TypeError} in the @ref{349,,in} operator and functions
@ref{add,,contains()}, @ref{ade,,indexOf()} and
@ref{adf,,countOf()} of the @ref{a3,,operator} module.

@item 
bpo-40792@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40792}: Attributes @code{start}, @code{stop} and @code{step} of the
@ref{b43,,range} object now always has exact type @ref{19c,,int}.  Previously,
they could have been an instance of a subclass of @code{int}.

@item 
bpo-40780@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40780}: Fix a corner case where g-style string formatting of a float
failed to remove trailing zeros.

@item 
bpo-38964@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38964}: When there’s a @ref{18f,,SyntaxError} in the expression part of an
fstring, the filename attribute of the @code{SyntaxError} gets correctly
set to the name of the file the fstring resides in.

@item 
bpo-40750@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40750}: Support the “-d” debug flag in the new PEG parser. Patch by
Pablo Galindo

@item 
bpo-40217@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40217}: Instances of types created with
@ref{79f,,PyType_FromSpecWithBases()} will no longer automatically visit
their class object when traversing references in the garbage collector.
The user is expected to manually visit the object’s class. Patch by Pablo
Galindo.

@item 
bpo-39573@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39573}: @ref{3c7,,Py_TYPE()} is changed to the inline static function.
Patch by Donghee Na.

@item 
bpo-40696@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40696}: Fix a hang that can arise after @ref{71d,,generator.throw()} due to
a cycle in the exception context chain.

@item 
bpo-40521@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40521}: Each interpreter now its has own free lists, singletons and
caches:


@itemize *

@item 
Free lists: float, tuple, list, dict, frame, context,
asynchronous generator, MemoryError.

@item 
Singletons: empty tuple, empty bytes string, empty Unicode string,
single byte character, single Unicode (latin1) character.

@item 
Slice cache.
@end itemize

They are no longer shared by all interpreters.

@item 
bpo-40679@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40679}: Certain @ref{199,,TypeError} messages about missing or extra
arguments now include the function’s @ref{1d68,,qualified name}.  Patch by
Dennis Sweeney.

@item 
bpo-29590@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29590}: Make the stack trace correct after calling
@ref{71d,,generator.throw()} on a generator that has yielded from a @code{yield
from}.

@item 
bpo-4022@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4022}: Improve performance of generators by not raising internal
StopIteration.
@end itemize

@node Library<152>,Core and Builtins<150>,Core and Builtins<149>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id661}@anchor{1d69}
@subsubsection Library



@itemize -

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port @ref{94,,mmap} to multiphase initialization.

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port @code{_lzma} to multiphase initialization.
@end itemize

@node Core and Builtins<150>,Library<153>,Library<152>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id662}@anchor{1d6a}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-37999@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37999}: Builtin and extension functions that take integer arguments no
longer accept @ref{200,,Decimal}s, @ref{215,,Fraction}s and other objects that can be converted to integers only with a loss
(e.g. that have the @ref{19e,,__int__()} method but do not have the
@ref{19f,,__index__()} method).

@item 
bpo-29882@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29882}: Add @ref{9d5,,int.bit_count()}, counting the number of ones in the
binary representation of an integer. Patch by Niklas Fiekas.
@end itemize

@node Library<153>,Core and Builtins<151>,Core and Builtins<150>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id663}@anchor{1d6b}
@subsubsection Library



@itemize -

@item 
bpo-36982@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36982}: Use ncurses extended color functions when available to support
terminals with 256 colors, and add the new function
@ref{9fc,,curses.has_extended_color_support()} to indicate whether extended
color support is provided by the underlying ncurses library.
@end itemize

@node Core and Builtins<151>,Library<154>,Library<153>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id664}@anchor{1d6c}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-19569@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19569}: Add the private macros @code{_Py_COMP_DIAG_PUSH},
@code{_Py_COMP_DIAG_IGNORE_DEPR_DECLS}, and @code{_Py_COMP_DIAG_POP}.

@item 
bpo-26680@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26680}: The int type now supports the x.is_integer() method for
compatibility with float.
@end itemize

@node Library<154>,Documentation<47>,Core and Builtins<151>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id665}@anchor{1d6d}
@subsubsection Library



@itemize -

@item 
bpo-41900@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41900}: C14N 2.0 serialisation in xml.etree.ElementTree failed for
unprefixed attributes when a default namespace was defined.

@item 
bpo-41887@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41887}: Strip leading spaces and tabs on @ref{e18,,ast.literal_eval()}. Also
document stripping of spaces and tabs for @ref{4a4,,eval()}.

@item 
bpo-41773@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41773}: Note in documentation that @ref{ec7,,random.choices()} doesn’t
support non-finite weights, raise @ref{2ee,,ValueError} when given non-finite
weights.

@item 
bpo-41840@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41840}: Fix a bug in the @ref{de,,symtable} module that was causing
module-scope global variables to not be reported as both local and global.
Patch by Pablo Galindo.

@item 
bpo-41842@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41842}: Add @ref{9ef,,codecs.unregister()} function to unregister a codec
search function.

@item 
bpo-40564@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40564}: In @code{zipfile.Path}, mutate the passed ZipFile object type
instead of making a copy. Prevents issues when both the local copy and the
caller’s copy attempt to close the same file handle.

@item 
bpo-40670@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40670}: More reliable validation of statements in
@ref{16d4,,timeit.Timer}. It now accepts “empty” statements (only whitespaces
and comments) and rejects misindentent statements.

@item 
bpo-41833@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41833}: The @ref{177,,threading.Thread} constructor now uses the target
name if the `target' argument is specified but the `name' argument is
omitted.

@item 
bpo-41817@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41817}: fix @code{tkinter.EventType} Enum so all members are strings, and
none are tuples

@item 
bpo-41810@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41810}: @ref{a57,,types.EllipsisType}, @ref{a59,,types.NotImplementedType}
and @ref{a58,,types.NoneType} have been reintroduced, providing a new set of
types readily interpretable by static type checkers.

@item 
bpo-41815@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41815}: Fix SQLite3 segfault when backing up closed database. Patch
contributed by Peter David McCormick.

@item 
bpo-41816@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41816}: StrEnum added: it ensures that all members are already strings
or string candidates

@item 
bpo-41517@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41517}: fix bug allowing Enums to be extended via multiple inheritance

@item 
bpo-39587@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39587}: use the correct mix-in data type when constructing Enums

@item 
bpo-41792@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41792}: Add is_typeddict function to typing.py to check if a type is a
TypedDict class

Previously there was no way to check that without using private API. See
the relevant issue in python/typing@footnote{https://github.com/python/typing/issues/751}.

@item 
bpo-41789@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41789}: Honor @code{object} overrides in @code{Enum} class creation
(specifically, @code{__str__}, @code{__repr__}, @code{__format__}, and
@code{__reduce_ex__}).

@item 
bpo-32218@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32218}: @code{enum.Flag} and @code{enum.IntFlag} members are now iterable.

@item 
bpo-39651@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39651}: Fix a race condition in the @code{call_soon_threadsafe()} method
of @code{asyncio.ProactorEventLoop}: do nothing if the self-pipe socket has
been closed.

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port the @code{mashal} extension module to the multi-phase
initialization API (
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port the @code{_string} extension module to the multi-phase
initialization API (
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).

@item 
bpo-41732@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41732}: Added an @ref{4c9,,iterator} to @ref{166,,memoryview}.

@item 
bpo-41720@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41720}: Fixed @code{turtle.Vec2D.__rmul__()} for arguments which are not
int or float.

@item 
bpo-41696@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41696}: Fix handling of debug mode in @ref{2f5,,asyncio.run()}. This allows
setting @code{PYTHONASYNCIODEBUG} or @code{-X dev} to enable asyncio debug mode
when using @code{asyncio.run()}.

@item 
bpo-41687@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41687}: Fix implementation of sendfile to be compatible with Solaris.

@item 
bpo-41662@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41662}: No longer override exceptions raised in @code{__len__()} of a
sequence of parameters in @ref{d4,,sqlite3} with
@ref{307,,ProgrammingError}.

@item 
bpo-39010@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39010}: Restarting a @code{ProactorEventLoop} on Windows no longer logs
spurious @code{ConnectionResetErrors}.

@item 
bpo-41638@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41638}: @ref{307,,ProgrammingError} message for absent parameter
in @ref{d4,,sqlite3} contains now the name of the parameter instead of its
index when parameters are supplied as a dict.

@item 
bpo-41662@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41662}: Fixed crash when mutate list of parameters during iteration in
@ref{d4,,sqlite3}.

@item 
bpo-41513@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41513}: Improved the accuracy of math.hypot().  Internally, each step
is computed with extra precision so that the result is now almost always
correctly rounded.

@item 
bpo-41609@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41609}: The pdb whatis command correctly reports instance methods as
‘Method’ rather than ‘Function’.

@item 
bpo-39994@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39994}: Fixed pprint’s handling of dict subclasses that override
__repr__.

@item 
bpo-32751@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32751}: When cancelling the task due to a timeout,
@ref{816,,asyncio.wait_for()} will now wait until the cancellation is complete
also in the case when `timeout' is <= 0, like it does with positive
timeouts.

@item 
bpo-37658@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37658}: @ref{816,,asyncio.wait_for()} now properly handles races between
cancellation of itself and the completion of the wrapped awaitable.

@item 
bpo-40782@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40782}: Change the method asyncio.AbstractEventLoop.run_in_executor to
not be a coroutine.

@item 
bpo-41520@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41520}: Fix @ref{1d,,codeop} regression that prevented turning compile
warnings into errors.

@item 
bpo-41528@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41528}: turtle uses math module functions to convert degrees to radians
and vice versa and to calculate vector norm

@item 
bpo-41513@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41513}: Minor algorithmic improvement to math.hypot() and math.dist()
giving small gains in speed and accuracy.

@item 
bpo-41503@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41503}: Fixed a race between setTarget and flush in
logging.handlers.MemoryHandler.

@item 
bpo-41497@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41497}: Fix potential UnicodeDecodeError in dis module.

@item 
bpo-41467@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41467}: On Windows, fix asyncio @code{recv_into()} return value when the
socket/pipe is closed (@ref{1262,,BrokenPipeError}): return @code{0} rather than
an empty byte string (@code{b'@w{'}}).

@item 
bpo-41425@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41425}: Make tkinter doc example runnable.

@item 
bpo-41421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41421}: Make an algebraic simplification to random.paretovariate().  It
now is slightly less subject to round-off error and is slightly faster.
Inputs that used to cause ZeroDivisionError now cause an OverflowError
instead.

@item 
bpo-41440@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41440}: Add @ref{4dc,,os.cpu_count()} support for VxWorks RTOS.

@item 
bpo-41316@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41316}: Fix the @ref{e4,,tarfile} module to write only basename of TAR
file to GZIP compression header.

@item 
bpo-41384@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41384}: Raise TclError instead of TypeError when an unknown option is
passed to tkinter.OptionMenu.

@item 
bpo-41317@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41317}: Use add_done_callback() in asyncio.loop.sock_accept() to
unsubscribe reader early on cancellation.

@item 
bpo-41364@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41364}: Reduce import overhead of @ref{117,,uuid}.

@item 
bpo-35328@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35328}: Set the environment variable @code{VIRTUAL_ENV_PROMPT} at
@ref{118,,venv} activation.

@item 
bpo-41341@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41341}: Recursive evaluation of @code{typing.ForwardRef} in
@code{get_type_hints}.

@item 
bpo-41344@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41344}: Prevent creating @code{shared_memory.SharedMemory} objects
with @code{size=0}.

@item 
bpo-41333@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41333}: @code{collections.OrderedDict.pop()} is now 2 times faster.

@item 
bpo-41288@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41288}: Unpickling invalid NEWOBJ_EX opcode with the C implementation
raises now UnpicklingError instead of crashing.

@item 
bpo-39017@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39017}: Avoid infinite loop when reading specially crafted TAR files
using the tarfile module (
@geindex Common Vulnerabilities and Exposures; CVE 2019-20907
CVE 2019-20907@footnote{https://www.cve.org/CVERecord?id=CVE-2019-20907}).

@item 
bpo-41273@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41273}: Speed up any transport using @code{_ProactorReadPipeTransport} by
calling @code{recv_into} instead of @code{recv}, thus not creating a new buffer
for each @code{recv} call in the transport’s read loop.

@item 
bpo-41235@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41235}: Fix the error handling in
@ref{134e,,ssl.SSLContext.load_dh_params()}.

@item 
bpo-41207@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41207}: In distutils.spawn, restore expectation that DistutilsExecError
is raised when the command is not found.

@item 
bpo-29727@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29727}: Register @ref{4bf,,array.array} as a
@ref{4c0,,MutableSequence}. Patch by Pablo Galindo.

@item 
bpo-39168@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39168}: Remove the @code{__new__} method of @ref{1806,,typing.Generic}.

@item 
bpo-41194@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41194}: Fix a crash in the @code{_ast} module: it can no longer be loaded
more than once. It now uses a global state rather than a module state.

@item 
bpo-41195@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41195}: Add read-only ssl.SSLContext.security_level attribute to
retrieve the context’s security level.

@item 
bpo-41193@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41193}: The @code{write_history()} atexit function of the readline
completer now ignores any @ref{2c2,,OSError} to ignore error if the filesystem
is read-only, instead of only ignoring @ref{266,,FileNotFoundError} and
@ref{f44,,PermissionError}.

@item 
bpo-41182@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41182}: selector: use DefaultSelector based upon implementation

@item 
bpo-41161@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41161}: The decimal module now requires libmpdec-2.5.0. Users of
–with-system-libmpdec should update their system library.

@item 
bpo-40874@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40874}: The decimal module now requires libmpdec-2.5.0.

@item 
bpo-41138@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41138}: Fixed the @ref{104,,trace} module CLI for Python source files with
non-UTF-8 encoding.

@item 
bpo-31082@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31082}: Use the term “iterable” in the docstring for
@ref{21c,,functools.reduce()}.

@item 
bpo-40521@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40521}: Remove freelist from collections.deque().

@item 
bpo-31938@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31938}: Fix default-value signatures of several functions in the
@ref{c6,,select} module - by Anthony Sottile.

@item 
bpo-41068@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41068}: Fixed reading files with non-ASCII names from ZIP archive
directly after writing them.

@item 
bpo-41058@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41058}: @code{pdb.find_function()} now correctly determines the source
file encoding.

@item 
bpo-41056@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41056}: Invalid file descriptor values are now prevented from being
passed to os.fpathconf. (discovered by Coverity)

@item 
bpo-41056@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41056}: Fix a NULL pointer dereference within the ssl module during a
MemoryError in the keylog callback. (discovered by Coverity)

@item 
bpo-41056@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41056}: Fixed an instance where a MemoryError within the zoneinfo
module might not be reported or not reported at its source. (found by
Coverity)

@item 
bpo-41048@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41048}: @ref{1d6e,,mimetypes.read_mime_types()} function reads the rule file
using UTF-8 encoding, not the locale encoding. Patch by Srinivas Reddy
Thatiparthy.

@item 
bpo-41043@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41043}: Fixed the use of @ref{5a0,,glob()} in the stdlib: literal part
of the path is now always correctly escaped.

@item 
bpo-41025@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41025}: Fixed an issue preventing the C implementation of
@ref{ae2,,zoneinfo.ZoneInfo} from being subclassed.

@item 
bpo-35018@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35018}: Add the @ref{a62,,xml.sax.handler.LexicalHandler} class that is
present in other SAX XML implementations.

@item 
bpo-41002@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41002}: Improve performance of HTTPResponse.read with a given amount.
Patch by Bruce Merry.

@item 
bpo-40448@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40448}: @ref{59,,ensurepip} now disables the use of @code{pip} cache when
installing the bundled versions of @code{pip} and @code{setuptools}.  Patch by
Krzysztof Konopko.

@item 
bpo-40967@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40967}: Removed @code{asyncio.Task.current_task()} and
@code{asyncio.Task.all_tasks()}. Patch contributed by Rémi Lapeyre.

@item 
bpo-40924@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40924}: Ensure @code{importlib.resources.path} returns an extant path for
the SourceFileLoader’s resource reader. Avoids the regression identified
in master while a long-term solution is devised.

@item 
bpo-40955@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40955}: Fix a minor memory leak in @ref{dc,,subprocess} module when
extra_groups was specified.

@item 
bpo-40855@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40855}: The standard deviation and variance functions in the statistics
module were ignoring their mu and xbar arguments.

@item 
bpo-40939@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40939}: Use the new PEG parser when generating the stdlib
@ref{88,,keyword} module.

@item 
bpo-23427@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23427}: Add @ref{a47,,sys.orig_argv} attribute: the list of the original
command line arguments passed to the Python executable.

@item 
bpo-33689@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33689}: Ignore empty or whitespace-only lines in .pth files. This
matches the documentated behavior. Before, empty lines caused the
site-packages dir to appear multiple times in sys.path. By Ido Michael,
contributors Malcolm Smith and Tal Einat.

@item 
bpo-40884@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40884}: Added a @code{defaults} parameter to @ref{16a3,,logging.Formatter},
to allow specifying default values for custom fields. Patch by Asaf Alon
and Bar Harel.

@item 
bpo-40876@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40876}: Clarify error message in the @ref{2d,,csv} module.

@item 
bpo-39791@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39791}: Refresh importlib.metadata from importlib_metadata 1.6.1.

@item 
bpo-40807@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40807}: Stop codeop._maybe_compile, used by code.InteractiveInterpreter
(and IDLE). from emitting each warning three times.

@item 
bpo-32604@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32604}: Fix reference leak in the @ref{c6,,select} module when the module
is imported in a subinterpreter.

@item 
bpo-39791@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39791}: Built-in loaders (SourceFileLoader and ZipImporter) now supply
@code{TraversableResources} implementations for @code{ResourceReader}, and the
fallback function has been removed.

@item 
bpo-39314@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39314}: @ref{1d6f,,rlcompleter.Completer} and the standard Python shell
now close the parenthesis for functions that take no arguments. Patch
contributed by Rémi Lapeyre.

@item 
bpo-17005@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17005}: The topological sort functionality that was introduced
initially in the @ref{63,,functools} module has been moved to a new
@ref{69,,graphlib} module to better accommodate the new tools and keep the
original scope of the @code{functools} module. Patch by Pablo Galindo

@item 
bpo-40834@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40834}: Fix truncate when sending str object
with_xxsubinterpreters.channel_send.

@item 
bpo-40755@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40755}: Add rich comparisons to collections.Counter().

@item 
bpo-26407@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26407}: Unexpected errors in calling the @code{__iter__} method are no
longer masked by @code{TypeError} in @ref{6af,,csv.reader()},
@code{csv.writer.writerow()} and @code{csv.writer.writerows()}.

@item 
bpo-39384@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39384}: Fixed email.contentmanager to allow set_content() to set a null
string.

@item 
bpo-40744@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40744}: The @ref{d4,,sqlite3} module uses SQLite API functions that
require SQLite v3.7.3 or higher.  This patch removes support for older
SQLite versions, and explicitly requires SQLite 3.7.3 both at build,
compile and runtime.  Patch by Sergey Fedoseev and Erlend E. Aasland.

@item 
bpo-40777@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40777}: Initialize PyDateTime_IsoCalendarDateType.tp_base at run-time
to avoid errors on some compilers.

@item 
bpo-38488@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38488}: Update ensurepip to install pip 20.1.1 and setuptools 47.1.0.

@item 
bpo-40792@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40792}: The result of @ref{1d15,,operator.index()} now always has exact type
@ref{19c,,int}. Previously, the result could have been an instance of a
subclass of @code{int}.

@item 
bpo-40767@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40767}: @ref{11c,,webbrowser} now properly finds the default browser in
pure Wayland systems by checking the WAYLAND_DISPLAY environment variable.
Patch contributed by Jérémy Attali.

@item 
bpo-40791@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40791}: @code{hashlib.compare_digest()} uses OpenSSL’s
@code{CRYPTO_memcmp()} function when OpenSSL is available.

@item 
bpo-40795@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40795}: @ref{2e,,ctypes} module: If ctypes fails to convert the result of
a callback or if a ctypes callback function raises an exception,
sys.unraisablehook is now called with an exception set. Previously, the
error was logged into stderr by @ref{1d70,,PyErr_Print()}.

@item 
bpo-16995@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16995}: Add @ref{9ea,,base64.b32hexencode()} and @ref{9eb,,base64.b32hexdecode()}
to support the Base32 Encoding with Extended Hex Alphabet.

@item 
bpo-30008@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30008}: Fix @ref{d5,,ssl} code to be compatible with OpenSSL 1.1.x builds
that use @code{no-deprecated} and @code{--api=1.1.0}.

@item 
bpo-30064@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30064}: Fix asyncio @code{loop.sock_*} race condition issue

@item 
bpo-40759@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40759}: Deprecate the @code{symbol} module.

@item 
bpo-40756@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40756}: The second argument (extra) of @code{LoggerAdapter.__init__} now
defaults to None.

@item 
bpo-37129@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37129}: Add a new @ref{1d71,,os.RWF_APPEND} flag for @ref{d5d,,os.pwritev()}.

@item 
bpo-40737@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40737}: Fix possible reference leak for @ref{d4,,sqlite3} initialization.

@item 
bpo-40726@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40726}: Handle cases where the @code{end_lineno} is @code{None} on
@ref{1b51,,ast.increment_lineno()}.

@item 
bpo-40698@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40698}: @code{distutils} upload creates SHA2-256 and Blake2b-256 digests.
MD5 digests is skipped if platform blocks MD5.

@item 
bpo-40695@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40695}: @ref{6c,,hashlib} no longer falls back to builtin hash
implementations when OpenSSL provides a hash digest and the algorithm is
blocked by security policy.

@item 
bpo-9216@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9216}: @ref{1d72,,hashlib.new()} passed @code{usedforsecurity} to OpenSSL EVP
constructor @code{_hashlib.new()}. test_hashlib and test_smtplib handle
strict security policy better.

@item 
bpo-40614@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40614}: @ref{1c4,,ast.parse()} will not parse self documenting expressions
in f-strings when passed @code{feature_version} is less than @code{(3, 8)}.

@item 
bpo-40626@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40626}: Add h5 file extension as MIME Type application/x-hdf5, as per
HDF Group recommendation for HDF5 formatted data files. Patch contributed
by Mark Schwab.

@item 
bpo-25920@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25920}: On macOS, when building Python for macOS 10.4 and older, which
wasn’t the case for python.org macOS installer, @ref{17a8,,socket.getaddrinfo()}
no longer uses an internal lock to prevent race conditions when calling
@code{getaddrinfo()} which is thread-safe since macOS 10.5. Python 3.9
requires macOS 10.6 or newer. The internal lock caused random hang on fork
when another thread was calling @code{socket.getaddrinfo()}. The lock was
also used on FreeBSD older than 5.3, OpenBSD older than 201311 and NetBSD
older than 4.

@item 
bpo-40671@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40671}: Prepare @code{_hashlib} for 
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/} and use
@ref{b72,,PyModule_AddType()}.

@item 
bpo-32309@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32309}: Added a new @ref{6ba,,coroutine} @ref{aeb,,asyncio.to_thread()}. It is
mainly used for running IO-bound functions in a separate thread to avoid
blocking the event loop, and essentially works as a high-level version of
@ref{aec,,run_in_executor()} that can directly take keyword
arguments.

@item 
bpo-36543@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36543}: Restored the deprecated @code{xml.etree.cElementTree} module.

@item 
bpo-40611@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40611}: @ref{1d73,,MAP_POPULATE} constant has now been added to the
list of exported @ref{94,,mmap} module flags.

@item 
bpo-39881@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39881}: PEP 554 for use in the test suite. (Patch By Joannah Nanjekye)

@item 
bpo-13097@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13097}: @code{ctypes} now raises an @code{ArgumentError} when a callback is
invoked with more than 1024 arguments.

@item 
bpo-39385@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39385}: A new test assertion context-manager,
@code{unittest.assertNoLogs()} will ensure a given block of code emits no
log messages using the logging module. Contributed by Kit Yan Choi.

@item 
bpo-23082@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23082}: Updated the error message and docs of PurePath.relative_to() to
better reflect the function behaviour.

@item 
bpo-40318@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40318}: Use SQLite3 trace v2 API, if it is available.

@item 
bpo-40105@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40105}: ZipFile truncates files to avoid corruption when a shorter
comment is provided in append (“a”) mode. Patch by Jan Mazur.

@item 
bpo-40084@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40084}: Fix @code{Enum.__dir__}: dir(Enum.member) now includes attributes
as well as methods.

@item 
bpo-31122@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31122}: ssl.wrap_socket() now raises ssl.SSLEOFError rather than
OSError when peer closes connection during TLS negotiation

@item 
bpo-39728@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39728}: fix default @code{_missing_} so a duplicate @code{ValueError} is not
set as the @code{__context__} of the original @code{ValueError}.

@item 
bpo-39244@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39244}: Fixed @code{multiprocessing.context.get_all_start_methods} to
properly return the default method first on macOS.

@item 
bpo-39040@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39040}: Fix parsing of invalid mime headers parameters by collapsing
whitespace between encoded words in a bare-quote-string.

@item 
bpo-38731@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38731}: Add @code{--quiet} option to command-line interface of
@ref{b8,,py_compile}. Patch by Gregory Schevchenko.

@item 
bpo-35714@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35714}: @ref{152f,,struct.error} is now raised if there is a null character
in a @ref{db,,struct} format string.

@item 
bpo-38144@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38144}: Added the `root_dir' and `dir_fd' parameters in
@ref{5a0,,glob.glob()}.

@item 
bpo-26543@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26543}: Fix @code{IMAP4.noop()} when debug mode is enabled (ex:
@code{imaplib.Debug = 3}).

@item 
bpo-12178@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12178}: @ref{6b0,,csv.writer()} now correctly escapes `escapechar' when
input contains `escapechar'.  Patch by Catalin Iacob, Berker Peksag, and
Itay Elbirt.

@item 
bpo-36290@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36290}: AST nodes are now raising @ref{199,,TypeError} on conflicting
keyword arguments. Patch contributed by Rémi Lapeyre.

@item 
bpo-33944@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33944}: Added site.py site-packages tracing in verbose mode.

@item 
bpo-35078@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35078}: Refactor formatweekday, formatmonthname methods in
LocaleHTMLCalendar and LocaleTextCalendar classes in calendar module to
call the base class methods.This enables customizable CSS classes for
LocaleHTMLCalendar. Patch by Srinivas Reddy Thatiparthy

@item 
bpo-29620@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29620}: @ref{1370,,assertWarns()} no longer raises a
@code{RuntimeException} when accessing a module’s @code{__warningregistry__}
causes importation of a new module, or when a new module is imported in
another thread. Patch by Kernc.

@item 
bpo-31844@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31844}: Remove @code{ParserBase.error()} method from the private and
undocumented @code{_markupbase} module.  @ref{a7d,,html.parser.HTMLParser} is
the only subclass of @code{ParserBase} and its @code{error()} implementation was
deprecated in Python 3.4 and removed in Python 3.5.

@item 
bpo-34226@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34226}: Fix @code{cgi.parse_multipart} without content_length. Patch by
Roger Duran

@item 
bpo-33660@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33660}: Fix pathlib.PosixPath to resolve a relative path located on the
root directory properly.

@item 
bpo-28557@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28557}: Improve the error message for a misbehaving @code{rawio.readinto}

@item 
bpo-26680@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26680}: The d.is_integer() method is added to the Decimal type, for
compatibility with other number types.

@item 
bpo-26680@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26680}: The x.is_integer() method is incorporated into the abstract
types of the numeric tower, Real, Rational and Integral, with appropriate
default implementations.
@end itemize

@node Documentation<47>,Tests<47>,Library<154>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id666}@anchor{1d74}
@subsubsection Documentation



@itemize -

@item 
bpo-41428@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41428}: Add documentation for 
@geindex Python Enhancement Proposals; PEP 604
PEP 604@footnote{https://peps.python.org/pep-0604/} (Allow writing union types as
@code{X | Y}).

@item 
bpo-41774@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41774}: In Programming FAQ “Sequences (Tuples/Lists)” section, add “How
do you remove multiple items from a list”.

@item 
bpo-35293@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35293}: Fix RemovedInSphinx40Warning when building the documentation.
Patch by Donghee Na.

@item 
bpo-37149@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37149}: Change Shipman tkinter doc link from archive.org to TkDocs.
(The doc has been removed from the NMT server.)  The new link responds
much faster and includes a short explanatory note.

@item 
bpo-41726@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41726}: Update the refcounts info of @code{PyType_FromModuleAndSpec}.

@item 
bpo-41624@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41624}: Fix the signature of @ref{1d75,,typing.Coroutine}.

@item 
bpo-40204@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40204}: Enable Sphinx 3.2 @code{c_allow_pre_v3} option and disable
@code{c_warn_on_allowed_pre_v3} option to make the documentation compatible
with Sphinx 2 and Sphinx 3.

@item 
bpo-41045@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41045}: Add documentation for debug feature of f-strings.

@item 
bpo-41314@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41314}: Changed the release when @code{from __future__ import annotations}
becomes the default from @code{4.0} to @code{3.10} (following a change in PEP
563).

@item 
bpo-40979@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40979}: Refactored typing.rst, arranging more than 70 classes,
functions, and decorators into new sub-sections.

@item 
bpo-40552@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40552}: Fix in tutorial section 4.2. Code snippet is now correct.

@item 
bpo-39883@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39883}: Make code, examples, and recipes in the Python documentation be
licensed under the more permissive BSD0 license in addition to the
existing Python 2.0 license.

@item 
bpo-37703@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37703}: Updated Documentation to comprehensively elaborate on the
behaviour of gather.cancel()
@end itemize

@node Tests<47>,Build<54>,Documentation<47>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id667}@anchor{1d76}
@subsubsection Tests



@itemize -

@item 
bpo-41939@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41939}: Fix test_site.test_license_exists_at_url(): call
@code{urllib.request.urlcleanup()} to reset the global
@code{urllib.request._opener}. Patch by Victor Stinner.

@item 
bpo-41731@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41731}: Make test_cmd_line_script pass with option ‘-vv’.

@item 
bpo-41602@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41602}: Add tests for SIGINT handling in the runpy module.

@item 
bpo-41521@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41521}: @ref{ea,,test.support}: Rename @code{blacklist} parameter of
@ref{1d77,,check__all__()} to @code{not_exported}.

@item 
bpo-41477@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41477}: Make ctypes optional in test_genericalias.

@item 
bpo-41085@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41085}: Fix integer overflow in the @ref{9e7,,array.array.index()} method on
64-bit Windows for index larger than @code{2**31}.

@item 
bpo-41069@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41069}: @code{test.support.TESTFN} and the current directory for tests
when run via @code{test.regrtest} contain now non-ascii characters if
possible.

@item 
bpo-38377@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38377}: On Linux, skip tests using multiprocessing if the current user
cannot create a file in @code{/dev/shm/} directory. Add the
@ref{1d78,,skip_if_broken_multiprocessing_synchronize()} function
to the @ref{ea,,test.support} module.

@item 
bpo-41009@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41009}: Fix use of @code{support.require_@{linux|mac|freebsd@}_version()}
decorators as class decorator.

@item 
bpo-41003@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41003}: Fix @code{test_copyreg} when @code{numpy} is installed:
@code{test.pickletester} now saves/restores warnings filters when importing
@code{numpy}, to ignore filters installed by @code{numpy}.

@item 
bpo-40964@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40964}: Disable remote @ref{78,,imaplib} tests, host cyrus.andrew.cmu.edu
is blocking incoming connections.

@item 
bpo-40927@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40927}: Fix test_binhex when run twice: it now uses
import_fresh_module() to ensure that it raises DeprecationWarning each
time.

@item 
bpo-17258@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17258}: Skip some @ref{98,,multiprocessing} tests when MD5 hash digest is
blocked.

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: Increase LOOPBACK_TIMEOUT to 10 for VxWorks RTOS.

@item 
bpo-38169@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38169}: Increase code coverage for SharedMemory and ShareableList

@item 
bpo-34401@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34401}: Make test_gdb properly run on HP-UX. Patch by Michael Osipov.
@end itemize

@node Build<54>,Windows<46>,Tests<47>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id668}@anchor{1d79}
@subsubsection Build



@itemize -

@item 
bpo-38249@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38249}: Update @ref{db4,,Py_UNREACHABLE} to use __builtin_unreachable()
if only the compiler is able to use it. Patch by Donghee Na.

@item 
bpo-41617@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41617}: Fix @code{pycore_bitutils.h} header file to support old clang
versions: @code{__builtin_bswap16()} is not available in LLVM clang 3.0.

@item 
bpo-40204@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40204}: Pin Sphinx version to 2.3.1 in @code{Doc/Makefile}.

@item 
bpo-36020@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36020}: The C99 functions @code{snprintf()} and @code{vsnprintf()}
are now required to build Python.

@item 
bpo-40684@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40684}: @code{make install} now uses the @code{PLATLIBDIR} variable for the
destination @code{lib-dynload/} directory when @code{./configure
--with-platlibdir} is used.

@item 
bpo-40683@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40683}: Fixed an issue where the @ref{13b,,zoneinfo} module and its tests
were not included when Python is installed with @code{make}.
@end itemize

@node Windows<46>,macOS<37>,Build<54>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id669}@anchor{1d7a}
@subsubsection Windows



@itemize -

@item 
bpo-41744@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41744}: Fixes automatic import of props file when using the Nuget
package.

@item 
bpo-41627@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41627}: The user site directory for 32-bit now includes a @code{-32}
suffix to distinguish it from the 64-bit interpreter’s directory.

@item 
bpo-41526@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41526}: Fixed layout of final page of the installer by removing the
special thanks to Mark Hammond (with his permission).

@item 
bpo-41492@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41492}: Fixes the description that appears in UAC prompts.

@item 
bpo-40948@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40948}: Improve post-install message to direct people to the “py”
command.

@item 
bpo-41412@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41412}: The installer will now fail to install on Windows 7 and Windows
8. Further, the UCRT dependency is now always downloaded on demand.

@item 
bpo-40741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40741}: Update Windows release to include SQLite 3.32.3.

@item 
bpo-41142@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41142}: @code{msilib} now supports creating CAB files with non-ASCII
file path and adding files with non-ASCII file path to them.

@item 
bpo-41074@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41074}: Fixed support of non-ASCII names in functions
@code{msilib.OpenDatabase()} and @code{msilib.init_database()} and
non-ASCII SQL in method @code{msilib.Database.OpenView()}.

@item 
bpo-41039@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41039}: Stable ABI redirection DLL (python3.dll) now uses @code{#pragma
comment(linker)} for re-exporting.

@item 
bpo-40164@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40164}: Updates Windows OpenSSL to 1.1.1g

@item 
bpo-39631@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39631}: Changes the registered MIME type for @code{.py} files on Windows
to @code{text/x-python} instead of @code{text/plain}.

@item 
bpo-40677@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40677}: Manually define IO_REPARSE_TAG_APPEXECLINK in case some old
Windows SDK doesn’t have it.

@item 
bpo-37556@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37556}: Extend py.exe help to mention overrides via venv, shebang,
environmental variables & ini files.
@end itemize

@node macOS<37>,IDLE<27>,Windows<46>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id670}@anchor{1d7b}
@subsubsection macOS



@itemize -

@item 
bpo-41557@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41557}: Update macOS installer to use SQLite 3.33.0.

@item 
bpo-39580@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39580}: Avoid opening Finder window if running installer from the
command line. Patch contributed by Rick Heil.

@item 
bpo-41100@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41100}: Fix configure error when building on macOS 11. Note that the
current Python release was released shortly after the first developer
preview of macOS 11 (Big Sur); there are other known issues with building
and running on the developer preview. Big Sur is expected to be fully
supported in a future bugfix release of Python 3.8.x and with 3.9.0.

@item 
bpo-40741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40741}: Update macOS installer to use SQLite 3.32.3.

@item 
bpo-41005@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41005}: fixed an XDG settings issue not allowing macos to open browser
in webbrowser.py

@item 
bpo-40741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40741}: Update macOS installer to use SQLite 3.32.2.
@end itemize

@node IDLE<27>,C API<48>,macOS<37>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id671}@anchor{1d7c}
@subsubsection IDLE



@itemize -

@item 
bpo-41775@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41775}: Use ‘IDLE Shell’ as shell title

@item 
bpo-35764@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35764}: Rewrite the Calltips doc section.

@item 
bpo-40181@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40181}: In calltips, stop reminding that ‘/’ marks the end of
positional-only arguments.

@item 
bpo-41468@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41468}: Improve IDLE run crash error message (which users should never
see).

@item 
bpo-41373@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41373}: Save files loaded with no line ending, as when blank, or
different line endings, by setting its line ending to the system default.
Fix regression in 3.8.4 and 3.9.0b4.

@item 
bpo-41300@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41300}: Save files with non-ascii chars. Fix regression released in
3.9.0b4 and 3.8.4.

@item 
bpo-37765@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37765}: Add keywords to module name completion list.  Rewrite
Completions section of IDLE doc.

@item 
bpo-41152@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41152}: The encoding of @code{stdin}, @code{stdout} and @code{stderr} in IDLE is
now always UTF-8.

@item 
bpo-41144@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41144}: Make Open Module open a special module such as os.path.

@item 
bpo-39885@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39885}: Make context menu Cut and Copy work again when right-clicking
within a selection.

@item 
bpo-40723@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40723}: Make test_idle pass when run after import.
@end itemize

@node C API<48>,,IDLE<27>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id672}@anchor{1d7d}
@subsubsection C API



@itemize -

@item 
bpo-41936@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41936}: Removed undocumented macros @code{Py_ALLOW_RECURSION} and
@code{Py_END_ALLOW_RECURSION} and the @code{recursion_critical} field of the
@ref{ac0,,PyInterpreterState} structure.

@item 
bpo-41692@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41692}: The @code{PyUnicode_InternImmortal()} function is now deprecated
and will be removed in Python 3.12: use @ref{ab4,,PyUnicode_InternInPlace()}
instead. Patch by Victor Stinner.

@item 
bpo-41842@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41842}: Add @ref{a9d,,PyCodec_Unregister()} function to unregister a codec
search function.

@item 
bpo-41834@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41834}: Remove the @code{_Py_CheckRecursionLimit} variable: it has been
replaced by @code{ceval.recursion_limit} of the @ref{ac0,,PyInterpreterState}
structure. Patch by Victor Stinner.

@item 
bpo-41689@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41689}: Types created with @ref{79e,,PyType_FromSpec()} now make any
signature in their @code{tp_doc} slot accessible from @code{__text_signature__}.

@item 
bpo-41524@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41524}: Fix bug in @ref{1d7e,,PyOS_mystrnicmp()} and
@ref{1d7f,,PyOS_mystricmp()} that incremented pointers beyond the end of a
string.

@item 
bpo-41324@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41324}: Add a minimal decimal capsule API.  The API supports fast
conversions between Decimals up to 38 digits and their triple
representation as a C struct.

@item 
bpo-30155@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30155}: Add @ref{a9b,,PyDateTime_DATE_GET_TZINFO()} and
@ref{a9c,,PyDateTime_TIME_GET_TZINFO()} macros for accessing the @code{tzinfo}
attributes of @ref{4e3,,datetime.datetime} and @ref{1fd,,datetime.time}
objects.

@item 
bpo-40170@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40170}: Revert @ref{1d80,,PyType_HasFeature()} change: it reads again
directly the @ref{1cb4,,PyTypeObject.tp_flags} member when the limited C
API is not used, rather than always calling @ref{1d81,,PyType_GetFlags()}
which hides implementation details.

@item 
bpo-41123@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41123}: Remove @code{PyUnicode_AsUnicodeCopy}.

@item 
bpo-41123@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41123}: Removed @code{PyLong_FromUnicode()}.

@item 
bpo-41123@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41123}: Removed @code{PyUnicode_GetMax()}.

@item 
bpo-41123@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41123}: Removed @code{Py_UNICODE_str*} functions manipulating
@code{Py_UNICODE*} strings.

@item 
bpo-41103@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41103}: @code{PyObject_AsCharBuffer()}, @code{PyObject_AsReadBuffer()},
@code{PyObject_CheckReadBuffer()}, and @code{PyObject_AsWriteBuffer()} are
removed. Please migrate to new buffer protocol;
@ref{63a,,PyObject_GetBuffer()} and @ref{63b,,PyBuffer_Release()}.

@item 
bpo-36346@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36346}: Raises DeprecationWarning for @code{PyUnicode_FromUnicode(NULL,
size)} and @code{PyUnicode_FromStringAndSize(NULL, size)} with @code{size > 0}.

@item 
bpo-36346@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36346}: Mark @code{Py_UNICODE_COPY}, @code{Py_UNICODE_FILL},
@code{PyUnicode_WSTR_LENGTH}, @code{PyUnicode_FromUnicode},
@code{PyUnicode_AsUnicode}, and @code{PyUnicode_AsUnicodeAndSize} as deprecated
in C. Remove @code{Py_UNICODE_MATCH} which was deprecated and broken since
Python 3.3.

@item 
bpo-40989@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40989}: The @ref{1d82,,PyObject_INIT()} and @ref{1d83,,PyObject_INIT_VAR()}
macros become aliases to, respectively, @ref{c66,,PyObject_Init()} and
@ref{1d84,,PyObject_InitVar()} functions.

@item 
bpo-36020@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36020}: On Windows, @code{#include "pyerrors.h"} no longer defines
@code{snprintf} and @code{vsnprintf} macros.

@item 
bpo-40943@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40943}: The @code{PY_SSIZE_T_CLEAN} macro must now be defined to use
@ref{3bf,,PyArg_ParseTuple()} and @ref{3c0,,Py_BuildValue()} formats which use
@code{#}: @code{es#}, @code{et#}, @code{s#}, @code{u#}, @code{y#}, @code{z#}, @code{U#} and
@code{Z#}. See @ref{3d3,,Parsing arguments and building values} and
the 
@geindex Python Enhancement Proposals; PEP 353
PEP 353@footnote{https://peps.python.org/pep-0353/}.

@item 
bpo-40910@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40910}: Export explicitly the @ref{1d85,,Py_GetArgcArgv()} function to the
C API and document the function. Previously, it was exported implicitly
which no longer works since Python is built with @code{-fvisibility=hidden}.

@item 
bpo-40724@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40724}: Allow defining buffer slots in type specs.

@item 
bpo-40679@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40679}: Fix a @code{_PyEval_EvalCode()} crash if `qualname' argument is
NULL.

@item 
bpo-40839@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40839}: Calling @ref{628,,PyDict_GetItem()} without @ref{165,,GIL} held had
been allowed for historical reason. It is no longer allowed.

@item 
bpo-40826@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40826}: @ref{1d86,,PyOS_InterruptOccurred()} now fails with a fatal error
if it is called with the GIL released.

@item 
bpo-40792@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40792}: The result of @ref{a99,,PyNumber_Index()} now always has exact
type @ref{19c,,int}. Previously, the result could have been an instance of a
subclass of @code{int}.

@item 
bpo-39573@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39573}: Convert @ref{2d1,,Py_REFCNT()} and @ref{98a,,Py_SIZE()} macros to
static inline functions. They cannot be used as l-value anymore: use
@ref{aae,,Py_SET_REFCNT()} and @ref{98b,,Py_SET_SIZE()} to set an object
reference count and size. This change is backward incompatible on purpose,
to prepare the C API for an opaque @ref{5df,,PyObject} structure.

@item 
bpo-40703@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40703}: The PyType_FromSpec*() functions no longer overwrite the type’s
“__module__” attribute if it is set via “Py_tp_members” or “Py_tp_getset”.

@item 
bpo-39583@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39583}: Remove superfluous “extern C” declarations from
@code{Include/cpython/*.h}.
@end itemize

@node Python 3 9 0 beta 1,Python 3 9 0 alpha 6,Python 3 10 0 alpha 1,Changelog
@anchor{whatsnew/changelog python-3-9-0-beta-1}@anchor{1d87}
@subsection Python 3.9.0 beta 1


`Release date: 2020-05-19'

@menu
* Security: Security<41>. 
* Core and Builtins: Core and Builtins<152>. 
* Library: Library<155>. 
* Documentation: Documentation<48>. 
* Tests: Tests<48>. 
* Build: Build<55>. 
* Windows: Windows<47>. 
* macOS: macOS<38>. 
* Tools/Demos: Tools/Demos<30>. 
* C API: C API<49>. 

@end menu

@node Security<41>,Core and Builtins<152>,,Python 3 9 0 beta 1
@anchor{whatsnew/changelog id673}@anchor{1d88}
@subsubsection Security



@itemize -

@item 
bpo-40501@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40501}: @ref{117,,uuid} no longer uses @ref{2e,,ctypes} to load
@code{libuuid} or @code{rpcrt4.dll} at runtime.
@end itemize

@node Core and Builtins<152>,Library<155>,Security<41>,Python 3 9 0 beta 1
@anchor{whatsnew/changelog id674}@anchor{1d89}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-40663@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40663}: Correctly generate annotations where parentheses are omitted
but required (e.g: @code{Type[(str, int, *other))]}.

@item 
bpo-40596@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40596}: Fixed @ref{1d8a,,str.isidentifier()} for non-canonicalized strings
containing non-BMP characters on Windows.

@item 
bpo-40593@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40593}: Improved syntax errors for invalid characters in source code.

@item 
bpo-40585@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40585}: Fixed a bug when using @ref{1b97,,codeop.compile_command()} that was
causing exceptions to be swallowed with the new parser. Patch by Pablo
Galindo

@item 
bpo-40566@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40566}: Apply 
@geindex Python Enhancement Proposals; PEP 573
PEP 573@footnote{https://peps.python.org/pep-0573/} to @ref{4,,abc}.

@item 
bpo-40502@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40502}: Initialize @code{n->n_col_offset}. (Patch by Joannah Nanjekye)

@item 
bpo-40527@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40527}: Fix command line argument parsing: no longer write errors
multiple times into stderr.

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port @ref{5b,,errno} to multiphase initialization (
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).

@item 
bpo-40523@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40523}: Add pass-throughs for @ref{802,,hash()} and @ref{a6b,,reversed()} to
@ref{c4c,,weakref.proxy} objects. Patch by Pablo Galindo.

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port @ref{e2,,syslog} to multiphase initialization (
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).

@item 
bpo-40246@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40246}: Reporting a specialised error message for invalid string
prefixes, which was introduced in bpo-40246@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40246}, is being reverted due to
backwards compatibility concerns for strings that immediately follow a
reserved keyword without whitespace between them. Constructs like
@code{bg="#d00" if clear else"#fca"} were failing to parse, which is not an
acceptable breakage on such short notice.

@item 
bpo-40417@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40417}: Fix imp module deprecation warning when PyImport_ReloadModule
is called. Patch by Robert Rouhani.

@item 
bpo-40408@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40408}: Fixed support of nested type variables in GenericAlias (e.g.
@code{list[list[T]]}).

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port _stat module to multiphase initialization (
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).

@item 
bpo-29587@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29587}: Enable implicit exception chaining when calling
@ref{71d,,generator.throw()}.

@item 
bpo-40328@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40328}: Add tools for generating mappings headers for CJKCodecs.

@item 
bpo-40228@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40228}: Setting frame.f_lineno is now robust w.r.t. changes in the
source-to-bytecode compiler

@item 
bpo-38880@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38880}: Added the ability to list interpreters associated with channel
ends in the internal subinterpreters module.

@item 
bpo-37986@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37986}: Improve performance of @ref{b42,,PyLong_FromDouble()} for values
that fit into long.
@end itemize

@node Library<155>,Documentation<48>,Core and Builtins<152>,Python 3 9 0 beta 1
@anchor{whatsnew/changelog id675}@anchor{1d8b}
@subsubsection Library



@itemize -

@item 
bpo-40662@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40662}: Fixed @ref{bd1,,ast.get_source_segment()} for ast nodes that have
incomplete location information. Patch by Irit Katriel.

@item 
bpo-40665@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40665}: Convert @ref{12,,bisect} to use Argument Clinic.

@item 
bpo-40536@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40536}: Added the @ref{1d8c,,available_timezones()} function to the
@ref{13b,,zoneinfo} module. Patch by Paul Ganssle.

@item 
bpo-40645@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40645}: The @ref{d39,,hmac.HMAC} exposes internal implementation details.
The attributes @code{digest_cons}, @code{inner}, and @code{outer} are deprecated
and will be removed in the future.

@item 
bpo-40645@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40645}: The internal module @code{_hashlib} wraps and exposes OpenSSL’s
HMAC API. The new code will be used in Python 3.10 after the internal
implementation details of the pure Python HMAC module are no longer part
of the public API.

@item 
bpo-40637@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40637}: Builtin hash modules can now be disabled or selectively enabled
with @code{configure --with-builtin-hashlib-hashes=sha3,blake1} or
@code{--without-builtin-hashlib-hashes}.

@item 
bpo-37630@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37630}: The @ref{6c,,hashlib} module can now use SHA3 hashes and SHAKE XOF
from OpenSSL when available.

@item 
bpo-40479@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40479}: The @ref{6c,,hashlib} now compiles with OpenSSL 3.0.0-alpha2.

@item 
bpo-40257@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40257}: Revert changes to @ref{bf3,,inspect.getdoc()}.

@item 
bpo-40607@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40607}: When cancelling a task due to timeout, @ref{816,,asyncio.wait_for()}
will now propagate the exception if an error happens during cancellation.
Patch by Roman Skurikhin.

@item 
bpo-40612@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40612}: Fix edge cases in SyntaxError formatting. If the offset is <=
0, no caret is printed. If the offset is > line length, the caret is
printed pointing just after the last character.

@item 
bpo-40597@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40597}: If text content lines are longer than policy.max_line_length,
always use a content-encoding to make sure they are wrapped.

@item 
bpo-40571@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40571}: Added functools.cache() as a simpler, more discoverable way to
access the unbounded cache variant of lru_cache(maxsize=None).

@item 
bpo-40503@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40503}: 
@geindex Python Enhancement Proposals; PEP 615
PEP 615@footnote{https://peps.python.org/pep-0615/}, the @ref{13b,,zoneinfo} module. Adds support for the
IANA time zone database.

@item 
bpo-40397@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40397}: Removed attributes @code{__args__} and @code{__parameters__} from
special generic aliases like @code{typing.List} (not subscripted).

@item 
bpo-40549@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40549}: Convert posixmodule.c (“posix” or “nt” module) to the
multiphase initialization (PEP 489).

@item 
bpo-31033@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31033}: Add a @code{msg} argument to @code{Future.cancel()} and
@code{Task.cancel()}.

@item 
bpo-40541@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40541}: Added an optional `counts' parameter to random.sample().

@item 
bpo-40515@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40515}: The @ref{d5,,ssl} and @ref{6c,,hashlib} modules now actively check
that OpenSSL is build with thread support. Python 3.7.0 made thread
support mandatory and no longer works safely with a no-thread builds.

@item 
bpo-31033@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31033}: When a @ref{1c9,,asyncio.Task} is cancelled, the exception
traceback now chains all the way back to where the task was first
interrupted.

@item 
bpo-40504@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40504}: @ref{be8,,functools.lru_cache()} objects can now be the targets of
weakrefs.

@item 
bpo-40559@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40559}: Fix possible memory leak in the C implementation of
@ref{1c9,,asyncio.Task}.

@item 
bpo-40480@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40480}: @code{fnmatch.fnmatch()} could take exponential time in the
presence of multiple @code{*} pattern characters.  This was repaired by
generating more elaborate regular expressions to avoid futile
backtracking.

@item 
bpo-40495@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40495}: @ref{21,,compileall} is now able to use hardlinks to prevent
duplicates in a case when @code{.pyc} files for different optimization levels
have the same content.

@item 
bpo-40457@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40457}: The ssl module now support OpenSSL builds without TLS 1.0 and
1.1 methods.

@item 
bpo-40355@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40355}: Improve error reporting in @ref{e18,,ast.literal_eval()} in the
presence of malformed @ref{1d8d,,ast.Dict} nodes instead of silently ignoring
any non-conforming elements. Patch by Curtis Bucher.

@item 
bpo-40465@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40465}: Deprecated the optional `random' argument to
`random.shuffle()'.

@item 
bpo-40459@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40459}: @ref{1d8e,,platform.win32_ver()} now produces correct `ptype' strings
instead of empty strings.

@item 
bpo-39435@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39435}: The first argument of @ref{f13,,pickle.loads()} is now
positional-only.

@item 
bpo-39305@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39305}: Update @code{nntplib} to merge @code{nntplib.NNTP} and
@code{nntplib._NNTPBase}. Patch by Donghee Na.

@item 
bpo-32494@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32494}: Update @ref{37,,dbm.gnu} to use gdbm_count if possible when
calling @ref{841,,len()}. Patch by Donghee Na.

@item 
bpo-40453@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40453}: Add @code{isolated=True} keyword-only parameter to
@code{_xxsubinterpreters.create()}. An isolated subinterpreter cannot spawn
threads, spawn a child process or call @code{os.fork()}.

@item 
bpo-40286@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40286}: Remove @code{_random.Random.randbytes()}: the C implementation of
@code{randbytes()}. Implement the method in Python to ease subclassing:
@code{randbytes()} now directly reuses @code{getrandbits()}.

@item 
bpo-40394@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40394}: Added default arguments to
@ref{1d8f,,difflib.SequenceMatcher.find_longest_match()}.

@item 
bpo-39995@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39995}: Fix a race condition in concurrent.futures._ThreadWakeup:
access to _ThreadWakeup is now protected with the shutdown lock.

@item 
bpo-30966@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30966}: @code{Process.shutdown(wait=True)} of @ref{24,,concurrent.futures}
now closes explicitly the result queue.

@item 
bpo-30966@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30966}: Add a new @ref{b17,,close()} method to
the @ref{b16,,SimpleQueue} class to explicitly close the
queue.

@item 
bpo-39966@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39966}: Revert bpo-25597@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25597}. @ref{1095,,unittest.mock.MagicMock} with wraps’
set uses default return values for magic methods.

@item 
bpo-39791@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39791}: Added @code{files()} function to importlib.resources with support
for subdirectories in package data, matching backport in
importlib_resources 1.5.

@item 
bpo-40375@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40375}: @ref{b09,,imaplib.IMAP4.unselect()} is added. Patch by Donghee Na.

@item 
bpo-40389@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40389}: @code{repr()} now returns @code{typing.Optional[T]} when called for
@code{typing.Union} of two types, one of which is @code{NoneType}.

@item 
bpo-40291@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40291}: Add support for CAN_J1939 sockets (available on Linux 5.4+)

@item 
bpo-40273@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40273}: @ref{699,,types.MappingProxyType} is now reversible.

@item 
bpo-39075@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39075}: The repr for @ref{4e6,,types.SimpleNamespace} is now insertion
ordered rather than alphabetical.

@item 
bpo-40192@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40192}: On AIX, @ref{b36,,thread_time()} is now implemented with
@code{thread_cputime()} which has nanosecond resolution, rather than
@code{clock_gettime(CLOCK_THREAD_CPUTIME_ID)} which has a resolution of 10
milliseconds. Patch by Batuhan Taskaya.

@item 
bpo-40025@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40025}: Raise TypeError when _generate_next_value_ is defined after
members. Patch by Ethan Onstott.

@item 
bpo-39058@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39058}: In the argparse module, the repr for Namespace() and other
argument holders now displayed in the order attributes were added.
Formerly, it displayed in alphabetical order even though argument order is
preserved the user visible parts of the module.

@item 
bpo-24416@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24416}: The @code{isocalendar()} methods of @ref{1fc,,datetime.date} and
@ref{4e3,,datetime.datetime} now return a @ref{85f,,named tuple} instead of a
@ref{614,,tuple}.
@end itemize

@node Documentation<48>,Tests<48>,Library<155>,Python 3 9 0 beta 1
@anchor{whatsnew/changelog id676}@anchor{1d90}
@subsubsection Documentation



@itemize -

@item 
bpo-34790@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34790}: Add version of removal for explicit passing of coros to
@code{asyncio.wait()}’s documentation

@item 
bpo-40561@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40561}: Provide docstrings for webbrowser open functions.

@item 
bpo-40499@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40499}: Mention that @ref{6a8,,asyncio.wait()} requires a non-empty set of
awaitables.

@item 
bpo-39705@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39705}: Tutorial example for sorted() in the Loop Techniques section is
given a better explanation. Also a new example is included to explain
sorted()’s basic behavior.

@item 
bpo-39435@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39435}: Fix an incorrect signature for @ref{f13,,pickle.loads()} in the docs
@end itemize

@node Tests<48>,Build<55>,Documentation<48>,Python 3 9 0 beta 1
@anchor{whatsnew/changelog id677}@anchor{1d91}
@subsubsection Tests



@itemize -

@item 
bpo-40055@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40055}: distutils.tests now saves/restores warnings filters to leave
them unchanged. Importing tests imports docutils which imports
pkg_resources which adds a warnings filter.

@item 
bpo-40436@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40436}: test_gdb and test.pythoninfo now check gdb command exit code.
@end itemize

@node Build<55>,Windows<47>,Tests<48>,Python 3 9 0 beta 1
@anchor{whatsnew/changelog id678}@anchor{1d92}
@subsubsection Build



@itemize -

@item 
bpo-40653@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40653}: Move _dirnameW out of HAVE_SYMLINK to fix a potential compiling
issue.

@item 
bpo-40514@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40514}: Add @code{--with-experimental-isolated-subinterpreters} build
option to @code{configure}: better isolate subinterpreters, experimental
build mode.
@end itemize

@node Windows<47>,macOS<38>,Build<55>,Python 3 9 0 beta 1
@anchor{whatsnew/changelog id679}@anchor{1d93}
@subsubsection Windows



@itemize -

@item 
bpo-40650@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40650}: Include winsock2.h in pytime.c for timeval.

@item 
bpo-40458@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40458}: Increase reserved stack space to prevent overflow crash on
Windows.

@item 
bpo-39148@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39148}: Add IPv6 support to @ref{b,,asyncio} datagram endpoints in
ProactorEventLoop. Change the raised exception for unknown address
families to ValueError as it’s not coming from Windows API.
@end itemize

@node macOS<38>,Tools/Demos<30>,Windows<47>,Python 3 9 0 beta 1
@anchor{whatsnew/changelog id680}@anchor{1d94}
@subsubsection macOS



@itemize -

@item 
bpo-34956@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34956}: When building Python on macOS from source, @code{_tkinter} now
links with non-system Tcl and Tk frameworks if they are installed in
@code{/Library/Frameworks}, as had been the case on older releases of macOS.
If a macOS SDK is explicitly configured, by using
@code{--enable-universalsdk=} or @code{-isysroot}, only the SDK itself is
searched. The default behavior can still be overridden with
@code{--with-tcltk-includes} and @code{--with-tcltk-libs}.

@item 
bpo-35569@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35569}: Expose RFC 3542 IPv6 socket options.
@end itemize

@node Tools/Demos<30>,C API<49>,macOS<38>,Python 3 9 0 beta 1
@anchor{whatsnew/changelog id681}@anchor{1d95}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-40479@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40479}: Update multissltest helper to test with latest OpenSSL 1.0.2,
1.1.0, 1.1.1, and 3.0.0-alpha.

@item 
bpo-40431@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40431}: Fix a syntax typo in @code{turtledemo} that now raises a
@code{SyntaxError}.

@item 
bpo-40163@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40163}: Fix multissltest tool. OpenSSL has changed download URL for old
releases. The multissltest tool now tries to download from current and old
download URLs.
@end itemize

@node C API<49>,,Tools/Demos<30>,Python 3 9 0 beta 1
@anchor{whatsnew/changelog id682}@anchor{1d96}
@subsubsection C API



@itemize -

@item 
bpo-39465@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39465}: Remove the @code{_PyUnicode_ClearStaticStrings()} function from
the C API.

@item 
bpo-38787@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38787}: Add PyCFunction_CheckExact() macro for exact type checks now
that we allow subtypes of PyCFunction, as well as PyCMethod_CheckExact()
and PyCMethod_Check() for the new PyCMethod subtype.

@item 
bpo-40545@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40545}: Declare @code{_PyErr_GetTopmostException()} with @code{PyAPI_FUNC()}
to properly export the function in the C API. The function remains private
(@code{_Py}) prefix.

@item 
bpo-40412@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40412}: Nullify inittab_copy during finalization, preventing future
interpreter initializations in an embedded situation from crashing. Patch
by Gregory Szorc.

@item 
bpo-40429@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40429}: The @ref{996,,PyThreadState_GetFrame()} function now returns a
strong reference to the frame.

@item 
bpo-40428@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40428}: Remove the following functions from the C API. Call
@ref{b8b,,PyGC_Collect()} explicitly to free all free lists.


@itemize *

@item 
@code{PyAsyncGen_ClearFreeLists()}

@item 
@code{PyContext_ClearFreeList()}

@item 
@code{PyDict_ClearFreeList()}

@item 
@code{PyFloat_ClearFreeList()}

@item 
@code{PyFrame_ClearFreeList()}

@item 
@code{PyList_ClearFreeList()}

@item 
@code{PySet_ClearFreeList()}

@item 
@code{PyTuple_ClearFreeList()}
@end itemize

@item 
bpo-40421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40421}: New @ref{98e,,PyFrame_GetBack()} function: get the frame next
outer frame.

@item 
bpo-40421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40421}: New @ref{992,,PyFrame_GetCode()} function: return a borrowed
reference to the frame code.

@item 
bpo-40217@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40217}: Ensure that instances of types created with
@ref{79f,,PyType_FromSpecWithBases()} will visit its class object when
traversing references in the garbage collector (implemented as an
extension of the provided @ref{987,,tp_traverse}). Patch by
Pablo Galindo.

@item 
bpo-38787@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38787}: Module C state is now accessible from C-defined heap type
methods (
@geindex Python Enhancement Proposals; PEP 573
PEP 573@footnote{https://peps.python.org/pep-0573/}). Patch by Marcel Plch and Petr Viktorin.
@end itemize

@node Python 3 9 0 alpha 6,Python 3 9 0 alpha 5,Python 3 9 0 beta 1,Changelog
@anchor{whatsnew/changelog python-3-9-0-alpha-6}@anchor{1d97}
@subsection Python 3.9.0 alpha 6


`Release date: 2020-04-27'

@menu
* Security: Security<42>. 
* Core and Builtins: Core and Builtins<153>. 
* Library: Library<156>. 
* Documentation: Documentation<49>. 
* Tests: Tests<49>. 
* Build: Build<56>. 
* Windows: Windows<48>. 
* macOS: macOS<39>. 
* IDLE: IDLE<28>. 
* Tools/Demos: Tools/Demos<31>. 
* C API: C API<50>. 

@end menu

@node Security<42>,Core and Builtins<153>,,Python 3 9 0 alpha 6
@anchor{whatsnew/changelog id683}@anchor{1d98}
@subsubsection Security



@itemize -

@item 
bpo-40121@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40121}: Fixes audit events raised on creating a new socket.

@item 
bpo-39073@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39073}: Disallow CR or LF in email.headerregistry.Address arguments to
guard against header injection attacks.

@item 
bpo-39503@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39503}: 
@geindex Common Vulnerabilities and Exposures; CVE 2020-8492
CVE 2020-8492@footnote{https://www.cve.org/CVERecord?id=CVE-2020-8492}: The
@ref{1cb2,,AbstractBasicAuthHandler} class of the
@ref{112,,urllib.request} module uses an inefficient regular expression which
can be exploited by an attacker to cause a denial of service. Fix the
regex to prevent the catastrophic backtracking. Vulnerability reported by
Ben Caller and Matt Schwager.
@end itemize

@node Core and Builtins<153>,Library<156>,Security<42>,Python 3 9 0 alpha 6
@anchor{whatsnew/changelog id684}@anchor{1d99}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-40313@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40313}: Improve the performance of bytes.hex().

@item 
bpo-40334@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40334}: Switch to a new parser, based on PEG.  For more details see PEP
617. To temporarily switch back to the old parser, use @code{-X oldparser} or
@code{PYTHONOLDPARSER=1}.  In Python 3.10 we will remove the old parser
completely, including the @code{parser} module (already deprecated) and
anything that depends on it.

@item 
bpo-40267@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40267}: Fix the tokenizer to display the correct error message, when
there is a @code{SyntaxError} on the last input character and no newline
follows. It used to be @code{unexpected EOF while parsing}, while it should
be @code{invalid syntax}.

@item 
bpo-39522@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39522}: Correctly unparse explicit @code{u} prefix for strings when
postponed evaluation for annotations activated. Patch by Batuhan Taskaya.

@item 
bpo-40246@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40246}: Report a specialized error message, @code{invalid string prefix},
when the tokenizer encounters a string with an invalid prefix.

@item 
bpo-40082@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40082}: Fix the signal handler: it now always uses the main
interpreter, rather than trying to get the current Python thread state.

@item 
bpo-37388@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37388}: str.encode() and str.decode() no longer check the encoding and
errors in development mode or in debug mode during Python finalization.
The codecs machinery can no longer work on very late calls to str.encode()
and str.decode().

@item 
bpo-40077@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40077}: Fix possible refleaks in @code{_json}, memo of PyScannerObject
should be traversed.

@item 
bpo-37207@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37207}: Speed up calls to @code{dict()} by using the 
@geindex Python Enhancement Proposals; PEP 590
PEP 590@footnote{https://peps.python.org/pep-0590/}
@code{vectorcall} calling convention.

@item 
bpo-40141@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40141}: Add column and line information to @code{ast.keyword} nodes. Patch
by Pablo Galindo.

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port @ref{c1,,resource} to multiphase initialization
(
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port @ref{92,,math} to multiphase initialization (
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port _uuid module to multiphase initialization (
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).

@item 
bpo-40077@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40077}: Convert json module to use @ref{79e,,PyType_FromSpec()}.

@item 
bpo-40067@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40067}: Improve the error message for multiple star expressions in an
assignment. Patch by Furkan Onder

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port _functools module to multiphase initialization (PEP
489). Patch by Paulo Henrique Silva.

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port operator module to multiphase initialization (PEP 489).
Patch by Paulo Henrique Silva.

@item 
bpo-20526@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20526}: Fix @ref{19d4,,PyThreadState_Clear()}. @code{PyThreadState.frame} is
a borrowed reference, not a strong reference: @code{PyThreadState_Clear()}
must not call @code{Py_CLEAR(tstate->frame)}.

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port time module to multiphase initialization (
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).
Patch by Paulo Henrique Silva.

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port _weakref extension module to multiphase initialization
(
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).

@item 
bpo-40020@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40020}: Fix a leak and subsequent crash in parsetok.c caused by realloc
misuse on a rare codepath.

@item 
bpo-39939@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39939}: Added str.removeprefix and str.removesuffix methods and
corresponding bytes, bytearray, and collections.UserString methods to
remove affixes from a string if present. See 
@geindex Python Enhancement Proposals; PEP 616
PEP 616@footnote{https://peps.python.org/pep-0616/} for a full
description. Patch by Dennis Sweeney.

@item 
bpo-39481@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39481}: Implement PEP 585. This supports list[int], tuple[str, …]
etc.

@item 
bpo-32894@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32894}: Support unparsing of infinity numbers in postponed annotations.
Patch by Batuhan Taşkaya.

@item 
bpo-37207@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37207}: Speed up calls to @code{list()} by using the 
@geindex Python Enhancement Proposals; PEP 590
PEP 590@footnote{https://peps.python.org/pep-0590/}
@code{vectorcall} calling convention. Patch by Mark Shannon.
@end itemize

@node Library<156>,Documentation<49>,Core and Builtins<153>,Python 3 9 0 alpha 6
@anchor{whatsnew/changelog id685}@anchor{1d9a}
@subsubsection Library



@itemize -

@item 
bpo-40398@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40398}: @ref{2ae,,typing.get_args()} now always returns an empty tuple for
special generic aliases.

@item 
bpo-40396@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40396}: Functions @ref{2ad,,typing.get_origin()}, @ref{2ae,,typing.get_args()}
and @ref{8c2,,typing.get_type_hints()} support now generic aliases like
@code{list[int]}.

@item 
bpo-38061@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38061}: Optimize the @ref{dc,,subprocess} module on FreeBSD using
@code{closefrom()}. A single @code{close(fd)} syscall is cheap, but when
@code{sysconf(_SC_OPEN_MAX)} is high, the loop calling @code{close(fd)} on each
file descriptor can take several milliseconds.

The workaround on FreeBSD to improve performance was to load and mount the
fdescfs kernel module, but this is not enabled by default.

Initial patch by Ed Maste (emaste), Conrad Meyer (cem), Kyle Evans
(kevans) and Kubilay Kocak (koobs):
@indicateurl{https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=242274}

@item 
bpo-38061@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38061}: On FreeBSD, @code{os.closerange(fd_low, fd_high)} now calls
@code{closefrom(fd_low)} if `fd_high' is greater than or equal to
@code{sysconf(_SC_OPEN_MAX)}.

Initial patch by Ed Maste (emaste), Conrad Meyer (cem), Kyle Evans
(kevans) and Kubilay Kocak (koobs):
@indicateurl{https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=242274}

@item 
bpo-40360@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40360}: The @code{lib2to3} module is pending deprecation due to
@geindex Python Enhancement Proposals; PEP 617
PEP 617@footnote{https://peps.python.org/pep-0617/}.

@item 
bpo-40138@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40138}: Fix the Windows implementation of @ref{fa0,,os.waitpid()} for exit
code larger than @code{INT_MAX >> 8}. The exit status is now interpreted as
an unsigned number.

@item 
bpo-39942@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39942}: Set “__main__” as the default module name when “__name__” is
missing in @ref{487,,typing.TypeVar}. Patch by Weipeng Hong.

@item 
bpo-40275@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40275}: The @ref{8b,,logging} package is now imported lazily in
@ref{10d,,unittest} only when the @ref{a5f,,assertLogs()}
assertion is used.

@item 
bpo-40275@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40275}: The @ref{b,,asyncio} package is now imported lazily in
@ref{10d,,unittest} only when the @ref{35f,,IsolatedAsyncioTestCase}
class is used.

@item 
bpo-40330@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40330}: In @code{ShareableList.__setitem__()}, check the size of a new
string item after encoding it to utf-8, not before.

@item 
bpo-40148@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40148}: Added @code{pathlib.Path.with_stem()} to create a new Path with
the stem replaced.

@item 
bpo-40325@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40325}: Deprecated support for set objects in random.sample().

@item 
bpo-40257@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40257}: Improved help for the @ref{10b,,typing} module. Docstrings are now
shown for all special forms and special generic aliases (like @code{Union}
and @code{List}). Using @code{help()} with generic alias like @code{List[int]} will
show the help for the correspondent concrete type (@code{list} in this case).

@item 
bpo-40257@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40257}: @ref{bf3,,inspect.getdoc()} no longer returns docstring inherited
from the type of the object or from parent class if it is a class if it is
not defined in the object itself. In @ref{ba,,pydoc} the documentation string
is now shown not only for class, function, method etc, but for any object
that has its own @code{__doc__} attribute.

@item 
bpo-40287@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40287}: Fixed @code{SpooledTemporaryFile.seek()} to return the position.

@item 
bpo-40290@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40290}: Added zscore() to statistics.NormalDist().

@item 
bpo-40282@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40282}: Allow @code{random.getrandbits(0)} to succeed and to return 0.

@item 
bpo-40286@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40286}: Add @ref{1870,,random.randbytes()} function and
@ref{b29,,random.Random.randbytes()} method to generate random bytes.

@item 
bpo-40277@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40277}: @ref{4e1,,collections.namedtuple()} now provides a human-readable
repr for its field accessors.

@item 
bpo-40270@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40270}: The included copy of sqlite3 on Windows is now compiled with
the json extension. This allows the use of functions such as
@code{json_object}.

@item 
bpo-29255@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29255}: Wait in @code{KqueueSelector.select} when no fds are registered

@item 
bpo-40260@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40260}: Ensure @ref{95,,modulefinder} uses @ref{17a5,,io.open_code()} and
respects coding comments.

@item 
bpo-40234@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40234}: Allow again to spawn daemon threads in subinterpreters (revert
change which denied them).

@item 
bpo-39207@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39207}: Workers in @ref{1d8,,ProcessPoolExecutor} are
now spawned on demand, only when there are no available idle workers to
reuse. This optimizes startup overhead and reduces the amount of lost CPU
time to idle workers. Patch by Kyle Stanley.

@item 
bpo-40091@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40091}: Fix a hang at fork in the logging module: the new private
_at_fork_reinit() method is now used to reinitialize locks at fork in the
child process.

@item 
bpo-40149@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40149}: Implement traverse and clear slots in _abc._abc_data type.

@item 
bpo-40208@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40208}: Remove deprecated @code{symtable.SymbolTable.has_exec()}.

@item 
bpo-40196@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40196}: Fix a bug in the @ref{de,,symtable} module that was causing
incorrectly report global variables as local. Patch by Pablo Galindo.

@item 
bpo-40190@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40190}: Add support for @code{_SC_AIX_REALMEM} to @code{posix.sysconf()}.

@item 
bpo-40182@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40182}: Removed the @code{_field_types} attribute of the
@ref{32f,,typing.NamedTuple} class.

@item 
bpo-36517@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36517}: Multiple inheritance with @ref{32f,,typing.NamedTuple} now raises
an error instead of silently ignoring other types.

@item 
bpo-40126@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40126}: Fixed reverting multiple patches in unittest.mock. Patcher’s
@code{__exit__()} is now never called if its @code{__enter__()} is failed.
Returning true from @code{__exit__()} silences now the exception.

@item 
bpo-40094@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40094}: CGIHTTPRequestHandler of http.server now logs the CGI script
exit code, rather than the CGI script exit status of os.waitpid(). For
example, if the script is killed by signal 11, it now logs: “CGI script
exit code -11.”

@item 
bpo-40108@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40108}: Improve the error message when triying to import a module using
@ref{c3,,runpy} and incorrectly using the “.py” extension at the end of the
module name. Patch by Pablo Galindo.

@item 
bpo-40094@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40094}: Add @ref{b1d,,os.waitstatus_to_exitcode()} function: convert a wait
status to an exit code.

@item 
bpo-40089@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40089}: Fix threading._after_fork(): if fork was not called by a thread
spawned by threading.Thread, threading._after_fork() now creates a
_MainThread instance for _main_thread, instead of a _DummyThread instance.

@item 
bpo-40089@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40089}: Add a private @code{_at_fork_reinit()} method to
@code{_thread.Lock}, @code{_thread.RLock}, @ref{32c,,threading.RLock}
and @ref{1361,,threading.Condition} classes: reinitialize the lock at fork in
the child process, reset the lock to the unlocked state. Rename also the
private @code{_reset_internal_locks()} method of @ref{1364,,threading.Event} to
@code{_at_fork_reinit()}.

@item 
bpo-25780@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25780}: Expose @ref{b31,,CAN_RAW_JOIN_FILTERS} in the
@ref{d1,,socket} module.

@item 
bpo-39503@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39503}: @ref{1cb2,,AbstractBasicAuthHandler} of
@ref{112,,urllib.request} now parses all WWW-Authenticate HTTP headers and
accepts multiple challenges per header: use the realm of the first Basic
challenge.

@item 
bpo-39812@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39812}: Removed daemon threads from @ref{24,,concurrent.futures} by adding
an internal @code{threading._register_atexit()}, which calls registered
functions prior to joining all non-daemon threads. This allows for
compatibility with subinterpreters, which don’t support daemon threads.

@item 
bpo-40050@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40050}: Fix @code{importlib._bootstrap_external}: avoid creating a new
@code{winreg} builtin module if it’s already available in
@ref{1771,,sys.modules}, and remove redundant imports.

@item 
bpo-40014@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40014}: Fix @code{os.getgrouplist()}: if @code{getgrouplist()} function fails
because the group list is too small, retry with a larger group list. On
failure, the glibc implementation of @code{getgrouplist()} sets @code{ngroups}
to the total number of groups. For other implementations, double the group
list size.

@item 
bpo-40017@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40017}: Add @ref{1d9b,,time.CLOCK_TAI} constant if the operating system
support it.

@item 
bpo-40016@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40016}: In re docstring, clarify the relationship between inline and
argument compile flags.

@item 
bpo-39953@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39953}: Update internal table of OpenSSL error codes in the @code{ssl}
module.

@item 
bpo-36144@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36144}: Added 
@geindex Python Enhancement Proposals; PEP 584
PEP 584@footnote{https://peps.python.org/pep-0584/} operators to
@ref{196e,,weakref.WeakValueDictionary}.

@item 
bpo-36144@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36144}: Added 
@geindex Python Enhancement Proposals; PEP 584
PEP 584@footnote{https://peps.python.org/pep-0584/} operators to
@ref{196d,,weakref.WeakKeyDictionary}.

@item 
bpo-38891@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38891}: Fix linear runtime behaviour of the @code{__getitem__} and
@code{__setitem__} methods in
@ref{1d9c,,multiprocessing.shared_memory.ShareableList}. This avoids
quadratic performance when iterating a @code{ShareableList}. Patch by Thomas
Krennwallner.

@item 
bpo-39682@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39682}: Remove undocumented support for `closing' a @code{pathlib.Path}
object via its context manager. The context manager magic methods remain,
but they are now a no-op, making @code{Path} objects immutable.

@item 
bpo-36144@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36144}: Added 
@geindex Python Enhancement Proposals; PEP 584
PEP 584@footnote{https://peps.python.org/pep-0584/} operators (@code{|} and @code{|=}) to
@ref{e1c,,collections.ChainMap}.

@item 
bpo-39011@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39011}: Normalization of line endings in ElementTree attributes was
removed, as line endings which were replaced by entity numbers should be
preserved in original form.

@item 
bpo-38410@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38410}: Properly handle @ref{195f,,sys.audit()} failures in
@ref{19e0,,sys.set_asyncgen_hooks()}.

@item 
bpo-36541@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36541}: lib2to3 now recognizes named assignment expressions (the walrus
operator, @code{:=})

@item 
bpo-35967@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35967}: In platform, delay the invocation of ‘uname -p’ until the
processor attribute is requested.

@item 
bpo-35113@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35113}: @ref{1812,,inspect.getsource()} now returns correct source code for
inner class with same name as module level class. Decorators are also
returned as part of source of the class. Patch by Karthikeyan
Singaravelan.

@item 
bpo-33262@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33262}: Deprecate passing None as an argument for @ref{75f,,shlex.split()}’s
@code{s} parameter.  Patch by Zackery Spytz.

@item 
bpo-31758@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31758}: Prevent crashes when using an uninitialized
@code{_elementtree.XMLParser} object. Patch by Oren Milman.
@end itemize

@node Documentation<49>,Tests<49>,Library<156>,Python 3 9 0 alpha 6
@anchor{whatsnew/changelog id686}@anchor{1d9d}
@subsubsection Documentation



@itemize -

@item 
bpo-27635@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27635}: The pickle documentation incorrectly claimed that @code{__new__}
isn’t called by default when unpickling.

@item 
bpo-39879@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39879}: Updated @ref{1d9e,,Data model} docs to include @ref{184,,dict()} insertion
order preservation. Patch by Furkan Onder and Samy Lahfa.

@item 
bpo-38387@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38387}: Document @ref{1d9f,,PyDoc_STRVAR} macro in the C-API reference.

@item 
bpo-13743@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13743}: Some methods within xml.dom.minidom.Element class are now
better documented.
@end itemize

@node Tests<49>,Build<56>,Documentation<49>,Python 3 9 0 alpha 6
@anchor{whatsnew/changelog id687}@anchor{1da0}
@subsubsection Tests



@itemize -

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: Set expected default encoding in test_c_locale_coercion.py for
VxWorks RTOS.

@item 
bpo-40162@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40162}: Update Travis CI configuration to OpenSSL 1.1.1f.

@item 
bpo-40146@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40146}: Update OpenSSL to 1.1.1f in Azure Pipelines.

@item 
bpo-40094@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40094}: Add @ref{1da1,,test.support.wait_process()} function.

@item 
bpo-40003@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40003}: @code{test.bisect_cmd} now copies Python command line options like
@code{-O} or @code{-W}. Moreover, emit a warning if @code{test.bisect_cmd} is used
with @code{-w}/@code{--verbose2} option.

@item 
bpo-39380@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39380}: Add the encoding in @ref{afc,,ftplib.FTP} and
@ref{afd,,ftplib.FTP_TLS} to the constructor as keyword-only and change the
default from @code{latin-1} to @code{utf-8} to follow 
@geindex RFC; RFC 2640
RFC 2640@footnote{https://datatracker.ietf.org/doc/html/rfc2640.html}.

@item 
bpo-39793@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39793}: Use the same domain when testing @code{make_msgid}. Patch by
Batuhan Taskaya.

@item 
bpo-1812@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1812}: Fix newline handling in doctest.testfile when loading from a
package whose loader has a get_data method. Patch by Peter Donis.
@end itemize

@node Build<56>,Windows<48>,Tests<49>,Python 3 9 0 alpha 6
@anchor{whatsnew/changelog id688}@anchor{1da2}
@subsubsection Build



@itemize -

@item 
bpo-38360@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38360}: Support single-argument form of macOS -isysroot flag.

@item 
bpo-40158@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40158}: Fix CPython MSBuild Properties in NuGet Package
(build/native/python.props)

@item 
bpo-38527@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38527}: Fix configure check on Solaris for “float word ordering”:
sometimes, the correct “grep” command was not being used. Patch by Arnon
Yaari.
@end itemize

@node Windows<48>,macOS<39>,Build<56>,Python 3 9 0 alpha 6
@anchor{whatsnew/changelog id689}@anchor{1da3}
@subsubsection Windows



@itemize -

@item 
bpo-40164@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40164}: Updates Windows to OpenSSL 1.1.1f

@item 
bpo-8901@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8901}: Ignore the Windows registry when the @code{-E} option is used.
@end itemize

@node macOS<39>,IDLE<28>,Windows<48>,Python 3 9 0 alpha 6
@anchor{whatsnew/changelog id690}@anchor{1da4}
@subsubsection macOS



@itemize -

@item 
bpo-38329@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38329}: python.org macOS installers now update the Current version
symlink of /Library/Frameworks/Python.framework/Versions for 3.9 installs.
Previously, Current was only updated for Python 2.x installs. This should
make it easier to embed Python 3 into other macOS applications.

@item 
bpo-40164@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40164}: Update macOS installer builds to use OpenSSL 1.1.1g.
@end itemize

@node IDLE<28>,Tools/Demos<31>,macOS<39>,Python 3 9 0 alpha 6
@anchor{whatsnew/changelog id691}@anchor{1da5}
@subsubsection IDLE



@itemize -

@item 
bpo-38439@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38439}: Add a 256×256 pixel IDLE icon to support more modern
environments. Created by Andrew Clover. Delete the unused macOS idle.icns
icon file.

@item 
bpo-38689@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38689}: IDLE will no longer freeze when inspect.signature fails when
fetching a calltip.
@end itemize

@node Tools/Demos<31>,C API<50>,IDLE<28>,Python 3 9 0 alpha 6
@anchor{whatsnew/changelog id692}@anchor{1da6}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-40385@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40385}: Removed the checkpyc.py tool. Please see compileall without
force mode as a potential alternative.

@item 
bpo-40179@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40179}: Fixed translation of @code{#elif} in Argument Clinic.

@item 
bpo-40094@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40094}: Fix @code{which.py} script exit code: it now uses
@ref{b1d,,os.waitstatus_to_exitcode()} to convert @ref{1669,,os.system()} exit status
into an exit code.
@end itemize

@node C API<50>,,Tools/Demos<31>,Python 3 9 0 alpha 6
@anchor{whatsnew/changelog id693}@anchor{1da7}
@subsubsection C API



@itemize -

@item 
bpo-40241@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40241}: Move the @code{PyGC_Head} structure to the internal C API.

@item 
bpo-40170@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40170}: Convert @ref{b81,,PyObject_IS_GC()} macro to a function to hide
implementation details.

@item 
bpo-40241@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40241}: Add the functions @ref{b73,,PyObject_GC_IsTracked()} and
@ref{b74,,PyObject_GC_IsFinalized()} to the public API to allow to query if
Python objects are being currently tracked or have been already finalized
by the garbage collector respectively. Patch by Pablo Galindo.

@item 
bpo-40170@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40170}: The @code{PyObject_NEW()} macro becomes an alias to the
@ref{b82,,PyObject_New()} macro, and the @code{PyObject_NEW_VAR()} macro
becomes an alias to the @ref{b83,,PyObject_NewVar()} macro, to hide
implementation details. They no longer access directly the
@ref{b84,,PyTypeObject.tp_basicsize} member.

@item 
bpo-40170@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40170}: @ref{1d80,,PyType_HasFeature()} now always calls
@ref{1d81,,PyType_GetFlags()} to hide implementation details. Previously, it
accessed directly the @ref{1cb4,,PyTypeObject.tp_flags} member when the
limited C API was not used.

@item 
bpo-40170@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40170}: Convert the @code{PyObject_GET_WEAKREFS_LISTPTR()} macro to a
function to hide implementation details: the macro accessed directly to
the @ref{b85,,PyTypeObject.tp_weaklistoffset} member.

@item 
bpo-40170@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40170}: Convert @ref{639,,PyObject_CheckBuffer()} macro to a function to
hide implementation details: the macro accessed directly the
@ref{b86,,PyTypeObject.tp_as_buffer} member.

@item 
bpo-40170@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40170}: Always declare @ref{b87,,PyIndex_Check()} as an opaque function to
hide implementation details: remove @code{PyIndex_Check()} macro. The macro
accessed directly the @ref{b88,,PyTypeObject.tp_as_number} member.

@item 
bpo-39947@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39947}: Add @ref{b70,,PyThreadState_GetID()} function: get the unique
identifier of a Python thread state.
@end itemize

@node Python 3 9 0 alpha 5,Python 3 9 0 alpha 4,Python 3 9 0 alpha 6,Changelog
@anchor{whatsnew/changelog python-3-9-0-alpha-5}@anchor{1da8}
@subsection Python 3.9.0 alpha 5


`Release date: 2020-03-23'

@menu
* Security: Security<43>. 
* Core and Builtins: Core and Builtins<154>. 
* Library: Library<157>. 
* Documentation: Documentation<50>. 
* Tests: Tests<50>. 
* Build: Build<57>. 
* Windows: Windows<49>. 
* macOS: macOS<40>. 
* IDLE: IDLE<29>. 
* Tools/Demos: Tools/Demos<32>. 
* C API: C API<51>. 

@end menu

@node Security<43>,Core and Builtins<154>,,Python 3 9 0 alpha 5
@anchor{whatsnew/changelog id694}@anchor{1da9}
@subsubsection Security



@itemize -

@item 
bpo-38576@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38576}: Disallow control characters in hostnames in http.client,
addressing 
@geindex Common Vulnerabilities and Exposures; CVE 2019-18348
CVE 2019-18348@footnote{https://www.cve.org/CVERecord?id=CVE-2019-18348}. Such potentially malicious header injection
URLs now cause a InvalidURL to be raised.
@end itemize

@node Core and Builtins<154>,Library<157>,Security<43>,Python 3 9 0 alpha 5
@anchor{whatsnew/changelog id695}@anchor{1daa}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-40010@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40010}: Optimize pending calls in multithreaded applications. If a
thread different than the main thread schedules a pending call
(@ref{b7e,,Py_AddPendingCall()}), the bytecode evaluation loop is no longer
interrupted at each bytecode instruction to check for pending calls which
cannot be executed. Only the main thread can execute pending calls.

Previously, the bytecode evaluation loop was interrupted at each
instruction until the main thread executes pending calls.

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port _weakref extension module to multiphase initialization
(
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port _collections module to multiphase initialization
(
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).

@item 
bpo-40010@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40010}: Optimize signal handling in multithreaded applications. If a
thread different than the main thread gets a signal, the bytecode
evaluation loop is no longer interrupted at each bytecode instruction to
check for pending signals which cannot be handled. Only the main thread of
the main interpreter can handle signals.

Previously, the bytecode evaluation loop was interrupted at each
instruction until the main thread handles signals.

@item 
bpo-39984@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39984}: If @ref{b7e,,Py_AddPendingCall()} is called in a subinterpreter,
the function is now scheduled to be called from the subinterpreter, rather
than being called from the main interpreter. Each subinterpreter now has
its own list of scheduled calls.

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port _heapq module to multiphase initialization.

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port itertools module to multiphase initialization
(
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).

@item 
bpo-37207@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37207}: Speed up calls to @code{frozenset()} by using the 
@geindex Python Enhancement Proposals; PEP 590
PEP 590@footnote{https://peps.python.org/pep-0590/}
@code{vectorcall} calling convention. Patch by Donghee Na.

@item 
bpo-39984@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39984}: subinterpreters: Move
@code{_PyRuntimeState.ceval.tracing_possible} to
@code{PyInterpreterState.ceval.tracing_possible}: each interpreter now has
its own variable.

@item 
bpo-37207@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37207}: Speed up calls to @code{set()} by using the 
@geindex Python Enhancement Proposals; PEP 590
PEP 590@footnote{https://peps.python.org/pep-0590/}
@code{vectorcall} calling convention. Patch by Donghee Na.

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port _statistics module to multiphase initialization
(
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).

@item 
bpo-39968@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39968}: Use inline function to replace extension modules’
get_module_state macros.

@item 
bpo-39965@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39965}: Correctly raise @code{SyntaxError} if `await' is used inside
non-async functions and @code{PyCF_ALLOW_TOP_LEVEL_AWAIT} is set (like in the
asyncio REPL). Patch by Pablo Galindo.

@item 
bpo-39562@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39562}: Allow executing asynchronous comprehensions on the top level
when the @code{PyCF_ALLOW_TOP_LEVEL_AWAIT} flag is given. Patch by Batuhan
Taskaya.

@item 
bpo-37207@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37207}: Speed up calls to @code{tuple()} by using the 
@geindex Python Enhancement Proposals; PEP 590
PEP 590@footnote{https://peps.python.org/pep-0590/}
@code{vectorcall} calling convention. Patch by Donghee Na.

@item 
bpo-38373@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38373}: Changed list overallocation strategy. It no longer
overallocates if the new size is closer to overallocated size than to the
old size and adds padding.

@item 
bpo-39926@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39926}: Update Unicode database to Unicode version 13.0.0.

@item 
bpo-19466@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19466}: Clear the frames of daemon threads earlier during the Python
shutdown to call objects destructors. So “unclosed file” resource warnings
are now emitted for daemon threads in a more reliable way.

@item 
bpo-38894@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38894}: Fix a bug that was causing incomplete results when calling
@code{pathlib.Path.glob} in the presence of symlinks that point to files
where the user does not have read access. Patch by Pablo Galindo and Matt
Wozniski.

@item 
bpo-39877@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39877}: Fix @ref{648,,PyEval_RestoreThread()} random crash at exit with
daemon threads. It now accesses the @code{_PyRuntime} variable directly
instead of using @code{tstate->interp->runtime}, since @code{tstate} can be a
dangling pointer after @ref{45d,,Py_Finalize()} has been called. Moreover,
the daemon thread now exits before trying to take the GIL.

@item 
bpo-39871@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39871}: Fix a possible @ref{796,,SystemError} in
@code{math.@{atan2,copysign,remainder@}()} when the first argument cannot be
converted to a @ref{197,,float}. Patch by Zackery Spytz.

@item 
bpo-39776@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39776}: Fix race condition where threads created by PyGILState_Ensure()
could get a duplicate id.

This affects consumers of tstate->id like the contextvar caching
machinery, which could return invalid cached objects under heavy thread
load (observed in embedded scenarios).

@item 
bpo-39778@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39778}: Fixed a crash due to incorrect handling of weak references in
@code{collections.OrderedDict} classes. Patch by Pablo Galindo.

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port audioop extension module to multiphase initialization
(
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).

@item 
bpo-39702@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39702}: Relax @ref{93f,,decorator} grammar restrictions to allow any valid
expression (
@geindex Python Enhancement Proposals; PEP 614
PEP 614@footnote{https://peps.python.org/pep-0614/}).

@item 
bpo-38091@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38091}: Tweak import deadlock detection code to not deadlock itself.

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port _locale extension module to multiphase initialization
(
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).

@item 
bpo-39087@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39087}: Optimize @ref{422,,PyUnicode_AsUTF8()} and
@ref{a9f,,PyUnicode_AsUTF8AndSize()} slightly when they need to create
internal UTF-8 cache.

@item 
bpo-39520@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39520}: Fix unparsing of ext slices with no items (@code{foo[:,]}). Patch
by Batuhan Taskaya.

@item 
bpo-39220@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39220}: Do not optimize annotations if ‘from __future__ import
annotations’ is used. Patch by Pablo Galindo.

@item 
bpo-35712@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35712}: Using @ref{1a3,,NotImplemented} in a boolean context has been
deprecated. Patch contributed by Josh Rosenberg.

@item 
bpo-22490@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22490}: Don’t leak environment variable @code{__PYVENV_LAUNCHER__} into
the interpreter session on macOS.
@end itemize

@node Library<157>,Documentation<50>,Core and Builtins<154>,Python 3 9 0 alpha 5
@anchor{whatsnew/changelog id696}@anchor{1dab}
@subsubsection Library



@itemize -

@item 
bpo-39830@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39830}: Add @ref{8da,,zipfile.Path} to @code{__all__} in the @ref{138,,zipfile}
module.

@item 
bpo-40000@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40000}: Improved error messages for validation of @code{ast.Constant}
nodes. Patch by Batuhan Taskaya.

@item 
bpo-39999@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39999}: @code{__module__} of the AST node classes is now set to “ast”
instead of “_ast”. Added docstrings for dummy AST node classes and
deprecated attributes.

@item 
bpo-39991@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39991}: @ref{da6,,uuid.getnode()} now skips IPv6 addresses with the same
string length than a MAC address (17 characters): only use MAC addresses.

@item 
bpo-39988@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39988}: Deprecated @code{ast.AugLoad} and @code{ast.AugStore} node classes
because they are no longer used.

@item 
bpo-39656@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39656}: Ensure @code{bin/python3.#} is always present in virtual
environments on POSIX platforms - by Anthony Sottile.

@item 
bpo-39969@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39969}: Deprecated @code{ast.Param} node class because it’s no longer
used. Patch by Batuhan Taskaya.

@item 
bpo-39360@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39360}: Ensure all workers exit when finalizing a
@code{multiprocessing.Pool} implicitly via the module finalization
handlers of multiprocessing. This fixes a deadlock situation that can be
experienced when the Pool is not properly finalized via the context
manager or a call to @code{multiprocessing.Pool.terminate}. Patch by Batuhan
Taskaya and Pablo Galindo.

@item 
bpo-35370@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35370}: sys.settrace(), sys.setprofile() and _lsprof.Profiler.enable()
now properly report @ref{613,,PySys_Audit()} error if “sys.setprofile” or
“sys.settrace” audit event is denied.

@item 
bpo-39936@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39936}: AIX: Fix _aix_support module when the subprocess is not
available, when building Python from scratch. It now uses new private
_bootsubprocess module, rather than having two implementations depending
if subprocess is available or not. So _aix_support.aix_platform() result
is now the same if subprocess is available or not.

@item 
bpo-36144@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36144}: @ref{7f4,,collections.OrderedDict} now implements @code{|} and
@code{|=} (
@geindex Python Enhancement Proposals; PEP 584
PEP 584@footnote{https://peps.python.org/pep-0584/}).

@item 
bpo-39652@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39652}: The column name found in @code{sqlite3.Cursor.description} is now
truncated on the first ‘[’ only if the PARSE_COLNAMES option is set.

@item 
bpo-39915@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39915}: Ensure @ref{1dac,,unittest.mock.AsyncMock.await_args_list} has call
objects in the order of awaited arguments instead of using
@ref{1dad,,unittest.mock.Mock.call_args} which has the last value of the call.
Patch by Karthikeyan Singaravelan.

@item 
bpo-36144@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36144}: Updated @ref{25b,,os.environ} and @ref{25c,,os.environb} to support
@geindex Python Enhancement Proposals; PEP 584
PEP 584@footnote{https://peps.python.org/pep-0584/}’s merge (@code{|}) and update (@code{|=}) operators.

@item 
bpo-38662@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38662}: The @code{ensurepip} module now invokes @code{pip} via the @code{runpy}
module. Hence it is no longer tightly coupled with the internal API of the
bundled @code{pip} version, allowing easier updates to a newer @code{pip}
version both internally and for distributors.

@item 
bpo-38075@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38075}: Fix the @ref{1dae,,random.Random.seed()} method when a @ref{3c1,,bool}
is passed as the seed.

@item 
bpo-39916@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39916}: More reliable use of @code{os.scandir()} in @code{Path.glob()}. It no
longer emits a ResourceWarning when interrupted.

@item 
bpo-39850@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39850}: @ref{98,,multiprocessing} now supports abstract socket addresses
(if abstract sockets are supported in the running platform). When creating
arbitrary addresses (like when default-constructing
@ref{1a6a,,multiprocessing.connection.Listener} objects) abstract sockets are
preferred to avoid the case when the temporary-file-generated address is
too large for an AF_UNIX socket address. Patch by Pablo Galindo.

@item 
bpo-36287@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36287}: @ref{ae7,,ast.dump()} no longer outputs optional fields and
attributes with default values. The default values for optional fields and
attributes of AST nodes are now set as class attributes (e.g.
@code{Constant.kind} is set to @code{None}).

@item 
bpo-39889@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39889}: Fixed @ref{ae8,,ast.unparse()} for extended slices containing a
single element (e.g. @code{a[i:j,]}). Remove redundant tuples when index with
a tuple (e.g. @code{a[i, j]}).

@item 
bpo-39828@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39828}: Fix @ref{87,,json.tool} to catch @ref{1262,,BrokenPipeError}. Patch by
Donghee Na.

@item 
bpo-13487@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13487}: Avoid a possible `“RuntimeError: dictionary changed size during
iteration”' from @ref{1bb1,,inspect.getmodule()} when it tried to loop through
@ref{1771,,sys.modules}.

@item 
bpo-39674@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39674}: Revert “bpo-37330@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37330}: open() no longer accept ‘U’ in file mode”.
The “U” mode of open() is kept in Python 3.9 to ease transition from
Python 2.7, but will be removed in Python 3.10.

@item 
bpo-28577@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28577}: The hosts method on 32-bit prefix length IPv4Networks and
128-bit prefix IPv6Networks now returns a list containing the single
Address instead of an empty list.

@item 
bpo-39826@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39826}: Add getConnection method to logging HTTPHandler to enable
custom connections.

@item 
bpo-39763@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39763}: Reimplement @code{distutils.spawn.spawn} function with the
@ref{dc,,subprocess} module.

@item 
bpo-39794@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39794}: Add –without-decimal-contextvar build option.  This enables a
thread-local rather than a coroutine local context.

@item 
bpo-36144@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36144}: @ref{13c8,,collections.defaultdict} now implements @code{|}
(
@geindex Python Enhancement Proposals; PEP 584
PEP 584@footnote{https://peps.python.org/pep-0584/}).

@item 
bpo-39517@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39517}: Fix runpy.run_path() when using pathlike objects

@item 
bpo-39775@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39775}: Change @code{inspect.Signature.parameters} back to
@code{collections.OrderedDict}. This was changed to @code{dict} in Python
3.9.0a4.

@item 
bpo-39678@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39678}: Refactor queue_manager in
@ref{1d8,,concurrent.futures.ProcessPoolExecutor} to make it easier to
maintain.

@item 
bpo-39764@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39764}: Fix AttributeError when calling get_stack on a PyAsyncGenObject
Task

@item 
bpo-39769@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39769}: The @ref{d21,,compileall.compile_dir()} function’s `ddir' parameter
and the compileall command line flag @code{-d} no longer write the wrong
pathname to the generated pyc file for submodules beneath the root of the
directory tree being compiled.  This fixes a regression introduced with
Python 3.5.

@item 
bpo-36144@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36144}: @ref{699,,types.MappingProxyType} objects now support the merge
(@code{|}) operator from 
@geindex Python Enhancement Proposals; PEP 584
PEP 584@footnote{https://peps.python.org/pep-0584/}.

@item 
bpo-38691@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38691}: The @ref{7b,,importlib} module now ignores the
@geindex PYTHONCASEOK
@geindex environment variable; PYTHONCASEOK
@ref{b5b,,PYTHONCASEOK} environment variable when the @ref{b5c,,-E} or
@ref{b5d,,-I} command line options are being used.

@item 
bpo-39719@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39719}: Remove @code{tempfile.SpooledTemporaryFile.softspace()} as files
no longer have the @code{softspace} attribute in Python 3. Patch by Shantanu.

@item 
bpo-39667@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39667}: Improve pathlib.Path compatibility on zipfile.Path and correct
performance degradation as found in zipp 3.0.

@item 
bpo-39638@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39638}: Keep ASDL signatures in the docstrings for @code{AST} nodes. Patch
by Batuhan Taskaya

@item 
bpo-39639@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39639}: Deprecated @code{ast.Suite} node class because it’s no longer
used. Patch by Batuhan Taskaya.

@item 
bpo-39609@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39609}: Add thread_name_prefix to default asyncio executor

@item 
bpo-39548@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39548}: Fix handling of header in
@ref{1daf,,urllib.request.AbstractDigestAuthHandler} when the optional
@code{qop} parameter is not present.

@item 
bpo-39509@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39509}: HTTP status codes @code{103 EARLY_HINTS} and @code{425 TOO_EARLY} are
added to @ref{b02,,http.HTTPStatus}. Patch by Donghee Na.

@item 
bpo-39507@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39507}: Adding HTTP status 418 “I’m a Teapot” to HTTPStatus in http
library. Patch by Ross Rhodes.

@item 
bpo-39495@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39495}: Remove default value from `attrs' parameter of
@ref{1db0,,xml.etree.ElementTree.TreeBuilder.start()} for consistency between
Python and C implementations.

@item 
bpo-38971@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38971}: Open issue in the BPO indicated a desire to make the
implementation of codecs.open() at parity with io.open(), which implements
a try/except to assure file stream gets closed before an exception is
raised.

@item 
bpo-38641@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38641}: Added starred expressions support to @code{return} and @code{yield}
statements for @code{lib2to3}. Patch by Vlad Emelianov.

@item 
bpo-37534@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37534}: When using minidom module to generate XML documents the ability
to add Standalone Document Declaration is added. All the changes are made
to generate a document in compliance with Extensible Markup Language (XML)
1.0 (Fifth Edition) W3C Recommendation (available here:
@indicateurl{https://www.w3.org/TR/xml/#sec-prolog-dtd}).

@item 
bpo-34788@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34788}: Add support for scoped IPv6 addresses to @ref{84,,ipaddress}.
Patch by Oleksandr Pavliuk.

@item 
bpo-34822@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34822}: Simplified AST for subscription. Simple indices are now
represented by their value, extended slices are represented as tuples.
@ref{9,,ast} classes @code{Index} and @code{ExtSlice} are considered deprecated
and will be removed in future Python versions. In the meantime,
@code{Index(value)} now returns a @code{value} itself, @code{ExtSlice(slices)}
returns @code{Tuple(slices, Load())}.
@end itemize

@node Documentation<50>,Tests<50>,Library<157>,Python 3 9 0 alpha 5
@anchor{whatsnew/changelog id697}@anchor{1db1}
@subsubsection Documentation



@itemize -

@item 
bpo-39868@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39868}: Updated the Language Reference for 
@geindex Python Enhancement Proposals; PEP 572
PEP 572@footnote{https://peps.python.org/pep-0572/}.

@item 
bpo-13790@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13790}: Change ‘string’ to ‘specification’ in format doc.

@item 
bpo-17422@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17422}: The language reference no longer restricts default class
namespaces to dicts only.

@item 
bpo-39530@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39530}: Fix misleading documentation about mixed-type numeric
comparisons.

@item 
bpo-39718@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39718}: Update @ref{101,,token} documentation to reflect additions in
Python 3.8

@item 
bpo-39677@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39677}: Changed operand name of `MAKE_FUNCTION' from `argc' to
`flags' for module @ref{3c,,dis}
@end itemize

@node Tests<50>,Build<57>,Documentation<50>,Python 3 9 0 alpha 5
@anchor{whatsnew/changelog id698}@anchor{1db2}
@subsubsection Tests



@itemize -

@item 
bpo-40019@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40019}: test_gdb now skips tests if it detects that gdb failed to read
debug information because the Python binary is optimized.

@item 
bpo-27807@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27807}: @code{test_site.test_startup_imports()} is now skipped if a path
of @ref{3e2,,sys.path} contains a @code{.pth} file.

@item 
bpo-26067@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26067}: Do not fail test_shutil test_chown test when uid or gid of user
cannot be resolved to a name.

@item 
bpo-39855@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39855}: test_subprocess.test_user() now skips the test on an user name
if the user name doesn’t exist. For example, skip the test if the user
“nobody” doesn’t exist on Linux.
@end itemize

@node Build<57>,Windows<49>,Tests<50>,Python 3 9 0 alpha 5
@anchor{whatsnew/changelog id699}@anchor{1db3}
@subsubsection Build



@itemize -

@item 
bpo-39761@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39761}: Fix build with DTrace but without additional DFLAGS.

@item 
bpo-39763@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39763}: setup.py now uses a basic implementation of the
@ref{dc,,subprocess} module if the @code{subprocess} module is not available:
before required C extension modules are built.

@item 
bpo-1294959@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1294959}: Add @code{--with-platlibdir} option to the configure script:
name of the platform-specific library directory, stored in the new
@ref{b38,,sys.platlibdir} attribute. It is used to build the path of
platform-specific extension modules and the path of the standard library.
It is equal to @code{"lib"} on most platforms. On Fedora and SuSE, it is
equal to @code{"lib64"} on 64-bit platforms. Patch by Jan Matějek, Matěj
Cepl, Charalampos Stratakis and Victor Stinner.
@end itemize

@node Windows<49>,macOS<40>,Build<57>,Python 3 9 0 alpha 5
@anchor{whatsnew/changelog id700}@anchor{1db4}
@subsubsection Windows



@itemize -

@item 
bpo-39930@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39930}: Ensures the required @code{vcruntime140.dll} is included in
install packages.

@item 
bpo-39847@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39847}: Avoid hang when computer is hibernated whilst waiting for a
mutex (for lock-related objects from @ref{f3,,threading}) around 49-day
uptime.

@item 
bpo-38597@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38597}: @code{distutils} will no longer statically link
@code{vcruntime140.dll} when a redistributable version is unavailable.
All future releases of CPython will include a copy of this DLL to ensure
distributed extensions can continue to load.

@item 
bpo-38380@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38380}: Update Windows builds to use SQLite 3.31.1

@item 
bpo-39789@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39789}: Update Windows release build machines to Visual Studio 2019
(MSVC 14.2).

@item 
bpo-34803@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34803}: Package for nuget.org now includes repository reference and
bundled icon image.
@end itemize

@node macOS<40>,IDLE<29>,Windows<49>,Python 3 9 0 alpha 5
@anchor{whatsnew/changelog id701}@anchor{1db5}
@subsubsection macOS



@itemize -

@item 
bpo-38380@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38380}: Update macOS builds to use SQLite 3.31.1
@end itemize

@node IDLE<29>,Tools/Demos<32>,macOS<40>,Python 3 9 0 alpha 5
@anchor{whatsnew/changelog id702}@anchor{1db6}
@subsubsection IDLE



@itemize -

@item 
bpo-27115@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27115}: For ‘Go to Line’, use a Query box subclass with IDLE standard
behavior and improved error checking.

@item 
bpo-39885@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39885}: Since clicking to get an IDLE context menu moves the cursor,
any text selection should be and now is cleared.

@item 
bpo-39852@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39852}: Edit “Go to line” now clears any selection, preventing
accidental deletion. It also updates Ln and Col on the status bar.

@item 
bpo-39781@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39781}: Selecting code context lines no longer causes a jump.
@end itemize

@node Tools/Demos<32>,C API<51>,IDLE<29>,Python 3 9 0 alpha 5
@anchor{whatsnew/changelog id703}@anchor{1db7}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-36184@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36184}: Port python-gdb.py to FreeBSD. python-gdb.py now checks for
“take_gil” function name to check if a frame tries to acquire the GIL,
instead of checking for “pthread_cond_timedwait” which is specific to
Linux and can be a different condition than the GIL.

@item 
bpo-38080@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38080}: Added support to fix @code{getproxies} in the
@code{lib2to3.fixes.fix_urllib} module. Patch by José Roberto Meza
Cabrera.
@end itemize

@node C API<51>,,Tools/Demos<32>,Python 3 9 0 alpha 5
@anchor{whatsnew/changelog id704}@anchor{1db8}
@subsubsection C API



@itemize -

@item 
bpo-40024@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40024}: Add @ref{b72,,PyModule_AddType()} helper function: add a type to a
module. Patch by Donghee Na.

@item 
bpo-39946@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39946}: Remove @code{_PyRuntime.getframe} hook and remove
@code{_PyThreadState_GetFrame} macro which was an alias to
@code{_PyRuntime.getframe}. They were only exposed by the internal C API.
Remove also @code{PyThreadFrameGetter} type.

@item 
bpo-39947@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39947}: Add @ref{996,,PyThreadState_GetFrame()} function: get the current
frame of a Python thread state.

@item 
bpo-37207@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37207}: Add _PyArg_NoKwnames helper function. Patch by Donghee Na.

@item 
bpo-39947@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39947}: Add @ref{b6f,,PyThreadState_GetInterpreter()}: get the interpreter
of a Python thread state.

@item 
bpo-39947@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39947}: Add @ref{64c,,PyInterpreterState_Get()} function to the limited C
API.

@item 
bpo-35370@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35370}: If @ref{613,,PySys_Audit()} fails in @ref{1709,,PyEval_SetProfile()}
or @ref{663,,PyEval_SetTrace()}, log the error as an unraisable exception.

@item 
bpo-39947@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39947}: Move the static inline function flavor of
Py_EnterRecursiveCall() and Py_LeaveRecursiveCall() to the internal C API:
they access PyThreadState attributes. The limited C API provides regular
functions which hide implementation details.

@item 
bpo-39947@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39947}: Py_TRASHCAN_BEGIN_CONDITION and Py_TRASHCAN_END macro no longer
access PyThreadState attributes, but call new private _PyTrash_begin() and
_PyTrash_end() functions which hide implementation details.

@item 
bpo-39884@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39884}: @ref{1db9,,PyDescr_NewMethod()} and @ref{1dba,,PyCFunction_NewEx()} now
include the method name in the SystemError “bad call flags” error message
to ease debug.

@item 
bpo-39877@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39877}: Deprecated @code{PyEval_InitThreads()} and
@code{PyEval_ThreadsInitialized()}. Calling
@code{PyEval_InitThreads()} now does nothing.

@item 
bpo-38249@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38249}: @ref{db4,,Py_UNREACHABLE} is now implemented with
@code{__builtin_unreachable()} and analogs in release mode.

@item 
bpo-38643@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38643}: @ref{1bb7,,PyNumber_ToBase()} now raises a @ref{796,,SystemError}
instead of crashing when called with invalid base.

@item 
bpo-39882@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39882}: The @ref{b80,,Py_FatalError()} function is replaced with a macro
which logs automatically the name of the current function, unless the
@code{Py_LIMITED_API} macro is defined.

@item 
bpo-39824@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39824}: Extension modules: @ref{b77,,m_traverse},
@ref{b78,,m_clear} and @ref{b79,,m_free}
functions of @ref{b7a,,PyModuleDef} are no longer called if the module
state was requested but is not allocated yet. This is the case immediately
after the module is created and before the module is executed
(@ref{b7b,,Py_mod_exec} function). More precisely, these functions are not
called if @ref{b7c,,m_size} is greater than 0 and the module
state (as returned by @ref{b7d,,PyModule_GetState()}) is @code{NULL}.

Extension modules without module state (@code{m_size <= 0}) are not affected.

@item 
bpo-38913@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38913}: Fixed segfault in @code{Py_BuildValue()} called with a format
containing “#” and undefined PY_SSIZE_T_CLEAN whwn an exception is set.

@item 
bpo-38500@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38500}: Add a private API to get and set the frame evaluation function:
add @ref{1dbb,,_PyInterpreterState_GetEvalFrameFunc()} and
@ref{1dbc,,_PyInterpreterState_SetEvalFrameFunc()} C functions. The
@ref{97f,,_PyFrameEvalFunction} function type now takes a `tstate'
parameter.
@end itemize

@node Python 3 9 0 alpha 4,Python 3 9 0 alpha 3,Python 3 9 0 alpha 5,Changelog
@anchor{whatsnew/changelog python-3-9-0-alpha-4}@anchor{1dbd}
@subsection Python 3.9.0 alpha 4


`Release date: 2020-02-25'

@menu
* Security: Security<44>. 
* Core and Builtins: Core and Builtins<155>. 
* Library: Library<158>. 
* Documentation: Documentation<51>. 
* Tests: Tests<51>. 
* Build: Build<58>. 
* Windows: Windows<50>. 
* IDLE: IDLE<30>. 
* C API: C API<52>. 

@end menu

@node Security<44>,Core and Builtins<155>,,Python 3 9 0 alpha 4
@anchor{whatsnew/changelog id705}@anchor{1dbe}
@subsubsection Security



@itemize -

@item 
bpo-39184@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39184}: Add audit events to functions in @code{fcntl}, @code{msvcrt}, @code{os},
@code{resource}, @code{shutil}, @code{signal} and @code{syslog}.

@item 
bpo-39401@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39401}: Avoid unsafe DLL load at startup on Windows 7 and earlier.

@item 
bpo-39184@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39184}: Add audit events to command execution functions in os and pty
modules.
@end itemize

@node Core and Builtins<155>,Library<158>,Security<44>,Python 3 9 0 alpha 4
@anchor{whatsnew/changelog id706}@anchor{1dbf}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-39382@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39382}: Fix a use-after-free in the single inheritance path of
@code{issubclass()}, when the @code{__bases__} of an object has a single
reference, and so does its first item. Patch by Yonatan Goldschmidt.

@item 
bpo-39573@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39573}: Update clinic tool to use @ref{1be3,,Py_IS_TYPE()}. Patch by
Donghee Na.

@item 
bpo-39619@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39619}: Enable use of @ref{1dc0,,os.chroot()} on HP-UX systems.

@item 
bpo-39573@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39573}: Add @ref{1be3,,Py_IS_TYPE()} static inline function to check
whether the object `o' type is `type'.

@item 
bpo-39606@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39606}: Fix regression caused by fix for bpo-39386@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39386}, that prevented
calling @code{aclose} on an async generator that had already been closed or
exhausted.

@item 
bpo-39579@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39579}: Change the ending column offset of @code{Attribute} nodes
constructed in @code{ast_for_dotted_name} to point at the end of the current
node and not at the end of the last @code{NAME} node.

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port _crypt extension module to multiphase initialization
(
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port _contextvars extension module to multiphase
initialization (
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).

@item 
bpo-39510@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39510}: Fix segfault in @code{readinto()} method on closed BufferedReader.

@item 
bpo-39502@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39502}: Fix @ref{1705,,time.localtime()} on 64-bit AIX  to support years
before 1902 and after 2038. Patch by M Felt.

@item 
bpo-39492@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39492}: Fix a reference cycle in the C Pickler that was preventing the
garbage collection of deleted, pickled objects.

@item 
bpo-39453@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39453}: Fixed a possible crash in @code{list.__contains__()} when a list
is changed during comparing items. Patch by Donghee Na.

@item 
bpo-39434@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39434}: @ref{b44,,floor division} of float operation now has a better
performance. Also the message of @ref{b45,,ZeroDivisionError} for this
operation is updated. Patch by Donghee Na.

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port _codecs extension module to multiphase initialization
(
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port _bz2 extension module to multiphase initialization
(
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port _abc extension module to multiphase initialization
(
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).

@item 
bpo-39320@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39320}: Replace two complex bytecodes for building dicts with two
simpler ones. The new bytecodes @code{DICT_MERGE} and @code{DICT_UPDATE} have
been added The old bytecodes @code{BUILD_MAP_UNPACK} and
@code{BUILD_MAP_UNPACK_WITH_CALL} have been removed.

@item 
bpo-39219@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39219}: Syntax errors raised in the tokenizer now always set correct
“text” and “offset” attributes.

@item 
bpo-36051@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36051}: Drop the GIL during large @code{bytes.join} operations. Patch by
Bruce Merry.

@item 
bpo-38960@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38960}: Fix DTrace build issues on FreeBSD. Patch by David Carlier.

@item 
bpo-37207@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37207}: Speed up calls to @code{range()} by about 30%, by using the PEP
590 @code{vectorcall} calling convention. Patch by Mark Shannon.

@item 
bpo-36144@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36144}: @ref{184,,dict} (and @ref{1dc1,,collections.UserDict}) objects now
support PEP 584’s merge (@code{|}) and update (@code{|=}) operators. Patch by
Brandt Bucher.

@item 
bpo-32856@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32856}: Optimized the idiom for assignment a temporary variable in
comprehensions. Now @code{for y in [expr]} in comprehensions is as fast as a
simple assignment @code{y = expr}.
@end itemize

@node Library<158>,Documentation<51>,Core and Builtins<155>,Python 3 9 0 alpha 4
@anchor{whatsnew/changelog id707}@anchor{1dc2}
@subsubsection Library



@itemize -

@item 
bpo-30566@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30566}: Fix @ref{1741,,IndexError} when trying to decode an invalid string
with punycode codec.

@item 
bpo-39649@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39649}: Remove obsolete check for @code{__args__} in
@code{bdb.Bdb.format_stack_entry}.

@item 
bpo-39648@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39648}: Expanded @ref{b12,,math.gcd()} and @ref{b13,,math.lcm()} to handle
multiple arguments.

@item 
bpo-39681@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39681}: Fix a regression where the C pickle module wouldn’t allow
unpickling from a file-like object that doesn’t expose a readinto()
method.

@item 
bpo-35950@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35950}: Raise @ref{1dc3,,io.UnsupportedOperation} in
@code{io.BufferedReader.truncate()} when it is called on a read-only
@ref{141a,,io.BufferedReader} instance.

@item 
bpo-39479@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39479}: Add @ref{b13,,math.lcm()} function: least common multiple.

@item 
bpo-39674@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39674}: Revert “Do not expose abstract collection classes in the
collections module” change (bpo-25988@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25988}). Aliases to ABC like
collections.Mapping are kept in Python 3.9 to ease transition from Python
2.7, but will be removed in Python 3.10.

@item 
bpo-39104@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39104}: Fix hanging ProcessPoolExcutor on @code{shutdown(wait=False)} when
a task has failed pickling.

@item 
bpo-39627@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39627}: Fixed TypedDict totality check for inherited keys.

@item 
bpo-39474@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39474}: Fixed starting position of AST for expressions like @code{(a)(b)},
@code{(a)[b]} and @code{(a).b}.

@item 
bpo-21016@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21016}: The @ref{ba,,pydoc} and @ref{104,,trace} modules now use the
@ref{e1,,sysconfig} module to get the path to the Python standard library, to
support uncommon installation path like @code{/usr/lib64/python3.9/} on
Fedora. Patch by Jan Matějek.

@item 
bpo-39590@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39590}: Collections.deque now holds strong references during
deque.__contains__ and deque.count, fixing crashes.

@item 
bpo-39586@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39586}: The distutils @code{bdist_msi} command is deprecated in Python
3.9, use @code{bdist_wheel} (wheel packages) instead.

@item 
bpo-39595@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39595}: Improved performance of zipfile.Path for files with a large
number of entries. Also improved performance and fixed minor issue as
published with importlib_metadata 1.5@footnote{https://importlib-metadata.readthedocs.io/en/latest/history.html#v1-5-0}.

@item 
bpo-39350@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39350}: Fix regression in @ref{215,,fractions.Fraction} if the numerator
and/or the denominator is an @ref{19c,,int} subclass. The @ref{b12,,math.gcd()}
function is now used to normalize the `numerator' and `denominator'.
@code{math.gcd()} always return a @code{int} type. Previously, the GCD
type depended on `numerator' and `denominator'.

@item 
bpo-39567@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39567}: Added audit for @ref{6d1,,os.walk()}, @ref{d58,,os.fwalk()},
@ref{538,,pathlib.Path.glob()} and @ref{539,,pathlib.Path.rglob()}.

@item 
bpo-39559@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39559}: Remove unused, undocumented argument @code{getters} from
@ref{da6,,uuid.getnode()}

@item 
bpo-38149@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38149}: @ref{195f,,sys.audit()} is now called only once per call of
@ref{5a0,,glob.glob()} and @ref{a0e,,glob.iglob()}.

@item 
bpo-39546@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39546}: Fix a regression in @ref{1bf,,ArgumentParser} where
@code{allow_abbrev=False} was ignored for long options that used a prefix
character other than “-“.

@item 
bpo-39450@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39450}: Striped whitespace from docstring before returning it from
@code{unittest.case.shortDescription()}.

@item 
bpo-12915@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12915}: A new function @code{resolve_name} has been added to the
@code{pkgutil} module. This resolves a string of the form @code{'a.b.c.d'} or
@code{'a.b:c.d'} to an object. In the example, @code{a.b} is a package/module
and @code{c.d} is an object within that package/module reached via recursive
attribute access.

@item 
bpo-39353@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39353}: The @ref{942,,binascii.crc_hqx()} function is no longer deprecated.

@item 
bpo-39493@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39493}: Mark @code{typing.IO.closed} as a property

@item 
bpo-39491@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39491}: Add @ref{b3d,,typing.Annotated} and @code{include_extras} parameter
to @ref{8c2,,typing.get_type_hints()} as part of 
@geindex Python Enhancement Proposals; PEP 593
PEP 593@footnote{https://peps.python.org/pep-0593/}. Patch by Till
Varoquaux, documentation by Till Varoquaux and Konstantin Kashin.

@item 
bpo-39485@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39485}: Fix a bug in @ref{1978,,unittest.mock.create_autospec()} that would
complain about the wrong number of arguments for custom descriptors
defined in an extension module returning functions.

@item 
bpo-38932@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38932}: Mock fully resets child objects on reset_mock(). Patch by
Vegard Stikbakke

@item 
bpo-39082@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39082}: Allow AsyncMock to correctly patch static/class methods

@item 
bpo-39432@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39432}: Implement PEP-489 algorithm for non-ascii “PyInit_…” symbol
names in distutils to make it export the correct init symbol also on
Windows.

@item 
bpo-18819@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18819}: Omit @code{devmajor} and @code{devminor} fields for non-device files
in @ref{e4,,tarfile} archives, enabling bit-for-bit compatibility with GNU
@code{tar(1)}.

@item 
bpo-39349@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39349}: Added a new `cancel_futures' parameter to
@ref{af0,,concurrent.futures.Executor.shutdown()} that cancels all pending
futures which have not started running, instead of waiting for them to
complete before shutting down the executor.

@item 
bpo-39274@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39274}: @code{bool(fraction.Fraction)} now returns a boolean even if
(numerator != 0) does not return a boolean (ex: numpy number).

@item 
bpo-34793@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34793}: Remove support for @code{with (await asyncio.lock):} and @code{with
(yield from asyncio.lock):}.  The same is correct for
@code{asyncio.Condition} and @code{asyncio.Semaphore}.

@item 
bpo-25597@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25597}: Ensure, if @code{wraps} is supplied to
@ref{1095,,unittest.mock.MagicMock}, it is used to calculate return values
for the magic methods instead of using the default return values. Patch by
Karthikeyan Singaravelan.

@item 
bpo-36350@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36350}: @code{inspect.Signature.parameters} and
@code{inspect.BoundArguments.arguments} are now dicts instead of
OrderedDicts. Patch contributed by Rémi Lapeyre.

@item 
bpo-35727@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35727}: Fix sys.exit() and sys.exit(None) exit code propagation when
used in multiprocessing.Process.

@item 
bpo-32173@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32173}: * Add @code{lazycache} function to @code{__all__}. * Use
@code{dict.clear} to clear the cache. * Refactoring @code{getline} function and
@code{checkcache} function.
@end itemize

@node Documentation<51>,Tests<51>,Library<158>,Python 3 9 0 alpha 4
@anchor{whatsnew/changelog id708}@anchor{1dc4}
@subsubsection Documentation



@itemize -

@item 
bpo-17422@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17422}: The language reference now specifies restrictions on class
namespaces. Adapted from a patch by Ethan Furman.

@item 
bpo-39572@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39572}: Updated documentation of @code{total} flag of @code{TypedDict}.

@item 
bpo-39654@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39654}: In pyclbr doc, update ‘class’ to ‘module’ where appropriate and
add readmodule comment. Patch by Hakan Çelik.

@item 
bpo-39153@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39153}: Clarify refcounting semantics for the following functions: -
PyObject_SetItem - PyMapping_SetItemString - PyDict_SetItem -
PyDict_SetItemString

@item 
bpo-39392@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39392}: Explain that when filling with turtle, overlap regions may be
left unfilled.

@item 
bpo-39369@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39369}: Update mmap readline method description. The fact that the
readline method does update the file position should not be ignored since
this might give the impression for the programmer that it doesn’t update
it.

@item 
bpo-9056@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9056}: Include subsection in TOC for PDF version of docs.
@end itemize

@node Tests<51>,Build<58>,Documentation<51>,Python 3 9 0 alpha 4
@anchor{whatsnew/changelog id709}@anchor{1dc5}
@subsubsection Tests



@itemize -

@item 
bpo-38325@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38325}: Skip tests on non-BMP characters of test_winconsoleio.

@item 
bpo-39502@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39502}: Skip test_zipfile.test_add_file_after_2107() if
@ref{1705,,time.localtime()} fails with @ref{a87,,OverflowError}. It is the case on
AIX 6.1 for example.
@end itemize

@node Build<58>,Windows<50>,Tests<51>,Python 3 9 0 alpha 4
@anchor{whatsnew/changelog id710}@anchor{1dc6}
@subsubsection Build



@itemize -

@item 
bpo-39489@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39489}: Remove @code{COUNT_ALLOCS} special build.
@end itemize

@node Windows<50>,IDLE<30>,Build<58>,Python 3 9 0 alpha 4
@anchor{whatsnew/changelog id711}@anchor{1dc7}
@subsubsection Windows



@itemize -

@item 
bpo-39553@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39553}: Delete unused code related to SxS manifests.

@item 
bpo-39439@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39439}: Honor the Python path when a virtualenv is active on Windows.

@item 
bpo-39393@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39393}: Improve the error message when attempting to load a DLL with
unresolved dependencies.

@item 
bpo-38883@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38883}: @ref{1049,,home()} and @ref{1048,,expanduser()}
on Windows now prefer 
@geindex USERPROFILE
@geindex environment variable; USERPROFILE
@code{USERPROFILE} and no longer use
@geindex HOME
@geindex environment variable; HOME
@code{HOME}, which is not normally set for regular user accounts. This
makes them again behave like @ref{c0f,,os.path.expanduser()}, which was changed
to ignore 
@geindex HOME
@geindex environment variable; HOME
@code{HOME} in 3.8, see bpo-36264@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36264}.

@item 
bpo-39185@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39185}: The build.bat script has additional options for very-quiet
output (-q) and very-verbose output (-vv)
@end itemize

@node IDLE<30>,C API<52>,Windows<50>,Python 3 9 0 alpha 4
@anchor{whatsnew/changelog id712}@anchor{1dc8}
@subsubsection IDLE



@itemize -

@item 
bpo-39663@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39663}: Add tests for pyparse find_good_parse_start().

@item 
bpo-39600@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39600}: In the font configuration window, remove duplicated font names.

@item 
bpo-30780@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30780}: Add remaining configdialog tests for buttons and highlights and
keys tabs.

@item 
bpo-39388@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39388}: IDLE Settings Cancel button now cancels pending changes

@item 
bpo-38792@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38792}: Close an IDLE shell calltip if a @ref{bcb,,KeyboardInterrupt} or
shell restart occurs.  Patch by Zackery Spytz.
@end itemize

@node C API<52>,,IDLE<30>,Python 3 9 0 alpha 4
@anchor{whatsnew/changelog id713}@anchor{1dc9}
@subsubsection C API



@itemize -

@item 
bpo-35081@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35081}: Move the @code{bytes_methods.h} header file to the internal C API
as @code{pycore_bytes_methods.h}: it only contains private symbols (prefixed
by @code{_Py}), except of the @code{PyDoc_STRVAR_shared()} macro.

@item 
bpo-35081@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35081}: Move the @code{dtoa.h} header file to the internal C API as
@code{pycore_dtoa.h}: it only contains private functions (prefixed by
@code{_Py}). The @ref{92,,math} and @ref{19,,cmath} modules must now be compiled
with the @code{Py_BUILD_CORE} macro defined.

@item 
bpo-39573@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39573}: Add @ref{98b,,Py_SET_SIZE()} function to set the size of an
object.

@item 
bpo-39500@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39500}: @ref{1dca,,PyUnicode_IsIdentifier()} does not call
@ref{b80,,Py_FatalError()} anymore if the string is not ready.

@item 
bpo-39573@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39573}: Add @ref{989,,Py_SET_TYPE()} function to set the type of an
object.

@item 
bpo-39573@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39573}: Add a @ref{aae,,Py_SET_REFCNT()} function to set the reference
counter of an object.

@item 
bpo-39542@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39542}: Convert @ref{1d80,,PyType_HasFeature()}, @ref{1dcb,,PyType_Check()} and
@ref{1dcc,,PyType_CheckExact()} macros to static inline functions.

@item 
bpo-39542@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39542}: In the limited C API, @code{PyObject_INIT()} and
@code{PyObject_INIT_VAR()} are now defined as aliases to
@ref{c66,,PyObject_Init()} and @ref{1d84,,PyObject_InitVar()} to make their
implementation opaque. It avoids to leak implementation details in the
limited C API. Exclude the following functions from the limited C API:
@code{_Py_NewReference()}, @code{_Py_ForgetReference()},
@code{_PyTraceMalloc_NewReference()} and @code{_Py_GetRefTotal()}.

@item 
bpo-39542@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39542}: Exclude trashcan mechanism from the limited C API: it requires
access to PyTypeObject and PyThreadState structure fields, whereas these
structures are opaque in the limited C API.

@item 
bpo-39511@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39511}: The @ref{19d4,,PyThreadState_Clear()} function now calls the
@code{PyThreadState.on_delete} callback. Previously, that happened in
@ref{1dcd,,PyThreadState_Delete()}.

@item 
bpo-38076@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38076}: Fix to clear the interpreter state only after clearing module
globals to guarantee module state access from C Extensions during runtime
destruction

@item 
bpo-39245@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39245}: The Vectorcall API (PEP 590) was made public, adding the
functions @code{PyObject_Vectorcall}, @code{PyObject_VectorcallMethod},
@code{PyVectorcall_Function}, @code{PyObject_CallOneArg},
@code{PyObject_CallMethodNoArgs}, @code{PyObject_CallMethodOneArg},
@code{PyObject_FastCallDict}, and the flag @code{Py_TPFLAGS_HAVE_VECTORCALL}.
@end itemize

@node Python 3 9 0 alpha 3,Python 3 9 0 alpha 2,Python 3 9 0 alpha 4,Changelog
@anchor{whatsnew/changelog python-3-9-0-alpha-3}@anchor{1dce}
@subsection Python 3.9.0 alpha 3


`Release date: 2020-01-24'

@menu
* Core and Builtins: Core and Builtins<156>. 
* Library: Library<159>. 
* Documentation: Documentation<52>. 
* Build: Build<59>. 
* IDLE: IDLE<31>. 
* C API: C API<53>. 

@end menu

@node Core and Builtins<156>,Library<159>,,Python 3 9 0 alpha 3
@anchor{whatsnew/changelog id714}@anchor{1dcf}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-39427@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39427}: Document all possibilities for the @code{-X} options in the
command line help section. Patch by Pablo Galindo.

@item 
bpo-39421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39421}: Fix possible crashes when operating with the functions in the
@ref{6d,,heapq} module and custom comparison operators.

@item 
bpo-39386@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39386}: Prevent double awaiting of async iterator.

@item 
bpo-17005@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17005}: Add @code{functools.TopologicalSorter} to the
@ref{63,,functools} module to offers functionality to perform topological
sorting of graphs. Patch by Pablo Galindo, Tim Peters and Larry Hastings.

@item 
bpo-39320@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39320}: Replace four complex bytecodes for building sequences with
three simpler ones.

The following four bytecodes have been removed:


@itemize *

@item 
BUILD_LIST_UNPACK

@item 
BUILD_TUPLE_UNPACK

@item 
BUILD_SET_UNPACK

@item 
BUILD_TUPLE_UNPACK_WITH_CALL
@end itemize

The following three bytecodes have been added:


@itemize *

@item 
LIST_TO_TUPLE

@item 
LIST_EXTEND

@item 
SET_UPDATE
@end itemize

@item 
bpo-39336@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39336}: Import loaders which publish immutable module objects can now
publish immutable packages in addition to individual modules.

@item 
bpo-39322@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39322}: Added a new function @ref{aff,,gc.is_finalized()} to check if an
object has been finalized by the garbage collector. Patch by Pablo
Galindo.

@item 
bpo-39048@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39048}: Improve the displayed error message when incorrect types are
passed to @code{async with} statements by looking up the @code{__aenter__()}
special method before the @code{__aexit__()} special method when entering
an asynchronous context manager. Patch by Géry Ogam.

@item 
bpo-39235@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39235}: Fix AST end location for lone generator expression in function
call, e.g. f(i for i in a).

@item 
bpo-39209@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39209}: Correctly handle multi-line tokens in interactive mode. Patch
by Pablo Galindo.

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port _json extension module to multiphase initialization
(
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).

@item 
bpo-39216@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39216}: Fix constant folding optimization for positional only arguments
- by Anthony Sottile.

@item 
bpo-39215@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39215}: Fix @code{SystemError} when nested function has annotation on
positional-only argument - by Anthony Sottile.

@item 
bpo-39200@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39200}: Correct the error message when calling the @ref{1111,,min()} or
@ref{1112,,max()} with no arguments. Patch by Donghee Na.

@item 
bpo-39200@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39200}: Correct the error message when trying to construct
@ref{b43,,range} objects with no arguments. Patch by Pablo Galindo.

@item 
bpo-39166@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39166}: Fix incorrect line execution reporting in trace functions when
tracing the last iteration of asynchronous for loops. Patch by Pablo
Galindo.

@item 
bpo-39114@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39114}: Fix incorrect line execution reporting in trace functions when
tracing exception handlers with name binding. Patch by Pablo Galindo.

@item 
bpo-39156@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39156}: Split the COMPARE_OP bytecode instruction into four distinct
instructions.


@itemize *

@item 
COMPARE_OP for rich comparisons

@item 
IS_OP for ‘is’ and ‘is not’ tests

@item 
CONTAINS_OP for ‘in’ and ‘is not’ tests

@item 
JUMP_IF_NOT_EXC_MATCH for checking exceptions in ‘try-except’ statements.
@end itemize

This improves the clarity of the interpreter and should provide a modest
speedup.

@item 
bpo-38588@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38588}: Fix possible crashes in dict and list when calling
@ref{1dd0,,PyObject_RichCompareBool()}.

@item 
bpo-13601@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13601}: By default, @code{sys.stderr} is line-buffered now, even if
@code{stderr} is redirected to a file. You can still make @code{sys.stderr}
unbuffered by passing the @ref{1dd1,,-u} command-line option or setting the
@geindex PYTHONUNBUFFERED
@geindex environment variable; PYTHONUNBUFFERED
@ref{1dd2,,PYTHONUNBUFFERED} environment variable.

(Contributed by Jendrik Seipp in bpo-13601@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13601}.)

@item 
bpo-38610@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38610}: Fix possible crashes in several list methods by holding strong
references to list elements when calling
@ref{1dd0,,PyObject_RichCompareBool()}.

@item 
bpo-32021@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32021}: Include brotli .br encoding in mimetypes encodings_map
@end itemize

@node Library<159>,Documentation<52>,Core and Builtins<156>,Python 3 9 0 alpha 3
@anchor{whatsnew/changelog id715}@anchor{1dd3}
@subsubsection Library



@itemize -

@item 
bpo-39430@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39430}: Fixed race condition in lazy imports in @ref{e4,,tarfile}.

@item 
bpo-39413@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39413}: The @ref{25e,,os.unsetenv()} function is now also available on
Windows.

@item 
bpo-39390@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39390}: Fixed a regression with the @code{ignore} callback of
@ref{c24,,shutil.copytree()}. The argument types are now @code{str} and
@code{List[str]} again.

@item 
bpo-39395@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39395}: The @ref{25d,,os.putenv()} and @ref{25e,,os.unsetenv()} functions are now
always available.

@item 
bpo-39406@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39406}: If @code{setenv()} C function is available, @ref{25d,,os.putenv()} is
now implemented with @code{setenv()} instead of @code{putenv()}, so Python
doesn’t have to handle the environment variable memory.

@item 
bpo-39396@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39396}: Fix @code{math.nextafter(-0.0, +0.0)} on AIX 7.1.

@item 
bpo-29435@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29435}: Allow @ref{1c1e,,tarfile.is_tarfile()} to be used with file and
file-like objects, like @ref{1536,,zipfile.is_zipfile()}. Patch by William
Woodruff.

@item 
bpo-39377@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39377}: Removed @code{encoding} option from @ref{b54,,json.loads()}.  It has
been deprecated since Python 3.1.

@item 
bpo-39389@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39389}: Write accurate compression level metadata in @ref{6b,,gzip}
archives, rather than always signaling maximum compression.

@item 
bpo-39366@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39366}: The previously deprecated @code{xpath()} and @code{xgtitle()} methods
of @code{nntplib.NNTP} have been removed.

@item 
bpo-39357@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39357}: Remove the `buffering' parameter of @ref{a6c,,bz2.BZ2File}. Since
Python 3.0, it was ignored and using it was emitting
@ref{1a4,,DeprecationWarning}. Pass an open file object, to control how the
file is opened. The `compresslevel' parameter becomes keyword-only.

@item 
bpo-39353@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39353}: Deprecate binhex4 and hexbin4 standards. Deprecate the
@code{binhex} module and the following @ref{11,,binascii} functions:
@code{b2a_hqx()}, @code{a2b_hqx()},
@code{rlecode_hqx()}, @code{rledecode_hqx()},
@ref{942,,crc_hqx()}.

@item 
bpo-39351@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39351}: Remove @code{base64.encodestring()} and @code{base64.decodestring()},
aliases deprecated since Python 3.1: use @ref{b52,,base64.encodebytes()} and
@ref{b53,,base64.decodebytes()} instead.

@item 
bpo-39350@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39350}: Remove @code{fractions.gcd()} function, deprecated since Python
3.5 (bpo-22486@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22486}): use @ref{b12,,math.gcd()} instead.

@item 
bpo-39329@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39329}: @ref{b2f,,LMTP} constructor now has an optional
`timeout' parameter. Patch by Donghee Na.

@item 
bpo-39313@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39313}: Add a new @code{exec_function} option (`–exec-function' in the
CLI) to @code{RefactoringTool} for making @code{exec} a function. Patch by
Batuhan Taskaya.

@item 
bpo-39259@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39259}: @ref{afd,,FTP_TLS} and @code{FTP_TLS} now raise
a @ref{2ee,,ValueError} if the given timeout for their constructor is zero
to prevent the creation of a non-blocking socket. Patch by Donghee Na.

@item 
bpo-39259@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39259}: @ref{b2d,,SMTP} and @ref{b2e,,SMTP_SSL} now raise
a @ref{2ee,,ValueError} if the given timeout for their constructor is zero
to prevent the creation of a non-blocking socket. Patch by Donghee Na.

@item 
bpo-39310@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39310}: Add @ref{b14,,math.ulp()}: return the value of the least significant
bit of a float.

@item 
bpo-39297@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39297}: Improved performance of importlib.metadata distribution
discovery and resilients to inaccessible sys.path entries
(importlib_metadata v1.4.0).

@item 
bpo-39259@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39259}: @code{NNTP} and @code{NNTP_SSL} now raise a
@ref{2ee,,ValueError} if the given timeout for their constructor is zero to
prevent the creation of a non-blocking socket. Patch by Donghee Na.

@item 
bpo-38901@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38901}: When you specify prompt=’.’ or equivalently python -m venv
–prompt . … the basename of the current directory is used to set the
created venv’s prompt when it’s activated.

@item 
bpo-39288@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39288}: Add @ref{6c1,,math.nextafter()}: return the next floating-point
value after `x' towards `y'.

@item 
bpo-39259@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39259}: @ref{b23,,POP3} and @ref{b24,,POP3_SSL} now raise a
@ref{2ee,,ValueError} if the given timeout for their constructor is zero to
prevent the creation of a non-blocking socket. Patch by Donghee Na.

@item 
bpo-39242@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39242}: Updated the Gmane domain from news.gmane.org to news.gmane.io
which is used for examples of @code{NNTP} news reader server and
nntplib tests.

@item 
bpo-35292@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35292}: Proxy the @code{SimpleHTTPRequestHandler.guess_type} to
@code{mimetypes.guess_type} so the @code{mimetypes.init} is called lazily to
avoid unnecessary costs when @ref{76,,http.server} module is imported.

@item 
bpo-39239@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39239}: The @ref{b59,,select.epoll.unregister()} method no longer ignores
the @ref{b5a,,EBADF} error.

@item 
bpo-38907@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38907}: In http.server script, restore binding to IPv4 on Windows.

@item 
bpo-39152@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39152}: Fix ttk.Scale.configure([name]) to return configuration tuple
for name or all options.  Giovanni Lombardo contributed part of the patch.

@item 
bpo-39198@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39198}: If an exception were to be thrown in @code{Logger.isEnabledFor}
(say, by asyncio timeouts or stopit) , the @code{logging} global lock may not
be released appropriately, resulting in deadlock.  This change wraps that
block of code with @code{try...finally} to ensure the lock is released.

@item 
bpo-39191@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39191}: Perform a check for running loop before starting a new task in
@code{loop.run_until_complete()} to fail fast; it prevents the side effect of
new task spawning before exception raising.

@item 
bpo-38871@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38871}: Correctly parenthesize filter-based statements that contain
lambda expressions in @code{lib2to3}. Patch by Donghee Na.

@item 
bpo-39142@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39142}: A change was made to logging.config.dictConfig to avoid
converting instances of named tuples to ConvertingTuple. It’s assumed that
named tuples are too specialised to be treated like ordinary tuples; if a
user of named tuples requires ConvertingTuple functionality, they will
have to implement that themselves in their named tuple class.

@item 
bpo-39158@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39158}: ast.literal_eval() now supports empty sets.

@item 
bpo-39129@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39129}: Fix import path for @code{asyncio.TimeoutError}

@item 
bpo-39057@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39057}: @code{urllib.request.proxy_bypass_environment()} now ignores
leading dots and no longer ignores a trailing newline.

@item 
bpo-39056@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39056}: Fixed handling invalid warning category in the -W option.  No
longer import the re module if it is not needed.

@item 
bpo-39055@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39055}: @ref{17b1,,base64.b64decode()} with @code{validate=True} raises now a
binascii.Error if the input ends with a single @code{\n}.

@item 
bpo-21600@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21600}: Fix @code{mock.patch.stopall()} to stop active patches that were
created with @code{mock.patch.dict()}.

@item 
bpo-39019@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39019}: Implement dummy @code{__class_getitem__} for
@ref{8a4,,tempfile.SpooledTemporaryFile}.

@item 
bpo-39019@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39019}: Implement dummy @code{__class_getitem__} for @code{subprocess.Popen},
@code{subprocess.CompletedProcess}

@item 
bpo-38914@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38914}: Adjusted the wording of the warning issued by distutils’
@code{check} command when the @code{author} and @code{maintainer} fields are
supplied but no corresponding e-mail field (@code{author_email} or
@code{maintainer_email}) is found. The wording now reflects the fact that
these fields are suggested, but not required. Patch by Juergen Gmach.

@item 
bpo-38878@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38878}: Fixed __subclasshook__ of @ref{e51,,os.PathLike} to return a
correct result upon inheritance. Patch by Bar Harel.

@item 
bpo-38615@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38615}: @ref{b05,,IMAP4} and @ref{b06,,IMAP4_SSL} now
have an optional `timeout' parameter for their constructors. Also, the
@ref{b07,,open()} method now has an optional `timeout' parameter
with this change. The overridden methods of @code{IMAP4_SSL}
and @ref{b08,,IMAP4_stream} were applied to this change. Patch by
Donghee Na.

@item 
bpo-35182@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35182}: Fixed @code{Popen.communicate()} subsequent call crash when the
child process has already closed any piped standard stream, but still
continues to be running. Patch by Andriy Maletsky.

@item 
bpo-38630@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38630}: On Unix, @ref{15ea,,subprocess.Popen.send_signal()} now polls the
process status. Polling reduces the risk of sending a signal to the wrong
process if the process completed, the @ref{c89,,subprocess.Popen.returncode}
attribute is still @code{None}, and the pid has been reassigned (recycled) to
a new different process.

@item 
bpo-38536@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38536}: Removes trailing space in formatted currency with
@code{international=True} and a locale with symbol following value. E.g.
@code{locale.currency(12.34, international=True)} returned @code{'12,34 EUR '}
instead of @code{'12,34 EUR'}.

@item 
bpo-38473@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38473}: Use signature from inner mock for autospecced methods attached
with @code{unittest.mock.attach_mock()}. Patch by Karthikeyan Singaravelan.

@item 
bpo-38361@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38361}: Fixed an issue where @code{ident} could include a leading path
separator when @ref{761,,syslog.openlog()} was called without arguments.

@item 
bpo-38293@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38293}: Add @ref{758,,copy.copy()} and @ref{d6b,,copy.deepcopy()} support to
@ref{4b4,,property()} objects.

@item 
bpo-37958@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37958}: Added the pstats.Stats.get_profile_dict() method to return the
profile data as a StatsProfile instance.

@item 
bpo-28367@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28367}: Termios magic constants for the following baud rates:   -
B500000   - B576000   - B921600   - B1000000   - B1152000   - B1500000   -
B2000000   - B2500000   - B3000000   - B3500000   - B4000000 Patch by
Andrey Smirnov
@end itemize

@node Documentation<52>,Build<59>,Library<159>,Python 3 9 0 alpha 3
@anchor{whatsnew/changelog id716}@anchor{1dd4}
@subsubsection Documentation



@itemize -

@item 
bpo-39381@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39381}: Mention in docs that @ref{2f4,,asyncio.get_event_loop()} implicitly
creates new event loop only if called from the main thread.

@item 
bpo-38918@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38918}: Add an entry for @code{__module__} in the “function” & “method”
sections of the @ref{82,,inspect} docs’ @ref{1dd5,,Types and members} table.

@item 
bpo-3530@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3530}: In the @ref{9,,ast} module documentation, fix a misleading
@code{NodeTransformer} example and add advice on when to use the
@code{fix_missing_locations} function.
@end itemize

@node Build<59>,IDLE<31>,Documentation<52>,Python 3 9 0 alpha 3
@anchor{whatsnew/changelog id717}@anchor{1dd6}
@subsubsection Build



@itemize -

@item 
bpo-39395@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39395}: On non-Windows platforms, the @code{setenv()} and
@code{unsetenv()} functions are now required to build Python.

@item 
bpo-39160@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39160}: Updated the documentation in @code{./configure --help} to show
default values, reference documentation where required and add additional
explanation where needed.

@item 
bpo-39144@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39144}: The ctags and etags build targets both include Modules/_ctypes
and Python standard library source files.
@end itemize

@node IDLE<31>,C API<53>,Build<59>,Python 3 9 0 alpha 3
@anchor{whatsnew/changelog id718}@anchor{1dd7}
@subsubsection IDLE



@itemize -

@item 
bpo-39050@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39050}: Make IDLE Settings dialog Help button work again.

@item 
bpo-34118@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34118}: Tag memoryview, range, and tuple as classes, the same as list,
etcetera, in the library manual built-in functions list.

@item 
bpo-32989@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32989}: Add tests for editor newline_and_indent_event method. Remove
dead code from pyparse find_good_parse_start method.
@end itemize

@node C API<53>,,IDLE<31>,Python 3 9 0 alpha 3
@anchor{whatsnew/changelog id719}@anchor{1dd8}
@subsubsection C API



@itemize -

@item 
bpo-39372@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39372}: Clean header files of interfaces defined but with no
implementation. The public API symbols being removed are:
@code{_PyBytes_InsertThousandsGroupingLocale},
@code{_PyBytes_InsertThousandsGrouping}, @code{_Py_InitializeFromArgs},
@code{_Py_InitializeFromWideArgs}, @code{_PyFloat_Repr}, @code{_PyFloat_Digits},
@code{_PyFloat_DigitsInit}, @code{PyFrame_ExtendStack},
@code{_PyAIterWrapper_Type}, @code{PyNullImporter_Type}, @code{PyCmpWrapper_Type},
@code{PySortWrapper_Type}, @code{PyNoArgsFunction}.

@item 
bpo-39164@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39164}: Add a private @code{_PyErr_GetExcInfo()} function to retrieve
exception information of the specified Python thread state.
@end itemize

@node Python 3 9 0 alpha 2,Python 3 9 0 alpha 1,Python 3 9 0 alpha 3,Changelog
@anchor{whatsnew/changelog python-3-9-0-alpha-2}@anchor{1dd9}
@subsection Python 3.9.0 alpha 2


`Release date: 2019-12-18'

@menu
* Security: Security<45>. 
* Core and Builtins: Core and Builtins<157>. 
* Library: Library<160>. 
* Documentation: Documentation<53>. 
* Tests: Tests<52>. 
* Build: Build<60>. 
* Windows: Windows<51>. 
* macOS: macOS<41>. 
* IDLE: IDLE<32>. 
* C API: C API<54>. 

@end menu

@node Security<45>,Core and Builtins<157>,,Python 3 9 0 alpha 2
@anchor{whatsnew/changelog id720}@anchor{1dda}
@subsubsection Security



@itemize -

@item 
bpo-38945@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38945}: Newline characters have been escaped when performing uu
encoding to prevent them from overflowing into to content section of the
encoded file. This prevents malicious or accidental modification of data
during the decoding process.

@item 
bpo-37228@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37228}: Due to significant security concerns, the `reuse_address'
parameter of @ref{941,,asyncio.loop.create_datagram_endpoint()} is no longer
supported. This is because of the behavior of @code{SO_REUSEADDR} in UDP. For
more details, see the documentation for
@code{loop.create_datagram_endpoint()}. (Contributed by Kyle Stanley, Antoine
Pitrou, and Yury Selivanov in bpo-37228@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37228}.)

@item 
bpo-38804@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38804}: Fixes a ReDoS vulnerability in @ref{74,,http.cookiejar}. Patch by
Ben Caller.
@end itemize

@node Core and Builtins<157>,Library<160>,Security<45>,Python 3 9 0 alpha 2
@anchor{whatsnew/changelog id721}@anchor{1ddb}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-39028@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39028}: Slightly improve the speed of keyword argument parsing with
many kwargs by strengthening the assumption that kwargs are interned
strings.

@item 
bpo-39080@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39080}: Fix the value of `end_col_offset' for Starred Expression AST
nodes when they are among the elements in the `args' attribute of Call AST
nodes.

@item 
bpo-39031@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39031}: When parsing an “elif” node, lineno and col_offset of the node
now point to the “elif” keyword and not to its condition, making it
consistent with the “if” node. Patch by Lysandros Nikolaou.

@item 
bpo-20443@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20443}: In Python 3.9.0a1, sys.argv[0] was made an absolute path if a
filename was specified on the command line. Revert this change, since most
users expect sys.argv to be unmodified.

@item 
bpo-39008@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39008}: @ref{613,,PySys_Audit()} now requires @code{Py_ssize_t} to be used
for size arguments in the format string, regardless of whether
@code{PY_SSIZE_T_CLEAN} was defined at include time.

@item 
bpo-38673@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38673}: In REPL mode, don’t switch to PS2 if the line starts with
comment or whitespace. Based on work by Batuhan Taşkaya.

@item 
bpo-38922@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38922}: Calling @code{replace} on a code object now raises the
@code{code.__new__} audit event.

@item 
bpo-38920@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38920}: Add audit hooks for when @ref{a12,,sys.excepthook()} and
@ref{508,,sys.unraisablehook()} are invoked.

@item 
bpo-38892@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38892}: Improve documentation for audit events table and functions.

@item 
bpo-38852@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38852}: Set the thread stack size to 8 Mb for debug builds on android
platforms.

@item 
bpo-38858@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38858}: Each Python subinterpreter now has its own “small integer
singletons”: numbers in [-5; 257] range. It is no longer possible to
change the number of small integers at build time by overriding
@code{NSMALLNEGINTS} and @code{NSMALLPOSINTS} macros: macros should now be
modified manually in @code{pycore_pystate.h} header file.

@item 
bpo-36854@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36854}: The garbage collector state becomes per interpreter
(@code{PyInterpreterState.gc}), rather than being global
(@code{_PyRuntimeState.gc}).

@item 
bpo-38835@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38835}: The @code{PyFPE_START_PROTECT()} and @code{PyFPE_END_PROTECT()}
macros are empty: they have been doing nothing for the last year, so stop
using them.

@item 
bpo-38328@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38328}: Sped up the creation time of constant @ref{24f,,list} and
@ref{185,,set} displays. Patch by Brandt Bucher.

@item 
bpo-38707@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38707}: @code{MainThread.native_id} is now correctly reset in child
processes spawned using @ref{254,,multiprocessing.Process}, instead of
retaining the parent’s value.

@item 
bpo-38629@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38629}: Added @code{__floor__} and @code{__ceil__} methods to float object.
Patch by Batuhan Taşkaya.

@item 
bpo-27145@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27145}: int + int and int - int operators can now return small integer
singletons. Patch by hongweipeng.

@item 
bpo-38021@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38021}: Provide a platform tag for AIX that is sufficient for PEP425
binary distribution identification. Patch by Michael Felt.

@item 
bpo-35409@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35409}: Ignore GeneratorExit exceptions when throwing an exception into
the aclose coroutine of an asynchronous generator.

@item 
bpo-33387@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33387}: Removed WITH_CLEANUP_START, WITH_CLEANUP_FINISH, BEGIN_FINALLY,
END_FINALLY, CALL_FINALLY and POP_FINALLY bytecodes. Replaced with RERAISE
and WITH_EXCEPT_START bytecodes. The compiler now generates different code
for exceptional and non-exceptional branches for ‘with’ and ‘try-except’
statements. For ‘try-finally’ statements the ‘finally’ block is replicated
for each exit from the ‘try’ body.
@end itemize

@node Library<160>,Documentation<53>,Core and Builtins<157>,Python 3 9 0 alpha 2
@anchor{whatsnew/changelog id722}@anchor{1ddc}
@subsubsection Library



@itemize -

@item 
bpo-39033@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39033}: Fix @ref{450,,NameError} in @ref{139,,zipimport}. Patch by Karthikeyan
Singaravelan.

@item 
bpo-39022@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39022}: Update importlib.metadata to include improvements from
importlib_metadata 1.3 including better serialization of EntryPoints and
improved documentation for custom finders.

@item 
bpo-39006@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39006}: Fix asyncio when the ssl module is missing: only check for
ssl.SSLSocket instance if the ssl module is available.

@item 
bpo-38708@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38708}: Fix a potential IndexError in email parser when parsing an
empty msg-id.

@item 
bpo-38698@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38698}: Add a new @code{InvalidMessageID} token to email parser to
represent invalid Message-ID headers.  Also, add defects when there is
remaining value after parsing the header.

@item 
bpo-38994@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38994}: Implement @code{__class_getitem__} for @code{os.PathLike},
@code{pathlib.Path}.

@item 
bpo-38979@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38979}: Return class from @code{ContextVar.__class_getitem__} to simplify
subclassing.

@item 
bpo-38978@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38978}: Implement @code{__class_getitem__} on asyncio objects (Future,
Task, Queue). Patch by Batuhan Taskaya.

@item 
bpo-38916@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38916}: @ref{4bf,,array.array}: Remove @code{tostring()} and
@code{fromstring()} methods. They were aliases to @code{tobytes()} and
@code{frombytes()}, deprecated since Python 3.2.

@item 
bpo-38986@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38986}: Make repr of C accelerated TaskWakeupMethWrapper the same as of
pure Python version.

@item 
bpo-38982@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38982}: Fix asyncio @code{PidfdChildWatcher}: handle @code{waitpid()} error.
If @code{waitpid()} is called elsewhere, @code{waitpid()} call fails with
@ref{125e,,ChildProcessError}: use return code 255 in this case, and log a
warning. It ensures that the pidfd file descriptor is closed if this error
occurs.

@item 
bpo-38529@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38529}: Drop too noisy asyncio warning about deletion of a stream
without explicit @code{.close()} call.

@item 
bpo-27413@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27413}: Added ability to pass through @code{ensure_ascii} options to
json.dumps in the @code{json.tool} command-line interface.

@item 
bpo-38634@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38634}: The @ref{bf,,readline} module now detects if Python is linked to
libedit at runtime on all platforms.  Previously, the check was only done
on macOS.

@item 
bpo-33684@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33684}: Fix @code{json.tool} failed to read a JSON file with non-ASCII
characters when locale encoding is not UTF-8.

@item 
bpo-38698@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38698}: Prevent UnboundLocalError to pop up in parse_message_id.

parse_message_id() was improperly using a token defined inside an
exception handler, which was raising @code{UnboundLocalError} on parsing an
invalid value. Patch by Claudiu Popa.

@item 
bpo-38927@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38927}: Use @code{python -m pip} instead of @code{pip} to upgrade
dependencies in venv.

@item 
bpo-26730@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26730}: Fix @code{SpooledTemporaryFile.rollover()} might corrupt the file
when it is in text mode. Patch by Serhiy Storchaka.

@item 
bpo-38881@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38881}: random.choices() now raises a ValueError when all the weights
are zero.

@item 
bpo-38876@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38876}: Raise pickle.UnpicklingError when loading an item from memo for
invalid input.

The previous code was raising a @code{KeyError} for both the Python and C
implementation. This was caused by the specified index of an invalid input
which did not exist in the memo structure, where the pickle stores what
objects it has seen. The malformed input would have caused either a
@code{BINGET} or @code{LONG_BINGET} load from the memo, leading to a
@code{KeyError} as the determined index was bogus. Patch by Claudiu Popa.

@item 
bpo-38688@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38688}: Calling func:@code{shutil.copytree} to copy a directory tree from
one directory to another subdirectory resulted in an endless loop and a
RecursionError. A fix was added to consume an iterator and create the list
of the entries to be copied, avoiding the recursion for newly created
directories. Patch by Bruno P. Kinoshita.

@item 
bpo-38863@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38863}: Improve @code{is_cgi()} function in @ref{76,,http.server}, which
enables processing the case that cgi directory is a child of another
directory other than root.

@item 
bpo-37838@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37838}: @ref{8c2,,typing.get_type_hints()} properly handles functions
decorated with @ref{1163,,functools.wraps()}.

@item 
bpo-38870@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38870}: Expose @ref{ae8,,ast.unparse()} as a function of the @ref{9,,ast}
module that can be used to unparse an @ref{4c4,,ast.AST} object and produce
a string with code that would produce an equivalent @code{ast.AST}
object when parsed. Patch by Pablo Galindo and Batuhan Taskaya.

@item 
bpo-38859@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38859}: AsyncMock now returns StopAsyncIteration on the exhaustion of a
side_effects iterable. Since PEP-479 its Impossible to raise a
StopIteration exception from a coroutine.

@item 
bpo-38857@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38857}: AsyncMock fix for return values that are awaitable types.  This
also covers side_effect iterable values that happened to be awaitable, and
wraps callables that return an awaitable type. Before these awaitables
were being awaited instead of being returned as is.

@item 
bpo-38834@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38834}: @ref{330,,typing.TypedDict} subclasses now track which keys are
optional using the @code{__required_keys__} and @code{__optional_keys__}
attributes, to enable runtime validation by downstream projects.  Patch by
Zac Hatfield-Dodds.

@item 
bpo-38821@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38821}: Fix unhandled exceptions in @ref{7,,argparse} when
internationalizing error messages for arguments with @code{nargs} set to
special (non-integer) values. Patch by Federico Bond.

@item 
bpo-38820@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38820}: Make Python compatible with OpenSSL 3.0.0.
@ref{11be,,ssl.SSLSocket.getpeercert()} no longer returns IPv6 addresses with a
trailing new line.

@item 
bpo-38811@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38811}: Fix an unhandled exception in @ref{a8,,pathlib} when
@ref{12fb,,os.link()} is missing. Patch by Toke Høiland-Jørgensen.

@item 
bpo-38686@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38686}: Added support for multiple @code{qop} values in
@ref{1daf,,urllib.request.AbstractDigestAuthHandler}.

@item 
bpo-38712@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38712}: Add the Linux-specific @ref{b2b,,signal.pidfd_send_signal()}
function, which allows sending a signal to a process identified by a file
descriptor rather than a pid.

@item 
bpo-38348@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38348}: Add @code{-i} and @code{--indent} (indentation level), and
@code{--no-type-comments} (type comments) command line options to ast parsing
tool.

@item 
bpo-37523@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37523}: Change @code{zipfile.ZipExtFile} to raise @code{ValueError} when
trying to access the underlying file object after it has been closed. This
new behavior is consistent with how accessing closed files is handled in
other parts of Python.

@item 
bpo-38045@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38045}: Improve the performance of @code{enum._decompose()} in
@ref{5a,,enum}. Patch by hongweipeng.

@item 
bpo-36820@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36820}: Break cycle generated when saving an exception in socket.py,
codeop.py and dyld.py as they keep alive not only the exception but user
objects through the @code{__traceback__} attribute. Patch by Mario Corchero.

@item 
bpo-36406@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36406}: Handle namespace packages in @ref{3e,,doctest}. Patch by
Karthikeyan Singaravelan.

@item 
bpo-34776@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34776}: Fix dataclasses to support forward references in type
annotations

@item 
bpo-20928@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20928}: ElementTree supports recursive XInclude processing.  Patch by
Stefan Behnel.

@item 
bpo-29636@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29636}: Add whitespace options for formatting JSON with the
@code{json.tool} CLI. The following mutually exclusive options are now
supported: @code{--indent} for setting the indent level in spaces; @code{--tab}
for indenting with tabs; @code{--no-indent} for suppressing newlines; and
@code{--compact} for suppressing all whitespace. The default behavior remains
the same as @code{--indent=4}.
@end itemize

@node Documentation<53>,Tests<52>,Library<160>,Python 3 9 0 alpha 2
@anchor{whatsnew/changelog id723}@anchor{1ddd}
@subsubsection Documentation



@itemize -

@item 
bpo-38928@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38928}: Correct when venv’s @code{upgrade_dependencies()} and
@code{--upgrade-deps} are added.

@item 
bpo-38899@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38899}: Update documentation to state that to activate virtual
environments under fish one should use @code{source}, not @code{.} as documented
at @indicateurl{https://fishshell.com/docs/current/cmds/source.html}.

@item 
bpo-22377@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22377}: Improves documentation of the values that
@ref{1994,,datetime.datetime.strptime()} accepts for @code{%Z}. Patch by Karl
Dubost.
@end itemize

@node Tests<52>,Build<60>,Documentation<53>,Python 3 9 0 alpha 2
@anchor{whatsnew/changelog id724}@anchor{1dde}
@subsubsection Tests



@itemize -

@item 
bpo-38546@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38546}: Fix test_ressources_gced_in_workers() of
test_concurrent_futures: explicitly stop the manager to prevent leaking a
child process running in the background after the test completes.

@item 
bpo-38546@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38546}: Multiprocessing and concurrent.futures tests now stop the
resource tracker process when tests complete.

@item 
bpo-38614@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38614}: Replace hardcoded timeout constants in tests with new
@ref{ea,,test.support} constants: @ref{1ddf,,LOOPBACK_TIMEOUT},
@ref{1de0,,INTERNET_TIMEOUT},
@ref{1ca6,,SHORT_TIMEOUT} and
@ref{1de1,,LONG_TIMEOUT}. It becomes easier to adjust these four
timeout constants for all tests at once, rather than having to adjust
every single test file.

@item 
bpo-38547@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38547}: Fix test_pty: if the process is the session leader, closing the
master file descriptor raises a SIGHUP signal: simply ignore SIGHUP when
running the tests.

@item 
bpo-38992@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38992}: Fix a test for @ref{15e0,,math.fsum()} that was failing due to
constant folding.

@item 
bpo-38991@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38991}: @ref{ea,,test.support}:
@code{run_python_until_end()},
@code{assert_python_ok()} and
@code{assert_python_failure()} functions no longer strip
whitespaces from stderr. Remove @code{test.support.strip_python_stderr()}
function.

@item 
bpo-38965@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38965}: Fix test_faulthandler on GCC 10. Use the “volatile” keyword in
@code{faulthandler._stack_overflow()} to prevent tail call optimization on
any compiler, rather than relying on compiler specific pragma.

@item 
bpo-38875@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38875}: test_capi: trashcan tests now require the test “cpu” resource.

@item 
bpo-38841@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38841}: Skip asyncio test_create_datagram_endpoint_existing_sock_unix
on platforms lacking a functional bind() for named unix domain sockets.

@item 
bpo-38692@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38692}: Skip the test_posix.test_pidfd_open() test if
@code{os.pidfd_open()} fails with a @ref{f44,,PermissionError}. This situation
can happen in a Linux sandbox using a syscall whitelist which doesn’t
allow the @code{pidfd_open()} syscall yet.

@item 
bpo-38839@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38839}: Fix some unused functions in tests. Patch by Adam Johnson.

@item 
bpo-38669@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38669}: Raise @ref{199,,TypeError} when passing target as a string with
@ref{194b,,unittest.mock.patch.object()}.

@item 
bpo-37957@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37957}: test.regrtest now can receive a list of test patterns to ignore
(using the -i/–ignore argument) or a file with a list of patterns to
ignore (using the –ignore-file argument). Patch by Pablo Galindo.
@end itemize

@node Build<60>,Windows<51>,Tests<52>,Python 3 9 0 alpha 2
@anchor{whatsnew/changelog id725}@anchor{1de2}
@subsubsection Build



@itemize -

@item 
bpo-37404@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37404}: @ref{b,,asyncio} now raises @ref{199,,TypeError} when calling
incompatible methods with an @ref{aed,,ssl.SSLSocket} socket.  Patch by Ido
Michael.

@item 
bpo-36500@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36500}: Added an optional “regen” project to the Visual Studio solution
that will regenerate all grammar, tokens, and opcodes.
@end itemize

@node Windows<51>,macOS<41>,Build<60>,Python 3 9 0 alpha 2
@anchor{whatsnew/changelog id726}@anchor{1de3}
@subsubsection Windows



@itemize -

@item 
bpo-39007@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39007}: Add auditing events to functions in @ref{11d,,winreg}.

@item 
bpo-33125@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33125}: Add support for building and releasing Windows ARM64 packages.
@end itemize

@node macOS<41>,IDLE<32>,Windows<51>,Python 3 9 0 alpha 2
@anchor{whatsnew/changelog id727}@anchor{1de4}
@subsubsection macOS



@itemize -

@item 
bpo-37931@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37931}: Fixed a crash on OSX dynamic builds that occurred when
re-initializing the posix module after a Py_Finalize if the environment
had changed since the previous @code{import posix}. Patch by Benoît Hudson.
@end itemize

@node IDLE<32>,C API<54>,macOS<41>,Python 3 9 0 alpha 2
@anchor{whatsnew/changelog id728}@anchor{1de5}
@subsubsection IDLE



@itemize -

@item 
bpo-38944@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38944}: Escape key now closes IDLE completion windows.  Patch by Johnny
Najera.

@item 
bpo-38943@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38943}: Fix IDLE autocomplete windows not always appearing on some
systems. Patch by Johnny Najera.

@item 
bpo-38862@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38862}: ‘Strip Trailing Whitespace’ on the Format menu removes extra
newlines at the end of non-shell files.

@item 
bpo-38636@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38636}: Fix IDLE Format menu tab toggle and file indent width. These
functions (default shortcuts Alt-T and Alt-U) were mistakenly disabled in
3.7.5 and 3.8.0.
@end itemize

@node C API<54>,,IDLE<32>,Python 3 9 0 alpha 2
@anchor{whatsnew/changelog id729}@anchor{1de6}
@subsubsection C API



@itemize -

@item 
bpo-38896@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38896}: Remove @code{PyUnicode_ClearFreeList()} function: the Unicode free
list has been removed in Python 3.3.

@item 
bpo-37340@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37340}: Remove @code{PyMethod_ClearFreeList()} and
@code{PyCFunction_ClearFreeList()} functions: the free lists of bound method
objects have been removed.

@item 
bpo-38835@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38835}: Exclude @code{PyFPE_START_PROTECT()} and @code{PyFPE_END_PROTECT()}
macros of @code{pyfpe.h} from @code{Py_LIMITED_API} (stable API).
@end itemize

@node Python 3 9 0 alpha 1,Python 3 8 0 beta 1,Python 3 9 0 alpha 2,Changelog
@anchor{whatsnew/changelog python-3-9-0-alpha-1}@anchor{1de7}
@subsection Python 3.9.0 alpha 1


`Release date: 2019-11-19'

@menu
* Security: Security<46>. 
* Core and Builtins: Core and Builtins<158>. 
* Library: Library<161>. 
* Documentation: Documentation<54>. 
* Tests: Tests<53>. 
* Build: Build<61>. 
* Windows: Windows<52>. 
* macOS: macOS<42>. 
* IDLE: IDLE<33>. 
* Tools/Demos: Tools/Demos<33>. 
* C API: C API<55>. 

@end menu

@node Security<46>,Core and Builtins<158>,,Python 3 9 0 alpha 1
@anchor{whatsnew/changelog id730}@anchor{1de8}
@subsubsection Security



@itemize -

@item 
bpo-38722@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38722}: @ref{c3,,runpy} now uses @ref{17a5,,io.open_code()} to open code files.
Patch by Jason Killen.

@item 
bpo-38622@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38622}: Add additional audit events for the @ref{2e,,ctypes} module.

@item 
bpo-38418@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38418}: Fixes audit event for @ref{1669,,os.system()} to be named
@code{os.system}.

@item 
bpo-38243@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38243}: Escape the server title of
@ref{1de9,,xmlrpc.server.DocXMLRPCServer} when rendering the document page as
HTML. (Contributed by Donghee Na in bpo-38243@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38243}.)

@item 
bpo-38174@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38174}: Update vendorized expat library version to 2.2.8, which
resolves 
@geindex Common Vulnerabilities and Exposures; CVE 2019-15903
CVE 2019-15903@footnote{https://www.cve.org/CVERecord?id=CVE-2019-15903}.

@item 
bpo-37764@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37764}: Fixes email._header_value_parser.get_unstructured going into an
infinite loop for a specific case in which the email header does not have
trailing whitespace, and the case in which it contains an invalid encoded
word. Patch by Ashwin Ramaswami.

@item 
bpo-37461@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37461}: Fix an infinite loop when parsing specially crafted email
headers. Patch by Abhilash Raj.

@item 
bpo-37363@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37363}: Adds audit events for the range of supported run commands (see
@ref{1dea,,Command line and environment}).

@item 
bpo-37463@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37463}: ssl.match_hostname() no longer accepts IPv4 addresses with
additional text after the address and only quad-dotted notation without
trailing whitespaces. Some inet_aton() implementations ignore whitespace
and all data after whitespace, e.g. ‘127.0.0.1 whatever’.

@item 
bpo-37363@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37363}: Adds audit events for @ref{59,,ensurepip}, @ref{62,,ftplib},
@ref{68,,glob}, @ref{78,,imaplib}, @code{nntplib}, @ref{aa,,pdb}, @ref{b1,,poplib},
@ref{ca,,shutil}, @ref{cf,,smtplib}, @ref{d4,,sqlite3}, @ref{dc,,subprocess},
@code{telnetlib}, @ref{e6,,tempfile} and @ref{11c,,webbrowser}, as well as
@ref{1306,,os.listdir()}, @ref{c5a,,os.scandir()} and @ref{273,,breakpoint()}.

@item 
bpo-37364@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37364}: @ref{17a5,,io.open_code()} is now used when reading @code{.pth}
files.

@item 
bpo-34631@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34631}: Updated OpenSSL to 1.1.1c in Windows installer

@item 
bpo-34155@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34155}: Fix parsing of invalid email addresses with more than one @code{@@}
(e.g. a@@b@@c.com.) to not return the part before 2nd @code{@@} as valid email
address. Patch by maxking & jpic.
@end itemize

@node Core and Builtins<158>,Library<161>,Security<46>,Python 3 9 0 alpha 1
@anchor{whatsnew/changelog id731}@anchor{1deb}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-38631@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38631}: Replace @code{Py_FatalError()} call with a regular
@ref{246,,RuntimeError} exception in @code{float.__getformat__()}.

@item 
bpo-38639@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38639}: Optimized @ref{15c9,,math.floor()}, @ref{15ca,,math.ceil()} and
@ref{15cb,,math.trunc()} for floats.

@item 
bpo-38640@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38640}: Fixed a bug in the compiler that was causing to raise in the
presence of break statements and continue statements inside always false
while loops. Patch by Pablo Galindo.

@item 
bpo-38613@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38613}: Optimized some set operations (e.g. @code{|}, @code{^}, and @code{-}) of
@code{dict_keys}. @code{d.keys() | other} was slower than @code{set(d) | other} but
they are almost same performance for now.

@item 
bpo-28029@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28029}: @code{"".replace("", s, n)} now returns @code{s} instead of an empty
string for all non-zero @code{n}.  There are similar changes for
@ref{193,,bytes} and @ref{342,,bytearray} objects.

@item 
bpo-38535@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38535}: Fixed line numbers and column offsets for AST nodes for calls
without arguments in decorators.

@item 
bpo-38525@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38525}: Fix a segmentation fault when using reverse iterators of empty
@code{dict} objects. Patch by Donghee Na and Inada Naoki.

@item 
bpo-38465@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38465}: @ref{342,,bytearray}, @ref{4bf,,array} and
@ref{51a,,mmap} objects allow now to export more than @code{2**31}
buffers at a time.

@item 
bpo-38469@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38469}: Fixed a bug where the scope of named expressions was not being
resolved correctly in the presence of the `global' keyword. Patch by Pablo
Galindo.

@item 
bpo-38437@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38437}: Activate the @code{GC_DEBUG} macro for debug builds of the
interpreter (when @code{Py_DEBUG} is set). Patch by Pablo Galindo.

@item 
bpo-38379@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38379}: When the garbage collector makes a collection in which some
objects resurrect (they are reachable from outside the isolated cycles
after the finalizers have been executed), do not block the collection of
all objects that are still unreachable. Patch by Pablo Galindo and Tim
Peters.

@item 
bpo-38379@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38379}: When cyclic garbage collection (gc) runs finalizers that
resurrect unreachable objects, the current gc run ends, without collecting
any cyclic trash.  However, the statistics reported by @code{collect()} and
@code{get_stats()} claimed that all cyclic trash found was collected, and
that the resurrected objects were collected.   Changed the stats to report
that none were collected.

@item 
bpo-38392@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38392}: In debug mode, @ref{1710,,PyObject_GC_Track()} now calls
@code{tp_traverse()} of the object type to ensure that the object is valid:
test that objects visited by @code{tp_traverse()} are valid.

@item 
bpo-38210@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38210}: Remove unnecessary intersection and update set operation in
dictview with empty set. (Contributed by Donghee Na in bpo-38210@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38210}.)

@item 
bpo-38402@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38402}: Check the error from the system’s underlying @code{crypt} or
@code{crypt_r}.

@item 
bpo-37474@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37474}: On FreeBSD, Python no longer calls @code{fedisableexcept()} at
startup to control the floating-point control mode. The call became
useless since FreeBSD 6: it became the default mode.

@item 
bpo-38006@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38006}: Fix a bug due to the interaction of weakrefs and the cyclic
garbage collector. We must clear any weakrefs in garbage in order to
prevent their callbacks from executing and causing a crash.

@item 
bpo-38317@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38317}: Fix warnings options priority: @code{PyConfig.warnoptions} has the
highest priority, as stated in the 
@geindex Python Enhancement Proposals; PEP 587
PEP 587@footnote{https://peps.python.org/pep-0587/}.

@item 
bpo-38310@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38310}: Predict @code{BUILD_MAP_UNPACK_WITH_CALL} -> @code{CALL_FUNCTION_EX}
opcode pairs in the main interpreter loop. Patch by Brandt Bucher.

@item 
bpo-36871@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36871}: Improve error handling for the assert_has_calls and
assert_has_awaits methods of mocks. Fixed a bug where any errors
encountered while binding the expected calls to the mock’s spec were
silently swallowed, leading to misleading error output.

@item 
bpo-11410@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11410}: Better control over symbol visibility is provided through use
of the visibility attributes available in gcc >= 4.0, provided in a
uniform way across POSIX and Windows. The POSIX build files have been
updated to compile with -fvisibility=hidden, minimising exported symbols.

@item 
bpo-38219@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38219}: Optimized the @ref{184,,dict} constructor and the
@ref{1671,,update()} method for the case when the argument is a dict.

@item 
bpo-38236@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38236}: Python now dumps path configuration if it fails to import the
Python codecs of the filesystem and stdio encodings.

@item 
bpo-38013@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38013}: Allow to call @code{async_generator_athrow().throw(...)} even for
non-started async generator helper. It fixes annoying warning at the end
of @ref{2f5,,asyncio.run()} call.

@item 
bpo-38124@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38124}: Fix an off-by-one error in PyState_AddModule that could cause
out-of-bounds memory access.

@item 
bpo-38116@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38116}: The select module is now PEP-384 compliant and no longer has
static state

@item 
bpo-38113@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38113}: ast module updated to PEP-384 and all statics removed

@item 
bpo-38076@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38076}: The struct module is now PEP-384 compatible

@item 
bpo-38075@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38075}: The random module is now PEP-384 compatible

@item 
bpo-38074@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38074}: zlib module made PEP-384 compatible

@item 
bpo-38073@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38073}: Make pwd extension module PEP-384 compatible

@item 
bpo-38072@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38072}: grp module made PEP-384 compatible

@item 
bpo-38069@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38069}: Make _posixsubprocess PEP-384 compatible

@item 
bpo-38071@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38071}: Make termios extension module PEP-384 compatible

@item 
bpo-38005@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38005}: Fixed comparing and creating of InterpreterID and ChannelID.

@item 
bpo-36946@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36946}: Fix possible signed integer overflow when handling slices.
Patch by hongweipeng.

@item 
bpo-37994@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37994}: Fixed silencing arbitrary errors if an attribute lookup fails
in several sites. Only AttributeError should be silenced.

@item 
bpo-8425@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8425}: Optimize set difference_update for the case when the other set
is much larger than the base set.  (Suggested by Evgeny Kapun with code
contributed by Michele Orrù).

@item 
bpo-37966@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37966}: The implementation of @ref{c42,,is_normalized()} has
been greatly sped up on strings that aren’t normalized, by implementing
the full normalization-quick-check algorithm from the Unicode standard.

@item 
bpo-37947@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37947}: Adjust correctly the recursion level in the symtable generation
for named expressions. Patch by Pablo Galindo.

@item 
bpo-37812@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37812}: The @code{CHECK_SMALL_INT} macro used inside
@code{Object/longobject.c} has been replaced with an explicit @code{return}
at each call site.

@item 
bpo-37751@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37751}: Fix @ref{b62,,codecs.lookup()} to normalize the encoding name the
same way than @ref{a03,,encodings.normalize_encoding()}, except that
@code{codecs.lookup()} also converts the name to lower case.

@item 
bpo-37830@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37830}: Fixed compilation of @ref{180,,break} and @ref{181,,continue}
in the @ref{1b1,,finally} block when the corresponding @ref{8fa,,try}
block contains @ref{1b0,,return} with a non-constant value.

@item 
bpo-20490@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20490}: Improve import error message for partially initialized module
on circular @code{from} imports - by Anthony Sottile.

@item 
bpo-37840@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37840}: Fix handling of negative indices in
@ref{1d39,,sq_item} of @ref{342,,bytearray}. Patch by
Sergey Fedoseev.

@item 
bpo-37802@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37802}: Slightly improve performance of
@ref{1903,,PyLong_FromUnsignedLong()}, @ref{1904,,PyLong_FromUnsignedLongLong()}
and @ref{1905,,PyLong_FromSize_t()}. Patch by Sergey Fedoseev.

@item 
bpo-37409@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37409}: Ensure explicit relative imports from interactive sessions and
scripts (having no parent package) always raise ImportError, rather than
treating the current module as the package. Patch by Ben Lewis.

@item 
bpo-32912@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32912}: Reverted bpo-32912@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32912}: emitting @ref{1af,,SyntaxWarning} instead
of @ref{1a4,,DeprecationWarning} for invalid escape sequences in string and
bytes literals.

@item 
bpo-37757@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37757}: 
@geindex Python Enhancement Proposals; PEP 572
PEP 572@footnote{https://peps.python.org/pep-0572/}: As described in the PEP, assignment expressions now
raise @ref{18f,,SyntaxError} when their interaction with comprehension scoping
results in an ambiguous target scope.

The @code{TargetScopeError} subclass originally proposed by the PEP has been
removed in favour of just raising regular syntax errors for the disallowed
cases.

@item 
bpo-36279@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36279}: Fix potential use of uninitialized memory in @ref{f9c,,os.wait3()}.

@item 
bpo-36311@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36311}: Decoding bytes objects larger than 2GiB is faster and no longer
fails when a multibyte characters spans a chunk boundary.

@item 
bpo-34880@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34880}: The @ref{b66,,assert} statement now works properly if the
@ref{8ba,,AssertionError} exception is being shadowed. Patch by Zackery Spytz.

@item 
bpo-37340@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37340}: Removed object cache (@code{free_list}) for bound method objects.
Temporary bound method objects are less used than before thanks to the
@code{LOAD_METHOD} opcode and the @code{_PyObject_VectorcallMethod} C API.

@item 
bpo-37648@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37648}: Fixed minor inconsistency in @code{list.__contains__()},
@code{tuple.__contains__()} and a few other places. The collection’s item
is now always at the left and the needle is on the right of @code{==}.

@item 
bpo-37444@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37444}: Update differing exception between @code{builtins.__import__()}
and @ref{1273,,importlib.__import__()}.

@item 
bpo-37619@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37619}: When adding a wrapper descriptor from one class to a different
class (for example, setting @code{__add__ = str.__add__} on an @code{int}
subclass), an exception is correctly raised when the operator is called.

@item 
bpo-37593@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37593}: Swap the positions of the `posonlyargs' and `args' parameters
in the constructor of @code{ast.parameters} nodes.

@item 
bpo-37543@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37543}: Optimized pymalloc for non PGO build.

@item 
bpo-37537@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37537}: Compute allocated pymalloc blocks inside
_Py_GetAllocatedBlocks().  This slows down _Py_GetAllocatedBlocks() but
gives a small speedup to _PyObject_Malloc() and _PyObject_Free().

@item 
bpo-37467@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37467}: Fix @ref{a12,,sys.excepthook()} and @code{PyErr_Display()} if a
filename is a bytes string. For example, for a SyntaxError exception where
the filename attribute is a bytes string.

@item 
bpo-37433@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37433}: Fix @code{SyntaxError} indicator printing too many spaces for
multi-line strings - by Anthony Sottile.

@item 
bpo-37417@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37417}: @ref{17e3,,bytearray.extend()} now correctly handles errors that
arise during iteration. Patch by Brandt Bucher.

@item 
bpo-37414@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37414}: The undocumented @code{sys.callstats()} function has been removed.
Since Python 3.7, it was deprecated and always returned @code{None}. It
required a special build option @code{CALL_PROFILE} which was already removed
in Python 3.7.

@item 
bpo-37392@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37392}: Remove @code{sys.getcheckinterval()} and
@code{sys.setcheckinterval()} functions. They were deprecated since Python
3.2. Use @ref{b49,,sys.getswitchinterval()} and @ref{b4a,,sys.setswitchinterval()}
instead. Remove also @code{check_interval} field of the
@code{PyInterpreterState} structure.

@item 
bpo-37388@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37388}: In development mode and in debug build, `encoding' and `errors'
arguments are now checked on string encoding and decoding operations.
Examples: @ref{318,,open()}, @ref{ad8,,str.encode()} and @ref{ad9,,bytes.decode()}.

By default, for best performances, the `errors' argument is only checked
at the first encoding/decoding error, and the `encoding' argument is
sometimes ignored for empty strings.

@item 
bpo-37348@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37348}: Optimized decoding short ASCII string with UTF-8 and ascii
codecs. @code{b"foo".decode()} is about 15% faster.  Patch by Inada Naoki.

@item 
bpo-24214@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24214}: Improved support of the surrogatepass error handler in the
UTF-8 and UTF-16 incremental decoders.

@item 
bpo-37330@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37330}: @ref{318,,open()}, @ref{741,,io.open()}, @ref{317,,codecs.open()} and
@ref{945,,fileinput.FileInput} no longer accept @code{'U'} (“universal
newline”) in the file mode. This flag was deprecated since Python 3.3.

@item 
bpo-35224@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35224}: Reverse evaluation order of key: value in dict comprehensions
as proposed in PEP 572. I.e. in @code{@{k: v for ...@}}, @code{k} will be
evaluated before @code{v}.

@item 
bpo-37316@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37316}: Fix the @ref{613,,PySys_Audit()} call in @ref{51a,,mmap.mmap}.

@item 
bpo-37300@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37300}: Remove an unnecessary Py_XINCREF in classobject.c.

@item 
bpo-37269@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37269}: Fix a bug in the peephole optimizer that was not treating
correctly constant conditions with binary operators. Patch by Pablo
Galindo.

@item 
bpo-20443@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20443}: Python now gets the absolute path of the script filename
specified on the command line (ex: “python3 script.py”): the __file__
attribute of the __main__ module and sys.path[0] become an absolute path,
rather than a relative path.

@item 
bpo-37257@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37257}: Python’s small object allocator (@code{obmalloc.c}) now allows (no
more than) one empty arena to remain available for immediate reuse,
without returning it to the OS.  This prevents thrashing in simple loops
where an arena could be created and destroyed anew on each iteration.

@item 
bpo-37231@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37231}: The dispatching of type slots to special methods (for example
calling @code{__mul__} when doing @code{x * y}) has been made faster.

@item 
bpo-36974@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36974}: Implemented separate vectorcall functions for every calling
convention of builtin functions and methods. This improves performance for
calls.

@item 
bpo-37213@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37213}: Handle correctly negative line offsets in the peephole
optimizer. Patch by Pablo Galindo.

@item 
bpo-37219@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37219}: Remove erroneous optimization for empty set differences.

@item 
bpo-15913@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15913}: Implement @ref{963,,PyBuffer_SizeFromFormat()} function
(previously documented but not implemented): call @ref{1dec,,struct.calcsize()}.
Patch by Joannah Nanjekye.

@item 
bpo-36922@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36922}: Slot functions optimize any callable with
@code{Py_TPFLAGS_METHOD_DESCRIPTOR} instead of only instances of
@code{function}.

@item 
bpo-36974@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36974}: The slot @code{tp_vectorcall_offset} is inherited unconditionally
to support @code{super().__call__()} when the base class uses vectorcall.

@item 
bpo-37160@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37160}: @ref{c38,,threading.get_native_id()} now also supports NetBSD.

@item 
bpo-37077@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37077}: Add @ref{c38,,threading.get_native_id()} support for AIX. Patch by
M. Felt

@item 
bpo-36781@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36781}: @ref{696,,sum()} has been optimized for boolean values.

@item 
bpo-34556@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34556}: Add @code{--upgrade-deps} to venv module. Patch by Cooper Ry Lees

@item 
bpo-20523@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20523}: @code{pdb.Pdb} supports ~/.pdbrc in Windows 7. Patch by Tim Hopper
and Dan Lidral-Porter.

@item 
bpo-35551@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35551}: Updated encodings: - Removed the “tis260” encoding, which was
an alias for the nonexistent “tactis” codec. - Added “mac_centeuro” as an
alias for the mac_latin2 encoding.

@item 
bpo-19072@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19072}: The @ref{48f,,classmethod} decorator can now wrap other
descriptors such as property objects.  Adapted from a patch written by
Graham Dumpleton.

@item 
bpo-27575@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27575}: Improve speed of dictview intersection by directly using set
intersection logic. Patch by David Su.

@item 
bpo-30773@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30773}: Prohibit parallel running of aclose() / asend() / athrow(). Fix
ag_running to reflect the actual running status of the AG.
@end itemize

@node Library<161>,Documentation<54>,Core and Builtins<158>,Python 3 9 0 alpha 1
@anchor{whatsnew/changelog id732}@anchor{1ded}
@subsubsection Library



@itemize -

@item 
bpo-36589@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36589}: The @ref{ff1,,curses.update_lines_cols()} function now returns
@code{None} instead of @code{1} on success.

@item 
bpo-38807@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38807}: Update @ref{199,,TypeError} messages for @ref{19eb,,os.path.join()} to
include @ref{e51,,os.PathLike} objects as acceptable input types.

@item 
bpo-38724@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38724}: Add a repr for @code{subprocess.Popen} objects. Patch by Andrey
Doroschenko.

@item 
bpo-38786@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38786}: pydoc now recognizes and parses HTTPS URLs. Patch by python273.

@item 
bpo-38785@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38785}: Prevent asyncio from crashing if parent @code{__init__} is not
called from a constructor of object derived from @code{asyncio.Future}.

@item 
bpo-38723@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38723}: @ref{aa,,pdb} now uses @ref{17a5,,io.open_code()} to trigger auditing
events.

@item 
bpo-27805@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27805}: Allow opening pipes and other non-seekable files in append mode
with @ref{318,,open()}.

@item 
bpo-38438@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38438}: Simplify the @ref{7,,argparse} usage message for @code{nargs="*"}.

@item 
bpo-38761@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38761}: WeakSet is now registered as a collections.abc.MutableSet.

@item 
bpo-38716@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38716}: logging: change RotatingHandler namer and rotator to
class-level attributes. This stops __init__ from setting them to None in
the case where a subclass defines them with eponymous methods.

@item 
bpo-38713@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38713}: Add @ref{b1c,,os.P_PIDFD} constant, which may be passed to
@ref{f9f,,os.waitid()} to wait on a Linux process file descriptor.

@item 
bpo-38692@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38692}: Add @code{asyncio.PidfdChildWatcher}, a Linux-specific child
watcher implementation that polls process file descriptors.

@item 
bpo-38692@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38692}: Expose the Linux @code{pidfd_open} syscall as
@ref{6a5,,os.pidfd_open()}.

@item 
bpo-38602@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38602}: Added constants @code{F_OFD_GETLK},
@code{F_OFD_SETLK} and @code{F_OFD_SETLKW} to the
@ref{5d,,fcntl} module. Patch by Donghee Na.

@item 
bpo-38334@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38334}: Fixed seeking backward on an encrypted
@code{zipfile.ZipExtFile}.

@item 
bpo-38312@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38312}: Add @ref{af2,,curses.get_escdelay()}, @ref{af3,,curses.set_escdelay()},
@ref{af4,,curses.get_tabsize()}, and @ref{af5,,curses.set_tabsize()} functions - by
Anthony Sottile.

@item 
bpo-38586@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38586}: Now @ref{d4e,,fileConfig()} correctly sets the .name
of handlers loaded.

@item 
bpo-38565@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38565}: Add new cache_parameters() method for functools.lru_cache() to
better support pickling.

@item 
bpo-34679@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34679}: asynci.ProactorEventLoop.close() now only calls
signal.set_wakeup_fd() in the main thread.

@item 
bpo-31202@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31202}: The case the result of @code{pathlib.WindowsPath.glob()} matches
now the case of the pattern for literal parts.

@item 
bpo-36321@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36321}: Remove misspelled attribute.  The 3.8 changelog noted that this
would be removed in 3.9.

@item 
bpo-38521@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38521}: Fixed erroneous equality comparison in statistics.NormalDist().

@item 
bpo-38493@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38493}: Added @ref{b1a,,CLD_KILLED} and @ref{b1b,,CLD_STOPPED} for
@code{si_code}. Patch by Donghee Na.

@item 
bpo-38478@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38478}: Fixed a bug in @code{inspect.signature.bind()} that was causing
it to fail when handling a keyword argument with same name as
positional-only parameter. Patch by Pablo Galindo.

@item 
bpo-33604@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33604}: Fixed @code{hmac.new} and @code{hmac.HMAC} to raise TypeError instead
of ValueError when the digestmod parameter, now required in 3.8, is
omitted. Also clarified the hmac module documentation and docstrings.

@item 
bpo-38378@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38378}: Parameters `out' and `in' of @ref{d0b,,os.sendfile()} was renamed to
`out_fd' and `in_fd'.

@item 
bpo-38417@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38417}: Added support for setting the umask in the child process to the
subprocess module on POSIX systems.

@item 
bpo-38449@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38449}: Revert PR 15522, which introduces a regression in
@ref{518,,mimetypes.guess_type()} due to improper handling of filenames as
urls.

@item 
bpo-38431@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38431}: Fix @code{__repr__} method for @ref{1bf7,,dataclasses.InitVar} to
support typing objects, patch by Samuel Colvin.

@item 
bpo-38109@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38109}: Add missing @ref{11c1,,stat.S_IFDOOR}, @ref{11c2,,stat.S_IFPORT},
@ref{11c3,,stat.S_IFWHT}, @ref{1dee,,stat.S_ISDOOR()}, @ref{1def,,stat.S_ISPORT()}, and
@ref{1df0,,stat.S_ISWHT()} values to the Python implementation of @ref{d6,,stat}.

@item 
bpo-38422@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38422}: Clarify docstrings of pathlib suffix(es)

@item 
bpo-38405@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38405}: Nested subclasses of @ref{32f,,typing.NamedTuple} are now
pickleable.

@item 
bpo-38332@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38332}: Prevent @ref{5e7,,KeyError} thrown by
@code{_encoded_words.decode()} when given an encoded-word with invalid
content-type encoding from propagating all the way to
@code{email.message.get()}.

@item 
bpo-38371@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38371}: Deprecated the @code{split()} method in
@code{_tkinter.TkappType} in favour of the @code{splitlist()} method which
has more consistent and predictable behavior.

@item 
bpo-38341@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38341}: Add @ref{1df1,,smtplib.SMTPNotSupportedError} to the @ref{cf,,smtplib}
exported names.

@item 
bpo-38319@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38319}: sendfile() used in socket and shutil modules was raising
OverflowError for files >= 2GiB on 32-bit architectures.  (patch by
Giampaolo Rodola)

@item 
bpo-38242@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38242}: Revert the new asyncio Streams API

@item 
bpo-13153@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13153}: OS native encoding is now used for converting between Python
strings and Tcl objects.  This allows to display, copy and paste to
clipboard emoji and other non-BMP characters.  Converting strings from Tcl
to Python and back now never fails (except MemoryError).

@item 
bpo-38019@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38019}: Correctly handle pause/resume reading of closed asyncio unix
pipe.

@item 
bpo-38163@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38163}: Child mocks will now detect their type as either synchronous or
asynchronous, asynchronous child mocks will be AsyncMocks and synchronous
child mocks will be either MagicMock or Mock (depending on their parent
type).

@item 
bpo-38161@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38161}: Removes _AwaitEvent from AsyncMock.

@item 
bpo-38216@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38216}: Allow the rare code that wants to send invalid http requests
from the @code{http.client} library a way to do so.  The fixes for bpo-30458@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30458}
led to breakage for some projects that were relying on this ability to
test their own behavior in the face of bad requests.

@item 
bpo-28286@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28286}: Deprecate opening @ref{65c,,GzipFile} for writing
implicitly.  Always specify the `mode' argument for writing.

@item 
bpo-38108@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38108}: Any synchronous magic methods on an AsyncMock now return a
MagicMock. Any asynchronous magic methods on a MagicMock now return an
AsyncMock.

@item 
bpo-38265@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38265}: Update the `length' parameter of @ref{d5c,,os.pread()} to accept
@ref{c5b,,Py_ssize_t} instead of int.

@item 
bpo-38112@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38112}: @ref{21,,compileall} has a higher default recursion limit and new
command-line arguments for path manipulation, symlinks handling, and
multiple optimization levels.

@item 
bpo-38248@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38248}: asyncio: Fix inconsistent immediate Task cancellation

@item 
bpo-38237@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38237}: The arguments for the builtin pow function are more
descriptive. They can now also be passed in as keywords.

@item 
bpo-34002@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34002}: Improve efficiency in parts of email package by changing
while-pop to a for loop, using isdisjoint instead of set intersections.

@item 
bpo-38191@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38191}: Constructors of @ref{32f,,NamedTuple} and
@ref{330,,TypedDict} types now accept arbitrary keyword argument
names, including “cls”, “self”, “typename”, “_typename”, “fields” and
“_fields”.

@item 
bpo-38155@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38155}: Add @code{__all__} to  @ref{34,,datetime}. Patch by Tahia Khan.

@item 
bpo-38185@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38185}: Fixed case-insensitive string comparison in
@ref{1077,,sqlite3.Row} indexing.

@item 
bpo-38136@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38136}: Changes AsyncMock call count and await count to be two
different counters. Now await count only counts when a coroutine has been
awaited, not when it has been called, and vice-versa. Update the
documentation around this.

@item 
bpo-37828@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37828}: Fix default mock name in
@ref{efa,,unittest.mock.Mock.assert_called()} exceptions. Patch by Abraham
Toriz Cruz.

@item 
bpo-38175@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38175}: Fix a memory leak in comparison of @ref{1077,,sqlite3.Row}
objects.

@item 
bpo-33936@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33936}: _hashlib no longer calls obsolete OpenSSL initialization
function with OpenSSL 1.1.0+.

@item 
bpo-34706@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34706}: Preserve subclassing in inspect.Signature.from_callable.

@item 
bpo-38153@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38153}: Names of hashing algorithms from OpenSSL are now normalized to
follow Python’s naming conventions. For example OpenSSL uses sha3-512
instead of sha3_512 or blake2b512 instead of blake2b.

@item 
bpo-38115@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38115}: Fix a bug in dis.findlinestarts() where it would return invalid
bytecode offsets. Document that a code object’s co_lnotab can contain
invalid bytecode offsets.

@item 
bpo-38148@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38148}: Add slots to @ref{b,,asyncio} transport classes, which can reduce
memory usage.

@item 
bpo-38142@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38142}: The _hashlib OpenSSL wrapper extension module is now PEP-384
compliant.

@item 
bpo-9216@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9216}: hashlib constructors now support usedforsecurity flag to signal
that a hashing algorithm is not used in a security context.

@item 
bpo-36991@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36991}: Fixes a potential incorrect AttributeError exception escaping
ZipFile.extract() in some unsupported input error situations.

@item 
bpo-38134@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38134}: Remove obsolete copy of PBKDF2_HMAC_fast. All supported OpenSSL
versions contain a fast implementation.

@item 
bpo-38132@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38132}: The OpenSSL hashlib wrapper uses a simpler implementation.
Several Macros and pointless caches are gone. The hash name now comes from
OpenSSL’s EVP. The algorithm name stays the same, except it is now always
lower case.

@item 
bpo-38008@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38008}: Fix parent class check in protocols to correctly identify the
module that provides a builtin protocol, instead of assuming they all come
from the @ref{1f,,collections.abc} module

@item 
bpo-34037@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34037}: For @ref{b,,asyncio}, add a new coroutine
@code{loop.shutdown_default_executor()}. The new coroutine provides an API
to schedule an executor shutdown that waits on the threadpool to finish
closing. Also, @ref{2f5,,asyncio.run()} has been updated to utilize the new
coroutine. Patch by Kyle Stanley.

@item 
bpo-37405@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37405}: Fixed regression bug for socket.getsockname() for non-CAN_ISOTP
AF_CAN address family sockets by returning a 1-tuple instead of string.

@item 
bpo-38121@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38121}: Update parameter names on functions in importlib.metadata
matching the changes in the 0.22 release of importlib_metadata.

@item 
bpo-38110@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38110}: The os.closewalk() implementation now uses the libc fdwalk()
API on platforms where it is available.

@item 
bpo-38093@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38093}: Fixes AsyncMock so it doesn’t crash when used with
AsyncContextManagers or AsyncIterators.

@item 
bpo-37488@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37488}: Add warning to @code{datetime.utctimetuple()},
@code{datetime.utcnow()} and @code{datetime.utcfromtimestamp()} .

@item 
bpo-35640@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35640}: Allow passing a @ref{5a1,,path-like object} as @code{directory}
argument to the @ref{d3e,,http.server.SimpleHTTPRequestHandler} class. Patch
by Géry Ogam.

@item 
bpo-38086@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38086}: Update importlib.metadata with changes from importlib_metadata 0.21@footnote{https://gitlab.com/python-devs/importlib_metadata/blob/0.21/importlib_metadata/docs/changelog.rst}.

@item 
bpo-37251@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37251}: Remove @code{__code__} check in AsyncMock that incorrectly
evaluated function specs as async objects but failed to evaluate classes
with @code{__await__} but no @code{__code__} attribute defined as async objects.

@item 
bpo-38037@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38037}: Fix reference counters in the @ref{cb,,signal} module.

@item 
bpo-38066@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38066}: Hide internal asyncio.Stream methods: feed_eof(), feed_data(),
set_exception() and set_transport().

@item 
bpo-38059@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38059}: inspect.py now uses sys.exit() instead of exit()

@item 
bpo-38049@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38049}: Added command-line interface for the @ref{9,,ast} module.

@item 
bpo-37953@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37953}: In @ref{10b,,typing}, improved the @code{__hash__} and @code{__eq__}
methods for @code{ForwardReferences}.

@item 
bpo-38026@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38026}: Fixed @ref{6bd,,inspect.getattr_static()} used @code{isinstance} while
it should avoid dynamic lookup.

@item 
bpo-35923@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35923}: Update @ref{eb3,,importlib.machinery.BuiltinImporter} to use
@code{loader._ORIGIN} instead of a hardcoded value. Patch by Donghee Na.

@item 
bpo-38010@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38010}: In @code{importlib.metadata} sync with @code{importlib_metadata}
0.20, clarifying behavior of @code{files()} and fixing issue where only one
requirement was returned for @code{requires()} on @code{dist-info} packages.

@item 
bpo-38006@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38006}: weakref.WeakValueDictionary defines a local remove() function
used as callback for weak references. This function was created with a
closure. Modify the implementation to avoid the closure.

@item 
bpo-37995@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37995}: Added the `indent' option to @ref{ae7,,ast.dump()} which allows it
to produce a multiline indented output.

@item 
bpo-34410@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34410}: Fixed a crash in the @code{tee()} iterator when re-enter it.
RuntimeError is now raised in this case.

@item 
bpo-37140@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37140}: Fix a ctypes regression of Python 3.8. When a ctypes.Structure
is passed by copy to a function, ctypes internals created a temporary
object which had the side effect of calling the structure finalizer
(__del__) twice. The Python semantics requires a finalizer to be called
exactly once. Fix ctypes internals to no longer call the finalizer twice.

@item 
bpo-37587@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37587}: @code{_json.scanstring} is now up to 3x faster when there are many
backslash escaped characters in the JSON string.

@item 
bpo-37834@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37834}: Prevent shutil.rmtree exception when built on non-Windows
system without fd system call support, like older versions of macOS.

@item 
bpo-10978@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10978}: Semaphores and BoundedSemaphores can now release more than one
waiting thread at a time.

@item 
bpo-37972@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37972}: Subscripts to the @code{unittest.mock.call} objects now receive
the same chaining mechanism as any other custom attributes, so that the
following usage no longer raises a @code{TypeError}:

@code{call().foo().__getitem__('bar')}

Patch by blhsing

@item 
bpo-37965@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37965}: Fix C compiler warning caused by
distutils.ccompiler.CCompiler.has_function.

@item 
bpo-37964@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37964}: Add @code{F_GETPATH} command to @ref{5d,,fcntl}.

@item 
bpo-37960@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37960}: @code{repr()} of buffered and text streams now silences only
expected exceptions when get the value of “name” and “mode” attributes.

@item 
bpo-37961@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37961}: Add a @code{total_nframe} field to the traces collected by the
tracemalloc module. This field indicates the original number of frames
before it was truncated.

@item 
bpo-37951@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37951}: Most features of the subprocess module now work again in
subinterpreters. Only `preexec_fn' is restricted in subinterpreters.

@item 
bpo-36205@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36205}: Fix the rusage implementation of time.process_time() to
correctly report the sum of the system and user CPU time.

@item 
bpo-37950@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37950}: Fix @ref{ae7,,ast.dump()} when call with incompletely initialized
node.

@item 
bpo-34679@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34679}: Restores instantiation of Windows IOCP event loops from the
non-main thread.

@item 
bpo-36917@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36917}: Add default implementation of the
@ref{c69,,ast.NodeVisitor.visit_Constant()} method which emits a deprecation
warning and calls corresponding methods @code{visit_Num()}, @code{visit_Str()},
etc.

@item 
bpo-37798@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37798}: Update test_statistics.py to verify that the statistics module
works well for both C and Python implementations. Patch by Donghee Na

@item 
bpo-26589@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26589}: Added a new status code to the http module: 451
UNAVAILABLE_FOR_LEGAL_REASONS

@item 
bpo-37915@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37915}: Fix a segmentation fault that appeared when comparing instances
of @code{datetime.timezone} and @code{datetime.tzinfo} objects. Patch by Pablo
Galindo.

@item 
bpo-32554@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32554}: Deprecate having random.seed() call hash on arbitrary types.

@item 
bpo-9938@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9938}: Add optional keyword argument @code{exit_on_error} for
@code{ArgumentParser}.

@item 
bpo-37851@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37851}: The @ref{5c,,faulthandler} module no longer allocates its
alternative stack at Python startup. Now the stack is only allocated at
the first faulthandler usage.

@item 
bpo-32793@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32793}: Fix a duplicated debug message when
@ref{179c,,smtplib.SMTP.connect()} is called.

@item 
bpo-37885@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37885}: venv: Don’t generate unset variable warning on deactivate.

@item 
bpo-37868@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37868}: Fix dataclasses.is_dataclass when given an instance that never
raises AttributeError in __getattr__.  That is, an object that returns
something for __dataclass_fields__ even if it’s not a dataclass.

@item 
bpo-37811@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37811}: Fix @code{socket} module’s @code{socket.connect(address)} function
being unable to establish connection in case of interrupted system call.
The problem was observed on all OSes which @code{poll(2)} system call can
take only non-negative integers and -1 as a timeout value.

@item 
bpo-37863@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37863}: Optimizations for Fraction.__hash__ suggested by Tim Peters.

@item 
bpo-21131@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21131}: Fix @code{faulthandler.register(chain=True)} stack. faulthandler
now allocates a dedicated stack of @code{SIGSTKSZ*2} bytes, instead of just
@code{SIGSTKSZ} bytes. Calling the previous signal handler in faulthandler
signal handler uses more than @code{SIGSTKSZ} bytes of stack memory on some
platforms.

@item 
bpo-37798@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37798}: Add C fastpath for statistics.NormalDist.inv_cdf() Patch by
Donghee Na

@item 
bpo-37804@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37804}: Remove the deprecated method @code{threading.Thread.isAlive()}.
Patch by Donghee Na.

@item 
bpo-37819@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37819}: Add Fraction.as_integer_ratio() to match the corresponding
methods in bool, int, float, and decimal.

@item 
bpo-14465@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14465}: Add an xml.etree.ElementTree.indent() function for
pretty-printing XML trees. Contributed by Stefan Behnel.

@item 
bpo-37810@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37810}: Fix @ref{3b,,difflib} @code{?} hint in diff output when dealing with
tabs.  Patch by Anthony Sottile.

@item 
bpo-37772@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37772}: In @code{zipfile.Path}, when adding implicit dirs, ensure that
ancestral directories are added and that duplicates are excluded.

@item 
bpo-18578@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18578}: Renamed and documented @code{test.bytecode_helper} as
@code{test.support.bytecode_helper}. Patch by Joannah Nanjekye.

@item 
bpo-37785@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37785}: Fix xgettext warnings in @ref{7,,argparse}.

@item 
bpo-34488@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34488}: @code{writelines()} method of @ref{10aa,,io.BytesIO} is now
slightly faster when many small lines are passed. Patch by Sergey
Fedoseev.

@item 
bpo-37449@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37449}: @code{ensurepip} now uses @code{importlib.resources.read_binary()} to
read data instead of @code{pkgutil.get_data()}. Patch by Joannah Nanjekye.

@item 
bpo-28292@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28292}: Mark calendar.py helper functions as being private.  The
follows PEP 8 guidance to maintain the style conventions in the module and
it addresses a known case of user confusion.

@item 
bpo-18049@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18049}: Add definition of THREAD_STACK_SIZE for AIX in
Python/thread_pthread.h The default thread stacksize caused crashes with
the default recursion limit Patch by M Felt

@item 
bpo-37742@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37742}: The logging.getLogger() API now returns the root logger when
passed the name ‘root’, whereas previously it returned a non-root logger
named ‘root’. This could affect cases where user code explicitly wants a
non-root logger named ‘root’, or instantiates a logger using
logging.getLogger(__name__) in some top-level module called ‘root.py’.

@item 
bpo-37738@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37738}: Fix the implementation of curses @code{addch(str, color_pair)}:
pass the color pair to @code{setcchar()}, instead of always passing 0 as the
color pair.

@item 
bpo-37723@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37723}: Fix performance regression on regular expression parsing with
huge character sets. Patch by Yann Vaginay.

@item 
bpo-35943@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35943}: The function @ref{db2,,PyImport_GetModule()} now ensures any
module it returns is fully initialized. Patch by Joannah Nanjekye.

@item 
bpo-32178@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32178}: Fix IndexError in @ref{3f,,email} package when trying to parse
invalid address fields starting with @code{:}.

@item 
bpo-37268@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37268}: The @code{parser} module is deprecated and will be removed in
future versions of Python.

@item 
bpo-11953@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11953}: Completing WSA* error codes in @ref{d1,,socket}.

@item 
bpo-37685@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37685}: Fixed comparisons of @ref{bc9,,datetime.timedelta} and
@ref{12cb,,datetime.timezone}.

@item 
bpo-37697@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37697}: Synchronize @code{importlib.metadata} with importlib_metadata 0.19@footnote{https://gitlab.com/python-devs/importlib_metadata/-/milestones/20},
improving handling of EGG-INFO files and fixing a crash when entry point
names contained colons.

@item 
bpo-37695@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37695}: Correct @ref{12a4,,curses.unget_wch()} error message.  Patch by
Anthony Sottile.

@item 
bpo-37689@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37689}: Add @code{is_relative_to()} in @code{PurePath} to determine
whether or not one path is relative to another.

@item 
bpo-29553@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29553}: Fixed @ref{1df2,,argparse.ArgumentParser.format_usage()} for mutually
exclusive groups. Patch by Andrew Nester.

@item 
bpo-37691@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37691}: Let math.dist() accept coordinates as sequences (or iterables)
rather than just tuples.

@item 
bpo-37685@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37685}: Fixed @code{__eq__}, @code{__lt__} etc implementations in some
classes. They now return @ref{1a3,,NotImplemented} for unsupported type of
the other operand. This allows the other operand to play role (for example
the equality comparison with @ref{1df3,,ANY} will return
@code{True}).

@item 
bpo-37354@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37354}: Make Activate.ps1 Powershell script static to allow for signing
it.

@item 
bpo-37664@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37664}: Update wheels bundled with ensurepip (pip 19.2.3 and setuptools
41.2.0)

@item 
bpo-37663@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37663}: Bring consistency to venv shell activation scripts by always
using __VENV_PROMPT__.

@item 
bpo-37642@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37642}: Allowed the pure Python implementation of
@ref{12cb,,datetime.timezone} to represent sub-minute offsets close to
minimum and maximum boundaries, specifically in the ranges (23:59, 24:00)
and (-23:59, 24:00). Patch by Ngalim Siregar

@item 
bpo-36161@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36161}: In @ref{b2,,posix}, use @code{ttyname_r} instead of @code{ttyname} for
thread safety.

@item 
bpo-36324@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36324}: Make internal attributes for statistics.NormalDist() private.

@item 
bpo-37555@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37555}: Fix @code{NonCallableMock._call_matcher} returning tuple instead
of @code{_Call} object when @code{self._spec_signature} exists. Patch by
Elizabeth Uselton

@item 
bpo-29446@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29446}: Make @code{from tkinter import *} import only the expected
objects.

@item 
bpo-16970@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16970}: Adding a value error when an invalid value in passed to nargs
Patch by Robert Leenders

@item 
bpo-34443@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34443}: Exceptions from @ref{5a,,enum} now use the @code{__qualname} of the
enum class in the exception message instead of the @code{__name__}.

@item 
bpo-37491@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37491}: Fix @code{IndexError} when parsing email headers with unexpectedly
ending bare-quoted string value. Patch by Abhilash Raj.

@item 
bpo-37587@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37587}: Make json.loads faster for long strings. (Patch by Marco
Paolini)

@item 
bpo-18378@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18378}: Recognize “UTF-8” as a valid value for LC_CTYPE in
locale._parse_localename.

@item 
bpo-37579@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37579}: Return @ref{1a3,,NotImplemented} in Python implementation of
@code{__eq__} for @ref{bc9,,timedelta} and @ref{1fd,,time}
when the other object being compared is not of the same type to match C
implementation. Patch by Karthikeyan Singaravelan.

@item 
bpo-21478@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21478}: Record calls to parent when autospecced object is attached to a
mock using @code{unittest.mock.attach_mock()}. Patch by Karthikeyan
Singaravelan.

@item 
bpo-37531@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37531}: “python3 -m test -jN –timeout=TIMEOUT” now kills a worker
process if it runs longer than `TIMEOUT' seconds.

@item 
bpo-37482@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37482}: Fix serialization of display name in originator or destination
address fields with both encoded words and special chars.

@item 
bpo-36993@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36993}: Improve error reporting for corrupt zip files with bad zip64
extra data. Patch by Daniel Hillier.

@item 
bpo-37502@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37502}: pickle.loads() no longer raises TypeError when the buffers
argument is set to None

@item 
bpo-37520@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37520}: Correct behavior for zipfile.Path.parent when the path object
identifies a subdirectory.

@item 
bpo-18374@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18374}: Fix the @code{.col_offset} attribute of nested @ref{1df4,,ast.BinOp}
instances which had a too large value in some situations.

@item 
bpo-37424@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37424}: Fixes a possible hang when using a timeout on
@code{subprocess.run()} while capturing output.  If the child process spawned
its own children or otherwise connected its stdout or stderr handles with
another process, we could hang after the timeout was reached and our child
was killed when attempting to read final output from the pipes.

@item 
bpo-37421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37421}: Fix @code{multiprocessing.util.get_temp_dir()} finalizer: clear
also the ‘tempdir’ configuration of the current process, so next call to
@code{get_temp_dir()} will create a new temporary directory, rather than
reusing the removed temporary directory.

@item 
bpo-37481@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37481}: The distutils @code{bdist_wininst} command is deprecated in Python
3.8, use @code{bdist_wheel} (wheel packages) instead.

@item 
bpo-37479@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37479}: When @code{Enum.__str__} is overridden in a derived class, the
override will be used by @code{Enum.__format__} regardless of whether mixin
classes are present.

@item 
bpo-37440@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37440}: http.client now enables TLS 1.3 post-handshake authentication
for default context or if a cert_file is passed to HTTPSConnection.

@item 
bpo-37437@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37437}: Update vendorized expat version to 2.2.7.

@item 
bpo-37428@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37428}: SSLContext.post_handshake_auth = True no longer sets
SSL_VERIFY_POST_HANDSHAKE verify flag for client connections. Although the
option is documented as ignored for clients, OpenSSL implicitly enables
cert chain validation when the flag is set.

@item 
bpo-37420@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37420}: @ref{131a,,os.sched_setaffinity()} now correctly handles errors that
arise during iteration over its @code{mask} argument. Patch by Brandt Bucher.

@item 
bpo-37412@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37412}: The @ref{c88,,os.getcwdb()} function now uses the UTF-8 encoding on
Windows, rather than the ANSI code page: see 
@geindex Python Enhancement Proposals; PEP 529
PEP 529@footnote{https://peps.python.org/pep-0529/} for the rationale.
The function is no longer deprecated on Windows.

@item 
bpo-37406@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37406}: The sqlite3 module now raises TypeError, rather than
ValueError, if operation argument type is not str: execute(),
executemany() and calling a connection.

@item 
bpo-29412@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29412}: Fix IndexError in parsing a header value ending unexpectedly.
Patch by Abhilash Raj.

@item 
bpo-36546@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36546}: The `dist' argument for statistics.quantiles() is now
positional only. The current name doesn’t reflect that the argument can be
either a dataset or a distribution.  Marking the parameter as positional
avoids confusion and makes it possible to change the name later.

@item 
bpo-37394@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37394}: Fix a bug that was causing the @ref{bb,,queue} module to fail if
the accelerator module was not available. Patch by Pablo Galindo.

@item 
bpo-37376@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37376}: @ref{b3,,pprint} now has support for
@ref{4e6,,types.SimpleNamespace}. Patch by Carl Bordum Hansen.

@item 
bpo-26967@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26967}: An @ref{1bf,,ArgumentParser} with
@code{allow_abbrev=False} no longer disables grouping of short flags, such as
@code{-vv}, but only disables abbreviation of long flags as documented. Patch
by Zac Hatfield-Dodds.

@item 
bpo-37212@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37212}: @ref{1df5,,unittest.mock.call()} now preserves the order of keyword
arguments in repr output. Patch by Karthikeyan Singaravelan.

@item 
bpo-37372@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37372}: Fix error unpickling datetime.time objects from Python 2 with
seconds>=24. Patch by Justin Blanchard.

@item 
bpo-37345@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37345}: Add formal support for UDPLITE sockets. Support was present
before, but it is now easier to detect support with @code{hasattr(socket,
'IPPROTO_UDPLITE')} and there are constants defined for each of the
values needed: @code{socket.IPPROTO_UDPLITE}, @code{UDPLITE_SEND_CSCOV}, and
@code{UDPLITE_RECV_CSCOV}. Patch by Gabe Appleton.

@item 
bpo-37358@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37358}: Optimized @code{functools.partial} by using vectorcall.

@item 
bpo-37347@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37347}: @ref{5a8,,sqlite3.Connection.create_aggregate()},
@ref{5a7,,sqlite3.Connection.create_function()},
@ref{5a9,,sqlite3.Connection.set_authorizer()},
@ref{5aa,,sqlite3.Connection.set_progress_handler()}
@ref{5ab,,sqlite3.Connection.set_trace_callback()} methods lead to segfaults if
some of these methods are called twice with an equal object but not the
same. Now callbacks are stored more carefully. Patch by Aleksandr Balezin.

@item 
bpo-37163@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37163}: The `obj' argument of @ref{1ab0,,dataclasses.replace()} is
positional-only now.

@item 
bpo-37085@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37085}: Add the optional Linux SocketCAN Broadcast Manager constants,
used as flags to configure the BCM behaviour, in the socket module.  Patch
by Karl Ding.

@item 
bpo-37328@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37328}: @code{HTMLParser.unescape} is removed.  It was undocumented and
deprecated since Python 3.4.

@item 
bpo-37305@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37305}: Add .webmanifest -> application/manifest+json to list of
recognized file types and content type headers

@item 
bpo-37320@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37320}: @code{aifc.openfp()} alias to @code{aifc.open()}, @code{sunau.openfp()}
alias to @code{sunau.open()}, and @code{wave.openfp()} alias to @code{wave.open()}
have been removed. They were deprecated since Python 3.7.

@item 
bpo-37315@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37315}: Deprecated accepting floats with integral value (like @code{5.0})
in @ref{b47,,math.factorial()}.

@item 
bpo-37312@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37312}: @code{_dummy_thread} and @code{dummy_threading} modules have been
removed. These modules were deprecated since Python 3.7 which requires
threading support.

@item 
bpo-33972@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33972}: Email with single part but content-type set to @code{multipart/*}
doesn’t raise AttributeError anymore.

@item 
bpo-37280@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37280}: Use threadpool for reading from file for sendfile fallback
mode.

@item 
bpo-37279@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37279}: Fix asyncio sendfile support when sendfile sends extra data in
fallback mode.

@item 
bpo-19865@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19865}: @ref{1df6,,ctypes.create_unicode_buffer()} now also supports non-BMP
characters on platforms with 16-bit @code{wchar_t} (for example,
Windows and AIX).

@item 
bpo-37266@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37266}: In a subinterpreter, spawning a daemon thread now raises an
exception. Daemon threads were never supported in subinterpreters.
Previously, the subinterpreter finalization crashed with a Python fatal
error if a daemon thread was still running.

@item 
bpo-37210@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37210}: Allow pure Python implementation of @ref{ab,,pickle} to work even
when the C @code{_pickle} module is unavailable.

@item 
bpo-21872@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21872}: Fix @ref{8e,,lzma}: module decompresses data incompletely. When
decompressing a FORMAT_ALONE format file, and it doesn’t have the end
marker, sometimes the last one to dozens bytes can’t be output. Patch by
Ma Lin.

@item 
bpo-35922@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35922}: Fix @code{RobotFileParser.crawl_delay()} and
@code{RobotFileParser.request_rate()} to return @code{None} rather than raise
@ref{5f0,,AttributeError} when no relevant rule is defined in the robots.txt
file.  Patch by Rémi Lapeyre.

@item 
bpo-35766@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35766}: Change the format of feature_version to be a (major, minor)
tuple.

@item 
bpo-36607@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36607}: Eliminate @ref{246,,RuntimeError} raised by
@ref{b55,,asyncio.all_tasks()} if internal tasks weak set is changed by another
thread during iteration.

@item 
bpo-18748@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18748}: @code{_pyio.IOBase} destructor now does nothing if getting
the @code{closed} attribute fails to better mimic @code{_io.IOBase}
finalizer.

@item 
bpo-36402@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36402}: Fix a race condition at Python shutdown when waiting for
threads. Wait until the Python thread state of all non-daemon threads get
deleted (join all non-daemon threads), rather than just wait until
non-daemon Python threads complete.

@item 
bpo-37206@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37206}: Default values which cannot be represented as Python objects no
longer improperly represented as @code{None} in function signatures.

@item 
bpo-37111@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37111}: Added @code{encoding} and @code{errors} keyword parameters to
@code{logging.basicConfig}.

@item 
bpo-12144@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12144}: Ensure cookies with @code{expires} attribute are handled in
@code{CookieJar.make_cookies()}.

@item 
bpo-34886@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34886}: Fix an unintended ValueError from @ref{d85,,subprocess.run()} when
checking for conflicting `input' and `stdin' or `capture_output' and
`stdout' or `stderr' args when they were explicitly provided but with
@code{None} values within a passed in @code{**kwargs} dict rather than as passed
directly by name. Patch contributed by Rémi Lapeyre.

@item 
bpo-37173@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37173}: The exception message for @code{inspect.getfile()} now correctly
reports the passed class rather than the builtins module.

@item 
bpo-37178@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37178}: Give math.perm() a one argument form that means the same as
math.factorial().

@item 
bpo-37178@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37178}: For math.perm(n, k), let k default to n, giving the same result
as factorial.

@item 
bpo-37165@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37165}: Converted _collections._count_elements to use the Argument
Clinic.

@item 
bpo-34767@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34767}: Do not always create a @ref{7f5,,collections.deque} in
@ref{c6c,,asyncio.Lock}.

@item 
bpo-37158@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37158}: Speed-up statistics.fmean() by switching from a function to a
generator.

@item 
bpo-34282@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34282}: Remove @code{Enum._convert} method, deprecated in 3.8.

@item 
bpo-37150@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37150}: @code{argparse._ActionsContainer.add_argument} now throws error,
if someone accidentally pass FileType class object instead of instance of
FileType as @code{type} argument.

@item 
bpo-28724@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28724}: The socket module now has the @ref{b33,,socket.send_fds()} and
@code{socket.recv.fds()} methods. Contributed by Joannah Nanjekye, Shinya
Okano and Victor Stinner.

@item 
bpo-35621@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35621}: Support running asyncio subprocesses when execution event loop
in a thread on UNIX.

@item 
bpo-36520@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36520}: Lengthy email headers with UTF-8 characters are now properly
encoded when they are folded. Patch by Jeffrey Kintscher.

@item 
bpo-30835@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30835}: Fixed a bug in email parsing where a message with invalid bytes
in content-transfer-encoding of a multipart message can cause an
AttributeError. Patch by Andrew Donnellan.

@item 
bpo-31163@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31163}: pathlib.Path instance’s rename and replace methods now return
the new Path instance.

@item 
bpo-25068@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25068}: @ref{1df7,,urllib.request.ProxyHandler} now lowercases the keys of
the passed dictionary.

@item 
bpo-26185@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26185}: Fix @ref{1c3,,repr()} on empty @code{ZipInfo} object. Patch by
Mickaël Schoentgen.

@item 
bpo-21315@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21315}: Email headers containing RFC2047 encoded words are parsed
despite the missing whitespace, and a defect registered. Also missing
trailing whitespace after encoded words is now registered as a defect.

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: Port test_datetime to VxWorks: skip zoneinfo tests on VxWorks

@item 
bpo-35805@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35805}: Add parser for Message-ID header and add it to default
HeaderRegistry. This should prevent folding of Message-ID using RFC 2048
encoded words.

@item 
bpo-36871@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36871}: Ensure method signature is used instead of constructor
signature of a class while asserting mock object against method calls.
Patch by Karthikeyan Singaravelan.

@item 
bpo-35070@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35070}: posix.getgrouplist() now works correctly when the user belongs
to NGROUPS_MAX supplemental groups. Patch by Jeffrey Kintscher.

@item 
bpo-31783@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31783}: Fix race condition in ThreadPoolExecutor when worker threads
are created during interpreter shutdown.

@item 
bpo-36582@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36582}: Fix @code{UserString.encode()} to correctly return @code{bytes}
rather than a @code{UserString} instance.

@item 
bpo-32424@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32424}: Deprecate xml.etree.ElementTree.Element.copy() in favor of
copy.copy().

Patch by Gordon P. Hemsley

@item 
bpo-36564@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36564}: Fix infinite loop in email header folding logic that would be
triggered when an email policy’s max_line_length is not long enough to
include the required markup and any values in the message. Patch by Paul
Ganssle

@item 
bpo-36543@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36543}: Removed methods Element.getchildren(), Element.getiterator()
and ElementTree.getiterator() and the xml.etree.cElementTree module.

@item 
bpo-36409@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36409}: Remove the old plistlib API deprecated in Python 3.4

@item 
bpo-36302@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36302}: distutils sorts source file lists so that Extension .so files
build more reproducibly by default

@item 
bpo-36250@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36250}: Ignore @code{ValueError} from @code{signal} with @code{interaction} in
non-main thread.

@item 
bpo-36046@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36046}: Added @code{user}, @code{group} and @code{extra_groups} parameters to
the subprocess.Popen constructor. Patch by Patrick McLean.

@item 
bpo-32627@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32627}: Fix compile error when @code{_uuid} headers conflicting included.

@item 
bpo-35800@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35800}: Deprecate @code{smtpd.MailmanProxy} ready for future removal.

@item 
bpo-35168@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35168}: @ref{1df8,,shlex.shlex.punctuation_chars} is now a read-only
property.

@item 
bpo-8538@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8538}: Add support for boolean actions like @code{--foo} and @code{--no-foo}
to argparse. Patch contributed by Rémi Lapeyre.

@item 
bpo-20504@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20504}: Fixes a bug in @code{cgi} module when a multipart/form-data
request has no @code{Content-Length} header.

@item 
bpo-25988@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25988}: The abstract base classes in @ref{1f,,collections.abc} no longer
are exposed in the regular @ref{1e,,collections} module.

@item 
bpo-11122@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11122}: Distutils won’t check for rpmbuild in specified paths only.

@item 
bpo-34775@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34775}: Division handling of PurePath now returns NotImplemented
instead of raising a TypeError when passed something other than an
instance of str or PurePath. Patch by Roger Aiudi.

@item 
bpo-34749@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34749}: @ref{17b0,,binascii.a2b_base64()} is now up to 2 times faster. Patch
by Sergey Fedoseev.

@item 
bpo-34519@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34519}: Add additional aliases for HP Roman 8. Patch by Michael Osipov.

@item 
bpo-28009@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28009}: Fix uuid.getnode() on platforms with ‘.’ as MAC Addr delimiter
as well fix for MAC Addr format that omits a leading 0 in MAC Addr values.
Currently, AIX is the only know platform with these settings. Patch by
Michael Felt.

@item 
bpo-30618@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30618}: Add @ref{b1f,,readlink()}. Patch by Girts Folkmanis.

@item 
bpo-32498@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32498}: Made @ref{1b3f,,urllib.parse.unquote()} accept bytes in addition to
strings. Patch by Stein Karlsen.

@item 
bpo-33348@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33348}: lib2to3 now recognizes expressions after @code{*} and @code{**} like
in @code{f(*[] or [])}.

@item 
bpo-32689@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32689}: Update @ref{c57,,shutil.move()} function to allow for Path objects
to be used as source argument. Patch by Emily Morehouse and Maxwell
“5.13b” McKinnon.

@item 
bpo-32820@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32820}: Added @code{__format__} to IPv4 and IPv6 classes.  Always outputs
a fully zero-padded string. Supports b/x/n modifiers (bin/hex/native
format). Native format for IPv4 is bin, native format for IPv6 is hex.
Also supports ‘#’ and ‘_’ modifiers.

@item 
bpo-27657@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27657}: Fix urllib.parse.urlparse() with numeric paths. A string like
“path:80” is no longer parsed as a path but as a scheme (“path”) and a
path (“80”).

@item 
bpo-4963@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4963}: Fixed non-deterministic behavior related to mimetypes extension
mapping and module reinitialization.
@end itemize

@node Documentation<54>,Tests<53>,Library<161>,Python 3 9 0 alpha 1
@anchor{whatsnew/changelog id733}@anchor{1df9}
@subsubsection Documentation



@itemize -

@item 
bpo-21767@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21767}: Explicitly mention abc support in functools.singledispatch

@item 
bpo-38816@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38816}: Provides more details about the interaction between
@code{fork()} and CPython’s runtime, focusing just on the C-API.  This
includes cautions about where @code{fork()} should and shouldn’t be
called.

@item 
bpo-38351@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38351}: Modernize @ref{3f,,email} examples from %-formatting to f-strings.

@item 
bpo-38778@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38778}: Document the fact that @ref{246,,RuntimeError} is raised if
@ref{4b6,,os.fork()} is called in a subinterpreter.

@item 
bpo-38592@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38592}: Add Brazilian Portuguese to the language switcher at Python
Documentation website.

@item 
bpo-38294@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38294}: Add list of no-longer-escaped chars to re.escape documentation

@item 
bpo-38053@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38053}: Modernized the plistlib documentation

@item 
bpo-26868@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26868}: Fix example usage of @ref{60b,,PyModule_AddObject()} to properly
handle errors.

@item 
bpo-36797@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36797}: Fix a dead link in the distutils API Reference.

@item 
bpo-37977@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37977}: Warn more strongly and clearly about pickle insecurity

@item 
bpo-37979@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37979}: Added a link to dateutil.parser.isoparse in the
datetime.fromisoformat documentation. Patch by Paul Ganssle

@item 
bpo-12707@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12707}: Deprecate info(), geturl(), getcode() methods in favor of the
headers, url, and status properties, respectively, for HTTPResponse and
addinfourl. Also deprecate the code attribute of addinfourl in favor of
the status attribute. Patch by Ashwin Ramaswami

@item 
bpo-37937@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37937}: Mention @code{frame.f_trace} in @ref{2e3,,sys.settrace()} docs.

@item 
bpo-37878@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37878}: Make @ref{1dfa,,PyThreadState_DeleteCurrent()} Internal.

@item 
bpo-37759@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37759}: Beginning edits to Whatsnew 3.8

@item 
bpo-37726@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37726}: Stop recommending getopt in the tutorial for command line
argument parsing and promote argparse.

@item 
bpo-32910@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32910}: Remove implementation-specific behaviour of how venv’s
Deactivate works.

@item 
bpo-37256@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37256}: Fix wording of arguments for @code{Request} in
@ref{112,,urllib.request}

@item 
bpo-37284@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37284}: Add a brief note to indicate that any new
@code{sys.implementation} required attributes must go through the PEP
process.

@item 
bpo-30088@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30088}: Documented that @ref{65e,,mailbox.Maildir} constructor doesn’t
attempt to verify the maildir folder layout correctness. Patch by
Sviatoslav Sydorenko.

@item 
bpo-37521@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37521}: Fix @code{importlib} examples to insert any newly created modules
via importlib.util.module_from_spec() immediately into sys.modules instead
of after calling loader.exec_module().

Thanks to Benjamin Mintz for finding the bug.

@item 
bpo-37456@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37456}: Slash (‘/’) is now part of syntax.

@item 
bpo-37487@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37487}: Fix PyList_GetItem index description to include 0.

@item 
bpo-37149@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37149}: Replace the dead link to the Tkinter 8.5 reference by John
Shipman, New Mexico Tech, with a link to the archive.org copy.

@item 
bpo-37478@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37478}: Added possible exceptions to the description of os.chdir().

@item 
bpo-34903@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34903}: Documented that in @ref{1994,,datetime.datetime.strptime()}, the
leading zero in some two-digit formats is optional. Patch by Mike Gleen.

@item 
bpo-36260@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36260}: Add decompression pitfalls to zipfile module documentation.

@item 
bpo-37004@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37004}: In the documentation for difflib, a note was added explicitly
warning that the results of SequenceMatcher’s ratio method may depend on
the order of the input strings.

@item 
bpo-36960@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36960}: Restructured the @ref{34,,datetime} docs in the interest of making
them more user-friendly and improving readability. Patch by Brad Solomon.

@item 
bpo-36487@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36487}: Make C-API docs clear about what the “main” interpreter is.

@item 
bpo-23460@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23460}: The documentation for decimal string formatting using the
@code{:g} specifier has been updated to reflect the correct exponential
notation cutoff point. Original patch contributed by Tuomas Suutari.

@item 
bpo-35803@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35803}: Document and test that @code{tempfile} functions may accept a
@ref{5a1,,path-like object} for the @code{dir} argument.  Patch by Anthony
Sottile.

@item 
bpo-33944@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33944}: Added a note about the intended use of code in .pth files.

@item 
bpo-34293@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34293}: Fix the Doc/Makefile regarding PAPER environment variable and
PDF builds

@item 
bpo-25237@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25237}: Add documentation for tkinter modules
@end itemize

@node Tests<53>,Build<61>,Documentation<54>,Python 3 9 0 alpha 1
@anchor{whatsnew/changelog id734}@anchor{1dfb}
@subsubsection Tests



@itemize -

@item 
bpo-38614@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38614}: Fix test_communicate() of test_asyncio.test_subprocess: use
@code{support.LONG_TIMEOUT} (5 minutes), instead of just 1 minute.

@item 
bpo-38614@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38614}: Add timeout constants to @ref{ea,,test.support}:
@ref{1ddf,,LOOPBACK_TIMEOUT},
@ref{1de0,,INTERNET_TIMEOUT},
@ref{1ca6,,SHORT_TIMEOUT} and
@ref{1de1,,LONG_TIMEOUT}.

@item 
bpo-38502@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38502}: test.regrtest now uses process groups in the multiprocessing
mode (-jN command line option) if process groups are available: if
@ref{1dfc,,os.setsid()} and @ref{1dfd,,os.killpg()} functions are available.

@item 
bpo-35998@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35998}: Fix a race condition in test_asyncio.test_start_tls_server_1().
Previously, there was a race condition between the test main() function
which replaces the protocol and the test ServerProto protocol which sends
ANSWER once it gets HELLO. Now, only the test main() function is
responsible to send data, ServerProto no longer sends data.

@item 
bpo-38470@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38470}: Fix @code{test_compileall.test_compile_dir_maxlevels()} on Windows
without long path support: only create 3 subdirectories instead of between
20 and 100 subdirectories.

@item 
bpo-37531@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37531}: On timeout, regrtest no longer attempts to call
@code{popen.communicate()} again: it can hang until all child processes using
stdout and stderr pipes completes. Kill the worker process and ignores its
output. Change also the faulthandler timeout of the main process from 1
minute to 5 minutes, for Python slowest buildbots.

@item 
bpo-38239@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38239}: Fix test_gdb for Link Time Optimization (LTO) builds.

@item 
bpo-38275@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38275}: test_ssl now handles disabled TLS/SSL versions better.
OpenSSL’s crypto policy and run-time settings are recognized and tests for
disabled versions are skipped. Tests also accept more TLS minimum_versions
for platforms that override OpenSSL’s default with strict settings.

@item 
bpo-38271@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38271}: The private keys for test_ssl were encrypted with 3DES in
traditional PKCS#5 format. 3DES and the digest algorithm of PKCS#5 are
blocked by some strict crypto policies. Use PKCS#8 format with AES256
encryption instead.

@item 
bpo-38270@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38270}: test.support now has a helper function to check for
availability of a hash digest function. Several tests are refactored avoid
MD5 and use SHA256 instead. Other tests are marked to use MD5 and skipped
when MD5 is disabled.

@item 
bpo-37123@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37123}: Multiprocessing test test_mymanager() now also expects
-SIGTERM, not only exitcode 0. BaseManager._finalize_manager() sends
SIGTERM to the manager process if it takes longer than 1 second to stop,
which happens on slow buildbots.

@item 
bpo-38212@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38212}: Multiprocessing tests: increase
test_queue_feeder_donot_stop_onexc() timeout from 1 to 60 seconds.

@item 
bpo-38117@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38117}: Test with OpenSSL 1.1.1d

@item 
bpo-38018@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38018}: Increase code coverage for multiprocessing.shared_memory.

@item 
bpo-37805@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37805}: Add tests for json.dump(…, skipkeys=True). Patch by Donghee
Na.

@item 
bpo-37531@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37531}: Enhance regrtest multiprocess timeout: write a message when
killing a worker process, catch popen.kill() and popen.wait() exceptions,
put a timeout on the second call to popen.communicate().

@item 
bpo-37876@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37876}: Add tests for ROT-13 codec.

@item 
bpo-36833@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36833}: Added tests for @code{PyDateTime_@var{xxx}_GET_@var{xxx}()} macros of
the C API of the @ref{34,,datetime} module. Patch by Joannah Nanjekye.

@item 
bpo-37558@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37558}: Fix test_shared_memory_cleaned_after_process_termination name
handling

@item 
bpo-37526@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37526}: Add @code{test.support.catch_threading_exception()}: context
manager catching @ref{177,,threading.Thread} exception using
@ref{a51,,threading.excepthook()}.

@item 
bpo-37421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37421}: test_concurrent_futures now explicitly stops the ForkServer
instance if it’s running.

@item 
bpo-37421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37421}: multiprocessing tests now stop the ForkServer instance if it’s
running: close the “alive” file descriptor to ask the server to stop and
then remove its UNIX address.

@item 
bpo-37421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37421}: test_distutils.test_build_ext() is now able to remove the
temporary directory on Windows: don’t import the newly built C extension
(“xx”) in the current process, but test it in a separated process.

@item 
bpo-37421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37421}: test_concurrent_futures now cleans up multiprocessing to remove
immediately temporary directories created by
multiprocessing.util.get_temp_dir().

@item 
bpo-37421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37421}: test_winconsoleio doesn’t leak a temporary file anymore: use
tempfile.TemporaryFile() to remove it when the test completes.

@item 
bpo-37421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37421}: multiprocessing tests now explicitly call @code{_run_finalizers()}
to immediately remove temporary directories created by tests.

@item 
bpo-37421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37421}: urllib.request tests now call
@ref{1dfe,,urlcleanup()} to remove temporary files created by
@code{urlretrieve()} tests and to clear the @code{_opener} global variable set
by @code{urlopen()} and functions calling indirectly @code{urlopen()}.

@item 
bpo-37472@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37472}: Remove @code{Lib/test/outstanding_bugs.py}.

@item 
bpo-37199@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37199}: Fix test failures when IPv6 is unavailable or disabled.

@item 
bpo-19696@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19696}: Replace deprecated method “random.choose” with “random.choice”
in “test_pkg_import.py”.

@item 
bpo-37335@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37335}: Remove no longer necessary code from c locale coercion tests

@item 
bpo-37421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37421}: Fix test_shutil to no longer leak temporary files.

@item 
bpo-37411@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37411}: Fix test_wsgiref.testEnviron() to no longer depend on the
environment variables (don’t fail if “X” variable is set).

@item 
bpo-37400@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37400}: Fix test_os.test_chown(): use os.getgroups() rather than
grp.getgrall() to get groups. Rename also the test to test_chown_gid().

@item 
bpo-37359@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37359}: Add –cleanup option to python3 -m test to remove
@code{test_python_*} directories of previous failed jobs. Add “make
cleantest” to run @code{python3 -m test --cleanup}.

@item 
bpo-37362@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37362}: test_gdb no longer fails if it gets an “unexpected” message on
stderr: it now ignores stderr. The purpose of test_gdb is to test that
python-gdb.py commands work as expected, not to test gdb.

@item 
bpo-35998@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35998}: Avoid TimeoutError in test_asyncio: test_start_tls_server_1()

@item 
bpo-37278@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37278}: Fix test_asyncio ProactorLoopCtrlC: join the thread to prevent
leaking a running thread and leaking a reference.

@item 
bpo-37261@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37261}: Fix @ref{1dff,,test.support.catch_unraisable_exception()}: its
__exit__() method now ignores unraisable exception raised when clearing
its @code{unraisable} attribute.

@item 
bpo-37069@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37069}: regrtest now uses @ref{508,,sys.unraisablehook()} to mark a test as
“environment altered” (ENV_CHANGED) if it emits an “unraisable exception”.
Moreover, regrtest logs a warning in this case.

Use @code{python3 -m test --fail-env-changed} to catch unraisable exceptions
in tests.

@item 
bpo-37252@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37252}: Fix assertions in @code{test_close} and
@code{test_events_mask_overflow} devpoll tests.

@item 
bpo-37169@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37169}: Rewrite @code{_PyObject_IsFreed()} unit tests.

@item 
bpo-37153@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37153}: @code{test_venv.test_multiprocessing()} now explicitly calls
@code{pool.terminate()} to wait until the pool completes.

@item 
bpo-34001@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34001}: Make test_ssl pass with LibreSSL. LibreSSL handles minimum and
maximum TLS version differently than OpenSSL.

@item 
bpo-36919@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36919}: Make @code{test_source_encoding.test_issue2301} implementation
independent. The test will work now for both CPython and IronPython.

@item 
bpo-30202@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30202}: Update @code{test.test_importlib.test_abc} to test
@code{find_spec()}.

@item 
bpo-28009@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28009}: Modify the test_uuid logic to test when a program is available
AND can be used to obtain a MACADDR as basis for an UUID. Patch by M. Felt

@item 
bpo-34596@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34596}: Fallback to a default reason when @ref{1e00,,unittest.skip()} is
uncalled. Patch by Naitree Zhu.
@end itemize

@node Build<61>,Windows<52>,Tests<53>,Python 3 9 0 alpha 1
@anchor{whatsnew/changelog id735}@anchor{1e01}
@subsubsection Build



@itemize -

@item 
bpo-38809@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38809}: On Windows, build scripts will now recognize and use python.exe
from an active virtual env.

@item 
bpo-38684@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38684}: Fix _hashlib build when Blake2 is disabled, but OpenSSL
supports it.

@item 
bpo-38468@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38468}: Misc/python-config.in now uses @code{getvar()} for all still
existing @code{sysconfig.get_config_var()} calls. Patch by Joannah Nanjekye.

@item 
bpo-37415@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37415}: Fix stdatomic.h header check for ICC compiler: the ICC
implementation lacks atomic_uintptr_t type which is needed by Python.

@item 
bpo-38301@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38301}: In Solaris family, we must be sure to use @code{-D_REENTRANT}.
Patch by Jesús Cea Avión.

@item 
bpo-36002@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36002}: Locate @code{llvm-profdata} and @code{llvm-ar} binaries using
@code{AC_PATH_TOOL} rather than @code{AC_PATH_TARGET_TOOL}.

@item 
bpo-37936@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37936}: The @code{.gitignore} file systematically keeps “rooted”, with
a non-trailing slash, all the rules that are meant to apply to files in a
specific place in the repo.  Previously, when the intended file to ignore
happened to be at the root of the repo, we’d most often accidentally also
ignore files and directories with the same name anywhere in the tree.

@item 
bpo-37760@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37760}: The @code{Tools/unicode/makeunicodedata.py} script, which is
used for converting information from the Unicode Character Database into
generated code and data used by the methods of @ref{16a,,str} and by the
@ref{10c,,unicodedata} module, now handles each character’s data as a
@code{dataclass} with named attributes, rather than a length-18 list of
different fields.

@item 
bpo-37936@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37936}: The @code{.gitignore} file no longer applies to any files that
are in fact tracked in the Git repository.  Patch by Greg Price.

@item 
bpo-37725@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37725}: Change “clean” makefile target to also clean the program guided
optimization (PGO) data.  Previously you would have to use “make clean”
and “make profile-removal”, or “make clobber”.

@item 
bpo-37707@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37707}: Mark some individual tests to skip when –pgo is used.  The
tests marked increase the PGO task time significantly and likely don’t
help improve optimization of the final executable.

@item 
bpo-36044@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36044}: Reduce the number of unit tests run for the PGO generation
task.  This speeds up the task by a factor of about 15x.  Running the full
unit test suite is slow.  This change may result in a slightly less
optimized build since not as many code branches will be executed.  If you
are willing to wait for the much slower build, the old behavior can be
restored using ‘./configure [..] PROFILE_TASK=”-m test –pgo-extended”’.
We make no guarantees as to which PGO task set produces a faster build.
Users who care should run their own relevant benchmarks as results can
depend on the environment, workload, and compiler tool chain.

@item 
bpo-37468@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37468}: @code{make install} no longer installs @code{wininst-*.exe} files
used by distutils bdist_wininst: bdist_wininst only works on Windows.

@item 
bpo-37189@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37189}: Many @code{PyRun_@var{XXX}()} functions like
@ref{1e02,,PyRun_String()} were no longer exported in @code{libpython38.dll} by
mistake. Export them again to fix the ABI compatibility.

@item 
bpo-25361@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25361}: Enables use of SSE2 instructions in Windows 32-bit build.

@item 
bpo-36210@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36210}: Update optional extension module detection for AIX. ossaudiodev
and spwd are not applicable for AIX, and are no longer reported as
missing. 3rd-party packaging of ncurses (with ASIS support) conflicts with
officially supported AIX curses library, so configure AIX to use
libcurses.a. However, skip trying to build _curses_panel.

patch by M Felt
@end itemize

@node Windows<52>,macOS<42>,Build<61>,Python 3 9 0 alpha 1
@anchor{whatsnew/changelog id736}@anchor{1e03}
@subsubsection Windows



@itemize -

@item 
bpo-38589@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38589}: Fixes HTML Help shortcut when Windows is not installed to C
drive

@item 
bpo-38453@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38453}: Ensure ntpath.realpath() correctly resolves relative paths.

@item 
bpo-38519@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38519}: Restores the internal C headers that were missing from the
nuget.org and Microsoft Store packages.

@item 
bpo-38492@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38492}: Remove @code{pythonw.exe} dependency on the Microsoft C++ runtime.

@item 
bpo-38344@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38344}: Fix error message in activate.bat

@item 
bpo-38359@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38359}: Ensures @code{pyw.exe} launcher reads correct registry key.

@item 
bpo-38355@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38355}: Fixes @code{ntpath.realpath} failing on @code{sys.executable}.

@item 
bpo-38117@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38117}: Update bundled OpenSSL to 1.1.1d

@item 
bpo-38092@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38092}: Reduce overhead when using multiprocessing in a Windows virtual
environment.

@item 
bpo-38133@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38133}: Allow py.exe launcher to locate installations from the
Microsoft Store and improve display of active virtual environments.

@item 
bpo-38114@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38114}: The @code{pip.ini} is no longer included in the Nuget package.

@item 
bpo-32592@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32592}: Set Windows 8 as the minimum required version for API support

@item 
bpo-36634@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36634}: @ref{4dc,,os.cpu_count()} now returns active processors rather than
maximum processors.

@item 
bpo-36634@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36634}: venv activate.bat now works when the existing variables contain
double quote characters.

@item 
bpo-38081@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38081}: Prevent error calling @ref{264,,os.path.realpath()} on @code{'NUL'}.

@item 
bpo-38087@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38087}: Fix case sensitivity in test_pathlib and test_ntpath.

@item 
bpo-38088@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38088}: Fixes distutils not finding vcruntime140.dll with only the v142
toolset installed.

@item 
bpo-37283@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37283}: Ensure command-line and unattend.xml setting override
previously detected states in Windows installer.

@item 
bpo-38030@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38030}: Fixes @ref{26f,,os.stat()} failing for block devices on Windows

@item 
bpo-38020@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38020}: Fixes potential crash when calling @ref{b20,,os.readlink()} (or
indirectly through @ref{264,,realpath()}) on a file that is not a
supported link.

@item 
bpo-37705@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37705}: Improve the implementation of @code{winerror_to_errno()}.

@item 
bpo-37549@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37549}: @ref{1e04,,os.dup()} no longer fails for standard streams on Windows
7.

@item 
bpo-1311@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1311}: The @code{nul} file on Windows now returns True from
@ref{c09,,exists()} and a valid result from @ref{26f,,os.stat()} with
@code{S_IFCHR} set.

@item 
bpo-9949@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9949}: Enable support for following symlinks in @code{os.realpath()}.

@item 
bpo-37834@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37834}: Treat all name surrogate reparse points on Windows in
@ref{6c9,,os.lstat()} and other reparse points as regular files in
@ref{26f,,os.stat()}.

@item 
bpo-36266@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36266}: Add the module name in the formatted error message when DLL
load fail happens during module import in
@code{_PyImport_FindSharedFuncptrWindows()}. Patch by Srinivas Nyayapati.

@item 
bpo-25172@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25172}: Trying to import the @code{crypt} module on Windows will
result in an @ref{65b,,ImportError} with a message explaining that the module
isn’t supported on Windows. On other platforms, if the underlying
@code{_crypt} module is not available, the ImportError will include a message
explaining the problem.

@item 
bpo-37778@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37778}: Fixes the icons used for file associations to the Microsoft
Store package.

@item 
bpo-37734@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37734}: Fix use of registry values to launch Python from Microsoft
Store app.

@item 
bpo-37702@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37702}: Fix memory leak on Windows in creating an SSLContext object or
running @code{urllib.request.urlopen('https://...')}.

@item 
bpo-37672@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37672}: Switch Windows Store package’s pip to use bundled
@code{pip.ini} instead of 
@geindex PIP_USER
@geindex environment variable; PIP_USER
@code{PIP_USER} variable.

@item 
bpo-10945@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10945}: Officially drop support for creating bdist_wininst installers
on non-Windows systems.

@item 
bpo-37445@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37445}: Include the @code{FORMAT_MESSAGE_IGNORE_INSERTS} flag in
@code{FormatMessageW()} calls.

@item 
bpo-37369@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37369}: Fixes path for @ref{3eb,,sys.executable} when running from the
Microsoft Store.

@item 
bpo-37380@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37380}: Don’t collect unfinished processes with @code{subprocess._active}
on Windows to cleanup later. Patch by Ruslan Kuprieiev.

@item 
bpo-37351@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37351}: Removes libpython38.a from standard Windows distribution.

@item 
bpo-35360@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35360}: Update Windows builds to use SQLite 3.28.0.

@item 
bpo-37267@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37267}: On Windows, @ref{1e04,,os.dup()} no longer creates an inheritable fd
when handling a character file.

@item 
bpo-36779@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36779}: Ensure @code{time.tzname} is correct on Windows when the active
code page is set to CP_UTF7 or CP_UTF8.

@item 
bpo-32587@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32587}: Make @ref{1e05,,winreg.REG_MULTI_SZ} support zero-length strings.

@item 
bpo-28269@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28269}: Replace use of @code{strcasecmp()} for the system function
@code{_stricmp()}. Patch by Minmin Gong.

@item 
bpo-36590@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36590}: Add native Bluetooth RFCOMM support to socket module.
@end itemize

@node macOS<42>,IDLE<33>,Windows<52>,Python 3 9 0 alpha 1
@anchor{whatsnew/changelog id737}@anchor{1e06}
@subsubsection macOS



@itemize -

@item 
bpo-38117@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38117}: Updated OpenSSL to 1.1.1d in macOS installer.

@item 
bpo-38089@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38089}: Move Azure Pipelines to latest VM versions and make macOS tests
optional

@item 
bpo-18049@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18049}: Increase the default stack size of threads from 5MB to 16MB on
macOS, to match the stack size of the main thread. This avoids crashes on
deep recursion in threads.

@item 
bpo-34602@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34602}: Avoid test suite failures on macOS by no longer calling
resource.setrlimit to increase the process stack size limit at runtime.
The runtime change is no longer needed since the interpreter is being
built with a larger default stack size.

@item 
bpo-35360@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35360}: Update macOS installer to use SQLite 3.28.0.

@item 
bpo-34631@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34631}: Updated OpenSSL to 1.1.1c in macOS installer.
@end itemize

@node IDLE<33>,Tools/Demos<33>,macOS<42>,Python 3 9 0 alpha 1
@anchor{whatsnew/changelog id738}@anchor{1e07}
@subsubsection IDLE



@itemize -

@item 
bpo-26353@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26353}: Stop adding newline when saving an IDLE shell window.

@item 
bpo-4630@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4630}: Add an option to toggle IDLE’s cursor blink for shell, editor,
and output windows.  See Settings, General, Window Preferences, Cursor
Blink. Patch by Zackery Spytz.

@item 
bpo-38598@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38598}: Do not try to compile IDLE shell or output windows

@item 
bpo-36698@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36698}: IDLE no longer fails when write non-encodable characters to
stderr.  It now escapes them with a backslash, as the regular Python
interpreter. Added the @code{errors} field to the standard streams.

@item 
bpo-35379@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35379}: When exiting IDLE, catch any AttributeError.  One happens when
EditorWindow.close is called twice.  Printing a traceback, when IDLE is
run from a terminal, is useless and annoying.

@item 
bpo-38183@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38183}: To avoid problems, test_idle ignores the user config directory.
It no longer tries to create or access .idlerc or any files within. Users
must run IDLE to discover problems with saving settings.

@item 
bpo-38077@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38077}: IDLE no longer adds ‘argv’ to the user namespace when
initializing it.  This bug only affected 3.7.4 and 3.8.0b2 to 3.8.0b4.

@item 
bpo-38041@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38041}: Shell restart lines now fill the window width, always start
with ‘=’, and avoid wrapping unnecessarily. The line will still wrap if
the included file name is long relative to the width.

@item 
bpo-35771@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35771}: To avoid occasional spurious test_idle failures on slower
machines, increase the @code{hover_delay} in test_tooltip.

@item 
bpo-37824@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37824}: Properly handle user input warnings in IDLE shell. Cease
turning SyntaxWarnings into SyntaxErrors.

@item 
bpo-37929@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37929}: IDLE Settings dialog now closes properly when there is no shell
window.

@item 
bpo-37902@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37902}: Add mousewheel scrolling for IDLE module, path, and stack
browsers. Patch by George Zhang.

@item 
bpo-37849@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37849}: Fixed completions list appearing too high or low when shown
above the current line.

@item 
bpo-36419@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36419}: Refactor IDLE autocomplete and improve testing.

@item 
bpo-37748@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37748}: Reorder the Run menu.  Put the most common choice, Run Module,
at the top.

@item 
bpo-37692@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37692}: Improve highlight config sample with example shell interaction
and better labels for shell elements.

@item 
bpo-37628@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37628}: Settings dialog no longer expands with font size.

@item 
bpo-37627@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37627}: Initialize the Customize Run dialog with the command line
arguments most recently entered before.  The user can optionally edit
before submitting them.

@item 
bpo-33610@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33610}: Fix code context not showing the correct context when first
toggled on.

@item 
bpo-37530@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37530}: Optimize code context to reduce unneeded background activity.
Font and highlight changes now occur along with text changes instead of
after a random delay.

@item 
bpo-27452@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27452}: Cleanup @code{config.py} by inlining @code{RemoveFile} and
simplifying the handling of @code{file} in @code{CreateConfigHandlers}.

@item 
bpo-37325@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37325}: Fix tab focus traversal order for help source and custom run
dialogs.

@item 
bpo-37321@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37321}: Both subprocess connection error messages now refer to the
‘Startup failure’ section of the IDLE doc.

@item 
bpo-17535@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17535}: Add optional line numbers for IDLE editor windows.  Windows
open without line numbers unless set otherwise in the General tab of the
configuration dialog.

@item 
bpo-26806@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26806}: To compensate for stack frames added by IDLE and avoid possible
problems with low recursion limits, add 30 to limits in the user code
execution process.  Subtract 30 when reporting recursion limits to make
this addition mostly transparent.

@item 
bpo-37177@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37177}: Properly ‘attach’ search dialogs to their main window so that
they behave like other dialogs and do not get hidden behind their main
window.

@item 
bpo-37039@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37039}: Adjust “Zoom Height” to individual screens by momentarily
maximizing the window on first use with a particular screen.  Changing
screen settings may invalidate the saved height.  While a window is
maximized, “Zoom Height” has no effect.

@item 
bpo-35763@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35763}: Make calltip reminder about ‘/’ meaning positional-only less
obtrusive by only adding it when there is room on the first line.

@item 
bpo-5680@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5680}: Add ‘Run… Customized’ to the Run menu to run a module with
customized settings.  Any ‘command line arguments’ entered are added to
sys.argv. One can suppress the normal Shell main module restart.

@item 
bpo-36390@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36390}: Gather Format menu functions into format.py.  Combine
paragraph.py, rstrip.py, and format methods from editor.py.
@end itemize

@node Tools/Demos<33>,C API<55>,IDLE<33>,Python 3 9 0 alpha 1
@anchor{whatsnew/changelog id739}@anchor{1e08}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-38118@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38118}: Update Valgrind suppression file to ignore a false alarm in
@ref{1e09,,PyUnicode_Decode()} when using GCC builtin strcmp().

@item 
bpo-38347@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38347}: pathfix.py: Assume all files that end on ‘.py’ are Python
scripts when working recursively.

@item 
bpo-37803@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37803}: pdb’s @code{--help} and @code{--version} long options now work.

@item 
bpo-37942@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37942}: Improve ArgumentClinic converter for floats.

@item 
bpo-37704@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37704}: Remove @code{Tools/scripts/h2py.py}: use cffi to access a C API in
Python.

@item 
bpo-37675@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37675}: 2to3 now works when run from a zipped standard library.

@item 
bpo-37034@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37034}: Argument Clinic now uses the argument name on errors with
keyword-only argument instead of their position. Patch contributed by Rémi
Lapeyre.

@item 
bpo-37064@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37064}: Add option -k to pathscript.py script: preserve shebang flags.
Add option -a to pathscript.py script: add flags.
@end itemize

@node C API<55>,,Tools/Demos<33>,Python 3 9 0 alpha 1
@anchor{whatsnew/changelog id740}@anchor{1e0a}
@subsubsection C API



@itemize -

@item 
bpo-37633@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37633}: Re-export some function compatibility wrappers for macros in
@code{pythonrun.h}.

@item 
bpo-38644@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38644}: Provide @ref{3d0,,Py_EnterRecursiveCall()} and
@ref{b71,,Py_LeaveRecursiveCall()} as regular functions for the limited API.
Previously, there were defined as macros, but these macros didn’t work
with the limited API which cannot access @code{PyThreadState.recursion_depth}
field. Remove @code{_Py_CheckRecursionLimit} from the stable ABI.

@item 
bpo-38650@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38650}: The global variable @ref{b7f,,PyStructSequence_UnnamedField} is
now a constant and refers to a constant string.

@item 
bpo-38540@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38540}: Fixed possible leak in @ref{1858,,PyArg_Parse()} and similar
functions for format units @code{"es#"} and @code{"et#"} when the macro
@code{PY_SSIZE_T_CLEAN} is not defined.

@item 
bpo-38395@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38395}: Fix a crash in @ref{c4c,,weakref.proxy} objects due to incorrect
lifetime management when calling some associated methods that may delete
the last reference to object being referenced by the proxy. Patch by Pablo
Galindo.

@item 
bpo-36389@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36389}: The @code{_PyObject_CheckConsistency()} function is now also
available in release mode. For example, it can be used to debug a crash in
the @code{visit_decref()} function of the GC.

@item 
bpo-38266@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38266}: Revert the removal of PyThreadState_DeleteCurrent() with
documentation.

@item 
bpo-38303@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38303}: Update audioop extension module to use the stable ABI
(PEP-384). Patch by Tyler Kieft.

@item 
bpo-38234@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38234}: @code{Py_SetPath()} now sets @ref{3eb,,sys.executable} to the
program full path (@ref{3ea,,Py_GetProgramFullPath()}) rather than to the
program name (@ref{3ec,,Py_GetProgramName()}).

@item 
bpo-38234@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38234}: Python ignored arguments passed to @code{Py_SetPath()},
@code{Py_SetPythonHome()} and @code{Py_SetProgramName()}: fix Python
initialization to use specified arguments.

@item 
bpo-38205@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38205}: The @ref{db4,,Py_UNREACHABLE()} macro now calls
@ref{b80,,Py_FatalError()}.

@item 
bpo-38140@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38140}: Make dict and weakref offsets opaque for C heap types by
passing the offsets through PyMemberDef

@item 
bpo-15088@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15088}: The C function @code{PyGen_NeedsFinalizing} has been removed. It
was not documented, tested or used anywhere within CPython after the
implementation of 
@geindex Python Enhancement Proposals; PEP 442
PEP 442@footnote{https://peps.python.org/pep-0442/}. Patch by Joannah Nanjekye. (Patch by Joannah
Nanjekye)

@item 
bpo-36763@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36763}: Options added by @code{PySys_AddXOption()} are now handled the
same way than @code{PyConfig.xoptions} and command line @code{-X} options.

@item 
bpo-37926@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37926}: Fix a crash in @code{PySys_SetArgvEx(0, NULL, 0)}.

@item 
bpo-37879@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37879}: Fix subtype_dealloc to suppress the type decref when the base
type is a C heap type

@item 
bpo-37645@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37645}: Add @code{_PyObject_FunctionStr()} to get a user-friendly
string representation of a function-like object. Patch by Jeroen Demeyer.

@item 
bpo-29548@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29548}: The functions @code{PyEval_CallObject}, @code{PyEval_CallFunction},
@code{PyEval_CallMethod} and @code{PyEval_CallObjectWithKeywords} are
deprecated. Use @ref{63d,,PyObject_Call()} and its variants instead.

@item 
bpo-37151@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37151}: @code{PyCFunction_Call} is now a deprecated alias of
@ref{63d,,PyObject_Call()}.

@item 
bpo-37540@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37540}: The vectorcall protocol now requires that the caller passes
only strings as keyword names.

@item 
bpo-37207@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37207}: The vectorcall protocol is now enabled for @code{type} objects:
set @code{tp_vectorcall} to a vectorcall function to be used instead of
@code{tp_new} and @code{tp_init} when calling the class itself.

@item 
bpo-21120@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21120}: Exclude Python-ast.h, ast.h and asdl.h from the limited API.

@item 
bpo-37483@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37483}: Add new function @code{_PyObject_CallOneArg} for calling an object
with one positional argument.

@item 
bpo-36763@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36763}: Add @ref{1e0b,,PyConfig_SetWideStringList()} function.

@item 
bpo-37337@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37337}: Add fast functions for calling methods:
@code{_PyObject_VectorcallMethod()},
@code{_PyObject_CallMethodNoArgs()} and
@code{_PyObject_CallMethodOneArg()}.

@item 
bpo-28805@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28805}: The @ref{19e1,,METH_FASTCALL} calling convention has been
documented.

@item 
bpo-37221@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37221}: The new function @code{PyCode_NewWithPosOnlyArgs()} allows to
create code objects like @code{PyCode_New()}, but with an extra
`posonlyargcount' parameter for indicating the number of positonal-only
arguments.

@item 
bpo-37215@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37215}: Fix dtrace issue introduce by bpo-36842@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36842}

@item 
bpo-37194@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37194}: Add a new public @ref{63c,,PyObject_CallNoArgs()} function to the
C API: call a callable Python object without any arguments. It is the most
efficient way to call a callback without any argument. On x86-64, for
example, @code{PyObject_CallFunctionObjArgs(func, NULL)} allocates 960 bytes
on the stack per call, whereas @code{PyObject_CallNoArgs(func)} only
allocates 624 bytes per call.

@item 
bpo-37170@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37170}: Fix the cast on error in
@ref{1e0c,,PyLong_AsUnsignedLongLongMask()}.

@item 
bpo-35381@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35381}: Convert posixmodule.c statically allocated types
@code{DirEntryType} and @code{ScandirIteratorType} to heap-allocated types.

@item 
bpo-34331@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34331}: Use singular/plural noun in error message when instantiating an
abstract class with non-overridden abstract method(s).
@end itemize

@node Python 3 8 0 beta 1,Python 3 8 0 alpha 4,Python 3 9 0 alpha 1,Changelog
@anchor{whatsnew/changelog python-3-8-0-beta-1}@anchor{1e0d}
@subsection Python 3.8.0 beta 1


`Release date: 2019-06-04'

@menu
* Security: Security<47>. 
* Core and Builtins: Core and Builtins<159>. 
* Library: Library<162>. 
* Documentation: Documentation<55>. 
* Tests: Tests<54>. 
* Build: Build<62>. 
* Windows: Windows<53>. 
* macOS: macOS<43>. 
* IDLE: IDLE<34>. 
* Tools/Demos: Tools/Demos<34>. 
* C API: C API<56>. 

@end menu

@node Security<47>,Core and Builtins<159>,,Python 3 8 0 beta 1
@anchor{whatsnew/changelog id741}@anchor{1e0e}
@subsubsection Security



@itemize -

@item 
bpo-35907@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35907}: 
@geindex Common Vulnerabilities and Exposures; CVE 2019-9948
CVE 2019-9948@footnote{https://www.cve.org/CVERecord?id=CVE-2019-9948}: Avoid file reading by disallowing
@code{local-file://} and @code{local_file://} URL schemes in
@code{URLopener().open()} and @code{URLopener().retrieve()} of
@ref{112,,urllib.request}.

@item 
bpo-33529@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33529}: Prevent fold function used in email header encoding from
entering infinite loop when there are too many non-ASCII characters in a
header.

@item 
bpo-33164@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33164}: Updated blake2 implementation which uses secure memset
implementation provided by platform.
@end itemize

@node Core and Builtins<159>,Library<162>,Security<47>,Python 3 8 0 beta 1
@anchor{whatsnew/changelog id742}@anchor{1e0f}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-35814@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35814}: Allow unpacking in the right hand side of annotated
assignments. In particular, @code{t: Tuple[int, ...] = x, y, *z} is now
allowed.

@item 
bpo-37126@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37126}: All structseq objects are now tracked by the garbage collector.
Patch by Pablo Galindo.

@item 
bpo-37122@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37122}: Make the `co_argcount' attribute of code objects represent the
total number of positional arguments (including positional-only
arguments). The value of `co_posonlyargcount' can be used to distinguish
which arguments are positional only, and the difference (`co_argcount' -
`co_posonlyargcount') is the number of positional-or-keyword arguments.
Patch by Pablo Galindo.

@item 
bpo-20092@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20092}: Constructors of @ref{19c,,int}, @ref{197,,float} and
@ref{198,,complex} will now use the @ref{19f,,__index__()} special
method, if available and the corresponding method @ref{19e,,__int__()},
@ref{bc7,,__float__()} or @ref{7fe,,__complex__()} is not available.

@item 
bpo-37087@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37087}: Add native thread ID (TID) support to OpenBSD.

@item 
bpo-26219@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26219}: Implemented per opcode cache mechanism and @code{LOAD_GLOBAL}
instruction use it. @code{LOAD_GLOBAL} is now about 40% faster. Contributed
by Yury Selivanov, and Inada Naoki.

@item 
bpo-37072@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37072}: Fix crash in PyAST_FromNodeObject() when flags is NULL.

@item 
bpo-37029@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37029}: Freeing a great many small objects could take time quadratic in
the number of arenas, due to using linear search to keep @code{obmalloc.c}’s
list of usable arenas sorted by order of number of free memory pools.
This is accomplished without search now, leaving the worst-case time
linear in the number of arenas.  For programs where this quite visibly
matters (typically with more than 100 thousand small objects alive
simultaneously), this can greatly reduce the time needed to release their
memory.

@item 
bpo-26423@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26423}: Fix possible overflow in @code{wrap_lenfunc()} when @code{sizeof(long)
< sizeof(Py_ssize_t)} (e.g., 64-bit Windows).

@item 
bpo-37050@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37050}: Improve the AST for “debug” f-strings, which use ‘=’ to print
out the source of the expression being evaluated.  Delete expr_text from
the FormattedValue node, and instead use a Constant string node (possibly
merged with adjacent constant expressions inside the f-string).

@item 
bpo-22385@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22385}: The @code{bytes.hex}, @code{bytearray.hex}, and @code{memoryview.hex}
methods as well as the @code{binascii.hexlify} and @code{b2a_hex} functions now
have the ability to include an optional separator between hex bytes.  This
functionality was inspired by MicroPython’s hexlify implementation.

@item 
bpo-26836@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26836}: Add @ref{c04,,os.memfd_create()}.

@item 
bpo-37032@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37032}: Added new @code{replace()} method to the code type
(@ref{32d,,types.CodeType}).

@item 
bpo-37007@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37007}: Implement @ref{c28,,socket.if_nameindex()},
@ref{c29,,socket.if_nametoindex()}, and @ref{c2a,,socket.if_indextoname()} on
Windows.

@item 
bpo-36829@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36829}: @ref{5f2,,PyErr_WriteUnraisable()} now creates a traceback object
if there is no current traceback. Moreover, call
@ref{428,,PyErr_NormalizeException()} and @ref{1e10,,PyException_SetTraceback()}
to normalize the exception value. Ignore any error.

@item 
bpo-36878@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36878}: Only accept text after @code{# type: ignore} if the first
character is ASCII. This is to disallow things like @code{# type: ignoreé}.

@item 
bpo-36878@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36878}: Store text appearing after a @code{# type: ignore} comment in the
AST. For example a type ignore like @code{# type: ignore[E1000]} will have
the string @code{"[E1000]"} stored in its AST node.

@item 
bpo-2180@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2180}: Treat line continuation at EOF as a @code{SyntaxError} by Anthony
Sottile.

@item 
bpo-36907@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36907}: Fix a crash when calling a C function with a keyword dict
(@code{f(**kwargs)}) and changing the dict @code{kwargs} while that function is
running.

@item 
bpo-36946@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36946}: Fix possible signed integer overflow when handling slices.

@item 
bpo-36826@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36826}: Add NamedExpression kind support to ast_unparse.c

@item 
bpo-1875@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1875}: A @ref{18f,,SyntaxError} is now raised if a code blocks that will be
optimized away (e.g. if conditions that are always false) contains syntax
errors. Patch by Pablo Galindo.

@item 
bpo-36027@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36027}: Allow computation of modular inverses via three-argument
@code{pow}: the second argument is now permitted to be negative in the case
where the first and third arguments are relatively prime.

@item 
bpo-36861@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36861}: Update the Unicode database to version 12.1.0.

@item 
bpo-28866@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28866}: Avoid caching attributes of classes which type defines mro() to
avoid a hard cache invalidation problem.

@item 
bpo-36851@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36851}: The @code{FrameType} stack is now correctly cleaned up if the
execution ends with a return and the stack is not empty.

@item 
bpo-34616@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34616}: The @code{compile()} builtin functions now support the
@code{ast.PyCF_ALLOW_TOP_LEVEL_AWAIT} flag,  which allow to compile sources
that  contains top-level @code{await}, @code{async with} or @code{async for}. This
is useful to evaluate async-code from with an already async functions; for
example in a custom REPL.

@item 
bpo-36842@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36842}: Implement PEP 578, adding sys.audit, io.open_code and related
APIs.

@item 
bpo-27639@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27639}: Correct return type for UserList slicing operations. Patch by
Michael Blahay, Erick Cervantes, and vaultah

@item 
bpo-36737@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36737}: Move PyRuntimeState.warnings into per-interpreter state (via
“module state”).

@item 
bpo-36793@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36793}: Removed @code{__str__} implementations from builtin types
@ref{3c1,,bool}, @ref{19c,,int}, @ref{197,,float}, @ref{198,,complex} and few
classes from the standard library. They now inherit @code{__str__()} from
@ref{c84,,object}.

@item 
bpo-36817@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36817}: Add a @code{=} feature f-strings for debugging. This can precede
@code{!s}, @code{!r}, or @code{!a}. It produces the text of the expression,
followed by an equal sign, followed by the repr of the value of the
expression. So @code{f'@{3*9+15=@}'} would be equal to the string
@code{'3*9+15=42'}.  If @code{=} is specified, the default conversion is set to
@code{!r}, unless a format spec is given, in which case the formatting
behavior is unchanged, and __format__ will be used.

@item 
bpo-24048@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24048}: Save the live exception during import.c’s @code{remove_module()}.

@item 
bpo-27987@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27987}: pymalloc returns memory blocks aligned by 16 bytes, instead of
8 bytes, on 64-bit platforms to conform x86-64 ABI. Recent compilers
assume this alignment more often. Patch by Inada Naoki.

@item 
bpo-36601@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36601}: A long-since-meaningless check for @code{getpid() == main_pid} was
removed from Python’s internal C signal handler.

@item 
bpo-36594@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36594}: Fix incorrect use of @code{%p} in format strings. Patch by Zackery
Spytz.

@item 
bpo-36045@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36045}: @code{builtins.help()} now prefixes @code{async} for async functions.

@item 
bpo-36084@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36084}: Add native thread ID (TID) to threading.Thread objects
(supported platforms: Windows, FreeBSD, Linux, macOS)

@item 
bpo-36035@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36035}: Added fix for broken symlinks in combination with pathlib

@item 
bpo-35983@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35983}: Added new trashcan macros to deal with a double deallocation
that could occur when the @code{tp_dealloc} of a subclass calls the
@code{tp_dealloc} of a base class and that base class uses the trashcan
mechanism. Patch by Jeroen Demeyer.

@item 
bpo-20602@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20602}: Do not clear @ref{89e,,sys.flags} and @ref{1e11,,sys.float_info}
during shutdown. Patch by Zackery Spytz.

@item 
bpo-26826@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26826}: Expose @code{copy_file_range()} as a low level API in the
@ref{a5,,os} module.

@item 
bpo-32388@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32388}: Remove cross-version binary compatibility requirement in
tp_flags.

@item 
bpo-31862@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31862}: Port binascii to PEP 489 multiphase initialization. Patch by
Marcel Plch.
@end itemize

@node Library<162>,Documentation<55>,Core and Builtins<159>,Python 3 8 0 beta 1
@anchor{whatsnew/changelog id743}@anchor{1e12}
@subsubsection Library



@itemize -

@item 
bpo-37128@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37128}: Added @ref{8e2,,math.perm()}.

@item 
bpo-37120@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37120}: Add SSLContext.num_tickets to control the number of TLSv1.3
session tickets.

@item 
bpo-12202@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12202}: Fix the error handling in
@code{msilib.SummaryInformation.GetProperty()}. Patch by Zackery Spytz.

@item 
bpo-26835@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26835}: The fcntl module now contains file sealing constants for
sealing of memfds.

@item 
bpo-29262@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29262}: Add @code{get_origin()} and @code{get_args()} introspection helpers
to @code{typing} module.

@item 
bpo-12639@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12639}: @code{msilib.Directory.start_component()} no longer fails if
`keyfile' is not @code{None}.

@item 
bpo-36999@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36999}: Add the @code{asyncio.Task.get_coro()} method to publicly expose
the tasks’s coroutine object.

@item 
bpo-35246@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35246}: Make @ref{c71,,asyncio.create_subprocess_exec()} accept path-like
arguments.

@item 
bpo-35279@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35279}: Change default `max_workers' of @code{ThreadPoolExecutor} from
@code{cpu_count() * 5} to @code{min(32, cpu_count() + 4)}.  Previous value was
unreasonably large on many cores machines.

@item 
bpo-37076@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37076}: @ref{4b5,,_thread.start_new_thread()} now logs uncaught exception
raised by the function using @ref{508,,sys.unraisablehook()}, rather than
@ref{a12,,sys.excepthook()}, so the hook gets access to the function which
raised the exception.

@item 
bpo-33725@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33725}: On macOS, the @ref{98,,multiprocessing} module now uses `spawn'
start method by default.

@item 
bpo-37054@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37054}: Fix destructor @code{_pyio.BytesIO} and
@code{_pyio.TextIOWrapper}: initialize their @code{_buffer} attribute as
soon as possible (in the class body), because it’s used by @code{__del__()}
which calls @code{close()}.

@item 
bpo-37058@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37058}: PEP 544: Add @code{Protocol} and @code{@@runtime_checkable} to the
@code{typing} module.

@item 
bpo-36933@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36933}: The functions @code{sys.set_coroutine_wrapper} and
@code{sys.get_coroutine_wrapper} that were deprecated and marked for removal
in 3.8 have been removed.

@item 
bpo-37047@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37047}: Handle late binding and attribute access in
@ref{c44,,unittest.mock.AsyncMock} setup for autospeccing. Document newly
implemented async methods in @ref{1095,,unittest.mock.MagicMock}.

@item 
bpo-37049@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37049}: PEP 589: Add @code{TypedDict} to the @code{typing} module.

@item 
bpo-37046@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37046}: PEP 586: Add @code{Literal} to the @code{typing} module.

@item 
bpo-37045@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37045}: PEP 591: Add @code{Final} qualifier and @code{@@final} decorator to
the @code{typing} module.

@item 
bpo-37035@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37035}: Don’t log OSError based exceptions if a fatal error has
occurred in asyncio transport. Peer can generate almost any OSError, user
cannot avoid these exceptions by fixing own code. Errors are still
propagated to user code, it’s just logging them is pointless and pollute
asyncio logs.

@item 
bpo-37001@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37001}: @ref{1e13,,symtable.symtable()} now accepts the same input types for
source code as the built-in @ref{4b2,,compile()} function. Patch by Dino
Viehland.

@item 
bpo-37028@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37028}: Implement asyncio REPL

@item 
bpo-37027@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37027}: Return safe to use proxy socket object from
transport.get_extra_info(‘socket’)

@item 
bpo-32528@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32528}: Make asyncio.CancelledError a BaseException.

This will address the common mistake many asyncio users make: an “except
Exception” clause breaking Tasks cancellation.

In addition to this change, we stop inheriting asyncio.TimeoutError and
asyncio.InvalidStateError from their concurrent.futures.* counterparts.
There’s no point for these exceptions to share the inheritance chain.

@item 
bpo-1230540@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1230540}: Add a new @ref{a51,,threading.excepthook()} function which handles
uncaught @ref{c37,,threading.Thread.run()} exception. It can be overridden to
control how uncaught @code{threading.Thread.run()} exceptions are handled.

@item 
bpo-36996@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36996}: Handle @ref{1098,,unittest.mock.patch()} used as a decorator on async
functions.

@item 
bpo-37008@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37008}: Add support for calling @ref{9de,,next()} with the mock resulting
from @ref{11ed,,unittest.mock.mock_open()}

@item 
bpo-27737@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27737}: Allow whitespace only header encoding in @code{email.header} - by
Batuhan Taskaya

@item 
bpo-36969@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36969}: PDB command @code{args} now  display positional only arguments.
Patch contributed by Rémi Lapeyre.

@item 
bpo-36969@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36969}: PDB command @code{args} now  display keyword only arguments. Patch
contributed by Rémi Lapeyre.

@item 
bpo-36983@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36983}: Add missing names to @code{typing.__all__}: @code{ChainMap},
@code{ForwardRef}, @code{OrderedDict} - by Anthony Sottile.

@item 
bpo-36972@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36972}: Add SupportsIndex protocol to the typing module to allow type
checking to detect classes that can be passed to @code{hex()}, @code{oct()} and
@code{bin()}.

@item 
bpo-32972@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32972}: Implement @code{unittest.IsolatedAsyncioTestCase} to help testing
asyncio-based code.

@item 
bpo-36952@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36952}: @ref{a06,,fileinput.input()} and @ref{945,,fileinput.FileInput}
`bufsize' argument has been removed (was deprecated and ignored since
Python 3.6), and as a result the `mode' and `openhook' arguments have
been made keyword-only.

@item 
bpo-36952@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36952}: Starting with Python 3.3, importing ABCs from
@ref{1e,,collections} is deprecated, and import should be done from
@ref{1f,,collections.abc}. Still being able to import from @code{collections}
was marked for removal in 3.8, but has been delayed to 3.9; documentation
and @code{DeprecationWarning} clarified.

@item 
bpo-36949@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36949}: Implement __repr__ for WeakSet objects.

@item 
bpo-36948@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36948}: Fix @ref{450,,NameError} in
@code{urllib.request.URLopener.retrieve()}. Patch by Karthikeyan
Singaravelan.

@item 
bpo-33524@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33524}: Fix the folding of email header when the max_line_length is 0
or None and the header contains non-ascii characters.  Contributed by
Licht Takeuchi (@@Licht-T).

@item 
bpo-24564@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24564}: @ref{133a,,shutil.copystat()} now ignores @ref{1e14,,errno.EINVAL} on
@ref{1313,,os.setxattr()} which may occur when copying files on filesystems
without extended attributes support.

Original patch by Giampaolo Rodola, updated by Ying Wang.

@item 
bpo-36888@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36888}: Python child processes can now access the status of their
parent process using multiprocessing.process.parent_process

@item 
bpo-36921@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36921}: Deprecate @code{@@coroutine} for sake of @code{async def}.

@item 
bpo-25652@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25652}: Fix bug in @code{__rmod__} of @code{UserString} - by Batuhan Taskaya.

@item 
bpo-36916@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36916}: Remove a message about an unhandled exception in a task when
writer.write() is used without await and writer.drain() fails with an
exception.

@item 
bpo-36889@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36889}: Introduce @code{asyncio.Stream} class that merges
@ref{17b8,,asyncio.StreamReader} and @ref{1ab6,,asyncio.StreamWriter}
functionality. @code{asyncio.Stream} can work in readonly, writeonly and
readwrite modes. Provide @code{asyncio.connect()},
@code{asyncio.connect_unix()}, @code{asyncio.connect_read_pipe()} and
@code{asyncio.connect_write_pipe()} factories to open
@code{asyncio.Stream} connections. Provide @code{asyncio.StreamServer}
and @code{UnixStreamServer} to serve servers with asyncio.Stream API.
Modify @ref{c72,,asyncio.create_subprocess_shell()} and
@ref{c71,,asyncio.create_subprocess_exec()} to use @code{asyncio.Stream}
instead of deprecated @code{StreamReader} and @code{StreamWriter}.
Deprecate @code{asyncio.StreamReader} and @code{asyncio.StreamWriter}.
Deprecate usage of private classes, e.g.
@code{asyncio.FlowControlMixing} and
@code{asyncio.StreamReaderProtocol} outside of asyncio package.

@item 
bpo-36845@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36845}: Added validation of integer prefixes to the construction of IP
networks and interfaces in the ipaddress module.

@item 
bpo-23378@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23378}: Add an extend action to argparser.

@item 
bpo-36867@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36867}: Fix a bug making a SharedMemoryManager instance and its parent
process use two separate resource_tracker processes.

@item 
bpo-23896@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23896}: Adds a grammar to lib2to3.pygram that contains exec as a
function not as statement.

@item 
bpo-36895@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36895}: The function @code{time.clock()} was deprecated in 3.3 in favor of
@code{time.perf_counter()} and marked for removal in 3.8, it has removed.

@item 
bpo-35545@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35545}: Fix asyncio discarding IPv6 scopes when ensuring hostname
resolutions internally

@item 
bpo-36887@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36887}: Add new function @ref{bfe,,math.isqrt()} to compute integer square
roots.

@item 
bpo-34632@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34632}: Introduce the @code{importlib.metadata} module with (provisional)
support for reading metadata from third-party packages.

@item 
bpo-36878@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36878}: When using @code{type_comments=True} in @code{ast.parse}, treat @code{#
type: ignore} followed by a non-alphanumeric character and then arbitrary
text as a type ignore, instead of requiring nothing but whitespace or
another comment. This is to permit formations such as @code{# type:
ignore[E1000]}.

@item 
bpo-36778@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36778}: @code{cp65001} encoding (Windows code page 65001) becomes an alias
to @code{utf_8} encoding.

@item 
bpo-36867@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36867}: The multiprocessing.resource_tracker replaces the
multiprocessing.semaphore_tracker module. Other than semaphores,
resource_tracker also tracks shared_memory segments.

@item 
bpo-30262@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30262}: The @code{Cache} and @code{Statement} objects of the @ref{d4,,sqlite3}
module are not exposed to the user.  Patch by Aviv Palivoda.

@item 
bpo-24538@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24538}: In @code{shutil.copystat()}, first copy extended file attributes
and then file permissions, since extended attributes can only be set on
the destination while it is still writeable.

@item 
bpo-36829@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36829}: Add new @ref{508,,sys.unraisablehook()} function which can be
overridden to control how “unraisable exceptions” are handled. It is
called when an exception has occurred but there is no way for Python to
handle it. For example, when a destructor raises an exception or during
garbage collection (@ref{1b5,,gc.collect()}).

@item 
bpo-36832@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36832}: Introducing @code{zipfile.Path}, a pathlib-compatible wrapper for
traversing zip files.

@item 
bpo-36814@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36814}: Fix an issue where os.posix_spawnp() would incorrectly raise a
TypeError when file_actions is None.

@item 
bpo-33110@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33110}: Handle exceptions raised by functions added by
concurrent.futures add_done_callback correctly when the Future has already
completed.

@item 
bpo-26903@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26903}: Limit @code{max_workers} in @code{ProcessPoolExecutor} to 61 to work
around a WaitForMultipleObjects limitation.

@item 
bpo-36813@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36813}: Fix @ref{244,,QueueListener} to call
@code{queue.task_done()} upon stopping. Patch by Bar Harel.

@item 
bpo-36806@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36806}: Forbid creation of asyncio stream objects like StreamReader,
StreamWriter, Process, and their protocols outside of asyncio package.

@item 
bpo-36802@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36802}: Provide both sync and async calls for StreamWriter.write() and
StreamWriter.close()

@item 
bpo-36801@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36801}: Properly handle SSL connection closing in asyncio
StreamWriter.drain() call.

@item 
bpo-36785@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36785}: Implement PEP 574 (pickle protocol 5 with out-of-band buffers).

@item 
bpo-36772@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36772}: functools.lru_cache() can now be used as a straight decorator
in addition to its existing usage as a function that returns a decorator.

@item 
bpo-6584@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6584}: Add a @ref{bf0,,BadGzipFile} exception to the @ref{6b,,gzip}
module.

@item 
bpo-36748@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36748}: Optimized write buffering in C implementation of
@code{TextIOWrapper}. Writing ASCII string to @code{TextIOWrapper} with ascii,
latin1, or utf-8 encoding is about 20% faster.  Patch by Inada Naoki.

@item 
bpo-8138@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8138}: Don’t mark @code{wsgiref.simple_server.SimpleServer} as
multi-threaded since @code{wsgiref.simple_server.WSGIServer} is
single-threaded.

@item 
bpo-22640@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22640}: @ref{c20,,py_compile.compile()} now supports silent mode. Patch by
Joannah Nanjekye

@item 
bpo-29183@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29183}: Fix double exceptions in @ref{1e15,,wsgiref.handlers.BaseHandler}
by calling its @code{close()} method only
when no exception is raised.

@item 
bpo-36548@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36548}: Improved the repr of regular expression flags.

@item 
bpo-36542@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36542}: The signature of Python functions can now be overridden by
specifying the @code{__text_signature__} attribute.

@item 
bpo-36533@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36533}: Reinitialize logging.Handler locks in forked child processes
instead of attempting to acquire them all in the parent before forking
only to be released in the child process.  The acquire/release pattern was
leading to deadlocks in code that has implemented any form of chained
logging handlers that depend upon one another as the lock acquisition
order cannot be guaranteed.

@item 
bpo-35252@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35252}: Throw a TypeError instead of an AssertionError when using an
invalid type annotation with singledispatch.

@item 
bpo-35900@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35900}: Allow reduction methods to return a 6-item tuple where the 6th
item specifies a custom state-setting method that’s called instead of the
regular @code{__setstate__} method.

@item 
bpo-35900@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35900}: enable custom reduction callback registration for functions and
classes in _pickle.c, using the new Pickler’s attribute
@code{reducer_override}

@item 
bpo-36368@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36368}: Fix a bug crashing SharedMemoryManager instances in interactive
sessions after a ctrl-c (KeyboardInterrupt) was sent

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: Fix mmap fail for VxWorks

@item 
bpo-27497@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27497}: @ref{140b,,csv.DictWriter.writeheader()} now returns the return value
of the underlying @code{csv.Writer.writerow()} method. Patch contributed by
Ashish Nitin Patil.

@item 
bpo-36239@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36239}: Parsing .mo files now ignores comments starting and ending with
#-#-#-#-#.

@item 
bpo-26707@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26707}: Enable plistlib to read and write binary plist files that were
created as a KeyedArchive file. Specifically, this allows the plistlib to
process 0x80 tokens as UID objects.

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: Add posix module support for VxWorks.

@item 
bpo-35125@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35125}: Asyncio: Remove inner callback on outer cancellation in shield

@item 
bpo-35721@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35721}: Fix @code{asyncio.SelectorEventLoop.subprocess_exec()} leaks
file descriptors if @code{Popen} fails and called with
@code{stdin=subprocess.PIPE}. Patch by Niklas Fiekas.

@item 
bpo-31855@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31855}: @ref{11ed,,unittest.mock.mock_open()} results now respects the
argument of read([size]). Patch contributed by Rémi Lapeyre.

@item 
bpo-35431@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35431}: Implement @ref{8e1,,math.comb()} that returns binomial coefficient,
that computes the number of ways to choose k items from n items without
repetition and without order. Patch by Yash Aggarwal and Keller Fuchs.

@item 
bpo-26660@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26660}: Fixed permission errors in
@ref{1440,,TemporaryDirectory} clean up. Previously
@code{TemporaryDirectory.cleanup()} failed when non-writeable or
non-searchable files or directories were created inside a temporary
directory.

@item 
bpo-34271@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34271}: Add debugging helpers to ssl module. It’s now possible to dump
key material and to trace TLS protocol. The default and stdlib contexts
also support SSLKEYLOGFILE env var.

@item 
bpo-26467@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26467}: Added AsyncMock to support using unittest to mock asyncio
coroutines. Patch by Lisa Roach.

@item 
bpo-33569@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33569}: dataclasses.InitVar: Exposes the type used to create the init
var.

@item 
bpo-34424@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34424}: Fix serialization of messages containing encoded strings when
the policy.linesep is set to a multi-character string. Patch by Jens
Troeger.

@item 
bpo-34303@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34303}: Performance of @ref{21c,,functools.reduce()} is slightly improved.
Patch by Sergey Fedoseev.

@item 
bpo-33361@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33361}: Fix a bug in @ref{1e16,,codecs.StreamRecoder} where seeking might
leave old data in a buffer and break subsequent read calls. Patch by Ammar
Askar.

@item 
bpo-22454@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22454}: The @ref{c9,,shlex} module now exposes @ref{c22,,shlex.join()}, the
inverse of @ref{75f,,shlex.split()}. Patch by Bo Bayles.

@item 
bpo-31922@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31922}: @code{asyncio.AbstractEventLoop.create_datagram_endpoint()}: Do
not connect UDP socket when broadcast is allowed. This allows to receive
replies after a UDP broadcast.

@item 
bpo-24882@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24882}: Change ThreadPoolExecutor to use existing idle threads before
spinning up new ones.

@item 
bpo-31961@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31961}: Added support for bytes and path-like objects in
@ref{4b8,,subprocess.Popen()} on Windows.  The `args' parameter now accepts a
@ref{5a1,,path-like object} if `shell' is @code{False} and a sequence containing
bytes and path-like objects. The `executable' parameter now accepts a
bytes and path-like object. The `cwd' parameter now accepts a
bytes object. Based on patch by Anders Lorentsen.

@item 
bpo-33123@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33123}: @ref{1e17,,pathlib.Path.unlink} now accepts a `missing_ok'
parameter to avoid a @ref{266,,FileNotFoundError} from being raised. Patch by
Robert Buchholz.

@item 
bpo-32941@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32941}: Allow @ref{51a,,mmap.mmap} objects to access the madvise() system
call (through @ref{c01,,mmap.mmap.madvise()}).

@item 
bpo-22102@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22102}: Added support for ZIP files with disks set to 0. Such files are
commonly created by builtin tools on Windows when use ZIP64 extension.
Patch by Francisco Facioni.

@item 
bpo-32515@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32515}: trace.py can now run modules via python3 -m trace -t –module
module_name

@item 
bpo-32299@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32299}: Changed @ref{19ab,,unittest.mock.patch.dict()} to return the patched
dictionary when used as context manager. Patch by Vadim Tsander.

@item 
bpo-27141@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27141}: Added a @code{__copy__()} to @code{collections.UserList} and
@code{collections.UserDict} in order to correctly implement shallow copying
of the objects. Patch by Bar Harel.

@item 
bpo-31829@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31829}: @code{\r}, @code{\0} and @code{\x1a} (end-of-file on Windows) are now
escaped in protocol 0 pickles of Unicode strings. This allows to load them
without loss from files open in text mode in Python 2.

@item 
bpo-23395@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23395}: @code{_thread.interrupt_main()} now avoids setting the Python
error status if the @code{SIGINT} signal is ignored or not handled by Python.
@end itemize

@node Documentation<55>,Tests<54>,Library<162>,Python 3 8 0 beta 1
@anchor{whatsnew/changelog id744}@anchor{1e18}
@subsubsection Documentation



@itemize -

@item 
bpo-36896@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36896}: Clarify that some types have unstable constructor signature
between Python versions.

@item 
bpo-36686@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36686}: Improve documentation of the stdin, stdout, and stderr
arguments of the @code{asyncio.subprocess_exec} function to specify which
values are supported. Also mention that decoding as text is not supported.

Add a few tests to verify that the various values passed to the std*
arguments actually work.

@item 
bpo-36984@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36984}: Improve version added references in @code{typing} module - by
Anthony Sottile.

@item 
bpo-36868@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36868}: What’s new now mentions SSLContext.hostname_checks_common_name
instead of SSLContext.host_flags.

@item 
bpo-35924@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35924}: Add a note to the @code{curses.addstr()} documentation to warn
that multiline strings can cause segfaults because of an ncurses bug.

@item 
bpo-36783@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36783}: Added C API Documentation for Time_FromTimeAndFold and
PyDateTime_FromDateAndTimeAndFold as per PEP 495. Patch by Edison
Abahurire.

@item 
bpo-36797@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36797}: More of the legacy distutils documentation has been either
pruned, or else more clearly marked as being retained solely until the
setuptools documentation covers it independently.

@item 
bpo-22865@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22865}: Add detail to the documentation on the @code{pty.spawn} function.

@item 
bpo-35397@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35397}: Remove deprecation and document urllib.parse.unwrap(). Patch
contributed by Rémi Lapeyre.

@item 
bpo-32995@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32995}: Added the context variable in glossary.

@item 
bpo-33519@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33519}: Clarify that @code{copy()} is not part of the @code{MutableSequence}
ABC.

@item 
bpo-33482@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33482}: Make @code{codecs.StreamRecoder.writelines} take a list of bytes.

@item 
bpo-25735@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25735}: Added documentation for func factorial to indicate that returns
integer values

@item 
bpo-20285@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20285}: Expand object.__doc__ (docstring) to make it clearer. Modify
pydoc.py so that help(object) lists object methods (for other classes,
help omits methods of the object base class.)
@end itemize

@node Tests<54>,Build<62>,Documentation<55>,Python 3 8 0 beta 1
@anchor{whatsnew/changelog id745}@anchor{1e19}
@subsubsection Tests



@itemize -

@item 
bpo-37069@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37069}: Modify test_coroutines, test_cprofile, test_generators,
test_raise, test_ssl and test_yield_from to use
@ref{1dff,,test.support.catch_unraisable_exception()} rather than
@ref{1e1a,,test.support.captured_stderr()}.

@item 
bpo-37098@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37098}: Fix test_memfd_create on older Linux Kernels.

@item 
bpo-37081@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37081}: Test with OpenSSL 1.1.1c

@item 
bpo-36829@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36829}: Add @ref{1dff,,test.support.catch_unraisable_exception()}: context
manager catching unraisable exception using @ref{508,,sys.unraisablehook()}.

@item 
bpo-36915@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36915}: The main regrtest process now always removes all temporary
directories of worker processes even if they crash or if they are killed
on KeyboardInterrupt (CTRL+c).

@item 
bpo-36719@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36719}: “python3 -m test -jN …” now continues the execution of next
tests when a worker process crash (CHILD_ERROR state). Previously, the
test suite stopped immediately. Use –failfast to stop at the first error.

@item 
bpo-36816@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36816}: Update Lib/test/selfsigned_pythontestdotnet.pem to match
self-signed.pythontest.net’s new TLS certificate.

@item 
bpo-35925@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35925}: Skip httplib and nntplib networking tests when they would
otherwise fail due to a modern OS or distro with a default OpenSSL policy
of rejecting connections to servers with weak certificates.

@item 
bpo-36782@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36782}: Add tests for several C API functions in the @ref{34,,datetime}
module. Patch by Edison Abahurire.

@item 
bpo-36342@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36342}: Fix test_multiprocessing in test_venv if platform lacks
functioning sem_open.
@end itemize

@node Build<62>,Windows<53>,Tests<54>,Python 3 8 0 beta 1
@anchor{whatsnew/changelog id746}@anchor{1e1b}
@subsubsection Build



@itemize -

@item 
bpo-36721@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36721}: To embed Python into an application, a new @code{--embed} option
must be passed to @code{python3-config --libs --embed} to get @code{-lpython3.8}
(link the application to libpython). To support both 3.8 and older, try
@code{python3-config --libs --embed} first and fallback to @code{python3-config
--libs} (without @code{--embed}) if the previous command fails.

Add a pkg-config @code{python-3.8-embed} module to embed Python into an
application: @code{pkg-config python-3.8-embed --libs} includes
@code{-lpython3.8}. To support both 3.8 and older, try @code{pkg-config
python-X.Y-embed --libs} first and fallback to @code{pkg-config python-X.Y
--libs} (without @code{--embed}) if the previous command fails (replace
@code{X.Y} with the Python version).

On the other hand, @code{pkg-config python3.8 --libs} no longer contains
@code{-lpython3.8}. C extensions must not be linked to libpython (except on
Android, case handled by the script); this change is backward incompatible
on purpose.

@item 
bpo-36786@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36786}: “make install” now runs compileall in parallel.
@end itemize

@node Windows<53>,macOS<43>,Build<62>,Python 3 8 0 beta 1
@anchor{whatsnew/changelog id747}@anchor{1e1c}
@subsubsection Windows



@itemize -

@item 
bpo-36965@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36965}: include of STATUS_CONTROL_C_EXIT without depending on MSC
compiler

@item 
bpo-35926@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35926}: Update to OpenSSL 1.1.1b for Windows.

@item 
bpo-29883@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29883}: Add Windows support for UDP transports for the Proactor Event
Loop. Patch by Adam Meily.

@item 
bpo-33407@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33407}: The @ref{ca1,,Py_DEPRECATED()} macro has been implemented for
MSVC.
@end itemize

@node macOS<43>,IDLE<34>,Windows<53>,Python 3 8 0 beta 1
@anchor{whatsnew/changelog id748}@anchor{1e1d}
@subsubsection macOS



@itemize -

@item 
bpo-36231@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36231}: Support building Python on macOS without /usr/include
installed. As of macOS 10.14, system header files are only available
within an SDK provided by either the Command Line Tools or the Xcode app.
@end itemize

@node IDLE<34>,Tools/Demos<34>,macOS<43>,Python 3 8 0 beta 1
@anchor{whatsnew/changelog id749}@anchor{1e1e}
@subsubsection IDLE



@itemize -

@item 
bpo-35610@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35610}: Replace now redundant .context_use_ps1 with .prompt_last_line.
This finishes change started in bpo-31858@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31858}.

@item 
bpo-37038@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37038}: Make idlelib.run runnable; add test clause.

@item 
bpo-36958@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36958}: Print any argument other than None or int passed to SystemExit
or sys.exit().

@item 
bpo-36807@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36807}: When saving a file, call os.fsync() so bits are flushed to e.g.
USB drive.

@item 
bpo-32411@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32411}: In browser.py, remove extraneous sorting by line number since
dictionary was created in line number order.
@end itemize

@node Tools/Demos<34>,C API<56>,IDLE<34>,Python 3 8 0 beta 1
@anchor{whatsnew/changelog id750}@anchor{1e1f}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-37053@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37053}: Handle strings like u”bar” correctly in
Tools/parser/unparse.py. Patch by Chih-Hsuan Yen.
@end itemize

@node C API<56>,,Tools/Demos<34>,Python 3 8 0 beta 1
@anchor{whatsnew/changelog id751}@anchor{1e20}
@subsubsection C API



@itemize -

@item 
bpo-36763@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36763}: Implement the 
@geindex Python Enhancement Proposals; PEP 587
PEP 587@footnote{https://peps.python.org/pep-0587/} “Python Initialization Configuration”.

@item 
bpo-36379@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36379}: Fix crashes when attempting to use the `modulo' parameter when
@code{__ipow__} is implemented in C.

@item 
bpo-37107@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37107}: Update @ref{1e21,,PyObject_CallMethodObjArgs()} and
@code{_PyObject_CallMethodIdObjArgs} to use @code{_PyObject_GetMethod} to avoid
creating a bound method object in many cases. Patch by Michael J.
Sullivan.

@item 
bpo-36974@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36974}: Implement 
@geindex Python Enhancement Proposals; PEP 590
PEP 590@footnote{https://peps.python.org/pep-0590/}: Vectorcall: a fast calling protocol for
CPython. This is a new protocol to optimize calls of custom callable
objects.

@item 
bpo-36763@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36763}: @code{Py_Main()} now returns the exitcode rather than calling
@code{Py_Exit(exitcode)} when calling @code{PyErr_Print()} if the current
exception type is @code{SystemExit}.

@item 
bpo-36922@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36922}: Add new type flag @code{Py_TPFLAGS_METHOD_DESCRIPTOR} for objects
behaving like unbound methods. These are objects supporting the
optimization given by the @code{LOAD_METHOD}/@code{CALL_METHOD} opcodes. See PEP
590.

@item 
bpo-36728@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36728}: The @code{PyEval_ReInitThreads()} function has been removed
from the C API. It should not be called explicitly: use
@ref{42e,,PyOS_AfterFork_Child()} instead.
@end itemize

@node Python 3 8 0 alpha 4,Python 3 8 0 alpha 3,Python 3 8 0 beta 1,Changelog
@anchor{whatsnew/changelog python-3-8-0-alpha-4}@anchor{1e22}
@subsection Python 3.8.0 alpha 4


`Release date: 2019-05-06'

@menu
* Security: Security<48>. 
* Core and Builtins: Core and Builtins<160>. 
* Library: Library<163>. 
* Documentation: Documentation<56>. 
* Tests: Tests<55>. 
* Build: Build<63>. 
* Windows: Windows<54>. 
* macOS: macOS<44>. 
* IDLE: IDLE<35>. 
* Tools/Demos: Tools/Demos<35>. 
* C API: C API<57>. 

@end menu

@node Security<48>,Core and Builtins<160>,,Python 3 8 0 alpha 4
@anchor{whatsnew/changelog id752}@anchor{1e23}
@subsubsection Security



@itemize -

@item 
bpo-36742@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36742}: Fixes mishandling of pre-normalization characters in
urlsplit().

@item 
bpo-30458@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30458}: Address 
@geindex Common Vulnerabilities and Exposures; CVE 2019-9740
CVE 2019-9740@footnote{https://www.cve.org/CVERecord?id=CVE-2019-9740} by disallowing URL paths with embedded
whitespace or control characters through into the underlying http client
request.  Such potentially malicious header injection URLs now cause an
http.client.InvalidURL exception to be raised.

@item 
bpo-35755@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35755}: @ref{6dc,,shutil.which()} now uses @code{os.confstr("CS_PATH")} if
available and if the 
@geindex PATH
@geindex environment variable; PATH
@code{PATH} environment variable is not set.
Remove also the current directory from @code{posixpath.defpath}. On Unix,
@code{shutil.which()} and the @ref{dc,,subprocess} module no longer search the
executable in the current directory if the 
@geindex PATH
@geindex environment variable; PATH
@code{PATH} environment
variable is not set.
@end itemize

@node Core and Builtins<160>,Library<163>,Security<48>,Python 3 8 0 alpha 4
@anchor{whatsnew/changelog id753}@anchor{1e24}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-36722@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36722}: In debug build, import now also looks for C extensions compiled
in release mode and for C extensions compiled in the stable ABI.

@item 
bpo-32849@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32849}: Fix Python Initialization code on FreeBSD to detect properly
when stdin file descriptor (fd 0) is invalid.

@item 
bpo-36623@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36623}: Remove parser headers and related function declarations that
lack implementations after the removal of pgen.

@item 
bpo-20180@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20180}: @code{dict.pop()} is now up to 33% faster thanks to Argument
Clinic. Patch by Inada Naoki.

@item 
bpo-36611@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36611}: Debug memory allocators: disable serialno field by default from
debug hooks on Python memory allocators to reduce the memory footprint by
5%. Enable @ref{106,,tracemalloc} to get the traceback where a memory block
has been allocated when a fatal memory error is logged to decide where to
put a breakpoint. Compile Python with @code{PYMEM_DEBUG_SERIALNO} defined to
get back the field.

@item 
bpo-36588@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36588}: On AIX, @ref{293,,sys.platform} doesn’t contain the major version
anymore. Always return @code{'aix'}, instead of @code{'aix3'} .. @code{'aix7'}.
Since older Python versions include the version number, it is recommended
to always use @code{sys.platform.startswith('aix')}. Contributed by M. Felt.

@item 
bpo-36549@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36549}: Change str.capitalize to use titlecase for the first character
instead of uppercase.

@item 
bpo-36540@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36540}: Implement 
@geindex Python Enhancement Proposals; PEP 570
PEP 570@footnote{https://peps.python.org/pep-0570/} (Python positional-only parameters). Patch
by Pablo Galindo.

@item 
bpo-36475@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36475}: @code{PyEval_AcquireLock()} and
@code{PyEval_AcquireThread()} now terminate the current thread if called
while the interpreter is finalizing, making them consistent with
@ref{648,,PyEval_RestoreThread()}, @ref{c85,,Py_END_ALLOW_THREADS()}, and
@ref{64a,,PyGILState_Ensure()}.

@item 
bpo-36504@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36504}: Fix signed integer overflow in _ctypes.c’s
@code{PyCArrayType_new()}.

@item 
bpo-20844@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20844}: Fix running script with encoding cookie and LF line ending may
fail on Windows.

@item 
bpo-24214@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24214}: Fixed support of the surrogatepass error handler in the UTF-8
incremental decoder.

@item 
bpo-36452@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36452}: Changing @code{dict} keys during iteration of the dict itself,
@code{keys()}, @code{values()}, or @code{items()} will now be detected in certain
corner cases where keys are deleted/added so that the number of keys isn’t
changed. A @code{RuntimeError} will be raised after @code{len(dict)} iterations.
Contributed by Thomas Perl.

@item 
bpo-36459@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36459}: Fix a possible double @code{PyMem_FREE()} due to tokenizer.c’s
@code{tok_nextc()}.

@item 
bpo-36433@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36433}: Fixed TypeError message in classmethoddescr_call.

@item 
bpo-36430@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36430}: Fix a possible reference leak in @ref{148f,,itertools.count()}.

@item 
bpo-36440@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36440}: Include node names in @code{ParserError} messages, instead of
numeric IDs. Patch by A. Skrobov.

@item 
bpo-36143@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36143}: Regenerate @ref{88,,keyword} from the Grammar and Tokens file
using pgen. Patch by Pablo Galindo.

@item 
bpo-18372@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18372}: Add missing @ref{1710,,PyObject_GC_Track()} calls in the
@ref{ab,,pickle} module. Patch by Zackery Spytz.
@end itemize

@node Library<163>,Documentation<56>,Core and Builtins<160>,Python 3 8 0 alpha 4
@anchor{whatsnew/changelog id754}@anchor{1e25}
@subsubsection Library



@itemize -

@item 
bpo-35952@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35952}: Fix pythoninfo when the compiler is missing.

@item 
bpo-28238@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28238}: The @code{.find*()} methods of xml.etree.ElementTree can now
search for wildcards like @code{@{*@}tag} and @code{@{ns@}*} that match a tag in any
namespace or all tags in a namespace.  Patch by Stefan Behnel.

@item 
bpo-26978@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26978}: @code{pathlib.path.link_to()} is now implemented. It creates a
hard link pointing to a path.

@item 
bpo-1613500@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1613500}: @ref{945,,fileinput.FileInput} now uses the input file mode to
correctly set the output file mode (previously it was hardcoded to
@code{'w'})  when @code{inplace=True} is passed to its constructor.

@item 
bpo-36734@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36734}: Fix compilation of @code{faulthandler.c} on HP-UX. Initialize
@code{stack_t current_stack} to zero using @code{memset()}.

@item 
bpo-13611@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13611}: The xml.etree.ElementTree packages gained support for C14N 2.0
serialisation. Patch by Stefan Behnel.

@item 
bpo-36669@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36669}: Add missing matrix multiplication operator support to
weakref.proxy.

@item 
bpo-36676@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36676}: The XMLParser() in xml.etree.ElementTree provides namespace
prefix context to the parser target if it defines the callback methods
“start_ns()” and/or “end_ns()”. Patch by Stefan Behnel.

@item 
bpo-36673@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36673}: The TreeBuilder and XMLPullParser in xml.etree.ElementTree
gained support for parsing comments and processing instructions. Patch by
Stefan Behnel.

@item 
bpo-36650@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36650}: The C version of functools.lru_cache() was treating calls with
an empty @code{**kwargs} dictionary as being distinct from calls with no
keywords at all. This did not result in an incorrect answer, but it did
trigger an unexpected cache miss.

@item 
bpo-28552@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28552}: Fix @code{distutils.sysconfig} if @ref{3eb,,sys.executable} is
@code{None} or an empty string: use @ref{194e,,os.getcwd()} to initialize
@code{project_base}.  Fix also the distutils build command: don’t use
@code{sys.executable} if it is @code{None} or an empty string.

@item 
bpo-35755@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35755}: @ref{6dc,,shutil.which()} and @code{distutils.spawn.find_executable}
now use @code{os.confstr("CS_PATH")} if available instead of
@ref{1e26,,os.defpath}, if the @code{PATH} environment variable is not set.
Moreover, don’t use @code{os.confstr("CS_PATH")} nor @code{os.defpath} if
the @code{PATH} environment variable is set to an empty string.

@item 
bpo-25430@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25430}: improve performance of @code{IPNetwork.__contains__()}

@item 
bpo-30485@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30485}: Path expressions in xml.etree.ElementTree can now avoid
explicit namespace prefixes for tags (or the “@{namespace@}tag” notation) by
passing a default namespace with an empty string prefix.

@item 
bpo-36613@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36613}: Fix @ref{b,,asyncio} wait() not removing callback if exception

@item 
bpo-36598@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36598}: Fix @code{isinstance} check for Mock objects with spec when the
code is executed under tracing. Patch by Karthikeyan Singaravelan.

@item 
bpo-18748@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18748}: In development mode (@ref{170,,-X} @code{dev}) and in debug build,
the @ref{506,,io.IOBase} destructor now logs @code{close()} exceptions. These
exceptions are silent by default in release mode.

@item 
bpo-36575@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36575}: The @code{_lsprof} module now uses internal timer same to
@code{time.perf_counter()} by default. @code{gettimeofday(2)} was used on Unix.
New timer has better resolution on most Unix platforms and timings are no
longer impacted by system clock updates since @code{perf_counter()} is
monotonic. Patch by Inada Naoki.

@item 
bpo-33461@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33461}: @code{json.loads} now emits @code{DeprecationWarning} when
@code{encoding} option is specified.  Patch by Matthias Bussonnier.

@item 
bpo-36559@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36559}: The random module now prefers the lean internal _sha512 module
over hashlib for seed(version=2) to optimize import time.

@item 
bpo-17561@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17561}: Set backlog=None as the default for socket.create_server.

@item 
bpo-34373@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34373}: Fix @ref{13f4,,time.mktime()} error handling on AIX for year before
1970.

@item 
bpo-36232@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36232}: Improve error message when trying to open existing DBM database
that actually doesn’t exist. Patch by Marco Rougeth.

@item 
bpo-36546@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36546}: Add statistics.quantiles()

@item 
bpo-36050@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36050}: Optimized @code{http.client.HTTPResponse.read()} for large
response. Patch by Inada Naoki.

@item 
bpo-36522@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36522}: If `debuglevel' is set to >0 in @ref{73,,http.client}, print all
values for headers with multiple values for the same header name. Patch by
Matt Houglum.

@item 
bpo-36492@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36492}: Deprecated passing required arguments like `func' as keyword
arguments in functions which should accept arbitrary keyword arguments and
pass them to other function. Arbitrary keyword arguments (even with names
“self” and “func”) can now be passed to these functions if the required
arguments are passed as positional arguments.

@item 
bpo-27181@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27181}: Add statistics.geometric_mean().

@item 
bpo-30427@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30427}: @code{os.path.normcase()} relies on @code{os.fspath()} to check the
type of its argument. Redundant checks have been removed from its
@code{posixpath.normcase()} and @code{ntpath.normcase()} implementations. Patch
by Wolfgang Maier.

@item 
bpo-36385@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36385}: Stop rejecting IPv4 octets for being ambiguously octal. Leading
zeros are ignored, and no longer are assumed to specify octal octets.
Octets are always decimal numbers. Octets must still be no more than three
digits, including leading zeroes.

@item 
bpo-36434@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36434}: Errors during writing to a ZIP file no longer prevent to
properly close it.

@item 
bpo-36407@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36407}: Fixed wrong indentation writing for CDATA section in
xml.dom.minidom. Patch by Vladimir Surjaninov.

@item 
bpo-36326@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36326}: inspect.getdoc() can now find docstrings for member objects
when __slots__ is a dictionary.

@item 
bpo-36366@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36366}: Calling @code{stop()} on an unstarted or stopped
@ref{1098,,unittest.mock.patch()} object will now return @code{None} instead of
raising @ref{246,,RuntimeError}, making the method idempotent. Patch by
Karthikeyan Singaravelan.

@item 
bpo-36348@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36348}: The @code{imap.IMAP4.logout()} method no longer ignores silently
arbitrary exceptions.

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: Add time module support and fix test_time failures for VxWorks.

@item 
bpo-36227@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36227}: Added support for keyword arguments @code{default_namespace} and
@code{xml_declaration} in functions @code{ElementTree.tostring()} and
@code{ElementTree.tostringlist()}.

@item 
bpo-36004@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36004}: Added new alternate constructors
@ref{be5,,datetime.date.fromisocalendar()} and
@ref{be6,,datetime.datetime.fromisocalendar()}, which construct date objects
from ISO year, week number and weekday; these are the inverse of each
class’s @code{isocalendar} method. Patch by Paul Ganssle.

@item 
bpo-35936@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35936}: @ref{95,,modulefinder} no longer depends on the deprecated
@ref{7a,,imp} module, and the initializer for
@ref{1e27,,modulefinder.ModuleFinder} now has immutable default arguments.
Patch by Brandt Bucher.

@item 
bpo-35376@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35376}: @ref{95,,modulefinder} correctly handles modules that have the
same name as a bad package. Patch by Brandt Bucher.

@item 
bpo-17396@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17396}: @ref{95,,modulefinder} no longer crashes when encountering syntax
errors in followed imports. Patch by Brandt Bucher.

@item 
bpo-35934@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35934}: Added @ref{c26,,create_server()} and
@ref{c27,,has_dualstack_ipv6()} convenience functions to automate the
necessary tasks usually involved when creating a server socket, including
accepting both IPv4 and IPv6 connections on the same socket.  (Contributed
by Giampaolo Rodola in bpo-17561@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17561}.)

@item 
bpo-23078@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23078}: Add support for @ref{48f,,classmethod()} and @ref{451,,staticmethod()} to
@ref{1978,,unittest.mock.create_autospec()}.  Initial patch by Felipe Ochoa.

@item 
bpo-35416@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35416}: Fix potential resource warnings in distutils. Patch by Mickaël
Schoentgen.

@item 
bpo-25451@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25451}: Add transparency methods to @ref{1e28,,tkinter.PhotoImage}.  Patch
by Zackery Spytz.

@item 
bpo-35082@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35082}: Don’t return deleted attributes when calling dir on a
@ref{c45,,unittest.mock.Mock}.

@item 
bpo-34547@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34547}: @ref{1e15,,wsgiref.handlers.BaseHandler} now handles abrupt client
connection terminations gracefully. Patch by Petter Strandmark.

@item 
bpo-31658@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31658}: @ref{1e29,,xml.sax.parse()} now supports @ref{5a1,,path-like}. Patch by Mickaël Schoentgen.

@item 
bpo-34139@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34139}: Remove stale unix datagram socket before binding

@item 
bpo-33530@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33530}: Implemented Happy Eyeballs in @code{asyncio.create_connection()}.
Added two new arguments, `happy_eyeballs_delay' and `interleave', to
specify Happy Eyeballs behavior.

@item 
bpo-33291@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33291}: Do not raise AttributeError when calling the inspect functions
isgeneratorfunction, iscoroutinefunction, isasyncgenfunction on a method
created from an arbitrary callable. Instead, return False.

@item 
bpo-31310@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31310}: Fix the multiprocessing.semaphore_tracker so it is reused by
child processes

@item 
bpo-31292@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31292}: Fix @code{setup.py check --restructuredtext} for files containing
@code{include} directives.
@end itemize

@node Documentation<56>,Tests<55>,Library<163>,Python 3 8 0 alpha 4
@anchor{whatsnew/changelog id755}@anchor{1e2a}
@subsubsection Documentation



@itemize -

@item 
bpo-36625@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36625}: Remove obsolete comments from docstrings in fractions.Fraction

@item 
bpo-30840@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30840}: Document relative imports

@item 
bpo-36523@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36523}: Add docstring for io.IOBase.writelines().

@item 
bpo-36425@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36425}: New documentation translation: Simplified Chinese@footnote{https://docs.python.org/zh-cn/}.

@item 
bpo-36345@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36345}: Avoid the duplication of code from @code{Tools/scripts/serve.py}
in using the @code{literalinclude} directive for the basic
wsgiref-based web server in the documentation of @ref{11f,,wsgiref}.
Contributed by Stéphane Wirtel.

@item 
bpo-36345@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36345}: Using the code of the @code{Tools/scripts/serve.py} script as an
example in the @ref{11f,,wsgiref} documentation.  Contributed by Stéphane
Wirtel.

@item 
bpo-36157@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36157}: Added documentation for PyInterpreterState_Main().

@item 
bpo-33043@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33043}: Updates the docs.python.org page with the addition of a
‘Contributing to Docs’ link at the end of the page (between ‘Reporting
Bugs’ and ‘About Documentation’). Updates the ‘Found a Bug’ page with
additional links and information in the Documentation Bugs section.

@item 
bpo-35581@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35581}: @@typing.type_check_only now allows type stubs to mark functions
and classes not available during runtime.

@item 
bpo-33832@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33832}: Add glossary entry for ‘magic method’.

@item 
bpo-32913@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32913}: Added re.Match.groupdict example to regex HOWTO.
@end itemize

@node Tests<55>,Build<63>,Documentation<56>,Python 3 8 0 alpha 4
@anchor{whatsnew/changelog id756}@anchor{1e2b}
@subsubsection Tests



@itemize -

@item 
bpo-36719@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36719}: regrtest now always detects uncollectable objects. Previously,
the check was only enabled by @code{--findleaks}. The check now also works
with @code{-jN/--multiprocess N}. @code{--findleaks} becomes a deprecated alias
to @code{--fail-env-changed}.

@item 
bpo-36725@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36725}: When using multiprocessing mode (-jN), regrtest now better
reports errors if a worker process fails, and it exits immediately on a
worker thread failure or when interrupted.

@item 
bpo-36454@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36454}: Change test_time.test_monotonic() to test only the lower bound
of elapsed time after a sleep command rather than the upper bound. This
prevents unnecessary test failures on slow buildbots. Patch by Victor
Stinner.

@item 
bpo-32424@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32424}: Improve test coverage for xml.etree.ElementTree. Patch by
Gordon P. Hemsley.

@item 
bpo-32424@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32424}: Fix typo in test_cyclic_gc() test for xml.etree.ElementTree.
Patch by Gordon P. Hemsley.

@item 
bpo-36635@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36635}: Add a new @code{_testinternalcapi} module to test the internal
C API.

@item 
bpo-36629@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36629}: Fix @code{test_imap4_host_default_value()} of @code{test_imaplib}:
catch also @ref{1e2c,,errno.ENETUNREACH} error.

@item 
bpo-36611@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36611}: Fix @code{test_sys.test_getallocatedblocks()} when
@ref{106,,tracemalloc} is enabled.

@item 
bpo-36560@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36560}: Fix reference leak hunting in regrtest: compute also deltas (of
reference count, allocated memory blocks, file descriptor count) during
warmup, to ensure that everything is initialized before starting to hunt
reference leaks.

@item 
bpo-36565@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36565}: Fix reference hunting (@code{python3 -m test -R 3:3}) when Python
has no built-in abc module.

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: Port test_resource to VxWorks: skip tests cases setting
RLIMIT_FSIZE and RLIMIT_CPU.

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: Fix test_tabnanny on VxWorks: adjust ENOENT error message.

@item 
bpo-36436@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36436}: Fix @code{_testcapi.pymem_buffer_overflow()}: handle memory
allocation failure.

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: Fix test_utf8_mode on VxWorks: Python always use UTF-8 on
VxWorks.

@item 
bpo-36341@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36341}: Fix tests that may fail with PermissionError upon calling
bind() on AF_UNIX sockets.
@end itemize

@node Build<63>,Windows<54>,Tests<55>,Python 3 8 0 alpha 4
@anchor{whatsnew/changelog id757}@anchor{1e2d}
@subsubsection Build



@itemize -

@item 
bpo-36747@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36747}: Remove the stale scriptsinstall Makefile target.

@item 
bpo-21536@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21536}: On Unix, C extensions are no longer linked to libpython except
on Android and Cygwin.

It is now possible for a statically linked Python to load a C extension
built using a shared library Python.

When Python is embedded, @code{libpython} must not be loaded with
@code{RTLD_LOCAL}, but @code{RTLD_GLOBAL} instead. Previously, using
@code{RTLD_LOCAL}, it was already not possible to load C extensions which
were not linked to @code{libpython}, such as C extensions of the standard
library built by the @code{*shared*} section of @code{Modules/Setup}.

distutils, python-config and python-config.py have been modified.

@item 
bpo-36707@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36707}: @code{./configure --with-pymalloc} no longer adds the @code{m} flag
to SOABI (sys.implementation.cache_tag). Enabling or disabling pymalloc
has no impact on the ABI.

@item 
bpo-36635@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36635}: Change @code{PyAPI_FUNC(type)}, @code{PyAPI_DATA(type)} and
@code{PyMODINIT_FUNC} macros of @code{pyport.h} when @code{Py_BUILD_CORE_MODULE} is
defined. The @code{Py_BUILD_CORE_MODULE} define must be now be used to build
a C extension as a dynamic library accessing Python internals: export the
@code{PyInit_@var{xxx}()} function in DLL exports on Windows.

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: Don’t build the @code{_crypt} extension on VxWorks.

@item 
bpo-36618@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36618}: Add @code{-fmax-type-align=8} to CFLAGS when clang compiler is
detected. The pymalloc memory allocator aligns memory on 8 bytes. On
x86-64, clang expects alignment on 16 bytes by default and so uses MOVAPS
instruction which can lead to segmentation fault. Instruct clang that
Python is limited to alignment on 8 bytes to use MOVUPS instruction
instead: slower but don’t trigger a SIGSEGV if the memory is not aligned
on 16 bytes. Sadly, the flag must be added to @code{CFLAGS} and not just
@code{CFLAGS_NODIST}, since third party C extensions can have the same issue.

@item 
bpo-36605@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36605}: @code{make tags} and @code{make TAGS} now also parse
@code{Modules/_io/*.c} and @code{Modules/_io/*.h}.

@item 
bpo-36465@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36465}: Release builds and debug builds are now ABI compatible:
defining the @code{Py_DEBUG} macro no longer implies the @code{Py_TRACE_REFS}
macro, which introduces the only ABI incompatibility. The
@code{Py_TRACE_REFS} macro, which adds the @ref{290,,sys.getobjects()} function
and the 
@geindex PYTHONDUMPREFS
@geindex environment variable; PYTHONDUMPREFS
@ref{ba4,,PYTHONDUMPREFS} environment variable, can be set using
the new @code{./configure --with-trace-refs} build option.

@item 
bpo-36577@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36577}: setup.py now correctly reports missing OpenSSL headers and
libraries again.

@item 
bpo-36544@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36544}: Fix regression introduced in bpo-36146@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36146} refactoring setup.py

@item 
bpo-36508@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36508}: @code{python-config --ldflags} no longer includes flags of the
@code{LINKFORSHARED} variable. The @code{LINKFORSHARED} variable must only be
used to build executables.

@item 
bpo-36503@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36503}: Remove references to “aix3” and “aix4”. Patch by M. Felt.
@end itemize

@node Windows<54>,macOS<44>,Build<63>,Python 3 8 0 alpha 4
@anchor{whatsnew/changelog id758}@anchor{1e2e}
@subsubsection Windows



@itemize -

@item 
bpo-35920@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35920}: Added platform.win32_edition() and platform.win32_is_iot().
Added support for cross-compiling packages for Windows ARM32. Skip tests
that are not expected to work on Windows IoT Core ARM32.

@item 
bpo-36649@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36649}: Remove trailing spaces for registry keys when installed via the
Store.

@item 
bpo-34144@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34144}: Fixed activate.bat to correctly update codepage when chcp.com
returns dots in output. Patch by Lorenz Mende.

@item 
bpo-36509@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36509}: Added preset-iot layout for Windows IoT ARM containers. This
layout doesn’t contain UI components like tkinter or IDLE. It also doesn’t
contain files to support on-target builds since Windows ARM32 builds must
be cross-compiled when using MSVC.

@item 
bpo-35941@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35941}: enum_certificates function of the ssl module now returns
certificates from all available certificate stores inside windows in a
query instead of returning only certificates from the system wide
certificate store. This includes certificates from these certificate
stores: local machine, local machine enterprise, local machine group
policy, current user, current user group policy, services, users.
ssl.enum_crls() function is changed in the same way to return all
certificate revocation lists inside the windows certificate revocation
list stores.

@item 
bpo-36441@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36441}: Fixes creating a venv when debug binaries are installed.

@item 
bpo-36085@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36085}: Enable better DLL resolution on Windows by using safe DLL
search paths and adding @ref{be3,,os.add_dll_directory()}.

@item 
bpo-36010@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36010}: Add the venv standard library module to the nuget distribution
for Windows.

@item 
bpo-29515@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29515}: Add the following socket module constants on Windows:
IPPROTO_AH IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_ESP
IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_HOPOPTS IPPROTO_ICLFXBM
IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGMP IPPROTO_IGP IPPROTO_IPV4
IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_ND IPPROTO_NONE IPPROTO_PGM
IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_SCTP
IPPROTO_ST

@item 
bpo-35947@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35947}: Added current version of libffi to cpython-source-deps. Change
_ctypes to use current version of libffi on Windows.

@item 
bpo-34060@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34060}: Report system load when running test suite on Windows. Patch by
Ammar Askar. Based on prior work by Jeremy Kloth.

@item 
bpo-31512@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31512}: With the Windows 10 Creators Update, non-elevated users can now
create symlinks as long as the computer has Developer Mode enabled.
@end itemize

@node macOS<44>,IDLE<35>,Windows<54>,Python 3 8 0 alpha 4
@anchor{whatsnew/changelog id759}@anchor{1e2f}
@subsubsection macOS



@itemize -

@item 
bpo-34602@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34602}: Avoid failures setting macOS stack resource limit with
resource.setrlimit. This reverts an earlier fix for bpo-18075@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18075} which forced
a non-default stack size when building the interpreter executable on
macOS.
@end itemize

@node IDLE<35>,Tools/Demos<35>,macOS<44>,Python 3 8 0 alpha 4
@anchor{whatsnew/changelog id760}@anchor{1e30}
@subsubsection IDLE



@itemize -

@item 
bpo-36429@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36429}: Fix starting IDLE with pyshell. Add idlelib.pyshell alias at
top; remove pyshell alias at bottom. Remove obsolete __name__==’__main__’
command.
@end itemize

@node Tools/Demos<35>,C API<57>,IDLE<35>,Python 3 8 0 alpha 4
@anchor{whatsnew/changelog id761}@anchor{1e31}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-14546@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14546}: Fix the argument handling in Tools/scripts/lll.py.
@end itemize

@node C API<57>,,Tools/Demos<35>,Python 3 8 0 alpha 4
@anchor{whatsnew/changelog id762}@anchor{1e32}
@subsubsection C API



@itemize -

@item 
bpo-36763@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36763}: Fix memory leak in @code{Py_SetStandardStreamEncoding()}:
release memory if the function is called twice.

@item 
bpo-36641@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36641}: @ref{1e33,,PyDoc_VAR}(name) and @ref{1d9f,,PyDoc_STRVAR}(name, str)
now create @code{static const char name[]} instead of @code{static char name[]}.
Patch by Inada Naoki.

@item 
bpo-36389@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36389}: Change the value of @code{CLEANBYTE}, @code{DEADDYTE} and
@code{FORBIDDENBYTE} internal constants used by debug hooks on Python memory
allocators (@ref{e6a,,PyMem_SetupDebugHooks()} function). Byte patterns
@code{0xCB}, @code{0xDB} and @code{0xFB} have been replaced with @code{0xCD}, @code{0xDD}
and @code{0xFD} to use the same values than Windows CRT debug @code{malloc()}
and @code{free()}.

@item 
bpo-36443@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36443}: Since Python 3.7.0, calling @ref{dc6,,Py_DecodeLocale()} before
@ref{45e,,Py_Initialize()} produces mojibake if the @code{LC_CTYPE} locale is
coerced and/or if the UTF-8 Mode is enabled by the user configuration. The
LC_CTYPE coercion and UTF-8 Mode are now disabled by default to fix the
mojibake issue. They must now be enabled explicitly (opt-in) using the new
@code{_Py_PreInitialize()} API with @code{_PyPreConfig}.

@item 
bpo-36025@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36025}: Fixed an accidental change to the datetime C API where the
arguments to the @ref{1e34,,PyDate_FromTimestamp()} function were incorrectly
interpreted as a single timestamp rather than an arguments tuple, which
causes existing code to start raising @ref{199,,TypeError}. The
backwards-incompatible change was only present in alpha releases of Python
3.8. Patch by Paul Ganssle.

@item 
bpo-35810@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35810}: Modify @code{PyObject_Init} to correctly increase the refcount of
heap-allocated Type objects. Also fix the refcounts of the heap-allocated
types that were either doing this manually or not decreasing the type’s
refcount in tp_dealloc
@end itemize

@node Python 3 8 0 alpha 3,Python 3 8 0 alpha 2,Python 3 8 0 alpha 4,Changelog
@anchor{whatsnew/changelog python-3-8-0-alpha-3}@anchor{1e35}
@subsection Python 3.8.0 alpha 3


`Release date: 2019-03-25'

@menu
* Security: Security<49>. 
* Core and Builtins: Core and Builtins<161>. 
* Library: Library<164>. 
* Documentation: Documentation<57>. 
* Tests: Tests<56>. 
* Build: Build<64>. 
* Windows: Windows<55>. 
* IDLE: IDLE<36>. 
* Tools/Demos: Tools/Demos<36>. 
* C API: C API<58>. 

@end menu

@node Security<49>,Core and Builtins<161>,,Python 3 8 0 alpha 3
@anchor{whatsnew/changelog id763}@anchor{1e36}
@subsubsection Security



@itemize -

@item 
bpo-36216@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36216}: Changes urlsplit() to raise ValueError when the URL contains
characters that decompose under IDNA encoding (NFKC-normalization) into
characters that affect how the URL is parsed.

@item 
bpo-35121@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35121}: Don’t send cookies of domain A without Domain attribute to
domain B when domain A is a suffix match of domain B while using a
cookiejar with @ref{1e37,,http.cookiejar.DefaultCookiePolicy} policy. Patch
by Karthikeyan Singaravelan.
@end itemize

@node Core and Builtins<161>,Library<164>,Security<49>,Python 3 8 0 alpha 3
@anchor{whatsnew/changelog id764}@anchor{1e38}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-36421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36421}: Fix a possible double decref in _ctypes.c’s
@code{PyCArrayType_new()}.

@item 
bpo-36412@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36412}: Fix a possible crash when creating a new dictionary.

@item 
bpo-36398@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36398}: Fix a possible crash in @code{structseq_repr()}.

@item 
bpo-36256@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36256}: Fix bug in parsermodule when parsing a state in a DFA that has
two or more arcs with labels of the same type. Patch by Pablo Galindo.

@item 
bpo-36365@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36365}: repr(structseq) is no longer limited to 512 bytes.

@item 
bpo-36374@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36374}: Fix a possible null pointer dereference in
@code{merge_consts_recursive()}. Patch by Zackery Spytz.

@item 
bpo-36236@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36236}: At Python initialization, the current directory is no longer
prepended to @ref{3e2,,sys.path} if it has been removed.

@item 
bpo-36352@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36352}: Python initialization now fails with an error, rather than
silently truncating paths, if a path is too long.

@item 
bpo-36301@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36301}: Python initialization now fails if decoding @code{pybuilddir.txt}
configuration file fails at startup.

@item 
bpo-36333@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36333}: Fix leak in _PyRuntimeState_Fini. Contributed by Stéphane
Wirtel.

@item 
bpo-36332@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36332}: The builtin @ref{4b2,,compile()} can now handle AST objects that
contain assignment expressions. Patch by Pablo Galindo.

@item 
bpo-36282@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36282}: Improved error message for too much positional arguments in
some builtin functions.

@item 
bpo-30040@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30040}: New empty dict uses fewer memory for now.  It used more memory
than empty dict created by @code{dict.clear()}.  And empty dict creation and
deletion is about 2x faster.  Patch by Inada Naoki.

@item 
bpo-36262@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36262}: Fix an unlikely memory leak on conversion from string to float
in the function @code{_Py_dg_strtod()} used by @code{float(str)},
@code{complex(str)}, @ref{f12,,pickle.load()}, @ref{1e39,,marshal.load()}, etc.

@item 
bpo-36252@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36252}: Update Unicode databases to version 12.0.0.

@item 
bpo-36218@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36218}: Fix a segfault occurring when sorting a list of heterogeneous
values. Patch contributed by Rémi Lapeyre and Elliot Gorokhovsky.

@item 
bpo-36188@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36188}: Cleaned up left-over vestiges of Python 2 unbound method
handling in method objects and documentation. Patch by Martijn Pieters

@item 
bpo-36124@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36124}: Add a new interpreter-specific dict and expose it in the C-API
via PyInterpreterState_GetDict().  This parallels PyThreadState_GetDict().
However, extension modules should continue using PyModule_GetState() for
their own internal per-interpreter state.

@item 
bpo-35975@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35975}: Add a @code{feature_version} flag to @code{ast.parse()} (documented)
and @code{compile()} (hidden) that allows tweaking the parser to support
older versions of the grammar. In particular, if @code{feature_version} is 5
or 6, the hacks for the @code{async} and @code{await} keyword from PEP 492 are
reinstated. (For 7 or higher, these are unconditionally treated as
keywords, but they are still special tokens rather than @code{NAME} tokens
that the parser driver recognizes.)

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: Use UTF-8 as the system encoding on VxWorks.

@item 
bpo-36048@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36048}: The @ref{19f,,__index__()} special method will be used
instead of @ref{19e,,__int__()} for implicit conversion of Python
numbers to C integers.  Using the @code{__int__()} method in implicit
conversions has been deprecated.

@item 
bpo-35808@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35808}: Retire pgen and use a modified version of pgen2 to generate the
parser. Patch by Pablo Galindo.
@end itemize

@node Library<164>,Documentation<57>,Core and Builtins<161>,Python 3 8 0 alpha 3
@anchor{whatsnew/changelog id765}@anchor{1e3a}
@subsubsection Library



@itemize -

@item 
bpo-36401@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36401}: The class documentation created by pydoc now has a separate
section for readonly properties.

@item 
bpo-36320@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36320}: The typing.NamedTuple() class has deprecated the _field_types
attribute in favor of the __annotations__ attribute which carried the same
information. Also, both attributes were converted from OrderedDict to a
regular dict.

@item 
bpo-34745@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34745}: Fix @ref{b,,asyncio} ssl memory issues caused by circular
references

@item 
bpo-36324@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36324}: Add method to statistics.NormalDist for computing the inverse
cumulative normal distribution.

@item 
bpo-36321@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36321}: collections.namedtuple() misspelled the name of an attribute.
To be consistent with typing.NamedTuple, the attribute name should have
been “_field_defaults” instead of “_fields_defaults”.  For backwards
compatibility, both spellings are now created.  The misspelled version may
be removed in the future.

@item 
bpo-36297@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36297}: “unicode_internal” codec is removed.  It was deprecated since
Python 3.3. Patch by Inada Naoki.

@item 
bpo-36298@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36298}: Raise ModuleNotFoundError in pyclbr when a module can’t be
found. Thanks to ‘mental’ for the bug report.

@item 
bpo-36268@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36268}: Switch the default format used for writing tars with
@ref{e4,,tarfile} to the modern POSIX.1-2001 pax standard, from the
vendor-specific GNU. Contributed by C.A.M. Gerlach.

@item 
bpo-36285@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36285}: Fix integer overflows in the array module. Patch by Stephan
Hohe.

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: Add _signal module support for VxWorks.

@item 
bpo-36272@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36272}: @ref{8b,,logging} does not silently ignore RecursionError anymore.
Patch contributed by Rémi Lapeyre.

@item 
bpo-36280@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36280}: Add a kind field to ast.Constant. It is ‘u’ if the literal has
a ‘u’ prefix (i.e. a Python 2 style unicode literal), else None.

@item 
bpo-35931@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35931}: The @ref{aa,,pdb} @code{debug} command now gracefully handles all
exceptions.

@item 
bpo-36251@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36251}: Fix format strings used for stderrprinter and re.Match reprs.
Patch by Stephan Hohe.

@item 
bpo-36235@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36235}: Fix @code{CFLAGS} in @code{customize_compiler()} of
@code{distutils.sysconfig}: when the @code{CFLAGS} environment variable is
defined, don’t override @code{CFLAGS} variable with the @code{OPT} variable
anymore. Initial patch written by David Malcolm.

@item 
bpo-35807@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35807}: Update ensurepip to install pip 19.0.3 and setuptools 40.8.0.

@item 
bpo-36139@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36139}: Release GIL when closing @ref{51a,,mmap} objects.

@item 
bpo-36179@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36179}: Fix two unlikely reference leaks in _hashopenssl. The leaks
only occur in out-of-memory cases.

@item 
bpo-36169@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36169}: Add overlap() method to statistics.NormalDist.  Computes the
overlapping coefficient for two normal distributions.

@item 
bpo-36103@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36103}: Default buffer size used by @code{shutil.copyfileobj()} is changed
from 16 KiB to 64 KiB on non-Windows platform to reduce system call
overhead. Contributed by Inada Naoki.

@item 
bpo-36130@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36130}: Fix @code{pdb} with @code{skip=...} when stepping into a frame
without a @code{__name__} global.  Patch by Anthony Sottile.

@item 
bpo-35652@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35652}: shutil.copytree(copy_function=…) erroneously pass DirEntry
instead of a path string.

@item 
bpo-35178@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35178}: Ensure custom @ref{1e3b,,warnings.formatwarning()} function can
receive @code{line} as positional argument. Based on patch by Tashrif Billah.

@item 
bpo-36106@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36106}: Resolve potential name clash with libm’s sinpi(). Patch by
Dmitrii Pasechnik.

@item 
bpo-36091@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36091}: Clean up reference to async generator in Lib/types. Patch by
Henry Chen.

@item 
bpo-36043@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36043}: @code{FileCookieJar} supports @ref{5a1,,path-like object}.
Contributed by Stéphane Wirtel

@item 
bpo-35899@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35899}: Enum has been fixed to correctly handle empty strings and
strings with non-Latin characters (ie. ‘α’, ‘א’) without crashing.
Original patch contributed by Maxwell. Assisted by Stéphane Wirtel.

@item 
bpo-21269@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21269}: Add @code{args} and @code{kwargs} properties to mock call objects.
Contributed by Kumar Akshay.

@item 
bpo-30670@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30670}: @code{pprint.pp} has been added to pretty-print objects with
dictionary keys being sorted with their insertion order by default.
Parameter `sort_dicts' has been added to @code{pprint.pprint},
@code{pprint.pformat} and @code{pprint.PrettyPrinter}. Contributed by Rémi
Lapeyre.

@item 
bpo-35843@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35843}: Implement @code{__getitem__} for @code{_NamespacePath}.  Patch by
Anthony Sottile.

@item 
bpo-35802@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35802}: Clean up code which checked presence of @code{os.stat} /
@code{os.lstat} / @code{os.chmod} which are always present.  Patch by Anthony
Sottile.

@item 
bpo-35715@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35715}: Librates the return value of a ProcessPoolExecutor
_process_worker after it’s no longer needed to free memory

@item 
bpo-35493@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35493}: Use @ref{12eb,,multiprocessing.connection.wait()} instead of polling
each 0.2 seconds for worker updates in @code{multiprocessing.Pool}.
Patch by Pablo Galindo.

@item 
bpo-35661@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35661}: Store the venv prompt in pyvenv.cfg.

@item 
bpo-35121@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35121}: Don’t set cookie for a request when the request path is a
prefix match of the cookie’s path attribute but doesn’t end with “/”.
Patch by Karthikeyan Singaravelan.

@item 
bpo-21478@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21478}: Calls to a child function created with
@ref{1978,,unittest.mock.create_autospec()} should propagate to the parent.
Patch by Karthikeyan Singaravelan.

@item 
bpo-35198@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35198}: Fix C++ extension compilation on AIX
@end itemize

@node Documentation<57>,Tests<56>,Library<164>,Python 3 8 0 alpha 3
@anchor{whatsnew/changelog id766}@anchor{1e3c}
@subsubsection Documentation



@itemize -

@item 
bpo-36329@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36329}: Declare the path of the Python binary for the usage of
@code{Tools/scripts/serve.py} when executing @code{make -C Doc/ serve}.
Contributed by Stéphane Wirtel

@item 
bpo-36138@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36138}: Improve documentation about converting datetime.timedelta to
scalars.

@item 
bpo-21314@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21314}: A new entry was added to the Core Language Section of the
Programming FAQ, which explaines the usage of slash(/) in the signature of
a function. Patch by Lysandros Nikolaou
@end itemize

@node Tests<56>,Build<64>,Documentation<57>,Python 3 8 0 alpha 3
@anchor{whatsnew/changelog id767}@anchor{1e3d}
@subsubsection Tests



@itemize -

@item 
bpo-36234@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36234}: test_posix.PosixUidGidTests: add tests for invalid uid/gid type
(str). Initial patch written by David Malcolm.

@item 
bpo-29571@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29571}: Fix @code{test_re.test_locale_flag()}:  use
@code{locale.getpreferredencoding()} rather than @code{locale.getlocale()} to
get the locale encoding. With some locales, @code{locale.getlocale()} returns
the wrong encoding.

@item 
bpo-36123@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36123}: Fix race condition in test_socket.
@end itemize

@node Build<64>,Windows<55>,Tests<56>,Python 3 8 0 alpha 3
@anchor{whatsnew/changelog id768}@anchor{1e3e}
@subsubsection Build



@itemize -

@item 
bpo-36356@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36356}: Fix leaks that led to build failure when configured with
address sanitizer.

@item 
bpo-36146@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36146}: Add @code{TEST_EXTENSIONS} constant to @code{setup.py} to allow to
not build test extensions like @code{_testcapi}.

@item 
bpo-36146@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36146}: Fix setup.py on macOS: only add @code{/usr/include/ffi} to include
directories of _ctypes, not for all extensions.

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: Enable build system to cross-build for VxWorks RTOS.
@end itemize

@node Windows<55>,IDLE<36>,Build<64>,Python 3 8 0 alpha 3
@anchor{whatsnew/changelog id769}@anchor{1e3f}
@subsubsection Windows



@itemize -

@item 
bpo-36312@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36312}: Fixed decoders for the following code pages: 50220, 50221,
50222, 50225, 50227, 50229, 57002 through 57011, 65000 and 42.

@item 
bpo-36264@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36264}: Don’t honor POSIX @code{HOME} in @code{os.path.expanduser} on
windows.  Patch by Anthony Sottile.

@item 
bpo-24643@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24643}: Fix name collisions due to @code{#define timezone _timezone} in
PC/pyconfig.h.
@end itemize

@node IDLE<36>,Tools/Demos<36>,Windows<55>,Python 3 8 0 alpha 3
@anchor{whatsnew/changelog id770}@anchor{1e40}
@subsubsection IDLE



@itemize -

@item 
bpo-36405@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36405}: Use dict unpacking in idlelib.

@item 
bpo-36396@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36396}: Remove fgBg param of idlelib.config.GetHighlight(). This param
was only used twice and changed the return type.

@item 
bpo-36176@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36176}: Fix IDLE autocomplete & calltip popup colors. Prevent conflicts
with Linux dark themes (and slightly darken calltip background).

@item 
bpo-23205@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23205}: For the grep module, add tests for findfiles, refactor
findfiles to be a module-level function, and refactor findfiles to use
os.walk.

@item 
bpo-23216@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23216}: Add docstrings to IDLE search modules.

@item 
bpo-36152@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36152}: Remove colorizer.ColorDelegator.close_when_done and the
corresponding argument of .close().  In IDLE, both have always been None
or False since 2007.

@item 
bpo-32129@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32129}: Avoid blurry IDLE application icon on macOS with Tk 8.6. Patch
by Kevin Walzer.

@item 
bpo-36096@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36096}: Refactor class variables to instance variables in colorizer.

@item 
bpo-30348@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30348}: Increase test coverage of idlelib.autocomplete by 30%. Patch by
Louie Lu
@end itemize

@node Tools/Demos<36>,C API<58>,IDLE<36>,Python 3 8 0 alpha 3
@anchor{whatsnew/changelog id771}@anchor{1e41}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-35132@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35132}: Fix py-list and py-bt commands of python-gdb.py on gdb7.

@item 
bpo-32217@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32217}: Fix freeze script on Windows.
@end itemize

@node C API<58>,,Tools/Demos<36>,Python 3 8 0 alpha 3
@anchor{whatsnew/changelog id772}@anchor{1e42}
@subsubsection C API



@itemize -

@item 
bpo-36381@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36381}: Raise @code{DeprecationWarning} when ‘#’ formats are used for
building or parsing values without @code{PY_SSIZE_T_CLEAN}.

@item 
bpo-36142@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36142}: The whole coreconfig.h header is now excluded from
Py_LIMITED_API. Move functions definitions into a new internal
pycore_coreconfig.h header.
@end itemize

@node Python 3 8 0 alpha 2,Python 3 8 0 alpha 1,Python 3 8 0 alpha 3,Changelog
@anchor{whatsnew/changelog python-3-8-0-alpha-2}@anchor{1e43}
@subsection Python 3.8.0 alpha 2


`Release date: 2019-02-25'

@menu
* Core and Builtins: Core and Builtins<162>. 
* Library: Library<165>. 
* Documentation: Documentation<58>. 
* Tests: Tests<57>. 
* Windows: Windows<56>. 
* IDLE: IDLE<37>. 

@end menu

@node Core and Builtins<162>,Library<165>,,Python 3 8 0 alpha 2
@anchor{whatsnew/changelog id773}@anchor{1e44}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-36052@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36052}: Raise a @ref{18f,,SyntaxError} when assigning a value to
@code{__debug__} with the Assignment Operator. Contributed by Stéphane Wirtel
and Pablo Galindo.

@item 
bpo-36012@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36012}: Doubled the speed of class variable writes.  When a non-dunder
attribute was updated, there was an unnecessary call to update slots.

@item 
bpo-35942@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35942}: The error message emitted when returning invalid types from
@code{__fspath__} in interfaces that allow passing @ref{e51,,PathLike}
objects has been improved and now it does explain the origin of the error.

@item 
bpo-36016@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36016}: @code{gc.get_objects} can now receive an optional parameter
indicating a generation to get objects from. Patch by Pablo Galindo.

@item 
bpo-1054041@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1054041}: When the main interpreter exits due to an uncaught
KeyboardInterrupt, the process now exits in the appropriate manner for its
parent process to detect that a SIGINT or ^C terminated the process.  This
allows shells and batch scripts to understand that the user has asked them
to stop.

@item 
bpo-35992@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35992}: Fix @code{__class_getitem__()} not being called on a class with a
custom non-subscriptable metaclass.

@item 
bpo-35993@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35993}: Fix a crash on fork when using subinterpreters. Contributed by
Stéphane Wirtel

@item 
bpo-35991@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35991}: Fix a potential double free in Modules/_randommodule.c.

@item 
bpo-35961@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35961}: Fix a crash in slice_richcompare(): use strong references
rather than stolen references for the two temporary internal tuples.

@item 
bpo-35911@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35911}: Enable the creation of cell objects by adding a
@code{cell.__new__} method, and expose the type @code{cell} in @code{Lib/types.py}
under the name CellType. Patch by Pierre Glaser.

@item 
bpo-12822@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12822}: Use monotonic clock for @code{pthread_cond_timedwait} when
@code{pthread_condattr_setclock} and @code{CLOCK_MONOTONIC} are available.

@item 
bpo-15248@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15248}: The compiler emits now syntax warnings in the case when a comma
is likely missed before tuple or list.

@item 
bpo-35886@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35886}: The implementation of PyInterpreterState has been moved into
the internal header files (guarded by Py_BUILD_CORE).

@item 
bpo-31506@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31506}: Clarify the errors reported when @code{object.__new__} and
@code{object.__init__} receive more than one argument. Contributed by Sanyam
Khurana.

@item 
bpo-35724@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35724}: Signal-handling is now guaranteed to happen relative to the
main interpreter.

@item 
bpo-33608@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33608}: We added a new internal _Py_AddPendingCall() that operates
relative to the provided interpreter.  This allows us to use the existing
implementation to ask another interpreter to do work that cannot be done
in the current interpreter, like decref an object the other interpreter
owns.  The existing Py_AddPendingCall() only operates relative to the main
interpreter.

@item 
bpo-33989@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33989}: Fix a possible crash in @ref{dce,,list.sort()} when sorting objects
with @code{ob_type->tp_richcompare == NULL}.  Patch by Zackery Spytz.
@end itemize

@node Library<165>,Documentation<58>,Core and Builtins<162>,Python 3 8 0 alpha 2
@anchor{whatsnew/changelog id774}@anchor{1e45}
@subsubsection Library



@itemize -

@item 
bpo-35512@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35512}: @ref{19ab,,unittest.mock.patch.dict()} used as a decorator with
string target resolves the target during function call instead of during
decorator construction. Patch by Karthikeyan Singaravelan.

@item 
bpo-36018@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36018}: Add statistics.NormalDist, a tool for creating and manipulating
normal distributions of random variable.  Features a composite class that
treats the mean and standard deviation of measurement data as single
entity.

@item 
bpo-35904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35904}: Added statistics.fmean() as a faster, floating-point variant of
the existing mean() function.

@item 
bpo-35918@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35918}: Removed broken @code{has_key} method from
multiprocessing.managers.SyncManager.dict. Contributed by Rémi Lapeyre.

@item 
bpo-18283@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18283}: Add support for bytes to @ref{6dc,,shutil.which()}.

@item 
bpo-35960@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35960}: Fix @ref{199e,,dataclasses.field()} throwing away empty mapping
objects passed as metadata.

@item 
bpo-35500@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35500}: Write expected and actual call parameters on separate lines in
@ref{1e46,,unittest.mock.Mock.assert_called_with()} assertion errors.
Contributed by Susan Su.

@item 
bpo-35931@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35931}: The @ref{aa,,pdb} @code{debug} command now gracefully handles syntax
errors.

@item 
bpo-24209@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24209}: In http.server script, rely on getaddrinfo to bind to preferred
address based on the bind parameter. Now default bind or binding to a name
may bind to IPv6 or dual-stack, depending on the environment.

@item 
bpo-35321@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35321}: Set @code{__spec__.origin} of  @code{_frozen_importlib} to frozen so
that it matches the behavior of @code{_frozen_importlib_external}.  Patch by
Nina Zakharenko.

@item 
bpo-35378@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35378}: Fix a reference issue inside @code{multiprocessing.Pool} that
caused the pool to remain alive if it was deleted without being closed or
terminated explicitly. A new strong reference is added to the pool
iterators to link the lifetime of the pool to the lifetime of its
iterators so the pool does not get destroyed if a pool iterator is still
alive.

@item 
bpo-34294@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34294}: re module, fix wrong capturing groups in rare cases.
@ref{1438,,re.search()}, @ref{1230,,re.findall()}, @ref{5a3,,re.sub()} and other functions
that scan through string looking for a match, should reset capturing
groups between two match attempts. Patch by Ma Lin.

@item 
bpo-35615@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35615}: @ref{11b,,weakref}: Fix a RuntimeError when copying a
WeakKeyDictionary or a WeakValueDictionary, due to some keys or values
disappearing while iterating.

@item 
bpo-35606@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35606}: Implement @ref{bfd,,math.prod()} as analogous function to
@ref{696,,sum()} that returns the product of a ‘start’ value (default: 1) times
an iterable of numbers. Patch by Pablo Galindo.

@item 
bpo-32417@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32417}: Performing arithmetic between @ref{4e3,,datetime.datetime}
subclasses and @ref{bc9,,datetime.timedelta} now returns an object of the
same type as the @code{datetime.datetime} subclass. As a result,
@ref{bca,,datetime.datetime.astimezone()} and alternate constructors like
@ref{712,,datetime.datetime.now()} and @code{datetime.fromtimestamp()} called
with a @code{tz} argument now `also' retain their subclass.

@item 
bpo-35153@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35153}: Add `headers' optional keyword-only parameter to
@ref{c52,,xmlrpc.client.ServerProxy}, @code{xmlrpc.client.Transport} and
@code{xmlrpc.client.SafeTransport}.  Patch by Cédric Krier.

@item 
bpo-34572@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34572}: Fix C implementation of pickle.loads to use importlib’s locking
mechanisms, and thereby avoid using partially loaded modules. Patch by Tim
Burgess.
@end itemize

@node Documentation<58>,Tests<57>,Library<165>,Python 3 8 0 alpha 2
@anchor{whatsnew/changelog id775}@anchor{1e47}
@subsubsection Documentation



@itemize -

@item 
bpo-36083@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36083}: Fix formatting of –check-hash-based-pycs options in the
manpage Synopsis.

@item 
bpo-36007@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36007}: Bump minimum sphinx version to 1.8.  Patch by Anthony Sottile.

@item 
bpo-22062@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22062}: Update documentation and docstrings for pathlib. Original patch
by Mike Short.
@end itemize

@node Tests<57>,Windows<56>,Documentation<58>,Python 3 8 0 alpha 2
@anchor{whatsnew/changelog id776}@anchor{1e48}
@subsubsection Tests



@itemize -

@item 
bpo-27313@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27313}: Avoid test_ttk_guionly ComboboxTest failure with macOS Cocoa
Tk.

@item 
bpo-36019@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36019}: Add test.support.TEST_HTTP_URL and replace references of
@indicateurl{http://www.example.com} by this new constant. Contributed by Stéphane
Wirtel.

@item 
bpo-36037@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36037}: Fix test_ssl for strict OpenSSL configuration like RHEL8 strict
crypto policy. Use older TLS version for minimum TLS version of the server
SSL context if needed, to test TLS version older than default minimum TLS
version.

@item 
bpo-35798@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35798}: Added @code{test.support.check_syntax_warning()}.

@item 
bpo-35505@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35505}: Make test_imap4_host_default_value independent on whether the
local IMAP server is running.

@item 
bpo-35917@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35917}: multiprocessing: provide unit tests for SyncManager and
SharedMemoryManager classes + all the shareable types which are supposed
to be supported by them.  (patch by Giampaolo Rodola)

@item 
bpo-35704@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35704}: Skip @code{test_shutil.test_unpack_archive_xztar} to prevent a
MemoryError on 32-bit AIX when MAXDATA setting is less than 0x20000000.

Patch by Michael Felt (aixtools)

@item 
bpo-34720@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34720}: Assert m_state != NULL to mimic GC traversal functions that do
not correctly handle module creation when the module state has not been
created.
@end itemize

@node Windows<56>,IDLE<37>,Tests<57>,Python 3 8 0 alpha 2
@anchor{whatsnew/changelog id777}@anchor{1e49}
@subsubsection Windows



@itemize -

@item 
bpo-35976@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35976}: Added ARM build support to Windows build files in PCBuild.

@item 
bpo-35692@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35692}: @code{pathlib} no longer raises when checking file and directory
existence on drives that are not ready

@item 
bpo-35872@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35872}: Uses the base Python executable when invoking venv in a virtual
environment

@item 
bpo-35873@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35873}: Prevents venv paths being inherited by child processes

@item 
bpo-35299@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35299}: Fix sysconfig detection of the source directory and distutils
handling of pyconfig.h during PGO profiling
@end itemize

@node IDLE<37>,,Windows<56>,Python 3 8 0 alpha 2
@anchor{whatsnew/changelog id778}@anchor{1e4a}
@subsubsection IDLE



@itemize -

@item 
bpo-24310@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24310}: IDLE – Document settings dialog font tab sample.

@item 
bpo-35833@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35833}: Revise IDLE doc for control codes sent to Shell. Add a code
example block.

@item 
bpo-35689@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35689}: Add docstrings and unittests for colorizer.py.
@end itemize

@node Python 3 8 0 alpha 1,Python 3 7 0 final,Python 3 8 0 alpha 2,Changelog
@anchor{whatsnew/changelog python-3-8-0-alpha-1}@anchor{1e4b}
@subsection Python 3.8.0 alpha 1


`Release date: 2019-02-03'

@menu
* Security: Security<50>. 
* Core and Builtins: Core and Builtins<163>. 
* Library: Library<166>. 
* Documentation: Documentation<59>. 
* Tests: Tests<58>. 
* Build: Build<65>. 
* Windows: Windows<57>. 
* macOS: macOS<45>. 
* IDLE: IDLE<38>. 
* Tools/Demos: Tools/Demos<37>. 
* C API: C API<59>. 

@end menu

@node Security<50>,Core and Builtins<163>,,Python 3 8 0 alpha 1
@anchor{whatsnew/changelog id779}@anchor{1e4c}
@subsubsection Security



@itemize -

@item 
bpo-35746@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35746}: 
@geindex Common Vulnerabilities and Exposures; CVE 2019-5010
CVE 2019-5010@footnote{https://www.cve.org/CVERecord?id=CVE-2019-5010}: Fix a NULL pointer deref in ssl module. The
cert parser did not handle CRL distribution points with empty DP or URI
correctly. A malicious or buggy certificate can result into segfault.
Vulnerability (TALOS-2018-0758) reported by Colin Read and Nicolas Edet of
Cisco.

@item 
bpo-34812@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34812}: The @ref{b5d,,-I} command line option (run Python in isolated
mode) is now also copied by the @ref{98,,multiprocessing} and @code{distutils}
modules when spawning child processes. Previously, only @ref{b5c,,-E} and
@ref{159a,,-s} options (enabled by @code{-I}) were copied.

@item 
bpo-34791@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34791}: The xml.sax and xml.dom.domreg no longer use environment
variables to override parser implementations when
sys.flags.ignore_environment is set by -E or -I arguments.

@item 
bpo-17239@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17239}: The xml.sax and xml.dom.minidom parsers no longer processes
external entities by default. External DTD and ENTITY declarations no
longer load files or create network connections.

@item 
bpo-34623@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34623}: 
@geindex Common Vulnerabilities and Exposures; CVE 2018-14647
CVE 2018-14647@footnote{https://www.cve.org/CVERecord?id=CVE-2018-14647}: The C accelerated _elementtree module now
initializes hash randomization salt from _Py_HashSecret instead of
libexpat’s default CSPRNG.

@item 
bpo-34405@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34405}: Updated to OpenSSL 1.1.0i for Windows builds.

@item 
bpo-33871@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33871}: Fixed sending the part of the file in @ref{d0b,,os.sendfile()} on
macOS.  Using the `trailers' argument could cause sending more bytes from
the input file than was specified.

@item 
bpo-32533@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32533}: Fixed thread-safety of error handling in _ssl.

@item 
bpo-33136@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33136}: Harden ssl module against LibreSSL 
@geindex Common Vulnerabilities and Exposures; CVE 2018-8970
CVE 2018-8970@footnote{https://www.cve.org/CVERecord?id=CVE-2018-8970}.
X509_VERIFY_PARAM_set1_host() is called with an explicit namelen. A new
test ensures that NULL bytes are not allowed.

@item 
bpo-33001@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33001}: Minimal fix to prevent buffer overrun in os.symlink on Windows

@item 
bpo-32981@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32981}: Regexes in difflib and poplib were vulnerable to catastrophic
backtracking. These regexes formed potential DOS vectors (REDOS). They
have been refactored. This resolves 
@geindex Common Vulnerabilities and Exposures; CVE 2018-1060
CVE 2018-1060@footnote{https://www.cve.org/CVERecord?id=CVE-2018-1060} and 
@geindex Common Vulnerabilities and Exposures; CVE 2018-1061
CVE 2018-1061@footnote{https://www.cve.org/CVERecord?id=CVE-2018-1061}.
Patch by Jamie Davis.

@item 
bpo-28414@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28414}: The ssl module now allows users to perform their own IDN
en/decoding when using SNI.
@end itemize

@node Core and Builtins<163>,Library<166>,Security<50>,Python 3 8 0 alpha 1
@anchor{whatsnew/changelog id780}@anchor{1e4d}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-35877@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35877}: Make parenthesis optional for named expressions in while
statement. Patch by Karthikeyan Singaravelan.

@item 
bpo-35814@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35814}: Allow same right hand side expressions in annotated assignments
as in normal ones. In particular, @code{x: Tuple[int, int] = 1, 2} (without
parentheses on the right) is now allowed.

@item 
bpo-35766@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35766}: Add the option to parse PEP 484 type comments in the ast
module. (Off by default.) This is merging the key functionality of the
third party fork thereof,
[typed_ast](@indicateurl{https://github.com/python/typed_ast}).

@item 
bpo-35713@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35713}: Reorganize Python initialization to get working exceptions and
sys.stderr earlier.

@item 
bpo-33416@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33416}: Add end line and end column position information to the Python
AST nodes. This is a C-level backwards incompatible change.

@item 
bpo-35720@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35720}: Fixed a minor memory leak in pymain_parse_cmdline_impl function
in Modules/main.c

@item 
bpo-35634@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35634}: @code{func(**kwargs)} will now raise an error when @code{kwargs} is a
mapping containing multiple entries with the same key. An error was
already raised when other keyword arguments are passed before @code{**kwargs}
since Python 3.6.

@item 
bpo-35623@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35623}: Fix a crash when sorting very long lists. Patch by Stephan
Hohe.

@item 
bpo-35214@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35214}: clang Memory Sanitizer build instrumentation was added to work
around false positives from posix, socket, time, test_io, and
test_faulthandler.

@item 
bpo-35560@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35560}: Fix an assertion error in @ref{19a,,format()} in debug build for
floating-point formatting with “n” format, zero padding and small width.
Release build is not impacted. Patch by Karthikeyan Singaravelan.

@item 
bpo-35552@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35552}: Format characters @code{%s} and @code{%V} in
@ref{62b,,PyUnicode_FromFormat()} and @code{%s} in @ref{1e4e,,PyBytes_FromFormat()}
no longer read memory past the limit if `precision' is specified.

@item 
bpo-35504@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35504}: Fix segfaults and @ref{796,,SystemError}s when deleting certain
attributes. Patch by Zackery Spytz.

@item 
bpo-35504@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35504}: Fixed a SystemError when delete the characters_written
attribute of an OSError.

@item 
bpo-35494@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35494}: Improved syntax error messages for unbalanced parentheses in
f-string.

@item 
bpo-35444@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35444}: Fixed error handling in pickling methods when fail to look up
builtin “getattr”. Sped up pickling iterators.

@item 
bpo-35436@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35436}: Fix various issues with memory allocation error handling.
Patch by Zackery Spytz.

@item 
bpo-35423@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35423}: Separate the signal handling trigger in the eval loop from the
“pending calls” machinery. There is no semantic change and the difference
in performance is insignificant.

@item 
bpo-35357@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35357}: Internal attributes’ names of unittest.mock._Call and
unittest.mock.MagicProxy (name, parent & from_kall) are now prefixed with
_mock_ in order to prevent clashes with widely used object attributes.
Fixed minor typo in test function name.

@item 
bpo-35372@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35372}: Fixed the code page decoder for input longer than 2 GiB
containing undecodable bytes.

@item 
bpo-35336@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35336}: Fix PYTHONCOERCECLOCALE=1 environment variable: only coerce the
C locale if the LC_CTYPE locale is “C”.

@item 
bpo-31241@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31241}: The `lineno' and `col_offset' attributes of AST nodes for list
comprehensions, generator expressions and tuples are now point to the
opening parenthesis or square brace. For tuples without parenthesis they
point to the position of the first item.

@item 
bpo-33954@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33954}: For @ref{834,,str.format()}, @code{float.__format__()} and
@code{complex.__format__()} methods for non-ASCII decimal point when using
the “n” formatter.

@item 
bpo-35269@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35269}: Fix a possible segfault involving a newly created coroutine.
Patch by Zackery Spytz.

@item 
bpo-35224@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35224}: Implement 
@geindex Python Enhancement Proposals; PEP 572
PEP 572@footnote{https://peps.python.org/pep-0572/} (assignment expressions). Patch by Emily
Morehouse.

@item 
bpo-32492@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32492}: Speed up @code{namedtuple()} attribute access by 1.6x using a C
fast-path for the name descriptors. Patch by Pablo Galindo.

@item 
bpo-35214@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35214}: Fixed an out of bounds memory access when parsing a truncated
unicode escape sequence at the end of a string such as @code{'\N'}.  It would
read one byte beyond the end of the memory allocation.

@item 
bpo-35214@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35214}: The interpreter and extension modules have had annotations
added so that they work properly under clang’s Memory Sanitizer.  A new
configure flag –with-memory-sanitizer has been added to make test builds
of this nature easier to perform.

@item 
bpo-35193@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35193}: Fix an off by one error in the bytecode peephole optimizer
where it could read bytes beyond the end of bounds of an array when
removing unreachable code. This bug was present in every release of Python
3.6 and 3.7 until now.

@item 
bpo-35169@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35169}: Improved error messages for forbidden assignments.

@item 
bpo-34022@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34022}: Fix handling of hash-based bytecode files in @ref{139,,zipimport}.
Patch by Elvis Pranskevichus.

@item 
bpo-28401@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28401}: Debug builds will no longer to attempt to import extension
modules built for the ABI as they were never compatible to begin with.
Patch by Stefano Rivera.

@item 
bpo-29341@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29341}: Clarify in the docstrings of @ref{a5,,os} methods that path-like
objects are also accepted as input parameters.

@item 
bpo-35050@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35050}: @ref{d1,,socket}: Fix off-by-one bug in length check for
@code{AF_ALG} name and type.

@item 
bpo-29743@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29743}: Raise @ref{2ee,,ValueError} instead of @ref{a87,,OverflowError} in case
of a negative @code{_length_} in a @ref{1e4f,,ctypes.Array} subclass.  Also
raise @ref{199,,TypeError} instead of @ref{5f0,,AttributeError} for non-integer
@code{_length_}. Original patch by Oren Milman.

@item 
bpo-16806@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16806}: Fix @code{lineno} and @code{col_offset} for multi-line string tokens.

@item 
bpo-35029@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35029}: @ref{1af,,SyntaxWarning} raised as an exception at code generation
time will be now replaced with a @ref{18f,,SyntaxError} for better error
reporting.

@item 
bpo-34983@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34983}: Expose @ref{1e50,,symtable.Symbol.is_nonlocal()} in the symtable
module. Patch by Pablo Galindo.

@item 
bpo-34974@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34974}: @ref{193,,bytes} and @ref{342,,bytearray} constructors no longer
convert unexpected exceptions (e.g. @ref{1761,,MemoryError} and
@ref{bcb,,KeyboardInterrupt}) to @ref{199,,TypeError}.

@item 
bpo-34939@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34939}: Allow annotated names in module namespace that are declared
global before the annotation happens. Patch by Pablo Galindo.

@item 
bpo-34973@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34973}: Fixed crash in @ref{193,,bytes()} when the @ref{24f,,list} argument is
mutated while it is iterated.

@item 
bpo-34876@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34876}: The `lineno' and `col_offset' attributes of the AST for
decorated function and class refer now to the position of the
corresponding @code{def}, @code{async def} and @code{class} instead of the position
of the first decorator. This leads to more correct line reporting in
tracing. This is the only case when the position of child AST nodes can
precede the position of the parent AST node.

@item 
bpo-34879@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34879}: Fix a possible null pointer dereference in bytesobject.c.
Patch by Zackery Spytz.

@item 
bpo-34784@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34784}: Fix the implementation of PyStructSequence_NewType in order to
create heap allocated StructSequences.

@item 
bpo-32912@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32912}: A @ref{1af,,SyntaxWarning} is now emitted instead of a
@ref{1a4,,DeprecationWarning} for invalid escape sequences in string and bytes
literals.

@item 
bpo-34854@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34854}: Fixed a crash in compiling string annotations containing a
lambda with a keyword-only argument that doesn’t have a default value.

@item 
bpo-34850@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34850}: The compiler now produces a @ref{1af,,SyntaxWarning} when identity
checks (@code{is} and @code{is not}) are used with certain types of literals
(e.g. strings, ints).  These can often work by accident in CPython, but
are not guaranteed by the language spec.  The warning advises users to use
equality tests (@code{==} and @code{!=}) instead.

@item 
bpo-34824@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34824}: Fix a possible null pointer dereference in Modules/_ssl.c.
Patch by Zackery Spytz.

@item 
bpo-30156@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30156}: The C function @code{property_descr_get()} uses a “cached” tuple
to optimize function calls. But this tuple can be discovered in debug mode
with @ref{290,,sys.getobjects()}. Remove the optimization, it’s not really
worth it and it causes 3 different crashes last years.

@item 
bpo-34762@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34762}: Fix contextvars C API to use PyObject* pointer types.

@item 
bpo-34751@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34751}: The hash function for tuples is now based on xxHash which gives
better collision results on (formerly) pathological cases. Additionally,
on 64-bit systems it improves tuple hashes in general. Patch by Jeroen
Demeyer with substantial contributions by Tim Peters.

@item 
bpo-34735@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34735}: Fix a memory leak in Modules/timemodule.c.  Patch by Zackery
Spytz.

@item 
bpo-34683@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34683}: Fixed a bug where some SyntaxError error pointed to locations
that were off-by-one.

@item 
bpo-34651@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34651}: Only allow the main interpreter to fork.  The avoids the
possibility of affecting the main interpreter, which is critical to
operation of the runtime.

@item 
bpo-34653@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34653}: Remove unused function PyParser_SimpleParseStringFilename.

@item 
bpo-32236@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32236}: Warn that line buffering is not supported if @ref{318,,open()} is
called with binary mode and @code{buffering=1}.

@item 
bpo-34641@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34641}: Further restrict the syntax of the left-hand side of keyword
arguments in function calls. In particular, @code{f((keyword)=arg)} is now
disallowed.

@item 
bpo-34637@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34637}: Make the `start' argument to `sum()' visible as a keyword
argument.

@item 
bpo-1621@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1621}: Do not assume signed integer overflow behavior (C undefined
behavior) when performing set hash table resizing.

@item 
bpo-34588@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34588}: Fix an off-by-one in the recursive call pruning feature of
traceback formatting.

@item 
bpo-34485@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34485}: On Windows, the LC_CTYPE is now set to the user preferred
locale at startup. Previously, the LC_CTYPE locale was “C” at startup, but
changed when calling setlocale(LC_CTYPE, “”) or setlocale(LC_ALL, “”).

@item 
bpo-34485@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34485}: Standard streams like sys.stdout now use the “surrogateescape”
error handler, instead of “strict”, on the POSIX locale (when the C locale
is not coerced and the UTF-8 Mode is disabled).

@item 
bpo-34485@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34485}: Fix the error handler of standard streams like sys.stdout:
PYTHONIOENCODING=”:” is now ignored instead of setting the error handler
to “strict”.

@item 
bpo-34485@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34485}: Python now gets the locale encoding with C code to initialize
the encoding of standard streams like sys.stdout. Moreover, the encoding
is now initialized to the Python codec name to get a normalized encoding
name and to ensure that the codec is loaded. The change avoids importing
_bootlocale and _locale modules at startup by default.

@item 
bpo-34527@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34527}: On FreeBSD, Py_DecodeLocale() and Py_EncodeLocale() now also
forces the ASCII encoding if the LC_CTYPE locale is “POSIX”, not only if
the LC_CTYPE locale is “C”.

@item 
bpo-34527@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34527}: The UTF-8 Mode is now also enabled by the “POSIX” locale, not
only by the “C” locale.

@item 
bpo-34403@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34403}: On HP-UX with C or POSIX locale, sys.getfilesystemencoding()
now returns “ascii” instead of “roman8” (when the UTF-8 Mode is disabled
and the C locale is not coerced).

@item 
bpo-34523@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34523}: The Python filesystem encoding is now read earlier during the
Python initialization.

@item 
bpo-12458@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12458}: Tracebacks show now correct line number for subexpressions in
multiline expressions. Tracebacks show now the line number of the first
line for multiline expressions instead of the line number of the last
subexpression.

@item 
bpo-34408@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34408}: Prevent a null pointer dereference and resource leakage in
@code{PyInterpreterState_New()}.

@item 
bpo-34400@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34400}: Fix undefined behavior in parsetok.c.  Patch by Zackery Spytz.

@item 
bpo-33073@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33073}: Added as_integer_ratio to ints to make them more interoperable
with floats.

@item 
bpo-34377@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34377}: Update valgrind suppression list to use
@code{_PyObject_Free}/@code{_PyObject_Realloc} instead of
@code{PyObject_Free}/@code{PyObject_Realloc}.

@item 
bpo-34353@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34353}: Added the “socket” option in the @code{stat.filemode()} Python
implementation to match the C implementation.

@item 
bpo-34320@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34320}: Fix @code{dict(od)} didn’t copy iteration order of OrderedDict.

@item 
bpo-34113@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34113}: Fixed crash on debug builds when opcode stack was adjusted with
negative numbers. Patch by Constantin Petrisor.

@item 
bpo-34100@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34100}: Compiler now merges constants in tuples and frozensets
recursively. Code attributes like @code{co_names} are merged too.

@item 
bpo-34151@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34151}: Performance of list concatenation, repetition and slicing
operations is slightly improved. Patch by Sergey Fedoseev.

@item 
bpo-34170@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34170}: -X dev: it is now possible to override the memory allocator
using PYTHONMALLOC even if the developer mode is enabled.

@item 
bpo-33237@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33237}: Improved @ref{5f0,,AttributeError} message for partially
initialized module.

@item 
bpo-34149@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34149}: Fix min and max functions to get default behavior when key is
None.

@item 
bpo-34125@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34125}: Profiling of unbound built-in methods now works when
@code{**kwargs} is given.

@item 
bpo-34141@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34141}: Optimized pickling atomic types (None, bool, int, float, bytes,
str).

@item 
bpo-34126@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34126}: Fix crashes when profiling certain invalid calls of unbound
methods. Patch by Jeroen Demeyer.

@item 
bpo-24618@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24618}: Fixed reading invalid memory when create the code object with
too small varnames tuple or too large argument counts.

@item 
bpo-34068@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34068}: In @ref{507,,io.IOBase.close()}, ensure that the
@ref{1e51,,closed} attribute is not set with a live exception.
Patch by Zackery Spytz and Serhiy Storchaka.

@item 
bpo-34087@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34087}: Fix buffer overflow while converting unicode to numeric values.

@item 
bpo-34080@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34080}: Fixed a memory leak in the compiler when it raised some
uncommon errors during tokenizing.

@item 
bpo-34066@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34066}: Disabled interruption by Ctrl-C between calling @code{open()} and
entering a `with' block in @code{with open()}.

@item 
bpo-34042@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34042}: Fix dict.copy() to maintain correct total refcount (as reported
by sys.gettotalrefcount()).

@item 
bpo-33418@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33418}: Fix potential memory leak in function object when it creates
reference cycle.

@item 
bpo-33985@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33985}: Implement contextvars.ContextVar.name attribute.

@item 
bpo-33956@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33956}: Update vendored Expat library copy to version 2.2.5.

@item 
bpo-24596@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24596}: Decref the module object in @ref{1d0b,,PyRun_SimpleFileExFlags()}
before calling @ref{1d70,,PyErr_Print()}.  Patch by Zackery Spytz.

@item 
bpo-33451@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33451}: Close directly executed pyc files before calling
@code{PyEval_EvalCode()}.

@item 
bpo-1617161@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1617161}: The hash of @code{BuiltinMethodType} instances (methods of
built-in classes) now depends on the hash of the identity of `__self__'
instead of its value. The hash and equality of @code{ModuleType} and
@code{MethodWrapperType} instances (methods of user-defined classes and
some methods of built-in classes like @code{str.__add__}) now depend on the
hash and equality of the identity of `__self__' instead of its value.
@code{MethodWrapperType} instances no longer support ordering.

@item 
bpo-33824@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33824}: Fix “LC_ALL=C python3.7 -V”: reset properly the command line
parser when the encoding changes after reading the Python configuration.

@item 
bpo-33803@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33803}: Fix a crash in hamt.c caused by enabling GC tracking for an
object that hadn’t all of its fields set to NULL.

@item 
bpo-33738@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33738}: Seven macro incompatibilities with the Limited API were fixed,
and the macros @ref{1cf3,,PyIter_Check()}, @ref{b87,,PyIndex_Check()} and
@ref{c61,,PyExceptionClass_Name()} were added as functions. A script for
automatic macro checks was added.

@item 
bpo-33786@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33786}: Fix asynchronous generators to handle GeneratorExit in athrow()
correctly

@item 
bpo-30167@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30167}: @code{PyRun_SimpleFileExFlags} removes @code{__cached__} from module
in addition to @code{__file__}.

@item 
bpo-33706@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33706}: Fix a crash in Python initialization when parsing the command
line options. Thanks Christoph Gohlke for the bug report and the fix!

@item 
bpo-33597@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33597}: Reduce @code{PyGC_Head} size from 3 words to 2 words.

@item 
bpo-30654@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30654}: Fixed reset of the SIGINT handler to SIG_DFL on interpreter
shutdown even when there was a custom handler set previously. Patch by
Philipp Kerling.

@item 
bpo-33622@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33622}: Fixed a leak when the garbage collector fails to add an object
with the @code{__del__} method or referenced by it into the
@ref{13cd,,gc.garbage} list. @ref{b8b,,PyGC_Collect()} can now be called when an
exception is set and preserves it.

@item 
bpo-33462@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33462}: Make dict and dict views reversible. Patch by Rémi Lapeyre.

@item 
bpo-23722@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23722}: A @ref{246,,RuntimeError} is now raised when the custom metaclass
doesn’t provide the @code{__classcell__} entry in the namespace passed to
@code{type.__new__}.  A @ref{1a4,,DeprecationWarning} was emitted in Python
3.6–3.7.

@item 
bpo-33499@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33499}: Add 
@geindex PYTHONPYCACHEPREFIX
@geindex environment variable; PYTHONPYCACHEPREFIX
@ref{ba1,,PYTHONPYCACHEPREFIX} environment variable and
@ref{170,,-X} @code{pycache_prefix} command-line option to set an alternate
root directory for writing module bytecode cache files.

@item 
bpo-25711@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25711}: The @ref{139,,zipimport} module has been rewritten in pure Python.

@item 
bpo-33509@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33509}: Fix module_globals parameter of warnings.warn_explicit(): don’t
crash if module_globals is not a dict.

@item 
bpo-31849@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31849}: Fix signed/unsigned comparison warning in pyhash.c.

@item 
bpo-33475@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33475}: Fixed miscellaneous bugs in converting annotations to strings
and optimized parentheses in the string representation.

@item 
bpo-20104@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20104}: Added support for the @code{setpgroup}, @code{resetids},
@code{setsigmask}, @code{setsigdef} and @code{scheduler} parameters of
@code{posix_spawn}. Patch by Pablo Galindo.

@item 
bpo-33391@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33391}: Fix a leak in set_symmetric_difference().

@item 
bpo-33363@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33363}: Raise a SyntaxError for @code{async with} and @code{async for}
statements outside of async functions.

@item 
bpo-28055@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28055}: Fix unaligned accesses in siphash24(). Patch by Rolf Eike Beer.

@item 
bpo-33128@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33128}: Fix a bug that causes PathFinder to appear twice on
sys.meta_path. Patch by Pablo Galindo Salgado.

@item 
bpo-33331@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33331}: Modules imported last are now cleared first at interpreter
shutdown.

@item 
bpo-33312@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33312}: Fixed clang ubsan (undefined behavior sanitizer) warnings in
dictobject.c by adjusting how the internal struct _dictkeysobject shared
keys structure is declared.

@item 
bpo-33305@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33305}: Improved syntax error messages for invalid numerical literals.

@item 
bpo-33306@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33306}: Improved syntax error messages for unbalanced parentheses.

@item 
bpo-33234@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33234}: The list constructor will pre-size and not over-allocate when
the input length is known.

@item 
bpo-33270@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33270}: Intern the names for all anonymous code objects.  Patch by
Zackery Spytz.

@item 
bpo-30455@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30455}: The C and Python code and the documentation related to tokens
are now generated from a single source file @code{Grammar/Tokens}.

@item 
bpo-33176@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33176}: Add a @code{toreadonly()} method to memoryviews.

@item 
bpo-33231@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33231}: Fix potential memory leak in @code{normalizestring()}.

@item 
bpo-33205@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33205}: Change dict growth function from
@code{round_up_to_power_2(used*2+hashtable_size/2)} to
@code{round_up_to_power_2(used*3)}.  Previously, dict is shrunk only when
@code{used == 0}. Now dict has more chance to be shrunk.

@item 
bpo-29922@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29922}: Improved error messages in ‘async with’ when @code{__aenter__()}
or @code{__aexit__()} return non-awaitable object.

@item 
bpo-33199@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33199}: Fix @code{ma_version_tag} in dict implementation is uninitialized
when copying from key-sharing dict.

@item 
bpo-33053@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33053}: When using the -m switch, sys.path[0] is now explicitly
expanded as the `starting' working directory, rather than being left as
the empty path (which allows imports from the current working directory at
the time of the import)

@item 
bpo-33138@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33138}: Changed standard error message for non-pickleable and
non-copyable types. It now says “cannot pickle” instead of “can’t pickle”
or “cannot serialize”.

@item 
bpo-33018@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33018}: Improve consistency of errors raised by @code{issubclass()} when
called with a non-class and an abstract base class as the first and second
arguments, respectively. Patch by Josh Bronson.

@item 
bpo-33083@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33083}: @code{math.factorial} no longer accepts arguments that are not
int-like. Patch by Pablo Galindo.

@item 
bpo-33041@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33041}: Added new opcode @ref{ca6,,END_ASYNC_FOR} and fixes the
following issues:


@itemize *

@item 
Setting global @ref{1e52,,StopAsyncIteration} no longer breaks @code{async for}
loops.

@item 
Jumping into an @code{async for} loop is now disabled.

@item 
Jumping out of an @code{async for} loop no longer corrupts the stack.
@end itemize

@item 
bpo-25750@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25750}: Fix rare Python crash due to bad refcounting in
@code{type_getattro()} if a descriptor deletes itself from the class. Patch
by Jeroen Demeyer.

@item 
bpo-33041@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33041}: Fixed bytecode generation for “async for” with a complex
target. A StopAsyncIteration raised on assigning or unpacking will be now
propagated instead of stopping the iteration.

@item 
bpo-33026@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33026}: Fixed jumping out of “with” block by setting f_lineno.

@item 
bpo-33005@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33005}: Fix a crash on fork when using a custom memory allocator (ex:
using PYTHONMALLOC env var). _PyGILState_Reinit() and
_PyInterpreterState_Enable() now use the default RAW memory allocator to
allocate a new interpreters mutex on fork.

@item 
bpo-32911@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32911}: Due to unexpected compatibility issues discovered during
downstream beta testing, reverted bpo-29463@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29463}. @code{docstring} field is
removed from Module, ClassDef, FunctionDef, and AsyncFunctionDef ast nodes
which was added in 3.7a1.  Docstring expression is restored as a first
statement in their body. Based on patch by Inada Naoki.

@item 
bpo-17288@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17288}: Prevent jumps from ‘return’ and ‘exception’ trace events.

@item 
bpo-32946@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32946}: Importing names from already imported module with “from …
import …” is now 30% faster if the module is not a package.

@item 
bpo-32932@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32932}: Make error message more revealing when there are non-str
objects in @code{__all__}.

@item 
bpo-32925@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32925}: Optimized iterating and containing test for literal lists
consisting of non-constants: @code{x in [a, b]} and @code{for x in [a, b]}. The
case of all constant elements already was optimized.

@item 
bpo-32889@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32889}: Update Valgrind suppression list to account for the rename of
@code{Py_ADDRESS_IN_RANG} to @code{address_in_range}.

@item 
bpo-32836@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32836}: Don’t use temporary variables in cases of list/dict/set
comprehensions

@item 
bpo-31356@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31356}: Remove the new API added in bpo-31356@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31356} (gc.ensure_disabled()
context manager).

@item 
bpo-32305@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32305}: For namespace packages, ensure that both @code{__file__} and
@code{__spec__.origin} are set to None.

@item 
bpo-32303@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32303}: Make sure @code{__spec__.loader} matches @code{__loader__} for
namespace packages.

@item 
bpo-32711@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32711}: Fix the warning messages for Python/ast_unparse.c. Patch by
Stéphane Wirtel

@item 
bpo-32583@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32583}: Fix possible crashing in builtin Unicode decoders caused by
write out-of-bound errors when using customized decode error handlers.

@item 
bpo-32489@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32489}: A @ref{181,,continue} statement is now allowed in the
@ref{1b1,,finally} clause.

@item 
bpo-17611@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17611}: Simplified the interpreter loop by moving the logic of
unrolling the stack of blocks into the compiler. The compiler emits now
explicit instructions for adjusting the stack of values and calling the
cleaning up code for @ref{180,,break}, @ref{181,,continue} and
@ref{1b0,,return}.

Removed opcodes @code{BREAK_LOOP}, @code{CONTINUE_LOOP},
@code{SETUP_LOOP} and @code{SETUP_EXCEPT}. Added new opcodes
@code{ROT_FOUR}, @code{BEGIN_FINALLY} and @code{CALL_FINALLY} and
@code{POP_FINALLY}. Changed the behavior of @code{END_FINALLY} and
@code{WITH_CLEANUP_START}.

@item 
bpo-32285@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32285}: New function unicodedata.is_normalized, which can check whether
a string is in a specific normal form.

@item 
bpo-10544@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10544}: Yield expressions are now disallowed in comprehensions and
generator expressions except the expression for the outermost iterable.

@item 
bpo-32117@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32117}: Iterable unpacking is now allowed without parentheses in yield
and return statements, e.g. @code{yield 1, 2, 3, *rest}. Thanks to David
Cuthbert for the change and Jordan Chapman for added tests.

@item 
bpo-31902@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31902}: Fix the @code{col_offset} attribute for ast nodes
@code{ast.AsyncFor}, @code{ast.AsyncFunctionDef}, and @code{ast.AsyncWith}.
Previously, @code{col_offset} pointed to the keyword after @code{async}.

@item 
bpo-25862@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25862}: Fix assertion failures in the @code{tell()} method of
@code{io.TextIOWrapper}. Patch by Zackery Spytz.

@item 
bpo-21983@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21983}: Fix a crash in @code{ctypes.cast()} in case the type argument is a
ctypes structured data type. Patch by Eryk Sun and Oren Milman.

@item 
bpo-31577@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31577}: Fix a crash in @code{os.utime()} in case of a bad ns argument.
Patch by Oren Milman.

@item 
bpo-29832@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29832}: Remove references to ‘getsockaddrarg’ from various socket error
messages. Patch by Oren Milman.
@end itemize

@node Library<166>,Documentation<59>,Core and Builtins<163>,Python 3 8 0 alpha 1
@anchor{whatsnew/changelog id781}@anchor{1e53}
@subsubsection Library



@itemize -

@item 
bpo-35845@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35845}: Add ‘order’ parameter to memoryview.tobytes().

@item 
bpo-35864@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35864}: The _asdict() method for collections.namedtuple now returns a
regular dict instead of an OrderedDict.

@item 
bpo-35537@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35537}: An ExitStack is now used internally within subprocess.Popen to
clean up pipe file handles. No behavior change in normal operation. But if
closing one handle were ever to cause an exception, the others will now be
closed instead of leaked.  (patch by Giampaolo Rodola)

@item 
bpo-35847@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35847}: RISC-V needed the CTYPES_PASS_BY_REF_HACK.  Fixes ctypes
Structure test_pass_by_value.

@item 
bpo-35813@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35813}: Shared memory submodule added to multiprocessing to avoid need
for serialization between processes

@item 
bpo-35780@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35780}: Fix lru_cache() errors arising in recursive, reentrant, or
multi-threaded code. These errors could result in orphan links and in the
cache being trapped in a state with fewer than the specified maximum
number of links. Fix handling of negative maxsize which should have been
treated as zero. Fix errors in toggling the “full” status flag. Fix
misordering of links when errors are encountered.  Sync-up the C code and
pure Python code for the space saving path in functions with a single
positional argument. In this common case, the space overhead of an lru
cache entry is reduced by almost half.  Fix counting of cache misses. In
error cases, the miss count was out of sync with the actual number of
times the underlying user function was called.

@item 
bpo-35537@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35537}: @ref{52f,,os.posix_spawn()} and @ref{17b6,,os.posix_spawnp()} now have a
`setsid' parameter.

@item 
bpo-23846@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23846}: @ref{81e,,asyncio.ProactorEventLoop} now catches and logs send
errors when the self-pipe is full.

@item 
bpo-34323@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34323}: @ref{b,,asyncio}: Enhance @code{IocpProactor.close()} log: wait 1
second before the first log, then log every second. Log also the number of
seconds since @code{close()} was called.

@item 
bpo-35674@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35674}: Add a new @ref{17b6,,os.posix_spawnp()} function. Patch by Joannah
Nanjekye.

@item 
bpo-35733@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35733}: @code{ast.Constant(boolean)} no longer an instance of
@code{ast.Num}.  Patch by Anthony Sottile.

@item 
bpo-35726@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35726}: QueueHandler.prepare() now makes a copy of the record before
modifying and enqueueing it, to avoid affecting other handlers in the
chain.

@item 
bpo-35719@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35719}: Sped up multi-argument @ref{92,,math} functions atan2(),
copysign(), remainder() and hypot() by 1.3–2.5 times.

@item 
bpo-35717@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35717}: Fix KeyError exception raised when using enums and compile.
Patch contributed by Rémi Lapeyre.

@item 
bpo-35699@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35699}: Fixed detection of Visual Studio Build Tools 2017 in distutils

@item 
bpo-32710@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32710}: Fix memory leaks in asyncio ProactorEventLoop on overlapped
operation failure.

@item 
bpo-35702@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35702}: The @ref{c3d,,time.CLOCK_UPTIME_RAW} constant is now available
for macOS 10.12.

@item 
bpo-32710@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32710}: Fix a memory leak in asyncio in the ProactorEventLoop when
@code{ReadFile()} or @code{WSASend()} overlapped operation fail immediately:
release the internal buffer.

@item 
bpo-35682@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35682}: Fix @code{asyncio.ProactorEventLoop.sendfile()}: don’t attempt to
set the result of an internal future if it’s already done.

@item 
bpo-35283@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35283}: Add a deprecated warning for the
@code{threading.Thread.isAlive()} method. Patch by Donghee Na.

@item 
bpo-35664@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35664}: Improve operator.itemgetter() performance by 33% with optimized
argument handling and with adding a fast path for the common case of a
single non-negative integer index into a tuple (which is the typical use
case in the standard library).

@item 
bpo-35643@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35643}: Fixed a SyntaxWarning: invalid escape sequence in
Modules/_sha3/cleanup.py. Patch by Mickaël Schoentgen.

@item 
bpo-35619@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35619}: Improved support of custom data descriptors in @ref{ada,,help()} and
@ref{ba,,pydoc}.

@item 
bpo-28503@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28503}: The @code{crypt} module now internally uses the @code{crypt_r()}
library function instead of @code{crypt()} when available.

@item 
bpo-35614@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35614}: Fixed help() on metaclasses. Patch by Sanyam Khurana.

@item 
bpo-35568@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35568}: Expose @code{raise(signum)} as @code{raise_signal}

@item 
bpo-35588@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35588}: The floor division and modulo operations and the @ref{b9f,,divmod()}
function on @ref{215,,fractions.Fraction} types are 2–4x faster. Patch by
Stefan Behnel.

@item 
bpo-35585@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35585}: Speed-up building enums by value, e.g. http.HTTPStatus(200).

@item 
bpo-30561@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30561}: random.gammavariate(1.0, beta) now computes the same result as
random.expovariate(1.0 / beta).  This synchronizes the two algorithms and
eliminates some idiosyncrasies in the old implementation.  It does however
produce a difference stream of random variables than it used to.

@item 
bpo-35537@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35537}: The @ref{dc,,subprocess} module can now use the
@ref{52f,,os.posix_spawn()} function in some cases for better performance.

@item 
bpo-35526@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35526}: Delaying the ‘joke’ of barry_as_FLUFL.mandatory to Python
version 4.0

@item 
bpo-35523@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35523}: Remove @ref{2e,,ctypes} callback workaround: no longer create a
callback at startup. Avoid SELinux alert on @code{import ctypes} and @code{import
uuid}.

@item 
bpo-31784@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31784}: @ref{da7,,uuid.uuid1()} now calls @ref{ce6,,time.time_ns()} rather than
@code{int(time.time() * 1e9)}.

@item 
bpo-35513@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35513}: @code{TextTestRunner} of
@code{unittest.runner} now uses @ref{c80,,time.perf_counter()} rather than
@ref{55d,,time.time()} to measure the execution time of a test:
@code{time.time()} can go backwards, whereas @code{time.perf_counter()} is
monotonic.

@item 
bpo-35502@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35502}: Fixed reference leaks in
@ref{c50,,xml.etree.ElementTree.TreeBuilder} in case of unfinished building
of the tree (in particular when an error was raised during parsing XML).

@item 
bpo-35348@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35348}: Make @ref{1a4d,,platform.architecture()} parsing of @code{file} command
output more reliable: add the @code{-b} option to the @code{file} command to
omit the filename, force the usage of the C locale, and search also the
“shared object” pattern.

@item 
bpo-35491@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35491}: @ref{98,,multiprocessing}: Add @code{Pool.__repr__()} and enhance
@code{BaseProcess.__repr__()} (add pid and parent pid) to ease debugging.
Pool state constant values are now strings instead of integers, for
example @code{RUN} value becomes @code{'RUN'} instead of @code{0}.

@item 
bpo-35477@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35477}: @code{multiprocessing.Pool.__enter__()} now fails if the pool is
not running: @code{with pool:} fails if used more than once.

@item 
bpo-31446@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31446}: Copy command line that was passed to CreateProcessW since this
function can change the content of the input buffer.

@item 
bpo-35471@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35471}: Python 2.4 dropped MacOS 9 support. The macpath module was
deprecated in Python 3.7. The module is now removed.

@item 
bpo-23057@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23057}: Unblock Proactor event loop when keyboard interrupt is received
on Windows

@item 
bpo-35052@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35052}: Fix xml.dom.minidom cloneNode() on a document with an entity:
pass the correct arguments to the user data handler of an entity.

@item 
bpo-20239@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20239}: Allow repeated assignment deletion of
@ref{c45,,unittest.mock.Mock} attributes. Patch by Pablo Galindo.

@item 
bpo-17185@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17185}: Set @code{__signature__} on mock for @ref{82,,inspect} to get
signature. Patch by Karthikeyan Singaravelan.

@item 
bpo-35445@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35445}: Memory errors during creating posix.environ no longer ignored.

@item 
bpo-35415@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35415}: Validate fileno= argument to socket.socket().

@item 
bpo-35424@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35424}: @code{multiprocessing.Pool} destructor now emits
@ref{54d,,ResourceWarning} if the pool is still running.

@item 
bpo-35330@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35330}: When a @code{Mock} instance was used to wrap an object, if
@code{side_effect} is used in one of the mocks of it methods, don’t call the
original implementation and return the result of using the side effect the
same way that it is done with return_value.

@item 
bpo-35346@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35346}: Drop Mac OS 9 and Rhapsody support from the @ref{af,,platform}
module. Rhapsody last release was in 2000. Mac OS 9 last release was in
2001.

@item 
bpo-10496@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10496}: @code{check_environ()} of @code{distutils.utils}
now catches @ref{5e7,,KeyError} on calling @ref{1e54,,pwd.getpwuid()}: don’t create
the @code{HOME} environment variable in this case.

@item 
bpo-10496@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10496}: @code{posixpath.expanduser()} now returns the input `path'
unchanged if the @code{HOME} environment variable is not set and the current
user has no home directory (if the current user identifier doesn’t exist
in the password database). This change fix the @ref{cc,,site} module if the
current user doesn’t exist in the password database (if the user has no
home directory).

@item 
bpo-35389@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35389}: @ref{183f,,platform.libc_ver()} now uses
@code{os.confstr('CS_GNU_LIBC_VERSION')} if available and the `executable'
parameter is not set.

@item 
bpo-35394@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35394}: Add empty slots to asyncio abstract protocols.

@item 
bpo-35310@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35310}: Fix a bug in @ref{fa6,,select.select()} where, in some cases, the
file descriptor sequences were returned unmodified after a signal
interruption, even though the file descriptors might not be ready yet.
@code{select.select()} will now always return empty lists if a timeout has
occurred.  Patch by Oran Avraham.

@item 
bpo-35380@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35380}: Enable TCP_NODELAY on Windows for proactor asyncio event loop.

@item 
bpo-35341@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35341}: Add generic version of @code{collections.OrderedDict} to the
@code{typing} module. Patch by Ismo Toijala.

@item 
bpo-35371@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35371}: Fixed possible crash in @code{os.utime()} on Windows when pass
incorrect arguments.

@item 
bpo-35346@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35346}: @ref{1e55,,platform.uname()} now redirects @code{stderr} to
@ref{1e56,,os.devnull} when running external programs like @code{cmd /c ver}.

@item 
bpo-35066@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35066}: Previously, calling the strftime() method on a datetime object
with a trailing ‘%’ in the format string would result in an exception.
However, this only occurred when the datetime C module was being used; the
python implementation did not match this behavior. Datetime is now PEP-399
compliant, and will not throw an exception on a trailing ‘%’.

@item 
bpo-35345@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35345}: The function @code{platform.popen} has been removed, it was
deprecated since Python 3.3: use @ref{31c,,os.popen()} instead.

@item 
bpo-35344@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35344}: On macOS, @ref{1b0c,,platform.platform()} now uses
@ref{1e57,,platform.mac_ver()}, if it returns a non-empty release string, to get
the macOS version rather than the darwin version.

@item 
bpo-35312@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35312}: Make @code{lib2to3.pgen2.parse.ParseError} round-trip pickle-able.
Patch by Anthony Sottile.

@item 
bpo-35308@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35308}: Fix regression in @code{webbrowser} where default browsers may be
preferred over browsers in the @code{BROWSER} environment variable.

@item 
bpo-24746@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24746}: Avoid stripping trailing whitespace in doctest fancy diff.
Original patch by R. David Murray & Jairo Trad. Enhanced by Sanyam
Khurana.

@item 
bpo-28604@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28604}: @ref{dfe,,locale.localeconv()} now sets temporarily the @code{LC_CTYPE}
locale to the @code{LC_MONETARY} locale if the two locales are different and
monetary strings are non-ASCII. This temporary change affects other
threads.

@item 
bpo-35277@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35277}: Update ensurepip to install pip 18.1 and setuptools 40.6.2.

@item 
bpo-24209@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24209}: Adds IPv6 support when invoking http.server directly.

@item 
bpo-35226@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35226}: Recursively check arguments when testing for equality of
@ref{1df5,,unittest.mock.call} objects and add note that tracking of
parameters used to create ancestors of mocks in @code{mock_calls} is not
possible.

@item 
bpo-29564@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29564}: The warnings module now suggests to enable tracemalloc if the
source is specified, the tracemalloc module is available, but tracemalloc
is not tracing memory allocations.

@item 
bpo-35189@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35189}: Modify the following fnctl function to retry if interrupted by
a signal (EINTR): flock, lockf, fnctl

@item 
bpo-30064@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30064}: Use add_done_callback() in sock_* asyncio API to unsubscribe
reader/writer early on calcellation.

@item 
bpo-35186@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35186}: Removed the “built with” comment added when @code{setup.py upload}
is used with either @code{bdist_rpm} or @code{bdist_dumb}.

@item 
bpo-35152@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35152}: Allow sending more than 2 GB at once on a multiprocessing
connection on non-Windows systems.

@item 
bpo-35062@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35062}: Fix incorrect parsing of
@ref{17b4,,io.IncrementalNewlineDecoder}’s `translate' argument.

@item 
bpo-35065@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35065}: Remove @code{StreamReaderProtocol._untrack_reader}. The call to
@code{_untrack_reader} is currently performed too soon, causing the protocol
to forget about the reader before @code{connection_lost} can run and feed the
EOF to the reader.

@item 
bpo-34160@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34160}: ElementTree and minidom now preserve the attribute order
specified by the user.

@item 
bpo-35079@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35079}: Improve difflib.SequenceManager.get_matching_blocks doc by
adding ‘non-overlapping’ and changing ‘!=’ to ‘<’.

@item 
bpo-33710@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33710}: Deprecated @code{l*gettext()} functions and methods in the
@ref{67,,gettext} module. They return encoded bytes instead of Unicode
strings and are artifacts from Python 2 times. Also deprecated functions
and methods related to setting the charset for @code{l*gettext()} functions
and methods.

@item 
bpo-35017@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35017}: @ref{134b,,socketserver.BaseServer.serve_forever()} now exits
immediately if it’s @ref{1e58,,shutdown()} method is
called while it is polling for new events.

@item 
bpo-35024@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35024}: @code{importlib} no longer logs @code{wrote <bytecode path>}
redundantly after @code{(created|could not create) <bytecode path>} is
already logged. Patch by Quentin Agren.

@item 
bpo-35047@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35047}: @code{unittest.mock} now includes mock calls in exception messages
if @code{assert_not_called}, @code{assert_called_once}, or
@code{assert_called_once_with} fails. Patch by Petter Strandmark.

@item 
bpo-31047@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31047}: Fix @code{ntpath.abspath} regression where it didn’t remove a
trailing separator on Windows. Patch by Tim Graham.

@item 
bpo-35053@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35053}: tracemalloc now tries to update the traceback when an object is
reused from a “free list” (optimization for faster object creation, used
by the builtin list type for example).

@item 
bpo-31553@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31553}: Add the –json-lines option to json.tool. Patch by hongweipeng.

@item 
bpo-34794@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34794}: Fixed a leak in Tkinter when pass the Python wrapper around
Tcl_Obj back to Tcl/Tk.

@item 
bpo-34909@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34909}: Enum: fix grandchildren subclassing when parent mixed with
concrete data types.

@item 
bpo-35022@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35022}: @ref{1095,,unittest.mock.MagicMock} now supports the
@code{__fspath__} method (from @ref{e51,,os.PathLike}).

@item 
bpo-35008@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35008}: Fixed references leaks when call the @code{__setstate__()} method
of @ref{361,,xml.etree.ElementTree.Element} in the C implementation for
already initialized element.

@item 
bpo-23420@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23420}: Verify the value for the parameter ‘-s’ of the cProfile CLI.
Patch by Robert Kuska

@item 
bpo-33947@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33947}: dataclasses now handle recursive reprs without raising
RecursionError.

@item 
bpo-34890@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34890}: Make @ref{30f,,inspect.iscoroutinefunction()},
@ref{1b9f,,inspect.isgeneratorfunction()} and @ref{1ba0,,inspect.isasyncgenfunction()}
work with @ref{219,,functools.partial()}. Patch by Pablo Galindo.

@item 
bpo-34521@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34521}: Use @ref{1e59,,socket.CMSG_SPACE()} to calculate ancillary data size
instead of @ref{1e5a,,socket.CMSG_LEN()} in
@code{multiprocessing.reduction.recvfds()} as 
@geindex RFC; RFC 3542
RFC 3542@footnote{https://datatracker.ietf.org/doc/html/rfc3542.html} requires the use
of the former for portable applications.

@item 
bpo-31522@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31522}: The @code{mailbox.mbox.get_string} function `from_' parameter can
now successfully be set to a non-default value.

@item 
bpo-34970@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34970}: Protect tasks weak set manipulation in @code{asyncio.all_tasks()}

@item 
bpo-34969@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34969}: gzip: Add –fast, –best on the gzip CLI, these parameters will
be used for the fast compression method (quick) or the best method
compress (slower, but smaller file). Also, change the default compression
level to 6 (tradeoff).

@item 
bpo-16965@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16965}: The 2to3 @code{execfile} fixer now opens the file with mode
@code{'rb'}.  Patch by Zackery Spytz.

@item 
bpo-34966@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34966}: @ref{ba,,pydoc} now supports aliases not only to methods defined
in the end class, but also to inherited methods.  The docstring is not
duplicated for aliases.

@item 
bpo-34926@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34926}: @ref{1e5b,,mimetypes.MimeTypes.guess_type()} now accepts
@ref{5a1,,path-like object} in addition to url strings. Patch by Mayank
Asthana.

@item 
bpo-23831@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23831}: Add @code{moveto()} method to the @code{tkinter.Canvas} widget. Patch
by Juliette Monsel.

@item 
bpo-34941@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34941}: Methods @code{find()}, @code{findtext()} and @code{findall()} of the
@code{Element} class in the @ref{12c,,xml.etree.ElementTree} module are now able
to find children which are instances of @code{Element} subclasses.

@item 
bpo-32680@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32680}: @ref{b2d,,smtplib.SMTP} objects now always have a @code{sock}
attribute present

@item 
bpo-34769@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34769}: Fix for async generators not finalizing when event loop is in
debug mode and garbage collector runs in another thread.

@item 
bpo-34936@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34936}: Fix @code{TclError} in @code{tkinter.Spinbox.selection_element()}.
Patch by Juliette Monsel.

@item 
bpo-34829@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34829}: Add methods @code{selection_from}, @code{selection_range},
@code{selection_present} and @code{selection_to} to the @code{tkinter.Spinbox} for
consistency with the @code{tkinter.Entry} widget. Patch by Juliette Monsel.

@item 
bpo-34911@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34911}: Added `secure_protocols' argument to
`http.cookiejar.DefaultCookiePolicy' to allow for tweaking of protocols
and also to add support by default for `wss', the secure websocket
protocol.

@item 
bpo-34922@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34922}: Fixed integer overflow in the @ref{1e5c,,digest()} and
@ref{1e5d,,hexdigest()} methods for the SHAKE algorithm in the
@ref{6c,,hashlib} module.

@item 
bpo-34925@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34925}: 25% speedup in argument parsing for the functions in the bisect
module.

@item 
bpo-34900@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34900}: Fixed @ref{1c8c,,unittest.TestCase.debug()} when used to call test
methods with subtests.  Patch by Bruno Oliveira.

@item 
bpo-34844@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34844}: logging.Formatter enhancement - Ensure styles and fmt matches
in logging.Formatter - Added validate method in each format style class:
StrFormatStyle, PercentStyle, StringTemplateStyle. - This method is called
in the constructor of logging.Formatter class - Also re-raise the KeyError
in the format method of each style class, so it would a bit clear that
it’s an error with the invalid format fields.

@item 
bpo-34897@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34897}: Adjust test.support.missing_compiler_executable check so that a
nominal command name of “” is ignored. Patch by Michael Felt.

@item 
bpo-34871@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34871}: Fix inspect module polluted @code{sys.modules} when parsing
@code{__text_signature__} of callable.

@item 
bpo-34898@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34898}: Add @code{mtime} argument to @code{gzip.compress} for reproducible
output. Patch by Guo Ci Teo.

@item 
bpo-28441@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28441}: On Cygwin and MinGW, ensure that @code{sys.executable} always
includes the full filename in the path, including the @code{.exe} suffix
(unless it is a symbolic link).

@item 
bpo-34866@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34866}: Adding @code{max_num_fields} to @code{cgi.FieldStorage} to make DOS
attacks harder by limiting the number of @code{MiniFieldStorage} objects
created by @code{FieldStorage}.

@item 
bpo-34711@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34711}: http.server ensures it reports HTTPStatus.NOT_FOUND when the
local path ends with “/” and is not a directory, even if the underlying OS
(e.g. AIX) accepts such paths as a valid file reference. Patch by Michael
Felt.

@item 
bpo-34872@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34872}: Fix self-cancellation in C implementation of asyncio.Task

@item 
bpo-34849@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34849}: Don’t log waiting for @code{selector.select} in asyncio loop
iteration. The waiting is pretty normal for any asyncio program, logging
its time just adds a noise to logs without any useful information
provided.

@item 
bpo-34022@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34022}: The 
@geindex SOURCE_DATE_EPOCH
@geindex environment variable; SOURCE_DATE_EPOCH
@code{SOURCE_DATE_EPOCH} environment variable no longer
overrides the value of the `invalidation_mode' argument to
@ref{c20,,py_compile.compile()}, and determines its default value instead.

@item 
bpo-34819@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34819}: Use a monotonic clock to compute timeouts in
@code{Executor.map()} and @code{as_completed()}, in order to prevent
timeouts from deviating when the system clock is adjusted.

@item 
bpo-34758@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34758}: Add .wasm -> application/wasm to list of recognized file types
and content type headers

@item 
bpo-34789@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34789}: @ref{1e5e,,xml.sax.make_parser()} now accepts any iterable as its
`parser_list' argument.  Patch by Andrés Delfino.

@item 
bpo-34334@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34334}: In @code{QueueHandler}, clear @code{exc_text} from
@code{LogRecord} to prevent traceback from being written twice.

@item 
bpo-34687@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34687}: On Windows, asyncio now uses ProactorEventLoop, instead of
SelectorEventLoop, by default.

@item 
bpo-5950@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5950}: Support reading zip files with archive comments in
@ref{139,,zipimport}.

@item 
bpo-32892@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32892}: The parser now represents all constants as
@ref{2f1,,ast.Constant} instead of using specific constant AST types
(@code{Num}, @code{Str}, @code{Bytes}, @code{NameConstant} and @code{Ellipsis}). These
classes are considered deprecated and will be removed in future Python
versions.

@item 
bpo-34728@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34728}: Add deprecation warning when @code{loop} is used in methods:
@code{asyncio.sleep}, @code{asyncio.wait} and @code{asyncio.wait_for}.

@item 
bpo-34738@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34738}: ZIP files created by @code{distutils} will now include entries for
directories.

@item 
bpo-34659@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34659}: Add an optional `initial' argument to itertools.accumulate().

@item 
bpo-29577@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29577}: Support multiple mixin classes when creating Enums.

@item 
bpo-34670@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34670}: Add SSLContext.post_handshake_auth and
SSLSocket.verify_client_post_handshake for TLS 1.3’s post handshake
authentication feature.

@item 
bpo-32718@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32718}: The Activate.ps1 script from venv works with PowerShell Core
6.1 and is now available under all operating systems.

@item 
bpo-31177@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31177}: Fix bug that prevented using @ref{efc,,reset_mock} on mock instances with deleted attributes

@item 
bpo-34672@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34672}: Add a workaround, so the @code{'Z'} @ref{13f5,,time.strftime()}
specifier on the musl C library can work in some cases.

@item 
bpo-34666@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34666}: Implement @code{asyncio.StreamWriter.awrite} and
@code{asyncio.StreamWriter.aclose()} coroutines.  Methods are needed for
providing a consistent stream API with control flow switched on by
default.

@item 
bpo-6721@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6721}: Acquire the logging module’s commonly used internal locks while
fork()ing to avoid deadlocks in the child process.

@item 
bpo-34658@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34658}: Fix a rare interpreter unhandled exception state SystemError
only seen when using subprocess with a preexec_fn while an after_parent
handler has been registered with os.register_at_fork and the fork system
call fails.

@item 
bpo-34652@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34652}: Ensure @ref{529,,os.lchmod()} is never defined on Linux.

@item 
bpo-34638@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34638}: Store a weak reference to stream reader to break strong
references loop between reader and protocol.  It allows to detect and
close the socket if the stream is deleted (garbage collected) without
@code{close()} call.

@item 
bpo-34536@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34536}: @code{Enum._missing_}:  raise @code{ValueError} if None returned and
@code{TypeError} if non-member is returned.

@item 
bpo-34636@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34636}: Speed up re scanning of many non-matching characters for s w
and d within bytes objects. (microoptimization)

@item 
bpo-24412@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24412}: Add @ref{c46,,addModuleCleanup()} and
@ref{c47,,addClassCleanup()} to unittest to support cleanups
for @ref{c48,,setUpModule()} and
@ref{c49,,setUpClass()}. Patch by Lisa Roach.

@item 
bpo-34630@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34630}: Don’t log SSL certificate errors in asyncio code (connection
error logging is skipped already).

@item 
bpo-32490@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32490}: Prevent filename duplication in @ref{dc,,subprocess} exception
messages.  Patch by Zackery Spytz.

@item 
bpo-34363@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34363}: dataclasses.asdict() and .astuple() now handle namedtuples
correctly.

@item 
bpo-34625@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34625}: Update vendorized expat library version to 2.2.6.

@item 
bpo-32270@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32270}: The subprocess module no longer mistakenly closes redirected
fds even when they were in pass_fds when outside of the default @{0, 1, 2@}
set.

@item 
bpo-34622@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34622}: Create a dedicated @code{asyncio.CancelledError},
@code{asyncio.InvalidStateError} and @code{asyncio.TimeoutError} exception
classes.  Inherit them from corresponding exceptions from
@code{concurrent.futures} package. Extract @code{asyncio} exceptions into a
separate file.

@item 
bpo-34610@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34610}: Fixed iterator of @code{multiprocessing.managers.DictProxy}.

@item 
bpo-34421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34421}: Fix distutils logging for non-ASCII strings.  This caused
installation issues on Windows.

@item 
bpo-34604@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34604}: Fix possible mojibake in the error message of @code{pwd.getpwnam}
and @code{grp.getgrnam} using string representation because of invisible
characters or trailing whitespaces. Patch by William Grzybowski.

@item 
bpo-30977@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30977}: Make uuid.UUID use @code{__slots__} to reduce its memory
footprint. Based on original patch by Wouter Bolsterlee.

@item 
bpo-34574@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34574}: OrderedDict iterators are not exhausted during pickling
anymore. Patch by Sergey Fedoseev.

@item 
bpo-8110@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8110}: Refactored @ref{dc,,subprocess} to check for Windows-specific
modules rather than @code{sys.platform == 'win32'}.

@item 
bpo-34530@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34530}: @code{distutils.spawn.find_executable()} now falls back on
@ref{1e26,,os.defpath} if the @code{PATH} environment variable is not set.

@item 
bpo-34563@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34563}: On Windows, fix multiprocessing.Connection for very large read:
fix _winapi.PeekNamedPipe() and _winapi.ReadFile() for read larger than
INT_MAX (usually @code{2**31-1}).

@item 
bpo-34558@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34558}: Correct typo in Lib/ctypes/_aix.py

@item 
bpo-34282@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34282}: Move @code{Enum._convert} to @code{EnumMeta._convert_} and fix enum
members getting shadowed by parent attributes.

@item 
bpo-22872@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22872}: When the queue is closed, @ref{2ee,,ValueError} is now raised by
@ref{1e5f,,multiprocessing.Queue.put()} and @ref{1e60,,multiprocessing.Queue.get()}
instead of @ref{8ba,,AssertionError} and @ref{2c2,,OSError}, respectively. Patch
by Zackery Spytz.

@item 
bpo-34515@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34515}: Fix parsing non-ASCII identifiers in
@code{lib2to3.pgen2.tokenize} (
@geindex Python Enhancement Proposals; PEP 3131
PEP 3131@footnote{https://peps.python.org/pep-3131/}).

@item 
bpo-13312@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13312}: Avoids a possible integer underflow (undefined behavior) in the
time module’s year handling code when passed a very low negative year
value.

@item 
bpo-34472@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34472}: Improved compatibility for streamed files in @ref{138,,zipfile}.
Previously an optional signature was not being written and certain ZIP
applications were not supported. Patch by Silas Sewell.

@item 
bpo-34454@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34454}: Fix the .fromisoformat() methods of datetime types crashing
when given unicode with non-UTF-8-encodable code points.  Specifically,
datetime.fromisoformat() now accepts surrogate unicode code points used as
the separator. Report and tests by Alexey Izbyshev, patch by Paul Ganssle.

@item 
bpo-6700@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6700}: Fix inspect.getsourcelines for module level frames/tracebacks.
Patch by Vladimir Matveev.

@item 
bpo-34171@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34171}: Running the @ref{104,,trace} module no longer creates the
@code{trace.cover} file.

@item 
bpo-34441@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34441}: Fix crash when an @code{ABC}-derived class with invalid
@code{__subclasses__} is passed as the second argument to @ref{9ca,,issubclass()}.
Patch by Alexey Izbyshev.

@item 
bpo-34427@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34427}: Fix infinite loop in @code{a.extend(a)} for @code{MutableSequence}
subclasses.

@item 
bpo-34412@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34412}: Make @ref{1e61,,signal.strsignal()} work on HP-UX. Patch by Michael
Osipov.

@item 
bpo-20849@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20849}: shutil.copytree now accepts a new @code{dirs_exist_ok} keyword
argument. Patch by Josh Bronson.

@item 
bpo-31715@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31715}: Associate @code{.mjs} file extension with
@code{application/javascript} MIME Type.

@item 
bpo-34384@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34384}: @ref{b20,,os.readlink()} now accepts @ref{5a1,,path-like} and @ref{193,,bytes} objects on Windows.

@item 
bpo-22602@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22602}: The UTF-7 decoder now raises @ref{c0e,,UnicodeDecodeError} for
ill-formed sequences starting with “+” (as specified in RFC 2152).  Patch
by Zackery Spytz.

@item 
bpo-2122@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2122}: The @ref{c95,,mmap.flush()} method now returns
@code{None} on success, raises an exception on error under all platforms.

@item 
bpo-34341@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34341}: Appending to the ZIP archive with the ZIP64 extension no longer
grows the size of extra fields of existing entries.

@item 
bpo-34333@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34333}: Fix %-formatting in @ref{199a,,pathlib.PurePath.with_suffix()} when
formatting an error message.

@item 
bpo-18540@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18540}: The @ref{b05,,imaplib.IMAP4} and @ref{b06,,imaplib.IMAP4_SSL}
classes now resolve to the local host IP correctly when the default value
of `host' parameter (@code{'@w{'}}) is used.

@item 
bpo-26502@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26502}: Implement @code{traceback.FrameSummary.__len__()} method to
preserve compatibility with the old tuple API.

@item 
bpo-34318@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34318}: @ref{751,,assertRaises()},
@ref{753,,assertRaisesRegex()},
@ref{1370,,assertWarns()} and
@ref{1371,,assertWarnsRegex()} no longer success if the
passed callable is None. They no longer ignore unknown keyword arguments
in the context manager mode. A DeprecationWarning was raised in these
cases since Python 3.5.

@item 
bpo-9372@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9372}: Deprecate @ref{588,,__getitem__()} methods of
@ref{943,,xml.dom.pulldom.DOMEventStream}, @ref{944,,wsgiref.util.FileWrapper}
and @ref{945,,fileinput.FileInput}.

@item 
bpo-33613@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33613}: Fix a race condition in @code{multiprocessing.semaphore_tracker}
when the tracker receives SIGINT before it can register signal handlers
for ignoring it.

@item 
bpo-34248@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34248}: Report filename in the exception raised when the database file
cannot be opened by @ref{1e62,,dbm.gnu.open()} and @ref{1e63,,dbm.ndbm.open()} due to
OS-related error. Patch by Zsolt Cserna.

@item 
bpo-33089@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33089}: Add math.dist() to compute the Euclidean distance between two
points.

@item 
bpo-34246@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34246}: @ref{1060,,smtplib.SMTP.send_message()} no longer modifies the
content of the `mail_options' argument. Patch by Pablo S. Blum de Aguiar.

@item 
bpo-31047@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31047}: Fix @code{ntpath.abspath} for invalid paths on windows. Patch by
Franz Woellert.

@item 
bpo-32321@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32321}: Add pure Python fallback for functools.reduce. Patch by Robert
Wright.

@item 
bpo-34270@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34270}: The default asyncio task class now always has a name which can
be get or set using two new methods (@ref{bd7,,get_name()} and
@ref{bd6,,set_name()}) and is visible in the @ref{1c3,,repr()} output.
An initial name can also be set using the new @code{name} keyword argument to
@ref{1cb,,asyncio.create_task()} or the
@code{create_task()} method of the event loop.
If no initial name is set, the default Task implementation generates a
name like @code{Task-1} using a monotonic counter.

@item 
bpo-34263@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34263}: asyncio’s event loop will not pass timeouts longer than one day
to epoll/select etc.

@item 
bpo-34035@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34035}: Fix several AttributeError in zipfile seek() methods. Patch by
Mickaël Schoentgen.

@item 
bpo-32215@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32215}: Fix performance regression in @ref{d4,,sqlite3} when a DML
statement appeared in a different line than the rest of the SQL query.

@item 
bpo-34075@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34075}: Deprecate passing non-ThreadPoolExecutor instances to
@code{AbstractEventLoop.set_default_executor()}.

@item 
bpo-34251@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34251}: Restore @code{msilib.Win64} to preserve backwards compatibility
since it’s already used by @code{distutils}’ @code{bdist_msi} command.

@item 
bpo-19891@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19891}: Ignore errors caused by missing / non-writable homedir while
writing history during exit of an interactive session.  Patch by Anthony
Sottile.

@item 
bpo-33089@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33089}: Enhanced math.hypot() to support more than two dimensions.

@item 
bpo-34228@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34228}: tracemalloc: PYTHONTRACEMALLOC=0 environment variable and -X
tracemalloc=0 command line option are now allowed to disable explicitly
tracemalloc at startup.

@item 
bpo-13041@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13041}: Use @ref{130f,,shutil.get_terminal_size()} to calculate the terminal
width correctly in the @code{argparse.HelpFormatter} class.  Initial patch by
Zbyszek Jędrzejewski-Szmek.

@item 
bpo-34213@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34213}: Allow frozen dataclasses to have a field named “object”.
Previously this conflicted with an internal use of “object”.

@item 
bpo-34052@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34052}: @ref{5a8,,sqlite3.Connection.create_aggregate()},
@ref{5a7,,sqlite3.Connection.create_function()},
@ref{5a9,,sqlite3.Connection.set_authorizer()},
@ref{5aa,,sqlite3.Connection.set_progress_handler()} methods raises TypeError
when unhashable objects are passed as callable. These methods now don’t
pass such objects to SQLite API. Previous behavior could lead to
segfaults. Patch by Sergey Fedoseev.

@item 
bpo-34197@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34197}: Attributes `skipinitialspace', `doublequote' and `strict' of
the `dialect' attribute of the @ref{2d,,csv} reader are now @ref{3c1,,bool}
instances instead of integers 0 or 1.

@item 
bpo-32788@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32788}: Errors other than @ref{199,,TypeError} raised in methods
@code{__adapt__()} and @code{__conform__()} in the @ref{d4,,sqlite3} module are now
propagated to the user.

@item 
bpo-21446@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21446}: The @code{reload} fixer now uses @ref{73e,,importlib.reload()} instead
of deprecated @code{imp.reload()}.

@item 
bpo-940286@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=940286}: pydoc’s @code{Helper.showtopic()} method now prints the cross
references of a topic correctly.

@item 
bpo-34164@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34164}: @ref{122b,,base64.b32decode()} could raise UnboundLocalError or
OverflowError for incorrect padding.  Now it always raises
@code{base64.Error} in these cases.

@item 
bpo-33729@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33729}: Fixed issues with arguments parsing in @ref{6c,,hashlib}.

@item 
bpo-34097@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34097}: ZipFile can zip files older than 1980-01-01 and newer than
2107-12-31 using a new @code{strict_timestamps} parameter at the cost of
setting the timestamp to the limit.

@item 
bpo-34108@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34108}: Remove extraneous CR in 2to3 refactor.

@item 
bpo-34070@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34070}: Make sure to only check if the handle is a tty, when opening a
file with @code{buffering=-1}.

@item 
bpo-27494@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27494}: Reverted bpo-27494@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27494}. 2to3 rejects now a trailing comma in
generator expressions.

@item 
bpo-33967@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33967}: functools.singledispatch now raises TypeError instead of
IndexError when no positional arguments are passed.

@item 
bpo-34041@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34041}: Add the parameter `deterministic' to the
@ref{5a7,,sqlite3.Connection.create_function()} method. Patch by Sergey
Fedoseev.

@item 
bpo-34056@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34056}: Ensure the loader shim created by @code{imp.load_module} always
returns bytes from its @code{get_data()} function. This fixes using
@code{imp.load_module} with 
@geindex Python Enhancement Proposals; PEP 552
PEP 552@footnote{https://peps.python.org/pep-0552/} hash-based pycs.

@item 
bpo-34054@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34054}: The multiprocessing module now uses the monotonic clock
@ref{55c,,time.monotonic()} instead of the system clock @ref{55d,,time.time()} to
implement timeout.

@item 
bpo-34043@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34043}: Optimize tarfile uncompress performance about 15% when gzip is
used.

@item 
bpo-34044@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34044}: @code{subprocess.Popen} now copies the `startupinfo' argument to
leave it unchanged: it will modify the copy, so that the same
@code{STARTUPINFO} object can be used multiple times.

@item 
bpo-34010@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34010}: Fixed a performance regression for reading streams with
tarfile. The buffered read should use a list, instead of appending to a
bytes object.

@item 
bpo-34019@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34019}: webbrowser: Correct the arguments passed to Opera Browser when
opening a new URL using the @code{webbrowser} module. Patch by Bumsik Kim.

@item 
bpo-34003@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34003}: csv.DictReader now creates dicts instead of OrderedDicts. Patch
by Michael Selik.

@item 
bpo-33978@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33978}: Closed existing logging handlers before reconfiguration via
fileConfig and dictConfig. Patch by Karthikeyan Singaravelan.

@item 
bpo-14117@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14117}: Make minor tweaks to turtledemo. The ‘wikipedia’ example is now
‘rosette’, describing what it draws.  The ‘penrose’ print output is
reduced. The’1024’ output of ‘tree’ is eliminated.

@item 
bpo-33974@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33974}: Fixed passing lists and tuples of strings containing special
characters @code{"}, @code{\}, @code{@{}, @code{@}} and @code{\n} as options to
@ref{100,,ttk} widgets.

@item 
bpo-27500@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27500}: Fix getaddrinfo to resolve IPv6 addresses correctly.

@item 
bpo-24567@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24567}: Improve random.choices() to handle subnormal input weights that
could occasionally trigger an IndexError.

@item 
bpo-33871@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33871}: Fixed integer overflow in @ref{d5b,,os.readv()}, @ref{d5e,,os.writev()},
@ref{d5a,,os.preadv()} and @ref{d5d,,os.pwritev()} and in @ref{d0b,,os.sendfile()} with
`headers' or `trailers' arguments (on BSD-based OSes and macOS).

@item 
bpo-25007@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25007}: Add @ref{758,,copy.copy()} and @ref{d6b,,copy.deepcopy()} support to zlib
compressors and decompressors.  Patch by Zackery Spytz.

@item 
bpo-33929@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33929}: multiprocessing: Fix a race condition in Popen of
multiprocessing.popen_spawn_win32. The child process now duplicates the
read end of pipe instead of “stealing” it. Previously, the read end of
pipe was “stolen” by the child process, but it leaked a handle if the
child process had been terminated before it could steal the handle from
the parent process.

@item 
bpo-33899@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33899}: Tokenize module now implicitly emits a NEWLINE when provided
with input that does not have a trailing new line.  This behavior now
matches what the C tokenizer does internally.  Contributed by Ammar Askar.

@item 
bpo-33897@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33897}: Added a ‘force’ keyword argument to logging.basicConfig().

@item 
bpo-33695@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33695}: @ref{c24,,shutil.copytree()} uses @ref{c5a,,os.scandir()} function and
all copy functions depending from it use cached @ref{26f,,os.stat()} values.
The speedup for copying a directory with 8000 files is around +9% on
Linux, +20% on Windows and + 30% on a Windows SMB share. Also the number
of @code{os.stat()} syscalls is reduced by 38% making
@code{shutil.copytree()} especially faster on network filesystems.
(Contributed by Giampaolo Rodola’ in bpo-33695@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33695}.)

@item 
bpo-33916@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33916}: bz2 and lzma: When Decompressor.__init__() is called twice,
free the old lock to not leak memory.

@item 
bpo-32568@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32568}: Make select.epoll() and its documentation consistent regarding
`sizehint' and `flags'.

@item 
bpo-33833@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33833}: Fixed bug in asyncio where ProactorSocketTransport logs
AssertionError if force closed during write.

@item 
bpo-33663@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33663}: Convert content length to string before putting to header.

@item 
bpo-33721@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33721}: @ref{a6,,os.path} functions that return a boolean result like
@ref{c09,,exists()}, @ref{c0a,,lexists()}, @ref{c0b,,isdir()},
@ref{c0c,,isfile()}, @ref{c07,,islink()}, and
@ref{c0d,,ismount()}, and @ref{268,,pathlib.Path} methods that return a
boolean result like @ref{c11,,exists()},
@ref{53b,,is_dir()}, @ref{53a,,is_file()},
@ref{c12,,is_mount()}, @ref{c13,,is_symlink()},
@ref{c14,,is_block_device()},
@ref{c15,,is_char_device()}, @ref{c16,,is_fifo()},
@ref{c17,,is_socket()} now return @code{False} instead of raising
@ref{2ee,,ValueError} or its subclasses @ref{889,,UnicodeEncodeError} and
@ref{c0e,,UnicodeDecodeError} for paths that contain characters or bytes
unrepresentable at the OS level.

@item 
bpo-26544@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26544}: Fixed implementation of @ref{183f,,platform.libc_ver()}. It almost
always returned version ‘2.9’ for glibc.

@item 
bpo-33843@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33843}: Remove deprecated @code{cgi.escape}, @code{cgi.parse_qs} and
@code{cgi.parse_qsl}.

@item 
bpo-33842@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33842}: Remove @code{tarfile.filemode} which is deprecated since Python
3.3.

@item 
bpo-30167@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30167}: Prevent site.main() exception if PYTHONSTARTUP is set. Patch by
Steve Weber.

@item 
bpo-33805@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33805}: Improve error message of dataclasses.replace() when an InitVar
is not specified

@item 
bpo-33687@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33687}: Fix the call to @code{os.chmod()} for @code{uu.decode()} if a mode is
given or decoded. Patch by Timo Furrer.

@item 
bpo-33812@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33812}: Datetime instance d with non-None tzinfo, but with
d.tzinfo.utcoffset(d) returning None is now treated as naive by the
astimezone() method.

@item 
bpo-32108@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32108}: In configparser, don’t clear section when it is assigned to
itself.

@item 
bpo-27397@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27397}: Make email module properly handle invalid-length base64
strings.

@item 
bpo-33578@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33578}: Implement multibyte encoder/decoder state methods

@item 
bpo-30805@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30805}: Avoid race condition with debug logging

@item 
bpo-33476@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33476}: Fix _header_value_parser.py when address group is missing final
‘;’. Contributed by Enrique Perez-Terron

@item 
bpo-33694@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33694}: asyncio: Fix a race condition causing data loss on
pause_reading()/resume_reading() when using the ProactorEventLoop.

@item 
bpo-32493@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32493}: Correct test for @code{uuid_enc_be} availability in
@code{configure.ac}. Patch by Michael Felt.

@item 
bpo-33792@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33792}: Add asyncio.WindowsSelectorEventLoopPolicy and
asyncio.WindowsProactorEventLoopPolicy.

@item 
bpo-33274@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33274}: W3C DOM Level 1 specifies return value of
Element.removeAttributeNode() as “The Attr node that was removed.”
xml.dom.minidom now complies with this requirement.

@item 
bpo-33778@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33778}: Update @code{unicodedata}’s database to Unicode version 11.0.0.

@item 
bpo-33165@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33165}: Added a stacklevel parameter to logging calls to allow use of
wrapper/helper functions for logging APIs.

@item 
bpo-33770@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33770}: improve base64 exception message for encoded inputs of invalid
length

@item 
bpo-33769@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33769}: asyncio/start_tls: Fix error message; cancel callbacks in case
of an unhandled error; mark SSLTransport as closed if it is aborted.

@item 
bpo-33767@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33767}: The concatenation (@code{+}) and repetition (@code{*}) sequence
operations now raise @ref{199,,TypeError} instead of @ref{796,,SystemError} when
performed on @ref{51a,,mmap.mmap} objects.  Patch by Zackery Spytz.

@item 
bpo-33734@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33734}: asyncio/ssl: Fix AttributeError, increase default handshake
timeout

@item 
bpo-31014@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31014}: Fixed creating a controller for @ref{11c,,webbrowser} when a user
specifies a path to an entry in the BROWSER environment variable.  Based
on patch by John Still.

@item 
bpo-2504@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2504}: Add gettext.pgettext() and variants.

@item 
bpo-33197@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33197}: Add description property for _ParameterKind

@item 
bpo-32751@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32751}: When cancelling the task due to a timeout,
@ref{816,,asyncio.wait_for()} will now wait until the cancellation is complete.

@item 
bpo-32684@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32684}: Fix gather to propagate cancellation of itself even with
return_exceptions.

@item 
bpo-33654@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33654}: Support protocol type switching in SSLTransport.set_protocol().

@item 
bpo-33674@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33674}: Pause the transport as early as possible to further reduce the
risk of data_received() being called before connection_made().

@item 
bpo-33671@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33671}: @ref{c54,,shutil.copyfile()}, @ref{c55,,shutil.copy()},
@ref{c56,,shutil.copy2()}, @ref{c24,,shutil.copytree()} and @ref{c57,,shutil.move()} use
platform-specific fast-copy syscalls on Linux and macOS in order to copy
the file more efficiently. On Windows @code{shutil.copyfile()} uses a
bigger default buffer size (1 MiB instead of 16 KiB) and a
@ref{166,,memoryview()}-based variant of @ref{c58,,shutil.copyfileobj()} is used.
The speedup for copying a 512MiB file is about +26% on Linux, +50% on
macOS and +40% on Windows. Also, much less CPU cycles are consumed.
(Contributed by Giampaolo Rodola’ in bpo-25427@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25427}.)

@item 
bpo-33674@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33674}: Fix a race condition in SSLProtocol.connection_made() of
asyncio.sslproto: start immediately the handshake instead of using
call_soon(). Previously, data_received() could be called before the
handshake started, causing the handshake to hang or fail.

@item 
bpo-31647@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31647}: Fixed bug where calling write_eof() on a
_SelectorSocketTransport after it’s already closed raises AttributeError.

@item 
bpo-32610@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32610}: Make asyncio.all_tasks() return only pending tasks.

@item 
bpo-32410@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32410}: Avoid blocking on file IO in sendfile fallback code

@item 
bpo-33469@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33469}: Fix RuntimeError after closing loop that used run_in_executor

@item 
bpo-33672@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33672}: Fix Task.__repr__ crash with Cython’s bogus coroutines

@item 
bpo-33654@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33654}: Fix transport.set_protocol() to support switching between
asyncio.Protocol and asyncio.BufferedProtocol.  Fix loop.start_tls() to
work with asyncio.BufferedProtocols.

@item 
bpo-33652@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33652}: Pickles of type variables and subscripted generics are now
future-proof and compatible with older Python versions.

@item 
bpo-32493@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32493}: Fixed @ref{da7,,uuid.uuid1()} on FreeBSD.

@item 
bpo-33238@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33238}: Add @code{InvalidStateError} to @ref{24,,concurrent.futures}.
@code{Future.set_result} and @code{Future.set_exception} now raise
@code{InvalidStateError} if the futures are not pending or running. Patch by
Jason Haydaman.

@item 
bpo-33618@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33618}: Finalize and document preliminary and experimental TLS 1.3
support with OpenSSL 1.1.1

@item 
bpo-33625@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33625}: Release GIL on @code{grp.getgrnam}, @code{grp.getgrgid},
@code{pwd.getpwnam} and @code{pwd.getpwuid} if reentrant variants of these
functions are available. Patch by William Grzybowski.

@item 
bpo-33623@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33623}: Fix possible SIGSGV when asyncio.Future is created in __del__

@item 
bpo-11874@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11874}: Use a better regex when breaking usage into wrappable parts.
Avoids bogus assertion errors from custom metavar strings.

@item 
bpo-30877@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30877}: Fixed a bug in the Python implementation of the JSON decoder
that prevented the cache of parsed strings from clearing after finishing
the decoding. Based on patch by c-fos.

@item 
bpo-33604@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33604}: Remove HMAC default to md5 marked for removal in 3.8 (removal
originally planned in 3.6, bump to 3.8 in PR 7062).

@item 
bpo-33582@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33582}: Emit a deprecation warning for inspect.formatargspec

@item 
bpo-21145@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21145}: Add @code{functools.cached_property} decorator, for computed
properties cached for the life of the instance.

@item 
bpo-33570@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33570}: Change TLS 1.3 cipher suite settings for compatibility with
OpenSSL 1.1.1-pre6 and newer. OpenSSL 1.1.1 will have TLS 1.3 ciphers
enabled by default.

@item 
bpo-28556@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28556}: Do not simplify arguments to @code{typing.Union}. Now
@code{Union[Manager, Employee]} is not simplified to @code{Employee} at runtime.
Such simplification previously caused several bugs and limited
possibilities for introspection.

@item 
bpo-12486@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12486}: @ref{702,,tokenize.generate_tokens()} is now documented as a public
API to tokenize unicode strings. It was previously present but
undocumented.

@item 
bpo-33540@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33540}: Add a new @code{block_on_close} class attribute to
@code{ForkingMixIn} and @code{ThreadingMixIn} classes of @ref{d2,,socketserver}.

@item 
bpo-33548@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33548}: tempfile._candidate_tempdir_list should consider common TEMP
locations

@item 
bpo-33109@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33109}: argparse subparsers are once again not required by default,
reverting the change in behavior introduced by bpo-26510@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26510} in 3.7.0a2.

@item 
bpo-33541@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33541}: Remove unused private method @code{_strptime.LocaleTime.__pad}
(a.k.a. @code{_LocaleTime__pad}).

@item 
bpo-33536@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33536}: dataclasses.make_dataclass now checks for invalid field names
and duplicate fields. Also, added a check for invalid field
specifications.

@item 
bpo-33542@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33542}: Prevent @code{uuid.get_node} from using a DUID instead of a MAC on
Windows. Patch by Zvi Effron

@item 
bpo-26819@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26819}: Fix race condition with @code{ReadTransport.resume_reading} in
Windows proactor event loop.

@item 
Fix failure in @code{typing.get_type_hints()} when ClassVar was provided as a
string forward reference.

@item 
bpo-33516@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33516}: @ref{1095,,unittest.mock.MagicMock} now supports the @code{__round__}
magic method.

@item 
bpo-28612@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28612}: Added support for Site Maps to urllib’s @code{RobotFileParser} as
@ref{1e64,,RobotFileParser.site_maps()}. Patch by Lady Red, based
on patch by Peter Wirtz.

@item 
bpo-28167@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28167}: Remove platform.linux_distribution, which was deprecated since
3.5.

@item 
bpo-33504@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33504}: Switch the default dictionary implementation for
@ref{26,,configparser} from @ref{7f4,,collections.OrderedDict} to the standard
@ref{184,,dict} type.

@item 
bpo-33505@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33505}: Optimize asyncio.ensure_future() by reordering if checks: 1.17x
faster.

@item 
bpo-33497@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33497}: Add errors param to cgi.parse_multipart and make an encoding in
FieldStorage use the given errors (needed for Twisted).  Patch by Amber
Brown.

@item 
bpo-29235@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29235}: The @code{cProfile.Profile} class can now be used as a
context manager. Patch by Scott Sanderson.

@item 
bpo-33495@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33495}: Change dataclasses.Fields repr to use the repr of each of its
members, instead of str.  This makes it more clear what each field
actually represents.  This is especially true for the ‘type’ member.

@item 
bpo-26103@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26103}: Correct @code{inspect.isdatadescriptor} to look for @code{__set__} or
@code{__delete__}.  Patch by Aaron Hall.

@item 
bpo-29209@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29209}: Removed the @code{doctype()} method and the `html' parameter of
the constructor of @ref{c4f,,XMLParser}.  The
@code{doctype()} method defined in a subclass will no longer be called.
Deprecated methods @code{getchildren()} and @code{getiterator()} in the
@ref{12c,,ElementTree} module emit now a @ref{1a4,,DeprecationWarning}
instead of @ref{acc,,PendingDeprecationWarning}.

@item 
bpo-33453@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33453}: Fix dataclasses to work if using literal string type
annotations or if using PEP 563 “Postponed Evaluation of Annotations”.
Only specific string prefixes are detected for both ClassVar (“ClassVar”
and “typing.ClassVar”) and InitVar (“InitVar” and “dataclasses.InitVar”).

@item 
bpo-28556@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28556}: Minor fixes in typing module: add annotations to
@code{NamedTuple.__new__}, pass @code{*args} and @code{**kwds} in
@code{Generic.__new__}.  Original PRs by Paulius Šarka and Chad Dombrova.

@item 
bpo-33365@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33365}: Print the header values besides the header keys instead just
the header keys if `debuglevel' is set to >0 in @ref{73,,http.client}. Patch
by Marco Strigl.

@item 
bpo-20087@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20087}: Updated alias mapping with glibc 2.27 supported locales.

@item 
bpo-33422@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33422}: Fix trailing quotation marks getting deleted when looking up
byte/string literals on pydoc. Patch by Andrés Delfino.

@item 
bpo-28167@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28167}: The function @code{platform.linux_distribution} and
@code{platform.dist} now trigger a @code{DeprecationWarning} and have been
marked for removal in Python 3.8

@item 
bpo-33281@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33281}: Fix ctypes.util.find_library regression on macOS.

@item 
bpo-33311@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33311}: Text and html output generated by cgitb does not display
parentheses if the current call is done directly in the module. Patch by
Stéphane Blondon.

@item 
bpo-27300@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27300}: The file classes in `tempfile' now accept an `errors' parameter
that complements the already existing `encoding'.  Patch by Stephan Hohe.

@item 
bpo-32933@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32933}: @ref{11ed,,unittest.mock.mock_open()} now supports iteration over the
file contents. Patch by Tony Flury.

@item 
bpo-33217@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33217}: Raise @ref{199,,TypeError} when looking up non-Enum objects in Enum
classes and Enum members.

@item 
bpo-33197@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33197}: Update error message when constructing invalid
inspect.Parameters Patch by Donghee Na.

@item 
bpo-33383@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33383}: Fixed crash in the get() method of the @ref{38,,dbm.ndbm} database
object when it is called with a single argument.

@item 
bpo-33375@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33375}: The warnings module now finds the Python file associated with a
warning from the code object, rather than the frame’s global namespace.
This is consistent with how tracebacks and pdb find filenames, and should
work better for dynamically executed code.

@item 
bpo-33336@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33336}: @code{imaplib} now allows @code{MOVE} command in @code{IMAP4.uid()} (RFC
6851: IMAP MOVE Extension) and potentially as a name of supported method
of @code{IMAP4} object.

@item 
bpo-32455@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32455}: Added `jump' parameter to @ref{1137,,dis.stack_effect()}.

@item 
bpo-27485@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27485}: Rename and deprecate undocumented functions in
@ref{111,,urllib.parse()}.

@item 
bpo-33332@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33332}: Add @code{signal.valid_signals()} to expose the POSIX sigfillset()
functionality.

@item 
bpo-33251@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33251}: @code{ConfigParser.items()} was fixed so that key-value pairs
passed in via @ref{1e65,,vars()} are not included in the resulting output.

@item 
bpo-33329@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33329}: Fix multiprocessing regression on newer glibcs

@item 
bpo-33334@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33334}: @ref{1137,,dis.stack_effect()} now supports all defined opcodes
including NOP and EXTENDED_ARG.

@item 
bpo-991266@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=991266}: Fix quoting of the @code{Comment} attribute of
@ref{1e66,,http.cookies.SimpleCookie}.

@item 
bpo-33131@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33131}: Upgrade bundled version of pip to 10.0.1.

@item 
bpo-33308@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33308}: Fixed a crash in the @code{parser} module when converting an ST
object to a tree of tuples or lists with @code{line_info=False} and
@code{col_info=True}.

@item 
bpo-23403@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23403}: lib2to3 now uses pickle protocol 4 for pre-computed grammars.

@item 
bpo-33266@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33266}: lib2to3 now recognizes @code{rf'...'} strings.

@item 
bpo-11594@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11594}: Ensure line-endings are respected when using lib2to3.

@item 
bpo-33254@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33254}: Have @ref{504,,importlib.resources.contents()} and
@code{importlib.abc.ResourceReader.contents()} return an @ref{1433,,iterable}
instead of an @ref{4c9,,iterator}.

@item 
bpo-33265@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33265}: @code{contextlib.ExitStack} and @code{contextlib.AsyncExitStack} now
use a method instead of a wrapper function for exit callbacks.

@item 
bpo-33263@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33263}: Fix FD leak in @code{_SelectorSocketTransport}  Patch by Vlad
Starostin.

@item 
bpo-33256@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33256}: Fix display of @code{<module>} call in the html produced by
@code{cgitb.html()}. Patch by Stéphane Blondon.

@item 
bpo-33144@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33144}: @code{random.Random()} and its subclassing mechanism got optimized
to check only once at class/subclass instantiation time whether its
@code{getrandbits()} method can be relied on by other methods, including
@code{randrange()}, for the generation of arbitrarily large random integers.
Patch by Wolfgang Maier.

@item 
bpo-33185@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33185}: Fixed regression when running pydoc with the @ref{23e,,-m}
switch. (The regression was introduced in 3.7.0b3 by the resolution of
bpo-33053@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33053})

This fix also changed pydoc to add @code{os.getcwd()} to @ref{3e2,,sys.path}
when necessary, rather than adding @code{"."}.

@item 
bpo-29613@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29613}: Added support for the @code{SameSite} cookie flag to the
@code{http.cookies} module.

@item 
bpo-33169@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33169}: Delete entries of @code{None} in @ref{7fb,,sys.path_importer_cache}
when @code{importlib.machinery.invalidate_caches()} is called.

@item 
bpo-33203@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33203}: @code{random.Random.choice()} now raises @code{IndexError} for empty
sequences consistently even when called from subclasses without a
@code{getrandbits()} implementation.

@item 
bpo-33224@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33224}: Update difflib.mdiff() for 
@geindex Python Enhancement Proposals; PEP 479
PEP 479@footnote{https://peps.python.org/pep-0479/}.  Convert an uncaught
StopIteration in a generator into a return-statement.

@item 
bpo-33209@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33209}: End framing at the end of C implementation of
@ref{1e67,,pickle.Pickler.dump()}.

@item 
bpo-32861@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32861}: The urllib.robotparser’s @code{__str__} representation now
includes wildcard entries and the “Crawl-delay” and “Request-rate” fields.
Also removes extra newlines that were being appended to the end of the
string. Patch by Michael Lazar.

@item 
bpo-23403@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23403}: @code{DEFAULT_PROTOCOL} in @ref{ab,,pickle} was bumped to 4. Protocol
4 is described in 
@geindex Python Enhancement Proposals; PEP 3154
PEP 3154@footnote{https://peps.python.org/pep-3154/} and available since Python 3.4. It offers
better performance and smaller size compared to protocol 3 introduced in
Python 3.0.

@item 
bpo-20104@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20104}: Improved error handling and fixed a reference leak in
@ref{52f,,os.posix_spawn()}.

@item 
bpo-33106@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33106}: Deleting a key from a read-only dbm database raises module
specific error instead of KeyError.

@item 
bpo-33175@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33175}: In dataclasses, Field.__set_name__ now looks up the
__set_name__ special method on the class, not the instance, of the default
value.

@item 
bpo-32380@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32380}: Create functools.singledispatchmethod to support generic single
dispatch on descriptors and methods.

@item 
bpo-33141@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33141}: Have Field objects pass through __set_name__ to their default
values, if they have their own __set_name__.

@item 
bpo-33096@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33096}: Allow ttk.Treeview.insert to insert iid that has a false
boolean value. Note iid=0 and iid=False would be same. Patch by Garvit
Khatri.

@item 
bpo-32873@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32873}: Treat type variables and special typing forms as immutable by
copy and pickle.  This fixes several minor issues and inconsistencies, and
improves backwards compatibility with Python 3.6.

@item 
bpo-33134@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33134}: When computing dataclass’s __hash__, use the lookup table to
contain the function which returns the __hash__ value.  This is an
improvement over looking up a string, and then testing that string to see
what to do.

@item 
bpo-33127@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33127}: The ssl module now compiles with LibreSSL 2.7.1.

@item 
bpo-32505@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32505}: Raise TypeError if a member variable of a dataclass is of type
Field, but doesn’t have a type annotation.

@item 
bpo-33078@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33078}: Fix the failure on OSX caused by the tests relying on
sem_getvalue

@item 
bpo-33116@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33116}: Add ‘Field’ to dataclasses.__all__.

@item 
bpo-32896@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32896}: Fix an error where subclassing a dataclass with a field that
uses a default_factory would generate an incorrect class.

@item 
bpo-33100@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33100}: Dataclasses: If a field has a default value that’s a
MemberDescriptorType, then it’s from that field being in __slots__, not an
actual default value.

@item 
bpo-32953@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32953}: If a non-dataclass inherits from a frozen dataclass, allow
attributes to be added to the derived class.  Only attributes from the
frozen dataclass cannot be assigned to.  Require all dataclasses in a
hierarchy to be either all frozen or all non-frozen.

@item 
bpo-33097@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33097}: Raise RuntimeError when @code{executor.submit} is called during
interpreter shutdown.

@item 
bpo-32968@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32968}: Modulo and floor division involving Fraction and float should
return float.

@item 
bpo-33061@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33061}: Add missing @code{NoReturn} to @code{__all__} in typing.py

@item 
bpo-33078@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33078}: Fix the size handling in multiprocessing.Queue when a pickling
error occurs.

@item 
bpo-33064@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33064}: lib2to3 now properly supports trailing commas after @code{*args}
and @code{**kwargs} in function signatures.

@item 
bpo-33056@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33056}: FIX properly close leaking fds in
concurrent.futures.ProcessPoolExecutor.

@item 
bpo-33021@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33021}: Release the GIL during fstat() calls, avoiding hang of all
threads when calling mmap.mmap(), os.urandom(), and random.seed().  Patch
by Nir Soffer.

@item 
bpo-31804@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31804}: Avoid failing in multiprocessing.Process if the standard
streams are closed or None at exit.

@item 
bpo-33034@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33034}: Providing an explicit error message when casting the port
property to anything that is not an integer value using @code{urlparse()} and
@code{urlsplit()}. Patch by Matt Eaton.

@item 
bpo-30249@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30249}: Improve struct.unpack_from() exception messages for problems
with the buffer size and offset.

@item 
bpo-33037@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33037}: Skip sending/receiving data after SSL transport closing.

@item 
bpo-27683@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27683}: Fix a regression in @ref{84,,ipaddress} that result of
@code{hosts()} is empty when the network is constructed by a tuple
containing an integer mask and only 1 bit left for addresses.

@item 
bpo-22674@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22674}: Add the strsignal() function in the signal module that returns
the system description of the given signal, as returned by strsignal(3).

@item 
bpo-32999@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32999}: Fix C implementation of @code{ABC.__subclasscheck__(cls,
subclass)} crashed when @code{subclass} is not a type object.

@item 
bpo-33009@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33009}: Fix inspect.signature() for single-parameter partialmethods.

@item 
bpo-32969@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32969}: Expose several missing constants in zlib and fix corresponding
documentation.

@item 
bpo-32056@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32056}: Improved exceptions raised for invalid number of channels and
sample width when read an audio file in modules @code{aifc}, @ref{11a,,wave}
and @code{sunau}.

@item 
bpo-32970@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32970}: Improved disassembly of the MAKE_FUNCTION instruction.

@item 
bpo-32844@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32844}: Fix wrong redirection of a low descriptor (0 or 1) to stderr in
subprocess if another low descriptor is closed.

@item 
bpo-32960@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32960}: For dataclasses, disallow inheriting frozen from non-frozen
classes, and also disallow inheriting non-frozen from frozen classes. This
restriction will be relaxed at a future date.

@item 
bpo-32713@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32713}: Fixed tarfile.itn handling of out-of-bounds float values. Patch
by Joffrey Fuhrer.

@item 
bpo-32257@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32257}: The ssl module now contains OP_NO_RENEGOTIATION constant,
available with OpenSSL 1.1.0h or 1.1.1.

@item 
bpo-32951@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32951}: Direct instantiation of SSLSocket and SSLObject objects is now
prohibited. The constructors were never documented, tested, or designed as
public constructors. Users were suppose to use ssl.wrap_socket() or
SSLContext.

@item 
bpo-32929@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32929}: Remove the tri-state parameter “hash”, and add the boolean
“unsafe_hash”. If unsafe_hash is True, add a __hash__ function, but if a
__hash__ exists, raise TypeError.  If unsafe_hash is False, add a __hash__
based on the values of eq= and frozen=.  The unsafe_hash=False behavior is
the same as the old hash=None behavior.  unsafe_hash=False is the default,
just as hash=None used to be.

@item 
bpo-32947@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32947}: Add OP_ENABLE_MIDDLEBOX_COMPAT and test workaround for TLSv1.3
for future compatibility with OpenSSL 1.1.1.

@item 
bpo-32146@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32146}: Document the interaction between frozen executables and the
spawn and forkserver start methods in multiprocessing.

@item 
bpo-30622@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30622}: The ssl module now detects missing NPN support in LibreSSL.

@item 
bpo-32922@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32922}: dbm.open() now encodes filename with the filesystem encoding
rather than default encoding.

@item 
bpo-32759@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32759}: Free unused arenas in multiprocessing.heap.

@item 
bpo-32859@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32859}: In @code{os.dup2}, don’t check every call whether the @code{dup3}
syscall exists or not.

@item 
bpo-32556@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32556}: nt._getfinalpathname, nt._getvolumepathname and
nt._getdiskusage now correctly convert from bytes.

@item 
bpo-21060@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21060}: Rewrite confusing message from setup.py upload from “No dist
file created in earlier command” to the more helpful “Must create and
upload files in one command”.

@item 
bpo-32857@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32857}: In @ref{f6,,tkinter}, @code{after_cancel(None)} now raises a
@ref{2ee,,ValueError} instead of canceling the first scheduled function.
Patch by Cheryl Sabella.

@item 
bpo-32852@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32852}: Make sure sys.argv remains as a list when running trace.

@item 
bpo-31333@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31333}: @code{_abc} module is added.  It is a speedup module with C
implementations for various functions and methods in @code{abc}.  Creating an
ABC subclass and calling @code{isinstance} or @code{issubclass} with an ABC
subclass are up to 1.5x faster. In addition, this makes Python start-up up
to 10% faster.

Note that the new implementation hides internal registry and caches,
previously accessible via private attributes @code{_abc_registry},
@code{_abc_cache}, and @code{_abc_negative_cache}.  There are three debugging
helper methods that can be used instead @code{_dump_registry},
@code{_abc_registry_clear}, and @code{_abc_caches_clear}.

@item 
bpo-32841@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32841}: Fixed @code{asyncio.Condition} issue which silently ignored
cancellation after notifying and cancelling a conditional lock. Patch by
Bar Harel.

@item 
bpo-32819@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32819}: ssl.match_hostname() has been simplified and no longer depends
on re and ipaddress module for wildcard and IP addresses. Error reporting
for invalid wildcards has been improved.

@item 
bpo-19675@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19675}: @code{multiprocessing.Pool} no longer leaks processes if its
initialization fails.

@item 
bpo-32394@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32394}: socket: Remove
TCP_FASTOPEN,TCP_KEEPCNT,TCP_KEEPIDLE,TCP_KEEPINTVL flags on older version
Windows during run-time.

@item 
bpo-31787@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31787}: Fixed refleaks of @code{__init__()} methods in various modules.
(Contributed by Oren Milman)

@item 
bpo-30157@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30157}: Fixed guessing quote and delimiter in csv.Sniffer.sniff() when
only the last field is quoted.  Patch by Jake Davis.

@item 
bpo-30688@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30688}: Added support of @code{\N@{name@}} escapes in regular expressions.
Based on patch by Jonathan Eunice.

@item 
bpo-32792@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32792}: collections.ChainMap() preserves the order of the underlying
mappings.

@item 
bpo-32775@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32775}: @ref{1898,,fnmatch.translate()} no longer produces patterns which
contain set operations. Sets starting with ‘[’ or containing ‘–’, ‘&&’,
‘~~’ or ‘||’ will be interpreted differently in regular expressions in
future versions. Currently they emit warnings. fnmatch.translate() now
avoids producing patterns containing such sets by accident.

@item 
bpo-32622@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32622}: Implement native fast sendfile for Windows proactor event loop.

@item 
bpo-32777@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32777}: Fix a rare but potential pre-exec child process deadlock in
subprocess on POSIX systems when marking file descriptors inheritable on
exec in the child process.  This bug appears to have been introduced in
3.4.

@item 
bpo-32647@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32647}: The ctypes module used to depend on indirect linking for
dlopen. The shared extension is now explicitly linked against libdl on
platforms with dl.

@item 
bpo-32749@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32749}: A @ref{36,,dbm.dumb} database opened with flags ‘r’ is now
read-only. @ref{c93,,dbm.dumb.open()} with flags ‘r’ and ‘w’ no longer creates
a database if it does not exist.

@item 
bpo-32741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32741}: Implement @code{asyncio.TimerHandle.when()} method.

@item 
bpo-32691@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32691}: Use mod_spec.parent when running modules with pdb

@item 
bpo-32734@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32734}: Fixed @code{asyncio.Lock()} safety issue which allowed acquiring
and locking the same lock multiple times, without it being free. Patch by
Bar Harel.

@item 
bpo-32727@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32727}: Do not include name field in SMTP envelope from address. Patch
by Stéphane Wirtel

@item 
bpo-31453@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31453}: Add TLSVersion constants and SSLContext.maximum_version /
minimum_version attributes. The new API wraps OpenSSL 1.1
@indicateurl{https://web.archive.org/web/20180309043602/https://www.openssl.org/docs/man1.1.0/ssl/SSL_CTX_set_min_proto_version.html}
feature.

@item 
bpo-24334@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24334}: Internal implementation details of ssl module were cleaned up.
The SSLSocket has one less layer of indirection. Owner and session
information are now handled by the SSLSocket and SSLObject constructor.
Channel binding implementation has been simplified.

@item 
bpo-31848@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31848}: Fix the error handling in Aifc_read.initfp() when the SSND
chunk is not found. Patch by Zackery Spytz.

@item 
bpo-32585@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32585}: Add Ttk spinbox widget to @ref{100,,tkinter.ttk}.  Patch by Alan D
Moore.

@item 
bpo-32512@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32512}: @ref{b4,,profile} CLI accepts @code{-m module_name} as an alternative
to script path.

@item 
bpo-8525@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8525}: help() on a type now displays builtin subclasses. This is
intended primarily to help with notification of more specific exception
subclasses.

Patch by Sanyam Khurana.

@item 
bpo-31639@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31639}: http.server now exposes a ThreadingHTTPServer class and uses it
when the module is run with @code{-m} to cope with web browsers pre-opening
sockets.

@item 
bpo-29877@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29877}: compileall: import ProcessPoolExecutor only when needed,
preventing hangs on low resource platforms

@item 
bpo-32221@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32221}: Various functions returning tuple containing IPv6 addresses now
omit @code{%scope} part since the same information is already encoded in
`scopeid' tuple item. Especially this speeds up @code{socket.recvfrom()}
when it receives multicast packet since useless resolving of network
interface name is omitted.

@item 
bpo-32147@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32147}: @ref{1e68,,binascii.unhexlify()} is now up to 2 times faster. Patch
by Sergey Fedoseev.

@item 
bpo-30693@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30693}: The TarFile class now recurses directories in a reproducible
way.

@item 
bpo-30693@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30693}: The ZipFile class now recurses directories in a reproducible
way.

@item 
bpo-31680@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31680}: Added @ref{be0,,curses.ncurses_version}.

@item 
bpo-31908@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31908}: Fix output of cover files for @code{trace} module command-line
tool. Previously emitted cover files only when @code{--missing} option was
used. Patch by Michael Selik.

@item 
bpo-31608@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31608}: Raise a @code{TypeError} instead of crashing if a
@code{collections.deque} subclass returns a non-deque from @code{__new__}. Patch
by Oren Milman.

@item 
bpo-31425@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31425}: Add support for sockets of the AF_QIPCRTR address family,
supported by the Linux kernel. This is used to communicate with services,
such as GPS or radio, running on Qualcomm devices. Patch by Bjorn
Andersson.

@item 
bpo-22005@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22005}: Implemented unpickling instances of
@ref{4e3,,datetime}, @ref{1fc,,date} and
@ref{1fd,,time} pickled by Python 2. @code{encoding='latin1'} should
be used for successful decoding.

@item 
bpo-27645@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27645}: @ref{54e,,sqlite3.Connection} now exposes a
@ref{d79,,backup} method, if the underlying SQLite
library is at version 3.6.11 or higher.  Patch by Lele Gaifax.

@item 
bpo-16865@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16865}: Support arrays >=2GiB in @ref{2e,,ctypes}.  Patch by Segev Finer.

@item 
bpo-31508@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31508}: Removed support of arguments in
@code{tkinter.ttk.Treeview.selection}. It was deprecated in 3.6.  Use
specialized methods like @code{selection_set} for changing the selection.

@item 
bpo-29456@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29456}: Fix bugs in hangul normalization: u1176, u11a7 and u11c3
@end itemize

@node Documentation<59>,Tests<58>,Library<166>,Python 3 8 0 alpha 1
@anchor{whatsnew/changelog id782}@anchor{1e69}
@subsubsection Documentation



@itemize -

@item 
bpo-21257@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21257}: Document @ref{1e6a,,http.client.parse_headers()}.

@item 
bpo-34764@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34764}: Improve example of iter() with 2nd sentinel argument.

@item 
bpo-35564@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35564}: Explicitly set master_doc variable in conf.py for compliance
with Sphinx 2.0

@item 
bpo-35511@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35511}: Specified that profile.Profile class doesn’t not support enable
or disable methods. Also, elaborated that Profile object as a context
manager is only supported in cProfile module.

@item 
bpo-10536@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10536}: Enhance the gettext docs. Patch by Éric Araujo

@item 
bpo-35089@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35089}: Remove mention of @code{typing.io} and @code{typing.re}. Their types
should be imported from @code{typing} directly.

@item 
bpo-35038@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35038}: Fix the documentation about an unexisting @code{f_restricted}
attribute in the frame object. Patch by Stéphane Wirtel

@item 
bpo-35042@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35042}: Replace PEP XYZ by the pep role and allow to use the direct
links to the PEPs.

@item 
bpo-35044@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35044}: Fix the documentation with the role @code{exc} for the
appropriated exception. Patch by Stéphane Wirtel

@item 
bpo-35035@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35035}: Rename documentation for @ref{54,,email.utils} to
@code{email.utils.rst}.

@item 
bpo-34967@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34967}: Use app.add_object_type() instead of the deprecated Sphinx
function app.description_unit()

@item 
bpo-34913@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34913}: Add documentation about the new command line interface of the
gzip module.

@item 
bpo-32174@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32174}: chm document displays non-ASCII characters properly on some
MBCS Windows systems.

@item 
bpo-11233@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11233}: Create availability directive for documentation.  Original
patch by Georg Brandl.

@item 
bpo-34790@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34790}: Document how passing coroutines to asyncio.wait() can be
confusing.

@item 
bpo-34552@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34552}: Make clear that @code{==} operator sometimes is equivalent to
@code{is}. The @code{<}, @code{<=}, @code{>} and @code{>=} operators are only defined
where they make sense.

@item 
bpo-28617@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28617}: Fixed info in the stdtypes docs concerning the types that
support membership tests.

@item 
bpo-20177@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20177}: Migrate datetime.date.fromtimestamp to Argument Clinic. Patch
by Tim Hoffmann.

@item 
bpo-34065@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34065}: Fix wrongly written basicConfig documentation markup syntax

@item 
bpo-33460@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33460}: replaced ellipsis with correct error codes in tutorial chapter
3.

@item 
bpo-33847@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33847}: Add ‘@@’ operator entry to index.

@item 
bpo-33409@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33409}: Clarified the relationship between 
@geindex Python Enhancement Proposals; PEP 538
PEP 538@footnote{https://peps.python.org/pep-0538/}’s
PYTHONCOERCECLOCALE and PEP 540’s PYTHONUTF8 mode.

@item 
bpo-33197@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33197}: Add versionadded tag to the documentation of
ParameterKind.description

@item 
bpo-17045@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17045}: Improve the C-API doc for PyTypeObject.  This includes adding
several quick-reference tables and a lot of missing slot/typedef entries.
The existing entries were also cleaned up with a slightly more consistent
format.

@item 
bpo-33736@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33736}: Improve the documentation of @ref{d14,,asyncio.open_connection()},
@ref{d15,,asyncio.start_server()} and their UNIX socket counterparts.

@item 
bpo-23859@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23859}: Document that @code{asyncio.wait()} does not cancel its futures on
timeout.

@item 
bpo-32436@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32436}: Document 
@geindex Python Enhancement Proposals; PEP 567
PEP 567@footnote{https://peps.python.org/pep-0567/} changes to asyncio.

@item 
bpo-33604@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33604}: Update HMAC md5 default to a DeprecationWarning, bump removal
to 3.8.

@item 
bpo-33594@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33594}: Document @code{getargspec}, @code{from_function} and @code{from_builtin}
as deprecated in their respective docstring, and include version since
deprecation in DeprecationWarning message.

@item 
bpo-33503@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33503}: Fix broken pypi link

@item 
bpo-33421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33421}: Add missing documentation for @code{typing.AsyncContextManager}.

@item 
bpo-33487@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33487}: BZ2file now emit a DeprecationWarning when buffering=None is
passed, the deprecation message and documentation also now explicitly
state it is deprecated since 3.0.

@item 
bpo-33378@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33378}: Add Korean language switcher for @indicateurl{https://docs.python.org/3/}

@item 
bpo-33276@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33276}: Clarify that the @code{__path__} attribute on modules cannot be
just any value.

@item 
bpo-33201@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33201}: Modernize documentation for writing C extension types.

@item 
bpo-33195@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33195}: Deprecate @code{Py_UNICODE} usage in @code{c-api/arg} document.
@code{Py_UNICODE} related APIs are deprecated since Python 3.3, but it is
missed in the document.

@item 
bpo-33126@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33126}: Document PyBuffer_ToContiguous().

@item 
bpo-27212@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27212}: Modify documentation for the @code{islice()} recipe to consume
initial values up to the start index.

@item 
bpo-28247@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28247}: Update @ref{137,,zipapp} documentation to describe how to make
standalone applications.

@item 
bpo-18802@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18802}: Documentation changes for ipaddress.  Patch by Jon Foster and
Berker Peksag.

@item 
bpo-27428@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27428}: Update documentation to clarify that @code{WindowsRegistryFinder}
implements @code{MetaPathFinder}. (Patch by Himanshu Lakhara)

@item 
bpo-28124@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28124}: The ssl module function ssl.wrap_socket() has been
de-emphasized and deprecated in favor of the more secure and efficient
SSLContext.wrap_socket() method.

@item 
bpo-17232@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17232}: Clarify docs for -O and -OO.  Patch by Terry Reedy.

@item 
bpo-32436@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32436}: Add documentation for the contextvars module (PEP 567).

@item 
bpo-32800@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32800}: Update link to w3c doc for xml default namespaces.

@item 
bpo-11015@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11015}: Update @ref{ea,,test.support} documentation.

@item 
bpo-32613@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32613}: Update the faq/windows.html to use the py command from PEP 397
instead of python.

@item 
bpo-8722@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8722}: Document @code{__getattr__()} behavior when property @code{get()}
method raises @ref{5f0,,AttributeError}.

@item 
bpo-32614@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32614}: Modify RE examples in documentation to use raw strings to
prevent @ref{1a4,,DeprecationWarning} and add text to REGEX HOWTO to highlight
the deprecation.

@item 
bpo-20709@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20709}: Remove the paragraph where we explain that os.utime() does not
support a directory as path under Windows. Patch by Jan-Philip Gehrcke

@item 
bpo-32722@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32722}: Remove the bad example in the tutorial of the Generator
Expression. Patch by Stéphane Wirtel

@item 
bpo-31972@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31972}: Improve docstrings for @code{pathlib.PurePath} subclasses.

@item 
bpo-30607@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30607}: Use the externalized @code{python-docs-theme} package when
building the documentation.

@item 
bpo-8243@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8243}: Add a note about curses.addch and curses.addstr exception
behavior when writing outside a window, or pad.

@item 
bpo-32337@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32337}: Update documentation related with @code{dict} order.

@item 
bpo-25041@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25041}: Document @code{AF_PACKET} in the @ref{d1,,socket} module.

@item 
bpo-31432@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31432}: Clarify meaning of CERT_NONE, CERT_OPTIONAL, and CERT_REQUIRED
flags for ssl.SSLContext.verify_mode.
@end itemize

@node Tests<58>,Build<65>,Documentation<59>,Python 3 8 0 alpha 1
@anchor{whatsnew/changelog id783}@anchor{1e6b}
@subsubsection Tests



@itemize -

@item 
bpo-35772@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35772}: Fix sparse file tests of test_tarfile on ppc64 with the tmpfs
filesystem. Fix the function testing if the filesystem supports sparse
files: create a file which contains data and “holes”, instead of creating
a file which contains no data. tmpfs effective block size is a page size
(tmpfs lives in the page cache). RHEL uses 64 KiB pages on aarch64, ppc64,
ppc64le, only s390x and x86_64 use 4 KiB pages, whereas the test punch
holes of 4 KiB.

@item 
bpo-35045@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35045}: Make ssl tests less strict and also accept TLSv1 as system
default. The changes unbreaks test_min_max_version on Fedora 29.

@item 
bpo-32710@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32710}: @code{test_asyncio/test_sendfile.py} now resets the event loop
policy using @code{tearDownModule()} as done in other tests, to prevent a
warning when running tests on Windows.

@item 
bpo-33717@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33717}: test.pythoninfo now logs information of all clocks, not only
time.time() and time.perf_counter().

@item 
bpo-35488@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35488}: Add a test to pathlib’s Path.match() to verify it does not
support glob-style ** recursive pattern matching.

@item 
bpo-31731@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31731}: Fix a race condition in @code{check_interrupted_write()} of
test_io: create directly the thread with SIGALRM signal blocked, rather
than blocking the signal later from the thread. Previously, it was
possible that the thread gets the signal before the signal is blocked.

@item 
bpo-35424@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35424}: Fix test_multiprocessing_main_handling: use
@code{multiprocessing.Pool} with a context manager and then explicitly
join the pool.

@item 
bpo-35519@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35519}: Rename @code{test.bisect} module to @code{test.bisect_cmd} to
avoid conflict with @ref{12,,bisect} module when running directly a test like
@code{./python Lib/test/test_xmlrpc.py}.

@item 
bpo-35513@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35513}: Replace @ref{55d,,time.time()} with @ref{55c,,time.monotonic()} in tests
to measure time delta.

@item 
bpo-34279@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34279}: @code{test.support.run_unittest()} no longer raise
@code{TestDidNotRun} if the test result contains skipped tests. The
exception is now only raised if no test have been run and no test have
been skipped.

@item 
bpo-35412@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35412}: Add testcase to @code{test_future4}: check unicode literal.

@item 
bpo-26704@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26704}: Added test demonstrating double-patching of an instance method.
Patch by Anthony Sottile.

@item 
bpo-33725@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33725}: test_multiprocessing_fork may crash on recent versions of
macOS.  Until the issue is resolved, skip the test on macOS.

@item 
bpo-35352@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35352}: Modify test_asyncio to use the certificate set from the test
directory.

@item 
bpo-35317@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35317}: Fix @code{mktime()} overflow error in @code{test_email}: run
@code{test_localtime_daylight_true_dst_true()} and
@code{test_localtime_daylight_false_dst_true()} with a specific timezone.

@item 
bpo-21263@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21263}: After several reports that test_gdb does not work properly on
macOS and since gdb is not shipped by default anymore, test_gdb is now
skipped on macOS when LLVM Clang has been used to compile Python. Patch by
Lysandros Nikolaou

@item 
bpo-34279@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34279}: regrtest issue a warning when no tests have been executed in a
particular test file. Also, a new final result state is issued if no test
have been executed across all test files. Patch by Pablo Galindo.

@item 
bpo-34962@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34962}: make docstest in Doc now passes., and is enforced in CI

@item 
bpo-23596@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23596}: Use argparse for the command line of the gzip module. Patch by
Antony Lee

@item 
bpo-34537@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34537}: Fix @code{test_gdb.test_strings()} when @code{LC_ALL=C} and GDB was
compiled with Python 3.6 or earlier.

@item 
bpo-34587@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34587}: test_socket: Remove RDSTest.testCongestion(). The test tries to
fill the receiver’s socket buffer and expects an error. But the RDS
protocol doesn’t require that. Moreover, the Linux implementation of RDS
expects that the producer of the messages reduces its rate, it’s not the
role of the receiver to trigger an error. The test fails on Fedora 28 by
design, so just remove it.

@item 
bpo-34661@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34661}: Fix test_shutil if unzip doesn’t support -t.

@item 
bpo-34200@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34200}: Fixed non-deterministic flakiness of test_pkg by not using the
scary test.support.module_cleanup() logic to save and restore sys.modules
contents between test cases.

@item 
bpo-34569@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34569}: The experimental PEP 554 data channels now correctly pass
negative PyLong objects between subinterpreters on 32-bit systems. Patch
by Michael Felt.

@item 
bpo-34594@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34594}: Fix usage of hardcoded @code{errno} values in the tests.

@item 
bpo-34579@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34579}: Fix test_embed for AIX Patch by Michael Felt

@item 
bpo-34542@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34542}: Use 3072 RSA keys and SHA-256 signature for test certs and
keys.

@item 
bpo-11193@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11193}: Remove special condition for AIX in
@code{test_subprocess.test_undecodable_env}

@item 
bpo-34347@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34347}: Fix @code{test_utf8_mode.test_cmd_line} for AIX

@item 
bpo-34490@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34490}: On AIX with AF_UNIX family sockets getsockname() does not
provide ‘sockname’, so skip calls to transport.get_extra_info(‘sockname’)

@item 
bpo-34391@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34391}: Fix ftplib test for TLS 1.3 by reading from data socket.

@item 
bpo-11192@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11192}: Fix @code{test_socket} on AIX 6.1 and later IPv6 zone id supports
only supported by @code{inet_pton6_zone()}. Switch to runtime-based
@code{platform.system()} to establish current platform rather than build-time
based @code{sys.platform()}

@item 
bpo-34399@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34399}: Update all RSA keys and DH params to use at least 2048 bits.

@item 
bpo-34373@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34373}: Fix @code{test_mktime} and @code{test_pthread_getcpuclickid} tests
for AIX Add range checking for @code{_PyTime_localtime} for AIX Patch by
Michael Felt

@item 
bpo-11191@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11191}: Skip the distutils test ‘test_search_cpp’ when using XLC as
compiler patch by aixtools (Michael Felt)

@item 
Improved an error message when mock assert_has_calls fails.

@item 
bpo-33746@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33746}: Fix test_unittest when run in verbose mode.

@item 
bpo-33901@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33901}: Fix test_dbm_gnu on macOS with gdbm 1.15: add a larger value to
make sure that the file size changes.

@item 
bpo-33873@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33873}: Fix a bug in @code{regrtest} that caused an extra test to run if
–huntrleaks/-R was used. Exit with error in case that invalid parameters
are specified to –huntrleaks/-R (at least one warmup run and one
repetition must be used).

@item 
bpo-33562@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33562}: Check that a global asyncio event loop policy is not left
behind by any tests.

@item 
bpo-33655@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33655}: Ignore test_posix_fallocate failures on BSD platforms that
might be due to running on ZFS.

@item 
bpo-32962@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32962}: Fixed test_gdb when Python is compiled with flags -mcet
-fcf-protection -O0.

@item 
bpo-33358@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33358}: Fix @code{test_embed.test_pre_initialization_sys_options()} when
the interpreter is built with @code{--enable-shared}.

@item 
bpo-32872@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32872}: Avoid regrtest compatibility issue with namespace packages.

@item 
bpo-32517@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32517}: Fix failing @code{test_asyncio} on macOS 10.12.2+ due to transport
of @code{KqueueSelector} loop was not being closed.

@item 
bpo-32663@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32663}: Making sure the @code{SMTPUTF8SimTests} class of tests gets run in
@code{test_smtplib.py}.

@item 
bpo-27643@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27643}: Test_C test case needs “signed short” bitfields, but the IBM
XLC compiler (on AIX) does not support this Skip the code and test when
AIX and XLC are used

Applicable to Python2-2.7 and later

@item 
bpo-19417@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19417}: Add test_bdb.py.

@item 
bpo-31809@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31809}: Add tests to verify connection with secp ECDH curves.
@end itemize

@node Build<65>,Windows<57>,Tests<58>,Python 3 8 0 alpha 1
@anchor{whatsnew/changelog id784}@anchor{1e6c}
@subsubsection Build



@itemize -

@item 
bpo-34691@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34691}: The _contextvars module is now built into the core Python
library on Windows.

@item 
bpo-35683@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35683}: Improved Azure Pipelines build steps and now verifying layouts
correctly

@item 
bpo-35642@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35642}: Remove asynciomodule.c from pythoncore.vcxproj

@item 
bpo-35550@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35550}: Fix incorrect Solaris #ifdef checks to look for __sun && __SVR4
instead of sun when compiling.

@item 
bpo-35499@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35499}: @code{make profile-opt} no longer replaces @code{CFLAGS_NODIST} with
@code{CFLAGS}. It now adds profile-guided optimization (PGO) flags to
@code{CFLAGS_NODIST}: existing @code{CFLAGS_NODIST} flags are kept.

@item 
bpo-35257@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35257}: Avoid leaking the linker flags from Link Time Optimizations
(LTO) into distutils when compiling C extensions.

@item 
bpo-35351@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35351}: When building Python with clang and LTO, LTO flags are no
longer passed into CFLAGS to build third-party C extensions through
distutils.

@item 
bpo-35139@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35139}: Fix a compiler error when statically linking @code{pyexpat} in
@code{Modules/Setup}.

@item 
bpo-35059@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35059}: PCbuild: Set InlineFunctionExpansion to OnlyExplicitInline
(“/Ob1” option) in pyproject.props in Debug mode to expand functions
marked as inline. This change should make Python compiled in Debug mode a
little bit faster on Windows.

@item 
bpo-35011@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35011}: Restores the use of pyexpatns.h to isolate our embedded copy of
the expat C library so that its symbols do not conflict at link or dynamic
loading time with an embedding application or other extension modules with
their own version of libexpat.

@item 
bpo-28015@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28015}: Have –with-lto works correctly with clang.

@item 
bpo-34765@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34765}: Update the outdated install-sh file to the latest revision from
automake v1.16.1

@item 
bpo-34585@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34585}: Check for floating-point byte order in configure.ac using
compilation tests instead of executing code, so that these checks work in
cross-compiled builds.

@item 
bpo-34710@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34710}: Fixed SSL module build with OpenSSL & pedantic CFLAGS.

@item 
bpo-34582@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34582}: Add JUnit XML output for regression tests and update Azure
DevOps builds.

@item 
bpo-34081@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34081}: Make Sphinx warnings as errors in the Docs Makefile.

@item 
bpo-34555@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34555}: Fix for case where it was not possible to have both
@code{HAVE_LINUX_VM_SOCKETS_H} and @code{HAVE_SOCKADDR_ALG} be undefined.

@item 
bpo-33015@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33015}: Fix an undefined behaviour in the pthread implementation of
@ref{1e6d,,PyThread_start_new_thread()}: add a function wrapper to always
return @code{NULL}.

@item 
bpo-34245@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34245}: The Python shared library is now installed with write
permission (mode 0755), which is the standard way of installing such
libraries.

@item 
bpo-34121@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34121}: Fix detection of C11 atomic support on clang.

@item 
bpo-32430@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32430}: Rename Modules/Setup.dist to Modules/Setup, and remove the
necessity to copy the former manually to the latter when updating the
local source tree.

@item 
bpo-30345@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30345}: Add -g to LDFLAGS when compiling with LTO to get debug symbols.

@item 
bpo-5755@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5755}: Move @code{-Wstrict-prototypes} option to @code{CFLAGS_NODIST} from
@code{OPT}. This option emitted annoying warnings when building extension
modules written in C++.

@item 
bpo-33614@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33614}: Ensures module definition files for the stable ABI on Windows
are correctly regenerated.

@item 
bpo-33648@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33648}: The –with-c-locale-warning configuration flag has been
removed. It has had no effect for about a year.

@item 
bpo-33522@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33522}: Enable CI builds on Visual Studio Team Services at
@indicateurl{https://python.visualstudio.com/cpython}

@item 
bpo-33512@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33512}: configure’s check for “long double” has been simplified

@item 
bpo-33483@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33483}: C compiler is now correctly detected from the standard
environment variables. –without-gcc and –with-icc options have been
removed.

@item 
bpo-33394@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33394}: Enable the verbose build for extension modules, when GNU make
is passed macros on the command line.

@item 
bpo-33393@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33393}: Update config.guess and config.sub files.

@item 
bpo-33377@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33377}: Add new triplets for mips r6 and riscv variants (used in
extension suffixes).

@item 
bpo-32232@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32232}: By default, modules configured in @code{Modules/Setup} are no
longer built with @code{-DPy_BUILD_CORE}. Instead, modules that specifically
need that preprocessor definition include it in their individual entries.

@item 
bpo-33182@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33182}: The embedding tests can once again be built with clang 6.0

@item 
bpo-33163@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33163}: Upgrade pip to 9.0.3 and setuptools to v39.0.1.

@item 
bpo-33012@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33012}: gcc 8 has added a new warning heuristic to detect invalid
function casts and a stock python build seems to hit that warning quite
often.  The most common is the cast of a METH_NOARGS function (that uses
just one argument) to a PyCFunction. Fix this by adding a dummy argument
to all functions that implement METH_NOARGS.

@item 
bpo-32898@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32898}: Fix the python debug build when using COUNT_ALLOCS.

@item 
bpo-29442@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29442}: Replace optparse with argparse in setup.py
@end itemize

@node Windows<57>,macOS<45>,Build<65>,Python 3 8 0 alpha 1
@anchor{whatsnew/changelog id785}@anchor{1e6e}
@subsubsection Windows



@itemize -

@item 
bpo-35890@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35890}: Fix API calling consistency of GetVersionEx and wcstok.

@item 
bpo-32560@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32560}: The @code{py} launcher now forwards its @code{STARTUPINFO} structure
to child processes.

@item 
bpo-35854@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35854}: Fix EnvBuilder and –symlinks in venv on Windows

@item 
bpo-35811@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35811}: Avoid propagating venv settings when launching via py.exe

@item 
bpo-35797@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35797}: Fix default executable used by the multiprocessing module

@item 
bpo-35758@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35758}: Allow building on ARM with MSVC.

@item 
bpo-29734@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29734}: Fix handle leaks in os.stat on Windows.

@item 
bpo-35596@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35596}: Use unchecked PYCs for the embeddable distro to avoid zipimport
restrictions.

@item 
bpo-35596@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35596}: Fix vcruntime140.dll being added to embeddable distro multiple
times.

@item 
bpo-35402@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35402}: Update Windows build to use Tcl and Tk 8.6.9

@item 
bpo-35401@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35401}: Updates Windows build to OpenSSL 1.1.0j

@item 
bpo-34977@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34977}: venv on Windows will now use a python.exe redirector rather
than copying the actual binaries from the base environment.

@item 
bpo-34977@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34977}: Adds support for building a Windows App Store package

@item 
bpo-35067@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35067}: Remove _distutils_findvs module and use vswhere.exe instead.

@item 
bpo-32557@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32557}: Allow shutil.disk_usage to take a file path on Windows

@item 
bpo-34770@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34770}: Fix a possible null pointer dereference in pyshellext.cpp.

@item 
bpo-34603@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34603}: Fix returning structs from functions produced by MSVC

@item 
bpo-34581@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34581}: Guard MSVC-specific code in socketmodule.c with @code{#ifdef
_MSC_VER}.

@item 
bpo-34532@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34532}: Fixes exit code of list version arguments for py.exe.

@item 
bpo-34062@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34062}: Fixed the ‘–list’ and ‘–list-paths’ arguments for the py.exe
launcher

@item 
bpo-34225@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34225}: Ensure INCLUDE and LIB directories do not end with a backslash.

@item 
bpo-34011@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34011}: A suite of code has been changed which copied across DLLs and
init.tcl from the running Python location into a venv being created. These
copies are needed only when running from a Python source build, and the
copying code is now only run when that is the case, rather than whenever a
venv is created.

@item 
bpo-34006@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34006}: Revert line length limit for Windows help docs. The line-length
limit is not needed because the pages appear in a separate app rather than
on a browser tab.  It can also interact badly with the DPI setting.

@item 
bpo-31546@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31546}: Restore running PyOS_InputHook while waiting for user input at
the prompt. The restores integration of interactive GUI windows (such as
Matplotlib figures) with the prompt on Windows.

@item 
bpo-30237@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30237}: Output error when ReadConsole is canceled by
CancelSynchronousIo instead of crashing.

@item 
bpo-33895@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33895}: GIL is released while calling functions that acquire Windows
loader lock.

@item 
bpo-33720@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33720}: Reduces maximum marshal recursion depth on release builds.

@item 
bpo-29097@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29097}: Fix bug where @code{datetime.fromtimestamp()} erroneously throws
an @ref{2c2,,OSError} on Windows for values between 0 and 86400. Patch by
Ammar Askar.

@item 
bpo-33316@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33316}: PyThread_release_lock always fails

@item 
bpo-33184@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33184}: Update Windows installer to use OpenSSL 1.1.0h.

@item 
bpo-32890@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32890}: Fix usage of GetLastError() instead of errno in os.execve() and
os.truncate().

@item 
bpo-33016@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33016}: Fix potential use of uninitialized memory in
nt._getfinalpathname

@item 
bpo-32903@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32903}: Fix a memory leak in os.chdir() on Windows if the current
directory is set to a UNC path.

@item 
bpo-32901@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32901}: Update Tcl and Tk versions to 8.6.8

@item 
bpo-31966@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31966}: Fixed WindowsConsoleIO.write() for writing empty data.

@item 
bpo-32409@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32409}: Ensures activate.bat can handle Unicode contents.

@item 
bpo-32457@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32457}: Improves handling of denormalized executable path when
launching Python.

@item 
bpo-32370@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32370}: Use the correct encoding for ipconfig output in the uuid
module. Patch by Segev Finer.

@item 
bpo-29248@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29248}: Fix @ref{b20,,os.readlink()} on Windows, which was mistakenly
treating the @code{PrintNameOffset} field of the reparse data buffer as a
number of characters instead of bytes. Patch by Craig Holmquist and SSE4.

@item 
bpo-1104@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1104}: Correctly handle string length in
@code{msilib.SummaryInfo.GetProperty()} to prevent it from truncating the
last character.
@end itemize

@node macOS<45>,IDLE<38>,Windows<57>,Python 3 8 0 alpha 1
@anchor{whatsnew/changelog id786}@anchor{1e6f}
@subsubsection macOS



@itemize -

@item 
bpo-35401@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35401}: Update macOS installer to use OpenSSL 1.1.0j.

@item 
bpo-35025@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35025}: Properly guard the use of the @code{CLOCK_GETTIME} et al. macros
in @code{timemodule} on macOS.

@item 
bpo-24658@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24658}: On macOS, fix reading from and writing into a file with a size
larger than 2 GiB.

@item 
bpo-34405@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34405}: Update to OpenSSL 1.1.0i for macOS installer builds.

@item 
bpo-33635@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33635}: In macOS stat on some file descriptors (/dev/fd/3 f.e) will
result in bad file descriptor OSError. Guard against this exception was
added in is_dir, is_file and similar methods. DirEntry.is_dir can also
throw this exception so _RecursiveWildcardSelector._iterate_directories
was also extended with the same error ignoring pattern.

@item 
bpo-13631@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13631}: The .editrc file in user’s home directory is now processed
correctly during the readline initialization through editline emulation on
macOS.

@item 
bpo-33184@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33184}: Update macOS installer build to use OpenSSL 1.1.0h.

@item 
bpo-32726@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32726}: Build and link with private copy of Tcl/Tk 8.6 for the macOS
10.6+ installer. The 10.9+ installer variant already does this.  This
means that the Python 3.7 provided by the python.org macOS installers no
longer need or use any external versions of Tcl/Tk, either system-provided
or user-installed, such as ActiveTcl.

@item 
bpo-32901@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32901}: Update macOS 10.9+ installer to Tcl/Tk 8.6.8.

@item 
bpo-31903@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31903}: In @code{_scproxy}, drop the GIL when calling into
@code{SystemConfiguration} to avoid deadlocks.
@end itemize

@node IDLE<38>,Tools/Demos<37>,macOS<45>,Python 3 8 0 alpha 1
@anchor{whatsnew/changelog id787}@anchor{1e70}
@subsubsection IDLE



@itemize -

@item 
bpo-35770@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35770}: IDLE macosx deletes Options => Configure IDLE. It previously
deleted Window => Zoom Height by mistake. (Zoom Height is now on the
Options menu).  On Mac, the settings dialog is accessed via Preferences on
the IDLE menu.

@item 
bpo-35769@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35769}: Change IDLE’s new file name from ‘Untitled’ to ‘untitled’

@item 
bpo-35660@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35660}: Fix imports in idlelib.window.

@item 
bpo-35641@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35641}: Proper format @code{calltip} when the function has no docstring.

@item 
bpo-33987@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33987}: Use ttk Frame for ttk widgets.

@item 
bpo-34055@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34055}: Fix erroneous ‘smart’ indents and newlines in IDLE Shell.

@item 
bpo-35591@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35591}: Find Selection now works when selection not found.

@item 
bpo-35196@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35196}: Speed up squeezer line counting.

@item 
bpo-35598@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35598}: Update config_key: use PEP 8 names and ttk widgets, make some
objects global, and add tests.

@item 
bpo-28097@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28097}: Add Previous/Next History entries to Shell menu.

@item 
bpo-35208@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35208}: Squeezer now properly counts wrapped lines before newlines.

@item 
bpo-35555@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35555}: Gray out Code Context menu entry when it’s not applicable.

@item 
bpo-35521@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35521}: Document the IDLE editor code context feature. Add some
internal references within the IDLE doc.

@item 
bpo-22703@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22703}: The Code Context menu label now toggles between Show/Hide Code
Context. The Zoom Height menu now toggles between Zoom/Restore Height.
Zoom Height has moved from the Window menu to the Options menu.

@item 
bpo-35213@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35213}: Where appropriate, use ‘macOS’ in idlelib.

@item 
bpo-34864@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34864}: On macOS, warn if the system preference “Prefer tabs when
opening documents” is set to “Always”.

@item 
bpo-34864@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34864}: Document two IDLE on MacOS issues. The System Preferences Dock
“prefer tabs always” setting disables some IDLE features.  Menus are a bit
different than as described for Windows and Linux.

@item 
bpo-35202@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35202}: Remove unused imports from lib/idlelib

@item 
bpo-33000@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33000}: Document that IDLE’s shell has no line limit. A program that
runs indefinitely can overfill memory.

@item 
bpo-23220@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23220}: Explain how IDLE’s Shell displays output.

@item 
bpo-35099@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35099}: Improve the doc about IDLE running user code.   The section is
renamed from “IDLE – console differences” is renamed “Running user code”.
It mostly covers the implications of using custom @code{sys.std@var{xxx}}
objects.

@item 
bpo-35097@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35097}: Add IDLE doc subsection explaining editor windows. Topics
include opening, title and status bar, .py* extension, and running.

@item 
bpo-35093@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35093}: Document the IDLE document viewer in the IDLE doc. Add a
paragraph in “Help and preferences”, “Help sources” subsection.

@item 
bpo-35088@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35088}: Update idlelib.help.copy_string docstring. We now use git and
backporting instead of hg and forward merging.

@item 
bpo-35087@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35087}: Update idlelib help files for the current doc build. The main
change is the elimination of chapter-section numbers.

@item 
bpo-34548@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34548}: Use configured color theme for read-only text views.

@item 
bpo-1529353@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1529353}: Enable “squeezing” of long outputs in the shell, to avoid
performance degradation and to clean up the history without losing it.
Squeezed outputs may be copied, viewed in a separate window, and
“unsqueezed”.

@item 
bpo-34047@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34047}: Fixed mousewheel scrolling direction on macOS.

@item 
bpo-34275@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34275}: Make IDLE calltips always visible on Mac. Some MacOS-tk
combinations need .update_idletasks(). Patch by Kevin Walzer.

@item 
bpo-34120@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34120}: Fix unresponsiveness after closing certain windows and dialogs.

@item 
bpo-33975@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33975}: Avoid small type when running htests. Since part of the purpose
of human-viewed tests is to determine that widgets look right, it is
important that they look the same for testing as when running IDLE.

@item 
bpo-33905@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33905}: Add test for idlelib.stackview.StackBrowser.

@item 
bpo-33924@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33924}: Change mainmenu.menudefs key ‘windows’ to ‘window’. Every other
menudef key is lowercase version of main menu entry.

@item 
bpo-33906@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33906}: Rename idlelib.windows as window Match Window on the main menu
and remove last plural module name.

@item 
bpo-33917@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33917}: Fix and document idlelib/idle_test/template.py. The revised
file compiles, runs, and tests OK.  idle_test/README.txt explains how to
use it to create new IDLE test files.

@item 
bpo-33904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33904}: IDLE: In rstrip, rename class RstripExtension as Rstrip

@item 
bpo-33907@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33907}: For consistency and clarity, rename an IDLE module and classes.
Module calltips and its class CallTips are now calltip and Calltip. In
module calltip_w, class CallTip is now CalltipWindow.

@item 
bpo-33856@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33856}: Add “help” in the welcome message of IDLE

@item 
bpo-33839@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33839}: IDLE: refactor ToolTip and CallTip and add documentation and
tests

@item 
bpo-33855@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33855}: Minimally test all IDLE modules. Add missing files, import
module, instantiate classes, and check coverage. Check existing files.

@item 
bpo-33656@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33656}: On Windows, add API call saying that tk scales for DPI. On
Windows 8.1+ or 10, with DPI compatibility properties of the Python binary
unchanged, and a monitor resolution greater than 96 DPI, this should make
text and lines sharper.  It should otherwise have no effect.

@item 
bpo-33768@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33768}: Clicking on a context line moves that line to the top of the
editor window.

@item 
bpo-33763@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33763}: IDLE: Use read-only text widget for code context instead of
label widget.

@item 
bpo-33664@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33664}: Scroll IDLE editor text by lines. Previously, the mouse wheel
and scrollbar slider moved text by a fixed number of pixels, resulting in
partial lines at the top of the editor box.  The change also applies to
the shell and grep output windows, but not to read-only text views.

@item 
bpo-33679@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33679}: Enable theme-specific color configuration for Code Context. Use
the Highlights tab to see the setting for built-in themes or add settings
to custom themes.

@item 
bpo-33642@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33642}: Display up to maxlines non-blank lines for Code Context. If
there is no current context, show a single blank line.

@item 
bpo-33628@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33628}: IDLE: Cleanup codecontext.py and its test.

@item 
bpo-33564@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33564}: IDLE’s code context now recognizes async as a block opener.

@item 
bpo-21474@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21474}: Update word/identifier definition from ascii to unicode. In
text and entry boxes, this affects selection by double-click, movement
left/right by control-left/right, and deletion left/right by
control-BACKSPACE/DEL.

@item 
bpo-33204@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33204}: IDLE: consistently color invalid string prefixes. A ‘u’ string
prefix cannot be paired with either ‘r’ or ‘f’. Consistently color as much
of the prefix, starting at the right, as is valid. Revise and extend
colorizer test.

@item 
bpo-32984@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32984}: Set @code{__file__} while running a startup file.  Like Python,
IDLE optionally runs one startup file in the Shell window before
presenting the first interactive input prompt.  For IDLE, @code{-s} runs a
file named in environmental variable  
@geindex IDLESTARTUP
@geindex environment variable; IDLESTARTUP
@code{IDLESTARTUP} or
@geindex PYTHONSTARTUP
@geindex environment variable; PYTHONSTARTUP
@ref{1ba,,PYTHONSTARTUP}; @code{-r file} runs @code{file}.  Python sets
@code{__file__} to the startup file name before running the file and unsets
it before the first prompt.  IDLE now does the same when run normally,
without the @code{-n} option.

@item 
bpo-32940@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32940}: Simplify and rename StringTranslatePseudoMapping in pyparse.

@item 
bpo-32916@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32916}: Change @code{str} to @code{code} in pyparse.

@item 
bpo-32905@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32905}: Remove unused code in pyparse module.

@item 
bpo-32874@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32874}: Add tests for pyparse.

@item 
bpo-32837@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32837}: Using the system and place-dependent default encoding for
open() is a bad idea for IDLE’s system and location-independent files.

@item 
bpo-32826@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32826}: Add “encoding=utf-8” to open() in IDLE’s test_help_about. GUI
test test_file_buttons() only looks at initial ascii-only lines, but
failed on systems where open() defaults to ‘ascii’ because readline()
internally reads and decodes far enough ahead to encounter a non-ascii
character in CREDITS.txt.

@item 
bpo-32831@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32831}: Add docstrings and tests for codecontext.

@item 
bpo-32765@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32765}: Update configdialog General tab docstring to add new widgets to
the widget list.
@end itemize

@node Tools/Demos<37>,C API<59>,IDLE<38>,Python 3 8 0 alpha 1
@anchor{whatsnew/changelog id788}@anchor{1e71}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-35884@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35884}: Add a benchmark script for timing various ways to access
variables: @code{Tools/scripts/var_access_benchmark.py}.

@item 
bpo-34989@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34989}: python-gdb.py now handles errors on computing the line number
of a Python frame.

@item 
bpo-20260@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20260}: Argument Clinic now has non-bitwise unsigned int converters.

@item 
bpo-32962@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32962}: python-gdb now catches @code{UnicodeDecodeError} exceptions when
calling @code{string()}.

@item 
bpo-32962@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32962}: python-gdb now catches ValueError on read_var(): when Python
has no debug symbols for example.

@item 
bpo-33189@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33189}: @code{pygettext.py} now recognizes only literal strings as
docstrings and translatable strings, and rejects bytes literals and
f-string expressions.

@item 
bpo-31920@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31920}: Fixed handling directories as arguments in the @code{pygettext}
script. Based on patch by Oleg Krasnikov.

@item 
bpo-29673@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29673}: Fix pystackv and pystack gdbinit macros.

@item 
bpo-25427@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25427}: Remove the pyvenv script in favor of @code{python3 -m venv} in
order to lower confusion as to what Python interpreter a virtual
environment will be created for.

@item 
bpo-32885@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32885}: Add an @code{-n} flag for @code{Tools/scripts/pathfix.py} to disable
automatic backup creation (files with @code{~} suffix).

@item 
bpo-32222@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32222}: Fix pygettext not extracting docstrings for functions with type
annotated arguments. Patch by Toby Harradine.

@item 
bpo-31583@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31583}: Fix 2to3 for using with –add-suffix option but without
–output-dir option for relative path to files in current directory.
@end itemize

@node C API<59>,,Tools/Demos<37>,Python 3 8 0 alpha 1
@anchor{whatsnew/changelog id789}@anchor{1e72}
@subsubsection C API



@itemize -

@item 
bpo-35713@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35713}: The @code{PyByteArray_Init()} and @code{PyByteArray_Fini()}
functions have been removed. They did nothing since Python 2.7.4 and
Python 3.2.0, were excluded from the limited API (stable ABI), and were
not documented.

@item 
bpo-33817@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33817}: Fixed @ref{1a12,,_PyBytes_Resize()} for empty bytes objects.

@item 
bpo-35322@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35322}: Fix memory leak in @ref{dc9,,PyUnicode_EncodeLocale()} and
@ref{1e73,,PyUnicode_EncodeFSDefault()} on error handling.

@item 
bpo-35059@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35059}: The following C macros have been converted to static inline
functions: @ref{790,,Py_INCREF()}, @ref{791,,Py_DECREF()}, @ref{c60,,Py_XINCREF()},
@ref{997,,Py_XDECREF()}, @ref{1d82,,PyObject_INIT()},
@ref{1d83,,PyObject_INIT_VAR()}.

@item 
bpo-35296@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35296}: @code{make install} now also installs the internal API:
@code{Include/internal/*.h} header files.

@item 
bpo-35081@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35081}: Internal APIs surrounded by @code{#ifdef Py_BUILD_CORE} have been
moved from @code{Include/*.h} headers to new header files
@code{Include/internal/pycore_*.h}.

@item 
bpo-35259@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35259}: Conditionally declare @ref{f17,,Py_FinalizeEx()} (new in 3.6)
based on Py_LIMITED_API. Patch by Arthur Neufeld.

@item 
bpo-35081@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35081}: The @code{_PyObject_GC_TRACK()} and
@code{_PyObject_GC_UNTRACK()} macros have been removed from the public C
API.

@item 
bpo-35134@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35134}: Creation of a new @code{Include/cpython/} subdirectory.

@item 
bpo-34725@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34725}: Adds _Py_SetProgramFullPath so embedders may override
sys.executable

@item 
bpo-34910@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34910}: Ensure that @ref{1792,,PyObject_Print()} always returns @code{-1} on
error.  Patch by Zackery Spytz.

@item 
bpo-34523@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34523}: Py_DecodeLocale() and Py_EncodeLocale() now use the UTF-8
encoding on Windows if Py_LegacyWindowsFSEncodingFlag is zero.

@item 
bpo-34193@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34193}: Fix pluralization in TypeError messages in getargs.c and
typeobject.c: ‘1 argument’ instead of ‘1 arguments’ and ‘1 element’
instead of ‘1 elements’.

@item 
bpo-34127@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34127}: Return grammatically correct error message based on argument
count. Patch by Karthikeyan Singaravelan.

@item 
bpo-23927@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23927}: Fixed @ref{796,,SystemError} in
@ref{624,,PyArg_ParseTupleAndKeywords()} when the @code{w*} format unit is used
for optional parameter.

@item 
bpo-32455@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32455}: Added @ref{1e74,,PyCompile_OpcodeStackEffectWithJump()}.

@item 
bpo-34008@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34008}: Py_Main() can again be called after Py_Initialize(), as in
Python 3.6.

@item 
bpo-32500@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32500}: Fixed error messages for @ref{1e75,,PySequence_Size()},
@ref{1e76,,PySequence_GetItem()}, @ref{1e77,,PySequence_SetItem()} and
@ref{1e78,,PySequence_DelItem()} called with a mapping and
@ref{1e79,,PyMapping_Size()} called with a sequence.

@item 
bpo-33818@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33818}: @ref{c61,,PyExceptionClass_Name()} will now return @code{const char
*} instead of @code{char *}.

@item 
bpo-33042@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33042}: Embedding applications may once again call
PySys_ResetWarnOptions, PySys_AddWarnOption, and PySys_AddXOption prior to
calling Py_Initialize.

@item 
bpo-32374@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32374}: Document that m_traverse for multi-phase initialized modules
can be called with m_state=NULL, and add a sanity check

@item 
bpo-30863@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30863}: @ref{1e7a,,PyUnicode_AsWideChar()} and
@ref{abf,,PyUnicode_AsWideCharString()} no longer cache the @code{wchar_t*}
representation of string objects.
@end itemize

@node Python 3 7 0 final,Python 3 7 0 release candidate 1,Python 3 8 0 alpha 1,Changelog
@anchor{whatsnew/changelog python-3-7-0-final}@anchor{1e7b}
@subsection Python 3.7.0 final


`Release date: 2018-06-27'

@menu
* Library: Library<167>. 
* C API: C API<60>. 

@end menu

@node Library<167>,C API<60>,,Python 3 7 0 final
@anchor{whatsnew/changelog id790}@anchor{1e7c}
@subsubsection Library



@itemize -

@item 
bpo-33851@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33851}: Fix @ref{1e7d,,ast.get_docstring()} for a node that lacks a
docstring.
@end itemize

@node C API<60>,,Library<167>,Python 3 7 0 final
@anchor{whatsnew/changelog id791}@anchor{1e7e}
@subsubsection C API



@itemize -

@item 
bpo-33932@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33932}: Calling Py_Initialize() twice does nothing, instead of failing
with a fatal error: restore the Python 3.6 behaviour.
@end itemize

@node Python 3 7 0 release candidate 1,Python 3 7 0 beta 5,Python 3 7 0 final,Changelog
@anchor{whatsnew/changelog python-3-7-0-release-candidate-1}@anchor{1e7f}
@subsection Python 3.7.0 release candidate 1


`Release date: 2018-06-12'

@menu
* Core and Builtins: Core and Builtins<164>. 
* Library: Library<168>. 
* Documentation: Documentation<60>. 
* Build: Build<66>. 
* Windows: Windows<58>. 
* IDLE: IDLE<39>. 

@end menu

@node Core and Builtins<164>,Library<168>,,Python 3 7 0 release candidate 1
@anchor{whatsnew/changelog id792}@anchor{1e80}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-33803@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33803}: Fix a crash in hamt.c caused by enabling GC tracking for an
object that hadn’t all of its fields set to NULL.

@item 
bpo-33706@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33706}: Fix a crash in Python initialization when parsing the command
line options. Thanks Christoph Gohlke for the bug report and the fix!

@item 
bpo-30654@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30654}: Fixed reset of the SIGINT handler to SIG_DFL on interpreter
shutdown even when there was a custom handler set previously. Patch by
Philipp Kerling.

@item 
bpo-31849@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31849}: Fix signed/unsigned comparison warning in pyhash.c.
@end itemize

@node Library<168>,Documentation<60>,Core and Builtins<164>,Python 3 7 0 release candidate 1
@anchor{whatsnew/changelog id793}@anchor{1e81}
@subsubsection Library



@itemize -

@item 
bpo-30167@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30167}: Prevent site.main() exception if PYTHONSTARTUP is set. Patch by
Steve Weber.

@item 
bpo-33812@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33812}: Datetime instance d with non-None tzinfo, but with
d.tzinfo.utcoffset(d) returning None is now treated as naive by the
astimezone() method.

@item 
bpo-30805@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30805}: Avoid race condition with debug logging

@item 
bpo-33694@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33694}: asyncio: Fix a race condition causing data loss on
pause_reading()/resume_reading() when using the ProactorEventLoop.

@item 
bpo-32493@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32493}: Correct test for @code{uuid_enc_be} availability in
@code{configure.ac}. Patch by Michael Felt.

@item 
bpo-33792@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33792}: Add asyncio.WindowsSelectorEventLoopPolicy and
asyncio.WindowsProactorEventLoopPolicy.

@item 
bpo-33778@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33778}: Update @code{unicodedata}’s database to Unicode version 11.0.0.

@item 
bpo-33770@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33770}: improve base64 exception message for encoded inputs of invalid
length

@item 
bpo-33769@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33769}: asyncio/start_tls: Fix error message; cancel callbacks in case
of an unhandled error; mark SSLTransport as closed if it is aborted.

@item 
bpo-33767@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33767}: The concatenation (@code{+}) and repetition (@code{*}) sequence
operations now raise @ref{199,,TypeError} instead of @ref{796,,SystemError} when
performed on @ref{51a,,mmap.mmap} objects.  Patch by Zackery Spytz.

@item 
bpo-33734@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33734}: asyncio/ssl: Fix AttributeError, increase default handshake
timeout

@item 
bpo-11874@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11874}: Use a better regex when breaking usage into wrappable parts.
Avoids bogus assertion errors from custom metavar strings.

@item 
bpo-33582@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33582}: Emit a deprecation warning for inspect.formatargspec
@end itemize

@node Documentation<60>,Build<66>,Library<168>,Python 3 7 0 release candidate 1
@anchor{whatsnew/changelog id794}@anchor{1e82}
@subsubsection Documentation



@itemize -

@item 
bpo-33409@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33409}: Clarified the relationship between 
@geindex Python Enhancement Proposals; PEP 538
PEP 538@footnote{https://peps.python.org/pep-0538/}’s
PYTHONCOERCECLOCALE and PEP 540’s PYTHONUTF8 mode.

@item 
bpo-33736@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33736}: Improve the documentation of @ref{d14,,asyncio.open_connection()},
@ref{d15,,asyncio.start_server()} and their UNIX socket counterparts.

@item 
bpo-31432@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31432}: Clarify meaning of CERT_NONE, CERT_OPTIONAL, and CERT_REQUIRED
flags for ssl.SSLContext.verify_mode.
@end itemize

@node Build<66>,Windows<58>,Documentation<60>,Python 3 7 0 release candidate 1
@anchor{whatsnew/changelog id795}@anchor{1e83}
@subsubsection Build



@itemize -

@item 
bpo-5755@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5755}: Move @code{-Wstrict-prototypes} option to @code{CFLAGS_NODIST} from
@code{OPT}. This option emitted annoying warnings when building extension
modules written in C++.
@end itemize

@node Windows<58>,IDLE<39>,Build<66>,Python 3 7 0 release candidate 1
@anchor{whatsnew/changelog id796}@anchor{1e84}
@subsubsection Windows



@itemize -

@item 
bpo-33720@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33720}: Reduces maximum marshal recursion depth on release builds.
@end itemize

@node IDLE<39>,,Windows<58>,Python 3 7 0 release candidate 1
@anchor{whatsnew/changelog id797}@anchor{1e85}
@subsubsection IDLE



@itemize -

@item 
bpo-33656@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33656}: On Windows, add API call saying that tk scales for DPI. On
Windows 8.1+ or 10, with DPI compatibility properties of the Python binary
unchanged, and a monitor resolution greater than 96 DPI, this should make
text and lines sharper.  It should otherwise have no effect.

@item 
bpo-33768@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33768}: Clicking on a context line moves that line to the top of the
editor window.

@item 
bpo-33763@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33763}: IDLE: Use read-only text widget for code context instead of
label widget.

@item 
bpo-33664@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33664}: Scroll IDLE editor text by lines. Previously, the mouse wheel
and scrollbar slider moved text by a fixed number of pixels, resulting in
partial lines at the top of the editor box.  The change also applies to
the shell and grep output windows, but not to read-only text views.

@item 
bpo-33679@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33679}: Enable theme-specific color configuration for Code Context. Use
the Highlights tab to see the setting for built-in themes or add settings
to custom themes.

@item 
bpo-33642@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33642}: Display up to maxlines non-blank lines for Code Context. If
there is no current context, show a single blank line.
@end itemize

@node Python 3 7 0 beta 5,Python 3 7 0 beta 4,Python 3 7 0 release candidate 1,Changelog
@anchor{whatsnew/changelog python-3-7-0-beta-5}@anchor{1e86}
@subsection Python 3.7.0 beta 5


`Release date: 2018-05-30'

@menu
* Core and Builtins: Core and Builtins<165>. 
* Library: Library<169>. 
* Documentation: Documentation<61>. 
* Tests: Tests<59>. 
* Build: Build<67>. 
* macOS: macOS<46>. 
* IDLE: IDLE<40>. 

@end menu

@node Core and Builtins<165>,Library<169>,,Python 3 7 0 beta 5
@anchor{whatsnew/changelog id798}@anchor{1e87}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-33622@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33622}: Fixed a leak when the garbage collector fails to add an object
with the @code{__del__} method or referenced by it into the
@ref{13cd,,gc.garbage} list. @ref{b8b,,PyGC_Collect()} can now be called when an
exception is set and preserves it.

@item 
bpo-33509@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33509}: Fix module_globals parameter of warnings.warn_explicit(): don’t
crash if module_globals is not a dict.

@item 
bpo-20104@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20104}: The new @code{os.posix_spawn} added in 3.7.0b1 was removed as we
are still working on what the API should look like.  Expect this in 3.8
instead.

@item 
bpo-33475@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33475}: Fixed miscellaneous bugs in converting annotations to strings
and optimized parentheses in the string representation.

@item 
bpo-33391@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33391}: Fix a leak in set_symmetric_difference().

@item 
bpo-28055@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28055}: Fix unaligned accesses in siphash24(). Patch by Rolf Eike Beer.

@item 
bpo-32911@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32911}: Due to unexpected compatibility issues discovered during
downstream beta testing, reverted bpo-29463@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29463}. @code{docstring} field is
removed from Module, ClassDef, FunctionDef, and AsyncFunctionDef ast nodes
which was added in 3.7a1.  Docstring expression is restored as a first
statement in their body. Based on patch by Inada Naoki.

@item 
bpo-21983@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21983}: Fix a crash in @code{ctypes.cast()} in case the type argument is a
ctypes structured data type. Patch by Eryk Sun and Oren Milman.
@end itemize

@node Library<169>,Documentation<61>,Core and Builtins<165>,Python 3 7 0 beta 5
@anchor{whatsnew/changelog id799}@anchor{1e88}
@subsubsection Library



@itemize -

@item 
bpo-32751@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32751}: When cancelling the task due to a timeout,
@ref{816,,asyncio.wait_for()} will now wait until the cancellation is complete.

@item 
bpo-32684@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32684}: Fix gather to propagate cancellation of itself even with
return_exceptions.

@item 
bpo-33654@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33654}: Support protocol type switching in SSLTransport.set_protocol().

@item 
bpo-33674@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33674}: Pause the transport as early as possible to further reduce the
risk of data_received() being called before connection_made().

@item 
bpo-33674@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33674}: Fix a race condition in SSLProtocol.connection_made() of
asyncio.sslproto: start immediately the handshake instead of using
call_soon(). Previously, data_received() could be called before the
handshake started, causing the handshake to hang or fail.

@item 
bpo-31647@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31647}: Fixed bug where calling write_eof() on a
_SelectorSocketTransport after it’s already closed raises AttributeError.

@item 
bpo-32610@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32610}: Make asyncio.all_tasks() return only pending tasks.

@item 
bpo-32410@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32410}: Avoid blocking on file IO in sendfile fallback code

@item 
bpo-33469@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33469}: Fix RuntimeError after closing loop that used run_in_executor

@item 
bpo-33672@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33672}: Fix Task.__repr__ crash with Cython’s bogus coroutines

@item 
bpo-33654@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33654}: Fix transport.set_protocol() to support switching between
asyncio.Protocol and asyncio.BufferedProtocol.  Fix loop.start_tls() to
work with asyncio.BufferedProtocols.

@item 
bpo-33652@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33652}: Pickles of type variables and subscripted generics are now
future-proof and compatible with older Python versions.

@item 
bpo-32493@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32493}: Fixed @ref{da7,,uuid.uuid1()} on FreeBSD.

@item 
bpo-33618@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33618}: Finalize and document preliminary and experimental TLS 1.3
support with OpenSSL 1.1.1

@item 
bpo-33623@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33623}: Fix possible SIGSGV when asyncio.Future is created in __del__

@item 
bpo-30877@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30877}: Fixed a bug in the Python implementation of the JSON decoder
that prevented the cache of parsed strings from clearing after finishing
the decoding. Based on patch by c-fos.

@item 
bpo-33570@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33570}: Change TLS 1.3 cipher suite settings for compatibility with
OpenSSL 1.1.1-pre6 and newer. OpenSSL 1.1.1 will have TLS 1.3 ciphers
enabled by default.

@item 
bpo-28556@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28556}: Do not simplify arguments to @code{typing.Union}. Now
@code{Union[Manager, Employee]} is not simplified to @code{Employee} at runtime.
Such simplification previously caused several bugs and limited
possibilities for introspection.

@item 
bpo-33540@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33540}: Add a new @code{block_on_close} class attribute to
@code{ForkingMixIn} and @code{ThreadingMixIn} classes of @ref{d2,,socketserver}.

@item 
bpo-33548@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33548}: tempfile._candidate_tempdir_list should consider common TEMP
locations

@item 
bpo-33109@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33109}: argparse subparsers are once again not required by default,
reverting the change in behavior introduced by bpo-26510@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26510} in 3.7.0a2.

@item 
bpo-33536@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33536}: dataclasses.make_dataclass now checks for invalid field names
and duplicate fields. Also, added a check for invalid field
specifications.

@item 
bpo-33542@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33542}: Prevent @code{uuid.get_node} from using a DUID instead of a MAC on
Windows. Patch by Zvi Effron

@item 
bpo-26819@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26819}: Fix race condition with @code{ReadTransport.resume_reading} in
Windows proactor event loop.

@item 
Fix failure in @code{typing.get_type_hints()} when ClassVar was provided as a
string forward reference.

@item 
bpo-33505@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33505}: Optimize asyncio.ensure_future() by reordering if checks: 1.17x
faster.

@item 
bpo-33497@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33497}: Add errors param to cgi.parse_multipart and make an encoding in
FieldStorage use the given errors (needed for Twisted).  Patch by Amber
Brown.

@item 
bpo-33495@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33495}: Change dataclasses.Fields repr to use the repr of each of its
members, instead of str.  This makes it more clear what each field
actually represents.  This is especially true for the ‘type’ member.

@item 
bpo-33453@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33453}: Fix dataclasses to work if using literal string type
annotations or if using PEP 563 “Postponed Evaluation of Annotations”.
Only specific string prefixes are detected for both ClassVar (“ClassVar”
and “typing.ClassVar”) and InitVar (“InitVar” and “dataclasses.InitVar”).

@item 
bpo-28556@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28556}: Minor fixes in typing module: add annotations to
@code{NamedTuple.__new__}, pass @code{*args} and @code{**kwds} in
@code{Generic.__new__}.  Original PRs by Paulius Šarka and Chad Dombrova.

@item 
bpo-20087@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20087}: Updated alias mapping with glibc 2.27 supported locales.

@item 
bpo-33422@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33422}: Fix trailing quotation marks getting deleted when looking up
byte/string literals on pydoc. Patch by Andrés Delfino.

@item 
bpo-28167@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28167}: The function @code{platform.linux_distribution} and
@code{platform.dist} now trigger a @code{DeprecationWarning} and have been
marked for removal in Python 3.8

@item 
bpo-33197@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33197}: Update error message when constructing invalid
inspect.Parameters Patch by Donghee Na.

@item 
bpo-33263@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33263}: Fix FD leak in @code{_SelectorSocketTransport}  Patch by Vlad
Starostin.

@item 
bpo-32861@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32861}: The urllib.robotparser’s @code{__str__} representation now
includes wildcard entries and the “Crawl-delay” and “Request-rate” fields.
Patch by Michael Lazar.

@item 
bpo-32257@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32257}: The ssl module now contains OP_NO_RENEGOTIATION constant,
available with OpenSSL 1.1.0h or 1.1.1.

@item 
bpo-16865@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16865}: Support arrays >=2GiB in @ref{2e,,ctypes}.  Patch by Segev Finer.
@end itemize

@node Documentation<61>,Tests<59>,Library<169>,Python 3 7 0 beta 5
@anchor{whatsnew/changelog id800}@anchor{1e89}
@subsubsection Documentation



@itemize -

@item 
bpo-23859@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23859}: Document that @code{asyncio.wait()} does not cancel its futures on
timeout.

@item 
bpo-32436@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32436}: Document 
@geindex Python Enhancement Proposals; PEP 567
PEP 567@footnote{https://peps.python.org/pep-0567/} changes to asyncio.

@item 
bpo-33604@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33604}: Update HMAC md5 default to a DeprecationWarning, bump removal
to 3.8.

@item 
bpo-33503@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33503}: Fix broken pypi link

@item 
bpo-33421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33421}: Add missing documentation for @code{typing.AsyncContextManager}.
@end itemize

@node Tests<59>,Build<67>,Documentation<61>,Python 3 7 0 beta 5
@anchor{whatsnew/changelog id801}@anchor{1e8a}
@subsubsection Tests



@itemize -

@item 
bpo-33655@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33655}: Ignore test_posix_fallocate failures on BSD platforms that
might be due to running on ZFS.

@item 
bpo-32604@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32604}: Remove the _xxsubinterpreters module (meant for testing) and
associated helpers.  This module was originally added recently in 3.7b1.
@end itemize

@node Build<67>,macOS<46>,Tests<59>,Python 3 7 0 beta 5
@anchor{whatsnew/changelog id802}@anchor{1e8b}
@subsubsection Build



@itemize -

@item 
bpo-33614@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33614}: Ensures module definition files for the stable ABI on Windows
are correctly regenerated.

@item 
bpo-33522@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33522}: Enable CI builds on Visual Studio Team Services at
@indicateurl{https://python.visualstudio.com/cpython}

@item 
bpo-33012@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33012}: Add @code{-Wno-cast-function-type} for gcc 8 for silencing
warnings about function casts like casting to PyCFunction in method
definition lists.
@end itemize

@node macOS<46>,IDLE<40>,Build<67>,Python 3 7 0 beta 5
@anchor{whatsnew/changelog id803}@anchor{1e8c}
@subsubsection macOS



@itemize -

@item 
bpo-13631@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13631}: The .editrc file in user’s home directory is now processed
correctly during the readline initialization through editline emulation on
macOS.
@end itemize

@node IDLE<40>,,macOS<46>,Python 3 7 0 beta 5
@anchor{whatsnew/changelog id804}@anchor{1e8d}
@subsubsection IDLE



@itemize -

@item 
bpo-33628@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33628}: IDLE: Cleanup codecontext.py and its test.

@item 
bpo-33564@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33564}: IDLE’s code context now recognizes async as a block opener.

@item 
bpo-32831@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32831}: Add docstrings and tests for codecontext.
@end itemize

@node Python 3 7 0 beta 4,Python 3 7 0 beta 3,Python 3 7 0 beta 5,Changelog
@anchor{whatsnew/changelog python-3-7-0-beta-4}@anchor{1e8e}
@subsection Python 3.7.0 beta 4


`Release date: 2018-05-02'

@menu
* Core and Builtins: Core and Builtins<166>. 
* Library: Library<170>. 
* Documentation: Documentation<62>. 
* Tests: Tests<60>. 
* Build: Build<68>. 
* Windows: Windows<59>. 
* macOS: macOS<47>. 
* IDLE: IDLE<41>. 
* Tools/Demos: Tools/Demos<38>. 

@end menu

@node Core and Builtins<166>,Library<170>,,Python 3 7 0 beta 4
@anchor{whatsnew/changelog id805}@anchor{1e8f}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-33363@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33363}: Raise a SyntaxError for @code{async with} and @code{async for}
statements outside of async functions.

@item 
bpo-33128@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33128}: Fix a bug that causes PathFinder to appear twice on
sys.meta_path. Patch by Pablo Galindo Salgado.

@item 
bpo-33312@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33312}: Fixed clang ubsan (undefined behavior sanitizer) warnings in
dictobject.c by adjusting how the internal struct _dictkeysobject shared
keys structure is declared.

@item 
bpo-33231@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33231}: Fix potential memory leak in @code{normalizestring()}.

@item 
bpo-33205@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33205}: Change dict growth function from
@code{round_up_to_power_2(used*2+hashtable_size/2)} to
@code{round_up_to_power_2(used*3)}.  Previously, dict is shrunk only when
@code{used == 0}. Now dict has more chance to be shrunk.

@item 
bpo-29922@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29922}: Improved error messages in ‘async with’ when @code{__aenter__()}
or @code{__aexit__()} return non-awaitable object.

@item 
bpo-33199@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33199}: Fix @code{ma_version_tag} in dict implementation is uninitialized
when copying from key-sharing dict.
@end itemize

@node Library<170>,Documentation<62>,Core and Builtins<166>,Python 3 7 0 beta 4
@anchor{whatsnew/changelog id806}@anchor{1e90}
@subsubsection Library



@itemize -

@item 
bpo-33281@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33281}: Fix ctypes.util.find_library regression on macOS.

@item 
bpo-33383@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33383}: Fixed crash in the get() method of the @ref{38,,dbm.ndbm} database
object when it is called with a single argument.

@item 
bpo-33329@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33329}: Fix multiprocessing regression on newer glibcs

@item 
bpo-991266@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=991266}: Fix quoting of the @code{Comment} attribute of
@ref{1e66,,http.cookies.SimpleCookie}.

@item 
bpo-33131@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33131}: Upgrade bundled version of pip to 10.0.1.

@item 
bpo-33308@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33308}: Fixed a crash in the @code{parser} module when converting an ST
object to a tree of tuples or lists with @code{line_info=False} and
@code{col_info=True}.

@item 
bpo-33266@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33266}: lib2to3 now recognizes @code{rf'...'} strings.

@item 
bpo-11594@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11594}: Ensure line-endings are respected when using lib2to3.

@item 
bpo-33254@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33254}: Have @ref{504,,importlib.resources.contents()} and
@code{importlib.abc.ResourceReader.contents()} return an @ref{1433,,iterable}
instead of an @ref{4c9,,iterator}.

@item 
bpo-33256@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33256}: Fix display of @code{<module>} call in the html produced by
@code{cgitb.html()}. Patch by Stéphane Blondon.

@item 
bpo-33185@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33185}: Fixed regression when running pydoc with the @ref{23e,,-m}
switch. (The regression was introduced in 3.7.0b3 by the resolution of
bpo-33053@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33053}) This fix also changed pydoc to add @code{os.getcwd()} to
@ref{3e2,,sys.path} when necessary, rather than adding @code{"."}.

@item 
bpo-33169@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33169}: Delete entries of @code{None} in @ref{7fb,,sys.path_importer_cache}
when @code{importlib.machinery.invalidate_caches()} is called.

@item 
bpo-33217@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33217}: Deprecate looking up non-Enum objects in Enum classes and Enum
members (will raise @ref{199,,TypeError} in 3.8+).

@item 
bpo-33203@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33203}: @code{random.Random.choice()} now raises @code{IndexError} for empty
sequences consistently even when called from subclasses without a
@code{getrandbits()} implementation.

@item 
bpo-33224@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33224}: Update difflib.mdiff() for 
@geindex Python Enhancement Proposals; PEP 479
PEP 479@footnote{https://peps.python.org/pep-0479/}.  Convert an uncaught
StopIteration in a generator into a return-statement.

@item 
bpo-33209@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33209}: End framing at the end of C implementation of
@ref{1e67,,pickle.Pickler.dump()}.

@item 
bpo-20104@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20104}: Improved error handling and fixed a reference leak in
@ref{52f,,os.posix_spawn()}.

@item 
bpo-33175@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33175}: In dataclasses, Field.__set_name__ now looks up the
__set_name__ special method on the class, not the instance, of the default
value.

@item 
bpo-33097@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33097}: Raise RuntimeError when @code{executor.submit} is called during
interpreter shutdown.

@item 
bpo-31908@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31908}: Fix output of cover files for @code{trace} module command-line
tool. Previously emitted cover files only when @code{--missing} option was
used. Patch by Michael Selik.
@end itemize

@node Documentation<62>,Tests<60>,Library<170>,Python 3 7 0 beta 4
@anchor{whatsnew/changelog id807}@anchor{1e91}
@subsubsection Documentation



@itemize -

@item 
bpo-33378@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33378}: Add Korean language switcher for @indicateurl{https://docs.python.org/3/}

@item 
bpo-33276@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33276}: Clarify that the @code{__path__} attribute on modules cannot be
just any value.

@item 
bpo-33201@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33201}: Modernize documentation for writing C extension types.

@item 
bpo-33195@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33195}: Deprecate @code{Py_UNICODE} usage in @code{c-api/arg} document.
@code{Py_UNICODE} related APIs are deprecated since Python 3.3, but it is
missed in the document.

@item 
bpo-8243@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8243}: Add a note about curses.addch and curses.addstr exception
behavior when writing outside a window, or pad.

@item 
bpo-32337@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32337}: Update documentation related with @code{dict} order.
@end itemize

@node Tests<60>,Build<68>,Documentation<62>,Python 3 7 0 beta 4
@anchor{whatsnew/changelog id808}@anchor{1e92}
@subsubsection Tests



@itemize -

@item 
bpo-33358@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33358}: Fix @code{test_embed.test_pre_initialization_sys_options()} when
the interpreter is built with @code{--enable-shared}.
@end itemize

@node Build<68>,Windows<59>,Tests<60>,Python 3 7 0 beta 4
@anchor{whatsnew/changelog id809}@anchor{1e93}
@subsubsection Build



@itemize -

@item 
bpo-33394@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33394}: Enable the verbose build for extension modules, when GNU make
is passed macros on the command line.

@item 
bpo-33393@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33393}: Update config.guess and config.sub files.

@item 
bpo-33377@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33377}: Add new triplets for mips r6 and riscv variants (used in
extension suffixes).

@item 
bpo-32232@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32232}: By default, modules configured in @code{Modules/Setup} are no
longer built with @code{-DPy_BUILD_CORE}. Instead, modules that specifically
need that preprocessor definition include it in their individual entries.

@item 
bpo-33182@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33182}: The embedding tests can once again be built with clang 6.0
@end itemize

@node Windows<59>,macOS<47>,Build<68>,Python 3 7 0 beta 4
@anchor{whatsnew/changelog id810}@anchor{1e94}
@subsubsection Windows



@itemize -

@item 
bpo-33184@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33184}: Update Windows installer to use OpenSSL 1.1.0h.
@end itemize

@node macOS<47>,IDLE<41>,Windows<59>,Python 3 7 0 beta 4
@anchor{whatsnew/changelog id811}@anchor{1e95}
@subsubsection macOS



@itemize -

@item 
bpo-33184@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33184}: Update macOS installer build to use OpenSSL 1.1.0h.
@end itemize

@node IDLE<41>,Tools/Demos<38>,macOS<47>,Python 3 7 0 beta 4
@anchor{whatsnew/changelog id812}@anchor{1e96}
@subsubsection IDLE



@itemize -

@item 
bpo-21474@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21474}: Update word/identifier definition from ascii to unicode. In
text and entry boxes, this affects selection by double-click, movement
left/right by control-left/right, and deletion left/right by
control-BACKSPACE/DEL.

@item 
bpo-33204@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33204}: IDLE: consistently color invalid string prefixes. A ‘u’ string
prefix cannot be paired with either ‘r’ or ‘f’. Consistently color as much
of the prefix, starting at the right, as is valid. Revise and extend
colorizer test.
@end itemize

@node Tools/Demos<38>,,IDLE<41>,Python 3 7 0 beta 4
@anchor{whatsnew/changelog id813}@anchor{1e97}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-33189@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33189}: @code{pygettext.py} now recognizes only literal strings as
docstrings and translatable strings, and rejects bytes literals and
f-string expressions.

@item 
bpo-31920@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31920}: Fixed handling directories as arguments in the @code{pygettext}
script. Based on patch by Oleg Krasnikov.

@item 
bpo-29673@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29673}: Fix pystackv and pystack gdbinit macros.

@item 
bpo-31583@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31583}: Fix 2to3 for using with –add-suffix option but without
–output-dir option for relative path to files in current directory.
@end itemize

@node Python 3 7 0 beta 3,Python 3 7 0 beta 2,Python 3 7 0 beta 4,Changelog
@anchor{whatsnew/changelog python-3-7-0-beta-3}@anchor{1e98}
@subsection Python 3.7.0 beta 3


`Release date: 2018-03-29'

@menu
* Security: Security<51>. 
* Core and Builtins: Core and Builtins<167>. 
* Library: Library<171>. 
* Documentation: Documentation<63>. 
* Tests: Tests<61>. 
* Build: Build<69>. 
* Windows: Windows<60>. 
* macOS: macOS<48>. 
* IDLE: IDLE<42>. 
* Tools/Demos: Tools/Demos<39>. 
* C API: C API<61>. 

@end menu

@node Security<51>,Core and Builtins<167>,,Python 3 7 0 beta 3
@anchor{whatsnew/changelog id814}@anchor{1e99}
@subsubsection Security



@itemize -

@item 
bpo-33136@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33136}: Harden ssl module against LibreSSL 
@geindex Common Vulnerabilities and Exposures; CVE 2018-8970
CVE 2018-8970@footnote{https://www.cve.org/CVERecord?id=CVE-2018-8970}.
X509_VERIFY_PARAM_set1_host() is called with an explicit namelen. A new
test ensures that NULL bytes are not allowed.

@item 
bpo-33001@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33001}: Minimal fix to prevent buffer overrun in os.symlink on Windows

@item 
bpo-32981@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32981}: Regexes in difflib and poplib were vulnerable to catastrophic
backtracking. These regexes formed potential DOS vectors (REDOS). They
have been refactored. This resolves 
@geindex Common Vulnerabilities and Exposures; CVE 2018-1060
CVE 2018-1060@footnote{https://www.cve.org/CVERecord?id=CVE-2018-1060} and 
@geindex Common Vulnerabilities and Exposures; CVE 2018-1061
CVE 2018-1061@footnote{https://www.cve.org/CVERecord?id=CVE-2018-1061}.
Patch by Jamie Davis.
@end itemize

@node Core and Builtins<167>,Library<171>,Security<51>,Python 3 7 0 beta 3
@anchor{whatsnew/changelog id815}@anchor{1e9a}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-33053@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33053}: When using the -m switch, sys.path[0] is now explicitly
expanded as the `starting' working directory, rather than being left as
the empty path (which allows imports from the current working directory at
the time of the import)

@item 
bpo-33018@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33018}: Improve consistency of errors raised by @code{issubclass()} when
called with a non-class and an abstract base class as the first and second
arguments, respectively. Patch by Josh Bronson.

@item 
bpo-33041@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33041}: Fixed jumping when the function contains an @code{async for} loop.

@item 
bpo-33026@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33026}: Fixed jumping out of “with” block by setting f_lineno.

@item 
bpo-33005@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33005}: Fix a crash on fork when using a custom memory allocator (ex:
using PYTHONMALLOC env var). _PyGILState_Reinit() and
_PyInterpreterState_Enable() now use the default RAW memory allocator to
allocate a new interpreters mutex on fork.

@item 
bpo-17288@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17288}: Prevent jumps from ‘return’ and ‘exception’ trace events.

@item 
bpo-32836@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32836}: Don’t use temporary variables in cases of list/dict/set
comprehensions
@end itemize

@node Library<171>,Documentation<63>,Core and Builtins<167>,Python 3 7 0 beta 3
@anchor{whatsnew/changelog id816}@anchor{1e9b}
@subsubsection Library



@itemize -

@item 
bpo-33141@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33141}: Have Field objects pass through __set_name__ to their default
values, if they have their own __set_name__.

@item 
bpo-33096@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33096}: Allow ttk.Treeview.insert to insert iid that has a false
boolean value. Note iid=0 and iid=False would be same. Patch by Garvit
Khatri.

@item 
bpo-32873@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32873}: Treat type variables and special typing forms as immutable by
copy and pickle.  This fixes several minor issues and inconsistencies, and
improves backwards compatibility with Python 3.6.

@item 
bpo-33134@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33134}: When computing dataclass’s __hash__, use the lookup table to
contain the function which returns the __hash__ value.  This is an
improvement over looking up a string, and then testing that string to see
what to do.

@item 
bpo-33127@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33127}: The ssl module now compiles with LibreSSL 2.7.1.

@item 
bpo-32505@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32505}: Raise TypeError if a member variable of a dataclass is of type
Field, but doesn’t have a type annotation.

@item 
bpo-33078@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33078}: Fix the failure on OSX caused by the tests relying on
sem_getvalue

@item 
bpo-33116@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33116}: Add ‘Field’ to dataclasses.__all__.

@item 
bpo-32896@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32896}: Fix an error where subclassing a dataclass with a field that
uses a default_factory would generate an incorrect class.

@item 
bpo-33100@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33100}: Dataclasses: If a field has a default value that’s a
MemberDescriptorType, then it’s from that field being in __slots__, not an
actual default value.

@item 
bpo-32953@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32953}: If a non-dataclass inherits from a frozen dataclass, allow
attributes to be added to the derived class.  Only attributes from the
frozen dataclass cannot be assigned to.  Require all dataclasses in a
hierarchy to be either all frozen or all non-frozen.

@item 
bpo-33061@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33061}: Add missing @code{NoReturn} to @code{__all__} in typing.py

@item 
bpo-33078@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33078}: Fix the size handling in multiprocessing.Queue when a pickling
error occurs.

@item 
bpo-33064@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33064}: lib2to3 now properly supports trailing commas after @code{*args}
and @code{**kwargs} in function signatures.

@item 
bpo-33056@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33056}: FIX properly close leaking fds in
concurrent.futures.ProcessPoolExecutor.

@item 
bpo-33021@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33021}: Release the GIL during fstat() calls, avoiding hang of all
threads when calling mmap.mmap(), os.urandom(), and random.seed().  Patch
by Nir Soffer.

@item 
bpo-31804@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31804}: Avoid failing in multiprocessing.Process if the standard
streams are closed or None at exit.

@item 
bpo-33037@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33037}: Skip sending/receiving data after SSL transport closing.

@item 
bpo-27683@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27683}: Fix a regression in @ref{84,,ipaddress} that result of
@code{hosts()} is empty when the network is constructed by a tuple
containing an integer mask and only 1 bit left for addresses.

@item 
bpo-32999@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32999}: Fix C implementation of @code{ABC.__subclasscheck__(cls,
subclass)} crashed when @code{subclass} is not a type object.

@item 
bpo-33009@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33009}: Fix inspect.signature() for single-parameter partialmethods.

@item 
bpo-32969@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32969}: Expose several missing constants in zlib and fix corresponding
documentation.

@item 
bpo-32056@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32056}: Improved exceptions raised for invalid number of channels and
sample width when read an audio file in modules @code{aifc}, @ref{11a,,wave}
and @code{sunau}.

@item 
bpo-32844@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32844}: Fix wrong redirection of a low descriptor (0 or 1) to stderr in
subprocess if another low descriptor is closed.

@item 
bpo-32857@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32857}: In @ref{f6,,tkinter}, @code{after_cancel(None)} now raises a
@ref{2ee,,ValueError} instead of canceling the first scheduled function.
Patch by Cheryl Sabella.

@item 
bpo-31639@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31639}: http.server now exposes a ThreadedHTTPServer class and uses it
when the module is run with @code{-m} to cope with web browsers pre-opening
sockets.

@item 
bpo-27645@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27645}: @ref{54e,,sqlite3.Connection} now exposes a
@ref{d79,,backup} method, if the underlying SQLite
library is at version 3.6.11 or higher.  Patch by Lele Gaifax.
@end itemize

@node Documentation<63>,Tests<61>,Library<171>,Python 3 7 0 beta 3
@anchor{whatsnew/changelog id817}@anchor{1e9c}
@subsubsection Documentation



@itemize -

@item 
bpo-33126@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33126}: Document PyBuffer_ToContiguous().

@item 
bpo-27212@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27212}: Modify documentation for the @code{islice()} recipe to consume
initial values up to the start index.

@item 
bpo-28247@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28247}: Update @ref{137,,zipapp} documentation to describe how to make
standalone applications.

@item 
bpo-18802@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18802}: Documentation changes for ipaddress.  Patch by Jon Foster and
Berker Peksag.

@item 
bpo-27428@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27428}: Update documentation to clarify that @code{WindowsRegistryFinder}
implements @code{MetaPathFinder}. (Patch by Himanshu Lakhara)
@end itemize

@node Tests<61>,Build<69>,Documentation<63>,Python 3 7 0 beta 3
@anchor{whatsnew/changelog id818}@anchor{1e9d}
@subsubsection Tests



@itemize -

@item 
bpo-32872@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32872}: Avoid regrtest compatibility issue with namespace packages.

@item 
bpo-32517@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32517}: Fix failing @code{test_asyncio} on macOS 10.12.2+ due to transport
of @code{KqueueSelector} loop was not being closed.

@item 
bpo-19417@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19417}: Add test_bdb.py.
@end itemize

@node Build<69>,Windows<60>,Tests<61>,Python 3 7 0 beta 3
@anchor{whatsnew/changelog id819}@anchor{1e9e}
@subsubsection Build



@itemize -

@item 
bpo-33163@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33163}: Upgrade pip to 9.0.3 and setuptools to v39.0.1.
@end itemize

@node Windows<60>,macOS<48>,Build<69>,Python 3 7 0 beta 3
@anchor{whatsnew/changelog id820}@anchor{1e9f}
@subsubsection Windows



@itemize -

@item 
bpo-33016@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33016}: Fix potential use of uninitialized memory in
nt._getfinalpathname

@item 
bpo-32903@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32903}: Fix a memory leak in os.chdir() on Windows if the current
directory is set to a UNC path.
@end itemize

@node macOS<48>,IDLE<42>,Windows<60>,Python 3 7 0 beta 3
@anchor{whatsnew/changelog id821}@anchor{1ea0}
@subsubsection macOS



@itemize -

@item 
bpo-32726@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32726}: Build and link with private copy of Tcl/Tk 8.6 for the macOS
10.6+ installer. The 10.9+ installer variant already does this.  This
means that the Python 3.7 provided by the python.org macOS installers no
longer need or use any external versions of Tcl/Tk, either system-provided
or user-installed, such as ActiveTcl.
@end itemize

@node IDLE<42>,Tools/Demos<39>,macOS<48>,Python 3 7 0 beta 3
@anchor{whatsnew/changelog id822}@anchor{1ea1}
@subsubsection IDLE



@itemize -

@item 
bpo-32984@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32984}: Set @code{__file__} while running a startup file.  Like Python,
IDLE optionally runs one startup file in the Shell window before
presenting the first interactive input prompt.  For IDLE, @code{-s} runs a
file named in environmental variable  
@geindex IDLESTARTUP
@geindex environment variable; IDLESTARTUP
@code{IDLESTARTUP} or
@geindex PYTHONSTARTUP
@geindex environment variable; PYTHONSTARTUP
@ref{1ba,,PYTHONSTARTUP}; @code{-r file} runs @code{file}.  Python sets
@code{__file__} to the startup file name before running the file and unsets
it before the first prompt.  IDLE now does the same when run normally,
without the @code{-n} option.

@item 
bpo-32940@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32940}: Simplify and rename StringTranslatePseudoMapping in pyparse.
@end itemize

@node Tools/Demos<39>,C API<61>,IDLE<42>,Python 3 7 0 beta 3
@anchor{whatsnew/changelog id823}@anchor{1ea2}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-32885@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32885}: Add an @code{-n} flag for @code{Tools/scripts/pathfix.py} to disable
automatic backup creation (files with @code{~} suffix).
@end itemize

@node C API<61>,,Tools/Demos<39>,Python 3 7 0 beta 3
@anchor{whatsnew/changelog id824}@anchor{1ea3}
@subsubsection C API



@itemize -

@item 
bpo-33042@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33042}: Embedding applications may once again call
PySys_ResetWarnOptions, PySys_AddWarnOption, and PySys_AddXOption prior to
calling Py_Initialize.

@item 
bpo-32374@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32374}: Document that m_traverse for multi-phase initialized modules
can be called with m_state=NULL, and add a sanity check
@end itemize

@node Python 3 7 0 beta 2,Python 3 7 0 beta 1,Python 3 7 0 beta 3,Changelog
@anchor{whatsnew/changelog python-3-7-0-beta-2}@anchor{1ea4}
@subsection Python 3.7.0 beta 2


`Release date: 2018-02-27'

@menu
* Security: Security<52>. 
* Core and Builtins: Core and Builtins<168>. 
* Library: Library<172>. 
* Documentation: Documentation<64>. 
* Tests: Tests<62>. 
* Build: Build<70>. 
* Windows: Windows<61>. 
* macOS: macOS<49>. 
* IDLE: IDLE<43>. 
* Tools/Demos: Tools/Demos<40>. 

@end menu

@node Security<52>,Core and Builtins<168>,,Python 3 7 0 beta 2
@anchor{whatsnew/changelog id825}@anchor{1ea5}
@subsubsection Security



@itemize -

@item 
bpo-28414@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28414}: The ssl module now allows users to perform their own IDN
en/decoding when using SNI.
@end itemize

@node Core and Builtins<168>,Library<172>,Security<52>,Python 3 7 0 beta 2
@anchor{whatsnew/changelog id826}@anchor{1ea6}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-32889@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32889}: Update Valgrind suppression list to account for the rename of
@code{Py_ADDRESS_IN_RANG} to @code{address_in_range}.

@item 
bpo-31356@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31356}: Remove the new API added in bpo-31356@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31356} (gc.ensure_disabled()
context manager).

@item 
bpo-32305@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32305}: For namespace packages, ensure that both @code{__file__} and
@code{__spec__.origin} are set to None.

@item 
bpo-32303@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32303}: Make sure @code{__spec__.loader} matches @code{__loader__} for
namespace packages.

@item 
bpo-32711@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32711}: Fix the warning messages for Python/ast_unparse.c. Patch by
Stéphane Wirtel

@item 
bpo-32583@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32583}: Fix possible crashing in builtin Unicode decoders caused by
write out-of-bound errors when using customized decode error handlers.
@end itemize

@node Library<172>,Documentation<64>,Core and Builtins<168>,Python 3 7 0 beta 2
@anchor{whatsnew/changelog id827}@anchor{1ea7}
@subsubsection Library



@itemize -

@item 
bpo-32960@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32960}: For dataclasses, disallow inheriting frozen from non-frozen
classes, and also disallow inheriting non-frozen from frozen classes. This
restriction will be relaxed at a future date.

@item 
bpo-32713@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32713}: Fixed tarfile.itn handling of out-of-bounds float values. Patch
by Joffrey Fuhrer.

@item 
bpo-32951@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32951}: Direct instantiation of SSLSocket and SSLObject objects is now
prohibited. The constructors were never documented, tested, or designed as
public constructors. Users were suppose to use ssl.wrap_socket() or
SSLContext.

@item 
bpo-32929@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32929}: Remove the tri-state parameter “hash”, and add the boolean
“unsafe_hash”. If unsafe_hash is True, add a __hash__ function, but if a
__hash__ exists, raise TypeError.  If unsafe_hash is False, add a __hash__
based on the values of eq= and frozen=.  The unsafe_hash=False behavior is
the same as the old hash=None behavior.  unsafe_hash=False is the default,
just as hash=None used to be.

@item 
bpo-32947@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32947}: Add OP_ENABLE_MIDDLEBOX_COMPAT and test workaround for TLSv1.3
for future compatibility with OpenSSL 1.1.1.

@item 
bpo-30622@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30622}: The ssl module now detects missing NPN support in LibreSSL.

@item 
bpo-32922@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32922}: dbm.open() now encodes filename with the filesystem encoding
rather than default encoding.

@item 
bpo-32859@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32859}: In @code{os.dup2}, don’t check every call whether the @code{dup3}
syscall exists or not.

@item 
bpo-32556@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32556}: nt._getfinalpathname, nt._getvolumepathname and
nt._getdiskusage now correctly convert from bytes.

@item 
bpo-25988@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25988}: Emit a @ref{1a4,,DeprecationWarning} when using or importing an ABC
directly from @ref{1e,,collections} rather than from @ref{1f,,collections.abc}.

@item 
bpo-21060@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21060}: Rewrite confusing message from setup.py upload from “No dist
file created in earlier command” to the more helpful “Must create and
upload files in one command”.

@item 
bpo-32852@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32852}: Make sure sys.argv remains as a list when running trace.

@item 
bpo-31333@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31333}: @code{_abc} module is added.  It is a speedup module with C
implementations for various functions and methods in @code{abc}.  Creating an
ABC subclass and calling @code{isinstance} or @code{issubclass} with an ABC
subclass are up to 1.5x faster. In addition, this makes Python start-up up
to 10% faster. Note that the new implementation hides internal registry
and caches, previously accessible via private attributes
@code{_abc_registry}, @code{_abc_cache}, and @code{_abc_negative_cache}.  There are
three debugging helper methods that can be used instead
@code{_dump_registry}, @code{_abc_registry_clear}, and @code{_abc_caches_clear}.

@item 
bpo-32841@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32841}: Fixed @code{asyncio.Condition} issue which silently ignored
cancellation after notifying and cancelling a conditional lock. Patch by
Bar Harel.

@item 
bpo-32819@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32819}: ssl.match_hostname() has been simplified and no longer depends
on re and ipaddress module for wildcard and IP addresses. Error reporting
for invalid wildcards has been improved.

@item 
bpo-32394@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32394}: socket: Remove
TCP_FASTOPEN,TCP_KEEPCNT,TCP_KEEPIDLE,TCP_KEEPINTVL flags on older version
Windows during run-time.

@item 
bpo-31787@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31787}: Fixed refleaks of @code{__init__()} methods in various modules.
(Contributed by Oren Milman)

@item 
bpo-30157@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30157}: Fixed guessing quote and delimiter in csv.Sniffer.sniff() when
only the last field is quoted.  Patch by Jake Davis.

@item 
bpo-32792@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32792}: collections.ChainMap() preserves the order of the underlying
mappings.

@item 
bpo-32775@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32775}: @ref{1898,,fnmatch.translate()} no longer produces patterns which
contain set operations. Sets starting with ‘[’ or containing ‘–’, ‘&&’,
‘~~’ or ‘||’ will be interpreted differently in regular expressions in
future versions. Currently they emit warnings. fnmatch.translate() now
avoids producing patterns containing such sets by accident.

@item 
bpo-32622@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32622}: Implement native fast sendfile for Windows proactor event loop.

@item 
bpo-32777@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32777}: Fix a rare but potential pre-exec child process deadlock in
subprocess on POSIX systems when marking file descriptors inheritable on
exec in the child process.  This bug appears to have been introduced in
3.4.

@item 
bpo-32647@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32647}: The ctypes module used to depend on indirect linking for
dlopen. The shared extension is now explicitly linked against libdl on
platforms with dl.

@item 
bpo-32741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32741}: Implement @code{asyncio.TimerHandle.when()} method.

@item 
bpo-32691@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32691}: Use mod_spec.parent when running modules with pdb

@item 
bpo-32734@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32734}: Fixed @code{asyncio.Lock()} safety issue which allowed acquiring
and locking the same lock multiple times, without it being free. Patch by
Bar Harel.

@item 
bpo-32727@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32727}: Do not include name field in SMTP envelope from address. Patch
by Stéphane Wirtel

@item 
bpo-31453@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31453}: Add TLSVersion constants and SSLContext.maximum_version /
minimum_version attributes. The new API wraps OpenSSL 1.1
@indicateurl{https://web.archive.org/web/20180309043602/https://www.openssl.org/docs/man1.1.0/ssl/SSL_CTX_set_min_proto_version.html}
feature.

@item 
bpo-24334@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24334}: Internal implementation details of ssl module were cleaned up.
The SSLSocket has one less layer of indirection. Owner and session
information are now handled by the SSLSocket and SSLObject constructor.
Channel binding implementation has been simplified.

@item 
bpo-31848@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31848}: Fix the error handling in Aifc_read.initfp() when the SSND
chunk is not found. Patch by Zackery Spytz.

@item 
bpo-32585@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32585}: Add Ttk spinbox widget to @ref{100,,tkinter.ttk}.  Patch by Alan D
Moore.

@item 
bpo-32221@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32221}: Various functions returning tuple containing IPv6 addresses now
omit @code{%scope} part since the same information is already encoded in
`scopeid' tuple item. Especially this speeds up @code{socket.recvfrom()}
when it receives multicast packet since useless resolving of network
interface name is omitted.

@item 
bpo-30693@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30693}: The TarFile class now recurses directories in a reproducible
way.

@item 
bpo-30693@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30693}: The ZipFile class now recurses directories in a reproducible
way.
@end itemize

@node Documentation<64>,Tests<62>,Library<172>,Python 3 7 0 beta 2
@anchor{whatsnew/changelog id828}@anchor{1ea8}
@subsubsection Documentation



@itemize -

@item 
bpo-28124@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28124}: The ssl module function ssl.wrap_socket() has been
de-emphasized and deprecated in favor of the more secure and efficient
SSLContext.wrap_socket() method.

@item 
bpo-17232@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17232}: Clarify docs for -O and -OO.  Patch by Terry Reedy.

@item 
bpo-32436@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32436}: Add documentation for the contextvars module (PEP 567).

@item 
bpo-32800@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32800}: Update link to w3c doc for xml default namespaces.

@item 
bpo-11015@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11015}: Update @ref{ea,,test.support} documentation.

@item 
bpo-8722@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8722}: Document @code{__getattr__()} behavior when property @code{get()}
method raises @ref{5f0,,AttributeError}.

@item 
bpo-32614@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32614}: Modify RE examples in documentation to use raw strings to
prevent @ref{1a4,,DeprecationWarning} and add text to REGEX HOWTO to highlight
the deprecation.

@item 
bpo-31972@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31972}: Improve docstrings for @code{pathlib.PurePath} subclasses.
@end itemize

@node Tests<62>,Build<70>,Documentation<64>,Python 3 7 0 beta 2
@anchor{whatsnew/changelog id829}@anchor{1ea9}
@subsubsection Tests



@itemize -

@item 
bpo-31809@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31809}: Add tests to verify connection with secp ECDH curves.
@end itemize

@node Build<70>,Windows<61>,Tests<62>,Python 3 7 0 beta 2
@anchor{whatsnew/changelog id830}@anchor{1eaa}
@subsubsection Build



@itemize -

@item 
bpo-32898@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32898}: Fix the python debug build when using COUNT_ALLOCS.
@end itemize

@node Windows<61>,macOS<49>,Build<70>,Python 3 7 0 beta 2
@anchor{whatsnew/changelog id831}@anchor{1eab}
@subsubsection Windows



@itemize -

@item 
bpo-32901@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32901}: Update Tcl and Tk versions to 8.6.8

@item 
bpo-31966@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31966}: Fixed WindowsConsoleIO.write() for writing empty data.

@item 
bpo-32409@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32409}: Ensures activate.bat can handle Unicode contents.

@item 
bpo-32457@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32457}: Improves handling of denormalized executable path when
launching Python.

@item 
bpo-32370@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32370}: Use the correct encoding for ipconfig output in the uuid
module. Patch by Segev Finer.

@item 
bpo-29248@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29248}: Fix @ref{b20,,os.readlink()} on Windows, which was mistakenly
treating the @code{PrintNameOffset} field of the reparse data buffer as a
number of characters instead of bytes. Patch by Craig Holmquist and SSE4.
@end itemize

@node macOS<49>,IDLE<43>,Windows<61>,Python 3 7 0 beta 2
@anchor{whatsnew/changelog id832}@anchor{1eac}
@subsubsection macOS



@itemize -

@item 
bpo-32901@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32901}: Update macOS 10.9+ installer to Tcl/Tk 8.6.8.
@end itemize

@node IDLE<43>,Tools/Demos<40>,macOS<49>,Python 3 7 0 beta 2
@anchor{whatsnew/changelog id833}@anchor{1ead}
@subsubsection IDLE



@itemize -

@item 
bpo-32916@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32916}: Change @code{str} to @code{code} in pyparse.

@item 
bpo-32905@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32905}: Remove unused code in pyparse module.

@item 
bpo-32874@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32874}: Add tests for pyparse.

@item 
bpo-32837@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32837}: Using the system and place-dependent default encoding for
open() is a bad idea for IDLE’s system and location-independent files.

@item 
bpo-32826@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32826}: Add “encoding=utf-8” to open() in IDLE’s test_help_about. GUI
test test_file_buttons() only looks at initial ascii-only lines, but
failed on systems where open() defaults to ‘ascii’ because readline()
internally reads and decodes far enough ahead to encounter a non-ascii
character in CREDITS.txt.

@item 
bpo-32765@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32765}: Update configdialog General tab docstring to add new widgets to
the widget list.
@end itemize

@node Tools/Demos<40>,,IDLE<43>,Python 3 7 0 beta 2
@anchor{whatsnew/changelog id834}@anchor{1eae}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-32222@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32222}: Fix pygettext not extracting docstrings for functions with type
annotated arguments. Patch by Toby Harradine.
@end itemize

@node Python 3 7 0 beta 1,Python 3 7 0 alpha 4,Python 3 7 0 beta 2,Changelog
@anchor{whatsnew/changelog python-3-7-0-beta-1}@anchor{1eaf}
@subsection Python 3.7.0 beta 1


`Release date: 2018-01-30'

@menu
* Core and Builtins: Core and Builtins<169>. 
* Library: Library<173>. 
* Documentation: Documentation<65>. 
* Tests: Tests<63>. 
* Build: Build<71>. 
* Windows: Windows<62>. 
* macOS: macOS<50>. 
* C API: C API<62>. 

@end menu

@node Core and Builtins<169>,Library<173>,,Python 3 7 0 beta 1
@anchor{whatsnew/changelog id835}@anchor{1eb0}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-32703@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32703}: Fix coroutine’s ResourceWarning when there’s an active error
set when it’s being finalized.

@item 
bpo-32650@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32650}: Pdb and other debuggers dependent on bdb.py will correctly step
over (next command) native coroutines. Patch by Pablo Galindo.

@item 
bpo-28685@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28685}: Optimize list.sort() and sorted() by using type specialized
comparisons when possible.

@item 
bpo-32685@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32685}: Improve suggestion when the Python 2 form of print statement is
either present on the same line as the header of a compound statement or
else terminated by a semi-colon instead of a newline. Patch by Nitish
Chandra.

@item 
bpo-32697@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32697}: Python now explicitly preserves the definition order of
keyword-only parameters.  It’s always preserved their order, but this
behavior was never guaranteed before; this behavior is now guaranteed and
tested.

@item 
bpo-32690@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32690}: The locals() dictionary now displays in the lexical order that
variables were defined.  Previously, the order was reversed.

@item 
bpo-32677@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32677}: Add @code{.isascii()} method to @code{str}, @code{bytes} and
@code{bytearray}. It can be used to test that string contains only ASCII
characters.

@item 
bpo-32670@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32670}: Enforce 
@geindex Python Enhancement Proposals; PEP 479
PEP 479@footnote{https://peps.python.org/pep-0479/} for all code. This means that manually
raising a StopIteration exception from a generator is prohibited for all
code, regardless of whether ‘from __future__ import generator_stop’ was
used or not.

@item 
bpo-32591@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32591}: Added built-in support for tracking the origin of coroutine
objects; see sys.set_coroutine_origin_tracking_depth and
CoroutineType.cr_origin. This replaces the asyncio debug mode’s use of
coroutine wrapping for native coroutine objects.

@item 
bpo-31368@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31368}: Expose preadv and pwritev system calls in the os module. Patch
by Pablo Galindo

@item 
bpo-32544@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32544}: @code{hasattr(obj, name)} and @code{getattr(obj, name, default)} are
about 4 times faster than before when @code{name} is not found and @code{obj}
doesn’t override @code{__getattr__} or @code{__getattribute__}.

@item 
bpo-26163@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26163}: Improved frozenset() hash to create more distinct hash values
when faced with datasets containing many similar values.

@item 
bpo-32550@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32550}: Remove the STORE_ANNOTATION bytecode.

@item 
bpo-20104@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20104}: Expose posix_spawn as a low level API in the os module.
(removed before 3.7.0rc1)

@item 
bpo-24340@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24340}: Fixed estimation of the code stack size.

@item 
bpo-32436@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32436}: Implement 
@geindex Python Enhancement Proposals; PEP 567
PEP 567@footnote{https://peps.python.org/pep-0567/} Context Variables.

@item 
bpo-18533@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18533}: @code{repr()} on a dict containing its own @code{values()} or
@code{items()} no longer raises @code{RecursionError}; OrderedDict similarly.
Instead, use @code{...}, as for other recursive structures.  Patch by Ben
North.

@item 
bpo-20891@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20891}: Py_Initialize() now creates the GIL. The GIL is no longer
created “on demand” to fix a race condition when PyGILState_Ensure() is
called in a non-Python thread.

@item 
bpo-32028@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32028}: Leading whitespace is now correctly ignored when generating
suggestions for converting Py2 print statements to Py3 builtin print
function calls. Patch by Sanyam Khurana.

@item 
bpo-31179@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31179}: Make dict.copy() up to 5.5 times faster.

@item 
bpo-31113@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31113}: Get rid of recursion in the compiler for normal control flow.
@end itemize

@node Library<173>,Documentation<65>,Core and Builtins<169>,Python 3 7 0 beta 1
@anchor{whatsnew/changelog id836}@anchor{1eb1}
@subsubsection Library



@itemize -

@item 
bpo-25988@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25988}: Deprecate exposing the contents of collections.abc in the
regular collections module.

@item 
bpo-31429@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31429}: The default cipher suite selection of the ssl module now uses a
blacklist approach rather than a hard-coded whitelist. Python no longer
re-enables ciphers that have been blocked by OpenSSL security update.
Default cipher suite selection can be configured on compile time.

@item 
bpo-30306@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30306}: contextlib.contextmanager now releases the arguments passed to
the underlying generator as soon as the context manager is entered.
Previously it would keep them alive for as long as the context manager was
alive, even when not being used as a function decorator. Patch by Martin
Teichmann.

@item 
bpo-21417@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21417}: Added support for setting the compression level for
zipfile.ZipFile.

@item 
bpo-32251@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32251}: Implement asyncio.BufferedProtocol (provisional API).

@item 
bpo-32513@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32513}: In dataclasses, allow easier overriding of dunder methods
without specifying decorator parameters.

@item 
bpo-32660@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32660}: @ref{e7,,termios} makes available @code{FIONREAD}, @code{FIONCLEX},
@code{FIOCLEX}, @code{FIOASYNC} and @code{FIONBIO} also under Solaris/derivatives.

@item 
bpo-27931@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27931}: Fix email address header parsing error when the username is an
empty quoted string. Patch by Xiang Zhang.

@item 
bpo-32659@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32659}: Under Solaris and derivatives, @ref{16cd,,os.stat_result} provides
a st_fstype attribute.

@item 
bpo-32662@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32662}: Implement Server.start_serving(), Server.serve_forever(), and
Server.is_serving() methods.  Add ‘start_serving’ keyword parameter to
loop.create_server() and loop.create_unix_server().

@item 
bpo-32391@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32391}: Implement @ref{d08,,asyncio.StreamWriter.wait_closed()} and
@ref{d09,,asyncio.StreamWriter.is_closing()} methods

@item 
bpo-32643@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32643}: Make Task._step, Task._wakeup and Future._schedule_callbacks
methods private.

@item 
bpo-32630@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32630}: Refactor decimal module to use contextvars to store decimal
context.

@item 
bpo-32622@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32622}: Add @code{asyncio.AbstractEventLoop.sendfile()} method.

@item 
bpo-32304@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32304}: distutils’ upload command no longer corrupts tar files ending
with a CR byte, and no longer tries to convert CR to CRLF in any of the
upload text fields.

@item 
bpo-32502@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32502}: uuid.uuid1 no longer raises an exception if a 64-bit hardware
address is encountered.

@item 
bpo-32596@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32596}: @code{concurrent.futures} imports @code{ThreadPoolExecutor} and
@code{ProcessPoolExecutor} lazily (using 
@geindex Python Enhancement Proposals; PEP 562
PEP 562@footnote{https://peps.python.org/pep-0562/}). It makes @code{import
asyncio} about 15% faster because asyncio uses only
@code{ThreadPoolExecutor} by default.

@item 
bpo-31801@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31801}: Add @code{_ignore_} to @code{Enum} so temporary variables can be used
during class construction without being turned into members.

@item 
bpo-32576@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32576}: Use queue.SimpleQueue() in places where it can be invoked from
a weakref callback.

@item 
bpo-32574@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32574}: Fix memory leak in asyncio.Queue, when the queue has limited
size and it is full, the cancellation of queue.put() can cause a memory
leak. Patch by: José Melero.

@item 
bpo-32521@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32521}: The nis module is now compatible with new libnsl and headers
location.

@item 
bpo-32467@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32467}: collections.abc.ValuesView now inherits from
collections.abc.Collection.

@item 
bpo-32473@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32473}: Improve ABCMeta._dump_registry() output readability

@item 
bpo-32102@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32102}: New argument @code{capture_output} for subprocess.run

@item 
bpo-32521@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32521}: glibc has removed Sun RPC. Use replacement libtirpc headers and
library in nis module.

@item 
bpo-32493@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32493}: UUID module fixes build for FreeBSD/OpenBSD

@item 
bpo-32503@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32503}: Pickling with protocol 4 no longer creates too small frames.

@item 
bpo-29237@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29237}: Create enum for pstats sorting options

@item 
bpo-32454@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32454}: Add close(fd) function to the socket module.

@item 
bpo-25942@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25942}: The subprocess module is now more graceful when handling a
Ctrl-C KeyboardInterrupt during subprocess.call, subprocess.run, or a
Popen context manager.  It now waits a short amount of time for the child
(presumed to have also gotten the SIGINT) to exit, before continuing the
KeyboardInterrupt exception handling.  This still includes a SIGKILL in
the call() and run() APIs, but at least the child had a chance first.

@item 
bpo-32433@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32433}: The hmac module now has hmac.digest(), which provides an
optimized HMAC digest.

@item 
bpo-28134@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28134}: Sockets now auto-detect family, type and protocol from file
descriptor by default.

@item 
bpo-32404@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32404}: Fix bug where @ref{713,,datetime.datetime.fromtimestamp()} did not
call __new__ in @ref{4e3,,datetime.datetime} subclasses.

@item 
bpo-32403@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32403}: Improved speed of @ref{1fc,,datetime.date} and
@ref{4e3,,datetime.datetime} alternate constructors.

@item 
bpo-32228@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32228}: Ensure that @code{truncate()} preserves the file position (as
reported by @code{tell()}) after writes longer than the buffer size.

@item 
bpo-32410@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32410}: Implement @code{loop.sock_sendfile} for asyncio event loop.

@item 
bpo-22908@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22908}: Added seek and tell to the ZipExtFile class. This only works if
the file object used to open the zipfile is seekable.

@item 
bpo-32373@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32373}: Add socket.getblocking() method.

@item 
bpo-32248@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32248}: Add @ref{7f,,importlib.resources} and
@code{importlib.abc.ResourceReader} as the unified API for reading
resources contained within packages.  Loaders wishing to support resource
reading must implement the @code{get_resource_reader()} method.  File-based
and zipimport-based loaders both implement these APIs.
@ref{de8,,importlib.abc.ResourceLoader} is deprecated in favor of these new
APIs.

@item 
bpo-32320@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32320}: collections.namedtuple() now supports default values.

@item 
bpo-29302@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29302}: Add contextlib.AsyncExitStack. Patch by Alexander Mohr and Ilya
Kulakov.

@item 
bpo-31961@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31961}: `Removed in Python 3.7.0b2.' The `args' argument of
subprocess.Popen can now be a @ref{5a1,,path-like object}. If `args' is given
as a sequence, it’s first element can now be a path-like object as
well.

@item 
bpo-31900@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31900}: The @ref{dfe,,locale.localeconv()} function now sets temporarily the
@code{LC_CTYPE} locale to the @code{LC_NUMERIC} locale to decode
@code{decimal_point} and @code{thousands_sep} byte strings if they are non-ASCII
or longer than 1 byte, and the @code{LC_NUMERIC} locale is different than the
@code{LC_CTYPE} locale. This temporary change affects other threads. Same
change for the @ref{834,,str.format()} method when formatting a number
(@ref{19c,,int}, @ref{197,,float}, @code{float} and subclasses) with the
@code{n} type (ex: @code{'@{:n@}'.format(1234)}).

@item 
bpo-31853@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31853}: Use super().method instead of socket.method in SSLSocket.  They
were there most likely for legacy reasons.

@item 
bpo-31399@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31399}: The ssl module now uses OpenSSL’s X509_VERIFY_PARAM_set1_host()
and X509_VERIFY_PARAM_set1_ip() API to verify hostname and IP addresses.
Subject common name fallback can be disabled with
SSLContext.hostname_checks_common_name.

@item 
bpo-14976@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14976}: Add a queue.SimpleQueue class, an unbounded FIFO queue with a
reentrant C implementation of put().
@end itemize

@node Documentation<65>,Tests<63>,Library<173>,Python 3 7 0 beta 1
@anchor{whatsnew/changelog id837}@anchor{1eb2}
@subsubsection Documentation



@itemize -

@item 
bpo-32724@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32724}: Add references to some commands in the documentation of Pdb.
Patch by Stéphane Wirtel

@item 
bpo-32649@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32649}: Complete the C API documentation, profiling and tracing part
with the newly added per-opcode events.

@item 
bpo-17799@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17799}: Explain real behaviour of sys.settrace and sys.setprofile and
their C-API counterparts regarding which type of events are received in
each function. Patch by Pablo Galindo Salgado.
@end itemize

@node Tests<63>,Build<71>,Documentation<65>,Python 3 7 0 beta 1
@anchor{whatsnew/changelog id838}@anchor{1eb3}
@subsubsection Tests



@itemize -

@item 
bpo-32721@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32721}: Fix test_hashlib to not fail if the _md5 module is not built.

@item 
bpo-28414@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28414}: Add test cases for IDNA 2003 and 2008 host names. IDNA 2003
internationalized host names are working since bpo-31399@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31399} has landed. IDNA
2008 are still broken.

@item 
bpo-32604@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32604}: Add a new “_xxsubinterpreters” extension module that exposes
the existing subinterpreter C-API and a new cross-interpreter data sharing
mechanism. The module is primarily intended for more thorough testing of
the existing subinterpreter support. Note that the _xxsubinterpreters
module has been removed in 3.7.0rc1.

@item 
bpo-32602@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32602}: Add test certs and test for ECDSA cert and EC/RSA dual mode.

@item 
bpo-32549@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32549}: On Travis CI, Python now Compiles and uses a local copy of
OpenSSL 1.1.0g for testing.
@end itemize

@node Build<71>,Windows<62>,Tests<63>,Python 3 7 0 beta 1
@anchor{whatsnew/changelog id839}@anchor{1eb4}
@subsubsection Build



@itemize -

@item 
bpo-32635@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32635}: Fix segfault of the crypt module when libxcrypt is provided
instead of libcrypt at the system.

@item 
bpo-32598@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32598}: Use autoconf to detect OpenSSL libs, headers and supported
features. The ax_check_openssl M4 macro uses pkg-config to locate OpenSSL
and falls back to manual search.

@item 
bpo-32593@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32593}: Drop support of FreeBSD 9 and older.

@item 
bpo-29708@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29708}: If the 
@geindex SOURCE_DATE_EPOCH
@geindex environment variable; SOURCE_DATE_EPOCH
@code{SOURCE_DATE_EPOCH} environment variable is set,
@ref{b8,,py_compile} will always create hash-based @code{.pyc} files.
@end itemize

@node Windows<62>,macOS<50>,Build<71>,Python 3 7 0 beta 1
@anchor{whatsnew/changelog id840}@anchor{1eb5}
@subsubsection Windows



@itemize -

@item 
bpo-32588@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32588}: Create standalone _distutils_findvs module and add missing
_queue module to installer.

@item 
bpo-29911@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29911}: Ensure separate Modify and Uninstall buttons are displayed.

@item 
bpo-32507@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32507}: Use app-local UCRT install rather than the proper update for
old versions of Windows.
@end itemize

@node macOS<50>,C API<62>,Windows<62>,Python 3 7 0 beta 1
@anchor{whatsnew/changelog id841}@anchor{1eb6}
@subsubsection macOS



@itemize -

@item 
bpo-32726@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32726}: Provide an additional, more modern macOS installer variant that
supports macOS 10.9+ systems in 64-bit mode only.  Upgrade the supplied
third-party libraries to OpenSSL 1.1.0g and to SQLite 3.22.0.  The 10.9+
installer now links with and supplies its own copy of Tcl/Tk 8.6.

@item 
bpo-28440@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28440}: No longer add /Library/Python/3.x/site-packages to sys.path for
macOS framework builds to avoid future conflicts.
@end itemize

@node C API<62>,,macOS<50>,Python 3 7 0 beta 1
@anchor{whatsnew/changelog id842}@anchor{1eb7}
@subsubsection C API



@itemize -

@item 
bpo-32681@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32681}: Fix uninitialized variable ‘res’ in the C implementation of
os.dup2. Patch by Stéphane Wirtel

@item 
bpo-10381@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10381}: Add C API access to the @code{datetime.timezone} constructor and
@code{datetime.timezone.UTC} singleton.
@end itemize

@node Python 3 7 0 alpha 4,Python 3 7 0 alpha 3,Python 3 7 0 beta 1,Changelog
@anchor{whatsnew/changelog python-3-7-0-alpha-4}@anchor{1eb8}
@subsection Python 3.7.0 alpha 4


`Release date: 2018-01-08'

@menu
* Core and Builtins: Core and Builtins<170>. 
* Library: Library<174>. 
* Documentation: Documentation<66>. 
* Tests: Tests<64>. 
* Windows: Windows<63>. 
* Tools/Demos: Tools/Demos<41>. 
* C API: C API<63>. 

@end menu

@node Core and Builtins<170>,Library<174>,,Python 3 7 0 alpha 4
@anchor{whatsnew/changelog id843}@anchor{1eb9}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-31975@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31975}: The default warning filter list now starts with a
“default::DeprecationWarning:__main__” entry, so deprecation warnings are
once again shown by default in single-file scripts and at the interactive
prompt.

@item 
bpo-32226@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32226}: @code{__class_getitem__} is now an automatic class method.

@item 
bpo-32399@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32399}: Add AIX uuid library support for RFC4122 using uuid_create() in
libc.a

@item 
bpo-32390@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32390}: Fix the compilation failure on AIX after the f_fsid field has
been added to the object returned by os.statvfs() (bpo-32143@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32143}). Original
patch by Michael Felt.

@item 
bpo-32379@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32379}: Make MRO computation faster when a class inherits from a single
base.

@item 
bpo-32259@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32259}: The error message of a TypeError raised when unpack
non-iterable is now more specific.

@item 
bpo-27169@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27169}: The @code{__debug__} constant is now optimized out at compile
time. This fixes also bpo-22091@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22091}.

@item 
bpo-32329@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32329}: The @ref{1eba,,-R} option now turns on hash randomization when
the 
@geindex PYTHONHASHSEED
@geindex environment variable; PYTHONHASHSEED
@ref{1283,,PYTHONHASHSEED} environment variable is set to @code{0}.
Previously, the option was ignored. Moreover,
@code{sys.flags.hash_randomization} is now properly set to 0 when hash
randomization is turned off by @code{PYTHONHASHSEED=0}.

@item 
bpo-30416@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30416}: The optimizer is now protected from spending much time doing
complex calculations and consuming much memory for creating large
constants in constant folding. Increased limits for constants that can be
produced in constant folding.

@item 
bpo-32282@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32282}: Fix an unnecessary ifdef in the include of VersionHelpers.h in
socketmodule on Windows.

@item 
bpo-30579@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30579}: Implement TracebackType.__new__ to allow Python-level creation
of traceback objects, and make TracebackType.tb_next mutable.

@item 
bpo-32260@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32260}: Don’t byte swap the input keys to the SipHash algorithm on
big-endian platforms. This should ensure siphash gives consistent results
across platforms.

@item 
bpo-31506@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31506}: Improve the error message logic for object.__new__ and
object.__init__. Patch by Sanyam Khurana.

@item 
bpo-20361@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20361}: @code{-b} and @code{-bb} now inject @code{'default::BytesWarning'} and
@code{error::BytesWarning} entries into @code{sys.warnoptions}, ensuring that
they take precedence over any other warning filters configured via the
@code{-W} option or the @code{PYTHONWARNINGS} environment variable.

@item 
bpo-32230@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32230}: @code{-X dev} now injects a @code{'default'} entry into
sys.warnoptions, ensuring that it behaves identically to actually passing
@code{-Wdefault} at the command line.

@item 
bpo-29240@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29240}: Add a new UTF-8 mode: implementation of the 
@geindex Python Enhancement Proposals; PEP 540
PEP 540@footnote{https://peps.python.org/pep-0540/}.

@item 
bpo-32226@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32226}: 
@geindex Python Enhancement Proposals; PEP 560
PEP 560@footnote{https://peps.python.org/pep-0560/}: Add support for @code{__mro_entries__} and
@code{__class_getitem__}. Implemented by Ivan Levkivskyi.

@item 
bpo-32225@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32225}: 
@geindex Python Enhancement Proposals; PEP 562
PEP 562@footnote{https://peps.python.org/pep-0562/}: Add support for module @code{__getattr__} and
@code{__dir__}. Implemented by Ivan Levkivskyi.

@item 
bpo-31901@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31901}: The @code{atexit} module now has its callback stored per
interpreter.

@item 
bpo-31650@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31650}: Implement 
@geindex Python Enhancement Proposals; PEP 552
PEP 552@footnote{https://peps.python.org/pep-0552/} (Deterministic pycs). Python now supports
invalidating bytecode cache files bashed on a source content hash rather
than source last-modified time.

@item 
bpo-29469@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29469}: Move constant folding from bytecode layer to AST layer.
Original patch by Eugene Toder.
@end itemize

@node Library<174>,Documentation<66>,Core and Builtins<170>,Python 3 7 0 alpha 4
@anchor{whatsnew/changelog id844}@anchor{1ebb}
@subsubsection Library



@itemize -

@item 
bpo-32506@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32506}: Now that dict is defined as keeping insertion order, drop
OrderedDict and just use plain dict.

@item 
bpo-32279@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32279}: Add params to dataclasses.make_dataclasses(): init, repr, eq,
order, hash, and frozen.  Pass them through to dataclass().

@item 
bpo-32278@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32278}: Make type information optional on dataclasses.make_dataclass().
If omitted, the string ‘typing.Any’ is used.

@item 
bpo-32499@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32499}: Add dataclasses.is_dataclass(obj), which returns True if obj is
a dataclass or an instance of one.

@item 
bpo-32468@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32468}: Improve frame repr() to mention filename, code name and current
line number.

@item 
bpo-23749@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23749}: asyncio: Implement loop.start_tls()

@item 
bpo-32441@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32441}: Return the new file descriptor (i.e., the second argument) from
@code{os.dup2}. Previously, @code{None} was always returned.

@item 
bpo-32422@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32422}: @code{functools.lru_cache} uses less memory (3 words for each
cached key) and takes about 1/3 time for cyclic GC.

@item 
bpo-31721@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31721}: Prevent Python crash from happening when Future._log_traceback
is set to True manually.  Now it can only be set to False, or a ValueError
is raised.

@item 
bpo-32415@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32415}: asyncio: Add Task.get_loop() and Future.get_loop()

@item 
bpo-26133@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26133}: Don’t unsubscribe signals in asyncio UNIX event loop on
interpreter shutdown.

@item 
bpo-32363@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32363}: Make asyncio.Task.set_exception() and set_result() raise
NotImplementedError. Task._step() and Future.__await__() raise proper
exceptions when they are in an invalid state, instead of raising an
AssertionError.

@item 
bpo-32357@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32357}: Optimize asyncio.iscoroutine() and loop.create_task() for
non-native coroutines (e.g. async/await compiled with Cython).
‘loop.create_task(python_coroutine)’ used to be 20% faster than
‘loop.create_task(cython_coroutine)’.  Now, the latter is as fast.

@item 
bpo-32356@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32356}: asyncio.transport.resume_reading() and pause_reading() are now
idempotent. New transport.is_reading() method is added.

@item 
bpo-32355@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32355}: Optimize asyncio.gather(); now up to 15% faster.

@item 
bpo-32351@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32351}: Use fastpath in asyncio.sleep if delay<0 (2x boost)

@item 
bpo-32348@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32348}: Optimize asyncio.Future schedule/add/remove callback.  The
optimization shows 3-6% performance improvements of async/await code.

@item 
bpo-32331@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32331}: Fix socket.settimeout() and socket.setblocking() to keep
socket.type as is. Fix socket.socket() constructor to reset any bit flags
applied to socket’s type.  This change only affects OSes that have
SOCK_NONBLOCK and/or SOCK_CLOEXEC.

@item 
bpo-32248@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32248}: Add @code{importlib.abc.ResourceReader} as an ABC for
loaders to provide a unified API for reading resources contained within
packages.  Also add @ref{7f,,importlib.resources} as the port of
@code{importlib_resources}.

@item 
bpo-32311@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32311}: Implement asyncio.create_task(coro) shortcut

@item 
bpo-32327@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32327}: Convert asyncio functions that were documented as coroutines to
coroutines. Affected functions: loop.sock_sendall, loop.sock_recv,
loop.sock_accept, loop.getaddrinfo, loop.getnameinfo.

@item 
bpo-32323@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32323}: @ref{f40,,urllib.parse.urlsplit()} does not convert zone-id (scope)
to lower case for scoped IPv6 addresses in hostnames now.

@item 
bpo-32302@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32302}: Fix bdist_wininst of distutils for CRT v142: it binary
compatible with CRT v140.

@item 
bpo-29711@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29711}: Fix @code{stop_serving} in asyncio proactor loop kill all
listening servers

@item 
bpo-32308@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32308}: @ref{5a3,,re.sub()} now replaces empty matches adjacent to a
previous non-empty match.

@item 
bpo-29970@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29970}: Abort asyncio SSLProtocol connection if handshake not complete
within 10 seconds.

@item 
bpo-32314@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32314}: Implement asyncio.run().

@item 
bpo-17852@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17852}: Revert incorrect fix based on misunderstanding of
_Py_PyAtExit() semantics.

@item 
bpo-32296@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32296}: Implement asyncio._get_running_loop() and get_event_loop() in
C. This makes them 4x faster.

@item 
bpo-32250@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32250}: Implement @code{asyncio.current_task()} and
@code{asyncio.all_tasks()}. Add helpers intended to be used by alternative
task implementations: @code{asyncio._register_task}, @code{asyncio._enter_task},
@code{asyncio._leave_task} and @code{asyncio._unregister_task}. Deprecate
@code{asyncio.Task.current_task()} and @code{asyncio.Task.all_tasks()}.

@item 
bpo-32255@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32255}: A single empty field is now always quoted when written into a
CSV file. This allows to distinguish an empty row from a row consisting of
a single empty field. Patch by Licht Takeuchi.

@item 
bpo-32277@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32277}: Raise @code{NotImplementedError} instead of @code{SystemError} on
platforms where @code{chmod(..., follow_symlinks=False)} is not supported.
Patch by Anthony Sottile.

@item 
bpo-30050@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30050}: New argument warn_on_full_buffer to signal.set_wakeup_fd lets
you control whether Python prints a warning on stderr when the wakeup fd
buffer overflows.

@item 
bpo-29137@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29137}: The @code{fpectl} library has been removed. It was never enabled
by default, never worked correctly on x86-64, and it changed the Python
ABI in ways that caused unexpected breakage of C extensions.

@item 
bpo-32273@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32273}: Move asyncio.test_utils to test.test_asyncio.

@item 
bpo-32272@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32272}: Remove asyncio.async() function.

@item 
bpo-32269@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32269}: Add asyncio.get_running_loop() function.

@item 
bpo-32265@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32265}: All class and static methods of builtin types now are correctly
classified by inspect.classify_class_attrs() and grouped in pydoc output.
Added types.ClassMethodDescriptorType for unbound class methods of builtin
types.

@item 
bpo-32253@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32253}: Deprecate @code{yield from lock}, @code{await lock}, @code{with (yield
from lock)} and @code{with await lock} for asyncio synchronization
primitives.

@item 
bpo-22589@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22589}: Changed MIME type of .bmp from ‘image/x-ms-bmp’ to ‘image/bmp’

@item 
bpo-32193@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32193}: Convert asyncio to use `async/await' syntax. Old styled @code{yield
from} is still supported too.

@item 
bpo-32206@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32206}: Add support to run modules with pdb

@item 
bpo-32227@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32227}: @code{functools.singledispatch} now supports registering
implementations using type annotations.

@item 
bpo-15873@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15873}: Added new alternate constructors
@ref{82b,,datetime.datetime.fromisoformat()},
@ref{82a,,datetime.time.fromisoformat()} and
@ref{829,,datetime.date.fromisoformat()} as the inverse operation of each
classes’s respective @code{isoformat} methods.

@item 
bpo-32199@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32199}: The getnode() ip getter now uses ‘ip link’ instead of ‘ip link
list’.

@item 
bpo-32143@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32143}: os.statvfs() includes the f_fsid field from statvfs(2)

@item 
bpo-26439@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26439}: Fix ctypes.util.find_library() for AIX by implementing
ctypes._aix.find_library() Patch by: Michael Felt

@item 
bpo-31993@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31993}: The pickler now uses less memory when serializing large bytes
and str objects into a file.  Pickles created with protocol 4 will require
less memory for unpickling large bytes and str objects.

@item 
bpo-27456@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27456}: Ensure TCP_NODELAY is set on Linux. Tests by Victor Stinner.

@item 
bpo-31778@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31778}: ast.literal_eval() is now more strict. Addition and subtraction
of arbitrary numbers no longer allowed.

@item 
bpo-31802@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31802}: Importing native path module (@code{posixpath}, @code{ntpath}) now
works even if the @code{os} module still is not imported.

@item 
bpo-30241@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30241}: Add contextlib.AbstractAsyncContextManager. Patch by Jelle
Zijlstra.

@item 
bpo-31699@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31699}: Fix deadlocks in
@ref{1d8,,concurrent.futures.ProcessPoolExecutor} when task arguments or
results cause pickling or unpickling errors. This should make sure that
calls to the @code{ProcessPoolExecutor} API always eventually return.

@item 
bpo-15216@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15216}: @code{TextIOWrapper.reconfigure()} supports changing `encoding',
`errors', and `newline'.
@end itemize

@node Documentation<66>,Tests<64>,Library<174>,Python 3 7 0 alpha 4
@anchor{whatsnew/changelog id845}@anchor{1ebc}
@subsubsection Documentation



@itemize -

@item 
bpo-32418@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32418}: Add get_loop() method to Server and AbstractServer classes.
@end itemize

@node Tests<64>,Windows<63>,Documentation<66>,Python 3 7 0 alpha 4
@anchor{whatsnew/changelog id846}@anchor{1ebd}
@subsubsection Tests



@itemize -

@item 
bpo-32252@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32252}: Fix faulthandler_suppress_crash_report() used to prevent core
dump files when testing crashes. getrlimit() returns zero on success.

@item 
bpo-32002@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32002}: Adjust C locale coercion testing for the empty locale and POSIX
locale cases to more readily adjust to platform dependent behaviour.
@end itemize

@node Windows<63>,Tools/Demos<41>,Tests<64>,Python 3 7 0 alpha 4
@anchor{whatsnew/changelog id847}@anchor{1ebe}
@subsubsection Windows



@itemize -

@item 
bpo-19764@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19764}: Implement support for @code{subprocess.Popen(close_fds=True)} on
Windows. Patch by Segev Finer.
@end itemize

@node Tools/Demos<41>,C API<63>,Windows<63>,Python 3 7 0 alpha 4
@anchor{whatsnew/changelog id848}@anchor{1ebf}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-24960@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24960}: 2to3 and lib2to3 can now read pickled grammar files using
pkgutil.get_data() rather than probing the filesystem. This lets 2to3 and
lib2to3 work when run from a zipfile.
@end itemize

@node C API<63>,,Tools/Demos<41>,Python 3 7 0 alpha 4
@anchor{whatsnew/changelog id849}@anchor{1ec0}
@subsubsection C API



@itemize -

@item 
bpo-32030@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32030}: Py_Initialize() doesn’t reset the memory allocators to default
if the @code{PYTHONMALLOC} environment variable is not set.

@item 
bpo-29084@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29084}: Undocumented C API for OrderedDict has been excluded from the
limited C API. It was added by mistake and actually never worked in the
limited C API.

@item 
bpo-32264@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32264}: Moved the pygetopt.h header into internal/, since it has no
public APIs.

@item 
bpo-32241@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32241}: @code{Py_SetProgramName()} and @code{Py_SetPythonHome()}
now take the @code{const wchar *} arguments instead of @code{wchar *}.
@end itemize

@node Python 3 7 0 alpha 3,Python 3 7 0 alpha 2,Python 3 7 0 alpha 4,Changelog
@anchor{whatsnew/changelog python-3-7-0-alpha-3}@anchor{1ec1}
@subsection Python 3.7.0 alpha 3


`Release date: 2017-12-05'

@menu
* Core and Builtins: Core and Builtins<171>. 
* Library: Library<175>. 
* Documentation: Documentation<67>. 
* Tests: Tests<65>. 
* Build: Build<72>. 
* Windows: Windows<64>. 
* macOS: macOS<51>. 
* IDLE: IDLE<44>. 
* Tools/Demos: Tools/Demos<42>. 
* C API: C API<64>. 

@end menu

@node Core and Builtins<171>,Library<175>,,Python 3 7 0 alpha 3
@anchor{whatsnew/changelog id850}@anchor{1ec2}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-32176@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32176}: co_flags.CO_NOFREE is now always set correctly by the code
object constructor based on freevars and cellvars, rather than needing to
be set correctly by the caller. This ensures it will be cleared
automatically when additional cell references are injected into a modified
code object and function.

@item 
bpo-10544@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10544}: Yield expressions are now deprecated in comprehensions and
generator expressions. They are still permitted in the definition of the
outermost iterable, as that is evaluated directly in the enclosing scope.

@item 
bpo-32137@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32137}: The repr of deeply nested dict now raises a RecursionError
instead of crashing due to a stack overflow.

@item 
bpo-32096@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32096}: Revert memory allocator changes in the C API: move structures
back from _PyRuntime to Objects/obmalloc.c. The memory allocators are once
again initialized statically, and so PyMem_RawMalloc() and
Py_DecodeLocale() can be called before _PyRuntime_Initialize().

@item 
bpo-32043@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32043}: Add a new “developer mode”: new “-X dev” command line option to
enable debug checks at runtime.

@item 
bpo-32023@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32023}: SyntaxError is now correctly raised when a generator expression
without parenthesis is used instead of an inheritance list in a class
definition. The duplication of the parentheses can be omitted only on
calls.

@item 
bpo-32012@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32012}: SyntaxError is now correctly raised when a generator expression
without parenthesis is passed as an argument, but followed by a trailing
comma. A generator expression always needs to be directly inside a set of
parentheses and cannot have a comma on either side.

@item 
bpo-28180@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28180}: A new internal @code{_Py_SetLocaleFromEnv(category)} helper
function has been added in order to improve the consistency of behaviour
across different @code{libc} implementations (e.g. Android doesn’t support
setting the locale from the environment by default).

@item 
bpo-31949@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31949}: Fixed several issues in printing tracebacks
(PyTraceBack_Print()). Setting sys.tracebacklimit to 0 or less now
suppresses printing tracebacks. Setting sys.tracebacklimit to None now
causes using the default limit. Setting sys.tracebacklimit to an integer
larger than LONG_MAX now means using the limit LONG_MAX rather than the
default limit. Fixed integer overflows in the case of more than @code{2**31}
traceback items on Windows. Fixed output errors handling.

@item 
bpo-30696@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30696}: Fix the interactive interpreter looping endlessly when no
memory.

@item 
bpo-20047@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20047}: Bytearray methods partition() and rpartition() now accept only
bytes-like objects as separator, as documented.  In particular they now
raise TypeError rather of returning a bogus result when an integer is
passed as a separator.

@item 
bpo-21720@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21720}: BytesWarning no longer emitted when the `fromlist' argument of
@code{__import__()} or the @code{__all__} attribute of the module contain bytes
instances.

@item 
bpo-31845@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31845}: Environment variables are once more read correctly at
interpreter startup.

@item 
bpo-28936@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28936}: Ensure that lexically first syntax error involving a parameter
and @code{global} or @code{nonlocal} is detected first at a given scope. Patch
by Ivan Levkivskyi.

@item 
bpo-31825@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31825}: Fixed OverflowError in the ‘unicode-escape’ codec and in
codecs.escape_decode() when decode an escaped non-ascii byte.

@item 
bpo-31618@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31618}: The per-frame tracing logic added in 3.7a1 has been altered so
that @code{frame->f_lineno} is updated before either @code{"line"} or
@code{"opcode"} events are emitted. Previously, opcode events were emitted
first, and therefore would occasionally see stale line numbers on the
frame. The behavior of this feature has changed slightly as a result: when
both @code{f_trace_lines} and @code{f_trace_opcodes} are enabled, line events
now occur first.

@item 
bpo-28603@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28603}: Print the full context/cause chain of exceptions on interpreter
exit, even if an exception in the chain is unhashable or compares equal to
later ones. Patch by Zane Bitter.

@item 
bpo-31786@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31786}: Fix timeout rounding in the select module to round correctly
negative timeouts between -1.0 and 0.0. The functions now block waiting
for events as expected. Previously, the call was incorrectly non-blocking.
Patch by Pablo Galindo.

@item 
bpo-31781@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31781}: Prevent crashes when calling methods of an uninitialized
@code{zipimport.zipimporter} object. Patch by Oren Milman.

@item 
bpo-30399@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30399}: Standard repr() of BaseException with a single argument no
longer contains redundant trailing comma.

@item 
bpo-31626@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31626}: Fixed a bug in debug memory allocator.  There was a write to
freed memory after shrinking a memory block.

@item 
bpo-30817@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30817}: @code{PyErr_PrintEx()} clears now the ignored exception that may
be raised by @code{_PySys_SetObjectId()}, for example when no memory.
@end itemize

@node Library<175>,Documentation<67>,Core and Builtins<171>,Python 3 7 0 alpha 3
@anchor{whatsnew/changelog id851}@anchor{1ec3}
@subsubsection Library



@itemize -

@item 
bpo-28556@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28556}: Two minor fixes for @code{typing} module: allow shallow copying
instances of generic classes, improve interaction of @code{__init_subclass__}
with generics. Original PRs by Ivan Levkivskyi.

@item 
bpo-32214@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32214}: PEP 557, Data Classes. Provides a decorator which adds
boilerplate methods to classes which use type annotations so specify
fields.

@item 
bpo-27240@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27240}: The header folding algorithm for the new email policies has
been rewritten, which also fixes bpo-30788@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30788}, bpo-31831@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31831}, and bpo-32182@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32182}.  In
particular, RFC2231 folding is now done correctly.

@item 
bpo-32186@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32186}: io.FileIO.readall() and io.FileIO.read() now release the GIL
when getting the file size. Fixed hang of all threads with inaccessible
NFS server. Patch by Nir Soffer.

@item 
bpo-32101@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32101}: Add @ref{1ec4,,sys.flags.dev_mode} flag

@item 
bpo-32154@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32154}: The @code{asyncio.windows_utils.socketpair()} function has been
removed: use directly @ref{df6,,socket.socketpair()} which is available on all
platforms since Python 3.5 (before, it wasn’t available on Windows).
@code{asyncio.windows_utils.socketpair()} was just an alias to
@code{socket.socketpair} on Python 3.5 and newer.

@item 
bpo-32089@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32089}: warnings: In development (-X dev) and debug mode (pydebug
build), use the “default” action for ResourceWarning, rather than the
“always” action, in the default warnings filters.

@item 
bpo-32107@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32107}: @code{uuid.getnode()} now preferentially returns universally
administered MAC addresses if available, over locally administered MAC
addresses.  This makes a better guarantee for global uniqueness of UUIDs
returned from @code{uuid.uuid1()}.  If only locally administered MAC
addresses are available, the first such one found is returned.

@item 
bpo-23033@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23033}: Wildcard is now supported in hostname when it is one and only
character in the left most segment of hostname in second argument of
@code{ssl.match_hostname()}.  Patch by Mandeep Singh.

@item 
bpo-12239@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12239}: Make @code{msilib.SummaryInformation.GetProperty()} return
@code{None} when the value of property is @code{VT_EMPTY}.  Initial patch by
Mark Mc Mahon.

@item 
bpo-28334@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28334}: Use @ref{c0f,,os.path.expanduser()} to find the @code{~/.netrc} file in
@ref{1cbc,,netrc.netrc}.  If it does not exist, @ref{266,,FileNotFoundError} is
raised.  Patch by Dimitri Merejkowsky.

@item 
bpo-32121@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32121}: Made @code{tracemalloc.Traceback} behave more like the traceback
module, sorting the frames from oldest to most recent.
@code{Traceback.format()} now accepts negative `limit', truncating the result
to the @code{abs(limit)} oldest frames. To get the old behaviour, one can use
the new `most_recent_first' argument to @code{Traceback.format()}. (Patch by
Jesse Bakker.)

@item 
bpo-31325@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31325}: Fix wrong usage of @ref{4e1,,collections.namedtuple()} in the
@ref{1ec5,,RobotFileParser.parse()}
method. Initial patch by Robin Wellner.

@item 
bpo-12382@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12382}: @code{msilib.OpenDatabase()} now raises a better exception
message when it couldn’t open or create an MSI file.  Initial patch by
William Tisäter.

@item 
bpo-19610@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19610}: @code{setup()} now warns about invalid types for some fields. The
@code{distutils.dist.Distribution} class now warns when @code{classifiers},
@code{keywords} and @code{platforms} fields are not specified as a list or a
string.

@item 
bpo-32071@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32071}: Added the @code{-k} command-line option to @code{python -m unittest}
to run only tests that match the given pattern(s).

@item 
bpo-10049@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10049}: Added `nullcontext' no-op context manager to contextlib. This
provides a simpler and faster alternative to ExitStack() when handling
optional context managers.

@item 
bpo-28684@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28684}: The new test.support.skip_unless_bind_unix_socket() decorator
is used here to skip asyncio tests that fail because the platform lacks a
functional bind() function for unix domain sockets (as it is the case for
non root users on the recent Android versions that run now SELinux in
enforcing mode).

@item 
bpo-32110@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32110}: @code{codecs.StreamReader.read(n)} now returns not more than `n'
characters/bytes for non-negative `n'. This makes it compatible with
@code{read()} methods of other file-like objects.

@item 
bpo-27535@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27535}: The warnings module doesn’t leak memory anymore in the hidden
warnings registry for the “ignore” action of warnings filters.
warn_explicit() function doesn’t add the warning key to the registry
anymore for the “ignore” action.

@item 
bpo-32088@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32088}: warnings:  When Python is build is debug mode (@code{Py_DEBUG}),
@ref{1a4,,DeprecationWarning}, @ref{acc,,PendingDeprecationWarning} and
@ref{71f,,ImportWarning} warnings are now displayed by default.

@item 
bpo-1647489@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1647489}: Fixed searching regular expression patterns that could match
an empty string. Non-empty string can now be correctly found after
matching an empty string.

@item 
bpo-25054@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25054}: Added support of splitting on a pattern that could match an
empty string.

@item 
bpo-32072@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32072}: Fixed issues with binary plists: Fixed saving bytearrays.
Identical objects will be saved only once. Equal references will be load
as identical objects. Added support for saving and loading recursive data
structures.

@item 
bpo-32069@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32069}: Drop legacy SSL transport from asyncio, ssl.MemoryBIO is always
used anyway.

@item 
bpo-32066@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32066}: asyncio: Support pathlib.Path in create_unix_connection; sock
arg should be optional

@item 
bpo-32046@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32046}: Updates 2to3 to convert from operator.isCallable(obj) to
callable(obj). Patch by Donghee Na.

@item 
bpo-32018@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32018}: inspect.signature should follow 
@geindex Python Enhancement Proposals; PEP 8
PEP 8@footnote{https://peps.python.org/pep-0008/}, if the parameter has
an annotation and a default value. Patch by Donghee Na.

@item 
bpo-32025@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32025}: Add time.thread_time() and time.thread_time_ns()

@item 
bpo-32037@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32037}: Integers that fit in a signed 32-bit integer will be now
pickled with protocol 0 using the INT opcode.  This will decrease the size
of a pickle, speed up pickling and unpickling, and make these integers be
unpickled as int instances in Python 2.

@item 
bpo-32034@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32034}: Make asyncio.IncompleteReadError and LimitOverrunError
pickleable.

@item 
bpo-32015@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32015}: Fixed the looping of asyncio in the case of reconnection the
socket during waiting async read/write from/to the socket.

@item 
bpo-32011@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32011}: Restored support of loading marshal files with the TYPE_INT64
code. These files can be produced in Python 2.7.

@item 
bpo-28369@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28369}: Enhance add_reader/writer check that socket is not used by some
transport. Before, only cases when add_reader/writer were called with an
int FD were supported.  Now the check is implemented correctly for all
file-like objects.

@item 
bpo-31976@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31976}: Fix race condition when flushing a file is slow, which can
cause a segfault if closing the file from another thread.

@item 
bpo-31985@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31985}: Formally deprecated aifc.openfp, sunau.openfp, and wave.openfp.
Since change 7bc817d5ba917528e8bd07ec461c635291e7b06a in 1993, openfp in
each of the three modules had been pointing to that module’s open function
as a matter of backwards compatibility, though it had been both untested
and undocumented.

@item 
bpo-21862@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21862}: cProfile command line now accepts @code{-m module_name} as an
alternative to script path. Patch by Sanyam Khurana.

@item 
bpo-31970@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31970}: Reduce performance overhead of asyncio debug mode.

@item 
bpo-31843@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31843}: `database' argument of sqlite3.connect() now accepts a
@ref{5a1,,path-like object}, instead of just a string.

@item 
bpo-31945@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31945}: Add Configurable `blocksize' to @code{HTTPConnection} and
@code{HTTPSConnection} for improved upload throughput.  Patch by Nir Soffer.

@item 
bpo-31943@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31943}: Add a @code{cancelled()} method to @ref{1ec6,,asyncio.Handle}.  Patch
by Marat Sharafutdinov.

@item 
bpo-9678@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9678}: Fixed determining the MAC address in the uuid module: Using
ifconfig on NetBSD and OpenBSD. Using arp on Linux, FreeBSD, NetBSD and
OpenBSD. Based on patch by Takayuki Shimizukawa.

@item 
bpo-30057@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30057}: Fix potential missed signal in signal.signal().

@item 
bpo-31933@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31933}: Fix Blake2 params leaf_size and node_offset on big endian
platforms. Patch by Jack O’Connor.

@item 
bpo-21423@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21423}: Add an initializer argument to @{Process,Thread@}PoolExecutor

@item 
bpo-31927@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31927}: Fixed compilation of the socket module on NetBSD 8.  Fixed
assertion failure or reading arbitrary data when parse a AF_BLUETOOTH
address on NetBSD and DragonFly BSD.

@item 
bpo-27666@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27666}: Fixed stack corruption in curses.box() and curses.ungetmouse()
when the size of types chtype or mmask_t is less than the size of C long.
curses.box() now accepts characters as arguments.  Based on patch by Steve
Fink.

@item 
bpo-31917@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31917}: Add 3 new clock identifiers: @ref{d8d,,time.CLOCK_BOOTTIME},
@ref{d8e,,time.CLOCK_PROF} and @ref{d8f,,time.CLOCK_UPTIME}.

@item 
bpo-31897@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31897}: plistlib now catches more errors when read binary plists and
raises InvalidFileException instead of unexpected exceptions.

@item 
bpo-25720@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25720}: Fix the method for checking pad state of curses WINDOW. Patch
by Masayuki Yamamoto.

@item 
bpo-31893@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31893}: Fixed the layout of the kqueue_event structure on OpenBSD and
NetBSD. Fixed the comparison of the kqueue_event objects.

@item 
bpo-31891@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31891}: Fixed building the curses module on NetBSD.

@item 
bpo-31884@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31884}: added required constants to subprocess module for setting
priority on windows

@item 
bpo-28281@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28281}: Remove year (1-9999) limits on the Calendar.weekday() function.
Patch by Mark Gollahon.

@item 
bpo-31702@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31702}: crypt.mksalt() now allows to specify the number of rounds for
SHA-256 and SHA-512 hashing.

@item 
bpo-30639@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30639}: @ref{1ec7,,inspect.getfile()} no longer computes the repr of unknown
objects to display in an error message, to protect against badly behaved
custom reprs.

@item 
bpo-30768@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30768}: Fix the pthread+semaphore implementation of
PyThread_acquire_lock_timed() when called with timeout > 0 and
intr_flag=0: recompute the timeout if sem_timedwait() is interrupted by a
signal (EINTR). See also the 
@geindex Python Enhancement Proposals; PEP 475
PEP 475@footnote{https://peps.python.org/pep-0475/}.

@item 
bpo-31854@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31854}: Add @code{mmap.ACCESS_DEFAULT} constant.

@item 
bpo-31834@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31834}: Use optimized code for BLAKE2 only with SSSE3+. The pure SSE2
implementation is slower than the pure C reference implementation.

@item 
bpo-28292@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28292}: Calendar.itermonthdates() will now consistently raise an
exception when a date falls outside of the 0001-01-01 through 9999-12-31
range.  To support applications that cannot tolerate such exceptions, the
new methods itermonthdays3() and itermonthdays4() are added.  The new
methods return tuples and are not restricted by the range supported by
datetime.date.

@item 
bpo-28564@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28564}: The shutil.rmtree() function has been sped up to 20–40%. This
was done using the os.scandir() function.

@item 
bpo-28416@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28416}: Instances of pickle.Pickler subclass with the persistent_id()
method and pickle.Unpickler subclass with the persistent_load() method no
longer create reference cycles.

@item 
bpo-31653@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31653}: Don’t release the GIL if we can acquire a multiprocessing
semaphore immediately.

@item 
bpo-28326@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28326}: Fix multiprocessing.Process when stdout and/or stderr is closed
or None.

@item 
bpo-20825@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20825}: Add @code{subnet_of} and @code{superset_of} containment tests to
@ref{510,,ipaddress.IPv6Network} and @ref{50f,,ipaddress.IPv4Network}. Patch
by Michel Albert and Cheryl Sabella.

@item 
bpo-31827@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31827}: Remove the os.stat_float_times() function. It was introduced in
Python 2.3 for backward compatibility with Python 2.2, and was deprecated
since Python 3.1.

@item 
bpo-31756@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31756}: Add a @code{subprocess.Popen(text=False)} keyword argument to
@code{subprocess} functions to be more explicit about when the library should
attempt to decode outputs into text. Patch by Andrew Clegg.

@item 
bpo-31819@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31819}: Add AbstractEventLoop.sock_recv_into().

@item 
bpo-31457@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31457}: If nested log adapters are used, the inner @code{process()}
methods are no longer omitted.

@item 
bpo-31457@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31457}: The @code{manager} property on LoggerAdapter objects is now
properly settable.

@item 
bpo-31806@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31806}: Fix timeout rounding in time.sleep(), threading.Lock.acquire()
and socket.socket.settimeout() to round correctly negative timeouts
between -1.0 and 0.0. The functions now block waiting for events as
expected. Previously, the call was incorrectly non-blocking. Patch by
Pablo Galindo.

@item 
bpo-31803@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31803}: time.clock() and time.get_clock_info(‘clock’) now emit a
DeprecationWarning warning.

@item 
bpo-31800@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31800}: Extended support for parsing UTC offsets. strptime ‘%z’ can now
parse the output generated by datetime.isoformat, including seconds and
microseconds.

@item 
bpo-28603@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28603}: traceback: Fix a TypeError that occurred during printing of
exception tracebacks when either the current exception or an exception in
its context/cause chain is unhashable. Patch by Zane Bitter.

@item 
bpo-30541@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30541}: Add new function to seal a mock and prevent the automatically
creation of child mocks. Patch by Mario Corchero.

@item 
bpo-31784@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31784}: Implement the 
@geindex Python Enhancement Proposals; PEP 564
PEP 564@footnote{https://peps.python.org/pep-0564/}, add new 6 new functions with
nanosecond resolution to the @ref{f4,,time} module:
@ref{ce1,,clock_gettime_ns()}, @ref{ce2,,clock_settime_ns()},
@ref{ce3,,monotonic_ns()}, @ref{ce4,,perf_counter_ns()},
@ref{ce5,,process_time_ns()}, @ref{ce6,,time_ns()}.

@item 
bpo-30143@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30143}: 2to3 now generates a code that uses abstract collection classes
from collections.abc rather than collections.

@item 
bpo-31770@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31770}: Prevent a crash when calling the @code{__init__()} method of a
@code{sqlite3.Cursor} object more than once. Patch by Oren Milman.

@item 
bpo-31764@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31764}: Prevent a crash in @code{sqlite3.Cursor.close()} in case the
@code{Cursor} object is uninitialized. Patch by Oren Milman.

@item 
bpo-31752@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31752}: Fix possible crash in timedelta constructor called with custom
integers.

@item 
bpo-31620@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31620}: an empty asyncio.Queue now doesn’t leak memory when queue.get
pollers timeout

@item 
bpo-31690@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31690}: Allow the flags re.ASCII, re.LOCALE, and re.UNICODE to be used
as group flags for regular expressions.

@item 
bpo-30349@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30349}: FutureWarning is now emitted if a regular expression contains
character set constructs that will change semantically in the future
(nested sets and set operations).

@item 
bpo-31664@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31664}: Added support for the Blowfish hashing in the crypt module.

@item 
bpo-31632@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31632}: Fix method set_protocol() of class _SSLProtocolTransport in
asyncio module. This method was previously modifying a wrong reference to
the protocol.

@item 
bpo-15037@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15037}: Added a workaround for getkey() in curses for ncurses 5.7 and
earlier.

@item 
bpo-31307@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31307}: Allow use of bytes objects for arguments to
@ref{1674,,configparser.ConfigParser.read()}. Patch by Vincent Michel.

@item 
bpo-31334@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31334}: Fix @code{poll.poll([timeout])} in the @code{select} module for
arbitrary negative timeouts on all OSes where it can only be a
non-negative integer or -1. Patch by Riccardo Coccioli.

@item 
bpo-31310@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31310}: multiprocessing’s semaphore tracker should be launched again if
crashed.

@item 
bpo-31308@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31308}: Make multiprocessing’s forkserver process immune to Ctrl-C and
other user interruptions. If it crashes, restart it when necessary.

@item 
bpo-31245@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31245}: Added support for AF_UNIX socket in asyncio
@code{create_datagram_endpoint}.

@item 
bpo-30553@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30553}: Add HTTP/2 status code 421 (Misdirected Request) to
@ref{b02,,http.HTTPStatus}. Patch by Vitor Pereira.
@end itemize

@node Documentation<67>,Tests<65>,Library<175>,Python 3 7 0 alpha 3
@anchor{whatsnew/changelog id852}@anchor{1ec8}
@subsubsection Documentation



@itemize -

@item 
bpo-32105@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32105}: Added asyncio.BaseEventLoop.connect_accepted_socket
versionadded marker.
@end itemize

@node Tests<65>,Build<72>,Documentation<67>,Python 3 7 0 alpha 3
@anchor{whatsnew/changelog id853}@anchor{1ec9}
@subsubsection Tests



@itemize -

@item 
bpo-31380@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31380}: Skip test_httpservers test_undecodable_file on macOS: fails on
APFS.

@item 
bpo-31705@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31705}: Skip test_socket.test_sha256() on Linux kernel older than 4.5.
The test fails with ENOKEY on kernel 3.10 (on ppc64le). A fix was merged
into the kernel 4.5.

@item 
bpo-32138@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32138}: Skip on Android test_faulthandler tests that raise SIGSEGV and
remove the test.support.requires_android_level decorator.

@item 
bpo-32136@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32136}: The runtime embedding tests have been split out from
@code{Lib/test/test_capi.py} into a new @code{Lib/test/test_embed.py} file.

@item 
bpo-28668@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28668}: test.support.requires_multiprocessing_queue is removed. Skip
tests with test.support.import_module(‘multiprocessing.synchronize’)
instead when the semaphore implementation is broken or missing.

@item 
bpo-32126@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32126}: Skip test_get_event_loop_new_process in
test.test_asyncio.test_events when sem_open() is not functional.

@item 
bpo-31174@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31174}: Fix test_tools.test_unparse: DirectoryTestCase now stores the
names sample to always test the same files. It prevents false alarms when
hunting reference leaks.
@end itemize

@node Build<72>,Windows<64>,Tests<65>,Python 3 7 0 alpha 3
@anchor{whatsnew/changelog id854}@anchor{1eca}
@subsubsection Build



@itemize -

@item 
bpo-28538@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28538}: Revert the previous changes, the if_nameindex structure is
defined by Unified Headers.

@item 
bpo-28762@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28762}: Revert the last commit, the F_LOCK macro is defined by Android
Unified Headers.

@item 
bpo-29040@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29040}: Support building Android with Unified Headers. The first NDK
release to support Unified Headers is android-ndk-r14.

@item 
bpo-32059@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32059}: @code{detect_modules()} in @code{setup.py} now also searches the
sysroot paths when cross-compiling.

@item 
bpo-31957@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31957}: Fixes Windows SDK version detection when building for Windows.

@item 
bpo-31609@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31609}: Fixes quotes in PCbuild/clean.bat

@item 
bpo-31934@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31934}: Abort the build when building out of a not clean source tree.

@item 
bpo-31926@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31926}: Fixed Argument Clinic sometimes causing compilation errors when
there was more than one function and/or method in a .c file with the same
name.

@item 
bpo-28791@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28791}: Update Windows builds to use SQLite 3.21.0.

@item 
bpo-28791@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28791}: Update OS X installer to use SQLite 3.21.0.

@item 
bpo-28643@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28643}: Record profile-opt build progress with stamp files.

@item 
bpo-31866@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31866}: Finish removing support for AtheOS.
@end itemize

@node Windows<64>,macOS<51>,Build<72>,Python 3 7 0 alpha 3
@anchor{whatsnew/changelog id855}@anchor{1ecb}
@subsubsection Windows



@itemize -

@item 
bpo-1102@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1102}: Return @code{None} when @code{View.Fetch()} returns
@code{ERROR_NO_MORE_ITEMS} instead of raising @code{MSIError}. Initial patch by
Anthony Tuininga.

@item 
bpo-31944@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31944}: Fixes Modify button in Apps and Features dialog.

@item 
bpo-20486@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20486}: Implement the @code{Database.Close()} method to help closing MSI
database objects.

@item 
bpo-31857@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31857}: Make the behavior of USE_STACKCHECK deterministic in a
multi-threaded environment.
@end itemize

@node macOS<51>,IDLE<44>,Windows<64>,Python 3 7 0 alpha 3
@anchor{whatsnew/changelog id856}@anchor{1ecc}
@subsubsection macOS



@itemize -

@item 
bpo-31392@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31392}: Update macOS installer to use OpenSSL 1.0.2m
@end itemize

@node IDLE<44>,Tools/Demos<42>,macOS<51>,Python 3 7 0 alpha 3
@anchor{whatsnew/changelog id857}@anchor{1ecd}
@subsubsection IDLE



@itemize -

@item 
bpo-32207@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32207}: Improve tk event exception tracebacks in IDLE. When tk event
handling is driven by IDLE’s run loop, a confusing and distracting
queue.EMPTY traceback context is no longer added to tk event exception
tracebacks.  The traceback is now the same as when event handling is
driven by user code.  Patch based on a suggestion by Serhiy Storchaka.

@item 
bpo-32164@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32164}: Delete unused file idlelib/tabbedpages.py. Use of TabbedPageSet
in configdialog was replaced by ttk.Notebook.

@item 
bpo-32100@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32100}: IDLE: Fix old and new bugs in pathbrowser; improve tests. Patch
mostly by Cheryl Sabella.

@item 
bpo-31858@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31858}: IDLE – Restrict shell prompt manipulation to the shell. Editor
and output windows only see an empty last prompt line.  This simplifies
the code and fixes a minor bug when newline is inserted. Sys.ps1, if
present, is read on Shell start-up, but is not set or changed.

@item 
bpo-31860@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31860}: The font sample in the IDLE configuration dialog is now
editable. Changes persist while IDLE remains open

@item 
bpo-31836@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31836}: Test_code_module now passes if run after test_idle, which sets
ps1. The code module uses sys.ps1 if present or sets it to ‘>>> ‘ if not.
Test_code_module now properly tests both behaviors.  Ditto for ps2.

@item 
bpo-28603@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28603}: Fix a TypeError that caused a shell restart when printing a
traceback that includes an exception that is unhashable. Patch by Zane
Bitter.

@item 
bpo-13802@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13802}: Use non-Latin characters in the IDLE’s Font settings sample.
Even if one selects a font that defines a limited subset of the unicode
Basic Multilingual Plane, tcl/tk will use other fonts that define a
character. The expanded example give users of non-Latin characters a
better idea of what they might see in IDLE’s shell and editors. To make
room for the expanded sample, frames on the Font tab are re-arranged.  The
Font/Tabs help explains a bit about the additions.
@end itemize

@node Tools/Demos<42>,C API<64>,IDLE<44>,Python 3 7 0 alpha 3
@anchor{whatsnew/changelog id858}@anchor{1ece}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-32159@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32159}: Remove CVS and Subversion tools: remove svneol.py and
treesync.py scripts. CPython migrated from CVS to Subversion, to
Mercurial, and then to Git. CVS and Subversion are no longer used to
develop CPython.

@item 
bpo-30722@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30722}: Make redemo work with Python 3.6 and newer versions. Also,
remove the @code{LOCALE} option since it doesn’t work with string patterns in
Python 3. Patch by Christoph Sarnowski.
@end itemize

@node C API<64>,,Tools/Demos<42>,Python 3 7 0 alpha 3
@anchor{whatsnew/changelog id859}@anchor{1ecf}
@subsubsection C API



@itemize -

@item 
bpo-20891@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20891}: Fix PyGILState_Ensure(). When PyGILState_Ensure() is called in
a non-Python thread before PyEval_InitThreads(), only call
PyEval_InitThreads() after calling PyThreadState_New() to fix a crash.

@item 
bpo-32125@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32125}: The @code{Py_UseClassExceptionsFlag} flag has been removed. It was
deprecated and wasn’t used anymore since Python 2.0.

@item 
bpo-25612@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25612}: Move the current exception state from the frame object to the
co-routine. This simplifies the interpreter and fixes a couple of obscure
bugs caused by having swap exception state when entering or exiting a
generator.

@item 
bpo-23699@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23699}: Add Py_RETURN_RICHCOMPARE macro to reduce boilerplate code in
rich comparison functions.

@item 
bpo-30697@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30697}: The @code{PyExc_RecursionErrorInst} singleton is removed and
@code{PyErr_NormalizeException()} does not use it anymore. This singleton is
persistent and its members being never cleared may cause a segfault during
finalization of the interpreter. See also bpo-22898@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22898}.
@end itemize

@node Python 3 7 0 alpha 2,Python 3 7 0 alpha 1,Python 3 7 0 alpha 3,Changelog
@anchor{whatsnew/changelog python-3-7-0-alpha-2}@anchor{1ed0}
@subsection Python 3.7.0 alpha 2


`Release date: 2017-10-16'

@menu
* Core and Builtins: Core and Builtins<172>. 
* Library: Library<176>. 
* Documentation: Documentation<68>. 
* Build: Build<73>. 
* IDLE: IDLE<45>. 
* C API: C API<65>. 

@end menu

@node Core and Builtins<172>,Library<176>,,Python 3 7 0 alpha 2
@anchor{whatsnew/changelog id860}@anchor{1ed1}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-31558@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31558}: @code{gc.freeze()} is a new API that allows for moving all objects
currently tracked by the garbage collector to a permanent generation,
effectively removing them from future collection events. This can be used
to protect those objects from having their PyGC_Head mutated. In effect,
this enables great copy-on-write stability at fork().

@item 
bpo-31642@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31642}: Restored blocking “from package import module” by setting
sys.modules[“package.module”] to None.

@item 
bpo-31708@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31708}: Allow use of asynchronous generator expressions in synchronous
functions.

@item 
bpo-31709@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31709}: Drop support of asynchronous __aiter__.

@item 
bpo-30404@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30404}: The -u option now makes the stdout and stderr streams
unbuffered rather than line-buffered.

@item 
bpo-31619@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31619}: Fixed a ValueError when convert a string with large number of
underscores to integer with binary base.

@item 
bpo-31602@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31602}: Fix an assertion failure in @code{zipimporter.get_source()} in
case of a bad @code{zlib.decompress()}. Patch by Oren Milman.

@item 
bpo-31592@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31592}: Fixed an assertion failure in Python parser in case of a bad
@code{unicodedata.normalize()}. Patch by Oren Milman.

@item 
bpo-31588@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31588}: Raise a @code{TypeError} with a helpful error message when class
creation fails due to a metaclass with a bad @code{__prepare__()} method.
Patch by Oren Milman.

@item 
bpo-31574@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31574}: Importlib was instrumented with two dtrace probes to profile
import timing.

@item 
bpo-31566@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31566}: Fix an assertion failure in @code{_warnings.warn()} in case of a
bad @code{__name__} global. Patch by Oren Milman.

@item 
bpo-31506@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31506}: Improved the error message logic for @code{object.__new__} and
@code{object.__init__}.

@item 
bpo-31505@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31505}: Fix an assertion failure in @code{json}, in case
@code{_json.make_encoder()} received a bad @code{encoder()} argument. Patch by
Oren Milman.

@item 
bpo-31492@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31492}: Fix assertion failures in case of failing to import from a
module with a bad @code{__name__} attribute, and in case of failing to access
an attribute of such a module. Patch by Oren Milman.

@item 
bpo-31478@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31478}: Fix an assertion failure in @code{_random.Random.seed()} in case
the argument has a bad @code{__abs__()} method. Patch by Oren Milman.

@item 
bpo-31336@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31336}: Speed up class creation by 10-20% by reducing the overhead in
the necessary special method lookups.  Patch by Stefan Behnel.

@item 
bpo-31415@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31415}: Add @code{-X importtime} option to show how long each import
takes. It can be used to optimize application’s startup time.  Support the
@geindex PYTHONPROFILEIMPORTTIME
@geindex environment variable; PYTHONPROFILEIMPORTTIME
@ref{cf3,,PYTHONPROFILEIMPORTTIME} as an equivalent way to enable this.

@item 
bpo-31410@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31410}: Optimized calling wrapper and classmethod descriptors.

@item 
bpo-31353@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31353}: 
@geindex Python Enhancement Proposals; PEP 553
PEP 553@footnote{https://peps.python.org/pep-0553/} - Add a new built-in called @code{breakpoint()} which
calls @code{sys.breakpointhook()}.  By default this imports @code{pdb} and calls
@code{pdb.set_trace()}, but users may override @code{sys.breakpointhook()} to
call whatever debugger they want.  The original value of the hook is saved
in @code{sys.__breakpointhook__}.

@item 
bpo-17852@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17852}: Maintain a list of open buffered files, flush them before
exiting the interpreter.  Based on a patch from Armin Rigo.

@item 
bpo-31315@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31315}: Fix an assertion failure in imp.create_dynamic(), when
spec.name is not a string. Patch by Oren Milman.

@item 
bpo-31311@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31311}: Fix a crash in the @code{__setstate__()} method of
@code{ctypes._CData}, in case of a bad @code{__dict__}. Patch by Oren Milman.

@item 
bpo-31293@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31293}: Fix crashes in true division and multiplication of a timedelta
object by a float with a bad as_integer_ratio() method. Patch by Oren
Milman.

@item 
bpo-31285@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31285}: Fix an assertion failure in @code{warnings.warn_explicit}, when
the return value of the received loader’s @code{get_source()} has a bad
@code{splitlines()} method. Patch by Oren Milman.

@item 
bpo-30406@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30406}: Make @code{async} and @code{await} proper keywords, as specified in
@geindex Python Enhancement Proposals; PEP 492
PEP 492@footnote{https://peps.python.org/pep-0492/}.
@end itemize

@node Library<176>,Documentation<68>,Core and Builtins<172>,Python 3 7 0 alpha 2
@anchor{whatsnew/changelog id861}@anchor{1ed2}
@subsubsection Library



@itemize -

@item 
bpo-30058@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30058}: Fixed buffer overflow in select.kqueue.control().

@item 
bpo-31672@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31672}: @code{idpattern} in @code{string.Template} matched some non-ASCII
characters. Now it uses @code{-i} regular expression local flag to avoid
non-ASCII characters.

@item 
bpo-31701@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31701}: On Windows, faulthandler.enable() now ignores MSC and COM
exceptions.

@item 
bpo-31728@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31728}: Prevent crashes in @code{_elementtree} due to unsafe cleanup of
@code{Element.text} and @code{Element.tail}. Patch by Oren Milman.

@item 
bpo-31671@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31671}: Now @code{re.compile()} converts passed RegexFlag to normal int
object before compiling. bm_regex_compile benchmark shows 14% performance
improvements.

@item 
bpo-30397@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30397}: The types of compiled regular objects and match objects are now
exposed as @code{re.Pattern} and @code{re.Match}.  This adds information in
pydoc output for the @code{re} module.

@item 
bpo-31675@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31675}: Fixed memory leaks in Tkinter’s methods splitlist() and split()
when pass a string larger than 2 GiB.

@item 
bpo-31673@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31673}: Fixed typo in the name of Tkinter’s method adderrorinfo().

@item 
bpo-31648@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31648}: Improvements to path predicates in ElementTree: Allow
whitespace around predicate parts, i.e. “[a = ‘text’]” instead of
requiring the less readable “[a=’text’]”. Add support for text comparison
of the current node, like “[.=’text’]”. Patch by Stefan Behnel.

@item 
bpo-30806@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30806}: Fix the string representation of a netrc object.

@item 
bpo-31638@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31638}: Add optional argument @code{compressed} to
@code{zipapp.create_archive}, and add option @code{--compress} to the command
line interface of @code{zipapp}.

@item 
bpo-25351@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25351}: Avoid venv activate failures with undefined variables

@item 
bpo-20519@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20519}: Avoid ctypes use (if possible) and improve import time for
uuid.

@item 
bpo-28293@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28293}: The regular expression cache is no longer completely dumped
when it is full.

@item 
bpo-31596@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31596}: Added pthread_getcpuclockid() to the time module

@item 
bpo-27494@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27494}: Make 2to3 accept a trailing comma in generator expressions. For
example, @code{set(x for x in [],)} is now allowed.

@item 
bpo-30347@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30347}: Stop crashes when concurrently iterate over itertools.groupby()
iterators.

@item 
bpo-30346@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30346}: An iterator produced by itertools.groupby() iterator now
becomes exhausted after advancing the groupby iterator.

@item 
bpo-31556@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31556}: Cancel asyncio.wait_for future faster if timeout <= 0

@item 
bpo-31540@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31540}: Allow passing a context object in
@ref{1d8,,concurrent.futures.ProcessPoolExecutor} constructor. Also, free
job resources in @code{concurrent.futures.ProcessPoolExecutor} earlier
to improve memory usage when a worker waits for new jobs.

@item 
bpo-31516@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31516}: @code{threading.current_thread()} should not return a dummy thread
at shutdown.

@item 
bpo-31525@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31525}: In the sqlite module, require the sqlite3_prepare_v2 API. Thus,
the sqlite module now requires sqlite version at least 3.3.9.

@item 
bpo-26510@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26510}: argparse subparsers are now required by default.  This matches
behaviour in Python 2. For optional subparsers, use the new parameter
@code{add_subparsers(required=False)}. Patch by Anthony Sottile. (As of
3.7.0rc1, the default was changed to not required as had been the case
since Python 3.3.)

@item 
bpo-27541@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27541}: Reprs of subclasses of some collection and iterator classes
(@code{bytearray}, @code{array.array}, @code{collections.deque},
@code{collections.defaultdict}, @code{itertools.count}, @code{itertools.repeat})
now contain actual type name instead of hardcoded names of the base class.

@item 
bpo-31351@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31351}: python -m ensurepip now exits with non-zero exit code if pip
bootstrapping has failed.

@item 
bpo-31389@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31389}: @code{pdb.set_trace()} now takes an optional keyword-only argument
@code{header}. If given, this is printed to the console just before debugging
begins.
@end itemize

@node Documentation<68>,Build<73>,Library<176>,Python 3 7 0 alpha 2
@anchor{whatsnew/changelog id862}@anchor{1ed3}
@subsubsection Documentation



@itemize -

@item 
bpo-31537@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31537}: Fix incorrect usage of @code{get_history_length} in readline
documentation example code. Patch by Brad Smith.

@item 
bpo-30085@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30085}: The operator functions without double underscores are preferred
for clarity. The one with underscores are only kept for
back-compatibility.
@end itemize

@node Build<73>,IDLE<45>,Documentation<68>,Python 3 7 0 alpha 2
@anchor{whatsnew/changelog id863}@anchor{1ed4}
@subsubsection Build



@itemize -

@item 
bpo-31696@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31696}: Improve compiler version information in @ref{49d,,sys.version}
when Python is built with Clang.

@item 
bpo-31625@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31625}: Stop using ranlib on static libraries. Instead, we assume ar
supports the ‘s’ flag.

@item 
bpo-31624@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31624}: Remove support for BSD/OS.

@item 
bpo-22140@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22140}: Prevent double substitution of prefix in python-config.sh.

@item 
bpo-31569@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31569}: Correct PCBuild/ case to PCbuild/ in build scripts and
documentation.

@item 
bpo-31536@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31536}: Avoid wholesale rebuild after @code{make regen-all} if nothing
changed.
@end itemize

@node IDLE<45>,C API<65>,Build<73>,Python 3 7 0 alpha 2
@anchor{whatsnew/changelog id864}@anchor{1ed5}
@subsubsection IDLE



@itemize -

@item 
bpo-31460@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31460}: Simplify the API of IDLE’s Module Browser. Passing a widget
instead of an flist with a root widget opens the option of creating a
browser frame that is only part of a window.  Passing a full file name
instead of pieces assumed to come from a .py file opens the possibility of
browsing python files that do not end in .py.

@item 
bpo-31649@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31649}: IDLE - Make _htest, _utest parameters keyword only.

@item 
bpo-31559@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31559}: Remove test order dependence in idle_test.test_browser.

@item 
bpo-31459@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31459}: Rename IDLE’s module browser from Class Browser to Module
Browser. The original module-level class and method browser became a
module browser, with the addition of module-level functions, years ago.
Nested classes and functions were added yesterday.  For
back-compatibility, the virtual event <<open-class-browser>>, which
appears on the Keys tab of the Settings dialog, is not changed. Patch by
Cheryl Sabella.

@item 
bpo-31500@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31500}: Default fonts now are scaled on HiDPI displays.

@item 
bpo-1612262@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1612262}: IDLE module browser now shows nested classes and functions.
Original patches for code and tests by Guilherme Polo and Cheryl Sabella,
respectively.
@end itemize

@node C API<65>,,IDLE<45>,Python 3 7 0 alpha 2
@anchor{whatsnew/changelog id865}@anchor{1ed6}
@subsubsection C API



@itemize -

@item 
bpo-28280@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28280}: Make @code{PyMapping_Keys()}, @code{PyMapping_Values()} and
@code{PyMapping_Items()} always return a @code{list} (rather than a @code{list} or
a @code{tuple}). Patch by Oren Milman.

@item 
bpo-31532@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31532}: Fix memory corruption due to allocator mix in getpath.c between
Py_GetPath() and Py_SetPath()

@item 
bpo-25658@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25658}: Implement 
@geindex Python Enhancement Proposals; PEP 539
PEP 539@footnote{https://peps.python.org/pep-0539/} for Thread Specific Storage (TSS) API: it
is a new Thread Local Storage (TLS) API to CPython which would supersede
use of the existing TLS API within the CPython interpreter, while
deprecating the existing API. PEP written by Erik M. Bray, patch by
Masayuki Yamamoto.
@end itemize

@node Python 3 7 0 alpha 1,Python 3 6 6 final,Python 3 7 0 alpha 2,Changelog
@anchor{whatsnew/changelog python-3-7-0-alpha-1}@anchor{1ed7}
@subsection Python 3.7.0 alpha 1


`Release date: 2017-09-19'

@menu
* Security: Security<53>. 
* Core and Builtins: Core and Builtins<173>. 
* Library: Library<177>. 
* Documentation: Documentation<69>. 
* Tests: Tests<66>. 
* Build: Build<74>. 
* Windows: Windows<65>. 
* IDLE: IDLE<46>. 
* Tools/Demos: Tools/Demos<43>. 
* C API: C API<66>. 

@end menu

@node Security<53>,Core and Builtins<173>,,Python 3 7 0 alpha 1
@anchor{whatsnew/changelog id866}@anchor{1ed8}
@subsubsection Security



@itemize -

@item 
bpo-29781@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29781}: SSLObject.version() now correctly returns None when handshake
over BIO has not been performed yet.

@item 
bpo-29505@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29505}: Add fuzz tests for float(str), int(str), unicode(str); for
oss-fuzz.

@item 
bpo-30947@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30947}: Upgrade libexpat embedded copy from version 2.2.1 to 2.2.3 to
get security fixes.

@item 
bpo-30730@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30730}: Prevent environment variables injection in subprocess on
Windows.  Prevent passing other environment variables and command
arguments.

@item 
bpo-30694@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30694}: Upgrade expat copy from 2.2.0 to 2.2.1 to get fixes of multiple
security vulnerabilities including: 
@geindex Common Vulnerabilities and Exposures; CVE 2017-9233
CVE 2017-9233@footnote{https://www.cve.org/CVERecord?id=CVE-2017-9233} (External entity
infinite loop DoS), 
@geindex Common Vulnerabilities and Exposures; CVE 2016-9063
CVE 2016-9063@footnote{https://www.cve.org/CVERecord?id=CVE-2016-9063} (Integer overflow, re-fix),
@geindex Common Vulnerabilities and Exposures; CVE 2016-0718
CVE 2016-0718@footnote{https://www.cve.org/CVERecord?id=CVE-2016-0718} (Fix regression bugs from 2.2.0’s fix to
@geindex Common Vulnerabilities and Exposures; CVE 2016-0718
CVE 2016-0718@footnote{https://www.cve.org/CVERecord?id=CVE-2016-0718}) and 
@geindex Common Vulnerabilities and Exposures; CVE 2012-0876
CVE 2012-0876@footnote{https://www.cve.org/CVERecord?id=CVE-2012-0876} (Counter hash flooding with
SipHash). Note: the 
@geindex Common Vulnerabilities and Exposures; CVE 2016-5300
CVE 2016-5300@footnote{https://www.cve.org/CVERecord?id=CVE-2016-5300} (Use os-specific entropy sources like
getrandom) doesn’t impact Python, since Python already gets entropy from
the OS to set the expat secret using @code{XML_SetHashSalt()}.

@item 
bpo-30500@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30500}: Fix urllib.parse.splithost() to correctly parse fragments. For
example, @code{splithost('//127.0.0.1#@@evil.com/')} now correctly returns the
@code{127.0.0.1} host, instead of treating @code{@@evil.com} as the host in an
authentication (@code{login@@host}).

@item 
bpo-29591@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29591}: Update expat copy from 2.1.1 to 2.2.0 to get fixes of
@geindex Common Vulnerabilities and Exposures; CVE 2016-0718
CVE 2016-0718@footnote{https://www.cve.org/CVERecord?id=CVE-2016-0718} and 
@geindex Common Vulnerabilities and Exposures; CVE 2016-4472
CVE 2016-4472@footnote{https://www.cve.org/CVERecord?id=CVE-2016-4472}. See
@indicateurl{https://sourceforge.net/p/expat/bugs/537/} for more information.
@end itemize

@node Core and Builtins<173>,Library<177>,Security<53>,Python 3 7 0 alpha 1
@anchor{whatsnew/changelog id867}@anchor{1ed9}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-31490@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31490}: Fix an assertion failure in @code{ctypes} class definition, in
case the class has an attribute whose name is specified in @code{_anonymous_}
but not in @code{_fields_}. Patch by Oren Milman.

@item 
bpo-31471@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31471}: Fix an assertion failure in @code{subprocess.Popen()} on Windows,
in case the env argument has a bad @code{keys()} method. Patch by Oren
Milman.

@item 
bpo-31418@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31418}: Fix an assertion failure in @code{PyErr_WriteUnraisable()} in case
of an exception with a bad @code{__module__} attribute. Patch by Oren Milman.

@item 
bpo-31416@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31416}: Fix assertion failures in case of a bad warnings.filters or
warnings.defaultaction. Patch by Oren Milman.

@item 
bpo-28411@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28411}: Change direct usage of PyInterpreterState.modules to
PyImport_GetModuleDict(). Also introduce more uniformity in other code
that deals with sys.modules. This helps reduce complications when working
on sys.modules.

@item 
bpo-28411@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28411}: Switch to the abstract API when dealing with
@code{PyInterpreterState.modules}. This allows later support for all dict
subclasses and other Mapping implementations.  Also add a
@code{PyImport_GetModule()} function to reduce a bunch of duplicated code.

@item 
bpo-31411@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31411}: Raise a TypeError instead of SystemError in case
warnings.onceregistry is not a dictionary. Patch by Oren Milman.

@item 
bpo-31344@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31344}: For finer control of tracing behaviour when testing the
interpreter, two new frame attributes have been added to control the
emission of particular trace events: @code{f_trace_lines} (@code{True} by
default) to turn off per-line trace events; and @code{f_trace_opcodes}
(@code{False} by default) to turn on per-opcode trace events.

@item 
bpo-31373@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31373}: Fix several possible instances of undefined behavior due to
floating-point demotions.

@item 
bpo-30465@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30465}: Location information (@code{lineno} and @code{col_offset}) in
f-strings is now (mostly) correct.  This fixes tools like flake8 from
showing warnings on the wrong line (typically the first line of the file).

@item 
bpo-30860@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30860}: Consolidate CPython’s global runtime state under a single
struct.  This improves discoverability of the runtime state.

@item 
bpo-31347@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31347}: Fix possible undefined behavior in _PyObject_FastCall_Prepend.

@item 
bpo-31343@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31343}: Include sys/sysmacros.h for major(), minor(), and makedev().
GNU C library plans to remove the functions from sys/types.h.

@item 
bpo-31291@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31291}: Fix an assertion failure in @code{zipimport.zipimporter.get_data}
on Windows, when the return value of @code{pathname.replace('/','\\')} isn’t
a string. Patch by Oren Milman.

@item 
bpo-31271@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31271}: Fix an assertion failure in the @code{write()} method of
@code{io.TextIOWrapper}, when the encoder doesn’t return a bytes object.
Patch by Oren Milman.

@item 
bpo-31243@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31243}: Fix a crash in some methods of @code{io.TextIOWrapper}, when the
decoder’s state is invalid. Patch by Oren Milman.

@item 
bpo-30721@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30721}: @code{print} now shows correct usage hint for using Python 2
redirection syntax.  Patch by Sanyam Khurana.

@item 
bpo-31070@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31070}: Fix a race condition in importlib _get_module_lock().

@item 
bpo-30747@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30747}: Add a non-dummy implementation of _Py_atomic_store and
_Py_atomic_load on MSVC.

@item 
bpo-31095@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31095}: Fix potential crash during GC caused by @code{tp_dealloc} which
doesn’t call @code{PyObject_GC_UnTrack()}.

@item 
bpo-31071@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31071}: Avoid masking original TypeError in call with * unpacking when
other arguments are passed.

@item 
bpo-30978@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30978}: str.format_map() now passes key lookup exceptions through.
Previously any exception was replaced with a KeyError exception.

@item 
bpo-30808@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30808}: Use _Py_atomic API for concurrency-sensitive signal state.

@item 
bpo-30876@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30876}: Relative import from unloaded package now reimports the package
instead of failing with SystemError.  Relative import from non-package now
fails with ImportError rather than SystemError.

@item 
bpo-30703@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30703}: Improve signal delivery. Avoid using Py_AddPendingCall from
signal handler, to avoid calling signal-unsafe functions. The tests I’m
adding here fail without the rest of the patch, on Linux and OS X. This
means our signal delivery logic had defects (some signals could be lost).

@item 
bpo-30765@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30765}: Avoid blocking in pthread_mutex_lock() when
PyThread_acquire_lock() is asked not to block.

@item 
bpo-31161@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31161}: Make sure the ‘Missing parentheses’ syntax error message is
only applied to SyntaxError, not to subclasses. Patch by Martijn Pieters.

@item 
bpo-30814@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30814}: Fixed a race condition when import a submodule from a package.

@item 
bpo-30736@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30736}: The internal unicodedata database has been upgraded to Unicode
10.0.

@item 
bpo-30604@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30604}: Move co_extra_freefuncs from per-thread to per-interpreter to
avoid crashes.

@item 
bpo-30597@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30597}: @code{print} now shows expected input in custom error message when
used as a Python 2 statement. Patch by Sanyam Khurana.

@item 
bpo-30682@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30682}: Removed a too-strict assertion that failed for certain
f-strings, such as eval(“f’\n’”) and eval(“f’\r’”).

@item 
bpo-30501@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30501}: The compiler now produces more optimal code for complex
condition expressions in the “if”, “while” and “assert” statement, the
“if” expression, and generator expressions and comprehensions.

@item 
bpo-28180@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28180}: Implement 
@geindex Python Enhancement Proposals; PEP 538
PEP 538@footnote{https://peps.python.org/pep-0538/} (legacy C locale coercion). This means
that when a suitable coercion target locale is available, both the core
interpreter and locale-aware C extensions will assume the use of UTF-8 as
the default text encoding, rather than ASCII.

@item 
bpo-30486@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30486}: Allows setting cell values for __closure__. Patch by Lisa
Roach.

@item 
bpo-30537@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30537}: itertools.islice now accepts integer-like objects (having an
__index__ method) as start, stop, and slice arguments

@item 
bpo-25324@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25324}: Tokens needed for parsing in Python moved to C. @code{COMMENT},
@code{NL} and @code{ENCODING}. This way the tokens and tok_names in the token
module don’t get changed when you import the tokenize module.

@item 
bpo-29104@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29104}: Fixed parsing backslashes in f-strings.

@item 
bpo-27945@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27945}: Fixed various segfaults with dict when input collections are
mutated during searching, inserting or comparing.  Based on patches by
Duane Griffin and Tim Mitchell.

@item 
bpo-25794@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25794}: Fixed type.__setattr__() and type.__delattr__() for
non-interned attribute names.  Based on patch by Eryk Sun.

@item 
bpo-30039@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30039}: If a KeyboardInterrupt happens when the interpreter is in the
middle of resuming a chain of nested ‘yield from’ or ‘await’ calls, it’s
now correctly delivered to the innermost frame.

@item 
bpo-28974@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28974}: @code{object.__format__(x, '@w{'})} is now equivalent to @code{str(x)}
rather than @code{format(str(self), '@w{'})}.

@item 
bpo-30024@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30024}: Circular imports involving absolute imports with binding a
submodule to a name are now supported.

@item 
bpo-12414@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12414}: sys.getsizeof() on a code object now returns the sizes which
includes the code struct and sizes of objects which it references. Patch
by Donghee Na.

@item 
bpo-29839@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29839}: len() now raises ValueError rather than OverflowError if
__len__() returned a large negative integer.

@item 
bpo-11913@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11913}: README.rst is now included in the list of distutils standard
READMEs and therefore included in source distributions.

@item 
bpo-29914@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29914}: Fixed default implementations of __reduce__ and
__reduce_ex__(). object.__reduce__() no longer takes arguments,
object.__reduce_ex__() now requires one argument.

@item 
bpo-29949@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29949}: Fix memory usage regression of set and frozenset object.

@item 
bpo-29935@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29935}: Fixed error messages in the index() method of tuple, list and
deque when pass indices of wrong type.

@item 
bpo-29816@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29816}: Shift operation now has less opportunity to raise
OverflowError. ValueError always is raised rather than OverflowError for
negative counts. Shifting zero with non-negative count always returns
zero.

@item 
bpo-24821@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24821}: Fixed the slowing down to 25 times in the searching of some
unlucky Unicode characters.

@item 
bpo-29102@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29102}: Add a unique ID to PyInterpreterState.  This makes it easier to
identify each subinterpreter.

@item 
bpo-29894@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29894}: The deprecation warning is emitted if __complex__ returns an
instance of a strict subclass of complex.  In a future versions of Python
this can be an error.

@item 
bpo-29859@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29859}: Show correct error messages when any of the pthread_* calls in
thread_pthread.h fails.

@item 
bpo-29849@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29849}: Fix a memory leak when an ImportError is raised during from
import.

@item 
bpo-28856@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28856}: Fix an oversight that %b format for bytes should support
objects follow the buffer protocol.

@item 
bpo-29723@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29723}: The @code{sys.path[0]} initialization change for bpo-29139@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29139} caused
a regression by revealing an inconsistency in how sys.path is initialized
when executing @code{__main__} from a zipfile, directory, or other import
location. The interpreter now consistently avoids ever adding the import
location’s parent directory to @code{sys.path}, and ensures no other
@code{sys.path} entries are inadvertently modified when inserting the import
location named on the command line.

@item 
bpo-29568@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29568}: Escaped percent “%%” in the format string for classic string
formatting no longer allows any characters between two percents.

@item 
bpo-29714@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29714}: Fix a regression that bytes format may fail when containing
zero bytes inside.

@item 
bpo-29695@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29695}: bool(), float(), list() and tuple() no longer take keyword
arguments. The first argument of int() can now be passes only as
positional argument.

@item 
bpo-28893@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28893}: Set correct __cause__ for errors about invalid awaitables
returned from __aiter__ and __anext__.

@item 
bpo-28876@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28876}: @code{bool(range)} works even if @code{len(range)} raises
@ref{a87,,OverflowError}.

@item 
bpo-29683@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29683}: Fixes to memory allocation in _PyCode_SetExtra.  Patch by Brian
Coleman.

@item 
bpo-29684@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29684}: Fix minor regression of PyEval_CallObjectWithKeywords. It
should raise TypeError when kwargs is not a dict.  But it might cause segv
when args=NULL and kwargs is not a dict.

@item 
bpo-28598@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28598}: Support __rmod__ for subclasses of str being called before
str.__mod__. Patch by Martijn Pieters.

@item 
bpo-29607@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29607}: Fix stack_effect computation for CALL_FUNCTION_EX. Patch by
Matthieu Dartiailh.

@item 
bpo-29602@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29602}: Fix incorrect handling of signed zeros in complex constructor
for complex subclasses and for inputs having a __complex__ method. Patch
by Serhiy Storchaka.

@item 
bpo-29347@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29347}: Fixed possibly dereferencing undefined pointers when creating
weakref objects.

@item 
bpo-29463@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29463}: Add @code{docstring} field to Module, ClassDef, FunctionDef, and
AsyncFunctionDef ast nodes.  docstring is not first stmt in their body
anymore.  It affects @code{co_firstlineno} and @code{co_lnotab} of code object
for module and class. (Reverted in bpo-32911@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32911}.)

@item 
bpo-29438@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29438}: Fixed use-after-free problem in key sharing dict.

@item 
bpo-29546@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29546}: Set the ‘path’ and ‘name’ attribute on ImportError for @code{from
... import ...}.

@item 
bpo-29546@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29546}: Improve from-import error message with location

@item 
bpo-29478@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29478}: If max_line_length=None is specified while using the Compat32
policy, it is no longer ignored.  Patch by Mircea Cosbuc.

@item 
bpo-29319@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29319}: Prevent RunMainFromImporter overwriting sys.path[0].

@item 
bpo-29337@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29337}: Fixed possible BytesWarning when compare the code objects.
Warnings could be emitted at compile time.

@item 
bpo-29327@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29327}: Fixed a crash when pass the iterable keyword argument to
sorted().

@item 
bpo-29034@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29034}: Fix memory leak and use-after-free in os module
(path_converter).

@item 
bpo-29159@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29159}: Fix regression in bytes(x) when x.__index__() raises Exception.

@item 
bpo-29049@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29049}: Call _PyObject_GC_TRACK() lazily when calling Python function.
Calling function is up to 5% faster.

@item 
bpo-28927@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28927}: bytes.fromhex() and bytearray.fromhex() now ignore all ASCII
whitespace, not only spaces.  Patch by Robert Xiao.

@item 
bpo-28932@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28932}: Do not include <sys/random.h> if it does not exist.

@item 
bpo-25677@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25677}: Correct the positioning of the syntax error caret for indented
blocks. Based on patch by Michael Layzell.

@item 
bpo-29000@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29000}: Fixed bytes formatting of octals with zero padding in alternate
form.

@item 
bpo-18896@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18896}: Python function can now have more than 255 parameters.
collections.namedtuple() now supports tuples with more than 255 elements.

@item 
bpo-28596@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28596}: The preferred encoding is UTF-8 on Android. Patch written by
Chi Hsuan Yen.

@item 
bpo-22257@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22257}: Clean up interpreter startup (see 
@geindex Python Enhancement Proposals; PEP 432
PEP 432@footnote{https://peps.python.org/pep-0432/}).

@item 
bpo-26919@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26919}: On Android, operating system data is now always encoded/decoded
to/from UTF-8, instead of the locale encoding to avoid inconsistencies
with os.fsencode() and os.fsdecode() which are already using UTF-8.

@item 
bpo-28991@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28991}: functools.lru_cache() was susceptible to an obscure reentrancy
bug triggerable by a monkey-patched len() function.

@item 
bpo-28147@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28147}: Fix a memory leak in split-table dictionaries: setattr() must
not convert combined table into split table. Patch written by INADA Naoki.

@item 
bpo-28739@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28739}: f-string expressions are no longer accepted as docstrings and
by ast.literal_eval() even if they do not include expressions.

@item 
bpo-28512@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28512}: Fixed setting the offset attribute of SyntaxError by
PyErr_SyntaxLocationEx() and PyErr_SyntaxLocationObject().

@item 
bpo-28918@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28918}: Fix the cross compilation of xxlimited when Python has been
built with Py_DEBUG defined.

@item 
bpo-23722@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23722}: Rather than silently producing a class that doesn’t support
zero-argument @code{super()} in methods, failing to pass the new
@code{__classcell__} namespace entry up to @code{type.__new__} now results in a
@code{DeprecationWarning} and a class that supports zero-argument
@code{super()}.

@item 
bpo-28797@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28797}: Modifying the class __dict__ inside the __set_name__ method of
a descriptor that is used inside that class no longer prevents calling the
__set_name__ method of other descriptors.

@item 
bpo-28799@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28799}: Remove the @code{PyEval_GetCallStats()} function and deprecate the
untested and undocumented @code{sys.callstats()} function. Remove the
@code{CALL_PROFILE} special build: use the @ref{170a,,sys.setprofile()} function,
@ref{2b,,cProfile} or @ref{b4,,profile} to profile function calls.

@item 
bpo-12844@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12844}: More than 255 arguments can now be passed to a function.

@item 
bpo-28782@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28782}: Fix a bug in the implementation @code{yield from} when checking if
the next instruction is YIELD_FROM. Regression introduced by WORDCODE
(bpo-26647@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26647}).

@item 
bpo-28774@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28774}: Fix error position of the unicode error in ASCII and Latin1
encoders when a string returned by the error handler contains multiple
non-encodable characters (non-ASCII for the ASCII codec, characters out of
the U+0000-U+00FF range for Latin1).

@item 
bpo-28731@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28731}: Optimize _PyDict_NewPresized() to create correct size dict.
Improve speed of dict literal with constant keys up to 30%.

@item 
bpo-28532@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28532}: Show sys.version when -V option is supplied twice.

@item 
bpo-27100@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27100}: The with-statement now checks for __enter__ before it checks
for __exit__. This gives less confusing error messages when both methods
are missing. Patch by Jonathan Ellington.

@item 
bpo-28746@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28746}: Fix the set_inheritable() file descriptor method on platforms
that do not have the ioctl FIOCLEX and FIONCLEX commands.

@item 
bpo-26920@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26920}: Fix not getting the locale’s charset upon initializing the
interpreter, on platforms that do not have langinfo.

@item 
bpo-28648@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28648}: Fixed crash in Py_DecodeLocale() in debug build on Mac OS X
when decode astral characters.  Patch by Xiang Zhang.

@item 
bpo-28665@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28665}: Improve speed of the STORE_DEREF opcode by 40%.

@item 
bpo-19398@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19398}: Extra slash no longer added to sys.path components in case of
empty compile-time PYTHONPATH components.

@item 
bpo-28621@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28621}: Sped up converting int to float by reusing faster bits counting
implementation.  Patch by Adrian Wielgosik.

@item 
bpo-28580@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28580}: Optimize iterating split table values. Patch by Xiang Zhang.

@item 
bpo-28583@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28583}: PyDict_SetDefault didn’t combine split table when needed. Patch
by Xiang Zhang.

@item 
bpo-28128@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28128}: Deprecation warning for invalid str and byte escape sequences
now prints better information about where the error occurs. Patch by
Serhiy Storchaka and Eric Smith.

@item 
bpo-28509@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28509}: dict.update() no longer allocate unnecessary large memory.

@item 
bpo-28426@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28426}: Fixed potential crash in PyUnicode_AsDecodedObject() in debug
build.

@item 
bpo-28517@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28517}: Fixed of-by-one error in the peephole optimizer that caused
keeping unreachable code.

@item 
bpo-28214@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28214}: Improved exception reporting for problematic __set_name__
attributes.

@item 
bpo-23782@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23782}: Fixed possible memory leak in _PyTraceback_Add() and exception
loss in PyTraceBack_Here().

@item 
bpo-28183@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28183}: Optimize and cleanup dict iteration.

@item 
bpo-26081@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26081}: Added C implementation of asyncio.Future. Original patch by
Yury Selivanov.

@item 
bpo-28379@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28379}: Added sanity checks and tests for PyUnicode_CopyCharacters().
Patch by Xiang Zhang.

@item 
bpo-28376@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28376}: The type of long range iterator is now registered as Iterator.
Patch by Oren Milman.

@item 
bpo-28376@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28376}: Creating instances of range_iterator by calling range_iterator
type now is disallowed.  Calling iter() on range instance is the only way.
Patch by Oren Milman.

@item 
bpo-26906@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26906}: Resolving special methods of uninitialized type now causes
implicit initialization of the type instead of a fail.

@item 
bpo-18287@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18287}: PyType_Ready() now checks that tp_name is not NULL. Original
patch by Niklas Koep.

@item 
bpo-24098@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24098}: Fixed possible crash when AST is changed in process of
compiling it.

@item 
bpo-28201@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28201}: Dict reduces possibility of 2nd conflict in hash table when
hashes have same lower bits.

@item 
bpo-28350@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28350}: String constants with null character no longer interned.

@item 
bpo-26617@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26617}: Fix crash when GC runs during weakref callbacks.

@item 
bpo-27942@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27942}: String constants now interned recursively in tuples and
frozensets.

@item 
bpo-28289@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28289}: ImportError.__init__ now resets not specified attributes.

@item 
bpo-21578@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21578}: Fixed misleading error message when ImportError called with
invalid keyword args.

@item 
bpo-28203@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28203}: Fix incorrect type in complex(1.0, @{2:3@}) error message. Patch
by Soumya Sharma.

@item 
bpo-28086@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28086}: Single var-positional argument of tuple subtype was passed
unscathed to the C-defined function.  Now it is converted to exact tuple.

@item 
bpo-28214@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28214}: Now __set_name__ is looked up on the class instead of the
instance.

@item 
bpo-27955@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27955}: Fallback on reading /dev/urandom device when the getrandom()
syscall fails with EPERM, for example when blocked by SECCOMP.

@item 
bpo-28192@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28192}: Don’t import readline in isolated mode.

@item 
bpo-27441@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27441}: Remove some redundant assignments to ob_size in longobject.c.
Thanks Oren Milman.

@item 
bpo-27222@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27222}: Clean up redundant code in long_rshift function. Thanks Oren
Milman.

@item 
Upgrade internal unicode databases to Unicode version 9.0.0.

@item 
bpo-28131@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28131}: Fix a regression in zipimport’s compile_source().  zipimport
should use the same optimization level as the interpreter.

@item 
bpo-28126@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28126}: Replace Py_MEMCPY with memcpy(). Visual Studio can properly
optimize memcpy().

@item 
bpo-28120@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28120}: Fix dict.pop() for split dictionary when trying to remove a
“pending key” (Not yet inserted in split-table). Patch by Xiang Zhang.

@item 
bpo-26182@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26182}: Raise DeprecationWarning when async and await keywords are used
as variable/attribute/class/function name.

@item 
bpo-26182@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26182}: Fix a refleak in code that raises DeprecationWarning.

@item 
bpo-28721@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28721}: Fix asynchronous generators aclose() and athrow() to handle
StopAsyncIteration propagation properly.

@item 
bpo-26110@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26110}: Speed-up method calls: add LOAD_METHOD and CALL_METHOD opcodes.
@end itemize

@node Library<177>,Documentation<69>,Core and Builtins<173>,Python 3 7 0 alpha 1
@anchor{whatsnew/changelog id868}@anchor{1eda}
@subsubsection Library



@itemize -

@item 
bpo-31499@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31499}: xml.etree: Fix a crash when a parser is part of a reference
cycle.

@item 
bpo-31482@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31482}: @code{random.seed()} now works with bytes in version=1

@item 
bpo-28556@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28556}: typing.get_type_hints now finds the right globalns for classes
and modules by default (when no @code{globalns} was specified by the caller).

@item 
bpo-28556@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28556}: Speed improvements to the @code{typing} module.  Original PRs by
Ivan Levkivskyi and Mitar.

@item 
bpo-31544@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31544}: The C accelerator module of ElementTree ignored exceptions
raised when looking up TreeBuilder target methods in XMLParser().

@item 
bpo-31234@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31234}: socket.create_connection() now fixes manually a reference
cycle: clear the variable storing the last exception on success.

@item 
bpo-31457@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31457}: LoggerAdapter objects can now be nested.

@item 
bpo-31431@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31431}: SSLContext.check_hostname now automatically sets
SSLContext.verify_mode to ssl.CERT_REQUIRED instead of failing with a
ValueError.

@item 
bpo-31233@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31233}: socketserver.ThreadingMixIn now keeps a list of non-daemonic
threads to wait until all these threads complete in server_close().

@item 
bpo-28638@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28638}: Changed the implementation strategy for
collections.namedtuple() to substantially reduce the use of exec() in
favor of precomputed methods. As a result, the `verbose' parameter and
`_source' attribute are no longer supported.  The benefits include 1)
having a smaller memory footprint for applications using multiple named
tuples, 2) faster creation of the named tuple class (approx 4x to 6x
depending on how it is measured), and 3) minor speed-ups for instance
creation using __new__, _make, and _replace.  (The primary patch
contributor is Jelle Zijlstra with further improvements by INADA Naoki,
Serhiy Storchaka, and Raymond Hettinger.)

@item 
bpo-31400@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31400}: Improves SSL error handling to avoid losing error numbers.

@item 
bpo-27629@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27629}: Make return types of SSLContext.wrap_bio() and
SSLContext.wrap_socket() customizable.

@item 
bpo-28958@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28958}: ssl.SSLContext() now uses OpenSSL error information when a
context cannot be instantiated.

@item 
bpo-28182@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28182}: The SSL module now raises SSLCertVerificationError when OpenSSL
fails to verify the peer’s certificate. The exception contains more
information about the error.

@item 
bpo-27340@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27340}: SSLSocket.sendall() now uses memoryview to create slices of
data. This fixes support for all bytes-like object. It is also more
efficient and avoids costly copies.

@item 
bpo-14191@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14191}: A new function
@code{argparse.ArgumentParser.parse_intermixed_args} provides the ability to
parse command lines where there user intermixes options and positional
arguments.

@item 
bpo-31178@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31178}: Fix string concatenation bug in rare error path in the
subprocess module

@item 
bpo-31350@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31350}: Micro-optimize @code{asyncio._get_running_loop()} to become up
to 10% faster.

@item 
bpo-31170@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31170}: expat: Update libexpat from 2.2.3 to 2.2.4. Fix copying of
partial characters for UTF-8 input (libexpat bug 115):
@indicateurl{https://github.com/libexpat/libexpat/issues/115}

@item 
bpo-29136@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29136}: Add TLS 1.3 cipher suites and OP_NO_TLSv1_3.

@item 
bpo-1198569@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1198569}: @code{string.Template} subclasses can optionally define
@code{braceidpattern} if they want to specify different placeholder patterns
inside and outside the braces.  If None (the default) it falls back to
@code{idpattern}.

@item 
bpo-31326@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31326}: concurrent.futures.ProcessPoolExecutor.shutdown() now
explicitly closes the call queue. Moreover, shutdown(wait=True) now also
join the call queue thread, to prevent leaking a dangling thread.

@item 
bpo-27144@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27144}: The @code{map()} and @code{as_completed()} iterators in
@code{concurrent.futures} now avoid keeping a reference to yielded objects.

@item 
bpo-31281@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31281}: Fix @code{fileinput.FileInput(files, inplace=True)} when @code{files}
contain @code{pathlib.Path} objects.

@item 
bpo-10746@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10746}: Fix ctypes producing wrong 
@geindex Python Enhancement Proposals; PEP 3118
PEP 3118@footnote{https://peps.python.org/pep-3118/} type codes for integer
types.

@item 
bpo-27584@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27584}: @code{AF_VSOCK} has been added to the socket interface which
allows communication between virtual machines and their host.

@item 
bpo-22536@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22536}: The subprocess module now sets the filename when
FileNotFoundError is raised on POSIX systems due to the executable or cwd
not being found.

@item 
bpo-29741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29741}: Update some methods in the _pyio module to also accept integer
types. Patch by Oren Milman.

@item 
bpo-31249@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31249}: concurrent.futures: WorkItem.run() used by ThreadPoolExecutor
now breaks a reference cycle between an exception object and the WorkItem
object.

@item 
bpo-31247@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31247}: xmlrpc.server now explicitly breaks reference cycles when using
sys.exc_info() in code handling exceptions.

@item 
bpo-23835@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23835}: configparser: reading defaults in the @code{ConfigParser()}
constructor is now using @code{read_dict()}, making its behavior consistent
with the rest of the parser.  Non-string keys and values in the defaults
dictionary are now being implicitly converted to strings.  Patch by James
Tocknell.

@item 
bpo-31238@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31238}: pydoc: the stop() method of the private ServerThread class now
waits until DocServer.serve_until_quit() completes and then explicitly
sets its docserver attribute to None to break a reference cycle.

@item 
bpo-5001@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5001}: Many asserts in @code{multiprocessing} are now more informative,
and some error types have been changed to more specific ones.

@item 
bpo-31109@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31109}: Convert zipimport to use Argument Clinic.

@item 
bpo-30102@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30102}: The ssl and hashlib modules now call
OPENSSL_add_all_algorithms_noconf() on OpenSSL < 1.1.0. The function
detects CPU features and enables optimizations on some CPU architectures
such as POWER8. Patch is based on research from Gustavo Serra Scalet.

@item 
bpo-18966@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18966}: Non-daemonic threads created by a multiprocessing.Process are
now joined on child exit.

@item 
bpo-31183@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31183}: @code{dis} now works with asynchronous generator and coroutine
objects. Patch by George Collins based on diagnosis by Luciano Ramalho.

@item 
bpo-5001@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5001}: There are a number of uninformative asserts in the
@code{multiprocessing} module, as noted in issue 5001. This change fixes two
of the most potentially problematic ones, since they are in
error-reporting code, in the @code{multiprocessing.managers.convert_to_error}
function. (It also makes more informative a ValueError message.) The only
potentially problematic change is that the AssertionError is now a
TypeError; however, this should also help distinguish it from an
AssertionError being `reported' by the function/its caller (such as in
issue 31169). - Patch by Allen W. Smith (drallensmith on github).

@item 
bpo-31185@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31185}: Fixed miscellaneous errors in asyncio speedup module.

@item 
bpo-31151@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31151}: socketserver.ForkingMixIn.server_close() now waits until all
child processes completed to prevent leaking zombie processes.

@item 
bpo-31072@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31072}: Add an @code{include_file} parameter to
@code{zipapp.create_archive()}

@item 
bpo-24700@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24700}: Optimize array.array comparison. It is now from 10x up to 70x
faster when comparing arrays holding values of the same integer type.

@item 
bpo-31135@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31135}: ttk: fix the destroy() method of LabeledScale and OptionMenu
classes. Call the parent destroy() method even if the used attribute
doesn’t exist. The LabeledScale.destroy() method now also explicitly
clears label and scale attributes to help the garbage collector to destroy
all widgets.

@item 
bpo-31107@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31107}: Fix @code{copyreg._slotnames()} mangled attribute calculation for
classes whose name begins with an underscore. Patch by Shane Harvey.

@item 
bpo-31080@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31080}: Allow @code{logging.config.fileConfig} to accept kwargs and/or
args.

@item 
bpo-30897@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30897}: @code{pathlib.Path} objects now include an @code{is_mount()} method
(only implemented on POSIX).  This is similar to @code{os.path.ismount(p)}.
Patch by Cooper Ry Lees.

@item 
bpo-31061@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31061}: Fixed a crash when using asyncio and threads.

@item 
bpo-30987@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30987}: Added support for CAN ISO-TP protocol in the socket module.

@item 
bpo-30522@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30522}: Added a @code{setStream} method to @code{logging.StreamHandler} to
allow the stream to be set after creation.

@item 
bpo-30502@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30502}: Fix handling of long oids in ssl.  Based on patch by Christian
Heimes.

@item 
bpo-5288@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5288}: Support tzinfo objects with sub-minute offsets.

@item 
bpo-30919@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30919}: Fix shared memory performance regression in multiprocessing in
3.x. Shared memory used anonymous memory mappings in 2.x, while 3.x mmaps
actual files. Try to be careful to do as little disk I/O as possible.

@item 
bpo-26732@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26732}: Fix too many fds in processes started with the “forkserver”
method. A child process would inherit as many fds as the number of
still-running children.

@item 
bpo-29403@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29403}: Fix @code{unittest.mock}’s autospec to not fail on method-bound
builtin functions.  Patch by Aaron Gallagher.

@item 
bpo-30961@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30961}: Fix decrementing a borrowed reference in tracemalloc.

@item 
bpo-19896@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19896}: Fix multiprocessing.sharedctypes to recognize typecodes @code{'q'}
and @code{'Q'}.

@item 
bpo-30946@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30946}: Remove obsolete code in readline module for platforms where GNU
readline is older than 2.1 or where select() is not available.

@item 
bpo-25684@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25684}: Change @code{ttk.OptionMenu} radiobuttons to be unique across
instances of @code{OptionMenu}.

@item 
bpo-30886@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30886}: Fix multiprocessing.Queue.join_thread(): it now waits until the
thread completes, even if the thread was started by the same process which
created the queue.

@item 
bpo-29854@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29854}: Fix segfault in readline when using readline’s history-size
option.  Patch by Nir Soffer.

@item 
bpo-30794@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30794}: Added multiprocessing.Process.kill method to terminate using
the SIGKILL signal on Unix.

@item 
bpo-30319@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30319}: socket.close() now ignores ECONNRESET error.

@item 
bpo-30828@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30828}: Fix out of bounds write in
@code{asyncio.CFuture.remove_done_callback()}.

@item 
bpo-30302@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30302}: Use keywords in the @code{repr} of @code{datetime.timedelta}.

@item 
bpo-30807@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30807}: signal.setitimer() may disable the timer when passed a tiny
value. Tiny values (such as 1e-6) are valid non-zero values for
setitimer(), which is specified as taking microsecond-resolution
intervals. However, on some platform, our conversion routine could convert
1e-6 into a zero interval, therefore disabling the timer instead of
(re-)scheduling it.

@item 
bpo-30441@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30441}: Fix bug when modifying os.environ while iterating over it

@item 
bpo-29585@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29585}: Avoid importing @code{sysconfig} from @code{site} to improve startup
speed. Python startup is about 5% faster on Linux and 30% faster on macOS.

@item 
bpo-29293@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29293}: Add missing parameter “n” on
multiprocessing.Condition.notify(). The doc claims
multiprocessing.Condition behaves like threading.Condition, but its
notify() method lacked the optional “n” argument (to specify the number of
sleepers to wake up) that threading.Condition.notify() accepts.

@item 
bpo-30532@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30532}: Fix email header value parser dropping folding white space in
certain cases.

@item 
bpo-30596@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30596}: Add a @code{close()} method to @code{multiprocessing.Process}.

@item 
bpo-9146@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9146}: Fix a segmentation fault in _hashopenssl when standard hash
functions such as md5 are not available in the linked OpenSSL library.  As
in some special FIPS-140 build environments.

@item 
bpo-29169@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29169}: Update zlib to 1.2.11.

@item 
bpo-30119@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30119}: ftplib.FTP.putline() now throws ValueError on commands that
contains CR or LF. Patch by Donghee Na.

@item 
bpo-30879@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30879}: os.listdir() and os.scandir() now emit bytes names when called
with bytes-like argument.

@item 
bpo-30746@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30746}: Prohibited the ‘=’ character in environment variable names in
@code{os.putenv()} and @code{os.spawn*()}.

@item 
bpo-30664@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30664}: The description of a unittest subtest now preserves the order
of keyword arguments of TestCase.subTest().

@item 
bpo-21071@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21071}: struct.Struct.format type is now @ref{16a,,str} instead of
@ref{193,,bytes}.

@item 
bpo-29212@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29212}: Fix concurrent.futures.thread.ThreadPoolExecutor threads to
have a non repr() based thread name by default when no thread_name_prefix
is supplied. They will now identify themselves as
“ThreadPoolExecutor-y_n”.

@item 
bpo-29755@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29755}: Fixed the lgettext() family of functions in the gettext module.
They now always return bytes.

@item 
bpo-30616@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30616}: Functional API of enum allows to create empty enums. Patched by
Donghee Na

@item 
bpo-30038@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30038}: Fix race condition between signal delivery and wakeup file
descriptor. Patch by Nathaniel Smith.

@item 
bpo-23894@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23894}: lib2to3 now recognizes @code{rb'...'} and @code{f'...'} strings.

@item 
bpo-24744@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24744}: pkgutil.walk_packages function now raises ValueError if `path'
is a string. Patch by Sanyam Khurana.

@item 
bpo-24484@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24484}: Avoid race condition in multiprocessing cleanup.

@item 
bpo-30589@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30589}: Fix multiprocessing.Process.exitcode to return the opposite of
the signal number when the process is killed by a signal (instead of 255)
when using the “forkserver” method.

@item 
bpo-28994@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28994}: The traceback no longer displayed for SystemExit raised in a
callback registered by atexit.

@item 
bpo-30508@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30508}: Don’t log exceptions if Task/Future “cancel()” method was
called.

@item 
bpo-30645@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30645}: Fix path calculation in @code{imp.load_package()}, fixing it for
cases when a package is only shipped with bytecodes. Patch by Alexandru
Ardelean.

@item 
bpo-11822@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11822}: The dis.dis() function now is able to disassemble nested code
objects.

@item 
bpo-30624@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30624}: selectors does not take KeyboardInterrupt and SystemExit into
account, leaving a fd in a bad state in case of error. Patch by Giampaolo
Rodola’.

@item 
bpo-30595@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30595}: multiprocessing.Queue.get() with a timeout now polls its reader
in non-blocking mode if it succeeded to acquire the lock but the acquire
took longer than the timeout.

@item 
bpo-28556@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28556}: Updates to typing module: Add generic AsyncContextManager, add
support for ContextManager on all versions. Original PRs by Jelle Zijlstra
and Ivan Levkivskyi

@item 
bpo-30605@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30605}: re.compile() no longer raises a BytesWarning when compiling a
bytes instance with misplaced inline modifier.  Patch by Roy Williams.

@item 
bpo-29870@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29870}: Fix ssl sockets leaks when connection is aborted in asyncio/ssl
implementation. Patch by Michaël Sghaïer.

@item 
bpo-29743@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29743}: Closing transport during handshake process leaks open socket.
Patch by Nikolay Kim

@item 
bpo-27585@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27585}: Fix waiter cancellation in asyncio.Lock. Patch by Mathieu
Sornay.

@item 
bpo-30014@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30014}: modify() method of poll(), epoll() and devpoll() based classes
of selectors module is around 10% faster.  Patch by Giampaolo Rodola’.

@item 
bpo-30418@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30418}: On Windows, subprocess.Popen.communicate() now also ignore
EINVAL on stdin.write() if the child process is still running but closed
the pipe.

@item 
bpo-30463@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30463}: Added empty __slots__ to abc.ABC.  This allows subclassers to
deny __dict__ and __weakref__ creation.  Patch by Aaron Hall.

@item 
bpo-30520@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30520}: Loggers are now pickleable.

@item 
bpo-30557@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30557}: faulthandler now correctly filters and displays exception codes
on Windows

@item 
bpo-30526@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30526}: Add TextIOWrapper.reconfigure() and a
TextIOWrapper.write_through attribute.

@item 
bpo-30245@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30245}: Fix possible overflow when organize struct.pack_into error
message.  Patch by Yuan Liu.

@item 
bpo-30378@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30378}: Fix the problem that logging.handlers.SysLogHandler cannot
handle IPv6 addresses.

@item 
bpo-16500@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16500}: Allow registering at-fork handlers.

@item 
bpo-30470@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30470}: Deprecate invalid ctypes call protection on Windows.  Patch by
Mariatta Wijaya.

@item 
bpo-30414@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30414}: multiprocessing.Queue._feed background running thread do not
break from main loop on exception.

@item 
bpo-30003@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30003}: Fix handling escape characters in HZ codec.  Based on patch by
Ma Lin.

@item 
bpo-30149@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30149}: inspect.signature() now supports callables with
variable-argument parameters wrapped with partialmethod. Patch by Donghee
Na.

@item 
bpo-30436@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30436}: importlib.find_spec() raises ModuleNotFoundError instead of
AttributeError if the specified parent module is not a package (i.e. lacks
a __path__ attribute).

@item 
bpo-30301@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30301}: Fix AttributeError when using SimpleQueue.empty() under `spawn'
and `forkserver' start methods.

@item 
bpo-30375@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30375}: Warnings emitted when compile a regular expression now always
point to the line in the user code.  Previously they could point into
inners of the re module if emitted from inside of groups or conditionals.

@item 
bpo-30329@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30329}: imaplib and poplib now catch the Windows socket WSAEINVAL error
(code 10022) on shutdown(SHUT_RDWR): An invalid operation was attempted.
This error occurs sometimes on SSL connections.

@item 
bpo-29196@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29196}: Removed previously deprecated in Python 2.4 classes Plist, Dict
and _InternalDict in the plistlib module.  Dict values in the result of
functions readPlist() and readPlistFromBytes() are now normal dicts.  You
no longer can use attribute access to access items of these dictionaries.

@item 
bpo-9850@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9850}: The @code{macpath} is now deprecated and will be removed in
Python 3.8.

@item 
bpo-30299@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30299}: Compiling regular expression in debug mode on CPython now
displays the compiled bytecode in human readable form.

@item 
bpo-30048@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30048}: Fixed @code{Task.cancel()} can be ignored when the task is running
coroutine and the coroutine returned without any more @code{await}.

@item 
bpo-30266@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30266}: contextlib.AbstractContextManager now supports
anti-registration by setting __enter__ = None or __exit__ = None,
following the pattern introduced in bpo-25958@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25958}. Patch by Jelle Zijlstra.

@item 
bpo-30340@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30340}: Enhanced regular expressions optimization. This increased the
performance of matching some patterns up to 25 times.

@item 
bpo-30298@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30298}: Weaken the condition of deprecation warnings for inline
modifiers. Now allowed several subsequential inline modifiers at the start
of the pattern (e.g. @code{'(?i)(?s)...'}).  In verbose mode whitespaces and
comments now are allowed before and between inline modifiers (e.g. @code{'(?x)
(?i) (?s)...'}).

@item 
bpo-30285@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30285}: Optimized case-insensitive matching and searching of regular
expressions.

@item 
bpo-29990@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29990}: Fix range checking in GB18030 decoder.  Original patch by Ma
Lin.

@item 
bpo-29979@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29979}: rewrite cgi.parse_multipart, reusing the FieldStorage class and
making its results consistent with those of FieldStorage for
multipart/form-data requests. Patch by Pierre Quentel.

@item 
bpo-30243@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30243}: Removed the __init__ methods of _json’s scanner and encoder.
Misusing them could cause memory leaks or crashes.  Now scanner and
encoder objects are completely initialized in the __new__ methods.

@item 
bpo-30215@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30215}: Compiled regular expression objects with the re.LOCALE flag no
longer depend on the locale at compile time.  Only the locale at matching
time affects the result of matching.

@item 
bpo-30185@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30185}: Avoid KeyboardInterrupt tracebacks in forkserver helper process
when Ctrl-C is received.

@item 
bpo-30103@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30103}: binascii.b2a_uu() and uu.encode() now support using @code{'`'} as
zero instead of space.

@item 
bpo-28556@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28556}: Various updates to typing module: add typing.NoReturn type, use
WrapperDescriptorType, minor bug-fixes.  Original PRs by Jim
Fasarakis-Hilliard and Ivan Levkivskyi.

@item 
bpo-30205@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30205}: Fix getsockname() for unbound AF_UNIX sockets on Linux.

@item 
bpo-30228@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30228}: The seek() and tell() methods of io.FileIO now set the internal
seekable attribute to avoid one syscall on open() (in buffered or text
mode).

@item 
bpo-30190@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30190}: unittest’s assertAlmostEqual and assertNotAlmostEqual provide a
better message in case of failure which includes the difference between
left and right arguments.  (patch by Giampaolo Rodola’)

@item 
bpo-30101@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30101}: Add support for curses.A_ITALIC.

@item 
bpo-29822@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29822}: inspect.isabstract() now works during __init_subclass__.  Patch
by Nate Soares.

@item 
bpo-29960@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29960}: Preserve generator state when _random.Random.setstate() raises
an exception. Patch by Bryan Olson.

@item 
bpo-30070@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30070}: Fixed leaks and crashes in errors handling in the parser
module.

@item 
bpo-22352@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22352}: Column widths in the output of dis.dis() are now adjusted for
large line numbers and instruction offsets.

@item 
bpo-30061@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30061}: Fixed crashes in IOBase methods __next__() and readlines() when
readline() or __next__() respectively return non-sizeable object. Fixed
possible other errors caused by not checking results of PyObject_Size(),
PySequence_Size(), or PyMapping_Size().

@item 
bpo-30218@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30218}: Fix PathLike support for shutil.unpack_archive. Patch by Jelle
Zijlstra.

@item 
bpo-10076@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10076}: Compiled regular expression and match objects in the re module
now support copy.copy() and copy.deepcopy() (they are considered atomic).

@item 
bpo-30068@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30068}: _io._IOBase.readlines will check if it’s closed first when hint
is present.

@item 
bpo-29694@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29694}: Fixed race condition in pathlib mkdir with flags parents=True.
Patch by Armin Rigo.

@item 
bpo-29692@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29692}: Fixed arbitrary unchaining of RuntimeError exceptions in
contextlib.contextmanager.  Patch by Siddharth Velankar.

@item 
bpo-26187@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26187}: Test that sqlite3 trace callback is not called multiple times
when schema is changing.  Indirectly fixed by switching to use
sqlite3_prepare_v2() in bpo-9303@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9303}.  Patch by Aviv Palivoda.

@item 
bpo-30017@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30017}: Allowed calling the close() method of the zip entry writer
object multiple times.  Writing to a closed writer now always produces a
ValueError.

@item 
bpo-29998@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29998}: Pickling and copying ImportError now preserves name and path
attributes.

@item 
bpo-29995@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29995}: re.escape() now escapes only regex special characters.

@item 
bpo-29962@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29962}: Add math.remainder operation, implementing remainder as
specified in IEEE 754.

@item 
bpo-29649@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29649}: Improve struct.pack_into() exception messages for problems with
the buffer size and offset.  Patch by Andrew Nester.

@item 
bpo-29654@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29654}: Support If-Modified-Since HTTP header (browser cache).  Patch
by Pierre Quentel.

@item 
bpo-29931@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29931}: Fixed comparison check for ipaddress.ip_interface objects.
Patch by Sanjay Sundaresan.

@item 
bpo-29953@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29953}: Fixed memory leaks in the replace() method of datetime and time
objects when pass out of bound fold argument.

@item 
bpo-29942@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29942}: Fix a crash in itertools.chain.from_iterable when encountering
long runs of empty iterables.

@item 
bpo-10030@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10030}: Sped up reading encrypted ZIP files by 2 times.

@item 
bpo-29204@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29204}: Element.getiterator() and the html parameter of XMLParser()
were deprecated only in the documentation (since Python 3.2 and 3.4
correspondingly). Now using them emits a deprecation warning.

@item 
bpo-27863@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27863}: Fixed multiple crashes in ElementTree caused by race conditions
and wrong types.

@item 
bpo-25996@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25996}: Added support of file descriptors in os.scandir() on Unix.
os.fwalk() is sped up by 2 times by using os.scandir().

@item 
bpo-28699@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28699}: Fixed a bug in pools in multiprocessing.pool that raising an
exception at the very first of an iterable may swallow the exception or
make the program hang. Patch by Davin Potts and Xiang Zhang.

@item 
bpo-23890@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23890}: unittest.TestCase.assertRaises() now manually breaks a
reference cycle to not keep objects alive longer than expected.

@item 
bpo-29901@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29901}: The zipapp module now supports general path-like objects, not
just pathlib.Path.

@item 
bpo-25803@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25803}: Avoid incorrect errors raised by Path.mkdir(exist_ok=True) when
the OS gives priority to errors such as EACCES over EEXIST.

@item 
bpo-29861@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29861}: Release references to tasks, their arguments and their results
as soon as they are finished in multiprocessing.Pool.

@item 
bpo-19930@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19930}: The mode argument of os.makedirs() no longer affects the file
permission bits of newly created intermediate-level directories.

@item 
bpo-29884@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29884}: faulthandler: Restore the old sigaltstack during teardown.
Patch by Christophe Zeitouny.

@item 
bpo-25455@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25455}: Fixed crashes in repr of recursive buffered file-like objects.

@item 
bpo-29800@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29800}: Fix crashes in partial.__repr__ if the keys of partial.keywords
are not strings.  Patch by Michael Seifert.

@item 
bpo-8256@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8256}: Fixed possible failing or crashing input() if attributes
“encoding” or “errors” of sys.stdin or sys.stdout are not set or are not
strings.

@item 
bpo-28692@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28692}: Using non-integer value for selecting a plural form in gettext
is now deprecated.

@item 
bpo-26121@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26121}: Use C library implementation for math functions erf() and
erfc().

@item 
bpo-29619@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29619}: os.stat() and os.DirEntry.inode() now convert inode (st_ino)
using unsigned integers.

@item 
bpo-28298@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28298}: Fix a bug that prevented array ‘Q’, ‘L’ and ‘I’ from accepting
big intables (objects that have __int__) as elements.

@item 
bpo-29645@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29645}: Speed up importing the webbrowser module.
webbrowser.register() is now thread-safe.

@item 
bpo-28231@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28231}: The zipfile module now accepts path-like objects for external
paths.

@item 
bpo-26915@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26915}: index() and count() methods of collections.abc.Sequence now
check identity before checking equality when do comparisons.

@item 
bpo-28682@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28682}: Added support for bytes paths in os.fwalk().

@item 
bpo-29728@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29728}: Add new @code{socket.TCP_NOTSENT_LOWAT} (Linux 3.12)
constant. Patch by Nathaniel J. Smith.

@item 
bpo-29623@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29623}: Allow use of path-like object as a single argument in
ConfigParser.read(). Patch by David Ellis.

@item 
bpo-9303@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9303}: Migrate sqlite3 module to _v2 API.  Patch by Aviv Palivoda.

@item 
bpo-28963@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28963}: Fix out of bound iteration in
asyncio.Future.remove_done_callback implemented in C.

@item 
bpo-29704@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29704}: asyncio.subprocess.SubprocessStreamProtocol no longer closes
before all pipes are closed.

@item 
bpo-29271@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29271}: Fix Task.current_task and Task.all_tasks implemented in C to
accept None argument as their pure Python implementation.

@item 
bpo-29703@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29703}: Fix asyncio to support instantiation of new event loops in
child processes.

@item 
bpo-29615@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29615}: SimpleXMLRPCDispatcher no longer chains KeyError (or any other
exception) to exception(s) raised in the dispatched methods. Patch by Petr
Motejlek.

@item 
bpo-7769@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7769}: Method register_function() of
xmlrpc.server.SimpleXMLRPCDispatcher and its subclasses can now be used as
a decorator.

@item 
bpo-29376@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29376}: Fix assertion error in threading._DummyThread.is_alive().

@item 
bpo-28624@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28624}: Add a test that checks that cwd parameter of Popen() accepts
PathLike objects.  Patch by Sayan Chowdhury.

@item 
bpo-28518@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28518}: Start a transaction implicitly before a DML statement. Patch by
Aviv Palivoda.

@item 
bpo-29742@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29742}: get_extra_info() raises exception if get called on closed ssl
transport. Patch by Nikolay Kim.

@item 
bpo-16285@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16285}: urllib.parse.quote is now based on RFC 3986 and hence includes
‘~’ in the set of characters that is not quoted by default. Patch by
Christian Theune and Ratnadeep Debnath.

@item 
bpo-29532@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29532}: Altering a kwarg dictionary passed to functools.partial() no
longer affects a partial object after creation.

@item 
bpo-29110@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29110}: Fix file object leak in aifc.open() when file is given as a
filesystem path and is not in valid AIFF format. Patch by Anthony Zhang.

@item 
bpo-22807@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22807}: Add uuid.SafeUUID and uuid.UUID.is_safe to relay information
from the platform about whether generated UUIDs are generated with a
multiprocessing safe method.

@item 
bpo-29576@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29576}: Improve some deprecations in importlib. Some deprecated methods
now emit DeprecationWarnings and have better descriptive messages.

@item 
bpo-29534@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29534}: Fixed different behaviour of Decimal.from_float() for _decimal
and _pydecimal. Thanks Andrew Nester.

@item 
bpo-10379@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10379}: locale.format_string now supports the ‘monetary’ keyword
argument, and locale.format is deprecated.

@item 
bpo-29851@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29851}: importlib.reload() now raises ModuleNotFoundError if the module
lacks a spec.

@item 
bpo-28556@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28556}: Various updates to typing module: typing.Counter,
typing.ChainMap, improved ABC caching, etc. Original PRs by Jelle
Zijlstra, Ivan Levkivskyi, Manuel Krebber, and Łukasz Langa.

@item 
bpo-29100@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29100}: Fix datetime.fromtimestamp() regression introduced in Python
3.6.0: check minimum and maximum years.

@item 
bpo-29416@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29416}: Prevent infinite loop in pathlib.Path.mkdir

@item 
bpo-29444@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29444}: Fixed out-of-bounds buffer access in the group() method of the
match object. Based on patch by WGH.

@item 
bpo-29377@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29377}: Add WrapperDescriptorType, MethodWrapperType, and
MethodDescriptorType built-in types to types module. Original patch by
Manuel Krebber.

@item 
bpo-29218@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29218}: Unused install_misc command is now removed.  It has been
documented as unused since 2000.  Patch by Eric N. Vander Weele.

@item 
bpo-29368@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29368}: The extend() method is now called instead of the append()
method when unpickle collections.deque and other list-like objects. This
can speed up unpickling to 2 times.

@item 
bpo-29338@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29338}: The help of a builtin or extension class now includes the
constructor signature if __text_signature__ is provided for the class.

@item 
bpo-29335@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29335}: Fix subprocess.Popen.wait() when the child process has exited
to a stopped instead of terminated state (ex: when under ptrace).

@item 
bpo-29290@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29290}: Fix a regression in argparse that help messages would wrap at
non-breaking spaces.

@item 
bpo-28735@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28735}: Fixed the comparison of mock.MagickMock with mock.ANY.

@item 
bpo-29197@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29197}: Removed deprecated function ntpath.splitunc().

@item 
bpo-29210@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29210}: Removed support of deprecated argument “exclude” in
tarfile.TarFile.add().

@item 
bpo-29219@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29219}: Fixed infinite recursion in the repr of uninitialized
ctypes.CDLL instances.

@item 
bpo-29192@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29192}: Removed deprecated features in the http.cookies module.

@item 
bpo-29193@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29193}: A format string argument for string.Formatter.format() is now
positional-only.

@item 
bpo-29195@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29195}: Removed support of deprecated undocumented keyword arguments in
methods of regular expression objects.

@item 
bpo-28969@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28969}: Fixed race condition in C implementation of
functools.lru_cache. KeyError could be raised when cached function with
full cache was simultaneously called from different threads with the same
uncached arguments.

@item 
bpo-20804@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20804}: The unittest.mock.sentinel attributes now preserve their
identity when they are copied or pickled.

@item 
bpo-29142@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29142}: In urllib.request, suffixes in no_proxy environment variable
with leading dots could match related hostnames again (e.g. .b.c matches
a.b.c). Patch by Milan Oberkirch.

@item 
bpo-28961@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28961}: Fix unittest.mock._Call helper: don’t ignore the name parameter
anymore. Patch written by Jiajun Huang.

@item 
bpo-15812@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15812}: inspect.getframeinfo() now correctly shows the first line of a
context. Patch by Sam Breese.

@item 
bpo-28985@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28985}: Update authorizer constants in sqlite3 module. Patch by
Dingyuan Wang.

@item 
bpo-29079@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29079}: Prevent infinite loop in pathlib.resolve() on Windows

@item 
bpo-13051@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13051}: Fixed recursion errors in large or resized
curses.textpad.Textbox.  Based on patch by Tycho Andersen.

@item 
bpo-9770@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9770}: curses.ascii predicates now work correctly with negative
integers.

@item 
bpo-28427@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28427}: old keys should not remove new values from WeakValueDictionary
when collecting from another thread.

@item 
bpo-28923@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28923}: Remove editor artifacts from Tix.py.

@item 
bpo-28871@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28871}: Fixed a crash when deallocate deep ElementTree.

@item 
bpo-19542@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19542}: Fix bugs in WeakValueDictionary.setdefault() and
WeakValueDictionary.pop() when a GC collection happens in another thread.

@item 
bpo-20191@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20191}: Fixed a crash in resource.prlimit() when passing a sequence
that doesn’t own its elements as limits.

@item 
bpo-16255@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16255}: subprocess.Popen uses /system/bin/sh on Android as the shell,
instead of /bin/sh.

@item 
bpo-28779@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28779}: multiprocessing.set_forkserver_preload() would crash the
forkserver process if a preloaded module instantiated some multiprocessing
objects such as locks.

@item 
bpo-26937@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26937}: The chown() method of the tarfile.TarFile class does not fail
now when the grp module cannot be imported, as for example on Android
platforms.

@item 
bpo-28847@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28847}: dbm.dumb now supports reading read-only files and no longer
writes the index file when it is not changed.  A deprecation warning is
now emitted if the index file is missed and recreated in the ‘r’ and ‘w’
modes (will be an error in future Python releases).

@item 
bpo-27030@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27030}: Unknown escapes consisting of @code{'\'} and an ASCII letter in
re.sub() replacement templates regular expressions now are errors.

@item 
bpo-28835@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28835}: Fix a regression introduced in warnings.catch_warnings(): call
warnings.showwarning() if it was overridden inside the context manager.

@item 
bpo-27172@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27172}: To assist with upgrades from 2.7, the previously documented
deprecation of @code{inspect.getfullargspec()} has been reversed. This
decision may be revisited again after the Python 2.7 branch is no longer
officially supported.

@item 
bpo-28740@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28740}: Add sys.getandroidapilevel(): return the build time API version
of Android as an integer. Function only available on Android.

@item 
bpo-26273@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26273}: Add new @code{socket.TCP_CONGESTION} (Linux 2.6.13) and
@code{socket.TCP_USER_TIMEOUT} (Linux 2.6.37) constants. Patch written
by Omar Sandoval.

@item 
bpo-28752@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28752}: Restored the __reduce__() methods of datetime objects.

@item 
bpo-28727@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28727}: Regular expression patterns, _sre.SRE_Pattern objects created
by re.compile(), become comparable (only x==y and x!=y operators). This
change should fix the bpo-18383@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18383}: don’t duplicate warning filters when
the warnings module is reloaded (thing usually only done in unit tests).

@item 
bpo-20572@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20572}: Remove the subprocess.Popen.wait endtime parameter.  It was
deprecated in 3.4 and undocumented prior to that.

@item 
bpo-25659@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25659}: In ctypes, prevent a crash calling the from_buffer() and
from_buffer_copy() methods on abstract classes like Array.

@item 
bpo-28548@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28548}: In the “http.server” module, parse the protocol version if
possible, to avoid using HTTP 0.9 in some error responses.

@item 
bpo-19717@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19717}: Makes Path.resolve() succeed on paths that do not exist. Patch
by Vajrasky Kok

@item 
bpo-28563@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28563}: Fixed possible DoS and arbitrary code execution when handle
plural form selections in the gettext module.  The expression parser now
supports exact syntax supported by GNU gettext.

@item 
bpo-28387@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28387}: Fixed possible crash in _io.TextIOWrapper deallocator when the
garbage collector is invoked in other thread.  Based on patch by Sebastian
Cufre.

@item 
bpo-27517@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27517}: LZMA compressor and decompressor no longer raise exceptions if
given empty data twice.  Patch by Benjamin Fogle.

@item 
bpo-28549@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28549}: Fixed segfault in curses’s addch() with ncurses6.

@item 
bpo-28449@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28449}: tarfile.open() with mode “r” or “r:” now tries to open a tar
file with compression before trying to open it without compression.
Otherwise it had 50% chance failed with ignore_zeros=True.

@item 
bpo-23262@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23262}: The webbrowser module now supports Firefox 36+ and derived
browsers.  Based on patch by Oleg Broytman.

@item 
bpo-24241@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24241}: The webbrowser in an X environment now prefers using the
default browser directly. Also, the webbrowser register() function now has
a documented ‘preferred’ argument, to specify browsers to be returned by
get() with no arguments. Patch by David Steele

@item 
bpo-27939@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27939}: Fixed bugs in tkinter.ttk.LabeledScale and tkinter.Scale caused
by representing the scale as float value internally in Tk.  tkinter.IntVar
now works if float value is set to underlying Tk variable.

@item 
bpo-28255@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28255}: calendar.TextCalendar.prweek() no longer prints a space after a
weeks’s calendar.  calendar.TextCalendar.pryear() no longer prints
redundant newline after a year’s calendar.  Based on patch by Xiang Zhang.

@item 
bpo-28255@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28255}: calendar.TextCalendar.prmonth() no longer prints a space at the
start of new line after printing a month’s calendar.  Patch by Xiang
Zhang.

@item 
bpo-20491@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20491}: The textwrap.TextWrapper class now honors non-breaking spaces.
Based on patch by Kaarle Ritvanen.

@item 
bpo-28353@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28353}: os.fwalk() no longer fails on broken links.

@item 
bpo-28430@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28430}: Fix iterator of C implemented asyncio.Future doesn’t accept
non-None value is passed to it.send(val).

@item 
bpo-27025@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27025}: Generated names for Tkinter widgets now start by the “!” prefix
for readability.

@item 
bpo-25464@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25464}: Fixed HList.header_exists() in tkinter.tix module by addin a
workaround to Tix library bug.

@item 
bpo-28488@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28488}: shutil.make_archive() no longer adds entry “./” to ZIP archive.

@item 
bpo-25953@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25953}: re.sub() now raises an error for invalid numerical group
reference in replacement template even if the pattern is not found in the
string.  Error message for invalid group reference now includes the group
index and the position of the reference. Based on patch by SilentGhost.

@item 
bpo-28469@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28469}: timeit now uses the sequence 1, 2, 5, 10, 20, 50,… instead of
1, 10, 100,… for autoranging.

@item 
bpo-28115@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28115}: Command-line interface of the zipfile module now uses argparse.
Added support of long options.

@item 
bpo-18219@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18219}: Optimize csv.DictWriter for large number of columns. Patch by
Mariatta Wijaya.

@item 
bpo-28448@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28448}: Fix C implemented asyncio.Future didn’t work on Windows.

@item 
bpo-23214@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23214}: In the “io” module, the argument to BufferedReader and
BytesIO’s read1() methods is now optional and can be -1, matching the
BufferedIOBase specification.

@item 
bpo-28480@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28480}: Fix error building socket module when multithreading is
disabled.

@item 
bpo-28240@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28240}: timeit: remove @code{-c/--clock} and @code{-t/--time} command line
options which were deprecated since Python 3.3.

@item 
bpo-28240@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28240}: timeit now repeats the benchmarks 5 times instead of only 3 to
make benchmarks more reliable.

@item 
bpo-28240@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28240}: timeit autorange now uses a single loop iteration if the
benchmark takes less than 10 seconds, instead of 10 iterations. “python3
-m timeit -s ‘import time’ ‘time.sleep(1)’” now takes 4 seconds instead of
40 seconds.

@item 
Distutils.sdist now looks for README and setup.py files with case
sensitivity. This behavior matches that found in Setuptools 6.0 and later.
See setuptools 100@footnote{https://github.com/pypa/setuptools/issues/100} for
rationale.

@item 
bpo-24452@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24452}: Make webbrowser support Chrome on Mac OS X. Patch by Ned
Batchelder.

@item 
bpo-20766@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20766}: Fix references leaked by pdb in the handling of SIGINT
handlers.

@item 
bpo-27998@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27998}: Fixed bytes path support in os.scandir() on Windows. Patch by
Eryk Sun.

@item 
bpo-28317@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28317}: The disassembler now decodes FORMAT_VALUE argument.

@item 
bpo-28380@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28380}: unittest.mock Mock autospec functions now properly support
assert_called, assert_not_called, and assert_called_once.

@item 
bpo-28229@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28229}: lzma module now supports pathlib.

@item 
bpo-28321@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28321}: Fixed writing non-BMP characters with binary format in
plistlib.

@item 
bpo-28225@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28225}: bz2 module now supports pathlib.  Initial patch by Ethan
Furman.

@item 
bpo-28227@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28227}: gzip now supports pathlib.  Patch by Ethan Furman.

@item 
bpo-28332@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28332}: Deprecated silent truncations in socket.htons and socket.ntohs.
Original patch by Oren Milman.

@item 
bpo-27358@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27358}: Optimized merging var-keyword arguments and improved error
message when passing a non-mapping as a var-keyword argument.

@item 
bpo-28257@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28257}: Improved error message when passing a non-iterable as a
var-positional argument.  Added opcode BUILD_TUPLE_UNPACK_WITH_CALL.

@item 
bpo-28322@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28322}: Fixed possible crashes when unpickle itertools objects from
incorrect pickle data.  Based on patch by John Leitch.

@item 
bpo-28228@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28228}: imghdr now supports pathlib.

@item 
bpo-28226@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28226}: compileall now supports pathlib.

@item 
bpo-28314@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28314}: Fix function declaration (C flags) for the getiterator() method
of xml.etree.ElementTree.Element.

@item 
bpo-28148@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28148}: Stop using localtime() and gmtime() in the time module.
Introduced platform independent _PyTime_localtime API that is similar to
POSIX localtime_r, but available on all platforms.  Patch by Ed Schouten.

@item 
bpo-28253@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28253}: Fixed calendar functions for extreme months: 0001-01 and
9999-12. Methods itermonthdays() and itermonthdays2() are reimplemented so
that they don’t call itermonthdates() which can cause datetime.date
under/overflow.

@item 
bpo-28275@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28275}: Fixed possible use after free in the decompress() methods of
the LZMADecompressor and BZ2Decompressor classes. Original patch by John
Leitch.

@item 
bpo-27897@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27897}: Fixed possible crash in sqlite3.Connection.create_collation()
if pass invalid string-like object as a name.  Patch by Xiang Zhang.

@item 
bpo-18844@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18844}: random.choices() now has k as a keyword-only argument to
improve the readability of common cases and come into line with the
signature used in other languages.

@item 
bpo-18893@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18893}: Fix invalid exception handling in Lib/ctypes/macholib/dyld.py.
Patch by Madison May.

@item 
bpo-27611@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27611}: Fixed support of default root window in the tkinter.tix module.
Added the master parameter in the DisplayStyle constructor.

@item 
bpo-27348@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27348}: In the traceback module, restore the formatting of exception
messages like “Exception: None”.  This fixes a regression introduced in
3.5a2.

@item 
bpo-25651@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25651}: Allow false values to be used for msg parameter of subTest().

@item 
bpo-27778@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27778}: Fix a memory leak in os.getrandom() when the getrandom() is
interrupted by a signal and a signal handler raises a Python exception.

@item 
bpo-28200@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28200}: Fix memory leak on Windows in the os module (fix
path_converter() function).

@item 
bpo-25400@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25400}: RobotFileParser now correctly returns default values for
crawl_delay and request_rate.  Initial patch by Peter Wirtz.

@item 
bpo-27932@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27932}: Prevent memory leak in win32_ver().

@item 
Fix UnboundLocalError in socket._sendfile_use_sendfile.

@item 
bpo-28075@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28075}: Check for ERROR_ACCESS_DENIED in Windows implementation of
os.stat().  Patch by Eryk Sun.

@item 
bpo-22493@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22493}: Warning message emitted by using inline flags in the middle of
regular expression now contains a (truncated) regex pattern. Patch by Tim
Graham.

@item 
bpo-25270@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25270}: Prevent codecs.escape_encode() from raising SystemError when an
empty bytestring is passed.

@item 
bpo-28181@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28181}: Get antigravity over HTTPS. Patch by Kaartic Sivaraam.

@item 
bpo-25895@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25895}: Enable WebSocket URL schemes in urllib.parse.urljoin. Patch by
Gergely Imreh and Markus Holtermann.

@item 
bpo-28114@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28114}: Fix a crash in parse_envlist() when env contains byte strings.
Patch by Eryk Sun.

@item 
bpo-27599@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27599}: Fixed buffer overrun in binascii.b2a_qp() and
binascii.a2b_qp().

@item 
bpo-27906@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27906}: Fix socket accept exhaustion during high TCP traffic. Patch by
Kevin Conway.

@item 
bpo-28174@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28174}: Handle when SO_REUSEPORT isn’t properly supported. Patch by
Seth Michael Larson.

@item 
bpo-26654@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26654}: Inspect functools.partial in asyncio.Handle.__repr__. Patch by
iceboy.

@item 
bpo-26909@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26909}: Fix slow pipes IO in asyncio. Patch by INADA Naoki.

@item 
bpo-28176@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28176}: Fix callbacks race in asyncio.SelectorLoop.sock_connect.

@item 
bpo-27759@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27759}: Fix selectors incorrectly retain invalid file descriptors.
Patch by Mark Williams.

@item 
bpo-28325@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28325}: Remove vestigial MacOS 9 macurl2path module and its tests.

@item 
bpo-28368@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28368}: Refuse monitoring processes if the child watcher has no loop
attached. Patch by Vincent Michel.

@item 
bpo-28369@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28369}: Raise RuntimeError when transport’s FD is used with add_reader,
add_writer, etc.

@item 
bpo-28370@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28370}: Speedup asyncio.StreamReader.readexactly. Patch by Коренберг
Марк.

@item 
bpo-28371@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28371}: Deprecate passing asyncio.Handles to run_in_executor.

@item 
bpo-28372@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28372}: Fix asyncio to support formatting of non-python coroutines.

@item 
bpo-28399@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28399}: Remove UNIX socket from FS before binding. Patch by Коренберг
Марк.

@item 
bpo-27972@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27972}: Prohibit Tasks to await on themselves.

@item 
bpo-24142@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24142}: Reading a corrupt config file left configparser in an invalid
state. Original patch by Florian Höch.

@item 
bpo-29581@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29581}: ABCMeta.__new__ now accepts @code{**kwargs}, allowing abstract
base classes to use keyword parameters in __init_subclass__. Patch by Nate
Soares.

@item 
bpo-25532@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25532}: inspect.unwrap() will now only try to unwrap an object
sys.getrecursionlimit() times, to protect against objects which create a
new object on every attribute access.

@item 
bpo-30177@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30177}: path.resolve(strict=False) no longer cuts the path after the
first element not present in the filesystem.  Patch by Antoine Pietri.
@end itemize

@node Documentation<69>,Tests<66>,Library<177>,Python 3 7 0 alpha 1
@anchor{whatsnew/changelog id869}@anchor{1edb}
@subsubsection Documentation



@itemize -

@item 
bpo-31294@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31294}: Fix incomplete code snippet in the ZeroMQSocketListener and
ZeroMQSocketHandler examples and adapt them to Python 3.

@item 
bpo-21649@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21649}: Add RFC 7525 and Mozilla server side TLS links to SSL
documentation.

@item 
bpo-31128@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31128}: Allow the pydoc server to bind to arbitrary hostnames.

@item 
bpo-30803@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30803}: Clarify doc on truth value testing. Original patch by Peter
Thomassen.

@item 
bpo-30176@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30176}: Add missing attribute related constants in curses
documentation.

@item 
bpo-30052@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30052}: the link targets for @ref{193,,bytes()} and @ref{342,,bytearray()} are
now their respective type definitions, rather than the corresponding
builtin function entries. Use @ref{1edc,,bytes} and
@ref{1edd,,bytearray} to reference the latter. In order to
ensure this and future cross-reference updates are applied automatically,
the daily documentation builds now disable the default output caching
features in Sphinx.

@item 
bpo-26985@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26985}: Add missing info of code object in inspect documentation.

@item 
bpo-19824@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19824}: Improve the documentation for, and links to, template strings
by emphasizing their utility for internationalization, and by clarifying
some usage constraints. (See also: bpo-20314@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20314}, bpo-12518@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12518})

@item 
bpo-28929@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28929}: Link the documentation to its source file on GitHub.

@item 
bpo-25008@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25008}: Document smtpd.py as effectively deprecated and add a pointer
to aiosmtpd, a third-party asyncio-based replacement.

@item 
bpo-26355@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26355}: Add canonical header link on each page to corresponding major
version of the documentation. Patch by Matthias Bussonnier.

@item 
bpo-29349@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29349}: Fix Python 2 syntax in code for building the documentation.

@item 
bpo-23722@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23722}: The data model reference and the porting section in the 3.6
What’s New guide now cover the additional @code{__classcell__} handling
needed for custom metaclasses to fully support 
@geindex Python Enhancement Proposals; PEP 487
PEP 487@footnote{https://peps.python.org/pep-0487/} and
zero-argument @code{super()}.

@item 
bpo-28513@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28513}: Documented command-line interface of zipfile.
@end itemize

@node Tests<66>,Build<74>,Documentation<69>,Python 3 7 0 alpha 1
@anchor{whatsnew/changelog id870}@anchor{1ede}
@subsubsection Tests



@itemize -

@item 
bpo-29639@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29639}: test.support.HOST is now “localhost”, a new HOSTv4 constant has
been added for your @code{127.0.0.1} needs, similar to the existing HOSTv6
constant.

@item 
bpo-31320@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31320}: Silence traceback in test_ssl

@item 
bpo-31346@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31346}: Prefer PROTOCOL_TLS_CLIENT and PROTOCOL_TLS_SERVER protocols
for SSLContext.

@item 
bpo-25674@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25674}: Remove sha256.tbs-internet.com ssl test

@item 
bpo-30715@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30715}: Address ALPN callback changes for OpenSSL 1.1.0f. The latest
version behaves like OpenSSL 1.0.2 and no longer aborts handshake.

@item 
bpo-30822@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30822}: regrtest: Exclude tzdata from regrtest –all. When running the
test suite using –use=all / -u all, exclude tzdata since it makes
test_datetime too slow (15-20 min on some buildbots) which then times out
on some buildbots. Fix also regrtest command line parser to allow passing
-u extralargefile to run test_zipfile64.

@item 
bpo-30695@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30695}: Add the @code{set_nomemory(start, stop)} and
@code{remove_mem_hooks()} functions to the @code{_testcapi} module.

@item 
bpo-30357@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30357}: test_thread: setUp() now uses support.threading_setup() and
support.threading_cleanup() to wait until threads complete to avoid random
side effects on following tests. Initial patch written by Grzegorz
Grzywacz.

@item 
bpo-30197@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30197}: Enhanced functions swap_attr() and swap_item() in the
test.support module. They now work when delete replaced attribute or item
inside the with statement.  The old value of the attribute or item (or
None if it doesn’t exist) now will be assigned to the target of the “as”
clause, if there is one.

@item 
bpo-24932@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24932}: Use proper command line parsing in _testembed

@item 
bpo-28950@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28950}: Disallow -j0 to be combined with -T/-l in regrtest command line
arguments.

@item 
bpo-28683@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28683}: Fix the tests that bind() a unix socket and raise
PermissionError on Android for a non-root user.

@item 
bpo-26936@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26936}: Fix the test_socket failures on Android - getservbyname(),
getservbyport() and getaddrinfo() are broken on some Android API levels.

@item 
bpo-28666@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28666}: Now test.support.rmtree is able to remove unwritable or
unreadable directories.

@item 
bpo-23839@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23839}: Various caches now are cleared before running every test file.

@item 
bpo-26944@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26944}: Fix test_posix for Android where ‘id -G’ is entirely wrong or
missing the effective gid.

@item 
bpo-28409@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28409}: regrtest: fix the parser of command line arguments.

@item 
bpo-28217@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28217}: Adds _testconsole module to test console input.

@item 
bpo-26939@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26939}: Add the support.setswitchinterval() function to fix
test_functools hanging on the Android armv7 qemu emulator.
@end itemize

@node Build<74>,Windows<65>,Tests<66>,Python 3 7 0 alpha 1
@anchor{whatsnew/changelog id871}@anchor{1edf}
@subsubsection Build



@itemize -

@item 
bpo-31354@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31354}: Allow @code{--with-lto} to be used on all builds, not just @code{make
profile-opt}.

@item 
bpo-31370@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31370}: Remove support for building –without-threads. This option is
not really useful anymore in the 21st century. Removing lots of
conditional paths allows us to simplify the code base, including in
difficult to maintain low-level internal code.

@item 
bpo-31341@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31341}: Per 
@geindex Python Enhancement Proposals; PEP 11
PEP 11@footnote{https://peps.python.org/pep-0011/}, support for the IRIX operating system was
removed.

@item 
bpo-30854@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30854}: Fix compile error when compiling –without-threads. Patch by
Masayuki Yamamoto.

@item 
bpo-30687@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30687}: Locate msbuild.exe on Windows when building rather than
vcvarsall.bat

@item 
bpo-20210@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20210}: Support the `disabled' marker in Setup files. Extension modules
listed after this marker are not built at all, neither by the Makefile nor
by setup.py.

@item 
bpo-29941@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29941}: Add @code{--with-assertions} configure flag to explicitly enable C
@code{assert()} checks. Defaults to off. @code{--with-pydebug} implies
@code{--with-assertions}.

@item 
bpo-28787@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28787}: Fix out-of-tree builds of Python when configured with
@code{--with--dtrace}.

@item 
bpo-29243@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29243}: Prevent unnecessary rebuilding of Python during @code{make test},
@code{make install} and some other make targets when configured with
@code{--enable-optimizations}.

@item 
bpo-23404@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23404}: Don’t regenerate generated files based on file modification
time anymore: the action is now explicit. Replace @code{make touch} with
@code{make regen-all}.

@item 
bpo-29643@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29643}: Fix @code{--enable-optimization} didn’t work.

@item 
bpo-27593@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27593}: sys.version and the platform module python_build(),
python_branch(), and python_revision() functions now use git information
rather than hg when building from a repo.

@item 
bpo-29572@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29572}: Update Windows build and OS X installers to use OpenSSL 1.0.2k.

@item 
bpo-27659@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27659}: Prohibit implicit C function declarations: use
@code{-Werror=implicit-function-declaration} when possible (GCC and Clang,
but it depends on the compiler version). Patch written by Chi Hsuan Yen.

@item 
bpo-29384@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29384}: Remove old Be OS helper scripts.

@item 
bpo-26851@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26851}: Set Android compilation and link flags.

@item 
bpo-28768@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28768}: Fix implicit declaration of function _setmode. Patch by
Masayuki Yamamoto

@item 
bpo-29080@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29080}: Removes hard dependency on hg.exe from PCBuild/build.bat

@item 
bpo-23903@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23903}: Added missed names to PC/python3.def.

@item 
bpo-28762@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28762}: lockf() is available on Android API level 24, but the F_LOCK
macro is not defined in android-ndk-r13.

@item 
bpo-28538@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28538}: Fix the compilation error that occurs because if_nameindex() is
available on Android API level 24, but the if_nameindex structure is not
defined.

@item 
bpo-20211@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20211}: Do not add the directory for installing C header files and the
directory for installing object code libraries to the cross compilation
search paths. Original patch by Thomas Petazzoni.

@item 
bpo-28849@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28849}: Do not define sys.implementation._multiarch on Android.

@item 
bpo-10656@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10656}: Fix out-of-tree building on AIX.  Patch by Tristan Carel and
Michael Haubenwallner.

@item 
bpo-26359@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26359}: Rename –with-optimiations to –enable-optimizations.

@item 
bpo-28444@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28444}: Fix missing extensions modules when cross compiling.

@item 
bpo-28208@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28208}: Update Windows build and OS X installers to use SQLite 3.14.2.

@item 
bpo-28248@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28248}: Update Windows build and OS X installers to use OpenSSL 1.0.2j.

@item 
bpo-21124@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21124}: Fix building the _struct module on Cygwin by passing @code{NULL}
instead of @code{&PyType_Type} to PyVarObject_HEAD_INIT.  Patch by Masayuki
Yamamoto.

@item 
bpo-13756@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13756}: Fix building extensions modules on Cygwin.  Patch by Roumen
Petrov, based on original patch by Jason Tishler.

@item 
bpo-21085@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21085}: Add configure check for siginfo_t.si_band, which Cygwin does
not provide. Patch by Masayuki Yamamoto with review and rebase by Erik
Bray.

@item 
bpo-28258@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28258}: Fixed build with Estonian locale (python-config and distclean
targets in Makefile).  Patch by Arfrever Frehtes Taifersar Arahesis.

@item 
bpo-26661@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26661}: setup.py now detects system libffi with multiarch wrapper.

@item 
bpo-27979@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27979}: A full copy of libffi is no longer bundled for use when
building _ctypes on non-OSX UNIX platforms.  An installed copy of libffi
is now required when building _ctypes on such platforms.

@item 
bpo-15819@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15819}: Remove redundant include search directory option for building
outside the source tree.

@item 
bpo-28676@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28676}: Prevent missing ‘getentropy’ declaration warning on macOS.
Patch by Gareth Rees.
@end itemize

@node Windows<65>,IDLE<46>,Build<74>,Python 3 7 0 alpha 1
@anchor{whatsnew/changelog id872}@anchor{1ee0}
@subsubsection Windows



@itemize -

@item 
bpo-31392@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31392}: Update Windows build to use OpenSSL 1.1.0f

@item 
bpo-30389@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30389}: Adds detection of Visual Studio 2017 to distutils on Windows.

@item 
bpo-31358@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31358}: zlib is no longer bundled in the CPython source, instead it is
downloaded on demand just like bz2, lzma, OpenSSL, Tcl/Tk, and SQLite.

@item 
bpo-31340@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31340}: Change to building with MSVC v141 (included with Visual Studio
2017)

@item 
bpo-30581@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30581}: os.cpu_count() now returns the correct number of processors on
Windows when the number of logical processors is greater than 64.

@item 
bpo-30916@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30916}: Pre-build OpenSSL, Tcl and Tk and include the binaries in the
build.

@item 
bpo-30731@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30731}: Add a missing xmlns to python.manifest so that it matches the
schema.

@item 
bpo-30291@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30291}: Allow requiring 64-bit interpreters from py.exe using -64
suffix. Contributed by Steve (Gadget) Barnes.

@item 
bpo-30362@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30362}: Adds list options (-0, -0p) to py.exe launcher. Contributed by
Steve Barnes.

@item 
bpo-23451@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23451}: Fix socket deprecation warnings in socketmodule.c. Patch by
Segev Finer.

@item 
bpo-30450@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30450}: The build process on Windows no longer depends on Subversion,
instead pulling external code from GitHub via a Python script.  If Python
3.6 is not found on the system (via @code{py -3.6}), NuGet is used to
download a copy of 32-bit Python.

@item 
bpo-29579@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29579}: Removes readme.txt from the installer.

@item 
bpo-25778@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25778}: winreg does not truncate string correctly (Patch by Eryk Sun)

@item 
bpo-28896@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28896}: Deprecate WindowsRegistryFinder and disable it by default

@item 
bpo-28522@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28522}: Fixes mishandled buffer reallocation in getpathp.c

@item 
bpo-28402@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28402}: Adds signed catalog files for stdlib on Windows.

@item 
bpo-28333@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28333}: Enables Unicode for ps1/ps2 and input() prompts. (Patch by Eryk
Sun)

@item 
bpo-28251@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28251}: Improvements to help manuals on Windows.

@item 
bpo-28110@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28110}: launcher.msi has different product codes between 32-bit and
64-bit

@item 
bpo-28161@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28161}: Opening CON for write access fails

@item 
bpo-28162@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28162}: WindowsConsoleIO readall() fails if first line starts with
Ctrl+Z

@item 
bpo-28163@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28163}: WindowsConsoleIO fileno() passes wrong flags to _open_osfhandle

@item 
bpo-28164@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28164}: _PyIO_get_console_type fails for various paths

@item 
bpo-28137@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28137}: Renames Windows path file to ._pth

@item 
bpo-28138@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28138}: Windows ._pth file should allow import site
@end itemize

@node IDLE<46>,Tools/Demos<43>,Windows<65>,Python 3 7 0 alpha 1
@anchor{whatsnew/changelog id873}@anchor{1ee1}
@subsubsection IDLE



@itemize -

@item 
bpo-31493@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31493}: IDLE code context – fix code update and font update timers.
Canceling timers prevents a warning message when test_idle completes.

@item 
bpo-31488@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31488}: IDLE - Update non-key options in former extension classes. When
applying configdialog changes, call .reload for each feature class. Change
ParenMatch so updated options affect existing instances attached to
existing editor windows.

@item 
bpo-31477@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31477}: IDLE - Improve rstrip entry in doc. Strip trailing whitespace
strips more than blank spaces.  Multiline string literals are not skipped.

@item 
bpo-31480@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31480}: IDLE - make tests pass with zzdummy extension disabled by
default.

@item 
bpo-31421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31421}: Document how IDLE runs tkinter programs. IDLE calls tcl/tk
update in the background in order to make live interaction and
experimentation with tkinter applications much easier.

@item 
bpo-31414@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31414}: IDLE – fix tk entry box tests by deleting first. Adding to an
int entry is not the same as deleting and inserting because int(‘’) will
fail.

@item 
bpo-31051@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31051}: Rearrange IDLE configdialog GenPage into Window, Editor, and
Help sections.

@item 
bpo-30617@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30617}: IDLE - Add docstrings and tests for outwin subclass of editor.
Move some data and functions from the class to module level. Patch by
Cheryl Sabella.

@item 
bpo-31287@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31287}: IDLE - Do not modify tkinter.message in test_configdialog.

@item 
bpo-27099@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27099}: Convert IDLE’s built-in ‘extensions’ to regular features. About
10 IDLE features were implemented as supposedly optional extensions. Their
different behavior could be confusing or worse for users and not good for
maintenance. Hence the conversion. The main difference for users is that
user configurable key bindings for builtin features are now handled
uniformly. Now, editing a binding in a keyset only affects its value in
the keyset. All bindings are defined together in the system-specific
default keysets in config-extensions.def. All custom keysets are saved as
a whole in config-extension.cfg.  All take effect as soon as one clicks
Apply or Ok. The affected events are ‘<<force-open-completions>>’,
‘<<expand-word>>’, ‘<<force-open-calltip>>’, ‘<<flash-paren>>’,
‘<<format-paragraph>>’, ‘<<run-module>>’, ‘<<check-module>>’, and
‘<<zoom-height>>’.  Any (global) customizations made before 3.6.3 will not
affect their keyset-specific customization after 3.6.3. and vice versa.
Initial patch by Charles Wohlganger.

@item 
bpo-31206@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31206}: IDLE: Factor HighPage(Frame) class from ConfigDialog. Patch by
Cheryl Sabella.

@item 
bpo-31001@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31001}: Add tests for configdialog highlight tab.  Patch by Cheryl
Sabella.

@item 
bpo-31205@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31205}: IDLE: Factor KeysPage(Frame) class from ConfigDialog.  The
slightly modified tests continue to pass.  Patch by Cheryl Sabella.

@item 
bpo-31130@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31130}: IDLE – stop leaks in test_configdialog. Initial patch by
Victor Stinner.

@item 
bpo-31002@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31002}: Add tests for configdialog keys tab. Patch by Cheryl Sabella.

@item 
bpo-19903@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19903}: IDLE: Calltips use @code{inspect.signature} instead of
@code{inspect.getfullargspec}. This improves calltips for builtins converted
to use Argument Clinic. Patch by Louie Lu.

@item 
bpo-31083@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31083}: IDLE - Add an outline of a TabPage class in configdialog.
Update existing classes to match outline. Initial patch by Cheryl Sabella.

@item 
bpo-31050@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31050}: Factor GenPage(Frame) class from ConfigDialog. The slightly
modified tests continue to pass. Patch by Cheryl Sabella.

@item 
bpo-31004@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31004}: IDLE - Factor FontPage(Frame) class from ConfigDialog. Slightly
modified tests continue to pass. Fix General tests. Patch mostly by Cheryl
Sabella.

@item 
bpo-30781@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30781}: IDLE - Use ttk widgets in ConfigDialog. Patches by Terry Jan
Reedy and Cheryl Sabella.

@item 
bpo-31060@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31060}: IDLE - Finish rearranging methods of ConfigDialog Grouping
methods pertaining to each tab and the buttons will aid writing tests and
improving the tabs and will enable splitting the groups into classes.

@item 
bpo-30853@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30853}: IDLE – Factor a VarTrace class out of ConfigDialog. Instance
tracers manages pairs consisting of a tk variable and a callback function.
When tracing is turned on, setting the variable calls the function.  Test
coverage for the new class is 100%.

@item 
bpo-31003@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31003}: IDLE: Add more tests for General tab.

@item 
bpo-30993@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30993}: IDLE - Improve configdialog font page and tests. In
configdialog: Document causal pathways in create_font_tab docstring.
Simplify some attribute names. Move set_samples calls to var_changed_font
(idea from Cheryl Sabella).  Move related functions to positions after the
create widgets function. In test_configdialog: Fix test_font_set so not
order dependent.  Fix renamed test_indent_scale so it tests the widget.
Adjust tests for movement of set_samples call.  Add tests for load
functions.  Put all font tests in one class and tab indent tests in
another.  Except for two lines, these tests completely cover the related
functions.

@item 
bpo-30981@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30981}: IDLE – Add more configdialog font page tests.

@item 
bpo-28523@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28523}: IDLE: replace ‘colour’ with ‘color’ in configdialog.

@item 
bpo-30917@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30917}: Add tests for idlelib.config.IdleConf. Increase coverage from
46% to 96%. Patch by Louie Lu.

@item 
bpo-30934@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30934}: Document coverage details for idlelib tests. Add section to
idlelib/idle-test/README.txt. Include check that branches are taken both
ways. Exclude IDLE-specific code that does not run during unit tests.

@item 
bpo-30913@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30913}: IDLE: Document ConfigDialog tk Vars, methods, and widgets in
docstrings This will facilitate improving the dialog and splitting up the
class. Original patch by Cheryl Sabella.

@item 
bpo-30899@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30899}: IDLE: Add tests for ConfigParser subclasses in config. Patch by
Louie Lu.

@item 
bpo-30881@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30881}: IDLE: Add docstrings to browser.py. Patch by Cheryl Sabella.

@item 
bpo-30851@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30851}: IDLE: Remove unused variables in configdialog.  One is a
duplicate, one is set but cannot be altered by users. Patch by Cheryl
Sabella.

@item 
bpo-30870@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30870}: IDLE: In Settings dialog, select font with Up, Down keys as
well as mouse. Initial patch by Louie Lu.

@item 
bpo-8231@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8231}: IDLE: call config.IdleConf.GetUserCfgDir only once.

@item 
bpo-30779@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30779}: IDLE: Factor ConfigChanges class from configdialog, put in
config; test. * In config, put dump test code in a function; run it and
unittest in   ‘if __name__ == ‘__main__’. * Add class config.ConfigChanges
based on changes_class_v4.py on bpo issue. * Add class
test_config.ChangesTest, partly using configdialog_tests_v1.py. * Revise
configdialog to use ConfigChanges; see tracker msg297804. * Revise
test_configdialog to match configdialog changes. * Remove configdialog
functions unused or moved to ConfigChanges. Cheryl Sabella contributed
parts of the patch.

@item 
bpo-30777@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30777}: IDLE: configdialog - Add docstrings and fix comments. Patch by
Cheryl Sabella.

@item 
bpo-30495@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30495}: IDLE: Improve textview with docstrings, PEP8 names, and more
tests. Patch by Cheryl Sabella.

@item 
bpo-30723@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30723}: IDLE: Make several improvements to parenmatch. Add ‘parens’
style to highlight both opener and closer. Make ‘default’ style, which is
not default, a synonym for ‘opener’. Make time-delay work the same with
all styles. Add help for config dialog extensions tab, including help for
parenmatch. Add new tests.  Original patch by Charles Wohlganger.

@item 
bpo-30674@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30674}: IDLE: add docstrings to grep module. Patch by Cheryl Sabella

@item 
bpo-21519@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21519}: IDLE’s basic custom key entry dialog now detects duplicates
properly. Original patch by Saimadhav Heblikar.

@item 
bpo-29910@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29910}: IDLE no longer deletes a character after commenting out a
region by a key shortcut.  Add @code{return 'break'} for this and other
potential conflicts between IDLE and default key bindings.

@item 
bpo-30728@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30728}: Review and change idlelib.configdialog names. Lowercase method
and attribute names. Replace ‘colour’ with ‘color’, expand overly cryptic
names, delete unneeded underscores. Replace @code{import *} with specific
imports. Patches by Cheryl Sabella.

@item 
bpo-6739@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6739}: IDLE: Verify user-entered key sequences by trying to bind them
with tk. Add tests for all 3 validation functions. Original patch by G
Polo.  Tests added by Cheryl Sabella.

@item 
bpo-15786@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15786}: Fix several problems with IDLE’s autocompletion box. The
following should now work: clicking on selection box items; using the
scrollbar; selecting an item by hitting Return. Hangs on MacOSX should no
longer happen. Patch by Louie Lu.

@item 
bpo-25514@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25514}: Add doc subsubsection about IDLE failure to start. Popup
no-connection message directs users to this section.

@item 
bpo-30642@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30642}: Fix reference leaks in IDLE tests. Patches by Louie Lu and
Terry Jan Reedy.

@item 
bpo-30495@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30495}: Add docstrings for textview.py and use PEP8 names. Patches by
Cheryl Sabella and Terry Jan Reedy.

@item 
bpo-30290@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30290}: Help-about: use pep8 names and add tests. Increase coverage to
100%. Patches by Louie Lu, Cheryl Sabella, and Terry Jan Reedy.

@item 
bpo-30303@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30303}: Add _utest option to textview; add new tests. Increase coverage
to 100%. Patches by Louie Lu and Terry Jan Reedy.

@item 
bpo-29071@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29071}: IDLE colors f-string prefixes (but not invalid ur prefixes).

@item 
bpo-28572@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28572}: Add 10% to coverage of IDLE’s test_configdialog. Update and
augment description of the configuration system.
@end itemize

@node Tools/Demos<43>,C API<66>,IDLE<46>,Python 3 7 0 alpha 1
@anchor{whatsnew/changelog id874}@anchor{1ee2}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-30983@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30983}: gdb integration commands (py-bt, etc.) work on optimized shared
builds now, too.  
@geindex Python Enhancement Proposals; PEP 523
PEP 523@footnote{https://peps.python.org/pep-0523/} introduced _PyEval_EvalFrameDefault which
inlines PyEval_EvalFrameEx on non-debug shared builds.  This broke the
ability to use py-bt, py-up, and a few other Python-specific gdb
integrations. The problem is fixed by only looking for
_PyEval_EvalFrameDefault frames in python-gdb.py.  Original patch by Bruno
“Polaco” Penteado.

@item 
bpo-29748@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29748}: Added the slice index converter in Argument Clinic.

@item 
bpo-24037@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24037}: Argument Clinic now uses the converter @code{bool(accept=@{int@})}
rather than @code{int} for semantical booleans.  This avoids repeating the
default value for Python and C and will help in converting to @code{bool} in
future.

@item 
bpo-29367@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29367}: python-gdb.py now supports also @code{method-wrapper}
(@code{wrapperobject}) objects.

@item 
bpo-28023@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28023}: Fix python-gdb.py didn’t support new dict implementation.

@item 
bpo-15369@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15369}: The pybench and pystone microbenchmark have been removed from
Tools. Please use the new Python benchmark suite
@indicateurl{https://github.com/python/pyperformance} which is more reliable and
includes a portable version of pybench working on Python 2 and Python 3.

@item 
bpo-28102@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28102}: The zipfile module CLI now prints usage to stderr. Patch by
Stephen J. Turnbull.
@end itemize

@node C API<66>,,Tools/Demos<43>,Python 3 7 0 alpha 1
@anchor{whatsnew/changelog id875}@anchor{1ee3}
@subsubsection C API



@itemize -

@item 
bpo-31338@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31338}: Added the @code{Py_UNREACHABLE()} macro for code paths which are
never expected to be reached.  This and a few other useful macros are now
documented in the C API manual.

@item 
bpo-30832@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30832}: Remove own implementation for thread-local storage. CPython has
provided the own implementation for thread-local storage (TLS) on
Python/thread.c, it’s used in the case which a platform has not supplied
native TLS.  However, currently all supported platforms (Windows and
pthreads) have provided native TLS and defined the Py_HAVE_NATIVE_TLS
macro with unconditional in any case.

@item 
bpo-30708@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30708}: PyUnicode_AsWideCharString() now raises a ValueError if the
second argument is NULL and the wchar_t* string contains null characters.

@item 
bpo-16500@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16500}: Deprecate PyOS_AfterFork() and add PyOS_BeforeFork(),
PyOS_AfterFork_Parent() and PyOS_AfterFork_Child().

@item 
bpo-6532@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6532}: The type of results of PyThread_start_new_thread() and
PyThread_get_thread_ident(), and the id parameter of
PyThreadState_SetAsyncExc() changed from “long” to “unsigned long”.

@item 
bpo-27867@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27867}: Function PySlice_GetIndicesEx() is deprecated and replaced with
a macro if Py_LIMITED_API is not set or set to the value between
0x03050400 and 0x03060000 (not including) or 0x03060100 or higher.  Added
functions PySlice_Unpack() and PySlice_AdjustIndices().

@item 
bpo-29083@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29083}: Fixed the declaration of some public API functions.
PyArg_VaParse() and PyArg_VaParseTupleAndKeywords() were not available in
limited API. PyArg_ValidateKeywordArguments(), PyArg_UnpackTuple() and
Py_BuildValue() were not available in limited API of version < 3.3 when
PY_SSIZE_T_CLEAN is defined.

@item 
bpo-28769@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28769}: The result of PyUnicode_AsUTF8AndSize() and PyUnicode_AsUTF8()
is now of type @code{const char *} rather of @code{char *}.

@item 
bpo-29058@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29058}: All stable API extensions added after Python 3.2 are now
available only when Py_LIMITED_API is set to the PY_VERSION_HEX value of
the minimum Python version supporting this API.

@item 
bpo-28822@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28822}: The index parameters `start' and `end' of PyUnicode_FindChar()
are now adjusted to behave like @code{str[start:end]}.

@item 
bpo-28808@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28808}: PyUnicode_CompareWithASCIIString() now never raises exceptions.

@item 
bpo-28761@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28761}: The fields name and doc of structures PyMemberDef, PyGetSetDef,
PyStructSequence_Field, PyStructSequence_Desc, and wrapperbase are now of
type @code{const char *} rather of @code{char *}.

@item 
bpo-28748@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28748}: Private variable _Py_PackageContext is now of type @code{const char
*} rather of @code{char *}.

@item 
bpo-19569@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19569}: Compiler warnings are now emitted if use most of deprecated
functions.

@item 
bpo-28426@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28426}: Deprecated undocumented functions PyUnicode_AsEncodedObject(),
PyUnicode_AsDecodedObject(), PyUnicode_AsDecodedUnicode() and
PyUnicode_AsEncodedUnicode().
@end itemize

@node Python 3 6 6 final,Python 3 6 6 release candidate 1,Python 3 7 0 alpha 1,Changelog
@anchor{whatsnew/changelog python-3-6-6-final}@anchor{1ee4}
@subsection Python 3.6.6 final


`Release date: 2018-06-27'

There were no new changes in version 3.6.6.

@node Python 3 6 6 release candidate 1,Python 3 6 5 final,Python 3 6 6 final,Changelog
@anchor{whatsnew/changelog python-3-6-6-release-candidate-1}@anchor{1ee5}
@subsection Python 3.6.6 release candidate 1


`Release date: 2018-06-11'

@menu
* Core and Builtins: Core and Builtins<174>. 
* Library: Library<178>. 
* Documentation: Documentation<70>. 
* Tests: Tests<67>. 
* Build: Build<75>. 
* Windows: Windows<66>. 
* macOS: macOS<52>. 
* IDLE: IDLE<47>. 
* Tools/Demos: Tools/Demos<44>. 
* C API: C API<67>. 

@end menu

@node Core and Builtins<174>,Library<178>,,Python 3 6 6 release candidate 1
@anchor{whatsnew/changelog id876}@anchor{1ee6}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-33786@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33786}: Fix asynchronous generators to handle GeneratorExit in athrow()
correctly

@item 
bpo-30654@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30654}: Fixed reset of the SIGINT handler to SIG_DFL on interpreter
shutdown even when there was a custom handler set previously. Patch by
Philipp Kerling.

@item 
bpo-33622@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33622}: Fixed a leak when the garbage collector fails to add an object
with the @code{__del__} method or referenced by it into the
@ref{13cd,,gc.garbage} list. @ref{b8b,,PyGC_Collect()} can now be called when an
exception is set and preserves it.

@item 
bpo-31849@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31849}: Fix signed/unsigned comparison warning in pyhash.c.

@item 
bpo-33391@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33391}: Fix a leak in set_symmetric_difference().

@item 
bpo-28055@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28055}: Fix unaligned accesses in siphash24(). Patch by Rolf Eike Beer.

@item 
bpo-33231@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33231}: Fix potential memory leak in @code{normalizestring()}.

@item 
bpo-29922@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29922}: Improved error messages in ‘async with’ when @code{__aenter__()}
or @code{__aexit__()} return non-awaitable object.

@item 
bpo-33199@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33199}: Fix @code{ma_version_tag} in dict implementation is uninitialized
when copying from key-sharing dict.

@item 
bpo-33041@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33041}: Fixed jumping when the function contains an @code{async for} loop.

@item 
bpo-32282@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32282}: Fix an unnecessary ifdef in the include of VersionHelpers.h in
socketmodule on Windows.

@item 
bpo-21983@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21983}: Fix a crash in @code{ctypes.cast()} in case the type argument is a
ctypes structured data type. Patch by Eryk Sun and Oren Milman.
@end itemize

@node Library<178>,Documentation<70>,Core and Builtins<174>,Python 3 6 6 release candidate 1
@anchor{whatsnew/changelog id877}@anchor{1ee7}
@subsubsection Library



@itemize -

@item 
bpo-30167@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30167}: Prevent site.main() exception if PYTHONSTARTUP is set. Patch by
Steve Weber.

@item 
bpo-33812@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33812}: Datetime instance d with non-None tzinfo, but with
d.tzinfo.utcoffset(d) returning None is now treated as naive by the
astimezone() method.

@item 
bpo-30805@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30805}: Avoid race condition with debug logging

@item 
bpo-33767@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33767}: The concatenation (@code{+}) and repetition (@code{*}) sequence
operations now raise @ref{199,,TypeError} instead of @ref{796,,SystemError} when
performed on @ref{51a,,mmap.mmap} objects.  Patch by Zackery Spytz.

@item 
bpo-32684@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32684}: Fix gather to propagate cancellation of itself even with
return_exceptions.

@item 
bpo-33674@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33674}: Fix a race condition in SSLProtocol.connection_made() of
asyncio.sslproto: start immediately the handshake instead of using
call_soon(). Previously, data_received() could be called before the
handshake started, causing the handshake to hang or fail.

@item 
bpo-31647@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31647}: Fixed bug where calling write_eof() on a
_SelectorSocketTransport after it’s already closed raises AttributeError.

@item 
bpo-33672@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33672}: Fix Task.__repr__ crash with Cython’s bogus coroutines

@item 
bpo-33469@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33469}: Fix RuntimeError after closing loop that used run_in_executor

@item 
bpo-11874@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11874}: Use a better regex when breaking usage into wrappable parts.
Avoids bogus assertion errors from custom metavar strings.

@item 
bpo-30877@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30877}: Fixed a bug in the Python implementation of the JSON decoder
that prevented the cache of parsed strings from clearing after finishing
the decoding. Based on patch by c-fos.

@item 
bpo-33548@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33548}: tempfile._candidate_tempdir_list should consider common TEMP
locations

@item 
bpo-33542@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33542}: Prevent @code{uuid.get_node} from using a DUID instead of a MAC on
Windows. Patch by Zvi Effron

@item 
bpo-26819@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26819}: Fix race condition with @code{ReadTransport.resume_reading} in
Windows proactor event loop.

@item 
bpo-28556@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28556}: Minor fixes in typing module: add annotations to
@code{NamedTuple.__new__}, pass @code{*args} and @code{**kwds} in
@code{Generic.__new__}.  Original PRs by Paulius Šarka and Chad Dombrova.

@item 
bpo-20087@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20087}: Updated alias mapping with glibc 2.27 supported locales.

@item 
bpo-33422@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33422}: Fix trailing quotation marks getting deleted when looking up
byte/string literals on pydoc. Patch by Andrés Delfino.

@item 
bpo-33197@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33197}: Update error message when constructing invalid
inspect.Parameters Patch by Donghee Na.

@item 
bpo-33383@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33383}: Fixed crash in the get() method of the @ref{38,,dbm.ndbm} database
object when it is called with a single argument.

@item 
bpo-33329@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33329}: Fix multiprocessing regression on newer glibcs

@item 
bpo-991266@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=991266}: Fix quoting of the @code{Comment} attribute of
@ref{1e66,,http.cookies.SimpleCookie}.

@item 
bpo-33131@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33131}: Upgrade bundled version of pip to 10.0.1.

@item 
bpo-33308@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33308}: Fixed a crash in the @code{parser} module when converting an ST
object to a tree of tuples or lists with @code{line_info=False} and
@code{col_info=True}.

@item 
bpo-33263@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33263}: Fix FD leak in @code{_SelectorSocketTransport}  Patch by Vlad
Starostin.

@item 
bpo-33256@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33256}: Fix display of @code{<module>} call in the html produced by
@code{cgitb.html()}. Patch by Stéphane Blondon.

@item 
bpo-33203@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33203}: @code{random.Random.choice()} now raises @code{IndexError} for empty
sequences consistently even when called from subclasses without a
@code{getrandbits()} implementation.

@item 
bpo-33224@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33224}: Update difflib.mdiff() for 
@geindex Python Enhancement Proposals; PEP 479
PEP 479@footnote{https://peps.python.org/pep-0479/}.  Convert an uncaught
StopIteration in a generator into a return-statement.

@item 
bpo-33209@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33209}: End framing at the end of C implementation of
@ref{1e67,,pickle.Pickler.dump()}.

@item 
bpo-32861@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32861}: The urllib.robotparser’s @code{__str__} representation now
includes wildcard entries and the “Crawl-delay” and “Request-rate” fields.
Patch by Michael Lazar.

@item 
bpo-33096@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33096}: Allow ttk.Treeview.insert to insert iid that has a false
boolean value. Note iid=0 and iid=False would be same. Patch by Garvit
Khatri.

@item 
bpo-33127@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33127}: The ssl module now compiles with LibreSSL 2.7.1.

@item 
bpo-33021@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33021}: Release the GIL during fstat() calls, avoiding hang of all
threads when calling mmap.mmap(), os.urandom(), and random.seed().  Patch
by Nir Soffer.

@item 
bpo-27683@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27683}: Fix a regression in @ref{84,,ipaddress} that result of
@code{hosts()} is empty when the network is constructed by a tuple
containing an integer mask and only 1 bit left for addresses.

@item 
bpo-32844@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32844}: Fix wrong redirection of a low descriptor (0 or 1) to stderr in
subprocess if another low descriptor is closed.

@item 
bpo-31908@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31908}: Fix output of cover files for @code{trace} module command-line
tool. Previously emitted cover files only when @code{--missing} option was
used. Patch by Michael Selik.

@item 
bpo-31457@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31457}: If nested log adapters are used, the inner @code{process()}
methods are no longer omitted.

@item 
bpo-16865@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16865}: Support arrays >=2GiB in @ref{2e,,ctypes}.  Patch by Segev Finer.

@item 
bpo-31238@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31238}: pydoc: the stop() method of the private ServerThread class now
waits until DocServer.serve_until_quit() completes and then explicitly
sets its docserver attribute to None to break a reference cycle.
@end itemize

@node Documentation<70>,Tests<67>,Library<178>,Python 3 6 6 release candidate 1
@anchor{whatsnew/changelog id878}@anchor{1ee8}
@subsubsection Documentation



@itemize -

@item 
bpo-33503@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33503}: Fix broken pypi link

@item 
bpo-33421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33421}: Add missing documentation for @code{typing.AsyncContextManager}.

@item 
bpo-33378@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33378}: Add Korean language switcher for @indicateurl{https://docs.python.org/3/}

@item 
bpo-33276@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33276}: Clarify that the @code{__path__} attribute on modules cannot be
just any value.

@item 
bpo-33201@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33201}: Modernize documentation for writing C extension types.

@item 
bpo-33195@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33195}: Deprecate @code{Py_UNICODE} usage in @code{c-api/arg} document.
@code{Py_UNICODE} related APIs are deprecated since Python 3.3, but it is
missed in the document.

@item 
bpo-33126@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33126}: Document PyBuffer_ToContiguous().

@item 
bpo-27212@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27212}: Modify documentation for the @code{islice()} recipe to consume
initial values up to the start index.

@item 
bpo-28247@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28247}: Update @ref{137,,zipapp} documentation to describe how to make
standalone applications.

@item 
bpo-18802@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18802}: Documentation changes for ipaddress.  Patch by Jon Foster and
Berker Peksag.

@item 
bpo-27428@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27428}: Update documentation to clarify that @code{WindowsRegistryFinder}
implements @code{MetaPathFinder}. (Patch by Himanshu Lakhara)

@item 
bpo-8243@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8243}: Add a note about curses.addch and curses.addstr exception
behavior when writing outside a window, or pad.

@item 
bpo-31432@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31432}: Clarify meaning of CERT_NONE, CERT_OPTIONAL, and CERT_REQUIRED
flags for ssl.SSLContext.verify_mode.
@end itemize

@node Tests<67>,Build<75>,Documentation<70>,Python 3 6 6 release candidate 1
@anchor{whatsnew/changelog id879}@anchor{1ee9}
@subsubsection Tests



@itemize -

@item 
bpo-33655@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33655}: Ignore test_posix_fallocate failures on BSD platforms that
might be due to running on ZFS.

@item 
bpo-19417@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19417}: Add test_bdb.py.
@end itemize

@node Build<75>,Windows<66>,Tests<67>,Python 3 6 6 release candidate 1
@anchor{whatsnew/changelog id880}@anchor{1eea}
@subsubsection Build



@itemize -

@item 
bpo-5755@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5755}: Move @code{-Wstrict-prototypes} option to @code{CFLAGS_NODIST} from
@code{OPT}. This option emitted annoying warnings when building extension
modules written in C++.

@item 
bpo-33614@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33614}: Ensures module definition files for the stable ABI on Windows
are correctly regenerated.

@item 
bpo-33522@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33522}: Enable CI builds on Visual Studio Team Services at
@indicateurl{https://python.visualstudio.com/cpython}

@item 
bpo-33012@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33012}: Add @code{-Wno-cast-function-type} for gcc 8 for silencing
warnings about function casts like casting to PyCFunction in method
definition lists.

@item 
bpo-33394@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33394}: Enable the verbose build for extension modules, when GNU make
is passed macros on the command line.
@end itemize

@node Windows<66>,macOS<52>,Build<75>,Python 3 6 6 release candidate 1
@anchor{whatsnew/changelog id881}@anchor{1eeb}
@subsubsection Windows



@itemize -

@item 
bpo-33184@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33184}: Update Windows installer to OpenSSL 1.0.2o.
@end itemize

@node macOS<52>,IDLE<47>,Windows<66>,Python 3 6 6 release candidate 1
@anchor{whatsnew/changelog id882}@anchor{1eec}
@subsubsection macOS



@itemize -

@item 
bpo-33184@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33184}: Update macOS installer build to use OpenSSL 1.0.2o.
@end itemize

@node IDLE<47>,Tools/Demos<44>,macOS<52>,Python 3 6 6 release candidate 1
@anchor{whatsnew/changelog id883}@anchor{1eed}
@subsubsection IDLE



@itemize -

@item 
bpo-33656@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33656}: On Windows, add API call saying that tk scales for DPI. On
Windows 8.1+ or 10, with DPI compatibility properties of the Python binary
unchanged, and a monitor resolution greater than 96 DPI, this should make
text and lines sharper.  It should otherwise have no effect.

@item 
bpo-33768@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33768}: Clicking on a context line moves that line to the top of the
editor window.

@item 
bpo-33763@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33763}: IDLE: Use read-only text widget for code context instead of
label widget.

@item 
bpo-33664@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33664}: Scroll IDLE editor text by lines. Previously, the mouse wheel
and scrollbar slider moved text by a fixed number of pixels, resulting in
partial lines at the top of the editor box.  The change also applies to
the shell and grep output windows, but not to read-only text views.

@item 
bpo-33679@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33679}: Enable theme-specific color configuration for Code Context. Use
the Highlights tab to see the setting for built-in themes or add settings
to custom themes.

@item 
bpo-33642@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33642}: Display up to maxlines non-blank lines for Code Context. If
there is no current context, show a single blank line.

@item 
bpo-33628@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33628}: IDLE: Cleanup codecontext.py and its test.

@item 
bpo-33564@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33564}: IDLE’s code context now recognizes async as a block opener.

@item 
bpo-29706@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29706}: IDLE now colors async and await as keywords in 3.6. They become
full keywords in 3.7.

@item 
bpo-21474@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21474}: Update word/identifier definition from ascii to unicode. In
text and entry boxes, this affects selection by double-click, movement
left/right by control-left/right, and deletion left/right by
control-BACKSPACE/DEL.

@item 
bpo-33204@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33204}: IDLE: consistently color invalid string prefixes. A ‘u’ string
prefix cannot be paired with either ‘r’ or ‘f’. Consistently color as much
of the prefix, starting at the right, as is valid. Revise and extend
colorizer test.

@item 
bpo-32831@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32831}: Add docstrings and tests for codecontext.
@end itemize

@node Tools/Demos<44>,C API<67>,IDLE<47>,Python 3 6 6 release candidate 1
@anchor{whatsnew/changelog id884}@anchor{1eee}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-33189@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33189}: @code{pygettext.py} now recognizes only literal strings as
docstrings and translatable strings, and rejects bytes literals and
f-string expressions.

@item 
bpo-31920@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31920}: Fixed handling directories as arguments in the @code{pygettext}
script. Based on patch by Oleg Krasnikov.

@item 
bpo-29673@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29673}: Fix pystackv and pystack gdbinit macros.

@item 
bpo-32885@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32885}: Add an @code{-n} flag for @code{Tools/scripts/pathfix.py} to disable
automatic backup creation (files with @code{~} suffix).

@item 
bpo-31583@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31583}: Fix 2to3 for using with –add-suffix option but without
–output-dir option for relative path to files in current directory.
@end itemize

@node C API<67>,,Tools/Demos<44>,Python 3 6 6 release candidate 1
@anchor{whatsnew/changelog id885}@anchor{1eef}
@subsubsection C API



@itemize -

@item 
bpo-32374@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32374}: Document that m_traverse for multi-phase initialized modules
can be called with m_state=NULL, and add a sanity check
@end itemize

@node Python 3 6 5 final,Python 3 6 5 release candidate 1,Python 3 6 6 release candidate 1,Changelog
@anchor{whatsnew/changelog python-3-6-5-final}@anchor{1ef0}
@subsection Python 3.6.5 final


`Release date: 2018-03-28'

@menu
* Tests: Tests<68>. 
* Build: Build<76>. 

@end menu

@node Tests<68>,Build<76>,,Python 3 6 5 final
@anchor{whatsnew/changelog id886}@anchor{1ef1}
@subsubsection Tests



@itemize -

@item 
bpo-32872@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32872}: Avoid regrtest compatibility issue with namespace packages.
@end itemize

@node Build<76>,,Tests<68>,Python 3 6 5 final
@anchor{whatsnew/changelog id887}@anchor{1ef2}
@subsubsection Build



@itemize -

@item 
bpo-33163@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33163}: Upgrade pip to 9.0.3 and setuptools to v39.0.1.
@end itemize

@node Python 3 6 5 release candidate 1,Python 3 6 4 final,Python 3 6 5 final,Changelog
@anchor{whatsnew/changelog python-3-6-5-release-candidate-1}@anchor{1ef3}
@subsection Python 3.6.5 release candidate 1


`Release date: 2018-03-13'

@menu
* Security: Security<54>. 
* Core and Builtins: Core and Builtins<175>. 
* Library: Library<179>. 
* Documentation: Documentation<71>. 
* Tests: Tests<69>. 
* Build: Build<77>. 
* Windows: Windows<67>. 
* macOS: macOS<53>. 
* IDLE: IDLE<48>. 
* Tools/Demos: Tools/Demos<45>. 
* C API: C API<68>. 

@end menu

@node Security<54>,Core and Builtins<175>,,Python 3 6 5 release candidate 1
@anchor{whatsnew/changelog id888}@anchor{1ef4}
@subsubsection Security



@itemize -

@item 
bpo-33001@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33001}: Minimal fix to prevent buffer overrun in os.symlink on Windows

@item 
bpo-32981@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32981}: Regexes in difflib and poplib were vulnerable to catastrophic
backtracking. These regexes formed potential DOS vectors (REDOS). They
have been refactored. This resolves 
@geindex Common Vulnerabilities and Exposures; CVE 2018-1060
CVE 2018-1060@footnote{https://www.cve.org/CVERecord?id=CVE-2018-1060} and 
@geindex Common Vulnerabilities and Exposures; CVE 2018-1061
CVE 2018-1061@footnote{https://www.cve.org/CVERecord?id=CVE-2018-1061}.
Patch by Jamie Davis.
@end itemize

@node Core and Builtins<175>,Library<179>,Security<54>,Python 3 6 5 release candidate 1
@anchor{whatsnew/changelog id889}@anchor{1ef5}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-33026@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33026}: Fixed jumping out of “with” block by setting f_lineno.

@item 
bpo-17288@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17288}: Prevent jumps from ‘return’ and ‘exception’ trace events.

@item 
bpo-32889@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32889}: Update Valgrind suppression list to account for the rename of
@code{Py_ADDRESS_IN_RANG} to @code{address_in_range}.

@item 
bpo-32650@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32650}: Pdb and other debuggers dependent on bdb.py will correctly step
over (next command) native coroutines. Patch by Pablo Galindo.

@item 
bpo-32685@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32685}: Improve suggestion when the Python 2 form of print statement is
either present on the same line as the header of a compound statement or
else terminated by a semi-colon instead of a newline. Patch by Nitish
Chandra.

@item 
bpo-32583@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32583}: Fix possible crashing in builtin Unicode decoders caused by
write out-of-bound errors when using customized decode error handlers.

@item 
bpo-26163@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26163}: Improved frozenset() hash to create more distinct hash values
when faced with datasets containing many similar values.

@item 
bpo-27169@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27169}: The @code{__debug__} constant is now optimized out at compile
time. This fixes also bpo-22091@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22091}.

@item 
bpo-32329@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32329}: @code{sys.flags.hash_randomization} is now properly set to 0 when
hash randomization is turned off by @code{PYTHONHASHSEED=0}.

@item 
bpo-30416@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30416}: The optimizer is now protected from spending much time doing
complex calculations and consuming much memory for creating large
constants in constant folding.

@item 
bpo-18533@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18533}: @code{repr()} on a dict containing its own @code{values()} or
@code{items()} no longer raises @code{RecursionError}; OrderedDict similarly.
Instead, use @code{...}, as for other recursive structures.  Patch by Ben
North.

@item 
bpo-32028@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32028}: Leading whitespace is now correctly ignored when generating
suggestions for converting Py2 print statements to Py3 builtin print
function calls. Patch by Sanyam Khurana.

@item 
bpo-32137@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32137}: The repr of deeply nested dict now raises a RecursionError
instead of crashing due to a stack overflow.
@end itemize

@node Library<179>,Documentation<71>,Core and Builtins<175>,Python 3 6 5 release candidate 1
@anchor{whatsnew/changelog id890}@anchor{1ef6}
@subsubsection Library



@itemize -

@item 
bpo-33064@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33064}: lib2to3 now properly supports trailing commas after @code{*args}
and @code{**kwargs} in function signatures.

@item 
bpo-31804@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31804}: Avoid failing in multiprocessing.Process if the standard
streams are closed or None at exit.

@item 
bpo-33037@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33037}: Skip sending/receiving data after SSL transport closing.

@item 
bpo-30353@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30353}: Fix ctypes pass-by-value for structs on 64-bit Cygwin/MinGW.

@item 
bpo-33009@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33009}: Fix inspect.signature() for single-parameter partialmethods.

@item 
bpo-32969@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32969}: Expose several missing constants in zlib and fix corresponding
documentation.

@item 
bpo-32713@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32713}: Fixed tarfile.itn handling of out-of-bounds float values. Patch
by Joffrey Fuhrer.

@item 
bpo-30622@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30622}: The ssl module now detects missing NPN support in LibreSSL.

@item 
bpo-32922@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32922}: dbm.open() now encodes filename with the filesystem encoding
rather than default encoding.

@item 
bpo-32859@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32859}: In @code{os.dup2}, don’t check every call whether the @code{dup3}
syscall exists or not.

@item 
bpo-21060@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21060}: Rewrite confusing message from setup.py upload from “No dist
file created in earlier command” to the more helpful “Must create and
upload files in one command”.

@item 
bpo-32857@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32857}: In @ref{f6,,tkinter}, @code{after_cancel(None)} now raises a
@ref{2ee,,ValueError} instead of canceling the first scheduled function.
Patch by Cheryl Sabella.

@item 
bpo-32852@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32852}: Make sure sys.argv remains as a list when running trace.

@item 
bpo-32841@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32841}: Fixed @code{asyncio.Condition} issue which silently ignored
cancellation after notifying and cancelling a conditional lock. Patch by
Bar Harel.

@item 
bpo-31787@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31787}: Fixed refleaks of @code{__init__()} methods in various modules.
(Contributed by Oren Milman)

@item 
bpo-30157@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30157}: Fixed guessing quote and delimiter in csv.Sniffer.sniff() when
only the last field is quoted.  Patch by Jake Davis.

@item 
bpo-32394@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32394}: socket: Remove TCP_FASTOPEN, TCP_KEEPCNT flags on older version
Windows during run-time.

@item 
bpo-32777@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32777}: Fix a rare but potential pre-exec child process deadlock in
subprocess on POSIX systems when marking file descriptors inheritable on
exec in the child process.  This bug appears to have been introduced in
3.4.

@item 
bpo-32647@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32647}: The ctypes module used to depend on indirect linking for
dlopen. The shared extension is now explicitly linked against libdl on
platforms with dl.

@item 
bpo-32734@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32734}: Fixed @code{asyncio.Lock()} safety issue which allowed acquiring
and locking the same lock multiple times, without it being free. Patch by
Bar Harel.

@item 
bpo-32727@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32727}: Do not include name field in SMTP envelope from address. Patch
by Stéphane Wirtel

@item 
bpo-27931@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27931}: Fix email address header parsing error when the username is an
empty quoted string. Patch by Xiang Zhang.

@item 
bpo-32304@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32304}: distutils’ upload command no longer corrupts tar files ending
with a CR byte, and no longer tries to convert CR to CRLF in any of the
upload text fields.

@item 
bpo-32502@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32502}: uuid.uuid1 no longer raises an exception if a 64-bit hardware
address is encountered.

@item 
bpo-31848@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31848}: Fix the error handling in Aifc_read.initfp() when the SSND
chunk is not found. Patch by Zackery Spytz.

@item 
bpo-32555@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32555}: On FreeBSD and Solaris, os.strerror() now always decode the
byte string from the current locale encoding, rather than using
ASCII/surrogateescape in some cases.

@item 
bpo-32521@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32521}: The nis module is now compatible with new libnsl and headers
location.

@item 
bpo-32473@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32473}: Improve ABCMeta._dump_registry() output readability

@item 
bpo-32521@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32521}: glibc has removed Sun RPC. Use replacement libtirpc headers and
library in nis module.

@item 
bpo-32228@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32228}: Ensure that @code{truncate()} preserves the file position (as
reported by @code{tell()}) after writes longer than the buffer size.

@item 
bpo-26133@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26133}: Don’t unsubscribe signals in asyncio UNIX event loop on
interpreter shutdown.

@item 
bpo-32185@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32185}: The SSL module no longer sends IP addresses in SNI TLS
extension on platforms with OpenSSL 1.0.2+ or inet_pton.

@item 
bpo-32323@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32323}: @ref{f40,,urllib.parse.urlsplit()} does not convert zone-id (scope)
to lower case for scoped IPv6 addresses in hostnames now.

@item 
bpo-32302@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32302}: Fix bdist_wininst of distutils for CRT v142: it binary
compatible with CRT v140.

@item 
bpo-32255@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32255}: A single empty field is now always quoted when written into a
CSV file. This allows to distinguish an empty row from a row consisting of
a single empty field. Patch by Licht Takeuchi.

@item 
bpo-32277@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32277}: Raise @code{NotImplementedError} instead of @code{SystemError} on
platforms where @code{chmod(..., follow_symlinks=False)} is not supported.
Patch by Anthony Sottile.

@item 
bpo-32199@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32199}: The getnode() ip getter now uses ‘ip link’ instead of ‘ip link
list’.

@item 
bpo-27456@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27456}: Ensure TCP_NODELAY is set on Linux. Tests by Victor Stinner.

@item 
bpo-31900@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31900}: The @ref{dfe,,locale.localeconv()} function now sets temporarily the
@code{LC_CTYPE} locale to the @code{LC_NUMERIC} locale to decode
@code{decimal_point} and @code{thousands_sep} byte strings if they are non-ASCII
or longer than 1 byte, and the @code{LC_NUMERIC} locale is different than the
@code{LC_CTYPE} locale. This temporary change affects other threads. Same
change for the @ref{834,,str.format()} method when formatting a number
(@ref{19c,,int}, @ref{197,,float}, @code{float} and subclasses) with the
@code{n} type (ex: @code{'@{:n@}'.format(1234)}).

@item 
bpo-31802@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31802}: Importing native path module (@code{posixpath}, @code{ntpath}) now
works even if the @code{os} module still is not imported.
@end itemize

@node Documentation<71>,Tests<69>,Library<179>,Python 3 6 5 release candidate 1
@anchor{whatsnew/changelog id891}@anchor{1ef7}
@subsubsection Documentation



@itemize -

@item 
bpo-17232@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17232}: Clarify docs for -O and -OO.  Patch by Terry Reedy.

@item 
bpo-32800@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32800}: Update link to w3c doc for xml default namespaces.

@item 
bpo-8722@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8722}: Document @code{__getattr__()} behavior when property @code{get()}
method raises @ref{5f0,,AttributeError}.

@item 
bpo-32614@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32614}: Modify RE examples in documentation to use raw strings to
prevent @ref{1a4,,DeprecationWarning} and add text to REGEX HOWTO to highlight
the deprecation.

@item 
bpo-31972@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31972}: Improve docstrings for @code{pathlib.PurePath} subclasses.

@item 
bpo-17799@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17799}: Explain real behaviour of sys.settrace and sys.setprofile and
their C-API counterparts regarding which type of events are received in
each function. Patch by Pablo Galindo Salgado.
@end itemize

@node Tests<69>,Build<77>,Documentation<71>,Python 3 6 5 release candidate 1
@anchor{whatsnew/changelog id892}@anchor{1ef8}
@subsubsection Tests



@itemize -

@item 
bpo-32517@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32517}: Fix failing @code{test_asyncio} on macOS 10.12.2+ due to transport
of @code{KqueueSelector} loop was not being closed.

@item 
bpo-32721@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32721}: Fix test_hashlib to not fail if the _md5 module is not built.

@item 
bpo-32252@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32252}: Fix faulthandler_suppress_crash_report() used to prevent core
dump files when testing crashes. getrlimit() returns zero on success.

@item 
bpo-31518@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31518}: Debian Unstable has disabled TLS 1.0 and 1.1 for
SSLv23_METHOD(). Change TLS/SSL protocol of some tests to PROTOCOL_TLS or
PROTOCOL_TLSv1_2 to make them pass on Debian.
@end itemize

@node Build<77>,Windows<67>,Tests<69>,Python 3 6 5 release candidate 1
@anchor{whatsnew/changelog id893}@anchor{1ef9}
@subsubsection Build



@itemize -

@item 
bpo-32635@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32635}: Fix segfault of the crypt module when libxcrypt is provided
instead of libcrypt at the system.
@end itemize

@node Windows<67>,macOS<53>,Build<77>,Python 3 6 5 release candidate 1
@anchor{whatsnew/changelog id894}@anchor{1efa}
@subsubsection Windows



@itemize -

@item 
bpo-33016@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33016}: Fix potential use of uninitialized memory in
nt._getfinalpathname

@item 
bpo-32903@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32903}: Fix a memory leak in os.chdir() on Windows if the current
directory is set to a UNC path.

@item 
bpo-31966@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31966}: Fixed WindowsConsoleIO.write() for writing empty data.

@item 
bpo-32409@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32409}: Ensures activate.bat can handle Unicode contents.

@item 
bpo-32457@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32457}: Improves handling of denormalized executable path when
launching Python.

@item 
bpo-32370@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32370}: Use the correct encoding for ipconfig output in the uuid
module. Patch by Segev Finer.

@item 
bpo-29248@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29248}: Fix @ref{b20,,os.readlink()} on Windows, which was mistakenly
treating the @code{PrintNameOffset} field of the reparse data buffer as a
number of characters instead of bytes. Patch by Craig Holmquist and SSE4.

@item 
bpo-32588@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32588}: Create standalone _distutils_findvs module.
@end itemize

@node macOS<53>,IDLE<48>,Windows<67>,Python 3 6 5 release candidate 1
@anchor{whatsnew/changelog id895}@anchor{1efb}
@subsubsection macOS



@itemize -

@item 
bpo-32726@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32726}: Provide an additional, more modern macOS installer variant that
supports macOS 10.9+ systems in 64-bit mode only. Upgrade the supplied
third-party libraries to OpenSSL 1.0.2n, XZ 5.2.3, and SQLite 3.22.0. The
10.9+ installer now links with and supplies its own copy of Tcl/Tk 8.6.8.
@end itemize

@node IDLE<48>,Tools/Demos<45>,macOS<53>,Python 3 6 5 release candidate 1
@anchor{whatsnew/changelog id896}@anchor{1efc}
@subsubsection IDLE



@itemize -

@item 
bpo-32984@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32984}: Set @code{__file__} while running a startup file.  Like Python,
IDLE optionally runs one startup file in the Shell window before
presenting the first interactive input prompt.  For IDLE, @code{-s} runs a
file named in environmental variable  
@geindex IDLESTARTUP
@geindex environment variable; IDLESTARTUP
@code{IDLESTARTUP} or
@geindex PYTHONSTARTUP
@geindex environment variable; PYTHONSTARTUP
@ref{1ba,,PYTHONSTARTUP}; @code{-r file} runs @code{file}.  Python sets
@code{__file__} to the startup file name before running the file and unsets
it before the first prompt.  IDLE now does the same when run normally,
without the @code{-n} option.

@item 
bpo-32940@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32940}: Simplify and rename StringTranslatePseudoMapping in pyparse.

@item 
bpo-32916@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32916}: Change @code{str} to @code{code} in pyparse.

@item 
bpo-32905@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32905}: Remove unused code in pyparse module.

@item 
bpo-32874@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32874}: Add tests for pyparse.

@item 
bpo-32837@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32837}: Using the system and place-dependent default encoding for
open() is a bad idea for IDLE’s system and location-independent files.

@item 
bpo-32826@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32826}: Add “encoding=utf-8” to open() in IDLE’s test_help_about. GUI
test test_file_buttons() only looks at initial ascii-only lines, but
failed on systems where open() defaults to ‘ascii’ because readline()
internally reads and decodes far enough ahead to encounter a non-ascii
character in CREDITS.txt.

@item 
bpo-32765@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32765}: Update configdialog General tab docstring to add new widgets to
the widget list.
@end itemize

@node Tools/Demos<45>,C API<68>,IDLE<48>,Python 3 6 5 release candidate 1
@anchor{whatsnew/changelog id897}@anchor{1efd}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-24960@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24960}: 2to3 and lib2to3 can now read pickled grammar files using
pkgutil.get_data() rather than probing the filesystem. This lets 2to3 and
lib2to3 work when run from a zipfile.

@item 
bpo-32222@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32222}: Fix pygettext not extracting docstrings for functions with type
annotated arguments. Patch by Toby Harradine.
@end itemize

@node C API<68>,,Tools/Demos<45>,Python 3 6 5 release candidate 1
@anchor{whatsnew/changelog id898}@anchor{1efe}
@subsubsection C API



@itemize -

@item 
bpo-29084@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29084}: Undocumented C API for OrderedDict has been excluded from the
limited C API. It was added by mistake and actually never worked in the
limited C API.
@end itemize

@node Python 3 6 4 final,Python 3 6 4 release candidate 1,Python 3 6 5 release candidate 1,Changelog
@anchor{whatsnew/changelog python-3-6-4-final}@anchor{1eff}
@subsection Python 3.6.4 final


`Release date: 2017-12-18'

There were no new code changes in version 3.6.4 since v3.6.4rc1.

@node Python 3 6 4 release candidate 1,Python 3 6 3 final,Python 3 6 4 final,Changelog
@anchor{whatsnew/changelog python-3-6-4-release-candidate-1}@anchor{1f00}
@subsection Python 3.6.4 release candidate 1


`Release date: 2017-12-05'

@menu
* Core and Builtins: Core and Builtins<176>. 
* Library: Library<180>. 
* Documentation: Documentation<72>. 
* Tests: Tests<70>. 
* Build: Build<78>. 
* Windows: Windows<68>. 
* macOS: macOS<54>. 
* IDLE: IDLE<49>. 
* Tools/Demos: Tools/Demos<46>. 
* C API: C API<69>. 

@end menu

@node Core and Builtins<176>,Library<180>,,Python 3 6 4 release candidate 1
@anchor{whatsnew/changelog id899}@anchor{1f01}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-32176@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32176}: co_flags.CO_NOFREE is now always set correctly by the code
object constructor based on freevars and cellvars, rather than needing to
be set correctly by the caller. This ensures it will be cleared
automatically when additional cell references are injected into a modified
code object and function.

@item 
bpo-31949@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31949}: Fixed several issues in printing tracebacks
(PyTraceBack_Print()). Setting sys.tracebacklimit to 0 or less now
suppresses printing tracebacks. Setting sys.tracebacklimit to None now
causes using the default limit. Setting sys.tracebacklimit to an integer
larger than LONG_MAX now means using the limit LONG_MAX rather than the
default limit. Fixed integer overflows in the case of more than @code{2**31}
traceback items on Windows. Fixed output errors handling.

@item 
bpo-30696@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30696}: Fix the interactive interpreter looping endlessly when no
memory.

@item 
bpo-20047@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20047}: Bytearray methods partition() and rpartition() now accept only
bytes-like objects as separator, as documented.  In particular they now
raise TypeError rather of returning a bogus result when an integer is
passed as a separator.

@item 
bpo-31852@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31852}: Fix a segmentation fault caused by a combination of the async
soft keyword and continuation lines.

@item 
bpo-21720@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21720}: BytesWarning no longer emitted when the `fromlist' argument of
@code{__import__()} or the @code{__all__} attribute of the module contain bytes
instances.

@item 
bpo-31825@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31825}: Fixed OverflowError in the ‘unicode-escape’ codec and in
codecs.escape_decode() when decode an escaped non-ascii byte.

@item 
bpo-28603@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28603}: Print the full context/cause chain of exceptions on interpreter
exit, even if an exception in the chain is unhashable or compares equal to
later ones. Patch by Zane Bitter.

@item 
bpo-31786@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31786}: Fix timeout rounding in the select module to round correctly
negative timeouts between -1.0 and 0.0. The functions now block waiting
for events as expected. Previously, the call was incorrectly non-blocking.
Patch by Pablo Galindo.

@item 
bpo-31642@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31642}: Restored blocking “from package import module” by setting
sys.modules[“package.module”] to None.

@item 
bpo-31626@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31626}: Fixed a bug in debug memory allocator.  There was a write to
freed memory after shrinking a memory block.

@item 
bpo-31619@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31619}: Fixed a ValueError when convert a string with large number of
underscores to integer with binary base.

@item 
bpo-31592@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31592}: Fixed an assertion failure in Python parser in case of a bad
@code{unicodedata.normalize()}. Patch by Oren Milman.

@item 
bpo-31588@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31588}: Raise a @code{TypeError} with a helpful error message when class
creation fails due to a metaclass with a bad @code{__prepare__()} method.
Patch by Oren Milman.

@item 
bpo-31566@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31566}: Fix an assertion failure in @code{_warnings.warn()} in case of a
bad @code{__name__} global. Patch by Oren Milman.

@item 
bpo-31505@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31505}: Fix an assertion failure in @code{json}, in case
@code{_json.make_encoder()} received a bad @code{encoder()} argument. Patch by
Oren Milman.

@item 
bpo-31492@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31492}: Fix assertion failures in case of failing to import from a
module with a bad @code{__name__} attribute, and in case of failing to access
an attribute of such a module. Patch by Oren Milman.

@item 
bpo-31490@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31490}: Fix an assertion failure in @code{ctypes} class definition, in
case the class has an attribute whose name is specified in @code{_anonymous_}
but not in @code{_fields_}. Patch by Oren Milman.

@item 
bpo-31478@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31478}: Fix an assertion failure in @code{_random.Random.seed()} in case
the argument has a bad @code{__abs__()} method. Patch by Oren Milman.

@item 
bpo-31315@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31315}: Fix an assertion failure in imp.create_dynamic(), when
spec.name is not a string. Patch by Oren Milman.

@item 
bpo-31311@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31311}: Fix a crash in the @code{__setstate__()} method of
@code{ctypes._CData}, in case of a bad @code{__dict__}. Patch by Oren Milman.

@item 
bpo-31293@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31293}: Fix crashes in true division and multiplication of a timedelta
object by a float with a bad as_integer_ratio() method. Patch by Oren
Milman.

@item 
bpo-31285@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31285}: Fix an assertion failure in @code{warnings.warn_explicit}, when
the return value of the received loader’s @code{get_source()} has a bad
@code{splitlines()} method. Patch by Oren Milman.

@item 
bpo-30817@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30817}: @code{PyErr_PrintEx()} clears now the ignored exception that may
be raised by @code{_PySys_SetObjectId()}, for example when no memory.
@end itemize

@node Library<180>,Documentation<72>,Core and Builtins<176>,Python 3 6 4 release candidate 1
@anchor{whatsnew/changelog id900}@anchor{1f02}
@subsubsection Library



@itemize -

@item 
bpo-28556@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28556}: Two minor fixes for @code{typing} module: allow shallow copying
instances of generic classes, improve interaction of @code{__init_subclass__}
with generics. Original PRs by Ivan Levkivskyi.

@item 
bpo-27240@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27240}: The header folding algorithm for the new email policies has
been rewritten, which also fixes bpo-30788@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30788}, bpo-31831@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31831}, and bpo-32182@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32182}.  In
particular, RFC2231 folding is now done correctly.

@item 
bpo-32186@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32186}: io.FileIO.readall() and io.FileIO.read() now release the GIL
when getting the file size. Fixed hang of all threads with inaccessible
NFS server. Patch by Nir Soffer.

@item 
bpo-12239@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12239}: Make @code{msilib.SummaryInformation.GetProperty()} return
@code{None} when the value of property is @code{VT_EMPTY}.  Initial patch by
Mark Mc Mahon.

@item 
bpo-31325@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31325}: Fix wrong usage of @ref{4e1,,collections.namedtuple()} in the
@ref{1ec5,,RobotFileParser.parse()}
method. Initial patch by Robin Wellner.

@item 
bpo-12382@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12382}: @code{msilib.OpenDatabase()} now raises a better exception
message when it couldn’t open or create an MSI file.  Initial patch by
William Tisäter.

@item 
bpo-32110@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32110}: @code{codecs.StreamReader.read(n)} now returns not more than `n'
characters/bytes for non-negative `n'. This makes it compatible with
@code{read()} methods of other file-like objects.

@item 
bpo-32072@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32072}: Fixed issues with binary plists: Fixed saving bytearrays.
Identical objects will be saved only once. Equal references will be load
as identical objects. Added support for saving and loading recursive data
structures.

@item 
bpo-32034@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32034}: Make asyncio.IncompleteReadError and LimitOverrunError
pickleable.

@item 
bpo-32015@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32015}: Fixed the looping of asyncio in the case of reconnection the
socket during waiting async read/write from/to the socket.

@item 
bpo-32011@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32011}: Restored support of loading marshal files with the TYPE_INT64
code. These files can be produced in Python 2.7.

@item 
bpo-31970@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31970}: Reduce performance overhead of asyncio debug mode.

@item 
bpo-9678@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9678}: Fixed determining the MAC address in the uuid module: Using
ifconfig on NetBSD and OpenBSD. Using arp on Linux, FreeBSD, NetBSD and
OpenBSD. Based on patch by Takayuki Shimizukawa.

@item 
bpo-30057@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30057}: Fix potential missed signal in signal.signal().

@item 
bpo-31933@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31933}: Fix Blake2 params leaf_size and node_offset on big endian
platforms. Patch by Jack O’Connor.

@item 
bpo-31927@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31927}: Fixed compilation of the socket module on NetBSD 8.  Fixed
assertion failure or reading arbitrary data when parse a AF_BLUETOOTH
address on NetBSD and DragonFly BSD.

@item 
bpo-27666@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27666}: Fixed stack corruption in curses.box() and curses.ungetmouse()
when the size of types chtype or mmask_t is less than the size of C long.
curses.box() now accepts characters as arguments.  Based on patch by Steve
Fink.

@item 
bpo-31897@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31897}: plistlib now catches more errors when read binary plists and
raises InvalidFileException instead of unexpected exceptions.

@item 
bpo-25720@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25720}: Fix the method for checking pad state of curses WINDOW. Patch
by Masayuki Yamamoto.

@item 
bpo-31893@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31893}: Fixed the layout of the kqueue_event structure on OpenBSD and
NetBSD. Fixed the comparison of the kqueue_event objects.

@item 
bpo-31891@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31891}: Fixed building the curses module on NetBSD.

@item 
bpo-28416@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28416}: Instances of pickle.Pickler subclass with the persistent_id()
method and pickle.Unpickler subclass with the persistent_load() method no
longer create reference cycles.

@item 
bpo-28326@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28326}: Fix multiprocessing.Process when stdout and/or stderr is closed
or None.

@item 
bpo-31457@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31457}: If nested log adapters are used, the inner @code{process()}
methods are no longer omitted.

@item 
bpo-31457@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31457}: The @code{manager} property on LoggerAdapter objects is now
properly settable.

@item 
bpo-31806@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31806}: Fix timeout rounding in time.sleep(), threading.Lock.acquire()
and socket.socket.settimeout() to round correctly negative timeouts
between -1.0 and 0.0. The functions now block waiting for events as
expected. Previously, the call was incorrectly non-blocking. Patch by
Pablo Galindo.

@item 
bpo-28603@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28603}: traceback: Fix a TypeError that occurred during printing of
exception tracebacks when either the current exception or an exception in
its context/cause chain is unhashable. Patch by Zane Bitter.

@item 
bpo-30058@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30058}: Fixed buffer overflow in select.kqueue.control().

@item 
bpo-31770@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31770}: Prevent a crash when calling the @code{__init__()} method of a
@code{sqlite3.Cursor} object more than once. Patch by Oren Milman.

@item 
bpo-31672@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31672}: @code{idpattern} in @code{string.Template} matched some non-ASCII
characters. Now it uses @code{-i} regular expression local flag to avoid
non-ASCII characters.

@item 
bpo-31764@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31764}: Prevent a crash in @code{sqlite3.Cursor.close()} in case the
@code{Cursor} object is uninitialized. Patch by Oren Milman.

@item 
bpo-31752@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31752}: Fix possible crash in timedelta constructor called with custom
integers.

@item 
bpo-31701@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31701}: On Windows, faulthandler.enable() now ignores MSC and COM
exceptions.

@item 
bpo-31728@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31728}: Prevent crashes in @code{_elementtree} due to unsafe cleanup of
@code{Element.text} and @code{Element.tail}. Patch by Oren Milman.

@item 
bpo-31620@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31620}: an empty asyncio.Queue now doesn’t leak memory when queue.get
pollers timeout

@item 
bpo-31632@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31632}: Fix method set_protocol() of class _SSLProtocolTransport in
asyncio module. This method was previously modifying a wrong reference to
the protocol.

@item 
bpo-31675@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31675}: Fixed memory leaks in Tkinter’s methods splitlist() and split()
when pass a string larger than 2 GiB.

@item 
bpo-31673@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31673}: Fixed typo in the name of Tkinter’s method adderrorinfo().

@item 
bpo-30806@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30806}: Fix the string representation of a netrc object.

@item 
bpo-15037@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15037}: Added a workaround for getkey() in curses for ncurses 5.7 and
earlier.

@item 
bpo-25351@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25351}: Avoid venv activate failures with undefined variables

@item 
bpo-25532@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25532}: inspect.unwrap() will now only try to unwrap an object
sys.getrecursionlimit() times, to protect against objects which create a
new object on every attribute access.

@item 
bpo-30347@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30347}: Stop crashes when concurrently iterate over itertools.groupby()
iterators.

@item 
bpo-31516@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31516}: @code{threading.current_thread()} should not return a dummy thread
at shutdown.

@item 
bpo-31351@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31351}: python -m ensurepip now exits with non-zero exit code if pip
bootstrapping has failed.

@item 
bpo-31482@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31482}: @code{random.seed()} now works with bytes in version=1

@item 
bpo-31334@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31334}: Fix @code{poll.poll([timeout])} in the @code{select} module for
arbitrary negative timeouts on all OSes where it can only be a
non-negative integer or -1. Patch by Riccardo Coccioli.

@item 
bpo-31310@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31310}: multiprocessing’s semaphore tracker should be launched again if
crashed.

@item 
bpo-31308@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31308}: Make multiprocessing’s forkserver process immune to Ctrl-C and
other user interruptions. If it crashes, restart it when necessary.
@end itemize

@node Documentation<72>,Tests<70>,Library<180>,Python 3 6 4 release candidate 1
@anchor{whatsnew/changelog id901}@anchor{1f03}
@subsubsection Documentation



@itemize -

@item 
bpo-32105@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32105}: Added asyncio.BaseEventLoop.connect_accepted_socket
versionadded marker.

@item 
bpo-31537@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31537}: Fix incorrect usage of @code{get_history_length} in readline
documentation example code. Patch by Brad Smith.

@item 
bpo-30085@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30085}: The operator functions without double underscores are preferred
for clarity. The one with underscores are only kept for
back-compatibility.
@end itemize

@node Tests<70>,Build<78>,Documentation<72>,Python 3 6 4 release candidate 1
@anchor{whatsnew/changelog id902}@anchor{1f04}
@subsubsection Tests



@itemize -

@item 
bpo-31380@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31380}: Skip test_httpservers test_undecodable_file on macOS: fails on
APFS.

@item 
bpo-31705@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31705}: Skip test_socket.test_sha256() on Linux kernel older than 4.5.
The test fails with ENOKEY on kernel 3.10 (on ppc64le). A fix was merged
into the kernel 4.5.

@item 
bpo-31174@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31174}: Fix test_tools.test_unparse: DirectoryTestCase now stores the
names sample to always test the same files. It prevents false alarms when
hunting reference leaks.

@item 
bpo-30695@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30695}: Add the @code{set_nomemory(start, stop)} and
@code{remove_mem_hooks()} functions to the @code{_testcapi} module.
@end itemize

@node Build<78>,Windows<68>,Tests<70>,Python 3 6 4 release candidate 1
@anchor{whatsnew/changelog id903}@anchor{1f05}
@subsubsection Build



@itemize -

@item 
bpo-32059@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32059}: @code{detect_modules()} in @code{setup.py} now also searches the
sysroot paths when cross-compiling.

@item 
bpo-31957@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31957}: Fixes Windows SDK version detection when building for Windows.

@item 
bpo-31609@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31609}: Fixes quotes in PCbuild/clean.bat

@item 
bpo-31934@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31934}: Abort the build when building out of a not clean source tree.

@item 
bpo-31926@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31926}: Fixed Argument Clinic sometimes causing compilation errors when
there was more than one function and/or method in a .c file with the same
name.

@item 
bpo-28791@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28791}: Update Windows builds to use SQLite 3.21.0.

@item 
bpo-28791@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28791}: Update OS X installer to use SQLite 3.21.0.

@item 
bpo-22140@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22140}: Prevent double substitution of prefix in python-config.sh.

@item 
bpo-31536@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31536}: Avoid wholesale rebuild after @code{make regen-all} if nothing
changed.
@end itemize

@node Windows<68>,macOS<54>,Build<78>,Python 3 6 4 release candidate 1
@anchor{whatsnew/changelog id904}@anchor{1f06}
@subsubsection Windows



@itemize -

@item 
bpo-1102@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1102}: Return @code{None} when @code{View.Fetch()} returns
@code{ERROR_NO_MORE_ITEMS} instead of raising @code{MSIError}. Initial patch by
Anthony Tuininga.

@item 
bpo-31944@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31944}: Fixes Modify button in Apps and Features dialog.
@end itemize

@node macOS<54>,IDLE<49>,Windows<68>,Python 3 6 4 release candidate 1
@anchor{whatsnew/changelog id905}@anchor{1f07}
@subsubsection macOS



@itemize -

@item 
bpo-31392@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31392}: Update macOS installer to use OpenSSL 1.0.2m
@end itemize

@node IDLE<49>,Tools/Demos<46>,macOS<54>,Python 3 6 4 release candidate 1
@anchor{whatsnew/changelog id906}@anchor{1f08}
@subsubsection IDLE



@itemize -

@item 
bpo-32207@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32207}: Improve tk event exception tracebacks in IDLE. When tk event
handling is driven by IDLE’s run loop, a confusing and distracting
queue.EMPTY traceback context is no longer added to tk event exception
tracebacks.  The traceback is now the same as when event handling is
driven by user code.  Patch based on a suggestion by Serhiy Storchaka.

@item 
bpo-32164@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32164}: Delete unused file idlelib/tabbedpages.py. Use of TabbedPageSet
in configdialog was replaced by ttk.Notebook.

@item 
bpo-32100@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32100}: IDLE: Fix old and new bugs in pathbrowser; improve tests. Patch
mostly by Cheryl Sabella.

@item 
bpo-31858@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31858}: IDLE – Restrict shell prompt manipulation to the shell. Editor
and output windows only see an empty last prompt line.  This simplifies
the code and fixes a minor bug when newline is inserted. Sys.ps1, if
present, is read on Shell start-up, but is not set or changed.

@item 
bpo-31860@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31860}: The font sample in the IDLE configuration dialog is now
editable. Changes persist while IDLE remains open

@item 
bpo-31836@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31836}: Test_code_module now passes if run after test_idle, which sets
ps1. The code module uses sys.ps1 if present or sets it to ‘>>> ‘ if not.
Test_code_module now properly tests both behaviors.  Ditto for ps2.

@item 
bpo-28603@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28603}: Fix a TypeError that caused a shell restart when printing a
traceback that includes an exception that is unhashable. Patch by Zane
Bitter.

@item 
bpo-13802@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13802}: Use non-Latin characters in the IDLE’s Font settings sample.
Even if one selects a font that defines a limited subset of the unicode
Basic Multilingual Plane, tcl/tk will use other fonts that define a
character. The expanded example give users of non-Latin characters a
better idea of what they might see in IDLE’s shell and editors. To make
room for the expanded sample, frames on the Font tab are re-arranged. The
Font/Tabs help explains a bit about the additions.

@item 
bpo-31460@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31460}: Simplify the API of IDLE’s Module Browser. Passing a widget
instead of an flist with a root widget opens the option of creating a
browser frame that is only part of a window.  Passing a full file name
instead of pieces assumed to come from a .py file opens the possibility of
browsing python files that do not end in .py.

@item 
bpo-31649@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31649}: IDLE - Make _htest, _utest parameters keyword only.

@item 
bpo-31559@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31559}: Remove test order dependence in idle_test.test_browser.

@item 
bpo-31459@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31459}: Rename IDLE’s module browser from Class Browser to Module
Browser. The original module-level class and method browser became a
module browser, with the addition of module-level functions, years ago.
Nested classes and functions were added yesterday.  For
back-compatibility, the virtual event <<open-class-browser>>, which
appears on the Keys tab of the Settings dialog, is not changed. Patch by
Cheryl Sabella.

@item 
bpo-31500@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31500}: Default fonts now are scaled on HiDPI displays.

@item 
bpo-1612262@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1612262}: IDLE module browser now shows nested classes and functions.
Original patches for code and tests by Guilherme Polo and Cheryl Sabella,
respectively.
@end itemize

@node Tools/Demos<46>,C API<69>,IDLE<49>,Python 3 6 4 release candidate 1
@anchor{whatsnew/changelog id907}@anchor{1f09}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-30722@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30722}: Make redemo work with Python 3.6 and newer versions. Also,
remove the @code{LOCALE} option since it doesn’t work with string patterns in
Python 3. Patch by Christoph Sarnowski.
@end itemize

@node C API<69>,,Tools/Demos<46>,Python 3 6 4 release candidate 1
@anchor{whatsnew/changelog id908}@anchor{1f0a}
@subsubsection C API



@itemize -

@item 
bpo-20891@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20891}: Fix PyGILState_Ensure(). When PyGILState_Ensure() is called in
a non-Python thread before PyEval_InitThreads(), only call
PyEval_InitThreads() after calling PyThreadState_New() to fix a crash.

@item 
bpo-31532@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31532}: Fix memory corruption due to allocator mix in getpath.c between
Py_GetPath() and Py_SetPath()

@item 
bpo-30697@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30697}: The @code{PyExc_RecursionErrorInst} singleton is removed and
@code{PyErr_NormalizeException()} does not use it anymore. This singleton is
persistent and its members being never cleared may cause a segfault during
finalization of the interpreter. See also bpo-22898@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22898}.
@end itemize

@node Python 3 6 3 final,Python 3 6 3 release candidate 1,Python 3 6 4 release candidate 1,Changelog
@anchor{whatsnew/changelog python-3-6-3-final}@anchor{1f0b}
@subsection Python 3.6.3 final


`Release date: 2017-10-03'

@menu
* Library: Library<181>. 
* Build: Build<79>. 

@end menu

@node Library<181>,Build<79>,,Python 3 6 3 final
@anchor{whatsnew/changelog id909}@anchor{1f0c}
@subsubsection Library



@itemize -

@item 
bpo-31641@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31641}: Re-allow arbitrary iterables in
@code{concurrent.futures.as_completed()}. Fixes regression in 3.6.3rc1.
@end itemize

@node Build<79>,,Library<181>,Python 3 6 3 final
@anchor{whatsnew/changelog id910}@anchor{1f0d}
@subsubsection Build



@itemize -

@item 
bpo-31662@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31662}: Fix typos in Windows @code{uploadrelease.bat} script. Fix Windows
Doc build issues in @code{Doc/make.bat}.

@item 
bpo-31423@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31423}: Fix building the PDF documentation with newer versions of
Sphinx.
@end itemize

@node Python 3 6 3 release candidate 1,Python 3 6 2 final,Python 3 6 3 final,Changelog
@anchor{whatsnew/changelog python-3-6-3-release-candidate-1}@anchor{1f0e}
@subsection Python 3.6.3 release candidate 1


`Release date: 2017-09-18'

@menu
* Security: Security<55>. 
* Core and Builtins: Core and Builtins<177>. 
* Library: Library<182>. 
* Documentation: Documentation<73>. 
* Tests: Tests<71>. 
* Build: Build<80>. 
* Windows: Windows<69>. 
* IDLE: IDLE<50>. 
* Tools/Demos: Tools/Demos<47>. 

@end menu

@node Security<55>,Core and Builtins<177>,,Python 3 6 3 release candidate 1
@anchor{whatsnew/changelog id911}@anchor{1f0f}
@subsubsection Security



@itemize -

@item 
bpo-29781@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29781}: SSLObject.version() now correctly returns None when handshake
over BIO has not been performed yet.

@item 
bpo-30947@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30947}: Upgrade libexpat embedded copy from version 2.2.1 to 2.2.3 to
get security fixes.
@end itemize

@node Core and Builtins<177>,Library<182>,Security<55>,Python 3 6 3 release candidate 1
@anchor{whatsnew/changelog id912}@anchor{1f10}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-31471@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31471}: Fix an assertion failure in @code{subprocess.Popen()} on Windows,
in case the env argument has a bad @code{keys()} method. Patch by Oren
Milman.

@item 
bpo-31418@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31418}: Fix an assertion failure in @code{PyErr_WriteUnraisable()} in case
of an exception with a bad @code{__module__} attribute. Patch by Oren Milman.

@item 
bpo-31416@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31416}: Fix assertion failures in case of a bad warnings.filters or
warnings.defaultaction. Patch by Oren Milman.

@item 
bpo-31411@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31411}: Raise a TypeError instead of SystemError in case
warnings.onceregistry is not a dictionary. Patch by Oren Milman.

@item 
bpo-31373@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31373}: Fix several possible instances of undefined behavior due to
floating-point demotions.

@item 
bpo-30465@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30465}: Location information (@code{lineno} and @code{col_offset}) in
f-strings is now (mostly) correct.  This fixes tools like flake8 from
showing warnings on the wrong line (typically the first line of the file).

@item 
bpo-31343@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31343}: Include sys/sysmacros.h for major(), minor(), and makedev().
GNU C library plans to remove the functions from sys/types.h.

@item 
bpo-31291@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31291}: Fix an assertion failure in @code{zipimport.zipimporter.get_data}
on Windows, when the return value of @code{pathname.replace('/','\\')} isn’t
a string. Patch by Oren Milman.

@item 
bpo-31271@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31271}: Fix an assertion failure in the @code{write()} method of
@code{io.TextIOWrapper}, when the encoder doesn’t return a bytes object.
Patch by Oren Milman.

@item 
bpo-31243@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31243}: Fix a crash in some methods of @code{io.TextIOWrapper}, when the
decoder’s state is invalid. Patch by Oren Milman.

@item 
bpo-30721@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30721}: @code{print} now shows correct usage hint for using Python 2
redirection syntax.  Patch by Sanyam Khurana.

@item 
bpo-31070@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31070}: Fix a race condition in importlib _get_module_lock().

@item 
bpo-31095@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31095}: Fix potential crash during GC caused by @code{tp_dealloc} which
doesn’t call @code{PyObject_GC_UnTrack()}.

@item 
bpo-31071@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31071}: Avoid masking original TypeError in call with * unpacking when
other arguments are passed.

@item 
bpo-30978@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30978}: str.format_map() now passes key lookup exceptions through.
Previously any exception was replaced with a KeyError exception.

@item 
bpo-30808@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30808}: Use _Py_atomic API for concurrency-sensitive signal state.

@item 
bpo-30876@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30876}: Relative import from unloaded package now reimports the package
instead of failing with SystemError.  Relative import from non-package now
fails with ImportError rather than SystemError.

@item 
bpo-30703@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30703}: Improve signal delivery. Avoid using Py_AddPendingCall from
signal handler, to avoid calling signal-unsafe functions. The tests I’m
adding here fail without the rest of the patch, on Linux and OS X. This
means our signal delivery logic had defects (some signals could be lost).

@item 
bpo-30765@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30765}: Avoid blocking in pthread_mutex_lock() when
PyThread_acquire_lock() is asked not to block.

@item 
bpo-31161@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31161}: Make sure the ‘Missing parentheses’ syntax error message is
only applied to SyntaxError, not to subclasses. Patch by Martijn Pieters.

@item 
bpo-30814@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30814}: Fixed a race condition when import a submodule from a package.

@item 
bpo-30597@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30597}: @code{print} now shows expected input in custom error message when
used as a Python 2 statement. Patch by Sanyam Khurana.
@end itemize

@node Library<182>,Documentation<73>,Core and Builtins<177>,Python 3 6 3 release candidate 1
@anchor{whatsnew/changelog id913}@anchor{1f11}
@subsubsection Library



@itemize -

@item 
bpo-31499@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31499}: xml.etree: Fix a crash when a parser is part of a reference
cycle.

@item 
bpo-28556@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28556}: typing.get_type_hints now finds the right globalns for classes
and modules by default (when no @code{globalns} was specified by the caller).

@item 
bpo-28556@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28556}: Speed improvements to the @code{typing} module.  Original PRs by
Ivan Levkivskyi and Mitar.

@item 
bpo-31544@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31544}: The C accelerator module of ElementTree ignored exceptions
raised when looking up TreeBuilder target methods in XMLParser().

@item 
bpo-31234@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31234}: socket.create_connection() now fixes manually a reference
cycle: clear the variable storing the last exception on success.

@item 
bpo-31457@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31457}: LoggerAdapter objects can now be nested.

@item 
bpo-31400@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31400}: Improves SSL error handling to avoid losing error numbers.

@item 
bpo-28958@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28958}: ssl.SSLContext() now uses OpenSSL error information when a
context cannot be instantiated.

@item 
bpo-27340@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27340}: SSLSocket.sendall() now uses memoryview to create slices of
data. This fixes support for all bytes-like object. It is also more
efficient and avoids costly copies.

@item 
bpo-31178@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31178}: Fix string concatenation bug in rare error path in the
subprocess module

@item 
bpo-31350@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31350}: Micro-optimize @code{asyncio._get_running_loop()} to become up
to 10% faster.

@item 
bpo-31170@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31170}: expat: Update libexpat from 2.2.3 to 2.2.4. Fix copying of
partial characters for UTF-8 input (libexpat bug 115):
@indicateurl{https://github.com/libexpat/libexpat/issues/115}

@item 
bpo-29136@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29136}: Add TLS 1.3 cipher suites and OP_NO_TLSv1_3.

@item 
bpo-29212@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29212}: Fix concurrent.futures.thread.ThreadPoolExecutor threads to
have a non repr() based thread name by default when no thread_name_prefix
is supplied. They will now identify themselves as
“ThreadPoolExecutor-y_n”.

@item 
bpo-9146@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9146}: Fix a segmentation fault in _hashopenssl when standard hash
functions such as md5 are not available in the linked OpenSSL library.  As
in some special FIPS-140 build environments.

@item 
bpo-27144@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27144}: The @code{map()} and @code{as_completed()} iterators in
@code{concurrent.futures} now avoid keeping a reference to yielded objects.

@item 
bpo-10746@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10746}: Fix ctypes producing wrong 
@geindex Python Enhancement Proposals; PEP 3118
PEP 3118@footnote{https://peps.python.org/pep-3118/} type codes for integer
types.

@item 
bpo-22536@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22536}: The subprocess module now sets the filename when
FileNotFoundError is raised on POSIX systems due to the executable or cwd
not being found.

@item 
bpo-31249@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31249}: concurrent.futures: WorkItem.run() used by ThreadPoolExecutor
now breaks a reference cycle between an exception object and the WorkItem
object.

@item 
bpo-31247@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31247}: xmlrpc.server now explicitly breaks reference cycles when using
sys.exc_info() in code handling exceptions.

@item 
bpo-30102@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30102}: The ssl and hashlib modules now call
OPENSSL_add_all_algorithms_noconf() on OpenSSL < 1.1.0. The function
detects CPU features and enables optimizations on some CPU architectures
such as POWER8. Patch is based on research from Gustavo Serra Scalet.

@item 
bpo-31185@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31185}: Fixed miscellaneous errors in asyncio speedup module.

@item 
bpo-31135@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31135}: ttk: fix the destroy() method of LabeledScale and OptionMenu
classes. Call the parent destroy() method even if the used attribute
doesn’t exist. The LabeledScale.destroy() method now also explicitly
clears label and scale attributes to help the garbage collector to destroy
all widgets.

@item 
bpo-31107@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31107}: Fix @code{copyreg._slotnames()} mangled attribute calculation for
classes whose name begins with an underscore. Patch by Shane Harvey.

@item 
bpo-31061@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31061}: Fixed a crash when using asyncio and threads.

@item 
bpo-30502@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30502}: Fix handling of long oids in ssl.  Based on patch by Christian
Heimes.

@item 
bpo-30119@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30119}: ftplib.FTP.putline() now throws ValueError on commands that
contains CR or LF. Patch by Donghee Na.

@item 
bpo-30595@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30595}: multiprocessing.Queue.get() with a timeout now polls its reader
in non-blocking mode if it succeeded to acquire the lock but the acquire
took longer than the timeout.

@item 
bpo-29403@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29403}: Fix @code{unittest.mock}’s autospec to not fail on method-bound
builtin functions.  Patch by Aaron Gallagher.

@item 
bpo-30961@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30961}: Fix decrementing a borrowed reference in tracemalloc.

@item 
bpo-25684@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25684}: Change @code{ttk.OptionMenu} radiobuttons to be unique across
instances of @code{OptionMenu}.

@item 
bpo-30886@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30886}: Fix multiprocessing.Queue.join_thread(): it now waits until the
thread completes, even if the thread was started by the same process which
created the queue.

@item 
bpo-29854@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29854}: Fix segfault in readline when using readline’s history-size
option.  Patch by Nir Soffer.

@item 
bpo-30319@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30319}: socket.close() now ignores ECONNRESET error.

@item 
bpo-30828@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30828}: Fix out of bounds write in
@code{asyncio.CFuture.remove_done_callback()}.

@item 
bpo-30807@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30807}: signal.setitimer() may disable the timer when passed a tiny
value. Tiny values (such as 1e-6) are valid non-zero values for
setitimer(), which is specified as taking microsecond-resolution
intervals. However, on some platform, our conversion routine could convert
1e-6 into a zero interval, therefore disabling the timer instead of
(re-)scheduling it.

@item 
bpo-30441@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30441}: Fix bug when modifying os.environ while iterating over it

@item 
bpo-30532@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30532}: Fix email header value parser dropping folding white space in
certain cases.

@item 
bpo-30879@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30879}: os.listdir() and os.scandir() now emit bytes names when called
with bytes-like argument.

@item 
bpo-30746@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30746}: Prohibited the ‘=’ character in environment variable names in
@code{os.putenv()} and @code{os.spawn*()}.

@item 
bpo-29755@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29755}: Fixed the lgettext() family of functions in the gettext module.
They now always return bytes.
@end itemize

@node Documentation<73>,Tests<71>,Library<182>,Python 3 6 3 release candidate 1
@anchor{whatsnew/changelog id914}@anchor{1f12}
@subsubsection Documentation



@itemize -

@item 
bpo-31294@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31294}: Fix incomplete code snippet in the ZeroMQSocketListener and
ZeroMQSocketHandler examples and adapt them to Python 3.

@item 
bpo-21649@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21649}: Add RFC 7525 and Mozilla server side TLS links to SSL
documentation.

@item 
bpo-30803@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30803}: Clarify doc on truth value testing. Original patch by Peter
Thomassen.
@end itemize

@node Tests<71>,Build<80>,Documentation<73>,Python 3 6 3 release candidate 1
@anchor{whatsnew/changelog id915}@anchor{1f13}
@subsubsection Tests



@itemize -

@item 
bpo-31320@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31320}: Silence traceback in test_ssl

@item 
bpo-25674@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25674}: Remove sha256.tbs-internet.com ssl test

@item 
bpo-30715@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30715}: Address ALPN callback changes for OpenSSL 1.1.0f. The latest
version behaves like OpenSSL 1.0.2 and no longer aborts handshake.

@item 
bpo-30822@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30822}: regrtest: Exclude tzdata from regrtest –all. When running the
test suite using –use=all / -u all, exclude tzdata since it makes
test_datetime too slow (15-20 min on some buildbots) which then times out
on some buildbots. Fix also regrtest command line parser to allow passing
-u extralargefile to run test_zipfile64.
@end itemize

@node Build<80>,Windows<69>,Tests<71>,Python 3 6 3 release candidate 1
@anchor{whatsnew/changelog id916}@anchor{1f14}
@subsubsection Build



@itemize -

@item 
bpo-30854@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30854}: Fix compile error when compiling –without-threads. Patch by
Masayuki Yamamoto.
@end itemize

@node Windows<69>,IDLE<50>,Build<80>,Python 3 6 3 release candidate 1
@anchor{whatsnew/changelog id917}@anchor{1f15}
@subsubsection Windows



@itemize -

@item 
bpo-30389@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30389}: Adds detection of Visual Studio 2017 to distutils on Windows.

@item 
bpo-31340@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31340}: Change to building with MSVC v141 (included with Visual Studio
2017)

@item 
bpo-30581@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30581}: os.cpu_count() now returns the correct number of processors on
Windows when the number of logical processors is greater than 64.

@item 
bpo-30731@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30731}: Add a missing xmlns to python.manifest so that it matches the
schema.
@end itemize

@node IDLE<50>,Tools/Demos<47>,Windows<69>,Python 3 6 3 release candidate 1
@anchor{whatsnew/changelog id918}@anchor{1f16}
@subsubsection IDLE



@itemize -

@item 
bpo-31493@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31493}: IDLE code context – fix code update and font update timers.
Canceling timers prevents a warning message when test_idle completes.

@item 
bpo-31488@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31488}: IDLE - Update non-key options in former extension classes. When
applying configdialog changes, call .reload for each feature class. Change
ParenMatch so updated options affect existing instances attached to
existing editor windows.

@item 
bpo-31477@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31477}: IDLE - Improve rstrip entry in doc. Strip trailing whitespace
strips more than blank spaces.  Multiline string literals are not skipped.

@item 
bpo-31480@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31480}: IDLE - make tests pass with zzdummy extension disabled by
default.

@item 
bpo-31421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31421}: Document how IDLE runs tkinter programs. IDLE calls tcl/tk
update in the background in order to make live interaction and
experimentation with tkinter applications much easier.

@item 
bpo-31414@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31414}: IDLE – fix tk entry box tests by deleting first. Adding to an
int entry is not the same as deleting and inserting because int(‘’) will
fail.

@item 
bpo-31051@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31051}: Rearrange IDLE configdialog GenPage into Window, Editor, and
Help sections.

@item 
bpo-30617@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30617}: IDLE - Add docstrings and tests for outwin subclass of editor.
Move some data and functions from the class to module level. Patch by
Cheryl Sabella.

@item 
bpo-31287@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31287}: IDLE - Do not modify tkinter.message in test_configdialog.

@item 
bpo-27099@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27099}: Convert IDLE’s built-in ‘extensions’ to regular features. About
10 IDLE features were implemented as supposedly optional extensions. Their
different behavior could be confusing or worse for users and not good for
maintenance. Hence the conversion. The main difference for users is that
user configurable key bindings for builtin features are now handled
uniformly. Now, editing a binding in a keyset only affects its value in
the keyset. All bindings are defined together in the system-specific
default keysets in config-extensions.def. All custom keysets are saved as
a whole in config-extension.cfg.  All take effect as soon as one clicks
Apply or Ok. The affected events are ‘<<force-open-completions>>’,
‘<<expand-word>>’, ‘<<force-open-calltip>>’, ‘<<flash-paren>>’,
‘<<format-paragraph>>’, ‘<<run-module>>’, ‘<<check-module>>’, and
‘<<zoom-height>>’.  Any (global) customizations made before 3.6.3 will not
affect their keyset-specific customization after 3.6.3. and vice versa.
Initial patch by Charles Wohlganger.

@item 
bpo-31206@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31206}: IDLE: Factor HighPage(Frame) class from ConfigDialog. Patch by
Cheryl Sabella.

@item 
bpo-31001@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31001}: Add tests for configdialog highlight tab.  Patch by Cheryl
Sabella.

@item 
bpo-31205@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31205}: IDLE: Factor KeysPage(Frame) class from ConfigDialog.  The
slightly modified tests continue to pass.  Patch by Cheryl Sabella.

@item 
bpo-31130@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31130}: IDLE – stop leaks in test_configdialog. Initial patch by
Victor Stinner.

@item 
bpo-31002@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31002}: Add tests for configdialog keys tab. Patch by Cheryl Sabella.

@item 
bpo-19903@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19903}: IDLE: Calltips use @code{inspect.signature} instead of
@code{inspect.getfullargspec}. This improves calltips for builtins converted
to use Argument Clinic. Patch by Louie Lu.

@item 
bpo-31083@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31083}: IDLE - Add an outline of a TabPage class in configdialog.
Update existing classes to match outline. Initial patch by Cheryl Sabella.

@item 
bpo-31050@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31050}: Factor GenPage(Frame) class from ConfigDialog. The slightly
modified tests continue to pass. Patch by Cheryl Sabella.

@item 
bpo-31004@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31004}: IDLE - Factor FontPage(Frame) class from ConfigDialog. Slightly
modified tests continue to pass. Fix General tests. Patch mostly by Cheryl
Sabella.

@item 
bpo-30781@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30781}: IDLE - Use ttk widgets in ConfigDialog. Patches by Terry Jan
Reedy and Cheryl Sabella.

@item 
bpo-31060@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31060}: IDLE - Finish rearranging methods of ConfigDialog Grouping
methods pertaining to each tab and the buttons will aid writing tests and
improving the tabs and will enable splitting the groups into classes.

@item 
bpo-30853@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30853}: IDLE – Factor a VarTrace class out of ConfigDialog. Instance
tracers manages pairs consisting of a tk variable and a callback function.
When tracing is turned on, setting the variable calls the function.  Test
coverage for the new class is 100%.

@item 
bpo-31003@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31003}: IDLE: Add more tests for General tab.

@item 
bpo-30993@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30993}: IDLE - Improve configdialog font page and tests. In
configdialog: Document causal pathways in create_font_tab docstring.
Simplify some attribute names. Move set_samples calls to var_changed_font
(idea from Cheryl Sabella).  Move related functions to positions after the
create widgets function. In test_configdialog: Fix test_font_set so not
order dependent.  Fix renamed test_indent_scale so it tests the widget.
Adjust tests for movement of set_samples call.  Add tests for load
functions.  Put all font tests in one class and tab indent tests in
another.  Except for two lines, these tests completely cover the related
functions.

@item 
bpo-30981@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30981}: IDLE – Add more configdialog font page tests.

@item 
bpo-28523@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28523}: IDLE: replace ‘colour’ with ‘color’ in configdialog.

@item 
bpo-30917@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30917}: Add tests for idlelib.config.IdleConf. Increase coverage from
46% to 96%. Patch by Louie Lu.

@item 
bpo-30934@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30934}: Document coverage details for idlelib tests. Add section to
idlelib/idle-test/README.txt. Include check that branches are taken both
ways. Exclude IDLE-specific code that does not run during unit tests.

@item 
bpo-30913@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30913}: IDLE: Document ConfigDialog tk Vars, methods, and widgets in
docstrings This will facilitate improving the dialog and splitting up the
class. Original patch by Cheryl Sabella.

@item 
bpo-30899@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30899}: IDLE: Add tests for ConfigParser subclasses in config. Patch by
Louie Lu.

@item 
bpo-30881@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30881}: IDLE: Add docstrings to browser.py. Patch by Cheryl Sabella.

@item 
bpo-30851@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30851}: IDLE: Remove unused variables in configdialog.  One is a
duplicate, one is set but cannot be altered by users. Patch by Cheryl
Sabella.

@item 
bpo-30870@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30870}: IDLE: In Settings dialog, select font with Up, Down keys as
well as mouse. Initial patch by Louie Lu.

@item 
bpo-8231@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8231}: IDLE: call config.IdleConf.GetUserCfgDir only once.

@item 
bpo-30779@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30779}: IDLE: Factor ConfigChanges class from configdialog, put in
config; test. * In config, put dump test code in a function; run it and
unittest in   ‘if __name__ == ‘__main__’. * Add class config.ConfigChanges
based on changes_class_v4.py on bpo issue. * Add class
test_config.ChangesTest, partly using configdialog_tests_v1.py. * Revise
configdialog to use ConfigChanges; see tracker msg297804. * Revise
test_configdialog to match configdialog changes. * Remove configdialog
functions unused or moved to ConfigChanges. Cheryl Sabella contributed
parts of the patch.

@item 
bpo-30777@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30777}: IDLE: configdialog - Add docstrings and fix comments. Patch by
Cheryl Sabella.

@item 
bpo-30495@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30495}: IDLE: Improve textview with docstrings, PEP8 names, and more
tests. Patch by Cheryl Sabella.

@item 
bpo-30723@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30723}: IDLE: Make several improvements to parenmatch. Add ‘parens’
style to highlight both opener and closer. Make ‘default’ style, which is
not default, a synonym for ‘opener’. Make time-delay work the same with
all styles. Add help for config dialog extensions tab, including help for
parenmatch. Add new tests.  Original patch by Charles Wohlganger.

@item 
bpo-30674@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30674}: IDLE: add docstrings to grep module. Patch by Cheryl Sabella

@item 
bpo-21519@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21519}: IDLE’s basic custom key entry dialog now detects duplicates
properly. Original patch by Saimadhav Heblikar.

@item 
bpo-29910@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29910}: IDLE no longer deletes a character after commenting out a
region by a key shortcut.  Add @code{return 'break'} for this and other
potential conflicts between IDLE and default key bindings.

@item 
bpo-30728@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30728}: Review and change idlelib.configdialog names. Lowercase method
and attribute names. Replace ‘colour’ with ‘color’, expand overly cryptic
names, delete unneeded underscores. Replace @code{import *} with specific
imports. Patches by Cheryl Sabella.

@item 
bpo-6739@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6739}: IDLE: Verify user-entered key sequences by trying to bind them
with tk. Add tests for all 3 validation functions. Original patch by G
Polo.  Tests added by Cheryl Sabella.
@end itemize

@node Tools/Demos<47>,,IDLE<50>,Python 3 6 3 release candidate 1
@anchor{whatsnew/changelog id919}@anchor{1f17}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-30983@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30983}: gdb integration commands (py-bt, etc.) work on optimized shared
builds now, too.  
@geindex Python Enhancement Proposals; PEP 523
PEP 523@footnote{https://peps.python.org/pep-0523/} introduced _PyEval_EvalFrameDefault which
inlines PyEval_EvalFrameEx on non-debug shared builds.  This broke the
ability to use py-bt, py-up, and a few other Python-specific gdb
integrations. The problem is fixed by only looking for
_PyEval_EvalFrameDefault frames in python-gdb.py.  Original patch by Bruno
“Polaco” Penteado.
@end itemize

@node Python 3 6 2 final,Python 3 6 2 release candidate 2,Python 3 6 3 release candidate 1,Changelog
@anchor{whatsnew/changelog python-3-6-2-final}@anchor{1f18}
@subsection Python 3.6.2 final


`Release date: 2017-07-17'

No changes since release candidate 2

@node Python 3 6 2 release candidate 2,Python 3 6 2 release candidate 1,Python 3 6 2 final,Changelog
@anchor{whatsnew/changelog python-3-6-2-release-candidate-2}@anchor{1f19}
@subsection Python 3.6.2 release candidate 2


`Release date: 2017-07-07'

@menu
* Security: Security<56>. 

@end menu

@node Security<56>,,,Python 3 6 2 release candidate 2
@anchor{whatsnew/changelog id920}@anchor{1f1a}
@subsubsection Security



@itemize -

@item 
bpo-30730@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30730}: Prevent environment variables injection in subprocess on
Windows.  Prevent passing other environment variables and command
arguments.

@item 
bpo-30694@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30694}: Upgrade expat copy from 2.2.0 to 2.2.1 to get fixes of multiple
security vulnerabilities including: 
@geindex Common Vulnerabilities and Exposures; CVE 2017-9233
CVE 2017-9233@footnote{https://www.cve.org/CVERecord?id=CVE-2017-9233} (External entity
infinite loop DoS), 
@geindex Common Vulnerabilities and Exposures; CVE 2016-9063
CVE 2016-9063@footnote{https://www.cve.org/CVERecord?id=CVE-2016-9063} (Integer overflow, re-fix),
@geindex Common Vulnerabilities and Exposures; CVE 2016-0718
CVE 2016-0718@footnote{https://www.cve.org/CVERecord?id=CVE-2016-0718} (Fix regression bugs from 2.2.0’s fix to
@geindex Common Vulnerabilities and Exposures; CVE 2016-0718
CVE 2016-0718@footnote{https://www.cve.org/CVERecord?id=CVE-2016-0718}) and 
@geindex Common Vulnerabilities and Exposures; CVE 2012-0876
CVE 2012-0876@footnote{https://www.cve.org/CVERecord?id=CVE-2012-0876} (Counter hash flooding with
SipHash). Note: the 
@geindex Common Vulnerabilities and Exposures; CVE 2016-5300
CVE 2016-5300@footnote{https://www.cve.org/CVERecord?id=CVE-2016-5300} (Use os-specific entropy sources like
getrandom) doesn’t impact Python, since Python already gets entropy from
the OS to set the expat secret using @code{XML_SetHashSalt()}.

@item 
bpo-30500@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30500}: Fix urllib.parse.splithost() to correctly parse fragments. For
example, @code{splithost('//127.0.0.1#@@evil.com/')} now correctly returns the
@code{127.0.0.1} host, instead of treating @code{@@evil.com} as the host in an
authentication (@code{login@@host}).
@end itemize

@node Python 3 6 2 release candidate 1,Python 3 6 1 final,Python 3 6 2 release candidate 2,Changelog
@anchor{whatsnew/changelog python-3-6-2-release-candidate-1}@anchor{1f1b}
@subsection Python 3.6.2 release candidate 1


`Release date: 2017-06-17'

@menu
* Security: Security<57>. 
* Core and Builtins: Core and Builtins<178>. 
* Library: Library<183>. 
* IDLE: IDLE<51>. 
* C API: C API<70>. 
* Build: Build<81>. 
* Documentation: Documentation<74>. 
* Tools/Demos: Tools/Demos<48>. 
* Tests: Tests<72>. 
* Windows: Windows<70>. 

@end menu

@node Security<57>,Core and Builtins<178>,,Python 3 6 2 release candidate 1
@anchor{whatsnew/changelog id921}@anchor{1f1c}
@subsubsection Security



@itemize -

@item 
bpo-29591@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29591}: Update expat copy from 2.1.1 to 2.2.0 to get fixes of
@geindex Common Vulnerabilities and Exposures; CVE 2016-0718
CVE 2016-0718@footnote{https://www.cve.org/CVERecord?id=CVE-2016-0718} and 
@geindex Common Vulnerabilities and Exposures; CVE 2016-4472
CVE 2016-4472@footnote{https://www.cve.org/CVERecord?id=CVE-2016-4472}. See
@indicateurl{https://sourceforge.net/p/expat/bugs/537/} for more information.
@end itemize

@node Core and Builtins<178>,Library<183>,Security<57>,Python 3 6 2 release candidate 1
@anchor{whatsnew/changelog id922}@anchor{1f1d}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-30682@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30682}: Removed a too-strict assertion that failed for certain
f-strings, such as eval(“f’\n’”) and eval(“f’\r’”).

@item 
bpo-30604@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30604}: Move co_extra_freefuncs to not be per-thread to avoid crashes

@item 
bpo-29104@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29104}: Fixed parsing backslashes in f-strings.

@item 
bpo-27945@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27945}: Fixed various segfaults with dict when input collections are
mutated during searching, inserting or comparing.  Based on patches by
Duane Griffin and Tim Mitchell.

@item 
bpo-25794@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25794}: Fixed type.__setattr__() and type.__delattr__() for
non-interned attribute names.  Based on patch by Eryk Sun.

@item 
bpo-30039@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30039}: If a KeyboardInterrupt happens when the interpreter is in the
middle of resuming a chain of nested ‘yield from’ or ‘await’ calls, it’s
now correctly delivered to the innermost frame.

@item 
bpo-12414@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12414}: sys.getsizeof() on a code object now returns the sizes which
includes the code struct and sizes of objects which it references. Patch
by Donghee Na.

@item 
bpo-29949@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29949}: Fix memory usage regression of set and frozenset object.

@item 
bpo-29935@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29935}: Fixed error messages in the index() method of tuple, list and
deque when pass indices of wrong type.

@item 
bpo-29859@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29859}: Show correct error messages when any of the pthread_* calls in
thread_pthread.h fails.

@item 
bpo-28876@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28876}: @code{bool(range)} works even if @code{len(range)} raises
@ref{a87,,OverflowError}.

@item 
bpo-29600@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29600}: Fix wrapping coroutine return values in StopIteration.

@item 
bpo-28856@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28856}: Fix an oversight that %b format for bytes should support
objects follow the buffer protocol.

@item 
bpo-29714@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29714}: Fix a regression that bytes format may fail when containing
zero bytes inside.

@item 
bpo-29478@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29478}: If max_line_length=None is specified while using the Compat32
policy, it is no longer ignored.  Patch by Mircea Cosbuc.
@end itemize

@node Library<183>,IDLE<51>,Core and Builtins<178>,Python 3 6 2 release candidate 1
@anchor{whatsnew/changelog id923}@anchor{1f1e}
@subsubsection Library



@itemize -

@item 
bpo-30616@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30616}: Functional API of enum allows to create empty enums. Patched by
Donghee Na

@item 
bpo-30038@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30038}: Fix race condition between signal delivery and wakeup file
descriptor. Patch by Nathaniel Smith.

@item 
bpo-23894@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23894}: lib2to3 now recognizes @code{rb'...'} and @code{f'...'} strings.

@item 
bpo-23890@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23890}: unittest.TestCase.assertRaises() now manually breaks a
reference cycle to not keep objects alive longer than expected.

@item 
bpo-30149@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30149}: inspect.signature() now supports callables with
variable-argument parameters wrapped with partialmethod. Patch by Donghee
Na.

@item 
bpo-30645@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30645}: Fix path calculation in imp.load_package(), fixing it for cases
when a package is only shipped with bytecodes. Patch by Alexandru
Ardelean.

@item 
bpo-29931@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29931}: Fixed comparison check for ipaddress.ip_interface objects.
Patch by Sanjay Sundaresan.

@item 
bpo-30605@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30605}: re.compile() no longer raises a BytesWarning when compiling a
bytes instance with misplaced inline modifier.  Patch by Roy Williams.

@item 
bpo-24484@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24484}: Avoid race condition in multiprocessing cleanup (#2159)

@item 
bpo-28994@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28994}: The traceback no longer displayed for SystemExit raised in a
callback registered by atexit.

@item 
bpo-30508@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30508}: Don’t log exceptions if Task/Future “cancel()” method was
called.

@item 
bpo-28556@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28556}: Updates to typing module: Add generic AsyncContextManager, add
support for ContextManager on all versions. Original PRs by Jelle Zijlstra
and Ivan Levkivskyi

@item 
bpo-29870@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29870}: Fix ssl sockets leaks when connection is aborted in asyncio/ssl
implementation. Patch by Michaël Sghaïer.

@item 
bpo-29743@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29743}: Closing transport during handshake process leaks open socket.
Patch by Nikolay Kim

@item 
bpo-27585@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27585}: Fix waiter cancellation in asyncio.Lock. Patch by Mathieu
Sornay.

@item 
bpo-30418@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30418}: On Windows, subprocess.Popen.communicate() now also ignore
EINVAL on stdin.write() if the child process is still running but closed
the pipe.

@item 
bpo-29822@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29822}: inspect.isabstract() now works during __init_subclass__.  Patch
by Nate Soares.

@item 
bpo-29581@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29581}: ABCMeta.__new__ now accepts @code{**kwargs}, allowing abstract
base classes to use keyword parameters in __init_subclass__. Patch by Nate
Soares.

@item 
bpo-30557@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30557}: faulthandler now correctly filters and displays exception codes
on Windows

@item 
bpo-30378@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30378}: Fix the problem that logging.handlers.SysLogHandler cannot
handle IPv6 addresses.

@item 
bpo-29960@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29960}: Preserve generator state when _random.Random.setstate() raises
an exception. Patch by Bryan Olson.

@item 
bpo-30414@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30414}: multiprocessing.Queue._feed background running thread do not
break from main loop on exception.

@item 
bpo-30003@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30003}: Fix handling escape characters in HZ codec.  Based on patch by
Ma Lin.

@item 
bpo-30301@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30301}: Fix AttributeError when using SimpleQueue.empty() under `spawn'
and `forkserver' start methods.

@item 
bpo-30329@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30329}: imaplib and poplib now catch the Windows socket WSAEINVAL error
(code 10022) on shutdown(SHUT_RDWR): An invalid operation was attempted.
This error occurs sometimes on SSL connections.

@item 
bpo-30375@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30375}: Warnings emitted when compile a regular expression now always
point to the line in the user code.  Previously they could point into
inners of the re module if emitted from inside of groups or conditionals.

@item 
bpo-30048@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30048}: Fixed @code{Task.cancel()} can be ignored when the task is running
coroutine and the coroutine returned without any more @code{await}.

@item 
bpo-30266@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30266}: contextlib.AbstractContextManager now supports
anti-registration by setting __enter__ = None or __exit__ = None,
following the pattern introduced in bpo-25958@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25958}. Patch by Jelle Zijlstra.

@item 
bpo-30298@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30298}: Weaken the condition of deprecation warnings for inline
modifiers. Now allowed several subsequential inline modifiers at the start
of the pattern (e.g. @code{'(?i)(?s)...'}).  In verbose mode whitespaces and
comments now are allowed before and between inline modifiers (e.g. @code{'(?x)
(?i) (?s)...'}).

@item 
bpo-29990@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29990}: Fix range checking in GB18030 decoder.  Original patch by Ma
Lin.

@item 
bpo-26293@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26293}: Change resulted because of zipfile breakage. (See also:
bpo-29094@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29094})

@item 
bpo-30243@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30243}: Removed the __init__ methods of _json’s scanner and encoder.
Misusing them could cause memory leaks or crashes.  Now scanner and
encoder objects are completely initialized in the __new__ methods.

@item 
bpo-30185@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30185}: Avoid KeyboardInterrupt tracebacks in forkserver helper process
when Ctrl-C is received.

@item 
bpo-28556@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28556}: Various updates to typing module: add typing.NoReturn type, use
WrapperDescriptorType, minor bug-fixes.  Original PRs by Jim
Fasarakis-Hilliard and Ivan Levkivskyi.

@item 
bpo-30205@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30205}: Fix getsockname() for unbound AF_UNIX sockets on Linux.

@item 
bpo-30070@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30070}: Fixed leaks and crashes in errors handling in the parser
module.

@item 
bpo-30061@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30061}: Fixed crashes in IOBase methods __next__() and readlines() when
readline() or __next__() respectively return non-sizeable object. Fixed
possible other errors caused by not checking results of PyObject_Size(),
PySequence_Size(), or PyMapping_Size().

@item 
bpo-30017@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30017}: Allowed calling the close() method of the zip entry writer
object multiple times.  Writing to a closed writer now always produces a
ValueError.

@item 
bpo-30068@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30068}: _io._IOBase.readlines will check if it’s closed first when hint
is present.

@item 
bpo-29694@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29694}: Fixed race condition in pathlib mkdir with flags parents=True.
Patch by Armin Rigo.

@item 
bpo-29692@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29692}: Fixed arbitrary unchaining of RuntimeError exceptions in
contextlib.contextmanager.  Patch by Siddharth Velankar.

@item 
bpo-29998@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29998}: Pickling and copying ImportError now preserves name and path
attributes.

@item 
bpo-29953@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29953}: Fixed memory leaks in the replace() method of datetime and time
objects when pass out of bound fold argument.

@item 
bpo-29942@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29942}: Fix a crash in itertools.chain.from_iterable when encountering
long runs of empty iterables.

@item 
bpo-27863@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27863}: Fixed multiple crashes in ElementTree caused by race conditions
and wrong types.

@item 
bpo-28699@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28699}: Fixed a bug in pools in multiprocessing.pool that raising an
exception at the very first of an iterable may swallow the exception or
make the program hang. Patch by Davin Potts and Xiang Zhang.

@item 
bpo-25803@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25803}: Avoid incorrect errors raised by Path.mkdir(exist_ok=True) when
the OS gives priority to errors such as EACCES over EEXIST.

@item 
bpo-29861@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29861}: Release references to tasks, their arguments and their results
as soon as they are finished in multiprocessing.Pool.

@item 
bpo-29884@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29884}: faulthandler: Restore the old sigaltstack during teardown.
Patch by Christophe Zeitouny.

@item 
bpo-25455@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25455}: Fixed crashes in repr of recursive buffered file-like objects.

@item 
bpo-29800@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29800}: Fix crashes in partial.__repr__ if the keys of partial.keywords
are not strings.  Patch by Michael Seifert.

@item 
bpo-29742@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29742}: get_extra_info() raises exception if get called on closed ssl
transport. Patch by Nikolay Kim.

@item 
bpo-8256@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8256}: Fixed possible failing or crashing input() if attributes
“encoding” or “errors” of sys.stdin or sys.stdout are not set or are not
strings.

@item 
bpo-28298@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28298}: Fix a bug that prevented array ‘Q’, ‘L’ and ‘I’ from accepting
big intables (objects that have __int__) as elements.  Patch by Oren
Milman.

@item 
bpo-28231@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28231}: The zipfile module now accepts path-like objects for external
paths.

@item 
bpo-26915@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26915}: index() and count() methods of collections.abc.Sequence now
check identity before checking equality when do comparisons.

@item 
bpo-29615@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29615}: SimpleXMLRPCDispatcher no longer chains KeyError (or any other
exception) to exception(s) raised in the dispatched methods. Patch by Petr
Motejlek.

@item 
bpo-30177@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30177}: path.resolve(strict=False) no longer cuts the path after the
first element not present in the filesystem.  Patch by Antoine Pietri.
@end itemize

@node IDLE<51>,C API<70>,Library<183>,Python 3 6 2 release candidate 1
@anchor{whatsnew/changelog id924}@anchor{1f1f}
@subsubsection IDLE



@itemize -

@item 
bpo-15786@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15786}: Fix several problems with IDLE’s autocompletion box. The
following should now work: clicking on selection box items; using the
scrollbar; selecting an item by hitting Return. Hangs on MacOSX should no
longer happen. Patch by Louie Lu.

@item 
bpo-25514@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25514}: Add doc subsubsection about IDLE failure to start. Popup
no-connection message directs users to this section.

@item 
bpo-30642@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30642}: Fix reference leaks in IDLE tests. Patches by Louie Lu and
Terry Jan Reedy.

@item 
bpo-30495@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30495}: Add docstrings for textview.py and use PEP8 names. Patches by
Cheryl Sabella and Terry Jan Reedy.

@item 
bpo-30290@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30290}: Help-about: use pep8 names and add tests. Increase coverage to
100%. Patches by Louie Lu, Cheryl Sabella, and Terry Jan Reedy.

@item 
bpo-30303@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30303}: Add _utest option to textview; add new tests. Increase coverage
to 100%. Patches by Louie Lu and Terry Jan Reedy.
@end itemize

@node C API<70>,Build<81>,IDLE<51>,Python 3 6 2 release candidate 1
@anchor{whatsnew/changelog id925}@anchor{1f20}
@subsubsection C API



@itemize -

@item 
bpo-27867@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27867}: Function PySlice_GetIndicesEx() no longer replaced with a macro
if Py_LIMITED_API is not set.
@end itemize

@node Build<81>,Documentation<74>,C API<70>,Python 3 6 2 release candidate 1
@anchor{whatsnew/changelog id926}@anchor{1f21}
@subsubsection Build



@itemize -

@item 
bpo-29941@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29941}: Add @code{--with-assertions} configure flag to explicitly enable C
@code{assert()} checks. Defaults to off. @code{--with-pydebug} implies
@code{--with-assertions}.

@item 
bpo-28787@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28787}: Fix out-of-tree builds of Python when configured with
@code{--with--dtrace}.

@item 
bpo-29243@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29243}: Prevent unnecessary rebuilding of Python during @code{make test},
@code{make install} and some other make targets when configured with
@code{--enable-optimizations}.

@item 
bpo-23404@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23404}: Don’t regenerate generated files based on file modification
time anymore: the action is now explicit. Replace @code{make touch} with
@code{make regen-all}.

@item 
bpo-29643@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29643}: Fix @code{--enable-optimization} didn’t work.
@end itemize

@node Documentation<74>,Tools/Demos<48>,Build<81>,Python 3 6 2 release candidate 1
@anchor{whatsnew/changelog id927}@anchor{1f22}
@subsubsection Documentation



@itemize -

@item 
bpo-30176@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30176}: Add missing attribute related constants in curses
documentation.

@item 
bpo-30052@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30052}: the link targets for @ref{193,,bytes()} and @ref{342,,bytearray()} are
now their respective type definitions, rather than the corresponding
builtin function entries. Use @ref{1edc,,bytes} and
@ref{1edd,,bytearray} to reference the latter. In order to
ensure this and future cross-reference updates are applied automatically,
the daily documentation builds now disable the default output caching
features in Sphinx.

@item 
bpo-26985@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26985}: Add missing info of code object in inspect documentation.
@end itemize

@node Tools/Demos<48>,Tests<72>,Documentation<74>,Python 3 6 2 release candidate 1
@anchor{whatsnew/changelog id928}@anchor{1f23}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-29367@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29367}: python-gdb.py now supports also @code{method-wrapper}
(@code{wrapperobject}) objects.
@end itemize

@node Tests<72>,Windows<70>,Tools/Demos<48>,Python 3 6 2 release candidate 1
@anchor{whatsnew/changelog id929}@anchor{1f24}
@subsubsection Tests



@itemize -

@item 
bpo-30357@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30357}: test_thread: setUp() now uses support.threading_setup() and
support.threading_cleanup() to wait until threads complete to avoid random
side effects on following tests. Initial patch written by Grzegorz
Grzywacz.

@item 
bpo-30197@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30197}: Enhanced functions swap_attr() and swap_item() in the
test.support module. They now work when delete replaced attribute or item
inside the with statement.  The old value of the attribute or item (or
None if it doesn’t exist) now will be assigned to the target of the “as”
clause, if there is one.
@end itemize

@node Windows<70>,,Tests<72>,Python 3 6 2 release candidate 1
@anchor{whatsnew/changelog id930}@anchor{1f25}
@subsubsection Windows



@itemize -

@item 
bpo-30687@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30687}: Locate msbuild.exe on Windows when building rather than
vcvarsall.bat

@item 
bpo-30450@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30450}: The build process on Windows no longer depends on Subversion,
instead pulling external code from GitHub via a Python script.  If Python
3.6 is not found on the system (via @code{py -3.6}), NuGet is used to
download a copy of 32-bit Python.
@end itemize

@node Python 3 6 1 final,Python 3 6 1 release candidate 1,Python 3 6 2 release candidate 1,Changelog
@anchor{whatsnew/changelog python-3-6-1-final}@anchor{1f26}
@subsection Python 3.6.1 final


`Release date: 2017-03-21'

@menu
* Core and Builtins: Core and Builtins<179>. 
* Build: Build<82>. 

@end menu

@node Core and Builtins<179>,Build<82>,,Python 3 6 1 final
@anchor{whatsnew/changelog id931}@anchor{1f27}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-29723@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29723}: The @code{sys.path[0]} initialization change for bpo-29139@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29139} caused
a regression by revealing an inconsistency in how sys.path is initialized
when executing @code{__main__} from a zipfile, directory, or other import
location. The interpreter now consistently avoids ever adding the import
location’s parent directory to @code{sys.path}, and ensures no other
@code{sys.path} entries are inadvertently modified when inserting the import
location named on the command line.
@end itemize

@node Build<82>,,Core and Builtins<179>,Python 3 6 1 final
@anchor{whatsnew/changelog id932}@anchor{1f28}
@subsubsection Build



@itemize -

@item 
bpo-27593@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27593}: fix format of git information used in sys.version

@item 
Fix incompatible comment in python.h
@end itemize

@node Python 3 6 1 release candidate 1,Python 3 6 0 final,Python 3 6 1 final,Changelog
@anchor{whatsnew/changelog python-3-6-1-release-candidate-1}@anchor{1f29}
@subsection Python 3.6.1 release candidate 1


`Release date: 2017-03-04'

@menu
* Core and Builtins: Core and Builtins<180>. 
* Library: Library<184>. 
* IDLE: IDLE<52>. 
* Windows: Windows<71>. 
* C API: C API<71>. 
* Documentation: Documentation<75>. 
* Tests: Tests<73>. 
* Build: Build<83>. 

@end menu

@node Core and Builtins<180>,Library<184>,,Python 3 6 1 release candidate 1
@anchor{whatsnew/changelog id933}@anchor{1f2a}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-28893@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28893}: Set correct __cause__ for errors about invalid awaitables
returned from __aiter__ and __anext__.

@item 
bpo-29683@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29683}: Fixes to memory allocation in _PyCode_SetExtra.  Patch by Brian
Coleman.

@item 
bpo-29684@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29684}: Fix minor regression of PyEval_CallObjectWithKeywords. It
should raise TypeError when kwargs is not a dict.  But it might cause segv
when args=NULL and kwargs is not a dict.

@item 
bpo-28598@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28598}: Support __rmod__ for subclasses of str being called before
str.__mod__. Patch by Martijn Pieters.

@item 
bpo-29607@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29607}: Fix stack_effect computation for CALL_FUNCTION_EX. Patch by
Matthieu Dartiailh.

@item 
bpo-29602@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29602}: Fix incorrect handling of signed zeros in complex constructor
for complex subclasses and for inputs having a __complex__ method. Patch
by Serhiy Storchaka.

@item 
bpo-29347@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29347}: Fixed possibly dereferencing undefined pointers when creating
weakref objects.

@item 
bpo-29438@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29438}: Fixed use-after-free problem in key sharing dict.

@item 
bpo-29319@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29319}: Prevent RunMainFromImporter overwriting sys.path[0].

@item 
bpo-29337@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29337}: Fixed possible BytesWarning when compare the code objects.
Warnings could be emitted at compile time.

@item 
bpo-29327@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29327}: Fixed a crash when pass the iterable keyword argument to
sorted().

@item 
bpo-29034@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29034}: Fix memory leak and use-after-free in os module
(path_converter).

@item 
bpo-29159@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29159}: Fix regression in bytes(x) when x.__index__() raises Exception.

@item 
bpo-28932@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28932}: Do not include <sys/random.h> if it does not exist.

@item 
bpo-25677@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25677}: Correct the positioning of the syntax error caret for indented
blocks. Based on patch by Michael Layzell.

@item 
bpo-29000@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29000}: Fixed bytes formatting of octals with zero padding in alternate
form.

@item 
bpo-26919@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26919}: On Android, operating system data is now always encoded/decoded
to/from UTF-8, instead of the locale encoding to avoid inconsistencies
with os.fsencode() and os.fsdecode() which are already using UTF-8.

@item 
bpo-28991@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28991}: functools.lru_cache() was susceptible to an obscure reentrancy
bug triggerable by a monkey-patched len() function.

@item 
bpo-28739@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28739}: f-string expressions are no longer accepted as docstrings and
by ast.literal_eval() even if they do not include expressions.

@item 
bpo-28512@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28512}: Fixed setting the offset attribute of SyntaxError by
PyErr_SyntaxLocationEx() and PyErr_SyntaxLocationObject().

@item 
bpo-28918@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28918}: Fix the cross compilation of xxlimited when Python has been
built with Py_DEBUG defined.

@item 
bpo-28731@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28731}: Optimize _PyDict_NewPresized() to create correct size dict.
Improve speed of dict literal with constant keys up to 30%.
@end itemize

@node Library<184>,IDLE<52>,Core and Builtins<180>,Python 3 6 1 release candidate 1
@anchor{whatsnew/changelog id934}@anchor{1f2b}
@subsubsection Library



@itemize -

@item 
bpo-29169@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29169}: Update zlib to 1.2.11.

@item 
bpo-29623@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29623}: Allow use of path-like object as a single argument in
ConfigParser.read(). Patch by David Ellis.

@item 
bpo-28963@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28963}: Fix out of bound iteration in
asyncio.Future.remove_done_callback implemented in C.

@item 
bpo-29704@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29704}: asyncio.subprocess.SubprocessStreamProtocol no longer closes
before all pipes are closed.

@item 
bpo-29271@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29271}: Fix Task.current_task and Task.all_tasks implemented in C to
accept None argument as their pure Python implementation.

@item 
bpo-29703@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29703}: Fix asyncio to support instantiation of new event loops in
child processes.

@item 
bpo-29376@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29376}: Fix assertion error in threading._DummyThread.is_alive().

@item 
bpo-28624@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28624}: Add a test that checks that cwd parameter of Popen() accepts
PathLike objects.  Patch by Sayan Chowdhury.

@item 
bpo-28518@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28518}: Start a transaction implicitly before a DML statement. Patch by
Aviv Palivoda.

@item 
bpo-29532@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29532}: Altering a kwarg dictionary passed to functools.partial() no
longer affects a partial object after creation.

@item 
bpo-29110@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29110}: Fix file object leak in aifc.open() when file is given as a
filesystem path and is not in valid AIFF format. Patch by Anthony Zhang.

@item 
bpo-28556@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28556}: Various updates to typing module: typing.Counter,
typing.ChainMap, improved ABC caching, etc. Original PRs by Jelle
Zijlstra, Ivan Levkivskyi, Manuel Krebber, and Łukasz Langa.

@item 
bpo-29100@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29100}: Fix datetime.fromtimestamp() regression introduced in Python
3.6.0: check minimum and maximum years.

@item 
bpo-29519@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29519}: Fix weakref spewing exceptions during interpreter shutdown when
used with a rare combination of multiprocessing and custom codecs.

@item 
bpo-29416@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29416}: Prevent infinite loop in pathlib.Path.mkdir

@item 
bpo-29444@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29444}: Fixed out-of-bounds buffer access in the group() method of the
match object. Based on patch by WGH.

@item 
bpo-29335@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29335}: Fix subprocess.Popen.wait() when the child process has exited
to a stopped instead of terminated state (ex: when under ptrace).

@item 
bpo-29290@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29290}: Fix a regression in argparse that help messages would wrap at
non-breaking spaces.

@item 
bpo-28735@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28735}: Fixed the comparison of mock.MagickMock with mock.ANY.

@item 
bpo-29316@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29316}: Restore the provisional status of typing module, add
corresponding note to documentation. Patch by Ivan L.

@item 
bpo-29219@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29219}: Fixed infinite recursion in the repr of uninitialized
ctypes.CDLL instances.

@item 
bpo-29011@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29011}: Fix an important omission by adding Deque to the typing module.

@item 
bpo-28969@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28969}: Fixed race condition in C implementation of
functools.lru_cache. KeyError could be raised when cached function with
full cache was simultaneously called from different threads with the same
uncached arguments.

@item 
bpo-29142@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29142}: In urllib.request, suffixes in no_proxy environment variable
with leading dots could match related hostnames again (e.g. .b.c matches
a.b.c). Patch by Milan Oberkirch.

@item 
bpo-28961@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28961}: Fix unittest.mock._Call helper: don’t ignore the name parameter
anymore. Patch written by Jiajun Huang.

@item 
bpo-29203@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29203}: functools.lru_cache() now respects 
@geindex Python Enhancement Proposals; PEP 468
PEP 468@footnote{https://peps.python.org/pep-0468/} and preserves the
order of keyword arguments.  f(a=1, b=2) is now cached separately from
f(b=2, a=1) since both calls could potentially give different results.

@item 
bpo-15812@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15812}: inspect.getframeinfo() now correctly shows the first line of a
context. Patch by Sam Breese.

@item 
bpo-29094@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29094}: Offsets in a ZIP file created with extern file object and modes
“w” and “x” now are relative to the start of the file.

@item 
bpo-29085@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29085}: Allow random.Random.seed() to use high quality OS randomness
rather than the pid and time.

@item 
bpo-29061@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29061}: Fixed bug in secrets.randbelow() which would hang when given a
negative input.  Patch by Brendan Donegan.

@item 
bpo-29079@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29079}: Prevent infinite loop in pathlib.resolve() on Windows

@item 
bpo-13051@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13051}: Fixed recursion errors in large or resized
curses.textpad.Textbox.  Based on patch by Tycho Andersen.

@item 
bpo-29119@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29119}: Fix weakrefs in the pure python version of
collections.OrderedDict move_to_end() method. Contributed by Andra
Bogildea.

@item 
bpo-9770@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9770}: curses.ascii predicates now work correctly with negative
integers.

@item 
bpo-28427@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28427}: old keys should not remove new values from WeakValueDictionary
when collecting from another thread.

@item 
bpo-28923@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28923}: Remove editor artifacts from Tix.py.

@item 
bpo-29055@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29055}: Neaten-up empty population error on random.choice() by
suppressing the upstream exception.

@item 
bpo-28871@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28871}: Fixed a crash when deallocate deep ElementTree.

@item 
bpo-19542@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19542}: Fix bugs in WeakValueDictionary.setdefault() and
WeakValueDictionary.pop() when a GC collection happens in another thread.

@item 
bpo-20191@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20191}: Fixed a crash in resource.prlimit() when passing a sequence
that doesn’t own its elements as limits.

@item 
bpo-28779@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28779}: multiprocessing.set_forkserver_preload() would crash the
forkserver process if a preloaded module instantiated some multiprocessing
objects such as locks.

@item 
bpo-28847@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28847}: dbm.dumb now supports reading read-only files and no longer
writes the index file when it is not changed.

@item 
bpo-26937@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26937}: The chown() method of the tarfile.TarFile class does not fail
now when the grp module cannot be imported, as for example on Android
platforms.
@end itemize

@node IDLE<52>,Windows<71>,Library<184>,Python 3 6 1 release candidate 1
@anchor{whatsnew/changelog id935}@anchor{1f2c}
@subsubsection IDLE



@itemize -

@item 
bpo-29071@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29071}: IDLE colors f-string prefixes (but not invalid ur prefixes).

@item 
bpo-28572@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28572}: Add 10% to coverage of IDLE’s test_configdialog. Update and
augment description of the configuration system.
@end itemize

@node Windows<71>,C API<71>,IDLE<52>,Python 3 6 1 release candidate 1
@anchor{whatsnew/changelog id936}@anchor{1f2d}
@subsubsection Windows



@itemize -

@item 
bpo-29579@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29579}: Removes readme.txt from the installer

@item 
bpo-29326@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29326}: Ignores blank lines in ._pth files (Patch by Alexey Izbyshev)

@item 
bpo-28164@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28164}: Correctly handle special console filenames (patch by Eryk Sun)

@item 
bpo-29409@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29409}: Implement 
@geindex Python Enhancement Proposals; PEP 529
PEP 529@footnote{https://peps.python.org/pep-0529/} for io.FileIO (Patch by Eryk Sun)

@item 
bpo-29392@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29392}: Prevent crash when passing invalid arguments into msvcrt
module.

@item 
bpo-25778@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25778}: winreg does not truncate string correctly (Patch by Eryk Sun)

@item 
bpo-28896@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28896}: Deprecate WindowsRegistryFinder and disable it by default.
@end itemize

@node C API<71>,Documentation<75>,Windows<71>,Python 3 6 1 release candidate 1
@anchor{whatsnew/changelog id937}@anchor{1f2e}
@subsubsection C API



@itemize -

@item 
bpo-27867@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27867}: Function PySlice_GetIndicesEx() is replaced with a macro if
Py_LIMITED_API is not set or set to the value between 0x03050400 and
0x03060000 (not including) or 0x03060100 or higher.

@item 
bpo-29083@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29083}: Fixed the declaration of some public API functions.
PyArg_VaParse() and PyArg_VaParseTupleAndKeywords() were not available in
limited API. PyArg_ValidateKeywordArguments(), PyArg_UnpackTuple() and
Py_BuildValue() were not available in limited API of version < 3.3 when
PY_SSIZE_T_CLEAN is defined.

@item 
bpo-29058@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29058}: All stable API extensions added after Python 3.2 are now
available only when Py_LIMITED_API is set to the PY_VERSION_HEX value of
the minimum Python version supporting this API.
@end itemize

@node Documentation<75>,Tests<73>,C API<71>,Python 3 6 1 release candidate 1
@anchor{whatsnew/changelog id938}@anchor{1f2f}
@subsubsection Documentation



@itemize -

@item 
bpo-28929@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28929}: Link the documentation to its source file on GitHub.

@item 
bpo-25008@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25008}: Document smtpd.py as effectively deprecated and add a pointer
to aiosmtpd, a third-party asyncio-based replacement.

@item 
bpo-26355@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26355}: Add canonical header link on each page to corresponding major
version of the documentation. Patch by Matthias Bussonnier.

@item 
bpo-29349@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29349}: Fix Python 2 syntax in code for building the documentation.
@end itemize

@node Tests<73>,Build<83>,Documentation<75>,Python 3 6 1 release candidate 1
@anchor{whatsnew/changelog id939}@anchor{1f30}
@subsubsection Tests



@itemize -

@item 
bpo-28087@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28087}: Skip test_asyncore and test_eintr poll failures on macOS. Skip
some tests of select.poll when running on macOS due to unresolved issues
with the underlying system poll function on some macOS versions.

@item 
bpo-29571@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29571}: to match the behaviour of the @code{re.LOCALE} flag,
test_re.test_locale_flag now uses @code{locale.getpreferredencoding(False)}
to determine the candidate encoding for the test regex (allowing it to
correctly skip the test when the default locale encoding is a multi-byte
encoding)

@item 
bpo-28950@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28950}: Disallow -j0 to be combined with -T/-l in regrtest command line
arguments.

@item 
bpo-28683@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28683}: Fix the tests that bind() a unix socket and raise
PermissionError on Android for a non-root user.

@item 
bpo-26939@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26939}: Add the support.setswitchinterval() function to fix
test_functools hanging on the Android armv7 qemu emulator.
@end itemize

@node Build<83>,,Tests<73>,Python 3 6 1 release candidate 1
@anchor{whatsnew/changelog id940}@anchor{1f31}
@subsubsection Build



@itemize -

@item 
bpo-27593@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27593}: sys.version and the platform module python_build(),
python_branch(), and python_revision() functions now use git information
rather than hg when building from a repo.

@item 
bpo-29572@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29572}: Update Windows build and OS X installers to use OpenSSL 1.0.2k.

@item 
bpo-26851@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26851}: Set Android compilation and link flags.

@item 
bpo-28768@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28768}: Fix implicit declaration of function _setmode. Patch by
Masayuki Yamamoto

@item 
bpo-29080@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29080}: Removes hard dependency on hg.exe from PCBuild/build.bat

@item 
bpo-23903@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23903}: Added missed names to PC/python3.def.

@item 
bpo-28762@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28762}: lockf() is available on Android API level 24, but the F_LOCK
macro is not defined in android-ndk-r13.

@item 
bpo-28538@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28538}: Fix the compilation error that occurs because if_nameindex() is
available on Android API level 24, but the if_nameindex structure is not
defined.

@item 
bpo-20211@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20211}: Do not add the directory for installing C header files and the
directory for installing object code libraries to the cross compilation
search paths. Original patch by Thomas Petazzoni.

@item 
bpo-28849@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28849}: Do not define sys.implementation._multiarch on Android.
@end itemize

@node Python 3 6 0 final,Python 3 6 0 release candidate 2,Python 3 6 1 release candidate 1,Changelog
@anchor{whatsnew/changelog python-3-6-0-final}@anchor{1f32}
@subsection Python 3.6.0 final


`Release date: 2016-12-23'

No changes since release candidate 2

@node Python 3 6 0 release candidate 2,Python 3 6 0 release candidate 1,Python 3 6 0 final,Changelog
@anchor{whatsnew/changelog python-3-6-0-release-candidate-2}@anchor{1f33}
@subsection Python 3.6.0 release candidate 2


`Release date: 2016-12-16'

@menu
* Core and Builtins: Core and Builtins<181>. 
* Tools/Demos: Tools/Demos<49>. 
* Windows: Windows<72>. 
* Build: Build<84>. 

@end menu

@node Core and Builtins<181>,Tools/Demos<49>,,Python 3 6 0 release candidate 2
@anchor{whatsnew/changelog id941}@anchor{1f34}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-28147@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28147}: Fix a memory leak in split-table dictionaries: setattr() must
not convert combined table into split table. Patch written by INADA Naoki.

@item 
bpo-28990@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28990}: Fix asyncio SSL hanging if connection is closed before
handshake is completed. (Patch by HoHo-Ho)
@end itemize

@node Tools/Demos<49>,Windows<72>,Core and Builtins<181>,Python 3 6 0 release candidate 2
@anchor{whatsnew/changelog id942}@anchor{1f35}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-28770@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28770}: Fix python-gdb.py for fastcalls.
@end itemize

@node Windows<72>,Build<84>,Tools/Demos<49>,Python 3 6 0 release candidate 2
@anchor{whatsnew/changelog id943}@anchor{1f36}
@subsubsection Windows



@itemize -

@item 
bpo-28896@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28896}: Deprecate WindowsRegistryFinder.
@end itemize

@node Build<84>,,Windows<72>,Python 3 6 0 release candidate 2
@anchor{whatsnew/changelog id944}@anchor{1f37}
@subsubsection Build



@itemize -

@item 
bpo-28898@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28898}: Prevent gdb build errors due to HAVE_LONG_LONG redefinition.
@end itemize

@node Python 3 6 0 release candidate 1,Python 3 6 0 beta 4,Python 3 6 0 release candidate 2,Changelog
@anchor{whatsnew/changelog python-3-6-0-release-candidate-1}@anchor{1f38}
@subsection Python 3.6.0 release candidate 1


`Release date: 2016-12-06'

@menu
* Core and Builtins: Core and Builtins<182>. 
* Library: Library<185>. 
* C API: C API<72>. 
* Documentation: Documentation<76>. 
* Tools/Demos: Tools/Demos<50>. 

@end menu

@node Core and Builtins<182>,Library<185>,,Python 3 6 0 release candidate 1
@anchor{whatsnew/changelog id945}@anchor{1f39}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-23722@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23722}: Rather than silently producing a class that doesn’t support
zero-argument @code{super()} in methods, failing to pass the new
@code{__classcell__} namespace entry up to @code{type.__new__} now results in a
@code{DeprecationWarning} and a class that supports zero-argument
@code{super()}.

@item 
bpo-28797@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28797}: Modifying the class __dict__ inside the __set_name__ method of
a descriptor that is used inside that class no longer prevents calling the
__set_name__ method of other descriptors.

@item 
bpo-28782@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28782}: Fix a bug in the implementation @code{yield from} when checking if
the next instruction is YIELD_FROM. Regression introduced by WORDCODE
(bpo-26647@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26647}).
@end itemize

@node Library<185>,C API<72>,Core and Builtins<182>,Python 3 6 0 release candidate 1
@anchor{whatsnew/changelog id946}@anchor{1f3a}
@subsubsection Library



@itemize -

@item 
bpo-27030@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27030}: Unknown escapes in re.sub() replacement template are allowed
again.  But they still are deprecated and will be disabled in 3.7.

@item 
bpo-28835@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28835}: Fix a regression introduced in warnings.catch_warnings(): call
warnings.showwarning() if it was overridden inside the context manager.

@item 
bpo-27172@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27172}: To assist with upgrades from 2.7, the previously documented
deprecation of @code{inspect.getfullargspec()} has been reversed. This
decision may be revisited again after the Python 2.7 branch is no longer
officially supported.

@item 
bpo-26273@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26273}: Add new @code{socket.TCP_CONGESTION} (Linux 2.6.13) and
@code{socket.TCP_USER_TIMEOUT} (Linux 2.6.37) constants. Patch written
by Omar Sandoval.

@item 
bpo-24142@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24142}: Reading a corrupt config file left configparser in an invalid
state. Original patch by Florian Höch.

@item 
bpo-28843@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28843}: Fix asyncio C Task to handle exceptions __traceback__.
@end itemize

@node C API<72>,Documentation<76>,Library<185>,Python 3 6 0 release candidate 1
@anchor{whatsnew/changelog id947}@anchor{1f3b}
@subsubsection C API



@itemize -

@item 
bpo-28808@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28808}: PyUnicode_CompareWithASCIIString() now never raises exceptions.
@end itemize

@node Documentation<76>,Tools/Demos<50>,C API<72>,Python 3 6 0 release candidate 1
@anchor{whatsnew/changelog id948}@anchor{1f3c}
@subsubsection Documentation



@itemize -

@item 
bpo-23722@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23722}: The data model reference and the porting section in the What’s
New guide now cover the additional @code{__classcell__} handling needed for
custom metaclasses to fully support 
@geindex Python Enhancement Proposals; PEP 487
PEP 487@footnote{https://peps.python.org/pep-0487/} and zero-argument
@code{super()}.
@end itemize

@node Tools/Demos<50>,,Documentation<76>,Python 3 6 0 release candidate 1
@anchor{whatsnew/changelog id949}@anchor{1f3d}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-28023@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28023}: Fix python-gdb.py didn’t support new dict implementation.
@end itemize

@node Python 3 6 0 beta 4,Python 3 6 0 beta 3,Python 3 6 0 release candidate 1,Changelog
@anchor{whatsnew/changelog python-3-6-0-beta-4}@anchor{1f3e}
@subsection Python 3.6.0 beta 4


`Release date: 2016-11-21'

@menu
* Core and Builtins: Core and Builtins<183>. 
* Library: Library<186>. 
* Documentation: Documentation<77>. 
* Tests: Tests<74>. 
* Build: Build<85>. 

@end menu

@node Core and Builtins<183>,Library<186>,,Python 3 6 0 beta 4
@anchor{whatsnew/changelog id950}@anchor{1f3f}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-28532@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28532}: Show sys.version when -V option is supplied twice.

@item 
bpo-27100@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27100}: The with-statement now checks for __enter__ before it checks
for __exit__. This gives less confusing error messages when both methods
are missing. Patch by Jonathan Ellington.

@item 
bpo-28746@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28746}: Fix the set_inheritable() file descriptor method on platforms
that do not have the ioctl FIOCLEX and FIONCLEX commands.

@item 
bpo-26920@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26920}: Fix not getting the locale’s charset upon initializing the
interpreter, on platforms that do not have langinfo.

@item 
bpo-28648@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28648}: Fixed crash in Py_DecodeLocale() in debug build on Mac OS X
when decode astral characters.  Patch by Xiang Zhang.

@item 
bpo-19398@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19398}: Extra slash no longer added to sys.path components in case of
empty compile-time PYTHONPATH components.

@item 
bpo-28665@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28665}: Improve speed of the STORE_DEREF opcode by 40%.

@item 
bpo-28583@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28583}: PyDict_SetDefault didn’t combine split table when needed. Patch
by Xiang Zhang.

@item 
bpo-27243@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27243}: Change PendingDeprecationWarning -> DeprecationWarning. As it
was agreed in the issue, __aiter__ returning an awaitable should result in
PendingDeprecationWarning in 3.5 and in DeprecationWarning in 3.6.

@item 
bpo-26182@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26182}: Fix a refleak in code that raises DeprecationWarning.

@item 
bpo-28721@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28721}: Fix asynchronous generators aclose() and athrow() to handle
StopAsyncIteration propagation properly.
@end itemize

@node Library<186>,Documentation<77>,Core and Builtins<183>,Python 3 6 0 beta 4
@anchor{whatsnew/changelog id951}@anchor{1f40}
@subsubsection Library



@itemize -

@item 
bpo-28752@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28752}: Restored the __reduce__() methods of datetime objects.

@item 
bpo-28727@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28727}: Regular expression patterns, _sre.SRE_Pattern objects created
by re.compile(), become comparable (only x==y and x!=y operators). This
change should fix the bpo-18383@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18383}: don’t duplicate warning filters when
the warnings module is reloaded (thing usually only done in unit tests).

@item 
bpo-20572@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20572}: The subprocess.Popen.wait method’s undocumented endtime
parameter now raises a DeprecationWarning.

@item 
bpo-25659@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25659}: In ctypes, prevent a crash calling the from_buffer() and
from_buffer_copy() methods on abstract classes like Array.

@item 
bpo-19717@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19717}: Makes Path.resolve() succeed on paths that do not exist. Patch
by Vajrasky Kok

@item 
bpo-28563@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28563}: Fixed possible DoS and arbitrary code execution when handle
plural form selections in the gettext module.  The expression parser now
supports exact syntax supported by GNU gettext.

@item 
bpo-28387@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28387}: Fixed possible crash in _io.TextIOWrapper deallocator when the
garbage collector is invoked in other thread.  Based on patch by Sebastian
Cufre.

@item 
bpo-28600@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28600}: Optimize loop.call_soon.

@item 
bpo-28613@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28613}: Fix get_event_loop() return the current loop if called from
coroutines/callbacks.

@item 
bpo-28634@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28634}: Fix asyncio.isfuture() to support unittest.Mock.

@item 
bpo-26081@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26081}: Fix refleak in _asyncio.Future.__iter__().throw.

@item 
bpo-28639@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28639}: Fix inspect.isawaitable to always return bool Patch by Justin
Mayfield.

@item 
bpo-28652@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28652}: Make loop methods reject socket kinds they do not support.

@item 
bpo-28653@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28653}: Fix a refleak in functools.lru_cache.

@item 
bpo-28703@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28703}: Fix asyncio.iscoroutinefunction to handle Mock objects.

@item 
bpo-28704@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28704}: Fix create_unix_server to support Path-like objects (PEP 519).

@item 
bpo-28720@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28720}: Add collections.abc.AsyncGenerator.
@end itemize

@node Documentation<77>,Tests<74>,Library<186>,Python 3 6 0 beta 4
@anchor{whatsnew/changelog id952}@anchor{1f41}
@subsubsection Documentation



@itemize -

@item 
bpo-28513@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28513}: Documented command-line interface of zipfile.
@end itemize

@node Tests<74>,Build<85>,Documentation<77>,Python 3 6 0 beta 4
@anchor{whatsnew/changelog id953}@anchor{1f42}
@subsubsection Tests



@itemize -

@item 
bpo-28666@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28666}: Now test.support.rmtree is able to remove unwritable or
unreadable directories.

@item 
bpo-23839@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23839}: Various caches now are cleared before running every test file.
@end itemize

@node Build<85>,,Tests<74>,Python 3 6 0 beta 4
@anchor{whatsnew/changelog id954}@anchor{1f43}
@subsubsection Build



@itemize -

@item 
bpo-10656@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10656}: Fix out-of-tree building on AIX.  Patch by Tristan Carel and
Michael Haubenwallner.

@item 
bpo-26359@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26359}: Rename –with-optimiations to –enable-optimizations.

@item 
bpo-28676@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28676}: Prevent missing ‘getentropy’ declaration warning on macOS.
Patch by Gareth Rees.
@end itemize

@node Python 3 6 0 beta 3,Python 3 6 0 beta 2,Python 3 6 0 beta 4,Changelog
@anchor{whatsnew/changelog python-3-6-0-beta-3}@anchor{1f44}
@subsection Python 3.6.0 beta 3


`Release date: 2016-10-31'

@menu
* Core and Builtins: Core and Builtins<184>. 
* Library: Library<187>. 
* Windows: Windows<73>. 
* Build: Build<86>. 
* Tests: Tests<75>. 

@end menu

@node Core and Builtins<184>,Library<187>,,Python 3 6 0 beta 3
@anchor{whatsnew/changelog id955}@anchor{1f45}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-28128@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28128}: Deprecation warning for invalid str and byte escape sequences
now prints better information about where the error occurs. Patch by
Serhiy Storchaka and Eric Smith.

@item 
bpo-28509@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28509}: dict.update() no longer allocate unnecessary large memory.

@item 
bpo-28426@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28426}: Fixed potential crash in PyUnicode_AsDecodedObject() in debug
build.

@item 
bpo-28517@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28517}: Fixed of-by-one error in the peephole optimizer that caused
keeping unreachable code.

@item 
bpo-28214@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28214}: Improved exception reporting for problematic __set_name__
attributes.

@item 
bpo-23782@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23782}: Fixed possible memory leak in _PyTraceback_Add() and exception
loss in PyTraceBack_Here().

@item 
bpo-28471@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28471}: Fix “Python memory allocator called without holding the GIL”
crash in socket.setblocking.
@end itemize

@node Library<187>,Windows<73>,Core and Builtins<184>,Python 3 6 0 beta 3
@anchor{whatsnew/changelog id956}@anchor{1f46}
@subsubsection Library



@itemize -

@item 
bpo-27517@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27517}: LZMA compressor and decompressor no longer raise exceptions if
given empty data twice.  Patch by Benjamin Fogle.

@item 
bpo-28549@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28549}: Fixed segfault in curses’s addch() with ncurses6.

@item 
bpo-28449@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28449}: tarfile.open() with mode “r” or “r:” now tries to open a tar
file with compression before trying to open it without compression.
Otherwise it had 50% chance failed with ignore_zeros=True.

@item 
bpo-23262@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23262}: The webbrowser module now supports Firefox 36+ and derived
browsers.  Based on patch by Oleg Broytman.

@item 
bpo-27939@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27939}: Fixed bugs in tkinter.ttk.LabeledScale and tkinter.Scale caused
by representing the scale as float value internally in Tk.  tkinter.IntVar
now works if float value is set to underlying Tk variable.

@item 
bpo-18844@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18844}: The various ways of specifying weights for random.choices() now
produce the same result sequences.

@item 
bpo-28255@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28255}: calendar.TextCalendar().prmonth() no longer prints a space at
the start of new line after printing a month’s calendar.  Patch by Xiang
Zhang.

@item 
bpo-20491@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20491}: The textwrap.TextWrapper class now honors non-breaking spaces.
Based on patch by Kaarle Ritvanen.

@item 
bpo-28353@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28353}: os.fwalk() no longer fails on broken links.

@item 
bpo-28430@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28430}: Fix iterator of C implemented asyncio.Future doesn’t accept
non-None value is passed to it.send(val).

@item 
bpo-27025@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27025}: Generated names for Tkinter widgets now start by the “!” prefix
for readability.

@item 
bpo-25464@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25464}: Fixed HList.header_exists() in tkinter.tix module by addin a
workaround to Tix library bug.

@item 
bpo-28488@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28488}: shutil.make_archive() no longer adds entry “./” to ZIP archive.

@item 
bpo-25953@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25953}: re.sub() now raises an error for invalid numerical group
reference in replacement template even if the pattern is not found in the
string.  Error message for invalid group reference now includes the group
index and the position of the reference. Based on patch by SilentGhost.

@item 
bpo-18219@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18219}: Optimize csv.DictWriter for large number of columns. Patch by
Mariatta Wijaya.

@item 
bpo-28448@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28448}: Fix C implemented asyncio.Future didn’t work on Windows.

@item 
bpo-28480@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28480}: Fix error building socket module when multithreading is
disabled.

@item 
bpo-24452@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24452}: Make webbrowser support Chrome on Mac OS X.

@item 
bpo-20766@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20766}: Fix references leaked by pdb in the handling of SIGINT
handlers.

@item 
bpo-28492@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28492}: Fix how StopIteration exception is raised in _asyncio.Future.

@item 
bpo-28500@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28500}: Fix asyncio to handle async gens GC from another thread.

@item 
bpo-26923@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26923}: Fix asyncio.Gather to refuse being cancelled once all children
are done. Patch by Johannes Ebke.

@item 
bpo-26796@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26796}: Don’t configure the number of workers for default threadpool
executor. Initial patch by Hans Lawrenz.

@item 
bpo-28544@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28544}: Implement asyncio.Task in C.
@end itemize

@node Windows<73>,Build<86>,Library<187>,Python 3 6 0 beta 3
@anchor{whatsnew/changelog id957}@anchor{1f47}
@subsubsection Windows



@itemize -

@item 
bpo-28522@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28522}: Fixes mishandled buffer reallocation in getpathp.c
@end itemize

@node Build<86>,Tests<75>,Windows<73>,Python 3 6 0 beta 3
@anchor{whatsnew/changelog id958}@anchor{1f48}
@subsubsection Build



@itemize -

@item 
bpo-28444@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28444}: Fix missing extensions modules when cross compiling.

@item 
bpo-28208@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28208}: Update Windows build and OS X installers to use SQLite 3.14.2.

@item 
bpo-28248@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28248}: Update Windows build and OS X installers to use OpenSSL 1.0.2j.
@end itemize

@node Tests<75>,,Build<86>,Python 3 6 0 beta 3
@anchor{whatsnew/changelog id959}@anchor{1f49}
@subsubsection Tests



@itemize -

@item 
bpo-26944@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26944}: Fix test_posix for Android where ‘id -G’ is entirely wrong or
missing the effective gid.

@item 
bpo-28409@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28409}: regrtest: fix the parser of command line arguments.
@end itemize

@node Python 3 6 0 beta 2,Python 3 6 0 beta 1,Python 3 6 0 beta 3,Changelog
@anchor{whatsnew/changelog python-3-6-0-beta-2}@anchor{1f4a}
@subsection Python 3.6.0 beta 2


`Release date: 2016-10-10'

@menu
* Core and Builtins: Core and Builtins<185>. 
* Library: Library<188>. 
* Windows: Windows<74>. 
* C API: C API<73>. 
* Build: Build<87>. 
* Tests: Tests<76>. 

@end menu

@node Core and Builtins<185>,Library<188>,,Python 3 6 0 beta 2
@anchor{whatsnew/changelog id960}@anchor{1f4b}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-28183@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28183}: Optimize and cleanup dict iteration.

@item 
bpo-26081@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26081}: Added C implementation of asyncio.Future. Original patch by
Yury Selivanov.

@item 
bpo-28379@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28379}: Added sanity checks and tests for PyUnicode_CopyCharacters().
Patch by Xiang Zhang.

@item 
bpo-28376@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28376}: The type of long range iterator is now registered as Iterator.
Patch by Oren Milman.

@item 
bpo-28376@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28376}: Creating instances of range_iterator by calling range_iterator
type now is deprecated.  Patch by Oren Milman.

@item 
bpo-28376@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28376}: The constructor of range_iterator now checks that step is not
0. Patch by Oren Milman.

@item 
bpo-26906@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26906}: Resolving special methods of uninitialized type now causes
implicit initialization of the type instead of a fail.

@item 
bpo-18287@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18287}: PyType_Ready() now checks that tp_name is not NULL. Original
patch by Niklas Koep.

@item 
bpo-24098@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24098}: Fixed possible crash when AST is changed in process of
compiling it.

@item 
bpo-28201@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28201}: Dict reduces possibility of 2nd conflict in hash table when
hashes have same lower bits.

@item 
bpo-28350@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28350}: String constants with null character no longer interned.

@item 
bpo-26617@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26617}: Fix crash when GC runs during weakref callbacks.

@item 
bpo-27942@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27942}: String constants now interned recursively in tuples and
frozensets.

@item 
bpo-21578@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21578}: Fixed misleading error message when ImportError called with
invalid keyword args.

@item 
bpo-28203@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28203}: Fix incorrect type in complex(1.0, @{2:3@}) error message. Patch
by Soumya Sharma.

@item 
bpo-28086@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28086}: Single var-positional argument of tuple subtype was passed
unscathed to the C-defined function.  Now it is converted to exact tuple.

@item 
bpo-28214@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28214}: Now __set_name__ is looked up on the class instead of the
instance.

@item 
bpo-27955@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27955}: Fallback on reading /dev/urandom device when the getrandom()
syscall fails with EPERM, for example when blocked by SECCOMP.

@item 
bpo-28192@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28192}: Don’t import readline in isolated mode.

@item 
Upgrade internal unicode databases to Unicode version 9.0.0.

@item 
bpo-28131@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28131}: Fix a regression in zipimport’s compile_source().  zipimport
should use the same optimization level as the interpreter.

@item 
bpo-28126@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28126}: Replace Py_MEMCPY with memcpy(). Visual Studio can properly
optimize memcpy().

@item 
bpo-28120@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28120}: Fix dict.pop() for split dictionary when trying to remove a
“pending key” (Not yet inserted in split-table). Patch by Xiang Zhang.

@item 
bpo-26182@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26182}: Raise DeprecationWarning when async and await keywords are used
as variable/attribute/class/function name.
@end itemize

@node Library<188>,Windows<74>,Core and Builtins<185>,Python 3 6 0 beta 2
@anchor{whatsnew/changelog id961}@anchor{1f4c}
@subsubsection Library



@itemize -

@item 
bpo-27998@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27998}: Fixed bytes path support in os.scandir() on Windows. Patch by
Eryk Sun.

@item 
bpo-28317@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28317}: The disassembler now decodes FORMAT_VALUE argument.

@item 
bpo-26293@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26293}: Fixed writing ZIP files that starts not from the start of the
file.  Offsets in ZIP file now are relative to the start of the archive in
conforming to the specification.

@item 
bpo-28380@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28380}: unittest.mock Mock autospec functions now properly support
assert_called, assert_not_called, and assert_called_once.

@item 
bpo-27181@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27181}: remove statistics.geometric_mean and defer until 3.7.

@item 
bpo-28229@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28229}: lzma module now supports pathlib.

@item 
bpo-28321@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28321}: Fixed writing non-BMP characters with binary format in
plistlib.

@item 
bpo-28225@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28225}: bz2 module now supports pathlib.  Initial patch by Ethan
Furman.

@item 
bpo-28227@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28227}: gzip now supports pathlib.  Patch by Ethan Furman.

@item 
bpo-27358@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27358}: Optimized merging var-keyword arguments and improved error
message when passing a non-mapping as a var-keyword argument.

@item 
bpo-28257@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28257}: Improved error message when passing a non-iterable as a
var-positional argument.  Added opcode BUILD_TUPLE_UNPACK_WITH_CALL.

@item 
bpo-28322@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28322}: Fixed possible crashes when unpickle itertools objects from
incorrect pickle data.  Based on patch by John Leitch.

@item 
bpo-28228@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28228}: imghdr now supports pathlib.

@item 
bpo-28226@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28226}: compileall now supports pathlib.

@item 
bpo-28314@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28314}: Fix function declaration (C flags) for the getiterator() method
of xml.etree.ElementTree.Element.

@item 
bpo-28148@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28148}: Stop using localtime() and gmtime() in the time module.
Introduced platform independent _PyTime_localtime API that is similar to
POSIX localtime_r, but available on all platforms.  Patch by Ed Schouten.

@item 
bpo-28253@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28253}: Fixed calendar functions for extreme months: 0001-01 and
9999-12. Methods itermonthdays() and itermonthdays2() are reimplemented so
that they don’t call itermonthdates() which can cause datetime.date
under/overflow.

@item 
bpo-28275@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28275}: Fixed possible use after free in the decompress() methods of
the LZMADecompressor and BZ2Decompressor classes. Original patch by John
Leitch.

@item 
bpo-27897@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27897}: Fixed possible crash in sqlite3.Connection.create_collation()
if pass invalid string-like object as a name.  Patch by Xiang Zhang.

@item 
bpo-18844@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18844}: random.choices() now has k as a keyword-only argument to
improve the readability of common cases and come into line with the
signature used in other languages.

@item 
bpo-18893@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18893}: Fix invalid exception handling in Lib/ctypes/macholib/dyld.py.
Patch by Madison May.

@item 
bpo-27611@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27611}: Fixed support of default root window in the tkinter.tix module.
Added the master parameter in the DisplayStyle constructor.

@item 
bpo-27348@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27348}: In the traceback module, restore the formatting of exception
messages like “Exception: None”.  This fixes a regression introduced in
3.5a2.

@item 
bpo-25651@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25651}: Allow false values to be used for msg parameter of subTest().

@item 
bpo-27778@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27778}: Fix a memory leak in os.getrandom() when the getrandom() is
interrupted by a signal and a signal handler raises a Python exception.

@item 
bpo-28200@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28200}: Fix memory leak on Windows in the os module (fix
path_converter() function).

@item 
bpo-25400@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25400}: RobotFileParser now correctly returns default values for
crawl_delay and request_rate.  Initial patch by Peter Wirtz.

@item 
bpo-27932@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27932}: Prevent memory leak in win32_ver().

@item 
Fix UnboundLocalError in socket._sendfile_use_sendfile.

@item 
bpo-28075@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28075}: Check for ERROR_ACCESS_DENIED in Windows implementation of
os.stat().  Patch by Eryk Sun.

@item 
bpo-22493@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22493}: Warning message emitted by using inline flags in the middle of
regular expression now contains a (truncated) regex pattern. Patch by Tim
Graham.

@item 
bpo-25270@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25270}: Prevent codecs.escape_encode() from raising SystemError when an
empty bytestring is passed.

@item 
bpo-28181@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28181}: Get antigravity over HTTPS. Patch by Kaartic Sivaraam.

@item 
bpo-25895@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25895}: Enable WebSocket URL schemes in urllib.parse.urljoin. Patch by
Gergely Imreh and Markus Holtermann.

@item 
bpo-28114@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28114}: Fix a crash in parse_envlist() when env contains byte strings.
Patch by Eryk Sun.

@item 
bpo-27599@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27599}: Fixed buffer overrun in binascii.b2a_qp() and
binascii.a2b_qp().

@item 
bpo-27906@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27906}: Fix socket accept exhaustion during high TCP traffic. Patch by
Kevin Conway.

@item 
bpo-28174@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28174}: Handle when SO_REUSEPORT isn’t properly supported. Patch by
Seth Michael Larson.

@item 
bpo-26654@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26654}: Inspect functools.partial in asyncio.Handle.__repr__. Patch by
iceboy.

@item 
bpo-26909@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26909}: Fix slow pipes IO in asyncio. Patch by INADA Naoki.

@item 
bpo-28176@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28176}: Fix callbacks race in asyncio.SelectorLoop.sock_connect.

@item 
bpo-27759@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27759}: Fix selectors incorrectly retain invalid file descriptors.
Patch by Mark Williams.

@item 
bpo-28368@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28368}: Refuse monitoring processes if the child watcher has no loop
attached. Patch by Vincent Michel.

@item 
bpo-28369@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28369}: Raise RuntimeError when transport’s FD is used with add_reader,
add_writer, etc.

@item 
bpo-28370@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28370}: Speedup asyncio.StreamReader.readexactly. Patch by Коренберг
Марк.

@item 
bpo-28371@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28371}: Deprecate passing asyncio.Handles to run_in_executor.

@item 
bpo-28372@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28372}: Fix asyncio to support formatting of non-python coroutines.

@item 
bpo-28399@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28399}: Remove UNIX socket from FS before binding. Patch by Коренберг
Марк.

@item 
bpo-27972@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27972}: Prohibit Tasks to await on themselves.
@end itemize

@node Windows<74>,C API<73>,Library<188>,Python 3 6 0 beta 2
@anchor{whatsnew/changelog id962}@anchor{1f4d}
@subsubsection Windows



@itemize -

@item 
bpo-28402@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28402}: Adds signed catalog files for stdlib on Windows.

@item 
bpo-28333@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28333}: Enables Unicode for ps1/ps2 and input() prompts. (Patch by Eryk
Sun)

@item 
bpo-28251@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28251}: Improvements to help manuals on Windows.

@item 
bpo-28110@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28110}: launcher.msi has different product codes between 32-bit and
64-bit

@item 
bpo-28161@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28161}: Opening CON for write access fails

@item 
bpo-28162@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28162}: WindowsConsoleIO readall() fails if first line starts with
Ctrl+Z

@item 
bpo-28163@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28163}: WindowsConsoleIO fileno() passes wrong flags to _open_osfhandle

@item 
bpo-28164@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28164}: _PyIO_get_console_type fails for various paths

@item 
bpo-28137@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28137}: Renames Windows path file to ._pth

@item 
bpo-28138@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28138}: Windows ._pth file should allow import site
@end itemize

@node C API<73>,Build<87>,Windows<74>,Python 3 6 0 beta 2
@anchor{whatsnew/changelog id963}@anchor{1f4e}
@subsubsection C API



@itemize -

@item 
bpo-28426@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28426}: Deprecated undocumented functions PyUnicode_AsEncodedObject(),
PyUnicode_AsDecodedObject(), PyUnicode_AsDecodedUnicode() and
PyUnicode_AsEncodedUnicode().
@end itemize

@node Build<87>,Tests<76>,C API<73>,Python 3 6 0 beta 2
@anchor{whatsnew/changelog id964}@anchor{1f4f}
@subsubsection Build



@itemize -

@item 
bpo-28258@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28258}: Fixed build with Estonian locale (python-config and distclean
targets in Makefile).  Patch by Arfrever Frehtes Taifersar Arahesis.

@item 
bpo-26661@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26661}: setup.py now detects system libffi with multiarch wrapper.

@item 
bpo-15819@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15819}: Remove redundant include search directory option for building
outside the source tree.
@end itemize

@node Tests<76>,,Build<87>,Python 3 6 0 beta 2
@anchor{whatsnew/changelog id965}@anchor{1f50}
@subsubsection Tests



@itemize -

@item 
bpo-28217@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28217}: Adds _testconsole module to test console input.
@end itemize

@node Python 3 6 0 beta 1,Python 3 6 0 alpha 4,Python 3 6 0 beta 2,Changelog
@anchor{whatsnew/changelog python-3-6-0-beta-1}@anchor{1f51}
@subsection Python 3.6.0 beta 1


`Release date: 2016-09-12'

@menu
* Core and Builtins: Core and Builtins<186>. 
* Library: Library<189>. 
* IDLE: IDLE<53>. 
* C API: C API<74>. 
* Tests: Tests<77>. 
* Build: Build<88>. 
* Tools/Demos: Tools/Demos<51>. 
* Windows: Windows<75>. 

@end menu

@node Core and Builtins<186>,Library<189>,,Python 3 6 0 beta 1
@anchor{whatsnew/changelog id966}@anchor{1f52}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-23722@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23722}: The __class__ cell used by zero-argument super() is now
initialized from type.__new__ rather than __build_class__, so class
methods relying on that will now work correctly when called from metaclass
methods during class creation. Patch by Martin Teichmann.

@item 
bpo-25221@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25221}: Fix corrupted result from PyLong_FromLong(0) when Python is
compiled with NSMALLPOSINTS = 0.

@item 
bpo-27080@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27080}: Implement formatting support for 
@geindex Python Enhancement Proposals; PEP 515
PEP 515@footnote{https://peps.python.org/pep-0515/}.  Initial patch by
Chris Angelico.

@item 
bpo-27199@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27199}: In tarfile, expose copyfileobj bufsize to improve throughput.
Patch by Jason Fried.

@item 
bpo-27948@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27948}: In f-strings, only allow backslashes inside the braces (where
the expressions are).  This is a breaking change from the 3.6 alpha
releases, where backslashes are allowed anywhere in an f-string.  Also,
require that expressions inside f-strings be enclosed within literal
braces, and not escapes like @code{f'\x7b"hi"\x7d'}.

@item 
bpo-28046@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28046}: Remove platform-specific directories from sys.path.

@item 
bpo-28071@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28071}: Add early-out for differencing from an empty set.

@item 
bpo-25758@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25758}: Prevents zipimport from unnecessarily encoding a filename
(patch by Eryk Sun)

@item 
bpo-25856@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25856}: The __module__ attribute of extension classes and functions now
is interned. This leads to more compact pickle data with protocol 4.

@item 
bpo-27213@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27213}: Rework CALL_FUNCTION* opcodes to produce shorter and more
efficient bytecode. Patch by Demur Rumed, design by Serhiy Storchaka,
reviewed by Serhiy Storchaka and Victor Stinner.

@item 
bpo-26331@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26331}: Implement tokenizing support for 
@geindex Python Enhancement Proposals; PEP 515
PEP 515@footnote{https://peps.python.org/pep-0515/}. Patch by Georg
Brandl.

@item 
bpo-27999@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27999}: Make “global after use” a SyntaxError, and ditto for nonlocal.
Patch by Ivan Levkivskyi.

@item 
bpo-28003@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28003}: Implement 
@geindex Python Enhancement Proposals; PEP 525
PEP 525@footnote{https://peps.python.org/pep-0525/} – Asynchronous Generators.

@item 
bpo-27985@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27985}: Implement 
@geindex Python Enhancement Proposals; PEP 526
PEP 526@footnote{https://peps.python.org/pep-0526/} – Syntax for Variable Annotations. Patch
by Ivan Levkivskyi.

@item 
bpo-26058@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26058}: Add a new private version to the builtin dict type, incremented
at each dictionary creation and at each dictionary change. Implementation
of the PEP 509.

@item 
bpo-27364@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27364}: A backslash-character pair that is not a valid escape sequence
now generates a DeprecationWarning.  Patch by Emanuel Barry.

@item 
bpo-27350@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27350}: @code{dict} implementation is changed like PyPy. It is more
compact and preserves insertion order. (Concept developed by Raymond
Hettinger and patch by Inada Naoki.)

@item 
bpo-27911@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27911}: Remove unnecessary error checks in
@code{exec_builtin_or_dynamic()}.

@item 
bpo-27078@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27078}: Added BUILD_STRING opcode.  Optimized f-strings evaluation.

@item 
bpo-17884@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17884}: Python now requires systems with inttypes.h and stdint.h

@item 
bpo-27961@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27961}: Require platforms to support @code{long long}. Python hasn’t
compiled without @code{long long} for years, so this is basically a
formality.

@item 
bpo-27355@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27355}: Removed support for Windows CE.  It was never finished, and
Windows CE is no longer a relevant platform for Python.

@item 
Implement 
@geindex Python Enhancement Proposals; PEP 523
PEP 523@footnote{https://peps.python.org/pep-0523/}.

@item 
bpo-27870@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27870}: A left shift of zero by a large integer no longer attempts to
allocate large amounts of memory.

@item 
bpo-25402@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25402}: In int-to-decimal-string conversion, improve the estimate of
the intermediate memory required, and remove an unnecessarily strict
overflow check. Patch by Serhiy Storchaka.

@item 
bpo-27214@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27214}: In long_invert, be more careful about modifying object returned
by long_add, and remove an unnecessary check for small longs. Thanks Oren
Milman for analysis and patch.

@item 
bpo-27506@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27506}: Support passing the bytes/bytearray.translate() “delete”
argument by keyword.

@item 
bpo-27812@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27812}: Properly clear out a generator’s frame’s backreference to the
generator to prevent crashes in frame.clear().

@item 
bpo-27811@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27811}: Fix a crash when a coroutine that has not been awaited is
finalized with warnings-as-errors enabled.

@item 
bpo-27587@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27587}: Fix another issue found by PVS-Studio: Null pointer check after
use of ‘def’ in _PyState_AddModule(). Initial patch by Christian Heimes.

@item 
bpo-27792@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27792}: The modulo operation applied to @code{bool} and other @code{int}
subclasses now always returns an @code{int}. Previously the return type
depended on the input values. Patch by Xiang Zhang.

@item 
bpo-26984@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26984}: int() now always returns an instance of exact int.

@item 
bpo-25604@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25604}: Fix a minor bug in integer true division; this bug could
potentially have caused off-by-one-ulp results on platforms with
unreliable ldexp implementations.

@item 
bpo-24254@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24254}: Make class definition namespace ordered by default.

@item 
bpo-27662@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27662}: Fix an overflow check in @code{List_New}: the original code was
checking against @code{Py_SIZE_MAX} instead of the correct upper bound of
@code{Py_SSIZE_T_MAX}. Patch by Xiang Zhang.

@item 
bpo-27782@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27782}: Multi-phase extension module import now correctly allows the
@code{m_methods} field to be used to add module level functions to instances
of non-module types returned from @code{Py_create_mod}. Patch by Xiang Zhang.

@item 
bpo-27936@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27936}: The round() function accepted a second None argument for some
types but not for others.  Fixed the inconsistency by accepting None for
all numeric types.

@item 
bpo-27487@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27487}: Warn if a submodule argument to “python -m” or
runpy.run_module() is found in sys.modules after parent packages are
imported, but before the submodule is executed.

@item 
bpo-27157@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27157}: Make only type() itself accept the one-argument form. Patch by
Eryk Sun and Emanuel Barry.

@item 
bpo-27558@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27558}: Fix a SystemError in the implementation of “raise” statement.
In a brand new thread, raise a RuntimeError since there is no active
exception to reraise. Patch written by Xiang Zhang.

@item 
bpo-28008@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28008}: Implement 
@geindex Python Enhancement Proposals; PEP 530
PEP 530@footnote{https://peps.python.org/pep-0530/} – asynchronous comprehensions.

@item 
bpo-27942@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27942}: Fix memory leak in codeobject.c
@end itemize

@node Library<189>,IDLE<53>,Core and Builtins<186>,Python 3 6 0 beta 1
@anchor{whatsnew/changelog id967}@anchor{1f53}
@subsubsection Library



@itemize -

@item 
bpo-28732@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28732}: Fix crash in os.spawnv() with no elements in args

@item 
bpo-28485@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28485}: Always raise ValueError for negative
compileall.compile_dir(workers=…) parameter, even when multithreading is
unavailable.

@item 
bpo-28037@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28037}: Use sqlite3_get_autocommit() instead of setting
Connection->inTransaction manually.

@item 
bpo-25283@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25283}: Attributes tm_gmtoff and tm_zone are now available on all
platforms in the return values of time.localtime() and time.gmtime().

@item 
bpo-24454@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24454}: Regular expression match object groups are now accessible using
__getitem__. “mo[x]” is equivalent to “mo.group(x)”.

@item 
bpo-10740@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10740}: sqlite3 no longer implicitly commit an open transaction before
DDL statements.

@item 
bpo-17941@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17941}: Add a `module' parameter to collections.namedtuple().

@item 
bpo-22493@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22493}: Inline flags now should be used only at the start of the
regular expression. Deprecation warning is emitted if uses them in the
middle of the regular expression.

@item 
bpo-26885@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26885}: xmlrpc now supports unmarshalling additional data types used by
Apache XML-RPC implementation for numerics and None.

@item 
bpo-28070@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28070}: Fixed parsing inline verbose flag in regular expressions.

@item 
bpo-19500@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19500}: Add client-side SSL session resumption to the ssl module.

@item 
bpo-28022@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28022}: Deprecate ssl-related arguments in favor of SSLContext. The
deprecation include manual creation of SSLSocket and certfile/keyfile (or
similar) in ftplib, httplib, imaplib, smtplib, poplib and urllib.

@item 
bpo-28043@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28043}: SSLContext has improved default settings: OP_NO_SSLv2,
OP_NO_SSLv3, OP_NO_COMPRESSION, OP_CIPHER_SERVER_PREFERENCE,
OP_SINGLE_DH_USE, OP_SINGLE_ECDH_USE and HIGH ciphers without MD5.

@item 
bpo-24693@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24693}: Changed some RuntimeError’s in the zipfile module to more
appropriate types. Improved some error messages and debugging output.

@item 
bpo-17909@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17909}: @code{json.load} and @code{json.loads} now support binary input
encoded as UTF-8, UTF-16 or UTF-32. Patch by Serhiy Storchaka.

@item 
bpo-27137@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27137}: the pure Python fallback implementation of
@code{functools.partial} now matches the behaviour of its accelerated C
counterpart for subclassing, pickling and text representation purposes.
Patch by Emanuel Barry and Serhiy Storchaka.

@item 
Fix possible integer overflows and crashes in the mmap module with unusual
usage patterns.

@item 
bpo-1703178@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1703178}: Fix the ability to pass the –link-objects option to the
distutils build_ext command.

@item 
bpo-28019@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28019}: itertools.count() no longer rounds non-integer step in range
between 1.0 and 2.0 to 1.

@item 
bpo-18401@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18401}: Pdb now supports the ‘readrc’ keyword argument to control
whether .pdbrc files should be read.  Patch by Martin Matusiak and Sam
Kimbrel.

@item 
bpo-25969@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25969}: Update the lib2to3 grammar to handle the unpacking
generalizations added in 3.5.

@item 
bpo-14977@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14977}: mailcap now respects the order of the lines in the mailcap
files (“first match”), as required by RFC 1542.  Patch by Michael Lazar.

@item 
bpo-28082@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28082}: Convert re flag constants to IntFlag.

@item 
bpo-28025@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28025}: Convert all ssl module constants to IntEnum and IntFlags.
SSLContext properties now return flags and enums.

@item 
bpo-23591@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23591}: Add Flag, IntFlag, and auto() to enum module.

@item 
bpo-433028@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=433028}: Added support of modifier spans in regular expressions.

@item 
bpo-24594@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24594}: Validates persist parameter when opening MSI database

@item 
bpo-17582@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17582}: xml.etree.ElementTree nows preserves whitespaces in attributes
(Patch by Duane Griffin.  Reviewed and approved by Stefan Behnel.)

@item 
bpo-28047@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28047}: Fixed calculation of line length used for the base64 CTE in the
new email policies.

@item 
bpo-27576@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27576}: Fix call order in OrderedDict.__init__().

@item 
email.generator.DecodedGenerator now supports the policy keyword.

@item 
bpo-28027@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28027}: Remove undocumented modules from @code{Lib/plat-*}: IN, CDROM,
DLFCN, TYPES, CDIO, and STROPTS.

@item 
bpo-27445@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27445}: Don’t pass str(_charset) to MIMEText.set_payload(). Patch by
Claude Paroz.

@item 
bpo-24277@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24277}: The new email API is no longer provisional, and the docs have
been reorganized and rewritten to emphasize the new API.

@item 
bpo-22450@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22450}: urllib now includes an @code{Accept: */*} header among the default
headers. This makes the results of REST API requests more consistent and
predictable especially when proxy servers are involved.

@item 
lib2to3.pgen3.driver.load_grammar() now creates a stable cache file
between runs given the same Grammar.txt input regardless of the hash
randomization setting.

@item 
bpo-28005@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28005}: Allow ImportErrors in encoding implementation to propagate.

@item 
bpo-26667@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26667}: Support path-like objects in importlib.util.

@item 
bpo-27570@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27570}: Avoid zero-length memcpy() etc calls with null source pointers
in the “ctypes” and “array” modules.

@item 
bpo-22233@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22233}: Break email header lines `only' on the RFC specified CR and LF
characters, not on arbitrary unicode line breaks.  This also fixes a bug
in HTTP header parsing.

@item 
bpo-27331@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27331}: The email.mime classes now all accept an optional policy
keyword.

@item 
bpo-27988@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27988}: Fix email iter_attachments incorrect mutation of payload list.

@item 
bpo-16113@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16113}: Add SHA-3 and SHAKE support to hashlib module.

@item 
Eliminate a tautological-pointer-compare warning in _scproxy.c.

@item 
bpo-27776@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27776}: The @ref{747,,os.urandom()} function does now block on Linux 3.17
and newer until the system urandom entropy pool is initialized to increase
the security. This change is part of the 
@geindex Python Enhancement Proposals; PEP 524
PEP 524@footnote{https://peps.python.org/pep-0524/}.

@item 
bpo-27778@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27778}: Expose the Linux @code{getrandom()} syscall as a new
@ref{ebf,,os.getrandom()} function. This change is part of the 
@geindex Python Enhancement Proposals; PEP 524
PEP 524@footnote{https://peps.python.org/pep-0524/}.

@item 
bpo-27691@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27691}: Fix ssl module’s parsing of GEN_RID subject alternative name
fields in X.509 certs.

@item 
bpo-18844@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18844}: Add random.choices().

@item 
bpo-25761@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25761}: Improved error reporting about truncated pickle data in C
implementation of unpickler.  UnpicklingError is now raised instead of
AttributeError and ValueError in some cases.

@item 
bpo-26798@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26798}: Add BLAKE2 (blake2b and blake2s) to hashlib.

@item 
bpo-26032@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26032}: Optimized globbing in pathlib by using os.scandir(); it is now
about 1.5–4 times faster.

@item 
bpo-25596@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25596}: Optimized glob() and iglob() functions in the glob module; they
are now about 3–6 times faster.

@item 
bpo-27928@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27928}: Add scrypt (password-based key derivation function) to hashlib
module (requires OpenSSL 1.1.0).

@item 
bpo-27850@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27850}: Remove 3DES from ssl module’s default cipher list to counter
measure sweet32 attack (
@geindex Common Vulnerabilities and Exposures; CVE 2016-2183
CVE 2016-2183@footnote{https://www.cve.org/CVERecord?id=CVE-2016-2183}).

@item 
bpo-27766@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27766}: Add ChaCha20 Poly1305 to ssl module’s default cipher list.
(Required OpenSSL 1.1.0 or LibreSSL).

@item 
bpo-25387@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25387}: Check return value of winsound.MessageBeep.

@item 
bpo-27866@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27866}: Add SSLContext.get_ciphers() method to get a list of all
enabled ciphers.

@item 
bpo-27744@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27744}: Add AF_ALG (Linux Kernel crypto) to socket module.

@item 
bpo-26470@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26470}: Port ssl and hashlib module to OpenSSL 1.1.0.

@item 
bpo-11620@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11620}: Fix support for SND_MEMORY in winsound.PlaySound.  Based on a
patch by Tim Lesher.

@item 
bpo-11734@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11734}: Add support for IEEE 754 half-precision floats to the struct
module. Based on a patch by Eli Stevens.

@item 
bpo-27919@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27919}: Deprecated @code{extra_path} distribution option in distutils
packaging.

@item 
bpo-23229@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23229}: Add new @code{cmath} constants: @code{cmath.inf} and @code{cmath.nan} to
match @code{math.inf} and @code{math.nan}, and also @code{cmath.infj} and
@code{cmath.nanj} to match the format used by complex repr.

@item 
bpo-27842@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27842}: The csv.DictReader now returns rows of type OrderedDict.
(Contributed by Steve Holden.)

@item 
Remove support for passing a file descriptor to os.access. It never worked
but previously didn’t raise.

@item 
bpo-12885@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12885}: Fix error when distutils encounters symlink.

@item 
bpo-27881@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27881}: Fixed possible bugs when setting
sqlite3.Connection.isolation_level. Based on patch by Xiang Zhang.

@item 
bpo-27861@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27861}: Fixed a crash in sqlite3.Connection.cursor() when a factory
creates not a cursor.  Patch by Xiang Zhang.

@item 
bpo-19884@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19884}: Avoid spurious output on OS X with Gnu Readline.

@item 
bpo-27706@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27706}: Restore deterministic behavior of random.Random().seed() for
string seeds using seeding version 1.  Allows sequences of calls to
random() to exactly match those obtained in Python 2. Patch by Nofar
Schnider.

@item 
bpo-10513@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10513}: Fix a regression in Connection.commit().  Statements should not
be reset after a commit.

@item 
bpo-12319@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12319}: Chunked transfer encoding support added to
http.client.HTTPConnection requests.  The
urllib.request.AbstractHTTPHandler class does not enforce a Content-Length
header any more.  If a HTTP request has a file or iterable body, but no
Content-Length header, the library now falls back to use chunked
transfer-encoding.

@item 
A new version of typing.py from @indicateurl{https://github.com/python/typing}: -
Collection (only for 3.6) (bpo-27598@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27598}) - Add FrozenSet to __all__
(upstream #261) - fix crash in _get_type_vars() (upstream #259) - Remove
the dict constraint in ForwardRef._eval_type (upstream #252)

@item 
bpo-27832@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27832}: Make @code{_normalize} parameter to @code{Fraction} constructor
keyword-only, so that @code{Fraction(2, 3, 4)} now raises @code{TypeError}.

@item 
bpo-27539@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27539}: Fix unnormalised @code{Fraction.__pow__} result in the case of
negative exponent and negative base.

@item 
bpo-21718@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21718}: cursor.description is now available for queries using CTEs.

@item 
bpo-27819@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27819}: In distutils sdists, simply produce the “gztar” (gzipped tar
format) distributions on all platforms unless “formats” is supplied.

@item 
bpo-2466@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2466}: posixpath.ismount now correctly recognizes mount points which
the user does not have permission to access.

@item 
bpo-9998@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9998}: On Linux, ctypes.util.find_library now looks in LD_LIBRARY_PATH
for shared libraries.

@item 
bpo-27573@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27573}: exit message for code.interact is now configurable.

@item 
bpo-27930@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27930}: Improved behaviour of logging.handlers.QueueListener. Thanks to
Paulo Andrade and Petr Viktorin for the analysis and patch.

@item 
bpo-6766@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6766}: Distributed reference counting added to multiprocessing to
support nesting of shared values / proxy objects.

@item 
bpo-21201@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21201}: Improves readability of multiprocessing error message.  Thanks
to Wojciech Walczak for patch.

@item 
asyncio: Add set_protocol / get_protocol to Transports.

@item 
bpo-27456@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27456}: asyncio: Set TCP_NODELAY by default.
@end itemize

@node IDLE<53>,C API<74>,Library<189>,Python 3 6 0 beta 1
@anchor{whatsnew/changelog id968}@anchor{1f54}
@subsubsection IDLE



@itemize -

@item 
bpo-15308@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15308}: Add ‘interrupt execution’ (^C) to Shell menu. Patch by Roger
Serwy, updated by Bayard Randel.

@item 
bpo-27922@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27922}: Stop IDLE tests from ‘flashing’ gui widgets on the screen.

@item 
bpo-27891@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27891}: Consistently group and sort imports within idlelib modules.

@item 
bpo-17642@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17642}: add larger font sizes for classroom projection.

@item 
Add version to title of IDLE help window.

@item 
bpo-25564@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25564}: In section on IDLE – console differences, mention that using
exec means that __builtins__ is defined for each statement.

@item 
bpo-27821@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27821}: Fix 3.6.0a3 regression that prevented custom key sets from
being selected when no custom theme was defined.
@end itemize

@node C API<74>,Tests<77>,IDLE<53>,Python 3 6 0 beta 1
@anchor{whatsnew/changelog id969}@anchor{1f55}
@subsubsection C API



@itemize -

@item 
bpo-26900@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26900}: Excluded underscored names and other private API from limited
API.

@item 
bpo-26027@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26027}: Add support for path-like objects in PyUnicode_FSConverter() &
PyUnicode_FSDecoder().
@end itemize

@node Tests<77>,Build<88>,C API<74>,Python 3 6 0 beta 1
@anchor{whatsnew/changelog id970}@anchor{1f56}
@subsubsection Tests



@itemize -

@item 
bpo-27427@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27427}: Additional tests for the math module. Patch by Francisco Couzo.

@item 
bpo-27953@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27953}: Skip math and cmath tests that fail on OS X 10.4 due to a poor
libm implementation of tan.

@item 
bpo-26040@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26040}: Improve test_math and test_cmath coverage and rigour. Patch by
Jeff Allen.

@item 
bpo-27787@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27787}: Call gc.collect() before checking each test for “dangling
threads”, since the dangling threads are weak references.
@end itemize

@node Build<88>,Tools/Demos<51>,Tests<77>,Python 3 6 0 beta 1
@anchor{whatsnew/changelog id971}@anchor{1f57}
@subsubsection Build



@itemize -

@item 
bpo-27566@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27566}: Fix clean target in freeze makefile (patch by Lisa Roach)

@item 
bpo-27705@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27705}: Update message in validate_ucrtbase.py

@item 
bpo-27976@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27976}: Deprecate building _ctypes with the bundled copy of libffi on
non-OSX UNIX platforms.

@item 
bpo-27983@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27983}: Cause lack of llvm-profdata tool when using clang as required
for PGO linking to be a configure time error rather than make time when
@code{--with-optimizations} is enabled.  Also improve our ability to find the
llvm-profdata tool on MacOS and some Linuxes.

@item 
bpo-21590@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21590}: Support for DTrace and SystemTap probes.

@item 
bpo-26307@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26307}: The profile-opt build now applies PGO to the built-in modules.

@item 
bpo-26359@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26359}: Add the –with-optimizations flag to turn on LTO and PGO build
support when available.

@item 
bpo-27917@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27917}: Set platform triplets for Android builds.

@item 
bpo-25825@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25825}: Update references to the $(LIBPL) installation path on AIX.
This path was changed in 3.2a4.

@item 
Update OS X installer to use SQLite 3.14.1 and XZ 5.2.2.

@item 
bpo-21122@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21122}: Fix LTO builds on OS X.

@item 
bpo-17128@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17128}: Build OS X installer with a private copy of OpenSSL. Also
provide a sample Install Certificates command script to install a set of
root certificates from the third-party certifi module.
@end itemize

@node Tools/Demos<51>,Windows<75>,Build<88>,Python 3 6 0 beta 1
@anchor{whatsnew/changelog id972}@anchor{1f58}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-27952@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27952}: Get Tools/scripts/fixcid.py working with Python 3 and the
current “re” module, avoid invalid Python backslash escapes, and fix a bug
parsing escaped C quote signs.
@end itemize

@node Windows<75>,,Tools/Demos<51>,Python 3 6 0 beta 1
@anchor{whatsnew/changelog id973}@anchor{1f59}
@subsubsection Windows



@itemize -

@item 
bpo-28065@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28065}: Update xz dependency to 5.2.2 and build it from source.

@item 
bpo-25144@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25144}: Ensures TargetDir is set before continuing with custom install.

@item 
bpo-1602@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1602}: Windows console doesn’t input or print Unicode (PEP 528)

@item 
bpo-27781@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27781}: Change file system encoding on Windows to UTF-8 (PEP 529)

@item 
bpo-27731@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27731}: Opt-out of MAX_PATH on Windows 10

@item 
bpo-6135@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6135}: Adds encoding and errors parameters to subprocess.

@item 
bpo-27959@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27959}: Adds oem encoding, alias ansi to mbcs, move aliasmbcs to codec
lookup.

@item 
bpo-27982@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27982}: The functions of the winsound module now accept keyword
arguments.

@item 
bpo-20366@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20366}: Build full text search support into SQLite on Windows.

@item 
bpo-27756@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27756}: Adds new icons for Python files and processes on Windows.
Designs by Cherry Wang.

@item 
bpo-27883@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27883}: Update sqlite to 3.14.1.0 on Windows.
@end itemize

@node Python 3 6 0 alpha 4,Python 3 6 0 alpha 3,Python 3 6 0 beta 1,Changelog
@anchor{whatsnew/changelog python-3-6-0-alpha-4}@anchor{1f5a}
@subsection Python 3.6.0 alpha 4


`Release date: 2016-08-15'

@menu
* Core and Builtins: Core and Builtins<187>. 
* Library: Library<190>. 
* IDLE: IDLE<54>. 
* Tests: Tests<78>. 
* Windows: Windows<76>. 
* Build: Build<89>. 

@end menu

@node Core and Builtins<187>,Library<190>,,Python 3 6 0 alpha 4
@anchor{whatsnew/changelog id974}@anchor{1f5b}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-27704@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27704}: Optimized creating bytes and bytearray from byte-like objects
and iterables. Speed up to 3 times for short objects.  Original patch by
Naoki Inada.

@item 
bpo-26823@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26823}: Large sections of repeated lines in tracebacks are now
abbreviated as “[Previous line repeated @{count@} more times]” by the
builtin traceback rendering. Patch by Emanuel Barry.

@item 
bpo-27574@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27574}: Decreased an overhead of parsing keyword arguments in functions
implemented with using Argument Clinic.

@item 
bpo-22557@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22557}: Now importing already imported modules is up to 2.5 times
faster.

@item 
bpo-17596@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17596}: Include <wincrypt.h> to help with Min GW building.

@item 
bpo-17599@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17599}: On Windows, rename the privately defined REPARSE_DATA_BUFFER
structure to avoid conflicting with the definition from Min GW.

@item 
bpo-27507@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27507}: Add integer overflow check in bytearray.extend().  Patch by
Xiang Zhang.

@item 
bpo-27581@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27581}: Don’t rely on wrapping for overflow check in
PySequence_Tuple().  Patch by Xiang Zhang.

@item 
bpo-1621@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1621}: Avoid signed integer overflow in list and tuple operations.
Patch by Xiang Zhang.

@item 
bpo-27419@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27419}: Standard __import__() no longer look up “__import__” in globals
or builtins for importing submodules or “from import”.  Fixed a crash if
raise a warning about unabling to resolve package from __spec__ or
__package__.

@item 
bpo-27083@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27083}: Respect the PYTHONCASEOK environment variable under Windows.

@item 
bpo-27514@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27514}: Make having too many statically nested blocks a SyntaxError
instead of SystemError.

@item 
bpo-27366@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27366}: Implemented 
@geindex Python Enhancement Proposals; PEP 487
PEP 487@footnote{https://peps.python.org/pep-0487/} (Simpler customization of class
creation). Upon subclassing, the __init_subclass__ classmethod is called
on the base class. Descriptors are initialized with __set_name__ after
class creation.
@end itemize

@node Library<190>,IDLE<54>,Core and Builtins<187>,Python 3 6 0 alpha 4
@anchor{whatsnew/changelog id975}@anchor{1f5c}
@subsubsection Library



@itemize -

@item 
bpo-26027@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26027}: Add 
@geindex Python Enhancement Proposals; PEP 519
PEP 519@footnote{https://peps.python.org/pep-0519/}/__fspath__() support to the os and os.path
modules. Includes code from Jelle Zijlstra. (See also: bpo-27524@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27524})

@item 
bpo-27598@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27598}: Add Collections to collections.abc. Patch by Ivan Levkivskyi,
docs by Neil Girdhar.

@item 
bpo-25958@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25958}: Support “anti-registration” of special methods from various
ABCs, like __hash__, __iter__ or __len__.  All these (and several more)
can be set to None in an implementation class and the behavior will be as
if the method is not defined at all. (Previously, this mechanism existed
only for __hash__, to make mutable classes unhashable.)  Code contributed
by Andrew Barnert and Ivan Levkivskyi.

@item 
bpo-16764@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16764}: Support keyword arguments to zlib.decompress().  Patch by Xiang
Zhang.

@item 
bpo-27736@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27736}: Prevent segfault after interpreter re-initialization due to ref
count problem introduced in code for bpo-27038@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27038} in 3.6.0a3. Patch by
Xiang Zhang.

@item 
bpo-25628@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25628}: The `verbose' and `rename' parameters for
collections.namedtuple are now keyword-only.

@item 
bpo-12345@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12345}: Add mathematical constant tau to math and cmath. See also
@geindex Python Enhancement Proposals; PEP 628
PEP 628@footnote{https://peps.python.org/pep-0628/}.

@item 
bpo-26823@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26823}: traceback.StackSummary.format now abbreviates large sections of
repeated lines as “[Previous line repeated @{count@} more times]” (this
change then further affects other traceback display operations in the
module). Patch by Emanuel Barry.

@item 
bpo-27664@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27664}: Add to concurrent.futures.thread.ThreadPoolExecutor() the
ability to specify a thread name prefix.

@item 
bpo-27181@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27181}: Add geometric_mean and harmonic_mean to statistics module.

@item 
bpo-27573@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27573}: code.interact now prints an message when exiting.

@item 
bpo-6422@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6422}: Add autorange method to timeit.Timer objects.

@item 
bpo-27773@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27773}: Correct some memory management errors server_hostname in
_ssl.wrap_socket().

@item 
bpo-26750@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26750}: unittest.mock.create_autospec() now works properly for
subclasses of property() and other data descriptors.  Removes the never
publicly used, never documented unittest.mock.DescriptorTypes tuple.

@item 
bpo-26754@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26754}: Undocumented support of general bytes-like objects as path in
compile() and similar functions is now deprecated.

@item 
bpo-26800@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26800}: Undocumented support of general bytes-like objects as paths in
os functions is now deprecated.

@item 
bpo-26981@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26981}: Add _order_ compatibility shim to enum.Enum for Python 2/3 code
bases.

@item 
bpo-27661@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27661}: Added tzinfo keyword argument to datetime.combine.

@item 
In the curses module, raise an error if window.getstr() or window.instr()
is passed a negative value.

@item 
bpo-27783@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27783}: Fix possible usage of uninitialized memory in
operator.methodcaller.

@item 
bpo-27774@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27774}: Fix possible Py_DECREF on unowned object in _sre.

@item 
bpo-27760@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27760}: Fix possible integer overflow in binascii.b2a_qp.

@item 
bpo-27758@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27758}: Fix possible integer overflow in the _csv module for large
record lengths.

@item 
bpo-27568@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27568}: Prevent HTTPoxy attack (
@geindex Common Vulnerabilities and Exposures; CVE 2016-1000110
CVE 2016-1000110@footnote{https://www.cve.org/CVERecord?id=CVE-2016-1000110}). Ignore the
HTTP_PROXY variable when REQUEST_METHOD environment is set, which
indicates that the script is in CGI mode.

@item 
bpo-7063@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7063}: Remove dead code from the “array” module’s slice handling. Patch
by Chuck.

@item 
bpo-27656@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27656}: Do not assume sched.h defines any SCHED_* constants.

@item 
bpo-27130@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27130}: In the “zlib” module, fix handling of large buffers (typically
4 GiB) when compressing and decompressing.  Previously, inputs were
limited to 4 GiB, and compression and decompression operations did not
properly handle results of 4 GiB.

@item 
bpo-24773@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24773}: Implemented 
@geindex Python Enhancement Proposals; PEP 495
PEP 495@footnote{https://peps.python.org/pep-0495/} (Local Time Disambiguation).

@item 
Expose the EPOLLEXCLUSIVE constant (when it is defined) in the select
module.

@item 
bpo-27567@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27567}: Expose the EPOLLRDHUP and POLLRDHUP constants in the select
module.

@item 
bpo-1621@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1621}: Avoid signed int negation overflow in the “audioop” module.

@item 
bpo-27533@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27533}: Release GIL in nt._isdir

@item 
bpo-17711@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17711}: Fixed unpickling by the persistent ID with protocol 0. Original
patch by Alexandre Vassalotti.

@item 
bpo-27522@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27522}: Avoid an unintentional reference cycle in email.feedparser.

@item 
bpo-27512@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27512}: Fix a segfault when os.fspath() called an __fspath__() method
that raised an exception. Patch by Xiang Zhang.
@end itemize

@node IDLE<54>,Tests<78>,Library<190>,Python 3 6 0 alpha 4
@anchor{whatsnew/changelog id976}@anchor{1f5d}
@subsubsection IDLE



@itemize -

@item 
bpo-27714@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27714}: text_textview and test_autocomplete now pass when re-run in the
same process.  This occurs when test_idle fails when run with the -w
option but without -jn.  Fix warning from test_config.

@item 
bpo-27621@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27621}: Put query response validation error messages in the query box
itself instead of in a separate messagebox.  Redo tests to match. Add Mac
OSX refinements. Original patch by Mark Roseman.

@item 
bpo-27620@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27620}: Escape key now closes Query box as cancelled.

@item 
bpo-27609@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27609}: IDLE: tab after initial whitespace should tab, not
autocomplete. This fixes problem with writing docstrings at least twice
indented.

@item 
bpo-27609@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27609}: Explicitly return None when there are also non-None returns. In
a few cases, reverse a condition and eliminate a return.

@item 
bpo-25507@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25507}: IDLE no longer runs buggy code because of its tkinter imports.
Users must include the same imports required to run directly in Python.

@item 
bpo-27173@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27173}: Add ‘IDLE Modern Unix’ to the built-in key sets. Make the
default key set depend on the platform. Add tests for the changes to the
config module.

@item 
bpo-27452@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27452}: add line counter and crc to IDLE configHandler test dump.
@end itemize

@node Tests<78>,Windows<76>,IDLE<54>,Python 3 6 0 alpha 4
@anchor{whatsnew/changelog id977}@anchor{1f5e}
@subsubsection Tests



@itemize -

@item 
bpo-25805@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25805}: Skip a test in test_pkgutil as needed that doesn’t work when
@code{__name__ == __main__}. Patch by SilentGhost.

@item 
bpo-27472@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27472}: Add test.support.unix_shell as the path to the default shell.

@item 
bpo-27369@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27369}: In test_pyexpat, avoid testing an error message detail that
changed in Expat 2.2.0.

@item 
bpo-27594@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27594}: Prevent assertion error when running test_ast with coverage
enabled: ensure code object has a valid first line number. Patch suggested
by Ivan Levkivskyi.
@end itemize

@node Windows<76>,Build<89>,Tests<78>,Python 3 6 0 alpha 4
@anchor{whatsnew/changelog id978}@anchor{1f5f}
@subsubsection Windows



@itemize -

@item 
bpo-27647@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27647}: Update bundled Tcl/Tk to 8.6.6.

@item 
bpo-27610@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27610}: Adds 
@geindex Python Enhancement Proposals; PEP 514
PEP 514@footnote{https://peps.python.org/pep-0514/} metadata to Windows installer

@item 
bpo-27469@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27469}: Adds a shell extension to the launcher so that drag and drop
works correctly.

@item 
bpo-27309@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27309}: Enables proper Windows styles in python[w].exe manifest.
@end itemize

@node Build<89>,,Windows<76>,Python 3 6 0 alpha 4
@anchor{whatsnew/changelog id979}@anchor{1f60}
@subsubsection Build



@itemize -

@item 
bpo-27713@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27713}: Suppress spurious build warnings when updating importlib’s
bootstrap files. Patch by Xiang Zhang

@item 
bpo-25825@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25825}: Correct the references to Modules/python.exp, which is required
on AIX.  The references were accidentally changed in 3.5.0a1.

@item 
bpo-27453@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27453}: CPP invocation in configure must use CPPFLAGS. Patch by Chi
Hsuan Yen.

@item 
bpo-27641@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27641}: The configure script now inserts comments into the makefile to
prevent the pgen and _freeze_importlib executables from being
cross-compiled.

@item 
bpo-26662@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26662}: Set PYTHON_FOR_GEN in configure as the Python program to be
used for file generation during the build.

@item 
bpo-10910@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10910}: Avoid C++ compilation errors on FreeBSD and OS X. Also update
FreedBSD version checks for the original ctype UTF-8 workaround.
@end itemize

@node Python 3 6 0 alpha 3,Python 3 6 0 alpha 2,Python 3 6 0 alpha 4,Changelog
@anchor{whatsnew/changelog python-3-6-0-alpha-3}@anchor{1f61}
@subsection Python 3.6.0 alpha 3


`Release date: 2016-07-11'

@menu
* Security: Security<58>. 
* Core and Builtins: Core and Builtins<188>. 
* Library: Library<191>. 
* IDLE: IDLE<55>. 
* C API: C API<75>. 
* Build: Build<90>. 
* Tools/Demos: Tools/Demos<52>. 
* Documentation: Documentation<78>. 
* Tests: Tests<79>. 

@end menu

@node Security<58>,Core and Builtins<188>,,Python 3 6 0 alpha 3
@anchor{whatsnew/changelog id980}@anchor{1f62}
@subsubsection Security



@itemize -

@item 
bpo-27278@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27278}: Fix os.urandom() implementation using getrandom() on Linux.
Truncate size to INT_MAX and loop until we collected enough random bytes,
instead of casting a directly Py_ssize_t to int.

@item 
bpo-22636@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22636}: Avoid shell injection problems with ctypes.util.find_library().
@end itemize

@node Core and Builtins<188>,Library<191>,Security<58>,Python 3 6 0 alpha 3
@anchor{whatsnew/changelog id981}@anchor{1f63}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-27473@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27473}: Fixed possible integer overflow in bytes and bytearray
concatenations. Patch by Xiang Zhang.

@item 
bpo-23034@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23034}: The output of a special Python build with defined COUNT_ALLOCS,
SHOW_ALLOC_COUNT or SHOW_TRACK_COUNT macros is now off by  default.  It
can be re-enabled using the “-X showalloccount” option.  It now outputs to
stderr instead of stdout.

@item 
bpo-27443@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27443}: __length_hint__() of bytearray iterators no longer return a
negative integer for a resized bytearray.

@item 
bpo-27007@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27007}: The fromhex() class methods of bytes and bytearray subclasses
now return an instance of corresponding subclass.
@end itemize

@node Library<191>,IDLE<55>,Core and Builtins<188>,Python 3 6 0 alpha 3
@anchor{whatsnew/changelog id982}@anchor{1f64}
@subsubsection Library



@itemize -

@item 
bpo-26844@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26844}: Fix error message for imp.find_module() to refer to ‘path’
instead of ‘name’. Patch by Lev Maximov.

@item 
bpo-23804@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23804}: Fix SSL zero-length recv() calls to not block and not raise an
error about unclean EOF.

@item 
bpo-27466@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27466}: Change time format returned by http.cookie.time2netscape,
confirming the netscape cookie format and making it consistent with
documentation.

@item 
bpo-21708@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21708}: Deprecated dbm.dumb behavior that differs from common dbm
behavior: creating a database in ‘r’ and ‘w’ modes and modifying a
database in ‘r’ mode.

@item 
bpo-26721@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26721}: Change the socketserver.StreamRequestHandler.wfile attribute to
implement BufferedIOBase. In particular, the write() method no longer does
partial writes.

@item 
bpo-22115@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22115}: Added methods trace_add, trace_remove and trace_info in the
tkinter.Variable class.  They replace old methods trace_variable, trace,
trace_vdelete and trace_vinfo that use obsolete Tcl commands and might not
work in future versions of Tcl.  Fixed old tracing methods:
trace_vdelete() with wrong mode no longer break tracing, trace_vinfo() now
always returns a list of pairs of strings, tracing in the “u” mode now
works.

@item 
bpo-26243@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26243}: Only the level argument to zlib.compress() is keyword argument
now.  The first argument is positional-only.

@item 
bpo-27038@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27038}: Expose the DirEntry type as os.DirEntry. Code patch by Jelle
Zijlstra.

@item 
bpo-27186@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27186}: Update os.fspath()/PyOS_FSPath() to check the return value of
__fspath__() to be either str or bytes.

@item 
bpo-18726@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18726}: All optional parameters of the dump(), dumps(), load() and
loads() functions and JSONEncoder and JSONDecoder class constructors in
the json module are now keyword-only.

@item 
bpo-27319@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27319}: Methods selection_set(), selection_add(), selection_remove()
and selection_toggle() of ttk.TreeView now allow passing multiple items as
multiple arguments instead of passing them as a tuple.  Deprecated
undocumented ability of calling the selection() method with arguments.

@item 
bpo-27079@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27079}: Fixed curses.ascii functions isblank(), iscntrl() and
ispunct().

@item 
bpo-27294@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27294}: Numerical state in the repr for Tkinter event objects is now
represented as a combination of known flags.

@item 
bpo-27177@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27177}: Match objects in the re module now support index-like objects
as group indices.  Based on patches by Jeroen Demeyer and Xiang Zhang.

@item 
bpo-26754@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26754}: Some functions (compile() etc) accepted a filename argument
encoded as an iterable of integers. Now only strings and byte-like objects
are accepted.

@item 
bpo-26536@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26536}: socket.ioctl now supports SIO_LOOPBACK_FAST_PATH. Patch by
Daniel Stokes.

@item 
bpo-27048@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27048}: Prevents distutils failing on Windows when environment
variables contain non-ASCII characters

@item 
bpo-27330@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27330}: Fixed possible leaks in the ctypes module.

@item 
bpo-27238@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27238}: Got rid of bare excepts in the turtle module.  Original patch
by Jelle Zijlstra.

@item 
bpo-27122@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27122}: When an exception is raised within the context being managed by
a contextlib.ExitStack() and one of the exit stack generators catches and
raises it in a chain, do not re-raise the original exception when exiting,
let the new chained one through.  This avoids the 
@geindex Python Enhancement Proposals; PEP 479
PEP 479@footnote{https://peps.python.org/pep-0479/} bug described
in issue25782.

@item 
bpo-16864@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16864}: sqlite3.Cursor.lastrowid now supports REPLACE statement.
Initial patch by Alex LordThorsen.

@item 
bpo-26386@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26386}: Fixed ttk.TreeView selection operations with item id’s
containing spaces.

@item 
bpo-8637@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8637}: Honor a pager set by the env var MANPAGER (in preference to one
set by the env var PAGER).

@item 
bpo-16182@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16182}: Fix various functions in the “readline” module to use the
locale encoding, and fix get_begidx() and get_endidx() to return code
point indexes.

@item 
bpo-27392@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27392}: Add loop.connect_accepted_socket(). Patch by Jim Fulton.
@end itemize

@node IDLE<55>,C API<75>,Library<191>,Python 3 6 0 alpha 3
@anchor{whatsnew/changelog id983}@anchor{1f65}
@subsubsection IDLE



@itemize -

@item 
bpo-27477@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27477}: IDLE search dialogs now use ttk widgets.

@item 
bpo-27173@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27173}: Add ‘IDLE Modern Unix’ to the built-in key sets. Make the
default key set depend on the platform. Add tests for the changes to the
config module.

@item 
bpo-27452@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27452}: make command line “idle-test> python test_help.py” work.
__file__ is relative when python is started in the file’s directory.

@item 
bpo-27452@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27452}: add line counter and crc to IDLE configHandler test dump.

@item 
bpo-27380@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27380}: IDLE: add query.py with base Query dialog and ttk widgets.
Module had subclasses SectionName, ModuleName, and HelpSource, which are
used to get information from users by configdialog and file =>Load Module.
Each subclass has itw own validity checks.  Using ModuleName allows users
to edit bad module names instead of starting over. Add tests and delete
the two files combined into the new one.

@item 
bpo-27372@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27372}: Test_idle no longer changes the locale.

@item 
bpo-27365@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27365}: Allow non-ascii chars in IDLE NEWS.txt, for contributor names.

@item 
bpo-27245@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27245}: IDLE: Cleanly delete custom themes and key bindings.
Previously, when IDLE was started from a console or by import, a cascade
of warnings was emitted. Patch by Serhiy Storchaka.

@item 
bpo-24137@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24137}: Run IDLE, test_idle, and htest with tkinter default root
disabled.  Fix code and tests that fail with this restriction.  Fix htests
to not create a second and redundant root and mainloop.

@item 
bpo-27310@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27310}: Fix IDLE.app failure to launch on OS X due to vestigial import.
@end itemize

@node C API<75>,Build<90>,IDLE<55>,Python 3 6 0 alpha 3
@anchor{whatsnew/changelog id984}@anchor{1f66}
@subsubsection C API



@itemize -

@item 
bpo-26754@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26754}: PyUnicode_FSDecoder() accepted a filename argument encoded as
an iterable of integers. Now only strings and byte-like objects are
accepted.
@end itemize

@node Build<90>,Tools/Demos<52>,C API<75>,Python 3 6 0 alpha 3
@anchor{whatsnew/changelog id985}@anchor{1f67}
@subsubsection Build



@itemize -

@item 
bpo-28066@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28066}: Fix the logic that searches build directories for generated
include files when building outside the source tree.

@item 
bpo-27442@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27442}: Expose the Android API level that python was built against, in
sysconfig.get_config_vars() as ‘ANDROID_API_LEVEL’.

@item 
bpo-27434@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27434}: The interpreter that runs the cross-build, found in PATH, must
now be of the same feature version (e.g. 3.6) as the source being built.

@item 
bpo-26930@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26930}: Update Windows builds to use OpenSSL 1.0.2h.

@item 
bpo-23968@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23968}: Rename the platform directory from plat-$(MACHDEP) to
plat-$(PLATFORM_TRIPLET). Rename the config directory (LIBPL) from
config-$(LDVERSION) to config-$(LDVERSION)-$(PLATFORM_TRIPLET). Install
the platform specific _sysconfigdata module into the platform directory
and rename it to include the ABIFLAGS.

@item 
Don’t use largefile support for GNU/Hurd.
@end itemize

@node Tools/Demos<52>,Documentation<78>,Build<90>,Python 3 6 0 alpha 3
@anchor{whatsnew/changelog id986}@anchor{1f68}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-27332@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27332}: Fixed the type of the first argument of module-level functions
generated by Argument Clinic.  Patch by Petr Viktorin.

@item 
bpo-27418@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27418}: Fixed Tools/importbench/importbench.py.
@end itemize

@node Documentation<78>,Tests<79>,Tools/Demos<52>,Python 3 6 0 alpha 3
@anchor{whatsnew/changelog id987}@anchor{1f69}
@subsubsection Documentation



@itemize -

@item 
bpo-19489@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19489}: Moved the search box from the sidebar to the header and footer
of each page. Patch by Ammar Askar.

@item 
bpo-27285@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27285}: Update documentation to reflect the deprecation of @code{pyvenv}
and normalize on the term “virtual environment”. Patch by Steve Piercy.
@end itemize

@node Tests<79>,,Documentation<78>,Python 3 6 0 alpha 3
@anchor{whatsnew/changelog id988}@anchor{1f6a}
@subsubsection Tests



@itemize -

@item 
bpo-27027@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27027}: Added test.support.is_android that is True when this is an
Android build.
@end itemize

@node Python 3 6 0 alpha 2,Python 3 6 0 alpha 1,Python 3 6 0 alpha 3,Changelog
@anchor{whatsnew/changelog python-3-6-0-alpha-2}@anchor{1f6b}
@subsection Python 3.6.0 alpha 2


`Release date: 2016-06-13'

@menu
* Security: Security<59>. 
* Core and Builtins: Core and Builtins<189>. 
* Library: Library<192>. 
* IDLE: IDLE<56>. 
* Documentation: Documentation<79>. 
* Tests: Tests<80>. 
* Windows: Windows<77>. 
* Build: Build<91>. 
* C API: C API<76>. 
* Tools/Demos: Tools/Demos<53>. 

@end menu

@node Security<59>,Core and Builtins<189>,,Python 3 6 0 alpha 2
@anchor{whatsnew/changelog id989}@anchor{1f6c}
@subsubsection Security



@itemize -

@item 
bpo-26556@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26556}: Update expat to 2.1.1, fixes 
@geindex Common Vulnerabilities and Exposures; CVE 2015-1283
CVE 2015-1283@footnote{https://www.cve.org/CVERecord?id=CVE-2015-1283}.

@item 
Fix TLS stripping vulnerability in smtplib, 
@geindex Common Vulnerabilities and Exposures; CVE 2016-0772
CVE 2016-0772@footnote{https://www.cve.org/CVERecord?id=CVE-2016-0772}. Reported by
Team Oststrom.

@item 
bpo-26839@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26839}: On Linux, @ref{747,,os.urandom()} now calls @code{getrandom()} with
@code{GRND_NONBLOCK} to fall back on reading @code{/dev/urandom} if the urandom
entropy pool is not initialized yet. Patch written by Colm Buckley.
@end itemize

@node Core and Builtins<189>,Library<192>,Security<59>,Python 3 6 0 alpha 2
@anchor{whatsnew/changelog id990}@anchor{1f6d}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-27095@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27095}: Simplified MAKE_FUNCTION and removed MAKE_CLOSURE opcodes.
Patch by Demur Rumed.

@item 
bpo-27190@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27190}: Raise NotSupportedError if sqlite3 is older than 3.3.1. Patch
by Dave Sawyer.

@item 
bpo-27286@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27286}: Fixed compiling BUILD_MAP_UNPACK_WITH_CALL opcode.  Calling
function with generalized unpacking (PEP 448) and conflicting keyword
names could cause undefined behavior.

@item 
bpo-27140@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27140}: Added BUILD_CONST_KEY_MAP opcode.

@item 
bpo-27186@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27186}: Add support for os.PathLike objects to open() (part of
@geindex Python Enhancement Proposals; PEP 519
PEP 519@footnote{https://peps.python.org/pep-0519/}).

@item 
bpo-27066@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27066}: Fixed SystemError if a custom opener (for open()) returns a
negative number without setting an exception.

@item 
bpo-26983@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26983}: float() now always return an instance of exact float. The
deprecation warning is emitted if __float__ returns an instance of a
strict subclass of float.  In a future versions of Python this can be an
error.

@item 
bpo-27097@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27097}: Python interpreter is now about 7% faster due to optimized
instruction decoding.  Based on patch by Demur Rumed.

@item 
bpo-26647@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26647}: Python interpreter now uses 16-bit wordcode instead of
bytecode. Patch by Demur Rumed.

@item 
bpo-23275@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23275}: Allow assigning to an empty target list in round brackets: () =
iterable.

@item 
bpo-27243@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27243}: Update the __aiter__ protocol: instead of returning an
awaitable that resolves to an asynchronous iterator, the asynchronous
iterator should be returned directly.  Doing the former will trigger a
PendingDeprecationWarning.
@end itemize

@node Library<192>,IDLE<56>,Core and Builtins<189>,Python 3 6 0 alpha 2
@anchor{whatsnew/changelog id991}@anchor{1f6e}
@subsubsection Library



@itemize -

@item 
Comment out socket (SO_REUSEPORT) and posix (O_SHLOCK, O_EXLOCK) constants
exposed on the API which are not implemented on GNU/Hurd. They would not
work at runtime anyway.

@item 
bpo-27025@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27025}: Generated names for Tkinter widgets are now more meaningful and
recognizable.

@item 
bpo-25455@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25455}: Fixed crashes in repr of recursive ElementTree.Element and
functools.partial objects.

@item 
bpo-27294@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27294}: Improved repr for Tkinter event objects.

@item 
bpo-20508@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20508}: Improve exception message of IPv@{4,6@}Network.__getitem__. Patch
by Gareth Rees.

@item 
bpo-21386@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21386}: Implement missing IPv4Address.is_global property.  It was
documented since 07a5610bae9d.  Initial patch by Roger Luethi.

@item 
bpo-27029@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27029}: Removed deprecated support of universal newlines mode from
ZipFile.open().

@item 
bpo-27030@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27030}: Unknown escapes consisting of @code{'\'} and an ASCII letter in
regular expressions now are errors.  The re.LOCALE flag now can be used
only with bytes patterns.

@item 
bpo-27186@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27186}: Add os.PathLike support to DirEntry (part of 
@geindex Python Enhancement Proposals; PEP 519
PEP 519@footnote{https://peps.python.org/pep-0519/}).
Initial patch by Jelle Zijlstra.

@item 
bpo-20900@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20900}: distutils register command now decodes HTTP responses
correctly.  Initial patch by ingrid.

@item 
bpo-27186@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27186}: Add os.PathLike support to pathlib, removing its provisional
status (part of PEP 519). Initial patch by Dusty Phillips.

@item 
bpo-27186@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27186}: Add support for os.PathLike objects to os.fsencode() and
os.fsdecode() (part of 
@geindex Python Enhancement Proposals; PEP 519
PEP 519@footnote{https://peps.python.org/pep-0519/}).

@item 
bpo-27186@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27186}: Introduce os.PathLike and os.fspath() (part of 
@geindex Python Enhancement Proposals; PEP 519
PEP 519@footnote{https://peps.python.org/pep-0519/}).

@item 
A new version of typing.py provides several new classes and features:
@@overload outside stubs, Reversible, DefaultDict, Text, ContextManager,
Type[], NewType(), TYPE_CHECKING, and numerous bug fixes (note that some
of the new features are not yet implemented in mypy or other static
analyzers). Also classes for 
@geindex Python Enhancement Proposals; PEP 492
PEP 492@footnote{https://peps.python.org/pep-0492/} (Awaitable, AsyncIterable,
AsyncIterator) have been added (in fact they made it into 3.5.1 but were
never mentioned).

@item 
bpo-25738@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25738}: Stop http.server.BaseHTTPRequestHandler.send_error() from
sending a message body for 205 Reset Content.  Also, don’t send Content
header fields in responses that don’t have a body.  Patch by Susumu
Koshiba.

@item 
bpo-21313@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21313}: Fix the “platform” module to tolerate when sys.version contains
truncated build information.

@item 
bpo-23883@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23883}: Added missing APIs to __all__ to match the documented APIs for
the following modules: cgi, mailbox, mimetypes, plistlib and smtpd.
Patches by Jacek Kołodziej.

@item 
bpo-27164@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27164}: In the zlib module, allow decompressing raw Deflate streams
with a predefined zdict.  Based on patch by Xiang Zhang.

@item 
bpo-24291@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24291}: Fix wsgiref.simple_server.WSGIRequestHandler to completely
write data to the client.  Previously it could do partial writes and
truncate data.  Also, wsgiref.handler.ServerHandler can now handle stdout
doing partial writes, but this is deprecated.

@item 
bpo-21272@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21272}: Use _sysconfigdata.py to initialize distutils.sysconfig.

@item 
bpo-19611@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19611}: @ref{82,,inspect} now reports the implicit @code{.0} parameters
generated by the compiler for comprehension and generator expression
scopes as if they were positional-only parameters called @code{implicit0}.
Patch by Jelle Zijlstra.

@item 
bpo-26809@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26809}: Add @code{__all__} to @ref{d8,,string}.  Patch by Emanuel Barry.

@item 
bpo-26373@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26373}: subprocess.Popen.communicate now correctly ignores
BrokenPipeError when the child process dies before .communicate() is
called in more/all circumstances.

@item 
signal, socket, and ssl module IntEnum constant name lookups now return a
consistent name for values having multiple names.  Ex: signal.Signals(6)
now refers to itself as signal.SIGALRM rather than flipping between that
and signal.SIGIOT based on the interpreter’s hash randomization seed.

@item 
bpo-27167@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27167}: Clarify the subprocess.CalledProcessError error message text
when the child process died due to a signal.

@item 
bpo-25931@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25931}: Don’t define socketserver.Forking* names on platforms such as
Windows that do not support os.fork().

@item 
bpo-21776@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21776}: distutils.upload now correctly handles HTTPError. Initial patch
by Claudiu Popa.

@item 
bpo-26526@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26526}: Replace custom parse tree validation in the parser module with
a simple DFA validator.

@item 
bpo-27114@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27114}: Fix SSLContext._load_windows_store_certs fails with
PermissionError

@item 
bpo-18383@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18383}: Avoid creating duplicate filters when using filterwarnings and
simplefilter. Based on patch by Alex Shkop.

@item 
bpo-23026@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23026}: winreg.QueryValueEx() now return an integer for REG_QWORD type.

@item 
bpo-26741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26741}: subprocess.Popen destructor now emits a ResourceWarning warning
if the child process is still running.

@item 
bpo-27056@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27056}: Optimize pickle.load() and pickle.loads(), up to 10% faster to
deserialize a lot of small objects.

@item 
bpo-21271@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21271}: New keyword only parameters in reset_mock call.
@end itemize

@node IDLE<56>,Documentation<79>,Library<192>,Python 3 6 0 alpha 2
@anchor{whatsnew/changelog id992}@anchor{1f6f}
@subsubsection IDLE



@itemize -

@item 
bpo-5124@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5124}: Paste with text selected now replaces the selection on X11. This
matches how paste works on Windows, Mac, most modern Linux apps, and ttk
widgets. Original patch by Serhiy Storchaka.

@item 
bpo-24750@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24750}: Switch all scrollbars in IDLE to ttk versions. Where needed,
minimal tests are added to cover changes.

@item 
bpo-24759@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24759}: IDLE requires tk 8.5 and availability ttk widgets. Delete now
unneeded tk version tests and code for older versions. Add test for IDLE
syntax colorizer.

@item 
bpo-27239@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27239}: idlelib.macosx.isXyzTk functions initialize as needed.

@item 
bpo-27262@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27262}: move Aqua unbinding code, which enable context menus, to
macosx.

@item 
bpo-24759@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24759}: Make clear in idlelib.idle_test.__init__ that the directory is
a private implementation of test.test_idle and tool for maintainers.

@item 
bpo-27196@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27196}: Stop ‘ThemeChanged’ warnings when running IDLE tests. These
persisted after other warnings were suppressed in #20567. Apply Serhiy
Storchaka’s update_idletasks solution to four test files. Record this
additional advice in idle_test/README.txt

@item 
bpo-20567@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20567}: Revise idle_test/README.txt with advice about avoiding tk
warning messages from tests.  Apply advice to several IDLE tests.

@item 
bpo-24225@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24225}: Update idlelib/README.txt with new file names and event
handlers.

@item 
bpo-27156@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27156}: Remove obsolete code not used by IDLE.

@item 
bpo-27117@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27117}: Make colorizer htest and turtledemo work with dark themes. Move
code for configuring text widget colors to a new function.

@item 
bpo-24225@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24225}: Rename many @code{idlelib/*.py} and @code{idle_test/test_*.py} files.
Edit files to replace old names with new names when the old name referred
to the module rather than the class it contained. See the issue and IDLE
section in What’s New in 3.6 for more.

@item 
bpo-26673@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26673}: When tk reports font size as 0, change to size 10. Such fonts
on Linux prevented the configuration dialog from opening.

@item 
bpo-21939@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21939}: Add test for IDLE’s percolator. Original patch by Saimadhav
Heblikar.

@item 
bpo-21676@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21676}: Add test for IDLE’s replace dialog. Original patch by Saimadhav
Heblikar.

@item 
bpo-18410@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18410}: Add test for IDLE’s search dialog. Original patch by Westley
Martínez.

@item 
bpo-21703@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21703}: Add test for undo delegator.  Patch mostly by Saimadhav
Heblikar .

@item 
bpo-27044@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27044}: Add ConfigDialog.remove_var_callbacks to stop memory leaks.

@item 
bpo-23977@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23977}: Add more asserts to test_delegator.
@end itemize

@node Documentation<79>,Tests<80>,IDLE<56>,Python 3 6 0 alpha 2
@anchor{whatsnew/changelog id993}@anchor{1f70}
@subsubsection Documentation



@itemize -

@item 
bpo-16484@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16484}: Change the default PYTHONDOCS URL to “https:”, and fix the
resulting links to use lowercase.  Patch by Sean Rodman, test by Kaushik
Nadikuditi.

@item 
bpo-24136@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24136}: Document the new 
@geindex Python Enhancement Proposals; PEP 448
PEP 448@footnote{https://peps.python.org/pep-0448/} unpacking syntax of 3.5.

@item 
bpo-22558@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22558}: Add remaining doc links to source code for Python-coded
modules. Patch by Yoni Lavi.
@end itemize

@node Tests<80>,Windows<77>,Documentation<79>,Python 3 6 0 alpha 2
@anchor{whatsnew/changelog id994}@anchor{1f71}
@subsubsection Tests



@itemize -

@item 
bpo-25285@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25285}: regrtest now uses subprocesses when the -j1 command line option
is used: each test file runs in a fresh child process. Before, the -j1
option was ignored.

@item 
bpo-25285@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25285}: Tools/buildbot/test.bat script now uses -j1 by default to run
each test file in fresh child process.
@end itemize

@node Windows<77>,Build<91>,Tests<80>,Python 3 6 0 alpha 2
@anchor{whatsnew/changelog id995}@anchor{1f72}
@subsubsection Windows



@itemize -

@item 
bpo-27064@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27064}: The py.exe launcher now defaults to Python 3. The Windows
launcher @code{py.exe} no longer prefers an installed Python 2 version over
Python 3 by default when used interactively.

@item 
bpo-17500@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17500}: Remove unused and outdated icons. (See also:
@indicateurl{https://github.com/python/pythondotorg/issues/945})
@end itemize

@node Build<91>,C API<76>,Windows<77>,Python 3 6 0 alpha 2
@anchor{whatsnew/changelog id996}@anchor{1f73}
@subsubsection Build



@itemize -

@item 
bpo-27229@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27229}: Fix the cross-compiling pgen rule for in-tree builds.  Patch by
Xavier de Gaye.

@item 
bpo-26930@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26930}: Update OS X 10.5+ 32-bit-only installer to build and link with
OpenSSL 1.0.2h.
@end itemize

@node C API<76>,Tools/Demos<53>,Build<91>,Python 3 6 0 alpha 2
@anchor{whatsnew/changelog id997}@anchor{1f74}
@subsubsection C API



@itemize -

@item 
bpo-27186@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27186}: Add the PyOS_FSPath() function (part of 
@geindex Python Enhancement Proposals; PEP 519
PEP 519@footnote{https://peps.python.org/pep-0519/}).

@item 
bpo-26282@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26282}: PyArg_ParseTupleAndKeywords() now supports positional-only
parameters.
@end itemize

@node Tools/Demos<53>,,C API<76>,Python 3 6 0 alpha 2
@anchor{whatsnew/changelog id998}@anchor{1f75}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-26282@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26282}: Argument Clinic now supports positional-only and keyword
parameters in the same function.
@end itemize

@node Python 3 6 0 alpha 1,Python 3 5 5 final,Python 3 6 0 alpha 2,Changelog
@anchor{whatsnew/changelog python-3-6-0-alpha-1}@anchor{1f76}
@subsection Python 3.6.0 alpha 1


`Release date: 2016-05-16'

@menu
* Security: Security<60>. 
* Core and Builtins: Core and Builtins<190>. 
* Library: Library<193>. 
* IDLE: IDLE<57>. 
* Documentation: Documentation<80>. 
* Tests: Tests<81>. 
* Build: Build<92>. 
* Windows: Windows<78>. 
* Tools/Demos: Tools/Demos<54>. 
* C API: C API<77>. 

@end menu

@node Security<60>,Core and Builtins<190>,,Python 3 6 0 alpha 1
@anchor{whatsnew/changelog id999}@anchor{1f77}
@subsubsection Security



@itemize -

@item 
bpo-26657@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26657}: Fix directory traversal vulnerability with http.server on
Windows.  This fixes a regression that was introduced in 3.3.4rc1 and
3.4.0rc1.  Based on patch by Philipp Hagemeister.

@item 
bpo-26313@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26313}: ssl.py _load_windows_store_certs fails if windows cert store is
empty. Patch by Baji.

@item 
bpo-25939@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25939}: On Windows open the cert store readonly in
ssl.enum_certificates.
@end itemize

@node Core and Builtins<190>,Library<193>,Security<60>,Python 3 6 0 alpha 1
@anchor{whatsnew/changelog id1000}@anchor{1f78}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-20041@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20041}: Fixed TypeError when frame.f_trace is set to None. Patch by
Xavier de Gaye.

@item 
bpo-26168@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26168}: Fixed possible refleaks in failing Py_BuildValue() with the “N”
format unit.

@item 
bpo-26991@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26991}: Fix possible refleak when creating a function with annotations.

@item 
bpo-27039@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27039}: Fixed bytearray.remove() for values greater than 127.  Based on
patch by Joe Jevnik.

@item 
bpo-23640@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23640}: int.from_bytes() no longer bypasses constructors for
subclasses.

@item 
bpo-27005@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27005}: Optimized the float.fromhex() class method for exact float. It
is now 2 times faster.

@item 
bpo-18531@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18531}: Single var-keyword argument of dict subtype was passed
unscathed to the C-defined function.  Now it is converted to exact dict.

@item 
bpo-26811@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26811}: gc.get_objects() no longer contains a broken tuple with NULL
pointer.

@item 
bpo-20120@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20120}: Use RawConfigParser for .pypirc parsing, removing support for
interpolation unintentionally added with move to Python 3. Behavior no
longer does any interpolation in .pypirc files, matching behavior in
Python 2.7 and Setuptools 19.0.

@item 
bpo-26249@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26249}: Memory functions of the @ref{e66,,PyMem_Malloc()} domain
(@ref{e69,,PYMEM_DOMAIN_MEM}) now use the @ref{f11,,pymalloc allocator} rather than system @code{malloc()}. Applications calling
@code{PyMem_Malloc()} without holding the GIL can now crash: use
@code{PYTHONMALLOC=debug} environment variable to validate the usage of
memory allocators in your application.

@item 
bpo-26802@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26802}: Optimize function calls only using unpacking like
@code{func(*tuple)} (no other positional argument, no keyword): avoid copying
the tuple. Patch written by Joe Jevnik.

@item 
bpo-26659@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26659}: Make the builtin slice type support cycle collection.

@item 
bpo-26718@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26718}: super.__init__ no longer leaks memory if called multiple times.
NOTE: A direct call of super.__init__ is not endorsed!

@item 
bpo-27138@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27138}: Fix the doc comment for FileFinder.find_spec().

@item 
bpo-27147@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27147}: Mention 
@geindex Python Enhancement Proposals; PEP 420
PEP 420@footnote{https://peps.python.org/pep-0420/} in the importlib docs.

@item 
bpo-25339@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25339}: PYTHONIOENCODING now has priority over locale in setting the
error handler for stdin and stdout.

@item 
bpo-26494@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26494}: Fixed crash on iterating exhausting iterators. Affected classes
are generic sequence iterators, iterators of str, bytes, bytearray, list,
tuple, set, frozenset, dict, OrderedDict, corresponding views and
os.scandir() iterator.

@item 
bpo-26574@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26574}: Optimize @code{bytes.replace(b'@w{'}, b'.')} and
@code{bytearray.replace(b'@w{'}, b'.')}. Patch written by Josh Snider.

@item 
bpo-26581@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26581}: If coding cookie is specified multiple times on a line in
Python source code file, only the first one is taken to account.

@item 
bpo-19711@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19711}: Add tests for reloading namespace packages.

@item 
bpo-21099@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21099}: Switch applicable importlib tests to use 
@geindex Python Enhancement Proposals; PEP 451
PEP 451@footnote{https://peps.python.org/pep-0451/} API.

@item 
bpo-26563@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26563}: Debug hooks on Python memory allocators now raise a fatal error
if functions of the @ref{e66,,PyMem_Malloc()} family are called without
holding the GIL.

@item 
bpo-26564@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26564}: On error, the debug hooks on Python memory allocators now use
the @ref{106,,tracemalloc} module to get the traceback where a memory block
was allocated.

@item 
bpo-26558@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26558}: The debug hooks on Python memory allocator
@ref{e68,,PyObject_Malloc()} now detect when functions are called without
holding the GIL.

@item 
bpo-26516@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26516}: Add 
@geindex PYTHONMALLOC
@geindex environment variable; PYTHONMALLOC
@ref{e64,,PYTHONMALLOC} environment variable to set the
Python memory allocators and/or install debug hooks.

@item 
bpo-26516@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26516}: The @ref{e6a,,PyMem_SetupDebugHooks()} function can now also be
used on Python compiled in release mode.

@item 
bpo-26516@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26516}: The 
@geindex PYTHONMALLOCSTATS
@geindex environment variable; PYTHONMALLOCSTATS
@ref{1f79,,PYTHONMALLOCSTATS} environment variable can now
also be used on Python compiled in release mode. It now has no effect if
set to an empty string.

@item 
bpo-26516@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26516}: In debug mode, debug hooks are now also installed on Python
memory allocators when Python is configured without pymalloc.

@item 
bpo-26464@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26464}: Fix str.translate() when string is ASCII and first replacements
removes character, but next replacement uses a non-ASCII character or a
string longer than 1 character. Regression introduced in Python 3.5.0.

@item 
bpo-22836@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22836}: Ensure exception reports from PyErr_Display() and
PyErr_WriteUnraisable() are sensible even when formatting them produces
secondary errors.  This affects the reports produced by
sys.__excepthook__() and when __del__() raises an exception.

@item 
bpo-26302@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26302}: Correct behavior to reject comma as a legal character for
cookie names.

@item 
bpo-26136@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26136}: Upgrade the warning when a generator raises StopIteration from
PendingDeprecationWarning to DeprecationWarning.  Patch by Anish Shah.

@item 
bpo-26204@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26204}: The compiler now ignores all constant statements: bytes, str,
int, float, complex, name constants (None, False, True), Ellipsis and
ast.Constant; not only str and int. For example, @code{1.0} is now ignored in
@code{def f(): 1.0}.

@item 
bpo-4806@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4806}: Avoid masking the original TypeError exception when using star
(@code{*}) unpacking in function calls.  Based on patch by Hagen Fürstenau
and Daniel Urban.

@item 
bpo-26146@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26146}: Add a new kind of AST node: @code{ast.Constant}. It can be used by
external AST optimizers, but the compiler does not emit directly such
node.

@item 
bpo-23601@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23601}: Sped-up allocation of dict key objects by using Python’s small
object allocator.  (Contributed by Julian Taylor.)

@item 
bpo-18018@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18018}: Import raises ImportError instead of SystemError if a relative
import is attempted without a known parent package.

@item 
bpo-25843@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25843}: When compiling code, don’t merge constants if they are equal
but have a different types. For example, @code{f1, f2 = lambda: 1, lambda:
1.0} is now correctly compiled to two different functions: @code{f1()}
returns @code{1} (@code{int}) and @code{f2()} returns @code{1.0} (@code{float}), even if
@code{1} and @code{1.0} are equal.

@item 
bpo-26107@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26107}: The format of the @code{co_lnotab} attribute of code objects
changes to support negative line number delta.

@item 
bpo-26154@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26154}: Add a new private _PyThreadState_UncheckedGet() function to get
the current Python thread state, but don’t issue a fatal error if it is
NULL. This new function must be used instead of accessing directly the
_PyThreadState_Current variable.  The variable is no more exposed since
Python 3.5.1 to hide the exact implementation of atomic C types, to avoid
compiler issues.

@item 
bpo-25791@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25791}: If __package__ != __spec__.parent or if neither __package__ or
__spec__ are defined then ImportWarning is raised.

@item 
bpo-22995@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22995}: [UPDATE] Comment out the one of the pickleability tests in
_PyObject_GetState() due to regressions observed in Cython-based projects.

@item 
bpo-25961@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25961}: Disallowed null characters in the type name.

@item 
bpo-25973@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25973}: Fix segfault when an invalid nonlocal statement binds a name
starting with two underscores.

@item 
bpo-22995@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22995}: Instances of extension types with a state that aren’t
subclasses of list or dict and haven’t implemented any pickle-related
methods (__reduce__, __reduce_ex__, __getnewargs__, __getnewargs_ex__, or
__getstate__), can no longer be pickled.  Including memoryview.

@item 
bpo-20440@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20440}: Massive replacing unsafe attribute setting code with special
macro Py_SETREF.

@item 
bpo-25766@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25766}: Special method __bytes__() now works in str subclasses.

@item 
bpo-25421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25421}: __sizeof__ methods of builtin types now use dynamic basic size.
This allows sys.getsize() to work correctly with their subclasses with
__slots__ defined.

@item 
bpo-25709@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25709}: Fixed problem with in-place string concatenation and utf-8
cache.

@item 
bpo-5319@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5319}: New Py_FinalizeEx() API allowing Python to set an exit status of
120 on failure to flush buffered streams.

@item 
bpo-25485@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25485}: telnetlib.Telnet is now a context manager.

@item 
bpo-24097@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24097}: Fixed crash in object.__reduce__() if slot name is freed inside
__getattr__.

@item 
bpo-24731@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24731}: Fixed crash on converting objects with special methods
__bytes__, __trunc__, and __float__ returning instances of subclasses of
bytes, int, and float to subclasses of bytes, int, and float
correspondingly.

@item 
bpo-25630@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25630}: Fix a possible segfault during argument parsing in functions
that accept filesystem paths.

@item 
bpo-23564@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23564}: Fixed a partially broken sanity check in the _posixsubprocess
internals regarding how fds_to_pass were passed to the child.  The bug had
no actual impact as subprocess.py already avoided it.

@item 
bpo-25388@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25388}: Fixed tokenizer crash when processing undecodable source code
with a null byte.

@item 
bpo-25462@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25462}: The hash of the key now is calculated only once in most
operations in C implementation of OrderedDict.

@item 
bpo-22995@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22995}: Default implementation of __reduce__ and __reduce_ex__ now
rejects builtin types with not defined __new__.

@item 
bpo-24802@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24802}: Avoid buffer overreads when int(), float(), compile(), exec()
and eval() are passed bytes-like objects.  These objects are not
necessarily terminated by a null byte, but the functions assumed they
were.

@item 
bpo-25555@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25555}: Fix parser and AST: fill lineno and col_offset of “arg” node
when compiling AST from Python objects.

@item 
bpo-24726@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24726}: Fixed a crash and leaking NULL in repr() of OrderedDict that
was mutated by direct calls of dict methods.

@item 
bpo-25449@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25449}: Iterating OrderedDict with keys with unstable hash now raises
KeyError in C implementations as well as in Python implementation.

@item 
bpo-25395@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25395}: Fixed crash when highly nested OrderedDict structures were
garbage collected.

@item 
bpo-25401@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25401}: Optimize bytes.fromhex() and bytearray.fromhex(): they are now
between 2x and 3.5x faster.

@item 
bpo-25399@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25399}: Optimize bytearray % args using the new private _PyBytesWriter
API. Formatting is now between 2.5 and 5 times faster.

@item 
bpo-25274@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25274}: sys.setrecursionlimit() now raises a RecursionError if the new
recursion limit is too low depending at the current recursion depth.
Modify also the “lower-water mark” formula to make it monotonic. This mark
is used to decide when the overflowed flag of the thread state is reset.

@item 
bpo-24402@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24402}: Fix input() to prompt to the redirected stdout when
sys.stdout.fileno() fails.

@item 
bpo-25349@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25349}: Optimize bytes % args using the new private _PyBytesWriter API.
Formatting is now up to 2 times faster.

@item 
bpo-24806@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24806}: Prevent builtin types that are not allowed to be subclassed
from being subclassed through multiple inheritance.

@item 
bpo-25301@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25301}: The UTF-8 decoder is now up to 15 times as fast for error
handlers: @code{ignore}, @code{replace} and @code{surrogateescape}.

@item 
bpo-24848@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24848}: Fixed a number of bugs in UTF-7 decoding of misformed data.

@item 
bpo-25267@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25267}: The UTF-8 encoder is now up to 75 times as fast for error
handlers: @code{ignore}, @code{replace}, @code{surrogateescape}, @code{surrogatepass}.
Patch co-written with Serhiy Storchaka.

@item 
bpo-25280@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25280}: Import trace messages emitted in verbose (-v) mode are no
longer formatted twice.

@item 
bpo-25227@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25227}: Optimize ASCII and latin1 encoders with the @code{surrogateescape}
error handler: the encoders are now up to 3 times as fast. Initial patch
written by Serhiy Storchaka.

@item 
bpo-25003@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25003}: On Solaris 11.3 or newer, os.urandom() now uses the getrandom()
function instead of the getentropy() function. The getentropy() function
is blocking to generate very good quality entropy, os.urandom() doesn’t
need such high-quality entropy.

@item 
bpo-9232@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9232}: Modify Python’s grammar to allow trailing commas in the argument
list of a function declaration.  For example, “def f(*, a = 3,): pass” is
now legal. Patch from Mark Dickinson.

@item 
bpo-24965@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24965}: Implement 
@geindex Python Enhancement Proposals; PEP 498
PEP 498@footnote{https://peps.python.org/pep-0498/} “Literal String Interpolation”. This
allows you to embed expressions inside f-strings, which are converted to
normal strings at run time. Given x=3, then f’value=@{x@}’ == ‘value=3’.
Patch by Eric V. Smith.

@item 
bpo-26478@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26478}: Fix semantic bugs when using binary operators with dictionary
views and tuples.

@item 
bpo-26171@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26171}: Fix possible integer overflow and heap corruption in
zipimporter.get_data().

@item 
bpo-25660@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25660}: Fix TAB key behaviour in REPL with readline.

@item 
bpo-26288@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26288}: Optimize PyLong_AsDouble.

@item 
bpo-26289@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26289}: Optimize floor and modulo division for single-digit longs.
Microbenchmarks show 2-2.5x improvement.  Built-in ‘divmod’ function is
now also ~10% faster. (See also: bpo-26315@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26315})

@item 
bpo-25887@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25887}: Raise a RuntimeError when a coroutine object is awaited more
than once.
@end itemize

@node Library<193>,IDLE<57>,Core and Builtins<190>,Python 3 6 0 alpha 1
@anchor{whatsnew/changelog id1001}@anchor{1f7a}
@subsubsection Library



@itemize -

@item 
bpo-27057@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27057}: Fix os.set_inheritable() on Android, ioctl() is blocked by
SELinux and fails with EACCESS. The function now falls back to fcntl().
Patch written by Michał Bednarski.

@item 
bpo-27014@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27014}: Fix infinite recursion using typing.py.  Thanks to Kalle Tuure!

@item 
bpo-27031@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27031}: Removed dummy methods in Tkinter widget classes: tk_menuBar()
and tk_bindForTraversal().

@item 
bpo-14132@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14132}: Fix urllib.request redirect handling when the target only has a
query string.  Original fix by Ján Janech.

@item 
bpo-17214@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17214}: The “urllib.request” module now percent-encodes non-ASCII bytes
found in redirect target URLs.  Some servers send Location header fields
with non-ASCII bytes, but “http.client” requires the request target to be
ASCII-encodable, otherwise a UnicodeEncodeError is raised.  Based on patch
by Christian Heimes.

@item 
bpo-27033@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27033}: The default value of the decode_data parameter for
smtpd.SMTPChannel and smtpd.SMTPServer constructors is changed to False.

@item 
bpo-27034@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27034}: Removed deprecated class asynchat.fifo.

@item 
bpo-26870@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26870}: Added readline.set_auto_history(), which can stop entries being
automatically added to the history list.  Based on patch by Tyler
Crompton.

@item 
bpo-26039@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26039}: zipfile.ZipFile.open() can now be used to write data into a ZIP
file, as well as for extracting data.  Patch by Thomas Kluyver.

@item 
bpo-26892@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26892}: Honor debuglevel flag in urllib.request.HTTPHandler. Patch
contributed by Chi Hsuan Yen.

@item 
bpo-22274@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22274}: In the subprocess module, allow stderr to be redirected to
stdout even when stdout is not redirected.  Patch by Akira Li.

@item 
bpo-26807@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26807}: mock_open ‘files’ no longer error on readline at end of file.
Patch from Yolanda Robla.

@item 
bpo-25745@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25745}: Fixed leaking a userptr in curses panel destructor.

@item 
bpo-26977@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26977}: Removed unnecessary, and ignored, call to sum of squares helper
in statistics.pvariance.

@item 
bpo-26002@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26002}: Use bisect in statistics.median instead of a linear search.
Patch by Upendra Kuma.

@item 
bpo-25974@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25974}: Make use of new Decimal.as_integer_ratio() method in statistics
module. Patch by Stefan Krah.

@item 
bpo-26996@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26996}: Add secrets module as described in 
@geindex Python Enhancement Proposals; PEP 506
PEP 506@footnote{https://peps.python.org/pep-0506/}.

@item 
bpo-26881@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26881}: The modulefinder module now supports extended opcode arguments.

@item 
bpo-23815@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23815}: Fixed crashes related to directly created instances of types in
_tkinter and curses.panel modules.

@item 
bpo-17765@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17765}: weakref.ref() no longer silently ignores keyword arguments.
Patch by Georg Brandl.

@item 
bpo-26873@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26873}: xmlrpc now raises ResponseError on unsupported type tags
instead of silently return incorrect result.

@item 
bpo-26915@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26915}: The __contains__ methods in the collections ABCs now check for
identity before checking equality.  This better matches the behavior of
the concrete classes, allows sensible handling of NaNs, and makes it
easier to reason about container invariants.

@item 
bpo-26711@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26711}: Fixed the comparison of plistlib.Data with other types.

@item 
bpo-24114@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24114}: Fix an uninitialized variable in @code{ctypes.util}. The bug only
occurs on SunOS when the ctypes implementation searches for the @code{crle}
program. Patch by Xiang Zhang.  Tested on SunOS by Kees Bos.

@item 
bpo-26864@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26864}: In urllib.request, change the proxy bypass host checking
against no_proxy to be case-insensitive, and to not match unrelated host
names that happen to have a bypassed hostname as a suffix.  Patch by Xiang
Zhang.

@item 
bpo-24902@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24902}: Print server URL on http.server startup.  Initial patch by
Felix Kaiser.

@item 
bpo-25788@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25788}: fileinput.hook_encoded() now supports an “errors” argument for
passing to open.  Original patch by Joseph Hackman.

@item 
bpo-26634@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26634}: recursive_repr() now sets __qualname__ of wrapper.  Patch by
Xiang Zhang.

@item 
bpo-26804@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26804}: urllib.request will prefer lower_case proxy environment
variables over UPPER_CASE or Mixed_Case ones. Patch contributed by
Hans-Peter Jansen.

@item 
bpo-26837@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26837}: assertSequenceEqual() now correctly outputs non-stringified
differing items (like bytes in the -b mode).  This affects
assertListEqual() and assertTupleEqual().

@item 
bpo-26041@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26041}: Remove “will be removed in Python 3.7” from deprecation
messages of platform.dist() and platform.linux_distribution(). Patch by
Kumaripaba Miyurusara Athukorala.

@item 
bpo-26822@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26822}: itemgetter, attrgetter and methodcaller objects no longer
silently ignore keyword arguments.

@item 
bpo-26733@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26733}: Disassembling a class now disassembles class and static
methods. Patch by Xiang Zhang.

@item 
bpo-26801@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26801}: Fix error handling in @ref{130f,,shutil.get_terminal_size()}, catch
@ref{5f0,,AttributeError} instead of @ref{450,,NameError}. Patch written by
Emanuel Barry.

@item 
bpo-24838@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24838}: tarfile’s ustar and gnu formats now correctly calculate name
and link field limits for multibyte character encodings like utf-8.

@item 
bpo-26717@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26717}: Stop encoding Latin-1-ized WSGI paths with UTF-8.  Patch by
Anthony Sottile.

@item 
bpo-26782@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26782}: Add STARTUPINFO to subprocess.__all__ on Windows.

@item 
bpo-26404@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26404}: Add context manager to socketserver.  Patch by Aviv Palivoda.

@item 
bpo-26735@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26735}: Fix @ref{747,,os.urandom()} on Solaris 11.3 and newer when reading
more than 1,024 bytes: call @code{getrandom()} multiple times with a limit of
1024 bytes per call.

@item 
bpo-26585@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26585}: Eliminate http.server._quote_html() and use
html.escape(quote=False).  Patch by Xiang Zhang.

@item 
bpo-26685@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26685}: Raise OSError if closing a socket fails.

@item 
bpo-16329@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16329}: Add .webm to mimetypes.types_map.  Patch by Giampaolo Rodola’.

@item 
bpo-13952@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13952}: Add .csv to mimetypes.types_map.  Patch by Geoff Wilson.

@item 
bpo-26587@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26587}: the site module now allows .pth files to specify files to be
added to sys.path (e.g. zip files).

@item 
bpo-25609@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25609}: Introduce contextlib.AbstractContextManager and
typing.ContextManager.

@item 
bpo-26709@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26709}: Fixed Y2038 problem in loading binary PLists.

@item 
bpo-23735@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23735}: Handle terminal resizing with Readline 6.3+ by installing our
own SIGWINCH handler.  Patch by Eric Price.

@item 
bpo-25951@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25951}: Change SSLSocket.sendall() to return None, as explicitly
documented for plain socket objects.  Patch by Aviv Palivoda.

@item 
bpo-26586@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26586}: In http.server, respond with “413 Request header fields too
large” if there are too many header fields to parse, rather than killing
the connection and raising an unhandled exception.  Patch by Xiang Zhang.

@item 
bpo-26676@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26676}: Added missing XMLPullParser to ElementTree.__all__.

@item 
bpo-22854@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22854}: Change BufferedReader.writable() and BufferedWriter.readable()
to always return False.

@item 
bpo-26492@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26492}: Exhausted iterator of array.array now conforms with the
behavior of iterators of other mutable sequences: it lefts exhausted even
if iterated array is extended.

@item 
bpo-26641@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26641}: doctest.DocFileTest and doctest.testfile() now support packages
(module split into multiple directories) for the package parameter.

@item 
bpo-25195@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25195}: Fix a regression in mock.MagicMock. _Call is a subclass of
tuple (changeset 3603bae63c13 only works for classes) so we need to
implement __ne__ ourselves.  Patch by Andrew Plummer.

@item 
bpo-26644@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26644}: Raise ValueError rather than SystemError when a negative length
is passed to SSLSocket.recv() or read().

@item 
bpo-23804@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23804}: Fix SSL recv(0) and read(0) methods to return zero bytes
instead of up to 1024.

@item 
bpo-26616@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26616}: Fixed a bug in datetime.astimezone() method.

@item 
bpo-26637@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26637}: The @ref{7b,,importlib} module now emits an @ref{65b,,ImportError}
rather than a @ref{199,,TypeError} if @ref{ad7,,__import__()} is tried during the
Python shutdown process but @ref{3e2,,sys.path} is already cleared (set to
@code{None}).

@item 
bpo-21925@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21925}: @ref{1e3b,,warnings.formatwarning()} now catches exceptions when
calling @ref{242,,linecache.getline()} and
@ref{1f7b,,tracemalloc.get_object_traceback()} to be able to log
@ref{54d,,ResourceWarning} emitted late during the Python shutdown process.

@item 
bpo-23848@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23848}: On Windows, faulthandler.enable() now also installs an
exception handler to dump the traceback of all Python threads on any
Windows exception, not only on UNIX signals (SIGSEGV, SIGFPE, SIGABRT).

@item 
bpo-26530@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26530}: Add C functions @code{_PyTraceMalloc_Track()} and
@code{_PyTraceMalloc_Untrack()} to track memory blocks using the
@ref{106,,tracemalloc} module. Add @code{_PyTraceMalloc_GetTraceback()} to
get the traceback of an object.

@item 
bpo-26588@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26588}: The _tracemalloc now supports tracing memory allocations of
multiple address spaces (domains).

@item 
bpo-24266@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24266}: Ctrl+C during Readline history search now cancels the search
mode when compiled with Readline 7.

@item 
bpo-26590@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26590}: Implement a safe finalizer for the _socket.socket type. It now
releases the GIL to close the socket.

@item 
bpo-18787@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18787}: spwd.getspnam() now raises a PermissionError if the user
doesn’t have privileges.

@item 
bpo-26560@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26560}: Avoid potential ValueError in BaseHandler.start_response.
Initial patch by Peter Inglesby.

@item 
bpo-26567@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26567}: Add a new function @ref{f19,,PyErr_ResourceWarning()} function to
pass the destroyed object. Add a `source' attribute to
@code{warnings.WarningMessage}. Add warnings._showwarnmsg() which uses
tracemalloc to get the traceback where source object was allocated.

@item 
bpo-26569@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26569}: Fix @ref{a32,,pyclbr.readmodule()} and @ref{a33,,pyclbr.readmodule_ex()}
to support importing packages.

@item 
bpo-26499@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26499}: Account for remaining Content-Length in HTTPResponse.readline()
and read1(). Based on patch by Silent Ghost. Also document that
HTTPResponse now supports these methods.

@item 
bpo-25320@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25320}: Handle sockets in directories unittest discovery is scanning.
Patch from Victor van den Elzen.

@item 
bpo-16181@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16181}: cookiejar.http2time() now returns None if year is higher than
datetime.MAXYEAR.

@item 
bpo-26513@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26513}: Fixes platform module detection of Windows Server

@item 
bpo-23718@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23718}: Fixed parsing time in week 0 before Jan 1.  Original patch by
Tamás Bence Gedai.

@item 
bpo-26323@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26323}: Add Mock.assert_called() and Mock.assert_called_once() methods
to unittest.mock. Patch written by Amit Saha.

@item 
bpo-20589@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20589}: Invoking Path.owner() and Path.group() on Windows now raise
NotImplementedError instead of ImportError.

@item 
bpo-26177@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26177}: Fixed the keys() method for Canvas and Scrollbar widgets.

@item 
bpo-15068@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15068}: Got rid of excessive buffering in fileinput. The bufsize
parameter is now deprecated and ignored.

@item 
bpo-19475@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19475}: Added an optional argument timespec to the datetime isoformat()
method to choose the precision of the time component.

@item 
bpo-2202@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2202}: Fix UnboundLocalError in
AbstractDigestAuthHandler.get_algorithm_impls. Initial patch by Mathieu
Dupuy.

@item 
bpo-26167@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26167}: Minimized overhead in copy.copy() and copy.deepcopy().
Optimized copying and deepcopying bytearrays, NotImplemented, slices,
short lists, tuples, dicts, sets.

@item 
bpo-25718@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25718}: Fixed pickling and copying the accumulate() iterator with total
is None.

@item 
bpo-26475@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26475}: Fixed debugging output for regular expressions with the (?x)
flag.

@item 
bpo-26482@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26482}: Allowed pickling recursive dequeues.

@item 
bpo-26335@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26335}: Make mmap.write() return the number of bytes written like other
write methods.  Patch by Jakub Stasiak.

@item 
bpo-26457@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26457}: Fixed the subnets() methods in IP network classes for the case
when resulting prefix length is equal to maximal prefix length. Based on
patch by Xiang Zhang.

@item 
bpo-26385@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26385}: Remove the file if the internal open() call in
NamedTemporaryFile() fails. Patch by Silent Ghost.

@item 
bpo-26402@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26402}: Fix XML-RPC client to retry when the server shuts down a
persistent connection.  This was a regression related to the new
http.client.RemoteDisconnected exception in 3.5.0a4.

@item 
bpo-25913@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25913}: Leading @code{<~} is optional now in base64.a85decode() with
adobe=True.  Patch by Swati Jaiswal.

@item 
bpo-26186@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26186}: Remove an invalid type check in importlib.util.LazyLoader.

@item 
bpo-26367@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26367}: importlib.__import__() raises ImportError like
builtins.__import__() when @code{level} is specified but without an
accompanying package specified.

@item 
bpo-26309@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26309}: In the “socketserver” module, shut down the request (closing
the connected socket) when verify_request() returns false.  Patch by Aviv
Palivoda.

@item 
bpo-23430@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23430}: Change the socketserver module to only catch exceptions raised
from a request handler that are derived from Exception (instead of
BaseException). Therefore SystemExit and KeyboardInterrupt no longer
trigger the handle_error() method, and will now to stop a single-threaded
server.

@item 
bpo-25995@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25995}: os.walk() no longer uses FDs proportional to the tree depth.

@item 
bpo-25994@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25994}: Added the close() method and the support of the context manager
protocol for the os.scandir() iterator.

@item 
bpo-23992@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23992}: multiprocessing: make MapResult not fail-fast upon exception.

@item 
bpo-26243@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26243}: Support keyword arguments to zlib.compress().  Patch by Aviv
Palivoda.

@item 
bpo-26117@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26117}: The os.scandir() iterator now closes file descriptor not only
when the iteration is finished, but when it was failed with error.

@item 
bpo-25949@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25949}: __dict__ for an OrderedDict instance is now created only when
needed.

@item 
bpo-25911@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25911}: Restored support of bytes paths in os.walk() on Windows.

@item 
bpo-26045@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26045}: Add UTF-8 suggestion to error message when posting a
non-Latin-1 string with http.client.

@item 
bpo-26039@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26039}: Added zipfile.ZipInfo.from_file() and zipinfo.ZipInfo.is_dir().
Patch by Thomas Kluyver.

@item 
bpo-12923@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12923}: Reset FancyURLopener’s redirect counter even if there is an
exception. Based on patches by Brian Brazil and Daniel Rocco.

@item 
bpo-25945@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25945}: Fixed a crash when unpickle the functools.partial object with
wrong state. Fixed a leak in failed functools.partial constructor. “args”
and “keywords” attributes of functools.partial have now always types tuple
and dict correspondingly.

@item 
bpo-26202@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26202}: copy.deepcopy() now correctly copies range() objects with
non-atomic attributes.

@item 
bpo-23076@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23076}: Path.glob() now raises a ValueError if it’s called with an
invalid pattern. Patch by Thomas Nyberg.

@item 
bpo-19883@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19883}: Fixed possible integer overflows in zipimport.

@item 
bpo-26227@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26227}: On Windows, getnameinfo(), gethostbyaddr() and
gethostbyname_ex() functions of the socket module now decode the hostname
from the ANSI code page rather than UTF-8.

@item 
bpo-26099@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26099}: The site module now writes an error into stderr if
sitecustomize module can be imported but executing the module raise an
ImportError. Same change for usercustomize.

@item 
bpo-26147@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26147}: xmlrpc now works with strings not encodable with used non-UTF-8
encoding.

@item 
bpo-25935@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25935}: Garbage collector now breaks reference loops with OrderedDict.

@item 
bpo-16620@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16620}: Fixed AttributeError in msilib.Directory.glob().

@item 
bpo-26013@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26013}: Added compatibility with broken protocol 2 pickles created in
old Python 3 versions (3.4.3 and lower).

@item 
bpo-26129@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26129}: Deprecated accepting non-integers in grp.getgrgid().

@item 
bpo-25850@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25850}: Use cross-compilation by default for 64-bit Windows.

@item 
bpo-25822@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25822}: Add docstrings to the fields of urllib.parse results. Patch
contributed by Swati Jaiswal.

@item 
bpo-22642@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22642}: Convert trace module option parsing mechanism to argparse.
Patch contributed by SilentGhost.

@item 
bpo-24705@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24705}: Fix sysconfig._parse_makefile not expanding $@{@} vars appearing
before $() vars.

@item 
bpo-26069@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26069}: Remove the deprecated apis in the trace module.

@item 
bpo-22138@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22138}: Fix mock.patch behavior when patching descriptors. Restore
original values after patching. Patch contributed by Sean McCully.

@item 
bpo-25672@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25672}: In the ssl module, enable the SSL_MODE_RELEASE_BUFFERS mode
option if it is safe to do so.

@item 
bpo-26012@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26012}: Don’t traverse into symlinks for @code{**} pattern in
pathlib.Path.[r]glob().

@item 
bpo-24120@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24120}: Ignore PermissionError when traversing a tree with
pathlib.Path.[r]glob(). Patch by Ulrich Petri.

@item 
bpo-21815@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21815}: Accept ] characters in the data portion of imap responses, in
order to handle the flags with square brackets accepted and produced by
servers such as gmail.

@item 
bpo-25447@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25447}: fileinput now uses sys.stdin as-is if it does not have a buffer
attribute (restores backward compatibility).

@item 
bpo-25971@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25971}: Optimized creating Fractions from floats by 2 times and from
Decimals by 3 times.

@item 
bpo-25802@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25802}: Document as deprecated the remaining implementations of
importlib.abc.Loader.load_module().

@item 
bpo-25928@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25928}: Add Decimal.as_integer_ratio().

@item 
bpo-25447@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25447}: Copying the lru_cache() wrapper object now always works,
independently from the type of the wrapped object (by returning the
original object unchanged).

@item 
bpo-25768@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25768}: Have the functions in compileall return booleans instead of
ints and add proper documentation and tests for the return values.

@item 
bpo-24103@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24103}: Fixed possible use after free in ElementTree.XMLPullParser.

@item 
bpo-25860@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25860}: os.fwalk() no longer skips remaining directories when error
occurs. Original patch by Samson Lee.

@item 
bpo-25914@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25914}: Fixed and simplified OrderedDict.__sizeof__.

@item 
bpo-25869@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25869}: Optimized deepcopying ElementTree; it is now 20 times faster.

@item 
bpo-25873@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25873}: Optimized iterating ElementTree.  Iterating elements
Element.iter() is now 40% faster, iterating text Element.itertext() is now
up to 2.5 times faster.

@item 
bpo-25902@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25902}: Fixed various refcount issues in ElementTree iteration.

@item 
bpo-22227@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22227}: The TarFile iterator is reimplemented using generator. This
implementation is simpler that using class.

@item 
bpo-25638@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25638}: Optimized ElementTree.iterparse(); it is now 2x faster.
Optimized ElementTree parsing; it is now 10% faster.

@item 
bpo-25761@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25761}: Improved detecting errors in broken pickle data.

@item 
bpo-25717@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25717}: Restore the previous behaviour of tolerating most fstat()
errors when opening files.  This was a regression in 3.5a1, and stopped
anonymous temporary files from working in special cases.

@item 
bpo-24903@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24903}: Fix regression in number of arguments compileall accepts when
‘-d’ is specified.  The check on the number of arguments has been dropped
completely as it never worked correctly anyway.

@item 
bpo-25764@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25764}: In the subprocess module, preserve any exception caused by
fork() failure when preexec_fn is used.

@item 
bpo-25771@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25771}: Tweak the exception message for importlib.util.resolve_name()
when ‘package’ isn’t specified but necessary.

@item 
bpo-6478@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6478}: _strptime’s regexp cache now is reset after changing timezone
with time.tzset().

@item 
bpo-14285@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14285}: When executing a package with the “python -m package” option,
and package initialization fails, a proper traceback is now reported.  The
“runpy” module now lets exceptions from package initialization pass back
to the caller, rather than raising ImportError.

@item 
bpo-19771@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19771}: Also in runpy and the “-m” option, omit the irrelevant message
“… is a package and cannot be directly executed” if the package could
not even be initialized (e.g. due to a bad @code{*.pyc} file).

@item 
bpo-25177@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25177}: Fixed problem with the mean of very small and very large
numbers. As a side effect, statistics.mean and statistics.variance should
be significantly faster.

@item 
bpo-25718@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25718}: Fixed copying object with state with boolean value is false.

@item 
bpo-10131@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10131}: Fixed deep copying of minidom documents.  Based on patch by
Marian Ganisin.

@item 
bpo-7990@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7990}: dir() on ElementTree.Element now lists properties: “tag”,
“text”, “tail” and “attrib”.  Original patch by Santoso Wijaya.

@item 
bpo-25725@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25725}: Fixed a reference leak in pickle.loads() when unpickling
invalid data including tuple instructions.

@item 
bpo-25663@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25663}: In the Readline completer, avoid listing duplicate global
names, and search the global namespace before searching builtins.

@item 
bpo-25688@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25688}: Fixed file leak in ElementTree.iterparse() raising an error.

@item 
bpo-23914@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23914}: Fixed SystemError raised by unpickler on broken pickle data.

@item 
bpo-25691@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25691}: Fixed crash on deleting ElementTree.Element attributes.

@item 
bpo-25624@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25624}: ZipFile now always writes a ZIP_STORED header for directory
entries.  Patch by Dingyuan Wang.

@item 
bpo-25626@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25626}: Change three zlib functions to accept sizes that fit in
Py_ssize_t, but internally cap those sizes to UINT_MAX.  This resolves a
regression in 3.5 where GzipFile.read() failed to read chunks larger than
2 or 4 GiB.  The change affects the zlib.Decompress.decompress()
max_length parameter, the zlib.decompress() bufsize parameter, and the
zlib.Decompress.flush() length parameter.

@item 
bpo-25583@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25583}: Avoid incorrect errors raised by os.makedirs(exist_ok=True)
when the OS gives priority to errors such as EACCES over EEXIST.

@item 
bpo-25593@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25593}: Change semantics of EventLoop.stop() in asyncio.

@item 
bpo-6973@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6973}: When we know a subprocess.Popen process has died, do not allow
the send_signal(), terminate(), or kill() methods to do anything as they
could potentially signal a different process.

@item 
bpo-23883@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23883}: Added missing APIs to __all__ to match the documented APIs for
the following modules: calendar, csv, enum, fileinput, ftplib, logging,
optparse, tarfile, threading and wave.  Also added a
test.support.check__all__() helper. Patches by Jacek Kołodziej, Mauro S.
M. Rodrigues and Joel Taddei.

@item 
bpo-25590@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25590}: In the Readline completer, only call getattr() once per
attribute.  Also complete names of attributes such as properties and slots
which are listed by dir() but not yet created on an instance.

@item 
bpo-25498@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25498}: Fix a crash when garbage-collecting ctypes objects created by
wrapping a memoryview.  This was a regression made in 3.5a1.  Based on
patch by Eryksun.

@item 
bpo-25584@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25584}: Added “escape” to the __all__ list in the glob module.

@item 
bpo-25584@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25584}: Fixed recursive glob() with patterns starting with @code{**}.

@item 
bpo-25446@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25446}: Fix regression in smtplib’s AUTH LOGIN support.

@item 
bpo-18010@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18010}: Fix the pydoc web server’s module search function to handle
exceptions from importing packages.

@item 
bpo-25554@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25554}: Got rid of circular references in regular expression parsing.

@item 
bpo-18973@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18973}: Command-line interface of the calendar module now uses argparse
instead of optparse.

@item 
bpo-25510@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25510}: fileinput.FileInput.readline() now returns b’’ instead of ‘’ at
the end if the FileInput was opened with binary mode. Patch by Ryosuke
Ito.

@item 
bpo-25503@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25503}: Fixed inspect.getdoc() for inherited docstrings of properties.
Original patch by John Mark Vandenberg.

@item 
bpo-25515@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25515}: Always use os.urandom as a source of randomness in uuid.uuid4.

@item 
bpo-21827@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21827}: Fixed textwrap.dedent() for the case when largest common
whitespace is a substring of smallest leading whitespace. Based on patch
by Robert Li.

@item 
bpo-25447@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25447}: The lru_cache() wrapper objects now can be copied and pickled
(by returning the original object unchanged).

@item 
bpo-25390@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25390}: typing: Don’t crash on Union[str, Pattern].

@item 
bpo-25441@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25441}: asyncio: Raise error from drain() when socket is closed.

@item 
bpo-25410@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25410}: Cleaned up and fixed minor bugs in C implementation of
OrderedDict.

@item 
bpo-25411@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25411}: Improved Unicode support in SMTPHandler through better use of
the email package. Thanks to user simon04 for the patch.

@item 
Move the imp module from a PendingDeprecationWarning to
DeprecationWarning.

@item 
bpo-25407@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25407}: Remove mentions of the formatter module being removed in Python
3.6.

@item 
bpo-25406@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25406}: Fixed a bug in C implementation of OrderedDict.move_to_end()
that caused segmentation fault or hang in iterating after moving several
items to the start of ordered dict.

@item 
bpo-25382@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25382}: pickletools.dis() now outputs implicit memo index for the
MEMOIZE opcode.

@item 
bpo-25357@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25357}: Add an optional newline parameter to binascii.b2a_base64().
base64.b64encode() uses it to avoid a memory copy.

@item 
bpo-24164@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24164}: Objects that need calling @code{__new__} with keyword arguments,
can now be pickled using pickle protocols older than protocol version 4.

@item 
bpo-25364@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25364}: zipfile now works in threads disabled builds.

@item 
bpo-25328@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25328}: smtpd’s SMTPChannel now correctly raises a ValueError if both
decode_data and enable_SMTPUTF8 are set to true.

@item 
bpo-16099@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16099}: RobotFileParser now supports Crawl-delay and Request-rate
extensions.  Patch by Nikolay Bogoychev.

@item 
bpo-25316@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25316}: distutils raises OSError instead of DistutilsPlatformError when
MSVC is not installed.

@item 
bpo-25380@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25380}: Fixed protocol for the STACK_GLOBAL opcode in
pickletools.opcodes.

@item 
bpo-23972@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23972}: Updates asyncio datagram create method allowing reuseport and
reuseaddr socket options to be set prior to binding the socket. Mirroring
the existing asyncio create_server method the reuseaddr option for
datagram sockets defaults to True if the O/S is ‘posix’ (except if the
platform is Cygwin). Patch by Chris Laws.

@item 
bpo-25304@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25304}: Add asyncio.run_coroutine_threadsafe().  This lets you submit a
coroutine to a loop from another thread, returning a
concurrent.futures.Future.  By Vincent Michel.

@item 
bpo-25232@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25232}: Fix CGIRequestHandler to split the query from the URL at the
first question mark (?) rather than the last. Patch from Xiang Zhang.

@item 
bpo-24657@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24657}: Prevent CGIRequestHandler from collapsing slashes in the query
part of the URL as if it were a path. Patch from Xiang Zhang.

@item 
bpo-25287@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25287}: Don’t add crypt.METHOD_CRYPT to crypt.methods if it’s not
supported. Check if it is supported, it may not be supported on OpenBSD
for example.

@item 
bpo-23600@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23600}: Default implementation of tzinfo.fromutc() was returning wrong
results in some cases.

@item 
bpo-25203@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25203}: Failed readline.set_completer_delims() no longer left the
module in inconsistent state.

@item 
bpo-25011@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25011}: rlcompleter now omits private and special attribute names
unless the prefix starts with underscores.

@item 
bpo-25209@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25209}: rlcompleter now can add a space or a colon after completed
keyword.

@item 
bpo-22241@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22241}: timezone.utc name is now plain ‘UTC’, not ‘UTC-00:00’.

@item 
bpo-23517@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23517}: fromtimestamp() and utcfromtimestamp() methods of
datetime.datetime now round microseconds to nearest with ties going to
nearest even integer (ROUND_HALF_EVEN), as round(float), instead of
rounding towards -Infinity (ROUND_FLOOR).

@item 
bpo-23552@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23552}: Timeit now warns when there is substantial (4x) variance
between best and worst times. Patch from Serhiy Storchaka.

@item 
bpo-24633@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24633}: site-packages/README -> README.txt.

@item 
bpo-24879@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24879}: help() and pydoc can now list named tuple fields in the order
they were defined rather than alphabetically.  The ordering is determined
by the _fields attribute if present.

@item 
bpo-24874@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24874}: Improve speed of itertools.cycle() and make its pickle more
compact.

@item 
Fix crash in itertools.cycle.__setstate__() when the first argument wasn’t
a list.

@item 
bpo-20059@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20059}: urllib.parse raises ValueError on all invalid ports. Patch by
Martin Panter.

@item 
bpo-24360@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24360}: Improve __repr__ of argparse.Namespace() for invalid
identifiers.  Patch by Matthias Bussonnier.

@item 
bpo-23426@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23426}: run_setup was broken in distutils. Patch from Alexander
Belopolsky.

@item 
bpo-13938@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13938}: 2to3 converts StringTypes to a tuple. Patch from Mark Hammond.

@item 
bpo-2091@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2091}: open() accepted a ‘U’ mode string containing ‘+’, but ‘U’ can
only be used with ‘r’. Patch from Jeff Balogh and John O’Connor.

@item 
bpo-8585@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8585}: improved tests for zipimporter2. Patch from Mark Lawrence.

@item 
bpo-18622@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18622}: unittest.mock.mock_open().reset_mock would recurse infinitely.
Patch from Nicola Palumbo and Laurent De Buyst.

@item 
bpo-24426@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24426}: Fast searching optimization in regular expressions now works
for patterns that starts with capturing groups.  Fast searching
optimization now can’t be disabled at compile time.

@item 
bpo-23661@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23661}: unittest.mock side_effects can now be exceptions again. This
was a regression vs Python 3.4. Patch from Ignacio Rossi

@item 
bpo-13248@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13248}: Remove deprecated inspect.getmoduleinfo function.

@item 
bpo-25578@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25578}: Fix (another) memory leak in SSLSocket.getpeercer().

@item 
bpo-25530@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25530}: Disable the vulnerable SSLv3 protocol by default when creating
ssl.SSLContext.

@item 
bpo-25569@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25569}: Fix memory leak in SSLSocket.getpeercert().

@item 
bpo-25471@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25471}: Sockets returned from accept() shouldn’t appear to be
nonblocking.

@item 
bpo-25319@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25319}: When threading.Event is reinitialized, the underlying condition
should use a regular lock rather than a recursive lock.

@item 
Skip getaddrinfo if host is already resolved. Patch by A. Jesse Jiryu
Davis.

@item 
bpo-26050@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26050}: Add asyncio.StreamReader.readuntil() method. Patch by Марк
Коренберг.

@item 
bpo-25924@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25924}: Avoid unnecessary serialization of getaddrinfo(3) calls on OS X
versions 10.5 or higher.  Original patch by A. Jesse Jiryu Davis.

@item 
bpo-26406@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26406}: Avoid unnecessary serialization of getaddrinfo(3) calls on
current versions of OpenBSD and NetBSD.  Patch by A. Jesse Jiryu Davis.

@item 
bpo-26848@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26848}: Fix asyncio/subprocess.communicate() to handle empty input.
Patch by Jack O’Connor.

@item 
bpo-27040@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27040}: Add loop.get_exception_handler method

@item 
bpo-27041@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27041}: asyncio: Add loop.create_future method
@end itemize

@node IDLE<57>,Documentation<80>,Library<193>,Python 3 6 0 alpha 1
@anchor{whatsnew/changelog id1002}@anchor{1f7c}
@subsubsection IDLE



@itemize -

@item 
bpo-20640@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20640}: Add tests for idlelib.configHelpSourceEdit. Patch by Saimadhav
Heblikar.

@item 
In the ‘IDLE-console differences’ section of the IDLE doc, clarify how
running with IDLE affects sys.modules and the standard streams.

@item 
bpo-25507@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25507}: fix incorrect change in IOBinding that prevented printing.
Augment IOBinding htest to include all major IOBinding functions.

@item 
bpo-25905@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25905}: Revert unwanted conversion of ‘ to ’ RIGHT SINGLE QUOTATION
MARK in README.txt and open this and NEWS.txt with ‘ascii’. Re-encode
CREDITS.txt to utf-8 and open it with ‘utf-8’.

@item 
bpo-15348@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15348}: Stop the debugger engine (normally in a user process) before
closing the debugger window (running in the IDLE process). This prevents
the RuntimeErrors that were being caught and ignored.

@item 
bpo-24455@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24455}: Prevent IDLE from hanging when a) closing the shell while the
debugger is active (15347); b) closing the debugger with the [X] button
(15348); and c) activating the debugger when already active (24455). The
patch by Mark Roseman does this by making two changes. 1. Suspend and
resume the gui.interaction method with the tcl vwait mechanism intended
for this purpose (instead of root.mainloop & .quit). 2. In gui.run, allow
any existing interaction to terminate first.

@item 
Change ‘The program’ to ‘Your program’ in an IDLE ‘kill program?’ message
to make it clearer that the program referred to is the currently running
user program, not IDLE itself.

@item 
bpo-24750@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24750}: Improve the appearance of the IDLE editor window status bar.
Patch by Mark Roseman.

@item 
bpo-25313@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25313}: Change the handling of new built-in text color themes to better
address the compatibility problem introduced by the addition of IDLE Dark.
Consistently use the revised idleConf.CurrentTheme everywhere in idlelib.

@item 
bpo-24782@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24782}: Extension configuration is now a tab in the IDLE Preferences
dialog rather than a separate dialog.  The former tabs are now a sorted
list.  Patch by Mark Roseman.

@item 
bpo-22726@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22726}: Re-activate the config dialog help button with some content
about the other buttons and the new IDLE Dark theme.

@item 
bpo-24820@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24820}: IDLE now has an ‘IDLE Dark’ built-in text color theme. It is
more or less IDLE Classic inverted, with a cobalt blue background.
Strings, comments, keywords, … are still green, red, orange, … . To
use it with IDLEs released before November 2015, hit the ‘Save as New
Custom Theme’ button and enter a new name, such as ‘Custom Dark’.  The
custom theme will work with any IDLE release, and can be modified.

@item 
bpo-25224@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25224}: README.txt is now an idlelib index for IDLE developers and
curious users. The previous user content is now in the IDLE doc chapter.
‘IDLE’ now means ‘Integrated Development and Learning Environment’.

@item 
bpo-24820@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24820}: Users can now set breakpoint colors in Settings -> Custom
Highlighting. Original patch by Mark Roseman.

@item 
bpo-24972@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24972}: Inactive selection background now matches active selection
background, as configured by users, on all systems.  Found items are now
always highlighted on Windows.  Initial patch by Mark Roseman.

@item 
bpo-24570@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24570}: Idle: make calltip and completion boxes appear on Macs affected
by a tk regression.  Initial patch by Mark Roseman.

@item 
bpo-24988@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24988}: Idle ScrolledList context menus (used in debugger) now work on
Mac Aqua. Patch by Mark Roseman.

@item 
bpo-24801@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24801}: Make right-click for context menu work on Mac Aqua. Patch by
Mark Roseman.

@item 
bpo-25173@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25173}: Associate tkinter messageboxes with a specific widget. For Mac
OSX, make them a ‘sheet’.  Patch by Mark Roseman.

@item 
bpo-25198@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25198}: Enhance the initial html viewer now used for Idle Help.
Properly indent fixed-pitch text (patch by Mark Roseman). Give code
snippet a very Sphinx-like light blueish-gray background. Re-use initial
width and height set by users for shell and editor. When the Table of
Contents (TOC) menu is used, put the section header at the top of the
screen.

@item 
bpo-25225@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25225}: Condense and rewrite Idle doc section on text colors.

@item 
bpo-21995@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21995}: Explain some differences between IDLE and console Python.

@item 
bpo-22820@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22820}: Explain need for `print' when running file from Idle editor.

@item 
bpo-25224@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25224}: Doc: augment Idle feature list and no-subprocess section.

@item 
bpo-25219@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25219}: Update doc for Idle command line options. Some were missing and
notes were not correct.

@item 
bpo-24861@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24861}: Most of idlelib is private and subject to change. Use
idleib.idle.* to start Idle. See idlelib.__init__.__doc__.

@item 
bpo-25199@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25199}: Idle: add synchronization comments for future maintainers.

@item 
bpo-16893@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16893}: Replace help.txt with help.html for Idle doc display. The new
idlelib/help.html is rstripped Doc/build/html/library/idle.html. It looks
better than help.txt and will better document Idle as released. The
tkinter html viewer that works for this file was written by Rose Roseman.
The now unused EditorWindow.HelpDialog class and helt.txt file are
deprecated.

@item 
bpo-24199@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24199}: Deprecate unused idlelib.idlever with possible removal in 3.6.

@item 
bpo-24790@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24790}: Remove extraneous code (which also create 2 & 3 conflicts).
@end itemize

@node Documentation<80>,Tests<81>,IDLE<57>,Python 3 6 0 alpha 1
@anchor{whatsnew/changelog id1003}@anchor{1f7d}
@subsubsection Documentation



@itemize -

@item 
bpo-26736@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26736}: Used HTTPS for external links in the documentation if possible.

@item 
bpo-6953@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6953}: Rework the Readline module documentation to group related
functions together, and add more details such as what underlying Readline
functions and variables are accessed.

@item 
bpo-23606@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23606}: Adds note to ctypes documentation regarding cdll.msvcrt.

@item 
bpo-24952@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24952}: Clarify the default size argument of stack_size() in the
“threading” and “_thread” modules. Patch from Mattip.

@item 
bpo-26014@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26014}: Update 3.x packaging documentation: * “See also” links to the
new docs are now provided in the legacy pages * links to setuptools
documentation have been updated
@end itemize

@node Tests<81>,Build<92>,Documentation<80>,Python 3 6 0 alpha 1
@anchor{whatsnew/changelog id1004}@anchor{1f7e}
@subsubsection Tests



@itemize -

@item 
bpo-21916@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21916}: Added tests for the turtle module.  Patch by ingrid, Gregory
Loyse and Jelle Zijlstra.

@item 
bpo-26295@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26295}: When using “python3 -m test –testdir=TESTDIR”, regrtest
doesn’t add “test.” prefix to test module names.

@item 
bpo-26523@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26523}: The multiprocessing thread pool (multiprocessing.dummy.Pool)
was untested.

@item 
bpo-26015@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26015}: Added new tests for pickling iterators of mutable sequences.

@item 
bpo-26325@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26325}: Added test.support.check_no_resource_warning() to check that no
ResourceWarning is emitted.

@item 
bpo-25940@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25940}: Changed test_ssl to use its internal local server more.  This
avoids relying on svn.python.org, which recently changed root certificate.

@item 
bpo-25616@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25616}: Tests for OrderedDict are extracted from test_collections into
separate file test_ordered_dict.

@item 
bpo-25449@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25449}: Added tests for OrderedDict subclasses.

@item 
bpo-25188@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25188}: Add -P/–pgo to test.regrtest to suppress error output when
running the test suite for the purposes of a PGO build. Initial patch by
Alecsandru Patrascu.

@item 
bpo-22806@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22806}: Add @code{python -m test --list-tests} command to list tests.

@item 
bpo-18174@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18174}: @code{python -m test --huntrleaks ...} now also checks for leak of
file descriptors. Patch written by Richard Oudkerk.

@item 
bpo-25260@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25260}: Fix @code{python -m test --coverage} on Windows. Remove the list
of ignored directories.

@item 
@code{PCbuild\rt.bat} now accepts an unlimited number of arguments to pass
along to regrtest.py.  Previously there was a limit of 9.

@item 
bpo-26583@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26583}: Skip test_timestamp_overflow in test_import if bytecode files
cannot be written.
@end itemize

@node Build<92>,Windows<78>,Tests<81>,Python 3 6 0 alpha 1
@anchor{whatsnew/changelog id1005}@anchor{1f7f}
@subsubsection Build



@itemize -

@item 
bpo-21277@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21277}: Don’t try to link _ctypes with a ffi_convenience library.

@item 
bpo-26884@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26884}: Fix linking extension modules for cross builds. Patch by Xavier
de Gaye.

@item 
bpo-26932@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26932}: Fixed support of RTLD_* constants defined as enum values, not
via macros (in particular on Android).  Patch by Chi Hsuan Yen.

@item 
bpo-22359@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22359}: Disable the rules for running _freeze_importlib and pgen when
cross-compiling.  The output of these programs is normally saved with the
source code anyway, and is still regenerated when doing a native build.
Patch by Xavier de Gaye.

@item 
bpo-21668@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21668}: Link audioop, _datetime, _ctypes_test modules to libm, except
on Mac OS X. Patch written by Chi Hsuan Yen.

@item 
bpo-25702@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25702}: A –with-lto configure option has been added that will enable
link time optimizations at build time during a make profile-opt. Some
compilers and toolchains are known to not produce stable code when using
LTO, be sure to test things thoroughly before relying on it. It can
provide a few % speed up over profile-opt alone.

@item 
bpo-26624@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26624}: Adds validation of ucrtbase[d].dll version with warning for old
versions.

@item 
bpo-17603@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17603}: Avoid error about nonexistent fileblocks.o file by using a
lower-level check for st_blocks in struct stat.

@item 
bpo-26079@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26079}: Fixing the build output folder for tix-8.4.3.6. Patch by Bjoern
Thiel.

@item 
bpo-26465@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26465}: Update Windows builds to use OpenSSL 1.0.2g.

@item 
bpo-25348@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25348}: Added @code{--pgo} and @code{--pgo-job} arguments to
@code{PCbuild\build.bat} for building with Profile-Guided Optimization.  The
old @code{PCbuild\build_pgo.bat} script is removed.

@item 
bpo-25827@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25827}: Add support for building with ICC to @code{configure}, including a
new @code{--with-icc} flag.

@item 
bpo-25696@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25696}: Fix installation of Python on UNIX with make -j9.

@item 
bpo-24986@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24986}: It is now possible to build Python on Windows without errors
when external libraries are not available.

@item 
bpo-24421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24421}: Compile Modules/_math.c once, before building extensions.
Previously it could fail to compile properly if the math and cmath builds
were concurrent.

@item 
bpo-26465@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26465}: Update OS X 10.5+ 32-bit-only installer to build and link with
OpenSSL 1.0.2g.

@item 
bpo-26268@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26268}: Update Windows builds to use OpenSSL 1.0.2f.

@item 
bpo-25136@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25136}: Support Apple Xcode 7’s new textual SDK stub libraries.

@item 
bpo-24324@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24324}: Do not enable unreachable code warnings when using gcc as the
option does not work correctly in older versions of gcc and has been
silently removed as of gcc-4.5.
@end itemize

@node Windows<78>,Tools/Demos<54>,Build<92>,Python 3 6 0 alpha 1
@anchor{whatsnew/changelog id1006}@anchor{1f80}
@subsubsection Windows



@itemize -

@item 
bpo-27053@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27053}: Updates make_zip.py to correctly generate library ZIP file.

@item 
bpo-26268@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26268}: Update the prepare_ssl.py script to handle OpenSSL releases
that don’t include the contents of the include directory (that is, 1.0.2e
and later).

@item 
bpo-26071@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26071}: bdist_wininst created binaries fail to start and find 32bit
Python

@item 
bpo-26073@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26073}: Update the list of magic numbers in launcher

@item 
bpo-26065@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26065}: Excludes venv from library when generating embeddable distro.

@item 
bpo-25022@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25022}: Removed very outdated PC/example_nt/ directory.
@end itemize

@node Tools/Demos<54>,C API<77>,Windows<78>,Python 3 6 0 alpha 1
@anchor{whatsnew/changelog id1007}@anchor{1f81}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-26799@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26799}: Fix python-gdb.py: don’t get C types once when the Python code
is loaded, but get C types on demand. The C types can change if
python-gdb.py is loaded before the Python executable. Patch written by
Thomas Ilsche.

@item 
bpo-26271@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26271}: Fix the Freeze tool to properly use flags passed through
configure. Patch by Daniel Shaulov.

@item 
bpo-26489@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26489}: Add dictionary unpacking support to Tools/parser/unparse.py.
Patch by Guo Ci Teo.

@item 
bpo-26316@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26316}: Fix variable name typo in Argument Clinic.

@item 
bpo-25440@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25440}: Fix output of python-config –extension-suffix.

@item 
bpo-25154@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25154}: The pyvenv script has been deprecated in favour of @code{python3 -m
venv}.
@end itemize

@node C API<77>,,Tools/Demos<54>,Python 3 6 0 alpha 1
@anchor{whatsnew/changelog id1008}@anchor{1f82}
@subsubsection C API



@itemize -

@item 
bpo-26312@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26312}: SystemError is now raised in all programming bugs with using
PyArg_ParseTupleAndKeywords().  RuntimeError did raised before in some
programming bugs.

@item 
bpo-26198@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26198}: ValueError is now raised instead of TypeError on buffer
overflow in parsing “es#” and “et#” format units.  SystemError is now
raised instead of TypeError on programmatical error in parsing format
string.
@end itemize

@node Python 3 5 5 final,Python 3 5 5 release candidate 1,Python 3 6 0 alpha 1,Changelog
@anchor{whatsnew/changelog python-3-5-5-final}@anchor{1f83}
@subsection Python 3.5.5 final


`Release date: 2018-02-04'

There were no new changes in version 3.5.5.

@node Python 3 5 5 release candidate 1,Python 3 5 4 final,Python 3 5 5 final,Changelog
@anchor{whatsnew/changelog python-3-5-5-release-candidate-1}@anchor{1f84}
@subsection Python 3.5.5 release candidate 1


`Release date: 2018-01-23'

@menu
* Security: Security<61>. 
* Core and Builtins: Core and Builtins<191>. 
* Library: Library<194>. 

@end menu

@node Security<61>,Core and Builtins<191>,,Python 3 5 5 release candidate 1
@anchor{whatsnew/changelog id1009}@anchor{1f85}
@subsubsection Security



@itemize -

@item 
bpo-32551@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32551}: The @code{sys.path[0]} initialization change for bpo-29139@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29139} caused
a regression by revealing an inconsistency in how sys.path is initialized
when executing @code{__main__} from a zipfile, directory, or other import
location. This is considered a potential security issue, as it may lead to
privileged processes unexpectedly loading code from user controlled
directories in situations where that was not previously the case. The
interpreter now consistently avoids ever adding the import location’s
parent directory to @code{sys.path}, and ensures no other @code{sys.path}
entries are inadvertently modified when inserting the import location
named on the command line. (Originally reported as bpo-29723@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29723} against
Python 3.6rc1, but it was missed at the time that the then upcoming Python
3.5.4 release would also be affected)

@item 
bpo-30657@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30657}: Fixed possible integer overflow in PyBytes_DecodeEscape,
@geindex Common Vulnerabilities and Exposures; CVE 2017-1000158
CVE 2017-1000158@footnote{https://www.cve.org/CVERecord?id=CVE-2017-1000158}. Original patch by Jay Bosamiya; rebased to Python 3
by Miro Hrončok.

@item 
bpo-30947@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30947}: Upgrade libexpat embedded copy from version 2.2.1 to 2.2.3 to
get security fixes.
@end itemize

@node Core and Builtins<191>,Library<194>,Security<61>,Python 3 5 5 release candidate 1
@anchor{whatsnew/changelog id1010}@anchor{1f86}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-31095@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31095}: Fix potential crash during GC caused by @code{tp_dealloc} which
doesn’t call @code{PyObject_GC_UnTrack()}.
@end itemize

@node Library<194>,,Core and Builtins<191>,Python 3 5 5 release candidate 1
@anchor{whatsnew/changelog id1011}@anchor{1f87}
@subsubsection Library



@itemize -

@item 
bpo-32072@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32072}: Fixed issues with binary plists: Fixed saving bytearrays.
Identical objects will be saved only once. Equal references will be load
as identical objects. Added support for saving and loading recursive data
structures.

@item 
bpo-31170@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31170}: expat: Update libexpat from 2.2.3 to 2.2.4. Fix copying of
partial characters for UTF-8 input (libexpat bug 115):
@indicateurl{https://github.com/libexpat/libexpat/issues/115}
@end itemize

@node Python 3 5 4 final,Python 3 5 4 release candidate 1,Python 3 5 5 release candidate 1,Changelog
@anchor{whatsnew/changelog python-3-5-4-final}@anchor{1f88}
@subsection Python 3.5.4 final


`Release date: 2017-08-07'

@menu
* Library: Library<195>. 

@end menu

@node Library<195>,,,Python 3 5 4 final
@anchor{whatsnew/changelog id1012}@anchor{1f89}
@subsubsection Library



@itemize -

@item 
bpo-30119@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30119}: ftplib.FTP.putline() now throws ValueError on commands that
contains CR or LF. Patch by Donghee Na.
@end itemize

@node Python 3 5 4 release candidate 1,Python 3 5 3 final,Python 3 5 4 final,Changelog
@anchor{whatsnew/changelog python-3-5-4-release-candidate-1}@anchor{1f8a}
@subsection Python 3.5.4 release candidate 1


`Release date: 2017-07-23'

@menu
* Security: Security<62>. 
* Core and Builtins: Core and Builtins<192>. 
* Library: Library<196>. 
* Documentation: Documentation<81>. 
* Tests: Tests<82>. 
* Build: Build<93>. 
* Windows: Windows<79>. 
* C API: C API<78>. 

@end menu

@node Security<62>,Core and Builtins<192>,,Python 3 5 4 release candidate 1
@anchor{whatsnew/changelog id1013}@anchor{1f8b}
@subsubsection Security



@itemize -

@item 
bpo-30730@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30730}: Prevent environment variables injection in subprocess on
Windows.  Prevent passing other environment variables and command
arguments.

@item 
bpo-30694@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30694}: Upgrade expat copy from 2.2.0 to 2.2.1 to get fixes of multiple
security vulnerabilities including: 
@geindex Common Vulnerabilities and Exposures; CVE 2017-9233
CVE 2017-9233@footnote{https://www.cve.org/CVERecord?id=CVE-2017-9233} (External entity
infinite loop DoS), 
@geindex Common Vulnerabilities and Exposures; CVE 2016-9063
CVE 2016-9063@footnote{https://www.cve.org/CVERecord?id=CVE-2016-9063} (Integer overflow, re-fix),
@geindex Common Vulnerabilities and Exposures; CVE 2016-0718
CVE 2016-0718@footnote{https://www.cve.org/CVERecord?id=CVE-2016-0718} (Fix regression bugs from 2.2.0’s fix to
@geindex Common Vulnerabilities and Exposures; CVE 2016-0718
CVE 2016-0718@footnote{https://www.cve.org/CVERecord?id=CVE-2016-0718}) and 
@geindex Common Vulnerabilities and Exposures; CVE 2012-0876
CVE 2012-0876@footnote{https://www.cve.org/CVERecord?id=CVE-2012-0876} (Counter hash flooding with
SipHash). Note: the 
@geindex Common Vulnerabilities and Exposures; CVE 2016-5300
CVE 2016-5300@footnote{https://www.cve.org/CVERecord?id=CVE-2016-5300} (Use os-specific entropy sources like
getrandom) doesn’t impact Python, since Python already gets entropy from
the OS to set the expat secret using @code{XML_SetHashSalt()}.

@item 
bpo-30500@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30500}: Fix urllib.parse.splithost() to correctly parse fragments. For
example, @code{splithost('//127.0.0.1#@@evil.com/')} now correctly returns the
@code{127.0.0.1} host, instead of treating @code{@@evil.com} as the host in an
authentication (@code{login@@host}).

@item 
bpo-29591@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29591}: Update expat copy from 2.1.1 to 2.2.0 to get fixes of
@geindex Common Vulnerabilities and Exposures; CVE 2016-0718
CVE 2016-0718@footnote{https://www.cve.org/CVERecord?id=CVE-2016-0718} and 
@geindex Common Vulnerabilities and Exposures; CVE 2016-4472
CVE 2016-4472@footnote{https://www.cve.org/CVERecord?id=CVE-2016-4472}. See
@indicateurl{https://sourceforge.net/p/expat/bugs/537/} for more information.
@end itemize

@node Core and Builtins<192>,Library<196>,Security<62>,Python 3 5 4 release candidate 1
@anchor{whatsnew/changelog id1014}@anchor{1f8c}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-30876@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30876}: Relative import from unloaded package now reimports the package
instead of failing with SystemError.  Relative import from non-package now
fails with ImportError rather than SystemError.

@item 
bpo-30765@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30765}: Avoid blocking in pthread_mutex_lock() when
PyThread_acquire_lock() is asked not to block.

@item 
bpo-27945@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27945}: Fixed various segfaults with dict when input collections are
mutated during searching, inserting or comparing.  Based on patches by
Duane Griffin and Tim Mitchell.

@item 
bpo-25794@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25794}: Fixed type.__setattr__() and type.__delattr__() for
non-interned attribute names.  Based on patch by Eryk Sun.

@item 
bpo-29935@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29935}: Fixed error messages in the index() method of tuple, list and
deque when pass indices of wrong type.

@item 
bpo-28876@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28876}: @code{bool(range)} works even if @code{len(range)} raises
@ref{a87,,OverflowError}.

@item 
bpo-29600@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29600}: Fix wrapping coroutine return values in StopIteration.

@item 
bpo-29537@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29537}: Restore runtime compatibility with bytecode files generated by
CPython 3.5.0 to 3.5.2, and adjust the eval loop to avoid the problems
that could be caused by the malformed variant of the
BUILD_MAP_UNPACK_WITH_CALL opcode that they may contain. Patch by Petr
Viktorin, Serhiy Storchaka, and Nick Coghlan.

@item 
bpo-28598@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28598}: Support __rmod__ for subclasses of str being called before
str.__mod__. Patch by Martijn Pieters.

@item 
bpo-29602@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29602}: Fix incorrect handling of signed zeros in complex constructor
for complex subclasses and for inputs having a __complex__ method. Patch
by Serhiy Storchaka.

@item 
bpo-29347@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29347}: Fixed possibly dereferencing undefined pointers when creating
weakref objects.

@item 
bpo-29438@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29438}: Fixed use-after-free problem in key sharing dict.

@item 
bpo-29319@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29319}: Prevent RunMainFromImporter overwriting sys.path[0].

@item 
bpo-29337@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29337}: Fixed possible BytesWarning when compare the code objects.
Warnings could be emitted at compile time.

@item 
bpo-29478@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29478}: If max_line_length=None is specified while using the Compat32
policy, it is no longer ignored.  Patch by Mircea Cosbuc.
@end itemize

@node Library<196>,Documentation<81>,Core and Builtins<192>,Python 3 5 4 release candidate 1
@anchor{whatsnew/changelog id1015}@anchor{1f8d}
@subsubsection Library



@itemize -

@item 
bpo-29403@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29403}: Fix @code{unittest.mock}’s autospec to not fail on method-bound
builtin functions.  Patch by Aaron Gallagher.

@item 
bpo-30961@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30961}: Fix decrementing a borrowed reference in tracemalloc.

@item 
bpo-30886@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30886}: Fix multiprocessing.Queue.join_thread(): it now waits until the
thread completes, even if the thread was started by the same process which
created the queue.

@item 
bpo-29854@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29854}: Fix segfault in readline when using readline’s history-size
option.  Patch by Nir Soffer.

@item 
bpo-30807@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30807}: signal.setitimer() may disable the timer when passed a tiny
value. Tiny values (such as 1e-6) are valid non-zero values for
setitimer(), which is specified as taking microsecond-resolution
intervals. However, on some platform, our conversion routine could convert
1e-6 into a zero interval, therefore disabling the timer instead of
(re-)scheduling it.

@item 
bpo-30441@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30441}: Fix bug when modifying os.environ while iterating over it

@item 
bpo-30532@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30532}: Fix email header value parser dropping folding white space in
certain cases.

@item 
bpo-29169@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29169}: Update zlib to 1.2.11.

@item 
bpo-30879@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30879}: os.listdir() and os.scandir() now emit bytes names when called
with bytes-like argument.

@item 
bpo-30746@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30746}: Prohibited the ‘=’ character in environment variable names in
@code{os.putenv()} and @code{os.spawn*()}.

@item 
bpo-29755@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29755}: Fixed the lgettext() family of functions in the gettext module.
They now always return bytes.

@item 
bpo-30645@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30645}: Fix path calculation in imp.load_package(), fixing it for cases
when a package is only shipped with bytecodes. Patch by Alexandru
Ardelean.

@item 
bpo-23890@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23890}: unittest.TestCase.assertRaises() now manually breaks a
reference cycle to not keep objects alive longer than expected.

@item 
bpo-30149@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30149}: inspect.signature() now supports callables with
variable-argument parameters wrapped with partialmethod. Patch by Donghee
Na.

@item 
bpo-29931@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29931}: Fixed comparison check for ipaddress.ip_interface objects.
Patch by Sanjay Sundaresan.

@item 
bpo-24484@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24484}: Avoid race condition in multiprocessing cleanup.

@item 
bpo-28994@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28994}: The traceback no longer displayed for SystemExit raised in a
callback registered by atexit.

@item 
bpo-30508@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30508}: Don’t log exceptions if Task/Future “cancel()” method was
called.

@item 
bpo-28556@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28556}: Updates to typing module: Add generic AsyncContextManager, add
support for ContextManager on all versions. Original PRs by Jelle Zijlstra
and Ivan Levkivskyi

@item 
bpo-29870@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29870}: Fix ssl sockets leaks when connection is aborted in asyncio/ssl
implementation. Patch by Michaël Sghaïer.

@item 
bpo-29743@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29743}: Closing transport during handshake process leaks open socket.
Patch by Nikolay Kim

@item 
bpo-27585@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27585}: Fix waiter cancellation in asyncio.Lock. Patch by Mathieu
Sornay.

@item 
bpo-30418@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30418}: On Windows, subprocess.Popen.communicate() now also ignore
EINVAL on stdin.write() if the child process is still running but closed
the pipe.

@item 
bpo-30378@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30378}: Fix the problem that logging.handlers.SysLogHandler cannot
handle IPv6 addresses.

@item 
bpo-29960@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29960}: Preserve generator state when _random.Random.setstate() raises
an exception. Patch by Bryan Olson.

@item 
bpo-30414@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30414}: multiprocessing.Queue._feed background running thread do not
break from main loop on exception.

@item 
bpo-30003@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30003}: Fix handling escape characters in HZ codec.  Based on patch by
Ma Lin.

@item 
bpo-30301@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30301}: Fix AttributeError when using SimpleQueue.empty() under `spawn'
and `forkserver' start methods.

@item 
bpo-30329@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30329}: imaplib and poplib now catch the Windows socket WSAEINVAL error
(code 10022) on shutdown(SHUT_RDWR): An invalid operation was attempted.
This error occurs sometimes on SSL connections.

@item 
bpo-30375@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30375}: Warnings emitted when compile a regular expression now always
point to the line in the user code.  Previously they could point into
inners of the re module if emitted from inside of groups or conditionals.

@item 
bpo-30048@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30048}: Fixed @code{Task.cancel()} can be ignored when the task is running
coroutine and the coroutine returned without any more @code{await}.

@item 
bpo-29990@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29990}: Fix range checking in GB18030 decoder.  Original patch by Ma
Lin.

@item 
bpo-26293@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26293}: Change resulted because of zipfile breakage. (See also:
bpo-29094@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29094})

@item 
bpo-30243@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30243}: Removed the __init__ methods of _json’s scanner and encoder.
Misusing them could cause memory leaks or crashes.  Now scanner and
encoder objects are completely initialized in the __new__ methods.

@item 
bpo-30185@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30185}: Avoid KeyboardInterrupt tracebacks in forkserver helper process
when Ctrl-C is received.

@item 
bpo-28556@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28556}: Various updates to typing module: add typing.NoReturn type, use
WrapperDescriptorType, minor bug-fixes.  Original PRs by Jim
Fasarakis-Hilliard and Ivan Levkivskyi.

@item 
bpo-30205@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30205}: Fix getsockname() for unbound AF_UNIX sockets on Linux.

@item 
bpo-30070@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30070}: Fixed leaks and crashes in errors handling in the parser
module.

@item 
bpo-30061@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30061}: Fixed crashes in IOBase methods __next__() and readlines() when
readline() or __next__() respectively return non-sizeable object. Fixed
possible other errors caused by not checking results of PyObject_Size(),
PySequence_Size(), or PyMapping_Size().

@item 
bpo-30068@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30068}: _io._IOBase.readlines will check if it’s closed first when hint
is present.

@item 
bpo-29694@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29694}: Fixed race condition in pathlib mkdir with flags parents=True.
Patch by Armin Rigo.

@item 
bpo-29692@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29692}: Fixed arbitrary unchaining of RuntimeError exceptions in
contextlib.contextmanager.  Patch by Siddharth Velankar.

@item 
bpo-29998@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29998}: Pickling and copying ImportError now preserves name and path
attributes.

@item 
bpo-29942@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29942}: Fix a crash in itertools.chain.from_iterable when encountering
long runs of empty iterables.

@item 
bpo-27863@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27863}: Fixed multiple crashes in ElementTree caused by race conditions
and wrong types.

@item 
bpo-28699@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28699}: Fixed a bug in pools in multiprocessing.pool that raising an
exception at the very first of an iterable may swallow the exception or
make the program hang. Patch by Davin Potts and Xiang Zhang.

@item 
bpo-25803@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25803}: Avoid incorrect errors raised by Path.mkdir(exist_ok=True) when
the OS gives priority to errors such as EACCES over EEXIST.

@item 
bpo-29861@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29861}: Release references to tasks, their arguments and their results
as soon as they are finished in multiprocessing.Pool.

@item 
bpo-29884@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29884}: faulthandler: Restore the old sigaltstack during teardown.
Patch by Christophe Zeitouny.

@item 
bpo-25455@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25455}: Fixed crashes in repr of recursive buffered file-like objects.

@item 
bpo-29800@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29800}: Fix crashes in partial.__repr__ if the keys of partial.keywords
are not strings.  Patch by Michael Seifert.

@item 
bpo-29742@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29742}: get_extra_info() raises exception if get called on closed ssl
transport. Patch by Nikolay Kim.

@item 
bpo-8256@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8256}: Fixed possible failing or crashing input() if attributes
“encoding” or “errors” of sys.stdin or sys.stdout are not set or are not
strings.

@item 
bpo-28298@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28298}: Fix a bug that prevented array ‘Q’, ‘L’ and ‘I’ from accepting
big intables (objects that have __int__) as elements.  Patch by Oren
Milman.

@item 
bpo-29615@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29615}: SimpleXMLRPCDispatcher no longer chains KeyError (or any other
exception) to exception(s) raised in the dispatched methods. Patch by Petr
Motejlek.

@item 
bpo-29704@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29704}: asyncio.subprocess.SubprocessStreamProtocol no longer closes
before all pipes are closed.

@item 
bpo-29703@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29703}: Fix asyncio to support instantiation of new event loops in
child processes.

@item 
bpo-29376@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29376}: Fix assertion error in threading._DummyThread.is_alive().

@item 
bpo-29110@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29110}: Fix file object leak in aifc.open() when file is given as a
filesystem path and is not in valid AIFF format. Patch by Anthony Zhang.

@item 
bpo-28961@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28961}: Fix unittest.mock._Call helper: don’t ignore the name parameter
anymore. Patch written by Jiajun Huang.

@item 
bpo-29532@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29532}: Altering a kwarg dictionary passed to functools.partial() no
longer affects a partial object after creation.

@item 
bpo-28556@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28556}: Various updates to typing module: typing.Counter,
typing.ChainMap, improved ABC caching, etc. Original PRs by Jelle
Zijlstra, Ivan Levkivskyi, Manuel Krebber, and Łukasz Langa.

@item 
bpo-29100@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29100}: Fix datetime.fromtimestamp() regression introduced in Python
3.6.0: check minimum and maximum years.

@item 
bpo-29519@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29519}: Fix weakref spewing exceptions during interpreter shutdown when
used with a rare combination of multiprocessing and custom codecs.

@item 
bpo-29416@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29416}: Prevent infinite loop in pathlib.Path.mkdir

@item 
bpo-29444@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29444}: Fixed out-of-bounds buffer access in the group() method of the
match object. Based on patch by WGH.

@item 
bpo-29335@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29335}: Fix subprocess.Popen.wait() when the child process has exited
to a stopped instead of terminated state (ex: when under ptrace).

@item 
bpo-29290@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29290}: Fix a regression in argparse that help messages would wrap at
non-breaking spaces.

@item 
bpo-28735@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28735}: Fixed the comparison of mock.MagickMock with mock.ANY.

@item 
bpo-29011@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29011}: Fix an important omission by adding Deque to the typing module.

@item 
bpo-29219@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29219}: Fixed infinite recursion in the repr of uninitialized
ctypes.CDLL instances.

@item 
bpo-28969@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28969}: Fixed race condition in C implementation of
functools.lru_cache. KeyError could be raised when cached function with
full cache was simultaneously called from different threads with the same
uncached arguments.

@item 
bpo-29142@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29142}: In urllib.request, suffixes in no_proxy environment variable
with leading dots could match related hostnames again (e.g. .b.c matches
a.b.c). Patch by Milan Oberkirch.
@end itemize

@node Documentation<81>,Tests<82>,Library<196>,Python 3 5 4 release candidate 1
@anchor{whatsnew/changelog id1016}@anchor{1f8e}
@subsubsection Documentation



@itemize -

@item 
bpo-30176@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30176}: Add missing attribute related constants in curses
documentation.

@item 
bpo-26985@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26985}: Add missing info of code object in inspect documentation.

@item 
bpo-28929@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28929}: Link the documentation to its source file on GitHub.

@item 
bpo-25008@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25008}: Document smtpd.py as effectively deprecated and add a pointer
to aiosmtpd, a third-party asyncio-based replacement.

@item 
bpo-26355@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26355}: Add canonical header link on each page to corresponding major
version of the documentation. Patch by Matthias Bussonnier.

@item 
bpo-29349@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29349}: Fix Python 2 syntax in code for building the documentation.
@end itemize

@node Tests<82>,Build<93>,Documentation<81>,Python 3 5 4 release candidate 1
@anchor{whatsnew/changelog id1017}@anchor{1f8f}
@subsubsection Tests



@itemize -

@item 
bpo-30822@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30822}: Fix regrtest command line parser to allow passing -u
extralargefile to run test_zipfile64.

@item 
bpo-30383@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30383}: regrtest: Enhance regrtest and backport features from the
master branch. Add options: –coverage, –testdir, –list-tests (list test
files, don’t run them), –list-cases (list test identifiers, don’t run
them, bpo-30523@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30523}), –matchfile (load a list of test filters from a
text file, bpo-30540@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30540}), –slowest (alias to –slow). Enhance output:
add timestamp, test result, currently running tests, “Tests result: xxx”
summary with total duration, etc. Fix reference leak hunting in regrtest,
–huntrleaks: regrtest now warms up caches, create explicitly all internal
singletons which are created on demand to prevent false positives when
checking for reference leaks. (bpo-30675@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30675}).

@item 
bpo-30357@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30357}: test_thread: setUp() now uses support.threading_setup() and
support.threading_cleanup() to wait until threads complete to avoid random
side effects on following tests. Initial patch written by Grzegorz
Grzywacz.

@item 
bpo-28087@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28087}: Skip test_asyncore and test_eintr poll failures on macOS. Skip
some tests of select.poll when running on macOS due to unresolved issues
with the underlying system poll function on some macOS versions.

@item 
bpo-30197@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30197}: Enhanced functions swap_attr() and swap_item() in the
test.support module. They now work when delete replaced attribute or item
inside the with statement.  The old value of the attribute or item (or
None if it doesn’t exist) now will be assigned to the target of the “as”
clause, if there is one.

@item 
bpo-29571@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29571}: to match the behaviour of the @code{re.LOCALE} flag,
test_re.test_locale_flag now uses @code{locale.getpreferredencoding(False)}
to determine the candidate encoding for the test regex (allowing it to
correctly skip the test when the default locale encoding is a multi-byte
encoding)
@end itemize

@node Build<93>,Windows<79>,Tests<82>,Python 3 5 4 release candidate 1
@anchor{whatsnew/changelog id1018}@anchor{1f90}
@subsubsection Build



@itemize -

@item 
bpo-29243@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29243}: Prevent unnecessary rebuilding of Python during @code{make test},
@code{make install} and some other make targets when configured with
@code{--enable-optimizations}.

@item 
bpo-23404@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23404}: Don’t regenerate generated files based on file modification
time anymore: the action is now explicit. Replace @code{make touch} with
@code{make regen-all}.

@item 
bpo-29643@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29643}: Fix @code{--enable-optimization} didn’t work.
@end itemize

@node Windows<79>,C API<78>,Build<93>,Python 3 5 4 release candidate 1
@anchor{whatsnew/changelog id1019}@anchor{1f91}
@subsubsection Windows



@itemize -

@item 
bpo-30687@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30687}: Locate msbuild.exe on Windows when building rather than
vcvarsall.bat

@item 
bpo-29392@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29392}: Prevent crash when passing invalid arguments into msvcrt
module.
@end itemize

@node C API<78>,,Windows<79>,Python 3 5 4 release candidate 1
@anchor{whatsnew/changelog id1020}@anchor{1f92}
@subsubsection C API



@itemize -

@item 
bpo-27867@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27867}: Function PySlice_GetIndicesEx() is replaced with a macro if
Py_LIMITED_API is set to the value between 0x03050400 and 0x03060000 (not
including) or 0x03060100 or higher.

@item 
bpo-29083@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29083}: Fixed the declaration of some public API functions.
PyArg_VaParse() and PyArg_VaParseTupleAndKeywords() were not available in
limited API. PyArg_ValidateKeywordArguments(), PyArg_UnpackTuple() and
Py_BuildValue() were not available in limited API of version < 3.3 when
PY_SSIZE_T_CLEAN is defined.
@end itemize

@node Python 3 5 3 final,Python 3 5 3 release candidate 1,Python 3 5 4 release candidate 1,Changelog
@anchor{whatsnew/changelog python-3-5-3-final}@anchor{1f93}
@subsection Python 3.5.3 final


`Release date: 2017-01-17'

There were no code changes between 3.5.3rc1 and 3.5.3 final.

@node Python 3 5 3 release candidate 1,Python 3 5 2 final,Python 3 5 3 final,Changelog
@anchor{whatsnew/changelog python-3-5-3-release-candidate-1}@anchor{1f94}
@subsection Python 3.5.3 release candidate 1


`Release date: 2017-01-02'

@menu
* Security: Security<63>. 
* Core and Builtins: Core and Builtins<193>. 
* Library: Library<197>. 
* IDLE: IDLE<58>. 
* C API: C API<79>. 
* Documentation: Documentation<82>. 
* Tests: Tests<83>. 
* Tools/Demos: Tools/Demos<55>. 
* Windows: Windows<80>. 
* Build: Build<94>. 

@end menu

@node Security<63>,Core and Builtins<193>,,Python 3 5 3 release candidate 1
@anchor{whatsnew/changelog id1021}@anchor{1f95}
@subsubsection Security



@itemize -

@item 
bpo-27278@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27278}: Fix os.urandom() implementation using getrandom() on Linux.
Truncate size to INT_MAX and loop until we collected enough random bytes,
instead of casting a directly Py_ssize_t to int.

@item 
bpo-22636@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22636}: Avoid shell injection problems with ctypes.util.find_library().
@end itemize

@node Core and Builtins<193>,Library<197>,Security<63>,Python 3 5 3 release candidate 1
@anchor{whatsnew/changelog id1022}@anchor{1f96}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-29073@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29073}: bytearray formatting no longer truncates on first null byte.

@item 
bpo-28932@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28932}: Do not include <sys/random.h> if it does not exist.

@item 
bpo-28147@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28147}: Fix a memory leak in split-table dictionaries: setattr() must
not convert combined table into split table.

@item 
bpo-25677@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25677}: Correct the positioning of the syntax error caret for indented
blocks. Based on patch by Michael Layzell.

@item 
bpo-29000@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29000}: Fixed bytes formatting of octals with zero padding in alternate
form.

@item 
bpo-28512@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28512}: Fixed setting the offset attribute of SyntaxError by
PyErr_SyntaxLocationEx() and PyErr_SyntaxLocationObject().

@item 
bpo-28991@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28991}: functools.lru_cache() was susceptible to an obscure reentrancy
bug caused by a monkey-patched len() function.

@item 
bpo-28648@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28648}: Fixed crash in Py_DecodeLocale() in debug build on Mac OS X
when decode astral characters.  Patch by Xiang Zhang.

@item 
bpo-19398@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19398}: Extra slash no longer added to sys.path components in case of
empty compile-time PYTHONPATH components.

@item 
bpo-28426@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28426}: Fixed potential crash in PyUnicode_AsDecodedObject() in debug
build.

@item 
bpo-23782@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23782}: Fixed possible memory leak in _PyTraceback_Add() and exception
loss in PyTraceBack_Here().

@item 
bpo-28379@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28379}: Added sanity checks and tests for PyUnicode_CopyCharacters().
Patch by Xiang Zhang.

@item 
bpo-28376@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28376}: The type of long range iterator is now registered as Iterator.
Patch by Oren Milman.

@item 
bpo-28376@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28376}: The constructor of range_iterator now checks that step is not
0. Patch by Oren Milman.

@item 
bpo-26906@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26906}: Resolving special methods of uninitialized type now causes
implicit initialization of the type instead of a fail.

@item 
bpo-18287@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18287}: PyType_Ready() now checks that tp_name is not NULL. Original
patch by Niklas Koep.

@item 
bpo-24098@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24098}: Fixed possible crash when AST is changed in process of
compiling it.

@item 
bpo-28350@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28350}: String constants with null character no longer interned.

@item 
bpo-26617@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26617}: Fix crash when GC runs during weakref callbacks.

@item 
bpo-27942@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27942}: String constants now interned recursively in tuples and
frozensets.

@item 
bpo-21578@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21578}: Fixed misleading error message when ImportError called with
invalid keyword args.

@item 
bpo-28203@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28203}: Fix incorrect type in error message from @code{complex(1.0,
@{2:3@})}. Patch by Soumya Sharma.

@item 
bpo-27955@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27955}: Fallback on reading /dev/urandom device when the getrandom()
syscall fails with EPERM, for example when blocked by SECCOMP.

@item 
bpo-28131@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28131}: Fix a regression in zipimport’s compile_source().  zipimport
should use the same optimization level as the interpreter.

@item 
bpo-25221@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25221}: Fix corrupted result from PyLong_FromLong(0) when Python is
compiled with NSMALLPOSINTS = 0.

@item 
bpo-25758@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25758}: Prevents zipimport from unnecessarily encoding a filename
(patch by Eryk Sun)

@item 
bpo-28189@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28189}: dictitems_contains no longer swallows compare errors. (Patch by
Xiang Zhang)

@item 
bpo-27812@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27812}: Properly clear out a generator’s frame’s backreference to the
generator to prevent crashes in frame.clear().

@item 
bpo-27811@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27811}: Fix a crash when a coroutine that has not been awaited is
finalized with warnings-as-errors enabled.

@item 
bpo-27587@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27587}: Fix another issue found by PVS-Studio: Null pointer check after
use of ‘def’ in _PyState_AddModule(). Initial patch by Christian Heimes.

@item 
bpo-26020@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26020}: set literal evaluation order did not match documented
behaviour.

@item 
bpo-27782@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27782}: Multi-phase extension module import now correctly allows the
@code{m_methods} field to be used to add module level functions to instances
of non-module types returned from @code{Py_create_mod}. Patch by Xiang Zhang.

@item 
bpo-27936@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27936}: The round() function accepted a second None argument for some
types but not for others.  Fixed the inconsistency by accepting None for
all numeric types.

@item 
bpo-27487@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27487}: Warn if a submodule argument to “python -m” or
runpy.run_module() is found in sys.modules after parent packages are
imported, but before the submodule is executed.

@item 
bpo-27558@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27558}: Fix a SystemError in the implementation of “raise” statement.
In a brand new thread, raise a RuntimeError since there is no active
exception to reraise. Patch written by Xiang Zhang.

@item 
bpo-27419@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27419}: Standard __import__() no longer look up “__import__” in globals
or builtins for importing submodules or “from import”.  Fixed handling an
error of non-string package name.

@item 
bpo-27083@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27083}: Respect the PYTHONCASEOK environment variable under Windows.

@item 
bpo-27514@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27514}: Make having too many statically nested blocks a SyntaxError
instead of SystemError.

@item 
bpo-27473@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27473}: Fixed possible integer overflow in bytes and bytearray
concatenations. Patch by Xiang Zhang.

@item 
bpo-27507@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27507}: Add integer overflow check in bytearray.extend().  Patch by
Xiang Zhang.

@item 
bpo-27581@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27581}: Don’t rely on wrapping for overflow check in
PySequence_Tuple().  Patch by Xiang Zhang.

@item 
bpo-27443@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27443}: __length_hint__() of bytearray iterators no longer return a
negative integer for a resized bytearray.

@item 
bpo-27942@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27942}: Fix memory leak in codeobject.c
@end itemize

@node Library<197>,IDLE<58>,Core and Builtins<193>,Python 3 5 3 release candidate 1
@anchor{whatsnew/changelog id1023}@anchor{1f97}
@subsubsection Library



@itemize -

@item 
bpo-15812@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15812}: inspect.getframeinfo() now correctly shows the first line of a
context. Patch by Sam Breese.

@item 
bpo-29094@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29094}: Offsets in a ZIP file created with extern file object and modes
“w” and “x” now are relative to the start of the file.

@item 
bpo-13051@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13051}: Fixed recursion errors in large or resized
curses.textpad.Textbox.  Based on patch by Tycho Andersen.

@item 
bpo-29119@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29119}: Fix weakrefs in the pure python version of
collections.OrderedDict move_to_end() method. Contributed by Andra
Bogildea.

@item 
bpo-9770@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9770}: curses.ascii predicates now work correctly with negative
integers.

@item 
bpo-28427@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28427}: old keys should not remove new values from WeakValueDictionary
when collecting from another thread.

@item 
bpo-28923@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28923}: Remove editor artifacts from Tix.py.

@item 
bpo-28871@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28871}: Fixed a crash when deallocate deep ElementTree.

@item 
bpo-19542@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19542}: Fix bugs in WeakValueDictionary.setdefault() and
WeakValueDictionary.pop() when a GC collection happens in another thread.

@item 
bpo-20191@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20191}: Fixed a crash in resource.prlimit() when pass a sequence that
doesn’t own its elements as limits.

@item 
bpo-28779@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28779}: multiprocessing.set_forkserver_preload() would crash the
forkserver process if a preloaded module instantiated some multiprocessing
objects such as locks.

@item 
bpo-28847@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28847}: dbm.dumb now supports reading read-only files and no longer
writes the index file when it is not changed.

@item 
bpo-25659@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25659}: In ctypes, prevent a crash calling the from_buffer() and
from_buffer_copy() methods on abstract classes like Array.

@item 
bpo-28732@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28732}: Fix crash in os.spawnv() with no elements in args

@item 
bpo-28485@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28485}: Always raise ValueError for negative
compileall.compile_dir(workers=…) parameter, even when multithreading is
unavailable.

@item 
bpo-28387@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28387}: Fixed possible crash in _io.TextIOWrapper deallocator when the
garbage collector is invoked in other thread.  Based on patch by Sebastian
Cufre.

@item 
bpo-27517@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27517}: LZMA compressor and decompressor no longer raise exceptions if
given empty data twice.  Patch by Benjamin Fogle.

@item 
bpo-28549@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28549}: Fixed segfault in curses’s addch() with ncurses6.

@item 
bpo-28449@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28449}: tarfile.open() with mode “r” or “r:” now tries to open a tar
file with compression before trying to open it without compression.
Otherwise it had 50% chance failed with ignore_zeros=True.

@item 
bpo-23262@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23262}: The webbrowser module now supports Firefox 36+ and derived
browsers.  Based on patch by Oleg Broytman.

@item 
bpo-27939@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27939}: Fixed bugs in tkinter.ttk.LabeledScale and tkinter.Scale caused
by representing the scale as float value internally in Tk.  tkinter.IntVar
now works if float value is set to underlying Tk variable.

@item 
bpo-28255@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28255}: calendar.TextCalendar().prmonth() no longer prints a space at
the start of new line after printing a month’s calendar.  Patch by Xiang
Zhang.

@item 
bpo-20491@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20491}: The textwrap.TextWrapper class now honors non-breaking spaces.
Based on patch by Kaarle Ritvanen.

@item 
bpo-28353@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28353}: os.fwalk() no longer fails on broken links.

@item 
bpo-25464@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25464}: Fixed HList.header_exists() in tkinter.tix module by addin a
workaround to Tix library bug.

@item 
bpo-28488@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28488}: shutil.make_archive() no longer add entry “./” to ZIP archive.

@item 
bpo-24452@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24452}: Make webbrowser support Chrome on Mac OS X.

@item 
bpo-20766@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20766}: Fix references leaked by pdb in the handling of SIGINT
handlers.

@item 
bpo-26293@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26293}: Fixed writing ZIP files that starts not from the start of the
file.  Offsets in ZIP file now are relative to the start of the archive in
conforming to the specification.

@item 
bpo-28321@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28321}: Fixed writing non-BMP characters with binary format in
plistlib.

@item 
bpo-28322@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28322}: Fixed possible crashes when unpickle itertools objects from
incorrect pickle data.  Based on patch by John Leitch.

@item 
Fix possible integer overflows and crashes in the mmap module with unusual
usage patterns.

@item 
bpo-1703178@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1703178}: Fix the ability to pass the –link-objects option to the
distutils build_ext command.

@item 
bpo-28253@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28253}: Fixed calendar functions for extreme months: 0001-01 and
9999-12. Methods itermonthdays() and itermonthdays2() are reimplemented so
that they don’t call itermonthdates() which can cause datetime.date
under/overflow.

@item 
bpo-28275@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28275}: Fixed possible use after free in the decompress() methods of
the LZMADecompressor and BZ2Decompressor classes. Original patch by John
Leitch.

@item 
bpo-27897@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27897}: Fixed possible crash in sqlite3.Connection.create_collation()
if pass invalid string-like object as a name.  Patch by Xiang Zhang.

@item 
bpo-18893@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18893}: Fix invalid exception handling in Lib/ctypes/macholib/dyld.py.
Patch by Madison May.

@item 
bpo-27611@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27611}: Fixed support of default root window in the tkinter.tix module.

@item 
bpo-27348@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27348}: In the traceback module, restore the formatting of exception
messages like “Exception: None”.  This fixes a regression introduced in
3.5a2.

@item 
bpo-25651@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25651}: Allow false values to be used for msg parameter of subTest().

@item 
bpo-27932@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27932}: Prevent memory leak in win32_ver().

@item 
Fix UnboundLocalError in socket._sendfile_use_sendfile.

@item 
bpo-28075@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28075}: Check for ERROR_ACCESS_DENIED in Windows implementation of
os.stat().  Patch by Eryk Sun.

@item 
bpo-25270@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25270}: Prevent codecs.escape_encode() from raising SystemError when an
empty bytestring is passed.

@item 
bpo-28181@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28181}: Get antigravity over HTTPS. Patch by Kaartic Sivaraam.

@item 
bpo-25895@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25895}: Enable WebSocket URL schemes in urllib.parse.urljoin. Patch by
Gergely Imreh and Markus Holtermann.

@item 
bpo-27599@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27599}: Fixed buffer overrun in binascii.b2a_qp() and
binascii.a2b_qp().

@item 
bpo-19003@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19003}: m email.generator now replaces only @code{\r} and/or @code{\n} line
endings, per the RFC, instead of all unicode line endings.

@item 
bpo-28019@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28019}: itertools.count() no longer rounds non-integer step in range
between 1.0 and 2.0 to 1.

@item 
bpo-25969@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25969}: Update the lib2to3 grammar to handle the unpacking
generalizations added in 3.5.

@item 
bpo-14977@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14977}: mailcap now respects the order of the lines in the mailcap
files (“first match”), as required by RFC 1542.  Patch by Michael Lazar.

@item 
bpo-24594@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24594}: Validates persist parameter when opening MSI database

@item 
bpo-17582@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17582}: xml.etree.ElementTree nows preserves whitespaces in attributes
(Patch by Duane Griffin.  Reviewed and approved by Stefan Behnel.)

@item 
bpo-28047@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28047}: Fixed calculation of line length used for the base64 CTE in the
new email policies.

@item 
bpo-27445@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27445}: Don’t pass str(_charset) to MIMEText.set_payload(). Patch by
Claude Paroz.

@item 
bpo-22450@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22450}: urllib now includes an @code{Accept: */*} header among the default
headers. This makes the results of REST API requests more consistent and
predictable especially when proxy servers are involved.

@item 
lib2to3.pgen3.driver.load_grammar() now creates a stable cache file
between runs given the same Grammar.txt input regardless of the hash
randomization setting.

@item 
bpo-27570@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27570}: Avoid zero-length memcpy() etc calls with null source pointers
in the “ctypes” and “array” modules.

@item 
bpo-22233@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22233}: Break email header lines `only' on the RFC specified CR and LF
characters, not on arbitrary unicode line breaks.  This also fixes a bug
in HTTP header parsing.

@item 
bpo-27988@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27988}: Fix email iter_attachments incorrect mutation of payload list.

@item 
bpo-27691@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27691}: Fix ssl module’s parsing of GEN_RID subject alternative name
fields in X.509 certs.

@item 
bpo-27850@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27850}: Remove 3DES from ssl module’s default cipher list to counter
measure sweet32 attack (
@geindex Common Vulnerabilities and Exposures; CVE 2016-2183
CVE 2016-2183@footnote{https://www.cve.org/CVERecord?id=CVE-2016-2183}).

@item 
bpo-27766@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27766}: Add ChaCha20 Poly1305 to ssl module’s default cipher list.
(Required OpenSSL 1.1.0 or LibreSSL).

@item 
bpo-26470@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26470}: Port ssl and hashlib module to OpenSSL 1.1.0.

@item 
Remove support for passing a file descriptor to os.access. It never worked
but previously didn’t raise.

@item 
bpo-12885@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12885}: Fix error when distutils encounters symlink.

@item 
bpo-27881@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27881}: Fixed possible bugs when setting
sqlite3.Connection.isolation_level. Based on patch by Xiang Zhang.

@item 
bpo-27861@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27861}: Fixed a crash in sqlite3.Connection.cursor() when a factory
creates not a cursor.  Patch by Xiang Zhang.

@item 
bpo-19884@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19884}: Avoid spurious output on OS X with Gnu Readline.

@item 
bpo-27706@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27706}: Restore deterministic behavior of random.Random().seed() for
string seeds using seeding version 1.  Allows sequences of calls to
random() to exactly match those obtained in Python 2. Patch by Nofar
Schnider.

@item 
bpo-10513@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10513}: Fix a regression in Connection.commit().  Statements should not
be reset after a commit.

@item 
A new version of typing.py from @indicateurl{https://github.com/python/typing}:
Collection (only for 3.6) (bpo-27598@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27598}). Add FrozenSet to __all__
(upstream #261). Fix crash in _get_type_vars() (upstream #259). Remove the
dict constraint in ForwardRef._eval_type (upstream #252).

@item 
bpo-27539@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27539}: Fix unnormalised @code{Fraction.__pow__} result in the case of
negative exponent and negative base.

@item 
bpo-21718@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21718}: cursor.description is now available for queries using CTEs.

@item 
bpo-2466@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2466}: posixpath.ismount now correctly recognizes mount points which
the user does not have permission to access.

@item 
bpo-27773@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27773}: Correct some memory management errors server_hostname in
_ssl.wrap_socket().

@item 
bpo-26750@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26750}: unittest.mock.create_autospec() now works properly for
subclasses of property() and other data descriptors.

@item 
In the curses module, raise an error if window.getstr() or window.instr()
is passed a negative value.

@item 
bpo-27783@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27783}: Fix possible usage of uninitialized memory in
operator.methodcaller.

@item 
bpo-27774@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27774}: Fix possible Py_DECREF on unowned object in _sre.

@item 
bpo-27760@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27760}: Fix possible integer overflow in binascii.b2a_qp.

@item 
bpo-27758@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27758}: Fix possible integer overflow in the _csv module for large
record lengths.

@item 
bpo-27568@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27568}: Prevent HTTPoxy attack (
@geindex Common Vulnerabilities and Exposures; CVE 2016-1000110
CVE 2016-1000110@footnote{https://www.cve.org/CVERecord?id=CVE-2016-1000110}). Ignore the
HTTP_PROXY variable when REQUEST_METHOD environment is set, which
indicates that the script is in CGI mode.

@item 
bpo-27656@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27656}: Do not assume sched.h defines any SCHED_* constants.

@item 
bpo-27130@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27130}: In the “zlib” module, fix handling of large buffers (typically
4 GiB) when compressing and decompressing.  Previously, inputs were
limited to 4 GiB, and compression and decompression operations did not
properly handle results of 4 GiB.

@item 
bpo-27533@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27533}: Release GIL in nt._isdir

@item 
bpo-17711@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17711}: Fixed unpickling by the persistent ID with protocol 0. Original
patch by Alexandre Vassalotti.

@item 
bpo-27522@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27522}: Avoid an unintentional reference cycle in email.feedparser.

@item 
bpo-26844@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26844}: Fix error message for imp.find_module() to refer to ‘path’
instead of ‘name’. Patch by Lev Maximov.

@item 
bpo-23804@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23804}: Fix SSL zero-length recv() calls to not block and not raise an
error about unclean EOF.

@item 
bpo-27466@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27466}: Change time format returned by http.cookie.time2netscape,
confirming the netscape cookie format and making it consistent with
documentation.

@item 
bpo-26664@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26664}: Fix activate.fish by removing mis-use of @code{$}.

@item 
bpo-22115@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22115}: Fixed tracing Tkinter variables: trace_vdelete() with wrong
mode no longer break tracing, trace_vinfo() now always returns a list of
pairs of strings, tracing in the “u” mode now works.

@item 
Fix a scoping issue in importlib.util.LazyLoader which triggered an
UnboundLocalError when lazy-loading a module that was already put into
sys.modules.

@item 
bpo-27079@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27079}: Fixed curses.ascii functions isblank(), iscntrl() and
ispunct().

@item 
bpo-26754@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26754}: Some functions (compile() etc) accepted a filename argument
encoded as an iterable of integers. Now only strings and byte-like objects
are accepted.

@item 
bpo-27048@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27048}: Prevents distutils failing on Windows when environment
variables contain non-ASCII characters

@item 
bpo-27330@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27330}: Fixed possible leaks in the ctypes module.

@item 
bpo-27238@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27238}: Got rid of bare excepts in the turtle module.  Original patch
by Jelle Zijlstra.

@item 
bpo-27122@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27122}: When an exception is raised within the context being managed by
a contextlib.ExitStack() and one of the exit stack generators catches and
raises it in a chain, do not re-raise the original exception when exiting,
let the new chained one through.  This avoids the 
@geindex Python Enhancement Proposals; PEP 479
PEP 479@footnote{https://peps.python.org/pep-0479/} bug described
in issue25782.

@item 
bpo-26386@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26386}: Fixed ttk.TreeView selection operations with item id’s
containing spaces.

@item 
bpo-16182@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16182}: Fix various functions in the “readline” module to use the
locale encoding, and fix get_begidx() and get_endidx() to return code
point indexes.

@item 
bpo-27392@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27392}: Add loop.connect_accepted_socket(). Patch by Jim Fulton.

@item 
bpo-27930@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27930}: Improved behaviour of logging.handlers.QueueListener. Thanks to
Paulo Andrade and Petr Viktorin for the analysis and patch.

@item 
bpo-21201@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21201}: Improves readability of multiprocessing error message.  Thanks
to Wojciech Walczak for patch.

@item 
bpo-27456@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27456}: asyncio: Set TCP_NODELAY by default.

@item 
bpo-27906@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27906}: Fix socket accept exhaustion during high TCP traffic. Patch by
Kevin Conway.

@item 
bpo-28174@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28174}: Handle when SO_REUSEPORT isn’t properly supported. Patch by
Seth Michael Larson.

@item 
bpo-26654@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26654}: Inspect functools.partial in asyncio.Handle.__repr__. Patch by
iceboy.

@item 
bpo-26909@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26909}: Fix slow pipes IO in asyncio. Patch by INADA Naoki.

@item 
bpo-28176@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28176}: Fix callbacks race in asyncio.SelectorLoop.sock_connect.

@item 
bpo-27759@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27759}: Fix selectors incorrectly retain invalid file descriptors.
Patch by Mark Williams.

@item 
bpo-28368@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28368}: Refuse monitoring processes if the child watcher has no loop
attached. Patch by Vincent Michel.

@item 
bpo-28369@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28369}: Raise RuntimeError when transport’s FD is used with add_reader,
add_writer, etc.

@item 
bpo-28370@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28370}: Speedup asyncio.StreamReader.readexactly. Patch by Коренберг
Марк.

@item 
bpo-28371@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28371}: Deprecate passing asyncio.Handles to run_in_executor.

@item 
bpo-28372@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28372}: Fix asyncio to support formatting of non-python coroutines.

@item 
bpo-28399@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28399}: Remove UNIX socket from FS before binding. Patch by Коренберг
Марк.

@item 
bpo-27972@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27972}: Prohibit Tasks to await on themselves.

@item 
bpo-26923@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26923}: Fix asyncio.Gather to refuse being cancelled once all children
are done. Patch by Johannes Ebke.

@item 
bpo-26796@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26796}: Don’t configure the number of workers for default threadpool
executor. Initial patch by Hans Lawrenz.

@item 
bpo-28600@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28600}: Optimize loop.call_soon().

@item 
bpo-28613@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28613}: Fix get_event_loop() return the current loop if called from
coroutines/callbacks.

@item 
bpo-28639@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28639}: Fix inspect.isawaitable to always return bool Patch by Justin
Mayfield.

@item 
bpo-28652@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28652}: Make loop methods reject socket kinds they do not support.

@item 
bpo-28653@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28653}: Fix a refleak in functools.lru_cache.

@item 
bpo-28703@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28703}: Fix asyncio.iscoroutinefunction to handle Mock objects.

@item 
bpo-24142@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24142}: Reading a corrupt config file left the parser in an invalid
state.  Original patch by Florian Höch.

@item 
bpo-28990@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28990}: Fix SSL hanging if connection is closed before handshake
completed. (Patch by HoHo-Ho)
@end itemize

@node IDLE<58>,C API<79>,Library<197>,Python 3 5 3 release candidate 1
@anchor{whatsnew/changelog id1024}@anchor{1f98}
@subsubsection IDLE



@itemize -

@item 
bpo-15308@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15308}: Add ‘interrupt execution’ (^C) to Shell menu. Patch by Roger
Serwy, updated by Bayard Randel.

@item 
bpo-27922@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27922}: Stop IDLE tests from ‘flashing’ gui widgets on the screen.

@item 
Add version to title of IDLE help window.

@item 
bpo-25564@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25564}: In section on IDLE – console differences, mention that using
exec means that __builtins__ is defined for each statement.

@item 
bpo-27714@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27714}: text_textview and test_autocomplete now pass when re-run in the
same process.  This occurs when test_idle fails when run with the -w
option but without -jn.  Fix warning from test_config.

@item 
bpo-25507@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25507}: IDLE no longer runs buggy code because of its tkinter imports.
Users must include the same imports required to run directly in Python.

@item 
bpo-27452@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27452}: add line counter and crc to IDLE configHandler test dump.

@item 
bpo-27365@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27365}: Allow non-ascii chars in IDLE NEWS.txt, for contributor names.

@item 
bpo-27245@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27245}: IDLE: Cleanly delete custom themes and key bindings.
Previously, when IDLE was started from a console or by import, a cascade
of warnings was emitted. Patch by Serhiy Storchaka.
@end itemize

@node C API<79>,Documentation<82>,IDLE<58>,Python 3 5 3 release candidate 1
@anchor{whatsnew/changelog id1025}@anchor{1f99}
@subsubsection C API



@itemize -

@item 
bpo-28808@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28808}: PyUnicode_CompareWithASCIIString() now never raises exceptions.

@item 
bpo-26754@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26754}: PyUnicode_FSDecoder() accepted a filename argument encoded as
an iterable of integers. Now only strings and bytes-like objects are
accepted.
@end itemize

@node Documentation<82>,Tests<83>,C API<79>,Python 3 5 3 release candidate 1
@anchor{whatsnew/changelog id1026}@anchor{1f9a}
@subsubsection Documentation



@itemize -

@item 
bpo-28513@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28513}: Documented command-line interface of zipfile.
@end itemize

@node Tests<83>,Tools/Demos<55>,Documentation<82>,Python 3 5 3 release candidate 1
@anchor{whatsnew/changelog id1027}@anchor{1f9b}
@subsubsection Tests



@itemize -

@item 
bpo-28950@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28950}: Disallow -j0 to be combined with -T/-l/-M in regrtest command
line arguments.

@item 
bpo-28666@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28666}: Now test.support.rmtree is able to remove unwritable or
unreadable directories.

@item 
bpo-23839@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23839}: Various caches now are cleared before running every test file.

@item 
bpo-28409@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28409}: regrtest: fix the parser of command line arguments.

@item 
bpo-27787@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27787}: Call gc.collect() before checking each test for “dangling
threads”, since the dangling threads are weak references.

@item 
bpo-27369@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27369}: In test_pyexpat, avoid testing an error message detail that
changed in Expat 2.2.0.
@end itemize

@node Tools/Demos<55>,Windows<80>,Tests<83>,Python 3 5 3 release candidate 1
@anchor{whatsnew/changelog id1028}@anchor{1f9c}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-27952@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27952}: Get Tools/scripts/fixcid.py working with Python 3 and the
current “re” module, avoid invalid Python backslash escapes, and fix a bug
parsing escaped C quote signs.

@item 
bpo-27332@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27332}: Fixed the type of the first argument of module-level functions
generated by Argument Clinic.  Patch by Petr Viktorin.

@item 
bpo-27418@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27418}: Fixed Tools/importbench/importbench.py.
@end itemize

@node Windows<80>,Build<94>,Tools/Demos<55>,Python 3 5 3 release candidate 1
@anchor{whatsnew/changelog id1029}@anchor{1f9d}
@subsubsection Windows



@itemize -

@item 
bpo-28251@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28251}: Improvements to help manuals on Windows.

@item 
bpo-28110@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28110}: launcher.msi has different product codes between 32-bit and
64-bit

@item 
bpo-25144@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25144}: Ensures TargetDir is set before continuing with custom install.

@item 
bpo-27469@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27469}: Adds a shell extension to the launcher so that drag and drop
works correctly.

@item 
bpo-27309@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27309}: Enabled proper Windows styles in python[w].exe manifest.
@end itemize

@node Build<94>,,Windows<80>,Python 3 5 3 release candidate 1
@anchor{whatsnew/changelog id1030}@anchor{1f9e}
@subsubsection Build



@itemize -

@item 
bpo-29080@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29080}: Removes hard dependency on hg.exe from PCBuild/build.bat

@item 
bpo-23903@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23903}: Added missed names to PC/python3.def.

@item 
bpo-10656@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10656}: Fix out-of-tree building on AIX.  Patch by Tristan Carel and
Michael Haubenwallner.

@item 
bpo-26359@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26359}: Rename –with-optimiations to –enable-optimizations.

@item 
bpo-28444@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28444}: Fix missing extensions modules when cross compiling.

@item 
bpo-28248@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28248}: Update Windows build and OS X installers to use OpenSSL 1.0.2j.

@item 
bpo-28258@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28258}: Fixed build with Estonian locale (python-config and distclean
targets in Makefile).  Patch by Arfrever Frehtes Taifersar Arahesis.

@item 
bpo-26661@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26661}: setup.py now detects system libffi with multiarch wrapper.

@item 
bpo-28066@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28066}: Fix the logic that searches build directories for generated
include files when building outside the source tree.

@item 
bpo-15819@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15819}: Remove redundant include search directory option for building
outside the source tree.

@item 
bpo-27566@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27566}: Fix clean target in freeze makefile (patch by Lisa Roach)

@item 
bpo-27705@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27705}: Update message in validate_ucrtbase.py

@item 
bpo-27983@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27983}: Cause lack of llvm-profdata tool when using clang as required
for PGO linking to be a configure time error rather than make time when
–with-optimizations is enabled.  Also improve our ability to find the
llvm-profdata tool on MacOS and some Linuxes.

@item 
bpo-26307@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26307}: The profile-opt build now applies PGO to the built-in modules.

@item 
bpo-26359@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26359}: Add the –with-optimizations configure flag.

@item 
bpo-27713@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27713}: Suppress spurious build warnings when updating importlib’s
bootstrap files. Patch by Xiang Zhang

@item 
bpo-25825@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25825}: Correct the references to Modules/python.exp and ld_so_aix,
which are required on AIX.  This updates references to an installation
path that was changed in 3.2a4, and undoes changed references to the build
tree that were made in 3.5.0a1.

@item 
bpo-27453@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27453}: CPP invocation in configure must use CPPFLAGS. Patch by Chi
Hsuan Yen.

@item 
bpo-27641@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27641}: The configure script now inserts comments into the makefile to
prevent the pgen and _freeze_importlib executables from being
cross-compiled.

@item 
bpo-26662@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26662}: Set PYTHON_FOR_GEN in configure as the Python program to be
used for file generation during the build.

@item 
bpo-10910@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10910}: Avoid C++ compilation errors on FreeBSD and OS X. Also update
FreedBSD version checks for the original ctype UTF-8 workaround.

@item 
bpo-28676@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28676}: Prevent missing ‘getentropy’ declaration warning on macOS.
Patch by Gareth Rees.
@end itemize

@node Python 3 5 2 final,Python 3 5 2 release candidate 1,Python 3 5 3 release candidate 1,Changelog
@anchor{whatsnew/changelog python-3-5-2-final}@anchor{1f9f}
@subsection Python 3.5.2 final


`Release date: 2016-06-26'

@menu
* Core and Builtins: Core and Builtins<194>. 
* Tests: Tests<84>. 
* IDLE: IDLE<59>. 

@end menu

@node Core and Builtins<194>,Tests<84>,,Python 3 5 2 final
@anchor{whatsnew/changelog id1031}@anchor{1fa0}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-26930@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26930}: Update Windows builds to use OpenSSL 1.0.2h.
@end itemize

@node Tests<84>,IDLE<59>,Core and Builtins<194>,Python 3 5 2 final
@anchor{whatsnew/changelog id1032}@anchor{1fa1}
@subsubsection Tests



@itemize -

@item 
bpo-26867@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26867}: Ubuntu’s openssl OP_NO_SSLv3 is forced on by default; fix test.
@end itemize

@node IDLE<59>,,Tests<84>,Python 3 5 2 final
@anchor{whatsnew/changelog id1033}@anchor{1fa2}
@subsubsection IDLE



@itemize -

@item 
bpo-27365@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27365}: Allow non-ascii in idlelib/NEWS.txt - minimal part for 3.5.2.
@end itemize

@node Python 3 5 2 release candidate 1,Python 3 5 1 final,Python 3 5 2 final,Changelog
@anchor{whatsnew/changelog python-3-5-2-release-candidate-1}@anchor{1fa3}
@subsection Python 3.5.2 release candidate 1


`Release date: 2016-06-12'

@menu
* Security: Security<64>. 
* Core and Builtins: Core and Builtins<195>. 
* Library: Library<198>. 
* IDLE: IDLE<60>. 
* Documentation: Documentation<83>. 
* Tests: Tests<85>. 
* Build: Build<95>. 
* Windows: Windows<81>. 
* Tools/Demos: Tools/Demos<56>. 

@end menu

@node Security<64>,Core and Builtins<195>,,Python 3 5 2 release candidate 1
@anchor{whatsnew/changelog id1034}@anchor{1fa4}
@subsubsection Security



@itemize -

@item 
bpo-26556@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26556}: Update expat to 2.1.1, fixes 
@geindex Common Vulnerabilities and Exposures; CVE 2015-1283
CVE 2015-1283@footnote{https://www.cve.org/CVERecord?id=CVE-2015-1283}.

@item 
Fix TLS stripping vulnerability in smtplib, 
@geindex Common Vulnerabilities and Exposures; CVE 2016-0772
CVE 2016-0772@footnote{https://www.cve.org/CVERecord?id=CVE-2016-0772}. Reported by
Team Oststrom.

@item 
bpo-26839@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26839}: On Linux, @ref{747,,os.urandom()} now calls @code{getrandom()} with
@code{GRND_NONBLOCK} to fall back on reading @code{/dev/urandom} if the urandom
entropy pool is not initialized yet. Patch written by Colm Buckley.

@item 
bpo-26657@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26657}: Fix directory traversal vulnerability with http.server on
Windows.  This fixes a regression that was introduced in 3.3.4rc1 and
3.4.0rc1.  Based on patch by Philipp Hagemeister.

@item 
bpo-26313@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26313}: ssl.py _load_windows_store_certs fails if windows cert store is
empty. Patch by Baji.

@item 
bpo-25939@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25939}: On Windows open the cert store readonly in
ssl.enum_certificates.
@end itemize

@node Core and Builtins<195>,Library<198>,Security<64>,Python 3 5 2 release candidate 1
@anchor{whatsnew/changelog id1035}@anchor{1fa5}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-27066@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27066}: Fixed SystemError if a custom opener (for open()) returns a
negative number without setting an exception.

@item 
bpo-20041@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20041}: Fixed TypeError when frame.f_trace is set to None. Patch by
Xavier de Gaye.

@item 
bpo-26168@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26168}: Fixed possible refleaks in failing Py_BuildValue() with the “N”
format unit.

@item 
bpo-26991@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26991}: Fix possible refleak when creating a function with annotations.

@item 
bpo-27039@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27039}: Fixed bytearray.remove() for values greater than 127.  Patch by
Joe Jevnik.

@item 
bpo-23640@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23640}: int.from_bytes() no longer bypasses constructors for
subclasses.

@item 
bpo-26811@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26811}: gc.get_objects() no longer contains a broken tuple with NULL
pointer.

@item 
bpo-20120@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20120}: Use RawConfigParser for .pypirc parsing, removing support for
interpolation unintentionally added with move to Python 3. Behavior no
longer does any interpolation in .pypirc files, matching behavior in
Python 2.7 and Setuptools 19.0.

@item 
bpo-26659@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26659}: Make the builtin slice type support cycle collection.

@item 
bpo-26718@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26718}: super.__init__ no longer leaks memory if called multiple times.
NOTE: A direct call of super.__init__ is not endorsed!

@item 
bpo-25339@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25339}: PYTHONIOENCODING now has priority over locale in setting the
error handler for stdin and stdout.

@item 
bpo-26494@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26494}: Fixed crash on iterating exhausting iterators. Affected classes
are generic sequence iterators, iterators of str, bytes, bytearray, list,
tuple, set, frozenset, dict, OrderedDict, corresponding views and
os.scandir() iterator.

@item 
bpo-26581@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26581}: If coding cookie is specified multiple times on a line in
Python source code file, only the first one is taken to account.

@item 
bpo-26464@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26464}: Fix str.translate() when string is ASCII and first replacements
removes character, but next replacement uses a non-ASCII character or a
string longer than 1 character. Regression introduced in Python 3.5.0.

@item 
bpo-22836@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22836}: Ensure exception reports from PyErr_Display() and
PyErr_WriteUnraisable() are sensible even when formatting them produces
secondary errors.  This affects the reports produced by
sys.__excepthook__() and when __del__() raises an exception.

@item 
bpo-26302@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26302}: Correct behavior to reject comma as a legal character for
cookie names.

@item 
bpo-4806@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4806}: Avoid masking the original TypeError exception when using star
(@code{*}) unpacking in function calls.  Based on patch by Hagen Fürstenau
and Daniel Urban.

@item 
bpo-27138@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27138}: Fix the doc comment for FileFinder.find_spec().

@item 
bpo-26154@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26154}: Add a new private _PyThreadState_UncheckedGet() function to get
the current Python thread state, but don’t issue a fatal error if it is
NULL. This new function must be used instead of accessing directly the
_PyThreadState_Current variable.  The variable is no more exposed since
Python 3.5.1 to hide the exact implementation of atomic C types, to avoid
compiler issues.

@item 
bpo-26194@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26194}: Deque.insert() gave odd results for bounded deques that had
reached their maximum size.  Now an IndexError will be raised when
attempting to insert into a full deque.

@item 
bpo-25843@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25843}: When compiling code, don’t merge constants if they are equal
but have a different types. For example, @code{f1, f2 = lambda: 1, lambda:
1.0} is now correctly compiled to two different functions: @code{f1()}
returns @code{1} (@code{int}) and @code{f2()} returns @code{1.0} (@code{int}), even if
@code{1} and @code{1.0} are equal.

@item 
bpo-22995@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22995}: [UPDATE] Comment out the one of the pickleability tests in
_PyObject_GetState() due to regressions observed in Cython-based projects.

@item 
bpo-25961@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25961}: Disallowed null characters in the type name.

@item 
bpo-25973@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25973}: Fix segfault when an invalid nonlocal statement binds a name
starting with two underscores.

@item 
bpo-22995@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22995}: Instances of extension types with a state that aren’t
subclasses of list or dict and haven’t implemented any pickle-related
methods (__reduce__, __reduce_ex__, __getnewargs__, __getnewargs_ex__, or
__getstate__), can no longer be pickled.  Including memoryview.

@item 
bpo-20440@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20440}: Massive replacing unsafe attribute setting code with special
macro Py_SETREF.

@item 
bpo-25766@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25766}: Special method __bytes__() now works in str subclasses.

@item 
bpo-25421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25421}: __sizeof__ methods of builtin types now use dynamic basic size.
This allows sys.getsize() to work correctly with their subclasses with
__slots__ defined.

@item 
bpo-25709@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25709}: Fixed problem with in-place string concatenation and utf-8
cache.

@item 
bpo-27147@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27147}: Mention 
@geindex Python Enhancement Proposals; PEP 420
PEP 420@footnote{https://peps.python.org/pep-0420/} in the importlib docs.

@item 
bpo-24097@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24097}: Fixed crash in object.__reduce__() if slot name is freed inside
__getattr__.

@item 
bpo-24731@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24731}: Fixed crash on converting objects with special methods
__bytes__, __trunc__, and __float__ returning instances of subclasses of
bytes, int, and float to subclasses of bytes, int, and float
correspondingly.

@item 
bpo-26478@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26478}: Fix semantic bugs when using binary operators with dictionary
views and tuples.

@item 
bpo-26171@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26171}: Fix possible integer overflow and heap corruption in
zipimporter.get_data().

@item 
bpo-25660@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25660}: Fix TAB key behaviour in REPL with readline.

@item 
bpo-25887@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25887}: Raise a RuntimeError when a coroutine object is awaited more
than once.

@item 
bpo-27243@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27243}: Update the __aiter__ protocol: instead of returning an
awaitable that resolves to an asynchronous iterator, the asynchronous
iterator should be returned directly.  Doing the former will trigger a
PendingDeprecationWarning.
@end itemize

@node Library<198>,IDLE<60>,Core and Builtins<195>,Python 3 5 2 release candidate 1
@anchor{whatsnew/changelog id1036}@anchor{1fa6}
@subsubsection Library



@itemize -

@item 
bpo-21386@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21386}: Implement missing IPv4Address.is_global property.  It was
documented since 07a5610bae9d.  Initial patch by Roger Luethi.

@item 
bpo-20900@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20900}: distutils register command now decodes HTTP responses
correctly.  Initial patch by ingrid.

@item 
A new version of typing.py provides several new classes and features:
@@overload outside stubs, Reversible, DefaultDict, Text, ContextManager,
Type[], NewType(), TYPE_CHECKING, and numerous bug fixes (note that some
of the new features are not yet implemented in mypy or other static
analyzers). Also classes for 
@geindex Python Enhancement Proposals; PEP 492
PEP 492@footnote{https://peps.python.org/pep-0492/} (Awaitable, AsyncIterable,
AsyncIterator) have been added (in fact they made it into 3.5.1 but were
never mentioned).

@item 
bpo-25738@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25738}: Stop http.server.BaseHTTPRequestHandler.send_error() from
sending a message body for 205 Reset Content.  Also, don’t send Content
header fields in responses that don’t have a body.  Patch by Susumu
Koshiba.

@item 
bpo-21313@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21313}: Fix the “platform” module to tolerate when sys.version contains
truncated build information.

@item 
bpo-27164@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27164}: In the zlib module, allow decompressing raw Deflate streams
with a predefined zdict.  Based on patch by Xiang Zhang.

@item 
bpo-24291@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24291}: Fix wsgiref.simple_server.WSGIRequestHandler to completely
write data to the client.  Previously it could do partial writes and
truncate data.  Also, wsgiref.handler.ServerHandler can now handle stdout
doing partial writes, but this is deprecated.

@item 
bpo-26809@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26809}: Add @code{__all__} to @ref{d8,,string}.  Patch by Emanuel Barry.

@item 
bpo-26373@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26373}: subprocess.Popen.communicate now correctly ignores
BrokenPipeError when the child process dies before .communicate() is
called in more/all circumstances.

@item 
bpo-21776@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21776}: distutils.upload now correctly handles HTTPError. Initial patch
by Claudiu Popa.

@item 
bpo-27114@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27114}: Fix SSLContext._load_windows_store_certs fails with
PermissionError

@item 
bpo-18383@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18383}: Avoid creating duplicate filters when using filterwarnings and
simplefilter. Based on patch by Alex Shkop.

@item 
bpo-27057@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27057}: Fix os.set_inheritable() on Android, ioctl() is blocked by
SELinux and fails with EACCESS. The function now falls back to fcntl().
Patch written by Michał Bednarski.

@item 
bpo-27014@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27014}: Fix infinite recursion using typing.py.  Thanks to Kalle Tuure!

@item 
bpo-14132@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14132}: Fix urllib.request redirect handling when the target only has a
query string.  Original fix by Ján Janech.

@item 
bpo-17214@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17214}: The “urllib.request” module now percent-encodes non-ASCII bytes
found in redirect target URLs.  Some servers send Location header fields
with non-ASCII bytes, but “http.client” requires the request target to be
ASCII-encodable, otherwise a UnicodeEncodeError is raised.  Based on patch
by Christian Heimes.

@item 
bpo-26892@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26892}: Honor debuglevel flag in urllib.request.HTTPHandler. Patch
contributed by Chi Hsuan Yen.

@item 
bpo-22274@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22274}: In the subprocess module, allow stderr to be redirected to
stdout even when stdout is not redirected.  Patch by Akira Li.

@item 
bpo-26807@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26807}: mock_open ‘files’ no longer error on readline at end of file.
Patch from Yolanda Robla.

@item 
bpo-25745@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25745}: Fixed leaking a userptr in curses panel destructor.

@item 
bpo-26977@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26977}: Removed unnecessary, and ignored, call to sum of squares helper
in statistics.pvariance.

@item 
bpo-26881@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26881}: The modulefinder module now supports extended opcode arguments.

@item 
bpo-23815@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23815}: Fixed crashes related to directly created instances of types in
_tkinter and curses.panel modules.

@item 
bpo-17765@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17765}: weakref.ref() no longer silently ignores keyword arguments.
Patch by Georg Brandl.

@item 
bpo-26873@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26873}: xmlrpc now raises ResponseError on unsupported type tags
instead of silently return incorrect result.

@item 
bpo-26711@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26711}: Fixed the comparison of plistlib.Data with other types.

@item 
bpo-24114@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24114}: Fix an uninitialized variable in @code{ctypes.util}. The bug only
occurs on SunOS when the ctypes implementation searches for the @code{crle}
program. Patch by Xiang Zhang.  Tested on SunOS by Kees Bos.

@item 
bpo-26864@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26864}: In urllib.request, change the proxy bypass host checking
against no_proxy to be case-insensitive, and to not match unrelated host
names that happen to have a bypassed hostname as a suffix.  Patch by Xiang
Zhang.

@item 
bpo-26634@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26634}: recursive_repr() now sets __qualname__ of wrapper.  Patch by
Xiang Zhang.

@item 
bpo-26804@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26804}: urllib.request will prefer lower_case proxy environment
variables over UPPER_CASE or Mixed_Case ones. Patch contributed by
Hans-Peter Jansen.

@item 
bpo-26837@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26837}: assertSequenceEqual() now correctly outputs non-stringified
differing items (like bytes in the -b mode).  This affects
assertListEqual() and assertTupleEqual().

@item 
bpo-26041@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26041}: Remove “will be removed in Python 3.7” from deprecation
messages of platform.dist() and platform.linux_distribution(). Patch by
Kumaripaba Miyurusara Athukorala.

@item 
bpo-26822@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26822}: itemgetter, attrgetter and methodcaller objects no longer
silently ignore keyword arguments.

@item 
bpo-26733@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26733}: Disassembling a class now disassembles class and static
methods. Patch by Xiang Zhang.

@item 
bpo-26801@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26801}: Fix error handling in @ref{130f,,shutil.get_terminal_size()}, catch
@ref{5f0,,AttributeError} instead of @ref{450,,NameError}. Patch written by
Emanuel Barry.

@item 
bpo-24838@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24838}: tarfile’s ustar and gnu formats now correctly calculate name
and link field limits for multibyte character encodings like utf-8.

@item 
bpo-26717@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26717}: Stop encoding Latin-1-ized WSGI paths with UTF-8.  Patch by
Anthony Sottile.

@item 
bpo-26735@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26735}: Fix @ref{747,,os.urandom()} on Solaris 11.3 and newer when reading
more than 1,024 bytes: call @code{getrandom()} multiple times with a limit of
1024 bytes per call.

@item 
bpo-16329@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16329}: Add .webm to mimetypes.types_map.  Patch by Giampaolo Rodola’.

@item 
bpo-13952@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13952}: Add .csv to mimetypes.types_map.  Patch by Geoff Wilson.

@item 
bpo-26709@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26709}: Fixed Y2038 problem in loading binary PLists.

@item 
bpo-23735@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23735}: Handle terminal resizing with Readline 6.3+ by installing our
own SIGWINCH handler.  Patch by Eric Price.

@item 
bpo-26586@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26586}: In http.server, respond with “413 Request header fields too
large” if there are too many header fields to parse, rather than killing
the connection and raising an unhandled exception.  Patch by Xiang Zhang.

@item 
bpo-22854@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22854}: Change BufferedReader.writable() and BufferedWriter.readable()
to always return False.

@item 
bpo-25195@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25195}: Fix a regression in mock.MagicMock. _Call is a subclass of
tuple (changeset 3603bae63c13 only works for classes) so we need to
implement __ne__ ourselves.  Patch by Andrew Plummer.

@item 
bpo-26644@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26644}: Raise ValueError rather than SystemError when a negative length
is passed to SSLSocket.recv() or read().

@item 
bpo-23804@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23804}: Fix SSL recv(0) and read(0) methods to return zero bytes
instead of up to 1024.

@item 
bpo-26616@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26616}: Fixed a bug in datetime.astimezone() method.

@item 
bpo-21925@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21925}: @ref{1e3b,,warnings.formatwarning()} now catches exceptions on
@code{linecache.getline(...)} to be able to log @ref{54d,,ResourceWarning}
emitted late during the Python shutdown process.

@item 
bpo-24266@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24266}: Ctrl+C during Readline history search now cancels the search
mode when compiled with Readline 7.

@item 
bpo-26560@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26560}: Avoid potential ValueError in BaseHandler.start_response.
Initial patch by Peter Inglesby.

@item 
bpo-26569@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26569}: Fix @ref{a32,,pyclbr.readmodule()} and @ref{a33,,pyclbr.readmodule_ex()}
to support importing packages.

@item 
bpo-26499@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26499}: Account for remaining Content-Length in HTTPResponse.readline()
and read1(). Based on patch by Silent Ghost. Also document that
HTTPResponse now supports these methods.

@item 
bpo-25320@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25320}: Handle sockets in directories unittest discovery is scanning.
Patch from Victor van den Elzen.

@item 
bpo-16181@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16181}: cookiejar.http2time() now returns None if year is higher than
datetime.MAXYEAR.

@item 
bpo-26513@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26513}: Fixes platform module detection of Windows Server

@item 
bpo-23718@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23718}: Fixed parsing time in week 0 before Jan 1.  Original patch by
Tamás Bence Gedai.

@item 
bpo-20589@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20589}: Invoking Path.owner() and Path.group() on Windows now raise
NotImplementedError instead of ImportError.

@item 
bpo-26177@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26177}: Fixed the keys() method for Canvas and Scrollbar widgets.

@item 
bpo-15068@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15068}: Got rid of excessive buffering in the fileinput module. The
bufsize parameter is no longer used.

@item 
bpo-2202@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2202}: Fix UnboundLocalError in
AbstractDigestAuthHandler.get_algorithm_impls. Initial patch by Mathieu
Dupuy.

@item 
bpo-25718@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25718}: Fixed pickling and copying the accumulate() iterator with total
is None.

@item 
bpo-26475@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26475}: Fixed debugging output for regular expressions with the (?x)
flag.

@item 
bpo-26457@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26457}: Fixed the subnets() methods in IP network classes for the case
when resulting prefix length is equal to maximal prefix length. Based on
patch by Xiang Zhang.

@item 
bpo-26385@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26385}: Remove the file if the internal open() call in
NamedTemporaryFile() fails. Patch by Silent Ghost.

@item 
bpo-26402@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26402}: Fix XML-RPC client to retry when the server shuts down a
persistent connection.  This was a regression related to the new
http.client.RemoteDisconnected exception in 3.5.0a4.

@item 
bpo-25913@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25913}: Leading @code{<~} is optional now in base64.a85decode() with
adobe=True.  Patch by Swati Jaiswal.

@item 
bpo-26186@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26186}: Remove an invalid type check in importlib.util.LazyLoader.

@item 
bpo-26367@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26367}: importlib.__import__() raises SystemError like
builtins.__import__() when @code{level} is specified but without an
accompanying package specified.

@item 
bpo-26309@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26309}: In the “socketserver” module, shut down the request (closing
the connected socket) when verify_request() returns false.  Patch by Aviv
Palivoda.

@item 
bpo-25995@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25995}: os.walk() no longer uses FDs proportional to the tree depth.

@item 
bpo-26117@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26117}: The os.scandir() iterator now closes file descriptor not only
when the iteration is finished, but when it was failed with error.

@item 
bpo-25911@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25911}: Restored support of bytes paths in os.walk() on Windows.

@item 
bpo-26045@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26045}: Add UTF-8 suggestion to error message when posting a
non-Latin-1 string with http.client.

@item 
bpo-12923@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12923}: Reset FancyURLopener’s redirect counter even if there is an
exception. Based on patches by Brian Brazil and Daniel Rocco.

@item 
bpo-25945@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25945}: Fixed a crash when unpickle the functools.partial object with
wrong state. Fixed a leak in failed functools.partial constructor. “args”
and “keywords” attributes of functools.partial have now always types tuple
and dict correspondingly.

@item 
bpo-26202@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26202}: copy.deepcopy() now correctly copies range() objects with
non-atomic attributes.

@item 
bpo-23076@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23076}: Path.glob() now raises a ValueError if it’s called with an
invalid pattern. Patch by Thomas Nyberg.

@item 
bpo-19883@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19883}: Fixed possible integer overflows in zipimport.

@item 
bpo-26227@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26227}: On Windows, getnameinfo(), gethostbyaddr() and
gethostbyname_ex() functions of the socket module now decode the hostname
from the ANSI code page rather than UTF-8.

@item 
bpo-26147@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26147}: xmlrpc now works with strings not encodable with used non-UTF-8
encoding.

@item 
bpo-25935@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25935}: Garbage collector now breaks reference loops with OrderedDict.

@item 
bpo-16620@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16620}: Fixed AttributeError in msilib.Directory.glob().

@item 
bpo-26013@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26013}: Added compatibility with broken protocol 2 pickles created in
old Python 3 versions (3.4.3 and lower).

@item 
bpo-25850@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25850}: Use cross-compilation by default for 64-bit Windows.

@item 
bpo-17633@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17633}: Improve zipimport’s support for namespace packages.

@item 
bpo-24705@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24705}: Fix sysconfig._parse_makefile not expanding $@{@} vars appearing
before $() vars.

@item 
bpo-22138@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22138}: Fix mock.patch behavior when patching descriptors. Restore
original values after patching. Patch contributed by Sean McCully.

@item 
bpo-25672@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25672}: In the ssl module, enable the SSL_MODE_RELEASE_BUFFERS mode
option if it is safe to do so.

@item 
bpo-26012@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26012}: Don’t traverse into symlinks for @code{**} pattern in
pathlib.Path.[r]glob().

@item 
bpo-24120@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24120}: Ignore PermissionError when traversing a tree with
pathlib.Path.[r]glob(). Patch by Ulrich Petri.

@item 
bpo-25447@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25447}: fileinput now uses sys.stdin as-is if it does not have a buffer
attribute (restores backward compatibility).

@item 
bpo-25447@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25447}: Copying the lru_cache() wrapper object now always works,
independently from the type of the wrapped object (by returning the
original object unchanged).

@item 
bpo-24103@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24103}: Fixed possible use after free in ElementTree.XMLPullParser.

@item 
bpo-25860@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25860}: os.fwalk() no longer skips remaining directories when error
occurs. Original patch by Samson Lee.

@item 
bpo-25914@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25914}: Fixed and simplified OrderedDict.__sizeof__.

@item 
bpo-25902@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25902}: Fixed various refcount issues in ElementTree iteration.

@item 
bpo-25717@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25717}: Restore the previous behaviour of tolerating most fstat()
errors when opening files.  This was a regression in 3.5a1, and stopped
anonymous temporary files from working in special cases.

@item 
bpo-24903@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24903}: Fix regression in number of arguments compileall accepts when
‘-d’ is specified.  The check on the number of arguments has been dropped
completely as it never worked correctly anyway.

@item 
bpo-25764@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25764}: In the subprocess module, preserve any exception caused by
fork() failure when preexec_fn is used.

@item 
bpo-6478@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6478}: _strptime’s regexp cache now is reset after changing timezone
with time.tzset().

@item 
bpo-14285@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14285}: When executing a package with the “python -m package” option,
and package initialization fails, a proper traceback is now reported.  The
“runpy” module now lets exceptions from package initialization pass back
to the caller, rather than raising ImportError.

@item 
bpo-19771@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19771}: Also in runpy and the “-m” option, omit the irrelevant message
“… is a package and cannot be directly executed” if the package could
not even be initialized (e.g. due to a bad @code{*.pyc} file).

@item 
bpo-25177@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25177}: Fixed problem with the mean of very small and very large
numbers. As a side effect, statistics.mean and statistics.variance should
be significantly faster.

@item 
bpo-25718@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25718}: Fixed copying object with state with boolean value is false.

@item 
bpo-10131@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10131}: Fixed deep copying of minidom documents.  Based on patch by
Marian Ganisin.

@item 
bpo-25725@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25725}: Fixed a reference leak in pickle.loads() when unpickling
invalid data including tuple instructions.

@item 
bpo-25663@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25663}: In the Readline completer, avoid listing duplicate global
names, and search the global namespace before searching builtins.

@item 
bpo-25688@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25688}: Fixed file leak in ElementTree.iterparse() raising an error.

@item 
bpo-23914@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23914}: Fixed SystemError raised by unpickler on broken pickle data.

@item 
bpo-25691@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25691}: Fixed crash on deleting ElementTree.Element attributes.

@item 
bpo-25624@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25624}: ZipFile now always writes a ZIP_STORED header for directory
entries.  Patch by Dingyuan Wang.

@item 
Skip getaddrinfo if host is already resolved. Patch by A. Jesse Jiryu
Davis.

@item 
bpo-26050@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26050}: Add asyncio.StreamReader.readuntil() method. Patch by Марк
Коренберг.

@item 
bpo-25924@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25924}: Avoid unnecessary serialization of getaddrinfo(3) calls on OS X
versions 10.5 or higher.  Original patch by A. Jesse Jiryu Davis.

@item 
bpo-26406@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26406}: Avoid unnecessary serialization of getaddrinfo(3) calls on
current versions of OpenBSD and NetBSD.  Patch by A. Jesse Jiryu Davis.

@item 
bpo-26848@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26848}: Fix asyncio/subprocess.communicate() to handle empty input.
Patch by Jack O’Connor.

@item 
bpo-27040@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27040}: Add loop.get_exception_handler method

@item 
bpo-27041@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27041}: asyncio: Add loop.create_future method

@item 
bpo-27223@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27223}: asyncio: Fix _read_ready and _write_ready to respect
_conn_lost. Patch by Łukasz Langa.

@item 
bpo-22970@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22970}: asyncio: Fix inconsistency cancelling Condition.wait. Patch by
David Coles.
@end itemize

@node IDLE<60>,Documentation<83>,Library<198>,Python 3 5 2 release candidate 1
@anchor{whatsnew/changelog id1037}@anchor{1fa7}
@subsubsection IDLE



@itemize -

@item 
bpo-5124@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5124}: Paste with text selected now replaces the selection on X11. This
matches how paste works on Windows, Mac, most modern Linux apps, and ttk
widgets. Original patch by Serhiy Storchaka.

@item 
bpo-24759@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24759}: Make clear in idlelib.idle_test.__init__ that the directory is
a private implementation of test.test_idle and tool for maintainers.

@item 
bpo-27196@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27196}: Stop ‘ThemeChanged’ warnings when running IDLE tests. These
persisted after other warnings were suppressed in #20567. Apply Serhiy
Storchaka’s update_idletasks solution to four test files. Record this
additional advice in idle_test/README.txt

@item 
bpo-20567@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20567}: Revise idle_test/README.txt with advice about avoiding tk
warning messages from tests.  Apply advice to several IDLE tests.

@item 
bpo-27117@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27117}: Make colorizer htest and turtledemo work with dark themes. Move
code for configuring text widget colors to a new function.

@item 
bpo-26673@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26673}: When tk reports font size as 0, change to size 10. Such fonts
on Linux prevented the configuration dialog from opening.

@item 
bpo-21939@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21939}: Add test for IDLE’s percolator. Original patch by Saimadhav
Heblikar.

@item 
bpo-21676@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21676}: Add test for IDLE’s replace dialog. Original patch by Saimadhav
Heblikar.

@item 
bpo-18410@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18410}: Add test for IDLE’s search dialog. Original patch by Westley
Martínez.

@item 
bpo-21703@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21703}: Add test for IDLE’s undo delegator. Original patch by Saimadhav
Heblikar .

@item 
bpo-27044@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27044}: Add ConfigDialog.remove_var_callbacks to stop memory leaks.

@item 
bpo-23977@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23977}: Add more asserts to test_delegator.

@item 
bpo-20640@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20640}: Add tests for idlelib.configHelpSourceEdit. Patch by Saimadhav
Heblikar.

@item 
In the ‘IDLE-console differences’ section of the IDLE doc, clarify how
running with IDLE affects sys.modules and the standard streams.

@item 
bpo-25507@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25507}: fix incorrect change in IOBinding that prevented printing.
Augment IOBinding htest to include all major IOBinding functions.

@item 
bpo-25905@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25905}: Revert unwanted conversion of ‘ to ’ RIGHT SINGLE QUOTATION
MARK in README.txt and open this and NEWS.txt with ‘ascii’. Re-encode
CREDITS.txt to utf-8 and open it with ‘utf-8’.
@end itemize

@node Documentation<83>,Tests<85>,IDLE<60>,Python 3 5 2 release candidate 1
@anchor{whatsnew/changelog id1038}@anchor{1fa8}
@subsubsection Documentation



@itemize -

@item 
bpo-19489@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19489}: Moved the search box from the sidebar to the header and footer
of each page. Patch by Ammar Askar.

@item 
bpo-24136@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24136}: Document the new 
@geindex Python Enhancement Proposals; PEP 448
PEP 448@footnote{https://peps.python.org/pep-0448/} unpacking syntax of 3.5.

@item 
bpo-26736@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26736}: Used HTTPS for external links in the documentation if possible.

@item 
bpo-6953@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6953}: Rework the Readline module documentation to group related
functions together, and add more details such as what underlying Readline
functions and variables are accessed.

@item 
bpo-23606@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23606}: Adds note to ctypes documentation regarding cdll.msvcrt.

@item 
bpo-25500@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25500}: Fix documentation to not claim that __import__ is searched for
in the global scope.

@item 
bpo-26014@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26014}: Update 3.x packaging documentation: * “See also” links to the
new docs are now provided in the legacy pages * links to setuptools
documentation have been updated
@end itemize

@node Tests<85>,Build<95>,Documentation<83>,Python 3 5 2 release candidate 1
@anchor{whatsnew/changelog id1039}@anchor{1fa9}
@subsubsection Tests



@itemize -

@item 
bpo-21916@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21916}: Added tests for the turtle module.  Patch by ingrid, Gregory
Loyse and Jelle Zijlstra.

@item 
bpo-26523@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26523}: The multiprocessing thread pool (multiprocessing.dummy.Pool)
was untested.

@item 
bpo-26015@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26015}: Added new tests for pickling iterators of mutable sequences.

@item 
bpo-26325@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26325}: Added test.support.check_no_resource_warning() to check that no
ResourceWarning is emitted.

@item 
bpo-25940@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25940}: Changed test_ssl to use self-signed.pythontest.net.  This
avoids relying on svn.python.org, which recently changed root certificate.

@item 
bpo-25616@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25616}: Tests for OrderedDict are extracted from test_collections into
separate file test_ordered_dict.

@item 
bpo-26583@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26583}: Skip test_timestamp_overflow in test_import if bytecode files
cannot be written.
@end itemize

@node Build<95>,Windows<81>,Tests<85>,Python 3 5 2 release candidate 1
@anchor{whatsnew/changelog id1040}@anchor{1faa}
@subsubsection Build



@itemize -

@item 
bpo-26884@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26884}: Fix linking extension modules for cross builds. Patch by Xavier
de Gaye.

@item 
bpo-22359@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22359}: Disable the rules for running _freeze_importlib and pgen when
cross-compiling.  The output of these programs is normally saved with the
source code anyway, and is still regenerated when doing a native build.
Patch by Xavier de Gaye.

@item 
bpo-27229@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27229}: Fix the cross-compiling pgen rule for in-tree builds.  Patch by
Xavier de Gaye.

@item 
bpo-21668@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21668}: Link audioop, _datetime, _ctypes_test modules to libm, except
on Mac OS X. Patch written by Xavier de Gaye.

@item 
bpo-25702@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25702}: A –with-lto configure option has been added that will enable
link time optimizations at build time during a make profile-opt. Some
compilers and toolchains are known to not produce stable code when using
LTO, be sure to test things thoroughly before relying on it. It can
provide a few % speed up over profile-opt alone.

@item 
bpo-26624@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26624}: Adds validation of ucrtbase[d].dll version with warning for old
versions.

@item 
bpo-17603@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17603}: Avoid error about nonexistent fileblocks.o file by using a
lower-level check for st_blocks in struct stat.

@item 
bpo-26079@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26079}: Fixing the build output folder for tix-8.4.3.6. Patch by Bjoern
Thiel.

@item 
bpo-26465@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26465}: Update Windows builds to use OpenSSL 1.0.2g.

@item 
bpo-24421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24421}: Compile Modules/_math.c once, before building extensions.
Previously it could fail to compile properly if the math and cmath builds
were concurrent.

@item 
bpo-25348@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25348}: Added @code{--pgo} and @code{--pgo-job} arguments to
@code{PCbuild\build.bat} for building with Profile-Guided Optimization.  The
old @code{PCbuild\build_pgo.bat} script is now deprecated, and simply calls
@code{PCbuild\build.bat --pgo %*}.

@item 
bpo-25827@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25827}: Add support for building with ICC to @code{configure}, including a
new @code{--with-icc} flag.

@item 
bpo-25696@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25696}: Fix installation of Python on UNIX with make -j9.

@item 
bpo-26930@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26930}: Update OS X 10.5+ 32-bit-only installer to build and link with
OpenSSL 1.0.2h.

@item 
bpo-26268@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26268}: Update Windows builds to use OpenSSL 1.0.2f.

@item 
bpo-25136@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25136}: Support Apple Xcode 7’s new textual SDK stub libraries.

@item 
bpo-24324@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24324}: Do not enable unreachable code warnings when using gcc as the
option does not work correctly in older versions of gcc and has been
silently removed as of gcc-4.5.
@end itemize

@node Windows<81>,Tools/Demos<56>,Build<95>,Python 3 5 2 release candidate 1
@anchor{whatsnew/changelog id1041}@anchor{1fab}
@subsubsection Windows



@itemize -

@item 
bpo-27053@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27053}: Updates make_zip.py to correctly generate library ZIP file.

@item 
bpo-26268@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26268}: Update the prepare_ssl.py script to handle OpenSSL releases
that don’t include the contents of the include directory (that is, 1.0.2e
and later).

@item 
bpo-26071@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26071}: bdist_wininst created binaries fail to start and find 32bit
Python

@item 
bpo-26073@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26073}: Update the list of magic numbers in launcher

@item 
bpo-26065@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26065}: Excludes venv from library when generating embeddable distro.

@item 
bpo-17500@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17500}: Remove unused and outdated icons. (See also:
@indicateurl{https://github.com/python/pythondotorg/issues/945})
@end itemize

@node Tools/Demos<56>,,Windows<81>,Python 3 5 2 release candidate 1
@anchor{whatsnew/changelog id1042}@anchor{1fac}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-26799@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26799}: Fix python-gdb.py: don’t get C types once when the Python code
is loaded, but get C types on demand. The C types can change if
python-gdb.py is loaded before the Python executable. Patch written by
Thomas Ilsche.

@item 
bpo-26271@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26271}: Fix the Freeze tool to properly use flags passed through
configure. Patch by Daniel Shaulov.

@item 
bpo-26489@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26489}: Add dictionary unpacking support to Tools/parser/unparse.py.
Patch by Guo Ci Teo.

@item 
bpo-26316@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26316}: Fix variable name typo in Argument Clinic.
@end itemize

@node Python 3 5 1 final,Python 3 5 1 release candidate 1,Python 3 5 2 release candidate 1,Changelog
@anchor{whatsnew/changelog python-3-5-1-final}@anchor{1fad}
@subsection Python 3.5.1 final


`Release date: 2015-12-06'

@menu
* Core and Builtins: Core and Builtins<196>. 
* Windows: Windows<82>. 

@end menu

@node Core and Builtins<196>,Windows<82>,,Python 3 5 1 final
@anchor{whatsnew/changelog id1043}@anchor{1fae}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-25709@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25709}: Fixed problem with in-place string concatenation and utf-8
cache.
@end itemize

@node Windows<82>,,Core and Builtins<196>,Python 3 5 1 final
@anchor{whatsnew/changelog id1044}@anchor{1faf}
@subsubsection Windows



@itemize -

@item 
bpo-25715@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25715}: Python 3.5.1 installer shows wrong upgrade path and incorrect
logic for launcher detection.
@end itemize

@node Python 3 5 1 release candidate 1,Python 3 5 0 final,Python 3 5 1 final,Changelog
@anchor{whatsnew/changelog python-3-5-1-release-candidate-1}@anchor{1fb0}
@subsection Python 3.5.1 release candidate 1


`Release date: 2015-11-22'

@menu
* Core and Builtins: Core and Builtins<197>. 
* Library: Library<199>. 
* IDLE: IDLE<61>. 
* Documentation: Documentation<84>. 
* Tests: Tests<86>. 
* Build: Build<96>. 
* Windows: Windows<83>. 
* Tools/Demos: Tools/Demos<57>. 

@end menu

@node Core and Builtins<197>,Library<199>,,Python 3 5 1 release candidate 1
@anchor{whatsnew/changelog id1045}@anchor{1fb1}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-25630@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25630}: Fix a possible segfault during argument parsing in functions
that accept filesystem paths.

@item 
bpo-23564@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23564}: Fixed a partially broken sanity check in the _posixsubprocess
internals regarding how fds_to_pass were passed to the child.  The bug had
no actual impact as subprocess.py already avoided it.

@item 
bpo-25388@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25388}: Fixed tokenizer crash when processing undecodable source code
with a null byte.

@item 
bpo-25462@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25462}: The hash of the key now is calculated only once in most
operations in C implementation of OrderedDict.

@item 
bpo-22995@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22995}: Default implementation of __reduce__ and __reduce_ex__ now
rejects builtin types with not defined __new__.

@item 
bpo-25555@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25555}: Fix parser and AST: fill lineno and col_offset of “arg” node
when compiling AST from Python objects.

@item 
bpo-24802@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24802}: Avoid buffer overreads when int(), float(), compile(), exec()
and eval() are passed bytes-like objects.  These objects are not
necessarily terminated by a null byte, but the functions assumed they
were.

@item 
bpo-24726@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24726}: Fixed a crash and leaking NULL in repr() of OrderedDict that
was mutated by direct calls of dict methods.

@item 
bpo-25449@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25449}: Iterating OrderedDict with keys with unstable hash now raises
KeyError in C implementations as well as in Python implementation.

@item 
bpo-25395@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25395}: Fixed crash when highly nested OrderedDict structures were
garbage collected.

@item 
bpo-25274@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25274}: sys.setrecursionlimit() now raises a RecursionError if the new
recursion limit is too low depending at the current recursion depth.
Modify also the “lower-water mark” formula to make it monotonic. This mark
is used to decide when the overflowed flag of the thread state is reset.

@item 
bpo-24402@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24402}: Fix input() to prompt to the redirected stdout when
sys.stdout.fileno() fails.

@item 
bpo-24806@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24806}: Prevent builtin types that are not allowed to be subclassed
from being subclassed through multiple inheritance.

@item 
bpo-24848@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24848}: Fixed a number of bugs in UTF-7 decoding of misformed data.

@item 
bpo-25280@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25280}: Import trace messages emitted in verbose (-v) mode are no
longer formatted twice.

@item 
bpo-25003@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25003}: On Solaris 11.3 or newer, os.urandom() now uses the getrandom()
function instead of the getentropy() function. The getentropy() function
is blocking to generate very good quality entropy, os.urandom() doesn’t
need such high-quality entropy.

@item 
bpo-25182@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25182}: The stdprinter (used as sys.stderr before the io module is
imported at startup) now uses the backslashreplace error handler.

@item 
bpo-25131@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25131}: Make the line number and column offset of set/dict literals and
comprehensions correspond to the opening brace.

@item 
bpo-25150@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25150}: Hide the private @code{_Py_atomic_@var{xxx}} symbols from the
public Python.h header to fix a compilation error with OpenMP.
PyThreadState_GET() becomes an alias to PyThreadState_Get() to avoid ABI
incompatibilities.
@end itemize

@node Library<199>,IDLE<61>,Core and Builtins<197>,Python 3 5 1 release candidate 1
@anchor{whatsnew/changelog id1046}@anchor{1fb2}
@subsubsection Library



@itemize -

@item 
bpo-25626@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25626}: Change three zlib functions to accept sizes that fit in
Py_ssize_t, but internally cap those sizes to UINT_MAX.  This resolves a
regression in 3.5 where GzipFile.read() failed to read chunks larger than
2 or 4 GiB.  The change affects the zlib.Decompress.decompress()
max_length parameter, the zlib.decompress() bufsize parameter, and the
zlib.Decompress.flush() length parameter.

@item 
bpo-25583@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25583}: Avoid incorrect errors raised by os.makedirs(exist_ok=True)
when the OS gives priority to errors such as EACCES over EEXIST.

@item 
bpo-25593@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25593}: Change semantics of EventLoop.stop() in asyncio.

@item 
bpo-6973@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6973}: When we know a subprocess.Popen process has died, do not allow
the send_signal(), terminate(), or kill() methods to do anything as they
could potentially signal a different process.

@item 
bpo-25590@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25590}: In the Readline completer, only call getattr() once per
attribute.

@item 
bpo-25498@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25498}: Fix a crash when garbage-collecting ctypes objects created by
wrapping a memoryview.  This was a regression made in 3.5a1.  Based on
patch by Eryksun.

@item 
bpo-25584@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25584}: Added “escape” to the __all__ list in the glob module.

@item 
bpo-25584@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25584}: Fixed recursive glob() with patterns starting with @code{**}.

@item 
bpo-25446@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25446}: Fix regression in smtplib’s AUTH LOGIN support.

@item 
bpo-18010@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18010}: Fix the pydoc web server’s module search function to handle
exceptions from importing packages.

@item 
bpo-25554@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25554}: Got rid of circular references in regular expression parsing.

@item 
bpo-25510@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25510}: fileinput.FileInput.readline() now returns b’’ instead of ‘’ at
the end if the FileInput was opened with binary mode. Patch by Ryosuke
Ito.

@item 
bpo-25503@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25503}: Fixed inspect.getdoc() for inherited docstrings of properties.
Original patch by John Mark Vandenberg.

@item 
bpo-25515@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25515}: Always use os.urandom as a source of randomness in uuid.uuid4.

@item 
bpo-21827@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21827}: Fixed textwrap.dedent() for the case when largest common
whitespace is a substring of smallest leading whitespace. Based on patch
by Robert Li.

@item 
bpo-25447@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25447}: The lru_cache() wrapper objects now can be copied and pickled
(by returning the original object unchanged).

@item 
bpo-25390@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25390}: typing: Don’t crash on Union[str, Pattern].

@item 
bpo-25441@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25441}: asyncio: Raise error from drain() when socket is closed.

@item 
bpo-25410@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25410}: Cleaned up and fixed minor bugs in C implementation of
OrderedDict.

@item 
bpo-25411@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25411}: Improved Unicode support in SMTPHandler through better use of
the email package. Thanks to user simon04 for the patch.

@item 
bpo-25407@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25407}: Remove mentions of the formatter module being removed in Python
3.6.

@item 
bpo-25406@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25406}: Fixed a bug in C implementation of OrderedDict.move_to_end()
that caused segmentation fault or hang in iterating after moving several
items to the start of ordered dict.

@item 
bpo-25364@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25364}: zipfile now works in threads disabled builds.

@item 
bpo-25328@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25328}: smtpd’s SMTPChannel now correctly raises a ValueError if both
decode_data and enable_SMTPUTF8 are set to true.

@item 
bpo-25316@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25316}: distutils raises OSError instead of DistutilsPlatformError when
MSVC is not installed.

@item 
bpo-25380@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25380}: Fixed protocol for the STACK_GLOBAL opcode in
pickletools.opcodes.

@item 
bpo-23972@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23972}: Updates asyncio datagram create method allowing reuseport and
reuseaddr socket options to be set prior to binding the socket. Mirroring
the existing asyncio create_server method the reuseaddr option for
datagram sockets defaults to True if the O/S is ‘posix’ (except if the
platform is Cygwin). Patch by Chris Laws.

@item 
bpo-25304@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25304}: Add asyncio.run_coroutine_threadsafe().  This lets you submit a
coroutine to a loop from another thread, returning a
concurrent.futures.Future.  By Vincent Michel.

@item 
bpo-25232@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25232}: Fix CGIRequestHandler to split the query from the URL at the
first question mark (?) rather than the last. Patch from Xiang Zhang.

@item 
bpo-24657@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24657}: Prevent CGIRequestHandler from collapsing slashes in the query
part of the URL as if it were a path. Patch from Xiang Zhang.

@item 
bpo-24483@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24483}: C implementation of functools.lru_cache() now calculates key’s
hash only once.

@item 
bpo-22958@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22958}: Constructor and update method of weakref.WeakValueDictionary
now accept the self and the dict keyword arguments.

@item 
bpo-22609@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22609}: Constructor of collections.UserDict now accepts the self
keyword argument.

@item 
bpo-25111@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25111}: Fixed comparison of traceback.FrameSummary.

@item 
bpo-25262@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25262}: Added support for BINBYTES8 opcode in Python implementation of
unpickler. Highest 32 bits of 64-bit size for BINUNICODE8 and BINBYTES8
opcodes no longer silently ignored on 32-bit platforms in C
implementation.

@item 
bpo-25034@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25034}: Fix string.Formatter problem with auto-numbering and nested
format_specs. Patch by Anthon van der Neut.

@item 
bpo-25233@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25233}: Rewrite the guts of asyncio.Queue and asyncio.Semaphore to be
more understandable and correct.

@item 
bpo-25203@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25203}: Failed readline.set_completer_delims() no longer left the
module in inconsistent state.

@item 
bpo-23600@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23600}: Default implementation of tzinfo.fromutc() was returning wrong
results in some cases.

@item 
bpo-23329@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23329}: Allow the ssl module to be built with older versions of
LibreSSL.

@item 
Prevent overflow in _Unpickler_Read.

@item 
bpo-25047@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25047}: The XML encoding declaration written by Element Tree now
respects the letter case given by the user. This restores the ability to
write encoding names in uppercase like “UTF-8”, which worked in Python 2.

@item 
bpo-25135@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25135}: Make deque_clear() safer by emptying the deque before clearing.
This helps avoid possible reentrancy issues.

@item 
bpo-19143@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19143}: platform module now reads Windows version from kernel32.dll to
avoid compatibility shims.

@item 
bpo-25092@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25092}: Fix datetime.strftime() failure when errno was already set to
EINVAL.

@item 
bpo-23517@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23517}: Fix rounding in fromtimestamp() and utcfromtimestamp() methods
of datetime.datetime: microseconds are now rounded to nearest with ties
going to nearest even integer (ROUND_HALF_EVEN), instead of being rounding
towards minus infinity (ROUND_FLOOR). It’s important that these methods
use the same rounding mode than datetime.timedelta to keep the property:
(datetime(1970,1,1) + timedelta(seconds=t)) ==
datetime.utcfromtimestamp(t). It also the rounding mode used by
round(float) for example.

@item 
bpo-25155@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25155}: Fix datetime.datetime.now() and datetime.datetime.utcnow() on
Windows to support date after year 2038. It was a regression introduced in
Python 3.5.0.

@item 
bpo-25108@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25108}: Omitted internal frames in traceback functions print_stack(),
format_stack(), and extract_stack() called without arguments.

@item 
bpo-25118@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25118}: Fix a regression of Python 3.5.0 in os.waitpid() on Windows.

@item 
bpo-24684@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24684}: socket.socket.getaddrinfo() now calls
PyUnicode_AsEncodedString() instead of calling the encode() method of the
host, to handle correctly custom string with an encode() method which
doesn’t return a byte string. The encoder of the IDNA codec is now called
directly instead of calling the encode() method of the string.

@item 
bpo-25060@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25060}: Correctly compute stack usage of the BUILD_MAP opcode.

@item 
bpo-24857@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24857}: Comparing call_args to a long sequence now correctly returns a
boolean result instead of raising an exception.  Patch by A Kaptur.

@item 
bpo-23144@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23144}: Make sure that HTMLParser.feed() returns all the data, even
when convert_charrefs is True.

@item 
bpo-24982@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24982}: shutil.make_archive() with the “zip” format now adds entries
for directories (including empty directories) in ZIP file.

@item 
bpo-25019@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25019}: Fixed a crash caused by setting non-string key of expat parser.
Based on patch by John Leitch.

@item 
bpo-16180@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16180}: Exit pdb if file has syntax error, instead of trapping user in
an infinite loop.  Patch by Xavier de Gaye.

@item 
bpo-24891@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24891}: Fix a race condition at Python startup if the file descriptor
of stdin (0), stdout (1) or stderr (2) is closed while Python is creating
sys.stdin, sys.stdout and sys.stderr objects. These attributes are now set
to None if the creation of the object failed, instead of raising an
OSError exception. Initial patch written by Marco Paolini.

@item 
bpo-24992@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24992}: Fix error handling and a race condition (related to garbage
collection) in collections.OrderedDict constructor.

@item 
bpo-24881@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24881}: Fixed setting binary mode in Python implementation of FileIO on
Windows and Cygwin.  Patch from Akira Li.

@item 
bpo-25578@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25578}: Fix (another) memory leak in SSLSocket.getpeercer().

@item 
bpo-25530@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25530}: Disable the vulnerable SSLv3 protocol by default when creating
ssl.SSLContext.

@item 
bpo-25569@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25569}: Fix memory leak in SSLSocket.getpeercert().

@item 
bpo-25471@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25471}: Sockets returned from accept() shouldn’t appear to be
nonblocking.

@item 
bpo-25319@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25319}: When threading.Event is reinitialized, the underlying condition
should use a regular lock rather than a recursive lock.

@item 
bpo-21112@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21112}: Fix regression in unittest.expectedFailure on subclasses. Patch
from Berker Peksag.

@item 
bpo-24764@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24764}: cgi.FieldStorage.read_multi() now ignores the Content-Length
header in part headers. Patch written by Peter Landry and reviewed by
Pierre Quentel.

@item 
bpo-24913@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24913}: Fix overrun error in deque.index(). Found by John Leitch and
Bryce Darling.

@item 
bpo-24774@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24774}: Fix docstring in http.server.test. Patch from Chiu-Hsiang Hsu.

@item 
bpo-21159@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21159}: Improve message in
configparser.InterpolationMissingOptionError. Patch from Łukasz Langa.

@item 
bpo-20362@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20362}: Honour TestCase.longMessage correctly in assertRegex. Patch
from Ilia Kurenkov.

@item 
bpo-23572@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23572}: Fixed functools.singledispatch on classes with false
metaclasses.  Patch by Ethan Furman.

@item 
asyncio: ensure_future() now accepts awaitable objects.
@end itemize

@node IDLE<61>,Documentation<84>,Library<199>,Python 3 5 1 release candidate 1
@anchor{whatsnew/changelog id1047}@anchor{1fb3}
@subsubsection IDLE



@itemize -

@item 
bpo-15348@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15348}: Stop the debugger engine (normally in a user process) before
closing the debugger window (running in the IDLE process). This prevents
the RuntimeErrors that were being caught and ignored.

@item 
bpo-24455@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24455}: Prevent IDLE from hanging when a) closing the shell while the
debugger is active (15347); b) closing the debugger with the [X] button
(15348); and c) activating the debugger when already active (24455). The
patch by Mark Roseman does this by making two changes. 1. Suspend and
resume the gui.interaction method with the tcl vwait mechanism intended
for this purpose (instead of root.mainloop & .quit). 2. In gui.run, allow
any existing interaction to terminate first.

@item 
Change ‘The program’ to ‘Your program’ in an IDLE ‘kill program?’ message
to make it clearer that the program referred to is the currently running
user program, not IDLE itself.

@item 
bpo-24750@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24750}: Improve the appearance of the IDLE editor window status bar.
Patch by Mark Roseman.

@item 
bpo-25313@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25313}: Change the handling of new built-in text color themes to better
address the compatibility problem introduced by the addition of IDLE Dark.
Consistently use the revised idleConf.CurrentTheme everywhere in idlelib.

@item 
bpo-24782@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24782}: Extension configuration is now a tab in the IDLE Preferences
dialog rather than a separate dialog.  The former tabs are now a sorted
list.  Patch by Mark Roseman.

@item 
bpo-22726@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22726}: Re-activate the config dialog help button with some content
about the other buttons and the new IDLE Dark theme.

@item 
bpo-24820@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24820}: IDLE now has an ‘IDLE Dark’ built-in text color theme. It is
more or less IDLE Classic inverted, with a cobalt blue background.
Strings, comments, keywords, … are still green, red, orange, … . To
use it with IDLEs released before November 2015, hit the ‘Save as New
Custom Theme’ button and enter a new name, such as ‘Custom Dark’.  The
custom theme will work with any IDLE release, and can be modified.

@item 
bpo-25224@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25224}: README.txt is now an idlelib index for IDLE developers and
curious users. The previous user content is now in the IDLE doc chapter.
‘IDLE’ now means ‘Integrated Development and Learning Environment’.

@item 
bpo-24820@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24820}: Users can now set breakpoint colors in Settings -> Custom
Highlighting. Original patch by Mark Roseman.

@item 
bpo-24972@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24972}: Inactive selection background now matches active selection
background, as configured by users, on all systems.  Found items are now
always highlighted on Windows.  Initial patch by Mark Roseman.

@item 
bpo-24570@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24570}: Idle: make calltip and completion boxes appear on Macs affected
by a tk regression.  Initial patch by Mark Roseman.

@item 
bpo-24988@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24988}: Idle ScrolledList context menus (used in debugger) now work on
Mac Aqua. Patch by Mark Roseman.

@item 
bpo-24801@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24801}: Make right-click for context menu work on Mac Aqua. Patch by
Mark Roseman.

@item 
bpo-25173@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25173}: Associate tkinter messageboxes with a specific widget. For Mac
OSX, make them a ‘sheet’.  Patch by Mark Roseman.

@item 
bpo-25198@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25198}: Enhance the initial html viewer now used for Idle Help.
Properly indent fixed-pitch text (patch by Mark Roseman). Give code
snippet a very Sphinx-like light blueish-gray background. Re-use initial
width and height set by users for shell and editor. When the Table of
Contents (TOC) menu is used, put the section header at the top of the
screen.

@item 
bpo-25225@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25225}: Condense and rewrite Idle doc section on text colors.

@item 
bpo-21995@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21995}: Explain some differences between IDLE and console Python.

@item 
bpo-22820@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22820}: Explain need for `print' when running file from Idle editor.

@item 
bpo-25224@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25224}: Doc: augment Idle feature list and no-subprocess section.

@item 
bpo-25219@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25219}: Update doc for Idle command line options. Some were missing and
notes were not correct.

@item 
bpo-24861@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24861}: Most of idlelib is private and subject to change. Use
idleib.idle.* to start Idle. See idlelib.__init__.__doc__.

@item 
bpo-25199@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25199}: Idle: add synchronization comments for future maintainers.

@item 
bpo-16893@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16893}: Replace help.txt with help.html for Idle doc display. The new
idlelib/help.html is rstripped Doc/build/html/library/idle.html. It looks
better than help.txt and will better document Idle as released. The
tkinter html viewer that works for this file was written by Mark Roseman.
The now unused EditorWindow.HelpDialog class and helt.txt file are
deprecated.

@item 
bpo-24199@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24199}: Deprecate unused idlelib.idlever with possible removal in 3.6.

@item 
bpo-24790@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24790}: Remove extraneous code (which also create 2 & 3 conflicts).
@end itemize

@node Documentation<84>,Tests<86>,IDLE<61>,Python 3 5 1 release candidate 1
@anchor{whatsnew/changelog id1048}@anchor{1fb4}
@subsubsection Documentation



@itemize -

@item 
bpo-22558@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22558}: Add remaining doc links to source code for Python-coded
modules. Patch by Yoni Lavi.

@item 
bpo-12067@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12067}: Rewrite Comparisons section in the Expressions chapter of the
language reference. Some of the details of comparing mixed types were
incorrect or ambiguous. NotImplemented is only relevant at a lower level
than the Expressions chapter. Added details of comparing range() objects,
and default behaviour and consistency suggestions for user-defined
classes. Patch from Andy Maier.

@item 
bpo-24952@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24952}: Clarify the default size argument of stack_size() in the
“threading” and “_thread” modules. Patch from Mattip.

@item 
bpo-23725@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23725}: Overhaul tempfile docs. Note deprecated status of mktemp. Patch
from Zbigniew Jędrzejewski-Szmek.

@item 
bpo-24808@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24808}: Update the types of some PyTypeObject fields.  Patch by Joseph
Weston.

@item 
bpo-22812@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22812}: Fix unittest discovery examples. Patch from Pam McA’Nulty.
@end itemize

@node Tests<86>,Build<96>,Documentation<84>,Python 3 5 1 release candidate 1
@anchor{whatsnew/changelog id1049}@anchor{1fb5}
@subsubsection Tests



@itemize -

@item 
bpo-25449@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25449}: Added tests for OrderedDict subclasses.

@item 
bpo-25099@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25099}: Make test_compileall not fail when an entry on sys.path cannot
be written to (commonly seen in administrative installs on Windows).

@item 
bpo-23919@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23919}: Prevents assert dialogs appearing in the test suite.

@item 
@code{PCbuild\rt.bat} now accepts an unlimited number of arguments to pass
along to regrtest.py.  Previously there was a limit of 9.
@end itemize

@node Build<96>,Windows<83>,Tests<86>,Python 3 5 1 release candidate 1
@anchor{whatsnew/changelog id1050}@anchor{1fb6}
@subsubsection Build



@itemize -

@item 
bpo-24915@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24915}: Add LLVM support for PGO builds and use the test suite to
generate the profile data. Initial patch by Alecsandru Patrascu of Intel.

@item 
bpo-24910@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24910}: Windows MSIs now have unique display names.

@item 
bpo-24986@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24986}: It is now possible to build Python on Windows without errors
when external libraries are not available.
@end itemize

@node Windows<83>,Tools/Demos<57>,Build<96>,Python 3 5 1 release candidate 1
@anchor{whatsnew/changelog id1051}@anchor{1fb7}
@subsubsection Windows



@itemize -

@item 
bpo-25450@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25450}: Updates shortcuts to start Python in installation directory.

@item 
bpo-25164@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25164}: Changes default all-users install directory to match per-user
directory.

@item 
bpo-25143@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25143}: Improves installer error messages for unsupported platforms.

@item 
bpo-25163@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25163}: Display correct directory in installer when using non-default
settings.

@item 
bpo-25361@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25361}: Disables use of SSE2 instructions in Windows 32-bit build

@item 
bpo-25089@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25089}: Adds logging to installer for case where launcher is not
selected on upgrade.

@item 
bpo-25165@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25165}: Windows uninstallation should not remove launcher if other
versions remain

@item 
bpo-25112@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25112}: py.exe launcher is missing icons

@item 
bpo-25102@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25102}: Windows installer does not precompile for -O or -OO.

@item 
bpo-25081@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25081}: Makes Back button in installer go back to upgrade page when
upgrading.

@item 
bpo-25091@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25091}: Increases font size of the installer.

@item 
bpo-25126@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25126}: Clarifies that the non-web installer will download some
components.

@item 
bpo-25213@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25213}: Restores requestedExecutionLevel to manifest to disable UAC
virtualization.

@item 
bpo-25022@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25022}: Removed very outdated PC/example_nt/ directory.
@end itemize

@node Tools/Demos<57>,,Windows<83>,Python 3 5 1 release candidate 1
@anchor{whatsnew/changelog id1052}@anchor{1fb8}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-25440@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25440}: Fix output of python-config –extension-suffix.
@end itemize

@node Python 3 5 0 final,Python 3 5 0 release candidate 4,Python 3 5 1 release candidate 1,Changelog
@anchor{whatsnew/changelog python-3-5-0-final}@anchor{1fb9}
@subsection Python 3.5.0 final


`Release date: 2015-09-13'

@menu
* Build: Build<97>. 

@end menu

@node Build<97>,,,Python 3 5 0 final
@anchor{whatsnew/changelog id1053}@anchor{1fba}
@subsubsection Build



@itemize -

@item 
bpo-25071@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25071}: Windows installer should not require TargetDir parameter when
installing quietly.
@end itemize

@node Python 3 5 0 release candidate 4,Python 3 5 0 release candidate 3,Python 3 5 0 final,Changelog
@anchor{whatsnew/changelog python-3-5-0-release-candidate-4}@anchor{1fbb}
@subsection Python 3.5.0 release candidate 4


`Release date: 2015-09-09'

@menu
* Library: Library<200>. 
* Build: Build<98>. 

@end menu

@node Library<200>,Build<98>,,Python 3 5 0 release candidate 4
@anchor{whatsnew/changelog id1054}@anchor{1fbc}
@subsubsection Library



@itemize -

@item 
bpo-25029@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25029}: Fixes MemoryError in test_strptime.
@end itemize

@node Build<98>,,Library<200>,Python 3 5 0 release candidate 4
@anchor{whatsnew/changelog id1055}@anchor{1fbd}
@subsubsection Build



@itemize -

@item 
bpo-25027@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25027}: Reverts partial-static build options and adds vcruntime140.dll
to Windows installation.
@end itemize

@node Python 3 5 0 release candidate 3,Python 3 5 0 release candidate 2,Python 3 5 0 release candidate 4,Changelog
@anchor{whatsnew/changelog python-3-5-0-release-candidate-3}@anchor{1fbe}
@subsection Python 3.5.0 release candidate 3


`Release date: 2015-09-07'

@menu
* Core and Builtins: Core and Builtins<198>. 
* Library: Library<201>. 

@end menu

@node Core and Builtins<198>,Library<201>,,Python 3 5 0 release candidate 3
@anchor{whatsnew/changelog id1056}@anchor{1fbf}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-24305@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24305}: Prevent import subsystem stack frames from being counted by the
warnings.warn(stacklevel=) parameter.

@item 
bpo-24912@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24912}: Prevent __class__ assignment to immutable built-in objects.

@item 
bpo-24975@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24975}: Fix AST compilation for 
@geindex Python Enhancement Proposals; PEP 448
PEP 448@footnote{https://peps.python.org/pep-0448/} syntax.
@end itemize

@node Library<201>,,Core and Builtins<198>,Python 3 5 0 release candidate 3
@anchor{whatsnew/changelog id1057}@anchor{1fc0}
@subsubsection Library



@itemize -

@item 
bpo-24917@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24917}: time_strftime() buffer over-read.

@item 
bpo-24748@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24748}: To resolve a compatibility problem found with py2exe and
pywin32, imp.load_dynamic() once again ignores previously loaded modules
to support Python modules replacing themselves with extension modules.
Patch by Petr Viktorin.

@item 
bpo-24635@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24635}: Fixed a bug in typing.py where isinstance([], typing.Iterable)
would return True once, then False on subsequent calls.

@item 
bpo-24989@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24989}: Fixed buffer overread in BytesIO.readline() if a position is
set beyond size.  Based on patch by John Leitch.

@item 
bpo-24913@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24913}: Fix overrun error in deque.index(). Found by John Leitch and
Bryce Darling.
@end itemize

@node Python 3 5 0 release candidate 2,Python 3 5 0 release candidate 1,Python 3 5 0 release candidate 3,Changelog
@anchor{whatsnew/changelog python-3-5-0-release-candidate-2}@anchor{1fc1}
@subsection Python 3.5.0 release candidate 2


`Release date: 2015-08-25'

@menu
* Core and Builtins: Core and Builtins<199>. 
* Library: Library<202>. 

@end menu

@node Core and Builtins<199>,Library<202>,,Python 3 5 0 release candidate 2
@anchor{whatsnew/changelog id1058}@anchor{1fc2}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-24769@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24769}: Interpreter now starts properly when dynamic loading is
disabled.  Patch by Petr Viktorin.

@item 
bpo-21167@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21167}: NAN operations are now handled correctly when python is
compiled with ICC even if -fp-model strict is not specified.

@item 
bpo-24492@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24492}: A “package” lacking a __name__ attribute when trying to perform
a @code{from .. import ...} statement will trigger an ImportError instead of
an AttributeError.
@end itemize

@node Library<202>,,Core and Builtins<199>,Python 3 5 0 release candidate 2
@anchor{whatsnew/changelog id1059}@anchor{1fc3}
@subsubsection Library



@itemize -

@item 
bpo-24847@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24847}: Removes vcruntime140.dll dependency from Tcl/Tk.

@item 
bpo-24839@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24839}: platform._syscmd_ver raises DeprecationWarning

@item 
bpo-24867@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24867}: Fix Task.get_stack() for ‘async def’ coroutines
@end itemize

@node Python 3 5 0 release candidate 1,Python 3 5 0 beta 4,Python 3 5 0 release candidate 2,Changelog
@anchor{whatsnew/changelog python-3-5-0-release-candidate-1}@anchor{1fc4}
@subsection Python 3.5.0 release candidate 1


`Release date: 2015-08-09'

@menu
* Core and Builtins: Core and Builtins<200>. 
* Library: Library<203>. 
* IDLE: IDLE<62>. 
* Documentation: Documentation<85>. 
* Tests: Tests<87>. 

@end menu

@node Core and Builtins<200>,Library<203>,,Python 3 5 0 release candidate 1
@anchor{whatsnew/changelog id1060}@anchor{1fc5}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-24667@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24667}: Resize odict in all cases that the underlying dict resizes.
@end itemize

@node Library<203>,IDLE<62>,Core and Builtins<200>,Python 3 5 0 release candidate 1
@anchor{whatsnew/changelog id1061}@anchor{1fc6}
@subsubsection Library



@itemize -

@item 
bpo-24824@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24824}: Signatures of codecs.encode() and codecs.decode() now are
compatible with pydoc.

@item 
bpo-24634@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24634}: Importing uuid should not try to load libc on Windows

@item 
bpo-24798@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24798}: _msvccompiler.py doesn’t properly support manifests

@item 
bpo-4395@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4395}: Better testing and documentation of binary operators. Patch by
Martin Panter.

@item 
bpo-23973@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23973}: Update typing.py from GitHub repo.

@item 
bpo-23004@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23004}: mock_open() now reads binary data correctly when the type of
read_data is bytes.  Initial patch by Aaron Hill.

@item 
bpo-23888@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23888}: Handle fractional time in cookie expiry. Patch by ssh.

@item 
bpo-23652@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23652}: Make it possible to compile the select module against the libc
headers from the Linux Standard Base, which do not include some EPOLL
macros.  Patch by Matt Frank.

@item 
bpo-22932@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22932}: Fix timezones in email.utils.formatdate. Patch from Dmitry
Shachnev.

@item 
bpo-23779@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23779}: imaplib raises TypeError if authenticator tries to abort. Patch
from Craig Holmquist.

@item 
bpo-23319@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23319}: Fix ctypes.BigEndianStructure, swap correctly bytes. Patch
written by Matthieu Gautier.

@item 
bpo-23254@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23254}: Document how to close the TCPServer listening socket. Patch
from Martin Panter.

@item 
bpo-19450@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19450}: Update Windows and OS X installer builds to use SQLite 3.8.11.

@item 
bpo-17527@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17527}: Add PATCH to wsgiref.validator. Patch from Luca Sbardella.

@item 
bpo-24791@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24791}: Fix grammar regression for call syntax: ‘g(*a or b)’.
@end itemize

@node IDLE<62>,Documentation<85>,Library<203>,Python 3 5 0 release candidate 1
@anchor{whatsnew/changelog id1062}@anchor{1fc7}
@subsubsection IDLE



@itemize -

@item 
bpo-23672@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23672}: Allow Idle to edit and run files with astral chars in name.
Patch by Mohd Sanad Zaki Rizvi.

@item 
bpo-24745@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24745}: Idle editor default font. Switch from Courier to
platform-sensitive TkFixedFont.  This should not affect current customized
font selections.  If there is a problem, edit
$HOME/.idlerc/config-main.cfg and remove ‘@code{font@var{xxx}}’ entries from
[Editor Window].  Patch by Mark Roseman.

@item 
bpo-21192@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21192}: Idle editor. When a file is run, put its name in the restart
bar. Do not print false prompts. Original patch by Adnan Umer.

@item 
bpo-13884@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13884}: Idle menus. Remove tearoff lines. Patch by Roger Serwy.
@end itemize

@node Documentation<85>,Tests<87>,IDLE<62>,Python 3 5 0 release candidate 1
@anchor{whatsnew/changelog id1063}@anchor{1fc8}
@subsubsection Documentation



@itemize -

@item 
bpo-24129@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24129}: Clarify the reference documentation for name resolution. This
includes removing the assumption that readers will be familiar with the
name resolution scheme Python used prior to the introduction of lexical
scoping for function namespaces. Patch by Ivan Levkivskyi.

@item 
bpo-20769@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20769}: Improve reload() docs. Patch by Dorian Pula.

@item 
bpo-23589@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23589}: Remove duplicate sentence from the FAQ.  Patch by Yongzhi Pan.

@item 
bpo-24729@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24729}: Correct IO tutorial to match implementation regarding encoding
parameter to open function.
@end itemize

@node Tests<87>,,Documentation<85>,Python 3 5 0 release candidate 1
@anchor{whatsnew/changelog id1064}@anchor{1fc9}
@subsubsection Tests



@itemize -

@item 
bpo-24751@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24751}: When running regrtest with the @code{-w} command line option, a
test run is no longer marked as a failure if all tests succeed when
re-run.
@end itemize

@node Python 3 5 0 beta 4,Python 3 5 0 beta 3,Python 3 5 0 release candidate 1,Changelog
@anchor{whatsnew/changelog python-3-5-0-beta-4}@anchor{1fca}
@subsection Python 3.5.0 beta 4


`Release date: 2015-07-26'

@menu
* Core and Builtins: Core and Builtins<201>. 
* Library: Library<204>. 
* Build: Build<99>. 

@end menu

@node Core and Builtins<201>,Library<204>,,Python 3 5 0 beta 4
@anchor{whatsnew/changelog id1065}@anchor{1fcb}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-23573@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23573}: Restored optimization of bytes.rfind() and bytearray.rfind()
for single-byte argument on Linux.

@item 
bpo-24569@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24569}: Make 
@geindex Python Enhancement Proposals; PEP 448
PEP 448@footnote{https://peps.python.org/pep-0448/} dictionary evaluation more consistent.

@item 
bpo-24583@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24583}: Fix crash when set is mutated while being updated.

@item 
bpo-24407@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24407}: Fix crash when dict is mutated while being updated.

@item 
bpo-24619@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24619}: New approach for tokenizing async/await. As a consequence, it
is now possible to have one-line ‘async def foo(): await ..’ functions.

@item 
bpo-24687@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24687}: Plug refleak on SyntaxError in function parameters annotations.

@item 
bpo-15944@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15944}: memoryview: Allow arbitrary formats when casting to bytes.
Patch by Martin Panter.
@end itemize

@node Library<204>,Build<99>,Core and Builtins<201>,Python 3 5 0 beta 4
@anchor{whatsnew/changelog id1066}@anchor{1fcc}
@subsubsection Library



@itemize -

@item 
bpo-23441@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23441}: rcompleter now prints a tab character instead of displaying
possible completions for an empty word.  Initial patch by Martin Sekera.

@item 
bpo-24683@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24683}: Fixed crashes in _json functions called with arguments of
inappropriate type.

@item 
bpo-21697@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21697}: shutil.copytree() now correctly handles symbolic links that
point to directories.  Patch by Eduardo Seabra and Thomas Kluyver.

@item 
bpo-14373@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14373}: Fixed segmentation fault when gc.collect() is called during
constructing lru_cache (C implementation).

@item 
bpo-24695@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24695}: Fix a regression in traceback.print_exception().  If
exc_traceback is None we shouldn’t print a traceback header like described
in the documentation.

@item 
bpo-24620@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24620}: Random.setstate() now validates the value of state last
element.

@item 
bpo-22485@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22485}: Fixed an issue that caused @code{inspect.getsource} to return
incorrect results on nested functions.

@item 
bpo-22153@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22153}: Improve unittest docs. Patch from Martin Panter and evilzero.

@item 
bpo-24580@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24580}: Symbolic group references to open group in re patterns now are
explicitly forbidden as well as numeric group references.

@item 
bpo-24206@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24206}: Fixed __eq__ and __ne__ methods of inspect classes.

@item 
bpo-24631@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24631}: Fixed regression in the timeit module with multiline setup.

@item 
bpo-18622@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18622}: unittest.mock.mock_open().reset_mock would recurse infinitely.
Patch from Nicola Palumbo and Laurent De Buyst.

@item 
bpo-23661@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23661}: unittest.mock side_effects can now be exceptions again. This
was a regression vs Python 3.4. Patch from Ignacio Rossi

@item 
bpo-24608@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24608}: chunk.Chunk.read() now always returns bytes, not str.

@item 
bpo-18684@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18684}: Fixed reading out of the buffer in the re module.

@item 
bpo-24259@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24259}: tarfile now raises a ReadError if an archive is truncated
inside a data segment.

@item 
bpo-15014@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15014}: SMTP.auth() and SMTP.login() now support RFC 4954’s optional
initial-response argument to the SMTP AUTH command.

@item 
bpo-24669@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24669}: Fix inspect.getsource() for ‘async def’ functions. Patch by Kai
Groner.

@item 
bpo-24688@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24688}: ast.get_docstring() for ‘async def’ functions.
@end itemize

@node Build<99>,,Library<204>,Python 3 5 0 beta 4
@anchor{whatsnew/changelog id1067}@anchor{1fcd}
@subsubsection Build



@itemize -

@item 
bpo-24603@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24603}: Update Windows builds and OS X 10.5 installer to use OpenSSL
1.0.2d.
@end itemize

@node Python 3 5 0 beta 3,Python 3 5 0 beta 2,Python 3 5 0 beta 4,Changelog
@anchor{whatsnew/changelog python-3-5-0-beta-3}@anchor{1fce}
@subsection Python 3.5.0 beta 3


`Release date: 2015-07-05'

@menu
* Core and Builtins: Core and Builtins<202>. 
* Library: Library<205>. 
* Tests: Tests<88>. 
* Documentation: Documentation<86>. 
* Build: Build<100>. 

@end menu

@node Core and Builtins<202>,Library<205>,,Python 3 5 0 beta 3
@anchor{whatsnew/changelog id1068}@anchor{1fcf}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-24467@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24467}: Fixed possible buffer over-read in bytearray. The bytearray
object now always allocates place for trailing null byte and it’s buffer
now is always null-terminated.

@item 
Upgrade to Unicode 8.0.0.

@item 
bpo-24345@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24345}: Add Py_tp_finalize slot for the stable ABI.

@item 
bpo-24400@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24400}: Introduce a distinct type for 
@geindex Python Enhancement Proposals; PEP 492
PEP 492@footnote{https://peps.python.org/pep-0492/} coroutines; add
types.CoroutineType, inspect.getcoroutinestate,
inspect.getcoroutinelocals; coroutines no longer use CO_GENERATOR flag;
sys.set_coroutine_wrapper works only for ‘async def’ coroutines;
inspect.iscoroutine no longer uses collections.abc.Coroutine, it’s
intended to test for pure ‘async def’ coroutines only; add new opcode:
GET_YIELD_FROM_ITER; fix generators wrapper used in types.coroutine to be
instance of collections.abc.Generator; collections.abc.Awaitable and
collections.abc.Coroutine can no longer be used to detect generator-based
coroutines–use inspect.isawaitable instead.

@item 
bpo-24450@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24450}: Add gi_yieldfrom to generators and cr_await to coroutines.
Contributed by Benno Leslie and Yury Selivanov.

@item 
bpo-19235@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19235}: Add new RecursionError exception. Patch by Georg Brandl.
@end itemize

@node Library<205>,Tests<88>,Core and Builtins<202>,Python 3 5 0 beta 3
@anchor{whatsnew/changelog id1069}@anchor{1fd0}
@subsubsection Library



@itemize -

@item 
bpo-21750@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21750}: mock_open.read_data can now be read from each instance, as it
could in Python 3.3.

@item 
bpo-24552@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24552}: Fix use after free in an error case of the _pickle module.

@item 
bpo-24514@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24514}: tarfile now tolerates number fields consisting of only
whitespace.

@item 
bpo-19176@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19176}: Fixed doctype() related bugs in C implementation of
ElementTree. A deprecation warning no longer issued by XMLParser subclass
with default doctype() method.  Direct call of doctype() now issues a
warning.  Parser’s doctype() now is not called if target’s doctype() is
called.  Based on patch by Martin Panter.

@item 
bpo-20387@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20387}: Restore semantic round-trip correctness in tokenize/untokenize
for tab-indented blocks.

@item 
bpo-24456@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24456}: Fixed possible buffer over-read in adpcm2lin() and lin2adpcm()
functions of the audioop module.

@item 
bpo-24336@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24336}: The contextmanager decorator now works with functions with
keyword arguments called “func” and “self”.  Patch by Martin Panter.

@item 
bpo-24522@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24522}: Fix possible integer overflow in json accelerator module.

@item 
bpo-24489@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24489}: ensure a previously set C errno doesn’t disturb cmath.polar().

@item 
bpo-24408@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24408}: Fixed AttributeError in measure() and metrics() methods of
tkinter.Font.

@item 
bpo-14373@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14373}: C implementation of functools.lru_cache() now can be used with
methods.

@item 
bpo-24347@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24347}: Set KeyError if PyDict_GetItemWithError returns NULL.

@item 
bpo-24348@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24348}: Drop superfluous incref/decref.

@item 
bpo-24359@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24359}: Check for changed OrderedDict size during iteration.

@item 
bpo-24368@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24368}: Support keyword arguments in OrderedDict methods.

@item 
bpo-24362@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24362}: Simplify the C OrderedDict fast nodes resize logic.

@item 
bpo-24377@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24377}: Fix a ref leak in OrderedDict.__repr__.

@item 
bpo-24369@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24369}: Defend against key-changes during iteration.
@end itemize

@node Tests<88>,Documentation<86>,Library<205>,Python 3 5 0 beta 3
@anchor{whatsnew/changelog id1070}@anchor{1fd1}
@subsubsection Tests



@itemize -

@item 
bpo-24373@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24373}: _testmultiphase and xxlimited now use tp_traverse and
tp_finalize to avoid reference leaks encountered when combining tp_dealloc
with PyType_FromSpec (see bpo-16690@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16690} for details)
@end itemize

@node Documentation<86>,Build<100>,Tests<88>,Python 3 5 0 beta 3
@anchor{whatsnew/changelog id1071}@anchor{1fd2}
@subsubsection Documentation



@itemize -

@item 
bpo-24458@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24458}: Update documentation to cover multi-phase initialization for
extension modules (PEP 489). Patch by Petr Viktorin.

@item 
bpo-24351@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24351}: Clarify what is meant by “identifier” in the context of
string.Template instances.
@end itemize

@node Build<100>,,Documentation<86>,Python 3 5 0 beta 3
@anchor{whatsnew/changelog id1072}@anchor{1fd3}
@subsubsection Build



@itemize -

@item 
bpo-24432@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24432}: Update Windows builds and OS X 10.5 installer to use OpenSSL
1.0.2c.
@end itemize

@node Python 3 5 0 beta 2,Python 3 5 0 beta 1,Python 3 5 0 beta 3,Changelog
@anchor{whatsnew/changelog python-3-5-0-beta-2}@anchor{1fd4}
@subsection Python 3.5.0 beta 2


`Release date: 2015-05-31'

@menu
* Core and Builtins: Core and Builtins<203>. 
* Library: Library<206>. 

@end menu

@node Core and Builtins<203>,Library<206>,,Python 3 5 0 beta 2
@anchor{whatsnew/changelog id1073}@anchor{1fd5}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-24284@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24284}: The startswith and endswith methods of the str class no longer
return True when finding the empty string and the indexes are completely
out of range.

@item 
bpo-24115@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24115}: Update uses of PyObject_IsTrue(), PyObject_Not(),
PyObject_IsInstance(), PyObject_RichCompareBool() and _PyDict_Contains()
to check for and handle errors correctly.

@item 
bpo-24328@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24328}: Fix importing one character extension modules.

@item 
bpo-11205@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11205}: In dictionary displays, evaluate the key before the value.

@item 
bpo-24285@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24285}: Fixed regression that prevented importing extension modules
from inside packages. Patch by Petr Viktorin.
@end itemize

@node Library<206>,,Core and Builtins<203>,Python 3 5 0 beta 2
@anchor{whatsnew/changelog id1074}@anchor{1fd6}
@subsubsection Library



@itemize -

@item 
bpo-23247@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23247}: Fix a crash in the StreamWriter.reset() of CJK codecs.

@item 
bpo-24270@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24270}: Add math.isclose() and cmath.isclose() functions as per
@geindex Python Enhancement Proposals; PEP 485
PEP 485@footnote{https://peps.python.org/pep-0485/}. Contributed by Chris Barker and Tal Einat.

@item 
bpo-5633@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5633}: Fixed timeit when the statement is a string and the setup is
not.

@item 
bpo-24326@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24326}: Fixed audioop.ratecv() with non-default weightB argument.
Original patch by David Moore.

@item 
bpo-16991@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16991}: Add a C implementation of OrderedDict.

@item 
bpo-23934@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23934}: Fix inspect.signature to fail correctly for builtin types
lacking signature information.  Initial patch by James Powell.
@end itemize

@node Python 3 5 0 beta 1,Python 3 5 0 alpha 4,Python 3 5 0 beta 2,Changelog
@anchor{whatsnew/changelog python-3-5-0-beta-1}@anchor{1fd7}
@subsection Python 3.5.0 beta 1


`Release date: 2015-05-24'

@menu
* Core and Builtins: Core and Builtins<204>. 
* Library: Library<207>. 
* IDLE: IDLE<63>. 
* Tests: Tests<89>. 
* Documentation: Documentation<87>. 
* Tools/Demos: Tools/Demos<58>. 

@end menu

@node Core and Builtins<204>,Library<207>,,Python 3 5 0 beta 1
@anchor{whatsnew/changelog id1075}@anchor{1fd8}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-24276@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24276}: Fixed optimization of property descriptor getter.

@item 
bpo-24268@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24268}: PEP 489: Multi-phase extension module initialization. Patch by
Petr Viktorin.

@item 
bpo-23955@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23955}: Add pyvenv.cfg option to suppress registry/environment lookup
for generating sys.path on Windows.

@item 
bpo-24257@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24257}: Fixed system error in the comparison of faked
types.SimpleNamespace.

@item 
bpo-22939@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22939}: Fixed integer overflow in iterator object.  Patch by Clement
Rouault.

@item 
bpo-23985@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23985}: Fix a possible buffer overrun when deleting a slice from the
front of a bytearray and then appending some other bytes data.

@item 
bpo-24102@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24102}: Fixed exception type checking in standard error handlers.

@item 
bpo-15027@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15027}: The UTF-32 encoder is now 3x to 7x faster.

@item 
bpo-23290@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23290}: Optimize set_merge() for cases where the target is empty.
(Contributed by Serhiy Storchaka.)

@item 
bpo-2292@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2292}: PEP 448: Additional Unpacking Generalizations.

@item 
bpo-24096@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24096}: Make warnings.warn_explicit more robust against mutation of the
warnings.filters list.

@item 
bpo-23996@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23996}: Avoid a crash when a delegated generator raises an unnormalized
StopIteration exception.  Patch by Stefan Behnel.

@item 
bpo-23910@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23910}: Optimize property() getter calls.  Patch by Joe Jevnik.

@item 
bpo-23911@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23911}: Move path-based importlib bootstrap code to a separate frozen
module.

@item 
bpo-24192@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24192}: Fix namespace package imports.

@item 
bpo-24022@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24022}: Fix tokenizer crash when processing undecodable source code.

@item 
bpo-9951@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9951}: Added a hex() method to bytes, bytearray, and memoryview.

@item 
bpo-22906@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22906}: PEP 479: Change StopIteration handling inside generators.

@item 
bpo-24017@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24017}: PEP 492: Coroutines with async and await syntax.
@end itemize

@node Library<207>,IDLE<63>,Core and Builtins<204>,Python 3 5 0 beta 1
@anchor{whatsnew/changelog id1076}@anchor{1fd9}
@subsubsection Library



@itemize -

@item 
bpo-14373@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14373}: Added C implementation of functools.lru_cache().  Based on
patches by Matt Joiner and Alexey Kachayev.

@item 
bpo-24230@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24230}: The tempfile module now accepts bytes for prefix, suffix and
dir parameters and returns bytes in such situations (matching the os
module APIs).

@item 
bpo-22189@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22189}: collections.UserString now supports __getnewargs__(),
__rmod__(), casefold(), format_map(), isprintable(), and maketrans().
Patch by Joe Jevnik.

@item 
bpo-24244@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24244}: Prevents termination when an invalid format string is
encountered on Windows in strftime.

@item 
bpo-23973@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23973}: PEP 484: Add the typing module.

@item 
bpo-23086@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23086}: The collections.abc.Sequence() abstract base class added
`start' and `stop' parameters to the index() mixin. Patch by Devin
Jeanpierre.

@item 
bpo-20035@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20035}: Replaced the @code{tkinter._fix} module used for setting up the
Tcl/Tk environment on Windows with a private function in the @code{_tkinter}
module that makes no permanent changes to the environment.

@item 
bpo-24257@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24257}: Fixed segmentation fault in sqlite3.Row constructor with faked
cursor type.

@item 
bpo-15836@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15836}: assertRaises(), assertRaisesRegex(), assertWarns() and
assertWarnsRegex() assertments now check the type of the first argument to
prevent possible user error.  Based on patch by Daniel Wagner-Hall.

@item 
bpo-9858@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9858}: Add missing method stubs to _io.RawIOBase.  Patch by Laura
Rupprecht.

@item 
bpo-22955@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22955}: attrgetter, itemgetter and methodcaller objects in the operator
module now support pickling.  Added readable and evaluable repr for these
objects. Based on patch by Josh Rosenberg.

@item 
bpo-22107@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22107}: tempfile.gettempdir() and tempfile.mkdtemp() now try again when
a directory with the chosen name already exists on Windows as well as on
Unix. tempfile.mkstemp() now fails early if parent directory is not valid
(not exists or is a file) on Windows.

@item 
bpo-23780@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23780}: Improved error message in os.path.join() with single argument.

@item 
bpo-6598@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6598}: Increased time precision and random number range in
email.utils.make_msgid() to strengthen the uniqueness of the message ID.

@item 
bpo-24091@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24091}: Fixed various crashes in corner cases in C implementation of
ElementTree.

@item 
bpo-21931@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21931}: msilib.FCICreate() now raises TypeError in the case of a bad
argument instead of a ValueError with a bogus FCI error number. Patch by
Jeffrey Armstrong.

@item 
bpo-13866@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13866}: `quote_via' argument added to urllib.parse.urlencode.

@item 
bpo-20098@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20098}: New mangle_from policy option for email, default True for
compat32, but False for all other policies.

@item 
bpo-24211@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24211}: The email library now supports RFC 6532: it can generate
headers using utf-8 instead of encoded words.

@item 
bpo-16314@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16314}: Added support for the LZMA compression in distutils.

@item 
bpo-21804@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21804}: poplib now supports RFC 6856 (UTF8).

@item 
bpo-18682@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18682}: Optimized pprint functions for builtin scalar types.

@item 
bpo-22027@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22027}: smtplib now supports RFC 6531 (SMTPUTF8).

@item 
bpo-23488@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23488}: Random generator objects now consume 2x less memory on 64-bit.

@item 
bpo-1322@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1322}: platform.dist() and platform.linux_distribution() functions are
now deprecated.  Initial patch by Vajrasky Kok.

@item 
bpo-22486@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22486}: Added the math.gcd() function.  The fractions.gcd() function
now is deprecated.  Based on patch by Mark Dickinson.

@item 
bpo-24064@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24064}: Property() docstrings are now writeable. (Patch by Berker
Peksag.)

@item 
bpo-22681@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22681}: Added support for the koi8_t encoding.

@item 
bpo-22682@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22682}: Added support for the kz1048 encoding.

@item 
bpo-23796@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23796}: peek and read1 methods of BufferedReader now raise ValueError
if they called on a closed object. Patch by John Hergenroeder.

@item 
bpo-21795@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21795}: smtpd now supports the 8BITMIME extension whenever the new
`decode_data' constructor argument is set to False.

@item 
bpo-24155@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24155}: optimize heapq.heapify() for better cache performance when
heapifying large lists.

@item 
bpo-21800@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21800}: imaplib now supports RFC 5161 (enable), RFC 6855
(utf8/internationalized email) and automatically encodes non-ASCII
usernames and passwords to UTF8.

@item 
bpo-20274@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20274}: When calling a _sqlite.Connection, it now complains if passed
any keyword arguments.  Previously it silently ignored them.

@item 
bpo-20274@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20274}: Remove ignored and erroneous “kwargs” parameters from three
METH_VARARGS methods on _sqlite.Connection.

@item 
bpo-24134@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24134}: assertRaises(), assertRaisesRegex(), assertWarns() and
assertWarnsRegex() checks now emits a deprecation warning when callable is
None or keyword arguments except msg is passed in the context manager
mode.

@item 
bpo-24018@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24018}: Add a collections.abc.Generator abstract base class.
Contributed by Stefan Behnel.

@item 
bpo-23880@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23880}: Tkinter’s getint() and getdouble() now support Tcl_Obj.
Tkinter’s getdouble() now supports any numbers (in particular int).

@item 
bpo-22619@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22619}: Added negative limit support in the traceback module. Based on
patch by Dmitry Kazakov.

@item 
bpo-24094@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24094}: Fix possible crash in json.encode with poorly behaved dict
subclasses.

@item 
bpo-9246@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9246}: On POSIX, os.getcwd() now supports paths longer than 1025 bytes.
Patch written by William Orr.

@item 
bpo-17445@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17445}: add difflib.diff_bytes() to support comparison of byte strings
(fixes a regression from Python 2).

@item 
bpo-23917@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23917}: Fall back to sequential compilation when ProcessPoolExecutor
doesn’t exist. Patch by Claudiu Popa.

@item 
bpo-23008@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23008}: Fixed resolving attributes with boolean value is False in
pydoc.

@item 
Fix asyncio issue 235: LifoQueue and PriorityQueue’s put didn’t increment
unfinished tasks (this bug was introduced when JoinableQueue was merged
with Queue).

@item 
bpo-23908@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23908}: os functions now reject paths with embedded null character on
Windows instead of silently truncating them.

@item 
bpo-23728@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23728}: binascii.crc_hqx() could return an integer outside of the range
0-0xffff for empty data.

@item 
bpo-23887@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23887}: urllib.error.HTTPError now has a proper repr() representation.
Patch by Berker Peksag.

@item 
asyncio: New event loop APIs: set_task_factory() and get_task_factory().

@item 
asyncio: async() function is deprecated in favour of ensure_future().

@item 
bpo-24178@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24178}: asyncio.Lock, Condition, Semaphore, and BoundedSemaphore
support new ‘async with’ syntax.  Contributed by Yury Selivanov.

@item 
bpo-24179@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24179}: Support ‘async for’ for asyncio.StreamReader. Contributed by
Yury Selivanov.

@item 
bpo-24184@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24184}: Add AsyncIterator and AsyncIterable ABCs to collections.abc.
Contributed by Yury Selivanov.

@item 
bpo-22547@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22547}: Implement informative __repr__ for inspect.BoundArguments.
Contributed by Yury Selivanov.

@item 
bpo-24190@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24190}: Implement inspect.BoundArgument.apply_defaults() method.
Contributed by Yury Selivanov.

@item 
bpo-20691@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20691}: Add ‘follow_wrapped’ argument to
inspect.Signature.from_callable() and inspect.signature(). Contributed by
Yury Selivanov.

@item 
bpo-24248@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24248}: Deprecate inspect.Signature.from_function() and
inspect.Signature.from_builtin().

@item 
bpo-23898@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23898}: Fix inspect.classify_class_attrs() to support attributes with
overloaded __eq__ and __bool__.  Patch by Mike Bayer.

@item 
bpo-24298@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24298}: Fix inspect.signature() to correctly unwrap wrappers around
bound methods.
@end itemize

@node IDLE<63>,Tests<89>,Library<207>,Python 3 5 0 beta 1
@anchor{whatsnew/changelog id1077}@anchor{1fda}
@subsubsection IDLE



@itemize -

@item 
bpo-23184@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23184}: remove unused names and imports in idlelib. Initial patch by Al
Sweigart.
@end itemize

@node Tests<89>,Documentation<87>,IDLE<63>,Python 3 5 0 beta 1
@anchor{whatsnew/changelog id1078}@anchor{1fdb}
@subsubsection Tests



@itemize -

@item 
bpo-21520@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21520}: test_zipfile no longer fails if the word ‘bad’ appears anywhere
in the name of the current directory.

@item 
bpo-9517@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9517}: Move script_helper into the support package. Patch by Christie
Wilson.
@end itemize

@node Documentation<87>,Tools/Demos<58>,Tests<89>,Python 3 5 0 beta 1
@anchor{whatsnew/changelog id1079}@anchor{1fdc}
@subsubsection Documentation



@itemize -

@item 
bpo-22155@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22155}: Add File Handlers subsection with createfilehandler to tkinter
doc.  Remove obsolete example from FAQ.  Patch by Martin Panter.

@item 
bpo-24029@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24029}: Document the name binding behavior for submodule imports.

@item 
bpo-24077@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24077}: Fix typo in man page for -I command option: -s, not -S
@end itemize

@node Tools/Demos<58>,,Documentation<87>,Python 3 5 0 beta 1
@anchor{whatsnew/changelog id1080}@anchor{1fdd}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-24000@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24000}: Improved Argument Clinic’s mapping of converters to legacy
“format units”. Updated the documentation to match.

@item 
bpo-24001@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24001}: Argument Clinic converters now use accept=@{type@} instead of
types=@{‘type’@} to specify the types the converter accepts.

@item 
bpo-23330@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23330}: h2py now supports arbitrary filenames in #include.

@item 
bpo-24031@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24031}: make patchcheck now supports git checkouts, too.
@end itemize

@node Python 3 5 0 alpha 4,Python 3 5 0 alpha 3,Python 3 5 0 beta 1,Changelog
@anchor{whatsnew/changelog python-3-5-0-alpha-4}@anchor{1fde}
@subsection Python 3.5.0 alpha 4


`Release date: 2015-04-19'

@menu
* Core and Builtins: Core and Builtins<205>. 
* Library: Library<208>. 
* Build: Build<101>. 
* Tests: Tests<90>. 
* Tools/Demos: Tools/Demos<59>. 
* C API: C API<80>. 

@end menu

@node Core and Builtins<205>,Library<208>,,Python 3 5 0 alpha 4
@anchor{whatsnew/changelog id1081}@anchor{1fdf}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-22980@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22980}: Under Linux, GNU/KFreeBSD and the Hurd, C extensions now
include the architecture triplet in the extension name, to make it easy to
test builds for different ABIs in the same working tree.  Under OS X, the
extension name now includes 
@geindex Python Enhancement Proposals; PEP 3149
PEP 3149@footnote{https://peps.python.org/pep-3149/}-style information.

@item 
bpo-22631@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22631}: Added Linux-specific socket constant CAN_RAW_FD_FRAMES. Patch
courtesy of Joe Jevnik.

@item 
bpo-23731@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23731}: Implement 
@geindex Python Enhancement Proposals; PEP 488
PEP 488@footnote{https://peps.python.org/pep-0488/}: removal of .pyo files.

@item 
bpo-23726@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23726}: Don’t enable GC for user subclasses of non-GC types that don’t
add any new fields.  Patch by Eugene Toder.

@item 
bpo-23309@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23309}: Avoid a deadlock at shutdown if a daemon thread is aborted
while it is holding a lock to a buffered I/O object, and the main thread
tries to use the same I/O object (typically stdout or stderr).  A fatal
error is emitted instead.

@item 
bpo-22977@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22977}: Fixed formatting Windows error messages on Wine. Patch by
Martin Panter.

@item 
bpo-23466@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23466}: %c, %o, %x, and %X in bytes formatting now raise TypeError on
non-integer input.

@item 
bpo-24044@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24044}: Fix possible null pointer dereference in list.sort in out of
memory conditions.

@item 
bpo-21354@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21354}: PyCFunction_New function is exposed by python DLL again.
@end itemize

@node Library<208>,Build<101>,Core and Builtins<205>,Python 3 5 0 alpha 4
@anchor{whatsnew/changelog id1082}@anchor{1fe0}
@subsubsection Library



@itemize -

@item 
bpo-23840@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23840}: tokenize.open() now closes the temporary binary file on error
to fix a resource warning.

@item 
bpo-16914@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16914}: new debuglevel 2 in smtplib adds timestamps to debug output.

@item 
bpo-7159@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7159}: urllib.request now supports sending auth credentials
automatically after the first 401.  This enhancement is a superset of the
enhancement from bpo-19494@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19494} and supersedes that change.

@item 
bpo-23703@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23703}: Fix a regression in urljoin() introduced in 901e4e52b20a. Patch
by Demian Brecht.

@item 
bpo-4254@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4254}: Adds _curses.update_lines_cols().  Patch by Arnon Yaari

@item 
bpo-19933@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19933}: Provide default argument for ndigits in round. Patch by
Vajrasky Kok.

@item 
bpo-23193@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23193}: Add a numeric_owner parameter to tarfile.TarFile.extract and
tarfile.TarFile.extractall. Patch by Michael Vogt and Eric Smith.

@item 
bpo-23342@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23342}: Add a subprocess.run() function than returns a CalledProcess
instance for a more consistent API than the existing call* functions.

@item 
bpo-21217@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21217}: inspect.getsourcelines() now tries to compute the start and end
lines from the code object, fixing an issue when a lambda function is used
as decorator argument. Patch by Thomas Ballinger and Allison Kaptur.

@item 
bpo-24521@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24521}: Fix possible integer overflows in the pickle module.

@item 
bpo-22931@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22931}: Allow ‘[’ and ‘]’ in cookie values.

@item 
The keywords attribute of functools.partial is now always a dictionary.

@item 
bpo-23811@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23811}: Add missing newline to the PyCompileError error message. Patch
by Alex Shkop.

@item 
bpo-21116@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21116}: Avoid blowing memory when allocating a multiprocessing shared
array that’s larger than 50% of the available RAM.  Patch by Médéric
Boquien.

@item 
bpo-22982@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22982}: Improve BOM handling when seeking to multiple positions of a
writable text file.

@item 
bpo-23464@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23464}: Removed deprecated asyncio JoinableQueue.

@item 
bpo-23529@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23529}: Limit the size of decompressed data when reading from GzipFile,
BZ2File or LZMAFile.  This defeats denial of service attacks using
compressed bombs (i.e. compressed payloads which decompress to a huge
size).  Patch by Martin Panter and Nikolaus Rath.

@item 
bpo-21859@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21859}: Added Python implementation of io.FileIO.

@item 
bpo-23865@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23865}: close() methods in multiple modules now are idempotent and more
robust at shutdown. If they need to release multiple resources, all are
released even if errors occur.

@item 
bpo-23400@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23400}: Raise same exception on both Python 2 and 3 if sem_open is not
available. Patch by Davin Potts.

@item 
bpo-10838@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10838}: The subprocess now module includes SubprocessError and
TimeoutError in its list of exported names for the users wild enough to
use @code{from subprocess import *}.

@item 
bpo-23411@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23411}: Added DefragResult, ParseResult, SplitResult,
DefragResultBytes, ParseResultBytes, and SplitResultBytes to
urllib.parse.__all__. Patch by Martin Panter.

@item 
bpo-23881@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23881}: urllib.request.ftpwrapper constructor now closes the socket if
the FTP connection failed to fix a ResourceWarning.

@item 
bpo-23853@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23853}: @ref{fae,,socket.socket.sendall()} does no more reset the socket
timeout each time data is sent successfully. The socket timeout is now the
maximum total duration to send all data.

@item 
bpo-22721@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22721}: An order of multiline pprint output of set or dict containing
orderable and non-orderable elements no longer depends on iteration order
of set or dict.

@item 
bpo-15133@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15133}: _tkinter.tkapp.getboolean() now supports Tcl_Obj and always
returns bool. tkinter.BooleanVar now validates input values (accepted
bool, int, str, and Tcl_Obj).  tkinter.BooleanVar.get() now always returns
bool.

@item 
bpo-10590@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10590}: xml.sax.parseString() now supports string argument.

@item 
bpo-23338@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23338}: Fixed formatting ctypes error messages on Cygwin. Patch by
Makoto Kato.

@item 
bpo-15582@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15582}: inspect.getdoc() now follows inheritance chains.

@item 
bpo-2175@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2175}: SAX parsers now support a character stream of InputSource
object.

@item 
bpo-16840@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16840}: Tkinter now supports 64-bit integers added in Tcl 8.4 and
arbitrary precision integers added in Tcl 8.5.

@item 
bpo-23834@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23834}: Fix socket.sendto(), use the C Py_ssize_t type to store the
result of sendto() instead of the C int type.

@item 
bpo-23618@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23618}: @ref{fa9,,socket.socket.connect()} now waits until the connection
completes instead of raising @ref{f8e,,InterruptedError} if the connection is
interrupted by signals, signal handlers don’t raise an exception and the
socket is blocking or has a timeout. @code{socket.socket.connect()} still
raise @code{InterruptedError} for non-blocking sockets.

@item 
bpo-21526@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21526}: Tkinter now supports new boolean type in Tcl 8.5.

@item 
bpo-23836@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23836}: Fix the faulthandler module to handle reentrant calls to its
signal handlers.

@item 
bpo-23838@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23838}: linecache now clears the cache and returns an empty result on
MemoryError.

@item 
bpo-10395@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10395}: Added os.path.commonpath(). Implemented in posixpath and
ntpath. Based on patch by Rafik Draoui.

@item 
bpo-23611@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23611}: Serializing more “lookupable” objects (such as unbound methods
or nested classes) now are supported with pickle protocols < 4.

@item 
bpo-13583@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13583}: sqlite3.Row now supports slice indexing.

@item 
bpo-18473@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18473}: Fixed 2to3 and 3to2 compatible pickle mappings.  Fixed
ambiguous reverse mappings.  Added many new mappings.  Import mapping is
no longer applied to modules already mapped with full name mapping.

@item 
bpo-23485@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23485}: select.select() is now retried automatically with the
recomputed timeout when interrupted by a signal, except if the signal
handler raises an exception. This change is part of the 
@geindex Python Enhancement Proposals; PEP 475
PEP 475@footnote{https://peps.python.org/pep-0475/}.

@item 
bpo-23752@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23752}: When built from an existing file descriptor, io.FileIO() now
only calls fstat() once. Before fstat() was called twice, which was not
necessary.

@item 
bpo-23704@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23704}: collections.deque() objects now support __add__, __mul__, and
__imul__().

@item 
bpo-23171@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23171}: csv.Writer.writerow() now supports arbitrary iterables.

@item 
bpo-23745@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23745}: The new email header parser now handles duplicate MIME
parameter names without error, similar to how get_param behaves.

@item 
bpo-22117@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22117}: Fix os.utime(), it now rounds the timestamp towards minus
infinity (-inf) instead of rounding towards zero.

@item 
bpo-23310@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23310}: Fix MagicMock’s initializer to work with __methods__, just like
configure_mock().  Patch by Kasia Jachim.
@end itemize

@node Build<101>,Tests<90>,Library<208>,Python 3 5 0 alpha 4
@anchor{whatsnew/changelog id1083}@anchor{1fe1}
@subsubsection Build



@itemize -

@item 
bpo-23817@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23817}: FreeBSD now uses “1.0” in the SOVERSION as other operating
systems, instead of just “1”.

@item 
bpo-23501@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23501}: Argument Clinic now generates code into separate files by
default.
@end itemize

@node Tests<90>,Tools/Demos<59>,Build<101>,Python 3 5 0 alpha 4
@anchor{whatsnew/changelog id1084}@anchor{1fe2}
@subsubsection Tests



@itemize -

@item 
bpo-23799@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23799}: Added test.support.start_threads() for running and cleaning up
multiple threads.

@item 
bpo-22390@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22390}: test.regrtest now emits a warning if temporary files or
directories are left after running a test.
@end itemize

@node Tools/Demos<59>,C API<80>,Tests<90>,Python 3 5 0 alpha 4
@anchor{whatsnew/changelog id1085}@anchor{1fe3}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-18128@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18128}: pygettext now uses standard +NNNN format in the
POT-Creation-Date header.

@item 
bpo-23935@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23935}: Argument Clinic’s understanding of format units accepting
bytes, bytearrays, and buffers is now consistent with both the
documentation and the implementation.

@item 
bpo-23944@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23944}: Argument Clinic now wraps long impl prototypes at column 78.

@item 
bpo-20586@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20586}: Argument Clinic now ensures that functions without docstrings
have signatures.

@item 
bpo-23492@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23492}: Argument Clinic now generates argument parsing code with
PyArg_Parse instead of PyArg_ParseTuple if possible.

@item 
bpo-23500@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23500}: Argument Clinic is now smarter about generating the “#ifndef”
(empty) definition of the methoddef macro: it’s only generated once, even
if Argument Clinic processes the same symbol multiple times, and it’s
emitted at the end of all processing rather than immediately after the
first use.
@end itemize

@node C API<80>,,Tools/Demos<59>,Python 3 5 0 alpha 4
@anchor{whatsnew/changelog id1086}@anchor{1fe4}
@subsubsection C API



@itemize -

@item 
bpo-23998@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23998}: PyImport_ReInitLock() now checks for lock allocation error
@end itemize

@node Python 3 5 0 alpha 3,Python 3 5 0 alpha 2,Python 3 5 0 alpha 4,Changelog
@anchor{whatsnew/changelog python-3-5-0-alpha-3}@anchor{1fe5}
@subsection Python 3.5.0 alpha 3


`Release date: 2015-03-28'

@menu
* Core and Builtins: Core and Builtins<206>. 
* Library: Library<209>. 
* Build: Build<102>. 
* Tests: Tests<91>. 
* Tools/Demos: Tools/Demos<60>. 

@end menu

@node Core and Builtins<206>,Library<209>,,Python 3 5 0 alpha 3
@anchor{whatsnew/changelog id1087}@anchor{1fe6}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-23573@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23573}: Increased performance of string search operations (str.find,
str.index, str.count, the in operator, str.split, str.partition) with
arguments of different kinds (UCS1, UCS2, UCS4).

@item 
bpo-23753@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23753}: Python doesn’t support anymore platforms without stat() or
fstat(), these functions are always required.

@item 
bpo-23681@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23681}: The -b option now affects comparisons of bytes with int.

@item 
bpo-23632@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23632}: Memoryviews now allow tuple indexing (including for
multi-dimensional memoryviews).

@item 
bpo-23192@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23192}: Fixed generator lambdas.  Patch by Bruno Cauet.

@item 
bpo-23629@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23629}: Fix the default __sizeof__ implementation for variable-sized
objects.
@end itemize

@node Library<209>,Build<102>,Core and Builtins<206>,Python 3 5 0 alpha 3
@anchor{whatsnew/changelog id1088}@anchor{1fe7}
@subsubsection Library



@itemize -

@item 
bpo-14260@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14260}: The groupindex attribute of regular expression pattern object
now is non-modifiable mapping.

@item 
bpo-23792@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23792}: Ignore KeyboardInterrupt when the pydoc pager is active. This
mimics the behavior of the standard unix pagers, and prevents pipepager
from shutting down while the pager itself is still running.

@item 
bpo-23775@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23775}: pprint() of OrderedDict now outputs the same representation as
repr().

@item 
bpo-23765@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23765}: Removed IsBadStringPtr calls in ctypes

@item 
bpo-22364@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22364}: Improved some re error messages using regex for hints.

@item 
bpo-23742@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23742}: ntpath.expandvars() no longer loses unbalanced single quotes.

@item 
bpo-21717@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21717}: The zipfile.ZipFile.open function now supports ‘x’ (exclusive
creation) mode.

@item 
bpo-21802@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21802}: The reader in BufferedRWPair now is closed even when closing
writer failed in BufferedRWPair.close().

@item 
bpo-23622@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23622}: Unknown escapes in regular expressions that consist of @code{'\'}
and ASCII letter now raise a deprecation warning and will be forbidden in
Python 3.6.

@item 
bpo-23671@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23671}: string.Template now allows specifying the “self” parameter as a
keyword argument.  string.Formatter now allows specifying the “self” and
the “format_string” parameters as keyword arguments.

@item 
bpo-23502@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23502}: The pprint module now supports mapping proxies.

@item 
bpo-17530@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17530}: pprint now wraps long bytes objects and bytearrays.

@item 
bpo-22687@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22687}: Fixed some corner cases in breaking words in tetxtwrap. Got rid
of quadratic complexity in breaking long words.

@item 
bpo-4727@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4727}: The copy module now uses pickle protocol 4 (PEP 3154) and
supports copying of instances of classes whose __new__ method takes
keyword-only arguments.

@item 
bpo-23491@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23491}: Added a zipapp module to support creating executable zip file
archives of Python code. Registered “.pyz” and “.pyzw” extensions on
Windows for these archives (PEP 441).

@item 
bpo-23657@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23657}: Avoid explicit checks for str in zipapp, adding support for
pathlib.Path objects as arguments.

@item 
bpo-23688@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23688}: Added support of arbitrary bytes-like objects and avoided
unnecessary copying of memoryview in gzip.GzipFile.write(). Original patch
by Wolfgang Maier.

@item 
bpo-23252@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23252}: Added support for writing ZIP files to unseekable streams.

@item 
bpo-23647@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23647}: Increase imaplib’s MAXLINE to accommodate modern mailbox sizes.

@item 
bpo-23539@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23539}: If body is None, http.client.HTTPConnection.request now sets
Content-Length to 0 for PUT, POST, and PATCH headers to avoid 411 errors
from some web servers.

@item 
bpo-22351@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22351}: The nntplib.NNTP constructor no longer leaves the connection
and socket open until the garbage collector cleans them up.  Patch by
Martin Panter.

@item 
bpo-23704@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23704}: collections.deque() objects now support methods for index(),
insert(), and copy().  This allows deques to be registered as a
MutableSequence and it improves their substitutability for lists.

@item 
bpo-23715@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23715}: @ref{fb1,,signal.sigwaitinfo()} and @ref{fb0,,signal.sigtimedwait()} are
now retried when interrupted by a signal not in the `sigset' parameter, if
the signal handler does not raise an exception. signal.sigtimedwait()
recomputes the timeout with a monotonic clock when it is retried.

@item 
bpo-23001@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23001}: Few functions in modules mmap, ossaudiodev, socket, ssl, and
codecs, that accepted only read-only bytes-like object now accept writable
bytes-like object too.

@item 
bpo-23646@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23646}: If time.sleep() is interrupted by a signal, the sleep is now
retried with the recomputed delay, except if the signal handler raises an
exception (PEP 475).

@item 
bpo-23136@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23136}: _strptime now uniformly handles all days in week 0, including
Dec 30 of previous year.  Based on patch by Jim Carroll.

@item 
bpo-23700@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23700}: Iterator of NamedTemporaryFile now keeps a reference to
NamedTemporaryFile instance.  Patch by Bohuslav Kabrda.

@item 
bpo-22903@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22903}: The fake test case created by unittest.loader when it fails
importing a test module is now picklable.

@item 
bpo-22181@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22181}: On Linux, os.urandom() now uses the new getrandom() syscall if
available, syscall introduced in the Linux kernel 3.17. It is more
reliable and more secure, because it avoids the need of a file descriptor
and waits until the kernel has enough entropy.

@item 
bpo-2211@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2211}: Updated the implementation of the http.cookies.Morsel class.
Setting attributes key, value and coded_value directly now is deprecated.
update() and setdefault() now transform and check keys.  Comparing for
equality now takes into account attributes key, value and coded_value.
copy() now returns a Morsel, not a dict.  repr() now contains all
attributes. Optimized checking keys and quoting values.  Added new tests.
Original patch by Demian Brecht.

@item 
bpo-18983@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18983}: Allow selection of output units in timeit. Patch by Julian
Gindi.

@item 
bpo-23631@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23631}: Fix traceback.format_list when a traceback has been mutated.

@item 
bpo-23568@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23568}: Add rdivmod support to MagicMock() objects. Patch by Håkan
Lövdahl.

@item 
bpo-2052@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2052}: Add charset parameter to HtmlDiff.make_file().

@item 
bpo-23668@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23668}: Support os.truncate and os.ftruncate on Windows.

@item 
bpo-23138@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23138}: Fixed parsing cookies with absent keys or values in cookiejar.
Patch by Demian Brecht.

@item 
bpo-23051@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23051}: multiprocessing.Pool methods imap() and imap_unordered() now
handle exceptions raised by an iterator.  Patch by Alon Diamant and Davin
Potts.

@item 
bpo-23581@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23581}: Add matmul support to MagicMock. Patch by Håkan Lövdahl.

@item 
bpo-23566@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23566}: enable(), register(), dump_traceback() and
dump_traceback_later() functions of faulthandler now accept file
descriptors. Patch by Wei Wu.

@item 
bpo-22928@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22928}: Disabled HTTP header injections in http.client. Original patch
by Demian Brecht.

@item 
bpo-23615@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23615}: Modules bz2, tarfile and tokenize now can be reloaded with
imp.reload(). Patch by Thomas Kluyver.

@item 
bpo-23605@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23605}: os.walk() now calls os.scandir() instead of os.listdir(). The
usage of os.scandir() reduces the number of calls to os.stat(). Initial
patch written by Ben Hoyt.
@end itemize

@node Build<102>,Tests<91>,Library<209>,Python 3 5 0 alpha 3
@anchor{whatsnew/changelog id1089}@anchor{1fe8}
@subsubsection Build



@itemize -

@item 
bpo-23585@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23585}: make patchcheck will ensure the interpreter is built.
@end itemize

@node Tests<91>,Tools/Demos<60>,Build<102>,Python 3 5 0 alpha 3
@anchor{whatsnew/changelog id1090}@anchor{1fe9}
@subsubsection Tests



@itemize -

@item 
bpo-23583@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23583}: Added tests for standard IO streams in IDLE.

@item 
bpo-22289@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22289}: Prevent test_urllib2net failures due to ftp connection timeout.
@end itemize

@node Tools/Demos<60>,,Tests<91>,Python 3 5 0 alpha 3
@anchor{whatsnew/changelog id1091}@anchor{1fea}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-22826@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22826}: The result of open() in Tools/freeze/bkfile.py is now better
compatible with regular files (in particular it now supports the context
management protocol).
@end itemize

@node Python 3 5 0 alpha 2,Python 3 5 0 alpha 1,Python 3 5 0 alpha 3,Changelog
@anchor{whatsnew/changelog python-3-5-0-alpha-2}@anchor{1feb}
@subsection Python 3.5.0 alpha 2


`Release date: 2015-03-09'

@menu
* Core and Builtins: Core and Builtins<207>. 
* Library: Library<210>. 
* Build: Build<103>. 
* C API: C API<81>. 
* Windows: Windows<84>. 

@end menu

@node Core and Builtins<207>,Library<210>,,Python 3 5 0 alpha 2
@anchor{whatsnew/changelog id1092}@anchor{1fec}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-23571@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23571}: PyObject_Call() and PyCFunction_Call() now raise a SystemError
if a function returns a result and raises an exception. The SystemError is
chained to the previous exception.
@end itemize

@node Library<210>,Build<103>,Core and Builtins<207>,Python 3 5 0 alpha 2
@anchor{whatsnew/changelog id1093}@anchor{1fed}
@subsubsection Library



@itemize -

@item 
bpo-22524@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22524}: New os.scandir() function, part of the 
@geindex Python Enhancement Proposals; PEP 471
PEP 471@footnote{https://peps.python.org/pep-0471/}:
“os.scandir() function – a better and faster directory iterator”. Patch
written by Ben Hoyt.

@item 
bpo-23103@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23103}: Reduced the memory consumption of IPv4Address and IPv6Address.

@item 
bpo-21793@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21793}: BaseHTTPRequestHandler again logs response code as numeric, not
as stringified enum.  Patch by Demian Brecht.

@item 
bpo-23476@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23476}: In the ssl module, enable OpenSSL’s X509_V_FLAG_TRUSTED_FIRST
flag on certificate stores when it is available.

@item 
bpo-23576@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23576}: Avoid stalling in SSL reads when EOF has been reached in the
SSL layer but the underlying connection hasn’t been closed.

@item 
bpo-23504@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23504}: Added an __all__ to the types module.

@item 
bpo-23563@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23563}: Optimized utility functions in urllib.parse.

@item 
bpo-7830@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7830}: Flatten nested functools.partial.

@item 
bpo-20204@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20204}: Added the __module__ attribute to _tkinter classes.

@item 
bpo-19980@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19980}: Improved help() for non-recognized strings.  help(‘’) now shows
the help on str.  help(‘help’) now shows the help on help(). Original
patch by Mark Lawrence.

@item 
bpo-23521@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23521}: Corrected pure python implementation of timedelta division.
Eliminated OverflowError from @code{timedelta * float} for some floats;
Corrected rounding in timedelta true division.

@item 
bpo-21619@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21619}: Popen objects no longer leave a zombie after exit in the with
statement if the pipe was broken.  Patch by Martin Panter.

@item 
bpo-22936@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22936}: Make it possible to show local variables in tracebacks for both
the traceback module and unittest.

@item 
bpo-15955@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15955}: Add an option to limit the output size in bz2.decompress().
Patch by Nikolaus Rath.

@item 
bpo-6639@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6639}: Module-level turtle functions no longer raise TclError after
closing the window.

@item 
bpo-814253@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=814253}: Group references and conditional group references now work in
lookbehind assertions in regular expressions. (See also: bpo-9179@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9179})

@item 
bpo-23215@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23215}: Multibyte codecs with custom error handlers that ignores errors
consumed too much memory and raised SystemError or MemoryError. Original
patch by Aleksi Torhamo.

@item 
bpo-5700@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5700}: io.FileIO() called flush() after closing the file. flush() was
not called in close() if closefd=False.

@item 
bpo-23374@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23374}: Fixed pydoc failure with non-ASCII files when stdout encoding
differs from file system encoding (e.g. on Mac OS).

@item 
bpo-23481@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23481}: Remove RC4 from the SSL module’s default cipher list.

@item 
bpo-21548@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21548}: Fix pydoc.synopsis() and pydoc.apropos() on modules with empty
docstrings.

@item 
bpo-22885@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22885}: Fixed arbitrary code execution vulnerability in the dbm.dumb
module. Original patch by Claudiu Popa.

@item 
bpo-23239@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23239}: ssl.match_hostname() now supports matching of IP addresses.

@item 
bpo-23146@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23146}: Fix mishandling of absolute Windows paths with forward slashes
in pathlib.

@item 
bpo-23096@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23096}: Pickle representation of floats with protocol 0 now is the same
for both Python and C implementations.

@item 
bpo-19105@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19105}: pprint now more efficiently uses free space at the right.

@item 
bpo-14910@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14910}: Add allow_abbrev parameter to argparse.ArgumentParser. Patch by
Jonathan Paugh, Steven Bethard, paul j3 and Daniel Eriksson.

@item 
bpo-21717@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21717}: tarfile.open() now supports ‘x’ (exclusive creation) mode.

@item 
bpo-23344@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23344}: marshal.dumps() is now 20-25% faster on average.

@item 
bpo-20416@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20416}: marshal.dumps() with protocols 3 and 4 is now 40-50% faster on
average.

@item 
bpo-23421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23421}: Fixed compression in tarfile CLI.  Patch by wdv4758h.

@item 
bpo-23367@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23367}: Fix possible overflows in the unicodedata module.

@item 
bpo-23361@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23361}: Fix possible overflow in Windows subprocess creation code.

@item 
logging.handlers.QueueListener now takes a respect_handler_level keyword
argument which, if set to True, will pass messages to handlers taking
handler levels into account.

@item 
bpo-19705@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19705}: turtledemo now has a visual sorting algorithm demo.  Original
patch from Jason Yeo.

@item 
bpo-23801@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23801}: Fix issue where cgi.FieldStorage did not always ignore the
entire preamble to a multipart body.
@end itemize

@node Build<103>,C API<81>,Library<210>,Python 3 5 0 alpha 2
@anchor{whatsnew/changelog id1094}@anchor{1fee}
@subsubsection Build



@itemize -

@item 
bpo-23445@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23445}: pydebug builds now use “gcc -Og” where possible, to make the
resulting executable faster.

@item 
bpo-23686@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23686}: Update OS X 10.5 installer build to use OpenSSL 1.0.2a.
@end itemize

@node C API<81>,Windows<84>,Build<103>,Python 3 5 0 alpha 2
@anchor{whatsnew/changelog id1095}@anchor{1fef}
@subsubsection C API



@itemize -

@item 
bpo-20204@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20204}: Deprecation warning is now raised for builtin types without the
__module__ attribute.
@end itemize

@node Windows<84>,,C API<81>,Python 3 5 0 alpha 2
@anchor{whatsnew/changelog id1096}@anchor{1ff0}
@subsubsection Windows



@itemize -

@item 
bpo-23465@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23465}: Implement 
@geindex Python Enhancement Proposals; PEP 486
PEP 486@footnote{https://peps.python.org/pep-0486/} - Make the Python Launcher aware of
virtual environments. Patch by Paul Moore.

@item 
bpo-23437@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23437}: Make user scripts directory versioned on Windows. Patch by Paul
Moore.
@end itemize

@node Python 3 5 0 alpha 1,,Python 3 5 0 alpha 2,Changelog
@anchor{whatsnew/changelog python-3-5-0-alpha-1}@anchor{1ff1}
@subsection Python 3.5.0 alpha 1


`Release date: 2015-02-08'

@menu
* Core and Builtins: Core and Builtins<208>. 
* Library: Library<211>. 
* IDLE: IDLE<64>. 
* Build: Build<104>. 
* C API: C API<82>. 
* Documentation: Documentation<88>. 
* Tests: Tests<92>. 
* Tools/Demos: Tools/Demos<61>. 
* Windows: Windows<85>. 

@end menu

@node Core and Builtins<208>,Library<211>,,Python 3 5 0 alpha 1
@anchor{whatsnew/changelog id1097}@anchor{1ff2}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-23285@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23285}: PEP 475 - EINTR handling.

@item 
bpo-22735@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22735}: Fix many edge cases (including crashes) involving custom mro()
implementations.

@item 
bpo-22896@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22896}: Avoid using PyObject_AsCharBuffer(), PyObject_AsReadBuffer()
and PyObject_AsWriteBuffer().

@item 
bpo-21295@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21295}: Revert some changes (bpo-16795@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16795}) to AST line numbers and
column offsets that constituted a regression.

@item 
bpo-22986@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22986}: Allow changing an object’s __class__ between a dynamic type and
static type in some cases.

@item 
bpo-15859@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15859}: PyUnicode_EncodeFSDefault(), PyUnicode_EncodeMBCS() and
PyUnicode_EncodeCodePage() now raise an exception if the object is not a
Unicode object. For PyUnicode_EncodeFSDefault(), it was already the case
on platforms other than Windows. Patch written by Campbell Barton.

@item 
bpo-21408@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21408}: The default __ne__() now returns NotImplemented if __eq__()
returned NotImplemented.  Original patch by Martin Panter.

@item 
bpo-23321@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23321}: Fixed a crash in str.decode() when error handler returned
replacement string longer than malformed input data.

@item 
bpo-22286@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22286}: The “backslashreplace” error handlers now works with decoding
and translating.

@item 
bpo-23253@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23253}: Delay-load ShellExecute[AW] in os.startfile for reduced startup
overhead on Windows.

@item 
bpo-22038@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22038}: pyatomic.h now uses stdatomic.h or GCC built-in functions for
atomic memory access if available. Patch written by Vitor de Lima and
Gustavo Temple.

@item 
bpo-20284@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20284}: %-interpolation (aka printf) formatting added for bytes and
bytearray.

@item 
bpo-23048@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23048}: Fix jumping out of an infinite while loop in the pdb.

@item 
bpo-20335@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20335}: bytes constructor now raises TypeError when encoding or errors
is specified with non-string argument.  Based on patch by Renaud Blanch.

@item 
bpo-22834@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22834}: If the current working directory ends up being set to a
non-existent directory then import will no longer raise FileNotFoundError.

@item 
bpo-22869@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22869}: Move the interpreter startup & shutdown code to a new dedicated
pylifecycle.c module

@item 
bpo-22847@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22847}: Improve method cache efficiency.

@item 
bpo-22335@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22335}: Fix crash when trying to enlarge a bytearray to 0x7fffffff
bytes on a 32-bit platform.

@item 
bpo-22653@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22653}: Fix an assertion failure in debug mode when doing a reentrant
dict insertion in debug mode.

@item 
bpo-22643@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22643}: Fix integer overflow in Unicode case operations (upper, lower,
title, swapcase, casefold).

@item 
bpo-17636@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17636}: Circular imports involving relative imports are now supported.

@item 
bpo-22604@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22604}: Fix assertion error in debug mode when dividing a complex
number by (nan+0j).

@item 
bpo-21052@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21052}: Do not raise ImportWarning when sys.path_hooks or sys.meta_path
are set to None.

@item 
bpo-16518@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16518}: Use ‘bytes-like object required’ in error messages that
previously used the far more cryptic “‘x’ does not support the buffer
protocol.

@item 
bpo-22470@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22470}: Fixed integer overflow issues in “backslashreplace”,
“xmlcharrefreplace”, and “surrogatepass” error handlers.

@item 
bpo-22540@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22540}: speed up @code{PyObject_IsInstance} and @code{PyObject_IsSubclass} in
the common case that the second argument has metaclass @code{type}.

@item 
bpo-18711@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18711}: Add a new @code{PyErr_FormatV} function, similar to
@code{PyErr_Format} but accepting a @code{va_list} argument.

@item 
bpo-22520@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22520}: Fix overflow checking when generating the repr of a unicode
object.

@item 
bpo-22519@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22519}: Fix overflow checking in PyBytes_Repr.

@item 
bpo-22518@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22518}: Fix integer overflow issues in latin-1 encoding.

@item 
bpo-16324@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16324}: _charset parameter of MIMEText now also accepts
email.charset.Charset instances. Initial patch by Claude Paroz.

@item 
bpo-1764286@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1764286}: Fix inspect.getsource() to support decorated functions. Patch
by Claudiu Popa.

@item 
bpo-18554@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18554}: os.__all__ includes posix functions.

@item 
bpo-21391@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21391}: Use os.path.abspath in the shutil module.

@item 
bpo-11471@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11471}: avoid generating a JUMP_FORWARD instruction at the end of an
if-block if there is no else-clause.  Original patch by Eugene Toder.

@item 
bpo-22215@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22215}: Now ValueError is raised instead of TypeError when str or bytes
argument contains not permitted null character or byte.

@item 
bpo-22258@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22258}: Fix the internal function set_inheritable() on Illumos. This
platform exposes the function @code{ioctl(FIOCLEX)}, but calling it fails
with errno is ENOTTY: “Inappropriate ioctl for device”. set_inheritable()
now falls back to the slower @code{fcntl()} (@code{F_GETFD} and then
@code{F_SETFD}).

@item 
bpo-21389@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21389}: Displaying the __qualname__ of the underlying function in the
repr of a bound method.

@item 
bpo-22206@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22206}: Using pthread, PyThread_create_key() now sets errno to ENOMEM
and returns -1 (error) on integer overflow.

@item 
bpo-20184@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20184}: Argument Clinic based signature introspection added for 30 of
the builtin functions.

@item 
bpo-22116@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22116}: C functions and methods (of the ‘builtin_function_or_method’
type) can now be weakref’ed.  Patch by Wei Wu.

@item 
bpo-22077@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22077}: Improve index error messages for bytearrays, bytes, lists, and
tuples by adding ‘or slices’. Added ‘, not <typename>’ for bytearrays.
Original patch by Claudiu Popa.

@item 
bpo-20179@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20179}: Apply Argument Clinic to bytes and bytearray. Patch by Tal
Einat.

@item 
bpo-22082@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22082}: Clear interned strings in slotdefs.

@item 
Upgrade Unicode database to Unicode 7.0.0.

@item 
bpo-21897@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21897}: Fix a crash with the f_locals attribute with closure variables
when frame.clear() has been called.

@item 
bpo-21205@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21205}: Add a new @code{__qualname__} attribute to generator, the
qualified name, and use it in the representation of a generator
(@code{repr(gen)}). The default name of the generator (@code{__name__}
attribute) is now get from the function instead of the code. Use
@code{gen.gi_code.co_name} to get the name of the code.

@item 
bpo-21669@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21669}: With the aid of heuristics in SyntaxError.__init__, the parser
now attempts to generate more meaningful (or at least more search engine
friendly) error messages when “exec” and “print” are used as statements.

@item 
bpo-21642@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21642}: In the conditional if-else expression, allow an integer written
with no space between itself and the @code{else} keyword (e.g. @code{True if
42else False}) to be valid syntax.

@item 
bpo-21523@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21523}: Fix over-pessimistic computation of the stack effect of some
opcodes in the compiler.  This also fixes a quadratic compilation time
issue noticeable when compiling code with a large number of “and” and “or”
operators.

@item 
bpo-21418@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21418}: Fix a crash in the builtin function super() when called without
argument and without current frame (ex: embedded Python).

@item 
bpo-21425@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21425}: Fix flushing of standard streams in the interactive
interpreter.

@item 
bpo-21435@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21435}: In rare cases, when running finalizers on objects in cyclic
trash a bad pointer dereference could occur due to a subtle flaw in
internal iteration logic.

@item 
bpo-21377@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21377}: PyBytes_Concat() now tries to concatenate in-place when the
first argument has a reference count of 1.  Patch by Nikolaus Rath.

@item 
bpo-20355@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20355}: -W command line options now have higher priority than the
PYTHONWARNINGS environment variable.  Patch by Arfrever.

@item 
bpo-21274@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21274}: Define PATH_MAX for GNU/Hurd in Python/pythonrun.c.

@item 
bpo-20904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20904}: Support setting FPU precision on m68k.

@item 
bpo-21209@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21209}: Fix sending tuples to custom generator objects with the yield
from syntax.

@item 
bpo-21193@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21193}: pow(a, b, c) now raises ValueError rather than TypeError when b
is negative. Patch by Josh Rosenberg.

@item 
bpo-21176@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21176}: PEP 465: Add the ‘@@’ operator for matrix multiplication.

@item 
bpo-21134@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21134}: Fix segfault when str is called on an uninitialized
UnicodeEncodeError, UnicodeDecodeError, or UnicodeTranslateError object.

@item 
bpo-19537@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19537}: Fix PyUnicode_DATA() alignment under m68k.  Patch by Andreas
Schwab.

@item 
bpo-20929@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20929}: Add a type cast to avoid shifting a negative number.

@item 
bpo-20731@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20731}: Properly position in source code files even if they are opened
in text mode. Patch by Serhiy Storchaka.

@item 
bpo-20637@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20637}: Key-sharing now also works for instance dictionaries of
subclasses.  Patch by Peter Ingebretson.

@item 
bpo-8297@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8297}: Attributes missing from modules now include the module name in
the error text.  Original patch by ysj.ray.

@item 
bpo-19995@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19995}: %c, %o, %x, and %X now raise TypeError on non-integer input.

@item 
bpo-19655@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19655}: The ASDL parser - used by the build process to generate code
for managing the Python AST in C - was rewritten. The new parser is self
contained and does not require to carry long the spark.py parser-generator
library; spark.py was removed from the source base.

@item 
bpo-12546@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12546}: Allow @code{\x00} to be used as a fill character when using str,
int, float, and complex __format__ methods.

@item 
bpo-20480@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20480}: Add ipaddress.reverse_pointer. Patch by Leon Weber.

@item 
bpo-13598@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13598}: Modify string.Formatter to support auto-numbering of
replacement fields. It now matches the behavior of str.format() in this
regard. Patches by Phil Elson and Ramchandra Apte.

@item 
bpo-8931@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8931}: Make alternate formatting (‘#’) for type ‘c’ raise an exception.
In versions prior to 3.5, ‘#’ with ‘c’ had no effect. Now specifying it is
an error. Patch by Torsten Landschoff.

@item 
bpo-23165@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23165}: Perform overflow checks before allocating memory in the
_Py_char2wchar function.
@end itemize

@node Library<211>,IDLE<64>,Core and Builtins<208>,Python 3 5 0 alpha 1
@anchor{whatsnew/changelog id1098}@anchor{1ff3}
@subsubsection Library



@itemize -

@item 
bpo-23399@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23399}: pyvenv creates relative symlinks where possible.

@item 
bpo-20289@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20289}: cgi.FieldStorage() now supports the context management
protocol.

@item 
bpo-13128@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13128}: Print response headers for CONNECT requests when debuglevel >
0. Patch by Demian Brecht.

@item 
bpo-15381@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15381}: Optimized io.BytesIO to make less allocations and copyings.

@item 
bpo-22818@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22818}: Splitting on a pattern that could match an empty string now
raises a warning.  Patterns that can only match empty strings are now
rejected.

@item 
bpo-23099@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23099}: Closing io.BytesIO with exported buffer is rejected now to
prevent corrupting exported buffer.

@item 
bpo-23326@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23326}: Removed __ne__ implementations.  Since fixing default __ne__
implementation in bpo-21408@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21408} they are redundant.

@item 
bpo-23363@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23363}: Fix possible overflow in itertools.permutations.

@item 
bpo-23364@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23364}: Fix possible overflow in itertools.product.

@item 
bpo-23366@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23366}: Fixed possible integer overflow in itertools.combinations.

@item 
bpo-23369@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23369}: Fixed possible integer overflow in
_json.encode_basestring_ascii.

@item 
bpo-23353@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23353}: Fix the exception handling of generators in
PyEval_EvalFrameEx(). At entry, save or swap the exception state even if
PyEval_EvalFrameEx() is called with throwflag=0. At exit, the exception
state is now always restored or swapped, not only if why is WHY_YIELD or
WHY_RETURN. Patch co-written with Antoine Pitrou.

@item 
bpo-14099@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14099}: Restored support of writing ZIP files to tellable but
non-seekable streams.

@item 
bpo-14099@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14099}: Writing to ZipFile and reading multiple ZipExtFiles is
threadsafe now.

@item 
bpo-19361@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19361}: JSON decoder now raises JSONDecodeError instead of ValueError.

@item 
bpo-18518@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18518}: timeit now rejects statements which can’t be compiled outside a
function or a loop (e.g. “return” or “break”).

@item 
bpo-23094@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23094}: Fixed readline with frames in Python implementation of pickle.

@item 
bpo-23268@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23268}: Fixed bugs in the comparison of ipaddress classes.

@item 
bpo-21408@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21408}: Removed incorrect implementations of __ne__() which didn’t
returned NotImplemented if __eq__() returned NotImplemented.  The default
__ne__() now works correctly.

@item 
bpo-19996@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19996}: @code{email.feedparser.FeedParser} now handles (malformed)
headers with no key rather than assuming the body has started.

@item 
bpo-20188@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20188}: Support Application-Layer Protocol Negotiation (ALPN) in the
ssl module.

@item 
bpo-23133@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23133}: Pickling of ipaddress objects now produces more compact and
portable representation.

@item 
bpo-23248@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23248}: Update ssl error codes from latest OpenSSL git master.

@item 
bpo-23266@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23266}: Much faster implementation of ipaddress.collapse_addresses()
when there are many non-consecutive addresses.

@item 
bpo-23098@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23098}: 64-bit dev_t is now supported in the os module.

@item 
bpo-21817@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21817}: When an exception is raised in a task submitted to a
ProcessPoolExecutor, the remote traceback is now displayed in the parent
process.  Patch by Claudiu Popa.

@item 
bpo-15955@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15955}: Add an option to limit output size when decompressing LZMA
data.  Patch by Nikolaus Rath and Martin Panter.

@item 
bpo-23250@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23250}: In the http.cookies module, capitalize “HttpOnly” and “Secure”
as they are written in the standard.

@item 
bpo-23063@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23063}: In the distutils’ check command, fix parsing of reST with code
or code-block directives.

@item 
bpo-23209@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23209}: selectors.BaseSelector.get_key() now raises a RuntimeError if
the selector is closed. And selectors.BaseSelector.close() now clears its
internal reference to the selector mapping to break a reference cycle.
Initial patch written by Martin Richard. (See also: bpo-23225@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23225})

@item 
bpo-17911@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17911}: Provide a way to seed the linecache for a PEP-302 module
without actually loading the code.

@item 
bpo-17911@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17911}: Provide a new object API for traceback, including the ability
to not lookup lines at all until the traceback is actually rendered,
without any trace of the original objects being kept alive.

@item 
bpo-19777@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19777}: Provide a home() classmethod on Path objects.  Contributed by
Victor Salgado and Mayank Tripathi.

@item 
bpo-23206@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23206}: Make @code{json.dumps(..., ensure_ascii=False)} as fast as the
default case of @code{ensure_ascii=True}.  Patch by Naoki Inada.

@item 
bpo-23185@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23185}: Add math.inf and math.nan constants.

@item 
bpo-23186@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23186}: Add ssl.SSLObject.shared_ciphers() and
ssl.SSLSocket.shared_ciphers() to fetch the client’s list ciphers sent at
handshake.

@item 
bpo-23143@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23143}: Remove compatibility with OpenSSLs older than 0.9.8.

@item 
bpo-23132@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23132}: Improve performance and introspection support of comparison
methods created by functool.total_ordering.

@item 
bpo-19776@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19776}: Add an expanduser() method on Path objects.

@item 
bpo-23112@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23112}: Fix SimpleHTTPServer to correctly carry the query string and
fragment when it redirects to add a trailing slash.

@item 
bpo-21793@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21793}: Added http.HTTPStatus enums (i.e. HTTPStatus.OK,
HTTPStatus.NOT_FOUND). Patch by Demian Brecht.

@item 
bpo-23093@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23093}: In the io, module allow more operations to work on detached
streams.

@item 
bpo-23111@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23111}: In the ftplib, make ssl.PROTOCOL_SSLv23 the default protocol
version.

@item 
bpo-22585@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22585}: On OpenBSD 5.6 and newer, os.urandom() now calls getentropy(),
instead of reading /dev/urandom, to get pseudo-random bytes.

@item 
bpo-19104@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19104}: pprint now produces evaluable output for wrapped strings.

@item 
bpo-23071@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23071}: Added missing names to codecs.__all__.  Patch by Martin Panter.

@item 
bpo-22783@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22783}: Pickling now uses the NEWOBJ opcode instead of the NEWOBJ_EX
opcode if possible.

@item 
bpo-15513@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15513}: Added a __sizeof__ implementation for pickle classes.

@item 
bpo-19858@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19858}: pickletools.optimize() now aware of the MEMOIZE opcode, can
produce more compact result and no longer produces invalid output if input
data contains MEMOIZE opcodes together with PUT or BINPUT opcodes.

@item 
bpo-22095@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22095}: Fixed HTTPConnection.set_tunnel with default port.  The port
value in the host header was set to “None”.  Patch by Demian Brecht.

@item 
bpo-23016@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23016}: A warning no longer produces an AttributeError when the program
is run with pythonw.exe.

@item 
bpo-21775@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21775}: shutil.copytree(): fix crash when copying to VFAT. An exception
handler assumed that OSError objects always have a ‘winerror’ attribute.
That is not the case, so the exception handler itself raised
AttributeError when run on Linux (and, presumably, any other non-Windows
OS). Patch by Greg Ward.

@item 
bpo-1218234@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1218234}: Fix inspect.getsource() to load updated source of reloaded
module. Initial patch by Berker Peksag.

@item 
bpo-21740@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21740}: Support wrapped callables in doctest. Patch by Claudiu Popa.

@item 
bpo-23009@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23009}: Make sure selectors.EpollSelector.select() works when no FD is
registered.

@item 
bpo-22959@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22959}: In the constructor of http.client.HTTPSConnection, prefer the
context’s check_hostname attribute over the `check_hostname' parameter.

@item 
bpo-22696@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22696}: Add function @ref{c86,,sys.is_finalizing()} to know about
interpreter shutdown.

@item 
bpo-16043@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16043}: Add a default limit for the amount of data
xmlrpclib.gzip_decode will return. This resolves 
@geindex Common Vulnerabilities and Exposures; CVE 2013-1753
CVE 2013-1753@footnote{https://www.cve.org/CVERecord?id=CVE-2013-1753}.

@item 
bpo-14099@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14099}: ZipFile.open() no longer reopen the underlying file.  Objects
returned by ZipFile.open() can now operate independently of the ZipFile
even if the ZipFile was created by passing in a file-like object as the
first argument to the constructor.

@item 
bpo-22966@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22966}: Fix __pycache__ pyc file name clobber when pyc_compile is asked
to compile a source file containing multiple dots in the source file name.

@item 
bpo-21971@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21971}: Update turtledemo doc and add module to the index.

@item 
bpo-21032@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21032}: Fixed socket leak if HTTPConnection.getresponse() fails.
Original patch by Martin Panter.

@item 
bpo-22407@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22407}: Deprecated the use of re.LOCALE flag with str patterns or
re.ASCII. It was newer worked.

@item 
bpo-22902@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22902}: The “ip” command is now used on Linux to determine MAC address
in uuid.getnode().  Patch by Bruno Cauet.

@item 
bpo-22960@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22960}: Add a context argument to xmlrpclib.ServerProxy constructor.

@item 
bpo-22389@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22389}: Add contextlib.redirect_stderr().

@item 
bpo-21356@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21356}: Make ssl.RAND_egd() optional to support LibreSSL. The
availability of the function is checked during the compilation. Patch
written by Bernard Spil.

@item 
bpo-22915@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22915}: SAX parser now supports files opened with file descriptor or
bytes path.

@item 
bpo-22609@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22609}: Constructors and update methods of mapping classes in the
collections module now accept the self keyword argument.

@item 
bpo-22940@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22940}: Add readline.append_history_file.

@item 
bpo-19676@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19676}: Added the “namereplace” error handler.

@item 
bpo-22788@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22788}: Add `context' parameter to logging.handlers.HTTPHandler.

@item 
bpo-22921@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22921}: Allow SSLContext to take the `hostname' parameter even if
OpenSSL doesn’t support SNI.

@item 
bpo-22894@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22894}: TestCase.subTest() would cause the test suite to be stopped
when in failfast mode, even in the absence of failures.

@item 
bpo-22796@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22796}: HTTP cookie parsing is now stricter, in order to protect
against potential injection attacks.

@item 
bpo-22370@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22370}: Windows detection in pathlib is now more robust.

@item 
bpo-22841@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22841}: Reject coroutines in asyncio add_signal_handler(). Patch by
Ludovic.Gasc.

@item 
bpo-19494@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19494}: Added urllib.request.HTTPBasicPriorAuthHandler. Patch by Matej
Cepl.

@item 
bpo-22578@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22578}: Added attributes to the re.error class.

@item 
bpo-22849@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22849}: Fix possible double free in the io.TextIOWrapper constructor.

@item 
bpo-12728@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12728}: Different Unicode characters having the same uppercase but
different lowercase are now matched in case-insensitive regular
expressions.

@item 
bpo-22821@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22821}: Fixed fcntl() with integer argument on 64-bit big-endian
platforms.

@item 
bpo-21650@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21650}: Add an @code{--sort-keys} option to @code{json.tool} CLI.

@item 
bpo-22824@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22824}: Updated reprlib output format for sets to use set literals.
Patch contributed by Berker Peksag.

@item 
bpo-22824@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22824}: Updated reprlib output format for arrays to display empty
arrays without an unnecessary empty list.  Suggested by Serhiy Storchaka.

@item 
bpo-22406@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22406}: Fixed the uu_codec codec incorrectly ported to 3.x. Based on
patch by Martin Panter.

@item 
bpo-17293@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17293}: uuid.getnode() now determines MAC address on AIX using netstat.
Based on patch by Aivars Kalvāns.

@item 
bpo-22769@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22769}: Fixed ttk.Treeview.tag_has() when called without arguments.

@item 
bpo-22417@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22417}: Verify certificates by default in httplib (PEP 476).

@item 
bpo-22775@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22775}: Fixed unpickling of http.cookies.SimpleCookie with protocol 2
and above. Patch by Tim Graham.

@item 
bpo-22776@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22776}: Brought excluded code into the scope of a try block in
SysLogHandler.emit().

@item 
bpo-22665@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22665}: Add missing get_terminal_size and SameFileError to
shutil.__all__.

@item 
bpo-6623@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6623}: Remove deprecated Netrc class in the ftplib module. Patch by
Matt Chaput.

@item 
bpo-17381@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17381}: Fixed handling of case-insensitive ranges in regular
expressions.

@item 
bpo-22410@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22410}: Module level functions in the re module now cache compiled
locale-dependent regular expressions taking into account the locale.

@item 
bpo-22759@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22759}: Query methods on pathlib.Path() (exists(), is_dir(), etc.) now
return False when the underlying stat call raises NotADirectoryError.

@item 
bpo-8876@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8876}: distutils now falls back to copying files when hard linking
doesn’t work. This allows use with special filesystems such as VirtualBox
shared folders.

@item 
bpo-22217@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22217}: Implemented reprs of classes in the zipfile module.

@item 
bpo-22457@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22457}: Honour load_tests in the start_dir of discovery.

@item 
bpo-18216@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18216}: gettext now raises an error when a .mo file has an unsupported
major version number.  Patch by Aaron Hill.

@item 
bpo-13918@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13918}: Provide a locale.delocalize() function which can remove
locale-specific number formatting from a string representing a number,
without then converting it to a specific type.  Patch by Cédric Krier.

@item 
bpo-22676@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22676}: Make the pickling of global objects which don’t have a
__module__ attribute less slow.

@item 
bpo-18853@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18853}: Fixed ResourceWarning in shlex.__nain__.

@item 
bpo-9351@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9351}: Defaults set with set_defaults on an argparse subparser are no
longer ignored when also set on the parent parser.

@item 
bpo-7559@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7559}: unittest test loading ImportErrors are reported as import errors
with their import exception rather than as attribute errors after the
import has already failed.

@item 
bpo-19746@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19746}: Make it possible to examine the errors from unittest discovery
without executing the test suite. The new @code{errors} attribute on
@code{TestLoader} exposes these non-fatal errors encountered during
discovery.

@item 
bpo-21991@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21991}: Make email.headerregistry’s header ‘params’ attributes be
read-only (MappingProxyType).  Previously the dictionary was modifiable
but a new one was created on each access of the attribute.

@item 
bpo-22638@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22638}: SSLv3 is now disabled throughout the standard library. It can
still be enabled by instantiating a SSLContext manually.

@item 
bpo-22641@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22641}: In asyncio, the default SSL context for client connections is
now created using ssl.create_default_context(), for stronger security.

@item 
bpo-17401@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17401}: Include closefd in io.FileIO repr.

@item 
bpo-21338@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21338}: Add silent mode for compileall. quiet parameters of
compile_@{dir, file, path@} functions now have a multilevel value. Also, -q
option of the CLI now have a multilevel value. Patch by Thomas Kluyver.

@item 
bpo-20152@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20152}: Convert the array and cmath modules to Argument Clinic.

@item 
bpo-18643@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18643}: Add socket.socketpair() on Windows.

@item 
bpo-22435@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22435}: Fix a file descriptor leak when socketserver bind fails.

@item 
bpo-13096@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13096}: Fixed segfault in CTypes POINTER handling of large values.

@item 
bpo-11694@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11694}: Raise ConversionError in xdrlib as documented.  Patch by Filip
Gruszczyński and Claudiu Popa.

@item 
bpo-19380@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19380}: Optimized parsing of regular expressions.

@item 
bpo-1519638@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1519638}: Now unmatched groups are replaced with empty strings in
re.sub() and re.subn().

@item 
bpo-18615@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18615}: sndhdr.what/whathdr now return a namedtuple.

@item 
bpo-22462@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22462}: Fix pyexpat’s creation of a dummy frame to make it appear in
exception tracebacks.

@item 
bpo-21965@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21965}: Add support for in-memory SSL to the ssl module.  Patch by
Geert Jansen.

@item 
bpo-21173@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21173}: Fix len() on a WeakKeyDictionary when .clear() was called with
an iterator alive.

@item 
bpo-11866@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11866}: Eliminated race condition in the computation of names for new
threads.

@item 
bpo-21905@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21905}: Avoid RuntimeError in pickle.whichmodule() when sys.modules is
mutated while iterating.  Patch by Olivier Grisel.

@item 
bpo-11271@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11271}: concurrent.futures.Executor.map() now takes a `chunksize'
argument to allow batching of tasks in child processes and improve
performance of ProcessPoolExecutor.  Patch by Dan O’Reilly.

@item 
bpo-21883@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21883}: os.path.join() and os.path.relpath() now raise a TypeError with
more helpful error message for unsupported or mismatched types of
arguments.

@item 
bpo-22219@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22219}: The zipfile module CLI now adds entries for directories
(including empty directories) in ZIP file.

@item 
bpo-22449@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22449}: In the ssl.SSLContext.load_default_certs, consult the
environmental variables SSL_CERT_DIR and SSL_CERT_FILE on Windows.

@item 
bpo-22508@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22508}: The email.__version__ variable has been removed; the email code
is no longer shipped separately from the stdlib, and __version__ hasn’t
been updated in several releases.

@item 
bpo-20076@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20076}: Added non derived UTF-8 aliases to locale aliases table.

@item 
bpo-20079@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20079}: Added locales supported in glibc 2.18 to locale alias table.

@item 
bpo-20218@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20218}: Added convenience methods read_text/write_text and read_bytes/
write_bytes to pathlib.Path objects.

@item 
bpo-22396@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22396}: On 32-bit AIX platform, don’t expose os.posix_fadvise() nor
os.posix_fallocate() because their prototypes in system headers are wrong.

@item 
bpo-22517@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22517}: When an io.BufferedRWPair object is deallocated, clear its
weakrefs.

@item 
bpo-22437@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22437}: Number of capturing groups in regular expression is no longer
limited by 100.

@item 
bpo-17442@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17442}: InteractiveInterpreter now displays the full chained traceback
in its showtraceback method, to match the built in interactive
interpreter.

@item 
bpo-23392@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23392}: Added tests for marshal C API that works with FILE*.

@item 
bpo-10510@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10510}: distutils register and upload methods now use HTML standards
compliant CRLF line endings.

@item 
bpo-9850@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9850}: Fixed macpath.join() for empty first component.  Patch by Oleg
Oshmyan.

@item 
bpo-5309@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5309}: distutils’ build and build_ext commands now accept a @code{-j}
option to enable parallel building of extension modules.

@item 
bpo-22448@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22448}: Improve canceled timer handles cleanup to prevent unbound
memory usage. Patch by Joshua Moore-Oliva.

@item 
bpo-22427@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22427}: TemporaryDirectory no longer attempts to clean up twice when
used in the with statement in generator.

@item 
bpo-22362@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22362}: Forbidden ambiguous octal escapes out of range 0-0o377 in
regular expressions.

@item 
bpo-20912@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20912}: Now directories added to ZIP file have correct Unix and MS-DOS
directory attributes.

@item 
bpo-21866@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21866}: ZipFile.close() no longer writes ZIP64 central directory
records if allowZip64 is false.

@item 
bpo-22278@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22278}: Fix urljoin problem with relative urls, a regression observed
after changes to issue22118 were submitted.

@item 
bpo-22415@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22415}: Fixed debugging output of the GROUPREF_EXISTS opcode in the re
module. Removed trailing spaces in debugging output.

@item 
bpo-22423@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22423}: Unhandled exception in thread no longer causes unhandled
AttributeError when sys.stderr is None.

@item 
bpo-21332@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21332}: Ensure that @code{bufsize=1} in subprocess.Popen() selects line
buffering, rather than block buffering.  Patch by Akira Li.

@item 
bpo-21091@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21091}: Fix API bug: email.message.EmailMessage.is_attachment is now a
method.

@item 
bpo-21079@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21079}: Fix email.message.EmailMessage.is_attachment to return the
correct result when the header has parameters as well as a value.

@item 
bpo-22247@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22247}: Add NNTPError to nntplib.__all__.

@item 
bpo-22366@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22366}: urllib.request.urlopen will accept a context object
(SSLContext) as an argument which will then be used for HTTPS connection.
Patch by Alex Gaynor.

@item 
bpo-4180@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4180}: The warnings registries are now reset when the filters are
modified.

@item 
bpo-22419@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22419}: Limit the length of incoming HTTP request in wsgiref server to
65536 bytes and send a 414 error code for higher lengths. Patch
contributed by Devin Cook.

@item 
Lax cookie parsing in http.cookies could be a security issue when combined
with non-standard cookie handling in some web browsers.  Reported by
Sergey Bobrov.

@item 
bpo-20537@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20537}: logging methods now accept an exception instance as well as a
Boolean value or exception tuple. Thanks to Yury Selivanov for the patch.

@item 
bpo-22384@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22384}: An exception in Tkinter callback no longer crashes the program
when it is run with pythonw.exe.

@item 
bpo-22168@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22168}: Prevent turtle AttributeError with non-default Canvas on OS X.

@item 
bpo-21147@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21147}: sqlite3 now raises an exception if the request contains a null
character instead of truncating it.  Based on patch by Victor Stinner.

@item 
bpo-13968@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13968}: The glob module now supports recursive search in subdirectories
using the @code{**} pattern.

@item 
bpo-21951@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21951}: Fixed a crash in Tkinter on AIX when called Tcl command with
empty string or tuple argument.

@item 
bpo-21951@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21951}: Tkinter now most likely raises MemoryError instead of crash if
the memory allocation fails.

@item 
bpo-22338@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22338}: Fix a crash in the json module on memory allocation failure.

@item 
bpo-12410@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12410}: imaplib.IMAP4 now supports the context management protocol.
Original patch by Tarek Ziadé.

@item 
bpo-21270@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21270}: We now override tuple methods in mock.call objects so that they
can be used as normal call attributes.

@item 
bpo-16662@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16662}: @code{load_tests()} is now unconditionally run when it is present
in a package’s @code{__init__.py}.  @code{TestLoader.loadTestsFromModule()}
still accepts use_load_tests, but it is deprecated and ignored.  A new
keyword-only attribute @code{pattern} is added and documented.  Patch given
by Robert Collins, tweaked by Barry Warsaw.

@item 
bpo-22226@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22226}: First letter no longer is stripped from the “status” key in the
result of Treeview.heading().

@item 
bpo-19524@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19524}: Fixed resource leak in the HTTP connection when an invalid
response is received.  Patch by Martin Panter.

@item 
bpo-20421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20421}: Add a .version() method to SSL sockets exposing the actual
protocol version in use.

@item 
bpo-19546@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19546}: configparser exceptions no longer expose implementation
details. Chained KeyErrors are removed, which leads to cleaner tracebacks.
Patch by Claudiu Popa.

@item 
bpo-22051@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22051}: turtledemo no longer reloads examples to re-run them.
Initialization of variables and gui setup should be done in main(), which
is called each time a demo is run, but not on import.

@item 
bpo-21933@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21933}: Turtledemo users can change the code font size with a menu
selection or control(command) ‘-’ or ‘+’ or control-mousewheel. Original
patch by Lita Cho.

@item 
bpo-21597@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21597}: The separator between the turtledemo text pane and the drawing
canvas can now be grabbed and dragged with a mouse.  The code text pane
can be widened to easily view or copy the full width of the text.  The
canvas can be widened on small screens.  Original patches by Jan Kanis and
Lita Cho.

@item 
bpo-18132@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18132}: Turtledemo buttons no longer disappear when the window is
shrunk.  Original patches by Jan Kanis and Lita Cho.

@item 
bpo-22043@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22043}: time.monotonic() is now always available.
@code{threading.Lock.acquire()}, @code{threading.RLock.acquire()} and socket
operations now use a monotonic clock, instead of the system clock, when a
timeout is used.

@item 
bpo-21527@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21527}: Add a default number of workers to ThreadPoolExecutor equal to
5 times the number of CPUs.  Patch by Claudiu Popa.

@item 
bpo-22216@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22216}: smtplib now resets its state more completely after a quit.  The
most obvious consequence of the previous behavior was a STARTTLS failure
during a connect/starttls/quit/connect/starttls sequence.

@item 
bpo-22098@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22098}: ctypes’ BigEndianStructure and LittleEndianStructure now define
an empty __slots__ so that subclasses don’t always get an instance dict.
Patch by Claudiu Popa.

@item 
bpo-22185@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22185}: Fix an occasional RuntimeError in threading.Condition.wait()
caused by mutation of the waiters queue without holding the lock.  Patch
by Doug Zongker.

@item 
bpo-22287@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22287}: On UNIX, _PyTime_gettimeofday() now uses
clock_gettime(CLOCK_REALTIME) if available. As a side effect, Python now
depends on the librt library on Solaris and on Linux (only with glibc
older than 2.17).

@item 
bpo-22182@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22182}: Use e.args to unpack exceptions correctly in
distutils.file_util.move_file. Patch by Claudiu Popa.

@item 
The webbrowser module now uses subprocess’s start_new_session=True rather
than a potentially risky preexec_fn=os.setsid call.

@item 
bpo-22042@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22042}: signal.set_wakeup_fd(fd) now raises an exception if the file
descriptor is in blocking mode.

@item 
bpo-16808@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16808}: inspect.stack() now returns a named tuple instead of a tuple.
Patch by Daniel Shahaf.

@item 
bpo-22236@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22236}: Fixed Tkinter images copying operations in NoDefaultRoot mode.

@item 
bpo-2527@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2527}: Add a `globals' argument to timeit functions, in order to
override the globals namespace in which the timed code is executed. Patch
by Ben Roberts.

@item 
bpo-22118@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22118}: Switch urllib.parse to use RFC 3986 semantics for the
resolution of relative URLs, rather than RFCs 1808 and 2396. Patch by
Demian Brecht.

@item 
bpo-21549@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21549}: Added the “members” parameter to TarFile.list().

@item 
bpo-19628@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19628}: Allow compileall recursion depth to be specified with a -r
option.

@item 
bpo-15696@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15696}: Add a __sizeof__ implementation for mmap objects on Windows.

@item 
bpo-22068@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22068}: Avoided reference loops with Variables and Fonts in Tkinter.

@item 
bpo-22165@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22165}: SimpleHTTPRequestHandler now supports undecodable file names.

@item 
bpo-15381@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15381}: Optimized line reading in io.BytesIO.

@item 
bpo-8797@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8797}: Raise HTTPError on failed Basic Authentication immediately.
Initial patch by Sam Bull.

@item 
bpo-20729@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20729}: Restored the use of lazy iterkeys()/itervalues()/iteritems() in
the mailbox module.

@item 
bpo-21448@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21448}: Changed FeedParser feed() to avoid `O'(`n'@w{^2})
behavior when parsing long line. Original patch by Raymond Hettinger.

@item 
bpo-22184@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22184}: The functools LRU Cache decorator factory now gives an earlier
and clearer error message when the user forgets the required parameters.

@item 
bpo-17923@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17923}: glob() patterns ending with a slash no longer match non-dirs on
AIX.  Based on patch by Delhallt.

@item 
bpo-21725@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21725}: Added support for RFC 6531 (SMTPUTF8) in smtpd.

@item 
bpo-22176@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22176}: Update the ctypes module’s libffi to v3.1.  This release adds
support for the Linux AArch64 and POWERPC ELF ABIv2 little endian
architectures.

@item 
bpo-5411@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5411}: Added support for the “xztar” format in the shutil module.

@item 
bpo-21121@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21121}: Don’t force 3rd party C extensions to be built with
-Werror=declaration-after-statement.

@item 
bpo-21975@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21975}: Fixed crash when using uninitialized sqlite3.Row (in particular
when unpickling pickled sqlite3.Row).  sqlite3.Row is now initialized in
the __new__() method.

@item 
bpo-20170@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20170}: Convert posixmodule to use Argument Clinic.

@item 
bpo-21539@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21539}: Add an `exists_ok' argument to @code{Pathlib.mkdir()} to mimic
@code{mkdir -p} and @code{os.makedirs()} functionality.  When true, ignore
@code{FileExistsErrors}. Patch by Berker Peksag.

@item 
bpo-22127@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22127}: Bypass IDNA for pure-ASCII host names in the socket module (in
particular for numeric IPs).

@item 
bpo-21047@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21047}: set the default value for the `convert_charrefs' argument of
HTMLParser to True.  Patch by Berker Peksag.

@item 
Add an __all__ to html.entities.

@item 
bpo-15114@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15114}: the strict mode and argument of HTMLParser, HTMLParser.error,
and the HTMLParserError exception have been removed.

@item 
bpo-22085@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22085}: Dropped support of Tk 8.3 in Tkinter.

@item 
bpo-21580@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21580}: Now Tkinter correctly handles bytes arguments passed to Tk. In
particular this allows initializing images from binary data.

@item 
bpo-22003@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22003}: When initialized from a bytes object, io.BytesIO() now defers
making a copy until it is mutated, improving performance and memory use on
some use cases. Patch by David Wilson.

@item 
bpo-22018@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22018}: On Windows, signal.set_wakeup_fd() now also supports sockets. A
side effect is that Python depends to the WinSock library.

@item 
bpo-22054@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22054}: Add os.get_blocking() and os.set_blocking() functions to get
and set the blocking mode of a file descriptor (False if the O_NONBLOCK
flag is set, True otherwise). These functions are not available on
Windows.

@item 
bpo-17172@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17172}: Make turtledemo start as active on OS X even when run with
subprocess. Patch by Lita Cho.

@item 
bpo-21704@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21704}: Fix build error for _multiprocessing when semaphores are not
available. Patch by Arfrever Frehtes Taifersar Arahesis.

@item 
bpo-20173@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20173}: Convert sha1, sha256, sha512 and md5 to ArgumentClinic. Patch
by Vajrasky Kok.

@item 
Fix repr(_socket.socket) on Windows 64-bit: don’t fail with OverflowError
on closed socket. repr(socket.socket) already works fine.

@item 
bpo-22033@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22033}: Reprs of most Python implemented classes now contain actual
class name instead of hardcoded one.

@item 
bpo-21947@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21947}: The dis module can now disassemble generator-iterator objects
based on their gi_code attribute. Patch by Clement Rouault.

@item 
bpo-16133@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16133}: The asynchat.async_chat.handle_read() method now ignores
BlockingIOError exceptions.

@item 
bpo-22044@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22044}: Fixed premature DECREF in call_tzinfo_method. Patch by Tom
Flanagan.

@item 
bpo-19884@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19884}: readline: Disable the meta modifier key if stdout is not a
terminal to not write the ANSI sequence @code{"\033[1034h"} into stdout. This
sequence is used on some terminal (ex: TERM=xterm-256color”) to enable
support of 8 bit characters.

@item 
bpo-4350@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4350}: Removed a number of out-of-dated and non-working for a long time
Tkinter methods.

@item 
bpo-6167@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6167}: Scrollbar.activate() now returns the name of active element if
the argument is not specified.  Scrollbar.set() now always accepts only 2
arguments.

@item 
bpo-15275@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15275}: Clean up and speed up the ntpath module.

@item 
bpo-21888@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21888}: plistlib’s load() and loads() now work if the fmt parameter is
specified.

@item 
bpo-22032@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22032}: __qualname__ instead of __name__ is now always used to format
fully qualified class names of Python implemented classes.

@item 
bpo-22031@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22031}: Reprs now always use hexadecimal format with the “0x” prefix
when contain an id in form “ at 0x…”.

@item 
bpo-22018@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22018}: signal.set_wakeup_fd() now raises an OSError instead of a
ValueError on @code{fstat()} failure.

@item 
bpo-21044@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21044}: tarfile.open() now handles fileobj with an integer ‘name’
attribute.  Based on patch by Antoine Pietri.

@item 
bpo-21966@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21966}: Respect -q command-line option when code module is ran.

@item 
bpo-19076@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19076}: Don’t pass the redundant ‘file’ argument to self.error().

@item 
bpo-16382@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16382}: Improve exception message of warnings.warn() for bad category.
Initial patch by Phil Elson.

@item 
bpo-21932@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21932}: os.read() now uses a @ref{c5b,,Py_ssize_t()} type instead of
int for the size to support reading more than 2 GB at once. On
Windows, the size is truncated to INT_MAX. As any call to os.read(), the
OS may read less bytes than the number of requested bytes.

@item 
bpo-21942@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21942}: Fixed source file viewing in pydoc’s server mode on Windows.

@item 
bpo-11259@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11259}: asynchat.async_chat().set_terminator() now raises a ValueError
if the number of received bytes is negative.

@item 
bpo-12523@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12523}: asynchat.async_chat.push() now raises a TypeError if it doesn’t
get a bytes string

@item 
bpo-21707@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21707}: Add missing kwonlyargcount argument to
ModuleFinder.replace_paths_in_code().

@item 
bpo-20639@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20639}: calling Path.with_suffix(‘’) allows removing the suffix again.
Patch by July Tikhonov.

@item 
bpo-21714@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21714}: Disallow the construction of invalid paths using
Path.with_name().  Original patch by Antony Lee.

@item 
bpo-15014@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15014}: Added ‘auth’ method to smtplib to make implementing auth
mechanisms simpler, and used it internally in the login method.

@item 
bpo-21151@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21151}: Fixed a segfault in the winreg module when @code{None} is passed
as a @code{REG_BINARY} value to SetValueEx.  Patch by John Ehresman.

@item 
bpo-21090@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21090}: io.FileIO.readall() does not ignore I/O errors anymore. Before,
it ignored I/O errors if at least the first C call read() succeed.

@item 
bpo-5800@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5800}: headers parameter of wsgiref.headers.Headers is now optional.
Initial patch by Pablo Torres Navarrete and SilentGhost.

@item 
bpo-21781@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21781}: ssl.RAND_add() now supports strings longer than 2 GB.

@item 
bpo-21679@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21679}: Prevent extraneous fstat() calls during open().  Patch by
Bohuslav Kabrda.

@item 
bpo-21863@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21863}: cProfile now displays the module name of C extension functions,
in addition to their own name.

@item 
bpo-11453@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11453}: asyncore: emit a ResourceWarning when an unclosed file_wrapper
object is destroyed. The destructor now closes the file if needed. The
close() method can now be called twice: the second call does nothing.

@item 
bpo-21858@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21858}: Better handling of Python exceptions in the sqlite3 module.

@item 
bpo-21476@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21476}: Make sure the email.parser.BytesParser TextIOWrapper is
discarded after parsing, so the input file isn’t unexpectedly closed.

@item 
bpo-20295@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20295}: imghdr now recognizes OpenEXR format images.

@item 
bpo-21729@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21729}: Used the “with” statement in the dbm.dumb module to ensure
files closing. Patch by Claudiu Popa.

@item 
bpo-21491@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21491}: socketserver: Fix a race condition in child processes reaping.

@item 
bpo-21719@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21719}: Added the @code{st_file_attributes} field to os.stat_result on
Windows.

@item 
bpo-21832@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21832}: Require named tuple inputs to be exact strings.

@item 
bpo-21722@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21722}: The distutils “upload” command now exits with a non-zero return
code when uploading fails.  Patch by Martin Dengler.

@item 
bpo-21723@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21723}: asyncio.Queue: support any type of number (ex: float) for the
maximum size. Patch written by Vajrasky Kok.

@item 
bpo-21711@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21711}: support for “site-python” directories has now been removed from
the site module (it was deprecated in 3.4).

@item 
bpo-17552@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17552}: new socket.sendfile() method allowing a file to be sent over a
socket by using high-performance os.sendfile() on UNIX. Patch by Giampaolo
Rodola’.

@item 
bpo-18039@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18039}: dbm.dump.open() now always creates a new database when the flag
has the value ‘n’.  Patch by Claudiu Popa.

@item 
bpo-21326@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21326}: Add a new is_closed() method to asyncio.BaseEventLoop.
run_forever() and run_until_complete() methods of asyncio.BaseEventLoop
now raise an exception if the event loop was closed.

@item 
bpo-21766@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21766}: Prevent a security hole in CGIHTTPServer by URL unquoting paths
before checking for a CGI script at that path.

@item 
bpo-21310@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21310}: Fixed possible resource leak in failed open().

@item 
bpo-21256@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21256}: Printout of keyword args should be in deterministic order in a
mock function call. This will help to write better doctests.

@item 
bpo-21677@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21677}: Fixed chaining nonnormalized exceptions in io close() methods.

@item 
bpo-11709@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11709}: Fix the pydoc.help function to not fail when sys.stdin is not a
valid file.

@item 
bpo-21515@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21515}: tempfile.TemporaryFile now uses os.O_TMPFILE flag is available.

@item 
bpo-13223@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13223}: Fix pydoc.writedoc so that the HTML documentation for methods
that use ‘self’ in the example code is generated correctly.

@item 
bpo-21463@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21463}: In urllib.request, fix pruning of the FTP cache.

@item 
bpo-21618@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21618}: The subprocess module could fail to close open fds that were
inherited by the calling process and already higher than POSIX resource
limits would otherwise allow.  On systems with a functioning /proc/self/fd
or /dev/fd interface the max is now ignored and all fds are closed.

@item 
bpo-20383@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20383}: Introduce importlib.util.module_from_spec() as the preferred
way to create a new module.

@item 
bpo-21552@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21552}: Fixed possible integer overflow of too long string lengths in
the tkinter module on 64-bit platforms.

@item 
bpo-14315@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14315}: The zipfile module now ignores extra fields in the central
directory that are too short to be parsed instead of letting a
struct.unpack error bubble up as this “bad data” appears in many real
world zip files in the wild and is ignored by other zip tools.

@item 
bpo-13742@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13742}: Added “key” and “reverse” parameters to heapq.merge(). (First
draft of patch contributed by Simon Sapin.)

@item 
bpo-21402@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21402}: tkinter.ttk now works when default root window is not set.

@item 
bpo-3015@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3015}: @code{_tkinter.create()} now creates @code{tkapp} object with
@code{wantobjects=1} by default.

@item 
bpo-10203@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10203}: sqlite3.Row now truly supports sequence protocol.  In
particular it supports reverse() and negative indices.  Original patch by
Claudiu Popa.

@item 
bpo-18807@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18807}: If copying (no symlinks) specified for a venv, then the python
interpreter aliases (python, python3) are now created by copying rather
than symlinking.

@item 
bpo-20197@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20197}: Added support for the WebP image type in the imghdr module.
Patch by Fabrice Aneche and Claudiu Popa.

@item 
bpo-21513@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21513}: Speedup some properties of IP addresses (IPv4Address,
IPv6Address) such as .is_private or .is_multicast.

@item 
bpo-21137@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21137}: Improve the repr for threading.Lock() and its variants by
showing the “locked” or “unlocked” status.  Patch by Berker Peksag.

@item 
bpo-21538@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21538}: The plistlib module now supports loading of binary plist files
when reference or offset size is not a power of two.

@item 
bpo-21455@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21455}: Add a default backlog to socket.listen().

@item 
bpo-21525@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21525}: Most Tkinter methods which accepted tuples now accept lists
too.

@item 
bpo-22166@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22166}: With the assistance of a new internal _codecs._forget_codec
helping function, test_codecs now clears the encoding caches to avoid the
appearance of a reference leak

@item 
bpo-22236@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22236}: Tkinter tests now don’t reuse default root window.  New root
window is created for every test class.

@item 
bpo-10744@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10744}: Fix 
@geindex Python Enhancement Proposals; PEP 3118
PEP 3118@footnote{https://peps.python.org/pep-3118/} format strings on ctypes objects with a
nontrivial shape.

@item 
bpo-20826@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20826}: Optimize ipaddress.collapse_addresses().

@item 
bpo-21487@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21487}: Optimize ipaddress.summarize_address_range() and
ipaddress.@{IPv4Network,IPv6Network@}.subnets().

@item 
bpo-21486@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21486}: Optimize parsing of netmasks in ipaddress.IPv4Network and
ipaddress.IPv6Network.

@item 
bpo-13916@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13916}: Disallowed the surrogatepass error handler for non UTF-*
encodings.

@item 
bpo-20998@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20998}: Fixed re.fullmatch() of repeated single character pattern with
ignore case. Original patch by Matthew Barnett.

@item 
bpo-21075@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21075}: fileinput.FileInput now reads bytes from standard stream if
binary mode is specified.  Patch by Sam Kimbrel.

@item 
bpo-19775@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19775}: Add a samefile() method to pathlib Path objects.  Initial patch
by Vajrasky Kok.

@item 
bpo-21226@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21226}: Set up modules properly in PyImport_ExecCodeModuleObject (and
friends).

@item 
bpo-21398@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21398}: Fix a unicode error in the pydoc pager when the documentation
contains characters not encodable to the stdout encoding.

@item 
bpo-16531@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16531}: ipaddress.IPv4Network and ipaddress.IPv6Network now accept an
(address, netmask) tuple argument, so as to easily construct network
objects from existing addresses.

@item 
bpo-21156@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21156}: importlib.abc.InspectLoader.source_to_code() is now a
staticmethod.

@item 
bpo-21424@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21424}: Simplified and optimized heaqp.nlargest() and nmsmallest() to
make fewer tuple comparisons.

@item 
bpo-21396@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21396}: Fix TextIOWrapper(…, write_through=True) to not force a
flush() on the underlying binary stream.  Patch by akira.

@item 
bpo-18314@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18314}: Unlink now removes junctions on Windows. Patch by Kim Gräsman

@item 
bpo-21088@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21088}: Bugfix for curses.window.addch() regression in 3.4.0. In
porting to Argument Clinic, the first two arguments were reversed.

@item 
bpo-21407@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21407}: _decimal: The module now supports function signatures.

@item 
bpo-10650@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10650}: Remove the non-standard ‘watchexp’ parameter from the
Decimal.quantize() method in the Python version.  It had never been
present in the C version.

@item 
bpo-21469@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21469}: Reduced the risk of false positives in robotparser by checking
to make sure that robots.txt has been read or does not exist prior to
returning True in can_fetch().

@item 
bpo-19414@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19414}: Have the OrderedDict mark deleted links as unusable. This gives
an early failure if the link is deleted during iteration.

@item 
bpo-21421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21421}: Add __slots__ to the MappingViews ABC. Patch by Josh Rosenberg.

@item 
bpo-21101@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21101}: Eliminate double hashing in the C speed-up code for
collections.Counter().

@item 
bpo-21321@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21321}: itertools.islice() now releases the reference to the source
iterator when the slice is exhausted.  Patch by Anton Afanasyev.

@item 
bpo-21057@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21057}: TextIOWrapper now allows the underlying binary stream’s read()
or read1() method to return an arbitrary bytes-like object (such as a
memoryview). Patch by Nikolaus Rath.

@item 
bpo-20951@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20951}: SSLSocket.send() now raises either SSLWantReadError or
SSLWantWriteError on a non-blocking socket if the operation would block.
Previously, it would return 0.  Patch by Nikolaus Rath.

@item 
bpo-13248@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13248}: removed previously deprecated asyncore.dispatcher __getattr__
cheap inheritance hack.

@item 
bpo-9815@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9815}: assertRaises now tries to clear references to local variables in
the exception’s traceback.

@item 
bpo-19940@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19940}: ssl.cert_time_to_seconds() now interprets the given time string
in the UTC timezone (as specified in RFC 5280), not the local timezone.

@item 
bpo-13204@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13204}: Calling sys.flags.__new__ would crash the interpreter, now it
raises a TypeError.

@item 
bpo-19385@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19385}: Make operations on a closed dbm.dumb database always raise the
same exception.

@item 
bpo-21207@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21207}: Detect when the os.urandom cached fd has been closed or
replaced, and open it anew.

@item 
bpo-21291@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21291}: subprocess’s Popen.wait() is now thread safe so that multiple
threads may be calling wait() or poll() on a Popen instance at the same
time without losing the Popen.returncode value.

@item 
bpo-21127@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21127}: Path objects can now be instantiated from str subclass
instances (such as @code{numpy.str_}).

@item 
bpo-15002@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15002}: urllib.response object to use _TemporaryFileWrapper (and
_TemporaryFileCloser) facility. Provides a better way to handle file
descriptor close. Patch contributed by Christian Theune.

@item 
bpo-12220@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12220}: mindom now raises a custom ValueError indicating it doesn’t
support spaces in URIs instead of letting a ‘split’ ValueError bubble up.

@item 
bpo-21068@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21068}: The ssl.PROTOCOL* constants are now enum members.

@item 
bpo-21276@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21276}: posixmodule: Don’t define USE_XATTRS on KFreeBSD and the Hurd.

@item 
bpo-21262@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21262}: New method assert_not_called for Mock. It raises AssertionError
if the mock has been called.

@item 
bpo-21238@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21238}: New keyword argument @code{unsafe} to Mock. It raises
@code{AttributeError} in case of an attribute startswith assert or assret.

@item 
bpo-20896@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20896}: ssl.get_server_certificate() now uses PROTOCOL_SSLv23, not
PROTOCOL_SSLv3, for maximum compatibility.

@item 
bpo-21239@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21239}: patch.stopall() didn’t work deterministically when the same
name was patched more than once.

@item 
bpo-21203@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21203}: Updated fileConfig and dictConfig to remove inconsistencies.
Thanks to Jure Koren for the patch.

@item 
bpo-21222@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21222}: Passing name keyword argument to mock.create_autospec now
works.

@item 
bpo-21197@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21197}: Add lib64 -> lib symlink in venvs on 64-bit non-OS X POSIX.

@item 
bpo-17498@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17498}: Some SMTP servers disconnect after certain errors, violating
strict RFC conformance.  Instead of losing the error code when we issue
the subsequent RSET, smtplib now returns the error code and defers raising
the SMTPServerDisconnected error until the next command is issued.

@item 
bpo-17826@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17826}: setting an iterable side_effect on a mock function created by
create_autospec now works. Patch by Kushal Das.

@item 
bpo-7776@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7776}: Fix @code{Host:} header and reconnection when using
http.client.HTTPConnection.set_tunnel(). Patch by Nikolaus Rath.

@item 
bpo-20968@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20968}: unittest.mock.MagicMock now supports division. Patch by
Johannes Baiter.

@item 
bpo-21529@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21529}: Fix arbitrary memory access in JSONDecoder.raw_decode with a
negative second parameter. Bug reported by Guido Vranken. (See also:
@geindex Common Vulnerabilities and Exposures; CVE 2014-4616
CVE 2014-4616@footnote{https://www.cve.org/CVERecord?id=CVE-2014-4616})

@item 
bpo-21169@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21169}: getpass now handles non-ascii characters that the input stream
encoding cannot encode by re-encoding using the replace error handler.

@item 
bpo-21171@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21171}: Fixed undocumented filter API of the rot13 codec. Patch by
Berker Peksag.

@item 
bpo-20539@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20539}: Improved math.factorial error message for large positive inputs
and changed exception type (OverflowError -> ValueError) for large
negative inputs.

@item 
bpo-21172@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21172}: isinstance check relaxed from dict to collections.Mapping.

@item 
bpo-21155@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21155}: asyncio.EventLoop.create_unix_server() now raises a ValueError
if path and sock are specified at the same time.

@item 
bpo-21136@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21136}: Avoid unnecessary normalization of Fractions resulting from
power and other operations.  Patch by Raymond Hettinger.

@item 
bpo-17621@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17621}: Introduce importlib.util.LazyLoader.

@item 
bpo-21076@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21076}: signal module constants were turned into enums. Patch by
Giampaolo Rodola’.

@item 
bpo-20636@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20636}: Improved the repr of Tkinter widgets.

@item 
bpo-19505@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19505}: The items, keys, and values views of OrderedDict now support
reverse iteration using reversed().

@item 
bpo-21149@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21149}: Improved thread-safety in logging cleanup during interpreter
shutdown. Thanks to Devin Jeanpierre for the patch.

@item 
bpo-21058@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21058}: Fix a leak of file descriptor in
@ref{6ee,,tempfile.NamedTemporaryFile()}, close the file descriptor if
@ref{741,,io.open()} fails

@item 
bpo-21200@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21200}: Return None from pkgutil.get_loader() when __spec__ is missing.

@item 
bpo-21013@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21013}: Enhance ssl.create_default_context() when used for server side
sockets to provide better security by default.

@item 
bpo-20145@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20145}: @code{assertRaisesRegex} and @code{assertWarnsRegex} now raise a
@code{TypeError} if the second argument is not a string or compiled regex.

@item 
bpo-20633@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20633}: Replace relative import by absolute import.

@item 
bpo-20980@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20980}: Stop wrapping exception when using ThreadPool.

@item 
bpo-21082@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21082}: In os.makedirs, do not set the process-wide umask. Note this
changes behavior of makedirs when exist_ok=True.

@item 
bpo-20990@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20990}: Fix issues found by pyflakes for multiprocessing.

@item 
bpo-21015@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21015}: SSL contexts will now automatically select an elliptic curve
for ECDH key exchange on OpenSSL 1.0.2 and later, and otherwise default to
“prime256v1”.

@item 
bpo-21000@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21000}: Improve the command-line interface of json.tool.

@item 
bpo-20995@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20995}: Enhance default ciphers used by the ssl module to enable better
security and prioritize perfect forward secrecy.

@item 
bpo-20884@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20884}: Don’t assume that __file__ is defined on importlib.__init__.

@item 
bpo-21499@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21499}: Ignore __builtins__ in several test_importlib.test_api tests.

@item 
bpo-20627@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20627}: xmlrpc.client.ServerProxy is now a context manager.

@item 
bpo-19165@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19165}: The formatter module now raises DeprecationWarning instead of
PendingDeprecationWarning.

@item 
bpo-13936@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13936}: Remove the ability of datetime.time instances to be considered
false in boolean contexts.

@item 
bpo-18931@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18931}: selectors module now supports /dev/poll on Solaris. Patch by
Giampaolo Rodola’.

@item 
bpo-19977@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19977}: When the @code{LC_TYPE} locale is the POSIX locale (@code{C} locale),
@ref{760,,sys.stdin} and @ref{cd3,,sys.stdout} are now using the
@code{surrogateescape} error handler, instead of the @code{strict} error
handler.

@item 
bpo-20574@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20574}: Implement incremental decoder for cp65001 code (Windows code
page 65001, Microsoft UTF-8).

@item 
bpo-20879@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20879}: Delay the initialization of encoding and decoding tables for
base32, ascii85 and base85 codecs in the base64 module, and delay the
initialization of the unquote_to_bytes() table of the urllib.parse module,
to not waste memory if these modules are not used.

@item 
bpo-19157@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19157}: Include the broadcast address in the usable hosts for IPv6 in
ipaddress.

@item 
bpo-11599@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11599}: When an external command (e.g. compiler) fails, distutils now
prints out the whole command line (instead of just the command name) if
the environment variable DISTUTILS_DEBUG is set.

@item 
bpo-4931@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4931}: distutils should not produce unhelpful “error: None” messages
anymore. distutils.util.grok_environment_error is kept but doc-deprecated.

@item 
bpo-20875@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20875}: Prevent possible gzip “‘read’ is not defined” NameError. Patch
by Claudiu Popa.

@item 
bpo-11558@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11558}: @code{email.message.Message.attach} now returns a more useful
error message if @code{attach} is called on a message for which
@code{is_multipart} is False.

@item 
bpo-20283@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20283}: RE pattern methods now accept the string keyword parameters as
documented. The pattern and source keyword parameters are left as
deprecated aliases.

@item 
bpo-20778@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20778}: Fix modulefinder to work with bytecode-only modules.

@item 
bpo-20791@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20791}: copy.copy() now doesn’t make a copy when the input is a bytes
object. Initial patch by Peter Otten.

@item 
bpo-19748@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19748}: On AIX, time.mktime() now raises an OverflowError for year
outsize range [1902; 2037].

@item 
bpo-19573@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19573}: inspect.signature: Use enum for parameter kind constants.

@item 
bpo-20726@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20726}: inspect.signature: Make Signature and Parameter picklable.

@item 
bpo-17373@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17373}: Add inspect.Signature.from_callable method.

@item 
bpo-20378@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20378}: Improve repr of inspect.Signature and inspect.Parameter.

@item 
bpo-20816@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20816}: Fix inspect.getcallargs() to raise correct TypeError for
missing keyword-only arguments. Patch by Jeremiah Lowin.

@item 
bpo-20817@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20817}: Fix inspect.getcallargs() to fail correctly if more than 3
arguments are missing. Patch by Jeremiah Lowin.

@item 
bpo-6676@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6676}: Ensure a meaningful exception is raised when attempting to parse
more than one XML document per pyexpat xmlparser instance. (Original
patches by Hirokazu Yamamoto and Amaury Forgeot d’Arc, with suggested
wording by David Gutteridge)

@item 
bpo-21117@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21117}: Fix inspect.signature to better support functools.partial. Due
to the specifics of functools.partial implementation,
positional-or-keyword arguments passed as keyword arguments become
keyword-only.

@item 
bpo-20334@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20334}: inspect.Signature and inspect.Parameter are now hashable.
Thanks to Antony Lee for bug reports and suggestions.

@item 
bpo-15916@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15916}: doctest.DocTestSuite returns an empty unittest.TestSuite
instead of raising ValueError if it finds no tests

@item 
bpo-21209@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21209}: Fix asyncio.tasks.CoroWrapper to workaround a bug in yield-from
implementation in CPythons prior to 3.4.1.

@item 
asyncio: Add gi_@{frame,running,code@} properties to CoroWrapper (upstream
bpo-163@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=163}).

@item 
bpo-21311@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21311}: Avoid exception in _osx_support with non-standard compiler
configurations. Patch by John Szakmeister.

@item 
bpo-11571@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11571}: Ensure that the turtle window becomes the topmost window when
launched on OS X.

@item 
bpo-21801@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21801}: Validate that __signature__ is None or an instance of
Signature.

@item 
bpo-21923@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21923}: Prevent AttributeError in
distutils.sysconfig.customize_compiler due to possible uninitialized
_config_vars.

@item 
bpo-21323@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21323}: Fix http.server to again handle scripts in CGI subdirectories,
broken by the fix for security bpo-19435@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19435}.  Patch by Zach Byrne.

@item 
bpo-22733@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22733}: Fix ffi_prep_args not zero-extending argument values correctly
on 64-bit Windows.

@item 
bpo-23302@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23302}: Default to TCP_NODELAY=1 upon establishing an HTTPConnection.
Removed use of hard-coded MSS as it’s an optimization that’s no longer
needed with Nagle disabled.
@end itemize

@node IDLE<64>,Build<104>,Library<211>,Python 3 5 0 alpha 1
@anchor{whatsnew/changelog id1099}@anchor{1ff4}
@subsubsection IDLE



@itemize -

@item 
bpo-20577@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20577}: Configuration of the max line length for the FormatParagraph
extension has been moved from the General tab of the Idle preferences
dialog to the FormatParagraph tab of the Config Extensions dialog. Patch
by Tal Einat.

@item 
bpo-16893@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16893}: Update Idle doc chapter to match current Idle and add new
information.

@item 
bpo-3068@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3068}: Add Idle extension configuration dialog to Options menu. Changes
are written to HOME/.idlerc/config-extensions.cfg. Original patch by Tal
Einat.

@item 
bpo-16233@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16233}: A module browser (File : Class Browser, Alt+C) requires an
editor window with a filename.  When Class Browser is requested otherwise,
from a shell, output window, or ‘Untitled’ editor, Idle no longer displays
an error box. It now pops up an Open Module box (Alt+M). If a valid name
is entered and a module is opened, a corresponding browser is also opened.

@item 
bpo-4832@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4832}: Save As to type Python files automatically adds .py to the name
you enter (even if your system does not display it).  Some systems
automatically add .txt when type is Text files.

@item 
bpo-21986@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21986}: Code objects are not normally pickled by the pickle module. To
match this, they are no longer pickled when running under Idle.

@item 
bpo-17390@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17390}: Adjust Editor window title; remove ‘Python’, move version to
end.

@item 
bpo-14105@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14105}: Idle debugger breakpoints no longer disappear when inserting or
deleting lines.

@item 
bpo-17172@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17172}: Turtledemo can now be run from Idle. Currently, the entry is on
the Help menu, but it may move to Run. Patch by Ramchandra Apt and Lita
Cho.

@item 
bpo-21765@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21765}: Add support for non-ascii identifiers to HyperParser.

@item 
bpo-21940@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21940}: Add unittest for WidgetRedirector. Initial patch by Saimadhav
Heblikar.

@item 
bpo-18592@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18592}: Add unittest for SearchDialogBase. Patch by Phil Webster.

@item 
bpo-21694@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21694}: Add unittest for ParenMatch. Patch by Saimadhav Heblikar.

@item 
bpo-21686@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21686}: add unittest for HyperParser. Original patch by Saimadhav
Heblikar.

@item 
bpo-12387@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12387}: Add missing upper(lower)case versions of default Windows key
bindings for Idle so Caps Lock does not disable them. Patch by Roger
Serwy.

@item 
bpo-21695@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21695}: Closing a Find-in-files output window while the search is still
in progress no longer closes Idle.

@item 
bpo-18910@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18910}: Add unittest for textView. Patch by Phil Webster.

@item 
bpo-18292@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18292}: Add unittest for AutoExpand. Patch by Saihadhav Heblikar.

@item 
bpo-18409@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18409}: Add unittest for AutoComplete. Patch by Phil Webster.

@item 
bpo-21477@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21477}: htest.py - Improve framework, complete set of tests. Patches by
Saimadhav Heblikar

@item 
bpo-18104@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18104}: Add idlelib/idle_test/htest.py with a few sample tests to begin
consolidating and improving human-validated tests of Idle. Change other
files as needed to work with htest.  Running the module as __main__ runs
all tests.

@item 
bpo-21139@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21139}: Change default paragraph width to 72, the 
@geindex Python Enhancement Proposals; PEP 8
PEP 8@footnote{https://peps.python.org/pep-0008/}
recommendation.

@item 
bpo-21284@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21284}: Paragraph reformat test passes after user changes reformat
width.

@item 
bpo-17654@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17654}: Ensure IDLE menus are customized properly on OS X for
non-framework builds and for all variants of Tk.

@item 
bpo-23180@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23180}: Rename IDLE “Windows” menu item to “Window”. Patch by Al
Sweigart.
@end itemize

@node Build<104>,C API<82>,IDLE<64>,Python 3 5 0 alpha 1
@anchor{whatsnew/changelog id1100}@anchor{1ff5}
@subsubsection Build



@itemize -

@item 
bpo-15506@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15506}: Use standard PKG_PROG_PKG_CONFIG autoconf macro in the
configure script.

@item 
bpo-22935@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22935}: Allow the ssl module to be compiled if openssl doesn’t support
SSL 3.

@item 
bpo-22592@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22592}: Drop support of the Borland C compiler to build Python. The
distutils module still supports it to build extensions.

@item 
bpo-22591@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22591}: Drop support of MS-DOS, especially of the DJGPP compiler
(MS-DOS port of GCC).

@item 
bpo-16537@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16537}: Check whether self.extensions is empty in setup.py. Patch by
Jonathan Hosmer.

@item 
bpo-22359@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22359}: Remove incorrect uses of recursive make.  Patch by Jonas
Wagner.

@item 
bpo-21958@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21958}: Define HAVE_ROUND when building with Visual Studio 2013 and
above.  Patch by Zachary Turner.

@item 
bpo-18093@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18093}: the programs that embed the CPython runtime are now in a
separate “Programs” directory, rather than being kept in the Modules
directory.

@item 
bpo-15759@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15759}: “make suspicious”, “make linkcheck” and “make doctest” in Doc/
now display special message when and only when there are failures.

@item 
bpo-21141@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21141}: The Windows build process no longer attempts to find Perl,
instead relying on OpenSSL source being configured and ready to build.
The @code{PCbuild\build_ssl.py} script has been re-written and re-named to
@code{PCbuild\prepare_ssl.py}, and takes care of configuring OpenSSL source
for both 32 and 64 bit platforms.  OpenSSL sources obtained from
svn.python.org will always be pre-configured and ready to build.

@item 
bpo-21037@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21037}: Add a build option to enable AddressSanitizer support.

@item 
bpo-19962@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19962}: The Windows build process now creates “python.bat” in the root
of the source tree, which passes all arguments through to the most
recently built interpreter.

@item 
bpo-21285@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21285}: Refactor and fix curses configure check to always search in a
ncursesw directory.

@item 
bpo-15234@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15234}: For BerkeleyDB and Sqlite, only add the found library and
include directories if they aren’t already being searched. This avoids an
explicit runtime library dependency.

@item 
bpo-17861@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17861}: Tools/scripts/generate_opcode_h.py automatically regenerates
Include/opcode.h from Lib/opcode.py if the latter gets any change.

@item 
bpo-20644@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20644}: OS X installer build support for documentation build changes in
3.4.1: assume externally supplied sphinx-build is available in /usr/bin.

@item 
bpo-20022@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20022}: Eliminate use of deprecated bundlebuilder in OS X builds.

@item 
bpo-15968@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15968}: Incorporated Tcl, Tk, and Tix builds into the Windows build
solution.

@item 
bpo-17095@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17095}: Fix Modules/Setup `shared' support.

@item 
bpo-21811@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21811}: Anticipated fixes to support OS X versions > 10.9.

@item 
bpo-21166@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21166}: Prevent possible segfaults and other random failures of python
–generate-posix-vars in pybuilddir.txt build target.

@item 
bpo-18096@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18096}: Fix library order returned by python-config.

@item 
bpo-17219@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17219}: Add library build dir for Python extension cross-builds.

@item 
bpo-22919@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22919}: Windows build updated to support VC 14.0 (Visual Studio 2015),
which will be used for the official release.

@item 
bpo-21236@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21236}: Build _msi.pyd with cabinet.lib instead of fci.lib

@item 
bpo-17128@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17128}: Use private version of OpenSSL for OS X 10.5+ installer.
@end itemize

@node C API<82>,Documentation<88>,Build<104>,Python 3 5 0 alpha 1
@anchor{whatsnew/changelog id1101}@anchor{1ff6}
@subsubsection C API



@itemize -

@item 
bpo-14203@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14203}: Remove obsolete support for view==NULL in PyBuffer_FillInfo(),
bytearray_getbuffer(), bytesiobuf_getbuffer() and array_buffer_getbuf().
All functions now raise BufferError in that case.

@item 
bpo-22445@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22445}: PyBuffer_IsContiguous() now implements precise contiguity
tests, compatible with NumPy’s NPY_RELAXED_STRIDES_CHECKING compilation
flag.  Previously the function reported false negatives for corner cases.

@item 
bpo-22079@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22079}: PyType_Ready() now checks that statically allocated type has no
dynamically allocated bases.

@item 
bpo-22453@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22453}: Removed non-documented macro PyObject_REPR().

@item 
bpo-18395@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18395}: Rename @code{_Py_char2wchar()} to @ref{dc6,,Py_DecodeLocale()},
rename @code{_Py_wchar2char()} to @ref{dc7,,Py_EncodeLocale()}, and document
these functions.

@item 
bpo-21233@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21233}: Add new C functions: PyMem_RawCalloc(), PyMem_Calloc(),
PyObject_Calloc(), _PyObject_GC_Calloc(). bytes(int) is now using
@code{calloc()} instead of @code{malloc()} for large objects which is faster and
use less memory.

@item 
bpo-20942@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20942}: PyImport_ImportFrozenModuleObject() no longer sets __file__ to
match what importlib does; this affects _frozen_importlib as well as any
module loaded using imp.init_frozen().
@end itemize

@node Documentation<88>,Tests<92>,C API<82>,Python 3 5 0 alpha 1
@anchor{whatsnew/changelog id1102}@anchor{1ff7}
@subsubsection Documentation



@itemize -

@item 
bpo-19548@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19548}: Update the codecs module documentation to better cover the
distinction between text encodings and other codecs, together with other
clarifications. Patch by Martin Panter.

@item 
bpo-22394@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22394}: Doc/Makefile now supports @code{make venv PYTHON=../python} to
create a venv for generating the documentation, e.g., @code{make html
PYTHON=venv/bin/python3}.

@item 
bpo-21514@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21514}: The documentation of the json module now refers to new JSON RFC
7159 instead of obsoleted RFC 4627.

@item 
bpo-21777@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21777}: The binary sequence methods on bytes and bytearray are now
documented explicitly, rather than assuming users will be able to derive
the expected behaviour from the behaviour of the corresponding str
methods.

@item 
bpo-6916@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6916}: undocument deprecated asynchat.fifo class.

@item 
bpo-17386@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17386}: Expanded functionality of the @code{Doc/make.bat} script to make
it much more comparable to @code{Doc/Makefile}.

@item 
bpo-21312@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21312}: Update the thread_foobar.h template file to include newer
threading APIs. Patch by Jack McCracken.

@item 
bpo-21043@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21043}: Remove the recommendation for specific CA organizations and to
mention the ability to load the OS certificates.

@item 
bpo-20765@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20765}: Add missing documentation for PurePath.with_name() and
PurePath.with_suffix().

@item 
bpo-19407@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19407}: New package installation and distribution guides based on the
Python Packaging Authority tools. Existing guides have been retained as
legacy links from the distutils docs, as they still contain some required
reference material for tool developers that isn’t recorded anywhere else.

@item 
bpo-19697@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19697}: Document cases where __main__.__spec__ is None.
@end itemize

@node Tests<92>,Tools/Demos<61>,Documentation<88>,Python 3 5 0 alpha 1
@anchor{whatsnew/changelog id1103}@anchor{1ff8}
@subsubsection Tests



@itemize -

@item 
bpo-18982@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18982}: Add tests for CLI of the calendar module.

@item 
bpo-19548@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19548}: Added some additional checks to test_codecs to ensure that
statements in the updated documentation remain accurate. Patch by Martin
Panter.

@item 
bpo-22838@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22838}: All test_re tests now work with unittest test discovery.

@item 
bpo-22173@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22173}: Update lib2to3 tests to use unittest test discovery.

@item 
bpo-16000@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16000}: Convert test_curses to use unittest.

@item 
bpo-21456@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21456}: Skip two tests in test_urllib2net.py if _ssl module not
present. Patch by Remi Pointel.

@item 
bpo-20746@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20746}: Fix test_pdb to run in refleak mode (-R).  Patch by Xavier de
Gaye.

@item 
bpo-22060@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22060}: test_ctypes has been somewhat cleaned up and simplified; it now
uses unittest test discovery to find its tests.

@item 
bpo-22104@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22104}: regrtest.py no longer holds a reference to the suite of tests
loaded from test modules that don’t define test_main().

@item 
bpo-22111@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22111}: Assorted cleanups in test_imaplib.  Patch by Milan Oberkirch.

@item 
bpo-22002@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22002}: Added @code{load_package_tests} function to test.support and used
it to implement/augment test discovery in test_asyncio, test_email,
test_importlib, test_json, and test_tools.

@item 
bpo-21976@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21976}: Fix test_ssl to accept LibreSSL version strings.  Thanks to
William Orr.

@item 
bpo-21918@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21918}: Converted test_tools from a module to a package containing
separate test files for each tested script.

@item 
bpo-9554@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9554}: Use modern unittest features in test_argparse. Initial patch by
Denver Coneybeare and Radu Voicilas.

@item 
bpo-20155@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20155}: Changed HTTP method names in failing tests in test_httpservers
so that packet filtering software (specifically Windows Base Filtering
Engine) does not interfere with the transaction semantics expected by the
tests.

@item 
bpo-19493@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19493}: Refactored the ctypes test package to skip tests explicitly
rather than silently.

@item 
bpo-18492@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18492}: All resources are now allowed when tests are not run by
regrtest.py.

@item 
bpo-21634@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21634}: Fix pystone micro-benchmark: use floor division instead of true
division to benchmark integers instead of floating-point numbers. Set
pystone version to 1.2. Patch written by Lennart Regebro.

@item 
bpo-21605@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21605}: Added tests for Tkinter images.

@item 
bpo-21493@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21493}: Added test for ntpath.expanduser().  Original patch by Claudiu
Popa.

@item 
bpo-19925@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19925}: Added tests for the spwd module. Original patch by Vajrasky
Kok.

@item 
bpo-21522@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21522}: Added Tkinter tests for Listbox.itemconfigure(),
PanedWindow.paneconfigure(), and Menu.entryconfigure().

@item 
bpo-17756@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17756}: Fix test_code test when run from the installed location.

@item 
bpo-17752@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17752}: Fix distutils tests when run from the installed location.

@item 
bpo-18604@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18604}: Consolidated checks for GUI availability.  All platforms now at
least check whether Tk can be instantiated when the GUI resource is
requested.

@item 
bpo-21275@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21275}: Fix a socket test on KFreeBSD.

@item 
bpo-21223@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21223}: Pass test_site/test_startup_imports when some of the extensions
are built as builtins.

@item 
bpo-20635@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20635}: Added tests for Tk geometry managers.

@item 
Add test case for freeze.

@item 
bpo-20743@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20743}: Fix a reference leak in test_tcl.

@item 
bpo-21097@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21097}: Move test_namespace_pkgs into test_importlib.

@item 
bpo-21503@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21503}: Use test_both() consistently in test_importlib.

@item 
bpo-20939@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20939}: Avoid various network test failures due to new redirect of
@indicateurl{http://www.python.org/} to @indicateurl{https://www.python.org}: use
@indicateurl{http://www.example.com} instead.

@item 
bpo-20668@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20668}: asyncio tests no longer rely on tests.txt file. (Patch by
Vajrasky Kok)

@item 
bpo-21093@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21093}: Prevent failures of ctypes test_macholib on OS X if a copy of
libz exists in $HOME/lib or /usr/local/lib.

@item 
bpo-22770@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22770}: Prevent some Tk segfaults on OS X when running gui tests.

@item 
bpo-23211@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23211}: Workaround test_logging failure on some OS X 10.6 systems.

@item 
bpo-23345@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23345}: Prevent test_ssl failures with large OpenSSL patch level values
(like 0.9.8zc).
@end itemize

@node Tools/Demos<61>,Windows<85>,Tests<92>,Python 3 5 0 alpha 1
@anchor{whatsnew/changelog id1104}@anchor{1ff9}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-22314@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22314}: pydoc now works when the LINES environment variable is set.

@item 
bpo-22615@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22615}: Argument Clinic now supports the “type” argument for the int
converter. This permits using the int converter with enums and typedefs.

@item 
bpo-20076@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20076}: The makelocalealias.py script no longer ignores UTF-8 mapping.

@item 
bpo-20079@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20079}: The makelocalealias.py script now can parse the SUPPORTED file
from glibc sources and supports command line options for source paths.

@item 
bpo-22201@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22201}: Command-line interface of the zipfile module now correctly
extracts ZIP files with directory entries.  Patch by Ryan Wilson.

@item 
bpo-22120@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22120}: For functions using an unsigned integer return converter,
Argument Clinic now generates a cast to that type for the comparison to -1
in the generated code.  (This suppresses a compilation warning.)

@item 
bpo-18974@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18974}: Tools/scripts/diff.py now uses argparse instead of optparse.

@item 
bpo-21906@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21906}: Make Tools/scripts/md5sum.py work in Python 3. Patch by Zachary
Ware.

@item 
bpo-21629@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21629}: Fix Argument Clinic’s “–converters” feature.

@item 
Add support for @code{yield from} to 2to3.

@item 
Add support for the 
@geindex Python Enhancement Proposals; PEP 465
PEP 465@footnote{https://peps.python.org/pep-0465/} matrix multiplication operator to 2to3.

@item 
bpo-16047@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16047}: Fix module exception list and __file__ handling in freeze.
Patch by Meador Inge.

@item 
bpo-11824@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11824}: Consider ABI tags in freeze. Patch by Meador Inge.

@item 
bpo-20535@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20535}: PYTHONWARNING no longer affects the run_tests.py script. Patch
by Arfrever Frehtes Taifersar Arahesis.
@end itemize

@node Windows<85>,,Tools/Demos<61>,Python 3 5 0 alpha 1
@anchor{whatsnew/changelog id1105}@anchor{1ffa}
@subsubsection Windows



@itemize -

@item 
bpo-23260@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23260}: Update Windows installer

@item 
The bundled version of Tcl/Tk has been updated to 8.6.3.  The most visible
result of this change is the addition of new native file dialogs when
running on Windows Vista or newer.  See Tcl/Tk’s TIP 432 for more
information.  Also, this version of Tcl/Tk includes support for Windows
10.

@item 
bpo-17896@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17896}: The Windows build scripts now expect external library sources
to be in @code{PCbuild\..\externals} rather than @code{PCbuild\..\..}.

@item 
bpo-17717@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17717}: The Windows build scripts now use a copy of NASM pulled from
svn.python.org to build OpenSSL.

@item 
bpo-21907@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21907}: Improved the batch scripts provided for building Python.

@item 
bpo-22644@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22644}: The bundled version of OpenSSL has been updated to 1.0.1j.

@item 
bpo-10747@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10747}: Use versioned labels in the Windows start menu. Patch by Olive
Kilburn.

@item 
bpo-22980@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22980}: .pyd files with a version and platform tag (for example,
“.cp35-win32.pyd”) will now be loaded in preference to those without tags.
@end itemize

`(For information about older versions, consult the HISTORY file.)'

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node The Python Tutorial,Python Setup and Usage,What’s New in Python,Top
@anchor{tutorial/index doc}@anchor{1ffb}@anchor{tutorial/index the-python-tutorial}@anchor{1ffc}@anchor{tutorial/index translation-repo}@anchor{1ffd}@anchor{tutorial/index tutorial-index}@anchor{1ffe}
@chapter The Python Tutorial


@cartouche
@quotation Tip 
This tutorial is designed for
`programmers' that are new to the Python language,
`not' `beginners' who are new to programming.
@end quotation
@end cartouche

Python is an easy to learn, powerful programming language. It has efficient
high-level data structures and a simple but effective approach to
object-oriented programming. Python’s elegant syntax and dynamic typing,
together with its interpreted nature, make it an ideal language for scripting
and rapid application development in many areas on most platforms.

The Python interpreter and the extensive standard library are freely available
in source or binary form for all major platforms from the Python website,
@indicateurl{https://www.python.org/}, and may be freely distributed. The same site also
contains distributions of and pointers to many free third party Python modules,
programs and tools, and additional documentation.

The Python interpreter is easily extended with new functions and data types
implemented in C or C++ (or other languages callable from C). Python is also
suitable as an extension language for customizable applications.

This tutorial introduces the reader informally to the basic concepts and
features of the Python language and system. Be aware that it expects you to
have a basic understanding of programming in general. It helps to have a Python
interpreter handy for hands-on experience, but all examples are self-contained,
so the tutorial can be read off-line as well.

For a description of standard objects and modules, see @ref{14a,,The Python Standard Library}.
@ref{14b,,The Python Language Reference} gives a more formal definition of the language.  To write
extensions in C or C++, read @ref{1fff,,Extending and Embedding the Python Interpreter} and
@ref{2000,,Python/C API reference manual}. There are also several books covering Python in depth.

This tutorial does not attempt to be comprehensive and cover every single
feature, or even every commonly used feature. Instead, it introduces many of
Python’s most noteworthy features, and will give you a good idea of the
language’s flavor and style. After reading it, you will be able to read and
write Python modules and programs, and you will be ready to learn more about the
various Python library modules described in @ref{14a,,The Python Standard Library}.

The @ref{2001,,Glossary} is also worth going through.

@menu
* Whetting Your Appetite:: 
* Using the Python Interpreter:: 
* An Informal Introduction to Python:: 
* More Control Flow Tools:: 
* Data Structures:: 
* Modules: Modules<2>. 
* Input and Output:: 
* Errors and Exceptions:: 
* Classes:: 
* Brief tour of the standard library:: 
* Brief tour of the standard library — part II:: 
* Virtual Environments and Packages:: 
* What Now?:: 
* Interactive Input Editing and History Substitution:: 
* Floating-Point Arithmetic; Issues and Limitations: Floating-Point Arithmetic Issues and Limitations. 
* Appendix:: 

@end menu

@node Whetting Your Appetite,Using the Python Interpreter,,The Python Tutorial
@anchor{tutorial/appetite doc}@anchor{2002}@anchor{tutorial/appetite tut-intro}@anchor{2003}@anchor{tutorial/appetite whetting-your-appetite}@anchor{2004}
@section Whetting Your Appetite


If you do much work on computers, eventually you find that there’s some task
you’d like to automate.  For example, you may wish to perform a
search-and-replace over a large number of text files, or rename and rearrange a
bunch of photo files in a complicated way. Perhaps you’d like to write a small
custom database, or a specialized GUI application, or a simple game.

If you’re a professional software developer, you may have to work with several
C/C++/Java libraries but find the usual write/compile/test/re-compile cycle is
too slow.  Perhaps you’re writing a test suite for such a library and find
writing the testing code a tedious task.  Or maybe you’ve written a program that
could use an extension language, and you don’t want to design and implement a
whole new language for your application.

Python is just the language for you.

You could write a Unix shell script or Windows batch files for some of these
tasks, but shell scripts are best at moving around files and changing text data,
not well-suited for GUI applications or games. You could write a C/C++/Java
program, but it can take a lot of development time to get even a first-draft
program.  Python is simpler to use, available on Windows, macOS, and Unix
operating systems, and will help you get the job done more quickly.

Python is simple to use, but it is a real programming language, offering much
more structure and support for large programs than shell scripts or batch files
can offer.  On the other hand, Python also offers much more error checking than
C, and, being a `very-high-level language', it has high-level data types built
in, such as flexible arrays and dictionaries.  Because of its more general data
types Python is applicable to a much larger problem domain than Awk or even
Perl, yet many things are at least as easy in Python as in those languages.

Python allows you to split your program into modules that can be reused in other
Python programs.  It comes with a large collection of standard modules that you
can use as the basis of your programs — or as examples to start learning to
program in Python.  Some of these modules provide things like file I/O, system
calls, sockets, and even interfaces to graphical user interface toolkits like
Tk.

Python is an interpreted language, which can save you considerable time during
program development because no compilation and linking is necessary.  The
interpreter can be used interactively, which makes it easy to experiment with
features of the language, to write throw-away programs, or to test functions
during bottom-up program development. It is also a handy desk calculator.

Python enables programs to be written compactly and readably.  Programs written
in Python are typically much shorter than equivalent C,  C++, or Java programs,
for several reasons:


@itemize *

@item 
the high-level data types allow you to express complex operations in a single
statement;

@item 
statement grouping is done by indentation instead of beginning and ending
brackets;

@item 
no variable or argument declarations are necessary.
@end itemize

Python is `extensible': if you know how to program in C it is easy to add a new
built-in function or module to the interpreter, either to perform critical
operations at maximum speed, or to link Python programs to libraries that may
only be available in binary form (such as a vendor-specific graphics library).
Once you are really hooked, you can link the Python interpreter into an
application written in C and use it as an extension or command language for that
application.

By the way, the language is named after the BBC show “Monty Python’s Flying
Circus” and has nothing to do with reptiles.  Making references to Monty
Python skits in documentation is not only allowed, it is encouraged!

Now that you are all excited about Python, you’ll want to examine it in some
more detail.  Since the best way to learn a language is to use it, the tutorial
invites you to play with the Python interpreter as you read.

In the next chapter, the mechanics of using the interpreter are explained.  This
is rather mundane information, but essential for trying out the examples shown
later.

The rest of the tutorial introduces various features of the Python language and
system through examples, beginning with simple expressions, statements and data
types, through functions and modules, and finally touching upon advanced
concepts like exceptions and user-defined classes.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Using the Python Interpreter,An Informal Introduction to Python,Whetting Your Appetite,The Python Tutorial
@anchor{tutorial/interpreter doc}@anchor{2005}@anchor{tutorial/interpreter translation-repo}@anchor{2006}@anchor{tutorial/interpreter tut-using}@anchor{2007}@anchor{tutorial/interpreter using-the-python-interpreter}@anchor{2008}
@section Using the Python Interpreter


@menu
* Invoking the Interpreter:: 
* The Interpreter and Its Environment:: 

@end menu

@node Invoking the Interpreter,The Interpreter and Its Environment,,Using the Python Interpreter
@anchor{tutorial/interpreter invoking-the-interpreter}@anchor{2009}@anchor{tutorial/interpreter tut-invoking}@anchor{200a}
@subsection Invoking the Interpreter


The Python interpreter is usually installed as @code{/usr/local/bin/python3.14}
on those machines where it is available; putting @code{/usr/local/bin} in your
Unix shell’s search path makes it possible to start it by typing the command:

@example
python3.14
@end example

to the shell. @footnote{
On Unix, the Python 3.x interpreter is by default not installed with the
executable named @code{python}, so that it does not conflict with a
simultaneously installed Python 2.x executable.
} Since the choice of the directory where the interpreter lives
is an installation option, other places are possible; check with your local
Python guru or system administrator.  (E.g., @code{/usr/local/python} is a
popular alternative location.)

On Windows machines where you have installed Python from the @ref{200b,,Microsoft Store}, the @code{python3.14} command will be available. If you have
the @ref{7db,,py.exe launcher} installed, you can use the @code{py}
command. See @ref{200c,,Python install manager} for other ways to launch Python.

Typing an end-of-file character (@code{Control}-@code{D} on Unix, @code{Control}-@code{Z} on
Windows) at the primary prompt causes the interpreter to exit with a zero exit
status.  If that doesn’t work, you can exit the interpreter by typing the
following command: @code{quit()}.

The interpreter’s line-editing features include interactive editing, history
substitution and code completion on most systems.
Perhaps the quickest check to see whether command line editing is supported is
typing a word in on the Python prompt, then pressing Left arrow (or @code{Control}-@code{b}).
If the cursor moves, you have command line editing; see Appendix
@ref{200d,,Interactive Input Editing and History Substitution} for an introduction to the keys.
If nothing appears to happen, or if a sequence like @code{^[[D} or @code{^B} appears,
command line editing isn’t available; you’ll only be able to use
backspace to remove characters from the current line.

The interpreter operates somewhat like the Unix shell: when called with standard
input connected to a tty device, it reads and executes commands interactively;
when called with a file name argument or with a file as standard input, it reads
and executes a `script' from that file.

A second way of starting the interpreter is @code{python -c command [arg] ...},
which executes the statement(s) in `command', analogous to the shell’s
@ref{1a9,,-c} option.  Since Python statements often contain spaces or other
characters that are special to the shell, it is usually advised to quote
`command' in its entirety.

Some Python modules are also useful as scripts.  These can be invoked using
@code{python -m module [arg] ...}, which executes the source file for `module' as
if you had spelled out its full name on the command line.

When a script file is used, it is sometimes useful to be able to run the script
and enter interactive mode afterwards.  This can be done by passing @ref{16e7,,-i}
before the script.

All command line options are described in @ref{1dea,,Command line and environment}.

@menu
* Argument Passing:: 
* Interactive Mode:: 

@end menu

@node Argument Passing,Interactive Mode,,Invoking the Interpreter
@anchor{tutorial/interpreter argument-passing}@anchor{200e}@anchor{tutorial/interpreter tut-argpassing}@anchor{200f}
@subsubsection Argument Passing


When known to the interpreter, the script name and additional arguments
thereafter are turned into a list of strings and assigned to the @code{argv}
variable in the @code{sys} module.  You can access this list by executing @code{import
sys}.  The length of the list is at least one; when no script and no arguments
are given, @code{sys.argv[0]} is an empty string.  When the script name is given as
@code{'-'} (meaning  standard input), @code{sys.argv[0]} is set to @code{'-'}.  When
@ref{1a9,,-c} `command' is used, @code{sys.argv[0]} is set to @code{'-c'}.  When
@ref{23e,,-m} `module' is used, @code{sys.argv[0]}  is set to the full name of the
located module.  Options found after  @code{-c} `command' or @code{-m}
`module' are not consumed  by the Python interpreter’s option processing but
left in @code{sys.argv} for  the command or module to handle.

@node Interactive Mode,,Argument Passing,Invoking the Interpreter
@anchor{tutorial/interpreter interactive-mode}@anchor{2010}@anchor{tutorial/interpreter tut-interactive}@anchor{441}
@subsubsection Interactive Mode


When commands are read from a tty, the interpreter is said to be in `interactive
mode'.  In this mode it prompts for the next command with the `primary prompt',
usually three greater-than signs (@code{>>>}); for continuation lines it prompts
with the `secondary prompt', by default three dots (@code{...}). The interpreter
prints a welcome message stating its version number and a copyright notice
before printing the first prompt:

@example
$ python3.14
Python 3.14 (default, April 4 2024, 09:25:04)
[GCC 10.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
@end example

@c XXX update for new releases

Continuation lines are needed when entering a multi-line construct. As an
example, take a look at this @ref{182,,if} statement:

@example
>>> the_world_is_flat = True
>>> if the_world_is_flat:
...     print("Be careful not to fall off!")
...
Be careful not to fall off!
@end example

For more on interactive mode, see @ref{495,,Interactive Mode}.

@node The Interpreter and Its Environment,,Invoking the Interpreter,Using the Python Interpreter
@anchor{tutorial/interpreter the-interpreter-and-its-environment}@anchor{2011}@anchor{tutorial/interpreter tut-interp}@anchor{2012}
@subsection The Interpreter and Its Environment


@menu
* Source Code Encoding:: 

@end menu

@node Source Code Encoding,,,The Interpreter and Its Environment
@anchor{tutorial/interpreter source-code-encoding}@anchor{2013}@anchor{tutorial/interpreter tut-source-encoding}@anchor{2014}
@subsubsection Source Code Encoding


By default, Python source files are treated as encoded in UTF-8.  In that
encoding, characters of most languages in the world can be used simultaneously
in string literals, identifiers and comments — although the standard library
only uses ASCII characters for identifiers, a convention that any portable code
should follow.  To display all these characters properly, your editor must
recognize that the file is UTF-8, and it must use a font that supports all the
characters in the file.

To declare an encoding other than the default one, a special comment line
should be added as the `first' line of the file.  The syntax is as follows:

@example
# -*- coding: encoding -*-
@end example

where `encoding' is one of the valid @ref{1c,,codecs} supported by Python.

For example, to declare that Windows-1252 encoding is to be used, the first
line of your source code file should be:

@example
# -*- coding: cp1252 -*-
@end example

One exception to the `first line' rule is when the source code starts with a
@ref{2015,,UNIX “shebang” line}.  In this case, the encoding
declaration should be added as the second line of the file.  For example:

@example
#!/usr/bin/env python3
# -*- coding: cp1252 -*-
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node An Informal Introduction to Python,More Control Flow Tools,Using the Python Interpreter,The Python Tutorial
@anchor{tutorial/introduction doc}@anchor{2016}@anchor{tutorial/introduction an-informal-introduction-to-python}@anchor{2017}@anchor{tutorial/introduction translation-repo}@anchor{2018}@anchor{tutorial/introduction tut-informal}@anchor{2019}
@section An Informal Introduction to Python


In the following examples, input and output are distinguished by the presence or
absence of prompts (@ref{493,,>>>} and @ref{494,,…}): to repeat the example, you must type
everything after the prompt, when the prompt appears; lines that do not begin
with a prompt are output from the interpreter. Note that a secondary prompt on a
line by itself in an example means you must type a blank line; this is used to
end a multi-line command.


@geindex # (hash); comment

Many of the examples in this manual, even those entered at the interactive
prompt, include comments.  Comments in Python start with the hash character,
@code{#}, and extend to the end of the physical line.  A comment may appear at the
start of a line or following whitespace or code, but not within a string
literal.  A hash character within a string literal is just a hash character.
Since comments are to clarify code and are not interpreted by Python, they may
be omitted when typing in examples.

Some examples:

@example
# this is the first comment
spam = 1  # and this is the second comment
          # ... and now a third!
text = "# This is not a comment because it's inside quotes."
@end example

@menu
* Using Python as a Calculator:: 
* First Steps Towards Programming:: 

@end menu

@node Using Python as a Calculator,First Steps Towards Programming,,An Informal Introduction to Python
@anchor{tutorial/introduction tut-calculator}@anchor{201a}@anchor{tutorial/introduction using-python-as-a-calculator}@anchor{201b}
@subsection Using Python as a Calculator


Let’s try some simple Python commands.  Start the interpreter and wait for the
primary prompt, @code{>>>}.  (It shouldn’t take long.)

@menu
* Numbers:: 
* Text:: 
* Lists:: 

@end menu

@node Numbers,Text,,Using Python as a Calculator
@anchor{tutorial/introduction numbers}@anchor{201c}@anchor{tutorial/introduction tut-numbers}@anchor{201d}
@subsubsection Numbers


The interpreter acts as a simple calculator: you can type an expression into it
and it will write the value.  Expression syntax is straightforward: the
operators @code{+}, @code{-}, @code{*} and @code{/} can be used to perform
arithmetic; parentheses (@code{()}) can be used for grouping.
For example:

@example
>>> 2 + 2
4
>>> 50 - 5*6
20
>>> (50 - 5*6) / 4
5.0
>>> 8 / 5  # division always returns a floating-point number
1.6
@end example

The integer numbers (e.g. @code{2}, @code{4}, @code{20}) have type @ref{19c,,int},
the ones with a fractional part (e.g. @code{5.0}, @code{1.6}) have type
@ref{197,,float}.  We will see more about numeric types later in the tutorial.

Division (@code{/}) always returns a float.  To do @ref{b44,,floor division} and
get an integer result you can use the @code{//} operator; to calculate
the remainder you can use @code{%}:

@example
>>> 17 / 3  # classic division returns a float
5.666666666666667
>>>
>>> 17 // 3  # floor division discards the fractional part
5
>>> 17 % 3  # the % operator returns the remainder of the division
2
>>> 5 * 3 + 2  # floored quotient * divisor + remainder
17
@end example

With Python, it is possible to use the @code{**} operator to calculate powers @footnote{
Since @code{**} has higher precedence than @code{-}, @code{-3**2} will be
interpreted as @code{-(3**2)} and thus result in @code{-9}.  To avoid this
and get @code{9}, you can use @code{(-3)**2}.
}:

@example
>>> 5 ** 2  # 5 squared
25
>>> 2 ** 7  # 2 to the power of 7
128
@end example

The equal sign (@code{=}) is used to assign a value to a variable. Afterwards, no
result is displayed before the next interactive prompt:

@example
>>> width = 20
>>> height = 5 * 9
>>> width * height
900
@end example

If a variable is not “defined” (assigned a value), trying to use it will
give you an error:

@example
>>> n  # try to access an undefined variable
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'n' is not defined
@end example

There is full support for floating point; operators with mixed type operands
convert the integer operand to floating point:

@example
>>> 4 * 3.75 - 1
14.0
@end example

In interactive mode, the last printed expression is assigned to the variable
@code{_}.  This means that when you are using Python as a desk calculator, it is
somewhat easier to continue calculations, for example:

@example
>>> tax = 12.5 / 100
>>> price = 100.50
>>> price * tax
12.5625
>>> price + _
113.0625
>>> round(_, 2)
113.06
@end example

This variable should be treated as read-only by the user.  Don’t explicitly
assign a value to it — you would create an independent local variable with the
same name masking the built-in variable with its magic behavior.

In addition to @ref{19c,,int} and @ref{197,,float}, Python supports other types of
numbers, such as @ref{200,,Decimal} and @ref{215,,Fraction}.
Python also has built-in support for @ref{201e,,complex numbers},
and uses the @code{j} or @code{J} suffix to indicate the imaginary part
(e.g. @code{3+5j}).

@node Text,Lists,Numbers,Using Python as a Calculator
@anchor{tutorial/introduction text}@anchor{201f}@anchor{tutorial/introduction tut-strings}@anchor{2020}
@subsubsection Text


Python can manipulate text (represented by type @ref{16a,,str}, so-called
“strings”) as well as numbers.  This includes characters “@code{!}”, words
“@code{rabbit}”, names “@code{Paris}”, sentences “@code{Got your back.}”, etc.
“@code{Yay! :)}”. They can be enclosed in single quotes (@code{'...'}) or double
quotes (@code{"..."}) with the same result @footnote{
Unlike other languages, special characters such as @code{\n} have the
same meaning with both single (@code{'...'}) and double (@code{"..."}) quotes.
The only difference between the two is that within single quotes you don’t
need to escape @code{"} (but you have to escape @code{\'}) and vice versa.
}.

@example
>>> 'spam eggs'  # single quotes
'spam eggs'
>>> "Paris rabbit got your back :)! Yay!"  # double quotes
'Paris rabbit got your back :)! Yay!'
>>> '1975'  # digits and numerals enclosed in quotes are also strings
'1975'
@end example

To quote a quote, we need to “escape” it, by preceding it with @code{\}.
Alternatively, we can use the other type of quotation marks:

@example
>>> 'doesn\'t'  # use \' to escape the single quote...
"doesn't"
>>> "doesn't"  # ...or use double quotes instead
"doesn't"
>>> '"Yes," they said.'
'"Yes," they said.'
>>> "\"Yes,\" they said."
'"Yes," they said.'
>>> '"Isn\'t," they said.'
'"Isn\'t," they said.'
@end example

In the Python shell, the string definition and output string can look
different.  The @ref{117b,,print()} function produces a more readable output, by
omitting the enclosing quotes and by printing escaped and special characters:

@example
>>> s = 'First line.\nSecond line.'  # \n means newline
>>> s  # without print(), special characters are included in the string
'First line.\nSecond line.'
>>> print(s)  # with print(), special characters are interpreted, so \n produces new line
First line.
Second line.
@end example

If you don’t want characters prefaced by @code{\} to be interpreted as
special characters, you can use `raw strings' by adding an @code{r} before
the first quote:

@example
>>> print('C:\this\name')  # here \t means tab, \n means newline
C:      his
ame
>>> print(r'C:\this\name')  # note the r before the quote
C:\this\name
@end example

There is one subtle aspect to raw strings: a raw string may not end in
an odd number of @code{\} characters; see
@ref{2021,,the FAQ entry} for more information
and workarounds.

String literals can span multiple lines.  One way is using triple-quotes:
@code{"""..."""} or @code{'@w{'}'...'@w{'}'}.  End-of-line characters are automatically
included in the string, but it’s possible to prevent this by adding a @code{\} at
the end of the line.  In the following example, the initial newline is not
included:

@example
>>> print("""\
... Usage: thingy [OPTIONS]
...      -h                        Display this usage message
...      -H hostname               Hostname to connect to
... """)
Usage: thingy [OPTIONS]
     -h                        Display this usage message
     -H hostname               Hostname to connect to

>>>
@end example

Strings can be concatenated (glued together) with the @code{+} operator, and
repeated with @code{*}:

@example
>>> # 3 times 'un', followed by 'ium'
>>> 3 * 'un' + 'ium'
'unununium'
@end example

Two or more `string literals' (i.e. the ones enclosed between quotes) next
to each other are automatically concatenated.

@example
>>> 'Py' 'thon'
'Python'
@end example

This feature is particularly useful when you want to break long strings:

@example
>>> text = ('Put several strings within parentheses '
...         'to have them joined together.')
>>> text
'Put several strings within parentheses to have them joined together.'
@end example

This only works with two literals though, not with variables or expressions:

@example
>>> prefix = 'Py'
>>> prefix 'thon'  # can't concatenate a variable and a string literal
  File "<stdin>", line 1
    prefix 'thon'
           ^^^^^^
SyntaxError: invalid syntax
>>> ('un' * 3) 'ium'
  File "<stdin>", line 1
    ('un' * 3) 'ium'
               ^^^^^
SyntaxError: invalid syntax
@end example

If you want to concatenate variables or a variable and a literal, use @code{+}:

@example
>>> prefix + 'thon'
'Python'
@end example

Strings can be `indexed' (subscripted), with the first character having index 0.
There is no separate character type; a character is simply a string of size
one:

@example
>>> word = 'Python'
>>> word[0]  # character in position 0
'P'
>>> word[5]  # character in position 5
'n'
@end example

Indices may also be negative numbers, to start counting from the right:

@example
>>> word[-1]  # last character
'n'
>>> word[-2]  # second-last character
'o'
>>> word[-6]
'P'
@end example

Note that since -0 is the same as 0, negative indices start from -1.

In addition to indexing, `slicing' is also supported.  While indexing is used
to obtain individual characters, `slicing' allows you to obtain a substring:

@example
>>> word[0:2]  # characters from position 0 (included) to 2 (excluded)
'Py'
>>> word[2:5]  # characters from position 2 (included) to 5 (excluded)
'tho'
@end example

Slice indices have useful defaults; an omitted first index defaults to zero, an
omitted second index defaults to the size of the string being sliced.

@example
>>> word[:2]   # character from the beginning to position 2 (excluded)
'Py'
>>> word[4:]   # characters from position 4 (included) to the end
'on'
>>> word[-2:]  # characters from the second-last (included) to the end
'on'
@end example

Note how the start is always included, and the end always excluded.  This
makes sure that @code{s[:i] + s[i:]} is always equal to @code{s}:

@example
>>> word[:2] + word[2:]
'Python'
>>> word[:4] + word[4:]
'Python'
@end example

One way to remember how slices work is to think of the indices as pointing
`between' characters, with the left edge of the first character numbered 0.
Then the right edge of the last character of a string of `n' characters has
index `n', for example:

@example
 +---+---+---+---+---+---+
 | P | y | t | h | o | n |
 +---+---+---+---+---+---+
 0   1   2   3   4   5   6
-6  -5  -4  -3  -2  -1
@end example

The first row of numbers gives the position of the indices 0…6 in the string;
the second row gives the corresponding negative indices. The slice from `i' to
`j' consists of all characters between the edges labeled `i' and `j',
respectively.

For non-negative indices, the length of a slice is the difference of the
indices, if both are within bounds.  For example, the length of @code{word[1:3]} is
2.

Attempting to use an index that is too large will result in an error:

@example
>>> word[42]  # the word only has 6 characters
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: string index out of range
@end example

However, out of range slice indexes are handled gracefully when used for
slicing:

@example
>>> word[4:42]
'on'
>>> word[42:]
'@w{'}
@end example

Python strings cannot be changed — they are @ref{2022,,immutable}.
Therefore, assigning to an indexed position in the string results in an error:

@example
>>> word[0] = 'J'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
>>> word[2:] = 'py'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
@end example

If you need a different string, you should create a new one:

@example
>>> 'J' + word[1:]
'Jython'
>>> word[:2] + 'py'
'Pypy'
@end example

The built-in function @ref{841,,len()} returns the length of a string:

@example
>>> s = 'supercalifragilisticexpialidocious'
>>> len(s)
34
@end example


@subsubheading See also



@table @asis

@item @ref{2023,,Text Sequence Type — str}

Strings are examples of `sequence types', and support the common
operations supported by such types.

@item @ref{2024,,String Methods}

Strings support a large number of methods for
basic transformations and searching.

@item @ref{19b,,f-strings}

String literals that have embedded expressions.

@item @ref{15a7,,Format string syntax}

Information about string formatting with @ref{834,,str.format()}.

@item @ref{8dd,,printf-style String Formatting}

The old formatting operations invoked when strings are
the left operand of the @code{%} operator are described in more detail here.
@end table


@node Lists,,Text,Using Python as a Calculator
@anchor{tutorial/introduction lists}@anchor{2025}@anchor{tutorial/introduction tut-lists}@anchor{2026}
@subsubsection Lists


Python knows a number of `compound' data types, used to group together other
values.  The most versatile is the `list', which can be written as a list of
comma-separated values (items) between square brackets.  Lists might contain
items of different types, but usually the items all have the same type.

@example
>>> squares = [1, 4, 9, 16, 25]
>>> squares
[1, 4, 9, 16, 25]
@end example

Like strings (and all other built-in @ref{717,,sequence} types), lists can be
indexed and sliced:

@example
>>> squares[0]  # indexing returns the item
1
>>> squares[-1]
25
>>> squares[-3:]  # slicing returns a new list
[9, 16, 25]
@end example

Lists also support operations like concatenation:

@example
>>> squares + [36, 49, 64, 81, 100]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
@end example

Unlike strings, which are @ref{2022,,immutable}, lists are a @ref{2027,,mutable}
type, i.e. it is possible to change their content:

@example
>>> cubes = [1, 8, 27, 65, 125]  # something's wrong here
>>> 4 ** 3  # the cube of 4 is 64, not 65!
64
>>> cubes[3] = 64  # replace the wrong value
>>> cubes
[1, 8, 27, 64, 125]
@end example

You can also add new items at the end of the list, by using
the @ref{8de,,list.append()} `method' (we will see more about methods later):

@example
>>> cubes.append(216)  # add the cube of 6
>>> cubes.append(7 ** 3)  # and the cube of 7
>>> cubes
[1, 8, 27, 64, 125, 216, 343]
@end example

Simple assignment in Python never copies data. When you assign a list
to a variable, the variable refers to the `existing list'.
Any changes you make to the list through one variable will be seen
through all other variables that refer to it.:

@example
>>> rgb = ["Red", "Green", "Blue"]
>>> rgba = rgb
>>> id(rgb) == id(rgba)  # they reference the same object
True
>>> rgba.append("Alph")
>>> rgb
["Red", "Green", "Blue", "Alph"]
@end example

All slice operations return a new list containing the requested elements.  This
means that the following slice returns a
@ref{2028,,shallow copy} of the list:

@example
>>> correct_rgba = rgba[:]
>>> correct_rgba[-1] = "Alpha"
>>> correct_rgba
["Red", "Green", "Blue", "Alpha"]
>>> rgba
["Red", "Green", "Blue", "Alph"]
@end example

Assignment to slices is also possible, and this can even change the size of the
list or clear it entirely:

@example
>>> letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> letters
['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> # replace some values
>>> letters[2:5] = ['C', 'D', 'E']
>>> letters
['a', 'b', 'C', 'D', 'E', 'f', 'g']
>>> # now remove them
>>> letters[2:5] = []
>>> letters
['a', 'b', 'f', 'g']
>>> # clear the list by replacing all the elements with an empty list
>>> letters[:] = []
>>> letters
[]
@end example

The built-in function @ref{841,,len()} also applies to lists:

@example
>>> letters = ['a', 'b', 'c', 'd']
>>> len(letters)
4
@end example

It is possible to nest lists (create lists containing other lists), for
example:

@example
>>> a = ['a', 'b', 'c']
>>> n = [1, 2, 3]
>>> x = [a, n]
>>> x
[['a', 'b', 'c'], [1, 2, 3]]
>>> x[0]
['a', 'b', 'c']
>>> x[0][1]
'b'
@end example

@node First Steps Towards Programming,,Using Python as a Calculator,An Informal Introduction to Python
@anchor{tutorial/introduction first-steps-towards-programming}@anchor{2029}@anchor{tutorial/introduction tut-firststeps}@anchor{202a}
@subsection First Steps Towards Programming


Of course, we can use Python for more complicated tasks than adding two and two
together.  For instance, we can write an initial sub-sequence of the
Fibonacci series@footnote{https://en.wikipedia.org/wiki/Fibonacci_sequence}
as follows:

@example
>>> # Fibonacci series:
>>> # the sum of two elements defines the next
>>> a, b = 0, 1
>>> while a < 10:
...     print(a)
...     a, b = b, a+b
...
0
1
1
2
3
5
8
@end example

This example introduces several new features.


@itemize *

@item 
The first line contains a `multiple assignment': the variables @code{a} and @code{b}
simultaneously get the new values 0 and 1.  On the last line this is used again,
demonstrating that the expressions on the right-hand side are all evaluated
first before any of the assignments take place.  The right-hand side expressions
are evaluated  from the left to the right.

@item 
The @ref{19b7,,while} loop executes as long as the condition (here: @code{a < 10})
remains true.  In Python, like in C, any non-zero integer value is true; zero is
false.  The condition may also be a string or list value, in fact any sequence;
anything with a non-zero length is true, empty sequences are false.  The test
used in the example is a simple comparison.  The standard comparison operators
are written the same as in C: @code{<} (less than), @code{>} (greater than), @code{==}
(equal to), @code{<=} (less than or equal to), @code{>=} (greater than or equal to)
and @code{!=} (not equal to).

@item 
The `body' of the loop is `indented': indentation is Python’s way of grouping
statements.  At the interactive prompt, you have to type a tab or space(s) for
each indented line.  In practice you will prepare more complicated input
for Python with a text editor; all decent text editors have an auto-indent
facility.  When a compound statement is entered interactively, it must be
followed by a blank line to indicate completion (since the parser cannot
guess when you have typed the last line).  Note that each line within a basic
block must be indented by the same amount.

@item 
The @ref{117b,,print()} function writes the value of the argument(s) it is given.
It differs from just writing the expression you want to write (as we did
earlier in the calculator examples) in the way it handles multiple arguments,
floating-point quantities, and strings.  Strings are printed without quotes,
and a space is inserted between items, so you can format things nicely, like
this:

@example
>>> i = 256*256
>>> print('The value of i is', i)
The value of i is 65536
@end example

The keyword argument `end' can be used to avoid the newline after the output,
or end the output with a different string:

@example
>>> a, b = 0, 1
>>> while a < 1000:
...     print(a, end=',')
...     a, b = b, a+b
...
0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,
@end example
@end itemize

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node More Control Flow Tools,Data Structures,An Informal Introduction to Python,The Python Tutorial
@anchor{tutorial/controlflow doc}@anchor{202b}@anchor{tutorial/controlflow more-control-flow-tools}@anchor{202c}@anchor{tutorial/controlflow translation-repo}@anchor{202d}@anchor{tutorial/controlflow tut-morecontrol}@anchor{202e}
@section More Control Flow Tools


As well as the @ref{19b7,,while} statement just introduced, Python uses a few more
that we will encounter in this chapter.

@menu
* if Statements:: 
* for Statements:: 
* The range() Function: The range Function. 
* break and continue Statements:: 
* else Clauses on Loops:: 
* pass Statements:: 
* match Statements:: 
* Defining Functions:: 
* More on Defining Functions:: 
* Intermezzo; Coding Style: Intermezzo Coding Style. 

@end menu

@node if Statements,for Statements,,More Control Flow Tools
@anchor{tutorial/controlflow if-statements}@anchor{202f}@anchor{tutorial/controlflow tut-if}@anchor{2030}
@subsection @code{if} Statements


Perhaps the most well-known statement type is the @ref{182,,if} statement.  For
example:

@example
>>> x = int(input("Please enter an integer: "))
Please enter an integer: 42
>>> if x < 0:
...     x = 0
...     print('Negative changed to zero')
... elif x == 0:
...     print('Zero')
... elif x == 1:
...     print('Single')
... else:
...     print('More')
...
More
@end example

There can be zero or more @ref{17c,,elif} parts, and the @ref{17d,,else} part is
optional.  The keyword ‘@code{elif}’ is short for ‘else if’, and is useful
to avoid excessive indentation.  An  @code{if} … @code{elif} …
@code{elif} … sequence is a substitute for the @code{switch} or
@code{case} statements found in other languages.

If you’re comparing the same value to several constants, or checking for specific types or
attributes, you may also find the @code{match} statement useful. For more
details see @ref{2031,,match Statements}.

@node for Statements,The range Function,if Statements,More Control Flow Tools
@anchor{tutorial/controlflow for-statements}@anchor{2032}@anchor{tutorial/controlflow tut-for}@anchor{2033}
@subsection @code{for} Statements


@geindex statement; for

The @ref{348,,for} statement in Python differs a bit from what you may be used
to in C or Pascal.  Rather than always iterating over an arithmetic progression
of numbers (like in Pascal), or giving the user the ability to define both the
iteration step and halting condition (as C), Python’s @code{for} statement
iterates over the items of any sequence (a list or a string), in the order that
they appear in the sequence.  For example (no pun intended):

@c One suggestion was to give a real C example here, but that may only serve to
@c confuse non-C programmers.

@example
>>> # Measure some strings:
>>> words = ['cat', 'window', 'defenestrate']
>>> for w in words:
...     print(w, len(w))
...
cat 3
window 6
defenestrate 12
@end example

Code that modifies a collection while iterating over that same collection can
be tricky to get right.  Instead, it is usually more straight-forward to loop
over a copy of the collection or to create a new collection:

@example
# Create a sample collection
users = @{'Hans': 'active', 'Éléonore': 'inactive', '景太郎': 'active'@}

# Strategy:  Iterate over a copy
for user, status in users.copy().items():
    if status == 'inactive':
        del users[user]

# Strategy:  Create a new collection
active_users = @{@}
for user, status in users.items():
    if status == 'active':
        active_users[user] = status
@end example

@node The range Function,break and continue Statements,for Statements,More Control Flow Tools
@anchor{tutorial/controlflow the-range-function}@anchor{2034}@anchor{tutorial/controlflow tut-range}@anchor{2035}
@subsection The @code{range()} Function


If you do need to iterate over a sequence of numbers, the built-in function
@ref{b43,,range()} comes in handy.  It generates arithmetic progressions:

@example
>>> for i in range(5):
...     print(i)
...
0
1
2
3
4
@end example

The given end point is never part of the generated sequence; @code{range(10)} generates
10 values, the legal indices for items of a sequence of length 10.  It
is possible to let the range start at another number, or to specify a different
increment (even negative; sometimes this is called the ‘step’):

@example
>>> list(range(5, 10))
[5, 6, 7, 8, 9]

>>> list(range(0, 10, 3))
[0, 3, 6, 9]

>>> list(range(-10, -100, -30))
[-10, -40, -70]
@end example

To iterate over the indices of a sequence, you can combine @ref{b43,,range()} and
@ref{841,,len()} as follows:

@example
>>> a = ['Mary', 'had', 'a', 'little', 'lamb']
>>> for i in range(len(a)):
...     print(i, a[i])
...
0 Mary
1 had
2 a
3 little
4 lamb
@end example

In most such cases, however, it is convenient to use the @ref{168d,,enumerate()}
function, see @ref{2036,,Looping Techniques}.

A strange thing happens if you just print a range:

@example
>>> range(10)
range(0, 10)
@end example

In many ways the object returned by @ref{b43,,range()} behaves as if it is a list,
but in fact it isn’t. It is an object which returns the successive items of
the desired sequence when you iterate over it, but it doesn’t really make
the list, thus saving space.

We say such an object is @ref{1433,,iterable}, that is, suitable as a target for
functions and constructs that expect something from which they can
obtain successive items until the supply is exhausted.  We have seen that
the @ref{348,,for} statement is such a construct, while an example of a function
that takes an iterable is @ref{696,,sum()}:

@example
>>> sum(range(4))  # 0 + 1 + 2 + 3
6
@end example

Later we will see more functions that return iterables and take iterables as
arguments.  In chapter @ref{2037,,Data Structures}, we will discuss @ref{24f,,list()} in more
detail.

@node break and continue Statements,else Clauses on Loops,The range Function,More Control Flow Tools
@anchor{tutorial/controlflow break-and-continue-statements}@anchor{2038}@anchor{tutorial/controlflow tut-break}@anchor{2039}
@subsection @code{break} and @code{continue} Statements


The @ref{180,,break} statement breaks out of the innermost enclosing
@ref{348,,for} or @ref{19b7,,while} loop:

@example
>>> for n in range(2, 10):
...     for x in range(2, n):
...         if n % x == 0:
...             print(f"@{n@} equals @{x@} * @{n//x@}")
...             break
...
4 equals 2 * 2
6 equals 2 * 3
8 equals 2 * 4
9 equals 3 * 3
@end example

The @ref{181,,continue} statement continues with the next
iteration of the loop:

@example
>>> for num in range(2, 10):
...     if num % 2 == 0:
...         print(f"Found an even number @{num@}")
...         continue
...     print(f"Found an odd number @{num@}")
...
Found an even number 2
Found an odd number 3
Found an even number 4
Found an odd number 5
Found an even number 6
Found an odd number 7
Found an even number 8
Found an odd number 9
@end example
@anchor{tutorial/controlflow tut-for-else}@anchor{203a}
@node else Clauses on Loops,pass Statements,break and continue Statements,More Control Flow Tools
@anchor{tutorial/controlflow break-and-continue-statements-and-else-clauses-on-loops}@anchor{203b}@anchor{tutorial/controlflow else-clauses-on-loops}@anchor{203c}
@subsection @code{else} Clauses on Loops


In a @code{for} or @code{while} loop the @code{break} statement
may be paired with an @code{else} clause.  If the loop finishes without
executing the @code{break}, the @code{else} clause executes.

In a @ref{348,,for} loop, the @code{else} clause is executed
after the loop finishes its final iteration, that is, if no break occurred.

In a @ref{19b7,,while} loop, it’s executed after the loop’s condition becomes false.

In either kind of loop, the @code{else} clause is `not' executed if the
loop was terminated by a @ref{180,,break}.  Of course, other ways of ending the
loop early, such as a @ref{1b0,,return} or a raised exception, will also skip
execution of the @ref{17d,,else} clause.

This is exemplified in the following @code{for} loop,
which searches for prime numbers:

@example
>>> for n in range(2, 10):
...     for x in range(2, n):
...         if n % x == 0:
...             print(n, 'equals', x, '*', n//x)
...             break
...     else:
...         # loop fell through without finding a factor
...         print(n, 'is a prime number')
...
2 is a prime number
3 is a prime number
4 equals 2 * 2
5 is a prime number
6 equals 2 * 3
7 is a prime number
8 equals 2 * 4
9 equals 3 * 3
@end example

(Yes, this is the correct code.  Look closely: the @code{else} clause belongs to
the @code{for} loop, `not' the @code{if} statement.)

One way to think of the else clause is to imagine it paired with the @code{if}
inside the loop.  As the loop executes, it will run a sequence like
if/if/if/else. The @code{if} is inside the loop, encountered a number of times. If
the condition is ever true, a @code{break} will happen. If the condition is never
true, the @code{else} clause outside the loop will execute.

When used with a loop, the @code{else} clause has more in common with the @code{else}
clause of a @ref{8fa,,try} statement than it does with that of @code{if}
statements: a @code{try} statement’s @code{else} clause runs when no exception
occurs, and a loop’s @code{else} clause runs when no @code{break} occurs. For more on
the @code{try} statement and exceptions, see @ref{203d,,Handling Exceptions}.

@geindex ...; ellipsis literal

@node pass Statements,match Statements,else Clauses on Loops,More Control Flow Tools
@anchor{tutorial/controlflow pass-statements}@anchor{203e}@anchor{tutorial/controlflow tut-pass}@anchor{203f}
@subsection @code{pass} Statements


The @ref{17f,,pass} statement does nothing. It can be used when a statement is
required syntactically but the program requires no action. For example:

@example
>>> while True:
...     pass  # Busy-wait for keyboard interrupt (Ctrl+C)
...
@end example

This is commonly used for creating minimal classes:

@example
>>> class MyEmptyClass:
...     pass
...
@end example

Another place @ref{17f,,pass} can be used is as a place-holder for a function or
conditional body when you are working on new code, allowing you to keep thinking
at a more abstract level.  The @code{pass} is silently ignored:

@example
>>> def initlog(*args):
...     pass   # Remember to implement this!
...
@end example

For this last case, many people use the ellipsis literal @code{...} instead of
@code{pass}. This use has no special meaning to Python, and is not part of
the language definition (you could use any constant expression here), but
@code{...} is used conventionally as a placeholder body as well.
See @ref{2040,,The Ellipsis Object}.

@node match Statements,Defining Functions,pass Statements,More Control Flow Tools
@anchor{tutorial/controlflow match-statements}@anchor{2041}@anchor{tutorial/controlflow tut-match}@anchor{2031}
@subsection @code{match} Statements


A @ref{a14,,match} statement takes an expression and compares its value to successive
patterns given as one or more case blocks.  This is superficially
similar to a switch statement in C, Java or JavaScript (and many
other languages), but it’s more similar to pattern matching in
languages like Rust or Haskell. Only the first pattern that matches
gets executed and it can also extract components (sequence elements
or object attributes) from the value into variables. If no case matches,
none of the branches is executed.

The simplest form compares a subject value against one or more literals:

@example
def http_error(status):
    match status:
        case 400:
            return "Bad request"
        case 404:
            return "Not found"
        case 418:
            return "I'm a teapot"
        case _:
            return "Something's wrong with the internet"
@end example

Note the last block: the “variable name” @code{_} acts as a `wildcard' and
never fails to match.

You can combine several literals in a single pattern using @code{|} (“or”):

@example
case 401 | 403 | 404:
    return "Not allowed"
@end example

Patterns can look like unpacking assignments, and can be used to bind
variables:

@example
# point is an (x, y) tuple
match point:
    case (0, 0):
        print("Origin")
    case (0, y):
        print(f"Y=@{y@}")
    case (x, 0):
        print(f"X=@{x@}")
    case (x, y):
        print(f"X=@{x@}, Y=@{y@}")
    case _:
        raise ValueError("Not a point")
@end example

Study that one carefully!  The first pattern has two literals, and can
be thought of as an extension of the literal pattern shown above.  But
the next two patterns combine a literal and a variable, and the
variable `binds' a value from the subject (@code{point}).  The fourth
pattern captures two values, which makes it conceptually similar to
the unpacking assignment @code{(x, y) = point}.

If you are using classes to structure your data
you can use the class name followed by an argument list resembling a
constructor, but with the ability to capture attributes into variables:

@example
class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

def where_is(point):
    match point:
        case Point(x=0, y=0):
            print("Origin")
        case Point(x=0, y=y):
            print(f"Y=@{y@}")
        case Point(x=x, y=0):
            print(f"X=@{x@}")
        case Point():
            print("Somewhere else")
        case _:
            print("Not a point")
@end example

You can use positional parameters with some builtin classes that provide an
ordering for their attributes (e.g. dataclasses). You can also define a specific
position for attributes in patterns by setting the @code{__match_args__} special
attribute in your classes. If it’s set to (“x”, “y”), the following patterns are all
equivalent (and all bind the @code{y} attribute to the @code{var} variable):

@example
Point(1, var)
Point(1, y=var)
Point(x=1, y=var)
Point(y=var, x=1)
@end example

A recommended way to read patterns is to look at them as an extended form of what you
would put on the left of an assignment, to understand which variables would be set to
what.
Only the standalone names (like @code{var} above) are assigned to by a match statement.
Dotted names (like @code{foo.bar}), attribute names (the @code{x=} and @code{y=} above) or class names
(recognized by the “(…)” next to them like @code{Point} above) are never assigned to.

Patterns can be arbitrarily nested.  For example, if we have a short
list of Points, with @code{__match_args__} added, we could match it like this:

@example
class Point:
    __match_args__ = ('x', 'y')
    def __init__(self, x, y):
        self.x = x
        self.y = y

match points:
    case []:
        print("No points")
    case [Point(0, 0)]:
        print("The origin")
    case [Point(x, y)]:
        print(f"Single point @{x@}, @{y@}")
    case [Point(0, y1), Point(0, y2)]:
        print(f"Two on the Y axis at @{y1@}, @{y2@}")
    case _:
        print("Something else")
@end example

We can add an @code{if} clause to a pattern, known as a “guard”.  If the
guard is false, @code{match} goes on to try the next case block.  Note
that value capture happens before the guard is evaluated:

@example
match point:
    case Point(x, y) if x == y:
        print(f"Y=X at @{x@}")
    case Point(x, y):
        print(f"Not on the diagonal")
@end example

Several other key features of this statement:


@itemize -

@item 
Like unpacking assignments, tuple and list patterns have exactly the
same meaning and actually match arbitrary sequences.  An important
exception is that they don’t match iterators or strings.

@item 
Sequence patterns support extended unpacking: @code{[x, y, *rest]} and @code{(x, y,
*rest)} work similar to unpacking assignments.  The
name after @code{*} may also be @code{_}, so @code{(x, y, *_)} matches a sequence
of at least two items without binding the remaining items.

@item 
Mapping patterns: @code{@{"bandwidth": b, "latency": l@}} captures the
@code{"bandwidth"} and @code{"latency"} values from a dictionary.  Unlike sequence
patterns, extra keys are ignored.  An unpacking like @code{**rest} is also
supported.  (But @code{**_} would be redundant, so it is not allowed.)

@item 
Subpatterns may be captured using the @code{as} keyword:

@example
case (Point(x1, y1), Point(x2, y2) as p2): ...
@end example

will capture the second element of the input as @code{p2} (as long as the input is
a sequence of two points)

@item 
Most literals are compared by equality, however the singletons @code{True},
@code{False} and @code{None} are compared by identity.

@item 
Patterns may use named constants.  These must be dotted names
to prevent them from being interpreted as capture variables:

@example
from enum import Enum
class Color(Enum):
    RED = 'red'
    GREEN = 'green'
    BLUE = 'blue'

color = Color(input("Enter your choice of 'red', 'blue' or 'green': "))

match color:
    case Color.RED:
        print("I see red!")
    case Color.GREEN:
        print("Grass is green")
    case Color.BLUE:
        print("I'm feeling the blues :(")
@end example
@end itemize

For a more detailed explanation and additional examples, you can look into
@geindex Python Enhancement Proposals; PEP 636
PEP 636@footnote{https://peps.python.org/pep-0636/} which is written in a tutorial format.

@node Defining Functions,More on Defining Functions,match Statements,More Control Flow Tools
@anchor{tutorial/controlflow defining-functions}@anchor{2042}@anchor{tutorial/controlflow tut-functions}@anchor{2043}
@subsection Defining Functions


We can create a function that writes the Fibonacci series to an arbitrary
boundary:

@example
>>> def fib(n):    # write Fibonacci series less than n
...     """Print a Fibonacci series less than n."""
...     a, b = 0, 1
...     while a < n:
...         print(a, end=' ')
...         a, b = b, a+b
...     print()
...
>>> # Now call the function we just defined:
>>> fib(2000)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597
@end example

@geindex documentation strings
@geindex docstrings
@geindex strings@comma{} documentation

The keyword @ref{1666,,def} introduces a function `definition'.  It must be
followed by the function name and the parenthesized list of formal parameters.
The statements that form the body of the function start at the next line, and
must be indented.

The first statement of the function body can optionally be a string literal;
this string literal is the function’s documentation string, or `docstring'.
(More about docstrings can be found in the section @ref{2044,,Documentation Strings}.)
There are tools which use docstrings to automatically produce online or printed
documentation, or to let the user interactively browse through code; it’s good
practice to include docstrings in code that you write, so make a habit of it.

The `execution' of a function introduces a new symbol table used for the local
variables of the function.  More precisely, all variable assignments in a
function store the value in the local symbol table; whereas variable references
first look in the local symbol table, then in the local symbol tables of
enclosing functions, then in the global symbol table, and finally in the table
of built-in names. Thus, global variables and variables of enclosing functions
cannot be directly assigned a value within a function (unless, for global
variables, named in a @ref{4ad,,global} statement, or, for variables of enclosing
functions, named in a @ref{14b3,,nonlocal} statement), although they may be
referenced.

The actual parameters (arguments) to a function call are introduced in the local
symbol table of the called function when it is called; thus, arguments are
passed using `call by value' (where the `value' is always an object `reference',
not the value of the object). @footnote{
Actually, `call by object reference' would be a better description,
since if a mutable object is passed, the caller will see any changes the
callee makes to it (items inserted into a list).
} When a function calls another function,
or calls itself recursively, a new
local symbol table is created for that call.

A function definition associates the function name with the function object in
the current symbol table.  The interpreter recognizes the object pointed to by
that name as a user-defined function.  Other names can also point to that same
function object and can also be used to access the function:

@example
>>> fib
<function fib at 10042ed0>
>>> f = fib
>>> f(100)
0 1 1 2 3 5 8 13 21 34 55 89
@end example

Coming from other languages, you might object that @code{fib} is not a function but
a procedure since it doesn’t return a value.  In fact, even functions without a
@ref{1b0,,return} statement do return a value, albeit a rather boring one.  This
value is called @code{None} (it’s a built-in name).  Writing the value @code{None} is
normally suppressed by the interpreter if it would be the only value written.
You can see it if you really want to using @ref{117b,,print()}:

@example
>>> fib(0)
>>> print(fib(0))
None
@end example

It is simple to write a function that returns a list of the numbers of the
Fibonacci series, instead of printing it:

@example
>>> def fib2(n):  # return Fibonacci series up to n
...     """Return a list containing the Fibonacci series up to n."""
...     result = []
...     a, b = 0, 1
...     while a < n:
...         result.append(a)    # see below
...         a, b = b, a+b
...     return result
...
>>> f100 = fib2(100)    # call it
>>> f100                # write the result
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
@end example

This example, as usual, demonstrates some new Python features:


@itemize *

@item 
The @ref{1b0,,return} statement returns with a value from a function.
@code{return} without an expression argument returns @code{None}. Falling off
the end of a function also returns @code{None}.

@item 
The statement @code{result.append(a)} calls a `method' of the list object
@code{result}.  A method is a function that ‘belongs’ to an object and is named
@code{obj.methodname}, where @code{obj} is some object (this may be an expression),
and @code{methodname} is the name of a method that is defined by the object’s type.
Different types define different methods.  Methods of different types may have
the same name without causing ambiguity.  (It is possible to define your own
object types and methods, using `classes', see @ref{2045,,Classes})
The method @ref{8de,,append()} shown in the example is defined for list objects; it
adds a new element at the end of the list.  In this example it is equivalent to
@code{result = result + [a]}, but more efficient.
@end itemize

@node More on Defining Functions,Intermezzo Coding Style,Defining Functions,More Control Flow Tools
@anchor{tutorial/controlflow more-on-defining-functions}@anchor{2046}@anchor{tutorial/controlflow tut-defining}@anchor{2047}
@subsection More on Defining Functions


It is also possible to define functions with a variable number of arguments.
There are three forms, which can be combined.

@menu
* Default Argument Values:: 
* Keyword Arguments:: 
* Special parameters:: 
* Arbitrary Argument Lists:: 
* Unpacking Argument Lists:: 
* Lambda Expressions:: 
* Documentation Strings:: 
* Function Annotations:: 

@end menu

@node Default Argument Values,Keyword Arguments,,More on Defining Functions
@anchor{tutorial/controlflow default-argument-values}@anchor{2048}@anchor{tutorial/controlflow tut-defaultargs}@anchor{2049}
@subsubsection Default Argument Values


The most useful form is to specify a default value for one or more arguments.
This creates a function that can be called with fewer arguments than it is
defined to allow.  For example:

@example
def ask_ok(prompt, retries=4, reminder='Please try again!'):
    while True:
        reply = input(prompt)
        if reply in @{'y', 'ye', 'yes'@}:
            return True
        if reply in @{'n', 'no', 'nop', 'nope'@}:
            return False
        retries = retries - 1
        if retries < 0:
            raise ValueError('invalid user response')
        print(reminder)
@end example

This function can be called in several ways:


@itemize *

@item 
giving only the mandatory argument:
@code{ask_ok('Do you really want to quit?')}

@item 
giving one of the optional arguments:
@code{ask_ok('OK to overwrite the file?', 2)}

@item 
or even giving all arguments:
@code{ask_ok('OK to overwrite the file?', 2, 'Come on, only yes or no!')}
@end itemize

This example also introduces the @ref{349,,in} keyword. This tests whether or
not a sequence contains a certain value.

The default values are evaluated at the point of function definition in the
`defining' scope, so that

@example
i = 5

def f(arg=i):
    print(arg)

i = 6
f()
@end example

will print @code{5}.

`Important warning:'  The default value is evaluated only once. This makes a
difference when the default is a mutable object such as a list, dictionary, or
instances of most classes.  For example, the following function accumulates the
arguments passed to it on subsequent calls:

@example
def f(a, L=[]):
    L.append(a)
    return L

print(f(1))
print(f(2))
print(f(3))
@end example

This will print

@example
[1]
[1, 2]
[1, 2, 3]
@end example

If you don’t want the default to be shared between subsequent calls, you can
write the function like this instead:

@example
def f(a, L=None):
    if L is None:
        L = []
    L.append(a)
    return L
@end example

@node Keyword Arguments,Special parameters,Default Argument Values,More on Defining Functions
@anchor{tutorial/controlflow keyword-arguments}@anchor{204a}@anchor{tutorial/controlflow tut-keywordargs}@anchor{204b}
@subsubsection Keyword Arguments


Functions can also be called using @ref{f14,,keyword arguments}
of the form @code{kwarg=value}.  For instance, the following function:

@example
def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'):
    print("-- This parrot wouldn't", action, end=' ')
    print("if you put", voltage, "volts through it.")
    print("-- Lovely plumage, the", type)
    print("-- It's", state, "!")
@end example

accepts one required argument (@code{voltage}) and three optional arguments
(@code{state}, @code{action}, and @code{type}).  This function can be called in any
of the following ways:

@example
parrot(1000)                                          # 1 positional argument
parrot(voltage=1000)                                  # 1 keyword argument
parrot(voltage=1000000, action='VOOOOOM')             # 2 keyword arguments
parrot(action='VOOOOOM', voltage=1000000)             # 2 keyword arguments
parrot('a million', 'bereft of life', 'jump')         # 3 positional arguments
parrot('a thousand', state='pushing up the daisies')  # 1 positional, 1 keyword
@end example

but all the following calls would be invalid:

@example
parrot()                     # required argument missing
parrot(voltage=5.0, 'dead')  # non-keyword argument after a keyword argument
parrot(110, voltage=220)     # duplicate value for the same argument
parrot(actor='John Cleese')  # unknown keyword argument
@end example

In a function call, keyword arguments must follow positional arguments.
All the keyword arguments passed must match one of the arguments
accepted by the function (e.g. @code{actor} is not a valid argument for the
@code{parrot} function), and their order is not important.  This also includes
non-optional arguments (e.g. @code{parrot(voltage=1000)} is valid too).
No argument may receive a value more than once.
Here’s an example that fails due to this restriction:

@example
>>> def function(a):
...     pass
...
>>> function(0, a=0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: function() got multiple values for argument 'a'
@end example

When a final formal parameter of the form @code{**name} is present, it receives a
dictionary (see @ref{cc3,,Mapping Types — dict}) containing all keyword arguments except for
those corresponding to a formal parameter.  This may be combined with a formal
parameter of the form @code{*name} (described in the next subsection) which
receives a @ref{204c,,tuple} containing the positional
arguments beyond the formal parameter list.  (@code{*name} must occur
before @code{**name}.) For example, if we define a function like this:

@example
def cheeseshop(kind, *arguments, **keywords):
    print("-- Do you have any", kind, "?")
    print("-- I'm sorry, we're all out of", kind)
    for arg in arguments:
        print(arg)
    print("-" * 40)
    for kw in keywords:
        print(kw, ":", keywords[kw])
@end example

It could be called like this:

@example
cheeseshop("Limburger", "It's very runny, sir.",
           "It's really very, VERY runny, sir.",
           shopkeeper="Michael Palin",
           client="John Cleese",
           sketch="Cheese Shop Sketch")
@end example

and of course it would print:

@example
-- Do you have any Limburger ?
-- I'm sorry, we're all out of Limburger
It's very runny, sir.
It's really very, VERY runny, sir.
----------------------------------------
shopkeeper : Michael Palin
client : John Cleese
sketch : Cheese Shop Sketch
@end example

Note that the order in which the keyword arguments are printed is guaranteed
to match the order in which they were provided in the function call.

@node Special parameters,Arbitrary Argument Lists,Keyword Arguments,More on Defining Functions
@anchor{tutorial/controlflow special-parameters}@anchor{204d}
@subsubsection Special parameters


By default, arguments may be passed to a Python function either by position
or explicitly by keyword. For readability and performance, it makes sense to
restrict the way arguments can be passed so that a developer need only look
at the function definition to determine if items are passed by position, by
position or keyword, or by keyword.

A function definition may look like:

@example
def f(pos1, pos2, /, pos_or_kwd, *, kwd1, kwd2):
      -----------    ----------     ----------
        |             |                  |
        |        Positional or keyword   |
        |                                - Keyword only
         -- Positional only
@end example

where @code{/} and @code{*} are optional. If used, these symbols indicate the kind of
parameter by how the arguments may be passed to the function:
positional-only, positional-or-keyword, and keyword-only. Keyword parameters
are also referred to as named parameters.

@menu
* Positional-or-Keyword Arguments:: 
* Positional-Only Parameters:: 
* Keyword-Only Arguments:: 
* Function Examples:: 
* Recap:: 

@end menu

@node Positional-or-Keyword Arguments,Positional-Only Parameters,,Special parameters
@anchor{tutorial/controlflow positional-or-keyword-arguments}@anchor{204e}
@subsubsection Positional-or-Keyword Arguments


If @code{/} and @code{*} are not present in the function definition, arguments may
be passed to a function by position or by keyword.

@node Positional-Only Parameters,Keyword-Only Arguments,Positional-or-Keyword Arguments,Special parameters
@anchor{tutorial/controlflow positional-only-parameters}@anchor{204f}
@subsubsection Positional-Only Parameters


Looking at this in a bit more detail, it is possible to mark certain parameters
as `positional-only'. If `positional-only', the parameters’ order matters, and
the parameters cannot be passed by keyword. Positional-only parameters are
placed before a @code{/} (forward-slash). The @code{/} is used to logically
separate the positional-only parameters from the rest of the parameters.
If there is no @code{/} in the function definition, there are no positional-only
parameters.

Parameters following the @code{/} may be `positional-or-keyword' or `keyword-only'.

@node Keyword-Only Arguments,Function Examples,Positional-Only Parameters,Special parameters
@anchor{tutorial/controlflow keyword-only-arguments}@anchor{2050}
@subsubsection Keyword-Only Arguments


To mark parameters as `keyword-only', indicating the parameters must be passed
by keyword argument, place an @code{*} in the arguments list just before the first
`keyword-only' parameter.

@node Function Examples,Recap,Keyword-Only Arguments,Special parameters
@anchor{tutorial/controlflow function-examples}@anchor{2051}
@subsubsection Function Examples


Consider the following example function definitions paying close attention to the
markers @code{/} and @code{*}:

@example
>>> def standard_arg(arg):
...     print(arg)
...
>>> def pos_only_arg(arg, /):
...     print(arg)
...
>>> def kwd_only_arg(*, arg):
...     print(arg)
...
>>> def combined_example(pos_only, /, standard, *, kwd_only):
...     print(pos_only, standard, kwd_only)
@end example

The first function definition, @code{standard_arg}, the most familiar form,
places no restrictions on the calling convention and arguments may be
passed by position or keyword:

@example
>>> standard_arg(2)
2

>>> standard_arg(arg=2)
2
@end example

The second function @code{pos_only_arg} is restricted to only use positional
parameters as there is a @code{/} in the function definition:

@example
>>> pos_only_arg(1)
1

>>> pos_only_arg(arg=1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: pos_only_arg() got some positional-only arguments passed as keyword arguments: 'arg'
@end example

The third function @code{kwd_only_arg} only allows keyword arguments as indicated
by a @code{*} in the function definition:

@example
>>> kwd_only_arg(3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: kwd_only_arg() takes 0 positional arguments but 1 was given

>>> kwd_only_arg(arg=3)
3
@end example

And the last uses all three calling conventions in the same function
definition:

@example
>>> combined_example(1, 2, 3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: combined_example() takes 2 positional arguments but 3 were given

>>> combined_example(1, 2, kwd_only=3)
1 2 3

>>> combined_example(1, standard=2, kwd_only=3)
1 2 3

>>> combined_example(pos_only=1, standard=2, kwd_only=3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: combined_example() got some positional-only arguments passed as keyword arguments: 'pos_only'
@end example

Finally, consider this function definition which has a potential collision between the positional argument @code{name}  and @code{**kwds} which has @code{name} as a key:

@example
def foo(name, **kwds):
    return 'name' in kwds
@end example

There is no possible call that will make it return @code{True} as the keyword @code{'name'}
will always bind to the first parameter. For example:

@example
>>> foo(1, **@{'name': 2@})
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: foo() got multiple values for argument 'name'
>>>
@end example

But using @code{/} (positional only arguments), it is possible since it allows @code{name} as a positional argument and @code{'name'} as a key in the keyword arguments:

@example
>>> def foo(name, /, **kwds):
...     return 'name' in kwds
...
>>> foo(1, **@{'name': 2@})
True
@end example

In other words, the names of positional-only parameters can be used in
@code{**kwds} without ambiguity.

@node Recap,,Function Examples,Special parameters
@anchor{tutorial/controlflow recap}@anchor{2052}
@subsubsection Recap


The use case will determine which parameters to use in the function definition:

@example
def f(pos1, pos2, /, pos_or_kwd, *, kwd1, kwd2):
@end example

As guidance:


@itemize *

@item 
Use positional-only if you want the name of the parameters to not be
available to the user. This is useful when parameter names have no real
meaning, if you want to enforce the order of the arguments when the function
is called or if you need to take some positional parameters and arbitrary
keywords.

@item 
Use keyword-only when names have meaning and the function definition is
more understandable by being explicit with names or you want to prevent
users relying on the position of the argument being passed.

@item 
For an API, use positional-only to prevent breaking API changes
if the parameter’s name is modified in the future.
@end itemize

@node Arbitrary Argument Lists,Unpacking Argument Lists,Special parameters,More on Defining Functions
@anchor{tutorial/controlflow arbitrary-argument-lists}@anchor{2053}@anchor{tutorial/controlflow tut-arbitraryargs}@anchor{2054}
@subsubsection Arbitrary Argument Lists


@geindex * (asterisk); in function calls

Finally, the least frequently used option is to specify that a function can be
called with an arbitrary number of arguments.  These arguments will be wrapped
up in a tuple (see @ref{204c,,Tuples and Sequences}).  Before the variable number of arguments,
zero or more normal arguments may occur.

@example
def write_multiple_items(file, separator, *args):
    file.write(separator.join(args))
@end example

Normally, these `variadic' arguments will be last in the list of formal
parameters, because they scoop up all remaining input arguments that are
passed to the function. Any formal parameters which occur after the @code{*args}
parameter are ‘keyword-only’ arguments, meaning that they can only be used as
keywords rather than positional arguments.

@example
>>> def concat(*args, sep="/"):
...     return sep.join(args)
...
>>> concat("earth", "mars", "venus")
'earth/mars/venus'
>>> concat("earth", "mars", "venus", sep=".")
'earth.mars.venus'
@end example

@node Unpacking Argument Lists,Lambda Expressions,Arbitrary Argument Lists,More on Defining Functions
@anchor{tutorial/controlflow tut-unpacking-arguments}@anchor{2055}@anchor{tutorial/controlflow unpacking-argument-lists}@anchor{2056}
@subsubsection Unpacking Argument Lists


The reverse situation occurs when the arguments are already in a list or tuple
but need to be unpacked for a function call requiring separate positional
arguments.  For instance, the built-in @ref{b43,,range()} function expects separate
`start' and `stop' arguments.  If they are not available separately, write the
function call with the  @code{*}-operator to unpack the arguments out of a list
or tuple:

@example
>>> list(range(3, 6))            # normal call with separate arguments
[3, 4, 5]
>>> args = [3, 6]
>>> list(range(*args))            # call with arguments unpacked from a list
[3, 4, 5]
@end example

@geindex **; in function calls

In the same fashion, dictionaries can deliver keyword arguments with the
@code{**}-operator:

@example
>>> def parrot(voltage, state='a stiff', action='voom'):
...     print("-- This parrot wouldn't", action, end=' ')
...     print("if you put", voltage, "volts through it.", end=' ')
...     print("E's", state, "!")
...
>>> d = @{"voltage": "four million", "state": "bleedin' demised", "action": "VOOM"@}
>>> parrot(**d)
-- This parrot wouldn't VOOM if you put four million volts through it. E's bleedin' demised !
@end example

@node Lambda Expressions,Documentation Strings,Unpacking Argument Lists,More on Defining Functions
@anchor{tutorial/controlflow lambda-expressions}@anchor{2057}@anchor{tutorial/controlflow tut-lambda}@anchor{2058}
@subsubsection Lambda Expressions


Small anonymous functions can be created with the @ref{14a9,,lambda} keyword.
This function returns the sum of its two arguments: @code{lambda a, b: a+b}.
Lambda functions can be used wherever function objects are required.  They are
syntactically restricted to a single expression.  Semantically, they are just
syntactic sugar for a normal function definition.  Like nested function
definitions, lambda functions can reference variables from the containing
scope:

@example
>>> def make_incrementor(n):
...     return lambda x: x + n
...
>>> f = make_incrementor(42)
>>> f(0)
42
>>> f(1)
43
@end example

The above example uses a lambda expression to return a function.  Another use
is to pass a small function as an argument.  For instance, @ref{dce,,list.sort()}
takes a sorting key function `key' which can be a lambda function:

@example
>>> pairs = [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')]
>>> pairs.sort(key=lambda pair: pair[1])
>>> pairs
[(4, 'four'), (1, 'one'), (3, 'three'), (2, 'two')]
@end example

@node Documentation Strings,Function Annotations,Lambda Expressions,More on Defining Functions
@anchor{tutorial/controlflow documentation-strings}@anchor{2059}@anchor{tutorial/controlflow tut-docstrings}@anchor{2044}
@subsubsection Documentation Strings


@geindex docstrings
@geindex documentation strings
@geindex strings@comma{} documentation

Here are some conventions about the content and formatting of documentation
strings.

The first line should always be a short, concise summary of the object’s
purpose.  For brevity, it should not explicitly state the object’s name or type,
since these are available by other means (except if the name happens to be a
verb describing a function’s operation).  This line should begin with a capital
letter and end with a period.

If there are more lines in the documentation string, the second line should be
blank, visually separating the summary from the rest of the description.  The
following lines should be one or more paragraphs describing the object’s calling
conventions, its side effects, etc.

The Python parser strips indentation from multi-line string literals when they
serve as module, class, or function docstrings.

Here is an example of a multi-line docstring:

@example
>>> def my_function():
...     """Do nothing, but document it.
...
...     No, really, it doesn't do anything:
...
...         >>> my_function()
...         >>>
...     """
...     pass
...
>>> print(my_function.__doc__)
Do nothing, but document it.

No, really, it doesn't do anything:

    >>> my_function()
    >>>
@end example

@node Function Annotations,,Documentation Strings,More on Defining Functions
@anchor{tutorial/controlflow function-annotations}@anchor{205a}@anchor{tutorial/controlflow tut-annotations}@anchor{205b}
@subsubsection Function Annotations


@geindex function; annotations
@geindex ->; function annotations
@geindex ; (colon); function annotations

@ref{205c,,Function annotations} are completely optional metadata
information about the types used by user-defined functions (see 
@geindex Python Enhancement Proposals; PEP 3107
PEP 3107@footnote{https://peps.python.org/pep-3107/} and
@geindex Python Enhancement Proposals; PEP 484
PEP 484@footnote{https://peps.python.org/pep-0484/} for more information).

@ref{205d,,Annotations} are stored in the @ref{456,,__annotations__}
attribute of the function as a dictionary and have no effect on any other part of the
function.  Parameter annotations are defined by a colon after the parameter name, followed
by an expression evaluating to the value of the annotation.  Return annotations are
defined by a literal @code{->}, followed by an expression, between the parameter
list and the colon denoting the end of the @ref{1666,,def} statement.  The
following example has a required argument, an optional argument, and the return
value annotated:

@example
>>> def f(ham: str, eggs: str = 'eggs') -> str:
...     print("Annotations:", f.__annotations__)
...     print("Arguments:", ham, eggs)
...     return ham + ' and ' + eggs
...
>>> f('spam')
Annotations: @{'ham': <class 'str'>, 'return': <class 'str'>, 'eggs': <class 'str'>@}
Arguments: spam eggs
'spam and eggs'
@end example

@node Intermezzo Coding Style,,More on Defining Functions,More Control Flow Tools
@anchor{tutorial/controlflow intermezzo-coding-style}@anchor{205e}@anchor{tutorial/controlflow tut-codingstyle}@anchor{205f}
@subsection Intermezzo: Coding Style


@geindex coding; style

Now that you are about to write longer, more complex pieces of Python, it is a
good time to talk about `coding style'.  Most languages can be written (or more
concisely, `formatted') in different styles; some are more readable than others.
Making it easy for others to read your code is always a good idea, and adopting
a nice coding style helps tremendously for that.

For Python, 
@geindex Python Enhancement Proposals; PEP 8
PEP 8@footnote{https://peps.python.org/pep-0008/} has emerged as the style guide that most projects adhere to;
it promotes a very readable and eye-pleasing coding style.  Every Python
developer should read it at some point; here are the most important points
extracted for you:


@itemize *

@item 
Use 4-space indentation, and no tabs.

4 spaces are a good compromise between small indentation (allows greater
nesting depth) and large indentation (easier to read).  Tabs introduce
confusion, and are best left out.

@item 
Wrap lines so that they don’t exceed 79 characters.

This helps users with small displays and makes it possible to have several
code files side-by-side on larger displays.

@item 
Use blank lines to separate functions and classes, and larger blocks of
code inside functions.

@item 
When possible, put comments on a line of their own.

@item 
Use docstrings.

@item 
Use spaces around operators and after commas, but not directly inside
bracketing constructs: @code{a = f(1, 2) + g(3, 4)}.

@item 
Name your classes and functions consistently; the convention is to use
@code{UpperCamelCase} for classes and @code{lowercase_with_underscores} for functions
and methods.  Always use @code{self} as the name for the first method argument
(see @ref{2060,,A First Look at Classes} for more on classes and methods).

@item 
Don’t use fancy encodings if your code is meant to be used in international
environments.  Python’s default, UTF-8, or even plain ASCII work best in any
case.

@item 
Likewise, don’t use non-ASCII characters in identifiers if there is only the
slightest chance people speaking a different language will read or maintain
the code.
@end itemize

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Data Structures,Modules<2>,More Control Flow Tools,The Python Tutorial
@anchor{tutorial/datastructures doc}@anchor{2061}@anchor{tutorial/datastructures data-structures}@anchor{2062}@anchor{tutorial/datastructures translation-repo}@anchor{2063}@anchor{tutorial/datastructures tut-structures}@anchor{2037}
@section Data Structures


This chapter describes some things you’ve learned about already in more detail,
and adds some new things as well.

@menu
* More on Lists:: 
* The del statement:: 
* Tuples and Sequences:: 
* Sets:: 
* Dictionaries:: 
* Looping Techniques:: 
* More on Conditions:: 
* Comparing Sequences and Other Types:: 

@end menu

@node More on Lists,The del statement,,Data Structures
@anchor{tutorial/datastructures more-on-lists}@anchor{2064}@anchor{tutorial/datastructures tut-morelists}@anchor{2065}
@subsection More on Lists


The @ref{2066,,list} data type has some more methods. Here are all
of the methods of list objects:


@deffn {Method} list.append (value, /)

Add an item to the end of the list.  Similar to @code{a[len(a):] = [x]}.
@end deffn


@deffn {Method} list.extend (iterable, /)

Extend the list by appending all the items from the iterable.  Similar to
@code{a[len(a):] = iterable}.
@end deffn


@deffn {Method} list.insert (index, value, /)

Insert an item at a given position.  The first argument is the index of the
element before which to insert, so @code{a.insert(0, x)} inserts at the front of
the list, and @code{a.insert(len(a), x)} is equivalent to @code{a.append(x)}.
@end deffn


@deffn {Method} list.remove (value, /)

Remove the first item from the list whose value is equal to `value'.  It raises a
@ref{2ee,,ValueError} if there is no such item.
@end deffn


@deffn {Method} list.pop (index=-1, /)

Remove the item at the given position in the list, and return it.  If no index
is specified, @code{a.pop()} removes and returns the last item in the list.
It raises an @ref{1741,,IndexError} if the list is empty or the index is
outside the list range.
@end deffn


@deffn {Method} list.clear ()

Remove all items from the list.  Similar to @code{del a[:]}.
@end deffn


@deffn {Method} list.index (value[, start[, stop]])

Return zero-based index of the first occurrence of `value' in the list.
Raises a @ref{2ee,,ValueError} if there is no such item.

The optional arguments `start' and `end' are interpreted as in the slice
notation and are used to limit the search to a particular subsequence of
the list.  The returned index is computed relative to the beginning of the full
sequence rather than the `start' argument.
@end deffn


@deffn {Method} list.count (value, /)

Return the number of times `value' appears in the list.
@end deffn


@deffn {Method} list.sort (*, key=None, reverse=False)

Sort the items of the list in place (the arguments can be used for sort
customization, see @ref{dcd,,sorted()} for their explanation).
@end deffn


@deffn {Method} list.reverse ()

Reverse the elements of the list in place.
@end deffn


@deffn {Method} list.copy ()

Return a shallow copy of the list.  Similar to @code{a[:]}.
@end deffn

An example that uses most of the list methods:

@example
>>> fruits = ['orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana']
>>> fruits.count('apple')
2
>>> fruits.count('tangerine')
0
>>> fruits.index('banana')
3
>>> fruits.index('banana', 4)  # Find next banana starting at position 4
6
>>> fruits.reverse()
>>> fruits
['banana', 'apple', 'kiwi', 'banana', 'pear', 'apple', 'orange']
>>> fruits.append('grape')
>>> fruits
['banana', 'apple', 'kiwi', 'banana', 'pear', 'apple', 'orange', 'grape']
>>> fruits.sort()
>>> fruits
['apple', 'apple', 'banana', 'banana', 'grape', 'kiwi', 'orange', 'pear']
>>> fruits.pop()
'pear'
@end example

You might have noticed that methods like @code{insert}, @code{remove} or @code{sort} that
only modify the list have no return value printed – they return the default
@code{None}. @footnote{
Other languages may return the mutated object, which allows method
chaining, such as @code{d->insert("a")->remove("b")->sort();}.
}  This is a design principle for all mutable data structures in
Python.

Another thing you might notice is that not all data can be sorted or
compared.  For instance, @code{[None, 'hello', 10]} doesn’t sort because
integers can’t be compared to strings and @code{None} can’t be compared to
other types.  Also, there are some types that don’t have a defined
ordering relation.  For example, @code{3+4j < 5+7j} isn’t a valid
comparison.

@menu
* Using Lists as Stacks:: 
* Using Lists as Queues:: 
* List Comprehensions: List Comprehensions<2>. 
* Nested List Comprehensions:: 

@end menu

@node Using Lists as Stacks,Using Lists as Queues,,More on Lists
@anchor{tutorial/datastructures tut-lists-as-stacks}@anchor{2067}@anchor{tutorial/datastructures using-lists-as-stacks}@anchor{2068}
@subsubsection Using Lists as Stacks


The list methods make it very easy to use a list as a stack, where the last
element added is the first element retrieved (“last-in, first-out”).  To add an
item to the top of the stack, use @ref{8de,,append()}.  To retrieve an item from the
top of the stack, use @ref{2069,,pop()} without an explicit index.  For example:

@example
>>> stack = [3, 4, 5]
>>> stack.append(6)
>>> stack.append(7)
>>> stack
[3, 4, 5, 6, 7]
>>> stack.pop()
7
>>> stack
[3, 4, 5, 6]
>>> stack.pop()
6
>>> stack.pop()
5
>>> stack
[3, 4]
@end example

@node Using Lists as Queues,List Comprehensions<2>,Using Lists as Stacks,More on Lists
@anchor{tutorial/datastructures tut-lists-as-queues}@anchor{206a}@anchor{tutorial/datastructures using-lists-as-queues}@anchor{206b}
@subsubsection Using Lists as Queues


It is also possible to use a list as a queue, where the first element added is
the first element retrieved (“first-in, first-out”); however, lists are not
efficient for this purpose.  While appends and pops from the end of list are
fast, doing inserts or pops from the beginning of a list is slow (because all
of the other elements have to be shifted by one).

To implement a queue, use @ref{7f5,,collections.deque} which was designed to
have fast appends and pops from both ends.  For example:

@example
>>> from collections import deque
>>> queue = deque(["Eric", "John", "Michael"])
>>> queue.append("Terry")           # Terry arrives
>>> queue.append("Graham")          # Graham arrives
>>> queue.popleft()                 # The first to arrive now leaves
'Eric'
>>> queue.popleft()                 # The second to arrive now leaves
'John'
>>> queue                           # Remaining queue in order of arrival
deque(['Michael', 'Terry', 'Graham'])
@end example

@node List Comprehensions<2>,Nested List Comprehensions,Using Lists as Queues,More on Lists
@anchor{tutorial/datastructures list-comprehensions}@anchor{206c}@anchor{tutorial/datastructures tut-listcomps}@anchor{206d}
@subsubsection List Comprehensions


List comprehensions provide a concise way to create lists.
Common applications are to make new lists where each element is the result of
some operations applied to each member of another sequence or iterable, or to
create a subsequence of those elements that satisfy a certain condition.

For example, assume we want to create a list of squares, like:

@example
>>> squares = []
>>> for x in range(10):
...     squares.append(x**2)
...
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
@end example

Note that this creates (or overwrites) a variable named @code{x} that still exists
after the loop completes.  We can calculate the list of squares without any
side effects using:

@example
squares = list(map(lambda x: x**2, range(10)))
@end example

or, equivalently:

@example
squares = [x**2 for x in range(10)]
@end example

which is more concise and readable.

A list comprehension consists of brackets containing an expression followed
by a @code{for} clause, then zero or more @code{for} or @code{if}
clauses.  The result will be a new list resulting from evaluating the expression
in the context of the @code{for} and @code{if} clauses which follow it.
For example, this listcomp combines the elements of two lists if they are not
equal:

@example
>>> [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
@end example

and it’s equivalent to:

@example
>>> combs = []
>>> for x in [1,2,3]:
...     for y in [3,1,4]:
...         if x != y:
...             combs.append((x, y))
...
>>> combs
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
@end example

Note how the order of the @ref{348,,for} and @ref{182,,if} statements is the
same in both these snippets.

If the expression is a tuple (e.g. the @code{(x, y)} in the previous example),
it must be parenthesized.

@example
>>> vec = [-4, -2, 0, 2, 4]
>>> # create a new list with the values doubled
>>> [x*2 for x in vec]
[-8, -4, 0, 4, 8]
>>> # filter the list to exclude negative numbers
>>> [x for x in vec if x >= 0]
[0, 2, 4]
>>> # apply a function to all the elements
>>> [abs(x) for x in vec]
[4, 2, 0, 2, 4]
>>> # call a method on each element
>>> freshfruit = ['  banana', '  loganberry ', 'passion fruit  ']
>>> [weapon.strip() for weapon in freshfruit]
['banana', 'loganberry', 'passion fruit']
>>> # create a list of 2-tuples like (number, square)
>>> [(x, x**2) for x in range(6)]
[(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25)]
>>> # the tuple must be parenthesized, otherwise an error is raised
>>> [x, x**2 for x in range(6)]
  File "<stdin>", line 1
    [x, x**2 for x in range(6)]
     ^^^^^^^
SyntaxError: did you forget parentheses around the comprehension target?
>>> # flatten a list using a listcomp with two 'for'
>>> vec = [[1,2,3], [4,5,6], [7,8,9]]
>>> [num for elem in vec for num in elem]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
@end example

List comprehensions can contain complex expressions and nested functions:

@example
>>> from math import pi
>>> [str(round(pi, i)) for i in range(1, 6)]
['3.1', '3.14', '3.142', '3.1416', '3.14159']
@end example

@node Nested List Comprehensions,,List Comprehensions<2>,More on Lists
@anchor{tutorial/datastructures nested-list-comprehensions}@anchor{206e}
@subsubsection Nested List Comprehensions


The initial expression in a list comprehension can be any arbitrary expression,
including another list comprehension.

Consider the following example of a 3x4 matrix implemented as a list of
3 lists of length 4:

@example
>>> matrix = [
...     [1, 2, 3, 4],
...     [5, 6, 7, 8],
...     [9, 10, 11, 12],
... ]
@end example

The following list comprehension will transpose rows and columns:

@example
>>> [[row[i] for row in matrix] for i in range(4)]
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
@end example

As we saw in the previous section, the inner list comprehension is evaluated in
the context of the @ref{348,,for} that follows it, so this example is
equivalent to:

@example
>>> transposed = []
>>> for i in range(4):
...     transposed.append([row[i] for row in matrix])
...
>>> transposed
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
@end example

which, in turn, is the same as:

@example
>>> transposed = []
>>> for i in range(4):
...     # the following 3 lines implement the nested listcomp
...     transposed_row = []
...     for row in matrix:
...         transposed_row.append(row[i])
...     transposed.append(transposed_row)
...
>>> transposed
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
@end example

In the real world, you should prefer built-in functions to complex flow statements.
The @ref{1a1,,zip()} function would do a great job for this use case:

@example
>>> list(zip(*matrix))
[(1, 5, 9), (2, 6, 10), (3, 7, 11), (4, 8, 12)]
@end example

See @ref{2055,,Unpacking Argument Lists} for details on the asterisk in this line.

@node The del statement,Tuples and Sequences,More on Lists,Data Structures
@anchor{tutorial/datastructures the-del-statement}@anchor{206f}@anchor{tutorial/datastructures tut-del}@anchor{2070}
@subsection The @code{del} statement


There is a way to remove an item from a list given its index instead of its
value: the @ref{1b63,,del} statement.  This differs from the @ref{2069,,pop()} method
which returns a value.  The @code{del} statement can also be used to remove
slices from a list or clear the entire list (which we did earlier by assignment
of an empty list to the slice).  For example:

@example
>>> a = [-1, 1, 66.25, 333, 333, 1234.5]
>>> del a[0]
>>> a
[1, 66.25, 333, 333, 1234.5]
>>> del a[2:4]
>>> a
[1, 66.25, 1234.5]
>>> del a[:]
>>> a
[]
@end example

@ref{1b63,,del} can also be used to delete entire variables:

@example
>>> del a
@end example

Referencing the name @code{a} hereafter is an error (at least until another value
is assigned to it).  We’ll find other uses for @ref{1b63,,del} later.

@node Tuples and Sequences,Sets,The del statement,Data Structures
@anchor{tutorial/datastructures tuples-and-sequences}@anchor{2071}@anchor{tutorial/datastructures tut-tuples}@anchor{204c}
@subsection Tuples and Sequences


We saw that lists and strings have many common properties, such as indexing and
slicing operations.  They are two examples of `sequence' data types (see
@ref{2072,,Sequence Types — list@comma{} tuple@comma{} range}).  Since Python is an evolving language, other sequence data
types may be added.  There is also another standard sequence data type: the
`tuple'.

A tuple consists of a number of values separated by commas, for instance:

@example
>>> t = 12345, 54321, 'hello!'
>>> t[0]
12345
>>> t
(12345, 54321, 'hello!')
>>> # Tuples may be nested:
>>> u = t, (1, 2, 3, 4, 5)
>>> u
((12345, 54321, 'hello!'), (1, 2, 3, 4, 5))
>>> # Tuples are immutable:
>>> t[0] = 88888
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>> # but they can contain mutable objects:
>>> v = ([1, 2, 3], [3, 2, 1])
>>> v
([1, 2, 3], [3, 2, 1])
@end example

As you see, on output tuples are always enclosed in parentheses, so that nested
tuples are interpreted correctly; they may be input with or without surrounding
parentheses, although often parentheses are necessary anyway (if the tuple is
part of a larger expression).  It is not possible to assign to the individual
items of a tuple, however it is possible to create tuples which contain mutable
objects, such as lists.

Though tuples may seem similar to lists, they are often used in different
situations and for different purposes.
Tuples are @ref{2022,,immutable}, and usually contain a heterogeneous sequence of
elements that are accessed via unpacking (see later in this section) or indexing
(or even by attribute in the case of @ref{4e1,,namedtuples}).
Lists are @ref{2027,,mutable}, and their elements are usually homogeneous and are
accessed by iterating over the list.

A special problem is the construction of tuples containing 0 or 1 items: the
syntax has some extra quirks to accommodate these.  Empty tuples are constructed
by an empty pair of parentheses; a tuple with one item is constructed by
following a value with a comma (it is not sufficient to enclose a single value
in parentheses). Ugly, but effective.  For example:

@example
>>> empty = ()
>>> singleton = 'hello',    # <-- note trailing comma
>>> len(empty)
0
>>> len(singleton)
1
>>> singleton
('hello',)
@end example

The statement @code{t = 12345, 54321, 'hello!'} is an example of `tuple packing':
the values @code{12345}, @code{54321} and @code{'hello!'} are packed together in a tuple.
The reverse operation is also possible:

@example
>>> x, y, z = t
@end example

This is called, appropriately enough, `sequence unpacking' and works for any
sequence on the right-hand side.  Sequence unpacking requires that there are as
many variables on the left side of the equals sign as there are elements in the
sequence.  Note that multiple assignment is really just a combination of tuple
packing and sequence unpacking.

@node Sets,Dictionaries,Tuples and Sequences,Data Structures
@anchor{tutorial/datastructures sets}@anchor{2073}@anchor{tutorial/datastructures tut-sets}@anchor{2074}
@subsection Sets


Python also includes a data type for @ref{2075,,sets}.  A set is
an unordered collection with no duplicate elements.  Basic uses include
membership testing and eliminating duplicate entries.  Set objects also
support mathematical operations like union, intersection, difference, and
symmetric difference.

Curly braces or the @ref{185,,set()} function can be used to create sets.  Note: to
create an empty set you have to use @code{set()}, not @code{@{@}}; the latter creates an
empty dictionary, a data structure that we discuss in the next section.

Because sets are unordered, iterating over them or printing them can
produce the elements in a different order than you expect.

Here is a brief demonstration:

@example
>>> basket = @{'apple', 'orange', 'apple', 'pear', 'orange', 'banana'@}
>>> print(basket)                      # show that duplicates have been removed
@{'orange', 'banana', 'pear', 'apple'@}
>>> 'orange' in basket                 # fast membership testing
True
>>> 'crabgrass' in basket
False

>>> # Demonstrate set operations on unique letters from two words
>>>
>>> a = set('abracadabra')
>>> b = set('alacazam')
>>> a                                  # unique letters in a
@{'a', 'r', 'b', 'c', 'd'@}
>>> a - b                              # letters in a but not in b
@{'r', 'd', 'b'@}
>>> a | b                              # letters in a or b or both
@{'a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'@}
>>> a & b                              # letters in both a and b
@{'a', 'c'@}
>>> a ^ b                              # letters in a or b but not both
@{'r', 'd', 'b', 'm', 'z', 'l'@}
@end example

Similarly to @ref{206d,,list comprehensions}, set comprehensions
are also supported:

@example
>>> a = @{x for x in 'abracadabra' if x not in 'abc'@}
>>> a
@{'r', 'd'@}
@end example

@node Dictionaries,Looping Techniques,Sets,Data Structures
@anchor{tutorial/datastructures dictionaries}@anchor{2076}@anchor{tutorial/datastructures tut-dictionaries}@anchor{2077}
@subsection Dictionaries


Another useful data type built into Python is the `dictionary' (see
@ref{cc3,,Mapping Types — dict}). Dictionaries are sometimes found in other languages as
“associative memories” or “associative arrays”.  Unlike sequences, which are
indexed by a range of numbers, dictionaries are indexed by `keys', which can be
any immutable type; strings and numbers can always be keys.  Tuples can be used
as keys if they contain only strings, numbers, or tuples; if a tuple contains
any mutable object either directly or indirectly, it cannot be used as a key.
You can’t use lists as keys, since lists can be modified in place using index
assignments, slice assignments, or methods like @ref{8de,,append()} and
@ref{602,,extend()}.

It is best to think of a dictionary as a set of `key: value' pairs,
with the requirement that the keys are unique (within one dictionary). A pair of
braces creates an empty dictionary: @code{@{@}}. Placing a comma-separated list of
key:value pairs within the braces adds initial key:value pairs to the
dictionary; this is also the way dictionaries are written on output.

The main operations on a dictionary are storing a value with some key and
extracting the value given the key.  It is also possible to delete a key:value
pair with @code{del}. If you store using a key that is already in use, the old
value associated with that key is forgotten.

Extracting a value for a non-existent key by subscripting (@code{d[key]}) raises a
@ref{5e7,,KeyError}. To avoid getting this error when trying to access a possibly
non-existent key, use the @ref{2078,,get()} method instead, which returns
@code{None} (or a specified default value) if the key is not in the dictionary.

Performing @code{list(d)} on a dictionary returns a list of all the keys
used in the dictionary, in insertion order (if you want it sorted, just use
@code{sorted(d)} instead). To check whether a single key is in the
dictionary, use the @ref{349,,in} keyword.

Here is a small example using a dictionary:

@example
>>> tel = @{'jack': 4098, 'sape': 4139@}
>>> tel['guido'] = 4127
>>> tel
@{'jack': 4098, 'sape': 4139, 'guido': 4127@}
>>> tel['jack']
4098
>>> tel['irv']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'irv'
>>> print(tel.get('irv'))
None
>>> del tel['sape']
>>> tel['irv'] = 4127
>>> tel
@{'jack': 4098, 'guido': 4127, 'irv': 4127@}
>>> list(tel)
['jack', 'guido', 'irv']
>>> sorted(tel)
['guido', 'irv', 'jack']
>>> 'guido' in tel
True
>>> 'jack' not in tel
False
@end example

The @ref{184,,dict()} constructor builds dictionaries directly from sequences of
key-value pairs:

@example
>>> dict([('sape', 4139), ('guido', 4127), ('jack', 4098)])
@{'sape': 4139, 'guido': 4127, 'jack': 4098@}
@end example

In addition, dict comprehensions can be used to create dictionaries from
arbitrary key and value expressions:

@example
>>> @{x: x**2 for x in (2, 4, 6)@}
@{2: 4, 4: 16, 6: 36@}
@end example

When the keys are simple strings, it is sometimes easier to specify pairs using
keyword arguments:

@example
>>> dict(sape=4139, guido=4127, jack=4098)
@{'sape': 4139, 'guido': 4127, 'jack': 4098@}
@end example

@node Looping Techniques,More on Conditions,Dictionaries,Data Structures
@anchor{tutorial/datastructures looping-techniques}@anchor{2079}@anchor{tutorial/datastructures tut-loopidioms}@anchor{2036}
@subsection Looping Techniques


When looping through dictionaries, the key and corresponding value can be
retrieved at the same time using the @ref{9d8,,items()} method.

@example
>>> knights = @{'gallahad': 'the pure', 'robin': 'the brave'@}
>>> for k, v in knights.items():
...     print(k, v)
...
gallahad the pure
robin the brave
@end example

When looping through a sequence, the position index and corresponding value can
be retrieved at the same time using the @ref{168d,,enumerate()} function.

@example
>>> for i, v in enumerate(['tic', 'tac', 'toe']):
...     print(i, v)
...
0 tic
1 tac
2 toe
@end example

To loop over two or more sequences at the same time, the entries can be paired
with the @ref{1a1,,zip()} function.

@example
>>> questions = ['name', 'quest', 'favorite color']
>>> answers = ['lancelot', 'the holy grail', 'blue']
>>> for q, a in zip(questions, answers):
...     print('What is your @{0@}?  It is @{1@}.'.format(q, a))
...
What is your name?  It is lancelot.
What is your quest?  It is the holy grail.
What is your favorite color?  It is blue.
@end example

To loop over a sequence in reverse, first specify the sequence in a forward
direction and then call the @ref{a6b,,reversed()} function.

@example
>>> for i in reversed(range(1, 10, 2)):
...     print(i)
...
9
7
5
3
1
@end example

To loop over a sequence in sorted order, use the @ref{dcd,,sorted()} function which
returns a new sorted list while leaving the source unaltered.

@example
>>> basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']
>>> for i in sorted(basket):
...     print(i)
...
apple
apple
banana
orange
orange
pear
@end example

Using @ref{185,,set()} on a sequence eliminates duplicate elements. The use of
@ref{dcd,,sorted()} in combination with @code{set()} over a sequence is an idiomatic
way to loop over unique elements of the sequence in sorted order.

@example
>>> basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']
>>> for f in sorted(set(basket)):
...     print(f)
...
apple
banana
orange
pear
@end example

It is sometimes tempting to change a list while you are looping over it;
however, it is often simpler and safer to create a new list instead.

@example
>>> import math
>>> raw_data = [56.2, float('NaN'), 51.7, 55.3, 52.5, float('NaN'), 47.8]
>>> filtered_data = []
>>> for value in raw_data:
...     if not math.isnan(value):
...         filtered_data.append(value)
...
>>> filtered_data
[56.2, 51.7, 55.3, 52.5, 47.8]
@end example

@node More on Conditions,Comparing Sequences and Other Types,Looping Techniques,Data Structures
@anchor{tutorial/datastructures more-on-conditions}@anchor{207a}@anchor{tutorial/datastructures tut-conditions}@anchor{207b}
@subsection More on Conditions


The conditions used in @code{while} and @code{if} statements can contain any
operators, not just comparisons.

The comparison operators @code{in} and @code{not in} are membership tests that
determine whether a value is in (or not in) a container.  The operators @code{is}
and @code{is not} compare whether two objects are really the same object.  All
comparison operators have the same priority, which is lower than that of all
numerical operators.

Comparisons can be chained.  For example, @code{a < b == c} tests whether @code{a} is
less than @code{b} and moreover @code{b} equals @code{c}.

Comparisons may be combined using the Boolean operators @code{and} and @code{or}, and
the outcome of a comparison (or of any other Boolean expression) may be negated
with @code{not}.  These have lower priorities than comparison operators; between
them, @code{not} has the highest priority and @code{or} the lowest, so that @code{A and
not B or C} is equivalent to @code{(A and (not B)) or C}. As always, parentheses
can be used to express the desired composition.

The Boolean operators @code{and} and @code{or} are so-called `short-circuit'
operators: their arguments are evaluated from left to right, and evaluation
stops as soon as the outcome is determined.  For example, if @code{A} and @code{C} are
true but @code{B} is false, @code{A and B and C} does not evaluate the expression
@code{C}.  When used as a general value and not as a Boolean, the return value of a
short-circuit operator is the last evaluated argument.

It is possible to assign the result of a comparison or other Boolean expression
to a variable.  For example,

@example
>>> string1, string2, string3 = '@w{'}, 'Trondheim', 'Hammer Dance'
>>> non_null = string1 or string2 or string3
>>> non_null
'Trondheim'
@end example

Note that in Python, unlike C, assignment inside expressions must be done
explicitly with the
@ref{207c,,walrus operator} @code{:=}.
This avoids a common class of problems encountered in C programs: typing @code{=}
in an expression when @code{==} was intended.

@node Comparing Sequences and Other Types,,More on Conditions,Data Structures
@anchor{tutorial/datastructures comparing-sequences-and-other-types}@anchor{207d}@anchor{tutorial/datastructures tut-comparing}@anchor{207e}
@subsection Comparing Sequences and Other Types


Sequence objects typically may be compared to other objects with the same sequence
type. The comparison uses `lexicographical' ordering: first the first two
items are compared, and if they differ this determines the outcome of the
comparison; if they are equal, the next two items are compared, and so on, until
either sequence is exhausted. If two items to be compared are themselves
sequences of the same type, the lexicographical comparison is carried out
recursively.  If all items of two sequences compare equal, the sequences are
considered equal. If one sequence is an initial sub-sequence of the other, the
shorter sequence is the smaller (lesser) one.  Lexicographical ordering for
strings uses the Unicode code point number to order individual characters.
Some examples of comparisons between sequences of the same type:

@example
(1, 2, 3)              < (1, 2, 4)
[1, 2, 3]              < [1, 2, 4]
'ABC' < 'C' < 'Pascal' < 'Python'
(1, 2, 3, 4)           < (1, 2, 4)
(1, 2)                 < (1, 2, -1)
(1, 2, 3)             == (1.0, 2.0, 3.0)
(1, 2, ('aa', 'ab'))   < (1, 2, ('abc', 'a'), 4)
@end example

Note that comparing objects of different types with @code{<} or @code{>} is legal
provided that the objects have appropriate comparison methods.  For example,
mixed numeric types are compared according to their numeric value, so 0 equals
0.0, etc.  Otherwise, rather than providing an arbitrary ordering, the
interpreter will raise a @ref{199,,TypeError} exception.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Modules<2>,Input and Output,Data Structures,The Python Tutorial
@anchor{tutorial/modules doc}@anchor{207f}@anchor{tutorial/modules modules}@anchor{2080}@anchor{tutorial/modules translation-repo}@anchor{2081}@anchor{tutorial/modules tut-modules}@anchor{2082}
@section Modules


If you quit from the Python interpreter and enter it again, the definitions you
have made (functions and variables) are lost. Therefore, if you want to write a
somewhat longer program, you are better off using a text editor to prepare the
input for the interpreter and running it with that file as input instead.  This
is known as creating a `script'.  As your program gets longer, you may want to
split it into several files for easier maintenance.  You may also want to use a
handy function that you’ve written in several programs without copying its
definition into each program.

To support this, Python has a way to put definitions in a file and use them in a
script or in an interactive instance of the interpreter. Such a file is called a
`module'; definitions from a module can be `imported' into other modules or into
the `main' module (the collection of variables that you have access to in a
script executed at the top level and in calculator mode).

A module is a file containing Python definitions and statements.  The file name
is the module name with the suffix @code{.py} appended.  Within a module, the
module’s name (as a string) is available as the value of the global variable
@code{__name__}.  For instance, use your favorite text editor to create a file
called @code{fibo.py} in the current directory with the following contents:

@example
# Fibonacci numbers module

def fib(n):
    """Write Fibonacci series up to n."""
    a, b = 0, 1
    while a < n:
        print(a, end=' ')
        a, b = b, a+b
    print()

def fib2(n):
    """Return Fibonacci series up to n."""
    result = []
    a, b = 0, 1
    while a < n:
        result.append(a)
        a, b = b, a+b
    return result
@end example

Now enter the Python interpreter and import this module with the following
command:

@example
>>> import fibo
@end example

This does not add the names of the functions defined in @code{fibo}  directly to
the current @ref{2083,,namespace} (see @ref{2084,,Python Scopes and Namespaces} for more details);
it only adds the module name @code{fibo} there. Using
the module name you can access the functions:

@example
>>> fibo.fib(1000)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
>>> fibo.fib2(100)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
>>> fibo.__name__
'fibo'
@end example

If you intend to use a function often you can assign it to a local name:

@example
>>> fib = fibo.fib
>>> fib(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
@end example

@menu
* More on Modules:: 
* Standard Modules:: 
* The dir() Function: The dir Function. 
* Packages:: 

@end menu

@node More on Modules,Standard Modules,,Modules<2>
@anchor{tutorial/modules more-on-modules}@anchor{2085}@anchor{tutorial/modules tut-moremodules}@anchor{2086}
@subsection More on Modules


A module can contain executable statements as well as function definitions.
These statements are intended to initialize the module. They are executed only
the `first' time the module name is encountered in an import statement. @footnote{
In fact function definitions are also ‘statements’ that are ‘executed’; the
execution of a module-level function definition adds the function name to
the module’s global namespace.
}
(They are also run if the file is executed as a script.)

Each module has its own private namespace, which is used as the global namespace
by all functions defined in the module. Thus, the author of a module can
use global variables in the module without worrying about accidental clashes
with a user’s global variables. On the other hand, if you know what you are
doing you can touch a module’s global variables with the same notation used to
refer to its functions, @code{modname.itemname}.

Modules can import other modules.  It is customary but not required to place all
@ref{7f9,,import} statements at the beginning of a module (or script, for that
matter).  The imported module names, if placed at the top level of a module
(outside any functions or classes), are added to the module’s global namespace.

There is a variant of the @ref{7f9,,import} statement that imports names from a
module directly into the importing module’s namespace.  For example:

@example
>>> from fibo import fib, fib2
>>> fib(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
@end example

This does not introduce the module name from which the imports are taken in the
local namespace (so in the example, @code{fibo} is not defined).

There is even a variant to import all names that a module defines:

@example
>>> from fibo import *
>>> fib(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
@end example

This imports all names except those beginning with an underscore (@code{_}).
In most cases Python programmers do not use this facility since it introduces
an unknown set of names into the interpreter, possibly hiding some things
you have already defined.

Note that in general the practice of importing @code{*} from a module or package is
frowned upon, since it often causes poorly readable code. However, it is okay to
use it to save typing in interactive sessions.

If the module name is followed by @code{as}, then the name
following @code{as} is bound directly to the imported module.

@example
>>> import fibo as fib
>>> fib.fib(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
@end example

This is effectively importing the module in the same way that @code{import fibo}
will do, with the only difference of it being available as @code{fib}.

It can also be used when utilising @ref{14b7,,from} with similar effects:

@example
>>> from fibo import fib as fibonacci
>>> fibonacci(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
@end example

@cartouche
@quotation Note 
For efficiency reasons, each module is only imported once per interpreter
session.  Therefore, if you change your modules, you must restart the
interpreter – or, if it’s just one module you want to test interactively,
use @ref{73e,,importlib.reload()}, e.g. @code{import importlib;
importlib.reload(modulename)}.
@end quotation
@end cartouche

@menu
* Executing modules as scripts:: 
* The Module Search Path:: 
* “Compiled” Python files:: 

@end menu

@node Executing modules as scripts,The Module Search Path,,More on Modules
@anchor{tutorial/modules executing-modules-as-scripts}@anchor{2087}@anchor{tutorial/modules tut-modulesasscripts}@anchor{2088}
@subsubsection Executing modules as scripts


When you run a Python module with

@example
python fibo.py <arguments>
@end example

the code in the module will be executed, just as if you imported it, but with
the @code{__name__} set to @code{"__main__"}.  That means that by adding this code at
the end of your module:

@example
if __name__ == "__main__":
    import sys
    fib(int(sys.argv[1]))
@end example

you can make the file usable as a script as well as an importable module,
because the code that parses the command line only runs if the module is
executed as the “main” file:

@example
$ python fibo.py 50
0 1 1 2 3 5 8 13 21 34
@end example

If the module is imported, the code is not run:

@example
>>> import fibo
>>>
@end example

This is often used either to provide a convenient user interface to a module, or
for testing purposes (running the module as a script executes a test suite).

@node The Module Search Path,“Compiled” Python files,Executing modules as scripts,More on Modules
@anchor{tutorial/modules the-module-search-path}@anchor{2089}@anchor{tutorial/modules tut-searchpath}@anchor{208a}
@subsubsection The Module Search Path


@geindex module; search; path

When a module named @code{spam} is imported, the interpreter first searches for
a built-in module with that name. These module names are listed in
@ref{208b,,sys.builtin_module_names}. If not found, it then searches for a file
named @code{spam.py} in a list of directories given by the variable
@ref{3e2,,sys.path}.  @code{sys.path} is initialized from these locations:


@itemize *

@item 
The directory containing the input script (or the current directory when no
file is specified).

@item 
@geindex PYTHONPATH
@geindex environment variable; PYTHONPATH
@ref{1223,,PYTHONPATH} (a list of directory names, with the same syntax as the
shell variable 
@geindex PATH
@geindex environment variable; PATH
@code{PATH}).

@item 
The installation-dependent default (by convention including a
@code{site-packages} directory, handled by the @ref{cc,,site} module).
@end itemize

More details are at @ref{1922,,The initialization of the sys.path module search path}.

@cartouche
@quotation Note 
On file systems which support symlinks, the directory containing the input
script is calculated after the symlink is followed. In other words the
directory containing the symlink is `not' added to the module search path.
@end quotation
@end cartouche

After initialization, Python programs can modify @ref{3e2,,sys.path}.  The
directory containing the script being run is placed at the beginning of the
search path, ahead of the standard library path. This means that scripts in that
directory will be loaded instead of modules of the same name in the library
directory. This is an error unless the replacement is intended.  See section
@ref{208c,,Standard Modules} for more information.

@c %
@c Do we need stuff on zip files etc. ? DUBOIS

@node “Compiled” Python files,,The Module Search Path,More on Modules
@anchor{tutorial/modules compiled-python-files}@anchor{208d}@anchor{tutorial/modules tut-pycache}@anchor{8ed}
@subsubsection “Compiled” Python files


To speed up loading modules, Python caches the compiled version of each module
in the @code{__pycache__} directory under the name @code{module.`version'.pyc},
where the version encodes the format of the compiled file; it generally contains
the Python version number.  For example, in CPython release 3.3 the compiled
version of spam.py would be cached as @code{__pycache__/spam.cpython-33.pyc}.  This
naming convention allows compiled modules from different releases and different
versions of Python to coexist.

Python checks the modification date of the source against the compiled version
to see if it’s out of date and needs to be recompiled.  This is a completely
automatic process.  Also, the compiled modules are platform-independent, so the
same library can be shared among systems with different architectures.

Python does not check the cache in two circumstances.  First, it always
recompiles and does not store the result for the module that’s loaded directly
from the command line.  Second, it does not check the cache if there is no
source module.  To support a non-source (compiled only) distribution, the
compiled module must be in the source directory, and there must not be a source
module.

Some tips for experts:


@itemize *

@item 
You can use the @ref{18d,,-O} or @ref{fbb,,-OO} switches on the Python command
to reduce the size of a compiled module.  The @code{-O} switch removes assert
statements, the @code{-OO} switch removes both assert statements and __doc__
strings.  Since some programs may rely on having these available, you should
only use this option if you know what you’re doing.  “Optimized” modules have
an @code{opt-} tag and are usually smaller.  Future releases may
change the effects of optimization.

@item 
A program doesn’t run any faster when it is read from a @code{.pyc}
file than when it is read from a @code{.py} file; the only thing that’s faster
about @code{.pyc} files is the speed with which they are loaded.

@item 
The module @ref{21,,compileall} can create .pyc files for all modules in a
directory.

@item 
There is more detail on this process, including a flow chart of the
decisions, in 
@geindex Python Enhancement Proposals; PEP 3147
PEP 3147@footnote{https://peps.python.org/pep-3147/}.
@end itemize

@node Standard Modules,The dir Function,More on Modules,Modules<2>
@anchor{tutorial/modules standard-modules}@anchor{208e}@anchor{tutorial/modules tut-standardmodules}@anchor{208c}
@subsection Standard Modules


@geindex module; sys

Python comes with a library of standard modules, described in a separate
document, the Python Library Reference (“Library Reference” hereafter).  Some
modules are built into the interpreter; these provide access to operations that
are not part of the core of the language but are nevertheless built in, either
for efficiency or to provide access to operating system primitives such as
system calls.  The set of such modules is a configuration option which also
depends on the underlying platform.  For example, the @ref{11d,,winreg} module is only
provided on Windows systems. One particular module deserves some attention:
@ref{df,,sys}, which is built into every Python interpreter.  The variables
@code{sys.ps1} and @code{sys.ps2} define the strings used as primary and secondary
prompts:

@example
>>> import sys
>>> sys.ps1
'>>> '
>>> sys.ps2
'... '
>>> sys.ps1 = 'C> '
C> print('Yuck!')
Yuck!
C>
@end example

These two variables are only defined if the interpreter is in interactive mode.

The variable @code{sys.path} is a list of strings that determines the interpreter’s
search path for modules. It is initialized to a default path taken from the
environment variable 
@geindex PYTHONPATH
@geindex environment variable; PYTHONPATH
@ref{1223,,PYTHONPATH}, or from a built-in default if
@geindex PYTHONPATH
@geindex environment variable; PYTHONPATH
@code{PYTHONPATH} is not set.  You can modify it using standard list
operations:

@example
>>> import sys
>>> sys.path.append('/ufs/guido/lib/python')
@end example

@node The dir Function,Packages,Standard Modules,Modules<2>
@anchor{tutorial/modules the-dir-function}@anchor{208f}@anchor{tutorial/modules tut-dir}@anchor{2090}
@subsection The @code{dir()} Function


The built-in function @ref{845,,dir()} is used to find out which names a module
defines.  It returns a sorted list of strings:

@example
>>> import fibo, sys
>>> dir(fibo)
['__name__', 'fib', 'fib2']
>>> dir(sys)
['__breakpointhook__', '__displayhook__', '__doc__', '__excepthook__',
 '__interactivehook__', '__loader__', '__name__', '__package__', '__spec__',
 '__stderr__', '__stdin__', '__stdout__', '__unraisablehook__',
 '_clear_type_cache', '_current_frames', '_debugmallocstats', '_framework',
 '_getframe', '_git', '_home', '_xoptions', 'abiflags', 'addaudithook',
 'api_version', 'argv', 'audit', 'base_exec_prefix', 'base_prefix',
 'breakpointhook', 'builtin_module_names', 'byteorder', 'call_tracing',
 'callstats', 'copyright', 'displayhook', 'dont_write_bytecode', 'exc_info',
 'excepthook', 'exec_prefix', 'executable', 'exit', 'flags', 'float_info',
 'float_repr_style', 'get_asyncgen_hooks', 'get_coroutine_origin_tracking_depth',
 'getallocatedblocks', 'getdefaultencoding', 'getdlopenflags',
 'getfilesystemencodeerrors', 'getfilesystemencoding', 'getprofile',
 'getrecursionlimit', 'getrefcount', 'getsizeof', 'getswitchinterval',
 'gettrace', 'hash_info', 'hexversion', 'implementation', 'int_info',
 'intern', 'is_finalizing', 'last_traceback', 'last_type', 'last_value',
 'maxsize', 'maxunicode', 'meta_path', 'modules', 'path', 'path_hooks',
 'path_importer_cache', 'platform', 'prefix', 'ps1', 'ps2', 'pycache_prefix',
 'set_asyncgen_hooks', 'set_coroutine_origin_tracking_depth', 'setdlopenflags',
 'setprofile', 'setrecursionlimit', 'setswitchinterval', 'settrace', 'stderr',
 'stdin', 'stdout', 'thread_info', 'unraisablehook', 'version', 'version_info',
 'warnoptions']
@end example

Without arguments, @ref{845,,dir()} lists the names you have defined currently:

@example
>>> a = [1, 2, 3, 4, 5]
>>> import fibo
>>> fib = fibo.fib
>>> dir()
['__builtins__', '__name__', 'a', 'fib', 'fibo', 'sys']
@end example

Note that it lists all types of names: variables, modules, functions, etc.

@geindex module; builtins

@ref{845,,dir()} does not list the names of built-in functions and variables.  If you
want a list of those, they are defined in the standard module
@ref{13,,builtins}:

@example
>>> import builtins
>>> dir(builtins)
['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException',
 'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning',
 'ChildProcessError', 'ConnectionAbortedError', 'ConnectionError',
 'ConnectionRefusedError', 'ConnectionResetError', 'DeprecationWarning',
 'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False',
 'FileExistsError', 'FileNotFoundError', 'FloatingPointError',
 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError',
 'ImportWarning', 'IndentationError', 'IndexError', 'InterruptedError',
 'IsADirectoryError', 'KeyError', 'KeyboardInterrupt', 'LookupError',
 'MemoryError', 'NameError', 'None', 'NotADirectoryError', 'NotImplemented',
 'NotImplementedError', 'OSError', 'OverflowError',
 'PendingDeprecationWarning', 'PermissionError', 'ProcessLookupError',
 'ReferenceError', 'ResourceWarning', 'RuntimeError', 'RuntimeWarning',
 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError',
 'SystemExit', 'TabError', 'TimeoutError', 'True', 'TypeError',
 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError',
 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning',
 'ValueError', 'Warning', 'ZeroDivisionError', '_', '__build_class__',
 '__debug__', '__doc__', '__import__', '__name__', '__package__', 'abs',
 'all', 'any', 'ascii', 'bin', 'bool', 'bytearray', 'bytes', 'callable',
 'chr', 'classmethod', 'compile', 'complex', 'copyright', 'credits',
 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'exec', 'exit',
 'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr',
 'hash', 'help', 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass',
 'iter', 'len', 'license', 'list', 'locals', 'map', 'max', 'memoryview',
 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property',
 'quit', 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice',
 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars',
 'zip']
@end example

@node Packages,,The dir Function,Modules<2>
@anchor{tutorial/modules packages}@anchor{2091}@anchor{tutorial/modules tut-packages}@anchor{2092}
@subsection Packages


Packages are a way of structuring Python’s module namespace by using “dotted
module names”.  For example, the module name @code{A.B} designates a submodule
named @code{B} in a package named @code{A}.  Just like the use of modules saves the
authors of different modules from having to worry about each other’s global
variable names, the use of dotted module names saves the authors of multi-module
packages like NumPy or Pillow from having to worry about
each other’s module names.

Suppose you want to design a collection of modules (a “package”) for the uniform
handling of sound files and sound data.  There are many different sound file
formats (usually recognized by their extension, for example: @code{.wav},
@code{.aiff}, @code{.au}), so you may need to create and maintain a growing
collection of modules for the conversion between the various file formats.
There are also many different operations you might want to perform on sound data
(such as mixing, adding echo, applying an equalizer function, creating an
artificial stereo effect), so in addition you will be writing a never-ending
stream of modules to perform these operations.  Here’s a possible structure for
your package (expressed in terms of a hierarchical filesystem):

@example
sound/                          Top-level package
      __init__.py               Initialize the sound package
      formats/                  Subpackage for file format conversions
              __init__.py
              wavread.py
              wavwrite.py
              aiffread.py
              aiffwrite.py
              auread.py
              auwrite.py
              ...
      effects/                  Subpackage for sound effects
              __init__.py
              echo.py
              surround.py
              reverse.py
              ...
      filters/                  Subpackage for filters
              __init__.py
              equalizer.py
              vocoder.py
              karaoke.py
              ...
@end example

When importing the package, Python searches through the directories on
@code{sys.path} looking for the package subdirectory.

The @code{__init__.py} files are required to make Python treat directories
containing the file as packages (unless using a @ref{2b4,,namespace package}, a
relatively advanced feature). This prevents directories with a common name,
such as @code{string}, from unintentionally hiding valid modules that occur later
on the module search path. In the simplest case, @code{__init__.py} can just be
an empty file, but it can also execute initialization code for the package or
set the @code{__all__} variable, described later.

Users of the package can import individual modules from the package, for
example:

@example
import sound.effects.echo
@end example

This loads the submodule @code{sound.effects.echo}.  It must be referenced with
its full name.

@example
sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)
@end example

An alternative way of importing the submodule is:

@example
from sound.effects import echo
@end example

This also loads the submodule @code{echo}, and makes it available without its
package prefix, so it can be used as follows:

@example
echo.echofilter(input, output, delay=0.7, atten=4)
@end example

Yet another variation is to import the desired function or variable directly:

@example
from sound.effects.echo import echofilter
@end example

Again, this loads the submodule @code{echo}, but this makes its function
@code{echofilter()} directly available:

@example
echofilter(input, output, delay=0.7, atten=4)
@end example

Note that when using @code{from package import item}, the item can be either a
submodule (or subpackage) of the package, or some  other name defined in the
package, like a function, class or variable.  The @code{import} statement first
tests whether the item is defined in the package; if not, it assumes it is a
module and attempts to load it.  If it fails to find it, an @ref{65b,,ImportError}
exception is raised.

Contrarily, when using syntax like @code{import item.subitem.subsubitem}, each item
except for the last must be a package; the last item can be a module or a
package but can’t be a class or function or variable defined in the previous
item.

@menu
* Importing * From a Package:: 
* Intra-package References:: 
* Packages in Multiple Directories:: 

@end menu

@node Importing * From a Package,Intra-package References,,Packages
@anchor{tutorial/modules importing-from-a-package}@anchor{2093}@anchor{tutorial/modules tut-pkg-import-star}@anchor{2094}
@subsubsection Importing * From a Package


@geindex __all__

Now what happens when the user writes @code{from sound.effects import *}?  Ideally,
one would hope that this somehow goes out to the filesystem, finds which
submodules are present in the package, and imports them all.  This could take a
long time and importing sub-modules might have unwanted side-effects that should
only happen when the sub-module is explicitly imported.

The only solution is for the package author to provide an explicit index of the
package.  The @ref{7f9,,import} statement uses the following convention: if a package’s
@code{__init__.py} code defines a list named @code{__all__}, it is taken to be the
list of module names that should be imported when @code{from package import *} is
encountered.  It is up to the package author to keep this list up-to-date when a
new version of the package is released.  Package authors may also decide not to
support it, if they don’t see a use for importing * from their package.  For
example, the file @code{sound/effects/__init__.py} could contain the following
code:

@example
__all__ = ["echo", "surround", "reverse"]
@end example

This would mean that @code{from sound.effects import *} would import the three
named submodules of the @code{sound.effects} package.

Be aware that submodules might become shadowed by locally defined names. For
example, if you added a @code{reverse} function to the
@code{sound/effects/__init__.py} file, the @code{from sound.effects import *}
would only import the two submodules @code{echo} and @code{surround}, but `not' the
@code{reverse} submodule, because it is shadowed by the locally defined
@code{reverse} function:

@example
__all__ = [
    "echo",      # refers to the 'echo.py' file
    "surround",  # refers to the 'surround.py' file
    "reverse",   # !!! refers to the 'reverse' function now !!!
]

def reverse(msg: str):  # <-- this name shadows the 'reverse.py' submodule
    return msg[::-1]    #     in the case of a 'from sound.effects import *'
@end example

If @code{__all__} is not defined, the statement @code{from sound.effects import *}
does `not' import all submodules from the package @code{sound.effects} into the
current namespace; it only ensures that the package @code{sound.effects} has
been imported (possibly running any initialization code in @code{__init__.py})
and then imports whatever names are defined in the package.  This includes any
names defined (and submodules explicitly loaded) by @code{__init__.py}.  It
also includes any submodules of the package that were explicitly loaded by
previous @ref{7f9,,import} statements.  Consider this code:

@example
import sound.effects.echo
import sound.effects.surround
from sound.effects import *
@end example

In this example, the @code{echo} and @code{surround} modules are imported in the
current namespace because they are defined in the @code{sound.effects} package
when the @code{from...import} statement is executed.  (This also works when
@code{__all__} is defined.)

Although certain modules are designed to export only names that follow certain
patterns when you use @code{import *}, it is still considered bad practice in
production code.

Remember, there is nothing wrong with using @code{from package import
specific_submodule}!  In fact, this is the recommended notation unless the
importing module needs to use submodules with the same name from different
packages.

@node Intra-package References,Packages in Multiple Directories,Importing * From a Package,Packages
@anchor{tutorial/modules id2}@anchor{2095}@anchor{tutorial/modules intra-package-references}@anchor{2096}
@subsubsection Intra-package References


When packages are structured into subpackages (as with the @code{sound} package
in the example), you can use absolute imports to refer to submodules of siblings
packages.  For example, if the module @code{sound.filters.vocoder} needs to use
the @code{echo} module in the @code{sound.effects} package, it can use @code{from
sound.effects import echo}.

You can also write relative imports, with the @code{from module import name} form
of import statement.  These imports use leading dots to indicate the current and
parent packages involved in the relative import.  From the @code{surround}
module for example, you might use:

@example
from . import echo
from .. import formats
from ..filters import equalizer
@end example

Note that relative imports are based on the name of the current module’s package.
Since the main module does not have a package, modules intended for use
as the main module of a Python application must always use absolute imports.

@node Packages in Multiple Directories,,Intra-package References,Packages
@anchor{tutorial/modules packages-in-multiple-directories}@anchor{2097}
@subsubsection Packages in Multiple Directories


Packages support one more special attribute, @ref{2098,,__path__}.  This is
initialized to be a @ref{717,,sequence} of strings containing the name of the
directory holding the
package’s @code{__init__.py} before the code in that file is executed.  This
variable can be modified; doing so affects future searches for modules and
subpackages contained in the package.

While this feature is not often needed, it can be used to extend the set of
modules found in a package.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Input and Output,Errors and Exceptions,Modules<2>,The Python Tutorial
@anchor{tutorial/inputoutput doc}@anchor{2099}@anchor{tutorial/inputoutput input-and-output}@anchor{209a}@anchor{tutorial/inputoutput translation-repo}@anchor{209b}@anchor{tutorial/inputoutput tut-io}@anchor{209c}
@section Input and Output


There are several ways to present the output of a program; data can be printed
in a human-readable form, or written to a file for future use. This chapter will
discuss some of the possibilities.

@menu
* Fancier Output Formatting:: 
* Reading and Writing Files:: 

@end menu

@node Fancier Output Formatting,Reading and Writing Files,,Input and Output
@anchor{tutorial/inputoutput fancier-output-formatting}@anchor{209d}@anchor{tutorial/inputoutput tut-formatting}@anchor{209e}
@subsection Fancier Output Formatting


So far we’ve encountered two ways of writing values: `expression statements' and
the @ref{117b,,print()} function.  (A third way is using the @ref{209f,,write()} method
of file objects; the standard output file can be referenced as @code{sys.stdout}.
See the Library Reference for more information on this.)

Often you’ll want more control over the formatting of your output than simply
printing space-separated values. There are several ways to format output.


@itemize *

@item 
To use @ref{20a0,,formatted string literals}, begin a string
with @code{f} or @code{F} before the opening quotation mark or triple quotation mark.
Inside this string, you can write a Python expression between @code{@{} and @code{@}}
characters that can refer to variables or literal values.

@example
>>> year = 2016
>>> event = 'Referendum'
>>> f'Results of the @{year@} @{event@}'
'Results of the 2016 Referendum'
@end example

@item 
The @ref{834,,str.format()} method of strings requires more manual
effort.  You’ll still use @code{@{} and @code{@}} to mark where a variable
will be substituted and can provide detailed formatting directives,
but you’ll also need to provide the information to be formatted. In the following code
block there are two examples of how to format variables:

@example
>>> yes_votes = 42_572_654
>>> total_votes = 85_705_149
>>> percentage = yes_votes / total_votes
>>> '@{:-9@} YES votes  @{:2.2%@}'.format(yes_votes, percentage)
' 42572654 YES votes  49.67%'
@end example

Notice how the @code{yes_votes} are padded with spaces and a negative sign only for negative numbers.
The example also prints @code{percentage} multiplied by 100, with 2 decimal
places and followed by a percent sign (see @ref{4fa,,Format specification mini-language} for details).

@item 
Finally, you can do all the string handling yourself by using string slicing and
concatenation operations to create any layout you can imagine.  The
string type has some methods that perform useful operations for padding
strings to a given column width.
@end itemize

When you don’t need fancy output but just want a quick display of some
variables for debugging purposes, you can convert any value to a string with
the @ref{1c3,,repr()} or @ref{16a,,str()} functions.

The @ref{16a,,str()} function is meant to return representations of values which are
fairly human-readable, while @ref{1c3,,repr()} is meant to generate representations
which can be read by the interpreter (or will force a @ref{18f,,SyntaxError} if
there is no equivalent syntax).  For objects which don’t have a particular
representation for human consumption, @code{str()} will return the same value as
@code{repr()}.  Many values, such as numbers or structures like lists and
dictionaries, have the same representation using either function.  Strings, in
particular, have two distinct representations.

Some examples:

@example
>>> s = 'Hello, world.'
>>> str(s)
'Hello, world.'
>>> repr(s)
"'Hello, world.'"
>>> str(1/7)
'0.14285714285714285'
>>> x = 10 * 3.25
>>> y = 200 * 200
>>> s = 'The value of x is ' + repr(x) + ', and y is ' + repr(y) + '...'
>>> print(s)
The value of x is 32.5, and y is 40000...
>>> # The repr() of a string adds string quotes and backslashes:
>>> hello = 'hello, world\n'
>>> hellos = repr(hello)
>>> print(hellos)
'hello, world\n'
>>> # The argument to repr() may be any Python object:
>>> repr((x, y, ('spam', 'eggs')))
"(32.5, 40000, ('spam', 'eggs'))"
@end example

The @ref{d8,,string} module contains support for a simple templating approach
based upon regular expressions, via @ref{899,,string.Template}.
This offers yet another way to substitute values into strings,
using placeholders like @code{$x} and replacing them with values from a dictionary.
This syntax is easy to use, although it offers much less control for formatting.

@geindex formatted string literal
@geindex interpolated string literal
@geindex string; formatted literal
@geindex string; interpolated literal
@geindex f-string
@geindex fstring

@menu
* Formatted String Literals:: 
* The String format() Method: The String format Method. 
* Manual String Formatting:: 
* Old string formatting:: 

@end menu

@node Formatted String Literals,The String format Method,,Fancier Output Formatting
@anchor{tutorial/inputoutput formatted-string-literals}@anchor{20a1}@anchor{tutorial/inputoutput tut-f-strings}@anchor{20a0}
@subsubsection Formatted String Literals


@ref{19b,,Formatted string literals} (also called f-strings for
short) let you include the value of Python expressions inside a string by
prefixing the string with @code{f} or @code{F} and writing expressions as
@code{@{expression@}}.

An optional format specifier can follow the expression. This allows greater
control over how the value is formatted. The following example rounds pi to
three places after the decimal:

@example
>>> import math
>>> print(f'The value of pi is approximately @{math.pi:.3f@}.')
The value of pi is approximately 3.142.
@end example

Passing an integer after the @code{':'} will cause that field to be a minimum
number of characters wide.  This is useful for making columns line up.

@example
>>> table = @{'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 7678@}
>>> for name, phone in table.items():
...     print(f'@{name:10@} ==> @{phone:10d@}')
...
Sjoerd     ==>       4127
Jack       ==>       4098
Dcab       ==>       7678
@end example

Other modifiers can be used to convert the value before it is formatted.
@code{'!a'} applies @ref{15f2,,ascii()}, @code{'!s'} applies @ref{16a,,str()}, and @code{'!r'}
applies @ref{1c3,,repr()}:

@example
>>> animals = 'eels'
>>> print(f'My hovercraft is full of @{animals@}.')
My hovercraft is full of eels.
>>> print(f'My hovercraft is full of @{animals!r@}.')
My hovercraft is full of 'eels'.
@end example

The @code{=} specifier can be used to expand an expression to the text of the
expression, an equal sign, then the representation of the evaluated expression:

@example
>>> bugs = 'roaches'
>>> count = 13
>>> area = 'living room'
>>> print(f'Debugging @{bugs=@} @{count=@} @{area=@}')
Debugging bugs='roaches' count=13 area='living room'
@end example

See @ref{ba5,,self-documenting expressions} for more information
on the @code{=} specifier. For a reference on these format specifications, see
the reference guide for the @ref{4fa,,Format specification mini-language}.

@node The String format Method,Manual String Formatting,Formatted String Literals,Fancier Output Formatting
@anchor{tutorial/inputoutput the-string-format-method}@anchor{20a2}@anchor{tutorial/inputoutput tut-string-format}@anchor{20a3}
@subsubsection The String format() Method


Basic usage of the @ref{834,,str.format()} method looks like this:

@example
>>> print('We are the @{@} who say "@{@}!"'.format('knights', 'Ni'))
We are the knights who say "Ni!"
@end example

The brackets and characters within them (called format fields) are replaced with
the objects passed into the @ref{834,,str.format()} method.  A number in the
brackets can be used to refer to the position of the object passed into the
@code{str.format()} method.

@example
>>> print('@{0@} and @{1@}'.format('spam', 'eggs'))
spam and eggs
>>> print('@{1@} and @{0@}'.format('spam', 'eggs'))
eggs and spam
@end example

If keyword arguments are used in the @ref{834,,str.format()} method, their values
are referred to by using the name of the argument.

@example
>>> print('This @{food@} is @{adjective@}.'.format(
...       food='spam', adjective='absolutely horrible'))
This spam is absolutely horrible.
@end example

Positional and keyword arguments can be arbitrarily combined:

@example
>>> print('The story of @{0@}, @{1@}, and @{other@}.'.format('Bill', 'Manfred',
...                                                    other='Georg'))
The story of Bill, Manfred, and Georg.
@end example

If you have a really long format string that you don’t want to split up, it
would be nice if you could reference the variables to be formatted by name
instead of by position.  This can be done by simply passing the dict and using
square brackets @code{'[]'} to access the keys.

@example
>>> table = @{'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678@}
>>> print('Jack: @{0[Jack]:d@}; Sjoerd: @{0[Sjoerd]:d@}; '
...       'Dcab: @{0[Dcab]:d@}'.format(table))
Jack: 4098; Sjoerd: 4127; Dcab: 8637678
@end example

This could also be done by passing the @code{table} dictionary as keyword arguments with the @code{**}
notation.

@example
>>> table = @{'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678@}
>>> print('Jack: @{Jack:d@}; Sjoerd: @{Sjoerd:d@}; Dcab: @{Dcab:d@}'.format(**table))
Jack: 4098; Sjoerd: 4127; Dcab: 8637678
@end example

This is particularly useful in combination with the built-in function
@ref{1e65,,vars()}, which returns a dictionary containing all local variables:

@example
>>> table = @{k: str(v) for k, v in vars().items()@}
>>> message = " ".join([f'@{k@}: ' + '@{' + k +'@};' for k in table.keys()])
>>> print(message.format(**table))
__name__: __main__; __doc__: None; __package__: None; __loader__: ...
@end example

As an example, the following lines produce a tidily aligned
set of columns giving integers and their squares and cubes:

@example
>>> for x in range(1, 11):
...     print('@{0:2d@} @{1:3d@} @{2:4d@}'.format(x, x*x, x*x*x))
...
 1   1    1
 2   4    8
 3   9   27
 4  16   64
 5  25  125
 6  36  216
 7  49  343
 8  64  512
 9  81  729
10 100 1000
@end example

For a complete overview of string formatting with @ref{834,,str.format()}, see
@ref{15a7,,Format string syntax}.

@node Manual String Formatting,Old string formatting,The String format Method,Fancier Output Formatting
@anchor{tutorial/inputoutput manual-string-formatting}@anchor{20a4}
@subsubsection Manual String Formatting


Here’s the same table of squares and cubes, formatted manually:

@example
>>> for x in range(1, 11):
...     print(repr(x).rjust(2), repr(x*x).rjust(3), end=' ')
...     # Note use of 'end' on previous line
...     print(repr(x*x*x).rjust(4))
...
 1   1    1
 2   4    8
 3   9   27
 4  16   64
 5  25  125
 6  36  216
 7  49  343
 8  64  512
 9  81  729
10 100 1000
@end example

(Note that the one space between each column was added by the
way @ref{117b,,print()} works: it always adds spaces between its arguments.)

The @ref{20a5,,str.rjust()} method of string objects right-justifies a string in a
field of a given width by padding it with spaces on the left. There are
similar methods @ref{20a6,,str.ljust()} and @ref{20a7,,str.center()}. These methods do
not write anything, they just return a new string. If the input string is too
long, they don’t truncate it, but return it unchanged; this will mess up your
column lay-out but that’s usually better than the alternative, which would be
lying about a value. (If you really want truncation you can always add a
slice operation, as in @code{x.ljust(n)[:n]}.)

There is another method, @ref{16be,,str.zfill()}, which pads a numeric string on the
left with zeros.  It understands about plus and minus signs:

@example
>>> '12'.zfill(5)
'00012'
>>> '-3.14'.zfill(7)
'-003.14'
>>> '3.14159265359'.zfill(5)
'3.14159265359'
@end example

@node Old string formatting,,Manual String Formatting,Fancier Output Formatting
@anchor{tutorial/inputoutput old-string-formatting}@anchor{20a8}
@subsubsection Old string formatting


The % operator (modulo) can also be used for string formatting.
Given @code{format % values} (where `format' is a string),
@code{%} conversion specifications in `format' are replaced with
zero or more elements of `values'.
This operation is commonly known as string
interpolation. For example:

@example
>>> import math
>>> print('The value of pi is approximately %5.3f.' % math.pi)
The value of pi is approximately 3.142.
@end example

More information can be found in the @ref{8dd,,printf-style String Formatting} section.

@node Reading and Writing Files,,Fancier Output Formatting,Input and Output
@anchor{tutorial/inputoutput reading-and-writing-files}@anchor{20a9}@anchor{tutorial/inputoutput tut-files}@anchor{20aa}
@subsection Reading and Writing Files


@geindex built-in function; open
@geindex object; file

@ref{318,,open()} returns a @ref{13cf,,file object}, and is most commonly used with
two positional arguments and one keyword argument:
@code{open(filename, mode, encoding=None)}

@example
>>> f = open('workfile', 'w', encoding="utf-8")
@end example

@c XXX str(f) is <io.TextIOWrapper object at 0x82e8dc4>
@c 
@c >>> print(f)
@c <open file 'workfile', mode 'w' at 80a0960>

The first argument is a string containing the filename.  The second argument is
another string containing a few characters describing the way in which the file
will be used.  `mode' can be @code{'r'} when the file will only be read, @code{'w'}
for only writing (an existing file with the same name will be erased), and
@code{'a'} opens the file for appending; any data written to the file is
automatically added to the end.  @code{'r+'} opens the file for both reading and
writing. The `mode' argument is optional; @code{'r'} will be assumed if it’s
omitted.

Normally, files are opened in `text mode', that means, you read and write
strings from and to the file, which are encoded in a specific `encoding'.
If `encoding' is not specified, the default is platform dependent
(see @ref{318,,open()}).
Because UTF-8 is the modern de-facto standard, @code{encoding="utf-8"} is
recommended unless you know that you need to use a different encoding.
Appending a @code{'b'} to the mode opens the file in `binary mode'.
Binary mode data is read and written as @ref{193,,bytes} objects.
You can not specify `encoding' when opening file in binary mode.

In text mode, the default when reading is to convert platform-specific line
endings (@code{\n} on Unix, @code{\r\n} on Windows) to just @code{\n}.  When writing in
text mode, the default is to convert occurrences of @code{\n} back to
platform-specific line endings.  This behind-the-scenes modification
to file data is fine for text files, but will corrupt binary data like that in
@code{JPEG} or @code{EXE} files.  Be very careful to use binary mode when
reading and writing such files.

It is good practice to use the @ref{187,,with} keyword when dealing
with file objects.  The advantage is that the file is properly closed
after its suite finishes, even if an exception is raised at some
point.  Using @code{with} is also much shorter than writing
equivalent @ref{8fa,,try}-@ref{1b1,,finally} blocks:

@example
>>> with open('workfile', encoding="utf-8") as f:
...     read_data = f.read()

>>> # We can check that the file has been automatically closed.
>>> f.closed
True
@end example

If you’re not using the @ref{187,,with} keyword, then you should call
@code{f.close()} to close the file and immediately free up any system
resources used by it.

@cartouche
@quotation Warning 
Calling @code{f.write()} without using the @code{with} keyword or calling
@code{f.close()} `might' result in the arguments
of @code{f.write()} not being completely written to the disk, even if the
program exits successfully.
@end quotation
@end cartouche

@c See also https://bugs.python.org/issue17852

After a file object is closed, either by a @ref{187,,with} statement
or by calling @code{f.close()}, attempts to use the file object will
automatically fail.

@example
>>> f.close()
>>> f.read()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: I/O operation on closed file.
@end example

@menu
* Methods of File Objects:: 
* Saving structured data with json:: 

@end menu

@node Methods of File Objects,Saving structured data with json,,Reading and Writing Files
@anchor{tutorial/inputoutput methods-of-file-objects}@anchor{20ab}@anchor{tutorial/inputoutput tut-filemethods}@anchor{20ac}
@subsubsection Methods of File Objects


The rest of the examples in this section will assume that a file object called
@code{f} has already been created.

To read a file’s contents, call @code{f.read(size)}, which reads some quantity of
data and returns it as a string (in text mode) or bytes object (in binary mode).
`size' is an optional numeric argument.  When `size' is omitted or negative, the
entire contents of the file will be read and returned; it’s your problem if the
file is twice as large as your machine’s memory. Otherwise, at most `size'
characters (in text mode) or `size' bytes (in binary mode) are read and returned.
If the end of the file has been reached, @code{f.read()} will return an empty
string (@code{'@w{'}}).

@example
>>> f.read()
'This is the entire file.\n'
>>> f.read()
'@w{'}
@end example

@code{f.readline()} reads a single line from the file; a newline character (@code{\n})
is left at the end of the string, and is only omitted on the last line of the
file if the file doesn’t end in a newline.  This makes the return value
unambiguous; if @code{f.readline()} returns an empty string, the end of the file
has been reached, while a blank line is represented by @code{'\n'}, a string
containing only a single newline.

@example
>>> f.readline()
'This is the first line of the file.\n'
>>> f.readline()
'Second line of the file\n'
>>> f.readline()
'@w{'}
@end example

For reading lines from a file, you can loop over the file object. This is memory
efficient, fast, and leads to simple code:

@example
>>> for line in f:
...     print(line, end='@w{'})
...
This is the first line of the file.
Second line of the file
@end example

If you want to read all the lines of a file in a list you can also use
@code{list(f)} or @code{f.readlines()}.

@code{f.write(string)} writes the contents of `string' to the file, returning
the number of characters written.

@example
>>> f.write('This is a test\n')
15
@end example

Other types of objects need to be converted – either to a string (in text mode)
or a bytes object (in binary mode) – before writing them:

@example
>>> value = ('the answer', 42)
>>> s = str(value)  # convert the tuple to string
>>> f.write(s)
18
@end example

@code{f.tell()} returns an integer giving the file object’s current position in the file
represented as number of bytes from the beginning of the file when in binary mode and
an opaque number when in text mode.

To change the file object’s position, use @code{f.seek(offset, whence)}.  The position is computed
from adding `offset' to a reference point; the reference point is selected by
the `whence' argument.  A `whence' value of 0 measures from the beginning
of the file, 1 uses the current file position, and 2 uses the end of the file as
the reference point.  `whence' can be omitted and defaults to 0, using the
beginning of the file as the reference point.

@example
>>> f = open('workfile', 'rb+')
>>> f.write(b'0123456789abcdef')
16
>>> f.seek(5)      # Go to the 6th byte in the file
5
>>> f.read(1)
b'5'
>>> f.seek(-3, 2)  # Go to the 3rd byte before the end
13
>>> f.read(1)
b'd'
@end example

In text files (those opened without a @code{b} in the mode string), only seeks
relative to the beginning of the file are allowed (the exception being seeking
to the very file end with @code{seek(0, 2)}) and the only valid `offset' values are
those returned from the @code{f.tell()}, or zero. Any other `offset' value produces
undefined behaviour.

File objects have some additional methods, such as @ref{20ad,,isatty()} and
@ref{151c,,truncate()} which are less frequently used; consult the Library
Reference for a complete guide to file objects.

@node Saving structured data with json,,Methods of File Objects,Reading and Writing Files
@anchor{tutorial/inputoutput saving-structured-data-with-json}@anchor{20ae}@anchor{tutorial/inputoutput tut-json}@anchor{20af}
@subsubsection Saving structured data with @code{json}


@geindex module; json

Strings can easily be written to and read from a file.  Numbers take a bit more
effort, since the @ref{20b0,,read()} method only returns strings, which will have to
be passed to a function like @ref{19c,,int()}, which takes a string like @code{'123'}
and returns its numeric value 123.  When you want to save more complex data
types like nested lists and dictionaries, parsing and serializing by hand
becomes complicated.

Rather than having users constantly writing and debugging code to save
complicated data types to files, Python allows you to use the popular data
interchange format called JSON (JavaScript Object Notation)@footnote{https://json.org}.  The standard module called @ref{86,,json} can take Python
data hierarchies, and convert them to string representations; this process is
called `serializing'.  Reconstructing the data from the string representation
is called `deserializing'.  Between serializing and deserializing, the
string representing the object may have been stored in a file or data, or
sent over a network connection to some distant machine.

@cartouche
@quotation Note 
The JSON format is commonly used by modern applications to allow for data
exchange.  Many programmers are already familiar with it, which makes
it a good choice for interoperability.
@end quotation
@end cartouche

If you have an object @code{x}, you can view its JSON string representation with a
simple line of code:

@example
>>> import json
>>> x = [1, 'simple', 'list']
>>> json.dumps(x)
'[1, "simple", "list"]'
@end example

Another variant of the @ref{f47,,dumps()} function, called @ref{f46,,dump()},
simply serializes the object to a @ref{20b1,,text file}.  So if @code{f} is a
text file object opened for writing, we can do this:

@example
json.dump(x, f)
@end example

To decode the object again, if @code{f} is a @ref{20b2,,binary file} or
@ref{20b1,,text file} object which has been opened for reading:

@example
x = json.load(f)
@end example

@cartouche
@quotation Note 
JSON files must be encoded in UTF-8. Use @code{encoding="utf-8"} when opening
JSON file as a @ref{20b1,,text file} for both of reading and writing.
@end quotation
@end cartouche

This simple serialization technique can handle lists and dictionaries, but
serializing arbitrary class instances in JSON requires a bit of extra effort.
The reference for the @ref{86,,json} module contains an explanation of this.


@subsubheading See also


@ref{ab,,pickle} - the pickle module

Contrary to @ref{20af,,JSON}, `pickle' is a protocol which allows
the serialization of arbitrarily complex Python objects.  As such, it is
specific to Python and cannot be used to communicate with applications
written in other languages.  It is also insecure by default:
deserializing pickle data coming from an untrusted source can execute
arbitrary code, if the data was crafted by a skilled attacker.


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Errors and Exceptions,Classes,Input and Output,The Python Tutorial
@anchor{tutorial/errors doc}@anchor{20b3}@anchor{tutorial/errors errors-and-exceptions}@anchor{20b4}@anchor{tutorial/errors translation-repo}@anchor{20b5}@anchor{tutorial/errors tut-errors}@anchor{20b6}
@section Errors and Exceptions


Until now error messages haven’t been more than mentioned, but if you have tried
out the examples you have probably seen some.  There are (at least) two
distinguishable kinds of errors: `syntax errors' and `exceptions'.

@menu
* Syntax Errors:: 
* Exceptions:: 
* Handling Exceptions:: 
* Raising Exceptions:: 
* Exception Chaining:: 
* User-defined Exceptions:: 
* Defining Clean-up Actions:: 
* Predefined Clean-up Actions:: 
* Raising and Handling Multiple Unrelated Exceptions:: 
* Enriching Exceptions with Notes:: 

@end menu

@node Syntax Errors,Exceptions,,Errors and Exceptions
@anchor{tutorial/errors syntax-errors}@anchor{20b7}@anchor{tutorial/errors tut-syntaxerrors}@anchor{20b8}
@subsection Syntax Errors


Syntax errors, also known as parsing errors, are perhaps the most common kind of
complaint you get while you are still learning Python:

@example
>>> while True print('Hello world')
  File "<stdin>", line 1
    while True print('Hello world')
               ^^^^^
SyntaxError: invalid syntax
@end example

The parser repeats the offending line and displays little arrows pointing
at the place where the error was detected.  Note that this is not always the
place that needs to be fixed.  In the example, the error is detected at the
function @ref{117b,,print()}, since a colon (@code{':'}) is missing just before it.

The file name (@code{<stdin>} in our example) and line number are printed so you
know where to look in case the input came from a file.

@node Exceptions,Handling Exceptions,Syntax Errors,Errors and Exceptions
@anchor{tutorial/errors exceptions}@anchor{20b9}@anchor{tutorial/errors tut-exceptions}@anchor{20ba}
@subsection Exceptions


Even if a statement or expression is syntactically correct, it may cause an
error when an attempt is made to execute it. Errors detected during execution
are called `exceptions' and are not unconditionally fatal: you will soon learn
how to handle them in Python programs.  Most exceptions are not handled by
programs, however, and result in error messages as shown here:

@example
>>> 10 * (1/0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
    10 * (1/0)
          ~^~
ZeroDivisionError: division by zero
>>> 4 + spam*3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
    4 + spam*3
        ^^^^
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
    '2' + 2
    ~~~~^~~
TypeError: can only concatenate str (not "int") to str
@end example

The last line of the error message indicates what happened. Exceptions come in
different types, and the type is printed as part of the message: the types in
the example are @ref{b45,,ZeroDivisionError}, @ref{450,,NameError} and @ref{199,,TypeError}.
The string printed as the exception type is the name of the built-in exception
that occurred.  This is true for all built-in exceptions, but need not be true
for user-defined exceptions (although it is a useful convention). Standard
exception names are built-in identifiers (not reserved keywords).

The rest of the line provides detail based on the type of exception and what
caused it.

The preceding part of the error message shows the context where the exception
occurred, in the form of a stack traceback. In general it contains a stack
traceback listing source lines; however, it will not display lines read from
standard input.

@ref{1c6a,,Built-in Exceptions} lists the built-in exceptions and their meanings.

@node Handling Exceptions,Raising Exceptions,Exceptions,Errors and Exceptions
@anchor{tutorial/errors handling-exceptions}@anchor{20bb}@anchor{tutorial/errors tut-handling}@anchor{203d}
@subsection Handling Exceptions


It is possible to write programs that handle selected exceptions. Look at the
following example, which asks the user for input until a valid integer has been
entered, but allows the user to interrupt the program (using @code{Control}-@code{C} or
whatever the operating system supports); note that a user-generated interruption
is signalled by raising the @ref{bcb,,KeyboardInterrupt} exception.

@example
>>> while True:
...     try:
...         x = int(input("Please enter a number: "))
...         break
...     except ValueError:
...         print("Oops!  That was no valid number.  Try again...")
...
@end example

The @ref{8fa,,try} statement works as follows.


@itemize *

@item 
First, the `try clause' (the statement(s) between the @ref{8fa,,try} and
@ref{1ac,,except} keywords) is executed.

@item 
If no exception occurs, the `except clause' is skipped and execution of the
@ref{8fa,,try} statement is finished.

@item 
If an exception occurs during execution of the @ref{8fa,,try} clause, the rest of the
clause is skipped.  Then, if its type matches the exception named after the
@ref{1ac,,except} keyword, the `except clause' is executed, and then execution
continues after the try/except block.

@item 
If an exception occurs which does not match the exception named in the `except
clause', it is passed on to outer @ref{8fa,,try} statements; if no handler is
found, it is an `unhandled exception' and execution stops with an error message.
@end itemize

A @ref{8fa,,try} statement may have more than one `except clause', to specify
handlers for different exceptions.  At most one handler will be executed.
Handlers only handle exceptions that occur in the corresponding `try clause',
not in other handlers of the same @code{try} statement.  An `except clause'
may name multiple exceptions, for example:

@example
... except RuntimeError, TypeError, NameError:
...     pass
@end example

A class in an @ref{1ac,,except} clause matches exceptions which are instances of the
class itself or one of its derived classes (but not the other way around — an
`except clause' listing a derived class does not match instances of its base classes).
For example, the following code will print B, C, D in that order:

@example
class B(Exception):
    pass

class C(B):
    pass

class D(C):
    pass

for cls in [B, C, D]:
    try:
        raise cls()
    except D:
        print("D")
    except C:
        print("C")
    except B:
        print("B")
@end example

Note that if the `except clauses' were reversed (with @code{except B} first), it
would have printed B, B, B — the first matching `except clause' is triggered.

When an exception occurs, it may have associated values, also known as the
exception’s `arguments'. The presence and types of the arguments depend on the
exception type.

The `except clause' may specify a variable after the exception name.  The
variable is bound to the exception instance which typically has an @code{args}
attribute that stores the arguments. For convenience, builtin exception
types define @ref{831,,__str__()} to print all the arguments without explicitly
accessing @code{.args}.

@example
>>> try:
...     raise Exception('spam', 'eggs')
... except Exception as inst:
...     print(type(inst))    # the exception type
...     print(inst.args)     # arguments stored in .args
...     print(inst)          # __str__ allows args to be printed directly,
...                          # but may be overridden in exception subclasses
...     x, y = inst.args     # unpack args
...     print('x =', x)
...     print('y =', y)
...
<class 'Exception'>
('spam', 'eggs')
('spam', 'eggs')
x = spam
y = eggs
@end example

The exception’s @ref{831,,__str__()} output is printed as the last part (‘detail’)
of the message for unhandled exceptions.

@ref{7d8,,BaseException} is the common base class of all exceptions. One of its
subclasses, @ref{bd3,,Exception}, is the base class of all the non-fatal exceptions.
Exceptions which are not subclasses of @code{Exception} are not typically
handled, because they are used to indicate that the program should terminate.
They include @ref{f42,,SystemExit} which is raised by @ref{279,,sys.exit()} and
@ref{bcb,,KeyboardInterrupt} which is raised when a user wishes to interrupt
the program.

@ref{bd3,,Exception} can be used as a wildcard that catches (almost) everything.
However, it is good practice to be as specific as possible with the types
of exceptions that we intend to handle, and to allow any unexpected
exceptions to propagate on.

The most common pattern for handling @ref{bd3,,Exception} is to print or log
the exception and then re-raise it (allowing a caller to handle the
exception as well):

@example
import sys

try:
    f = open('myfile.txt')
    s = f.readline()
    i = int(s.strip())
except OSError as err:
    print("OS error:", err)
except ValueError:
    print("Could not convert data to an integer.")
except Exception as err:
    print(f"Unexpected @{err=@}, @{type(err)=@}")
    raise
@end example

The @ref{8fa,,try} … @ref{1ac,,except} statement has an optional `else
clause', which, when present, must follow all `except clauses'.  It is useful
for code that must be executed if the `try clause' does not raise an exception.
For example:

@example
for arg in sys.argv[1:]:
    try:
        f = open(arg, 'r')
    except OSError:
        print('cannot open', arg)
    else:
        print(arg, 'has', len(f.readlines()), 'lines')
        f.close()
@end example

The use of the @code{else} clause is better than adding additional code to
the @ref{8fa,,try} clause because it avoids accidentally catching an exception
that wasn’t raised by the code being protected by the @code{try} …
@code{except} statement.

Exception handlers do not handle only exceptions that occur immediately in the
`try clause', but also those that occur inside functions that are called (even
indirectly) in the `try clause'. For example:

@example
>>> def this_fails():
...     x = 1/0
...
>>> try:
...     this_fails()
... except ZeroDivisionError as err:
...     print('Handling run-time error:', err)
...
Handling run-time error: division by zero
@end example

@node Raising Exceptions,Exception Chaining,Handling Exceptions,Errors and Exceptions
@anchor{tutorial/errors raising-exceptions}@anchor{20bc}@anchor{tutorial/errors tut-raising}@anchor{20bd}
@subsection Raising Exceptions


The @ref{804,,raise} statement allows the programmer to force a specified
exception to occur. For example:

@example
>>> raise NameError('HiThere')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
    raise NameError('HiThere')
NameError: HiThere
@end example

The sole argument to @ref{804,,raise} indicates the exception to be raised.
This must be either an exception instance or an exception class (a class that
derives from @ref{7d8,,BaseException}, such as @ref{bd3,,Exception} or one of its
subclasses).  If an exception class is passed, it will be implicitly
instantiated by calling its constructor with no arguments:

@example
raise ValueError  # shorthand for 'raise ValueError()'
@end example

If you need to determine whether an exception was raised but don’t intend to
handle it, a simpler form of the @ref{804,,raise} statement allows you to
re-raise the exception:

@example
>>> try:
...     raise NameError('HiThere')
... except NameError:
...     print('An exception flew by!')
...     raise
...
An exception flew by!
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
    raise NameError('HiThere')
NameError: HiThere
@end example

@node Exception Chaining,User-defined Exceptions,Raising Exceptions,Errors and Exceptions
@anchor{tutorial/errors exception-chaining}@anchor{20be}@anchor{tutorial/errors tut-exception-chaining}@anchor{20bf}
@subsection Exception Chaining


If an unhandled exception occurs inside an @ref{1ac,,except} section, it will
have the exception being handled attached to it and included in the error
message:

@example
>>> try:
...     open("database.sqlite")
... except OSError:
...     raise RuntimeError("unable to handle error")
...
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
    open("database.sqlite")
    ~~~~^^^^^^^^^^^^^^^^^^^
FileNotFoundError: [Errno 2] No such file or directory: 'database.sqlite'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
    raise RuntimeError("unable to handle error")
RuntimeError: unable to handle error
@end example

To indicate that an exception is a direct consequence of another, the
@ref{804,,raise} statement allows an optional @code{from} clause:

@example
# exc must be exception instance or None.
raise RuntimeError from exc
@end example

This can be useful when you are transforming exceptions. For example:

@example
>>> def func():
...     raise ConnectionError
...
>>> try:
...     func()
... except ConnectionError as exc:
...     raise RuntimeError('Failed to open database') from exc
...
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
    func()
    ~~~~^^
  File "<stdin>", line 2, in func
ConnectionError

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
    raise RuntimeError('Failed to open database') from exc
RuntimeError: Failed to open database
@end example

It also allows disabling automatic exception chaining using the @code{from None}
idiom:

@example
>>> try:
...     open('database.sqlite')
... except OSError:
...     raise RuntimeError from None
...
Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
    raise RuntimeError from None
RuntimeError
@end example

For more information about chaining mechanics, see @ref{1c6a,,Built-in Exceptions}.

@node User-defined Exceptions,Defining Clean-up Actions,Exception Chaining,Errors and Exceptions
@anchor{tutorial/errors tut-userexceptions}@anchor{20c0}@anchor{tutorial/errors user-defined-exceptions}@anchor{20c1}
@subsection User-defined Exceptions


Programs may name their own exceptions by creating a new exception class (see
@ref{2045,,Classes} for more about Python classes).  Exceptions should typically
be derived from the @ref{bd3,,Exception} class, either directly or indirectly.

Exception classes can be defined which do anything any other class can do, but
are usually kept simple, often only offering a number of attributes that allow
information about the error to be extracted by handlers for the exception.

Most exceptions are defined with names that end in “Error”, similar to the
naming of the standard exceptions.

Many standard modules define their own exceptions to report errors that may
occur in functions they define.

@node Defining Clean-up Actions,Predefined Clean-up Actions,User-defined Exceptions,Errors and Exceptions
@anchor{tutorial/errors defining-clean-up-actions}@anchor{20c2}@anchor{tutorial/errors tut-cleanup}@anchor{20c3}
@subsection Defining Clean-up Actions


The @ref{8fa,,try} statement has another optional clause which is intended to
define clean-up actions that must be executed under all circumstances.  For
example:

@example
>>> try:
...     raise KeyboardInterrupt
... finally:
...     print('Goodbye, world!')
...
Goodbye, world!
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
    raise KeyboardInterrupt
KeyboardInterrupt
@end example

If a @ref{1b1,,finally} clause is present, the @code{finally}
clause will execute as the last task before the @ref{8fa,,try}
statement completes. The @code{finally} clause runs whether or
not the @code{try} statement produces an exception. The following
points discuss more complex cases when an exception occurs:


@itemize *

@item 
If an exception occurs during execution of the @code{try}
clause, the exception may be handled by an @ref{1ac,,except}
clause. If the exception is not handled by an @code{except}
clause, the exception is re-raised after the @code{finally}
clause has been executed.

@item 
An exception could occur during execution of an @code{except}
or @code{else} clause. Again, the exception is re-raised after
the @code{finally} clause has been executed.

@item 
If the @code{finally} clause executes a @ref{180,,break},
@ref{181,,continue} or @ref{1b0,,return} statement, exceptions are not
re-raised. This can be confusing and is therefore discouraged. From
version 3.14 the compiler emits a @ref{1af,,SyntaxWarning} for it
(see 
@geindex Python Enhancement Proposals; PEP 765
PEP 765@footnote{https://peps.python.org/pep-0765/}).

@item 
If the @code{try} statement reaches a @ref{180,,break},
@ref{181,,continue} or @ref{1b0,,return} statement, the
@code{finally} clause will execute just prior to the
@code{break}, @code{continue} or @code{return}
statement’s execution.

@item 
If a @code{finally} clause includes a @code{return}
statement, the returned value will be the one from the
@code{finally} clause’s @code{return} statement, not the
value from the @code{try} clause’s @code{return}
statement. This can be confusing and is therefore discouraged. From
version 3.14 the compiler emits a @ref{1af,,SyntaxWarning} for it
(see 
@geindex Python Enhancement Proposals; PEP 765
PEP 765@footnote{https://peps.python.org/pep-0765/}).
@end itemize

For example:

@example
>>> def bool_return():
...     try:
...         return True
...     finally:
...         return False
...
>>> bool_return()
False
@end example

A more complicated example:

@example
>>> def divide(x, y):
...     try:
...         result = x / y
...     except ZeroDivisionError:
...         print("division by zero!")
...     else:
...         print("result is", result)
...     finally:
...         print("executing finally clause")
...
>>> divide(2, 1)
result is 2.0
executing finally clause
>>> divide(2, 0)
division by zero!
executing finally clause
>>> divide("2", "1")
executing finally clause
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
    divide("2", "1")
    ~~~~~~^^^^^^^^^^
  File "<stdin>", line 3, in divide
    result = x / y
             ~~^~~
TypeError: unsupported operand type(s) for /: 'str' and 'str'
@end example

As you can see, the @ref{1b1,,finally} clause is executed in any event.  The
@ref{199,,TypeError} raised by dividing two strings is not handled by the
@ref{1ac,,except} clause and therefore re-raised after the @code{finally}
clause has been executed.

In real world applications, the @ref{1b1,,finally} clause is useful for
releasing external resources (such as files or network connections), regardless
of whether the use of the resource was successful.

@node Predefined Clean-up Actions,Raising and Handling Multiple Unrelated Exceptions,Defining Clean-up Actions,Errors and Exceptions
@anchor{tutorial/errors predefined-clean-up-actions}@anchor{20c4}@anchor{tutorial/errors tut-cleanup-with}@anchor{20c5}
@subsection Predefined Clean-up Actions


Some objects define standard clean-up actions to be undertaken when the object
is no longer needed, regardless of whether or not the operation using the object
succeeded or failed. Look at the following example, which tries to open a file
and print its contents to the screen.

@example
for line in open("myfile.txt"):
    print(line, end="")
@end example

The problem with this code is that it leaves the file open for an indeterminate
amount of time after this part of the code has finished executing.
This is not an issue in simple scripts, but can be a problem for larger
applications. The @ref{187,,with} statement allows objects like files to be
used in a way that ensures they are always cleaned up promptly and correctly.

@example
with open("myfile.txt") as f:
    for line in f:
        print(line, end="")
@end example

After the statement is executed, the file `f' is always closed, even if a
problem was encountered while processing the lines. Objects which, like files,
provide predefined clean-up actions will indicate this in their documentation.

@node Raising and Handling Multiple Unrelated Exceptions,Enriching Exceptions with Notes,Predefined Clean-up Actions,Errors and Exceptions
@anchor{tutorial/errors raising-and-handling-multiple-unrelated-exceptions}@anchor{20c6}@anchor{tutorial/errors tut-exception-groups}@anchor{20c7}
@subsection Raising and Handling Multiple Unrelated Exceptions


There are situations where it is necessary to report several exceptions that
have occurred. This is often the case in concurrency frameworks, when several
tasks may have failed in parallel, but there are also other use cases where
it is desirable to continue execution and collect multiple errors rather than
raise the first exception.

The builtin @ref{4d3,,ExceptionGroup} wraps a list of exception instances so
that they can be raised together. It is an exception itself, so it can be
caught like any other exception.

@example
>>> def f():
...     excs = [OSError('error 1'), SystemError('error 2')]
...     raise ExceptionGroup('there were problems', excs)
...
>>> f()
  + Exception Group Traceback (most recent call last):
  |   File "<stdin>", line 1, in <module>
  |     f()
  |     ~^^
  |   File "<stdin>", line 3, in f
  |     raise ExceptionGroup('there were problems', excs)
  | ExceptionGroup: there were problems (2 sub-exceptions)
  +-+---------------- 1 ----------------
    | OSError: error 1
    +---------------- 2 ----------------
    | SystemError: error 2
    +------------------------------------
>>> try:
...     f()
... except Exception as e:
...     print(f'caught @{type(e)@}: @{e@}')
...
caught <class 'ExceptionGroup'>: there were problems (2 sub-exceptions)
>>>
@end example

By using @code{except*} instead of @code{except}, we can selectively
handle only the exceptions in the group that match a certain
type. In the following example, which shows a nested exception
group, each @code{except*} clause extracts from the group exceptions
of a certain type while letting all other exceptions propagate to
other clauses and eventually to be reraised.

@example
>>> def f():
...     raise ExceptionGroup(
...         "group1",
...         [
...             OSError(1),
...             SystemError(2),
...             ExceptionGroup(
...                 "group2",
...                 [
...                     OSError(3),
...                     RecursionError(4)
...                 ]
...             )
...         ]
...     )
...
>>> try:
...     f()
... except* OSError as e:
...     print("There were OSErrors")
... except* SystemError as e:
...     print("There were SystemErrors")
...
There were OSErrors
There were SystemErrors
  + Exception Group Traceback (most recent call last):
  |   File "<stdin>", line 2, in <module>
  |     f()
  |     ~^^
  |   File "<stdin>", line 2, in f
  |     raise ExceptionGroup(
  |     ...<12 lines>...
  |     )
  | ExceptionGroup: group1 (1 sub-exception)
  +-+---------------- 1 ----------------
    | ExceptionGroup: group2 (1 sub-exception)
    +-+---------------- 1 ----------------
      | RecursionError: 4
      +------------------------------------
>>>
@end example

Note that the exceptions nested in an exception group must be instances,
not types. This is because in practice the exceptions would typically
be ones that have already been raised and caught by the program, along
the following pattern:

@example
>>> excs = []
... for test in tests:
...     try:
...         test.run()
...     except Exception as e:
...         excs.append(e)
...
>>> if excs:
...    raise ExceptionGroup("Test Failures", excs)
...
@end example

@node Enriching Exceptions with Notes,,Raising and Handling Multiple Unrelated Exceptions,Errors and Exceptions
@anchor{tutorial/errors enriching-exceptions-with-notes}@anchor{20c8}@anchor{tutorial/errors tut-exception-notes}@anchor{20c9}
@subsection Enriching Exceptions with Notes


When an exception is created in order to be raised, it is usually initialized
with information that describes the error that has occurred. There are cases
where it is useful to add information after the exception was caught. For this
purpose, exceptions have a method @code{add_note(note)} that accepts a string and
adds it to the exception’s notes list. The standard traceback rendering
includes all notes, in the order they were added, after the exception.

@example
>>> try:
...     raise TypeError('bad type')
... except Exception as e:
...     e.add_note('Add some information')
...     e.add_note('Add some more information')
...     raise
...
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
    raise TypeError('bad type')
TypeError: bad type
Add some information
Add some more information
>>>
@end example

For example, when collecting exceptions into an exception group, we may want
to add context information for the individual errors. In the following each
exception in the group has a note indicating when this error has occurred.

@example
>>> def f():
...     raise OSError('operation failed')
...
>>> excs = []
>>> for i in range(3):
...     try:
...         f()
...     except Exception as e:
...         e.add_note(f'Happened in Iteration @{i+1@}')
...         excs.append(e)
...
>>> raise ExceptionGroup('We have some problems', excs)
  + Exception Group Traceback (most recent call last):
  |   File "<stdin>", line 1, in <module>
  |     raise ExceptionGroup('We have some problems', excs)
  | ExceptionGroup: We have some problems (3 sub-exceptions)
  +-+---------------- 1 ----------------
    | Traceback (most recent call last):
    |   File "<stdin>", line 3, in <module>
    |     f()
    |     ~^^
    |   File "<stdin>", line 2, in f
    |     raise OSError('operation failed')
    | OSError: operation failed
    | Happened in Iteration 1
    +---------------- 2 ----------------
    | Traceback (most recent call last):
    |   File "<stdin>", line 3, in <module>
    |     f()
    |     ~^^
    |   File "<stdin>", line 2, in f
    |     raise OSError('operation failed')
    | OSError: operation failed
    | Happened in Iteration 2
    +---------------- 3 ----------------
    | Traceback (most recent call last):
    |   File "<stdin>", line 3, in <module>
    |     f()
    |     ~^^
    |   File "<stdin>", line 2, in f
    |     raise OSError('operation failed')
    | OSError: operation failed
    | Happened in Iteration 3
    +------------------------------------
>>>
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Classes,Brief tour of the standard library,Errors and Exceptions,The Python Tutorial
@anchor{tutorial/classes doc}@anchor{20ca}@anchor{tutorial/classes classes}@anchor{20cb}@anchor{tutorial/classes translation-repo}@anchor{20cc}@anchor{tutorial/classes tut-classes}@anchor{2045}
@section Classes


Classes provide a means of bundling data and functionality together.  Creating
a new class creates a new `type' of object, allowing new `instances' of that
type to be made.  Each class instance can have attributes attached to it for
maintaining its state.  Class instances can also have methods (defined by its
class) for modifying its state.

Compared with other programming languages, Python’s class mechanism adds classes
with a minimum of new syntax and semantics.  It is a mixture of the class
mechanisms found in C++ and Modula-3.  Python classes provide all the standard
features of Object Oriented Programming: the class inheritance mechanism allows
multiple base classes, a derived class can override any methods of its base
class or classes, and a method can call the method of a base class with the same
name.  Objects can contain arbitrary amounts and kinds of data.  As is true for
modules, classes partake of the dynamic nature of Python: they are created at
runtime, and can be modified further after creation.

In C++ terminology, normally class members (including the data members) are
`public' (except see below @ref{20cd,,Private Variables}), and all member functions are
`virtual'.  As in Modula-3, there are no shorthands for referencing the object’s
members from its methods: the method function is declared with an explicit first
argument representing the object, which is provided implicitly by the call.  As
in Smalltalk, classes themselves are objects.  This provides semantics for
importing and renaming.  Unlike C++ and Modula-3, built-in types can be used as
base classes for extension by the user.  Also, like in C++, most built-in
operators with special syntax (arithmetic operators, subscripting etc.) can be
redefined for class instances.

(Lacking universally accepted terminology to talk about classes, I will make
occasional use of Smalltalk and C++ terms.  I would use Modula-3 terms, since
its object-oriented semantics are closer to those of Python than C++, but I
expect that few readers have heard of it.)

@menu
* A Word About Names and Objects:: 
* Python Scopes and Namespaces:: 
* A First Look at Classes:: 
* Random Remarks:: 
* Inheritance:: 
* Private Variables:: 
* Odds and Ends:: 
* Iterators:: 
* Generators:: 
* Generator Expressions:: 

@end menu

@node A Word About Names and Objects,Python Scopes and Namespaces,,Classes
@anchor{tutorial/classes a-word-about-names-and-objects}@anchor{20ce}@anchor{tutorial/classes tut-object}@anchor{20cf}
@subsection A Word About Names and Objects


Objects have individuality, and multiple names (in multiple scopes) can be bound
to the same object.  This is known as aliasing in other languages.  This is
usually not appreciated on a first glance at Python, and can be safely ignored
when dealing with immutable basic types (numbers, strings, tuples).  However,
aliasing has a possibly surprising effect on the semantics of Python code
involving mutable objects such as lists, dictionaries, and most other types.
This is usually used to the benefit of the program, since aliases behave like
pointers in some respects.  For example, passing an object is cheap since only a
pointer is passed by the implementation; and if a function modifies an object
passed as an argument, the caller will see the change — this eliminates the
need for two different argument passing mechanisms as in Pascal.

@node Python Scopes and Namespaces,A First Look at Classes,A Word About Names and Objects,Classes
@anchor{tutorial/classes python-scopes-and-namespaces}@anchor{20d0}@anchor{tutorial/classes tut-scopes}@anchor{2084}
@subsection Python Scopes and Namespaces


Before introducing classes, I first have to tell you something about Python’s
scope rules.  Class definitions play some neat tricks with namespaces, and you
need to know how scopes and namespaces work to fully understand what’s going on.
Incidentally, knowledge about this subject is useful for any advanced Python
programmer.

Let’s begin with some definitions.

A `namespace' is a mapping from names to objects.  Most namespaces are currently
implemented as Python dictionaries, but that’s normally not noticeable in any
way (except for performance), and it may change in the future.  Examples of
namespaces are: the set of built-in names (containing functions such as @ref{20d1,,abs()}, and
built-in exception names); the global names in a module; and the local names in
a function invocation.  In a sense the set of attributes of an object also form
a namespace.  The important thing to know about namespaces is that there is
absolutely no relation between names in different namespaces; for instance, two
different modules may both define a function @code{maximize} without confusion —
users of the modules must prefix it with the module name.

By the way, I use the word `attribute' for any name following a dot — for
example, in the expression @code{z.real}, @code{real} is an attribute of the object
@code{z}.  Strictly speaking, references to names in modules are attribute
references: in the expression @code{modname.funcname}, @code{modname} is a module
object and @code{funcname} is an attribute of it.  In this case there happens to be
a straightforward mapping between the module’s attributes and the global names
defined in the module: they share the same namespace!  @footnote{
Except for one thing.  Module objects have a secret read-only attribute called
@ref{77e,,__dict__} which returns the dictionary used to implement the module’s
namespace; the name @code{__dict__} is an attribute but not a global name.
Obviously, using this violates the abstraction of namespace implementation, and
should be restricted to things like post-mortem debuggers.
}

Attributes may be read-only or writable.  In the latter case, assignment to
attributes is possible.  Module attributes are writable: you can write
@code{modname.the_answer = 42}.  Writable attributes may also be deleted with the
@ref{1b63,,del} statement.  For example, @code{del modname.the_answer} will remove
the attribute @code{the_answer} from the object named by @code{modname}.

Namespaces are created at different moments and have different lifetimes.  The
namespace containing the built-in names is created when the Python interpreter
starts up, and is never deleted.  The global namespace for a module is created
when the module definition is read in; normally, module namespaces also last
until the interpreter quits.  The statements executed by the top-level
invocation of the interpreter, either read from a script file or interactively,
are considered part of a module called @ref{1,,__main__}, so they have their own
global namespace.  (The built-in names actually also live in a module; this is
called @ref{13,,builtins}.)

The local namespace for a function is created when the function is called, and
deleted when the function returns or raises an exception that is not handled
within the function.  (Actually, forgetting would be a better way to describe
what actually happens.)  Of course, recursive invocations each have their own
local namespace.

A `scope' is a textual region of a Python program where a namespace is directly
accessible.  “Directly accessible” here means that an unqualified reference to a
name attempts to find the name in the namespace.

Although scopes are determined statically, they are used dynamically. At any
time during execution, there are 3 or 4 nested scopes whose namespaces are
directly accessible:


@itemize *

@item 
the innermost scope, which is searched first, contains the local names

@item 
the scopes of any enclosing functions, which are searched starting with the
nearest enclosing scope, contain non-local, but also non-global names

@item 
the next-to-last scope contains the current module’s global names

@item 
the outermost scope (searched last) is the namespace containing built-in names
@end itemize

If a name is declared global, then all references and assignments go directly to
the next-to-last scope containing the module’s global names.  To rebind variables
found outside of the innermost scope, the @ref{14b3,,nonlocal} statement can be
used; if not declared nonlocal, those variables are read-only (an attempt to
write to such a variable will simply create a `new' local variable in the
innermost scope, leaving the identically named outer variable unchanged).

Usually, the local scope references the local names of the (textually) current
function.  Outside functions, the local scope references the same namespace as
the global scope: the module’s namespace. Class definitions place yet another
namespace in the local scope.

It is important to realize that scopes are determined textually: the global
scope of a function defined in a module is that module’s namespace, no matter
from where or by what alias the function is called.  On the other hand, the
actual search for names is done dynamically, at run time — however, the
language definition is evolving towards static name resolution, at “compile”
time, so don’t rely on dynamic name resolution!  (In fact, local variables are
already determined statically.)

A special quirk of Python is that – if no @ref{4ad,,global} or @ref{14b3,,nonlocal}
statement is in effect – assignments to names always go into the innermost scope.
Assignments do not copy data — they just bind names to objects.  The same is true
for deletions: the statement @code{del x} removes the binding of @code{x} from the
namespace referenced by the local scope.  In fact, all operations that introduce
new names use the local scope: in particular, @ref{7f9,,import} statements and
function definitions bind the module or function name in the local scope.

The @ref{4ad,,global} statement can be used to indicate that particular
variables live in the global scope and should be rebound there; the
@ref{14b3,,nonlocal} statement indicates that particular variables live in
an enclosing scope and should be rebound there.

@menu
* Scopes and Namespaces Example:: 

@end menu

@node Scopes and Namespaces Example,,,Python Scopes and Namespaces
@anchor{tutorial/classes scopes-and-namespaces-example}@anchor{20d2}@anchor{tutorial/classes tut-scopeexample}@anchor{20d3}
@subsubsection Scopes and Namespaces Example


This is an example demonstrating how to reference the different scopes and
namespaces, and how @ref{4ad,,global} and @ref{14b3,,nonlocal} affect variable
binding:

@example
def scope_test():
    def do_local():
        spam = "local spam"

    def do_nonlocal():
        nonlocal spam
        spam = "nonlocal spam"

    def do_global():
        global spam
        spam = "global spam"

    spam = "test spam"
    do_local()
    print("After local assignment:", spam)
    do_nonlocal()
    print("After nonlocal assignment:", spam)
    do_global()
    print("After global assignment:", spam)

scope_test()
print("In global scope:", spam)
@end example

The output of the example code is:

@example
After local assignment: test spam
After nonlocal assignment: nonlocal spam
After global assignment: nonlocal spam
In global scope: global spam
@end example

Note how the `local' assignment (which is default) didn’t change `scope_test''s
binding of `spam'.  The @ref{14b3,,nonlocal} assignment changed `scope_test''s
binding of `spam', and the @ref{4ad,,global} assignment changed the module-level
binding.

You can also see that there was no previous binding for `spam' before the
@ref{4ad,,global} assignment.

@node A First Look at Classes,Random Remarks,Python Scopes and Namespaces,Classes
@anchor{tutorial/classes a-first-look-at-classes}@anchor{20d4}@anchor{tutorial/classes tut-firstclasses}@anchor{2060}
@subsection A First Look at Classes


Classes introduce a little bit of new syntax, three new object types, and some
new semantics.

@menu
* Class Definition Syntax:: 
* Class Objects:: 
* Instance Objects:: 
* Method Objects:: 
* Class and Instance Variables:: 

@end menu

@node Class Definition Syntax,Class Objects,,A First Look at Classes
@anchor{tutorial/classes class-definition-syntax}@anchor{20d5}@anchor{tutorial/classes tut-classdefinition}@anchor{20d6}
@subsubsection Class Definition Syntax


The simplest form of class definition looks like this:

@example
class ClassName:
    <statement-1>
    .
    .
    .
    <statement-N>
@end example

Class definitions, like function definitions (@ref{1666,,def} statements) must be
executed before they have any effect.  (You could conceivably place a class
definition in a branch of an @ref{182,,if} statement, or inside a function.)

In practice, the statements inside a class definition will usually be function
definitions, but other statements are allowed, and sometimes useful — we’ll
come back to this later.  The function definitions inside a class normally have
a peculiar form of argument list, dictated by the calling conventions for
methods — again, this is explained later.

When a class definition is entered, a new namespace is created, and used as the
local scope — thus, all assignments to local variables go into this new
namespace.  In particular, function definitions bind the name of the new
function here.

When a class definition is left normally (via the end), a `class object' is
created.  This is basically a wrapper around the contents of the namespace
created by the class definition; we’ll learn more about class objects in the
next section.  The original local scope (the one in effect just before the class
definition was entered) is reinstated, and the class object is bound here to the
class name given in the class definition header (@code{ClassName} in the
example).

@node Class Objects,Instance Objects,Class Definition Syntax,A First Look at Classes
@anchor{tutorial/classes class-objects}@anchor{20d7}@anchor{tutorial/classes tut-classobjects}@anchor{20d8}
@subsubsection Class Objects


Class objects support two kinds of operations: attribute references and
instantiation.

`Attribute references' use the standard syntax used for all attribute references
in Python: @code{obj.name}.  Valid attribute names are all the names that were in
the class’s namespace when the class object was created.  So, if the class
definition looked like this:

@example
class MyClass:
    """A simple example class"""
    i = 12345

    def f(self):
        return 'hello world'
@end example

then @code{MyClass.i} and @code{MyClass.f} are valid attribute references, returning
an integer and a function object, respectively. Class attributes can also be
assigned to, so you can change the value of @code{MyClass.i} by assignment.
@ref{20d9,,__doc__} is also a valid attribute, returning the docstring
belonging to the class: @code{"A simple example class"}.

Class `instantiation' uses function notation.  Just pretend that the class
object is a parameterless function that returns a new instance of the class.
For example (assuming the above class):

@example
x = MyClass()
@end example

creates a new `instance' of the class and assigns this object to the local
variable @code{x}.

The instantiation operation (“calling” a class object) creates an empty object.
Many classes like to create objects with instances customized to a specific
initial state. Therefore a class may define a special method named
@ref{8c1,,__init__()}, like this:

@example
def __init__(self):
    self.data = []
@end example

When a class defines an @ref{8c1,,__init__()} method, class instantiation
automatically invokes @code{__init__()} for the newly created class instance.  So
in this example, a new, initialized instance can be obtained by:

@example
x = MyClass()
@end example

Of course, the @ref{8c1,,__init__()} method may have arguments for greater
flexibility.  In that case, arguments given to the class instantiation operator
are passed on to @code{__init__()}.  For example,

@example
>>> class Complex:
...     def __init__(self, realpart, imagpart):
...         self.r = realpart
...         self.i = imagpart
...
>>> x = Complex(3.0, -4.5)
>>> x.r, x.i
(3.0, -4.5)
@end example

@node Instance Objects,Method Objects,Class Objects,A First Look at Classes
@anchor{tutorial/classes instance-objects}@anchor{20da}@anchor{tutorial/classes tut-instanceobjects}@anchor{20db}
@subsubsection Instance Objects


Now what can we do with instance objects?  The only operations understood by
instance objects are attribute references.  There are two kinds of valid
attribute names: data attributes and methods.

`Data attributes' correspond to “instance variables” in Smalltalk, and to “data
members” in C++.  Data attributes need not be declared; like local variables,
they spring into existence when they are first assigned to.  For example, if
@code{x} is the instance of @code{MyClass} created above, the following piece of
code will print the value @code{16}, without leaving a trace:

@example
x.counter = 1
while x.counter < 10:
    x.counter = x.counter * 2
print(x.counter)
del x.counter
@end example

The other kind of instance attribute reference is a `method'. A method is a
function that “belongs to” an object.

@geindex object; method

Valid method names of an instance object depend on its class.  By definition,
all attributes of a class that are function  objects define corresponding
methods of its instances.  So in our example, @code{x.f} is a valid method
reference, since @code{MyClass.f} is a function, but @code{x.i} is not, since
@code{MyClass.i} is not.  But @code{x.f} is not the same thing as @code{MyClass.f} — it
is a `method object', not a function object.

@node Method Objects,Class and Instance Variables,Instance Objects,A First Look at Classes
@anchor{tutorial/classes method-objects}@anchor{20dc}@anchor{tutorial/classes tut-methodobjects}@anchor{20dd}
@subsubsection Method Objects


Usually, a method is called right after it is bound:

@example
x.f()
@end example

If @code{x = MyClass()}, as above, this will return the string @code{'hello world'}.
However, it is not necessary to call a method right away: @code{x.f} is a method
object, and can be stored away and called at a later time.  For example:

@example
xf = x.f
while True:
    print(xf())
@end example

will continue to print @code{hello world} until the end of time.

What exactly happens when a method is called?  You may have noticed that
@code{x.f()} was called without an argument above, even though the function
definition for @code{f()} specified an argument.  What happened to the argument?
Surely Python raises an exception when a function that requires an argument is
called without any — even if the argument isn’t actually used…

Actually, you may have guessed the answer: the special thing about methods is
that the instance object is passed as the first argument of the function.  In our
example, the call @code{x.f()} is exactly equivalent to @code{MyClass.f(x)}.  In
general, calling a method with a list of `n' arguments is equivalent to calling
the corresponding function with an argument list that is created by inserting
the method’s instance object before the first argument.

In general, methods work as follows.  When a non-data attribute
of an instance is referenced, the instance’s class is searched.
If the name denotes a valid class attribute that is a function object,
references to both the instance object and the function object
are packed into a method object.  When the method object is called
with an argument list, a new argument list is constructed from the instance
object and the argument list, and the function object is called with this new
argument list.

@node Class and Instance Variables,,Method Objects,A First Look at Classes
@anchor{tutorial/classes class-and-instance-variables}@anchor{20de}@anchor{tutorial/classes tut-class-and-instance-variables}@anchor{20df}
@subsubsection Class and Instance Variables


Generally speaking, instance variables are for data unique to each instance
and class variables are for attributes and methods shared by all instances
of the class:

@example
class Dog:

    kind = 'canine'         # class variable shared by all instances

    def __init__(self, name):
        self.name = name    # instance variable unique to each instance

>>> d = Dog('Fido')
>>> e = Dog('Buddy')
>>> d.kind                  # shared by all dogs
'canine'
>>> e.kind                  # shared by all dogs
'canine'
>>> d.name                  # unique to d
'Fido'
>>> e.name                  # unique to e
'Buddy'
@end example

As discussed in @ref{20cf,,A Word About Names and Objects}, shared data can have possibly surprising
effects involving @ref{2027,,mutable} objects such as lists and dictionaries.
For example, the `tricks' list in the following code should not be used as a
class variable because just a single list would be shared by all `Dog'
instances:

@example
class Dog:

    tricks = []             # mistaken use of a class variable

    def __init__(self, name):
        self.name = name

    def add_trick(self, trick):
        self.tricks.append(trick)

>>> d = Dog('Fido')
>>> e = Dog('Buddy')
>>> d.add_trick('roll over')
>>> e.add_trick('play dead')
>>> d.tricks                # unexpectedly shared by all dogs
['roll over', 'play dead']
@end example

Correct design of the class should use an instance variable instead:

@example
class Dog:

    def __init__(self, name):
        self.name = name
        self.tricks = []    # creates a new empty list for each dog

    def add_trick(self, trick):
        self.tricks.append(trick)

>>> d = Dog('Fido')
>>> e = Dog('Buddy')
>>> d.add_trick('roll over')
>>> e.add_trick('play dead')
>>> d.tricks
['roll over']
>>> e.tricks
['play dead']
@end example

@node Random Remarks,Inheritance,A First Look at Classes,Classes
@anchor{tutorial/classes random-remarks}@anchor{20e0}@anchor{tutorial/classes tut-remarks}@anchor{20e1}
@subsection Random Remarks


@c These should perhaps be placed more carefully...

If the same attribute name occurs in both an instance and in a class,
then attribute lookup prioritizes the instance:

@example
>>> class Warehouse:
...    purpose = 'storage'
...    region = 'west'
...
>>> w1 = Warehouse()
>>> print(w1.purpose, w1.region)
storage west
>>> w2 = Warehouse()
>>> w2.region = 'east'
>>> print(w2.purpose, w2.region)
storage east
@end example

Data attributes may be referenced by methods as well as by ordinary users
(“clients”) of an object.  In other words, classes are not usable to implement
pure abstract data types.  In fact, nothing in Python makes it possible to
enforce data hiding — it is all based upon convention.  (On the other hand,
the Python implementation, written in C, can completely hide implementation
details and control access to an object if necessary; this can be used by
extensions to Python written in C.)

Clients should use data attributes with care — clients may mess up invariants
maintained by the methods by stamping on their data attributes.  Note that
clients may add data attributes of their own to an instance object without
affecting the validity of the methods, as long as name conflicts are avoided —
again, a naming convention can save a lot of headaches here.

There is no shorthand for referencing data attributes (or other methods!) from
within methods.  I find that this actually increases the readability of methods:
there is no chance of confusing local variables and instance variables when
glancing through a method.

Often, the first argument of a method is called @code{self}.  This is nothing more
than a convention: the name @code{self} has absolutely no special meaning to
Python.  Note, however, that by not following the convention your code may be
less readable to other Python programmers, and it is also conceivable that a
`class browser' program might be written that relies upon such a convention.

Any function object that is a class attribute defines a method for instances of
that class.  It is not necessary that the function definition is textually
enclosed in the class definition: assigning a function object to a local
variable in the class is also ok.  For example:

@example
# Function defined outside the class
def f1(self, x, y):
    return min(x, x+y)

class C:
    f = f1

    def g(self):
        return 'hello world'

    h = g
@end example

Now @code{f}, @code{g} and @code{h} are all attributes of class @code{C} that refer to
function objects, and consequently they are all methods of instances of
@code{C} — @code{h} being exactly equivalent to @code{g}.  Note that this practice
usually only serves to confuse the reader of a program.

Methods may call other methods by using method attributes of the @code{self}
argument:

@example
class Bag:
    def __init__(self):
        self.data = []

    def add(self, x):
        self.data.append(x)

    def addtwice(self, x):
        self.add(x)
        self.add(x)
@end example

Methods may reference global names in the same way as ordinary functions.  The
global scope associated with a method is the module containing its
definition.  (A class is never used as a global scope.)  While one
rarely encounters a good reason for using global data in a method, there are
many legitimate uses of the global scope: for one thing, functions and modules
imported into the global scope can be used by methods, as well as functions and
classes defined in it.  Usually, the class containing the method is itself
defined in this global scope, and in the next section we’ll find some good
reasons why a method would want to reference its own class.

Each value is an object, and therefore has a `class' (also called its `type').
It is stored as @code{object.__class__}.

@node Inheritance,Private Variables,Random Remarks,Classes
@anchor{tutorial/classes inheritance}@anchor{20e2}@anchor{tutorial/classes tut-inheritance}@anchor{20e3}
@subsection Inheritance


Of course, a language feature would not be worthy of the name “class” without
supporting inheritance.  The syntax for a derived class definition looks like
this:

@example
class DerivedClassName(BaseClassName):
    <statement-1>
    .
    .
    .
    <statement-N>
@end example

The name @code{BaseClassName} must be defined in a
namespace accessible from the scope containing the
derived class definition.  In place of a base class name, other arbitrary
expressions are also allowed.  This can be useful, for example, when the base
class is defined in another module:

@example
class DerivedClassName(modname.BaseClassName):
@end example

Execution of a derived class definition proceeds the same as for a base class.
When the class object is constructed, the base class is remembered.  This is
used for resolving attribute references: if a requested attribute is not found
in the class, the search proceeds to look in the base class.  This rule is
applied recursively if the base class itself is derived from some other class.

There’s nothing special about instantiation of derived classes:
@code{DerivedClassName()} creates a new instance of the class.  Method references
are resolved as follows: the corresponding class attribute is searched,
descending down the chain of base classes if necessary, and the method reference
is valid if this yields a function object.

Derived classes may override methods of their base classes.  Because methods
have no special privileges when calling other methods of the same object, a
method of a base class that calls another method defined in the same base class
may end up calling a method of a derived class that overrides it.  (For C++
programmers: all methods in Python are effectively @code{virtual}.)

An overriding method in a derived class may in fact want to extend rather than
simply replace the base class method of the same name. There is a simple way to
call the base class method directly: just call @code{BaseClassName.methodname(self,
arguments)}.  This is occasionally useful to clients as well.  (Note that this
only works if the base class is accessible as @code{BaseClassName} in the global
scope.)

Python has two built-in functions that work with inheritance:


@itemize *

@item 
Use @ref{2af,,isinstance()} to check an instance’s type: @code{isinstance(obj, int)}
will be @code{True} only if @code{obj.__class__} is @ref{19c,,int} or some class
derived from @code{int}.

@item 
Use @ref{9ca,,issubclass()} to check class inheritance: @code{issubclass(bool, int)}
is @code{True} since @ref{3c1,,bool} is a subclass of @ref{19c,,int}.  However,
@code{issubclass(float, int)} is @code{False} since @ref{197,,float} is not a
subclass of @code{int}.
@end itemize

@menu
* Multiple Inheritance:: 

@end menu

@node Multiple Inheritance,,,Inheritance
@anchor{tutorial/classes multiple-inheritance}@anchor{20e4}@anchor{tutorial/classes tut-multiple}@anchor{20e5}
@subsubsection Multiple Inheritance


Python supports a form of multiple inheritance as well.  A class definition with
multiple base classes looks like this:

@example
class DerivedClassName(Base1, Base2, Base3):
    <statement-1>
    .
    .
    .
    <statement-N>
@end example

For most purposes, in the simplest cases, you can think of the search for
attributes inherited from a parent class as depth-first, left-to-right, not
searching twice in the same class where there is an overlap in the hierarchy.
Thus, if an attribute is not found in @code{DerivedClassName}, it is searched
for in @code{Base1}, then (recursively) in the base classes of @code{Base1},
and if it was not found there, it was searched for in @code{Base2}, and so on.

In fact, it is slightly more complex than that; the method resolution order
changes dynamically to support cooperative calls to @ref{1a7,,super()}.  This
approach is known in some other multiple-inheritance languages as
call-next-method and is more powerful than the super call found in
single-inheritance languages.

Dynamic ordering is necessary because all cases of multiple inheritance exhibit
one or more diamond relationships (where at least one of the parent classes
can be accessed through multiple paths from the bottommost class).  For example,
all classes inherit from @ref{c84,,object}, so any case of multiple inheritance
provides more than one path to reach @code{object}.  To keep the base classes
from being accessed more than once, the dynamic algorithm linearizes the search
order in a way that preserves the left-to-right ordering specified in each
class, that calls each parent only once, and that is monotonic (meaning that a
class can be subclassed without affecting the precedence order of its parents).
Taken together, these properties make it possible to design reliable and
extensible classes with multiple inheritance.  For more detail, see
@ref{16b6,,The Python 2.3 Method Resolution Order}.

@node Private Variables,Odds and Ends,Inheritance,Classes
@anchor{tutorial/classes private-variables}@anchor{20e6}@anchor{tutorial/classes tut-private}@anchor{20cd}
@subsection Private Variables


“Private” instance variables that cannot be accessed except from inside an
object don’t exist in Python.  However, there is a convention that is followed
by most Python code: a name prefixed with an underscore (e.g. @code{_spam}) should
be treated as a non-public part of the API (whether it is a function, a method
or a data member).  It should be considered an implementation detail and subject
to change without notice.

@geindex name; mangling

Since there is a valid use-case for class-private members (namely to avoid name
clashes of names with names defined by subclasses), there is limited support for
such a mechanism, called `name mangling'.  Any identifier of the form
@code{__spam} (at least two leading underscores, at most one trailing underscore)
is textually replaced with @code{_classname__spam}, where @code{classname} is the
current class name with leading underscore(s) stripped.  This mangling is done
without regard to the syntactic position of the identifier, as long as it
occurs within the definition of a class.


@subsubheading See also


The @ref{20e7,,private name mangling specifications}
for details and special cases.


Name mangling is helpful for letting subclasses override methods without
breaking intraclass method calls.  For example:

@example
class Mapping:
    def __init__(self, iterable):
        self.items_list = []
        self.__update(iterable)

    def update(self, iterable):
        for item in iterable:
            self.items_list.append(item)

    __update = update   # private copy of original update() method

class MappingSubclass(Mapping):

    def update(self, keys, values):
        # provides new signature for update()
        # but does not break __init__()
        for item in zip(keys, values):
            self.items_list.append(item)
@end example

The above example would work even if @code{MappingSubclass} were to introduce a
@code{__update} identifier since it is replaced with @code{_Mapping__update} in the
@code{Mapping} class  and @code{_MappingSubclass__update} in the @code{MappingSubclass}
class respectively.

Note that the mangling rules are designed mostly to avoid accidents; it still is
possible to access or modify a variable that is considered private.  This can
even be useful in special circumstances, such as in the debugger.

Notice that code passed to @code{exec()} or @code{eval()} does not consider the
classname of the invoking class to be the current class; this is similar to the
effect of the @code{global} statement, the effect of which is likewise restricted
to code that is byte-compiled together.  The same restriction applies to
@code{getattr()}, @code{setattr()} and @code{delattr()}, as well as when referencing
@code{__dict__} directly.

@node Odds and Ends,Iterators,Private Variables,Classes
@anchor{tutorial/classes odds-and-ends}@anchor{20e8}@anchor{tutorial/classes tut-odds}@anchor{20e9}
@subsection Odds and Ends


Sometimes it is useful to have a data type similar to the Pascal “record” or C
“struct”, bundling together a few named data items. The idiomatic approach
is to use @ref{33,,dataclasses} for this purpose:

@example
from dataclasses import dataclass

@@dataclass
class Employee:
    name: str
    dept: str
    salary: int
@end example

@example
>>> john = Employee('john', 'computer lab', 1000)
>>> john.dept
'computer lab'
>>> john.salary
1000
@end example

A piece of Python code that expects a particular abstract data type can often be
passed a class that emulates the methods of that data type instead.  For
instance, if you have a function that formats some data from a file object, you
can define a class with methods @ref{20b0,,read()} and
@ref{20ea,,readline()} that get the
data from a string buffer instead, and pass it as an argument.

@c (Unfortunately, this technique has its limitations: a class can't define
@c operations that are accessed by special syntax such as sequence subscripting
@c or arithmetic operators, and assigning such a "pseudo-file" to sys.stdin will
@c not cause the interpreter to read further input from it.)

@ref{20eb,,Instance method objects} have attributes, too:
@ref{15d4,,m.__self__} is the instance
object with the method @code{m()}, and @ref{1508,,m.__func__} is
the @ref{59c,,function object}
corresponding to the method.

@node Iterators,Generators,Odds and Ends,Classes
@anchor{tutorial/classes iterators}@anchor{20ec}@anchor{tutorial/classes tut-iterators}@anchor{20ed}
@subsection Iterators


By now you have probably noticed that most container objects can be looped over
using a @ref{348,,for} statement:

@example
for element in [1, 2, 3]:
    print(element)
for element in (1, 2, 3):
    print(element)
for key in @{'one':1, 'two':2@}:
    print(key)
for char in "123":
    print(char)
for line in open("myfile.txt"):
    print(line, end='@w{'})
@end example

This style of access is clear, concise, and convenient.  The use of iterators
pervades and unifies Python.  Behind the scenes, the @ref{348,,for} statement
calls @ref{9dd,,iter()} on the container object.  The function returns an iterator
object that defines the method @ref{14d9,,__next__()} which accesses
elements in the container one at a time.  When there are no more elements,
@code{__next__()} raises a @ref{dfb,,StopIteration} exception which tells the
@code{for} loop to terminate.  You can call the @code{__next__()} method
using the @ref{9de,,next()} built-in function; this example shows how it all works:

@example
>>> s = 'abc'
>>> it = iter(s)
>>> it
<str_iterator object at 0x10c90e650>
>>> next(it)
'a'
>>> next(it)
'b'
>>> next(it)
'c'
>>> next(it)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
    next(it)
StopIteration
@end example

Having seen the mechanics behind the iterator protocol, it is easy to add
iterator behavior to your classes.  Define an @ref{20ee,,__iter__()} method which
returns an object with a @ref{14d9,,__next__()} method.  If the class
defines @code{__next__()}, then @code{__iter__()} can just return @code{self}:

@example
class Reverse:
    """Iterator for looping over a sequence backwards."""
    def __init__(self, data):
        self.data = data
        self.index = len(data)

    def __iter__(self):
        return self

    def __next__(self):
        if self.index == 0:
            raise StopIteration
        self.index = self.index - 1
        return self.data[self.index]
@end example

@example
>>> rev = Reverse('spam')
>>> iter(rev)
<__main__.Reverse object at 0x00A1DB50>
>>> for char in rev:
...     print(char)
...
m
a
p
s
@end example

@node Generators,Generator Expressions,Iterators,Classes
@anchor{tutorial/classes generators}@anchor{20ef}@anchor{tutorial/classes tut-generators}@anchor{20f0}
@subsection Generators


@ref{1267,,Generators} are a simple and powerful tool for creating iterators.  They
are written like regular functions but use the @ref{bc8,,yield} statement
whenever they want to return data.  Each time @ref{9de,,next()} is called on it, the
generator resumes where it left off (it remembers all the data values and which
statement was last executed).  An example shows that generators can be trivially
easy to create:

@example
def reverse(data):
    for index in range(len(data)-1, -1, -1):
        yield data[index]
@end example

@example
>>> for char in reverse('golf'):
...     print(char)
...
f
l
o
g
@end example

Anything that can be done with generators can also be done with class-based
iterators as described in the previous section.  What makes generators so
compact is that the @ref{20f1,,__iter__()} and @ref{20f2,,__next__()} methods
are created automatically.

Another key feature is that the local variables and execution state are
automatically saved between calls.  This made the function easier to write and
much more clear than an approach using instance variables like @code{self.index}
and @code{self.data}.

In addition to automatic method creation and saving program state, when
generators terminate, they automatically raise @ref{dfb,,StopIteration}. In
combination, these features make it easy to create iterators with no more effort
than writing a regular function.

@node Generator Expressions,,Generators,Classes
@anchor{tutorial/classes generator-expressions}@anchor{20f3}@anchor{tutorial/classes tut-genexps}@anchor{20f4}
@subsection Generator Expressions


Some simple generators can be coded succinctly as expressions using a syntax
similar to list comprehensions but with parentheses instead of square brackets.
These expressions are designed for situations where the generator is used right
away by an enclosing function.  Generator expressions are more compact but less
versatile than full generator definitions and tend to be more memory friendly
than equivalent list comprehensions.

Examples:

@example
>>> sum(i*i for i in range(10))                 # sum of squares
285

>>> xvec = [10, 20, 30]
>>> yvec = [7, 5, 3]
>>> sum(x*y for x,y in zip(xvec, yvec))         # dot product
260

>>> unique_words = set(word for line in page  for word in line.split())

>>> valedictorian = max((student.gpa, student.name) for student in graduates)

>>> data = 'golf'
>>> list(data[i] for i in range(len(data)-1, -1, -1))
['f', 'l', 'o', 'g']
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Brief tour of the standard library,Brief tour of the standard library — part II,Classes,The Python Tutorial
@anchor{tutorial/stdlib doc}@anchor{20f5}@anchor{tutorial/stdlib brief-tour-of-the-standard-library}@anchor{20f6}@anchor{tutorial/stdlib translation-repo}@anchor{20f7}@anchor{tutorial/stdlib tut-brieftour}@anchor{20f8}
@section Brief tour of the standard library


@menu
* Operating system interface:: 
* File wildcards:: 
* Command-line arguments:: 
* Error output redirection and program termination:: 
* String pattern matching:: 
* Mathematics:: 
* Internet access:: 
* Dates and times:: 
* Data compression:: 
* Performance measurement:: 
* Quality control:: 
* Batteries included:: 

@end menu

@node Operating system interface,File wildcards,,Brief tour of the standard library
@anchor{tutorial/stdlib operating-system-interface}@anchor{20f9}@anchor{tutorial/stdlib tut-os-interface}@anchor{20fa}
@subsection Operating system interface


The @ref{a5,,os} module provides dozens of functions for interacting with the
operating system:

@example
>>> import os
>>> os.getcwd()      # Return the current working directory
'C:\\Python314'
>>> os.chdir('/server/accesslogs')   # Change current working directory
>>> os.system('mkdir today')   # Run the command mkdir in the system shell
0
@end example

Be sure to use the @code{import os} style instead of @code{from os import *}.  This
will keep @ref{f98,,os.open()} from shadowing the built-in @ref{318,,open()} function which
operates much differently.

@geindex built-in function; help

The built-in @ref{845,,dir()} and @ref{ada,,help()} functions are useful as interactive
aids for working with large modules like @ref{a5,,os}:

@example
>>> import os
>>> dir(os)
<returns a list of all module functions>
>>> help(os)
<returns an extensive manual page created from the module's docstrings>
@end example

For daily file and directory management tasks, the @ref{ca,,shutil} module provides
a higher level interface that is easier to use:

@example
>>> import shutil
>>> shutil.copyfile('data.db', 'archive.db')
'archive.db'
>>> shutil.move('/build/executables', 'installdir')
'installdir'
@end example

@node File wildcards,Command-line arguments,Operating system interface,Brief tour of the standard library
@anchor{tutorial/stdlib file-wildcards}@anchor{20fb}@anchor{tutorial/stdlib tut-file-wildcards}@anchor{20fc}
@subsection File wildcards


The @ref{68,,glob} module provides a function for making file lists from directory
wildcard searches:

@example
>>> import glob
>>> glob.glob('*.py')
['primes.py', 'random.py', 'quote.py']
@end example

@node Command-line arguments,Error output redirection and program termination,File wildcards,Brief tour of the standard library
@anchor{tutorial/stdlib command-line-arguments}@anchor{20fd}@anchor{tutorial/stdlib tut-command-line-arguments}@anchor{20fe}
@subsection Command-line arguments


Common utility scripts often need to process command line arguments. These
arguments are stored in the @ref{df,,sys} module’s `argv' attribute as a list.  For
instance, let’s take the following @code{demo.py} file:

@example
# File demo.py
import sys
print(sys.argv)
@end example

Here is the output from running @code{python demo.py one two three} at the command
line:

@example
['demo.py', 'one', 'two', 'three']
@end example

The @ref{7,,argparse} module provides a more sophisticated mechanism to process
command line arguments.  The following script extracts one or more filenames
and an optional number of lines to be displayed:

@example
import argparse

parser = argparse.ArgumentParser(
    prog='top',
    description='Show top lines from each file')
parser.add_argument('filenames', nargs='+')
parser.add_argument('-l', '--lines', type=int, default=10)
args = parser.parse_args()
print(args)
@end example

When run at the command line with @code{python top.py --lines=5 alpha.txt
beta.txt}, the script sets @code{args.lines} to @code{5} and @code{args.filenames}
to @code{['alpha.txt', 'beta.txt']}.

@node Error output redirection and program termination,String pattern matching,Command-line arguments,Brief tour of the standard library
@anchor{tutorial/stdlib error-output-redirection-and-program-termination}@anchor{20ff}@anchor{tutorial/stdlib tut-stderr}@anchor{2100}
@subsection Error output redirection and program termination


The @ref{df,,sys} module also has attributes for `stdin', `stdout', and `stderr'.
The latter is useful for emitting warnings and error messages to make them
visible even when `stdout' has been redirected:

@example
>>> sys.stderr.write('Warning, log file not found starting a new one\n')
Warning, log file not found starting a new one
@end example

The most direct way to terminate a script is to use @code{sys.exit()}.

@node String pattern matching,Mathematics,Error output redirection and program termination,Brief tour of the standard library
@anchor{tutorial/stdlib string-pattern-matching}@anchor{2101}@anchor{tutorial/stdlib tut-string-pattern-matching}@anchor{2102}
@subsection String pattern matching


The @ref{be,,re} module provides regular expression tools for advanced string
processing. For complex matching and manipulation, regular expressions offer
succinct, optimized solutions:

@example
>>> import re
>>> re.findall(r'\bf[a-z]*', 'which foot or hand fell fastest')
['foot', 'fell', 'fastest']
>>> re.sub(r'(\b[a-z]+) \1', r'\1', 'cat in the the hat')
'cat in the hat'
@end example

When only simple capabilities are needed, string methods are preferred because
they are easier to read and debug:

@example
>>> 'tea for too'.replace('too', 'two')
'tea for two'
@end example

@node Mathematics,Internet access,String pattern matching,Brief tour of the standard library
@anchor{tutorial/stdlib mathematics}@anchor{2103}@anchor{tutorial/stdlib tut-mathematics}@anchor{2104}
@subsection Mathematics


The @ref{92,,math} module gives access to the underlying C library functions for
floating-point math:

@example
>>> import math
>>> math.cos(math.pi / 4)
0.70710678118654757
>>> math.log(1024, 2)
10.0
@end example

The @ref{bd,,random} module provides tools for making random selections:

@example
>>> import random
>>> random.choice(['apple', 'pear', 'banana'])
'apple'
>>> random.sample(range(100), 10)   # sampling without replacement
[30, 83, 16, 4, 8, 81, 41, 50, 18, 33]
>>> random.random()    # random float from the interval [0.0, 1.0)
0.17970987693706186
>>> random.randrange(6)    # random integer chosen from range(6)
4
@end example

The @ref{d7,,statistics} module calculates basic statistical properties
(the mean, median, variance, etc.) of numeric data:

@example
>>> import statistics
>>> data = [2.75, 1.75, 1.25, 0.25, 0.5, 1.25, 3.5]
>>> statistics.mean(data)
1.6071428571428572
>>> statistics.median(data)
1.25
>>> statistics.variance(data)
1.3720238095238095
@end example

The SciPy project <@indicateurl{https://scipy.org}> has many other modules for numerical
computations.

@node Internet access,Dates and times,Mathematics,Brief tour of the standard library
@anchor{tutorial/stdlib internet-access}@anchor{2105}@anchor{tutorial/stdlib tut-internet-access}@anchor{2106}
@subsection Internet access


There are a number of modules for accessing the internet and processing internet
protocols. Two of the simplest are @ref{112,,urllib.request} for retrieving data
from URLs and @ref{cf,,smtplib} for sending mail:

@example
>>> from urllib.request import urlopen
>>> with urlopen('https://docs.python.org/3/') as response:
...     for line in response:
...         line = line.decode()             # Convert bytes to a str
...         if 'updated' in line:
...             print(line.rstrip())         # Remove trailing newline
...
      Last updated on Nov 11, 2025 (20:11 UTC).

>>> import smtplib
>>> server = smtplib.SMTP('localhost')
>>> server.sendmail('soothsayer@@example.org', 'jcaesar@@example.org',
... """To: jcaesar@@example.org
... From: soothsayer@@example.org
...
... Beware the Ides of March.
... """)
>>> server.quit()
@end example

(Note that the second example needs a mailserver running on localhost.)

@node Dates and times,Data compression,Internet access,Brief tour of the standard library
@anchor{tutorial/stdlib dates-and-times}@anchor{2107}@anchor{tutorial/stdlib tut-dates-and-times}@anchor{2108}
@subsection Dates and times


The @ref{34,,datetime} module supplies classes for manipulating dates and times in
both simple and complex ways. While date and time arithmetic is supported, the
focus of the implementation is on efficient member extraction for output
formatting and manipulation.  The module also supports objects that are timezone
aware.

@example
>>> # dates are easily constructed and formatted
>>> import datetime as dt
>>> now = dt.date.today()
>>> now
datetime.date(2003, 12, 2)
>>> now.strftime("%m-%d-%y. %d %b %Y is a %A on the %d day of %B.")
'12-02-03. 02 Dec 2003 is a Tuesday on the 02 day of December.'

>>> # dates support calendar arithmetic
>>> birthday = dt.date(1964, 7, 31)
>>> age = now - birthday
>>> age.days
14368
@end example

@node Data compression,Performance measurement,Dates and times,Brief tour of the standard library
@anchor{tutorial/stdlib data-compression}@anchor{2109}@anchor{tutorial/stdlib tut-data-compression}@anchor{210a}
@subsection Data compression


Common data archiving and compression formats are directly supported by modules
including: @ref{13a,,zlib}, @ref{6b,,gzip}, @ref{14,,bz2}, @ref{8e,,lzma}, @ref{138,,zipfile} and
@ref{e4,,tarfile}.

@example
>>> import zlib
>>> s = b'witch which has which witches wrist watch'
>>> len(s)
41
>>> t = zlib.compress(s)
>>> len(t)
37
>>> zlib.decompress(t)
b'witch which has which witches wrist watch'
>>> zlib.crc32(s)
226805979
@end example

@node Performance measurement,Quality control,Data compression,Brief tour of the standard library
@anchor{tutorial/stdlib performance-measurement}@anchor{210b}@anchor{tutorial/stdlib tut-performance-measurement}@anchor{210c}
@subsection Performance measurement


Some Python users develop a deep interest in knowing the relative performance of
different approaches to the same problem. Python provides a measurement tool
that answers those questions immediately.

For example, it may be tempting to use the tuple packing and unpacking feature
instead of the traditional approach to swapping arguments. The @ref{f5,,timeit}
module quickly demonstrates a modest performance advantage:

@example
>>> from timeit import Timer
>>> Timer('t=a; a=b; b=t', 'a=1; b=2').timeit()
0.57535828626024577
>>> Timer('a,b = b,a', 'a=1; b=2').timeit()
0.54962537085770791
@end example

In contrast to @ref{f5,,timeit}’s fine level of granularity, the @ref{b4,,profile} and
@ref{b5,,pstats} modules provide tools for identifying time critical sections in
larger blocks of code.

@node Quality control,Batteries included,Performance measurement,Brief tour of the standard library
@anchor{tutorial/stdlib quality-control}@anchor{210d}@anchor{tutorial/stdlib tut-quality-control}@anchor{210e}
@subsection Quality control


One approach for developing high quality software is to write tests for each
function as it is developed and to run those tests frequently during the
development process.

The @ref{3e,,doctest} module provides a tool for scanning a module and validating
tests embedded in a program’s docstrings.  Test construction is as simple as
cutting-and-pasting a typical call along with its results into the docstring.
This improves the documentation by providing the user with an example and it
allows the doctest module to make sure the code remains true to the
documentation:

@example
def average(values):
    """Computes the arithmetic mean of a list of numbers.

    >>> print(average([20, 30, 70]))
    40.0
    """
    return sum(values) / len(values)

import doctest
doctest.testmod()   # automatically validate the embedded tests
@end example

The @ref{10d,,unittest} module is not as effortless as the @ref{3e,,doctest} module,
but it allows a more comprehensive set of tests to be maintained in a separate
file:

@example
import unittest

class TestStatisticalFunctions(unittest.TestCase):

    def test_average(self):
        self.assertEqual(average([20, 30, 70]), 40.0)
        self.assertEqual(round(average([1, 5, 7]), 1), 4.3)
        with self.assertRaises(ZeroDivisionError):
            average([])
        with self.assertRaises(TypeError):
            average(20, 30, 70)

unittest.main()  # Calling from the command line invokes all tests
@end example

@node Batteries included,,Quality control,Brief tour of the standard library
@anchor{tutorial/stdlib batteries-included}@anchor{210f}@anchor{tutorial/stdlib tut-batteries-included}@anchor{2110}
@subsection Batteries included


Python has a “batteries included” philosophy.  This is best seen through the
sophisticated and robust capabilities of its larger packages. For example:


@itemize *

@item 
The @ref{135,,xmlrpc.client} and @ref{136,,xmlrpc.server} modules make implementing
remote procedure calls into an almost trivial task.  Despite the modules’
names, no direct knowledge or handling of XML is needed.

@item 
The @ref{3f,,email} package is a library for managing email messages, including
MIME and other 
@geindex RFC; RFC 5322
RFC 5322@footnote{https://datatracker.ietf.org/doc/html/rfc5322.html}-based message documents. Unlike @ref{cf,,smtplib} and
@ref{b1,,poplib} which actually send and receive messages, the email package has
a complete toolset for building or decoding complex message structures
(including attachments) and for implementing internet encoding and header
protocols.

@item 
The @ref{86,,json} package provides robust support for parsing this
popular data interchange format.  The @ref{2d,,csv} module supports
direct reading and writing of files in Comma-Separated Value format,
commonly supported by databases and spreadsheets.  XML processing is
supported by the @ref{12c,,xml.etree.ElementTree}, @ref{128,,xml.dom} and
@ref{130,,xml.sax} packages. Together, these modules and packages
greatly simplify data interchange between Python applications and
other tools.

@item 
The @ref{d4,,sqlite3} module is a wrapper for the SQLite database
library, providing a persistent database that can be updated and
accessed using slightly nonstandard SQL syntax.

@item 
Internationalization is supported by a number of modules including
@ref{67,,gettext}, @ref{8a,,locale}, and the @ref{1c,,codecs} package.
@end itemize

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Brief tour of the standard library — part II,Virtual Environments and Packages,Brief tour of the standard library,The Python Tutorial
@anchor{tutorial/stdlib2 doc}@anchor{2111}@anchor{tutorial/stdlib2 brief-tour-of-the-standard-library-part-ii}@anchor{2112}@anchor{tutorial/stdlib2 translation-repo}@anchor{2113}@anchor{tutorial/stdlib2 tut-brieftourtwo}@anchor{2114}
@section Brief tour of the standard library — part II


This second tour covers more advanced modules that support professional
programming needs.  These modules rarely occur in small scripts.

@menu
* Output formatting:: 
* Templating:: 
* Working with binary data record layouts:: 
* Multi-threading: Multi-threading<2>. 
* Logging:: 
* Weak references:: 
* Tools for working with lists:: 
* Decimal floating-point arithmetic:: 

@end menu

@node Output formatting,Templating,,Brief tour of the standard library — part II
@anchor{tutorial/stdlib2 output-formatting}@anchor{2115}@anchor{tutorial/stdlib2 tut-output-formatting}@anchor{2116}
@subsection Output formatting


The @ref{c0,,reprlib} module provides a version of @ref{1c3,,repr()} customized for
abbreviated displays of large or deeply nested containers:

@example
>>> import reprlib
>>> reprlib.repr(set('supercalifragilisticexpialidocious'))
"@{'a', 'c', 'd', 'e', 'f', 'g', ...@}"
@end example

The @ref{b3,,pprint} module offers more sophisticated control over printing both
built-in and user defined objects in a way that is readable by the interpreter.
When the result is longer than one line, the “pretty printer” adds line breaks
and indentation to more clearly reveal data structure:

@example
>>> import pprint
>>> t = [[[['black', 'cyan'], 'white', ['green', 'red']], [['magenta',
...     'yellow'], 'blue']]]
...
>>> pprint.pprint(t, width=30)
[[[['black', 'cyan'],
   'white',
   ['green', 'red']],
  [['magenta', 'yellow'],
   'blue']]]
@end example

The @ref{f2,,textwrap} module formats paragraphs of text to fit a given screen
width:

@example
>>> import textwrap
>>> doc = """The wrap() method is just like fill() except that it returns
... a list of strings instead of one big string with newlines to separate
... the wrapped lines."""
...
>>> print(textwrap.fill(doc, width=40))
The wrap() method is just like fill()
except that it returns a list of strings
instead of one big string with newlines
to separate the wrapped lines.
@end example

The @ref{8a,,locale} module accesses a database of culture specific data formats.
The grouping attribute of locale’s format function provides a direct way of
formatting numbers with group separators:

@example
>>> import locale
>>> locale.setlocale(locale.LC_ALL, 'English_United States.1252')
'English_United States.1252'
>>> conv = locale.localeconv()          # get a mapping of conventions
>>> x = 1234567.8
>>> locale.format_string("%d", x, grouping=True)
'1,234,567'
>>> locale.format_string("%s%.*f", (conv['currency_symbol'],
...                      conv['frac_digits'], x), grouping=True)
'$1,234,567.80'
@end example

@node Templating,Working with binary data record layouts,Output formatting,Brief tour of the standard library — part II
@anchor{tutorial/stdlib2 templating}@anchor{2117}@anchor{tutorial/stdlib2 tut-templating}@anchor{2118}
@subsection Templating


The @ref{d8,,string} module includes a versatile @ref{899,,Template} class
with a simplified syntax suitable for editing by end-users.  This allows users
to customize their applications without having to alter the application.

The format uses placeholder names formed by @code{$} with valid Python identifiers
(alphanumeric characters and underscores).  Surrounding the placeholder with
braces allows it to be followed by more alphanumeric letters with no intervening
spaces.  Writing @code{$$} creates a single escaped @code{$}:

@example
>>> from string import Template
>>> t = Template('$@{village@}folk send $$10 to $cause.')
>>> t.substitute(village='Nottingham', cause='the ditch fund')
'Nottinghamfolk send $10 to the ditch fund.'
@end example

The @ref{2119,,substitute()} method raises a @ref{5e7,,KeyError} when a
placeholder is not supplied in a dictionary or a keyword argument.  For
mail-merge style applications, user supplied data may be incomplete and the
@ref{211a,,safe_substitute()} method may be more appropriate —
it will leave placeholders unchanged if data is missing:

@example
>>> t = Template('Return the $item to $owner.')
>>> d = dict(item='unladen swallow')
>>> t.substitute(d)
Traceback (most recent call last):
  ...
KeyError: 'owner'
>>> t.safe_substitute(d)
'Return the unladen swallow to $owner.'
@end example

Template subclasses can specify a custom delimiter.  For example, a batch
renaming utility for a photo browser may elect to use percent signs for
placeholders such as the current date, image sequence number, or file format:

@example
>>> import time, os.path
>>> photofiles = ['img_1074.jpg', 'img_1076.jpg', 'img_1077.jpg']
>>> class BatchRename(Template):
...     delimiter = '%'
...
>>> fmt = input('Enter rename style (%d-date %n-seqnum %f-format):  ')
Enter rename style (%d-date %n-seqnum %f-format):  Ashley_%n%f

>>> t = BatchRename(fmt)
>>> date = time.strftime('%d%b%y')
>>> for i, filename in enumerate(photofiles):
...     base, ext = os.path.splitext(filename)
...     newname = t.substitute(d=date, n=i, f=ext)
...     print('@{0@} --> @{1@}'.format(filename, newname))

img_1074.jpg --> Ashley_0.jpg
img_1076.jpg --> Ashley_1.jpg
img_1077.jpg --> Ashley_2.jpg
@end example

Another application for templating is separating program logic from the details
of multiple output formats.  This makes it possible to substitute custom
templates for XML files, plain text reports, and HTML web reports.

@node Working with binary data record layouts,Multi-threading<2>,Templating,Brief tour of the standard library — part II
@anchor{tutorial/stdlib2 tut-binary-formats}@anchor{211b}@anchor{tutorial/stdlib2 working-with-binary-data-record-layouts}@anchor{211c}
@subsection Working with binary data record layouts


The @ref{db,,struct} module provides @ref{1482,,pack()} and
@ref{18a3,,unpack()} functions for working with variable length binary
record formats.  The following example shows
how to loop through header information in a ZIP file without using the
@ref{138,,zipfile} module.  Pack codes @code{"H"} and @code{"I"} represent two and four
byte unsigned numbers respectively.  The @code{"<"} indicates that they are
standard size and in little-endian byte order:

@example
import struct

with open('myfile.zip', 'rb') as f:
    data = f.read()

start = 0
for i in range(3):                      # show the first 3 file headers
    start += 14
    fields = struct.unpack('<IIIHH', data[start:start+16])
    crc32, comp_size, uncomp_size, filenamesize, extra_size = fields

    start += 16
    filename = data[start:start+filenamesize]
    start += filenamesize
    extra = data[start:start+extra_size]
    print(filename, hex(crc32), comp_size, uncomp_size)

    start += extra_size + comp_size     # skip to the next header
@end example

@node Multi-threading<2>,Logging,Working with binary data record layouts,Brief tour of the standard library — part II
@anchor{tutorial/stdlib2 multi-threading}@anchor{211d}@anchor{tutorial/stdlib2 tut-multi-threading}@anchor{211e}
@subsection Multi-threading


Threading is a technique for decoupling tasks which are not sequentially
dependent.  Threads can be used to improve the responsiveness of applications
that accept user input while other tasks run in the background.  A related use
case is running I/O in parallel with computations in another thread.

The following code shows how the high level @ref{f3,,threading} module can run
tasks in background while the main program continues to run:

@example
import threading, zipfile

class AsyncZip(threading.Thread):
    def __init__(self, infile, outfile):
        super().__init__()
        self.infile = infile
        self.outfile = outfile

    def run(self):
        with zipfile.ZipFile(self.outfile, 'w', zipfile.ZIP_DEFLATED) as f:
            f.write(self.infile)
        print('Finished background zip of:', self.infile)

background = AsyncZip('mydata.txt', 'myarchive.zip')
background.start()
print('The main program continues to run in foreground.')

background.join()    # Wait for the background task to finish
print('Main program waited until background was done.')
@end example

The principal challenge of multi-threaded applications is coordinating threads
that share data or other resources.  To that end, the threading module provides
a number of synchronization primitives including locks, events, condition
variables, and semaphores.

While those tools are powerful, minor design errors can result in problems that
are difficult to reproduce.  So, the preferred approach to task coordination is
to concentrate all access to a resource in a single thread and then use the
@ref{bb,,queue} module to feed that thread with requests from other threads.
Applications using @ref{15a0,,Queue} objects for inter-thread communication and
coordination are easier to design, more readable, and more reliable.

@node Logging,Weak references,Multi-threading<2>,Brief tour of the standard library — part II
@anchor{tutorial/stdlib2 logging}@anchor{211f}@anchor{tutorial/stdlib2 tut-logging}@anchor{2120}
@subsection Logging


The @ref{8b,,logging} module offers a full featured and flexible logging system.
At its simplest, log messages are sent to a file or to @code{sys.stderr}:

@example
import logging
logging.debug('Debugging information')
logging.info('Informational message')
logging.warning('Warning:config file %s not found', 'server.conf')
logging.error('Error occurred')
logging.critical('Critical error -- shutting down')
@end example

This produces the following output:

@example
WARNING:root:Warning:config file server.conf not found
ERROR:root:Error occurred
CRITICAL:root:Critical error -- shutting down
@end example

By default, informational and debugging messages are suppressed and the output
is sent to standard error.  Other output options include routing messages
through email, datagrams, sockets, or to an HTTP Server.  New filters can select
different routing based on message priority: @ref{2121,,DEBUG},
@ref{2122,,INFO}, @ref{2123,,WARNING}, @ref{2124,,ERROR},
and @ref{2125,,CRITICAL}.

The logging system can be configured directly from Python or can be loaded from
a user editable configuration file for customized logging without altering the
application.

@node Weak references,Tools for working with lists,Logging,Brief tour of the standard library — part II
@anchor{tutorial/stdlib2 tut-weak-references}@anchor{2126}@anchor{tutorial/stdlib2 weak-references}@anchor{2127}
@subsection Weak references


Python does automatic memory management (reference counting for most objects and
@ref{1826,,garbage collection} to eliminate cycles).  The memory is freed shortly
after the last reference to it has been eliminated.

This approach works fine for most applications but occasionally there is a need
to track objects only as long as they are being used by something else.
Unfortunately, just tracking them creates a reference that makes them permanent.
The @ref{11b,,weakref} module provides tools for tracking objects without creating a
reference.  When the object is no longer needed, it is automatically removed
from a weakref table and a callback is triggered for weakref objects.  Typical
applications include caching objects that are expensive to create:

@example
>>> import weakref, gc
>>> class A:
...     def __init__(self, value):
...         self.value = value
...     def __repr__(self):
...         return str(self.value)
...
>>> a = A(10)                   # create a reference
>>> d = weakref.WeakValueDictionary()
>>> d['primary'] = a            # does not create a reference
>>> d['primary']                # fetch the object if it is still alive
10
>>> del a                       # remove the one reference
>>> gc.collect()                # run garbage collection right away
0
>>> d['primary']                # entry was automatically removed
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
    d['primary']                # entry was automatically removed
  File "C:/python314/lib/weakref.py", line 46, in __getitem__
    o = self.data[key]()
KeyError: 'primary'
@end example

@node Tools for working with lists,Decimal floating-point arithmetic,Weak references,Brief tour of the standard library — part II
@anchor{tutorial/stdlib2 tools-for-working-with-lists}@anchor{2128}@anchor{tutorial/stdlib2 tut-list-tools}@anchor{2129}
@subsection Tools for working with lists


Many data structure needs can be met with the built-in list type. However,
sometimes there is a need for alternative implementations with different
performance trade-offs.

The @ref{8,,array} module provides an @ref{4bf,,array} object that is like
a list that stores only homogeneous data and stores it more compactly.  The
following example shows an array of numbers stored as two byte unsigned binary
numbers (typecode @code{"H"}) rather than the usual 16 bytes per entry for regular
lists of Python int objects:

@example
>>> from array import array
>>> a = array('H', [4000, 10, 700, 22222])
>>> sum(a)
26932
>>> a[1:3]
array('H', [10, 700])
@end example

The @ref{1e,,collections} module provides a @ref{7f5,,deque} object
that is like a list with faster appends and pops from the left side but slower
lookups in the middle. These objects are well suited for implementing queues
and breadth first tree searches:

@example
>>> from collections import deque
>>> d = deque(["task1", "task2", "task3"])
>>> d.append("task4")
>>> print("Handling", d.popleft())
Handling task1
@end example

@example
unsearched = deque([starting_node])
def breadth_first_search(unsearched):
    node = unsearched.popleft()
    for m in gen_moves(node):
        if is_goal(m):
            return m
        unsearched.append(m)
@end example

In addition to alternative list implementations, the library also offers other
tools such as the @ref{12,,bisect} module with functions for manipulating sorted
lists:

@example
>>> import bisect
>>> scores = [(100, 'perl'), (200, 'tcl'), (400, 'lua'), (500, 'python')]
>>> bisect.insort(scores, (300, 'ruby'))
>>> scores
[(100, 'perl'), (200, 'tcl'), (300, 'ruby'), (400, 'lua'), (500, 'python')]
@end example

The @ref{6d,,heapq} module provides functions for implementing heaps based on
regular lists.  The lowest valued entry is always kept at position zero.  This
is useful for applications which repeatedly access the smallest element but do
not want to run a full list sort:

@example
>>> from heapq import heapify, heappop, heappush
>>> data = [1, 3, 5, 7, 9, 2, 4, 6, 8, 0]
>>> heapify(data)                      # rearrange the list into heap order
>>> heappush(data, -5)                 # add a new entry
>>> [heappop(data) for i in range(3)]  # fetch the three smallest entries
[-5, 0, 1]
@end example

@node Decimal floating-point arithmetic,,Tools for working with lists,Brief tour of the standard library — part II
@anchor{tutorial/stdlib2 decimal-floating-point-arithmetic}@anchor{212a}@anchor{tutorial/stdlib2 tut-decimal-fp}@anchor{212b}
@subsection Decimal floating-point arithmetic


The @ref{3a,,decimal} module offers a @ref{200,,Decimal} datatype for
decimal floating-point arithmetic.  Compared to the built-in @ref{197,,float}
implementation of binary floating point, the class is especially helpful for


@itemize *

@item 
financial applications and other uses which require exact decimal
representation,

@item 
control over precision,

@item 
control over rounding to meet legal or regulatory requirements,

@item 
tracking of significant decimal places, or

@item 
applications where the user expects the results to match calculations done by
hand.
@end itemize

For example, calculating a 5% tax on a 70 cent phone charge gives different
results in decimal floating point and binary floating point. The difference
becomes significant if the results are rounded to the nearest cent:

@example
>>> from decimal import *
>>> round(Decimal('0.70') * Decimal('1.05'), 2)
Decimal('0.74')
>>> round(.70 * 1.05, 2)
0.73
@end example

The @ref{200,,Decimal} result keeps a trailing zero, automatically
inferring four place significance from multiplicands with two place
significance.  Decimal reproduces mathematics as done by hand and avoids
issues that can arise when binary floating point cannot exactly represent
decimal quantities.

Exact representation enables the @ref{200,,Decimal} class to perform
modulo calculations and equality tests that are unsuitable for binary floating
point:

@example
>>> Decimal('1.00') % Decimal('.10')
Decimal('0.00')
>>> 1.00 % 0.10
0.09999999999999995

>>> sum([Decimal('0.1')]*10) == Decimal('1.0')
True
>>> 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 == 1.0
False
@end example

The @ref{3a,,decimal} module provides arithmetic with as much precision as needed:

@example
>>> getcontext().prec = 36
>>> Decimal(1) / Decimal(7)
Decimal('0.142857142857142857142857142857142857')
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Virtual Environments and Packages,What Now?,Brief tour of the standard library — part II,The Python Tutorial
@anchor{tutorial/venv doc}@anchor{212c}@anchor{tutorial/venv translation-repo}@anchor{212d}@anchor{tutorial/venv tut-venv}@anchor{212e}@anchor{tutorial/venv virtual-environments-and-packages}@anchor{212f}
@section Virtual Environments and Packages


@menu
* Introduction: Introduction<4>. 
* Creating Virtual Environments:: 
* Managing Packages with pip:: 

@end menu

@node Introduction<4>,Creating Virtual Environments,,Virtual Environments and Packages
@anchor{tutorial/venv introduction}@anchor{2130}
@subsection Introduction


Python applications will often use packages and modules that don’t
come as part of the standard library.  Applications will sometimes
need a specific version of a library, because the application may
require that a particular bug has been fixed or the application may be
written using an obsolete version of the library’s interface.

This means it may not be possible for one Python installation to meet
the requirements of every application.  If application A needs version
1.0 of a particular module but application B needs version 2.0, then
the requirements are in conflict and installing either version 1.0 or 2.0
will leave one application unable to run.

The solution for this problem is to create a @ref{2131,,virtual environment}, a
self-contained directory tree that contains a Python installation for a
particular version of Python, plus a number of additional packages.

Different applications can then use different virtual environments.
To resolve the earlier example of conflicting requirements,
application A can have its own virtual environment with version 1.0
installed while application B has another virtual environment with version 2.0.
If application B requires a library be upgraded to version 3.0, this will
not affect application A’s environment.

@node Creating Virtual Environments,Managing Packages with pip,Introduction<4>,Virtual Environments and Packages
@anchor{tutorial/venv creating-virtual-environments}@anchor{2132}
@subsection Creating Virtual Environments


The module used to create and manage virtual environments is called
@ref{118,,venv}.  @code{venv} will install the Python version from which
the command was run (as reported by the @ref{f1d,,--version} option).
For instance, executing the command with @code{python3.12} will install
version 3.12.

To create a virtual environment, decide upon a directory where you want to
place it, and run the @ref{118,,venv} module as a script with the directory path:

@example
python -m venv tutorial-env
@end example

This will create the @code{tutorial-env} directory if it doesn’t exist,
and also create directories inside it containing a copy of the Python
interpreter and various supporting files.

A common directory location for a virtual environment is @code{.venv}.
This name keeps the directory typically hidden in your shell and thus
out of the way while giving it a name that explains why the directory
exists. It also prevents clashing with @code{.env} environment variable
definition files that some tooling supports.

Once you’ve created a virtual environment, you may activate it.

On Windows, run:

@example
tutorial-env\Scripts\activate
@end example

On Unix or MacOS, run:

@example
source tutorial-env/bin/activate
@end example

(This script is written for the bash shell.  If you use the
@code{csh} or @code{fish} shells, there are alternate
@code{activate.csh} and @code{activate.fish} scripts you should use
instead.)

Activating the virtual environment will change your shell’s prompt to show what
virtual environment you’re using, and modify the environment so that running
@code{python} will get you that particular version and installation of Python.
For example:

@example
$ source ~/envs/tutorial-env/bin/activate
(tutorial-env) $ python
Python 3.5.1 (default, May  6 2016, 10:59:36)
  ...
>>> import sys
>>> sys.path
['@w{'}, '/usr/local/lib/python35.zip', ...,
'~/envs/tutorial-env/lib/python3.5/site-packages']
>>>
@end example

Note that the activated virtual environment does not alter the @code{PYTHONPATH} variable in any way.
This may lead to unexpected results if the path includes references to code which is incompatible with
the Python version the virtual environment is using. The best practice is to @code{unset PYTHONPATH}
in bash or the equivalent for the shell you are using.

To deactivate a virtual environment, type:

@example
deactivate
@end example

into the terminal.

@node Managing Packages with pip,,Creating Virtual Environments,Virtual Environments and Packages
@anchor{tutorial/venv managing-packages-with-pip}@anchor{2133}
@subsection Managing Packages with pip


You can install, upgrade, and remove packages using a program called
@code{pip}.  By default @code{pip} will install packages from the Python Package Index@footnote{https://pypi.org}.  You can browse the Python
Package Index by going to it in your web browser.

@code{pip} has a number of subcommands: “install”, “uninstall”,
“freeze”, etc.  (Consult the @ref{10fe,,Installing Python modules} guide for
complete documentation for @code{pip}.)

You can install the latest version of a package by specifying a package’s name:

@example
(tutorial-env) $ python -m pip install novas
Collecting novas
  Downloading novas-3.1.1.3.tar.gz (136kB)
Installing collected packages: novas
  Running setup.py install for novas
Successfully installed novas-3.1.1.3
@end example

You can also install a specific version of a package by giving the
package name  followed by @code{==} and the version number:

@example
(tutorial-env) $ python -m pip install requests==2.6.0
Collecting requests==2.6.0
  Using cached requests-2.6.0-py2.py3-none-any.whl
Installing collected packages: requests
Successfully installed requests-2.6.0
@end example

If you re-run this command, @code{pip} will notice that the requested
version is already installed and do nothing.  You can supply a
different version number to get that version, or you can run @code{python
-m pip install --upgrade} to upgrade the package to the latest version:

@example
(tutorial-env) $ python -m pip install --upgrade requests
Collecting requests
Installing collected packages: requests
  Found existing installation: requests 2.6.0
    Uninstalling requests-2.6.0:
      Successfully uninstalled requests-2.6.0
Successfully installed requests-2.7.0
@end example

@code{python -m pip uninstall} followed by one or more package names will
remove the packages from the virtual environment.

@code{python -m pip show} will display information about a particular package:

@example
(tutorial-env) $ python -m pip show requests
---
Metadata-Version: 2.0
Name: requests
Version: 2.7.0
Summary: Python HTTP for Humans.
Home-page: http://python-requests.org
Author: Kenneth Reitz
Author-email: me@@kennethreitz.com
License: Apache 2.0
Location: /Users/akuchling/envs/tutorial-env/lib/python3.4/site-packages
Requires:
@end example

@code{python -m pip list} will display all of the packages installed in
the virtual environment:

@example
(tutorial-env) $ python -m pip list
novas (3.1.1.3)
numpy (1.9.2)
pip (7.0.3)
requests (2.7.0)
setuptools (16.0)
@end example

@code{python -m pip freeze} will produce a similar list of the installed packages,
but the output uses the format that @code{python -m pip install} expects.
A common convention is to put this list in a @code{requirements.txt} file:

@example
(tutorial-env) $ python -m pip freeze > requirements.txt
(tutorial-env) $ cat requirements.txt
novas==3.1.1.3
numpy==1.9.2
requests==2.7.0
@end example

The @code{requirements.txt} can then be committed to version control and
shipped as part of an application.  Users can then install all the
necessary packages with @code{install -r}:

@example
(tutorial-env) $ python -m pip install -r requirements.txt
Collecting novas==3.1.1.3 (from -r requirements.txt (line 1))
  ...
Collecting numpy==1.9.2 (from -r requirements.txt (line 2))
  ...
Collecting requests==2.7.0 (from -r requirements.txt (line 3))
  ...
Installing collected packages: novas, numpy, requests
  Running setup.py install for novas
Successfully installed novas-3.1.1.3 numpy-1.9.2 requests-2.7.0
@end example

@code{pip} has many more options.  Consult the @ref{10fe,,Installing Python modules}
guide for complete documentation for @code{pip}.  When you’ve written
a package and want to make it available on the Python Package Index,
consult the Python packaging user guide@footnote{https://packaging.python.org/en/latest/tutorials/packaging-projects/}.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node What Now?,Interactive Input Editing and History Substitution,Virtual Environments and Packages,The Python Tutorial
@anchor{tutorial/whatnow doc}@anchor{2134}@anchor{tutorial/whatnow translation-repo}@anchor{2135}@anchor{tutorial/whatnow tut-whatnow}@anchor{2136}@anchor{tutorial/whatnow what-now}@anchor{2137}
@section What Now?


Reading this tutorial has probably reinforced your interest in using Python —
you should be eager to apply Python to solving your real-world problems. Where
should you go to learn more?

This tutorial is part of Python’s documentation set.   Some other documents in
the set are:


@itemize *

@item 
@ref{14a,,The Python Standard Library}:

You should browse through this manual, which gives complete (though terse)
reference material about types, functions, and the modules in the standard
library.  The standard Python distribution includes a `lot' of additional code.
There are modules to read Unix mailboxes, retrieve documents via HTTP, generate
random numbers, parse command-line options, compress data,
and many other tasks. Skimming through the Library Reference will give you an
idea of what’s available.

@item 
@ref{10fe,,Installing Python modules} explains how to install additional modules written
by other Python users.

@item 
@ref{14b,,The Python Language Reference}: A detailed explanation of Python’s syntax and
semantics.  It’s heavy reading, but is useful as a complete guide to the
language itself.
@end itemize

More Python resources:


@itemize *

@item 
@indicateurl{https://www.python.org}:  The major Python website.  It contains code,
documentation, and pointers to Python-related pages around the web.

@item 
@indicateurl{https://docs.python.org}:  Fast access to Python’s  documentation.

@item 
@indicateurl{https://pypi.org}: The Python Package Index, previously also nicknamed
the Cheese Shop @footnote{
“Cheese Shop” is a Monty Python sketch: a customer enters a cheese shop,
but whatever cheese he asks for, the clerk says it’s missing.
}, is an index of user-created Python modules that are available
for download.  Once you begin releasing code, you can register it here so that
others can find it.

@item 
@indicateurl{https://code.activestate.com/recipes/langs/python/}: The Python Cookbook is a
sizable collection of code examples, larger modules, and useful scripts.
Particularly notable contributions are collected in a book also titled Python
Cookbook (O’Reilly & Associates, ISBN 0-596-00797-3.)

@item 
@indicateurl{https://pyvideo.org} collects links to Python-related videos from
conferences and user-group meetings.

@item 
@indicateurl{https://scipy.org}: The Scientific Python project includes modules for fast
array computations and manipulations plus a host of packages for such
things as linear algebra, Fourier transforms, non-linear solvers,
random number distributions, statistical analysis and the like.
@end itemize

For Python-related questions and problem reports, you can post to the newsgroup
@code{comp.lang.python}, or send them to the mailing list at
@email{python-list@@python.org}.  The newsgroup and mailing list are gatewayed, so
messages posted to one will automatically be forwarded to the other.  There are
hundreds of postings a day, asking (and
answering) questions, suggesting new features, and announcing new modules.
Mailing list archives are available at @indicateurl{https://mail.python.org/pipermail/}.

Before posting, be sure to check the list of
@ref{2138,,Frequently Asked Questions} (also called the FAQ).  The
FAQ answers many of the questions that come up again and again, and may
already contain the solution for your problem.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Interactive Input Editing and History Substitution,Floating-Point Arithmetic Issues and Limitations,What Now?,The Python Tutorial
@anchor{tutorial/interactive doc}@anchor{2139}@anchor{tutorial/interactive interactive-input-editing-and-history-substitution}@anchor{213a}@anchor{tutorial/interactive translation-repo}@anchor{213b}@anchor{tutorial/interactive tut-interacting}@anchor{200d}
@section Interactive Input Editing and History Substitution


Some versions of the Python interpreter support editing of the current input
line and history substitution, similar to facilities found in the Korn shell and
the GNU Bash shell.  This is implemented using the GNU Readline@footnote{https://tiswww.case.edu/php/chet/readline/rltop.html} library,
which supports various styles of editing.  This library has its own
documentation which we won’t duplicate here.

@menu
* Tab Completion and History Editing:: 
* Alternatives to the Interactive Interpreter:: 

@end menu

@node Tab Completion and History Editing,Alternatives to the Interactive Interpreter,,Interactive Input Editing and History Substitution
@anchor{tutorial/interactive tab-completion-and-history-editing}@anchor{213c}@anchor{tutorial/interactive tut-keybindings}@anchor{213d}
@subsection Tab Completion and History Editing


Completion of variable and module names is
@ref{11cf,,automatically enabled} at interpreter startup so
that the @code{Tab} key invokes the completion function; it looks at
Python statement names, the current local variables, and the available
module names.  For dotted expressions such as @code{string.a}, it will evaluate
the expression up to the final @code{'.'} and then suggest completions from
the attributes of the resulting object.  Note that this may execute
application-defined code if an object with a @ref{6fb,,__getattr__()} method
is part of the expression.  The default configuration also saves your
history into a file named @code{.python_history} in your user directory.
The history will be available again during the next interactive interpreter
session.

@node Alternatives to the Interactive Interpreter,,Tab Completion and History Editing,Interactive Input Editing and History Substitution
@anchor{tutorial/interactive alternatives-to-the-interactive-interpreter}@anchor{213e}@anchor{tutorial/interactive tut-commentary}@anchor{213f}
@subsection Alternatives to the Interactive Interpreter


This facility is an enormous step forward compared to earlier versions of the
interpreter; however, some wishes are left: It would be nice if the proper
indentation were suggested on continuation lines (the parser knows if an
@ref{2140,,INDENT} token is required next).  The completion mechanism might
use the interpreter’s symbol table.  A command to check (or even suggest)
matching parentheses, quotes, etc., would also be useful.

One alternative enhanced interactive interpreter that has been around for quite
some time is IPython@footnote{https://ipython.org/}, which features tab completion, object exploration and
advanced history management.  It can also be thoroughly customized and embedded
into other applications.  Another similar enhanced interactive environment is
bpython@footnote{https://bpython-interpreter.org/}.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c import math
@c from fractions import Fraction

@node Floating-Point Arithmetic Issues and Limitations,Appendix,Interactive Input Editing and History Substitution,The Python Tutorial
@anchor{tutorial/floatingpoint doc}@anchor{2141}@anchor{tutorial/floatingpoint floating-point-arithmetic-issues-and-limitations}@anchor{2142}@anchor{tutorial/floatingpoint translation-repo}@anchor{2143}@anchor{tutorial/floatingpoint tut-fp-issues}@anchor{2144}
@section Floating-Point Arithmetic:  Issues and Limitations


Floating-point numbers are represented in computer hardware as base 2 (binary)
fractions.  For example, the `decimal' fraction @code{0.625}
has value 6/10 + 2/100 + 5/1000, and in the same way the `binary' fraction @code{0.101}
has value 1/2 + 0/4 + 1/8. These two fractions have identical values, the only
real difference being that the first is written in base 10 fractional notation,
and the second in base 2.

Unfortunately, most decimal fractions cannot be represented exactly as binary
fractions.  A consequence is that, in general, the decimal floating-point
numbers you enter are only approximated by the binary floating-point numbers
actually stored in the machine.

The problem is easier to understand at first in base 10.  Consider the fraction
1/3.  You can approximate that as a base 10 fraction:

@example
0.3
@end example

or, better,

@example
0.33
@end example

or, better,

@example
0.333
@end example

and so on.  No matter how many digits you’re willing to write down, the result
will never be exactly 1/3, but will be an increasingly better approximation of
1/3.

In the same way, no matter how many base 2 digits you’re willing to use, the
decimal value 0.1 cannot be represented exactly as a base 2 fraction.  In base
2, 1/10 is the infinitely repeating fraction

@example
0.0001100110011001100110011001100110011001100110011...
@end example

Stop at any finite number of bits, and you get an approximation.  On most
machines today, floats are approximated using a binary fraction with
the numerator using the first 53 bits starting with the most significant bit and
with the denominator as a power of two.  In the case of 1/10, the binary fraction
is @code{3602879701896397 / 2 ** 55} which is close to but not exactly
equal to the true value of 1/10.

Many users are not aware of the approximation because of the way values are
displayed.  Python only prints a decimal approximation to the true decimal
value of the binary approximation stored by the machine.  On most machines, if
Python were to print the true decimal value of the binary approximation stored
for 0.1, it would have to display:

@example
>>> 0.1
0.1000000000000000055511151231257827021181583404541015625
@end example

That is more digits than most people find useful, so Python keeps the number
of digits manageable by displaying a rounded value instead:

@example
>>> 1 / 10
0.1
@end example

Just remember, even though the printed result looks like the exact value
of 1/10, the actual stored value is the nearest representable binary fraction.

Interestingly, there are many different decimal numbers that share the same
nearest approximate binary fraction.  For example, the numbers @code{0.1} and
@code{0.10000000000000001} and
@code{0.1000000000000000055511151231257827021181583404541015625} are all
approximated by @code{3602879701896397 / 2 ** 55}.  Since all of these decimal
values share the same approximation, any one of them could be displayed
while still preserving the invariant @code{eval(repr(x)) == x}.

Historically, the Python prompt and built-in @ref{1c3,,repr()} function would choose
the one with 17 significant digits, @code{0.10000000000000001}.   Starting with
Python 3.1, Python (on most systems) is now able to choose the shortest of
these and simply display @code{0.1}.

Note that this is in the very nature of binary floating point: this is not a bug
in Python, and it is not a bug in your code either.  You’ll see the same kind of
thing in all languages that support your hardware’s floating-point arithmetic
(although some languages may not `display' the difference by default, or in all
output modes).

For more pleasant output, you may wish to use string formatting to produce a
limited number of significant digits:

@example
>>> format(math.pi, '.12g')  # give 12 significant digits
'3.14159265359'

>>> format(math.pi, '.2f')   # give 2 digits after the point
'3.14'

>>> repr(math.pi)
'3.141592653589793'
@end example

It’s important to realize that this is, in a real sense, an illusion: you’re
simply rounding the `display' of the true machine value.

One illusion may beget another.  For example, since 0.1 is not exactly 1/10,
summing three values of 0.1 may not yield exactly 0.3, either:

@example
>>> 0.1 + 0.1 + 0.1 == 0.3
False
@end example

Also, since the 0.1 cannot get any closer to the exact value of 1/10 and
0.3 cannot get any closer to the exact value of 3/10, then pre-rounding with
@ref{14e6,,round()} function cannot help:

@example
>>> round(0.1, 1) + round(0.1, 1) + round(0.1, 1) == round(0.3, 1)
False
@end example

Though the numbers cannot be made closer to their intended exact values,
the @ref{fb6,,math.isclose()} function can be useful for comparing inexact values:

@example
>>> math.isclose(0.1 + 0.1 + 0.1, 0.3)
True
@end example

Alternatively, the @ref{14e6,,round()} function can be used to compare rough
approximations:

@example
>>> round(math.pi, ndigits=2) == round(22 / 7, ndigits=2)
True
@end example

Binary floating-point arithmetic holds many surprises like this.  The problem
with “0.1” is explained in precise detail below, in the “Representation Error”
section.  See Examples of Floating Point Problems@footnote{https://jvns.ca/blog/2023/01/13/examples-of-floating-point-problems/} for
a pleasant summary of how binary floating point works and the kinds of
problems commonly encountered in practice.  Also see
The Perils of Floating Point@footnote{http://www.indowsway.com/floatingpoint.htm}
for a more complete account of other common surprises.

As that says near the end, “there are no easy answers.”  Still, don’t be unduly
wary of floating point!  The errors in Python float operations are inherited
from the floating-point hardware, and on most machines are on the order of no
more than 1 part in 2**53 per operation.  That’s more than adequate for most
tasks, but you do need to keep in mind that it’s not decimal arithmetic and
that every float operation can suffer a new rounding error.

While pathological cases do exist, for most casual use of floating-point
arithmetic you’ll see the result you expect in the end if you simply round the
display of your final results to the number of decimal digits you expect.
@ref{16a,,str()} usually suffices, and for finer control see the @ref{834,,str.format()}
method’s format specifiers in @ref{15a7,,Format string syntax}.

For use cases which require exact decimal representation, try using the
@ref{3a,,decimal} module which implements decimal arithmetic suitable for
accounting applications and high-precision applications.

Another form of exact arithmetic is supported by the @ref{61,,fractions} module
which implements arithmetic based on rational numbers (so the numbers like
1/3 can be represented exactly).

If you are a heavy user of floating-point operations you should take a look
at the NumPy package and many other packages for mathematical and
statistical operations supplied by the SciPy project. See <@indicateurl{https://scipy.org}>.

Python provides tools that may help on those rare occasions when you really
`do' want to know the exact value of a float.  The
@ref{2145,,float.as_integer_ratio()} method expresses the value of a float as a
fraction:

@example
>>> x = 3.14159
>>> x.as_integer_ratio()
(3537115888337719, 1125899906842624)
@end example

Since the ratio is exact, it can be used to losslessly recreate the
original value:

@example
>>> x == 3537115888337719 / 1125899906842624
True
@end example

The @ref{2146,,float.hex()} method expresses a float in hexadecimal (base
16), again giving the exact value stored by your computer:

@example
>>> x.hex()
'0x1.921f9f01b866ep+1'
@end example

This precise hexadecimal representation can be used to reconstruct
the float value exactly:

@example
>>> x == float.fromhex('0x1.921f9f01b866ep+1')
True
@end example

Since the representation is exact, it is useful for reliably porting values
across different versions of Python (platform independence) and exchanging
data with other languages that support the same format (such as Java and C99).

Another helpful tool is the @ref{696,,sum()} function which helps mitigate
loss-of-precision during summation.  It uses extended precision for
intermediate rounding steps as values are added onto a running total.
That can make a difference in overall accuracy so that the errors do not
accumulate to the point where they affect the final total:

@example
>>> 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 == 1.0
False
>>> sum([0.1] * 10) == 1.0
True
@end example

The @ref{15e0,,math.fsum()} goes further and tracks all of the “lost digits”
as values are added onto a running total so that the result has only a
single rounding.  This is slower than @ref{696,,sum()} but will be more
accurate in uncommon cases where large magnitude inputs mostly cancel
each other out leaving a final sum near zero:

@example
>>> arr = [-0.10430216751806065, -266310978.67179024, 143401161448607.16,
...        -143401161400469.7, 266262841.31058735, -0.003244936839808227]
>>> float(sum(map(Fraction, arr)))   # Exact summation with single rounding
8.042173697819788e-13
>>> math.fsum(arr)                   # Single rounding
8.042173697819788e-13
>>> sum(arr)                         # Multiple roundings in extended precision
8.042178034628478e-13
>>> total = 0.0
>>> for x in arr:
...     total += x                   # Multiple roundings in standard precision
...
>>> total                            # Straight addition has no correct digits!
-0.0051575902860057365
@end example

@menu
* Representation Error:: 

@end menu

@node Representation Error,,,Floating-Point Arithmetic Issues and Limitations
@anchor{tutorial/floatingpoint representation-error}@anchor{2147}@anchor{tutorial/floatingpoint tut-fp-error}@anchor{2148}
@subsection Representation Error


This section explains the “0.1” example in detail, and shows how you can perform
an exact analysis of cases like this yourself.  Basic familiarity with binary
floating-point representation is assumed.

`Representation error' refers to the fact that some (most, actually)
decimal fractions cannot be represented exactly as binary (base 2) fractions.
This is the chief reason why Python (or Perl, C, C++, Java, Fortran, and many
others) often won’t display the exact decimal number you expect.

Why is that?  1/10 is not exactly representable as a binary fraction.  Since at
least 2000, almost all machines use IEEE 754 binary floating-point arithmetic,
and almost all platforms map Python floats to IEEE 754 binary64 “double
precision” values.  IEEE 754 binary64 values contain 53 bits of precision, so
on input the computer strives to convert 0.1 to the closest fraction it can of
the form `J'/2**`N' where `J' is an integer containing exactly 53 bits.
Rewriting

@example
1 / 10 ~= J / (2**N)
@end example

as

@example
J ~= 2**N / 10
@end example

and recalling that `J' has exactly 53 bits (is @code{>= 2**52} but @code{< 2**53}),
the best value for `N' is 56:

@example
>>> 2**52 <=  2**56 // 10  < 2**53
True
@end example

That is, 56 is the only value for `N' that leaves `J' with exactly 53 bits.  The
best possible value for `J' is then that quotient rounded:

@example
>>> q, r = divmod(2**56, 10)
>>> r
6
@end example

Since the remainder is more than half of 10, the best approximation is obtained
by rounding up:

@example
>>> q+1
7205759403792794
@end example

Therefore the best possible approximation to 1/10 in IEEE 754 double precision
is:

@example
7205759403792794 / 2 ** 56
@end example

Dividing both the numerator and denominator by two reduces the fraction to:

@example
3602879701896397 / 2 ** 55
@end example

Note that since we rounded up, this is actually a little bit larger than 1/10;
if we had not rounded up, the quotient would have been a little bit smaller than
1/10.  But in no case can it be `exactly' 1/10!

So the computer never “sees” 1/10:  what it sees is the exact fraction given
above, the best IEEE 754 double approximation it can get:

@example
>>> 0.1 * 2 ** 55
3602879701896397.0
@end example

If we multiply that fraction by 10**55, we can see the value out to
55 decimal digits:

@example
>>> 3602879701896397 * 10 ** 55 // 2 ** 55
1000000000000000055511151231257827021181583404541015625
@end example

meaning that the exact number stored in the computer is equal to
the decimal value 0.1000000000000000055511151231257827021181583404541015625.
Instead of displaying the full decimal value, many languages (including
older versions of Python), round the result to 17 significant digits:

@example
>>> format(0.1, '.17f')
'0.10000000000000001'
@end example

The @ref{61,,fractions} and @ref{3a,,decimal} modules make these calculations
easy:

@example
>>> from decimal import Decimal
>>> from fractions import Fraction

>>> Fraction.from_float(0.1)
Fraction(3602879701896397, 36028797018963968)

>>> (0.1).as_integer_ratio()
(3602879701896397, 36028797018963968)

>>> Decimal.from_float(0.1)
Decimal('0.1000000000000000055511151231257827021181583404541015625')

>>> format(Decimal.from_float(0.1), '.17')
'0.10000000000000001'
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Appendix,,Floating-Point Arithmetic Issues and Limitations,The Python Tutorial
@anchor{tutorial/appendix doc}@anchor{2149}@anchor{tutorial/appendix appendix}@anchor{214a}@anchor{tutorial/appendix translation-repo}@anchor{214b}@anchor{tutorial/appendix tut-appendix}@anchor{214c}
@section Appendix


@menu
* Interactive Mode: Interactive Mode<2>. 

@end menu

@node Interactive Mode<2>,,,Appendix
@anchor{tutorial/appendix interactive-mode}@anchor{214d}@anchor{tutorial/appendix tut-interac}@anchor{495}
@subsection Interactive Mode


There are two variants of the interactive @ref{492,,REPL}.  The classic
basic interpreter is supported on all platforms with minimal line
control capabilities.

Since Python 3.13, a new interactive shell is used by default.
This one supports color, multiline editing, history browsing, and
paste mode.  To disable color, see @ref{1b9,,Controlling color} for
details.  Function keys provide some additional functionality.
@code{F1} enters the interactive help browser @ref{ba,,pydoc}.
@code{F2} allows for browsing command-line history with neither output nor the
@ref{493,,>>>} and @ref{494,,…} prompts. @code{F3} enters “paste mode”, which
makes pasting larger blocks of code easier. Press @code{F3} to return to
the regular prompt.

When using the new interactive shell, exit the shell by typing @code{exit}
or @code{quit}. Adding call parentheses after those commands is not
required.

If the new interactive shell is not desired, it can be disabled via
the 
@geindex PYTHON_BASIC_REPL
@geindex environment variable; PYTHON_BASIC_REPL
@ref{1b8,,PYTHON_BASIC_REPL} environment variable.

@menu
* Error Handling:: 
* Executable Python Scripts:: 
* The Interactive Startup File:: 
* The Customization Modules:: 

@end menu

@node Error Handling,Executable Python Scripts,,Interactive Mode<2>
@anchor{tutorial/appendix error-handling}@anchor{214e}@anchor{tutorial/appendix tut-error}@anchor{214f}
@subsubsection Error Handling


When an error occurs, the interpreter prints an error message and a stack trace.
In interactive mode, it then returns to the primary prompt; when input came from
a file, it exits with a nonzero exit status after printing the stack trace.
(Exceptions handled by an @ref{1ac,,except} clause in a @ref{8fa,,try} statement
are not errors in this context.)  Some errors are unconditionally fatal and
cause an exit with a nonzero exit status; this applies to internal inconsistencies and
some cases of running out of memory.  All error messages are written to the
standard error stream; normal output from executed commands is written to
standard output.

Typing the interrupt character (usually @code{Control}-@code{C} or @code{Delete}) to the primary or
secondary prompt cancels the input and returns to the primary prompt. @footnote{
A problem with the GNU Readline package may prevent this.
}
Typing an interrupt while a command is executing raises the
@ref{bcb,,KeyboardInterrupt} exception, which may be handled by a @ref{8fa,,try}
statement.

@node Executable Python Scripts,The Interactive Startup File,Error Handling,Interactive Mode<2>
@anchor{tutorial/appendix executable-python-scripts}@anchor{2150}@anchor{tutorial/appendix tut-scripts}@anchor{2015}
@subsubsection Executable Python Scripts


On BSD’ish Unix systems, Python scripts can be made directly executable, like
shell scripts, by putting the line

@example
#!/usr/bin/env python3
@end example

(assuming that the interpreter is on the user’s 
@geindex PATH
@geindex environment variable; PATH
@code{PATH}) at the beginning
of the script and giving the file an executable mode.  The @code{#!} must be the
first two characters of the file.  On some platforms, this first line must end
with a Unix-style line ending (@code{'\n'}), not a Windows (@code{'\r\n'}) line
ending.  Note that the hash, or pound, character, @code{'#'}, is used to start a
comment in Python.

The script can be given an executable mode, or permission, using the
@code{chmod} command.

@example
$ chmod +x myscript.py
@end example

On Windows systems, there is no notion of an “executable mode”.  The Python
installer automatically associates @code{.py} files with @code{python.exe} so that
a double-click on a Python file will run it as a script.  The extension can
also be @code{.pyw}, in that case, the console window that normally appears is
suppressed.

@node The Interactive Startup File,The Customization Modules,Executable Python Scripts,Interactive Mode<2>
@anchor{tutorial/appendix the-interactive-startup-file}@anchor{2151}@anchor{tutorial/appendix tut-startup}@anchor{2152}
@subsubsection The Interactive Startup File


When you use Python interactively, it is frequently handy to have some standard
commands executed every time the interpreter is started.  You can do this by
setting an environment variable named 
@geindex PYTHONSTARTUP
@geindex environment variable; PYTHONSTARTUP
@ref{1ba,,PYTHONSTARTUP} to the name of a
file containing your start-up commands.  This is similar to the @code{.profile}
feature of the Unix shells.

This file is only read in interactive sessions, not when Python reads commands
from a script, and not when @code{/dev/tty} is given as the explicit source of
commands (which otherwise behaves like an interactive session).  It is executed
in the same namespace where interactive commands are executed, so that objects
that it defines or imports can be used without qualification in the interactive
session. You can also change the prompts @code{sys.ps1} and @code{sys.ps2} in this
file.

If you want to read an additional start-up file from the current directory, you
can program this in the global start-up file using code like @code{if
os.path.isfile('.pythonrc.py'): exec(open('.pythonrc.py').read())}.
If you want to use the startup file in a script, you must do this explicitly
in the script:

@example
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    with open(filename) as fobj:
        startup_file = fobj.read()
    exec(startup_file)
@end example

@node The Customization Modules,,The Interactive Startup File,Interactive Mode<2>
@anchor{tutorial/appendix the-customization-modules}@anchor{2153}@anchor{tutorial/appendix tut-customize}@anchor{2154}
@subsubsection The Customization Modules


Python provides two hooks to let you customize it: 
@geindex sitecustomize
sitecustomize and
@geindex usercustomize
usercustomize.  To see how it works, you need first to find the location
of your user site-packages directory.  Start Python and run this code:

@example
>>> import site
>>> site.getusersitepackages()
'/home/user/.local/lib/python3.x/site-packages'
@end example

Now you can create a file named @code{usercustomize.py} in that directory and
put anything you want in it.  It will affect every invocation of Python, unless
it is started with the @ref{159a,,-s} option to disable the automatic import.

@geindex sitecustomize
sitecustomize works in the same way, but is typically created by an
administrator of the computer in the global site-packages directory, and is
imported before 
@geindex usercustomize
usercustomize.  See the documentation of the @ref{cc,,site}
module for more details.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Python Setup and Usage,The Python Language Reference,The Python Tutorial,Top
@anchor{using/index doc}@anchor{2155}@anchor{using/index python-setup-and-usage}@anchor{2156}@anchor{using/index translation-repo}@anchor{2157}@anchor{using/index using-index}@anchor{2158}
@chapter Python Setup and Usage


This part of the documentation is devoted to general information on the setup
of the Python environment on different platforms, the invocation of the
interpreter and things that make working with Python easier.

@c ATTENTION: You probably should update Misc/python.man, too, if you modify
@c this file.

@menu
* Command line and environment: Command line and environment<2>. 
* Using Python on Unix platforms:: 
* Configure Python:: 
* Using Python on Windows:: 
* Using Python on macOS:: 
* Using Python on Android:: 
* Using Python on iOS:: 
* Editors and IDEs:: 

@end menu

@node Command line and environment<2>,Using Python on Unix platforms,,Python Setup and Usage
@anchor{using/cmdline doc}@anchor{2159}@anchor{using/cmdline command-line-and-environment}@anchor{215a}@anchor{using/cmdline using-on-general}@anchor{1dea}
@section Command line and environment


The CPython interpreter scans the command line and the environment for various
settings.

`CPython implementation detail:' Other implementations’ command line schemes may differ.  See
@ref{215b,,Alternate Implementations} for further resources.

@menu
* Command line:: 
* Environment variables:: 

@end menu

@node Command line,Environment variables,,Command line and environment<2>
@anchor{using/cmdline command-line}@anchor{215c}@anchor{using/cmdline using-on-cmdline}@anchor{120d}
@subsection Command line


When invoking Python, you may specify any of these options:

@example
python [-bBdEhiIOPqRsSuvVWx?] [-c command | -m module-name | script | - ] [args]
@end example

The most common use case is, of course, a simple invocation of a script:

@example
python myscript.py
@end example

@menu
* Interface options:: 
* Generic options:: 
* Miscellaneous options:: 
* Controlling color:: 

@end menu

@node Interface options,Generic options,,Command line
@anchor{using/cmdline interface-options}@anchor{215d}@anchor{using/cmdline using-on-interface-options}@anchor{215e}
@subsubsection Interface options


The interpreter interface resembles that of the UNIX shell, but provides some
additional methods of invocation:


@itemize *

@item 
When called with standard input connected to a tty device, it prompts for
commands and executes them until an EOF (an end-of-file character, you can
produce that with @code{Ctrl}-@code{D} on UNIX or @code{Ctrl}-@code{Z,} @code{Enter} on Windows) is read.
For more on interactive mode, see @ref{495,,Interactive Mode}.

@item 
When called with a file name argument or with a file as standard input, it
reads and executes a script from that file.

@item 
When called with a directory name argument, it reads and executes an
appropriately named script from that directory.

@item 
When called with @code{-c command}, it executes the Python statement(s) given as
`command'.  Here `command' may contain multiple statements separated by
newlines. Leading whitespace is significant in Python statements!

@item 
When called with @code{-m module-name}, the given module is located using the standard
import mechanism and executed as a script.
@end itemize

In non-interactive mode, the entire input is parsed before it is executed.

An interface option terminates the list of options consumed by the interpreter,
all consecutive arguments will end up in @ref{1470,,sys.argv} – note that the first
element, subscript zero (@code{sys.argv[0]}), is a string reflecting the program’s
source.

@geindex command line option; -c
@anchor{using/cmdline cmdoption-c}@anchor{1a9}
@deffn {Option} @w{-}c <command>

Execute the Python code in `command'.  `command' can be one or more
statements separated by newlines, with significant leading whitespace as in
normal module code.

If this option is given, the first element of @ref{1470,,sys.argv} will be
@code{"-c"} and the current directory will be added to the start of
@ref{3e2,,sys.path} (allowing modules in that directory to be imported as top
level modules).

Raises an @ref{1cb1,,auditing event} @code{cpython.run_command} with argument @code{command}.


Changed in version 3.14: `command' is automatically dedented before execution.

@end deffn

@geindex command line option; -m
@anchor{using/cmdline cmdoption-m}@anchor{23e}
@deffn {Option} @w{-}m <module@w{-}name>

Locate the module using the standard import mechanism and execute its contents
as the @ref{1,,__main__} module.

Since the argument is a `module' name, you must not give a file extension
(@code{.py}).  The module name should be a valid absolute Python module name, but
the implementation may not always enforce this (e.g. it may allow you to
use a name that includes a hyphen).

Package names (including namespace packages) are also permitted. When a
package name is supplied instead
of a normal module, the interpreter will execute @code{<pkg>.__main__} as
the main module. This behaviour is deliberately similar to the handling
of directories and zipfiles that are passed to the interpreter as the
script argument.

@cartouche
@quotation Note 
This option cannot be used with built-in modules and extension modules
written in C, since they do not have Python module files. However, it
can still be used for precompiled modules, even if the original source
file is not available.
@end quotation
@end cartouche

If this option is given, the first element of @ref{1470,,sys.argv} will be the
full path to the module file (while the module file is being located, the
first element will be set to @code{"-m"}). As with the @ref{1a9,,-c} option,
the current directory will be added to the start of @ref{3e2,,sys.path}.

@ref{b5d,,-I} option can  be used to run the script in isolated mode where
@ref{3e2,,sys.path} contains neither the current directory nor the user’s
site-packages directory. All @code{PYTHON*} environment variables are
ignored, too.

Many standard library modules contain code that is invoked on their execution
as a script.  An example is the @ref{f5,,timeit} module:

@example
python -m timeit -s "setup here" "benchmarked code here"
python -m timeit -h # for details
@end example

Raises an @ref{1cb1,,auditing event} @code{cpython.run_module} with argument @code{module-name}.


@subsubheading See also



@table @asis

@item @ref{1794,,runpy.run_module()}

Equivalent functionality directly available to Python code
@end table

@geindex Python Enhancement Proposals; PEP 338
PEP 338@footnote{https://peps.python.org/pep-0338/} – Executing modules as scripts



Changed in version 3.1: Supply the package name to run a @code{__main__} submodule.



Changed in version 3.4: namespace packages are also supported

@end deffn

@anchor{using/cmdline cmdarg-dash}@anchor{215f}
@deffn {Describe} @w{-}

Read commands from standard input (@ref{760,,sys.stdin}).  If standard input is
a terminal, @ref{16e7,,-i} is implied.

If this option is given, the first element of @ref{1470,,sys.argv} will be
@code{"-"} and the current directory will be added to the start of
@ref{3e2,,sys.path}.

Raises an @ref{1cb1,,auditing event} @code{cpython.run_stdin} with no arguments.
@end deffn

@anchor{using/cmdline cmdarg-script}@anchor{2160}
@deffn {Describe} <script>

Execute the Python code contained in `script', which must be a filesystem
path (absolute or relative) referring to either a Python file, a directory
containing a @code{__main__.py} file, or a zipfile containing a
@code{__main__.py} file.

If this option is given, the first element of @ref{1470,,sys.argv} will be the
script name as given on the command line.

If the script name refers directly to a Python file, the directory
containing that file is added to the start of @ref{3e2,,sys.path}, and the
file is executed as the @ref{1,,__main__} module.

If the script name refers to a directory or zipfile, the script name is
added to the start of @ref{3e2,,sys.path} and the @code{__main__.py} file in
that location is executed as the @ref{1,,__main__} module.

@ref{b5d,,-I} option can  be used to run the script in isolated mode where
@ref{3e2,,sys.path} contains neither the script’s directory nor the user’s
site-packages directory. All @code{PYTHON*} environment variables are
ignored, too.

Raises an @ref{1cb1,,auditing event} @code{cpython.run_file} with argument @code{filename}.


@subsubheading See also



@table @asis

@item @ref{4a5,,runpy.run_path()}

Equivalent functionality directly available to Python code
@end table

@end deffn

If no interface option is given, @ref{16e7,,-i} is implied, @code{sys.argv[0]} is
an empty string (@code{""}) and the current directory will be added to the
start of @ref{3e2,,sys.path}.  Also, tab-completion and history editing is
automatically enabled, if available on your platform (see
@ref{11cf,,Readline configuration}).


@subsubheading See also


@ref{200a,,Invoking the Interpreter}



Changed in version 3.4: Automatic enabling of tab-completion and history editing.


@node Generic options,Miscellaneous options,Interface options,Command line
@anchor{using/cmdline generic-options}@anchor{2161}@anchor{using/cmdline using-on-generic-options}@anchor{2162}
@subsubsection Generic options


@geindex command line option; -?
@geindex command line option; -h
@geindex command line option; --help
@anchor{using/cmdline cmdoption-0}@anchor{1634}
@deffn {Option} @w{-}?
@anchor{using/cmdline cmdoption-h}@anchor{2163}
@deffnx {Option} @w{-}h
@anchor{using/cmdline cmdoption-help}@anchor{807}
@deffnx {Option} @w{-}@w{-}help

Print a short description of all command line options and corresponding
environment variables and exit.
@end deffn

@geindex command line option; --help-env
@anchor{using/cmdline cmdoption-help-env}@anchor{809}
@deffn {Option} @w{-}@w{-}help@w{-}env

Print a short description of Python-specific environment variables
and exit.


Added in version 3.11.

@end deffn

@geindex command line option; --help-xoptions
@anchor{using/cmdline cmdoption-help-xoptions}@anchor{80a}
@deffn {Option} @w{-}@w{-}help@w{-}xoptions

Print a description of implementation-specific @ref{170,,-X} options
and exit.


Added in version 3.11.

@end deffn

@geindex command line option; --help-all
@anchor{using/cmdline cmdoption-help-all}@anchor{80b}
@deffn {Option} @w{-}@w{-}help@w{-}all

Print complete usage information and exit.


Added in version 3.11.

@end deffn

@geindex command line option; -V
@geindex command line option; --version
@anchor{using/cmdline cmdoption-V}@anchor{49c}
@deffn {Option} @w{-}V
@anchor{using/cmdline cmdoption-version}@anchor{f1d}
@deffnx {Option} @w{-}@w{-}version

Print the Python version number and exit.  Example output could be:

@example
Python 3.8.0b2+
@end example

When given twice, print more information about the build, like:

@example
Python 3.8.0b2+ (3.8:0c076caaa8, Apr 20 2019, 21:55:00)
[GCC 6.2.0 20161005]
@end example


Added in version 3.6: The @code{-VV} option.

@end deffn

@node Miscellaneous options,Controlling color,Generic options,Command line
@anchor{using/cmdline miscellaneous-options}@anchor{2164}@anchor{using/cmdline using-on-misc-options}@anchor{120e}
@subsubsection Miscellaneous options


@geindex command line option; -b
@anchor{using/cmdline cmdoption-b}@anchor{7fa}
@deffn {Option} @w{-}b

Issue a warning when converting @ref{193,,bytes} or @ref{342,,bytearray} to
@ref{16a,,str} without specifying encoding or comparing @code{bytes} or
@code{bytearray} with @code{str} or @code{bytes} with @ref{19c,,int}.
Issue an error when the option is given twice (@code{-bb}).


Changed in version 3.5: Affects also comparisons of @ref{193,,bytes} with @ref{19c,,int}.

@end deffn

@geindex command line option; -B
@anchor{using/cmdline cmdoption-B}@anchor{15d9}
@deffn {Option} @w{-}B

If given, Python won’t try to write @code{.pyc} files on the
import of source modules.  See also 
@geindex PYTHONDONTWRITEBYTECODE
@geindex environment variable; PYTHONDONTWRITEBYTECODE
@ref{15da,,PYTHONDONTWRITEBYTECODE}.
@end deffn

@geindex command line option; --check-hash-based-pycs
@anchor{using/cmdline cmdoption-check-hash-based-pycs}@anchor{2165}
@deffn {Option} @w{-}@w{-}check@w{-}hash@w{-}based@w{-}pycs default|always|never

Control the validation behavior of hash-based @code{.pyc} files. See
@ref{803,,Cached bytecode invalidation}. When set to @code{default}, checked and unchecked
hash-based bytecode cache files are validated according to their default
semantics. When set to @code{always}, all hash-based @code{.pyc} files, whether
checked or unchecked, are validated against their corresponding source
file. When set to @code{never}, hash-based @code{.pyc} files are not validated
against their corresponding source files.

The semantics of timestamp-based @code{.pyc} files are unaffected by this
option.
@end deffn

@geindex command line option; -d
@anchor{using/cmdline cmdoption-d}@anchor{2166}
@deffn {Option} @w{-}d

Turn on parser debugging output (for expert only).
See also the 
@geindex PYTHONDEBUG
@geindex environment variable; PYTHONDEBUG
@ref{2167,,PYTHONDEBUG} environment variable.

This option requires a @ref{50a,,debug build of Python}, otherwise
it’s ignored.
@end deffn

@geindex command line option; -E
@anchor{using/cmdline cmdoption-E}@anchor{b5c}
@deffn {Option} @w{-}E

Ignore all @code{PYTHON*} environment variables, e.g.
@geindex PYTHONPATH
@geindex environment variable; PYTHONPATH
@ref{1223,,PYTHONPATH} and 
@geindex PYTHONHOME
@geindex environment variable; PYTHONHOME
@ref{3ee,,PYTHONHOME}, that might be set.

See also the @ref{7c2,,-P} and @ref{b5d,,-I} (isolated) options.
@end deffn

@geindex command line option; -i
@anchor{using/cmdline cmdoption-i}@anchor{16e7}
@deffn {Option} @w{-}i

Enter interactive mode after execution.

Using the @ref{16e7,,-i} option will enter interactive mode in any of the following circumstances:


@itemize *

@item 
When a script is passed as first argument

@item 
When the @ref{1a9,,-c} option is used

@item 
When the @ref{23e,,-m} option is used
@end itemize

Interactive mode will start even when @ref{760,,sys.stdin} does not appear to be a terminal. The
@geindex PYTHONSTARTUP
@geindex environment variable; PYTHONSTARTUP
@ref{1ba,,PYTHONSTARTUP} file is not read.

This can be useful to inspect global variables or a stack trace when a script
raises an exception.  See also 
@geindex PYTHONINSPECT
@geindex environment variable; PYTHONINSPECT
@ref{16e6,,PYTHONINSPECT}.
@end deffn

@geindex command line option; -I
@anchor{using/cmdline cmdoption-I}@anchor{b5d}
@deffn {Option} @w{-}I

Run Python in isolated mode. This also implies @ref{b5c,,-E}, @ref{7c2,,-P}
and @ref{159a,,-s} options.

In isolated mode @ref{3e2,,sys.path} contains neither the script’s directory nor
the user’s site-packages directory. All @code{PYTHON*} environment
variables are ignored, too. Further restrictions may be imposed to prevent
the user from injecting malicious code.


Added in version 3.4.

@end deffn

@geindex command line option; -O
@anchor{using/cmdline cmdoption-O}@anchor{18d}
@deffn {Option} @w{-}O

Remove assert statements and any code conditional on the value of
@ref{9e0,,__debug__}.  Augment the filename for compiled
(@ref{4ab,,bytecode}) files by adding @code{.opt-1} before the @code{.pyc}
extension (see 
@geindex Python Enhancement Proposals; PEP 488
PEP 488@footnote{https://peps.python.org/pep-0488/}).  See also 
@geindex PYTHONOPTIMIZE
@geindex environment variable; PYTHONOPTIMIZE
@ref{2168,,PYTHONOPTIMIZE}.


Changed in version 3.5: Modify @code{.pyc} filenames according to 
@geindex Python Enhancement Proposals; PEP 488
PEP 488@footnote{https://peps.python.org/pep-0488/}.

@end deffn

@geindex command line option; -OO
@anchor{using/cmdline cmdoption-OO}@anchor{fbb}
@deffn {Option} @w{-}OO

Do @ref{18d,,-O} and also discard docstrings.  Augment the filename
for compiled (@ref{4ab,,bytecode}) files by adding @code{.opt-2} before the
@code{.pyc} extension (see 
@geindex Python Enhancement Proposals; PEP 488
PEP 488@footnote{https://peps.python.org/pep-0488/}).


Changed in version 3.5: Modify @code{.pyc} filenames according to 
@geindex Python Enhancement Proposals; PEP 488
PEP 488@footnote{https://peps.python.org/pep-0488/}.

@end deffn

@geindex command line option; -P
@anchor{using/cmdline cmdoption-P}@anchor{7c2}
@deffn {Option} @w{-}P

Don’t prepend a potentially unsafe path to @ref{3e2,,sys.path}:


@itemize *

@item 
@code{python -m module} command line: Don’t prepend the current working
directory.

@item 
@code{python script.py} command line: Don’t prepend the script’s directory.
If it’s a symbolic link, resolve symbolic links.

@item 
@code{python -c code} and @code{python} (REPL) command lines: Don’t prepend an
empty string, which means the current working directory.
@end itemize

See also the 
@geindex PYTHONSAFEPATH
@geindex environment variable; PYTHONSAFEPATH
@ref{7c3,,PYTHONSAFEPATH} environment variable, and @ref{b5c,,-E}
and @ref{b5d,,-I} (isolated) options.


Added in version 3.11.

@end deffn

@geindex command line option; -q
@anchor{using/cmdline cmdoption-q}@anchor{17cf}
@deffn {Option} @w{-}q

Don’t display the copyright and version messages even in interactive mode.


Added in version 3.2.

@end deffn

@geindex command line option; -R
@anchor{using/cmdline cmdoption-R}@anchor{1eba}
@deffn {Option} @w{-}R

Turn on hash randomization. This option only has an effect if the
@geindex PYTHONHASHSEED
@geindex environment variable; PYTHONHASHSEED
@ref{1283,,PYTHONHASHSEED} environment variable is set to anything other
than @code{random}, since hash randomization is enabled by default.

On previous versions of Python, this option turns on hash randomization,
so that the @ref{cf9,,__hash__()} values of str and bytes objects
are “salted” with an unpredictable random value.  Although they remain
constant within an individual Python process, they are not predictable
between repeated invocations of Python.

Hash randomization is intended to provide protection against a
denial-of-service caused by carefully chosen inputs that exploit the worst
case performance of a dict construction, `O'(`n'@w{^2}) complexity.  See
@indicateurl{https://ocert.org/advisories/ocert-2011-003.html} for details.

@geindex PYTHONHASHSEED
@geindex environment variable; PYTHONHASHSEED
@ref{1283,,PYTHONHASHSEED} allows you to set a fixed value for the hash
seed secret.


Added in version 3.2.3.



Changed in version 3.7: The option is no longer ignored.

@end deffn

@geindex command line option; -s
@anchor{using/cmdline cmdoption-s}@anchor{159a}
@deffn {Option} @w{-}s

Don’t add the @ref{2169,,user site-packages directory} to
@ref{3e2,,sys.path}.

See also 
@geindex PYTHONNOUSERSITE
@geindex environment variable; PYTHONNOUSERSITE
@ref{159b,,PYTHONNOUSERSITE}.


@subsubheading See also


@geindex Python Enhancement Proposals; PEP 370
PEP 370@footnote{https://peps.python.org/pep-0370/} – Per user site-packages directory

@end deffn

@geindex command line option; -S
@anchor{using/cmdline cmdoption-S}@anchor{13b4}
@deffn {Option} @w{-}S

Disable the import of the module @ref{cc,,site} and the site-dependent
manipulations of @ref{3e2,,sys.path} that it entails.  Also disable these
manipulations if @code{site} is explicitly imported later (call
@ref{216a,,site.main()} if you want them to be triggered).
@end deffn

@geindex command line option; -u
@anchor{using/cmdline cmdoption-u}@anchor{1dd1}
@deffn {Option} @w{-}u

Force the stdout and stderr streams to be unbuffered.  This option has no
effect on the stdin stream.

See also 
@geindex PYTHONUNBUFFERED
@geindex environment variable; PYTHONUNBUFFERED
@ref{1dd2,,PYTHONUNBUFFERED}.


Changed in version 3.7: The text layer of the stdout and stderr streams now is unbuffered.

@end deffn

@geindex command line option; -v
@anchor{using/cmdline cmdoption-v}@anchor{1631}
@deffn {Option} @w{-}v

Print a message each time a module is initialized, showing the place
(filename or built-in module) from which it is loaded.  When given twice
(@code{-vv}), print a message for each file that is checked for when
searching for a module.  Also provides information on module cleanup at exit.


Changed in version 3.10: The @ref{cc,,site} module reports the site-specific paths
and @code{.pth} files being processed.


See also 
@geindex PYTHONVERBOSE
@geindex environment variable; PYTHONVERBOSE
@ref{216b,,PYTHONVERBOSE}.
@end deffn

@geindex command line option; -W
@anchor{using/cmdline using-on-warnings}@anchor{216c}@anchor{using/cmdline cmdoption-W}@anchor{acb}
@deffn {Option} @w{-}W arg

Warning control. Python’s warning machinery by default prints warning
messages to @ref{b39,,sys.stderr}.

The simplest settings apply a particular action unconditionally to all
warnings emitted by a process (even those that are otherwise ignored by
default):

@example
-Wdefault  # Warn once per call location
-Werror    # Convert to exceptions
-Walways   # Warn every time
-Wall      # Same as -Walways
-Wmodule   # Warn once per calling module
-Wonce     # Warn once per Python process
-Wignore   # Never warn
@end example

The action names can be abbreviated as desired and the interpreter will
resolve them to the appropriate action name. For example, @code{-Wi} is the
same as @code{-Wignore}.

The full form of argument is:

@example
action:message:category:module:lineno
@end example

Empty fields match all values; trailing empty fields may be omitted. For
example @code{-W ignore::DeprecationWarning} ignores all DeprecationWarning
warnings.

The `action' field is as explained above but only applies to warnings that
match the remaining fields.

The `message' field must match the whole warning message; this match is
case-insensitive.

The `category' field matches the warning category
(ex: @code{DeprecationWarning}). This must be a class name; the match test
whether the actual warning category of the message is a subclass of the
specified warning category.

The `module' field matches the (fully qualified) module name; this match is
case-sensitive.

The `lineno' field matches the line number, where zero matches all line
numbers and is thus equivalent to an omitted line number.

Multiple @ref{acb,,-W} options can be given; when a warning matches more than
one option, the action for the last matching option is performed. Invalid
@code{-W} options are ignored (though, a warning message is printed about
invalid options when the first warning is issued).

Warnings can also be controlled using the 
@geindex PYTHONWARNINGS
@geindex environment variable; PYTHONWARNINGS
@ref{da9,,PYTHONWARNINGS}
environment variable and from within a Python program using the
@ref{119,,warnings} module. For example, the @ref{16b5,,warnings.filterwarnings()}
function can be used to use a regular expression on the warning message.

See @ref{1b2,,The Warnings Filter} and @ref{216d,,Describing Warning Filters} for more
details.
@end deffn

@geindex command line option; -x
@anchor{using/cmdline cmdoption-x}@anchor{216e}
@deffn {Option} @w{-}x

Skip the first line of the source, allowing use of non-Unix forms of
@code{#!cmd}.  This is intended for a DOS specific hack only.
@end deffn

@geindex command line option; -X
@anchor{using/cmdline cmdoption-X}@anchor{170}
@deffn {Option} @w{-}X

Reserved for various implementation-specific options.  CPython currently
defines the following possible values:


@itemize *

@item 
@code{-X faulthandler} to enable @ref{5c,,faulthandler}.
See also 
@geindex PYTHONFAULTHANDLER
@geindex environment variable; PYTHONFAULTHANDLER
@ref{128b,,PYTHONFAULTHANDLER}.


Added in version 3.3.


@item 
@code{-X showrefcount} to output the total reference count and number of used
memory blocks when the program finishes or after each statement in the
interactive interpreter. This only works on @ref{50a,,debug builds}.


Added in version 3.4.


@item 
@code{-X tracemalloc} to start tracing Python memory allocations using the
@ref{106,,tracemalloc} module. By default, only the most recent frame is
stored in a traceback of a trace. Use @code{-X tracemalloc=NFRAME} to start
tracing with a traceback limit of `NFRAME' frames.
See @ref{216f,,tracemalloc.start()} and 
@geindex PYTHONTRACEMALLOC
@geindex environment variable; PYTHONTRACEMALLOC
@ref{2170,,PYTHONTRACEMALLOC}
for more information.


Added in version 3.4.


@item 
@code{-X int_max_str_digits} configures the @ref{80c,,integer string conversion length limitation}.  See also
@geindex PYTHONINTMAXSTRDIGITS
@geindex environment variable; PYTHONINTMAXSTRDIGITS
@ref{1b7e,,PYTHONINTMAXSTRDIGITS}.


Added in version 3.11.


@item 
@code{-X importtime} to show how long each import takes. It shows module
name, cumulative time (including nested imports) and self time (excluding
nested imports).  Note that its output may be broken in multi-threaded
application.  Typical usage is @code{python -X importtime -c 'import asyncio'}.

@code{-X importtime=2} enables additional output that indicates when an
imported module has already been loaded.  In such cases, the string
@code{cached} will be printed in both time columns.

See also 
@geindex PYTHONPROFILEIMPORTTIME
@geindex environment variable; PYTHONPROFILEIMPORTTIME
@ref{cf3,,PYTHONPROFILEIMPORTTIME}.


Added in version 3.7.



Changed in version 3.14: Added @code{-X importtime=2} to also trace imports of loaded modules,
and reserved values other than @code{1} and @code{2} for future use.


@item 
@code{-X dev}: enable @ref{509,,Python Development Mode}, introducing
additional runtime checks that are too expensive to be enabled by
default.  See also 
@geindex PYTHONDEVMODE
@geindex environment variable; PYTHONDEVMODE
@ref{ced,,PYTHONDEVMODE}.


Added in version 3.7.


@item 
@code{-X utf8} enables the @ref{868,,Python UTF-8 Mode}.
@code{-X utf8=0} explicitly disables @ref{868,,Python UTF-8 Mode}
(even when it would otherwise activate automatically).
See also 
@geindex PYTHONUTF8
@geindex environment variable; PYTHONUTF8
@ref{cd5,,PYTHONUTF8}.


Added in version 3.7.


@item 
@code{-X pycache_prefix=PATH} enables writing @code{.pyc} files to a parallel
tree rooted at the given directory instead of to the code tree. See also
@geindex PYTHONPYCACHEPREFIX
@geindex environment variable; PYTHONPYCACHEPREFIX
@ref{ba1,,PYTHONPYCACHEPREFIX}.


Added in version 3.8.


@item 
@code{-X warn_default_encoding} issues a @ref{2171,,EncodingWarning} when the
locale-specific default encoding is used for opening files.
See also 
@geindex PYTHONWARNDEFAULTENCODING
@geindex environment variable; PYTHONWARNDEFAULTENCODING
@ref{9c5,,PYTHONWARNDEFAULTENCODING}.


Added in version 3.10.


@item 
@code{-X no_debug_ranges} disables the inclusion of the tables mapping extra
location information (end line, start column offset and end column offset)
to every instruction in code objects. This is useful when smaller code
objects and pyc files are desired as well as suppressing the extra visual
location indicators when the interpreter displays tracebacks. See also
@geindex PYTHONNODEBUGRANGES
@geindex environment variable; PYTHONNODEBUGRANGES
@ref{7d4,,PYTHONNODEBUGRANGES}.


Added in version 3.11.


@item 
@code{-X frozen_modules} determines whether or not frozen modules are
ignored by the import machinery.  A value of @code{on} means they get
imported and @code{off} means they are ignored.  The default is @code{on}
if this is an installed Python (the normal case).  If it’s under
development (running from the source tree) then the default is @code{off}.
Note that the @code{importlib_bootstrap} and
@code{importlib_bootstrap_external} frozen modules are always used, even
if this flag is set to @code{off}. See also 
@geindex PYTHON_FROZEN_MODULES
@geindex environment variable; PYTHON_FROZEN_MODULES
@ref{4ae,,PYTHON_FROZEN_MODULES}.


Added in version 3.11.


@item 
@code{-X perf} enables support for the Linux @code{perf} profiler.
When this option is provided, the @code{perf} profiler will be able to
report Python calls. This option is only available on some platforms and
will do nothing if is not supported on the current system. The default value
is “off”. See also 
@geindex PYTHONPERFSUPPORT
@geindex environment variable; PYTHONPERFSUPPORT
@ref{69a,,PYTHONPERFSUPPORT} and @ref{4af,,Python support for the Linux perf profiler}.


Added in version 3.12.


@item 
@code{-X perf_jit} enables support for the Linux @code{perf} profiler with DWARF
support. When this option is provided, the @code{perf} profiler will be able
to report Python calls using DWARF information. This option is only available on
some platforms and will do nothing if is not supported on the current
system. The default value is “off”. See also 
@geindex PYTHON_PERF_JIT_SUPPORT
@geindex environment variable; PYTHON_PERF_JIT_SUPPORT
@ref{4b0,,PYTHON_PERF_JIT_SUPPORT}
and @ref{4af,,Python support for the Linux perf profiler}.


Added in version 3.13.


@item 
@code{-X disable_remote_debug} disables the remote debugging support as described
in 
@geindex Python Enhancement Proposals; PEP 768
PEP 768@footnote{https://peps.python.org/pep-0768/}.  This includes both the functionality to schedule code for
execution in another process and the functionality to receive code for
execution in the current process.

This option is only available on some platforms and will do nothing
if is not supported on the current system. See also
@geindex PYTHON_DISABLE_REMOTE_DEBUG
@geindex environment variable; PYTHON_DISABLE_REMOTE_DEBUG
@ref{16f,,PYTHON_DISABLE_REMOTE_DEBUG} and 
@geindex Python Enhancement Proposals; PEP 768
PEP 768@footnote{https://peps.python.org/pep-0768/}.


Added in version 3.14.


@item 
@code{-X cpu_count=@var{n}} overrides @ref{4dc,,os.cpu_count()},
@ref{4db,,os.process_cpu_count()}, and @ref{1175,,multiprocessing.cpu_count()}.
`n' must be greater than or equal to 1.
This option may be useful for users who need to limit CPU resources of a
container system. See also 
@geindex PYTHON_CPU_COUNT
@geindex environment variable; PYTHON_CPU_COUNT
@ref{51f,,PYTHON_CPU_COUNT}.
If `n' is @code{default}, nothing is overridden.


Added in version 3.13.


@item 
@code{-X presite=@var{package.module}} specifies a module that should be
imported before the @ref{cc,,site} module is executed and before the
@ref{1,,__main__} module exists.  Therefore, the imported module isn’t
@code{__main__}. This can be used to execute code early during Python
initialization. Python needs to be @ref{50a,,built in debug mode}
for this option to exist.  See also 
@geindex PYTHON_PRESITE
@geindex environment variable; PYTHON_PRESITE
@ref{2172,,PYTHON_PRESITE}.


Added in version 3.13.


@item 
@code{-X gil=@var{0,1}} forces the GIL to be disabled or enabled,
respectively. Setting to @code{0} is only available in builds configured with
@ref{49a,,--disable-gil}. See also 
@geindex PYTHON_GIL
@geindex environment variable; PYTHON_GIL
@ref{49b,,PYTHON_GIL} and
@ref{46d,,Free-threaded CPython}.


Added in version 3.13.


@item 
@code{-X thread_inherit_context=@var{0,1}} causes @ref{177,,Thread}
to, by default, use a copy of context of the caller of
@code{Thread.start()} when starting.  Otherwise, threads will start
with an empty context.  If unset, the value of this option defaults
to @code{1} on free-threaded builds and to @code{0} otherwise.  See also
@geindex PYTHON_THREAD_INHERIT_CONTEXT
@geindex environment variable; PYTHON_THREAD_INHERIT_CONTEXT
@ref{18b1,,PYTHON_THREAD_INHERIT_CONTEXT}.


Added in version 3.14.


@item 
@code{-X context_aware_warnings=@var{0,1}} causes the
@ref{17a,,warnings.catch_warnings} context manager to use a
@ref{18be,,ContextVar} to store warnings filter state.  If
unset, the value of this option defaults to @code{1} on free-threaded builds
and to @code{0} otherwise.  See also 
@geindex PYTHON_CONTEXT_AWARE_WARNINGS
@geindex environment variable; PYTHON_CONTEXT_AWARE_WARNINGS
@ref{18a4,,PYTHON_CONTEXT_AWARE_WARNINGS}.


Added in version 3.14.


@item 
@code{-X tlbc=@var{0,1}} enables (1, the default) or disables (0) thread-local
bytecode in builds configured with @ref{49a,,--disable-gil}.  When disabled,
this also disables the specializing interpreter.  See also
@geindex PYTHON_TLBC
@geindex environment variable; PYTHON_TLBC
@ref{2173,,PYTHON_TLBC}.


Added in version 3.14.

@end itemize

It also allows passing arbitrary values and retrieving them through the
@ref{2174,,sys._xoptions} dictionary.


Added in version 3.2.



Changed in version 3.9: Removed the @code{-X showalloccount} option.



Changed in version 3.10: Removed the @code{-X oldparser} option.

@end deffn


Removed in version 3.14: @code{-J} is no longer reserved for use by Jython@footnote{https://www.jython.org/},
and now has no special meaning.


@node Controlling color,,Miscellaneous options,Command line
@anchor{using/cmdline controlling-color}@anchor{2175}@anchor{using/cmdline using-on-controlling-color}@anchor{1b9}
@subsubsection Controlling color


The Python interpreter is configured by default to use colors to highlight
output in certain situations such as when displaying tracebacks. This
behavior can be controlled by setting different environment variables.

Setting the environment variable @code{TERM} to @code{dumb} will disable color.

If the FORCE_COLOR@footnote{https://force-color.org/} environment variable is set, then color will be
enabled regardless of the value of TERM. This is useful on CI systems which
aren’t terminals but can still display ANSI escape sequences.

If the NO_COLOR@footnote{https://no-color.org/} environment variable is set, Python will disable all color
in the output. This takes precedence over @code{FORCE_COLOR}.

All these environment variables are used also by other tools to control color
output. To control the color output only in the Python interpreter, the
@geindex PYTHON_COLORS
@geindex environment variable; PYTHON_COLORS
@ref{476,,PYTHON_COLORS} environment variable can be used. This variable takes
precedence over @code{NO_COLOR}, which in turn takes precedence over
@code{FORCE_COLOR}.

@node Environment variables,,Command line,Command line and environment<2>
@anchor{using/cmdline environment-variables}@anchor{2176}@anchor{using/cmdline using-on-envvars}@anchor{808}
@subsection Environment variables


These environment variables influence Python’s behavior, they are processed
before the command-line switches other than -E or -I.  It is customary that
command-line switches override environmental variables where there is a
conflict.

@geindex environment variable; PYTHONHOME
@anchor{using/cmdline envvar-PYTHONHOME}@anchor{3ee}
@deffn {Environment Variable} PYTHONHOME

Change the location of the standard Python libraries.  By default, the
libraries are searched in @code{`prefix'/lib/python`version'} and
@code{`exec_prefix'/lib/python`version'}, where @code{`prefix'} and
@code{`exec_prefix'} are installation-dependent directories, both defaulting
to @code{/usr/local}.

When 
@geindex PYTHONHOME
@geindex environment variable; PYTHONHOME
@ref{3ee,,PYTHONHOME} is set to a single directory, its value replaces
both @code{`prefix'} and @code{`exec_prefix'}.  To specify different values
for these, set 
@geindex PYTHONHOME
@geindex environment variable; PYTHONHOME
@code{PYTHONHOME} to @code{`prefix':`exec_prefix'}.
@end deffn

@geindex environment variable; PYTHONPATH
@anchor{using/cmdline envvar-PYTHONPATH}@anchor{1223}
@deffn {Environment Variable} PYTHONPATH

Augment the default search path for module files.  The format is the same as
the shell’s 
@geindex PATH
@geindex environment variable; PATH
@code{PATH}: one or more directory pathnames separated by
@ref{2177,,os.pathsep} (e.g. colons on Unix or semicolons on Windows).
Non-existent directories are silently ignored.

In addition to normal directories, individual 
@geindex PYTHONPATH
@geindex environment variable; PYTHONPATH
@ref{1223,,PYTHONPATH} entries
may refer to zipfiles containing pure Python modules (in either source or
compiled form). Extension modules cannot be imported from zipfiles.

The default search path is installation dependent, but generally begins with
@code{`prefix'/lib/python`version'} (see 
@geindex PYTHONHOME
@geindex environment variable; PYTHONHOME
@ref{3ee,,PYTHONHOME} above).  It
is `always' appended to 
@geindex PYTHONPATH
@geindex environment variable; PYTHONPATH
@ref{1223,,PYTHONPATH}.

An additional directory will be inserted in the search path in front of
@geindex PYTHONPATH
@geindex environment variable; PYTHONPATH
@ref{1223,,PYTHONPATH} as described above under
@ref{215e,,Interface options}. The search path can be manipulated from
within a Python program as the variable @ref{3e2,,sys.path}.
@end deffn

@geindex environment variable; PYTHONSAFEPATH
@anchor{using/cmdline envvar-PYTHONSAFEPATH}@anchor{7c3}
@deffn {Environment Variable} PYTHONSAFEPATH

If this is set to a non-empty string, don’t prepend a potentially unsafe
path to @ref{3e2,,sys.path}: see the @ref{7c2,,-P} option for details.


Added in version 3.11.

@end deffn

@geindex environment variable; PYTHONPLATLIBDIR
@anchor{using/cmdline envvar-PYTHONPLATLIBDIR}@anchor{1d67}
@deffn {Environment Variable} PYTHONPLATLIBDIR

If this is set to a non-empty string, it overrides the @ref{b38,,sys.platlibdir}
value.


Added in version 3.9.

@end deffn

@geindex environment variable; PYTHONSTARTUP
@anchor{using/cmdline envvar-PYTHONSTARTUP}@anchor{1ba}
@deffn {Environment Variable} PYTHONSTARTUP

If this is the name of a readable file, the Python commands in that file are
executed before the first prompt is displayed in interactive mode.  The file
is executed in the same namespace where interactive commands are executed so
that objects defined or imported in it can be used without qualification in
the interactive session.  You can also change the prompts @ref{2178,,sys.ps1} and
@ref{2179,,sys.ps2} and the hook @ref{11ce,,sys.__interactivehook__} in this file.


Raises an @ref{1cb1,,auditing event} @code{cpython.run_startup} with
the filename as the argument when called on startup.

@end deffn

@geindex environment variable; PYTHONOPTIMIZE
@anchor{using/cmdline envvar-PYTHONOPTIMIZE}@anchor{2168}
@deffn {Environment Variable} PYTHONOPTIMIZE

If this is set to a non-empty string it is equivalent to specifying the
@ref{18d,,-O} option.  If set to an integer, it is equivalent to specifying
@code{-O} multiple times.
@end deffn

@geindex environment variable; PYTHONBREAKPOINT
@anchor{using/cmdline envvar-PYTHONBREAKPOINT}@anchor{cd8}
@deffn {Environment Variable} PYTHONBREAKPOINT

If this is set, it names a callable using dotted-path notation.  The module
containing the callable will be imported and then the callable will be run
by the default implementation of @ref{cd7,,sys.breakpointhook()} which itself is
called by built-in @ref{273,,breakpoint()}.  If not set, or set to the empty
string, it is equivalent to the value “pdb.set_trace”.  Setting this to the
string “0” causes the default implementation of @code{sys.breakpointhook()}
to do nothing but return immediately.


Added in version 3.7.

@end deffn

@geindex environment variable; PYTHONDEBUG
@anchor{using/cmdline envvar-PYTHONDEBUG}@anchor{2167}
@deffn {Environment Variable} PYTHONDEBUG

If this is set to a non-empty string it is equivalent to specifying the
@ref{2166,,-d} option.  If set to an integer, it is equivalent to specifying
@code{-d} multiple times.

This environment variable requires a @ref{50a,,debug build of Python}, otherwise it’s ignored.
@end deffn

@geindex environment variable; PYTHONINSPECT
@anchor{using/cmdline envvar-PYTHONINSPECT}@anchor{16e6}
@deffn {Environment Variable} PYTHONINSPECT

If this is set to a non-empty string it is equivalent to specifying the
@ref{16e7,,-i} option.

This variable can also be modified by Python code using @ref{25b,,os.environ}
to force inspect mode on program termination.

Raises an @ref{1cb1,,auditing event} @code{cpython.run_stdin} with no arguments.


Changed in version 3.12.5: (also 3.11.10, 3.10.15, 3.9.20, and 3.8.20)
Emits audit events.



Changed in version 3.13: Uses PyREPL if possible, in which case 
@geindex PYTHONSTARTUP
@geindex environment variable; PYTHONSTARTUP
@ref{1ba,,PYTHONSTARTUP} is
also executed. Emits audit events.

@end deffn

@geindex environment variable; PYTHONUNBUFFERED
@anchor{using/cmdline envvar-PYTHONUNBUFFERED}@anchor{1dd2}
@deffn {Environment Variable} PYTHONUNBUFFERED

If this is set to a non-empty string it is equivalent to specifying the
@ref{1dd1,,-u} option.
@end deffn

@geindex environment variable; PYTHONVERBOSE
@anchor{using/cmdline envvar-PYTHONVERBOSE}@anchor{216b}
@deffn {Environment Variable} PYTHONVERBOSE

If this is set to a non-empty string it is equivalent to specifying the
@ref{1631,,-v} option.  If set to an integer, it is equivalent to specifying
@code{-v} multiple times.
@end deffn

@geindex environment variable; PYTHONCASEOK
@anchor{using/cmdline envvar-PYTHONCASEOK}@anchor{b5b}
@deffn {Environment Variable} PYTHONCASEOK

If this is set, Python ignores case in @ref{7f9,,import} statements.  This
only works on Windows and macOS.
@end deffn

@geindex environment variable; PYTHONDONTWRITEBYTECODE
@anchor{using/cmdline envvar-PYTHONDONTWRITEBYTECODE}@anchor{15da}
@deffn {Environment Variable} PYTHONDONTWRITEBYTECODE

If this is set to a non-empty string, Python won’t try to write @code{.pyc}
files on the import of source modules.  This is equivalent to
specifying the @ref{15d9,,-B} option.
@end deffn

@geindex environment variable; PYTHONPYCACHEPREFIX
@anchor{using/cmdline envvar-PYTHONPYCACHEPREFIX}@anchor{ba1}
@deffn {Environment Variable} PYTHONPYCACHEPREFIX

If this is set, Python will write @code{.pyc} files in a mirror directory tree
at this path, instead of in @code{__pycache__} directories within the source
tree. This is equivalent to specifying the @ref{170,,-X}
@code{pycache_prefix=PATH} option.


Added in version 3.8.

@end deffn

@geindex environment variable; PYTHONHASHSEED
@anchor{using/cmdline envvar-PYTHONHASHSEED}@anchor{1283}
@deffn {Environment Variable} PYTHONHASHSEED

If this variable is not set or set to @code{random}, a random value is used
to seed the hashes of str and bytes objects.

If 
@geindex PYTHONHASHSEED
@geindex environment variable; PYTHONHASHSEED
@ref{1283,,PYTHONHASHSEED} is set to an integer value, it is used as a fixed
seed for generating the hash() of the types covered by the hash
randomization.

Its purpose is to allow repeatable hashing, such as for selftests for the
interpreter itself, or to allow a cluster of python processes to share hash
values.

The integer must be a decimal number in the range [0,4294967295].  Specifying
the value 0 will disable hash randomization.


Added in version 3.2.3.

@end deffn

@geindex environment variable; PYTHONINTMAXSTRDIGITS
@anchor{using/cmdline envvar-PYTHONINTMAXSTRDIGITS}@anchor{1b7e}
@deffn {Environment Variable} PYTHONINTMAXSTRDIGITS

If this variable is set to an integer, it is used to configure the
interpreter’s global @ref{80c,,integer string conversion length limitation}.


Added in version 3.11.

@end deffn

@geindex environment variable; PYTHONIOENCODING
@anchor{using/cmdline envvar-PYTHONIOENCODING}@anchor{1210}
@deffn {Environment Variable} PYTHONIOENCODING

If this is set before running the interpreter, it overrides the encoding used
for stdin/stdout/stderr, in the syntax @code{encodingname:errorhandler}.  Both
the @code{encodingname} and the @code{:errorhandler} parts are optional and have
the same meaning as in @ref{ad8,,str.encode()}.

For stderr, the @code{:errorhandler} part is ignored; the handler will always be
@code{'backslashreplace'}.


Changed in version 3.4: The @code{encodingname} part is now optional.



Changed in version 3.6: On Windows, the encoding specified by this variable is ignored for interactive
console buffers unless 
@geindex PYTHONLEGACYWINDOWSSTDIO
@geindex environment variable; PYTHONLEGACYWINDOWSSTDIO
@ref{e5b,,PYTHONLEGACYWINDOWSSTDIO} is also specified.
Files and pipes redirected through the standard streams are not affected.

@end deffn

@geindex environment variable; PYTHONNOUSERSITE
@anchor{using/cmdline envvar-PYTHONNOUSERSITE}@anchor{159b}
@deffn {Environment Variable} PYTHONNOUSERSITE

If this is set, Python won’t add the @ref{2169,,user site-packages directory} to @ref{3e2,,sys.path}.


@subsubheading See also


@geindex Python Enhancement Proposals; PEP 370
PEP 370@footnote{https://peps.python.org/pep-0370/} – Per user site-packages directory

@end deffn

@geindex environment variable; PYTHONUSERBASE
@anchor{using/cmdline envvar-PYTHONUSERBASE}@anchor{1599}
@deffn {Environment Variable} PYTHONUSERBASE

Defines the @ref{1528,,user base directory}, which is used to
compute the path of the @ref{2169,,user site-packages directory}
and @ref{217a,,installation paths} for
@code{python -m pip install --user}.


@subsubheading See also


@geindex Python Enhancement Proposals; PEP 370
PEP 370@footnote{https://peps.python.org/pep-0370/} – Per user site-packages directory

@end deffn

@geindex environment variable; PYTHONEXECUTABLE
@anchor{using/cmdline envvar-PYTHONEXECUTABLE}@anchor{217b}
@deffn {Environment Variable} PYTHONEXECUTABLE

If this environment variable is set, @code{sys.argv[0]} will be set to its
value instead of the value got through the C runtime.  Only works on
macOS.
@end deffn

@geindex environment variable; PYTHONWARNINGS
@anchor{using/cmdline envvar-PYTHONWARNINGS}@anchor{da9}
@deffn {Environment Variable} PYTHONWARNINGS

This is equivalent to the @ref{acb,,-W} option. If set to a comma
separated string, it is equivalent to specifying @code{-W} multiple
times, with filters later in the list taking precedence over those earlier
in the list.

The simplest settings apply a particular action unconditionally to all
warnings emitted by a process (even those that are otherwise ignored by
default):

@example
PYTHONWARNINGS=default  # Warn once per call location
PYTHONWARNINGS=error    # Convert to exceptions
PYTHONWARNINGS=always   # Warn every time
PYTHONWARNINGS=all      # Same as PYTHONWARNINGS=always
PYTHONWARNINGS=module   # Warn once per calling module
PYTHONWARNINGS=once     # Warn once per Python process
PYTHONWARNINGS=ignore   # Never warn
@end example

See @ref{1b2,,The Warnings Filter} and @ref{216d,,Describing Warning Filters} for more
details.
@end deffn

@geindex environment variable; PYTHONFAULTHANDLER
@anchor{using/cmdline envvar-PYTHONFAULTHANDLER}@anchor{128b}
@deffn {Environment Variable} PYTHONFAULTHANDLER

If this environment variable is set to a non-empty string,
@ref{211,,faulthandler.enable()} is called at startup: install a handler for
@ref{1286,,SIGSEGV}, @ref{1287,,SIGFPE},
@ref{1288,,SIGABRT}, @ref{1289,,SIGBUS} and
@ref{128a,,SIGILL} signals to dump the Python traceback.
This is equivalent to @ref{170,,-X} @code{faulthandler} option.


Added in version 3.3.

@end deffn

@geindex environment variable; PYTHONTRACEMALLOC
@anchor{using/cmdline envvar-PYTHONTRACEMALLOC}@anchor{2170}
@deffn {Environment Variable} PYTHONTRACEMALLOC

If this environment variable is set to a non-empty string, start tracing
Python memory allocations using the @ref{106,,tracemalloc} module. The value of
the variable is the maximum number of frames stored in a traceback of a
trace. For example, @code{PYTHONTRACEMALLOC=1} stores only the most recent
frame.
See the @ref{216f,,tracemalloc.start()} function for more information.
This is equivalent to setting the @ref{170,,-X} @code{tracemalloc} option.


Added in version 3.4.

@end deffn

@geindex environment variable; PYTHONPROFILEIMPORTTIME
@anchor{using/cmdline envvar-PYTHONPROFILEIMPORTTIME}@anchor{cf3}
@deffn {Environment Variable} PYTHONPROFILEIMPORTTIME

If this environment variable is set to @code{1}, Python will show
how long each import takes. If set to @code{2}, Python will include output for
imported modules that have already been loaded.
This is equivalent to setting the @ref{170,,-X} @code{importtime} option.


Added in version 3.7.



Changed in version 3.14: Added @code{PYTHONPROFILEIMPORTTIME=2} to also trace imports of loaded modules.

@end deffn

@geindex environment variable; PYTHONASYNCIODEBUG
@anchor{using/cmdline envvar-PYTHONASYNCIODEBUG}@anchor{217c}
@deffn {Environment Variable} PYTHONASYNCIODEBUG

If this environment variable is set to a non-empty string, enable the
@ref{217d,,debug mode} of the @ref{b,,asyncio} module.


Added in version 3.4.

@end deffn

@geindex environment variable; PYTHONMALLOC
@anchor{using/cmdline envvar-PYTHONMALLOC}@anchor{e64}
@deffn {Environment Variable} PYTHONMALLOC

Set the Python memory allocators and/or install debug hooks.

Set the family of memory allocators used by Python:


@itemize *

@item 
@code{default}: use the @ref{217e,,default memory allocators}.

@item 
@code{malloc}: use the @code{malloc()} function of the C library
for all domains (@ref{217f,,PYMEM_DOMAIN_RAW}, @ref{e69,,PYMEM_DOMAIN_MEM},
@ref{e67,,PYMEM_DOMAIN_OBJ}).

@item 
@code{pymalloc}: use the @ref{f11,,pymalloc allocator} for
@ref{e69,,PYMEM_DOMAIN_MEM} and @ref{e67,,PYMEM_DOMAIN_OBJ} domains and use
the @code{malloc()} function for the @ref{217f,,PYMEM_DOMAIN_RAW} domain.

@item 
@code{mimalloc}: use the @ref{176a,,mimalloc allocator} for
@ref{e69,,PYMEM_DOMAIN_MEM} and @ref{e67,,PYMEM_DOMAIN_OBJ} domains and use
the @code{malloc()} function for the @ref{217f,,PYMEM_DOMAIN_RAW} domain.
@end itemize

Install @ref{2180,,debug hooks}:


@itemize *

@item 
@code{debug}: install debug hooks on top of the @ref{217e,,default memory allocators}.

@item 
@code{malloc_debug}: same as @code{malloc} but also install debug hooks.

@item 
@code{pymalloc_debug}: same as @code{pymalloc} but also install debug hooks.

@item 
@code{mimalloc_debug}: same as @code{mimalloc} but also install debug hooks.
@end itemize

@cartouche
@quotation Note 
In the @ref{1f6,,free-threaded} build, the @code{malloc},
@code{malloc_debug}, @code{pymalloc}, and @code{pymalloc_debug} values are not
supported.  Only @code{default}, @code{debug}, @code{mimalloc}, and
@code{mimalloc_debug} are accepted.
@end quotation
@end cartouche


Added in version 3.6.



Changed in version 3.7: Added the @code{"default"} allocator.

@end deffn

@geindex environment variable; PYTHONMALLOCSTATS
@anchor{using/cmdline envvar-PYTHONMALLOCSTATS}@anchor{1f79}
@deffn {Environment Variable} PYTHONMALLOCSTATS

If set to a non-empty string, Python will print statistics of the
@ref{f11,,pymalloc memory allocator} or the
@ref{176a,,mimalloc memory allocator} (whichever is in use)
every time a new object arena is created, and on shutdown.

This variable is ignored if the 
@geindex PYTHONMALLOC
@geindex environment variable; PYTHONMALLOC
@ref{e64,,PYTHONMALLOC} environment variable
is used to force the @code{malloc()} allocator of the C library, or if
Python is configured without both @code{pymalloc} and @code{mimalloc} support.


Changed in version 3.6: This variable can now also be used on Python compiled in release mode.
It now has no effect if set to an empty string.

@end deffn

@geindex environment variable; PYTHONLEGACYWINDOWSFSENCODING
@anchor{using/cmdline envvar-PYTHONLEGACYWINDOWSFSENCODING}@anchor{33d}
@deffn {Environment Variable} PYTHONLEGACYWINDOWSFSENCODING

If set to a non-empty string, the default @ref{75e,,filesystem encoding and error handler} mode will revert to their pre-3.6 values of ‘mbcs’ and
‘replace’, respectively.  Otherwise, the new defaults ‘utf-8’ and
‘surrogatepass’ are used.

This may also be enabled at runtime with
@ref{33c,,sys._enablelegacywindowsfsencoding()}.

@ref{2181,,Availability}: Windows.


Added in version 3.6: See 
@geindex Python Enhancement Proposals; PEP 529
PEP 529@footnote{https://peps.python.org/pep-0529/} for more details.

@end deffn

@geindex environment variable; PYTHONLEGACYWINDOWSSTDIO
@anchor{using/cmdline envvar-PYTHONLEGACYWINDOWSSTDIO}@anchor{e5b}
@deffn {Environment Variable} PYTHONLEGACYWINDOWSSTDIO

If set to a non-empty string, does not use the new console reader and
writer. This means that Unicode characters will be encoded according to
the active console code page, rather than using utf-8.

This variable is ignored if the standard streams are redirected (to files
or pipes) rather than referring to console buffers.

@ref{2181,,Availability}: Windows.


Added in version 3.6.

@end deffn

@geindex environment variable; PYTHONCOERCECLOCALE
@anchor{using/cmdline envvar-PYTHONCOERCECLOCALE}@anchor{cd2}
@deffn {Environment Variable} PYTHONCOERCECLOCALE

If set to the value @code{0}, causes the main Python command line application
to skip coercing the legacy ASCII-based C and POSIX locales to a more
capable UTF-8 based alternative.

If this variable is `not' set (or is set to a value other than @code{0}), the
@code{LC_ALL} locale override environment variable is also not set, and the
current locale reported for the @code{LC_CTYPE} category is either the default
@code{C} locale, or else the explicitly ASCII-based @code{POSIX} locale, then the
Python CLI will attempt to configure the following locales for the
@code{LC_CTYPE} category in the order listed before loading the interpreter
runtime:


@itemize *

@item 
@code{C.UTF-8}

@item 
@code{C.utf8}

@item 
@code{UTF-8}
@end itemize

If setting one of these locale categories succeeds, then the @code{LC_CTYPE}
environment variable will also be set accordingly in the current process
environment before the Python runtime is initialized. This ensures that in
addition to being seen by both the interpreter itself and other locale-aware
components running in the same process (such as the GNU @code{readline}
library), the updated setting is also seen in subprocesses (regardless of
whether or not those processes are running a Python interpreter), as well as
in operations that query the environment rather than the current C locale
(such as Python’s own @ref{930,,locale.getdefaultlocale()}).

Configuring one of these locales (either explicitly or via the above
implicit locale coercion) automatically enables the @code{surrogateescape}
@ref{1bb3,,error handler} for @ref{760,,sys.stdin} and
@ref{cd3,,sys.stdout} (@ref{b39,,sys.stderr} continues to use @code{backslashreplace}
as it does in any other locale). This stream handling behavior can be
overridden using 
@geindex PYTHONIOENCODING
@geindex environment variable; PYTHONIOENCODING
@ref{1210,,PYTHONIOENCODING} as usual.

For debugging purposes, setting @code{PYTHONCOERCECLOCALE=warn} will cause
Python to emit warning messages on @code{stderr} if either the locale coercion
activates, or else if a locale that `would' have triggered coercion is
still active when the Python runtime is initialized.

Also note that even when locale coercion is disabled, or when it fails to
find a suitable target locale, 
@geindex PYTHONUTF8
@geindex environment variable; PYTHONUTF8
@ref{cd5,,PYTHONUTF8} will still activate by
default in legacy ASCII-based locales. Both features must be disabled in
order to force the interpreter to use @code{ASCII} instead of @code{UTF-8} for
system interfaces.

@ref{2181,,Availability}: Unix.


Added in version 3.7: See 
@geindex Python Enhancement Proposals; PEP 538
PEP 538@footnote{https://peps.python.org/pep-0538/} for more details.

@end deffn

@geindex environment variable; PYTHONDEVMODE
@anchor{using/cmdline envvar-PYTHONDEVMODE}@anchor{ced}
@deffn {Environment Variable} PYTHONDEVMODE

If this environment variable is set to a non-empty string, enable
@ref{509,,Python Development Mode}, introducing additional runtime
checks that are too expensive to be enabled by default.
This is equivalent to setting the @ref{170,,-X} @code{dev} option.


Added in version 3.7.

@end deffn

@geindex environment variable; PYTHONUTF8
@anchor{using/cmdline envvar-PYTHONUTF8}@anchor{cd5}
@deffn {Environment Variable} PYTHONUTF8

If set to @code{1}, enable the @ref{868,,Python UTF-8 Mode}.

If set to @code{0}, disable the @ref{868,,Python UTF-8 Mode}.

Setting any other non-empty string causes an error during interpreter
initialisation.


Added in version 3.7.

@end deffn

@geindex environment variable; PYTHONWARNDEFAULTENCODING
@anchor{using/cmdline envvar-PYTHONWARNDEFAULTENCODING}@anchor{9c5}
@deffn {Environment Variable} PYTHONWARNDEFAULTENCODING

If this environment variable is set to a non-empty string, issue a
@ref{2171,,EncodingWarning} when the locale-specific default encoding is used.

See @ref{2182,,Opt-in EncodingWarning} for details.


Added in version 3.10.

@end deffn

@geindex environment variable; PYTHONNODEBUGRANGES
@anchor{using/cmdline envvar-PYTHONNODEBUGRANGES}@anchor{7d4}
@deffn {Environment Variable} PYTHONNODEBUGRANGES

If this variable is set, it disables the inclusion of the tables mapping
extra location information (end line, start column offset and end column
offset) to every instruction in code objects. This is useful when smaller
code objects and pyc files are desired as well as suppressing the extra visual
location indicators when the interpreter displays tracebacks.


Added in version 3.11.

@end deffn

@geindex environment variable; PYTHONPERFSUPPORT
@anchor{using/cmdline envvar-PYTHONPERFSUPPORT}@anchor{69a}
@deffn {Environment Variable} PYTHONPERFSUPPORT

If this variable is set to a nonzero value, it enables support for
the Linux @code{perf} profiler so Python calls can be detected by it.

If set to @code{0}, disable Linux @code{perf} profiler support.

See also the @ref{170,,-X perf} command-line option
and @ref{4af,,Python support for the Linux perf profiler}.


Added in version 3.12.

@end deffn

@geindex environment variable; PYTHON_PERF_JIT_SUPPORT
@anchor{using/cmdline envvar-PYTHON_PERF_JIT_SUPPORT}@anchor{4b0}
@deffn {Environment Variable} PYTHON_PERF_JIT_SUPPORT

If this variable is set to a nonzero value, it enables support for
the Linux @code{perf} profiler so Python calls can be detected by it
using DWARF information.

If set to @code{0}, disable Linux @code{perf} profiler support.

See also the @ref{170,,-X perf_jit} command-line option
and @ref{4af,,Python support for the Linux perf profiler}.


Added in version 3.13.

@end deffn

@geindex environment variable; PYTHON_DISABLE_REMOTE_DEBUG
@anchor{using/cmdline envvar-PYTHON_DISABLE_REMOTE_DEBUG}@anchor{16f}
@deffn {Environment Variable} PYTHON_DISABLE_REMOTE_DEBUG

If this variable is set to a non-empty string, it disables the remote
debugging feature described in 
@geindex Python Enhancement Proposals; PEP 768
PEP 768@footnote{https://peps.python.org/pep-0768/}. This includes both the functionality
to schedule code for execution in another process and the functionality to
receive code for execution in the current process.

See also the @ref{170,,-X disable_remote_debug} command-line option.


Added in version 3.14.

@end deffn

@geindex environment variable; PYTHON_CPU_COUNT
@anchor{using/cmdline envvar-PYTHON_CPU_COUNT}@anchor{51f}
@deffn {Environment Variable} PYTHON_CPU_COUNT

If this variable is set to a positive integer, it overrides the return
values of @ref{4dc,,os.cpu_count()} and @ref{4db,,os.process_cpu_count()}.

See also the @ref{170,,-X cpu_count} command-line option.


Added in version 3.13.

@end deffn

@geindex environment variable; PYTHON_FROZEN_MODULES
@anchor{using/cmdline envvar-PYTHON_FROZEN_MODULES}@anchor{4ae}
@deffn {Environment Variable} PYTHON_FROZEN_MODULES

If this variable is set to @code{on} or @code{off}, it determines whether or not
frozen modules are ignored by the import machinery.  A value of @code{on} means
they get imported and @code{off} means they are ignored.  The default is @code{on}
for non-debug builds (the normal case) and @code{off} for debug builds.
Note that the @code{importlib_bootstrap} and
@code{importlib_bootstrap_external} frozen modules are always used, even
if this flag is set to @code{off}.

See also the @ref{170,,-X frozen_modules} command-line option.


Added in version 3.13.

@end deffn

@geindex environment variable; PYTHON_COLORS
@anchor{using/cmdline envvar-PYTHON_COLORS}@anchor{476}
@deffn {Environment Variable} PYTHON_COLORS

If this variable is set to @code{1}, the interpreter will colorize various kinds
of output. Setting it to @code{0} deactivates this behavior.
See also @ref{1b9,,Controlling color}.


Added in version 3.13.

@end deffn

@geindex environment variable; PYTHON_BASIC_REPL
@anchor{using/cmdline envvar-PYTHON_BASIC_REPL}@anchor{1b8}
@deffn {Environment Variable} PYTHON_BASIC_REPL

If this variable is set to any value, the interpreter will not attempt to
load the Python-based @ref{492,,REPL} that requires @ref{bf,,readline}, and will
instead use the traditional parser-based REPL.


Added in version 3.13.

@end deffn

@geindex environment variable; PYTHON_HISTORY
@anchor{using/cmdline envvar-PYTHON_HISTORY}@anchor{4b1}
@deffn {Environment Variable} PYTHON_HISTORY

This environment variable can be used to set the location of a
@code{.python_history} file (by default, it is @code{.python_history} in the
user’s home directory).


Added in version 3.13.

@end deffn

@geindex environment variable; PYTHON_GIL
@anchor{using/cmdline envvar-PYTHON_GIL}@anchor{49b}
@deffn {Environment Variable} PYTHON_GIL

If this variable is set to @code{1}, the global interpreter lock (GIL) will be
forced on. Setting it to @code{0} forces the GIL off (needs Python configured with
the @ref{49a,,--disable-gil} build option).

See also the @ref{170,,-X gil} command-line option, which takes
precedence over this variable, and @ref{46d,,Free-threaded CPython}.


Added in version 3.13.

@end deffn

@geindex environment variable; PYTHON_THREAD_INHERIT_CONTEXT
@anchor{using/cmdline envvar-PYTHON_THREAD_INHERIT_CONTEXT}@anchor{18b1}
@deffn {Environment Variable} PYTHON_THREAD_INHERIT_CONTEXT

If this variable is set to @code{1} then @ref{177,,Thread} will,
by default, use a copy of context of the caller of @code{Thread.start()}
when starting.  Otherwise, new threads will start with an empty context.
If unset, this variable defaults to @code{1} on free-threaded builds and to
@code{0} otherwise.  See also @ref{170,,-X thread_inherit_context}.


Added in version 3.14.

@end deffn

@geindex environment variable; PYTHON_CONTEXT_AWARE_WARNINGS
@anchor{using/cmdline envvar-PYTHON_CONTEXT_AWARE_WARNINGS}@anchor{18a4}
@deffn {Environment Variable} PYTHON_CONTEXT_AWARE_WARNINGS

If set to @code{1} then the @ref{17a,,warnings.catch_warnings} context
manager will use a @ref{18be,,ContextVar} to store warnings
filter state.  If unset, this variable defaults to @code{1} on
free-threaded builds and to @code{0} otherwise.  See @ref{170,,-X context_aware_warnings}.


Added in version 3.14.

@end deffn

@geindex environment variable; PYTHON_JIT
@anchor{using/cmdline envvar-PYTHON_JIT}@anchor{44b}
@deffn {Environment Variable} PYTHON_JIT

On builds where experimental just-in-time compilation is available, this
variable can force the JIT to be disabled (@code{0}) or enabled (@code{1}) at
interpreter startup.


Added in version 3.13.

@end deffn

@geindex environment variable; PYTHON_TLBC
@anchor{using/cmdline envvar-PYTHON_TLBC}@anchor{2173}
@deffn {Environment Variable} PYTHON_TLBC

If set to @code{1} enables thread-local bytecode. If set to @code{0} thread-local
bytecode and the specializing interpreter are disabled.  Only applies to
builds configured with @ref{49a,,--disable-gil}.

See also the @ref{170,,-X tlbc} command-line option.


Added in version 3.14.

@end deffn

@menu
* Debug-mode variables:: 

@end menu

@node Debug-mode variables,,,Environment variables
@anchor{using/cmdline debug-mode-variables}@anchor{2183}
@subsubsection Debug-mode variables


@geindex environment variable; PYTHONDUMPREFS
@anchor{using/cmdline envvar-PYTHONDUMPREFS}@anchor{ba4}
@deffn {Environment Variable} PYTHONDUMPREFS

If set, Python will dump objects and reference counts still alive after
shutting down the interpreter.

Needs Python configured with the @ref{636,,--with-trace-refs} build option.
@end deffn

@geindex environment variable; PYTHONDUMPREFSFILE
@anchor{using/cmdline envvar-PYTHONDUMPREFSFILE}@anchor{1c82}
@deffn {Environment Variable} PYTHONDUMPREFSFILE

If set, Python will dump objects and reference counts still alive
after shutting down the interpreter into a file under the path given
as the value to this environment variable.

Needs Python configured with the @ref{636,,--with-trace-refs} build option.


Added in version 3.11.

@end deffn

@geindex environment variable; PYTHON_PRESITE
@anchor{using/cmdline envvar-PYTHON_PRESITE}@anchor{2172}
@deffn {Environment Variable} PYTHON_PRESITE

If this variable is set to a module, that module will be imported
early in the interpreter lifecycle, before the @ref{cc,,site} module is
executed, and before the @ref{1,,__main__} module is created.
Therefore, the imported module is not treated as @code{__main__}.

This can be used to execute code early during Python initialization.

To import a submodule, use @code{package.module} as the value, like in
an import statement.

See also the @ref{170,,-X presite} command-line option,
which takes precedence over this variable.

Needs Python configured with the @ref{666,,--with-pydebug} build option.


Added in version 3.13.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Using Python on Unix platforms,Configure Python,Command line and environment<2>,Python Setup and Usage
@anchor{using/unix doc}@anchor{2184}@anchor{using/unix translation-repo}@anchor{2185}@anchor{using/unix using-on-unix}@anchor{2186}@anchor{using/unix using-python-on-unix-platforms}@anchor{2187}
@section Using Python on Unix platforms


@menu
* Getting and installing the latest version of Python:: 
* Building Python:: 
* Python-related paths and files:: 
* Miscellaneous:: 
* Custom OpenSSL:: 

@end menu

@node Getting and installing the latest version of Python,Building Python,,Using Python on Unix platforms
@anchor{using/unix getting-and-installing-the-latest-version-of-python}@anchor{2188}
@subsection Getting and installing the latest version of Python


@menu
* On Linux:: 
* On FreeBSD and OpenBSD:: 

@end menu

@node On Linux,On FreeBSD and OpenBSD,,Getting and installing the latest version of Python
@anchor{using/unix on-linux}@anchor{2189}
@subsubsection On Linux


Python comes preinstalled on most Linux distributions, and is available as a
package on all others.  However there are certain features you might want to use
that are not available on your distro’s package.  You can compile the
latest version of Python from source.

In the event that the latest version of Python doesn’t come preinstalled and isn’t
in the repositories as well, you can make packages for your own distro.  Have a
look at the following links:


@subsubheading See also



@table @asis

@item @indicateurl{https://www.debian.org/doc/manuals/maint-guide/first.en.html}

for Debian users

@item @indicateurl{https://en.opensuse.org/Portal:Packaging}

for OpenSuse users

@item @indicateurl{https://docs.fedoraproject.org/en-US/package-maintainers/Packaging_Tutorial_GNU_Hello/}

for Fedora users

@item @indicateurl{https://slackbook.org/html/package-management-making-packages.html}

for Slackware users
@end table


@menu
* Installing IDLE:: 

@end menu

@node Installing IDLE,,,On Linux
@anchor{using/unix installing-idle}@anchor{218a}@anchor{using/unix installing-idle-on-linux}@anchor{218b}
@subsubsection Installing IDLE


In some cases, IDLE might not be included in your Python installation.


@itemize *

@item 
For Debian and Ubuntu users:

@example
sudo apt update
sudo apt install idle
@end example

@item 
For Fedora, RHEL, and CentOS users:

@example
sudo dnf install python3-idle
@end example

@item 
For SUSE and OpenSUSE users:

@example
sudo zypper install python3-idle
@end example

@item 
For Alpine Linux users:

@example
sudo apk add python3-idle
@end example
@end itemize

@node On FreeBSD and OpenBSD,,On Linux,Getting and installing the latest version of Python
@anchor{using/unix on-freebsd-and-openbsd}@anchor{218c}
@subsubsection On FreeBSD and OpenBSD



@itemize *

@item 
FreeBSD users, to add the package use:

@example
pkg install python3
@end example

@item 
OpenBSD users, to add the package use:

@example
pkg_add -r python

pkg_add ftp://ftp.openbsd.org/pub/OpenBSD/4.2/packages/<insert your architecture here>/python-<version>.tgz
@end example

For example i386 users get the 2.5.1 version of Python using:

@example
pkg_add ftp://ftp.openbsd.org/pub/OpenBSD/4.2/packages/i386/python-2.5.1p2.tgz
@end example
@end itemize

@node Building Python,Python-related paths and files,Getting and installing the latest version of Python,Using Python on Unix platforms
@anchor{using/unix building-python}@anchor{218d}@anchor{using/unix building-python-on-unix}@anchor{10fc}
@subsection Building Python



@subsubheading See also


If you want to contribute to CPython, refer to the
devguide@footnote{https://devguide.python.org/getting-started/setup-building/},
which includes build instructions and other tips on setting up environment.


If you want to compile CPython yourself, first thing you should do is get the
source@footnote{https://www.python.org/downloads/source/}. You can download either the
latest release’s source or grab a fresh clone@footnote{https://devguide.python.org/setup/#get-the-source-code}.
You will also need to install the @ref{218e,,build requirements}.

The build process consists of the usual commands:

@example
./configure
make
make install
@end example

@ref{218f,,Configuration options} and caveats for specific Unix
platforms are extensively documented in the README.rst@footnote{https://github.com/python/cpython/tree/3.14/README.rst} file in the
root of the Python source tree.

@cartouche
@quotation Warning 
@code{make install} can overwrite or masquerade the @code{python3} binary.
@code{make altinstall} is therefore recommended instead of @code{make install}
since it only installs @code{`exec_prefix'/bin/python`version'}.
@end quotation
@end cartouche

@node Python-related paths and files,Miscellaneous,Building Python,Using Python on Unix platforms
@anchor{using/unix python-related-paths-and-files}@anchor{2190}
@subsection Python-related paths and files


These are subject to difference depending on local installation conventions;
@ref{2191,,prefix} and @ref{2192,,exec_prefix}
are installation-dependent and should be interpreted as for GNU software; they
may be the same.

For example, on most Linux systems, the default for both is @code{/usr}.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

File/directory

@tab

Meaning

@item

@code{`exec_prefix'/bin/python3}

@tab

Recommended location of the interpreter.

@item

@code{`prefix'/lib/python`version'},
@code{`exec_prefix'/lib/python`version'}

@tab

Recommended locations of the directories
containing the standard modules.

@item

@code{`prefix'/include/python`version'},
@code{`exec_prefix'/include/python`version'}

@tab

Recommended locations of the directories
containing the include files needed for
developing Python extensions and
embedding the interpreter.

@end multitable


@node Miscellaneous,Custom OpenSSL,Python-related paths and files,Using Python on Unix platforms
@anchor{using/unix miscellaneous}@anchor{2193}
@subsection Miscellaneous


To easily use Python scripts on Unix, you need to make them executable,
e.g. with

@example
$ chmod +x script
@end example

and put an appropriate Shebang line at the top of the script.  A good choice is
usually

@example
#!/usr/bin/env python3
@end example

which searches for the Python interpreter in the whole 
@geindex PATH
@geindex environment variable; PATH
@code{PATH}.  However,
some Unices may not have the @code{env} command, so you may need to hardcode
@code{/usr/bin/python3} as the interpreter path.

To use shell commands in your Python scripts, look at the @ref{dc,,subprocess} module.

@node Custom OpenSSL,,Miscellaneous,Using Python on Unix platforms
@anchor{using/unix custom-openssl}@anchor{2194}@anchor{using/unix unix-custom-openssl}@anchor{2195}
@subsection Custom OpenSSL



@enumerate 

@item 
To use your vendor’s OpenSSL configuration and system trust store, locate
the directory with @code{openssl.cnf} file or symlink in @code{/etc}. On most
distribution the file is either in @code{/etc/ssl} or @code{/etc/pki/tls}. The
directory should also contain a @code{cert.pem} file and/or a @code{certs}
directory.

@example
$ find /etc/ -name openssl.cnf -printf "%h\n"
/etc/ssl
@end example

@item 
Download, build, and install OpenSSL. Make sure you use @code{install_sw} and
not @code{install}. The @code{install_sw} target does not override
@code{openssl.cnf}.

@example
$ curl -O https://www.openssl.org/source/openssl-VERSION.tar.gz
$ tar xzf openssl-VERSION
$ pushd openssl-VERSION
$ ./config \
    --prefix=/usr/local/custom-openssl \
    --libdir=lib \
    --openssldir=/etc/ssl
$ make -j1 depend
$ make -j8
$ make install_sw
$ popd
@end example

@item 
Build Python with custom OpenSSL
(see the configure @code{--with-openssl} and @code{--with-openssl-rpath} options)

@example
$ pushd python-3.x.x
$ ./configure -C \
    --with-openssl=/usr/local/custom-openssl \
    --with-openssl-rpath=auto \
    --prefix=/usr/local/python-3.x.x
$ make -j8
$ make altinstall
@end example
@end enumerate

@cartouche
@quotation Note 
Patch releases of OpenSSL have a backwards compatible ABI. You don’t need
to recompile Python to update OpenSSL. It’s sufficient to replace the
custom OpenSSL installation with a newer version.
@end quotation
@end cartouche

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Configure Python,Using Python on Windows,Using Python on Unix platforms,Python Setup and Usage
@anchor{using/configure doc}@anchor{2196}@anchor{using/configure configure-python}@anchor{2197}@anchor{using/configure translation-repo}@anchor{2198}
@section Configure Python


@menu
* Build Requirements:: 
* Generated files:: 
* Configure Options:: 
* Python Build System:: 
* Compiler and linker flags:: 

@end menu

@node Build Requirements,Generated files,,Configure Python
@anchor{using/configure build-requirements}@anchor{218e}@anchor{using/configure id1}@anchor{2199}
@subsection Build Requirements


To build CPython, you will need:


@itemize *

@item 
A C11@footnote{https://en.cppreference.com/w/c/11} compiler. Optional C11 features@footnote{https://en.wikipedia.org/wiki/C11_(C_standard_revision)#Optional_features}
are not required.

@item 
On Windows, Microsoft Visual Studio 2017 or later is required.

@item 
Support for IEEE 754@footnote{https://en.wikipedia.org/wiki/IEEE_754}
floating-point numbers and floating-point Not-a-Number (NaN)@footnote{https://en.wikipedia.org/wiki/NaN#Floating_point}.

@item 
Support for threads.
@end itemize


Changed in version 3.5: On Windows, Visual Studio 2015 or later is now required.



Changed in version 3.6: Selected C99 features, like @code{<stdint.h>} and @code{static inline} functions,
are now required.



Changed in version 3.7: Thread support is now required.



Changed in version 3.11: C11 compiler, IEEE 754 and NaN support are now required.
On Windows, Visual Studio 2017 or later is required.


See also 
@geindex Python Enhancement Proposals; PEP 7
PEP 7@footnote{https://peps.python.org/pep-0007/} “Style Guide for C Code” and 
@geindex Python Enhancement Proposals; PEP 11
PEP 11@footnote{https://peps.python.org/pep-0011/} “CPython platform
support”.

@menu
* Requirements for optional modules:: 

@end menu

@node Requirements for optional modules,,,Build Requirements
@anchor{using/configure optional-module-requirements}@anchor{219a}@anchor{using/configure requirements-for-optional-modules}@anchor{219b}
@subsubsection Requirements for optional modules


Some @ref{219c,,optional modules} of the standard library
require third-party libraries installed for development
(for example, header files must be available).

Missing requirements are reported in the @code{configure} output.
Modules that are missing due to missing dependencies are listed near the end
of the @code{make} output,
sometimes using an internal name, for example, @code{_ctypes} for @ref{2e,,ctypes}
module.

If you distribute a CPython interpreter without optional modules,
it’s best practice to advise users, who generally expect that
standard library modules are available.

Dependencies to build optional modules are:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Dependency

@tab

Minimum version

@tab

Python module

@item

libbz2@footnote{https://sourceware.org/bzip2/}

@tab

@tab

@ref{14,,bz2}

@item

libffi@footnote{https://sourceware.org/libffi/}

@tab

3.3.0 recommended

@tab

@ref{2e,,ctypes}

@item

liblzma@footnote{https://tukaani.org/xz/}

@tab

@tab

@ref{8e,,lzma}

@item

libmpdec@footnote{https://www.bytereef.org/mpdecimal/doc/libmpdec/}

@tab

2.5.0

@tab

@ref{3a,,decimal} @footnote{
If `libmpdec' is not available, the @ref{3a,,decimal} module will use
a pure-Python implementation.
See @ref{657,,--with-system-libmpdec} for details.
}

@item

libreadline@footnote{https://tiswww.case.edu/php/chet/readline/rltop.html} or
libedit@footnote{https://www.thrysoee.dk/editline/} @footnote{
See @ref{219d,,--with-readline} for choosing the backend for the
@ref{bf,,readline} module.
}

@tab

@tab

@ref{bf,,readline}

@item

libuuid@footnote{https://linux.die.net/man/3/libuuid}

@tab

@tab

@code{_uuid} @footnote{
The @ref{117,,uuid} module uses @code{_uuid} to generate “safe” UUIDs.
See the module documentation for details.
}

@item

ncurses@footnote{https://gnu.org/software/ncurses/ncurses.html} @footnote{
The @ref{2f,,curses} module requires the @code{libncurses} or @code{libncursesw}
library.
The @ref{31,,curses.panel} module additionally requires the @code{libpanel} or
@code{libpanelw} library.
}

@tab

@tab

@ref{2f,,curses}

@item

OpenSSL@footnote{https://openssl-library.org/}

@tab


@display
3.0.18 recommended@w{ }
(1.1.1 minimum)@w{ }
@end display



@tab

@ref{d5,,ssl}, @ref{6c,,hashlib} @footnote{
If OpenSSL is not available, the @ref{6c,,hashlib} module will use
bundled implementations of several hash functions.
See @ref{219e,,--with-builtin-hashlib-hashes} for `forcing' usage of OpenSSL.
}

@item

SQLite@footnote{https://sqlite.org/}

@tab

3.15.2

@tab

@ref{d4,,sqlite3}

@item

Tcl/Tk@footnote{https://www.tcl-lang.org/}

@tab

8.5.12

@tab

@ref{f6,,tkinter}, @ref{121b,,IDLE}, @ref{108,,turtle}

@item

zlib@footnote{https://www.zlib.net}

@tab

1.2.2.1

@tab

@ref{13a,,zlib}, @ref{6b,,gzip}, @ref{59,,ensurepip}

@item

zstd@footnote{https://facebook.github.io/zstd/}

@tab

1.4.5

@tab

@ref{23,,compression.zstd}

@end multitable


Note that the table does not include all optional modules; in particular,
platform-specific modules like @ref{11d,,winreg} are not listed here.


@subsubheading See also



@itemize *

@item 
The devguide@footnote{https://devguide.python.org/getting-started/setup-building/#install-dependencies}
includes a full list of dependencies required to build all modules and
instructions on how to install them on common platforms.

@item 
@ref{1b71,,--with-system-expat} allows building with an external
libexpat@footnote{https://libexpat.github.io/} library.

@item 
@ref{219f,,Options for third-party dependencies}
@end itemize



Changed in version 3.1: Tcl/Tk version 8.3.1 is now required for @ref{f6,,tkinter}.



Changed in version 3.5: Tcl/Tk version 8.4 is now required for @ref{f6,,tkinter}.



Changed in version 3.7: OpenSSL 1.0.2 is now required for @ref{6c,,hashlib} and @ref{d5,,ssl}.



Changed in version 3.10: OpenSSL 1.1.1 is now required for @ref{6c,,hashlib} and @ref{d5,,ssl}.
SQLite 3.7.15 is now required for @ref{d4,,sqlite3}.



Changed in version 3.11: Tcl/Tk version 8.5.12 is now required for @ref{f6,,tkinter}.



Changed in version 3.13: SQLite 3.15.2 is now required for @ref{d4,,sqlite3}.


@node Generated files,Configure Options,Build Requirements,Configure Python
@anchor{using/configure generated-files}@anchor{21a0}
@subsection Generated files


To reduce build dependencies, Python source code contains multiple generated
files. Commands to regenerate all generated files:

@example
make regen-all
make regen-stdlib-module-names
make regen-limited-abi
make regen-configure
@end example

The @code{Makefile.pre.in} file documents generated files, their inputs, and tools used
to regenerate them. Search for @code{regen-*} make targets.

@menu
* configure script:: 

@end menu

@node configure script,,,Generated files
@anchor{using/configure configure-script}@anchor{21a1}
@subsubsection configure script


The @code{make regen-configure} command regenerates the @code{aclocal.m4} file and
the @code{configure} script using the @code{Tools/build/regen-configure.sh} shell
script which uses an Ubuntu container to get the same tools versions and have a
reproducible output.

The container is optional, the following command can be run locally:

@example
autoreconf -ivf -Werror
@end example

The generated files can change depending on the exact versions of the
tools used.
The container that CPython uses has
Autoconf@footnote{https://gnu.org/software/autoconf} 2.72,
@code{aclocal} from Automake@footnote{https://www.gnu.org/software/automake} 1.16.5,
and pkg-config@footnote{https://www.freedesktop.org/wiki/Software/pkg-config/} 1.8.1.


Changed in version 3.13: Autoconf 2.71 and aclocal 1.16.5 and are now used to regenerate
@code{configure}.



Changed in version 3.14: Autoconf 2.72 is now used to regenerate @code{configure}.


@node Configure Options,Python Build System,Generated files,Configure Python
@anchor{using/configure configure-options}@anchor{218f}@anchor{using/configure id12}@anchor{21a2}
@subsection Configure Options


List all @code{configure} script options using:

@example
./configure --help
@end example

See also the @code{Misc/SpecialBuilds.txt} in the Python source distribution.

@menu
* General Options:: 
* C compiler options:: 
* Linker options:: 
* Options for third-party dependencies:: 
* WebAssembly Options:: 
* Install Options:: 
* Performance options:: 
* Python Debug Build:: 
* Debug options:: 
* Linker options: Linker options<2>. 
* Libraries options:: 
* Security Options:: 
* macOS Options:: 
* iOS Options:: 
* Cross Compiling Options:: 

@end menu

@node General Options,C compiler options,,Configure Options
@anchor{using/configure general-options}@anchor{21a3}
@subsubsection General Options


@geindex command line option; --enable-loadable-sqlite-extensions
@anchor{using/configure cmdoption-enable-loadable-sqlite-extensions}@anchor{21a4}
@deffn {Option} @w{-}@w{-}enable@w{-}loadable@w{-}sqlite@w{-}extensions

Support loadable extensions in the @code{_sqlite} extension module (default
is no) of the @ref{d4,,sqlite3} module.

See the @ref{a45,,sqlite3.Connection.enable_load_extension()} method of the
@ref{d4,,sqlite3} module.


Added in version 3.6.

@end deffn

@geindex command line option; --disable-ipv6
@anchor{using/configure cmdoption-disable-ipv6}@anchor{21a5}
@deffn {Option} @w{-}@w{-}disable@w{-}ipv6

Disable IPv6 support (enabled by default if supported), see the
@ref{d1,,socket} module.
@end deffn

@geindex command line option; --enable-big-digits
@anchor{using/configure cmdoption-enable-big-digits}@anchor{958}
@deffn {Option} @w{-}@w{-}enable@w{-}big@w{-}digits=[15|30]

Define the size in bits of Python @ref{19c,,int} digits: 15 or 30 bits.

By default, the digit size is 30.

Define the @code{PYLONG_BITS_IN_DIGIT} to @code{15} or @code{30}.

See @ref{149f,,sys.int_info.bits_per_digit}.
@end deffn

@geindex command line option; --with-suffix
@anchor{using/configure cmdoption-with-suffix}@anchor{21a6}
@deffn {Option} @w{-}@w{-}with@w{-}suffix=SUFFIX

Set the Python executable suffix to `SUFFIX'.

The default suffix is @code{.exe} on Windows and macOS (@code{python.exe}
executable), @code{.js} on Emscripten node, @code{.html} on Emscripten browser,
@code{.wasm} on WASI, and an empty string on other platforms (@code{python}
executable).


Changed in version 3.11: The default suffix on WASM platform is one of @code{.js}, @code{.html}
or @code{.wasm}.

@end deffn

@geindex command line option; --with-tzpath
@anchor{using/configure cmdoption-with-tzpath}@anchor{21a7}
@deffn {Option} @w{-}@w{-}with@w{-}tzpath=<list of absolute paths separated by pathsep>

Select the default time zone search path for @ref{21a8,,zoneinfo.TZPATH}.
See the @ref{21a9,,Compile-time configuration} of the @ref{13b,,zoneinfo} module.

Default: @code{/usr/share/zoneinfo:/usr/lib/zoneinfo:/usr/share/lib/zoneinfo:/etc/zoneinfo}.

See @ref{2177,,os.pathsep} path separator.


Added in version 3.9.

@end deffn

@geindex command line option; --without-decimal-contextvar
@anchor{using/configure cmdoption-without-decimal-contextvar}@anchor{21aa}
@deffn {Option} @w{-}@w{-}without@w{-}decimal@w{-}contextvar

Build the @code{_decimal} extension module using a thread-local context rather
than a coroutine-local context (default), see the @ref{3a,,decimal} module.

See @ref{21ab,,decimal.HAVE_CONTEXTVAR} and the @ref{28,,contextvars} module.


Added in version 3.9.

@end deffn

@geindex command line option; --with-dbmliborder
@anchor{using/configure cmdoption-with-dbmliborder}@anchor{21ac}
@deffn {Option} @w{-}@w{-}with@w{-}dbmliborder=<list of backend names>

Override order to check db backends for the @ref{35,,dbm} module

A valid value is a colon (@code{:}) separated string with the backend names:


@itemize *

@item 
@code{ndbm};

@item 
@code{gdbm};

@item 
@code{bdb}.
@end itemize
@end deffn

@geindex command line option; --without-c-locale-coercion
@anchor{using/configure cmdoption-without-c-locale-coercion}@anchor{21ad}
@deffn {Option} @w{-}@w{-}without@w{-}c@w{-}locale@w{-}coercion

Disable C locale coercion to a UTF-8 based locale (enabled by default).

Don’t define the @code{PY_COERCE_C_LOCALE} macro.

See 
@geindex PYTHONCOERCECLOCALE
@geindex environment variable; PYTHONCOERCECLOCALE
@ref{cd2,,PYTHONCOERCECLOCALE} and the 
@geindex Python Enhancement Proposals; PEP 538
PEP 538@footnote{https://peps.python.org/pep-0538/}.
@end deffn

@geindex command line option; --with-platlibdir
@anchor{using/configure cmdoption-with-platlibdir}@anchor{21ae}
@deffn {Option} @w{-}@w{-}with@w{-}platlibdir=DIRNAME

Python library directory name (default is @code{lib}).

Fedora and SuSE use @code{lib64} on 64-bit platforms.

See @ref{b38,,sys.platlibdir}.


Added in version 3.9.

@end deffn

@geindex command line option; --with-wheel-pkg-dir
@anchor{using/configure cmdoption-with-wheel-pkg-dir}@anchor{a93}
@deffn {Option} @w{-}@w{-}with@w{-}wheel@w{-}pkg@w{-}dir=PATH

Directory of wheel packages used by the @ref{59,,ensurepip} module
(none by default).

Some Linux distribution packaging policies recommend against bundling
dependencies. For example, Fedora installs wheel packages in the
@code{/usr/share/python-wheels/} directory and don’t install the
@code{ensurepip._bundled} package.


Added in version 3.10.

@end deffn

@geindex command line option; --with-pkg-config
@anchor{using/configure cmdoption-with-pkg-config}@anchor{21af}
@deffn {Option} @w{-}@w{-}with@w{-}pkg@w{-}config=[check|yes|no]

Whether configure should use @code{pkg-config} to detect build
dependencies.


@itemize *

@item 
@code{check} (default): @code{pkg-config} is optional

@item 
@code{yes}: @code{pkg-config} is mandatory

@item 
@code{no}: configure does not use @code{pkg-config} even when present
@end itemize


Added in version 3.11.

@end deffn

@geindex command line option; --enable-pystats
@anchor{using/configure cmdoption-enable-pystats}@anchor{1b7c}
@deffn {Option} @w{-}@w{-}enable@w{-}pystats

Turn on internal Python performance statistics gathering.

By default, statistics gathering is off. Use @code{python3 -X pystats} command
or set @code{PYTHONSTATS=1} environment variable to turn on statistics
gathering at Python startup.

At Python exit, dump statistics if statistics gathering was on and not
cleared.

Effects:


@itemize *

@item 
Add @ref{170,,-X pystats} command line option.

@item 
Add @code{PYTHONSTATS} environment variable.

@item 
Define the @code{Py_STATS} macro.

@item 
Add functions to the @ref{df,,sys} module:


@itemize *

@item 
@code{sys._stats_on()}: Turns on statistics gathering.

@item 
@code{sys._stats_off()}: Turns off statistics gathering.

@item 
@code{sys._stats_clear()}: Clears the statistics.

@item 
@code{sys._stats_dump()}: Dump statistics to file, and clears the statistics.
@end itemize
@end itemize

The statistics will be dumped to a arbitrary (probably unique) file in
@code{/tmp/py_stats/} (Unix) or @code{C:\temp\py_stats\} (Windows). If that
directory does not exist, results will be printed on stderr.

Use @code{Tools/scripts/summarize_stats.py} to read the stats.

Statistics:


@itemize *

@item 
Opcode:


@itemize *

@item 
Specialization: success, failure, hit, deferred, miss, deopt, failures;

@item 
Execution count;

@item 
Pair count.
@end itemize

@item 
Call:


@itemize *

@item 
Inlined Python calls;

@item 
PyEval calls;

@item 
Frames pushed;

@item 
Frame object created;

@item 
Eval calls: vector, generator, legacy, function VECTORCALL, build class,
slot, function “ex”, API, method.
@end itemize

@item 
Object:


@itemize *

@item 
incref and decref;

@item 
interpreter incref and decref;

@item 
allocations: all, 512 bytes, 4 kiB, big;

@item 
free;

@item 
to/from free lists;

@item 
dictionary materialized/dematerialized;

@item 
type cache;

@item 
optimization attempts;

@item 
optimization traces created/executed;

@item 
uops executed.
@end itemize

@item 
Garbage collector:


@itemize *

@item 
Garbage collections;

@item 
Objects visited;

@item 
Objects collected.
@end itemize
@end itemize


Added in version 3.11.

@end deffn

@geindex command line option; --disable-gil
@anchor{using/configure free-threading-build}@anchor{21b0}@anchor{using/configure cmdoption-disable-gil}@anchor{49a}
@deffn {Option} @w{-}@w{-}disable@w{-}gil

Enables support for running Python without the @ref{474,,global interpreter lock} (GIL): @ref{1791,,free-threaded build}.

Defines the @code{Py_GIL_DISABLED} macro and adds @code{"t"} to
@ref{c5f,,sys.abiflags}.

See @ref{46d,,Free-threaded CPython} for more detail.


Added in version 3.13.

@end deffn

@geindex command line option; --enable-experimental-jit
@anchor{using/configure cmdoption-enable-experimental-jit}@anchor{44c}
@deffn {Option} @w{-}@w{-}enable@w{-}experimental@w{-}jit=[no|yes|yes@w{-}off|interpreter]

Indicate how to integrate the @ref{15a,,experimental just-in-time compiler}.


@itemize *

@item 
@code{no}: Don’t build the JIT.

@item 
@code{yes}: Enable the JIT. To disable it at runtime, set the environment
variable 
@geindex PYTHON_JIT
@geindex environment variable; PYTHON_JIT
@ref{44b,,PYTHON_JIT=0}.

@item 
@code{yes-off}: Build the JIT, but disable it by default. To enable it at
runtime, set the environment variable 
@geindex PYTHON_JIT
@geindex environment variable; PYTHON_JIT
@ref{44b,,PYTHON_JIT=1}.

@item 
@code{interpreter}: Enable the “JIT interpreter” (only useful for those
debugging the JIT itself). To disable it at runtime, set the environment
variable 
@geindex PYTHON_JIT
@geindex environment variable; PYTHON_JIT
@ref{44b,,PYTHON_JIT=0}.
@end itemize

@code{--enable-experimental-jit=no} is the default behavior if the option is not
provided, and @code{--enable-experimental-jit} is shorthand for
@code{--enable-experimental-jit=yes}.  See @code{Tools/jit/README.md} for more
information, including how to install the necessary build-time dependencies.

@cartouche
@quotation Note 
When building CPython with JIT enabled, ensure that your system has Python 3.11 or later installed.
@end quotation
@end cartouche


Added in version 3.13.

@end deffn

@geindex command line option; PKG_CONFIG
@anchor{using/configure cmdoption-arg-PKG_CONFIG}@anchor{21b1}
@deffn {Option} PKG_CONFIG

Path to @code{pkg-config} utility.
@end deffn

@geindex command line option; PKG_CONFIG_LIBDIR
@anchor{using/configure cmdoption-arg-PKG_CONFIG_LIBDIR}@anchor{21b2}
@deffn {Option} PKG_CONFIG_LIBDIR
@end deffn

@geindex command line option; PKG_CONFIG_PATH
@anchor{using/configure cmdoption-arg-PKG_CONFIG_PATH}@anchor{21b3}
@deffn {Option} PKG_CONFIG_PATH

@code{pkg-config} options.
@end deffn

@node C compiler options,Linker options,General Options,Configure Options
@anchor{using/configure c-compiler-options}@anchor{21b4}
@subsubsection C compiler options


@geindex command line option; CC
@anchor{using/configure cmdoption-arg-CC}@anchor{21b5}
@deffn {Option} CC

C compiler command.
@end deffn

@geindex command line option; CFLAGS
@anchor{using/configure cmdoption-arg-CFLAGS}@anchor{21b6}
@deffn {Option} CFLAGS

C compiler flags.
@end deffn

@geindex command line option; CPP
@anchor{using/configure cmdoption-arg-CPP}@anchor{21b7}
@deffn {Option} CPP

C preprocessor command.
@end deffn

@geindex command line option; CPPFLAGS
@anchor{using/configure cmdoption-arg-CPPFLAGS}@anchor{21b8}
@deffn {Option} CPPFLAGS

C preprocessor flags, e.g. @code{-I@var{include_dir}}.
@end deffn

@node Linker options,Options for third-party dependencies,C compiler options,Configure Options
@anchor{using/configure linker-options}@anchor{21b9}
@subsubsection Linker options


@geindex command line option; LDFLAGS
@anchor{using/configure cmdoption-arg-LDFLAGS}@anchor{21ba}
@deffn {Option} LDFLAGS

Linker flags, e.g. @code{-L@var{library_directory}}.
@end deffn

@geindex command line option; LIBS
@anchor{using/configure cmdoption-arg-LIBS}@anchor{21bb}
@deffn {Option} LIBS

Libraries to pass to the linker, e.g. @code{-l@var{library}}.
@end deffn

@geindex command line option; MACHDEP
@anchor{using/configure cmdoption-arg-MACHDEP}@anchor{21bc}
@deffn {Option} MACHDEP

Name for machine-dependent library files.
@end deffn

@node Options for third-party dependencies,WebAssembly Options,Linker options,Configure Options
@anchor{using/configure configure-options-for-dependencies}@anchor{219f}@anchor{using/configure options-for-third-party-dependencies}@anchor{21bd}
@subsubsection Options for third-party dependencies



Added in version 3.11.


@geindex command line option; BZIP2_CFLAGS
@anchor{using/configure cmdoption-arg-BZIP2_CFLAGS}@anchor{21be}
@deffn {Option} BZIP2_CFLAGS
@end deffn

@geindex command line option; BZIP2_LIBS
@anchor{using/configure cmdoption-arg-BZIP2_LIBS}@anchor{21bf}
@deffn {Option} BZIP2_LIBS

C compiler and linker flags to link Python to @code{libbz2}, used by @ref{14,,bz2}
module, overriding @code{pkg-config}.
@end deffn

@geindex command line option; CURSES_CFLAGS
@anchor{using/configure cmdoption-arg-CURSES_CFLAGS}@anchor{21c0}
@deffn {Option} CURSES_CFLAGS
@end deffn

@geindex command line option; CURSES_LIBS
@anchor{using/configure cmdoption-arg-CURSES_LIBS}@anchor{21c1}
@deffn {Option} CURSES_LIBS

C compiler and linker flags for @code{libncurses} or @code{libncursesw}, used by
@ref{2f,,curses} module, overriding @code{pkg-config}.
@end deffn

@geindex command line option; GDBM_CFLAGS
@anchor{using/configure cmdoption-arg-GDBM_CFLAGS}@anchor{21c2}
@deffn {Option} GDBM_CFLAGS
@end deffn

@geindex command line option; GDBM_LIBS
@anchor{using/configure cmdoption-arg-GDBM_LIBS}@anchor{21c3}
@deffn {Option} GDBM_LIBS

C compiler and linker flags for @code{gdbm}.
@end deffn

@geindex command line option; LIBEDIT_CFLAGS
@anchor{using/configure cmdoption-arg-LIBEDIT_CFLAGS}@anchor{21c4}
@deffn {Option} LIBEDIT_CFLAGS
@end deffn

@geindex command line option; LIBEDIT_LIBS
@anchor{using/configure cmdoption-arg-LIBEDIT_LIBS}@anchor{21c5}
@deffn {Option} LIBEDIT_LIBS

C compiler and linker flags for @code{libedit}, used by @ref{bf,,readline} module,
overriding @code{pkg-config}.
@end deffn

@geindex command line option; LIBFFI_CFLAGS
@anchor{using/configure cmdoption-arg-LIBFFI_CFLAGS}@anchor{21c6}
@deffn {Option} LIBFFI_CFLAGS
@end deffn

@geindex command line option; LIBFFI_LIBS
@anchor{using/configure cmdoption-arg-LIBFFI_LIBS}@anchor{21c7}
@deffn {Option} LIBFFI_LIBS

C compiler and linker flags for @code{libffi}, used by @ref{2e,,ctypes} module,
overriding @code{pkg-config}.
@end deffn

@geindex command line option; LIBMPDEC_CFLAGS
@anchor{using/configure cmdoption-arg-LIBMPDEC_CFLAGS}@anchor{21c8}
@deffn {Option} LIBMPDEC_CFLAGS
@end deffn

@geindex command line option; LIBMPDEC_LIBS
@anchor{using/configure cmdoption-arg-LIBMPDEC_LIBS}@anchor{21c9}
@deffn {Option} LIBMPDEC_LIBS

C compiler and linker flags for @code{libmpdec}, used by @ref{3a,,decimal} module,
overriding @code{pkg-config}.

@cartouche
@quotation Note 
These environment variables have no effect unless
@ref{657,,--with-system-libmpdec} is specified.
@end quotation
@end cartouche
@end deffn

@geindex command line option; LIBLZMA_CFLAGS
@anchor{using/configure cmdoption-arg-LIBLZMA_CFLAGS}@anchor{21ca}
@deffn {Option} LIBLZMA_CFLAGS
@end deffn

@geindex command line option; LIBLZMA_LIBS
@anchor{using/configure cmdoption-arg-LIBLZMA_LIBS}@anchor{21cb}
@deffn {Option} LIBLZMA_LIBS

C compiler and linker flags for @code{liblzma}, used by @ref{8e,,lzma} module,
overriding @code{pkg-config}.
@end deffn

@geindex command line option; LIBREADLINE_CFLAGS
@anchor{using/configure cmdoption-arg-LIBREADLINE_CFLAGS}@anchor{21cc}
@deffn {Option} LIBREADLINE_CFLAGS
@end deffn

@geindex command line option; LIBREADLINE_LIBS
@anchor{using/configure cmdoption-arg-LIBREADLINE_LIBS}@anchor{21cd}
@deffn {Option} LIBREADLINE_LIBS

C compiler and linker flags for @code{libreadline}, used by @ref{bf,,readline}
module, overriding @code{pkg-config}.
@end deffn

@geindex command line option; LIBSQLITE3_CFLAGS
@anchor{using/configure cmdoption-arg-LIBSQLITE3_CFLAGS}@anchor{21ce}
@deffn {Option} LIBSQLITE3_CFLAGS
@end deffn

@geindex command line option; LIBSQLITE3_LIBS
@anchor{using/configure cmdoption-arg-LIBSQLITE3_LIBS}@anchor{21cf}
@deffn {Option} LIBSQLITE3_LIBS

C compiler and linker flags for @code{libsqlite3}, used by @ref{d4,,sqlite3}
module, overriding @code{pkg-config}.
@end deffn

@geindex command line option; LIBUUID_CFLAGS
@anchor{using/configure cmdoption-arg-LIBUUID_CFLAGS}@anchor{21d0}
@deffn {Option} LIBUUID_CFLAGS
@end deffn

@geindex command line option; LIBUUID_LIBS
@anchor{using/configure cmdoption-arg-LIBUUID_LIBS}@anchor{21d1}
@deffn {Option} LIBUUID_LIBS

C compiler and linker flags for @code{libuuid}, used by @ref{117,,uuid} module,
overriding @code{pkg-config}.
@end deffn

@geindex command line option; LIBZSTD_CFLAGS
@anchor{using/configure cmdoption-arg-LIBZSTD_CFLAGS}@anchor{21d2}
@deffn {Option} LIBZSTD_CFLAGS
@end deffn

@geindex command line option; LIBZSTD_LIBS
@anchor{using/configure cmdoption-arg-LIBZSTD_LIBS}@anchor{21d3}
@deffn {Option} LIBZSTD_LIBS

C compiler and linker flags for @code{libzstd}, used by @ref{23,,compression.zstd} module,
overriding @code{pkg-config}.


Added in version 3.14.

@end deffn

@geindex command line option; PANEL_CFLAGS
@anchor{using/configure cmdoption-arg-PANEL_CFLAGS}@anchor{21d4}
@deffn {Option} PANEL_CFLAGS
@end deffn

@geindex command line option; PANEL_LIBS
@anchor{using/configure cmdoption-arg-PANEL_LIBS}@anchor{21d5}
@deffn {Option} PANEL_LIBS

C compiler and linker flags for PANEL, overriding @code{pkg-config}.

C compiler and linker flags for @code{libpanel} or @code{libpanelw}, used by
@ref{31,,curses.panel} module, overriding @code{pkg-config}.
@end deffn

@geindex command line option; TCLTK_CFLAGS
@anchor{using/configure cmdoption-arg-TCLTK_CFLAGS}@anchor{21d6}
@deffn {Option} TCLTK_CFLAGS
@end deffn

@geindex command line option; TCLTK_LIBS
@anchor{using/configure cmdoption-arg-TCLTK_LIBS}@anchor{21d7}
@deffn {Option} TCLTK_LIBS

C compiler and linker flags for TCLTK, overriding @code{pkg-config}.
@end deffn

@geindex command line option; ZLIB_CFLAGS
@anchor{using/configure cmdoption-arg-ZLIB_CFLAGS}@anchor{21d8}
@deffn {Option} ZLIB_CFLAGS
@end deffn

@geindex command line option; ZLIB_LIBS
@anchor{using/configure cmdoption-arg-ZLIB_LIBS}@anchor{21d9}
@deffn {Option} ZLIB_LIBS

C compiler and linker flags for @code{libzlib}, used by @ref{6b,,gzip} module,
overriding @code{pkg-config}.
@end deffn

@node WebAssembly Options,Install Options,Options for third-party dependencies,Configure Options
@anchor{using/configure webassembly-options}@anchor{21da}
@subsubsection WebAssembly Options


@geindex command line option; --enable-wasm-dynamic-linking
@anchor{using/configure cmdoption-enable-wasm-dynamic-linking}@anchor{1c01}
@deffn {Option} @w{-}@w{-}enable@w{-}wasm@w{-}dynamic@w{-}linking

Turn on dynamic linking support for WASM.

Dynamic linking enables @code{dlopen}. File size of the executable
increases due to limited dead code elimination and additional features.


Added in version 3.11.

@end deffn

@geindex command line option; --enable-wasm-pthreads
@anchor{using/configure cmdoption-enable-wasm-pthreads}@anchor{1bd1}
@deffn {Option} @w{-}@w{-}enable@w{-}wasm@w{-}pthreads

Turn on pthreads support for WASM.


Added in version 3.11.

@end deffn

@node Install Options,Performance options,WebAssembly Options,Configure Options
@anchor{using/configure install-options}@anchor{21db}
@subsubsection Install Options


@geindex command line option; --prefix
@anchor{using/configure cmdoption-prefix}@anchor{2191}
@deffn {Option} @w{-}@w{-}prefix=PREFIX

Install architecture-independent files in PREFIX. On Unix, it
defaults to @code{/usr/local}.

This value can be retrieved at runtime using @ref{3e5,,sys.prefix}.

As an example, one can use @code{--prefix="$HOME/.local/"} to install
a Python in its home directory.
@end deffn

@geindex command line option; --exec-prefix
@anchor{using/configure cmdoption-exec-prefix}@anchor{2192}
@deffn {Option} @w{-}@w{-}exec@w{-}prefix=EPREFIX

Install architecture-dependent files in EPREFIX, defaults to @ref{2191,,--prefix}.

This value can be retrieved at runtime using @ref{3e9,,sys.exec_prefix}.
@end deffn

@geindex command line option; --disable-test-modules
@anchor{using/configure cmdoption-disable-test-modules}@anchor{a92}
@deffn {Option} @w{-}@w{-}disable@w{-}test@w{-}modules

Don’t build nor install test modules, like the @ref{e8,,test} package or the
@code{_testcapi} extension module (built and installed by default).


Added in version 3.10.

@end deffn

@geindex command line option; --with-ensurepip
@anchor{using/configure cmdoption-with-ensurepip}@anchor{21dc}
@deffn {Option} @w{-}@w{-}with@w{-}ensurepip=[upgrade|install|no]

Select the @ref{59,,ensurepip} command run on Python installation:


@itemize *

@item 
@code{upgrade} (default): run @code{python -m ensurepip --altinstall --upgrade}
command.

@item 
@code{install}: run @code{python -m ensurepip --altinstall} command;

@item 
@code{no}: don’t run ensurepip;
@end itemize


Added in version 3.6.

@end deffn

@node Performance options,Python Debug Build,Install Options,Configure Options
@anchor{using/configure performance-options}@anchor{21dd}
@subsubsection Performance options


Configuring Python using @code{--enable-optimizations --with-lto} (PGO + LTO) is
recommended for best performance. The experimental @code{--enable-bolt} flag can
also be used to improve performance.

@geindex command line option; --enable-optimizations
@anchor{using/configure cmdoption-enable-optimizations}@anchor{a68}
@deffn {Option} @w{-}@w{-}enable@w{-}optimizations

Enable Profile Guided Optimization (PGO) using 
@geindex PROFILE_TASK
@geindex environment variable; PROFILE_TASK
@ref{1ac4,,PROFILE_TASK}
(disabled by default).

The C compiler Clang requires @code{llvm-profdata} program for PGO. On
macOS, GCC also requires it: GCC is just an alias to Clang on macOS.

Disable also semantic interposition in libpython if @code{--enable-shared} and
GCC is used: add @code{-fno-semantic-interposition} to the compiler and linker
flags.

@cartouche
@quotation Note 
During the build, you may encounter compiler warnings about
profile data not being available for some source files.
These warnings are harmless, as only a subset of the code is exercised
during profile data acquisition.
To disable these warnings on Clang, manually suppress them by adding
@code{-Wno-profile-instr-unprofiled} to 
@geindex CFLAGS
@geindex environment variable; CFLAGS
@ref{16c3,,CFLAGS}.
@end quotation
@end cartouche


Added in version 3.6.



Changed in version 3.10: Use @code{-fno-semantic-interposition} on GCC.

@end deffn

@geindex environment variable; PROFILE_TASK
@anchor{using/configure envvar-PROFILE_TASK}@anchor{1ac4}
@deffn {Environment Variable} PROFILE_TASK

Environment variable used in the Makefile: Python command line arguments for
the PGO generation task.

Default: @code{-m test --pgo --timeout=$(TESTTIMEOUT)}.


Added in version 3.8.



Changed in version 3.13: Task failure is no longer ignored silently.

@end deffn

@geindex command line option; --with-lto
@anchor{using/configure cmdoption-with-lto}@anchor{957}
@deffn {Option} @w{-}@w{-}with@w{-}lto=[full|thin|no|yes]

Enable Link Time Optimization (LTO) in any build (disabled by default).

The C compiler Clang requires @code{llvm-ar} for LTO (@code{ar} on macOS), as well
as an LTO-aware linker (@code{ld.gold} or @code{lld}).


Added in version 3.6.



Added in version 3.11: To use ThinLTO feature, use @code{--with-lto=thin} on Clang.



Changed in version 3.12: Use ThinLTO as the default optimization policy on Clang if the compiler accepts the flag.

@end deffn

@geindex command line option; --enable-bolt
@anchor{using/configure cmdoption-enable-bolt}@anchor{21de}
@deffn {Option} @w{-}@w{-}enable@w{-}bolt

Enable usage of the BOLT post-link binary optimizer@footnote{https://github.com/llvm/llvm-project/tree/main/bolt} (disabled by
default).

BOLT is part of the LLVM project but is not always included in their binary
distributions. This flag requires that @code{llvm-bolt} and @code{merge-fdata}
are available.

BOLT is still a fairly new project so this flag should be considered
experimental for now. Because this tool operates on machine code its success
is dependent on a combination of the build environment + the other
optimization configure args + the CPU architecture, and not all combinations
are supported.
BOLT versions before LLVM 16 are known to crash BOLT under some scenarios.
Use of LLVM 16 or newer for BOLT optimization is strongly encouraged.

The @code{BOLT_INSTRUMENT_FLAGS} and @code{BOLT_APPLY_FLAGS}
@code{configure} variables can be defined to override the default set of
arguments for @code{llvm-bolt} to instrument and apply BOLT data to
binaries, respectively.


Added in version 3.12.

@end deffn

@geindex command line option; BOLT_APPLY_FLAGS
@anchor{using/configure cmdoption-arg-BOLT_APPLY_FLAGS}@anchor{21df}
@deffn {Option} BOLT_APPLY_FLAGS

Arguments to @code{llvm-bolt} when creating a BOLT optimized binary@footnote{https://github.com/facebookarchive/BOLT}.


Added in version 3.12.

@end deffn

@geindex command line option; BOLT_INSTRUMENT_FLAGS
@anchor{using/configure cmdoption-arg-BOLT_INSTRUMENT_FLAGS}@anchor{21e0}
@deffn {Option} BOLT_INSTRUMENT_FLAGS

Arguments to @code{llvm-bolt} when instrumenting binaries.


Added in version 3.12.

@end deffn

@geindex command line option; --with-computed-gotos
@anchor{using/configure cmdoption-with-computed-gotos}@anchor{21e1}
@deffn {Option} @w{-}@w{-}with@w{-}computed@w{-}gotos

Enable computed gotos in evaluation loop (enabled by default on supported
compilers).
@end deffn

@geindex command line option; --with-tail-call-interp
@anchor{using/configure cmdoption-with-tail-call-interp}@anchor{173}
@deffn {Option} @w{-}@w{-}with@w{-}tail@w{-}call@w{-}interp

Enable interpreters using tail calls in CPython. If enabled, enabling PGO
(@ref{a68,,--enable-optimizations}) is highly recommended. This option specifically
requires a C compiler with proper tail call support, and the
preserve_none@footnote{https://clang.llvm.org/docs/AttributeReference.html#preserve-none}
calling convention. For example, Clang 19 and newer supports this feature.


Added in version 3.14.

@end deffn

@geindex command line option; --without-mimalloc
@anchor{using/configure cmdoption-without-mimalloc}@anchor{21e2}
@deffn {Option} @w{-}@w{-}without@w{-}mimalloc

Disable the fast @ref{176a,,mimalloc} allocator
(enabled by default).

This option cannot be used together with @ref{49a,,--disable-gil}
because the @ref{1f6,,free-threaded} build requires mimalloc.

See also 
@geindex PYTHONMALLOC
@geindex environment variable; PYTHONMALLOC
@ref{e64,,PYTHONMALLOC} environment variable.
@end deffn

@geindex command line option; --without-pymalloc
@anchor{using/configure cmdoption-without-pymalloc}@anchor{21e3}
@deffn {Option} @w{-}@w{-}without@w{-}pymalloc

Disable the specialized Python memory allocator @ref{f11,,pymalloc}
(enabled by default).

See also 
@geindex PYTHONMALLOC
@geindex environment variable; PYTHONMALLOC
@ref{e64,,PYTHONMALLOC} environment variable.
@end deffn

@geindex command line option; --without-doc-strings
@anchor{using/configure cmdoption-without-doc-strings}@anchor{21e4}
@deffn {Option} @w{-}@w{-}without@w{-}doc@w{-}strings

Disable static documentation strings to reduce the memory footprint (enabled
by default). Documentation strings defined in Python are not affected.

Don’t define the @code{WITH_DOC_STRINGS} macro.

See the @code{PyDoc_STRVAR()} macro.
@end deffn

@geindex command line option; --enable-profiling
@anchor{using/configure cmdoption-enable-profiling}@anchor{21e5}
@deffn {Option} @w{-}@w{-}enable@w{-}profiling

Enable C-level code profiling with @code{gprof} (disabled by default).
@end deffn

@geindex command line option; --with-strict-overflow
@anchor{using/configure cmdoption-with-strict-overflow}@anchor{1b17}
@deffn {Option} @w{-}@w{-}with@w{-}strict@w{-}overflow

Add @code{-fstrict-overflow} to the C compiler flags (by default we add
@code{-fno-strict-overflow} instead).
@end deffn

@geindex command line option; --without-remote-debug
@anchor{using/configure cmdoption-without-remote-debug}@anchor{171}
@deffn {Option} @w{-}@w{-}without@w{-}remote@w{-}debug

Deactivate remote debugging support described in 
@geindex Python Enhancement Proposals; PEP 768
PEP 768@footnote{https://peps.python.org/pep-0768/} (enabled by default).
When this flag is provided the code that allows the interpreter to schedule the
execution of a Python file in a separate process as described in 
@geindex Python Enhancement Proposals; PEP 768
PEP 768@footnote{https://peps.python.org/pep-0768/} is
not compiled. This includes both the functionality to schedule code to be executed
and the functionality to receive code to be executed.

@geindex Py_REMOTE_DEBUG (C macro)
@anchor{using/configure c Py_REMOTE_DEBUG}@anchor{21e6}
@deffn {C Macro} Py_REMOTE_DEBUG

This macro is defined by default, unless Python is configured with
@ref{171,,--without-remote-debug}.

Note that even if the macro is defined, remote debugging may not be
available (for example, on an incompatible platform).
@end deffn


Added in version 3.14.

@end deffn

@node Python Debug Build,Debug options,Performance options,Configure Options
@anchor{using/configure debug-build}@anchor{50a}@anchor{using/configure python-debug-build}@anchor{21e7}
@subsubsection Python Debug Build


A debug build is Python built with the @ref{666,,--with-pydebug} configure
option.

Effects of a debug build:


@itemize *

@item 
Display all warnings by default: the list of default warning filters is empty
in the @ref{119,,warnings} module.

@item 
Add @code{d} to @ref{c5f,,sys.abiflags}.

@item 
Add @code{sys.gettotalrefcount()} function.

@item 
Add @ref{170,,-X showrefcount} command line option.

@item 
Add @ref{2166,,-d} command line option and 
@geindex PYTHONDEBUG
@geindex environment variable; PYTHONDEBUG
@ref{2167,,PYTHONDEBUG} environment
variable to debug the parser.

@item 
Add support for the @code{__lltrace__} variable: enable low-level tracing in the
bytecode evaluation loop if the variable is defined.

@item 
Install @ref{217e,,debug hooks on memory allocators}
to detect buffer overflow and other memory errors.

@item 
Define @code{Py_DEBUG} and @code{Py_REF_DEBUG} macros.

@item 
Add runtime checks: code surrounded by @code{#ifdef Py_DEBUG} and @code{#endif}.
Enable @code{assert(...)} and @code{_PyObject_ASSERT(...)} assertions: don’t set
the @code{NDEBUG} macro (see also the @ref{62d,,--with-assertions} configure
option). Main runtime checks:


@itemize *

@item 
Add sanity checks on the function arguments.

@item 
Unicode and int objects are created with their memory filled with a pattern
to detect usage of uninitialized objects.

@item 
Ensure that functions which can clear or replace the current exception are
not called with an exception raised.

@item 
Check that deallocator functions don’t change the current exception.

@item 
The garbage collector (@ref{1b5,,gc.collect()} function) runs some basic checks
on objects consistency.

@item 
The @code{Py_SAFE_DOWNCAST()} macro checks for integer underflow and
overflow when downcasting from wide types to narrow types.
@end itemize
@end itemize

See also the @ref{509,,Python Development Mode} and the
@ref{636,,--with-trace-refs} configure option.


Changed in version 3.8: Release builds are now ABI compatible with debug builds: defining the
@code{Py_DEBUG} macro no longer implies the @code{Py_TRACE_REFS} macro (see the
@ref{636,,--with-trace-refs} option). However, debug builds still expose
more symbols than release builds and code built against a debug build is not
necessarily compatible with a release build.


@node Debug options,Linker options<2>,Python Debug Build,Configure Options
@anchor{using/configure debug-options}@anchor{21e8}
@subsubsection Debug options


@geindex command line option; --with-pydebug
@anchor{using/configure cmdoption-with-pydebug}@anchor{666}
@deffn {Option} @w{-}@w{-}with@w{-}pydebug

@ref{50a,,Build Python in debug mode}: define the @code{Py_DEBUG}
macro (disabled by default).
@end deffn

@geindex command line option; --with-trace-refs
@anchor{using/configure cmdoption-with-trace-refs}@anchor{636}
@deffn {Option} @w{-}@w{-}with@w{-}trace@w{-}refs

Enable tracing references for debugging purpose (disabled by default).

Effects:


@itemize *

@item 
Define the @code{Py_TRACE_REFS} macro.

@item 
Add @ref{290,,sys.getobjects()} function.

@item 
Add 
@geindex PYTHONDUMPREFS
@geindex environment variable; PYTHONDUMPREFS
@ref{ba4,,PYTHONDUMPREFS} environment variable.
@end itemize

The 
@geindex PYTHONDUMPREFS
@geindex environment variable; PYTHONDUMPREFS
@ref{ba4,,PYTHONDUMPREFS} environment variable can be used to dump
objects and reference counts still alive at Python exit.

@ref{988,,Statically allocated objects} are not traced.


Added in version 3.8.



Changed in version 3.13: This build is now ABI compatible with release build and @ref{50a,,debug build}.

@end deffn

@geindex command line option; --with-assertions
@anchor{using/configure cmdoption-with-assertions}@anchor{62d}
@deffn {Option} @w{-}@w{-}with@w{-}assertions

Build with C assertions enabled (default is no): @code{assert(...);} and
@code{_PyObject_ASSERT(...);}.

If set, the @code{NDEBUG} macro is not defined in the 
@geindex OPT
@geindex environment variable; OPT
@ref{21e9,,OPT} compiler
variable.

See also the @ref{666,,--with-pydebug} option (@ref{50a,,debug build}) which also enables assertions.


Added in version 3.6.

@end deffn

@geindex command line option; --with-valgrind
@anchor{using/configure cmdoption-with-valgrind}@anchor{21ea}
@deffn {Option} @w{-}@w{-}with@w{-}valgrind

Enable Valgrind support (default is no).
@end deffn

@geindex command line option; --with-dtrace
@anchor{using/configure cmdoption-with-dtrace}@anchor{21eb}
@deffn {Option} @w{-}@w{-}with@w{-}dtrace

Enable DTrace support (default is no).

See @ref{e6c,,Instrumenting CPython with DTrace and SystemTap}.


Added in version 3.6.

@end deffn

@geindex command line option; --with-address-sanitizer
@anchor{using/configure cmdoption-with-address-sanitizer}@anchor{21ec}
@deffn {Option} @w{-}@w{-}with@w{-}address@w{-}sanitizer

Enable AddressSanitizer memory error detector, @code{asan} (default is no).
To improve ASan detection capabilities you may also want to combine this
with @ref{21e3,,--without-pymalloc} to disable the specialized small-object
allocator whose allocations are not tracked by ASan.


Added in version 3.6.

@end deffn

@geindex command line option; --with-memory-sanitizer
@anchor{using/configure cmdoption-with-memory-sanitizer}@anchor{21ed}
@deffn {Option} @w{-}@w{-}with@w{-}memory@w{-}sanitizer

Enable MemorySanitizer allocation error detector, @code{msan} (default is no).


Added in version 3.6.

@end deffn

@geindex command line option; --with-undefined-behavior-sanitizer
@anchor{using/configure cmdoption-with-undefined-behavior-sanitizer}@anchor{21ee}
@deffn {Option} @w{-}@w{-}with@w{-}undefined@w{-}behavior@w{-}sanitizer

Enable UndefinedBehaviorSanitizer undefined behaviour detector, @code{ubsan}
(default is no).


Added in version 3.6.

@end deffn

@geindex command line option; --with-thread-sanitizer
@anchor{using/configure cmdoption-with-thread-sanitizer}@anchor{21ef}
@deffn {Option} @w{-}@w{-}with@w{-}thread@w{-}sanitizer

Enable ThreadSanitizer data race detector, @code{tsan}
(default is no).


Added in version 3.13.

@end deffn

@node Linker options<2>,Libraries options,Debug options,Configure Options
@anchor{using/configure id13}@anchor{21f0}
@subsubsection Linker options


@geindex command line option; --enable-shared
@anchor{using/configure cmdoption-enable-shared}@anchor{a69}
@deffn {Option} @w{-}@w{-}enable@w{-}shared

Enable building a shared Python library: @code{libpython} (default is no).
@end deffn

@geindex command line option; --without-static-libpython
@anchor{using/configure cmdoption-without-static-libpython}@anchor{a94}
@deffn {Option} @w{-}@w{-}without@w{-}static@w{-}libpython

Do not build @code{libpythonMAJOR.MINOR.a} and do not install @code{python.o}
(built and enabled by default).


Added in version 3.10.

@end deffn

@node Libraries options,Security Options,Linker options<2>,Configure Options
@anchor{using/configure libraries-options}@anchor{21f1}
@subsubsection Libraries options


@geindex command line option; --with-libs
@anchor{using/configure cmdoption-with-libs}@anchor{21f2}
@deffn {Option} @w{-}@w{-}with@w{-}libs='lib1 ...'

Link against additional libraries (default is no).
@end deffn

@geindex command line option; --with-system-expat
@anchor{using/configure cmdoption-with-system-expat}@anchor{1b71}
@deffn {Option} @w{-}@w{-}with@w{-}system@w{-}expat

Build the @code{pyexpat} module using an installed @code{expat} library
(default is no).
@end deffn

@geindex command line option; --with-system-libmpdec
@anchor{using/configure cmdoption-with-system-libmpdec}@anchor{657}
@deffn {Option} @w{-}@w{-}with@w{-}system@w{-}libmpdec

Build the @code{_decimal} extension module using an installed @code{mpdecimal}
library, see the @ref{3a,,decimal} module (default is yes).


Added in version 3.3.



Changed in version 3.13: Default to using the installed @code{mpdecimal} library.



Changed in version 3.15: A bundled copy of the library will no longer be selected
implicitly if an installed @code{mpdecimal} library is not found.
In Python 3.15 only, it can still be selected explicitly using
@code{--with-system-libmpdec=no} or @code{--without-system-libmpdec}.



Deprecated since version 3.13, will be removed in version 3.16: A copy of the @code{mpdecimal} library sources will no longer be distributed
with Python 3.16.



@subsubheading See also


@ref{21c8,,LIBMPDEC_CFLAGS} and @ref{21c9,,LIBMPDEC_LIBS}.

@end deffn

@geindex command line option; --with-readline
@anchor{using/configure cmdoption-with-readline}@anchor{219d}
@deffn {Option} @w{-}@w{-}with@w{-}readline=readline|editline

Designate a backend library for the @ref{bf,,readline} module.


@itemize *

@item 
readline: Use readline as the backend.

@item 
editline: Use editline as the backend.
@end itemize


Added in version 3.10.

@end deffn

@geindex command line option; --without-readline
@anchor{using/configure cmdoption-without-readline}@anchor{21f3}
@deffn {Option} @w{-}@w{-}without@w{-}readline

Don’t build the @ref{bf,,readline} module (built by default).

Don’t define the @code{HAVE_LIBREADLINE} macro.


Added in version 3.10.

@end deffn

@geindex command line option; --with-libm
@anchor{using/configure cmdoption-with-libm}@anchor{21f4}
@deffn {Option} @w{-}@w{-}with@w{-}libm=STRING

Override @code{libm} math library to `STRING' (default is system-dependent).
@end deffn

@geindex command line option; --with-libc
@anchor{using/configure cmdoption-with-libc}@anchor{21f5}
@deffn {Option} @w{-}@w{-}with@w{-}libc=STRING

Override @code{libc} C library to `STRING' (default is system-dependent).
@end deffn

@geindex command line option; --with-openssl
@anchor{using/configure cmdoption-with-openssl}@anchor{21f6}
@deffn {Option} @w{-}@w{-}with@w{-}openssl=DIR

Root of the OpenSSL directory.


Added in version 3.7.

@end deffn

@geindex command line option; --with-openssl-rpath
@anchor{using/configure cmdoption-with-openssl-rpath}@anchor{a95}
@deffn {Option} @w{-}@w{-}with@w{-}openssl@w{-}rpath=[no|auto|DIR]

Set runtime library directory (rpath) for OpenSSL libraries:


@itemize *

@item 
@code{no} (default): don’t set rpath;

@item 
@code{auto}: auto-detect rpath from @ref{21f6,,--with-openssl} and
@code{pkg-config};

@item 
`DIR': set an explicit rpath.
@end itemize


Added in version 3.10.

@end deffn

@node Security Options,macOS Options,Libraries options,Configure Options
@anchor{using/configure security-options}@anchor{21f7}
@subsubsection Security Options


@geindex command line option; --with-hash-algorithm
@anchor{using/configure cmdoption-with-hash-algorithm}@anchor{21f8}
@deffn {Option} @w{-}@w{-}with@w{-}hash@w{-}algorithm=[fnv|siphash13|siphash24]

Select hash algorithm for use in @code{Python/pyhash.c}:


@itemize *

@item 
@code{siphash13} (default);

@item 
@code{siphash24};

@item 
@code{fnv}.
@end itemize


Added in version 3.4.



Added in version 3.11: @code{siphash13} is added and it is the new default.

@end deffn

@geindex command line option; --with-builtin-hashlib-hashes
@anchor{using/configure cmdoption-with-builtin-hashlib-hashes}@anchor{219e}
@deffn {Option} @w{-}@w{-}with@w{-}builtin@w{-}hashlib@w{-}hashes=md5,sha1,sha256,sha512,sha3,blake2

Built-in hash modules:


@itemize *

@item 
@code{md5};

@item 
@code{sha1};

@item 
@code{sha256};

@item 
@code{sha512};

@item 
@code{sha3} (with shake);

@item 
@code{blake2}.
@end itemize


Added in version 3.9.

@end deffn

@geindex command line option; --with-ssl-default-suites
@anchor{using/configure cmdoption-with-ssl-default-suites}@anchor{21f9}
@deffn {Option} @w{-}@w{-}with@w{-}ssl@w{-}default@w{-}suites=[python|openssl|STRING]

Override the OpenSSL default cipher suites string:


@itemize *

@item 
@code{python} (default): use Python’s preferred selection;

@item 
@code{openssl}: leave OpenSSL’s defaults untouched;

@item 
`STRING': use a custom string
@end itemize

See the @ref{d5,,ssl} module.


Added in version 3.7.



Changed in version 3.10: The settings @code{python} and `STRING' also set TLS 1.2 as minimum
protocol version.

@end deffn

@geindex command line option; --disable-safety
@anchor{using/configure cmdoption-disable-safety}@anchor{443}
@deffn {Option} @w{-}@w{-}disable@w{-}safety

Disable compiler options that are recommended by OpenSSF@footnote{https://github.com/ossf/wg-best-practices-os-developers/blob/main/docs/Compiler-Hardening-Guides/Compiler-Options-Hardening-Guide-for-C-and-C++.md} for security reasons with no performance overhead.
If this option is not enabled, CPython will be built based on safety compiler options with no slow down.
When this option is enabled, CPython will not be built with the compiler options listed below.

The following compiler options are disabled with @code{--disable-safety}:


@itemize *

@item 
-fstack-protector-strong@footnote{https://github.com/ossf/wg-best-practices-os-developers/blob/main/docs/Compiler-Hardening-Guides/Compiler-Options-Hardening-Guide-for-C-and-C++.md#enable-run-time-checks-for-stack-based-buffer-overflows}: Enable run-time checks for stack-based buffer overflows.

@item 
-Wtrampolines@footnote{https://github.com/ossf/wg-best-practices-os-developers/blob/main/docs/Compiler-Hardening-Guides/Compiler-Options-Hardening-Guide-for-C-and-C++.md#enable-warning-about-trampolines-that-require-executable-stacks}: Enable warnings about trampolines that require executable stacks.
@end itemize


Added in version 3.14.

@end deffn

@geindex command line option; --enable-slower-safety
@anchor{using/configure cmdoption-enable-slower-safety}@anchor{444}
@deffn {Option} @w{-}@w{-}enable@w{-}slower@w{-}safety

Enable compiler options that are recommended by OpenSSF@footnote{https://github.com/ossf/wg-best-practices-os-developers/blob/main/docs/Compiler-Hardening-Guides/Compiler-Options-Hardening-Guide-for-C-and-C++.md} for security reasons which require overhead.
If this option is not enabled, CPython will not be built based on safety compiler options which performance impact.
When this option is enabled, CPython will be built with the compiler options listed below.

The following compiler options are enabled with @code{--enable-slower-safety}:


@itemize *

@item 
-D_FORTIFY_SOURCE=3@footnote{https://github.com/ossf/wg-best-practices-os-developers/blob/main/docs/Compiler-Hardening-Guides/Compiler-Options-Hardening-Guide-for-C-and-C++.md#fortify-sources-for-unsafe-libc-usage-and-buffer-overflows}: Fortify sources with compile- and run-time checks for unsafe libc usage and buffer overflows.
@end itemize


Added in version 3.14.

@end deffn

@node macOS Options,iOS Options,Security Options,Configure Options
@anchor{using/configure macos-options}@anchor{21fa}
@subsubsection macOS Options


See Mac/README.rst@footnote{https://github.com/python/cpython/tree/3.14/Mac/README.rst}.

@geindex command line option; --enable-universalsdk
@anchor{using/configure cmdoption-enable-universalsdk}@anchor{b69}
@deffn {Option} @w{-}@w{-}enable@w{-}universalsdk
@end deffn

@geindex command line option; --enable-universalsdk
@anchor{using/configure cmdoption-0}@anchor{21fb}
@deffn {Option} @w{-}@w{-}enable@w{-}universalsdk=SDKDIR

Create a universal binary build. `SDKDIR' specifies which macOS SDK should
be used to perform the build (default is no).
@end deffn

@geindex command line option; --enable-framework
@anchor{using/configure cmdoption-enable-framework}@anchor{21fc}
@deffn {Option} @w{-}@w{-}enable@w{-}framework
@end deffn

@geindex command line option; --enable-framework
@anchor{using/configure cmdoption-1}@anchor{21fd}
@deffn {Option} @w{-}@w{-}enable@w{-}framework=INSTALLDIR

Create a Python.framework rather than a traditional Unix install. Optional
`INSTALLDIR' specifies the installation path (default is no).
@end deffn

@geindex command line option; --with-universal-archs
@anchor{using/configure cmdoption-with-universal-archs}@anchor{21fe}
@deffn {Option} @w{-}@w{-}with@w{-}universal@w{-}archs=ARCH

Specify the kind of universal binary that should be created. This option is
only valid when @ref{b69,,--enable-universalsdk} is set.

Options:


@itemize *

@item 
@code{universal2} (x86-64 and arm64);

@item 
@code{32-bit} (PPC and i386);

@item 
@code{64-bit}  (PPC64 and x86-64);

@item 
@code{3-way} (i386, PPC and x86-64);

@item 
@code{intel} (i386 and x86-64);

@item 
@code{intel-32} (i386);

@item 
@code{intel-64} (x86-64);

@item 
@code{all}  (PPC, i386, PPC64 and x86-64).
@end itemize

Note that values for this configuration item are `not' the same as the
identifiers used for universal binary wheels on macOS. See the Python
Packaging User Guide for details on the packaging platform compatibility tags used on macOS@footnote{https://packaging.python.org/en/latest/specifications/platform-compatibility-tags/#macos}
@end deffn

@geindex command line option; --with-framework-name
@anchor{using/configure cmdoption-with-framework-name}@anchor{21ff}
@deffn {Option} @w{-}@w{-}with@w{-}framework@w{-}name=FRAMEWORK

Specify the name for the python framework on macOS only valid when
@ref{21fc,,--enable-framework} is set (default: @code{Python}).
@end deffn

@geindex command line option; --with-app-store-compliance
@anchor{using/configure cmdoption-with-app-store-compliance}@anchor{19da}
@deffn {Option} @w{-}@w{-}with@w{-}app@w{-}store@w{-}compliance
@end deffn

@geindex command line option; --with-app-store-compliance
@anchor{using/configure cmdoption-2}@anchor{2200}
@deffn {Option} @w{-}@w{-}with@w{-}app@w{-}store@w{-}compliance=PATCH@w{-}FILE

The Python standard library contains strings that are known to trigger
automated inspection tool errors when submitted for distribution by
the macOS and iOS App Stores. If enabled, this option will apply the list of
patches that are known to correct app store compliance. A custom patch
file can also be specified. This option is disabled by default.


Added in version 3.13.

@end deffn

@node iOS Options,Cross Compiling Options,macOS Options,Configure Options
@anchor{using/configure ios-options}@anchor{2201}
@subsubsection iOS Options


See iOS/README.rst@footnote{https://github.com/python/cpython/tree/3.14/iOS/README.rst}.

@geindex command line option; --enable-framework
@anchor{using/configure cmdoption-3}@anchor{2202}
@deffn {Option} @w{-}@w{-}enable@w{-}framework=INSTALLDIR

Create a Python.framework. Unlike macOS, the `INSTALLDIR' argument
specifying the installation path is mandatory.
@end deffn

@geindex command line option; --with-framework-name
@anchor{using/configure cmdoption-4}@anchor{2203}
@deffn {Option} @w{-}@w{-}with@w{-}framework@w{-}name=FRAMEWORK

Specify the name for the framework (default: @code{Python}).
@end deffn

@node Cross Compiling Options,,iOS Options,Configure Options
@anchor{using/configure cross-compiling-options}@anchor{2204}
@subsubsection Cross Compiling Options


Cross compiling, also known as cross building, can be used to build Python
for another CPU architecture or platform. Cross compiling requires a Python
interpreter for the build platform. The version of the build Python must match
the version of the cross compiled host Python.

@geindex command line option; --build
@anchor{using/configure cmdoption-build}@anchor{2205}
@deffn {Option} @w{-}@w{-}build=BUILD

configure for building on BUILD, usually guessed by @code{config.guess}.
@end deffn

@geindex command line option; --host
@anchor{using/configure cmdoption-host}@anchor{2206}
@deffn {Option} @w{-}@w{-}host=HOST

cross-compile to build programs to run on HOST (target platform)
@end deffn

@geindex command line option; --with-build-python
@anchor{using/configure cmdoption-with-build-python}@anchor{2207}
@deffn {Option} @w{-}@w{-}with@w{-}build@w{-}python=path/to/python

path to build @code{python} binary for cross compiling


Added in version 3.11.

@end deffn

@geindex command line option; CONFIG_SITE
@anchor{using/configure cmdoption-arg-CONFIG_SITE}@anchor{2208}
@deffn {Option} CONFIG_SITE=file

An environment variable that points to a file with configure overrides.

Example `config.site' file:

@example
# config.site-aarch64
ac_cv_buggy_getaddrinfo=no
ac_cv_file__dev_ptmx=yes
ac_cv_file__dev_ptc=no
@end example
@end deffn

@geindex command line option; HOSTRUNNER
@anchor{using/configure cmdoption-arg-HOSTRUNNER}@anchor{2209}
@deffn {Option} HOSTRUNNER

Program to run CPython for the host platform for cross-compilation.


Added in version 3.11.

@end deffn

Cross compiling example:

@example
CONFIG_SITE=config.site-aarch64 ../configure \
    --build=x86_64-pc-linux-gnu \
    --host=aarch64-unknown-linux-gnu \
    --with-build-python=../x86_64/python
@end example

@node Python Build System,Compiler and linker flags,Configure Options,Configure Python
@anchor{using/configure python-build-system}@anchor{220a}
@subsection Python Build System


@menu
* Main files of the build system:: 
* Main build steps:: 
* Main Makefile targets:: 
* C extensions:: 

@end menu

@node Main files of the build system,Main build steps,,Python Build System
@anchor{using/configure main-files-of-the-build-system}@anchor{220b}
@subsubsection Main files of the build system



@itemize *

@item 
@code{configure.ac} => @code{configure};

@item 
@code{Makefile.pre.in} => @code{Makefile} (created by @code{configure});

@item 
@code{pyconfig.h} (created by @code{configure});

@item 
@code{Modules/Setup}: C extensions built by the Makefile using
@code{Module/makesetup} shell script;
@end itemize

@node Main build steps,Main Makefile targets,Main files of the build system,Python Build System
@anchor{using/configure main-build-steps}@anchor{220c}
@subsubsection Main build steps



@itemize *

@item 
C files (@code{.c}) are built as object files (@code{.o}).

@item 
A static @code{libpython} library (@code{.a}) is created from objects files.

@item 
@code{python.o} and the static @code{libpython} library are linked into the
final @code{python} program.

@item 
C extensions are built by the Makefile (see @code{Modules/Setup}).
@end itemize

@node Main Makefile targets,C extensions,Main build steps,Python Build System
@anchor{using/configure main-makefile-targets}@anchor{220d}
@subsubsection Main Makefile targets


@menu
* make:: 
* make platform:: 
* make profile-opt:: 
* make clean:: 
* make distclean:: 
* make install:: 
* make test:: 
* make ci:: 
* make buildbottest:: 
* make regen-all:: 

@end menu

@node make,make platform,,Main Makefile targets
@anchor{using/configure make}@anchor{220e}
@subsubsection make


For the most part, when rebuilding after editing some code or
refreshing your checkout from upstream, all you need to do is execute
@code{make}, which (per Make’s semantics) builds the default target, the
first one defined in the Makefile.  By tradition (including in the
CPython project) this is usually the @code{all} target. The
@code{configure} script expands an @code{autoconf} variable,
@code{@@DEF_MAKE_ALL_RULE@@} to describe precisely which targets @code{make
all} will build. The three choices are:


@itemize *

@item 
@code{profile-opt} (configured with @code{--enable-optimizations})

@item 
@code{build_wasm} (chosen if the host platform matches @code{wasm32-wasi*} or
@code{wasm32-emscripten})

@item 
@code{build_all} (configured without explicitly using either of the others)
@end itemize

Depending on the most recent source file changes, Make will rebuild
any targets (object files and executables) deemed out-of-date,
including running @code{configure} again if necessary. Source/target
dependencies are many and maintained manually however, so Make
sometimes doesn’t have all the information necessary to correctly
detect all targets which need to be rebuilt.  Depending on which
targets aren’t rebuilt, you might experience a number of problems. If
you have build or test problems which you can’t otherwise explain,
@code{make clean && make} should work around most dependency problems, at
the expense of longer build times.

@node make platform,make profile-opt,make,Main Makefile targets
@anchor{using/configure make-platform}@anchor{220f}
@subsubsection make platform


Build the @code{python} program, but don’t build the standard library
extension modules. This generates a file named @code{platform} which
contains a single line describing the details of the build platform,
e.g., @code{macosx-14.3-arm64-3.12} or @code{linux-x86_64-3.13}.

@node make profile-opt,make clean,make platform,Main Makefile targets
@anchor{using/configure make-profile-opt}@anchor{2210}
@subsubsection make profile-opt


Build Python using profile-guided optimization (PGO).  You can use the
configure @ref{a68,,--enable-optimizations} option to make this the
default target of the @code{make} command (@code{make all} or just
@code{make}).

@node make clean,make distclean,make profile-opt,Main Makefile targets
@anchor{using/configure make-clean}@anchor{2211}
@subsubsection make clean


Remove built files.

@node make distclean,make install,make clean,Main Makefile targets
@anchor{using/configure make-distclean}@anchor{2212}
@subsubsection make distclean


In addition to the work done by @code{make clean}, remove files
created by the configure script.  @code{configure} will have to be run
before building again. @footnote{
@code{git clean -fdx} is an even more extreme way to “clean” your
checkout. It removes all files not known to Git.
When bug hunting using @code{git bisect}, this is
@uref{https://github.com/python/cpython/issues/114505#issuecomment-1907021718,recommended between probes}
to guarantee a completely clean build. `Use with care', as it
will delete all files not checked into Git, including your
new, uncommitted work.
}

@node make install,make test,make distclean,Main Makefile targets
@anchor{using/configure make-install}@anchor{2213}
@subsubsection make install


Build the @code{all} target and install Python.

@node make test,make ci,make install,Main Makefile targets
@anchor{using/configure make-test}@anchor{2214}
@subsubsection make test


Build the @code{all} target and run the Python test suite with the
@code{--fast-ci} option without GUI tests. Variables:


@itemize *

@item 
@code{TESTOPTS}: additional regrtest command-line options.

@item 
@code{TESTPYTHONOPTS}: additional Python command-line options.

@item 
@code{TESTTIMEOUT}: timeout in seconds (default: 10 minutes).
@end itemize

@node make ci,make buildbottest,make test,Main Makefile targets
@anchor{using/configure make-ci}@anchor{2215}
@subsubsection make ci


This is similar to @code{make test}, but uses the @code{-ugui} to also run GUI tests.


Added in version 3.14.


@node make buildbottest,make regen-all,make ci,Main Makefile targets
@anchor{using/configure make-buildbottest}@anchor{2216}
@subsubsection make buildbottest


This is similar to @code{make test}, but uses the @code{--slow-ci}
option and default timeout of 20 minutes, instead of @code{--fast-ci} option.

@node make regen-all,,make buildbottest,Main Makefile targets
@anchor{using/configure make-regen-all}@anchor{2217}
@subsubsection make regen-all


Regenerate (almost) all generated files. These include (but are not
limited to) bytecode cases, and parser generator file.
@code{make regen-stdlib-module-names} and @code{autoconf} must be run
separately for the remaining @ref{21a0,,generated files}.

@node C extensions,,Main Makefile targets,Python Build System
@anchor{using/configure c-extensions}@anchor{2218}
@subsubsection C extensions


Some C extensions are built as built-in modules, like the @code{sys} module.
They are built with the @code{Py_BUILD_CORE_BUILTIN} macro defined.
Built-in modules have no @code{__file__} attribute:

@example
>>> import sys
>>> sys
<module 'sys' (built-in)>
>>> sys.__file__
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: module 'sys' has no attribute '__file__'
@end example

Other C extensions are built as dynamic libraries, like the @code{_asyncio} module.
They are built with the @code{Py_BUILD_CORE_MODULE} macro defined.
Example on Linux x86-64:

@example
>>> import _asyncio
>>> _asyncio
<module '_asyncio' from '/usr/lib64/python3.9/lib-dynload/_asyncio.cpython-39-x86_64-linux-gnu.so'>
>>> _asyncio.__file__
'/usr/lib64/python3.9/lib-dynload/_asyncio.cpython-39-x86_64-linux-gnu.so'
@end example

@code{Modules/Setup} is used to generate Makefile targets to build C extensions.
At the beginning of the files, C extensions are built as built-in modules.
Extensions defined after the @code{*shared*} marker are built as dynamic libraries.

The @code{PyAPI_FUNC()}, @code{PyAPI_DATA()} and
@ref{16df,,PyMODINIT_FUNC} macros of @code{Include/exports.h} are defined
differently depending if the @code{Py_BUILD_CORE_MODULE} macro is defined:


@itemize *

@item 
Use @code{Py_EXPORTED_SYMBOL} if the @code{Py_BUILD_CORE_MODULE} is defined

@item 
Use @code{Py_IMPORTED_SYMBOL} otherwise.
@end itemize

If the @code{Py_BUILD_CORE_BUILTIN} macro is used by mistake on a C extension
built as a shared library, its @code{PyInit_@var{xxx}()} function is not exported,
causing an @ref{65b,,ImportError} on import.

@node Compiler and linker flags,,Python Build System,Configure Python
@anchor{using/configure compiler-and-linker-flags}@anchor{2219}
@subsection Compiler and linker flags


Options set by the @code{./configure} script and environment variables and used by
@code{Makefile}.

@menu
* Preprocessor flags:: 
* Compiler flags:: 
* Linker flags:: 

@end menu

@node Preprocessor flags,Compiler flags,,Compiler and linker flags
@anchor{using/configure preprocessor-flags}@anchor{221a}
@subsubsection Preprocessor flags


@geindex environment variable; CONFIGURE_CPPFLAGS
@anchor{using/configure envvar-CONFIGURE_CPPFLAGS}@anchor{221b}
@deffn {Environment Variable} CONFIGURE_CPPFLAGS

Value of 
@geindex CPPFLAGS
@geindex environment variable; CPPFLAGS
@ref{16c5,,CPPFLAGS} variable passed to the @code{./configure} script.


Added in version 3.6.

@end deffn

@geindex environment variable; CPPFLAGS
@anchor{using/configure envvar-CPPFLAGS}@anchor{16c5}
@deffn {Environment Variable} CPPFLAGS

(Objective) C/C++ preprocessor flags, e.g. @code{-I@var{include_dir}} if you have
headers in a nonstandard directory `include_dir'.

Both 
@geindex CPPFLAGS
@geindex environment variable; CPPFLAGS
@ref{16c5,,CPPFLAGS} and 
@geindex LDFLAGS
@geindex environment variable; LDFLAGS
@ref{16c4,,LDFLAGS} need to contain the shell’s
value to be able to build extension modules using the
directories specified in the environment variables.
@end deffn

@geindex environment variable; BASECPPFLAGS
@anchor{using/configure envvar-BASECPPFLAGS}@anchor{221c}
@deffn {Environment Variable} BASECPPFLAGS


Added in version 3.4.

@end deffn

@geindex environment variable; PY_CPPFLAGS
@anchor{using/configure envvar-PY_CPPFLAGS}@anchor{221d}
@deffn {Environment Variable} PY_CPPFLAGS

Extra preprocessor flags added for building the interpreter object files.

Default: @code{$(BASECPPFLAGS) -I. -I$(srcdir)/Include $(CONFIGURE_CPPFLAGS) $(CPPFLAGS)}.


Added in version 3.2.

@end deffn

@node Compiler flags,Linker flags,Preprocessor flags,Compiler and linker flags
@anchor{using/configure compiler-flags}@anchor{221e}
@subsubsection Compiler flags


@geindex environment variable; CC
@anchor{using/configure envvar-CC}@anchor{16c2}
@deffn {Environment Variable} CC

C compiler command.

Example: @code{gcc -pthread}.
@end deffn

@geindex environment variable; CXX
@anchor{using/configure envvar-CXX}@anchor{221f}
@deffn {Environment Variable} CXX

C++ compiler command.

Example: @code{g++ -pthread}.
@end deffn

@geindex environment variable; CFLAGS
@anchor{using/configure envvar-CFLAGS}@anchor{16c3}
@deffn {Environment Variable} CFLAGS

C compiler flags.
@end deffn

@geindex environment variable; CFLAGS_NODIST
@anchor{using/configure envvar-CFLAGS_NODIST}@anchor{2220}
@deffn {Environment Variable} CFLAGS_NODIST

@geindex CFLAGS_NODIST
@geindex environment variable; CFLAGS_NODIST
@ref{2220,,CFLAGS_NODIST} is used for building the interpreter and stdlib C
extensions.  Use it when a compiler flag should `not' be part of
@geindex CFLAGS
@geindex environment variable; CFLAGS
@ref{16c3,,CFLAGS} once Python is installed (gh-65320@footnote{https://github.com/python/cpython/issues/65320}).

In particular, 
@geindex CFLAGS
@geindex environment variable; CFLAGS
@ref{16c3,,CFLAGS} should not contain:


@itemize *

@item 
the compiler flag @code{-I} (for setting the search path for include files).
The @code{-I} flags are processed from left to right, and any flags in
@geindex CFLAGS
@geindex environment variable; CFLAGS
@ref{16c3,,CFLAGS} would take precedence over user- and package-supplied @code{-I}
flags.

@item 
hardening flags such as @code{-Werror} because distributions cannot control
whether packages installed by users conform to such heightened
standards.
@end itemize


Added in version 3.5.

@end deffn

@geindex environment variable; COMPILEALL_OPTS
@anchor{using/configure envvar-COMPILEALL_OPTS}@anchor{2221}
@deffn {Environment Variable} COMPILEALL_OPTS

Options passed to the @ref{21,,compileall} command line when building PYC files
in @code{make install}. Default: @code{-j0}.


Added in version 3.12.

@end deffn

@geindex environment variable; EXTRA_CFLAGS
@anchor{using/configure envvar-EXTRA_CFLAGS}@anchor{2222}
@deffn {Environment Variable} EXTRA_CFLAGS

Extra C compiler flags.
@end deffn

@geindex environment variable; CONFIGURE_CFLAGS
@anchor{using/configure envvar-CONFIGURE_CFLAGS}@anchor{2223}
@deffn {Environment Variable} CONFIGURE_CFLAGS

Value of 
@geindex CFLAGS
@geindex environment variable; CFLAGS
@ref{16c3,,CFLAGS} variable passed to the @code{./configure}
script.


Added in version 3.2.

@end deffn

@geindex environment variable; CONFIGURE_CFLAGS_NODIST
@anchor{using/configure envvar-CONFIGURE_CFLAGS_NODIST}@anchor{2224}
@deffn {Environment Variable} CONFIGURE_CFLAGS_NODIST

Value of 
@geindex CFLAGS_NODIST
@geindex environment variable; CFLAGS_NODIST
@ref{2220,,CFLAGS_NODIST} variable passed to the @code{./configure}
script.


Added in version 3.5.

@end deffn

@geindex environment variable; BASECFLAGS
@anchor{using/configure envvar-BASECFLAGS}@anchor{2225}
@deffn {Environment Variable} BASECFLAGS

Base compiler flags.
@end deffn

@geindex environment variable; OPT
@anchor{using/configure envvar-OPT}@anchor{21e9}
@deffn {Environment Variable} OPT

Optimization flags.
@end deffn

@geindex environment variable; CFLAGS_ALIASING
@anchor{using/configure envvar-CFLAGS_ALIASING}@anchor{2226}
@deffn {Environment Variable} CFLAGS_ALIASING

Strict or non-strict aliasing flags used to compile @code{Python/dtoa.c}.


Added in version 3.7.

@end deffn

@geindex environment variable; CFLAGS_CEVAL
@anchor{using/configure envvar-CFLAGS_CEVAL}@anchor{2227}
@deffn {Environment Variable} CFLAGS_CEVAL

Flags used to compile @code{Python/ceval.c}.


Added in version 3.14.5.

@end deffn

@geindex environment variable; CCSHARED
@anchor{using/configure envvar-CCSHARED}@anchor{2228}
@deffn {Environment Variable} CCSHARED

Compiler flags used to build a shared library.

For example, @code{-fPIC} is used on Linux and on BSD.
@end deffn

@geindex environment variable; CFLAGSFORSHARED
@anchor{using/configure envvar-CFLAGSFORSHARED}@anchor{2229}
@deffn {Environment Variable} CFLAGSFORSHARED

Extra C flags added for building the interpreter object files.

Default: @code{$(CCSHARED)} when @ref{a69,,--enable-shared} is used, or an empty
string otherwise.
@end deffn

@geindex environment variable; PY_CFLAGS
@anchor{using/configure envvar-PY_CFLAGS}@anchor{222a}
@deffn {Environment Variable} PY_CFLAGS

Default: @code{$(BASECFLAGS) $(OPT) $(CONFIGURE_CFLAGS) $(CFLAGS) $(EXTRA_CFLAGS)}.
@end deffn

@geindex environment variable; PY_CFLAGS_NODIST
@anchor{using/configure envvar-PY_CFLAGS_NODIST}@anchor{222b}
@deffn {Environment Variable} PY_CFLAGS_NODIST

Default: @code{$(CONFIGURE_CFLAGS_NODIST) $(CFLAGS_NODIST) -I$(srcdir)/Include/internal}.


Added in version 3.5.

@end deffn

@geindex environment variable; PY_STDMODULE_CFLAGS
@anchor{using/configure envvar-PY_STDMODULE_CFLAGS}@anchor{222c}
@deffn {Environment Variable} PY_STDMODULE_CFLAGS

C flags used for building the interpreter object files.

Default: @code{$(PY_CFLAGS) $(PY_CFLAGS_NODIST) $(PY_CPPFLAGS) $(CFLAGSFORSHARED)}.


Added in version 3.7.

@end deffn

@geindex environment variable; PY_CORE_CFLAGS
@anchor{using/configure envvar-PY_CORE_CFLAGS}@anchor{222d}
@deffn {Environment Variable} PY_CORE_CFLAGS

Default: @code{$(PY_STDMODULE_CFLAGS) -DPy_BUILD_CORE}.


Added in version 3.2.

@end deffn

@geindex environment variable; PY_BUILTIN_MODULE_CFLAGS
@anchor{using/configure envvar-PY_BUILTIN_MODULE_CFLAGS}@anchor{222e}
@deffn {Environment Variable} PY_BUILTIN_MODULE_CFLAGS

Compiler flags to build a standard library extension module as a built-in
module, like the @ref{b2,,posix} module.

Default: @code{$(PY_STDMODULE_CFLAGS) -DPy_BUILD_CORE_BUILTIN}.


Added in version 3.8.

@end deffn

@geindex environment variable; PURIFY
@anchor{using/configure envvar-PURIFY}@anchor{222f}
@deffn {Environment Variable} PURIFY

Purify command. Purify is a memory debugger program.

Default: empty string (not used).
@end deffn

@node Linker flags,,Compiler flags,Compiler and linker flags
@anchor{using/configure linker-flags}@anchor{2230}
@subsubsection Linker flags


@geindex environment variable; LINKCC
@anchor{using/configure envvar-LINKCC}@anchor{2231}
@deffn {Environment Variable} LINKCC

Linker command used to build programs like @code{python} and @code{_testembed}.

Default: @code{$(PURIFY) $(CC)}.
@end deffn

@geindex environment variable; CONFIGURE_LDFLAGS
@anchor{using/configure envvar-CONFIGURE_LDFLAGS}@anchor{2232}
@deffn {Environment Variable} CONFIGURE_LDFLAGS

Value of 
@geindex LDFLAGS
@geindex environment variable; LDFLAGS
@ref{16c4,,LDFLAGS} variable passed to the @code{./configure} script.

Avoid assigning 
@geindex CFLAGS
@geindex environment variable; CFLAGS
@ref{16c3,,CFLAGS}, 
@geindex LDFLAGS
@geindex environment variable; LDFLAGS
@ref{16c4,,LDFLAGS}, etc. so users can use
them on the command line to append to these values without stomping the
pre-set values.


Added in version 3.2.

@end deffn

@geindex environment variable; LDFLAGS_NODIST
@anchor{using/configure envvar-LDFLAGS_NODIST}@anchor{2233}
@deffn {Environment Variable} LDFLAGS_NODIST

@geindex LDFLAGS_NODIST
@geindex environment variable; LDFLAGS_NODIST
@ref{2233,,LDFLAGS_NODIST} is used in the same manner as
@geindex CFLAGS_NODIST
@geindex environment variable; CFLAGS_NODIST
@ref{2220,,CFLAGS_NODIST}.  Use it when a linker flag should `not' be part of
@geindex LDFLAGS
@geindex environment variable; LDFLAGS
@ref{16c4,,LDFLAGS} once Python is installed (gh-65320@footnote{https://github.com/python/cpython/issues/65320}).

In particular, 
@geindex LDFLAGS
@geindex environment variable; LDFLAGS
@ref{16c4,,LDFLAGS} should not contain:


@itemize *

@item 
the compiler flag @code{-L} (for setting the search path for libraries).
The @code{-L} flags are processed from left to right, and any flags in
@geindex LDFLAGS
@geindex environment variable; LDFLAGS
@ref{16c4,,LDFLAGS} would take precedence over user- and package-supplied @code{-L}
flags.
@end itemize
@end deffn

@geindex environment variable; CONFIGURE_LDFLAGS_NODIST
@anchor{using/configure envvar-CONFIGURE_LDFLAGS_NODIST}@anchor{2234}
@deffn {Environment Variable} CONFIGURE_LDFLAGS_NODIST

Value of 
@geindex LDFLAGS_NODIST
@geindex environment variable; LDFLAGS_NODIST
@ref{2233,,LDFLAGS_NODIST} variable passed to the @code{./configure}
script.


Added in version 3.8.

@end deffn

@geindex environment variable; LDFLAGS
@anchor{using/configure envvar-LDFLAGS}@anchor{16c4}
@deffn {Environment Variable} LDFLAGS

Linker flags, e.g. @code{-L@var{lib_dir}} if you have libraries in a nonstandard
directory `lib_dir'.

Both 
@geindex CPPFLAGS
@geindex environment variable; CPPFLAGS
@ref{16c5,,CPPFLAGS} and 
@geindex LDFLAGS
@geindex environment variable; LDFLAGS
@ref{16c4,,LDFLAGS} need to contain the shell’s
value to be able to build extension modules using the
directories specified in the environment variables.
@end deffn

@geindex environment variable; LIBS
@anchor{using/configure envvar-LIBS}@anchor{2235}
@deffn {Environment Variable} LIBS

Linker flags to pass libraries to the linker when linking the Python
executable.

Example: @code{-lrt}.
@end deffn

@geindex environment variable; LDSHARED
@anchor{using/configure envvar-LDSHARED}@anchor{2236}
@deffn {Environment Variable} LDSHARED

Command to build a shared library.

Default: @code{@@LDSHARED@@ $(PY_LDFLAGS)}.
@end deffn

@geindex environment variable; BLDSHARED
@anchor{using/configure envvar-BLDSHARED}@anchor{2237}
@deffn {Environment Variable} BLDSHARED

Command to build @code{libpython} shared library.

Default: @code{@@BLDSHARED@@ $(PY_CORE_LDFLAGS)}.
@end deffn

@geindex environment variable; PY_LDFLAGS
@anchor{using/configure envvar-PY_LDFLAGS}@anchor{2238}
@deffn {Environment Variable} PY_LDFLAGS

Default: @code{$(CONFIGURE_LDFLAGS) $(LDFLAGS)}.
@end deffn

@geindex environment variable; PY_LDFLAGS_NODIST
@anchor{using/configure envvar-PY_LDFLAGS_NODIST}@anchor{2239}
@deffn {Environment Variable} PY_LDFLAGS_NODIST

Default: @code{$(CONFIGURE_LDFLAGS_NODIST) $(LDFLAGS_NODIST)}.


Added in version 3.8.

@end deffn

@geindex environment variable; PY_CORE_LDFLAGS
@anchor{using/configure envvar-PY_CORE_LDFLAGS}@anchor{223a}
@deffn {Environment Variable} PY_CORE_LDFLAGS

Linker flags used for building the interpreter object files.


Added in version 3.8.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Using Python on Windows,Using Python on macOS,Configure Python,Python Setup and Usage
@anchor{using/windows doc}@anchor{223b}@anchor{using/windows translation-repo}@anchor{223c}@anchor{using/windows using-on-windows}@anchor{ca4}@anchor{using/windows using-python-on-windows}@anchor{223d}
@section Using Python on Windows


This document aims to give an overview of Windows-specific behaviour you should
know about when using Python on Microsoft Windows.

Unlike most Unix systems and services, Windows does not include a system
supported installation of Python. Instead, Python can be obtained from a number
of distributors, including directly from the CPython team. Each Python
distribution will have its own benefits and drawbacks, however, consistency with
other tools you are using is generally a worthwhile benefit. Before committing
to the process described here, we recommend investigating your existing tools to
see if they can provide Python directly.

To obtain Python from the CPython team, use the Python Install Manager. This
is a standalone tool that makes Python available as global commands on your
Windows machine, integrates with the system, and supports updates over time. You
can download the Python Install Manager from python.org/downloads@footnote{https://www.python.org/downloads/} or through
the Microsoft Store app@footnote{https://apps.microsoft.com/detail/9NQ7512CXL7T}.

Once you have installed the Python Install Manager, the global @code{python}
command can be used from any terminal to launch your current latest version of
Python. This version may change over time as you add or remove different
versions, and the @code{py list} command will show which is current.

In general, we recommend that you create a @ref{212e,,virtual environment}
for each project and run @code{<env>\Scripts\Activate} in your terminal to use it.
This provides isolation between projects, consistency over time, and ensures
that additional commands added by packages are also available in your session.
Create a virtual environment using @code{python -m venv <env path>}.

If the @code{python} or @code{py} commands do not seem to be working, please see the
@ref{223e,,Troubleshooting} section below. There are
sometimes additional manual steps required to configure your PC.

Apart from using the Python install manager, Python can also be obtained as
NuGet packages. See @ref{223f,,The nuget.org packages} below for more information on these
packages.

The embeddable distros are minimal packages of Python suitable for embedding
into larger applications. They can be installed using the Python install
manager. See @ref{2240,,The embeddable package} below for more information on these
packages.
@anchor{using/windows pymanager}@anchor{2241}@anchor{using/windows windows-store}@anchor{200b}@anchor{using/windows setting-envvars}@anchor{200c}@anchor{using/windows windows-path-mod}@anchor{1257}
@menu
* Python install manager:: 
* The embeddable package:: 
* The nuget.org packages: The nuget org packages. 
* Alternative bundles:: 
* Supported Windows versions:: 
* Removing the MAX_PATH limitation:: 
* UTF-8 mode:: 
* Finding modules:: 
* Additional modules:: 
* Compiling Python on Windows:: 
* The full installer (deprecated): The full installer deprecated. 
* Python launcher for Windows (deprecated): Python launcher for Windows deprecated. 

@end menu

@node Python install manager,The embeddable package,,Using Python on Windows
@anchor{using/windows launcher}@anchor{7db}@anchor{using/windows python-install-manager}@anchor{2242}
@subsection Python install manager


@menu
* Installation:: 
* Basic use:: 
* Command help:: 
* Listing runtimes:: 
* Installing runtimes:: 
* Offline installs:: 
* Uninstalling runtimes:: 
* Configuration:: 
* Shebang lines:: 
* Advanced installation:: 
* Administrative configuration:: 
* Installing free-threaded binaries:: 
* Index signatures:: 
* Troubleshooting:: 

@end menu

@node Installation,Basic use,,Python install manager
@anchor{using/windows installation}@anchor{2243}
@subsubsection Installation


The Python install manager can be installed from the Microsoft Store app@footnote{https://apps.microsoft.com/detail/9NQ7512CXL7T}
or downloaded and installed from python.org/downloads@footnote{https://www.python.org/downloads/}. The two versions are
identical.

To install through the Store, simply click “Install”. After it has completed,
open a terminal and type @code{python} to get started.

To install the file downloaded from python.org, either double-click and select
“Install”, or run @code{Add-AppxPackage <path to MSIX>} in Windows Powershell.

After installation, the @code{python}, @code{py}, and @code{pymanager} commands should be
available. If you have existing installations of Python, or you have modified
your 
@geindex PATH
@geindex environment variable; PATH
@code{PATH} variable, you may need to remove them or undo the
modifications. See @ref{223e,,Troubleshooting} for more help with fixing
non-working commands.

When you first install a runtime, you will likely be prompted to add a directory
to your 
@geindex PATH
@geindex environment variable; PATH
@code{PATH}. This is optional, if you prefer to use the @code{py}
command, but is offered for those who prefer the full range of aliases (such
as @code{python3.14.exe}) to be available. The directory will be
@code{%LocalAppData%\Python\bin} by default, but may be customized by an
administrator. Click Start and search for “Edit environment variables for your
account” for the system settings page to add the path.

Each Python runtime you install will have its own directory for scripts. These
also need to be added to 
@geindex PATH
@geindex environment variable; PATH
@code{PATH} if you want to use them.

The Python install manager will be automatically updated to new releases. This
does not affect any installs of Python runtimes. Uninstalling the Python install
manager does not uninstall any Python runtimes.

If you are not able to install an MSIX in your context, for example, you are
using automated deployment software that does not support it, or are targeting
Windows Server 2019, please see @ref{2244,,Advanced installation} below for more
information.

@node Basic use,Command help,Installation,Python install manager
@anchor{using/windows basic-use}@anchor{2245}
@subsubsection Basic use


The recommended command for launching Python is @code{python}, which will either
launch the version requested by the script being launched, an active virtual
environment, or the default installed version, which will be the latest stable
release unless configured otherwise. If no version is specifically requested and
no runtimes are installed at all, the current latest release will be installed
automatically.

For all scenarios involving multiple runtime versions, the recommended command
is @code{py}. This may be used anywhere in place of @code{python} or the older
@code{py.exe} launcher. By default, @code{py} matches the behaviour of @code{python}, but
also allows command line options to select a specific version as well as
subcommands to manage installations. These are detailed below.

Because the @code{py} command may already be taken by the previous version, there
is also an unambiguous @code{pymanager} command. Scripted installs that are
intending to use Python install manager should consider using @code{pymanager}, due
to the lower chance of encountering a conflict with existing installs. The only
difference between the two commands is when running without any arguments:
@code{py} will launch your default interpreter, while @code{pymanager} will display
help (@code{pymanager exec ...} provides equivalent behaviour to @code{py ...}).

Each of these commands also has a windowed version that avoids creating a
console window. These are @code{pyw}, @code{pythonw} and @code{pymanagerw}. A @code{python3}
command is also included that mimics the @code{python} command. It is intended to
catch accidental uses of the typical POSIX command on Windows, but is not meant
to be widely used or recommended.

To launch your default runtime, run @code{python} or @code{py} with the arguments you
want to be passed to the runtime (such as script files or the module to launch):

@example
$> py
...
$> python my-script.py
...
$> py -m this
...
@end example

The default runtime can be overridden with the 
@geindex PYTHON_MANAGER_DEFAULT
@geindex environment variable; PYTHON_MANAGER_DEFAULT
@ref{2246,,PYTHON_MANAGER_DEFAULT}
environment variable, or a configuration file. See @ref{2247,,Configuration} for
information about configuration settings.

To launch a specific runtime, the @code{py} command accepts a @code{-V:<TAG>} option.
This option must be specified before any others. The tag is part or all of the
identifier for the runtime; for those from the CPython team, it looks like the
version, potentially with the platform. For compatibility, the @code{V:} may be
omitted in cases where the tag refers to an official release and starts with
@code{3}.

@example
$> py -V:3.14 ...
$> py -V:3-arm64 ...
@end example

Runtimes from other distributors may require the `company' to be included as
well. This should be separated from the tag by a slash, and may be a prefix.
Specifying the company is optional when it is @code{PythonCore}, and specifying the
tag is optional (but not the slash) when you want the latest release from a
specific company.

@example
$> py -V:Distributor\1.0 ...
$> py -V:distrib/ ...
@end example

If no version is specified, but a script file is passed, the script will be
inspected for a `shebang line'. This is a special format for the first line in
a file that allows overriding the command. See @ref{2248,,Shebang lines} for more
information. When there is no shebang line, or it cannot be resolved, the script
will be launched with the default runtime.

If you are running in an active virtual environment, have not requested a
particular version, and there is no shebang line, the default runtime will be
that virtual environment. In this scenario, the @code{python} command was likely
already overridden and none of these checks occurred. However, this behaviour
ensures that the @code{py} command can be used interchangeably.

When no runtimes are installed, any launch command will try to install the
requested version and launch it. However, after any version is installed, only
the @code{py exec ...} and @code{pymanager exec ...} commands will install if the
requested version is absent. Other forms of commands will display an error and
direct you to use @code{py install} first.

@node Command help,Listing runtimes,Basic use,Python install manager
@anchor{using/windows command-help}@anchor{2249}
@subsubsection Command help


The @code{py help} command will display the full list of supported commands, along
with their options. Any command may be passed the @code{-?} option to display its
help, or its name passed to @code{py help}.

@example
$> py help
$> py help install
$> py install /?
@end example

All commands support some common options, which will be shown by @code{py help}.
These options must be specified after any subcommand. Specifying @code{-v} or
@code{--verbose} will increase the amount of output shown, and @code{-vv} will
increase it further for debugging purposes. Passing @code{-q} or @code{--quiet} will
reduce output, and @code{-qq} will reduce it further.

The @code{--config=<PATH>} option allows specifying a configuration file to
override multiple settings at once. See @ref{2247,,Configuration} below for more
information about these files.

@node Listing runtimes,Installing runtimes,Command help,Python install manager
@anchor{using/windows listing-runtimes}@anchor{224a}
@subsubsection Listing runtimes


@example
$> py list [-f=|--format=<FMT>] [-1|--one] [--online|-s=|--source=<URL>] [<TAG>...]
@end example

The list of installed runtimes can be seen using @code{py list}. A filter may be
added in the form of one or more tags (with or without company specifier), and
each may include a @code{<}, @code{<=}, @code{>=} or @code{>} prefix to restrict to a range.

A range of formats are supported, and can be passed as the @code{--format=<FMT>} or
@code{-f <FMT>} option. Formats include @code{table} (a user friendly table view),
@code{csv} (comma-separated table), @code{json} (a single JSON blob), @code{jsonl} (one
JSON blob per result), @code{exe} (just the executable path), @code{prefix} (just the
prefix path).

The @code{--one} or @code{-1} option only displays a single result. If the default
runtime is included, it will be the one. Otherwise, the “best” result is shown
(“best” is deliberately vaguely defined, but will usually be the most recent
version). The result shown by @code{py list --one <TAG>} will match the runtime
that would be launched by @code{py -V:<TAG>}.

The @code{--only-managed} option excludes results that were not installed by the
Python install manager. This is useful when determining which runtimes may be
updated or uninstalled through the @code{py} command.

The @code{--online} option is short for passing @code{--source=<URL>} with the default
source. Passing either of these options will search the online index for
runtimes that can be installed. The result shown by @code{py list --online --one
<TAG>} will match the runtime that would be installed by @code{py install <TAG>}.

@example
$> py list --online 3.14
@end example

For compatibility with the old launcher, the @code{--list}, @code{--list-paths},
@code{-0} and @code{-0p} commands (e.g. @code{py -0p}) are retained. They do not allow
additional options, and will produce legacy formatted output.

@node Installing runtimes,Offline installs,Listing runtimes,Python install manager
@anchor{using/windows installing-runtimes}@anchor{224b}
@subsubsection Installing runtimes


@example
$> py install [-s=|--source=<URL>] [-f|--force] [-u|--update] [--dry-run] [<TAG>...]
@end example

New runtime versions may be added using @code{py install}. One or more tags may be
specified, and the special tag @code{default} may be used to select the default.
Ranges are not supported for installation.

The @code{--source=<URL>} option allows overriding the online index that is used to
obtain runtimes. This may be used with an offline index, as shown in
@ref{224c,,Offline installs}.

Passing @code{--force} will ignore any cached files and remove any existing install
to replace it with the specified one.

Passing @code{--update} will replace existing installs if the new version is newer.
Otherwise, they will be left. If no tags are provided with @code{--update}, all
installs managed by the Python install manager will be updated if newer versions
are available. Updates will remove any modifications made to the install,
including globally installed packages, but virtual environments will continue to
work.

Passing @code{--dry-run} will generate output and logs, but will not modify any
installs.

Passing @code{--refresh} will update all registrations for installed runtimes. This
will recreate Start menu shortcuts, registry keys, and global aliases (such as
@code{python3.14.exe} or for any installed scripts). These are automatically
refreshed on installation of any runtime, but may need to be manually refreshed
after installing packages.

In addition to the above options, the @code{--target} option will extract the
runtime to the specified directory instead of doing a normal install.
This is useful for embedding runtimes into larger applications.
Unlike a normal install, @code{py} will not be aware of the extracted runtime,
and no Start menu or other shortcuts will be created.
To launch the runtime, directly execute the main executable (typically
@code{python.exe}) in the target directory.

@example
$> py install ... [-t=|--target=<PATH>] <TAG>
@end example

The @code{py exec} command will install the requested runtime if it is not already
present. This is controlled by the @code{automatic_install} configuration
(
@geindex PYTHON_MANAGER_AUTOMATIC_INSTALL
@geindex environment variable; PYTHON_MANAGER_AUTOMATIC_INSTALL
@ref{224d,,PYTHON_MANAGER_AUTOMATIC_INSTALL}), and is enabled by default.
If no runtimes are available at all, all launch commands will do an automatic
install if the configuration setting allows. This is to ensure a good experience
for new users, but should not generally be relied on rather than using the
@code{py exec} command or explicit install commands.

@node Offline installs,Uninstalling runtimes,Installing runtimes,Python install manager
@anchor{using/windows offline-installs}@anchor{224e}@anchor{using/windows pymanager-offline}@anchor{224c}
@subsubsection Offline installs


To perform offline installs of Python, you will need to first create an offline
index on a machine that has network access.

@example
$> py install --download=<PATH> ... <TAG>...
@end example

The @code{--download=<PATH>} option will download the packages for the listed tags
and create a directory containing them and an @code{index.json} file suitable for
later installation. This entire directory can be moved to the offline machine
and used to install one or more of the bundled runtimes:

@example
$> py install --source="<PATH>\index.json" <TAG>...
@end example

The Python install manager can be installed by downloading its installer and
moving it to another machine before installing.

Alternatively, the ZIP files in an offline index directory can simply be
transferred to another machine and extracted. This will not register the install
in any way, and so it must be launched by directly referencing the executables
in the extracted directory, but it is sometimes a preferable approach in cases
where installing the Python install manager is not possible or convenient.

In this way, Python runtimes can be installed and managed on a machine without
access to the internet.

@node Uninstalling runtimes,Configuration,Offline installs,Python install manager
@anchor{using/windows uninstalling-runtimes}@anchor{224f}
@subsubsection Uninstalling runtimes


@example
$> py uninstall [-y|--yes] <TAG>...
@end example

Runtimes may be removed using the @code{py uninstall} command. One or more tags
must be specified. Ranges are not supported here.

The @code{--yes} option bypasses the confirmation prompt before uninstalling.

Instead of passing tags individually, the @code{--purge} option may be specified.
This will remove all runtimes managed by the Python install manager, including
cleaning up the Start menu, registry, and any download caches. Runtimes that
were not installed by the Python install manager will not be impacted, and
neither will manually created configuration files.

@example
$> py uninstall [-y|--yes] --purge
@end example

The Python install manager can be uninstalled through the Windows “Installed
apps” settings page. This does not remove any runtimes, and they will still be
usable, though the global @code{python} and @code{py} commands will be removed.
Reinstalling the Python install manager will allow you to manage these runtimes
again. To completely clean up all Python runtimes, run with @code{--purge} before
uninstalling the Python install manager.

@node Configuration,Shebang lines,Uninstalling runtimes,Python install manager
@anchor{using/windows configuration}@anchor{2250}@anchor{using/windows pymanager-config}@anchor{2247}
@subsubsection Configuration


Python install manager is configured with a hierarchy of configuration files,
environment variables, command-line options, and registry settings. In general,
configuration files have the ability to configure everything, including the
location of other configuration files, while registry settings are
administrator-only and will override configuration files. Command-line options
override all other settings, but not every option is available.

This section will describe the defaults, but be aware that modified or
overridden installs may resolve settings differently.

A global configuration file may be configured by an administrator, and would be
read first. The user configuration file is stored at
@code{%AppData%\Python\pymanager.json}
(note that this location is under @code{Roaming}, not @code{Local}) and is read next,
overwriting any settings from earlier files. An additional configuration file
may be specified as the @code{PYTHON_MANAGER_CONFIG} environment variable or the
@code{--config} command line option (but not both).
These locations may be modified by administrative customization options listed
later.

The following settings are those that are considered likely to be modified in
normal use. Later sections list those that are intended for administrative
customization.

@c Sphinx bug with text writer; remove widths & caption temporarily

@c :widths: 2, 2, 4

@subsubheading Standard configuration options



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Config Key

@tab

Environment Variable

@tab

Description

@item

@code{default_tag}

@tab

@geindex environment variable; PYTHON_MANAGER_DEFAULT
@anchor{using/windows envvar-PYTHON_MANAGER_DEFAULT}@anchor{2246}
@deffn {Environment Variable} PYTHON_MANAGER_DEFAULT
@end deffn

@tab

The preferred default version to launch or install.
By default, this is interpreted as the most recent non-prerelease version
from the CPython team.

@item

@code{default_platform}

@tab

@code{PYTHON_MANAGER_DEFAULT_PLATFORM}

@tab

The preferred default platform to launch or install.
This is treated as a suffix to the specified tag, such that @code{py -V:3.14}
would prefer an install for @code{3.14-64} if it exists
(and @code{default_platform} is @code{-64}),
but will use @code{3.14} if no tagged install exists.

@item

@code{logs_dir}

@tab

@code{PYTHON_MANAGER_LOGS}

@tab

The location where log files are written.
By default, @code{%TEMP%}.

@item

@code{automatic_install}

@tab

@geindex environment variable; PYTHON_MANAGER_AUTOMATIC_INSTALL
@anchor{using/windows envvar-PYTHON_MANAGER_AUTOMATIC_INSTALL}@anchor{224d}
@deffn {Environment Variable} PYTHON_MANAGER_AUTOMATIC_INSTALL
@end deffn

@tab

True to allow automatic installs when using @code{py exec} to launch (or
@code{py} when no runtimes are installed yet).
Other commands will not automatically install, regardless of this
setting.
By default, true.

@item

@code{include_unmanaged}

@tab

@code{PYTHON_MANAGER_INCLUDE_UNMANAGED}

@tab

True to allow listing and launching runtimes that were not installed
by the Python install manager, or false to exclude them.
By default, true.

@item

@code{shebang_can_run_anything}

@tab

@code{PYTHON_MANAGER_SHEBANG_CAN_RUN_ANYTHING}

@tab

True to allow shebangs in @code{.py} files to launch applications other than
Python runtimes, or false to prevent it.
By default, true.

@item

@code{shebang_templates}

@tab

(none)

@tab

Mapping from shebang line template to alternative command, such as
@code{py -V:<tag>} or a substitute string.
See @ref{2248,,Shebang lines} for more details.

@item

@code{log_level}

@tab

@code{PYMANAGER_VERBOSE}, @code{PYMANAGER_DEBUG}

@tab

Set the default level of output (0-50).
By default, 20.
Lower values produce more output.
The environment variables are boolean, and may produce additional
output during startup that is later suppressed by other configuration.

@item

@code{confirm}

@tab

@code{PYTHON_MANAGER_CONFIRM}

@tab

True to confirm certain actions before taking them (such as uninstall),
or false to skip the confirmation.
By default, true.

@item

@code{install.source}

@tab

@code{PYTHON_MANAGER_SOURCE_URL}

@tab

Override the index feed to obtain new installs from.

@item

@code{install.enable_entrypoints}

@tab

(none)

@tab

True to generate global commands for installed packages (such as
@code{pip.exe}). These are defined by the packages themselves.
If set to false, only the Python interpreter has global commands created.
By default, true. You should run @code{py install --refresh} after changing
this setting.

@item

@code{list.format}

@tab

@code{PYTHON_MANAGER_LIST_FORMAT}

@tab

Specify the default format used by the @code{py list} command.
By default, @code{table}.

@item

@code{install_dir}

@tab

(none)

@tab

Specify the root directory that runtimes will be installed into.
If you change this setting, previously installed runtimes will not be
usable unless you move them to the new location.

@item

@code{global_dir}

@tab

(none)

@tab

Specify the directory where global commands (such as @code{python3.14.exe}
and @code{pip.exe}) are stored.
This directory should be added to your 
@geindex PATH
@geindex environment variable; PATH
@code{PATH} to make the
commands available from your terminal.

@item

@code{download_dir}

@tab

(none)

@tab

Specify the directory where downloaded files are stored.
This directory is a temporary cache, and can be cleaned up from time to
time.

@end multitable


Dotted names should be nested inside JSON objects, for example, @code{list.format}
would be specified as @code{@{"list": @{"format": "table"@}@}}.

@node Shebang lines,Advanced installation,Configuration,Python install manager
@anchor{using/windows pymanager-shebang}@anchor{2248}@anchor{using/windows shebang-lines}@anchor{2251}
@subsubsection Shebang lines


If the first line of a script file starts with @code{#!}, it is known as a
“shebang” line.  Linux and other Unix like operating systems have native
support for such lines and they are commonly used on such systems to indicate
how a script should be executed. The @code{python} and @code{py} commands allow the
same facilities to be used with Python scripts on Windows.

To allow shebang lines in Python scripts to be portable between Unix and
Windows, a number of ‘virtual’ commands are supported to specify which
interpreter to use.  The supported virtual commands are:


@itemize *

@item 
@code{/usr/bin/env <ALIAS>}

@item 
@code{/usr/bin/env -S <ALIAS>}

@item 
@code{/usr/bin/<ALIAS>}

@item 
@code{/usr/local/bin/<ALIAS>}

@item 
@code{<ALIAS>}
@end itemize

For example, if the first line of your script starts with

@example
#! /usr/bin/python
@end example

The default Python or an active virtual environment will be located and used.
As many Python scripts written to work on Unix will already have this line,
you should find these scripts can be used by the launcher without modification.
If you are writing a new script on Windows which you hope will be useful on
Unix, you should use one of the shebang lines starting with @code{/usr}.

Any of the above virtual commands can have @code{<ALIAS>} replaced by an alias from
an installed runtime. That is, any command generated in the global aliases
directory (which you may have added to your 
@geindex PATH
@geindex environment variable; PATH
@code{PATH} environment variable)
can be used in a shebang, even if it is not on your 
@geindex PATH
@geindex environment variable; PATH
@code{PATH}. This allows
the use of shebangs like @code{/usr/bin/python3.12} to select a particular runtime.

If no runtimes are installed, or if automatic installation is enabled, the
requested runtime will be installed if necessary. See @ref{2247,,Configuration}
for information about configuration settings.

The @code{/usr/bin/env} form of shebang line will also search the 
@geindex PATH
@geindex environment variable; PATH
@code{PATH}
environment variable for unrecognized commands. This corresponds to the
behaviour of the Unix @code{env} program, which performs the same search, but
prefers launching known Python commands. A warning may be displayed when
searching for arbitrary executables, and this search may be disabled by the
@code{shebang_can_run_anything} configuration option.

Shebang lines that do not match any of patterns are treated as `Windows'
executable paths that are absolute or relative to the directory containing the
script file. This is a convenience for Windows-only scripts, such as those
generated by an installer, since the behavior is not compatible with Unix-style
shells. These paths may be quoted, and may include multiple arguments, after
which the path to the script and any additional arguments will be appended.
This functionality may be disabled by the @code{shebang_can_run_anything}
configuration option.

Since version 26.3 of the Python install manager, custom shebang templates may
be added to your configuration file. Add the @code{shebang_templates} object with
one member for each template (the string to match) and the command to use when
the template is matched. Most commands should be @code{py -V:<tag>} (or @code{pyw}) to
launch one of your installed runtimes. The @code{py -3.<version>} form is also
allowed, as is a plain @code{py} to launch the default. No other arguments are
supported.

@example
@{
    "shebang_templates": @{
        "/usr/bin/python": "py",
        "/usr/bin/my_custom_python": "py -V:MyCustomPython/3"
    @}
@}
@end example

If the substitute command is not @code{py} or @code{pyw}, it will be written back into
the shebang and regular handling continues. If launching arbitrary executables
is permitted, then providing a full path will allow you to redirect from Python
to any executable. The template should match either the entire line (ignoring
leading and trailing whitespace), or up to the first space in the shebang line.

@cartouche
@quotation Note 
The behaviour of shebangs in the Python install manager is subtly different
from the previous @code{py.exe} launcher, and the old configuration options no
longer apply. If you are specifically reliant on the old behaviour or
configuration, we recommend installing the legacy launcher@footnote{https://www.python.org/ftp/python/3.14.0/win32/launcher.msi}. The legacy
launcher’s @code{py} command will override PyManager’s one by default, and you
will need to use @code{pymanager} commands for installing and uninstalling.
@end quotation
@end cartouche

@node Advanced installation,Administrative configuration,Shebang lines,Python install manager
@anchor{using/windows advanced-installation}@anchor{2252}@anchor{using/windows pymanager-advancedinstall}@anchor{2244}
@subsubsection Advanced installation


For situations where an MSIX cannot be installed, such as some older
administrative distribution platforms, there is an MSI available from the
python.org downloads page. This MSI has no user interface, and can only perform
per-machine installs to its default location in Program Files. It will attempt
to modify the system 
@geindex PATH
@geindex environment variable; PATH
@code{PATH} environment variable to include this install
location, but be sure to validate this on your configuration.

@cartouche
@quotation Note 
Windows Server 2019 is the only version of Windows that CPython supports that
does not support MSIX. For Windows Server 2019, you should use the MSI.
@end quotation
@end cartouche

Be aware that the MSI package does not bundle any runtimes, and so is not
suitable for installs into offline environments without also creating an offline
install index. See @ref{224c,,Offline installs} and @ref{2253,,Administrative configuration}
for information on handling these scenarios.

Runtimes installed by the MSI are shared with those installed by the MSIX, and
are all per-user only. The Python install manager does not support installing
runtimes per-machine. To emulate a per-machine install, you can use @code{py install
--target=<shared location>} as administrator and add your own system-wide
modifications to 
@geindex PATH
@geindex environment variable; PATH
@code{PATH}, the registry, or the Start menu.

When the MSIX is installed, but commands are not available in the 
@geindex PATH
@geindex environment variable; PATH
@code{PATH}
environment variable, they can be found under
@code{%LocalAppData%\Microsoft\WindowsApps\PythonSoftwareFoundation.PythonManager_3847v3x7pw1km}
or
@code{%LocalAppData%\Microsoft\WindowsApps\PythonSoftwareFoundation.PythonManager_qbz5n2kfra8p0},
depending on whether it was installed from python.org or through the Windows
Store. Attempting to run the executable directly from Program Files is not
recommended.

To programmatically install the Python install manager, it is easiest to use
WinGet, which is included with all supported versions of Windows:

@example
$> winget install 9NQ7512CXL7T -e --accept-package-agreements --disable-interactivity

# Optionally run the configuration checker and accept all changes
$> py install --configure -y
@end example

To download the Python install manager and install on another machine, the
following WinGet command will download the required files from the Store to your
Downloads directory (add @code{-d <location>} to customize the output location).
This also generates a YAML file that appears to be unnecessary, as the
downloaded MSIX can be installed by launching or using the commands below.

@example
$> winget download 9NQ7512CXL7T -e --skip-license --accept-package-agreements --accept-source-agreements
@end example

To programmatically install or uninstall an MSIX using only PowerShell, the
Add-AppxPackage@footnote{https://learn.microsoft.com/powershell/module/appx/add-appxpackage} and Remove-AppxPackage@footnote{https://learn.microsoft.com/powershell/module/appx/remove-appxpackage} PowerShell cmdlets are recommended:

@example
$> Add-AppxPackage C:\Downloads\python-manager-25.0.msix
...
$> Get-AppxPackage PythonSoftwareFoundation.PythonManager | Remove-AppxPackage
@end example

The latest release can be downloaded and installed by Windows by passing the
AppInstaller file to the Add-AppxPackage command. This installs using the MSIX
on python.org, and is only recommended for cases where installing via the Store
(interactively or using WinGet) is not possible.

@example
$> Add-AppxPackage -AppInstallerFile https://www.python.org/ftp/python/pymanager/pymanager.appinstaller
@end example

Other tools and APIs may also be used to provision an MSIX package for all users
on a machine, but Python does not consider this a supported scenario. We suggest
looking into the PowerShell Add-AppxProvisionedPackage@footnote{https://learn.microsoft.com/powershell/module/dism/add-appxprovisionedpackage} cmdlet, the native
Windows PackageManager@footnote{https://learn.microsoft.com/uwp/api/windows.management.deployment.packagemanager} class, or the documentation and support for your
deployment tool.

Regardless of the install method, users will still need to install their own
copies of Python itself, as there is no way to trigger those installs without
being a logged in user. When using the MSIX, the latest version of Python will
be available for all users to install without network access.

Note that the MSIX downloadable from the Store and from the Python website are
subtly different and cannot be installed at the same time. Wherever possible,
we suggest using the above WinGet commands to download the package from the
Store to reduce the risk of setting up conflicting installs. There are no
licensing restrictions on the Python install manager that would prevent using
the Store package in this way.

@node Administrative configuration,Installing free-threaded binaries,Advanced installation,Python install manager
@anchor{using/windows administrative-configuration}@anchor{2254}@anchor{using/windows pymanager-admin-config}@anchor{2253}
@subsubsection Administrative configuration


There are a number of options that may be useful for administrators to override
configuration of the Python install manager. These can be used to provide local
caching, disable certain shortcut types, override bundled content. All of the
above configuration options may be set, as well as those below.

Configuration options may be overridden in the registry by setting values under
@code{HKEY_LOCAL_MACHINE\Software\Policies\Python\PyManager}, where the
value name matches the configuration key and the value type is @code{REG_SZ}. Note
that this key can itself be customized, but only by modifying the core config
file distributed with the Python install manager. We recommend, however, that
registry values are used only to set @code{base_config} to a JSON file containing
the full set of overrides. Registry key overrides will replace any other
configured setting, while @code{base_config} allows users to further modify
settings they may need.

Note that most settings with environment variables support those variables
because their default setting specifies the variable. If you override them, the
environment variable will no longer work, unless you override it with another
one. For example, the default value of @code{confirm} is literally
@code{%PYTHON_MANAGER_CONFIRM%}, which will resolve the variable at load time. If
you override the value to @code{yes}, then the environment variable will no longer
be used. If you override the value to @code{%CONFIRM%}, then that environment
variable will be used instead.

Configuration settings that are paths are interpreted as relative to the
directory containing the configuration file that specified them.

@c Sphinx bug with text writer; remove widths & caption temporarily

@c :widths: 1, 4

@subsubheading Administrative configuration options



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Config Key

@tab

Description

@item

@code{base_config}

@tab

The highest priority configuration file to read.
Note that only the built-in configuration file and the registry can
modify this setting.

@item

@code{user_config}

@tab

The second configuration file to read.

@item

@code{additional_config}

@tab

The third configuration file to read.

@item

@code{registry_override_key}

@tab

Registry location to check for overrides.
Note that only the built-in configuration file can modify this setting.

@item

@code{bundled_dir}

@tab

Read-only directory containing locally cached files.

@item

@code{install.fallback_source}

@tab

Path or URL to an index to consult when the main index cannot be accessed.

@item

@code{install.enable_shortcut_kinds}

@tab

Comma-separated list of shortcut kinds to allow (e.g. @code{"pep514,start"}).
Enabled shortcuts may still be disabled by @code{disable_shortcut_kinds}.

@item

@code{install.disable_shortcut_kinds}

@tab

Comma-separated list of shortcut kinds to exclude
(e.g. @code{"pep514,start"}).
Disabled shortcuts are not reactivated by @code{enable_shortcut_kinds}.

@item

@code{install.hard_link_entrypoints}

@tab

True to use hard links for global shortcuts to save disk space. If false,
each shortcut executable is copied instead. After changing this setting,
you must run @code{py install --refresh --force} to update existing
commands.
By default, true. Disabling this may be necessary for troubleshooting or
systems that have issues with file links.

@item

@code{pep514_root}

@tab

Registry location to read and write PEP 514 entries into.
By default, @code{HKEY_CURRENT_USER\Software\Python}.

@item

@code{start_folder}

@tab

Start menu folder to write shortcuts into.
By default, @code{Python}.
This path is relative to the user’s Programs folder.

@item

@code{virtual_env}

@tab

Path to the active virtual environment.
By default, this is @code{%VIRTUAL_ENV%}, but may be set empty
to disable venv detection.

@item

@code{shebang_can_run_anything_silently}

@tab

True to suppress visible warnings when a shebang launches an application
other than a Python runtime.

@item

@code{source_settings}

@tab

A mapping from source URL to settings specific to that index.
When multiple configuration files include this section, URL settings are
added or overwritten, but individual settings are not merged.
These settings are currently only for @ref{2255,,index signatures}.

@end multitable


@node Installing free-threaded binaries,Index signatures,Administrative configuration,Python install manager
@anchor{using/windows install-freethreaded-windows}@anchor{498}@anchor{using/windows installing-free-threaded-binaries}@anchor{2256}
@subsubsection Installing free-threaded binaries



Added in version 3.13.


Pre-built distributions of the free-threaded build are available
by installing tags with the @code{t} suffix.

@example
$> py install 3.14t
$> py install 3.14t-arm64
$> py install 3.14t-32
@end example

This will install and register as normal. If you have no other runtimes
installed, then @code{python} will launch this one. Otherwise, you will need to use
@code{py -V:3.14t ...} or, if you have added the global aliases directory to your
@geindex PATH
@geindex environment variable; PATH
@code{PATH} environment variable, the @code{python3.14t.exe} commands.

@node Index signatures,Troubleshooting,Installing free-threaded binaries,Python install manager
@anchor{using/windows pymanager-index-signatures}@anchor{2255}
@subsubsection Index signatures



Added in version 26.2.


Index files may be signed to detect tampering. A signature is a catalog file
at the same URL as the index with @code{.cat} added to the filename. The catalog
file should contain the hash of its matching index file, and should be signed
with a valid Authenticode signature. This allows standard tooling (on Windows)
to generate a signature, and any certificate may be used as long as the client
operating system already trusts its certification authority (root CA).

Index signatures are only downloaded and checked when the local configuration’s
@code{source_settings} section includes the index URL and @code{requires_signature} is
true, or the index JSON contains @code{requires_signature} set to true. When the
setting exists in local configuration, even when false, settings in the index
are ignored.

As well as requiring a valid signature, the @code{required_root_subject} and
@code{required_publisher_subject} settings can further restrict acceptable
signatures based on the certificate Subject fields. Any attribute specified in
the configuration must match the attribute in the certificate (additional
attributes in the certificate are ignored). Typical attributes are @code{CN=} for
the common name, @code{O=} for the organizational unit, and @code{C=} for the
publisher’s country.

Finally, the @code{required_publisher_eku} setting allows requiring that a specific
Enhanced Key Usage (EKU) has been assigned to the publisher certificate. For
example, the EKU @code{1.3.6.1.5.5.7.3.3} indicates that the certificate was
intended for code signing (as opposed to server or client authentication).
In combination with a specific root CA, this provides another mechanism to
verify a legitimate signature.

This is an example @code{source_settings} section from a configuration file. In
this case, the publisher of the feed is uniquely identified by the combination
of the Microsoft Identity Verification root and the EKU assigned by that root.
The signature for this case would be found at
@code{https://www.python.org/ftp/python/index-windows.json.cat}.

@example
@{
  "source_settings": @{
    "https://www.python.org/ftp/python/index-windows.json": @{
      "requires_signature": true,
      "required_root_subject": "CN=Microsoft Identity Verification Root Certificate Authority 2020",
      "required_publisher_subject": "CN=Python Software Foundation",
      "required_publisher_eku": "1.3.6.1.4.1.311.97.608394634.79987812.305991749.578777327"
    @}
  @}
@}
@end example

The same settings could be specified in the @code{index.json} file instead. In this
case, the root and EKU are omitted, meaning that the signature must be valid and
have a specific common name in the publisher’s certificate, but no other checks
are used.

@example
@{
  "requires_signature": true,
  "required_publisher_subject": "CN=Python Software Foundation",
  "versions": [
    // ...
  ]
@}
@end example

When settings from inside a feed are used, the user is notified and the settings
are shown in the log file or verbose output. It is recommended to copy these
settings into a local configuration file for feeds that will be used frequently,
so that unauthorised modifications to the feed cannot disable verification.

It is not possible to override the location of the signature file in the feed or
through a configuration file. Administrators can provide their own
@code{source_settings} in a mandatory configuration file (see
@ref{2253,,Administrative configuration}).

If signature validation fails, you will be notified and prompted to continue.
When interactive confirmation is not allowed (for example, because @code{--yes} was
specified), it will always abort. To use a feed with invalid configuration in
this scenario, you must provide a configuration file that disables signature
checking for that feed.

@example
"source_settings": @{
  "https://www.example.com/feed-with-invalid-signature.json": @{
    "requires_signature": false
  @}
@}
@end example

@node Troubleshooting,,Index signatures,Python install manager
@anchor{using/windows pymanager-troubleshoot}@anchor{223e}@anchor{using/windows troubleshooting}@anchor{2257}
@subsubsection Troubleshooting


If your Python install manager does not seem to be working correctly, please
work through these tests and fixes to see if it helps. If not, please report an
issue at our bug tracker@footnote{https://github.com/python/pymanager/issues},
including any relevant log files (written to your @code{%TEMP%} directory by
default).

@c Sphinx bug with text writer; remove widths & caption temporarily

@c :widths: 1, 1

@subsubheading Troubleshooting



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Symptom

@tab

Things to try

@item

@code{python} gives me a “command not found” error or opens the Store app
when I type it in my terminal.

@tab

Did you @ref{2241,,install the Python install manager}?

@item

@tab

Click Start, open “Manage app execution aliases”, and check that the
aliases for “Python (default)” are enabled.
If they already are, try disabling and re-enabling to refresh the command.
The “Python (default windowed)” and “Python install manager” commands
may also need refreshing.

@item

@tab

Check that the @code{py} and @code{pymanager} commands work.

@item

@tab

Ensure your 
@geindex PATH
@geindex environment variable; PATH
@code{PATH} variable contains the entry for
@code{%UserProfile%\AppData\Local\Microsoft\WindowsApps}.
The operating system includes this entry once by default, after other
user paths. If removed, shortcuts will not be found.

@item

@code{py} gives me a “command not found” error when I type it in my terminal.

@tab

Did you @ref{2241,,install the Python install manager}?

@item

@tab

Click Start, open “Manage app execution aliases”, and check that the
aliases for “Python (default)” are enabled.
If they already are, try disabling and re-enabling to refresh the command.
The “Python (default windowed)” and “Python install manager” commands
may also need refreshing.

@item

@tab

Ensure your 
@geindex PATH
@geindex environment variable; PATH
@code{PATH} variable contains the entry for
@code{%UserProfile%\AppData\Local\Microsoft\WindowsApps}.
The operating system includes this entry once by default, after other
user paths. If removed, shortcuts will not be found.

@item

@code{py} gives me a “can’t open file” error when I type commands in my
terminal.

@tab

This usually means you have the legacy launcher installed and
it has priority over the Python install manager.
To remove, click Start, open “Installed apps”,
search for “Python launcher” and uninstall it.

@item

@code{python} doesn’t launch the same runtime as @code{py}

@tab

Click Start, open “Installed apps”, look for any existing Python runtimes,
and either remove them or Modify and disable the 
@geindex PATH
@geindex environment variable; PATH
@code{PATH} options.

@item

@tab

Click Start, open “Manage app execution aliases”, and check that your
@code{python.exe} alias is set to “Python (default)”

@item

@code{python} and @code{py} don’t launch the runtime I expect

@tab

Check your 
@geindex PYTHON_MANAGER_DEFAULT
@geindex environment variable; PYTHON_MANAGER_DEFAULT
@ref{2246,,PYTHON_MANAGER_DEFAULT} environment variable
or @code{default_tag} configuration.
The @code{py list} command will show your default based on these settings.

@item

@tab

Installs that are managed by the Python install manager will be chosen
ahead of unmanaged installs.
Use @code{py install} to install the runtime you expect,
or configure your default tag.

@item

@tab

Prerelease and experimental installs that are not managed by the Python
install manager may be chosen ahead of stable releases.
Configure your default tag or uninstall the prerelease runtime
and reinstall it using @code{py install}.

@item

@code{pythonw} or @code{pyw} don’t launch the same runtime as @code{python} or @code{py}

@tab

Click Start, open “Manage app execution aliases”, and check that your
@code{pythonw.exe} and @code{pyw.exe} aliases are consistent with your others.

@item

@code{pip} gives me a “command not found” error when I type it in my terminal.

@tab

Have you activated a virtual environment?
Run the @code{.venv\Scripts\activate} script in your terminal to activate.

@item

@tab

The package may be available but missing the generated executable.
We recommend using the @code{python -m pip} command instead.
Running @code{py install --refresh} and ensuring that the global shortcuts
directory is on 
@geindex PATH
@geindex environment variable; PATH
@code{PATH} (it will be shown in the command output if
it is not) should make commands such as @code{pip} (and other installed
packages) available.

@item

I installed a package with @code{pip} but its command is not found.

@tab

Have you activated a virtual environment?
Run the @code{.venv\Scripts\activate} script in your terminal to activate.

@item

@tab

New packages do not automatically have global shortcuts created by the
Python install manager. Similarly, uninstalled packages do not have their
shortcuts removed.
Run @code{py install --refresh} to update the global shortcuts for newly
installed packages.

@item

Typing @code{script-name.py} in the terminal opens in a new window.

@tab

This is a known limitation of the operating system. Either specify @code{py}
before the script name, create a batch file containing @code{@@py "%~dpn0.py" %*}
with the same name as the script, or install the legacy launcher@footnote{https://www.python.org/ftp/python/3.14.0/win32/launcher.msi}
and select it as the association for scripts.

@item

Drag-dropping files onto a script doesn’t work

@tab

This is a known limitation of the operating system. It is supported with
the legacy launcher@footnote{https://www.python.org/ftp/python/3.14.0/win32/launcher.msi}, or with the Python install manager when installed
from the MSI.

@item

I have installed the Python install manager multiple times.

@tab

It is possible to install from the Store or WinGet, from the MSIX on
the Python website, and from the MSI, all at once.
They are all compatible and will share configuration and runtimes.

@item

@tab

See the earlier @ref{2244,,Advanced installation} section for ways to
uninstall the install manager other than the typical Installed Apps
(Add and Remove Programs) settings page.

@item

My old @code{py.ini} settings no longer work.

@tab

The new Python install manager no longer supports this configuration file
or its settings, and so it will be ignored.
See @ref{2247,,Configuration} for information about configuration settings.

@end multitable


@node The embeddable package,The nuget org packages,Python install manager,Using Python on Windows
@anchor{using/windows the-embeddable-package}@anchor{2258}@anchor{using/windows windows-embeddable}@anchor{2240}
@subsection The embeddable package



Added in version 3.5.


The embedded distribution is a ZIP file containing a minimal Python environment.
It is intended for acting as part of another application, rather than being
directly accessed by end-users.

To install an embedded distribution, we recommend using @code{py install} with the
@code{--target} option:

@example
$> py install 3.14-embed --target=<directory>
@end example

When extracted, the embedded distribution is (almost) fully isolated from the
user’s system, including environment variables, system registry settings, and
installed packages. The standard library is included as pre-compiled and
optimized @code{.pyc} files in a ZIP, and @code{python3.dll}, @code{python313.dll},
@code{python.exe} and @code{pythonw.exe} are all provided. Tcl/tk (including all
dependents, such as Idle), pip and the Python documentation are not included.

A default @code{._pth} file is included, which further restricts the default search
paths (as described below in @ref{e20,,Finding modules}). This file is
intended for embedders to modify as necessary.

Third-party packages should be installed by the application installer alongside
the embedded distribution. Using pip to manage dependencies as for a regular
Python installation is not supported with this distribution, though with some
care it may be possible to include and use pip for automatic updates. In
general, third-party packages should be treated as part of the application
(“vendoring”) so that the developer can ensure compatibility with newer
versions before providing updates to users.

The two recommended use cases for this distribution are described below.

@menu
* Python application:: 
* Embedding Python:: 

@end menu

@node Python application,Embedding Python,,The embeddable package
@anchor{using/windows python-application}@anchor{2259}
@subsubsection Python application


An application written in Python does not necessarily require users to be aware
of that fact. The embedded distribution may be used in this case to include a
private version of Python in an install package. Depending on how transparent it
should be (or conversely, how professional it should appear), there are two
options.

Using a specialized executable as a launcher requires some coding, but provides
the most transparent experience for users. With a customized launcher, there are
no obvious indications that the program is running on Python: icons can be
customized, company and version information can be specified, and file
associations behave properly. In most cases, a custom launcher should simply be
able to call @code{Py_Main} with a hard-coded command line.

The simpler approach is to provide a batch file or generated shortcut that
directly calls the @code{python.exe} or @code{pythonw.exe} with the required
command-line arguments. In this case, the application will appear to be Python
and not its actual name, and users may have trouble distinguishing it from other
running Python processes or file associations.

With the latter approach, packages should be installed as directories alongside
the Python executable to ensure they are available on the path. With the
specialized launcher, packages can be located in other locations as there is an
opportunity to specify the search path before launching the application.

@node Embedding Python,,Python application,The embeddable package
@anchor{using/windows embedding-python}@anchor{225a}
@subsubsection Embedding Python


Applications written in native code often require some form of scripting
language, and the embedded Python distribution can be used for this purpose. In
general, the majority of the application is in native code, and some part will
either invoke @code{python.exe} or directly use @code{python3.dll}. For either case,
extracting the embedded distribution to a subdirectory of the application
installation is sufficient to provide a loadable Python interpreter.

As with the application use, packages can be installed to any location as there
is an opportunity to specify search paths before initializing the interpreter.
Otherwise, there is no fundamental differences between using the embedded
distribution and a regular installation.

@node The nuget org packages,Alternative bundles,The embeddable package,Using Python on Windows
@anchor{using/windows the-nuget-org-packages}@anchor{225b}@anchor{using/windows windows-nuget}@anchor{223f}
@subsection The nuget.org packages



Added in version 3.5.2.


The nuget.org package is a reduced size Python environment intended for use on
continuous integration and build systems that do not have a system-wide
install of Python. While nuget is “the package manager for .NET”, it also works
perfectly fine for packages containing build-time tools.

Visit nuget.org@footnote{https://www.nuget.org/} for the most up-to-date information
on using nuget. What follows is a summary that is sufficient for Python
developers.

The @code{nuget.exe} command line tool may be downloaded directly from
@code{https://aka.ms/nugetclidl}, for example, using curl or PowerShell. With the
tool, the latest version of Python for 64-bit or 32-bit machines is installed
using:

@example
nuget.exe install python -ExcludeVersion -OutputDirectory .
nuget.exe install pythonx86 -ExcludeVersion -OutputDirectory .
@end example

To select a particular version, add a @code{-Version 3.x.y}. The output directory
may be changed from @code{.}, and the package will be installed into a
subdirectory. By default, the subdirectory is named the same as the package,
and without the @code{-ExcludeVersion} option this name will include the specific
version installed. Inside the subdirectory is a @code{tools} directory that
contains the Python installation:

@example
# Without -ExcludeVersion
> .\python.3.5.2\tools\python.exe -V
Python 3.5.2

# With -ExcludeVersion
> .\python\tools\python.exe -V
Python 3.5.2
@end example

In general, nuget packages are not upgradeable, and newer versions should be
installed side-by-side and referenced using the full path. Alternatively,
delete the package directory manually and install it again. Many CI systems
will do this automatically if they do not preserve files between builds.

Alongside the @code{tools} directory is a @code{build\native} directory. This
contains a MSBuild properties file @code{python.props} that can be used in a
C++ project to reference the Python install. Including the settings will
automatically use the headers and import libraries in your build.

The package information pages on nuget.org are
www.nuget.org/packages/python@footnote{https://www.nuget.org/packages/python}
for the 64-bit version, www.nuget.org/packages/pythonx86@footnote{https://www.nuget.org/packages/pythonx86} for the 32-bit version, and
www.nuget.org/packages/pythonarm64@footnote{https://www.nuget.org/packages/pythonarm64} for the ARM64 version

@menu
* Free-threaded packages:: 

@end menu

@node Free-threaded packages,,,The nuget org packages
@anchor{using/windows free-threaded-packages}@anchor{225c}
@subsubsection Free-threaded packages



Added in version 3.13.


Packages containing free-threaded binaries are named
python-freethreaded@footnote{https://www.nuget.org/packages/python-freethreaded}
for the 64-bit version, pythonx86-freethreaded@footnote{https://www.nuget.org/packages/pythonx86-freethreaded} for the 32-bit
version, and pythonarm64-freethreaded@footnote{https://www.nuget.org/packages/pythonarm64-freethreaded} for the ARM64
version. These packages contain both the @code{python3.13t.exe} and
@code{python.exe} entry points, both of which run free threaded.

@node Alternative bundles,Supported Windows versions,The nuget org packages,Using Python on Windows
@anchor{using/windows alternative-bundles}@anchor{225d}
@subsection Alternative bundles


Besides the standard CPython distribution, there are modified packages including
additional functionality.  The following is a list of popular versions and their
key features:


@table @asis

@item ActivePython@footnote{https://www.activestate.com/products/python/}

Installer with multi-platform compatibility, documentation, PyWin32

@item Anaconda@footnote{https://www.anaconda.com/download/}

Popular scientific modules (such as numpy, scipy and pandas) and the
@code{conda} package manager.

@item Enthought Deployment Manager@footnote{https://assets.enthought.com/downloads/edm/}

“The Next Generation Python Environment and Package Manager”.

Previously Enthought provided Canopy, but it reached end of life in 2016@footnote{https://support.enthought.com/hc/en-us/articles/360038600051-Canopy-GUI-end-of-life-transition-to-the-Enthought-Deployment-Manager-EDM-and-Visual-Studio-Code}.

@item WinPython@footnote{https://winpython.github.io/}

Windows-specific distribution with prebuilt scientific packages and
tools for building packages.
@end table

Note that these packages may not include the latest versions of Python or
other libraries, and are not maintained or supported by the core Python team.

@node Supported Windows versions,Removing the MAX_PATH limitation,Alternative bundles,Using Python on Windows
@anchor{using/windows supported-windows-versions}@anchor{225e}
@subsection Supported Windows versions


As specified in 
@geindex Python Enhancement Proposals; PEP 11
PEP 11@footnote{https://peps.python.org/pep-0011/}, a Python release only supports a Windows platform
while Microsoft considers the platform under extended support. This means that
Python 3.14 supports Windows 10 and newer. If you require Windows 7
support, please install Python 3.8. If you require Windows 8.1 support,
please install Python 3.12.

@node Removing the MAX_PATH limitation,UTF-8 mode,Supported Windows versions,Using Python on Windows
@anchor{using/windows max-path}@anchor{e41}@anchor{using/windows removing-the-max-path-limitation}@anchor{225f}
@subsection Removing the MAX_PATH limitation


Windows historically has limited path lengths to 260 characters. This meant that
paths longer than this would not resolve and errors would result.

In the latest versions of Windows, this limitation can be expanded to over
32,000 characters. Your administrator will need to activate the “Enable Win32
long paths” group policy, or set @code{LongPathsEnabled} to @code{1} in the registry
key @code{HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem}.

This allows the @ref{318,,open()} function, the @ref{a5,,os} module and most other
path functionality to accept and return paths longer than 260 characters.

After changing the above option and rebooting, no further configuration is
required.

@node UTF-8 mode,Finding modules,Removing the MAX_PATH limitation,Using Python on Windows
@anchor{using/windows utf-8-mode}@anchor{2260}@anchor{using/windows win-utf8-mode}@anchor{2261}
@subsection UTF-8 mode



Added in version 3.7.


Windows still uses legacy encodings for the system encoding (the ANSI Code
Page).  Python uses it for the default encoding of text files (e.g.
@ref{867,,locale.getencoding()}).

This may cause issues because UTF-8 is widely used on the internet
and most Unix systems, including WSL (Windows Subsystem for Linux).

You can use the @ref{868,,Python UTF-8 Mode} to change the default text
encoding to UTF-8. You can enable the @ref{868,,Python UTF-8 Mode} via
the @code{-X utf8} command line option, or the @code{PYTHONUTF8=1} environment
variable.  See 
@geindex PYTHONUTF8
@geindex environment variable; PYTHONUTF8
@ref{cd5,,PYTHONUTF8} for enabling UTF-8 mode, and
@ref{200c,,Python install manager} for how to modify environment variables.

When the @ref{868,,Python UTF-8 Mode} is enabled, you can still use the
system encoding (the ANSI Code Page) via the “mbcs” codec.

Note that adding @code{PYTHONUTF8=1} to the default environment variables
will affect all Python 3.7+ applications on your system.
If you have any Python 3.7+ applications which rely on the legacy
system encoding, it is recommended to set the environment variable
temporarily or use the @code{-X utf8} command line option.

@cartouche
@quotation Note 
Even when UTF-8 mode is disabled, Python uses UTF-8 by default
on Windows for:


@itemize *

@item 
Console I/O including standard I/O (see 
@geindex Python Enhancement Proposals; PEP 528
PEP 528@footnote{https://peps.python.org/pep-0528/} for details).

@item 
The @ref{75e,,filesystem encoding}
(see 
@geindex Python Enhancement Proposals; PEP 529
PEP 529@footnote{https://peps.python.org/pep-0529/} for details).
@end itemize
@end quotation
@end cartouche

@node Finding modules,Additional modules,UTF-8 mode,Using Python on Windows
@anchor{using/windows finding-modules}@anchor{2262}@anchor{using/windows windows-finding-modules}@anchor{e20}
@subsection Finding modules


These notes supplement the description at @ref{1922,,The initialization of the sys.path module search path} with
detailed Windows notes.

When no @code{._pth} file is found, this is how @ref{3e2,,sys.path} is populated on
Windows:


@itemize *

@item 
An empty entry is added at the start, which corresponds to the current
directory.

@item 
If the environment variable 
@geindex PYTHONPATH
@geindex environment variable; PYTHONPATH
@ref{1223,,PYTHONPATH} exists, as described in
@ref{808,,Environment variables}, its entries are added next.  Note that on Windows,
paths in this variable must be separated by semicolons, to distinguish them
from the colon used in drive identifiers (@code{C:\} etc.).

@item 
Additional “application paths” can be added in the registry as subkeys of
@code{\SOFTWARE\Python\PythonCore@{version@}\PythonPath} under both the
@code{HKEY_CURRENT_USER} and @code{HKEY_LOCAL_MACHINE} hives.  Subkeys which have
semicolon-delimited path strings as their default value will cause each path
to be added to @ref{3e2,,sys.path}.  (Note that all known installers only use
HKLM, so HKCU is typically empty.)

@item 
If the environment variable 
@geindex PYTHONHOME
@geindex environment variable; PYTHONHOME
@ref{3ee,,PYTHONHOME} is set, it is assumed as
“Python Home”.  Otherwise, the path of the main Python executable is used to
locate a “landmark file” (either @code{Lib\os.py} or @code{pythonXY.zip}) to deduce
the “Python Home”.  If a Python home is found, the relevant sub-directories
added to @ref{3e2,,sys.path} (@code{Lib}, @code{plat-win}, etc) are based on that
folder.  Otherwise, the core Python path is constructed from the PythonPath
stored in the registry.

@item 
If the Python Home cannot be located, no 
@geindex PYTHONPATH
@geindex environment variable; PYTHONPATH
@ref{1223,,PYTHONPATH} is specified in
the environment, and no registry entries can be found, a default path with
relative entries is used (e.g. @code{.\Lib;.\plat-win}, etc).
@end itemize

If a @code{pyvenv.cfg} file is found alongside the main executable or in the
directory one level above the executable, the following variations apply:


@itemize *

@item 
If @code{home} is an absolute path and 
@geindex PYTHONHOME
@geindex environment variable; PYTHONHOME
@ref{3ee,,PYTHONHOME} is not set, this
path is used instead of the path to the main executable when deducing the
home location.
@end itemize

The end result of all this is:


@itemize *

@item 
When running @code{python.exe}, or any other .exe in the main Python
directory (either an installed version, or directly from the PCbuild
directory), the core path is deduced, and the core paths in the registry are
ignored.  Other “application paths” in the registry are always read.

@item 
When Python is hosted in another .exe (different directory, embedded via COM,
etc), the “Python Home” will not be deduced, so the core path from the
registry is used.  Other “application paths” in the registry are always read.

@item 
If Python can’t find its home and there are no registry value (frozen .exe,
some very strange installation setup) you get a path with some default, but
relative, paths.
@end itemize

For those who want to bundle Python into their application or distribution, the
following advice will prevent conflicts with other installations:


@itemize *

@item 
Include a @code{._pth} file alongside your executable containing the
directories to include. This will ignore paths listed in the registry and
environment variables, and also ignore @ref{cc,,site} unless @code{import site} is
listed.

@item 
If you are loading @code{python3.dll} or @code{python37.dll} in your own
executable, explicitly set @ref{643,,PyConfig.module_search_paths} before
@ref{3f4,,Py_InitializeFromConfig()}.

@item 
Clear and/or overwrite 
@geindex PYTHONPATH
@geindex environment variable; PYTHONPATH
@ref{1223,,PYTHONPATH} and set 
@geindex PYTHONHOME
@geindex environment variable; PYTHONHOME
@ref{3ee,,PYTHONHOME}
before launching @code{python.exe} from your application.

@item 
If you cannot use the previous suggestions (for example, you are a
distribution that allows people to run @code{python.exe} directly), ensure
that the landmark file (@code{Lib\os.py}) exists in your install directory.
(Note that it will not be detected inside a ZIP file, but a correctly named
ZIP file will be detected instead.)
@end itemize

These will ensure that the files in a system-wide installation will not take
precedence over the copy of the standard library bundled with your application.
Otherwise, your users may experience problems using your application. Note that
the first suggestion is the best, as the others may still be susceptible to
non-standard paths in the registry and user site-packages.


Changed in version 3.6: Add @code{._pth} file support and removes @code{applocal} option from
@code{pyvenv.cfg}.



Changed in version 3.6: Add @code{python`XX'.zip} as a potential landmark when directly adjacent
to the executable.



Deprecated since version 3.6: Modules specified in the registry under @code{Modules} (not @code{PythonPath})
may be imported by @ref{f2c,,importlib.machinery.WindowsRegistryFinder}.
This finder is enabled on Windows in 3.6.0 and earlier, but may need to
be explicitly added to @ref{f2d,,sys.meta_path} in the future.


@node Additional modules,Compiling Python on Windows,Finding modules,Using Python on Windows
@anchor{using/windows additional-modules}@anchor{2263}
@subsection Additional modules


Even though Python aims to be portable among all platforms, there are features
that are unique to Windows.  A couple of modules, both in the standard library
and external, and snippets exist to use these features.

The Windows-specific standard modules are documented in
@ref{2264,,MS Windows Specific Services}.

@menu
* PyWin32:: 
* cx_Freeze:: 

@end menu

@node PyWin32,cx_Freeze,,Additional modules
@anchor{using/windows pywin32}@anchor{2265}
@subsubsection PyWin32


The PyWin32@footnote{https://pypi.org/project/PyWin32/} module by Mark Hammond
is a collection of modules for advanced Windows-specific support.  This includes
utilities for:


@itemize *

@item 
Component Object Model@footnote{https://learn.microsoft.com/windows/win32/com/component-object-model--com--portal}
(COM)

@item 
Win32 API calls

@item 
Registry

@item 
Event log

@item 
Microsoft Foundation Classes@footnote{https://learn.microsoft.com/cpp/mfc/mfc-desktop-applications}
(MFC) user interfaces
@end itemize

PythonWin@footnote{https://web.archive.org/web/20060524042422/https://www.python.org/windows/pythonwin/} is a sample MFC application
shipped with PyWin32.  It is an embeddable IDE with a built-in debugger.


@subsubheading See also



@table @asis

@item Win32 How Do I...?@footnote{https://timgolden.me.uk/python/win32_how_do_i.html}

by Tim Golden

@item Python and COM@footnote{https://www.boddie.org.uk/python/COM.html}

by David and Paul Boddie
@end table


@node cx_Freeze,,PyWin32,Additional modules
@anchor{using/windows cx-freeze}@anchor{2266}
@subsubsection cx_Freeze


cx_Freeze@footnote{https://cx-freeze.readthedocs.io/en/latest/}
wraps Python scripts into executable Windows programs
(@code{`*'.exe} files).  When you have done this, you can distribute your
application without requiring your users to install Python.

@node Compiling Python on Windows,The full installer deprecated,Additional modules,Using Python on Windows
@anchor{using/windows compiling-python-on-windows}@anchor{2267}
@subsection Compiling Python on Windows


If you want to compile CPython yourself, first thing you should do is get the
source@footnote{https://www.python.org/downloads/source/}. You can download either the
latest release’s source or just grab a fresh checkout@footnote{https://devguide.python.org/setup/#get-the-source-code}.

The source tree contains a build solution and project files for Microsoft
Visual Studio, which is the compiler used to build the official Python
releases. These files are in the @code{PCbuild} directory.

Check @code{PCbuild/readme.txt} for general information on the build process.

For extension modules, consult @ref{2268,,Building C and C++ Extensions on Windows}.

@node The full installer deprecated,Python launcher for Windows deprecated,Compiling Python on Windows,Using Python on Windows
@anchor{using/windows the-full-installer-deprecated}@anchor{2269}@anchor{using/windows windows-full}@anchor{226a}
@subsection The full installer (deprecated)



Deprecated since version 3.14: This installer is deprecated since 3.14 and will not be produced for Python
3.16 or later. See @ref{2241,,Python install manager} for the modern installer.


@menu
* Installation steps:: 
* Removing the MAX_PATH limitation: Removing the MAX_PATH limitation<2>. 
* Installing without UI:: 
* Installing without downloading:: 
* Modifying an install:: 
* Installing free-threaded binaries: Installing free-threaded binaries<2>. 

@end menu

@node Installation steps,Removing the MAX_PATH limitation<2>,,The full installer deprecated
@anchor{using/windows installation-steps}@anchor{226b}
@subsubsection Installation steps


Four Python 3.14 installers are available for download - two each for the
32-bit and 64-bit versions of the interpreter. The `web installer' is a small
initial download, and it will automatically download the required components as
necessary. The `offline installer' includes the components necessary for a
default installation and only requires an internet connection for optional
features. See @ref{226c,,Installing without downloading} for other ways to avoid downloading
during installation.

After starting the installer, one of two options may be selected:

@image{python-figures/win_installer,,,,png}

If you select “Install Now”:


@itemize *

@item 
You will `not' need to be an administrator (unless a system update for the
C Runtime Library is required or you install the @ref{7db,,Python install manager} for all
users)

@item 
Python will be installed into your user directory

@item 
The @ref{7db,,Python install manager} will be installed according to the option at the bottom
of the first page

@item 
The standard library, test suite, launcher and pip will be installed

@item 
If selected, the install directory will be added to your 
@geindex PATH
@geindex environment variable; PATH
@code{PATH}

@item 
Shortcuts will only be visible for the current user
@end itemize

Selecting “Customize installation” will allow you to select the features to
install, the installation location and other options or post-install actions.
To install debugging symbols or binaries, you will need to use this option.

To perform an all-users installation, you should select “Customize
installation”. In this case:


@itemize *

@item 
You may be required to provide administrative credentials or approval

@item 
Python will be installed into the Program Files directory

@item 
The @ref{7db,,Python install manager} will be installed into the Windows directory

@item 
Optional features may be selected during installation

@item 
The standard library can be pre-compiled to bytecode

@item 
If selected, the install directory will be added to the system 
@geindex PATH
@geindex environment variable; PATH
@code{PATH}

@item 
Shortcuts are available for all users
@end itemize

@node Removing the MAX_PATH limitation<2>,Installing without UI,Installation steps,The full installer deprecated
@anchor{using/windows id2}@anchor{226d}
@subsubsection Removing the MAX_PATH limitation


Windows historically has limited path lengths to 260 characters. This meant that
paths longer than this would not resolve and errors would result.

In the latest versions of Windows, this limitation can be expanded to
approximately 32,000 characters. Your administrator will need to activate the
“Enable Win32 long paths” group policy, or set @code{LongPathsEnabled} to @code{1}
in the registry key
@code{HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem}.

This allows the @ref{318,,open()} function, the @ref{a5,,os} module and most other
path functionality to accept and return paths longer than 260 characters.

After changing the above option, no further configuration is required.


Changed in version 3.6: Support for long paths was enabled in Python.


@node Installing without UI,Installing without downloading,Removing the MAX_PATH limitation<2>,The full installer deprecated
@anchor{using/windows install-quiet-option}@anchor{805}@anchor{using/windows installing-without-ui}@anchor{226e}
@subsubsection Installing without UI


All of the options available in the installer UI can also be specified from the
command line, allowing scripted installers to replicate an installation on many
machines without user interaction.  These options may also be set without
suppressing the UI in order to change some of the defaults.

The following options (found by executing the installer with @code{/?}) can be
passed into the installer:


@multitable {xxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Name

@tab

Description

@item

/passive

@tab

to display progress without requiring user interaction

@item

/quiet

@tab

to install/uninstall without displaying any UI

@item

/simple

@tab

to prevent user customization

@item

/uninstall

@tab

to remove Python (without confirmation)

@item

/layout [directory]

@tab

to pre-download all components

@item

/log [filename]

@tab

to specify log files location

@end multitable


All other options are passed as @code{name=value}, where the value is usually
@code{0} to disable a feature, @code{1} to enable a feature, or a path. The full list
of available options is shown below.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Name

@tab

Description

@tab

Default

@item

InstallAllUsers

@tab

Perform a system-wide installation.

@tab

0

@item

TargetDir

@tab

The installation directory

@tab

Selected based on
InstallAllUsers

@item

DefaultAllUsersTargetDir

@tab

The default installation directory
for all-user installs

@tab

@code{%ProgramFiles%\Python X.Y} or @code{%ProgramFiles(x86)%\Python X.Y}

@item

DefaultJustForMeTargetDir

@tab

The default install directory for
just-for-me installs

@tab

@code{%LocalAppData%\Programs\Python\PythonXY} or
@code{%LocalAppData%\Programs\Python\PythonXY-32} or
@code{%LocalAppData%\Programs\Python\PythonXY-64}

@item

DefaultCustomTargetDir

@tab

The default custom install directory
displayed in the UI

@tab

(empty)

@item

AssociateFiles

@tab

Create file associations if the
launcher is also installed.

@tab

1

@item

CompileAll

@tab

Compile all @code{.py} files to
@code{.pyc}.

@tab

0

@item

PrependPath

@tab

Prepend install and Scripts
directories  to 
@geindex PATH
@geindex environment variable; PATH
@code{PATH} and
add @code{.PY} to 
@geindex PATHEXT
@geindex environment variable; PATHEXT
@code{PATHEXT}

@tab

0

@item

AppendPath

@tab

Append install and Scripts
directories  to 
@geindex PATH
@geindex environment variable; PATH
@code{PATH} and
add @code{.PY} to 
@geindex PATHEXT
@geindex environment variable; PATHEXT
@code{PATHEXT}

@tab

0

@item

Shortcuts

@tab

Create shortcuts for the interpreter,
documentation and IDLE if installed.

@tab

1

@item

Include_doc

@tab

Install Python manual

@tab

1

@item

Include_debug

@tab

Install debug binaries

@tab

0

@item

Include_dev

@tab

Install developer headers and
libraries. Omitting this may lead to
an unusable installation.

@tab

1

@item

Include_exe

@tab

Install @code{python.exe} and
related files. Omitting this may
lead to an unusable installation.

@tab

1

@item

Include_launcher

@tab

Install @ref{7db,,Python install manager}.

@tab

1

@item

InstallLauncherAllUsers

@tab

Installs the launcher for all
users. Also requires
@code{Include_launcher} to be set to 1

@tab

1

@item

Include_lib

@tab

Install standard library and
extension modules. Omitting this may
lead to an unusable installation.

@tab

1

@item

Include_pip

@tab

Install bundled pip and setuptools

@tab

1

@item

Include_symbols

@tab

Install debugging symbols (@code{*.pdb})

@tab

0

@item

Include_tcltk

@tab

Install Tcl/Tk support and IDLE

@tab

1

@item

Include_test

@tab

Install standard library test suite

@tab

1

@item

Include_tools

@tab

Install utility scripts

@tab

1

@item

LauncherOnly

@tab

Only installs the launcher. This
will override most other options.

@tab

0

@item

SimpleInstall

@tab

Disable most install UI

@tab

0

@item

SimpleInstallDescription

@tab

A custom message to display when the
simplified install UI is used.

@tab

(empty)

@end multitable


For example, to silently install a default, system-wide Python installation,
you could use the following command (from an elevated command prompt):

@example
python-3.9.0.exe /quiet InstallAllUsers=1 PrependPath=1 Include_test=0
@end example

To allow users to easily install a personal copy of Python without the test
suite, you could provide a shortcut with the following command. This will
display a simplified initial page and disallow customization:

@example
python-3.9.0.exe InstallAllUsers=0 Include_launcher=0 Include_test=0
    SimpleInstall=1 SimpleInstallDescription="Just for me, no test suite."
@end example

(Note that omitting the launcher also omits file associations, and is only
recommended for per-user installs when there is also a system-wide installation
that included the launcher.)

The options listed above can also be provided in a file named @code{unattend.xml}
alongside the executable. This file specifies a list of options and values.
When a value is provided as an attribute, it will be converted to a number if
possible. Values provided as element text are always left as strings. This
example file sets the same options as the previous example:

@example
<Options>
    <Option Name="InstallAllUsers" Value="no" />
    <Option Name="Include_launcher" Value="0" />
    <Option Name="Include_test" Value="no" />
    <Option Name="SimpleInstall" Value="yes" />
    <Option Name="SimpleInstallDescription">Just for me, no test suite</Option>
</Options>
@end example

@node Installing without downloading,Modifying an install,Installing without UI,The full installer deprecated
@anchor{using/windows install-layout-option}@anchor{226c}@anchor{using/windows installing-without-downloading}@anchor{226f}
@subsubsection Installing without downloading


As some features of Python are not included in the initial installer download,
selecting those features may require an internet connection.  To avoid this
need, all possible components may be downloaded on-demand to create a complete
`layout' that will no longer require an internet connection regardless of the
selected features. Note that this download may be bigger than required, but
where a large number of installations are going to be performed it is very
useful to have a locally cached copy.

Execute the following command from Command Prompt to download all possible
required files.  Remember to substitute @code{python-3.9.0.exe} for the actual
name of your installer, and to create layouts in their own directories to
avoid collisions between files with the same name.

@example
python-3.9.0.exe /layout [optional target directory]
@end example

You may also specify the @code{/quiet} option to hide the progress display.

@node Modifying an install,Installing free-threaded binaries<2>,Installing without downloading,The full installer deprecated
@anchor{using/windows modifying-an-install}@anchor{2270}
@subsubsection Modifying an install


Once Python has been installed, you can add or remove features through the
Programs and Features tool that is part of Windows. Select the Python entry and
choose “Uninstall/Change” to open the installer in maintenance mode.

“Modify” allows you to add or remove features by modifying the checkboxes -
unchanged checkboxes will not install or remove anything. Some options cannot be
changed in this mode, such as the install directory; to modify these, you will
need to remove and then reinstall Python completely.

“Repair” will verify all the files that should be installed using the current
settings and replace any that have been removed or modified.

“Uninstall” will remove Python entirely, with the exception of the
@ref{7db,,Python install manager}, which has its own entry in Programs and Features.

@node Installing free-threaded binaries<2>,,Modifying an install,The full installer deprecated
@anchor{using/windows id3}@anchor{2271}
@subsubsection Installing free-threaded binaries



Added in version 3.13.


To install pre-built binaries with free-threading enabled (see 
@geindex Python Enhancement Proposals; PEP 703
PEP 703@footnote{https://peps.python.org/pep-0703/}), you
should select “Customize installation”. The second page of options includes the
“Download free-threaded binaries” checkbox.

@image{python-figures/win_install_freethreaded,,,,png}

Selecting this option will download and install additional binaries to the same
location as the main Python install. The main executable is called
@code{python3.13t.exe}, and other binaries either receive a @code{t} suffix or a full
ABI suffix. Python source files and bundled third-party dependencies are shared
with the main install.

The free-threaded version is registered as a regular Python install with the
tag @code{3.13t} (with a @code{-32} or @code{-arm64} suffix as normal for those
platforms). This allows tools to discover it, and for the @ref{7db,,Python install manager} to
support @code{py.exe -3.13t}. Note that the launcher will interpret @code{py.exe -3}
(or a @code{python3} shebang) as “the latest 3.x install”, which will prefer the
free-threaded binaries over the regular ones, while @code{py.exe -3.13} will not.
If you use the short style of option, you may prefer to not install the
free-threaded binaries at this time.

To specify the install option at the command line, use
@code{Include_freethreaded=1}. See @ref{226c,,Installing without downloading} for instructions on
pre-emptively downloading the additional binaries for offline install. The
options to include debug symbols and binaries also apply to the free-threaded
builds.

Free-threaded binaries are also available @ref{223f,,on nuget.org}.

@node Python launcher for Windows deprecated,,The full installer deprecated,Using Python on Windows
@anchor{using/windows python-launcher-for-windows-deprecated}@anchor{2272}
@subsection Python launcher for Windows (deprecated)



Deprecated since version 3.14: The launcher and this documentation have been superseded by the Python
Install Manager described above. This is preserved temporarily for historical
interest.



Added in version 3.3.


The Python launcher for Windows is a utility which aids in locating and
executing of different Python versions.  It allows scripts (or the
command-line) to indicate a preference for a specific Python version, and
will locate and execute that version.

Unlike the 
@geindex PATH
@geindex environment variable; PATH
@code{PATH} variable, the launcher will correctly select the most
appropriate version of Python. It will prefer per-user installations over
system-wide ones, and orders by language version rather than using the most
recently installed version.

The launcher was originally specified in 
@geindex Python Enhancement Proposals; PEP 397
PEP 397@footnote{https://peps.python.org/pep-0397/}.

@menu
* Getting started:: 
* Shebang lines: Shebang lines<2>. 
* Arguments in shebang lines:: 
* Customization:: 
* Diagnostics:: 
* Dry run:: 
* Install on demand:: 
* Return codes:: 

@end menu

@node Getting started,Shebang lines<2>,,Python launcher for Windows deprecated
@anchor{using/windows getting-started}@anchor{2273}
@subsubsection Getting started


@menu
* From the command-line:: 
* Virtual environments:: 
* From a script:: 
* From file associations:: 

@end menu

@node From the command-line,Virtual environments,,Getting started
@anchor{using/windows from-the-command-line}@anchor{2274}
@subsubsection From the command-line



Changed in version 3.6.


System-wide installations of Python 3.3 and later will put the launcher on your
@geindex PATH
@geindex environment variable; PATH
@code{PATH}. The launcher is compatible with all available versions of
Python, so it does not matter which version is installed. To check that the
launcher is available, execute the following command in Command Prompt:

@example
py
@end example

You should find that the latest version of Python you have installed is
started - it can be exited as normal, and any additional command-line
arguments specified will be sent directly to Python.

If you have multiple versions of Python installed (e.g., 3.7 and 3.14) you
will have noticed that Python 3.14 was started - to launch Python 3.7, try
the command:

@example
py -3.7
@end example

If you want the latest version of Python 2 you have installed, try the
command:

@example
py -2
@end example

If you see the following error, you do not have the launcher installed:

@example
'py' is not recognized as an internal or external command,
operable program or batch file.
@end example

The command:

@example
py --list
@end example

displays the currently installed version(s) of Python.

The @code{-x.y} argument is the short form of the @code{-V:Company/Tag} argument,
which allows selecting a specific Python runtime, including those that may have
come from somewhere other than python.org. Any runtime registered by following
@geindex Python Enhancement Proposals; PEP 514
PEP 514@footnote{https://peps.python.org/pep-0514/} will be discoverable. The @code{--list} command lists all available
runtimes using the @code{-V:} format.

When using the @code{-V:} argument, specifying the Company will limit selection to
runtimes from that provider, while specifying only the Tag will select from all
providers. Note that omitting the slash implies a tag:

@example
# Select any '3.*' tagged runtime
py -V:3

# Select any 'PythonCore' released runtime
py -V:PythonCore/

# Select PythonCore's latest Python 3 runtime
py -V:PythonCore/3
@end example

The short form of the argument (@code{-3}) only ever selects from core Python
releases, and not other distributions. However, the longer form (@code{-V:3}) will
select from any.

The Company is matched on the full string, case-insensitive. The Tag is matched
on either the full string, or a prefix, provided the next character is a dot or a
hyphen. This allows @code{-V:3.1} to match @code{3.1-32}, but not @code{3.10}. Tags are
sorted using numerical ordering (@code{3.10} is newer than @code{3.1}), but are
compared using text (@code{-V:3.01} does not match @code{3.1}).

@node Virtual environments,From a script,From the command-line,Getting started
@anchor{using/windows virtual-environments}@anchor{2275}
@subsubsection Virtual environments



Added in version 3.5.


If the launcher is run with no explicit Python version specification, and a
virtual environment (created with the standard library @ref{118,,venv} module or
the external @code{virtualenv} tool) active, the launcher will run the virtual
environment’s interpreter rather than the global one.  To run the global
interpreter, either deactivate the virtual environment, or explicitly specify
the global Python version.

@node From a script,From file associations,Virtual environments,Getting started
@anchor{using/windows from-a-script}@anchor{2276}
@subsubsection From a script


Let’s create a test Python script - create a file called @code{hello.py} with the
following contents

@example
#! python
import sys
sys.stdout.write("hello from Python %s\n" % (sys.version,))
@end example

From the directory in which hello.py lives, execute the command:

@example
py hello.py
@end example

You should notice the version number of your latest Python 2.x installation
is printed.  Now try changing the first line to be:

@example
#! python3
@end example

Re-executing the command should now print the latest Python 3.x information.
As with the above command-line examples, you can specify a more explicit
version qualifier.  Assuming you have Python 3.7 installed, try changing
the first line to @code{#! python3.7} and you should find the 3.7
version information printed.

Note that unlike interactive use, a bare “python” will use the latest
version of Python 2.x that you have installed.  This is for backward
compatibility and for compatibility with Unix, where the command @code{python}
typically refers to Python 2.

@node From file associations,,From a script,Getting started
@anchor{using/windows from-file-associations}@anchor{2277}
@subsubsection From file associations


The launcher should have been associated with Python files (i.e. @code{.py},
@code{.pyw}, @code{.pyc} files) when it was installed.  This means that
when you double-click on one of these files from Windows explorer the launcher
will be used, and therefore you can use the same facilities described above to
have the script specify the version which should be used.

The key benefit of this is that a single launcher can support multiple Python
versions at the same time depending on the contents of the first line.

@node Shebang lines<2>,Arguments in shebang lines,Getting started,Python launcher for Windows deprecated
@anchor{using/windows id4}@anchor{2278}
@subsubsection Shebang lines


If the first line of a script file starts with @code{#!}, it is known as a
“shebang” line.  Linux and other Unix like operating systems have native
support for such lines and they are commonly used on such systems to indicate
how a script should be executed.  This launcher allows the same facilities to
be used with Python scripts on Windows and the examples above demonstrate their
use.

To allow shebang lines in Python scripts to be portable between Unix and
Windows, this launcher supports a number of ‘virtual’ commands to specify
which interpreter to use.  The supported virtual commands are:


@itemize *

@item 
@code{/usr/bin/env}

@item 
@code{/usr/bin/python}

@item 
@code{/usr/local/bin/python}

@item 
@code{python}
@end itemize

For example, if the first line of your script starts with

@example
#! /usr/bin/python
@end example

The default Python or an active virtual environment will be located and used.
As many Python scripts written to work on Unix will already have this line,
you should find these scripts can be used by the launcher without modification.
If you are writing a new script on Windows which you hope will be useful on
Unix, you should use one of the shebang lines starting with @code{/usr}.

Any of the above virtual commands can be suffixed with an explicit version
(either just the major version, or the major and minor version).
Furthermore the 32-bit version can be requested by adding “-32” after the
minor version. I.e. @code{/usr/bin/python3.7-32} will request usage of the
32-bit Python 3.7. If a virtual environment is active, the version will be
ignored and the environment will be used.


Added in version 3.7: Beginning with python launcher 3.7 it is possible to request 64-bit version
by the “-64” suffix. Furthermore it is possible to specify a major and
architecture without minor (i.e. @code{/usr/bin/python3-64}).



Changed in version 3.11: The “-64” suffix is deprecated, and now implies “any architecture that is
not provably i386/32-bit”. To request a specific environment, use the new
@code{-V:@var{TAG}} argument with the complete tag.



Changed in version 3.13: Virtual commands referencing @code{python} now prefer an active virtual
environment rather than searching 
@geindex PATH
@geindex environment variable; PATH
@code{PATH}. This handles cases where
the shebang specifies @code{/usr/bin/env python3} but @code{python3.exe} is
not present in the active environment.


The @code{/usr/bin/env} form of shebang line has one further special property.
Before looking for installed Python interpreters, this form will search the
executable 
@geindex PATH
@geindex environment variable; PATH
@code{PATH} for a Python executable matching the name provided
as the first argument. This corresponds to the behaviour of the Unix @code{env}
program, which performs a 
@geindex PATH
@geindex environment variable; PATH
@code{PATH} search.
If an executable matching the first argument after the @code{env} command cannot
be found, but the argument starts with @code{python}, it will be handled as
described for the other virtual commands.
The environment variable @code{PYLAUNCHER_NO_SEARCH_PATH} may be set
(to any value) to skip this search of 
@geindex PATH
@geindex environment variable; PATH
@code{PATH}.

Shebang lines that do not match any of these patterns are looked up in the
@code{[commands]} section of the launcher’s @ref{2279,,.INI file}.
This may be used to handle certain commands in a way that makes sense for your
system. The name of the command must be a single argument (no spaces in the
shebang executable), and the value substituted is the full path to the
executable (additional arguments specified in the .INI will be quoted as part
of the filename).

@example
[commands]
/bin/xpython=C:\Program Files\XPython\python.exe
@end example

Any commands not found in the .INI file are treated as `Windows' executable
paths that are absolute or relative to the directory containing the script file.
This is a convenience for Windows-only scripts, such as those generated by an
installer, since the behavior is not compatible with Unix-style shells.
These paths may be quoted, and may include multiple arguments, after which the
path to the script and any additional arguments will be appended.

@node Arguments in shebang lines,Customization,Shebang lines<2>,Python launcher for Windows deprecated
@anchor{using/windows arguments-in-shebang-lines}@anchor{227a}
@subsubsection Arguments in shebang lines


The shebang lines can also specify additional options to be passed to the
Python interpreter.  For example, if you have a shebang line:

@example
#! /usr/bin/python -v
@end example

Then Python will be started with the @code{-v} option

@node Customization,Diagnostics,Arguments in shebang lines,Python launcher for Windows deprecated
@anchor{using/windows customization}@anchor{227b}
@subsubsection Customization


@menu
* Customization via INI files:: 
* Customizing default Python versions:: 

@end menu

@node Customization via INI files,Customizing default Python versions,,Customization
@anchor{using/windows customization-via-ini-files}@anchor{227c}@anchor{using/windows launcher-ini}@anchor{2279}
@subsubsection Customization via INI files


Two .ini files will be searched by the launcher - @code{py.ini} in the current
user’s application data directory (@code{%LOCALAPPDATA%} or @code{$env:LocalAppData})
and @code{py.ini} in the same directory as the launcher. The same .ini files are
used for both the ‘console’ version of the launcher (i.e. py.exe) and for the
‘windows’ version (i.e. pyw.exe).

Customization specified in the “application directory” will have precedence over
the one next to the executable, so a user, who may not have write access to the
.ini file next to the launcher, can override commands in that global .ini file.

@node Customizing default Python versions,,Customization via INI files,Customization
@anchor{using/windows customizing-default-python-versions}@anchor{227d}
@subsubsection Customizing default Python versions


In some cases, a version qualifier can be included in a command to dictate
which version of Python will be used by the command. A version qualifier
starts with a major version number and can optionally be followed by a period
(‘.’) and a minor version specifier. Furthermore it is possible to specify
if a 32 or 64 bit implementation shall be requested by adding “-32” or “-64”.

For example, a shebang line of @code{#!python} has no version qualifier, while
@code{#!python3} has a version qualifier which specifies only a major version.

If no version qualifiers are found in a command, the environment
variable @code{PY_PYTHON} can be set to specify the default version
qualifier. If it is not set, the default is “3”. The variable can
specify any value that may be passed on the command line, such as “3”,
“3.7”, “3.7-32” or “3.7-64”. (Note that the “-64” option is only
available with the launcher included with Python 3.7 or newer.)

If no minor version qualifiers are found, the environment variable
@code{PY_PYTHON@{major@}} (where @code{@{major@}} is the current major version qualifier
as determined above) can be set to specify the full version. If no such option
is found, the launcher will enumerate the installed Python versions and use
the latest minor release found for the major version, which is likely,
although not guaranteed, to be the most recently installed version in that
family.

On 64-bit Windows with both 32-bit and 64-bit implementations of the same
(major.minor) Python version installed, the 64-bit version will always be
preferred. This will be true for both 32-bit and 64-bit implementations of the
launcher - a 32-bit launcher will prefer to execute a 64-bit Python installation
of the specified version if available. This is so the behavior of the launcher
can be predicted knowing only what versions are installed on the PC and
without regard to the order in which they were installed (i.e., without knowing
whether a 32 or 64-bit version of Python and corresponding launcher was
installed last). As noted above, an optional “-32” or “-64” suffix can be
used on a version specifier to change this behaviour.

Examples:


@itemize *

@item 
If no relevant options are set, the commands @code{python} and
@code{python2} will use the latest Python 2.x version installed and
the command @code{python3} will use the latest Python 3.x installed.

@item 
The command @code{python3.7} will not consult any
options at all as the versions are fully specified.

@item 
If @code{PY_PYTHON=3}, the commands @code{python} and @code{python3} will both use
the latest installed Python 3 version.

@item 
If @code{PY_PYTHON=3.7-32}, the command @code{python} will use the 32-bit
implementation of 3.7 whereas the command @code{python3} will use the latest
installed Python (PY_PYTHON was not considered at all as a major
version was specified.)

@item 
If @code{PY_PYTHON=3} and @code{PY_PYTHON3=3.7}, the commands
@code{python} and @code{python3} will both use specifically 3.7
@end itemize

In addition to environment variables, the same settings can be configured
in the .INI file used by the launcher.  The section in the INI file is
called @code{[defaults]} and the key name will be the same as the
environment variables without the leading @code{PY_} prefix (and note that
the key names in the INI file are case insensitive.)  The contents of
an environment variable will override things specified in the INI file.

For example:


@itemize *

@item 
Setting @code{PY_PYTHON=3.7} is equivalent to the INI file containing:
@end itemize

@example
[defaults]
python=3.7
@end example


@itemize *

@item 
Setting @code{PY_PYTHON=3} and @code{PY_PYTHON3=3.7} is equivalent to the INI file
containing:
@end itemize

@example
[defaults]
python=3
python3=3.7
@end example

@node Diagnostics,Dry run,Customization,Python launcher for Windows deprecated
@anchor{using/windows diagnostics}@anchor{227e}
@subsubsection Diagnostics


If an environment variable @code{PYLAUNCHER_DEBUG} is set (to any value), the
launcher will print diagnostic information to stderr (i.e. to the console).
While this information manages to be simultaneously verbose `and' terse, it
should allow you to see what versions of Python were located, why a
particular version was chosen and the exact command-line used to execute the
target Python. It is primarily intended for testing and debugging.

@node Dry run,Install on demand,Diagnostics,Python launcher for Windows deprecated
@anchor{using/windows dry-run}@anchor{227f}
@subsubsection Dry run


If an environment variable @code{PYLAUNCHER_DRYRUN} is set (to any value),
the launcher will output the command it would have run, but will not actually
launch Python. This may be useful for tools that want to use the launcher to
detect and then launch Python directly. Note that the command written to
standard output is always encoded using UTF-8, and may not render correctly in
the console.

@node Install on demand,Return codes,Dry run,Python launcher for Windows deprecated
@anchor{using/windows install-on-demand}@anchor{2280}
@subsubsection Install on demand


If an environment variable @code{PYLAUNCHER_ALLOW_INSTALL} is set (to any
value), and the requested Python version is not installed but is available on
the Microsoft Store, the launcher will attempt to install it. This may require
user interaction to complete, and you may need to run the command again.

An additional @code{PYLAUNCHER_ALWAYS_INSTALL} variable causes the launcher
to always try to install Python, even if it is detected. This is mainly intended
for testing (and should be used with @code{PYLAUNCHER_DRYRUN}).

@node Return codes,,Install on demand,Python launcher for Windows deprecated
@anchor{using/windows return-codes}@anchor{2281}
@subsubsection Return codes


The following exit codes may be returned by the Python launcher. Unfortunately,
there is no way to distinguish these from the exit code of Python itself.

The names of codes are as used in the sources, and are only for reference. There
is no way to access or resolve them apart from reading this page. Entries are
listed in alphabetical order of names.


@multitable {xxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Name

@tab

Value

@tab

Description

@item

RC_BAD_VENV_CFG

@tab

107

@tab

A @code{pyvenv.cfg} was found but is corrupt.

@item

RC_CREATE_PROCESS

@tab

101

@tab

Failed to launch Python.

@item

RC_INSTALLING

@tab

111

@tab

An install was started, but the command will
need to be re-run after it completes.

@item

RC_INTERNAL_ERROR

@tab

109

@tab

Unexpected error. Please report a bug.

@item

RC_NO_COMMANDLINE

@tab

108

@tab

Unable to obtain command line from the
operating system.

@item

RC_NO_PYTHON

@tab

103

@tab

Unable to locate the requested version.

@item

RC_NO_VENV_CFG

@tab

106

@tab

A @code{pyvenv.cfg} was required but not
found.

@end multitable


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Using Python on macOS,Using Python on Android,Using Python on Windows,Python Setup and Usage
@anchor{using/mac doc}@anchor{2282}@anchor{using/mac translation-repo}@anchor{2283}@anchor{using/mac using-on-mac}@anchor{2284}@anchor{using/mac using-python-on-macos}@anchor{2285}
@section Using Python on macOS


This document aims to give an overview of macOS-specific behavior you should
know about to get started with Python on Mac computers.
Python on a Mac running macOS is very similar to Python on other Unix-derived platforms,
but there are some differences in installation and some features.

There are various ways to obtain and install Python for macOS.
Pre-built versions of the most recent versions of Python are available
from a number of distributors. Much of this document describes use of
the Pythons provided by the CPython release team for download from
the python.org website@footnote{https://www.python.org/downloads/}. See
@ref{2286,,Alternative Distributions} for some other options.
@anchor{using/mac getting-osx}@anchor{2287}
@menu
* Using Python for macOS from python.org: Using Python for macOS from python org. 
* Alternative Distributions:: 
* Installing Additional Python Packages:: 
* GUI Programming:: 
* Advanced Topics:: 
* Other Resources:: 

@end menu

@node Using Python for macOS from python org,Alternative Distributions,,Using Python on macOS
@anchor{using/mac getting-and-installing-macpython}@anchor{2288}@anchor{using/mac using-python-for-macos-from-python-org}@anchor{2289}
@subsection Using Python for macOS from @code{python.org}


@menu
* Installation steps: Installation steps<2>. 
* How to run a Python script:: 

@end menu

@node Installation steps<2>,How to run a Python script,,Using Python for macOS from python org
@anchor{using/mac installation-steps}@anchor{228a}
@subsubsection Installation steps


For current Python versions@footnote{https://www.python.org/downloads/}
(other than those in @code{security} status), the release team produces a
`Python for macOS' installer package for each new release.
A list of available installers
is available here@footnote{https://www.python.org/downloads/macos/}.
We recommend using the most recent supported Python version where possible.
Current installers provide a
universal2 binary@footnote{https://en.wikipedia.org/wiki/Universal_binary} build
of Python which runs natively on all Macs (Apple Silicon and Intel) that are
supported by a wide range of macOS versions,
currently typically from at least `macOS 10.15 Catalina' on.

The downloaded file is a standard macOS installer package file (@code{.pkg}).
File integrity information (checksum, size, sigstore signature, etc) for each file is included
on the release download page. Installer packages and their contents are signed and notarized
with @code{Python Software Foundation} Apple Developer ID certificates
to meet macOS Gatekeeper requirements@footnote{https://support.apple.com/en-us/102445}.

For a default installation, double-click on the downloaded installer package file.
This should launch the standard macOS Installer app and display the first of several
installer windows steps.

@image{python-figures/mac_installer_01_introduction,,,,png}

Clicking on the `Continue' button brings up the `Read Me' for this installer.
Besides other important information, the `Read Me' documents which Python version is
going to be installed and on what versions of macOS it is supported. You may need
to scroll through to read the whole file. By default, this `Read Me' will also be
installed in @code{/Applications/Python 3.14/} and available to read anytime.

@image{python-figures/mac_installer_02_readme,,,,png}

Clicking on `Continue' proceeds to display the license for Python and for
other included software. You will then need to `Agree' to the license terms
before proceeding to the next step. This license file will also be installed
and available to be read later.

@image{python-figures/mac_installer_03_license,,,,png}

After the license terms are accepted, the next step is the `Installation Type'
display. For most uses, the standard set of installation operations is appropriate.

@image{python-figures/mac_installer_04_installation_type,,,,png}

By pressing the `Customize' button, you can choose to omit or select certain package
components of the installer. Click on each package name to see a description of
what it installs.
To also install support for the optional free-threaded feature,
see @ref{499,,Installing Free-threaded Binaries}.

@image{python-figures/mac_installer_05_custom_install,,,,png}

In either case, clicking `Install' will begin the install process by asking
permission to install new software. A macOS user name with @code{Administrator} privilege
is needed as the installed Python will be available to all users of the Mac.

When the installation is complete, the `Summary' window will appear.

@image{python-figures/mac_installer_06_summary,,,,png}

Double-click on the @code{Install Certificates.command}
icon or file in the @code{/Applications/Python 3.14/} window to complete the
installation.

@image{python-figures/mac_installer_07_applications,,,,png}

This will open a temporary @code{Terminal} shell window that
will use the new Python to download and install SSL root certificates
for its use.

@image{python-figures/mac_installer_08_install_certificates,,,,png}

If @code{Successfully installed certifi} and @code{update complete} appears
in the terminal window, the installation is complete.
Close this terminal window and the installer window.

A default install will include:


@itemize *

@item 
A @code{Python 3.14} folder in your @code{Applications} folder. In here
you find @code{IDLE}, the development environment that is a standard part of official
Python distributions; and @code{Python Launcher}, which handles double-clicking Python
scripts from the macOS Finder@footnote{https://support.apple.com/en-us/HT201732}.

@item 
A framework @code{/Library/Frameworks/Python.framework}, which includes the
Python executable and libraries. The installer adds this location to your shell
path. To uninstall Python, you can remove these three things.
Symlinks to the Python executable are placed in @code{/usr/local/bin/}.
@end itemize

@cartouche
@quotation Note 
Recent versions of macOS include a @code{python3} command in @code{/usr/bin/python3}
that links to a usually older and incomplete version of Python provided by and for use by
the Apple development tools, @code{Xcode} or the @code{Command Line Tools for Xcode}.
You should never modify or attempt to delete this installation, as it is
Apple-controlled and is used by Apple-provided or third-party software.  If
you choose to install a newer Python version from @code{python.org}, you will have
two different but functional Python installations on your computer that
can co-exist. The default installer options should ensure that its @code{python3}
will be used instead of the system @code{python3}.
@end quotation
@end cartouche

@node How to run a Python script,,Installation steps<2>,Using Python for macOS from python org
@anchor{using/mac how-to-run-a-python-script}@anchor{228b}
@subsubsection How to run a Python script


There are two ways to invoke the Python interpreter.
If you are familiar with using a Unix shell in a terminal
window, you can invoke @code{python3.14} or @code{python3} optionally
followed by one or more command line options (described in @ref{1dea,,Command line and environment}).
The Python tutorial also has a useful section on
@ref{495,,using Python interactively from a shell}.

You can also invoke the interpreter through an integrated
development environment.
@ref{121b,,IDLE — Python editor and shell} is a basic editor and interpreter environment
which is included with the standard distribution of Python.
@code{IDLE} includes a Help menu that allows you to access Python documentation. If you
are completely new to Python, you can read the tutorial introduction
in that document.

There are many other editors and IDEs available, see @ref{228c,,Editors and IDEs}
for more information.

To run a Python script file from the terminal window, you can
invoke the interpreter with the name of the script file:

@quotation

@code{python3.14} @code{myscript.py}
@end quotation

To run your script from the Finder, you can either:


@itemize *

@item 
Drag it to @code{Python Launcher}.

@item 
Select @code{Python Launcher} as the default application to open your
script (or any @code{.py} script) through the Finder Info window and double-click it.
@code{Python Launcher} has various preferences to control how your script is
launched. Option-dragging allows you to change these for one invocation, or use
its @code{Preferences} menu to change things globally.
@end itemize

Be aware that running the script directly from the macOS Finder might
produce different results than when running from a terminal window as
the script will not be run in the usual shell environment including
any setting of environment variables in shell profiles.
And, as with any other script or program,
be certain of what you are about to run.

@node Alternative Distributions,Installing Additional Python Packages,Using Python for macOS from python org,Using Python on macOS
@anchor{using/mac alternative-bundles}@anchor{2286}@anchor{using/mac alternative-distributions}@anchor{228d}
@subsection Alternative Distributions


Besides the standard @code{python.org} for macOS installer, there are third-party
distributions for macOS that may include additional functionality.
Some popular distributions and their key features:


@table @asis

@item ActivePython@footnote{https://www.activestate.com/products/python/}

Installer with multi-platform compatibility, documentation

@item Anaconda@footnote{https://www.anaconda.com/download/}

Popular scientific modules (such as numpy, scipy, and pandas) and the
@code{conda} package manager.

@item Homebrew@footnote{https://brew.sh}

Package manager for macOS including multiple versions of Python and many
third-party Python-based packages (including numpy, scipy, and pandas).

@item MacPorts@footnote{https://www.macports.org}

Another package manager for macOS including multiple versions of Python and many
third-party Python-based packages. May include pre-built versions of Python and
many packages for older versions of macOS.
@end table

Note that distributions might not include the latest versions of Python or
other libraries, and are not maintained or supported by the core Python team.

@node Installing Additional Python Packages,GUI Programming,Alternative Distributions,Using Python on macOS
@anchor{using/mac installing-additional-python-packages}@anchor{228e}@anchor{using/mac mac-package-manager}@anchor{228f}
@subsection Installing Additional Python Packages


Refer to the Python Packaging User Guide@footnote{https://packaging.python.org/en/latest/tutorials/installing-packages/} for more information.
@anchor{using/mac osx-gui-scripts}@anchor{2290}
@node GUI Programming,Advanced Topics,Installing Additional Python Packages,Using Python on macOS
@anchor{using/mac gui-programming}@anchor{2291}@anchor{using/mac gui-programming-on-the-mac}@anchor{2292}
@subsection GUI Programming


There are several options for building GUI applications on the Mac with Python.

The standard Python GUI toolkit is @ref{f6,,tkinter}, based on the cross-platform
Tk toolkit (@indicateurl{https://www.tcl.tk}). A macOS-native version of Tk is included with
the installer.

`PyObjC' is a Python binding to Apple’s Objective-C/Cocoa framework.
Information on PyObjC is available from pyobjc@footnote{https://pypi.org/project/pyobjc/}.

A number of alternative macOS GUI toolkits are available including:


@itemize *

@item 
PySide@footnote{https://www.qt.io/qt-for-python}: Official Python bindings to the
Qt GUI toolkit@footnote{https://wiki.qt.io/Qt_for_Python}.

@item 
PyQt@footnote{https://riverbankcomputing.com/software/pyqt/}: Alternative
Python bindings to Qt.

@item 
Kivy@footnote{https://kivy.org}: A cross-platform GUI toolkit that supports
desktop and mobile platforms.

@item 
Toga@footnote{https://toga.readthedocs.io}: Part of the BeeWare Project@footnote{https://beeware.org}; supports desktop, mobile, web and console apps.

@item 
wxPython@footnote{https://wxpython.org}: A cross-platform toolkit that
supports desktop operating systems.
@end itemize

@node Advanced Topics,Other Resources,GUI Programming,Using Python on macOS
@anchor{using/mac advanced-topics}@anchor{2293}
@subsection Advanced Topics


@menu
* Installing Free-threaded Binaries:: 
* Installing using the command line:: 
* Distributing Python Applications:: 
* App Store Compliance:: 

@end menu

@node Installing Free-threaded Binaries,Installing using the command line,,Advanced Topics
@anchor{using/mac install-freethreaded-macos}@anchor{499}@anchor{using/mac installing-free-threaded-binaries}@anchor{2294}
@subsubsection Installing Free-threaded Binaries



Added in version 3.13.


The @code{python.org} @ref{2288,,Python for macOS}
installer package can optionally install an additional build of
Python 3.14 that supports 
@geindex Python Enhancement Proposals; PEP 703
PEP 703@footnote{https://peps.python.org/pep-0703/}, the free-threading feature
(running with the @ref{474,,global interpreter lock} disabled).
Check the release page on @code{python.org} for possible updated information.

The free-threaded mode is working and continues to be improved, but
there is some additional overhead in single-threaded workloads compared
to the regular build. Additionally, third-party packages, in particular ones
with an @ref{2295,,extension module}, may not be ready for use in a
free-threaded build, and will re-enable the @ref{165,,GIL}.
Therefore, the support for free-threading
is not installed by default. It is packaged as a separate install option,
available by clicking the `Customize' button on the `Installation Type'
step of the installer as described above.

@image{python-figures/mac_installer_09_custom_install_free_threaded,,,,png}

If the box next to the `Free-threaded Python' package name is checked,
a separate @code{PythonT.framework} will also be installed
alongside the normal @code{Python.framework} in @code{/Library/Frameworks}.
This configuration allows a free-threaded Python 3.14 build to co-exist
on your system with a traditional (GIL only) Python 3.14 build with
minimal risk while installing or testing. This installation layout may
change in future releases.

Known cautions and limitations:


@itemize -

@item 
The `UNIX command-line tools' package, which is selected by default,
will install links in @code{/usr/local/bin} for @code{python3.14t},
the free-threaded interpreter, and @code{python3.14t-config},
a configuration utility which may be useful for package builders.
Since @code{/usr/local/bin} is typically included in your shell @code{PATH},
in most cases no changes to your @code{PATH} environment variables should
be needed to use @code{python3.14t}.

@item 
For this release, the `Shell profile updater' package and the
@code{Update Shell Profile.command} in @code{/Applications/Python 3.14/}
do not support the free-threaded package.

@item 
The free-threaded build and the traditional build have separate search
paths and separate @code{site-packages} directories so, by default,
if you need a package available in both builds, it may need to be installed in both.
The free-threaded package will install a separate instance of @code{pip} for use
with @code{python3.14t}.


@itemize -

@item 
To install a package using @code{pip} without a @code{venv}:

@example
python3.14t -m pip install <package_name>
@end example
@end itemize

@item 
When working with multiple Python environments, it is usually safest and easiest
to @ref{212e,,create and use virtual environments}.
This can avoid possible command name conflicts and confusion about which Python is in use:

@example
python3.14t -m venv <venv_name>
@end example

then @code{activate}.

@item 
To run a free-threaded version of IDLE:

@example
python3.14t -m idlelib
@end example

@item 
The interpreters in both builds respond to the same
@ref{808,,PYTHON environment variables}
which may have unexpected results, for example, if you have @code{PYTHONPATH}
set in a shell profile. If necessary, there are
@ref{215e,,command line options} like @code{-E}
to ignore these environment variables.

@item 
The free-threaded build links to the third-party shared libraries,
such as @code{OpenSSL} and @code{Tk}, installed in the traditional framework.
This means that both builds also share one set of trust certificates
as installed by the @code{Install Certificates.command} script,
thus it only needs to be run once.

@item 
If you cannot depend on the link in @code{/usr/local/bin} pointing to the
@code{python.org} free-threaded @code{python3.14t} (for example, if you want
to install your own version there or some other distribution does),
you can explicitly set your shell @code{PATH} environment variable to
include the @code{PythonT} framework @code{bin} directory:

@example
export PATH="/Library/Frameworks/PythonT.framework/Versions/3.14/bin":"$PATH"
@end example

The traditional framework installation by default does something similar,
except for @code{Python.framework}. Be aware that having both framework @code{bin}
directories in @code{PATH} can lead to confusion if there are duplicate names
like @code{python3.14} in both; which one is actually used depends on the order
they appear in @code{PATH}. The @code{which python3.x} or @code{which python3.xt}
commands can show which path is being used. Using virtual environments
can help avoid such ambiguities. Another option might be to create
a shell @code{alias} to the desired interpreter, like:

@example
alias py3.14="/Library/Frameworks/Python.framework/Versions/3.14/bin/python3.14"
alias py3.14t="/Library/Frameworks/PythonT.framework/Versions/3.14/bin/python3.14t"
@end example
@end itemize

@node Installing using the command line,Distributing Python Applications,Installing Free-threaded Binaries,Advanced Topics
@anchor{using/mac installing-using-the-command-line}@anchor{2296}
@subsubsection Installing using the command line


If you want to use automation to install the @code{python.org} installer package
(rather than by using the familiar macOS @code{Installer} GUI app),
the macOS command line @code{installer} utility lets you select non-default
options, too. If you are not familiar with @code{installer}, it can be
somewhat cryptic (see @code{man installer} for more information).
As an example, the following shell snippet shows one way to do it,
using the @code{3.14.0b2} release and selecting the free-threaded interpreter
option:

@example
RELEASE="python-3.140b2-macos11.pkg"

# download installer pkg
curl -O https://www.python.org/ftp/python/3.14.0/$@{RELEASE@}

# create installer choicechanges to customize the install:
#    enable the PythonTFramework-3.14 package
#    while accepting the other defaults (install all other packages)
cat > ./choicechanges.plist <<EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
        <dict>
                <key>attributeSetting</key>
                <integer>1</integer>
                <key>choiceAttribute</key>
                <string>selected</string>
                <key>choiceIdentifier</key>
                <string>org.python.Python.PythonTFramework-3.14</string>
        </dict>
</array>
</plist>
EOF

sudo installer -pkg ./$@{RELEASE@} -applyChoiceChangesXML ./choicechanges.plist -target /
@end example

You can then test that both installer builds are now available with something like:

@example
$ # test that the free-threaded interpreter was installed if the Unix Command Tools package was enabled
$ /usr/local/bin/python3.14t -VV
Python 3.14.0b2 free-threading build (v3.14.0b2:3a83b172af, Jun  5 2024, 12:57:31) [Clang 15.0.0 (clang-1500.3.9.4)]
$ #    and the traditional interpreter
$ /usr/local/bin/python3.14 -VV
Python 3.14.0b2 (v3.14.0b2:3a83b172af, Jun  5 2024, 12:50:24) [Clang 15.0.0 (clang-1500.3.9.4)]
$ # test that they are also available without the prefix if /usr/local/bin is on $PATH
$ python3.14t -VV
Python 3.14.0b2 free-threading build (v3.14.0b2:3a83b172af, Jun  5 2024, 12:57:31) [Clang 15.0.0 (clang-1500.3.9.4)]
$ python3.14 -VV
Python 3.14.0b2 (v3.14.0b2:3a83b172af, Jun  5 2024, 12:50:24) [Clang 15.0.0 (clang-1500.3.9.4)]
@end example

@cartouche
@quotation Note 
Current @code{python.org} installers only install to fixed locations like
@code{/Library/Frameworks/}, @code{/Applications}, and @code{/usr/local/bin}.
You cannot use the @code{installer} @code{-domain} option to install to
other locations.
@end quotation
@end cartouche

@node Distributing Python Applications,App Store Compliance,Installing using the command line,Advanced Topics
@anchor{using/mac distributing-python-applications}@anchor{2297}@anchor{using/mac distributing-python-applications-on-the-mac}@anchor{2298}
@subsubsection Distributing Python Applications


A range of tools exist for converting your Python code into a standalone
distributable application:


@itemize *

@item 
py2app@footnote{https://pypi.org/project/py2app/}: Supports creating macOS @code{.app}
bundles from a Python project.

@item 
Briefcase@footnote{https://briefcase.readthedocs.io}: Part of the BeeWare Project@footnote{https://beeware.org}; a cross-platform packaging tool that supports
creation of @code{.app} bundles on macOS, as well as managing signing and
notarization.

@item 
PyInstaller@footnote{https://pyinstaller.org/}: A cross-platform packaging tool that creates
a single file or folder as a distributable artifact.
@end itemize

@node App Store Compliance,,Distributing Python Applications,Advanced Topics
@anchor{using/mac app-store-compliance}@anchor{2299}
@subsubsection App Store Compliance


Apps submitted for distribution through the macOS App Store must pass Apple’s
app review process. This process includes a set of automated validation rules
that inspect the submitted application bundle for problematic code.

The Python standard library contains some code that is known to violate these
automated rules. While these violations appear to be false positives, Apple’s
review rules cannot be challenged. Therefore, it is necessary to modify the
Python standard library for an app to pass App Store review.

The Python source tree contains
a patch file@footnote{https://github.com/python/cpython/tree/3.14/Mac/Resources/app-store-compliance.patch} that will remove
all code that is known to cause issues with the App Store review process. This
patch is applied automatically when CPython is configured with the
@ref{19da,,--with-app-store-compliance} option.

This patch is not normally required to use CPython on a Mac; nor is it required
if you are distributing an app `outside' the macOS App Store. It is `only'
required if you are using the macOS App Store as a distribution channel.

@node Other Resources,,Advanced Topics,Using Python on macOS
@anchor{using/mac other-resources}@anchor{229a}
@subsection Other Resources


The python.org Help page@footnote{https://www.python.org/about/help/} has links to many useful resources.
The Pythonmac-SIG mailing list@footnote{https://www.python.org/community/sigs/current/pythonmac-sig/}
is another support resource specifically for Python users and developers on the Mac.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Using Python on Android,Using Python on iOS,Using Python on macOS,Python Setup and Usage
@anchor{using/android doc}@anchor{229b}@anchor{using/android translation-repo}@anchor{229c}@anchor{using/android using-android}@anchor{229d}@anchor{using/android using-python-on-android}@anchor{229e}
@section Using Python on Android


Python on Android is unlike Python on desktop platforms. On a desktop platform,
Python is generally installed as a system resource that can be used by any user
of that computer. Users then interact with Python by running a @code{python}
executable and entering commands at an interactive prompt, or by running a
Python script.

On Android, there is no concept of installing as a system resource. The only unit
of software distribution is an “app”. There is also no console where you could
run a @code{python} executable, or interact with a Python REPL.

As a result, the only way you can use Python on Android is in embedded mode – that
is, by writing a native Android application, embedding a Python interpreter
using @code{libpython}, and invoking Python code using the @ref{229f,,Python embedding API}. The full Python interpreter, the standard library, and all
your Python code is then packaged into your app for its own private use.

The Python standard library has some notable omissions and restrictions on
Android. See the @ref{22a0,,API availability guide} for
details.

@menu
* Adding Python to an Android app:: 
* Building a Python package for Android:: 

@end menu

@node Adding Python to an Android app,Building a Python package for Android,,Using Python on Android
@anchor{using/android adding-python-to-an-android-app}@anchor{22a1}
@subsection Adding Python to an Android app


Most app developers should use one of the following tools, which will provide a
much easier experience:


@itemize *

@item 
Briefcase@footnote{https://briefcase.beeware.org}, from the BeeWare project

@item 
Buildozer@footnote{https://buildozer.readthedocs.io}, from the Kivy project

@item 
Chaquopy@footnote{https://chaquo.com/chaquopy}

@item 
pyqtdeploy@footnote{https://www.riverbankcomputing.com/static/Docs/pyqtdeploy/}

@item 
Termux@footnote{https://termux.dev/en/}
@end itemize

If you’re sure you want to do all of this manually, read on. You can use the
testbed app@footnote{https://github.com/python/cpython/tree/3.14/Android/testbed} as a guide; each step below contains a
link to the relevant file.


@itemize *

@item 
First, acquire a build of Python for Android:


@itemize *

@item 
The easiest way is to download an Android release from python.org@footnote{https://www.python.org/downloads/android/}. The @code{prefix} directory
mentioned below is at the top level of the package.

@item 
Or if you want to build it yourself, follow the instructions in
Android/README.md@footnote{https://github.com/python/cpython/tree/3.14/Android/README.md}. The @code{prefix} directory will be created under
@code{cross-build/@var{HOST}}.
@end itemize

@item 
Add code to your build.gradle@footnote{https://github.com/python/cpython/tree/3.14/Android/testbed/app/build.gradle.kts}
file to copy the following items into your project. All except your own Python
code can be copied from @code{prefix/lib}:


@itemize *

@item 
In your JNI libraries:


@itemize *

@item 
@code{libpython*.*.so}

@item 
@code{lib*_python.so} (external libraries such as OpenSSL)
@end itemize

@item 
In your assets:


@itemize *

@item 
@code{python*.*} (the Python standard library)

@item 
@code{python*.*/site-packages} (your own Python code)
@end itemize
@end itemize

@item 
Add code to your app to extract the assets to the filesystem@footnote{https://github.com/python/cpython/tree/3.14/Android/testbed/app/src/main/java/org/python/testbed/MainActivity.kt}.

@item 
Add code to your app to start Python in embedded mode@footnote{https://github.com/python/cpython/tree/3.14/Android/testbed/app/src/main/c/main_activity.c}. This will need to be C code
called via JNI.
@end itemize

@node Building a Python package for Android,,Adding Python to an Android app,Using Python on Android
@anchor{using/android building-a-python-package-for-android}@anchor{22a2}
@subsection Building a Python package for Android


Python packages can be built for Android as wheels and released on PyPI. The
recommended tool for doing this is cibuildwheel@footnote{https://cibuildwheel.pypa.io/en/stable/platforms/#android}, which automates
all the details of setting up a cross-compilation environment, building the
wheel, and testing it on an emulator.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Using Python on iOS,Editors and IDEs,Using Python on Android,Python Setup and Usage
@anchor{using/ios doc}@anchor{22a3}@anchor{using/ios translation-repo}@anchor{22a4}@anchor{using/ios using-ios}@anchor{22a5}@anchor{using/ios using-python-on-ios}@anchor{22a6}
@section Using Python on iOS


@*Authors: 
Russell Keith-Magee (2024-03)


Python on iOS is unlike Python on desktop platforms. On a desktop platform,
Python is generally installed as a system resource that can be used by any user
of that computer. Users then interact with Python by running a @code{python}
executable and entering commands at an interactive prompt, or by running a
Python script.

On iOS, there is no concept of installing as a system resource. The only unit
of software distribution is an “app”. There is also no console where you could
run a @code{python} executable, or interact with a Python REPL.

As a result, the only way you can use Python on iOS is in embedded mode - that
is, by writing a native iOS application, and embedding a Python interpreter
using @code{libPython}, and invoking Python code using the @ref{229f,,Python embedding API}. The full Python interpreter, the standard library, and all
your Python code is then packaged as a standalone bundle that can be
distributed via the iOS App Store.

If you’re looking to experiment for the first time with writing an iOS app in
Python, projects such as BeeWare@footnote{https://beeware.org} and Kivy@footnote{https://kivy.org} will provide a much more approachable user experience.
These projects manage the complexities associated with getting an iOS project
running, so you only need to deal with the Python code itself.

@menu
* Python at runtime on iOS:: 
* Installing Python on iOS:: 
* App Store Compliance: App Store Compliance<2>. 

@end menu

@node Python at runtime on iOS,Installing Python on iOS,,Using Python on iOS
@anchor{using/ios python-at-runtime-on-ios}@anchor{22a7}
@subsection Python at runtime on iOS


@menu
* iOS version compatibility:: 
* Platform identification:: 
* Standard library availability:: 
* Binary extension modules:: 
* Compiler stub binaries:: 

@end menu

@node iOS version compatibility,Platform identification,,Python at runtime on iOS
@anchor{using/ios ios-version-compatibility}@anchor{22a8}
@subsubsection iOS version compatibility


The minimum supported iOS version is specified at compile time, using the
@ref{2206,,--host} option to @code{configure}. By default, when compiled for iOS,
Python will be compiled with a minimum supported iOS version of 13.0. To use a
different minimum iOS version, provide the version number as part of the
@code{--host} argument - for example,
@code{--host=arm64-apple-ios15.4-simulator} would compile an ARM64 simulator build
with a deployment target of 15.4.

@node Platform identification,Standard library availability,iOS version compatibility,Python at runtime on iOS
@anchor{using/ios platform-identification}@anchor{22a9}
@subsubsection Platform identification


When executing on iOS, @code{sys.platform} will report as @code{ios}. This value will
be returned on an iPhone or iPad, regardless of whether the app is running on
the simulator or a physical device.

Information about the specific runtime environment, including the iOS version,
device model, and whether the device is a simulator, can be obtained using
@ref{22aa,,platform.ios_ver()}. @ref{22ab,,platform.system()} will report @code{iOS} or
@code{iPadOS}, depending on the device.

@ref{1322,,os.uname()} reports kernel-level details; it will report a name of
@code{Darwin}.

@node Standard library availability,Binary extension modules,Platform identification,Python at runtime on iOS
@anchor{using/ios standard-library-availability}@anchor{22ac}
@subsubsection Standard library availability


The Python standard library has some notable omissions and restrictions on
iOS. See the @ref{22a0,,API availability guide for iOS} for
details.

@node Binary extension modules,Compiler stub binaries,Standard library availability,Python at runtime on iOS
@anchor{using/ios binary-extension-modules}@anchor{22ad}
@subsubsection Binary extension modules


One notable difference about iOS as a platform is that App Store distribution
imposes hard requirements on the packaging of an application. One of these
requirements governs how binary extension modules are distributed.

The iOS App Store requires that `all' binary modules in an iOS app must be
dynamic libraries, contained in a framework with appropriate metadata, stored
in the @code{Frameworks} folder of the packaged app. There can be only a single
binary per framework, and there can be no executable binary material outside
the @code{Frameworks} folder.

This conflicts with the usual Python approach for distributing binaries, which
allows a binary extension module to be loaded from any location on
@code{sys.path}. To ensure compliance with App Store policies, an iOS project must
post-process any Python packages, converting @code{.so} binary modules into
individual standalone frameworks with appropriate metadata and signing. For
details on how to perform this post-processing, see the guide for @ref{22ae,,adding Python to your project}.

To help Python discover binaries in their new location, the original @code{.so}
file on @code{sys.path} is replaced with a @code{.fwork} file. This file is a text
file containing the location of the framework binary, relative to the app
bundle. To allow the framework to resolve back to the original location, the
framework must contain a @code{.origin} file that contains the location of the
@code{.fwork} file, relative to the app bundle.

For example, consider the case of an import @code{from foo.bar import _whiz},
where @code{_whiz} is implemented with the binary module
@code{sources/foo/bar/_whiz.abi3.so}, with @code{sources} being the location
registered on @code{sys.path}, relative to the application bundle. This module
`must' be distributed as @code{Frameworks/foo.bar._whiz.framework/foo.bar._whiz}
(creating the framework name from the full import path of the module), with an
@code{Info.plist} file in the @code{.framework} directory identifying the binary as a
framework. The @code{foo.bar._whiz} module would be represented in the original
location with a @code{sources/foo/bar/_whiz.abi3.fwork} marker file, containing
the path @code{Frameworks/foo.bar._whiz/foo.bar._whiz}. The framework would also
contain @code{Frameworks/foo.bar._whiz.framework/foo.bar._whiz.origin}, containing
the path to the @code{.fwork} file.

When running on iOS, the Python interpreter will install an
@ref{22af,,AppleFrameworkLoader} that is able to read and
import @code{.fwork} files. Once imported, the @code{__file__} attribute of the
binary module will report as the location of the @code{.fwork} file. However, the
@ref{22b0,,ModuleSpec} for the loaded module will report the
@code{origin} as the location of the binary in the framework folder.

@node Compiler stub binaries,,Binary extension modules,Python at runtime on iOS
@anchor{using/ios compiler-stub-binaries}@anchor{22b1}
@subsubsection Compiler stub binaries


Xcode doesn’t expose explicit compilers for iOS; instead, it uses an @code{xcrun}
script that resolves to a full compiler path (e.g., @code{xcrun --sdk iphoneos
clang} to get the @code{clang} for an iPhone device). However, using this script
poses two problems:


@itemize *

@item 
The output of @code{xcrun} includes paths that are machine specific, resulting
in a sysconfig module that cannot be shared between users; and

@item 
It results in @code{CC}/@code{CPP}/@code{LD}/@code{AR} definitions that include spaces.
There is a lot of C ecosystem tooling that assumes that you can split a
command line at the first space to get the path to the compiler executable;
this isn’t the case when using @code{xcrun}.
@end itemize

To avoid these problems, Python provided stubs for these tools. These stubs are
shell script wrappers around the underingly @code{xcrun} tools, distributed in a
@code{bin} folder distributed alongside the compiled iOS framework. These scripts
are relocatable, and will always resolve to the appropriate local system paths.
By including these scripts in the bin folder that accompanies a framework, the
contents of the @code{sysconfig} module becomes useful for end-users to compile
their own modules. When compiling third-party Python modules for iOS, you
should ensure these stub binaries are on your path.

@node Installing Python on iOS,App Store Compliance<2>,Python at runtime on iOS,Using Python on iOS
@anchor{using/ios installing-python-on-ios}@anchor{22b2}
@subsection Installing Python on iOS


@menu
* Tools for building iOS apps:: 
* Adding Python to an iOS project:: 
* Testing a Python package:: 

@end menu

@node Tools for building iOS apps,Adding Python to an iOS project,,Installing Python on iOS
@anchor{using/ios tools-for-building-ios-apps}@anchor{22b3}
@subsubsection Tools for building iOS apps


Building for iOS requires the use of Apple’s Xcode tooling. It is strongly
recommended that you use the most recent stable release of Xcode. This will
require the use of the most (or second-most) recently released macOS version,
as Apple does not maintain Xcode for older macOS versions. The Xcode Command
Line Tools are not sufficient for iOS development; you need a `full' Xcode
install.

If you want to run your code on the iOS simulator, you’ll also need to install
an iOS Simulator Platform. You should be prompted to select an iOS Simulator
Platform when you first run Xcode. Alternatively, you can add an iOS Simulator
Platform by selecting from the Platforms tab of the Xcode Settings panel.

@node Adding Python to an iOS project,Testing a Python package,Tools for building iOS apps,Installing Python on iOS
@anchor{using/ios adding-ios}@anchor{22ae}@anchor{using/ios adding-python-to-an-ios-project}@anchor{22b4}
@subsubsection Adding Python to an iOS project


Python can be added to any iOS project, using either Swift or Objective C. The
following examples will use Objective C; if you are using Swift, you may find a
library like PythonKit@footnote{https://github.com/pvieito/PythonKit} to be
helpful.

To add Python to an iOS Xcode project:


@enumerate 

@item 
Build or obtain a Python @code{XCFramework}. See the instructions in
Apple/iOS/README.md@footnote{https://github.com/python/cpython/tree/3.14/Apple/iOS/README.md} (in the CPython source distribution) for details on
how to build a Python @code{XCFramework}. At a minimum, you will need a build
that supports @code{arm64-apple-ios}, plus one of either
@code{arm64-apple-ios-simulator} or @code{x86_64-apple-ios-simulator}.

@item 
Drag the @code{XCframework} into your iOS project. In the following
instructions, we’ll assume you’ve dropped the @code{XCframework} into the root
of your project; however, you can use any other location that you want by
adjusting paths as needed.

@item 
Add your application code as a folder in your Xcode project. In the
following instructions, we’ll assume that your user code is in a folder
named @code{app} in the root of your project; you can use any other location by
adjusting paths as needed. Ensure that this folder is associated with your
app target.

@item 
Select the app target by selecting the root node of your Xcode project, then
the target name in the sidebar that appears.

@item 
In the “General” settings, under “Frameworks, Libraries and Embedded
Content”, add @code{Python.xcframework}, with “Embed & Sign” selected.

@item 
In the “Build Settings” tab, modify the following:


@itemize -

@item 
Build Options


@itemize *

@item 
User Script Sandboxing: No

@item 
Enable Testability: Yes
@end itemize

@item 
Search Paths


@itemize *

@item 
Framework Search Paths: @code{$(PROJECT_DIR)}

@item 
Header Search Paths: @code{"$(BUILT_PRODUCTS_DIR)/Python.framework/Headers"}
@end itemize

@item 
Apple Clang - Warnings - All languages


@itemize *

@item 
Quoted Include In Framework Header: No
@end itemize
@end itemize

@item 
Add a build step that processes the Python standard library, and your own
Python binary dependencies. In the “Build Phases” tab, add a new “Run
Script” build step `before' the “Embed Frameworks” step, but `after' the
“Copy Bundle Resources” step. Name the step “Process Python libraries”,
disable the “Based on dependency analysis” checkbox, and set the script
content to:

@example
set -e
source $PROJECT_DIR/Python.xcframework/build/build_utils.sh
install_python Python.xcframework app
@end example

If you have placed your XCframework somewhere other than the root of your
project, modify the path to the first argument.

@item 
Add Objective C code to initialize and use a Python interpreter in embedded
mode. You should ensure that:


@itemize *

@item 
UTF-8 mode (@ref{41b,,PyPreConfig.utf8_mode}) is `enabled';

@item 
Buffered stdio (@ref{40f,,PyConfig.buffered_stdio}) is `disabled';

@item 
Writing bytecode (@ref{40b,,PyConfig.write_bytecode}) is `disabled';

@item 
Signal handlers (@ref{ac1,,PyConfig.install_signal_handlers}) are `enabled';

@item 
System logging (@ref{22b5,,PyConfig.use_system_logger}) is `enabled'
(optional, but strongly recommended; this is enabled by default);

@item 
@geindex PYTHONHOME
@geindex environment variable; PYTHONHOME
@ref{3ee,,PYTHONHOME} for the interpreter is configured to point at the
@code{python} subfolder of your app’s bundle; and

@item 
The 
@geindex PYTHONPATH
@geindex environment variable; PYTHONPATH
@ref{1223,,PYTHONPATH} for the interpreter includes:


@itemize -

@item 
the @code{python/lib/python3.X} subfolder of your app’s bundle,

@item 
the @code{python/lib/python3.X/lib-dynload} subfolder of your app’s bundle, and

@item 
the @code{app} subfolder of your app’s bundle
@end itemize
@end itemize

Your app’s bundle location can be determined using @code{[[NSBundle mainBundle]
resourcePath]}.
@end enumerate

Steps 7 and 8 of these instructions assume that you have a single folder of
pure Python application code, named @code{app}. If you have third-party binary
modules in your app, some additional steps will be required:


@itemize *

@item 
You need to ensure that any folders containing third-party binaries are
either associated with the app target, or are explicitly copied as part of
step 7. Step 7 should also purge any binaries that are not appropriate for
the platform a specific build is targeting (i.e., delete any device binaries
if you’re building an app targeting the simulator).

@item 
If you’re using a separate folder for third-party packages, ensure that
folder is added to the end of the call to @code{install_python} in step 7, and
as part of the 
@geindex PYTHONPATH
@geindex environment variable; PYTHONPATH
@ref{1223,,PYTHONPATH} configuration in step 8.

@item 
If any of the folders that contain third-party packages will contain @code{.pth}
files, you should add that folder as a `site directory' (using
@ref{22b6,,site.addsitedir()}), rather than adding to 
@geindex PYTHONPATH
@geindex environment variable; PYTHONPATH
@ref{1223,,PYTHONPATH} or
@ref{3e2,,sys.path} directly.
@end itemize

@node Testing a Python package,,Adding Python to an iOS project,Installing Python on iOS
@anchor{using/ios testing-a-python-package}@anchor{22b7}
@subsubsection Testing a Python package


The CPython source tree contains a testbed project@footnote{https://github.com/python/cpython/tree/3.14/Apple/iOS/testbed} that
is used to run the CPython test suite on the iOS simulator. This testbed can also
be used as a testbed project for running your Python library’s test suite on iOS.

After building or obtaining an iOS XCFramework (see Apple/iOS/README.md@footnote{https://github.com/python/cpython/tree/3.14/Apple/iOS/README.md}
for details), create a clone of the Python iOS testbed project. If you used the
@code{Apple} build script to build the XCframework, you can run:

@example
$ python cross-build/iOS/testbed clone --app <path/to/module1> --app <path/to/module2> app-testbed
@end example

Or, if you’ve sourced your own XCframework, by running:

@example
$ python Apple/testbed clone --platform iOS --framework <path/to/Python.xcframework> --app <path/to/module1> --app <path/to/module2> app-testbed
@end example

Any folders specified with the @code{--app} flag will be copied into the cloned
testbed project. The resulting testbed will be created in the @code{app-testbed}
folder. In this example, the @code{module1} and @code{module2} would be importable
modules at runtime. If your project has additional dependencies, they can be
installed into the @code{app-testbed/Testbed/app_packages} folder (using @code{pip
install --target app-testbed/Testbed/app_packages} or similar).

You can then use the @code{app-testbed} folder to run the test suite for your app,
For example, if @code{module1.tests} was the entry point to your test suite, you
could run:

@example
$ python app-testbed run -- module1.tests
@end example

This is the equivalent of running @code{python -m module1.tests} on a desktop
Python build. Any arguments after the @code{--} will be passed to the testbed as
if they were arguments to @code{python -m} on a desktop machine.

You can also open the testbed project in Xcode by running:

@example
$ open app-testbed/iOSTestbed.xcodeproj
@end example

This will allow you to use the full Xcode suite of tools for debugging.

The arguments used to run the test suite are defined as part of the test plan.
To modify the test plan, select the test plan node of the project tree (it
should be the first child of the root node), and select the “Configurations”
tab. Modify the “Arguments Passed On Launch” value to change the testing
arguments.

The test plan also disables parallel testing, and specifies the use of the
@code{Testbed.lldbinit} file for providing configuration of the debugger. The
default debugger configuration disables automatic breakpoints on the
@code{SIGINT}, @code{SIGUSR1}, @code{SIGUSR2}, and @code{SIGXFSZ} signals.

@node App Store Compliance<2>,,Installing Python on iOS,Using Python on iOS
@anchor{using/ios app-store-compliance}@anchor{22b8}
@subsection App Store Compliance


The only mechanism for distributing apps to third-party iOS devices is to
submit the app to the iOS App Store; apps submitted for distribution must pass
Apple’s app review process. This process includes a set of automated validation
rules that inspect the submitted application bundle for problematic code. There
are some steps that must be taken to ensure that your app will be able to pass
these validation steps.

@menu
* Incompatible code in the standard library:: 
* Privacy manifests:: 

@end menu

@node Incompatible code in the standard library,Privacy manifests,,App Store Compliance<2>
@anchor{using/ios incompatible-code-in-the-standard-library}@anchor{22b9}
@subsubsection Incompatible code in the standard library


The Python standard library contains some code that is known to violate these
automated rules. While these violations appear to be false positives, Apple’s
review rules cannot be challenged; so, it is necessary to modify the Python
standard library for an app to pass App Store review.

The Python source tree contains
a patch file@footnote{https://github.com/python/cpython/tree/3.14/Mac/Resources/app-store-compliance.patch} that will remove
all code that is known to cause issues with the App Store review process. This
patch is applied automatically when building for iOS.

@node Privacy manifests,,Incompatible code in the standard library,App Store Compliance<2>
@anchor{using/ios privacy-manifests}@anchor{22ba}
@subsubsection Privacy manifests


In April 2025, Apple introduced a requirement for certain third-party libraries to provide a Privacy Manifest@footnote{https://developer.apple.com/support/third-party-SDK-requirements}.
As a result, if you have a binary module that uses one of the affected
libraries, you must provide an @code{.xcprivacy} file for that library.
OpenSSL is one library affected by this requirement, but there are others.

If you produce a binary module named @code{mymodule.so}, and use you the Xcode
build script described in step 7 above, you can place a @code{mymodule.xcprivacy}
file next to @code{mymodule.so}, and the privacy manifest will be installed into
the required location when the binary module is converted into a framework.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Editors and IDEs,,Using Python on iOS,Python Setup and Usage
@anchor{using/editors doc}@anchor{22bb}@anchor{using/editors editors}@anchor{228c}@anchor{using/editors editors-and-ides}@anchor{22bc}@anchor{using/editors translation-repo}@anchor{22bd}
@section Editors and IDEs


There are a number of IDEs that support Python programming language.
Many editors and IDEs provide syntax highlighting, debugging tools, and 
@geindex Python Enhancement Proposals; PEP 8
PEP 8@footnote{https://peps.python.org/pep-0008/} checks.

@menu
* IDLE — Python editor and shell:: 
* Other Editors and IDEs:: 

@end menu

@node IDLE — Python editor and shell,Other Editors and IDEs,,Editors and IDEs
@anchor{using/editors idle-python-editor-and-shell}@anchor{22be}
@subsection IDLE — Python editor and shell


IDLE is Python’s Integrated Development and Learning Environment and is generally bundled with Python installs.
If you are on Linux and do not have IDLE installed see @ref{218b,,Installing IDLE on Linux}.
For more information see the @ref{121b,,IDLE docs}.

@node Other Editors and IDEs,,IDLE — Python editor and shell,Editors and IDEs
@anchor{using/editors other-editors-and-ides}@anchor{22bf}
@subsection Other Editors and IDEs


Python’s community wiki has information submitted by the community on Editors and IDEs.
Please go to Python Editors@footnote{https://wiki.python.org/moin/PythonEditors} and
Integrated Development Environments@footnote{https://wiki.python.org/moin/IntegratedDevelopmentEnvironments}
for a comprehensive list.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node The Python Language Reference,The Python Standard Library,Python Setup and Usage,Top
@anchor{reference/index doc}@anchor{22c0}@anchor{reference/index reference-index}@anchor{14b}@anchor{reference/index the-python-language-reference}@anchor{22c1}@anchor{reference/index translation-repo}@anchor{22c2}
@chapter The Python Language Reference


This reference manual describes the syntax and “core semantics” of the
language. It is terse, but attempts to be exact and complete. The semantics of
non-essential built-in object types and of the built-in functions and modules
are described in @ref{14a,,The Python Standard Library}. For an informal introduction to the
language, see @ref{1ffe,,The Python Tutorial}. For C or C++ programmers, two additional
manuals exist: @ref{1fff,,Extending and Embedding the Python Interpreter} describes the high-level picture of how to
write a Python extension module, and the @ref{2000,,Python/C API reference manual} describes the
interfaces available to C/C++ programmers in detail.

@menu
* Introduction: Introduction<5>. 
* Lexical analysis:: 
* Data model:: 
* Execution model:: 
* The import system:: 
* Expressions:: 
* Simple statements:: 
* Compound statements:: 
* Top-level components:: 
* Full Grammar specification:: 

@end menu

@node Introduction<5>,Lexical analysis,,The Python Language Reference
@anchor{reference/introduction doc}@anchor{22c3}@anchor{reference/introduction id1}@anchor{22c4}@anchor{reference/introduction introduction}@anchor{22c5}
@section Introduction


This reference manual describes the Python programming language. It is not
intended as a tutorial.

While I am trying to be as precise as possible, I chose to use English rather
than formal specifications for everything except syntax and lexical analysis.
This should make the document more understandable to the average reader, but
will leave room for ambiguities. Consequently, if you were coming from Mars and
tried to re-implement Python from this document alone, you might have to guess
things and in fact you would probably end up implementing quite a different
language. On the other hand, if you are using Python and wonder what the precise
rules about a particular area of the language are, you should definitely be able
to find them here. If you would like to see a more formal definition of the
language, maybe you could volunteer your time — or invent a cloning machine
:-).

It is dangerous to add too many implementation details to a language reference
document — the implementation may change, and other implementations of the
same language may work differently.  On the other hand, CPython is the one
Python implementation in widespread use (although alternate implementations
continue to gain support), and its particular quirks are sometimes worth being
mentioned, especially where the implementation imposes additional limitations.
Therefore, you’ll find short “implementation notes” sprinkled throughout the
text.

Every Python implementation comes with a number of built-in and standard
modules.  These are documented in @ref{14a,,The Python Standard Library}.  A few built-in modules
are mentioned when they interact in a significant way with the language
definition.

@menu
* Alternate Implementations:: 
* Notation:: 

@end menu

@node Alternate Implementations,Notation,,Introduction<5>
@anchor{reference/introduction alternate-implementations}@anchor{22c6}@anchor{reference/introduction implementations}@anchor{215b}
@subsection Alternate Implementations


Though there is one Python implementation which is by far the most popular,
there are some alternate implementations which are of particular interest to
different audiences.

Known implementations include:


@table @asis

@item CPython

This is the original and most-maintained implementation of Python, written in C.
New language features generally appear here first.

@item Jython

Python implemented in Java.  This implementation can be used as a scripting
language for Java applications, or can be used to create applications using the
Java class libraries.  It is also often used to create tests for Java libraries.
More information can be found at the Jython website@footnote{https://www.jython.org/}.

@item Python for .NET

This implementation actually uses the CPython implementation, but is a managed
.NET application and makes .NET libraries available.  It was created by Brian
Lloyd.  For more information, see the Python for .NET home page@footnote{https://pythonnet.github.io/}.

@item IronPython

An alternate Python for .NET.  Unlike Python.NET, this is a complete Python
implementation that generates IL, and compiles Python code directly to .NET
assemblies.  It was created by Jim Hugunin, the original creator of Jython.  For
more information, see the IronPython website@footnote{https://ironpython.net/}.

@item PyPy

An implementation of Python written completely in Python. It supports several
advanced features not found in other implementations like stackless support
and a Just in Time compiler. One of the goals of the project is to encourage
experimentation with the language itself by making it easier to modify the
interpreter (since it is written in Python).  Additional information is
available on the PyPy project's home page@footnote{https://pypy.org/}.
@end table

Each of these implementations varies in some way from the language as documented
in this manual, or introduces specific information beyond what’s covered in the
standard Python documentation.  Please refer to the implementation-specific
documentation to determine what else you need to know about the specific
implementation you’re using.

@node Notation,,Alternate Implementations,Introduction<5>
@anchor{reference/introduction id2}@anchor{22c7}@anchor{reference/introduction notation}@anchor{22c8}
@subsection Notation


@geindex BNF
@geindex grammar
@geindex syntax
@geindex notation

The descriptions of lexical analysis and syntax use a grammar notation that
is a mixture of
EBNF@footnote{https://en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_form}
and PEG@footnote{https://en.wikipedia.org/wiki/Parsing_expression_grammar}.
For example:

@example
@anchor{reference/introduction grammar-token-notation-name}@anchor{22c9}name:   @ref{22ca,,letter} (@ref{22ca,,letter} | @ref{22cb,,digit} | "_")*
@anchor{reference/introduction grammar-token-notation-letter}@anchor{22ca}letter: "a"..."z" | "A"..."Z"
@anchor{reference/introduction grammar-token-notation-digit}@anchor{22cb}digit:  "0"..."9"
@end example

In this example, the first line says that a @code{name} is a @code{letter} followed
by a sequence of zero or more @code{letter}s, @code{digit}s, and underscores.
A @code{letter} in turn is any of the single characters @code{'a'} through
@code{'z'} and @code{A} through @code{Z}; a @code{digit} is a single character from @code{0}
to @code{9}.

Each rule begins with a name (which identifies the rule that’s being defined)
followed by a colon, @code{:}.
The definition to the right of the colon uses the following syntax elements:


@itemize *

@item 
@code{name}: A name refers to another rule.
Where possible, it is a link to the rule’s definition.


@itemize *

@item 
@code{TOKEN}: An uppercase name refers to a @ref{22cc,,token}.
For the purposes of grammar definitions, tokens are the same as rules.
@end itemize

@item 
@code{"text"}, @code{'text'}: Text in single or double quotes must match literally
(without the quotes). The type of quote is chosen according to the meaning
of @code{text}:


@itemize *

@item 
@code{'if'}: A name in single quotes denotes a @ref{22cd,,keyword}.

@item 
@code{"case"}: A name in double quotes denotes a
@ref{a13,,soft-keyword}.

@item 
@code{'@@'}: A non-letter symbol in single quotes denotes an
@ref{22ce,,OP} token, that is, a @ref{22cf,,delimiter} or
@ref{22d0,,operator}.
@end itemize

@item 
@code{e1 e2}: Items separated only by whitespace denote a sequence.
Here, @code{e1} must be followed by @code{e2}.

@item 
@code{e1 | e2}: A vertical bar is used to separate alternatives.
It denotes PEG’s “ordered choice”: if @code{e1} matches, @code{e2} is
not considered.
In traditional PEG grammars, this is written as a slash, @code{/}, rather than
a vertical bar.
See 
@geindex Python Enhancement Proposals; PEP 617
PEP 617@footnote{https://peps.python.org/pep-0617/} for more background and details.

@item 
@code{e*}: A star means zero or more repetitions of the preceding item.

@item 
@code{e+}: Likewise, a plus means one or more repetitions.

@item 
@code{[e]}: A phrase enclosed in square brackets means zero or
one occurrences. In other words, the enclosed phrase is optional.

@item 
@code{e?}: A question mark has exactly the same meaning as square brackets:
the preceding item is optional.

@item 
@code{(e)}: Parentheses are used for grouping.
@end itemize

The following notation is only used in
@ref{22d1,,lexical definitions}.


@itemize *

@item 
@code{"a"..."z"}: Two literal characters separated by three dots mean a choice
of any single character in the given (inclusive) range of ASCII characters.

@item 
@code{<...>}: A phrase between angular brackets gives an informal description
of the matched symbol (for example, @code{<any ASCII character except "\">}),
or an abbreviation that is defined in nearby text (for example, @code{<Lu>}).
@end itemize
@anchor{reference/introduction lexical-lookaheads}@anchor{22d2}
Some definitions also use `lookaheads', which indicate that an element
must (or must not) match at a given position, but without consuming any input:


@itemize *

@item 
@code{&e}: a positive lookahead (that is, @code{e} is required to match)

@item 
@code{!e}: a negative lookahead (that is, @code{e} is required `not' to match)
@end itemize

The unary operators (@code{*}, @code{+}, @code{?}) bind as tightly as possible;
the vertical bar (@code{|}) binds most loosely.

White space is only meaningful to separate tokens.

Rules are normally contained on a single line, but rules that are too long
may be wrapped:

@example
@anchor{reference/introduction grammar-token-notation-literal}@anchor{22d3}literal: stringliteral | bytesliteral
         | integer | floatnumber | imagnumber
@end example

Alternatively, rules may be formatted with the first line ending at the colon,
and each alternative beginning with a vertical bar on a new line.
For example:

@example
@anchor{reference/introduction grammar-token-notation-alt-literal}@anchor{22d4}literal:
   | stringliteral
   | bytesliteral
   | integer
   | floatnumber
   | imagnumber
@end example

This does `not' mean that there is an empty first alternative.

@geindex lexical definitions

@menu
* Lexical and Syntactic definitions:: 

@end menu

@node Lexical and Syntactic definitions,,,Notation
@anchor{reference/introduction lexical-and-syntactic-definitions}@anchor{22d5}@anchor{reference/introduction notation-lexical-vs-syntactic}@anchor{22d1}
@subsubsection Lexical and Syntactic definitions


There is some difference between `lexical' and `syntactic' analysis:
the @ref{22d6,,lexical analyzer} operates on the individual characters of the
input source, while the `parser' (syntactic analyzer) operates on the stream
of @ref{22cc,,tokens} generated by the lexical analysis.
However, in some cases the exact boundary between the two phases is a
CPython implementation detail.

The practical difference between the two is that in `lexical' definitions,
all whitespace is significant.
The lexical analyzer @ref{22d7,,discards} all whitespace that is not
converted to tokens like @ref{2140,,token.INDENT} or @ref{22d8,,NEWLINE}.
`Syntactic' definitions then use these tokens, rather than source characters.

This documentation uses the same BNF grammar for both styles of definitions.
All uses of BNF in the next chapter (@ref{22d9,,Lexical analysis}) are lexical definitions;
uses in subsequent chapters are syntactic definitions.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Lexical analysis,Data model,Introduction<5>,The Python Language Reference
@anchor{reference/lexical_analysis doc}@anchor{22da}@anchor{reference/lexical_analysis lexical}@anchor{22d9}@anchor{reference/lexical_analysis lexical-analysis}@anchor{22db}@anchor{reference/lexical_analysis translation-repo}@anchor{22dc}
@section Lexical analysis


@geindex lexical analysis
@geindex parser
@geindex token

A Python program is read by a `parser'.  Input to the parser is a stream of
@ref{22cc,,tokens}, generated by the `lexical analyzer' (also known as
the `tokenizer').
This chapter describes how the lexical analyzer produces these tokens.

The lexical analyzer determines the program text’s @ref{22dd,,encoding}
(UTF-8 by default), and decodes the text into
@ref{22de,,source characters}.
If the text cannot be decoded, a @ref{18f,,SyntaxError} is raised.

Next, the lexical analyzer uses the source characters to generate a stream of tokens.
The type of a generated token generally depends on the next source character to
be processed. Similarly, other special behavior of the analyzer depends on
the first source character that hasn’t yet been processed.
The following table gives a quick summary of these source characters,
with links to sections that contain more information.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Character

@tab

Next token (or other relevant documentation)

@item


@itemize *

@item 
space

@item 
tab

@item 
formfeed
@end itemize

@tab


@itemize *

@item 
@ref{22d7,,Whitespace}
@end itemize

@item


@itemize *

@item 
CR, LF
@end itemize

@tab


@itemize *

@item 
@ref{22df,,New line}

@item 
@ref{22e0,,Indentation}
@end itemize

@item


@itemize *

@item 
backslash (@code{\})
@end itemize

@tab


@itemize *

@item 
@ref{22e1,,Explicit line joining}

@item 
(Also significant in @ref{688,,string escape sequences})
@end itemize

@item


@itemize *

@item 
hash (@code{#})
@end itemize

@tab


@itemize *

@item 
@ref{22e2,,Comment}
@end itemize

@item


@itemize *

@item 
quote (@code{'}, @code{"})
@end itemize

@tab


@itemize *

@item 
@ref{22e3,,String literal}
@end itemize

@item


@itemize *

@item 
ASCII letter (@code{a}-@code{z}, @code{A}-@code{Z})

@item 
non-ASCII character
@end itemize

@tab


@itemize *

@item 
@ref{22e4,,Name}

@item 
Prefixed @ref{22e3,,string or bytes literal}
@end itemize

@item


@itemize *

@item 
underscore (@code{_})
@end itemize

@tab


@itemize *

@item 
@ref{22e4,,Name}

@item 
(Can also be part of @ref{22e5,,numeric literals})
@end itemize

@item


@itemize *

@item 
number (@code{0}-@code{9})
@end itemize

@tab


@itemize *

@item 
@ref{22e5,,Numeric literal}
@end itemize

@item


@itemize *

@item 
dot (@code{.})
@end itemize

@tab


@itemize *

@item 
@ref{22e5,,Numeric literal}

@item 
@ref{22d0,,Operator}
@end itemize

@item


@itemize *

@item 
question mark (@code{?})

@item 
dollar (@code{$})

@item 
@c (the following uses zero-width space characters to render

@c a literal backquote)

backquote (@code{​`​})

@item 
control character
@end itemize

@tab


@itemize *

@item 
Error (outside string literals and comments)
@end itemize

@item


@itemize *

@item 
other printing character
@end itemize

@tab


@itemize *

@item 
@ref{22d0,,Operator or delimiter}
@end itemize

@item


@itemize *

@item 
end of file
@end itemize

@tab


@itemize *

@item 
@ref{22e6,,End marker}
@end itemize

@end multitable


@menu
* Line structure:: 
* Other tokens:: 
* Names (identifiers and keywords): Names identifiers and keywords. 
* Literals:: 
* String and Bytes literals:: 
* Numeric literals:: 
* Operators and delimiters:: 

@end menu

@node Line structure,Other tokens,,Lexical analysis
@anchor{reference/lexical_analysis id1}@anchor{22e7}@anchor{reference/lexical_analysis line-structure}@anchor{22df}
@subsection Line structure


@geindex line structure

A Python program is divided into a number of `logical lines'.

@menu
* Logical lines:: 
* Physical lines:: 
* Comments:: 
* Encoding declarations:: 
* Explicit line joining:: 
* Implicit line joining:: 
* Blank lines:: 
* Indentation:: 
* Whitespace between tokens:: 
* End marker:: 

@end menu

@node Logical lines,Physical lines,,Line structure
@anchor{reference/lexical_analysis id2}@anchor{22e8}@anchor{reference/lexical_analysis logical-lines}@anchor{22e9}
@subsubsection Logical lines


@geindex logical line
@geindex physical line
@geindex line joining
@geindex NEWLINE token

The end of a logical line is represented by the token @ref{22d8,,NEWLINE}.
Statements cannot cross logical line boundaries except where @code{NEWLINE}
is allowed by the syntax (e.g., between statements in compound statements).
A logical line is constructed from one or more `physical lines' by following
the @ref{22e1,,explicit} or @ref{22ea,,implicit}
`line joining' rules.

@node Physical lines,Comments,Logical lines,Line structure
@anchor{reference/lexical_analysis id3}@anchor{22eb}@anchor{reference/lexical_analysis physical-lines}@anchor{22ec}
@subsubsection Physical lines


A physical line is a sequence of characters terminated by one the following
end-of-line sequences:


@itemize *

@item 
the Unix form using ASCII LF (linefeed),

@item 
the Windows form using the ASCII sequence CR LF (return followed by linefeed),

@item 
the ‘Classic Mac OS@footnote{https://en.wikipedia.org/wiki/Classic_Mac_OS}’ form using the ASCII CR (return) character.
@end itemize

Regardless of platform, each of these sequences is replaced by a single
ASCII LF (linefeed) character.
(This is done even inside @ref{22e3,,string literals}.)
Each line can use any of the sequences; they do not need to be consistent
within a file.

The end of input also serves as an implicit terminator for the final
physical line.

Formally:

@example
@anchor{reference/lexical_analysis grammar-token-python-grammar-newline}@anchor{22ed}newline: <ASCII LF> | <ASCII CR> <ASCII LF> | <ASCII CR>
@end example

@node Comments,Encoding declarations,Physical lines,Line structure
@anchor{reference/lexical_analysis comments}@anchor{22e2}@anchor{reference/lexical_analysis id5}@anchor{22ee}
@subsubsection Comments


@geindex comment
@geindex hash character
@geindex # (hash); comment

A comment starts with a hash character (@code{#}) that is not part of a string
literal, and ends at the end of the physical line.  A comment signifies the end
of the logical line unless the implicit line joining rules are invoked. Comments
are ignored by the syntax.

@node Encoding declarations,Explicit line joining,Comments,Line structure
@anchor{reference/lexical_analysis encoding-declarations}@anchor{22ef}@anchor{reference/lexical_analysis encodings}@anchor{22dd}
@subsubsection Encoding declarations


@geindex source character set
@geindex encoding declarations (source file)
@geindex # (hash); source encoding declaration

If a comment in the first or second line of the Python script matches the
regular expression @code{coding[=:]\s*([-\w.]+)}, this comment is processed as an
encoding declaration; the first group of this expression names the encoding of
the source code file. The encoding declaration must appear on a line of its
own. If it is the second line, the first line must also be a comment-only line.
The recommended forms of an encoding expression are

@example
# -*- coding: <encoding-name> -*-
@end example

which is recognized also by GNU Emacs, and

@example
# vim:fileencoding=<encoding-name>
@end example

which is recognized by Bram Moolenaar’s VIM.

If no encoding declaration is found, the default encoding is UTF-8.  If the
implicit or explicit encoding of a file is UTF-8, an initial UTF-8 byte-order
mark (@code{b'\xef\xbb\xbf'}) is ignored rather than being a syntax error.

If an encoding is declared, the encoding name must be recognized by Python
(see @ref{fbe,,Standard Encodings}). The
encoding is used for all lexical analysis, including string literals, comments
and identifiers.
@anchor{reference/lexical_analysis lexical-source-character}@anchor{22de}
All lexical analysis, including string literals, comments
and identifiers, works on Unicode text decoded using the source encoding.
Any Unicode code point, except the NUL control character, can appear in
Python source.

@example
@anchor{reference/lexical_analysis grammar-token-python-grammar-source_character}@anchor{22f0}source_character:  <any Unicode code point, except NUL>
@end example

@node Explicit line joining,Implicit line joining,Encoding declarations,Line structure
@anchor{reference/lexical_analysis explicit-joining}@anchor{22e1}@anchor{reference/lexical_analysis explicit-line-joining}@anchor{22f1}
@subsubsection Explicit line joining


@geindex physical line
@geindex line joining
@geindex line continuation
@geindex backslash character

Two or more physical lines may be joined into logical lines using backslash
characters (@code{\}), as follows: when a physical line ends in a backslash that is
not part of a string literal or comment, it is joined with the following forming
a single logical line, deleting the backslash and the following end-of-line
character.  For example:

@example
if 1900 < year < 2100 and 1 <= month <= 12 \
   and 1 <= day <= 31 and 0 <= hour < 24 \
   and 0 <= minute < 60 and 0 <= second < 60:   # Looks like a valid date
        return 1
@end example

A line ending in a backslash cannot carry a comment.  A backslash does not
continue a comment.  A backslash does not continue a token except for string
literals (i.e., tokens other than string literals cannot be split across
physical lines using a backslash).  A backslash is illegal elsewhere on a line
outside a string literal.

@node Implicit line joining,Blank lines,Explicit line joining,Line structure
@anchor{reference/lexical_analysis implicit-joining}@anchor{22ea}@anchor{reference/lexical_analysis implicit-line-joining}@anchor{22f2}
@subsubsection Implicit line joining


Expressions in parentheses, square brackets or curly braces can be split over
more than one physical line without using backslashes. For example:

@example
month_names = ['Januari', 'Februari', 'Maart',      # These are the
               'April',   'Mei',      'Juni',       # Dutch names
               'Juli',    'Augustus', 'September',  # for the months
               'Oktober', 'November', 'December']   # of the year
@end example

Implicitly continued lines can carry comments.  The indentation of the
continuation lines is not important.  Blank continuation lines are allowed.
There is no NEWLINE token between implicit continuation lines.  Implicitly
continued lines can also occur within triple-quoted strings (see below); in that
case they cannot carry comments.

@node Blank lines,Indentation,Implicit line joining,Line structure
@anchor{reference/lexical_analysis blank-lines}@anchor{22f3}@anchor{reference/lexical_analysis id6}@anchor{22f4}
@subsubsection Blank lines


@geindex blank line

A logical line that contains only spaces, tabs, formfeeds and possibly a
comment, is ignored (i.e., no @ref{22d8,,NEWLINE} token is generated).
During interactive input of statements, handling of a blank line may differ
depending on the implementation of the read-eval-print loop.
In the standard interactive interpreter, an entirely blank logical line (that
is, one containing not even whitespace or a comment) terminates a multi-line
statement.

@node Indentation,Whitespace between tokens,Blank lines,Line structure
@anchor{reference/lexical_analysis id7}@anchor{22f5}@anchor{reference/lexical_analysis indentation}@anchor{22e0}
@subsubsection Indentation


@geindex indentation
@geindex leading whitespace
@geindex space
@geindex tab
@geindex grouping
@geindex statement grouping

Leading whitespace (spaces and tabs) at the beginning of a logical line is used
to compute the indentation level of the line, which in turn is used to determine
the grouping of statements.

Tabs are replaced (from left to right) by one to eight spaces such that the
total number of characters up to and including the replacement is a multiple of
eight (this is intended to be the same rule as used by Unix).  The total number
of spaces preceding the first non-blank character then determines the line’s
indentation.  Indentation cannot be split over multiple physical lines using
backslashes; the whitespace up to the first backslash determines the
indentation.

Indentation is rejected as inconsistent if a source file mixes tabs and spaces
in a way that makes the meaning dependent on the worth of a tab in spaces; a
@ref{766,,TabError} is raised in that case.

`Cross-platform compatibility note:' because of the nature of text editors on
non-UNIX platforms, it is unwise to use a mixture of spaces and tabs for the
indentation in a single source file.  It should also be noted that different
platforms may explicitly limit the maximum indentation level.

A formfeed character may be present at the start of the line; it will be ignored
for the indentation calculations above.  Formfeed characters occurring elsewhere
in the leading whitespace have an undefined effect (for instance, they may reset
the space count to zero).

@geindex INDENT token
@geindex DEDENT token

The indentation levels of consecutive lines are used to generate
@ref{2140,,INDENT} and @ref{22f6,,DEDENT} tokens, using a stack,
as follows.

Before the first line of the file is read, a single zero is pushed on the stack;
this will never be popped off again.  The numbers pushed on the stack will
always be strictly increasing from bottom to top.  At the beginning of each
logical line, the line’s indentation level is compared to the top of the stack.
If it is equal, nothing happens. If it is larger, it is pushed on the stack, and
one @code{INDENT} token is generated.  If it is smaller, it `must' be one of the
numbers occurring on the stack; all numbers on the stack that are larger are
popped off, and for each number popped off a @code{DEDENT} token is generated.
At the end of the file, a @code{DEDENT} token is generated for each number
remaining on the stack that is larger than zero.

Here is an example of a correctly (though confusingly) indented piece of Python
code:

@example
def perm(l):
        # Compute the list of all permutations of l
    if len(l) <= 1:
                  return [l]
    r = []
    for i in range(len(l)):
             s = l[:i] + l[i+1:]
             p = perm(s)
             for x in p:
              r.append(l[i:i+1] + x)
    return r
@end example

The following example shows various indentation errors:

@example
 def perm(l):                       # error: first line indented
for i in range(len(l)):             # error: not indented
    s = l[:i] + l[i+1:]
        p = perm(l[:i] + l[i+1:])   # error: unexpected indent
        for x in p:
                r.append(l[i:i+1] + x)
            return r                # error: inconsistent dedent
@end example

(Actually, the first three errors are detected by the parser; only the last
error is found by the lexical analyzer — the indentation of @code{return r} does
not match a level popped off the stack.)

@node Whitespace between tokens,End marker,Indentation,Line structure
@anchor{reference/lexical_analysis whitespace}@anchor{22d7}@anchor{reference/lexical_analysis whitespace-between-tokens}@anchor{22f7}
@subsubsection Whitespace between tokens


Except at the beginning of a logical line or in string literals, the whitespace
characters space, tab and formfeed can be used interchangeably to separate
tokens:

@example
@anchor{reference/lexical_analysis grammar-token-python-grammar-whitespace}@anchor{22f8}whitespace:  ' ' | tab | formfeed
@end example

Whitespace is needed between two tokens only if their concatenation
could otherwise be interpreted as a different token. For example, @code{ab} is one
token, but @code{a b} is two tokens. However, @code{+a} and @code{+ a} both produce
two tokens, @code{+} and @code{a}, as @code{+a} is not a valid token.

@node End marker,,Whitespace between tokens,Line structure
@anchor{reference/lexical_analysis end-marker}@anchor{22f9}@anchor{reference/lexical_analysis endmarker-token}@anchor{22e6}
@subsubsection End marker


At the end of non-interactive input, the lexical analyzer generates an
@ref{22fa,,ENDMARKER} token.

@node Other tokens,Names identifiers and keywords,Line structure,Lexical analysis
@anchor{reference/lexical_analysis id8}@anchor{22fb}@anchor{reference/lexical_analysis other-tokens}@anchor{22fc}
@subsection Other tokens


Besides @ref{22d8,,NEWLINE}, @ref{2140,,INDENT} and @ref{22f6,,DEDENT},
the following categories of tokens exist:
`identifiers' and `keywords' (@ref{22fd,,NAME}), `literals' (such as
@ref{22fe,,NUMBER} and @ref{22ff,,STRING}), and other symbols
(`operators' and `delimiters', @ref{22ce,,OP}).
Whitespace characters (other than logical line terminators, discussed earlier)
are not tokens, but serve to delimit tokens.
Where ambiguity exists, a token comprises the longest possible string that
forms a legal token, when read from left to right.

@node Names identifiers and keywords,Literals,Other tokens,Lexical analysis
@anchor{reference/lexical_analysis identifiers}@anchor{22e4}@anchor{reference/lexical_analysis names-identifiers-and-keywords}@anchor{2300}
@subsection Names (identifiers and keywords)


@geindex identifier
@geindex name

@ref{22fd,,NAME} tokens represent `identifiers', `keywords', and
`soft keywords'.

Names are composed of the following characters:


@itemize *

@item 
uppercase and lowercase letters (@code{A-Z} and @code{a-z}),

@item 
the underscore (@code{_}),

@item 
digits (@code{0} through @code{9}), which cannot appear as the first character, and

@item 
non-ASCII characters. Valid names may only contain “letter-like” and
“digit-like” characters; see @ref{2301,,Non-ASCII characters in names} for details.
@end itemize

Names must contain at least one character, but have no upper length limit.
Case is significant.

Formally, names are described by the following lexical definitions:

@example
@anchor{reference/lexical_analysis grammar-token-python-grammar-NAME}@anchor{2302}NAME:          @ref{2303,,name_start} @ref{2304,,name_continue}*
@anchor{reference/lexical_analysis grammar-token-python-grammar-name_start}@anchor{2303}name_start:    "a"..."z" | "A"..."Z" | "_" | <non-ASCII character>
@anchor{reference/lexical_analysis grammar-token-python-grammar-name_continue}@anchor{2304}name_continue: name_start | "0"..."9"
@anchor{reference/lexical_analysis grammar-token-python-grammar-identifier}@anchor{2305}identifier:    <@ref{2302,,NAME}, except keywords>
@end example

Note that not all names matched by this grammar are valid; see
@ref{2301,,Non-ASCII characters in names} for details.

@menu
* Keywords:: 
* Soft Keywords:: 
* Reserved classes of identifiers:: 
* Non-ASCII characters in names:: 

@end menu

@node Keywords,Soft Keywords,,Names identifiers and keywords
@anchor{reference/lexical_analysis id9}@anchor{2306}@anchor{reference/lexical_analysis keywords}@anchor{22cd}
@subsubsection Keywords


@geindex keyword
@geindex reserved word

The following names are used as reserved words, or `keywords' of the
language, and cannot be used as ordinary identifiers.  They must be spelled
exactly as written here:

@example
False      await      else       import     pass
None       break      except     in         raise
True       class      finally    is         return
and        continue   for        lambda     try
as         def        from       nonlocal   while
assert     del        global     not        with
async      elif       if         or         yield
@end example

@node Soft Keywords,Reserved classes of identifiers,Keywords,Names identifiers and keywords
@anchor{reference/lexical_analysis id10}@anchor{2307}@anchor{reference/lexical_analysis soft-keywords}@anchor{a13}
@subsubsection Soft Keywords


@geindex soft keyword
@geindex keyword


Added in version 3.10.


Some names are only reserved under specific contexts. These are known as
`soft keywords':


@itemize -

@item 
@code{match}, @code{case}, and @code{_}, when used in the @ref{a14,,match} statement.

@item 
@code{type}, when used in the @ref{66d,,type} statement.
@end itemize

These syntactically act as keywords in their specific contexts,
but this distinction is done at the parser level, not when tokenizing.

As soft keywords, their use in the grammar is possible while still
preserving compatibility with existing code that uses these names as
identifier names.


Changed in version 3.12: @code{type} is now a soft keyword.


@geindex _@comma{} identifiers
@geindex __@comma{} identifiers

@node Reserved classes of identifiers,Non-ASCII characters in names,Soft Keywords,Names identifiers and keywords
@anchor{reference/lexical_analysis id-classes}@anchor{2308}@anchor{reference/lexical_analysis reserved-classes-of-identifiers}@anchor{2309}
@subsubsection Reserved classes of identifiers


Certain classes of identifiers (besides keywords) have special meanings.  These
classes are identified by the patterns of leading and trailing underscore
characters:


@table @asis

@item @code{_*}

Not imported by @code{from module import *}.

@item @code{_}

In a @code{case} pattern within a @ref{a14,,match} statement, @code{_} is a
@ref{a13,,soft keyword} that denotes a
@ref{a15,,wildcard}.

Separately, the interactive interpreter makes the result of the last evaluation
available in the variable @code{_}.
(It is stored in the @ref{13,,builtins} module, alongside built-in
functions like @code{print}.)

Elsewhere, @code{_} is a regular identifier. It is often used to name
“special” items, but it is not special to Python itself.

@cartouche
@quotation Note 
The name @code{_} is often used in conjunction with internationalization;
refer to the documentation for the @ref{67,,gettext} module for more
information on this convention.

It is also commonly used for unused variables.
@end quotation
@end cartouche

@item @code{__*__}

System-defined names, informally known as “dunder” names. These names are
defined by the interpreter and its implementation (including the standard library).
Current system names are discussed in the @ref{e6e,,Special method names} section and elsewhere.
More will likely be defined in future versions of Python.  `Any' use of @code{__*__} names,
in any context, that does not follow explicitly documented use, is subject to
breakage without warning.

@item @code{__*}

Class-private names.  Names in this category, when used within the context of a
class definition, are re-written to use a mangled form to help avoid name
clashes between “private” attributes of base and derived classes. See section
@ref{230a,,Identifiers (Names)}.
@end table

@node Non-ASCII characters in names,,Reserved classes of identifiers,Names identifiers and keywords
@anchor{reference/lexical_analysis lexical-names-nonascii}@anchor{2301}@anchor{reference/lexical_analysis non-ascii-characters-in-names}@anchor{230b}
@subsubsection Non-ASCII characters in names


Names that contain non-ASCII characters need additional normalization
and validation beyond the rules and grammar explained
@ref{22e4,,above}.
For example, @code{ř_1}, @code{蛇}, or @code{साँप}  are valid names, but @code{r〰2},
@code{€}, or @code{🐍} are not.

This section explains the exact rules.

All names are converted into the normalization form@footnote{https://www.unicode.org/reports/tr15/#Norm_Forms} NFKC while parsing.
This means that, for example, some typographic variants of characters are
converted to their “basic” form. For example, @code{ﬁⁿₐˡᵢᶻₐᵗᵢᵒₙ} normalizes to
@code{finalization}, so Python treats them as the same name:

@example
>>> ﬁⁿₐˡᵢᶻₐᵗᵢᵒₙ = 3
>>> finalization
3
@end example

@cartouche
@quotation Note 
Normalization is done at the lexical level only.
Run-time functions that take names as `strings' generally do not normalize
their arguments.
For example, the variable defined above is accessible at run time in the
@ref{1c4d,,globals()} dictionary as @code{globals()["finalization"]} but not
@code{globals()["ﬁⁿₐˡᵢᶻₐᵗᵢᵒₙ"]}.
@end quotation
@end cartouche

Similarly to how ASCII-only names must contain only letters, digits and
the underscore, and cannot start with a digit, a valid name must
start with a character in the “letter-like” set @code{xid_start},
and the remaining characters must be in the “letter- and digit-like” set
@code{xid_continue}.

These sets are based on the `XID_Start' and `XID_Continue' sets as defined by the
Unicode standard annex UAX-31@footnote{https://www.unicode.org/reports/tr31/}.
Python’s @code{xid_start} additionally includes the underscore (@code{_}).
Note that Python does not necessarily conform to UAX-31@footnote{https://www.unicode.org/reports/tr31/}.

A non-normative listing of characters in the `XID_Start' and `XID_Continue'
sets as defined by Unicode is available in the DerivedCoreProperties.txt@footnote{https://www.unicode.org/Public/16.0.0/ucd/DerivedCoreProperties.txt}
file in the Unicode Character Database.
For reference, the construction rules for the @code{xid_*} sets are given below.

The set @code{id_start} is defined as the union of:


@itemize *

@item 
Unicode category @code{<Lu>} - uppercase letters (includes @code{A} to @code{Z})

@item 
Unicode category @code{<Ll>} - lowercase letters (includes @code{a} to @code{z})

@item 
Unicode category @code{<Lt>} - titlecase letters

@item 
Unicode category @code{<Lm>} - modifier letters

@item 
Unicode category @code{<Lo>} - other letters

@item 
Unicode category @code{<Nl>} - letter numbers

@item 
@{@code{"_"}@} - the underscore

@item 
@code{<Other_ID_Start>} - an explicit set of characters in PropList.txt@footnote{https://www.unicode.org/Public/16.0.0/ucd/PropList.txt}
to support backwards compatibility
@end itemize

The set @code{xid_start} then closes this set under NFKC normalization, by
removing all characters whose normalization is not of the form
@code{id_start id_continue*}.

The set @code{id_continue} is defined as the union of:


@itemize *

@item 
@code{id_start} (see above)

@item 
Unicode category @code{<Nd>} - decimal numbers (includes @code{0} to @code{9})

@item 
Unicode category @code{<Pc>} - connector punctuations

@item 
Unicode category @code{<Mn>} - nonspacing marks

@item 
Unicode category @code{<Mc>} - spacing combining marks

@item 
@code{<Other_ID_Continue>} - another explicit set of characters in
PropList.txt@footnote{https://www.unicode.org/Public/16.0.0/ucd/PropList.txt} to support backwards compatibility
@end itemize

Again, @code{xid_continue} closes this set under NFKC normalization.

Unicode categories use the version of the Unicode Character Database as
included in the @ref{10c,,unicodedata} module.


@subsubheading See also



@itemize *

@item 
@geindex Python Enhancement Proposals; PEP 3131
PEP 3131@footnote{https://peps.python.org/pep-3131/} – Supporting Non-ASCII Identifiers

@item 
@geindex Python Enhancement Proposals; PEP 672
PEP 672@footnote{https://peps.python.org/pep-0672/} – Unicode-related Security Considerations for Python
@end itemize


@node Literals,String and Bytes literals,Names identifiers and keywords,Lexical analysis
@anchor{reference/lexical_analysis id11}@anchor{230c}@anchor{reference/lexical_analysis literals}@anchor{230d}
@subsection Literals


@geindex literal
@geindex constant

Literals are notations for constant values of some built-in types.

In terms of lexical analysis, Python has @ref{22e3,,string@comma{} bytes}
and @ref{22e5,,numeric} literals.

Other “literals” are lexically denoted using @ref{22cd,,keywords}
(@code{None}, @code{True}, @code{False}) and the special
@ref{230e,,ellipsis token} (@code{...}).

@geindex string literal
@geindex bytes literal
@geindex ASCII
@geindex ' (single quote); string literal
@geindex " (double quote); string literal

@node String and Bytes literals,Numeric literals,Literals,Lexical analysis
@anchor{reference/lexical_analysis string-and-bytes-literals}@anchor{230f}@anchor{reference/lexical_analysis strings}@anchor{22e3}
@subsection String and Bytes literals


String literals are text enclosed in single quotes (@code{'}) or double
quotes (@code{"}). For example:

@example
"spam"
'eggs'
@end example

The quote used to start the literal also terminates it, so a string literal
can only contain the other quote (except with escape sequences, see below).
For example:

@example
'Say "Hello", please.'
"Don't do that!"
@end example

Except for this limitation, the choice of quote character (@code{'} or @code{"})
does not affect how the literal is parsed.

Inside a string literal, the backslash (@code{\}) character introduces an
`escape sequence', which has special meaning depending on the character
after the backslash.
For example, @code{\"} denotes the double quote character, and does `not' end
the string:

@example
>>> print("Say \"Hello\" to everyone!")
Say "Hello" to everyone!
@end example

See @ref{688,,escape sequences} below for a full list of such
sequences, and more details.

@geindex triple-quoted string
@geindex """; string literal
@geindex '@w{'}'; string literal

@menu
* Triple-quoted strings:: 
* String prefixes:: 
* Formal grammar:: 
* Escape sequences:: 
* Bytes literals:: 
* Raw string literals:: 
* f-strings:: 
* t-strings:: 
* Formal grammar for f-strings:: 

@end menu

@node Triple-quoted strings,String prefixes,,String and Bytes literals
@anchor{reference/lexical_analysis triple-quoted-strings}@anchor{2310}
@subsubsection Triple-quoted strings


Strings can also be enclosed in matching groups of three single or double
quotes.
These are generally referred to as `triple-quoted strings':

@example
"""This is a triple-quoted string."""
@end example

In triple-quoted literals, unescaped quotes are allowed (and are
retained), except that three unescaped quotes in a row terminate the literal,
if they are of the same kind (@code{'} or @code{"}) used at the start:

@example
"""This string has "quotes" inside."""
@end example

Unescaped newlines are also allowed and retained:

@example
'@w{'}'This triple-quoted string
continues on the next line.'@w{'}'
@end example

@geindex u'; string literal
@geindex u"; string literal

@node String prefixes,Formal grammar,Triple-quoted strings,String and Bytes literals
@anchor{reference/lexical_analysis string-prefixes}@anchor{2311}
@subsubsection String prefixes


String literals can have an optional `prefix' that influences how the
content of the literal is parsed, for example:

@example
b"data"
f'@{result=@}'
@end example

The allowed prefixes are:


@itemize *

@item 
@code{b}: @ref{2312,,Bytes literal}

@item 
@code{r}: @ref{2313,,Raw string}

@item 
@code{f}: @ref{19b,,Formatted string literal} (“f-string”)

@item 
@code{t}: @ref{1844,,Template string literal} (“t-string”)

@item 
@code{u}: No effect (allowed for backwards compatibility)
@end itemize

See the linked sections for details on each type.

Prefixes are case-insensitive (for example, ‘@code{B}’ works the same as ‘@code{b}’).
The ‘@code{r}’ prefix can be combined with ‘@code{f}’, ‘@code{t}’ or ‘@code{b}’, so ‘@code{fr}’,
‘@code{rf}’, ‘@code{tr}’, ‘@code{rt}’, ‘@code{br}’, and ‘@code{rb}’ are also valid prefixes.


Added in version 3.3: The @code{'rb'} prefix of raw bytes literals has been added as a synonym
of @code{'br'}.

Support for the unicode legacy literal (@code{u'value'}) was reintroduced
to simplify the maintenance of dual Python 2.x and 3.x codebases.
See 
@geindex Python Enhancement Proposals; PEP 414
PEP 414@footnote{https://peps.python.org/pep-0414/} for more information.


@node Formal grammar,Escape sequences,String prefixes,String and Bytes literals
@anchor{reference/lexical_analysis formal-grammar}@anchor{2314}
@subsubsection Formal grammar


String literals, except @ref{19b,,“f-strings”} and
@ref{1844,,“t-strings”}, are described by the
following lexical definitions.

These definitions use @ref{22d2,,negative lookaheads} (@code{!})
to indicate that an ending quote ends the literal.

@example
@anchor{reference/lexical_analysis grammar-token-python-grammar-STRING}@anchor{2315}STRING:          [@ref{2316,,stringprefix}] (@ref{2317,,stringcontent})
@anchor{reference/lexical_analysis grammar-token-python-grammar-stringprefix}@anchor{2316}stringprefix:    <("r" | "u" | "b" | "br" | "rb"), case-insensitive>
@anchor{reference/lexical_analysis grammar-token-python-grammar-stringcontent}@anchor{2317}stringcontent:
   | "'@w{'}'" ( !"'@w{'}'" @ref{2318,,longstringitem})* "'@w{'}'"
   | '"""' ( !'"""' @ref{2318,,longstringitem})* '"""'
   | "'" ( !"'" @ref{2319,,stringitem})* "'"
   | '"' ( !'"' @ref{2319,,stringitem})* '"'
@anchor{reference/lexical_analysis grammar-token-python-grammar-stringitem}@anchor{2319}stringitem:      @ref{231a,,stringchar} | @ref{231b,,stringescapeseq}
@anchor{reference/lexical_analysis grammar-token-python-grammar-stringchar}@anchor{231a}stringchar:      <any @ref{22f0,,source_character}, except backslash and newline>
@anchor{reference/lexical_analysis grammar-token-python-grammar-longstringitem}@anchor{2318}longstringitem:  @ref{2319,,stringitem} | newline
@anchor{reference/lexical_analysis grammar-token-python-grammar-stringescapeseq}@anchor{231b}stringescapeseq: "\" <any @ref{22f0,,source_character}>
@end example

Note that as in all lexical definitions, whitespace is significant.
In particular, the prefix (if any) must be immediately followed by the starting
quote.

@geindex physical line
@geindex escape sequence
@geindex Standard C
@geindex C
@geindex \ (backslash); escape sequence
@geindex \\; escape sequence
@geindex \a; escape sequence
@geindex \b; escape sequence
@geindex \f; escape sequence
@geindex \n; escape sequence
@geindex \r; escape sequence
@geindex \t; escape sequence
@geindex \v; escape sequence
@geindex \x; escape sequence
@geindex \N; escape sequence
@geindex \u; escape sequence
@geindex \U; escape sequence

@node Escape sequences,Bytes literals,Formal grammar,String and Bytes literals
@anchor{reference/lexical_analysis escape-sequences}@anchor{688}@anchor{reference/lexical_analysis id12}@anchor{231c}
@subsubsection Escape sequences


Unless an ‘@code{r}’ or ‘@code{R}’ prefix is present, escape sequences in string and
bytes literals are interpreted according to rules similar to those used by
Standard C.  The recognized escape sequences are:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Escape Sequence

@tab

Meaning

@item

@code{\}<newline>

@tab

@ref{231d,,Ignored end of line}

@item

@code{\\}

@tab

@ref{231e,,Backslash}

@item

@code{\'}

@tab

@ref{231e,,Single quote}

@item

@code{\"}

@tab

@ref{231e,,Double quote}

@item

@code{\a}

@tab

ASCII Bell (BEL)

@item

@code{\b}

@tab

ASCII Backspace (BS)

@item

@code{\f}

@tab

ASCII Formfeed (FF)

@item

@code{\n}

@tab

ASCII Linefeed (LF)

@item

@code{\r}

@tab

ASCII Carriage Return (CR)

@item

@code{\t}

@tab

ASCII Horizontal Tab (TAB)

@item

@code{\v}

@tab

ASCII Vertical Tab (VT)

@item

@code{\@var{ooo}}

@tab

@ref{231f,,Octal character}

@item

@code{\x@var{hh}}

@tab

@ref{2320,,Hexadecimal character}

@item

@code{\N@{@var{name}@}}

@tab

@ref{2321,,Named Unicode character}

@item

@code{\u@var{xxxx}}

@tab

@ref{2322,,Hexadecimal Unicode character}

@item

@code{\U@var{xxxxxxxx}}

@tab

@ref{2322,,Hexadecimal Unicode character}

@end multitable


@menu
* Ignored end of line:: 
* Escaped characters:: 
* Octal character:: 
* Hexadecimal character:: 
* Named Unicode character:: 
* Hexadecimal Unicode characters:: 
* Unrecognized escape sequences:: 

@end menu

@node Ignored end of line,Escaped characters,,Escape sequences
@anchor{reference/lexical_analysis ignored-end-of-line}@anchor{2323}@anchor{reference/lexical_analysis string-escape-ignore}@anchor{231d}
@subsubsection Ignored end of line


A backslash can be added at the end of a line to ignore the newline:

@example
>>> 'This string will not include \
... backslashes or newline characters.'
'This string will not include backslashes or newline characters.'
@end example

The same result can be achieved using @ref{22e3,,triple-quoted strings},
or parentheses and @ref{2324,,string literal concatenation}.

@node Escaped characters,Octal character,Ignored end of line,Escape sequences
@anchor{reference/lexical_analysis escaped-characters}@anchor{2325}@anchor{reference/lexical_analysis string-escape-escaped-char}@anchor{231e}
@subsubsection Escaped characters


To include a backslash in a non-@ref{2313,,raw} Python string
literal, it must be doubled. The @code{\\} escape sequence denotes a single
backslash character:

@example
>>> print('C:\\Program Files')
C:\Program Files
@end example

Similarly, the @code{\'} and @code{\"} sequences denote the single and double
quote character, respectively:

@example
>>> print('\' and \"')
' and "
@end example

@node Octal character,Hexadecimal character,Escaped characters,Escape sequences
@anchor{reference/lexical_analysis octal-character}@anchor{2326}@anchor{reference/lexical_analysis string-escape-oct}@anchor{231f}
@subsubsection Octal character


The sequence @code{\@var{ooo}} denotes a `character' with the octal (base 8)
value `ooo':

@example
>>> '\120'
'P'
@end example

Up to three octal digits (0 through 7) are accepted.

In a bytes literal, `character' means a `byte' with the given value.
In a string literal, it means a Unicode character with the given value.


Changed in version 3.11: Octal escapes with value larger than @code{0o377} (255) produce a
@ref{1a4,,DeprecationWarning}.



Changed in version 3.12: Octal escapes with value larger than @code{0o377} (255) produce a
@ref{1af,,SyntaxWarning}.
In a future Python version they will raise a @ref{18f,,SyntaxError}.


@node Hexadecimal character,Named Unicode character,Octal character,Escape sequences
@anchor{reference/lexical_analysis hexadecimal-character}@anchor{2327}@anchor{reference/lexical_analysis string-escape-hex}@anchor{2320}
@subsubsection Hexadecimal character


The sequence @code{\x@var{hh}} denotes a `character' with the hex (base 16)
value `hh':

@example
>>> '\x50'
'P'
@end example

Unlike in Standard C, exactly two hex digits are required.

In a bytes literal, `character' means a `byte' with the given value.
In a string literal, it means a Unicode character with the given value.

@node Named Unicode character,Hexadecimal Unicode characters,Hexadecimal character,Escape sequences
@anchor{reference/lexical_analysis named-unicode-character}@anchor{2328}@anchor{reference/lexical_analysis string-escape-named}@anchor{2321}
@subsubsection Named Unicode character


The sequence @code{\N@{@var{name}@}} denotes a Unicode character
with the given `name':

@example
>>> '\N@{LATIN CAPITAL LETTER P@}'
'P'
>>> '\N@{SNAKE@}'
'🐍'
@end example

This sequence cannot appear in @ref{2312,,bytes literals}.


Changed in version 3.3: Support for name aliases@footnote{https://www.unicode.org/Public/16.0.0/ucd/NameAliases.txt}
has been added.


@node Hexadecimal Unicode characters,Unrecognized escape sequences,Named Unicode character,Escape sequences
@anchor{reference/lexical_analysis hexadecimal-unicode-characters}@anchor{2329}@anchor{reference/lexical_analysis string-escape-long-hex}@anchor{2322}
@subsubsection Hexadecimal Unicode characters


These sequences @code{\u@var{xxxx}} and @code{\U@var{xxxxxxxx}} denote the
Unicode character with the given hex (base 16) value.
Exactly four digits are required for @code{\u}; exactly eight digits are
required for @code{\U}.
The latter can encode any Unicode character.

@example
>>> '\u1234'
'ሴ'
>>> '\U0001f40d'
'🐍'
@end example

These sequences cannot appear in @ref{2312,,bytes literals}.

@geindex unrecognized escape sequence

@node Unrecognized escape sequences,,Hexadecimal Unicode characters,Escape sequences
@anchor{reference/lexical_analysis unrecognized-escape-sequences}@anchor{232a}
@subsubsection Unrecognized escape sequences


Unlike in Standard C, all unrecognized escape sequences are left in the string
unchanged, that is, `the backslash is left in the result':

@example
>>> print('\q')
\q
>>> list('\q')
['\\', 'q']
@end example

Note that for bytes literals, the escape sequences only recognized in string
literals (@code{\N...}, @code{\u...}, @code{\U...}) fall into the category of
unrecognized escapes.


Changed in version 3.6: Unrecognized escape sequences produce a @ref{1a4,,DeprecationWarning}.



Changed in version 3.12: Unrecognized escape sequences produce a @ref{1af,,SyntaxWarning}.
In a future Python version they will raise a @ref{18f,,SyntaxError}.


@geindex b'; bytes literal
@geindex b"; bytes literal

@node Bytes literals,Raw string literals,Escape sequences,String and Bytes literals
@anchor{reference/lexical_analysis bytes-literal}@anchor{2312}@anchor{reference/lexical_analysis bytes-literals}@anchor{232b}
@subsubsection Bytes literals


`Bytes literals' are always prefixed with ‘@code{b}’ or ‘@code{B}’; they produce an
instance of the @ref{193,,bytes} type instead of the @ref{16a,,str} type.
They may only contain ASCII characters; bytes with a numeric value of 128
or greater must be expressed with escape sequences (typically
@ref{2320,,Hexadecimal character} or @ref{231f,,Octal character}):

@example
>>> b'\x89PNG\r\n\x1a\n'
b'\x89PNG\r\n\x1a\n'
>>> list(b'\x89PNG\r\n\x1a\n')
[137, 80, 78, 71, 13, 10, 26, 10]
@end example

Similarly, a zero byte must be expressed using an escape sequence (typically
@code{\0} or @code{\x00}).

@geindex r'; raw string literal
@geindex r"; raw string literal

@node Raw string literals,f-strings,Bytes literals,String and Bytes literals
@anchor{reference/lexical_analysis raw-string-literals}@anchor{232c}@anchor{reference/lexical_analysis raw-strings}@anchor{2313}
@subsubsection Raw string literals


Both string and bytes literals may optionally be prefixed with a letter ‘@code{r}’
or ‘@code{R}’; such constructs are called `raw string literals'
and `raw bytes literals' respectively and treat backslashes as
literal characters.
As a result, in raw string literals, @ref{688,,escape sequences}
are not treated specially:

@example
>>> r'\d@{4@}-\d@{2@}-\d@{2@}'
'\\d@{4@}-\\d@{2@}-\\d@{2@}'
@end example

Even in a raw literal, quotes can be escaped with a backslash, but the
backslash remains in the result; for example, @code{r"\""} is a valid string
literal consisting of two characters: a backslash and a double quote; @code{r"\"}
is not a valid string literal (even a raw string cannot end in an odd number of
backslashes).  Specifically, `a raw literal cannot end in a single backslash'
(since the backslash would escape the following quote character).  Note also
that a single backslash followed by a newline is interpreted as those two
characters as part of the literal, `not' as a line continuation.

@geindex formatted string literal
@geindex interpolated string literal
@geindex string; formatted literal
@geindex string; interpolated literal
@geindex f-string
@geindex fstring
@geindex f'; formatted string literal
@geindex f"; formatted string literal
@geindex @{@} (curly brackets); in formatted string literal
@geindex ! (exclamation); in formatted string literal
@geindex ; (colon); in formatted string literal
@geindex = (equals); for help in debugging using string literals
@anchor{reference/lexical_analysis f-strings}@anchor{19b}
@node f-strings,t-strings,Raw string literals,String and Bytes literals
@anchor{reference/lexical_analysis formatted-string-literals}@anchor{232d}@anchor{reference/lexical_analysis id13}@anchor{232e}
@subsubsection f-strings



Added in version 3.6.



Changed in version 3.7: The @ref{18e,,await} and @ref{ca7,,async for} can be used in expressions
within f-strings.



Changed in version 3.8: Added the debug specifier (@code{=})



Changed in version 3.12: Many restrictions on expressions within f-strings have been removed.
Notably, nested strings, comments, and backslashes are now permitted.


A `formatted string literal' or `f-string' is a string literal
that is prefixed with ‘@code{f}’ or ‘@code{F}’.
Unlike other string literals, f-strings do not have a constant value.
They may contain `replacement fields' delimited by curly braces @code{@{@}}.
Replacement fields contain expressions which are evaluated at run time.
For example:

@example
>>> who = 'nobody'
>>> nationality = 'Spanish'
>>> f'@{who.title()@} expects the @{nationality@} Inquisition!'
'Nobody expects the Spanish Inquisition!'
@end example

Any doubled curly braces (@code{@{@{} or @code{@}@}}) outside replacement fields
are replaced with the corresponding single curly brace:

@example
>>> print(f'@{@{...@}@}')
@{...@}
@end example

Other characters outside replacement fields are treated like in ordinary
string literals.
This means that escape sequences are decoded (except when a literal is
also marked as a raw string), and newlines are possible in triple-quoted
f-strings:

@example
>>> name = 'Galahad'
>>> favorite_color = 'blue'
>>> print(f'@{name@}:\t@{favorite_color@}')
Galahad:       blue
>>> print(rf"C:\Users\@{name@}")
C:\Users\Galahad
>>> print(f'@w{'}'Three shall be the number of the counting
... and the number of the counting shall be three.'@w{'}')
Three shall be the number of the counting
and the number of the counting shall be three.
@end example

Expressions in formatted string literals are treated like regular
Python expressions.
Each expression is evaluated in the context where the formatted string literal
appears, in order from left to right.
An empty expression is not allowed, and both @ref{14a9,,lambda} and
assignment expressions @code{:=} must be surrounded by explicit parentheses:

@example
>>> f'@{(half := 1/2)@}, @{half * 42@}'
'0.5, 21.0'
@end example

Reusing the outer f-string quoting type inside a replacement field is
permitted:

@example
>>> a = dict(x=2)
>>> f"abc @{a["x"]@} def"
'abc 2 def'
@end example

Backslashes are also allowed in replacement fields and are evaluated the same
way as in any other context:

@example
>>> a = ["a", "b", "c"]
>>> print(f"List a contains:\n@{"\n".join(a)@}")
List a contains:
a
b
c
@end example

It is possible to nest f-strings:

@example
>>> name = 'world'
>>> f'Repeated:@{f' hello @{name@}' * 3@}'
'Repeated: hello world hello world hello world'
@end example

Portable Python programs should not use more than 5 levels of nesting.

`CPython implementation detail:' CPython does not limit nesting of f-strings.

Replacement expressions can contain newlines in both single-quoted and
triple-quoted f-strings and they can contain comments.
Everything that comes after a @code{#} inside a replacement field
is a comment (even closing braces and quotes).
This means that replacement fields with comments must be closed in a
different line:

@example
>>> a = 2
>>> f"abc@{a  # This comment  @}"  continues until the end of the line
...       + 3@}"
'abc5'
@end example

After the expression, replacement fields may optionally contain:


@itemize *

@item 
a `debug specifier' – an equal sign (@code{=}), optionally surrounded by
whitespace on one or both sides;

@item 
a `conversion specifier' – @code{!s}, @code{!r} or @code{!a}; and/or

@item 
a `format specifier' prefixed with a colon (@code{:}).
@end itemize

See the @ref{232f,,Standard Library section on f-strings}
for details on how these fields are evaluated.

As that section explains, `format specifiers' are passed as the second argument
to the @ref{19a,,format()} function to format a replacement field value.
For example, they can be used to specify a field width and padding characters
using the @ref{4fa,,Format Specification Mini-Language}:

@example
>>> number = 14.3
>>> f'@{number:20.7f@}'
'          14.3000000'
@end example

Top-level format specifiers may include nested replacement fields:

@example
>>> field_size = 20
>>> precision = 7
>>> f'@{number:@{field_size@}.@{precision@}f@}'
'          14.3000000'
@end example

These nested fields may include their own conversion fields and
@ref{4fa,,format specifiers}:

@example
>>> number = 3
>>> f'@{number:@{field_size@}@}'
'                   3'
>>> f'@{number:@{field_size:05@}@}'
'00000000000000000003'
@end example

However, these nested fields may not include more deeply nested replacement
fields.

Formatted string literals cannot be used as @ref{2330,,docstrings},
even if they do not include expressions:

@example
>>> def foo():
...     f"Not a docstring"
...
>>> print(foo.__doc__)
None
@end example


@subsubheading See also



@itemize *

@item 
@geindex Python Enhancement Proposals; PEP 498
PEP 498@footnote{https://peps.python.org/pep-0498/} – Literal String Interpolation

@item 
@geindex Python Enhancement Proposals; PEP 701
PEP 701@footnote{https://peps.python.org/pep-0701/} – Syntactic formalization of f-strings

@item 
@ref{834,,str.format()}, which uses a related format string mechanism.
@end itemize

@anchor{reference/lexical_analysis t-strings}@anchor{1844}
@node t-strings,Formal grammar for f-strings,f-strings,String and Bytes literals
@anchor{reference/lexical_analysis id14}@anchor{2331}@anchor{reference/lexical_analysis template-string-literals}@anchor{2332}
@subsubsection t-strings



Added in version 3.14.


A `template string literal' or `t-string' is a string literal
that is prefixed with ‘@code{t}’ or ‘@code{T}’.
These strings follow the same syntax rules as
@ref{19b,,formatted string literals}.
For differences in evaluation rules, see the
@ref{2333,,Standard Library section on t-strings}

@node Formal grammar for f-strings,,t-strings,String and Bytes literals
@anchor{reference/lexical_analysis formal-grammar-for-f-strings}@anchor{2334}
@subsubsection Formal grammar for f-strings


F-strings are handled partly by the @ref{22d6,,lexical analyzer}, which produces the
tokens @ref{2335,,FSTRING_START}, @ref{2336,,FSTRING_MIDDLE}
and @ref{2337,,FSTRING_END}, and partly by the parser, which handles
expressions in the replacement field.
The exact way the work is split is a CPython implementation detail.

Correspondingly, the f-string grammar is a mix of
@ref{22d1,,lexical and syntactic definitions}.

Whitespace is significant in these situations:


@itemize *

@item 
There may be no whitespace in @ref{2335,,FSTRING_START} (between
the prefix and quote).

@item 
Whitespace in @ref{2336,,FSTRING_MIDDLE} is part of the literal
string contents.

@item 
In @code{fstring_replacement_field}, if @code{f_debug_specifier} is present,
all whitespace after the opening brace until the @code{f_debug_specifier},
as well as whitespace immediately following @code{f_debug_specifier},
is retained as part of the expression.

`CPython implementation detail:' The expression is not handled in the tokenization phase; it is
retrieved from the source code using locations of the @code{@{} token
and the token after @code{=}.
@end itemize

The @code{FSTRING_MIDDLE} definition uses
@ref{22d2,,negative lookaheads} (@code{!})
to indicate special characters (backslash, newline, @code{@{}, @code{@}}) and
sequences (@code{f_quote}).

@example
@anchor{reference/lexical_analysis grammar-token-python-grammar-fstring}@anchor{2338}fstring:    @ref{2339,,FSTRING_START} @ref{233a,,fstring_middle}* @ref{233b,,FSTRING_END}

@anchor{reference/lexical_analysis grammar-token-python-grammar-FSTRING_START}@anchor{2339}FSTRING_START:      @ref{233c,,fstringprefix} ("'" | '"' | "'@w{'}'" | '"""')
@anchor{reference/lexical_analysis grammar-token-python-grammar-FSTRING_END}@anchor{233b}FSTRING_END:        @ref{233d,,f_quote}
@anchor{reference/lexical_analysis grammar-token-python-grammar-fstringprefix}@anchor{233c}fstringprefix:      <("f" | "fr" | "rf"), case-insensitive>
@anchor{reference/lexical_analysis grammar-token-python-grammar-f_debug_specifier}@anchor{233e}f_debug_specifier:  '='
@anchor{reference/lexical_analysis grammar-token-python-grammar-f_quote}@anchor{233d}f_quote:            <the quote character(s) used in FSTRING_START>

@anchor{reference/lexical_analysis grammar-token-python-grammar-fstring_middle}@anchor{233a}fstring_middle:
   | @ref{233f,,fstring_replacement_field}
   | @ref{2340,,FSTRING_MIDDLE}
@anchor{reference/lexical_analysis grammar-token-python-grammar-FSTRING_MIDDLE}@anchor{2340}FSTRING_MIDDLE:
   | (!"\" !@ref{22ed,,newline} !'@{' !'@}' !@ref{233d,,f_quote}) @ref{22f0,,source_character}
   | @ref{231b,,stringescapeseq}
   | "@{@{"
   | "@}@}"
   | <newline, in triple-quoted f-strings only>
@anchor{reference/lexical_analysis grammar-token-python-grammar-fstring_replacement_field}@anchor{233f}fstring_replacement_field:
   | '@{' @ref{2341,,f_expression} [@ref{233e,,f_debug_specifier}] [@ref{2342,,fstring_conversion}]
         [@ref{2343,,fstring_full_format_spec}] '@}'
@anchor{reference/lexical_analysis grammar-token-python-grammar-fstring_conversion}@anchor{2342}fstring_conversion:
   | "!" ("s" | "r" | "a")
@anchor{reference/lexical_analysis grammar-token-python-grammar-fstring_full_format_spec}@anchor{2343}fstring_full_format_spec:
   | ':' @ref{2344,,fstring_format_spec}*
@anchor{reference/lexical_analysis grammar-token-python-grammar-fstring_format_spec}@anchor{2344}fstring_format_spec:
   | @ref{2340,,FSTRING_MIDDLE}
   | @ref{233f,,fstring_replacement_field}
@anchor{reference/lexical_analysis grammar-token-python-grammar-f_expression}@anchor{2341}f_expression:
   | ','.(@ref{2345,,conditional_expression} | "*" @ref{2346,,or_expr})+ [","]
   | @ref{2347,,yield_expression}
@end example

@cartouche
@quotation Note 
In the above grammar snippet, the @code{f_quote} and @code{FSTRING_MIDDLE} rules
are context-sensitive – they depend on the contents of @code{FSTRING_START}
of the nearest enclosing @code{fstring}.

Constructing a more traditional formal grammar from this template is left
as an exercise for the reader.
@end quotation
@end cartouche

The grammar for t-strings is identical to the one for f-strings, with `t'
instead of `f' at the beginning of rule and token names and in the prefix.

@example
@anchor{reference/lexical_analysis grammar-token-python-grammar-tstring}@anchor{2348}tstring:    TSTRING_START tstring_middle* TSTRING_END

<rest of the t-string grammar is omitted; see above>
@end example

@node Numeric literals,Operators and delimiters,String and Bytes literals,Lexical analysis
@anchor{reference/lexical_analysis numbers}@anchor{22e5}@anchor{reference/lexical_analysis numeric-literals}@anchor{2349}
@subsection Numeric literals


@geindex number
@geindex numeric literal
@geindex integer literal
@geindex floating-point literal
@geindex hexadecimal literal
@geindex octal literal
@geindex binary literal
@geindex decimal literal
@geindex imaginary literal
@geindex complex literal

@ref{22fe,,NUMBER} tokens represent numeric literals, of which there are
three types: integers, floating-point numbers, and imaginary numbers.

@example
@anchor{reference/lexical_analysis grammar-token-python-grammar-NUMBER}@anchor{234a}NUMBER: @ref{234b,,integer} | @ref{234c,,floatnumber} | @ref{234d,,imagnumber}
@end example

The numeric value of a numeric literal is the same as if it were passed as a
string to the @ref{19c,,int}, @ref{197,,float} or @ref{198,,complex} class
constructor, respectively.
Note that not all valid inputs for those constructors are also valid literals.

Numeric literals do not include a sign; a phrase like @code{-1} is
actually an expression composed of the unary operator ‘@code{-}’ and the literal
@code{1}.

@geindex 0b; integer literal
@geindex 0o; integer literal
@geindex 0x; integer literal
@geindex _ (underscore); in numeric literal

@menu
* Integer literals:: 
* Floating-point literals:: 
* Imaginary literals:: 

@end menu

@node Integer literals,Floating-point literals,,Numeric literals
@anchor{reference/lexical_analysis integer-literals}@anchor{234e}@anchor{reference/lexical_analysis integers}@anchor{234f}
@subsubsection Integer literals


Integer literals denote whole numbers. For example:

@example
7
3
2147483647
@end example

There is no limit for the length of integer literals apart from what can be
stored in available memory:

@example
7922816251426433759354395033679228162514264337593543950336
@end example

Underscores can be used to group digits for enhanced readability,
and are ignored for determining the numeric value of the literal.
For example, the following literals are equivalent:

@example
100_000_000_000
100000000000
1_00_00_00_00_000
@end example

Underscores can only occur between digits.
For example, @code{_123}, @code{321_}, and @code{123__321} are `not' valid literals.

Integers can be specified in binary (base 2), octal (base 8), or hexadecimal
(base 16) using the prefixes @code{0b}, @code{0o} and @code{0x}, respectively.
Hexadecimal digits 10 through 15 are represented by letters @code{A}-@code{F},
case-insensitive.  For example:

@example
0b100110111
0b_1110_0101
0o177
0o377
0xdeadbeef
0xDead_Beef
@end example

An underscore can follow the base specifier.
For example, @code{0x_1f} is a valid literal, but @code{0_x1f} and @code{0x__1f} are
not.

Leading zeros in a non-zero decimal number are not allowed.
For example, @code{0123} is not a valid literal.
This is for disambiguation with C-style octal literals, which Python used
before version 3.0.

Formally, integer literals are described by the following lexical definitions:

@example
@anchor{reference/lexical_analysis grammar-token-python-grammar-integer}@anchor{234b}integer:      @ref{2350,,decinteger} | @ref{2351,,bininteger} | @ref{2352,,octinteger} | @ref{2353,,hexinteger} | @ref{2354,,zerointeger}
@anchor{reference/lexical_analysis grammar-token-python-grammar-decinteger}@anchor{2350}decinteger:   @ref{2355,,nonzerodigit} (["_"] @ref{2356,,digit})*
@anchor{reference/lexical_analysis grammar-token-python-grammar-bininteger}@anchor{2351}bininteger:   "0" ("b" | "B") (["_"] @ref{2357,,bindigit})+
@anchor{reference/lexical_analysis grammar-token-python-grammar-octinteger}@anchor{2352}octinteger:   "0" ("o" | "O") (["_"] @ref{2358,,octdigit})+
@anchor{reference/lexical_analysis grammar-token-python-grammar-hexinteger}@anchor{2353}hexinteger:   "0" ("x" | "X") (["_"] @ref{2359,,hexdigit})+
@anchor{reference/lexical_analysis grammar-token-python-grammar-zerointeger}@anchor{2354}zerointeger:  "0"+ (["_"] "0")*
@anchor{reference/lexical_analysis grammar-token-python-grammar-nonzerodigit}@anchor{2355}nonzerodigit: "1"..."9"
@anchor{reference/lexical_analysis grammar-token-python-grammar-digit}@anchor{2356}digit:        "0"..."9"
@anchor{reference/lexical_analysis grammar-token-python-grammar-bindigit}@anchor{2357}bindigit:     "0" | "1"
@anchor{reference/lexical_analysis grammar-token-python-grammar-octdigit}@anchor{2358}octdigit:     "0"..."7"
@anchor{reference/lexical_analysis grammar-token-python-grammar-hexdigit}@anchor{2359}hexdigit:     @ref{2356,,digit} | "a"..."f" | "A"..."F"
@end example


Changed in version 3.6: Underscores are now allowed for grouping purposes in literals.


@geindex . (dot); in numeric literal
@geindex e; in numeric literal
@geindex _ (underscore); in numeric literal

@node Floating-point literals,Imaginary literals,Integer literals,Numeric literals
@anchor{reference/lexical_analysis floating}@anchor{235a}@anchor{reference/lexical_analysis floating-point-literals}@anchor{235b}
@subsubsection Floating-point literals


Floating-point (float) literals, such as @code{3.14} or @code{1.5}, denote
@ref{235c,,approximations of real numbers}.

They consist of `integer' and `fraction' parts, each composed of decimal digits.
The parts are separated by a decimal point, @code{.}:

@example
2.71828
4.0
@end example

Unlike in integer literals, leading zeros are allowed.
For example, @code{077.010} is legal, and denotes the same number as @code{77.01}.

As in integer literals, single underscores may occur between digits to help
readability:

@example
96_485.332_123
3.14_15_93
@end example

Either of these parts, but not both, can be empty. For example:

@example
10.  # (equivalent to 10.0)
.001  # (equivalent to 0.001)
@end example

Optionally, the integer and fraction may be followed by an `exponent':
the letter @code{e} or @code{E}, followed by an optional sign, @code{+} or @code{-},
and a number in the same format as the integer and fraction parts.
The @code{e} or @code{E} represents “times ten raised to the power of”:

@example
1.0e3  # (represents 1.0×10³, or 1000.0)
1.166e-5  # (represents 1.166×10⁻⁵, or 0.00001166)
6.02214076e+23  # (represents 6.02214076×10²³, or 602214076000000000000000.)
@end example

In floats with only integer and exponent parts, the decimal point may be
omitted:

@example
1e3  # (equivalent to 1.e3 and 1.0e3)
0e0  # (equivalent to 0.)
@end example

Formally, floating-point literals are described by the following
lexical definitions:

@example
@anchor{reference/lexical_analysis grammar-token-python-grammar-floatnumber}@anchor{234c}floatnumber:
   | @ref{235d,,digitpart} "." [@ref{235d,,digitpart}] [@ref{235e,,exponent}]
   | "." @ref{235d,,digitpart} [@ref{235e,,exponent}]
   | @ref{235d,,digitpart} @ref{235e,,exponent}
@anchor{reference/lexical_analysis grammar-token-python-grammar-digitpart}@anchor{235d}digitpart: @ref{2356,,digit} (["_"] @ref{2356,,digit})*
@anchor{reference/lexical_analysis grammar-token-python-grammar-exponent}@anchor{235e}exponent:  ("e" | "E") ["+" | "-"] @ref{235d,,digitpart}
@end example


Changed in version 3.6: Underscores are now allowed for grouping purposes in literals.


@geindex j; in numeric literal

@node Imaginary literals,,Floating-point literals,Numeric literals
@anchor{reference/lexical_analysis imaginary}@anchor{235f}@anchor{reference/lexical_analysis imaginary-literals}@anchor{2360}
@subsubsection Imaginary literals


Python has @ref{201e,,complex number} objects, but no complex
literals.
Instead, `imaginary literals' denote complex numbers with a zero
real part.

For example, in math, the complex number 3+4.2`i' is written
as the real number 3 added to the imaginary number 4.2`i'.
Python uses a similar syntax, except the imaginary unit is written as @code{j}
rather than `i':

@example
3+4.2j
@end example

This is an expression composed
of the @ref{234f,,integer literal} @code{3},
the @ref{22d0,,operator} ‘@code{+}’,
and the @ref{235f,,imaginary literal} @code{4.2j}.
Since these are three separate tokens, whitespace is allowed between them:

@example
3 + 4.2j
@end example

No whitespace is allowed `within' each token.
In particular, the @code{j} suffix, may not be separated from the number
before it.

The number before the @code{j} has the same syntax as a floating-point literal.
Thus, the following are valid imaginary literals:

@example
4.2j
3.14j
10.j
.001j
1e100j
3.14e-10j
3.14_15_93j
@end example

Unlike in a floating-point literal the decimal point can be omitted if the
imaginary number only has an integer part.
The number is still evaluated as a floating-point number, not an integer:

@example
10j
0j
1000000000000000000000000j   # equivalent to 1e+24j
@end example

The @code{j} suffix is case-insensitive.
That means you can use @code{J} instead:

@example
3.14J   # equivalent to 3.14j
@end example

Formally, imaginary literals are described by the following lexical definition:

@example
@anchor{reference/lexical_analysis grammar-token-python-grammar-imagnumber}@anchor{234d}imagnumber: (@ref{234c,,floatnumber} | @ref{235d,,digitpart}) ("j" | "J")
@end example
@anchor{reference/lexical_analysis delimiters}@anchor{22cf}@anchor{reference/lexical_analysis operators}@anchor{22d0}
@node Operators and delimiters,,Numeric literals,Lexical analysis
@anchor{reference/lexical_analysis lexical-ellipsis}@anchor{230e}@anchor{reference/lexical_analysis operators-and-delimiters}@anchor{2361}
@subsection Operators and delimiters


@geindex operators
@geindex delimiters

The following grammar defines `operator' and `delimiter' tokens,
that is, the generic @ref{22ce,,OP} token type.
A @ref{2362,,list of these tokens and their names}
is also available in the @code{token} module documentation.

@example
@anchor{reference/lexical_analysis grammar-token-python-grammar-OP}@anchor{2363}OP:
   | assignment_operator
   | bitwise_operator
   | comparison_operator
   | enclosing_delimiter
   | other_delimiter
   | arithmetic_operator
   | "..."
   | other_op

@anchor{reference/lexical_analysis grammar-token-python-grammar-assignment_operator}@anchor{2364}assignment_operator:   "+=" | "-=" | "*=" | "**=" | "/="  | "//=" | "%=" |
                       "&=" | "|=" | "^=" | "<<=" | ">>=" | "@@="  | ":="
@anchor{reference/lexical_analysis grammar-token-python-grammar-bitwise_operator}@anchor{2365}bitwise_operator:      "&"  | "|"  | "^"  | "~"   | "<<"  | ">>"
@anchor{reference/lexical_analysis grammar-token-python-grammar-comparison_operator}@anchor{2366}comparison_operator:   "<=" | ">=" | "<"  | ">"   | "=="  | "!="
@anchor{reference/lexical_analysis grammar-token-python-grammar-enclosing_delimiter}@anchor{2367}enclosing_delimiter:   "("  | ")"  | "["  | "]"   | "@{"   | "@}"
@anchor{reference/lexical_analysis grammar-token-python-grammar-other_delimiter}@anchor{2368}other_delimiter:       ","  | ":"  | "!"  | ";"   | "="   | "->"
@anchor{reference/lexical_analysis grammar-token-python-grammar-arithmetic_operator}@anchor{2369}arithmetic_operator:   "+"  | "-"  | "**" | "*"   | "//"  | "/"   | "%"
@anchor{reference/lexical_analysis grammar-token-python-grammar-other_op}@anchor{236a}other_op:              "."  | "@@"
@end example

@cartouche
@quotation Note 
Generally, `operators' are used to combine @ref{236b,,expressions},
while `delimiters' serve other purposes.
However, there is no clear, formal distinction between the two categories.

Some tokens can serve as either operators or delimiters, depending on usage.
For example, @code{*} is both the multiplication operator and a delimiter used
for sequence unpacking, and @code{@@} is both the matrix multiplication and
a delimiter that introduces decorators.

For some tokens, the distinction is unclear.
For example, some people consider @code{.}, @code{(}, and @code{)} to be delimiters, while others
see the @ref{dd0,,getattr()} operator and the function call operator(s).

Some of Python’s operators, like @code{and}, @code{or}, and @code{not in}, use
@ref{22cd,,keyword} tokens rather than “symbols” (operator tokens).
@end quotation
@end cartouche

A sequence of three consecutive periods (@code{...}) has a special
meaning as an @ref{236c,,Ellipsis} literal.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Data model,Execution model,Lexical analysis,The Python Language Reference
@anchor{reference/datamodel doc}@anchor{236d}@anchor{reference/datamodel data-model}@anchor{236e}@anchor{reference/datamodel datamodel}@anchor{1d9e}@anchor{reference/datamodel translation-repo}@anchor{236f}
@section Data model


@menu
* Objects@comma{} values and types: Objects values and types. 
* The standard type hierarchy:: 
* Special method names:: 
* Coroutines:: 

@end menu

@node Objects values and types,The standard type hierarchy,,Data model
@anchor{reference/datamodel objects}@anchor{2370}@anchor{reference/datamodel objects-values-and-types}@anchor{2371}
@subsection Objects, values and types


@geindex object
@geindex data

`Objects' are Python’s abstraction for data.  All data in a Python program
is represented by objects or by relations between objects. Even code is
represented by objects.

@geindex built-in function; id
@geindex built-in function; type
@geindex identity of an object
@geindex value of an object
@geindex type of an object
@geindex mutable object
@geindex immutable object

Every object has an identity, a type and a value.  An object’s `identity' never
changes once it has been created; you may think of it as the object’s address in
memory.  The @ref{34a,,is} operator compares the identity of two objects; the
@ref{162f,,id()} function returns an integer representing its identity.

`CPython implementation detail:' For CPython, @code{id(x)} is the memory address where @code{x} is stored.

An object’s type determines the operations that the object supports (e.g., “does
it have a length?”) and also defines the possible values for objects of that
type.  The @ref{f4a,,type()} function returns an object’s type (which is an object
itself).  Like its identity, an object’s `type' is also unchangeable.
@footnote{
It `is' possible in some cases to change an object’s type, under certain
controlled conditions. It generally isn’t a good idea though, since it can
lead to some very strange behaviour if it is handled incorrectly.
}

The `value' of some objects can change.  Objects whose value can
change are said to be `mutable'; objects whose value is unchangeable once they
are created are called `immutable'. (The value of an immutable container object
that contains a reference to a mutable object can change when the latter’s value
is changed; however the container is still considered immutable, because the
collection of objects it contains cannot be changed.  So, immutability is not
strictly the same as having an unchangeable value, it is more subtle.) An
object’s mutability is determined by its type; for instance, numbers, strings
and tuples are immutable, while dictionaries and lists are mutable.

@geindex garbage collection
@geindex reference counting
@geindex unreachable object

Objects are never explicitly destroyed; however, when they become unreachable
they may be garbage-collected.  An implementation is allowed to postpone garbage
collection or omit it altogether — it is a matter of implementation quality
how garbage collection is implemented, as long as no objects are collected that
are still reachable.

`CPython implementation detail:' CPython currently uses a reference-counting scheme with (optional) delayed
detection of cyclically linked garbage, which collects most objects as soon
as they become unreachable, but is not guaranteed to collect garbage
containing circular references.  See the documentation of the @ref{64,,gc}
module for information on controlling the collection of cyclic garbage.
Other implementations act differently and CPython may change.
Do not depend on immediate finalization of objects when they become
unreachable (so you should always close files explicitly).

Note that the use of the implementation’s tracing or debugging facilities may
keep objects alive that would normally be collectable. Also note that catching
an exception with a @ref{8fa,,try}…@ref{1ac,,except} statement may keep
objects alive.

Some objects contain references to “external” resources such as open files or
windows.  It is understood that these resources are freed when the object is
garbage-collected, but since garbage collection is not guaranteed to happen,
such objects also provide an explicit way to release the external resource,
usually a @code{close()} method. Programs are strongly recommended to explicitly
close such objects.  The @ref{8fa,,try}…@ref{1b1,,finally} statement
and the @ref{187,,with} statement provide convenient ways to do this.

@geindex container

Some objects contain references to other objects; these are called `containers'.
Examples of containers are tuples, lists and dictionaries.  The references are
part of a container’s value.  In most cases, when we talk about the value of a
container, we imply the values, not the identities of the contained objects;
however, when we talk about the mutability of a container, only the identities
of the immediately contained objects are implied.  So, if an immutable container
(like a tuple) contains a reference to a mutable object, its value changes if
that mutable object is changed.

Types affect almost all aspects of object behavior.  Even the importance of
object identity is affected in some sense: for immutable types, operations that
compute new values may actually return a reference to any existing object with
the same type and value, while for mutable objects this is not allowed.
For example, after @code{a = 1; b = 1}, `a' and `b' may or may not refer to
the same object with the value one, depending on the implementation.
This is because @ref{19c,,int} is an immutable type, so the reference to @code{1}
can be reused. This behaviour depends on the implementation used, so should
not be relied upon, but is something to be aware of when making use of object
identity tests.
However, after @code{c = []; d = []}, `c' and `d' are guaranteed to refer to two
different, unique, newly created empty lists. (Note that @code{e = f = []} assigns
the `same' object to both `e' and `f'.)

@node The standard type hierarchy,Special method names,Objects values and types,Data model
@anchor{reference/datamodel the-standard-type-hierarchy}@anchor{2372}@anchor{reference/datamodel types}@anchor{2373}
@subsection The standard type hierarchy


@geindex type
@geindex data; type
@geindex type; hierarchy
@geindex extension; module
@geindex C; language

Below is a list of the types that are built into Python.  Extension modules
(written in C, Java, or other languages, depending on the implementation) can
define additional types.  Future versions of Python may add types to the type
hierarchy (e.g., rational numbers, efficiently stored arrays of integers, etc.),
although such additions will often be provided via the standard library instead.

@geindex attribute
@geindex special; attribute
@geindex generic; special; attribute

Some of the type descriptions below contain a paragraph listing ‘special
attributes.’  These are attributes that provide access to the implementation and
are not intended for general use.  Their definition may change in the future.

@menu
* None:: 
* NotImplemented:: 
* Ellipsis:: 
* numbers.Number: numbers Number. 
* Sequences:: 
* Set types:: 
* Mappings:: 
* Callable types:: 
* Modules: Modules<3>. 
* Custom classes:: 
* Class instances:: 
* I/O objects (also known as file objects): I/O objects also known as file objects. 
* Internal types:: 

@end menu

@node None,NotImplemented,,The standard type hierarchy
@anchor{reference/datamodel none}@anchor{2374}
@subsubsection None


@geindex object; None

This type has a single value.  There is a single object with this value. This
object is accessed through the built-in name @code{None}. It is used to signify the
absence of a value in many situations, e.g., it is returned from functions that
don’t explicitly return anything. Its truth value is false.

@node NotImplemented,Ellipsis,None,The standard type hierarchy
@anchor{reference/datamodel notimplemented}@anchor{2375}
@subsubsection NotImplemented


@geindex object; NotImplemented

This type has a single value.  There is a single object with this value. This
object is accessed through the built-in name @ref{1a3,,NotImplemented}. Numeric methods
and rich comparison methods should return this value if they do not implement the
operation for the operands provided.  (The interpreter will then try the
reflected operation, or some other fallback, depending on the operator.)  It
should not be evaluated in a boolean context.

See
@ref{2376,,Implementing the arithmetic operations}
for more details.


Changed in version 3.9: Evaluating @ref{1a3,,NotImplemented} in a boolean context was deprecated.



Changed in version 3.14: Evaluating @ref{1a3,,NotImplemented} in a boolean context now raises a @ref{199,,TypeError}.
It previously evaluated to @ref{e0d,,True} and emitted a @ref{1a4,,DeprecationWarning}
since Python 3.9.


@node Ellipsis,numbers Number,NotImplemented,The standard type hierarchy
@anchor{reference/datamodel ellipsis}@anchor{2377}
@subsubsection Ellipsis


@geindex object; Ellipsis
@geindex ...; ellipsis literal

This type has a single value.  There is a single object with this value. This
object is accessed through the literal @code{...} or the built-in name
@code{Ellipsis}.  Its truth value is true.

@node numbers Number,Sequences,Ellipsis,The standard type hierarchy
@anchor{reference/datamodel numbers-number}@anchor{2378}
@subsubsection @code{numbers.Number}


@geindex object; numeric

These are created by numeric literals and returned as results by arithmetic
operators and arithmetic built-in functions.  Numeric objects are immutable;
once created their value never changes.  Python numbers are of course strongly
related to mathematical numbers, but subject to the limitations of numerical
representation in computers.

The string representations of the numeric classes, computed by
@ref{830,,__repr__()} and @ref{831,,__str__()}, have the following
properties:


@itemize *

@item 
They are valid numeric literals which, when passed to their
class constructor, produce an object having the value of the
original numeric.

@item 
The representation is in base 10, when possible.

@item 
Leading zeros, possibly excepting a single zero before a
decimal point, are not shown.

@item 
Trailing zeros, possibly excepting a single zero after a
decimal point, are not shown.

@item 
A sign is shown only when the number is negative.
@end itemize

Python distinguishes between integers, floating-point numbers, and complex
numbers:

@menu
* numbers.Integral: numbers Integral. 
* numbers.Real (float): numbers Real float. 
* numbers.Complex (complex): numbers Complex complex. 

@end menu

@node numbers Integral,numbers Real float,,numbers Number
@anchor{reference/datamodel numbers-integral}@anchor{2379}
@subsubsection @code{numbers.Integral}


@geindex object; integer

These represent elements from the mathematical set of integers (positive and
negative).

@cartouche
@quotation Note 
@geindex integer; representation

The rules for integer representation are intended to give the most meaningful
interpretation of shift and mask operations involving negative integers.
@end quotation
@end cartouche

There are two types of integers:


@table @asis

@item Integers (@ref{19c,,int})

These represent numbers in an unlimited range, subject to available (virtual)
memory only.  For the purpose of shift and mask operations, a binary
representation is assumed, and negative numbers are represented in a variant of
2’s complement which gives the illusion of an infinite string of sign bits
extending to the left.

@item Booleans (@ref{3c1,,bool})

@geindex object; Boolean
@geindex False
@geindex True

These represent the truth values False and True.  The two objects representing
the values @code{False} and @code{True} are the only Boolean objects. The Boolean type is a
subtype of the integer type, and Boolean values behave like the values 0 and 1,
respectively, in almost all contexts, the exception being that when converted to
a string, the strings @code{"False"} or @code{"True"} are returned, respectively.
@end table

@node numbers Real float,numbers Complex complex,numbers Integral,numbers Number
@anchor{reference/datamodel datamodel-float}@anchor{235c}@anchor{reference/datamodel numbers-real-float}@anchor{237a}
@subsubsection @code{numbers.Real} (@code{float})


@geindex object; floating-point
@geindex floating-point; number
@geindex C; language
@geindex Java; language

These represent machine-level double precision floating-point numbers. You are
at the mercy of the underlying machine architecture (and C or Java
implementation) for the accepted range and handling of overflow. Python does not
support single-precision floating-point numbers; the savings in processor and
memory usage that are usually the reason for using these are dwarfed by the
overhead of using objects in Python, so there is no reason to complicate the
language with two kinds of floating-point numbers.

@node numbers Complex complex,,numbers Real float,numbers Number
@anchor{reference/datamodel numbers-complex-complex}@anchor{237b}
@subsubsection @code{numbers.Complex} (@code{complex})


@geindex object; complex
@geindex complex; number

These represent complex numbers as a pair of machine-level double precision
floating-point numbers.  The same caveats apply as for floating-point numbers.
The real and imaginary parts of a complex number @code{z} can be retrieved through
the read-only attributes @code{z.real} and @code{z.imag}.

@node Sequences,Set types,numbers Number,The standard type hierarchy
@anchor{reference/datamodel datamodel-sequences}@anchor{237c}@anchor{reference/datamodel sequences}@anchor{237d}
@subsubsection Sequences


@geindex built-in function; len
@geindex object; sequence
@geindex index operation
@geindex item selection
@geindex subscription

These represent finite ordered sets indexed by non-negative numbers. The
built-in function @ref{841,,len()} returns the number of items of a sequence. When
the length of a sequence is `n', the index set contains the numbers 0, 1,
…, `n'-1.  Item `i' of sequence `a' is selected by @code{a[i]}. Some sequences,
including built-in sequences, interpret negative subscripts by adding the
sequence length. For example, @code{a[-2]} equals @code{a[n-2]}, the second to last
item of sequence a with length @code{n}.

The resulting value must be a nonnegative integer less than the number of items
in the sequence. If it is not, an @ref{1741,,IndexError} is raised.

@geindex slicing
@geindex start (slice object attribute)
@geindex stop (slice object attribute)
@geindex step (slice object attribute)

Sequences also support slicing: @code{a[start:stop]} selects all items with index `k' such
that `start' @code{<=} `k' @code{<} `stop'.  When used as an expression, a slice is a
sequence of the same type. The comment above about negative subscripts also applies
to negative slice positions.
Note that no error is raised if a slice position is less than zero or larger
than the length of the sequence.

If `start' is missing or @ref{887,,None}, slicing behaves as if `start' was zero.
If `stop' is missing or @code{None}, slicing behaves as if `stop' was equal to
the length of the sequence.

Some sequences also support “extended slicing” with a third “step” parameter:
@code{a[i:j:k]} selects all items of `a' with index `x' where @code{x = i + n*k}, `n'
@code{>=} @code{0} and `i' @code{<=} `x' @code{<} `j'.

Sequences are distinguished according to their mutability:

@menu
* Immutable sequences:: 
* Mutable sequences:: 

@end menu

@node Immutable sequences,Mutable sequences,,Sequences
@anchor{reference/datamodel immutable-sequences}@anchor{237e}
@subsubsection Immutable sequences


@geindex object; immutable sequence
@geindex object; immutable

An object of an immutable sequence type cannot change once it is created.  (If
the object contains references to other objects, these other objects may be
mutable and may be changed; however, the collection of objects directly
referenced by an immutable object cannot change.)

The following types are immutable sequences:

@geindex string; immutable sequences


@table @asis

@item Strings

@geindex built-in function; chr
@geindex built-in function; ord
@geindex character
@geindex string; item
@geindex Unicode

A string (@ref{16a,,str}) is a sequence of values that represent
`characters', or more formally, `Unicode code points'.
All the code points in the range @code{0} to @code{0x10FFFF} can be
represented in a string.

Python doesn’t have a dedicated `character' type.
Instead, every code point in the string is represented as a string
object with length @code{1}.

The built-in function @ref{237f,,ord()}
converts a code point from its string form to an integer in the
range @code{0} to @code{0x10FFFF}; @ref{1a33,,chr()} converts an integer in the range
@code{0} to @code{0x10FFFF} to the corresponding length @code{1} string object.
@ref{ad8,,str.encode()} can be used to convert a @ref{16a,,str} to
@ref{193,,bytes} using the given text encoding, and
@ref{ad9,,bytes.decode()} can be used to achieve the opposite.

@item Tuples

@geindex object; tuple
@geindex singleton; tuple
@geindex empty; tuple

The items of a @ref{614,,tuple} are arbitrary Python objects. Tuples of two or
more items are formed by comma-separated lists of expressions.  A tuple
of one item (a ‘singleton’) can be formed by affixing a comma to an
expression (an expression by itself does not create a tuple, since
parentheses must be usable for grouping of expressions).  An empty
tuple can be formed by an empty pair of parentheses.

@item Bytes

@geindex bytes
@geindex byte

A @ref{193,,bytes} object is an immutable array.  The items are 8-bit bytes,
represented by integers in the range 0 <= x < 256.  Bytes literals
(like @code{b'abc'}) and the built-in @ref{193,,bytes()} constructor
can be used to create bytes objects.  Also, bytes objects can be
decoded to strings via the @ref{ad9,,decode()} method.
@end table

@node Mutable sequences,,Immutable sequences,Sequences
@anchor{reference/datamodel mutable-sequences}@anchor{2380}
@subsubsection Mutable sequences


@geindex object; mutable sequence
@geindex object; mutable
@geindex assignment; statement
@geindex subscription
@geindex slicing

Mutable sequences can be changed after they are created.  The subscription and
slicing notations can be used as the target of assignment and @ref{1b63,,del}
(delete) statements.

@cartouche
@quotation Note 
@geindex module; array

@geindex module; collections

The @ref{1e,,collections} and @ref{8,,array} module provide
additional examples of mutable sequence types.
@end quotation
@end cartouche

There are currently two intrinsic mutable sequence types:


@table @asis

@item Lists

@geindex object; list

The items of a list are arbitrary Python objects.  Lists are formed by
placing a comma-separated list of expressions in square brackets. (Note
that there are no special cases needed to form lists of length 0 or 1.)

@item Byte Arrays

@geindex bytearray

A bytearray object is a mutable array. They are created by the built-in
@ref{342,,bytearray()} constructor.  Aside from being mutable
(and hence unhashable), byte arrays otherwise provide the same interface
and functionality as immutable @ref{193,,bytes} objects.
@end table

@node Set types,Mappings,Sequences,The standard type hierarchy
@anchor{reference/datamodel set-types}@anchor{2381}
@subsubsection Set types


@geindex built-in function; len
@geindex object; set type

These represent unordered, finite sets of unique, immutable objects. As such,
they cannot be indexed by any subscript. However, they can be iterated over, and
the built-in function @ref{841,,len()} returns the number of items in a set. Common
uses for sets are fast membership testing, removing duplicates from a sequence,
and computing mathematical operations such as intersection, union, difference,
and symmetric difference.

For set elements, the same immutability rules apply as for dictionary keys. Note
that numeric types obey the normal rules for numeric comparison: if two numbers
compare equal (e.g., @code{1} and @code{1.0}), only one of them can be contained in a
set.

There are currently two intrinsic set types:


@table @asis

@item Sets

@geindex object; set

These represent a mutable set. They are created by the built-in @ref{185,,set()}
constructor and can be modified afterwards by several methods, such as
@ref{2382,,add()}.

@item Frozen sets

@geindex object; frozenset

These represent an immutable set.  They are created by the built-in
@ref{7f3,,frozenset()} constructor.  As a frozenset is immutable and
@ref{825,,hashable}, it can be used again as an element of another set, or as
a dictionary key.
@end table

@node Mappings,Callable types,Set types,The standard type hierarchy
@anchor{reference/datamodel datamodel-mappings}@anchor{2383}@anchor{reference/datamodel mappings}@anchor{2384}
@subsubsection Mappings


@geindex built-in function; len
@geindex subscription
@geindex object; mapping

These represent finite sets of objects indexed by arbitrary index sets. The
subscript notation @code{a[k]} selects the item indexed by @code{k} from the mapping
@code{a}; this can be used in expressions and as the target of assignments or
@ref{1b63,,del} statements. The built-in function @ref{841,,len()} returns the number
of items in a mapping.

There is currently a single intrinsic mapping type:

@menu
* Dictionaries: Dictionaries<2>. 

@end menu

@node Dictionaries<2>,,,Mappings
@anchor{reference/datamodel dictionaries}@anchor{2385}
@subsubsection Dictionaries


@geindex object; dictionary

These represent finite sets of objects indexed by nearly arbitrary values.  The
only types of values not acceptable as keys are values containing lists or
dictionaries or other mutable types that are compared by value rather than by
object identity, the reason being that the efficient implementation of
dictionaries requires a key’s hash value to remain constant. Numeric types used
for keys obey the normal rules for numeric comparison: if two numbers compare
equal (e.g., @code{1} and @code{1.0}) then they can be used interchangeably to index
the same dictionary entry.

Dictionaries preserve insertion order, meaning that keys will be produced
in the same order they were added sequentially over the dictionary.
Replacing an existing key does not change the order, however removing a key
and re-inserting it will add it to the end instead of keeping its old place.

Dictionaries are mutable; they can be created by the @code{@{@}} notation (see
section @ref{f85,,Dictionary displays}).

@geindex module; dbm.ndbm
@geindex module; dbm.gnu

The extension modules @ref{38,,dbm.ndbm} and @ref{37,,dbm.gnu} provide
additional examples of mapping types, as does the @ref{1e,,collections}
module.


Changed in version 3.7: Dictionaries did not preserve insertion order in versions of Python before 3.6.
In CPython 3.6, insertion order was preserved, but it was considered
an implementation detail at that time rather than a language guarantee.


@node Callable types,Modules<3>,Mappings,The standard type hierarchy
@anchor{reference/datamodel callable-types}@anchor{2386}
@subsubsection Callable types


@geindex object; callable
@geindex function; call
@geindex invocation
@geindex function; argument

These are the types to which the function call operation (see section
@ref{f83,,Calls}) can be applied:

@menu
* User-defined functions:: 
* Instance methods:: 
* Generator functions:: 
* Coroutine functions:: 
* Asynchronous generator functions:: 
* Built-in functions:: 
* Built-in methods:: 
* Classes: Classes<2>. 
* Class Instances:: 

@end menu

@node User-defined functions,Instance methods,,Callable types
@anchor{reference/datamodel user-defined-funcs}@anchor{59c}@anchor{reference/datamodel user-defined-functions}@anchor{2387}
@subsubsection User-defined functions


@geindex user-defined; function
@geindex object; function
@geindex object; user-defined function

A user-defined function object is created by a function definition (see
section @ref{205c,,Function definitions}).  It should be called with an argument list
containing the same number of items as the function’s formal parameter
list.

@menu
* Special read-only attributes:: 
* Special writable attributes:: 

@end menu

@node Special read-only attributes,Special writable attributes,,User-defined functions
@anchor{reference/datamodel special-read-only-attributes}@anchor{2388}
@subsubsection Special read-only attributes


@geindex __builtins__ (function attribute)
@geindex __closure__ (function attribute)
@geindex __globals__ (function attribute)
@geindex global; namespace


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Attribute

@tab

Meaning

@item

@geindex __builtins__ (function attribute)
@anchor{reference/datamodel function __builtins__}@anchor{2389}
@deffn {Attribute} function.__builtins__
@end deffn

@tab

A reference to the @ref{184,,dictionary} that holds the function’s
builtins namespace.


Added in version 3.10.


@item

@geindex __globals__ (function attribute)
@anchor{reference/datamodel function __globals__}@anchor{14df}
@deffn {Attribute} function.__globals__
@end deffn

@tab

A reference to the @ref{184,,dictionary} that holds the function’s
@ref{238a,,global variables} – the global namespace of the module
in which the function was defined.

@item

@geindex __closure__ (function attribute)
@anchor{reference/datamodel function __closure__}@anchor{14dc}
@deffn {Attribute} function.__closure__
@end deffn

@tab

@code{None} or a @ref{614,,tuple} of cells that contain bindings for the names specified
in the @ref{238b,,co_freevars} attribute of the function’s
@ref{59d,,code object}.

A cell object has the attribute @code{cell_contents}.
This can be used to get the value of the cell, as well as set the value.

@end multitable


@node Special writable attributes,,Special read-only attributes,User-defined functions
@anchor{reference/datamodel special-writable-attributes}@anchor{238c}
@subsubsection Special writable attributes


@geindex __doc__ (function attribute)
@geindex __name__ (function attribute)
@geindex __module__ (function attribute)
@geindex __dict__ (function attribute)
@geindex __defaults__ (function attribute)
@geindex __code__ (function attribute)
@geindex __annotations__ (function attribute)
@geindex __annotate__ (function attribute)
@geindex __kwdefaults__ (function attribute)
@geindex __type_params__ (function attribute)

Most of these attributes check the type of the assigned value:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Attribute

@tab

Meaning

@item

@geindex __doc__ (function attribute)
@anchor{reference/datamodel function __doc__}@anchor{13e5}
@deffn {Attribute} function.__doc__
@end deffn

@tab

The function’s documentation string, or @code{None} if unavailable.

@item

@geindex __name__ (function attribute)
@anchor{reference/datamodel function __name__}@anchor{14e0}
@deffn {Attribute} function.__name__
@end deffn

@tab

The function’s name.
See also: @ref{126c,,__name__ attributes}.

@item

@geindex __qualname__ (function attribute)
@anchor{reference/datamodel function __qualname__}@anchor{238d}
@deffn {Attribute} function.__qualname__
@end deffn

@tab

The function’s @ref{1d68,,qualified name}.
See also: @ref{126b,,__qualname__ attributes}.


Added in version 3.3.


@item

@geindex __module__ (function attribute)
@anchor{reference/datamodel function __module__}@anchor{238e}
@deffn {Attribute} function.__module__
@end deffn

@tab

The name of the module the function was defined in,
or @code{None} if unavailable.

@item

@geindex __defaults__ (function attribute)
@anchor{reference/datamodel function __defaults__}@anchor{14dd}
@deffn {Attribute} function.__defaults__
@end deffn

@tab

A @ref{614,,tuple} containing default @ref{238f,,parameter} values
for those parameters that have defaults,
or @code{None} if no parameters have a default value.

@item

@geindex __code__ (function attribute)
@anchor{reference/datamodel function __code__}@anchor{59d}
@deffn {Attribute} function.__code__
@end deffn

@tab

The @ref{4e7,,code object} representing
the compiled function body.

@item

@geindex __dict__ (function attribute)
@anchor{reference/datamodel function __dict__}@anchor{14de}
@deffn {Attribute} function.__dict__
@end deffn

@tab

The namespace supporting arbitrary function attributes.
See also: @ref{77e,,__dict__ attributes}.

@item

@geindex __annotations__ (function attribute)
@anchor{reference/datamodel function __annotations__}@anchor{13e4}
@deffn {Attribute} function.__annotations__
@end deffn

@tab

A @ref{184,,dictionary} containing annotations of
@ref{238f,,parameters}.
The keys of the dictionary are the parameter names,
and @code{'return'} for the return annotation, if provided.
See also: @ref{456,,object.__annotations__}.


Changed in version 3.14: Annotations are now @ref{686,,lazily evaluated}.
See 
@geindex Python Enhancement Proposals; PEP 649
PEP 649@footnote{https://peps.python.org/pep-0649/}.


@item

@geindex __annotate__ (function attribute)
@anchor{reference/datamodel function __annotate__}@anchor{2390}
@deffn {Attribute} function.__annotate__
@end deffn

@tab

The @ref{15e,,annotate function} for this function, or @code{None}
if the function has no annotations. See @ref{19c7,,object.__annotate__}.


Added in version 3.14.


@item

@geindex __kwdefaults__ (function attribute)
@anchor{reference/datamodel function __kwdefaults__}@anchor{122e}
@deffn {Attribute} function.__kwdefaults__
@end deffn

@tab

A @ref{184,,dictionary} containing defaults for keyword-only
@ref{238f,,parameters}.

@item

@geindex __type_params__ (function attribute)
@anchor{reference/datamodel function __type_params__}@anchor{2391}
@deffn {Attribute} function.__type_params__
@end deffn

@tab

A @ref{614,,tuple} containing the @ref{5ad,,type parameters} of
a @ref{683,,generic function}.


Added in version 3.12.


@end multitable


Function objects also support getting and setting arbitrary attributes, which
can be used, for example, to attach metadata to functions.  Regular attribute
dot-notation is used to get and set such attributes.

`CPython implementation detail:' CPython’s current implementation only supports function attributes
on user-defined functions. Function attributes on
@ref{2392,,built-in functions} may be supported in the
future.

Additional information about a function’s definition can be retrieved from its
@ref{4e7,,code object}
(accessible via the @ref{59d,,__code__} attribute).

@node Instance methods,Generator functions,User-defined functions,Callable types
@anchor{reference/datamodel id2}@anchor{2393}@anchor{reference/datamodel instance-methods}@anchor{20eb}
@subsubsection Instance methods


@geindex object; method
@geindex object; user-defined method
@geindex user-defined; method

An instance method object combines a class, a class instance and any
callable object (normally a user-defined function).

@geindex __func__ (method attribute)
@geindex __self__ (method attribute)
@geindex __doc__ (method attribute)
@geindex __name__ (method attribute)
@geindex __module__ (method attribute)

Special read-only attributes:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@geindex __self__ (method attribute)
@anchor{reference/datamodel method __self__}@anchor{15d4}
@deffn {Attribute} method.__self__
@end deffn

@tab

Refers to the class instance object to which the method is
@ref{2394,,bound}

@item

@geindex __func__ (method attribute)
@anchor{reference/datamodel method __func__}@anchor{1508}
@deffn {Attribute} method.__func__
@end deffn

@tab

Refers to the original @ref{59c,,function object}

@item

@geindex __doc__ (method attribute)
@anchor{reference/datamodel method __doc__}@anchor{2395}
@deffn {Attribute} method.__doc__
@end deffn

@tab

The method’s documentation
(same as @ref{13e5,,method.__func__.__doc__}).
A @ref{16a,,string} if the original function had a docstring, else
@code{None}.

@item

@geindex __name__ (method attribute)
@anchor{reference/datamodel method __name__}@anchor{2396}
@deffn {Attribute} method.__name__
@end deffn

@tab

The name of the method
(same as @ref{14e0,,method.__func__.__name__})

@item

@geindex __module__ (method attribute)
@anchor{reference/datamodel method __module__}@anchor{2397}
@deffn {Attribute} method.__module__
@end deffn

@tab

The name of the module the method was defined in, or @code{None} if
unavailable.

@end multitable


Methods also support accessing (but not setting) the arbitrary function
attributes on the underlying @ref{59c,,function object}.

User-defined method objects may be created when getting an attribute of a
class (perhaps via an instance of that class), if that attribute is a
user-defined @ref{59c,,function object} or a
@ref{48f,,classmethod} object.
@anchor{reference/datamodel method-binding}@anchor{2394}
When an instance method object is created by retrieving a user-defined
@ref{59c,,function object} from a class via one of its
instances, its @ref{15d4,,__self__} attribute is the instance, and the
method object is said to be `bound'.  The new method’s @ref{1508,,__func__}
attribute is the original function object.

When an instance method object is created by retrieving a @ref{48f,,classmethod}
object from a class or instance, its @ref{15d4,,__self__} attribute is the
class itself, and its @ref{1508,,__func__} attribute is the function object
underlying the class method.

When an instance method object is called, the underlying function
(@ref{1508,,__func__}) is called, inserting the class instance
(@ref{15d4,,__self__}) in front of the argument list.  For instance, when
@code{C} is a class which contains a definition for a function
@code{f()}, and @code{x} is an instance of @code{C}, calling @code{x.f(1)} is
equivalent to calling @code{C.f(x, 1)}.

When an instance method object is derived from a @ref{48f,,classmethod} object, the
“class instance” stored in @ref{15d4,,__self__} will actually be the class
itself, so that calling either @code{x.f(1)} or @code{C.f(1)} is equivalent to
calling @code{f(C,1)} where @code{f} is the underlying function.

It is important to note that user-defined functions
which are attributes of a class instance are not converted to bound
methods; this `only' happens when the function is an attribute of the
class.

@node Generator functions,Coroutine functions,Instance methods,Callable types
@anchor{reference/datamodel generator-functions}@anchor{2398}
@subsubsection Generator functions


@geindex generator; function
@geindex generator; iterator

A function or method which uses the @ref{bc8,,yield} statement (see section
@ref{bc8,,The yield statement}) is called a `generator function'.  Such a function, when
called, always returns an @ref{4c9,,iterator} object which can be used to
execute the body of the function:  calling the iterator’s
@ref{14d9,,iterator.__next__()} method will cause the function to execute until
it provides a value using the @code{yield} statement.  When the
function executes a @ref{1b0,,return} statement or falls off the end, a
@ref{dfb,,StopIteration} exception is raised and the iterator will have
reached the end of the set of values to be returned.

@node Coroutine functions,Asynchronous generator functions,Generator functions,Callable types
@anchor{reference/datamodel coroutine-functions}@anchor{2399}
@subsubsection Coroutine functions


@geindex coroutine; function

A function or method which is defined using @ref{7ee,,async def} is called
a `coroutine function'.  Such a function, when called, returns a
@ref{6ba,,coroutine} object.  It may contain @ref{18e,,await} expressions,
as well as @ref{186,,async with} and @ref{ca7,,async for} statements. See
also the @ref{239a,,Coroutine Objects} section.

@node Asynchronous generator functions,Built-in functions,Coroutine functions,Callable types
@anchor{reference/datamodel asynchronous-generator-functions}@anchor{239b}
@subsubsection Asynchronous generator functions


@geindex asynchronous generator; function
@geindex asynchronous generator; asynchronous iterator

A function or method which is defined using @ref{7ee,,async def} and
which uses the @ref{bc8,,yield} statement is called a
`asynchronous generator function'.  Such a function, when called,
returns an @ref{4c8,,asynchronous iterator} object which can be used in an
@ref{ca7,,async for} statement to execute the body of the function.

Calling the asynchronous iterator’s
@ref{18ca,,aiterator.__anext__} method
will return an @ref{4ca,,awaitable} which when awaited
will execute until it provides a value using the @ref{bc8,,yield}
expression.  When the function executes an empty @ref{1b0,,return}
statement or falls off the end, a @ref{1e52,,StopAsyncIteration} exception
is raised and the asynchronous iterator will have reached the end of
the set of values to be yielded.

@node Built-in functions,Built-in methods,Asynchronous generator functions,Callable types
@anchor{reference/datamodel built-in-functions}@anchor{239c}@anchor{reference/datamodel builtin-functions}@anchor{2392}
@subsubsection Built-in functions


@geindex object; built-in function
@geindex object; function
@geindex C; language

A built-in function object is a wrapper around a C function.  Examples of
built-in functions are @ref{841,,len()} and @ref{16ca,,math.sin()} (@ref{92,,math} is a
standard built-in module). The number and type of the arguments are
determined by the C function. Special read-only attributes:


@itemize *

@item 
@code{__doc__} is the function’s documentation string, or @code{None} if
unavailable. See @ref{13e5,,function.__doc__}.

@item 
@code{__name__} is the function’s name. See @ref{14e0,,function.__name__}.

@item 
@code{__self__} is set to @code{None} (but see the next item).

@item 
@code{__module__} is the name of
the module the function was defined in or @code{None} if unavailable.
See @ref{238e,,function.__module__}.
@end itemize

@node Built-in methods,Classes<2>,Built-in functions,Callable types
@anchor{reference/datamodel built-in-methods}@anchor{239d}@anchor{reference/datamodel builtin-methods}@anchor{239e}
@subsubsection Built-in methods


@geindex object; built-in method
@geindex object; method
@geindex built-in; method

This is really a different disguise of a built-in function, this time containing
an object passed to the C function as an implicit extra argument.  An example of
a built-in method is @code{alist.append()}, assuming `alist' is a list object. In
this case, the special read-only attribute @code{__self__} is set to the object
denoted by `alist'. (The attribute has the same semantics as it does with
@ref{15d4,,other instance methods}.)

@node Classes<2>,Class Instances,Built-in methods,Callable types
@anchor{reference/datamodel classes}@anchor{239f}@anchor{reference/datamodel id3}@anchor{23a0}
@subsubsection Classes


Classes are callable.  These objects normally act as factories for new
instances of themselves, but variations are possible for class types that
override @ref{7a1,,__new__()}.  The arguments of the call are passed to
@code{__new__()} and, in the typical case, to @ref{8c1,,__init__()} to
initialize the new instance.

@node Class Instances,,Classes<2>,Callable types
@anchor{reference/datamodel class-instances}@anchor{23a1}
@subsubsection Class Instances


Instances of arbitrary classes can be made callable by defining a
@ref{77b,,__call__()} method in their class.

@node Modules<3>,Custom classes,Callable types,The standard type hierarchy
@anchor{reference/datamodel module-objects}@anchor{23a2}@anchor{reference/datamodel modules}@anchor{23a3}
@subsubsection Modules


@geindex statement; import
@geindex object; module

Modules are a basic organizational unit of Python code, and are created by
the @ref{23a4,,import system} as invoked either by the
@ref{7f9,,import} statement, or by calling
functions such as @ref{73d,,importlib.import_module()} and built-in
@ref{ad7,,__import__()}.  A module object has a namespace implemented by a
@ref{184,,dictionary} object (this is the dictionary referenced by the
@ref{14df,,__globals__}
attribute of functions defined in the module).  Attribute references are
translated to lookups in this dictionary, e.g., @code{m.x} is equivalent to
@code{m.__dict__["x"]}. A module object does not contain the code object used
to initialize the module (since it isn’t needed once the initialization is
done).

Attribute assignment updates the module’s namespace dictionary, e.g.,
@code{m.x = 1} is equivalent to @code{m.__dict__["x"] = 1}.

@geindex __name__ (module attribute)
@geindex __spec__ (module attribute)
@geindex __package__ (module attribute)
@geindex __loader__ (module attribute)
@geindex __path__ (module attribute)
@geindex __file__ (module attribute)
@geindex __cached__ (module attribute)
@geindex __doc__ (module attribute)
@geindex __annotations__ (module attribute)
@geindex __annotate__ (module attribute)
@geindex module; namespace

@menu
* Import-related attributes on module objects:: 
* Other writable attributes on module objects:: 
* Module dictionaries:: 

@end menu

@node Import-related attributes on module objects,Other writable attributes on module objects,,Modules<3>
@anchor{reference/datamodel import-mod-attrs}@anchor{23a5}@anchor{reference/datamodel import-related-attributes-on-module-objects}@anchor{23a6}
@subsubsection Import-related attributes on module objects


Module objects have the following attributes that relate to the
@ref{23a4,,import system}. When a module is created using the machinery associated
with the import system, these attributes are filled in based on the module’s
@ref{23a7,,spec}, before the @ref{1a6f,,loader} executes and loads the
module.

To create a module dynamically rather than using the import system,
it’s recommended to use @ref{1019,,importlib.util.module_from_spec()},
which will set the various import-controlled attributes to appropriate values.
It’s also possible to use the @ref{101a,,types.ModuleType} constructor to create
modules directly, but this technique is more error-prone, as most attributes
must be manually set on the module object after it has been created when using
this approach.

@cartouche
@quotation Caution 
With the exception of @ref{1597,,__name__}, it is `strongly'
recommended that you rely on @ref{23a8,,__spec__} and its attributes
instead of any of the other individual attributes listed in this subsection.
Note that updating an attribute on @code{__spec__} will not update the
corresponding attribute on the module itself:

@example
>>> import typing
>>> typing.__name__, typing.__spec__.name
('typing', 'typing')
>>> typing.__spec__.name = 'spelling'
>>> typing.__name__, typing.__spec__.name
('typing', 'spelling')
>>> typing.__name__ = 'keyboard_smashing'
>>> typing.__name__, typing.__spec__.name
('keyboard_smashing', 'spelling')
@end example
@end quotation
@end cartouche

@geindex __name__ (module attribute)
@anchor{reference/datamodel module __name__}@anchor{1597}
@deffn {Attribute} module.__name__

The name used to uniquely identify the module in the import system.
For a directly executed module, this will be set to @code{"__main__"}.

This attribute must be set to the fully qualified name of the module.
It is expected to match the value of
@ref{23a9,,module.__spec__.name}.
@end deffn

@geindex __spec__ (module attribute)
@anchor{reference/datamodel module __spec__}@anchor{23a8}
@deffn {Attribute} module.__spec__

A record of the module’s import-system-related state.

Set to the @ref{22b0,,module spec} that was
used when importing the module. See @ref{23aa,,Module specs} for more details.


Added in version 3.4.

@end deffn

@geindex __package__ (module attribute)
@anchor{reference/datamodel module __package__}@anchor{325}
@deffn {Attribute} module.__package__

The @ref{235,,package} a module belongs to.

If the module is top-level (that is, not a part of any specific package)
then the attribute should be set to @code{'@w{'}} (the empty string). Otherwise,
it should be set to the name of the module’s package (which can be equal to
@ref{1597,,module.__name__} if the module itself is a package). See 
@geindex Python Enhancement Proposals; PEP 366
PEP 366@footnote{https://peps.python.org/pep-0366/}
for further details.

This attribute is used instead of @ref{1597,,__name__} to calculate
explicit relative imports for main modules. It defaults to @code{None} for
modules created dynamically using the @ref{101a,,types.ModuleType} constructor;
use @ref{1019,,importlib.util.module_from_spec()} instead to ensure the attribute
is set to a @ref{16a,,str}.

It is `strongly' recommended that you use
@ref{326,,module.__spec__.parent}
instead of @code{module.__package__}. @ref{325,,__package__} is now only used
as a fallback if @code{__spec__.parent} is not set, and this fallback
path is deprecated.


Changed in version 3.4: This attribute now defaults to @code{None} for modules created dynamically
using the @ref{101a,,types.ModuleType} constructor.
Previously the attribute was optional.



Changed in version 3.6: The value of @code{__package__} is expected to be the same as
@ref{326,,__spec__.parent}.
@ref{325,,__package__} is now only used as a fallback during import
resolution if @code{__spec__.parent} is not defined.



Changed in version 3.10: @ref{71f,,ImportWarning} is raised if an import resolution falls back to
@code{__package__} instead of
@ref{326,,__spec__.parent}.



Changed in version 3.12: Raise @ref{1a4,,DeprecationWarning} instead of @ref{71f,,ImportWarning} when
falling back to @code{__package__} during import resolution.



Deprecated since version 3.13, will be removed in version 3.15: @code{__package__} will cease to be set or taken into consideration
by the import system or standard library.

@end deffn

@geindex __loader__ (module attribute)
@anchor{reference/datamodel module __loader__}@anchor{339}
@deffn {Attribute} module.__loader__

The @ref{1a6f,,loader} object that the import machinery used to load the module.

This attribute is mostly useful for introspection, but can be used for
additional loader-specific functionality, for example getting data
associated with a loader.

@code{__loader__} defaults to @code{None} for modules created dynamically
using the @ref{101a,,types.ModuleType} constructor;
use @ref{1019,,importlib.util.module_from_spec()} instead to ensure the attribute
is set to a @ref{1a6f,,loader} object.

It is `strongly' recommended that you use
@ref{33a,,module.__spec__.loader}
instead of @code{module.__loader__}.


Changed in version 3.4: This attribute now defaults to @code{None} for modules created dynamically
using the @ref{101a,,types.ModuleType} constructor.
Previously the attribute was optional.



Deprecated since version 3.12, will be removed in version 3.16: Setting @code{__loader__} on a module while failing to set
@code{__spec__.loader} is deprecated. In Python 3.16,
@code{__loader__} will cease to be set or taken into consideration by
the import system or the standard library.

@end deffn

@geindex __path__ (module attribute)
@anchor{reference/datamodel module __path__}@anchor{2098}
@deffn {Attribute} module.__path__

A (possibly empty) @ref{717,,sequence} of strings enumerating the locations
where the package’s submodules will be found. Non-package modules should
not have a @code{__path__} attribute. See @ref{23ab,,__path__ attributes on modules} for
more details.

It is `strongly' recommended that you use
@ref{23ac,,module.__spec__.submodule_search_locations}
instead of @code{module.__path__}.
@end deffn

@geindex __file__ (module attribute)
@anchor{reference/datamodel module __file__}@anchor{23ad}
@deffn {Attribute} module.__file__
@end deffn

@geindex __cached__ (module attribute)
@anchor{reference/datamodel module __cached__}@anchor{323}
@deffn {Attribute} module.__cached__

@code{__file__} and @code{__cached__} are both optional attributes that
may or may not be set. Both attributes should be a @ref{16a,,str} when they
are available.

@code{__file__} indicates the pathname of the file from which the module
was loaded (if loaded from a file), or the pathname of the shared library
file for extension modules loaded dynamically from a shared library.
It might be missing for certain types of modules, such as C modules that are
statically linked into the interpreter, and the
@ref{23a4,,import system} may opt to leave it unset if it
has no semantic meaning (for example, a module loaded from a database).

If @code{__file__} is set then the @code{__cached__} attribute might
also be set,  which is the path to any compiled version of
the code (for example, a byte-compiled file). The file does not need to exist
to set this attribute; the path can simply point to where the
compiled file `would' exist (see 
@geindex Python Enhancement Proposals; PEP 3147
PEP 3147@footnote{https://peps.python.org/pep-3147/}).

Note that @code{__cached__} may be set even if @code{__file__} is not
set.  However, that scenario is quite atypical.  Ultimately, the
@ref{1a6f,,loader} is what makes use of the module spec provided by the
@ref{23ae,,finder} (from which @code{__file__} and @code{__cached__} are
derived).  So if a loader can load from a cached module but otherwise does
not load from a file, that atypical scenario may be appropriate.

It is `strongly' recommended that you use
@ref{324,,module.__spec__.cached}
instead of @code{module.__cached__}.


Deprecated since version 3.13, will be removed in version 3.15: Setting @code{__cached__} on a module while failing to set
@code{__spec__.cached} is deprecated. In Python 3.15,
@code{__cached__} will cease to be set or taken into consideration by
the import system or standard library.

@end deffn

@node Other writable attributes on module objects,Module dictionaries,Import-related attributes on module objects,Modules<3>
@anchor{reference/datamodel other-writable-attributes-on-module-objects}@anchor{23af}
@subsubsection Other writable attributes on module objects


As well as the import-related attributes listed above, module objects also have
the following writable attributes:

@geindex __doc__ (module attribute)
@anchor{reference/datamodel module __doc__}@anchor{1c32}
@deffn {Attribute} module.__doc__

The module’s documentation string, or @code{None} if unavailable.
See also: @ref{b27,,__doc__ attributes}.
@end deffn

@geindex __annotations__ (module attribute)
@anchor{reference/datamodel module __annotations__}@anchor{23b0}
@deffn {Attribute} module.__annotations__

A dictionary containing @ref{f57,,variable annotations}
collected during module body execution.  For best practices on working with
@code{__annotations__}, see @ref{6,,annotationlib}.


Changed in version 3.14: Annotations are now @ref{686,,lazily evaluated}.
See 
@geindex Python Enhancement Proposals; PEP 649
PEP 649@footnote{https://peps.python.org/pep-0649/}.

@end deffn

@geindex __annotate__ (module attribute)
@anchor{reference/datamodel module __annotate__}@anchor{23b1}
@deffn {Attribute} module.__annotate__

The @ref{15e,,annotate function} for this module, or @code{None} if the module has
no annotations. See also: @ref{19c7,,__annotate__} attributes.


Added in version 3.14.

@end deffn

@node Module dictionaries,,Other writable attributes on module objects,Modules<3>
@anchor{reference/datamodel module-dictionaries}@anchor{23b2}
@subsubsection Module dictionaries


Module objects also have the following special read-only attribute:

@geindex __dict__ (module attribute)

@geindex __dict__ (module attribute)
@anchor{reference/datamodel module __dict__}@anchor{23b3}
@deffn {Attribute} module.__dict__

The module’s namespace as a dictionary object. Uniquely among the attributes
listed here, @code{__dict__} cannot be accessed as a global variable from
within a module; it can only be accessed as an attribute on module objects.

`CPython implementation detail:' Because of the way CPython clears module dictionaries, the module
dictionary will be cleared when the module falls out of scope even if the
dictionary still has live references.  To avoid this, copy the dictionary
or keep the module around while using its dictionary directly.
@end deffn

@node Custom classes,Class instances,Modules<3>,The standard type hierarchy
@anchor{reference/datamodel class-attrs-and-methods}@anchor{23b4}@anchor{reference/datamodel custom-classes}@anchor{23b5}
@subsubsection Custom classes


Custom class types are typically created by class definitions (see section
@ref{14e3,,Class definitions}).  A class has a namespace implemented by a dictionary object.
Class attribute references are translated to lookups in this dictionary, e.g.,
@code{C.x} is translated to @code{C.__dict__["x"]} (although there are a number of
hooks which allow for other means of locating attributes). When the attribute
name is not found there, the attribute search continues in the base classes.
This search of the base classes uses the C3 method resolution order which
behaves correctly even in the presence of ‘diamond’ inheritance structures
where there are multiple inheritance paths leading back to a common ancestor.
Additional details on the C3 MRO used by Python can be found at
@ref{16b6,,The Python 2.3 Method Resolution Order}.

@geindex object; class
@geindex object; class instance
@geindex object; instance
@geindex class object; call
@geindex container
@geindex object; dictionary
@geindex class; attribute

When a class attribute reference (for class @code{C}, say) would yield a
class method object, it is transformed into an instance method object whose
@ref{15d4,,__self__} attribute is @code{C}.
When it would yield a @ref{451,,staticmethod} object,
it is transformed into the object wrapped by the static method
object. See section @ref{e4f,,Implementing Descriptors} for another way in which attributes
retrieved from a class may differ from those actually contained in its
@ref{77e,,__dict__}.

@geindex class; attribute; assignment

Class attribute assignments update the class’s dictionary, never the dictionary
of a base class.

@geindex class object; call

A class object can be called (see above) to yield a class instance (see below).

@menu
* Special attributes:: 
* Special methods:: 

@end menu

@node Special attributes,Special methods,,Custom classes
@anchor{reference/datamodel special-attributes}@anchor{23b6}
@subsubsection Special attributes


@geindex __name__ (class attribute)
@geindex __module__ (class attribute)
@geindex __dict__ (class attribute)
@geindex __bases__ (class attribute)
@geindex __base__ (class attribute)
@geindex __doc__ (class attribute)
@geindex __annotations__ (class attribute)
@geindex __annotate__ (class attribute)
@geindex __type_params__ (class attribute)
@geindex __static_attributes__ (class attribute)
@geindex __firstlineno__ (class attribute)


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Attribute

@tab

Meaning

@item

@geindex __name__ (type attribute)
@anchor{reference/datamodel type __name__}@anchor{16b7}
@deffn {Attribute} type.__name__
@end deffn

@tab

The class’s name.
See also: @ref{126c,,__name__ attributes}.

@item

@geindex __qualname__ (type attribute)
@anchor{reference/datamodel type __qualname__}@anchor{23b7}
@deffn {Attribute} type.__qualname__
@end deffn

@tab

The class’s @ref{1d68,,qualified name}.
See also: @ref{126b,,__qualname__ attributes}.

@item

@geindex __module__ (type attribute)
@anchor{reference/datamodel type __module__}@anchor{617}
@deffn {Attribute} type.__module__
@end deffn

@tab

The name of the module in which the class was defined.

@item

@geindex __dict__ (type attribute)
@anchor{reference/datamodel type __dict__}@anchor{e5d}
@deffn {Attribute} type.__dict__
@end deffn

@tab

A @ref{699,,mapping proxy}
providing a read-only view of the class’s namespace.
See also: @ref{77e,,__dict__ attributes}.

@item

@geindex __bases__ (type attribute)
@anchor{reference/datamodel type __bases__}@anchor{16b8}
@deffn {Attribute} type.__bases__
@end deffn

@tab

A @ref{614,,tuple} containing the class’s bases.
In most cases, for a class defined as @code{class X(A, B, C)},
@code{X.__bases__} will be exactly equal to @code{(A, B, C)}.

@item

@geindex __base__ (type attribute)
@anchor{reference/datamodel type __base__}@anchor{23b8}
@deffn {Attribute} type.__base__
@end deffn

@tab

`CPython implementation detail:' The single base class in the inheritance chain that is responsible
for the memory layout of instances. This attribute corresponds to
@ref{23b9,,tp_base} at the C level.

@item

@geindex __doc__ (type attribute)
@anchor{reference/datamodel type __doc__}@anchor{20d9}
@deffn {Attribute} type.__doc__
@end deffn

@tab

The class’s documentation string, or @code{None} if undefined.
Not inherited by subclasses.

@item

@geindex __annotations__ (type attribute)
@anchor{reference/datamodel type __annotations__}@anchor{188c}
@deffn {Attribute} type.__annotations__
@end deffn

@tab

A dictionary containing
@ref{f57,,variable annotations}
collected during class body execution. See also:
@ref{456,,__annotations__ attributes}.

For best practices on working with @ref{456,,__annotations__},
please see @ref{6,,annotationlib}. Use
@ref{457,,annotationlib.get_annotations()} instead of accessing this
attribute directly.

@cartouche
@quotation Warning 
Accessing the @code{__annotations__} attribute directly
on a class object may return annotations for the wrong class, specifically
in certain cases where the class, its base class, or a metaclass
is defined under @code{from __future__ import annotations}.
See 
@geindex Python Enhancement Proposals; PEP 749#pep749-metaclasses
749@footnote{https://peps.python.org/pep-0749/#pep749-metaclasses} for details.

This attribute does not exist on certain builtin classes. On
user-defined classes without @code{__annotations__}, it is an
empty dictionary.
@end quotation
@end cartouche


Changed in version 3.14: Annotations are now @ref{686,,lazily evaluated}.
See 
@geindex Python Enhancement Proposals; PEP 649
PEP 649@footnote{https://peps.python.org/pep-0649/}.


@item

@geindex __annotate__() (type method)
@anchor{reference/datamodel type __annotate__}@anchor{18b0}
@deffn {Method} type.__annotate__ ()
@end deffn

@tab

The @ref{15e,,annotate function} for this class, or @code{None}
if the class has no annotations.
See also: @ref{19c7,,__annotate__ attributes}.


Added in version 3.14.


@item

@geindex __type_params__ (type attribute)
@anchor{reference/datamodel type __type_params__}@anchor{23ba}
@deffn {Attribute} type.__type_params__
@end deffn

@tab

A @ref{614,,tuple} containing the @ref{5ad,,type parameters} of
a @ref{682,,generic class}.


Added in version 3.12.


@item

@geindex __static_attributes__ (type attribute)
@anchor{reference/datamodel type __static_attributes__}@anchor{477}
@deffn {Attribute} type.__static_attributes__
@end deffn

@tab

A @ref{614,,tuple} containing names of attributes of this class which are
assigned through @code{self.X} from any function in its body.


Added in version 3.13.


@item

@geindex __firstlineno__ (type attribute)
@anchor{reference/datamodel type __firstlineno__}@anchor{478}
@deffn {Attribute} type.__firstlineno__
@end deffn

@tab

The line number of the first line of the class definition,
including decorators.
Setting the @ref{617,,__module__} attribute removes the
@code{__firstlineno__} item from the type’s dictionary.


Added in version 3.13.


@item

@geindex __mro__ (type attribute)
@anchor{reference/datamodel type __mro__}@anchor{23bb}
@deffn {Attribute} type.__mro__
@end deffn

@tab

The @ref{614,,tuple} of classes that are considered when looking for
base classes during method resolution.

@end multitable


@node Special methods,,Special attributes,Custom classes
@anchor{reference/datamodel special-methods}@anchor{23bc}
@subsubsection Special methods


In addition to the special attributes described above, all Python classes also
have the following two methods available:

@geindex mro() (type method)
@anchor{reference/datamodel type mro}@anchor{23bd}
@deffn {Method} type.mro ()

This method can be overridden by a metaclass to customize the method
resolution order for its instances.  It is called at class instantiation,
and its result is stored in @ref{23bb,,__mro__}.
@end deffn

@geindex __subclasses__() (type method)
@anchor{reference/datamodel type __subclasses__}@anchor{794}
@deffn {Method} type.__subclasses__ ()

Each class keeps a list of weak references to its immediate subclasses. This
method returns a list of all those references still alive. The list is in
definition order. Example:

@example
>>> class A: pass
>>> class B(A): pass
>>> A.__subclasses__()
[<class 'B'>]
@end example
@end deffn

@node Class instances,I/O objects also known as file objects,Custom classes,The standard type hierarchy
@anchor{reference/datamodel id4}@anchor{23be}
@subsubsection Class instances


@geindex object; class instance
@geindex object; instance
@geindex class; instance
@geindex class instance; attribute

A class instance is created by calling a class object (see above).  A class
instance has a namespace implemented as a dictionary which is the first place
in which attribute references are searched.  When an attribute is not found
there, and the instance’s class has an attribute by that name, the search
continues with the class attributes.  If a class attribute is found that is a
user-defined function object, it is transformed into an instance method
object whose @ref{15d4,,__self__} attribute is the instance.  Static method and
class method objects are also transformed; see above under “Classes”.  See
section @ref{e4f,,Implementing Descriptors} for another way in which attributes of a class
retrieved via its instances may differ from the objects actually stored in
the class’s @ref{77e,,__dict__}.  If no class attribute is found, and the
object’s class has a @ref{6fb,,__getattr__()} method, that is called to satisfy
the lookup.

@geindex class instance; attribute; assignment

Attribute assignments and deletions update the instance’s dictionary, never a
class’s dictionary.  If the class has a @ref{23bf,,__setattr__()} or
@ref{23c0,,__delattr__()} method, this is called instead of updating the instance
dictionary directly.

@geindex object; numeric
@geindex object; sequence
@geindex object; mapping

Class instances can pretend to be numbers, sequences, or mappings if they have
methods with certain special names.  See section @ref{e6e,,Special method names}.

@menu
* Special attributes: Special attributes<2>. 

@end menu

@node Special attributes<2>,,,Class instances
@anchor{reference/datamodel id5}@anchor{23c1}
@subsubsection Special attributes


@geindex __dict__ (instance attribute)
@geindex __class__ (instance attribute)

@geindex __class__ (object attribute)
@anchor{reference/datamodel object __class__}@anchor{16b9}
@deffn {Attribute} object.__class__

The class to which a class instance belongs.
@end deffn

@geindex __dict__ (object attribute)
@anchor{reference/datamodel object __dict__}@anchor{77e}
@deffn {Attribute} object.__dict__

A dictionary or other mapping object used to store an object’s (writable)
attributes. Not all instances have a @code{__dict__} attribute; see the
section on @ref{23c2,,__slots__} for more details.
@end deffn

@node I/O objects also known as file objects,Internal types,Class instances,The standard type hierarchy
@anchor{reference/datamodel i-o-objects-also-known-as-file-objects}@anchor{23c3}
@subsubsection I/O objects (also known as file objects)


@geindex built-in function; open
@geindex module; io
@geindex popen() (in module os)
@geindex makefile() (socket method)
@geindex sys.stdin
@geindex sys.stdout
@geindex sys.stderr
@geindex stdio
@geindex stdin (in module sys)
@geindex stdout (in module sys)
@geindex stderr (in module sys)

A @ref{13cf,,file object} represents an open file.  Various shortcuts are
available to create file objects: the @ref{318,,open()} built-in function, and
also @ref{31c,,os.popen()}, @ref{23c4,,os.fdopen()}, and the
@ref{13ab,,makefile()} method of socket objects (and perhaps by
other functions or methods provided by extension modules).

File objects implement common methods, listed below, to simplify usage in
generic code. They are expected to be @ref{23c5,,With Statement Context Managers}.

The objects @code{sys.stdin}, @code{sys.stdout} and @code{sys.stderr} are
initialized to file objects corresponding to the interpreter’s standard
input, output and error streams; they are all open in text mode and
therefore follow the interface defined by the @ref{8a6,,io.TextIOBase}
abstract class.

@geindex read() (file method)
@anchor{reference/datamodel file read}@anchor{23c6}
@deffn {Method} file.read (size=-1, /)

Retrieve up to `size' data from the file. As a convenience if `size' is
unspecified or -1 retrieve all data available.
@end deffn

@geindex write() (file method)
@anchor{reference/datamodel file write}@anchor{23c7}
@deffn {Method} file.write (data, /)

Store `data' to the file.
@end deffn

@geindex close() (file method)
@anchor{reference/datamodel file close}@anchor{23c8}
@deffn {Method} file.close ()

Flush any buffers and close the underlying file.
@end deffn

@node Internal types,,I/O objects also known as file objects,The standard type hierarchy
@anchor{reference/datamodel internal-types}@anchor{23c9}
@subsubsection Internal types


@geindex internal type
@geindex types@comma{} internal

A few types used internally by the interpreter are exposed to the user. Their
definitions may change with future versions of the interpreter, but they are
mentioned here for completeness.

@menu
* Code objects:: 
* Frame objects:: 
* Traceback objects:: 
* Slice objects:: 
* Static method objects:: 
* Class method objects:: 

@end menu

@node Code objects,Frame objects,,Internal types
@anchor{reference/datamodel code-objects}@anchor{4e7}@anchor{reference/datamodel id6}@anchor{23ca}
@subsubsection Code objects


@geindex bytecode
@geindex object; code
@geindex code object

Code objects represent `byte-compiled' executable Python code, or @ref{4ab,,bytecode}.
The difference between a code object and a function object is that the function
object contains an explicit reference to the function’s globals (the module in
which it was defined), while a code object contains no context; also the default
argument values are stored in the function object, not in the code object
(because they represent values calculated at run-time).  Unlike function
objects, code objects are immutable and contain no references (directly or
indirectly) to mutable objects.

@geindex co_argcount (code object attribute)
@geindex co_posonlyargcount (code object attribute)
@geindex co_kwonlyargcount (code object attribute)
@geindex co_code (code object attribute)
@geindex co_consts (code object attribute)
@geindex co_filename (code object attribute)
@geindex co_firstlineno (code object attribute)
@geindex co_flags (code object attribute)
@geindex co_lnotab (code object attribute)
@geindex co_name (code object attribute)
@geindex co_names (code object attribute)
@geindex co_nlocals (code object attribute)
@geindex co_stacksize (code object attribute)
@geindex co_varnames (code object attribute)
@geindex co_cellvars (code object attribute)
@geindex co_freevars (code object attribute)
@geindex co_qualname (code object attribute)

@menu
* Special read-only attributes: Special read-only attributes<2>. 
* Methods on code objects:: 

@end menu

@node Special read-only attributes<2>,Methods on code objects,,Code objects
@anchor{reference/datamodel id7}@anchor{23cb}
@subsubsection Special read-only attributes



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@geindex co_name (codeobject attribute)
@anchor{reference/datamodel codeobject co_name}@anchor{23cc}
@deffn {Attribute} codeobject.co_name
@end deffn

@tab

The function name

@item

@geindex co_qualname (codeobject attribute)
@anchor{reference/datamodel codeobject co_qualname}@anchor{23cd}
@deffn {Attribute} codeobject.co_qualname
@end deffn

@tab

The fully qualified function name


Added in version 3.11.


@item

@geindex co_argcount (codeobject attribute)
@anchor{reference/datamodel codeobject co_argcount}@anchor{23ce}
@deffn {Attribute} codeobject.co_argcount
@end deffn

@tab

The total number of positional @ref{238f,,parameters}
(including positional-only parameters and parameters with default values)
that the function has

@item

@geindex co_posonlyargcount (codeobject attribute)
@anchor{reference/datamodel codeobject co_posonlyargcount}@anchor{23cf}
@deffn {Attribute} codeobject.co_posonlyargcount
@end deffn

@tab

The number of positional-only @ref{238f,,parameters}
(including arguments with default values) that the function has

@item

@geindex co_kwonlyargcount (codeobject attribute)
@anchor{reference/datamodel codeobject co_kwonlyargcount}@anchor{23d0}
@deffn {Attribute} codeobject.co_kwonlyargcount
@end deffn

@tab

The number of keyword-only @ref{238f,,parameters}
(including arguments with default values) that the function has

@item

@geindex co_nlocals (codeobject attribute)
@anchor{reference/datamodel codeobject co_nlocals}@anchor{23d1}
@deffn {Attribute} codeobject.co_nlocals
@end deffn

@tab

The number of @ref{238a,,local variables} used by the function
(including parameters)

@item

@geindex co_varnames (codeobject attribute)
@anchor{reference/datamodel codeobject co_varnames}@anchor{23d2}
@deffn {Attribute} codeobject.co_varnames
@end deffn

@tab

A @ref{614,,tuple} containing the names of the local variables in the
function (starting with the parameter names)

@item

@geindex co_cellvars (codeobject attribute)
@anchor{reference/datamodel codeobject co_cellvars}@anchor{23d3}
@deffn {Attribute} codeobject.co_cellvars
@end deffn

@tab

A @ref{614,,tuple} containing the names of @ref{238a,,local variables}
that are referenced from at least one @ref{23d4,,nested scope} inside the function

@item

@geindex co_freevars (codeobject attribute)
@anchor{reference/datamodel codeobject co_freevars}@anchor{238b}
@deffn {Attribute} codeobject.co_freevars
@end deffn

@tab

A @ref{614,,tuple} containing the names of
@ref{18da,,free (closure) variables} that a @ref{23d4,,nested scope}
references in an outer scope. See also @ref{14dc,,function.__closure__}.

Note: references to global and builtin names are `not' included.

@item

@geindex co_code (codeobject attribute)
@anchor{reference/datamodel codeobject co_code}@anchor{23d5}
@deffn {Attribute} codeobject.co_code
@end deffn

@tab

A string representing the sequence of @ref{4ab,,bytecode} instructions in
the function

@item

@geindex co_consts (codeobject attribute)
@anchor{reference/datamodel codeobject co_consts}@anchor{18e2}
@deffn {Attribute} codeobject.co_consts
@end deffn

@tab

A @ref{614,,tuple} containing the literals used by the @ref{4ab,,bytecode} in
the function

@item

@geindex co_names (codeobject attribute)
@anchor{reference/datamodel codeobject co_names}@anchor{23d6}
@deffn {Attribute} codeobject.co_names
@end deffn

@tab

A @ref{614,,tuple} containing the names used by the @ref{4ab,,bytecode} in
the function

@item

@geindex co_filename (codeobject attribute)
@anchor{reference/datamodel codeobject co_filename}@anchor{1579}
@deffn {Attribute} codeobject.co_filename
@end deffn

@tab

The name of the file from which the code was compiled

@item

@geindex co_firstlineno (codeobject attribute)
@anchor{reference/datamodel codeobject co_firstlineno}@anchor{23d7}
@deffn {Attribute} codeobject.co_firstlineno
@end deffn

@tab

The line number of the first line of the function

@item

@geindex co_lnotab (codeobject attribute)
@anchor{reference/datamodel codeobject co_lnotab}@anchor{32e}
@deffn {Attribute} codeobject.co_lnotab
@end deffn

@tab

A string encoding the mapping from @ref{4ab,,bytecode} offsets to line
numbers. For details, see the source code of the interpreter.


Deprecated since version 3.12: This attribute of code objects is deprecated, and may be removed in
Python 3.15.


@item

@geindex co_stacksize (codeobject attribute)
@anchor{reference/datamodel codeobject co_stacksize}@anchor{23d8}
@deffn {Attribute} codeobject.co_stacksize
@end deffn

@tab

The required stack size of the code object

@item

@geindex co_flags (codeobject attribute)
@anchor{reference/datamodel codeobject co_flags}@anchor{1921}
@deffn {Attribute} codeobject.co_flags
@end deffn

@tab

An @ref{19c,,integer} encoding a number of flags for the
interpreter.

@end multitable


@geindex object; generator

The following flag bits are defined for @ref{1921,,co_flags}:
bit @code{0x04} is set if
the function uses the @code{*arguments} syntax to accept an arbitrary number of
positional arguments; bit @code{0x08} is set if the function uses the
@code{**keywords} syntax to accept arbitrary keyword arguments; bit @code{0x20} is set
if the function is a generator. See @ref{23d9,,Code Objects Bit Flags} for details
on the semantics of each flags that might be present.

Future feature declarations (for example, @code{from __future__ import division}) also use bits
in @ref{1921,,co_flags} to indicate whether a code object was compiled with a
particular feature enabled. See @ref{23da,,compiler_flag}.

Other bits in @ref{1921,,co_flags} are reserved for internal use.

@geindex documentation string

If a code object represents a function and has a docstring,
the @ref{23db,,CO_HAS_DOCSTRING} bit is set in @ref{1921,,co_flags}
and the first item in @ref{18e2,,co_consts} is
the docstring of the function.

@node Methods on code objects,,Special read-only attributes<2>,Code objects
@anchor{reference/datamodel methods-on-code-objects}@anchor{23dc}
@subsubsection Methods on code objects


@geindex co_positions() (codeobject method)
@anchor{reference/datamodel codeobject co_positions}@anchor{7d1}
@deffn {Method} codeobject.co_positions ()

Returns an iterable over the source code positions of each @ref{4ab,,bytecode}
instruction in the code object.

The iterator returns @ref{614,,tuple}s containing the @code{(start_line, end_line,
start_column, end_column)}. The `i-th' tuple corresponds to the
position of the source code that compiled to the `i-th' code unit.
Column information is 0-indexed utf-8 byte offsets on the given source
line.

This positional information can be missing. A non-exhaustive lists of
cases where this may happen:


@itemize -

@item 
Running the interpreter with @ref{170,,-X} @code{no_debug_ranges}.

@item 
Loading a pyc file compiled while using @ref{170,,-X} @code{no_debug_ranges}.

@item 
Position tuples corresponding to artificial instructions.

@item 
Line and column numbers that can’t be represented due to
implementation specific limitations.
@end itemize

When this occurs, some or all of the tuple elements can be
@ref{887,,None}.


Added in version 3.11.


@cartouche
@quotation Note 
This feature requires storing column positions in code objects which may
result in a small increase of disk usage of compiled Python files or
interpreter memory usage. To avoid storing the extra information and/or
deactivate printing the extra traceback information, the
@ref{170,,-X} @code{no_debug_ranges} command line flag or the 
@geindex PYTHONNODEBUGRANGES
@geindex environment variable; PYTHONNODEBUGRANGES
@ref{7d4,,PYTHONNODEBUGRANGES}
environment variable can be used.
@end quotation
@end cartouche
@end deffn

@geindex co_lines() (codeobject method)
@anchor{reference/datamodel codeobject co_lines}@anchor{34e}
@deffn {Method} codeobject.co_lines ()

Returns an iterator that yields information about successive ranges of
@ref{4ab,,bytecode}s. Each item yielded is a @code{(start, end, lineno)}
@ref{614,,tuple}:


@itemize *

@item 
@code{start} (an @ref{19c,,int}) represents the offset (inclusive) of the start
of the @ref{4ab,,bytecode} range

@item 
@code{end} (an @ref{19c,,int}) represents the offset (exclusive) of the end of
the @ref{4ab,,bytecode} range

@item 
@code{lineno} is an @ref{19c,,int} representing the line number of the
@ref{4ab,,bytecode} range, or @code{None} if the bytecodes in the given range
have no line number
@end itemize

The items yielded will have the following properties:


@itemize *

@item 
The first range yielded will have a @code{start} of 0.

@item 
The @code{(start, end)} ranges will be non-decreasing and consecutive. That
is, for any pair of @ref{614,,tuple}s, the @code{start} of the second will be
equal to the @code{end} of the first.

@item 
No range will be backwards: @code{end >= start} for all triples.

@item 
The last @ref{614,,tuple} yielded will have @code{end} equal to the size of the
@ref{4ab,,bytecode}.
@end itemize

Zero-width ranges, where @code{start == end}, are allowed. Zero-width ranges
are used for lines that are present in the source code, but have been
eliminated by the @ref{4ab,,bytecode} compiler.


Added in version 3.10.



@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 626

@item PEP 626@footnote{https://peps.python.org/pep-0626/} - Precise line numbers for debugging and other tools.

The PEP that introduced the @code{co_lines()} method.
@end table

@end deffn

@geindex replace() (codeobject method)
@anchor{reference/datamodel codeobject replace}@anchor{23dd}
@deffn {Method} codeobject.replace (**kwargs)

Return a copy of the code object with new values for the specified fields.

Code objects are also supported by the generic function @ref{1c2,,copy.replace()}.


Added in version 3.8.

@end deffn

@node Frame objects,Traceback objects,Code objects,Internal types
@anchor{reference/datamodel frame-objects}@anchor{8f1}@anchor{reference/datamodel id8}@anchor{23de}
@subsubsection Frame objects


@geindex object; frame

Frame objects represent execution frames.  They may occur in
@ref{cf2,,traceback objects},
and are also passed to registered trace functions.

@geindex f_back (frame attribute)
@geindex f_code (frame attribute)
@geindex f_globals (frame attribute)
@geindex f_locals (frame attribute)
@geindex f_lasti (frame attribute)
@geindex f_builtins (frame attribute)
@geindex f_generator (frame attribute)

@menu
* Special read-only attributes: Special read-only attributes<3>. 
* Special writable attributes: Special writable attributes<2>. 
* Frame object methods:: 

@end menu

@node Special read-only attributes<3>,Special writable attributes<2>,,Frame objects
@anchor{reference/datamodel id9}@anchor{23df}
@subsubsection Special read-only attributes



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@geindex f_back (frame attribute)
@anchor{reference/datamodel frame f_back}@anchor{994}
@deffn {Attribute} frame.f_back
@end deffn

@tab

Points to the previous stack frame (towards the caller),
or @code{None} if this is the bottom stack frame

@item

@geindex f_code (frame attribute)
@anchor{reference/datamodel frame f_code}@anchor{23e0}
@deffn {Attribute} frame.f_code
@end deffn

@tab

The @ref{4e7,,code object} being executed in this frame.
Accessing this attribute raises an @ref{1cb1,,auditing event}
@code{object.__getattr__} with arguments @code{obj} and @code{"f_code"}.

@item

@geindex f_locals (frame attribute)
@anchor{reference/datamodel frame f_locals}@anchor{4a6}
@deffn {Attribute} frame.f_locals
@end deffn

@tab

The mapping used by the frame to look up
@ref{238a,,local variables}.
If the frame refers to an @ref{4a2,,optimized scope},
this may return a write-through proxy object.


Changed in version 3.13: Return a proxy for optimized scopes.


@item

@geindex f_globals (frame attribute)
@anchor{reference/datamodel frame f_globals}@anchor{23e1}
@deffn {Attribute} frame.f_globals
@end deffn

@tab

The dictionary used by the frame to look up
@ref{238a,,global variables}

@item

@geindex f_builtins (frame attribute)
@anchor{reference/datamodel frame f_builtins}@anchor{23e2}
@deffn {Attribute} frame.f_builtins
@end deffn

@tab

The dictionary used by the frame to look up
@ref{238a,,built-in (intrinsic) names}

@item

@geindex f_lasti (frame attribute)
@anchor{reference/datamodel frame f_lasti}@anchor{a8e}
@deffn {Attribute} frame.f_lasti
@end deffn

@tab

The “precise instruction” of the frame object
(this is an index into the @ref{4ab,,bytecode} string of the
@ref{4e7,,code object})

@item

@geindex f_generator (frame attribute)
@anchor{reference/datamodel frame f_generator}@anchor{23e3}
@deffn {Attribute} frame.f_generator
@end deffn

@tab

The @ref{1267,,generator} or @ref{6ba,,coroutine} object that owns this frame,
or @code{None} if the frame is a normal function.


Added in version 3.14.


@end multitable


@geindex f_trace (frame attribute)
@geindex f_trace_lines (frame attribute)
@geindex f_trace_opcodes (frame attribute)
@geindex f_lineno (frame attribute)

@node Special writable attributes<2>,Frame object methods,Special read-only attributes<3>,Frame objects
@anchor{reference/datamodel id10}@anchor{23e4}
@subsubsection Special writable attributes



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@geindex f_trace (frame attribute)
@anchor{reference/datamodel frame f_trace}@anchor{23e5}
@deffn {Attribute} frame.f_trace
@end deffn

@tab

If not @code{None}, this is a function called for various events during
code execution (this is used by debuggers). Normally an event is
triggered for each new source line (see @ref{ddc,,f_trace_lines}).

@item

@geindex f_trace_lines (frame attribute)
@anchor{reference/datamodel frame f_trace_lines}@anchor{ddc}
@deffn {Attribute} frame.f_trace_lines
@end deffn

@tab

Set this attribute to @ref{d31,,False} to disable triggering a tracing
event for each source line.

@item

@geindex f_trace_opcodes (frame attribute)
@anchor{reference/datamodel frame f_trace_opcodes}@anchor{ddd}
@deffn {Attribute} frame.f_trace_opcodes
@end deffn

@tab

Set this attribute to @ref{e0d,,True} to allow per-opcode events to be
requested. Note that this may lead to
undefined interpreter behaviour if exceptions raised by the trace
function escape to the function being traced.

@item

@geindex f_lineno (frame attribute)
@anchor{reference/datamodel frame f_lineno}@anchor{9b5}
@deffn {Attribute} frame.f_lineno
@end deffn

@tab

The current line number of the frame – writing to this
from within a trace function jumps to the given line (only for the bottom-most
frame).  A debugger can implement a Jump command (aka Set Next Statement)
by writing to this attribute.

@end multitable


@node Frame object methods,,Special writable attributes<2>,Frame objects
@anchor{reference/datamodel frame-object-methods}@anchor{23e6}
@subsubsection Frame object methods


Frame objects support one method:

@geindex clear() (frame method)
@anchor{reference/datamodel frame clear}@anchor{585}
@deffn {Method} frame.clear ()

This method clears all references to @ref{238a,,local variables} held by the
frame.  Also, if the frame belonged to a @ref{1267,,generator}, the generator
is finalized.  This helps break reference cycles involving frame
objects (for example when catching an @ref{1c6a,,exception}
and storing its @ref{cf2,,traceback} for later use).

@ref{246,,RuntimeError} is raised if the frame is currently executing
or suspended.


Added in version 3.4.



Changed in version 3.13: Attempting to clear a suspended frame raises @ref{246,,RuntimeError}
(as has always been the case for executing frames).

@end deffn

@node Traceback objects,Slice objects,Frame objects,Internal types
@anchor{reference/datamodel id11}@anchor{23e7}@anchor{reference/datamodel traceback-objects}@anchor{cf2}
@subsubsection Traceback objects


@geindex object; traceback
@geindex stack; trace
@geindex exception; handler
@geindex execution; stack
@geindex exc_info (in module sys)
@geindex last_traceback (in module sys)
@geindex sys.exc_info
@geindex sys.exception
@geindex sys.last_traceback

Traceback objects represent the stack trace of an @ref{20b6,,exception}.
A traceback object
is implicitly created when an exception occurs, and may also be explicitly
created by calling @ref{cf0,,types.TracebackType}.


Changed in version 3.7: Traceback objects can now be explicitly instantiated from Python code.


For implicitly created tracebacks, when the search for an exception handler
unwinds the execution stack, at each unwound level a traceback object is
inserted in front of the current traceback.  When an exception handler is
entered, the stack trace is made available to the program. (See section
@ref{8fa,,The try statement}.) It is accessible as the third item of the
tuple returned by @ref{89c,,sys.exc_info()}, and as the
@ref{14d2,,__traceback__} attribute
of the caught exception.

When the program contains no suitable
handler, the stack trace is written (nicely formatted) to the standard error
stream; if the interpreter is interactive, it is also made available to the user
as @ref{6e9,,sys.last_traceback}.

For explicitly created tracebacks, it is up to the creator of the traceback
to determine how the @ref{cf1,,tb_next} attributes should be linked to
form a full stack trace.

@geindex tb_frame (traceback attribute)
@geindex tb_lineno (traceback attribute)
@geindex tb_lasti (traceback attribute)
@geindex statement; try

Special read-only attributes:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@geindex tb_frame (traceback attribute)
@anchor{reference/datamodel traceback tb_frame}@anchor{23e8}
@deffn {Attribute} traceback.tb_frame
@end deffn

@tab

Points to the execution @ref{8f1,,frame} of the current
level.

Accessing this attribute raises an
@ref{1cb1,,auditing event} @code{object.__getattr__} with arguments
@code{obj} and @code{"tb_frame"}.

@item

@geindex tb_lineno (traceback attribute)
@anchor{reference/datamodel traceback tb_lineno}@anchor{23e9}
@deffn {Attribute} traceback.tb_lineno
@end deffn

@tab

Gives the line number where the exception occurred

@item

@geindex tb_lasti (traceback attribute)
@anchor{reference/datamodel traceback tb_lasti}@anchor{23ea}
@deffn {Attribute} traceback.tb_lasti
@end deffn

@tab

Indicates the “precise instruction”.

@end multitable


The line number and last instruction in the traceback may differ from the
line number of its @ref{8f1,,frame object} if the exception
occurred in a
@ref{8fa,,try} statement with no matching except clause or with a
@ref{1b1,,finally} clause.

@geindex tb_next (traceback attribute)

@geindex tb_next (traceback attribute)
@anchor{reference/datamodel traceback tb_next}@anchor{cf1}
@deffn {Attribute} traceback.tb_next

The special writable attribute @code{tb_next} is the next level in the
stack trace (towards the frame where the exception occurred), or @code{None} if
there is no next level.


Changed in version 3.7: This attribute is now writable

@end deffn

@node Slice objects,Static method objects,Traceback objects,Internal types
@anchor{reference/datamodel slice-objects}@anchor{23eb}
@subsubsection Slice objects


@geindex built-in function; slice

Slice objects are used to represent slices for
@ref{588,,__getitem__()}
methods.  They are also created by the built-in @ref{695,,slice()} function.

@geindex start (slice object attribute)
@geindex stop (slice object attribute)
@geindex step (slice object attribute)

Special read-only attributes: @ref{23ec,,start} is the lower bound;
@ref{23ed,,stop} is the upper bound; @ref{23ee,,step} is the step
value; each is @code{None} if omitted.  These attributes can have any type.

Slice objects support one method:

@geindex indices() (slice method)
@anchor{reference/datamodel slice indices}@anchor{122d}
@deffn {Method} slice.indices (self, length)

This method takes a single integer argument `length' and computes
information about the slice that the slice object would describe if
applied to a sequence of `length' items.  It returns a tuple of three
integers; respectively these are the `start' and `stop' indices and the
`step' or stride length of the slice. Missing or out-of-bounds indices
are handled in a manner consistent with regular slices.
@end deffn

@node Static method objects,Class method objects,Slice objects,Internal types
@anchor{reference/datamodel static-method-objects}@anchor{23ef}
@subsubsection Static method objects


Static method objects provide a way of defeating the transformation of function
objects to method objects described above. A static method object is a wrapper
around any other object, usually a user-defined method object. When a static
method object is retrieved from a class or a class instance, the object actually
returned is the wrapped object, which is not subject to any further
transformation. Static method objects are also callable. Static method
objects are created by the built-in @ref{451,,staticmethod()} constructor.

@node Class method objects,,Static method objects,Internal types
@anchor{reference/datamodel class-method-objects}@anchor{23f0}
@subsubsection Class method objects


A class method object, like a static method object, is a wrapper around another
object that alters the way in which that object is retrieved from classes and
class instances. The behaviour of class method objects upon such retrieval is
described above, under @ref{20eb,,“instance methods”}. Class method objects are created
by the built-in @ref{48f,,classmethod()} constructor.

@node Special method names,Coroutines,The standard type hierarchy,Data model
@anchor{reference/datamodel special-method-names}@anchor{23f1}@anchor{reference/datamodel specialnames}@anchor{e6e}
@subsection Special method names


@geindex operator; overloading
@geindex __getitem__() (mapping object method)

A class can implement certain operations that are invoked by special syntax
(such as arithmetic operations or subscripting and slicing) by defining methods
with special names. This is Python’s approach to `operator overloading',
allowing classes to define their own behavior with respect to language
operators.  For instance, if a class defines a method named
@ref{588,,__getitem__()},
and @code{x} is an instance of this class, then @code{x[i]} is roughly equivalent
to @code{type(x).__getitem__(x, i)}.  Except where mentioned, attempts to execute an
operation raise an exception when no appropriate method is defined (typically
@ref{5f0,,AttributeError} or @ref{199,,TypeError}).

Setting a special method to @code{None} indicates that the corresponding
operation is not available.  For example, if a class sets
@ref{e6f,,__iter__()} to @code{None}, the class is not iterable, so calling
@ref{9dd,,iter()} on its instances will raise a @ref{199,,TypeError} (without
falling back to @ref{588,,__getitem__()}). @footnote{
The @ref{cf9,,__hash__()}, @ref{e6f,,__iter__()},
@ref{e8c,,__reversed__()}, @ref{15c5,,__contains__()},
@ref{948,,__class_getitem__()} and @ref{e52,,__fspath__()}
methods have special handling for this. Others
will still raise a @ref{199,,TypeError}, but may do so by relying on
the behavior that @code{None} is not callable.
}

When implementing a class that emulates any built-in type, it is important that
the emulation only be implemented to the degree that it makes sense for the
object being modelled.  For example, some sequences may work well with retrieval
of individual elements, but extracting a slice may not make sense.
(One example of this is the @ref{23f2,,NodeList} interface
in the W3C’s Document Object Model.)

@menu
* Basic customization:: 
* Customizing attribute access:: 
* Customizing class creation:: 
* Customizing instance and subclass checks:: 
* Emulating generic types:: 
* Emulating callable objects:: 
* Emulating container types:: 
* Emulating numeric types:: 
* With Statement Context Managers:: 
* Customizing positional arguments in class pattern matching:: 
* Emulating buffer types:: 
* Annotations:: 
* Special method lookup:: 

@end menu

@node Basic customization,Customizing attribute access,,Special method names
@anchor{reference/datamodel basic-customization}@anchor{23f3}@anchor{reference/datamodel customization}@anchor{23f4}
@subsubsection Basic customization


@geindex __new__() (object method)
@anchor{reference/datamodel object __new__}@anchor{7a1}
@deffn {Method} object.__new__ (cls[, ...])

@geindex subclassing; immutable types

Called to create a new instance of class `cls'.  @code{__new__()} is a static
method (special-cased so you need not declare it as such) that takes the class
of which an instance was requested as its first argument.  The remaining
arguments are those passed to the object constructor expression (the call to the
class).  The return value of @code{__new__()} should be the new object instance
(usually an instance of `cls').

Typical implementations create a new instance of the class by invoking the
superclass’s @code{__new__()} method using @code{super().__new__(cls[, ...])}
with appropriate arguments and then modifying the newly created instance
as necessary before returning it.

If @code{__new__()} is invoked during object construction and it returns an
instance of `cls', then the new instance’s @ref{8c1,,__init__()} method
will be invoked like @code{__init__(self[, ...])}, where `self' is the new instance
and the remaining arguments are the same as were passed to the object constructor.

If @code{__new__()} does not return an instance of `cls', then the new instance’s
@ref{8c1,,__init__()} method will not be invoked.

@code{__new__()} is intended mainly to allow subclasses of immutable types (like
int, str, or tuple) to customize instance creation.  It is also commonly
overridden in custom metaclasses in order to customize class creation.
@end deffn

@geindex __init__() (object method)
@anchor{reference/datamodel object __init__}@anchor{8c1}
@deffn {Method} object.__init__ (self[, ...])

@geindex class; constructor

Called after the instance has been created (by @ref{7a1,,__new__()}), but before
it is returned to the caller.  The arguments are those passed to the
class constructor expression.  If a base class has an @code{__init__()}
method, the derived class’s @code{__init__()} method, if any, must explicitly
call it to ensure proper initialization of the base class part of the
instance; for example: @code{super().__init__([args...])}.

Because @ref{7a1,,__new__()} and @code{__init__()} work together in constructing
objects (@code{__new__()} to create it, and @code{__init__()} to customize it),
no non-@code{None} value may be returned by @code{__init__()}; doing so will
cause a @ref{199,,TypeError} to be raised at runtime.
@end deffn

@geindex __del__() (object method)
@anchor{reference/datamodel object __del__}@anchor{1203}
@deffn {Method} object.__del__ (self)

@geindex destructor
@geindex finalizer
@geindex statement; del

Called when the instance is about to be destroyed.  This is also called a
finalizer or (improperly) a destructor.  If a base class has a
@code{__del__()} method, the derived class’s @code{__del__()} method,
if any, must explicitly call it to ensure proper deletion of the base
class part of the instance.

It is possible (though not recommended!) for the @code{__del__()} method
to postpone destruction of the instance by creating a new reference to
it.  This is called object `resurrection'.  It is implementation-dependent
whether @code{__del__()} is called a second time when a resurrected object
is about to be destroyed; the current @ref{907,,CPython} implementation
only calls it once.

It is not guaranteed that @code{__del__()} methods are called for objects
that still exist when the interpreter exits.
@ref{c75,,weakref.finalize} provides a straightforward way to register
a cleanup function to be called when an object is garbage collected.

@cartouche
@quotation Note 
@code{del x} doesn’t directly call @code{x.__del__()} — the former decrements
the reference count for @code{x} by one, and the latter is only called when
@code{x}’s reference count reaches zero.
@end quotation
@end cartouche

`CPython implementation detail:' It is possible for a reference cycle to prevent the reference count
of an object from going to zero.  In this case, the cycle will be
later detected and deleted by the @ref{1826,,cyclic garbage collector}.  A common cause of reference cycles is when
an exception has been caught in a local variable.  The frame’s
locals then reference the exception, which references its own
traceback, which references the locals of all frames caught in the
traceback.


@subsubheading See also


Documentation for the @ref{64,,gc} module.


@cartouche
@quotation Warning 
Due to the precarious circumstances under which @code{__del__()} methods are
invoked, exceptions that occur during their execution are ignored, and a warning
is printed to @code{sys.stderr} instead.  In particular:


@itemize *

@item 
@code{__del__()} can be invoked when arbitrary code is being executed,
including from any arbitrary thread.  If @code{__del__()} needs to take
a lock or invoke any other blocking resource, it may deadlock as
the resource may already be taken by the code that gets interrupted
to execute @code{__del__()}.

@item 
@code{__del__()} can be executed during interpreter shutdown.  As a
consequence, the global variables it needs to access (including other
modules) may already have been deleted or set to @code{None}. Python
guarantees that globals whose name begins with a single underscore
are deleted from their module before other globals are deleted; if
no other references to such globals exist, this may help in assuring
that imported modules are still available at the time when the
@code{__del__()} method is called.
@end itemize
@end quotation
@end cartouche

@geindex repr() (built-in function); __repr__() (object method)
@end deffn

@geindex __repr__() (object method)
@anchor{reference/datamodel object __repr__}@anchor{830}
@deffn {Method} object.__repr__ (self)

Called by the @ref{1c3,,repr()} built-in function to compute the “official” string
representation of an object.  If at all possible, this should look like a
valid Python expression that could be used to recreate an object with the
same value (given an appropriate environment).  If this is not possible, a
string of the form @code{<...some useful description...>} should be returned.
The return value must be a string object. If a class defines @code{__repr__()}
but not @ref{831,,__str__()}, then @code{__repr__()} is also used when an
“informal” string representation of instances of that class is required.

This is typically used for debugging, so it is important that the representation
is information-rich and unambiguous. A default implementation is provided by the
@ref{c84,,object} class itself.

@geindex string; __str__() (object method)
@geindex format() (built-in function); __str__() (object method)
@geindex print() (built-in function); __str__() (object method)
@end deffn

@geindex __str__() (object method)
@anchor{reference/datamodel object __str__}@anchor{831}
@deffn {Method} object.__str__ (self)

Called by @ref{16a,,str(object)}, the default @ref{832,,__format__()} implementation,
and the built-in function @ref{117b,,print()}, to compute the “informal” or nicely
printable string representation of an object.  The return value must be a
@ref{2023,,str} object.

This method differs from @ref{830,,object.__repr__()} in that there is no
expectation that @code{__str__()} return a valid Python expression: a more
convenient or concise representation can be used.

The default implementation defined by the built-in type @ref{c84,,object}
calls @ref{830,,object.__repr__()}.

@c XXX what about subclasses of string?
@end deffn

@geindex __bytes__() (object method)
@anchor{reference/datamodel object __bytes__}@anchor{7ff}
@deffn {Method} object.__bytes__ (self)

@geindex built-in function; bytes

Called by @ref{1edc,,bytes} to compute a byte-string representation
of an object. This should return a @ref{193,,bytes} object. The @ref{c84,,object}
class itself does not provide this method.

@geindex string; __format__() (object method)
@geindex string; conversion
@geindex built-in function; print
@end deffn

@geindex __format__() (object method)
@anchor{reference/datamodel object __format__}@anchor{832}
@deffn {Method} object.__format__ (self, format_spec)

Called by the @ref{19a,,format()} built-in function,
and by extension, evaluation of @ref{19b,,formatted string literals} and the @ref{834,,str.format()} method, to produce a “formatted”
string representation of an object. The `format_spec' argument is
a string that contains a description of the formatting options desired.
The interpretation of the `format_spec' argument is up to the type
implementing @code{__format__()}, however most classes will either
delegate formatting to one of the built-in types, or use a similar
formatting option syntax.

See @ref{4fa,,Format specification mini-language} for a description of the standard formatting syntax.

The return value must be a string object.

The default implementation by the @ref{c84,,object} class should be given
an empty `format_spec' string. It delegates to @ref{831,,__str__()}.


Changed in version 3.4: The __format__ method of @code{object} itself raises a @ref{199,,TypeError}
if passed any non-empty string.



Changed in version 3.7: @code{object.__format__(x, '@w{'})} is now equivalent to @code{str(x)} rather
than @code{format(str(x), '@w{'})}.

@end deffn

@geindex __lt__() (object method)
@geindex __le__() (object method)
@geindex __eq__() (object method)
@geindex __ne__() (object method)
@geindex __gt__() (object method)
@geindex __ge__() (object method)
@anchor{reference/datamodel richcmpfuncs}@anchor{23f5}@anchor{reference/datamodel object __lt__}@anchor{14ac}
@deffn {Method} object.__lt__ (self, other)
@anchor{reference/datamodel object __le__}@anchor{1516}
@deffnx {Method} object.__le__ (self, other)
@anchor{reference/datamodel object __eq__}@anchor{cf8}
@deffnx {Method} object.__eq__ (self, other)
@anchor{reference/datamodel object __ne__}@anchor{1723}
@deffnx {Method} object.__ne__ (self, other)
@anchor{reference/datamodel object __gt__}@anchor{1517}
@deffnx {Method} object.__gt__ (self, other)
@anchor{reference/datamodel object __ge__}@anchor{1518}
@deffnx {Method} object.__ge__ (self, other)

@geindex comparisons

These are the so-called “rich comparison” methods. The correspondence between
operator symbols and method names is as follows: @code{x<y} calls @code{x.__lt__(y)},
@code{x<=y} calls @code{x.__le__(y)}, @code{x==y} calls @code{x.__eq__(y)}, @code{x!=y} calls
@code{x.__ne__(y)}, @code{x>y} calls @code{x.__gt__(y)}, and @code{x>=y} calls
@code{x.__ge__(y)}.

A rich comparison method may return the singleton @ref{1a3,,NotImplemented} if it does
not implement the operation for a given pair of arguments. By convention,
@code{False} and @code{True} are returned for a successful comparison. However, these
methods can return any value, so if the comparison operator is used in a Boolean
context (e.g., in the condition of an @code{if} statement), Python will call
@ref{3c1,,bool()} on the value to determine if the result is true or false.

By default, @code{object} implements @code{__eq__()} by using @code{is}, returning
@ref{1a3,,NotImplemented} in the case of a false comparison:
@code{True if x is y else NotImplemented}. For @code{__ne__()}, by default it
delegates to @code{__eq__()} and inverts the result unless it is
@code{NotImplemented}.  There are no other implied relationships among the
comparison operators or default implementations; for example, the truth of
@code{(x<y or x==y)} does not imply @code{x<=y}. To automatically generate ordering
operations from a single root operation, see @ref{1148,,functools.total_ordering()}.

By default, the @ref{c84,,object} class provides implementations consistent
with @ref{1c63,,Value comparisons}: equality compares according to
object identity, and order comparisons raise @ref{199,,TypeError}. Each default
method may generate these results directly, but may also return
@ref{1a3,,NotImplemented}.

See the paragraph on @ref{cf9,,__hash__()} for
some important notes on creating @ref{825,,hashable} objects which support
custom comparison operations and are usable as dictionary keys.

There are no swapped-argument versions of these methods (to be used when the
left argument does not support the operation but the right argument does);
rather, @code{__lt__()} and @code{__gt__()} are each other’s reflection,
@code{__le__()} and @code{__ge__()} are each other’s reflection, and
@code{__eq__()} and @code{__ne__()} are their own reflection.
If the operands are of different types, and the right operand’s type is
a direct or indirect subclass of the left operand’s type,
the reflected method of the right operand has priority, otherwise
the left operand’s method has priority.  Virtual subclassing is
not considered.

When no appropriate method returns any value other than @ref{1a3,,NotImplemented}, the
@code{==} and @code{!=} operators will fall back to @code{is} and @code{is not}, respectively.
@end deffn

@geindex __hash__() (object method)
@anchor{reference/datamodel object __hash__}@anchor{cf9}
@deffn {Method} object.__hash__ (self)

@geindex object; dictionary
@geindex built-in function; hash

Called by built-in function @ref{802,,hash()} and for operations on members of
hashed collections including @ref{185,,set}, @ref{7f3,,frozenset}, and
@ref{184,,dict}.  The @code{__hash__()} method should return an integer. The only required
property is that objects which compare equal have the same hash value; it is
advised to mix together the hash values of the components of the object that
also play a part in comparison of objects by packing them into a tuple and
hashing the tuple. Example:

@example
def __hash__(self):
    return hash((self.name, self.nick, self.color))
@end example

@cartouche
@quotation Note 
@ref{802,,hash()} truncates the value returned from an object’s custom
@code{__hash__()} method to the size of a @ref{c5b,,Py_ssize_t}.  This is
typically 8 bytes on 64-bit builds and 4 bytes on 32-bit builds.  If an
object’s   @code{__hash__()} must interoperate on builds of different bit
sizes, be sure to check the width on all supported builds.  An easy way
to do this is with
@code{python -c "import sys; print(sys.hash_info.width)"}.
@end quotation
@end cartouche

If a class does not define an @ref{cf8,,__eq__()} method it should not define a
@code{__hash__()} operation either; if it defines @code{__eq__()} but not
@code{__hash__()}, its instances will not be usable as items in hashable
collections.  If a class defines mutable objects and implements an
@code{__eq__()} method, it should not implement @code{__hash__()}, since the
implementation of @ref{825,,hashable} collections requires that a key’s hash value is
immutable (if the object’s hash value changes, it will be in the wrong hash
bucket).

User-defined classes have @ref{cf8,,__eq__()} and @code{__hash__()} methods
by default (inherited from the @ref{c84,,object} class); with them, all objects compare
unequal (except with themselves) and @code{x.__hash__()} returns an appropriate
value such that @code{x == y} implies both that @code{x is y} and @code{hash(x) == hash(y)}.

A class that overrides @ref{cf8,,__eq__()} and does not define @code{__hash__()}
will have its @code{__hash__()} implicitly set to @code{None}.  When the
@code{__hash__()} method of a class is @code{None}, instances of the class will
raise an appropriate @ref{199,,TypeError} when a program attempts to retrieve
their hash value, and will also be correctly identified as unhashable when
checking @code{isinstance(obj, collections.abc.Hashable)}.

If a class that overrides @ref{cf8,,__eq__()} needs to retain the implementation
of @code{__hash__()} from a parent class, the interpreter must be told this
explicitly by setting @code{__hash__ = <ParentClass>.__hash__}.

If a class that does not override @ref{cf8,,__eq__()} wishes to suppress hash
support, it should include @code{__hash__ = None} in the class definition.
A class which defines its own @code{__hash__()} that explicitly raises
a @ref{199,,TypeError} would be incorrectly identified as hashable by
an @code{isinstance(obj, collections.abc.Hashable)} call.

@cartouche
@quotation Note 
By default, the @code{__hash__()} values of str and bytes objects are
“salted” with an unpredictable random value.  Although they
remain constant within an individual Python process, they are not
predictable between repeated invocations of Python.

This is intended to provide protection against a denial-of-service caused
by carefully chosen inputs that exploit the worst case performance of a
dict insertion, `O'(`n'@w{^2}) complexity.  See
@indicateurl{https://ocert.org/advisories/ocert-2011-003.html} for details.

Changing hash values affects the iteration order of sets.
Python has never made guarantees about this ordering
(and it typically varies between 32-bit and 64-bit builds).

See also 
@geindex PYTHONHASHSEED
@geindex environment variable; PYTHONHASHSEED
@ref{1283,,PYTHONHASHSEED}.
@end quotation
@end cartouche


Changed in version 3.3: Hash randomization is enabled by default.

@end deffn

@geindex __bool__() (object method)
@anchor{reference/datamodel object __bool__}@anchor{14e1}
@deffn {Method} object.__bool__ (self)

@geindex __len__() (mapping object method)

Called to implement truth value testing and the built-in operation
@code{bool()}; should return @code{False} or @code{True}.  When this method is not
defined, @ref{17e1,,__len__()} is called, if it is defined, and the object is
considered true if its result is nonzero.  If a class defines neither
@code{__len__()} nor @code{__bool__()} (which is true of the @ref{c84,,object}
class itself), all its instances are considered true.
@end deffn

@node Customizing attribute access,Customizing class creation,Basic customization,Special method names
@anchor{reference/datamodel attribute-access}@anchor{23f6}@anchor{reference/datamodel customizing-attribute-access}@anchor{23f7}
@subsubsection Customizing attribute access


The following methods can be defined to customize the meaning of attribute
access (use of, assignment to, or deletion of @code{x.name}) for class instances.

@c XXX explain how descriptors interfere here!

@geindex __getattr__() (object method)
@anchor{reference/datamodel object __getattr__}@anchor{6fb}
@deffn {Method} object.__getattr__ (self, name)

Called when the default attribute access fails with an @ref{5f0,,AttributeError}
(either @ref{dd1,,__getattribute__()} raises an @code{AttributeError} because
`name' is not an instance attribute or an attribute in the class tree
for @code{self}; or @ref{16f4,,__get__()} of a `name' property raises
@code{AttributeError}).  This method should either return the (computed)
attribute value or raise an @code{AttributeError} exception.
The @ref{c84,,object} class itself does not provide this method.

Note that if the attribute is found through the normal mechanism,
@code{__getattr__()} is not called.  (This is an intentional asymmetry between
@code{__getattr__()} and @ref{23bf,,__setattr__()}.) This is done both for efficiency
reasons and because otherwise @code{__getattr__()} would have no way to access
other attributes of the instance.  Note that at least for instance variables,
you can take total control by not inserting any values in the instance attribute
dictionary (but instead inserting them in another object).  See the
@ref{dd1,,__getattribute__()} method below for a way to actually get total control
over attribute access.
@end deffn

@geindex __getattribute__() (object method)
@anchor{reference/datamodel object __getattribute__}@anchor{dd1}
@deffn {Method} object.__getattribute__ (self, name)

Called unconditionally to implement attribute accesses for instances of the
class. If the class also defines @ref{6fb,,__getattr__()}, the latter will not be
called unless @code{__getattribute__()} either calls it explicitly or raises an
@ref{5f0,,AttributeError}. This method should return the (computed) attribute value
or raise an @code{AttributeError} exception. In order to avoid infinite
recursion in this method, its implementation should always call the base class
method with the same name to access any attributes it needs, for example,
@code{object.__getattribute__(self, name)}.

@cartouche
@quotation Note 
This method may still be bypassed when looking up special methods as the
result of implicit invocation via language syntax or
@ref{2392,,built-in functions}.
See @ref{23f8,,Special method lookup}.
@end quotation
@end cartouche


For certain sensitive attribute accesses, raises an
@ref{1cb1,,auditing event} @code{object.__getattr__} with arguments
@code{obj} and @code{name}.

@end deffn

@geindex __setattr__() (object method)
@anchor{reference/datamodel object __setattr__}@anchor{23bf}
@deffn {Method} object.__setattr__ (self, name, value)

Called when an attribute assignment is attempted.  This is called instead of
the normal mechanism (i.e. store the value in the instance dictionary).
`name' is the attribute name, `value' is the value to be assigned to it.

If @code{__setattr__()} wants to assign to an instance attribute, it should
call the base class method with the same name, for example,
@code{object.__setattr__(self, name, value)}.


For certain sensitive attribute assignments, raises an
@ref{1cb1,,auditing event} @code{object.__setattr__} with arguments
@code{obj}, @code{name}, @code{value}.

@end deffn

@geindex __delattr__() (object method)
@anchor{reference/datamodel object __delattr__}@anchor{23c0}
@deffn {Method} object.__delattr__ (self, name)

Like @ref{23bf,,__setattr__()} but for attribute deletion instead of assignment.  This
should only be implemented if @code{del obj.name} is meaningful for the object.


For certain sensitive attribute deletions, raises an
@ref{1cb1,,auditing event} @code{object.__delattr__} with arguments
@code{obj} and @code{name}.

@end deffn

@geindex __dir__() (object method)
@anchor{reference/datamodel object __dir__}@anchor{17b9}
@deffn {Method} object.__dir__ (self)

Called when @ref{845,,dir()} is called on the object. An iterable must be
returned. @code{dir()} converts the returned iterable to a list and sorts it.
@end deffn

@menu
* Customizing module attribute access:: 
* Implementing Descriptors:: 
* Invoking Descriptors:: 
* __slots__: __slots__<2>. 

@end menu

@node Customizing module attribute access,Implementing Descriptors,,Customizing attribute access
@anchor{reference/datamodel customizing-module-attribute-access}@anchor{23f9}
@subsubsection Customizing module attribute access


@geindex __getattr__ (module attribute)
@geindex __dir__ (module attribute)
@geindex __class__ (module attribute)

@geindex __getattr__() (module method)
@geindex __dir__() (module method)
@anchor{reference/datamodel module __getattr__}@anchor{cde}
@deffn {Method} module.__getattr__ ()
@anchor{reference/datamodel module __dir__}@anchor{cdf}
@deffnx {Method} module.__dir__ ()
@end deffn

Special names @code{__getattr__} and @code{__dir__} can be also used to customize
access to module attributes. The @code{__getattr__} function at the module level
should accept one argument which is the name of an attribute and return the
computed value or raise an @ref{5f0,,AttributeError}. If an attribute is
not found on a module object through the normal lookup, i.e.
@ref{dd1,,object.__getattribute__()}, then @code{__getattr__} is searched in
the module @code{__dict__} before raising an @code{AttributeError}. If found,
it is called with the attribute name and the result is returned.

The @code{__dir__} function should accept no arguments, and return an iterable of
strings that represents the names accessible on module. If present, this
function overrides the standard @ref{845,,dir()} search on a module.

@geindex __class__ (module attribute)
@anchor{reference/datamodel module __class__}@anchor{23fa}
@deffn {Attribute} module.__class__
@end deffn

For a more fine grained customization of the module behavior (setting
attributes, properties, etc.), one can set the @code{__class__} attribute of
a module object to a subclass of @ref{101a,,types.ModuleType}. For example:

@example
import sys
from types import ModuleType

class VerboseModule(ModuleType):
    def __repr__(self):
        return f'Verbose @{self.__name__@}'

    def __setattr__(self, attr, value):
        print(f'Setting @{attr@}...')
        super().__setattr__(attr, value)

sys.modules[__name__].__class__ = VerboseModule
@end example

@cartouche
@quotation Note 
Defining module @code{__getattr__} and setting module @code{__class__} only
affect lookups made using the attribute access syntax – directly accessing
the module globals (whether by code within the module, or via a reference
to the module’s globals dictionary) is unaffected.
@end quotation
@end cartouche


Changed in version 3.5: @code{__class__} module attribute is now writable.



Added in version 3.7: @code{__getattr__} and @code{__dir__} module attributes.



@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 562

@item PEP 562@footnote{https://peps.python.org/pep-0562/} - Module __getattr__ and __dir__

Describes the @code{__getattr__} and @code{__dir__} functions on modules.
@end table


@node Implementing Descriptors,Invoking Descriptors,Customizing module attribute access,Customizing attribute access
@anchor{reference/datamodel descriptors}@anchor{e4f}@anchor{reference/datamodel implementing-descriptors}@anchor{23fb}
@subsubsection Implementing Descriptors


The following methods only apply when an instance of the class containing the
method (a so-called `descriptor' class) appears in an `owner' class (the
descriptor must be in either the owner’s class dictionary or in the class
dictionary for one of its parents).  In the examples below, “the attribute”
refers to the attribute whose name is the key of the property in the owner
class’ @ref{77e,,__dict__}.  The @ref{c84,,object} class itself does not
implement any of these protocols.

@geindex __get__() (object method)
@anchor{reference/datamodel object __get__}@anchor{16f4}
@deffn {Method} object.__get__ (self, instance, owner=None)

Called to get the attribute of the owner class (class attribute access) or
of an instance of that class (instance attribute access). The optional
`owner' argument is the owner class, while `instance' is the instance that
the attribute was accessed through, or @code{None} when the attribute is
accessed through the `owner'.

This method should return the computed attribute value or raise an
@ref{5f0,,AttributeError} exception.

@geindex Python Enhancement Proposals; PEP 252
PEP 252@footnote{https://peps.python.org/pep-0252/} specifies that @code{__get__()} is callable with one or two
arguments.  Python’s own built-in descriptors support this specification;
however, it is likely that some third-party tools have descriptors
that require both arguments.  Python’s own @ref{dd1,,__getattribute__()}
implementation always passes in both arguments whether they are required
or not.
@end deffn

@geindex __set__() (object method)
@anchor{reference/datamodel object __set__}@anchor{23fc}
@deffn {Method} object.__set__ (self, instance, value)

Called to set the attribute on an instance `instance' of the owner class to a
new value, `value'.

Note, adding @code{__set__()} or @ref{1993,,__delete__()} changes the kind of
descriptor to a “data descriptor”.  See @ref{23fd,,Invoking Descriptors} for
more details.
@end deffn

@geindex __delete__() (object method)
@anchor{reference/datamodel object __delete__}@anchor{1993}
@deffn {Method} object.__delete__ (self, instance)

Called to delete the attribute on an instance `instance' of the owner class.
@end deffn

Instances of descriptors may also have the @code{__objclass__} attribute
present:

@geindex __objclass__ (object attribute)
@anchor{reference/datamodel object __objclass__}@anchor{23fe}
@deffn {Attribute} object.__objclass__

The attribute @code{__objclass__} is interpreted by the @ref{82,,inspect} module
as specifying the class where this object was defined (setting this
appropriately can assist in runtime introspection of dynamic class attributes).
For callables, it may indicate that an instance of the given type (or a
subclass) is expected or required as the first positional argument (for example,
CPython sets this attribute for unbound methods that are implemented in C).
@end deffn

@node Invoking Descriptors,__slots__<2>,Implementing Descriptors,Customizing attribute access
@anchor{reference/datamodel descriptor-invocation}@anchor{23fd}@anchor{reference/datamodel invoking-descriptors}@anchor{23ff}
@subsubsection Invoking Descriptors


In general, a descriptor is an object attribute with “binding behavior”, one
whose attribute access has been overridden by methods in the descriptor
protocol:  @ref{16f4,,__get__()}, @ref{23fc,,__set__()}, and
@ref{1993,,__delete__()}. If any of
those methods are defined for an object, it is said to be a descriptor.

The default behavior for attribute access is to get, set, or delete the
attribute from an object’s dictionary. For instance, @code{a.x} has a lookup chain
starting with @code{a.__dict__['x']}, then @code{type(a).__dict__['x']}, and
continuing through the base classes of @code{type(a)} excluding metaclasses.

However, if the looked-up value is an object defining one of the descriptor
methods, then Python may override the default behavior and invoke the descriptor
method instead.  Where this occurs in the precedence chain depends on which
descriptor methods were defined and how they were called.

The starting point for descriptor invocation is a binding, @code{a.x}. How the
arguments are assembled depends on @code{a}:


@table @asis

@item Direct Call

The simplest and least common call is when user code directly invokes a
descriptor method:    @code{x.__get__(a)}.

@item Instance Binding

If binding to an object instance, @code{a.x} is transformed into the call:
@code{type(a).__dict__['x'].__get__(a, type(a))}.

@item Class Binding

If binding to a class, @code{A.x} is transformed into the call:
@code{A.__dict__['x'].__get__(None, A)}.

@item Super Binding

A dotted lookup such as @code{super(A, a).x} searches
@code{a.__class__.__mro__} for a base class @code{B} following @code{A} and then
returns @code{B.__dict__['x'].__get__(a, A)}.  If not a descriptor, @code{x} is
returned unchanged.
@end table

@c class Desc:
@c     def __get__(*args):
@c         return args
@c 
@c class B:
@c 
@c     x = Desc()
@c 
@c class A(B):
@c 
@c     x = 999
@c 
@c     def m(self):
@c         'Demonstrate these two descriptor invocations are equivalent'
@c         result1 = super(A, self).x
@c         result2 = B.__dict__['x'].__get__(self, A)
@c         return result1 == result2

@c >>> a = A()
@c >>> a.__class__.__mro__.index(B) > a.__class__.__mro__.index(A)
@c True
@c >>> super(A, a).x == B.__dict__['x'].__get__(a, A)
@c True
@c >>> a.m()
@c True

For instance bindings, the precedence of descriptor invocation depends on
which descriptor methods are defined.  A descriptor can define any combination
of @ref{16f4,,__get__()}, @ref{23fc,,__set__()} and
@ref{1993,,__delete__()}.  If it does not
define @code{__get__()}, then accessing the attribute will return the descriptor
object itself unless there is a value in the object’s instance dictionary.  If
the descriptor defines @code{__set__()} and/or @code{__delete__()}, it is a data
descriptor; if it defines neither, it is a non-data descriptor.  Normally, data
descriptors define both @code{__get__()} and @code{__set__()}, while non-data
descriptors have just the @code{__get__()} method.  Data descriptors with
@code{__get__()} and @code{__set__()} (and/or @code{__delete__()}) defined
always override a redefinition in an
instance dictionary.  In contrast, non-data descriptors can be overridden by
instances.

Python methods (including those decorated with
@ref{451,,@@staticmethod} and @ref{48f,,@@classmethod}) are
implemented as non-data descriptors.  Accordingly, instances can redefine and
override methods.  This allows individual instances to acquire behaviors that
differ from other instances of the same class.

The @ref{4b4,,property()} function is implemented as a data descriptor. Accordingly,
instances cannot override the behavior of a property.

@node __slots__<2>,,Invoking Descriptors,Customizing attribute access
@anchor{reference/datamodel id13}@anchor{2400}@anchor{reference/datamodel slots}@anchor{23c2}
@subsubsection __slots__


`__slots__' allow us to explicitly declare data members (like
properties) and deny the creation of @ref{77e,,__dict__} and `__weakref__'
(unless explicitly declared in `__slots__' or available in a parent.)

The space saved over using @ref{77e,,__dict__} can be significant.
Attribute lookup speed can be significantly improved as well.

@geindex object.__slots__ (built-in variable)
@anchor{reference/datamodel object __slots__}@anchor{16f7}
@deffn {Data} object.__slots__

This class variable can be assigned a string, iterable, or sequence of
strings with variable names used by instances.  `__slots__' reserves space
for the declared variables and prevents the automatic creation of
@ref{77e,,__dict__}
and `__weakref__' for each instance.
@end deffn
@anchor{reference/datamodel datamodel-note-slots}@anchor{2401}
Notes on using `__slots__':


@itemize *

@item 
When inheriting from a class without `__slots__', the
@ref{77e,,__dict__} and
`__weakref__' attribute of the instances will always be accessible.

@item 
Without a @ref{77e,,__dict__} variable, instances cannot be assigned new
variables not
listed in the `__slots__' definition.  Attempts to assign to an unlisted
variable name raises @ref{5f0,,AttributeError}. If dynamic assignment of new
variables is desired, then add @code{'__dict__'} to the sequence of strings in
the `__slots__' declaration.

@item 
Without a `__weakref__' variable for each instance, classes defining
`__slots__' do not support @ref{11b,,weak references} to its instances.
If weak reference
support is needed, then add @code{'__weakref__'} to the sequence of strings in the
`__slots__' declaration.

@item 
`__slots__' are implemented at the class level by creating @ref{e4f,,descriptors}
for each variable name.  As a result, class attributes
cannot be used to set default values for instance variables defined by
`__slots__'; otherwise, the class attribute would overwrite the descriptor
assignment.

@item 
The action of a `__slots__' declaration is not limited to the class
where it is defined.  `__slots__' declared in parents are available in
child classes. However, instances of a child subclass will get a
@ref{77e,,__dict__} and `__weakref__' unless the subclass also defines
`__slots__' (which should only contain names of any `additional' slots).

@item 
If a class defines a slot also defined in a base class, the instance variable
defined by the base class slot is inaccessible (except by retrieving its
descriptor directly from the base class). This renders the meaning of the
program undefined.  In the future, a check may be added to prevent this.

@item 
@ref{199,,TypeError} will be raised if nonempty `__slots__' are defined for a
class derived from a
@ref{2402,,"variable-length" built-in type} such as
@ref{19c,,int}, @ref{193,,bytes}, and @ref{614,,tuple}.

@item 
Any non-string @ref{1433,,iterable} may be assigned to `__slots__'.

@item 
If a @ref{184,,dictionary} is used to assign `__slots__', the dictionary
keys will be used as the slot names. The values of the dictionary can be used
to provide per-attribute docstrings that will be recognised by
@ref{bf3,,inspect.getdoc()} and displayed in the output of @ref{ada,,help()}.

@item 
@ref{16b9,,__class__} assignment works only if both classes have the
same `__slots__'.

@item 
@ref{20e5,,Multiple inheritance} with multiple slotted parent
classes can be used,
but only one parent is allowed to have attributes created by slots
(the other bases must have empty slot layouts) - violations raise
@ref{199,,TypeError}.

@item 
If an @ref{4c9,,iterator} is used for `__slots__' then a @ref{18c9,,descriptor} is
created for each
of the iterator’s values. However, the `__slots__' attribute will be an empty
iterator.
@end itemize

@node Customizing class creation,Customizing instance and subclass checks,Customizing attribute access,Special method names
@anchor{reference/datamodel class-customization}@anchor{e4b}@anchor{reference/datamodel customizing-class-creation}@anchor{2403}
@subsubsection Customizing class creation


Whenever a class inherits from another class, @ref{844,,__init_subclass__()} is
called on the parent class. This way, it is possible to write classes which
change the behavior of subclasses. This is closely related to class
decorators, but where class decorators only affect the specific class they’re
applied to, @code{__init_subclass__} solely applies to future subclasses of the
class defining the method.

@geindex __init_subclass__() (object class method)
@anchor{reference/datamodel object __init_subclass__}@anchor{844}
@deffn {Method} classmethod object.__init_subclass__ (cls)

This method is called whenever the containing class is subclassed.
`cls' is then the new subclass. If defined as a normal instance method,
this method is implicitly converted to a class method.

Keyword arguments which are given to a new class are passed to
the parent class’s @code{__init_subclass__}. For compatibility with
other classes using @code{__init_subclass__}, one should take out the
needed keyword arguments and pass the others over to the base
class, as in:

@example
class Philosopher:
    def __init_subclass__(cls, /, default_name, **kwargs):
        super().__init_subclass__(**kwargs)
        cls.default_name = default_name

class AustralianPhilosopher(Philosopher, default_name="Bruce"):
    pass
@end example

The default implementation @code{object.__init_subclass__} does
nothing, but raises an error if it is called with any arguments.

@cartouche
@quotation Note 
The metaclass hint @code{metaclass} is consumed by the rest of the type
machinery, and is never passed to @code{__init_subclass__} implementations.
The actual metaclass (rather than the explicit hint) can be accessed as
@code{type(cls)}.
@end quotation
@end cartouche


Added in version 3.6.

@end deffn

When a class is created, @code{type.__new__()} scans the class variables
and makes callbacks to those with a @ref{e4e,,__set_name__()} hook.

@geindex __set_name__() (object method)
@anchor{reference/datamodel object __set_name__}@anchor{e4e}
@deffn {Method} object.__set_name__ (self, owner, name)

Automatically called at the time the owning class `owner' is
created. The object has been assigned to `name' in that class:

@example
class A:
    x = C()  # Automatically calls: x.__set_name__(A, 'x')
@end example

If the class variable is assigned after the class is created,
@code{__set_name__()} will not be called automatically.
If needed, @code{__set_name__()} can be called directly:

@example
class A:
   pass

c = C()
A.x = c                  # The hook is not called
c.__set_name__(A, 'x')   # Manually invoke the hook
@end example

See @ref{e4a,,Creating the class object} for more details.


Added in version 3.6.

@end deffn

@menu
* Metaclasses:: 
* Resolving MRO entries:: 
* Determining the appropriate metaclass:: 
* Preparing the class namespace:: 
* Executing the class body:: 
* Creating the class object:: 
* Uses for metaclasses:: 

@end menu

@node Metaclasses,Resolving MRO entries,,Customizing class creation
@anchor{reference/datamodel id14}@anchor{2404}@anchor{reference/datamodel metaclasses}@anchor{2405}
@subsubsection Metaclasses


@geindex metaclass
@geindex built-in function; type
@geindex = (equals); class definition

By default, classes are constructed using @ref{f4a,,type()}. The class body is
executed in a new namespace and the class name is bound locally to the
result of @code{type(name, bases, namespace)}.

The class creation process can be customized by passing the @code{metaclass}
keyword argument in the class definition line, or by inheriting from an
existing class that included such an argument. In the following example,
both @code{MyClass} and @code{MySubclass} are instances of @code{Meta}:

@example
class Meta(type):
    pass

class MyClass(metaclass=Meta):
    pass

class MySubclass(MyClass):
    pass
@end example

Any other keyword arguments that are specified in the class definition are
passed through to all metaclass operations described below.

When a class definition is executed, the following steps occur:


@itemize *

@item 
MRO entries are resolved;

@item 
the appropriate metaclass is determined;

@item 
the class namespace is prepared;

@item 
the class body is executed;

@item 
the class object is created.
@end itemize

@node Resolving MRO entries,Determining the appropriate metaclass,Metaclasses,Customizing class creation
@anchor{reference/datamodel resolving-mro-entries}@anchor{2406}
@subsubsection Resolving MRO entries


@geindex __mro_entries__() (object method)
@anchor{reference/datamodel object __mro_entries__}@anchor{ce9}
@deffn {Method} object.__mro_entries__ (self, bases)

If a base that appears in a class definition is not an instance of
@ref{f4a,,type}, then an @code{__mro_entries__()} method is searched on the base.
If an @code{__mro_entries__()} method is found, the base is substituted with the
result of a call to @code{__mro_entries__()} when creating the class.
The method is called with the original bases tuple
passed to the `bases' parameter, and must return a tuple
of classes that will be used instead of the base. The returned tuple may be
empty: in these cases, the original base is ignored.
@end deffn


@subsubheading See also



@table @asis

@item @ref{d9b,,types.resolve_bases()}

Dynamically resolve bases that are not instances of @ref{f4a,,type}.

@item @ref{6f6,,types.get_original_bases()}

Retrieve a class’s “original bases” prior to modifications by
@ref{ce9,,__mro_entries__()}.

@geindex Python Enhancement Proposals; PEP 560

@item PEP 560@footnote{https://peps.python.org/pep-0560/}

Core support for typing module and generic types.
@end table


@node Determining the appropriate metaclass,Preparing the class namespace,Resolving MRO entries,Customizing class creation
@anchor{reference/datamodel determining-the-appropriate-metaclass}@anchor{2407}
@subsubsection Determining the appropriate metaclass


@geindex metaclass hint

The appropriate metaclass for a class definition is determined as follows:


@itemize *

@item 
if no bases and no explicit metaclass are given, then @ref{f4a,,type()} is used;

@item 
if an explicit metaclass is given and it is `not' an instance of
@ref{f4a,,type()}, then it is used directly as the metaclass;

@item 
if an instance of @ref{f4a,,type()} is given as the explicit metaclass, or
bases are defined, then the most derived metaclass is used.
@end itemize

The most derived metaclass is selected from the explicitly specified
metaclass (if any) and the metaclasses (i.e. @code{type(cls)}) of all specified
base classes. The most derived metaclass is one which is a subtype of `all'
of these candidate metaclasses. If none of the candidate metaclasses meets
that criterion, then the class definition will fail with @code{TypeError}.

@node Preparing the class namespace,Executing the class body,Determining the appropriate metaclass,Customizing class creation
@anchor{reference/datamodel prepare}@anchor{e5e}@anchor{reference/datamodel preparing-the-class-namespace}@anchor{2408}
@subsubsection Preparing the class namespace


@geindex __prepare__ (metaclass method)

Once the appropriate metaclass has been identified, then the class namespace
is prepared. If the metaclass has a @code{__prepare__} attribute, it is called
as @code{namespace = metaclass.__prepare__(name, bases, **kwds)} (where the
additional keyword arguments, if any, come from the class definition). The
@code{__prepare__} method should be implemented as a
@ref{48f,,classmethod}. The
namespace returned by @code{__prepare__} is passed in to @code{__new__}, but when
the final class object is created the namespace is copied into a new @code{dict}.

If the metaclass has no @code{__prepare__} attribute, then the class namespace
is initialised as an empty ordered mapping.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 3115

@item PEP 3115@footnote{https://peps.python.org/pep-3115/} - Metaclasses in Python 3000

Introduced the @code{__prepare__} namespace hook
@end table


@node Executing the class body,Creating the class object,Preparing the class namespace,Customizing class creation
@anchor{reference/datamodel executing-the-class-body}@anchor{2409}
@subsubsection Executing the class body


@geindex class; body

The class body is executed (approximately) as
@code{exec(body, globals(), namespace)}. The key difference from a normal
call to @ref{4a3,,exec()} is that lexical scoping allows the class body (including
any methods) to reference names from the current and outer scopes when the
class definition occurs inside a function.

However, even when the class definition occurs inside the function, methods
defined inside the class still cannot see names defined at the class scope.
Class variables must be accessed through the first parameter of instance or
class methods, or through the implicit lexically scoped @code{__class__} reference
described in the next section.

@node Creating the class object,Uses for metaclasses,Executing the class body,Customizing class creation
@anchor{reference/datamodel class-object-creation}@anchor{e4a}@anchor{reference/datamodel creating-the-class-object}@anchor{240a}
@subsubsection Creating the class object


@geindex __class__ (method cell)
@geindex __classcell__ (class namespace entry)

Once the class namespace has been populated by executing the class body,
the class object is created by calling
@code{metaclass(name, bases, namespace, **kwds)} (the additional keywords
passed here are the same as those passed to @code{__prepare__}).

This class object is the one that will be referenced by the zero-argument
form of @ref{1a7,,super()}. @code{__class__} is an implicit closure reference
created by the compiler if any methods in a class body refer to either
@code{__class__} or @code{super}. This allows the zero argument form of
@code{super()} to correctly identify the class being defined based on
lexical scoping, while the class or instance that was used to make the
current call is identified based on the first argument passed to the method.

`CPython implementation detail:' In CPython 3.6 and later, the @code{__class__} cell is passed to the metaclass
as a @code{__classcell__} entry in the class namespace. If present, this must
be propagated up to the @code{type.__new__} call in order for the class to be
initialised correctly.
Failing to do so will result in a @ref{246,,RuntimeError} in Python 3.8.

When using the default metaclass @ref{f4a,,type}, or any metaclass that ultimately
calls @code{type.__new__}, the following additional customization steps are
invoked after creating the class object:


@enumerate 

@item 
The @code{type.__new__} method collects all of the attributes in the class
namespace that define a @ref{e4e,,__set_name__()} method;

@item 
Those @code{__set_name__} methods are called with the class
being defined and the assigned name of that particular attribute;

@item 
The @ref{844,,__init_subclass__()} hook is called on the
immediate parent of the new class in its method resolution order.
@end enumerate

After the class object is created, it is passed to the class decorators
included in the class definition (if any) and the resulting object is bound
in the local namespace as the defined class.

When a new class is created by @code{type.__new__}, the object provided as the
namespace parameter is copied to a new ordered mapping and the original
object is discarded. The new copy is wrapped in a read-only proxy, which
becomes the @ref{e5d,,__dict__} attribute of the class object.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 3135

@item PEP 3135@footnote{https://peps.python.org/pep-3135/} - New super

Describes the implicit @code{__class__} closure reference
@end table


@node Uses for metaclasses,,Creating the class object,Customizing class creation
@anchor{reference/datamodel uses-for-metaclasses}@anchor{240b}
@subsubsection Uses for metaclasses


The potential uses for metaclasses are boundless. Some ideas that have been
explored include enum, logging, interface checking, automatic delegation,
automatic property creation, proxies, frameworks, and automatic resource
locking/synchronization.

@node Customizing instance and subclass checks,Emulating generic types,Customizing class creation,Special method names
@anchor{reference/datamodel customizing-instance-and-subclass-checks}@anchor{240c}
@subsubsection Customizing instance and subclass checks


The following methods are used to override the default behavior of the
@ref{2af,,isinstance()} and @ref{9ca,,issubclass()} built-in functions.

In particular, the metaclass @ref{1121,,abc.ABCMeta} implements these methods in
order to allow the addition of Abstract Base Classes (ABCs) as “virtual base
classes” to any class or type (including built-in types), including other
ABCs.

@geindex __instancecheck__() (type method)
@anchor{reference/datamodel type __instancecheck__}@anchor{240d}
@deffn {Method} type.__instancecheck__ (self, instance)

Return true if `instance' should be considered a (direct or indirect)
instance of `class'. If defined, called to implement @code{isinstance(instance,
class)}.
@end deffn

@geindex __subclasscheck__() (type method)
@anchor{reference/datamodel type __subclasscheck__}@anchor{240e}
@deffn {Method} type.__subclasscheck__ (self, subclass)

Return true if `subclass' should be considered a (direct or indirect)
subclass of `class'.  If defined, called to implement @code{issubclass(subclass,
class)}.
@end deffn

Note that these methods are looked up on the type (metaclass) of a class.  They
cannot be defined as class methods in the actual class.  This is consistent with
the lookup of special methods that are called on instances, only in this
case the instance is itself a class.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 3119

@item PEP 3119@footnote{https://peps.python.org/pep-3119/} - Introducing Abstract Base Classes

Includes the specification for customizing @ref{2af,,isinstance()} and
@ref{9ca,,issubclass()} behavior through @ref{240d,,__instancecheck__()} and
@ref{240e,,__subclasscheck__()}, with motivation for this functionality
in the context of adding Abstract Base Classes (see the @ref{4,,abc}
module) to the language.
@end table


@node Emulating generic types,Emulating callable objects,Customizing instance and subclass checks,Special method names
@anchor{reference/datamodel emulating-generic-types}@anchor{240f}
@subsubsection Emulating generic types


When using @ref{15d,,type annotations}, it is often useful to
`parameterize' a @ref{1a2,,generic type} using Python’s square-brackets notation.
For example, the annotation @code{list[int]} might be used to signify a
@ref{24f,,list} in which all the elements are of type @ref{19c,,int}.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 484

@item PEP 484@footnote{https://peps.python.org/pep-0484/} - Type Hints

Introducing Python’s framework for type annotations

@item @ref{8c3,,Generic Alias Types}

Documentation for objects representing parameterized generic classes

@item @ref{2410,,Generics}, @ref{6f7,,user-defined generics} and @ref{1806,,typing.Generic}

Documentation on how to implement generic classes that can be
parameterized at runtime and understood by static type-checkers.
@end table


A class can `generally' only be parameterized if it defines the special
class method @code{__class_getitem__()}.

@geindex __class_getitem__() (object class method)
@anchor{reference/datamodel object __class_getitem__}@anchor{948}
@deffn {Method} classmethod object.__class_getitem__ (cls, key)

Return an object representing the specialization of a generic class
by type arguments found in `key'.

When defined on a class, @code{__class_getitem__()} is automatically a class
method. As such, there is no need for it to be decorated with
@ref{48f,,@@classmethod} when it is defined.
@end deffn

@menu
* The purpose of __class_getitem__:: 
* __class_getitem__ versus __getitem__:: 

@end menu

@node The purpose of __class_getitem__,__class_getitem__ versus __getitem__,,Emulating generic types
@anchor{reference/datamodel the-purpose-of-class-getitem}@anchor{2411}
@subsubsection The purpose of `__class_getitem__'


The purpose of @ref{948,,__class_getitem__()} is to allow runtime
parameterization of standard-library generic classes in order to more easily
apply @ref{2412,,type hints} to these classes.

To implement custom generic classes that can be parameterized at runtime and
understood by static type-checkers, users should either inherit from a standard
library class that already implements @ref{948,,__class_getitem__()}, or
inherit from @ref{1806,,typing.Generic}, which has its own implementation of
@code{__class_getitem__()}.

Custom implementations of @ref{948,,__class_getitem__()} on classes defined
outside of the standard library may not be understood by third-party
type-checkers such as mypy. Using @code{__class_getitem__()} on any class for
purposes other than type hinting is discouraged.

@node __class_getitem__ versus __getitem__,,The purpose of __class_getitem__,Emulating generic types
@anchor{reference/datamodel class-getitem-versus-getitem}@anchor{2413}@anchor{reference/datamodel classgetitem-versus-getitem}@anchor{2414}
@subsubsection `__class_getitem__' versus `__getitem__'


Usually, the @ref{2415,,subscription} of an object using square
brackets will call the @ref{588,,__getitem__()} instance method defined on
the object’s class. However, if the object being subscribed is itself a class,
the class method @ref{948,,__class_getitem__()} may be called instead.
@code{__class_getitem__()} should return a @ref{8c3,,GenericAlias}
object if it is properly defined.

Presented with the @ref{2416,,expression} @code{obj[x]}, the Python interpreter
follows something like the following process to decide whether
@ref{588,,__getitem__()} or @ref{948,,__class_getitem__()} should be
called:

@example
from inspect import isclass

def subscribe(obj, x):
    """Return the result of the expression 'obj[x]'"""

    class_of_obj = type(obj)

    # If the class of obj defines __getitem__,
    # call class_of_obj.__getitem__(obj, x)
    if hasattr(class_of_obj, '__getitem__'):
        return class_of_obj.__getitem__(obj, x)

    # Else, if obj is a class and defines __class_getitem__,
    # call obj.__class_getitem__(x)
    elif isclass(obj) and hasattr(obj, '__class_getitem__'):
        return obj.__class_getitem__(x)

    # Else, raise an exception
    else:
        raise TypeError(
            f"'@{class_of_obj.__name__@}' object is not subscriptable"
        )
@end example

In Python, all classes are themselves instances of other classes. The class of
a class is known as that class’s @ref{2417,,metaclass}, and most classes have the
@ref{f4a,,type} class as their metaclass. @code{type} does not define
@ref{588,,__getitem__()}, meaning that expressions such as @code{list[int]},
@code{dict[str, float]} and @code{tuple[str, bytes]} all result in
@ref{948,,__class_getitem__()} being called:

@example
>>> # list has class "type" as its metaclass, like most classes:
>>> type(list)
<class 'type'>
>>> type(dict) == type(list) == type(tuple) == type(str) == type(bytes)
True
>>> # "list[int]" calls "list.__class_getitem__(int)"
>>> list[int]
list[int]
>>> # list.__class_getitem__ returns a GenericAlias object:
>>> type(list[int])
<class 'types.GenericAlias'>
@end example

However, if a class has a custom metaclass that defines
@ref{588,,__getitem__()}, subscribing the class may result in different
behaviour. An example of this can be found in the @ref{5a,,enum} module:

@example
>>> from enum import Enum
>>> class Menu(Enum):
...     """A breakfast menu"""
...     SPAM = 'spam'
...     BACON = 'bacon'
...
>>> # Enum classes have a custom metaclass:
>>> type(Menu)
<class 'enum.EnumMeta'>
>>> # EnumMeta defines __getitem__,
>>> # so __class_getitem__ is not called,
>>> # and the result is not a GenericAlias object:
>>> Menu['SPAM']
<Menu.SPAM: 'spam'>
>>> type(Menu['SPAM'])
<enum 'Menu'>
@end example


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 560

@item PEP 560@footnote{https://peps.python.org/pep-0560/} - Core Support for typing module and generic types

Introducing @ref{948,,__class_getitem__()}, and outlining when a
@ref{2415,,subscription} results in @code{__class_getitem__()}
being called instead of @ref{588,,__getitem__()}
@end table


@node Emulating callable objects,Emulating container types,Emulating generic types,Special method names
@anchor{reference/datamodel emulating-callable-objects}@anchor{2418}@anchor{reference/datamodel id15}@anchor{2419}
@subsubsection Emulating callable objects


@geindex __call__() (object method)
@anchor{reference/datamodel object __call__}@anchor{77b}
@deffn {Method} object.__call__ (self[, args...])

@geindex call; instance

Called when the instance is “called” as a function; if this method is defined,
@code{x(arg1, arg2, ...)} roughly translates to @code{type(x).__call__(x, arg1, ...)}.
The @ref{c84,,object} class itself does not provide this method.
@end deffn

@node Emulating container types,Emulating numeric types,Emulating callable objects,Special method names
@anchor{reference/datamodel emulating-container-types}@anchor{241a}@anchor{reference/datamodel sequence-types}@anchor{241b}
@subsubsection Emulating container types


The following methods can be defined to implement container objects. None of them
are provided by the @ref{c84,,object} class itself. Containers usually are
@ref{717,,sequences} (such as @ref{24f,,lists} or
@ref{614,,tuples}) or @ref{13c7,,mappings} (like
@ref{241c,,dictionaries}),
but can represent other containers as well.  The first set of methods is used
either to emulate a sequence or to emulate a mapping; the difference is that for
a sequence, the allowable keys should be the integers `k' for which @code{0 <= k <
N} where `N' is the length of the sequence, or @ref{695,,slice} objects, which define a
range of items.  It is also recommended that mappings provide the methods
@code{keys()}, @code{values()}, @code{items()}, @code{get()}, @code{clear()},
@code{setdefault()}, @code{pop()}, @code{popitem()}, @code{copy()}, and
@code{update()} behaving similar to those for Python’s standard @ref{184,,dictionary}
objects.  The @ref{1f,,collections.abc} module provides a
@ref{12b8,,MutableMapping}
@ref{13c2,,abstract base class} to help create those methods from a base set of
@ref{588,,__getitem__()}, @ref{14d7,,__setitem__()},
@ref{14d8,,__delitem__()}, and @code{keys()}.

Mutable sequences should provide methods
@ref{241d,,append()}, @ref{241e,,clear()}, @ref{241f,,count()},
@ref{2420,,extend()}, @ref{19bd,,index()}, @ref{2421,,insert()},
@ref{2422,,pop()}, @ref{19be,,remove()}, and @ref{2423,,reverse()},
like Python standard @ref{24f,,list} objects.
Finally, sequence types should implement addition (meaning concatenation) and
multiplication (meaning repetition) by defining the methods
@ref{2424,,__add__()}, @ref{2425,,__radd__()}, @ref{2426,,__iadd__()},
@ref{2427,,__mul__()}, @ref{2428,,__rmul__()} and @ref{2429,,__imul__()}
described below; they should not define other numerical
operators.

It is recommended that both mappings and sequences implement the
@ref{15c5,,__contains__()} method to allow efficient use of the @code{in}
operator; for
mappings, @code{in} should search the mapping’s keys; for sequences, it should
search through the values.  It is further recommended that both mappings and
sequences implement the @ref{e6f,,__iter__()} method to allow efficient iteration
through the container; for mappings, @code{__iter__()} should iterate
through the object’s keys; for sequences, it should iterate through the values.

@geindex __len__() (object method)
@anchor{reference/datamodel object __len__}@anchor{17e1}
@deffn {Method} object.__len__ (self)

@geindex built-in function; len
@geindex __bool__() (object method)

Called to implement the built-in function @ref{841,,len()}.  Should return the length
of the object, an integer @code{>=} 0.  Also, an object that doesn’t define a
@ref{14e1,,__bool__()} method and whose @code{__len__()} method returns zero is
considered to be false in a Boolean context.

`CPython implementation detail:' In CPython, the length is required to be at most @ref{13d1,,sys.maxsize}.
If the length is larger than @code{sys.maxsize} some features (such as
@ref{841,,len()}) may raise @ref{a87,,OverflowError}.  To prevent raising
@code{OverflowError} by truth value testing, an object must define a
@ref{14e1,,__bool__()} method.
@end deffn

@geindex __length_hint__() (object method)
@anchor{reference/datamodel object __length_hint__}@anchor{1114}
@deffn {Method} object.__length_hint__ (self)

Called to implement @ref{1173,,operator.length_hint()}. Should return an estimated
length for the object (which may be greater or less than the actual length).
The length must be an integer @code{>=} 0. The return value may also be
@ref{1a3,,NotImplemented}, which is treated the same as if the
@code{__length_hint__} method didn’t exist at all. This method is purely an
optimization and is never required for correctness.


Added in version 3.4.

@end deffn

@geindex __getitem__() (object method)
@anchor{reference/datamodel object __getitem__}@anchor{588}
@deffn {Method} object.__getitem__ (self, subscript)

Called to implement `subscription', that is, @code{self[subscript]}.
See @ref{2415,,Subscriptions and slicings} for details on the syntax.

There are two types of built-in objects that support subscription
via @code{__getitem__()}:


@itemize -

@item 
`sequences', where `subscript' (also called
@ref{242a,,index}) should be an integer or a @ref{695,,slice} object.
See the @ref{237c,,sequence documentation} for the expected
behavior, including handling @code{slice} objects and negative indices.

@item 
`mappings', where `subscript' is also called the @ref{242b,,key}.
See @ref{2383,,mapping documentation} for the expected
behavior.
@end itemize

If `subscript' is of an inappropriate type, @code{__getitem__()}
should raise @ref{199,,TypeError}.
If `subscript' has an inappropriate value, @code{__getitem__()}
should raise an @ref{242c,,LookupError} or one of its subclasses
(@ref{1741,,IndexError} for sequences; @ref{5e7,,KeyError} for mappings).

@geindex object; slice

@cartouche
@quotation Note 
Slicing is handled by @code{__getitem__()}, @ref{14d7,,__setitem__()},
and @ref{14d8,,__delitem__()}.
A call like

@example
a[1:2] = b
@end example

is translated to

@example
a[slice(1, 2, None)] = b
@end example

and so forth. Missing slice items are always filled in with @code{None}.
@end quotation
@end cartouche

@cartouche
@quotation Note 
The sequence iteration protocol (used, for example, in @ref{348,,for}
loops), expects that an @ref{1741,,IndexError} will be raised for illegal
indexes to allow proper detection of the end of a sequence.
@end quotation
@end cartouche

@cartouche
@quotation Note 
When @ref{2415,,subscripting} a `class', the special
class method @ref{948,,__class_getitem__()} may be called instead of
@code{__getitem__()}. See @ref{2414,,__class_getitem__ versus __getitem__} for more
details.
@end quotation
@end cartouche
@end deffn

@geindex __setitem__() (object method)
@anchor{reference/datamodel object __setitem__}@anchor{14d7}
@deffn {Method} object.__setitem__ (self, key, value)

Called to implement assignment to @code{self[key]}.  Same note as for
@ref{588,,__getitem__()}.  This should only be implemented for mappings if the
objects support changes to the values for keys, or if new keys can be added, or
for sequences if elements can be replaced.  The same exceptions should be raised
for improper `key' values as for the @code{__getitem__()} method.
@end deffn

@geindex __delitem__() (object method)
@anchor{reference/datamodel object __delitem__}@anchor{14d8}
@deffn {Method} object.__delitem__ (self, key)

Called to implement deletion of @code{self[key]}.  Same note as for
@ref{588,,__getitem__()}.  This should only be implemented for mappings if the
objects support removal of keys, or for sequences if elements can be removed
from the sequence.  The same exceptions should be raised for improper `key'
values as for the @code{__getitem__()} method.
@end deffn

@geindex __missing__() (object method)
@anchor{reference/datamodel object __missing__}@anchor{13c9}
@deffn {Method} object.__missing__ (self, key)

Called by @ref{184,,dict}.@ref{588,,__getitem__()} to implement @code{self[key]} for dict subclasses
when key is not in the dictionary.
@end deffn

@geindex __iter__() (object method)
@anchor{reference/datamodel object __iter__}@anchor{e6f}
@deffn {Method} object.__iter__ (self)

This method is called when an @ref{4c9,,iterator} is required for a container.
This method should return a new iterator object that can iterate over all the
objects in the container.  For mappings, it should iterate over the keys of
the container.
@end deffn

@geindex __reversed__() (object method)
@anchor{reference/datamodel object __reversed__}@anchor{e8c}
@deffn {Method} object.__reversed__ (self)

Called (if present) by the @ref{a6b,,reversed()} built-in to implement
reverse iteration.  It should return a new iterator object that iterates
over all the objects in the container in reverse order.

If the @code{__reversed__()} method is not provided, the @ref{a6b,,reversed()}
built-in will fall back to using the sequence protocol (@ref{17e1,,__len__()} and
@ref{588,,__getitem__()}).  Objects that support the sequence protocol should
only provide @code{__reversed__()} if they can provide an implementation
that is more efficient than the one provided by @code{reversed()}.
@end deffn

The membership test operators (@ref{349,,in} and @ref{842,,not in}) are normally
implemented as an iteration through a container. However, container objects can
supply the following special method with a more efficient implementation, which
also does not require the object be iterable.

@geindex __contains__() (object method)
@anchor{reference/datamodel object __contains__}@anchor{15c5}
@deffn {Method} object.__contains__ (self, item)

Called to implement membership test operators.  Should return true if `item'
is in `self', false otherwise.  For mapping objects, this should consider the
keys of the mapping rather than the values or the key-item pairs.

For objects that don’t define @code{__contains__()}, the membership test first
tries iteration via @ref{e6f,,__iter__()}, then the old sequence iteration
protocol via @ref{588,,__getitem__()}, see @ref{242d,,this section in the language reference}.
@end deffn

@node Emulating numeric types,With Statement Context Managers,Emulating container types,Special method names
@anchor{reference/datamodel emulating-numeric-types}@anchor{242e}@anchor{reference/datamodel numeric-types}@anchor{242f}
@subsubsection Emulating numeric types


The following methods can be defined to emulate numeric objects. Methods
corresponding to operations that are not supported by the particular kind of
number implemented (e.g., bitwise operations for non-integral numbers) should be
left undefined.

@geindex __add__() (object method)
@geindex __sub__() (object method)
@geindex __mul__() (object method)
@geindex __matmul__() (object method)
@geindex __truediv__() (object method)
@geindex __floordiv__() (object method)
@geindex __mod__() (object method)
@geindex __divmod__() (object method)
@geindex __pow__() (object method)
@geindex __lshift__() (object method)
@geindex __rshift__() (object method)
@geindex __and__() (object method)
@geindex __xor__() (object method)
@geindex __or__() (object method)
@anchor{reference/datamodel object __add__}@anchor{2424}
@deffn {Method} object.__add__ (self, other)
@anchor{reference/datamodel object __sub__}@anchor{2430}
@deffnx {Method} object.__sub__ (self, other)
@anchor{reference/datamodel object __mul__}@anchor{2427}
@deffnx {Method} object.__mul__ (self, other)
@anchor{reference/datamodel object __matmul__}@anchor{f7f}
@deffnx {Method} object.__matmul__ (self, other)
@anchor{reference/datamodel object __truediv__}@anchor{1096}
@deffnx {Method} object.__truediv__ (self, other)
@anchor{reference/datamodel object __floordiv__}@anchor{1700}
@deffnx {Method} object.__floordiv__ (self, other)
@anchor{reference/datamodel object __mod__}@anchor{2431}
@deffnx {Method} object.__mod__ (self, other)
@anchor{reference/datamodel object __divmod__}@anchor{1097}
@deffnx {Method} object.__divmod__ (self, other)
@anchor{reference/datamodel object __pow__}@anchor{9da}
@deffnx {Method} object.__pow__ (self, other[, modulo])
@anchor{reference/datamodel object __lshift__}@anchor{2432}
@deffnx {Method} object.__lshift__ (self, other)
@anchor{reference/datamodel object __rshift__}@anchor{2433}
@deffnx {Method} object.__rshift__ (self, other)
@anchor{reference/datamodel object __and__}@anchor{2434}
@deffnx {Method} object.__and__ (self, other)
@anchor{reference/datamodel object __xor__}@anchor{2435}
@deffnx {Method} object.__xor__ (self, other)
@anchor{reference/datamodel object __or__}@anchor{2436}
@deffnx {Method} object.__or__ (self, other)

@geindex built-in function; divmod
@geindex built-in function; pow
@geindex built-in function; pow

These methods are called to implement the binary arithmetic operations
(@code{+}, @code{-}, @code{*}, @code{@@}, @code{/}, @code{//}, @code{%}, @ref{b9f,,divmod()},
@ref{1a5,,pow()}, @code{**}, @code{<<}, @code{>>}, @code{&}, @code{^}, @code{|}).  For instance, to
evaluate the expression @code{x + y}, where `x' is an instance of a class that
has an @code{__add__()} method, @code{type(x).__add__(x, y)} is called.  The
@code{__divmod__()} method should be the equivalent to using
@code{__floordiv__()} and @code{__mod__()}; it should not be related to
@code{__truediv__()}.  Note that @code{__pow__()} should be defined to accept
an optional third argument if the three-argument version of the built-in @code{pow()}
function is to be supported.

If one of those methods does not support the operation with the supplied
arguments, it should return @ref{1a3,,NotImplemented}.
@end deffn

@geindex __radd__() (object method)
@geindex __rsub__() (object method)
@geindex __rmul__() (object method)
@geindex __rmatmul__() (object method)
@geindex __rtruediv__() (object method)
@geindex __rfloordiv__() (object method)
@geindex __rmod__() (object method)
@geindex __rdivmod__() (object method)
@geindex __rpow__() (object method)
@geindex __rlshift__() (object method)
@geindex __rrshift__() (object method)
@geindex __rand__() (object method)
@geindex __rxor__() (object method)
@geindex __ror__() (object method)
@anchor{reference/datamodel object __radd__}@anchor{2425}
@deffn {Method} object.__radd__ (self, other)
@anchor{reference/datamodel object __rsub__}@anchor{2437}
@deffnx {Method} object.__rsub__ (self, other)
@anchor{reference/datamodel object __rmul__}@anchor{2428}
@deffnx {Method} object.__rmul__ (self, other)
@anchor{reference/datamodel object __rmatmul__}@anchor{f80}
@deffnx {Method} object.__rmatmul__ (self, other)
@anchor{reference/datamodel object __rtruediv__}@anchor{2438}
@deffnx {Method} object.__rtruediv__ (self, other)
@anchor{reference/datamodel object __rfloordiv__}@anchor{2439}
@deffnx {Method} object.__rfloordiv__ (self, other)
@anchor{reference/datamodel object __rmod__}@anchor{fdb}
@deffnx {Method} object.__rmod__ (self, other)
@anchor{reference/datamodel object __rdivmod__}@anchor{243a}
@deffnx {Method} object.__rdivmod__ (self, other)
@anchor{reference/datamodel object __rpow__}@anchor{1a6}
@deffnx {Method} object.__rpow__ (self, other[, modulo])
@anchor{reference/datamodel object __rlshift__}@anchor{243b}
@deffnx {Method} object.__rlshift__ (self, other)
@anchor{reference/datamodel object __rrshift__}@anchor{243c}
@deffnx {Method} object.__rrshift__ (self, other)
@anchor{reference/datamodel object __rand__}@anchor{243d}
@deffnx {Method} object.__rand__ (self, other)
@anchor{reference/datamodel object __rxor__}@anchor{243e}
@deffnx {Method} object.__rxor__ (self, other)
@anchor{reference/datamodel object __ror__}@anchor{243f}
@deffnx {Method} object.__ror__ (self, other)

@geindex built-in function; divmod
@geindex built-in function; pow

These methods are called to implement the binary arithmetic operations
(@code{+}, @code{-}, @code{*}, @code{@@}, @code{/}, @code{//}, @code{%}, @ref{b9f,,divmod()},
@ref{1a5,,pow()}, @code{**}, @code{<<}, @code{>>}, @code{&}, @code{^}, @code{|}) with reflected
(swapped) operands.  These functions are only called if the operands
are of different types, when the left operand does not support the corresponding
operation @footnote{
“Does not support” here means that the class has no such method, or
the method returns @ref{1a3,,NotImplemented}.  Do not set the method to
@code{None} if you want to force fallback to the right operand’s reflected
method—that will instead have the opposite effect of explicitly
`blocking' such fallback.
}, or the right operand’s class is derived from the left operand’s
class. @footnote{
For operands of the same type, it is assumed that if the non-reflected method
(such as @ref{2424,,__add__()}) fails then the operation is not supported, which is why the
reflected method is not called.
} For instance, to evaluate the expression @code{x - y}, where `y' is
an instance of a class that has an @code{__rsub__()} method, @code{type(y).__rsub__(y, x)}
is called if @code{type(x).__sub__(x, y)} returns @ref{1a3,,NotImplemented} or @code{type(y)}
is a subclass of @code{type(x)}. @footnote{
If the right operand’s type is a subclass of the left operand’s type, the
reflected method having precedence allows subclasses to override their ancestors’
operations.
}

Note that @code{__rpow__()} should be defined to accept an optional third
argument if the three-argument version of the built-in @ref{1a5,,pow()} function
is to be supported.


Changed in version 3.14: Three-argument @ref{1a5,,pow()} now try calling @code{__rpow__()} if necessary.
Previously it was only called in two-argument @code{pow()} and the binary
power operator.


@cartouche
@quotation Note 
If the right operand’s type is a subclass of the left operand’s type and
that subclass provides a different implementation of the reflected method
for the operation, this method will be called before the left operand’s
non-reflected method. This behavior allows subclasses to override their
ancestors’ operations.
@end quotation
@end cartouche
@end deffn

@geindex __iadd__() (object method)
@geindex __isub__() (object method)
@geindex __imul__() (object method)
@geindex __imatmul__() (object method)
@geindex __itruediv__() (object method)
@geindex __ifloordiv__() (object method)
@geindex __imod__() (object method)
@geindex __ipow__() (object method)
@geindex __ilshift__() (object method)
@geindex __irshift__() (object method)
@geindex __iand__() (object method)
@geindex __ixor__() (object method)
@geindex __ior__() (object method)
@anchor{reference/datamodel object __iadd__}@anchor{2426}
@deffn {Method} object.__iadd__ (self, other)
@anchor{reference/datamodel object __isub__}@anchor{2440}
@deffnx {Method} object.__isub__ (self, other)
@anchor{reference/datamodel object __imul__}@anchor{2429}
@deffnx {Method} object.__imul__ (self, other)
@anchor{reference/datamodel object __imatmul__}@anchor{f81}
@deffnx {Method} object.__imatmul__ (self, other)
@anchor{reference/datamodel object __itruediv__}@anchor{2441}
@deffnx {Method} object.__itruediv__ (self, other)
@anchor{reference/datamodel object __ifloordiv__}@anchor{2442}
@deffnx {Method} object.__ifloordiv__ (self, other)
@anchor{reference/datamodel object __imod__}@anchor{2443}
@deffnx {Method} object.__imod__ (self, other)
@anchor{reference/datamodel object __ipow__}@anchor{9d9}
@deffnx {Method} object.__ipow__ (self, other[, modulo])
@anchor{reference/datamodel object __ilshift__}@anchor{2444}
@deffnx {Method} object.__ilshift__ (self, other)
@anchor{reference/datamodel object __irshift__}@anchor{2445}
@deffnx {Method} object.__irshift__ (self, other)
@anchor{reference/datamodel object __iand__}@anchor{2446}
@deffnx {Method} object.__iand__ (self, other)
@anchor{reference/datamodel object __ixor__}@anchor{2447}
@deffnx {Method} object.__ixor__ (self, other)
@anchor{reference/datamodel object __ior__}@anchor{2448}
@deffnx {Method} object.__ior__ (self, other)

These methods are called to implement the augmented arithmetic assignments
(@code{+=}, @code{-=}, @code{*=}, @code{@@=}, @code{/=}, @code{//=}, @code{%=}, @code{**=}, @code{<<=},
@code{>>=}, @code{&=}, @code{^=}, @code{|=}).  These methods should attempt to do the
operation in-place (modifying `self') and return the result (which could be,
but does not have to be, `self').  If a specific method is not defined, or if
that method returns @ref{1a3,,NotImplemented}, the
augmented assignment falls back to the normal methods.  For instance, if `x'
is an instance of a class with an @code{__iadd__()} method, @code{x += y} is
equivalent to @code{x = x.__iadd__(y)} . If @code{__iadd__()} does not exist, or if @code{x.__iadd__(y)}
returns @code{NotImplemented}, @code{x.__add__(y)} and
@code{y.__radd__(x)} are considered, as with the evaluation of @code{x + y}. In
certain situations, augmented assignment can result in unexpected errors (see
@ref{2449,,Why does a_tuple[i] += [‘item’] raise an exception when the addition works?}), but this behavior is in fact
part of the data model.
@end deffn

@geindex __neg__() (object method)
@geindex __pos__() (object method)
@geindex __abs__() (object method)
@geindex __invert__() (object method)
@anchor{reference/datamodel object __neg__}@anchor{244a}
@deffn {Method} object.__neg__ (self)
@anchor{reference/datamodel object __pos__}@anchor{244b}
@deffnx {Method} object.__pos__ (self)
@anchor{reference/datamodel object __abs__}@anchor{244c}
@deffnx {Method} object.__abs__ (self)
@anchor{reference/datamodel object __invert__}@anchor{244d}
@deffnx {Method} object.__invert__ (self)

@geindex built-in function; abs

Called to implement the unary arithmetic operations (@code{-}, @code{+}, @ref{20d1,,abs()}
and @code{~}).
@end deffn

@geindex __complex__() (object method)
@geindex __int__() (object method)
@geindex __float__() (object method)
@anchor{reference/datamodel object __complex__}@anchor{7fe}
@deffn {Method} object.__complex__ (self)
@anchor{reference/datamodel object __int__}@anchor{19e}
@deffnx {Method} object.__int__ (self)
@anchor{reference/datamodel object __float__}@anchor{bc7}
@deffnx {Method} object.__float__ (self)

@geindex built-in function; complex
@geindex built-in function; int
@geindex built-in function; float

Called to implement the built-in functions @ref{198,,complex()},
@ref{19c,,int()} and @ref{197,,float()}.  Should return a value
of the appropriate type.
@end deffn

@geindex __index__() (object method)
@anchor{reference/datamodel object __index__}@anchor{19f}
@deffn {Method} object.__index__ (self)

Called to implement @ref{1d15,,operator.index()}, and whenever Python needs to
losslessly convert the numeric object to an integer object (such as in
slicing, or in the built-in @ref{14b4,,bin()}, @ref{14db,,hex()} and @ref{14da,,oct()}
functions). Presence of this method indicates that the numeric object is
an integer type.  Must return an integer.

If @ref{19e,,__int__()}, @ref{bc7,,__float__()} and @ref{7fe,,__complex__()} are not
defined then corresponding built-in functions @ref{19c,,int()}, @ref{197,,float()}
and @ref{198,,complex()} fall back to @code{__index__()}.
@end deffn

@geindex __round__() (object method)
@geindex __trunc__() (object method)
@geindex __floor__() (object method)
@geindex __ceil__() (object method)
@anchor{reference/datamodel object __round__}@anchor{244e}
@deffn {Method} object.__round__ (self[, ndigits])
@anchor{reference/datamodel object __trunc__}@anchor{19d}
@deffnx {Method} object.__trunc__ (self)
@anchor{reference/datamodel object __floor__}@anchor{244f}
@deffnx {Method} object.__floor__ (self)
@anchor{reference/datamodel object __ceil__}@anchor{2450}
@deffnx {Method} object.__ceil__ (self)

@geindex built-in function; round

Called to implement the built-in function @ref{14e6,,round()} and @ref{92,,math}
functions @ref{15cb,,trunc()}, @ref{15c9,,floor()} and @ref{15ca,,ceil()}.
Unless `ndigits' is passed to @code{__round__()} all these methods should
return the value of the object truncated to an @ref{2451,,Integral}
(typically an @ref{19c,,int}).


Changed in version 3.14: @ref{19c,,int()} no longer delegates to the @code{__trunc__()} method.

@end deffn

@node With Statement Context Managers,Customizing positional arguments in class pattern matching,Emulating numeric types,Special method names
@anchor{reference/datamodel context-managers}@anchor{23c5}@anchor{reference/datamodel with-statement-context-managers}@anchor{2452}
@subsubsection With Statement Context Managers


A `context manager' is an object that defines the runtime context to be
established when executing a @ref{187,,with} statement. The context manager
handles the entry into, and the exit from, the desired runtime context for the
execution of the block of code.  Context managers are normally invoked using the
@code{with} statement (described in section @ref{187,,The with statement}), but can also be
used by directly invoking their methods.

@geindex statement; with
@geindex context manager

Typical uses of context managers include saving and restoring various kinds of
global state, locking and unlocking resources, closing opened files, etc.

For more information on context managers, see @ref{2453,,Context Manager Types}.
The @ref{c84,,object} class itself does not provide the context manager methods.

@geindex __enter__() (object method)
@anchor{reference/datamodel object __enter__}@anchor{7e5}
@deffn {Method} object.__enter__ (self)

Enter the runtime context related to this object. The @ref{187,,with} statement
will bind this method’s return value to the target(s) specified in the
@code{as} clause of the statement, if any.
@end deffn

@geindex __exit__() (object method)
@anchor{reference/datamodel object __exit__}@anchor{150c}
@deffn {Method} object.__exit__ (self, exc_type, exc_value, traceback)

Exit the runtime context related to this object. The parameters describe the
exception that caused the context to be exited. If the context was exited
without an exception, all three arguments will be @ref{887,,None}.

If an exception is supplied, and the method wishes to suppress the exception
(i.e., prevent it from being propagated), it should return a true value.
Otherwise, the exception will be processed normally upon exit from this method.

Note that @code{__exit__()} methods should not reraise the passed-in exception;
this is the caller’s responsibility.
@end deffn


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 343

@item PEP 343@footnote{https://peps.python.org/pep-0343/} - The “with” statement

The specification, background, and examples for the Python @ref{187,,with}
statement.
@end table


@node Customizing positional arguments in class pattern matching,Emulating buffer types,With Statement Context Managers,Special method names
@anchor{reference/datamodel class-pattern-matching}@anchor{2454}@anchor{reference/datamodel customizing-positional-arguments-in-class-pattern-matching}@anchor{2455}
@subsubsection Customizing positional arguments in class pattern matching


When using a class name in a pattern, positional arguments in the pattern are not
allowed by default, i.e. @code{case MyClass(x, y)} is typically invalid without special
support in @code{MyClass}. To be able to use that kind of pattern, the class needs to
define a `__match_args__' attribute.

@geindex object.__match_args__ (built-in variable)
@anchor{reference/datamodel object __match_args__}@anchor{1cb8}
@deffn {Data} object.__match_args__

This class variable can be assigned a tuple of strings. When this class is
used in a class pattern with positional arguments, each positional argument will
be converted into a keyword argument, using the corresponding value in
`__match_args__' as the keyword. The absence of this attribute is equivalent to
setting it to @code{()}.
@end deffn

For example, if @code{MyClass.__match_args__} is @code{("left", "center", "right")} that means
that @code{case MyClass(x, y)} is equivalent to @code{case MyClass(left=x, center=y)}. Note
that the number of arguments in the pattern must be smaller than or equal to the number
of elements in `__match_args__'; if it is larger, the pattern match attempt will raise
a @ref{199,,TypeError}.


Added in version 3.10.



@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 634

@item PEP 634@footnote{https://peps.python.org/pep-0634/} - Structural Pattern Matching

The specification for the Python @code{match} statement.
@end table


@node Emulating buffer types,Annotations,Customizing positional arguments in class pattern matching,Special method names
@anchor{reference/datamodel emulating-buffer-types}@anchor{2456}@anchor{reference/datamodel python-buffer-protocol}@anchor{2457}
@subsubsection Emulating buffer types


The @ref{262,,buffer protocol} provides a way for Python
objects to expose efficient access to a low-level memory array. This protocol
is implemented by builtin types such as @ref{193,,bytes} and @ref{166,,memoryview},
and third-party libraries may define additional buffer types.

While buffer types are usually implemented in C, it is also possible to
implement the protocol in Python.

@geindex __buffer__() (object method)
@anchor{reference/datamodel object __buffer__}@anchor{68d}
@deffn {Method} object.__buffer__ (self, flags)

Called when a buffer is requested from `self' (for example, by the
@ref{166,,memoryview} constructor). The `flags' argument is an integer
representing the kind of buffer requested, affecting for example whether
the returned buffer is read-only or writable. @ref{68e,,inspect.BufferFlags}
provides a convenient way to interpret the flags. The method must return
a @code{memoryview} object.

`Thread safety:' In @ref{1f6,,free-threaded} Python,
implementations must manage any internal export counter using atomic
operations. The method must be safe to call concurrently from multiple
threads, and the returned buffer’s underlying data must remain valid
until the corresponding @ref{1aab,,__release_buffer__()} call
completes. See @ref{2458,,Thread safety for memoryview objects} for details.
@end deffn

@geindex __release_buffer__() (object method)
@anchor{reference/datamodel object __release_buffer__}@anchor{1aab}
@deffn {Method} object.__release_buffer__ (self, buffer)

Called when a buffer is no longer needed. The `buffer' argument is a
@ref{166,,memoryview} object that was previously returned by
@ref{68d,,__buffer__()}. The method must release any resources associated
with the buffer. This method should return @code{None}.

`Thread safety:' In @ref{1f6,,free-threaded} Python,
any export counter decrement must use atomic operations. Resource
cleanup must be thread-safe, as the final release may race with
concurrent releases from other threads.

Buffer objects that do not need to perform any cleanup are not required
to implement this method.
@end deffn


Added in version 3.12.



@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 688

@item PEP 688@footnote{https://peps.python.org/pep-0688/} - Making the buffer protocol accessible in Python

Introduces the Python @code{__buffer__} and @code{__release_buffer__} methods.

@item @ref{341,,collections.abc.Buffer}

ABC for buffer types.
@end table


@node Annotations,Special method lookup,Emulating buffer types,Special method names
@anchor{reference/datamodel annotations}@anchor{2459}
@subsubsection Annotations


Functions, classes, and modules may contain @ref{15d,,annotations},
which are a way to associate information (usually @ref{2412,,type hints})
with a symbol.

@geindex __annotations__ (object attribute)
@anchor{reference/datamodel object __annotations__}@anchor{456}
@deffn {Attribute} object.__annotations__

This attribute contains the annotations for an object. It is
@ref{686,,lazily evaluated}, so accessing the attribute may
execute arbitrary code and raise exceptions. If evaluation is successful, the
attribute is set to a dictionary mapping from variable names to annotations.


Changed in version 3.14: Annotations are now lazily evaluated.

@end deffn

@geindex __annotate__() (object method)
@anchor{reference/datamodel object __annotate__}@anchor{19c7}
@deffn {Method} object.__annotate__ (format)

An @ref{15e,,annotate function}.
Returns a new dictionary object mapping attribute/parameter names to their annotation values.

Takes a format parameter specifying the format in which annotations values should be provided.
It must be a member of the @ref{232,,annotationlib.Format} enum, or an integer with
a value corresponding to a member of the enum.

If an annotate function doesn’t support the requested format, it must raise
@ref{369,,NotImplementedError}. Annotate functions must always support
@ref{15f,,VALUE} format; they must not raise
@ref{369,,NotImplementedError()} when called with this format.

When called with  @ref{15f,,VALUE} format, an annotate function may raise
@ref{450,,NameError}; it must not raise @code{NameError} when called requesting any other format.

If an object does not have any annotations, @ref{19c7,,__annotate__} should preferably be set
to @code{None} (it can’t be deleted), rather than set to a function that returns an empty dict.


Added in version 3.14.

@end deffn


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 649

@item PEP 649@footnote{https://peps.python.org/pep-0649/} — Deferred evaluation of annotation using descriptors

Introduces lazy evaluation of annotations and the @code{__annotate__} function.
@end table


@node Special method lookup,,Annotations,Special method names
@anchor{reference/datamodel special-lookup}@anchor{23f8}@anchor{reference/datamodel special-method-lookup}@anchor{245a}
@subsubsection Special method lookup


For custom classes, implicit invocations of special methods are only guaranteed
to work correctly if defined on an object’s type, not in the object’s instance
dictionary.  That behaviour is the reason why the following code raises an
exception:

@example
>>> class C:
...     pass
...
>>> c = C()
>>> c.__len__ = lambda: 5
>>> len(c)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: object of type 'C' has no len()
@end example

The rationale behind this behaviour lies with a number of special methods such
as @ref{cf9,,__hash__()} and @ref{830,,__repr__()} that are implemented
by all objects,
including type objects. If the implicit lookup of these methods used the
conventional lookup process, they would fail when invoked on the type object
itself:

@example
>>> 1 .__hash__() == hash(1)
True
>>> int.__hash__() == hash(int)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: descriptor '__hash__' of 'int' object needs an argument
@end example

Incorrectly attempting to invoke an unbound method of a class in this way is
sometimes referred to as ‘metaclass confusion’, and is avoided by bypassing
the instance when looking up special methods:

@example
>>> type(1).__hash__(1) == hash(1)
True
>>> type(int).__hash__(int) == hash(int)
True
@end example

In addition to bypassing any instance attributes in the interest of
correctness, implicit special method lookup generally also bypasses the
@ref{dd1,,__getattribute__()} method even of the object’s metaclass:

@example
>>> class Meta(type):
...     def __getattribute__(*args):
...         print("Metaclass getattribute invoked")
...         return type.__getattribute__(*args)
...
>>> class C(object, metaclass=Meta):
...     def __len__(self):
...         return 10
...     def __getattribute__(*args):
...         print("Class getattribute invoked")
...         return object.__getattribute__(*args)
...
>>> c = C()
>>> c.__len__()                 # Explicit lookup via instance
Class getattribute invoked
10
>>> type(c).__len__(c)          # Explicit lookup via type
Metaclass getattribute invoked
10
>>> len(c)                      # Implicit lookup
10
@end example

Bypassing the @ref{dd1,,__getattribute__()} machinery in this fashion
provides significant scope for speed optimisations within the
interpreter, at the cost of some flexibility in the handling of
special methods (the special method `must' be set on the class
object itself in order to be consistently invoked by the interpreter).

@geindex coroutine

@node Coroutines,,Special method names,Data model
@anchor{reference/datamodel coroutines}@anchor{245b}
@subsection Coroutines


@menu
* Awaitable Objects:: 
* Coroutine Objects:: 
* Asynchronous Iterators:: 
* Asynchronous Context Managers:: 

@end menu

@node Awaitable Objects,Coroutine Objects,,Coroutines
@anchor{reference/datamodel awaitable-objects}@anchor{245c}
@subsubsection Awaitable Objects


An @ref{4ca,,awaitable} object generally implements an @ref{f7b,,__await__()} method.
@ref{6ba,,Coroutine objects} returned from @ref{7ee,,async def} functions
are awaitable.

@cartouche
@quotation Note 
The @ref{ddf,,generator iterator} objects returned from generators
decorated with @ref{108e,,types.coroutine()}
are also awaitable, but they do not implement @ref{f7b,,__await__()}.
@end quotation
@end cartouche

@geindex __await__() (object method)
@anchor{reference/datamodel object __await__}@anchor{f7b}
@deffn {Method} object.__await__ (self)

Must return an @ref{4c9,,iterator}.  Should be used to implement
@ref{4ca,,awaitable} objects.  For instance, @ref{dcc,,asyncio.Future} implements
this method to be compatible with the @ref{18e,,await} expression.
The @ref{c84,,object} class itself is not awaitable and does not provide
this method.

@cartouche
@quotation Note 
The language doesn’t place any restriction on the type or value of the
objects yielded by the iterator returned by @code{__await__}, as this is
specific to the implementation of the asynchronous execution framework
(e.g. @ref{b,,asyncio}) that will be managing the @ref{4ca,,awaitable} object.
@end quotation
@end cartouche
@end deffn


Added in version 3.5.



@subsubheading See also


@geindex Python Enhancement Proposals; PEP 492
PEP 492@footnote{https://peps.python.org/pep-0492/} for additional information about awaitable objects.


@node Coroutine Objects,Asynchronous Iterators,Awaitable Objects,Coroutines
@anchor{reference/datamodel coroutine-objects}@anchor{239a}@anchor{reference/datamodel id19}@anchor{245d}
@subsubsection Coroutine Objects


@ref{6ba,,Coroutine objects} are @ref{4ca,,awaitable} objects.
A coroutine’s execution can be controlled by calling @ref{f7b,,__await__()} and
iterating over the result.  When the coroutine has finished executing and
returns, the iterator raises @ref{dfb,,StopIteration}, and the exception’s
@ref{245e,,value} attribute holds the return value.  If the
coroutine raises an exception, it is propagated by the iterator.  Coroutines
should not directly raise unhandled @code{StopIteration} exceptions.

Coroutines also have the methods listed below, which are analogous to
those of generators (see @ref{245f,,Generator-iterator methods}).  However, unlike
generators, coroutines do not directly support iteration.

Coroutines are @ref{2410,,generic} over the types of their yield, send,
and return values, respectively.


Changed in version 3.5.2: It is a @ref{246,,RuntimeError} to await on a coroutine more than once.


@geindex send() (coroutine method)
@anchor{reference/datamodel coroutine send}@anchor{2460}
@deffn {Method} coroutine.send (value)

Starts or resumes execution of the coroutine.  If `value' is @code{None},
this is equivalent to advancing the iterator returned by
@ref{f7b,,__await__()}.  If `value' is not @code{None}, this method delegates
to the @ref{2461,,send()} method of the iterator that caused
the coroutine to suspend.  The result (return value,
@ref{dfb,,StopIteration}, or other exception) is the same as when
iterating over the @code{__await__()} return value, described above.
@end deffn

@geindex throw() (coroutine method)
@anchor{reference/datamodel coroutine throw}@anchor{71c}
@deffn {Method} coroutine.throw (value)

@deffnx {Method} coroutine.throw (type[, value[, traceback]])

Raises the specified exception in the coroutine.  This method delegates
to the @ref{71d,,throw()} method of the iterator that caused
the coroutine to suspend, if it has such a method.  Otherwise,
the exception is raised at the suspension point.  The result
(return value, @ref{dfb,,StopIteration}, or other exception) is the same as
when iterating over the @ref{f7b,,__await__()} return value, described
above.  If the exception is not caught in the coroutine, it propagates
back to the caller.


Changed in version 3.12: The second signature (type[, value[, traceback]]) is deprecated and
may be removed in a future version of Python.

@end deffn

@geindex close() (coroutine method)
@anchor{reference/datamodel coroutine close}@anchor{2462}
@deffn {Method} coroutine.close ()

Causes the coroutine to clean itself up and exit.  If the coroutine
is suspended, this method first delegates to the @ref{17e5,,close()}
method of the iterator that caused the coroutine to suspend, if it
has such a method.  Then it raises @ref{15d3,,GeneratorExit} at the
suspension point, causing the coroutine to immediately clean itself up.
Finally, the coroutine is marked as having finished executing, even if
it was never started.

Coroutine objects are automatically closed using the above process when
they are about to be destroyed.
@end deffn

@node Asynchronous Iterators,Asynchronous Context Managers,Coroutine Objects,Coroutines
@anchor{reference/datamodel async-iterators}@anchor{f7d}@anchor{reference/datamodel asynchronous-iterators}@anchor{2463}
@subsubsection Asynchronous Iterators


An `asynchronous iterator' can call asynchronous code in
its @code{__anext__} method.

Asynchronous iterators can be used in an @ref{ca7,,async for} statement.

The @ref{c84,,object} class itself does not provide these methods.

@geindex __aiter__() (object method)
@anchor{reference/datamodel object __aiter__}@anchor{dfc}
@deffn {Method} object.__aiter__ (self)

Must return an `asynchronous iterator' object.
@end deffn

@geindex __anext__() (object method)
@anchor{reference/datamodel object __anext__}@anchor{18ca}
@deffn {Method} object.__anext__ (self)

Must return an `awaitable' resulting in a next value of the iterator.  Should
raise a @ref{1e52,,StopAsyncIteration} error when the iteration is over.
@end deffn

An example of an asynchronous iterable object:

@example
class Reader:
    async def readline(self):
        ...

    def __aiter__(self):
        return self

    async def __anext__(self):
        val = await self.readline()
        if val == b'@w{'}:
            raise StopAsyncIteration
        return val
@end example


Added in version 3.5.



Changed in version 3.7: Prior to Python 3.7, @ref{dfc,,__aiter__()} could return an `awaitable'
that would resolve to an
@ref{4c8,,asynchronous iterator}.

Starting with Python 3.7, @ref{dfc,,__aiter__()} must return an
asynchronous iterator object.  Returning anything else
will result in a @ref{199,,TypeError} error.


@node Asynchronous Context Managers,,Asynchronous Iterators,Coroutines
@anchor{reference/datamodel async-context-managers}@anchor{813}@anchor{reference/datamodel asynchronous-context-managers}@anchor{2464}
@subsubsection Asynchronous Context Managers


An `asynchronous context manager' is a `context manager' that is able to
suspend execution in its @code{__aenter__} and @code{__aexit__} methods.

Asynchronous context managers can be used in an @ref{186,,async with} statement.

The @ref{c84,,object} class itself does not provide these methods.

@geindex __aenter__() (object method)
@anchor{reference/datamodel object __aenter__}@anchor{2465}
@deffn {Method} object.__aenter__ (self)

Semantically similar to @ref{7e5,,__enter__()}, the only
difference being that it must return an `awaitable'.
@end deffn

@geindex __aexit__() (object method)
@anchor{reference/datamodel object __aexit__}@anchor{19e4}
@deffn {Method} object.__aexit__ (self, exc_type, exc_value, traceback)

Semantically similar to @ref{150c,,__exit__()}, the only
difference being that it must return an `awaitable'.
@end deffn

An example of an asynchronous context manager class:

@example
class AsyncContextManager:
    async def __aenter__(self):
        await log('entering context')

    async def __aexit__(self, exc_type, exc, tb):
        await log('exiting context')
@end example


Added in version 3.5.


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Execution model,The import system,Data model,The Python Language Reference
@anchor{reference/executionmodel doc}@anchor{2466}@anchor{reference/executionmodel execmodel}@anchor{2467}@anchor{reference/executionmodel execution-model}@anchor{2468}@anchor{reference/executionmodel translation-repo}@anchor{2469}
@section Execution model


@geindex execution model
@geindex code; block

@menu
* Structure of a program:: 
* Naming and binding:: 
* Exceptions: Exceptions<2>. 
* Runtime Components:: 

@end menu

@node Structure of a program,Naming and binding,,Execution model
@anchor{reference/executionmodel prog-structure}@anchor{246a}@anchor{reference/executionmodel structure-of-a-program}@anchor{246b}
@subsection Structure of a program


@geindex block

A Python program is constructed from code blocks.
A `block' is a piece of Python program text that is executed as a unit.
The following are blocks: a module, a function body, and a class definition.
Each command typed interactively is a block.  A script file (a file given as
standard input to the interpreter or specified as a command line argument to the
interpreter) is a code block.  A script command (a command specified on the
interpreter command line with the @ref{1a9,,-c} option) is a code block.
A module run as a top level script (as module @code{__main__}) from the command
line using a @ref{23e,,-m} argument is also a code block. The string
argument passed to the built-in functions @ref{4a4,,eval()} and @ref{4a3,,exec()} is a
code block.

@geindex execution; frame

A code block is executed in an `execution frame'.  A frame contains some
administrative information (used for debugging) and determines where and how
execution continues after the code block’s execution has completed.

@node Naming and binding,Exceptions<2>,Structure of a program,Execution model
@anchor{reference/executionmodel naming}@anchor{238a}@anchor{reference/executionmodel naming-and-binding}@anchor{246c}
@subsection Naming and binding


@geindex namespace
@geindex scope

@menu
* Binding of names:: 
* Resolution of names:: 
* Annotation scopes:: 
* Lazy evaluation:: 
* Builtins and restricted execution:: 
* Interaction with dynamic features:: 

@end menu

@node Binding of names,Resolution of names,,Naming and binding
@anchor{reference/executionmodel bind-names}@anchor{246d}@anchor{reference/executionmodel binding-of-names}@anchor{246e}
@subsubsection Binding of names


@geindex name
@geindex binding; name

`Names' refer to objects.  Names are introduced by name binding operations.

@geindex from; import statement

The following constructs bind names:


@itemize *

@item 
formal parameters to functions,

@item 
class definitions,

@item 
function definitions,

@item 
assignment expressions,

@item 
@ref{246f,,targets} that are identifiers if occurring in
an assignment:


@itemize +

@item 
@ref{348,,for} loop header,

@item 
after @code{as} in a @ref{187,,with} statement, @ref{1ac,,except}
clause, @ref{1ad,,except*} clause, or in the as-pattern in structural pattern matching,

@item 
in a capture pattern in structural pattern matching
@end itemize

@item 
@ref{7f9,,import} statements.

@item 
@ref{66d,,type} statements.

@item 
@ref{5ad,,type parameter lists}.
@end itemize

The @code{import} statement of the form @code{from ... import *} binds all
names defined in the imported module, except those beginning with an underscore.
This form may only be used at the module level.

A target occurring in a @ref{1b63,,del} statement is also considered bound for
this purpose (though the actual semantics are to unbind the name).

Each assignment or import statement occurs within a block defined by a class or
function definition or at the module level (the top-level code block).

@geindex free; variable

If a name is bound in a block, it is a local variable of that block, unless
declared as @ref{14b3,,nonlocal} or @ref{4ad,,global}.  If a name is bound at
the module level, it is a global variable.  (The variables of the module code
block are local and global.)  If a variable is used in a code block but not
defined there, it is a @ref{2470,,free variable}.

Each occurrence of a name in the program text refers to the `binding' of
that name established by the following name resolution rules.

@node Resolution of names,Annotation scopes,Binding of names,Naming and binding
@anchor{reference/executionmodel resolution-of-names}@anchor{2471}@anchor{reference/executionmodel resolve-names}@anchor{2472}
@subsubsection Resolution of names


@geindex scope

A `scope' defines the visibility of a name within a block.  If a local
variable is defined in a block, its scope includes that block.  If the
definition occurs in a function block, the scope extends to any blocks contained
within the defining one, unless a contained block introduces a different binding
for the name.

@geindex environment

When a name is used in a code block, it is resolved using the nearest enclosing
scope.  The set of all such scopes visible to a code block is called the block’s
`environment'.

@geindex NameError (built-in exception)
@geindex UnboundLocalError

When a name is not found at all, a @ref{450,,NameError} exception is raised.
If the current scope is a function scope, and the name refers to a local
variable that has not yet been bound to a value at the point where the name is
used, an @ref{1742,,UnboundLocalError} exception is raised.
@code{UnboundLocalError} is a subclass of @code{NameError}.

If a name binding operation occurs anywhere within a code block, all uses of the
name within the block are treated as references to the current block.  This can
lead to errors when a name is used within a block before it is bound.  This rule
is subtle.  Python lacks declarations and allows name binding operations to
occur anywhere within a code block.  The local variables of a code block can be
determined by scanning the entire text of the block for name binding operations.
See @ref{2473,,the FAQ entry on UnboundLocalError}
for examples.

If the @ref{4ad,,global} statement occurs within a block, all uses of the names
specified in the statement refer to the bindings of those names in the top-level
namespace.  Names are resolved in the top-level namespace by searching the
global namespace, i.e. the namespace of the module containing the code block,
and the builtins namespace, the namespace of the module @ref{13,,builtins}.  The
global namespace is searched first.  If the names are not found there, the
builtins namespace is searched next. If the names are also not found in the
builtins namespace, new variables are created in the global namespace.
The global statement must precede all uses of the listed names.

The @ref{4ad,,global} statement has the same scope as a name binding operation
in the same block.  If the nearest enclosing scope for a free variable contains
a global statement, the free variable is treated as a global.

@c XXX say more about "nonlocal" semantics here

The @ref{14b3,,nonlocal} statement causes corresponding names to refer
to previously bound variables in the nearest enclosing function scope.
@ref{18f,,SyntaxError} is raised at compile time if the given name does not
exist in any enclosing function scope. @ref{5ad,,Type parameters}
cannot be rebound with the @code{nonlocal} statement.

@geindex module; __main__

The namespace for a module is automatically created the first time a module is
imported.  The main module for a script is always called @ref{1,,__main__}.

Class definition blocks and arguments to @ref{4a3,,exec()} and @ref{4a4,,eval()} are
special in the context of name resolution.
A class definition is an executable statement that may use and define names.
These references follow the normal rules for name resolution with an exception
that unbound local variables are looked up in the global namespace.
The namespace of the class definition becomes the attribute dictionary of
the class. The scope of names defined in a class block is limited to the
class block; it does not extend to the code blocks of methods. This includes
comprehensions and generator expressions, but it does not include
@ref{4ac,,annotation scopes},
which have access to their enclosing class scopes.
This means that the following will fail:

@example
class A:
    a = 42
    b = list(a + i for i in range(10))
@end example

However, the following will succeed:

@example
class A:
    type Alias = Nested
    class Nested: pass

print(A.Alias.__value__)  # <type 'A.Nested'>
@end example

@node Annotation scopes,Lazy evaluation,Resolution of names,Naming and binding
@anchor{reference/executionmodel annotation-scopes}@anchor{4ac}@anchor{reference/executionmodel id1}@anchor{2474}
@subsubsection Annotation scopes


@ref{15d,,Annotations}, @ref{5ad,,type parameter lists}
and @ref{66d,,type} statements
introduce `annotation scopes', which behave mostly like function scopes,
but with some exceptions discussed below.

Annotation scopes are used in the following contexts:


@itemize *

@item 
@ref{205d,,Function annotations}.

@item 
@ref{f57,,Variable annotations}.

@item 
Type parameter lists for @ref{685,,generic type aliases}.

@item 
Type parameter lists for @ref{683,,generic functions}.
A generic function’s annotations are
executed within the annotation scope, but its defaults and decorators are not.

@item 
Type parameter lists for @ref{682,,generic classes}.
A generic class’s base classes and
keyword arguments are executed within the annotation scope, but its decorators are not.

@item 
The bounds, constraints, and default values for type parameters
(@ref{686,,lazily evaluated}).

@item 
The value of type aliases (@ref{686,,lazily evaluated}).
@end itemize

Annotation scopes differ from function scopes in the following ways:


@itemize *

@item 
Annotation scopes have access to their enclosing class namespace.
If an annotation scope is immediately within a class scope, or within another
annotation scope that is immediately within a class scope, the code in the
annotation scope can use names defined in the class scope as if it were
executed directly within the class body. This contrasts with regular
functions defined within classes, which cannot access names defined in the class scope.

@item 
Expressions in annotation scopes cannot contain @ref{bc8,,yield}, @code{yield from},
@ref{18e,,await}, or @ref{2475,,;=}
expressions. (These expressions are allowed in other scopes contained within the
annotation scope.)

@item 
Names defined in annotation scopes cannot be rebound with @ref{14b3,,nonlocal}
statements in inner scopes. This includes only type parameters, as no other
syntactic elements that can appear within annotation scopes can introduce new names.

@item 
While annotation scopes have an internal name, that name is not reflected in the
@ref{1d68,,qualified name} of objects defined within the scope.
Instead, the @ref{126b,,__qualname__}
of such objects is as if the object were defined in the enclosing scope.
@end itemize


Added in version 3.12: Annotation scopes were introduced in Python 3.12 as part of 
@geindex Python Enhancement Proposals; PEP 695
PEP 695@footnote{https://peps.python.org/pep-0695/}.



Changed in version 3.13: Annotation scopes are also used for type parameter defaults, as
introduced by 
@geindex Python Enhancement Proposals; PEP 696
PEP 696@footnote{https://peps.python.org/pep-0696/}.



Changed in version 3.14: Annotation scopes are now also used for annotations, as specified in
@geindex Python Enhancement Proposals; PEP 649
PEP 649@footnote{https://peps.python.org/pep-0649/} and 
@geindex Python Enhancement Proposals; PEP 749
PEP 749@footnote{https://peps.python.org/pep-0749/}.


@node Lazy evaluation,Builtins and restricted execution,Annotation scopes,Naming and binding
@anchor{reference/executionmodel id2}@anchor{2476}@anchor{reference/executionmodel lazy-evaluation}@anchor{686}
@subsubsection Lazy evaluation


Most annotation scopes are `lazily evaluated'. This includes annotations,
the values of type aliases created through the @ref{66d,,type} statement, and
the bounds, constraints, and default values of type
variables created through the @ref{5ad,,type parameter syntax}.
This means that they are not evaluated when the type alias or type variable is
created, or when the object carrying annotations is created. Instead, they
are only evaluated when necessary, for example when the @code{__value__}
attribute on a type alias is accessed.

Example:

@example
>>> type Alias = 1/0
>>> Alias.__value__
Traceback (most recent call last):
  ...
ZeroDivisionError: division by zero
>>> def func[T: 1/0](): pass
>>> T = func.__type_params__[0]
>>> T.__bound__
Traceback (most recent call last):
  ...
ZeroDivisionError: division by zero
@end example

Here the exception is raised only when the @code{__value__} attribute
of the type alias or the @code{__bound__} attribute of the type variable
is accessed.

This behavior is primarily useful for references to types that have not
yet been defined when the type alias or type variable is created. For example,
lazy evaluation enables creation of mutually recursive type aliases:

@example
from typing import Literal

type SimpleExpr = int | Parenthesized
type Parenthesized = tuple[Literal["("], Expr, Literal[")"]]
type Expr = SimpleExpr | tuple[SimpleExpr, Literal["+", "-"], Expr]
@end example

Lazily evaluated values are evaluated in @ref{4ac,,annotation scope},
which means that names that appear inside the lazily evaluated value are looked up
as if they were used in the immediately enclosing scope.


Added in version 3.12.


@node Builtins and restricted execution,Interaction with dynamic features,Lazy evaluation,Naming and binding
@anchor{reference/executionmodel builtins-and-restricted-execution}@anchor{2477}@anchor{reference/executionmodel restrict-exec}@anchor{2478}
@subsubsection Builtins and restricted execution


@geindex restricted; execution

`CPython implementation detail:' Users should not touch @code{__builtins__}; it is strictly an implementation
detail.  Users wanting to override values in the builtins namespace should
@ref{7f9,,import} the @ref{13,,builtins} module and modify its
attributes appropriately.

The builtins namespace associated with the execution of a code block
is actually found by looking up the name @code{__builtins__} in its
global namespace; this should be a dictionary or a module (in the
latter case the module’s dictionary is used).  By default, when in the
@ref{1,,__main__} module, @code{__builtins__} is the built-in module
@ref{13,,builtins}; when in any other module, @code{__builtins__} is an
alias for the dictionary of the @code{builtins} module itself.

@node Interaction with dynamic features,,Builtins and restricted execution,Naming and binding
@anchor{reference/executionmodel dynamic-features}@anchor{2479}@anchor{reference/executionmodel interaction-with-dynamic-features}@anchor{247a}
@subsubsection Interaction with dynamic features


Name resolution of free variables occurs at runtime, not at compile time.
This means that the following code will print 42:

@example
i = 10
def f():
    print(i)
i = 42
f()
@end example

@c XXX from * also invalid with relative imports (at least currently)

The @ref{4a4,,eval()} and @ref{4a3,,exec()} functions do not have access to the full
environment for resolving names.  Names may be resolved in the local and global
namespaces of the caller.  Free variables are not resolved in the nearest
enclosing namespace, but in the global namespace.  @footnote{
This limitation occurs because the code that is executed by these operations
is not available at the time the module is compiled.
} The @code{exec()} and
@code{eval()} functions have optional arguments to override the global and local
namespace.  If only one namespace is specified, it is used for both.

@c XXX(ncoghlan) above is only accurate for string execution. When executing code objects,
@c closure cells may now be passed explicitly to resolve co_freevars references.
@c Docs issue: https://github.com/python/cpython/issues/122826

@node Exceptions<2>,Runtime Components,Naming and binding,Execution model
@anchor{reference/executionmodel exceptions}@anchor{247b}@anchor{reference/executionmodel id4}@anchor{247c}
@subsection Exceptions


@geindex exception

@geindex raise an exception
@geindex handle an exception
@geindex exception handler
@geindex errors
@geindex error handling

Exceptions are a means of breaking out of the normal flow of control of a code
block in order to handle errors or other exceptional conditions.  An exception
is `raised' at the point where the error is detected; it may be `handled' by the
surrounding code block or by any code block that directly or indirectly invoked
the code block where the error occurred.

The Python interpreter raises an exception when it detects a run-time error
(such as division by zero).  A Python program can also explicitly raise an
exception with the @ref{804,,raise} statement. Exception handlers are specified
with the @ref{8fa,,try} … @ref{1ac,,except} statement.  The @ref{1b1,,finally}
clause of such a statement can be used to specify cleanup code which does not
handle the exception, but is executed whether an exception occurred or not in
the preceding code.

@geindex termination model

Python uses the “termination” model of error handling: an exception handler can
find out what happened and continue execution at an outer level, but it cannot
repair the cause of the error and retry the failing operation (except by
re-entering the offending piece of code from the top).

@geindex SystemExit (built-in exception)

When an exception is not handled at all, the interpreter terminates execution of
the program, or returns to its interactive main loop.  In either case, it prints
a stack traceback, except when the exception is @ref{f42,,SystemExit}.

Exceptions are identified by class instances.  The @ref{1ac,,except} clause is
selected depending on the class of the instance: it must reference the class of
the instance or a @ref{13c2,,non-virtual base class} thereof.
The instance can be received by the handler and can carry additional information
about the exceptional condition.

@cartouche
@quotation Note 
Exception messages are not part of the Python API.  Their contents may change
from one version of Python to the next without warning and should not be
relied on by code which will run under multiple versions of the interpreter.
@end quotation
@end cartouche

See also the description of the @ref{8fa,,try} statement in section @ref{8fa,,The try statement}
and @ref{804,,raise} statement in section @ref{804,,The raise statement}.

@node Runtime Components,,Exceptions<2>,Execution model
@anchor{reference/executionmodel execcomponents}@anchor{247d}@anchor{reference/executionmodel runtime-components}@anchor{247e}
@subsection Runtime Components


@menu
* General Computing Model:: 
* Python Runtime Model:: 

@end menu

@node General Computing Model,Python Runtime Model,,Runtime Components
@anchor{reference/executionmodel general-computing-model}@anchor{247f}
@subsubsection General Computing Model


Python’s execution model does not operate in a vacuum.  It runs on
a host machine and through that host’s runtime environment, including
its operating system (OS), if there is one.  When a program runs,
the conceptual layers of how it runs on the host look something
like this:

@quotation


@display
`host machine'@w{ }
@display
`process' (global resources)@w{ }
@display
`thread' (runs machine code)@w{ }
@end display
@end display
@end display


@end quotation

Each process represents a program running on the host.  Think of each
process itself as the data part of its program.  Think of the process’
threads as the execution part of the program.  This distinction will
be important to understand the conceptual Python runtime.

The process, as the data part, is the execution context in which the
program runs.  It mostly consists of the set of resources assigned to
the program by the host, including memory, signals, file handles,
sockets, and environment variables.

Processes are isolated and independent from one another.  (The same
is true for hosts.)  The host manages the process’ access to its
assigned resources, in addition to coordinating between processes.

Each thread represents the actual execution of the program’s machine
code, running relative to the resources assigned to the program’s
process.  It’s strictly up to the host how and when that execution
takes place.

From the point of view of Python, a program always starts with exactly
one thread.  However, the program may grow to run in multiple
simultaneous threads.  Not all hosts support multiple threads per
process, but most do.  Unlike processes, threads in a process are not
isolated and independent from one another.  Specifically, all threads
in a process share all of the process’ resources.

The fundamental point of threads is that each one does `run'
independently, at the same time as the others.  That may be only
conceptually at the same time (“concurrently”) or physically
(“in parallel”).  Either way, the threads effectively run
at a non-synchronized rate.

@cartouche
@quotation Note 
That non-synchronized rate means none of the process’ memory is
guaranteed to stay consistent for the code running in any given
thread.  Thus multi-threaded programs must take care to coordinate
access to intentionally shared resources.  Likewise, they must take
care to be absolutely diligent about not accessing any `other'
resources in multiple threads; otherwise two threads running at the
same time might accidentally interfere with each other’s use of some
shared data.  All this is true for both Python programs and the
Python runtime.

The cost of this broad, unstructured requirement is the tradeoff for
the kind of raw concurrency that threads provide.  The alternative
to the required discipline generally means dealing with
non-deterministic bugs and data corruption.
@end quotation
@end cartouche

@node Python Runtime Model,,General Computing Model,Runtime Components
@anchor{reference/executionmodel python-runtime-model}@anchor{2480}
@subsubsection Python Runtime Model


The same conceptual layers apply to each Python program, with some
extra data layers specific to Python:

@quotation


@display
`host machine'@w{ }
@display
`process' (global resources)@w{ }
@display
Python global runtime (`state')@w{ }
@display
Python interpreter (`state')@w{ }
@display
`thread' (runs Python bytecode and “C-API”)@w{ }
@display
Python thread `state'@w{ }
@end display
@end display
@end display
@end display
@end display
@end display


@end quotation

At the conceptual level: when a Python program starts, it looks exactly
like that diagram, with one of each.  The runtime may grow to include
multiple interpreters, and each interpreter may grow to include
multiple thread states.

@cartouche
@quotation Note 
A Python implementation won’t necessarily implement the runtime
layers distinctly or even concretely.  The only exception is places
where distinct layers are directly specified or exposed to users,
like through the @ref{f3,,threading} module.
@end quotation
@end cartouche

@cartouche
@quotation Note 
The initial interpreter is typically called the “main” interpreter.
Some Python implementations, like CPython, assign special roles
to the main interpreter.

Likewise, the host thread where the runtime was initialized is known
as the “main” thread.  It may be different from the process’ initial
thread, though they are often the same.  In some cases “main thread”
may be even more specific and refer to the initial thread state.
A Python runtime might assign specific responsibilities
to the main thread, such as handling signals.
@end quotation
@end cartouche

As a whole, the Python runtime consists of the global runtime state,
interpreters, and thread states.  The runtime ensures all that state
stays consistent over its lifetime, particularly when used with
multiple host threads.

The global runtime, at the conceptual level, is just a set of
interpreters.  While those interpreters are otherwise isolated and
independent from one another, they may share some data or other
resources.  The runtime is responsible for managing these global
resources safely.  The actual nature and management of these resources
is implementation-specific.  Ultimately, the external utility of the
global runtime is limited to managing interpreters.

In contrast, an “interpreter” is conceptually what we would normally
think of as the (full-featured) “Python runtime”.  When machine code
executing in a host thread interacts with the Python runtime, it calls
into Python in the context of a specific interpreter.

@cartouche
@quotation Note 
The term “interpreter” here is not the same as the “bytecode
interpreter”, which is what regularly runs in threads, executing
compiled Python code.

In an ideal world, “Python runtime” would refer to what we currently
call “interpreter”.  However, it’s been called “interpreter” at least
since introduced in 1997 (CPython:a027efa5b@footnote{https://github.com/python/cpython/commit/a027efa5b}).
@end quotation
@end cartouche

Each interpreter completely encapsulates all of the non-process-global,
non-thread-specific state needed for the Python runtime to work.
Notably, the interpreter’s state persists between uses.  It includes
fundamental data like @ref{1771,,sys.modules}.  The runtime ensures
multiple threads using the same interpreter will safely
share it between them.

A Python implementation may support using multiple interpreters at the
same time in the same process.  They are independent and isolated from
one another.  For example, each interpreter has its own
@ref{1771,,sys.modules}.

For thread-specific runtime state, each interpreter has a set of thread
states, which it manages, in the same way the global runtime contains
a set of interpreters.  It can have thread states for as many host
threads as it needs.  It may even have multiple thread states for
the same host thread, though that isn’t as common.

Each thread state, conceptually, has all the thread-specific runtime
data an interpreter needs to operate in one host thread.  The thread
state includes the current raised exception and the thread’s Python
call stack.  It may include other thread-specific resources.

@cartouche
@quotation Note 
The term “Python thread” can sometimes refer to a thread state, but
normally it means a thread created using the @ref{f3,,threading} module.
@end quotation
@end cartouche

Each thread state, over its lifetime, is always tied to exactly one
interpreter and exactly one host thread.  It will only ever be used in
that thread and with that interpreter.

Multiple thread states may be tied to the same host thread, whether for
different interpreters or even the same interpreter.  However, for any
given host thread, only one of the thread states tied to it can be used
by the thread at a time.

Thread states are isolated and independent from one another and don’t
share any data, except for possibly sharing an interpreter and objects
or other resources belonging to that interpreter.

Once a program is running, new Python threads can be created using the
@ref{f3,,threading} module (on platforms and Python implementations that
support threads).  Additional processes can be created using the
@ref{a5,,os}, @ref{dc,,subprocess}, and @ref{98,,multiprocessing} modules.
Interpreters can be created and used with the
@ref{25,,interpreters} module.  Coroutines (async) can
be run using @ref{b,,asyncio} in each interpreter, typically only
in a single thread (often the main thread).

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node The import system,Expressions,Execution model,The Python Language Reference
@anchor{reference/import doc}@anchor{2481}@anchor{reference/import importsystem}@anchor{23a4}@anchor{reference/import the-import-system}@anchor{2482}@anchor{reference/import translation-repo}@anchor{2483}
@section The import system


@geindex import machinery

Python code in one @ref{1a22,,module} gains access to the code in another module
by the process of @ref{2484,,importing} it.  The @ref{7f9,,import} statement is
the most common way of invoking the import machinery, but it is not the only
way.  Functions such as @ref{73d,,importlib.import_module()} and built-in
@ref{ad7,,__import__()} can also be used to invoke the import machinery.

The @ref{7f9,,import} statement combines two operations; it searches for the
named module, then it binds the results of that search to a name in the local
scope.  The search operation of the @code{import} statement is defined as
a call to the @ref{ad7,,__import__()} function, with the appropriate arguments.
The return value of @code{__import__()} is used to perform the name
binding operation of the @code{import} statement.  See the
@code{import} statement for the exact details of that name binding
operation.

A direct call to @ref{ad7,,__import__()} performs only the module search and, if
found, the module creation operation.  While certain side-effects may occur,
such as the importing of parent packages, and the updating of various caches
(including @ref{1771,,sys.modules}), only the @ref{7f9,,import} statement performs
a name binding operation.

When an @ref{7f9,,import} statement is executed, the standard builtin
@ref{ad7,,__import__()} function is called. Other mechanisms for invoking the
import system (such as @ref{73d,,importlib.import_module()}) may choose to bypass
@code{__import__()} and use their own solutions to implement import semantics.

When a module is first imported, Python searches for the module and if found,
it creates a module object @footnote{
See @ref{101a,,types.ModuleType}.
}, initializing it.  If the named module
cannot be found, a @ref{d43,,ModuleNotFoundError} is raised.  Python implements various
strategies to search for the named module when the import machinery is
invoked.  These strategies can be modified and extended by using various hooks
described in the sections below.


Changed in version 3.3: The import system has been updated to fully implement the second phase
of 
@geindex Python Enhancement Proposals; PEP 302
PEP 302@footnote{https://peps.python.org/pep-0302/}. There is no longer any implicit import machinery - the full
import system is exposed through @ref{f2d,,sys.meta_path}. In addition,
native namespace package support has been implemented (see 
@geindex Python Enhancement Proposals; PEP 420
PEP 420@footnote{https://peps.python.org/pep-0420/}).


@menu
* importlib: importlib<10>. 
* Packages: Packages<2>. 
* Searching:: 
* Loading:: 
* The Path Based Finder:: 
* Replacing the standard import system:: 
* Package Relative Imports:: 
* Special considerations for __main__:: 
* References:: 

@end menu

@node importlib<10>,Packages<2>,,The import system
@anchor{reference/import importlib}@anchor{2485}
@subsection @code{importlib}


The @ref{7b,,importlib} module provides a rich API for interacting with the
import system.  For example @ref{73d,,importlib.import_module()} provides a
recommended, simpler API than built-in @ref{ad7,,__import__()} for invoking the
import machinery.  Refer to the @code{importlib} library documentation for
additional detail.

@node Packages<2>,Searching,importlib<10>,The import system
@anchor{reference/import packages}@anchor{2486}
@subsection Packages


@geindex package

Python has only one type of module object, and all modules are of this type,
regardless of whether the module is implemented in Python, C, or something
else.  To help organize modules and provide a naming hierarchy, Python has a
concept of @ref{235,,packages}.

You can think of packages as the directories on a file system and modules as
files within directories, but don’t take this analogy too literally since
packages and modules need not originate from the file system.  For the
purposes of this documentation, we’ll use this convenient analogy of
directories and files.  Like file system directories, packages are organized
hierarchically, and packages may themselves contain subpackages, as well as
regular modules.

It’s important to keep in mind that all packages are modules, but not all
modules are packages.  Or put another way, packages are just a special kind of
module.  Specifically, any module that contains a @code{__path__} attribute is
considered a package.

All modules have a name.  Subpackage names are separated from their parent
package name by a dot, akin to Python’s standard attribute access syntax.  Thus
you might have a package called @ref{3f,,email}, which in turn has a subpackage
called @ref{49,,email.mime} and a module within that subpackage called
@ref{51,,email.mime.text}.

@menu
* Regular packages:: 
* Namespace packages:: 

@end menu

@node Regular packages,Namespace packages,,Packages<2>
@anchor{reference/import regular-packages}@anchor{2487}
@subsubsection Regular packages


@geindex package; regular

Python defines two types of packages, @ref{2488,,regular packages} and @ref{2b4,,namespace packages}.  Regular
packages are traditional packages as they existed in Python 3.2 and earlier.
A regular package is typically implemented as a directory containing an
@code{__init__.py} file.  When a regular package is imported, this
@code{__init__.py} file is implicitly executed, and the objects it defines are
bound to names in the package’s namespace.  The @code{__init__.py} file can
contain the same Python code that any other module can contain, and Python
will add some additional attributes to the module when it is imported.

For example, the following file system layout defines a top level @code{parent}
package with three subpackages:

@example
parent/
    __init__.py
    one/
        __init__.py
    two/
        __init__.py
    three/
        __init__.py
@end example

Importing @code{parent.one} will implicitly execute @code{parent/__init__.py} and
@code{parent/one/__init__.py}.  Subsequent imports of @code{parent.two} or
@code{parent.three} will execute @code{parent/two/__init__.py} and
@code{parent/three/__init__.py} respectively.

A subdirectory inside a regular package that does not contain an
@code{__init__.py} file is treated as an implicit
@ref{2489,,namespace package} (a “namespace
subpackage”) rooted in that parent.  See 
@geindex Python Enhancement Proposals; PEP 420
PEP 420@footnote{https://peps.python.org/pep-0420/} for the underlying
specification.

@node Namespace packages,,Regular packages,Packages<2>
@anchor{reference/import namespace-packages}@anchor{248a}@anchor{reference/import reference-namespace-package}@anchor{2489}
@subsubsection Namespace packages


@geindex package; namespace
@geindex package; portion

A namespace package is a composite of various @ref{248b,,portions},
where each portion contributes a subpackage to the parent package.  Portions
may reside in different locations on the file system.  Portions may also be
found in zip files, on the network, or anywhere else that Python searches
during import.  Namespace packages may or may not correspond directly to
objects on the file system; they may be virtual modules that have no concrete
representation.

Namespace packages do not use an ordinary list for their @code{__path__}
attribute. They instead use a custom iterable type which will automatically
perform a new search for package portions on the next import attempt within
that package if the path of their parent package (or @ref{3e2,,sys.path} for a
top level package) changes.

With namespace packages, there is no @code{parent/__init__.py} file.  In fact,
there may be multiple @code{parent} directories found during import search, where
each one is provided by a different portion.  Thus @code{parent/one} may not be
physically located next to @code{parent/two}.  In this case, Python will create a
namespace package for the top-level @code{parent} package whenever it or one of
its subpackages is imported.

Namespace packages may also be nested inside a regular package.  When the
import system searches a regular package’s @code{__path__} and encounters a
subdirectory that does not contain an @code{__init__.py} file, that
subdirectory becomes a @ref{248b,,portion} contributing to a namespace
subpackage of the enclosing regular package.

See also 
@geindex Python Enhancement Proposals; PEP 420
PEP 420@footnote{https://peps.python.org/pep-0420/} for the namespace package specification.

@node Searching,Loading,Packages<2>,The import system
@anchor{reference/import searching}@anchor{248c}
@subsection Searching


To begin the search, Python needs the @ref{1d68,,fully qualified}
name of the module (or package, but for the purposes of this discussion, the
difference is immaterial) being imported.  This name may come from various
arguments to the @ref{7f9,,import} statement, or from the parameters to the
@ref{73d,,importlib.import_module()} or @ref{ad7,,__import__()} functions.

This name will be used in various phases of the import search, and it may be
the dotted path to a submodule, e.g. @code{foo.bar.baz}.  In this case, Python
first tries to import @code{foo}, then @code{foo.bar}, and finally @code{foo.bar.baz}.
If any of the intermediate imports fail, a @ref{d43,,ModuleNotFoundError} is raised.

@menu
* The module cache:: 
* Finders and loaders:: 
* Import hooks:: 
* The meta path:: 

@end menu

@node The module cache,Finders and loaders,,Searching
@anchor{reference/import the-module-cache}@anchor{248d}
@subsubsection The module cache


@geindex sys.modules

The first place checked during import search is @ref{1771,,sys.modules}.  This
mapping serves as a cache of all modules that have been previously imported,
including the intermediate paths.  So if @code{foo.bar.baz} was previously
imported, @code{sys.modules} will contain entries for @code{foo}, @code{foo.bar},
and @code{foo.bar.baz}.  Each key will have as its value the corresponding module
object.

During import, the module name is looked up in @ref{1771,,sys.modules} and if
present, the associated value is the module satisfying the import, and the
process completes.  However, if the value is @code{None}, then a
@ref{d43,,ModuleNotFoundError} is raised.  If the module name is missing, Python will
continue searching for the module.

@ref{1771,,sys.modules} is writable.  Deleting a key may not destroy the
associated module (as other modules may hold references to it),
but it will invalidate the cache entry for the named module, causing
Python to search anew for the named module upon its next
import. The key can also be assigned to @code{None}, forcing the next import
of the module to result in a @ref{d43,,ModuleNotFoundError}.

Beware though, as if you keep a reference to the module object,
invalidate its cache entry in @ref{1771,,sys.modules}, and then re-import the
named module, the two module objects will `not' be the same. By contrast,
@ref{73e,,importlib.reload()} will reuse the `same' module object, and simply
reinitialise the module contents by rerunning the module’s code.

@node Finders and loaders,Import hooks,The module cache,Searching
@anchor{reference/import finders-and-loaders}@anchor{248e}@anchor{reference/import id2}@anchor{248f}
@subsubsection Finders and loaders


@geindex finder
@geindex loader
@geindex module spec

If the named module is not found in @ref{1771,,sys.modules}, then Python’s import
protocol is invoked to find and load the module.  This protocol consists of
two conceptual objects, @ref{23ae,,finders} and @ref{1a6f,,loaders}.
A finder’s job is to determine whether it can find the named module using
whatever strategy it knows about. Objects that implement both of these
interfaces are referred to as @ref{2490,,importers} - they return
themselves when they find that they can load the requested module.

Python includes a number of default finders and importers.  The first one
knows how to locate built-in modules, and the second knows how to locate
frozen modules.  A third default finder searches an @ref{2491,,import path}
for modules.  The import path is a list of locations that may
name file system paths or zip files.  It can also be extended to search
for any locatable resource, such as those identified by URLs.

The import machinery is extensible, so new finders can be added to extend the
range and scope of module searching.

Finders do not actually load modules.  If they can find the named module, they
return a `module spec', an encapsulation of the module’s import-related
information, which the import machinery then uses when loading the module.

The following sections describe the protocol for finders and loaders in more
detail, including how you can create and register new ones to extend the
import machinery.


Changed in version 3.4: In previous versions of Python, finders returned @ref{1a6f,,loaders}
directly, whereas now they return module specs which `contain' loaders.
Loaders are still used during import but have fewer responsibilities.


@node Import hooks,The meta path,Finders and loaders,Searching
@anchor{reference/import import-hooks}@anchor{2492}
@subsubsection Import hooks


@geindex import hooks
@geindex meta hooks
@geindex path hooks
@geindex hooks; import
@geindex hooks; meta
@geindex hooks; path

The import machinery is designed to be extensible; the primary mechanism for
this are the `import hooks'.  There are two types of import hooks: `meta
hooks' and `import path hooks'.

Meta hooks are called at the start of import processing, before any other
import processing has occurred, other than @ref{1771,,sys.modules} cache look up.
This allows meta hooks to override @ref{3e2,,sys.path} processing, frozen
modules, or even built-in modules.  Meta hooks are registered by adding new
finder objects to @ref{f2d,,sys.meta_path}, as described below.

Import path hooks are called as part of @ref{3e2,,sys.path} (or
@code{package.__path__}) processing, at the point where their associated path
item is encountered.  Import path hooks are registered by adding new callables
to @ref{122a,,sys.path_hooks} as described below.

@node The meta path,,Import hooks,Searching
@anchor{reference/import the-meta-path}@anchor{2493}
@subsubsection The meta path


@geindex sys.meta_path
@geindex finder; find_spec

When the named module is not found in @ref{1771,,sys.modules}, Python next
searches @ref{f2d,,sys.meta_path}, which contains a list of meta path finder
objects.  These finders are queried in order to see if they know how to handle
the named module.  Meta path finders must implement a method called
@ref{a6e,,find_spec()} which takes three arguments:
a name, an import path, and (optionally) a target module.  The meta path
finder can use any strategy it wants to determine whether it can handle
the named module or not.

If the meta path finder knows how to handle the named module, it returns a
spec object.  If it cannot handle the named module, it returns @code{None}.  If
@ref{f2d,,sys.meta_path} processing reaches the end of its list without returning
a spec, then a @ref{d43,,ModuleNotFoundError} is raised.  Any other exceptions
raised are simply propagated up, aborting the import process.

The @ref{a6e,,find_spec()} method of meta path
finders is called with two or three arguments.  The first is the fully
qualified name of the module being imported, for example @code{foo.bar.baz}.
The second argument is the path entries to use for the module search.  For
top-level modules, the second argument is @code{None}, but for submodules or
subpackages, the second argument is the value of the parent package’s
@code{__path__} attribute. If the appropriate @code{__path__} attribute cannot
be accessed, a @ref{d43,,ModuleNotFoundError} is raised.  The third argument
is an existing module object that will be the target of loading later.
The import system passes in a target module only during reload.

The meta path may be traversed multiple times for a single import request.
For example, assuming none of the modules involved has already been cached,
importing @code{foo.bar.baz} will first perform a top level import, calling
@code{mpf.find_spec("foo", None, None)} on each meta path finder (@code{mpf}). After
@code{foo} has been imported, @code{foo.bar} will be imported by traversing the
meta path a second time, calling
@code{mpf.find_spec("foo.bar", foo.__path__, None)}. Once @code{foo.bar} has been
imported, the final traversal will call
@code{mpf.find_spec("foo.bar.baz", foo.bar.__path__, None)}.

Some meta path finders only support top level imports. These importers will
always return @code{None} when anything other than @code{None} is passed as the
second argument.

Python’s default @ref{f2d,,sys.meta_path} has three meta path finders, one that
knows how to import built-in modules, one that knows how to import frozen
modules, and one that knows how to import modules from an @ref{2491,,import path}
(i.e. the @ref{2494,,path based finder}).


Changed in version 3.4: The @ref{a6e,,find_spec()} method of meta path
finders replaced @code{find_module()}, which
is now deprecated.  While it will continue to work without change, the
import machinery will try it only if the finder does not implement
@code{find_spec()}.



Changed in version 3.10: Use of @code{find_module()} by the import system
now raises @ref{71f,,ImportWarning}.



Changed in version 3.12: @code{find_module()} has been removed.
Use @ref{a6e,,find_spec()} instead.


@node Loading,The Path Based Finder,Searching,The import system
@anchor{reference/import loading}@anchor{2495}
@subsection Loading


If and when a module spec is found, the import machinery will use it (and
the loader it contains) when loading the module.  Here is an approximation
of what happens during the loading portion of import:

@example
module = None
if spec.loader is not None and hasattr(spec.loader, 'create_module'):
    # It is assumed 'exec_module' will also be defined on the loader.
    module = spec.loader.create_module(spec)
if module is None:
    module = ModuleType(spec.name)
# The import-related module attributes get set here:
_init_module_attrs(spec, module)

if spec.loader is None:
    # unsupported
    raise ImportError
if spec.origin is None and spec.submodule_search_locations is not None:
    # namespace package
    sys.modules[spec.name] = module
elif not hasattr(spec.loader, 'exec_module'):
    module = spec.loader.load_module(spec.name)
else:
    sys.modules[spec.name] = module
    try:
        spec.loader.exec_module(module)
    except BaseException:
        try:
            del sys.modules[spec.name]
        except KeyError:
            pass
        raise
return sys.modules[spec.name]
@end example

Note the following details:


@itemize *

@item 
If there is an existing module object with the given name in
@ref{1771,,sys.modules}, import will have already returned it.

@item 
The module will exist in @ref{1771,,sys.modules} before the loader
executes the module code.  This is crucial because the module code may
(directly or indirectly) import itself; adding it to @code{sys.modules}
beforehand prevents unbounded recursion in the worst case and multiple
loading in the best.

@item 
If loading fails, the failing module – and only the failing module –
gets removed from @ref{1771,,sys.modules}.  Any module already in the
@code{sys.modules} cache, and any module that was successfully loaded
as a side-effect, must remain in the cache.  This contrasts with
reloading where even the failing module is left in @code{sys.modules}.

@item 
After the module is created but before execution, the import machinery
sets the import-related module attributes (“_init_module_attrs” in
the pseudo-code example above), as summarized in a
@ref{23a5,,later section}.

@item 
Module execution is the key moment of loading in which the module’s
namespace gets populated.  Execution is entirely delegated to the
loader, which gets to decide what gets populated and how.

@item 
The module created during loading and passed to exec_module() may
not be the one returned at the end of import @footnote{
The importlib implementation avoids using the return value
directly. Instead, it gets the module object by looking the module name up
in @ref{1771,,sys.modules}.  The indirect effect of this is that an imported
module may replace itself in @code{sys.modules}.  This is
implementation-specific behavior that is not guaranteed to work in other
Python implementations.
}.
@end itemize


Changed in version 3.4: The import system has taken over the boilerplate responsibilities of
loaders.  These were previously performed by the
@ref{a6f,,importlib.abc.Loader.load_module()} method.


@menu
* Loaders:: 
* Submodules:: 
* Module specs:: 
* __path__ attributes on modules:: 
* Module reprs:: 
* Cached bytecode invalidation:: 

@end menu

@node Loaders,Submodules,,Loading
@anchor{reference/import loaders}@anchor{2496}
@subsubsection Loaders


Module loaders provide the critical function of loading: module execution.
The import machinery calls the @ref{a70,,importlib.abc.Loader.exec_module()}
method with a single argument, the module object to execute.  Any value
returned from @code{exec_module()} is ignored.

Loaders must satisfy the following requirements:


@itemize *

@item 
If the module is a Python module (as opposed to a built-in module or a
dynamically loaded extension), the loader should execute the module’s code
in the module’s global name space (@code{module.__dict__}).

@item 
If the loader cannot execute the module, it should raise an
@ref{65b,,ImportError}, although any other exception raised during
@ref{a70,,exec_module()} will be propagated.
@end itemize

In many cases, the finder and loader can be the same object; in such cases the
@ref{a6e,,find_spec()} method would just return a
spec with the loader set to @code{self}.

Module loaders may opt in to creating the module object during loading
by implementing a @ref{eb2,,create_module()} method.
It takes one argument, the module spec, and returns the new module object
to use during loading.  @code{create_module()} does not need to set any attributes
on the module object.  If the method returns @code{None}, the
import machinery will create the new module itself.


Added in version 3.4: The @ref{eb2,,create_module()} method of loaders.



Changed in version 3.4: The @ref{a6f,,load_module()} method was replaced by
@ref{a70,,exec_module()} and the import
machinery assumed all the boilerplate responsibilities of loading.

For compatibility with existing loaders, the import machinery will use
the @code{load_module()} method of loaders if it exists and the loader does
not also implement @code{exec_module()}.  However, @code{load_module()} has been
deprecated and loaders should implement @code{exec_module()} instead.

The @code{load_module()} method must implement all the boilerplate loading
functionality described above in addition to executing the module.  All
the same constraints apply, with some additional clarification:


@itemize *

@item 
If there is an existing module object with the given name in
@ref{1771,,sys.modules}, the loader must use that existing module.
(Otherwise, @ref{73e,,importlib.reload()} will not work correctly.)  If the
named module does not exist in @code{sys.modules}, the loader
must create a new module object and add it to @code{sys.modules}.

@item 
The module `must' exist in @ref{1771,,sys.modules} before the loader
executes the module code, to prevent unbounded recursion or multiple
loading.

@item 
If loading fails, the loader must remove any modules it has inserted
into @ref{1771,,sys.modules}, but it must remove `only' the failing
module(s), and only if the loader itself has loaded the module(s)
explicitly.
@end itemize



Changed in version 3.5: A @ref{1a4,,DeprecationWarning} is raised when @code{exec_module()} is defined but
@code{create_module()} is not.



Changed in version 3.6: An @ref{65b,,ImportError} is raised when @code{exec_module()} is defined but
@code{create_module()} is not.



Changed in version 3.10: Use of @code{load_module()} will raise @ref{71f,,ImportWarning}.


@node Submodules,Module specs,Loaders,Loading
@anchor{reference/import submodules}@anchor{2497}
@subsubsection Submodules


When a submodule is loaded using any mechanism (e.g. @code{importlib} APIs, the
@code{import} or @code{import-from} statements, or built-in @code{__import__()}) a
binding is placed in the parent module’s namespace to the submodule object.
For example, if package @code{spam} has a submodule @code{foo}, after importing
@code{spam.foo}, @code{spam} will have an attribute @code{foo} which is bound to the
submodule.  Let’s say you have the following directory structure:

@example
spam/
    __init__.py
    foo.py
@end example

and @code{spam/__init__.py} has the following line in it:

@example
from .foo import Foo
@end example

then executing the following puts name bindings for @code{foo} and @code{Foo} in the
@code{spam} module:

@example
>>> import spam
>>> spam.foo
<module 'spam.foo' from '/tmp/imports/spam/foo.py'>
>>> spam.Foo
<class 'spam.foo.Foo'>
@end example

Given Python’s familiar name binding rules this might seem surprising, but
it’s actually a fundamental feature of the import system.  The invariant
holding is that if you have @code{sys.modules['spam']} and
@code{sys.modules['spam.foo']} (as you would after the above import), the latter
must appear as the @code{foo} attribute of the former.

@node Module specs,__path__ attributes on modules,Submodules,Loading
@anchor{reference/import id4}@anchor{2498}@anchor{reference/import module-specs}@anchor{23aa}
@subsubsection Module specs


The import machinery uses a variety of information about each module
during import, especially before loading.  Most of the information is
common to all modules.  The purpose of a module’s spec is to encapsulate
this import-related information on a per-module basis.

Using a spec during import allows state to be transferred between import
system components, e.g. between the finder that creates the module spec
and the loader that executes it.  Most importantly, it allows the
import machinery to perform the boilerplate operations of loading,
whereas without a module spec the loader had that responsibility.

The module’s spec is exposed as @ref{23a8,,module.__spec__}. Setting
@code{__spec__} appropriately applies equally to
@ref{2499,,modules initialized during interpreter startup}.
The one exception is @code{__main__}, where @code{__spec__} is
@ref{249a,,set to None in some cases}.

See @ref{22b0,,ModuleSpec} for details on the contents of
the module spec.


Added in version 3.4.


@node __path__ attributes on modules,Module reprs,Module specs,Loading
@anchor{reference/import package-path-rules}@anchor{23ab}@anchor{reference/import path-attributes-on-modules}@anchor{249b}
@subsubsection __path__ attributes on modules


The @ref{2098,,__path__} attribute should be a (possibly empty)
@ref{717,,sequence} of strings enumerating the locations where the package’s
submodules will be found. By definition, if a module has a @code{__path__}
attribute, it is a @ref{235,,package}.

A package’s @ref{2098,,__path__} attribute is used during imports of its
subpackages.
Within the import machinery, it functions much the same as @ref{3e2,,sys.path},
i.e. providing a list of locations to search for modules during import.
However, @code{__path__} is typically much more constrained than
@code{sys.path}.

The same rules used for @ref{3e2,,sys.path} also apply to a package’s
@code{__path__}. @ref{122a,,sys.path_hooks} (described below) are
consulted when traversing a package’s @code{__path__}.

A package’s @code{__init__.py} file may set or alter the package’s
@ref{2098,,__path__}
attribute, and this was typically the way namespace packages were implemented
prior to 
@geindex Python Enhancement Proposals; PEP 420
PEP 420@footnote{https://peps.python.org/pep-0420/}.  With the adoption of 
@geindex Python Enhancement Proposals; PEP 420
PEP 420@footnote{https://peps.python.org/pep-0420/}, namespace packages no
longer need to supply @code{__init__.py} files containing only @code{__path__}
manipulation code; the import machinery automatically sets @code{__path__}
correctly for the namespace package.

@node Module reprs,Cached bytecode invalidation,__path__ attributes on modules,Loading
@anchor{reference/import module-reprs}@anchor{249c}
@subsubsection Module reprs


By default, all modules have a usable repr, however depending on the
attributes set above, and in the module’s spec, you can more explicitly
control the repr of module objects.

If the module has a spec (@code{__spec__}), the import machinery will try
to generate a repr from it.  If that fails or there is no spec, the import
system will craft a default repr using whatever information is available
on the module.  It will try to use the @code{module.__name__},
@code{module.__file__}, and @code{module.__loader__} as input into the repr,
with defaults for whatever information is missing.

Here are the exact rules used:


@itemize *

@item 
If the module has a @code{__spec__} attribute, the information in the spec
is used to generate the repr.  The “name”, “loader”, “origin”, and
“has_location” attributes are consulted.

@item 
If the module has a @code{__file__} attribute, this is used as part of the
module’s repr.

@item 
If the module has no @code{__file__} but does have a @code{__loader__} that is not
@code{None}, then the loader’s repr is used as part of the module’s repr.

@item 
Otherwise, just use the module’s @code{__name__} in the repr.
@end itemize


Changed in version 3.12: Use of @code{module_repr()}, having been deprecated since Python 3.4, was
removed in Python 3.12 and is no longer called during the resolution of a
module’s repr.


@node Cached bytecode invalidation,,Module reprs,Loading
@anchor{reference/import cached-bytecode-invalidation}@anchor{249d}@anchor{reference/import pyc-invalidation}@anchor{803}
@subsubsection Cached bytecode invalidation


Before Python loads cached bytecode from a @code{.pyc} file, it checks whether the
cache is up-to-date with the source @code{.py} file. By default, Python does this
by storing the source’s last-modified timestamp and size in the cache file when
writing it. At runtime, the import system then validates the cache file by
checking the stored metadata in the cache file against the source’s
metadata.

Python also supports “hash-based” cache files, which store a hash of the source
file’s contents rather than its metadata. There are two variants of hash-based
@code{.pyc} files: checked and unchecked. For checked hash-based @code{.pyc} files,
Python validates the cache file by hashing the source file and comparing the
resulting hash with the hash in the cache file. If a checked hash-based cache
file is found to be invalid, Python regenerates it and writes a new checked
hash-based cache file. For unchecked hash-based @code{.pyc} files, Python simply
assumes the cache file is valid if it exists. Hash-based @code{.pyc} files
validation behavior may be overridden with the @ref{2165,,--check-hash-based-pycs}
flag.


Changed in version 3.7: Added hash-based @code{.pyc} files. Previously, Python only supported
timestamp-based invalidation of bytecode caches.


@node The Path Based Finder,Replacing the standard import system,Loading,The import system
@anchor{reference/import the-path-based-finder}@anchor{249e}
@subsection The Path Based Finder


@geindex path based finder

As mentioned previously, Python comes with several default meta path finders.
One of these, called the @ref{2494,,path based finder}
(@ref{1229,,PathFinder}), searches an @ref{2491,,import path},
which contains a list of @ref{249f,,path entries}.  Each path
entry names a location to search for modules.

The path based finder itself doesn’t know how to import anything. Instead, it
traverses the individual path entries, associating each of them with a
path entry finder that knows how to handle that particular kind of path.

The default set of path entry finders implement all the semantics for finding
modules on the file system, handling special file types such as Python source
code (@code{.py} files), Python byte code (@code{.pyc} files) and
shared libraries (e.g. @code{.so} files). When supported by the @ref{139,,zipimport}
module in the standard library, the default path entry finders also handle
loading all of these file types (other than shared libraries) from zipfiles.

Path entries need not be limited to file system locations.  They can refer to
URLs, database queries, or any other location that can be specified as a
string.

The path based finder provides additional hooks and protocols so that you
can extend and customize the types of searchable path entries.  For example,
if you wanted to support path entries as network URLs, you could write a hook
that implements HTTP semantics to find modules on the web.  This hook (a
callable) would return a @ref{1277,,path entry finder} supporting the protocol
described below, which was then used to get a loader for the module from the
web.

A word of warning: this section and the previous both use the term `finder',
distinguishing between them by using the terms @ref{1276,,meta path finder} and
@ref{1277,,path entry finder}.  These two types of finders are very similar,
support similar protocols, and function in similar ways during the import
process, but it’s important to keep in mind that they are subtly different.
In particular, meta path finders operate at the beginning of the import
process, as keyed off the @ref{f2d,,sys.meta_path} traversal.

By contrast, path entry finders are in a sense an implementation detail
of the path based finder, and in fact, if the path based finder were to be
removed from @ref{f2d,,sys.meta_path}, none of the path entry finder semantics
would be invoked.

@menu
* Path entry finders:: 
* Path entry finder protocol:: 

@end menu

@node Path entry finders,Path entry finder protocol,,The Path Based Finder
@anchor{reference/import path-entry-finders}@anchor{24a0}
@subsubsection Path entry finders


@geindex sys.path
@geindex sys.path_hooks
@geindex sys.path_importer_cache
@geindex PYTHONPATH

The @ref{2494,,path based finder} is responsible for finding and loading
Python modules and packages whose location is specified with a string
@ref{249f,,path entry}.  Most path entries name locations in the file system,
but they need not be limited to this.

As a meta path finder, the @ref{2494,,path based finder} implements the
@ref{a6e,,find_spec()} protocol previously
described, however it exposes additional hooks that can be used to
customize how modules are found and loaded from the @ref{2491,,import path}.

Three variables are used by the @ref{2494,,path based finder}, @ref{3e2,,sys.path},
@ref{122a,,sys.path_hooks} and @ref{7fb,,sys.path_importer_cache}.  The @code{__path__}
attributes on package objects are also used.  These provide additional ways
that the import machinery can be customized.

@ref{3e2,,sys.path} contains a list of strings providing search locations for
modules and packages.  It is initialized from the 
@geindex PYTHONPATH
@geindex environment variable; PYTHONPATH
@ref{1223,,PYTHONPATH}
environment variable and various other installation- and
implementation-specific defaults.  Entries in @code{sys.path} can name
directories on the file system, zip files, and potentially other “locations”
(see the @ref{cc,,site} module) that should be searched for modules, such as
URLs, or database queries.  Only strings should be present on
@code{sys.path}; all other data types are ignored.

The @ref{2494,,path based finder} is a @ref{1276,,meta path finder}, so the import
machinery begins the @ref{2491,,import path} search by calling the path
based finder’s @ref{1217,,find_spec()} method as
described previously.  When the @code{path} argument to
@code{find_spec()} is given, it will be a
list of string paths to traverse - typically a package’s @code{__path__}
attribute for an import within that package.  If the @code{path} argument is
@code{None}, this indicates a top level import and @ref{3e2,,sys.path} is used.

The path based finder iterates over every entry in the search path, and
for each of these, looks for an appropriate @ref{1277,,path entry finder}
(@ref{a75,,PathEntryFinder}) for the
path entry.  Because this can be an expensive operation (e.g. there may be
@code{stat()} call overheads for this search), the path based finder maintains
a cache mapping path entries to path entry finders.  This cache is maintained
in @ref{7fb,,sys.path_importer_cache} (despite the name, this cache actually
stores finder objects rather than being limited to @ref{2490,,importer} objects).
In this way, the expensive search for a particular @ref{249f,,path entry}
location’s path entry finder need only be done once.  User code is
free to remove cache entries from @code{sys.path_importer_cache} forcing
the path based finder to perform the path entry search again.

If the path entry is not present in the cache, the path based finder iterates
over every callable in @ref{122a,,sys.path_hooks}.  Each of the @ref{24a1,,path entry hooks} in this list is called with a single argument, the
path entry to be searched.  This callable may either return a @ref{1277,,path entry finder} that can handle the path entry, or it may raise
@ref{65b,,ImportError}.  An @code{ImportError} is used by the path based finder to
signal that the hook cannot find a path entry finder
for that @ref{249f,,path entry}.  The
exception is ignored and @ref{2491,,import path} iteration continues.  The hook
should expect either a string or bytes object; the encoding of bytes objects
is up to the hook (e.g. it may be a file system encoding, UTF-8, or something
else), and if the hook cannot decode the argument, it should raise
@code{ImportError}.

If @ref{122a,,sys.path_hooks} iteration ends with no @ref{1277,,path entry finder}
being returned, then the path based finder’s
@ref{1217,,find_spec()} method will store @code{None}
in @ref{7fb,,sys.path_importer_cache} (to indicate that there is no finder for
this path entry) and return @code{None}, indicating that this
@ref{1276,,meta path finder} could not find the module.

If a @ref{1277,,path entry finder} `is' returned by one of the @ref{24a1,,path entry hook} callables on @ref{122a,,sys.path_hooks}, then the following protocol is used
to ask the finder for a module spec, which is then used when loading the
module.

The current working directory – denoted by an empty string – is handled
slightly differently from other entries on @ref{3e2,,sys.path}. First, if the
current working directory cannot be determined or is found not to exist, no
value is stored in @ref{7fb,,sys.path_importer_cache}. Second, the value for the
current working directory is looked up fresh for each module lookup. Third,
the path used for @code{sys.path_importer_cache} and returned by
@ref{1217,,importlib.machinery.PathFinder.find_spec()} will be the actual current
working directory and not the empty string.

@node Path entry finder protocol,,Path entry finders,The Path Based Finder
@anchor{reference/import path-entry-finder-protocol}@anchor{24a2}
@subsubsection Path entry finder protocol


In order to support imports of modules and initialized packages and also to
contribute portions to namespace packages, path entry finders must implement
the @ref{a72,,find_spec()} method.

@ref{a72,,find_spec()} takes two arguments: the
fully qualified name of the module being imported, and the (optional) target
module.  @code{find_spec()} returns a fully populated spec for the module.
This spec will always have “loader” set (with one exception).

To indicate to the import machinery that the spec represents a namespace
@ref{248b,,portion}, the path entry finder sets @code{submodule_search_locations} to
a list containing the portion.


Changed in version 3.4: @ref{a72,,find_spec()} replaced
@code{find_loader()} and
@code{find_module()}, both of which
are now deprecated, but will be used if @code{find_spec()} is not defined.

Older path entry finders may implement one of these two deprecated methods
instead of @code{find_spec()}.  The methods are still respected for the
sake of backward compatibility.  However, if @code{find_spec()} is
implemented on the path entry finder, the legacy methods are ignored.

@code{find_loader()} takes one argument, the
fully qualified name of the module being imported.  @code{find_loader()}
returns a 2-tuple where the first item is the loader and the second item
is a namespace @ref{248b,,portion}.

For backwards compatibility with other implementations of the import
protocol, many path entry finders also support the same,
traditional @code{find_module()} method that meta path finders support.
However path entry finder @code{find_module()} methods are never called
with a @code{path} argument (they are expected to record the appropriate
path information from the initial call to the path hook).

The @code{find_module()} method on path entry finders is deprecated,
as it does not allow the path entry finder to contribute portions to
namespace packages.  If both @code{find_loader()} and @code{find_module()}
exist on a path entry finder, the import system will always call
@code{find_loader()} in preference to @code{find_module()}.



Changed in version 3.10: Calls to @code{find_module()} and
@code{find_loader()} by the import
system will raise @ref{71f,,ImportWarning}.



Changed in version 3.12: @code{find_module()} and @code{find_loader()} have been removed.


@node Replacing the standard import system,Package Relative Imports,The Path Based Finder,The import system
@anchor{reference/import replacing-the-standard-import-system}@anchor{24a3}
@subsection Replacing the standard import system


The most reliable mechanism for replacing the entire import system is to
delete the default contents of @ref{f2d,,sys.meta_path}, replacing them
entirely with a custom meta path hook.

If it is acceptable to only alter the behaviour of import statements
without affecting other APIs that access the import system, then replacing
the builtin @ref{ad7,,__import__()} function may be sufficient.

To selectively prevent the import of some modules from a hook early on the
meta path (rather than disabling the standard import system entirely),
it is sufficient to raise @ref{d43,,ModuleNotFoundError} directly from
@ref{a6e,,find_spec()} instead of returning
@code{None}. The latter indicates that the meta path search should continue,
while raising an exception terminates it immediately.

@node Package Relative Imports,Special considerations for __main__,Replacing the standard import system,The import system
@anchor{reference/import package-relative-imports}@anchor{24a4}@anchor{reference/import relativeimports}@anchor{24a5}
@subsection Package Relative Imports


Relative imports use leading dots. A single leading dot indicates a relative
import, starting with the current package. Two or more leading dots indicate a
relative import to the parent(s) of the current package, one level per dot
after the first. For example, given the following package layout:

@example
package/
    __init__.py
    subpackage1/
        __init__.py
        moduleX.py
        moduleY.py
    subpackage2/
        __init__.py
        moduleZ.py
    moduleA.py
@end example

In either @code{subpackage1/moduleX.py} or @code{subpackage1/__init__.py},
the following are valid relative imports:

@example
from .moduleY import spam
from .moduleY import spam as ham
from . import moduleY
from ..subpackage1 import moduleY
from ..subpackage2.moduleZ import eggs
from ..moduleA import foo
@end example

Absolute imports may use either the @code{import <>} or @code{from <> import <>}
syntax, but relative imports may only use the second form; the reason
for this is that:

@example
import XXX.YYY.ZZZ
@end example

should expose @code{XXX.YYY.ZZZ} as a usable expression, but .moduleY is
not a valid expression.

@node Special considerations for __main__,References,Package Relative Imports,The import system
@anchor{reference/import import-dunder-main}@anchor{24a6}@anchor{reference/import special-considerations-for-main}@anchor{24a7}
@subsection Special considerations for __main__


The @ref{1,,__main__} module is a special case relative to Python’s import
system.  As noted @ref{2499,,elsewhere}, the @code{__main__} module
is directly initialized at interpreter startup, much like @ref{df,,sys} and
@ref{13,,builtins}.  However, unlike those two, it doesn’t strictly
qualify as a built-in module.  This is because the manner in which
@code{__main__} is initialized depends on the flags and other options with
which the interpreter is invoked.

@menu
* __main__.__spec__: __main__ __spec__. 

@end menu

@node __main__ __spec__,,,Special considerations for __main__
@anchor{reference/import id5}@anchor{24a8}@anchor{reference/import main-spec}@anchor{249a}
@subsubsection __main__.__spec__


Depending on how @ref{1,,__main__} is initialized, @code{__main__.__spec__}
gets set appropriately or to @code{None}.

When Python is started with the @ref{23e,,-m} option, @code{__spec__} is set
to the module spec of the corresponding module or package. @code{__spec__} is
also populated when the @code{__main__} module is loaded as part of executing a
directory, zipfile or other @ref{3e2,,sys.path} entry.

In @ref{215e,,the remaining cases}
@code{__main__.__spec__} is set to @code{None}, as the code used to populate the
@ref{1,,__main__} does not correspond directly with an importable module:


@itemize -

@item 
interactive prompt

@item 
@ref{1a9,,-c} option

@item 
running from stdin

@item 
running directly from a source or bytecode file
@end itemize

Note that @code{__main__.__spec__} is always @code{None} in the last case,
`even if' the file could technically be imported directly as a module
instead. Use the @ref{23e,,-m} switch if valid module metadata is desired
in @ref{1,,__main__}.

Note also that even when @code{__main__} corresponds with an importable module
and @code{__main__.__spec__} is set accordingly, they’re still considered
`distinct' modules. This is due to the fact that blocks guarded by
@code{if __name__ == "__main__":} checks only execute when the module is used
to populate the @code{__main__} namespace, and not during normal import.

@node References,,Special considerations for __main__,The import system
@anchor{reference/import references}@anchor{24a9}
@subsection References


The import machinery has evolved considerably since Python’s early days.  The
original specification for packages@footnote{https://www.python.org/doc/essays/packages/} is still available to read,
although some details have changed since the writing of that document.

The original specification for @ref{f2d,,sys.meta_path} was 
@geindex Python Enhancement Proposals; PEP 302
PEP 302@footnote{https://peps.python.org/pep-0302/}, with
subsequent extension in 
@geindex Python Enhancement Proposals; PEP 420
PEP 420@footnote{https://peps.python.org/pep-0420/}.

@geindex Python Enhancement Proposals; PEP 420
PEP 420@footnote{https://peps.python.org/pep-0420/} introduced @ref{2b4,,namespace packages} for
Python 3.3.  
@geindex Python Enhancement Proposals; PEP 420
PEP 420@footnote{https://peps.python.org/pep-0420/} also introduced the @code{find_loader()} protocol as an
alternative to @code{find_module()}.

@geindex Python Enhancement Proposals; PEP 366
PEP 366@footnote{https://peps.python.org/pep-0366/} describes the addition of the @code{__package__} attribute for
explicit relative imports in main modules.

@geindex Python Enhancement Proposals; PEP 328
PEP 328@footnote{https://peps.python.org/pep-0328/} introduced absolute and explicit relative imports and initially
proposed @code{__name__} for semantics 
@geindex Python Enhancement Proposals; PEP 366
PEP 366@footnote{https://peps.python.org/pep-0366/} would eventually specify for
@code{__package__}.

@geindex Python Enhancement Proposals; PEP 338
PEP 338@footnote{https://peps.python.org/pep-0338/} defines executing modules as scripts.

@geindex Python Enhancement Proposals; PEP 451
PEP 451@footnote{https://peps.python.org/pep-0451/} adds the encapsulation of per-module import state in spec
objects.  It also off-loads most of the boilerplate responsibilities of
loaders back onto the import machinery.  These changes allow the
deprecation of several APIs in the import system and also addition of new
methods to finders and loaders.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Expressions,Simple statements,The import system,The Python Language Reference
@anchor{reference/expressions doc}@anchor{24aa}@anchor{reference/expressions expressions}@anchor{236b}@anchor{reference/expressions id1}@anchor{24ab}@anchor{reference/expressions translation-repo}@anchor{24ac}
@section Expressions


@geindex expression
@geindex BNF

This chapter explains the meaning of the elements of expressions in Python.

`Syntax Notes:' In this and the following chapters,
@ref{22c8,,grammar notation} will be used to describe syntax,
not lexical analysis.

When (one alternative of) a syntax rule has the form:

@example
@anchor{reference/expressions grammar-token-python-grammar-name}@anchor{24ad}name: othername
@end example

and no semantics are given, the semantics of this form of @code{name} are the same
as for @code{othername}.

@menu
* Arithmetic conversions:: 
* Atoms:: 
* Primaries:: 
* Await expression:: 
* The power operator:: 
* Unary arithmetic and bitwise operations:: 
* Binary arithmetic operations:: 
* Shifting operations:: 
* Binary bitwise operations:: 
* Comparisons:: 
* Boolean operations:: 
* Assignment expressions: Assignment expressions<2>. 
* Conditional expressions:: 
* Lambdas:: 
* Expression lists:: 
* Evaluation order:: 
* Operator precedence:: 

@end menu

@node Arithmetic conversions,Atoms,,Expressions
@anchor{reference/expressions arithmetic-conversions}@anchor{24ae}@anchor{reference/expressions conversions}@anchor{24af}
@subsection Arithmetic conversions


@geindex arithmetic; conversion

When a description of an arithmetic operator below uses the phrase “the numeric
arguments are converted to a common real type”, this means that the operator
implementation for built-in numeric types works as described in the
@ref{24b0,,Numeric Types} section of the standard
library documentation.

Some additional rules apply for certain operators and non-numeric operands
(for example, a string as a left argument to the @code{%} operator).
Extensions must define their own conversion behavior.

@node Atoms,Primaries,Arithmetic conversions,Expressions
@anchor{reference/expressions atoms}@anchor{24b1}@anchor{reference/expressions id2}@anchor{24b2}
@subsection Atoms


@geindex atom

Atoms are the most basic elements of expressions.
The simplest atoms are @ref{22e4,,names} or literals.
Forms enclosed in parentheses, brackets or braces are also categorized
syntactically as atoms.

Formally, the syntax for atoms is:

@example
@anchor{reference/expressions grammar-token-python-grammar-atom}@anchor{24b3}atom:
   | 'True'
   | 'False'
   | 'None'
   | '...'
   | @ref{2305,,identifier}
   | @ref{24b4,,literal}
   | @ref{24b5,,enclosure}
@anchor{reference/expressions grammar-token-python-grammar-enclosure}@anchor{24b5}enclosure:
   | @ref{24b6,,parenth_form}
   | @ref{24b7,,list_display}
   | @ref{24b8,,dict_display}
   | @ref{24b9,,set_display}
   | @ref{24ba,,generator_expression}
   | @ref{24bb,,yield_atom}
@end example

@menu
* Built-in constants:: 
* Identifiers (Names): Identifiers Names. 
* Literals: Literals<2>. 
* Parenthesized forms:: 
* Displays for lists@comma{} sets and dictionaries: Displays for lists sets and dictionaries. 
* List displays:: 
* Set displays:: 
* Dictionary displays:: 
* Generator expressions:: 
* Yield expressions:: 

@end menu

@node Built-in constants,Identifiers Names,,Atoms
@anchor{reference/expressions atom-singletons}@anchor{24bc}@anchor{reference/expressions built-in-constants}@anchor{24bd}
@subsubsection Built-in constants


The keywords @code{True}, @code{False}, and @code{None} name
@ref{24be,,built-in constants}.
The token @code{...} names the @ref{236c,,Ellipsis} constant.

Evaluation of these atoms yields the corresponding value.

@cartouche
@quotation Note 
Several more built-in constants are available as global variables,
but only the ones mentioned here are @ref{22cd,,keywords}.
In particular, these names cannot be reassigned or used as attributes:

@example
>>> False = 123
  File "<input>", line 1
   False = 123
   ^^^^^
SyntaxError: cannot assign to False
@end example
@end quotation
@end cartouche

@node Identifiers Names,Literals<2>,Built-in constants,Atoms
@anchor{reference/expressions atom-identifiers}@anchor{230a}@anchor{reference/expressions identifiers-names}@anchor{24bf}
@subsubsection Identifiers (Names)


@geindex name
@geindex identifier

An identifier occurring as an atom is a name.  See section @ref{22e4,,Names (identifiers and keywords)}
for lexical definition and section @ref{238a,,Naming and binding} for documentation of naming and
binding.

@geindex exception; NameError

When the name is bound to an object, evaluation of the atom yields that object.
When a name is not bound, an attempt to evaluate it raises a @ref{450,,NameError}
exception.

@geindex name; mangling
@geindex private; names
@anchor{reference/expressions private-name-mangling}@anchor{20e7}
@menu
* Private name mangling:: 

@end menu

@node Private name mangling,,,Identifiers Names
@anchor{reference/expressions id3}@anchor{24c0}
@subsubsection Private name mangling


When an identifier that textually occurs in a class definition begins with two
or more underscore characters and does not end in two or more underscores, it
is considered a `private name' of that class.


@subsubheading See also


The @ref{14e3,,class specifications}.


More precisely, private names are transformed to a longer form before code is
generated for them.  If the transformed name is longer than 255 characters,
implementation-defined truncation may happen.

The transformation is independent of the syntactical context in which the
identifier is used but only the following private identifiers are mangled:


@itemize -

@item 
Any name used as the name of a variable that is assigned or read or any
name of an attribute being accessed.

The @ref{126c,,__name__} attribute of nested functions, classes, and
type aliases is however not mangled.

@item 
The name of imported modules, e.g., @code{__spam} in @code{import __spam}.
If the module is part of a package (i.e., its name contains a dot),
the name is `not' mangled, e.g., the @code{__foo} in @code{import __foo.bar}
is not mangled.

@item 
The name of an imported member, e.g., @code{__f} in @code{from spam import __f}.
@end itemize

The transformation rule is defined as follows:


@itemize -

@item 
The class name, with leading underscores removed and a single leading
underscore inserted, is inserted in front of the identifier, e.g., the
identifier @code{__spam} occurring in a class named @code{Foo}, @code{_Foo} or
@code{__Foo} is transformed to @code{_Foo__spam}.

@item 
If the class name consists only of underscores, the transformation is the
identity, e.g., the identifier @code{__spam} occurring in a class named @code{_}
or @code{__} is left as is.
@end itemize

@node Literals<2>,Parenthesized forms,Identifiers Names,Atoms
@anchor{reference/expressions atom-literals}@anchor{24c1}@anchor{reference/expressions literals}@anchor{24c2}
@subsubsection Literals


@geindex literal

A `literal' is a textual representation of a value.
Python supports numeric, string and bytes literals.
@ref{19b,,Format strings} and @ref{1844,,template strings}
are treated as string literals.

Numeric literals consist of a single @ref{234a,,NUMBER}
token, which names an integer, floating-point number, or an imaginary number.
See the @ref{22e5,,Numeric literals} section in Lexical analysis documentation for details.

String and bytes literals may consist of several tokens.
See section @ref{2324,,String literal concatenation} for details.

Note that negative and complex numbers, like @code{-3} or @code{3+4.2j},
are syntactically not literals, but @ref{24c3,,unary} or
@ref{24c4,,binary} arithmetic operations involving the @code{-} or @code{+}
operator.

Evaluation of a literal yields an object of the given type
(@ref{19c,,int}, @ref{197,,float}, @ref{198,,complex}, @ref{16a,,str},
@ref{193,,bytes}, or @ref{16b,,Template}) with the given value.
The value may be approximated in the case of floating-point
and imaginary literals.

The formal grammar for literals is:

@example
@anchor{reference/expressions grammar-token-python-grammar-literal}@anchor{24b4}literal: @ref{24c5,,strings} | @ref{234a,,NUMBER}
@end example

@geindex immutable; data; type
@geindex immutable; object

@menu
* Literals and object identity:: 
* String literal concatenation:: 

@end menu

@node Literals and object identity,String literal concatenation,,Literals<2>
@anchor{reference/expressions literals-and-object-identity}@anchor{24c6}
@subsubsection Literals and object identity


All literals correspond to immutable data types, and hence the object’s identity
is less important than its value.  Multiple evaluations of literals with the
same value (either the same occurrence in the program text or a different
occurrence) may obtain the same object or a different object with the same
value.

@cartouche
@quotation CPython implementation detail 
For example, in CPython, `small' integers with the same value evaluate
to the same object:

@example
>>> x = 7
>>> y = 7
>>> x is y
True
@end example

However, large integers evaluate to different objects:

@example
>>> x = 123456789
>>> y = 123456789
>>> x is y
False
@end example

This behavior may change in future versions of CPython.
In particular, the boundary between “small” and “large” integers has
already changed in the past.

CPython will emit a @ref{1af,,SyntaxWarning} when you compare literals
using @code{is}:

@example
>>> x = 7
>>> x is 7
<input>:1: SyntaxWarning: "is" with 'int' literal. Did you mean "=="?
True
@end example

See @ref{24c7,,When can I rely on identity tests with the is operator?} for more information.
@end quotation
@end cartouche

@ref{1844,,Template strings} are immutable but may reference mutable
objects as @ref{16c,,Interpolation} values.
For the purposes of this section, two t-strings have the “same value” if
both their structure and the `identity' of the values match.

`CPython implementation detail:' Currently, each evaluation of a template string results in
a different object.

@node String literal concatenation,,Literals and object identity,Literals<2>
@anchor{reference/expressions string-concatenation}@anchor{2324}@anchor{reference/expressions string-literal-concatenation}@anchor{24c8}
@subsubsection String literal concatenation


Multiple adjacent string or bytes literals, possibly
using different quoting conventions, are allowed, and their meaning is the same
as their concatenation:

@example
>>> "hello" 'world'
"helloworld"
@end example

This feature is defined at the syntactical level, so it only works with literals.
To concatenate string expressions at run time, the ‘+’ operator may be used:

@example
>>> greeting = "Hello"
>>> space = " "
>>> name = "Blaise"
>>> print(greeting + space + name)   # not: print(greeting space name)
Hello Blaise
@end example

Literal concatenation can freely mix raw strings, triple-quoted strings,
and formatted string literals.
For example:

@example
>>> "Hello" r', ' f"@{name@}!"
"Hello, Blaise!"
@end example

This feature can be used to reduce the number of backslashes
needed, to split long strings conveniently across long lines, or even to add
comments to parts of strings. For example:

@example
re.compile("[A-Za-z_]"       # letter or underscore
           "[A-Za-z0-9_]*"   # letter, digit or underscore
          )
@end example

However, bytes literals may only be combined with other byte literals;
not with string literals of any kind.
Also, template string literals may only be combined with other template
string literals:

@example
>>> t"Hello" t"@{name@}!"
Template(strings=('Hello', '!'), interpolations=(...))
@end example

Formally:

@example
@anchor{reference/expressions grammar-token-python-grammar-strings}@anchor{24c5}strings: (@ref{2315,,STRING} | @ref{2338,,fstring})+ | @ref{2348,,tstring}+
@end example

@node Parenthesized forms,Displays for lists sets and dictionaries,Literals<2>,Atoms
@anchor{reference/expressions parenthesized}@anchor{24c9}@anchor{reference/expressions parenthesized-forms}@anchor{24ca}
@subsubsection Parenthesized forms


@geindex parenthesized form
@geindex () (parentheses); tuple display

A parenthesized form is an optional expression list enclosed in parentheses:

@example
@anchor{reference/expressions grammar-token-python-grammar-parenth_form}@anchor{24b6}parenth_form: "(" [@ref{24cb,,starred_expression}] ")"
@end example

A parenthesized expression list yields whatever that expression list yields: if
the list contains at least one comma, it yields a tuple; otherwise, it yields
the single expression that makes up the expression list.

@geindex empty; tuple

An empty pair of parentheses yields an empty tuple object.  Since tuples are
immutable, the same rules as for literals apply (i.e., two occurrences of the empty
tuple may or may not yield the same object).

@geindex comma
@geindex @comma{} (comma)

Note that tuples are not formed by the parentheses, but rather by use of the
comma.  The exception is the empty tuple, for which parentheses `are'
required — allowing unparenthesized “nothing” in expressions would cause
ambiguities and allow common typos to pass uncaught.

@node Displays for lists sets and dictionaries,List displays,Parenthesized forms,Atoms
@anchor{reference/expressions comprehensions}@anchor{7ed}@anchor{reference/expressions displays-for-lists-sets-and-dictionaries}@anchor{24cc}
@subsubsection Displays for lists, sets and dictionaries


@geindex comprehensions

For constructing a list, a set or a dictionary Python provides special syntax
called “displays”, each of them in two flavors:


@itemize *

@item 
either the container contents are listed explicitly, or

@item 
they are computed via a set of looping and filtering instructions, called a
`comprehension'.
@end itemize

@geindex for; in comprehensions
@geindex if; in comprehensions
@geindex async for; in comprehensions

Common syntax elements for comprehensions are:

@example
@anchor{reference/expressions grammar-token-python-grammar-comprehension}@anchor{24cd}comprehension: @ref{2475,,assignment_expression} @ref{24ce,,comp_for}
@anchor{reference/expressions grammar-token-python-grammar-comp_for}@anchor{24ce}comp_for:      ["async"] "for" @ref{24cf,,target_list} "in" @ref{24d0,,or_test} [@ref{24d1,,comp_iter}]
@anchor{reference/expressions grammar-token-python-grammar-comp_iter}@anchor{24d1}comp_iter:     @ref{24ce,,comp_for} | @ref{24d2,,comp_if}
@anchor{reference/expressions grammar-token-python-grammar-comp_if}@anchor{24d2}comp_if:       "if" @ref{24d0,,or_test} [@ref{24d1,,comp_iter}]
@end example

The comprehension consists of a single expression followed by at least one
@code{for} clause and zero or more @code{for} or @code{if} clauses.
In this case, the elements of the new container are those that would be produced
by considering each of the @code{for} or @code{if} clauses a block,
nesting from left to right, and evaluating the expression to produce an element
each time the innermost block is reached.

However, aside from the iterable expression in the leftmost @code{for} clause,
the comprehension is executed in a separate implicitly nested scope. This ensures
that names assigned to in the target list don’t “leak” into the enclosing scope.

The iterable expression in the leftmost @code{for} clause is evaluated
directly in the enclosing scope and then passed as an argument to the implicitly
nested scope. Subsequent @code{for} clauses and any filter condition in the
leftmost @code{for} clause cannot be evaluated in the enclosing scope as
they may depend on the values obtained from the leftmost iterable. For example:
@code{[x*y for x in range(10) for y in range(x, x+10)]}.

To ensure the comprehension always results in a container of the appropriate
type, @code{yield} and @code{yield from} expressions are prohibited in the implicitly
nested scope.

@geindex await; in comprehensions

Since Python 3.6, in an @ref{7ee,,async def} function, an @code{async for}
clause may be used to iterate over a @ref{4c8,,asynchronous iterator}.
A comprehension in an @code{async def} function may consist of either a
@code{for} or @code{async for} clause following the leading
expression, may contain additional @code{for} or @code{async for}
clauses, and may also use @ref{18e,,await} expressions.

If a comprehension contains @code{async for} clauses, or if it contains
@code{await} expressions or other asynchronous comprehensions anywhere except
the iterable expression in the leftmost @code{for} clause, it is called an
`asynchronous comprehension'. An asynchronous comprehension may suspend the
execution of the coroutine function in which it appears.
See also 
@geindex Python Enhancement Proposals; PEP 530
PEP 530@footnote{https://peps.python.org/pep-0530/}.


Added in version 3.6: Asynchronous comprehensions were introduced.



Changed in version 3.8: @code{yield} and @code{yield from} prohibited in the implicitly nested scope.



Changed in version 3.11: Asynchronous comprehensions are now allowed inside comprehensions in
asynchronous functions. Outer comprehensions implicitly become
asynchronous.


@node List displays,Set displays,Displays for lists sets and dictionaries,Atoms
@anchor{reference/expressions list-displays}@anchor{24d3}@anchor{reference/expressions lists}@anchor{24d4}
@subsubsection List displays


@geindex list; display
@geindex list; comprehensions
@geindex empty; list
@geindex object; list
@geindex [] (square brackets); list expression
@geindex @comma{} (comma); expression list

A list display is a possibly empty series of expressions enclosed in square
brackets:

@example
@anchor{reference/expressions grammar-token-python-grammar-list_display}@anchor{24b7}list_display: "[" [@ref{24d5,,flexible_expression_list} | @ref{24cd,,comprehension}] "]"
@end example

A list display yields a new list object, the contents being specified by either
a list of expressions or a comprehension.  When a comma-separated list of
expressions is supplied, its elements are evaluated from left to right and
placed into the list object in that order.  When a comprehension is supplied,
the list is constructed from the elements resulting from the comprehension.

@node Set displays,Dictionary displays,List displays,Atoms
@anchor{reference/expressions set}@anchor{24d6}@anchor{reference/expressions set-displays}@anchor{24d7}
@subsubsection Set displays


@geindex set; display
@geindex set; comprehensions
@geindex object; set
@geindex @{@} (curly brackets); set expression
@geindex @comma{} (comma); expression list

A set display is denoted by curly braces and distinguishable from dictionary
displays by the lack of colons separating keys and values:

@example
@anchor{reference/expressions grammar-token-python-grammar-set_display}@anchor{24b9}set_display: "@{" (@ref{24d5,,flexible_expression_list} | @ref{24cd,,comprehension}) "@}"
@end example

A set display yields a new mutable set object, the contents being specified by
either a sequence of expressions or a comprehension.  When a comma-separated
list of expressions is supplied, its elements are evaluated from left to right
and added to the set object.  When a comprehension is supplied, the set is
constructed from the elements resulting from the comprehension.

An empty set cannot be constructed with @code{@{@}}; this literal constructs an empty
dictionary.

@node Dictionary displays,Generator expressions,Set displays,Atoms
@anchor{reference/expressions dict}@anchor{f85}@anchor{reference/expressions dictionary-displays}@anchor{24d8}
@subsubsection Dictionary displays


@geindex dictionary; display
@geindex dictionary; comprehensions
@geindex key
@geindex value
@geindex key/value pair
@geindex object; dictionary
@geindex @{@} (curly brackets); dictionary expression
@geindex ; (colon); in dictionary expressions
@geindex @comma{} (comma); in dictionary displays

A dictionary display is a possibly empty series of dict items (key/value pairs)
enclosed in curly braces:

@example
@anchor{reference/expressions grammar-token-python-grammar-dict_display}@anchor{24b8}dict_display:       "@{" [@ref{24d9,,dict_item_list} | @ref{24da,,dict_comprehension}] "@}"
@anchor{reference/expressions grammar-token-python-grammar-dict_item_list}@anchor{24d9}dict_item_list:     @ref{24db,,dict_item} ("," @ref{24db,,dict_item})* [","]
@anchor{reference/expressions grammar-token-python-grammar-dict_item}@anchor{24db}dict_item:          @ref{183,,expression} ":" @ref{183,,expression} | "**" @ref{2346,,or_expr}
@anchor{reference/expressions grammar-token-python-grammar-dict_comprehension}@anchor{24da}dict_comprehension: @ref{183,,expression} ":" @ref{183,,expression} @ref{24ce,,comp_for}
@end example

A dictionary display yields a new dictionary object.

If a comma-separated sequence of dict items is given, they are evaluated
from left to right to define the entries of the dictionary: each key object is
used as a key into the dictionary to store the corresponding value.  This means
that you can specify the same key multiple times in the dict item list, and the
final dictionary’s value for that key will be the last one given.

@geindex unpacking; dictionary
@geindex **; in dictionary displays

A double asterisk @code{**} denotes `dictionary unpacking'.
Its operand must be a @ref{13c7,,mapping}.  Each mapping item is added
to the new dictionary.  Later values replace values already set by
earlier dict items and earlier dictionary unpackings.


Added in version 3.5: Unpacking into dictionary displays, originally proposed by 
@geindex Python Enhancement Proposals; PEP 448
PEP 448@footnote{https://peps.python.org/pep-0448/}.


A dict comprehension, in contrast to list and set comprehensions, needs two
expressions separated with a colon followed by the usual “for” and “if” clauses.
When the comprehension is run, the resulting key and value elements are inserted
in the new dictionary in the order they are produced.

@geindex immutable; object
@geindex hashable

Restrictions on the types of the key values are listed earlier in section
@ref{2373,,The standard type hierarchy}.  (To summarize, the key type should be @ref{825,,hashable}, which excludes
all mutable objects.)  Clashes between duplicate keys are not detected; the last
value (textually rightmost in the display) stored for a given key value
prevails.


Changed in version 3.8: Prior to Python 3.8, in dict comprehensions, the evaluation order of key
and value was not well-defined.  In CPython, the value was evaluated before
the key.  Starting with 3.8, the key is evaluated before the value, as
proposed by 
@geindex Python Enhancement Proposals; PEP 572
PEP 572@footnote{https://peps.python.org/pep-0572/}.


@node Generator expressions,Yield expressions,Dictionary displays,Atoms
@anchor{reference/expressions generator-expressions}@anchor{24dc}@anchor{reference/expressions genexpr}@anchor{24dd}
@subsubsection Generator expressions


@geindex generator; expression
@geindex object; generator
@geindex () (parentheses); generator expression

The syntax for `generator expressions' is the same as for
list @ref{7ed,,comprehensions}, except that they are enclosed in
parentheses instead of brackets.
For example:

@example
>>> iterator = (x ** 2 for x in range(10))
>>> iterator
<generator object <genexpr> at ...>
@end example

At runtime, a generator expression evaluates to a @ref{ddf,,generator iterator}
which yields the same values as the corresponding list comprehension:

@example
>>> list(iterator)
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
@end example

Thus, the example above is roughly equivalent to defining and calling
the following generator function:

@example
def make_generator_of_squares(iterator):
    for x in iterator:
        yield x ** 2

make_generator_of_squares(iter(range(10)))
@end example

The enclosing parentheses can be omitted in calls when the generator
expression is the only positional argument and there are no keyword
arguments.
See the @ref{f83,,Calls section} for details.
For example:

@example
# The parentheses after `sum` are part of the call syntax:
>>> sum(x ** 2 for x in range(10))
285

# The generator needs its own parentheses if it's not the only argument:
>>> sum((x ** 2 for x in range(10)), start=1000)
1285
@end example

The iterable expression in the leftmost @code{for} clause is
evaluated immediately, so that an error raised by this expression will be
emitted at the point where the generator expression is defined,
rather than at the point where the first value is retrieved:

@example
>>> (x ** 2 for x in nonexistent_iterable)
Traceback (most recent call last):
  ...
NameError: name 'nonexistent_iterable' is not defined
@end example

After the expression is evaluated, an iterator is created
from the result, as if @ref{9dd,,iter()} was called on it.
Any error raised when creating the iterator is also emitted immediately:

@example
>>> (x ** 2 for x in None)
Traceback (most recent call last):
  ...
TypeError: 'NoneType' object is not iterable
@end example

All other expressions are evaluated lazily, in the same fashion as normal
generators (that is, when the iterator is asked to yield a value):

@example
>>> iterator = (nonexistent_value for x in range(10))
>>> iterator
<generator object <genexpr> at ...>
>>> list(iterator)
Traceback (most recent call last):
  ...
NameError: name 'nonexistent_value' is not defined
@end example

@example
>>> iterator = (x * y for x in range(10) for y in nonexistent_iterable)
>>> iterator
<generator object <genexpr> at ...>
>>> list(iterator)
Traceback (most recent call last):
  ...
NameError: name 'nonexistent_iterable' is not defined
@end example

To avoid interfering with the expected operation of the generator expression
itself, @code{yield} and @code{yield from} expressions are prohibited inside
the implicitly nested scope.

If a generator expression contains either @code{async for}
clauses or @ref{18e,,await} expressions it is called an
`asynchronous generator expression'.
An asynchronous generator expression returns a new asynchronous generator
object, which is an asynchronous iterator (see @ref{f7d,,Asynchronous Iterators}).

The formal grammar for generator expressions is:

@example
@anchor{reference/expressions grammar-token-python-grammar-generator_expression}@anchor{24ba}generator_expression: "(" @ref{183,,expression} @ref{24ce,,comp_for} ")"
@end example


Added in version 3.6: Asynchronous generator expressions were introduced.



Changed in version 3.7: Prior to Python 3.7, asynchronous generator expressions could
only appear in @ref{7ee,,async def} coroutines.  Starting
with 3.7, any function can use asynchronous generator expressions.



Changed in version 3.8: @code{yield} and @code{yield from} prohibited in the implicitly nested scope.


@node Yield expressions,,Generator expressions,Atoms
@anchor{reference/expressions yield-expressions}@anchor{24de}@anchor{reference/expressions yieldexpr}@anchor{24df}
@subsubsection Yield expressions


@geindex keyword; yield
@geindex keyword; from
@geindex yield; expression
@geindex generator; function

@example
@anchor{reference/expressions grammar-token-python-grammar-yield_atom}@anchor{24bb}yield_atom:       "(" @ref{2347,,yield_expression} ")"
@anchor{reference/expressions grammar-token-python-grammar-yield_from}@anchor{24e0}yield_from:       "yield" "from" @ref{183,,expression}
@anchor{reference/expressions grammar-token-python-grammar-yield_expression}@anchor{2347}yield_expression: "yield" @ref{24e1,,yield_list} | @ref{24e0,,yield_from}
@end example

The yield expression is used when defining a @ref{1267,,generator} function
or an @ref{24e2,,asynchronous generator} function and
thus can only be used in the body of a function definition.  Using a yield
expression in a function’s body causes that function to be a generator function,
and using it in an @ref{7ee,,async def} function’s body causes that
coroutine function to be an asynchronous generator function. For example:

@example
def gen():  # defines a generator function
    yield 123

async def agen(): # defines an asynchronous generator function
    yield 123
@end example

Due to their side effects on the containing scope, @code{yield} expressions
are not permitted as part of the implicitly defined scopes used to
implement comprehensions and generator expressions.


Changed in version 3.8: Yield expressions prohibited in the implicitly nested scopes used to
implement comprehensions and generator expressions.


Generator functions are described below, while asynchronous generator
functions are described separately in section
@ref{24e3,,Asynchronous generator functions}.

When a generator function is called, it returns an iterator known as a
generator.  That generator then controls the execution of the generator
function.  The execution starts when one of the generator’s methods is called.
At that time, the execution proceeds to the first yield expression, where it is
suspended again, returning the value of @ref{24e1,,yield_list}
to the generator’s caller,
or @code{None} if @code{yield_list} is omitted.
By suspended, we mean that all local state is
retained, including the current bindings of local variables, the instruction
pointer, the internal evaluation stack, and the state of any exception handling.
When the execution is resumed by calling one of the generator’s methods, the
function can proceed exactly as if the yield expression were just another
external call.  The value of the yield expression after resuming depends on the
method which resumed the execution.  If @ref{20f2,,__next__()} is used
(typically via either a @ref{348,,for} or the @ref{9de,,next()} builtin) then the
result is @ref{887,,None}.  Otherwise, if @ref{2461,,send()} is used, then
the result will be the value passed in to that method.

@geindex coroutine

All of this makes generator functions quite similar to coroutines; they yield
multiple times, they have more than one entry point and their execution can be
suspended.  The only difference is that a generator function cannot control
where the execution should continue after it yields; the control is always
transferred to the generator’s caller.

Yield expressions are allowed anywhere in a @ref{8fa,,try} construct.  If the
generator is not resumed before it is
finalized (by reaching a zero reference count or by being garbage collected),
the generator-iterator’s @ref{17e5,,close()} method will be called,
allowing any pending @ref{1b1,,finally} clauses to execute.

@geindex from; yield from expression

When @code{yield from <expr>} is used, the supplied expression must be an
iterable. The values produced by iterating that iterable are passed directly
to the caller of the current generator’s methods. Any values passed in with
@ref{2461,,send()} and any exceptions passed in with
@ref{71d,,throw()} are passed to the underlying iterator if it has the
appropriate methods.  If this is not the case, then @code{send()}
will raise @ref{5f0,,AttributeError} or @ref{199,,TypeError}, while
@code{throw()} will just raise the passed in exception immediately.

When the underlying iterator is complete, the @ref{245e,,value}
attribute of the raised @ref{dfb,,StopIteration} instance becomes the value of
the yield expression. It can be either set explicitly when raising
@code{StopIteration}, or automatically when the subiterator is a generator
(by returning a value from the subgenerator).


Changed in version 3.3: Added @code{yield from <expr>} to delegate control flow to a subiterator.


The parentheses may be omitted when the yield expression is the sole expression
on the right hand side of an assignment statement.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 255

@item PEP 255@footnote{https://peps.python.org/pep-0255/} - Simple Generators

The proposal for adding generators and the @ref{bc8,,yield} statement to Python.

@geindex Python Enhancement Proposals; PEP 342

@item PEP 342@footnote{https://peps.python.org/pep-0342/} - Coroutines via Enhanced Generators

The proposal to enhance the API and syntax of generators, making them
usable as simple coroutines.

@geindex Python Enhancement Proposals; PEP 380

@item PEP 380@footnote{https://peps.python.org/pep-0380/} - Syntax for Delegating to a Subgenerator

The proposal to introduce the @ref{24e0,,yield_from} syntax,
making delegation to subgenerators easy.

@geindex Python Enhancement Proposals; PEP 525

@item PEP 525@footnote{https://peps.python.org/pep-0525/} - Asynchronous Generators

The proposal that expanded on 
@geindex Python Enhancement Proposals; PEP 492
PEP 492@footnote{https://peps.python.org/pep-0492/} by adding generator capabilities to
coroutine functions.
@end table


@geindex object; generator

@menu
* Generator-iterator methods:: 
* Examples:: 
* Asynchronous generator functions: Asynchronous generator functions<2>. 
* Asynchronous generator-iterator methods:: 

@end menu

@node Generator-iterator methods,Examples,,Yield expressions
@anchor{reference/expressions generator-iterator-methods}@anchor{24e4}@anchor{reference/expressions generator-methods}@anchor{245f}
@subsubsection Generator-iterator methods


This subsection describes the methods of a generator iterator.  They can
be used to control the execution of a generator function.

Note that calling any of the generator methods below when the generator
is already executing raises a @ref{2ee,,ValueError} exception.

@geindex exception; StopIteration

@geindex __next__() (generator method)
@anchor{reference/expressions generator __next__}@anchor{20f2}
@deffn {Method} generator.__next__ ()

Starts the execution of a generator function or resumes it at the last
executed yield expression.  When a generator function is resumed with a
@code{__next__()} method, the current yield expression always
evaluates to @ref{887,,None}.  The execution then continues to the next yield
expression, where the generator is suspended again, and the value of the
@ref{24e1,,yield_list} is returned to @code{__next__()}’s
caller.  If the generator exits without yielding another value, a
@ref{dfb,,StopIteration} exception is raised.

This method is normally called implicitly, e.g. by a @ref{348,,for} loop, or
by the built-in @ref{9de,,next()} function.
@end deffn

@geindex send() (generator method)
@anchor{reference/expressions generator send}@anchor{2461}
@deffn {Method} generator.send (value)

Resumes the execution and “sends” a value into the generator function.  The
`value' argument becomes the result of the current yield expression.  The
@code{send()} method returns the next value yielded by the generator, or
raises @ref{dfb,,StopIteration} if the generator exits without yielding another
value.  When @code{send()} is called to start the generator, it must be called
with @ref{887,,None} as the argument, because there is no yield expression that
could receive the value.
@end deffn

@geindex throw() (generator method)
@anchor{reference/expressions generator throw}@anchor{71d}
@deffn {Method} generator.throw (value)

@deffnx {Method} generator.throw (type[, value[, traceback]])

Raises an exception at the point where the generator was paused,
and returns the next value yielded by the generator function.  If the generator
exits without yielding another value, a @ref{dfb,,StopIteration} exception is
raised.  If the generator function does not catch the passed-in exception, or
raises a different exception, then that exception propagates to the caller.

In typical use, this is called with a single exception instance similar to the
way the @ref{804,,raise} keyword is used.

For backwards compatibility, however, the second signature is
supported, following a convention from older versions of Python.
The `type' argument should be an exception class, and `value'
should be an exception instance. If the `value' is not provided, the
`type' constructor is called to get an instance. If `traceback'
is provided, it is set on the exception, otherwise any existing
@ref{14d2,,__traceback__} attribute stored in `value' may
be cleared.


Changed in version 3.12: The second signature (type[, value[, traceback]]) is deprecated and
may be removed in a future version of Python.

@end deffn

@geindex exception; GeneratorExit

@geindex close() (generator method)
@anchor{reference/expressions generator close}@anchor{17e5}
@deffn {Method} generator.close ()

Raises a @ref{15d3,,GeneratorExit} exception at the point where the generator
function was paused (equivalent to calling @code{throw(GeneratorExit)}).
The exception is raised by the yield expression where the generator was paused.
If the generator function catches the exception and returns a
value, this value is returned from @code{close()}.  If the generator function
is already closed, or raises @code{GeneratorExit} (by not catching the
exception), @code{close()} returns @ref{887,,None}.  If the generator yields a
value, a @ref{246,,RuntimeError} is raised.  If the generator raises any other
exception, it is propagated to the caller.  If the generator has already
exited due to an exception or normal exit, @code{close()} returns
@code{None} and has no other effect.


Changed in version 3.13: If a generator returns a value upon being closed, the value is returned
by @code{close()}.

@end deffn

@geindex yield; examples

@node Examples,Asynchronous generator functions<2>,Generator-iterator methods,Yield expressions
@anchor{reference/expressions examples}@anchor{24e5}
@subsubsection Examples


Here is a simple example that demonstrates the behavior of generators and
generator functions:

@example
>>> def echo(value=None):
...     print("Execution starts when 'next()' is called for the first time.")
...     try:
...         while True:
...             try:
...                 value = (yield value)
...             except Exception as e:
...                 value = e
...     finally:
...         print("Don't forget to clean up when 'close()' is called.")
...
>>> generator = echo(1)
>>> print(next(generator))
Execution starts when 'next()' is called for the first time.
1
>>> print(next(generator))
None
>>> print(generator.send(2))
2
>>> generator.throw(TypeError, "spam")
TypeError('spam',)
>>> generator.close()
Don't forget to clean up when 'close()' is called.
@end example

For examples using @code{yield from}, see @ref{1240,,PEP 380; Syntax for Delegating to a Subgenerator} in “What’s New in
Python.”

@node Asynchronous generator functions<2>,Asynchronous generator-iterator methods,Examples,Yield expressions
@anchor{reference/expressions asynchronous-generator-functions}@anchor{24e3}@anchor{reference/expressions id4}@anchor{24e6}
@subsubsection Asynchronous generator functions


The presence of a yield expression in a function or method defined using
@ref{7ee,,async def} further defines the function as an
@ref{24e2,,asynchronous generator} function.

When an asynchronous generator function is called, it returns an
asynchronous iterator known as an asynchronous generator object.
That object then controls the execution of the generator function.
An asynchronous generator object is typically used in an
@ref{ca7,,async for} statement in a coroutine function analogously to
how a generator object would be used in a @ref{348,,for} statement.

Calling one of the asynchronous generator’s methods returns an @ref{4ca,,awaitable}
object, and the execution starts when this object is awaited on. At that time,
the execution proceeds to the first yield expression, where it is suspended
again, returning the value of @ref{24e1,,yield_list} to the
awaiting coroutine. As with a generator, suspension means that all local state
is retained, including the current bindings of local variables, the instruction
pointer, the internal evaluation stack, and the state of any exception handling.
When the execution is resumed by awaiting on the next object returned by the
asynchronous generator’s methods, the function can proceed exactly as if the
yield expression were just another external call. The value of the yield
expression after resuming depends on the method which resumed the execution.  If
@ref{24e7,,__anext__()} is used then the result is @ref{887,,None}. Otherwise, if
@ref{adc,,asend()} is used, then the result will be the value passed in to that
method.

If an asynchronous generator happens to exit early by @ref{180,,break}, the caller
task being cancelled, or other exceptions, the generator’s async cleanup code
will run and possibly raise exceptions or access context variables in an
unexpected context–perhaps after the lifetime of tasks it depends, or
during the event loop shutdown when the async-generator garbage collection hook
is called.
To prevent this, the caller must explicitly close the async generator by calling
@ref{adb,,aclose()} method to finalize the generator and ultimately detach it
from the event loop.

In an asynchronous generator function, yield expressions are allowed anywhere
in a @ref{8fa,,try} construct. However, if an asynchronous generator is not
resumed before it is finalized (by reaching a zero reference count or by
being garbage collected), then a yield expression within a @code{try}
construct could result in a failure to execute pending @ref{1b1,,finally}
clauses.  In this case, it is the responsibility of the event loop or
scheduler running the asynchronous generator to call the asynchronous
generator-iterator’s @ref{adb,,aclose()} method and run the resulting
coroutine object, thus allowing any pending @code{finally} clauses
to execute.

To take care of finalization upon event loop termination, an event loop should
define a `finalizer' function which takes an asynchronous generator-iterator and
presumably calls @ref{adb,,aclose()} and executes the coroutine.
This  `finalizer' may be registered by calling @ref{19e0,,sys.set_asyncgen_hooks()}.
When first iterated over, an asynchronous generator-iterator will store the
registered `finalizer' to be called upon finalization. For a reference example
of a `finalizer' method see the implementation of
@code{asyncio.Loop.shutdown_asyncgens} in Lib/asyncio/base_events.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/asyncio/base_events.py}.

The expression @code{yield from <expr>} is a syntax error when used in an
asynchronous generator function.

@geindex object; asynchronous-generator

@node Asynchronous generator-iterator methods,,Asynchronous generator functions<2>,Yield expressions
@anchor{reference/expressions asynchronous-generator-iterator-methods}@anchor{24e8}@anchor{reference/expressions asynchronous-generator-methods}@anchor{24e9}
@subsubsection Asynchronous generator-iterator methods


This subsection describes the methods of an asynchronous generator iterator,
which are used to control the execution of a generator function.

@geindex exception; StopAsyncIteration

@geindex __anext__() (agen method)
@anchor{reference/expressions agen __anext__}@anchor{24e7}
@deffn {Method} async agen.__anext__ ()

Returns an awaitable which when run starts to execute the asynchronous
generator or resumes it at the last executed yield expression.  When an
asynchronous generator function is resumed with an @code{__anext__()}
method, the current yield expression always evaluates to @ref{887,,None} in the
returned awaitable, which when run will continue to the next yield
expression. The value of the @ref{24e1,,yield_list} of the
yield expression is the value of the @ref{dfb,,StopIteration} exception raised by
the completing coroutine.  If the asynchronous generator exits without
yielding another value, the awaitable instead raises a
@ref{1e52,,StopAsyncIteration} exception, signalling that the asynchronous
iteration has completed.

This method is normally called implicitly by a @ref{ca7,,async for} loop.
@end deffn

@geindex asend() (agen method)
@anchor{reference/expressions agen asend}@anchor{adc}
@deffn {Method} async agen.asend (value)

Returns an awaitable which when run resumes the execution of the
asynchronous generator. As with the @ref{2461,,send()} method for a
generator, this “sends” a value into the asynchronous generator function,
and the `value' argument becomes the result of the current yield expression.
The awaitable returned by the @code{asend()} method will return the next
value yielded by the generator as the value of the raised
@ref{dfb,,StopIteration}, or raises @ref{1e52,,StopAsyncIteration} if the
asynchronous generator exits without yielding another value.  When
@code{asend()} is called to start the asynchronous
generator, it must be called with @ref{887,,None} as the argument,
because there is no yield expression that could receive the value.
@end deffn

@geindex athrow() (agen method)
@anchor{reference/expressions agen athrow}@anchor{71e}
@deffn {Method} async agen.athrow (value)

@deffnx {Method} async agen.athrow (type[, value[, traceback]])

Returns an awaitable that raises an exception of type @code{type} at the point
where the asynchronous generator was paused, and returns the next value
yielded by the generator function as the value of the raised
@ref{dfb,,StopIteration} exception.  If the asynchronous generator exits
without yielding another value, a @ref{1e52,,StopAsyncIteration} exception is
raised by the awaitable.
If the generator function does not catch the passed-in exception, or
raises a different exception, then when the awaitable is run that exception
propagates to the caller of the awaitable.


Changed in version 3.12: The second signature (type[, value[, traceback]]) is deprecated and
may be removed in a future version of Python.

@end deffn

@geindex exception; GeneratorExit

@geindex aclose() (agen method)
@anchor{reference/expressions agen aclose}@anchor{adb}
@deffn {Method} async agen.aclose ()

Returns an awaitable that when run will throw a @ref{15d3,,GeneratorExit} into
the asynchronous generator function at the point where it was paused.
If the asynchronous generator function then exits gracefully, is already
closed, or raises @code{GeneratorExit} (by not catching the exception),
then the returned awaitable will raise a @ref{dfb,,StopIteration} exception.
Any further awaitables returned by subsequent calls to the asynchronous
generator will raise a @ref{1e52,,StopAsyncIteration} exception.  If the
asynchronous generator yields a value, a @ref{246,,RuntimeError} is raised
by the awaitable.  If the asynchronous generator raises any other exception,
it is propagated to the caller of the awaitable.  If the asynchronous
generator has already exited due to an exception or normal exit, then
further calls to @code{aclose()} will return an awaitable that does nothing.
@end deffn

@node Primaries,Await expression,Atoms,Expressions
@anchor{reference/expressions id5}@anchor{24ea}@anchor{reference/expressions primaries}@anchor{24eb}
@subsection Primaries


@geindex primary

Primaries represent the most tightly bound operations of the language. Their
syntax is:

@example
@anchor{reference/expressions grammar-token-python-grammar-primary}@anchor{24ec}primary: @ref{24b3,,atom} | @ref{24ed,,attributeref} | @ref{24ee,,subscription} | @ref{24ef,,call}
@end example

@menu
* Attribute references:: 
* Subscriptions and slicings:: 
* Calls:: 

@end menu

@node Attribute references,Subscriptions and slicings,,Primaries
@anchor{reference/expressions attribute-references}@anchor{24f0}@anchor{reference/expressions id6}@anchor{24f1}
@subsubsection Attribute references


@geindex attribute; reference
@geindex . (dot); attribute reference

An attribute reference is a primary followed by a period and a name:

@example
@anchor{reference/expressions grammar-token-python-grammar-attributeref}@anchor{24ed}attributeref: @ref{24ec,,primary} "." @ref{2305,,identifier}
@end example

@geindex exception; AttributeError
@geindex object; module
@geindex object; list

The primary must evaluate to an object of a type that supports attribute
references, which most objects do.  This object is then asked to produce the
attribute whose name is the identifier. The type and value produced is
determined by the object.  Multiple evaluations of the same attribute
reference may yield different objects.

This production can be customized by overriding the
@ref{dd1,,__getattribute__()} method or the @ref{6fb,,__getattr__()}
method.  The @code{__getattribute__()} method is called first and either
returns a value or raises @ref{5f0,,AttributeError} if the attribute is not
available.

If an @ref{5f0,,AttributeError} is raised and the object has a @code{__getattr__()}
method, that method is called as a fallback.

@node Subscriptions and slicings,Calls,Attribute references,Primaries
@anchor{reference/expressions subscriptions}@anchor{2415}@anchor{reference/expressions subscriptions-and-slicings}@anchor{24f2}
@subsubsection Subscriptions and slicings


@geindex subscription
@geindex [] (square brackets); subscription

@geindex object; sequence
@geindex object; mapping
@geindex object; string
@geindex object; tuple
@geindex object; list
@geindex object; dictionary
@geindex sequence; item

The `subscription' syntax is usually used for selecting an element from a
@ref{241b,,container} – for example, to get a value from
a @ref{184,,dict}:

@example
>>> digits_by_name = @{'one': 1, 'two': 2@}
>>> digits_by_name['two']  # Subscripting a dictionary using the key 'two'
2
@end example

In the subscription syntax, the object being subscribed – a
@ref{24eb,,primary} – is followed by a `subscript' in
square brackets.
In the simplest case, the subscript is a single expression.

Depending on the type of the object being subscribed, the subscript is
sometimes called a @ref{242b,,key} (for mappings), @ref{242a,,index} (for sequences),
or `type argument' (for @ref{1a2,,generic types}).
Syntactically, these are all equivalent:

@example
>>> colors = ['red', 'blue', 'green', 'black']
>>> colors[3]  # Subscripting a list using the index 3
'black'

>>> list[str]  # Parameterizing the list type using the type argument str
list[str]
@end example

At runtime, the interpreter will evaluate the primary and
the subscript, and call the primary’s @ref{588,,__getitem__()} or
@ref{948,,__class_getitem__()} @ref{1ca3,,special method} with the subscript
as argument.
For more details on which of these methods is called, see
@ref{2414,,__class_getitem__ versus __getitem__}.

To show how subscription works, we can define a custom object that
implements @ref{588,,__getitem__()} and prints out the value of
the subscript:

@example
>>> class SubscriptionDemo:
...     def __getitem__(self, key):
...         print(f'subscripted with: @{key!r@}')
...
>>> demo = SubscriptionDemo()
>>> demo[1]
subscripted with: 1
>>> demo['a' * 3]
subscripted with: 'aaa'
@end example

See @ref{588,,__getitem__()} documentation for how built-in types handle
subscription.

Subscriptions may also be used as targets in @ref{246f,,assignment} or
@ref{1b63,,deletion} statements.
In these cases, the interpreter will call the subscripted object’s
@ref{14d7,,__setitem__()} or @ref{14d8,,__delitem__()}
@ref{1ca3,,special method}, respectively, instead of @ref{588,,__getitem__()}.

@example
>>> colors = ['red', 'blue', 'green', 'black']
>>> colors[3] = 'white'  # Setting item at index
>>> colors
['red', 'blue', 'green', 'white']
>>> del colors[3]  # Deleting item at index 3
>>> colors
['red', 'blue', 'green']
@end example

All advanced forms of `subscript' documented in the following sections
are also usable for assignment and deletion.

@geindex slicing
@geindex slice
@geindex ; (colon); slicing
@geindex @comma{} (comma); slicing

@geindex object; sequence
@geindex object; string
@geindex object; tuple
@geindex object; list

@menu
* Slicings:: 
* Comma-separated subscripts:: 
* “Starred” subscriptions:: 
* Formal subscription grammar:: 

@end menu

@node Slicings,Comma-separated subscripts,,Subscriptions and slicings
@anchor{reference/expressions id7}@anchor{24f3}@anchor{reference/expressions slicings}@anchor{24f4}
@subsubsection Slicings


A more advanced form of subscription, `slicing', is commonly used
to extract a portion of a @ref{237c,,sequence}.
In this form, the subscript is a @ref{24f5,,slice}: up to three
expressions separated by colons.
Any of the expressions may be omitted, but a slice must contain at least one
colon:

@example
>>> number_names = ['zero', 'one', 'two', 'three', 'four', 'five']
>>> number_names[1:3]
['one', 'two']
>>> number_names[1:]
['one', 'two', 'three', 'four', 'five']
>>> number_names[:3]
['zero', 'one', 'two']
>>> number_names[:]
['zero', 'one', 'two', 'three', 'four', 'five']
>>> number_names[::2]
['zero', 'two', 'four']
>>> number_names[:-3]
['zero', 'one', 'two']
>>> del number_names[4:]
>>> number_names
['zero', 'one', 'two', 'three']
@end example

When a slice is evaluated, the interpreter constructs a @ref{695,,slice} object
whose @ref{23ec,,start}, @ref{23ed,,stop} and
@ref{23ee,,step} attributes, respectively, are the results of the
expressions between the colons.
Any missing expression evaluates to @ref{887,,None}.
This @code{slice} object is then passed to the @ref{588,,__getitem__()}
or @ref{948,,__class_getitem__()} @ref{1ca3,,special method}, as above.

@example
# continuing with the SubscriptionDemo instance defined above:
>>> demo[2:3]
subscripted with: slice(2, 3, None)
>>> demo[::'spam']
subscripted with: slice(None, None, 'spam')
@end example

@node Comma-separated subscripts,“Starred” subscriptions,Slicings,Subscriptions and slicings
@anchor{reference/expressions comma-separated-subscripts}@anchor{24f6}
@subsubsection Comma-separated subscripts


The subscript can also be given as two or more comma-separated expressions
or slices:

@example
# continuing with the SubscriptionDemo instance defined above:
>>> demo[1, 2, 3]
subscripted with: (1, 2, 3)
>>> demo[1:2, 3]
subscripted with: (slice(1, 2, None), 3)
@end example

This form is commonly used with numerical libraries for slicing
multi-dimensional data.
In this case, the interpreter constructs a @ref{614,,tuple} of the results of the
expressions or slices, and passes this tuple to the @ref{588,,__getitem__()}
or @ref{948,,__class_getitem__()} @ref{1ca3,,special method}, as above.

The subscript may also be given as a single expression or slice followed
by a comma, to specify a one-element tuple:

@example
>>> demo['spam',]
subscripted with: ('spam',)
@end example

@node “Starred” subscriptions,Formal subscription grammar,Comma-separated subscripts,Subscriptions and slicings
@anchor{reference/expressions starred-subscriptions}@anchor{24f7}
@subsubsection “Starred” subscriptions



Added in version 3.11: Expressions in `tuple_slices' may be starred. See 
@geindex Python Enhancement Proposals; PEP 646
PEP 646@footnote{https://peps.python.org/pep-0646/}.


The subscript can also contain a starred expression.
In this case, the interpreter unpacks the result into a tuple, and passes
this tuple to @ref{588,,__getitem__()} or @ref{948,,__class_getitem__()}:

@example
# continuing with the SubscriptionDemo instance defined above:
>>> demo[*range(10)]
subscripted with: (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
@end example

Starred expressions may be combined with comma-separated expressions
and slices:

@example
>>> demo['a', 'b', *range(3), 'c']
subscripted with: ('a', 'b', 0, 1, 2, 'c')
@end example

@node Formal subscription grammar,,“Starred” subscriptions,Subscriptions and slicings
@anchor{reference/expressions formal-subscription-grammar}@anchor{24f8}
@subsubsection Formal subscription grammar


@example
@anchor{reference/expressions grammar-token-python-grammar-subscription}@anchor{24ee}subscription:     @ref{24ec,,primary} '[' @ref{24f9,,subscript} ']'
@anchor{reference/expressions grammar-token-python-grammar-subscript}@anchor{24f9}subscript:        @ref{24fa,,single_subscript} | @ref{24fb,,tuple_subscript}
@anchor{reference/expressions grammar-token-python-grammar-single_subscript}@anchor{24fa}single_subscript: @ref{24fc,,proper_slice} | @ref{2475,,assignment_expression}
@anchor{reference/expressions grammar-token-python-grammar-proper_slice}@anchor{24fc}proper_slice:     [@ref{183,,expression}] ":" [@ref{183,,expression}] [ ":" [@ref{183,,expression}] ]
@anchor{reference/expressions grammar-token-python-grammar-tuple_subscript}@anchor{24fb}tuple_subscript:  ','.(@ref{24fa,,single_subscript} | @ref{24cb,,starred_expression})+ [',']
@end example

Recall that the @code{|} operator @ref{22c8,,denotes ordered choice}.
Specifically, in @code{subscript}, if both alternatives would match, the
first (@code{single_subscript}) has priority.

@geindex object; callable
@geindex call
@geindex argument; call semantics
@geindex () (parentheses); call
@geindex @comma{} (comma); argument list
@geindex = (equals); in function calls

@node Calls,,Subscriptions and slicings,Primaries
@anchor{reference/expressions calls}@anchor{f83}@anchor{reference/expressions id8}@anchor{24fd}
@subsubsection Calls


A call calls a callable object (e.g., a @ref{24fe,,function}) with a possibly empty
series of @ref{67b,,arguments}:

@example
@anchor{reference/expressions grammar-token-python-grammar-call}@anchor{24ef}call:                 @ref{24ec,,primary} "(" [@ref{24ff,,argument_list} [","] | @ref{24cd,,comprehension}] ")"
@anchor{reference/expressions grammar-token-python-grammar-argument_list}@anchor{24ff}argument_list:        @ref{2500,,positional_arguments} ["," @ref{2501,,starred_and_keywords}]
                        ["," @ref{2502,,keywords_arguments}]
                      | @ref{2501,,starred_and_keywords} ["," @ref{2502,,keywords_arguments}]
                      | @ref{2502,,keywords_arguments}
@anchor{reference/expressions grammar-token-python-grammar-positional_arguments}@anchor{2500}positional_arguments: @ref{2503,,positional_item} ("," @ref{2503,,positional_item})*
@anchor{reference/expressions grammar-token-python-grammar-positional_item}@anchor{2503}positional_item:      @ref{2475,,assignment_expression} | "*" @ref{183,,expression}
@anchor{reference/expressions grammar-token-python-grammar-starred_and_keywords}@anchor{2501}starred_and_keywords: ("*" @ref{183,,expression} | @ref{2504,,keyword_item})
                      ("," "*" @ref{183,,expression} | "," @ref{2504,,keyword_item})*
@anchor{reference/expressions grammar-token-python-grammar-keywords_arguments}@anchor{2502}keywords_arguments:   (@ref{2504,,keyword_item} | "**" @ref{183,,expression})
                      ("," @ref{2504,,keyword_item} | "," "**" @ref{183,,expression})*
@anchor{reference/expressions grammar-token-python-grammar-keyword_item}@anchor{2504}keyword_item:         @ref{2305,,identifier} "=" @ref{183,,expression}
@end example

An optional trailing comma may be present after the positional and keyword arguments
but does not affect the semantics.

@geindex parameter; call semantics

The primary must evaluate to a callable object (user-defined functions, built-in
functions, methods of built-in objects, class objects, methods of class
instances, and all objects having a @ref{77b,,__call__()} method are callable).  All
argument expressions are evaluated before the call is attempted.  Please refer
to section @ref{205c,,Function definitions} for the syntax of formal @ref{238f,,parameter} lists.

@c XXX update with kwonly args PEP

If keyword arguments are present, they are first converted to positional
arguments, as follows.  First, a list of unfilled slots is created for the
formal parameters.  If there are N positional arguments, they are placed in the
first N slots.  Next, for each keyword argument, the identifier is used to
determine the corresponding slot (if the identifier is the same as the first
formal parameter name, the first slot is used, and so on).  If the slot is
already filled, a @ref{199,,TypeError} exception is raised. Otherwise, the
argument is placed in the slot, filling it (even if the expression is
@code{None}, it fills the slot).  When all arguments have been processed, the slots
that are still unfilled are filled with the corresponding default value from the
function definition.  (Default values are calculated, once, when the function is
defined; thus, a mutable object such as a list or dictionary used as default
value will be shared by all calls that don’t specify an argument value for the
corresponding slot; this should usually be avoided.)  If there are any unfilled
slots for which no default value is specified, a @code{TypeError} exception is
raised.  Otherwise, the list of filled slots is used as the argument list for
the call.

`CPython implementation detail:' An implementation may provide built-in functions whose positional parameters
do not have names, even if they are ‘named’ for the purpose of documentation,
and which therefore cannot be supplied by keyword.  In CPython, this is the
case for functions implemented in C that use @ref{3bf,,PyArg_ParseTuple()} to
parse their arguments.

If there are more positional arguments than there are formal parameter slots, a
@ref{199,,TypeError} exception is raised, unless a formal parameter using the syntax
@code{*identifier} is present; in this case, that formal parameter receives a tuple
containing the excess positional arguments (or an empty tuple if there were no
excess positional arguments).

If any keyword argument does not correspond to a formal parameter name, a
@ref{199,,TypeError} exception is raised, unless a formal parameter using the syntax
@code{**identifier} is present; in this case, that formal parameter receives a
dictionary containing the excess keyword arguments (using the keywords as keys
and the argument values as corresponding values), or a (new) empty dictionary if
there were no excess keyword arguments.

@geindex * (asterisk); in function calls
@geindex unpacking; in function calls

If the syntax @code{*expression} appears in the function call, @code{expression} must
evaluate to an @ref{1433,,iterable}.  Elements from these iterables are
treated as if they were additional positional arguments.  For the call
@code{f(x1, x2, *y, x3, x4)}, if `y' evaluates to a sequence `y1', …, `yM',
this is equivalent to a call with M+4 positional arguments `x1', `x2',
`y1', …, `yM', `x3', `x4'.

A consequence of this is that although the @code{*expression} syntax may appear
`after' explicit keyword arguments, it is processed `before' the
keyword arguments (and any @code{**expression} arguments – see below).  So:

@example
>>> def f(a, b):
...     print(a, b)
...
>>> f(b=1, *(2,))
2 1
>>> f(a=1, *(2,))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: f() got multiple values for keyword argument 'a'
>>> f(1, *(2,))
1 2
@end example

It is unusual for both keyword arguments and the @code{*expression} syntax to be
used in the same call, so in practice this confusion does not often arise.

@geindex **; in function calls

If the syntax @code{**expression} appears in the function call, @code{expression} must
evaluate to a @ref{13c7,,mapping}, the contents of which are treated as
additional keyword arguments. If a parameter matching a key has already been
given a value (by an explicit keyword argument, or from another unpacking),
a @ref{199,,TypeError} exception is raised.

When @code{**expression} is used, each key in this mapping must be
a string.
Each value from the mapping is assigned to the first formal parameter
eligible for keyword assignment whose name is equal to the key.
A key need not be a Python identifier (e.g. @code{"max-temp °F"} is acceptable,
although it will not match any formal parameter that could be declared).
If there is no match to a formal parameter
the key-value pair is collected by the @code{**} parameter, if there is one,
or if there is not, a @ref{199,,TypeError} exception is raised.

Formal parameters using the syntax @code{*identifier} or @code{**identifier} cannot be
used as positional argument slots or as keyword argument names.


Changed in version 3.5: Function calls accept any number of @code{*} and @code{**} unpackings,
positional arguments may follow iterable unpackings (@code{*}),
and keyword arguments may follow dictionary unpackings (@code{**}).
Originally proposed by 
@geindex Python Enhancement Proposals; PEP 448
PEP 448@footnote{https://peps.python.org/pep-0448/}.


A call always returns some value, possibly @code{None}, unless it raises an
exception.  How this value is computed depends on the type of the callable
object.

If it is—


@table @asis

@item a user-defined function:

@geindex function; call
@geindex user-defined; function; call
@geindex object; user-defined function
@geindex object; function

The code block for the function is executed, passing it the argument list.  The
first thing the code block will do is bind the formal parameters to the
arguments; this is described in section @ref{205c,,Function definitions}.  When the code block
executes a @ref{1b0,,return} statement, this specifies the return value of the
function call.  If execution reaches the end of the code block without
executing a @code{return} statement, the return value is @code{None}.

@item a built-in function or method:

@geindex function; call
@geindex built-in function; call
@geindex method; call
@geindex built-in method; call
@geindex object; built-in method
@geindex object; built-in function
@geindex object; method
@geindex object; function

The result is up to the interpreter; see @ref{1468,,Built-in Functions} for the
descriptions of built-in functions and methods.

@item a class object:

@geindex object; class
@geindex class object; call

A new instance of that class is returned.

@item a class instance method:

@geindex object; class instance
@geindex object; instance
@geindex class instance; call

The corresponding user-defined function is called, with an argument list that is
one longer than the argument list of the call: the instance becomes the first
argument.

@item a class instance:

@geindex instance; call
@geindex __call__() (object method)

The class must define a @ref{77b,,__call__()} method; the effect is then the same as
if that method was called.
@end table

@geindex keyword; await

@node Await expression,The power operator,Primaries,Expressions
@anchor{reference/expressions await}@anchor{18e}@anchor{reference/expressions await-expression}@anchor{2505}
@subsection Await expression


Suspend the execution of @ref{6ba,,coroutine} on an @ref{4ca,,awaitable} object.
Can only be used inside a @ref{f79,,coroutine function}.

@example
@anchor{reference/expressions grammar-token-python-grammar-await_expr}@anchor{2506}await_expr: "await" @ref{24ec,,primary}
@end example


Added in version 3.5.


@node The power operator,Unary arithmetic and bitwise operations,Await expression,Expressions
@anchor{reference/expressions power}@anchor{2507}@anchor{reference/expressions the-power-operator}@anchor{2508}
@subsection The power operator


@geindex power; operation
@geindex operator; **

The power operator binds more tightly than unary operators on its left; it binds
less tightly than unary operators on its right.  The syntax is:

@example
@anchor{reference/expressions grammar-token-python-grammar-power}@anchor{2509}power: (@ref{2506,,await_expr} | @ref{24ec,,primary}) ["**" @ref{250a,,u_expr}]
@end example

Thus, in an unparenthesized sequence of power and unary operators, the operators
are evaluated from right to left (this does not constrain the evaluation order
for the operands): @code{-1**2} results in @code{-1}.

The power operator has the same semantics as the built-in @ref{1a5,,pow()} function,
when called with two arguments: it yields its left argument raised to the power
of its right argument.
Numeric arguments are first @ref{24b0,,converted to a common type},
and the result is of that type.

For int operands, the result has the same type as the operands unless the second
argument is negative; in that case, all arguments are converted to float and a
float result is delivered. For example, @code{10**2} returns @code{100}, but
@code{10**-2} returns @code{0.01}.

Raising @code{0.0} to a negative power results in a @ref{b45,,ZeroDivisionError}.
Raising a negative number to a fractional power results in a @ref{198,,complex}
number. (In earlier versions it raised a @ref{2ee,,ValueError}.)

This operation can be customized using the special @ref{9da,,__pow__()} and
@ref{1a6,,__rpow__()} methods.

@node Unary arithmetic and bitwise operations,Binary arithmetic operations,The power operator,Expressions
@anchor{reference/expressions unary}@anchor{24c3}@anchor{reference/expressions unary-arithmetic-and-bitwise-operations}@anchor{250b}
@subsection Unary arithmetic and bitwise operations


@geindex unary; arithmetic; operation
@geindex unary; bitwise; operation

All unary arithmetic and bitwise operations have the same priority:

@example
@anchor{reference/expressions grammar-token-python-grammar-u_expr}@anchor{250a}u_expr: @ref{2509,,power} | "-" @ref{250a,,u_expr} | "+" @ref{250a,,u_expr} | "~" @ref{250a,,u_expr}
@end example

@geindex negation
@geindex minus
@geindex operator; - (minus)
@geindex - (minus); unary operator

The unary @code{-} (minus) operator yields the negation of its numeric argument; the
operation can be overridden with the @ref{244a,,__neg__()} special method.

@geindex plus
@geindex operator; + (plus)
@geindex + (plus); unary operator

The unary @code{+} (plus) operator yields its numeric argument unchanged; the
operation can be overridden with the @ref{244b,,__pos__()} special method.

@geindex inversion
@geindex operator; ~ (tilde)

The unary @code{~} (invert) operator yields the bitwise inversion of its integer
argument.  The bitwise inversion of @code{x} is defined as @code{-(x+1)}.  It only
applies to integral numbers or to custom objects that override the
@ref{244d,,__invert__()} special method.

@geindex exception; TypeError

In all three cases, if the argument does not have the proper type, a
@ref{199,,TypeError} exception is raised.

@node Binary arithmetic operations,Shifting operations,Unary arithmetic and bitwise operations,Expressions
@anchor{reference/expressions binary}@anchor{24c4}@anchor{reference/expressions binary-arithmetic-operations}@anchor{250c}
@subsection Binary arithmetic operations


@geindex binary; arithmetic; operation

The binary arithmetic operations have the conventional priority levels.  Note
that some of these operations also apply to certain non-numeric types.  Apart
from the power operator, there are only two levels, one for multiplicative
operators and one for additive operators:

@example
@anchor{reference/expressions grammar-token-python-grammar-m_expr}@anchor{250d}m_expr: @ref{250a,,u_expr} | @ref{250d,,m_expr} "*" @ref{250a,,u_expr} | @ref{250d,,m_expr} "@@" @ref{250d,,m_expr} |
        @ref{250d,,m_expr} "//" @ref{250a,,u_expr} | @ref{250d,,m_expr} "/" @ref{250a,,u_expr} |
        @ref{250d,,m_expr} "%" @ref{250a,,u_expr}
@anchor{reference/expressions grammar-token-python-grammar-a_expr}@anchor{250e}a_expr: @ref{250d,,m_expr} | @ref{250e,,a_expr} "+" @ref{250d,,m_expr} | @ref{250e,,a_expr} "-" @ref{250d,,m_expr}
@end example

@geindex multiplication
@geindex operator; * (asterisk)

The @code{*} (multiplication) operator yields the product of its arguments.  The
arguments must either both be numbers, or one argument must be an integer and
the other must be a sequence. In the former case, the numbers are
@ref{24b0,,converted to a common real type} and then
multiplied together.  In the latter case, sequence repetition is performed;
a negative repetition factor yields an empty sequence.

This operation can be customized using the special @ref{2427,,__mul__()} and
@ref{2428,,__rmul__()} methods.


Changed in version 3.14: If only one operand is a complex number, the other operand is converted
to a floating-point number.


@geindex matrix multiplication
@geindex operator; @@ (at)

The @code{@@} (at) operator is intended to be used for matrix multiplication.  No
builtin Python types implement this operator.

This operation can be customized using the special @ref{f7f,,__matmul__()} and
@ref{f80,,__rmatmul__()} methods.


Added in version 3.5.


@geindex exception; ZeroDivisionError
@geindex division
@geindex operator; / (slash)
@geindex operator; //

The @code{/} (division) and @code{//} (floor division) operators yield the quotient of
their arguments.  The numeric arguments are first
@ref{24b0,,converted to a common type}.
Division of integers yields a float, while floor division of integers results in an
integer; the result is that of mathematical division with the ‘floor’ function
applied to the result.  Division by zero raises the @ref{b45,,ZeroDivisionError}
exception.

The division operation can be customized using the special @ref{1096,,__truediv__()}
and @ref{2438,,__rtruediv__()} methods.
The floor division operation can be customized using the special
@ref{1700,,__floordiv__()} and @ref{2439,,__rfloordiv__()} methods.

@geindex modulo
@geindex operator; % (percent)

The @code{%} (modulo) operator yields the remainder from the division of the first
argument by the second.  The numeric arguments are first
@ref{24b0,,converted to a common type}.
A zero right argument raises the @ref{b45,,ZeroDivisionError} exception.  The
arguments may be floating-point numbers, e.g., @code{3.14%0.7} equals @code{0.34}
(since @code{3.14} equals @code{4*0.7 + 0.34}.)  The modulo operator always yields a
result with the same sign as its second operand (or zero); the absolute value of
the result is strictly smaller than the absolute value of the second operand
@footnote{
While @code{abs(x%y) < abs(y)} is true mathematically, for floats it may not be
true numerically due to roundoff.  For example, and assuming a platform on which
a Python float is an IEEE 754 double-precision number, in order that @code{-1e-100 %
1e100} have the same sign as @code{1e100}, the computed result is @code{-1e-100 +
1e100}, which is numerically exactly equal to @code{1e100}.  The function
@ref{250f,,math.fmod()} returns a result whose sign matches the sign of the
first argument instead, and so returns @code{-1e-100} in this case. Which approach
is more appropriate depends on the application.
}.

The floor division and modulo operators are connected by the following
identity: @code{x == (x//y)*y + (x%y)}.  Floor division and modulo are also
connected with the built-in function @ref{b9f,,divmod()}: @code{divmod(x, y) == (x//y,
x%y)}. @footnote{
If x is very close to an exact integer multiple of y, it’s possible for
@code{x//y} to be one larger than @code{(x-x%y)//y} due to rounding.  In such
cases, Python returns the latter result, in order to preserve that
@code{divmod(x,y)[0] * y + x % y} be very close to @code{x}.
}.

In addition to performing the modulo operation on numbers, the @code{%} operator is
also overloaded by string objects to perform old-style string formatting (also
known as interpolation).  The syntax for string formatting is described in the
Python Library Reference, section @ref{8dd,,printf-style String Formatting}.

The `modulo' operation can be customized using the special @ref{2431,,__mod__()}
and @ref{fdb,,__rmod__()} methods.

The floor division operator, the modulo operator, and the @ref{b9f,,divmod()}
function are not defined for complex numbers.  Instead, convert to a
floating-point number using the @ref{20d1,,abs()} function if appropriate.

@geindex addition
@geindex operator; + (plus)
@geindex + (plus); binary operator

The @code{+} (addition) operator yields the sum of its arguments.  The arguments
must either both be numbers or both be sequences of the same type.  In the
former case, the numbers are
@ref{24b0,,converted to a common real type} and then
added together.
In the latter case, the sequences are concatenated.

This operation can be customized using the special @ref{2424,,__add__()} and
@ref{2425,,__radd__()} methods.


Changed in version 3.14: If only one operand is a complex number, the other operand is converted
to a floating-point number.


@geindex subtraction
@geindex operator; - (minus)
@geindex - (minus); binary operator

The @code{-} (subtraction) operator yields the difference of its arguments.
The numeric arguments are first
@ref{24b0,,converted to a common real type}.

This operation can be customized using the special @ref{2430,,__sub__()} and
@ref{2437,,__rsub__()} methods.


Changed in version 3.14: If only one operand is a complex number, the other operand is converted
to a floating-point number.


@node Shifting operations,Binary bitwise operations,Binary arithmetic operations,Expressions
@anchor{reference/expressions shifting}@anchor{2510}@anchor{reference/expressions shifting-operations}@anchor{2511}
@subsection Shifting operations


@geindex shifting; operation
@geindex operator; <<
@geindex operator; >>

The shifting operations have lower priority than the arithmetic operations:

@example
@anchor{reference/expressions grammar-token-python-grammar-shift_expr}@anchor{2512}shift_expr: @ref{250e,,a_expr} | @ref{2512,,shift_expr} ("<<" | ">>") @ref{250e,,a_expr}
@end example

These operators accept integers as arguments.  They shift the first argument to
the left or right by the number of bits given by the second argument.

The left shift operation can be customized using the special @ref{2432,,__lshift__()}
and @ref{243b,,__rlshift__()} methods.
The right shift operation can be customized using the special @ref{2433,,__rshift__()}
and @ref{243c,,__rrshift__()} methods.

@geindex exception; ValueError

A right shift by `n' bits is defined as floor division by @code{pow(2,n)}.  A left
shift by `n' bits is defined as multiplication with @code{pow(2,n)}.

@node Binary bitwise operations,Comparisons,Shifting operations,Expressions
@anchor{reference/expressions binary-bitwise-operations}@anchor{2513}@anchor{reference/expressions bitwise}@anchor{2514}
@subsection Binary bitwise operations


@geindex binary; bitwise; operation

Each of the three bitwise operations has a different priority level:

@example
@anchor{reference/expressions grammar-token-python-grammar-and_expr}@anchor{2515}and_expr: @ref{2512,,shift_expr} | @ref{2515,,and_expr} "&" @ref{2512,,shift_expr}
@anchor{reference/expressions grammar-token-python-grammar-xor_expr}@anchor{2516}xor_expr: @ref{2515,,and_expr} | @ref{2516,,xor_expr} "^" @ref{2515,,and_expr}
@anchor{reference/expressions grammar-token-python-grammar-or_expr}@anchor{2346}or_expr:  @ref{2516,,xor_expr} | @ref{2346,,or_expr} "|" @ref{2516,,xor_expr}
@end example

@geindex bitwise; and
@geindex operator; & (ampersand)

The @code{&} operator yields the bitwise AND of its arguments, which must be
integers or one of them must be a custom object overriding @ref{2434,,__and__()} or
@ref{243d,,__rand__()} special methods.

@geindex bitwise; xor
@geindex exclusive; or
@geindex operator; ^ (caret)

The @code{^} operator yields the bitwise XOR (exclusive OR) of its arguments, which
must be integers or one of them must be a custom object overriding @ref{2435,,__xor__()} or
@ref{243e,,__rxor__()} special methods.

@geindex bitwise; or
@geindex inclusive; or
@geindex operator; | (vertical bar)

The @code{|} operator yields the bitwise (inclusive) OR of its arguments, which
must be integers or one of them must be a custom object overriding @ref{2436,,__or__()} or
@ref{243f,,__ror__()} special methods.

@node Comparisons,Boolean operations,Binary bitwise operations,Expressions
@anchor{reference/expressions comparisons}@anchor{2517}@anchor{reference/expressions id11}@anchor{2518}
@subsection Comparisons


@geindex comparison
@geindex C; language
@geindex operator; < (less)
@geindex operator; > (greater)
@geindex operator; <=
@geindex operator; >=
@geindex operator; ==
@geindex operator; !=

Unlike C, all comparison operations in Python have the same priority, which is
lower than that of any arithmetic, shifting or bitwise operation.  Also unlike
C, expressions like @code{a < b < c} have the interpretation that is conventional
in mathematics:

@example
@anchor{reference/expressions grammar-token-python-grammar-comparison}@anchor{2519}comparison:    @ref{2346,,or_expr} (@ref{251a,,comp_operator} @ref{2346,,or_expr})*
@anchor{reference/expressions grammar-token-python-grammar-comp_operator}@anchor{251a}comp_operator: "<" | ">" | "==" | ">=" | "<=" | "!="
               | "is" ["not"] | ["not"] "in"
@end example

Comparisons yield boolean values: @code{True} or @code{False}. Custom
`rich comparison methods' may return non-boolean values. In this case
Python will call @ref{3c1,,bool()} on such value in boolean contexts.

@geindex chaining; comparisons

Comparisons can be chained arbitrarily, e.g., @code{x < y <= z} is equivalent to
@code{x < y and y <= z}, except that @code{y} is evaluated only once (but in both
cases @code{z} is not evaluated at all when @code{x < y} is found to be false).

Formally, if `a', `b', `c', …, `y', `z' are expressions and `op1', `op2', …,
`opN' are comparison operators, then @code{a op1 b op2 c ... y opN z} is equivalent
to @code{a op1 b and b op2 c and ... y opN z}, except that each expression is
evaluated at most once.

Note that @code{a op1 b op2 c} doesn’t imply any kind of comparison between `a' and
`c', so that, e.g., @code{x < y > z} is perfectly legal (though perhaps not
pretty).

@menu
* Value comparisons:: 
* Membership test operations:: 
* Identity comparisons:: 

@end menu

@node Value comparisons,Membership test operations,,Comparisons
@anchor{reference/expressions expressions-value-comparisons}@anchor{1c63}@anchor{reference/expressions value-comparisons}@anchor{251b}
@subsubsection Value comparisons


The operators @code{<}, @code{>}, @code{==}, @code{>=}, @code{<=}, and @code{!=} compare the
values of two objects.  The objects do not need to have the same type.

Chapter @ref{2370,,Objects@comma{} values and types} states that objects have a value (in addition to type
and identity).  The value of an object is a rather abstract notion in Python:
For example, there is no canonical access method for an object’s value.  Also,
there is no requirement that the value of an object should be constructed in a
particular way, e.g. comprised of all its data attributes. Comparison operators
implement a particular notion of what the value of an object is.  One can think
of them as defining the value of an object indirectly, by means of their
comparison implementation.

Because all types are (direct or indirect) subtypes of @ref{c84,,object}, they
inherit the default comparison behavior from @code{object}.  Types can
customize their comparison behavior by implementing
`rich comparison methods' like @ref{14ac,,__lt__()}, described in
@ref{23f4,,Basic customization}.

The default behavior for equality comparison (@code{==} and @code{!=}) is based on
the identity of the objects.  Hence, equality comparison of instances with the
same identity results in equality, and equality comparison of instances with
different identities results in inequality.  A motivation for this default
behavior is the desire that all objects should be reflexive (i.e. @code{x is y}
implies @code{x == y}).

A default order comparison (@code{<}, @code{>}, @code{<=}, and @code{>=}) is not provided;
an attempt raises @ref{199,,TypeError}.  A motivation for this default behavior is
the lack of a similar invariant as for equality.

The behavior of the default equality comparison, that instances with different
identities are always unequal, may be in contrast to what types will need that
have a sensible definition of object value and value-based equality.  Such
types will need to customize their comparison behavior, and in fact, a number
of built-in types have done that.

The following list describes the comparison behavior of the most important
built-in types.


@itemize *

@item 
Numbers of built-in numeric types (@ref{201e,,Numeric Types — int@comma{} float@comma{} complex}) and of the standard
library types @ref{215,,fractions.Fraction} and @ref{200,,decimal.Decimal} can be
compared within and across their types, with the restriction that complex
numbers do not support order comparison.  Within the limits of the types
involved, they compare mathematically (algorithmically) correct without loss
of precision.

The not-a-number values @code{float('NaN')} and @code{decimal.Decimal('NaN')} are
special.  Any ordered comparison of a number to a not-a-number value is false.
A counter-intuitive implication is that not-a-number values are not equal to
themselves.  For example, if @code{x = float('NaN')}, @code{3 < x}, @code{x < 3} and
@code{x == x} are all false, while @code{x != x} is true.  This behavior is
compliant with IEEE 754.

@item 
@code{None} and @ref{1a3,,NotImplemented} are singletons.  
@geindex Python Enhancement Proposals; PEP 8
PEP 8@footnote{https://peps.python.org/pep-0008/} advises that
comparisons for singletons should always be done with @code{is} or @code{is not},
never the equality operators.

@item 
Binary sequences (instances of @ref{193,,bytes} or @ref{342,,bytearray}) can be
compared within and across their types.  They compare lexicographically using
the numeric values of their elements.

@item 
Strings (instances of @ref{16a,,str}) compare lexicographically using the
numerical Unicode code points (the result of the built-in function
@ref{237f,,ord()}) of their characters. @footnote{
The Unicode standard distinguishes between `code points'
(e.g. U+0041) and `abstract characters' (e.g. “LATIN CAPITAL LETTER A”).
While most abstract characters in Unicode are only represented using one
code point, there is a number of abstract characters that can in addition be
represented using a sequence of more than one code point.  For example, the
abstract character “LATIN CAPITAL LETTER C WITH CEDILLA” can be represented
as a single `precomposed character' at code position U+00C7, or as a
sequence of a `base character' at code position U+0043 (LATIN CAPITAL
LETTER C), followed by a `combining character' at code position U+0327
(COMBINING CEDILLA).

The comparison operators on strings compare at the level of Unicode code
points. This may be counter-intuitive to humans.  For example,
@code{"\u00C7" == "\u0043\u0327"} is @code{False}, even though both strings
represent the same abstract character “LATIN CAPITAL LETTER C WITH CEDILLA”.

To compare strings at the level of abstract characters (that is, in a way
intuitive to humans), use @ref{8e6,,unicodedata.normalize()}.
}

Strings and binary sequences cannot be directly compared.

@item 
Sequences (instances of @ref{614,,tuple}, @ref{24f,,list}, or @ref{b43,,range}) can
be compared only within each of their types, with the restriction that ranges
do not support order comparison.  Equality comparison across these types
results in inequality, and ordering comparison across these types raises
@ref{199,,TypeError}.

Sequences compare lexicographically using comparison of corresponding
elements.  The built-in containers typically assume identical objects are
equal to themselves.  That lets them bypass equality tests for identical
objects to improve performance and to maintain their internal invariants.

Lexicographical comparison between built-in collections works as follows:


@itemize -

@item 
For two collections to compare equal, they must be of the same type, have
the same length, and each pair of corresponding elements must compare
equal (for example, @code{[1,2] == (1,2)} is false because the type is not the
same).

@item 
Collections that support order comparison are ordered the same as their
first unequal elements (for example, @code{[1,2,x] <= [1,2,y]} has the same
value as @code{x <= y}).  If a corresponding element does not exist, the
shorter collection is ordered first (for example, @code{[1,2] < [1,2,3]} is
true).
@end itemize

@item 
Mappings (instances of @ref{184,,dict}) compare equal if and only if they have
equal @code{(key, value)} pairs. Equality comparison of the keys and values
enforces reflexivity.

Order comparisons (@code{<}, @code{>}, @code{<=}, and @code{>=}) raise @ref{199,,TypeError}.

@item 
Sets (instances of @ref{185,,set} or @ref{7f3,,frozenset}) can be compared within
and across their types.

They define order
comparison operators to mean subset and superset tests.  Those relations do
not define total orderings (for example, the two sets @code{@{1,2@}} and @code{@{2,3@}}
are not equal, nor subsets of one another, nor supersets of one
another).  Accordingly, sets are not appropriate arguments for functions
which depend on total ordering (for example, @ref{1111,,min()}, @ref{1112,,max()}, and
@ref{dcd,,sorted()} produce undefined results given a list of sets as inputs).

Comparison of sets enforces reflexivity of its elements.

@item 
Most other built-in types have no comparison methods implemented, so they
inherit the default comparison behavior.
@end itemize

User-defined classes that customize their comparison behavior should follow
some consistency rules, if possible:


@itemize *

@item 
Equality comparison should be reflexive.
In other words, identical objects should compare equal:

@quotation

@code{x is y} implies @code{x == y}
@end quotation

@item 
Comparison should be symmetric.
In other words, the following expressions should have the same result:

@quotation

@code{x == y} and @code{y == x}

@code{x != y} and @code{y != x}

@code{x < y} and @code{y > x}

@code{x <= y} and @code{y >= x}
@end quotation

@item 
Comparison should be transitive.
The following (non-exhaustive) examples illustrate that:

@quotation

@code{x > y and y > z} implies @code{x > z}

@code{x < y and y <= z} implies @code{x < z}
@end quotation

@item 
Inverse comparison should result in the boolean negation.
In other words, the following expressions should have the same result:

@quotation

@code{x == y} and @code{not x != y}

@code{x < y} and @code{not x >= y} (for total ordering)

@code{x > y} and @code{not x <= y} (for total ordering)
@end quotation

The last two expressions apply to totally ordered collections (e.g. to
sequences, but not to sets or mappings). See also the
@ref{1148,,total_ordering()} decorator.

@item 
The @ref{802,,hash()} result should be consistent with equality.
Objects that are equal should either have the same hash value,
or be marked as unhashable.
@end itemize

Python does not enforce these consistency rules. In fact, the not-a-number
values are an example for not following these rules.
@anchor{reference/expressions in}@anchor{349}@anchor{reference/expressions not-in}@anchor{842}
@node Membership test operations,Identity comparisons,Value comparisons,Comparisons
@anchor{reference/expressions membership-test-details}@anchor{242d}@anchor{reference/expressions membership-test-operations}@anchor{251c}
@subsubsection Membership test operations


The operators @ref{349,,in} and @ref{842,,not in} test for membership.  @code{x in
s} evaluates to @code{True} if `x' is a member of `s', and @code{False} otherwise.
@code{x not in s} returns the negation of @code{x in s}.  All built-in sequences and
set types support this as well as dictionary, for which @code{in} tests
whether the dictionary has a given key. For container types such as list, tuple,
set, frozenset, dict, or collections.deque, the expression @code{x in y} is equivalent
to @code{any(x is e or x == e for e in y)}.

For the string and bytes types, @code{x in y} is @code{True} if and only if `x' is a
substring of `y'.  An equivalent test is @code{y.find(x) != -1}.  Empty strings are
always considered to be a substring of any other string, so @code{"" in "abc"} will
return @code{True}.

For user-defined classes which define the @ref{15c5,,__contains__()} method, @code{x in
y} returns @code{True} if @code{y.__contains__(x)} returns a true value, and
@code{False} otherwise.

For user-defined classes which do not define @ref{15c5,,__contains__()} but do define
@ref{e6f,,__iter__()}, @code{x in y} is @code{True} if some value @code{z}, for which the
expression @code{x is z or x == z} is true, is produced while iterating over @code{y}.
If an exception is raised during the iteration, it is as if @ref{349,,in} raised
that exception.

Lastly, the old-style iteration protocol is tried: if a class defines
@ref{588,,__getitem__()}, @code{x in y} is @code{True} if and only if there is a non-negative
integer index `i' such that @code{x is y[i] or x == y[i]}, and no lower integer index
raises the @ref{1741,,IndexError} exception.  (If any other exception is raised, it is as
if @ref{349,,in} raised that exception).

@geindex operator; in
@geindex operator; not in
@geindex membership; test
@geindex object; sequence

The operator @ref{842,,not in} is defined to have the inverse truth value of
@ref{349,,in}.

@geindex operator; is
@geindex operator; is not
@geindex identity; test
@anchor{reference/expressions is}@anchor{34a}
@node Identity comparisons,,Membership test operations,Comparisons
@anchor{reference/expressions identity-comparisons}@anchor{251d}@anchor{reference/expressions is-not}@anchor{251e}
@subsubsection Identity comparisons


The operators @ref{34a,,is} and @ref{251e,,is not} test for an object’s identity: @code{x
is y} is true if and only if `x' and `y' are the same object.  An Object’s identity
is determined using the @ref{162f,,id()} function.  @code{x is not y} yields the inverse
truth value. @footnote{
Due to automatic garbage-collection, free lists, and the dynamic nature of
descriptors, you may notice seemingly unusual behaviour in certain uses of
the @ref{34a,,is} operator, like those involving comparisons between instance
methods, or constants.  Check their documentation for more info.
}
@anchor{reference/expressions booleans}@anchor{251f}@anchor{reference/expressions and}@anchor{347}@anchor{reference/expressions or}@anchor{34b}
@node Boolean operations,Assignment expressions<2>,Comparisons,Expressions
@anchor{reference/expressions boolean-operations}@anchor{2520}@anchor{reference/expressions not}@anchor{2521}
@subsection Boolean operations


@geindex Conditional; expression
@geindex Boolean; operation

@example
@anchor{reference/expressions grammar-token-python-grammar-or_test}@anchor{24d0}or_test:  @ref{2522,,and_test} | @ref{24d0,,or_test} "or" @ref{2522,,and_test}
@anchor{reference/expressions grammar-token-python-grammar-and_test}@anchor{2522}and_test: @ref{2523,,not_test} | @ref{2522,,and_test} "and" @ref{2523,,not_test}
@anchor{reference/expressions grammar-token-python-grammar-not_test}@anchor{2523}not_test: @ref{2519,,comparison} | "not" @ref{2523,,not_test}
@end example

In the context of Boolean operations, and also when expressions are used by
control flow statements, the following values are interpreted as false:
@code{False}, @code{None}, numeric zero of all types, and empty strings and containers
(including strings, tuples, lists, dictionaries, sets and frozensets).  All
other values are interpreted as true.  User-defined objects can customize their
truth value by providing a @ref{14e1,,__bool__()} method.

@geindex operator; not

The operator @ref{2521,,not} yields @code{True} if its argument is false, @code{False}
otherwise.

@geindex operator; and

The expression @code{x and y} first evaluates `x'; if `x' is false, its value is
returned; otherwise, `y' is evaluated and the resulting value is returned.

@geindex operator; or

The expression @code{x or y} first evaluates `x'; if `x' is true, its value is
returned; otherwise, `y' is evaluated and the resulting value is returned.

Note that neither @ref{347,,and} nor @ref{34b,,or} restrict the value and type
they return to @code{False} and @code{True}, but rather return the last evaluated
argument.  This is sometimes useful, e.g., if @code{s} is a string that should be
replaced by a default value if it is empty, the expression @code{s or 'foo'} yields
the desired value.  Because @ref{2521,,not} has to create a new value, it
returns a boolean value regardless of the type of its argument
(for example, @code{not 'foo'} produces @code{False} rather than @code{'@w{'}}.)

@geindex ;= (colon equals)
@geindex assignment expression
@geindex walrus operator
@geindex named expression
@geindex assignment; expression

@node Assignment expressions<2>,Conditional expressions,Boolean operations,Expressions
@anchor{reference/expressions assignment-expressions}@anchor{2524}@anchor{reference/expressions id14}@anchor{2525}
@subsection Assignment expressions


@example
@anchor{reference/expressions grammar-token-python-grammar-assignment_expression}@anchor{2475}assignment_expression: [@ref{2305,,identifier} ":="] @ref{183,,expression}
@end example

An assignment expression (sometimes also called a “named expression” or
“walrus”) assigns an @ref{183,,expression} to an
@ref{2305,,identifier}, while also returning the value of the
@code{expression}.

One common use case is when handling matched regular expressions:

@example
if matching := pattern.search(data):
    do_something(matching)
@end example

Or, when processing a file stream in chunks:

@example
while chunk := file.read(9000):
    process(chunk)
@end example

Assignment expressions must be surrounded by parentheses when
used as expression statements and when used as sub-expressions in
slicing, conditional, lambda,
keyword-argument, and comprehension-if expressions and
in @code{assert}, @code{with}, and @code{assignment} statements.
In all other places where they can be used, parentheses are not required,
including in @code{if} and @code{while} statements.


Added in version 3.8: See 
@geindex Python Enhancement Proposals; PEP 572
PEP 572@footnote{https://peps.python.org/pep-0572/} for more details about assignment expressions.


@node Conditional expressions,Lambdas,Assignment expressions<2>,Expressions
@anchor{reference/expressions conditional-expressions}@anchor{2526}@anchor{reference/expressions if-expr}@anchor{17e}
@subsection Conditional expressions


@geindex conditional; expression
@geindex ternary; operator
@geindex if; conditional expression
@geindex else; conditional expression

@example
@anchor{reference/expressions grammar-token-python-grammar-conditional_expression}@anchor{2345}conditional_expression: @ref{24d0,,or_test} ["if" @ref{24d0,,or_test} "else" @ref{183,,expression}]
@anchor{reference/expressions grammar-token-python-grammar-expression}@anchor{183}expression:             @ref{2345,,conditional_expression} | @ref{2527,,lambda_expr}
@end example

A conditional expression (sometimes called a “ternary operator”) is an
alternative to the if-else statement. As it is an expression, it returns a value
and can appear as a sub-expression.

The expression @code{x if C else y} first evaluates the condition, `C' rather than `x'.
If `C' is true, `x' is evaluated and its value is returned; otherwise, `y' is
evaluated and its value is returned.

See 
@geindex Python Enhancement Proposals; PEP 308
PEP 308@footnote{https://peps.python.org/pep-0308/} for more details about conditional expressions.
@anchor{reference/expressions lambdas}@anchor{2528}
@node Lambdas,Expression lists,Conditional expressions,Expressions
@anchor{reference/expressions id15}@anchor{2529}@anchor{reference/expressions lambda}@anchor{14a9}
@subsection Lambdas


@geindex lambda; expression
@geindex lambda; form
@geindex anonymous; function
@geindex ; (colon); lambda expression

@example
@anchor{reference/expressions grammar-token-python-grammar-lambda_expr}@anchor{2527}lambda_expr: "lambda" [@ref{252a,,parameter_list}] ":" @ref{183,,expression}
@end example

Lambda expressions (sometimes called lambda forms) are used to create anonymous
functions. The expression @code{lambda parameters: expression} yields a function
object.  The unnamed object behaves like a function object defined with:

@example
def <lambda>(parameters):
    return expression
@end example

See section @ref{205c,,Function definitions} for the syntax of parameter lists.  Note that
functions created with lambda expressions cannot contain statements or
annotations.

@node Expression lists,Evaluation order,Lambdas,Expressions
@anchor{reference/expressions expression-lists}@anchor{252b}@anchor{reference/expressions exprlists}@anchor{f84}
@subsection Expression lists


@geindex expression; list
@geindex @comma{} (comma); expression list

@example
@anchor{reference/expressions grammar-token-python-grammar-starred_expression}@anchor{24cb}starred_expression:       "*" @ref{2346,,or_expr} | @ref{183,,expression}
@anchor{reference/expressions grammar-token-python-grammar-flexible_expression}@anchor{252c}flexible_expression:      @ref{2475,,assignment_expression} | @ref{24cb,,starred_expression}
@anchor{reference/expressions grammar-token-python-grammar-flexible_expression_list}@anchor{24d5}flexible_expression_list: @ref{252c,,flexible_expression} ("," @ref{252c,,flexible_expression})* [","]
@anchor{reference/expressions grammar-token-python-grammar-starred_expression_list}@anchor{252d}starred_expression_list:  @ref{24cb,,starred_expression} ("," @ref{24cb,,starred_expression})* [","]
@anchor{reference/expressions grammar-token-python-grammar-expression_list}@anchor{252e}expression_list:          @ref{183,,expression} ("," @ref{183,,expression})* [","]
@anchor{reference/expressions grammar-token-python-grammar-yield_list}@anchor{24e1}yield_list:               @ref{252e,,expression_list} | @ref{24cb,,starred_expression} "," [@ref{252d,,starred_expression_list}]
@end example

@geindex object; tuple

Except when part of a list or set display, an expression list
containing at least one comma yields a tuple.  The length of
the tuple is the number of expressions in the list.  The expressions are
evaluated from left to right.

@geindex iterable; unpacking
@geindex * (asterisk); in expression lists

An asterisk @code{*} denotes `iterable unpacking'.  Its operand must be
an @ref{1433,,iterable}.  The iterable is expanded into a sequence of items,
which are included in the new tuple, list, or set, at the site of
the unpacking.


Added in version 3.5: Iterable unpacking in expression lists, originally proposed by 
@geindex Python Enhancement Proposals; PEP 448
PEP 448@footnote{https://peps.python.org/pep-0448/}.



Added in version 3.11: Any item in an expression list may be starred. See 
@geindex Python Enhancement Proposals; PEP 646
PEP 646@footnote{https://peps.python.org/pep-0646/}.


@geindex trailing; comma

A trailing comma is required only to create a one-item tuple,
such as @code{1,}; it is optional in all other cases.
A single expression without a
trailing comma doesn’t create a tuple, but rather yields the value of that
expression. (To create an empty tuple, use an empty pair of parentheses:
@code{()}.)

@node Evaluation order,Operator precedence,Expression lists,Expressions
@anchor{reference/expressions evalorder}@anchor{252f}@anchor{reference/expressions evaluation-order}@anchor{2530}
@subsection Evaluation order


@geindex evaluation; order

Python evaluates expressions from left to right.  Notice that while evaluating
an assignment, the right-hand side is evaluated before the left-hand side.

In the following lines, expressions will be evaluated in the arithmetic order of
their suffixes:

@example
expr1, expr2, expr3, expr4
(expr1, expr2, expr3, expr4)
@{expr1: expr2, expr3: expr4@}
expr1 + expr2 * (expr3 - expr4)
expr1(expr2, expr3, *expr4, **expr5)
expr3, expr4 = expr1, expr2
@end example

@node Operator precedence,,Evaluation order,Expressions
@anchor{reference/expressions operator-precedence}@anchor{2531}@anchor{reference/expressions operator-summary}@anchor{2532}
@subsection Operator precedence


@geindex operator; precedence

The following table summarizes the operator precedence in Python, from highest
precedence (most binding) to lowest precedence (least binding).  Operators in
the same box have the same precedence.  Unless the syntax is explicitly given,
operators are binary.  Operators in the same box group left to right (except for
exponentiation and conditional expressions, which group from right to left).

Note that comparisons, membership tests, and identity tests, all have the same
precedence and have a left-to-right chaining feature as described in the
@ref{2517,,Comparisons} section.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Operator

@tab

Description

@item

@code{(expressions...)},

@code{[expressions...]},
@code{@{key: value...@}},
@code{@{expressions...@}}

@tab

Binding or parenthesized
expression,
list display,
dictionary display,
set display

@item

@code{x[index]}, @code{x[index:index]}
@code{x(arguments...)}, @code{x.attribute}

@tab

Subscription (including slicing),
call, attribute reference

@item

@ref{18e,,await x}

@tab

Await expression

@item

@code{**}

@tab

Exponentiation @footnote{
The power operator @code{**} binds less tightly than an arithmetic or
bitwise unary operator on its right, that is, @code{2**-1} is @code{0.5}.
}

@item

@code{+x}, @code{-x}, @code{~x}

@tab

Positive, negative, bitwise NOT

@item

@code{*}, @code{@@}, @code{/}, @code{//}, @code{%}

@tab

Multiplication, matrix
multiplication, division, floor
division, remainder @footnote{
The @code{%} operator is also used for string formatting; the same
precedence applies.
}

@item

@code{+}, @code{-}

@tab

Addition and subtraction

@item

@code{<<}, @code{>>}

@tab

Shifts

@item

@code{&}

@tab

Bitwise AND

@item

@code{^}

@tab

Bitwise XOR

@item

@code{|}

@tab

Bitwise OR

@item

@ref{349,,in}, @ref{842,,not in},
@ref{34a,,is}, @ref{251e,,is not}, @code{<},
@code{<=}, @code{>}, @code{>=}, @code{!=}, @code{==}

@tab

Comparisons, including membership
tests and identity tests

@item

@ref{2521,,not x}

@tab

Boolean NOT

@item

@ref{347,,and}

@tab

Boolean AND

@item

@ref{34b,,or}

@tab

Boolean OR

@item

@ref{17e,,if} – @code{else}

@tab

Conditional expression

@item

@ref{14a9,,lambda}

@tab

Lambda expression

@item

@code{:=}

@tab

Assignment expression

@end multitable


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Simple statements,Compound statements,Expressions,The Python Language Reference
@anchor{reference/simple_stmts doc}@anchor{2533}@anchor{reference/simple_stmts simple}@anchor{2534}@anchor{reference/simple_stmts simple-statements}@anchor{2535}@anchor{reference/simple_stmts translation-repo}@anchor{2536}
@section Simple statements


@geindex simple; statement

A simple statement is comprised within a single logical line. Several simple
statements may occur on a single line separated by semicolons.  The syntax for
simple statements is:

@example
@anchor{reference/simple_stmts grammar-token-python-grammar-simple_stmt}@anchor{2537}simple_stmt: @ref{2538,,expression_stmt}
             | @ref{2539,,assert_stmt}
             | @ref{253a,,assignment_stmt}
             | @ref{253b,,augmented_assignment_stmt}
             | @ref{253c,,annotated_assignment_stmt}
             | @ref{253d,,pass_stmt}
             | @ref{253e,,del_stmt}
             | @ref{253f,,return_stmt}
             | @ref{2540,,yield_stmt}
             | @ref{2541,,raise_stmt}
             | @ref{2542,,break_stmt}
             | @ref{2543,,continue_stmt}
             | @ref{2544,,import_stmt}
             | @ref{2545,,future_stmt}
             | @ref{2546,,global_stmt}
             | @ref{2547,,nonlocal_stmt}
             | @ref{2548,,type_stmt}
@end example

@menu
* Expression statements:: 
* Assignment statements:: 
* The assert statement:: 
* The pass statement:: 
* The del statement: The del statement<2>. 
* The return statement:: 
* The yield statement:: 
* The raise statement:: 
* The break statement:: 
* The continue statement:: 
* The import statement:: 
* The global statement:: 
* The nonlocal statement:: 
* The type statement:: 

@end menu

@node Expression statements,Assignment statements,,Simple statements
@anchor{reference/simple_stmts expression-statements}@anchor{2549}@anchor{reference/simple_stmts exprstmts}@anchor{254a}
@subsection Expression statements


@geindex expression; statement
@geindex expression; list

@geindex expression; list

Expression statements are used (mostly interactively) to compute and write a
value, or (usually) to call a procedure (a function that returns no meaningful
result; in Python, procedures return the value @code{None}).  Other uses of
expression statements are allowed and occasionally useful.  The syntax for an
expression statement is:

@example
@anchor{reference/simple_stmts grammar-token-python-grammar-expression_stmt}@anchor{2538}expression_stmt: @ref{24cb,,starred_expression}
@end example

An expression statement evaluates the expression list (which may be a single
expression).

@geindex built-in function; repr
@geindex object; None
@geindex string; conversion
@geindex output
@geindex standard; output
@geindex writing; values
@geindex procedure; call

In interactive mode, if the value is not @code{None}, it is converted to a string
using the built-in @ref{1c3,,repr()} function and the resulting string is written to
standard output on a line by itself (except if the result is @code{None}, so that
procedure calls do not cause any output.)

@node Assignment statements,The assert statement,Expression statements,Simple statements
@anchor{reference/simple_stmts assignment}@anchor{246f}@anchor{reference/simple_stmts assignment-statements}@anchor{254b}
@subsection Assignment statements


@geindex = (equals); assignment statement
@geindex assignment; statement
@geindex binding; name
@geindex rebinding; name
@geindex object; mutable
@geindex attribute; assignment

Assignment statements are used to (re)bind names to values and to modify
attributes or items of mutable objects:

@example
@anchor{reference/simple_stmts grammar-token-python-grammar-assignment_stmt}@anchor{253a}assignment_stmt: (@ref{24cf,,target_list} "=")+ (@ref{24cb,,starred_expression} | @ref{2347,,yield_expression})
@anchor{reference/simple_stmts grammar-token-python-grammar-target_list}@anchor{24cf}target_list:     @ref{254c,,target} ("," @ref{254c,,target})* [","]
@anchor{reference/simple_stmts grammar-token-python-grammar-target}@anchor{254c}target:          @ref{2305,,identifier}
                 | "(" [@ref{24cf,,target_list}] ")"
                 | "[" [@ref{24cf,,target_list}] "]"
                 | @ref{24ed,,attributeref}
                 | @ref{24ee,,subscription}
                 | "*" @ref{254c,,target}
@end example

(See section @ref{24eb,,Primaries} for the syntax definitions for `attributeref'
and `subscription'.)

An assignment statement evaluates the expression list (remember that this can be
a single expression or a comma-separated list, the latter yielding a tuple) and
assigns the single resulting object to each of the target lists, from left to
right.

@geindex target
@geindex target; list

Assignment is defined recursively depending on the form of the target (list).
When a target is part of a mutable object (an attribute reference or
subscription), the mutable object must ultimately perform the assignment and
decide about its validity, and may raise an exception if the assignment is
unacceptable.  The rules observed by various types and the exceptions raised are
given with the definition of the object types (see section @ref{2373,,The standard type hierarchy}).

@geindex target; list; assignment
@geindex @comma{} (comma); in target list
@geindex * (asterisk); in assignment target list
@geindex [] (square brackets); in assignment target list
@geindex () (parentheses); in assignment target list

Assignment of an object to a target list, optionally enclosed in parentheses or
square brackets, is recursively defined as follows.


@itemize *

@item 
If the target list is a single target with no trailing comma,
optionally in parentheses, the object is assigned to that target.

@item 
Else:


@itemize *

@item 
If the target list contains one target prefixed with an asterisk, called a
“starred” target: The object must be an iterable with at least as many items
as there are targets in the target list, minus one.  The first items of the
iterable are assigned, from left to right, to the targets before the starred
target.  The final items of the iterable are assigned to the targets after
the starred target.  A list of the remaining items in the iterable is then
assigned to the starred target (the list can be empty).

@item 
Else: The object must be an iterable with the same number of items as there
are targets in the target list, and the items are assigned, from left to
right, to the corresponding targets.
@end itemize
@end itemize

Assignment of an object to a single target is recursively defined as follows.


@itemize *

@item 
If the target is an identifier (name):


@itemize *

@item 
If the name does not occur in a @ref{4ad,,global} or @ref{14b3,,nonlocal}
statement in the current code block: the name is bound to the object in the
current local namespace.

@item 
Otherwise: the name is bound to the object in the global namespace or the
outer namespace determined by @ref{14b3,,nonlocal}, respectively.
@end itemize

@geindex destructor

The name is rebound if it was already bound.  This may cause the reference
count for the object previously bound to the name to reach zero, causing the
object to be deallocated and its destructor (if it has one) to be called.

@geindex attribute; assignment

@item 
If the target is an attribute reference: The primary expression in the
reference is evaluated.  It should yield an object with assignable attributes;
if this is not the case, @ref{199,,TypeError} is raised.  That object is then
asked to assign the assigned object to the given attribute; if it cannot
perform the assignment, it raises an exception (usually but not necessarily
@ref{5f0,,AttributeError}).
@anchor{reference/simple_stmts attr-target-note}@anchor{254d}
Note: If the object is a class instance and the attribute reference occurs on
both sides of the assignment operator, the right-hand side expression, @code{a.x} can access
either an instance attribute or (if no instance attribute exists) a class
attribute.  The left-hand side target @code{a.x} is always set as an instance attribute,
creating it if necessary.  Thus, the two occurrences of @code{a.x} do not
necessarily refer to the same attribute: if the right-hand side expression refers to a
class attribute, the left-hand side creates a new instance attribute as the target of the
assignment:

@example
class Cls:
    x = 3             # class variable
inst = Cls()
inst.x = inst.x + 1   # writes inst.x as 4 leaving Cls.x as 3
@end example

This description does not necessarily apply to descriptor attributes, such as
properties created with @ref{4b4,,property()}.

@geindex subscription; assignment
@geindex object; mutable

@item 
If the target is a subscription: The primary expression in the reference is
evaluated.
Next, the subscript expression is evaluated.
Then, the primary’s @ref{14d7,,__setitem__()} method is called with
two arguments: the subscript and the assigned object.

Typically, @ref{14d7,,__setitem__()} is defined on mutable sequence objects
(such as lists) and mapping objects (such as dictionaries), and behaves as
follows.

@geindex object; sequence
@geindex object; list

If the primary is a mutable sequence object (such as a list), the subscript
must yield an integer.  If it is negative, the sequence’s length is added to
it.  The resulting value must be a nonnegative integer less than the
sequence’s length, and the sequence is asked to assign the assigned object to
its item with that index.  If the index is out of range, @ref{1741,,IndexError} is
raised (assignment to a subscripted sequence cannot add new items to a list).

@geindex object; mapping
@geindex object; dictionary

If the primary is a mapping object (such as a dictionary), the subscript must
have a type compatible with the mapping’s key type, and the mapping is then
asked to create a key/value pair which maps the subscript to the assigned
object.  This can either replace an existing key/value pair with the same key
value, or insert a new key/value pair (if no key with the same value existed).

@geindex slicing; assignment

If the target is a slicing: The primary expression should evaluate to
a mutable sequence object (such as a list).
The assigned object should be @ref{1433,,iterable}.
The slicing’s lower and upper bounds should be integers; if they are @code{None}
(or not present), the defaults are zero and the sequence’s length.
If either bound is negative, the sequence’s length is added to it.  The
resulting bounds are clipped to lie between zero and the sequence’s length,
inclusive.  Finally, the sequence object is asked to replace the slice with
the items of the assigned sequence.  The length of the slice may be different
from the length of the assigned sequence, thus changing the length of the
target sequence, if the target sequence allows it.
@end itemize

Although the definition of assignment implies that overlaps between the
left-hand side and the right-hand side are ‘simultaneous’ (for example @code{a, b =
b, a} swaps two variables), overlaps `within' the collection of assigned-to
variables occur left-to-right, sometimes resulting in confusion.  For instance,
the following program prints @code{[0, 2]}:

@example
x = [0, 1]
i = 0
i, x[i] = 1, 2         # i is updated, then x[i] is updated
print(x)
@end example


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 3132

@item PEP 3132@footnote{https://peps.python.org/pep-3132/} - Extended Iterable Unpacking

The specification for the @code{*target} feature.
@end table


@menu
* Augmented assignment statements:: 
* Annotated assignment statements:: 

@end menu

@node Augmented assignment statements,Annotated assignment statements,,Assignment statements
@anchor{reference/simple_stmts augassign}@anchor{254e}@anchor{reference/simple_stmts augmented-assignment-statements}@anchor{254f}
@subsubsection Augmented assignment statements


@geindex augmented; assignment
@geindex statement; assignment@comma{} augmented
@geindex +=; augmented assignment
@geindex -=; augmented assignment
@geindex *=; augmented assignment
@geindex /=; augmented assignment
@geindex %=; augmented assignment
@geindex &=; augmented assignment
@geindex ^=; augmented assignment
@geindex |=; augmented assignment
@geindex **=; augmented assignment
@geindex //=; augmented assignment
@geindex >>=; augmented assignment
@geindex <<=; augmented assignment

Augmented assignment is the combination, in a single statement, of a binary
operation and an assignment statement:

@example
@anchor{reference/simple_stmts grammar-token-python-grammar-augmented_assignment_stmt}@anchor{253b}augmented_assignment_stmt: @ref{2550,,augtarget} @ref{2551,,augop} (@ref{252e,,expression_list} | @ref{2347,,yield_expression})
@anchor{reference/simple_stmts grammar-token-python-grammar-augtarget}@anchor{2550}augtarget:                 @ref{2305,,identifier} | @ref{24ed,,attributeref} | @ref{24ee,,subscription}
@anchor{reference/simple_stmts grammar-token-python-grammar-augop}@anchor{2551}augop:                     "+=" | "-=" | "*=" | "@@=" | "/=" | "//=" | "%=" | "**="
                           | ">>=" | "<<=" | "&=" | "^=" | "|="
@end example

(See section @ref{24eb,,Primaries} for the syntax definitions of the last three
symbols.)

An augmented assignment evaluates the target (which, unlike normal assignment
statements, cannot be an unpacking) and the expression list, performs the binary
operation specific to the type of assignment on the two operands, and assigns
the result to the original target.  The target is only evaluated once.

An augmented assignment statement like @code{x += 1} can be rewritten as @code{x = x +
1} to achieve a similar, but not exactly equal effect. In the augmented
version, @code{x} is only evaluated once. Also, when possible, the actual operation
is performed `in-place', meaning that rather than creating a new object and
assigning that to the target, the old object is modified instead.

Unlike normal assignments, augmented assignments evaluate the left-hand side
`before' evaluating the right-hand side.  For example, @code{a[i] += f(x)} first
looks-up @code{a[i]}, then it evaluates @code{f(x)} and performs the addition, and
lastly, it writes the result back to @code{a[i]}.

With the exception of assigning to tuples and multiple targets in a single
statement, the assignment done by augmented assignment statements is handled the
same way as normal assignments. Similarly, with the exception of the possible
`in-place' behavior, the binary operation performed by augmented assignment is
the same as the normal binary operations.

For targets which are attribute references, the same @ref{254d,,caveat about class and instance attributes} applies as for regular assignments.

@node Annotated assignment statements,,Augmented assignment statements,Assignment statements
@anchor{reference/simple_stmts annassign}@anchor{2552}@anchor{reference/simple_stmts annotated-assignment-statements}@anchor{2553}
@subsubsection Annotated assignment statements


@geindex annotated; assignment
@geindex statement; assignment@comma{} annotated
@geindex ; (colon); annotated variable

@ref{f57,,Annotation} assignment is the combination, in a single
statement, of a variable or attribute annotation and an optional assignment statement:

@example
@anchor{reference/simple_stmts grammar-token-python-grammar-annotated_assignment_stmt}@anchor{253c}annotated_assignment_stmt: @ref{2550,,augtarget} ":" @ref{183,,expression}
                           ["=" (@ref{24cb,,starred_expression} | @ref{2347,,yield_expression})]
@end example

The difference from normal @ref{246f,,Assignment statements} is that only a single target is allowed.

The assignment target is considered “simple” if it consists of a single
name that is not enclosed in parentheses.
For simple assignment targets, if in class or module scope,
the annotations are gathered in a lazily evaluated
@ref{4ac,,annotation scope}. The annotations can be
evaluated using the @ref{456,,__annotations__} attribute of a
class or module, or using the facilities in the @ref{6,,annotationlib}
module.

If the assignment target is not simple (an attribute, subscript node, or
parenthesized name), the annotation is never evaluated.

If a name is annotated in a function scope, then this name is local for
that scope. Annotations are never evaluated and stored in function scopes.

If the right hand side is present, an annotated
assignment performs the actual assignment as if there was no annotation
present. If the right hand side is not present for an expression
target, then the interpreter evaluates the target except for the last
@ref{14d7,,__setitem__()} or @ref{23bf,,__setattr__()} call.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 526

@item PEP 526@footnote{https://peps.python.org/pep-0526/} - Syntax for Variable Annotations

The proposal that added syntax for annotating the types of variables
(including class variables and instance variables), instead of expressing
them through comments.

@geindex Python Enhancement Proposals; PEP 484

@item PEP 484@footnote{https://peps.python.org/pep-0484/} - Type hints

The proposal that added the @ref{10b,,typing} module to provide a standard
syntax for type annotations that can be used in static analysis tools and
IDEs.
@end table



Changed in version 3.8: Now annotated assignments allow the same expressions in the right hand side as
regular assignments. Previously, some expressions (like un-parenthesized
tuple expressions) caused a syntax error.



Changed in version 3.14: Annotations are now lazily evaluated in a separate @ref{4ac,,annotation scope}.
If the assignment target is not simple, annotations are never evaluated.


@node The assert statement,The pass statement,Assignment statements,Simple statements
@anchor{reference/simple_stmts assert}@anchor{b66}@anchor{reference/simple_stmts the-assert-statement}@anchor{2554}
@subsection The @code{assert} statement


@geindex statement; assert
@geindex debugging; assertions
@geindex @comma{} (comma); expression list

Assert statements are a convenient way to insert debugging assertions into a
program:

@example
@anchor{reference/simple_stmts grammar-token-python-grammar-assert_stmt}@anchor{2539}assert_stmt: "assert" @ref{183,,expression} ["," @ref{183,,expression}]
@end example

The simple form, @code{assert expression}, is equivalent to

@example
if __debug__:
    if not expression: raise AssertionError
@end example

The extended form, @code{assert expression1, expression2}, is equivalent to

@example
if __debug__:
    if not expression1: raise AssertionError(expression2)
@end example

@geindex __debug__
@geindex exception; AssertionError

These equivalences assume that @ref{9e0,,__debug__} and @ref{8ba,,AssertionError} refer to
the built-in variables with those names.  In the current implementation, the
built-in variable @code{__debug__} is @code{True} under normal circumstances,
@code{False} when optimization is requested (command line option @ref{18d,,-O}).  The current
code generator emits no code for an @ref{b66,,assert} statement when optimization is
requested at compile time.  Note that it is unnecessary to include the source
code for the expression that failed in the error message; it will be displayed
as part of the stack trace.

Assignments to @ref{9e0,,__debug__} are illegal.  The value for the built-in variable
is determined when the interpreter starts.

@node The pass statement,The del statement<2>,The assert statement,Simple statements
@anchor{reference/simple_stmts pass}@anchor{17f}@anchor{reference/simple_stmts the-pass-statement}@anchor{2555}
@subsection The @code{pass} statement


@geindex statement; pass
@geindex null; operation
@geindex null; operation

@example
@anchor{reference/simple_stmts grammar-token-python-grammar-pass_stmt}@anchor{253d}pass_stmt: "pass"
@end example

@ref{17f,,pass} is a null operation — when it is executed, nothing happens.
It is useful as a placeholder when a statement is required syntactically, but no
code needs to be executed, for example:

@example
def f(arg): pass    # a function that does nothing (yet)

class C: pass       # a class with no methods (yet)
@end example

@node The del statement<2>,The return statement,The pass statement,Simple statements
@anchor{reference/simple_stmts del}@anchor{1b63}@anchor{reference/simple_stmts the-del-statement}@anchor{2556}
@subsection The @code{del} statement


@geindex statement; del
@geindex deletion; target
@geindex deletion; target; list

@example
@anchor{reference/simple_stmts grammar-token-python-grammar-del_stmt}@anchor{253e}del_stmt: "del" @ref{24cf,,target_list}
@end example

Deletion is recursively defined very similar to the way assignment is defined.
Rather than spelling it out in full details, here are some hints.

Deletion of a target list recursively deletes each target, from left to right.

@geindex statement; global
@geindex unbinding; name

Deletion of a name removes the binding of that name from the local or global
namespace, depending on whether the name occurs in a @ref{4ad,,global} statement
in the same code block.  Trying to delete an unbound name raises a
@ref{450,,NameError} exception.

@geindex attribute; deletion

Deletion of attribute references and subscriptions is passed to the
primary object involved; deletion of a slicing is in general equivalent to
assignment of an empty slice of the right type (but even this is determined by
the sliced object).


Changed in version 3.2: Previously it was illegal to delete a name from the local namespace if it
occurs as a free variable in a nested block.


@node The return statement,The yield statement,The del statement<2>,Simple statements
@anchor{reference/simple_stmts return}@anchor{1b0}@anchor{reference/simple_stmts the-return-statement}@anchor{2557}
@subsection The @code{return} statement


@geindex statement; return
@geindex function; definition
@geindex class; definition

@example
@anchor{reference/simple_stmts grammar-token-python-grammar-return_stmt}@anchor{253f}return_stmt: "return" [@ref{252e,,expression_list}]
@end example

@ref{1b0,,return} may only occur syntactically nested in a function definition,
not within a nested class definition.

If an expression list is present, it is evaluated, else @code{None} is substituted.

@ref{1b0,,return} leaves the current function call with the expression list (or
@code{None}) as return value.

@geindex keyword; finally

When @ref{1b0,,return} passes control out of a @ref{8fa,,try} statement with a
@ref{1b1,,finally} clause, that @code{finally} clause is executed before
really leaving the function.

In a generator function, the @ref{1b0,,return} statement indicates that the
generator is done and will cause @ref{dfb,,StopIteration} to be raised. The returned
value (if any) is used as an argument to construct @code{StopIteration} and
becomes the @ref{245e,,StopIteration.value} attribute.

In an asynchronous generator function, an empty @ref{1b0,,return} statement
indicates that the asynchronous generator is done and will cause
@ref{1e52,,StopAsyncIteration} to be raised.  A non-empty @code{return}
statement is a syntax error in an asynchronous generator function.

@node The yield statement,The raise statement,The return statement,Simple statements
@anchor{reference/simple_stmts the-yield-statement}@anchor{2558}@anchor{reference/simple_stmts yield}@anchor{bc8}
@subsection The @code{yield} statement


@geindex statement; yield
@geindex generator; function
@geindex generator; iterator
@geindex function; generator
@geindex exception; StopIteration

@example
@anchor{reference/simple_stmts grammar-token-python-grammar-yield_stmt}@anchor{2540}yield_stmt: @ref{2347,,yield_expression}
@end example

A @ref{bc8,,yield} statement is semantically equivalent to a @ref{24df,,yield expression}. The @code{yield} statement can be used to omit the
parentheses that would otherwise be required in the equivalent yield expression
statement. For example, the yield statements

@example
yield <expr>
yield from <expr>
@end example

are equivalent to the yield expression statements

@example
(yield <expr>)
(yield from <expr>)
@end example

Yield expressions and statements are only used when defining a @ref{1267,,generator}
function, and are only used in the body of the generator function.  Using @ref{bc8,,yield}
in a function definition is sufficient to cause that definition to create a
generator function instead of a normal function.

For full details of @ref{bc8,,yield} semantics, refer to the
@ref{24df,,Yield expressions} section.

@node The raise statement,The break statement,The yield statement,Simple statements
@anchor{reference/simple_stmts raise}@anchor{804}@anchor{reference/simple_stmts the-raise-statement}@anchor{2559}
@subsection The @code{raise} statement


@geindex statement; raise
@geindex exception
@geindex raising; exception
@geindex __traceback__ (exception attribute)

@example
@anchor{reference/simple_stmts grammar-token-python-grammar-raise_stmt}@anchor{2541}raise_stmt: "raise" [@ref{183,,expression} ["from" @ref{183,,expression}]]
@end example

If no expressions are present, @ref{804,,raise} re-raises the
exception that is currently being handled, which is also known as the `active exception'.
If there isn’t currently an active exception, a @ref{246,,RuntimeError} exception is raised
indicating that this is an error.

Otherwise, @ref{804,,raise} evaluates the first expression as the exception
object.  It must be either a subclass or an instance of @ref{7d8,,BaseException}.
If it is a class, the exception instance will be obtained when needed by
instantiating the class with no arguments.

The `type' of the exception is the exception instance’s class, the
`value' is the instance itself.

@geindex object; traceback

A traceback object is normally created automatically when an exception is raised
and attached to it as the @ref{14d2,,__traceback__} attribute.
You can create an exception and set your own traceback in one step using the
@ref{255a,,with_traceback()} exception method (which returns the
same exception instance, with its traceback set to its argument), like so:

@example
raise Exception("foo occurred").with_traceback(tracebackobj)
@end example

@geindex exception; chaining
@geindex __cause__ (exception attribute)
@geindex __context__ (exception attribute)

The @code{from} clause is used for exception chaining: if given, the second
`expression' must be another exception class or instance. If the second
expression is an exception instance, it will be attached to the raised
exception as the @ref{14d4,,__cause__} attribute (which is writable). If the
expression is an exception class, the class will be instantiated and the
resulting exception instance will be attached to the raised exception as the
@code{__cause__} attribute. If the raised exception is not handled, both
exceptions will be printed:

@example
>>> try:
...     print(1 / 0)
... except Exception as exc:
...     raise RuntimeError("Something bad happened") from exc
...
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
    print(1 / 0)
          ~~^~~
ZeroDivisionError: division by zero

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
    raise RuntimeError("Something bad happened") from exc
RuntimeError: Something bad happened
@end example

A similar mechanism works implicitly if a new exception is raised when
an exception is already being handled.  An exception may be handled
when an @ref{1ac,,except} or @ref{1b1,,finally} clause, or a
@ref{187,,with} statement, is used.  The previous exception is then
attached as the new exception’s @ref{14d3,,__context__} attribute:

@example
>>> try:
...     print(1 / 0)
... except:
...     raise RuntimeError("Something bad happened")
...
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
    print(1 / 0)
          ~~^~~
ZeroDivisionError: division by zero

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
    raise RuntimeError("Something bad happened")
RuntimeError: Something bad happened
@end example

Exception chaining can be explicitly suppressed by specifying @ref{887,,None} in
the @code{from} clause:

@example
>>> try:
...     print(1 / 0)
... except:
...     raise RuntimeError("Something bad happened") from None
...
Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
RuntimeError: Something bad happened
@end example

Additional information on exceptions can be found in section @ref{247b,,Exceptions},
and information about handling exceptions is in section @ref{8fa,,The try statement}.


Changed in version 3.3: @ref{887,,None} is now permitted as @code{Y} in @code{raise X from Y}.

Added the @ref{255b,,__suppress_context__} attribute to suppress
automatic display of the exception context.



Changed in version 3.11: If the traceback of the active exception is modified in an @ref{1ac,,except}
clause, a subsequent @code{raise} statement re-raises the exception with the
modified traceback. Previously, the exception was re-raised with the
traceback it had when it was caught.


@node The break statement,The continue statement,The raise statement,Simple statements
@anchor{reference/simple_stmts break}@anchor{180}@anchor{reference/simple_stmts the-break-statement}@anchor{255c}
@subsection The @code{break} statement


@geindex statement; break
@geindex statement; for
@geindex statement; while
@geindex loop; statement

@example
@anchor{reference/simple_stmts grammar-token-python-grammar-break_stmt}@anchor{2542}break_stmt: "break"
@end example

@ref{180,,break} may only occur syntactically nested in a @ref{348,,for} or
@ref{19b7,,while} loop, but not nested in a function or class definition within
that loop.

@geindex keyword; else
@geindex loop control; target

It terminates the nearest enclosing loop, skipping the optional @code{else}
clause if the loop has one.

If a @ref{348,,for} loop is terminated by @ref{180,,break}, the loop control
target keeps its current value.

@geindex keyword; finally

When @ref{180,,break} passes control out of a @ref{8fa,,try} statement with a
@ref{1b1,,finally} clause, that @code{finally} clause is executed before
really leaving the loop.

@node The continue statement,The import statement,The break statement,Simple statements
@anchor{reference/simple_stmts continue}@anchor{181}@anchor{reference/simple_stmts the-continue-statement}@anchor{255d}
@subsection The @code{continue} statement


@geindex statement; continue
@geindex statement; for
@geindex statement; while
@geindex loop; statement
@geindex keyword; finally

@example
@anchor{reference/simple_stmts grammar-token-python-grammar-continue_stmt}@anchor{2543}continue_stmt: "continue"
@end example

@ref{181,,continue} may only occur syntactically nested in a @ref{348,,for} or
@ref{19b7,,while} loop, but not nested in a function or class definition within
that loop.  It continues with the next cycle of the nearest enclosing loop.

When @ref{181,,continue} passes control out of a @ref{8fa,,try} statement with a
@ref{1b1,,finally} clause, that @code{finally} clause is executed before
really starting the next loop cycle.
@anchor{reference/simple_stmts import}@anchor{7f9}
@node The import statement,The global statement,The continue statement,Simple statements
@anchor{reference/simple_stmts from}@anchor{14b7}@anchor{reference/simple_stmts the-import-statement}@anchor{255e}
@subsection The @code{import} statement


@geindex statement; import
@geindex module; importing
@geindex name; binding
@geindex keyword; from
@geindex keyword; as
@geindex exception; ImportError
@geindex @comma{} (comma); import statement

@example
@anchor{reference/simple_stmts grammar-token-python-grammar-import_stmt}@anchor{2544}import_stmt:     "import" @ref{255f,,module} ["as" @ref{2305,,identifier}] ("," @ref{255f,,module} ["as" @ref{2305,,identifier}])*
                 | "from" @ref{2560,,relative_module} "import" @ref{2305,,identifier} ["as" @ref{2305,,identifier}]
                 ("," @ref{2305,,identifier} ["as" @ref{2305,,identifier}])*
                 | "from" @ref{2560,,relative_module} "import" "(" @ref{2305,,identifier} ["as" @ref{2305,,identifier}]
                 ("," @ref{2305,,identifier} ["as" @ref{2305,,identifier}])* [","] ")"
                 | "from" @ref{2560,,relative_module} "import" "*"
@anchor{reference/simple_stmts grammar-token-python-grammar-module}@anchor{255f}module:          (@ref{2305,,identifier} ".")* @ref{2305,,identifier}
@anchor{reference/simple_stmts grammar-token-python-grammar-relative_module}@anchor{2560}relative_module: "."* @ref{255f,,module} | "."+
@end example

The basic import statement (no @ref{14b7,,from} clause) is executed in two
steps:


@enumerate 

@item 
find a module, loading and initializing it if necessary

@item 
define a name or names in the current namespace for the scope where
the @ref{7f9,,import} statement occurs, just as an assignment statement
would (including @ref{4ad,,global} and @ref{14b3,,nonlocal} semantics).
@end enumerate

When the statement contains multiple clauses (separated by
commas) the two steps are carried out separately for each clause, just
as though the clauses had been separated out into individual import
statements.

The details of the first step, finding and loading modules, are described in
greater detail in the section on the @ref{23a4,,import system},
which also describes the various types of packages and modules that can
be imported, as well as all the hooks that can be used to customize
the import system. Note that failures in this step may indicate either
that the module could not be located, `or' that an error occurred while
initializing the module, which includes execution of the module’s code.

If the requested module is retrieved successfully, it will be made
available in the local namespace in one of three ways:

@geindex as; import statement


@itemize *

@item 
If the module name is followed by @code{as}, then the name
following @code{as} is bound directly to the imported module.

@item 
If no other name is specified, and the module being imported is a top
level module, the module’s name is bound in the local namespace as a
reference to the imported module

@item 
If the module being imported is `not' a top level module, then the name
of the top level package that contains the module is bound in the local
namespace as a reference to the top level package. The imported module
must be accessed using its full qualified name rather than directly
@end itemize

@geindex name; binding
@geindex from; import statement

The @ref{14b7,,from} form uses a slightly more complex process:


@enumerate 

@item 
find the module specified in the @ref{14b7,,from} clause, loading and
initializing it if necessary;

@item 
for each of the identifiers specified in the @ref{7f9,,import} clauses:


@enumerate 

@item 
check if the imported module has an attribute by that name

@item 
if not, attempt to import a submodule with that name and then
check the imported module again for that attribute

@item 
if the attribute is not found, @ref{65b,,ImportError} is raised.

@item 
otherwise, a reference to that value is stored in the current namespace,
using the name in the @code{as} clause if it is present,
otherwise using the attribute name
@end enumerate
@end enumerate

Examples:

@example
import foo                 # foo imported and bound locally
import foo.bar.baz         # foo, foo.bar, and foo.bar.baz imported, foo bound locally
import foo.bar.baz as fbb  # foo, foo.bar, and foo.bar.baz imported, foo.bar.baz bound as fbb
from foo.bar import baz    # foo, foo.bar, and foo.bar.baz imported, foo.bar.baz bound as baz
from foo import attr       # foo imported and foo.attr bound as attr
@end example

@geindex * (asterisk); import statement

If the list of identifiers is replaced by a star (@code{'*'}), all public
names defined in the module are bound in the local namespace for the scope
where the @ref{7f9,,import} statement occurs.

@geindex __all__ (optional module attribute)

@geindex __all__ (module attribute)
@anchor{reference/simple_stmts module __all__}@anchor{f41}
The `public names' defined by a module are determined by checking the module’s
namespace for a variable named @code{__all__}; if defined, it must be a sequence
of strings which are names defined or imported by that module.
Names containing non-ASCII characters must be in the normalization form@footnote{https://www.unicode.org/reports/tr15/#Norm_Forms}
NFKC; see @ref{2301,,Non-ASCII characters in names} for details.  The names
given in @code{__all__} are all considered public and are required to exist.  If
@code{__all__} is not defined, the set of public names includes all names found
in the module’s namespace which do not begin with an underscore character
(@code{'_'}).  @code{__all__} should contain the entire public API. It is intended
to avoid accidentally exporting items that are not part of the API (such as
library modules which were imported and used within the module).

The wild card form of import — @code{from module import *} — is only allowed at
the module level.  Attempting to use it in class or function definitions will
raise a @ref{18f,,SyntaxError}.

@geindex relative; import

When specifying what module to import you do not have to specify the absolute
name of the module. When a module or package is contained within another
package it is possible to make a relative import within the same top package
without having to mention the package name. By using leading dots in the
specified module or package after @ref{14b7,,from} you can specify how high to
traverse up the current package hierarchy without specifying exact names. One
leading dot means the current package where the module making the import
exists. Two dots means up one package level. Three dots is up two levels, etc.
So if you execute @code{from . import mod} from a module in the @code{pkg} package
then you will end up importing @code{pkg.mod}. If you execute @code{from ..subpkg2
import mod} from within @code{pkg.subpkg1} you will import @code{pkg.subpkg2.mod}.
The specification for relative imports is contained in
the @ref{24a5,,Package Relative Imports} section.

@ref{73d,,importlib.import_module()} is provided to support applications that
determine dynamically the modules to be loaded.

Raises an @ref{1cb1,,auditing event} @code{import} with arguments @code{module}, @code{filename}, @code{sys.path}, @code{sys.meta_path}, @code{sys.path_hooks}.

@menu
* Future statements:: 

@end menu

@node Future statements,,,The import statement
@anchor{reference/simple_stmts future}@anchor{45b}@anchor{reference/simple_stmts future-statements}@anchor{2561}
@subsubsection Future statements


@geindex future; statement
@geindex __future__; future statement

A `future statement' is a directive to the compiler that a particular
module should be compiled using syntax or semantics that will be available in a
specified future release of Python where the feature becomes standard.

The future statement is intended to ease migration to future versions of Python
that introduce incompatible changes to the language.  It allows use of the new
features on a per-module basis before the release in which the feature becomes
standard.

@example
@anchor{reference/simple_stmts grammar-token-python-grammar-future_stmt}@anchor{2545}future_stmt: "from" "__future__" "import" @ref{2562,,feature} ["as" @ref{2305,,identifier}]
             ("," @ref{2562,,feature} ["as" @ref{2305,,identifier}])*
             | "from" "__future__" "import" "(" @ref{2562,,feature} ["as" @ref{2305,,identifier}]
             ("," @ref{2562,,feature} ["as" @ref{2305,,identifier}])* [","] ")"
@anchor{reference/simple_stmts grammar-token-python-grammar-feature}@anchor{2562}feature:     @ref{2305,,identifier}
@end example

A future statement must appear near the top of the module.  The only lines that
can appear before a future statement are:


@itemize *

@item 
the module docstring (if any),

@item 
comments,

@item 
blank lines, and

@item 
other future statements.
@end itemize

The only feature that requires using the future statement is
@code{annotations} (see 
@geindex Python Enhancement Proposals; PEP 563
PEP 563@footnote{https://peps.python.org/pep-0563/}).

All historical features enabled by the future statement are still recognized
by Python 3.  The list includes @code{absolute_import}, @code{division},
@code{generators}, @code{generator_stop}, @code{unicode_literals},
@code{print_function}, @code{nested_scopes} and @code{with_statement}.  They are
all redundant because they are always enabled, and only kept for
backwards compatibility.

A future statement is recognized and treated specially at compile time: Changes
to the semantics of core constructs are often implemented by generating
different code.  It may even be the case that a new feature introduces new
incompatible syntax (such as a new reserved word), in which case the compiler
may need to parse the module differently.  Such decisions cannot be pushed off
until runtime.

For any given release, the compiler knows which feature names have been defined,
and raises a compile-time error if a future statement contains a feature not
known to it.

The direct runtime semantics are the same as for any import statement: there is
a standard module @ref{0,,__future__}, described later, and it will be imported in
the usual way at the time the future statement is executed.

The interesting runtime semantics depend on the specific feature enabled by the
future statement.

Note that there is nothing special about the statement:

@example
import __future__ [as name]
@end example

That is not a future statement; it’s an ordinary import statement with no
special semantics or syntax restrictions.

Code compiled by calls to the built-in functions @ref{4a3,,exec()} and @ref{4b2,,compile()}
that occur in a module @code{M} containing a future statement will, by default,
use the new syntax or semantics associated with the future statement.  This can
be controlled by optional arguments to @code{compile()} — see the documentation
of that function for details.

A future statement typed at an interactive interpreter prompt will take effect
for the rest of the interpreter session.  If an interpreter is started with the
@ref{16e7,,-i} option, is passed a script name to execute, and the script includes
a future statement, it will be in effect in the interactive session started
after the script is executed.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 236

@item PEP 236@footnote{https://peps.python.org/pep-0236/} - Back to the __future__

The original proposal for the __future__ mechanism.
@end table


@node The global statement,The nonlocal statement,The import statement,Simple statements
@anchor{reference/simple_stmts global}@anchor{4ad}@anchor{reference/simple_stmts the-global-statement}@anchor{2563}
@subsection The @code{global} statement


@geindex statement; global
@geindex global; name; binding
@geindex @comma{} (comma); identifier list

@example
@anchor{reference/simple_stmts grammar-token-python-grammar-global_stmt}@anchor{2546}global_stmt: "global" @ref{2305,,identifier} ("," @ref{2305,,identifier})*
@end example

The @ref{4ad,,global} statement causes the listed identifiers to be interpreted
as globals. It would be impossible to assign to a global variable without
@code{global}, although free variables may refer to globals without being
declared global.

The @code{global} statement applies to the entire current scope
(module, function body or class definition).
A @ref{18f,,SyntaxError} is raised if a variable is used or
assigned to prior to its global declaration in the scope.

At the module level, all variables are global, so a @code{global}
statement has no effect.
However, variables must still not be used or
assigned to prior to their @code{global} declaration.
This requirement is relaxed in the interactive prompt (@ref{492,,REPL}).

@geindex built-in function; exec
@geindex built-in function; eval
@geindex built-in function; compile

`Programmer’s note:' @ref{4ad,,global} is a directive to the parser.  It
applies only to code parsed at the same time as the @code{global} statement.
In particular, a @code{global} statement contained in a string or code
object supplied to the built-in @ref{4a3,,exec()} function does not affect the code
block `containing' the function call, and code contained in such a string is
unaffected by @code{global} statements in the code containing the function
call.  The same applies to the @ref{4a4,,eval()} and @ref{4b2,,compile()} functions.

@node The nonlocal statement,The type statement,The global statement,Simple statements
@anchor{reference/simple_stmts nonlocal}@anchor{14b3}@anchor{reference/simple_stmts the-nonlocal-statement}@anchor{2564}
@subsection The @code{nonlocal} statement


@geindex statement; nonlocal
@geindex @comma{} (comma); identifier list

@example
@anchor{reference/simple_stmts grammar-token-python-grammar-nonlocal_stmt}@anchor{2547}nonlocal_stmt: "nonlocal" @ref{2305,,identifier} ("," @ref{2305,,identifier})*
@end example

When the definition of a function or class is nested (enclosed) within
the definitions of other functions, its nonlocal scopes are the local
scopes of the enclosing functions. The @ref{14b3,,nonlocal} statement
causes the listed identifiers to refer to names previously bound in
nonlocal scopes. It allows encapsulated code to rebind such nonlocal
identifiers.  If a name is bound in more than one nonlocal scope, the
nearest binding is used. If a name is not bound in any nonlocal scope,
or if there is no nonlocal scope, a @ref{18f,,SyntaxError} is raised.

The @ref{14b3,,nonlocal} statement applies to the entire scope of a function or
class body. A @ref{18f,,SyntaxError} is raised if a variable is used or
assigned to prior to its nonlocal declaration in the scope.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 3104

@item PEP 3104@footnote{https://peps.python.org/pep-3104/} - Access to Names in Outer Scopes

The specification for the @ref{14b3,,nonlocal} statement.
@end table


`Programmer’s note:' @ref{14b3,,nonlocal} is a directive to the parser
and applies only to code parsed along with it.  See the note for the
@ref{4ad,,global} statement.

@node The type statement,,The nonlocal statement,Simple statements
@anchor{reference/simple_stmts the-type-statement}@anchor{2565}@anchor{reference/simple_stmts type}@anchor{66d}
@subsection The @code{type} statement


@geindex statement; type

@example
@anchor{reference/simple_stmts grammar-token-python-grammar-type_stmt}@anchor{2548}type_stmt: 'type' @ref{2305,,identifier} [@ref{2566,,type_params}] "=" @ref{183,,expression}
@end example

The @code{type} statement declares a type alias, which is an instance
of @ref{2b0,,typing.TypeAliasType}.

For example, the following statement creates a type alias:

@example
type Point = tuple[float, float]
@end example

This code is roughly equivalent to:

@example
annotation-def VALUE_OF_Point():
    return tuple[float, float]
Point = typing.TypeAliasType("Point", VALUE_OF_Point())
@end example

@code{annotation-def} indicates an @ref{4ac,,annotation scope}, which behaves
mostly like a function, but with several small differences.

The value of the
type alias is evaluated in the annotation scope. It is not evaluated when the
type alias is created, but only when the value is accessed through the type alias’s
@code{__value__} attribute (see @ref{686,,Lazy evaluation}).
This allows the type alias to refer to names that are not yet defined.

Type aliases may be made generic by adding a @ref{5ad,,type parameter list}
after the name. See @ref{685,,Generic type aliases} for more.

@code{type} is a @ref{a13,,soft keyword}.


Added in version 3.12.



@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 695

@item PEP 695@footnote{https://peps.python.org/pep-0695/} - Type Parameter Syntax

Introduced the @code{type} statement and syntax for
generic classes and functions.
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Compound statements,Top-level components,Simple statements,The Python Language Reference
@anchor{reference/compound_stmts doc}@anchor{2567}@anchor{reference/compound_stmts compound}@anchor{2568}@anchor{reference/compound_stmts compound-statements}@anchor{2569}@anchor{reference/compound_stmts translation-repo}@anchor{256a}
@section Compound statements


@geindex compound; statement

Compound statements contain (groups of) other statements; they affect or control
the execution of those other statements in some way.  In general, compound
statements span multiple lines, although in simple incarnations a whole compound
statement may be contained in one line.

The @ref{182,,if}, @ref{19b7,,while} and @ref{348,,for} statements implement
traditional control flow constructs.  @ref{8fa,,try} specifies exception
handlers and/or cleanup code for a group of statements, while the
@ref{187,,with} statement allows the execution of initialization and
finalization code around a block of code.  Function and class definitions are
also syntactically compound statements.

@geindex clause
@geindex suite
@geindex ; (semicolon)

A compound statement consists of one or more ‘clauses.’  A clause consists of a
header and a ‘suite.’  The clause headers of a particular compound statement are
all at the same indentation level. Each clause header begins with a uniquely
identifying keyword and ends with a colon.  A suite is a group of statements
controlled by a clause.  A suite can be one or more semicolon-separated simple
statements on the same line as the header, following the header’s colon, or it
can be one or more indented statements on subsequent lines.  Only the latter
form of a suite can contain nested compound statements; the following is illegal,
mostly because it wouldn’t be clear to which @ref{182,,if} clause a following
@ref{17d,,else} clause would belong:

@example
if test1: if test2: print(x)
@end example

Also note that the semicolon binds tighter than the colon in this context, so
that in the following example, either all or none of the @ref{117b,,print()} calls are
executed:

@example
if x < y < z: print(x); print(y); print(z)
@end example

Summarizing:

@example
@anchor{reference/compound_stmts grammar-token-python-grammar-compound_stmt}@anchor{256b}compound_stmt: @ref{256c,,if_stmt}
               | @ref{256d,,while_stmt}
               | @ref{256e,,for_stmt}
               | @ref{256f,,try_stmt}
               | @ref{2570,,with_stmt}
               | @ref{2571,,match_stmt}
               | @ref{2572,,funcdef}
               | @ref{2573,,classdef}
               | @ref{2574,,async_with_stmt}
               | @ref{2575,,async_for_stmt}
               | @ref{2576,,async_funcdef}
@anchor{reference/compound_stmts grammar-token-python-grammar-suite}@anchor{2577}suite:         @ref{2578,,stmt_list} NEWLINE | NEWLINE INDENT @ref{2579,,statement}+ DEDENT
@anchor{reference/compound_stmts grammar-token-python-grammar-statement}@anchor{2579}statement:     @ref{2578,,stmt_list} NEWLINE | @ref{256b,,compound_stmt}
@anchor{reference/compound_stmts grammar-token-python-grammar-stmt_list}@anchor{2578}stmt_list:     @ref{2537,,simple_stmt} (";" @ref{2537,,simple_stmt})* [";"]
@end example

@geindex NEWLINE token
@geindex DEDENT token
@geindex dangling; else

Note that statements always end in a @code{NEWLINE} possibly followed by a
@code{DEDENT}.  Also note that optional continuation clauses always begin with a
keyword that cannot start a statement, thus there are no ambiguities (the
‘dangling @ref{17d,,else}’ problem is solved in Python by requiring nested
@ref{182,,if} statements to be indented).

The formatting of the grammar rules in the following sections places each clause
on a separate line for clarity.
@anchor{reference/compound_stmts if}@anchor{182}@anchor{reference/compound_stmts elif}@anchor{17c}
@menu
* The if statement:: 
* The while statement:: 
* The for statement:: 
* The try statement:: 
* The with statement:: 
* The match statement:: 
* Function definitions:: 
* Class definitions:: 
* Coroutines: Coroutines<2>. 
* Type parameter lists:: 
* Annotations: Annotations<2>. 

@end menu

@node The if statement,The while statement,,Compound statements
@anchor{reference/compound_stmts else}@anchor{17d}@anchor{reference/compound_stmts the-if-statement}@anchor{257a}
@subsection The @code{if} statement


@geindex statement; if
@geindex keyword; elif
@geindex keyword; else
@geindex ; (colon); compound statement

The @ref{182,,if} statement is used for conditional execution:

@example
@anchor{reference/compound_stmts grammar-token-python-grammar-if_stmt}@anchor{256c}if_stmt: "if" @ref{2475,,assignment_expression} ":" @ref{2577,,suite}
         ("elif" @ref{2475,,assignment_expression} ":" @ref{2577,,suite})*
         ["else" ":" @ref{2577,,suite}]
@end example

It selects exactly one of the suites by evaluating the expressions one by one
until one is found to be true (see section @ref{251f,,Boolean operations} for the definition of
true and false); then that suite is executed (and no other part of the
@ref{182,,if} statement is executed or evaluated).  If all expressions are
false, the suite of the @ref{17d,,else} clause, if present, is executed.

@node The while statement,The for statement,The if statement,Compound statements
@anchor{reference/compound_stmts the-while-statement}@anchor{257b}@anchor{reference/compound_stmts while}@anchor{19b7}
@subsection The @code{while} statement


@geindex statement; while
@geindex keyword; else
@geindex loop; statement
@geindex ; (colon); compound statement

The @ref{19b7,,while} statement is used for repeated execution as long as an
expression is true:

@example
@anchor{reference/compound_stmts grammar-token-python-grammar-while_stmt}@anchor{256d}while_stmt: "while" @ref{2475,,assignment_expression} ":" @ref{2577,,suite}
            ["else" ":" @ref{2577,,suite}]
@end example

This repeatedly tests the expression and, if it is true, executes the first
suite; if the expression is false (which may be the first time it is tested) the
suite of the @code{else} clause, if present, is executed and the loop
terminates.

@geindex statement; break
@geindex statement; continue

A @ref{180,,break} statement executed in the first suite terminates the loop
without executing the @code{else} clause’s suite.  A @ref{181,,continue}
statement executed in the first suite skips the rest of the suite and goes back
to testing the expression.

@node The for statement,The try statement,The while statement,Compound statements
@anchor{reference/compound_stmts for}@anchor{348}@anchor{reference/compound_stmts the-for-statement}@anchor{257c}
@subsection The @code{for} statement


@geindex statement; for
@geindex keyword; in
@geindex keyword; else
@geindex target; list
@geindex loop; statement
@geindex object; sequence
@geindex ; (colon); compound statement

The @ref{348,,for} statement is used to iterate over the elements of a sequence
(such as a string, tuple or list) or other iterable object:

@example
@anchor{reference/compound_stmts grammar-token-python-grammar-for_stmt}@anchor{256e}for_stmt: "for" @ref{24cf,,target_list} "in" @ref{252d,,starred_expression_list} ":" @ref{2577,,suite}
          ["else" ":" @ref{2577,,suite}]
@end example

The @ref{252d,,starred_expression_list} expression is evaluated
once; it should yield an @ref{1433,,iterable} object. An @ref{4c9,,iterator} is
created for that iterable. The first item provided by the iterator is then
assigned to the target list using the standard rules for assignments
(see @ref{246f,,Assignment statements}), and the suite is executed. This repeats for each
item provided by the iterator. When the iterator is exhausted,
the suite in the @code{else} clause,
if present, is executed, and the loop terminates.

@geindex statement; break
@geindex statement; continue

A @ref{180,,break} statement executed in the first suite terminates the loop
without executing the @code{else} clause’s suite.  A @ref{181,,continue}
statement executed in the first suite skips the rest of the suite and continues
with the next item, or with the @code{else} clause if there is no next
item.

The for-loop makes assignments to the variables in the target list.
This overwrites all previous assignments to those variables including
those made in the suite of the for-loop:

@example
for i in range(10):
    print(i)
    i = 5             # this will not affect the for-loop
                      # because i will be overwritten with the next
                      # index in the range
@end example

@geindex built-in function; range

Names in the target list are not deleted when the loop is finished, but if the
sequence is empty, they will not have been assigned to at all by the loop.  Hint:
the built-in type @ref{b43,,range()} represents immutable arithmetic sequences of integers.
For instance, iterating @code{range(3)} successively yields 0, 1, and then 2.


Changed in version 3.11: Starred elements are now allowed in the expression list.


@node The try statement,The with statement,The for statement,Compound statements
@anchor{reference/compound_stmts the-try-statement}@anchor{257d}@anchor{reference/compound_stmts try}@anchor{8fa}
@subsection The @code{try} statement


@geindex statement; try
@geindex keyword; except
@geindex keyword; finally
@geindex keyword; else
@geindex keyword; as
@geindex ; (colon); compound statement

The @code{try} statement specifies exception handlers and/or cleanup code
for a group of statements:

@example
@anchor{reference/compound_stmts grammar-token-python-grammar-try_stmt}@anchor{256f}try_stmt:  @ref{257e,,try1_stmt} | @ref{257f,,try2_stmt} | @ref{2580,,try3_stmt}
@anchor{reference/compound_stmts grammar-token-python-grammar-try1_stmt}@anchor{257e}try1_stmt: "try" ":" @ref{2577,,suite}
           ("except" [@ref{183,,expression} ["as" @ref{2305,,identifier}]] ":" @ref{2577,,suite})+
           ["else" ":" @ref{2577,,suite}]
           ["finally" ":" @ref{2577,,suite}]
@anchor{reference/compound_stmts grammar-token-python-grammar-try2_stmt}@anchor{257f}try2_stmt: "try" ":" @ref{2577,,suite}
           ("except" "*" @ref{183,,expression} ["as" @ref{2305,,identifier}] ":" @ref{2577,,suite})+
           ["else" ":" @ref{2577,,suite}]
           ["finally" ":" @ref{2577,,suite}]
@anchor{reference/compound_stmts grammar-token-python-grammar-try3_stmt}@anchor{2580}try3_stmt: "try" ":" @ref{2577,,suite}
           "finally" ":" @ref{2577,,suite}
@end example

Additional information on exceptions can be found in section @ref{247b,,Exceptions},
and information on using the @ref{804,,raise} statement to generate exceptions
may be found in section @ref{804,,The raise statement}.


Changed in version 3.14: Support for optionally dropping grouping parentheses when using multiple exception types. See 
@geindex Python Enhancement Proposals; PEP 758
PEP 758@footnote{https://peps.python.org/pep-0758/}.


@menu
* except clause:: 
* except* clause:: 
* else clause:: 
* finally clause:: 

@end menu

@node except clause,except* clause,,The try statement
@anchor{reference/compound_stmts except}@anchor{1ac}@anchor{reference/compound_stmts except-clause}@anchor{2581}
@subsubsection @code{except} clause


The @code{except} clause(s) specify one or more exception handlers. When no
exception occurs in the @ref{8fa,,try} clause, no exception handler is executed.
When an exception occurs in the @code{try} suite, a search for an exception
handler is started. This search inspects the @code{except} clauses in turn
until one is found that matches the exception.
An expression-less @code{except} clause, if present, must be last;
it matches any exception.

For an @code{except} clause with an expression, the
expression must evaluate to an exception type or a tuple of exception types. Parentheses
can be dropped if multiple exception types are provided and the @code{as} clause is not used.
The raised exception matches an @code{except} clause whose expression evaluates
to the class or a @ref{13c2,,non-virtual base class} of the exception object,
or to a tuple that contains such a class.

If no @code{except} clause matches the exception,
the search for an exception handler
continues in the surrounding code and on the invocation stack.  @footnote{
The exception is propagated to the invocation stack unless
there is a @ref{1b1,,finally} clause which happens to raise another
exception. That new exception causes the old one to be lost.
}

If the evaluation of an expression
in the header of an @code{except} clause raises an exception,
the original search for a handler is canceled and a search starts for
the new exception in the surrounding code and on the call stack (it is treated
as if the entire @ref{8fa,,try} statement raised the exception).

@geindex as; except clause

When a matching @code{except} clause is found,
the exception is assigned to the target
specified after the @code{as} keyword in that @code{except} clause,
if present, and the @code{except} clause’s suite is executed.
All @code{except} clauses must have an executable block.
When the end of this block is reached, execution continues
normally after the entire @ref{8fa,,try} statement.
(This means that if two nested handlers exist for the same exception,
and the exception occurs in the @code{try} clause of the inner handler,
the outer handler will not handle the exception.)

When an exception has been assigned using @code{as target}, it is cleared at the
end of the @code{except} clause.  This is as if

@example
except E as N:
    foo
@end example

was translated to

@example
except E as N:
    try:
        foo
    finally:
        del N
@end example

This means the exception must be assigned to a different name to be able to
refer to it after the @code{except} clause.
Exceptions are cleared because with the
traceback attached to them, they form a reference cycle with the stack frame,
keeping all locals in that frame alive until the next garbage collection occurs.

@geindex module; sys
@geindex object; traceback

Before an @code{except} clause’s suite is executed,
the exception is stored in the @ref{df,,sys} module, where it can be accessed
from within the body of the @code{except} clause by calling
@ref{89d,,sys.exception()}. When leaving an exception handler, the exception
stored in the @code{sys} module is reset to its previous value:

@example
>>> print(sys.exception())
None
>>> try:
...     raise TypeError
... except:
...     print(repr(sys.exception()))
...     try:
...          raise ValueError
...     except:
...         print(repr(sys.exception()))
...     print(repr(sys.exception()))
...
TypeError()
ValueError()
TypeError()
>>> print(sys.exception())
None
@end example

@geindex keyword; except_star

@node except* clause,else clause,except clause,The try statement
@anchor{reference/compound_stmts except-star}@anchor{1ad}@anchor{reference/compound_stmts id2}@anchor{2582}
@subsubsection @code{except*} clause


The @code{except*} clause(s) specify one or more handlers for groups of
exceptions (@ref{566,,BaseExceptionGroup} instances). A @ref{8fa,,try} statement
can have either @ref{1ac,,except} or @code{except*} clauses, but not both.
The exception type for matching is mandatory in the case of @code{except*},
so @code{except*:} is a syntax error. The type is interpreted as in the case of
@code{except}, but matching is performed on the exceptions contained in the
group that is being handled. An @ref{199,,TypeError} is raised if a matching
type is a subclass of @code{BaseExceptionGroup}, because that would have
ambiguous semantics.

When an exception group is raised in the try block, each @code{except*}
clause splits (see @ref{191e,,split()}) it into the subgroups
of matching and non-matching exceptions. If the matching subgroup is not empty,
it becomes the handled exception (the value returned from @ref{89d,,sys.exception()})
and assigned to the target of the @code{except*} clause (if there is one).
Then, the body of the @code{except*} clause executes. If the non-matching
subgroup is not empty, it is processed by the next @code{except*} in the
same manner. This continues until all exceptions in the group have been matched,
or the last @code{except*} clause has run.

After all @code{except*} clauses execute, the group of unhandled exceptions
is merged with any exceptions that were raised or re-raised from within
@code{except*} clauses. This merged exception group propagates on.:

@example
>>> try:
...     raise ExceptionGroup("eg",
...         [ValueError(1), TypeError(2), OSError(3), OSError(4)])
... except* TypeError as e:
...     print(f'caught @{type(e)@} with nested @{e.exceptions@}')
... except* OSError as e:
...     print(f'caught @{type(e)@} with nested @{e.exceptions@}')
...
caught <class 'ExceptionGroup'> with nested (TypeError(2),)
caught <class 'ExceptionGroup'> with nested (OSError(3), OSError(4))
  + Exception Group Traceback (most recent call last):
  |   File "<doctest default[0]>", line 2, in <module>
  |     raise ExceptionGroup("eg",
  |         [ValueError(1), TypeError(2), OSError(3), OSError(4)])
  | ExceptionGroup: eg (1 sub-exception)
  +-+---------------- 1 ----------------
    | ValueError: 1
    +------------------------------------
@end example

If the exception raised from the @ref{8fa,,try} block is not an exception group
and its type matches one of the @code{except*} clauses, it is caught and
wrapped by an exception group with an empty message string. This ensures that the
type of the target @code{e} is consistently @ref{566,,BaseExceptionGroup}:

@example
>>> try:
...     raise BlockingIOError
... except* BlockingIOError as e:
...     print(repr(e))
...
ExceptionGroup('@w{'}, (BlockingIOError(),))
@end example

@ref{180,,break}, @ref{181,,continue} and @ref{1b0,,return}
cannot appear in an @code{except*} clause.

@geindex keyword; else
@geindex statement; return
@geindex statement; break
@geindex statement; continue

@node else clause,finally clause,except* clause,The try statement
@anchor{reference/compound_stmts else-clause}@anchor{2583}@anchor{reference/compound_stmts except-else}@anchor{2584}
@subsubsection @code{else} clause


The optional @code{else} clause is executed if the control flow leaves the
@ref{8fa,,try} suite, no exception was raised, and no @ref{1b0,,return},
@ref{181,,continue}, or @ref{180,,break} statement was executed.  Exceptions in
the @code{else} clause are not handled by the preceding @ref{1ac,,except}
clauses.

@geindex keyword; finally

@node finally clause,,else clause,The try statement
@anchor{reference/compound_stmts finally}@anchor{1b1}@anchor{reference/compound_stmts finally-clause}@anchor{2585}
@subsubsection @code{finally} clause


If @code{finally} is present, it specifies a ‘cleanup’ handler.  The
@ref{8fa,,try} clause is executed, including any @ref{1ac,,except}
and @ref{2584,,else} clauses.
If an exception occurs in any of the clauses and is not handled,
the exception is temporarily saved.
The @code{finally} clause is executed.  If there is a saved exception
it is re-raised at the end of the @code{finally} clause.
If the @code{finally} clause raises another exception, the saved exception
is set as the context of the new exception.
If the @code{finally} clause executes a @ref{1b0,,return}, @ref{180,,break}
or @ref{181,,continue} statement, the saved exception is discarded. For example,
this function returns 42.

@example
def f():
    try:
        1/0
    finally:
        return 42
@end example

The exception information is not available to the program during execution of
the @code{finally} clause.

@geindex statement; return
@geindex statement; break
@geindex statement; continue

When a @ref{1b0,,return}, @ref{180,,break} or @ref{181,,continue} statement is
executed in the @ref{8fa,,try} suite of a @code{try}…@code{finally}
statement, the @code{finally} clause is also executed ‘on the way out.’

The return value of a function is determined by the last @ref{1b0,,return}
statement executed.  Since the @code{finally} clause always executes, a
@code{return} statement executed in the @code{finally} clause will
always be the last one executed. The following function returns ‘finally’.

@example
def foo():
    try:
        return 'try'
    finally:
        return 'finally'
@end example


Changed in version 3.8: Prior to Python 3.8, a @ref{181,,continue} statement was illegal in the
@code{finally} clause due to a problem with the implementation.



Changed in version 3.14: The compiler emits a @ref{1af,,SyntaxWarning} when a @ref{1b0,,return},
@ref{180,,break} or @ref{181,,continue} appears in a @code{finally}
block (see 
@geindex Python Enhancement Proposals; PEP 765
PEP 765@footnote{https://peps.python.org/pep-0765/}).

@anchor{reference/compound_stmts with}@anchor{187}
@node The with statement,The match statement,The try statement,Compound statements
@anchor{reference/compound_stmts as}@anchor{2586}@anchor{reference/compound_stmts the-with-statement}@anchor{2587}
@subsection The @code{with} statement


@geindex statement; with
@geindex keyword; as
@geindex as; with statement
@geindex @comma{} (comma); with statement
@geindex ; (colon); compound statement

The @ref{187,,with} statement is used to wrap the execution of a block with
methods defined by a context manager (see section @ref{23c5,,With Statement Context Managers}).
This allows common @ref{8fa,,try}…@ref{1ac,,except}…@ref{1b1,,finally}
usage patterns to be encapsulated for convenient reuse.

@example
@anchor{reference/compound_stmts grammar-token-python-grammar-with_stmt}@anchor{2570}with_stmt:          "with" ( "(" @ref{2588,,with_stmt_contents} ","? ")" | @ref{2588,,with_stmt_contents} ) ":" @ref{2577,,suite}
@anchor{reference/compound_stmts grammar-token-python-grammar-with_stmt_contents}@anchor{2588}with_stmt_contents: @ref{2589,,with_item} ("," @ref{2589,,with_item})*
@anchor{reference/compound_stmts grammar-token-python-grammar-with_item}@anchor{2589}with_item:          @ref{183,,expression} ["as" @ref{254c,,target}]
@end example

The execution of the @ref{187,,with} statement with one “item” proceeds as follows:


@enumerate 

@item 
The context expression (the expression given in the
@ref{2589,,with_item}) is evaluated to obtain a context manager.

@item 
The context manager’s @ref{7e5,,__enter__()} is loaded for later use.

@item 
The context manager’s @ref{150c,,__exit__()} is loaded for later use.

@item 
The context manager’s @ref{7e5,,__enter__()} method is invoked.

@item 
If a target was included in the @ref{187,,with} statement, the return value
from @ref{7e5,,__enter__()} is assigned to it.

@cartouche
@quotation Note 
The @ref{187,,with} statement guarantees that if the @ref{7e5,,__enter__()}
method returns without an error, then @ref{150c,,__exit__()} will always be
called. Thus, if an error occurs during the assignment to the target list,
it will be treated the same as an error occurring within the suite would
be. See step 7 below.
@end quotation
@end cartouche

@item 
The suite is executed.

@item 
The context manager’s @ref{150c,,__exit__()} method is invoked.  If an exception
caused the suite to be exited, its type, value, and traceback are passed as
arguments to @code{__exit__()}. Otherwise, three @ref{887,,None} arguments are
supplied.

If the suite was exited due to an exception, and the return value from the
@ref{150c,,__exit__()} method was false, the exception is reraised.  If the return
value was true, the exception is suppressed, and execution continues with the
statement following the @ref{187,,with} statement.

If the suite was exited for any reason other than an exception, the return
value from @ref{150c,,__exit__()} is ignored, and execution proceeds at the normal
location for the kind of exit that was taken.
@end enumerate

The following code:

@example
with EXPRESSION as TARGET:
    SUITE
@end example

is semantically equivalent to:

@example
manager = (EXPRESSION)
enter = manager.__enter__
exit = manager.__exit__
value = enter()
hit_except = False

try:
    TARGET = value
    SUITE
except:
    hit_except = True
    if not exit(*sys.exc_info()):
        raise
finally:
    if not hit_except:
        exit(None, None, None)
@end example

except that implicit @ref{23f8,,special method lookup} is used
for @ref{7e5,,__enter__()} and @ref{150c,,__exit__()}.

With more than one item, the context managers are processed as if multiple
@ref{187,,with} statements were nested:

@example
with A() as a, B() as b:
    SUITE
@end example

is semantically equivalent to:

@example
with A() as a:
    with B() as b:
        SUITE
@end example

You can also write multi-item context managers in multiple lines if
the items are surrounded by parentheses. For example:

@example
with (
    A() as a,
    B() as b,
):
    SUITE
@end example


Changed in version 3.1: Support for multiple context expressions.



Changed in version 3.10: Support for using grouping parentheses to break the statement in multiple lines.



@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 343

@item PEP 343@footnote{https://peps.python.org/pep-0343/} - The “with” statement

The specification, background, and examples for the Python @ref{187,,with}
statement.
@end table

@anchor{reference/compound_stmts match}@anchor{a14}
@node The match statement,Function definitions,The with statement,Compound statements
@anchor{reference/compound_stmts case}@anchor{258a}@anchor{reference/compound_stmts the-match-statement}@anchor{258b}
@subsection The @code{match} statement


@geindex statement; match
@geindex keyword; case
@geindex pattern matching
@geindex keyword; if
@geindex keyword; as
@geindex match; case
@geindex as; match statement
@geindex ; (colon); compound statement


Added in version 3.10.


The match statement is used for pattern matching.  Syntax:

@example
@anchor{reference/compound_stmts grammar-token-python-grammar-match_stmt}@anchor{2571}match_stmt:   'match' @ref{258c,,subject_expr} ":" NEWLINE INDENT @ref{258d,,case_block}+ DEDENT
@anchor{reference/compound_stmts grammar-token-python-grammar-subject_expr}@anchor{258c}subject_expr: @ref{252c,,flexible_expression} "," [@ref{24d5,,flexible_expression_list} [',']]
              | @ref{2475,,assignment_expression}
@anchor{reference/compound_stmts grammar-token-python-grammar-case_block}@anchor{258d}case_block:   'case' @ref{258e,,patterns} [@ref{258f,,guard}] ":" @ref{2577,,suite}
@end example

@cartouche
@quotation Note 
This section uses single quotes to denote
@ref{a13,,soft keywords}.
@end quotation
@end cartouche

Pattern matching takes a pattern as input (following @code{case}) and a subject
value (following @code{match}).  The pattern (which may contain subpatterns) is
matched against the subject value.  The outcomes are:


@itemize *

@item 
A match success or failure (also termed a pattern success or failure).

@item 
Possible binding of matched values to a name.  The prerequisites for this are
further discussed below.
@end itemize

The @code{match} and @code{case} keywords are @ref{a13,,soft keywords}.


@subsubheading See also



@itemize *

@item 
@geindex Python Enhancement Proposals; PEP 634
PEP 634@footnote{https://peps.python.org/pep-0634/} – Structural Pattern Matching: Specification

@item 
@geindex Python Enhancement Proposals; PEP 636
PEP 636@footnote{https://peps.python.org/pep-0636/} – Structural Pattern Matching: Tutorial
@end itemize


@menu
* Overview:: 
* Guards:: 
* Irrefutable Case Blocks:: 
* Patterns:: 

@end menu

@node Overview,Guards,,The match statement
@anchor{reference/compound_stmts overview}@anchor{2590}
@subsubsection Overview


Here’s an overview of the logical flow of a match statement:


@enumerate 

@item 
The subject expression @code{subject_expr} is evaluated and a resulting subject
value obtained. If the subject expression contains a comma, a tuple is
constructed using @ref{2591,,the standard rules}.

@item 
Each pattern in a @code{case_block} is attempted to match with the subject value. The
specific rules for success or failure are described below. The match attempt can also
bind some or all of the standalone names within the pattern. The precise
pattern binding rules vary per pattern type and are
specified below.  `Name bindings made during a successful pattern match
outlive the executed block and can be used after the match statement'.

@cartouche
@quotation Note 
During failed pattern matches, some subpatterns may succeed.  Do not
rely on bindings being made for a failed match.  Conversely, do not
rely on variables remaining unchanged after a failed match.  The exact
behavior is dependent on implementation and may vary.  This is an
intentional decision made to allow different implementations to add
optimizations.
@end quotation
@end cartouche

@item 
If the pattern succeeds, the corresponding guard (if present) is evaluated. In
this case all name bindings are guaranteed to have happened.


@itemize *

@item 
If the guard evaluates as true or is missing, the @code{block} inside
@code{case_block} is executed.

@item 
Otherwise, the next @code{case_block} is attempted as described above.

@item 
If there are no further case blocks, the match statement is completed.
@end itemize
@end enumerate

@cartouche
@quotation Note 
Users should generally never rely on a pattern being evaluated.  Depending on
implementation, the interpreter may cache values or use other optimizations
which skip repeated evaluations.
@end quotation
@end cartouche

A sample match statement:

@example
>>> flag = False
>>> match (100, 200):
...    case (100, 300):  # Mismatch: 200 != 300
...        print('Case 1')
...    case (100, 200) if flag:  # Successful match, but guard fails
...        print('Case 2')
...    case (100, y):  # Matches and binds y to 200
...        print(f'Case 3, y: @{y@}')
...    case _:  # Pattern not attempted
...        print('Case 4, I match anything!')
...
Case 3, y: 200
@end example

In this case, @code{if flag} is a guard.  Read more about that in the next section.

@node Guards,Irrefutable Case Blocks,Overview,The match statement
@anchor{reference/compound_stmts guards}@anchor{2592}
@subsubsection Guards


@geindex guard

@example
@anchor{reference/compound_stmts grammar-token-python-grammar-guard}@anchor{258f}guard: "if" @ref{2475,,assignment_expression}
@end example

A @code{guard} (which is part of the @code{case}) must succeed for code inside
the @code{case} block to execute.  It takes the form: @ref{182,,if} followed by an
expression.

The logical flow of a @code{case} block with a @code{guard} follows:


@enumerate 

@item 
Check that the pattern in the @code{case} block succeeded.  If the pattern
failed, the @code{guard} is not evaluated and the next @code{case} block is
checked.

@item 
If the pattern succeeded, evaluate the @code{guard}.


@itemize *

@item 
If the @code{guard} condition evaluates as true, the case block is
selected.

@item 
If the @code{guard} condition evaluates as false, the case block is not
selected.

@item 
If the @code{guard} raises an exception during evaluation, the exception
bubbles up.
@end itemize
@end enumerate

Guards are allowed to have side effects as they are expressions.  Guard
evaluation must proceed from the first to the last case block, one at a time,
skipping case blocks whose pattern(s) don’t all succeed. (I.e.,
guard evaluation must happen in order.) Guard evaluation must stop once a case
block is selected.

@node Irrefutable Case Blocks,Patterns,Guards,The match statement
@anchor{reference/compound_stmts irrefutable-case}@anchor{2593}@anchor{reference/compound_stmts irrefutable-case-blocks}@anchor{2594}
@subsubsection Irrefutable Case Blocks


@geindex irrefutable case block
@geindex case block

An irrefutable case block is a match-all case block.  A match statement may have
at most one irrefutable case block, and it must be last.

A case block is considered irrefutable if it has no guard and its pattern is
irrefutable.  A pattern is considered irrefutable if we can prove from its
syntax alone that it will always succeed.  Only the following patterns are
irrefutable:


@itemize *

@item 
@ref{2595,,AS Patterns} whose left-hand side is irrefutable

@item 
@ref{2596,,OR Patterns} containing at least one irrefutable pattern

@item 
@ref{2597,,Capture Patterns}

@item 
@ref{a15,,Wildcard Patterns}

@item 
parenthesized irrefutable patterns
@end itemize

@node Patterns,,Irrefutable Case Blocks,The match statement
@anchor{reference/compound_stmts patterns}@anchor{2598}
@subsubsection Patterns


@geindex ! patterns
@geindex AS pattern@comma{} OR pattern@comma{} capture pattern@comma{} wildcard pattern

@cartouche
@quotation Note 
This section uses grammar notations beyond standard EBNF:


@itemize *

@item 
the notation @code{SEP.RULE+} is shorthand for @code{RULE (SEP RULE)*}

@item 
the notation @code{!RULE} is shorthand for a negative lookahead assertion
@end itemize
@end quotation
@end cartouche

The top-level syntax for @code{patterns} is:

@example
@anchor{reference/compound_stmts grammar-token-python-grammar-patterns}@anchor{258e}patterns:       @ref{2599,,open_sequence_pattern} | @ref{259a,,pattern}
@anchor{reference/compound_stmts grammar-token-python-grammar-pattern}@anchor{259a}pattern:        @ref{259b,,as_pattern} | @ref{259c,,or_pattern}
@anchor{reference/compound_stmts grammar-token-python-grammar-closed_pattern}@anchor{259d}closed_pattern: | @ref{259e,,literal_pattern}
                | @ref{259f,,capture_pattern}
                | @ref{25a0,,wildcard_pattern}
                | @ref{25a1,,value_pattern}
                | @ref{25a2,,group_pattern}
                | @ref{25a3,,sequence_pattern}
                | @ref{25a4,,mapping_pattern}
                | @ref{25a5,,class_pattern}
@end example

The descriptions below will include a description “in simple terms” of what a pattern
does for illustration purposes (credits to Raymond Hettinger for a document that
inspired most of the descriptions). Note that these descriptions are purely for
illustration purposes and `may not' reflect
the underlying implementation.  Furthermore, they do not cover all valid forms.

@menu
* OR Patterns:: 
* AS Patterns:: 
* Literal Patterns:: 
* Capture Patterns:: 
* Wildcard Patterns:: 
* Value Patterns:: 
* Group Patterns:: 
* Sequence Patterns:: 
* Mapping Patterns:: 
* Class Patterns:: 

@end menu

@node OR Patterns,AS Patterns,,Patterns
@anchor{reference/compound_stmts id3}@anchor{25a6}@anchor{reference/compound_stmts or-patterns}@anchor{2596}
@subsubsection OR Patterns


An OR pattern is two or more patterns separated by vertical
bars @code{|}.  Syntax:

@example
@anchor{reference/compound_stmts grammar-token-python-grammar-or_pattern}@anchor{259c}or_pattern: "|".@ref{259d,,closed_pattern}+
@end example

Only the final subpattern may be @ref{2593,,irrefutable}, and each
subpattern must bind the same set of names to avoid ambiguity.

An OR pattern matches each of its subpatterns in turn to the subject value,
until one succeeds.  The OR pattern is then considered successful.  Otherwise,
if none of the subpatterns succeed, the OR pattern fails.

In simple terms, @code{P1 | P2 | ...} will try to match @code{P1}, if it fails it will try to
match @code{P2}, succeeding immediately if any succeeds, failing otherwise.

@node AS Patterns,Literal Patterns,OR Patterns,Patterns
@anchor{reference/compound_stmts as-patterns}@anchor{2595}@anchor{reference/compound_stmts id4}@anchor{25a7}
@subsubsection AS Patterns


An AS pattern matches an OR pattern on the left of the @ref{2586,,as}
keyword against a subject.  Syntax:

@example
@anchor{reference/compound_stmts grammar-token-python-grammar-as_pattern}@anchor{259b}as_pattern: @ref{259c,,or_pattern} "as" @ref{259f,,capture_pattern}
@end example

If the OR pattern fails, the AS pattern fails.  Otherwise, the AS pattern binds
the subject to the name on the right of the as keyword and succeeds.
@code{capture_pattern} cannot be a @code{_}.

In simple terms @code{P as NAME} will match with @code{P}, and on success it will
set @code{NAME = <subject>}.

@node Literal Patterns,Capture Patterns,AS Patterns,Patterns
@anchor{reference/compound_stmts id5}@anchor{25a8}@anchor{reference/compound_stmts literal-patterns}@anchor{25a9}
@subsubsection Literal Patterns


A literal pattern corresponds to most
@ref{230d,,literals} in Python.  Syntax:

@example
@anchor{reference/compound_stmts grammar-token-python-grammar-literal_pattern}@anchor{259e}literal_pattern: @ref{25aa,,signed_number}
                 | @ref{25aa,,signed_number} "+" NUMBER
                 | @ref{25aa,,signed_number} "-" NUMBER
                 | @ref{24c5,,strings}
                 | "None"
                 | "True"
                 | "False"
@anchor{reference/compound_stmts grammar-token-python-grammar-signed_number}@anchor{25aa}signed_number:   ["-"] NUMBER
@end example

The rule @code{strings} and the token @code{NUMBER} are defined in the
@ref{25ab,,standard Python grammar}.  Triple-quoted strings are
supported.  Raw strings and byte strings are supported.  @ref{19b,,f-strings}
and @ref{1844,,t-strings} are not supported.

The forms @code{signed_number '+' NUMBER} and @code{signed_number '-' NUMBER} are
for expressing @ref{235f,,complex numbers}; they require a real number
on the left and an imaginary number on the right. E.g. @code{3 + 4j}.

In simple terms, @code{LITERAL} will succeed only if @code{<subject> == LITERAL}. For
the singletons @code{None}, @code{True} and @code{False}, the @ref{34a,,is} operator is used.

@node Capture Patterns,Wildcard Patterns,Literal Patterns,Patterns
@anchor{reference/compound_stmts capture-patterns}@anchor{2597}@anchor{reference/compound_stmts id6}@anchor{25ac}
@subsubsection Capture Patterns


A capture pattern binds the subject value to a name.
Syntax:

@example
@anchor{reference/compound_stmts grammar-token-python-grammar-capture_pattern}@anchor{259f}capture_pattern: !'_' NAME
@end example

A single underscore @code{_} is not a capture pattern (this is what @code{!'_'}
expresses). It is instead treated as a
@ref{25a0,,wildcard_pattern}.

In a given pattern, a given name can only be bound once.  E.g.
@code{case x, x: ...} is invalid while @code{case [x] | x: ...} is allowed.

Capture patterns always succeed.  The binding follows scoping rules
established by the assignment expression operator in 
@geindex Python Enhancement Proposals; PEP 572
PEP 572@footnote{https://peps.python.org/pep-0572/}; the
name becomes a local variable in the closest containing function scope unless
there’s an applicable @ref{4ad,,global} or @ref{14b3,,nonlocal} statement.

In simple terms @code{NAME} will always succeed and it will set @code{NAME = <subject>}.

@node Wildcard Patterns,Value Patterns,Capture Patterns,Patterns
@anchor{reference/compound_stmts id7}@anchor{25ad}@anchor{reference/compound_stmts wildcard-patterns}@anchor{a15}
@subsubsection Wildcard Patterns


A wildcard pattern always succeeds (matches anything)
and binds no name.  Syntax:

@example
@anchor{reference/compound_stmts grammar-token-python-grammar-wildcard_pattern}@anchor{25a0}wildcard_pattern: '_'
@end example

@code{_} is a @ref{a13,,soft keyword} within any pattern,
but only within patterns.  It is an identifier, as usual, even within
@code{match} subject expressions, @code{guard}s, and @code{case} blocks.

In simple terms, @code{_} will always succeed.

@node Value Patterns,Group Patterns,Wildcard Patterns,Patterns
@anchor{reference/compound_stmts id8}@anchor{25ae}@anchor{reference/compound_stmts value-patterns}@anchor{25af}
@subsubsection Value Patterns


A value pattern represents a named value in Python.
Syntax:

@example
@anchor{reference/compound_stmts grammar-token-python-grammar-value_pattern}@anchor{25a1}value_pattern: @ref{25b0,,attr}
@anchor{reference/compound_stmts grammar-token-python-grammar-attr}@anchor{25b0}attr:          @ref{25b1,,name_or_attr} "." NAME
@anchor{reference/compound_stmts grammar-token-python-grammar-name_or_attr}@anchor{25b1}name_or_attr:  @ref{25b0,,attr} | NAME
@end example

The dotted name in the pattern is looked up using standard Python
@ref{2472,,name resolution rules}.  The pattern succeeds if the
value found compares equal to the subject value (using the @code{==} equality
operator).

In simple terms @code{NAME1.NAME2} will succeed only if @code{<subject> == NAME1.NAME2}

@cartouche
@quotation Note 
If the same value occurs multiple times in the same match statement, the
interpreter may cache the first value found and reuse it rather than repeat
the same lookup.  This cache is strictly tied to a given execution of a
given match statement.
@end quotation
@end cartouche

@node Group Patterns,Sequence Patterns,Value Patterns,Patterns
@anchor{reference/compound_stmts group-patterns}@anchor{25b2}@anchor{reference/compound_stmts id9}@anchor{25b3}
@subsubsection Group Patterns


A group pattern allows users to add parentheses around patterns to
emphasize the intended grouping.  Otherwise, it has no additional syntax.
Syntax:

@example
@anchor{reference/compound_stmts grammar-token-python-grammar-group_pattern}@anchor{25a2}group_pattern: "(" @ref{259a,,pattern} ")"
@end example

In simple terms @code{(P)} has the same effect as @code{P}.

@node Sequence Patterns,Mapping Patterns,Group Patterns,Patterns
@anchor{reference/compound_stmts id10}@anchor{25b4}@anchor{reference/compound_stmts sequence-patterns}@anchor{25b5}
@subsubsection Sequence Patterns


A sequence pattern contains several subpatterns to be matched against sequence elements.
The syntax is similar to the unpacking of a list or tuple.

@example
@anchor{reference/compound_stmts grammar-token-python-grammar-sequence_pattern}@anchor{25a3}sequence_pattern:       "[" [@ref{25b6,,maybe_sequence_pattern}] "]"
                        | "(" [@ref{2599,,open_sequence_pattern}] ")"
@anchor{reference/compound_stmts grammar-token-python-grammar-open_sequence_pattern}@anchor{2599}open_sequence_pattern:  @ref{25b7,,maybe_star_pattern} "," [@ref{25b6,,maybe_sequence_pattern}]
@anchor{reference/compound_stmts grammar-token-python-grammar-maybe_sequence_pattern}@anchor{25b6}maybe_sequence_pattern: ",".@ref{25b7,,maybe_star_pattern}+ ","?
@anchor{reference/compound_stmts grammar-token-python-grammar-maybe_star_pattern}@anchor{25b7}maybe_star_pattern:     @ref{25b8,,star_pattern} | @ref{259a,,pattern}
@anchor{reference/compound_stmts grammar-token-python-grammar-star_pattern}@anchor{25b8}star_pattern:           "*" (@ref{259f,,capture_pattern} | @ref{25a0,,wildcard_pattern})
@end example

There is no difference if parentheses  or square brackets
are used for sequence patterns (i.e. @code{(...)} vs @code{[...]} ).

@cartouche
@quotation Note 
A single pattern enclosed in parentheses without a trailing comma
(e.g. @code{(3 | 4)}) is a @ref{25b2,,group pattern}.
While a single pattern enclosed in square brackets (e.g. @code{[3 | 4]}) is
still a sequence pattern.
@end quotation
@end cartouche

At most one star subpattern may be in a sequence pattern.  The star subpattern
may occur in any position. If no star subpattern is present, the sequence
pattern is a fixed-length sequence pattern; otherwise it is a variable-length
sequence pattern.

The following is the logical flow for matching a sequence pattern against a
subject value:


@enumerate 

@item 
If the subject value is not a sequence @footnote{
In pattern matching, a sequence is defined as one of the following:


@itemize *

@item 
a class that inherits from @ref{13d0,,collections.abc.Sequence}

@item 
a Python class that has been registered as @ref{13d0,,collections.abc.Sequence}

@item 
a builtin class that has its (CPython) @ref{1c9c,,Py_TPFLAGS_SEQUENCE} bit set

@item 
a class that inherits from any of the above
@end itemize

The following standard library classes are sequences:


@itemize *

@item 
@ref{4bf,,array.array}

@item 
@ref{7f5,,collections.deque}

@item 
@ref{24f,,list}

@item 
@ref{166,,memoryview}

@item 
@ref{b43,,range}

@item 
@ref{614,,tuple}
@end itemize

@cartouche
@quotation Note 
Subject values of type @code{str}, @code{bytes}, and @code{bytearray}
do not match sequence patterns.
@end quotation
@end cartouche
}, the sequence pattern
fails.

@item 
If the subject value is an instance of @code{str}, @code{bytes} or @code{bytearray}
the sequence pattern fails.

@item 
The subsequent steps depend on whether the sequence pattern is fixed or
variable-length.

If the sequence pattern is fixed-length:


@enumerate 

@item 
If the length of the subject sequence is not equal to the number of
subpatterns, the sequence pattern fails

@item 
Subpatterns in the sequence pattern are matched to their corresponding
items in the subject sequence from left to right.  Matching stops as soon
as a subpattern fails.  If all subpatterns succeed in matching their
corresponding item, the sequence pattern succeeds.
@end enumerate

Otherwise, if the sequence pattern is variable-length:


@enumerate 

@item 
If the length of the subject sequence is less than the number of non-star
subpatterns, the sequence pattern fails.

@item 
The leading non-star subpatterns are matched to their corresponding items
as for fixed-length sequences.

@item 
If the previous step succeeds, the star subpattern matches a list formed
of the remaining subject items, excluding the remaining items
corresponding to non-star subpatterns following the star subpattern.

@item 
Remaining non-star subpatterns are matched to their corresponding subject
items, as for a fixed-length sequence.
@end enumerate

@cartouche
@quotation Note 
The length of the subject sequence is obtained via
@ref{841,,len()} (i.e. via the @ref{17e1,,__len__()} protocol).
This length may be cached by the interpreter in a similar manner as
@ref{25af,,value patterns}.
@end quotation
@end cartouche
@end enumerate

In simple terms @code{[P1, P2, P3,} … @code{, P<N>]} matches only if all the following
happens:


@itemize *

@item 
check @code{<subject>} is a sequence

@item 
@code{len(subject) == <N>}

@item 
@code{P1} matches @code{<subject>[0]} (note that this match can also bind names)

@item 
@code{P2} matches @code{<subject>[1]} (note that this match can also bind names)

@item 
… and so on for the corresponding pattern/element.
@end itemize

@node Mapping Patterns,Class Patterns,Sequence Patterns,Patterns
@anchor{reference/compound_stmts id12}@anchor{25b9}@anchor{reference/compound_stmts mapping-patterns}@anchor{25ba}
@subsubsection Mapping Patterns


A mapping pattern contains one or more key-value patterns.  The syntax is
similar to the construction of a dictionary.
Syntax:

@example
@anchor{reference/compound_stmts grammar-token-python-grammar-mapping_pattern}@anchor{25a4}mapping_pattern:     "@{" [@ref{25bb,,items_pattern}] "@}"
@anchor{reference/compound_stmts grammar-token-python-grammar-items_pattern}@anchor{25bb}items_pattern:       ",".@ref{25bc,,key_value_pattern}+ ","?
@anchor{reference/compound_stmts grammar-token-python-grammar-key_value_pattern}@anchor{25bc}key_value_pattern:   (@ref{259e,,literal_pattern} | @ref{25a1,,value_pattern}) ":" @ref{259a,,pattern}
                     | @ref{25bd,,double_star_pattern}
@anchor{reference/compound_stmts grammar-token-python-grammar-double_star_pattern}@anchor{25bd}double_star_pattern: "**" @ref{259f,,capture_pattern}
@end example

At most one double star pattern may be in a mapping pattern.  The double star
pattern must be the last subpattern in the mapping pattern.

Duplicate keys in mapping patterns are disallowed. Duplicate literal keys will
raise a @ref{18f,,SyntaxError}. Two keys that otherwise have the same value will
raise a @ref{2ee,,ValueError} at runtime.

The following is the logical flow for matching a mapping pattern against a
subject value:


@enumerate 

@item 
If the subject value is not a mapping @footnote{
In pattern matching, a mapping is defined as one of the following:


@itemize *

@item 
a class that inherits from @ref{acd,,collections.abc.Mapping}

@item 
a Python class that has been registered as @ref{acd,,collections.abc.Mapping}

@item 
a builtin class that has its (CPython) @ref{1c9b,,Py_TPFLAGS_MAPPING} bit set

@item 
a class that inherits from any of the above
@end itemize

The standard library classes @ref{184,,dict} and @ref{699,,types.MappingProxyType}
are mappings.
},the mapping pattern fails.

@item 
If every key given in the mapping pattern is present in the subject mapping,
and the pattern for each key matches the corresponding item of the subject
mapping, the mapping pattern succeeds.

@item 
If duplicate keys are detected in the mapping pattern, the pattern is
considered invalid. A @ref{18f,,SyntaxError} is raised for duplicate literal
values; or a @ref{2ee,,ValueError} for named keys of the same value.
@end enumerate

@cartouche
@quotation Note 
Key-value pairs are matched using the two-argument form of the mapping
subject’s @code{get()} method.  Matched key-value pairs must already be present
in the mapping, and not created on-the-fly via @ref{13c9,,__missing__()}
or @ref{588,,__getitem__()}.
@end quotation
@end cartouche

In simple terms @code{@{KEY1: P1, KEY2: P2, ... @}} matches only if all the following
happens:


@itemize *

@item 
check @code{<subject>} is a mapping

@item 
@code{KEY1 in <subject>}

@item 
@code{P1} matches @code{<subject>[KEY1]}

@item 
… and so on for the corresponding KEY/pattern pair.
@end itemize

@node Class Patterns,,Mapping Patterns,Patterns
@anchor{reference/compound_stmts class-patterns}@anchor{25be}@anchor{reference/compound_stmts id14}@anchor{25bf}
@subsubsection Class Patterns


A class pattern represents a class and its positional and keyword arguments
(if any).  Syntax:

@example
@anchor{reference/compound_stmts grammar-token-python-grammar-class_pattern}@anchor{25a5}class_pattern:       @ref{25b1,,name_or_attr} "(" [@ref{25c0,,pattern_arguments} ","?] ")"
@anchor{reference/compound_stmts grammar-token-python-grammar-pattern_arguments}@anchor{25c0}pattern_arguments:   @ref{25c1,,positional_patterns} ["," @ref{25c2,,keyword_patterns}]
                     | @ref{25c2,,keyword_patterns}
@anchor{reference/compound_stmts grammar-token-python-grammar-positional_patterns}@anchor{25c1}positional_patterns: ",".@ref{259a,,pattern}+
@anchor{reference/compound_stmts grammar-token-python-grammar-keyword_patterns}@anchor{25c2}keyword_patterns:    ",".@ref{25c3,,keyword_pattern}+
@anchor{reference/compound_stmts grammar-token-python-grammar-keyword_pattern}@anchor{25c3}keyword_pattern:     NAME "=" @ref{259a,,pattern}
@end example

The same keyword should not be repeated in class patterns.

The following is the logical flow for matching a class pattern against a
subject value:


@enumerate 

@item 
If @code{name_or_attr} is not an instance of the builtin @ref{f4a,,type} , raise
@ref{199,,TypeError}.

@item 
If the subject value is not an instance of @code{name_or_attr} (tested via
@ref{2af,,isinstance()}), the class pattern fails.

@item 
If no pattern arguments are present, the pattern succeeds.  Otherwise,
the subsequent steps depend on whether keyword or positional argument patterns
are present.

For a number of built-in types (specified below), a single positional
subpattern is accepted which will match the entire subject; for these types
keyword patterns also work as for other types.

If only keyword patterns are present, they are processed as follows,
one by one:


@enumerate 

@item 
The keyword is looked up as an attribute on the subject.


@itemize *

@item 
If this raises an exception other than @ref{5f0,,AttributeError}, the
exception bubbles up.

@item 
If this raises @ref{5f0,,AttributeError}, the class pattern has failed.

@item 
Else, the subpattern associated with the keyword pattern is matched
against the subject’s attribute value.  If this fails, the class
pattern fails; if this succeeds, the match proceeds to the next keyword.
@end itemize

@item 
If all keyword patterns succeed, the class pattern succeeds.
@end enumerate

If any positional patterns are present, they are converted to keyword
patterns using the @ref{1cb8,,__match_args__} attribute on the class
@code{name_or_attr} before matching:


@enumerate 

@item 
The equivalent of @code{getattr(cls, "__match_args__", ())} is called.


@itemize *

@item 
If this raises an exception, the exception bubbles up.

@item 
If the returned value is not a tuple, the conversion fails and
@ref{199,,TypeError} is raised.

@item 
If there are more positional patterns than @code{len(cls.__match_args__)},
@ref{199,,TypeError} is raised.

@item 
Otherwise, positional pattern @code{i} is converted to a keyword pattern
using @code{__match_args__[i]} as the keyword.  @code{__match_args__[i]} must
be a string; if not @ref{199,,TypeError} is raised.

@item 
If there are duplicate keywords, @ref{199,,TypeError} is raised.
@end itemize


@subsubheading See also


@ref{2454,,Customizing positional arguments in class pattern matching}


@item 
Once all positional patterns have been converted to keyword patterns,
the match proceeds as if there were only keyword patterns.
@end enumerate

For the following built-in types the handling of positional subpatterns is
different:


@itemize *

@item 
@ref{3c1,,bool}

@item 
@ref{342,,bytearray}

@item 
@ref{193,,bytes}

@item 
@ref{184,,dict}

@item 
@ref{197,,float}

@item 
@ref{7f3,,frozenset}

@item 
@ref{19c,,int}

@item 
@ref{24f,,list}

@item 
@ref{185,,set}

@item 
@ref{16a,,str}

@item 
@ref{614,,tuple}
@end itemize

These classes accept a single positional argument, and the pattern there is matched
against the whole object rather than an attribute. For example @code{int(0|1)} matches
the value @code{0}, but not the value @code{0.0}.
@end enumerate

In simple terms @code{CLS(P1, attr=P2)} matches only if the following happens:


@itemize *

@item 
@code{isinstance(<subject>, CLS)}

@item 
convert @code{P1} to a keyword pattern using @code{CLS.__match_args__}

@item 
For each keyword argument @code{attr=P2}:


@itemize *

@item 
@code{hasattr(<subject>, "attr")}

@item 
@code{P2} matches @code{<subject>.attr}
@end itemize

@item 
… and so on for the corresponding keyword argument/pattern pair.
@end itemize


@subsubheading See also



@itemize *

@item 
@geindex Python Enhancement Proposals; PEP 634
PEP 634@footnote{https://peps.python.org/pep-0634/} – Structural Pattern Matching: Specification

@item 
@geindex Python Enhancement Proposals; PEP 636
PEP 636@footnote{https://peps.python.org/pep-0636/} – Structural Pattern Matching: Tutorial
@end itemize


@geindex parameter; function definition
@anchor{reference/compound_stmts function}@anchor{205c}
@node Function definitions,Class definitions,The match statement,Compound statements
@anchor{reference/compound_stmts def}@anchor{1666}@anchor{reference/compound_stmts function-definitions}@anchor{25c4}
@subsection Function definitions


@geindex statement; def
@geindex function; definition
@geindex function; name
@geindex name; binding
@geindex object; user-defined function
@geindex object; function
@geindex function; name
@geindex name; binding
@geindex () (parentheses); function definition
@geindex @comma{} (comma); parameter list
@geindex ; (colon); compound statement

A function definition defines a user-defined function object (see section
@ref{2373,,The standard type hierarchy}):

@example
@anchor{reference/compound_stmts grammar-token-python-grammar-funcdef}@anchor{2572}funcdef:                   [@ref{25c5,,decorators}] "def" @ref{25c6,,funcname} [@ref{2566,,type_params}] "(" [@ref{252a,,parameter_list}] ")"
                           ["->" @ref{183,,expression}] ":" @ref{2577,,suite}
@anchor{reference/compound_stmts grammar-token-python-grammar-decorators}@anchor{25c5}decorators:                @ref{25c7,,decorator}+
@anchor{reference/compound_stmts grammar-token-python-grammar-decorator}@anchor{25c7}decorator:                 "@@" @ref{2475,,assignment_expression} NEWLINE
@anchor{reference/compound_stmts grammar-token-python-grammar-parameter_list}@anchor{252a}parameter_list:            @ref{25c8,,defparameter} ("," @ref{25c8,,defparameter})* "," "/" ["," [@ref{25c9,,parameter_list_no_posonly}]]
                             | @ref{25c9,,parameter_list_no_posonly}
@anchor{reference/compound_stmts grammar-token-python-grammar-parameter_list_no_posonly}@anchor{25c9}parameter_list_no_posonly: @ref{25c8,,defparameter} ("," @ref{25c8,,defparameter})* ["," [@ref{25ca,,parameter_list_starargs}]]
                           | @ref{25ca,,parameter_list_starargs}
@anchor{reference/compound_stmts grammar-token-python-grammar-parameter_list_starargs}@anchor{25ca}parameter_list_starargs:   "*" [@ref{25cb,,star_parameter}] ("," @ref{25c8,,defparameter})* ["," [@ref{25cc,,parameter_star_kwargs}]]
                           | "*" ("," @ref{25c8,,defparameter})+ ["," [@ref{25cc,,parameter_star_kwargs}]]
                           | @ref{25cc,,parameter_star_kwargs}
@anchor{reference/compound_stmts grammar-token-python-grammar-parameter_star_kwargs}@anchor{25cc}parameter_star_kwargs:     "**" @ref{25cd,,parameter} [","]
@anchor{reference/compound_stmts grammar-token-python-grammar-parameter}@anchor{25cd}parameter:                 @ref{2305,,identifier} [":" @ref{183,,expression}]
@anchor{reference/compound_stmts grammar-token-python-grammar-star_parameter}@anchor{25cb}star_parameter:            @ref{2305,,identifier} [":" ["*"] @ref{183,,expression}]
@anchor{reference/compound_stmts grammar-token-python-grammar-defparameter}@anchor{25c8}defparameter:              @ref{25cd,,parameter} ["=" @ref{183,,expression}]
@anchor{reference/compound_stmts grammar-token-python-grammar-funcname}@anchor{25c6}funcname:                  @ref{2305,,identifier}
@end example

A function definition is an executable statement.  Its execution binds the
function name in the current local namespace to a function object (a wrapper
around the executable code for the function).  This function object contains a
reference to the current global namespace as the global namespace to be used
when the function is called.

The function definition does not execute the function body; this gets executed
only when the function is called. @footnote{
A string literal appearing as the first statement in the function body is
transformed into the function’s @ref{13e5,,__doc__} attribute and
therefore the function’s @ref{2330,,docstring}.
}

@geindex @@ (at); function definition

A function definition may be wrapped by one or more @ref{93f,,decorator} expressions.
Decorator expressions are evaluated when the function is defined, in the scope
that contains the function definition.  The result must be a callable, which is
invoked with the function object as the only argument. The returned value is
bound to the function name instead of the function object.  Multiple decorators
are applied in nested fashion. For example, the following code

@example
@@f1(arg)
@@f2
def func(): pass
@end example

is roughly equivalent to

@example
def func(): pass
func = f1(arg)(f2(func))
@end example

except that the original function is not temporarily bound to the name @code{func}.


Changed in version 3.9: Functions may be decorated with any valid
@ref{2475,,assignment_expression}. Previously, the grammar was
much more restrictive; see 
@geindex Python Enhancement Proposals; PEP 614
PEP 614@footnote{https://peps.python.org/pep-0614/} for details.


A list of @ref{5ad,,type parameters} may be given in square brackets
between the function’s name and the opening parenthesis for its parameter list.
This indicates to static type checkers that the function is generic. At runtime,
the type parameters can be retrieved from the function’s
@ref{2391,,__type_params__}
attribute. See @ref{683,,Generic functions} for more.


Changed in version 3.12: Type parameter lists are new in Python 3.12.


@geindex default; parameter; value
@geindex argument; function definition
@geindex = (equals); function definition

When one or more @ref{238f,,parameters} have the form `parameter' @code{=}
`expression', the function is said to have “default parameter values.”  For a
parameter with a default value, the corresponding @ref{67b,,argument} may be
omitted from a call, in which
case the parameter’s default value is substituted.  If a parameter has a default
value, all following parameters up until the “@code{*}” must also have a default
value — this is a syntactic restriction that is not expressed by the grammar.

`Default parameter values are evaluated from left to right when the function
definition is executed.' This means that the expression is evaluated once, when
the function is defined, and that the same “pre-computed” value is used for each
call.  This is especially important to understand when a default parameter value is a
mutable object, such as a list or a dictionary: if the function modifies the
object (e.g. by appending an item to a list), the default parameter value is in effect
modified.  This is generally not what was intended.  A way around this is to use
@code{None} as the default, and explicitly test for it in the body of the function,
e.g.:

@example
def whats_on_the_telly(penguin=None):
    if penguin is None:
        penguin = []
    penguin.append("property of the zoo")
    return penguin
@end example

@geindex / (slash); function definition
@geindex * (asterisk); function definition
@geindex **; function definition

Function call semantics are described in more detail in section @ref{f83,,Calls}. A
function call always assigns values to all parameters mentioned in the parameter
list, either from positional arguments, from keyword arguments, or from default
values.  If the form “@code{*identifier}” is present, it is initialized to a tuple
receiving any excess positional parameters, defaulting to the empty tuple.
If the form “@code{**identifier}” is present, it is initialized to a new
ordered mapping receiving any excess keyword arguments, defaulting to a
new empty mapping of the same type.  Parameters after “@code{*}” or
“@code{*identifier}” are keyword-only parameters and may only be passed
by keyword arguments.  Parameters before “@code{/}” are positional-only parameters
and may only be passed by positional arguments.


Changed in version 3.8: The @code{/} function parameter syntax may be used to indicate positional-only
parameters. See 
@geindex Python Enhancement Proposals; PEP 570
PEP 570@footnote{https://peps.python.org/pep-0570/} for details.


@geindex function; annotations
@geindex ->; function annotations
@geindex ; (colon); function annotations

Parameters may have an @ref{205d,,annotation} of the form “@code{: expression}”
following the parameter name.  Any parameter may have an annotation, even those of the form
@code{*identifier} or @code{**identifier}. (As a special case, parameters of the form
@code{*identifier} may have an annotation “@code{: *expression}”.) Functions may have “return” annotation of
the form “@code{-> expression}” after the parameter list.  These annotations can be
any valid Python expression.  The presence of annotations does not change the
semantics of a function. See @ref{25ce,,Annotations} for more information on annotations.


Changed in version 3.11: Parameters of the form “@code{*identifier}” may have an annotation
“@code{: *expression}”. See 
@geindex Python Enhancement Proposals; PEP 646
PEP 646@footnote{https://peps.python.org/pep-0646/}.


@geindex lambda; expression

It is also possible to create anonymous functions (functions not bound to a
name), for immediate use in expressions.  This uses lambda expressions, described in
section @ref{14a9,,Lambdas}.  Note that the lambda expression is merely a shorthand for a
simplified function definition; a function defined in a “@ref{1666,,def}”
statement can be passed around or assigned to another name just like a function
defined by a lambda expression.  The “@code{def}” form is actually more powerful
since it allows the execution of multiple statements and annotations.

`Programmer’s note:' Functions are first-class objects.  A “@code{def}” statement
executed inside a function definition defines a local function that can be
returned or passed around.  Free variables used in the nested function can
access the local variables of the function containing the def.  See section
@ref{238a,,Naming and binding} for details.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 3107

@item PEP 3107@footnote{https://peps.python.org/pep-3107/} - Function Annotations

The original specification for function annotations.

@geindex Python Enhancement Proposals; PEP 484

@item PEP 484@footnote{https://peps.python.org/pep-0484/} - Type Hints

Definition of a standard meaning for annotations: type hints.

@geindex Python Enhancement Proposals; PEP 526

@item PEP 526@footnote{https://peps.python.org/pep-0526/} - Syntax for Variable Annotations

Ability to type hint variable declarations, including class
variables and instance variables.

@geindex Python Enhancement Proposals; PEP 563

@item PEP 563@footnote{https://peps.python.org/pep-0563/} - Postponed Evaluation of Annotations

Support for forward references within annotations by preserving
annotations in a string form at runtime instead of eager evaluation.

@geindex Python Enhancement Proposals; PEP 318

@item PEP 318@footnote{https://peps.python.org/pep-0318/} - Decorators for Functions and Methods

Function and method decorators were introduced.
Class decorators were introduced in 
@geindex Python Enhancement Proposals; PEP 3129
PEP 3129@footnote{https://peps.python.org/pep-3129/}.
@end table


@node Class definitions,Coroutines<2>,Function definitions,Compound statements
@anchor{reference/compound_stmts class}@anchor{14e3}@anchor{reference/compound_stmts class-definitions}@anchor{25cf}
@subsection Class definitions


@geindex object; class
@geindex statement; class
@geindex class; definition
@geindex class; name
@geindex name; binding
@geindex execution; frame
@geindex inheritance
@geindex docstring
@geindex () (parentheses); class definition
@geindex @comma{} (comma); expression list
@geindex ; (colon); compound statement

A class definition defines a class object (see section @ref{2373,,The standard type hierarchy}):

@example
@anchor{reference/compound_stmts grammar-token-python-grammar-classdef}@anchor{2573}classdef:    [@ref{25c5,,decorators}] "class" @ref{25d0,,classname} [@ref{2566,,type_params}] [@ref{25d1,,inheritance}] ":" @ref{2577,,suite}
@anchor{reference/compound_stmts grammar-token-python-grammar-inheritance}@anchor{25d1}inheritance: "(" [@ref{24ff,,argument_list}] ")"
@anchor{reference/compound_stmts grammar-token-python-grammar-classname}@anchor{25d0}classname:   @ref{2305,,identifier}
@end example

A class definition is an executable statement.  The inheritance list usually
gives a list of base classes (see @ref{2405,,Metaclasses} for more advanced uses), so
each item in the list should evaluate to a class object which allows
subclassing.  Classes without an inheritance list inherit, by default, from the
base class @ref{c84,,object}; hence,

@example
class Foo:
    pass
@end example

is equivalent to

@example
class Foo(object):
    pass
@end example

The class’s suite is then executed in a new execution frame (see @ref{238a,,Naming and binding}),
using a newly created local namespace and the original global namespace.
(Usually, the suite contains mostly function definitions.)  When the class’s
suite finishes execution, its execution frame is discarded but its local
namespace is saved. @footnote{
A string literal appearing as the first statement in the class body is
transformed into the namespace’s @ref{20d9,,__doc__} item and therefore
the class’s @ref{2330,,docstring}.
} A class object is then created using the inheritance
list for the base classes and the saved local namespace for the attribute
dictionary.  The class name is bound to this class object in the original local
namespace.

The order in which attributes are defined in the class body is preserved
in the new class’s @ref{e5d,,__dict__}.  Note that this is reliable only right
after the class is created and only for classes that were defined using
the definition syntax.

Class creation can be customized heavily using @ref{2405,,metaclasses}.

@geindex @@ (at); class definition

Classes can also be decorated: just like when decorating functions,

@example
@@f1(arg)
@@f2
class Foo: pass
@end example

is roughly equivalent to

@example
class Foo: pass
Foo = f1(arg)(f2(Foo))
@end example

The evaluation rules for the decorator expressions are the same as for function
decorators.  The result is then bound to the class name.


Changed in version 3.9: Classes may be decorated with any valid
@ref{2475,,assignment_expression}. Previously, the grammar was
much more restrictive; see 
@geindex Python Enhancement Proposals; PEP 614
PEP 614@footnote{https://peps.python.org/pep-0614/} for details.


A list of @ref{5ad,,type parameters} may be given in square brackets
immediately after the class’s name.
This indicates to static type checkers that the class is generic. At runtime,
the type parameters can be retrieved from the class’s
@ref{23ba,,__type_params__} attribute. See @ref{682,,Generic classes} for more.


Changed in version 3.12: Type parameter lists are new in Python 3.12.


`Programmer’s note:' Variables defined in the class definition are class
attributes; they are shared by instances.  Instance attributes can be set in a
method with @code{self.name = value}.  Both class and instance attributes are
accessible through the notation “@code{self.name}”, and an instance attribute hides
a class attribute with the same name when accessed in this way.  Class
attributes can be used as defaults for instance attributes, but using mutable
values there can lead to unexpected results.  @ref{e4f,,Descriptors}
can be used to create instance variables with different implementation details.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 3115

@item PEP 3115@footnote{https://peps.python.org/pep-3115/} - Metaclasses in Python 3000

The proposal that changed the declaration of metaclasses to the current
syntax, and the semantics for how classes with metaclasses are
constructed.

@geindex Python Enhancement Proposals; PEP 3129

@item PEP 3129@footnote{https://peps.python.org/pep-3129/} - Class Decorators

The proposal that added class decorators.  Function and method decorators
were introduced in 
@geindex Python Enhancement Proposals; PEP 318
PEP 318@footnote{https://peps.python.org/pep-0318/}.
@end table


@node Coroutines<2>,Type parameter lists,Class definitions,Compound statements
@anchor{reference/compound_stmts async}@anchor{940}@anchor{reference/compound_stmts coroutines}@anchor{25d2}
@subsection Coroutines



Added in version 3.5.


@geindex statement; async def

@menu
* Coroutine function definition:: 
* The async for statement:: 
* The async with statement:: 

@end menu

@node Coroutine function definition,The async for statement,,Coroutines<2>
@anchor{reference/compound_stmts async-def}@anchor{7ee}@anchor{reference/compound_stmts coroutine-function-definition}@anchor{25d3}
@subsubsection Coroutine function definition


@example
@anchor{reference/compound_stmts grammar-token-python-grammar-async_funcdef}@anchor{2576}async_funcdef: [@ref{25c5,,decorators}] "async" "def" @ref{25c6,,funcname} "(" [@ref{252a,,parameter_list}] ")"
               ["->" @ref{183,,expression}] ":" @ref{2577,,suite}
@end example

@geindex keyword; async
@geindex keyword; await

Execution of Python coroutines can be suspended and resumed at many points
(see @ref{6ba,,coroutine}). @ref{18e,,await} expressions, @ref{ca7,,async for} and
@ref{186,,async with} can only be used in the body of a coroutine function.

Functions defined with @code{async def} syntax are always coroutine functions,
even if they do not contain @code{await} or @code{async} keywords.

It is a @ref{18f,,SyntaxError} to use a @code{yield from} expression inside the body
of a coroutine function.

An example of a coroutine function:

@example
async def func(param1, param2):
    do_stuff()
    await some_coroutine()
@end example


Changed in version 3.7: @code{await} and @code{async} are now keywords; previously they were only
treated as such inside the body of a coroutine function.


@geindex statement; async for

@node The async for statement,The async with statement,Coroutine function definition,Coroutines<2>
@anchor{reference/compound_stmts async-for}@anchor{ca7}@anchor{reference/compound_stmts the-async-for-statement}@anchor{25d4}
@subsubsection The @code{async for} statement


@example
@anchor{reference/compound_stmts grammar-token-python-grammar-async_for_stmt}@anchor{2575}async_for_stmt: "async" @ref{256e,,for_stmt}
@end example

An @ref{f7a,,asynchronous iterable} provides an @code{__aiter__} method that directly
returns an @ref{4c8,,asynchronous iterator}, which can call asynchronous code in
its @code{__anext__} method.

The @code{async for} statement allows convenient iteration over asynchronous
iterables.

The following code:

@example
async for TARGET in ITER:
    SUITE
else:
    SUITE2
@end example

Is semantically equivalent to:

@example
iter = (ITER).__aiter__()
running = True

while running:
    try:
        TARGET = await iter.__anext__()
    except StopAsyncIteration:
        running = False
    else:
        SUITE
else:
    SUITE2
@end example

except that implicit @ref{23f8,,special method lookup} is used
for @ref{dfc,,__aiter__()} and @ref{18ca,,__anext__()}.

It is a @ref{18f,,SyntaxError} to use an @code{async for} statement outside the
body of a coroutine function.

@geindex statement; async with

@node The async with statement,,The async for statement,Coroutines<2>
@anchor{reference/compound_stmts async-with}@anchor{186}@anchor{reference/compound_stmts the-async-with-statement}@anchor{25d5}
@subsubsection The @code{async with} statement


@example
@anchor{reference/compound_stmts grammar-token-python-grammar-async_with_stmt}@anchor{2574}async_with_stmt: "async" @ref{2570,,with_stmt}
@end example

An @ref{7f1,,asynchronous context manager} is a @ref{1e3,,context manager} that is
able to suspend execution in its `enter' and `exit' methods.

The following code:

@example
async with EXPRESSION as TARGET:
    SUITE
@end example

is semantically equivalent to:

@example
manager = (EXPRESSION)
aenter = manager.__aenter__
aexit = manager.__aexit__
value = await aenter()
hit_except = False

try:
    TARGET = value
    SUITE
except:
    hit_except = True
    if not await aexit(*sys.exc_info()):
        raise
finally:
    if not hit_except:
        await aexit(None, None, None)
@end example

except that implicit @ref{23f8,,special method lookup} is used
for @ref{2465,,__aenter__()} and @ref{19e4,,__aexit__()}.

It is a @ref{18f,,SyntaxError} to use an @code{async with} statement outside the
body of a coroutine function.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 492

@item PEP 492@footnote{https://peps.python.org/pep-0492/} - Coroutines with async and await syntax

The proposal that made coroutines a proper standalone concept in Python,
and added supporting syntax.
@end table


@node Type parameter lists,Annotations<2>,Coroutines<2>,Compound statements
@anchor{reference/compound_stmts type-parameter-lists}@anchor{25d6}@anchor{reference/compound_stmts type-params}@anchor{5ad}
@subsection Type parameter lists



Added in version 3.12.



Changed in version 3.13: Support for default values was added (see 
@geindex Python Enhancement Proposals; PEP 696
PEP 696@footnote{https://peps.python.org/pep-0696/}).


@geindex type parameters

@example
@anchor{reference/compound_stmts grammar-token-python-grammar-type_params}@anchor{2566}type_params:  "[" @ref{25d7,,type_param} ("," @ref{25d7,,type_param})* "]"
@anchor{reference/compound_stmts grammar-token-python-grammar-type_param}@anchor{25d7}type_param:   @ref{25d8,,typevar} | @ref{25d9,,typevartuple} | @ref{25da,,paramspec}
@anchor{reference/compound_stmts grammar-token-python-grammar-typevar}@anchor{25d8}typevar:      @ref{2305,,identifier} (":" @ref{183,,expression})? ("=" @ref{183,,expression})?
@anchor{reference/compound_stmts grammar-token-python-grammar-typevartuple}@anchor{25d9}typevartuple: "*" @ref{2305,,identifier} ("=" @ref{183,,expression})?
@anchor{reference/compound_stmts grammar-token-python-grammar-paramspec}@anchor{25da}paramspec:    "**" @ref{2305,,identifier} ("=" @ref{183,,expression})?
@end example

@ref{1666,,Functions} (including @ref{7ee,,coroutines}),
@ref{14e3,,classes} and @ref{66d,,type aliases} may
contain a type parameter list:

@example
def max[T](args: list[T]) -> T:
    ...

async def amax[T](args: list[T]) -> T:
    ...

class Bag[T]:
    def __iter__(self) -> Iterator[T]:
        ...

    def add(self, arg: T) -> None:
        ...

type ListOrSet[T] = list[T] | set[T]
@end example

Semantically, this indicates that the function, class, or type alias is
generic over a type variable. This information is primarily used by static
type checkers, and at runtime, generic objects behave much like their
non-generic counterparts.

Type parameters are declared in square brackets (@code{[]}) immediately
after the name of the function, class, or type alias. The type parameters
are accessible within the scope of the generic object, but not elsewhere.
Thus, after a declaration @code{def func[T](): pass}, the name @code{T} is not available in
the module scope. Below, the semantics of generic objects are described
with more precision. The scope of type parameters is modeled with a special
function (technically, an @ref{4ac,,annotation scope}) that
wraps the creation of the generic object.

Generic functions, classes, and type aliases have a
@ref{25db,,__type_params__} attribute listing their type parameters.

Type parameters come in three kinds:


@itemize *

@item 
@ref{487,,typing.TypeVar}, introduced by a plain name (e.g., @code{T}). Semantically, this
represents a single type to a type checker.

@item 
@ref{489,,typing.TypeVarTuple}, introduced by a name prefixed with a single
asterisk (e.g., @code{*Ts}). Semantically, this stands for a tuple of any
number of types.

@item 
@ref{488,,typing.ParamSpec}, introduced by a name prefixed with two asterisks
(e.g., @code{**P}). Semantically, this stands for the parameters of a callable.
@end itemize

@ref{487,,typing.TypeVar} declarations can define `bounds' and `constraints' with
a colon (@code{:}) followed by an expression. A single expression after the colon
indicates a bound (e.g. @code{T: int}). Semantically, this means
that the @code{typing.TypeVar} can only represent types that are a subtype of
this bound. A parenthesized tuple of expressions after the colon indicates a
set of constraints (e.g. @code{T: (str, bytes)}). Each member of the tuple should be a
type (again, this is not enforced at runtime). Constrained type variables can only
take on one of the types in the list of constraints.

For @code{typing.TypeVar}s declared using the type parameter list syntax,
the bound and constraints are not evaluated when the generic object is created,
but only when the value is explicitly accessed through the attributes @code{__bound__}
and @code{__constraints__}. To accomplish this, the bounds or constraints are
evaluated in a separate @ref{4ac,,annotation scope}.

@ref{489,,typing.TypeVarTuple}s and @ref{488,,typing.ParamSpec}s cannot have bounds
or constraints.

All three flavors of type parameters can also have a `default value', which is used
when the type parameter is not explicitly provided. This is added by appending
a single equals sign (@code{=}) followed by an expression. Like the bounds and
constraints of type variables, the default value is not evaluated when the
object is created, but only when the type parameter’s @code{__default__} attribute
is accessed. To this end, the default value is evaluated in a separate
@ref{4ac,,annotation scope}. If no default value is specified
for a type parameter, the @code{__default__} attribute is set to the special
sentinel object @ref{569,,typing.NoDefault}.

The following example indicates the full set of allowed type parameter declarations:

@example
def overly_generic[
   SimpleTypeVar,
   TypeVarWithDefault = int,
   TypeVarWithBound: int,
   TypeVarWithConstraints: (str, bytes),
   *SimpleTypeVarTuple = (int, float),
   **SimpleParamSpec = (str, bytearray),
](
   a: SimpleTypeVar,
   b: TypeVarWithDefault,
   c: TypeVarWithBound,
   d: Callable[SimpleParamSpec, TypeVarWithConstraints],
   *e: SimpleTypeVarTuple,
): ...
@end example

@menu
* Generic functions:: 
* Generic classes:: 
* Generic type aliases:: 

@end menu

@node Generic functions,Generic classes,,Type parameter lists
@anchor{reference/compound_stmts generic-functions}@anchor{683}@anchor{reference/compound_stmts id17}@anchor{25dc}
@subsubsection Generic functions


Generic functions are declared as follows:

@example
def func[T](arg: T): ...
@end example

This syntax is equivalent to:

@example
annotation-def TYPE_PARAMS_OF_func():
    T = typing.TypeVar("T")
    def func(arg: T): ...
    func.__type_params__ = (T,)
    return func
func = TYPE_PARAMS_OF_func()
@end example

Here @code{annotation-def} indicates an @ref{4ac,,annotation scope},
which is not actually bound to any name at runtime. (One
other liberty is taken in the translation: the syntax does not go through
attribute access on the @ref{10b,,typing} module, but creates an instance of
@ref{487,,typing.TypeVar} directly.)

The annotations of generic functions are evaluated within the annotation scope
used for declaring the type parameters, but the function’s defaults and
decorators are not.

The following example illustrates the scoping rules for these cases,
as well as for additional flavors of type parameters:

@example
@@decorator
def func[T: int, *Ts, **P](*args: *Ts, arg: Callable[P, T] = some_default):
    ...
@end example

Except for the @ref{686,,lazy evaluation} of the
@ref{487,,TypeVar} bound, this is equivalent to:

@example
DEFAULT_OF_arg = some_default

annotation-def TYPE_PARAMS_OF_func():

    annotation-def BOUND_OF_T():
        return int
    # In reality, BOUND_OF_T() is evaluated only on demand.
    T = typing.TypeVar("T", bound=BOUND_OF_T())

    Ts = typing.TypeVarTuple("Ts")
    P = typing.ParamSpec("P")

    def func(*args: *Ts, arg: Callable[P, T] = DEFAULT_OF_arg):
        ...

    func.__type_params__ = (T, Ts, P)
    return func
func = decorator(TYPE_PARAMS_OF_func())
@end example

The capitalized names like @code{DEFAULT_OF_arg} are not actually
bound at runtime.

@node Generic classes,Generic type aliases,Generic functions,Type parameter lists
@anchor{reference/compound_stmts generic-classes}@anchor{682}@anchor{reference/compound_stmts id18}@anchor{25dd}
@subsubsection Generic classes


Generic classes are declared as follows:

@example
class Bag[T]: ...
@end example

This syntax is equivalent to:

@example
annotation-def TYPE_PARAMS_OF_Bag():
    T = typing.TypeVar("T")
    class Bag(typing.Generic[T]):
        __type_params__ = (T,)
        ...
    return Bag
Bag = TYPE_PARAMS_OF_Bag()
@end example

Here again @code{annotation-def} (not a real keyword) indicates an
@ref{4ac,,annotation scope}, and the name
@code{TYPE_PARAMS_OF_Bag} is not actually bound at runtime.

Generic classes implicitly inherit from @ref{1806,,typing.Generic}.
The base classes and keyword arguments of generic classes are
evaluated within the type scope for the type parameters,
and decorators are evaluated outside that scope. This is illustrated
by this example:

@example
@@decorator
class Bag(Base[T], arg=T): ...
@end example

This is equivalent to:

@example
annotation-def TYPE_PARAMS_OF_Bag():
    T = typing.TypeVar("T")
    class Bag(Base[T], typing.Generic[T], arg=T):
        __type_params__ = (T,)
        ...
    return Bag
Bag = decorator(TYPE_PARAMS_OF_Bag())
@end example

@node Generic type aliases,,Generic classes,Type parameter lists
@anchor{reference/compound_stmts generic-type-aliases}@anchor{685}@anchor{reference/compound_stmts id19}@anchor{25de}
@subsubsection Generic type aliases


The @ref{66d,,type} statement can also be used to create a generic type alias:

@example
type ListOrSet[T] = list[T] | set[T]
@end example

Except for the @ref{686,,lazy evaluation} of the value,
this is equivalent to:

@example
annotation-def TYPE_PARAMS_OF_ListOrSet():
    T = typing.TypeVar("T")

    annotation-def VALUE_OF_ListOrSet():
        return list[T] | set[T]
    # In reality, the value is lazily evaluated
    return typing.TypeAliasType("ListOrSet", VALUE_OF_ListOrSet(), type_params=(T,))
ListOrSet = TYPE_PARAMS_OF_ListOrSet()
@end example

Here, @code{annotation-def} (not a real keyword) indicates an
@ref{4ac,,annotation scope}. The capitalized names
like @code{TYPE_PARAMS_OF_ListOrSet} are not actually bound at runtime.

@node Annotations<2>,,Type parameter lists,Compound statements
@anchor{reference/compound_stmts annotations}@anchor{25ce}@anchor{reference/compound_stmts id20}@anchor{25df}
@subsection Annotations



Changed in version 3.14: Annotations are now lazily evaluated by default.


Variables and function parameters may carry @ref{15d,,annotations},
created by adding a colon after the name, followed by an expression:

@example
x: annotation = 1
def f(param: annotation): ...
@end example

Functions may also carry a return annotation following an arrow:

@example
def f() -> annotation: ...
@end example

Annotations are conventionally used for @ref{2412,,type hints}, but this
is not enforced by the language, and in general annotations may contain arbitrary
expressions. The presence of annotations does not change the runtime semantics of
the code, except if some mechanism is used that introspects and uses the annotations
(such as @ref{33,,dataclasses} or @ref{84c,,functools.singledispatch()}).

By default, annotations are lazily evaluated in an @ref{4ac,,annotation scope}.
This means that they are not evaluated when the code containing the annotation is evaluated.
Instead, the interpreter saves information that can be used to evaluate the annotation later
if requested. The @ref{6,,annotationlib} module provides tools for evaluating annotations.

If the @ref{45b,,future statement} @code{from __future__ import annotations} is present,
all annotations are instead stored as strings:

@example
>>> from __future__ import annotations
>>> def f(param: annotation): ...
>>> f.__annotations__
@{'param': 'annotation'@}
@end example

This future statement will be deprecated and removed in a future version of Python,
but not before Python 3.13 reaches its end of life (see 
@geindex Python Enhancement Proposals; PEP 749
PEP 749@footnote{https://peps.python.org/pep-0749/}).
When it is used, introspection tools like
@ref{457,,annotationlib.get_annotations()} and @ref{8c2,,typing.get_type_hints()} are
less likely to be able to resolve annotations at runtime.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Top-level components,Full Grammar specification,Compound statements,The Python Language Reference
@anchor{reference/toplevel_components doc}@anchor{25e0}@anchor{reference/toplevel_components top-level}@anchor{25e1}@anchor{reference/toplevel_components top-level-components}@anchor{25e2}@anchor{reference/toplevel_components translation-repo}@anchor{25e3}
@section Top-level components


@geindex interpreter

The Python interpreter can get its input from a number of sources: from a script
passed to it as standard input or as program argument, typed in interactively,
from a module source file, etc.  This chapter gives the syntax used in these
cases.

@menu
* Complete Python programs:: 
* File input:: 
* Interactive input:: 
* Expression input:: 

@end menu

@node Complete Python programs,File input,,Top-level components
@anchor{reference/toplevel_components complete-python-programs}@anchor{25e4}@anchor{reference/toplevel_components programs}@anchor{2499}
@subsection Complete Python programs


@geindex program

@geindex module; sys
@geindex module; __main__
@geindex module; builtins

While a language specification need not prescribe how the language interpreter
is invoked, it is useful to have a notion of a complete Python program.  A
complete Python program is executed in a minimally initialized environment: all
built-in and standard modules are available, but none have been initialized,
except for @ref{df,,sys} (various system services), @ref{13,,builtins} (built-in
functions, exceptions and @code{None}) and @ref{1,,__main__}.  The latter is used to
provide the local and global namespace for execution of the complete program.

The syntax for a complete Python program is that for file input, described in
the next section.

@geindex interactive mode
@geindex module; __main__

The interpreter may also be invoked in interactive mode; in this case, it does
not read and execute a complete program but reads and executes one statement
(possibly compound) at a time.  The initial environment is identical to that of
a complete program; each statement is executed in the namespace of
@ref{1,,__main__}.

@geindex UNIX
@geindex Windows
@geindex command line
@geindex standard input

A complete program can be passed to the interpreter
in three forms: with the @ref{1a9,,-c} `string' command line option, as a file
passed as the first command line argument, or as standard input.  If the file
or standard input is a tty device, the interpreter enters interactive mode;
otherwise, it executes the file as a complete program.

@node File input,Interactive input,Complete Python programs,Top-level components
@anchor{reference/toplevel_components file-input}@anchor{25e5}@anchor{reference/toplevel_components id1}@anchor{25e6}
@subsection File input


All input read from non-interactive files has the same form:

@example
@anchor{reference/toplevel_components grammar-token-python-grammar-file_input}@anchor{25e7}file_input: (NEWLINE | @ref{2579,,statement})* ENDMARKER
@end example

This syntax is used in the following situations:


@itemize *

@item 
when parsing a complete Python program (from a file or from a string);

@item 
when parsing a module;

@item 
when parsing a string passed to the @ref{4a3,,exec()} function;
@end itemize

@node Interactive input,Expression input,File input,Top-level components
@anchor{reference/toplevel_components interactive}@anchor{25e8}@anchor{reference/toplevel_components interactive-input}@anchor{25e9}
@subsection Interactive input


Input in interactive mode is parsed using the following grammar:

@example
@anchor{reference/toplevel_components grammar-token-python-grammar-interactive_input}@anchor{25ea}interactive_input: [@ref{2578,,stmt_list}] NEWLINE | @ref{256b,,compound_stmt} NEWLINE | ENDMARKER
@end example

Note that a (top-level) compound statement must be followed by a blank line in
interactive mode; this is needed to help the parser detect the end of the input.

@node Expression input,,Interactive input,Top-level components
@anchor{reference/toplevel_components expression-input}@anchor{25eb}@anchor{reference/toplevel_components id2}@anchor{25ec}
@subsection Expression input


@geindex input

@geindex built-in function; eval

@ref{4a4,,eval()} is used for expression input.  It ignores leading whitespace. The
string argument to @code{eval()} must have the following form:

@example
@anchor{reference/toplevel_components grammar-token-python-grammar-eval_input}@anchor{25ed}eval_input: @ref{252e,,expression_list} NEWLINE* ENDMARKER
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Full Grammar specification,,Top-level components,The Python Language Reference
@anchor{reference/grammar doc}@anchor{25ab}@anchor{reference/grammar full-grammar-specification}@anchor{25ee}@anchor{reference/grammar id1}@anchor{25ef}@anchor{reference/grammar translation-repo}@anchor{25f0}
@section Full Grammar specification


This is the full Python grammar, derived directly from the grammar
used to generate the CPython parser (see Grammar/python.gram@footnote{https://github.com/python/cpython/tree/3.14/Grammar/python.gram}).
The version here omits details related to code generation and
error recovery.

The notation used here is the same as in the preceding docs,
and is described in the @ref{22c8,,notation} section,
except for an extra complication:


@itemize *

@item 
@code{~} (“cut”): commit to the current alternative; fail the rule
if the alternative fails to parse

Python mainly uses cuts for optimizations or improved error
messages. They often appear to be useless in the listing below.

@c see gh-143054, and CutValidator in the source, if you want to change this:

Cuts currently don’t appear inside parentheses, brackets, lookaheads
and similar.
Their behavior in these contexts is deliberately left unspecified.
@end itemize

@example
# PEG grammar for Python

@@trailer '@w{'}'
void *
_PyPegen_parse(Parser *p)
@{
    // Initialize keywords
    p->keywords = reserved_keywords;
    p->n_keyword_lists = n_keyword_lists;
    p->soft_keywords = soft_keywords;

    // Run parser
    void *result = NULL;
    if (p->start_rule == Py_file_input) @{
        result = file_rule(p);
    @} else if (p->start_rule == Py_single_input) @{
        result = interactive_rule(p);
    @} else if (p->start_rule == Py_eval_input) @{
        result = eval_rule(p);
    @} else if (p->start_rule == Py_func_type_input) @{
        result = func_type_rule(p);
    @}

    return result;
@}
'@w{'}'

# ========================= START OF THE GRAMMAR =========================

# General grammatical elements and rules:
#
# * Strings with double quotes (") denote SOFT KEYWORDS
# * Strings with single quotes (') denote KEYWORDS
# * Upper case names (NAME) denote tokens in the Grammar/Tokens file
# * Rule names starting with "invalid_" are used for specialized syntax errors
#     - These rules are NOT used in the first pass of the parser.
#     - Only if the first pass fails to parse, a second pass including the invalid
#       rules will be executed.
#     - If the parser fails in the second phase with a generic syntax error, the
#       location of the generic failure of the first pass will be used (this avoids
#       reporting incorrect locations due to the invalid rules).
#     - The order of the alternatives involving invalid rules matter
#       (like any rule in PEG).
#
# Grammar Syntax (see PEP 617 for more information):
#
# rule_name: expression
#   Optionally, a type can be included right after the rule name, which
#   specifies the return type of the C or Python function corresponding to the
#   rule:
# rule_name[return_type]: expression
#   If the return type is omitted, then a void * is returned in C and an Any in
#   Python.
# e1 e2
#   Match e1, then match e2.
# e1 | e2
#   Match e1 or e2.
#   The first alternative can also appear on the line after the rule name for
#   formatting purposes. In that case, a | must be used before the first
#   alternative, like so:
#       rule_name[return_type]:
#            | first_alt
#            | second_alt
# ( e )
#   Match e (allows also to use other operators in the group like '(e)*')
# [ e ] or e?
#   Optionally match e.
# e*
#   Match zero or more occurrences of e.
# e+
#   Match one or more occurrences of e.
# s.e+
#   Match one or more occurrences of e, separated by s. The generated parse tree
#   does not include the separator. This is otherwise identical to (e (s e)*).
# &e
#   Succeed if e can be parsed, without consuming any input.
# !e
#   Fail if e can be parsed, without consuming any input.
# ~
#   Commit to the current alternative, even if it fails to parse.
# &&e
#   Eager parse e. The parser will not backtrack and will immediately
#   fail with SyntaxError if e cannot be parsed.
#

# STARTING RULES
# ==============

file[mod_ty]: a=[statements] ENDMARKER @{ _PyPegen_make_module(p, a) @}
interactive[mod_ty]: a=statement_newline @{ _PyAST_Interactive(a, p->arena) @}
eval[mod_ty]: a=expressions NEWLINE* ENDMARKER @{ _PyAST_Expression(a, p->arena) @}
func_type[mod_ty]: '(' a=[type_expressions] ')' '->' b=expression NEWLINE* ENDMARKER @{ _PyAST_FunctionType(a, b, p->arena) @}

# GENERAL STATEMENTS
# ==================

statements[asdl_stmt_seq*]: a=statement+ @{ (asdl_stmt_seq*)_PyPegen_seq_flatten(p, a) @}

statement[asdl_stmt_seq*]:
    | a=compound_stmt @{ _PyPegen_register_stmts(p ,
                           (asdl_stmt_seq*)_PyPegen_singleton_seq(p, a)
                        ) @}
    | a[asdl_stmt_seq*]=simple_stmts @{ a @}

single_compound_stmt[asdl_stmt_seq*]:
    | a=compound_stmt @{
        _PyPegen_register_stmts(p, (asdl_stmt_seq*)_PyPegen_singleton_seq(p, a)) @}

statement_newline[asdl_stmt_seq*]:
    | a=single_compound_stmt NEWLINE @{ a @}
    | simple_stmts
    | NEWLINE @{ (asdl_stmt_seq*)_PyPegen_singleton_seq(p, CHECK(stmt_ty, _PyAST_Pass(EXTRA))) @}
    | ENDMARKER @{ _PyPegen_interactive_exit(p) @}

simple_stmts[asdl_stmt_seq*]:
    | a=simple_stmt !';' NEWLINE @{ (asdl_stmt_seq*)_PyPegen_singleton_seq(p, a) @} # Not needed, there for speedup
    | a[asdl_stmt_seq*]=';'.simple_stmt+ [';'] NEWLINE @{ a @}

# NOTE: assignment MUST precede expression, else parsing a simple assignment
# will throw a SyntaxError.
simple_stmt[stmt_ty] (memo):
    | assignment
    | &"type" type_alias
    | e=star_expressions @{ _PyAST_Expr(e, EXTRA) @}
    | &'return' return_stmt
    | &('import' | 'from') import_stmt
    | &'raise' raise_stmt
    | &'pass' pass_stmt
    | &'del' del_stmt
    | &'yield' yield_stmt
    | &'assert' assert_stmt
    | &'break' break_stmt
    | &'continue' continue_stmt
    | &'global' global_stmt
    | &'nonlocal' nonlocal_stmt

compound_stmt[stmt_ty]:
    | &('def' | '@@' | 'async') function_def
    | &'if' if_stmt
    | &('class' | '@@') class_def
    | &('with' | 'async') with_stmt
    | &('for' | 'async') for_stmt
    | &'try' try_stmt
    | &'while' while_stmt
    | match_stmt

# SIMPLE STATEMENTS
# =================

# NOTE: annotated_rhs may start with 'yield'; yield_expr must start with 'yield'
assignment[stmt_ty]:
    | a=NAME ':' b=expression c=['=' d=annotated_rhs @{ d @}] @{
        CHECK_VERSION(
            stmt_ty,
            6,
            "Variable annotation syntax is",
            _PyAST_AnnAssign(CHECK(expr_ty, _PyPegen_set_expr_context(p, a, Store)), b, c, 1, EXTRA)
        ) @}
    | a=('(' b=single_target ')' @{ b @}
         | single_subscript_attribute_target) ':' b=expression c=['=' d=annotated_rhs @{ d @}] @{
        CHECK_VERSION(stmt_ty, 6, "Variable annotations syntax is", _PyAST_AnnAssign(a, b, c, 0, EXTRA)) @}
    | a[asdl_expr_seq*]=(z=star_targets '=' @{ z @})+ b=annotated_rhs !'=' tc=[TYPE_COMMENT] @{
         _PyAST_Assign(a, b, NEW_TYPE_COMMENT(p, tc), EXTRA) @}
    | a=single_target b=augassign ~ c=annotated_rhs @{
         _PyAST_AugAssign(a, b->kind, c, EXTRA) @}
    | invalid_assignment

annotated_rhs[expr_ty]: yield_expr | star_expressions

augassign[AugOperator*]:
    | '+=' @{ _PyPegen_augoperator(p, Add) @}
    | '-=' @{ _PyPegen_augoperator(p, Sub) @}
    | '*=' @{ _PyPegen_augoperator(p, Mult) @}
    | '@@=' @{ CHECK_VERSION(AugOperator*, 5, "The '@@' operator is", _PyPegen_augoperator(p, MatMult)) @}
    | '/=' @{ _PyPegen_augoperator(p, Div) @}
    | '%=' @{ _PyPegen_augoperator(p, Mod) @}
    | '&=' @{ _PyPegen_augoperator(p, BitAnd) @}
    | '|=' @{ _PyPegen_augoperator(p, BitOr) @}
    | '^=' @{ _PyPegen_augoperator(p, BitXor) @}
    | '<<=' @{ _PyPegen_augoperator(p, LShift) @}
    | '>>=' @{ _PyPegen_augoperator(p, RShift) @}
    | '**=' @{ _PyPegen_augoperator(p, Pow) @}
    | '//=' @{ _PyPegen_augoperator(p, FloorDiv) @}

return_stmt[stmt_ty]:
    | 'return' a=[star_expressions] @{ _PyAST_Return(a, EXTRA) @}

raise_stmt[stmt_ty]:
    | 'raise' a=expression b=['from' z=expression @{ z @}] @{ _PyAST_Raise(a, b, EXTRA) @}
    | 'raise' @{ _PyAST_Raise(NULL, NULL, EXTRA) @}

pass_stmt[stmt_ty]:
    | 'pass' @{ _PyAST_Pass(EXTRA) @}

break_stmt[stmt_ty]:
    | 'break' @{ _PyAST_Break(EXTRA) @}

continue_stmt[stmt_ty]:
    | 'continue' @{ _PyAST_Continue(EXTRA) @}

global_stmt[stmt_ty]: 'global' a[asdl_expr_seq*]=','.NAME+ @{
    _PyAST_Global(CHECK(asdl_identifier_seq*, _PyPegen_map_names_to_ids(p, a)), EXTRA) @}

nonlocal_stmt[stmt_ty]: 'nonlocal' a[asdl_expr_seq*]=','.NAME+ @{
    _PyAST_Nonlocal(CHECK(asdl_identifier_seq*, _PyPegen_map_names_to_ids(p, a)), EXTRA) @}

del_stmt[stmt_ty]:
    | 'del' a=del_targets &(';' | NEWLINE) @{ _PyAST_Delete(a, EXTRA) @}
    | invalid_del_stmt

yield_stmt[stmt_ty]: y=yield_expr @{ _PyAST_Expr(y, EXTRA) @}

assert_stmt[stmt_ty]: 'assert' a=expression b=[',' z=expression @{ z @}] @{ _PyAST_Assert(a, b, EXTRA) @}

import_stmt[stmt_ty]:
    | invalid_import
    | import_name
    | import_from

# Import statements
# -----------------

import_name[stmt_ty]: 'import' a=dotted_as_names @{ _PyAST_Import(a, EXTRA) @}
# note below: the ('.' | '...') is necessary because '...' is tokenized as ELLIPSIS
import_from[stmt_ty]:
    | 'from' a=('.' | '...')* b=dotted_name 'import' c=import_from_targets @{
        _PyPegen_checked_future_import(p, b->v.Name.id, c, _PyPegen_seq_count_dots(a), EXTRA) @}
    | 'from' a=('.' | '...')+ 'import' b=import_from_targets @{
        _PyAST_ImportFrom(NULL, b, _PyPegen_seq_count_dots(a), EXTRA) @}
import_from_targets[asdl_alias_seq*]:
    | '(' a=import_from_as_names [','] ')' @{ a @}
    | import_from_as_names !','
    | '*' @{ (asdl_alias_seq*)_PyPegen_singleton_seq(p, CHECK(alias_ty, _PyPegen_alias_for_star(p, EXTRA))) @}
    | invalid_import_from_targets
import_from_as_names[asdl_alias_seq*]:
    | a[asdl_alias_seq*]=','.import_from_as_name+ @{ a @}
import_from_as_name[alias_ty]:
    | invalid_import_from_as_name
    | a=NAME b=['as' z=NAME @{ z @}] @{ _PyAST_alias(
        a->v.Name.id, (b) ? ((expr_ty) b)->v.Name.id : NULL, EXTRA) @}

dotted_as_names[asdl_alias_seq*]:
    | a[asdl_alias_seq*]=','.dotted_as_name+ @{ a @}
dotted_as_name[alias_ty]:
    | invalid_dotted_as_name
    | a=dotted_name b=['as' z=NAME @{ z @}] @{ _PyAST_alias(
        a->v.Name.id, (b) ? ((expr_ty) b)->v.Name.id : NULL, EXTRA) @}

dotted_name[expr_ty]:
    | a=dotted_name '.' b=NAME @{ _PyPegen_join_names_with_dot(p, a, b) @}
    | NAME

# COMPOUND STATEMENTS
# ===================

# Common elements
# ---------------

block[asdl_stmt_seq*] (memo):
    | NEWLINE INDENT a=statements DEDENT @{ a @}
    | simple_stmts
    | invalid_block

decorators[asdl_expr_seq*]: a[asdl_expr_seq*]=('@@' f=named_expression NEWLINE @{ f @})+ @{ a @}

# Class definitions
# -----------------

class_def[stmt_ty]:
    | a=decorators b=class_def_raw @{ _PyPegen_class_def_decorators(p, a, b) @}
    | class_def_raw

class_def_raw[stmt_ty]:
    | invalid_class_def_raw
    | 'class' a=NAME t=[type_params] b=['(' z=[arguments] ')' @{ z @}] ':' c=block @{
        _PyAST_ClassDef(a->v.Name.id,
                     (b) ? ((expr_ty) b)->v.Call.args : NULL,
                     (b) ? ((expr_ty) b)->v.Call.keywords : NULL,
                     c, NULL, t, EXTRA) @}

# Function definitions
# --------------------

function_def[stmt_ty]:
    | d=decorators f=function_def_raw @{ _PyPegen_function_def_decorators(p, d, f) @}
    | function_def_raw

function_def_raw[stmt_ty]:
    | invalid_def_raw
    | 'def' n=NAME t=[type_params] '(' params=[params] ')' a=['->' z=expression @{ z @}] ':' tc=[func_type_comment] b=block @{
        _PyAST_FunctionDef(n->v.Name.id,
                        (params) ? params : CHECK(arguments_ty, _PyPegen_empty_arguments(p)),
                        b, NULL, a, NEW_TYPE_COMMENT(p, tc), t, EXTRA) @}
    | 'async' 'def' n=NAME t=[type_params] '(' params=[params] ')' a=['->' z=expression @{ z @}] ':' tc=[func_type_comment] b=block @{
        CHECK_VERSION(
            stmt_ty,
            5,
            "Async functions are",
            _PyAST_AsyncFunctionDef(n->v.Name.id,
                            (params) ? params : CHECK(arguments_ty, _PyPegen_empty_arguments(p)),
                            b, NULL, a, NEW_TYPE_COMMENT(p, tc), t, EXTRA)
        ) @}

# Function parameters
# -------------------

params[arguments_ty]:
    | invalid_parameters
    | parameters

parameters[arguments_ty]:
    | a=slash_no_default b[asdl_arg_seq*]=param_no_default* c=param_with_default* d=[star_etc] @{
        CHECK_VERSION(arguments_ty, 8, "Positional-only parameters are", _PyPegen_make_arguments(p, a, NULL, b, c, d)) @}
    | a=slash_with_default b=param_with_default* c=[star_etc] @{
        CHECK_VERSION(arguments_ty, 8, "Positional-only parameters are", _PyPegen_make_arguments(p, NULL, a, NULL, b, c)) @}
    | a[asdl_arg_seq*]=param_no_default+ b=param_with_default* c=[star_etc] @{
        _PyPegen_make_arguments(p, NULL, NULL, a, b, c) @}
    | a=param_with_default+ b=[star_etc] @{ _PyPegen_make_arguments(p, NULL, NULL, NULL, a, b)@}
    | a=star_etc @{ _PyPegen_make_arguments(p, NULL, NULL, NULL, NULL, a) @}

# Some duplication here because we can't write (',' | &')'),
# which is because we don't support empty alternatives (yet).

slash_no_default[asdl_arg_seq*]:
    | a[asdl_arg_seq*]=param_no_default+ '/' ',' @{ a @}
    | a[asdl_arg_seq*]=param_no_default+ '/' &')' @{ a @}
slash_with_default[SlashWithDefault*]:
    | a=param_no_default* b=param_with_default+ '/' ',' @{ _PyPegen_slash_with_default(p, (asdl_arg_seq *)a, b) @}
    | a=param_no_default* b=param_with_default+ '/' &')' @{ _PyPegen_slash_with_default(p, (asdl_arg_seq *)a, b) @}

star_etc[StarEtc*]:
    | invalid_star_etc
    | '*' a=param_no_default b=param_maybe_default* c=[kwds] @{
        _PyPegen_star_etc(p, a, b, c) @}
    | '*' a=param_no_default_star_annotation b=param_maybe_default* c=[kwds] @{
        _PyPegen_star_etc(p, a, b, c) @}
    | '*' ',' b=param_maybe_default+ c=[kwds] @{
        _PyPegen_star_etc(p, NULL, b, c) @}
    | a=kwds @{ _PyPegen_star_etc(p, NULL, NULL, a) @}

kwds[arg_ty]:
    | invalid_kwds
    | '**' a=param_no_default @{ a @}

# One parameter.  This *includes* a following comma and type comment.
#
# There are three styles:
# - No default
# - With default
# - Maybe with default
#
# There are two alternative forms of each, to deal with type comments:
# - Ends in a comma followed by an optional type comment
# - No comma, optional type comment, must be followed by close paren
# The latter form is for a final parameter without trailing comma.
#

param_no_default[arg_ty]:
    | a=param ',' tc=TYPE_COMMENT? @{ _PyPegen_add_type_comment_to_arg(p, a, tc) @}
    | a=param tc=TYPE_COMMENT? &')' @{ _PyPegen_add_type_comment_to_arg(p, a, tc) @}
param_no_default_star_annotation[arg_ty]:
    | a=param_star_annotation ',' tc=TYPE_COMMENT? @{ _PyPegen_add_type_comment_to_arg(p, a, tc) @}
    | a=param_star_annotation tc=TYPE_COMMENT? &')' @{ _PyPegen_add_type_comment_to_arg(p, a, tc) @}
param_with_default[NameDefaultPair*]:
    | a=param c=default ',' tc=TYPE_COMMENT? @{ _PyPegen_name_default_pair(p, a, c, tc) @}
    | a=param c=default tc=TYPE_COMMENT? &')' @{ _PyPegen_name_default_pair(p, a, c, tc) @}
param_maybe_default[NameDefaultPair*]:
    | a=param c=default? ',' tc=TYPE_COMMENT? @{ _PyPegen_name_default_pair(p, a, c, tc) @}
    | a=param c=default? tc=TYPE_COMMENT? &')' @{ _PyPegen_name_default_pair(p, a, c, tc) @}
param[arg_ty]: a=NAME b=annotation? @{ _PyAST_arg(a->v.Name.id, b, NULL, EXTRA) @}
param_star_annotation[arg_ty]: a=NAME b=star_annotation @{ _PyAST_arg(a->v.Name.id, b, NULL, EXTRA) @}
annotation[expr_ty]: ':' a=expression @{ a @}
star_annotation[expr_ty]: ':' a=star_expression @{ a @}
default[expr_ty]: '=' a=expression @{ a @} | invalid_default

# If statement
# ------------

if_stmt[stmt_ty]:
    | invalid_if_stmt
    | 'if' a=named_expression ':' b=block c=elif_stmt @{
        _PyAST_If(a, b, CHECK(asdl_stmt_seq*, _PyPegen_singleton_seq(p, c)), EXTRA) @}
    | 'if' a=named_expression ':' b=block c=[else_block] @{ _PyAST_If(a, b, c, EXTRA) @}
elif_stmt[stmt_ty]:
    | invalid_elif_stmt
    | 'elif' a=named_expression ':' b=block c=elif_stmt @{
        _PyAST_If(a, b, CHECK(asdl_stmt_seq*, _PyPegen_singleton_seq(p, c)), EXTRA) @}
    | 'elif' a=named_expression ':' b=block c=[else_block] @{ _PyAST_If(a, b, c, EXTRA) @}
else_block[asdl_stmt_seq*]:
    | invalid_else_stmt
    | 'else' &&':' b=block @{ b @}

# While statement
# ---------------

while_stmt[stmt_ty]:
    | invalid_while_stmt
    | 'while' a=named_expression ':' b=block c=[else_block] @{ _PyAST_While(a, b, c, EXTRA) @}

# For statement
# -------------

for_stmt[stmt_ty]:
    | invalid_for_stmt
    | 'for' t=star_targets 'in' ~ ex=star_expressions ':' tc=[TYPE_COMMENT] b=block el=[else_block] @{
        _PyAST_For(t, ex, b, el, NEW_TYPE_COMMENT(p, tc), EXTRA) @}
    | 'async' 'for' t=star_targets 'in' ~ ex=star_expressions ':' tc=[TYPE_COMMENT] b=block el=[else_block] @{
        CHECK_VERSION(stmt_ty, 5, "Async for loops are", _PyAST_AsyncFor(t, ex, b, el, NEW_TYPE_COMMENT(p, tc), EXTRA)) @}
    | invalid_for_target

# With statement
# --------------

with_stmt[stmt_ty]:
    | invalid_with_stmt_indent
    | 'with' '(' a[asdl_withitem_seq*]=','.with_item+ ','? ')' ':' tc=[TYPE_COMMENT] b=block @{
       _PyAST_With(a, b, NEW_TYPE_COMMENT(p, tc), EXTRA) @}
    | 'with' a[asdl_withitem_seq*]=','.with_item+ ':' tc=[TYPE_COMMENT] b=block @{
        _PyAST_With(a, b, NEW_TYPE_COMMENT(p, tc), EXTRA) @}
    | 'async' 'with' '(' a[asdl_withitem_seq*]=','.with_item+ ','? ')' ':' b=block @{
       CHECK_VERSION(stmt_ty, 5, "Async with statements are", _PyAST_AsyncWith(a, b, NULL, EXTRA)) @}
    | 'async' 'with' a[asdl_withitem_seq*]=','.with_item+ ':' tc=[TYPE_COMMENT] b=block @{
       CHECK_VERSION(stmt_ty, 5, "Async with statements are", _PyAST_AsyncWith(a, b, NEW_TYPE_COMMENT(p, tc), EXTRA)) @}
    | invalid_with_stmt

with_item[withitem_ty]:
    | e=expression 'as' t=star_target &(',' | ')' | ':') @{ _PyAST_withitem(e, t, p->arena) @}
    | invalid_with_item
    | e=expression @{ _PyAST_withitem(e, NULL, p->arena) @}

# Try statement
# -------------

try_stmt[stmt_ty]:
    | invalid_try_stmt
    | 'try' &&':' b=block f=finally_block @{ _PyAST_Try(b, NULL, NULL, f, EXTRA) @}
    | 'try' &&':' b=block ex[asdl_excepthandler_seq*]=except_block+ el=[else_block] f=[finally_block] @{ _PyAST_Try(b, ex, el, f, EXTRA) @}
    | 'try' &&':' b=block ex[asdl_excepthandler_seq*]=except_star_block+ el=[else_block] f=[finally_block] @{
        CHECK_VERSION(stmt_ty, 11, "Exception groups are",
                      _PyAST_TryStar(b, ex, el, f, EXTRA)) @}


# Except statement
# ----------------

except_block[excepthandler_ty]:
    | invalid_except_stmt_indent
    | 'except' e=expression ':' b=block @{
        _PyAST_ExceptHandler(e, NULL, b, EXTRA) @}
    | 'except' e=expression 'as' t=NAME ':' b=block @{
        _PyAST_ExceptHandler(e, ((expr_ty) t)->v.Name.id, b, EXTRA) @}
    | 'except' e=expressions ':' b=block @{
        CHECK_VERSION(
            excepthandler_ty,
            14,
            "except expressions without parentheses are",
            _PyAST_ExceptHandler(e, NULL, b, EXTRA)) @}
    | 'except' ':' b=block @{ _PyAST_ExceptHandler(NULL, NULL, b, EXTRA) @}
    | invalid_except_stmt
except_star_block[excepthandler_ty]:
    | invalid_except_star_stmt_indent
    | 'except' '*' e=expression ':' b=block @{
        _PyAST_ExceptHandler(e, NULL, b, EXTRA) @}
    | 'except' '*' e=expression 'as' t=NAME ':' b=block @{
        _PyAST_ExceptHandler(e, ((expr_ty) t)->v.Name.id, b, EXTRA) @}
    | 'except' '*' e=expressions ':' b=block @{
        CHECK_VERSION(
            excepthandler_ty,
            14,
            "except expressions without parentheses are",
            _PyAST_ExceptHandler(e,  NULL, b, EXTRA)) @}
    | invalid_except_star_stmt
finally_block[asdl_stmt_seq*]:
    | invalid_finally_stmt
    | 'finally' &&':' a=block @{ a @}

# Match statement
# ---------------

match_stmt[stmt_ty]:
    | "match" subject=subject_expr ':' NEWLINE INDENT cases[asdl_match_case_seq*]=case_block+ DEDENT @{
        CHECK_VERSION(stmt_ty, 10, "Pattern matching is", _PyAST_Match(subject, cases, EXTRA)) @}
    | invalid_match_stmt

subject_expr[expr_ty]:
    | value=star_named_expression ',' values=star_named_expressions? @{
        _PyAST_Tuple(CHECK(asdl_expr_seq*, _PyPegen_seq_insert_in_front(p, value, values)), Load, EXTRA) @}
    | named_expression

case_block[match_case_ty]:
    | invalid_case_block
    | "case" pattern=patterns guard=guard? ':' body=block @{
        _PyAST_match_case(pattern, guard, body, p->arena) @}

guard[expr_ty]: 'if' guard=named_expression @{ guard @}

patterns[pattern_ty]:
    | patterns[asdl_pattern_seq*]=open_sequence_pattern @{
        _PyAST_MatchSequence(patterns, EXTRA) @}
    | pattern

pattern[pattern_ty]:
    | as_pattern
    | or_pattern

as_pattern[pattern_ty]:
    | pattern=or_pattern 'as' target=pattern_capture_target @{
        _PyAST_MatchAs(pattern, target->v.Name.id, EXTRA) @}
    | invalid_as_pattern

or_pattern[pattern_ty]:
    | patterns[asdl_pattern_seq*]='|'.closed_pattern+ @{
        asdl_seq_LEN(patterns) == 1 ? asdl_seq_GET(patterns, 0) : _PyAST_MatchOr(patterns, EXTRA) @}

closed_pattern[pattern_ty] (memo):
    | literal_pattern
    | capture_pattern
    | wildcard_pattern
    | value_pattern
    | group_pattern
    | sequence_pattern
    | mapping_pattern
    | class_pattern

# Literal patterns are used for equality and identity constraints
literal_pattern[pattern_ty]:
    | value=signed_number !('+' | '-') @{ _PyAST_MatchValue(value, EXTRA) @}
    | value=complex_number @{ _PyAST_MatchValue(value, EXTRA) @}
    | value=strings @{ _PyAST_MatchValue(value, EXTRA) @}
    | 'None' @{ _PyAST_MatchSingleton(Py_None, EXTRA) @}
    | 'True' @{ _PyAST_MatchSingleton(Py_True, EXTRA) @}
    | 'False' @{ _PyAST_MatchSingleton(Py_False, EXTRA) @}

# Literal expressions are used to restrict permitted mapping pattern keys
literal_expr[expr_ty]:
    | signed_number !('+' | '-')
    | complex_number
    | &(STRING|FSTRING_START|TSTRING_START) strings
    | 'None' @{ _PyAST_Constant(Py_None, NULL, EXTRA) @}
    | 'True' @{ _PyAST_Constant(Py_True, NULL, EXTRA) @}
    | 'False' @{ _PyAST_Constant(Py_False, NULL, EXTRA) @}

complex_number[expr_ty]:
    | real=signed_real_number '+' imag=imaginary_number @{
        _PyAST_BinOp(real, Add, imag, EXTRA) @}
    | real=signed_real_number '-' imag=imaginary_number  @{
        _PyAST_BinOp(real, Sub, imag, EXTRA) @}

signed_number[expr_ty]:
    | NUMBER
    | '-' number=NUMBER @{ _PyAST_UnaryOp(USub, number, EXTRA) @}

signed_real_number[expr_ty]:
    | real_number
    | '-' real=real_number @{ _PyAST_UnaryOp(USub, real, EXTRA) @}

real_number[expr_ty]:
    | real=NUMBER @{ _PyPegen_ensure_real(p, real) @}

imaginary_number[expr_ty]:
    | imag=NUMBER @{ _PyPegen_ensure_imaginary(p, imag) @}

capture_pattern[pattern_ty]:
    | target=pattern_capture_target @{ _PyAST_MatchAs(NULL, target->v.Name.id, EXTRA) @}

pattern_capture_target[expr_ty]:
    | !"_" name=NAME !('.' | '(' | '=') @{
        _PyPegen_set_expr_context(p, name, Store) @}

wildcard_pattern[pattern_ty]:
    | "_" @{ _PyAST_MatchAs(NULL, NULL, EXTRA) @}

value_pattern[pattern_ty]:
    | attr=attr !('.' | '(' | '=') @{ _PyAST_MatchValue(attr, EXTRA) @}

attr[expr_ty]:
    | value=name_or_attr '.' attr=NAME @{
        _PyAST_Attribute(value, attr->v.Name.id, Load, EXTRA) @}

name_or_attr[expr_ty]:
    | attr
    | NAME

group_pattern[pattern_ty]:
    | '(' pattern=pattern ')' @{ pattern @}

sequence_pattern[pattern_ty]:
    | '[' patterns=maybe_sequence_pattern? ']' @{ _PyAST_MatchSequence(patterns, EXTRA) @}
    | '(' patterns=open_sequence_pattern? ')' @{ _PyAST_MatchSequence(patterns, EXTRA) @}

open_sequence_pattern[asdl_seq*]:
    | pattern=maybe_star_pattern ',' patterns=maybe_sequence_pattern? @{
        _PyPegen_seq_insert_in_front(p, pattern, patterns) @}

maybe_sequence_pattern[asdl_seq*]:
    | patterns=','.maybe_star_pattern+ ','? @{ patterns @}

maybe_star_pattern[pattern_ty]:
    | star_pattern
    | pattern

star_pattern[pattern_ty] (memo):
    | '*' target=pattern_capture_target @{
        _PyAST_MatchStar(target->v.Name.id, EXTRA) @}
    | '*' wildcard_pattern @{
        _PyAST_MatchStar(NULL, EXTRA) @}

mapping_pattern[pattern_ty]:
    | '@{' '@}' @{
        _PyAST_MatchMapping(NULL, NULL, NULL, EXTRA) @}
    | '@{' rest=double_star_pattern ','? '@}' @{
        _PyAST_MatchMapping(NULL, NULL, rest->v.Name.id, EXTRA) @}
    | '@{' items=items_pattern ',' rest=double_star_pattern ','? '@}' @{
        _PyAST_MatchMapping(
            CHECK(asdl_expr_seq*, _PyPegen_get_pattern_keys(p, items)),
            CHECK(asdl_pattern_seq*, _PyPegen_get_patterns(p, items)),
            rest->v.Name.id,
            EXTRA) @}
    | '@{' items=items_pattern ','? '@}' @{
        _PyAST_MatchMapping(
            CHECK(asdl_expr_seq*, _PyPegen_get_pattern_keys(p, items)),
            CHECK(asdl_pattern_seq*, _PyPegen_get_patterns(p, items)),
            NULL,
            EXTRA) @}

items_pattern[asdl_seq*]:
    | ','.key_value_pattern+

key_value_pattern[KeyPatternPair*]:
    | key=(literal_expr | attr) ':' pattern=pattern @{
        _PyPegen_key_pattern_pair(p, key, pattern) @}

double_star_pattern[expr_ty]:
    | '**' target=pattern_capture_target @{ target @}

class_pattern[pattern_ty]:
    | cls=name_or_attr '(' ')' @{
        _PyAST_MatchClass(cls, NULL, NULL, NULL, EXTRA) @}
    | cls=name_or_attr '(' patterns=positional_patterns ','? ')' @{
        _PyAST_MatchClass(cls, patterns, NULL, NULL, EXTRA) @}
    | cls=name_or_attr '(' keywords=keyword_patterns ','? ')' @{
        _PyAST_MatchClass(
            cls, NULL,
            CHECK(asdl_identifier_seq*, _PyPegen_map_names_to_ids(p,
                CHECK(asdl_expr_seq*, _PyPegen_get_pattern_keys(p, keywords)))),
            CHECK(asdl_pattern_seq*, _PyPegen_get_patterns(p, keywords)),
            EXTRA) @}
    | cls=name_or_attr '(' patterns=positional_patterns ',' keywords=keyword_patterns ','? ')' @{
        _PyAST_MatchClass(
            cls,
            patterns,
            CHECK(asdl_identifier_seq*, _PyPegen_map_names_to_ids(p,
                CHECK(asdl_expr_seq*, _PyPegen_get_pattern_keys(p, keywords)))),
            CHECK(asdl_pattern_seq*, _PyPegen_get_patterns(p, keywords)),
            EXTRA) @}
    | invalid_class_pattern

positional_patterns[asdl_pattern_seq*]:
    | args[asdl_pattern_seq*]=','.pattern+ @{ args @}

keyword_patterns[asdl_seq*]:
    | ','.keyword_pattern+

keyword_pattern[KeyPatternPair*]:
    | arg=NAME '=' value=pattern @{ _PyPegen_key_pattern_pair(p, arg, value) @}

# Type statement
# ---------------

type_alias[stmt_ty]:
    | "type" n=NAME t=[type_params] '=' b=expression @{
        CHECK_VERSION(stmt_ty, 12, "Type statement is",
        _PyAST_TypeAlias(CHECK(expr_ty, _PyPegen_set_expr_context(p, n, Store)), t, b, EXTRA)) @}

# Type parameter declaration
# --------------------------

type_params[asdl_type_param_seq*]:
    | invalid_type_params
    | '[' t=type_param_seq ']' @{
        CHECK_VERSION(asdl_type_param_seq *, 12, "Type parameter lists are", t) @}

type_param_seq[asdl_type_param_seq*]: a[asdl_type_param_seq*]=','.type_param+ [','] @{ a @}

type_param[type_param_ty] (memo):
    | a=NAME b=[type_param_bound] c=[type_param_default] @{ _PyAST_TypeVar(a->v.Name.id, b, c, EXTRA) @}
    | invalid_type_param
    | '*' a=NAME b=[type_param_starred_default] @{ _PyAST_TypeVarTuple(a->v.Name.id, b, EXTRA) @}
    | '**' a=NAME b=[type_param_default] @{ _PyAST_ParamSpec(a->v.Name.id, b, EXTRA) @}

type_param_bound[expr_ty]: ':' e=expression @{ e @}
type_param_default[expr_ty]: '=' e=expression @{
    CHECK_VERSION(expr_ty, 13, "Type parameter defaults are", e) @}
type_param_starred_default[expr_ty]: '=' e=star_expression @{
    CHECK_VERSION(expr_ty, 13, "Type parameter defaults are", e) @}

# EXPRESSIONS
# -----------

expressions[expr_ty]:
    | a=expression b=(',' c=expression @{ c @})+ [','] @{
        _PyAST_Tuple(CHECK(asdl_expr_seq*, _PyPegen_seq_insert_in_front(p, a, b)), Load, EXTRA) @}
    | a=expression ',' @{ _PyAST_Tuple(CHECK(asdl_expr_seq*, _PyPegen_singleton_seq(p, a)), Load, EXTRA) @}
    | expression

expression[expr_ty] (memo):
    | invalid_expression
    | invalid_legacy_expression
    | a=disjunction 'if' b=disjunction 'else' c=expression @{ _PyAST_IfExp(b, a, c, EXTRA) @}
    | disjunction
    | lambdef

yield_expr[expr_ty]:
    | 'yield' 'from' a=expression @{ _PyAST_YieldFrom(a, EXTRA) @}
    | 'yield' a=[star_expressions] @{ _PyAST_Yield(a, EXTRA) @}

star_expressions[expr_ty]:
    | a=star_expression b=(',' c=star_expression @{ c @})+ [','] @{
        _PyAST_Tuple(CHECK(asdl_expr_seq*, _PyPegen_seq_insert_in_front(p, a, b)), Load, EXTRA) @}
    | a=star_expression ',' @{ _PyAST_Tuple(CHECK(asdl_expr_seq*, _PyPegen_singleton_seq(p, a)), Load, EXTRA) @}
    | star_expression

star_expression[expr_ty] (memo):
    | '*' a=bitwise_or @{ _PyAST_Starred(a, Load, EXTRA) @}
    | expression

star_named_expressions[asdl_expr_seq*]: a[asdl_expr_seq*]=','.star_named_expression+ [','] @{ a @}

star_named_expression[expr_ty]:
    | '*' a=bitwise_or @{ _PyAST_Starred(a, Load, EXTRA) @}
    | named_expression

assignment_expression[expr_ty]:
    | a=NAME ':=' ~ b=expression @{
        CHECK_VERSION(expr_ty, 8, "Assignment expressions are",
        _PyAST_NamedExpr(CHECK(expr_ty, _PyPegen_set_expr_context(p, a, Store)), b, EXTRA)) @}

named_expression[expr_ty]:
    | assignment_expression
    | invalid_named_expression
    | expression !':='

disjunction[expr_ty] (memo):
    | a=conjunction b=('or' c=conjunction @{ c @})+ @{ _PyAST_BoolOp(
        Or,
        CHECK(asdl_expr_seq*, _PyPegen_seq_insert_in_front(p, a, b)),
        EXTRA) @}
    | conjunction

conjunction[expr_ty] (memo):
    | a=inversion b=('and' c=inversion @{ c @})+ @{ _PyAST_BoolOp(
        And,
        CHECK(asdl_expr_seq*, _PyPegen_seq_insert_in_front(p, a, b)),
        EXTRA) @}
    | inversion

inversion[expr_ty] (memo):
    | 'not' a=inversion @{ _PyAST_UnaryOp(Not, a, EXTRA) @}
    | comparison

# Comparison operators
# --------------------

comparison[expr_ty]:
    | a=bitwise_or b=compare_op_bitwise_or_pair+ @{
        _PyAST_Compare(
            a,
            CHECK(asdl_int_seq*, _PyPegen_get_cmpops(p, b)),
            CHECK(asdl_expr_seq*, _PyPegen_get_exprs(p, b)),
            EXTRA) @}
    | bitwise_or

compare_op_bitwise_or_pair[CmpopExprPair*]:
    | eq_bitwise_or
    | noteq_bitwise_or
    | lte_bitwise_or
    | lt_bitwise_or
    | gte_bitwise_or
    | gt_bitwise_or
    | notin_bitwise_or
    | in_bitwise_or
    | isnot_bitwise_or
    | is_bitwise_or

eq_bitwise_or[CmpopExprPair*]: '==' a=bitwise_or @{ _PyPegen_cmpop_expr_pair(p, Eq, a) @}
noteq_bitwise_or[CmpopExprPair*]:
    | (tok='!=' @{ _PyPegen_check_barry_as_flufl(p, tok) ? NULL : tok@}) a=bitwise_or @{_PyPegen_cmpop_expr_pair(p, NotEq, a) @}
lte_bitwise_or[CmpopExprPair*]: '<=' a=bitwise_or @{ _PyPegen_cmpop_expr_pair(p, LtE, a) @}
lt_bitwise_or[CmpopExprPair*]: '<' a=bitwise_or @{ _PyPegen_cmpop_expr_pair(p, Lt, a) @}
gte_bitwise_or[CmpopExprPair*]: '>=' a=bitwise_or @{ _PyPegen_cmpop_expr_pair(p, GtE, a) @}
gt_bitwise_or[CmpopExprPair*]: '>' a=bitwise_or @{ _PyPegen_cmpop_expr_pair(p, Gt, a) @}
notin_bitwise_or[CmpopExprPair*]: 'not' 'in' a=bitwise_or @{ _PyPegen_cmpop_expr_pair(p, NotIn, a) @}
in_bitwise_or[CmpopExprPair*]: 'in' a=bitwise_or @{ _PyPegen_cmpop_expr_pair(p, In, a) @}
isnot_bitwise_or[CmpopExprPair*]: 'is' 'not' a=bitwise_or @{ _PyPegen_cmpop_expr_pair(p, IsNot, a) @}
is_bitwise_or[CmpopExprPair*]: 'is' a=bitwise_or @{ _PyPegen_cmpop_expr_pair(p, Is, a) @}

# Bitwise operators
# -----------------

bitwise_or[expr_ty]:
    | a=bitwise_or '|' b=bitwise_xor @{ _PyAST_BinOp(a, BitOr, b, EXTRA) @}
    | bitwise_xor

bitwise_xor[expr_ty]:
    | a=bitwise_xor '^' b=bitwise_and @{ _PyAST_BinOp(a, BitXor, b, EXTRA) @}
    | bitwise_and

bitwise_and[expr_ty]:
    | a=bitwise_and '&' b=shift_expr @{ _PyAST_BinOp(a, BitAnd, b, EXTRA) @}
    | shift_expr

shift_expr[expr_ty]:
    | a=shift_expr '<<' b=sum @{ _PyAST_BinOp(a, LShift, b, EXTRA) @}
    | a=shift_expr '>>' b=sum @{ _PyAST_BinOp(a, RShift, b, EXTRA) @}
    | invalid_arithmetic
    | sum

# Arithmetic operators
# --------------------

sum[expr_ty]:
    | a=sum '+' b=term @{ _PyAST_BinOp(a, Add, b, EXTRA) @}
    | a=sum '-' b=term @{ _PyAST_BinOp(a, Sub, b, EXTRA) @}
    | term

term[expr_ty]:
    | a=term '*' b=factor @{ _PyAST_BinOp(a, Mult, b, EXTRA) @}
    | a=term '/' b=factor @{ _PyAST_BinOp(a, Div, b, EXTRA) @}
    | a=term '//' b=factor @{ _PyAST_BinOp(a, FloorDiv, b, EXTRA) @}
    | a=term '%' b=factor @{ _PyAST_BinOp(a, Mod, b, EXTRA) @}
    | a=term '@@' b=factor @{ CHECK_VERSION(expr_ty, 5, "The '@@' operator is", _PyAST_BinOp(a, MatMult, b, EXTRA)) @}
    | invalid_factor
    | factor

factor[expr_ty] (memo):
    | '+' a=factor @{ _PyAST_UnaryOp(UAdd, a, EXTRA) @}
    | '-' a=factor @{ _PyAST_UnaryOp(USub, a, EXTRA) @}
    | '~' a=factor @{ _PyAST_UnaryOp(Invert, a, EXTRA) @}
    | power

power[expr_ty]:
    | a=await_primary '**' b=factor @{ _PyAST_BinOp(a, Pow, b, EXTRA) @}
    | await_primary

# Primary elements
# ----------------

# Primary elements are things like "obj.something.something", "obj[something]", "obj(something)", "obj" ...

await_primary[expr_ty] (memo):
    | 'await' a=primary @{ CHECK_VERSION(expr_ty, 5, "Await expressions are", _PyAST_Await(a, EXTRA)) @}
    | primary

primary[expr_ty]:
    | a=primary '.' b=NAME @{ _PyAST_Attribute(a, b->v.Name.id, Load, EXTRA) @}
    | a=primary b=genexp @{ _PyAST_Call(a, CHECK(asdl_expr_seq*, (asdl_expr_seq*)_PyPegen_singleton_seq(p, b)), NULL, EXTRA) @}
    | a=primary '(' b=[arguments] ')' @{
        _PyAST_Call(a,
                 (b) ? ((expr_ty) b)->v.Call.args : NULL,
                 (b) ? ((expr_ty) b)->v.Call.keywords : NULL,
                 EXTRA) @}
    | a=primary '[' b=slices ']' @{ _PyAST_Subscript(a, b, Load, EXTRA) @}
    | atom

slices[expr_ty]:
    | a=slice !',' @{ a @}
    | a[asdl_expr_seq*]=','.(slice | starred_expression)+ [','] @{ _PyAST_Tuple(a, Load, EXTRA) @}

slice[expr_ty]:
    | a=[expression] ':' b=[expression] c=[':' d=[expression] @{ d @}] @{ _PyAST_Slice(a, b, c, EXTRA) @}
    | a=named_expression @{ a @}

atom[expr_ty]:
    | NAME
    | 'True' @{ _PyAST_Constant(Py_True, NULL, EXTRA) @}
    | 'False' @{ _PyAST_Constant(Py_False, NULL, EXTRA) @}
    | 'None' @{ _PyAST_Constant(Py_None, NULL, EXTRA) @}
    | &(STRING|FSTRING_START|TSTRING_START) strings
    | NUMBER
    | &'(' (tuple | group | genexp)
    | &'[' (list | listcomp)
    | &'@{' (dict | set | dictcomp | setcomp)
    | '...' @{ _PyAST_Constant(Py_Ellipsis, NULL, EXTRA) @}

group[expr_ty]:
    | '(' a=(yield_expr | named_expression) ')' @{ a @}
    | invalid_group

# Lambda functions
# ----------------

lambdef[expr_ty]:
    | 'lambda' a=[lambda_params] ':' b=expression @{
        _PyAST_Lambda((a) ? a : CHECK(arguments_ty, _PyPegen_empty_arguments(p)), b, EXTRA) @}

lambda_params[arguments_ty]:
    | invalid_lambda_parameters
    | lambda_parameters

# lambda_parameters etc. duplicates parameters but without annotations
# or type comments, and if there's no comma after a parameter, we expect
# a colon, not a close parenthesis.  (For more, see parameters above.)
#
lambda_parameters[arguments_ty]:
    | a=lambda_slash_no_default b[asdl_arg_seq*]=lambda_param_no_default* c=lambda_param_with_default* d=[lambda_star_etc] @{
        CHECK_VERSION(arguments_ty, 8, "Positional-only parameters are", _PyPegen_make_arguments(p, a, NULL, b, c, d)) @}
    | a=lambda_slash_with_default b=lambda_param_with_default* c=[lambda_star_etc] @{
        CHECK_VERSION(arguments_ty, 8, "Positional-only parameters are", _PyPegen_make_arguments(p, NULL, a, NULL, b, c)) @}
    | a[asdl_arg_seq*]=lambda_param_no_default+ b=lambda_param_with_default* c=[lambda_star_etc] @{
        _PyPegen_make_arguments(p, NULL, NULL, a, b, c) @}
    | a=lambda_param_with_default+ b=[lambda_star_etc] @{ _PyPegen_make_arguments(p, NULL, NULL, NULL, a, b)@}
    | a=lambda_star_etc @{ _PyPegen_make_arguments(p, NULL, NULL, NULL, NULL, a) @}

lambda_slash_no_default[asdl_arg_seq*]:
    | a[asdl_arg_seq*]=lambda_param_no_default+ '/' ',' @{ a @}
    | a[asdl_arg_seq*]=lambda_param_no_default+ '/' &':' @{ a @}

lambda_slash_with_default[SlashWithDefault*]:
    | a=lambda_param_no_default* b=lambda_param_with_default+ '/' ',' @{ _PyPegen_slash_with_default(p, (asdl_arg_seq *)a, b) @}
    | a=lambda_param_no_default* b=lambda_param_with_default+ '/' &':' @{ _PyPegen_slash_with_default(p, (asdl_arg_seq *)a, b) @}

lambda_star_etc[StarEtc*]:
    | invalid_lambda_star_etc
    | '*' a=lambda_param_no_default b=lambda_param_maybe_default* c=[lambda_kwds] @{
        _PyPegen_star_etc(p, a, b, c) @}
    | '*' ',' b=lambda_param_maybe_default+ c=[lambda_kwds] @{
        _PyPegen_star_etc(p, NULL, b, c) @}
    | a=lambda_kwds @{ _PyPegen_star_etc(p, NULL, NULL, a) @}

lambda_kwds[arg_ty]:
    | invalid_lambda_kwds
    | '**' a=lambda_param_no_default @{ a @}

lambda_param_no_default[arg_ty]:
    | a=lambda_param ',' @{ a @}
    | a=lambda_param &':' @{ a @}
lambda_param_with_default[NameDefaultPair*]:
    | a=lambda_param c=default ',' @{ _PyPegen_name_default_pair(p, a, c, NULL) @}
    | a=lambda_param c=default &':' @{ _PyPegen_name_default_pair(p, a, c, NULL) @}
lambda_param_maybe_default[NameDefaultPair*]:
    | a=lambda_param c=default? ',' @{ _PyPegen_name_default_pair(p, a, c, NULL) @}
    | a=lambda_param c=default? &':' @{ _PyPegen_name_default_pair(p, a, c, NULL) @}
lambda_param[arg_ty]: a=NAME @{ _PyAST_arg(a->v.Name.id, NULL, NULL, EXTRA) @}

# LITERALS
# ========

fstring_middle[expr_ty]:
    | fstring_replacement_field
    | t=FSTRING_MIDDLE @{ _PyPegen_constant_from_token(p, t) @}
fstring_replacement_field[expr_ty]:
    | '@{' a=annotated_rhs debug_expr='='? conversion=[fstring_conversion] format=[fstring_full_format_spec] rbrace='@}' @{
        _PyPegen_formatted_value(p, a, debug_expr, conversion, format, rbrace, EXTRA) @}
    | invalid_fstring_replacement_field
fstring_conversion[ResultTokenWithMetadata*]:
    | conv_token="!" conv=NAME @{ _PyPegen_check_fstring_conversion(p, conv_token, conv) @}
fstring_full_format_spec[ResultTokenWithMetadata*]:
    | colon=':' spec=fstring_format_spec* @{ _PyPegen_setup_full_format_spec(p, colon, (asdl_expr_seq *) spec, EXTRA) @}
fstring_format_spec[expr_ty]:
    | t=FSTRING_MIDDLE @{ _PyPegen_decoded_constant_from_token(p, t) @}
    | fstring_replacement_field
fstring[expr_ty]:
    | a=FSTRING_START b=fstring_middle* c=FSTRING_END @{ _PyPegen_joined_str(p, a, (asdl_expr_seq*)b, c) @}

tstring_format_spec_replacement_field[expr_ty]:
    | '@{' a=annotated_rhs debug_expr='='? conversion=[fstring_conversion] format=[tstring_full_format_spec] rbrace='@}' @{
        _PyPegen_formatted_value(p, a, debug_expr, conversion, format, rbrace, EXTRA) @}
    | invalid_tstring_replacement_field
tstring_format_spec[expr_ty]:
    | t=TSTRING_MIDDLE @{ _PyPegen_decoded_constant_from_token(p, t) @}
    | tstring_format_spec_replacement_field
tstring_full_format_spec[ResultTokenWithMetadata*]:
    | colon=':' spec=tstring_format_spec* @{ _PyPegen_setup_full_format_spec(p, colon, (asdl_expr_seq *) spec, EXTRA) @}
tstring_replacement_field[expr_ty]:
    | '@{' a=annotated_rhs debug_expr='='? conversion=[fstring_conversion] format=[tstring_full_format_spec] rbrace='@}' @{
        _PyPegen_interpolation(p, a, debug_expr, conversion, format, rbrace, EXTRA) @}
    | invalid_tstring_replacement_field
tstring_middle[expr_ty]:
    | tstring_replacement_field
    | t=TSTRING_MIDDLE @{ _PyPegen_constant_from_token(p, t) @}
tstring[expr_ty] (memo):
    | a=TSTRING_START b=tstring_middle* c=TSTRING_END @{
        CHECK_VERSION(
            expr_ty,
            14,
            "t-strings are",
            _PyPegen_template_str(p, a, (asdl_expr_seq*)b, c)) @}

string[expr_ty]: s[Token*]=STRING @{ _PyPegen_constant_from_string(p, s) @}
strings[expr_ty] (memo):
    | invalid_string_tstring_concat
    | a[asdl_expr_seq*]=(fstring|string)+ @{ _PyPegen_concatenate_strings(p, a, EXTRA) @}
    | a[asdl_expr_seq*]=tstring+ @{ _PyPegen_concatenate_tstrings(p, a, EXTRA) @}

list[expr_ty]:
    | '[' a=[star_named_expressions] ']' @{ _PyAST_List(a, Load, EXTRA) @}

tuple[expr_ty]:
    | '(' a=[y=star_named_expression ',' z=[star_named_expressions] @{ _PyPegen_seq_insert_in_front(p, y, z) @} ] ')' @{
        _PyAST_Tuple(a, Load, EXTRA) @}

set[expr_ty]: '@{' a=star_named_expressions '@}' @{ _PyAST_Set(a, EXTRA) @}

# Dicts
# -----

dict[expr_ty]:
    | '@{' a=[double_starred_kvpairs] '@}' @{
        _PyAST_Dict(
            CHECK(asdl_expr_seq*, _PyPegen_get_keys(p, a)),
            CHECK(asdl_expr_seq*, _PyPegen_get_values(p, a)),
            EXTRA) @}
    | '@{' invalid_double_starred_kvpairs '@}'

double_starred_kvpairs[asdl_seq*]: a=','.double_starred_kvpair+ [','] @{ a @}

double_starred_kvpair[KeyValuePair*]:
    | '**' a=bitwise_or @{ _PyPegen_key_value_pair(p, NULL, a) @}
    | kvpair

kvpair[KeyValuePair*]: a=expression ':' b=expression @{ _PyPegen_key_value_pair(p, a, b) @}

# Comprehensions & Generators
# ---------------------------

for_if_clauses[asdl_comprehension_seq*]:
    | a[asdl_comprehension_seq*]=for_if_clause+ @{ a @}

for_if_clause[comprehension_ty]:
    | 'async' 'for' a=star_targets 'in' ~ b=disjunction c[asdl_expr_seq*]=('if' z=disjunction @{ z @})* @{
        CHECK_VERSION(comprehension_ty, 6, "Async comprehensions are", _PyAST_comprehension(a, b, c, 1, p->arena)) @}
    | 'for' a=star_targets 'in' ~ b=disjunction c[asdl_expr_seq*]=('if' z=disjunction @{ z @})* @{
        _PyAST_comprehension(a, b, c, 0, p->arena) @}
    | invalid_for_if_clause
    | invalid_for_target

listcomp[expr_ty]:
    | '[' a=named_expression b=for_if_clauses ']' @{ _PyAST_ListComp(a, b, EXTRA) @}
    | invalid_comprehension

setcomp[expr_ty]:
    | '@{' a=named_expression b=for_if_clauses '@}' @{ _PyAST_SetComp(a, b, EXTRA) @}
    | invalid_comprehension

genexp[expr_ty]:
    | '(' a=( assignment_expression | expression !':=') b=for_if_clauses ')' @{ _PyAST_GeneratorExp(a, b, EXTRA) @}
    | invalid_comprehension

dictcomp[expr_ty]:
    | '@{' a=kvpair b=for_if_clauses '@}' @{ _PyAST_DictComp(a->key, a->value, b, EXTRA) @}
    | invalid_dict_comprehension

# FUNCTION CALL ARGUMENTS
# =======================

arguments[expr_ty] (memo):
    | a=args [','] &')' @{ a @}
    | invalid_arguments

args[expr_ty]:
    | a[asdl_expr_seq*]=','.(starred_expression | ( assignment_expression | expression !':=') !'=')+ b=[',' k=kwargs @{k@}] @{
        _PyPegen_collect_call_seqs(p, a, b, EXTRA) @}
    | a=kwargs @{ _PyAST_Call(_PyPegen_dummy_name(p),
                          CHECK_NULL_ALLOWED(asdl_expr_seq*, _PyPegen_seq_extract_starred_exprs(p, a)),
                          CHECK_NULL_ALLOWED(asdl_keyword_seq*, _PyPegen_seq_delete_starred_exprs(p, a)),
                          EXTRA) @}

kwargs[asdl_seq*]:
    | a=','.kwarg_or_starred+ ',' b=','.kwarg_or_double_starred+ @{ _PyPegen_join_sequences(p, a, b) @}
    | ','.kwarg_or_starred+
    | ','.kwarg_or_double_starred+

starred_expression[expr_ty]:
    | invalid_starred_expression_unpacking
    | '*' a=expression @{ _PyAST_Starred(a, Load, EXTRA) @}
    | invalid_starred_expression

kwarg_or_starred[KeywordOrStarred*]:
    | invalid_kwarg
    | a=NAME '=' b=expression @{
        _PyPegen_keyword_or_starred(p, CHECK(keyword_ty, _PyAST_keyword(a->v.Name.id, b, EXTRA)), 1) @}
    | a=starred_expression @{ _PyPegen_keyword_or_starred(p, a, 0) @}

kwarg_or_double_starred[KeywordOrStarred*]:
    | invalid_kwarg
    | a=NAME '=' b=expression @{
        _PyPegen_keyword_or_starred(p, CHECK(keyword_ty, _PyAST_keyword(a->v.Name.id, b, EXTRA)), 1) @}
    | '**' a=expression @{ _PyPegen_keyword_or_starred(p, CHECK(keyword_ty, _PyAST_keyword(NULL, a, EXTRA)), 1) @}

# ASSIGNMENT TARGETS
# ==================

# Generic targets
# ---------------

# NOTE: star_targets may contain *bitwise_or, targets may not.
star_targets[expr_ty]:
    | a=star_target !',' @{ a @}
    | a=star_target b=(',' c=star_target @{ c @})* [','] @{
        _PyAST_Tuple(CHECK(asdl_expr_seq*, _PyPegen_seq_insert_in_front(p, a, b)), Store, EXTRA) @}

star_targets_list_seq[asdl_expr_seq*]: a[asdl_expr_seq*]=','.star_target+ [','] @{ a @}

star_targets_tuple_seq[asdl_expr_seq*]:
    | a=star_target b=(',' c=star_target @{ c @})+ [','] @{ (asdl_expr_seq*) _PyPegen_seq_insert_in_front(p, a, b) @}
    | a=star_target ',' @{ (asdl_expr_seq*) _PyPegen_singleton_seq(p, a) @}

star_target[expr_ty] (memo):
    | '*' a=(!'*' star_target) @{
        _PyAST_Starred(CHECK(expr_ty, _PyPegen_set_expr_context(p, a, Store)), Store, EXTRA) @}
    | target_with_star_atom

target_with_star_atom[expr_ty] (memo):
    | a=t_primary '.' b=NAME !t_lookahead @{ _PyAST_Attribute(a, b->v.Name.id, Store, EXTRA) @}
    | a=t_primary '[' b=slices ']' !t_lookahead @{ _PyAST_Subscript(a, b, Store, EXTRA) @}
    | star_atom

star_atom[expr_ty]:
    | a=NAME @{ _PyPegen_set_expr_context(p, a, Store) @}
    | '(' a=target_with_star_atom ')' @{ _PyPegen_set_expr_context(p, a, Store) @}
    | '(' a=[star_targets_tuple_seq] ')' @{ _PyAST_Tuple(a, Store, EXTRA) @}
    | '[' a=[star_targets_list_seq] ']' @{ _PyAST_List(a, Store, EXTRA) @}

single_target[expr_ty]:
    | single_subscript_attribute_target
    | a=NAME @{ _PyPegen_set_expr_context(p, a, Store) @}
    | '(' a=single_target ')' @{ a @}

single_subscript_attribute_target[expr_ty]:
    | a=t_primary '.' b=NAME !t_lookahead @{ _PyAST_Attribute(a, b->v.Name.id, Store, EXTRA) @}
    | a=t_primary '[' b=slices ']' !t_lookahead @{ _PyAST_Subscript(a, b, Store, EXTRA) @}

t_primary[expr_ty]:
    | a=t_primary '.' b=NAME &t_lookahead @{ _PyAST_Attribute(a, b->v.Name.id, Load, EXTRA) @}
    | a=t_primary '[' b=slices ']' &t_lookahead @{ _PyAST_Subscript(a, b, Load, EXTRA) @}
    | a=t_primary b=genexp &t_lookahead @{
        _PyAST_Call(a, CHECK(asdl_expr_seq*, (asdl_expr_seq*)_PyPegen_singleton_seq(p, b)), NULL, EXTRA) @}
    | a=t_primary '(' b=[arguments] ')' &t_lookahead @{
        _PyAST_Call(a,
                 (b) ? ((expr_ty) b)->v.Call.args : NULL,
                 (b) ? ((expr_ty) b)->v.Call.keywords : NULL,
                 EXTRA) @}
    | a=atom &t_lookahead @{ a @}

t_lookahead: '(' | '[' | '.'

# Targets for del statements
# --------------------------

del_targets[asdl_expr_seq*]: a[asdl_expr_seq*]=','.del_target+ [','] @{ a @}

del_target[expr_ty] (memo):
    | a=t_primary '.' b=NAME !t_lookahead @{ _PyAST_Attribute(a, b->v.Name.id, Del, EXTRA) @}
    | a=t_primary '[' b=slices ']' !t_lookahead @{ _PyAST_Subscript(a, b, Del, EXTRA) @}
    | del_t_atom

del_t_atom[expr_ty]:
    | a=NAME @{ _PyPegen_set_expr_context(p, a, Del) @}
    | '(' a=del_target ')' @{ _PyPegen_set_expr_context(p, a, Del) @}
    | '(' a=[del_targets] ')' @{ _PyAST_Tuple(a, Del, EXTRA) @}
    | '[' a=[del_targets] ']' @{ _PyAST_List(a, Del, EXTRA) @}

# TYPING ELEMENTS
# ---------------

# type_expressions allow */** but ignore them
type_expressions[asdl_expr_seq*]:
    | a=','.expression+ ',' '*' b=expression ',' '**' c=expression @{
        (asdl_expr_seq*)_PyPegen_seq_append_to_end(
            p,
            CHECK(asdl_seq*, _PyPegen_seq_append_to_end(p, a, b)),
            c) @}
    | a=','.expression+ ',' '*' b=expression @{ (asdl_expr_seq*)_PyPegen_seq_append_to_end(p, a, b) @}
    | a=','.expression+ ',' '**' b=expression @{ (asdl_expr_seq*)_PyPegen_seq_append_to_end(p, a, b) @}
    | '*' a=expression ',' '**' b=expression @{
        (asdl_expr_seq*)_PyPegen_seq_append_to_end(
            p,
            CHECK(asdl_seq*, _PyPegen_singleton_seq(p, a)),
            b) @}
    | '*' a=expression @{ (asdl_expr_seq*)_PyPegen_singleton_seq(p, a) @}
    | '**' a=expression @{ (asdl_expr_seq*)_PyPegen_singleton_seq(p, a) @}
    | a[asdl_expr_seq*]=','.expression+ @{a@}

func_type_comment[Token*]:
    | NEWLINE t=TYPE_COMMENT &(NEWLINE INDENT) @{ t @}  # Must be followed by indented block
    | invalid_double_type_comments
    | TYPE_COMMENT

# ========================= END OF THE GRAMMAR ===========================



# ========================= START OF INVALID RULES =======================

# From here on, there are rules for invalid syntax with specialised error messages
invalid_arguments:
    | ((','.(starred_expression | ( assignment_expression | expression !':=') !'=')+ ',' kwargs) | kwargs) a=',' ','.(starred_expression !'=')+ @{
        RAISE_SYNTAX_ERROR_STARTING_FROM(a, "iterable argument unpacking follows keyword argument unpacking") @}
    | a=expression b=for_if_clauses ',' [args | expression for_if_clauses] @{
        RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, _PyPegen_get_last_comprehension_item(PyPegen_last_item(b, comprehension_ty)), "Generator expression must be parenthesized") @}
    | a=NAME b='=' expression for_if_clauses @{
        RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "invalid syntax. Maybe you meant '==' or ':=' instead of '='?")@}
    | (args ',')? a=NAME b='=' &(',' | ')') @{
        RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "expected argument value expression")@}
    | a=args b=for_if_clauses @{ _PyPegen_nonparen_genexp_in_call(p, a, b) @}
    | args ',' a=expression b=for_if_clauses @{
        RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, _PyPegen_get_last_comprehension_item(PyPegen_last_item(b, comprehension_ty)), "Generator expression must be parenthesized") @}
    | a=args ',' args @{ _PyPegen_arguments_parsing_error(p, a) @}
invalid_kwarg:
    | a[Token*]=('True'|'False'|'None') b='=' @{
        RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "cannot assign to %s", PyBytes_AS_STRING(a->bytes)) @}
    | a=NAME b='=' expression for_if_clauses @{
        RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "invalid syntax. Maybe you meant '==' or ':=' instead of '='?")@}
    | !(NAME '=') a=expression b='=' @{
        RAISE_SYNTAX_ERROR_KNOWN_RANGE(
            a, b, "expression cannot contain assignment, perhaps you meant \"==\"?") @}
    | a='**' expression '=' b=expression @{
        RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "cannot assign to keyword argument unpacking") @}

# IMPORTANT: Note that the "_without_invalid" suffix causes the rule to not call invalid rules under it
expression_without_invalid[expr_ty]:
    | a=disjunction 'if' b=disjunction 'else' c=expression @{ _PyAST_IfExp(b, a, c, EXTRA) @}
    | disjunction
    | lambdef
invalid_legacy_expression:
    | a=NAME !'(' b=star_expressions @{
        _PyPegen_check_legacy_stmt(p, a) ? RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b,
            "Missing parentheses in call to '%U'. Did you mean %U(...)?", a->v.Name.id, a->v.Name.id) : NULL@}

invalid_type_param:
    | '*' a=NAME colon=':' e=expression @{
            RAISE_SYNTAX_ERROR_STARTING_FROM(colon, e->kind == Tuple_kind
                ? "cannot use constraints with TypeVarTuple"
                : "cannot use bound with TypeVarTuple")
        @}
    | '**' a=NAME colon=':' e=expression @{
            RAISE_SYNTAX_ERROR_STARTING_FROM(colon, e->kind == Tuple_kind
                ? "cannot use constraints with ParamSpec"
                : "cannot use bound with ParamSpec")
        @}

invalid_expression:
   |  STRING a=(!STRING expression_without_invalid)+ STRING @{
        RAISE_SYNTAX_ERROR_KNOWN_RANGE( PyPegen_first_item(a, expr_ty), PyPegen_last_item(a, expr_ty),
        "invalid syntax. Is this intended to be part of the string?") @}
    # !(NAME STRING) is not matched so we don't show this error with some invalid string prefixes like: kf"dsfsdf"
    # Soft keywords need to also be ignored because they can be parsed as NAME NAME
   | !(NAME STRING | SOFT_KEYWORD) a=disjunction b=expression_without_invalid @{
        _PyPegen_check_legacy_stmt(p, a) ? NULL : p->tokens[p->mark-1]->level == 0 ? NULL :
        RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "invalid syntax. Perhaps you forgot a comma?") @}
   | a=disjunction 'if' b=disjunction !('else'|':') @{ RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "expected 'else' after 'if' expression") @}
   | a=disjunction 'if' b=disjunction 'else' !expression @{
        RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("expected expression after 'else', but statement is given") @}
   | a[stmt_ty]=(pass_stmt|break_stmt|continue_stmt) 'if' b=disjunction 'else' c=simple_stmt @{
        RAISE_SYNTAX_ERROR_KNOWN_LOCATION (a, "expected expression before 'if', but statement is given") @}
   | a='lambda' [lambda_params] b=':' &FSTRING_MIDDLE  @{
        RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "f-string: lambda expressions are not allowed without parentheses") @}
   | a='lambda' [lambda_params] b=':' &TSTRING_MIDDLE  @{
        RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "t-string: lambda expressions are not allowed without parentheses") @}

invalid_named_expression(memo):
    | a=expression ':=' expression @{
        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(
            a, "cannot use assignment expressions with %s", _PyPegen_get_expr_name(a)) @}
    | a=NAME '=' b=bitwise_or !('='|':=') @{
        RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "invalid syntax. Maybe you meant '==' or ':=' instead of '='?") @}
    | !(list|tuple|genexp|'True'|'None'|'False') a=bitwise_or b='=' bitwise_or !('='|':=') @{
        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "cannot assign to %s here. Maybe you meant '==' instead of '='?",
                                          _PyPegen_get_expr_name(a)) @}

invalid_assignment:
    | a=invalid_ann_assign_target ':' expression @{
        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(
            a,
            "only single target (not %s) can be annotated",
            _PyPegen_get_expr_name(a)
        )@}
    | a=star_named_expression ',' star_named_expressions* ':' expression @{
        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "only single target (not tuple) can be annotated") @}
    | a=expression ':' expression @{
        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "illegal target for annotation") @}
    | (star_targets '=')* a=star_expressions '=' @{
        RAISE_SYNTAX_ERROR_INVALID_TARGET(STAR_TARGETS, a) @}
    | (star_targets '=')* a=yield_expr '=' @{ RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "assignment to yield expression not possible") @}
    | a=star_expressions augassign annotated_rhs @{
        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(
            a,
            "'%s' is an illegal expression for augmented assignment",
            _PyPegen_get_expr_name(a)
        )@}
invalid_ann_assign_target[expr_ty]:
    | list
    | tuple
    | '(' a=invalid_ann_assign_target ')' @{ a @}
invalid_del_stmt:
    | 'del' a=star_expressions @{
        RAISE_SYNTAX_ERROR_INVALID_TARGET(DEL_TARGETS, a) @}
invalid_block:
    | NEWLINE !INDENT @{ RAISE_INDENTATION_ERROR("expected an indented block") @}
invalid_comprehension:
    | ('[' | '(' | '@{') a=starred_expression for_if_clauses @{
        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "iterable unpacking cannot be used in comprehension") @}
    | ('[' | '@{') a=star_named_expression ',' b=star_named_expressions for_if_clauses @{
        RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, PyPegen_last_item(b, expr_ty),
        "did you forget parentheses around the comprehension target?") @}
    | ('[' | '@{') a=star_named_expression b=',' for_if_clauses @{
        RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "did you forget parentheses around the comprehension target?") @}
invalid_dict_comprehension:
    | '@{' a='**' bitwise_or for_if_clauses '@}' @{
        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "dict unpacking cannot be used in dict comprehension") @}
invalid_parameters:
    | a="/" ',' @{
        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "at least one argument must precede /") @}
    | (slash_no_default | slash_with_default) param_maybe_default* a='/' @{
        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "/ may appear only once") @}
    | slash_no_default? param_no_default* invalid_parameters_helper a=param_no_default @{
        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "parameter without a default follows parameter with a default") @}
    | param_no_default* a='(' param_no_default+ ','? b=')' @{
        RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "Function parameters cannot be parenthesized") @}
    | (slash_no_default | slash_with_default)? param_maybe_default* '*' (',' | param_no_default) param_maybe_default* a='/' @{
        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "/ must be ahead of *") @}
    | param_maybe_default+ '/' a='*' @{
        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "expected comma between / and *") @}
invalid_default:
    | a='=' &(')'|',') @{ RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "expected default value expression") @}
invalid_star_etc:
    | a='*' (')' | ',' (')' | '**')) @{ RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "named arguments must follow bare *") @}
    | '*' ',' TYPE_COMMENT @{ RAISE_SYNTAX_ERROR("bare * has associated type comment") @}
    | '*' param a='=' @{ RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "var-positional argument cannot have default value") @}
    | '*' (param_no_default | ',') param_maybe_default* a='*' (param_no_default | ',') @{
        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "* argument may appear only once") @}
invalid_kwds:
    | '**' param a='=' @{ RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "var-keyword argument cannot have default value") @}
    | '**' param ',' a=param @{ RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "arguments cannot follow var-keyword argument") @}
    | '**' param ',' a[Token*]=('*'|'**'|'/') @{ RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "arguments cannot follow var-keyword argument") @}
invalid_parameters_helper: # This is only there to avoid type errors
    | a=slash_with_default @{ _PyPegen_singleton_seq(p, a) @}
    | param_with_default+
invalid_lambda_parameters:
    | a="/" ',' @{
        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "at least one argument must precede /") @}
    | (lambda_slash_no_default | lambda_slash_with_default) lambda_param_maybe_default* a='/' @{
        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "/ may appear only once") @}
    | lambda_slash_no_default? lambda_param_no_default* invalid_lambda_parameters_helper a=lambda_param_no_default @{
        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "parameter without a default follows parameter with a default") @}
    | lambda_param_no_default* a='(' ','.lambda_param+ ','? b=')' @{
        RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "Lambda expression parameters cannot be parenthesized") @}
    | (lambda_slash_no_default | lambda_slash_with_default)? lambda_param_maybe_default* '*' (',' | lambda_param_no_default) lambda_param_maybe_default* a='/' @{
        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "/ must be ahead of *") @}
    | lambda_param_maybe_default+ '/' a='*' @{
        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "expected comma between / and *") @}
invalid_lambda_parameters_helper:
    | a=lambda_slash_with_default @{ _PyPegen_singleton_seq(p, a) @}
    | lambda_param_with_default+
invalid_lambda_star_etc:
    | '*' (':' | ',' (':' | '**')) @{ RAISE_SYNTAX_ERROR("named arguments must follow bare *") @}
    | '*' lambda_param a='=' @{ RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "var-positional argument cannot have default value") @}
    | '*' (lambda_param_no_default | ',') lambda_param_maybe_default* a='*' (lambda_param_no_default | ',') @{
        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "* argument may appear only once") @}
invalid_lambda_kwds:
    | '**' lambda_param a='=' @{ RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "var-keyword argument cannot have default value") @}
    | '**' lambda_param ',' a=lambda_param @{ RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "arguments cannot follow var-keyword argument") @}
    | '**' lambda_param ',' a[Token*]=('*'|'**'|'/') @{ RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "arguments cannot follow var-keyword argument") @}
invalid_double_type_comments:
    | TYPE_COMMENT NEWLINE TYPE_COMMENT NEWLINE INDENT @{
        RAISE_SYNTAX_ERROR("Cannot have two type comments on def") @}
invalid_with_item:
    | expression 'as' a=expression &(',' | ')' | ':') @{
        RAISE_SYNTAX_ERROR_INVALID_TARGET(STAR_TARGETS, a) @}

invalid_for_if_clause:
    | 'async'? 'for' (bitwise_or (',' bitwise_or)* [',']) !'in' @{
        RAISE_SYNTAX_ERROR("'in' expected after for-loop variables") @}

invalid_for_target:
    | 'async'? 'for' a=star_expressions @{
        RAISE_SYNTAX_ERROR_INVALID_TARGET(FOR_TARGETS, a) @}

invalid_group:
    | '(' a=starred_expression ')' @{
        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "cannot use starred expression here") @}
    | '(' a='**' expression ')' @{
        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "cannot use double starred expression here") @}
invalid_import:
    | a='import' ','.dotted_name+ 'from' dotted_name @{
        RAISE_SYNTAX_ERROR_STARTING_FROM(a, "Did you mean to use 'from ... import ...' instead?") @}
    | 'import' token=NEWLINE @{
        RAISE_SYNTAX_ERROR_STARTING_FROM(token, "Expected one or more names after 'import'") @}
invalid_dotted_as_name:
    | dotted_name 'as' !(NAME (',' | ')' | ';' | NEWLINE)) a=expression @{
        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a,
            "cannot use %s as import target", _PyPegen_get_expr_name(a)) @}
invalid_import_from_as_name:
    | NAME 'as' !(NAME (',' | ')' | ';' | NEWLINE)) a=expression @{
        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a,
            "cannot use %s as import target", _PyPegen_get_expr_name(a)) @}

invalid_import_from_targets:
    | import_from_as_names ',' NEWLINE @{
        RAISE_SYNTAX_ERROR("trailing comma not allowed without surrounding parentheses") @}
    | token=NEWLINE @{
        RAISE_SYNTAX_ERROR_STARTING_FROM(token, "Expected one or more names after 'import'") @}

invalid_with_stmt:
    | ['async'] 'with' ','.(expression ['as' star_target])+ NEWLINE @{ RAISE_SYNTAX_ERROR("expected ':'") @}
    | ['async'] 'with' '(' ','.(expressions ['as' star_target])+ ','? ')' NEWLINE @{ RAISE_SYNTAX_ERROR("expected ':'") @}
invalid_with_stmt_indent:
    | ['async'] a='with' ','.(expression ['as' star_target])+ ':' NEWLINE !INDENT @{
        RAISE_INDENTATION_ERROR("expected an indented block after 'with' statement on line %d", a->lineno) @}
    | ['async'] a='with' '(' ','.(expressions ['as' star_target])+ ','? ')' ':' NEWLINE !INDENT @{
        RAISE_INDENTATION_ERROR("expected an indented block after 'with' statement on line %d", a->lineno) @}

invalid_try_stmt:
    | a='try' ':' NEWLINE !INDENT @{
        RAISE_INDENTATION_ERROR("expected an indented block after 'try' statement on line %d", a->lineno) @}
    | 'try' ':' block !('except' | 'finally') @{ RAISE_SYNTAX_ERROR("expected 'except' or 'finally' block") @}
    | 'try' ':' block* except_block+ a='except' b='*' expression ['as' NAME] ':' @{
        RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "cannot have both 'except' and 'except*' on the same 'try'") @}
    | 'try' ':' block* except_star_block+ a='except' [expression ['as' NAME]] ':' @{
        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "cannot have both 'except' and 'except*' on the same 'try'") @}
invalid_except_stmt:
    | 'except' a=expression ',' expressions 'as' NAME  ':' @{
        RAISE_SYNTAX_ERROR_STARTING_FROM(a, "multiple exception types must be parenthesized when using 'as'") @}
    | a='except' expression ['as' NAME ] NEWLINE @{ RAISE_SYNTAX_ERROR("expected ':'") @}
    | a='except' NEWLINE @{ RAISE_SYNTAX_ERROR("expected ':'") @}
    | 'except' expression 'as' a=expression ':' block @{
        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(
            a, "cannot use except statement with %s", _PyPegen_get_expr_name(a)) @}
invalid_except_star_stmt:
    | 'except' '*' a=expression ',' expressions 'as' NAME  ':' @{
        RAISE_SYNTAX_ERROR_STARTING_FROM(a, "multiple exception types must be parenthesized when using 'as'") @}
    | a='except' '*' expression ['as' NAME ] NEWLINE @{ RAISE_SYNTAX_ERROR("expected ':'") @}
    | a='except' '*' (NEWLINE | ':') @{ RAISE_SYNTAX_ERROR("expected one or more exception types") @}
    | 'except' '*' expression 'as' a=expression ':' block @{
        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(
            a, "cannot use except* statement with %s", _PyPegen_get_expr_name(a)) @}
invalid_finally_stmt:
    | a='finally' ':' NEWLINE !INDENT @{
        RAISE_INDENTATION_ERROR("expected an indented block after 'finally' statement on line %d", a->lineno) @}
invalid_except_stmt_indent:
    | a='except' expression ['as' NAME ] ':' NEWLINE !INDENT @{
        RAISE_INDENTATION_ERROR("expected an indented block after 'except' statement on line %d", a->lineno) @}
    | a='except' ':' NEWLINE !INDENT @{ RAISE_INDENTATION_ERROR("expected an indented block after 'except' statement on line %d", a->lineno) @}
invalid_except_star_stmt_indent:
    | a='except' '*' expression ['as' NAME ] ':' NEWLINE !INDENT @{
        RAISE_INDENTATION_ERROR("expected an indented block after 'except*' statement on line %d", a->lineno) @}
invalid_match_stmt:
    | "match" subject_expr NEWLINE @{ CHECK_VERSION(void*, 10, "Pattern matching is", RAISE_SYNTAX_ERROR("expected ':'") ) @}
    | a="match" subject=subject_expr ':' NEWLINE !INDENT @{
        RAISE_INDENTATION_ERROR("expected an indented block after 'match' statement on line %d", a->lineno) @}
invalid_case_block:
    | "case" patterns guard? NEWLINE @{ RAISE_SYNTAX_ERROR("expected ':'") @}
    | a="case" patterns guard? ':' NEWLINE !INDENT @{
        RAISE_INDENTATION_ERROR("expected an indented block after 'case' statement on line %d", a->lineno) @}
invalid_as_pattern:
    | or_pattern 'as' a="_" @{ RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "cannot use '_' as a target") @}
    | or_pattern 'as' a=expression @{
        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(
            a, "cannot use %s as pattern target", _PyPegen_get_expr_name(a)) @}
invalid_class_pattern:
    | name_or_attr '(' a=invalid_class_argument_pattern  @{ RAISE_SYNTAX_ERROR_KNOWN_RANGE(
        PyPegen_first_item(a, pattern_ty),
        PyPegen_last_item(a, pattern_ty),
        "positional patterns follow keyword patterns") @}
invalid_class_argument_pattern[asdl_pattern_seq*]:
    | [positional_patterns ','] keyword_patterns ',' a=positional_patterns @{ a @}
invalid_if_stmt:
    | 'if' named_expression NEWLINE @{ RAISE_SYNTAX_ERROR("expected ':'") @}
    | a='if' a=named_expression ':' NEWLINE !INDENT @{
        RAISE_INDENTATION_ERROR("expected an indented block after 'if' statement on line %d", a->lineno) @}
invalid_elif_stmt:
    | 'elif' named_expression NEWLINE @{ RAISE_SYNTAX_ERROR("expected ':'") @}
    | a='elif' named_expression ':' NEWLINE !INDENT @{
        RAISE_INDENTATION_ERROR("expected an indented block after 'elif' statement on line %d", a->lineno) @}
invalid_else_stmt:
    | a='else' ':' NEWLINE !INDENT @{
        RAISE_INDENTATION_ERROR("expected an indented block after 'else' statement on line %d", a->lineno) @}
    | 'else' ':' block 'elif' @{ RAISE_SYNTAX_ERROR("'elif' block follows an 'else' block")@}
invalid_while_stmt:
    | 'while' named_expression NEWLINE @{ RAISE_SYNTAX_ERROR("expected ':'") @}
    | a='while' named_expression ':' NEWLINE !INDENT @{
        RAISE_INDENTATION_ERROR("expected an indented block after 'while' statement on line %d", a->lineno) @}
invalid_for_stmt:
    | ['async'] 'for' star_targets 'in' star_expressions NEWLINE @{ RAISE_SYNTAX_ERROR("expected ':'") @}
    | ['async'] a='for' star_targets 'in' star_expressions ':' NEWLINE !INDENT @{
        RAISE_INDENTATION_ERROR("expected an indented block after 'for' statement on line %d", a->lineno) @}
invalid_def_raw:
    | ['async'] a='def' NAME [type_params] '(' [params] ')' ['->' expression] ':' NEWLINE !INDENT @{
        RAISE_INDENTATION_ERROR("expected an indented block after function definition on line %d", a->lineno) @}
    | ['async'] 'def' NAME [type_params] &&'(' [params] ')' ['->' expression] &&':' [func_type_comment] block
invalid_class_def_raw:
    | 'class' NAME [type_params] ['(' [arguments] ')'] NEWLINE @{ RAISE_SYNTAX_ERROR("expected ':'") @}
    | a='class' NAME [type_params] ['(' [arguments] ')'] ':' NEWLINE !INDENT @{
        RAISE_INDENTATION_ERROR("expected an indented block after class definition on line %d", a->lineno) @}

invalid_double_starred_kvpairs:
    | ','.double_starred_kvpair+ ',' invalid_kvpair
    | expression ':' a='*' bitwise_or @{ RAISE_SYNTAX_ERROR_STARTING_FROM(a, "cannot use a starred expression in a dictionary value") @}
    | expression a=':' &('@}'|',') @{ RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "expression expected after dictionary key and ':'") @}
invalid_kvpair:
    | a=expression !(':') @{
        RAISE_ERROR_KNOWN_LOCATION(p, PyExc_SyntaxError, a->lineno, a->end_col_offset - 1, a->end_lineno, -1, "':' expected after dictionary key") @}
    | expression ':' a='*' bitwise_or @{ RAISE_SYNTAX_ERROR_STARTING_FROM(a, "cannot use a starred expression in a dictionary value") @}
    | expression a=':' &('@}'|',') @{RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "expression expected after dictionary key and ':'") @}
invalid_starred_expression_unpacking:
    | a='*' expression '=' b=expression @{ RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "cannot assign to iterable argument unpacking") @}
invalid_starred_expression:
    | '*' @{ RAISE_SYNTAX_ERROR("Invalid star expression") @}

invalid_fstring_replacement_field:
    | '@{' a='=' @{ RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "f-string: valid expression required before '='") @}
    | '@{' a='!' @{ RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "f-string: valid expression required before '!'") @}
    | '@{' a=':' @{ RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "f-string: valid expression required before ':'") @}
    | '@{' a='@}' @{ RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "f-string: valid expression required before '@}'") @}
    | '@{' !annotated_rhs @{ RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("f-string: expecting a valid expression after '@{'") @}
    | '@{' annotated_rhs !('=' | '!' | ':' | '@}') @{
        PyErr_Occurred() ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("f-string: expecting '=', or '!', or ':', or '@}'") @}
    | '@{' annotated_rhs '=' !('!' | ':' | '@}') @{
        PyErr_Occurred() ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("f-string: expecting '!', or ':', or '@}'") @}
    | '@{' annotated_rhs '='? invalid_fstring_conversion_character
    | '@{' annotated_rhs '='? ['!' NAME] !(':' | '@}') @{
        PyErr_Occurred() ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("f-string: expecting ':' or '@}'") @}
    | '@{' annotated_rhs '='? ['!' NAME] ':' fstring_format_spec* !'@}' @{
        PyErr_Occurred() ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("f-string: expecting '@}', or format specs") @}
    | '@{' annotated_rhs '='? ['!' NAME] !'@}' @{
        PyErr_Occurred() ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("f-string: expecting '@}'") @}

invalid_fstring_conversion_character:
    | '!' &(':' | '@}') @{ RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("f-string: missing conversion character") @}
    | '!' !NAME @{ RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("f-string: invalid conversion character") @}

invalid_tstring_replacement_field:
    | '@{' a='=' @{ RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "t-string: valid expression required before '='") @}
    | '@{' a='!' @{ RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "t-string: valid expression required before '!'") @}
    | '@{' a=':' @{ RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "t-string: valid expression required before ':'") @}
    | '@{' a='@}' @{ RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "t-string: valid expression required before '@}'") @}
    | '@{' !annotated_rhs @{ RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("t-string: expecting a valid expression after '@{'") @}
    | '@{' annotated_rhs !('=' | '!' | ':' | '@}') @{
        PyErr_Occurred() ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("t-string: expecting '=', or '!', or ':', or '@}'") @}
    | '@{' annotated_rhs '=' !('!' | ':' | '@}') @{
        PyErr_Occurred() ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("t-string: expecting '!', or ':', or '@}'") @}
    | '@{' annotated_rhs '='? invalid_tstring_conversion_character
    | '@{' annotated_rhs '='? ['!' NAME] !(':' | '@}') @{
        PyErr_Occurred() ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("t-string: expecting ':' or '@}'") @}
    | '@{' annotated_rhs '='? ['!' NAME] ':' fstring_format_spec* !'@}' @{
        PyErr_Occurred() ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("t-string: expecting '@}', or format specs") @}
    | '@{' annotated_rhs '='? ['!' NAME] !'@}' @{
        PyErr_Occurred() ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("t-string: expecting '@}'") @}

invalid_tstring_conversion_character:
    | '!' &(':' | '@}') @{ RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("t-string: missing conversion character") @}
    | '!' !NAME @{ RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("t-string: invalid conversion character") @}

invalid_string_tstring_concat:
    | a=(fstring|string)+ b[expr_ty]=tstring @{
        RAISE_SYNTAX_ERROR_KNOWN_RANGE(PyPegen_last_item(a, expr_ty), b, "cannot mix t-string literals with string or bytes literals") @}
    | a=tstring+ b[expr_ty]=(fstring|string) @{
        RAISE_SYNTAX_ERROR_KNOWN_RANGE(PyPegen_last_item(a, expr_ty), b, "cannot mix t-string literals with string or bytes literals") @}

invalid_arithmetic:
    | sum ('+'|'-'|'*'|'/'|'%'|'//'|'@@') a='not' b=inversion @{ RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "'not' after an operator must be parenthesized") @}
invalid_factor:
    | ('+' | '-' | '~') a='not' b=factor @{ RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "'not' after an operator must be parenthesized") @}

invalid_type_params:
    | '[' token=']' @{
        RAISE_SYNTAX_ERROR_STARTING_FROM(
            token,
            "Type parameter list cannot be empty")@}
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node The Python Standard Library,Extending and Embedding the Python Interpreter,The Python Language Reference,Top
@anchor{library/index doc}@anchor{25f1}@anchor{library/index library-index}@anchor{14a}@anchor{library/index the-python-standard-library}@anchor{25f2}@anchor{library/index translation-repo}@anchor{25f3}
@chapter The Python Standard Library


While @ref{14b,,The Python Language Reference} describes the exact syntax and
semantics of the Python language, this library reference manual
describes the standard library that is distributed with Python. It also
describes some of the optional components that are commonly included
in Python distributions.

Python’s standard library is very extensive, offering a wide range of
facilities as indicated by the long table of contents listed below. The
library contains built-in modules (written in C) that provide access to
system functionality such as file I/O that would otherwise be
inaccessible to Python programmers, as well as modules written in Python
that provide standardized solutions for many problems that occur in
everyday programming. Some of these modules are explicitly designed to
encourage and enhance the portability of Python programs by abstracting
away platform-specifics into platform-neutral APIs.

The Python installers for the Windows platform usually include
the entire standard library and often also include many additional
components. For Unix-like operating systems Python is normally provided
as a collection of packages, so it may be necessary to use the packaging
tools provided with the operating system to obtain some or all of the
optional components.

In addition to the standard library, there is an active collection of
hundreds of thousands of components (from individual programs and modules to
packages and entire application development frameworks), available from
the Python Package Index@footnote{https://pypi.org}.

@c We don't use :numbered: option for the TOC below as it enforces
@c numbered sections for the entire stdlib docs.  If desired,
@c :numbered: can be enabled on a per-module basis.

@menu
* Introduction: Introduction<6>. 
* Built-in Functions:: 
* Built-in Constants:: 
* Built-in Types:: 
* Built-in Exceptions:: 
* Thread Safety Guarantees:: 
* Text Processing Services:: 
* Binary Data Services:: 
* Data Types:: 
* Numeric and Mathematical Modules:: 
* Functional Programming Modules:: 
* File and Directory Access:: 
* Data Persistence:: 
* Data Compression and Archiving:: 
* File Formats:: 
* Cryptographic Services:: 
* Generic Operating System Services:: 
* Command-line interface libraries:: 
* Concurrent Execution:: 
* Networking and Interprocess Communication:: 
* Internet Data Handling:: 
* Structured Markup Processing Tools:: 
* Internet Protocols and Support:: 
* Multimedia Services:: 
* Internationalization:: 
* Graphical user interfaces with Tk:: 
* Development Tools:: 
* Debugging and Profiling:: 
* Software Packaging and Distribution:: 
* Python Runtime Services:: 
* Custom Python Interpreters:: 
* Importing Modules:: 
* Python Language Services:: 
* MS Windows Specific Services:: 
* Unix-specific services:: 
* Modules command-line interface (CLI): Modules command-line interface CLI. 
* Superseded Modules:: 
* Removed Modules:: 
* Security Considerations: Security Considerations<3>. 

@end menu

@node Introduction<6>,Built-in Functions,,The Python Standard Library
@anchor{library/intro doc}@anchor{25f4}@anchor{library/intro introduction}@anchor{25f5}@anchor{library/intro library-intro}@anchor{25f6}
@section Introduction


The “Python library” contains several different kinds of components.

It contains data types that would normally be considered part of the “core” of a
language, such as numbers and lists.  For these types, the Python language core
defines the form of literals and places some constraints on their semantics, but
does not fully define the semantics.  (On the other hand, the language core does
define syntactic properties like the spelling and priorities of operators.)

The library also contains built-in functions and exceptions — objects that can
be used by all Python code without the need of an @ref{7f9,,import} statement.
Some of these are defined by the core language, but many are not essential for
the core semantics and are only described here.

The bulk of the library, however, consists of a collection of modules. There are
many ways to dissect this collection.  Some modules are written in C and built
in to the Python interpreter; others are written in Python and imported in
source form.  Some modules provide interfaces that are highly specific to
Python, like printing a stack trace; some provide interfaces that are specific
to particular operating systems, such as access to specific hardware; others
provide interfaces that are specific to a particular application domain, like
the World Wide Web. Some modules are available in all versions and ports of
Python; others are only available when the underlying system supports or
requires them; yet others are available only when a particular configuration
option was chosen at the time when Python was compiled and installed.

This manual is organized “from the inside out:” it first describes the built-in
functions, data types and exceptions, and finally the modules, grouped in
chapters of related modules.

This means that if you start reading this manual from the start, and skip to the
next chapter when you get bored, you will get a reasonable overview of the
available modules and application areas that are supported by the Python
library.  Of course, you don’t `have' to read it like a novel — you can also
browse the table of contents (in front of the manual), or look for a specific
function, module or term in the index (in the back).  And finally, if you enjoy
learning about random subjects, you choose a random page number (see module
@ref{bd,,random}) and read a section or two.  Regardless of the order in which you
read the sections of this manual, it helps to start with chapter
@ref{1468,,Built-in Functions}, as the remainder of the manual assumes familiarity with
this material.

Let the show begin!

@menu
* Notes on availability:: 

@end menu

@node Notes on availability,,,Introduction<6>
@anchor{library/intro availability}@anchor{2181}@anchor{library/intro notes-on-availability}@anchor{25f7}
@subsection Notes on availability



@itemize *

@item 
An “Availability: Unix” note means that this function is commonly found on
Unix systems.  It does not make any claims about its existence on a specific
operating system.

@item 
If not separately noted, all functions that claim “Availability: Unix” are
supported on macOS, iOS and Android, all of which build on a Unix core.

@item 
If an availability note contains both a minimum Kernel version and a minimum
libc version, then both conditions must hold. For example a feature with note
`Availability: Linux >= 3.17 with glibc >= 2.27' requires both Linux 3.17 or
newer and glibc 2.27 or newer.
@end itemize

@menu
* WebAssembly platforms:: 
* Mobile platforms:: 

@end menu

@node WebAssembly platforms,Mobile platforms,,Notes on availability
@anchor{library/intro wasm-availability}@anchor{1bae}@anchor{library/intro webassembly-platforms}@anchor{25f8}
@subsubsection WebAssembly platforms


The WebAssembly@footnote{https://webassembly.org/} platforms @code{wasm32-emscripten} (Emscripten@footnote{https://emscripten.org/}) and
@code{wasm32-wasi} (WASI@footnote{https://wasi.dev/}) provide a subset of POSIX APIs. WebAssembly runtimes
and browsers are sandboxed and have limited access to the host and external
resources. Any Python standard library module that uses processes, threading,
networking, signals, or other forms of inter-process communication (IPC), is
either not available or may not work as on other Unix-like systems. File I/O,
file system, and Unix permission-related functions are restricted, too.
Emscripten does not permit blocking I/O. Other blocking operations like
@ref{8ae,,sleep()} block the browser event loop.

The properties and behavior of Python on WebAssembly platforms depend on the
Emscripten@footnote{https://emscripten.org/}-SDK or WASI@footnote{https://wasi.dev/}-SDK version, WASM runtimes (browser, NodeJS,
wasmtime@footnote{https://wasmtime.dev/}), and Python build time flags. WebAssembly, Emscripten, and WASI
are evolving standards; some features like networking may be
supported in the future.

For Python in the browser, users should consider Pyodide@footnote{https://pyodide.org/} or PyScript@footnote{https://pyscript.net/}.
PyScript is built on top of Pyodide, which itself is built on top of
CPython and Emscripten. Pyodide provides access to browsers’ JavaScript and
DOM APIs as well as limited networking capabilities with JavaScript’s
@code{XMLHttpRequest} and @code{Fetch} APIs.


@itemize *

@item 
Process-related APIs are not available or always fail with an error. That
includes APIs that spawn new processes (@ref{4b6,,fork()},
@ref{1305,,execve()}), wait for processes (@ref{fa0,,waitpid()}), send signals
(@ref{1573,,kill()}), or otherwise interact with processes. The
@ref{dc,,subprocess} is importable but does not work.

@item 
The @ref{d1,,socket} module is available, but is limited and behaves
differently from other platforms. On Emscripten, sockets are always
non-blocking and require additional JavaScript code and helpers on the
server to proxy TCP through WebSockets; see Emscripten Networking@footnote{https://emscripten.org/docs/porting/networking.html}
for more information. WASI snapshot preview 1 only permits sockets from an
existing file descriptor.

@item 
Some functions are stubs that either don’t do anything and always return
hardcoded values.

@item 
Functions related to file descriptors, file permissions, file ownership, and
links are limited and don’t support some operations. For example, WASI does
not permit symlinks with absolute file names.
@end itemize
@anchor{library/intro mobile-availability}@anchor{22a0}
@node Mobile platforms,,WebAssembly platforms,Notes on availability
@anchor{library/intro ios-availability}@anchor{25f9}@anchor{library/intro mobile-platforms}@anchor{25fa}
@subsubsection Mobile platforms


Android and iOS are, in most respects, POSIX operating systems. File I/O, socket handling,
and threading all behave as they would on any POSIX operating system. However,
there are several major differences:


@itemize *

@item 
Mobile platforms can only use Python in “embedded” mode. There is no Python
REPL, and no ability to use separate executables such as @code{python} or
@code{pip}. To add Python code to your mobile app, you must use
the @ref{229f,,Python embedding API}. For more details, see
@ref{229d,,Using Python on Android} and @ref{22a5,,Using Python on iOS}.

@item 
Subprocesses:


@itemize *

@item 
On Android, creating subprocesses is possible but officially unsupported@footnote{https://issuetracker.google.com/issues/128554619#comment4}.
In particular, Android does not support any part of the System V IPC API,
so @ref{98,,multiprocessing} is not available.

@item 
An iOS app cannot use any form of subprocessing, multiprocessing, or
inter-process communication. If an iOS app attempts to create a subprocess,
the process creating the subprocess will either lock up, or crash. An iOS app
has no visibility of other applications that are running, nor any ability to
communicate with other running applications, outside of the iOS-specific APIs
that exist for this purpose.
@end itemize

@item 
Mobile apps have limited access to modify system resources (such as the system
clock). These resources will often be `readable', but attempts to modify
those resources will usually fail.

@item 
Console input and output:


@itemize *

@item 
On Android, the native @code{stdout} and @code{stderr} are not connected to
anything, so Python installs its own streams which redirect messages to the
system log. These can be seen under the tags @code{python.stdout} and
@code{python.stderr} respectively.

@item 
iOS apps have a limited concept of console output. @code{stdout} and
@code{stderr} `exist', and content written to @code{stdout} and @code{stderr} will be
visible in logs when running in Xcode, but this content `won’t' be recorded
in the system log. If a user who has installed your app provides their app
logs as a diagnostic aid, they will not include any detail written to
@code{stdout} or @code{stderr}.

@item 
Mobile apps have no usable @code{stdin} at all. While apps can display an on-screen
keyboard, this is a software feature, not something that is attached to
@code{stdin}.

As a result, Python modules that involve console manipulation (such as
@ref{2f,,curses} and @ref{bf,,readline}) are not available on mobile platforms.
@end itemize
@end itemize

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c XXX document all delegations to __special__ methods

@node Built-in Functions,Built-in Constants,Introduction<6>,The Python Standard Library
@anchor{library/functions doc}@anchor{25fb}@anchor{library/functions built-in-funcs}@anchor{1468}@anchor{library/functions built-in-functions}@anchor{25fc}@anchor{library/functions translation-repo}@anchor{25fd}
@section Built-in Functions


The Python interpreter has a number of functions and types built into it that
are always available.  They are listed here in alphabetical order.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Built-in Functions

@tab

@tab

@tab

@item


@display
`A'@w{ }
@ref{20d1,,abs()}@w{ }
@ref{9db,,aiter()}@w{ }
@ref{162e,,all()}@w{ }
@ref{9dc,,anext()}@w{ }
@ref{162d,,any()}@w{ }
@ref{15f2,,ascii()}@w{ }
@w{ }
`B'@w{ }
@ref{14b4,,bin()}@w{ }
@ref{3c1,,bool()}@w{ }
@ref{273,,breakpoint()}@w{ }
@ref{1edd,,bytearray()}@w{ }
@ref{1edc,,bytes()}@w{ }
@w{ }
`C'@w{ }
@ref{13d2,,callable()}@w{ }
@ref{1a33,,chr()}@w{ }
@ref{48f,,classmethod()}@w{ }
@ref{4b2,,compile()}@w{ }
@ref{198,,complex()}@w{ }
@w{ }
`D'@w{ }
@ref{25fe,,delattr()}@w{ }
@ref{25ff,,dict()}@w{ }
@ref{845,,dir()}@w{ }
@ref{b9f,,divmod()}@w{ }
@w{ }
@end display



@tab


@display
`E'@w{ }
@ref{168d,,enumerate()}@w{ }
@ref{4a4,,eval()}@w{ }
@ref{4a3,,exec()}@w{ }
@w{ }
`F'@w{ }
@ref{a6a,,filter()}@w{ }
@ref{197,,float()}@w{ }
@ref{19a,,format()}@w{ }
@ref{2600,,frozenset()}@w{ }
@w{ }
`G'@w{ }
@ref{dd0,,getattr()}@w{ }
@ref{1c4d,,globals()}@w{ }
@w{ }
`H'@w{ }
@ref{6fa,,hasattr()}@w{ }
@ref{802,,hash()}@w{ }
@ref{ada,,help()}@w{ }
@ref{14db,,hex()}@w{ }
@w{ }
`I'@w{ }
@ref{162f,,id()}@w{ }
@ref{14e4,,input()}@w{ }
@ref{19c,,int()}@w{ }
@ref{2af,,isinstance()}@w{ }
@ref{9ca,,issubclass()}@w{ }
@ref{9dd,,iter()}@w{ }
@end display



@tab


@display
`L'@w{ }
@ref{841,,len()}@w{ }
@ref{2601,,list()}@w{ }
@ref{46f,,locals()}@w{ }
@w{ }
`M'@w{ }
@ref{1a0,,map()}@w{ }
@ref{1112,,max()}@w{ }
@ref{2602,,memoryview()}@w{ }
@ref{1111,,min()}@w{ }
@w{ }
`N'@w{ }
@ref{9de,,next()}@w{ }
@w{ }
`O'@w{ }
@ref{c84,,object()}@w{ }
@ref{14da,,oct()}@w{ }
@ref{318,,open()}@w{ }
@ref{237f,,ord()}@w{ }
@w{ }
`P'@w{ }
@ref{1a5,,pow()}@w{ }
@ref{117b,,print()}@w{ }
@ref{4b4,,property()}@w{ }
@w{ }
@w{ }
@w{ }
@w{ }
@end display



@tab


@display
`R'@w{ }
@ref{2603,,range()}@w{ }
@ref{1c3,,repr()}@w{ }
@ref{a6b,,reversed()}@w{ }
@ref{14e6,,round()}@w{ }
@w{ }
`S'@w{ }
@ref{2604,,set()}@w{ }
@ref{2605,,setattr()}@w{ }
@ref{695,,slice()}@w{ }
@ref{dcd,,sorted()}@w{ }
@ref{451,,staticmethod()}@w{ }
@ref{2606,,str()}@w{ }
@ref{696,,sum()}@w{ }
@ref{1a7,,super()}@w{ }
@w{ }
`T'@w{ }
@ref{2607,,tuple()}@w{ }
@ref{f4a,,type()}@w{ }
@w{ }
`V'@w{ }
@ref{1e65,,vars()}@w{ }
@w{ }
`Z'@w{ }
@ref{1a1,,zip()}@w{ }
@w{ }
`_'@w{ }
@ref{ad7,,__import__()}@w{ }
@end display



@end multitable


@c using :func:`dict` would create a link to another page, so local targets are
@c used, with replacement texts to make the output in the table consistent

@geindex built-in function; abs()
@anchor{library/functions abs}@anchor{20d1}
@deffn {Function} abs (number, /)

Return the absolute value of a number.  The argument may be an
integer, a floating-point number, or an object implementing
@ref{244c,,__abs__()}.
If the argument is a complex number, its magnitude is returned.
@end deffn

@geindex built-in function; aiter()
@anchor{library/functions aiter}@anchor{9db}
@deffn {Function} aiter (async_iterable, /)

Return an @ref{4c8,,asynchronous iterator} for an @ref{f7a,,asynchronous iterable}.
Equivalent to calling @code{x.__aiter__()}.

Note: Unlike @ref{9dd,,iter()}, @code{aiter()} has no 2-argument variant.


Added in version 3.10.

@end deffn

@geindex built-in function; all()
@anchor{library/functions all}@anchor{162e}
@deffn {Function} all (iterable, /)

Return @code{True} if all elements of the `iterable' are true (or if the iterable
is empty).  Equivalent to:

@example
def all(iterable):
    for element in iterable:
        if not element:
            return False
    return True
@end example
@end deffn

@geindex built-in function; anext()
@anchor{library/functions anext}@anchor{9dc}
@deffn {Function} awaitable anext (async_iterator, /)

@deffnx {Function} awaitable anext (async_iterator, default, /)

When awaited, return the next item from the given @ref{4c8,,asynchronous iterator}, or `default' if given and the iterator is exhausted.

This is the async variant of the @ref{9de,,next()} builtin, and behaves
similarly.

This calls the @ref{18ca,,__anext__()} method of `async_iterator',
returning an @ref{4ca,,awaitable}. Awaiting this returns the next value of the
iterator. If `default' is given, it is returned if the iterator is exhausted,
otherwise @ref{1e52,,StopAsyncIteration} is raised.


Added in version 3.10.

@end deffn

@geindex built-in function; any()
@anchor{library/functions any}@anchor{162d}
@deffn {Function} any (iterable, /)

Return @code{True} if any element of the `iterable' is true.  If the iterable
is empty, return @code{False}.  Equivalent to:

@example
def any(iterable):
    for element in iterable:
        if element:
            return True
    return False
@end example
@end deffn

@geindex built-in function; ascii()
@anchor{library/functions ascii}@anchor{15f2}
@deffn {Function} ascii (object, /)

As @ref{1c3,,repr()}, return a string containing a printable representation of an
object, but escape the non-ASCII characters in the string returned by
@code{repr()} using @code{\x}, @code{\u}, or @code{\U} escapes.  This generates a string
similar to that returned by @code{repr()} in Python 2.
@end deffn

@geindex built-in function; bin()
@anchor{library/functions bin}@anchor{14b4}
@deffn {Function} bin (integer, /)

Convert an integer number to a binary string prefixed with “0b”. The result
is a valid Python expression. If `integer' is not a Python @ref{19c,,int} object, it
has to define an @ref{19f,,__index__()} method that returns an integer. Some
examples:

@example
>>> bin(3)
'0b11'
>>> bin(-10)
'-0b1010'
@end example

If the prefix “0b” is desired or not, you can use either of the following ways.

@example
>>> format(14, '#b'), format(14, 'b')
('0b1110', '1110')
>>> f'@{14:#b@}', f'@{14:b@}'
('0b1110', '1110')
@end example

See also @ref{17df,,enum.bin()} to represent negative values as twos-complement.

See also @ref{19a,,format()} for more information.
@end deffn

@geindex bool (built-in class)
@anchor{library/functions bool}@anchor{3c1}
@deffn {Class} bool (object=False, /)

Return a Boolean value, i.e. one of @code{True} or @code{False}.  The argument
is converted using the standard @ref{18a1,,truth testing procedure}.
If the argument is false
or omitted, this returns @code{False}; otherwise, it returns @code{True}.  The
@code{bool} class is a subclass of @ref{19c,,int} (see @ref{201e,,Numeric Types — int@comma{} float@comma{} complex}).
It cannot be subclassed further.  Its only instances are @code{False} and
@code{True} (see @ref{2608,,Boolean Type - bool}).

@geindex Boolean; type


Changed in version 3.7: The parameter is now positional-only.

@end deffn

@geindex built-in function; breakpoint()
@anchor{library/functions breakpoint}@anchor{273}
@deffn {Function} breakpoint (*args, **kws)

This function drops you into the debugger at the call site.  Specifically,
it calls @ref{cd7,,sys.breakpointhook()}, passing @code{args} and @code{kws} straight
through.  By default, @code{sys.breakpointhook()} calls
@ref{274,,pdb.set_trace()} expecting no arguments.  In this case, it is
purely a convenience function so you don’t have to explicitly import
@ref{aa,,pdb} or type as much code to enter the debugger.  However,
@code{sys.breakpointhook()} can be set to some other function and
@code{breakpoint()} will automatically call that, allowing you to drop into
the debugger of choice.
If @code{sys.breakpointhook()} is not accessible, this function will
raise @ref{246,,RuntimeError}.

By default, the behavior of @code{breakpoint()} can be changed with
the 
@geindex PYTHONBREAKPOINT
@geindex environment variable; PYTHONBREAKPOINT
@ref{cd8,,PYTHONBREAKPOINT} environment variable.
See @ref{cd7,,sys.breakpointhook()} for usage details.

Note that this is not guaranteed if @ref{cd7,,sys.breakpointhook()}
has been replaced.

Raises an @ref{1cb1,,auditing event} @code{builtins.breakpoint} with argument @code{breakpointhook}.


Added in version 3.7.

@end deffn

@anchor{library/functions func-bytearray}@anchor{1edd}
@deffn {Class} bytearray (source=b'@w{'})

@deffnx {Class} bytearray (source, encoding, errors='strict')

Return a new array of bytes.  The @ref{342,,bytearray} class is a mutable
sequence of integers in the range 0 <= x < 256.  It has most of the usual
methods of mutable sequences, described in @ref{2609,,Mutable Sequence Types}, as well
as most methods that the @ref{193,,bytes} type has, see @ref{260a,,Bytes and Bytearray Operations}.

The optional `source' parameter can be used to initialize the array in a few
different ways:


@itemize *

@item 
If it is a `string', you must also give the `encoding' (and optionally,
`errors') parameters; @ref{342,,bytearray()} then converts the string to
bytes using @ref{ad8,,str.encode()}.

@item 
If it is an `integer', the array will have that size and will be
initialized with null bytes.

@item 
If it is an object conforming to the @ref{262,,buffer interface},
a read-only buffer of the object will be used to initialize the bytes array.

@item 
If it is an `iterable', it must be an iterable of integers in the range
@code{0 <= x < 256}, which are used as the initial contents of the array.
@end itemize

Without an argument, an array of size 0 is created.

See also @ref{260b,,Binary Sequence Types — bytes@comma{} bytearray@comma{} memoryview} and @ref{260c,,Bytearray Objects}.
@end deffn

@anchor{library/functions func-bytes}@anchor{1edc}
@deffn {Class} bytes (source=b'@w{'})

@deffnx {Class} bytes (source, encoding, errors='strict')

Return a new “bytes” object which is an immutable sequence of integers in
the range @code{0 <= x < 256}.  @ref{193,,bytes} is an immutable version of
@ref{342,,bytearray} – it has the same non-mutating methods and the same
indexing and slicing behavior.

Accordingly, constructor arguments are interpreted as for @ref{342,,bytearray()}.

Bytes objects can also be created with literals, see @ref{22e3,,String and Bytes literals}.

See also @ref{260b,,Binary Sequence Types — bytes@comma{} bytearray@comma{} memoryview}, @ref{260d,,Bytes Objects}, and @ref{260a,,Bytes and Bytearray Operations}.
@end deffn

@geindex built-in function; callable()
@anchor{library/functions callable}@anchor{13d2}
@deffn {Function} callable (object, /)

Return @ref{e0d,,True} if the `object' argument appears callable,
@ref{d31,,False} if not.  If this returns @code{True}, it is still possible that a
call fails, but if it is @code{False}, calling `object' will never succeed.
Note that classes are callable (calling a class returns a new instance);
instances are callable if their class has a @ref{77b,,__call__()} method.


Added in version 3.2: This function was first removed in Python 3.0 and then brought back
in Python 3.2.

@end deffn

@geindex built-in function; chr()
@anchor{library/functions chr}@anchor{1a33}
@deffn {Function} chr (codepoint, /)

Return the string representing a character with the specified Unicode code point.
For example, @code{chr(97)} returns the string @code{'a'}, while
@code{chr(8364)} returns the string @code{'€'}. This is the inverse of @ref{237f,,ord()}.

The valid range for the argument is from 0 through 1,114,111 (0x10FFFF in
base 16).  @ref{2ee,,ValueError} will be raised if it is outside that range.
@end deffn

@geindex built-in function; classmethod()
@anchor{library/functions classmethod}@anchor{48f}
@deffn {Function} @@classmethod

Transform a method into a class method.

A class method receives the class as an implicit first argument, just like an
instance method receives the instance. To declare a class method, use this
idiom:

@example
class C:
    @@classmethod
    def f(cls, arg1, arg2): ...
@end example

The @code{@@classmethod} form is a function @ref{93f,,decorator} – see
@ref{205c,,Function definitions} for details.

A class method can be called either on the class (such as @code{C.f()}) or on an instance (such
as @code{C().f()}).  The instance is ignored except for its class. If a class
method is called for a derived class, the derived class object is passed as the
implied first argument.

Class methods are different than C++ or Java static methods. If you want those,
see @ref{451,,staticmethod()} in this section.
For more information on class methods, see @ref{2373,,The standard type hierarchy}.


Changed in version 3.9: Class methods can now wrap other @ref{18c9,,descriptors} such as
@ref{4b4,,property()}.



Changed in version 3.10: Class methods now inherit the method attributes
(@ref{238e,,__module__}, @ref{14e0,,__name__},
@ref{238d,,__qualname__}, @ref{13e5,,__doc__} and
@ref{13e4,,__annotations__}) and have a new @code{__wrapped__}
attribute.



Deprecated since version 3.11, removed in version 3.13: Class methods can no longer wrap other @ref{18c9,,descriptors} such as
@ref{4b4,,property()}.

@end deffn

@geindex built-in function; compile()
@anchor{library/functions compile}@anchor{4b2}
@deffn {Function} compile (source, filename, mode, flags=0, dont_inherit=False, optimize=-1)

Compile the `source' into a code or AST object.  Code objects can be executed
by @ref{4a3,,exec()} or @ref{4a4,,eval()}.  `source' can either be a normal string, a
byte string, or an AST object.  Refer to the @ref{9,,ast} module documentation
for information on how to work with AST objects.

The `filename' argument should give the file from which the code was read;
pass some recognizable value if it wasn’t read from a file (@code{'<string>'} is
commonly used).

The `mode' argument specifies what kind of code must be compiled; it can be
@code{'exec'} if `source' consists of a sequence of statements, @code{'eval'} if it
consists of a single expression, or @code{'single'} if it consists of a single
interactive statement (in the latter case, expression statements that
evaluate to something other than @code{None} will be printed).

The optional arguments `flags' and `dont_inherit' control which
@ref{260e,,compiler options} should be activated
and which @ref{45b,,future features} should be allowed. If neither
is present (or both are zero) the code is compiled with the same flags that
affect the code that is calling @code{compile()}. If the `flags'
argument is given and `dont_inherit' is not (or is zero) then the compiler
options and the future statements specified by the `flags' argument are used
in addition to those that would be used anyway. If `dont_inherit' is a
non-zero integer then the `flags' argument is it – the flags (future
features and compiler options) in the surrounding code are ignored.

Compiler options and future statements are specified by bits which can be
bitwise ORed together to specify multiple options. The bitfield required to
specify a given future feature can be found as the
@ref{23da,,compiler_flag} attribute on the
@ref{260f,,_Feature} instance in the @ref{0,,__future__} module.
@ref{260e,,Compiler flags} can be found in @ref{9,,ast}
module, with @code{PyCF_} prefix.

The argument `optimize' specifies the optimization level of the compiler; the
default value of @code{-1} selects the optimization level of the interpreter as
given by @ref{18d,,-O} options.  Explicit levels are @code{0} (no optimization;
@code{__debug__} is true), @code{1} (asserts are removed, @code{__debug__} is false)
or @code{2} (docstrings are removed too).

This function raises @ref{18f,,SyntaxError} or @ref{2ee,,ValueError} if the compiled
source is invalid.

If you want to parse Python code into its AST representation, see
@ref{1c4,,ast.parse()}.


Raises an @ref{1cb1,,auditing event} @code{compile} with arguments
@code{source} and @code{filename}. This event may also be raised by implicit
compilation.


@cartouche
@quotation Note 
When compiling a string with multi-line code in @code{'single'} or
@code{'eval'} mode, input must be terminated by at least one newline
character.  This is to facilitate detection of incomplete and complete
statements in the @ref{1b,,code} module.
@end quotation
@end cartouche

@cartouche
@quotation Warning 
It is possible to crash the Python interpreter with a
sufficiently large/complex string when compiling to an AST
object due to stack depth limitations in Python’s AST compiler.
@end quotation
@end cartouche


Changed in version 3.2: Allowed use of Windows and Mac newlines.  Also, input in @code{'exec'} mode
does not have to end in a newline anymore.  Added the `optimize' parameter.



Changed in version 3.5: Previously, @ref{199,,TypeError} was raised when null bytes were encountered
in `source'.



Added in version 3.8: @code{ast.PyCF_ALLOW_TOP_LEVEL_AWAIT} can now be passed in flags to enable
support for top-level @code{await}, @code{async for}, and @code{async with}.

@end deffn

@geindex complex (built-in class)
@anchor{library/functions complex}@anchor{198}
@deffn {Class} complex (number=0, /)

@deffnx {Class} complex (string, /)

@deffnx {Class} complex (real=0, imag=0)

Convert a single string or number to a complex number, or create a
complex number from real and imaginary parts.

Examples:

@example
>>> complex('+1.23')
(1.23+0j)
>>> complex('-4.5j')
-4.5j
>>> complex('-1.23+4.5j')
(-1.23+4.5j)
>>> complex('\t( -1.23+4.5J )\n')
(-1.23+4.5j)
>>> complex('-Infinity+NaNj')
(-inf+nanj)
>>> complex(1.23)
(1.23+0j)
>>> complex(imag=-4.5)
-4.5j
>>> complex(-1.23, 4.5)
(-1.23+4.5j)
@end example

If the argument is a string, it must contain either a real part (in the
same format as for @ref{197,,float()}) or an imaginary part (in the same
format but with a @code{'j'} or @code{'J'} suffix), or both real and imaginary
parts (the sign of the imaginary part is mandatory in this case).
The string can optionally be surrounded by whitespaces and the round
parentheses @code{'('} and @code{')'}, which are ignored.
The string must not contain whitespace between @code{'+'}, @code{'-'}, the
@code{'j'} or @code{'J'} suffix, and the decimal number.
For example, @code{complex('1+2j')} is fine, but @code{complex('1 + 2j')} raises
@ref{2ee,,ValueError}.
More precisely, the input must conform to the @ref{2610,,complexvalue}
production rule in the following grammar, after parentheses and leading and
trailing whitespace characters are removed:

@example
@anchor{library/functions grammar-token-float-complexvalue}@anchor{2610}complexvalue: @ref{2611,,floatvalue} |
              @ref{2611,,floatvalue} ("j" | "J") |
              @ref{2611,,floatvalue} @ref{2612,,sign} @ref{2613,,absfloatvalue} ("j" | "J")
@end example

If the argument is a number, the constructor serves as a numeric
conversion like @ref{19c,,int} and @ref{197,,float}.
For a general Python object @code{x}, @code{complex(x)} delegates to
@code{x.__complex__()}.
If @ref{7fe,,__complex__()} is not defined then it falls back
to @ref{bc7,,__float__()}.
If @code{__float__()} is not defined then it falls back
to @ref{19f,,__index__()}.

If two arguments are provided or keyword arguments are used, each argument
may be any numeric type (including complex).
If both arguments are real numbers, return a complex number with the real
component `real' and the imaginary component `imag'.
If both arguments are complex numbers, return a complex number with the real
component @code{real.real-imag.imag} and the imaginary component
@code{real.imag+imag.real}.
If one of arguments is a real number, only its real component is used in
the above expressions.

See also @ref{196,,complex.from_number()} which only accepts a single numeric argument.

If all arguments are omitted, returns @code{0j}.

The complex type is described in @ref{201e,,Numeric Types — int@comma{} float@comma{} complex}.


Changed in version 3.6: Grouping digits with underscores as in code literals is allowed.



Changed in version 3.8: Falls back to @ref{19f,,__index__()} if @ref{7fe,,__complex__()} and
@ref{bc7,,__float__()} are not defined.



Deprecated since version 3.14: Passing a complex number as the `real' or `imag' argument is now
deprecated; it should only be passed as a single positional argument.

@end deffn

@geindex built-in function; delattr()
@anchor{library/functions delattr}@anchor{25fe}
@deffn {Function} delattr (object, name, /)

This is a relative of @ref{2605,,setattr()}.  The arguments are an object and a
string.  The string must be the name of one of the object’s attributes.  The
function deletes the named attribute, provided the object allows it.  For
example, @code{delattr(x, 'foobar')} is equivalent to @code{del x.foobar}.
`name' need not be a Python identifier (see @code{setattr()}).
@end deffn

@anchor{library/functions func-dict}@anchor{25ff}
@deffn {Class} dict (**kwargs)

@deffnx {Class} dict (mapping, /, **kwargs)

@deffnx {Class} dict (iterable, /, **kwargs)

Create a new dictionary.  The @ref{184,,dict} object is the dictionary class.
See also @ref{cc3,,Mapping Types — dict} for documentation about this class.

For other containers see the built-in @ref{24f,,list}, @ref{185,,set}, and
@ref{614,,tuple} classes, as well as the @ref{1e,,collections} module.
@end deffn

@geindex built-in function; dir()
@anchor{library/functions dir}@anchor{845}
@deffn {Function} dir ()

@deffnx {Function} dir (object, /)

Without arguments, return the list of names in the current local scope.  With an
argument, attempt to return a list of valid attributes for that object.

If the object has a method named @ref{17b9,,__dir__()},
this method will be called and
must return the list of attributes. This allows objects that implement a custom
@ref{6fb,,__getattr__()} or @ref{dd1,,__getattribute__()} function
to customize the way
@code{dir()} reports their attributes.

If the object does not provide @ref{17b9,,__dir__()},
the function tries its best to gather information from the object’s
@ref{77e,,__dict__} attribute, if defined, and
from its type object.  The resulting list is not necessarily complete and may
be inaccurate when the object has a custom @ref{6fb,,__getattr__()}.

The default @code{dir()} mechanism behaves differently with different types of
objects, as it attempts to produce the most relevant, rather than complete,
information:


@itemize *

@item 
If the object is a module object, the list contains the names of the module’s
attributes.

@item 
If the object is a type or class object, the list contains the names of its
attributes, and recursively of the attributes of its bases.

@item 
Otherwise, the list contains the object’s attributes’ names, the names of its
class’s attributes, and recursively of the attributes of its class’s base
classes.
@end itemize

The resulting list is sorted alphabetically.  For example:

@example
>>> import struct
>>> dir()   # show the names in the module namespace
['__builtins__', '__name__', 'struct']
>>> dir(struct)   # show the names in the struct module
['Struct', '__all__', '__builtins__', '__cached__', '__doc__', '__file__',
 '__initializing__', '__loader__', '__name__', '__package__',
 '_clearcache', 'calcsize', 'error', 'pack', 'pack_into',
 'unpack', 'unpack_from']
>>> class Shape:
...     def __dir__(self):
...         return ['area', 'perimeter', 'location']
...
>>> s = Shape()
>>> dir(s)
['area', 'location', 'perimeter']
@end example

@cartouche
@quotation Note 
Because @code{dir()} is supplied primarily as a convenience for use at an
interactive prompt, it tries to supply an interesting set of names more
than it tries to supply a rigorously or consistently defined set of names,
and its detailed behavior may change across releases.  For example,
metaclass attributes are not in the result list when the argument is a
class.
@end quotation
@end cartouche
@end deffn

@geindex built-in function; divmod()
@anchor{library/functions divmod}@anchor{b9f}
@deffn {Function} divmod (a, b, /)

Take two (non-complex) numbers as arguments and return a pair of numbers
consisting of their quotient and remainder when using integer division.  With
mixed operand types, the rules for binary arithmetic operators apply.  For
integers, the result is the same as @code{(a // b, a % b)}. For floating-point
numbers the result is @code{(q, a % b)}, where `q' is usually @code{math.floor(a /
b)} but may be 1 less than that.  In any case @code{q * b + a % b} is very
close to `a', if @code{a % b} is non-zero it has the same sign as `b', and @code{0
<= abs(a % b) < abs(b)}.
@end deffn

@geindex built-in function; enumerate()
@anchor{library/functions enumerate}@anchor{168d}
@deffn {Function} enumerate (iterable, start=0)

Return an enumerate object. `iterable' must be a sequence, an
@ref{4c9,,iterator}, or some other object which supports iteration.
The @ref{14d9,,__next__()} method of the iterator returned by
@code{enumerate()} returns a tuple containing a count (from `start' which
defaults to 0) and the values obtained from iterating over `iterable'.

@example
>>> seasons = ['Spring', 'Summer', 'Fall', 'Winter']
>>> list(enumerate(seasons))
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
>>> list(enumerate(seasons, start=1))
[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]
@end example

Equivalent to:

@example
def enumerate(iterable, start=0):
    n = start
    for elem in iterable:
        yield n, elem
        n += 1
@end example
@end deffn

@geindex built-in function; eval()
@anchor{library/functions func-eval}@anchor{2614}@anchor{library/functions eval}@anchor{4a4}
@deffn {Function} eval (source, /, globals=None, locals=None)

@*Parameters: 

@itemize *

@item 
@code{source} (@ref{16a,,str} | @ref{4e7,,code object}) – A Python expression.

@item 
@code{globals} (@ref{184,,dict} | @code{None}) – The global namespace (default: @code{None}).

@item 
@code{locals} (@ref{13c7,,mapping} | @code{None}) – The local namespace (default: @code{None}).
@end itemize


@*Returns: 
The result of the evaluated expression.


@*Raises: 
Syntax errors are reported as exceptions.


@cartouche
@quotation Warning 
This function executes arbitrary code. Calling it with
untrusted user-supplied input will lead to security vulnerabilities.
@end quotation
@end cartouche

The `source' argument is parsed and evaluated as a Python expression
(technically speaking, a condition list) using the `globals' and `locals'
mappings as global and local namespace.  If the `globals' dictionary is
present and does not contain a value for the key @code{__builtins__}, a
reference to the dictionary of the built-in module @ref{13,,builtins} is
inserted under that key before `source' is parsed.
Overriding @code{__builtins__} can be used to restrict or change the available
names, but this is `not' a security mechanism: the executed code can
still access all builtins.
If the `locals' mapping is omitted it defaults to the
`globals' dictionary.  If both mappings are omitted, the source is
executed with the `globals' and `locals' in the environment where
@code{eval()} is called.  Note, `eval()' will only have access to the
@ref{23d4,,nested scopes} (non-locals) in the enclosing
environment if they are already referenced in the scope that is calling
@code{eval()} (e.g. via a @ref{14b3,,nonlocal} statement).

Example:

@example
>>> x = 1
>>> eval('x+1')
2
@end example

This function can also be used to execute arbitrary code objects (such as
those created by @ref{4b2,,compile()}).  In this case, pass a code object instead
of a string.  If the code object has been compiled with @code{'exec'} as the
`mode' argument, @code{eval()}'s return value will be @code{None}.

Hints: dynamic execution of statements is supported by the @ref{4a3,,exec()}
function.  The @ref{1c4d,,globals()} and @ref{46f,,locals()} functions
return the current global and local dictionary, respectively, which may be
useful to pass around for use by @code{eval()} or @code{exec()}.

If the given source is a string, then leading and trailing spaces and tabs
are stripped.

See @ref{e18,,ast.literal_eval()} for a function to evaluate strings
with expressions containing only literals.


Raises an @ref{1cb1,,auditing event} @code{exec} with the code object
as the argument. Code compilation events may also be raised.



Changed in version 3.13: The `globals' and `locals' arguments can now be passed as keywords.



Changed in version 3.13: The semantics of the default `locals' namespace have been adjusted as
described for the @ref{46f,,locals()} builtin.

@end deffn

@geindex built-in function; exec

@geindex built-in function; exec()
@anchor{library/functions exec}@anchor{4a3}
@deffn {Function} exec (source, /, globals=None, locals=None, *, closure=None)

@cartouche
@quotation Warning 
This function executes arbitrary code. Calling it with
untrusted user-supplied input will lead to security vulnerabilities.
@end quotation
@end cartouche

This function supports dynamic execution of Python code. `source' must be
either a string or a code object.  If it is a string, the string is parsed as
a suite of Python statements which is then executed (unless a syntax error
occurs). @footnote{
Note that the parser only accepts the Unix-style end of line convention.
If you are reading the code from a file, make sure to use newline conversion
mode to convert Windows or Mac-style newlines.
} If it is a code object, it is simply executed.  In all cases,
the code that’s executed is expected to be valid as file input (see the
section @ref{25e5,,File input} in the Reference Manual). Be aware that the
@ref{14b3,,nonlocal}, @ref{bc8,,yield},  and @ref{1b0,,return}
statements may not be used outside of
function definitions even within the context of code passed to the
@code{exec()} function. The return value is @code{None}.

In all cases, if the optional parts are omitted, the code is executed in the
current scope.  If only `globals' is provided, it must be a dictionary
(and not a subclass of dictionary), which
will be used for both the global and the local variables.  If `globals' and
`locals' are given, they are used for the global and local variables,
respectively.  If provided, `locals' can be any mapping object.  Remember
that at the module level, globals and locals are the same dictionary.

@cartouche
@quotation Note 
When @code{exec} gets two separate objects as `globals' and `locals', the
code will be executed as if it were embedded in a class definition. This
means functions and classes defined in the executed code will not be able
to access variables assigned at the top level (as the “top level”
variables are treated as class variables in a class definition).
@end quotation
@end cartouche

If the `globals' dictionary does not contain a value for the key
@code{__builtins__}, a reference to the dictionary of the built-in module
@ref{13,,builtins} is inserted under that key.
Overriding @code{__builtins__} can be used to restrict or change the available
names, but this is `not' a security mechanism: the executed code can
still access all builtins.

The `closure' argument specifies a closure–a tuple of cellvars.
It’s only valid when the `object' is a code object containing
@ref{18da,,free (closure) variables}.
The length of the tuple must exactly match the length of the code object’s
@ref{238b,,co_freevars} attribute.


Raises an @ref{1cb1,,auditing event} @code{exec} with the code object
as the argument. Code compilation events may also be raised.


@cartouche
@quotation Note 
The built-in functions @ref{1c4d,,globals()} and @ref{46f,,locals()} return the current
global and local namespace, respectively, which may be useful to pass around
for use as the second and third argument to @code{exec()}.
@end quotation
@end cartouche

@cartouche
@quotation Note 
The default `locals' act as described for function @ref{46f,,locals()} below.
Pass an explicit `locals' dictionary if you need to see effects of the
code on `locals' after function @code{exec()} returns.
@end quotation
@end cartouche


Changed in version 3.11: Added the `closure' parameter.



Changed in version 3.13: The `globals' and `locals' arguments can now be passed as keywords.



Changed in version 3.13: The semantics of the default `locals' namespace have been adjusted as
described for the @ref{46f,,locals()} builtin.

@end deffn

@geindex built-in function; filter()
@anchor{library/functions filter}@anchor{a6a}
@deffn {Function} filter (function, iterable, /)

Construct an iterator from those elements of `iterable' for which `function'
is true.  `iterable' may be either a sequence, a container which
supports iteration, or an iterator.  If `function' is @code{None}, the identity
function is assumed, that is, all elements of `iterable' that are false are
removed.

Note that @code{filter(function, iterable)} is equivalent to the generator
expression @code{(item for item in iterable if function(item))} if function is
not @code{None} and @code{(item for item in iterable if item)} if function is
@code{None}.

See @ref{2615,,itertools.filterfalse()} for the complementary function that returns
elements of `iterable' for which `function' is false.
@end deffn

@geindex float (built-in class)
@anchor{library/functions float}@anchor{197}
@deffn {Class} float (number=0.0, /)

@deffnx {Class} float (string, /)

@geindex NaN
@geindex Infinity

Return a floating-point number constructed from a number or a string.

Examples:

@example
>>> float('+1.23')
1.23
>>> float('   -12345\n')
-12345.0
>>> float('1e-003')
0.001
>>> float('+1E6')
1000000.0
>>> float('-Infinity')
-inf
@end example

If the argument is a string, it should contain a decimal number, optionally
preceded by a sign, and optionally embedded in whitespace.  The optional
sign may be @code{'+'} or @code{'-'}; a @code{'+'} sign has no effect on the value
produced.  The argument may also be a string representing a NaN
(not-a-number), or positive or negative infinity.
More precisely, the input must conform to the @ref{2611,,floatvalue}
production rule in the following grammar, after leading and trailing
whitespace characters are removed:

@example
@anchor{library/functions grammar-token-float-sign}@anchor{2612}sign:          "+" | "-"
@anchor{library/functions grammar-token-float-infinity}@anchor{2616}infinity:      "Infinity" | "inf"
@anchor{library/functions grammar-token-float-nan}@anchor{2617}nan:           "nan"
@anchor{library/functions grammar-token-float-digit}@anchor{2618}digit:         <a Unicode decimal digit, i.e. characters in Unicode general category Nd>
@anchor{library/functions grammar-token-float-digitpart}@anchor{2619}digitpart:     @ref{2618,,digit} (["_"] @ref{2618,,digit})*
@anchor{library/functions grammar-token-float-number}@anchor{261a}number:        [@ref{2619,,digitpart}] "." @ref{2619,,digitpart} | @ref{2619,,digitpart} ["."]
@anchor{library/functions grammar-token-float-exponent}@anchor{261b}exponent:      ("e" | "E") [@ref{2612,,sign}] @ref{2619,,digitpart}
@anchor{library/functions grammar-token-float-floatnumber}@anchor{261c}floatnumber:   @ref{261a,,number} [@ref{261b,,exponent}]
@anchor{library/functions grammar-token-float-absfloatvalue}@anchor{2613}absfloatvalue: @ref{261c,,floatnumber} | @ref{2616,,infinity} | @ref{2617,,nan}
@anchor{library/functions grammar-token-float-floatvalue}@anchor{2611}floatvalue:    [@ref{2612,,sign}] @ref{2613,,absfloatvalue}
@end example

Case is not significant, so, for example, “inf”, “Inf”, “INFINITY”, and
“iNfINity” are all acceptable spellings for positive infinity.

Otherwise, if the argument is an integer or a floating-point number, a
floating-point number with the same value (within Python’s floating-point
precision) is returned.  If the argument is outside the range of a Python
float, an @ref{a87,,OverflowError} will be raised.

For a general Python object @code{x}, @code{float(x)} delegates to
@code{x.__float__()}.  If @ref{bc7,,__float__()} is not defined then it falls back
to @ref{19f,,__index__()}.

See also @ref{195,,float.from_number()} which only accepts a numeric argument.

If no argument is given, @code{0.0} is returned.

The float type is described in @ref{201e,,Numeric Types — int@comma{} float@comma{} complex}.


Changed in version 3.6: Grouping digits with underscores as in code literals is allowed.



Changed in version 3.7: The parameter is now positional-only.



Changed in version 3.8: Falls back to @ref{19f,,__index__()} if @ref{bc7,,__float__()} is not defined.

@end deffn

@geindex __format__
@geindex string; format() (built-in function)

@geindex built-in function; format()
@anchor{library/functions format}@anchor{19a}
@deffn {Function} format (value, format_spec='@w{'}, /)

Convert a `value' to a “formatted” representation, as controlled by
`format_spec'.  The interpretation of `format_spec' will depend on the type
of the `value' argument; however, there is a standard formatting syntax that
is used by most built-in types: @ref{4fa,,Format specification mini-language}.

The default `format_spec' is an empty string which usually gives the same
effect as calling @ref{16a,,str(value)}.

A call to @code{format(value, format_spec)} is translated to
@code{type(value).__format__(value, format_spec)} which bypasses the instance
dictionary when searching for the value’s @ref{832,,__format__()} method.
A @ref{199,,TypeError} exception is raised if the method search reaches
@ref{c84,,object} and the `format_spec' is non-empty, or if either the
`format_spec' or the return value are not strings.


Changed in version 3.4: @code{object().__format__(format_spec)} raises @ref{199,,TypeError}
if `format_spec' is not an empty string.

@end deffn

@anchor{library/functions func-frozenset}@anchor{2600}
@deffn {Class} frozenset (iterable=(), /)

Return a new @ref{7f3,,frozenset} object, optionally with elements taken from
`iterable'.  @code{frozenset} is a built-in class.  See also
@ref{2075,,Set Types — set@comma{} frozenset} for documentation about this class.

For other containers see the built-in @ref{185,,set}, @ref{24f,,list},
@ref{614,,tuple}, and @ref{184,,dict} classes, as well as the @ref{1e,,collections}
module.
@end deffn

@geindex built-in function; getattr()
@anchor{library/functions getattr}@anchor{dd0}
@deffn {Function} getattr (object, name, /)

@deffnx {Function} getattr (object, name, default, /)

Return the value of the named attribute of `object'.  `name' must be a string.
If the string is the name of one of the object’s attributes, the result is the
value of that attribute.  For example, @code{getattr(x, 'foobar')} is equivalent to
@code{x.foobar}.  If the named attribute does not exist, `default' is returned if
provided, otherwise @ref{5f0,,AttributeError} is raised.
`name' need not be a Python identifier (see @ref{2605,,setattr()}).

@cartouche
@quotation Note 
Since @ref{20e7,,private name mangling} happens at
compilation time, one must manually mangle a private attribute’s
(attributes with two leading underscores) name in order to retrieve it with
@code{getattr()}.
@end quotation
@end cartouche
@end deffn

@geindex built-in function; globals()
@anchor{library/functions globals}@anchor{1c4d}
@deffn {Function} globals ()

Return the dictionary implementing the current module namespace. For code within
functions, this is set when the function is defined and remains the same
regardless of where the function is called.
@end deffn

@geindex built-in function; hasattr()
@anchor{library/functions hasattr}@anchor{6fa}
@deffn {Function} hasattr (object, name, /)

The arguments are an object and a string.  The result is @code{True} if the
string is the name of one of the object’s attributes, @code{False} if not. (This
is implemented by calling @code{getattr(object, name)} and seeing whether it
raises an @ref{5f0,,AttributeError} or not.)
@end deffn

@geindex built-in function; hash()
@anchor{library/functions hash}@anchor{802}
@deffn {Function} hash (object, /)

Return the hash value of the object (if it has one).  Hash values are
integers.  They are used to quickly compare dictionary keys during a
dictionary lookup.  Numeric values that compare equal have the same hash
value (even if they are of different types, as is the case for 1 and 1.0).

@cartouche
@quotation Note 
For objects with custom @ref{cf9,,__hash__()} methods,
note that @code{hash()}
truncates the return value based on the bit width of the host machine.
@end quotation
@end cartouche
@end deffn

@geindex built-in function; help()
@anchor{library/functions help}@anchor{ada}
@deffn {Function} help ()

@deffnx {Function} help (request)

Invoke the built-in help system.  (This function is intended for interactive
use.)  If no argument is given, the interactive help system starts on the
interpreter console.  If the argument is a string, then the string is looked up
as the name of a module, function, class, method, keyword, or documentation
topic, and a help page is printed on the console.  If the argument is any other
kind of object, a help page on the object is generated.

Note that if a slash(/) appears in the parameter list of a function when
invoking @code{help()}, it means that the parameters prior to the slash are
positional-only. For more info, see
@ref{261d,,the FAQ entry on positional-only parameters}.

This function is added to the built-in namespace by the @ref{cc,,site} module.


Changed in version 3.4: Changes to @ref{ba,,pydoc} and @ref{82,,inspect} mean that the reported
signatures for callables are now more comprehensive and consistent.

@end deffn

@geindex built-in function; hex()
@anchor{library/functions hex}@anchor{14db}
@deffn {Function} hex (integer, /)

Convert an integer number to a lowercase hexadecimal string prefixed with
“0x”. If `integer' is not a Python @ref{19c,,int} object, it has to define an
@ref{19f,,__index__()} method that returns an integer. Some examples:

@example
>>> hex(255)
'0xff'
>>> hex(-42)
'-0x2a'
@end example

If you want to convert an integer number to an uppercase or lower hexadecimal
string with prefix or not, you can use either of the following ways:

@example
>>> '%#x' % 255, '%x' % 255, '%X' % 255
('0xff', 'ff', 'FF')
>>> format(255, '#x'), format(255, 'x'), format(255, 'X')
('0xff', 'ff', 'FF')
>>> f'@{255:#x@}', f'@{255:x@}', f'@{255:X@}'
('0xff', 'ff', 'FF')
@end example

See also @ref{19a,,format()} for more information.

See also @ref{19c,,int()} for converting a hexadecimal string to an
integer using a base of 16.

@cartouche
@quotation Note 
To obtain a hexadecimal string representation for a float, use the
@ref{2146,,float.hex()} method.
@end quotation
@end cartouche
@end deffn

@geindex built-in function; id()
@anchor{library/functions id}@anchor{162f}
@deffn {Function} id (object, /)

Return the “identity” of an object.  This is an integer which
is guaranteed to be unique and constant for this object during its lifetime.
Two objects with non-overlapping lifetimes may have the same @code{id()}
value.

`CPython implementation detail:' This is the address of the object in memory.

Raises an @ref{1cb1,,auditing event} @code{builtins.id} with argument @code{id}.
@end deffn

@geindex built-in function; input()
@anchor{library/functions input}@anchor{14e4}
@deffn {Function} input ()

@deffnx {Function} input (prompt, /)

If the `prompt' argument is present, it is written to standard output without
a trailing newline.  The function then reads a line from input, converts it
to a string (stripping a trailing newline), and returns that.  When EOF is
read, @ref{14e5,,EOFError} is raised.  Example:

@example
>>> s = input('--> ')
--> Monty Python's Flying Circus
>>> s
"Monty Python's Flying Circus"
@end example

If the @ref{bf,,readline} module was loaded, then @code{input()} will use it
to provide elaborate line editing and history features.


Raises an @ref{1cb1,,auditing event} @code{builtins.input} with
argument @code{prompt} before reading input



Raises an @ref{1cb1,,auditing event} @code{builtins.input/result}
with the result after successfully reading input.

@end deffn

@geindex int (built-in class)
@anchor{library/functions int}@anchor{19c}
@deffn {Class} int (number=0, /)

@deffnx {Class} int (string, /, base=10)

Return an integer object constructed from a number or a string, or return
@code{0} if no arguments are given.

Examples:

@example
>>> int(123.45)
123
>>> int('123')
123
>>> int('   -12_345\n')
-12345
>>> int('FACE', 16)
64206
>>> int('0xface', 0)
64206
>>> int('01110011', base=2)
115
@end example

If the argument defines @ref{19e,,__int__()},
@code{int(x)} returns @code{x.__int__()}.  If the argument defines
@ref{19f,,__index__()}, it returns @code{x.__index__()}.
For floating-point numbers, this truncates towards zero.

If the argument is not a number or if `base' is given, then it must be a string,
@ref{193,,bytes}, or @ref{342,,bytearray} instance representing an integer
in radix `base'.  Optionally, the string can be preceded by @code{+} or @code{-}
(with no space in between), have leading zeros, be surrounded by whitespace,
and have single underscores interspersed between digits.

A base-n integer string contains digits, each representing a value from 0 to
n-1. The values 0–9 can be represented by any Unicode decimal digit. The
values 10–35 can be represented by @code{a} to @code{z} (or @code{A} to @code{Z}). The
default `base' is 10. The allowed bases are 0 and 2–36. Base-2, -8, and -16
strings can be optionally prefixed with @code{0b}/@code{0B}, @code{0o}/@code{0O}, or
@code{0x}/@code{0X}, as with integer literals in code.  For base 0, the string is
interpreted in a similar way to an @ref{234f,,integer literal in code},
in that the actual base is 2, 8, 10, or 16 as determined by the prefix. Base
0 also disallows leading zeros: @code{int('010', 0)} is not legal, while
@code{int('010')} and @code{int('010', 8)} are.

The integer type is described in @ref{201e,,Numeric Types — int@comma{} float@comma{} complex}.


Changed in version 3.4: If `base' is not an instance of @code{int} and the `base' object has a
@ref{19f,,base.__index__} method, that method is called
to obtain an integer for the base.  Previous versions used
@ref{19e,,base.__int__} instead of @code{base.__index__}.



Changed in version 3.6: Grouping digits with underscores as in code literals is allowed.



Changed in version 3.7: The first parameter is now positional-only.



Changed in version 3.8: Falls back to @ref{19f,,__index__()} if @ref{19e,,__int__()} is not defined.



Changed in version 3.11: @code{int} string inputs and string representations can be limited to
help avoid denial of service attacks. A @ref{2ee,,ValueError} is raised when
the limit is exceeded while converting a string to an @code{int} or
when converting an @code{int} into a string would exceed the limit.
See the @ref{80c,,integer string conversion length limitation} documentation.



Changed in version 3.14: @ref{19c,,int()} no longer delegates to the @ref{19d,,__trunc__()} method.

@end deffn

@geindex built-in function; isinstance()
@anchor{library/functions isinstance}@anchor{2af}
@deffn {Function} isinstance (object, classinfo, /)

Return @code{True} if the `object' argument is an instance of the `classinfo'
argument, or of a (direct, indirect, or @ref{13c2,,virtual}) subclass thereof.  If `object' is not
an object of the given type, the function always returns @code{False}.
If `classinfo' is a tuple of type objects (or recursively, other such
tuples) or a @ref{9cb,,Union Type} of multiple types, return @code{True} if
`object' is an instance of any of the types.
If `classinfo' is not a type or tuple of types and such tuples,
a @ref{199,,TypeError} exception is raised. @code{TypeError} may not be
raised for an invalid type if an earlier check succeeds.


Changed in version 3.10: `classinfo' can be a @ref{9cb,,Union Type}.

@end deffn

@geindex built-in function; issubclass()
@anchor{library/functions issubclass}@anchor{9ca}
@deffn {Function} issubclass (class, classinfo, /)

Return @code{True} if `class' is a subclass (direct, indirect, or @ref{13c2,,virtual}) of `classinfo'.  A
class is considered a subclass of itself. `classinfo' may be a tuple of class
objects (or recursively, other such tuples)
or a @ref{9cb,,Union Type}, in which case return @code{True} if `class' is a
subclass of any entry in `classinfo'.  In any other case, a @ref{199,,TypeError}
exception is raised.


Changed in version 3.10: `classinfo' can be a @ref{9cb,,Union Type}.

@end deffn

@geindex built-in function; iter()
@anchor{library/functions iter}@anchor{9dd}
@deffn {Function} iter (iterable, /)

@deffnx {Function} iter (callable, sentinel, /)

Return an @ref{4c9,,iterator} object.  The first argument is interpreted very
differently depending on the presence of the second argument. Without a
second argument, the single argument must be a collection object which supports the
@ref{1433,,iterable} protocol (the @ref{e6f,,__iter__()} method),
or it must support
the sequence protocol (the @ref{588,,__getitem__()} method with integer arguments
starting at @code{0}).  If it does not support either of those protocols,
@ref{199,,TypeError} is raised. If the second argument, `sentinel', is given,
then the first argument must be a callable object.  The iterator created in this case
will call `callable' with no arguments for each call to its
@ref{14d9,,__next__()} method; if the value returned is equal to
`sentinel', @ref{dfb,,StopIteration} will be raised, otherwise the value will
be returned.

See also @ref{261e,,Iterator Types}.

One useful application of the second form of @code{iter()} is to build a
block-reader. For example, reading fixed-width blocks from a binary
database file until the end of file is reached:

@example
from functools import partial
with open('mydata.db', 'rb') as f:
    for block in iter(partial(f.read, 64), b'@w{'}):
        process_block(block)
@end example
@end deffn

@geindex built-in function; len()
@anchor{library/functions len}@anchor{841}
@deffn {Function} len (object, /)

Return the length (the number of items) of an object.  The argument may be a
sequence (such as a string, bytes, tuple, list, or range) or a collection
(such as a dictionary, set, or frozen set).

`CPython implementation detail:' @code{len} raises @ref{a87,,OverflowError} on lengths larger than
@ref{13d1,,sys.maxsize}, such as @ref{b43,,range(2 ** 100)}.
@end deffn

@anchor{library/functions func-list}@anchor{2601}
@deffn {Class} list (iterable=(), /)

Rather than being a function, @ref{24f,,list} is actually a mutable
sequence type, as documented in @ref{2066,,Lists} and @ref{2072,,Sequence Types — list@comma{} tuple@comma{} range}.
@end deffn

@geindex built-in function; locals()
@anchor{library/functions locals}@anchor{46f}
@deffn {Function} locals ()

Return a mapping object representing the current local symbol table, with
variable names as the keys, and their currently bound references as the
values.

At module scope, as well as when using @ref{4a3,,exec()} or @ref{4a4,,eval()} with
a single namespace, this function returns the same namespace as
@ref{1c4d,,globals()}.

At class scope, it returns the namespace that will be passed to the
metaclass constructor.

When using @code{exec()} or @code{eval()} with separate local and global
arguments, it returns the local namespace passed in to the function call.

In all of the above cases, each call to @code{locals()} in a given frame of
execution will return the `same' mapping object. Changes made through
the mapping object returned from @code{locals()} will be visible as assigned,
reassigned, or deleted local variables, and assigning, reassigning, or
deleting local variables will immediately affect the contents of the
returned mapping object.

In an @ref{4a2,,optimized scope} (including functions, generators, and
coroutines), each call to @code{locals()} instead returns a fresh dictionary
containing the current bindings of the function’s local variables and any
nonlocal cell references. In this case, name binding changes made via the
returned dict are `not' written back to the corresponding local variables
or nonlocal cell references, and assigning, reassigning, or deleting local
variables and nonlocal cell references does `not' affect the contents
of previously returned dictionaries.

Calling @code{locals()} as part of a comprehension in a function, generator, or
coroutine is equivalent to calling it in the containing scope, except that
the comprehension’s initialised iteration variables will be included. In
other scopes, it behaves as if the comprehension were running as a nested
function.

Calling @code{locals()} as part of a generator expression is equivalent to
calling it in a nested generator function.


Changed in version 3.12: The behaviour of @code{locals()} in a comprehension has been updated as
described in 
@geindex Python Enhancement Proposals; PEP 709
PEP 709@footnote{https://peps.python.org/pep-0709/}.



Changed in version 3.13: As part of 
@geindex Python Enhancement Proposals; PEP 667
PEP 667@footnote{https://peps.python.org/pep-0667/}, the semantics of mutating the mapping objects
returned from this function are now defined. The behavior in
@ref{4a2,,optimized scopes} is now as described above.
Aside from being defined, the behaviour in other scopes remains
unchanged from previous versions.

@end deffn

@geindex built-in function; map()
@anchor{library/functions map}@anchor{1a0}
@deffn {Function} map (function, iterable, /, *iterables, strict=False)

Return an iterator that applies `function' to every item of `iterable',
yielding the results.  If additional `iterables' arguments are passed,
`function' must take that many arguments and is applied to the items from all
iterables in parallel.  With multiple iterables, the iterator stops when the
shortest iterable is exhausted.  If `strict' is @code{True} and one of the
iterables is exhausted before the others, a @ref{2ee,,ValueError} is raised. For
cases where the function inputs are already arranged into argument tuples,
see @ref{12f0,,itertools.starmap()}.


Changed in version 3.14: Added the `strict' parameter.

@end deffn

@geindex built-in function; max()
@anchor{library/functions max}@anchor{1112}
@deffn {Function} max (iterable, /, *, key=None)

@deffnx {Function} max (iterable, /, *, default, key=None)

@deffnx {Function} max (arg1, arg2, /, *args, key=None)

Return the largest item in an iterable or the largest of two or more
arguments.

If one positional argument is provided, it should be an @ref{1433,,iterable}.
The largest item in the iterable is returned.  If two or more positional
arguments are provided, the largest of the positional arguments is
returned.

There are two optional keyword-only arguments. The `key' argument specifies
a one-argument ordering function like that used for @ref{dce,,list.sort()}. The
`default' argument specifies an object to return if the provided iterable is
empty. If the iterable is empty and `default' is not provided, a
@ref{2ee,,ValueError} is raised.

If multiple items are maximal, the function returns the first one
encountered.  This is consistent with other sort-stability preserving tools
such as @code{sorted(iterable, key=keyfunc, reverse=True)[0]} and
@code{heapq.nlargest(1, iterable, key=keyfunc)}.


Changed in version 3.4: Added the `default' keyword-only parameter.



Changed in version 3.8: The `key' can be @code{None}.

@end deffn

@anchor{library/functions func-memoryview}@anchor{2602}
@deffn {Class} memoryview (object)

Return a “memory view” object created from the given argument.  See
@ref{261f,,Memory Views} for more information.
@end deffn

@geindex built-in function; min()
@anchor{library/functions min}@anchor{1111}
@deffn {Function} min (iterable, /, *, key=None)

@deffnx {Function} min (iterable, /, *, default, key=None)

@deffnx {Function} min (arg1, arg2, /, *args, key=None)

Return the smallest item in an iterable or the smallest of two or more
arguments.

If one positional argument is provided, it should be an @ref{1433,,iterable}.
The smallest item in the iterable is returned.  If two or more positional
arguments are provided, the smallest of the positional arguments is
returned.

There are two optional keyword-only arguments. The `key' argument specifies
a one-argument ordering function like that used for @ref{dce,,list.sort()}. The
`default' argument specifies an object to return if the provided iterable is
empty. If the iterable is empty and `default' is not provided, a
@ref{2ee,,ValueError} is raised.

If multiple items are minimal, the function returns the first one
encountered.  This is consistent with other sort-stability preserving tools
such as @code{sorted(iterable, key=keyfunc)[0]} and @code{heapq.nsmallest(1,
iterable, key=keyfunc)}.


Changed in version 3.4: Added the `default' keyword-only parameter.



Changed in version 3.8: The `key' can be @code{None}.

@end deffn

@geindex built-in function; next()
@anchor{library/functions next}@anchor{9de}
@deffn {Function} next (iterator, /)

@deffnx {Function} next (iterator, default, /)

Retrieve the next item from the @ref{4c9,,iterator} by calling its
@ref{14d9,,__next__()} method.  If `default' is given, it is returned
if the iterator is exhausted, otherwise @ref{dfb,,StopIteration} is raised.
@end deffn

@geindex object (built-in class)
@anchor{library/functions object}@anchor{c84}
@deffn {Class} object

This is the ultimate base class of all other classes. It has methods
that are common to all instances of Python classes. When the constructor
is called, it returns a new featureless object. The constructor does not
accept any arguments.

@cartouche
@quotation Note 
@code{object} instances do `not' have @ref{77e,,__dict__}
attributes, so you can’t assign arbitrary attributes to an instance of
@code{object}.
@end quotation
@end cartouche
@end deffn

@geindex built-in function; oct()
@anchor{library/functions oct}@anchor{14da}
@deffn {Function} oct (integer, /)

Convert an integer number to an octal string prefixed with “0o”.  The result
is a valid Python expression. If `integer' is not a Python @ref{19c,,int} object, it
has to define an @ref{19f,,__index__()} method that returns an integer. For
example:

@example
>>> oct(8)
'0o10'
>>> oct(-56)
'-0o70'
@end example

If you want to convert an integer number to an octal string either with the prefix
“0o” or not, you can use either of the following ways.

@example
>>> '%#o' % 10, '%o' % 10
('0o12', '12')
>>> format(10, '#o'), format(10, 'o')
('0o12', '12')
>>> f'@{10:#o@}', f'@{10:o@}'
('0o12', '12')
@end example

See also @ref{19a,,format()} for more information.
@end deffn

@geindex file object; open() built-in function

@geindex built-in function; open()
@anchor{library/functions open}@anchor{318}
@deffn {Function} open (file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

Open `file' and return a corresponding @ref{13cf,,file object}.  If the file
cannot be opened, an @ref{2c2,,OSError} is raised. See
@ref{20aa,,Reading and Writing Files} for more examples of how to use this function.

`file' is a @ref{5a1,,path-like object} giving the pathname (absolute or
relative to the current working directory) of the file to be opened or an
integer file descriptor of the file to be wrapped.  (If a file descriptor is
given, it is closed when the returned I/O object is closed unless `closefd'
is set to @code{False}.)

`mode' is an optional string that specifies the mode in which the file is
opened.  It defaults to @code{'r'} which means open for reading in text mode.
Other common values are @code{'w'} for writing (truncating the file if it
already exists), @code{'x'} for exclusive creation, and @code{'a'} for appending
(which on `some' Unix systems, means that `all' writes append to the end of
the file regardless of the current seek position).  In text mode, if
`encoding' is not specified the encoding used is platform-dependent:
@ref{867,,locale.getencoding()} is called to get the current locale encoding.
(For reading and writing raw bytes use binary mode and leave
`encoding' unspecified.)  The available modes are:

@geindex file; modes
@anchor{library/functions filemodes}@anchor{2620}

@multitable {xxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Character

@tab

Meaning

@item

@code{'r'}

@tab

open for reading (default)

@item

@code{'w'}

@tab

open for writing, truncating the file first

@item

@code{'x'}

@tab

open for exclusive creation, failing if the file already exists

@item

@code{'a'}

@tab

open for writing, appending to the end of file if it exists

@item

@code{'b'}

@tab

binary mode

@item

@code{'t'}

@tab

text mode (default)

@item

@code{'+'}

@tab

open for updating (reading and writing)

@end multitable


The default mode is @code{'r'} (open for reading text, a synonym of @code{'rt'}).
Modes @code{'w+'} and @code{'w+b'} open and truncate the file.  Modes @code{'r+'}
and @code{'r+b'} open the file with no truncation.

As mentioned in the @ref{2621,,Overview}, Python distinguishes between binary
and text I/O.  Files opened in binary mode (including @code{'b'} in the `mode'
argument) return contents as @ref{193,,bytes} objects without any decoding.  In
text mode (the default, or when @code{'t'} is included in the `mode' argument),
the contents of the file are returned as @ref{16a,,str}, the bytes having been
first decoded using a platform-dependent encoding or using the specified
`encoding' if given.

@cartouche
@quotation Note 
Python doesn’t depend on the underlying operating system’s notion of text
files; all the processing is done by Python itself, and is therefore
platform-independent.
@end quotation
@end cartouche

`buffering' is an optional integer used to set the buffering policy.  Pass 0
to switch buffering off (only allowed in binary mode), 1 to select line
buffering (only usable when writing in text mode), and an integer > 1 to indicate the size
in bytes of a fixed-size chunk buffer. Note that specifying a buffer size this
way applies for binary buffered I/O, but @code{TextIOWrapper} (i.e., files opened
with @code{mode='r+'}) would have another buffering. To disable buffering in
@code{TextIOWrapper}, consider using the @code{write_through} flag for
@ref{d46,,io.TextIOWrapper.reconfigure()}. When no `buffering' argument is
given, the default buffering policy works as follows:


@itemize *

@item 
Binary files are buffered in fixed-size chunks; the size of the buffer
is @code{max(min(blocksize, 8 MiB), DEFAULT_BUFFER_SIZE)}
when the device block size is available.
On most systems, the buffer will typically be 128 kilobytes long.

@item 
“Interactive” text files (files for which @ref{20ad,,isatty()}
returns @code{True}) use line buffering.  Other text files use the policy
described above for binary files.
@end itemize

`encoding' is the name of the encoding used to decode or encode the file.
This should only be used in text mode.  The default encoding is platform
dependent (whatever @ref{867,,locale.getencoding()} returns), but any
@ref{2622,,text encoding} supported by Python can be used.
See the @ref{1c,,codecs} module for the list of supported encodings.

`errors' is an optional string that specifies how encoding and decoding
errors are to be handled—this cannot be used in binary mode.
A variety of standard error handlers are available
(listed under @ref{1bb3,,Error Handlers}), though any
error handling name that has been registered with
@ref{16a7,,codecs.register_error()} is also valid.  The standard names
include:


@itemize *

@item 
@code{'strict'} to raise a @ref{2ee,,ValueError} exception if there is
an encoding error.  The default value of @code{None} has the same
effect.

@item 
@code{'ignore'} ignores errors.  Note that ignoring encoding errors
can lead to data loss.

@item 
@code{'replace'} causes a replacement marker (such as @code{'?'}) to be inserted
where there is malformed data.

@item 
@code{'surrogateescape'} will represent any incorrect bytes as low
surrogate code units ranging from U+DC80 to U+DCFF.
These surrogate code units will then be turned back into
the same bytes when the @code{surrogateescape} error handler is used
when writing data.  This is useful for processing files in an
unknown encoding.

@item 
@code{'xmlcharrefreplace'} is only supported when writing to a file.
Characters not supported by the encoding are replaced with the
appropriate XML character reference @code{&#@var{nnn};}.

@item 
@code{'backslashreplace'} replaces malformed data by Python’s backslashed
escape sequences.

@item 
@code{'namereplace'} (also only supported when writing)
replaces unsupported characters with @code{\N@{...@}} escape sequences.
@end itemize

@geindex universal newlines; open() built-in function
@anchor{library/functions open-newline-parameter}@anchor{94d}
`newline' determines how to parse newline characters from the stream.
It can be @code{None}, @code{'@w{'}}, @code{'\n'}, @code{'\r'}, and
@code{'\r\n'}.  It works as follows:


@itemize *

@item 
When reading input from the stream, if `newline' is @code{None}, universal
newlines mode is enabled.  Lines in the input can end in @code{'\n'},
@code{'\r'}, or @code{'\r\n'}, and these are translated into @code{'\n'} before
being returned to the caller.  If it is @code{'@w{'}}, universal newlines mode is
enabled, but line endings are returned to the caller untranslated.  If it
has any of the other legal values, input lines are only terminated by the
given string, and the line ending is returned to the caller untranslated.

@item 
When writing output to the stream, if `newline' is @code{None}, any @code{'\n'}
characters written are translated to the system default line separator,
@ref{2623,,os.linesep}.  If `newline' is @code{'@w{'}} or @code{'\n'}, no translation
takes place.  If `newline' is any of the other legal values, any @code{'\n'}
characters written are translated to the given string.
@end itemize

If `closefd' is @code{False} and a file descriptor rather than a filename was
given, the underlying file descriptor will be kept open when the file is
closed.  If a filename is given `closefd' must be @code{True} (the default);
otherwise, an error will be raised.

A custom opener can be used by passing a callable as `opener'. The underlying
file descriptor for the file object is then obtained by calling `opener' with
(`file', `flags'). `opener' must return an open file descriptor (passing
@ref{f98,,os.open} as `opener' results in functionality similar to passing
@code{None}).

The newly created file is @ref{1102,,non-inheritable}.

The following example uses the @ref{12f6,,dir_fd} parameter of the
@ref{f98,,os.open()} function to open a file relative to a given directory:

@example
>>> import os
>>> dir_fd = os.open('somedir', os.O_RDONLY)
>>> def opener(path, flags):
...     return os.open(path, flags, dir_fd=dir_fd)
...
>>> with open('spamspam.txt', 'w', opener=opener) as f:
...     print('This will be written to somedir/spamspam.txt', file=f)
...
>>> os.close(dir_fd)  # don't leak a file descriptor
@end example

The type of @ref{13cf,,file object} returned by the @code{open()} function
depends on the mode.  When @code{open()} is used to open a file in a text
mode (@code{'w'}, @code{'r'}, @code{'wt'}, @code{'rt'}, etc.), it returns a subclass of
@ref{8a6,,io.TextIOBase} (specifically @ref{9c4,,io.TextIOWrapper}).  When used
to open a file in a binary mode with buffering, the returned class is a
subclass of @ref{8a5,,io.BufferedIOBase}.  The exact class varies: in read
binary mode, it returns an @ref{141a,,io.BufferedReader}; in write binary and
append binary modes, it returns an @ref{15bd,,io.BufferedWriter}, and in
read/write mode, it returns an @ref{15be,,io.BufferedRandom}.  When buffering is
disabled, the raw stream, a subclass of @ref{12dc,,io.RawIOBase},
@ref{151b,,io.FileIO}, is returned.

@geindex line-buffered I/O
@geindex unbuffered I/O
@geindex buffer size@comma{} I/O
@geindex I/O control; buffering
@geindex binary mode
@geindex text mode
@geindex module; sys

See also the file handling modules, such as @ref{5f,,fileinput}, @ref{83,,io}
(where @code{open()} is declared), @ref{a5,,os}, @ref{a6,,os.path}, @ref{e6,,tempfile},
and @ref{ca,,shutil}.

Raises an @ref{1cb1,,auditing event} @code{open} with arguments @code{path}, @code{mode}, @code{flags}.

The @code{mode} and @code{flags} arguments may have been modified or inferred from
the original call.


Changed in version 3.3: 


@itemize *

@item 
The `opener' parameter was added.

@item 
The @code{'x'} mode was added.

@item 
@ref{1259,,IOError} used to be raised, it is now an alias of @ref{2c2,,OSError}.

@item 
@ref{1226,,FileExistsError} is now raised if the file opened in exclusive
creation mode (@code{'x'}) already exists.
@end itemize



Changed in version 3.4: 


@itemize *

@item 
The file is now non-inheritable.
@end itemize



Changed in version 3.5: 


@itemize *

@item 
If the system call is interrupted and the signal handler does not raise an
exception, the function now retries the system call instead of raising an
@ref{f8e,,InterruptedError} exception (see 
@geindex Python Enhancement Proposals; PEP 475
PEP 475@footnote{https://peps.python.org/pep-0475/} for the rationale).

@item 
The @code{'namereplace'} error handler was added.
@end itemize



Changed in version 3.6: 


@itemize *

@item 
Support added to accept objects implementing @ref{e51,,os.PathLike}.

@item 
On Windows, opening a console buffer may return a subclass of
@ref{12dc,,io.RawIOBase} other than @ref{151b,,io.FileIO}.
@end itemize



Changed in version 3.11: The @code{'U'} mode has been removed.

@end deffn

@geindex built-in function; ord()
@anchor{library/functions ord}@anchor{237f}
@deffn {Function} ord (character, /)

Return the ordinal value of a character.

If the argument is a one-character string, return the Unicode code point
of that character.  For example,
@code{ord('a')} returns the integer @code{97} and @code{ord('€')} (Euro sign)
returns @code{8364}.  This is the inverse of @ref{1a33,,chr()}.

If the argument is a @ref{193,,bytes} or @ref{342,,bytearray} object of
length 1, return its single byte value.
For example, @code{ord(b'a')} returns the integer @code{97}.
@end deffn

@geindex built-in function; pow()
@anchor{library/functions pow}@anchor{1a5}
@deffn {Function} pow (base, exp, mod=None)

Return `base' to the power `exp'; if `mod' is present, return `base' to the
power `exp', modulo `mod' (computed more efficiently than
@code{pow(base, exp) % mod}). The two-argument form @code{pow(base, exp)} is
equivalent to using the power operator: @code{base**exp}.

When arguments are builtin numeric types with mixed operand types, the
coercion rules for binary arithmetic operators apply.  For @ref{19c,,int}
operands, the result has the same type as the operands (after coercion)
unless the second argument is negative; in that case, all arguments are
converted to float and a float result is delivered.  For example, @code{pow(10, 2)}
returns @code{100}, but @code{pow(10, -2)} returns @code{0.01}.  For a negative base of
type @code{int} or @ref{197,,float} and a non-integral exponent, a complex
result is delivered.  For example, @code{pow(-9, 0.5)} returns a value close
to @code{3j}. Whereas, for a negative base of type @code{int} or @code{float}
with an integral exponent, a float result is delivered. For example,
@code{pow(-9, 2.0)} returns @code{81.0}.

For @ref{19c,,int} operands `base' and `exp', if `mod' is present, `mod' must
also be of integer type and `mod' must be nonzero. If `mod' is present and
`exp' is negative, `base' must be relatively prime to `mod'. In that case,
@code{pow(inv_base, -exp, mod)} is returned, where `inv_base' is an inverse to
`base' modulo `mod'.

Here’s an example of computing an inverse for @code{38} modulo @code{97}:

@example
>>> pow(38, -1, mod=97)
23
>>> 23 * 38 % 97 == 1
True
@end example


Changed in version 3.8: For @ref{19c,,int} operands, the three-argument form of @code{pow} now allows
the second argument to be negative, permitting computation of modular
inverses.



Changed in version 3.8: Allow keyword arguments.  Formerly, only positional arguments were
supported.

@end deffn

@geindex built-in function; print()
@anchor{library/functions print}@anchor{117b}
@deffn {Function} print (*objects, sep=' ', end='\n', file=None, flush=False)

Print `objects' to the text stream `file', separated by `sep' and followed
by `end'.  `sep', `end', `file', and `flush', if present, must be given as keyword
arguments.

All non-keyword arguments are converted to strings like @ref{16a,,str()} does and
written to the stream, separated by `sep' and followed by `end'.  Both `sep'
and `end' must be strings; they can also be @code{None}, which means to use the
default values.  If no `objects' are given, @code{print()} will just write
`end'.

The `file' argument must be an object with a @code{write(string)} method; if it
is not present or @code{None}, @ref{cd3,,sys.stdout} will be used.  Since printed
arguments are converted to text strings, @code{print()} cannot be used with
binary mode file objects.  For these, use @code{file.write(...)} instead.

Output buffering is usually determined by `file'.
However, if `flush' is true, the stream is forcibly flushed.


Changed in version 3.3: Added the `flush' keyword argument.

@end deffn

@geindex property (built-in class)
@anchor{library/functions property}@anchor{4b4}
@deffn {Class} property (fget=None, fset=None, fdel=None, doc=None)

Return a property attribute.

`fget' is a function for getting an attribute value.  `fset' is a function
for setting an attribute value. `fdel' is a function for deleting an attribute
value.  And `doc' creates a docstring for the attribute.

A typical use is to define a managed attribute @code{x}:

@example
class C:
    def __init__(self):
        self._x = None

    def getx(self):
        return self._x

    def setx(self, value):
        self._x = value

    def delx(self):
        del self._x

    x = property(getx, setx, delx, "I'm the 'x' property.")
@end example

If `c' is an instance of `C', @code{c.x} will invoke the getter,
@code{c.x = value} will invoke the setter, and @code{del c.x} the deleter.

If given, `doc' will be the docstring of the property attribute. Otherwise, the
property will copy `fget'’s docstring (if it exists).  This makes it possible to
create read-only properties easily using @ref{4b4,,property()} as a @ref{93f,,decorator}:

@example
class Parrot:
    def __init__(self):
        self._voltage = 100000

    @@property
    def voltage(self):
        """Get the current voltage."""
        return self._voltage
@end example

The @code{@@property} decorator turns the @code{voltage()} method into a “getter”
for a read-only attribute with the same name, and it sets the docstring for
`voltage' to “Get the current voltage.”

@geindex built-in function; property.getter()
@anchor{library/functions property getter}@anchor{1a1d}
@deffn {Function} @@getter
@end deffn

@geindex built-in function; property.setter()
@anchor{library/functions property setter}@anchor{1a1e}
@deffn {Function} @@setter
@end deffn

@geindex built-in function; property.deleter()
@anchor{library/functions property deleter}@anchor{1a1f}
@deffn {Function} @@deleter

A property object has @code{getter}, @code{setter},
and @code{deleter} methods usable as decorators that create a
copy of the property with the corresponding accessor function set to the
decorated function.  This is best explained with an example:

@example
class C:
    def __init__(self):
        self._x = None

    @@property
    def x(self):
        """I'm the 'x' property."""
        return self._x

    @@x.setter
    def x(self, value):
        self._x = value

    @@x.deleter
    def x(self):
        del self._x
@end example

This code is exactly equivalent to the first example.  Be sure to give the
additional functions the same name as the original property (@code{x} in this
case.)

The returned property object also has the attributes @code{fget}, @code{fset}, and
@code{fdel} corresponding to the constructor arguments.
@end deffn


Changed in version 3.5: The docstrings of property objects are now writeable.


@geindex __name__ (property attribute)
@anchor{library/functions property __name__}@anchor{4b3}
@deffn {Attribute} __name__

Attribute holding the name of the property. The name of the property
can be changed at runtime.


Added in version 3.13.

@end deffn
@end deffn

@anchor{library/functions func-range}@anchor{2603}
@deffn {Class} range (stop, /)

@deffnx {Class} range (start, stop, step=1, /)

Rather than being a function, @ref{b43,,range} is actually an immutable
sequence type, as documented in @ref{2624,,Ranges} and @ref{2072,,Sequence Types — list@comma{} tuple@comma{} range}.
@end deffn

@geindex built-in function; repr()
@anchor{library/functions repr}@anchor{1c3}
@deffn {Function} repr (object, /)

Return a string containing a printable representation of an object.  For many
types, this function makes an attempt to return a string that would yield an
object with the same value when passed to @ref{4a4,,eval()}; otherwise, the
representation is a string enclosed in angle brackets that contains the name
of the type of the object together with additional information often
including the name and address of the object.  A class can control what this
function returns for its instances
by defining a @ref{830,,__repr__()} method.
If @ref{172b,,sys.displayhook()} is not accessible, this function will raise
@ref{246,,RuntimeError}.

This class has a custom representation that can be evaluated:

@example
class Person:
   def __init__(self, name, age):
      self.name = name
      self.age = age

   def __repr__(self):
      return f"Person('@{self.name@}', @{self.age@})"
@end example
@end deffn

@geindex built-in function; reversed()
@anchor{library/functions reversed}@anchor{a6b}
@deffn {Function} reversed (object, /)

Return a reverse @ref{4c9,,iterator}.  The argument must be an object which has
a @ref{e8c,,__reversed__()} method or supports the sequence protocol (the
@ref{17e1,,__len__()} method and the @ref{588,,__getitem__()} method
with integer arguments starting at @code{0}).
@end deffn

@geindex built-in function; round()
@anchor{library/functions round}@anchor{14e6}
@deffn {Function} round (number, ndigits=None)

Return `number' rounded to `ndigits' precision after the decimal
point.  If `ndigits' is omitted or is @code{None}, it returns the
nearest integer to its input.

For the built-in types supporting @code{round()}, values are rounded to the
closest multiple of 10 to the power minus `ndigits'; if two multiples are
equally close, rounding is done toward the even choice (so, for example,
both @code{round(0.5)} and @code{round(-0.5)} are @code{0}, and @code{round(1.5)} is
@code{2}).  Any integer value is valid for `ndigits' (positive, zero, or
negative).  The return value is an integer if `ndigits' is omitted or
@code{None}.
Otherwise, the return value has the same type as `number'.

For a general Python object @code{number}, @code{round} delegates to
@code{number.__round__}.

@cartouche
@quotation Note 
The behavior of @code{round()} for floats can be surprising: for example,
@code{round(2.675, 2)} gives @code{2.67} instead of the expected @code{2.68}.
This is not a bug: it’s a result of the fact that most decimal fractions
can’t be represented exactly as a float.  See @ref{2144,,Floating-Point Arithmetic; Issues and Limitations} for
more information.
@end quotation
@end cartouche
@end deffn

@anchor{library/functions func-set}@anchor{2604}
@deffn {Class} set (iterable=(), /)

Return a new @ref{185,,set} object, optionally with elements taken from
`iterable'.  @code{set} is a built-in class.  See also
@ref{2075,,Set Types — set@comma{} frozenset} for documentation about this class.

For other containers see the built-in @ref{7f3,,frozenset}, @ref{24f,,list},
@ref{614,,tuple}, and @ref{184,,dict} classes, as well as the @ref{1e,,collections}
module.
@end deffn

@geindex built-in function; setattr()
@anchor{library/functions setattr}@anchor{2605}
@deffn {Function} setattr (object, name, value, /)

This is the counterpart of @ref{dd0,,getattr()}.  The arguments are an object, a
string, and an arbitrary value.  The string may name an existing attribute or a
new attribute.  The function assigns the value to the attribute, provided the
object allows it.  For example, @code{setattr(x, 'foobar', 123)} is equivalent to
@code{x.foobar = 123}.

`name' need not be a Python identifier as defined in @ref{22e4,,Names (identifiers and keywords)}
unless the object chooses to enforce that, for example in a custom
@ref{dd1,,__getattribute__()} or via @ref{16f7,,__slots__}.
An attribute whose name is not an identifier will not be accessible using
the dot notation, but is accessible through @ref{dd0,,getattr()} etc..

@cartouche
@quotation Note 
Since @ref{20e7,,private name mangling} happens at
compilation time, one must manually mangle a private attribute’s
(attributes with two leading underscores) name in order to set it with
@code{setattr()}.
@end quotation
@end cartouche
@end deffn

@geindex slice (built-in class)
@anchor{library/functions slice}@anchor{695}
@deffn {Class} slice (stop, /)

@deffnx {Class} slice (start, stop, step=None, /)

Return a @ref{24f5,,slice} object representing the set of indices specified by
@code{range(start, stop, step)}.  The `start' and `step' arguments default to
@code{None}.

Slice objects are also generated when @ref{24f4,,slicing syntax}
is used.  For example: @code{a[start:stop:step]} or @code{a[start:stop, i]}.

See @ref{d49,,itertools.islice()} for an alternate version that returns an
@ref{4c9,,iterator}.

@geindex start (slice attribute)
@geindex stop (slice attribute)
@geindex step (slice attribute)
@anchor{library/functions slice start}@anchor{23ec}
@deffn {Attribute} start
@anchor{library/functions slice stop}@anchor{23ed}
@deffnx {Attribute} stop
@anchor{library/functions slice step}@anchor{23ee}
@deffnx {Attribute} step

These read-only attributes are set to the argument values
(or their default).  They have no other explicit functionality;
however, they are used by NumPy and other third-party packages.
@end deffn


Changed in version 3.12: Slice objects are now @ref{825,,hashable} (provided @ref{23ec,,start},
@ref{23ed,,stop}, and @ref{23ee,,step} are hashable).

@end deffn

@geindex built-in function; sorted()
@anchor{library/functions sorted}@anchor{dcd}
@deffn {Function} sorted (iterable, /, *, key=None, reverse=False)

Return a new sorted list from the items in `iterable'.

Has two optional arguments which must be specified as keyword arguments.

`key' specifies a function of one argument that is used to extract a comparison
key from each element in `iterable' (for example, @code{key=str.lower}).  The
default value is @code{None} (compare the elements directly).

`reverse' is a boolean value.  If set to @code{True}, then the list elements are
sorted as if each comparison were reversed.

Use @ref{13e6,,functools.cmp_to_key()} to convert an old-style `cmp' function to a
`key' function.

The built-in @code{sorted()} function is guaranteed to be stable. A sort is
stable if it guarantees not to change the relative order of elements that
compare equal — this is helpful for sorting in multiple passes (for
example, sort by department, then by salary grade).

The sort algorithm uses only @code{<} comparisons between items.  While
defining an @ref{14ac,,__lt__()} method will suffice for sorting,
@geindex Python Enhancement Proposals; PEP 8
PEP 8@footnote{https://peps.python.org/pep-0008/} recommends that all six @ref{2517,,rich comparisons} be implemented.  This will help avoid bugs when using
the same data with other ordering tools such as @ref{1112,,max()} that rely
on a different underlying method.  Implementing all six comparisons
also helps avoid confusion for mixed type comparisons which can call
the reflected @ref{1517,,__gt__()} method.

For sorting examples and a brief sorting tutorial, see @ref{2625,,Sorting Techniques}.
@end deffn

@geindex built-in function; staticmethod()
@anchor{library/functions staticmethod}@anchor{451}
@deffn {Function} @@staticmethod

Transform a method into a static method.

A static method does not receive an implicit first argument. To declare a static
method, use this idiom:

@example
class C:
    @@staticmethod
    def f(arg1, arg2, argN): ...
@end example

The @code{@@staticmethod} form is a function @ref{93f,,decorator} – see
@ref{205c,,Function definitions} for details.

A static method can be called either on the class (such as @code{C.f()}) or on
an instance (such as @code{C().f()}).
Moreover, the static method @ref{18c9,,descriptor} is also callable, so it can
be used in the class definition (such as @code{f()}).

Static methods in Python are similar to those found in Java or C++. Also, see
@ref{48f,,classmethod()} for a variant that is useful for creating alternate class
constructors.

Like all decorators, it is also possible to call @code{staticmethod} as
a regular function and do something with its result.  This is needed
in some cases where you need a reference to a function from a class
body and you want to avoid the automatic transformation to instance
method.  For these cases, use this idiom:

@example
def regular_function():
    ...

class C:
    method = staticmethod(regular_function)
@end example

For more information on static methods, see @ref{2373,,The standard type hierarchy}.


Changed in version 3.10: Static methods now inherit the method attributes
(@ref{238e,,__module__}, @ref{14e0,,__name__},
@ref{238d,,__qualname__}, @ref{13e5,,__doc__} and
@ref{13e4,,__annotations__}), have a new @code{__wrapped__} attribute,
and are now callable as regular functions.

@end deffn

@geindex string; str() (built-in function)

@anchor{library/functions func-str}@anchor{2606}
@deffn {Class} str (*, encoding='utf-8', errors='strict')

@deffnx {Class} str (object)

@deffnx {Class} str (object, encoding, errors='strict')

@deffnx {Class} str (object, *, errors)

Return a @ref{16a,,str} version of `object'.  See @ref{16a,,str()} for details.

@code{str} is the built-in string @ref{1d41,,class}.  For general information
about strings, see @ref{2023,,Text Sequence Type — str}.
@end deffn

@geindex built-in function; sum()
@anchor{library/functions sum}@anchor{696}
@deffn {Function} sum (iterable, /, start=0)

Sums `start' and the items of an `iterable' from left to right and returns the
total.  The `iterable'’s items are normally numbers, and the start value is not
allowed to be a string.

For some use cases, there are good alternatives to @code{sum()}.
The preferred, fast way to concatenate a sequence of strings is by calling
@code{'@w{'}.join(sequence)}.  To add floating-point values with extended precision,
see @ref{15e0,,math.fsum()}.  To concatenate a series of iterables, consider using
@ref{2626,,itertools.chain()}.


Changed in version 3.8: The `start' parameter can be specified as a keyword argument.



Changed in version 3.12: Summation of floats switched to an algorithm
that gives higher accuracy and better commutativity on most builds.



Changed in version 3.14: Added specialization for summation of complexes,
using same algorithm as for summation of floats.

@end deffn

@geindex super (built-in class)
@anchor{library/functions super}@anchor{1a7}
@deffn {Class} super

@deffnx {Class} super (type, object_or_type=None, /)

Return a proxy object that delegates method calls to a parent or sibling
class of `type'.  This is useful for accessing inherited methods that have
been overridden in a class.

The `object_or_type' determines the @ref{2627,,method resolution order}
to be searched.  The search starts from the class right after the
`type'.

For example, if @ref{23bb,,__mro__} of `object_or_type' is
@code{D -> B -> C -> A -> object} and the value of `type' is @code{B},
then @ref{1a7,,super()} searches @code{C -> A -> object}.

The @ref{23bb,,__mro__} attribute of the class corresponding to
`object_or_type' lists the method resolution search order used by both
@ref{dd0,,getattr()} and @ref{1a7,,super()}.  The attribute is dynamic and can change
whenever the inheritance hierarchy is updated.

If the second argument is omitted, the super object returned is unbound.  If
the second argument is an object, @code{isinstance(obj, type)} must be true.  If
the second argument is a type, @code{issubclass(type2, type)} must be true (this
is useful for classmethods).

When called directly within an ordinary method of a class, both arguments may
be omitted (“zero-argument @code{super()}”). In this case, `type' will be the
enclosing class, and `obj' will be the first argument of the immediately
enclosing function (typically @code{self}). (This means that zero-argument
@code{super()} will not work as expected within nested functions, including
generator expressions, which implicitly create nested functions.)

There are two typical use cases for `super'.  In a class hierarchy with
single inheritance, `super' can be used to refer to parent classes without
naming them explicitly, thus making the code more maintainable.  This use
closely parallels the use of `super' in other programming languages.

The second use case is to support cooperative multiple inheritance in a
dynamic execution environment.  This use case is unique to Python and is
not found in statically compiled languages or languages that only support
single inheritance.  This makes it possible to implement “diamond diagrams”
where multiple base classes implement the same method.  Good design dictates
that such implementations have the same calling signature in every case (because the
order of calls is determined at runtime, because that order adapts
to changes in the class hierarchy, and because that order can include
sibling classes that are unknown prior to runtime).

For both use cases, a typical superclass call looks like this:

@example
class C(B):
    def method(self, arg):
        super().method(arg)    # This does the same thing as:
                               # super(C, self).method(arg)
@end example

In addition to method lookups, @ref{1a7,,super()} also works for attribute
lookups.  One possible use case for this is calling @ref{18c9,,descriptors}
in a parent or sibling class.

Note that @ref{1a7,,super()} is implemented as part of the binding process for
explicit dotted attribute lookups such as @code{super().__getitem__(name)}.
It does so by implementing its own @ref{dd1,,__getattribute__()} method
for searching
classes in a predictable order that supports cooperative multiple inheritance.
Accordingly, @code{super()} is undefined for implicit lookups using statements or
operators such as @code{super()[name]}.

Also note that, aside from the zero argument form, @ref{1a7,,super()} is not
limited to use inside methods.  The two argument form specifies the
arguments exactly and makes the appropriate references.  The zero
argument form only works inside a class definition, as the compiler fills
in the necessary details to correctly retrieve the class being defined,
as well as accessing the current instance for ordinary methods.

For practical suggestions on how to design cooperative classes using
@ref{1a7,,super()}, see guide to using super()@footnote{https://rhettinger.wordpress.com/2011/05/26/super-considered-super/}.


Changed in version 3.14: @code{super} objects are now @ref{ab,,pickleable} and
 @ref{29,,copyable}.

@end deffn

@anchor{library/functions func-tuple}@anchor{2607}
@deffn {Class} tuple (iterable=(), /)

Rather than being a function, @ref{614,,tuple} is actually an immutable
sequence type, as documented in @ref{2591,,Tuples} and @ref{2072,,Sequence Types — list@comma{} tuple@comma{} range}.
@end deffn

@geindex type (built-in class)
@anchor{library/functions type}@anchor{f4a}
@deffn {Class} type (object, /)

@deffnx {Class} type (name, bases, dict, /, **kwargs)

@geindex object; type

With one argument, return the type of an `object'.  The return value is a
type object and generally the same object as returned by
@ref{16b9,,object.__class__}.

The @ref{2af,,isinstance()} built-in function is recommended for testing the type
of an object, because it takes subclasses into account.

With three arguments, return a new type object.  This is essentially a
dynamic form of the @ref{14e3,,class} statement. The `name' string is
the class name and becomes the @ref{16b7,,__name__} attribute.
The `bases' tuple contains the base classes and becomes the
@ref{16b8,,__bases__} attribute; if empty, @ref{c84,,object}, the
ultimate base of all classes, is added.  The `dict' dictionary contains
attribute and method definitions for the class body; it may be copied
or wrapped before becoming the @ref{e5d,,__dict__} attribute.
The following two statements create identical @code{type} objects:

@example
>>> class X:
...     a = 1
...
>>> X = type('X', (), dict(a=1))
@end example

See also:


@itemize *

@item 
@ref{23b4,,Documentation on attributes and methods on classes}.

@item 
@ref{2628,,Type Objects}
@end itemize

Keyword arguments provided to the three argument form are passed to the
appropriate metaclass machinery (usually @ref{844,,__init_subclass__()})
in the same way that keywords in a class
definition (besides `metaclass') would.

See also @ref{e4b,,Customizing class creation}.


Changed in version 3.6: Subclasses of @code{type} which don’t override @code{type.__new__} may no
longer use the one-argument form to get the type of an object.

@end deffn

@geindex built-in function; vars()
@anchor{library/functions vars}@anchor{1e65}
@deffn {Function} vars ()

@deffnx {Function} vars (object, /)

Return the @ref{77e,,__dict__} attribute for a module, class, instance,
or any other object with a @code{__dict__} attribute.

Objects such as modules and instances have an updateable @ref{77e,,__dict__}
attribute; however, other objects may have write restrictions on their
@code{__dict__} attributes (for example, classes use a
@ref{699,,types.MappingProxyType} to prevent direct dictionary updates).

Without an argument, @code{vars()} acts like @ref{46f,,locals()}.

A @ref{199,,TypeError} exception is raised if an object is specified but
it doesn’t have a @ref{77e,,__dict__} attribute (for example, if
its class defines the @ref{16f7,,__slots__} attribute).


Changed in version 3.13: The result of calling this function without an argument has been
updated as described for the @ref{46f,,locals()} builtin.

@end deffn

@geindex built-in function; zip()
@anchor{library/functions zip}@anchor{1a1}
@deffn {Function} zip (*iterables, strict=False)

Iterate over several iterables in parallel, producing tuples with an item
from each one.

Example:

@example
>>> for item in zip([1, 2, 3], ['sugar', 'spice', 'everything nice']):
...     print(item)
...
(1, 'sugar')
(2, 'spice')
(3, 'everything nice')
@end example

More formally: @code{zip()} returns an iterator of tuples, where the `i'-th
tuple contains the `i'-th element from each of the argument iterables.

Another way to think of @code{zip()} is that it turns rows into columns, and
columns into rows.  This is similar to transposing a matrix@footnote{https://en.wikipedia.org/wiki/Transpose}.

@code{zip()} is lazy: The elements won’t be processed until the iterable is
iterated on, e.g. by a @code{for} loop or by wrapping in a
@ref{24f,,list}.

One thing to consider is that the iterables passed to @code{zip()} could have
different lengths; sometimes by design, and sometimes because of a bug in
the code that prepared these iterables.  Python offers three different
approaches to dealing with this issue:


@itemize *

@item 
By default, @code{zip()} stops when the shortest iterable is exhausted.
It will ignore the remaining items in the longer iterables, cutting off
the result to the length of the shortest iterable:

@example
>>> list(zip(range(3), ['fee', 'fi', 'fo', 'fum']))
[(0, 'fee'), (1, 'fi'), (2, 'fo')]
@end example

@item 
@code{zip()} is often used in cases where the iterables are assumed to be
of equal length.  In such cases, it’s recommended to use the @code{strict=True}
option. Its output is the same as regular @code{zip()}:

@example
>>> list(zip(('a', 'b', 'c'), (1, 2, 3), strict=True))
[('a', 1), ('b', 2), ('c', 3)]
@end example

Unlike the default behavior, it raises a @ref{2ee,,ValueError} if one iterable
is exhausted before the others:

@example
>>> for item in zip(range(3), ['fee', 'fi', 'fo', 'fum'], strict=True):
...     print(item)
...
(0, 'fee')
(1, 'fi')
(2, 'fo')
Traceback (most recent call last):
  ...
ValueError: zip() argument 2 is longer than argument 1
@end example

@c This doctest is disabled because doctest does not support capturing
@c output and exceptions in the same code unit.
@c https://github.com/python/cpython/issues/65382

Without the @code{strict=True} argument, any bug that results in iterables of
different lengths will be silenced, possibly manifesting as a hard-to-find
bug in another part of the program.

@item 
Shorter iterables can be padded with a constant value to make all the
iterables have the same length.  This is done by
@ref{14aa,,itertools.zip_longest()}.
@end itemize

Edge cases: With a single iterable argument, @code{zip()} returns an
iterator of 1-tuples.  With no arguments, it returns an empty iterator.

Tips and tricks:


@itemize *

@item 
The left-to-right evaluation order of the iterables is guaranteed. This
makes possible an idiom for clustering a data series into n-length groups
using @code{zip(*[iter(s)]*n, strict=True)}.  This repeats the `same' iterator
@code{n} times so that each output tuple has the result of @code{n} calls to the
iterator. This has the effect of dividing the input into n-length chunks.

@item 
@code{zip()} in conjunction with the @code{*} operator can be used to unzip a
list:

@example
>>> x = [1, 2, 3]
>>> y = [4, 5, 6]
>>> list(zip(x, y))
[(1, 4), (2, 5), (3, 6)]
>>> x2, y2 = zip(*zip(x, y))
>>> x == list(x2) and y == list(y2)
True
@end example
@end itemize


Changed in version 3.10: Added the @code{strict} argument.

@end deffn

@geindex built-in function; __import__()
@anchor{library/functions import__}@anchor{ad7}
@deffn {Function} __import__ (name, globals=None, locals=None, fromlist=(), level=0)

@geindex statement; import
@geindex module; builtins

@cartouche
@quotation Note 
This is an advanced function that is not needed in everyday Python
programming, unlike @ref{73d,,importlib.import_module()}.
@end quotation
@end cartouche

This function is invoked by the @ref{7f9,,import} statement.  It can be
replaced (by importing the @ref{13,,builtins} module and assigning to
@code{builtins.__import__}) in order to change semantics of the
@code{import} statement, but doing so is `strongly' discouraged as it
is usually simpler to use import hooks (see 
@geindex Python Enhancement Proposals; PEP 302
PEP 302@footnote{https://peps.python.org/pep-0302/}) to attain the same
goals and does not cause issues with code which assumes the default import
implementation is in use.  Direct use of @code{__import__()} is also
discouraged in favor of @ref{73d,,importlib.import_module()}.

The function imports the module `name', potentially using the given `globals'
and `locals' to determine how to interpret the name in a package context.
The `fromlist' gives the names of objects or submodules that should be
imported from the module given by `name'.  The standard implementation does
not use its `locals' argument at all and uses its `globals' only to
determine the package context of the @ref{7f9,,import} statement.

`level' specifies whether to use absolute or relative imports. @code{0} (the
default) means only perform absolute imports.  Positive values for
`level' indicate the number of parent directories to search relative to the
directory of the module calling @code{__import__()} (see 
@geindex Python Enhancement Proposals; PEP 328
PEP 328@footnote{https://peps.python.org/pep-0328/} for the
details).

When the `name' variable is of the form @code{package.module}, normally, the
top-level package (the name up till the first dot) is returned, `not' the
module named by `name'.  However, when a non-empty `fromlist' argument is
given, the module named by `name' is returned.

For example, the statement @code{import spam} results in bytecode resembling the
following code:

@example
spam = __import__('spam', globals(), locals(), [], 0)
@end example

The statement @code{import spam.ham} results in this call:

@example
spam = __import__('spam.ham', globals(), locals(), [], 0)
@end example

Note how @code{__import__()} returns the toplevel module here because this is
the object that is bound to a name by the @ref{7f9,,import} statement.

On the other hand, the statement @code{from spam.ham import eggs, sausage as
saus} results in

@example
_temp = __import__('spam.ham', globals(), locals(), ['eggs', 'sausage'], 0)
eggs = _temp.eggs
saus = _temp.sausage
@end example

Here, the @code{spam.ham} module is returned from @code{__import__()}.  From this
object, the names to import are retrieved and assigned to their respective
names.

If you simply want to import a module (potentially within a package) by name,
use @ref{73d,,importlib.import_module()}.


Changed in version 3.3: Negative values for `level' are no longer supported (which also changes
the default value to 0).



Changed in version 3.9: When the command line options @ref{b5c,,-E} or @ref{b5d,,-I} are being used,
the environment variable 
@geindex PYTHONCASEOK
@geindex environment variable; PYTHONCASEOK
@ref{b5b,,PYTHONCASEOK} is now ignored.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Built-in Constants,Built-in Types,Built-in Functions,The Python Standard Library
@anchor{library/constants doc}@anchor{2629}@anchor{library/constants built-in-constants}@anchor{262a}@anchor{library/constants built-in-consts}@anchor{24be}@anchor{library/constants translation-repo}@anchor{262b}
@section Built-in Constants


A small number of constants live in the built-in namespace.  They are:

@geindex False (built-in variable)
@anchor{library/constants False}@anchor{d31}
@deffn {Data} False

The false value of the @ref{3c1,,bool} type. Assignments to @code{False}
are illegal and raise a @ref{18f,,SyntaxError}.
@end deffn

@geindex True (built-in variable)
@anchor{library/constants True}@anchor{e0d}
@deffn {Data} True

The true value of the @ref{3c1,,bool} type. Assignments to @code{True}
are illegal and raise a @ref{18f,,SyntaxError}.
@end deffn

@geindex None (built-in variable)
@anchor{library/constants None}@anchor{887}
@deffn {Data} None

An object frequently used to represent the absence of a value, as when
default arguments are not passed to a function. Assignments to @code{None}
are illegal and raise a @ref{18f,,SyntaxError}.
@code{None} is the sole instance of the @ref{a58,,NoneType} type.
@end deffn

@geindex NotImplemented (built-in variable)
@anchor{library/constants NotImplemented}@anchor{1a3}
@deffn {Data} NotImplemented

A special value which should be returned by the binary special methods
(e.g. @ref{cf8,,__eq__()}, @ref{14ac,,__lt__()}, @ref{2424,,__add__()}, @ref{2437,,__rsub__()},
etc.) to indicate that the operation is not implemented with respect to
the other type; may be returned by the in-place binary special methods
(e.g. @ref{2429,,__imul__()}, @ref{2446,,__iand__()}, etc.) for the same purpose.
It should not be evaluated in a boolean context.
@code{NotImplemented} is the sole instance of the @ref{a59,,types.NotImplementedType} type.

@cartouche
@quotation Note 
When a binary (or in-place) method returns @code{NotImplemented} the
interpreter will try the reflected operation on the other type (or some
other fallback, depending on the operator).  If all attempts return
@code{NotImplemented}, the interpreter will raise an appropriate exception.
Incorrectly returning @code{NotImplemented} will result in a misleading
error message or the @code{NotImplemented} value being returned to Python code.

See @ref{2376,,Implementing the arithmetic operations} for examples.
@end quotation
@end cartouche

@cartouche
@quotation Caution 
@code{NotImplemented} and @code{NotImplementedError} are not
interchangeable. This constant should only be used as described
above; see @ref{369,,NotImplementedError} for details on correct usage
of the exception.
@end quotation
@end cartouche


Changed in version 3.9: Evaluating @code{NotImplemented} in a boolean context was deprecated.



Changed in version 3.14: Evaluating @code{NotImplemented} in a boolean context now raises a @ref{199,,TypeError}.
It previously evaluated to @ref{e0d,,True} and emitted a @ref{1a4,,DeprecationWarning}
since Python 3.9.

@end deffn

@geindex ...; ellipsis literal

@geindex Ellipsis (built-in variable)
@anchor{library/constants Ellipsis}@anchor{236c}
@deffn {Data} Ellipsis

The same as the ellipsis literal “@code{...}”, an object frequently used to
indicate that something is omitted. Assignment to @code{Ellipsis} is possible, but
assignment to  @code{...} raises a @ref{18f,,SyntaxError}.
@code{Ellipsis} is the sole instance of the @ref{a57,,types.EllipsisType} type.
@end deffn

@geindex __debug__ (built-in variable)
@anchor{library/constants debug__}@anchor{9e0}
@deffn {Data} __debug__

This constant is true if Python was not started with an @ref{18d,,-O} option.
See also the @ref{b66,,assert} statement.
@end deffn

@cartouche
@quotation Note 
The names @ref{887,,None}, @ref{d31,,False}, @ref{e0d,,True} and @ref{9e0,,__debug__}
cannot be reassigned (assignments to them, even as an attribute name, raise
@ref{18f,,SyntaxError}), so they can be considered “true” constants.
@end quotation
@end cartouche

@menu
* Constants added by the site module:: 

@end menu

@node Constants added by the site module,,,Built-in Constants
@anchor{library/constants constants-added-by-the-site-module}@anchor{262c}@anchor{library/constants site-consts}@anchor{262d}
@subsection Constants added by the @code{site} module


The @ref{cc,,site} module (which is imported automatically during startup, except
if the @ref{13b4,,-S} command-line option is given) adds several constants to the
built-in namespace.  They are useful for the interactive interpreter shell and
should not be used in programs.

@geindex quit (built-in variable)
@geindex exit (built-in variable)
@anchor{library/constants quit}@anchor{262e}
@deffn {Data} quit (code=None)
@anchor{library/constants exit}@anchor{262f}
@deffnx {Data} exit (code=None)

Objects that when printed, print a message like “Use quit() or Ctrl-D
(i.e. EOF) to exit”, and when accessed directly in the interactive
interpreter or called as functions, raise @ref{f42,,SystemExit} with the
specified exit code.
@end deffn


@deffn {Data} help

Object that when printed, prints the message “Type help() for interactive
help, or help(object) for help about object.”, and when accessed directly
in the interactive interpreter, invokes the built-in help system
(see @ref{ada,,help()}).
@end deffn

@geindex copyright (built-in variable)
@geindex credits (built-in variable)
@anchor{library/constants copyright}@anchor{17da}
@deffn {Data} copyright
@anchor{library/constants credits}@anchor{17db}
@deffnx {Data} credits

Objects that when printed or called, print the text of copyright or
credits, respectively.
@end deffn

@geindex license (built-in variable)
@anchor{library/constants license}@anchor{17d9}
@deffn {Data} license

Object that when printed, prints the message “Type license() to see the
full license text”, and when called, displays the full license text in a
pager-like fashion (one screen at a time).
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c XXX: reference/datamodel and this have quite a few overlaps!

@node Built-in Types,Built-in Exceptions,Built-in Constants,The Python Standard Library
@anchor{library/stdtypes doc}@anchor{2630}@anchor{library/stdtypes bltin-types}@anchor{2631}@anchor{library/stdtypes built-in-types}@anchor{2632}@anchor{library/stdtypes translation-repo}@anchor{2633}
@section Built-in Types


The following sections describe the standard types that are built into the
interpreter.

@geindex built-in; types

The principal built-in types are numerics, sequences, mappings, classes,
instances and exceptions.

Some collection classes are mutable.  The methods that add, subtract, or
rearrange their members in place, and don’t return a specific item, never return
the collection instance itself but @code{None}.

Some operations are supported by several object types; in particular,
practically all objects can be compared for equality, tested for truth
value, and converted to a string (with the @ref{1c3,,repr()} function or the
slightly different @ref{16a,,str()} function).  The latter function is implicitly
used when an object is written by the @ref{117b,,print()} function.

@menu
* Truth Value Testing:: 
* Boolean Operations — and@comma{} or@comma{} not: Boolean Operations — and or not. 
* Comparisons: Comparisons<2>. 
* Numeric Types — int@comma{} float@comma{} complex: Numeric Types — int float complex. 
* Boolean Type - bool:: 
* Iterator Types:: 
* Sequence Types — list@comma{} tuple@comma{} range: Sequence Types — list tuple range. 
* Text and Binary Sequence Type Methods Summary:: 
* Text Sequence Type — str:: 
* Binary Sequence Types — bytes@comma{} bytearray@comma{} memoryview: Binary Sequence Types — bytes bytearray memoryview. 
* Set Types — set@comma{} frozenset: Set Types — set frozenset. 
* Mapping Types — dict:: 
* Context Manager Types:: 
* Type Annotation Types — Generic Alias@comma{} Union: Type Annotation Types — Generic Alias Union. 
* Other Built-in Types:: 
* Special Attributes:: 
* Integer string conversion length limitation:: 

@end menu

@node Truth Value Testing,Boolean Operations — and or not,,Built-in Types
@anchor{library/stdtypes truth}@anchor{18a1}@anchor{library/stdtypes truth-value-testing}@anchor{2634}
@subsection Truth Value Testing


@geindex statement; if
@geindex statement; while
@geindex truth; value
@geindex Boolean; operations
@geindex false

Any object can be tested for truth value, for use in an @ref{182,,if} or
@ref{19b7,,while} condition or as operand of the Boolean operations below.

@geindex true

By default, an object is considered true unless its class defines either a
@ref{14e1,,__bool__()} method that returns @code{False} or a
@ref{17e1,,__len__()} method that
returns zero, when called with the object. @footnote{
Additional information on these special methods may be found in the Python
Reference Manual (@ref{23f4,,Basic customization}).
} If one of the methods raises an
exception when called, the exception is propagated and the object does
not have a truth value (for example, @ref{1a3,,NotImplemented}).
Here are most of the built-in objects considered false:

@geindex None (Built-in object)
@geindex False (Built-in object)


@itemize *

@item 
constants defined to be false: @code{None} and @code{False}

@item 
zero of any numeric type: @code{0}, @code{0.0}, @code{0j}, @code{Decimal(0)},
@code{Fraction(0, 1)}

@item 
empty sequences and collections: @code{'@w{'}}, @code{()}, @code{[]}, @code{@{@}}, @code{set()},
@code{range(0)}
@end itemize

@geindex operator; or
@geindex operator; and
@geindex False
@geindex True

Operations and built-in functions that have a Boolean result always return @code{0}
or @code{False} for false and @code{1} or @code{True} for true, unless otherwise stated.
(Important exception: the Boolean operations @code{or} and @code{and} always return
one of their operands.)

@node Boolean Operations — and or not,Comparisons<2>,Truth Value Testing,Built-in Types
@anchor{library/stdtypes boolean}@anchor{2635}@anchor{library/stdtypes boolean-operations-and-or-not}@anchor{2636}
@subsection Boolean Operations — @code{and}, @code{or}, @code{not}


@geindex Boolean; operations

These are the Boolean operations, ordered by ascending priority:


@multitable {xxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxx} 
@headitem

Operation

@tab

Result

@tab

Notes

@item

@code{x or y}

@tab

if `x' is true, then `x', else
`y'

@tab

(1)

@item

@code{x and y}

@tab

if `x' is false, then `x', else
`y'

@tab

(2)

@item

@code{not x}

@tab

if `x' is false, then @code{True},
else @code{False}

@tab

(3)

@end multitable


@geindex operator; and
@geindex operator; or
@geindex operator; not

Notes:


@enumerate 

@item 
This is a short-circuit operator, so it only evaluates the second
argument if the first one is false.

@item 
This is a short-circuit operator, so it only evaluates the second
argument if the first one is true.

@item 
@code{not} has a lower priority than non-Boolean operators, so @code{not a == b} is
interpreted as @code{not (a == b)}, and @code{a == not b} is a syntax error.
@end enumerate

@node Comparisons<2>,Numeric Types — int float complex,Boolean Operations — and or not,Built-in Types
@anchor{library/stdtypes comparisons}@anchor{2637}@anchor{library/stdtypes stdcomparisons}@anchor{2638}
@subsection Comparisons


@geindex chaining; comparisons
@geindex operator; comparison
@geindex operator; ==
@geindex operator; < (less)
@geindex operator; <=
@geindex operator; > (greater)
@geindex operator; >=
@geindex operator; !=
@geindex operator; is
@geindex operator; is not

There are eight comparison operations in Python.  They all have the same
priority (which is higher than that of the Boolean operations).  Comparisons can
be chained arbitrarily; for example, @code{x < y <= z} is equivalent to @code{x < y and
y <= z}, except that `y' is evaluated only once (but in both cases `z' is not
evaluated at all when @code{x < y} is found to be false).

This table summarizes the comparison operations:


@multitable {xxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Operation

@tab

Meaning

@item

@code{<}

@tab

strictly less than

@item

@code{<=}

@tab

less than or equal

@item

@code{>}

@tab

strictly greater than

@item

@code{>=}

@tab

greater than or equal

@item

@code{==}

@tab

equal

@item

@code{!=}

@tab

not equal

@item

@code{is}

@tab

object identity

@item

@code{is not}

@tab

negated object identity

@end multitable


@geindex object; numeric
@geindex objects; comparing

Unless stated otherwise, objects of different types never compare equal.
The @code{==} operator is always defined but for some object types (for example,
class objects) is equivalent to @ref{34a,,is}. The @code{<}, @code{<=}, @code{>} and @code{>=}
operators are only defined where they make sense; for example, they raise a
@ref{199,,TypeError} exception when one of the arguments is a complex number.

@geindex __eq__() (instance method)
@geindex __ne__() (instance method)
@geindex __lt__() (instance method)
@geindex __le__() (instance method)
@geindex __gt__() (instance method)
@geindex __ge__() (instance method)

Non-identical instances of a class normally compare as non-equal unless the
class defines the @ref{cf8,,__eq__()} method.

Instances of a class cannot be ordered with respect to other instances of the
same class, or other types of object, unless the class defines enough of the
methods @ref{14ac,,__lt__()}, @ref{1516,,__le__()}, @ref{1517,,__gt__()}, and
@ref{1518,,__ge__()} (in general, @code{__lt__()} and
@ref{cf8,,__eq__()} are sufficient, if you want the conventional meanings of the
comparison operators).

The behavior of the @ref{34a,,is} and @ref{251e,,is not} operators cannot be
customized; also they can be applied to any two objects and never raise an
exception.

@geindex operator; in
@geindex operator; not in

Two more operations with the same syntactic priority, @ref{349,,in} and
@ref{842,,not in}, are supported by types that are @ref{1433,,iterable} or
implement the @ref{15c5,,__contains__()} method.

@node Numeric Types — int float complex,Boolean Type - bool,Comparisons<2>,Built-in Types
@anchor{library/stdtypes numeric-types-int-float-complex}@anchor{2639}@anchor{library/stdtypes typesnumeric}@anchor{201e}
@subsection Numeric Types — @code{int}, @code{float}, @code{complex}


@geindex object; numeric
@geindex object; Boolean
@geindex object; integer
@geindex object; floating-point
@geindex object; complex number
@geindex C; language

There are three distinct numeric types: `integers', `floating-point
numbers', and `complex numbers'.  In addition, Booleans are a
subtype of integers.  Integers have unlimited precision.  Floating-point
numbers are usually implemented using double in C; information
about the precision and internal representation of floating-point
numbers for the machine on which your program is running is available
in @ref{1e11,,sys.float_info}.  Complex numbers have a real and imaginary
part, which are each a floating-point number.  To extract these parts
from a complex number `z', use @code{z.real} and @code{z.imag}. (The standard
library includes the additional numeric types @ref{215,,fractions.Fraction}, for
rationals, and @ref{200,,decimal.Decimal}, for floating-point numbers with
user-definable precision.)

@geindex numeric; literals
@geindex integer; literals
@geindex floating-point; literals
@geindex complex number; literals
@geindex hexadecimal; literals
@geindex octal; literals
@geindex binary; literals

Numbers are created by numeric literals or as the result of built-in functions
and operators.  Unadorned integer literals (including hex, octal and binary
numbers) yield integers.  Numeric literals containing a decimal point or an
exponent sign yield floating-point numbers.  Appending @code{'j'} or @code{'J'} to a
numeric literal yields an imaginary number (a complex number with a zero real
part) which you can add to an integer or float to get a complex number with real
and imaginary parts.

The constructors @ref{19c,,int()}, @ref{197,,float()}, and
@ref{198,,complex()} can be used to produce numbers of a specific type.

@geindex arithmetic
@geindex built-in function; int
@geindex built-in function; float
@geindex built-in function; complex
@geindex operator; + (plus)
@geindex + (plus); unary operator
@geindex + (plus); binary operator
@geindex operator; - (minus)
@geindex - (minus); unary operator
@geindex - (minus); binary operator
@geindex operator; * (asterisk)
@geindex operator; / (slash)
@geindex operator; //
@geindex operator; % (percent)
@geindex operator; **
@anchor{library/stdtypes stdtypes-mixed-arithmetic}@anchor{24b0}
Python fully supports mixed arithmetic: when a binary arithmetic operator has
operands of different built-in numeric types, the operand with the “narrower”
type is widened to that of the other:


@itemize *

@item 
If both arguments are complex numbers, no conversion is performed;

@item 
if either argument is a complex or a floating-point number, the other is
converted to a floating-point number;

@item 
otherwise, both must be integers and no conversion is necessary.
@end itemize

Arithmetic with complex and real operands is defined by the usual mathematical
formula, for example:

@example
x + complex(u, v) = complex(x + u, v)
x * complex(u, v) = complex(x * u, x * v)
@end example

A comparison between numbers of different types behaves as though the exact
values of those numbers were being compared. @footnote{
As a consequence, the list @code{[1, 2]} is considered equal to @code{[1.0, 2.0]}, and
similarly for tuples.
}

All numeric types (except complex) support the following operations (for priorities of
the operations, see @ref{2532,,Operator precedence}):


@multitable {xxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Operation

@tab

Result

@tab

Notes

@tab

Full documentation

@item

@code{x + y}

@tab

sum of `x' and `y'

@tab

@tab

@item

@code{x - y}

@tab

difference of `x' and `y'

@tab

@tab

@item

@code{x * y}

@tab

product of `x' and `y'

@tab

@tab

@item

@code{x / y}

@tab

quotient of `x' and `y'

@tab

@tab

@item

@code{x // y}

@tab

floored quotient of `x' and
`y'

@tab

(1)(2)

@tab

@item

@code{x % y}

@tab

remainder of @code{x / y}

@tab

(2)

@tab

@item

@code{-x}

@tab

`x' negated

@tab

@tab

@item

@code{+x}

@tab

`x' unchanged

@tab

@tab

@item

@code{abs(x)}

@tab

absolute value or magnitude of
`x'

@tab

@tab

@ref{20d1,,abs()}

@item

@code{int(x)}

@tab

`x' converted to integer

@tab

(3)(6)

@tab

@ref{19c,,int()}

@item

@code{float(x)}

@tab

`x' converted to floating point

@tab

(4)(6)

@tab

@ref{197,,float()}

@item

@code{complex(re, im)}

@tab

a complex number with real part
`re', imaginary part `im'.
`im' defaults to zero.

@tab

(6)

@tab

@ref{198,,complex()}

@item

@code{c.conjugate()}

@tab

conjugate of the complex number
`c'

@tab

@tab

@item

@code{divmod(x, y)}

@tab

the pair @code{(x // y, x % y)}

@tab

(2)

@tab

@ref{b9f,,divmod()}

@item

@code{pow(x, y)}

@tab

`x' to the power `y'

@tab

(5)

@tab

@ref{1a5,,pow()}

@item

@code{x ** y}

@tab

`x' to the power `y'

@tab

(5)

@tab

@end multitable


@geindex operations on; numeric; types
@geindex conjugate() (complex number method)

Notes:


@enumerate 

@item 
Also referred to as integer division.  For operands of type @ref{19c,,int},
the result has type @code{int}.  For operands of type @ref{197,,float},
the result has type @code{float}.  In general, the result is a whole
integer, though the result’s type is not necessarily @code{int}.  The result is
always rounded towards minus infinity: @code{1//2} is @code{0}, @code{(-1)//2} is
@code{-1}, @code{1//(-2)} is @code{-1}, and @code{(-1)//(-2)} is @code{0}.

@item 
Not for complex numbers.  Instead convert to floats using @ref{20d1,,abs()} if
appropriate.

@item 
@geindex module; math
@geindex floor() (in module math)
@geindex ceil() (in module math)
@geindex trunc() (in module math)
@geindex numeric; conversions

Conversion from @ref{197,,float} to @ref{19c,,int} truncates, discarding the
fractional part. See functions @ref{15c9,,math.floor()} and @ref{15ca,,math.ceil()} for
alternative conversions.

@item 
float also accepts the strings “nan” and “inf” with an optional prefix “+”
or “-” for Not a Number (NaN) and positive or negative infinity.

@item 
Python defines @code{pow(0, 0)} and @code{0 ** 0} to be @code{1}, as is common for
programming languages.

@item 
The numeric literals accepted include the digits @code{0} to @code{9} or any
Unicode equivalent (code points with the @code{Nd} property).

See the Unicode Standard@footnote{https://unicode.org/Public/UNIDATA/extracted/DerivedNumericType.txt}
for a complete list of code points with the @code{Nd} property.
@end enumerate

All @ref{263a,,numbers.Real} types (@ref{19c,,int} and @ref{197,,float}) also include
the following operations:


@multitable {xxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Operation

@tab

Result

@item

@ref{15cb,,math.trunc(x)}

@tab

`x' truncated to @ref{2451,,Integral}

@item

@ref{14e6,,round(x[@comma{} n])}

@tab

`x' rounded to `n' digits,
rounding half to even. If `n' is
omitted, it defaults to 0.

@item

@ref{15c9,,math.floor(x)}

@tab

the greatest @ref{2451,,Integral}
<= `x'

@item

@ref{15ca,,math.ceil(x)}

@tab

the least @ref{2451,,Integral} >= `x'

@end multitable


For additional numeric operations see the @ref{92,,math} and @ref{19,,cmath}
modules.

@c XXXJH exceptions: overflow (when? what operations?) zerodivision

@menu
* Bitwise Operations on Integer Types:: 
* Additional Methods on Integer Types:: 
* Additional Methods on Float:: 
* Additional Methods on Complex:: 
* Hashing of numeric types:: 

@end menu

@node Bitwise Operations on Integer Types,Additional Methods on Integer Types,,Numeric Types — int float complex
@anchor{library/stdtypes bitstring-ops}@anchor{263b}@anchor{library/stdtypes bitwise-operations-on-integer-types}@anchor{263c}
@subsubsection Bitwise Operations on Integer Types


@geindex operations on; integer; types
@geindex bitwise; operations
@geindex shifting; operations
@geindex masking; operations
@geindex operator; | (vertical bar)
@geindex operator; ^ (caret)
@geindex operator; & (ampersand)
@geindex operator; <<
@geindex operator; >>
@geindex operator; ~ (tilde)

Bitwise operations only make sense for integers. The result of bitwise
operations is calculated as though carried out in two’s complement with an
infinite number of sign bits.

The priorities of the binary bitwise operations are all lower than the numeric
operations and higher than the comparisons; the unary operation @code{~} has the
same priority as the other unary numeric operations (@code{+} and @code{-}).

This table lists the bitwise operations sorted in ascending priority:


@multitable {xxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxx} 
@headitem

Operation

@tab

Result

@tab

Notes

@item

@code{x | y}

@tab

bitwise `or' of `x' and
`y'

@tab

(4)

@item

@code{x ^ y}

@tab

bitwise `exclusive or' of
`x' and `y'

@tab

(4)

@item

@code{x & y}

@tab

bitwise `and' of `x' and
`y'

@tab

(4)

@item

@code{x << n}

@tab

`x' shifted left by `n' bits

@tab

(1)(2)

@item

@code{x >> n}

@tab

`x' shifted right by `n' bits

@tab

(1)(3)

@item

@code{~x}

@tab

the bits of `x' inverted

@tab

@end multitable


Notes:


@enumerate 

@item 
Negative shift counts are illegal and cause a @ref{2ee,,ValueError} to be raised.

@item 
A left shift by `n' bits is equivalent to multiplication by @code{pow(2, n)}.

@item 
A right shift by `n' bits is equivalent to floor division by @code{pow(2, n)}.

@item 
Performing these calculations with at least one extra sign extension bit in
a finite two’s complement representation (a working bit-width of
@code{1 + max(x.bit_length(), y.bit_length())} or more) is sufficient to get the
same result as if there were an infinite number of sign bits.
@end enumerate

@node Additional Methods on Integer Types,Additional Methods on Float,Bitwise Operations on Integer Types,Numeric Types — int float complex
@anchor{library/stdtypes additional-methods-on-integer-types}@anchor{263d}
@subsubsection Additional Methods on Integer Types


The int type implements the @ref{2451,,numbers.Integral} @ref{13c2,,abstract base class}. In addition, it provides a few more methods:

@geindex bit_length() (int method)
@anchor{library/stdtypes int bit_length}@anchor{263e}
@deffn {Method} int.bit_length ()

Return the number of bits necessary to represent an integer in binary,
excluding the sign and leading zeros:

@example
>>> n = -37
>>> bin(n)
'-0b100101'
>>> n.bit_length()
6
@end example

More precisely, if @code{x} is nonzero, then @code{x.bit_length()} is the
unique positive integer @code{k} such that @code{2**(k-1) <= abs(x) < 2**k}.
Equivalently, when @code{abs(x)} is small enough to have a correctly
rounded logarithm, then @code{k = 1 + int(log(abs(x), 2))}.
If @code{x} is zero, then @code{x.bit_length()} returns @code{0}.

Equivalent to:

@example
def bit_length(self):
    s = bin(self)       # binary representation:  bin(-37) --> '-0b100101'
    s = s.lstrip('-0b') # remove leading zeros and minus sign
    return len(s)       # len('100101') --> 6
@end example


Added in version 3.1.

@end deffn

@geindex bit_count() (int method)
@anchor{library/stdtypes int bit_count}@anchor{9d5}
@deffn {Method} int.bit_count ()

Return the number of ones in the binary representation of the absolute
value of the integer. This is also known as the population count.
Example:

@example
>>> n = 19
>>> bin(n)
'0b10011'
>>> n.bit_count()
3
>>> (-n).bit_count()
3
@end example

Equivalent to:

@example
def bit_count(self):
    return bin(self).count("1")
@end example


Added in version 3.10.

@end deffn

@geindex to_bytes() (int method)
@anchor{library/stdtypes int to_bytes}@anchor{1c75}
@deffn {Method} int.to_bytes (length=1, byteorder='big', *, signed=False)

Return an array of bytes representing an integer.

@example
>>> (1024).to_bytes(2, byteorder='big')
b'\x04\x00'
>>> (1024).to_bytes(10, byteorder='big')
b'\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00'
>>> (-1024).to_bytes(10, byteorder='big', signed=True)
b'\xff\xff\xff\xff\xff\xff\xff\xff\xfc\x00'
>>> x = 1000
>>> x.to_bytes((x.bit_length() + 7) // 8, byteorder='little')
b'\xe8\x03'
@end example

The integer is represented using `length' bytes, and defaults to 1.  An
@ref{a87,,OverflowError} is raised if the integer is not representable with
the given number of bytes.

The `byteorder' argument determines the byte order used to represent the
integer, and defaults to @code{"big"}.  If `byteorder' is
@code{"big"}, the most significant byte is at the beginning of the byte
array.  If `byteorder' is @code{"little"}, the most significant byte is at
the end of the byte array.

The `signed' argument determines whether two’s complement is used to
represent the integer.  If `signed' is @code{False} and a negative integer is
given, an @ref{a87,,OverflowError} is raised. The default value for `signed'
is @code{False}.

The default values can be used to conveniently turn an integer into a
single byte object:

@example
>>> (65).to_bytes()
b'A'
@end example

However, when using the default arguments, don’t try
to convert a value greater than 255 or you’ll get an @ref{a87,,OverflowError}.

Equivalent to:

@example
def to_bytes(n, length=1, byteorder='big', signed=False):
    if byteorder == 'little':
        order = range(length)
    elif byteorder == 'big':
        order = reversed(range(length))
    else:
        raise ValueError("byteorder must be either 'little' or 'big'")

    return bytes((n >> i*8) & 0xff for i in order)
@end example


Added in version 3.2.



Changed in version 3.11: Added default argument values for @code{length} and @code{byteorder}.

@end deffn

@geindex from_bytes() (int class method)
@anchor{library/stdtypes int from_bytes}@anchor{1c2c}
@deffn {Method} classmethod int.from_bytes (bytes, byteorder='big', *, signed=False)

Return the integer represented by the given array of bytes.

@example
>>> int.from_bytes(b'\x00\x10', byteorder='big')
16
>>> int.from_bytes(b'\x00\x10', byteorder='little')
4096
>>> int.from_bytes(b'\xfc\x00', byteorder='big', signed=True)
-1024
>>> int.from_bytes(b'\xfc\x00', byteorder='big', signed=False)
64512
>>> int.from_bytes([255, 0, 0], byteorder='big')
16711680
@end example

The argument `bytes' must either be a @ref{194,,bytes-like object} or an
iterable producing bytes.

The `byteorder' argument determines the byte order used to represent the
integer, and defaults to @code{"big"}.  If `byteorder' is
@code{"big"}, the most significant byte is at the beginning of the byte
array.  If `byteorder' is @code{"little"}, the most significant byte is at
the end of the byte array.  To request the native byte order of the host
system, use @ref{263f,,sys.byteorder} as the byte order value.

The `signed' argument indicates whether two’s complement is used to
represent the integer.

Equivalent to:

@example
def from_bytes(bytes, byteorder='big', signed=False):
    if byteorder == 'little':
        little_ordered = list(bytes)
    elif byteorder == 'big':
        little_ordered = list(reversed(bytes))
    else:
        raise ValueError("byteorder must be either 'little' or 'big'")

    n = sum(b << i*8 for i, b in enumerate(little_ordered))
    if signed and little_ordered and (little_ordered[-1] & 0x80):
        n -= 1 << 8*len(little_ordered)

    return n
@end example


Added in version 3.2.



Changed in version 3.11: Added default argument value for @code{byteorder}.

@end deffn

@geindex as_integer_ratio() (int method)
@anchor{library/stdtypes int as_integer_ratio}@anchor{bc6}
@deffn {Method} int.as_integer_ratio ()

Return a pair of integers whose ratio is equal to the original
integer and has a positive denominator.  The integer ratio of integers
(whole numbers) is always the integer as the numerator and @code{1} as the
denominator.


Added in version 3.8.

@end deffn

@geindex is_integer() (int method)
@anchor{library/stdtypes int is_integer}@anchor{1b2f}
@deffn {Method} int.is_integer ()

Returns @code{True}. Exists for duck type compatibility with @ref{2640,,float.is_integer()}.


Added in version 3.12.

@end deffn

@node Additional Methods on Float,Additional Methods on Complex,Additional Methods on Integer Types,Numeric Types — int float complex
@anchor{library/stdtypes additional-methods-on-float}@anchor{2641}
@subsubsection Additional Methods on Float


The float type implements the @ref{263a,,numbers.Real} @ref{13c2,,abstract base class}. float also has the following additional methods.

@geindex from_number() (float class method)
@anchor{library/stdtypes float from_number}@anchor{195}
@deffn {Method} classmethod float.from_number (x)

Class method to return a floating-point number constructed from a number `x'.

If the argument is an integer or a floating-point number, a
floating-point number with the same value (within Python’s floating-point
precision) is returned.  If the argument is outside the range of a Python
float, an @ref{a87,,OverflowError} will be raised.

For a general Python object @code{x}, @code{float.from_number(x)} delegates to
@code{x.__float__()}.
If @ref{bc7,,__float__()} is not defined then it falls back
to @ref{19f,,__index__()}.


Added in version 3.14.

@end deffn

@geindex as_integer_ratio() (float method)
@anchor{library/stdtypes float as_integer_ratio}@anchor{2145}
@deffn {Method} float.as_integer_ratio ()

Return a pair of integers whose ratio is exactly equal to the
original float. The ratio is in lowest terms and has a positive denominator.  Raises
@ref{a87,,OverflowError} on infinities and a @ref{2ee,,ValueError} on
NaNs.
@end deffn

@geindex is_integer() (float method)
@anchor{library/stdtypes float is_integer}@anchor{2640}
@deffn {Method} float.is_integer ()

Return @code{True} if the float instance is finite with integral
value, and @code{False} otherwise:

@example
>>> (-2.0).is_integer()
True
>>> (3.2).is_integer()
False
@end example
@end deffn

Two methods support conversion to
and from hexadecimal strings.  Since Python’s floats are stored
internally as binary numbers, converting a float to or from a
`decimal' string usually involves a small rounding error.  In
contrast, hexadecimal strings allow exact representation and
specification of floating-point numbers.  This can be useful when
debugging, and in numerical work.

@geindex hex() (float method)
@anchor{library/stdtypes float hex}@anchor{2146}
@deffn {Method} float.hex ()

Return a representation of a floating-point number as a hexadecimal
string.  For finite floating-point numbers, this representation
will always include a leading @code{0x} and a trailing @code{p} and
exponent.
@end deffn

@geindex fromhex() (float class method)
@anchor{library/stdtypes float fromhex}@anchor{2642}
@deffn {Method} classmethod float.fromhex (s)

Class method to return the float represented by a hexadecimal
string `s'.  The string `s' may have leading and trailing
whitespace.
@end deffn

Note that @ref{2146,,float.hex()} is an instance method, while
@ref{2642,,float.fromhex()} is a class method.

A hexadecimal string takes the form:

@example
[sign] ['0x'] integer ['.' fraction] ['p' exponent]
@end example

where the optional @code{sign} may by either @code{+} or @code{-}, @code{integer}
and @code{fraction} are strings of hexadecimal digits, and @code{exponent}
is a decimal integer with an optional leading sign.  Case is not
significant, and there must be at least one hexadecimal digit in
either the integer or the fraction.  This syntax is similar to the
syntax specified in section 6.4.4.2 of the C99 standard, and also to
the syntax used in Java 1.5 onwards.  In particular, the output of
@ref{2146,,float.hex()} is usable as a hexadecimal floating-point literal in
C or Java code, and hexadecimal strings produced by C’s @code{%a} format
character or Java’s @code{Double.toHexString} are accepted by
@ref{2642,,float.fromhex()}.

Note that the exponent is written in decimal rather than hexadecimal,
and that it gives the power of 2 by which to multiply the coefficient.
For example, the hexadecimal string @code{0x3.a7p10} represents the
floating-point number @code{(3 + 10./16 + 7./16**2) * 2.0**10}, or
@code{3740.0}:

@example
>>> float.fromhex('0x3.a7p10')
3740.0
@end example

Applying the reverse conversion to @code{3740.0} gives a different
hexadecimal string representing the same number:

@example
>>> float.hex(3740.0)
'0x1.d380000000000p+11'
@end example

@node Additional Methods on Complex,Hashing of numeric types,Additional Methods on Float,Numeric Types — int float complex
@anchor{library/stdtypes additional-methods-on-complex}@anchor{2643}
@subsubsection Additional Methods on Complex


The @code{complex} type implements the @ref{2644,,numbers.Complex}
@ref{13c2,,abstract base class}.
@code{complex} also has the following additional methods.

@geindex from_number() (complex class method)
@anchor{library/stdtypes complex from_number}@anchor{196}
@deffn {Method} classmethod complex.from_number (x)

Class method to convert a number to a complex number.

For a general Python object @code{x}, @code{complex.from_number(x)} delegates to
@code{x.__complex__()}.  If @ref{7fe,,__complex__()} is not defined then it falls back
to @ref{bc7,,__float__()}.  If @code{__float__()} is not defined then it falls back
to @ref{19f,,__index__()}.


Added in version 3.14.

@end deffn

@node Hashing of numeric types,,Additional Methods on Complex,Numeric Types — int float complex
@anchor{library/stdtypes hashing-of-numeric-types}@anchor{2645}@anchor{library/stdtypes numeric-hash}@anchor{2646}
@subsubsection Hashing of numeric types


For numbers @code{x} and @code{y}, possibly of different types, it’s a requirement
that @code{hash(x) == hash(y)} whenever @code{x == y} (see the @ref{cf9,,__hash__()}
method documentation for more details).  For ease of implementation and
efficiency across a variety of numeric types (including @ref{19c,,int},
@ref{197,,float}, @ref{200,,decimal.Decimal} and @ref{215,,fractions.Fraction})
Python’s hash for numeric types is based on a single mathematical function
that’s defined for any rational number, and hence applies to all instances of
@code{int} and @code{fractions.Fraction}, and all finite instances of
@code{float} and @code{decimal.Decimal}.  Essentially, this function is
given by reduction modulo @code{P} for a fixed prime @code{P}.  The value of @code{P} is
made available to Python as the @ref{2647,,modulus} attribute of
@ref{1205,,sys.hash_info}.

`CPython implementation detail:' Currently, the prime used is @code{P = 2**31 - 1} on machines with 32-bit C
longs and @code{P = 2**61 - 1} on machines with 64-bit C longs.

Here are the rules in detail:


@itemize -

@item 
If @code{x = m / n} is a nonnegative rational number and @code{n} is not divisible
by @code{P}, define @code{hash(x)} as @code{m * invmod(n, P) % P}, where @code{invmod(n,
P)} gives the inverse of @code{n} modulo @code{P}.

@item 
If @code{x = m / n} is a nonnegative rational number and @code{n} is
divisible by @code{P} (but @code{m} is not) then @code{n} has no inverse
modulo @code{P} and the rule above doesn’t apply; in this case define
@code{hash(x)} to be the constant value @code{sys.hash_info.inf}.

@item 
If @code{x = m / n} is a negative rational number define @code{hash(x)}
as @code{-hash(-x)}.  If the resulting hash is @code{-1}, replace it with
@code{-2}.

@item 
The particular values @code{sys.hash_info.inf} and @code{-sys.hash_info.inf}
are used as hash values for positive
infinity or negative infinity (respectively).

@item 
For a @ref{198,,complex} number @code{z}, the hash values of the real
and imaginary parts are combined by computing @code{hash(z.real) +
sys.hash_info.imag * hash(z.imag)}, reduced modulo
@code{2**sys.hash_info.width} so that it lies in
@code{range(-2**(sys.hash_info.width - 1), 2**(sys.hash_info.width -
1))}.  Again, if the result is @code{-1}, it’s replaced with @code{-2}.
@end itemize

To clarify the above rules, here’s some example Python code,
equivalent to the built-in hash, for computing the hash of a rational
number, @ref{197,,float}, or @ref{198,,complex}:

@example
import sys, math

def hash_fraction(m, n):
    """Compute the hash of a rational number m / n.

    Assumes m and n are integers, with n positive.
    Equivalent to hash(fractions.Fraction(m, n)).

    """
    P = sys.hash_info.modulus
    # Remove common factors of P.  (Unnecessary if m and n already coprime.)
    while m % P == n % P == 0:
        m, n = m // P, n // P

    if n % P == 0:
        hash_value = sys.hash_info.inf
    else:
        # Fermat's Little Theorem: pow(n, P-1, P) is 1, so
        # pow(n, P-2, P) gives the inverse of n modulo P.
        hash_value = (abs(m) % P) * pow(n, P - 2, P) % P
    if m < 0:
        hash_value = -hash_value
    if hash_value == -1:
        hash_value = -2
    return hash_value

def hash_float(x):
    """Compute the hash of a float x."""

    if math.isnan(x):
        return object.__hash__(x)
    elif math.isinf(x):
        return sys.hash_info.inf if x > 0 else -sys.hash_info.inf
    else:
        return hash_fraction(*x.as_integer_ratio())

def hash_complex(z):
    """Compute the hash of a complex number z."""

    hash_value = hash_float(z.real) + sys.hash_info.imag * hash_float(z.imag)
    # do a signed reduction modulo 2**sys.hash_info.width
    M = 2**(sys.hash_info.width - 1)
    hash_value = (hash_value & (M - 1)) - (hash_value & M)
    if hash_value == -1:
        hash_value = -2
    return hash_value
@end example
@anchor{library/stdtypes bltin-boolean-values}@anchor{2648}
@node Boolean Type - bool,Iterator Types,Numeric Types — int float complex,Built-in Types
@anchor{library/stdtypes boolean-type-bool}@anchor{2649}@anchor{library/stdtypes typebool}@anchor{2608}
@subsection Boolean Type - @code{bool}


Booleans represent truth values. The @ref{3c1,,bool} type has exactly two
constant instances: @code{True} and @code{False}.

@geindex False
@geindex True
@geindex Boolean; values

The built-in function @ref{3c1,,bool()}  converts any value to a boolean, if the
value can be interpreted as a truth value (see section @ref{18a1,,Truth Value Testing} above).

For logical operations, use the @ref{2635,,boolean operators} @code{and},
@code{or} and @code{not}.
When applying the bitwise operators @code{&}, @code{|}, @code{^} to two booleans, they
return a bool equivalent to the logical operations “and”, “or”, “xor”. However,
the logical operators @code{and}, @code{or} and @code{!=} should be preferred
over @code{&}, @code{|} and @code{^}.


Deprecated since version 3.12: The use of the bitwise inversion operator @code{~} is deprecated and will
raise an error in Python 3.16.


@ref{3c1,,bool} is a subclass of @ref{19c,,int} (see @ref{201e,,Numeric Types — int@comma{} float@comma{} complex}). In
many numeric contexts, @code{False} and @code{True} behave like the integers 0 and 1, respectively.
However, relying on this is discouraged; explicitly convert using @ref{19c,,int()}
instead.

@node Iterator Types,Sequence Types — list tuple range,Boolean Type - bool,Built-in Types
@anchor{library/stdtypes iterator-types}@anchor{264a}@anchor{library/stdtypes typeiter}@anchor{261e}
@subsection Iterator Types


@geindex iterator protocol
@geindex protocol; iterator
@geindex sequence; iteration
@geindex container; iteration over

Python supports a concept of iteration over containers.  This is implemented
using two distinct methods; these are used to allow user-defined classes to
support iteration.  Sequences, described below in more detail, always support
the iteration methods.

One method needs to be defined for container objects to provide @ref{1433,,iterable}
support:

@c XXX duplicated in reference/datamodel!

@geindex __iter__() (container method)
@anchor{library/stdtypes container __iter__}@anchor{20ee}
@deffn {Method} container.__iter__ ()

Return an @ref{4c9,,iterator} object.  The object is required to support the
iterator protocol described below.  If a container supports different types
of iteration, additional methods can be provided to specifically request
iterators for those iteration types.  (An example of an object supporting
multiple forms of iteration would be a tree structure which supports both
breadth-first and depth-first traversal.)  This method corresponds to the
@ref{16fb,,tp_iter} slot of the type structure for Python
objects in the Python/C API.
@end deffn

The iterator objects themselves are required to support the following two
methods, which together form the `iterator protocol':

@geindex __iter__() (iterator method)
@anchor{library/stdtypes iterator __iter__}@anchor{20f1}
@deffn {Method} iterator.__iter__ ()

Return the @ref{4c9,,iterator} object itself.  This is required to allow both
containers and iterators to be used with the @ref{348,,for} and
@ref{349,,in} statements.  This method corresponds to the
@ref{16fb,,tp_iter} slot of the type structure for Python
objects in the Python/C API.
@end deffn

@geindex __next__() (iterator method)
@anchor{library/stdtypes iterator __next__}@anchor{14d9}
@deffn {Method} iterator.__next__ ()

Return the next item from the @ref{4c9,,iterator}.  If there are no further
items, raise the @ref{dfb,,StopIteration} exception.  This method corresponds to
the @ref{16fc,,tp_iternext} slot of the type structure for
Python objects in the Python/C API.
@end deffn

Python defines several iterator objects to support iteration over general and
specific sequence types, dictionaries, and other more specialized forms.  The
specific types are not important beyond their implementation of the iterator
protocol.

Once an iterator’s @ref{14d9,,__next__()} method raises
@ref{dfb,,StopIteration}, it must continue to do so on subsequent calls.
Implementations that do not obey this property are deemed broken.

@menu
* Generator Types:: 

@end menu

@node Generator Types,,,Iterator Types
@anchor{library/stdtypes generator-types}@anchor{264b}@anchor{library/stdtypes id3}@anchor{264c}
@subsubsection Generator Types


Python’s @ref{1267,,generator}s provide a convenient way to implement the iterator
protocol.  If a container object’s @ref{e6f,,__iter__()} method is implemented as a
generator, it will automatically return an iterator object (technically, a
generator object) supplying the @ref{20f1,,__iter__()} and @ref{20f2,,__next__()}
methods.
More information about generators can be found in @ref{24df,,the documentation for the yield expression}.

@node Sequence Types — list tuple range,Text and Binary Sequence Type Methods Summary,Iterator Types,Built-in Types
@anchor{library/stdtypes sequence-types-list-tuple-range}@anchor{264d}@anchor{library/stdtypes typesseq}@anchor{2072}
@subsection Sequence Types — @code{list}, @code{tuple}, @code{range}


There are three basic sequence types: lists, tuples, and range objects.
Additional sequence types tailored for processing of
@ref{260b,,binary data} and @ref{2023,,text strings} are
described in dedicated sections.

@menu
* Common Sequence Operations:: 
* Immutable Sequence Types:: 
* Mutable Sequence Types:: 
* Lists: Lists<2>. 
* Tuples:: 
* Ranges:: 

@end menu

@node Common Sequence Operations,Immutable Sequence Types,,Sequence Types — list tuple range
@anchor{library/stdtypes common-sequence-operations}@anchor{264e}@anchor{library/stdtypes typesseq-common}@anchor{264f}
@subsubsection Common Sequence Operations


@geindex object; sequence

The operations in the following table are supported by most sequence types,
both mutable and immutable. The @ref{13d0,,collections.abc.Sequence} ABC is
provided to make it easier to correctly implement these operations on
custom sequence types.

This table lists the sequence operations sorted in ascending priority.  In the
table, `s' and `t' are sequences of the same type, `n', `i', `j' and `k' are
integers and `x' is an arbitrary object that meets any type and value
restrictions imposed by `s'.

The @code{in} and @code{not in} operations have the same priorities as the
comparison operations. The @code{+} (concatenation) and @code{*} (repetition)
operations have the same priority as the corresponding numeric operations. @footnote{
They must have since the parser can’t tell the type of the operands.
}

@geindex operations on; sequence; types
@geindex built-in function; len
@geindex built-in function; min
@geindex built-in function; max
@geindex concatenation; operation
@geindex repetition; operation
@geindex subscript; operation
@geindex slice; operation
@geindex operator; in
@geindex operator; not in


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxx} 
@headitem

Operation

@tab

Result

@tab

Notes

@item

@code{x in s}

@tab

@code{True} if an item of `s' is
equal to `x', else @code{False}

@tab

(1)

@item

@code{x not in s}

@tab

@code{False} if an item of `s' is
equal to `x', else @code{True}

@tab

(1)

@item

@code{s + t}

@tab

the concatenation of `s' and
`t'

@tab

(6)(7)

@item

@code{s * n} or
@code{n * s}

@tab

equivalent to adding `s' to
itself `n' times

@tab

(2)(7)

@item

@code{s[i]}

@tab

`i'th item of `s', origin 0

@tab

(3)(8)

@item

@code{s[i:j]}

@tab

slice of `s' from `i' to `j'

@tab

(3)(4)

@item

@code{s[i:j:k]}

@tab

slice of `s' from `i' to `j'
with step `k'

@tab

(3)(5)

@item

@code{len(s)}

@tab

length of `s'

@tab

@item

@code{min(s)}

@tab

smallest item of `s'

@tab

@item

@code{max(s)}

@tab

largest item of `s'

@tab

@end multitable


Sequences of the same type also support comparisons.  In particular, tuples
and lists are compared lexicographically by comparing corresponding elements.
This means that to compare equal, every element must compare equal and the
two sequences must be of the same type and have the same length.  (For full
details see @ref{2517,,Comparisons} in the language reference.)

@geindex loop; over mutable sequence
@geindex mutable sequence; loop over

Forward and reversed iterators over mutable sequences access values using an
index.  That index will continue to march forward (or backward) even if the
underlying sequence is mutated.  The iterator terminates only when an
@ref{1741,,IndexError} or a @ref{dfb,,StopIteration} is encountered (or when the index
drops below zero).

Notes:


@enumerate 

@item 
While the @code{in} and @code{not in} operations are used only for simple
containment testing in the general case, some specialised sequences
(such as @ref{16a,,str}, @ref{193,,bytes} and @ref{342,,bytearray}) also use
them for subsequence testing:

@example
>>> "gg" in "eggs"
True
@end example

@item 
Values of `n' less than @code{0} are treated as @code{0} (which yields an empty
sequence of the same type as `s').  Note that items in the sequence `s'
are not copied; they are referenced multiple times.  This often haunts
new Python programmers; consider:

@example
>>> lists = [[]] * 3
>>> lists
[[], [], []]
>>> lists[0].append(3)
>>> lists
[[3], [3], [3]]
@end example

What has happened is that @code{[[]]} is a one-element list containing an empty
list, so all three elements of @code{[[]] * 3} are references to this single empty
list.  Modifying any of the elements of @code{lists} modifies this single list.
You can create a list of different lists this way:

@example
>>> lists = [[] for i in range(3)]
>>> lists[0].append(3)
>>> lists[1].append(5)
>>> lists[2].append(7)
>>> lists
[[3], [5], [7]]
@end example

Further explanation is available in the FAQ entry
@ref{2650,,How do I create a multidimensional list?}.

@item 
If `i' or `j' is negative, the index is relative to the end of sequence `s':
@code{len(s) + i} or @code{len(s) + j} is substituted.  But note that @code{-0} is
still @code{0}.

@item 
The slice of `s' from `i' to `j' is defined as the sequence of items with
index `k' such that @code{i <= k < j}.


@itemize *

@item 
If `i' is omitted or @code{None}, use @code{0}.

@item 
If `j' is omitted or @code{None}, use @code{len(s)}.

@item 
If `i' or `j' is less than @code{-len(s)}, use @code{0}.

@item 
If `i' or `j' is greater than @code{len(s)}, use @code{len(s)}.

@item 
If `i' is greater than or equal to `j', the slice is empty.
@end itemize

@item 
The slice of `s' from `i' to `j' with step `k' is defined as the sequence of
items with index  @code{x = i + n*k} such that @code{0 <= n < (j-i)/k}.  In other words,
the indices are @code{i}, @code{i+k}, @code{i+2*k}, @code{i+3*k} and so on, stopping when
`j' is reached (but never including `j').  When `k' is positive,
`i' and `j' are reduced to @code{len(s)} if they are greater.
When `k' is negative, `i' and `j' are reduced to @code{len(s) - 1} if
they are greater.  If `i' or `j' are omitted or @code{None}, they become
“end” values (which end depends on the sign of `k').  Note, `k' cannot be zero.
If `k' is @code{None}, it is treated like @code{1}.

@item 
Concatenating immutable sequences always results in a new object.  This
means that building up a sequence by repeated concatenation will have a
quadratic runtime cost in the total sequence length.  To get a linear
runtime cost, you must switch to one of the alternatives below:


@itemize *

@item 
if concatenating @ref{16a,,str} objects, you can build a list and use
@ref{2651,,str.join()} at the end or else write to an @ref{112f,,io.StringIO}
instance and retrieve its value when complete

@item 
if concatenating @ref{193,,bytes} objects, you can similarly use
@ref{1763,,bytes.join()} or @ref{10aa,,io.BytesIO}, or you can do in-place
concatenation with a @ref{342,,bytearray} object.  @code{bytearray}
objects are mutable and have an efficient overallocation mechanism

@item 
if concatenating @ref{614,,tuple} objects, extend a @ref{24f,,list} instead

@item 
for other types, investigate the relevant class documentation
@end itemize

@item 
Some sequence types (such as @ref{b43,,range}) only support item sequences
that follow specific patterns, and hence don’t support sequence
concatenation or repetition.

@item 
An @ref{1741,,IndexError} is raised if `i' is outside the sequence range.
@end enumerate

@subsubheading Sequence Methods


Sequence types also support the following methods:


@geindex count() (sequence method)
@anchor{library/stdtypes list count}@anchor{15d1}@anchor{library/stdtypes sequence count}@anchor{241f}
@deffn {Method} sequence.count (value, /)

Return the total number of occurrences of `value' in `sequence'.
@end deffn


@geindex index() (sequence method)
@anchor{library/stdtypes list index}@anchor{15d0}@anchor{library/stdtypes sequence index}@anchor{19bd}
@deffn {Method} sequence.index (value[, start[, stop]])

Return the index of the first occurrence of `value' in `sequence'.

Raises @ref{2ee,,ValueError} if `value' is not found in `sequence'.

The `start' or `stop' arguments allow for efficient searching
of subsections of the sequence, beginning at `start' and ending at `stop'.
This is roughly equivalent to @code{start + sequence[start:stop].index(value)},
only without copying any data.

@cartouche
@quotation Caution 
Not all sequence types support passing the `start' and `stop' arguments.
@end quotation
@end cartouche
@end deffn

@node Immutable Sequence Types,Mutable Sequence Types,Common Sequence Operations,Sequence Types — list tuple range
@anchor{library/stdtypes immutable-sequence-types}@anchor{2652}@anchor{library/stdtypes typesseq-immutable}@anchor{2653}
@subsubsection Immutable Sequence Types


@geindex immutable; sequence; types
@geindex object; tuple
@geindex built-in function; hash

The only operation that immutable sequence types generally implement that is
not also implemented by mutable sequence types is support for the @ref{802,,hash()}
built-in.

This support allows immutable sequences, such as @ref{614,,tuple} instances, to
be used as @ref{184,,dict} keys and stored in @ref{185,,set} and @ref{7f3,,frozenset}
instances.

Attempting to hash an immutable sequence that contains unhashable values will
result in @ref{199,,TypeError}.

@node Mutable Sequence Types,Lists<2>,Immutable Sequence Types,Sequence Types — list tuple range
@anchor{library/stdtypes mutable-sequence-types}@anchor{2654}@anchor{library/stdtypes typesseq-mutable}@anchor{2609}
@subsubsection Mutable Sequence Types


@geindex mutable; sequence; types
@geindex object; list
@geindex object; bytearray

The operations in the following table are defined on mutable sequence types.
The @ref{4c0,,collections.abc.MutableSequence} ABC is provided to make it
easier to correctly implement these operations on custom sequence types.

In the table `s' is an instance of a mutable sequence type, `t' is any
iterable object and `x' is an arbitrary object that meets any type
and value restrictions imposed by `s' (for example, @ref{342,,bytearray} only
accepts integers that meet the value restriction @code{0 <= x <= 255}).

@geindex operations on; sequence; types
@geindex operations on; list; type
@geindex subscript; assignment
@geindex slice; assignment
@geindex statement; del


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Operation

@tab

Result

@tab

Notes

@item

@code{s[i] = x}

@tab

item `i' of `s' is replaced by
`x'

@tab

@item

@code{del s[i]}

@tab

removes item `i' of `s'

@tab

@item

@code{s[i:j] = t}

@tab

slice of `s' from `i' to `j'
is replaced by the contents of
the iterable `t'

@tab

@item

@code{del s[i:j]}

@tab

removes the elements of
@code{s[i:j]} from the list
(same as @code{s[i:j] = []})

@tab

@item

@code{s[i:j:k] = t}

@tab

the elements of @code{s[i:j:k]}
are replaced by those of `t'

@tab

(1)

@item

@code{del s[i:j:k]}

@tab

removes the elements of
@code{s[i:j:k]} from the list

@tab

@item

@code{s += t}

@tab

extends `s' with the
contents of `t' (for the
most part the same as
@code{s[len(s):len(s)] = t})

@tab

@item

@code{s *= n}

@tab

updates `s' with its contents
repeated `n' times

@tab

(2)

@end multitable


Notes:


@enumerate 

@item 
If `k' is not equal to @code{1}, `t' must have the same length as the slice it is replacing.

@item 
The value `n' is an integer, or an object implementing
@ref{19f,,__index__()}.  Zero and negative values of `n' clear
the sequence.  Items in the sequence are not copied; they are referenced
multiple times, as explained for @code{s * n} under @ref{264f,,Common Sequence Operations}.
@end enumerate

@subsubheading Mutable Sequence Methods


Mutable sequence types also support the following methods:


@geindex append() (sequence method)
@anchor{library/stdtypes bytearray append}@anchor{15b1}@anchor{library/stdtypes sequence append}@anchor{241d}
@deffn {Method} sequence.append (value, /)

Append `value' to the end of the sequence.
This is equivalent to writing @code{seq[len(seq):len(seq)] = [value]}.
@end deffn


@geindex clear() (sequence method)
@anchor{library/stdtypes bytearray clear}@anchor{2655}@anchor{library/stdtypes sequence clear}@anchor{241e}
@deffn {Method} sequence.clear ()


Added in version 3.3.


Remove all items from `sequence'.
This is equivalent to writing @code{del sequence[:]}.
@end deffn


@geindex copy() (sequence method)
@anchor{library/stdtypes bytearray copy}@anchor{2656}@anchor{library/stdtypes sequence copy}@anchor{2657}
@deffn {Method} sequence.copy ()


Added in version 3.3.


Create a shallow copy of `sequence'.
This is equivalent to writing @code{sequence[:]}.

@cartouche
@quotation Hint 
The @code{copy()} method is not part of the
@ref{4c0,,MutableSequence} @ref{1120,,ABC},
but most concrete mutable sequence types provide it.
@end quotation
@end cartouche
@end deffn


@geindex extend() (sequence method)
@anchor{library/stdtypes bytearray extend}@anchor{17e3}@anchor{library/stdtypes sequence extend}@anchor{2420}
@deffn {Method} sequence.extend (iterable, /)

Extend `sequence' with the contents of `iterable'.
For the most part, this is the same as writing
@code{seq[len(seq):len(seq)] = iterable}.
@end deffn


@geindex insert() (sequence method)
@anchor{library/stdtypes bytearray insert}@anchor{2658}@anchor{library/stdtypes sequence insert}@anchor{2421}
@deffn {Method} sequence.insert (index, value, /)

Insert `value' into `sequence' at the given `index'.
This is equivalent to writing @code{sequence[index:index] = [value]}.
@end deffn


@geindex pop() (sequence method)
@anchor{library/stdtypes bytearray pop}@anchor{15b2}@anchor{library/stdtypes sequence pop}@anchor{2422}
@deffn {Method} sequence.pop (index=-1, /)

Retrieve the item at `index' and also removes it from `sequence'.
By default, the last item in `sequence' is removed and returned.
@end deffn


@geindex remove() (sequence method)
@anchor{library/stdtypes bytearray remove}@anchor{2659}@anchor{library/stdtypes sequence remove}@anchor{19be}
@deffn {Method} sequence.remove (value, /)

Remove the first item from `sequence' where @code{sequence[i] == value}.

Raises @ref{2ee,,ValueError} if `value' is not found in `sequence'.
@end deffn


@geindex reverse() (sequence method)
@anchor{library/stdtypes bytearray reverse}@anchor{15b3}@anchor{library/stdtypes sequence reverse}@anchor{2423}
@deffn {Method} sequence.reverse ()

Reverse the items of `sequence' in place.
This method maintains economy of space when reversing a large sequence.
To remind users that it operates by side-effect, it returns @code{None}.
@end deffn

@node Lists<2>,Tuples,Mutable Sequence Types,Sequence Types — list tuple range
@anchor{library/stdtypes lists}@anchor{265a}@anchor{library/stdtypes typesseq-list}@anchor{2066}
@subsubsection Lists


@geindex object; list

Lists are mutable sequences, typically used to store collections of
homogeneous items (where the precise degree of similarity will vary by
application).

@geindex list (built-in class)
@anchor{library/stdtypes list}@anchor{24f}
@deffn {Class} list (iterable=(), /)

Lists may be constructed in several ways:


@itemize *

@item 
Using a pair of square brackets to denote the empty list: @code{[]}

@item 
Using square brackets, separating items with commas: @code{[a]}, @code{[a, b, c]}

@item 
Using a list comprehension: @code{[x for x in iterable]}

@item 
Using the type constructor: @code{list()} or @code{list(iterable)}
@end itemize

The constructor builds a list whose items are the same and in the same
order as `iterable'’s items.  `iterable' may be either a sequence, a
container that supports iteration, or an iterator object.  If `iterable'
is already a list, a copy is made and returned, similar to @code{iterable[:]}.
For example, @code{list('abc')} returns @code{['a', 'b', 'c']} and
@code{list( (1, 2, 3) )} returns @code{[1, 2, 3]}.
If no argument is given, the constructor creates a new empty list, @code{[]}.

Many other operations also produce lists, including the @ref{dcd,,sorted()}
built-in.

Lists are @ref{2410,,generic} over the types of their items.

Lists implement all of the @ref{264f,,common} and
@ref{2609,,mutable} sequence operations. Lists also provide the
following additional method:

@geindex sort() (list method)
@anchor{library/stdtypes list sort}@anchor{dce}
@deffn {Method} sort (*, key=None, reverse=False)

This method sorts the list in place, using only @code{<} comparisons
between items. Exceptions are not suppressed - if any comparison operations
fail, the entire sort operation will fail (and the list will likely be left
in a partially modified state).

@code{sort()} accepts two arguments that can only be passed by keyword
(@ref{5a5,,keyword-only arguments}):

`key' specifies a function of one argument that is used to extract a
comparison key from each list element (for example, @code{key=str.lower}).
The key corresponding to each item in the list is calculated once and
then used for the entire sorting process. The default value of @code{None}
means that list items are sorted directly without calculating a separate
key value.

The @ref{13e6,,functools.cmp_to_key()} utility is available to convert a 2.x
style `cmp' function to a `key' function.

`reverse' is a boolean value.  If set to @code{True}, then the list elements
are sorted as if each comparison were reversed.

This method modifies the sequence in place for economy of space when
sorting a large sequence.  To remind users that it operates by side
effect, it does not return the sorted sequence (use @ref{dcd,,sorted()} to
explicitly request a new sorted list instance).

The @code{sort()} method is guaranteed to be stable.  A sort is stable if it
guarantees not to change the relative order of elements that compare equal
— this is helpful for sorting in multiple passes (for example, sort by
department, then by salary grade).

For sorting examples and a brief sorting tutorial, see @ref{2625,,Sorting Techniques}.

`CPython implementation detail:' While a list is being sorted, the effect of attempting to mutate, or even
inspect, the list is undefined.  The C implementation of Python makes the
list appear empty for the duration, and raises @ref{2ee,,ValueError} if it can
detect that the list has been mutated during a sort.
@end deffn
@end deffn


@subsubheading See also


For detailed information on thread-safety guarantees for @ref{24f,,list}
objects, see @ref{265b,,Thread safety for list objects}.


@node Tuples,Ranges,Lists<2>,Sequence Types — list tuple range
@anchor{library/stdtypes tuples}@anchor{265c}@anchor{library/stdtypes typesseq-tuple}@anchor{2591}
@subsubsection Tuples


@geindex object; tuple

Tuples are immutable sequences, typically used to store collections of
heterogeneous data (such as the 2-tuples produced by the @ref{168d,,enumerate()}
built-in). Tuples are also used for cases where an immutable sequence of
homogeneous data is needed (such as allowing storage in a @ref{185,,set} or
@ref{184,,dict} instance).

@geindex tuple (built-in class)
@anchor{library/stdtypes tuple}@anchor{614}
@deffn {Class} tuple (iterable=(), /)

Tuples may be constructed in a number of ways:


@itemize *

@item 
Using a pair of parentheses to denote the empty tuple: @code{()}

@item 
Using a trailing comma for a singleton tuple: @code{a,} or @code{(a,)}

@item 
Separating items with commas: @code{a, b, c} or @code{(a, b, c)}

@item 
Using the @ref{614,,tuple()} built-in: @code{tuple()} or @code{tuple(iterable)}
@end itemize

The constructor builds a tuple whose items are the same and in the same
order as `iterable'’s items.  `iterable' may be either a sequence, a
container that supports iteration, or an iterator object.  If `iterable'
is already a tuple, it is returned unchanged. For example,
@code{tuple('abc')} returns @code{('a', 'b', 'c')} and
@code{tuple( [1, 2, 3] )} returns @code{(1, 2, 3)}.
If no argument is given, the constructor creates a new empty tuple, @code{()}.

Note that it is actually the comma which makes a tuple, not the parentheses.
The parentheses are optional, except in the empty tuple case, or
when they are needed to avoid syntactic ambiguity. For example,
@code{f(a, b, c)} is a function call with three arguments, while
@code{f((a, b, c))} is a function call with a 3-tuple as the sole argument.

Tuples implement all of the @ref{264f,,common} sequence
operations.

Tuples are @ref{2410,,generic} over the types of their contents.
For more information, refer to
@ref{265d,,the typing documentation on annotating tuples}.
@end deffn

For heterogeneous collections of data where access by name is clearer than
access by index, @ref{4e1,,collections.namedtuple()} may be a more appropriate
choice than a simple tuple object.

@node Ranges,,Tuples,Sequence Types — list tuple range
@anchor{library/stdtypes ranges}@anchor{265e}@anchor{library/stdtypes typesseq-range}@anchor{2624}
@subsubsection Ranges


@geindex object; range

The @ref{b43,,range} type represents an immutable sequence of numbers and is
commonly used for looping a specific number of times in @ref{348,,for}
loops.

@geindex range (built-in class)
@anchor{library/stdtypes range}@anchor{b43}
@deffn {Class} range (stop, /)

@deffnx {Class} range (start, stop, step=1, /)

The arguments to the range constructor must be integers (either built-in
@ref{19c,,int} or any object that implements the @ref{19f,,__index__()} special
method).  If the `step' argument is omitted, it defaults to @code{1}.
If the `start' argument is omitted, it defaults to @code{0}.
If `step' is zero, @ref{2ee,,ValueError} is raised.

For a positive `step', the contents of a range @code{r} are determined by the
formula @code{r[i] = start + step*i} where @code{i >= 0} and
@code{r[i] < stop}.

For a negative `step', the contents of the range are still determined by
the formula @code{r[i] = start + step*i}, but the constraints are @code{i >= 0}
and @code{r[i] > stop}.

A range object will be empty if @code{r[0]} does not meet the value
constraint. Ranges do support negative indices, but these are interpreted
as indexing from the end of the sequence determined by the positive
indices.

Ranges containing absolute values larger than @ref{13d1,,sys.maxsize} are
permitted but some features (such as @ref{841,,len()}) may raise
@ref{a87,,OverflowError}.

Range examples:

@example
>>> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(range(1, 11))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> list(range(0, 30, 5))
[0, 5, 10, 15, 20, 25]
>>> list(range(0, 10, 3))
[0, 3, 6, 9]
>>> list(range(0, -10, -1))
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
>>> list(range(0))
[]
>>> list(range(1, 0))
[]
@end example

Ranges implement all of the @ref{264f,,common} sequence operations
except concatenation and repetition (due to the fact that range objects can
only represent sequences that follow a strict pattern and repetition and
concatenation will usually violate that pattern).

@geindex start (range attribute)
@anchor{library/stdtypes range start}@anchor{265f}
@deffn {Attribute} start

The value of the `start' parameter (or @code{0} if the parameter was
not supplied)
@end deffn

@geindex stop (range attribute)
@anchor{library/stdtypes range stop}@anchor{2660}
@deffn {Attribute} stop

The value of the `stop' parameter
@end deffn

@geindex step (range attribute)
@anchor{library/stdtypes range step}@anchor{2661}
@deffn {Attribute} step

The value of the `step' parameter (or @code{1} if the parameter was
not supplied)
@end deffn
@end deffn

The advantage of the @ref{b43,,range} type over a regular @ref{24f,,list} or
@ref{614,,tuple} is that a @code{range} object will always take the same
(small) amount of memory, no matter the size of the range it represents (as it
only stores the @code{start}, @code{stop} and @code{step} values, calculating individual
items and subranges as needed).

Range objects implement the @ref{13d0,,collections.abc.Sequence} ABC, and provide
features such as containment tests, element index lookup, slicing and
support for negative indices (see @ref{2072,,Sequence Types — list@comma{} tuple@comma{} range}):

@example
>>> r = range(0, 20, 2)
>>> r
range(0, 20, 2)
>>> 11 in r
False
>>> 10 in r
True
>>> r.index(10)
5
>>> r[5]
10
>>> r[:5]
range(0, 10, 2)
>>> r[-1]
18
@end example

Testing range objects for equality with @code{==} and @code{!=} compares
them as sequences.  That is, two range objects are considered equal if
they represent the same sequence of values.  (Note that two range
objects that compare equal might have different @ref{265f,,start},
@ref{2660,,stop} and @ref{2661,,step} attributes, for example
@code{range(0) == range(2, 1, 3)} or @code{range(0, 3, 2) == range(0, 4, 2)}.)


Changed in version 3.2: Implement the Sequence ABC.
Support slicing and negative indices.
Test @ref{19c,,int} objects for membership in constant time instead of
iterating through all items.



Changed in version 3.3: Define ‘==’ and ‘!=’ to compare range objects based on the
sequence of values they define (instead of comparing based on
object identity).

Added the @ref{265f,,start}, @ref{2660,,stop} and @ref{2661,,step}
attributes.



@subsubheading See also



@itemize *

@item 
The linspace recipe@footnote{https://code.activestate.com/recipes/579000-equally-spaced-numbers-linspace/}
shows how to implement a lazy version of range suitable for floating-point
applications.
@end itemize


@geindex string; text sequence type
@geindex str (built-in class); (see also string)
@geindex object; string

@node Text and Binary Sequence Type Methods Summary,Text Sequence Type — str,Sequence Types — list tuple range,Built-in Types
@anchor{library/stdtypes text-and-binary-sequence-type-methods-summary}@anchor{2662}@anchor{library/stdtypes text-methods-summary}@anchor{2663}
@subsection Text and Binary Sequence Type Methods Summary


The following table summarizes the text and binary sequence types methods by
category.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxx} {xx} {xx} {xxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxx} {xx} {xx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Category

@tab

@ref{16a,,str} methods

@tab

@tab

@tab

@tab

@ref{193,,bytes} and @ref{342,,bytearray} methods

@tab

@tab

@tab

@item

Formatting

@tab

@ref{834,,str.format()}

@tab

@tab

@tab

@tab

@tab

@tab

@tab

@item

@ref{fdd,,str.format_map()}

@tab

@tab

@tab

@tab

@tab

@tab

@tab

@item

@ref{19b,,f-strings}

@tab

@tab

@tab

@tab

@tab

@tab

@tab

@item

@ref{8dd,,printf-style String Formatting}

@tab

@tab

@tab

@tab

@ref{f87,,printf-style Bytes Formatting}

@tab

@tab

@tab

@item

Searching and Replacing

@tab

@ref{10ae,,str.find()}

@tab

@ref{10af,,str.rfind()}

@tab

@tab

@tab

@ref{1c17,,bytes.find()}

@tab

@ref{1c18,,bytes.rfind()}

@tab

@tab

@item

@ref{19fe,,str.index()}

@tab

@ref{1463,,str.rindex()}

@tab

@tab

@tab

@ref{2664,,bytes.index()}

@tab

@ref{2665,,bytes.rindex()}

@tab

@tab

@item

@ref{10d1,,str.startswith()}

@tab

@tab

@tab

@tab

@ref{2666,,bytes.startswith()}

@tab

@tab

@tab

@item

@ref{10d2,,str.endswith()}

@tab

@tab

@tab

@tab

@ref{2667,,bytes.endswith()}

@tab

@tab

@tab

@item

@ref{19c5,,str.count()}

@tab

@tab

@tab

@tab

@ref{19c6,,bytes.count()}

@tab

@tab

@tab

@item

@ref{4b9,,str.replace()}

@tab

@tab

@tab

@tab

@ref{2668,,bytes.replace()}

@tab

@tab

@tab

@item

Splitting and Joining

@tab

@ref{10b0,,str.split()}

@tab

@tab

@ref{1461,,str.rsplit()}

@tab

@tab

@ref{2669,,bytes.split()}

@tab

@tab

@ref{266a,,bytes.rsplit()}

@tab

@item

@ref{1462,,str.splitlines()}

@tab

@tab

@tab

@tab

@ref{266b,,bytes.splitlines()}

@tab

@tab

@tab

@item

@ref{10b1,,str.partition()}

@tab

@tab

@tab

@tab

@ref{266c,,bytes.partition()}

@tab

@tab

@tab

@item

@ref{1464,,str.rpartition()}

@tab

@tab

@tab

@tab

@ref{266d,,bytes.rpartition()}

@tab

@tab

@tab

@item

@ref{2651,,str.join()}

@tab

@tab

@tab

@tab

@ref{1763,,bytes.join()}

@tab

@tab

@tab

@item

String Classification

@tab

@ref{266e,,str.isalpha()}

@tab

@tab

@tab

@tab

@ref{266f,,bytes.isalpha()}

@tab

@tab

@tab

@item

@ref{2670,,str.isdecimal()}

@tab

@tab

@tab

@tab

@tab

@tab

@tab

@item

@ref{2671,,str.isdigit()}

@tab

@tab

@tab

@tab

@ref{2672,,bytes.isdigit()}

@tab

@tab

@tab

@item

@ref{2673,,str.isnumeric()}

@tab

@tab

@tab

@tab

@tab

@tab

@tab

@item

@ref{2674,,str.isalnum()}

@tab

@tab

@tab

@tab

@ref{2675,,bytes.isalnum()}

@tab

@tab

@tab

@item

@ref{1d8a,,str.isidentifier()}

@tab

@tab

@tab

@tab

@tab

@tab

@tab

@item

@ref{2676,,str.islower()}

@tab

@tab

@tab

@tab

@ref{2677,,bytes.islower()}

@tab

@tab

@tab

@item

@ref{2678,,str.isupper()}

@tab

@tab

@tab

@tab

@ref{2679,,bytes.isupper()}

@tab

@tab

@tab

@item

@ref{267a,,str.istitle()}

@tab

@tab

@tab

@tab

@ref{267b,,bytes.istitle()}

@tab

@tab

@tab

@item

@ref{267c,,str.isspace()}

@tab

@tab

@tab

@tab

@ref{267d,,bytes.isspace()}

@tab

@tab

@tab

@item

@ref{fde,,str.isprintable()}

@tab

@tab

@tab

@tab

@tab

@tab

@tab

@item

Case Manipulation

@tab

@ref{1bba,,str.lower()}

@tab

@tab

@tab

@tab

@ref{267e,,bytes.lower()}

@tab

@tab

@tab

@item

@ref{267f,,str.upper()}

@tab

@tab

@tab

@tab

@ref{2680,,bytes.upper()}

@tab

@tab

@tab

@item

@ref{fdc,,str.casefold()}

@tab

@tab

@tab

@tab

@tab

@tab

@tab

@item

@ref{2681,,str.capitalize()}

@tab

@tab

@tab

@tab

@ref{2682,,bytes.capitalize()}

@tab

@tab

@tab

@item

@ref{2683,,str.title()}

@tab

@tab

@tab

@tab

@ref{2684,,bytes.title()}

@tab

@tab

@tab

@item

@ref{2685,,str.swapcase()}

@tab

@tab

@tab

@tab

@ref{2686,,bytes.swapcase()}

@tab

@tab

@tab

@item

Padding and Stripping

@tab

@ref{20a6,,str.ljust()}

@tab

@tab

@ref{20a5,,str.rjust()}

@tab

@tab

@ref{2687,,bytes.ljust()}

@tab

@tab

@ref{2688,,bytes.rjust()}

@tab

@item

@ref{20a7,,str.center()}

@tab

@tab

@tab

@tab

@ref{2689,,bytes.center()}

@tab

@tab

@tab

@item

@ref{268a,,str.expandtabs()}

@tab

@tab

@tab

@tab

@ref{268b,,bytes.expandtabs()}

@tab

@tab

@tab

@item

@ref{16bb,,str.strip()}

@tab

@tab

@tab

@tab

@ref{268c,,bytes.strip()}

@tab

@tab

@tab

@item

@ref{16bc,,str.lstrip()}

@tab

@tab

@tab

@ref{16bd,,str.rstrip()}

@tab

@ref{268d,,bytes.lstrip()}

@tab

@tab

@tab

@ref{268e,,bytes.rstrip()}

@item

Translation and Encoding

@tab

@ref{268f,,str.translate()}

@tab

@tab

@tab

@tab

@ref{2690,,bytes.translate()}

@tab

@tab

@tab

@item

@ref{fdf,,str.maketrans()}

@tab

@tab

@tab

@tab

@ref{1480,,bytes.maketrans()}

@tab

@tab

@tab

@item

@ref{ad8,,str.encode()}

@tab

@tab

@tab

@tab

@tab

@tab

@tab

@item

@tab

@tab

@tab

@tab

@ref{ad9,,bytes.decode()}

@tab

@tab

@tab

@end multitable


@node Text Sequence Type — str,Binary Sequence Types — bytes bytearray memoryview,Text and Binary Sequence Type Methods Summary,Built-in Types
@anchor{library/stdtypes text-sequence-type-str}@anchor{2691}@anchor{library/stdtypes textseq}@anchor{2023}
@subsection Text Sequence Type — @code{str}


Textual data in Python is handled with @ref{16a,,str} objects, or `strings'.
Strings are immutable
@ref{2072,,sequences} of Unicode code points.  String literals are
written in a variety of ways:


@itemize *

@item 
Single quotes: @code{'allows embedded "double" quotes'}

@item 
Double quotes: @code{"allows embedded 'single' quotes"}

@item 
Triple quoted: @code{'@w{'}'Three single quotes'@w{'}'}, @code{"""Three double quotes"""}
@end itemize

Triple quoted strings may span multiple lines - all associated whitespace will
be included in the string literal.

String literals that are part of a single expression and have only whitespace
between them will be implicitly converted to a single string literal. That
is, @code{("spam " "eggs") == "spam eggs"}.

See @ref{22e3,,String and Bytes literals} for more about the various forms of string literal,
including supported @ref{688,,escape sequences}, and the @code{r} (“raw”) prefix that
disables most escape sequence processing.

Strings may also be created from other objects using the @ref{16a,,str}
constructor.

Since there is no separate “character” type, indexing a string produces
strings of length 1. That is, for a non-empty string `s', @code{s[0] == s[0:1]}.

@geindex object; io.StringIO

There is also no mutable string type, but @ref{2651,,str.join()} or
@ref{112f,,io.StringIO} can be used to efficiently construct strings from
multiple fragments.


Changed in version 3.3: For backwards compatibility with the Python 2 series, the @code{u} prefix is
once again permitted on string literals. It has no effect on the meaning
of string literals and cannot be combined with the @code{r} prefix.


@geindex string; str (built-in class)

@geindex str (built-in class)
@anchor{library/stdtypes str}@anchor{16a}
@deffn {Class} str (*, encoding='utf-8', errors='strict')

@deffnx {Class} str (object)

@deffnx {Class} str (object, encoding, errors='strict')

@deffnx {Class} str (object, *, errors)

Return a @ref{2023,,string} version of `object'.  If `object' is not
provided, returns the empty string.  Otherwise, the behavior of @code{str()}
depends on whether `encoding' or `errors' is given, as follows.

If neither `encoding' nor `errors' is given, @code{str(object)} returns
@ref{831,,type(object).__str__(object)},
which is the “informal” or nicely
printable string representation of `object'.  For string objects, this is
the string itself.  If `object' does not have a @code{__str__()}
method, then @ref{16a,,str()} falls back to returning
@ref{1c3,,repr(object)}.

@geindex buffer protocol; str (built-in class)
@geindex bytes; str (built-in class)

If at least one of `encoding' or `errors' is given, `object' should be a
@ref{194,,bytes-like object} (e.g. @ref{193,,bytes} or @ref{342,,bytearray}).  In
this case, if `object' is a @code{bytes} (or @code{bytearray}) object,
then @code{str(bytes, encoding, errors)} is equivalent to
@ref{ad9,,bytes.decode(encoding@comma{} errors)}.  Otherwise, the bytes
object underlying the buffer object is obtained before calling
@code{bytes.decode()}.  See @ref{260b,,Binary Sequence Types — bytes@comma{} bytearray@comma{} memoryview} and
@ref{262,,Buffer Protocol} for information on buffer objects.

Passing a @ref{193,,bytes} object to @ref{16a,,str()} without the `encoding'
or `errors' arguments falls under the first case of returning the informal
string representation (see also the @ref{7fa,,-b} command-line option to
Python).  For example:

@example
>>> str(b'Zoot!')
"b'Zoot!'"
@end example

For more information on the @code{str} class and its methods, see
@ref{2023,,Text Sequence Type — str} and the @ref{2024,,String Methods} section below.  To output
formatted strings, see the @ref{19b,,f-strings} and @ref{15a7,,Format string syntax}
sections.  In addition, see the @ref{2692,,Text Processing Services} section.
@end deffn

@geindex string; methods

@menu
* String Methods: String Methods<2>. 
* Formatted String Literals (f-strings): Formatted String Literals f-strings. 
* Template String Literals (t-strings): Template String Literals t-strings. 
* printf-style String Formatting:: 

@end menu

@node String Methods<2>,Formatted String Literals f-strings,,Text Sequence Type — str
@anchor{library/stdtypes id5}@anchor{2693}@anchor{library/stdtypes string-methods}@anchor{2024}
@subsubsection String Methods


@geindex module; re

Strings implement all of the @ref{264f,,common} sequence
operations, along with the additional methods described below.

Strings also support two styles of string formatting, one providing a large
degree of flexibility and customization (see @ref{834,,str.format()},
@ref{15a7,,Format string syntax} and @ref{2694,,Custom string formatting}) and the other based on C
@code{printf} style formatting that handles a narrower range of types and is
slightly harder to use correctly, but is often faster for the cases it can
handle (@ref{8dd,,printf-style String Formatting}).

The @ref{2695,,Text Processing Services} section of the standard library covers a number of
other modules that provide various text related utilities (including regular
expression support in the @ref{be,,re} module).

@geindex capitalize() (str method)
@anchor{library/stdtypes str capitalize}@anchor{2681}
@deffn {Method} str.capitalize ()

Return a copy of the string with its first character capitalized and the
rest lowercased.


Changed in version 3.8: The first character is now put into titlecase rather than uppercase.
This means that characters like digraphs will only have their first
letter capitalized, instead of the full character.

@end deffn

@geindex casefold() (str method)
@anchor{library/stdtypes str casefold}@anchor{fdc}
@deffn {Method} str.casefold ()

Return a casefolded copy of the string. Casefolded strings may be used for
caseless matching.

Casefolding is similar to lowercasing but more aggressive because it is
intended to remove all case distinctions in a string. For example, the German
lowercase letter @code{'ß'} is equivalent to @code{"ss"}. Since it is already
lowercase, @ref{1bba,,lower()} would do nothing to @code{'ß'}; @code{casefold()}
converts it to @code{"ss"}.
For example:

@example
>>> 'straße'.lower()
'straße'
>>> 'straße'.casefold()
'strasse'
@end example

The casefolding algorithm is
described in section 3.13 'Default Case Folding' of the Unicode Standard@footnote{https://www.unicode.org/versions/Unicode16.0.0/core-spec/chapter-3/#G33992}.


Added in version 3.3.

@end deffn

@geindex center() (str method)
@anchor{library/stdtypes str center}@anchor{20a7}
@deffn {Method} str.center (width, fillchar=' ', /)

Return centered in a string of length `width'. Padding is done using the
specified `fillchar' (default is an ASCII space). The original string is
returned if `width' is less than or equal to @code{len(s)}.  For example:

@example
>>> 'Python'.center(10)
'  Python  '
>>> 'Python'.center(10, '-')
'--Python--'
>>> 'Python'.center(4)
'Python'
@end example
@end deffn

@geindex count() (str method)
@anchor{library/stdtypes str count}@anchor{19c5}
@deffn {Method} str.count (sub[, start[, end]])

Return the number of non-overlapping occurrences of substring `sub' in the
range [`start', `end'].  Optional arguments `start' and `end' are
interpreted as in slice notation.

If `sub' is empty, returns the number of empty strings between characters
which is the length of the string plus one. For example:

@example
>>> 'spam, spam, spam'.count('spam')
3
>>> 'spam, spam, spam'.count('spam', 5)
2
>>> 'spam, spam, spam'.count('spam', 5, 10)
1
>>> 'spam, spam, spam'.count('eggs')
0
>>> 'spam, spam, spam'.count('@w{'})
17
@end example
@end deffn

@geindex encode() (str method)
@anchor{library/stdtypes str encode}@anchor{ad8}
@deffn {Method} str.encode (encoding='utf-8', errors='strict')

Return the string encoded to @ref{193,,bytes}.

`encoding' defaults to @code{'utf-8'};
see @ref{fbe,,Standard Encodings} for possible values.

`errors' controls how encoding errors are handled.
If @code{'strict'} (the default), a @ref{460,,UnicodeError} exception is raised.
Other possible values are @code{'ignore'},
@code{'replace'}, @code{'xmlcharrefreplace'}, @code{'backslashreplace'} and any
other name registered via @ref{16a7,,codecs.register_error()}.
See @ref{1bb3,,Error Handlers} for details.

For performance reasons, the value of `errors' is not checked for validity
unless an encoding error actually occurs,
@ref{509,,Python Development Mode} is enabled
or a @ref{50a,,debug build} is used.
For example:

@example
>>> encoded_str_to_bytes = 'Python'.encode()
>>> type(encoded_str_to_bytes)
<class 'bytes'>
>>> encoded_str_to_bytes
b'Python'
@end example


Changed in version 3.1: Added support for keyword arguments.



Changed in version 3.9: The value of the `errors' argument is now checked in @ref{509,,Python Development Mode} and
in @ref{50a,,debug mode}.

@end deffn

@geindex endswith() (str method)
@anchor{library/stdtypes str endswith}@anchor{10d2}
@deffn {Method} str.endswith (suffix[, start[, end]])

Return @code{True} if the string ends with the specified `suffix', otherwise return
@code{False}.  `suffix' can also be a tuple of suffixes to look for.  With optional
`start', test beginning at that position.  With optional `end', stop comparing
at that position. Using `start' and `end' is equivalent to
@code{str[start:end].endswith(suffix)}. For example:

@example
>>> 'Python'.endswith('on')
True
>>> 'a tuple of suffixes'.endswith(('at', 'in'))
False
>>> 'a tuple of suffixes'.endswith(('at', 'es'))
True
>>> 'Python is amazing'.endswith('is', 0, 9)
True
@end example

See also @ref{10d1,,startswith()} and @ref{ad3,,removesuffix()}.
@end deffn

@geindex expandtabs() (str method)
@anchor{library/stdtypes str expandtabs}@anchor{268a}
@deffn {Method} str.expandtabs (tabsize=8)

Return a copy of the string where all tab characters are replaced by one or
more spaces, depending on the current column and the given tab size.  Tab
positions occur every `tabsize' characters (default is 8, giving tab
positions at columns 0, 8, 16 and so on).  To expand the string, the current
column is set to zero and the string is examined character by character.  If
the character is a tab (@code{\t}), one or more space characters are inserted
in the result until the current column is equal to the next tab position.
(The tab character itself is not copied.)  If the character is a newline
(@code{\n}) or return (@code{\r}), it is copied and the current column is reset to
zero.  Any other character is copied unchanged and the current column is
incremented by one regardless of how the character is represented when
printed. For example:

@example
>>> '01\t012\t0123\t01234'.expandtabs()
'01      012     0123    01234'
>>> '01\t012\t0123\t01234'.expandtabs(4)
'01  012 0123    01234'
>>> print('01\t012\n0123\t01234'.expandtabs(4))
01  012
0123    01234
@end example
@end deffn

@geindex find() (str method)
@anchor{library/stdtypes str find}@anchor{10ae}
@deffn {Method} str.find (sub[, start[, end]])

Return the lowest index in the string where substring `sub' is found within
the slice @code{s[start:end]}.  Optional arguments `start' and `end' are
interpreted as in slice notation.  Return @code{-1} if `sub' is not found.
For example:

@example
>>> 'spam, spam, spam'.find('sp')
0
>>> 'spam, spam, spam'.find('sp', 5)
6
@end example

See also @ref{10af,,rfind()} and @ref{19fe,,index()}.

@cartouche
@quotation Note 
The @code{find()} method should be used only if you need to know the
position of `sub'.  To check if `sub' is a substring or not, use the
@ref{349,,in} operator:

@example
>>> 'Py' in 'Python'
True
@end example
@end quotation
@end cartouche
@end deffn

@geindex format() (str method)
@anchor{library/stdtypes str format}@anchor{834}
@deffn {Method} str.format (*args, **kwargs)

Perform a string formatting operation.  The string on which this method is
called can contain literal text or replacement fields delimited by braces
@code{@{@}}.  Each replacement field contains either the numeric index of a
positional argument, or the name of a keyword argument.  Returns a copy of
the string where each replacement field is replaced with the string value of
the corresponding argument. For example:

@example
>>> "The sum of 1 + 2 is @{0@}".format(1+2)
'The sum of 1 + 2 is 3'
>>> "The sum of @{a@} + @{b@} is @{answer@}".format(answer=1+2, a=1, b=2)
'The sum of 1 + 2 is 3'
>>> "@{1@} expects the @{0@} Inquisition!".format("Spanish", "Nobody")
'Nobody expects the Spanish Inquisition!'
@end example

See @ref{15a7,,Format string syntax} for a description of the various formatting options
that can be specified in format strings.

@cartouche
@quotation Note 
When formatting a number (@ref{19c,,int}, @ref{197,,float}, @ref{198,,complex},
@ref{200,,decimal.Decimal} and subclasses) with the @code{n} type
(ex: @code{'@{:n@}'.format(1234)}), the function temporarily sets the
@code{LC_CTYPE} locale to the @code{LC_NUMERIC} locale to decode
@code{decimal_point} and @code{thousands_sep} fields of @code{localeconv()} if
they are non-ASCII or longer than 1 byte, and the @code{LC_NUMERIC} locale is
different than the @code{LC_CTYPE} locale.  This temporary change affects
other threads.
@end quotation
@end cartouche


Changed in version 3.7: When formatting a number with the @code{n} type, the function sets
temporarily the @code{LC_CTYPE} locale to the @code{LC_NUMERIC} locale in some
cases.

@end deffn

@geindex format_map() (str method)
@anchor{library/stdtypes str format_map}@anchor{fdd}
@deffn {Method} str.format_map (mapping, /)

Similar to @code{str.format(**mapping)}, except that @code{mapping} is
used directly and not copied to a @ref{184,,dict}.  This is useful
if for example @code{mapping} is a dict subclass:

@example
>>> class Default(dict):
...     def __missing__(self, key):
...         return key
...
>>> '@{name@} was born in @{country@}'.format_map(Default(name='Guido'))
'Guido was born in country'
@end example


Added in version 3.2.

@end deffn

@geindex index() (str method)
@anchor{library/stdtypes str index}@anchor{19fe}
@deffn {Method} str.index (sub[, start[, end]])

Like @ref{10ae,,find()}, but raise @ref{2ee,,ValueError} when the substring is
not found. For example:

@example
>>> 'spam, spam, spam'.index('spam')
0
>>> 'spam, spam, spam'.index('eggs')
Traceback (most recent call last):
  File "<python-input-0>", line 1, in <module>
    'spam, spam, spam'.index('eggs')
    ~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^
ValueError: substring not found
@end example

See also @ref{1463,,rindex()}.
@end deffn

@geindex isalnum() (str method)
@anchor{library/stdtypes str isalnum}@anchor{2674}
@deffn {Method} str.isalnum ()

Return @code{True} if all characters in the string are alphanumeric and there is at
least one character, @code{False} otherwise.  A character @code{c} is alphanumeric if one
of the following returns @code{True}: @code{c.isalpha()}, @code{c.isdecimal()},
@code{c.isdigit()}, or @code{c.isnumeric()}. For example:

@example
>>> 'abc123'.isalnum()
True
>>> 'abc123!@@#'.isalnum()
False
>>> '@w{'}.isalnum()
False
>>> ' '.isalnum()
False
@end example
@end deffn

@geindex isalpha() (str method)
@anchor{library/stdtypes str isalpha}@anchor{266e}
@deffn {Method} str.isalpha ()

Return @code{True} if all characters in the string are alphabetic and there is at least
one character, @code{False} otherwise.  Alphabetic characters are those characters defined
in the Unicode character database as “Letter”, i.e., those with general category
property being one of “Lm”, “Lt”, “Lu”, “Ll”, or “Lo”.  Note that this is different
from the Alphabetic property defined in the section 4.10 'Letters@comma{} Alphabetic@comma{} and Ideographic' of the Unicode Standard@footnote{https://www.unicode.org/versions/Unicode16.0.0/core-spec/chapter-4/#G91002}.
For example:

@example
>>> 'Letters and spaces'.isalpha()
False
>>> 'LettersOnly'.isalpha()
True
>>> 'µ'.isalpha()  # non-ASCII characters can be considered alphabetical too
True
@end example

See @ref{2696,,Unicode Properties}.
@end deffn

@geindex isascii() (str method)
@anchor{library/stdtypes str isascii}@anchor{cef}
@deffn {Method} str.isascii ()

Return @code{True} if the string is empty or all characters in the string are ASCII,
@code{False} otherwise.
ASCII characters have code points in the range U+0000-U+007F. For example:

@example
>>> 'ASCII characters'.isascii()
True
>>> 'µ'.isascii()
False
@end example


Added in version 3.7.

@end deffn

@geindex isdecimal() (str method)
@anchor{library/stdtypes str isdecimal}@anchor{2670}
@deffn {Method} str.isdecimal ()

Return @code{True} if all characters in the string are decimal
characters and there is at least one character, @code{False}
otherwise. Decimal characters are those that can be used to form
numbers in base 10, such as U+0660, ARABIC-INDIC DIGIT
ZERO.  Formally a decimal character is a character in the Unicode
General Category “Nd”. For example:

@example
>>> '0123456789'.isdecimal()
True
>>> '٠١٢٣٤٥٦٧٨٩'.isdecimal()  # Arabic-Indic digits zero to nine
True
>>> 'alphabetic'.isdecimal()
False
@end example
@end deffn

@geindex isdigit() (str method)
@anchor{library/stdtypes str isdigit}@anchor{2671}
@deffn {Method} str.isdigit ()

Return @code{True} if all characters in the string are digits and there is at least one
character, @code{False} otherwise.  Digits include decimal characters and digits that need
special handling, such as the compatibility superscript digits.
This covers digits which cannot be used to form numbers in base 10,
like the Kharosthi numbers@footnote{https://en.wikipedia.org/wiki/Kharosthi#Numerals}.
Formally, a digit is a character that has the
property value Numeric_Type=Digit or Numeric_Type=Decimal.

For example:

@example
>>> '0123456789'.isdigit()
True
>>> '٠١٢٣٤٥٦٧٨٩'.isdigit()  # Arabic-Indic digits zero to nine
True
>>> '⅕'.isdigit()  # Vulgar fraction one fifth
False
>>> '²'.isdecimal(), '²'.isdigit(),  '²'.isnumeric()
(False, True, True)
@end example

See also @ref{2670,,isdecimal()} and @ref{2673,,isnumeric()}.
@end deffn

@geindex isidentifier() (str method)
@anchor{library/stdtypes str isidentifier}@anchor{1d8a}
@deffn {Method} str.isidentifier ()

Return @code{True} if the string is a valid identifier according to the language
definition, section @ref{22e4,,Names (identifiers and keywords)}.

@ref{2697,,keyword.iskeyword()} can be used to test whether string @code{s} is a reserved
identifier, such as @ref{1666,,def} and @ref{14e3,,class}.

Example:

@example
>>> from keyword import iskeyword

>>> 'hello'.isidentifier(), iskeyword('hello')
(True, False)
>>> 'def'.isidentifier(), iskeyword('def')
(True, True)
@end example
@end deffn

@geindex islower() (str method)
@anchor{library/stdtypes str islower}@anchor{2676}
@deffn {Method} str.islower ()

Return @code{True} if all cased characters @footnote{
Cased characters are those with general category property being one of
“Lu” (Letter, uppercase), “Ll” (Letter, lowercase), or “Lt” (Letter, titlecase).
} in the string are lowercase and
there is at least one cased character, @code{False} otherwise.
@end deffn

@geindex isnumeric() (str method)
@anchor{library/stdtypes str isnumeric}@anchor{2673}
@deffn {Method} str.isnumeric ()

Return @code{True} if all characters in the string are numeric
characters, and there is at least one character, @code{False}
otherwise. Numeric characters include digit characters, and all characters
that have the Unicode numeric value property, e.g. U+2155,
VULGAR FRACTION ONE FIFTH.  Formally, numeric characters are those with the property
value Numeric_Type=Digit, Numeric_Type=Decimal or Numeric_Type=Numeric.
For example:

@example
>>> '0123456789'.isnumeric()
True
>>> '٠١٢٣٤٥٦٧٨٩'.isnumeric()  # Arabic-Indic digits zero to nine
True
>>> '⅕'.isnumeric()  # Vulgar fraction one fifth
True
>>> '²'.isdecimal(), '²'.isdigit(),  '²'.isnumeric()
(False, True, True)
@end example

See also @ref{2670,,isdecimal()} and @ref{2671,,isdigit()}.
@end deffn

@geindex isprintable() (str method)
@anchor{library/stdtypes str isprintable}@anchor{fde}
@deffn {Method} str.isprintable ()

Return @code{True} if all characters in the string are printable, @code{False} if it
contains at least one non-printable character.

Here “printable” means the character is suitable for @ref{1c3,,repr()} to use in
its output; “non-printable” means that @code{repr()} on built-in types will
hex-escape the character.  It has no bearing on the handling of strings
written to @ref{cd3,,sys.stdout} or @ref{b39,,sys.stderr}.

The printable characters are those which in the Unicode character database
(see @ref{10c,,unicodedata}) have a general category in group Letter, Mark,
Number, Punctuation, or Symbol (L, M, N, P, or S); plus the ASCII space 0x20.
Nonprintable characters are those in group Separator or Other (Z or C),
except the ASCII space.

For example:

@example
>>> '@w{'}.isprintable(), ' '.isprintable()
(True, True)
>>> '\t'.isprintable(), '\n'.isprintable()
(False, False)
@end example

See also @ref{267c,,isspace()}.
@end deffn

@geindex isspace() (str method)
@anchor{library/stdtypes str isspace}@anchor{267c}
@deffn {Method} str.isspace ()

Return @code{True} if there are only whitespace characters in the string and there is
at least one character, @code{False} otherwise.

For example:

@example
>>> '@w{'}.isspace()
False
>>> ' '.isspace()
True
>>> '\t\n'.isspace() # TAB and BREAK LINE
True
>>> '\u3000'.isspace() # IDEOGRAPHIC SPACE
True
@end example

A character is `whitespace' if in the Unicode character database
(see @ref{10c,,unicodedata}), either its general category is @code{Zs}
(“Separator, space”), or its bidirectional class is one of @code{WS},
@code{B}, or @code{S}.

See also @ref{fde,,isprintable()}.
@end deffn

@geindex istitle() (str method)
@anchor{library/stdtypes str istitle}@anchor{267a}
@deffn {Method} str.istitle ()

Return @code{True} if the string is a titlecased string and there is at least one
character, for example uppercase characters may only follow uncased characters
and lowercase characters only cased ones.  Return @code{False} otherwise.

For example:

@example
>>> 'Spam, Spam, Spam'.istitle()
True
>>> 'spam, spam, spam'.istitle()
False
>>> 'SPAM, SPAM, SPAM'.istitle()
False
@end example

See also @ref{2683,,title()}.
@end deffn

@geindex isupper() (str method)
@anchor{library/stdtypes str isupper}@anchor{2678}
@deffn {Method} str.isupper ()

Return @code{True} if all cased characters @footnote{
Cased characters are those with general category property being one of
“Lu” (Letter, uppercase), “Ll” (Letter, lowercase), or “Lt” (Letter, titlecase).
} in the string are uppercase and
there is at least one cased character, @code{False} otherwise.

@example
>>> 'BANANA'.isupper()
True
>>> 'banana'.isupper()
False
>>> 'baNana'.isupper()
False
>>> ' '.isupper()
False
@end example
@end deffn

@geindex join() (str method)
@anchor{library/stdtypes meth-str-join}@anchor{2698}@anchor{library/stdtypes str join}@anchor{2651}
@deffn {Method} str.join (iterable, /)

Return a string which is the concatenation of the strings in `iterable'.
A @ref{199,,TypeError} will be raised if there are any non-string values in
`iterable', including @ref{193,,bytes} objects.  The separator between
elements is the string providing this method. For example:

@example
>>> ', '.join(['spam', 'spam', 'spam'])
'spam, spam, spam'
>>> '-'.join('Python')
'P-y-t-h-o-n'
@end example

See also @ref{10b0,,split()}.
@end deffn

@geindex ljust() (str method)
@anchor{library/stdtypes str ljust}@anchor{20a6}
@deffn {Method} str.ljust (width, fillchar=' ', /)

Return the string left justified in a string of length `width'. Padding is
done using the specified `fillchar' (default is an ASCII space). The
original string is returned if `width' is less than or equal to @code{len(s)}.

For example:

@example
>>> 'Python'.ljust(10)
'Python    '
>>> 'Python'.ljust(10, '.')
'Python....'
>>> 'Monty Python'.ljust(10, '.')
'Monty Python'
@end example

See also @ref{20a5,,rjust()}.
@end deffn

@geindex lower() (str method)
@anchor{library/stdtypes str lower}@anchor{1bba}
@deffn {Method} str.lower ()

Return a copy of the string with all the cased characters @footnote{
Cased characters are those with general category property being one of
“Lu” (Letter, uppercase), “Ll” (Letter, lowercase), or “Lt” (Letter, titlecase).
} converted to
lowercase. For example:

@example
>>> 'Lower Method Example'.lower()
'lower method example'
@end example

The lowercasing algorithm used is
described in section 3.13 'Default Case Folding' of the Unicode Standard@footnote{https://www.unicode.org/versions/Unicode16.0.0/core-spec/chapter-3/#G33992}.
@end deffn

@geindex lstrip() (str method)
@anchor{library/stdtypes str lstrip}@anchor{16bc}
@deffn {Method} str.lstrip (chars=None, /)

Return a copy of the string with leading characters removed.  The `chars'
argument is a string specifying the set of characters to be removed.  If omitted
or @code{None}, the `chars' argument defaults to removing whitespace.  The `chars'
argument is not a prefix; rather, all combinations of its values are stripped:

@example
>>> '   spacious   '.lstrip()
'spacious   '
>>> 'www.example.com'.lstrip('cmowz.')
'example.com'
@end example

See @ref{ad2,,str.removeprefix()} for a method that will remove a single prefix
string rather than all of a set of characters.  For example:

@example
>>> 'Arthur: three!'.lstrip('Arthur: ')
'ee!'
>>> 'Arthur: three!'.removeprefix('Arthur: ')
'three!'
@end example
@end deffn

@geindex maketrans() (str static method)
@anchor{library/stdtypes str maketrans}@anchor{fdf}
@deffn {Method} static str.maketrans (dict, /)

@deffnx {Method} static str.maketrans (from, to, remove='@w{'}, /)

This static method returns a translation table usable for @ref{268f,,str.translate()}.

If there is only one argument, it must be a dictionary mapping Unicode
ordinals (integers) or characters (strings of length 1) to Unicode ordinals,
strings (of arbitrary lengths) or @code{None}.  Character keys will then be
converted to ordinals.

If there are two arguments, they must be strings of equal length, and in the
resulting dictionary, each character in `from' will be mapped to the character at
the same position in `to'.  If there is a third argument, it must be a string,
whose characters will be mapped to @code{None} in the result.
@end deffn

@geindex partition() (str method)
@anchor{library/stdtypes str partition}@anchor{10b1}
@deffn {Method} str.partition (sep, /)

Split the string at the first occurrence of `sep', and return a 3-tuple
containing the part before the separator, the separator itself, and the part
after the separator.  If the separator is not found, return a 3-tuple containing
the string itself, followed by two empty strings.

For example:

@example
>>> 'Monty Python'.partition(' ')
('Monty', ' ', 'Python')
>>> "Monty Python's Flying Circus".partition(' ')
('Monty', ' ', "Python's Flying Circus")
>>> 'Monty Python'.partition('-')
('Monty Python', '@w{'}, '@w{'})
@end example

See also @ref{1464,,rpartition()}.
@end deffn

@geindex removeprefix() (str method)
@anchor{library/stdtypes str removeprefix}@anchor{ad2}
@deffn {Method} str.removeprefix (prefix, /)

If the string starts with the `prefix' string, return
@code{string[len(prefix):]}. Otherwise, return a copy of the original
string:

@example
>>> 'TestHook'.removeprefix('Test')
'Hook'
>>> 'BaseTestCase'.removeprefix('Test')
'BaseTestCase'
@end example


Added in version 3.9.


See also @ref{ad3,,removesuffix()} and @ref{10d1,,startswith()}.
@end deffn

@geindex removesuffix() (str method)
@anchor{library/stdtypes str removesuffix}@anchor{ad3}
@deffn {Method} str.removesuffix (suffix, /)

If the string ends with the `suffix' string and that `suffix' is not empty,
return @code{string[:-len(suffix)]}. Otherwise, return a copy of the
original string:

@example
>>> 'MiscTests'.removesuffix('Tests')
'Misc'
>>> 'TmpDirMixin'.removesuffix('Tests')
'TmpDirMixin'
@end example


Added in version 3.9.


See also @ref{ad2,,removeprefix()} and @ref{10d2,,endswith()}.
@end deffn

@geindex replace() (str method)
@anchor{library/stdtypes str replace}@anchor{4b9}
@deffn {Method} str.replace (old, new, /, count=-1)

Return a copy of the string with all occurrences of substring `old' replaced by
`new'.  If `count' is given, only the first `count' occurrences are replaced.
If `count' is not specified or @code{-1}, then all occurrences are replaced.
For example:

@example
>>> 'spam, spam, spam'.replace('spam', 'eggs')
'eggs, eggs, eggs'
>>> 'spam, spam, spam'.replace('spam', 'eggs', 1)
'eggs, spam, spam'
@end example


Changed in version 3.13: `count' is now supported as a keyword argument.

@end deffn

@geindex rfind() (str method)
@anchor{library/stdtypes str rfind}@anchor{10af}
@deffn {Method} str.rfind (sub[, start[, end]])

Return the highest index in the string where substring `sub' is found, such
that `sub' is contained within @code{s[start:end]}.  Optional arguments `start'
and `end' are interpreted as in slice notation.  Return @code{-1} on failure.
For example:

@example
>>> 'spam, spam, spam'.rfind('sp')
12
>>> 'spam, spam, spam'.rfind('sp', 0, 10)
6
@end example

See also @ref{10ae,,find()} and @ref{1463,,rindex()}.
@end deffn

@geindex rindex() (str method)
@anchor{library/stdtypes str rindex}@anchor{1463}
@deffn {Method} str.rindex (sub[, start[, end]])

Like @ref{10af,,rfind()} but raises @ref{2ee,,ValueError} when the substring `sub' is not
found.
For example:

@example
>>> 'spam, spam, spam'.rindex('spam')
12
>>> 'spam, spam, spam'.rindex('eggs')
Traceback (most recent call last):
  File "<stdin-0>", line 1, in <module>
    'spam, spam, spam'.rindex('eggs')
    ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^
ValueError: substring not found
@end example

See also @ref{19fe,,index()} and @ref{10ae,,find()}.
@end deffn

@geindex rjust() (str method)
@anchor{library/stdtypes str rjust}@anchor{20a5}
@deffn {Method} str.rjust (width, fillchar=' ', /)

Return the string right justified in a string of length `width'. Padding is
done using the specified `fillchar' (default is an ASCII space). The
original string is returned if `width' is less than or equal to @code{len(s)}.

For example:

@example
>>> 'Python'.rjust(10)
'    Python'
>>> 'Python'.rjust(10, '.')
'....Python'
>>> 'Monty Python'.rjust(10, '.')
'Monty Python'
@end example

See also @ref{20a6,,ljust()} and @ref{16be,,zfill()}.
@end deffn

@geindex rpartition() (str method)
@anchor{library/stdtypes str rpartition}@anchor{1464}
@deffn {Method} str.rpartition (sep, /)

Split the string at the last occurrence of `sep', and return a 3-tuple
containing the part before the separator, the separator itself, and the part
after the separator.  If the separator is not found, return a 3-tuple containing
two empty strings, followed by the string itself.

For example:

@example
>>> 'Monty Python'.rpartition(' ')
('Monty', ' ', 'Python')
>>> "Monty Python's Flying Circus".rpartition(' ')
("Monty Python's Flying", ' ', 'Circus')
>>> 'Monty Python'.rpartition('-')
('@w{'}, '@w{'}, 'Monty Python')
@end example

See also @ref{10b1,,partition()}.
@end deffn

@geindex rsplit() (str method)
@anchor{library/stdtypes str rsplit}@anchor{1461}
@deffn {Method} str.rsplit (sep=None, maxsplit=-1)

Return a list of the words in the string, using `sep' as the delimiter string.
If `maxsplit' is given, at most `maxsplit' splits are done, the `rightmost'
ones.  If `sep' is not specified or @code{None}, any whitespace string is a
separator.  Except for splitting from the right, @code{rsplit()} behaves like
@ref{10b0,,split()} which is described in detail below.
@end deffn

@geindex rstrip() (str method)
@anchor{library/stdtypes str rstrip}@anchor{16bd}
@deffn {Method} str.rstrip (chars=None, /)

Return a copy of the string with trailing characters removed.  The `chars'
argument is a string specifying the set of characters to be removed.  If omitted
or @code{None}, the `chars' argument defaults to removing whitespace.  The `chars'
argument is not a suffix; rather, all combinations of its values are stripped.
For example:

@example
>>> '   spacious   '.rstrip()
'   spacious'
>>> 'mississippi'.rstrip('ipz')
'mississ'
@end example

See @ref{ad3,,removesuffix()} for a method that will remove a single suffix
string rather than all of a set of characters.  For example:

@example
>>> 'Monty Python'.rstrip(' Python')
'M'
>>> 'Monty Python'.removesuffix(' Python')
'Monty'
@end example

See also @ref{16bb,,strip()}.
@end deffn

@geindex split() (str method)
@anchor{library/stdtypes str split}@anchor{10b0}
@deffn {Method} str.split (sep=None, maxsplit=-1)

Return a list of the words in the string, using `sep' as the delimiter
string.  If `maxsplit' is given, at most `maxsplit' splits are done (thus,
the list will have at most @code{maxsplit+1} elements).  If `maxsplit' is not
specified or @code{-1}, then there is no limit on the number of splits
(all possible splits are made).

If `sep' is given, consecutive delimiters are not grouped together and are
deemed to delimit empty strings (for example, @code{'1,,2'.split(',')} returns
@code{['1', '@w{'}, '2']}).  The `sep' argument may consist of multiple characters
as a single delimiter (to split with multiple delimiters, use
@ref{5a2,,re.split()}). Splitting an empty string with a specified separator
returns @code{['@w{'}]}.

For example:

@example
>>> '1,2,3'.split(',')
['1', '2', '3']
>>> '1,2,3'.split(',', maxsplit=1)
['1', '2,3']
>>> '1,2,,3,'.split(',')
['1', '2', '@w{'}, '3', '@w{'}]
>>> '1<>2<>3<4'.split('<>')
['1', '2', '3<4']
@end example

If `sep' is not specified or is @code{None}, a different splitting algorithm is
applied: runs of consecutive whitespace are regarded as a single separator,
and the result will contain no empty strings at the start or end if the
string has leading or trailing whitespace.  Consequently, splitting an empty
string or a string consisting of just whitespace with a @code{None} separator
returns @code{[]}.

For example:

@example
>>> '1 2 3'.split()
['1', '2', '3']
>>> '1 2 3'.split(maxsplit=1)
['1', '2 3']
>>> '   1   2   3   '.split()
['1', '2', '3']
@end example

If `sep' is not specified or is @code{None} and  `maxsplit' is @code{0}, only
leading runs of consecutive whitespace are considered.

For example:

@example
>>> "".split(None, 0)
[]
>>> "   ".split(None, 0)
[]
>>> "   foo   ".split(maxsplit=0)
['foo   ']
@end example

See also @ref{2651,,join()} and @ref{1461,,rsplit()}.
@end deffn

@geindex universal newlines; str.splitlines method

@geindex splitlines() (str method)
@anchor{library/stdtypes str splitlines}@anchor{1462}
@deffn {Method} str.splitlines (keepends=False)

Return a list of the lines in the string, breaking at line boundaries.  Line
breaks are not included in the resulting list unless `keepends' is given and
true.

This method splits on the following line boundaries.  In particular, the
boundaries are a superset of @ref{f3b,,universal newlines}.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Representation

@tab

Description

@item

@code{\n}

@tab

Line Feed

@item

@code{\r}

@tab

Carriage Return

@item

@code{\r\n}

@tab

Carriage Return + Line Feed

@item

@code{\v} or @code{\x0b}

@tab

Line Tabulation

@item

@code{\f} or @code{\x0c}

@tab

Form Feed

@item

@code{\x1c}

@tab

File Separator

@item

@code{\x1d}

@tab

Group Separator

@item

@code{\x1e}

@tab

Record Separator

@item

@code{\x85}

@tab

Next Line (C1 Control Code)

@item

@code{\u2028}

@tab

Line Separator

@item

@code{\u2029}

@tab

Paragraph Separator

@end multitable



Changed in version 3.2: @code{\v} and @code{\f} added to list of line boundaries.


For example:

@example
>>> 'ab c\n\nde fg\rkl\r\n'.splitlines()
['ab c', '@w{'}, 'de fg', 'kl']
>>> 'ab c\n\nde fg\rkl\r\n'.splitlines(keepends=True)
['ab c\n', '\n', 'de fg\r', 'kl\r\n']
@end example

Unlike @ref{10b0,,split()} when a delimiter string `sep' is given, this
method returns an empty list for the empty string, and a terminal line
break does not result in an extra line:

@example
>>> "".splitlines()
[]
>>> "One line\n".splitlines()
['One line']
@end example

For comparison, @code{split('\n')} gives:

@example
>>> '@w{'}.split('\n')
['@w{'}]
>>> 'Two lines\n'.split('\n')
['Two lines', '@w{'}]
@end example
@end deffn

@geindex startswith() (str method)
@anchor{library/stdtypes str startswith}@anchor{10d1}
@deffn {Method} str.startswith (prefix[, start[, end]])

Return @code{True} if string starts with the `prefix', otherwise return @code{False}.
`prefix' can also be a tuple of prefixes to look for.  With optional `start',
test string beginning at that position.  With optional `end', stop comparing
string at that position.

For example:

@example
>>> 'Python'.startswith('Py')
True
>>> 'a tuple of prefixes'.startswith(('at', 'a'))
True
>>> 'Python is amazing'.startswith('is', 7)
True
@end example

See also @ref{10d2,,endswith()} and @ref{ad2,,removeprefix()}.
@end deffn

@geindex strip() (str method)
@anchor{library/stdtypes str strip}@anchor{16bb}
@deffn {Method} str.strip (chars=None, /)

Return a copy of the string with the leading and trailing characters removed.
The `chars' argument is a string specifying the set of characters to be removed.
If omitted or @code{None}, the `chars' argument defaults to removing whitespace.
The `chars' argument is not a prefix or suffix; rather, all combinations of its
values are stripped.

Whitespace characters are defined by @ref{267c,,str.isspace()}.

For example:

@example
>>> '   spacious   '.strip()
'spacious'
>>> 'www.example.com'.strip('cmowz.')
'example'
@end example

The outermost leading and trailing `chars' argument values are stripped
from the string. Characters are removed from the leading end until
reaching a string character that is not contained in the set of
characters in `chars'. A similar action takes place on the trailing end.

For example:

@example
>>> comment_string = '#....... Section 3.2.1 Issue #32 .......'
>>> comment_string.strip('.#! ')
'Section 3.2.1 Issue #32'
@end example

See also @ref{16bd,,rstrip()}.
@end deffn

@geindex swapcase() (str method)
@anchor{library/stdtypes str swapcase}@anchor{2685}
@deffn {Method} str.swapcase ()

Return a copy of the string with uppercase characters converted to lowercase and
vice versa. For example:

@example
>>> 'Hello World'.swapcase()
'hELLO wORLD'
@end example

Note that it is not necessarily true that @code{s.swapcase().swapcase() == s}.
For example:

@example
>>> 'straße'.swapcase().swapcase()
'strasse'
@end example

See also @ref{1bba,,str.lower()} and @ref{267f,,str.upper()}.
@end deffn

@geindex title() (str method)
@anchor{library/stdtypes str title}@anchor{2683}
@deffn {Method} str.title ()

Return a titlecased version of the string where words start with an uppercase
character and the remaining characters are lowercase.

For example:

@example
>>> 'Hello world'.title()
'Hello World'
@end example

The algorithm uses a simple language-independent definition of a word as
groups of consecutive letters.  The definition works in many contexts but
it means that apostrophes in contractions and possessives form word
boundaries, which may not be the desired result:

@example
>>> "they're bill's friends from the UK".title()
"They'Re Bill'S Friends From The Uk"
@end example

The @ref{2699,,string.capwords()} function does not have this problem, as it
splits words on spaces only.

Alternatively, a workaround for apostrophes can be constructed using regular
expressions:

@example
>>> import re
>>> def titlecase(s):
...     return re.sub(r"[A-Za-z]+('[A-Za-z]+)?",
...                   lambda mo: mo.group(0).capitalize(),
...                   s)
...
>>> titlecase("they're bill's friends.")
"They're Bill's Friends."
@end example

See also @ref{267a,,istitle()}.
@end deffn

@geindex translate() (str method)
@anchor{library/stdtypes str translate}@anchor{268f}
@deffn {Method} str.translate (table, /)

Return a copy of the string in which each character has been mapped through
the given translation table.  The table must be an object that implements
indexing via @ref{588,,__getitem__()}, typically a @ref{13c7,,mapping} or
@ref{717,,sequence}.  When indexed by a Unicode ordinal (an integer), the
table object can do any of the following: return a Unicode ordinal or a
string, to map the character to one or more other characters; return
@code{None}, to delete the character from the return string; or raise a
@ref{242c,,LookupError} exception, to map the character to itself.

You can use @ref{fdf,,str.maketrans()} to create a translation map from
character-to-character mappings in different formats.

See also the @ref{1c,,codecs} module for a more flexible approach to custom
character mappings.
@end deffn

@geindex upper() (str method)
@anchor{library/stdtypes str upper}@anchor{267f}
@deffn {Method} str.upper ()

Return a copy of the string with all the cased characters @footnote{
Cased characters are those with general category property being one of
“Lu” (Letter, uppercase), “Ll” (Letter, lowercase), or “Lt” (Letter, titlecase).
} converted to
uppercase.  Note that @code{s.upper().isupper()} might be @code{False} if @code{s}
contains uncased characters or if the Unicode category of the resulting
character(s) is not “Lu” (Letter, uppercase), but e.g. “Lt” (Letter,
titlecase).

The uppercasing algorithm used is
described in section 3.13 'Default Case Folding' of the Unicode Standard@footnote{https://www.unicode.org/versions/Unicode16.0.0/core-spec/chapter-3/#G33992}.
@end deffn

@geindex zfill() (str method)
@anchor{library/stdtypes str zfill}@anchor{16be}
@deffn {Method} str.zfill (width, /)

Return a copy of the string left filled with ASCII @code{'0'} digits to
make a string of length `width'. A leading sign prefix (@code{'+'}/@code{'-'})
is handled by inserting the padding `after' the sign character rather
than before. The original string is returned if `width' is less than
or equal to @code{len(s)}.

For example:

@example
>>> "42".zfill(5)
'00042'
>>> "-42".zfill(5)
'-0042'
@end example

See also @ref{20a5,,rjust()}.
@end deffn

@geindex ! formatted string literal
@geindex formatted string literals
@geindex ! f-string
@geindex f-strings
@geindex fstring
@geindex interpolated string literal
@geindex string; formatted literal
@geindex string; interpolated literal
@geindex @{@} (curly brackets); in formatted string literal
@geindex ! (exclamation mark); in formatted string literal
@geindex ; (colon); in formatted string literal
@geindex = (equals); for help in debugging using string literals

@node Formatted String Literals f-strings,Template String Literals t-strings,String Methods<2>,Text Sequence Type — str
@anchor{library/stdtypes formatted-string-literals-f-strings}@anchor{269a}@anchor{library/stdtypes stdtypes-fstrings}@anchor{232f}
@subsubsection Formatted String Literals (f-strings)



Added in version 3.6.



Changed in version 3.7: The @ref{18e,,await} and @ref{ca7,,async for} can be used in expressions
within f-strings.



Changed in version 3.8: Added the debug specifier (@code{=})



Changed in version 3.12: Many restrictions on expressions within f-strings have been removed.
Notably, nested strings, comments, and backslashes are now permitted.


An `f-string' (formally a `formatted string literal') is
a string literal that is prefixed with @code{f} or @code{F}.
This type of string literal allows embedding the results of arbitrary Python
expressions within `replacement fields', which are delimited by curly
brackets (@code{@{@}}).
Each replacement field must contain an expression, optionally followed by:


@itemize *

@item 
a `debug specifier' – an equal sign (@code{=});

@item 
a `conversion specifier' – @code{!s}, @code{!r} or @code{!a}; and/or

@item 
a `format specifier' prefixed with a colon (@code{:}).
@end itemize

See the @ref{19b,,Lexical Analysis section on f-strings} for details
on the syntax of these fields.

@menu
* Debug specifier:: 
* Conversion specifier:: 
* Format specifier:: 

@end menu

@node Debug specifier,Conversion specifier,,Formatted String Literals f-strings
@anchor{library/stdtypes debug-specifier}@anchor{269b}
@subsubsection Debug specifier



Added in version 3.8.


If a debug specifier – an equal sign (@code{=}) – appears after the replacement
field expression, the resulting f-string will contain the expression’s source,
the equal sign, and the value of the expression.
This is often useful for debugging:

@example
>>> number = 14.3
>>> f'@{number=@}'
'number=14.3'
@end example

Whitespace before, inside and after the expression, as well as whitespace
after the equal sign, is significant — it is retained in the result:

@example
>>> f'@{ number  -  4  = @}'
' number  -  4  = 10.3'
@end example

@node Conversion specifier,Format specifier,Debug specifier,Formatted String Literals f-strings
@anchor{library/stdtypes conversion-specifier}@anchor{269c}
@subsubsection Conversion specifier


By default, the value of a replacement field expression is converted to
a string using @ref{16a,,str()}:

@example
>>> from fractions import Fraction
>>> one_third = Fraction(1, 3)
>>> f'@{one_third@}'
'1/3'
@end example

When a debug specifier but no format specifier is used, the default conversion
instead uses @ref{1c3,,repr()}:

@example
>>> f'@{one_third = @}'
'one_third = Fraction(1, 3)'
@end example

The conversion can be specified explicitly using one of these specifiers:


@itemize *

@item 
@code{!s} for @ref{16a,,str()}

@item 
@code{!r} for @ref{1c3,,repr()}

@item 
@code{!a} for @ref{15f2,,ascii()}
@end itemize

For example:

@example
>>> str(one_third)
'1/3'
>>> repr(one_third)
'Fraction(1, 3)'

>>> f'@{one_third!s@} is @{one_third!r@}'
'1/3 is Fraction(1, 3)'

>>> string = "¡kočka 😸!"
>>> ascii(string)
"'\\xa1ko\\u010dka \\U0001f638!'"

>>> f'@{string = !a@}'
"string = '\\xa1ko\\u010dka \\U0001f638!'"
@end example

@node Format specifier,,Conversion specifier,Formatted String Literals f-strings
@anchor{library/stdtypes format-specifier}@anchor{269d}
@subsubsection Format specifier


After the expression has been evaluated, and possibly converted using an
explicit conversion specifier, it is formatted using the @ref{19a,,format()} function.
If the replacement field includes a `format specifier' introduced by a colon
(@code{:}), the specifier is passed to @code{format()} as the second argument.
The result of @code{format()} is then used as the final value for the
replacement field. For example:

@example
>>> from fractions import Fraction
>>> one_third = Fraction(1, 3)
>>> f'@{one_third:.6f@}'
'0.333333'
>>> f'@{one_third:_^+10@}'
'___+1/3___'
>>> >>> f'@{one_third!r:_^20@}'
'___Fraction(1, 3)___'
>>> f'@{one_third = :~>10@}~'
'one_third = ~~~~~~~1/3~'
@end example

@node Template String Literals t-strings,printf-style String Formatting,Formatted String Literals f-strings,Text Sequence Type — str
@anchor{library/stdtypes stdtypes-tstrings}@anchor{2333}@anchor{library/stdtypes template-string-literals-t-strings}@anchor{269e}
@subsubsection Template String Literals (t-strings)


An `t-string' (formally a `template string literal') is
a string literal that is prefixed with @code{t} or @code{T}.

These strings follow the same syntax and evaluation rules as
@ref{232f,,formatted string literals},
with for the following differences:


@itemize *

@item 
Rather than evaluating to a @code{str} object, template string literals evaluate
to a @ref{16b,,string.templatelib.Template} object.

@item 
The @ref{19a,,format()} protocol is not used.
Instead, the format specifier and conversions (if any) are passed to
a new @ref{16c,,Interpolation} object that is created
for each evaluated expression.
It is up to code that processes the resulting @ref{16b,,Template}
object to decide how to handle format specifiers and conversions.

@item 
Format specifiers containing nested replacement fields are evaluated eagerly,
prior to being passed to the @ref{16c,,Interpolation} object.
For instance, an interpolation of the form @code{@{amount:.@{precision@}f@}} will
evaluate the inner expression @code{@{precision@}} to determine the value of the
@code{format_spec} attribute.
If @code{precision} were to be @code{2}, the resulting format specifier
would be @code{'.2f'}.

@item 
When the equals sign @code{'='} is provided in an interpolation expression,
the text of the expression is appended to the literal string that precedes
the relevant interpolation.
This includes the equals sign and any surrounding whitespace.
The @code{Interpolation} instance for the expression will be created as
normal, except that @ref{269f,,conversion} will
be set to ‘@code{r}’ (@ref{1c3,,repr()}) by default.
If an explicit conversion or format specifier are provided,
this will override the default behaviour.
@end itemize

@node printf-style String Formatting,,Template String Literals t-strings,Text Sequence Type — str
@anchor{library/stdtypes old-string-formatting}@anchor{8dd}@anchor{library/stdtypes printf-style-string-formatting}@anchor{26a0}
@subsubsection @code{printf}-style String Formatting


@geindex formatting@comma{} string (%)
@geindex interpolation@comma{} string (%)
@geindex string; formatting@comma{} printf
@geindex string; interpolation@comma{} printf
@geindex printf-style formatting
@geindex sprintf-style formatting
@geindex % (percent); printf-style formatting

@cartouche
@quotation Note 
The formatting operations described here exhibit a variety of quirks that
lead to a number of common errors (such as failing to display tuples and
dictionaries correctly).

Using @ref{19b,,formatted string literals}, the @ref{834,,str.format()}
interface, or @ref{899,,string.Template} may help avoid these errors.
Each of these alternatives provides their own trade-offs and benefits of
simplicity, flexibility, and/or extensibility.
@end quotation
@end cartouche

String objects have one unique built-in operation: the @code{%} operator (modulo).
This is also known as the string `formatting' or `interpolation' operator.
Given @code{format % values} (where `format' is a string), @code{%} conversion
specifications in `format' are replaced with zero or more elements of `values'.
The effect is similar to using the @code{sprintf()} function in the C language.
For example:

@example
>>> print('%s has %d quote types.' % ('Python', 2))
Python has 2 quote types.
@end example

If `format' requires a single argument, `values' may be a single non-tuple
object. @footnote{
To format only a tuple you should therefore provide a singleton tuple whose only
element is the tuple to be formatted.
}  Otherwise, `values' must be a tuple with exactly the number of
items specified by the format string, or a single mapping object (for example, a
dictionary).

@geindex () (parentheses); in printf-style formatting
@geindex * (asterisk); in printf-style formatting
@geindex . (dot); in printf-style formatting

A conversion specifier contains two or more characters and has the following
components, which must occur in this order:


@enumerate 

@item 
The @code{'%'} character, which marks the start of the specifier.

@item 
Mapping key (optional), consisting of a parenthesised sequence of characters
(for example, @code{(somename)}).

@item 
Conversion flags (optional), which affect the result of some conversion
types.

@item 
Minimum field width (optional).  If specified as an @code{'*'} (asterisk), the
actual width is read from the next element of the tuple in `values', and the
object to convert comes after the minimum field width and optional precision.

@item 
Precision (optional), given as a @code{'.'} (dot) followed by the precision.  If
specified as @code{'*'} (an asterisk), the actual precision is read from the next
element of the tuple in `values', and the value to convert comes after the
precision.

@item 
Length modifier (optional).

@item 
Conversion type.
@end enumerate

When the right argument is a dictionary (or other mapping type), then the
formats in the string `must' include a parenthesised mapping key into that
dictionary inserted immediately after the @code{'%'} character. The mapping key
selects the value to be formatted from the mapping.  For example:

@example
>>> print('%(language)s has %(number)03d quote types.' %
...       @{'language': "Python", "number": 2@})
Python has 002 quote types.
@end example

In this case no @code{*} specifiers may occur in a format (since they require a
sequential parameter list).

The conversion flag characters are:

@geindex # (hash); in printf-style formatting
@geindex - (minus); in printf-style formatting
@geindex + (plus); in printf-style formatting
@geindex space; in printf-style formatting


@multitable {xxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Flag

@tab

Meaning

@item

@code{'#'}

@tab

The value conversion will use the “alternate form” (where defined
below).

@item

@code{'0'}

@tab

The conversion will be zero padded for numeric values.

@item

@code{'-'}

@tab

The converted value is left adjusted (overrides the @code{'0'}
conversion if both are given).

@item

@code{' '}

@tab

(a space) A blank should be left before a positive number (or empty
string) produced by a signed conversion.

@item

@code{'+'}

@tab

A sign character (@code{'+'} or @code{'-'}) will precede the conversion
(overrides a “space” flag).

@end multitable


A length modifier (@code{h}, @code{l}, or @code{L}) may be present, but is ignored as it
is not necessary for Python – so e.g. @code{%ld} is identical to @code{%d}.

The conversion types are:


@multitable {xxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxx} 
@headitem

Conversion

@tab

Meaning

@tab

Notes

@item

@code{'d'}

@tab

Signed integer decimal.

@tab

@item

@code{'i'}

@tab

Signed integer decimal.

@tab

@item

@code{'o'}

@tab

Signed octal value.

@tab

(1)

@item

@code{'u'}

@tab

Obsolete type – it is identical to @code{'d'}.

@tab

(6)

@item

@code{'x'}

@tab

Signed hexadecimal (lowercase).

@tab

(2)

@item

@code{'X'}

@tab

Signed hexadecimal (uppercase).

@tab

(2)

@item

@code{'e'}

@tab

Floating-point exponential format (lowercase).

@tab

(3)

@item

@code{'E'}

@tab

Floating-point exponential format (uppercase).

@tab

(3)

@item

@code{'f'}

@tab

Floating-point decimal format.

@tab

(3)

@item

@code{'F'}

@tab

Floating-point decimal format.

@tab

(3)

@item

@code{'g'}

@tab

Floating-point format. Uses lowercase exponential
format if exponent is less than -4 or not less than
precision, decimal format otherwise.

@tab

(4)

@item

@code{'G'}

@tab

Floating-point format. Uses uppercase exponential
format if exponent is less than -4 or not less than
precision, decimal format otherwise.

@tab

(4)

@item

@code{'c'}

@tab

Single character (accepts integer or single
character string).

@tab

@item

@code{'r'}

@tab

String (converts any Python object using
@ref{1c3,,repr()}).

@tab

(5)

@item

@code{'s'}

@tab

String (converts any Python object using
@ref{16a,,str()}).

@tab

(5)

@item

@code{'a'}

@tab

String (converts any Python object using
@ref{15f2,,ascii()}).

@tab

(5)

@item

@code{'%'}

@tab

No argument is converted, results in a @code{'%'}
character in the result.

@tab

@end multitable


For floating-point formats, the result should be correctly rounded to a given
precision @code{p} of digits after the decimal point.  The rounding mode matches
that of the @ref{14e6,,round()} builtin.

Notes:


@enumerate 

@item 
The alternate form causes a leading octal specifier (@code{'0o'}) to be
inserted before the first digit.

@item 
The alternate form causes a leading @code{'0x'} or @code{'0X'} (depending on whether
the @code{'x'} or @code{'X'} format was used) to be inserted before the first digit.

@item 
The alternate form causes the result to always contain a decimal point, even if
no digits follow it.

The precision determines the number of digits after the decimal point and
defaults to 6.

@item 
The alternate form causes the result to always contain a decimal point, and
trailing zeroes are not removed as they would otherwise be.

The precision determines the number of significant digits before and after the
decimal point and defaults to 6.

@item 
If precision is @code{N}, the output is truncated to @code{N} characters.

@item 
See 
@geindex Python Enhancement Proposals; PEP 237
PEP 237@footnote{https://peps.python.org/pep-0237/}.
@end enumerate

Since Python strings have an explicit length, @code{%s} conversions do not assume
that @code{'\0'} is the end of the string.

@c XXX Examples?


Changed in version 3.1: @code{%f} conversions for numbers whose absolute value is over 1e50 are no
longer replaced by @code{%g} conversions.


@geindex buffer protocol; binary sequence types

@node Binary Sequence Types — bytes bytearray memoryview,Set Types — set frozenset,Text Sequence Type — str,Built-in Types
@anchor{library/stdtypes binary-sequence-types-bytes-bytearray-memoryview}@anchor{26a1}@anchor{library/stdtypes binaryseq}@anchor{260b}
@subsection Binary Sequence Types — @code{bytes}, @code{bytearray}, @code{memoryview}


@geindex object; bytes
@geindex object; bytearray
@geindex object; memoryview
@geindex module; array

The core built-in types for manipulating binary data are @ref{193,,bytes} and
@ref{342,,bytearray}. They are supported by @ref{166,,memoryview} which uses
the @ref{262,,buffer protocol} to access the memory of other
binary objects without needing to make a copy.

The @ref{8,,array} module supports efficient storage of basic data types like
32-bit integers and IEEE754 double-precision floating values.

@menu
* Bytes Objects:: 
* Bytearray Objects:: 
* Bytes and Bytearray Operations:: 
* printf-style Bytes Formatting:: 
* Memory Views:: 

@end menu

@node Bytes Objects,Bytearray Objects,,Binary Sequence Types — bytes bytearray memoryview
@anchor{library/stdtypes bytes-objects}@anchor{26a2}@anchor{library/stdtypes typebytes}@anchor{260d}
@subsubsection Bytes Objects


@geindex object; bytes

Bytes objects are immutable sequences of single bytes. Since many major
binary protocols are based on the ASCII text encoding, bytes objects offer
several methods that are only valid when working with ASCII compatible
data and are closely related to string objects in a variety of other ways.

@geindex bytes (built-in class)
@anchor{library/stdtypes bytes}@anchor{193}
@deffn {Class} bytes (source=b'@w{'})

@deffnx {Class} bytes (source, encoding, errors='strict')

Firstly, the syntax for bytes literals is largely the same as that for string
literals, except that a @code{b} prefix is added:


@itemize *

@item 
Single quotes: @code{b'still allows embedded "double" quotes'}

@item 
Double quotes: @code{b"still allows embedded 'single' quotes"}

@item 
Triple quoted: @code{b'@w{'}'3 single quotes'@w{'}'}, @code{b"""3 double quotes"""}
@end itemize

Only ASCII characters are permitted in bytes literals (regardless of the
declared source code encoding). Any binary values over 127 must be entered
into bytes literals using the appropriate escape sequence.

As with string literals, bytes literals may also use a @code{r} prefix to disable
processing of escape sequences. See @ref{22e3,,String and Bytes literals} for more about the various
forms of bytes literal, including supported escape sequences.

While bytes literals and representations are based on ASCII text, bytes
objects actually behave like immutable sequences of integers, with each
value in the sequence restricted such that @code{0 <= x < 256} (attempts to
violate this restriction will trigger @ref{2ee,,ValueError}). This is done
deliberately to emphasise that while many binary formats include ASCII based
elements and can be usefully manipulated with some text-oriented algorithms,
this is not generally the case for arbitrary binary data (blindly applying
text processing algorithms to binary data formats that are not ASCII
compatible will usually lead to data corruption).

In addition to the literal forms, bytes objects can be created in a number of
other ways:


@itemize *

@item 
A zero-filled bytes object of a specified length: @code{bytes(10)}

@item 
From an iterable of integers: @code{bytes(range(20))}

@item 
Copying existing binary data via the buffer protocol:  @code{bytes(obj)}
@end itemize

Also see the @ref{1edc,,bytes} built-in.

Since 2 hexadecimal digits correspond precisely to a single byte, hexadecimal
numbers are a commonly used format for describing binary data. Accordingly,
the bytes type has an additional class method to read data in that format:

@geindex fromhex() (bytes class method)
@anchor{library/stdtypes bytes fromhex}@anchor{191}
@deffn {Method} classmethod fromhex (string, /)

This @code{bytes} class method returns a bytes object, decoding the
given string object.  The string must contain two hexadecimal digits per
byte, with ASCII whitespace being ignored.

@example
>>> bytes.fromhex('2Ef0 F1f2  ')
b'.\xf0\xf1\xf2'
@end example


Changed in version 3.7: @code{bytes.fromhex()} now skips all ASCII whitespace in the string,
not just spaces.



Changed in version 3.14: @code{bytes.fromhex()} now accepts ASCII @code{bytes} and
@ref{194,,bytes-like objects} as input.

@end deffn

A reverse conversion function exists to transform a bytes object into its
hexadecimal representation.

@geindex hex() (bytes method)
@anchor{library/stdtypes bytes hex}@anchor{f6b}
@deffn {Method} hex (*, bytes_per_sep=1)

@deffnx {Method} hex (sep, bytes_per_sep=1)

Return a string object containing two hexadecimal digits for each
byte in the instance.

@example
>>> b'\xf0\xf1\xf2'.hex()
'f0f1f2'
@end example

If you want to make the hex string easier to read, you can specify a
single character separator `sep' parameter to include in the output.
By default, this separator will be included between each byte.
A second optional `bytes_per_sep' parameter controls the spacing.
Positive values calculate the separator position from the right,
negative values from the left.

@example
>>> value = b'\xf0\xf1\xf2'
>>> value.hex('-')
'f0-f1-f2'
>>> value.hex('_', 2)
'f0_f1f2'
>>> b'UUDDLRLRAB'.hex(' ', -4)
'55554444 4c524c52 4142'
@end example


Added in version 3.5.



Changed in version 3.8: @code{bytes.hex()} now supports optional `sep' and `bytes_per_sep'
parameters to insert separators between bytes in the hex output.

@end deffn
@end deffn

Since bytes objects are sequences of integers (akin to a tuple), for a bytes
object `b', @code{b[0]} will be an integer, while @code{b[0:1]} will be a bytes
object of length 1.  (This contrasts with text strings, where both indexing
and slicing will produce a string of length 1)

The representation of bytes objects uses the literal format (@code{b'...'})
since it is often more useful than e.g. @code{bytes([46, 46, 46])}.  You can
always convert a bytes object into a list of integers using @code{list(b)}.

@node Bytearray Objects,Bytes and Bytearray Operations,Bytes Objects,Binary Sequence Types — bytes bytearray memoryview
@anchor{library/stdtypes bytearray-objects}@anchor{26a3}@anchor{library/stdtypes typebytearray}@anchor{260c}
@subsubsection Bytearray Objects


@geindex object; bytearray

@ref{342,,bytearray} objects are a mutable counterpart to @ref{193,,bytes}
objects.

@geindex bytearray (built-in class)
@anchor{library/stdtypes bytearray}@anchor{342}
@deffn {Class} bytearray (source=b'@w{'})

@deffnx {Class} bytearray (source, encoding, errors='strict')

There is no dedicated literal syntax for bytearray objects, instead
they are always created by calling the constructor:


@itemize *

@item 
Creating an empty instance: @code{bytearray()}

@item 
Creating a zero-filled instance with a given length: @code{bytearray(10)}

@item 
From an iterable of integers: @code{bytearray(range(20))}

@item 
Copying existing binary data via the buffer protocol:  @code{bytearray(b'Hi!')}
@end itemize

As bytearray objects are mutable, they support the
@ref{2609,,mutable} sequence operations in addition to the
common bytes and bytearray operations described in @ref{260a,,Bytes and Bytearray Operations}.

Also see the @ref{1edd,,bytearray} built-in.

Since 2 hexadecimal digits correspond precisely to a single byte, hexadecimal
numbers are a commonly used format for describing binary data. Accordingly,
the bytearray type has an additional class method to read data in that format:

@geindex fromhex() (bytearray class method)
@anchor{library/stdtypes bytearray fromhex}@anchor{192}
@deffn {Method} classmethod fromhex (string, /)

This @code{bytearray} class method returns bytearray object, decoding
the given string object.  The string must contain two hexadecimal digits
per byte, with ASCII whitespace being ignored.

@example
>>> bytearray.fromhex('2Ef0 F1f2  ')
bytearray(b'.\xf0\xf1\xf2')
@end example


Changed in version 3.7: @code{bytearray.fromhex()} now skips all ASCII whitespace in the string,
not just spaces.



Changed in version 3.14: @code{bytearray.fromhex()} now accepts ASCII @ref{193,,bytes} and
@ref{194,,bytes-like objects} as input.

@end deffn

A reverse conversion function exists to transform a bytearray object into its
hexadecimal representation.

@geindex hex() (bytearray method)
@anchor{library/stdtypes bytearray hex}@anchor{f6c}
@deffn {Method} hex (*, bytes_per_sep=1)

@deffnx {Method} hex (sep, bytes_per_sep=1)

Return a string object containing two hexadecimal digits for each
byte in the instance.

@example
>>> bytearray(b'\xf0\xf1\xf2').hex()
'f0f1f2'
@end example


Added in version 3.5.



Changed in version 3.8: Similar to @ref{f6b,,bytes.hex()}, @code{bytearray.hex()} now supports
optional `sep' and `bytes_per_sep' parameters to insert separators
between bytes in the hex output.

@end deffn

@geindex resize() (bytearray method)
@anchor{library/stdtypes bytearray resize}@anchor{17aa}
@deffn {Method} resize (size, /)

Resize the @code{bytearray} to contain `size' bytes. `size' must be
greater than or equal to 0.

If the @code{bytearray} needs to shrink, bytes beyond `size' are truncated.

If the @code{bytearray} needs to grow, all new bytes, those beyond `size',
will be set to null bytes.

This is equivalent to:

@example
>>> def resize(ba, size):
...     if len(ba) > size:
...         del ba[size:]
...     else:
...         ba += b'\0' * (size - len(ba))
@end example

Examples:

@example
>>> shrink = bytearray(b'abc')
>>> shrink.resize(1)
>>> (shrink, len(shrink))
(bytearray(b'a'), 1)
>>> grow = bytearray(b'abc')
>>> grow.resize(5)
>>> (grow, len(grow))
(bytearray(b'abc\x00\x00'), 5)
@end example


Added in version 3.14.

@end deffn
@end deffn

Since bytearray objects are sequences of integers (akin to a list), for a
bytearray object `b', @code{b[0]} will be an integer, while @code{b[0:1]} will be
a bytearray object of length 1.  (This contrasts with text strings, where
both indexing and slicing will produce a string of length 1)

The representation of bytearray objects uses the bytes literal format
(@code{bytearray(b'...')}) since it is often more useful than e.g.
@code{bytearray([46, 46, 46])}.  You can always convert a bytearray object into
a list of integers using @code{list(b)}.


@subsubheading See also


For detailed information on thread-safety guarantees for @ref{342,,bytearray}
objects, see @ref{26a4,,Thread safety for bytearray objects}.


@node Bytes and Bytearray Operations,printf-style Bytes Formatting,Bytearray Objects,Binary Sequence Types — bytes bytearray memoryview
@anchor{library/stdtypes bytes-and-bytearray-operations}@anchor{26a5}@anchor{library/stdtypes bytes-methods}@anchor{260a}
@subsubsection Bytes and Bytearray Operations


@geindex bytes; methods
@geindex bytearray; methods

Both bytes and bytearray objects support the @ref{264f,,common}
sequence operations. They interoperate not just with operands of the same
type, but with any @ref{194,,bytes-like object}. Due to this flexibility, they can be
freely mixed in operations without causing errors. However, the return type
of the result may depend on the order of operands.

@cartouche
@quotation Note 
The methods on bytes and bytearray objects don’t accept strings as their
arguments, just as the methods on strings don’t accept bytes as their
arguments.  For example, you have to write:

@example
a = "abc"
b = a.replace("a", "f")
@end example

and:

@example
a = b"abc"
b = a.replace(b"a", b"f")
@end example
@end quotation
@end cartouche

Some bytes and bytearray operations assume the use of ASCII compatible
binary formats, and hence should be avoided when working with arbitrary
binary data. These restrictions are covered below.

@cartouche
@quotation Note 
Using these ASCII based operations to manipulate binary data that is not
stored in an ASCII based format may lead to data corruption.
@end quotation
@end cartouche

The following methods on bytes and bytearray objects can be used with
arbitrary binary data.

@geindex count() (bytes method)
@geindex count() (bytearray method)
@anchor{library/stdtypes bytes count}@anchor{19c6}
@deffn {Method} bytes.count (sub[, start[, end]])
@anchor{library/stdtypes bytearray count}@anchor{17e6}
@deffnx {Method} bytearray.count (sub[, start[, end]])

Return the number of non-overlapping occurrences of subsequence `sub' in
the range [`start', `end'].  Optional arguments `start' and `end' are
interpreted as in slice notation.

The subsequence to search for may be any @ref{194,,bytes-like object} or an
integer in the range 0 to 255.

If `sub' is empty, returns the number of empty slices between characters
which is the length of the bytes object plus one.


Changed in version 3.3: Also accept an integer in the range 0 to 255 as the subsequence.

@end deffn

@geindex removeprefix() (bytes method)
@geindex removeprefix() (bytearray method)
@anchor{library/stdtypes bytes removeprefix}@anchor{26a6}
@deffn {Method} bytes.removeprefix (prefix, /)
@anchor{library/stdtypes bytearray removeprefix}@anchor{26a7}
@deffnx {Method} bytearray.removeprefix (prefix, /)

If the binary data starts with the `prefix' string, return
@code{bytes[len(prefix):]}. Otherwise, return a copy of the original
binary data:

@example
>>> b'TestHook'.removeprefix(b'Test')
b'Hook'
>>> b'BaseTestCase'.removeprefix(b'Test')
b'BaseTestCase'
@end example

The `prefix' may be any @ref{194,,bytes-like object}.

@cartouche
@quotation Note 
The bytearray version of this method does `not' operate in place -
it always produces a new object, even if no changes were made.
@end quotation
@end cartouche


Added in version 3.9.

@end deffn

@geindex removesuffix() (bytes method)
@geindex removesuffix() (bytearray method)
@anchor{library/stdtypes bytes removesuffix}@anchor{26a8}
@deffn {Method} bytes.removesuffix (suffix, /)
@anchor{library/stdtypes bytearray removesuffix}@anchor{26a9}
@deffnx {Method} bytearray.removesuffix (suffix, /)

If the binary data ends with the `suffix' string and that `suffix' is
not empty, return @code{bytes[:-len(suffix)]}.  Otherwise, return a copy of
the original binary data:

@example
>>> b'MiscTests'.removesuffix(b'Tests')
b'Misc'
>>> b'TmpDirMixin'.removesuffix(b'Tests')
b'TmpDirMixin'
@end example

The `suffix' may be any @ref{194,,bytes-like object}.

@cartouche
@quotation Note 
The bytearray version of this method does `not' operate in place -
it always produces a new object, even if no changes were made.
@end quotation
@end cartouche


Added in version 3.9.

@end deffn

@geindex decode() (bytes method)
@geindex decode() (bytearray method)
@anchor{library/stdtypes bytes decode}@anchor{ad9}
@deffn {Method} bytes.decode (encoding='utf-8', errors='strict')
@anchor{library/stdtypes bytearray decode}@anchor{26aa}
@deffnx {Method} bytearray.decode (encoding='utf-8', errors='strict')

Return the bytes decoded to a @ref{16a,,str}.

`encoding' defaults to @code{'utf-8'};
see @ref{fbe,,Standard Encodings} for possible values.

`errors' controls how decoding errors are handled.
If @code{'strict'} (the default), a @ref{460,,UnicodeError} exception is raised.
Other possible values are @code{'ignore'}, @code{'replace'},
and any other name registered via @ref{16a7,,codecs.register_error()}.
See @ref{1bb3,,Error Handlers} for details.

For performance reasons, the value of `errors' is not checked for validity
unless a decoding error actually occurs,
@ref{509,,Python Development Mode} is enabled or a @ref{50a,,debug build} is used.

@cartouche
@quotation Note 
Passing the `encoding' argument to @ref{16a,,str} allows decoding any
@ref{194,,bytes-like object} directly, without needing to make a temporary
@code{bytes} or @code{bytearray} object.
@end quotation
@end cartouche


Changed in version 3.1: Added support for keyword arguments.



Changed in version 3.9: The value of the `errors' argument is now checked in @ref{509,,Python Development Mode} and
in @ref{50a,,debug mode}.

@end deffn

@geindex endswith() (bytes method)
@geindex endswith() (bytearray method)
@anchor{library/stdtypes bytes endswith}@anchor{2667}
@deffn {Method} bytes.endswith (suffix[, start[, end]])
@anchor{library/stdtypes bytearray endswith}@anchor{15ae}
@deffnx {Method} bytearray.endswith (suffix[, start[, end]])

Return @code{True} if the binary data ends with the specified `suffix',
otherwise return @code{False}.  `suffix' can also be a tuple of suffixes to
look for.  With optional `start', test beginning at that position.  With
optional `end', stop comparing at that position.

The suffix(es) to search for may be any @ref{194,,bytes-like object}.
@end deffn

@geindex find() (bytes method)
@geindex find() (bytearray method)
@anchor{library/stdtypes bytes find}@anchor{1c17}
@deffn {Method} bytes.find (sub[, start[, end]])
@anchor{library/stdtypes bytearray find}@anchor{15af}
@deffnx {Method} bytearray.find (sub[, start[, end]])

Return the lowest index in the data where the subsequence `sub' is found,
such that `sub' is contained in the slice @code{s[start:end]}.  Optional
arguments `start' and `end' are interpreted as in slice notation.  Return
@code{-1} if `sub' is not found.

The subsequence to search for may be any @ref{194,,bytes-like object} or an
integer in the range 0 to 255.

@cartouche
@quotation Note 
The @code{find()} method should be used only if you need to know the
position of `sub'.  To check if `sub' is a substring or not, use the
@ref{349,,in} operator:

@example
>>> b'Py' in b'Python'
True
@end example
@end quotation
@end cartouche


Changed in version 3.3: Also accept an integer in the range 0 to 255 as the subsequence.

@end deffn

@geindex index() (bytes method)
@geindex index() (bytearray method)
@anchor{library/stdtypes bytes index}@anchor{2664}
@deffn {Method} bytes.index (sub[, start[, end]])
@anchor{library/stdtypes bytearray index}@anchor{17e7}
@deffnx {Method} bytearray.index (sub[, start[, end]])

Like @ref{1c17,,find()}, but raise @ref{2ee,,ValueError} when the
subsequence is not found.

The subsequence to search for may be any @ref{194,,bytes-like object} or an
integer in the range 0 to 255.


Changed in version 3.3: Also accept an integer in the range 0 to 255 as the subsequence.

@end deffn

@geindex join() (bytes method)
@geindex join() (bytearray method)
@anchor{library/stdtypes bytes join}@anchor{1763}
@deffn {Method} bytes.join (iterable, /)
@anchor{library/stdtypes bytearray join}@anchor{1764}
@deffnx {Method} bytearray.join (iterable, /)

Return a bytes or bytearray object which is the concatenation of the
binary data sequences in `iterable'.  A @ref{199,,TypeError} will be raised
if there are any values in `iterable' that are not @ref{194,,bytes-like objects}, including @ref{16a,,str} objects.  The
separator between elements is the contents of the bytes or
bytearray object providing this method.
@end deffn

@geindex maketrans() (bytes static method)
@geindex maketrans() (bytearray static method)
@anchor{library/stdtypes bytes maketrans}@anchor{1480}
@deffn {Method} static bytes.maketrans (from, to, /)
@anchor{library/stdtypes bytearray maketrans}@anchor{1481}
@deffnx {Method} static bytearray.maketrans (from, to, /)

This static method returns a translation table usable for
@ref{2690,,bytes.translate()} that will map each character in `from' into the
character at the same position in `to'; `from' and `to' must both be
@ref{194,,bytes-like objects} and have the same length.


Added in version 3.1.

@end deffn

@geindex partition() (bytes method)
@geindex partition() (bytearray method)
@anchor{library/stdtypes bytes partition}@anchor{266c}
@deffn {Method} bytes.partition (sep, /)
@anchor{library/stdtypes bytearray partition}@anchor{26ab}
@deffnx {Method} bytearray.partition (sep, /)

Split the sequence at the first occurrence of `sep', and return a 3-tuple
containing the part before the separator, the separator itself or its
bytearray copy, and the part after the separator.
If the separator is not found, return a 3-tuple
containing a copy of the original sequence, followed by two empty bytes or
bytearray objects.

The separator to search for may be any @ref{194,,bytes-like object}.
@end deffn

@geindex replace() (bytes method)
@geindex replace() (bytearray method)
@anchor{library/stdtypes bytes replace}@anchor{2668}
@deffn {Method} bytes.replace (old, new, count=-1, /)
@anchor{library/stdtypes bytearray replace}@anchor{26ac}
@deffnx {Method} bytearray.replace (old, new, count=-1, /)

Return a copy of the sequence with all occurrences of subsequence `old'
replaced by `new'.  If the optional argument `count' is given, only the
first `count' occurrences are replaced.

The subsequence to search for and its replacement may be any
@ref{194,,bytes-like object}.

@cartouche
@quotation Note 
The bytearray version of this method does `not' operate in place - it
always produces a new object, even if no changes were made.
@end quotation
@end cartouche
@end deffn

@geindex rfind() (bytes method)
@geindex rfind() (bytearray method)
@anchor{library/stdtypes bytes rfind}@anchor{1c18}
@deffn {Method} bytes.rfind (sub[, start[, end]])
@anchor{library/stdtypes bytearray rfind}@anchor{15b0}
@deffnx {Method} bytearray.rfind (sub[, start[, end]])

Return the highest index in the sequence where the subsequence `sub' is
found, such that `sub' is contained within @code{s[start:end]}.  Optional
arguments `start' and `end' are interpreted as in slice notation. Return
@code{-1} on failure.

The subsequence to search for may be any @ref{194,,bytes-like object} or an
integer in the range 0 to 255.


Changed in version 3.3: Also accept an integer in the range 0 to 255 as the subsequence.

@end deffn

@geindex rindex() (bytes method)
@geindex rindex() (bytearray method)
@anchor{library/stdtypes bytes rindex}@anchor{2665}
@deffn {Method} bytes.rindex (sub[, start[, end]])
@anchor{library/stdtypes bytearray rindex}@anchor{17e8}
@deffnx {Method} bytearray.rindex (sub[, start[, end]])

Like @ref{1c18,,rfind()} but raises @ref{2ee,,ValueError} when the
subsequence `sub' is not found.

The subsequence to search for may be any @ref{194,,bytes-like object} or an
integer in the range 0 to 255.


Changed in version 3.3: Also accept an integer in the range 0 to 255 as the subsequence.

@end deffn

@geindex rpartition() (bytes method)
@geindex rpartition() (bytearray method)
@anchor{library/stdtypes bytes rpartition}@anchor{266d}
@deffn {Method} bytes.rpartition (sep, /)
@anchor{library/stdtypes bytearray rpartition}@anchor{26ad}
@deffnx {Method} bytearray.rpartition (sep, /)

Split the sequence at the last occurrence of `sep', and return a 3-tuple
containing the part before the separator, the separator itself or its
bytearray copy, and the part after the separator.
If the separator is not found, return a 3-tuple
containing two empty bytes or bytearray objects, followed by a copy of the
original sequence.

The separator to search for may be any @ref{194,,bytes-like object}.
@end deffn

@geindex startswith() (bytes method)
@geindex startswith() (bytearray method)
@anchor{library/stdtypes bytes startswith}@anchor{2666}
@deffn {Method} bytes.startswith (prefix[, start[, end]])
@anchor{library/stdtypes bytearray startswith}@anchor{15ad}
@deffnx {Method} bytearray.startswith (prefix[, start[, end]])

Return @code{True} if the binary data starts with the specified `prefix',
otherwise return @code{False}.  `prefix' can also be a tuple of prefixes to
look for.  With optional `start', test beginning at that position.  With
optional `end', stop comparing at that position.

The prefix(es) to search for may be any @ref{194,,bytes-like object}.
@end deffn

@geindex translate() (bytes method)
@geindex translate() (bytearray method)
@anchor{library/stdtypes bytes translate}@anchor{2690}
@deffn {Method} bytes.translate (table, /, delete=b'@w{'})
@anchor{library/stdtypes bytearray translate}@anchor{1507}
@deffnx {Method} bytearray.translate (table, /, delete=b'@w{'})

Return a copy of the bytes or bytearray object where all bytes occurring in
the optional argument `delete' are removed, and the remaining bytes have
been mapped through the given translation table, which must be a bytes
object of length 256.

You can use the @ref{1480,,bytes.maketrans()} method to create a translation
table.

Set the `table' argument to @code{None} for translations that only delete
characters:

@example
>>> b'read this short text'.translate(None, b'aeiou')
b'rd ths shrt txt'
@end example


Changed in version 3.6: `delete' is now supported as a keyword argument.

@end deffn

The following methods on bytes and bytearray objects have default behaviours
that assume the use of ASCII compatible binary formats, but can still be used
with arbitrary binary data by passing appropriate arguments. Note that all of
the bytearray methods in this section do `not' operate in place, and instead
produce new objects.

@geindex center() (bytes method)
@geindex center() (bytearray method)
@anchor{library/stdtypes bytes center}@anchor{2689}
@deffn {Method} bytes.center (width, fillbyte=b' ', /)
@anchor{library/stdtypes bytearray center}@anchor{26ae}
@deffnx {Method} bytearray.center (width, fillbyte=b' ', /)

Return a copy of the object centered in a sequence of length `width'.
Padding is done using the specified `fillbyte' (default is an ASCII
space). For @ref{193,,bytes} objects, the original sequence is returned if
`width' is less than or equal to @code{len(s)}.

@cartouche
@quotation Note 
The bytearray version of this method does `not' operate in place -
it always produces a new object, even if no changes were made.
@end quotation
@end cartouche
@end deffn

@geindex ljust() (bytes method)
@geindex ljust() (bytearray method)
@anchor{library/stdtypes bytes ljust}@anchor{2687}
@deffn {Method} bytes.ljust (width, fillbyte=b' ', /)
@anchor{library/stdtypes bytearray ljust}@anchor{26af}
@deffnx {Method} bytearray.ljust (width, fillbyte=b' ', /)

Return a copy of the object left justified in a sequence of length `width'.
Padding is done using the specified `fillbyte' (default is an ASCII
space). For @ref{193,,bytes} objects, the original sequence is returned if
`width' is less than or equal to @code{len(s)}.

@cartouche
@quotation Note 
The bytearray version of this method does `not' operate in place -
it always produces a new object, even if no changes were made.
@end quotation
@end cartouche
@end deffn

@geindex lstrip() (bytes method)
@geindex lstrip() (bytearray method)
@anchor{library/stdtypes bytes lstrip}@anchor{268d}
@deffn {Method} bytes.lstrip (bytes=None, /)
@anchor{library/stdtypes bytearray lstrip}@anchor{26b0}
@deffnx {Method} bytearray.lstrip (bytes=None, /)

Return a copy of the sequence with specified leading bytes removed.  The
`bytes' argument is a binary sequence specifying the set of byte values to
be removed.  If omitted or @code{None}, the `bytes' argument defaults
to removing ASCII whitespace.  The `bytes' argument is not a prefix;
rather, all combinations of its values are stripped:

@example
>>> b'   spacious   '.lstrip()
b'spacious   '
>>> b'www.example.com'.lstrip(b'cmowz.')
b'example.com'
@end example

The binary sequence of byte values to remove may be any
@ref{194,,bytes-like object}. See @ref{26a6,,removeprefix()} for a method
that will remove a single prefix string rather than all of a set of
characters.  For example:

@example
>>> b'Arthur: three!'.lstrip(b'Arthur: ')
b'ee!'
>>> b'Arthur: three!'.removeprefix(b'Arthur: ')
b'three!'
@end example

@cartouche
@quotation Note 
The bytearray version of this method does `not' operate in place -
it always produces a new object, even if no changes were made.
@end quotation
@end cartouche
@end deffn

@geindex rjust() (bytes method)
@geindex rjust() (bytearray method)
@anchor{library/stdtypes bytes rjust}@anchor{2688}
@deffn {Method} bytes.rjust (width, fillbyte=b' ', /)
@anchor{library/stdtypes bytearray rjust}@anchor{26b1}
@deffnx {Method} bytearray.rjust (width, fillbyte=b' ', /)

Return a copy of the object right justified in a sequence of length `width'.
Padding is done using the specified `fillbyte' (default is an ASCII
space). For @ref{193,,bytes} objects, the original sequence is returned if
`width' is less than or equal to @code{len(s)}.

@cartouche
@quotation Note 
The bytearray version of this method does `not' operate in place -
it always produces a new object, even if no changes were made.
@end quotation
@end cartouche
@end deffn

@geindex rsplit() (bytes method)
@geindex rsplit() (bytearray method)
@anchor{library/stdtypes bytes rsplit}@anchor{266a}
@deffn {Method} bytes.rsplit (sep=None, maxsplit=-1)
@anchor{library/stdtypes bytearray rsplit}@anchor{17eb}
@deffnx {Method} bytearray.rsplit (sep=None, maxsplit=-1)

Split the binary sequence into subsequences of the same type, using `sep'
as the delimiter string. If `maxsplit' is given, at most `maxsplit' splits
are done, the `rightmost' ones.  If `sep' is not specified or @code{None},
any subsequence consisting solely of ASCII whitespace is a separator.
Except for splitting from the right, @code{rsplit()} behaves like
@ref{17ea,,split()} which is described in detail below.
@end deffn

@geindex rstrip() (bytes method)
@geindex rstrip() (bytearray method)
@anchor{library/stdtypes bytes rstrip}@anchor{268e}
@deffn {Method} bytes.rstrip (bytes=None, /)
@anchor{library/stdtypes bytearray rstrip}@anchor{26b2}
@deffnx {Method} bytearray.rstrip (bytes=None, /)

Return a copy of the sequence with specified trailing bytes removed.  The
`bytes' argument is a binary sequence specifying the set of byte values to
be removed.  If omitted or @code{None}, the `bytes' argument defaults to
removing ASCII whitespace.  The `bytes' argument is not a suffix; rather,
all combinations of its values are stripped:

@example
>>> b'   spacious   '.rstrip()
b'   spacious'
>>> b'mississippi'.rstrip(b'ipz')
b'mississ'
@end example

The binary sequence of byte values to remove may be any
@ref{194,,bytes-like object}. See @ref{26a8,,removesuffix()} for a method
that will remove a single suffix string rather than all of a set of
characters.  For example:

@example
>>> b'Monty Python'.rstrip(b' Python')
b'M'
>>> b'Monty Python'.removesuffix(b' Python')
b'Monty'
@end example

@cartouche
@quotation Note 
The bytearray version of this method does `not' operate in place -
it always produces a new object, even if no changes were made.
@end quotation
@end cartouche
@end deffn

@geindex split() (bytes method)
@geindex split() (bytearray method)
@anchor{library/stdtypes bytes split}@anchor{2669}
@deffn {Method} bytes.split (sep=None, maxsplit=-1)
@anchor{library/stdtypes bytearray split}@anchor{17ea}
@deffnx {Method} bytearray.split (sep=None, maxsplit=-1)

Split the binary sequence into subsequences of the same type, using `sep'
as the delimiter string. If `maxsplit' is given and non-negative, at most
`maxsplit' splits are done (thus, the list will have at most @code{maxsplit+1}
elements).  If `maxsplit' is not specified or is @code{-1}, then there is no
limit on the number of splits (all possible splits are made).

If `sep' is given, consecutive delimiters are not grouped together and are
deemed to delimit empty subsequences (for example, @code{b'1,,2'.split(b',')}
returns @code{[b'1', b'@w{'}, b'2']}).  The `sep' argument may consist of a
multibyte sequence as a single delimiter. Splitting an empty sequence with
a specified separator returns @code{[b'@w{'}]} or @code{[bytearray(b'@w{'})]} depending
on the type of object being split.  The `sep' argument may be any
@ref{194,,bytes-like object}.

For example:

@example
>>> b'1,2,3'.split(b',')
[b'1', b'2', b'3']
>>> b'1,2,3'.split(b',', maxsplit=1)
[b'1', b'2,3']
>>> b'1,2,,3,'.split(b',')
[b'1', b'2', b'@w{'}, b'3', b'@w{'}]
>>> b'1<>2<>3<4'.split(b'<>')
[b'1', b'2', b'3<4']
@end example

If `sep' is not specified or is @code{None}, a different splitting algorithm
is applied: runs of consecutive ASCII whitespace are regarded as a single
separator, and the result will contain no empty strings at the start or
end if the sequence has leading or trailing whitespace.  Consequently,
splitting an empty sequence or a sequence consisting solely of ASCII
whitespace without a specified separator returns @code{[]}.

For example:

@example
>>> b'1 2 3'.split()
[b'1', b'2', b'3']
>>> b'1 2 3'.split(maxsplit=1)
[b'1', b'2 3']
>>> b'   1   2   3   '.split()
[b'1', b'2', b'3']
@end example
@end deffn

@geindex strip() (bytes method)
@geindex strip() (bytearray method)
@anchor{library/stdtypes bytes strip}@anchor{268c}
@deffn {Method} bytes.strip (bytes=None, /)
@anchor{library/stdtypes bytearray strip}@anchor{26b3}
@deffnx {Method} bytearray.strip (bytes=None, /)

Return a copy of the sequence with specified leading and trailing bytes
removed. The `bytes' argument is a binary sequence specifying the set of
byte values to be removed.  If omitted or @code{None}, the `bytes'
argument defaults to removing ASCII whitespace. The `bytes' argument is
not a prefix or suffix; rather, all combinations of its values are
stripped:

@example
>>> b'   spacious   '.strip()
b'spacious'
>>> b'www.example.com'.strip(b'cmowz.')
b'example'
@end example

The binary sequence of byte values to remove may be any
@ref{194,,bytes-like object}.

@cartouche
@quotation Note 
The bytearray version of this method does `not' operate in place -
it always produces a new object, even if no changes were made.
@end quotation
@end cartouche
@end deffn

The following methods on bytes and bytearray objects assume the use of ASCII
compatible binary formats and should not be applied to arbitrary binary data.
Note that all of the bytearray methods in this section do `not' operate in
place, and instead produce new objects.

@geindex capitalize() (bytes method)
@geindex capitalize() (bytearray method)
@anchor{library/stdtypes bytes capitalize}@anchor{2682}
@deffn {Method} bytes.capitalize ()
@anchor{library/stdtypes bytearray capitalize}@anchor{26b4}
@deffnx {Method} bytearray.capitalize ()

Return a copy of the sequence with each byte interpreted as an ASCII
character, and the first byte capitalized and the rest lowercased.
Non-ASCII byte values are passed through unchanged.

@cartouche
@quotation Note 
The bytearray version of this method does `not' operate in place - it
always produces a new object, even if no changes were made.
@end quotation
@end cartouche
@end deffn

@geindex expandtabs() (bytes method)
@geindex expandtabs() (bytearray method)
@anchor{library/stdtypes bytes expandtabs}@anchor{268b}
@deffn {Method} bytes.expandtabs (tabsize=8)
@anchor{library/stdtypes bytearray expandtabs}@anchor{26b5}
@deffnx {Method} bytearray.expandtabs (tabsize=8)

Return a copy of the sequence where all ASCII tab characters are replaced
by one or more ASCII spaces, depending on the current column and the given
tab size.  Tab positions occur every `tabsize' bytes (default is 8,
giving tab positions at columns 0, 8, 16 and so on).  To expand the
sequence, the current column is set to zero and the sequence is examined
byte by byte.  If the byte is an ASCII tab character (@code{b'\t'}), one or
more space characters are inserted in the result until the current column
is equal to the next tab position. (The tab character itself is not
copied.)  If the current byte is an ASCII newline (@code{b'\n'}) or
carriage return (@code{b'\r'}), it is copied and the current column is reset
to zero.  Any other byte value is copied unchanged and the current column
is incremented by one regardless of how the byte value is represented when
printed:

@example
>>> b'01\t012\t0123\t01234'.expandtabs()
b'01      012     0123    01234'
>>> b'01\t012\t0123\t01234'.expandtabs(4)
b'01  012 0123    01234'
@end example

@cartouche
@quotation Note 
The bytearray version of this method does `not' operate in place - it
always produces a new object, even if no changes were made.
@end quotation
@end cartouche
@end deffn

@geindex isalnum() (bytes method)
@geindex isalnum() (bytearray method)
@anchor{library/stdtypes bytes isalnum}@anchor{2675}
@deffn {Method} bytes.isalnum ()
@anchor{library/stdtypes bytearray isalnum}@anchor{26b6}
@deffnx {Method} bytearray.isalnum ()

Return @code{True} if all bytes in the sequence are alphabetical ASCII characters
or ASCII decimal digits and the sequence is not empty, @code{False} otherwise.
Alphabetic ASCII characters are those byte values in the sequence
@code{b'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'}. ASCII decimal
digits are those byte values in the sequence @code{b'0123456789'}.

For example:

@example
>>> b'ABCabc1'.isalnum()
True
>>> b'ABC abc1'.isalnum()
False
@end example
@end deffn

@geindex isalpha() (bytes method)
@geindex isalpha() (bytearray method)
@anchor{library/stdtypes bytes isalpha}@anchor{266f}
@deffn {Method} bytes.isalpha ()
@anchor{library/stdtypes bytearray isalpha}@anchor{26b7}
@deffnx {Method} bytearray.isalpha ()

Return @code{True} if all bytes in the sequence are alphabetic ASCII characters
and the sequence is not empty, @code{False} otherwise.  Alphabetic ASCII
characters are those byte values in the sequence
@code{b'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'}.

For example:

@example
>>> b'ABCabc'.isalpha()
True
>>> b'ABCabc1'.isalpha()
False
@end example
@end deffn

@geindex isascii() (bytes method)
@geindex isascii() (bytearray method)
@anchor{library/stdtypes bytes isascii}@anchor{26b8}
@deffn {Method} bytes.isascii ()
@anchor{library/stdtypes bytearray isascii}@anchor{26b9}
@deffnx {Method} bytearray.isascii ()

Return @code{True} if the sequence is empty or all bytes in the sequence are ASCII,
@code{False} otherwise.
ASCII bytes are in the range 0-0x7F.


Added in version 3.7.

@end deffn

@geindex isdigit() (bytes method)
@geindex isdigit() (bytearray method)
@anchor{library/stdtypes bytes isdigit}@anchor{2672}
@deffn {Method} bytes.isdigit ()
@anchor{library/stdtypes bytearray isdigit}@anchor{26ba}
@deffnx {Method} bytearray.isdigit ()

Return @code{True} if all bytes in the sequence are ASCII decimal digits
and the sequence is not empty, @code{False} otherwise. ASCII decimal digits are
those byte values in the sequence @code{b'0123456789'}.

For example:

@example
>>> b'1234'.isdigit()
True
>>> b'1.23'.isdigit()
False
@end example
@end deffn

@geindex islower() (bytes method)
@geindex islower() (bytearray method)
@anchor{library/stdtypes bytes islower}@anchor{2677}
@deffn {Method} bytes.islower ()
@anchor{library/stdtypes bytearray islower}@anchor{26bb}
@deffnx {Method} bytearray.islower ()

Return @code{True} if there is at least one lowercase ASCII character
in the sequence and no uppercase ASCII characters, @code{False} otherwise.

For example:

@example
>>> b'hello world'.islower()
True
>>> b'Hello world'.islower()
False
@end example

Lowercase ASCII characters are those byte values in the sequence
@code{b'abcdefghijklmnopqrstuvwxyz'}. Uppercase ASCII characters
are those byte values in the sequence @code{b'ABCDEFGHIJKLMNOPQRSTUVWXYZ'}.
@end deffn

@geindex isspace() (bytes method)
@geindex isspace() (bytearray method)
@anchor{library/stdtypes bytes isspace}@anchor{267d}
@deffn {Method} bytes.isspace ()
@anchor{library/stdtypes bytearray isspace}@anchor{26bc}
@deffnx {Method} bytearray.isspace ()

Return @code{True} if all bytes in the sequence are ASCII whitespace and the
sequence is not empty, @code{False} otherwise.  ASCII whitespace characters are
those byte values in the sequence @code{b' \t\n\r\x0b\f'} (space, tab, newline,
carriage return, vertical tab, form feed).
@end deffn

@geindex istitle() (bytes method)
@geindex istitle() (bytearray method)
@anchor{library/stdtypes bytes istitle}@anchor{267b}
@deffn {Method} bytes.istitle ()
@anchor{library/stdtypes bytearray istitle}@anchor{26bd}
@deffnx {Method} bytearray.istitle ()

Return @code{True} if the sequence is ASCII titlecase and the sequence is not
empty, @code{False} otherwise. See @ref{2684,,bytes.title()} for more details on the
definition of “titlecase”.

For example:

@example
>>> b'Hello World'.istitle()
True
>>> b'Hello world'.istitle()
False
@end example
@end deffn

@geindex isupper() (bytes method)
@geindex isupper() (bytearray method)
@anchor{library/stdtypes bytes isupper}@anchor{2679}
@deffn {Method} bytes.isupper ()
@anchor{library/stdtypes bytearray isupper}@anchor{26be}
@deffnx {Method} bytearray.isupper ()

Return @code{True} if there is at least one uppercase alphabetic ASCII character
in the sequence and no lowercase ASCII characters, @code{False} otherwise.

For example:

@example
>>> b'HELLO WORLD'.isupper()
True
>>> b'Hello world'.isupper()
False
@end example

Lowercase ASCII characters are those byte values in the sequence
@code{b'abcdefghijklmnopqrstuvwxyz'}. Uppercase ASCII characters
are those byte values in the sequence @code{b'ABCDEFGHIJKLMNOPQRSTUVWXYZ'}.
@end deffn

@geindex lower() (bytes method)
@geindex lower() (bytearray method)
@anchor{library/stdtypes bytes lower}@anchor{267e}
@deffn {Method} bytes.lower ()
@anchor{library/stdtypes bytearray lower}@anchor{26bf}
@deffnx {Method} bytearray.lower ()

Return a copy of the sequence with all the uppercase ASCII characters
converted to their corresponding lowercase counterpart.

For example:

@example
>>> b'Hello World'.lower()
b'hello world'
@end example

Lowercase ASCII characters are those byte values in the sequence
@code{b'abcdefghijklmnopqrstuvwxyz'}. Uppercase ASCII characters
are those byte values in the sequence @code{b'ABCDEFGHIJKLMNOPQRSTUVWXYZ'}.

@cartouche
@quotation Note 
The bytearray version of this method does `not' operate in place - it
always produces a new object, even if no changes were made.
@end quotation
@end cartouche
@end deffn

@geindex universal newlines; bytes.splitlines method
@geindex universal newlines; bytearray.splitlines method

@geindex splitlines() (bytes method)
@geindex splitlines() (bytearray method)
@anchor{library/stdtypes bytes splitlines}@anchor{266b}
@deffn {Method} bytes.splitlines (keepends=False)
@anchor{library/stdtypes bytearray splitlines}@anchor{26c0}
@deffnx {Method} bytearray.splitlines (keepends=False)

Return a list of the lines in the binary sequence, breaking at ASCII
line boundaries. This method uses the @ref{f3b,,universal newlines} approach
to splitting lines. Line breaks are not included in the resulting list
unless `keepends' is given and true.

For example:

@example
>>> b'ab c\n\nde fg\rkl\r\n'.splitlines()
[b'ab c', b'@w{'}, b'de fg', b'kl']
>>> b'ab c\n\nde fg\rkl\r\n'.splitlines(keepends=True)
[b'ab c\n', b'\n', b'de fg\r', b'kl\r\n']
@end example

Unlike @ref{2669,,split()} when a delimiter string `sep' is given, this
method returns an empty list for the empty string, and a terminal line
break does not result in an extra line:

@example
>>> b"".split(b'\n'), b"Two lines\n".split(b'\n')
([b'@w{'}], [b'Two lines', b'@w{'}])
>>> b"".splitlines(), b"One line\n".splitlines()
([], [b'One line'])
@end example
@end deffn

@geindex swapcase() (bytes method)
@geindex swapcase() (bytearray method)
@anchor{library/stdtypes bytes swapcase}@anchor{2686}
@deffn {Method} bytes.swapcase ()
@anchor{library/stdtypes bytearray swapcase}@anchor{26c1}
@deffnx {Method} bytearray.swapcase ()

Return a copy of the sequence with all the lowercase ASCII characters
converted to their corresponding uppercase counterpart and vice-versa.

For example:

@example
>>> b'Hello World'.swapcase()
b'hELLO wORLD'
@end example

Lowercase ASCII characters are those byte values in the sequence
@code{b'abcdefghijklmnopqrstuvwxyz'}. Uppercase ASCII characters
are those byte values in the sequence @code{b'ABCDEFGHIJKLMNOPQRSTUVWXYZ'}.

Unlike @ref{2685,,str.swapcase()}, it is always the case that
@code{bin.swapcase().swapcase() == bin} for the binary versions. Case
conversions are symmetrical in ASCII, even though that is not generally
true for arbitrary Unicode code points.

@cartouche
@quotation Note 
The bytearray version of this method does `not' operate in place - it
always produces a new object, even if no changes were made.
@end quotation
@end cartouche
@end deffn

@geindex title() (bytes method)
@geindex title() (bytearray method)
@anchor{library/stdtypes bytes title}@anchor{2684}
@deffn {Method} bytes.title ()
@anchor{library/stdtypes bytearray title}@anchor{26c2}
@deffnx {Method} bytearray.title ()

Return a titlecased version of the binary sequence where words start with
an uppercase ASCII character and the remaining characters are lowercase.
Uncased byte values are left unmodified.

For example:

@example
>>> b'Hello world'.title()
b'Hello World'
@end example

Lowercase ASCII characters are those byte values in the sequence
@code{b'abcdefghijklmnopqrstuvwxyz'}. Uppercase ASCII characters
are those byte values in the sequence @code{b'ABCDEFGHIJKLMNOPQRSTUVWXYZ'}.
All other byte values are uncased.

The algorithm uses a simple language-independent definition of a word as
groups of consecutive letters.  The definition works in many contexts but
it means that apostrophes in contractions and possessives form word
boundaries, which may not be the desired result:

@example
>>> b"they're bill's friends from the UK".title()
b"They'Re Bill'S Friends From The Uk"
@end example

A workaround for apostrophes can be constructed using regular expressions:

@example
>>> import re
>>> def titlecase(s):
...     return re.sub(rb"[A-Za-z]+('[A-Za-z]+)?",
...                   lambda mo: mo.group(0)[0:1].upper() +
...                              mo.group(0)[1:].lower(),
...                   s)
...
>>> titlecase(b"they're bill's friends.")
b"They're Bill's Friends."
@end example

@cartouche
@quotation Note 
The bytearray version of this method does `not' operate in place - it
always produces a new object, even if no changes were made.
@end quotation
@end cartouche
@end deffn

@geindex upper() (bytes method)
@geindex upper() (bytearray method)
@anchor{library/stdtypes bytes upper}@anchor{2680}
@deffn {Method} bytes.upper ()
@anchor{library/stdtypes bytearray upper}@anchor{26c3}
@deffnx {Method} bytearray.upper ()

Return a copy of the sequence with all the lowercase ASCII characters
converted to their corresponding uppercase counterpart.

For example:

@example
>>> b'Hello World'.upper()
b'HELLO WORLD'
@end example

Lowercase ASCII characters are those byte values in the sequence
@code{b'abcdefghijklmnopqrstuvwxyz'}. Uppercase ASCII characters
are those byte values in the sequence @code{b'ABCDEFGHIJKLMNOPQRSTUVWXYZ'}.

@cartouche
@quotation Note 
The bytearray version of this method does `not' operate in place - it
always produces a new object, even if no changes were made.
@end quotation
@end cartouche
@end deffn

@geindex zfill() (bytes method)
@geindex zfill() (bytearray method)
@anchor{library/stdtypes bytes zfill}@anchor{26c4}
@deffn {Method} bytes.zfill (width, /)
@anchor{library/stdtypes bytearray zfill}@anchor{26c5}
@deffnx {Method} bytearray.zfill (width, /)

Return a copy of the sequence left filled with ASCII @code{b'0'} digits to
make a sequence of length `width'. A leading sign prefix (@code{b'+'}/
@code{b'-'}) is handled by inserting the padding `after' the sign character
rather than before. For @ref{193,,bytes} objects, the original sequence is
returned if `width' is less than or equal to @code{len(seq)}.

For example:

@example
>>> b"42".zfill(5)
b'00042'
>>> b"-42".zfill(5)
b'-0042'
@end example

@cartouche
@quotation Note 
The bytearray version of this method does `not' operate in place - it
always produces a new object, even if no changes were made.
@end quotation
@end cartouche
@end deffn

@node printf-style Bytes Formatting,Memory Views,Bytes and Bytearray Operations,Binary Sequence Types — bytes bytearray memoryview
@anchor{library/stdtypes bytes-formatting}@anchor{f87}@anchor{library/stdtypes printf-style-bytes-formatting}@anchor{26c6}
@subsubsection @code{printf}-style Bytes Formatting


@geindex formatting; bytes (%)
@geindex formatting; bytearray (%)
@geindex interpolation; bytes (%)
@geindex interpolation; bytearray (%)
@geindex bytes; formatting
@geindex bytearray; formatting
@geindex bytes; interpolation
@geindex bytearray; interpolation
@geindex printf-style formatting
@geindex sprintf-style formatting
@geindex % (percent); printf-style formatting

@cartouche
@quotation Note 
The formatting operations described here exhibit a variety of quirks that
lead to a number of common errors (such as failing to display tuples and
dictionaries correctly).  If the value being printed may be a tuple or
dictionary, wrap it in a tuple.
@end quotation
@end cartouche

Bytes objects (@code{bytes}/@code{bytearray}) have one unique built-in operation:
the @code{%} operator (modulo).
This is also known as the bytes `formatting' or `interpolation' operator.
Given @code{format % values} (where `format' is a bytes object), @code{%} conversion
specifications in `format' are replaced with zero or more elements of `values'.
The effect is similar to using the @code{sprintf()} in the C language.

If `format' requires a single argument, `values' may be a single non-tuple
object. @footnote{
To format only a tuple you should therefore provide a singleton tuple whose only
element is the tuple to be formatted.
}  Otherwise, `values' must be a tuple with exactly the number of
items specified by the format bytes object, or a single mapping object (for
example, a dictionary).

@geindex () (parentheses); in printf-style formatting
@geindex * (asterisk); in printf-style formatting
@geindex . (dot); in printf-style formatting

A conversion specifier contains two or more characters and has the following
components, which must occur in this order:


@enumerate 

@item 
The @code{'%'} character, which marks the start of the specifier.

@item 
Mapping key (optional), consisting of a parenthesised sequence of characters
(for example, @code{(somename)}).

@item 
Conversion flags (optional), which affect the result of some conversion
types.

@item 
Minimum field width (optional).  If specified as an @code{'*'} (asterisk), the
actual width is read from the next element of the tuple in `values', and the
object to convert comes after the minimum field width and optional precision.

@item 
Precision (optional), given as a @code{'.'} (dot) followed by the precision.  If
specified as @code{'*'} (an asterisk), the actual precision is read from the next
element of the tuple in `values', and the value to convert comes after the
precision.

@item 
Length modifier (optional).

@item 
Conversion type.
@end enumerate

When the right argument is a dictionary (or other mapping type), then the
formats in the bytes object `must' include a parenthesised mapping key into that
dictionary inserted immediately after the @code{'%'} character. The mapping key
selects the value to be formatted from the mapping.  For example:

@example
>>> print(b'%(language)s has %(number)03d quote types.' %
...       @{b'language': b"Python", b"number": 2@})
b'Python has 002 quote types.'
@end example

In this case no @code{*} specifiers may occur in a format (since they require a
sequential parameter list).

The conversion flag characters are:

@geindex # (hash); in printf-style formatting
@geindex - (minus); in printf-style formatting
@geindex + (plus); in printf-style formatting
@geindex space; in printf-style formatting


@multitable {xxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Flag

@tab

Meaning

@item

@code{'#'}

@tab

The value conversion will use the “alternate form” (where defined
below).

@item

@code{'0'}

@tab

The conversion will be zero padded for numeric values.

@item

@code{'-'}

@tab

The converted value is left adjusted (overrides the @code{'0'}
conversion if both are given).

@item

@code{' '}

@tab

(a space) A blank should be left before a positive number (or empty
string) produced by a signed conversion.

@item

@code{'+'}

@tab

A sign character (@code{'+'} or @code{'-'}) will precede the conversion
(overrides a “space” flag).

@end multitable


A length modifier (@code{h}, @code{l}, or @code{L}) may be present, but is ignored as it
is not necessary for Python – so e.g. @code{%ld} is identical to @code{%d}.

The conversion types are:


@multitable {xxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxx} 
@headitem

Conversion

@tab

Meaning

@tab

Notes

@item

@code{'d'}

@tab

Signed integer decimal.

@tab

@item

@code{'i'}

@tab

Signed integer decimal.

@tab

@item

@code{'o'}

@tab

Signed octal value.

@tab

(1)

@item

@code{'u'}

@tab

Obsolete type – it is identical to @code{'d'}.

@tab

(8)

@item

@code{'x'}

@tab

Signed hexadecimal (lowercase).

@tab

(2)

@item

@code{'X'}

@tab

Signed hexadecimal (uppercase).

@tab

(2)

@item

@code{'e'}

@tab

Floating-point exponential format (lowercase).

@tab

(3)

@item

@code{'E'}

@tab

Floating-point exponential format (uppercase).

@tab

(3)

@item

@code{'f'}

@tab

Floating-point decimal format.

@tab

(3)

@item

@code{'F'}

@tab

Floating-point decimal format.

@tab

(3)

@item

@code{'g'}

@tab

Floating-point format. Uses lowercase exponential
format if exponent is less than -4 or not less than
precision, decimal format otherwise.

@tab

(4)

@item

@code{'G'}

@tab

Floating-point format. Uses uppercase exponential
format if exponent is less than -4 or not less than
precision, decimal format otherwise.

@tab

(4)

@item

@code{'c'}

@tab

Single byte (accepts integer or single
byte objects).

@tab

@item

@code{'b'}

@tab

Bytes (any object that follows the
@ref{262,,buffer protocol} or has
@ref{7ff,,__bytes__()}).

@tab

(5)

@item

@code{'s'}

@tab

@code{'s'} is an alias for @code{'b'} and should only
be used for Python2/3 code bases.

@tab

(6)

@item

@code{'a'}

@tab

Bytes (converts any Python object using
@code{repr(obj).encode('ascii', 'backslashreplace')}).

@tab

(5)

@item

@code{'r'}

@tab

@code{'r'} is an alias for @code{'a'} and should only
be used for Python2/3 code bases.

@tab

(7)

@item

@code{'%'}

@tab

No argument is converted, results in a @code{'%'}
character in the result.

@tab

@end multitable


Notes:


@enumerate 

@item 
The alternate form causes a leading octal specifier (@code{'0o'}) to be
inserted before the first digit.

@item 
The alternate form causes a leading @code{'0x'} or @code{'0X'} (depending on whether
the @code{'x'} or @code{'X'} format was used) to be inserted before the first digit.

@item 
The alternate form causes the result to always contain a decimal point, even if
no digits follow it.

The precision determines the number of digits after the decimal point and
defaults to 6.

@item 
The alternate form causes the result to always contain a decimal point, and
trailing zeroes are not removed as they would otherwise be.

The precision determines the number of significant digits before and after the
decimal point and defaults to 6.

@item 
If precision is @code{N}, the output is truncated to @code{N} characters.

@item 
@code{b'%s'} is deprecated, but will not be removed during the 3.x series.

@item 
@code{b'%r'} is deprecated, but will not be removed during the 3.x series.

@item 
See 
@geindex Python Enhancement Proposals; PEP 237
PEP 237@footnote{https://peps.python.org/pep-0237/}.
@end enumerate

@cartouche
@quotation Note 
The bytearray version of this method does `not' operate in place - it
always produces a new object, even if no changes were made.
@end quotation
@end cartouche


@subsubheading See also


@geindex Python Enhancement Proposals; PEP 461
PEP 461@footnote{https://peps.python.org/pep-0461/} - Adding % formatting to bytes and bytearray



Added in version 3.5.


@node Memory Views,,printf-style Bytes Formatting,Binary Sequence Types — bytes bytearray memoryview
@anchor{library/stdtypes memory-views}@anchor{26c7}@anchor{library/stdtypes typememoryview}@anchor{261f}
@subsubsection Memory Views


@ref{166,,memoryview} objects allow Python code to access the internal data
of an object that supports the @ref{262,,buffer protocol} without
copying.

@geindex memoryview (built-in class)
@anchor{library/stdtypes memoryview}@anchor{166}
@deffn {Class} memoryview (object)

@quotation

Create a @code{memoryview} that references `object'.  `object' must
support the buffer protocol.  Built-in objects that support the buffer
protocol include @ref{193,,bytes} and @ref{342,,bytearray}.

A @code{memoryview} has the notion of an `element', which is the
atomic memory unit handled by the originating `object'.  For many simple
types such as @ref{193,,bytes} and @ref{342,,bytearray}, an element is a single
byte, but other types such as @ref{4bf,,array.array} may have bigger elements.

@code{memoryview}s are @ref{2410,,generic} over the type of their
underlying data.

@code{len(view)} is equal to the length of @ref{26c8,,tolist}, which
is the nested list representation of the view. If @code{view.ndim = 1},
this is equal to the number of elements in the view.


Changed in version 3.12: If @code{view.ndim == 0}, @code{len(view)} now raises @ref{199,,TypeError} instead of returning 1.


The @ref{26c9,,itemsize} attribute will give you the number of
bytes in a single element.

A @code{memoryview} supports slicing and indexing to expose its data.
One-dimensional slicing will result in a subview:

@example
>>> v = memoryview(b'abcefg')
>>> v[1]
98
>>> v[-1]
103
>>> v[1:4]
<memory at 0x7f3ddc9f4350>
>>> bytes(v[1:4])
b'bce'
@end example

If @ref{26ca,,format} is one of the native format specifiers
from the @ref{db,,struct} module, indexing with an integer or a tuple of
integers is also supported and returns a single `element' with
the correct type.  One-dimensional memoryviews can be indexed
with an integer or a one-integer tuple.  Multi-dimensional memoryviews
can be indexed with tuples of exactly `ndim' integers where `ndim' is
the number of dimensions.  Zero-dimensional memoryviews can be indexed
with the empty tuple.

Here is an example with a non-byte format:

@example
>>> import array
>>> a = array.array('l', [-11111111, 22222222, -33333333, 44444444])
>>> m = memoryview(a)
>>> m[0]
-11111111
>>> m[-1]
44444444
>>> m[::2].tolist()
[-11111111, -33333333]
@end example

If the underlying object is writable, the memoryview supports
one-dimensional slice assignment. Resizing is not allowed:

@example
>>> data = bytearray(b'abcefg')
>>> v = memoryview(data)
>>> v.readonly
False
>>> v[0] = ord(b'z')
>>> data
bytearray(b'zbcefg')
>>> v[1:4] = b'123'
>>> data
bytearray(b'z123fg')
>>> v[2:3] = b'spam'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: memoryview assignment: lvalue and rvalue have different structures
>>> v[2:6] = b'spam'
>>> data
bytearray(b'z1spam')
@end example

One-dimensional memoryviews of @ref{825,,hashable} (read-only) types with formats
‘B’, ‘b’ or ‘c’ are also hashable. The hash is defined as
@code{hash(m) == hash(m.tobytes())}:

@example
>>> v = memoryview(b'abcefg')
>>> hash(v) == hash(b'abcefg')
True
>>> hash(v[2:4]) == hash(b'ce')
True
>>> hash(v[::-2]) == hash(b'abcefg'[::-2])
True
@end example


Changed in version 3.3: One-dimensional memoryviews can now be sliced.
One-dimensional memoryviews with formats ‘B’, ‘b’ or ‘c’ are now @ref{825,,hashable}.



Changed in version 3.4: memoryview is now registered automatically with
@ref{13d0,,collections.abc.Sequence}



Changed in version 3.5: memoryviews can now be indexed with tuple of integers.



Changed in version 3.14: memoryview is now a @ref{1a2,,generic type}.


@code{memoryview} has several methods:

@geindex __eq__() (memoryview method)
@anchor{library/stdtypes memoryview __eq__}@anchor{26cb}
@deffn {Method} __eq__ (exporter)

A memoryview and a 
@geindex Python Enhancement Proposals; PEP 3118
PEP 3118@footnote{https://peps.python.org/pep-3118/} exporter are equal if their shapes are
equivalent and if all corresponding values are equal when the operands’
respective format codes are interpreted using @ref{db,,struct} syntax.

For the subset of @ref{db,,struct} format strings currently supported by
@ref{26c8,,tolist()}, @code{v} and @code{w} are equal if @code{v.tolist() == w.tolist()}:

@example
>>> import array
>>> a = array.array('I', [1, 2, 3, 4, 5])
>>> b = array.array('d', [1.0, 2.0, 3.0, 4.0, 5.0])
>>> c = array.array('b', [5, 3, 1])
>>> x = memoryview(a)
>>> y = memoryview(b)
>>> x == a == y == b
True
>>> x.tolist() == a.tolist() == y.tolist() == b.tolist()
True
>>> z = y[::-2]
>>> z == c
True
>>> z.tolist() == c.tolist()
True
@end example

If either format string is not supported by the @ref{db,,struct} module,
then the objects will always compare as unequal (even if the format
strings and buffer contents are identical):

@example
>>> from ctypes import BigEndianStructure, c_long
>>> class BEPoint(BigEndianStructure):
...     _fields_ = [("x", c_long), ("y", c_long)]
...
>>> point = BEPoint(100, 200)
>>> a = memoryview(point)
>>> b = memoryview(point)
>>> a == point
False
>>> a == b
False
@end example

Note that, as with floating-point numbers, @code{v is w} does `not' imply
@code{v == w} for memoryview objects.


Changed in version 3.3: Previous versions compared the raw memory disregarding the item format
and the logical array structure.

@end deffn

@geindex tobytes() (memoryview method)
@anchor{library/stdtypes memoryview tobytes}@anchor{26cc}
@deffn {Method} tobytes (order='C')

Return the data in the buffer as a bytestring.  This is equivalent to
calling the @ref{193,,bytes} constructor on the memoryview.

@example
>>> m = memoryview(b"abc")
>>> m.tobytes()
b'abc'
>>> bytes(m)
b'abc'
@end example

For non-contiguous arrays the result is equal to the flattened list
representation with all elements converted to bytes. @code{tobytes()}
supports all format strings, including those that are not in
@ref{db,,struct} module syntax.


Added in version 3.8: `order' can be @{‘C’, ‘F’, ‘A’@}.  When `order' is ‘C’ or ‘F’, the data
of the original array is converted to C or Fortran order. For contiguous
views, ‘A’ returns an exact copy of the physical memory. In particular,
in-memory Fortran order is preserved. For non-contiguous views, the
data is converted to C first. `order=None' is the same as `order=’C’'.

@end deffn

@geindex hex() (memoryview method)
@anchor{library/stdtypes memoryview hex}@anchor{f6d}
@deffn {Method} hex (*, bytes_per_sep=1)

@deffnx {Method} hex (sep, bytes_per_sep=1)

Return a string object containing two hexadecimal digits for each
byte in the buffer.

@example
>>> m = memoryview(b"abc")
>>> m.hex()
'616263'
@end example


Added in version 3.5.



Changed in version 3.8: Similar to @ref{f6b,,bytes.hex()}, @code{memoryview.hex()} now supports
optional `sep' and `bytes_per_sep' parameters to insert separators
between bytes in the hex output.

@end deffn

@geindex tolist() (memoryview method)
@anchor{library/stdtypes memoryview tolist}@anchor{26c8}
@deffn {Method} tolist ()

Return the data in the buffer as a list of elements.

@example
>>> memoryview(b'abc').tolist()
[97, 98, 99]
>>> import array
>>> a = array.array('d', [1.1, 2.2, 3.3])
>>> m = memoryview(a)
>>> m.tolist()
[1.1, 2.2, 3.3]
@end example


Changed in version 3.3: @code{tolist()} now supports all single character native formats in
@ref{db,,struct} module syntax as well as multi-dimensional
representations.

@end deffn

@geindex toreadonly() (memoryview method)
@anchor{library/stdtypes memoryview toreadonly}@anchor{26cd}
@deffn {Method} toreadonly ()

Return a readonly version of the memoryview object.  The original
memoryview object is unchanged.

@example
>>> m = memoryview(bytearray(b'abc'))
>>> mm = m.toreadonly()
>>> mm.tolist()
[97, 98, 99]
>>> mm[0] = 42
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cannot modify read-only memory
>>> m[0] = 43
>>> mm.tolist()
[43, 98, 99]
@end example


Added in version 3.8.

@end deffn

@geindex release() (memoryview method)
@anchor{library/stdtypes memoryview release}@anchor{13ca}
@deffn {Method} release ()

Release the underlying buffer exposed by the memoryview object.  Many
objects take special actions when a view is held on them (for example,
a @ref{342,,bytearray} would temporarily forbid resizing); therefore,
calling release() is handy to remove these restrictions (and free any
dangling resources) as soon as possible.

After this method has been called, any further operation on the view
raises a @ref{2ee,,ValueError} (except @code{release()} itself which can
be called multiple times):

@example
>>> m = memoryview(b'abc')
>>> m.release()
>>> m[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: operation forbidden on released memoryview object
@end example

The context management protocol can be used for a similar effect,
using the @code{with} statement:

@example
>>> with memoryview(b'abc') as m:
...     m[0]
...
97
>>> m[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: operation forbidden on released memoryview object
@end example


Added in version 3.2.

@end deffn

@geindex cast() (memoryview method)
@anchor{library/stdtypes memoryview cast}@anchor{1790}
@deffn {Method} cast (format, /)

@deffnx {Method} cast (format, shape, /)

Cast a memoryview to a new format or shape. `shape' defaults to
@code{[byte_length//new_itemsize]}, which means that the result view
will be one-dimensional. The return value is a new memoryview, but
the buffer itself is not copied. Supported casts are 1D -> C-@ref{26ce,,contiguous}
and C-contiguous -> 1D.

The destination format is restricted to a single element native format in
@ref{db,,struct} syntax. One of the formats must be a byte format
(‘B’, ‘b’ or ‘c’). The byte length of the result must be the same
as the original length.
Note that all byte lengths may depend on the operating system.

Cast 1D/long to 1D/unsigned bytes:

@example
>>> import array
>>> a = array.array('l', [1,2,3])
>>> x = memoryview(a)
>>> x.format
'l'
>>> x.itemsize
8
>>> len(x)
3
>>> x.nbytes
24
>>> y = x.cast('B')
>>> y.format
'B'
>>> y.itemsize
1
>>> len(y)
24
>>> y.nbytes
24
@end example

Cast 1D/unsigned bytes to 1D/char:

@example
>>> b = bytearray(b'zyz')
>>> x = memoryview(b)
>>> x[0] = b'a'
Traceback (most recent call last):
  ...
TypeError: memoryview: invalid type for format 'B'
>>> y = x.cast('c')
>>> y[0] = b'a'
>>> b
bytearray(b'ayz')
@end example

Cast 1D/bytes to 3D/ints to 1D/signed char:

@example
>>> import struct
>>> buf = struct.pack("i"*12, *list(range(12)))
>>> x = memoryview(buf)
>>> y = x.cast('i', shape=[2,2,3])
>>> y.tolist()
[[[0, 1, 2], [3, 4, 5]], [[6, 7, 8], [9, 10, 11]]]
>>> y.format
'i'
>>> y.itemsize
4
>>> len(y)
2
>>> y.nbytes
48
>>> z = y.cast('b')
>>> z.format
'b'
>>> z.itemsize
1
>>> len(z)
48
>>> z.nbytes
48
@end example

Cast 1D/unsigned long to 2D/unsigned long:

@example
>>> buf = struct.pack("L"*6, *list(range(6)))
>>> x = memoryview(buf)
>>> y = x.cast('L', shape=[2,3])
>>> len(y)
2
>>> y.nbytes
48
>>> y.tolist()
[[0, 1, 2], [3, 4, 5]]
@end example


Added in version 3.3.



Changed in version 3.5: The source format is no longer restricted when casting to a byte view.

@end deffn

@geindex count() (memoryview method)
@anchor{library/stdtypes memoryview count}@anchor{193d}
@deffn {Method} count (value, /)

Count the number of occurrences of `value'.


Added in version 3.14.

@end deffn
@end quotation

@geindex index() (memoryview method)
@anchor{library/stdtypes memoryview index}@anchor{193c}
@deffn {Method} index (value, start=0, stop=sys.maxsize, /)

@quotation

Return the index of the first occurrence of `value' (at or after
index `start' and before index `stop').

Raises a @ref{2ee,,ValueError} if `value' cannot be found.


Added in version 3.14.

@end quotation

There are also several readonly attributes available:

@geindex obj (memoryview attribute)
@anchor{library/stdtypes memoryview obj}@anchor{26cf}
@deffn {Attribute} obj

The underlying object of the memoryview:

@example
>>> b  = bytearray(b'xyz')
>>> m = memoryview(b)
>>> m.obj is b
True
@end example


Added in version 3.3.

@end deffn

@geindex nbytes (memoryview attribute)
@anchor{library/stdtypes memoryview nbytes}@anchor{26d0}
@deffn {Attribute} nbytes

@code{nbytes == product(shape) * itemsize == len(m.tobytes())}. This is
the amount of space in bytes that the array would use in a contiguous
representation. It is not necessarily equal to @code{len(m)}:

@example
>>> import array
>>> a = array.array('i', [1,2,3,4,5])
>>> m = memoryview(a)
>>> len(m)
5
>>> m.nbytes
20
>>> y = m[::2]
>>> len(y)
3
>>> y.nbytes
12
>>> len(y.tobytes())
12
@end example

Multi-dimensional arrays:

@example
>>> import struct
>>> buf = struct.pack("d"*12, *[1.5*x for x in range(12)])
>>> x = memoryview(buf)
>>> y = x.cast('d', shape=[3,4])
>>> y.tolist()
[[0.0, 1.5, 3.0, 4.5], [6.0, 7.5, 9.0, 10.5], [12.0, 13.5, 15.0, 16.5]]
>>> len(y)
3
>>> y.nbytes
96
@end example


Added in version 3.3.

@end deffn

@geindex readonly (memoryview attribute)
@anchor{library/stdtypes memoryview readonly}@anchor{26d1}
@deffn {Attribute} readonly

A bool indicating whether the memory is read only.
@end deffn

@geindex format (memoryview attribute)
@anchor{library/stdtypes memoryview format}@anchor{26ca}
@deffn {Attribute} format

A string containing the format (in @ref{db,,struct} module style) for each
element in the view. A memoryview can be created from exporters with
arbitrary format strings, but some methods (e.g. @ref{26c8,,tolist()}) are
restricted to native single element formats.


Changed in version 3.3: format @code{'B'} is now handled according to the struct module syntax.
This means that @code{memoryview(b'abc')[0] == b'abc'[0] == 97}.

@end deffn

@geindex itemsize (memoryview attribute)
@anchor{library/stdtypes memoryview itemsize}@anchor{26c9}
@deffn {Attribute} itemsize

The size in bytes of each element of the memoryview:

@example
>>> import array, struct
>>> m = memoryview(array.array('H', [32000, 32001, 32002]))
>>> m.itemsize
2
>>> m[0]
32000
>>> struct.calcsize('H') == m.itemsize
True
@end example
@end deffn

@geindex ndim (memoryview attribute)
@anchor{library/stdtypes memoryview ndim}@anchor{26d2}
@deffn {Attribute} ndim

An integer indicating how many dimensions of a multi-dimensional array the
memory represents.
@end deffn

@geindex shape (memoryview attribute)
@anchor{library/stdtypes memoryview shape}@anchor{26d3}
@deffn {Attribute} shape

A tuple of integers the length of @ref{26d2,,ndim} giving the shape of the
memory as an N-dimensional array.


Changed in version 3.3: An empty tuple instead of @code{None} when ndim = 0.

@end deffn

@geindex strides (memoryview attribute)
@anchor{library/stdtypes memoryview strides}@anchor{26d4}
@deffn {Attribute} strides

A tuple of integers the length of @ref{26d2,,ndim} giving the size in bytes to
access each element for each dimension of the array.


Changed in version 3.3: An empty tuple instead of @code{None} when ndim = 0.

@end deffn

@geindex suboffsets (memoryview attribute)
@anchor{library/stdtypes memoryview suboffsets}@anchor{26d5}
@deffn {Attribute} suboffsets

Used internally for PIL-style arrays. The value is informational only.
@end deffn

@geindex c_contiguous (memoryview attribute)
@anchor{library/stdtypes memoryview c_contiguous}@anchor{26d6}
@deffn {Attribute} c_contiguous

A bool indicating whether the memory is C-@ref{26ce,,contiguous}.


Added in version 3.3.

@end deffn

@geindex f_contiguous (memoryview attribute)
@anchor{library/stdtypes memoryview f_contiguous}@anchor{26d7}
@deffn {Attribute} f_contiguous

A bool indicating whether the memory is Fortran @ref{26ce,,contiguous}.


Added in version 3.3.

@end deffn

@geindex contiguous (memoryview attribute)
@anchor{library/stdtypes memoryview contiguous}@anchor{26d8}
@deffn {Attribute} contiguous

A bool indicating whether the memory is @ref{26ce,,contiguous}.


Added in version 3.3.

@end deffn
@end deffn
@end deffn

For information on the thread safety of @ref{166,,memoryview} objects in
the @ref{1791,,free-threaded build}, see @ref{2458,,Thread safety for memoryview objects}.

@node Set Types — set frozenset,Mapping Types — dict,Binary Sequence Types — bytes bytearray memoryview,Built-in Types
@anchor{library/stdtypes set-types-set-frozenset}@anchor{26d9}@anchor{library/stdtypes types-set}@anchor{2075}
@subsection Set Types — @code{set}, @code{frozenset}


@geindex object; set

A `set' object is an unordered collection of distinct @ref{825,,hashable} objects.
Common uses include membership testing, removing duplicates from a sequence, and
computing mathematical operations such as intersection, union, difference, and
symmetric difference.
(For other containers see the built-in @ref{184,,dict}, @ref{24f,,list},
and @ref{614,,tuple} classes, and the @ref{1e,,collections} module.)

Like other collections, sets support @code{x in set}, @code{len(set)}, and @code{for x in
set}.  Being an unordered collection, sets do not record element position or
order of insertion.  Accordingly, sets do not support indexing, slicing, or
other sequence-like behavior.

There are currently two built-in set types, @ref{185,,set} and @ref{7f3,,frozenset}.
The @code{set} type is mutable — the contents can be changed using methods
like @ref{2382,,add()} and @ref{26da,,remove()}.
Since it is mutable, it has no hash value and cannot be used as
either a dictionary key or as an element of another set.
The @code{frozenset} type is immutable and @ref{825,,hashable} —
its contents cannot be altered after it is created;
it can therefore be used as a dictionary key or as an element of another set.

Non-empty sets (not frozensets) can be created by placing a comma-separated list
of elements within braces, for example: @code{@{'jack', 'sjoerd'@}}, in addition to the
@ref{185,,set} constructor.

The constructors for both classes work the same:

@geindex set (built-in class)
@geindex frozenset (built-in class)
@anchor{library/stdtypes set}@anchor{185}
@deffn {Class} set (iterable=(), /)
@anchor{library/stdtypes frozenset}@anchor{7f3}
@deffnx {Class} frozenset (iterable=(), /)

Return a new set or frozenset object whose elements are taken from
`iterable'.  The elements of a set must be @ref{825,,hashable}.  To
represent sets of sets, the inner sets must be @code{frozenset}
objects.  If `iterable' is not specified, a new empty set is
returned.
@end deffn

Sets can be created by several means:


@itemize *

@item 
Use a comma-separated list of elements within braces: @code{@{'jack', 'sjoerd'@}}

@item 
Use a set comprehension: @code{@{c for c in 'abracadabra' if c not in 'abc'@}}

@item 
Use the type constructor: @code{set()}, @code{set('foobar')}, @code{set(['a', 'b', 'foo'])}
@end itemize

Instances of @ref{185,,set} and @ref{7f3,,frozenset} provide the following
operations:


@deffn {Describe} len(s)

Return the number of elements in set `s' (cardinality of `s').
@end deffn


@deffn {Describe} x in s

Test `x' for membership in `s'.
@end deffn


@deffn {Describe} x not in s

Test `x' for non-membership in `s'.
@end deffn

@geindex isdisjoint() (frozenset method)
@geindex isdisjoint() (set method)
@anchor{library/stdtypes frozenset isdisjoint}@anchor{26db}
@deffn {Method} frozenset.isdisjoint (other, /)
@anchor{library/stdtypes set isdisjoint}@anchor{26dc}
@deffnx {Method} set.isdisjoint (other, /)

Return @code{True} if the set has no elements in common with `other'.  Sets are
disjoint if and only if their intersection is the empty set.
@end deffn

@geindex issubset() (frozenset method)
@geindex issubset() (set method)
@anchor{library/stdtypes frozenset issubset}@anchor{26dd}
@deffn {Method} frozenset.issubset (other, /)
@anchor{library/stdtypes set issubset}@anchor{26de}
@deffnx {Method} set.issubset (other, /)
@end deffn


@deffn {Describe} set <= other

Test whether every element in the set is in `other'.
@end deffn


@deffn {Describe} set < other

Test whether the set is a proper subset of `other', that is,
@code{set <= other and set != other}.
@end deffn

@geindex issuperset() (frozenset method)
@geindex issuperset() (set method)
@anchor{library/stdtypes frozenset issuperset}@anchor{26df}
@deffn {Method} frozenset.issuperset (other, /)
@anchor{library/stdtypes set issuperset}@anchor{1bc9}
@deffnx {Method} set.issuperset (other, /)
@end deffn


@deffn {Describe} set >= other

Test whether every element in `other' is in the set.
@end deffn


@deffn {Describe} set > other

Test whether the set is a proper superset of `other', that is, @code{set >=
other and set != other}.
@end deffn

@geindex union() (frozenset method)
@geindex union() (set method)
@anchor{library/stdtypes frozenset union}@anchor{168f}
@deffn {Method} frozenset.union (*others)
@anchor{library/stdtypes set union}@anchor{26e0}
@deffnx {Method} set.union (*others)
@end deffn


@deffn {Describe} set | other | ...

Return a new set with elements from the set and all others.
@end deffn

@geindex intersection() (frozenset method)
@geindex intersection() (set method)
@anchor{library/stdtypes frozenset intersection}@anchor{1690}
@deffn {Method} frozenset.intersection (*others)
@anchor{library/stdtypes set intersection}@anchor{1bc8}
@deffnx {Method} set.intersection (*others)
@end deffn


@deffn {Describe} set & other & ...

Return a new set with elements common to the set and all others.
@end deffn

@geindex difference() (frozenset method)
@geindex difference() (set method)
@anchor{library/stdtypes frozenset difference}@anchor{26e1}
@deffn {Method} frozenset.difference (*others)
@anchor{library/stdtypes set difference}@anchor{26e2}
@deffnx {Method} set.difference (*others)
@end deffn


@deffn {Describe} set @w{-} other @w{-} ...

Return a new set with elements in the set that are not in the others.
@end deffn

@geindex symmetric_difference() (frozenset method)
@geindex symmetric_difference() (set method)
@anchor{library/stdtypes frozenset symmetric_difference}@anchor{26e3}
@deffn {Method} frozenset.symmetric_difference (other, /)
@anchor{library/stdtypes set symmetric_difference}@anchor{26e4}
@deffnx {Method} set.symmetric_difference (other, /)
@end deffn


@deffn {Describe} set ^ other

Return a new set with elements in either the set or `other' but not both.
@end deffn

@geindex copy() (frozenset method)
@geindex copy() (set method)
@anchor{library/stdtypes frozenset copy}@anchor{26e5}
@deffn {Method} frozenset.copy ()
@anchor{library/stdtypes set copy}@anchor{26e6}
@deffnx {Method} set.copy ()

Return a shallow copy of the set.
@end deffn

Note, the non-operator versions of @ref{168f,,union()},
@ref{1690,,intersection()}, @ref{26e1,,difference()}, @ref{26e3,,symmetric_difference()}, @ref{26dd,,issubset()}, and
@ref{26df,,issuperset()} methods will accept any iterable as an argument.  In
contrast, their operator based counterparts require their arguments to be
sets.  This precludes error-prone constructions like @code{set('abc') & 'cbs'}
in favor of the more readable @code{set('abc').intersection('cbs')}.

Both @ref{185,,set} and @ref{7f3,,frozenset} support set to set comparisons. Two
sets are equal if and only if every element of each set is contained in the
other (each is a subset of the other). A set is less than another set if and
only if the first set is a proper subset of the second set (is a subset, but
is not equal). A set is greater than another set if and only if the first set
is a proper superset of the second set (is a superset, but is not equal).

Instances of @ref{185,,set} are compared to instances of @ref{7f3,,frozenset}
based on their members.  For example, @code{set('abc') == frozenset('abc')}
returns @code{True} and so does @code{set('abc') in set([frozenset('abc')])}.

The subset and equality comparisons do not generalize to a total ordering
function.  For example, any two nonempty disjoint sets are not equal and are not
subsets of each other, so `all' of the following return @code{False}: @code{a<b},
@code{a==b}, or @code{a>b}.

Since sets only define partial ordering (subset relationships), the output of
the @ref{dce,,list.sort()} method is undefined for lists of sets.

Set elements, like dictionary keys, must be @ref{825,,hashable}.

Binary operations that mix @ref{185,,set} instances with @ref{7f3,,frozenset}
return the type of the first operand.  For example: @code{frozenset('ab') |
set('bc')} returns an instance of @code{frozenset}.

The following table lists operations available for @ref{185,,set} that do not
apply to immutable instances of @ref{7f3,,frozenset}:

@geindex update() (set method)
@anchor{library/stdtypes set update}@anchor{26e7}
@deffn {Method} set.update (*others)
@end deffn


@deffn {Describe} set |= other | ...

Update the set, adding elements from all others.
@end deffn

@geindex intersection_update() (set method)
@anchor{library/stdtypes set intersection_update}@anchor{1691}
@deffn {Method} set.intersection_update (*others)
@end deffn


@deffn {Describe} set &= other & ...

Update the set, keeping only elements found in it and all others.
@end deffn

@geindex difference_update() (set method)
@anchor{library/stdtypes set difference_update}@anchor{26e8}
@deffn {Method} set.difference_update (*others)
@end deffn


@deffn {Describe} set @w{-}= other | ...

Update the set, removing elements found in others.
@end deffn

@geindex symmetric_difference_update() (set method)
@anchor{library/stdtypes set symmetric_difference_update}@anchor{1692}
@deffn {Method} set.symmetric_difference_update (other, /)
@end deffn


@deffn {Describe} set ^= other

Update the set, keeping only elements found in either set, but not in both.
@end deffn

@geindex add() (set method)
@anchor{library/stdtypes set add}@anchor{2382}
@deffn {Method} set.add (elem, /)

Add element `elem' to the set.
@end deffn

@geindex remove() (set method)
@anchor{library/stdtypes set remove}@anchor{26da}
@deffn {Method} set.remove (elem, /)

Remove element `elem' from the set.  Raises @ref{5e7,,KeyError} if `elem' is
not contained in the set.
@end deffn

@geindex discard() (set method)
@anchor{library/stdtypes set discard}@anchor{26e9}
@deffn {Method} set.discard (elem, /)

Remove element `elem' from the set if it is present.
@end deffn

@geindex pop() (set method)
@anchor{library/stdtypes set pop}@anchor{26ea}
@deffn {Method} set.pop ()

Remove and return an arbitrary element from the set.  Raises
@ref{5e7,,KeyError} if the set is empty.
@end deffn

@geindex clear() (set method)
@anchor{library/stdtypes set clear}@anchor{26eb}
@deffn {Method} set.clear ()

Remove all elements from the set.
@end deffn

Note, the non-operator versions of the @ref{26e7,,update()},
@ref{1691,,intersection_update()}, @ref{26e8,,difference_update()}, and
@ref{1692,,symmetric_difference_update()} methods will accept any iterable as an
argument.

Note, the `elem' argument to the @ref{15c5,,__contains__()},
@ref{26da,,remove()}, and
@ref{26e9,,discard()} methods may be a set.  To support searching for an equivalent
frozenset, a temporary one is created from `elem'.


@subsubheading See also


For detailed information on thread-safety guarantees for @ref{185,,set}
objects, see @ref{26ec,,Thread safety for set objects}.

Sets and frozensets are @ref{2410,,generic} over the type of their elements.


@node Mapping Types — dict,Context Manager Types,Set Types — set frozenset,Built-in Types
@anchor{library/stdtypes mapping-types-dict}@anchor{26ed}@anchor{library/stdtypes typesmapping}@anchor{cc3}
@subsection Mapping Types — @code{dict}


@geindex object; mapping
@geindex object; dictionary
@geindex operations on; mapping; types
@geindex operations on; dictionary; type
@geindex statement; del
@geindex built-in function; len

A @ref{13c7,,mapping} object maps @ref{825,,hashable} values to arbitrary objects.
Mappings are mutable objects.  There is currently only one standard mapping
type, the `dictionary'.  (For other containers see the built-in
@ref{24f,,list}, @ref{185,,set}, and @ref{614,,tuple} classes, and the
@ref{1e,,collections} module.)

A dictionary’s keys are `almost' arbitrary values.  Values that are not
@ref{825,,hashable}, that is, values containing lists, dictionaries or other
mutable types (that are compared by value rather than by object identity) may
not be used as keys.
Values that compare equal (such as @code{1}, @code{1.0}, and @code{True})
can be used interchangeably to index the same dictionary entry.

@geindex dict (built-in class)
@anchor{library/stdtypes dict}@anchor{184}
@deffn {Class} dict (**kwargs)

@deffnx {Class} dict (mapping, /, **kwargs)

@deffnx {Class} dict (iterable, /, **kwargs)

Return a new dictionary initialized from an optional positional argument
and a possibly empty set of keyword arguments.

Dictionaries can be created by several means:


@itemize *

@item 
Use a comma-separated list of @code{key: value} pairs within braces:
@code{@{'jack': 4098, 'sjoerd': 4127@}} or @code{@{4098: 'jack', 4127: 'sjoerd'@}}

@item 
Use a dict comprehension: @code{@{@}}, @code{@{x: x ** 2 for x in range(10)@}}

@item 
Use the type constructor: @code{dict()},
@code{dict([('foo', 100), ('bar', 200)])}, @code{dict(foo=100, bar=200)}
@end itemize

If no positional argument is given, an empty dictionary is created.
If a positional argument is given and it defines a @code{keys()} method, a
dictionary is created by calling @ref{588,,__getitem__()} on the argument with
each returned key from the method.  Otherwise, the positional argument must be an
@ref{1433,,iterable} object.  Each item in the iterable must itself be an iterable
with exactly two elements.  The first element of each item becomes a key in the
new dictionary, and the second element the corresponding value.  If a key occurs
more than once, the last value for that key becomes the corresponding value in
the new dictionary.

If keyword arguments are given, the keyword arguments and their values are
added to the dictionary created from the positional argument.  If a key
being added is already present, the value from the keyword argument
replaces the value from the positional argument.

Dictionaries compare equal if and only if they have the same @code{(key,
value)} pairs (regardless of ordering). Order comparisons (‘<’, ‘<=’, ‘>=’, ‘>’) raise
@ref{199,,TypeError}.  To illustrate dictionary creation and equality,
the following examples all return a dictionary equal to
@code{@{"one": 1, "two": 2, "three": 3@}}:

@example
>>> a = dict(one=1, two=2, three=3)
>>> b = @{'one': 1, 'two': 2, 'three': 3@}
>>> c = dict(zip(['one', 'two', 'three'], [1, 2, 3]))
>>> d = dict([('two', 2), ('one', 1), ('three', 3)])
>>> e = dict(@{'three': 3, 'one': 1, 'two': 2@})
>>> f = dict(@{'one': 1, 'three': 3@}, two=2)
>>> a == b == c == d == e == f
True
@end example

Providing keyword arguments as in the first example only works for keys that
are valid Python identifiers.  Otherwise, any valid keys can be used.

Dictionaries preserve insertion order.  Note that updating a key does not
affect the order.  Keys added after deletion are inserted at the end.

@example
>>> d = @{"one": 1, "two": 2, "three": 3, "four": 4@}
>>> d
@{'one': 1, 'two': 2, 'three': 3, 'four': 4@}
>>> list(d)
['one', 'two', 'three', 'four']
>>> list(d.values())
[1, 2, 3, 4]
>>> d["one"] = 42
>>> d
@{'one': 42, 'two': 2, 'three': 3, 'four': 4@}
>>> del d["two"]
>>> d["two"] = None
>>> d
@{'one': 42, 'three': 3, 'four': 4, 'two': None@}
@end example


Changed in version 3.7: Dictionary order is guaranteed to be insertion order.  This behavior was
an implementation detail of CPython from 3.6.


Dictionaries are @ref{2410,,generic} over two types, signifying
(respectively) the types of the dictionary’s keys and values.

These are the operations that dictionaries support (and therefore, custom
mapping types should support too):


@deffn {Describe} list(d)

Return a list of all the keys used in the dictionary `d'.
@end deffn


@deffn {Describe} len(d)

Return the number of items in the dictionary `d'.
@end deffn


@deffn {Describe} d[key]

Return the item of `d' with key `key'.  Raises a @ref{5e7,,KeyError} if `key' is
not in the map.

@geindex __missing__()

If a subclass of dict defines a method @ref{13c9,,__missing__()} and `key'
is not present, the @code{d[key]} operation calls that method with the key `key'
as argument.  The @code{d[key]} operation then returns or raises whatever is
returned or raised by the @code{__missing__(key)} call.
No other operations or methods invoke @code{__missing__()}. If
@code{__missing__()} is not defined, @ref{5e7,,KeyError} is raised.
@code{__missing__()} must be a method; it cannot be an instance variable:

@example
>>> class Counter(dict):
...     def __missing__(self, key):
...         return 0
...
>>> c = Counter()
>>> c['red']
0
>>> c['red'] += 1
>>> c['red']
1
@end example

The example above shows part of the implementation of
@ref{129d,,collections.Counter}.
A different @code{__missing__()} method is used
by @ref{13c8,,collections.defaultdict}.
@end deffn


@deffn {Describe} d[key] = value

Set @code{d[key]} to `value'.
@end deffn


@deffn {Describe} del d[key]

Remove @code{d[key]} from `d'.  Raises a @ref{5e7,,KeyError} if `key' is not in the
map.
@end deffn


@deffn {Describe} key in d

Return @code{True} if `d' has a key `key', else @code{False}.
@end deffn


@deffn {Describe} key not in d

Equivalent to @code{not key in d}.
@end deffn


@deffn {Describe} iter(d)

Return an iterator over the keys of the dictionary.  This is a shortcut
for @code{iter(d.keys())}.
@end deffn

@geindex clear() (dict method)
@anchor{library/stdtypes dict clear}@anchor{17ab}
@deffn {Method} clear ()

Remove all items from the dictionary.
@end deffn

@geindex copy() (dict method)
@anchor{library/stdtypes dict copy}@anchor{dcf}
@deffn {Method} copy ()

Return a shallow copy of the dictionary.
@end deffn

@geindex fromkeys() (dict class method)
@anchor{library/stdtypes dict fromkeys}@anchor{250}
@deffn {Method} classmethod fromkeys (iterable, value=None, /)

Create a new dictionary with keys from `iterable' and values set to `value'.

@code{fromkeys()} is a class method that returns a new dictionary. `value'
defaults to @code{None}.  All of the values refer to just a single instance,
so it generally doesn’t make sense for `value' to be a mutable object
such as an empty list.  To get distinct values, use a @ref{f85,,dict comprehension} instead.
@end deffn

@geindex get() (dict method)
@anchor{library/stdtypes dict get}@anchor{2078}
@deffn {Method} get (key, default=None, /)

Return the value for `key' if `key' is in the dictionary, else `default'.
If `default' is not given, it defaults to @code{None}, so that this method
never raises a @ref{5e7,,KeyError}.
@end deffn

@geindex items() (dict method)
@anchor{library/stdtypes dict items}@anchor{9d8}
@deffn {Method} items ()

Return a new view of the dictionary’s items (@code{(key, value)} pairs).
See the @ref{26ee,,documentation of view objects}.
@end deffn

@geindex keys() (dict method)
@anchor{library/stdtypes dict keys}@anchor{9d6}
@deffn {Method} keys ()

Return a new view of the dictionary’s keys.  See the @ref{26ee,,documentation of view objects}.
@end deffn

@geindex pop() (dict method)
@anchor{library/stdtypes dict pop}@anchor{5e6}
@deffn {Method} pop (key, /)

@deffnx {Method} pop (key, default, /)

If `key' is in the dictionary, remove it and return its value, else return
`default'.  If `default' is not given and `key' is not in the dictionary,
a @ref{5e7,,KeyError} is raised.
@end deffn

@geindex popitem() (dict method)
@anchor{library/stdtypes dict popitem}@anchor{1732}
@deffn {Method} popitem ()

Remove and return a @code{(key, value)} pair from the dictionary.
Pairs are returned in @abbr{LIFO,last-in@comma{} first-out} order.

@code{popitem()} is useful to destructively iterate over a dictionary, as
often used in set algorithms.  If the dictionary is empty, calling
@code{popitem()} raises a @ref{5e7,,KeyError}.


Changed in version 3.7: LIFO order is now guaranteed. In prior versions, @code{popitem()} would
return an arbitrary key/value pair.

@end deffn


@deffn {Describe} reversed(d)

Return a reverse iterator over the keys of the dictionary. This is a
shortcut for @code{reversed(d.keys())}.


Added in version 3.8.

@end deffn

@geindex setdefault() (dict method)
@anchor{library/stdtypes dict setdefault}@anchor{127f}
@deffn {Method} setdefault (key, default=None, /)

If `key' is in the dictionary, return its value.  If not, insert `key'
with a value of `default' and return `default'.  `default' defaults to
@code{None}.
@end deffn

@geindex update() (dict method)
@anchor{library/stdtypes dict update}@anchor{1671}
@deffn {Method} update (**kwargs)

@deffnx {Method} update (mapping, /, **kwargs)

@deffnx {Method} update (iterable, /, **kwargs)

Update the dictionary with the key/value pairs from `mapping' or `iterable' and `kwargs', overwriting
existing keys.  Return @code{None}.

@code{update()} accepts either another object with a @code{keys()} method (in
which case @ref{588,,__getitem__()} is called with every key returned from
the method) or an iterable of key/value pairs (as tuples or other iterables
of length two). If keyword arguments are specified, the dictionary is then
updated with those key/value pairs: @code{d.update(red=1, blue=2)}.
@end deffn

@geindex values() (dict method)
@anchor{library/stdtypes dict values}@anchor{9d7}
@deffn {Method} values ()

Return a new view of the dictionary’s values.  See the
@ref{26ee,,documentation of view objects}.

An equality comparison between one @code{dict.values()} view and another
will always return @code{False}. This also applies when comparing
@code{dict.values()} to itself:

@example
>>> d = @{'a': 1@}
>>> d.values() == d.values()
False
@end example
@end deffn


@deffn {Describe} d | other

Create a new dictionary with the merged keys and values of `d' and
`other', which must both be dictionaries. The values of `other' take
priority when `d' and `other' share keys.


Added in version 3.9.

@end deffn


@deffn {Describe} d |= other

Update the dictionary `d' with keys and values from `other', which may be
either a @ref{13c7,,mapping} or an @ref{1433,,iterable} of key/value pairs. The
values of `other' take priority when `d' and `other' share keys.


Added in version 3.9.

@end deffn

Dictionaries and dictionary views are reversible.

@example
>>> d = @{"one": 1, "two": 2, "three": 3, "four": 4@}
>>> d
@{'one': 1, 'two': 2, 'three': 3, 'four': 4@}
>>> list(reversed(d))
['four', 'three', 'two', 'one']
>>> list(reversed(d.values()))
[4, 3, 2, 1]
>>> list(reversed(d.items()))
[('four', 4), ('three', 3), ('two', 2), ('one', 1)]
@end example


Changed in version 3.8: Dictionaries are now reversible.

@end deffn


@subsubheading See also


@ref{699,,types.MappingProxyType} can be used to create a read-only view
of a @ref{184,,dict}.



@subsubheading See also


For detailed information on thread-safety guarantees for @ref{184,,dict}
objects, see @ref{26ef,,Thread safety for dict objects}.


@menu
* Dictionary view objects:: 

@end menu

@node Dictionary view objects,,,Mapping Types — dict
@anchor{library/stdtypes dict-views}@anchor{26ee}@anchor{library/stdtypes dictionary-view-objects}@anchor{26f0}
@subsubsection Dictionary view objects


The objects returned by @ref{9d6,,dict.keys()}, @ref{9d7,,dict.values()} and
@ref{9d8,,dict.items()} are `view objects'.  They provide a dynamic view on the
dictionary’s entries, which means that when the dictionary changes, the view
reflects these changes.

Dictionary views can be iterated over to yield their respective data, and
support membership tests:


@deffn {Describe} len(dictview)

Return the number of entries in the dictionary.
@end deffn


@deffn {Describe} iter(dictview)

Return an iterator over the keys, values or items (represented as tuples of
@code{(key, value)}) in the dictionary.

Keys and values are iterated over in insertion order.
This allows the creation of @code{(value, key)} pairs
using @ref{1a1,,zip()}: @code{pairs = zip(d.values(), d.keys())}.  Another way to
create the same list is @code{pairs = [(v, k) for (k, v) in d.items()]}.

Iterating views while adding or deleting entries in the dictionary may raise
a @ref{246,,RuntimeError} or fail to iterate over all entries.


Changed in version 3.7: Dictionary order is guaranteed to be insertion order.

@end deffn


@deffn {Describe} x in dictview

Return @code{True} if `x' is in the underlying dictionary’s keys, values or
items (in the latter case, `x' should be a @code{(key, value)} tuple).
@end deffn


@deffn {Describe} reversed(dictview)

Return a reverse iterator over the keys, values or items of the dictionary.
The view will be iterated in reverse order of the insertion.


Changed in version 3.8: Dictionary views are now reversible.

@end deffn


@deffn {Describe} dictview.mapping

Return a @ref{699,,types.MappingProxyType} that wraps the original
dictionary to which the view refers.


Added in version 3.10.

@end deffn

Keys views are set-like since their entries are unique and @ref{825,,hashable}.
Items views also have set-like operations since the (key, value) pairs
are unique and the keys are hashable.
If all values in an items view are hashable as well,
then the items view can interoperate with other sets.
(Values views are not treated as set-like
since the entries are generally not unique.)  For set-like views, all of the
operations defined for the abstract base class @ref{26f1,,collections.abc.Set} are
available (for example, @code{==}, @code{<}, or @code{^}).  While using set operators,
set-like views accept any iterable as the other operand,
unlike sets which only accept sets as the input.

An example of dictionary view usage:

@example
>>> dishes = @{'eggs': 2, 'sausage': 1, 'bacon': 1, 'spam': 500@}
>>> keys = dishes.keys()
>>> values = dishes.values()

>>> # iteration
>>> n = 0
>>> for val in values:
...     n += val
...
>>> print(n)
504

>>> # keys and values are iterated over in the same order (insertion order)
>>> list(keys)
['eggs', 'sausage', 'bacon', 'spam']
>>> list(values)
[2, 1, 1, 500]

>>> # view objects are dynamic and reflect dict changes
>>> del dishes['eggs']
>>> del dishes['sausage']
>>> list(keys)
['bacon', 'spam']

>>> # set operations
>>> keys & @{'eggs', 'bacon', 'salad'@}
@{'bacon'@}
>>> keys ^ @{'sausage', 'juice'@} == @{'juice', 'sausage', 'bacon', 'spam'@}
True
>>> keys | ['juice', 'juice', 'juice'] == @{'bacon', 'spam', 'juice'@}
True

>>> # get back a read-only proxy for the original dictionary
>>> values.mapping
mappingproxy(@{'bacon': 1, 'spam': 500@})
>>> values.mapping['spam']
500
@end example

@node Context Manager Types,Type Annotation Types — Generic Alias Union,Mapping Types — dict,Built-in Types
@anchor{library/stdtypes context-manager-types}@anchor{26f2}@anchor{library/stdtypes typecontextmanager}@anchor{2453}
@subsection Context Manager Types


@geindex context manager
@geindex context management protocol
@geindex protocol; context management

Python’s @ref{187,,with} statement supports the concept of a runtime context
defined by a context manager.  This is implemented using a pair of methods
that allow user-defined classes to define a runtime context that is entered
before the statement body is executed and exited when the statement ends:

@geindex __enter__() (contextmanager method)
@anchor{library/stdtypes contextmanager __enter__}@anchor{26f3}
@deffn {Method} contextmanager.__enter__ ()

Enter the runtime context and return either this object or another object
related to the runtime context. The value returned by this method is bound to
the identifier in the @code{as} clause of @ref{187,,with} statements using
this context manager.

An example of a context manager that returns itself is a @ref{13cf,,file object}.
File objects return themselves from __enter__() to allow @ref{318,,open()} to be
used as the context expression in a @ref{187,,with} statement.

An example of a context manager that returns a related object is the one
returned by @ref{1592,,decimal.localcontext()}. These managers set the active
decimal context to a copy of the original decimal context and then return the
copy. This allows changes to be made to the current decimal context in the body
of the @ref{187,,with} statement without affecting code outside the
@code{with} statement.
@end deffn

@geindex __exit__() (contextmanager method)
@anchor{library/stdtypes contextmanager __exit__}@anchor{26f4}
@deffn {Method} contextmanager.__exit__ (exc_type, exc_val, exc_tb)

Exit the runtime context and return a Boolean flag indicating if any exception
that occurred should be suppressed. If an exception occurred while executing the
body of the @ref{187,,with} statement, the arguments contain the exception type,
value and traceback information. Otherwise, all three arguments are @code{None}.

Returning a true value from this method will cause the @ref{187,,with} statement
to suppress the exception and continue execution with the statement immediately
following the @code{with} statement. Otherwise the exception continues
propagating after this method has finished executing.

If this method raises an exception while handling an earlier exception from the
@ref{187,,with} block, the new exception is raised, and the original exception
is stored in its @ref{14d3,,__context__} attribute.

The exception passed in should never be reraised explicitly - instead, this
method should return a false value to indicate that the method completed
successfully and does not want to suppress the raised exception. This allows
context management code to easily detect whether or not an @ref{150c,,__exit__()}
method has actually failed.
@end deffn

Python defines several context managers to support easy thread synchronisation,
prompt closure of files or other objects, and simpler manipulation of the active
decimal arithmetic context. The specific types are not treated specially beyond
their implementation of the context management protocol. See the
@ref{27,,contextlib} module for some examples.

Python’s @ref{1267,,generator}s and the @ref{140e,,contextlib.contextmanager} decorator
provide a convenient way to implement these protocols.  If a generator function is
decorated with the @code{contextlib.contextmanager} decorator, it will return a
context manager implementing the necessary @ref{26f3,,__enter__()} and
@ref{26f4,,__exit__()} methods, rather than the iterator produced by an
undecorated generator function.

Note that there is no specific slot for any of these methods in the type
structure for Python objects in the Python/C API. Extension types wanting to
define these methods must provide them as a normal Python accessible method.
Compared to the overhead of setting up the runtime context, the overhead of a
single class dictionary lookup is negligible.

@node Type Annotation Types — Generic Alias Union,Other Built-in Types,Context Manager Types,Built-in Types
@anchor{library/stdtypes type-annotation-types-generic-alias-union}@anchor{26f5}
@subsection Type Annotation Types — Generic Alias, Union


@geindex annotation; type annotation; type hint

The core built-in types for @ref{15d,,type annotations} are
@ref{8c3,,Generic Alias} and @ref{9cb,,Union}.

@menu
* Generic Alias Type:: 
* Union Type:: 

@end menu

@node Generic Alias Type,Union Type,,Type Annotation Types — Generic Alias Union
@anchor{library/stdtypes generic-alias-type}@anchor{26f6}@anchor{library/stdtypes types-genericalias}@anchor{8c3}
@subsubsection Generic Alias Type


@geindex object; GenericAlias
@geindex Generic; Alias

@code{GenericAlias} objects are generally created by
@ref{2415,,subscripting} a class. They are most often used with
@ref{241b,,container classes}, such as @ref{24f,,list} or
@ref{184,,dict}. For example, @code{list[int]} is a @code{GenericAlias} object created
by subscripting the @code{list} class with the argument @ref{19c,,int}.
@code{GenericAlias} objects are intended primarily for use with
@ref{15d,,type annotations}.

@cartouche
@quotation Note 
It is generally only possible to subscript a class if the class implements
the special method @ref{948,,__class_getitem__()}.
@end quotation
@end cartouche

A @code{GenericAlias} object acts as a proxy for a @ref{1a2,,generic type},
implementing `parameterized generics'.

For a container class, the
argument(s) supplied to a @ref{2415,,subscription} of the class may
indicate the type(s) of the elements an object contains. For example,
@code{set[bytes]} can be used in type annotations to signify a @ref{185,,set} in
which all the elements are of type @ref{193,,bytes}.

For a class which defines @ref{948,,__class_getitem__()} but is not a
container, the argument(s) supplied to a subscription of the class will often
indicate the return type(s) of one or more methods defined on an object. For
example, @ref{be,,regular expressions} can be used on both the @ref{16a,,str} data
type and the @ref{193,,bytes} data type:


@itemize *

@item 
If @code{x = re.search('foo', 'foo')}, @code{x} will be a
@ref{118e,,re.Match} object where the return values of
@code{x.group(0)} and @code{x[0]} will both be of type @ref{16a,,str}. We can
represent this kind of object in type annotations with the @code{GenericAlias}
@code{re.Match[str]}.

@item 
If @code{y = re.search(b'bar', b'bar')}, (note the @code{b} for @ref{193,,bytes}),
@code{y} will also be an instance of @code{re.Match}, but the return
values of @code{y.group(0)} and @code{y[0]} will both be of type
@code{bytes}. In type annotations, we would represent this
variety of @ref{118e,,re.Match} objects with @code{re.Match[bytes]}.
@end itemize

@code{GenericAlias} objects are instances of the class
@ref{9f2,,types.GenericAlias}, which can also be used to create @code{GenericAlias}
objects directly. Specializations of user-defined @ref{682,,generic classes}
may not be instances of @code{types.GenericAlias}, but they provide similar functionality.


@deffn {Describe} T[X, Y, ...]

Creates a @code{GenericAlias} representing a type @code{T} parameterized by types
`X', `Y', and more depending on the @code{T} used.
For example, a function expecting a @ref{24f,,list} containing
@ref{197,,float} elements:

@example
def average(values: list[float]) -> float:
    return sum(values) / len(values)
@end example

Another example for @ref{13c7,,mapping} objects, using a @ref{184,,dict}, which
is a generic type expecting two type parameters representing the key type
and the value type.  In this example, the function expects a @code{dict} with
keys of type @ref{16a,,str} and values of type @ref{19c,,int}:

@example
def send_post_request(url: str, body: dict[str, int]) -> None:
    ...
@end example
@end deffn

The builtin functions @ref{2af,,isinstance()} and @ref{9ca,,issubclass()} do not accept
@code{GenericAlias} types for their second argument:

@example
>>> isinstance([1, 2], list[str])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: isinstance() argument 2 cannot be a parameterized generic
@end example

The Python runtime does not enforce @ref{15d,,type annotations}.
This extends to generic types and their type parameters. When creating
a container object from a @code{GenericAlias}, the elements in the container are not checked
against their type. For example, the following code is discouraged, but will
run without errors:

@example
>>> t = list[str]
>>> t([1, 2, 3])
[1, 2, 3]
@end example

Furthermore, parameterized generics erase type parameters during object
creation:

@example
>>> t = list[str]
>>> type(t)
<class 'types.GenericAlias'>

>>> l = t()
>>> type(l)
<class 'list'>
@end example

Instances of @code{GenericAlias} are not classes at runtime, even though they behave like classes (they can be instantiated and subclassed):

@example
>>> import inspect
>>> inspect.isclass(list[int])
False
@end example

This is true for @ref{6f7,,user-defined generics} also.

Calling @ref{1c3,,repr()} or @ref{16a,,str()} on a generic shows the parameterized type:

@example
>>> repr(list[int])
'list[int]'

>>> str(list[int])
'list[int]'
@end example

The @ref{588,,__getitem__()} method of generic containers will raise an
exception to disallow mistakes like @code{dict[str][str]}:

@example
>>> dict[str][str]
Traceback (most recent call last):
  ...
TypeError: dict[str] is not a generic class
@end example

However, such expressions are valid when @ref{2410,,type variables} are
used.  The index must have as many elements as there are type variable items
in the @code{GenericAlias} object’s @ref{26f7,,__args__}.

@example
>>> from typing import TypeVar
>>> Y = TypeVar('Y')
>>> dict[str, Y][int]
dict[str, int]
@end example

@menu
* Standard Generic Classes:: 
* Special Attributes of GenericAlias objects:: 

@end menu

@node Standard Generic Classes,Special Attributes of GenericAlias objects,,Generic Alias Type
@anchor{library/stdtypes standard-generic-classes}@anchor{26f8}
@subsubsection Standard Generic Classes


The following standard library classes support parameterized generics. This
list is non-exhaustive.


@itemize *

@item 
@ref{614,,tuple}

@item 
@ref{24f,,list}

@item 
@ref{184,,dict}

@item 
@ref{185,,set}

@item 
@ref{7f3,,frozenset}

@item 
@ref{f4a,,type}

@item 
@ref{dcc,,asyncio.Future}

@item 
@ref{1c9,,asyncio.Task}

@item 
@ref{7f5,,collections.deque}

@item 
@ref{13c8,,collections.defaultdict}

@item 
@ref{7f4,,collections.OrderedDict}

@item 
@ref{129d,,collections.Counter}

@item 
@ref{e1c,,collections.ChainMap}

@item 
@ref{fe2,,collections.abc.Awaitable}

@item 
@ref{fe3,,collections.abc.Coroutine}

@item 
@ref{fe5,,collections.abc.AsyncIterable}

@item 
@ref{fe4,,collections.abc.AsyncIterator}

@item 
@ref{e8d,,collections.abc.AsyncGenerator}

@item 
@ref{26f9,,collections.abc.Iterable}

@item 
@ref{26fa,,collections.abc.Iterator}

@item 
@ref{fe1,,collections.abc.Generator}

@item 
@ref{e8b,,collections.abc.Reversible}

@item 
@ref{26fb,,collections.abc.Container}

@item 
@ref{e8a,,collections.abc.Collection}

@item 
@ref{9f1,,collections.abc.Callable}

@item 
@ref{26f1,,collections.abc.Set}

@item 
@ref{26fc,,collections.abc.MutableSet}

@item 
@ref{acd,,collections.abc.Mapping}

@item 
@ref{12b8,,collections.abc.MutableMapping}

@item 
@ref{13d0,,collections.abc.Sequence}

@item 
@ref{4c0,,collections.abc.MutableSequence}

@item 
@ref{340,,collections.abc.ByteString}

@item 
@ref{26fd,,collections.abc.MappingView}

@item 
@ref{26fe,,collections.abc.KeysView}

@item 
@ref{26ff,,collections.abc.ItemsView}

@item 
@ref{2700,,collections.abc.ValuesView}

@item 
@ref{e90,,contextlib.AbstractContextManager}

@item 
@ref{d26,,contextlib.AbstractAsyncContextManager}

@item 
@ref{199f,,dataclasses.Field}

@item 
@ref{764,,functools.cached_property}

@item 
@ref{21a,,functools.partialmethod}

@item 
@ref{e51,,os.PathLike}

@item 
@ref{2701,,queue.LifoQueue}

@item 
@ref{15a0,,queue.Queue}

@item 
@ref{2702,,queue.PriorityQueue}

@item 
@ref{d67,,queue.SimpleQueue}

@item 
@ref{118d,,re.Pattern}

@item 
@ref{118e,,re.Match}

@item 
@ref{2703,,shelve.BsdDbShelf}

@item 
@ref{2704,,shelve.DbfilenameShelf}

@item 
@ref{11a1,,shelve.Shelf}

@item 
@ref{699,,types.MappingProxyType}

@item 
@ref{196d,,weakref.WeakKeyDictionary}

@item 
@ref{11f5,,weakref.WeakMethod}

@item 
@ref{7f6,,weakref.WeakSet}

@item 
@ref{196e,,weakref.WeakValueDictionary}
@end itemize

@node Special Attributes of GenericAlias objects,,Standard Generic Classes,Generic Alias Type
@anchor{library/stdtypes special-attributes-of-genericalias-objects}@anchor{2705}
@subsubsection Special Attributes of @code{GenericAlias} objects


All parameterized generics implement special read-only attributes.

@geindex __origin__ (genericalias attribute)
@anchor{library/stdtypes genericalias __origin__}@anchor{2706}
@deffn {Attribute} genericalias.__origin__

This attribute points at the non-parameterized generic class:

@example
>>> list[int].__origin__
<class 'list'>
@end example
@end deffn

@geindex __args__ (genericalias attribute)
@anchor{library/stdtypes genericalias __args__}@anchor{26f7}
@deffn {Attribute} genericalias.__args__

This attribute is a @ref{614,,tuple} (possibly of length 1) of generic
types passed to the original @ref{948,,__class_getitem__()} of the
generic class:

@example
>>> dict[str, list[int]].__args__
(<class 'str'>, list[int])
@end example
@end deffn

@geindex __parameters__ (genericalias attribute)
@anchor{library/stdtypes genericalias __parameters__}@anchor{2707}
@deffn {Attribute} genericalias.__parameters__

This attribute is a lazily computed tuple (possibly empty) of unique type
variables found in @code{__args__}:

@example
>>> from typing import TypeVar

>>> T = TypeVar('T')
>>> list[T].__parameters__
(~T,)
@end example

@cartouche
@quotation Note 
A @code{GenericAlias} object with @ref{488,,typing.ParamSpec} parameters may not
have correct @code{__parameters__} after substitution because
@code{typing.ParamSpec} is intended primarily for static type checking.
@end quotation
@end cartouche
@end deffn

@geindex __unpacked__ (genericalias attribute)
@anchor{library/stdtypes genericalias __unpacked__}@anchor{2708}
@deffn {Attribute} genericalias.__unpacked__

A boolean that is true if the alias has been unpacked using the
@code{*} operator (see @ref{489,,TypeVarTuple}).


Added in version 3.11.

@end deffn


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 484

@item PEP 484@footnote{https://peps.python.org/pep-0484/} - Type Hints

Introducing Python’s framework for type annotations.

@geindex Python Enhancement Proposals; PEP 585

@item PEP 585@footnote{https://peps.python.org/pep-0585/} - Type Hinting Generics In Standard Collections

Introducing the ability to natively parameterize standard-library
classes, provided they implement the special class method
@ref{948,,__class_getitem__()}.

@item @ref{2410,,Generics}, @ref{6f7,,user-defined generics} and @ref{1806,,typing.Generic}

Documentation on how to implement generic classes that can be
parameterized at runtime and understood by static type-checkers.
@end table



Added in version 3.9.


@node Union Type,,Generic Alias Type,Type Annotation Types — Generic Alias Union
@anchor{library/stdtypes types-union}@anchor{9cb}@anchor{library/stdtypes union-type}@anchor{2709}
@subsubsection Union Type


@geindex object; Union
@geindex union; type

A union object holds the value of the @code{|} (bitwise or) operation on
multiple @ref{2628,,type objects}.  These types are intended
primarily for @ref{15d,,type annotations}. The union type expression
enables cleaner type hinting syntax compared to subscripting @ref{2aa,,typing.Union}.


@deffn {Describe} X | Y | ...

Defines a union object which holds types `X', `Y', and so forth. @code{X | Y}
means either X or Y.  It is equivalent to @code{typing.Union[X, Y]}.
For example, the following function expects an argument of type
@ref{19c,,int} or @ref{197,,float}:

@example
def square(number: int | float) -> int | float:
    return number ** 2
@end example

@cartouche
@quotation Note 
The @code{|} operand cannot be used at runtime to define unions where one or
more members is a forward reference. For example, @code{int | "Foo"}, where
@code{"Foo"} is a reference to a class not yet defined, will fail at
runtime. For unions which include forward references, present the
whole expression as a string, e.g. @code{"int | Foo"}.
@end quotation
@end cartouche
@end deffn


@deffn {Describe} union_object == other

Union objects can be tested for equality with other union objects.  Details:


@itemize *

@item 
Unions of unions are flattened:

@example
(int | str) | float == int | str | float
@end example

@item 
Redundant types are removed:

@example
int | str | int == int | str
@end example

@item 
When comparing unions, the order is ignored:

@example
int | str == str | int
@end example

@item 
It creates instances of @ref{2aa,,typing.Union}:

@example
int | str == typing.Union[int, str]
type(int | str) is typing.Union
@end example

@item 
Optional types can be spelled as a union with @code{None}:

@example
str | None == typing.Optional[str]
@end example
@end itemize
@end deffn


@deffn {Describe} isinstance(obj, union_object)
@end deffn


@deffn {Describe} issubclass(obj, union_object)

Calls to @ref{2af,,isinstance()} and @ref{9ca,,issubclass()} are also supported with a
union object:

@example
>>> isinstance("", int | str)
True
@end example

However, @ref{8c3,,parameterized generics} in
union objects cannot be checked:

@example
>>> isinstance(1, int | list[int])  # short-circuit evaluation
True
>>> isinstance([1], int | list[int])
Traceback (most recent call last):
  ...
TypeError: isinstance() argument 2 cannot be a parameterized generic
@end example
@end deffn

The user-exposed type for the union object can be accessed from
@ref{2aa,,typing.Union} and used for @ref{2af,,isinstance()} checks:

@example
>>> import typing
>>> isinstance(int | str, typing.Union)
True
>>> typing.Union()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cannot create 'typing.Union' instances
@end example

@cartouche
@quotation Note 
The @code{__or__()} method for type objects was added to support the syntax
@code{X | Y}.  If a metaclass implements @code{__or__()}, the Union may
override it:

@example
>>> class M(type):
...     def __or__(self, other):
...         return "Hello"
...
>>> class C(metaclass=M):
...     pass
...
>>> C | int
'Hello'
>>> int | C
int | C
@end example
@end quotation
@end cartouche


@subsubheading See also


@geindex Python Enhancement Proposals; PEP 604
PEP 604@footnote{https://peps.python.org/pep-0604/} – PEP proposing the @code{X | Y} syntax and the Union type.



Added in version 3.10.



Changed in version 3.14: Union objects are now instances of @ref{2aa,,typing.Union}. Previously, they were instances
of @ref{2a9,,types.UnionType}, which remains an alias for @code{typing.Union}.


@node Other Built-in Types,Special Attributes,Type Annotation Types — Generic Alias Union,Built-in Types
@anchor{library/stdtypes other-built-in-types}@anchor{270a}@anchor{library/stdtypes typesother}@anchor{270b}
@subsection Other Built-in Types


The interpreter supports several other kinds of objects. Most of these support
only one or two operations.

@menu
* Modules: Modules<4>. 
* Classes and Class Instances:: 
* Functions:: 
* Methods:: 
* Code Objects:: 
* Type Objects:: 
* The Null Object:: 
* The Ellipsis Object:: 
* The NotImplemented Object:: 
* Internal Objects:: 

@end menu

@node Modules<4>,Classes and Class Instances,,Other Built-in Types
@anchor{library/stdtypes modules}@anchor{270c}@anchor{library/stdtypes typesmodules}@anchor{270d}
@subsubsection Modules


The only special operation on a module is attribute access: @code{m.name}, where
`m' is a module and `name' accesses a name defined in `m'’s symbol table.
Module attributes can be assigned to.  (Note that the @ref{7f9,,import}
statement is not, strictly speaking, an operation on a module object; @code{import
foo} does not require a module object named `foo' to exist, rather it requires
an (external) `definition' for a module named `foo' somewhere.)

A special attribute of every module is @ref{77e,,__dict__}. This is the
dictionary containing the module’s symbol table. Modifying this dictionary will
actually change the module’s symbol table, but direct assignment to the
@code{__dict__} attribute is not possible (you can write
@code{m.__dict__['a'] = 1}, which defines @code{m.a} to be @code{1}, but you can’t write
@code{m.__dict__ = @{@}}).  Modifying @code{__dict__} directly is
not recommended.

Modules built into the interpreter are written like this: @code{<module 'sys'
(built-in)>}.  If loaded from a file, they are written as @code{<module 'os' from
'/usr/local/lib/pythonX.Y/os.pyc'>}.

@node Classes and Class Instances,Functions,Modules<4>,Other Built-in Types
@anchor{library/stdtypes classes-and-class-instances}@anchor{270e}@anchor{library/stdtypes typesobjects}@anchor{270f}
@subsubsection Classes and Class Instances


See @ref{2370,,Objects@comma{} values and types} and @ref{14e3,,Class definitions} for these.

@node Functions,Methods,Classes and Class Instances,Other Built-in Types
@anchor{library/stdtypes functions}@anchor{2710}@anchor{library/stdtypes typesfunctions}@anchor{2711}
@subsubsection Functions


Function objects are created by function definitions.  The only operation on a
function object is to call it: @code{func(argument-list)}.

There are really two flavors of function objects: built-in functions and
user-defined functions.  Both support the same operation (to call the function),
but the implementation is different, hence the different object types.

See @ref{205c,,Function definitions} for more information.

@node Methods,Code Objects,Functions,Other Built-in Types
@anchor{library/stdtypes methods}@anchor{2712}@anchor{library/stdtypes typesmethods}@anchor{2713}
@subsubsection Methods


@geindex object; method

Methods are functions that are called using the attribute notation.
There are two flavors: @ref{239e,,built-in methods}
(such as @ref{8de,,append()} on lists)
and @ref{20eb,,class instance method}.
Built-in methods are described with the types that support them.

If you access a method (a function defined in a class namespace) through an
instance, you get a special object: a `bound method' (also called
@ref{20eb,,instance method}) object. When called, it will add
the @code{self} argument
to the argument list.  Bound methods have two special read-only attributes:
@ref{15d4,,m.__self__} is the object on which the method
operates, and @ref{1508,,m.__func__} is
the function implementing the method.  Calling @code{m(arg-1, arg-2, ..., arg-n)}
is completely equivalent to calling @code{m.__func__(m.__self__, arg-1, arg-2, ...,
arg-n)}.

Like @ref{59c,,function objects}, bound method objects support
getting arbitrary
attributes.  However, since method attributes are actually stored on the
underlying function object (@ref{1508,,method.__func__}), setting method attributes on
bound methods is disallowed.  Attempting to set an attribute on a method
results in an @ref{5f0,,AttributeError} being raised.  In order to set a method
attribute, you need to explicitly set it on the underlying function object:

@example
>>> class C:
...     def method(self):
...         pass
...
>>> c = C()
>>> c.method.whoami = 'my name is method'  # can't set on the method
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'method' object has no attribute 'whoami'
>>> c.method.__func__.whoami = 'my name is method'
>>> c.method.whoami
'my name is method'
@end example

See @ref{20eb,,Instance methods} for more information.

@geindex object; code
@geindex code object

@node Code Objects,Type Objects,Methods,Other Built-in Types
@anchor{library/stdtypes bltin-code-objects}@anchor{2714}@anchor{library/stdtypes code-objects}@anchor{2715}
@subsubsection Code Objects


@geindex built-in function; compile
@geindex __code__ (function object attribute)

Code objects are used by the implementation to represent “pseudo-compiled”
executable Python code such as a function body. They differ from function
objects because they don’t contain a reference to their global execution
environment.  Code objects are returned by the built-in @ref{4b2,,compile()} function
and can be extracted from function objects through their
@ref{59d,,__code__} attribute. See also the @ref{1b,,code} module.

Accessing @ref{59d,,__code__} raises an @ref{1cb1,,auditing event}
@code{object.__getattr__} with arguments @code{obj} and @code{"__code__"}.

@geindex built-in function; exec
@geindex built-in function; eval

A code object can be executed or evaluated by passing it (instead of a source
string) to the @ref{4a3,,exec()} or @ref{4a4,,eval()}  built-in functions.

See @ref{2373,,The standard type hierarchy} for more information.

@node Type Objects,The Null Object,Code Objects,Other Built-in Types
@anchor{library/stdtypes bltin-type-objects}@anchor{2628}@anchor{library/stdtypes type-objects}@anchor{2716}
@subsubsection Type Objects


@geindex built-in function; type
@geindex module; types

Type objects represent the various object types.  An object’s type is accessed
by the built-in function @ref{f4a,,type()}.  There are no special operations on
types.  The standard module @ref{10a,,types} defines names for all standard built-in
types.

Types are written like this: @code{<class 'int'>}.

@node The Null Object,The Ellipsis Object,Type Objects,Other Built-in Types
@anchor{library/stdtypes bltin-null-object}@anchor{2717}@anchor{library/stdtypes the-null-object}@anchor{2718}
@subsubsection The Null Object


This object is returned by functions that don’t explicitly return a value.  It
supports no special operations.  There is exactly one null object, named
@code{None} (a built-in name).  @code{type(None)()} produces the same singleton.

It is written as @code{None}.

@geindex ...; ellipsis literal

@node The Ellipsis Object,The NotImplemented Object,The Null Object,Other Built-in Types
@anchor{library/stdtypes bltin-ellipsis-object}@anchor{2040}@anchor{library/stdtypes the-ellipsis-object}@anchor{2719}
@subsubsection The Ellipsis Object


This object is commonly used to indicate that something is omitted.
It supports no special operations.  There is exactly one ellipsis object, named
@ref{236c,,Ellipsis} (a built-in name).  @code{type(Ellipsis)()} produces the
@code{Ellipsis} singleton.

It is written as @code{Ellipsis} or @code{...}.

In typical use, @code{...} as the @code{Ellipsis} object appears in a few different
places, for instance:


@itemize -

@item 
In type annotations, such as @ref{271a,,callable arguments}
or @ref{265d,,tuple elements}.

@item 
As the body of a function instead of a @ref{203f,,pass statement}.

@item 
In third-party libraries, such as Numpy's slicing and striding@footnote{https://numpy.org/doc/stable/user/basics.indexing.html#slicing-and-striding}.
@end itemize

Python also uses three dots in ways that are not @code{Ellipsis} objects, for instance:


@itemize -

@item 
Doctest’s @ref{167a,,ELLIPSIS}, as a pattern for missing content.

@item 
The default Python prompt of the @ref{1b7,,interactive} shell when partial input is incomplete.
@end itemize

Lastly, the Python documentation often uses three dots in conventional English
usage to mean omitted content, even in code examples that also use them as the
@code{Ellipsis}.

@node The NotImplemented Object,Internal Objects,The Ellipsis Object,Other Built-in Types
@anchor{library/stdtypes bltin-notimplemented-object}@anchor{271b}@anchor{library/stdtypes the-notimplemented-object}@anchor{271c}
@subsubsection The NotImplemented Object


This object is returned from comparisons and binary operations when they are
asked to operate on types they don’t support. See @ref{2517,,Comparisons} for more
information.  There is exactly one @ref{1a3,,NotImplemented} object.
@code{type(NotImplemented)()} produces the singleton instance.

It is written as @code{NotImplemented}.

@node Internal Objects,,The NotImplemented Object,Other Built-in Types
@anchor{library/stdtypes internal-objects}@anchor{271d}@anchor{library/stdtypes typesinternal}@anchor{271e}
@subsubsection Internal Objects


See @ref{2373,,The standard type hierarchy} for this information.  It describes
@ref{8f1,,stack frame objects},
@ref{cf2,,traceback objects}, and slice objects.

@node Special Attributes,Integer string conversion length limitation,Other Built-in Types,Built-in Types
@anchor{library/stdtypes special-attributes}@anchor{271f}@anchor{library/stdtypes specialattrs}@anchor{2720}
@subsection Special Attributes


The implementation adds a few special read-only attributes to several object
types, where they are relevant.  Some of these are not reported by the
@ref{845,,dir()} built-in function.

@geindex __name__ (definition attribute)
@anchor{library/stdtypes definition __name__}@anchor{126c}
@deffn {Attribute} definition.__name__

The name of the class, function, method, descriptor, or
generator instance.
@end deffn

@geindex __qualname__ (definition attribute)
@anchor{library/stdtypes definition __qualname__}@anchor{126b}
@deffn {Attribute} definition.__qualname__

The @ref{1d68,,qualified name} of the class, function, method, descriptor,
or generator instance.


Added in version 3.3.

@end deffn

@geindex __module__ (definition attribute)
@anchor{library/stdtypes definition __module__}@anchor{2721}
@deffn {Attribute} definition.__module__

The name of the module in which a class or function was defined.
@end deffn

@geindex __doc__ (definition attribute)
@anchor{library/stdtypes definition __doc__}@anchor{b27}
@deffn {Attribute} definition.__doc__

The documentation string of a class or function, or @code{None} if undefined.
@end deffn

@geindex __type_params__ (definition attribute)
@anchor{library/stdtypes definition __type_params__}@anchor{25db}
@deffn {Attribute} definition.__type_params__

The @ref{5ad,,type parameters} of generic classes, functions,
and @ref{684,,type aliases}. For classes and functions that
are not generic, this will be an empty tuple.


Added in version 3.12.

@end deffn

@node Integer string conversion length limitation,,Special Attributes,Built-in Types
@anchor{library/stdtypes int-max-str-digits}@anchor{80c}@anchor{library/stdtypes integer-string-conversion-length-limitation}@anchor{2722}
@subsection Integer string conversion length limitation


CPython has a global limit for converting between @ref{19c,,int} and @ref{16a,,str}
to mitigate denial of service attacks. This limit `only' applies to decimal or
other non-power-of-two number bases. Hexadecimal, octal, and binary conversions
are unlimited. The limit can be configured.

The @ref{19c,,int} type in CPython is an arbitrary length number stored in binary
form (commonly known as a “bignum”). There exists no algorithm that can convert
a string to a binary integer or a binary integer to a string in linear time,
`unless' the base is a power of 2. Even the best known algorithms for base 10
have sub-quadratic complexity. Converting a large value such as @code{int('1' *
500_000)} can take over a second on a fast CPU.

Limiting conversion size offers a practical way to avoid 
@geindex Common Vulnerabilities and Exposures; CVE 2020-10735
CVE 2020-10735@footnote{https://www.cve.org/CVERecord?id=CVE-2020-10735}.

The limit is applied to the number of digit characters in the input or output
string when a non-linear conversion algorithm would be involved.  Underscores
and the sign are not counted towards the limit.

When an operation would exceed the limit, a @ref{2ee,,ValueError} is raised:

@example
>>> import sys
>>> sys.set_int_max_str_digits(4300)  # Illustrative, this is the default.
>>> _ = int('2' * 5432)
Traceback (most recent call last):
...
ValueError: Exceeds the limit (4300 digits) for integer string conversion: value has 5432 digits; use sys.set_int_max_str_digits() to increase the limit
>>> i = int('2' * 4300)
>>> len(str(i))
4300
>>> i_squared = i*i
>>> len(str(i_squared))
Traceback (most recent call last):
...
ValueError: Exceeds the limit (4300 digits) for integer string conversion; use sys.set_int_max_str_digits() to increase the limit
>>> len(hex(i_squared))
7144
>>> assert int(hex(i_squared), base=16) == i*i  # Hexadecimal is unlimited.
@end example

The default limit is 4300 digits as provided in
@ref{149f,,sys.int_info.default_max_str_digits}.
The lowest limit that can be configured is 640 digits as provided in
@code{sys.int_info.str_digits_check_threshold}.

Verification:

@example
>>> import sys
>>> assert sys.int_info.default_max_str_digits == 4300, sys.int_info
>>> assert sys.int_info.str_digits_check_threshold == 640, sys.int_info
>>> msg = int('578966293710682886880994035146873798396722250538762761564'
...           '9252925514383915483333812743580549779436104706260696366600'
...           '571186405732').to_bytes(53, 'big')
...
@end example


Added in version 3.11.


@menu
* Affected APIs:: 
* Configuring the limit:: 
* Recommended configuration:: 

@end menu

@node Affected APIs,Configuring the limit,,Integer string conversion length limitation
@anchor{library/stdtypes affected-apis}@anchor{2723}
@subsubsection Affected APIs


The limitation only applies to potentially slow conversions between @ref{19c,,int}
and @ref{16a,,str} or @ref{193,,bytes}:


@itemize *

@item 
@code{int(string)} with default base 10.

@item 
@code{int(string, base)} for all bases that are not a power of 2.

@item 
@code{str(integer)}.

@item 
@code{repr(integer)}.

@item 
any other string conversion to base 10, for example @code{f"@{integer@}"},
@code{"@{@}".format(integer)}, or @code{b"%d" % integer}.
@end itemize

The limitations do not apply to functions with a linear algorithm:


@itemize *

@item 
@code{int(string, base)} with base 2, 4, 8, 16, or 32.

@item 
@ref{1c2c,,int.from_bytes()} and @ref{1c75,,int.to_bytes()}.

@item 
@ref{14db,,hex()}, @ref{14da,,oct()}, @ref{14b4,,bin()}.

@item 
@ref{4fa,,Format specification mini-language} for hex, octal, and binary numbers.

@item 
@ref{16a,,str} to @ref{197,,float}.

@item 
@ref{16a,,str} to @ref{200,,decimal.Decimal}.
@end itemize

@node Configuring the limit,Recommended configuration,Affected APIs,Integer string conversion length limitation
@anchor{library/stdtypes configuring-the-limit}@anchor{2724}
@subsubsection Configuring the limit


Before Python starts up you can use an environment variable or an interpreter
command line flag to configure the limit:


@itemize *

@item 
@geindex PYTHONINTMAXSTRDIGITS
@geindex environment variable; PYTHONINTMAXSTRDIGITS
@ref{1b7e,,PYTHONINTMAXSTRDIGITS}, e.g.
@code{PYTHONINTMAXSTRDIGITS=640 python3} to set the limit to 640 or
@code{PYTHONINTMAXSTRDIGITS=0 python3} to disable the limitation.

@item 
@ref{170,,-X int_max_str_digits}, e.g.
@code{python3 -X int_max_str_digits=640}

@item 
@ref{2725,,sys.flags.int_max_str_digits} contains the value of
@geindex PYTHONINTMAXSTRDIGITS
@geindex environment variable; PYTHONINTMAXSTRDIGITS
@ref{1b7e,,PYTHONINTMAXSTRDIGITS} or @ref{170,,-X int_max_str_digits}.
If both the env var and the @code{-X} option are set, the @code{-X} option takes
precedence. A value of `-1' indicates that both were unset, thus a value of
@ref{2726,,sys.int_info.default_max_str_digits} was used during initialization.
@end itemize

From code, you can inspect the current limit and set a new one using these
@ref{df,,sys} APIs:


@itemize *

@item 
@ref{1862,,sys.get_int_max_str_digits()} and @ref{1769,,sys.set_int_max_str_digits()} are
a getter and setter for the interpreter-wide limit. Subinterpreters have
their own limit.
@end itemize

Information about the default and minimum can be found in @ref{149f,,sys.int_info}:


@itemize *

@item 
@ref{149f,,sys.int_info.default_max_str_digits} is the compiled-in
default limit.

@item 
@ref{149f,,sys.int_info.str_digits_check_threshold} is the lowest
accepted value for the limit (other than 0 which disables it).
@end itemize


Added in version 3.11.


@cartouche
@quotation Caution 
Setting a low limit `can' lead to problems. While rare, code exists that
contains integer constants in decimal in their source that exceed the
minimum threshold. A consequence of setting the limit is that Python source
code containing decimal integer literals longer than the limit will
encounter an error during parsing, usually at startup time or import time or
even at installation time - anytime an up to date @code{.pyc} does not already
exist for the code. A workaround for source that contains such large
constants is to convert them to @code{0x} hexadecimal form as it has no limit.

Test your application thoroughly if you use a low limit. Ensure your tests
run with the limit set early via the environment or flag so that it applies
during startup and even during any installation step that may invoke Python
to precompile @code{.py} sources to @code{.pyc} files.
@end quotation
@end cartouche

@node Recommended configuration,,Configuring the limit,Integer string conversion length limitation
@anchor{library/stdtypes recommended-configuration}@anchor{2727}
@subsubsection Recommended configuration


The default @ref{2726,,sys.int_info.default_max_str_digits} is expected to be
reasonable for most applications. If your application requires a different
limit, set it from your main entry point using Python version agnostic code as
these APIs were added in security patch releases in versions before 3.12.

Example:

@example
>>> import sys
>>> if hasattr(sys, "set_int_max_str_digits"):
...     upper_bound = 68000
...     lower_bound = 4004
...     current_limit = sys.get_int_max_str_digits()
...     if current_limit == 0 or current_limit > upper_bound:
...         sys.set_int_max_str_digits(upper_bound)
...     elif current_limit < lower_bound:
...         sys.set_int_max_str_digits(lower_bound)
@end example

If you need to disable it entirely, set it to @code{0}.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Built-in Exceptions,Thread Safety Guarantees,Built-in Types,The Python Standard Library
@anchor{library/exceptions doc}@anchor{2728}@anchor{library/exceptions bltin-exceptions}@anchor{1c6a}@anchor{library/exceptions built-in-exceptions}@anchor{2729}@anchor{library/exceptions translation-repo}@anchor{272a}
@section Built-in Exceptions


@geindex statement; try
@geindex statement; except

In Python, all exceptions must be instances of a class that derives from
@ref{7d8,,BaseException}.  In a @ref{8fa,,try} statement with an @ref{1ac,,except}
clause that mentions a particular class, that clause also handles any exception
classes derived from that class (but not exception classes from which `it' is
derived).  Two exception classes that are not related via subclassing are never
equivalent, even if they have the same name.

@geindex statement; raise

The built-in exceptions listed in this chapter can be generated by the interpreter or
built-in functions.  Except where mentioned, they have an “associated value”
indicating the detailed cause of the error.  This may be a string or a tuple of
several items of information (e.g., an error code and a string explaining the
code).  The associated value is usually passed as arguments to the exception
class’s constructor.

User code can raise built-in exceptions.  This can be used to test an exception
handler or to report an error condition “just like” the situation in which the
interpreter raises the same exception; but beware that there is nothing to
prevent user code from raising an inappropriate error.

The built-in exception classes can be subclassed to define new exceptions;
programmers are encouraged to derive new exceptions from the @ref{bd3,,Exception}
class or one of its subclasses, and not from @ref{7d8,,BaseException}.  More
information on defining exceptions is available in the Python Tutorial under
@ref{20c0,,User-defined Exceptions}.

@menu
* Exception context:: 
* Inheriting from built-in exceptions:: 
* Base classes:: 
* Concrete exceptions:: 
* Warnings:: 
* Exception groups:: 
* Exception hierarchy:: 

@end menu

@node Exception context,Inheriting from built-in exceptions,,Built-in Exceptions
@anchor{library/exceptions exception-context}@anchor{272b}
@subsection Exception context


@geindex exception; chaining
@geindex __cause__ (exception attribute)
@geindex __context__ (exception attribute)
@geindex __suppress_context__ (exception attribute)

Three attributes on exception objects provide information about the context in
which the exception was raised:

@geindex __context__ (BaseException attribute)
@geindex __cause__ (BaseException attribute)
@geindex __suppress_context__ (BaseException attribute)
@anchor{library/exceptions BaseException __context__}@anchor{14d3}
@deffn {Attribute} BaseException.__context__
@anchor{library/exceptions BaseException __cause__}@anchor{14d4}
@deffnx {Attribute} BaseException.__cause__
@anchor{library/exceptions BaseException __suppress_context__}@anchor{255b}
@deffnx {Attribute} BaseException.__suppress_context__

When raising a new exception while another exception
is already being handled, the new exception’s
@code{__context__} attribute is automatically set to the handled
exception.  An exception may be handled when an @ref{1ac,,except} or
@ref{1b1,,finally} clause, or a @ref{187,,with} statement, is used.

This implicit exception context can be
supplemented with an explicit cause by using @code{from} with
@ref{804,,raise}:

@example
raise new_exc from original_exc
@end example

The expression following @ref{804,,from} must be an exception or @code{None}. It
will be set as @code{__cause__} on the raised exception. Setting
@code{__cause__} also implicitly sets the @code{__suppress_context__}
attribute to @code{True}, so that using @code{raise new_exc from None}
effectively replaces the old exception with the new one for display
purposes (e.g. converting @ref{5e7,,KeyError} to @ref{5f0,,AttributeError}), while
leaving the old exception available in @code{__context__} for introspection
when debugging.

The default traceback display code shows these chained exceptions in
addition to the traceback for the exception itself. An explicitly chained
exception in @code{__cause__} is always shown when present. An implicitly
chained exception in @code{__context__} is shown only if @code{__cause__}
is @ref{887,,None} and @code{__suppress_context__} is false.

In either case, the exception itself is always shown after any chained
exceptions so that the final line of the traceback always shows the last
exception that was raised.
@end deffn

@node Inheriting from built-in exceptions,Base classes,Exception context,Built-in Exceptions
@anchor{library/exceptions inheriting-from-built-in-exceptions}@anchor{272c}
@subsection Inheriting from built-in exceptions


User code can create subclasses that inherit from an exception type.
It’s recommended to only subclass one exception type at a time to avoid
any possible conflicts between how the bases handle the @code{args}
attribute, as well as due to possible memory layout incompatibilities.

`CPython implementation detail:' Most built-in exceptions are implemented in C for efficiency, see:
Objects/exceptions.c@footnote{https://github.com/python/cpython/tree/3.14/Objects/exceptions.c}.  Some have custom memory layouts
which makes it impossible to create a subclass that inherits from
multiple exception types. The memory layout of a type is an implementation
detail and might change between Python versions, leading to new
conflicts in the future.  Therefore, it’s recommended to avoid
subclassing multiple exception types altogether.

@node Base classes,Concrete exceptions,Inheriting from built-in exceptions,Built-in Exceptions
@anchor{library/exceptions base-classes}@anchor{272d}
@subsection Base classes


The following exceptions are used mostly as base classes for other exceptions.

@geindex BaseException
@anchor{library/exceptions BaseException}@anchor{7d8}
@deffn {Exception} BaseException

The base class for all built-in exceptions.  It is not meant to be directly
inherited by user-defined classes (for that, use @ref{bd3,,Exception}).  If
@ref{16a,,str()} is called on an instance of this class, the representation of
the argument(s) to the instance are returned, or the empty string when
there were no arguments.

@geindex args (BaseException attribute)
@anchor{library/exceptions BaseException args}@anchor{78e}
@deffn {Attribute} args

The tuple of arguments given to the exception constructor.  Some built-in
exceptions (like @ref{2c2,,OSError}) expect a certain number of arguments and
assign a special meaning to the elements of this tuple, while others are
usually called only with a single string giving an error message.
@end deffn

@geindex with_traceback() (BaseException method)
@anchor{library/exceptions BaseException with_traceback}@anchor{255a}
@deffn {Method} with_traceback (tb)

This method sets `tb' as the new traceback for the exception and returns
the exception object.  It was more commonly used before the exception
chaining features of 
@geindex Python Enhancement Proposals; PEP 3134
PEP 3134@footnote{https://peps.python.org/pep-3134/} became available.  The following example
shows how we can convert an instance of @code{SomeException} into an
instance of @code{OtherException} while preserving the traceback.  Once
raised, the current frame is pushed onto the traceback of the
@code{OtherException}, as would have happened to the traceback of the
original @code{SomeException} had we allowed it to propagate to the caller.

@example
try:
    ...
except SomeException:
    tb = sys.exception().__traceback__
    raise OtherException(...).with_traceback(tb)
@end example
@end deffn

@geindex __traceback__ (BaseException attribute)
@anchor{library/exceptions BaseException __traceback__}@anchor{14d2}
@deffn {Attribute} __traceback__

A writable field that holds the
@ref{cf2,,traceback object} associated with this
exception. See also: @ref{804,,The raise statement}.
@end deffn

@geindex add_note() (BaseException method)
@anchor{library/exceptions BaseException add_note}@anchor{7d7}
@deffn {Method} add_note (note)

Add the string @code{note} to the exception’s notes which appear in the standard
traceback after the exception string. A @ref{199,,TypeError} is raised if @code{note}
is not a string.


Added in version 3.11.

@end deffn

@geindex __notes__ (BaseException attribute)
@anchor{library/exceptions BaseException __notes__}@anchor{272e}
@deffn {Attribute} __notes__

A list of the notes of this exception, which were added with @ref{7d7,,add_note()}.
This attribute is created when @code{add_note()} is called.


Added in version 3.11.

@end deffn
@end deffn

@geindex Exception
@anchor{library/exceptions Exception}@anchor{bd3}
@deffn {Exception} Exception

All built-in, non-system-exiting exceptions are derived from this class.  All
user-defined exceptions should also be derived from this class.
@end deffn

@geindex ArithmeticError
@anchor{library/exceptions ArithmeticError}@anchor{272f}
@deffn {Exception} ArithmeticError

The base class for those built-in exceptions that are raised for various
arithmetic errors: @ref{a87,,OverflowError}, @ref{b45,,ZeroDivisionError},
@ref{2730,,FloatingPointError}.
@end deffn

@geindex BufferError
@anchor{library/exceptions BufferError}@anchor{17e9}
@deffn {Exception} BufferError

Raised when a @ref{262,,buffer} related operation cannot be
performed.
@end deffn

@geindex LookupError
@anchor{library/exceptions LookupError}@anchor{242c}
@deffn {Exception} LookupError

The base class for the exceptions that are raised when a key or index used on
a mapping or sequence is invalid: @ref{1741,,IndexError}, @ref{5e7,,KeyError}.  This
can be raised directly by @ref{b62,,codecs.lookup()}.
@end deffn

@node Concrete exceptions,Warnings,Base classes,Built-in Exceptions
@anchor{library/exceptions concrete-exceptions}@anchor{2731}
@subsection Concrete exceptions


The following exceptions are the exceptions that are usually raised.

@geindex AssertionError
@anchor{library/exceptions AssertionError}@anchor{8ba}
@deffn {Exception} AssertionError

@geindex statement; assert

Raised when an @ref{b66,,assert} statement fails.
@end deffn

@geindex AttributeError
@anchor{library/exceptions AttributeError}@anchor{5f0}
@deffn {Exception} AttributeError

Raised when an attribute reference (see @ref{24f0,,Attribute references}) or
assignment fails.  (When an object does not support attribute references or
attribute assignments at all, @ref{199,,TypeError} is raised.)

The optional `name' and `obj' keyword-only arguments
set the corresponding attributes:

@geindex name (AttributeError attribute)
@anchor{library/exceptions AttributeError name}@anchor{2732}
@deffn {Attribute} name

The name of the attribute that was attempted to be accessed.
@end deffn

@geindex obj (AttributeError attribute)
@anchor{library/exceptions AttributeError obj}@anchor{2733}
@deffn {Attribute} obj

The object that was accessed for the named attribute.
@end deffn


Changed in version 3.10: Added the @ref{2732,,name} and @ref{2733,,obj} attributes.

@end deffn

@geindex EOFError
@anchor{library/exceptions EOFError}@anchor{14e5}
@deffn {Exception} EOFError

Raised when the @ref{14e4,,input()} function hits an end-of-file condition (EOF)
without reading any data. (Note: the @ref{20b0,,io.TextIOBase.read()} and
@ref{1535,,io.IOBase.readline()} methods return an empty string when they hit EOF.)
@end deffn

@geindex FloatingPointError
@anchor{library/exceptions FloatingPointError}@anchor{2730}
@deffn {Exception} FloatingPointError

Not currently used.
@end deffn

@geindex GeneratorExit
@anchor{library/exceptions GeneratorExit}@anchor{15d3}
@deffn {Exception} GeneratorExit

Raised when a @ref{1267,,generator} or @ref{6ba,,coroutine} is closed;
see @ref{17e5,,generator.close()} and @ref{2462,,coroutine.close()}.  It
directly inherits from @ref{7d8,,BaseException} instead of @ref{bd3,,Exception} since
it is technically not an error.
@end deffn

@geindex ImportError
@anchor{library/exceptions ImportError}@anchor{65b}
@deffn {Exception} ImportError

Raised when the @ref{7f9,,import} statement has troubles trying to
load a module.  Also raised when the “from list” in @code{from ... import}
has a name that cannot be found.

The optional `name' and `path' keyword-only arguments
set the corresponding attributes:

@geindex name (ImportError attribute)
@anchor{library/exceptions ImportError name}@anchor{1795}
@deffn {Attribute} name

The name of the module that was attempted to be imported.
@end deffn

@geindex path (ImportError attribute)
@anchor{library/exceptions ImportError path}@anchor{2734}
@deffn {Attribute} path

The path to any file which triggered the exception.
@end deffn


Changed in version 3.3: Added the @ref{1795,,name} and @ref{2734,,path} attributes.

@end deffn

@geindex ModuleNotFoundError
@anchor{library/exceptions ModuleNotFoundError}@anchor{d43}
@deffn {Exception} ModuleNotFoundError

A subclass of @ref{65b,,ImportError} which is raised by @ref{7f9,,import}
when a module could not be located.  It is also raised when @code{None}
is found in @ref{1771,,sys.modules}.


Added in version 3.6.

@end deffn

@geindex IndexError
@anchor{library/exceptions IndexError}@anchor{1741}
@deffn {Exception} IndexError

Raised when a sequence subscript is out of range.  (Slice indices are
silently truncated to fall in the allowed range; if an index is not an
integer, @ref{199,,TypeError} is raised.)

@c XXX xref to sequences
@end deffn

@geindex KeyError
@anchor{library/exceptions KeyError}@anchor{5e7}
@deffn {Exception} KeyError

Raised when a mapping (dictionary) key is not found in the set of existing keys.

@c XXX xref to mapping objects?
@end deffn

@geindex KeyboardInterrupt
@anchor{library/exceptions KeyboardInterrupt}@anchor{bcb}
@deffn {Exception} KeyboardInterrupt

Raised when the user hits the interrupt key (normally @code{Control}-@code{C} or
@code{Delete}).  During execution, a check for interrupts is made
regularly. The exception inherits from @ref{7d8,,BaseException} so as to not be
accidentally caught by code that catches @ref{bd3,,Exception} and thus prevent
the interpreter from exiting.

@cartouche
@quotation Note 
Catching a @code{KeyboardInterrupt} requires special consideration.
Because it can be raised at unpredictable points, it may, in some
circumstances, leave the running program in an inconsistent state. It is
generally best to allow @code{KeyboardInterrupt} to end the program as
quickly as possible or avoid raising it entirely. (See
@ref{2735,,Note on Signal Handlers and Exceptions}.)
@end quotation
@end cartouche
@end deffn

@geindex MemoryError
@anchor{library/exceptions MemoryError}@anchor{1761}
@deffn {Exception} MemoryError

Raised when an operation runs out of memory but the situation may still be
rescued (by deleting some objects).  The associated value is a string indicating
what kind of (internal) operation ran out of memory. Note that because of the
underlying memory management architecture (C’s @code{malloc()} function), the
interpreter may not always be able to completely recover from this situation; it
nevertheless raises an exception so that a stack traceback can be printed, in
case a run-away program was the cause.
@end deffn

@geindex NameError
@anchor{library/exceptions NameError}@anchor{450}
@deffn {Exception} NameError

Raised when a local or global name is not found.  This applies only to
unqualified names.  The associated value is an error message that includes the
name that could not be found.

The optional `name' keyword-only argument sets the attribute:

@geindex name (NameError attribute)
@anchor{library/exceptions NameError name}@anchor{2736}
@deffn {Attribute} name

The name of the variable that was attempted to be accessed.
@end deffn


Changed in version 3.10: Added the @ref{2736,,name} attribute.

@end deffn

@geindex NotImplementedError
@anchor{library/exceptions NotImplementedError}@anchor{369}
@deffn {Exception} NotImplementedError

This exception is derived from @ref{246,,RuntimeError}.  In user defined base
classes, abstract methods should raise this exception when they require
derived classes to override the method, or while the class is being
developed to indicate that the real implementation still needs to be added.

@cartouche
@quotation Note 
It should not be used to indicate that an operator or method is not
meant to be supported at all – in that case either leave the operator /
method undefined or, if a subclass, set it to @ref{887,,None}.
@end quotation
@end cartouche

@cartouche
@quotation Caution 
@code{NotImplementedError} and @code{NotImplemented} are not
interchangeable. This exception should only be used as described
above; see @ref{1a3,,NotImplemented} for details on correct usage of
the built-in constant.
@end quotation
@end cartouche
@end deffn

@geindex OSError
@anchor{library/exceptions OSError}@anchor{2c2}
@deffn {Exception} OSError ([arg])

@deffnx {Exception} OSError (errno, strerror[, filename[, winerror[, filename2]]])

@geindex module; errno

This exception is raised when a system function returns a system-related
error, including I/O failures such as “file not found” or “disk full”
(not for illegal argument types or other incidental errors).

The second form of the constructor sets the corresponding attributes,
described below.  The attributes default to @ref{887,,None} if not
specified.  For backwards compatibility, if three arguments are passed,
the @ref{78e,,args} attribute contains only a 2-tuple
of the first two constructor arguments.

The constructor often actually returns a subclass of @code{OSError}, as
described in @ref{2737,,OS exceptions} below.  The particular subclass depends on
the final @ref{1804,,errno} value.  This behaviour only occurs when
constructing @code{OSError} directly or via an alias, and is not
inherited when subclassing.

@geindex errno (OSError attribute)
@anchor{library/exceptions OSError errno}@anchor{1804}
@deffn {Attribute} errno

A numeric error code from the C variable @code{errno}.
@end deffn

@geindex winerror (OSError attribute)
@anchor{library/exceptions OSError winerror}@anchor{2738}
@deffn {Attribute} winerror

Under Windows, this gives you the native
Windows error code.  The @ref{1804,,errno} attribute is then an approximate
translation, in POSIX terms, of that native error code.

Under Windows, if the `winerror' constructor argument is an integer,
the @ref{1804,,errno} attribute is determined from the Windows error code,
and the `errno' argument is ignored.  On other platforms, the
`winerror' argument is ignored, and the @ref{2738,,winerror} attribute
does not exist.
@end deffn

@geindex strerror (OSError attribute)
@anchor{library/exceptions OSError strerror}@anchor{2739}
@deffn {Attribute} strerror

The corresponding error message, as provided by
the operating system.  It is formatted by the C
functions @code{perror()} under POSIX, and @code{FormatMessage()}
under Windows.
@end deffn

@geindex filename (OSError attribute)
@geindex filename2 (OSError attribute)
@anchor{library/exceptions OSError filename}@anchor{273a}
@deffn {Attribute} filename
@anchor{library/exceptions OSError filename2}@anchor{273b}
@deffnx {Attribute} filename2

For exceptions that involve a file system path (such as @ref{318,,open()} or
@ref{1301,,os.unlink()}), @ref{273a,,filename} is the file name passed to the function.
For functions that involve two file system paths (such as
@ref{12fd,,os.rename()}), @ref{273b,,filename2} corresponds to the second
file name passed to the function.
@end deffn


Changed in version 3.3: @ref{125a,,EnvironmentError}, @ref{1259,,IOError}, @ref{125b,,WindowsError},
@ref{125c,,socket.error}, @ref{125d,,select.error} and
@code{mmap.error} have been merged into @code{OSError}, and the
constructor may return a subclass.



Changed in version 3.4: The @ref{273a,,filename} attribute is now the original file name passed to
the function, instead of the name encoded to or decoded from the
@ref{75e,,filesystem encoding and error handler}. Also, the `filename2'
constructor argument and attribute was added.

@end deffn

@geindex OverflowError
@anchor{library/exceptions OverflowError}@anchor{a87}
@deffn {Exception} OverflowError

Raised when the result of an arithmetic operation is too large to be
represented.  This cannot occur for integers (which would rather raise
@ref{1761,,MemoryError} than give up).  However, for historical reasons,
OverflowError is sometimes raised for integers that are outside a required
range.   Because of the lack of standardization of floating-point exception
handling in C, most floating-point operations are not checked.
@end deffn

@geindex PythonFinalizationError
@anchor{library/exceptions PythonFinalizationError}@anchor{479}
@deffn {Exception} PythonFinalizationError

This exception is derived from @ref{246,,RuntimeError}.  It is raised when
an operation is blocked during interpreter shutdown also known as
@ref{47a,,Python finalization}.

Examples of operations which can be blocked with a
@code{PythonFinalizationError} during the Python finalization:


@itemize *

@item 
Creating a new Python thread.

@item 
@ref{13f0,,Joining} a running daemon thread.

@item 
@ref{4b6,,os.fork()}.
@end itemize

See also the @ref{c86,,sys.is_finalizing()} function.


Added in version 3.13: Previously, a plain @ref{246,,RuntimeError} was raised.



Changed in version 3.14: @ref{13f0,,threading.Thread.join()} can now raise this exception.

@end deffn

@geindex RecursionError
@anchor{library/exceptions RecursionError}@anchor{f6e}
@deffn {Exception} RecursionError

This exception is derived from @ref{246,,RuntimeError}.  It is raised when the
interpreter detects that the maximum recursion depth (see
@ref{6ec,,sys.getrecursionlimit()}) is exceeded.


Added in version 3.5: Previously, a plain @ref{246,,RuntimeError} was raised.

@end deffn

@geindex ReferenceError
@anchor{library/exceptions ReferenceError}@anchor{1719}
@deffn {Exception} ReferenceError

This exception is raised when a weak reference proxy, created by the
@ref{c4c,,weakref.proxy()} function, is used to access an attribute of the referent
after it has been garbage collected. For more information on weak references,
see the @ref{11b,,weakref} module.
@end deffn

@geindex RuntimeError
@anchor{library/exceptions RuntimeError}@anchor{246}
@deffn {Exception} RuntimeError

Raised when an error is detected that doesn’t fall in any of the other
categories.  The associated value is a string indicating what precisely went
wrong.
@end deffn

@geindex StopIteration
@anchor{library/exceptions StopIteration}@anchor{dfb}
@deffn {Exception} StopIteration

Raised by built-in function @ref{9de,,next()} and an @ref{4c9,,iterator}'s
@ref{14d9,,__next__()} method to signal that there are no further
items produced by the iterator.

@geindex value (StopIteration attribute)
@anchor{library/exceptions StopIteration value}@anchor{245e}
@deffn {Attribute} value

The exception object has a single attribute @code{value}, which is
given as an argument when constructing the exception, and defaults
to @ref{887,,None}.
@end deffn

When a @ref{1267,,generator} or @ref{6ba,,coroutine} function
returns, a new @code{StopIteration} instance is
raised, and the value returned by the function is used as the
@ref{245e,,value} parameter to the constructor of the exception.

If a generator code directly or indirectly raises @code{StopIteration},
it is converted into a @ref{246,,RuntimeError} (retaining the
@code{StopIteration} as the new exception’s cause).


Changed in version 3.3: Added @code{value} attribute and the ability for generator functions to
use it to return a value.



Changed in version 3.5: Introduced the RuntimeError transformation via
@code{from __future__ import generator_stop}, see 
@geindex Python Enhancement Proposals; PEP 479
PEP 479@footnote{https://peps.python.org/pep-0479/}.



Changed in version 3.7: Enable 
@geindex Python Enhancement Proposals; PEP 479
PEP 479@footnote{https://peps.python.org/pep-0479/} for all code by default: a @code{StopIteration}
error raised in a generator is transformed into a @ref{246,,RuntimeError}.

@end deffn

@geindex StopAsyncIteration
@anchor{library/exceptions StopAsyncIteration}@anchor{1e52}
@deffn {Exception} StopAsyncIteration

Must be raised by @ref{18ca,,__anext__()} method of an
@ref{4c8,,asynchronous iterator} object to stop the iteration.


Added in version 3.5.

@end deffn

@geindex SyntaxError
@anchor{library/exceptions SyntaxError}@anchor{18f}
@deffn {Exception} SyntaxError (message, details)

Raised when the parser encounters a syntax error.  This may occur in an
@ref{7f9,,import} statement, in a call to the built-in functions
@ref{4b2,,compile()}, @ref{4a3,,exec()},
or @ref{4a4,,eval()}, or when reading the initial script or standard input
(also interactively).

The @ref{16a,,str()} of the exception instance returns only the error message.
Details is a tuple whose members are also available as separate attributes.

@geindex filename (SyntaxError attribute)
@anchor{library/exceptions SyntaxError filename}@anchor{273c}
@deffn {Attribute} filename

The name of the file the syntax error occurred in.
@end deffn

@geindex lineno (SyntaxError attribute)
@anchor{library/exceptions SyntaxError lineno}@anchor{273d}
@deffn {Attribute} lineno

Which line number in the file the error occurred in. This is
1-indexed: the first line in the file has a @code{lineno} of 1.
@end deffn

@geindex offset (SyntaxError attribute)
@anchor{library/exceptions SyntaxError offset}@anchor{273e}
@deffn {Attribute} offset

The column in the line where the error occurred. This is
1-indexed: the first character in the line has an @code{offset} of 1.
@end deffn

@geindex text (SyntaxError attribute)
@anchor{library/exceptions SyntaxError text}@anchor{273f}
@deffn {Attribute} text

The source code text involved in the error.
@end deffn

@geindex end_lineno (SyntaxError attribute)
@anchor{library/exceptions SyntaxError end_lineno}@anchor{2740}
@deffn {Attribute} end_lineno

Which line number in the file the error occurred ends in. This is
1-indexed: the first line in the file has a @code{lineno} of 1.
@end deffn

@geindex end_offset (SyntaxError attribute)
@anchor{library/exceptions SyntaxError end_offset}@anchor{2741}
@deffn {Attribute} end_offset

The column in the end line where the error occurred finishes. This is
1-indexed: the first character in the line has an @code{offset} of 1.
@end deffn

For errors in f-string fields, the message is prefixed by “f-string: ”
and the offsets are offsets in a text constructed from the replacement
expression.  For example, compiling f’Bad @{a b@} field’ results in this
args attribute: (‘f-string: …’, (‘’, 1, 2, ‘(a b)n’, 1, 5)).


Changed in version 3.10: Added the @ref{2740,,end_lineno} and @ref{2741,,end_offset} attributes.

@end deffn

@geindex IndentationError
@anchor{library/exceptions IndentationError}@anchor{9b1}
@deffn {Exception} IndentationError

Base class for syntax errors related to incorrect indentation.  This is a
subclass of @ref{18f,,SyntaxError}.
@end deffn

@geindex TabError
@anchor{library/exceptions TabError}@anchor{766}
@deffn {Exception} TabError

Raised when indentation contains an inconsistent use of tabs and spaces.
This is a subclass of @ref{9b1,,IndentationError}.
@end deffn

@geindex SystemError
@anchor{library/exceptions SystemError}@anchor{796}
@deffn {Exception} SystemError

Raised when the interpreter finds an internal error, but the situation does not
look so serious to cause it to abandon all hope. The associated value is a
string indicating what went wrong (in low-level terms). In @ref{907,,CPython},
this could be raised by incorrectly using Python’s C API, such as returning
a @code{NULL} value without an exception set.

If you’re confident that this exception wasn’t your fault, or the fault of
a package you’re using, you should report this to the author or maintainer
of your Python interpreter.
Be sure to report the version of the Python interpreter (@code{sys.version}; it is
also printed at the start of an interactive Python session), the exact error
message (the exception’s associated value) and if possible the source of the
program that triggered the error.
@end deffn

@geindex SystemExit
@anchor{library/exceptions SystemExit}@anchor{f42}
@deffn {Exception} SystemExit

This exception is raised by the @ref{279,,sys.exit()} function.  It inherits from
@ref{7d8,,BaseException} instead of @ref{bd3,,Exception} so that it is not accidentally
caught by code that catches @code{Exception}.  This allows the exception to
properly propagate up and cause the interpreter to exit.  When it is not
handled, the Python interpreter exits; no stack traceback is printed.  The
constructor accepts the same optional argument passed to @code{sys.exit()}.
If the value is an integer, it specifies the system exit status (passed to
C’s @code{exit()} function); if it is @code{None}, the exit status is zero; if
it has another type (such as a string), the object’s value is printed and
the exit status is one.

A call to @ref{279,,sys.exit()} is translated into an exception so that clean-up
handlers (@ref{1b1,,finally} clauses of @ref{8fa,,try} statements) can be
executed, and so that a debugger can execute a script without running the risk
of losing control.  The @ref{2742,,os._exit()} function can be used if it is
absolutely positively necessary to exit immediately (for example, in the child
process after a call to @ref{4b6,,os.fork()}).

@geindex code (SystemExit attribute)
@anchor{library/exceptions SystemExit code}@anchor{2743}
@deffn {Attribute} code

The exit status or error message that is passed to the constructor.
(Defaults to @code{None}.)
@end deffn
@end deffn

@geindex TypeError
@anchor{library/exceptions TypeError}@anchor{199}
@deffn {Exception} TypeError

Raised when an operation or function is applied to an object of inappropriate
type.  The associated value is a string giving details about the type mismatch.

This exception may be raised by user code to indicate that an attempted
operation on an object is not supported, and is not meant to be. If an object
is meant to support a given operation but has not yet provided an
implementation, @ref{369,,NotImplementedError} is the proper exception to raise.

Passing arguments of the wrong type (e.g. passing a @ref{24f,,list} when an
@ref{19c,,int} is expected) should result in a @code{TypeError}, but passing
arguments with the wrong value (e.g. a number outside expected boundaries)
should result in a @ref{2ee,,ValueError}.
@end deffn

@geindex UnboundLocalError
@anchor{library/exceptions UnboundLocalError}@anchor{1742}
@deffn {Exception} UnboundLocalError

Raised when a reference is made to a local variable in a function or method, but
no value has been bound to that variable.  This is a subclass of
@ref{450,,NameError}.
@end deffn

@geindex UnicodeError
@anchor{library/exceptions UnicodeError}@anchor{460}
@deffn {Exception} UnicodeError

Raised when a Unicode-related encoding or decoding error occurs.  It is a
subclass of @ref{2ee,,ValueError}.

@code{UnicodeError} has attributes that describe the encoding or decoding
error.  For example, @code{err.object[err.start:err.end]} gives the particular
invalid input that the codec failed on.

@geindex encoding (UnicodeError attribute)
@anchor{library/exceptions UnicodeError encoding}@anchor{2744}
@deffn {Attribute} encoding

The name of the encoding that raised the error.
@end deffn

@geindex reason (UnicodeError attribute)
@anchor{library/exceptions UnicodeError reason}@anchor{2745}
@deffn {Attribute} reason

A string describing the specific codec error.
@end deffn

@geindex object (UnicodeError attribute)
@anchor{library/exceptions UnicodeError object}@anchor{1941}
@deffn {Attribute} object

The object the codec was attempting to encode or decode.
@end deffn

@geindex start (UnicodeError attribute)
@anchor{library/exceptions UnicodeError start}@anchor{1906}
@deffn {Attribute} start

The first index of invalid data in @ref{c84,,object}.

This value should not be negative as it is interpreted as an
absolute offset but this constraint is not enforced at runtime.
@end deffn

@geindex end (UnicodeError attribute)
@anchor{library/exceptions UnicodeError end}@anchor{1907}
@deffn {Attribute} end

The index after the last invalid data in @ref{c84,,object}.

This value should not be negative as it is interpreted as an
absolute offset but this constraint is not enforced at runtime.
@end deffn
@end deffn

@geindex UnicodeEncodeError
@anchor{library/exceptions UnicodeEncodeError}@anchor{889}
@deffn {Exception} UnicodeEncodeError

Raised when a Unicode-related error occurs during encoding.  It is a subclass of
@ref{460,,UnicodeError}.
@end deffn

@geindex UnicodeDecodeError
@anchor{library/exceptions UnicodeDecodeError}@anchor{c0e}
@deffn {Exception} UnicodeDecodeError

Raised when a Unicode-related error occurs during decoding.  It is a subclass of
@ref{460,,UnicodeError}.
@end deffn

@geindex UnicodeTranslateError
@anchor{library/exceptions UnicodeTranslateError}@anchor{1942}
@deffn {Exception} UnicodeTranslateError

Raised when a Unicode-related error occurs during translating.  It is a subclass
of @ref{460,,UnicodeError}.
@end deffn

@geindex ValueError
@anchor{library/exceptions ValueError}@anchor{2ee}
@deffn {Exception} ValueError

Raised when an operation or function receives an argument that has the
right type but an inappropriate value, and the situation is not described by a
more precise exception such as @ref{1741,,IndexError}.
@end deffn

@geindex ZeroDivisionError
@anchor{library/exceptions ZeroDivisionError}@anchor{b45}
@deffn {Exception} ZeroDivisionError

Raised when the second argument of a division or modulo operation is zero.  The
associated value is a string indicating the type of the operands and the
operation.
@end deffn

The following exceptions are kept for compatibility with previous versions;
starting from Python 3.3, they are aliases of @ref{2c2,,OSError}.

@geindex EnvironmentError
@anchor{library/exceptions EnvironmentError}@anchor{125a}
@deffn {Exception} EnvironmentError
@end deffn

@geindex IOError
@anchor{library/exceptions IOError}@anchor{1259}
@deffn {Exception} IOError
@end deffn

@geindex WindowsError
@anchor{library/exceptions WindowsError}@anchor{125b}
@deffn {Exception} WindowsError

Only available on Windows.
@end deffn

@menu
* OS exceptions:: 

@end menu

@node OS exceptions,,,Concrete exceptions
@anchor{library/exceptions os-exceptions}@anchor{2737}
@subsubsection OS exceptions


The following exceptions are subclasses of @ref{2c2,,OSError}, they get raised
depending on the system error code.

@geindex BlockingIOError
@anchor{library/exceptions BlockingIOError}@anchor{237}
@deffn {Exception} BlockingIOError

Raised when an operation would block on an object (e.g. socket) set
for non-blocking operation.
Corresponds to @code{errno} @ref{2746,,EAGAIN}, @ref{2747,,EALREADY},
@ref{2748,,EWOULDBLOCK} and @ref{2749,,EINPROGRESS}.

In addition to those of @ref{2c2,,OSError}, @code{BlockingIOError} can have
one more attribute:

@geindex characters_written (BlockingIOError attribute)
@anchor{library/exceptions BlockingIOError characters_written}@anchor{274a}
@deffn {Attribute} characters_written

An integer containing the number of `bytes' written to the stream
before it blocked. This attribute is available when using the
buffered I/O classes from the @ref{83,,io} module.
@end deffn
@end deffn

@geindex ChildProcessError
@anchor{library/exceptions ChildProcessError}@anchor{125e}
@deffn {Exception} ChildProcessError

Raised when an operation on a child process failed.
Corresponds to @code{errno} @ref{274b,,ECHILD}.
@end deffn

@geindex ConnectionError
@anchor{library/exceptions ConnectionError}@anchor{1011}
@deffn {Exception} ConnectionError

A base class for connection-related issues.

Subclasses are @ref{1262,,BrokenPipeError}, @ref{1263,,ConnectionAbortedError},
@ref{1264,,ConnectionRefusedError} and @ref{1265,,ConnectionResetError}.
@end deffn

@geindex BrokenPipeError
@anchor{library/exceptions BrokenPipeError}@anchor{1262}
@deffn {Exception} BrokenPipeError

A subclass of @ref{1011,,ConnectionError}, raised when trying to write on a
pipe while the other end has been closed, or trying to write on a socket
which has been shutdown for writing.
Corresponds to @code{errno} @ref{274c,,EPIPE} and @ref{274d,,ESHUTDOWN}.
@end deffn

@geindex ConnectionAbortedError
@anchor{library/exceptions ConnectionAbortedError}@anchor{1263}
@deffn {Exception} ConnectionAbortedError

A subclass of @ref{1011,,ConnectionError}, raised when a connection attempt
is aborted by the peer.
Corresponds to @code{errno} @ref{274e,,ECONNABORTED}.
@end deffn

@geindex ConnectionRefusedError
@anchor{library/exceptions ConnectionRefusedError}@anchor{1264}
@deffn {Exception} ConnectionRefusedError

A subclass of @ref{1011,,ConnectionError}, raised when a connection attempt
is refused by the peer.
Corresponds to @code{errno} @ref{274f,,ECONNREFUSED}.
@end deffn

@geindex ConnectionResetError
@anchor{library/exceptions ConnectionResetError}@anchor{1265}
@deffn {Exception} ConnectionResetError

A subclass of @ref{1011,,ConnectionError}, raised when a connection is
reset by the peer.
Corresponds to @code{errno} @ref{2750,,ECONNRESET}.
@end deffn

@geindex FileExistsError
@anchor{library/exceptions FileExistsError}@anchor{1226}
@deffn {Exception} FileExistsError

Raised when trying to create a file or directory which already exists.
Corresponds to @code{errno} @ref{2751,,EEXIST}.
@end deffn

@geindex FileNotFoundError
@anchor{library/exceptions FileNotFoundError}@anchor{266}
@deffn {Exception} FileNotFoundError

Raised when a file or directory is requested but doesn’t exist.
Corresponds to @code{errno} @ref{2752,,ENOENT}.
@end deffn

@geindex InterruptedError
@anchor{library/exceptions InterruptedError}@anchor{f8e}
@deffn {Exception} InterruptedError

Raised when a system call is interrupted by an incoming signal.
Corresponds to @code{errno} @ref{f8d,,EINTR}.


Changed in version 3.5: Python now retries system calls when a syscall is interrupted by a
signal, except if the signal handler raises an exception (see 
@geindex Python Enhancement Proposals; PEP 475
PEP 475@footnote{https://peps.python.org/pep-0475/}
for the rationale), instead of raising @code{InterruptedError}.

@end deffn

@geindex IsADirectoryError
@anchor{library/exceptions IsADirectoryError}@anchor{125f}
@deffn {Exception} IsADirectoryError

Raised when a file operation (such as @ref{12fc,,os.remove()}) is requested
on a directory.
Corresponds to @code{errno} @ref{2753,,EISDIR}.
@end deffn

@geindex NotADirectoryError
@anchor{library/exceptions NotADirectoryError}@anchor{1260}
@deffn {Exception} NotADirectoryError

Raised when a directory operation (such as @ref{1306,,os.listdir()}) is requested on
something which is not a directory.  On most POSIX platforms, it may also be
raised if an operation attempts to open or traverse a non-directory file as if
it were a directory.
Corresponds to @code{errno} @ref{2754,,ENOTDIR}.
@end deffn

@geindex PermissionError
@anchor{library/exceptions PermissionError}@anchor{f44}
@deffn {Exception} PermissionError

Raised when trying to run an operation without the adequate access
rights - for example filesystem permissions.
Corresponds to @code{errno} @ref{2755,,EACCES},
@ref{1b9a,,EPERM}, and @ref{1b83,,ENOTCAPABLE}.


Changed in version 3.11.1: WASI’s @ref{1b83,,ENOTCAPABLE} is now mapped to
@code{PermissionError}.

@end deffn

@geindex ProcessLookupError
@anchor{library/exceptions ProcessLookupError}@anchor{1261}
@deffn {Exception} ProcessLookupError

Raised when a given process doesn’t exist.
Corresponds to @code{errno} @ref{2756,,ESRCH}.
@end deffn

@geindex TimeoutError
@anchor{library/exceptions TimeoutError}@anchor{a3c}
@deffn {Exception} TimeoutError

Raised when a system function timed out at the system level.
Corresponds to @code{errno} @ref{2757,,ETIMEDOUT}.
@end deffn


Added in version 3.3: All the above @ref{2c2,,OSError} subclasses were added.



@subsubheading See also


@geindex Python Enhancement Proposals; PEP 3151
PEP 3151@footnote{https://peps.python.org/pep-3151/} - Reworking the OS and IO exception hierarchy


@node Warnings,Exception groups,Concrete exceptions,Built-in Exceptions
@anchor{library/exceptions warning-categories-as-exceptions}@anchor{2758}@anchor{library/exceptions warnings}@anchor{2759}
@subsection Warnings


The following exceptions are used as warning categories; see the
@ref{275a,,Warning Categories} documentation for more details.

@geindex Warning
@anchor{library/exceptions Warning}@anchor{275b}
@deffn {Exception} Warning

Base class for warning categories.
@end deffn

@geindex UserWarning
@anchor{library/exceptions UserWarning}@anchor{275c}
@deffn {Exception} UserWarning

Base class for warnings generated by user code.
@end deffn

@geindex DeprecationWarning
@anchor{library/exceptions DeprecationWarning}@anchor{1a4}
@deffn {Exception} DeprecationWarning

Base class for warnings about deprecated features when those warnings are
intended for other Python developers.

Ignored by the default warning filters, except in the @code{__main__} module
(
@geindex Python Enhancement Proposals; PEP 565
PEP 565@footnote{https://peps.python.org/pep-0565/}). Enabling the @ref{509,,Python Development Mode} shows
this warning.

The deprecation policy is described in 
@geindex Python Enhancement Proposals; PEP 387
PEP 387@footnote{https://peps.python.org/pep-0387/}.
@end deffn

@geindex PendingDeprecationWarning
@anchor{library/exceptions PendingDeprecationWarning}@anchor{acc}
@deffn {Exception} PendingDeprecationWarning

Base class for warnings about features which are obsolete and
expected to be deprecated in the future, but are not deprecated
at the moment.

This class is rarely used as emitting a warning about a possible
upcoming deprecation is unusual, and @ref{1a4,,DeprecationWarning}
is preferred for already active deprecations.

Ignored by the default warning filters. Enabling the @ref{509,,Python Development Mode} shows this warning.

The deprecation policy is described in 
@geindex Python Enhancement Proposals; PEP 387
PEP 387@footnote{https://peps.python.org/pep-0387/}.
@end deffn

@geindex SyntaxWarning
@anchor{library/exceptions SyntaxWarning}@anchor{1af}
@deffn {Exception} SyntaxWarning

Base class for warnings about dubious syntax.

This warning is typically emitted when compiling Python source code, and usually won’t be reported
when running already compiled code.
@end deffn

@geindex RuntimeWarning
@anchor{library/exceptions RuntimeWarning}@anchor{4d8}
@deffn {Exception} RuntimeWarning

Base class for warnings about dubious runtime behavior.
@end deffn

@geindex FutureWarning
@anchor{library/exceptions FutureWarning}@anchor{659}
@deffn {Exception} FutureWarning

Base class for warnings about deprecated features when those warnings are
intended for end users of applications that are written in Python.
@end deffn

@geindex ImportWarning
@anchor{library/exceptions ImportWarning}@anchor{71f}
@deffn {Exception} ImportWarning

Base class for warnings about probable mistakes in module imports.

Ignored by the default warning filters. Enabling the @ref{509,,Python Development Mode} shows this warning.
@end deffn

@geindex UnicodeWarning
@anchor{library/exceptions UnicodeWarning}@anchor{1630}
@deffn {Exception} UnicodeWarning

Base class for warnings related to Unicode.
@end deffn

@geindex EncodingWarning
@anchor{library/exceptions EncodingWarning}@anchor{2171}
@deffn {Exception} EncodingWarning

Base class for warnings related to encodings.

See @ref{2182,,Opt-in EncodingWarning} for details.


Added in version 3.10.

@end deffn

@geindex BytesWarning
@anchor{library/exceptions BytesWarning}@anchor{e22}
@deffn {Exception} BytesWarning

Base class for warnings related to @ref{193,,bytes} and @ref{342,,bytearray}.
@end deffn

@geindex ResourceWarning
@anchor{library/exceptions ResourceWarning}@anchor{54d}
@deffn {Exception} ResourceWarning

Base class for warnings related to resource usage.

Ignored by the default warning filters. Enabling the @ref{509,,Python Development Mode} shows this warning.


Added in version 3.2.

@end deffn

@node Exception groups,Exception hierarchy,Warnings,Built-in Exceptions
@anchor{library/exceptions exception-groups}@anchor{275d}@anchor{library/exceptions lib-exception-groups}@anchor{275e}
@subsection Exception groups


The following are used when it is necessary to raise multiple unrelated
exceptions. They are part of the exception hierarchy so they can be
handled with @ref{1ac,,except} like all other exceptions. In addition,
they are recognised by @ref{1ad,,except*}, which matches
their subgroups based on the types of the contained exceptions.

@geindex ExceptionGroup
@anchor{library/exceptions ExceptionGroup}@anchor{4d3}
@deffn {Exception} ExceptionGroup (msg, excs)
@end deffn

@geindex BaseExceptionGroup
@anchor{library/exceptions BaseExceptionGroup}@anchor{566}
@deffn {Exception} BaseExceptionGroup (msg, excs)

Both of these exception types wrap the exceptions in the sequence @code{excs}.
The @code{msg} parameter must be a string. The difference between the two
classes is that @code{BaseExceptionGroup} extends @ref{7d8,,BaseException} and
it can wrap any exception, while @ref{4d3,,ExceptionGroup} extends @ref{bd3,,Exception}
and it can only wrap subclasses of @code{Exception}. This design is so that
@code{except Exception} catches an @code{ExceptionGroup} but not
@code{BaseExceptionGroup}.

The @code{BaseExceptionGroup} constructor returns an @ref{4d3,,ExceptionGroup}
rather than a @code{BaseExceptionGroup} if all contained exceptions are
@ref{bd3,,Exception} instances, so it can be used to make the selection
automatic. The @code{ExceptionGroup} constructor, on the other hand,
raises a @ref{199,,TypeError} if any contained exception is not an
@code{Exception} subclass.

Exception groups are @ref{2410,,generic} over the type of their
contained exceptions.

`CPython implementation detail:' The @code{excs} parameter may be any sequence, but lists and tuples are
specifically processed more efficiently here. For optimal performance,
pass a tuple as @code{excs}.

@geindex message (BaseExceptionGroup attribute)
@anchor{library/exceptions BaseExceptionGroup message}@anchor{275f}
@deffn {Attribute} message

The @code{msg} argument to the constructor. This is a read-only attribute.
@end deffn

@geindex exceptions (BaseExceptionGroup attribute)
@anchor{library/exceptions BaseExceptionGroup exceptions}@anchor{2760}
@deffn {Attribute} exceptions

A tuple of the exceptions in the @code{excs} sequence given to the
constructor. This is a read-only attribute.
@end deffn

@geindex subgroup() (BaseExceptionGroup method)
@anchor{library/exceptions BaseExceptionGroup subgroup}@anchor{1a7f}
@deffn {Method} subgroup (condition)

Returns an exception group that contains only the exceptions from the
current group that match `condition', or @code{None} if the result is empty.

The condition can be an exception type or tuple of exception types, in which
case each exception is checked for a match using the same check that is used
in an @code{except} clause.  The condition can also be a callable (other than
a type object) that accepts an exception as its single argument and returns
true for the exceptions that should be in the subgroup.

The nesting structure of the current exception is preserved in the result,
as are the values of its @ref{275f,,message},
@ref{14d2,,__traceback__}, @ref{14d4,,__cause__},
@ref{14d3,,__context__} and
@ref{272e,,__notes__} fields.
Empty nested groups are omitted from the result.

The condition is checked for all exceptions in the nested exception group,
including the top-level and any nested exception groups. If the condition is
true for such an exception group, it is included in the result in full.


Added in version 3.13: @code{condition} can be any callable which is not a type object.

@end deffn

@geindex split() (BaseExceptionGroup method)
@anchor{library/exceptions BaseExceptionGroup split}@anchor{191e}
@deffn {Method} split (condition)

Like @ref{1a7f,,subgroup()}, but returns the pair @code{(match, rest)} where @code{match}
is @code{subgroup(condition)} and @code{rest} is the remaining non-matching
part.
@end deffn

@geindex derive() (BaseExceptionGroup method)
@anchor{library/exceptions BaseExceptionGroup derive}@anchor{1a7e}
@deffn {Method} derive (excs)

Returns an exception group with the same @ref{275f,,message}, but which
wraps the exceptions in @code{excs}.

This method is used by @ref{1a7f,,subgroup()} and @ref{191e,,split()}, which
are used in various contexts to break up an exception group. A
subclass needs to override it in order to make @code{subgroup()}
and @code{split()} return instances of the subclass rather
than @ref{4d3,,ExceptionGroup}.

@ref{1a7f,,subgroup()} and @ref{191e,,split()} copy the
@ref{14d2,,__traceback__},
@ref{14d4,,__cause__}, @ref{14d3,,__context__} and
@ref{272e,,__notes__} fields from
the original exception group to the one returned by @code{derive()}, so
these fields do not need to be updated by @code{derive()}.

@example
>>> class MyGroup(ExceptionGroup):
...     def derive(self, excs):
...         return MyGroup(self.message, excs)
...
>>> e = MyGroup("eg", [ValueError(1), TypeError(2)])
>>> e.add_note("a note")
>>> e.__context__ = Exception("context")
>>> e.__cause__ = Exception("cause")
>>> try:
...    raise e
... except Exception as e:
...    exc = e
...
>>> match, rest = exc.split(ValueError)
>>> exc, exc.__context__, exc.__cause__, exc.__notes__
(MyGroup('eg', [ValueError(1), TypeError(2)]), Exception('context'), Exception('cause'), ['a note'])
>>> match, match.__context__, match.__cause__, match.__notes__
(MyGroup('eg', [ValueError(1)]), Exception('context'), Exception('cause'), ['a note'])
>>> rest, rest.__context__, rest.__cause__, rest.__notes__
(MyGroup('eg', [TypeError(2)]), Exception('context'), Exception('cause'), ['a note'])
>>> exc.__traceback__ is match.__traceback__ is rest.__traceback__
True
@end example
@end deffn

Note that @code{BaseExceptionGroup} defines @ref{7a1,,__new__()}, so
subclasses that need a different constructor signature need to
override that rather than @ref{8c1,,__init__()}. For example, the following
defines an exception group subclass which accepts an exit_code and
constructs the group’s message from it.

@example
class Errors(ExceptionGroup):
   def __new__(cls, errors, exit_code):
      self = super().__new__(Errors, f"exit code: @{exit_code@}", errors)
      self.exit_code = exit_code
      return self

   def derive(self, excs):
      return Errors(excs, self.exit_code)
@end example

Like @ref{4d3,,ExceptionGroup}, any subclass of @code{BaseExceptionGroup} which
is also a subclass of @ref{bd3,,Exception} can only wrap instances of
@code{Exception}.


Added in version 3.11.

@end deffn

@node Exception hierarchy,,Exception groups,Built-in Exceptions
@anchor{library/exceptions exception-hierarchy}@anchor{2761}
@subsection Exception hierarchy


The class hierarchy for built-in exceptions is:

@example
BaseException
 ├── BaseExceptionGroup
 ├── GeneratorExit
 ├── KeyboardInterrupt
 ├── SystemExit
 └── Exception
      ├── ArithmeticError
      │    ├── FloatingPointError
      │    ├── OverflowError
      │    └── ZeroDivisionError
      ├── AssertionError
      ├── AttributeError
      ├── BufferError
      ├── EOFError
      ├── ExceptionGroup [BaseExceptionGroup]
      ├── ImportError
      │    └── ModuleNotFoundError
      ├── LookupError
      │    ├── IndexError
      │    └── KeyError
      ├── MemoryError
      ├── NameError
      │    └── UnboundLocalError
      ├── OSError
      │    ├── BlockingIOError
      │    ├── ChildProcessError
      │    ├── ConnectionError
      │    │    ├── BrokenPipeError
      │    │    ├── ConnectionAbortedError
      │    │    ├── ConnectionRefusedError
      │    │    └── ConnectionResetError
      │    ├── FileExistsError
      │    ├── FileNotFoundError
      │    ├── InterruptedError
      │    ├── IsADirectoryError
      │    ├── NotADirectoryError
      │    ├── PermissionError
      │    ├── ProcessLookupError
      │    └── TimeoutError
      ├── ReferenceError
      ├── RuntimeError
      │    ├── NotImplementedError
      │    ├── PythonFinalizationError
      │    └── RecursionError
      ├── StopAsyncIteration
      ├── StopIteration
      ├── SyntaxError
      │    └── IndentationError
      │         └── TabError
      ├── SystemError
      ├── TypeError
      ├── ValueError
      │    └── UnicodeError
      │         ├── UnicodeDecodeError
      │         ├── UnicodeEncodeError
      │         └── UnicodeTranslateError
      └── Warning
           ├── BytesWarning
           ├── DeprecationWarning
           ├── EncodingWarning
           ├── FutureWarning
           ├── ImportWarning
           ├── PendingDeprecationWarning
           ├── ResourceWarning
           ├── RuntimeWarning
           ├── SyntaxWarning
           ├── UnicodeWarning
           └── UserWarning
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Thread Safety Guarantees,Text Processing Services,Built-in Exceptions,The Python Standard Library
@anchor{library/threadsafety doc}@anchor{2762}@anchor{library/threadsafety thread-safety-guarantees}@anchor{2763}@anchor{library/threadsafety threadsafety}@anchor{2764}@anchor{library/threadsafety translation-repo}@anchor{2765}
@section Thread Safety Guarantees


This page documents thread-safety guarantees for built-in types in Python’s
free-threaded build. The guarantees described here apply when using Python with
the @ref{165,,GIL} disabled (free-threaded mode). When the GIL is enabled, most
operations are implicitly serialized.

For general guidance on writing thread-safe code in free-threaded Python, see
@ref{2766,,Python support for free threading}.

@menu
* Thread safety levels:: 
* Thread safety for list objects:: 
* Thread safety for dict objects:: 
* Thread safety for set objects:: 
* Thread safety for bytearray objects:: 
* Thread safety for memoryview objects:: 

@end menu

@node Thread safety levels,Thread safety for list objects,,Thread Safety Guarantees
@anchor{library/threadsafety thread-safety-levels}@anchor{2767}@anchor{library/threadsafety threadsafety-levels}@anchor{2768}
@subsection Thread safety levels


The C API documentation uses the following levels to describe the thread
safety guarantees of each function. The levels are listed from least to
most safe.

@menu
* Incompatible:: 
* Compatible:: 
* Safe on distinct objects:: 
* Safe on shared objects:: 
* Atomic:: 

@end menu

@node Incompatible,Compatible,,Thread safety levels
@anchor{library/threadsafety incompatible}@anchor{2769}@anchor{library/threadsafety threadsafety-level-incompatible}@anchor{276a}
@subsubsection Incompatible


A function or operation that cannot be made safe for concurrent use even
with external synchronization. Incompatible code typically accesses
global state in an unsynchronized way and must only be called from a single
thread throughout the program’s lifetime.

Example: a function that modifies process-wide state such as signal handlers
or environment variables, where concurrent calls from any threads, even with
external locking, can conflict with the runtime or other libraries.

@node Compatible,Safe on distinct objects,Incompatible,Thread safety levels
@anchor{library/threadsafety compatible}@anchor{276b}@anchor{library/threadsafety threadsafety-level-compatible}@anchor{276c}
@subsubsection Compatible


A function or operation that is safe to call from multiple threads
`provided' the caller supplies appropriate external synchronization, for
example by holding a @ref{276d,,lock} for the duration of each call. Without
such synchronization, concurrent calls may produce @ref{276e,,race conditions} or @ref{276f,,data races}.

Example: a function that reads from or writes to an object whose internal
state is not protected by a lock. Callers must ensure that no two threads
access the same object at the same time.

@node Safe on distinct objects,Safe on shared objects,Compatible,Thread safety levels
@anchor{library/threadsafety safe-on-distinct-objects}@anchor{2770}@anchor{library/threadsafety threadsafety-level-distinct}@anchor{2771}
@subsubsection Safe on distinct objects


A function or operation that is safe to call from multiple threads without
external synchronization, as long as each thread operates on a `different'
object. Two threads may call the function at the same time, but they must
not pass the same object (or objects that share underlying state) as
arguments.

Example: a function that modifies fields of a struct using non-atomic
writes. Two threads can each call the function on their own struct
instance safely, but concurrent calls on the `same' instance require
external synchronization.

@node Safe on shared objects,Atomic,Safe on distinct objects,Thread safety levels
@anchor{library/threadsafety safe-on-shared-objects}@anchor{2772}@anchor{library/threadsafety threadsafety-level-shared}@anchor{2773}
@subsubsection Safe on shared objects


A function or operation that is safe for concurrent use on the `same'
object. The implementation uses internal synchronization (such as
@ref{2774,,per-object locks} or
@ref{2775,,critical sections}) to protect shared
mutable state, so callers do not need to supply their own locking.

Example: @ref{5fe,,PyList_GetItemRef()} can be called from multiple threads on the
same @ref{2776,,PyListObject} - it uses internal synchronization to serialize
access.

@node Atomic,,Safe on shared objects,Thread safety levels
@anchor{library/threadsafety atomic}@anchor{2777}@anchor{library/threadsafety threadsafety-level-atomic}@anchor{2778}
@subsubsection Atomic


A function or operation that appears @ref{2779,,atomic} with
respect to other threads - it executes instantaneously from the perspective
of other threads. This is the strongest form of thread safety.

Example: @ref{461,,PyMutex_IsLocked()} performs an atomic read of the mutex
state and can be called from any thread at any time.

@node Thread safety for list objects,Thread safety for dict objects,Thread safety levels,Thread Safety Guarantees
@anchor{library/threadsafety thread-safety-for-list-objects}@anchor{277a}@anchor{library/threadsafety thread-safety-list}@anchor{265b}
@subsection Thread safety for list objects


Reading a single element from a @ref{24f,,list} is
@ref{2779,,atomic}:

@example
lst[i]   # list.__getitem__
@end example

The following methods traverse the list and use @ref{2779,,atomic}
reads of each item to perform their function. That means that they may
return results affected by concurrent modifications:

@example
item in lst
lst.index(item)
lst.count(item)
@end example

All of the above operations avoid acquiring @ref{2774,,per-object locks}. They do not block concurrent modifications. Other
operations that hold a lock will not block these from observing intermediate
states.

All other operations from here on block using the @ref{2774,,per-object lock}.

Writing a single item via @code{lst[i] = x} is safe to call from multiple
threads and will not corrupt the list.

The following operations return new objects and appear
@ref{2779,,atomic} to other threads:

@example
lst1 + lst2    # concatenates two lists into a new list
x * lst        # repeats lst x times into a new list
lst.copy()     # returns a shallow copy of the list
@end example

The following methods that only operate on a single element with no shifting
required are @ref{2779,,atomic}:

@example
lst.append(x)  # append to the end of the list, no shifting required
lst.pop()      # pop element from the end of the list, no shifting required
@end example

The @ref{603,,clear()} method is also @ref{2779,,atomic}.
Other threads cannot observe elements being removed.

The @ref{dce,,sort()} method is not @ref{2779,,atomic}.
Other threads cannot observe intermediate states during sorting, but the
list appears empty for the duration of the sort.

The following operations may allow @ref{277b,,lock-free} operations to observe
intermediate states since they modify multiple elements in place:

@example
lst.insert(idx, item)  # shifts elements
lst.pop(idx)           # idx not at the end of the list, shifts elements
lst *= x               # copies elements in place
@end example

The @ref{1aa1,,remove()} method may allow concurrent modifications since
element comparison may execute arbitrary Python code (via
@ref{cf8,,__eq__()}).

@ref{602,,extend()} is safe to call from multiple threads.  However, its
guarantees depend on the iterable passed to it. If it is a @ref{24f,,list}, a
@ref{614,,tuple}, a @ref{185,,set}, a @ref{7f3,,frozenset}, a @ref{184,,dict} or a
@ref{26ee,,dictionary view object} (but not their subclasses), the
@code{extend} operation is safe from concurrent modifications to the iterable.
Otherwise, an iterator is created which can be concurrently modified by
another thread.  The same applies to inplace concatenation of a list with
other iterables when using @code{lst += iterable}.

Similarly, assigning to a list slice with @code{lst[i:j] = iterable} is safe
to call from multiple threads, but @code{iterable} is only locked when it is
also a @ref{24f,,list} (but not its subclasses).

Operations that involve multiple accesses, as well as iteration, are never
atomic. For example:

@example
# NOT atomic: read-modify-write
lst[i] = lst[i] + 1

# NOT atomic: check-then-act
if lst:
    item = lst.pop()

# NOT thread-safe: iteration while modifying
for item in lst:
    process(item)  # another thread may modify lst
@end example

Consider external synchronization when sharing @ref{24f,,list} instances
across threads.

@node Thread safety for dict objects,Thread safety for set objects,Thread safety for list objects,Thread Safety Guarantees
@anchor{library/threadsafety thread-safety-dict}@anchor{26ef}@anchor{library/threadsafety thread-safety-for-dict-objects}@anchor{277c}
@subsection Thread safety for dict objects


Creating a dictionary with the @ref{184,,dict} constructor is atomic when the
argument to it is a @code{dict} or a @ref{614,,tuple}. When using the
@ref{250,,dict.fromkeys()} method, dictionary creation is atomic when the
argument is a @code{dict}, @code{tuple}, @ref{185,,set} or
@ref{7f3,,frozenset}.

The following operations and functions are @ref{277b,,lock-free} and
@ref{2779,,atomic}.

@example
d[key]       # dict.__getitem__
d.get(key)   # dict.get
key in d     # dict.__contains__
len(d)       # dict.__len__
@end example

All other operations from here on hold the @ref{2774,,per-object lock}.

Writing or removing a single item is safe to call from multiple threads
and will not corrupt the dictionary:

@example
d[key] = value        # write
del d[key]            # delete
d.pop(key)            # remove and return
d.popitem()           # remove and return last item
d.setdefault(key, v)  # insert if missing
@end example

These operations may compare keys using @ref{cf8,,__eq__()}, which can
execute arbitrary Python code. During such comparisons, the dictionary may
be modified by another thread. For built-in types like @ref{16a,,str},
@ref{19c,,int}, and @ref{197,,float}, that implement @code{__eq__()} in C,
the underlying lock is not released during comparisons and this is not a
concern.

The following operations return new objects and hold the @ref{2774,,per-object lock}
for the duration of the operation:

@example
d.copy()      # returns a shallow copy of the dictionary
d | other     # merges two dicts into a new dict
d.keys()      # returns a new dict_keys view object
d.values()    # returns a new dict_values view object
d.items()     # returns a new dict_items view object
@end example

The @ref{17ab,,clear()} method holds the lock for its duration. Other
threads cannot observe elements being removed.

The following operations lock both dictionaries. For @ref{1671,,update()}
and @code{|=}, this applies only when the other operand is a @ref{184,,dict}
that uses the standard dict iterator (but not subclasses that override
iteration). For equality comparison, this applies to @code{dict} and
its subclasses:

@example
d.update(other_dict)  # both locked when other_dict is a dict
d |= other_dict       # both locked when other_dict is a dict
d == other_dict       # both locked for dict and subclasses
@end example

All comparison operations also compare values using @ref{cf8,,__eq__()},
so for non-built-in types the lock may be released during comparison.

@ref{250,,fromkeys()} locks both the new dictionary and the iterable
when the iterable is exactly a @ref{184,,dict}, @ref{185,,set}, or
@ref{7f3,,frozenset} (not subclasses):

@example
dict.fromkeys(a_dict)      # locks both
dict.fromkeys(a_set)       # locks both
dict.fromkeys(a_frozenset) # locks both
@end example

When updating from a non-dict iterable, only the target dictionary is
locked. The iterable may be concurrently modified by another thread:

@example
d.update(iterable)        # iterable is not a dict: only d locked
d |= iterable             # iterable is not a dict: only d locked
dict.fromkeys(iterable)   # iterable is not a dict/set/frozenset: only result locked
@end example

Operations that involve multiple accesses, as well as iteration, are never
atomic:

@example
# NOT atomic: read-modify-write
d[key] = d[key] + 1

# NOT atomic: check-then-act (TOCTOU)
if key in d:
    del d[key]

# NOT thread-safe: iteration while modifying
for key, value in d.items():
    process(key)  # another thread may modify d
@end example

To avoid time-of-check to time-of-use (TOCTOU) issues, use atomic
operations or handle exceptions:

@example
# Use pop() with default instead of check-then-delete
d.pop(key, None)

# Or handle the exception
try:
    del d[key]
except KeyError:
    pass
@end example

To safely iterate over a dictionary that may be modified by another
thread, iterate over a copy:

@example
# Make a copy to iterate safely
for key, value in d.copy().items():
    process(key)
@end example

Consider external synchronization when sharing @ref{184,,dict} instances
across threads.

@node Thread safety for set objects,Thread safety for bytearray objects,Thread safety for dict objects,Thread Safety Guarantees
@anchor{library/threadsafety thread-safety-for-set-objects}@anchor{277d}@anchor{library/threadsafety thread-safety-set}@anchor{26ec}
@subsection Thread safety for set objects


The @ref{841,,len()} function is lock-free and @ref{2779,,atomic}.

The following read operation is lock-free. It does not block concurrent
modifications and may observe intermediate states from operations that
hold the per-object lock:

@example
elem in s    # set.__contains__
@end example

This operation may compare elements using @ref{cf8,,__eq__()}, which can
execute arbitrary Python code. During such comparisons, the set may be
modified by another thread. For built-in types like @ref{16a,,str},
@ref{19c,,int}, and @ref{197,,float}, @code{__eq__()} does not release the
underlying lock during comparisons and this is not a concern.

All other operations from here on hold the per-object lock.

Adding or removing a single element is safe to call from multiple threads
and will not corrupt the set:

@example
s.add(elem)      # add element
s.remove(elem)   # remove element, raise if missing
s.discard(elem)  # remove element if present
s.pop()          # remove and return arbitrary element
@end example

These operations also compare elements, so the same @ref{cf8,,__eq__()}
considerations as above apply.

The @ref{26e6,,copy()} method returns a new object and holds the per-object lock
for the duration so that it is always atomic.

The @ref{26eb,,clear()} method holds the lock for its duration. Other
threads cannot observe elements being removed.

The following operations only accept @ref{185,,set} or @ref{7f3,,frozenset}
as operands and always lock both objects:

@example
s |= other                   # other must be set/frozenset
s &= other                   # other must be set/frozenset
s -= other                   # other must be set/frozenset
s ^= other                   # other must be set/frozenset
s & other                    # other must be set/frozenset
s | other                    # other must be set/frozenset
s - other                    # other must be set/frozenset
s ^ other                    # other must be set/frozenset
@end example

@ref{26e7,,set.update()}, @ref{26e0,,set.union()}, @ref{1bc8,,set.intersection()} and
@ref{26e2,,set.difference()} can take multiple iterables as arguments. They all
iterate through all the passed iterables and do the following:

@quotation


@itemize *

@item 

@table @asis

@item @ref{26e7,,set.update()} and @ref{26e0,,set.union()} lock both objects only when

the other operand is a @ref{185,,set}, @ref{7f3,,frozenset}, or @ref{184,,dict}.
@end table

@item 

@table @asis

@item @ref{1bc8,,set.intersection()} and @ref{26e2,,set.difference()} always try to lock

all objects.
@end table
@end itemize
@end quotation

@ref{26e4,,set.symmetric_difference()} tries to lock both objects.

The update variants of the above methods also have some differences between
them:

@quotation


@itemize *

@item 

@table @asis

@item @ref{26e8,,set.difference_update()} and @ref{1691,,set.intersection_update()} try

to lock all objects one-by-one.
@end table

@item 

@table @asis

@item @ref{1692,,set.symmetric_difference_update()} only locks the arguments if it is

of type @ref{185,,set}, @ref{7f3,,frozenset}, or @ref{184,,dict}.
@end table
@end itemize
@end quotation

The following methods always try to lock both objects:

@example
s.isdisjoint(other)          # both locked
s.issubset(other)            # both locked
s.issuperset(other)          # both locked
@end example

Operations that involve multiple accesses, as well as iteration, are never
atomic:

@example
# NOT atomic: check-then-act
if elem in s:
      s.remove(elem)

# NOT thread-safe: iteration while modifying
for elem in s:
      process(elem)  # another thread may modify s
@end example

Consider external synchronization when sharing @ref{185,,set} instances
across threads.  See @ref{2766,,Python support for free threading} for more information.

@node Thread safety for bytearray objects,Thread safety for memoryview objects,Thread safety for set objects,Thread Safety Guarantees
@anchor{library/threadsafety thread-safety-bytearray}@anchor{26a4}@anchor{library/threadsafety thread-safety-for-bytearray-objects}@anchor{277e}
@subsection Thread safety for bytearray objects


@quotation

The @ref{841,,len()} function is lock-free and @ref{2779,,atomic}.

Concatenation and comparisons use the buffer protocol, which prevents
resizing but does not hold the per-object lock. These operations may
observe intermediate states from concurrent modifications:

@example
ba + other    # may observe concurrent writes
ba == other   # may observe concurrent writes
ba < other    # may observe concurrent writes
@end example

All other operations from here on hold the per-object lock.

Reading a single element or slice is safe to call from multiple threads:

@example
ba[i]        # bytearray.__getitem__
ba[i:j]      # slice
@end example

The following operations are safe to call from multiple threads and will
not corrupt the bytearray:

@example
ba[i] = x         # write single byte
ba[i:j] = values  # write slice
ba.append(x)      # append single byte
ba.extend(other)  # extend with iterable
ba.insert(i, x)   # insert single byte
ba.pop()          # remove and return last byte
ba.pop(i)         # remove and return byte at index
ba.remove(x)      # remove first occurrence
ba.reverse()      # reverse in place
ba.clear()        # remove all bytes
@end example

Slice assignment locks both objects when `values' is a @ref{342,,bytearray}:

@example
ba[i:j] = other_bytearray  # both locked
@end example

The following operations return new objects and hold the per-object lock
for the duration:

@example
ba.copy()     # returns a shallow copy
ba * n        # repeat into new bytearray
@end example

The membership test holds the lock for its duration:

@example
x in ba       # bytearray.__contains__
@end example

All other bytearray methods (such as @ref{15af,,find()},
@ref{26ac,,replace()}, @ref{17ea,,split()},
@ref{26aa,,decode()}, etc.) hold the per-object lock for their
duration.

Operations that involve multiple accesses, as well as iteration, are never
atomic:

@example
# NOT atomic: check-then-act
if x in ba:
    ba.remove(x)

# NOT thread-safe: iteration while modifying
for byte in ba:
    process(byte)  # another thread may modify ba
@end example

To safely iterate over a bytearray that may be modified by another
thread, iterate over a copy:

@example
# Make a copy to iterate safely
for byte in ba.copy():
    process(byte)
@end example

Consider external synchronization when sharing @ref{342,,bytearray} instances
across threads.  See @ref{2766,,Python support for free threading} for more information.
@end quotation

@node Thread safety for memoryview objects,,Thread safety for bytearray objects,Thread Safety Guarantees
@anchor{library/threadsafety thread-safety-for-memoryview-objects}@anchor{277f}@anchor{library/threadsafety thread-safety-memoryview}@anchor{2458}
@subsection Thread safety for memoryview objects


@ref{166,,memoryview} objects provide access to the internal data of an
underlying object without copying. Thread safety depends on both the
memoryview itself and the underlying buffer exporter.

The memoryview implementation uses atomic operations to track its own
exports in the @ref{1791,,free-threaded build}. Creating and
releasing a memoryview are thread-safe. Attribute access (e.g.,
@ref{26d3,,shape}, @ref{26ca,,format}) reads fields that
are immutable for the lifetime of the memoryview, so concurrent reads
are safe as long as the memoryview has not been released.

However, the actual data accessed through the memoryview is owned by the
underlying object. Concurrent access to this data is only safe if the
underlying object supports it:


@itemize *

@item 
For immutable objects like @ref{193,,bytes}, concurrent reads through
multiple memoryviews are safe.

@item 
For mutable objects like @ref{342,,bytearray}, reading and writing the
same memory region from multiple threads without external
synchronization is not safe and may result in data corruption.
Note that even read-only memoryviews of mutable objects do not
prevent data races if the underlying object is modified from
another thread.
@end itemize

@example
# NOT safe: concurrent writes to the same buffer
data = bytearray(1000)
view = memoryview(data)
# Thread 1: view[0:500] = b'x' * 500
# Thread 2: view[0:500] = b'y' * 500
@end example

@example
# Safe: use a lock for concurrent access
import threading
lock = threading.Lock()
data = bytearray(1000)
view = memoryview(data)

with lock:
    view[0:500] = b'x' * 500
@end example

Resizing or reallocating the underlying object (such as calling
@ref{17aa,,bytearray.resize()}) while a memoryview is exported raises
@ref{17e9,,BufferError}. This is enforced regardless of threading.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)
@anchor{library/text stringservices}@anchor{2692}
@node Text Processing Services,Binary Data Services,Thread Safety Guarantees,The Python Standard Library
@anchor{library/text doc}@anchor{2780}@anchor{library/text text-processing-services}@anchor{2781}@anchor{library/text textservices}@anchor{2695}@anchor{library/text translation-repo}@anchor{2782}
@section Text Processing Services


The modules described in this chapter provide a wide range of string
manipulation operations and other text processing services.

The @ref{1c,,codecs} module described under @ref{2783,,Binary Data Services} is also
highly relevant to text processing. In addition, see the documentation for
Python’s built-in string type in @ref{2023,,Text Sequence Type — str}.

@menu
* string — Common string operations:: 
* string.templatelib — Support for template string literals: string templatelib — Support for template string literals. 
* re — Regular expression operations:: 
* difflib — Helpers for computing deltas:: 
* textwrap — Text wrapping and filling:: 
* unicodedata — Unicode Database:: 
* stringprep — Internet String Preparation:: 
* readline — GNU readline interface:: 
* rlcompleter — Completion function for GNU readline:: 

@end menu

@node string — Common string operations,string templatelib — Support for template string literals,,Text Processing Services
@anchor{library/string doc}@anchor{2784}@anchor{library/string module-string}@anchor{d8}@anchor{library/string string-common-string-operations}@anchor{2785}
@subsection @code{string} — Common string operations


@geindex module; string

`Source code:' Lib/string/__init__.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/string/__init__.py}


__________________________________________________________________



@subsubheading See also


@ref{2023,,Text Sequence Type — str}

@ref{2024,,String Methods}


@menu
* String constants:: 
* Custom string formatting:: 
* Format string syntax:: 
* Template strings ($-strings): Template strings $-strings. 
* Helper functions:: 

@end menu

@node String constants,Custom string formatting,,string — Common string operations
@anchor{library/string string-constants}@anchor{2786}
@subsubsection String constants


The constants defined in this module are:

@geindex ascii_letters (in module string)
@anchor{library/string string ascii_letters}@anchor{14cf}
@deffn {Data} string.ascii_letters

The concatenation of the @ref{2787,,ascii_lowercase} and @ref{2788,,ascii_uppercase}
constants described below.  This value is not locale-dependent.
@end deffn

@geindex ascii_lowercase (in module string)
@anchor{library/string string ascii_lowercase}@anchor{2787}
@deffn {Data} string.ascii_lowercase

The lowercase letters @code{'abcdefghijklmnopqrstuvwxyz'}.  This value is not
locale-dependent and will not change.
@end deffn

@geindex ascii_uppercase (in module string)
@anchor{library/string string ascii_uppercase}@anchor{2788}
@deffn {Data} string.ascii_uppercase

The uppercase letters @code{'ABCDEFGHIJKLMNOPQRSTUVWXYZ'}.  This value is not
locale-dependent and will not change.
@end deffn

@geindex digits (in module string)
@anchor{library/string string digits}@anchor{2789}
@deffn {Data} string.digits

The string @code{'0123456789'}.
@end deffn

@geindex hexdigits (in module string)
@anchor{library/string string hexdigits}@anchor{278a}
@deffn {Data} string.hexdigits

The string @code{'0123456789abcdefABCDEF'}.
@end deffn

@geindex octdigits (in module string)
@anchor{library/string string octdigits}@anchor{278b}
@deffn {Data} string.octdigits

The string @code{'01234567'}.
@end deffn

@geindex punctuation (in module string)
@anchor{library/string string punctuation}@anchor{278c}
@deffn {Data} string.punctuation

String of ASCII characters which are considered punctuation characters
in the @code{C} locale: @code{!"#$%&'()*+,-./:;<=>?@@[\]^_`@{|@}~}.
@end deffn

@geindex printable (in module string)
@anchor{library/string string printable}@anchor{18fd}
@deffn {Data} string.printable

String of ASCII characters which are considered printable by Python.
This is a combination of @ref{2789,,digits}, @ref{14cf,,ascii_letters},
@ref{278c,,punctuation}, and @ref{278d,,whitespace}.

@cartouche
@quotation Note 
By design, @ref{fde,,string.printable.isprintable()}
returns @ref{d31,,False}. In particular, @code{string.printable} is not
printable in the POSIX sense (see @code{LC_CTYPE@footnote{https://manpages.debian.org/locale(5)}}).
@end quotation
@end cartouche
@end deffn

@geindex whitespace (in module string)
@anchor{library/string string whitespace}@anchor{278d}
@deffn {Data} string.whitespace

A string containing all ASCII characters that are considered whitespace.
This includes the characters space, tab, linefeed, return, formfeed, and
vertical tab.
@end deffn

@node Custom string formatting,Format string syntax,String constants,string — Common string operations
@anchor{library/string custom-string-formatting}@anchor{278e}@anchor{library/string string-formatting}@anchor{2694}
@subsubsection Custom string formatting


The built-in string class provides the ability to do complex variable
substitutions and value formatting via the @ref{834,,format()} method described in
@geindex Python Enhancement Proposals; PEP 3101
PEP 3101@footnote{https://peps.python.org/pep-3101/}.  The @ref{10c3,,Formatter} class in the @code{string} module allows
you to create and customize your own string formatting behaviors using the same
implementation as the built-in @code{format()} method.

@geindex Formatter (class in string)
@anchor{library/string string Formatter}@anchor{10c3}
@deffn {Class} string.Formatter

The @code{Formatter} class has the following public methods:

@geindex format() (string.Formatter method)
@anchor{library/string string Formatter format}@anchor{e00}
@deffn {Method} format (format_string, /, *args, **kwargs)

The primary API method.  It takes a format string and
an arbitrary set of positional and keyword arguments.
It is just a wrapper that calls @ref{278f,,vformat()}.


Changed in version 3.7: A format string argument is now @ref{c7e,,positional-only}.

@end deffn

@geindex vformat() (string.Formatter method)
@anchor{library/string string Formatter vformat}@anchor{278f}
@deffn {Method} vformat (format_string, args, kwargs)

This function does the actual work of formatting.  It is exposed as a
separate function for cases where you want to pass in a predefined
dictionary of arguments, rather than unpacking and repacking the
dictionary as individual arguments using the @code{*args} and @code{**kwargs}
syntax.  @code{vformat()} does the work of breaking up the format string
into character data and replacement fields.  It calls the various
methods described below.
@end deffn

In addition, the @code{Formatter} defines a number of methods that are
intended to be replaced by subclasses:

@geindex parse() (string.Formatter method)
@anchor{library/string string Formatter parse}@anchor{2790}
@deffn {Method} parse (format_string)

Loop over the format_string and return an iterable of tuples
(`literal_text', `field_name', `format_spec', `conversion').  This is used
by @ref{278f,,vformat()} to break the string into either literal text, or
replacement fields.

The values in the tuple conceptually represent a span of literal text
followed by a single replacement field.  If there is no literal text
(which can happen if two replacement fields occur consecutively), then
`literal_text' will be a zero-length string.  If there is no replacement
field, then the values of `field_name', `format_spec' and `conversion'
will be @code{None}. The value of `field_name' is unmodified and
auto-numbering of non-numbered positional fields is done by @ref{278f,,vformat()}.
@end deffn

@geindex get_field() (string.Formatter method)
@anchor{library/string string Formatter get_field}@anchor{2791}
@deffn {Method} get_field (field_name, args, kwargs)

Given `field_name', convert it to an object to be formatted.
Auto-numbering of `field_name' returned from @ref{2790,,parse()} is done by
@ref{278f,,vformat()} before calling this method.  Returns a tuple (obj, used_key).
The default version takes strings of the form defined in 
@geindex Python Enhancement Proposals; PEP 3101
PEP 3101@footnote{https://peps.python.org/pep-3101/},
such as “0[name]” or “label.title”. `args' and `kwargs' are as passed in to
@code{vformat()}. The return value `used_key' has the same meaning
as the `key' parameter to @ref{2792,,get_value()}.
@end deffn

@geindex get_value() (string.Formatter method)
@anchor{library/string string Formatter get_value}@anchor{2792}
@deffn {Method} get_value (key, args, kwargs)

Retrieve a given field value.  The `key' argument will be either an
integer or a string.  If it is an integer, it represents the index of the
positional argument in `args'; if it is a string, then it represents a
named argument in `kwargs'.

The `args' parameter is set to the list of positional arguments to
@ref{278f,,vformat()}, and the `kwargs' parameter is set to the dictionary of
keyword arguments.

For compound field names, these functions are only called for the first
component of the field name; subsequent components are handled through
normal attribute and indexing operations.

So for example, the field expression ‘0.name’ would cause
@code{get_value()} to be called with a `key' argument of 0.  The @code{name}
attribute will be looked up after @code{get_value()} returns by calling the
built-in @ref{dd0,,getattr()} function.

If the index or keyword refers to an item that does not exist, then an
@ref{1741,,IndexError} or @ref{5e7,,KeyError} should be raised.
@end deffn

@geindex check_unused_args() (string.Formatter method)
@anchor{library/string string Formatter check_unused_args}@anchor{2793}
@deffn {Method} check_unused_args (used_args, args, kwargs)

Implement checking for unused arguments if desired.  The arguments to this
function is the set of all argument keys that were actually referred to in
the format string (integers for positional arguments, and strings for
named arguments), and a reference to the `args' and `kwargs' that was
passed to vformat.  The set of unused args can be calculated from these
parameters.  @code{check_unused_args()} is assumed to raise an exception if
the check fails.
@end deffn

@geindex format_field() (string.Formatter method)
@anchor{library/string string Formatter format_field}@anchor{2794}
@deffn {Method} format_field (value, format_spec)

@code{format_field()} simply calls the global @ref{19a,,format()} built-in.  The
method is provided so that subclasses can override it.
@end deffn

@geindex convert_field() (string.Formatter method)
@anchor{library/string string Formatter convert_field}@anchor{2795}
@deffn {Method} convert_field (value, conversion)

Converts the value (returned by @ref{2791,,get_field()}) given a conversion type
(as in the tuple returned by the @ref{2790,,parse()} method).  The default
version understands ‘s’ (str), ‘r’ (repr) and ‘a’ (ascii) conversion
types.
@end deffn
@end deffn

@node Format string syntax,Template strings $-strings,Custom string formatting,string — Common string operations
@anchor{library/string format-string-syntax}@anchor{2796}@anchor{library/string formatstrings}@anchor{15a7}
@subsubsection Format string syntax


The @ref{834,,str.format()} method and the @ref{10c3,,Formatter} class share the same
syntax for format strings (although in the case of @code{Formatter},
subclasses can define their own format string syntax).  The syntax is
related to that of @ref{19b,,formatted string literals} and
@ref{1844,,template string literals}, but it is less sophisticated
and, in particular, does not support arbitrary expressions in interpolations.

@geindex @{@} (curly brackets); in string formatting
@geindex . (dot); in string formatting
@geindex [] (square brackets); in string formatting
@geindex ! (exclamation); in string formatting
@geindex ; (colon); in string formatting

Format strings contain “replacement fields” surrounded by curly braces @code{@{@}}.
Anything that is not contained in braces is considered literal text, which is
copied unchanged to the output.  If you need to include a brace character in the
literal text, it can be escaped by doubling: @code{@{@{} and @code{@}@}}.

The grammar for a replacement field is as follows:

@example
@anchor{library/string grammar-token-format-string-replacement_field}@anchor{2797}replacement_field: "@{" [@ref{2798,,field_name}] ["!" @ref{2799,,conversion}] [":" @ref{279a,,format_spec}] "@}"
@anchor{library/string grammar-token-format-string-field_name}@anchor{2798}field_name:        @ref{279b,,arg_name} ("." @ref{279c,,attribute_name} | "[" @ref{279d,,element_index} "]")*
@anchor{library/string grammar-token-format-string-arg_name}@anchor{279b}arg_name:          [@ref{2305,,identifier} | @ref{2356,,digit}+]
@anchor{library/string grammar-token-format-string-attribute_name}@anchor{279c}attribute_name:    @ref{2305,,identifier}
@anchor{library/string grammar-token-format-string-element_index}@anchor{279d}element_index:     @ref{2356,,digit}+ | @ref{279e,,index_string}
@anchor{library/string grammar-token-format-string-index_string}@anchor{279e}index_string:      <any source character except "]"> +
@anchor{library/string grammar-token-format-string-conversion}@anchor{2799}conversion:        "r" | "s" | "a"
@anchor{library/string grammar-token-format-string-format_spec}@anchor{279a}format_spec:       @ref{279f,,format-spec;format_spec}
@end example

In less formal terms, the replacement field can start with a `field_name' that specifies
the object whose value is to be formatted and inserted
into the output instead of the replacement field.
The `field_name' is optionally followed by a  `conversion' field, which is
preceded by an exclamation point @code{'!'}, and a `format_spec', which is preceded
by a colon @code{':'}.  These specify a non-default format for the replacement value.

See also the @ref{4fa,,Format specification mini-language} section.

The `field_name' itself begins with an `arg_name' that is either a number or a
keyword.  If it’s a number, it refers to a positional argument, and if it’s a keyword,
it refers to a named keyword argument. An `arg_name' is treated as a number if
a call to @ref{2670,,str.isdecimal()} on the string would return true.
If the numerical arg_names in a format string
are 0, 1, 2, … in sequence, they can all be omitted (not just some)
and the numbers 0, 1, 2, … will be automatically inserted in that order.
Because `arg_name' is not quote-delimited, it is not possible to specify arbitrary
dictionary keys (e.g., the strings @code{'10'} or @code{':-]'}) within a format string.
The `arg_name' can be followed by any number of index or
attribute expressions. An expression of the form @code{'.name'} selects the named
attribute using @ref{dd0,,getattr()}, while an expression of the form @code{'[index]'}
does an index lookup using @ref{588,,__getitem__()}.


Changed in version 3.1: The positional argument specifiers can be omitted for @ref{834,,str.format()},
so @code{'@{@} @{@}'.format(a, b)} is equivalent to @code{'@{0@} @{1@}'.format(a, b)}.



Changed in version 3.4: The positional argument specifiers can be omitted for @ref{10c3,,Formatter}.


Some simple format string examples:

@example
"First, thou shalt count to @{0@}"  # References first positional argument
"Bring me a @{@}"                   # Implicitly references the first positional argument
"From @{@} to @{@}"                   # Same as "From @{0@} to @{1@}"
"My quest is @{name@}"              # References keyword argument 'name'
"Weight in tons @{0.weight@}"       # 'weight' attribute of first positional arg
"Units destroyed: @{players[0]@}"   # First element of keyword argument 'players'.
@end example
@anchor{library/string formatstrings-conversion}@anchor{27a0}
The `conversion' field causes a type coercion before formatting.  Normally, the
job of formatting a value is done by the @ref{832,,__format__()} method of the value
itself.  However, in some cases it is desirable to force a type to be formatted
as a string, overriding its own definition of formatting.  By converting the
value to a string before calling @code{__format__()}, the normal formatting logic
is bypassed.

Three conversion flags are currently supported: @code{'!s'} which calls @ref{16a,,str()}
on the value, @code{'!r'} which calls @ref{1c3,,repr()} and @code{'!a'} which calls
@ref{15f2,,ascii()}.

Some examples:

@example
"Harold's a clever @{0!s@}"        # Calls str() on the argument first
"Bring out the holy @{name!r@}"    # Calls repr() on the argument first
"More @{!a@}"                      # Calls ascii() on the argument first
@end example

The `format_spec' field contains a specification of how the value should be
presented, including such details as field width, alignment, padding, decimal
precision and so on.  Each value type can define its own “formatting
mini-language” or interpretation of the `format_spec'.

Most built-in types support a common formatting mini-language, which is
described in the next section.

A `format_spec' field can also include nested replacement fields within it.
These nested replacement fields may contain a field name, conversion flag
and format specification, but deeper nesting is
not allowed.  The replacement fields within the
format_spec are substituted before the `format_spec' string is interpreted.
This allows the formatting of a value to be dynamically specified.

See the @ref{27a1,,Format examples} section for some examples.

@menu
* Format specification mini-language:: 
* Format examples:: 

@end menu

@node Format specification mini-language,Format examples,,Format string syntax
@anchor{library/string format-specification-mini-language}@anchor{27a2}@anchor{library/string formatspec}@anchor{4fa}
@subsubsection Format specification mini-language


“Format specifications” are used within replacement fields contained within a
format string to define how individual values are presented (see
@ref{15a7,,Format string syntax}, @ref{19b,,f-strings}, and @ref{1844,,t-strings}).
They can also be passed directly to the built-in
@ref{19a,,format()} function.  Each formattable type may define how the format
specification is to be interpreted.

Most built-in types implement the following options for format specifications,
although some of the formatting options are only supported by the numeric types.

A general convention is that an empty format specification produces
the same result as if you had called @ref{16a,,str()} on the value. A
non-empty format specification typically modifies the result.

The general form of a `standard format specifier' is:

@example
@anchor{library/string grammar-token-format-spec-format_spec}@anchor{279f}format_spec:             [@ref{27a3,,options}][@ref{27a4,,width_and_precision}][@ref{27a5,,type}]
@anchor{library/string grammar-token-format-spec-options}@anchor{27a3}options:                 [[@ref{27a6,,fill}]@ref{27a7,,align}][@ref{27a8,,sign}]["z"]["#"]["0"]
@anchor{library/string grammar-token-format-spec-fill}@anchor{27a6}fill:                    <any character>
@anchor{library/string grammar-token-format-spec-align}@anchor{27a7}align:                   "<" | ">" | "=" | "^"
@anchor{library/string grammar-token-format-spec-sign}@anchor{27a8}sign:                    "+" | "-" | " "
@anchor{library/string grammar-token-format-spec-width_and_precision}@anchor{27a4}width_and_precision:     [@ref{27a9,,width_with_grouping}][@ref{27aa,,precision_with_grouping}]
@anchor{library/string grammar-token-format-spec-width_with_grouping}@anchor{27a9}width_with_grouping:     [@ref{27ab,,width}][@ref{27ac,,grouping}]
@anchor{library/string grammar-token-format-spec-precision_with_grouping}@anchor{27aa}precision_with_grouping: "." [@ref{27ad,,precision}][@ref{27ac,,grouping}] | "." @ref{27ac,,grouping}
@anchor{library/string grammar-token-format-spec-width}@anchor{27ab}width:                   @ref{2356,,digit}+
@anchor{library/string grammar-token-format-spec-precision}@anchor{27ad}precision:               @ref{2356,,digit}+
@anchor{library/string grammar-token-format-spec-grouping}@anchor{27ac}grouping:                "," | "_"
@anchor{library/string grammar-token-format-spec-type}@anchor{27a5}type:                    "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g"
                         | "G" | "n" | "o" | "s" | "x" | "X" | "%"
@end example

If a valid `align' value is specified, it can be preceded by a `fill'
character that can be any character and defaults to a space if omitted.
It is not possible to use a literal curly brace (”@code{@{}” or “@code{@}}”) as
the `fill' character in a @ref{19b,,formatted string literal} or when using the @ref{834,,str.format()}
method.  However, it is possible to insert a curly brace
with a nested replacement field.  This limitation doesn’t
affect the @ref{19a,,format()} function.

The meaning of the various alignment options is as follows:

@geindex < (less); in string formatting
@geindex > (greater); in string formatting
@geindex = (equals); in string formatting
@geindex ^ (caret); in string formatting


@multitable {xxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Option

@tab

Meaning

@item

@code{'<'}

@tab

Forces the field to be left-aligned within the available
space (this is the default for most objects).

@item

@code{'>'}

@tab

Forces the field to be right-aligned within the
available space (this is the default for numbers).

@item

@code{'='}

@tab

Forces the padding to be placed after the sign (if any)
but before the digits.  This is used for printing fields
in the form ‘+000000120’. This alignment option is only
valid for numeric types, excluding @ref{198,,complex}.
It becomes the default for numbers when ‘0’ immediately
precedes the field width.

@item

@code{'^'}

@tab

Forces the field to be centered within the available
space.

@end multitable


Note that unless a minimum field width is defined, the field width will always
be the same size as the data to fill it, so that the alignment option has no
meaning in this case.

The `sign' option is only valid for number types, and can be one of the
following:

@geindex + (plus); in string formatting
@geindex - (minus); in string formatting
@geindex space; in string formatting


@multitable {xxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Option

@tab

Meaning

@item

@code{'+'}

@tab

Indicates that a sign should be used for both
positive as well as negative numbers.

@item

@code{'-'}

@tab

Indicates that a sign should be used only for negative
numbers (this is the default behavior).

@item

space

@tab

Indicates that a leading space should be used on
positive numbers, and a minus sign on negative numbers.

@end multitable


@geindex z; in string formatting

The @code{'z'} option coerces negative zero floating-point values to positive
zero after rounding to the format precision.  This option is only valid for
floating-point presentation types.


Changed in version 3.11: Added the @code{'z'} option (see also 
@geindex Python Enhancement Proposals; PEP 682
PEP 682@footnote{https://peps.python.org/pep-0682/}).


@geindex # (hash); in string formatting

The @code{'#'} option causes the “alternate form” to be used for the
conversion.  The alternate form is defined differently for different
types.  This option is only valid for integer, float and complex
types. For integers, when binary, octal, or hexadecimal output
is used, this option adds the respective prefix @code{'0b'}, @code{'0o'},
@code{'0x'}, or @code{'0X'} to the output value. For float and complex the
alternate form causes the result of the conversion to always contain a
decimal-point character, even if no digits follow it. Normally, a
decimal-point character appears in the result of these conversions
only if a digit follows it. In addition, for @code{'g'} and @code{'G'}
conversions, trailing zeros are not removed from the result.

The `width' is a decimal integer defining the minimum total field width,
including any prefixes, separators, and other formatting characters.
If not specified, then the field width will be determined by the content.

When no explicit alignment is given, preceding the `width' field by a zero
(@code{'0'}) character enables sign-aware zero-padding for numeric types,
excluding @ref{198,,complex}.  This is equivalent to a `fill' character of
@code{'0'} with an `alignment' type of @code{'='}.


Changed in version 3.10: Preceding the `width' field by @code{'0'} no longer affects the default
alignment for strings.


The `precision' is a decimal integer indicating how many digits should be
displayed after the decimal point for presentation types
@code{'f'} and @code{'F'}, or before and after the decimal point for presentation
types @code{'g'} or @code{'G'}.  For string presentation types the field
indicates the maximum field size - in other words, how many characters will be
used from the field content.  The `precision' is not allowed for integer
presentation types.

The `grouping' option after `width' and `precision' fields specifies
a digit group separator for the integral and fractional parts
of a number respectively. It can be one of the following:

@geindex @comma{} (comma); in string formatting
@geindex _ (underscore); in string formatting


@multitable {xxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Option

@tab

Meaning

@item

@code{','}

@tab

Inserts a comma every 3 digits for
integer presentation type @code{'d'} and
floating-point presentation types, excluding @code{'n'}.
For other presentation types,
this option is not supported.

@item

@code{'_'}

@tab

Inserts an underscore every 3 digits for
integer presentation type @code{'d'} and
floating-point presentation types, excluding @code{'n'}.
For integer presentation types
@code{'b'}, @code{'o'}, @code{'x'}, and @code{'X'},
underscores are inserted every 4 digits.
For other presentation types,
this option is not supported.

@end multitable


For a locale-aware separator, use the @code{'n'}
@ref{27ae,,float presentation type} or
@ref{27af,,integer presentation type} instead.


Changed in version 3.1: Added the @code{','} option (see also 
@geindex Python Enhancement Proposals; PEP 378
PEP 378@footnote{https://peps.python.org/pep-0378/}).



Changed in version 3.6: Added the @code{'_'} option (see also 
@geindex Python Enhancement Proposals; PEP 515
PEP 515@footnote{https://peps.python.org/pep-0515/}).



Changed in version 3.14: Support the `grouping' option for the fractional part.


Finally, the `type' determines how the data should be presented.

The available string presentation types are:

@quotation


@multitable {xxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Type

@tab

Meaning

@item

@code{'s'}

@tab

String format. This is the default type for strings and
may be omitted.

@item

None

@tab

The same as @code{'s'}.

@end multitable

@end quotation

The available integer presentation types are:

@quotation


@multitable {xxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Type

@tab

Meaning

@item

@code{'b'}

@tab

Binary format. Outputs the number in base 2.

@item

@code{'c'}

@tab

Character. Converts the integer to the corresponding
unicode character before printing.

@item

@code{'d'}

@tab

Decimal Integer. Outputs the number in base 10.

@item

@code{'o'}

@tab

Octal format. Outputs the number in base 8.

@item

@code{'x'}

@tab

Hex format. Outputs the number in base 16, using
lower-case letters for the digits above 9.

@item

@code{'X'}

@tab

Hex format. Outputs the number in base 16, using
upper-case letters for the digits above 9.
In case @code{'#'} is specified, the prefix @code{'0x'} will
be upper-cased to @code{'0X'} as well.

@item

@code{'n'}

@tab
@anchor{library/string n-format-integer}@anchor{27af}
Number. This is the same as @code{'d'}, except that it uses
the current locale setting to insert the appropriate
digit group separators. Note that the default locale is
not the system locale. Depending on your use case, you
may wish to set @ref{27b0,,LC_NUMERIC} with
@ref{931,,locale.setlocale()} before using @code{'n'}.

@item

None

@tab

The same as @code{'d'}.

@end multitable

@end quotation

In addition to the above presentation types, integers can be formatted
with the floating-point presentation types listed below (except
@code{'n'} and @code{None}). When doing so, @ref{197,,float()} is used to convert the
integer to a floating-point number before formatting.

The available presentation types for @ref{197,,float} and
@ref{200,,Decimal} values are:

@quotation


@multitable {xxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Type

@tab

Meaning

@item

@code{'e'}

@tab

Scientific notation. For a given precision @code{p},
formats the number in scientific notation with the
letter ‘e’ separating the coefficient from the exponent.
The coefficient has one digit before and @code{p} digits
after the decimal point, for a total of @code{p + 1}
significant digits. With no precision given, uses a
precision of @code{6} digits after the decimal point for
@ref{197,,float}, and shows all coefficient digits
for @ref{200,,Decimal}.  If @code{p=0}, the decimal
point is omitted unless the @code{#} option is used.

For @ref{197,,float}, the exponent always contains at
least two digits, and is zero if the value is zero.

@item

@code{'E'}

@tab

Scientific notation. Same as @code{'e'} except it uses
an upper case ‘E’ as the separator character.

@item

@code{'f'}

@tab

Fixed-point notation. For a given precision @code{p},
formats the number as a decimal number with exactly
@code{p} digits following the decimal point. With no
precision given, uses a precision of @code{6} digits after
the decimal point for @ref{197,,float}, and uses a
precision large enough to show all coefficient digits
for @ref{200,,Decimal}.  If @code{p=0}, the decimal
point is omitted unless the @code{#} option is used.

@item

@code{'F'}

@tab

Fixed-point notation. Same as @code{'f'}, but converts
@code{nan} to  @code{NAN} and @code{inf} to @code{INF}.

@item

@code{'g'}

@tab

General format.  For a given precision @code{p >= 1},
this rounds the number to @code{p} significant digits and
then formats the result in either fixed-point format
or in scientific notation, depending on its magnitude.
A precision of @code{0} is treated as equivalent to a
precision of @code{1}.

The precise rules are as follows: suppose that the
result formatted with presentation type @code{'e'} and
precision @code{p-1} would have exponent @code{exp}.  Then,
if @code{m <= exp < p}, where @code{m} is -4 for floats and -6
for @ref{200,,Decimals}, the number is
formatted with presentation type @code{'f'} and precision
@code{p-1-exp}.  Otherwise, the number is formatted
with presentation type @code{'e'} and precision @code{p-1}.
In both cases insignificant trailing zeros are removed
from the significand, and the decimal point is also
removed if there are no remaining digits following it,
unless the @code{'#'} option is used.

With no precision given, uses a precision of @code{6}
significant digits for @ref{197,,float}. For
@ref{200,,Decimal}, the coefficient of the result
is formed from the coefficient digits of the value;
scientific notation is used for values smaller than
@code{1e-6} in absolute value and values where the place
value of the least significant digit is larger than 1,
and fixed-point notation is used otherwise.

Positive and negative infinity, positive and negative
zero, and nans, are formatted as @code{inf}, @code{-inf},
@code{0}, @code{-0} and @code{nan} respectively, regardless of
the precision.

@item

@code{'G'}

@tab

General format. Same as @code{'g'} except switches to
@code{'E'} if the number gets too large. The
representations of infinity and NaN are uppercased, too.

@item

@code{'n'}

@tab
@anchor{library/string n-format-float}@anchor{27ae}
Number. This is the same as @code{'g'}, except that it uses
the current locale setting to insert the appropriate
digit group separators for the integral part of a
number. Note that the default locale is not the system
locale. Depending on your use case, you may wish to set
@ref{27b0,,LC_NUMERIC} with
@ref{931,,locale.setlocale()} before using @code{'n'}.

@item

@code{'%'}

@tab

Percentage. Multiplies the number by 100 and displays
in fixed (@code{'f'}) format, followed by a percent sign.

@item

None

@tab

For @ref{197,,float} this is like the @code{'g'} type, except
that when fixed-point notation is used to format the
result, it always includes at least one digit past the
decimal point, and switches to the scientific notation
when @code{exp >= p - 1}.  When the precision is not
specified, the latter will be as large as needed to
represent the given value faithfully.

For @ref{200,,Decimal}, this is the same as
either @code{'g'} or @code{'G'} depending on the value of
@code{context.capitals} for the current decimal context.

The overall effect is to match the output of @ref{16a,,str()}
as altered by the other format modifiers.

@end multitable

@end quotation

The result should be correctly rounded to a given precision @code{p} of digits
after the decimal point.  The rounding mode for @ref{197,,float} matches that
of the @ref{14e6,,round()} builtin.  For @ref{200,,Decimal}, the rounding
mode of the current @ref{27b1,,context} will be used.

The available presentation types for @ref{198,,complex} are the same as those for
@ref{197,,float} (@code{'%'} is not allowed).  Both the real and imaginary components
of a complex number are formatted as floating-point numbers, according to the
specified presentation type.  They are separated by the mandatory sign of the
imaginary part, the latter being terminated by a @code{j} suffix.  If the presentation
type is missing, the result will match the output of @ref{16a,,str()} (complex numbers with
a non-zero real part are also surrounded by parentheses), possibly altered by
other format modifiers.

@node Format examples,,Format specification mini-language,Format string syntax
@anchor{library/string format-examples}@anchor{27b2}@anchor{library/string formatexamples}@anchor{27a1}
@subsubsection Format examples


This section contains examples of the @ref{834,,str.format()} syntax and
comparison with the old @code{%}-formatting.

In most of the cases the syntax is similar to the old @code{%}-formatting, with the
addition of the @code{@{@}} and with @code{:} used instead of @code{%}.
For example, @code{'%03.2f'} can be translated to @code{'@{:03.2f@}'}.

The new format syntax also supports new and different options, shown in the
following examples.

Accessing arguments by position:

@example
>>> '@{0@}, @{1@}, @{2@}'.format('a', 'b', 'c')
'a, b, c'
>>> '@{@}, @{@}, @{@}'.format('a', 'b', 'c')  # 3.1+ only
'a, b, c'
>>> '@{2@}, @{1@}, @{0@}'.format('a', 'b', 'c')
'c, b, a'
>>> '@{2@}, @{1@}, @{0@}'.format(*'abc')      # unpacking argument sequence
'c, b, a'
>>> '@{0@}@{1@}@{0@}'.format('abra', 'cad')   # arguments' indices can be repeated
'abracadabra'
@end example

Accessing arguments by name:

@example
>>> 'Coordinates: @{latitude@}, @{longitude@}'.format(latitude='37.24N', longitude='-115.81W')
'Coordinates: 37.24N, -115.81W'
>>> coord = @{'latitude': '37.24N', 'longitude': '-115.81W'@}
>>> 'Coordinates: @{latitude@}, @{longitude@}'.format(**coord)
'Coordinates: 37.24N, -115.81W'
@end example

Accessing arguments’ attributes:

@example
>>> c = 3-5j
>>> ('The complex number @{0@} is formed from the real part @{0.real@} '
...  'and the imaginary part @{0.imag@}.').format(c)
'The complex number (3-5j) is formed from the real part 3.0 and the imaginary part -5.0.'
>>> class Point:
...     def __init__(self, x, y):
...         self.x, self.y = x, y
...     def __str__(self):
...         return 'Point(@{self.x@}, @{self.y@})'.format(self=self)
...
>>> str(Point(4, 2))
'Point(4, 2)'
@end example

Accessing arguments’ items:

@example
>>> coord = (3, 5)
>>> 'X: @{0[0]@};  Y: @{0[1]@}'.format(coord)
'X: 3;  Y: 5'
@end example

Replacing @code{%s} and @code{%r}:

@example
>>> "repr() shows quotes: @{!r@}; str() doesn't: @{!s@}".format('test1', 'test2')
"repr() shows quotes: 'test1'; str() doesn't: test2"
@end example

Aligning the text and specifying a width:

@example
>>> '@{:<30@}'.format('left aligned')
'left aligned                  '
>>> '@{:>30@}'.format('right aligned')
'                 right aligned'
>>> '@{:^30@}'.format('centered')
'           centered           '
>>> '@{:*^30@}'.format('centered')  # use '*' as a fill char
'***********centered***********'
@end example

Replacing @code{%+f}, @code{%-f}, and @code{% f} and specifying a sign:

@example
>>> '@{:+f@}; @{:+f@}'.format(3.14, -3.14)  # show it always
'+3.140000; -3.140000'
>>> '@{: f@}; @{: f@}'.format(3.14, -3.14)  # show a space for positive numbers
' 3.140000; -3.140000'
>>> '@{:-f@}; @{:-f@}'.format(3.14, -3.14)  # show only the minus -- same as '@{:f@}; @{:f@}'
'3.140000; -3.140000'
@end example

Replacing @code{%x} and @code{%o} and converting the value to different bases:

@example
>>> # format also supports binary numbers
>>> "int: @{0:d@};  hex: @{0:x@};  oct: @{0:o@};  bin: @{0:b@}".format(42)
'int: 42;  hex: 2a;  oct: 52;  bin: 101010'
>>> # with 0x, 0o, or 0b as prefix:
>>> "int: @{0:d@};  hex: @{0:#x@};  oct: @{0:#o@};  bin: @{0:#b@}".format(42)
'int: 42;  hex: 0x2a;  oct: 0o52;  bin: 0b101010'
@end example

Using the comma or the underscore as a digit group separator:

@example
>>> '@{:,@}'.format(1234567890)
'1,234,567,890'
>>> '@{:_@}'.format(1234567890)
'1_234_567_890'
>>> '@{:_b@}'.format(1234567890)
'100_1001_1001_0110_0000_0010_1101_0010'
>>> '@{:_x@}'.format(1234567890)
'4996_02d2'
>>> '@{:_@}'.format(123456789.123456789)
'123_456_789.12345679'
>>> '@{:.,@}'.format(123456789.123456789)
'123456789.123,456,79'
>>> '@{:,._@}'.format(123456789.123456789)
'123,456,789.123_456_79'
@end example

Expressing a percentage:

@example
>>> points = 19
>>> total = 22
>>> 'Correct answers: @{:.2%@}'.format(points/total)
'Correct answers: 86.36%'
@end example

Using type-specific formatting:

@example
>>> import datetime as dt
>>> d = dt.datetime(2010, 7, 4, 12, 15, 58)
>>> '@{:%Y-%m-%d %H:%M:%S@}'.format(d)
'2010-07-04 12:15:58'
@end example

Nesting arguments and more complex examples:

@example
>>> for align, text in zip('<^>', ['left', 'center', 'right']):
...     '@{0:@{fill@}@{align@}16@}'.format(text, fill=align, align=align)
...
'left<<<<<<<<<<<<'
'^^^^^center^^^^^'
'>>>>>>>>>>>right'
>>>
>>> octets = [192, 168, 0, 1]
>>> '@{:02X@}@{:02X@}@{:02X@}@{:02X@}'.format(*octets)
'C0A80001'
>>> int(_, 16)
3232235521
>>>
>>> width = 5
>>> for num in range(5,12):
...     for base in 'dXob':
...         print('@{0:@{width@}@{base@}@}'.format(num, base=base, width=width), end=' ')
...     print()
...
    5     5     5   101
    6     6     6   110
    7     7     7   111
    8     8    10  1000
    9     9    11  1001
   10     A    12  1010
   11     B    13  1011
@end example

@node Template strings $-strings,Helper functions,Format string syntax,string — Common string operations
@anchor{library/string template-strings-pep292}@anchor{27b3}@anchor{library/string template-strings-strings}@anchor{27b4}
@subsubsection Template strings ($-strings)


@cartouche
@quotation Note 
The feature described here was introduced in Python 2.4;
a simple templating method based upon regular expressions.
It predates @ref{834,,str.format()}, @ref{19b,,formatted string literals},
and @ref{27b5,,template string literals}.

It is unrelated to template string literals (t-strings),
which were introduced in Python 3.14.
These evaluate to  @ref{16b,,string.templatelib.Template} objects,
found in the @ref{d9,,string.templatelib} module.
@end quotation
@end cartouche

Template strings provide simpler string substitutions as described in
@geindex Python Enhancement Proposals; PEP 292
PEP 292@footnote{https://peps.python.org/pep-0292/}.  A primary use case for template strings is for
internationalization (i18n) since in that context, the simpler syntax and
functionality makes it easier to translate than other built-in string
formatting facilities in Python.  As an example of a library built on template
strings for i18n, see the
flufl.i18n@footnote{https://flufli18n.readthedocs.io/en/latest/} package.

@geindex $ (dollar); in template strings

Template strings support @code{$}-based substitutions, using the following rules:


@itemize *

@item 
@code{$$} is an escape; it is replaced with a single @code{$}.

@item 
@code{$identifier} names a substitution placeholder matching a mapping key of
@code{"identifier"}.  By default, @code{"identifier"} is restricted to any
case-insensitive ASCII alphanumeric string (including underscores) that
starts with an underscore or ASCII letter.  The first non-identifier
character after the @code{$} character terminates this placeholder
specification.

@item 
@code{$@{identifier@}} is equivalent to @code{$identifier}.  It is required when
valid identifier characters follow the placeholder but are not part of the
placeholder, such as @code{"$@{noun@}ification"}.
@end itemize

Any other appearance of @code{$} in the string will result in a @ref{2ee,,ValueError}
being raised.

The @code{string} module provides a @ref{899,,Template} class that implements
these rules.  The methods of @code{Template} are:

@geindex Template (class in string)
@anchor{library/string string Template}@anchor{899}
@deffn {Class} string.Template (template)

The constructor takes a single argument which is the template string.

@geindex substitute() (string.Template method)
@anchor{library/string string Template substitute}@anchor{2119}
@deffn {Method} substitute (mapping=@{@}, /, **kwds)

Performs the template substitution, returning a new string.  `mapping' is
any dictionary-like object with keys that match the placeholders in the
template.  Alternatively, you can provide keyword arguments, where the
keywords are the placeholders.  When both `mapping' and `kwds' are given
and there are duplicates, the placeholders from `kwds' take precedence.
@end deffn

@geindex safe_substitute() (string.Template method)
@anchor{library/string string Template safe_substitute}@anchor{211a}
@deffn {Method} safe_substitute (mapping=@{@}, /, **kwds)

Like @ref{2119,,substitute()}, except that if placeholders are missing from
`mapping' and `kwds', instead of raising a @ref{5e7,,KeyError} exception, the
original placeholder will appear in the resulting string intact.  Also,
unlike with @code{substitute()}, any other appearances of the @code{$} will
simply return @code{$} instead of raising @ref{2ee,,ValueError}.

While other exceptions may still occur, this method is called “safe”
because it always tries to return a usable string instead of
raising an exception.  In another sense, @code{safe_substitute()} may be
anything other than safe, since it will silently ignore malformed
templates containing dangling delimiters, unmatched braces, or
placeholders that are not valid Python identifiers.
@end deffn

@geindex is_valid() (string.Template method)
@anchor{library/string string Template is_valid}@anchor{898}
@deffn {Method} is_valid ()

Returns @code{False} if the template has invalid placeholders that will cause
@ref{2119,,substitute()} to raise @ref{2ee,,ValueError}.


Added in version 3.11.

@end deffn

@geindex get_identifiers() (string.Template method)
@anchor{library/string string Template get_identifiers}@anchor{897}
@deffn {Method} get_identifiers ()

Returns a list of the valid identifiers in the template, in the order
they first appear, ignoring any invalid identifiers.


Added in version 3.11.

@end deffn

@code{Template} instances also provide one public data attribute:

@geindex template (string.Template attribute)
@anchor{library/string string Template template}@anchor{27b6}
@deffn {Attribute} template

This is the object passed to the constructor’s `template' argument.  In
general, you shouldn’t change it, but read-only access is not enforced.
@end deffn
@end deffn

Here is an example of how to use a Template:

@example
>>> from string import Template
>>> s = Template('$who likes $what')
>>> s.substitute(who='tim', what='kung pao')
'tim likes kung pao'
>>> d = dict(who='tim')
>>> Template('Give $who $100').substitute(d)
Traceback (most recent call last):
...
ValueError: Invalid placeholder in string: line 1, col 11
>>> Template('$who likes $what').substitute(d)
Traceback (most recent call last):
...
KeyError: 'what'
>>> Template('$who likes $what').safe_substitute(d)
'tim likes $what'
@end example

Advanced usage: you can derive subclasses of @ref{899,,Template} to customize
the placeholder syntax, delimiter character, or the entire regular expression
used to parse template strings.  To do this, you can override these class
attributes:


@itemize *

@item 
`delimiter' – This is the literal string describing a placeholder
introducing delimiter.  The default value is @code{$}.  Note that this should
`not' be a regular expression, as the implementation will call
@ref{e09,,re.escape()} on this string as needed.  Note further that you cannot
change the delimiter after class creation (i.e. a different delimiter must
be set in the subclass’s class namespace).

@item 
`idpattern' – This is the regular expression describing the pattern for
non-braced placeholders.  The default value is the regular expression
@code{(?a:[_a-z][_a-z0-9]*)}.  If this is given and `braceidpattern' is
@code{None} this pattern will also apply to braced placeholders.

@cartouche
@quotation Note 
Since default `flags' is @code{re.IGNORECASE}, pattern @code{[a-z]} can match
with some non-ASCII characters. That’s why we use the local @code{a} flag
here.
@end quotation
@end cartouche


Changed in version 3.7: `braceidpattern' can be used to define separate patterns used inside and
outside the braces.


@item 
`braceidpattern' – This is like `idpattern' but describes the pattern for
braced placeholders.  Defaults to @code{None} which means to fall back to
`idpattern' (i.e. the same pattern is used both inside and outside braces).
If given, this allows you to define different patterns for braced and
unbraced placeholders.


Added in version 3.7.


@item 
`flags' – The regular expression flags that will be applied when compiling
the regular expression used for recognizing substitutions.  The default value
is @code{re.IGNORECASE}.  Note that @code{re.VERBOSE} will always be added to the
flags, so custom `idpattern's must follow conventions for verbose regular
expressions.


Added in version 3.2.

@end itemize

Alternatively, you can provide the entire regular expression pattern by
overriding the class attribute `pattern'.  If you do this, the value must be a
regular expression object with four named capturing groups.  The capturing
groups correspond to the rules given above, along with the invalid placeholder
rule:


@itemize *

@item 
`escaped' – This group matches the escape sequence, e.g. @code{$$}, in the
default pattern.

@item 
`named' – This group matches the unbraced placeholder name; it should not
include the delimiter in capturing group.

@item 
`braced' – This group matches the brace enclosed placeholder name; it should
not include either the delimiter or braces in the capturing group.

@item 
`invalid' – This group matches any other delimiter pattern (usually a single
delimiter), and it should appear last in the regular expression.
@end itemize

The methods on this class will raise @ref{2ee,,ValueError} if the pattern matches
the template without one of these named groups matching.

@node Helper functions,,Template strings $-strings,string — Common string operations
@anchor{library/string helper-functions}@anchor{27b7}
@subsubsection Helper functions


@geindex capwords() (in module string)
@anchor{library/string string capwords}@anchor{2699}
@deffn {Function} string.capwords (s, sep=None)

Split the argument into words using @ref{10b0,,str.split()}, capitalize each word
using @ref{2681,,str.capitalize()}, and join the capitalized words using
@ref{2651,,str.join()}.  If the optional second argument `sep' is absent
or @code{None}, runs of whitespace characters are replaced by a single space
and leading and trailing whitespace are removed, otherwise `sep' is used to
split and join the words.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node string templatelib — Support for template string literals,re — Regular expression operations,string — Common string operations,Text Processing Services
@anchor{library/string templatelib doc}@anchor{27b8}@anchor{library/string templatelib module-string templatelib}@anchor{d9}@anchor{library/string templatelib string-templatelib-support-for-template-string-literals}@anchor{27b9}@anchor{library/string templatelib translation-repo}@anchor{27ba}
@subsection @code{string.templatelib} — Support for template string literals


@geindex module; string.templatelib

`Source code:' Lib/string/templatelib.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/string/templatelib.py}


__________________________________________________________________



@subsubheading See also



@itemize *

@item 
@ref{19b,,Format strings}

@item 
@ref{1844,,Template string literal (t-string) syntax}

@item 
@geindex Python Enhancement Proposals; PEP 750
PEP 750@footnote{https://peps.python.org/pep-0750/}
@end itemize


@menu
* Template strings:: 
* Types:: 
* Helper functions: Helper functions<2>. 

@end menu

@node Template strings,Types,,string templatelib — Support for template string literals
@anchor{library/string templatelib id1}@anchor{27bb}@anchor{library/string templatelib template-strings}@anchor{27b5}
@subsubsection Template strings



Added in version 3.14.


Template strings are a mechanism for custom string processing.
They have the full flexibility of Python’s @ref{19b,,f-strings},
but return a @ref{16b,,Template} instance that gives access
to the static and interpolated (in curly brackets) parts of a string
`before' they are combined.

To write a t-string, use a @code{'t'} prefix instead of an @code{'f'}, like so:

@example
>>> pi = 3.14
>>> t't-strings are new in Python @{pi!s@}!'
Template(
   strings=('t-strings are new in Python ', '!'),
   interpolations=(Interpolation(3.14, 'pi', 's', '@w{'}),)
)
@end example

@node Types,Helper functions<2>,Template strings,string templatelib — Support for template string literals
@anchor{library/string templatelib types}@anchor{27bc}
@subsubsection Types


@geindex Template (class in string.templatelib)
@anchor{library/string templatelib string templatelib Template}@anchor{16b}
@deffn {Class} string.templatelib.Template

The @code{Template} class describes the contents of a template string.
It is immutable, meaning that attributes of a template cannot be reassigned.

The most common way to create a @code{Template} instance is to use the
@ref{1844,,template string literal syntax}.
This syntax is identical to that of @ref{19b,,f-strings},
except that it uses a @code{t} prefix in place of an @code{f}:

@example
>>> cheese = 'Red Leicester'
>>> template = t"We're fresh out of @{cheese@}, sir."
>>> type(template)
<class 'string.templatelib.Template'>
@end example

Templates are stored as sequences of literal @ref{27bd,,strings}
and dynamic @ref{27be,,interpolations}.
A @ref{27bf,,values} attribute holds the values of the interpolations:

@example
>>> cheese = 'Camembert'
>>> template = t'Ah! We do have @{cheese@}.'
>>> template.strings
('Ah! We do have ', '.')
>>> template.interpolations
(Interpolation('Camembert', ...),)
>>> template.values
('Camembert',)
@end example

The @code{strings} tuple has one more element than @code{interpolations}
and @code{values}; the interpolations “belong” between the strings.
This may be easier to understand when tuples are aligned

@example
template.strings:  ('Ah! We do have ',              '.')
template.values:   (                   'Camembert',    )
@end example

@subsubheading Attributes


@geindex strings (string.templatelib.Template attribute)
@anchor{library/string templatelib string templatelib Template strings}@anchor{27bd}
@deffn {Attribute} strings: @ref{614,,tuple}[@ref{16a,,str}, ...]

A @ref{614,,tuple} of the static strings in the template.

@example
>>> cheese = 'Camembert'
>>> template = t'Ah! We do have @{cheese@}.'
>>> template.strings
('Ah! We do have ', '.')
@end example

Empty strings `are' included in the tuple:

@example
>>> response = 'We do have '
>>> cheese = 'Camembert'
>>> template = t'Ah! @{response@}@{cheese@}.'
>>> template.strings
('Ah! ', '@w{'}, '.')
@end example

The @code{strings} tuple is never empty, and always contains one more
string than the @code{interpolations} and @code{values} tuples:

@example
>>> t'@w{'}.strings
('@w{'},)
>>> t'@w{'}.values
()
>>> t'@{'cheese'@}'.strings
('@w{'}, '@w{'})
>>> t'@{'cheese'@}'.values
('cheese',)
@end example
@end deffn

@geindex interpolations (string.templatelib.Template attribute)
@anchor{library/string templatelib string templatelib Template interpolations}@anchor{27be}
@deffn {Attribute} interpolations: @ref{614,,tuple}[@ref{16c,,Interpolation}, ...]

A @ref{614,,tuple} of the interpolations in the template.

@example
>>> cheese = 'Camembert'
>>> template = t'Ah! We do have @{cheese@}.'
>>> template.interpolations
(Interpolation('Camembert', 'cheese', None, '@w{'}),)
@end example

The @code{interpolations} tuple may be empty and always contains one fewer
values than the @code{strings} tuple:

@example
>>> t'Red Leicester'.interpolations
()
@end example
@end deffn

@geindex values (string.templatelib.Template attribute)
@anchor{library/string templatelib string templatelib Template values}@anchor{27bf}
@deffn {Attribute} values: @ref{614,,tuple}[@ref{c84,,object}, ...]

A tuple of all interpolated values in the template.

@example
>>> cheese = 'Camembert'
>>> template = t'Ah! We do have @{cheese@}.'
>>> template.values
('Camembert',)
@end example

The @code{values} tuple always has the same length as the
@code{interpolations} tuple. It is always equivalent to
@code{tuple(i.value for i in template.interpolations)}.
@end deffn

@subsubheading Methods


@geindex __new__() (string.templatelib.Template method)
@anchor{library/string templatelib string templatelib Template __new__}@anchor{27c0}
@deffn {Method} __new__ (*args: str | Interpolation)

While literal syntax is the most common way to create a @code{Template},
it is also possible to create them directly using the constructor:

@example
>>> from string.templatelib import Interpolation, Template
>>> cheese = 'Camembert'
>>> template = Template(
...     'Ah! We do have ', Interpolation(cheese, 'cheese'), '.'
... )
>>> list(template)
['Ah! We do have ', Interpolation('Camembert', 'cheese', None, '@w{'}), '.']
@end example

If multiple strings are passed consecutively, they will be concatenated
into a single value in the @ref{27bd,,strings} attribute. For example,
the following code creates a @code{Template} with a single final string:

@example
>>> from string.templatelib import Template
>>> template = Template('Ah! We do have ', 'Camembert', '.')
>>> template.strings
('Ah! We do have Camembert.',)
@end example

If multiple interpolations are passed consecutively, they will be treated
as separate interpolations and an empty string will be inserted between them.
For example, the following code creates a template with empty placeholders
in the @ref{27bd,,strings} attribute:

@example
>>> from string.templatelib import Interpolation, Template
>>> template = Template(
...     Interpolation('Camembert', 'cheese'),
...     Interpolation('.', 'punctuation'),
... )
>>> template.strings
('@w{'}, '@w{'}, '@w{'})
@end example
@end deffn


@deffn {Describe} iter(template)

Iterate over the template, yielding each non-empty string and
@ref{16c,,Interpolation} in the correct order:

@example
>>> cheese = 'Camembert'
>>> list(t'Ah! We do have @{cheese@}.')
['Ah! We do have ', Interpolation('Camembert', 'cheese', None, '@w{'}), '.']
@end example

@cartouche
@quotation Caution 
Empty strings are `not' included in the iteration:

@example
>>> response = 'We do have '
>>> cheese = 'Camembert'
>>> list(t'Ah! @{response@}@{cheese@}.')
['Ah! ',
 Interpolation('We do have ', 'response', None, '@w{'}),
 Interpolation('Camembert', 'cheese', None, '@w{'}),
 '.']
@end example
@end quotation
@end cartouche
@end deffn


@deffn {Describe} template + other

@deffnx {Describe} template += other

Concatenate this template with another, returning a new
@code{Template} instance:

@example
>>> cheese = 'Camembert'
>>> list(t'Ah! ' + t'We do have @{cheese@}.')
['Ah! We do have ', Interpolation('Camembert', 'cheese', None, '@w{'}), '.']
@end example

Concatenating a @code{Template} and a @code{str} is `not' supported.
This is because it is unclear whether the string should be treated as
a static string or an interpolation.
If you want to concatenate a @code{Template} with a string,
you should either wrap the string directly in a @code{Template}
(to treat it as a static string)
or use an @code{Interpolation} (to treat it as dynamic):

@example
>>> from string.templatelib import Interpolation, Template
>>> template = t'Ah! '
>>> # Treat 'We do have ' as a static string
>>> template += Template('We do have ')
>>> # Treat cheese as an interpolation
>>> cheese = 'Camembert'
>>> template += Template(Interpolation(cheese, 'cheese'))
>>> list(template)
['Ah! We do have ', Interpolation('Camembert', 'cheese', None, '@w{'})]
@end example
@end deffn
@end deffn

@geindex Interpolation (class in string.templatelib)
@anchor{library/string templatelib string templatelib Interpolation}@anchor{16c}
@deffn {Class} string.templatelib.Interpolation

The @code{Interpolation} type represents an expression inside a template string.
It is immutable, meaning that attributes of an interpolation cannot be reassigned.

Interpolations support pattern matching, allowing you to match against
their attributes with the @ref{a14,,match statement}:

@example
>>> from string.templatelib import Interpolation
>>> interpolation = t'@{1. + 2.:.2f@}'.interpolations[0]
>>> interpolation
Interpolation(3.0, '1. + 2.', None, '.2f')
>>> match interpolation:
...     case Interpolation(value, expression, conversion, format_spec):
...         print(value, expression, conversion, format_spec, sep=' | ')
...
3.0 | 1. + 2. | None | .2f
@end example

Interpolations are @ref{2410,,generic} over the types of their values.

@subsubheading Attributes


@geindex value (string.templatelib.Interpolation attribute)
@anchor{library/string templatelib string templatelib Interpolation value}@anchor{27c1}
@deffn {Attribute} value: @ref{c84,,object}

The evaluated value of the interpolation.

@example
>>> t'@{1 + 2@}'.interpolations[0].value
3
@end example
@end deffn

@geindex expression (string.templatelib.Interpolation attribute)
@anchor{library/string templatelib string templatelib Interpolation expression}@anchor{27c2}
@deffn {Attribute} expression: @ref{16a,,str}

For interpolations created by t-string literals, @code{expression}
is the expression text found inside the curly brackets (@code{@{} & @code{@}}),
including any whitespace, excluding the curly brackets themselves,
and ending before the first @code{!}, @code{:}, or @code{=} if any is present.
For manually created interpolations, @code{expression} is the arbitrary
string provided when constructing the interpolation instance.

We recommend using valid Python expressions or the empty string for the
@code{expression} field of manually created @code{Interpolation}
instances, although this is not enforced at runtime.

@example
>>> t'@{1 + 2@}'.interpolations[0].expression
'1 + 2'
@end example
@end deffn

@geindex conversion (string.templatelib.Interpolation attribute)
@anchor{library/string templatelib string templatelib Interpolation conversion}@anchor{269f}
@deffn {Attribute} conversion: @ref{a5b,,Literal}['a', 'r', 's'] | @ref{887,,None}

The conversion to apply to the value, or @code{None}.

The @code{conversion} is the optional conversion to apply
to the value:

@example
>>> t'@{1 + 2!a@}'.interpolations[0].conversion
'a'
@end example

@cartouche
@quotation Note 
Unlike f-strings, where conversions are applied automatically,
the expected behavior with t-strings is that code that `processes' the
@code{Template} will decide how to interpret and whether to apply
the @code{conversion}.
For convenience, the @ref{27c3,,convert()} function can be used to mimic
f-string conversion semantics.
@end quotation
@end cartouche
@end deffn

@geindex format_spec (string.templatelib.Interpolation attribute)
@anchor{library/string templatelib string templatelib Interpolation format_spec}@anchor{27c4}
@deffn {Attribute} format_spec: @ref{16a,,str}

The format specification to apply to the value.

The @code{format_spec} is an optional, arbitrary string
used as the format specification to present the value:

@example
>>> t'@{1 + 2:.2f@}'.interpolations[0].format_spec
'.2f'
@end example

@cartouche
@quotation Note 
Unlike f-strings, where format specifications are applied automatically
via the @ref{19a,,format()} protocol, the expected behavior with
t-strings is that code that `processes' the interpolation will
decide how to interpret and whether to apply the format specification.
As a result, @code{format_spec} values in interpolations
can be arbitrary strings,
including those that do not conform to the @code{format()} protocol.
@end quotation
@end cartouche
@end deffn

@subsubheading Methods


@geindex __new__() (string.templatelib.Interpolation method)
@anchor{library/string templatelib string templatelib Interpolation __new__}@anchor{27c5}
@deffn {Method} __new__ (value: object, expression: str, conversion: Literal['a', 'r', 's'] | None = None, format_spec: str = '@w{'})

Create a new @code{Interpolation} object from component parts.

@*Parameters: 

@itemize *

@item 
@code{value} – The evaluated, in-scope result of the interpolation.

@item 
@code{expression} – The text of a valid Python expression,
or an empty string.

@item 
@code{conversion} – The @ref{15a7,,conversion} to be used,
one of @code{None}, @code{'a'}, @code{'r'}, or @code{'s'}.

@item 
@code{format_spec} – An optional, arbitrary string used as the
@ref{4fa,,format specification} to present the value.
@end itemize

@end deffn
@end deffn

@node Helper functions<2>,,Types,string templatelib — Support for template string literals
@anchor{library/string templatelib helper-functions}@anchor{27c6}
@subsubsection Helper functions


@geindex convert() (in module string.templatelib)
@anchor{library/string templatelib string templatelib convert}@anchor{27c3}
@deffn {Function} string.templatelib.convert (obj, /, conversion)

Applies formatted string literal @ref{27a0,,conversion}
semantics to the given object `obj'.
This is frequently useful for custom template string processing logic.

Three conversion flags are currently supported:


@itemize *

@item 
@code{'s'} which calls @ref{16a,,str()} on the value (like @code{!s}),

@item 
@code{'r'} which calls @ref{1c3,,repr()} (like @code{!r}), and

@item 
@code{'a'} which calls @ref{15f2,,ascii()} (like @code{!a}).
@end itemize

If the conversion flag is @code{None}, `obj' is returned unchanged.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node re — Regular expression operations,difflib — Helpers for computing deltas,string templatelib — Support for template string literals,Text Processing Services
@anchor{library/re doc}@anchor{27c7}@anchor{library/re module-re}@anchor{be}@anchor{library/re re-regular-expression-operations}@anchor{27c8}@anchor{library/re translation-repo}@anchor{27c9}
@subsection @code{re} — Regular expression operations


@geindex module; re

`Source code:' Lib/re/@footnote{https://github.com/python/cpython/tree/3.14/Lib/re/}


__________________________________________________________________


This module provides regular expression matching operations similar to
those found in Perl.

Both patterns and strings to be searched can be Unicode strings (@ref{16a,,str})
as well as 8-bit strings (@ref{193,,bytes}).
However, Unicode strings and 8-bit strings cannot be mixed:
that is, you cannot match a Unicode string with a bytes pattern or
vice-versa; similarly, when asking for a substitution, the replacement
string must be of the same type as both the pattern and the search string.

Regular expressions use the backslash character (@code{'\'}) to indicate
special forms or to allow special characters to be used without invoking
their special meaning.  This collides with Python’s usage of the same
character for the same purpose in string literals; for example, to match
a literal backslash, one might have to write @code{'\\\\'} as the pattern
string, because the regular expression must be @code{\\}, and each
backslash must be expressed as @code{\\} inside a regular Python string
literal. Also, please note that any invalid escape sequences in Python’s
usage of the backslash in string literals now generate a @ref{1af,,SyntaxWarning}
and in the future this will become a @ref{18f,,SyntaxError}. This behaviour
will happen even if it is a valid escape sequence for a regular expression.

The solution is to use Python’s raw string notation for regular expression
patterns; backslashes are not handled in any special way in a string literal
prefixed with @code{'r'}.  So @code{r"\n"} is a two-character string containing
@code{'\'} and @code{'n'}, while @code{"\n"} is a one-character string containing a
newline.  Usually patterns will be expressed in Python code using this raw
string notation.

It is important to note that most regular expression operations are available as
module-level functions and methods on
@ref{118d,,compiled regular expressions}.  The functions are shortcuts
that don’t require you to compile a regex object first, but miss some
fine-tuning parameters.


@subsubheading See also


The third-party regex@footnote{https://pypi.org/project/regex/} module,
which has an API compatible with the standard library @code{re} module,
but offers additional functionality and a more thorough Unicode support.


@menu
* Regular Expression Syntax:: 
* Module Contents:: 
* Regular Expression Objects:: 
* Match Objects:: 
* Regular Expression Examples:: 

@end menu

@node Regular Expression Syntax,Module Contents,,re — Regular expression operations
@anchor{library/re re-syntax}@anchor{933}@anchor{library/re regular-expression-syntax}@anchor{27ca}
@subsubsection Regular Expression Syntax


A regular expression (or RE) specifies a set of strings that matches it; the
functions in this module let you check if a particular string matches a given
regular expression (or if a given regular expression matches a particular
string, which comes down to the same thing).

Regular expressions can be concatenated to form new regular expressions; if `A'
and `B' are both regular expressions, then `AB' is also a regular expression.
In general, if a string `p' matches `A' and another string `q' matches `B', the
string `pq' will match AB.  This holds unless `A' or `B' contain low precedence
operations; boundary conditions between `A' and `B'; or have numbered group
references.  Thus, complex expressions can easily be constructed from simpler
primitive expressions like the ones described here.  For details of the theory
and implementation of regular expressions, consult the Friedl book @ref{27cb,,[Frie09]},
or almost any textbook about compiler construction.

A brief explanation of the format of regular expressions follows.  For further
information and a gentler presentation, consult the @ref{27cc,,Regular expression HOWTO}.

Regular expressions can contain both special and ordinary characters. Most
ordinary characters, like @code{'A'}, @code{'a'}, or @code{'0'}, are the simplest regular
expressions; they simply match themselves.  You can concatenate ordinary
characters, so @code{last} matches the string @code{'last'}.  (In the rest of this
section, we’ll write RE’s in @code{this special style}, usually without quotes, and
strings to be matched @code{'in single quotes'}.)

Some characters, like @code{'|'} or @code{'('}, are special. Special
characters either stand for classes of ordinary characters, or affect
how the regular expressions around them are interpreted.

Repetition operators or quantifiers (@code{*}, @code{+}, @code{?}, @code{@{m,n@}}, etc) cannot be
directly nested. This avoids ambiguity with the non-greedy modifier suffix
@code{?}, and with other modifiers in other implementations. To apply a second
repetition to an inner repetition, parentheses may be used. For example,
the expression @code{(?:a@{6@})*} matches any multiple of six @code{'a'} characters.

The special characters are:

@geindex . (dot); in regular expressions


@table @asis

@item @code{.}

(Dot.)  In the default mode, this matches any character except a newline.  If
the @ref{27cd,,DOTALL} flag has been specified, this matches any character
including a newline.  @code{(?s:.)} matches any character regardless of flags.
@end table

@geindex ^ (caret); in regular expressions


@table @asis

@item @code{^}

(Caret.)  Matches the start of the string, and in @ref{27ce,,MULTILINE} mode also
matches immediately after each newline.
@end table

@geindex $ (dollar); in regular expressions


@table @asis

@item @code{$}

Matches the end of the string or just before the newline at the end of the
string, and in @ref{27ce,,MULTILINE} mode also matches before a newline.  @code{foo}
matches both ‘foo’ and ‘foobar’, while the regular expression @code{foo$} matches
only ‘foo’.  More interestingly, searching for @code{foo.$} in @code{'foo1\nfoo2\n'}
matches ‘foo2’ normally, but ‘foo1’ in @code{MULTILINE} mode; searching for
a single @code{$} in @code{'foo\n'} will find two (empty) matches: one just before
the newline, and one at the end of the string.
@end table

@geindex * (asterisk); in regular expressions


@table @asis

@item @code{*}

Causes the resulting RE to match 0 or more repetitions of the preceding RE, as
many repetitions as are possible.  @code{ab*} will match ‘a’, ‘ab’, or ‘a’ followed
by any number of ‘b’s.
@end table

@geindex + (plus); in regular expressions


@table @asis

@item @code{+}

Causes the resulting RE to match 1 or more repetitions of the preceding RE.
@code{ab+} will match ‘a’ followed by any non-zero number of ‘b’s; it will not
match just ‘a’.
@end table

@geindex ? (question mark); in regular expressions


@table @asis

@item @code{?}

Causes the resulting RE to match 0 or 1 repetitions of the preceding RE.
@code{ab?} will match either ‘a’ or ‘ab’.
@end table

@geindex *?; in regular expressions
@geindex +?; in regular expressions
@geindex ??; in regular expressions


@table @asis

@item @code{*?}, @code{+?}, @code{??}

The @code{'*'}, @code{'+'}, and @code{'?'} quantifiers are all `greedy'; they match
as much text as possible.  Sometimes this behaviour isn’t desired; if the RE
@code{<.*>} is matched against @code{'<a> b <c>'}, it will match the entire
string, and not just @code{'<a>'}.  Adding @code{?} after the quantifier makes it
perform the match in `non-greedy' or `minimal' fashion; as `few'
characters as possible will be matched.  Using the RE @code{<.*?>} will match
only @code{'<a>'}.
@end table

@geindex *+; in regular expressions
@geindex ++; in regular expressions
@geindex ?+; in regular expressions


@table @asis

@item @code{*+}, @code{++}, @code{?+}

Like the @code{'*'}, @code{'+'}, and @code{'?'} quantifiers, those where @code{'+'} is
appended also match as many times as possible.
However, unlike the true greedy quantifiers, these do not allow
back-tracking when the expression following it fails to match.
These are known as `possessive' quantifiers.
For example, @code{a*a} will match @code{'aaaa'} because the @code{a*} will match
all 4 @code{'a'}s, but, when the final @code{'a'} is encountered, the
expression is backtracked so that in the end the @code{a*} ends up matching
3 @code{'a'}s total, and the fourth @code{'a'} is matched by the final @code{'a'}.
However, when @code{a*+a} is used to match @code{'aaaa'}, the @code{a*+} will
match all 4 @code{'a'}, but when the final @code{'a'} fails to find any more
characters to match, the expression cannot be backtracked and will thus
fail to match.
@code{x*+}, @code{x++} and @code{x?+} are equivalent to @code{(?>x*)}, @code{(?>x+)}
and @code{(?>x?)} correspondingly.


Added in version 3.11.

@end table

@geindex @{@} (curly brackets); in regular expressions


@table @asis

@item @code{@{m@}}

Specifies that exactly `m' copies of the previous RE should be matched; fewer
matches cause the entire RE not to match.  For example, @code{a@{6@}} will match
exactly six @code{'a'} characters, but not five.

@item @code{@{m,n@}}

Causes the resulting RE to match from `m' to `n' repetitions of the preceding
RE, attempting to match as many repetitions as possible.  For example,
@code{a@{3,5@}} will match from 3 to 5 @code{'a'} characters.  Omitting `m' specifies a
lower bound of zero,  and omitting `n' specifies an infinite upper bound.  As an
example, @code{a@{4,@}b} will match @code{'aaaab'} or a thousand @code{'a'} characters
followed by a @code{'b'}, but not @code{'aaab'}. The comma may not be omitted or the
modifier would be confused with the previously described form.

@item @code{@{m,n@}?}

Causes the resulting RE to match from `m' to `n' repetitions of the preceding
RE, attempting to match as `few' repetitions as possible.  This is the
non-greedy version of the previous quantifier.  For example, on the
6-character string @code{'aaaaaa'}, @code{a@{3,5@}} will match 5 @code{'a'} characters,
while @code{a@{3,5@}?} will only match 3 characters.

@item @code{@{m,n@}+}

Causes the resulting RE to match from `m' to `n' repetitions of the
preceding RE, attempting to match as many repetitions as possible
`without' establishing any backtracking points.
This is the possessive version of the quantifier above.
For example, on the 6-character string @code{'aaaaaa'}, @code{a@{3,5@}+aa}
attempt to match 5 @code{'a'} characters, then, requiring 2 more @code{'a'}s,
will need more characters than available and thus fail, while
@code{a@{3,5@}aa} will match with @code{a@{3,5@}} capturing 5, then 4 @code{'a'}s
by backtracking and then the final 2 @code{'a'}s are matched by the final
@code{aa} in the pattern.
@code{x@{m,n@}+} is equivalent to @code{(?>x@{m,n@})}.


Added in version 3.11.

@end table

@geindex \ (backslash); in regular expressions


@table @asis

@item @code{\}

Either escapes special characters (permitting you to match characters like
@code{'*'}, @code{'?'}, and so forth), or signals a special sequence; special
sequences are discussed below.

If you’re not using a raw string to express the pattern, remember that Python
also uses the backslash as an escape sequence in string literals; if the escape
sequence isn’t recognized by Python’s parser, the backslash and subsequent
character are included in the resulting string.  However, if Python would
recognize the resulting sequence, the backslash should be repeated twice.  This
is complicated and hard to understand, so it’s highly recommended that you use
raw strings for all but the simplest expressions.
@end table

@geindex [] (square brackets); in regular expressions


@table @asis

@item @code{[]}

Used to indicate a set of characters.  In a set:


@itemize *

@item 
Characters can be listed individually, e.g. @code{[amk]} will match @code{'a'},
@code{'m'}, or @code{'k'}.
@end itemize

@geindex - (minus); in regular expressions


@itemize *

@item 
Ranges of characters can be indicated by giving two characters and separating
them by a @code{'-'}, for example @code{[a-z]} will match any lowercase ASCII letter,
@code{[0-5][0-9]} will match all the two-digits numbers from @code{00} to @code{59}, and
@code{[0-9A-Fa-f]} will match any hexadecimal digit.  If @code{-} is escaped (e.g.
@code{[a\-z]}) or if it’s placed as the first or last character
(e.g. @code{[-a]} or @code{[a-]}), it will match a literal @code{'-'}.

@item 
Special characters except backslash lose their special meaning inside sets.
For example,
@code{[(+*)]} will match any of the literal characters @code{'('}, @code{'+'},
@code{'*'}, or @code{')'}.
@end itemize

@geindex \ (backslash); in regular expressions


@itemize *

@item 
Backslash either escapes characters which have special meaning in a set
such as @code{'-'}, @code{']'}, @code{'^'} and @code{'\\'} itself or signals
a special sequence which represents a single character such as
@code{\xa0} or @code{\n} or a character class such as @code{\w} or @code{\S}
(defined below).
Note that @code{\b} represents a single “backspace” character,
not a word boundary as outside a set, and numeric escapes
such as @code{\1} are always octal escapes, not group references.
Special sequences which do not match a single character such as @code{\A}
and @code{\z} are not allowed.
@end itemize

@geindex ^ (caret); in regular expressions


@itemize *

@item 
Characters that are not within a range can be matched by `complementing'
the set.  If the first character of the set is @code{'^'}, all the characters
that are `not' in the set will be matched.  For example, @code{[^5]} will match
any character except @code{'5'}, and @code{[^^]} will match any character except
@code{'^'}.  @code{^} has no special meaning if it’s not the first character in
the set.

@item 
To match a literal @code{']'} inside a set, precede it with a backslash, or
place it at the beginning of the set.  For example, both @code{[()[\]@{@}]} and
@code{[]()[@{@}]} will match a right bracket, as well as left bracket, braces,
and parentheses.
@end itemize

@c .. index:: single: --; in regular expressions

@c .. index:: single: &&; in regular expressions

@c .. index:: single: ~~; in regular expressions

@c .. index:: single: ||; in regular expressions


@itemize *

@item 
Support of nested sets and set operations as in Unicode Technical Standard #18@footnote{https://unicode.org/reports/tr18/} might be added in the future.  This would change the
syntax, so to facilitate this change a @ref{659,,FutureWarning} will be raised
in ambiguous cases for the time being.
That includes sets starting with a literal @code{'['} or containing literal
character sequences @code{'--'}, @code{'&&'}, @code{'~~'}, and @code{'||'}.  To
avoid a warning escape them with a backslash.
@end itemize


Changed in version 3.7: @ref{659,,FutureWarning} is raised if a character set contains constructs
that will change semantically in the future.

@end table

@geindex | (vertical bar); in regular expressions


@table @asis

@item @code{|}

@code{A|B}, where `A' and `B' can be arbitrary REs, creates a regular expression that
will match either `A' or `B'.  An arbitrary number of REs can be separated by the
@code{'|'} in this way.  This can be used inside groups (see below) as well.  As
the target string is scanned, REs separated by @code{'|'} are tried from left to
right. When one pattern completely matches, that branch is accepted. This means
that once `A' matches, `B' will not be tested further, even if it would
produce a longer overall match.  In other words, the @code{'|'} operator is never
greedy.  To match a literal @code{'|'}, use @code{\|}, or enclose it inside a
character class, as in @code{[|]}.
@end table

@geindex () (parentheses); in regular expressions


@table @asis

@item @code{(...)}

Matches whatever regular expression is inside the parentheses, and indicates the
start and end of a group; the contents of a group can be retrieved after a match
has been performed, and can be matched later in the string with the @code{\number}
special sequence, described below.  To match the literals @code{'('} or @code{')'},
use @code{\(} or @code{\)}, or enclose them inside a character class: @code{[(]}, @code{[)]}.
@end table

@geindex (?; in regular expressions


@table @asis

@item @code{(?...)}

This is an extension notation (a @code{'?'} following a @code{'('} is not meaningful
otherwise).  The first character after the @code{'?'} determines what the meaning
and further syntax of the construct is. Extensions usually do not create a new
group; @code{(?P<name>...)} is the only exception to this rule. Following are the
currently supported extensions.

@item @code{(?aiLmsux)}

(One or more letters from the set
@code{'a'}, @code{'i'}, @code{'L'}, @code{'m'}, @code{'s'}, @code{'u'}, @code{'x'}.)
The group matches the empty string;
the letters set the corresponding flags for the entire regular expression:


@itemize *

@item 
@ref{27cf,,re.A} (ASCII-only matching)

@item 
@ref{27d0,,re.I} (ignore case)

@item 
@ref{27d1,,re.L} (locale dependent)

@item 
@ref{27d2,,re.M} (multi-line)

@item 
@ref{27d3,,re.S} (dot matches all)

@item 
@ref{27d4,,re.U} (Unicode matching)

@item 
@ref{27d5,,re.X} (verbose)
@end itemize

(The flags are described in @ref{27d6,,Module Contents}.)
This is useful if you wish to include the flags as part of the
regular expression, instead of passing a `flag' argument to the
@ref{dd4,,re.compile()} function.
Flags should be used first in the expression string.


Changed in version 3.11: This construction can only be used at the start of the expression.

@end table

@geindex (?;; in regular expressions


@table @asis

@item @code{(?:...)}

A non-capturing version of regular parentheses.  Matches whatever regular
expression is inside the parentheses, but the substring matched by the group
`cannot' be retrieved after performing a match or referenced later in the
pattern.

@item @code{(?aiLmsux-imsx:...)}

(Zero or more letters from the set
@code{'a'}, @code{'i'}, @code{'L'}, @code{'m'}, @code{'s'}, @code{'u'}, @code{'x'},
optionally followed by @code{'-'} followed by
one or more letters from the @code{'i'}, @code{'m'}, @code{'s'}, @code{'x'}.)
The letters set or remove the corresponding flags for the part of the expression:


@itemize *

@item 
@ref{27cf,,re.A} (ASCII-only matching)

@item 
@ref{27d0,,re.I} (ignore case)

@item 
@ref{27d1,,re.L} (locale dependent)

@item 
@ref{27d2,,re.M} (multi-line)

@item 
@ref{27d3,,re.S} (dot matches all)

@item 
@ref{27d4,,re.U} (Unicode matching)

@item 
@ref{27d5,,re.X} (verbose)
@end itemize

(The flags are described in @ref{27d6,,Module Contents}.)

The letters @code{'a'}, @code{'L'} and @code{'u'} are mutually exclusive when used
as inline flags, so they can’t be combined or follow @code{'-'}.  Instead,
when one of them appears in an inline group, it overrides the matching mode
in the enclosing group.  In Unicode patterns @code{(?a:...)} switches to
ASCII-only matching, and @code{(?u:...)} switches to Unicode matching
(default).  In bytes patterns @code{(?L:...)} switches to locale dependent
matching, and @code{(?a:...)} switches to ASCII-only matching (default).
This override is only in effect for the narrow inline group, and the
original matching mode is restored outside of the group.


Added in version 3.6.



Changed in version 3.7: The letters @code{'a'}, @code{'L'} and @code{'u'} also can be used in a group.


@item @code{(?>...)}

Attempts to match @code{...} as if it was a separate regular expression, and
if successful, continues to match the rest of the pattern following it.
If the subsequent pattern fails to match, the stack can only be unwound
to a point `before' the @code{(?>...)} because once exited, the expression,
known as an `atomic group', has thrown away all stack points within
itself.
Thus, @code{(?>.*).} would never match anything because first the @code{.*}
would match all characters possible, then, having nothing left to match,
the final @code{.} would fail to match.
Since there are no stack points saved in the Atomic Group, and there is
no stack point before it, the entire expression would thus fail to match.


Added in version 3.11.

@end table

@geindex (?P<; in regular expressions


@table @asis

@item @code{(?P<name>...)}

Similar to regular parentheses, but the substring matched by the group is
accessible via the symbolic group name `name'.  Group names must be valid
Python identifiers, and in @ref{193,,bytes} patterns they can only contain
bytes in the ASCII range.  Each group name must be defined only once within
a regular expression.  A symbolic group is also a numbered group, just as if
the group were not named.

Named groups can be referenced in three contexts.  If the pattern is
@code{(?P<quote>['"]).*?(?P=quote)} (i.e. matching a string quoted with either
single or double quotes):


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Context of reference to group “quote”

@tab

Ways to reference it

@item

in the same pattern itself

@tab


@itemize *

@item 
@code{(?P=quote)} (as shown)

@item 
@code{\1}
@end itemize

@item

when processing match object `m'

@tab


@itemize *

@item 
@code{m.group('quote')}

@item 
@code{m.end('quote')} (etc.)
@end itemize

@item

in a string passed to the `repl'
argument of @code{re.sub()}

@tab


@itemize *

@item 
@code{\g<quote>}

@item 
@code{\g<1>}

@item 
@code{\1}
@end itemize

@end multitable



Changed in version 3.12: In @ref{193,,bytes} patterns, group `name' can only contain bytes
in the ASCII range (@code{b'\x00'}-@code{b'\x7f'}).

@end table

@geindex (?P=; in regular expressions


@table @asis

@item @code{(?P=name)}

A backreference to a named group; it matches whatever text was matched by the
earlier group named `name'.
@end table

@geindex (?#; in regular expressions


@table @asis

@item @code{(?#...)}

A comment; the contents of the parentheses are simply ignored.
@end table

@geindex (?=; in regular expressions


@table @asis

@item @code{(?=...)}

Matches if @code{...} matches next, but doesn’t consume any of the string.  This is
called a `lookahead assertion'.  For example, @code{Isaac (?=Asimov)} will match
@code{'Isaac '} only if it’s followed by @code{'Asimov'}.
@end table

@geindex (?!; in regular expressions


@table @asis

@item @code{(?!...)}

Matches if @code{...} doesn’t match next.  This is a `negative lookahead assertion'.
For example, @code{Isaac (?!Asimov)} will match @code{'Isaac '} only if it’s `not'
followed by @code{'Asimov'}.
@end table

@geindex (?<=; in regular expressions


@table @asis

@item @code{(?<=...)}

Matches if the current position in the string is preceded by a match for @code{...}
that ends at the current position.  This is called a `positive lookbehind
assertion'. @code{(?<=abc)def} will find a match in @code{'abcdef'}, since the
lookbehind will back up 3 characters and check if the contained pattern matches.
The contained pattern must only match strings of some fixed length, meaning that
@code{abc} or @code{a|b} are allowed, but @code{a*} and @code{a@{3,4@}} are not.  Note that
patterns which start with positive lookbehind assertions will not match at the
beginning of the string being searched; you will most likely want to use the
@ref{1438,,search()} function rather than the @ref{1439,,match()} function:

@example
>>> import re
>>> m = re.search('(?<=abc)def', 'abcdef')
>>> m.group(0)
'def'
@end example

This example looks for a word following a hyphen:

@example
>>> m = re.search(r'(?<=-)\w+', 'spam-egg')
>>> m.group(0)
'egg'
@end example


Changed in version 3.5: Added support for group references of fixed length.

@end table

@geindex (?<!; in regular expressions


@table @asis

@item @code{(?<!...)}

Matches if the current position in the string is not preceded by a match for
@code{...}.  This is called a `negative lookbehind assertion'.  Similar to
positive lookbehind assertions, the contained pattern must only match strings of
some fixed length.  Patterns which start with negative lookbehind assertions may
match at the beginning of the string being searched.
@end table

@geindex (?(; in regular expressions
@anchor{library/re re-conditional-expression}@anchor{1b6c}

@table @asis

@item @code{(?(id/name)yes-pattern|no-pattern)}

Will try to match with @code{yes-pattern} if the group with given `id' or
`name' exists, and with @code{no-pattern} if it doesn’t. @code{no-pattern} is
optional and can be omitted. For example,
@code{(<)?(\w+@@\w+(?:\.\w+)+)(?(1)>|$)} is a poor email matching pattern, which
will match with @code{'<user@@host.com>'} as well as @code{'user@@host.com'}, but
not with @code{'<user@@host.com'} nor @code{'user@@host.com>'}.


Changed in version 3.12: Group `id' can only contain ASCII digits.
In @ref{193,,bytes} patterns, group `name' can only contain bytes
in the ASCII range (@code{b'\x00'}-@code{b'\x7f'}).

@end table
@anchor{library/re re-special-sequences}@anchor{27d7}
The special sequences consist of @code{'\'} and a character from the list below.
If the ordinary character is not an ASCII digit or an ASCII letter, then the
resulting RE will match the second character.  For example, @code{\$} matches the
character @code{'$'}.

@geindex \ (backslash); in regular expressions


@table @asis

@item @code{\number}

Matches the contents of the group of the same number.  Groups are numbered
starting from 1.  For example, @code{(.+) \1} matches @code{'the the'} or @code{'55 55'},
but not @code{'thethe'} (note the space after the group).  This special sequence
can only be used to match one of the first 99 groups.  If the first digit of
`number' is 0, or `number' is 3 octal digits long, it will not be interpreted as
a group match, but as the character with octal value `number'. Inside the
@code{'['} and @code{']'} of a character class, all numeric escapes are treated as
characters.
@end table

@geindex \A; in regular expressions


@table @asis

@item @code{\A}

Matches only at the start of the string.
@end table

@geindex \b; in regular expressions


@table @asis

@item @code{\b}

Matches the empty string, but only at the beginning or end of a word.
A word is defined as a sequence of word characters.
Note that formally, @code{\b} is defined as the boundary
between a @code{\w} and a @code{\W} character (or vice versa),
or between @code{\w} and the beginning or end of the string.
This means that @code{r'\bat\b'} matches @code{'at'}, @code{'at.'}, @code{'(at)'},
and @code{'as at ay'} but not @code{'attempt'} or @code{'atlas'}.

The default word characters in Unicode (str) patterns
are Unicode alphanumerics and the underscore,
but this can be changed by using the @ref{83f,,ASCII} flag.
Word boundaries are determined by the current locale
if the @ref{d69,,LOCALE} flag is used.

@cartouche
@quotation Note 
Inside a character range, @code{\b} represents the backspace character,
for compatibility with Python’s string literals.
@end quotation
@end cartouche
@end table

@geindex \B; in regular expressions


@table @asis

@item @code{\B}

Matches the empty string,
but only when it is `not' at the beginning or end of a word.
This means that @code{r'at\B'} matches @code{'athens'}, @code{'atom'},
@code{'attorney'}, but not @code{'at'}, @code{'at.'}, or @code{'at!'}.
@code{\B} is the opposite of @code{\b},
so word characters in Unicode (str) patterns
are Unicode alphanumerics or the underscore,
although this can be changed by using the @ref{83f,,ASCII} flag.
Word boundaries are determined by the current locale
if the @ref{d69,,LOCALE} flag is used.


Changed in version 3.14: @code{\B} now matches empty input string.

@end table

@geindex \d; in regular expressions


@table @asis

@item @code{\d}


@table @asis

@item For Unicode (str) patterns:

Matches any Unicode decimal digit
(that is, any character in Unicode character category [Nd]@footnote{https://www.unicode.org/versions/Unicode15.0.0/ch04.pdf#G134153}).
This includes @code{[0-9]}, and also many other digit characters.

Matches @code{[0-9]} if the @ref{83f,,ASCII} flag is used.

@item For 8-bit (bytes) patterns:

Matches any decimal digit in the ASCII character set;
this is equivalent to @code{[0-9]}.
@end table
@end table

@geindex \D; in regular expressions


@table @asis

@item @code{\D}

Matches any character which is not a decimal digit.
This is the opposite of @code{\d}.

Matches @code{[^0-9]} if the @ref{83f,,ASCII} flag is used.
@end table

@geindex \s; in regular expressions


@table @asis

@item @code{\s}


@table @asis

@item For Unicode (str) patterns:

Matches Unicode whitespace characters (as defined by @ref{267c,,str.isspace()}).
This includes @code{[ \t\n\r\f\v]}, and also many other characters, for example the
non-breaking spaces mandated by typography rules in many languages.

Matches @code{[ \t\n\r\f\v]} if the @ref{83f,,ASCII} flag is used.

@item For 8-bit (bytes) patterns:

Matches characters considered whitespace in the ASCII character set;
this is equivalent to @code{[ \t\n\r\f\v]}.
@end table
@end table

@geindex \S; in regular expressions


@table @asis

@item @code{\S}

Matches any character which is not a whitespace character. This is
the opposite of @code{\s}.

Matches @code{[^ \t\n\r\f\v]} if the @ref{83f,,ASCII} flag is used.
@end table

@geindex \w; in regular expressions


@table @asis

@item @code{\w}


@table @asis

@item For Unicode (str) patterns:

Matches Unicode word characters;
this includes all Unicode alphanumeric characters
(as defined by @ref{2674,,str.isalnum()}),
as well as the underscore (@code{_}).

Matches @code{[a-zA-Z0-9_]} if the @ref{83f,,ASCII} flag is used.

@item For 8-bit (bytes) patterns:

Matches characters considered alphanumeric in the ASCII character set;
this is equivalent to @code{[a-zA-Z0-9_]}.
If the @ref{d69,,LOCALE} flag is used,
matches characters considered alphanumeric in the current locale and the underscore.
@end table
@end table

@geindex \W; in regular expressions


@table @asis

@item @code{\W}

Matches any character which is not a word character.
This is the opposite of @code{\w}.
By default, matches non-underscore (@code{_}) characters
for which @ref{2674,,str.isalnum()} returns @code{False}.

Matches @code{[^a-zA-Z0-9_]} if the @ref{83f,,ASCII} flag is used.

If the @ref{d69,,LOCALE} flag is used,
matches characters which are neither alphanumeric in the current locale
nor the underscore.
@end table

@geindex \z; in regular expressions
@geindex \Z; in regular expressions


@table @asis

@item @code{\z}

Matches only at the end of the string.


Added in version 3.14.


@item @code{\Z}

The same as @code{\z}.  For compatibility with old Python versions.
@end table

@geindex \a; in regular expressions
@geindex \b; in regular expressions
@geindex \f; in regular expressions
@geindex \n; in regular expressions
@geindex \N; in regular expressions
@geindex \r; in regular expressions
@geindex \t; in regular expressions
@geindex \u; in regular expressions
@geindex \U; in regular expressions
@geindex \v; in regular expressions
@geindex \x; in regular expressions
@geindex \\; in regular expressions

Most of the @ref{688,,escape sequences} supported by Python
string literals are also accepted by the regular expression parser:

@example
\a      \b      \f      \n
\N      \r      \t      \u
\U      \v      \x      \\
@end example

(Note that @code{\b} is used to represent word boundaries, and means “backspace”
only inside character classes.)

@code{'\u'}, @code{'\U'}, and @code{'\N'} escape sequences are
only recognized in Unicode (str) patterns.
In bytes patterns they are errors.
Unknown escapes of ASCII letters are reserved
for future use and treated as errors.

Octal escapes are included in a limited form.  If the first digit is a 0, or if
there are three octal digits, it is considered an octal escape. Otherwise, it is
a group reference.  As for string literals, octal escapes are always at most
three digits in length.


Changed in version 3.3: The @code{'\u'} and @code{'\U'} escape sequences have been added.



Changed in version 3.6: Unknown escapes consisting of @code{'\'} and an ASCII letter now are errors.



Changed in version 3.8: The @code{'\N@{@var{name}@}'} escape sequence has been added. As in string literals,
it expands to the named Unicode character (e.g. @code{'\N@{EM DASH@}'}).


@node Module Contents,Regular Expression Objects,Regular Expression Syntax,re — Regular expression operations
@anchor{library/re contents-of-module-re}@anchor{27d6}@anchor{library/re module-contents}@anchor{27d8}
@subsubsection Module Contents


The module defines several functions, constants, and an exception. Some of the
functions are simplified versions of the full featured methods for compiled
regular expressions.  Most non-trivial applications always use the compiled
form.

@menu
* Flags:: 
* Functions: Functions<2>. 
* Exceptions: Exceptions<3>. 

@end menu

@node Flags,Functions<2>,,Module Contents
@anchor{library/re flags}@anchor{27d9}
@subsubsection Flags



Changed in version 3.6: Flag constants are now instances of @ref{840,,RegexFlag}, which is a subclass of
@ref{ea0,,enum.IntFlag}.


@geindex RegexFlag (class in re)
@anchor{library/re re RegexFlag}@anchor{840}
@deffn {Class} re.RegexFlag

An @ref{ea0,,enum.IntFlag} class containing the regex options listed below.


Added in version 3.11: - added to @code{__all__}

@end deffn

@geindex A (in module re)
@geindex ASCII (in module re)
@anchor{library/re re A}@anchor{27cf}
@deffn {Data} re.A
@anchor{library/re re ASCII}@anchor{83f}
@deffnx {Data} re.ASCII

Make @code{\w}, @code{\W}, @code{\b}, @code{\B}, @code{\d}, @code{\D}, @code{\s} and @code{\S}
perform ASCII-only matching instead of full Unicode matching.  This is only
meaningful for Unicode (str) patterns, and is ignored for bytes patterns.

Corresponds to the inline flag @code{(?a)}.

@cartouche
@quotation Note 
The @ref{27d4,,U} flag still exists for backward compatibility,
but is redundant in Python 3 since
matches are Unicode by default for @code{str} patterns,
and Unicode matching isn’t allowed for bytes patterns.
@ref{d6a,,UNICODE} and the inline flag @code{(?u)} are similarly redundant.
@end quotation
@end cartouche
@end deffn

@geindex DEBUG (in module re)
@anchor{library/re re DEBUG}@anchor{27da}
@deffn {Data} re.DEBUG

Display debug information about compiled expression.

No corresponding inline flag.
@end deffn

@geindex I (in module re)
@geindex IGNORECASE (in module re)
@anchor{library/re re I}@anchor{27d0}
@deffn {Data} re.I
@anchor{library/re re IGNORECASE}@anchor{1adc}
@deffnx {Data} re.IGNORECASE

Perform case-insensitive matching;
expressions like @code{[A-Z]} will also  match lowercase letters.
Full Unicode matching (such as @code{Ü} matching @code{ü})
also works unless the @ref{83f,,ASCII} flag
is used to disable non-ASCII matches.
The current locale does not change the effect of this flag
unless the @ref{d69,,LOCALE} flag is also used.

Corresponds to the inline flag @code{(?i)}.

Note that when the Unicode patterns @code{[a-z]} or @code{[A-Z]} are used in
combination with the @ref{1adc,,IGNORECASE} flag, they will match the 52 ASCII
letters and 4 additional non-ASCII letters: ‘İ’ (U+0130, Latin capital
letter I with dot above), ‘ı’ (U+0131, Latin small letter dotless i),
‘ſ’ (U+017F, Latin small letter long s) and ‘K’ (U+212A, Kelvin sign).
If the @ref{83f,,ASCII} flag is used, only letters ‘a’ to ‘z’
and ‘A’ to ‘Z’ are matched.
@end deffn

@geindex L (in module re)
@geindex LOCALE (in module re)
@anchor{library/re re L}@anchor{27d1}
@deffn {Data} re.L
@anchor{library/re re LOCALE}@anchor{d69}
@deffnx {Data} re.LOCALE

Make @code{\w}, @code{\W}, @code{\b}, @code{\B} and case-insensitive matching
dependent on the current locale.
This flag can be used only with bytes patterns.

Corresponds to the inline flag @code{(?L)}.

@cartouche
@quotation Warning 
This flag is discouraged; consider Unicode matching instead.
The locale mechanism is very unreliable
as it only handles one “culture” at a time
and only works with 8-bit locales.
Unicode matching is enabled by default for Unicode (str) patterns
and it is able to handle different locales and languages.
@end quotation
@end cartouche


Changed in version 3.6: @ref{d69,,LOCALE} can be used only with bytes patterns
and is not compatible with @ref{83f,,ASCII}.



Changed in version 3.7: Compiled regular expression objects with the @ref{d69,,LOCALE} flag
no longer depend on the locale at compile time.
Only the locale at matching time affects the result of matching.

@end deffn

@geindex M (in module re)
@geindex MULTILINE (in module re)
@anchor{library/re re M}@anchor{27d2}
@deffn {Data} re.M
@anchor{library/re re MULTILINE}@anchor{27ce}
@deffnx {Data} re.MULTILINE

When specified, the pattern character @code{'^'} matches at the beginning of the
string and at the beginning of each line (immediately following each newline);
and the pattern character @code{'$'} matches at the end of the string and at the
end of each line (immediately preceding each newline).  By default, @code{'^'}
matches only at the beginning of the string, and @code{'$'} only at the end of the
string and immediately before the newline (if any) at the end of the string.

Corresponds to the inline flag @code{(?m)}.
@end deffn

@geindex NOFLAG (in module re)
@anchor{library/re re NOFLAG}@anchor{27db}
@deffn {Data} re.NOFLAG

Indicates no flag being applied, the value is @code{0}.  This flag may be used
as a default value for a function keyword argument or as a base value that
will be conditionally ORed with other flags.  Example of use as a default
value:

@example
def myfunc(text, flag=re.NOFLAG):
    return re.match(text, flag)
@end example


Added in version 3.11.

@end deffn

@geindex S (in module re)
@geindex DOTALL (in module re)
@anchor{library/re re S}@anchor{27d3}
@deffn {Data} re.S
@anchor{library/re re DOTALL}@anchor{27cd}
@deffnx {Data} re.DOTALL

Make the @code{'.'} special character match any character at all, including a
newline; without this flag, @code{'.'} will match anything `except' a newline.

Corresponds to the inline flag @code{(?s)}.
@end deffn

@geindex U (in module re)
@geindex UNICODE (in module re)
@anchor{library/re re U}@anchor{27d4}
@deffn {Data} re.U
@anchor{library/re re UNICODE}@anchor{d6a}
@deffnx {Data} re.UNICODE

In Python 3, Unicode characters are matched by default
for @code{str} patterns.
This flag is therefore redundant with `no effect'
and is only kept for backward compatibility.

See @ref{83f,,ASCII} to restrict matching to ASCII characters instead.
@end deffn

@geindex X (in module re)
@geindex VERBOSE (in module re)
@anchor{library/re re X}@anchor{27d5}
@deffn {Data} re.X
@anchor{library/re re VERBOSE}@anchor{27dc}
@deffnx {Data} re.VERBOSE

@geindex # (hash); in regular expressions

This flag allows you to write regular expressions that look nicer and are
more readable by allowing you to visually separate logical sections of the
pattern and add comments. Whitespace within the pattern is ignored, except
when in a character class, or when preceded by an unescaped backslash,
or within tokens like @code{*?}, @code{(?:} or @code{(?P<...>}. For example, @code{(? :}
and @code{* ?} are not allowed.
When a line contains a @code{#} that is not in a character class and is not
preceded by an unescaped backslash, all characters from the leftmost such
@code{#} through the end of the line are ignored.

This means that the two following regular expression objects that match a
decimal number are functionally equal:

@example
a = re.compile(r"""\d +  # the integral part
                   \.    # the decimal point
                   \d *  # some fractional digits""", re.X)
b = re.compile(r"\d+\.\d*")
@end example

Corresponds to the inline flag @code{(?x)}.
@end deffn

@node Functions<2>,Exceptions<3>,Flags,Module Contents
@anchor{library/re functions}@anchor{27dd}
@subsubsection Functions


@geindex compile() (in module re)
@anchor{library/re re compile}@anchor{dd4}
@deffn {Function} re.compile (pattern, flags=0)

Compile a regular expression pattern into a @ref{118d,,regular expression object}, which can be used for matching using its
@ref{27de,,match()}, @ref{27df,,search()} and other methods, described
below.

The expression’s behaviour can be modified by specifying a `flags' value.
Values can be any of the @ref{27d9,,flags} variables, combined using bitwise OR
(the @code{|} operator).

The sequence

@example
prog = re.compile(pattern)
result = prog.match(string)
@end example

is equivalent to

@example
result = re.match(pattern, string)
@end example

but using @ref{dd4,,re.compile()} and saving the resulting regular expression
object for reuse is more efficient when the expression will be used several
times in a single program.

@cartouche
@quotation Note 
The compiled versions of the most recent patterns passed to
@ref{dd4,,re.compile()} and the module-level matching functions are cached, so
programs that use only a few regular expressions at a time needn’t worry
about compiling regular expressions.
@end quotation
@end cartouche
@end deffn

@geindex search() (in module re)
@anchor{library/re re search}@anchor{1438}
@deffn {Function} re.search (pattern, string, flags=0)

Scan through `string' looking for the first location where the regular expression
`pattern' produces a match, and return a corresponding @ref{ec9,,Match}. Return
@code{None} if no position in the string matches the pattern; note that this is
different from finding a zero-length match at some point in the string.

The expression’s behaviour can be modified by specifying a `flags' value.
Values can be any of the @ref{27d9,,flags} variables, combined using bitwise OR
(the @code{|} operator).
@end deffn

@geindex match() (in module re)
@anchor{library/re re match}@anchor{1439}
@deffn {Function} re.match (pattern, string, flags=0)

If zero or more characters at the beginning of `string' match the regular
expression `pattern', return a corresponding @ref{ec9,,Match}.  Return
@code{None} if the string does not match the pattern; note that this is
different from a zero-length match.

Note that even in @ref{27ce,,MULTILINE} mode, @ref{1439,,re.match()} will only match
at the beginning of the string and not at the beginning of each line.

If you want to locate a match anywhere in `string', use @ref{1438,,search()}
instead (see also @ref{27e0,,search() vs. match()}).

The expression’s behaviour can be modified by specifying a `flags' value.
Values can be any of the @ref{27d9,,flags} variables, combined using bitwise OR
(the @code{|} operator).
@end deffn

@geindex fullmatch() (in module re)
@anchor{library/re re fullmatch}@anchor{118b}
@deffn {Function} re.fullmatch (pattern, string, flags=0)

If the whole `string' matches the regular expression `pattern', return a
corresponding @ref{ec9,,Match}.  Return @code{None} if the string does not match
the pattern; note that this is different from a zero-length match.

The expression’s behaviour can be modified by specifying a `flags' value.
Values can be any of the @ref{27d9,,flags} variables, combined using bitwise OR
(the @code{|} operator).


Added in version 3.4.

@end deffn

@geindex split() (in module re)
@anchor{library/re re split}@anchor{5a2}
@deffn {Function} re.split (pattern, string, maxsplit=0, flags=0)

Split `string' by the occurrences of `pattern'.  If capturing parentheses are
used in `pattern', then the text of all groups in the pattern are also returned
as part of the resulting list. If `maxsplit' is nonzero, at most `maxsplit'
splits occur, and the remainder of the string is returned as the final element
of the list.

@example
>>> re.split(r'\W+', 'Words, words, words.')
['Words', 'words', 'words', '@w{'}]
>>> re.split(r'(\W+)', 'Words, words, words.')
['Words', ', ', 'words', ', ', 'words', '.', '@w{'}]
>>> re.split(r'\W+', 'Words, words, words.', maxsplit=1)
['Words', 'words, words.']
>>> re.split('[a-f]+', '0a3B9', flags=re.IGNORECASE)
['0', '3', '9']
@end example

If there are capturing groups in the separator and it matches at the start of
the string, the result will start with an empty string.  The same holds for
the end of the string:

@example
>>> re.split(r'(\W+)', '...words, words...')
['@w{'}, '...', 'words', ', ', 'words', '...', '@w{'}]
@end example

That way, separator components are always found at the same relative
indices within the result list.

Adjacent empty matches are not possible, but an empty match can occur
immediately after a non-empty match.

@example
>>> re.split(r'\b', 'Words, words, words.')
['@w{'}, 'Words', ', ', 'words', ', ', 'words', '.']
>>> re.split(r'\W*', '...words...')
['@w{'}, '@w{'}, 'w', 'o', 'r', 'd', 's', '@w{'}, '@w{'}]
>>> re.split(r'(\W*)', '...words...')
['@w{'}, '...', '@w{'}, '@w{'}, 'w', '@w{'}, 'o', '@w{'}, 'r', '@w{'}, 'd', '@w{'}, 's', '...', '@w{'}, '@w{'}, '@w{'}]
@end example

The expression’s behaviour can be modified by specifying a `flags' value.
Values can be any of the @ref{27d9,,flags} variables, combined using bitwise OR
(the @code{|} operator).


Changed in version 3.1: Added the optional flags argument.



Changed in version 3.7: Added support of splitting on a pattern that could match an empty string.



Deprecated since version 3.13: Passing `maxsplit' and `flags' as positional arguments is deprecated.
In future Python versions they will be
@ref{5a5,,keyword-only parameters}.

@end deffn

@geindex findall() (in module re)
@anchor{library/re re findall}@anchor{1230}
@deffn {Function} re.findall (pattern, string, flags=0)

Return all non-overlapping matches of `pattern' in `string', as a list of
strings or tuples.  The `string' is scanned left-to-right, and matches
are returned in the order found.  Empty matches are included in the result.

The result depends on the number of capturing groups in the pattern.
If there are no groups, return a list of strings matching the whole
pattern.  If there is exactly one group, return a list of strings
matching that group.  If multiple groups are present, return a list
of tuples of strings matching the groups.  Non-capturing groups do not
affect the form of the result.

@example
>>> re.findall(r'\bf[a-z]*', 'which foot or hand fell fastest')
['foot', 'fell', 'fastest']
>>> re.findall(r'(\w+)=(\d+)', 'set width=20 and height=10')
[('width', '20'), ('height', '10')]
@end example

The expression’s behaviour can be modified by specifying a `flags' value.
Values can be any of the @ref{27d9,,flags} variables, combined using bitwise OR
(the @code{|} operator).


Changed in version 3.7: Non-empty matches can now start just after a previous empty match.

@end deffn

@geindex finditer() (in module re)
@anchor{library/re re finditer}@anchor{1706}
@deffn {Function} re.finditer (pattern, string, flags=0)

Return an @ref{4c9,,iterator} yielding @ref{ec9,,Match} objects over
all non-overlapping matches for the RE `pattern' in `string'.  The `string'
is scanned left-to-right, and matches are returned in the order found.  Empty
matches are included in the result.

The expression’s behaviour can be modified by specifying a `flags' value.
Values can be any of the @ref{27d9,,flags} variables, combined using bitwise OR
(the @code{|} operator).


Changed in version 3.7: Non-empty matches can now start just after a previous empty match.

@end deffn

@geindex sub() (in module re)
@anchor{library/re re sub}@anchor{5a3}
@deffn {Function} re.sub (pattern, repl, string, count=0, flags=0)

Return the string obtained by replacing the leftmost non-overlapping occurrences
of `pattern' in `string' by the replacement `repl'.  If the pattern isn’t found,
`string' is returned unchanged.  `repl' can be a string or a function; if it is
a string, any backslash escapes in it are processed.  That is, @code{\n} is
converted to a single newline character, @code{\r} is converted to a carriage return, and
so forth.  Unknown escapes of ASCII letters are reserved for future use and
treated as errors.  Other unknown escapes such as @code{\&} are left alone.
Backreferences, such
as @code{\6}, are replaced with the substring matched by group 6 in the pattern.
For example:

@example
>>> re.sub(r'def\s+([a-zA-Z_][a-zA-Z_0-9]*)\s*\(\s*\):',
...        r'static PyObject*\npy_\1(void)\n@{',
...        'def myfunc():')
'static PyObject*\npy_myfunc(void)\n@{'
@end example

If `repl' is a function, it is called for every non-overlapping occurrence of
`pattern'.  The function takes a single @ref{ec9,,Match} argument, and returns
the replacement string.  For example:

@example
>>> def dashrepl(matchobj):
...     if matchobj.group(0) == '-': return ' '
...     else: return '-'
...
>>> re.sub('-@{1,2@}', dashrepl, 'pro----gram-files')
'pro--gram files'
>>> re.sub(r'\sAND\s', ' & ', 'Baked Beans And Spam', flags=re.IGNORECASE)
'Baked Beans & Spam'
@end example

The pattern may be a string or a @ref{1bab,,Pattern}.

The optional argument `count' is the maximum number of pattern occurrences to be
replaced; `count' must be a non-negative integer.  If omitted or zero, all
occurrences will be replaced.

Adjacent empty matches are not possible, but an empty match can occur
immediately after a non-empty match.
As a result, @code{sub('x*', '-', 'abxd')} returns @code{'-a-b--d-'}
instead of @code{'-a-b-d-'}.

@geindex \g; in regular expressions

In string-type `repl' arguments, in addition to the character escapes and
backreferences described above,
@code{\g<name>} will use the substring matched by the group named @code{name}, as
defined by the @code{(?P<name>...)} syntax. @code{\g<number>} uses the corresponding
group number; @code{\g<2>} is therefore equivalent to @code{\2}, but isn’t ambiguous
in a replacement such as @code{\g<2>0}.  @code{\20} would be interpreted as a
reference to group 20, not a reference to group 2 followed by the literal
character @code{'0'}.  The backreference @code{\g<0>} substitutes in the entire
substring matched by the RE.

The expression’s behaviour can be modified by specifying a `flags' value.
Values can be any of the @ref{27d9,,flags} variables, combined using bitwise OR
(the @code{|} operator).


Changed in version 3.1: Added the optional flags argument.



Changed in version 3.5: Unmatched groups are replaced with an empty string.



Changed in version 3.6: Unknown escapes in `pattern' consisting of @code{'\'} and an ASCII letter
now are errors.



Changed in version 3.7: Unknown escapes in `repl' consisting of @code{'\'} and an ASCII letter
now are errors.
An empty match can occur immediately after a non-empty match.



Changed in version 3.12: Group `id' can only contain ASCII digits.
In @ref{193,,bytes} replacement strings, group `name' can only contain bytes
in the ASCII range (@code{b'\x00'}-@code{b'\x7f'}).



Deprecated since version 3.13: Passing `count' and `flags' as positional arguments is deprecated.
In future Python versions they will be
@ref{5a5,,keyword-only parameters}.

@end deffn

@geindex subn() (in module re)
@anchor{library/re re subn}@anchor{5a4}
@deffn {Function} re.subn (pattern, repl, string, count=0, flags=0)

Perform the same operation as @ref{5a3,,sub()}, but return a tuple @code{(new_string,
number_of_subs_made)}.

The expression’s behaviour can be modified by specifying a `flags' value.
Values can be any of the @ref{27d9,,flags} variables, combined using bitwise OR
(the @code{|} operator).
@end deffn

@geindex escape() (in module re)
@anchor{library/re re escape}@anchor{e09}
@deffn {Function} re.escape (pattern)

Escape special characters in `pattern'.
This is useful if you want to match an arbitrary literal string that may
have regular expression metacharacters in it.  For example:

@example
>>> print(re.escape('https://www.python.org'))
https://www\.python\.org

>>> legal_chars = string.ascii_lowercase + string.digits + "!#$%&'*+-.^_`|~:"
>>> print('[%s]+' % re.escape(legal_chars))
[abcdefghijklmnopqrstuvwxyz0123456789!\#\$%\&'\*\+\-\.\^_`\|\~:]+

>>> operators = ['+', '-', '*', '/', '**']
>>> print('|'.join(map(re.escape, sorted(operators, reverse=True))))
/|\-|\+|\*\*|\*
@end example

This function must not be used for the replacement string in @ref{5a3,,sub()}
and @ref{5a4,,subn()}, only backslashes should be escaped.  For example:

@example
>>> digits_re = r'\d+'
>>> sample = '/usr/sbin/sendmail - 0 errors, 12 warnings'
>>> print(re.sub(digits_re, digits_re.replace('\\', r'\\'), sample))
/usr/sbin/sendmail - \d+ errors, \d+ warnings
@end example


Changed in version 3.3: The @code{'_'} character is no longer escaped.



Changed in version 3.7: Only characters that can have special meaning in a regular expression
are escaped. As a result, @code{'!'}, @code{'"'}, @code{'%'}, @code{"'"}, @code{','},
@code{'/'}, @code{':'}, @code{';'}, @code{'<'}, @code{'='}, @code{'>'}, @code{'@@'}, and
@code{"`"} are no longer escaped.

@end deffn

@geindex purge() (in module re)
@anchor{library/re re purge}@anchor{27e1}
@deffn {Function} re.purge ()

Clear the regular expression cache.
@end deffn

@node Exceptions<3>,,Functions<2>,Module Contents
@anchor{library/re exceptions}@anchor{27e2}
@subsubsection Exceptions


@geindex PatternError
@anchor{library/re re PatternError}@anchor{547}
@deffn {Exception} re.PatternError (msg, pattern=None, pos=None)

Exception raised when a string passed to one of the functions here is not a
valid regular expression (for example, it might contain unmatched parentheses)
or when some other error occurs during compilation or matching.  It is never an
error if a string contains no match for a pattern.  The @code{PatternError} instance has
the following additional attributes:

@geindex msg (re.PatternError attribute)
@anchor{library/re re PatternError msg}@anchor{1051}
@deffn {Attribute} msg

The unformatted error message.
@end deffn

@geindex pattern (re.PatternError attribute)
@anchor{library/re re PatternError pattern}@anchor{1052}
@deffn {Attribute} pattern

The regular expression pattern.
@end deffn

@geindex pos (re.PatternError attribute)
@anchor{library/re re PatternError pos}@anchor{1053}
@deffn {Attribute} pos

The index in `pattern' where compilation failed (may be @code{None}).
@end deffn

@geindex lineno (re.PatternError attribute)
@anchor{library/re re PatternError lineno}@anchor{1054}
@deffn {Attribute} lineno

The line corresponding to `pos' (may be @code{None}).
@end deffn

@geindex colno (re.PatternError attribute)
@anchor{library/re re PatternError colno}@anchor{1055}
@deffn {Attribute} colno

The column corresponding to `pos' (may be @code{None}).
@end deffn


Changed in version 3.5: Added additional attributes.



Changed in version 3.13: @code{PatternError} was originally named @code{error}; the latter is kept as an alias for
backward compatibility.

@end deffn

@node Regular Expression Objects,Match Objects,Module Contents,re — Regular expression operations
@anchor{library/re re-objects}@anchor{118d}@anchor{library/re regular-expression-objects}@anchor{27e3}
@subsubsection Regular Expression Objects


@geindex Pattern (class in re)
@anchor{library/re re Pattern}@anchor{1bab}
@deffn {Class} re.Pattern

Compiled regular expression object returned by @ref{dd4,,re.compile()}.

Patterns are @ref{2410,,generic} over the type of string they handle
(@ref{16a,,str} or @ref{193,,bytes}).


Changed in version 3.9: @code{re.Pattern} supports @code{[]} to indicate a Unicode (str) or bytes pattern.
See @ref{8c3,,Generic Alias Type}.

@end deffn

@geindex search() (re.Pattern method)
@anchor{library/re re Pattern search}@anchor{27df}
@deffn {Method} Pattern.search (string[, pos[, endpos]])

Scan through `string' looking for the first location where this regular
expression produces a match, and return a corresponding @ref{ec9,,Match}.
Return @code{None} if no position in the string matches the pattern; note that
this is different from finding a zero-length match at some point in the string.

The optional second parameter `pos' gives an index in the string where the
search is to start; it defaults to @code{0}.  This is not completely equivalent to
slicing the string; the @code{'^'} pattern character matches at the real beginning
of the string and at positions just after a newline, but not necessarily at the
index where the search is to start.

The optional parameter `endpos' limits how far the string will be searched; it
will be as if the string is `endpos' characters long, so only the characters
from `pos' to @code{endpos - 1} will be searched for a match.  If `endpos' is less
than `pos', no match will be found; otherwise, if `rx' is a compiled regular
expression object, @code{rx.search(string, 0, 50)} is equivalent to
@code{rx.search(string[:50], 0)}.

@example
>>> pattern = re.compile("d")
>>> pattern.search("dog")     # Match at index 0
<re.Match object; span=(0, 1), match='d'>
>>> pattern.search("dog", 1)  # No match; search doesn't include the "d"
@end example
@end deffn

@geindex match() (re.Pattern method)
@anchor{library/re re Pattern match}@anchor{27de}
@deffn {Method} Pattern.match (string[, pos[, endpos]])

If zero or more characters at the `beginning' of `string' match this regular
expression, return a corresponding @ref{ec9,,Match}. Return @code{None} if the
string does not match the pattern; note that this is different from a
zero-length match.

The optional `pos' and `endpos' parameters have the same meaning as for the
@ref{27df,,search()} method.

@example
>>> pattern = re.compile("o")
>>> pattern.match("dog")      # No match as "o" is not at the start of "dog".
>>> pattern.match("dog", 1)   # Match as "o" is the 2nd character of "dog".
<re.Match object; span=(1, 2), match='o'>
@end example

If you want to locate a match anywhere in `string', use
@ref{27df,,search()} instead (see also @ref{27e0,,search() vs. match()}).
@end deffn

@geindex fullmatch() (re.Pattern method)
@anchor{library/re re Pattern fullmatch}@anchor{118c}
@deffn {Method} Pattern.fullmatch (string[, pos[, endpos]])

If the whole `string' matches this regular expression, return a corresponding
@ref{ec9,,Match}.  Return @code{None} if the string does not match the pattern;
note that this is different from a zero-length match.

The optional `pos' and `endpos' parameters have the same meaning as for the
@ref{27df,,search()} method.

@example
>>> pattern = re.compile("o[gh]")
>>> pattern.fullmatch("dog")      # No match as "o" is not at the start of "dog".
>>> pattern.fullmatch("ogre")     # No match as not the full string matches.
>>> pattern.fullmatch("doggie", 1, 3)   # Matches within given limits.
<re.Match object; span=(1, 3), match='og'>
@end example


Added in version 3.4.

@end deffn

@geindex split() (re.Pattern method)
@anchor{library/re re Pattern split}@anchor{27e4}
@deffn {Method} Pattern.split (string, maxsplit=0)

Identical to the @ref{5a2,,split()} function, using the compiled pattern.
@end deffn

@geindex findall() (re.Pattern method)
@anchor{library/re re Pattern findall}@anchor{27e5}
@deffn {Method} Pattern.findall (string[, pos[, endpos]])

Similar to the @ref{1230,,findall()} function, using the compiled pattern, but
also accepts optional `pos' and `endpos' parameters that limit the search
region like for @ref{1438,,search()}.
@end deffn

@geindex finditer() (re.Pattern method)
@anchor{library/re re Pattern finditer}@anchor{27e6}
@deffn {Method} Pattern.finditer (string[, pos[, endpos]])

Similar to the @ref{1706,,finditer()} function, using the compiled pattern, but
also accepts optional `pos' and `endpos' parameters that limit the search
region like for @ref{1438,,search()}.
@end deffn

@geindex sub() (re.Pattern method)
@anchor{library/re re Pattern sub}@anchor{27e7}
@deffn {Method} Pattern.sub (repl, string, count=0)

Identical to the @ref{5a3,,sub()} function, using the compiled pattern.
@end deffn

@geindex subn() (re.Pattern method)
@anchor{library/re re Pattern subn}@anchor{27e8}
@deffn {Method} Pattern.subn (repl, string, count=0)

Identical to the @ref{5a4,,subn()} function, using the compiled pattern.
@end deffn

@geindex flags (re.Pattern attribute)
@anchor{library/re re Pattern flags}@anchor{27e9}
@deffn {Attribute} Pattern.flags

The regex matching flags.  This is a combination of the flags given to
@ref{dd4,,compile()}, any @code{(?...)} inline flags in the pattern, and implicit
flags such as @ref{d6a,,UNICODE} if the pattern is a Unicode string.
@end deffn

@geindex groups (re.Pattern attribute)
@anchor{library/re re Pattern groups}@anchor{27ea}
@deffn {Attribute} Pattern.groups

The number of capturing groups in the pattern.
@end deffn

@geindex groupindex (re.Pattern attribute)
@anchor{library/re re Pattern groupindex}@anchor{27eb}
@deffn {Attribute} Pattern.groupindex

A dictionary mapping any symbolic group names defined by @code{(?P<id>)} to group
numbers.  The dictionary is empty if no symbolic groups were used in the
pattern.
@end deffn

@geindex pattern (re.Pattern attribute)
@anchor{library/re re Pattern pattern}@anchor{27ec}
@deffn {Attribute} Pattern.pattern

The pattern string from which the pattern object was compiled.
@end deffn


Changed in version 3.7: Added support of @ref{758,,copy.copy()} and @ref{d6b,,copy.deepcopy()}.  Compiled
regular expression objects are considered atomic.


@node Match Objects,Regular Expression Examples,Regular Expression Objects,re — Regular expression operations
@anchor{library/re id3}@anchor{27ed}@anchor{library/re match-objects}@anchor{118e}
@subsubsection Match Objects


Match objects always have a boolean value of @code{True}.
Since @ref{27de,,match()} and @ref{27df,,search()} return @code{None}
when there is no match, you can test whether there was a match with a simple
@code{if} statement:

@example
match = re.search(pattern, string)
if match:
    process(match)
@end example

@geindex Match (class in re)
@anchor{library/re re Match}@anchor{ec9}
@deffn {Class} re.Match

Match object returned by successful @code{match}es and @code{search}es.

Matches are @ref{2410,,generic} over the type of string which was
matched (@ref{16a,,str} or @ref{193,,bytes}).


Changed in version 3.9: @code{re.Match} supports @code{[]} to indicate a Unicode (str) or bytes match.
See @ref{8c3,,Generic Alias Type}.

@end deffn

@geindex expand() (re.Match method)
@anchor{library/re re Match expand}@anchor{27ee}
@deffn {Method} Match.expand (template)

Return the string obtained by doing backslash substitution on the template
string `template', as done by the @ref{27e7,,sub()} method.
Escapes such as @code{\n} are converted to the appropriate characters,
and numeric backreferences (@code{\1}, @code{\2}) and named backreferences
(@code{\g<1>}, @code{\g<name>}) are replaced by the contents of the
corresponding group. The backreference @code{\g<0>} will be
replaced by the entire match.


Changed in version 3.5: Unmatched groups are replaced with an empty string.

@end deffn

@geindex group() (re.Match method)
@anchor{library/re re Match group}@anchor{1231}
@deffn {Method} Match.group ([group1, ...])

Returns one or more subgroups of the match.  If there is a single argument, the
result is a single string; if there are multiple arguments, the result is a
tuple with one item per argument. Without arguments, `group1' defaults to zero
(the whole match is returned). If a `groupN' argument is zero, the corresponding
return value is the entire matching string; if it is a positive integer, it is
the string matching the corresponding parenthesized group.  If a group number is
negative or larger than the number of groups defined in the pattern, an
@ref{1741,,IndexError} exception is raised. If a group is contained in a
part of the pattern that did not match, the corresponding result is @code{None}.
If a group is contained in a part of the pattern that matched multiple times,
the last match is returned.

@example
>>> m = re.match(r"(\w+) (\w+)", "Isaac Newton, physicist")
>>> m.group(0)       # The entire match
'Isaac Newton'
>>> m.group(1)       # The first parenthesized subgroup.
'Isaac'
>>> m.group(2)       # The second parenthesized subgroup.
'Newton'
>>> m.group(1, 2)    # Multiple arguments give us a tuple.
('Isaac', 'Newton')
@end example

If the regular expression uses the @code{(?P<name>...)} syntax, the `groupN'
arguments may also be strings identifying groups by their group name.  If a
string argument is not used as a group name in the pattern, an @ref{1741,,IndexError}
exception is raised.

A moderately complicated example:

@example
>>> m = re.match(r"(?P<first_name>\w+) (?P<last_name>\w+)", "Malcolm Reynolds")
>>> m.group('first_name')
'Malcolm'
>>> m.group('last_name')
'Reynolds'
@end example

Named groups can also be referred to by their index:

@example
>>> m.group(1)
'Malcolm'
>>> m.group(2)
'Reynolds'
@end example

If a group matches multiple times, only the last match is accessible:

@example
>>> m = re.match(r"(..)+", "a1b2c3")  # Matches 3 times.
>>> m.group(1)                        # Returns only the last match.
'c3'
@end example
@end deffn

@geindex __getitem__() (re.Match method)
@anchor{library/re re Match __getitem__}@anchor{27ef}
@deffn {Method} Match.__getitem__ (g)

This is identical to @code{m.group(g)}.  This allows easier access to
an individual group from a match:

@example
>>> m = re.match(r"(\w+) (\w+)", "Isaac Newton, physicist")
>>> m[0]       # The entire match
'Isaac Newton'
>>> m[1]       # The first parenthesized subgroup.
'Isaac'
>>> m[2]       # The second parenthesized subgroup.
'Newton'
@end example

Named groups are supported as well:

@example
>>> m = re.match(r"(?P<first_name>\w+) (?P<last_name>\w+)", "Isaac Newton")
>>> m['first_name']
'Isaac'
>>> m['last_name']
'Newton'
@end example


Added in version 3.6.

@end deffn

@geindex groups() (re.Match method)
@anchor{library/re re Match groups}@anchor{1232}
@deffn {Method} Match.groups (default=None)

Return a tuple containing all the subgroups of the match, from 1 up to however
many groups are in the pattern.  The `default' argument is used for groups that
did not participate in the match; it defaults to @code{None}.

For example:

@example
>>> m = re.match(r"(\d+)\.(\d+)", "24.1632")
>>> m.groups()
('24', '1632')
@end example

If we make the decimal place and everything after it optional, not all groups
might participate in the match.  These groups will default to @code{None} unless
the `default' argument is given:

@example
>>> m = re.match(r"(\d+)\.?(\d+)?", "24")
>>> m.groups()      # Second group defaults to None.
('24', None)
>>> m.groups('0')   # Now, the second group defaults to '0'.
('24', '0')
@end example
@end deffn

@geindex groupdict() (re.Match method)
@anchor{library/re re Match groupdict}@anchor{27f0}
@deffn {Method} Match.groupdict (default=None)

Return a dictionary containing all the `named' subgroups of the match, keyed by
the subgroup name.  The `default' argument is used for groups that did not
participate in the match; it defaults to @code{None}.  For example:

@example
>>> m = re.match(r"(?P<first_name>\w+) (?P<last_name>\w+)", "Malcolm Reynolds")
>>> m.groupdict()
@{'first_name': 'Malcolm', 'last_name': 'Reynolds'@}
@end example
@end deffn

@geindex start() (re.Match method)
@geindex end() (re.Match method)
@anchor{library/re re Match start}@anchor{27f1}
@deffn {Method} Match.start ([group])
@anchor{library/re re Match end}@anchor{27f2}
@deffnx {Method} Match.end ([group])

Return the indices of the start and end of the substring matched by `group';
`group' defaults to zero (meaning the whole matched substring). Return @code{-1} if
`group' exists but did not contribute to the match.  For a match object `m', and
a group `g' that did contribute to the match, the substring matched by group `g'
(equivalent to @code{m.group(g)}) is

@example
m.string[m.start(g):m.end(g)]
@end example

Note that @code{m.start(group)} will equal @code{m.end(group)} if `group' matched a
null string.  For example, after @code{m = re.search('b(c?)', 'cba')},
@code{m.start(0)} is 1, @code{m.end(0)} is 2, @code{m.start(1)} and @code{m.end(1)} are both
2, and @code{m.start(2)} raises an @ref{1741,,IndexError} exception.

An example that will remove `remove_this' from email addresses:

@example
>>> email = "tony@@tiremove_thisger.net"
>>> m = re.search("remove_this", email)
>>> email[:m.start()] + email[m.end():]
'tony@@tiger.net'
@end example
@end deffn

@geindex span() (re.Match method)
@anchor{library/re re Match span}@anchor{27f3}
@deffn {Method} Match.span ([group])

For a match `m', return the 2-tuple @code{(m.start(group), m.end(group))}. Note
that if `group' did not contribute to the match, this is @code{(-1, -1)}.
`group' defaults to zero, the entire match.
@end deffn

@geindex pos (re.Match attribute)
@anchor{library/re re Match pos}@anchor{27f4}
@deffn {Attribute} Match.pos

The value of `pos' which was passed to the @ref{27df,,search()} or
@ref{27de,,match()} method of a @ref{118d,,regex object}.  This is
the index into the string at which the RE engine started looking for a match.
@end deffn

@geindex endpos (re.Match attribute)
@anchor{library/re re Match endpos}@anchor{27f5}
@deffn {Attribute} Match.endpos

The value of `endpos' which was passed to the @ref{27df,,search()} or
@ref{27de,,match()} method of a @ref{118d,,regex object}.  This is
the index into the string beyond which the RE engine will not go.
@end deffn

@geindex lastindex (re.Match attribute)
@anchor{library/re re Match lastindex}@anchor{27f6}
@deffn {Attribute} Match.lastindex

The integer index of the last matched capturing group, or @code{None} if no group
was matched at all. For example, the expressions @code{(a)b}, @code{((a)(b))}, and
@code{((ab))} will have @code{lastindex == 1} if applied to the string @code{'ab'}, while
the expression @code{(a)(b)} will have @code{lastindex == 2}, if applied to the same
string.
@end deffn

@geindex lastgroup (re.Match attribute)
@anchor{library/re re Match lastgroup}@anchor{27f7}
@deffn {Attribute} Match.lastgroup

The name of the last matched capturing group, or @code{None} if the group didn’t
have a name, or if no group was matched at all.
@end deffn

@geindex re (re.Match attribute)
@anchor{library/re re Match re}@anchor{27f8}
@deffn {Attribute} Match.re

The @ref{118d,,regular expression object} whose @ref{27de,,match()} or
@ref{27df,,search()} method produced this match instance.
@end deffn

@geindex string (re.Match attribute)
@anchor{library/re re Match string}@anchor{27f9}
@deffn {Attribute} Match.string

The string passed to @ref{27de,,match()} or @ref{27df,,search()}.
@end deffn


Changed in version 3.7: Added support of @ref{758,,copy.copy()} and @ref{d6b,,copy.deepcopy()}.  Match objects
are considered atomic.


@node Regular Expression Examples,,Match Objects,re — Regular expression operations
@anchor{library/re re-examples}@anchor{1469}@anchor{library/re regular-expression-examples}@anchor{27fa}
@subsubsection Regular Expression Examples


@menu
* Checking for a Pair:: 
* Simulating scanf(): Simulating scanf. 
* search() vs. match(): search vs match. 
* Making a Phonebook:: 
* Text Munging:: 
* Finding all Adverbs:: 
* Finding all Adverbs and their Positions:: 
* Raw String Notation:: 
* Writing a Tokenizer:: 

@end menu

@node Checking for a Pair,Simulating scanf,,Regular Expression Examples
@anchor{library/re checking-for-a-pair}@anchor{27fb}
@subsubsection Checking for a Pair


In this example, we’ll use the following helper function to display match
objects a little more gracefully:

@example
def displaymatch(match):
    if match is None:
        return None
    return '<Match: %r, groups=%r>' % (match.group(), match.groups())
@end example

Suppose you are writing a poker program where a player’s hand is represented as
a 5-character string with each character representing a card, “a” for ace, “k”
for king, “q” for queen, “j” for jack, “t” for 10, and “2” through “9”
representing the card with that value.

To see if a given string is a valid hand, one could do the following:

@example
>>> valid = re.compile(r"^[a2-9tjqk]@{5@}$")
>>> displaymatch(valid.match("akt5q"))  # Valid.
"<Match: 'akt5q', groups=()>"
>>> displaymatch(valid.match("akt5e"))  # Invalid.
>>> displaymatch(valid.match("akt"))    # Invalid.
>>> displaymatch(valid.match("727ak"))  # Valid.
"<Match: '727ak', groups=()>"
@end example

That last hand, @code{"727ak"}, contained a pair, or two of the same valued cards.
To match this with a regular expression, one could use backreferences as such:

@example
>>> pair = re.compile(r".*(.).*\1")
>>> displaymatch(pair.match("717ak"))     # Pair of 7s.
"<Match: '717', groups=('7',)>"
>>> displaymatch(pair.match("718ak"))     # No pairs.
>>> displaymatch(pair.match("354aa"))     # Pair of aces.
"<Match: '354aa', groups=('a',)>"
@end example

To find out what card the pair consists of, one could use the
@ref{1231,,group()} method of the match object in the following manner:

@example
>>> pair = re.compile(r".*(.).*\1")
>>> pair.match("717ak").group(1)
'7'

# Error because re.match() returns None, which doesn't have a group() method:
>>> pair.match("718ak").group(1)
Traceback (most recent call last):
  File "<pyshell#23>", line 1, in <module>
    re.match(r".*(.).*\1", "718ak").group(1)
AttributeError: 'NoneType' object has no attribute 'group'

>>> pair.match("354aa").group(1)
'a'
@end example

@node Simulating scanf,search vs match,Checking for a Pair,Regular Expression Examples
@anchor{library/re simulating-scanf}@anchor{27fc}
@subsubsection Simulating scanf()


@geindex scanf (C function)

Python does not currently have an equivalent to @code{scanf()}.  Regular
expressions are generally more powerful, though also more verbose, than
@code{scanf()} format strings.  The table below offers some more-or-less
equivalent mappings between @code{scanf()} format tokens and regular
expressions.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

@code{scanf()} Token

@tab

Regular Expression

@item

@code{%c}

@tab

@code{.}

@item

@code{%5c}

@tab

@code{.@{5@}}

@item

@code{%d}

@tab

@code{[-+]?\d+}

@item

@code{%e}, @code{%E}, @code{%f}, @code{%g}

@tab

@code{[-+]?(\d+(\.\d*)?|\.\d+)([eE][-+]?\d+)?}

@item

@code{%i}

@tab

@code{[-+]?(0[xX][\dA-Fa-f]+|0[0-7]*|\d+)}

@item

@code{%o}

@tab

@code{[-+]?[0-7]+}

@item

@code{%s}

@tab

@code{\S+}

@item

@code{%u}

@tab

@code{\d+}

@item

@code{%x}, @code{%X}

@tab

@code{[-+]?(0[xX])?[\dA-Fa-f]+}

@end multitable


To extract the filename and numbers from a string like

@example
/usr/sbin/sendmail - 0 errors, 4 warnings
@end example

you would use a @code{scanf()} format like

@example
%s - %d errors, %d warnings
@end example

The equivalent regular expression would be

@example
(\S+) - (\d+) errors, (\d+) warnings
@end example

@node search vs match,Making a Phonebook,Simulating scanf,Regular Expression Examples
@anchor{library/re id4}@anchor{27fd}@anchor{library/re search-vs-match}@anchor{27e0}
@subsubsection search() vs. match()


Python offers different primitive operations based on regular expressions:


@itemize +

@item 
@ref{1439,,re.match()} checks for a match only at the beginning of the string

@item 
@ref{1438,,re.search()} checks for a match anywhere in the string
(this is what Perl does by default)

@item 
@ref{118b,,re.fullmatch()} checks for entire string to be a match
@end itemize

For example:

@example
>>> re.match("c", "abcdef")    # No match
>>> re.search("c", "abcdef")   # Match
<re.Match object; span=(2, 3), match='c'>
>>> re.fullmatch("p.*n", "python") # Match
<re.Match object; span=(0, 6), match='python'>
>>> re.fullmatch("r.*n", "python") # No match
@end example

Regular expressions beginning with @code{'^'} can be used with @ref{1438,,search()} to
restrict the match at the beginning of the string:

@example
>>> re.match("c", "abcdef")    # No match
>>> re.search("^c", "abcdef")  # No match
>>> re.search("^a", "abcdef")  # Match
<re.Match object; span=(0, 1), match='a'>
@end example

Note however that in @ref{27ce,,MULTILINE} mode @ref{1439,,match()} only matches at the
beginning of the string, whereas using @ref{1438,,search()} with a regular expression
beginning with @code{'^'} will match at the beginning of each line.

@example
>>> re.match("X", "A\nB\nX", re.MULTILINE)  # No match
>>> re.search("^X", "A\nB\nX", re.MULTILINE)  # Match
<re.Match object; span=(4, 5), match='X'>
@end example

@node Making a Phonebook,Text Munging,search vs match,Regular Expression Examples
@anchor{library/re making-a-phonebook}@anchor{27fe}
@subsubsection Making a Phonebook


@ref{5a2,,split()} splits a string into a list delimited by the passed pattern.  The
method is invaluable for converting textual data into data structures that can be
easily read and modified by Python as demonstrated in the following example that
creates a phonebook.

First, here is the input.  Normally it may come from a file, here we are using
triple-quoted string syntax

@example
>>> text = """Ross McFluff: 834.345.1254 155 Elm Street
...
... Ronald Heathmore: 892.345.3428 436 Finley Avenue
... Frank Burger: 925.541.7625 662 South Dogwood Way
...
...
... Heather Albrecht: 548.326.4584 919 Park Place"""
@end example

The entries are separated by one or more newlines. Now we convert the string
into a list with each nonempty line having its own entry:

@example
>>> entries = re.split("\n+", text)
>>> entries
['Ross McFluff: 834.345.1254 155 Elm Street',
'Ronald Heathmore: 892.345.3428 436 Finley Avenue',
'Frank Burger: 925.541.7625 662 South Dogwood Way',
'Heather Albrecht: 548.326.4584 919 Park Place']
@end example

Finally, split each entry into a list with first name, last name, telephone
number, and address.  We use the @code{maxsplit} parameter of @ref{5a2,,split()}
because the address has spaces, our splitting pattern, in it:

@example
>>> [re.split(":? ", entry, maxsplit=3) for entry in entries]
[['Ross', 'McFluff', '834.345.1254', '155 Elm Street'],
['Ronald', 'Heathmore', '892.345.3428', '436 Finley Avenue'],
['Frank', 'Burger', '925.541.7625', '662 South Dogwood Way'],
['Heather', 'Albrecht', '548.326.4584', '919 Park Place']]
@end example

The @code{:?} pattern matches the colon after the last name, so that it does not
occur in the result list.  With a @code{maxsplit} of @code{4}, we could separate the
house number from the street name:

@example
>>> [re.split(":? ", entry, maxsplit=4) for entry in entries]
[['Ross', 'McFluff', '834.345.1254', '155', 'Elm Street'],
['Ronald', 'Heathmore', '892.345.3428', '436', 'Finley Avenue'],
['Frank', 'Burger', '925.541.7625', '662', 'South Dogwood Way'],
['Heather', 'Albrecht', '548.326.4584', '919', 'Park Place']]
@end example

@node Text Munging,Finding all Adverbs,Making a Phonebook,Regular Expression Examples
@anchor{library/re text-munging}@anchor{27ff}
@subsubsection Text Munging


@ref{5a3,,sub()} replaces every occurrence of a pattern with a string or the
result of a function.  This example demonstrates using @code{sub()} with
a function to “munge” text, or randomize the order of all the characters
in each word of a sentence except for the first and last characters:

@example
>>> def repl(m):
...     inner_word = list(m.group(2))
...     random.shuffle(inner_word)
...     return m.group(1) + "".join(inner_word) + m.group(3)
...
>>> text = "Professor Abdolmalek, please report your absences promptly."
>>> re.sub(r"(\w)(\w+)(\w)", repl, text)
'Poefsrosr Aealmlobdk, pslaee reorpt your abnseces plmrptoy.'
>>> re.sub(r"(\w)(\w+)(\w)", repl, text)
'Pofsroser Aodlambelk, plasee reoprt yuor asnebces potlmrpy.'
@end example

@node Finding all Adverbs,Finding all Adverbs and their Positions,Text Munging,Regular Expression Examples
@anchor{library/re finding-all-adverbs}@anchor{2800}
@subsubsection Finding all Adverbs


@ref{1230,,findall()} matches `all' occurrences of a pattern, not just the first
one as @ref{1438,,search()} does.  For example, if a writer wanted to
find all of the adverbs in some text, they might use @code{findall()} in
the following manner:

@example
>>> text = "He was carefully disguised but captured quickly by police."
>>> re.findall(r"\w+ly\b", text)
['carefully', 'quickly']
@end example

@node Finding all Adverbs and their Positions,Raw String Notation,Finding all Adverbs,Regular Expression Examples
@anchor{library/re finding-all-adverbs-and-their-positions}@anchor{2801}
@subsubsection Finding all Adverbs and their Positions


If one wants more information about all matches of a pattern than the matched
text, @ref{1706,,finditer()} is useful as it provides @ref{ec9,,Match} objects
instead of strings.  Continuing with the previous example, if a writer wanted
to find all of the adverbs `and their positions' in some text, they would use
@code{finditer()} in the following manner:

@example
>>> text = "He was carefully disguised but captured quickly by police."
>>> for m in re.finditer(r"\w+ly\b", text):
...     print('%02d-%02d: %s' % (m.start(), m.end(), m.group(0)))
07-16: carefully
40-47: quickly
@end example

@node Raw String Notation,Writing a Tokenizer,Finding all Adverbs and their Positions,Regular Expression Examples
@anchor{library/re raw-string-notation}@anchor{2802}
@subsubsection Raw String Notation


Raw string notation (@code{r"text"}) keeps regular expressions sane.  Without it,
every backslash (@code{'\'}) in a regular expression would have to be prefixed with
another one to escape it.  For example, the two following lines of code are
functionally identical:

@example
>>> re.match(r"\W(.)\1\W", " ff ")
<re.Match object; span=(0, 4), match=' ff '>
>>> re.match("\\W(.)\\1\\W", " ff ")
<re.Match object; span=(0, 4), match=' ff '>
@end example

When one wants to match a literal backslash, it must be escaped in the regular
expression.  With raw string notation, this means @code{r"\\"}.  Without raw string
notation, one must use @code{"\\\\"}, making the following lines of code
functionally identical:

@example
>>> re.match(r"\\", r"\\")
<re.Match object; span=(0, 1), match='\\'>
>>> re.match("\\\\", r"\\")
<re.Match object; span=(0, 1), match='\\'>
@end example

@node Writing a Tokenizer,,Raw String Notation,Regular Expression Examples
@anchor{library/re writing-a-tokenizer}@anchor{2803}
@subsubsection Writing a Tokenizer


A tokenizer or scanner@footnote{https://en.wikipedia.org/wiki/Lexical_analysis}
analyzes a string to categorize groups of characters.  This is a useful first
step in writing a compiler or interpreter.

The text categories are specified with regular expressions.  The technique is
to combine those into a single master regular expression and to loop over
successive matches:

@example
from typing import NamedTuple
import re

class Token(NamedTuple):
    type: str
    value: int | float | str
    line: int
    column: int

def tokenize(code):
    keywords = @{'IF', 'THEN', 'ENDIF', 'FOR', 'NEXT', 'GOSUB', 'RETURN'@}
    token_specification = [
        ('NUMBER',   r'\d+(\.\d*)?'),  # Integer or decimal number
        ('ASSIGN',   r':='),           # Assignment operator
        ('END',      r';'),            # Statement terminator
        ('ID',       r'[A-Za-z]+'),    # Identifiers
        ('OP',       r'[+\-*/]'),      # Arithmetic operators
        ('NEWLINE',  r'\n'),           # Line endings
        ('SKIP',     r'[ \t]+'),       # Skip over spaces and tabs
        ('MISMATCH', r'.'),            # Any other character
    ]
    tok_regex = '|'.join('(?P<%s>%s)' % pair for pair in token_specification)
    line_num = 1
    line_start = 0
    for mo in re.finditer(tok_regex, code):
        kind = mo.lastgroup
        value = mo.group()
        column = mo.start() - line_start
        if kind == 'NUMBER':
            value = float(value) if '.' in value else int(value)
        elif kind == 'ID' and value in keywords:
            kind = value
        elif kind == 'NEWLINE':
            line_start = mo.end()
            line_num += 1
            continue
        elif kind == 'SKIP':
            continue
        elif kind == 'MISMATCH':
            raise RuntimeError(f'@{value!r@} unexpected on line @{line_num@}')
        yield Token(kind, value, line_num, column)

statements = '@w{'}'
    IF quantity THEN
        total := total + price * quantity;
        tax := price * 0.05;
    ENDIF;
'@w{'}'

for token in tokenize(statements):
    print(token)
@end example

The tokenizer produces the following output:

@example
Token(type='IF', value='IF', line=2, column=4)
Token(type='ID', value='quantity', line=2, column=7)
Token(type='THEN', value='THEN', line=2, column=16)
Token(type='ID', value='total', line=3, column=8)
Token(type='ASSIGN', value=':=', line=3, column=14)
Token(type='ID', value='total', line=3, column=17)
Token(type='OP', value='+', line=3, column=23)
Token(type='ID', value='price', line=3, column=25)
Token(type='OP', value='*', line=3, column=31)
Token(type='ID', value='quantity', line=3, column=33)
Token(type='END', value=';', line=3, column=41)
Token(type='ID', value='tax', line=4, column=8)
Token(type='ASSIGN', value=':=', line=4, column=12)
Token(type='ID', value='price', line=4, column=15)
Token(type='OP', value='*', line=4, column=21)
Token(type='NUMBER', value=0.05, line=4, column=23)
Token(type='END', value=';', line=4, column=27)
Token(type='ENDIF', value='ENDIF', line=5, column=4)
Token(type='END', value=';', line=5, column=9)
@end example

@anchor{library/re frie09}@anchor{27cb}@w{(Frie09)} 
Friedl, Jeffrey. Mastering Regular Expressions. 3rd ed., O’Reilly Media, 2009. The third edition of the book no longer covers Python at all, but the first edition covered writing good regular expression patterns in great detail.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node difflib — Helpers for computing deltas,textwrap — Text wrapping and filling,re — Regular expression operations,Text Processing Services
@anchor{library/difflib doc}@anchor{2804}@anchor{library/difflib difflib-helpers-for-computing-deltas}@anchor{2805}@anchor{library/difflib module-difflib}@anchor{3b}@anchor{library/difflib translation-repo}@anchor{2806}
@subsection @code{difflib} — Helpers for computing deltas


@geindex module; difflib

@c Markup by Fred L. Drake, Jr. <fdrake@acm.org>

`Source code:' Lib/difflib.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/difflib.py}

@c import sys
@c from difflib import *


__________________________________________________________________


This module provides classes and functions for comparing sequences. It
can be used for example, for comparing files, and can produce information
about file differences in various formats, including HTML and context and unified
diffs. For comparing directories and files, see also, the @ref{5e,,filecmp} module.


@deffn {Class} difflib.SequenceMatcher

This is a flexible class for comparing pairs of sequences of any type, so long
as the sequence elements are @ref{825,,hashable}.  The basic algorithm predates, and is a
little fancier than, an algorithm published in the late 1980’s by Ratcliff and
Obershelp under the hyperbolic name “gestalt pattern matching.”  The idea is to
find the longest contiguous matching subsequence that contains no “junk”
elements; these “junk” elements are ones that are uninteresting in some
sense, such as blank lines or whitespace.  (Handling junk is an
extension to the Ratcliff and Obershelp algorithm.) The same
idea is then applied recursively to the pieces of the sequences to the left and
to the right of the matching subsequence.  This does not yield minimal edit
sequences, but does tend to yield matches that “look right” to people.

`Timing:' The basic Ratcliff-Obershelp algorithm is cubic time in the worst
case and quadratic time in the expected case. @ref{121f,,SequenceMatcher} is
quadratic time for the worst case and has expected-case behavior dependent in a
complicated way on how many elements the sequences have in common; best case
time is linear.

`Automatic junk heuristic:' @ref{121f,,SequenceMatcher} supports a heuristic that
automatically treats certain sequence items as junk. The heuristic counts how many
times each individual item appears in the sequence. If an item’s duplicates (after
the first one) account for more than 1% of the sequence and the sequence is at least
200 items long, this item is marked as “popular” and is treated as junk for
the purpose of sequence matching. This heuristic can be turned off by setting
the @code{autojunk} argument to @code{False} when creating the @code{SequenceMatcher}.


Changed in version 3.2: Added the `autojunk' parameter.

@end deffn

@geindex Differ (class in difflib)
@anchor{library/difflib difflib Differ}@anchor{2807}
@deffn {Class} difflib.Differ

This is a class for comparing sequences of lines of text, and producing
human-readable differences or deltas.  Differ uses @ref{121f,,SequenceMatcher}
both to compare sequences of lines, and to compare sequences of characters
within similar (near-matching) lines.

Each line of a @code{Differ} delta begins with a two-letter code:


@multitable {xxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Code

@tab

Meaning

@item

@code{'- '}

@tab

line unique to sequence 1

@item

@code{'+ '}

@tab

line unique to sequence 2

@item

@code{'  '}

@tab

line common to both sequences

@item

@code{'? '}

@tab

line not present in either input sequence

@end multitable


Lines beginning with ‘@code{?}’ attempt to guide the eye to intraline differences,
and were not present in either input sequence. These lines can be confusing if
the sequences contain whitespace characters, such as spaces, tabs or line breaks.
@end deffn

@geindex HtmlDiff (class in difflib)
@anchor{library/difflib difflib HtmlDiff}@anchor{203}
@deffn {Class} difflib.HtmlDiff

This class can be used to create an HTML table (or a complete HTML file
containing the table) showing a side by side, line by line comparison of text
with inter-line and intra-line change highlights.  The table can be generated in
either full or contextual difference mode.

The constructor for this class is:

@geindex __init__() (difflib.HtmlDiff method)
@anchor{library/difflib difflib HtmlDiff __init__}@anchor{2808}
@deffn {Method} __init__ (tabsize=8, wrapcolumn=None, linejunk=None, charjunk=IS_CHARACTER_JUNK)

Initializes instance of @code{HtmlDiff}.

`tabsize' is an optional keyword argument to specify tab stop spacing and
defaults to @code{8}.

`wrapcolumn' is an optional keyword to specify column number where lines are
broken and wrapped, defaults to @code{None} where lines are not wrapped.

`linejunk' and `charjunk' are optional keyword arguments passed into @ref{2809,,ndiff()}
(used by @code{HtmlDiff} to generate the side by side HTML differences).  See
@code{ndiff()} documentation for argument default values and descriptions.
@end deffn

The following methods are public:

@geindex make_file() (difflib.HtmlDiff method)
@anchor{library/difflib difflib HtmlDiff make_file}@anchor{ff6}
@deffn {Method} make_file (fromlines, tolines, fromdesc='@w{'}, todesc='@w{'}, context=False, numlines=5, *, charset='utf-8')

Compares `fromlines' and `tolines' (lists of strings) and returns a string which
is a complete HTML file containing a table showing line by line differences with
inter-line and intra-line changes highlighted.

`fromdesc' and `todesc' are optional keyword arguments to specify from/to file
column header strings (both default to an empty string).

`context' and `numlines' are both optional keyword arguments. Set `context' to
@code{True} when contextual differences are to be shown, else the default is
@code{False} to show the full files. `numlines' defaults to @code{5}.  When `context'
is @code{True} `numlines' controls the number of context lines which surround the
difference highlights.  When `context' is @code{False} `numlines' controls the
number of lines which are shown before a difference highlight when using the
“next” hyperlinks (setting to zero would cause the “next” hyperlinks to place
the next difference highlight at the top of the browser without any leading
context).

@cartouche
@quotation Note 
`fromdesc' and `todesc' are interpreted as unescaped HTML and should be
properly escaped while receiving input from untrusted sources.
@end quotation
@end cartouche


Changed in version 3.5: `charset' keyword-only argument was added.  The default charset of
HTML document changed from @code{'ISO-8859-1'} to @code{'utf-8'}.

@end deffn

@geindex make_table() (difflib.HtmlDiff method)
@anchor{library/difflib difflib HtmlDiff make_table}@anchor{280a}
@deffn {Method} make_table (fromlines, tolines, fromdesc='@w{'}, todesc='@w{'}, context=False, numlines=5)

Compares `fromlines' and `tolines' (lists of strings) and returns a string which
is a complete HTML table showing line by line differences with inter-line and
intra-line changes highlighted.

The arguments for this method are the same as those for the @ref{ff6,,make_file()}
method.
@end deffn
@end deffn

@geindex context_diff() (in module difflib)
@anchor{library/difflib difflib context_diff}@anchor{19ca}
@deffn {Function} difflib.context_diff (a, b, fromfile='@w{'}, tofile='@w{'}, fromfiledate='@w{'}, tofiledate='@w{'}, n=3, lineterm='\n')

Compare `a' and `b' (lists of strings); return a delta (a @ref{1267,,generator}
generating the delta lines) in context diff format.

Context diffs are a compact way of showing just the lines that have changed plus
a few lines of context.  The changes are shown in a before/after style.  The
number of context lines is set by `n' which defaults to three.

By default, the diff control lines (those with @code{***} or @code{---}) are created
with a trailing newline.  This is helpful so that inputs created from
@ref{280b,,io.IOBase.readlines()} result in diffs that are suitable for use with
@ref{17cc,,io.IOBase.writelines()} since both the inputs and outputs have trailing
newlines.

For inputs that do not have trailing newlines, set the `lineterm' argument to
@code{""} so that the output will be uniformly newline free.

The context diff format normally has a header for filenames and modification
times.  Any or all of these may be specified using strings for `fromfile',
`tofile', `fromfiledate', and `tofiledate'.  The modification times are normally
expressed in the ISO 8601 format. If not specified, the
strings default to blanks.

@example
>>> import sys
>>> from difflib import *
>>> s1 = ['bacon\n', 'eggs\n', 'ham\n', 'guido\n']
>>> s2 = ['python\n', 'eggy\n', 'hamster\n', 'guido\n']
>>> sys.stdout.writelines(context_diff(s1, s2, fromfile='before.py',
...                        tofile='after.py'))
*** before.py
--- after.py
***************
*** 1,4 ****
! bacon
! eggs
! ham
  guido
--- 1,4 ----
! python
! eggy
! hamster
  guido
@end example

See @ref{280c,,A command-line interface to difflib} for a more detailed example.
@end deffn

@geindex get_close_matches() (in module difflib)
@anchor{library/difflib difflib get_close_matches}@anchor{280d}
@deffn {Function} difflib.get_close_matches (word, possibilities, n=3, cutoff=0.6)

Return a list of the best “good enough” matches.  `word' is a sequence for which
close matches are desired (typically a string), and `possibilities' is a list of
sequences against which to match `word' (typically a list of strings).

Optional argument `n' (default @code{3}) is the maximum number of close matches to
return; `n' must be greater than @code{0}.

Optional argument `cutoff' (default @code{0.6}) is a float in the range [0, 1].
Possibilities that don’t score at least that similar to `word' are ignored.

The best (no more than `n') matches among the possibilities are returned in a
list, sorted by similarity score, most similar first.

@example
>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
@end example
@end deffn

@geindex ndiff() (in module difflib)
@anchor{library/difflib difflib ndiff}@anchor{2809}
@deffn {Function} difflib.ndiff (a, b, linejunk=None, charjunk=IS_CHARACTER_JUNK)

Compare `a' and `b' (lists of strings); return a @ref{2807,,Differ}-style
delta (a @ref{1267,,generator} generating the delta lines).

Optional keyword parameters `linejunk' and `charjunk' are filtering functions
(or @code{None}):

`linejunk': A function that accepts a single string argument, and returns
true if the string is junk, or false if not. The default is @code{None}. There
is also a module-level function @ref{2d9,,IS_LINE_JUNK()}, which filters out lines
without visible characters, except for at most one hash character (@code{'#'})
– however the underlying @ref{121f,,SequenceMatcher} class does a dynamic
analysis of which lines are so frequent as to constitute noise, and this
usually works better than using this function.

`charjunk': A function that accepts a character (a string of length 1), and
returns if the character is junk, or false if not. The default is module-level
function @ref{280e,,IS_CHARACTER_JUNK()}, which filters out whitespace characters (a
blank or tab; it’s a bad idea to include newline in this!).

@example
>>> diff = ndiff('one\ntwo\nthree\n'.splitlines(keepends=True),
...              'ore\ntree\nemu\n'.splitlines(keepends=True))
>>> print('@w{'}.join(diff), end="")
- one
?  ^
+ ore
?  ^
- two
- three
?  -
+ tree
+ emu
@end example
@end deffn

@geindex restore() (in module difflib)
@anchor{library/difflib difflib restore}@anchor{280f}
@deffn {Function} difflib.restore (sequence, which)

Return one of the two sequences that generated a delta.

Given a `sequence' produced by @ref{2810,,Differ.compare()} or @ref{2809,,ndiff()}, extract
lines originating from file 1 or 2 (parameter `which'), stripping off line
prefixes.

Example:

@example
>>> diff = ndiff('one\ntwo\nthree\n'.splitlines(keepends=True),
...              'ore\ntree\nemu\n'.splitlines(keepends=True))
>>> diff = list(diff) # materialize the generated delta into a list
>>> print('@w{'}.join(restore(diff, 1)), end="")
one
two
three
>>> print('@w{'}.join(restore(diff, 2)), end="")
ore
tree
emu
@end example
@end deffn

@geindex unified_diff() (in module difflib)
@anchor{library/difflib difflib unified_diff}@anchor{19c9}
@deffn {Function} difflib.unified_diff (a, b, fromfile='@w{'}, tofile='@w{'}, fromfiledate='@w{'}, tofiledate='@w{'}, n=3, lineterm='\n')

Compare `a' and `b' (lists of strings); return a delta (a @ref{1267,,generator}
generating the delta lines) in unified diff format.

Unified diffs are a compact way of showing just the lines that have changed plus
a few lines of context.  The changes are shown in an inline style (instead of
separate before/after blocks).  The number of context lines is set by `n' which
defaults to three.

By default, the diff control lines (those with @code{---}, @code{+++}, or @code{@@@@}) are
created with a trailing newline.  This is helpful so that inputs created from
@ref{280b,,io.IOBase.readlines()} result in diffs that are suitable for use with
@ref{17cc,,io.IOBase.writelines()} since both the inputs and outputs have trailing
newlines.

For inputs that do not have trailing newlines, set the `lineterm' argument to
@code{""} so that the output will be uniformly newline free.

The unified diff format normally has a header for filenames and modification
times.  Any or all of these may be specified using strings for `fromfile',
`tofile', `fromfiledate', and `tofiledate'.  The modification times are normally
expressed in the ISO 8601 format. If not specified, the
strings default to blanks.

@example
>>> s1 = ['bacon\n', 'eggs\n', 'ham\n', 'guido\n']
>>> s2 = ['python\n', 'eggy\n', 'hamster\n', 'guido\n']
>>> sys.stdout.writelines(unified_diff(s1, s2, fromfile='before.py', tofile='after.py'))
--- before.py
+++ after.py
@@@@ -1,4 +1,4 @@@@
-bacon
-eggs
-ham
+python
+eggy
+hamster
 guido
@end example

See @ref{280c,,A command-line interface to difflib} for a more detailed example.
@end deffn

@geindex diff_bytes() (in module difflib)
@anchor{library/difflib difflib diff_bytes}@anchor{ff7}
@deffn {Function} difflib.diff_bytes (dfunc, a, b, fromfile=b'@w{'}, tofile=b'@w{'}, fromfiledate=b'@w{'}, tofiledate=b'@w{'}, n=3, lineterm=b'\n')

Compare `a' and `b' (lists of bytes objects) using `dfunc'; yield a
sequence of delta lines (also bytes) in the format returned by `dfunc'.
`dfunc' must be a callable, typically either @ref{19c9,,unified_diff()} or
@ref{19ca,,context_diff()}.

Allows you to compare data with unknown or inconsistent encoding. All
inputs except `n' must be bytes objects, not str. Works by losslessly
converting all inputs (except `n') to str, and calling @code{dfunc(a, b,
fromfile, tofile, fromfiledate, tofiledate, n, lineterm)}. The output of
`dfunc' is then converted back to bytes, so the delta lines that you
receive have the same unknown/inconsistent encodings as `a' and `b'.


Added in version 3.5.

@end deffn

@geindex IS_LINE_JUNK() (in module difflib)
@anchor{library/difflib difflib IS_LINE_JUNK}@anchor{2d9}
@deffn {Function} difflib.IS_LINE_JUNK (line)

Return @code{True} for ignorable lines.  The line `line' is ignorable if `line' is
blank or contains a single @code{'#'}, otherwise it is not ignorable.  Used as a
default for parameter `linejunk' in @ref{2809,,ndiff()} in older versions.
@end deffn

@geindex IS_CHARACTER_JUNK() (in module difflib)
@anchor{library/difflib difflib IS_CHARACTER_JUNK}@anchor{280e}
@deffn {Function} difflib.IS_CHARACTER_JUNK (ch)

Return @code{True} for ignorable characters.  The character `ch' is ignorable if `ch'
is a space or tab, otherwise it is not ignorable.  Used as a default for
parameter `charjunk' in @ref{2809,,ndiff()}.
@end deffn


@subsubheading See also



@table @asis

@item Pattern Matching: The Gestalt Approach@footnote{https://jacobfilipp.com/DrDobbs/articles/DDJ/1988/8807/8807c/8807c.htm}

Discussion of a similar algorithm by John W. Ratcliff and D. E. Metzener. This
was published in Dr. Dobb’s Journal in July, 1988.
@end table


@menu
* SequenceMatcher objects:: 
* SequenceMatcher examples:: 
* Differ objects:: 
* Differ example:: 
* A command-line interface to difflib:: 
* ndiff example:: 

@end menu

@node SequenceMatcher objects,SequenceMatcher examples,,difflib — Helpers for computing deltas
@anchor{library/difflib sequence-matcher}@anchor{2811}@anchor{library/difflib sequencematcher-objects}@anchor{2812}
@subsubsection SequenceMatcher objects


The @ref{121f,,SequenceMatcher} class has this constructor:

@geindex SequenceMatcher (class in difflib)
@anchor{library/difflib difflib SequenceMatcher}@anchor{121f}
@deffn {Class} difflib.SequenceMatcher (isjunk=None, a='@w{'}, b='@w{'}, autojunk=True)

Optional argument `isjunk' must be @code{None} (the default) or a one-argument
function that takes a sequence element and returns true if and only if the
element is “junk” and should be ignored. Passing @code{None} for `isjunk' is
equivalent to passing @code{lambda x: False}; in other words, no elements are ignored.
For example, pass:

@example
lambda x: x in " \t"
@end example

if you’re comparing lines as sequences of characters, and don’t want to synch up
on blanks or hard tabs.

The optional arguments `a' and `b' are sequences to be compared; both default to
empty strings.  The elements of both sequences must be @ref{825,,hashable}.

The optional argument `autojunk' can be used to disable the automatic junk
heuristic.


Changed in version 3.2: Added the `autojunk' parameter.


SequenceMatcher objects get three data attributes: `bjunk' is the
set of elements of `b' for which `isjunk' is @code{True}; `bpopular' is the set of
non-junk elements considered popular by the heuristic (if it is not
disabled); `b2j' is a dict mapping the remaining elements of `b' to a list
of positions where they occur. All three are reset whenever `b' is reset
with @ref{2813,,set_seqs()} or @ref{2814,,set_seq2()}.


Added in version 3.2: The `bjunk' and `bpopular' attributes.


@code{SequenceMatcher} objects have the following methods:

@geindex set_seqs() (difflib.SequenceMatcher method)
@anchor{library/difflib difflib SequenceMatcher set_seqs}@anchor{2813}
@deffn {Method} set_seqs (a, b)

Set the two sequences to be compared.
@end deffn

@code{SequenceMatcher} computes and caches detailed information about the
second sequence, so if you want to compare one sequence against many
sequences, use @ref{2814,,set_seq2()} to set the commonly used sequence once and
call @ref{2815,,set_seq1()} repeatedly, once for each of the other sequences.

@geindex set_seq1() (difflib.SequenceMatcher method)
@anchor{library/difflib difflib SequenceMatcher set_seq1}@anchor{2815}
@deffn {Method} set_seq1 (a)

Set the first sequence to be compared.  The second sequence to be compared
is not changed.
@end deffn

@geindex set_seq2() (difflib.SequenceMatcher method)
@anchor{library/difflib difflib SequenceMatcher set_seq2}@anchor{2814}
@deffn {Method} set_seq2 (b)

Set the second sequence to be compared.  The first sequence to be compared
is not changed.
@end deffn

@geindex find_longest_match() (difflib.SequenceMatcher method)
@anchor{library/difflib difflib SequenceMatcher find_longest_match}@anchor{1d8f}
@deffn {Method} find_longest_match (alo=0, ahi=None, blo=0, bhi=None)

Find longest matching block in @code{a[alo:ahi]} and @code{b[blo:bhi]}.

If `isjunk' was omitted or @code{None}, @code{find_longest_match()} returns
@code{(i, j, k)} such that @code{a[i:i+k]} is equal to @code{b[j:j+k]}, where @code{alo
<= i <= i+k <= ahi} and @code{blo <= j <= j+k <= bhi}. For all @code{(i', j',
k')} meeting those conditions, the additional conditions @code{k >= k'}, @code{i
<= i'}, and if @code{i == i'}, @code{j <= j'} are also met. In other words, of
all maximal matching blocks, return one that starts earliest in `a', and
of all those maximal matching blocks that start earliest in `a', return
the one that starts earliest in `b'.

@example
>>> s = SequenceMatcher(None, " abcd", "abcd abcd")
>>> s.find_longest_match(0, 5, 0, 9)
Match(a=0, b=4, size=5)
@end example

If `isjunk' was provided, first the longest matching block is determined
as above, but with the additional restriction that no junk element appears
in the block.  Then that block is extended as far as possible by matching
(only) junk elements on both sides. So the resulting block never matches
on junk except as identical junk happens to be adjacent to an interesting
match.

Here’s the same example as before, but considering blanks to be junk. That
prevents @code{' abcd'} from matching the @code{' abcd'} at the tail end of the
second sequence directly.  Instead only the @code{'abcd'} can match, and
matches the leftmost @code{'abcd'} in the second sequence:

@example
>>> s = SequenceMatcher(lambda x: x==" ", " abcd", "abcd abcd")
>>> s.find_longest_match(0, 5, 0, 9)
Match(a=1, b=0, size=4)
@end example

If no blocks match, this returns @code{(alo, blo, 0)}.

This method returns a @ref{85f,,named tuple} @code{Match(a, b, size)}.


Changed in version 3.9: Added default arguments.

@end deffn

@geindex get_matching_blocks() (difflib.SequenceMatcher method)
@anchor{library/difflib difflib SequenceMatcher get_matching_blocks}@anchor{2816}
@deffn {Method} get_matching_blocks ()

Return list of triples describing non-overlapping matching subsequences.
Each triple is of the form @code{(i, j, n)},
and means that @code{a[i:i+n] == b[j:j+n]}.  The
triples are monotonically increasing in `i' and `j'.

The last triple is a dummy, and has the value @code{(len(a), len(b), 0)}.  It
is the only triple with @code{n == 0}.  If @code{(i, j, n)} and @code{(i', j', n')}
are adjacent triples in the list, and the second is not the last triple in
the list, then @code{i+n < i'} or @code{j+n < j'}; in other words, adjacent
triples always describe non-adjacent equal blocks.

@c XXX Explain why a dummy is used!

@example
>>> s = SequenceMatcher(None, "abxcd", "abcd")
>>> s.get_matching_blocks()
[Match(a=0, b=0, size=2), Match(a=3, b=2, size=2), Match(a=5, b=4, size=0)]
@end example
@end deffn

@geindex get_opcodes() (difflib.SequenceMatcher method)
@anchor{library/difflib difflib SequenceMatcher get_opcodes}@anchor{2817}
@deffn {Method} get_opcodes ()

Return list of 5-tuples describing how to turn `a' into `b'. Each tuple is
of the form @code{(tag, i1, i2, j1, j2)}.  The first tuple has @code{i1 == j1 ==
0}, and remaining tuples have `i1' equal to the `i2' from the preceding
tuple, and, likewise, `j1' equal to the previous `j2'.

The `tag' values are strings, with these meanings:


@multitable {xxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Value

@tab

Meaning

@item

@code{'replace'}

@tab

@code{a[i1:i2]} should be replaced by
@code{b[j1:j2]}.

@item

@code{'delete'}

@tab

@code{a[i1:i2]} should be deleted.  Note that
@code{j1 == j2} in this case.

@item

@code{'insert'}

@tab

@code{b[j1:j2]} should be inserted at
@code{a[i1:i1]}. Note that @code{i1 == i2} in
this case.

@item

@code{'equal'}

@tab

@code{a[i1:i2] == b[j1:j2]} (the sub-sequences
are equal).

@end multitable


For example:

@example
>>> a = "qabxcd"
>>> b = "abycdf"
>>> s = SequenceMatcher(None, a, b)
>>> for tag, i1, i2, j1, j2 in s.get_opcodes():
...     print('@{:7@}   a[@{@}:@{@}] --> b[@{@}:@{@}] @{!r:>8@} --> @{!r@}'.format(
...         tag, i1, i2, j1, j2, a[i1:i2], b[j1:j2]))
delete    a[0:1] --> b[0:0]      'q' --> '@w{'}
equal     a[1:3] --> b[0:2]     'ab' --> 'ab'
replace   a[3:4] --> b[2:3]      'x' --> 'y'
equal     a[4:6] --> b[3:5]     'cd' --> 'cd'
insert    a[6:6] --> b[5:6]       '@w{'} --> 'f'
@end example
@end deffn

@geindex get_grouped_opcodes() (difflib.SequenceMatcher method)
@anchor{library/difflib difflib SequenceMatcher get_grouped_opcodes}@anchor{2818}
@deffn {Method} get_grouped_opcodes (n=3)

Return a @ref{1267,,generator} of groups with up to `n' lines of context.

Starting with the groups returned by @ref{2817,,get_opcodes()}, this method
splits out smaller change clusters and eliminates intervening ranges which
have no changes.

The groups are returned in the same format as @ref{2817,,get_opcodes()}.
@end deffn

@geindex ratio() (difflib.SequenceMatcher method)
@anchor{library/difflib difflib SequenceMatcher ratio}@anchor{2819}
@deffn {Method} ratio ()

Return a measure of the sequences’ similarity as a float in the range [0,
1].

Where T is the total number of elements in both sequences, and M is the
number of matches, this is 2.0*M / T. Note that this is @code{1.0} if the
sequences are identical, and @code{0.0} if they have nothing in common.

This is expensive to compute if @ref{2816,,get_matching_blocks()} or
@ref{2817,,get_opcodes()} hasn’t already been called, in which case you may want
to try @ref{281a,,quick_ratio()} or @ref{281b,,real_quick_ratio()} first to get an
upper bound.

@cartouche
@quotation Note 
Caution: The result of a @code{ratio()} call may depend on the order of
the arguments. For instance:

@example
>>> SequenceMatcher(None, 'tide', 'diet').ratio()
0.25
>>> SequenceMatcher(None, 'diet', 'tide').ratio()
0.5
@end example
@end quotation
@end cartouche
@end deffn

@geindex quick_ratio() (difflib.SequenceMatcher method)
@anchor{library/difflib difflib SequenceMatcher quick_ratio}@anchor{281a}
@deffn {Method} quick_ratio ()

Return an upper bound on @ref{2819,,ratio()} relatively quickly.
@end deffn

@geindex real_quick_ratio() (difflib.SequenceMatcher method)
@anchor{library/difflib difflib SequenceMatcher real_quick_ratio}@anchor{281b}
@deffn {Method} real_quick_ratio ()

Return an upper bound on @ref{2819,,ratio()} very quickly.
@end deffn
@end deffn

The three methods that return the ratio of matching to total characters can give
different results due to differing levels of approximation, although
@ref{281a,,quick_ratio()} and @ref{281b,,real_quick_ratio()}
are always at least as large as @ref{2819,,ratio()}:

@example
>>> s = SequenceMatcher(None, "abcd", "bcde")
>>> s.ratio()
0.75
>>> s.quick_ratio()
0.75
>>> s.real_quick_ratio()
1.0
@end example

@node SequenceMatcher examples,Differ objects,SequenceMatcher objects,difflib — Helpers for computing deltas
@anchor{library/difflib id1}@anchor{281c}@anchor{library/difflib sequencematcher-examples}@anchor{281d}
@subsubsection SequenceMatcher examples


This example compares two strings, considering blanks to be “junk”:

@example
>>> s = SequenceMatcher(lambda x: x == " ",
...                     "private Thread currentThread;",
...                     "private volatile Thread currentThread;")
@end example

@ref{2819,,ratio()} returns a float in [0, 1], measuring the similarity of the
sequences.  As a rule of thumb, a @code{ratio()} value over 0.6 means the
sequences are close matches:

@example
>>> print(round(s.ratio(), 3))
0.866
@end example

If you’re only interested in where the sequences match,
@ref{2816,,get_matching_blocks()} is handy:

@example
>>> for block in s.get_matching_blocks():
...     print("a[%d] and b[%d] match for %d elements" % block)
a[0] and b[0] match for 8 elements
a[8] and b[17] match for 21 elements
a[29] and b[38] match for 0 elements
@end example

Note that the last tuple returned by @ref{2816,,get_matching_blocks()}
is always a dummy, @code{(len(a), len(b), 0)}, and this is the only case in which the last
tuple element (number of elements matched) is @code{0}.

If you want to know how to change the first sequence into the second, use
@ref{2817,,get_opcodes()}:

@example
>>> for opcode in s.get_opcodes():
...     print("%6s a[%d:%d] b[%d:%d]" % opcode)
 equal a[0:8] b[0:8]
insert a[8:8] b[8:17]
 equal a[8:29] b[17:38]
@end example


@subsubheading See also



@itemize *

@item 
The @ref{280d,,get_close_matches()} function in this module which shows how
simple code building on @ref{121f,,SequenceMatcher} can be used to do useful
work.

@item 
Simple version control recipe@footnote{https://code.activestate.com/recipes/576729-simple-version-control/} for a small application
built with @ref{121f,,SequenceMatcher}.
@end itemize


@node Differ objects,Differ example,SequenceMatcher examples,difflib — Helpers for computing deltas
@anchor{library/difflib differ-objects}@anchor{281e}@anchor{library/difflib id2}@anchor{281f}
@subsubsection Differ objects


Note that @ref{2807,,Differ}-generated deltas make no claim to be `minimal'
diffs. To the contrary, minimal diffs are often counter-intuitive, because they
synch up anywhere possible, sometimes accidental matches 100 pages apart.
Restricting synch points to contiguous matches preserves some notion of
locality, at the occasional cost of producing a longer diff.

The @ref{2807,,Differ} class has this constructor:


@deffn {Class} difflib.Differ (linejunk=None, charjunk=None)

Optional keyword parameters `linejunk' and `charjunk' are for filter functions
(or @code{None}):

`linejunk': A function that accepts a single string argument, and returns true
if the string is junk.  The default is @code{None}, meaning that no line is
considered junk.

`charjunk': A function that accepts a single character argument (a string of
length 1), and returns true if the character is junk. The default is @code{None},
meaning that no character is considered junk.

These junk-filtering functions speed up matching to find
differences and do not cause any differing lines or characters to
be ignored.  Read the description of the
@ref{1d8f,,find_longest_match()} method’s `isjunk'
parameter for an explanation.

@ref{2807,,Differ} objects are used (deltas generated) via a single method:

@geindex compare() (difflib.Differ method)
@anchor{library/difflib difflib Differ compare}@anchor{2810}
@deffn {Method} compare (a, b)

Compare two sequences of lines, and generate the delta (a sequence of lines).

Each sequence must contain individual single-line strings ending with
newlines.  Such sequences can be obtained from the
@ref{280b,,readlines()} method of file-like objects.  The delta
generated also consists of newline-terminated strings, ready to be
printed as-is via the @ref{17cc,,writelines()} method of a
file-like object.
@end deffn
@end deffn

@node Differ example,A command-line interface to difflib,Differ objects,difflib — Helpers for computing deltas
@anchor{library/difflib differ-example}@anchor{2820}@anchor{library/difflib differ-examples}@anchor{2821}
@subsubsection Differ example


This example compares two texts. First we set up the texts, sequences of
individual single-line strings ending with newlines (such sequences can also be
obtained from the @ref{280b,,readlines()} method of file-like objects):

@example
>>> text1 = '@w{'}'  1. Beautiful is better than ugly.
...   2. Explicit is better than implicit.
...   3. Simple is better than complex.
...   4. Complex is better than complicated.
... '@w{'}'.splitlines(keepends=True)
>>> len(text1)
4
>>> text1[0][-1]
'\n'
>>> text2 = '@w{'}'  1. Beautiful is better than ugly.
...   3.   Simple is better than complex.
...   4. Complicated is better than complex.
...   5. Flat is better than nested.
... '@w{'}'.splitlines(keepends=True)
@end example

Next we instantiate a Differ object:

@example
>>> d = Differ()
@end example

Note that when instantiating a @ref{2807,,Differ} object we may pass functions to
filter out line and character “junk.”  See the @ref{2807,,Differ()} constructor for
details.

Finally, we compare the two:

@example
>>> result = list(d.compare(text1, text2))
@end example

@code{result} is a list of strings, so let’s pretty-print it:

@example
>>> from pprint import pprint
>>> pprint(result)
['    1. Beautiful is better than ugly.\n',
 '-   2. Explicit is better than implicit.\n',
 '-   3. Simple is better than complex.\n',
 '+   3.   Simple is better than complex.\n',
 '?     ++\n',
 '-   4. Complex is better than complicated.\n',
 '?            ^                     ---- ^\n',
 '+   4. Complicated is better than complex.\n',
 '?           ++++ ^                      ^\n',
 '+   5. Flat is better than nested.\n']
@end example

As a single multi-line string it looks like this:

@example
>>> import sys
>>> sys.stdout.writelines(result)
    1. Beautiful is better than ugly.
-   2. Explicit is better than implicit.
-   3. Simple is better than complex.
+   3.   Simple is better than complex.
?     ++
-   4. Complex is better than complicated.
?            ^                     ---- ^
+   4. Complicated is better than complex.
?           ++++ ^                      ^
+   5. Flat is better than nested.
@end example

@node A command-line interface to difflib,ndiff example,Differ example,difflib — Helpers for computing deltas
@anchor{library/difflib a-command-line-interface-to-difflib}@anchor{2822}@anchor{library/difflib difflib-interface}@anchor{280c}
@subsubsection A command-line interface to difflib


This example shows how to use difflib to create a @code{diff}-like utility.

@example
""" Command-line interface to difflib.py providing diffs in four formats:

* ndiff:    lists every line and highlights interline changes.
* context:  highlights clusters of changes in a before/after format.
* unified:  highlights clusters of changes in an inline format.
* html:     generates side by side comparison with change highlights.

"""

import sys, os, difflib, argparse
import datetime as dt

def file_mtime(path):
    t = dt.datetime.fromtimestamp(os.stat(path).st_mtime,
                                  dt.timezone.utc)
    return t.astimezone().isoformat()

def main():

    parser = argparse.ArgumentParser()
    parser.add_argument('-c', action='store_true', default=False,
                        help='Produce a context format diff (default)')
    parser.add_argument('-u', action='store_true', default=False,
                        help='Produce a unified format diff')
    parser.add_argument('-m', action='store_true', default=False,
                        help='Produce HTML side by side diff '
                             '(can use -c and -l in conjunction)')
    parser.add_argument('-n', action='store_true', default=False,
                        help='Produce a ndiff format diff')
    parser.add_argument('-l', '--lines', type=int, default=3,
                        help='Set number of context lines (default 3)')
    parser.add_argument('fromfile')
    parser.add_argument('tofile')
    options = parser.parse_args()

    n = options.lines
    fromfile = options.fromfile
    tofile = options.tofile

    fromdate = file_mtime(fromfile)
    todate = file_mtime(tofile)
    with open(fromfile) as ff:
        fromlines = ff.readlines()
    with open(tofile) as tf:
        tolines = tf.readlines()

    if options.u:
        diff = difflib.unified_diff(fromlines, tolines, fromfile, tofile, fromdate, todate, n=n)
    elif options.n:
        diff = difflib.ndiff(fromlines, tolines)
    elif options.m:
        diff = difflib.HtmlDiff().make_file(fromlines,tolines,fromfile,tofile,context=options.c,numlines=n)
    else:
        diff = difflib.context_diff(fromlines, tolines, fromfile, tofile, fromdate, todate, n=n)

    sys.stdout.writelines(diff)

if __name__ == '__main__':
    main()
@end example

@node ndiff example,,A command-line interface to difflib,difflib — Helpers for computing deltas
@anchor{library/difflib ndiff-example}@anchor{2823}
@subsubsection ndiff example


This example shows how to use @ref{2809,,difflib.ndiff()}.

@example
"""ndiff [-q] file1 file2
    or
ndiff (-r1 | -r2) < ndiff_output > file1_or_file2

Print a human-friendly file difference report to stdout.  Both inter-
and intra-line differences are noted.  In the second form, recreate file1
(-r1) or file2 (-r2) on stdout, from an ndiff report on stdin.

In the first form, if -q ("quiet") is not specified, the first two lines
of output are

-: file1
+: file2

Each remaining line begins with a two-letter code:

    "- "    line unique to file1
    "+ "    line unique to file2
    "  "    line common to both files
    "? "    line not present in either input file

Lines beginning with "? " attempt to guide the eye to intraline
differences, and were not present in either input file.  These lines can be
confusing if the source files contain tab characters.

The first file can be recovered by retaining only lines that begin with
"  " or "- ", and deleting those 2-character prefixes; use ndiff with -r1.

The second file can be recovered similarly, but by retaining only "  " and
"+ " lines; use ndiff with -r2; or, on Unix, the second file can be
recovered by piping the output through

    sed -n '/^[+ ] /s/^..//p'
"""

__version__ = 1, 7, 0

import difflib, sys

def fail(msg):
    out = sys.stderr.write
    out(msg + "\n\n")
    out(__doc__)
    return 0

# open a file & return the file object; gripe and return 0 if it
# couldn't be opened
def fopen(fname):
    try:
        return open(fname)
    except IOError as detail:
        return fail("couldn't open " + fname + ": " + str(detail))

# open two files & spray the diff to stdout; return false iff a problem
def fcompare(f1name, f2name):
    f1 = fopen(f1name)
    f2 = fopen(f2name)
    if not f1 or not f2:
        return 0

    a = f1.readlines(); f1.close()
    b = f2.readlines(); f2.close()
    for line in difflib.ndiff(a, b):
        print(line, end=' ')

    return 1

# crack args (sys.argv[1:] is normal) & compare;
# return false iff a problem

def main(args):
    import getopt
    try:
        opts, args = getopt.getopt(args, "qr:")
    except getopt.error as detail:
        return fail(str(detail))
    noisy = 1
    qseen = rseen = 0
    for opt, val in opts:
        if opt == "-q":
            qseen = 1
            noisy = 0
        elif opt == "-r":
            rseen = 1
            whichfile = val
    if qseen and rseen:
        return fail("can't specify both -q and -r")
    if rseen:
        if args:
            return fail("no args allowed with -r option")
        if whichfile in ("1", "2"):
            restore(whichfile)
            return 1
        return fail("-r value must be 1 or 2")
    if len(args) != 2:
        return fail("need 2 filename args")
    f1name, f2name = args
    if noisy:
        print('-:', f1name)
        print('+:', f2name)
    return fcompare(f1name, f2name)

# read ndiff output from stdin, and print file1 (which=='1') or
# file2 (which=='2') to stdout

def restore(which):
    restored = difflib.restore(sys.stdin.readlines(), which)
    sys.stdout.writelines(restored)

if __name__ == '__main__':
    main(sys.argv[1:])
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node textwrap — Text wrapping and filling,unicodedata — Unicode Database,difflib — Helpers for computing deltas,Text Processing Services
@anchor{library/textwrap doc}@anchor{2824}@anchor{library/textwrap module-textwrap}@anchor{f2}@anchor{library/textwrap textwrap-text-wrapping-and-filling}@anchor{2825}@anchor{library/textwrap translation-repo}@anchor{2826}
@subsection @code{textwrap} — Text wrapping and filling


@geindex module; textwrap

`Source code:' Lib/textwrap.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/textwrap.py}


__________________________________________________________________


The @code{textwrap} module provides some convenience functions,
as well as @ref{11d3,,TextWrapper}, the class that does all the work.
If you’re just wrapping or filling one or two text strings, the convenience
functions should be good enough; otherwise, you should use an instance of
@code{TextWrapper} for efficiency.

@geindex wrap() (in module textwrap)
@anchor{library/textwrap textwrap wrap}@anchor{16d3}
@deffn {Function} textwrap.wrap (text, width=70, *, initial_indent='@w{'}, subsequent_indent='@w{'}, expand_tabs=True, replace_whitespace=True, fix_sentence_endings=False, break_long_words=True, drop_whitespace=True, break_on_hyphens=True, tabsize=8, max_lines=None, placeholder=' [...]')

Wraps the single paragraph in `text' (a string) so every line is at most
`width' characters long.  Returns a list of output lines, without final
newlines.

Optional keyword arguments correspond to the instance attributes of
@ref{11d3,,TextWrapper}, documented below.

See the @ref{2827,,TextWrapper.wrap()} method for additional details on how
@code{wrap()} behaves.
@end deffn

@geindex fill() (in module textwrap)
@anchor{library/textwrap textwrap fill}@anchor{16d2}
@deffn {Function} textwrap.fill (text, width=70, *, initial_indent='@w{'}, subsequent_indent='@w{'}, expand_tabs=True, replace_whitespace=True, fix_sentence_endings=False, break_long_words=True, drop_whitespace=True, break_on_hyphens=True, tabsize=8, max_lines=None, placeholder=' [...]')

Wraps the single paragraph in `text', and returns a single string containing the
wrapped paragraph.  @code{fill()} is shorthand for

@example
"\n".join(wrap(text, ...))
@end example

In particular, @code{fill()} accepts exactly the same keyword arguments as
@ref{16d3,,wrap()}.
@end deffn

@geindex shorten() (in module textwrap)
@anchor{library/textwrap textwrap shorten}@anchor{11d6}
@deffn {Function} textwrap.shorten (text, width, *, fix_sentence_endings=False, break_long_words=True, break_on_hyphens=True, placeholder=' [...]')

Collapse and truncate the given `text' to fit in the given `width'.

First the whitespace in `text' is collapsed (all whitespace is replaced by
single spaces).  If the result fits in the `width', it is returned.
Otherwise, enough words are dropped from the end so that the remaining words
plus the `placeholder' fit within `width':

@example
>>> textwrap.shorten("Hello  world!", width=12)
'Hello world!'
>>> textwrap.shorten("Hello  world!", width=11)
'Hello [...]'
>>> textwrap.shorten("Hello world", width=10, placeholder="...")
'Hello...'
@end example

Optional keyword arguments correspond to the instance attributes of
@ref{11d3,,TextWrapper}, documented below.  Note that the whitespace is
collapsed before the text is passed to the @code{TextWrapper} @ref{16d2,,fill()}
function, so changing the value of @ref{2828,,tabsize}, @ref{2829,,expand_tabs},
@ref{282a,,drop_whitespace}, and @ref{282b,,replace_whitespace} will have no effect.


Added in version 3.4.

@end deffn

@geindex dedent() (in module textwrap)
@anchor{library/textwrap textwrap dedent}@anchor{1aa}
@deffn {Function} textwrap.dedent (text)

Remove any common leading whitespace from every line in `text'.

This can be used to make triple-quoted strings line up with the left edge of the
display, while still presenting them in the source code in indented form.

Note that tabs and spaces are both treated as whitespace, but they are not
equal: the lines @code{"  hello"} and @code{"\thello"} are considered to have no
common leading whitespace.

Lines containing only whitespace are ignored in the input and normalized to a
single newline character in the output.

For example:

@example
def test():
    # end first line with \ to avoid the empty line!
    s = '@w{'}'\
    hello
      world
    '@w{'}'
    print(repr(s))          # prints '    hello\n      world\n    '
    print(repr(dedent(s)))  # prints 'hello\n  world\n'
@end example


Changed in version 3.14: The @code{dedent()} function now correctly normalizes blank lines containing
only whitespace characters. Previously, the implementation only normalized
blank lines containing tabs and spaces.

@end deffn

@geindex indent() (in module textwrap)
@anchor{library/textwrap textwrap indent}@anchor{57d}
@deffn {Function} textwrap.indent (text, prefix, predicate=None)

Add `prefix' to the beginning of selected lines in `text'.

Lines are separated by calling @code{text.splitlines(True)}.

By default, `prefix' is added to all lines that do not consist
solely of whitespace (including any line endings).

For example:

@example
>>> s = 'hello\n\n \nworld'
>>> indent(s, '  ')
'  hello\n\n \n  world'
@end example

The optional `predicate' argument can be used to control which lines
are indented. For example, it is easy to add `prefix' to even empty
and whitespace-only lines:

@example
>>> print(indent(s, '+ ', lambda line: True))
+ hello
+
+
+ world
@end example


Added in version 3.3.

@end deffn

@ref{16d3,,wrap()}, @ref{16d2,,fill()} and @ref{11d6,,shorten()} work by creating a
@ref{11d3,,TextWrapper} instance and calling a single method on it.  That
instance is not reused, so for applications that process many text
strings using @code{wrap()} and/or @code{fill()}, it may be more efficient to
create your own @code{TextWrapper} object.

Text is preferably wrapped on whitespaces and right after the hyphens in
hyphenated words; only then will long words be broken if necessary, unless
@ref{282c,,TextWrapper.break_long_words} is set to false.

@geindex TextWrapper (class in textwrap)
@anchor{library/textwrap textwrap TextWrapper}@anchor{11d3}
@deffn {Class} textwrap.TextWrapper (**kwargs)

The @code{TextWrapper} constructor accepts a number of optional keyword
arguments.  Each keyword argument corresponds to an instance attribute, so
for example

@example
wrapper = TextWrapper(initial_indent="* ")
@end example

is the same as

@example
wrapper = TextWrapper()
wrapper.initial_indent = "* "
@end example

You can reuse the same @code{TextWrapper} object many times, and you can
change any of its options through direct assignment to instance attributes
between uses.

The @code{TextWrapper} instance attributes (and keyword arguments to the
constructor) are as follows:

@geindex width (textwrap.TextWrapper attribute)
@anchor{library/textwrap textwrap TextWrapper width}@anchor{282d}
@deffn {Attribute} width

(default: @code{70}) The maximum length of wrapped lines.  As long as there
are no individual words in the input text longer than @ref{282d,,width},
@code{TextWrapper} guarantees that no output line will be longer than
@code{width} characters.
@end deffn

@geindex expand_tabs (textwrap.TextWrapper attribute)
@anchor{library/textwrap textwrap TextWrapper expand_tabs}@anchor{2829}
@deffn {Attribute} expand_tabs

(default: @code{True}) If true, then all tab characters in `text' will be
expanded to spaces using the @ref{268a,,expandtabs()} method of `text'.
@end deffn

@geindex tabsize (textwrap.TextWrapper attribute)
@anchor{library/textwrap textwrap TextWrapper tabsize}@anchor{2828}
@deffn {Attribute} tabsize

(default: @code{8}) If @ref{2829,,expand_tabs} is true, then all tab characters
in `text' will be expanded to zero or more spaces, depending on the
current column and the given tab size.


Added in version 3.3.

@end deffn

@geindex replace_whitespace (textwrap.TextWrapper attribute)
@anchor{library/textwrap textwrap TextWrapper replace_whitespace}@anchor{282b}
@deffn {Attribute} replace_whitespace

(default: @code{True}) If true, after tab expansion but before wrapping,
the @ref{16d3,,wrap()} method will replace each whitespace character
with a single space.  The whitespace characters replaced are
as follows: tab, newline, vertical tab, formfeed, and carriage
return (@code{'\t\n\v\f\r'}).

@cartouche
@quotation Note 
If @ref{2829,,expand_tabs} is false and @ref{282b,,replace_whitespace} is true,
each tab character will be replaced by a single space, which is `not'
the same as tab expansion.
@end quotation
@end cartouche

@cartouche
@quotation Note 
If @ref{282b,,replace_whitespace} is false, newlines may appear in the
middle of a line and cause strange output. For this reason, text should
be split into paragraphs (using @ref{1462,,str.splitlines()} or similar)
which are wrapped separately.
@end quotation
@end cartouche
@end deffn

@geindex drop_whitespace (textwrap.TextWrapper attribute)
@anchor{library/textwrap textwrap TextWrapper drop_whitespace}@anchor{282a}
@deffn {Attribute} drop_whitespace

(default: @code{True}) If true, whitespace at the beginning and ending of
every line (after wrapping but before indenting) is dropped.
Whitespace at the beginning of the paragraph, however, is not dropped
if non-whitespace follows it.  If whitespace being dropped takes up an
entire line, the whole line is dropped.
@end deffn

@geindex initial_indent (textwrap.TextWrapper attribute)
@anchor{library/textwrap textwrap TextWrapper initial_indent}@anchor{282e}
@deffn {Attribute} initial_indent

(default: @code{'@w{'}}) String that will be prepended to the first line of
wrapped output.  Counts towards the length of the first line.  The empty
string is not indented.
@end deffn

@geindex subsequent_indent (textwrap.TextWrapper attribute)
@anchor{library/textwrap textwrap TextWrapper subsequent_indent}@anchor{282f}
@deffn {Attribute} subsequent_indent

(default: @code{'@w{'}}) String that will be prepended to all lines of wrapped
output except the first.  Counts towards the length of each line except
the first.
@end deffn

@geindex fix_sentence_endings (textwrap.TextWrapper attribute)
@anchor{library/textwrap textwrap TextWrapper fix_sentence_endings}@anchor{2830}
@deffn {Attribute} fix_sentence_endings

(default: @code{False}) If true, @code{TextWrapper} attempts to detect
sentence endings and ensure that sentences are always separated by exactly
two spaces.  This is generally desired for text in a monospaced font.
However, the sentence detection algorithm is imperfect: it assumes that a
sentence ending consists of a lowercase letter followed by one of @code{'.'},
@code{'!'}, or @code{'?'}, possibly followed by one of @code{'"'} or @code{"'"},
followed by a space.  One problem with this algorithm is that it is
unable to detect the difference between “Dr.” in

@example
[...] Dr. Frankenstein's monster [...]
@end example

and “Spot.” in

@example
[...] See Spot. See Spot run [...]
@end example

@ref{2830,,fix_sentence_endings} is false by default.

Since the sentence detection algorithm relies on @code{string.lowercase} for
the definition of “lowercase letter”, and a convention of using two spaces
after a period to separate sentences on the same line, it is specific to
English-language texts.
@end deffn

@geindex break_long_words (textwrap.TextWrapper attribute)
@anchor{library/textwrap textwrap TextWrapper break_long_words}@anchor{282c}
@deffn {Attribute} break_long_words

(default: @code{True}) If true, then words longer than @ref{282d,,width} will be
broken in order to ensure that no lines are longer than @code{width}.  If
it is false, long words will not be broken, and some lines may be longer
than @code{width}.  (Long words will be put on a line by themselves, in
order to minimize the amount by which @code{width} is exceeded.)
@end deffn

@geindex break_on_hyphens (textwrap.TextWrapper attribute)
@anchor{library/textwrap textwrap TextWrapper break_on_hyphens}@anchor{2831}
@deffn {Attribute} break_on_hyphens

(default: @code{True}) If true, wrapping will occur preferably on whitespaces
and right after hyphens in compound words, as it is customary in English.
If false, only whitespaces will be considered as potentially good places
for line breaks, but you need to set @ref{282c,,break_long_words} to false if
you want truly insecable words.  Default behaviour in previous versions
was to always allow breaking hyphenated words.
@end deffn

@geindex max_lines (textwrap.TextWrapper attribute)
@anchor{library/textwrap textwrap TextWrapper max_lines}@anchor{11d4}
@deffn {Attribute} max_lines

(default: @code{None}) If not @code{None}, then the output will contain at most
`max_lines' lines, with `placeholder' appearing at the end of the output.


Added in version 3.4.

@end deffn

@geindex ...; placeholder

@geindex placeholder (textwrap.TextWrapper attribute)
@anchor{library/textwrap textwrap TextWrapper placeholder}@anchor{11d5}
@deffn {Attribute} placeholder

(default: @code{' [...]'}) String that will appear at the end of the output
text if it has been truncated.


Added in version 3.4.

@end deffn

@code{TextWrapper} also provides some public methods, analogous to the
module-level convenience functions:

@geindex wrap() (textwrap.TextWrapper method)
@anchor{library/textwrap textwrap TextWrapper wrap}@anchor{2827}
@deffn {Method} wrap (text)

Wraps the single paragraph in `text' (a string) so every line is at most
@ref{282d,,width} characters long.  All wrapping options are taken from
instance attributes of the @code{TextWrapper} instance.  Returns a list
of output lines, without final newlines.  If the wrapped output has no
content, the returned list is empty.
@end deffn

@geindex fill() (textwrap.TextWrapper method)
@anchor{library/textwrap textwrap TextWrapper fill}@anchor{2832}
@deffn {Method} fill (text)

Wraps the single paragraph in `text', and returns a single string
containing the wrapped paragraph.
@end deffn
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node unicodedata — Unicode Database,stringprep — Internet String Preparation,textwrap — Text wrapping and filling,Text Processing Services
@anchor{library/unicodedata doc}@anchor{2833}@anchor{library/unicodedata module-unicodedata}@anchor{10c}@anchor{library/unicodedata translation-repo}@anchor{2834}@anchor{library/unicodedata unicodedata-unicode-database}@anchor{2835}
@subsection @code{unicodedata} — Unicode Database


@geindex module; unicodedata

@geindex Unicode
@geindex character
@geindex Unicode; database


__________________________________________________________________


This module provides access to the Unicode Character Database (UCD) which
defines character properties for all Unicode characters. The data contained in
this database is compiled from the UCD version 16.0.0@footnote{https://www.unicode.org/Public/16.0.0/ucd}.

The module uses the same names and symbols as defined by Unicode
Standard Annex #44, "Unicode Character Database"@footnote{https://www.unicode.org/reports/tr44/}.  It defines the
following functions:


@subsubheading See also


The @ref{14b0,,Unicode HOWTO} for more information about Unicode and how to use
this module.


@geindex lookup() (in module unicodedata)
@anchor{library/unicodedata unicodedata lookup}@anchor{127e}
@deffn {Function} unicodedata.lookup (name)

Look up character by name.  If a character with the given name is found, return
the corresponding character.  If not found, @ref{5e7,,KeyError} is raised.
For example:

@example
>>> unicodedata.lookup('LEFT CURLY BRACKET')
'@{'
@end example

The characters returned by this function are the same as those produced by
@code{\N} escape sequence in string literals. For example:

@example
>>> unicodedata.lookup('MIDDLE DOT') == '\N@{MIDDLE DOT@}'
True
@end example


Changed in version 3.3: Support for name aliases @footnote{
@indicateurl{https://www.unicode.org/Public/16.0.0/ucd/NameAliases.txt}
} and named sequences @footnote{
@indicateurl{https://www.unicode.org/Public/16.0.0/ucd/NamedSequences.txt}
} has been added.

@end deffn

@geindex name() (in module unicodedata)
@anchor{library/unicodedata unicodedata name}@anchor{2836}
@deffn {Function} unicodedata.name (chr, default=None, /)

Returns the name assigned to the character `chr' as a string. If no
name is defined, `default' is returned, or, if not given, @ref{2ee,,ValueError} is
raised. For example:

@example
>>> unicodedata.name('½')
'VULGAR FRACTION ONE HALF'
>>> unicodedata.name('\uFFFF', 'fallback')
'fallback'
@end example
@end deffn

@geindex decimal() (in module unicodedata)
@anchor{library/unicodedata unicodedata decimal}@anchor{2837}
@deffn {Function} unicodedata.decimal (chr, default=None, /)

Returns the decimal value assigned to the character `chr' as integer.
If no such value is defined, `default' is returned, or, if not given,
@ref{2ee,,ValueError} is raised. For example:

@example
>>> unicodedata.decimal('\N@{ARABIC-INDIC DIGIT NINE@}')
9
>>> unicodedata.decimal('\N@{SUPERSCRIPT NINE@}', -1)
-1
@end example
@end deffn

@geindex digit() (in module unicodedata)
@anchor{library/unicodedata unicodedata digit}@anchor{2838}
@deffn {Function} unicodedata.digit (chr, default=None, /)

Returns the digit value assigned to the character `chr' as integer.
If no such value is defined, `default' is returned, or, if not given,
@ref{2ee,,ValueError} is raised:

@example
>>> unicodedata.digit('\N@{SUPERSCRIPT NINE@}')
9
@end example
@end deffn

@geindex numeric() (in module unicodedata)
@anchor{library/unicodedata unicodedata numeric}@anchor{146e}
@deffn {Function} unicodedata.numeric (chr, default=None, /)

Returns the numeric value assigned to the character `chr' as float.
If no such value is defined, `default' is returned, or, if not given,
@ref{2ee,,ValueError} is raised:

@example
>>> unicodedata.numeric('½')
0.5
@end example
@end deffn

@geindex category() (in module unicodedata)
@anchor{library/unicodedata unicodedata category}@anchor{2839}
@deffn {Function} unicodedata.category (chr)

Returns the general category assigned to the character `chr' as
string. General category names consist of two letters.
See the General Category Values section of the Unicode Character Database documentation@footnote{https://www.unicode.org/reports/tr44/tr44-34.html#General_Category_Values}
for a list of category codes. For example:

@example
>>> unicodedata.category('A')  # 'L'etter, 'u'ppercase
'Lu'
@end example
@end deffn

@geindex bidirectional() (in module unicodedata)
@anchor{library/unicodedata unicodedata bidirectional}@anchor{283a}
@deffn {Function} unicodedata.bidirectional (chr)

Returns the bidirectional class assigned to the character `chr' as
string. If no such value is defined, an empty string is returned.
See the Bidirectional Class Values section of the Unicode Character Database@footnote{https://www.unicode.org/reports/tr44/tr44-34.html#Bidi_Class_Values}
documentation for a list of bidirectional codes. For example:

@example
>>> unicodedata.bidirectional('\N@{ARABIC-INDIC DIGIT SEVEN@}') # 'A'rabic, 'N'umber
'AN'
@end example
@end deffn

@geindex combining() (in module unicodedata)
@anchor{library/unicodedata unicodedata combining}@anchor{283b}
@deffn {Function} unicodedata.combining (chr)

Returns the canonical combining class assigned to the character `chr'
as integer. Returns @code{0} if no combining class is defined.
See the Canonical Combining Class Values section of the Unicode Character Database@footnote{https://www.unicode.org/reports/tr44/tr44-34.html#Canonical_Combining_Class_Values}
for more information.
@end deffn

@geindex east_asian_width() (in module unicodedata)
@anchor{library/unicodedata unicodedata east_asian_width}@anchor{283c}
@deffn {Function} unicodedata.east_asian_width (chr)

Returns the east asian width assigned to the character `chr' as
string. For a list of widths and or more information, see the
Unicode Standard Annex #11@footnote{https://www.unicode.org/reports/tr11/tr11-43.html}.
@end deffn

@geindex mirrored() (in module unicodedata)
@anchor{library/unicodedata unicodedata mirrored}@anchor{283d}
@deffn {Function} unicodedata.mirrored (chr)

Returns the mirrored property assigned to the character `chr' as
integer. Returns @code{1} if the character has been identified as a “mirrored”
character in bidirectional text, @code{0} otherwise. For example:

@example
>>> unicodedata.mirrored('>')
1
@end example
@end deffn

@geindex decomposition() (in module unicodedata)
@anchor{library/unicodedata unicodedata decomposition}@anchor{17b3}
@deffn {Function} unicodedata.decomposition (chr)

Returns the character decomposition mapping assigned to the character
`chr' as string. An empty string is returned in case no such mapping is
defined. For example:

@example
>>> unicodedata.decomposition('Ã')
'0041 0303'
@end example
@end deffn

@geindex normalize() (in module unicodedata)
@anchor{library/unicodedata unicodedata normalize}@anchor{8e6}
@deffn {Function} unicodedata.normalize (form, unistr)

Return the normal form `form' for the Unicode string `unistr'. Valid values for
`form' are ‘NFC’, ‘NFKC’, ‘NFD’, and ‘NFKD’.

The Unicode standard defines various normalization forms of a Unicode string,
based on the definition of canonical equivalence and compatibility equivalence.
In Unicode, several characters can be expressed in various way. For example, the
character U+00C7 (LATIN CAPITAL LETTER C WITH CEDILLA) can also be expressed as
the sequence U+0043 (LATIN CAPITAL LETTER C) U+0327 (COMBINING CEDILLA).

For each character, there are two normal forms: normal form C and normal form D.
Normal form D (NFD) is also known as canonical decomposition, and translates
each character into its decomposed form. Normal form C (NFC) first applies a
canonical decomposition, then composes pre-combined characters again.

In addition to these two forms, there are two additional normal forms based on
compatibility equivalence. In Unicode, certain characters are supported which
normally would be unified with other characters. For example, U+2160 (ROMAN
NUMERAL ONE) is really the same thing as U+0049 (LATIN CAPITAL LETTER I).
However, it is supported in Unicode for compatibility with existing character
sets (for example, gb2312).

The normal form KD (NFKD) will apply the compatibility decomposition, that is,
replace all compatibility characters with their equivalents. The normal form KC
(NFKC) first applies the compatibility decomposition, followed by the canonical
composition.

Even if two unicode strings are normalized and look the same to
a human reader, if one has combining characters and the other
doesn’t, they may not compare equal.
@end deffn

@geindex is_normalized() (in module unicodedata)
@anchor{library/unicodedata unicodedata is_normalized}@anchor{c42}
@deffn {Function} unicodedata.is_normalized (form, unistr)

Return whether the Unicode string `unistr' is in the normal form `form'. Valid
values for `form' are ‘NFC’, ‘NFKC’, ‘NFD’, and ‘NFKD’.


Added in version 3.8.

@end deffn

In addition, the module exposes the following constant:

@geindex unidata_version (in module unicodedata)
@anchor{library/unicodedata unicodedata unidata_version}@anchor{283e}
@deffn {Data} unicodedata.unidata_version

The version of the Unicode database used in this module.
@end deffn

@geindex ucd_3_2_0 (in module unicodedata)
@anchor{library/unicodedata unicodedata ucd_3_2_0}@anchor{1640}
@deffn {Data} unicodedata.ucd_3_2_0

This is an object that has the same methods as the entire module, but uses the
Unicode database version 3.2 instead, for applications that require this
specific version of the Unicode database (such as IDNA).
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node stringprep — Internet String Preparation,readline — GNU readline interface,unicodedata — Unicode Database,Text Processing Services
@anchor{library/stringprep doc}@anchor{283f}@anchor{library/stringprep module-stringprep}@anchor{da}@anchor{library/stringprep stringprep-internet-string-preparation}@anchor{2840}@anchor{library/stringprep translation-repo}@anchor{2841}
@subsection @code{stringprep} — Internet String Preparation


@geindex module; stringprep

`Source code:' Lib/stringprep.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/stringprep.py}


__________________________________________________________________


When identifying things (such as host names) in the internet, it is often
necessary to compare such identifications for “equality”. Exactly how this
comparison is executed may depend on the application domain, e.g. whether it
should be case-insensitive or not. It may be also necessary to restrict the
possible identifications, to allow only identifications consisting of
“printable” characters.

@geindex RFC; RFC 3454
RFC 3454@footnote{https://datatracker.ietf.org/doc/html/rfc3454.html} defines a procedure for “preparing” Unicode strings in internet
protocols. Before passing strings onto the wire, they are processed with the
preparation procedure, after which they have a certain normalized form. The RFC
defines a set of tables, which can be combined into profiles. Each profile must
define which tables it uses, and what other optional parts of the @code{stringprep}
procedure are part of the profile. One example of a @code{stringprep} profile is
@code{nameprep}, which is used for internationalized domain names.

The module @code{stringprep} only exposes the tables from 
@geindex RFC; RFC 3454
RFC 3454@footnote{https://datatracker.ietf.org/doc/html/rfc3454.html}. As these
tables would be very large to represent as dictionaries or lists, the
module uses the Unicode character database internally. The module source code
itself was generated using the @code{mkstringprep.py} utility.

As a result, these tables are exposed as functions, not as data structures.
There are two kinds of tables in the RFC: sets and mappings. For a set,
@code{stringprep} provides the “characteristic function”, i.e. a function that
returns @code{True} if the parameter is part of the set. For mappings, it provides the
mapping function: given the key, it returns the associated value. Below is a
list of all functions available in the module.

@geindex in_table_a1() (in module stringprep)
@anchor{library/stringprep stringprep in_table_a1}@anchor{2842}
@deffn {Function} stringprep.in_table_a1 (code)

Determine whether `code' is in tableA.1 (Unassigned code points in Unicode 3.2).
@end deffn

@geindex in_table_b1() (in module stringprep)
@anchor{library/stringprep stringprep in_table_b1}@anchor{2843}
@deffn {Function} stringprep.in_table_b1 (code)

Determine whether `code' is in tableB.1 (Commonly mapped to nothing).
@end deffn

@geindex map_table_b2() (in module stringprep)
@anchor{library/stringprep stringprep map_table_b2}@anchor{2844}
@deffn {Function} stringprep.map_table_b2 (code)

Return the mapped value for `code' according to tableB.2 (Mapping for
case-folding used with NFKC).
@end deffn

@geindex map_table_b3() (in module stringprep)
@anchor{library/stringprep stringprep map_table_b3}@anchor{2845}
@deffn {Function} stringprep.map_table_b3 (code)

Return the mapped value for `code' according to tableB.3 (Mapping for
case-folding used with no normalization).
@end deffn

@geindex in_table_c11() (in module stringprep)
@anchor{library/stringprep stringprep in_table_c11}@anchor{2846}
@deffn {Function} stringprep.in_table_c11 (code)

Determine whether `code' is in tableC.1.1  (ASCII space characters).
@end deffn

@geindex in_table_c12() (in module stringprep)
@anchor{library/stringprep stringprep in_table_c12}@anchor{2847}
@deffn {Function} stringprep.in_table_c12 (code)

Determine whether `code' is in tableC.1.2  (Non-ASCII space characters).
@end deffn

@geindex in_table_c11_c12() (in module stringprep)
@anchor{library/stringprep stringprep in_table_c11_c12}@anchor{2848}
@deffn {Function} stringprep.in_table_c11_c12 (code)

Determine whether `code' is in tableC.1  (Space characters, union of C.1.1 and
C.1.2).
@end deffn

@geindex in_table_c21() (in module stringprep)
@anchor{library/stringprep stringprep in_table_c21}@anchor{2849}
@deffn {Function} stringprep.in_table_c21 (code)

Determine whether `code' is in tableC.2.1  (ASCII control characters).
@end deffn

@geindex in_table_c22() (in module stringprep)
@anchor{library/stringprep stringprep in_table_c22}@anchor{284a}
@deffn {Function} stringprep.in_table_c22 (code)

Determine whether `code' is in tableC.2.2  (Non-ASCII control characters).
@end deffn

@geindex in_table_c21_c22() (in module stringprep)
@anchor{library/stringprep stringprep in_table_c21_c22}@anchor{284b}
@deffn {Function} stringprep.in_table_c21_c22 (code)

Determine whether `code' is in tableC.2  (Control characters, union of C.2.1 and
C.2.2).
@end deffn

@geindex in_table_c3() (in module stringprep)
@anchor{library/stringprep stringprep in_table_c3}@anchor{284c}
@deffn {Function} stringprep.in_table_c3 (code)

Determine whether `code' is in tableC.3  (Private use).
@end deffn

@geindex in_table_c4() (in module stringprep)
@anchor{library/stringprep stringprep in_table_c4}@anchor{284d}
@deffn {Function} stringprep.in_table_c4 (code)

Determine whether `code' is in tableC.4  (Non-character code points).
@end deffn

@geindex in_table_c5() (in module stringprep)
@anchor{library/stringprep stringprep in_table_c5}@anchor{284e}
@deffn {Function} stringprep.in_table_c5 (code)

Determine whether `code' is in tableC.5  (Surrogate codes).
@end deffn

@geindex in_table_c6() (in module stringprep)
@anchor{library/stringprep stringprep in_table_c6}@anchor{284f}
@deffn {Function} stringprep.in_table_c6 (code)

Determine whether `code' is in tableC.6  (Inappropriate for plain text).
@end deffn

@geindex in_table_c7() (in module stringprep)
@anchor{library/stringprep stringprep in_table_c7}@anchor{2850}
@deffn {Function} stringprep.in_table_c7 (code)

Determine whether `code' is in tableC.7  (Inappropriate for canonical
representation).
@end deffn

@geindex in_table_c8() (in module stringprep)
@anchor{library/stringprep stringprep in_table_c8}@anchor{2851}
@deffn {Function} stringprep.in_table_c8 (code)

Determine whether `code' is in tableC.8  (Change display properties or are
deprecated).
@end deffn

@geindex in_table_c9() (in module stringprep)
@anchor{library/stringprep stringprep in_table_c9}@anchor{2852}
@deffn {Function} stringprep.in_table_c9 (code)

Determine whether `code' is in tableC.9  (Tagging characters).
@end deffn

@geindex in_table_d1() (in module stringprep)
@anchor{library/stringprep stringprep in_table_d1}@anchor{2853}
@deffn {Function} stringprep.in_table_d1 (code)

Determine whether `code' is in tableD.1  (Characters with bidirectional property
“R” or “AL”).
@end deffn

@geindex in_table_d2() (in module stringprep)
@anchor{library/stringprep stringprep in_table_d2}@anchor{2854}
@deffn {Function} stringprep.in_table_d2 (code)

Determine whether `code' is in tableD.2  (Characters with bidirectional property
“L”).
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node readline — GNU readline interface,rlcompleter — Completion function for GNU readline,stringprep — Internet String Preparation,Text Processing Services
@anchor{library/readline doc}@anchor{2855}@anchor{library/readline module-readline}@anchor{bf}@anchor{library/readline readline-gnu-readline-interface}@anchor{2856}@anchor{library/readline translation-repo}@anchor{2857}
@subsection @code{readline} — GNU readline interface


@geindex module; readline


__________________________________________________________________


The @code{readline} module defines a number of functions to facilitate
completion and reading/writing of history files from the Python interpreter.
This module can be used directly, or via the @ref{c2,,rlcompleter} module, which
supports completion of Python identifiers at the interactive prompt.  Settings
made using  this module affect the behaviour of both the interpreter’s
interactive prompt  and the prompts offered by the built-in @ref{14e4,,input()}
function.

Readline keybindings may be configured via an initialization file, typically
@code{.inputrc} in your home directory.  See Readline Init File@footnote{https://tiswww.cwru.edu/php/chet/readline/rluserman.html#Readline-Init-File}
in the GNU Readline manual for information about the format and
allowable constructs of that file, and the capabilities of the
Readline library in general.

@c include for modules that don't work on WASM or mobile platforms

@ref{2181,,Availability}: not Android, not iOS, not WASI.

This module is not supported on @ref{22a0,,mobile platforms}
or @ref{1bae,,WebAssembly platforms}.

This is an @ref{219c,,optional module}.
If it is missing from your copy of CPython,
look for documentation from your distributor (that is,
whoever provided Python to you).
If you are the distributor, see @ref{219a,,Requirements for optional modules}.

@c Similar notes appear in the docs of the modules:
@c - zipfile
@c - tarfile

@ref{2181,,Availability}: Unix.

@cartouche
@quotation Note 
The underlying Readline library API may be implemented by
the @code{editline} (@code{libedit}) library instead of GNU readline.
On macOS the @code{readline} module detects which library is being used
at run time.

The configuration file for @code{editline} is different from that
of GNU readline. If you programmatically load configuration strings
you can use @ref{1a6e,,backend} to determine which library is being used.

If you use @code{editline}/@code{libedit} readline emulation on macOS, the
initialization file located in your home directory is named
@code{.editrc}. For example, the following content in @code{~/.editrc} will
turn ON `vi' keybindings and TAB completion:

@example
python:bind -v
python:bind ^I rl_complete
@end example

Also note that different libraries may use different history file formats.
When switching the underlying library, existing history files may become
unusable.
@end quotation
@end cartouche

@geindex backend (in module readline)
@anchor{library/readline readline backend}@anchor{1a6e}
@deffn {Data} readline.backend

The name of the underlying Readline library being used, either
@code{"readline"} or @code{"editline"}.


Added in version 3.13.

@end deffn

@menu
* Init file:: 
* Line buffer:: 
* History file:: 
* History list:: 
* Startup hooks:: 
* Completion:: 
* Example:: 

@end menu

@node Init file,Line buffer,,readline — GNU readline interface
@anchor{library/readline init-file}@anchor{2858}
@subsubsection Init file


The following functions relate to the init file and user configuration:

@geindex parse_and_bind() (in module readline)
@anchor{library/readline readline parse_and_bind}@anchor{2859}
@deffn {Function} readline.parse_and_bind (string)

Execute the init line provided in the `string' argument. This calls
@code{rl_parse_and_bind()} in the underlying library.
@end deffn

@geindex read_init_file() (in module readline)
@anchor{library/readline readline read_init_file}@anchor{1828}
@deffn {Function} readline.read_init_file ([filename])

Execute a readline initialization file. The default filename is the last filename
used. This calls @code{rl_read_init_file()} in the underlying library.
It raises an @ref{1cb1,,auditing event} @code{open} with the file name
if given, and @code{"<readline_init_file>"} otherwise, regardless of
which file the library resolves.


Changed in version 3.14: The auditing event was added.

@end deffn

@node Line buffer,History file,Init file,readline — GNU readline interface
@anchor{library/readline line-buffer}@anchor{285a}
@subsubsection Line buffer


The following functions operate on the line buffer:

@geindex get_line_buffer() (in module readline)
@anchor{library/readline readline get_line_buffer}@anchor{285b}
@deffn {Function} readline.get_line_buffer ()

Return the current contents of the line buffer (@code{rl_line_buffer}
in the underlying library).
@end deffn

@geindex insert_text() (in module readline)
@anchor{library/readline readline insert_text}@anchor{285c}
@deffn {Function} readline.insert_text (string)

Insert text into the line buffer at the cursor position.  This calls
@code{rl_insert_text()} in the underlying library, but ignores
the return value.
@end deffn

@geindex redisplay() (in module readline)
@anchor{library/readline readline redisplay}@anchor{16d1}
@deffn {Function} readline.redisplay ()

Change what’s displayed on the screen to reflect the current contents of the
line buffer.  This calls @code{rl_redisplay()} in the underlying library.
@end deffn

@node History file,History list,Line buffer,readline — GNU readline interface
@anchor{library/readline history-file}@anchor{285d}
@subsubsection History file


The following functions operate on a history file:

@geindex read_history_file() (in module readline)
@anchor{library/readline readline read_history_file}@anchor{1829}
@deffn {Function} readline.read_history_file ([filename])

Load a readline history file, and append it to the history list.
The default filename is @code{~/.history}.  This calls
@code{read_history()} in the underlying library
and raises an @ref{1cb1,,auditing event} @code{open} with the file
name if given and @code{"~/.history"} otherwise.


Changed in version 3.14: The auditing event was added.

@end deffn

@geindex write_history_file() (in module readline)
@anchor{library/readline readline write_history_file}@anchor{182a}
@deffn {Function} readline.write_history_file ([filename])

Save the history list to a readline history file, overwriting any
existing file.  The default filename is @code{~/.history}.  This calls
@code{write_history()} in the underlying library and raises an
@ref{1cb1,,auditing event} @code{open} with the file name if given and
@code{"~/.history"} otherwise.


Changed in version 3.14: The auditing event was added.

@end deffn

@geindex append_history_file() (in module readline)
@anchor{library/readline readline append_history_file}@anchor{1057}
@deffn {Function} readline.append_history_file (nelements[, filename])

Append the last `nelements' items of history to a file.  The default filename is
@code{~/.history}.  The file must already exist.  This calls
@code{append_history()} in the underlying library.  This function
only exists if Python was compiled for a version of the library
that supports it. It raises an @ref{1cb1,,auditing event} @code{open}
with the file name if given and @code{"~/.history"} otherwise.


Added in version 3.5.



Changed in version 3.14: The auditing event was added.

@end deffn

@geindex get_history_length() (in module readline)
@geindex set_history_length() (in module readline)
@anchor{library/readline readline get_history_length}@anchor{285e}
@deffn {Function} readline.get_history_length ()
@anchor{library/readline readline set_history_length}@anchor{196a}
@deffnx {Function} readline.set_history_length (length)

Set or return the desired number of lines to save in the history file.
The @ref{182a,,write_history_file()} function uses this value to truncate
the history file, by calling @code{history_truncate_file()} in
the underlying library.  Negative values imply
unlimited history file size.
@end deffn

@node History list,Startup hooks,History file,readline — GNU readline interface
@anchor{library/readline history-list}@anchor{285f}
@subsubsection History list


The following functions operate on a global history list:

@geindex clear_history() (in module readline)
@anchor{library/readline readline clear_history}@anchor{2860}
@deffn {Function} readline.clear_history ()

Clear the current history.  This calls @code{clear_history()} in the
underlying library.  The Python function only exists if Python was
compiled for a version of the library that supports it.
@end deffn

@geindex get_current_history_length() (in module readline)
@anchor{library/readline readline get_current_history_length}@anchor{16d0}
@deffn {Function} readline.get_current_history_length ()

Return the number of items currently in the history.  (This is different from
@ref{285e,,get_history_length()}, which returns the maximum number of lines that will
be written to a history file.)
@end deffn

@geindex get_history_item() (in module readline)
@anchor{library/readline readline get_history_item}@anchor{16cf}
@deffn {Function} readline.get_history_item (index)

Return the current contents of history item at `index'.  The item index
is one-based.  This calls @code{history_get()} in the underlying library.
@end deffn

@geindex remove_history_item() (in module readline)
@anchor{library/readline readline remove_history_item}@anchor{2861}
@deffn {Function} readline.remove_history_item (pos)

Remove history item specified by its position from the history.
The position is zero-based.  This calls @code{remove_history()} in
the underlying library.
@end deffn

@geindex replace_history_item() (in module readline)
@anchor{library/readline readline replace_history_item}@anchor{2862}
@deffn {Function} readline.replace_history_item (pos, line)

Replace history item specified by its position with `line'.
The position is zero-based.  This calls @code{replace_history_entry()}
in the underlying library.
@end deffn

@geindex add_history() (in module readline)
@anchor{library/readline readline add_history}@anchor{2863}
@deffn {Function} readline.add_history (line)

Append `line' to the history buffer, as if it was the last line typed.
This calls @code{add_history()} in the underlying library.
@end deffn

@geindex set_auto_history() (in module readline)
@anchor{library/readline readline set_auto_history}@anchor{ecb}
@deffn {Function} readline.set_auto_history (enabled)

Enable or disable automatic calls to @code{add_history()} when reading
input via readline.  The `enabled' argument should be a Boolean value
that when true, enables auto history, and that when false, disables
auto history.


Added in version 3.6.


`CPython implementation detail:' Auto history is enabled by default, and changes to this do not persist
across multiple sessions.
@end deffn

@node Startup hooks,Completion,History list,readline — GNU readline interface
@anchor{library/readline startup-hooks}@anchor{2864}
@subsubsection Startup hooks


@geindex set_startup_hook() (in module readline)
@anchor{library/readline readline set_startup_hook}@anchor{2865}
@deffn {Function} readline.set_startup_hook ([function])

Set or remove the function invoked by the @code{rl_startup_hook}
callback of the underlying library.  If `function' is specified, it will
be used as the new hook function; if omitted or @code{None}, any function
already installed is removed.  The hook is called with no
arguments just before readline prints the first prompt.
@end deffn

@geindex set_pre_input_hook() (in module readline)
@anchor{library/readline readline set_pre_input_hook}@anchor{2866}
@deffn {Function} readline.set_pre_input_hook ([function])

Set or remove the function invoked by the @code{rl_pre_input_hook}
callback of the underlying library.  If `function' is specified, it will
be used as the new hook function; if omitted or @code{None}, any
function already installed is removed.  The hook is called
with no arguments after the first prompt has been printed and just before
readline starts reading input characters.  This function only exists
if Python was compiled for a version of the library that supports it.
@end deffn

@node Completion,Example,Startup hooks,readline — GNU readline interface
@anchor{library/readline completion}@anchor{2867}@anchor{library/readline readline-completion}@anchor{2868}
@subsubsection Completion


The following functions relate to implementing a custom word completion
function.  This is typically operated by the Tab key, and can suggest and
automatically complete a word being typed.  By default, Readline is set up
to be used by @ref{c2,,rlcompleter} to complete Python identifiers for
the interactive interpreter.  If the @code{readline} module is to be used
with a custom completer, a different set of word delimiters should be set.

@geindex set_completer() (in module readline)
@anchor{library/readline readline set_completer}@anchor{2869}
@deffn {Function} readline.set_completer ([function])

Set or remove the completer function.  If `function' is specified, it will be
used as the new completer function; if omitted or @code{None}, any completer
function already installed is removed.  The completer function is called as
@code{function(text, state)}, for `state' in @code{0}, @code{1}, @code{2}, …, until it
returns a non-string value.  It should return the next possible completion
starting with `text'.

The installed completer function is invoked by the `entry_func' callback
passed to @code{rl_completion_matches()} in the underlying library.
The `text' string comes from the first parameter to the
@code{rl_attempted_completion_function} callback of the
underlying library.
@end deffn

@geindex get_completer() (in module readline)
@anchor{library/readline readline get_completer}@anchor{286a}
@deffn {Function} readline.get_completer ()

Get the completer function, or @code{None} if no completer function has been set.
@end deffn

@geindex get_completion_type() (in module readline)
@anchor{library/readline readline get_completion_type}@anchor{286b}
@deffn {Function} readline.get_completion_type ()

Get the type of completion being attempted.  This returns the
@code{rl_completion_type} variable in the underlying library as
an integer.
@end deffn

@geindex get_begidx() (in module readline)
@geindex get_endidx() (in module readline)
@anchor{library/readline readline get_begidx}@anchor{1ce5}
@deffn {Function} readline.get_begidx ()
@anchor{library/readline readline get_endidx}@anchor{1ce6}
@deffnx {Function} readline.get_endidx ()

Get the beginning or ending index of the completion scope.
These indexes are the `start' and `end' arguments passed to the
@code{rl_attempted_completion_function} callback of the
underlying library.  The values may be different in the same
input editing scenario based on the underlying C readline implementation.
Ex: libedit is known to behave differently than libreadline.
@end deffn

@geindex set_completer_delims() (in module readline)
@geindex get_completer_delims() (in module readline)
@anchor{library/readline readline set_completer_delims}@anchor{1a71}
@deffn {Function} readline.set_completer_delims (string)
@anchor{library/readline readline get_completer_delims}@anchor{286c}
@deffnx {Function} readline.get_completer_delims ()

Set or get the word delimiters for completion.  These determine the
start of the word to be considered for completion (the completion scope).
These functions access the @code{rl_completer_word_break_characters}
variable in the underlying library.
@end deffn

@geindex set_completion_display_matches_hook() (in module readline)
@anchor{library/readline readline set_completion_display_matches_hook}@anchor{286d}
@deffn {Function} readline.set_completion_display_matches_hook ([function])

Set or remove the completion display function.  If `function' is
specified, it will be used as the new completion display function;
if omitted or @code{None}, any completion display function already
installed is removed.  This sets or clears the
@code{rl_completion_display_matches_hook} callback in the
underlying library.  The completion display function is called as
@code{function(substitution, [matches], longest_match_length)} once
each time matches need to be displayed.
@end deffn

@node Example,,Completion,readline — GNU readline interface
@anchor{library/readline example}@anchor{286e}@anchor{library/readline readline-example}@anchor{286f}
@subsubsection Example


The following example demonstrates how to use the @code{readline} module’s
history reading and writing functions to automatically load and save a history
file named @code{.python_history} from the user’s home directory.  The code
below would normally be executed automatically during interactive sessions
from the user’s 
@geindex PYTHONSTARTUP
@geindex environment variable; PYTHONSTARTUP
@ref{1ba,,PYTHONSTARTUP} file.

@example
import atexit
import os
import readline

histfile = os.path.join(os.path.expanduser("~"), ".python_history")
try:
    readline.read_history_file(histfile)
    # default history len is -1 (infinite), which may grow unruly
    readline.set_history_length(1000)
except FileNotFoundError:
    pass

atexit.register(readline.write_history_file, histfile)
@end example

This code is actually automatically run when Python is run in
@ref{441,,interactive mode} (see @ref{11cf,,Readline configuration}).

The following example achieves the same goal but supports concurrent interactive
sessions, by only appending the new history.

@example
import atexit
import os
import readline
histfile = os.path.join(os.path.expanduser("~"), ".python_history")

try:
    readline.read_history_file(histfile)
    h_len = readline.get_current_history_length()
except FileNotFoundError:
    open(histfile, 'wb').close()
    h_len = 0

def save(prev_h_len, histfile):
    new_h_len = readline.get_current_history_length()
    readline.set_history_length(1000)
    readline.append_history_file(new_h_len - prev_h_len, histfile)
atexit.register(save, h_len, histfile)
@end example

The following example extends the @ref{2870,,code.InteractiveConsole} class to
support history save/restore.

@example
import atexit
import code
import os
import readline

class HistoryConsole(code.InteractiveConsole):
    def __init__(self, locals=None, filename="<console>",
                 histfile=os.path.expanduser("~/.console-history")):
        code.InteractiveConsole.__init__(self, locals, filename)
        self.init_history(histfile)

    def init_history(self, histfile):
        readline.parse_and_bind("tab: complete")
        if hasattr(readline, "read_history_file"):
            try:
                readline.read_history_file(histfile)
            except FileNotFoundError:
                pass
            atexit.register(self.save_history, histfile)

    def save_history(self, histfile):
        readline.set_history_length(1000)
        readline.write_history_file(histfile)
@end example

@cartouche
@quotation Note 
The new @ref{492,,REPL} introduced in version 3.13 doesn’t support readline.
However, readline can still be used by setting the 
@geindex PYTHON_BASIC_REPL
@geindex environment variable; PYTHON_BASIC_REPL
@ref{1b8,,PYTHON_BASIC_REPL}
environment variable.
@end quotation
@end cartouche

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node rlcompleter — Completion function for GNU readline,,readline — GNU readline interface,Text Processing Services
@anchor{library/rlcompleter doc}@anchor{2871}@anchor{library/rlcompleter module-rlcompleter}@anchor{c2}@anchor{library/rlcompleter rlcompleter-completion-function-for-gnu-readline}@anchor{2872}@anchor{library/rlcompleter translation-repo}@anchor{2873}
@subsection @code{rlcompleter} — Completion function for GNU readline


@geindex module; rlcompleter

`Source code:' Lib/rlcompleter.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/rlcompleter.py}


__________________________________________________________________


The @code{rlcompleter} module defines a completion function suitable to be
passed to @ref{2869,,set_completer()} in the @ref{bf,,readline} module.

When this module is imported on a Unix platform with the @ref{bf,,readline} module
available, an instance of the @ref{1d6f,,Completer} class is automatically created
and its @ref{2874,,complete()} method is set as the
@ref{2868,,readline completer}. The method provides
completion of valid Python @ref{22e4,,identifiers and keywords}.

Example:

@example
>>> import rlcompleter
>>> import readline
>>> readline.parse_and_bind("tab: complete")
>>> readline. <TAB PRESSED>
readline.__doc__          readline.get_line_buffer(  readline.read_init_file(
readline.__file__         readline.insert_text(      readline.set_completer(
readline.__name__         readline.parse_and_bind(
>>> readline.
@end example

The @code{rlcompleter} module is designed for use with Python’s
@ref{441,,interactive mode}.  Unless Python is run with the
@ref{13b4,,-S} option, the module is automatically imported and configured
(see @ref{11cf,,Readline configuration}).

On platforms without @ref{bf,,readline}, the @ref{1d6f,,Completer} class defined by
this module can still be used for custom purposes.

@geindex Completer (class in rlcompleter)
@anchor{library/rlcompleter completer-objects}@anchor{2875}@anchor{library/rlcompleter rlcompleter Completer}@anchor{1d6f}
@deffn {Class} rlcompleter.Completer

Completer objects have the following method:

@geindex complete() (rlcompleter.Completer method)
@anchor{library/rlcompleter rlcompleter Completer complete}@anchor{2874}
@deffn {Method} complete (text, state)

Return the next possible completion for `text'.

When called by the @ref{bf,,readline} module, this method is called
successively with @code{state == 0, 1, 2, ...} until the method returns
@code{None}.

If called for `text' that doesn’t include a period character (@code{'.'}), it will
complete from names currently defined in @ref{1,,__main__}, @ref{13,,builtins} and
keywords (as defined by the @ref{88,,keyword} module).

If called for a dotted name, it will try to evaluate anything without obvious
side-effects (functions will not be evaluated, but it can generate calls to
@ref{6fb,,__getattr__()}) up to the last part, and find matches for the
rest via the @ref{845,,dir()} function.  Any exception raised during the
evaluation of the expression is caught, silenced and @ref{887,,None} is
returned.
@end deffn
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Binary Data Services,Data Types,Text Processing Services,The Python Standard Library
@anchor{library/binary doc}@anchor{2876}@anchor{library/binary binary-data-services}@anchor{2877}@anchor{library/binary binaryservices}@anchor{2783}@anchor{library/binary translation-repo}@anchor{2878}
@section Binary Data Services


The modules described in this chapter provide some basic services operations
for manipulation of binary data. Other operations on binary data, specifically
in relation to file formats and network protocols, are described in the
relevant sections.

Some libraries described under @ref{2695,,Text Processing Services} also work with either
ASCII-compatible binary formats (for example, @ref{be,,re}) or all binary data
(for example, @ref{3b,,difflib}).

In addition, see the documentation for Python’s built-in binary data types in
@ref{260b,,Binary Sequence Types — bytes@comma{} bytearray@comma{} memoryview}.

@menu
* struct — Interpret bytes as packed binary data:: 
* codecs — Codec registry and base classes:: 

@end menu

@node struct — Interpret bytes as packed binary data,codecs — Codec registry and base classes,,Binary Data Services
@anchor{library/struct doc}@anchor{2879}@anchor{library/struct struct-interpret-bytes-as-packed-binary-data}@anchor{287a}
@subsection @code{struct} — Interpret bytes as packed binary data


@c from struct import *

@geindex module; struct
@anchor{library/struct module-struct}@anchor{db}
`Source code:' Lib/struct.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/struct.py}

@geindex C; structures
@geindex packing; binary; data


__________________________________________________________________


This module converts between Python values and C structs represented
as Python @ref{193,,bytes} objects.  Compact @ref{287b,,format strings}
describe the intended conversions to/from Python values.
The module’s functions and objects can be used for two largely
distinct applications, data exchange with external sources (files or
network connections), or data transfer between the Python application
and the C layer.

@cartouche
@quotation Note 
When no prefix character is given, native mode is the default. It
packs or unpacks data based on the platform and compiler on which
the Python interpreter was built.
The result of packing a given C struct includes pad bytes which
maintain proper alignment for the C types involved; similarly,
alignment is taken into account when unpacking.  In contrast, when
communicating data between external sources, the programmer is
responsible for defining byte ordering and padding between elements.
See @ref{287c,,Byte Order@comma{} Size@comma{} and Alignment} for details.
@end quotation
@end cartouche

Several @code{struct} functions (and methods of @ref{17af,,Struct}) take a `buffer'
argument.  This refers to objects that implement the @ref{262,,Buffer Protocol} and
provide either a readable or read-writable buffer.  The most common types used
for that purpose are @ref{193,,bytes} and @ref{342,,bytearray}, but many other types
that can be viewed as an array of bytes implement the buffer protocol, so that
they can be read/filled without additional copying from a @code{bytes} object.

@menu
* Functions and Exceptions:: 
* Format Strings:: 
* Applications:: 
* Classes: Classes<3>. 

@end menu

@node Functions and Exceptions,Format Strings,,struct — Interpret bytes as packed binary data
@anchor{library/struct functions-and-exceptions}@anchor{287d}
@subsubsection Functions and Exceptions


The module defines the following exception and functions:

@geindex error
@anchor{library/struct struct error}@anchor{152f}
@deffn {Exception} struct.error

Exception raised on various occasions; argument is a string describing what
is wrong.
@end deffn

@geindex pack() (in module struct)
@anchor{library/struct struct pack}@anchor{1482}
@deffn {Function} struct.pack (format, v1, v2, ...)

Return a bytes object containing the values `v1', `v2', … packed according
to the format string `format'.  The arguments must match the values required by
the format exactly.
@end deffn

@geindex pack_into() (in module struct)
@anchor{library/struct struct pack_into}@anchor{287e}
@deffn {Function} struct.pack_into (format, buffer, offset, v1, v2, ...)

Pack the values `v1', `v2', … according to the format string `format' and
write the packed bytes into the writable buffer `buffer' starting at
position `offset'.  Note that `offset' is a required argument.
@end deffn

@geindex unpack() (in module struct)
@anchor{library/struct struct unpack}@anchor{18a3}
@deffn {Function} struct.unpack (format, buffer)

Unpack from the buffer `buffer' (presumably packed by @code{pack(format, ...)})
according to the format string `format'.  The result is a tuple even if it
contains exactly one item.  The buffer’s size in bytes must match the
size required by the format, as reflected by @ref{1dec,,calcsize()}.
@end deffn

@geindex unpack_from() (in module struct)
@anchor{library/struct struct unpack_from}@anchor{287f}
@deffn {Function} struct.unpack_from (format, /, buffer, offset=0)

Unpack from `buffer' starting at position `offset', according to the format
string `format'.  The result is a tuple even if it contains exactly one
item.  The buffer’s size in bytes, starting at position `offset', must be at
least the size required by the format, as reflected by @ref{1dec,,calcsize()}.
@end deffn

@geindex iter_unpack() (in module struct)
@anchor{library/struct struct iter_unpack}@anchor{11c5}
@deffn {Function} struct.iter_unpack (format, buffer)

Iteratively unpack from the buffer `buffer' according to the format
string `format'.  This function returns an iterator which will read
equally sized chunks from the buffer until all its contents have been
consumed.  The buffer’s size in bytes must be a multiple of the size
required by the format, as reflected by @ref{1dec,,calcsize()}.

Each iteration yields a tuple as specified by the format string.


Added in version 3.4.

@end deffn

@geindex calcsize() (in module struct)
@anchor{library/struct struct calcsize}@anchor{1dec}
@deffn {Function} struct.calcsize (format)

Return the size of the struct (and hence of the bytes object produced by
@code{pack(format, ...)}) corresponding to the format string `format'.
@end deffn

@node Format Strings,Applications,Functions and Exceptions,struct — Interpret bytes as packed binary data
@anchor{library/struct format-strings}@anchor{2880}@anchor{library/struct struct-format-strings}@anchor{287b}
@subsubsection Format Strings


Format strings describe the data layout when
packing and unpacking data.  They are built up from @ref{2881,,format characters},
which specify the type of data being packed/unpacked.  In addition,
special characters control the @ref{287c,,byte order@comma{} size and alignment}.
Each format string consists of an optional prefix character which
describes the overall properties of the data and one or more format
characters which describe the actual data values and padding.

@menu
* Byte Order@comma{} Size@comma{} and Alignment: Byte Order Size and Alignment. 
* Format Characters:: 
* Examples: Examples<2>. 

@end menu

@node Byte Order Size and Alignment,Format Characters,,Format Strings
@anchor{library/struct byte-order-size-and-alignment}@anchor{2882}@anchor{library/struct struct-alignment}@anchor{287c}
@subsubsection Byte Order, Size, and Alignment


By default, C types are represented in the machine’s native format and byte
order, and properly aligned by skipping pad bytes if necessary (according to the
rules used by the C compiler).
This behavior is chosen so
that the bytes of a packed struct correspond exactly to the memory layout
of the corresponding C struct.
Whether to use native byte ordering
and padding or standard formats depends on the application.

@geindex @@ (at); in struct format strings
@geindex = (equals); in struct format strings
@geindex < (less); in struct format strings
@geindex > (greater); in struct format strings
@geindex ! (exclamation); in struct format strings

Alternatively, the first character of the format string can be used to indicate
the byte order, size and alignment of the packed data, according to the
following table:


@multitable {xxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxx} {xxxxxxxxxxxxx} 
@headitem

Character

@tab

Byte order

@tab

Size

@tab

Alignment

@item

@code{@@}

@tab

native

@tab

native

@tab

native

@item

@code{=}

@tab

native

@tab

standard

@tab

none

@item

@code{<}

@tab

little-endian

@tab

standard

@tab

none

@item

@code{>}

@tab

big-endian

@tab

standard

@tab

none

@item

@code{!}

@tab

network (= big-endian)

@tab

standard

@tab

none

@end multitable


If the first character is not one of these, @code{'@@'} is assumed.

@cartouche
@quotation Note 
The number 1023 (@code{0x3ff} in hexadecimal) has the following byte representations:


@itemize *

@item 
@code{03 ff} in big-endian (@code{>})

@item 
@code{ff 03} in little-endian (@code{<})
@end itemize

Python example:

@example
>>> import struct
>>> struct.pack('>h', 1023)
b'\x03\xff'
>>> struct.pack('<h', 1023)
b'\xff\x03'
@end example
@end quotation
@end cartouche

Native byte order is big-endian or little-endian, depending on the
host system. For example, Intel x86, AMD64 (x86-64), and Apple M1 are
little-endian; IBM z and many legacy architectures are big-endian.
Use @ref{263f,,sys.byteorder} to check the endianness of your system.

Native size and alignment are determined using the C compiler’s
@code{sizeof} expression.  This is always combined with native byte order.

Standard size depends only on the format character;  see the table in
the @ref{2881,,Format Characters} section.

Note the difference between @code{'@@'} and @code{'='}: both use native byte order, but
the size and alignment of the latter is standardized.

The form @code{'!'} represents the network byte order which is always big-endian
as defined in IETF RFC 1700@footnote{https://datatracker.ietf.org/doc/html/rfc1700}.

There is no way to indicate non-native byte order (force byte-swapping); use the
appropriate choice of @code{'<'} or @code{'>'}.

Notes:


@enumerate 

@item 
Padding is only automatically added between successive structure members.
No padding is added at the beginning or the end of the encoded struct.

@item 
No padding is added when using non-native size and alignment, e.g.
with ‘<’, ‘>’, ‘=’, and ‘!’.

@item 
To align the end of a structure to the alignment requirement of a
particular type, end the format with the code for that type with a repeat
count of zero.  See @ref{2883,,Examples}.
@end enumerate

@node Format Characters,Examples<2>,Byte Order Size and Alignment,Format Strings
@anchor{library/struct format-characters}@anchor{2881}@anchor{library/struct id1}@anchor{2884}
@subsubsection Format Characters


Format characters have the following meaning; the conversion between C and
Python values should be obvious given their types.  The ‘Standard size’ column
refers to the size of the packed value in bytes when using standard size; that
is, when the format string starts with one of @code{'<'}, @code{'>'}, @code{'!'} or
@code{'='}.  When using native size, the size of the packed value is
platform-dependent.


@multitable {xxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxx} 
@headitem

Format

@tab

C Type

@tab

Python type

@tab

Standard size

@tab

Notes

@item

@code{x}

@tab

pad byte

@tab

no value

@tab

@tab

(7)

@item

@code{c}

@tab

char

@tab

bytes of length 1

@tab

1

@tab

@item

@code{b}

@tab

signed char

@tab

int

@tab

1

@tab

(2)

@item

@code{B}

@tab

unsigned char

@tab

int

@tab

1

@tab

(2)

@item

@code{?}

@tab

_Bool

@tab

bool

@tab

1

@tab

(1)

@item

@code{h}

@tab

short

@tab

int

@tab

2

@tab

(2)

@item

@code{H}

@tab

unsigned short

@tab

int

@tab

2

@tab

(2)

@item

@code{i}

@tab

int

@tab

int

@tab

4

@tab

(2)

@item

@code{I}

@tab

unsigned int

@tab

int

@tab

4

@tab

(2)

@item

@code{l}

@tab

long

@tab

int

@tab

4

@tab

(2)

@item

@code{L}

@tab

unsigned long

@tab

int

@tab

4

@tab

(2)

@item

@code{q}

@tab

long long

@tab

int

@tab

8

@tab

(2)

@item

@code{Q}

@tab

unsigned long long

@tab

int

@tab

8

@tab

(2)

@item

@code{n}

@tab

@code{ssize_t}

@tab

int

@tab

@tab

(2), (3)

@item

@code{N}

@tab

@code{size_t}

@tab

int

@tab

@tab

(2), (3)

@item

@code{e}

@tab

_Float16

@tab

float

@tab

2

@tab

(4), (6)

@item

@code{f}

@tab

float

@tab

float

@tab

4

@tab

(4)

@item

@code{d}

@tab

double

@tab

float

@tab

8

@tab

(4)

@item

@code{F}

@tab

float complex

@tab

complex

@tab

8

@tab

(10)

@item

@code{D}

@tab

double complex

@tab

complex

@tab

16

@tab

(10)

@item

@code{s}

@tab

char[]

@tab

bytes

@tab

@tab

(9)

@item

@code{p}

@tab

char[]

@tab

bytes

@tab

@tab

(8)

@item

@code{P}

@tab

void*

@tab

int

@tab

@tab

(2), (5)

@end multitable



Changed in version 3.3: Added support for the @code{'n'} and @code{'N'} formats.



Changed in version 3.6: Added support for the @code{'e'} format.



Changed in version 3.14: Added support for the @code{'F'} and @code{'D'} formats.



@subsubheading See also


The @ref{8,,array} and @ref{2885,,ctypes} modules,
as well as third-party modules like numpy@footnote{https://numpy.org/doc/stable/reference/arrays.interface.html#object.__array_interface__},
use similar – but slightly different – type codes.


Notes:


@enumerate 

@item 
@geindex ? (question mark); in struct format strings

The @code{'?'} conversion code corresponds to the _Bool type
defined by C standards since C99.  In standard mode, it is
represented by one byte.

@item 
When attempting to pack a non-integer using any of the integer conversion
codes, if the non-integer has a @ref{19f,,__index__()} method then that method is
called to convert the argument to an integer before packing.


Changed in version 3.2: Added use of the @ref{19f,,__index__()} method for non-integers.


@item 
The @code{'n'} and @code{'N'} conversion codes are only available for the native
size (selected as the default or with the @code{'@@'} byte order character).
For the standard size, you can use whichever of the other integer formats
fits your application.

@item 
For the @code{'f'}, @code{'d'} and @code{'e'} conversion codes, the packed
representation uses the IEEE 754 binary32, binary64 or binary16 format (for
@code{'f'}, @code{'d'} or @code{'e'} respectively), regardless of the floating-point
format used by the platform.

@item 
The @code{'P'} format character is only available for the native byte ordering
(selected as the default or with the @code{'@@'} byte order character). The byte
order character @code{'='} chooses to use little- or big-endian ordering based
on the host system. The struct module does not interpret this as native
ordering, so the @code{'P'} format is not available.

@item 
The IEEE 754 binary16 “half precision” type was introduced in the 2008
revision of the IEEE 754 standard@footnote{https://en.wikipedia.org/wiki/IEEE_754-2008_revision}. It has a sign
bit, a 5-bit exponent and 11-bit precision (with 10 bits explicitly stored),
and can represent numbers between approximately @code{6.1e-05} and @code{6.5e+04}
at full precision. This type is not widely supported by C compilers:
it’s available as _Float16 type, if the compiler supports the Annex H
of the C23 standard.  On a
typical machine, an unsigned short can be used for storage, but not for math
operations. See the Wikipedia page on the half-precision floating-point format@footnote{https://en.wikipedia.org/wiki/Half-precision_floating-point_format} for more information.

@item 
When packing, @code{'x'} inserts one NUL byte.

@item 
The @code{'p'} format character encodes a “Pascal string”, meaning a short
variable-length string stored in a `fixed number of bytes', given by the count.
The first byte stored is the length of the string, or 255, whichever is
smaller.  The bytes of the string follow.  If the byte string passed in to
@ref{1482,,pack()} is too long (longer than the count minus 1), only the leading
@code{count-1} bytes of the string are stored.  If the byte string is shorter than
@code{count-1}, it is padded with null bytes so that exactly count bytes in all
are used.  Note that for @ref{18a3,,unpack()}, the @code{'p'} format character consumes
@code{count} bytes, but that the @code{bytes} object returned can never contain more than 255
bytes.
When packing, arguments of types @ref{193,,bytes} and @ref{342,,bytearray}
are accepted.

@item 
For the @code{'s'} format character, the count is interpreted as the length of the
byte string, not a repeat count like for the other format characters; for example,
@code{'10s'} means a single 10-byte string mapping to or from a single
Python byte string, while @code{'10c'} means 10
separate one byte character elements (e.g., @code{cccccccccc}) mapping
to or from ten different Python byte objects. (See @ref{2883,,Examples}
for a concrete demonstration of the difference.)
If a count is not given, it defaults to 1.  For packing, the byte string is
truncated or padded with null bytes as appropriate to make it fit. For
unpacking, the resulting @code{bytes} object always has exactly the specified number
of bytes.  As a special case, @code{'0s'} means a single, empty byte string (while
@code{'0c'} means 0 characters).
When packing, arguments of types @ref{193,,bytes} and @ref{342,,bytearray}
are accepted.

@item 
For the @code{'F'} and @code{'D'} format characters, the packed representation uses
the IEEE 754 binary32 and binary64 format for components of the complex
number, regardless of the floating-point format used by the platform.
Note that complex types (@code{F} and @code{D}) are available unconditionally,
despite complex types being an optional feature in C.
As specified in the C11 standard, each complex type is represented by a
two-element C array containing, respectively, the real and imaginary parts.
@end enumerate

A format character may be preceded by an integral repeat count.  For example,
the format string @code{'4h'} means exactly the same as @code{'hhhh'}.

Whitespace characters between formats are ignored; a count and its format must
not contain whitespace though.

When packing a value @code{x} using one of the integer formats (@code{'b'},
@code{'B'}, @code{'h'}, @code{'H'}, @code{'i'}, @code{'I'}, @code{'l'}, @code{'L'},
@code{'q'}, @code{'Q'}), if @code{x} is outside the valid range for that format
then @ref{152f,,struct.error} is raised.


Changed in version 3.1: Previously, some of the integer formats wrapped out-of-range values and
raised @ref{1a4,,DeprecationWarning} instead of @ref{152f,,struct.error}.


@geindex ? (question mark); in struct format strings

For the @code{'?'} format character, the return value is either @ref{e0d,,True} or
@ref{d31,,False}. When packing, the truth value of the argument object is used.
Either 0 or 1 in the native or standard bool representation will be packed, and
any non-zero value will be @code{True} when unpacking.

@node Examples<2>,,Format Characters,Format Strings
@anchor{library/struct examples}@anchor{2886}@anchor{library/struct struct-examples}@anchor{2883}
@subsubsection Examples


@cartouche
@quotation Note 
Native byte order examples (designated by the @code{'@@'} format prefix or
lack of any prefix character) may not match what the reader’s
machine produces as
that depends on the platform and compiler.
@end quotation
@end cartouche

Pack and unpack integers of three different sizes, using big endian
ordering:

@example
>>> from struct import *
>>> pack(">bhl", 1, 2, 3)
b'\x01\x00\x02\x00\x00\x00\x03'
>>> unpack('>bhl', b'\x01\x00\x02\x00\x00\x00\x03')
(1, 2, 3)
>>> calcsize('>bhl')
7
@end example

Attempt to pack an integer which is too large for the defined field:

@example
>>> pack(">h", 99999)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
struct.error: 'h' format requires -32768 <= number <= 32767
@end example

Demonstrate the difference between @code{'s'} and @code{'c'} format
characters:

@example
>>> pack("@@ccc", b'1', b'2', b'3')
b'123'
>>> pack("@@3s", b'123')
b'123'
@end example

Unpacked fields can be named by assigning them to variables or by wrapping
the result in a named tuple:

@example
>>> record = b'raymond   \x32\x12\x08\x01\x08'
>>> name, serialnum, school, gradelevel = unpack('<10sHHb', record)

>>> from collections import namedtuple
>>> Student = namedtuple('Student', 'name serialnum school gradelevel')
>>> Student._make(unpack('<10sHHb', record))
Student(name=b'raymond   ', serialnum=4658, school=264, gradelevel=8)
@end example

The ordering of format characters may have an impact on size in native
mode since padding is implicit. In standard mode, the user is
responsible for inserting any desired padding.
Note in
the first @code{pack} call below that three NUL bytes were added after the
packed @code{'#'} to align the following integer on a four-byte boundary.
In this example, the output was produced on a little endian machine:

@example
>>> pack('@@ci', b'#', 0x12131415)
b'#\x00\x00\x00\x15\x14\x13\x12'
>>> pack('@@ic', 0x12131415, b'#')
b'\x15\x14\x13\x12#'
>>> calcsize('@@ci')
8
>>> calcsize('@@ic')
5
@end example

The following format @code{'llh0l'} results in two pad bytes being added
at the end, assuming the platform’s longs are aligned on 4-byte boundaries:

@example
>>> pack('@@llh0l', 1, 2, 3)
b'\x00\x00\x00\x01\x00\x00\x00\x02\x00\x03\x00\x00'
@end example


@subsubheading See also



@table @asis

@item Module @ref{8,,array}

Packed binary storage of homogeneous data.

@item Module @ref{86,,json}

JSON encoder and decoder.

@item Module @ref{ab,,pickle}

Python object serialization.
@end table


@node Applications,Classes<3>,Format Strings,struct — Interpret bytes as packed binary data
@anchor{library/struct applications}@anchor{2887}@anchor{library/struct id2}@anchor{2888}
@subsubsection Applications


Two main applications for the @code{struct} module exist, data
interchange between Python and C code within an application or another
application compiled using the same compiler (@ref{2889,,native formats}), and
data interchange between applications using agreed upon data layout
(@ref{288a,,standard formats}).  Generally speaking, the format strings
constructed for these two domains are distinct.

@menu
* Native Formats:: 
* Standard Formats:: 

@end menu

@node Native Formats,Standard Formats,,Applications
@anchor{library/struct native-formats}@anchor{288b}@anchor{library/struct struct-native-formats}@anchor{2889}
@subsubsection Native Formats


When constructing format strings which mimic native layouts, the
compiler and machine architecture determine byte ordering and padding.
In such cases, the @code{@@} format character should be used to specify
native byte ordering and data sizes.  Internal pad bytes are normally inserted
automatically.  It is possible that a zero-repeat format code will be
needed at the end of a format string to round up to the correct
byte boundary for proper alignment of consecutive chunks of data.

Consider these two simple examples (on a 64-bit, little-endian
machine):

@example
>>> calcsize('@@lhl')
24
>>> calcsize('@@llh')
18
@end example

Data is not padded to an 8-byte boundary at the end of the second
format string without the use of extra padding.  A zero-repeat format
code solves that problem:

@example
>>> calcsize('@@llh0l')
24
@end example

The @code{'x'} format code can be used to specify the repeat, but for
native formats it is better to use a zero-repeat format like @code{'0l'}.

By default, native byte ordering and alignment is used, but it is
better to be explicit and use the @code{'@@'} prefix character.

@node Standard Formats,,Native Formats,Applications
@anchor{library/struct standard-formats}@anchor{288c}@anchor{library/struct struct-standard-formats}@anchor{288a}
@subsubsection Standard Formats


When exchanging data beyond your process such as networking or storage,
be precise.  Specify the exact byte order, size, and alignment.  Do
not assume they match the native order of a particular machine.
For example, network byte order is big-endian, while many popular CPUs
are little-endian.  By defining this explicitly, the user need not
care about the specifics of the platform their code is running on.
The first character should typically be @code{<} or @code{>}
(or @code{!}).  Padding is the responsibility of the programmer.  The
zero-repeat format character won’t work.  Instead, the user must
explicitly add @code{'x'} pad bytes where needed.  Revisiting the
examples from the previous section, we have:

@example
>>> calcsize('<qh6xq')
24
>>> pack('<qh6xq', 1, 2, 3) == pack('@@lhl', 1, 2, 3)
True
>>> calcsize('@@llh')
18
>>> pack('@@llh', 1, 2, 3) == pack('<qqh', 1, 2, 3)
True
>>> calcsize('<qqh6x')
24
>>> calcsize('@@llh0l')
24
>>> pack('@@llh0l', 1, 2, 3) == pack('<qqh6x', 1, 2, 3)
True
@end example

The above results (executed on a 64-bit machine) aren’t guaranteed to
match when executed on different machines.  For example, the examples
below were executed on a 32-bit machine:

@example
>>> calcsize('<qqh6x')
24
>>> calcsize('@@llh0l')
12
>>> pack('@@llh0l', 1, 2, 3) == pack('<qqh6x', 1, 2, 3)
False
@end example

@node Classes<3>,,Applications,struct — Interpret bytes as packed binary data
@anchor{library/struct classes}@anchor{288d}@anchor{library/struct struct-objects}@anchor{288e}
@subsubsection Classes


The @code{struct} module also defines the following type:

@geindex Struct (class in struct)
@anchor{library/struct struct Struct}@anchor{17af}
@deffn {Class} struct.Struct (format)

Return a new Struct object which writes and reads binary data according to
the format string `format'.  Creating a @code{Struct} object once and calling its
methods is more efficient than calling module-level functions with the
same format since the format string is only compiled once.

@cartouche
@quotation Note 
The compiled versions of the most recent format strings passed to
the module-level functions are cached, so programs that use only a few
format strings needn’t worry about reusing a single @code{Struct}
instance.
@end quotation
@end cartouche

Compiled Struct objects support the following methods and attributes:

@geindex pack() (struct.Struct method)
@anchor{library/struct struct Struct pack}@anchor{288f}
@deffn {Method} pack (v1, v2, ...)

Identical to the @ref{1482,,pack()} function, using the compiled format.
(@code{len(result)} will equal @ref{2890,,size}.)
@end deffn

@geindex pack_into() (struct.Struct method)
@anchor{library/struct struct Struct pack_into}@anchor{2891}
@deffn {Method} pack_into (buffer, offset, v1, v2, ...)

Identical to the @ref{287e,,pack_into()} function, using the compiled format.
@end deffn

@geindex unpack() (struct.Struct method)
@anchor{library/struct struct Struct unpack}@anchor{2892}
@deffn {Method} unpack (buffer)

Identical to the @ref{18a3,,unpack()} function, using the compiled format.
The buffer’s size in bytes must equal @ref{2890,,size}.
@end deffn

@geindex unpack_from() (struct.Struct method)
@anchor{library/struct struct Struct unpack_from}@anchor{2893}
@deffn {Method} unpack_from (buffer, offset=0)

Identical to the @ref{287f,,unpack_from()} function, using the compiled format.
The buffer’s size in bytes, starting at position `offset', must be at least
@ref{2890,,size}.
@end deffn

@geindex iter_unpack() (struct.Struct method)
@anchor{library/struct struct Struct iter_unpack}@anchor{11c6}
@deffn {Method} iter_unpack (buffer)

Identical to the @ref{11c5,,iter_unpack()} function, using the compiled format.
The buffer’s size in bytes must be a multiple of @ref{2890,,size}.


Added in version 3.4.

@end deffn

@geindex format (struct.Struct attribute)
@anchor{library/struct struct Struct format}@anchor{e06}
@deffn {Attribute} format

The format string used to construct this Struct object.


Changed in version 3.7: The format string type is now @ref{16a,,str} instead of @ref{193,,bytes}.

@end deffn

@geindex size (struct.Struct attribute)
@anchor{library/struct struct Struct size}@anchor{2890}
@deffn {Attribute} size

The calculated size of the struct (and hence of the bytes object produced
by the @ref{1482,,pack()} method) corresponding to @ref{19a,,format}.
@end deffn


Changed in version 3.13: The `repr()' of structs has changed.  It
is now:

@example
>>> Struct('i')
Struct('i')
@end example

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node codecs — Codec registry and base classes,,struct — Interpret bytes as packed binary data,Binary Data Services
@anchor{library/codecs doc}@anchor{2894}@anchor{library/codecs codecs-codec-registry-and-base-classes}@anchor{2895}@anchor{library/codecs module-codecs}@anchor{1c}@anchor{library/codecs translation-repo}@anchor{2896}
@subsection @code{codecs} — Codec registry and base classes


@geindex module; codecs

`Source code:' Lib/codecs.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/codecs.py}

@geindex Unicode
@geindex Codecs
@geindex Codecs; encode
@geindex Codecs; decode
@geindex streams
@geindex stackable; streams


__________________________________________________________________


This module defines base classes for standard Python codecs (encoders and
decoders) and provides access to the internal Python codec registry, which
manages the codec and error handling lookup process. Most standard codecs
are @ref{2622,,text encodings}, which encode text to bytes (and
decode bytes to text), but there are also codecs provided that encode text to
text, and bytes to bytes. Custom codecs may encode and decode between arbitrary
types, but some module features are restricted to be used specifically with
text encodings or with codecs that encode to
@ref{193,,bytes}.

The module defines the following functions for encoding and decoding with
any codec:

@geindex encode() (in module codecs)
@anchor{library/codecs codecs encode}@anchor{110a}
@deffn {Function} codecs.encode (obj, encoding='utf-8', errors='strict')

Encodes `obj' using the codec registered for `encoding'.

`Errors' may be given to set the desired error handling scheme. The
default error handler is @code{'strict'} meaning that encoding errors raise
@ref{2ee,,ValueError} (or a more codec specific subclass, such as
@ref{889,,UnicodeEncodeError}). Refer to @ref{2897,,Codec Base Classes} for more
information on codec error handling.
@end deffn

@geindex decode() (in module codecs)
@anchor{library/codecs codecs decode}@anchor{110b}
@deffn {Function} codecs.decode (obj, encoding='utf-8', errors='strict')

Decodes `obj' using the codec registered for `encoding'.

`Errors' may be given to set the desired error handling scheme. The
default error handler is @code{'strict'} meaning that decoding errors raise
@ref{2ee,,ValueError} (or a more codec specific subclass, such as
@ref{c0e,,UnicodeDecodeError}). Refer to @ref{2897,,Codec Base Classes} for more
information on codec error handling.
@end deffn

@geindex charmap_build() (in module codecs)
@anchor{library/codecs codecs charmap_build}@anchor{2898}
@deffn {Function} codecs.charmap_build (string)

Return a mapping suitable for encoding with a custom single-byte encoding.
Given a @ref{16a,,str} `string' of up to 256 characters representing a
decoding table, returns either a compact internal mapping object
@code{EncodingMap} or a @ref{184,,dictionary} mapping character ordinals
to byte values. Raises a @ref{199,,TypeError} on invalid input.
@end deffn

The full details for each codec can also be looked up directly:

@geindex lookup() (in module codecs)
@anchor{library/codecs codecs lookup}@anchor{b62}
@deffn {Function} codecs.lookup (encoding, /)

Looks up the codec info in the Python codec registry and returns a
@ref{1ab2,,CodecInfo} object as defined below.

Encodings are first looked up in the registry’s cache. If not found, the list of
registered search functions is scanned. If no @ref{1ab2,,CodecInfo} object is
found, a @ref{242c,,LookupError} is raised. Otherwise, the @code{CodecInfo} object
is stored in the cache and returned to the caller.
@end deffn

@geindex CodecInfo (class in codecs)
@anchor{library/codecs codecs CodecInfo}@anchor{1ab2}
@deffn {Class} codecs.CodecInfo (encode, decode, streamreader=None, streamwriter=None, incrementalencoder=None, incrementaldecoder=None, name=None)

Codec details when looking up the codec registry. The constructor
arguments are stored in attributes of the same name:

@geindex name (codecs.CodecInfo attribute)
@anchor{library/codecs codecs CodecInfo name}@anchor{2899}
@deffn {Attribute} name

The name of the encoding.
@end deffn

@geindex encode (codecs.CodecInfo attribute)
@geindex decode (codecs.CodecInfo attribute)
@anchor{library/codecs codecs CodecInfo encode}@anchor{289a}
@deffn {Attribute} encode
@anchor{library/codecs codecs CodecInfo decode}@anchor{289b}
@deffnx {Attribute} decode

The stateless encoding and decoding functions. These must be
functions or methods which have the same interface as
the @ref{289c,,encode()} and @ref{289d,,decode()} methods of Codec
instances (see @ref{289e,,Codec Interface}).
The functions or methods are expected to work in a stateless mode.
@end deffn

@geindex incrementalencoder (codecs.CodecInfo attribute)
@geindex incrementaldecoder (codecs.CodecInfo attribute)
@anchor{library/codecs codecs CodecInfo incrementalencoder}@anchor{289f}
@deffn {Attribute} incrementalencoder
@anchor{library/codecs codecs CodecInfo incrementaldecoder}@anchor{28a0}
@deffnx {Attribute} incrementaldecoder

Incremental encoder and decoder classes or factory functions.
These have to provide the interface defined by the base classes
@ref{28a1,,IncrementalEncoder} and @ref{28a2,,IncrementalDecoder},
respectively. Incremental codecs can maintain state.
@end deffn

@geindex streamwriter (codecs.CodecInfo attribute)
@geindex streamreader (codecs.CodecInfo attribute)
@anchor{library/codecs codecs CodecInfo streamwriter}@anchor{28a3}
@deffn {Attribute} streamwriter
@anchor{library/codecs codecs CodecInfo streamreader}@anchor{28a4}
@deffnx {Attribute} streamreader

Stream writer and reader classes or factory functions. These have to
provide the interface defined by the base classes
@ref{28a5,,StreamWriter} and @ref{28a6,,StreamReader}, respectively.
Stream codecs can maintain state.
@end deffn
@end deffn

To simplify access to the various codec components, the module provides
these additional functions which use @ref{b62,,lookup()} for the codec lookup:

@geindex getencoder() (in module codecs)
@anchor{library/codecs codecs getencoder}@anchor{28a7}
@deffn {Function} codecs.getencoder (encoding)

Look up the codec for the given encoding and return its encoder function.

Raises a @ref{242c,,LookupError} in case the encoding cannot be found.
@end deffn

@geindex getdecoder() (in module codecs)
@anchor{library/codecs codecs getdecoder}@anchor{28a8}
@deffn {Function} codecs.getdecoder (encoding)

Look up the codec for the given encoding and return its decoder function.

Raises a @ref{242c,,LookupError} in case the encoding cannot be found.
@end deffn

@geindex getincrementalencoder() (in module codecs)
@anchor{library/codecs codecs getincrementalencoder}@anchor{28a9}
@deffn {Function} codecs.getincrementalencoder (encoding)

Look up the codec for the given encoding and return its incremental encoder
class or factory function.

Raises a @ref{242c,,LookupError} in case the encoding cannot be found or the codec
doesn’t support an incremental encoder.
@end deffn

@geindex getincrementaldecoder() (in module codecs)
@anchor{library/codecs codecs getincrementaldecoder}@anchor{28aa}
@deffn {Function} codecs.getincrementaldecoder (encoding)

Look up the codec for the given encoding and return its incremental decoder
class or factory function.

Raises a @ref{242c,,LookupError} in case the encoding cannot be found or the codec
doesn’t support an incremental decoder.
@end deffn

@geindex getreader() (in module codecs)
@anchor{library/codecs codecs getreader}@anchor{28ab}
@deffn {Function} codecs.getreader (encoding)

Look up the codec for the given encoding and return its @ref{28a6,,StreamReader}
class or factory function.

Raises a @ref{242c,,LookupError} in case the encoding cannot be found.
@end deffn

@geindex getwriter() (in module codecs)
@anchor{library/codecs codecs getwriter}@anchor{28ac}
@deffn {Function} codecs.getwriter (encoding)

Look up the codec for the given encoding and return its @ref{28a5,,StreamWriter}
class or factory function.

Raises a @ref{242c,,LookupError} in case the encoding cannot be found.
@end deffn

Custom codecs are made available by registering a suitable codec search
function:

@geindex register() (in module codecs)
@anchor{library/codecs codecs register}@anchor{28ad}
@deffn {Function} codecs.register (search_function, /)

Register a codec search function. Search functions are expected to take one
argument, being the encoding name in all lower case letters with hyphens
and spaces converted to underscores, and return a @ref{1ab2,,CodecInfo} object.
In case a search function cannot find a given encoding, it should return
@code{None}.


Changed in version 3.9: Hyphens and spaces are converted to underscore.

@end deffn

@geindex unregister() (in module codecs)
@anchor{library/codecs codecs unregister}@anchor{9ef}
@deffn {Function} codecs.unregister (search_function, /)

Unregister a codec search function and clear the registry’s cache.
If the search function is not registered, do nothing.


Added in version 3.10.

@end deffn

While the builtin @ref{318,,open()} and the associated @ref{83,,io} module are the
recommended approach for working with encoded text files, this module
provides additional utility functions and classes that allow the use of a
wider range of codecs when working with binary files:

@geindex open() (in module codecs)
@anchor{library/codecs codecs open}@anchor{317}
@deffn {Function} codecs.open (filename, mode='r', encoding=None, errors='strict', buffering=-1)

Open an encoded file using the given `mode' and return an instance of
@ref{28ae,,StreamReaderWriter}, providing transparent encoding/decoding.
The default file mode is @code{'r'}, meaning to open the file in read mode.

@cartouche
@quotation Note 
If `encoding' is not @code{None}, then the
underlying encoded files are always opened in binary mode.
No automatic conversion of @code{'\n'} is done on reading and writing.
The `mode' argument may be any binary mode acceptable to the built-in
@code{open()} function; the @code{'b'} is automatically added.
@end quotation
@end cartouche

`encoding' specifies the encoding which is to be used for the file.
Any encoding that encodes to and decodes from bytes is allowed, and
the data types supported by the file methods depend on the codec used.

`errors' may be given to define the error handling. It defaults to @code{'strict'}
which causes a @ref{2ee,,ValueError} to be raised in case an encoding error occurs.

`buffering' has the same meaning as for the built-in @code{open()} function.
It defaults to -1 which means that the default buffer size will be used.


Changed in version 3.11: The @code{'U'} mode has been removed.



Deprecated since version 3.14: @code{codecs.open()} has been superseded by @code{open()}.

@end deffn

@geindex EncodedFile() (in module codecs)
@anchor{library/codecs codecs EncodedFile}@anchor{28af}
@deffn {Function} codecs.EncodedFile (file, data_encoding, file_encoding=None, errors='strict')

Return a @ref{1e16,,StreamRecoder} instance, a wrapped version of `file'
which provides transparent transcoding. The original file is closed
when the wrapped version is closed.

Data written to the wrapped file is decoded according to the given
`data_encoding' and then written to the original file as bytes using
`file_encoding'. Bytes read from the original file are decoded
according to `file_encoding', and the result is encoded
using `data_encoding'.

If `file_encoding' is not given, it defaults to `data_encoding'.

`errors' may be given to define the error handling. It defaults to
@code{'strict'}, which causes @ref{2ee,,ValueError} to be raised in case an encoding
error occurs.
@end deffn

@geindex iterencode() (in module codecs)
@anchor{library/codecs codecs iterencode}@anchor{28b0}
@deffn {Function} codecs.iterencode (iterator, encoding, errors='strict', **kwargs)

Uses an incremental encoder to iteratively encode the input provided by
`iterator'. `iterator' must yield @ref{16a,,str} objects.
This function is a @ref{1267,,generator}. The `errors' argument (as well as any
other keyword argument) is passed through to the incremental encoder.

This function requires that the codec accept text @ref{16a,,str} objects
to encode. Therefore it does not support bytes-to-bytes encoders such as
@code{base64_codec}.
@end deffn

@geindex iterdecode() (in module codecs)
@anchor{library/codecs codecs iterdecode}@anchor{28b1}
@deffn {Function} codecs.iterdecode (iterator, encoding, errors='strict', **kwargs)

Uses an incremental decoder to iteratively decode the input provided by
`iterator'. `iterator' must yield @ref{193,,bytes} objects.
This function is a @ref{1267,,generator}. The `errors' argument (as well as any
other keyword argument) is passed through to the incremental decoder.

This function requires that the codec accept @ref{193,,bytes} objects
to decode. Therefore it does not support text-to-text encoders such as
@code{rot_13}, although @code{rot_13} may be used equivalently with
@ref{28b0,,iterencode()}.
@end deffn

@geindex readbuffer_encode() (in module codecs)
@anchor{library/codecs codecs readbuffer_encode}@anchor{28b2}
@deffn {Function} codecs.readbuffer_encode (buffer, errors=None, /)

Return a @ref{614,,tuple} containing the raw bytes of `buffer', a
@ref{262,,buffer-compatible object} or @ref{16a,,str}
(encoded to UTF-8 before processing), and their length in bytes.

The `errors' argument is ignored.

@example
>>> codecs.readbuffer_encode(b"Zito")
(b'Zito', 4)
@end example
@end deffn

The module also provides the following constants which are useful for reading
and writing to platform dependent files:

@geindex BOM (in module codecs)
@geindex BOM_BE (in module codecs)
@geindex BOM_LE (in module codecs)
@geindex BOM_UTF8 (in module codecs)
@geindex BOM_UTF16 (in module codecs)
@geindex BOM_UTF16_BE (in module codecs)
@geindex BOM_UTF16_LE (in module codecs)
@geindex BOM_UTF32 (in module codecs)
@geindex BOM_UTF32_BE (in module codecs)
@geindex BOM_UTF32_LE (in module codecs)
@anchor{library/codecs codecs BOM}@anchor{28b3}
@deffn {Data} codecs.BOM
@anchor{library/codecs codecs BOM_BE}@anchor{28b4}
@deffnx {Data} codecs.BOM_BE
@anchor{library/codecs codecs BOM_LE}@anchor{28b5}
@deffnx {Data} codecs.BOM_LE
@anchor{library/codecs codecs BOM_UTF8}@anchor{28b6}
@deffnx {Data} codecs.BOM_UTF8
@anchor{library/codecs codecs BOM_UTF16}@anchor{28b7}
@deffnx {Data} codecs.BOM_UTF16
@anchor{library/codecs codecs BOM_UTF16_BE}@anchor{28b8}
@deffnx {Data} codecs.BOM_UTF16_BE
@anchor{library/codecs codecs BOM_UTF16_LE}@anchor{28b9}
@deffnx {Data} codecs.BOM_UTF16_LE
@anchor{library/codecs codecs BOM_UTF32}@anchor{28ba}
@deffnx {Data} codecs.BOM_UTF32
@anchor{library/codecs codecs BOM_UTF32_BE}@anchor{28bb}
@deffnx {Data} codecs.BOM_UTF32_BE
@anchor{library/codecs codecs BOM_UTF32_LE}@anchor{28bc}
@deffnx {Data} codecs.BOM_UTF32_LE

These constants define various byte sequences,
being Unicode byte order marks (BOMs) for several encodings. They are
used in UTF-16 and UTF-32 data streams to indicate the byte order used,
and in UTF-8 as a Unicode signature. @ref{28b7,,BOM_UTF16} is either
@ref{28b8,,BOM_UTF16_BE} or @ref{28b9,,BOM_UTF16_LE} depending on the platform’s
native byte order, @ref{28b3,,BOM} is an alias for @code{BOM_UTF16},
@ref{28b5,,BOM_LE} for @code{BOM_UTF16_LE} and @ref{28b4,,BOM_BE} for
@code{BOM_UTF16_BE}. The others represent the BOM in UTF-8 and UTF-32
encodings.
@end deffn

@menu
* Codec Base Classes:: 
* Encodings and Unicode:: 
* Standard Encodings:: 
* Python Specific Encodings:: 
* encodings — Encodings package:: 
* encodings.idna — Internationalized Domain Names in Applications: encodings idna — Internationalized Domain Names in Applications. 
* encodings.mbcs — Windows ANSI codepage: encodings mbcs — Windows ANSI codepage. 
* encodings.utf_8_sig — UTF-8 codec with BOM signature: encodings utf_8_sig — UTF-8 codec with BOM signature. 

@end menu

@node Codec Base Classes,Encodings and Unicode,,codecs — Codec registry and base classes
@anchor{library/codecs codec-base-classes}@anchor{2897}@anchor{library/codecs id1}@anchor{28bd}
@subsubsection Codec Base Classes


The @code{codecs} module defines a set of base classes which define the
interfaces for working with codec objects, and can also be used as the basis
for custom codec implementations.

Each codec has to define four interfaces to make it usable as codec in Python:
stateless encoder, stateless decoder, stream reader and stream writer. The
stream reader and writers typically reuse the stateless encoder/decoder to
implement the file protocols. Codec authors also need to define how the
codec will handle encoding and decoding errors.
@anchor{library/codecs surrogateescape}@anchor{28be}
@menu
* Error Handlers:: 
* Stateless Encoding and Decoding:: 
* Incremental Encoding and Decoding:: 
* Stream Encoding and Decoding:: 

@end menu

@node Error Handlers,Stateless Encoding and Decoding,,Codec Base Classes
@anchor{library/codecs error-handlers}@anchor{1bb3}@anchor{library/codecs id2}@anchor{28bf}
@subsubsection Error Handlers


To simplify and standardize error handling, codecs may implement different
error handling schemes by accepting the `errors' string argument:

@example
>>> 'German ß, ♬'.encode(encoding='ascii', errors='backslashreplace')
b'German \\xdf, \\u266c'
>>> 'German ß, ♬'.encode(encoding='ascii', errors='xmlcharrefreplace')
b'German &#223;, &#9836;'
@end example

@geindex strict; error handler's name
@geindex ignore; error handler's name
@geindex replace; error handler's name
@geindex backslashreplace; error handler's name
@geindex surrogateescape; error handler's name
@geindex ? (question mark); replacement character
@geindex \ (backslash); escape sequence
@geindex \x; escape sequence
@geindex \u; escape sequence
@geindex \U; escape sequence

The following error handlers can be used with all Python
@ref{fbe,,Standard Encodings} codecs:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Value

@tab

Meaning

@item

@code{'strict'}

@tab

Raise @ref{460,,UnicodeError} (or a subclass),
this is the default. Implemented in
@ref{28c0,,strict_errors()}.

@item

@code{'ignore'}

@tab

Ignore the malformed data and continue without
further notice. Implemented in
@ref{28c1,,ignore_errors()}.

@item

@code{'replace'}

@tab

Replace with a replacement marker. On
encoding, use @code{?} (ASCII character). On
decoding, use @code{�} (U+FFFD, the official
REPLACEMENT CHARACTER). Implemented in
@ref{1908,,replace_errors()}.

@item

@code{'backslashreplace'}

@tab

Replace with backslashed escape sequences.
On encoding, use hexadecimal form of Unicode
code point with formats @code{\x@var{hh}}
@code{\u@var{xxxx}} @code{\U@var{xxxxxxxx}}.
On decoding, use hexadecimal form of byte
value with format @code{\x@var{hh}}.
Implemented in
@ref{1909,,backslashreplace_errors()}.

@item

@code{'surrogateescape'}

@tab

On decoding, replace byte with individual
surrogate code ranging from @code{U+DC80} to
@code{U+DCFF}. This code will then be turned
back into the same byte when the
@code{'surrogateescape'} error handler is used
when encoding the data. (See 
@geindex Python Enhancement Proposals; PEP 383
PEP 383@footnote{https://peps.python.org/pep-0383/} for
more.)

@end multitable


@geindex xmlcharrefreplace; error handler's name
@geindex namereplace; error handler's name
@geindex \N; escape sequence

The following error handlers are only applicable to encoding (within
@ref{2622,,text encodings}):


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Value

@tab

Meaning

@item

@code{'xmlcharrefreplace'}

@tab

Replace with XML/HTML numeric character
reference, which is a decimal form of Unicode
code point with format @code{&#@var{num};}.
Implemented in
@ref{190a,,xmlcharrefreplace_errors()}.

@item

@code{'namereplace'}

@tab

Replace with @code{\N@{...@}} escape sequences,
what appears in the braces is the Name
property from Unicode Character Database.
Implemented in @ref{28c2,,namereplace_errors()}.

@end multitable


@geindex surrogatepass; error handler's name

In addition, the following error handler is specific to the given codecs:


@multitable {xxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Value

@tab

Codecs

@tab

Meaning

@item

@code{'surrogatepass'}

@tab

utf-8, utf-16, utf-32,
utf-16-be, utf-16-le,
utf-32-be, utf-32-le

@tab

Allow encoding and decoding surrogate code
point (@code{U+D800} - @code{U+DFFF}) as normal
code point. Otherwise these codecs treat
the presence of surrogate code point in
@ref{16a,,str} as an error.

@end multitable



Added in version 3.1: The @code{'surrogateescape'} and @code{'surrogatepass'} error handlers.



Changed in version 3.4: The @code{'surrogatepass'} error handler now works with utf-16* and utf-32*
codecs.



Added in version 3.5: The @code{'namereplace'} error handler.



Changed in version 3.5: The @code{'backslashreplace'} error handler now works with decoding and
translating.


The set of allowed values can be extended by registering a new named error
handler:

@geindex register_error() (in module codecs)
@anchor{library/codecs codecs register_error}@anchor{16a7}
@deffn {Function} codecs.register_error (name, error_handler, /)

Register the error handling function `error_handler' under the name `name'.
The `error_handler' argument will be called during encoding and decoding
in case of an error, when `name' is specified as the errors parameter.

For encoding, `error_handler' will be called with a @ref{889,,UnicodeEncodeError}
instance, which contains information about the location of the error. The
error handler must either raise this or a different exception, or return a
tuple with a replacement for the unencodable part of the input and a position
where encoding should continue. The replacement may be either @ref{16a,,str} or
@ref{193,,bytes}. If the replacement is bytes, the encoder will simply copy
them into the output buffer. If the replacement is a string, the encoder will
encode the replacement. Encoding continues on original input at the
specified position. Negative position values will be treated as being
relative to the end of the input string. If the resulting position is out of
bound an @ref{1741,,IndexError} will be raised.

Decoding and translating works similarly, except @ref{c0e,,UnicodeDecodeError} or
@ref{1942,,UnicodeTranslateError} will be passed to the handler and that the
replacement from the error handler will be put into the output directly.
@end deffn

Previously registered error handlers (including the standard error handlers)
can be looked up by name:

@geindex lookup_error() (in module codecs)
@anchor{library/codecs codecs lookup_error}@anchor{16a8}
@deffn {Function} codecs.lookup_error (name, /)

Return the error handler previously registered under the name `name'.

Raises a @ref{242c,,LookupError} in case the handler cannot be found.
@end deffn

The following standard error handlers are also made available as module level
functions:

@geindex strict_errors() (in module codecs)
@anchor{library/codecs codecs strict_errors}@anchor{28c0}
@deffn {Function} codecs.strict_errors (exception)

Implements the @code{'strict'} error handling.

Each encoding or decoding error raises a @ref{460,,UnicodeError}.
@end deffn

@geindex ignore_errors() (in module codecs)
@anchor{library/codecs codecs ignore_errors}@anchor{28c1}
@deffn {Function} codecs.ignore_errors (exception)

Implements the @code{'ignore'} error handling.

Malformed data is ignored; encoding or decoding is continued without
further notice.
@end deffn

@geindex replace_errors() (in module codecs)
@anchor{library/codecs codecs replace_errors}@anchor{1908}
@deffn {Function} codecs.replace_errors (exception)

Implements the @code{'replace'} error handling.

Substitutes @code{?} (ASCII character) for encoding errors or @code{�} (U+FFFD,
the official REPLACEMENT CHARACTER) for decoding errors.
@end deffn

@geindex backslashreplace_errors() (in module codecs)
@anchor{library/codecs codecs backslashreplace_errors}@anchor{1909}
@deffn {Function} codecs.backslashreplace_errors (exception)

Implements the @code{'backslashreplace'} error handling.

Malformed data is replaced by a backslashed escape sequence.
On encoding, use the hexadecimal form of Unicode code point with formats
@code{\x@var{hh}} @code{\u@var{xxxx}} @code{\U@var{xxxxxxxx}}.
On decoding, use the hexadecimal form of
byte value with format @code{\x@var{hh}}.


Changed in version 3.5: Works with decoding and translating.

@end deffn

@geindex xmlcharrefreplace_errors() (in module codecs)
@anchor{library/codecs codecs xmlcharrefreplace_errors}@anchor{190a}
@deffn {Function} codecs.xmlcharrefreplace_errors (exception)

Implements the @code{'xmlcharrefreplace'} error handling (for encoding within
@ref{2622,,text encoding} only).

The unencodable character is replaced by an appropriate XML/HTML numeric
character reference, which is a decimal form of Unicode code point with
format @code{&#@var{num};} .
@end deffn

@geindex namereplace_errors() (in module codecs)
@anchor{library/codecs codecs namereplace_errors}@anchor{28c2}
@deffn {Function} codecs.namereplace_errors (exception)

Implements the @code{'namereplace'} error handling (for encoding within
@ref{2622,,text encoding} only).

The unencodable character is replaced by a @code{\N@{...@}} escape sequence. The
set of characters that appear in the braces is the Name property from
Unicode Character Database. For example, the German lowercase letter @code{'ß'}
will be converted to byte sequence @code{\N@{LATIN SMALL LETTER SHARP S@}} .


Added in version 3.5.

@end deffn

@node Stateless Encoding and Decoding,Incremental Encoding and Decoding,Error Handlers,Codec Base Classes
@anchor{library/codecs codec-objects}@anchor{289e}@anchor{library/codecs stateless-encoding-and-decoding}@anchor{28c3}
@subsubsection Stateless Encoding and Decoding


The base @ref{28c4,,Codec} class defines these methods which also define the
function interfaces of the stateless encoder and decoder:

@geindex Codec (class in codecs)
@anchor{library/codecs codecs Codec}@anchor{28c4}
@deffn {Class} codecs.Codec

@geindex encode() (codecs.Codec method)
@anchor{library/codecs codecs Codec encode}@anchor{289c}
@deffn {Method} encode (input, errors='strict')

Encodes the object `input' and returns a tuple (output object, length consumed).
For instance, @ref{2622,,text encoding} converts
a string object to a bytes object using a particular
character set encoding (e.g., @code{cp1252} or @code{iso-8859-1}).

The `errors' argument defines the error handling to apply.
It defaults to @code{'strict'} handling.

The method may not store state in the @code{Codec} instance. Use
@ref{28a5,,StreamWriter} for codecs which have to keep state in order to make
encoding efficient.

The encoder must be able to handle zero length input and return an empty object
of the output object type in this situation.
@end deffn

@geindex decode() (codecs.Codec method)
@anchor{library/codecs codecs Codec decode}@anchor{289d}
@deffn {Method} decode (input, errors='strict')

Decodes the object `input' and returns a tuple (output object, length
consumed). For instance, for a @ref{2622,,text encoding}, decoding converts
a bytes object encoded using a particular
character set encoding to a string object.

For text encodings and bytes-to-bytes codecs,
`input' must be a bytes object or one which provides the read-only
buffer interface – for example, buffer objects and memory mapped files.

The `errors' argument defines the error handling to apply.
It defaults to @code{'strict'} handling.

The method may not store state in the @code{Codec} instance. Use
@ref{28a6,,StreamReader} for codecs which have to keep state in order to make
decoding efficient.

The decoder must be able to handle zero length input and return an empty object
of the output object type in this situation.
@end deffn
@end deffn

@node Incremental Encoding and Decoding,Stream Encoding and Decoding,Stateless Encoding and Decoding,Codec Base Classes
@anchor{library/codecs incremental-encoding-and-decoding}@anchor{28c5}
@subsubsection Incremental Encoding and Decoding


The @ref{28a1,,IncrementalEncoder} and @ref{28a2,,IncrementalDecoder} classes provide
the basic interface for incremental encoding and decoding. Encoding/decoding the
input isn’t done with one call to the stateless encoder/decoder function, but
with multiple calls to the
@ref{28c6,,encode()}/@ref{28c7,,decode()} method of
the incremental encoder/decoder. The incremental encoder/decoder keeps track of
the encoding/decoding process during method calls.

The joined output of calls to the
@ref{28c6,,encode()}/@ref{28c7,,decode()} method is
the same as if all the single inputs were joined into one, and this input was
encoded/decoded with the stateless encoder/decoder.

@menu
* IncrementalEncoder Objects:: 
* IncrementalDecoder Objects:: 

@end menu

@node IncrementalEncoder Objects,IncrementalDecoder Objects,,Incremental Encoding and Decoding
@anchor{library/codecs incremental-encoder-objects}@anchor{28c8}@anchor{library/codecs incrementalencoder-objects}@anchor{28c9}
@subsubsection IncrementalEncoder Objects


The @ref{28a1,,IncrementalEncoder} class is used for encoding an input in multiple
steps. It defines the following methods which every incremental encoder must
define in order to be compatible with the Python codec registry.

@geindex IncrementalEncoder (class in codecs)
@anchor{library/codecs codecs IncrementalEncoder}@anchor{28a1}
@deffn {Class} codecs.IncrementalEncoder (errors='strict')

Constructor for an @code{IncrementalEncoder} instance.

All incremental encoders must provide this constructor interface. They are free
to add additional keyword arguments, but only the ones defined here are used by
the Python codec registry.

The @code{IncrementalEncoder} may implement different error handling schemes
by providing the `errors' keyword argument. See @ref{1bb3,,Error Handlers} for
possible values.

The `errors' argument will be assigned to an attribute of the same name.
Assigning to this attribute makes it possible to switch between different error
handling strategies during the lifetime of the @code{IncrementalEncoder}
object.

@geindex encode() (codecs.IncrementalEncoder method)
@anchor{library/codecs codecs IncrementalEncoder encode}@anchor{28c6}
@deffn {Method} encode (object, final=False)

Encodes `object' (taking the current state of the encoder into account)
and returns the resulting encoded object. If this is the last call to
@code{encode()} `final' must be true (the default is false).
@end deffn

@geindex reset() (codecs.IncrementalEncoder method)
@anchor{library/codecs codecs IncrementalEncoder reset}@anchor{28ca}
@deffn {Method} reset ()

Reset the encoder to the initial state. The output is discarded: call
@code{.encode(object, final=True)}, passing an empty byte or text string
if necessary, to reset the encoder and to get the output.
@end deffn

@geindex getstate() (codecs.IncrementalEncoder method)
@anchor{library/codecs codecs IncrementalEncoder getstate}@anchor{28cb}
@deffn {Method} getstate ()

Return the current state of the encoder which must be an integer. The
implementation should make sure that @code{0} is the most common
state. (States that are more complicated than integers can be converted
into an integer by marshaling/pickling the state and encoding the bytes
of the resulting string into an integer.)
@end deffn

@geindex setstate() (codecs.IncrementalEncoder method)
@anchor{library/codecs codecs IncrementalEncoder setstate}@anchor{28cc}
@deffn {Method} setstate (state)

Set the state of the encoder to `state'. `state' must be an encoder state
returned by @ref{28cb,,getstate()}.
@end deffn
@end deffn

@node IncrementalDecoder Objects,,IncrementalEncoder Objects,Incremental Encoding and Decoding
@anchor{library/codecs incremental-decoder-objects}@anchor{28cd}@anchor{library/codecs incrementaldecoder-objects}@anchor{28ce}
@subsubsection IncrementalDecoder Objects


The @ref{28a2,,IncrementalDecoder} class is used for decoding an input in multiple
steps. It defines the following methods which every incremental decoder must
define in order to be compatible with the Python codec registry.

@geindex IncrementalDecoder (class in codecs)
@anchor{library/codecs codecs IncrementalDecoder}@anchor{28a2}
@deffn {Class} codecs.IncrementalDecoder (errors='strict')

Constructor for an @code{IncrementalDecoder} instance.

All incremental decoders must provide this constructor interface. They are free
to add additional keyword arguments, but only the ones defined here are used by
the Python codec registry.

The @code{IncrementalDecoder} may implement different error handling schemes
by providing the `errors' keyword argument. See @ref{1bb3,,Error Handlers} for
possible values.

The `errors' argument will be assigned to an attribute of the same name.
Assigning to this attribute makes it possible to switch between different error
handling strategies during the lifetime of the @code{IncrementalDecoder}
object.

@geindex decode() (codecs.IncrementalDecoder method)
@anchor{library/codecs codecs IncrementalDecoder decode}@anchor{28c7}
@deffn {Method} decode (object, final=False)

Decodes `object' (taking the current state of the decoder into account)
and returns the resulting decoded object. If this is the last call to
@code{decode()} `final' must be true (the default is false). If `final' is
true the decoder must decode the input completely and must flush all
buffers. If this isn’t possible (e.g. because of incomplete byte sequences
at the end of the input) it must initiate error handling just like in the
stateless case (which might raise an exception).
@end deffn

@geindex reset() (codecs.IncrementalDecoder method)
@anchor{library/codecs codecs IncrementalDecoder reset}@anchor{28cf}
@deffn {Method} reset ()

Reset the decoder to the initial state.
@end deffn

@geindex getstate() (codecs.IncrementalDecoder method)
@anchor{library/codecs codecs IncrementalDecoder getstate}@anchor{28d0}
@deffn {Method} getstate ()

Return the current state of the decoder. This must be a tuple with two
items, the first must be the buffer containing the still undecoded
input. The second must be an integer and can be additional state
info. (The implementation should make sure that @code{0} is the most common
additional state info.) If this additional state info is @code{0} it must be
possible to set the decoder to the state which has no input buffered and
@code{0} as the additional state info, so that feeding the previously
buffered input to the decoder returns it to the previous state without
producing any output. (Additional state info that is more complicated than
integers can be converted into an integer by marshaling/pickling the info
and encoding the bytes of the resulting string into an integer.)
@end deffn

@geindex setstate() (codecs.IncrementalDecoder method)
@anchor{library/codecs codecs IncrementalDecoder setstate}@anchor{28d1}
@deffn {Method} setstate (state)

Set the state of the decoder to `state'. `state' must be a decoder state
returned by @ref{28d0,,getstate()}.
@end deffn
@end deffn

@node Stream Encoding and Decoding,,Incremental Encoding and Decoding,Codec Base Classes
@anchor{library/codecs stream-encoding-and-decoding}@anchor{28d2}
@subsubsection Stream Encoding and Decoding


The @ref{28a5,,StreamWriter} and @ref{28a6,,StreamReader} classes provide generic
working interfaces which can be used to implement new encoding submodules very
easily. See @code{encodings.utf_8} for an example of how this is done.

@menu
* StreamWriter Objects:: 
* StreamReader Objects:: 
* StreamReaderWriter Objects:: 
* StreamRecoder Objects:: 

@end menu

@node StreamWriter Objects,StreamReader Objects,,Stream Encoding and Decoding
@anchor{library/codecs stream-writer-objects}@anchor{28d3}@anchor{library/codecs streamwriter-objects}@anchor{28d4}
@subsubsection StreamWriter Objects


The @ref{28a5,,StreamWriter} class is a subclass of @ref{28c4,,Codec} and defines the
following methods which every stream writer must define in order to be
compatible with the Python codec registry.

@geindex StreamWriter (class in codecs)
@anchor{library/codecs codecs StreamWriter}@anchor{28a5}
@deffn {Class} codecs.StreamWriter (stream, errors='strict')

Constructor for a @code{StreamWriter} instance.

All stream writers must provide this constructor interface. They are free to add
additional keyword arguments, but only the ones defined here are used by the
Python codec registry.

The `stream' argument must be a file-like object open for writing
text or binary data, as appropriate for the specific codec.

The @code{StreamWriter} may implement different error handling schemes by
providing the `errors' keyword argument. See @ref{1bb3,,Error Handlers} for
the standard error handlers the underlying stream codec may support.

The `errors' argument will be assigned to an attribute of the same name.
Assigning to this attribute makes it possible to switch between different error
handling strategies during the lifetime of the @code{StreamWriter} object.

@geindex write() (codecs.StreamWriter method)
@anchor{library/codecs codecs StreamWriter write}@anchor{28d5}
@deffn {Method} write (object)

Writes the object’s contents encoded to the stream.
@end deffn

@geindex writelines() (codecs.StreamWriter method)
@anchor{library/codecs codecs StreamWriter writelines}@anchor{28d6}
@deffn {Method} writelines (list)

Writes the concatenated iterable of strings to the stream (possibly by reusing
the @ref{28d5,,write()} method). Infinite or
very large iterables are not supported. The standard bytes-to-bytes codecs
do not support this method.
@end deffn

@geindex reset() (codecs.StreamWriter method)
@anchor{library/codecs codecs StreamWriter reset}@anchor{28d7}
@deffn {Method} reset ()

Resets the codec buffers used for keeping internal state.

Calling this method should ensure that the data on the output is put into
a clean state that allows appending of new fresh data without having to
rescan the whole stream to recover state.
@end deffn
@end deffn

In addition to the above methods, the @ref{28a5,,StreamWriter} must also inherit
all other methods and attributes from the underlying stream.

@node StreamReader Objects,StreamReaderWriter Objects,StreamWriter Objects,Stream Encoding and Decoding
@anchor{library/codecs stream-reader-objects}@anchor{28d8}@anchor{library/codecs streamreader-objects}@anchor{28d9}
@subsubsection StreamReader Objects


The @ref{28a6,,StreamReader} class is a subclass of @ref{28c4,,Codec} and defines the
following methods which every stream reader must define in order to be
compatible with the Python codec registry.

@geindex StreamReader (class in codecs)
@anchor{library/codecs codecs StreamReader}@anchor{28a6}
@deffn {Class} codecs.StreamReader (stream, errors='strict')

Constructor for a @code{StreamReader} instance.

All stream readers must provide this constructor interface. They are free to add
additional keyword arguments, but only the ones defined here are used by the
Python codec registry.

The `stream' argument must be a file-like object open for reading
text or binary data, as appropriate for the specific codec.

The @code{StreamReader} may implement different error handling schemes by
providing the `errors' keyword argument. See @ref{1bb3,,Error Handlers} for
the standard error handlers the underlying stream codec may support.

The `errors' argument will be assigned to an attribute of the same name.
Assigning to this attribute makes it possible to switch between different error
handling strategies during the lifetime of the @code{StreamReader} object.

The set of allowed values for the `errors' argument can be extended with
@ref{16a7,,register_error()}.

@geindex read() (codecs.StreamReader method)
@anchor{library/codecs codecs StreamReader read}@anchor{28da}
@deffn {Method} read (size=-1, chars=-1, firstline=False)

Decodes data from the stream and returns the resulting object.

The `chars' argument indicates the number of decoded
code points or bytes to return. The @ref{28da,,read()} method will
never return more data than requested, but it might return less,
if there is not enough available.

The `size' argument indicates the approximate maximum
number of encoded bytes or code points to read
for decoding. The decoder can modify this setting as
appropriate. The default value -1 indicates to read and decode as much as
possible. This parameter is intended to
prevent having to decode huge files in one step.

The `firstline' flag indicates that
it would be sufficient to only return the first
line, if there are decoding errors on later lines.

The method should use a greedy read strategy meaning that it should read
as much data as is allowed within the definition of the encoding and the
given size, e.g.  if optional encoding endings or state markers are
available on the stream, these should be read too.
@end deffn

@geindex readline() (codecs.StreamReader method)
@anchor{library/codecs codecs StreamReader readline}@anchor{28db}
@deffn {Method} readline (size=None, keepends=True)

Read one line from the input stream and return the decoded data.

`size', if given, is passed as size argument to the stream’s
@ref{28da,,read()} method.

If `keepends' is false line-endings will be stripped from the lines
returned.
@end deffn

@geindex readlines() (codecs.StreamReader method)
@anchor{library/codecs codecs StreamReader readlines}@anchor{28dc}
@deffn {Method} readlines (sizehint=None, keepends=True)

Read all lines available on the input stream and return them as a list of
lines.

Line-endings are implemented using the codec’s @ref{110b,,decode()} method and
are included in the list entries if `keepends' is true.

`sizehint', if given, is passed as the `size' argument to the stream’s
@ref{28da,,read()} method.
@end deffn

@geindex reset() (codecs.StreamReader method)
@anchor{library/codecs codecs StreamReader reset}@anchor{28dd}
@deffn {Method} reset ()

Resets the codec buffers used for keeping internal state.

Note that no stream repositioning should take place. This method is
primarily intended to be able to recover from decoding errors.
@end deffn
@end deffn

In addition to the above methods, the @ref{28a6,,StreamReader} must also inherit
all other methods and attributes from the underlying stream.

@node StreamReaderWriter Objects,StreamRecoder Objects,StreamReader Objects,Stream Encoding and Decoding
@anchor{library/codecs stream-reader-writer}@anchor{28de}@anchor{library/codecs streamreaderwriter-objects}@anchor{28df}
@subsubsection StreamReaderWriter Objects


The @ref{28ae,,StreamReaderWriter} is a convenience class that allows wrapping
streams which work in both read and write modes.

The design is such that one can use the factory functions returned by the
@ref{b62,,lookup()} function to construct the instance.

@geindex StreamReaderWriter (class in codecs)
@anchor{library/codecs codecs StreamReaderWriter}@anchor{28ae}
@deffn {Class} codecs.StreamReaderWriter (stream, Reader, Writer, errors='strict')

Creates a @code{StreamReaderWriter} instance. `stream' must be a file-like
object. `Reader' and `Writer' must be factory functions or classes providing the
@ref{28a6,,StreamReader} and @ref{28a5,,StreamWriter} interface resp. Error handling
is done in the same way as defined for the stream readers and writers.
@end deffn

@ref{28ae,,StreamReaderWriter} instances define the combined interfaces of
@ref{28a6,,StreamReader} and @ref{28a5,,StreamWriter} classes. They inherit all other
methods and attributes from the underlying stream.

@node StreamRecoder Objects,,StreamReaderWriter Objects,Stream Encoding and Decoding
@anchor{library/codecs stream-recoder-objects}@anchor{28e0}@anchor{library/codecs streamrecoder-objects}@anchor{28e1}
@subsubsection StreamRecoder Objects


The @ref{1e16,,StreamRecoder} translates data from one encoding to another,
which is sometimes useful when dealing with different encoding environments.

The design is such that one can use the factory functions returned by the
@ref{b62,,lookup()} function to construct the instance.

@geindex StreamRecoder (class in codecs)
@anchor{library/codecs codecs StreamRecoder}@anchor{1e16}
@deffn {Class} codecs.StreamRecoder (stream, encode, decode, Reader, Writer, errors='strict')

Creates a @code{StreamRecoder} instance which implements a two-way conversion:
`encode' and `decode' work on the frontend — the data visible to
code calling @ref{28da,,read()} and @ref{28d5,,write()},
while `Reader' and `Writer'
work on the backend — the data in `stream'.

You can use these objects to do transparent transcodings, e.g., from Latin-1
to UTF-8 and back.

The `stream' argument must be a file-like object.

The `encode' and `decode' arguments must
adhere to the @ref{28c4,,Codec} interface. `Reader' and
`Writer' must be factory functions or classes providing objects of the
@ref{28a6,,StreamReader} and @ref{28a5,,StreamWriter} interface respectively.

Error handling is done in the same way as defined for the stream readers and
writers.
@end deffn

@ref{1e16,,StreamRecoder} instances define the combined interfaces of
@ref{28a6,,StreamReader} and @ref{28a5,,StreamWriter} classes. They inherit all other
methods and attributes from the underlying stream.

@node Encodings and Unicode,Standard Encodings,Codec Base Classes,codecs — Codec registry and base classes
@anchor{library/codecs encodings-and-unicode}@anchor{28e2}@anchor{library/codecs encodings-overview}@anchor{28e3}
@subsubsection Encodings and Unicode


Strings are stored internally as sequences of code points in
range @code{U+0000}–@code{U+10FFFF}. (See 
@geindex Python Enhancement Proposals; PEP 393
PEP 393@footnote{https://peps.python.org/pep-0393/} for
more details about the implementation.)
Once a string object is used outside of CPU and memory, endianness
and how these arrays are stored as bytes become an issue. As with other
codecs, serialising a string into a sequence of bytes is known as `encoding',
and recreating the string from the sequence of bytes is known as `decoding'.
There are a variety of different text serialisation codecs, which are
collectivity referred to as @ref{2622,,text encodings}.

The simplest text encoding (called @code{'latin-1'} or @code{'iso-8859-1'}) maps
the code points 0–255 to the bytes @code{0x0}–@code{0xff}, which means that a string
object that contains code points above @code{U+00FF} can’t be encoded with this
codec. Doing so will raise a @ref{889,,UnicodeEncodeError} that looks
like the following (although the details of the error message may differ):
@code{UnicodeEncodeError: 'latin-1' codec can't encode character '\u1234' in
position 3: ordinal not in range(256)}.

There’s another group of encodings (the so called charmap encodings) that choose
a different subset of all Unicode code points and how these code points are
mapped to the bytes @code{0x0}–@code{0xff}. To see how this is done simply open
e.g. @code{encodings/cp1252.py} (which is an encoding that is used primarily on
Windows). There’s a string constant with 256 characters that shows you which
character is mapped to which byte value.

All of these encodings can only encode 256 of the 1114112 code points
defined in Unicode. A simple and straightforward way that can store each Unicode
code point, is to store each code point as four consecutive bytes. There are two
possibilities: store the bytes in big endian or in little endian order. These
two encodings are called @code{UTF-32-BE} and @code{UTF-32-LE} respectively. Their
disadvantage is that if, for example, you use @code{UTF-32-BE} on a little endian
machine you will always have to swap bytes on encoding and decoding.
Python’s @code{UTF-16} and @code{UTF-32} codecs avoid this problem by using the
platform’s native byte order when no BOM is present.
Python follows prevailing platform
practice, so native-endian data round-trips without redundant byte swapping,
even though the Unicode Standard defaults to big-endian when the byte order is
unspecified. When these bytes are read by a CPU with a different endianness,
the bytes have to be swapped. To be able to detect the endianness of a
@code{UTF-16} or @code{UTF-32} byte sequence, a BOM (“Byte Order Mark”) is used.
This is the Unicode character @code{U+FEFF}. This character can be prepended to every
@code{UTF-16} or @code{UTF-32} byte sequence. The byte swapped version of this character
(@code{0xFFFE}) is an illegal character that may not appear in a Unicode text.
When the first character of a @code{UTF-16} or @code{UTF-32} byte sequence is
@code{U+FFFE}, the bytes have to be swapped on decoding.

Unfortunately the character @code{U+FEFF} had a second purpose as
a @code{ZERO WIDTH NO-BREAK SPACE}: a character that has no width and doesn’t allow
a word to be split. It can e.g. be used to give hints to a ligature algorithm.
With Unicode 4.0 using @code{U+FEFF} as a @code{ZERO WIDTH NO-BREAK SPACE} has been
deprecated (with @code{U+2060} (@code{WORD JOINER}) assuming this role). Nevertheless
Unicode software still must be able to handle @code{U+FEFF} in both roles: as a BOM
it’s a device to determine the storage layout of the encoded bytes, and vanishes
once the byte sequence has been decoded into a string; as a @code{ZERO WIDTH
NO-BREAK SPACE} it’s a normal character that will be decoded like any other.

There’s another encoding that is able to encode the full range of Unicode
characters: UTF-8. UTF-8 is an 8-bit encoding, which means there are no issues
with byte order in UTF-8. Each byte in a UTF-8 byte sequence consists of two
parts: marker bits (the most significant bits) and payload bits. The marker bits
are a sequence of zero to four @code{1} bits followed by a @code{0} bit. Unicode characters are
encoded like this (with x being payload bits, which when concatenated give the
Unicode character):


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Range

@tab

Encoding

@item

@code{U-00000000} … @code{U-0000007F}

@tab

0xxxxxxx

@item

@code{U-00000080} … @code{U-000007FF}

@tab

110xxxxx 10xxxxxx

@item

@code{U-00000800} … @code{U-0000FFFF}

@tab

1110xxxx 10xxxxxx 10xxxxxx

@item

@code{U-00010000} … @code{U-0010FFFF}

@tab

11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

@end multitable


The least significant bit of the Unicode character is the rightmost x bit.

As UTF-8 is an 8-bit encoding no BOM is required and any @code{U+FEFF} character in
the decoded string (even if it’s the first character) is treated as a @code{ZERO
WIDTH NO-BREAK SPACE}.

Without external information it’s impossible to reliably determine which
encoding was used for encoding a string. Each charmap encoding can
decode any random byte sequence. However that’s not possible with UTF-8, as
UTF-8 byte sequences have a structure that doesn’t allow arbitrary byte
sequences. To increase the reliability with which a UTF-8 encoding can be
detected, Microsoft invented a variant of UTF-8 (that Python calls
@code{"utf-8-sig"}) for its Notepad program: Before any of the Unicode characters
is written to the file, a UTF-8 encoded BOM (which looks like this as a byte
sequence: @code{0xef}, @code{0xbb}, @code{0xbf}) is written. As it’s rather improbable
that any charmap encoded file starts with these byte values (which would e.g.
map to

@quotation


@display
LATIN SMALL LETTER I WITH DIAERESIS@w{ }
RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK@w{ }
INVERTED QUESTION MARK@w{ }
@end display


@end quotation

in iso-8859-1), this increases the probability that a @code{utf-8-sig} encoding can be
correctly guessed from the byte sequence. So here the BOM is not used to be able
to determine the byte order used for generating the byte sequence, but as a
signature that helps in guessing the encoding. On encoding the utf-8-sig codec
will write @code{0xef}, @code{0xbb}, @code{0xbf} as the first three bytes to the file. On
decoding @code{utf-8-sig} will skip those three bytes if they appear as the first
three bytes in the file. In UTF-8, the use of the BOM is discouraged and
should generally be avoided.

@node Standard Encodings,Python Specific Encodings,Encodings and Unicode,codecs — Codec registry and base classes
@anchor{library/codecs id3}@anchor{28e4}@anchor{library/codecs standard-encodings}@anchor{fbe}
@subsubsection Standard Encodings


Python comes with a number of codecs built-in, either implemented as C functions
or with dictionaries as mapping tables. The following table lists the codecs by
name, together with a few common aliases, and the languages for which the
encoding is likely used. Neither the list of aliases nor the list of languages
is meant to be exhaustive. Notice that spelling alternatives that only differ in
case or use a hyphen instead of an underscore are also valid aliases
because they are equivalent when normalized by
@ref{a03,,normalize_encoding()}. For example, @code{'utf-8'} is a valid
alias for the @code{'utf_8'} codec.

@cartouche
@quotation Note 
The below table lists the most common aliases, for a complete list
refer to the source aliases.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/encodings/aliases.py} file.
@end quotation
@end cartouche

On Windows, @code{cpXXX} codecs are available for all code pages.
But only codecs listed in the following table are guarantead to exist on
other platforms.

`CPython implementation detail:' Some common encodings can bypass the codecs lookup machinery to
improve performance. These optimization opportunities are only
recognized by CPython for a limited set of (case insensitive)
aliases: utf-8, utf8, latin-1, latin1, iso-8859-1, iso8859-1, mbcs
(Windows only), ascii, us-ascii, utf-16, utf16, utf-32, utf32, and
the same using underscores instead of dashes. Using alternative
aliases for these encodings may result in slower execution.


Changed in version 3.6: Optimization opportunity recognized for us-ascii.


Many of the character sets support the same languages. They vary in individual
characters (e.g. whether the EURO SIGN is supported or not), and in the
assignment of characters to code positions. For the European languages in
particular, the following variants typically exist:


@itemize *

@item 
an ISO 8859 codeset

@item 
a Microsoft Windows code page, which is typically derived from an 8859 codeset,
but replaces control characters with additional graphic characters

@item 
an IBM EBCDIC code page

@item 
an IBM PC code page, which is ASCII compatible
@end itemize


@multitable {xxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Codec

@tab

Aliases

@tab

Languages

@item

ascii

@tab

646, us-ascii

@tab

English

@item

big5

@tab

big5-tw, csbig5

@tab

Traditional Chinese

@item

big5hkscs

@tab

big5-hkscs, hkscs

@tab

Traditional Chinese

@item

cp037

@tab

IBM037, IBM039

@tab

English

@item

cp273

@tab

273, IBM273, csIBM273

@tab

German


Added in version 3.4.


@item

cp424

@tab

EBCDIC-CP-HE, IBM424

@tab

Hebrew

@item

cp437

@tab

437, IBM437

@tab

English

@item

cp500

@tab

EBCDIC-CP-BE, EBCDIC-CP-CH,
IBM500

@tab

Western Europe

@item

cp720

@tab

@tab

Arabic

@item

cp737

@tab

@tab

Greek

@item

cp775

@tab

IBM775

@tab

Baltic languages

@item

cp850

@tab

850, IBM850

@tab

Western Europe

@item

cp852

@tab

852, IBM852

@tab

Central and Eastern Europe

@item

cp855

@tab

855, IBM855

@tab

Belarusian, Bulgarian,
Macedonian, Russian, Serbian

@item

cp856

@tab

@tab

Hebrew

@item

cp857

@tab

857, IBM857

@tab

Turkish

@item

cp858

@tab

858, IBM00858

@tab

Western Europe

@item

cp860

@tab

860, IBM860

@tab

Portuguese

@item

cp861

@tab

861, CP-IS, IBM861

@tab

Icelandic

@item

cp862

@tab

862, IBM862

@tab

Hebrew

@item

cp863

@tab

863, IBM863

@tab

Canadian

@item

cp864

@tab

IBM864

@tab

Arabic

@item

cp865

@tab

865, IBM865

@tab

Danish, Norwegian

@item

cp866

@tab

866, IBM866

@tab

Russian

@item

cp869

@tab

869, CP-GR, IBM869

@tab

Greek

@item

cp874

@tab

@tab

Thai

@item

cp875

@tab

@tab

Greek

@item

cp932

@tab

932, ms932, mskanji, ms-kanji,
windows-31j

@tab

Japanese

@item

cp949

@tab

949, ms949, uhc

@tab

Korean

@item

cp950

@tab

950, ms950

@tab

Traditional Chinese

@item

cp1006

@tab

@tab

Urdu

@item

cp1026

@tab

ibm1026

@tab

Turkish

@item

cp1125

@tab

1125, ibm1125, cp866u, ruscii

@tab

Ukrainian


Added in version 3.4.


@item

cp1140

@tab

IBM01140

@tab

Western Europe

@item

cp1250

@tab

windows-1250

@tab

Central and Eastern Europe

@item

cp1251

@tab

windows-1251

@tab

Belarusian, Bulgarian,
Macedonian, Russian, Serbian

@item

cp1252

@tab

windows-1252

@tab

Western Europe

@item

cp1253

@tab

windows-1253

@tab

Greek

@item

cp1254

@tab

windows-1254

@tab

Turkish

@item

cp1255

@tab

windows-1255

@tab

Hebrew

@item

cp1256

@tab

windows-1256

@tab

Arabic

@item

cp1257

@tab

windows-1257

@tab

Baltic languages

@item

cp1258

@tab

windows-1258

@tab

Vietnamese

@item

euc_jp

@tab

eucjp, ujis, u-jis

@tab

Japanese

@item

euc_jis_2004

@tab

jisx0213, eucjis2004

@tab

Japanese

@item

euc_jisx0213

@tab

eucjisx0213

@tab

Japanese

@item

euc_kr

@tab

euckr, korean, ksc5601,
ks_c-5601, ks_c-5601-1987,
ksx1001, ks_x-1001

@tab

Korean

@item

gb2312

@tab

chinese, csiso58gb231280,
euc-cn, euccn, eucgb2312-cn,
gb2312-1980, gb2312-80,
iso-ir-58

@tab

Simplified Chinese

@item

gbk

@tab

936, cp936, ms936

@tab

Unified Chinese

@item

gb18030

@tab

gb18030-2000

@tab

Unified Chinese

@item

hz

@tab

hzgb, hz-gb, hz-gb-2312

@tab

Simplified Chinese

@item

iso2022_jp

@tab

csiso2022jp, iso2022jp,
iso-2022-jp

@tab

Japanese

@item

iso2022_jp_1

@tab

iso2022jp-1, iso-2022-jp-1

@tab

Japanese

@item

iso2022_jp_2

@tab

iso2022jp-2, iso-2022-jp-2

@tab

Japanese, Korean, Simplified
Chinese, Western Europe, Greek

@item

iso2022_jp_2004

@tab

iso2022jp-2004,
iso-2022-jp-2004

@tab

Japanese

@item

iso2022_jp_3

@tab

iso2022jp-3, iso-2022-jp-3

@tab

Japanese

@item

iso2022_jp_ext

@tab

iso2022jp-ext, iso-2022-jp-ext

@tab

Japanese

@item

iso2022_kr

@tab

csiso2022kr, iso2022kr,
iso-2022-kr

@tab

Korean

@item

latin_1

@tab

iso-8859-1, iso8859-1, 8859,
cp819, latin, latin1, L1

@tab

Western Europe

@item

iso8859_2

@tab

iso-8859-2, latin2, L2

@tab

Central and Eastern Europe

@item

iso8859_3

@tab

iso-8859-3, latin3, L3

@tab

Esperanto, Maltese

@item

iso8859_4

@tab

iso-8859-4, latin4, L4

@tab

Northern Europe

@item

iso8859_5

@tab

iso-8859-5, cyrillic

@tab

Belarusian, Bulgarian,
Macedonian, Russian, Serbian

@item

iso8859_6

@tab

iso-8859-6, arabic

@tab

Arabic

@item

iso8859_7

@tab

iso-8859-7, greek, greek8

@tab

Greek

@item

iso8859_8

@tab

iso-8859-8, hebrew

@tab

Hebrew

@item

iso8859_9

@tab

iso-8859-9, latin5, L5

@tab

Turkish

@item

iso8859_10

@tab

iso-8859-10, latin6, L6

@tab

Nordic languages

@item

iso8859_11

@tab

iso-8859-11, thai

@tab

Thai languages

@item

iso8859_13

@tab

iso-8859-13, latin7, L7

@tab

Baltic languages

@item

iso8859_14

@tab

iso-8859-14, latin8, L8

@tab

Celtic languages

@item

iso8859_15

@tab

iso-8859-15, latin9, L9

@tab

Western Europe

@item

iso8859_16

@tab

iso-8859-16, latin10, L10

@tab

South-Eastern Europe

@item

johab

@tab

cp1361, ms1361

@tab

Korean

@item

koi8_r

@tab

@tab

Russian

@item

koi8_t

@tab

@tab

Tajik


Added in version 3.5.


@item

koi8_u

@tab

@tab

Ukrainian

@item

kz1048

@tab

kz_1048, strk1048_2002, rk1048

@tab

Kazakh


Added in version 3.5.


@item

mac_cyrillic

@tab

maccyrillic

@tab

Belarusian, Bulgarian,
Macedonian, Russian, Serbian

@item

mac_greek

@tab

macgreek

@tab

Greek

@item

mac_iceland

@tab

maciceland

@tab

Icelandic

@item

mac_latin2

@tab

maclatin2, maccentraleurope,
mac_centeuro

@tab

Central and Eastern Europe

@item

mac_roman

@tab

macroman, macintosh

@tab

Western Europe

@item

mac_turkish

@tab

macturkish

@tab

Turkish

@item

ptcp154

@tab

csptcp154, pt154, cp154,
cyrillic-asian

@tab

Kazakh

@item

shift_jis

@tab

csshiftjis, shiftjis, sjis,
s_jis

@tab

Japanese

@item

shift_jis_2004

@tab

shiftjis2004, sjis_2004,
sjis2004

@tab

Japanese

@item

shift_jisx0213

@tab

shiftjisx0213, sjisx0213,
s_jisx0213

@tab

Japanese

@item

utf_32

@tab

U32, utf32

@tab

all languages

@item

utf_32_be

@tab

UTF-32BE

@tab

all languages

@item

utf_32_le

@tab

UTF-32LE

@tab

all languages

@item

utf_16

@tab

U16, utf16

@tab

all languages

@item

utf_16_be

@tab

UTF-16BE

@tab

all languages

@item

utf_16_le

@tab

UTF-16LE

@tab

all languages

@item

utf_7

@tab

U7, unicode-1-1-utf-7

@tab

all languages

@item

utf_8

@tab

U8, UTF, utf8, cp65001

@tab

all languages

@item

utf_8_sig

@tab

@tab

all languages

@end multitable



Changed in version 3.4: The utf-16* and utf-32* encoders no longer allow surrogate code points
(@code{U+D800}–@code{U+DFFF}) to be encoded.
The utf-32* decoders no longer decode
byte sequences that correspond to surrogate code points.



Changed in version 3.8: @code{cp65001} is now an alias to @code{utf_8}.



Changed in version 3.14: On Windows, @code{cpXXX} codecs are now available for all code pages.


@node Python Specific Encodings,encodings — Encodings package,Standard Encodings,codecs — Codec registry and base classes
@anchor{library/codecs python-specific-encodings}@anchor{28e5}
@subsubsection Python Specific Encodings


A number of predefined codecs are specific to Python, so their codec names have
no meaning outside Python. These are listed in the tables below based on the
expected input and output types (note that while text encodings are the most
common use case for codecs, the underlying codec infrastructure supports
arbitrary data transforms rather than just text encodings). For asymmetric
codecs, the stated meaning describes the encoding direction.

@menu
* Text Encodings:: 
* Binary Transforms:: 
* Standalone Codec Functions:: 
* Text Transforms:: 

@end menu

@node Text Encodings,Binary Transforms,,Python Specific Encodings
@anchor{library/codecs text-encodings}@anchor{28e6}
@subsubsection Text Encodings


The following codecs provide @ref{16a,,str} to @ref{193,,bytes} encoding and
@ref{194,,bytes-like object} to @code{str} decoding, similar to the Unicode text
encodings.


@multitable {xxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Codec

@tab

Aliases

@tab

Meaning

@item

idna

@tab

@tab

Implement 
@geindex RFC; RFC 3490
RFC 3490@footnote{https://datatracker.ietf.org/doc/html/rfc3490.html},
see also
@ref{56,,encodings.idna}.
Only @code{errors='strict'}
is supported.

@item

mbcs

@tab

ansi,
dbcs

@tab

Windows only: Encode the
operand according to the
ANSI codepage (CP_ACP).

@item

oem

@tab

@tab

Windows only: Encode the
operand according to the
OEM codepage (CP_OEMCP).


Added in version 3.6.


@item

palmos

@tab

@tab

Encoding of PalmOS 3.5.

@item

punycode

@tab

@tab

Implement 
@geindex RFC; RFC 3492
RFC 3492@footnote{https://datatracker.ietf.org/doc/html/rfc3492.html}.
Stateful codecs are not
supported.

@item

raw_unicode_escape

@tab

@tab

Latin-1 encoding with
@code{\u@var{XXXX}} and
@code{\U@var{XXXXXXXX}}
for other code points.
Existing
backslashes are not
escaped in any way.
It is used in the Python
pickle protocol.

@item

undefined

@tab

@tab

This Codec should only
be used for testing
purposes.

Raise an exception for
all conversions, even
empty strings. The error
handler is ignored.

@item

unicode_escape

@tab

@tab

Encoding suitable as the
contents of a Unicode
literal in ASCII-encoded
Python source code,
except that quotes are
not escaped. Decode
from Latin-1 source code.
Beware that Python source
code actually uses UTF-8
by default.

@end multitable



Changed in version 3.8: “unicode_internal” codec is removed.


@node Binary Transforms,Standalone Codec Functions,Text Encodings,Python Specific Encodings
@anchor{library/codecs binary-transforms}@anchor{110c}@anchor{library/codecs id4}@anchor{28e7}
@subsubsection Binary Transforms


The following codecs provide binary transforms: @ref{194,,bytes-like object}
to @ref{193,,bytes} mappings. They are not supported by @ref{ad9,,bytes.decode()}
(which only produces @ref{16a,,str} output).


@multitable {xxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Codec

@tab

Aliases

@tab

Meaning

@tab

Encoder / decoder

@item

base64_codec @footnote{
In addition to @ref{194,,bytes-like objects},
@code{'base64_codec'} also accepts ASCII-only instances of @ref{16a,,str} for
decoding
}

@tab

base64, base_64

@tab

Convert the operand to
multiline MIME base64 (the
result always includes a
trailing @code{'\n'}).


Changed in version 3.4: accepts any
@ref{194,,bytes-like object}
as input for encoding and
decoding


@tab

@ref{b52,,base64.encodebytes()} /
@ref{b53,,base64.decodebytes()}

@item

bz2_codec

@tab

bz2

@tab

Compress the operand using
bz2.

@tab

@ref{28e8,,bz2.compress()} /
@ref{129a,,bz2.decompress()}

@item

hex_codec

@tab

hex

@tab

Convert the operand to
hexadecimal
representation, with two
digits per byte.

@tab

@ref{28e9,,binascii.b2a_hex()} /
@ref{28ea,,binascii.a2b_hex()}

@item

quopri_codec

@tab

quopri,
quotedprintable,
quoted_printable

@tab

Convert the operand to MIME
quoted printable.

@tab

@ref{28eb,,quopri.encode()} with
@code{quotetabs=True} /
@ref{28ec,,quopri.decode()}

@item

uu_codec

@tab

uu

@tab

Convert the operand using
uuencode.

@tab

@item

zlib_codec

@tab

zip, zlib

@tab

Compress the operand using
gzip.

@tab

@ref{850,,zlib.compress()} /
@ref{f0f,,zlib.decompress()}

@end multitable



Added in version 3.2: Restoration of the binary transforms.



Changed in version 3.4: Restoration of the aliases for the binary transforms.


@node Standalone Codec Functions,Text Transforms,Binary Transforms,Python Specific Encodings
@anchor{library/codecs id6}@anchor{28ed}@anchor{library/codecs standalone-codec-functions}@anchor{28ee}
@subsubsection Standalone Codec Functions


The following functions provide encoding and decoding functionality similar to codecs,
but are not available as named codecs through @ref{110a,,codecs.encode()} or @ref{110b,,codecs.decode()}.
They are used internally (for example, by @ref{ab,,pickle}) and behave similarly to the
@code{string_escape} codec that was removed in Python 3.

@geindex codecs.escape_encode() (in module codecs)
@anchor{library/codecs codecs codecs escape_encode}@anchor{28ef}
@deffn {Function} codecs.escape_encode (input, errors=None)

Encode `input' using escape sequences. Similar to how @ref{1c3,,repr()} on bytes
produces escaped byte values.

`input' must be a @ref{193,,bytes} object.

Returns a tuple @code{(output, length)} where `output' is a @ref{193,,bytes}
object and `length' is the number of bytes consumed.
@end deffn

@geindex codecs.escape_decode() (in module codecs)
@anchor{library/codecs codecs codecs escape_decode}@anchor{28f0}
@deffn {Function} codecs.escape_decode (input, errors=None)

Decode `input' from escape sequences back to the original bytes.

`input' must be a @ref{194,,bytes-like object}.

Returns a tuple @code{(output, length)} where `output' is a @ref{193,,bytes}
object and `length' is the number of bytes consumed.
@end deffn

@node Text Transforms,,Standalone Codec Functions,Python Specific Encodings
@anchor{library/codecs id7}@anchor{28f1}@anchor{library/codecs text-transforms}@anchor{110d}
@subsubsection Text Transforms


The following codec provides a text transform: a @ref{16a,,str} to @code{str}
mapping. It is not supported by @ref{ad8,,str.encode()} (which only produces
@ref{193,,bytes} output).


@multitable {xxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Codec

@tab

Aliases

@tab

Meaning

@item

rot_13

@tab

rot13

@tab

Return the Caesar-cypher
encryption of the
operand.

@end multitable



Added in version 3.2: Restoration of the @code{rot_13} text transform.



Changed in version 3.4: Restoration of the @code{rot13} alias.


@node encodings — Encodings package,encodings idna — Internationalized Domain Names in Applications,Python Specific Encodings,codecs — Codec registry and base classes
@anchor{library/codecs encodings-encodings-package}@anchor{28f2}@anchor{library/codecs module-encodings}@anchor{55}
@subsubsection @code{encodings} — Encodings package


@geindex module; encodings

This module implements the following functions:

@geindex normalize_encoding() (in module encodings)
@anchor{library/codecs encodings normalize_encoding}@anchor{a03}
@deffn {Function} encodings.normalize_encoding (encoding)

Normalize encoding name `encoding'.

Normalization works as follows: all non-alphanumeric characters except the
dot used for Python package names are collapsed and replaced with a single
underscore, leading and trailing underscores are removed.
For example, @code{'  -;#'} becomes @code{'_'}.

Note that `encoding' should be ASCII only.
@end deffn

@cartouche
@quotation Note 
The following functions should not be used directly, except for testing
purposes; @ref{b62,,codecs.lookup()} should be used instead.
@end quotation
@end cartouche

@geindex search_function() (in module encodings)
@anchor{library/codecs encodings search_function}@anchor{17ae}
@deffn {Function} encodings.search_function (encoding)

Search for the codec module corresponding to the given encoding name
`encoding'.

This function first normalizes the `encoding' using
@ref{a03,,normalize_encoding()}, then looks for a corresponding alias.
It attempts to import a codec module from the encodings package using either
the alias or the normalized name. If the module is found and defines a valid
@code{getregentry()} function that returns a @ref{1ab2,,codecs.CodecInfo} object,
the codec is cached and returned.

If the codec module defines a @code{getaliases()} function any returned aliases
are registered for future use.
@end deffn

@geindex win32_code_page_search_function() (in module encodings)
@anchor{library/codecs encodings win32_code_page_search_function}@anchor{28f3}
@deffn {Function} encodings.win32_code_page_search_function (encoding)

Search for a Windows code page encoding `encoding' of the form @code{cpXXXX}.

If the code page is valid and supported, return a @ref{1ab2,,codecs.CodecInfo}
object for it.

@ref{2181,,Availability}: Windows.


Added in version 3.14.

@end deffn

This module implements the following exception:

@geindex CodecRegistryError
@anchor{library/codecs encodings CodecRegistryError}@anchor{28f4}
@deffn {Exception} encodings.CodecRegistryError

Raised when a codec is invalid or incompatible.
@end deffn

@node encodings idna — Internationalized Domain Names in Applications,encodings mbcs — Windows ANSI codepage,encodings — Encodings package,codecs — Codec registry and base classes
@anchor{library/codecs encodings-idna-internationalized-domain-names-in-applications}@anchor{28f5}@anchor{library/codecs module-encodings idna}@anchor{56}
@subsubsection @code{encodings.idna} — Internationalized Domain Names in Applications


@geindex module; encodings.idna

This module implements 
@geindex RFC; RFC 3490
RFC 3490@footnote{https://datatracker.ietf.org/doc/html/rfc3490.html} (Internationalized Domain Names in
Applications) and 
@geindex RFC; RFC 3492
RFC 3492@footnote{https://datatracker.ietf.org/doc/html/rfc3492.html} (Nameprep: A Stringprep Profile for
Internationalized Domain Names (IDN)). It builds upon the @code{punycode} encoding
and @ref{da,,stringprep}.

If you need the IDNA 2008 standard from 
@geindex RFC; RFC 5891
RFC 5891@footnote{https://datatracker.ietf.org/doc/html/rfc5891.html} and 
@geindex RFC; RFC 5895
RFC 5895@footnote{https://datatracker.ietf.org/doc/html/rfc5895.html}, use the
third-party idna@footnote{https://pypi.org/project/idna/} module.

These RFCs together define a protocol to support non-ASCII characters in domain
names. A domain name containing non-ASCII characters (such as
@code{www.Alliancefrançaise.nu}) is converted into an ASCII-compatible encoding
(ACE, such as @code{www.xn--alliancefranaise-npb.nu}). The ACE form of the domain
name is then used in all places where arbitrary characters are not allowed by
the protocol, such as DNS queries, HTTP @code{Host} fields, and so
on. This conversion is carried out in the application; if possible invisible to
the user: The application should transparently convert Unicode domain labels to
IDNA on the wire, and convert back ACE labels to Unicode before presenting them
to the user.

Python supports this conversion in several ways:  the @code{idna} codec performs
conversion between Unicode and ACE, separating an input string into labels
based on the separator characters defined in 
@geindex RFC; RFC 3490 Section 3.1
section 3.1 of RFC 3490@footnote{https://datatracker.ietf.org/doc/html/rfc3490.html#section-3.1}
and converting each label to ACE as required, and conversely separating an input
byte string into labels based on the @code{.} separator and converting any ACE
labels found into unicode. Furthermore, the @ref{d1,,socket} module
transparently converts Unicode host names to ACE, so that applications need not
be concerned about converting host names themselves when they pass them to the
socket module. On top of that, modules that have host names as function
parameters, such as @ref{73,,http.client} and @ref{62,,ftplib}, accept Unicode host
names (@code{http.client} then also transparently sends an IDNA hostname in the
@code{Host} field if it sends that field at all).

When receiving host names from the wire (such as in reverse name lookup), no
automatic conversion to Unicode is performed: applications wishing to present
such host names to the user should decode them to Unicode.

The module @code{encodings.idna} also implements the nameprep procedure, which
performs certain normalizations on host names, to achieve case-insensitivity of
international domain names, and to unify similar characters. The nameprep
functions can be used directly if desired.

@geindex nameprep() (in module encodings.idna)
@anchor{library/codecs encodings idna nameprep}@anchor{28f6}
@deffn {Function} encodings.idna.nameprep (label)

Return the nameprepped version of `label'. The implementation currently assumes
query strings, so @code{AllowUnassigned} is true.
@end deffn

@geindex ToASCII() (in module encodings.idna)
@anchor{library/codecs encodings idna ToASCII}@anchor{28f7}
@deffn {Function} encodings.idna.ToASCII (label)

Convert a label to ASCII, as specified in 
@geindex RFC; RFC 3490
RFC 3490@footnote{https://datatracker.ietf.org/doc/html/rfc3490.html}. @code{UseSTD3ASCIIRules} is
assumed to be false.
@end deffn

@geindex ToUnicode() (in module encodings.idna)
@anchor{library/codecs encodings idna ToUnicode}@anchor{28f8}
@deffn {Function} encodings.idna.ToUnicode (label)

Convert a label to Unicode, as specified in 
@geindex RFC; RFC 3490
RFC 3490@footnote{https://datatracker.ietf.org/doc/html/rfc3490.html}.
@end deffn

@node encodings mbcs — Windows ANSI codepage,encodings utf_8_sig — UTF-8 codec with BOM signature,encodings idna — Internationalized Domain Names in Applications,codecs — Codec registry and base classes
@anchor{library/codecs encodings-mbcs-windows-ansi-codepage}@anchor{28f9}@anchor{library/codecs module-encodings mbcs}@anchor{57}
@subsubsection @code{encodings.mbcs} — Windows ANSI codepage


@geindex module; encodings.mbcs

This module implements the ANSI codepage (CP_ACP).

@ref{2181,,Availability}: Windows.


Changed in version 3.2: Before 3.2, the `errors' argument was ignored; @code{'replace'} was always used
to encode, and @code{'ignore'} to decode.



Changed in version 3.3: Support any error handler.


@node encodings utf_8_sig — UTF-8 codec with BOM signature,,encodings mbcs — Windows ANSI codepage,codecs — Codec registry and base classes
@anchor{library/codecs encodings-utf-8-sig-utf-8-codec-with-bom-signature}@anchor{28fa}@anchor{library/codecs module-encodings utf_8_sig}@anchor{58}
@subsubsection @code{encodings.utf_8_sig} — UTF-8 codec with BOM signature


@geindex module; encodings.utf_8_sig

This module implements a variant of the UTF-8 codec. On encoding, a UTF-8 encoded
BOM will be prepended to the UTF-8 encoded bytes. For the stateful encoder this
is only done once (on the first write to the byte stream). On decoding, an
optional UTF-8 encoded BOM at the start of the data will be skipped.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Data Types,Numeric and Mathematical Modules,Binary Data Services,The Python Standard Library
@anchor{library/datatypes doc}@anchor{28fb}@anchor{library/datatypes data-types}@anchor{28fc}@anchor{library/datatypes datatypes}@anchor{28fd}@anchor{library/datatypes translation-repo}@anchor{28fe}
@section Data Types


The modules described in this chapter provide a variety of specialized data
types such as dates and times, fixed-type arrays, heap queues, double-ended
queues, and enumerations.

Python also provides some built-in data types, in particular,
@ref{184,,dict}, @ref{24f,,list}, @ref{185,,set} and @ref{7f3,,frozenset}, and
@ref{614,,tuple}.  The @ref{16a,,str} class is used to hold
Unicode strings, and the @ref{193,,bytes} and @ref{342,,bytearray} classes are used
to hold binary data.

The following modules are documented in this chapter:

@menu
* datetime — Basic date and time types:: 
* zoneinfo — IANA time zone support:: 
* calendar — General calendar-related functions:: 
* collections — Container datatypes:: 
* collections.abc — Abstract Base Classes for Containers: collections abc — Abstract Base Classes for Containers. 
* heapq — Heap queue algorithm:: 
* bisect — Array bisection algorithm:: 
* array — Efficient arrays of numeric values:: 
* weakref — Weak references:: 
* types — Dynamic type creation and names for built-in types:: 
* copy — Shallow and deep copy operations:: 
* pprint — Data pretty printer:: 
* reprlib — Alternate repr() implementation: reprlib — Alternate repr implementation. 
* enum — Support for enumerations:: 
* graphlib — Functionality to operate with graph-like structures:: 

@end menu

@node datetime — Basic date and time types,zoneinfo — IANA time zone support,,Data Types
@anchor{library/datetime doc}@anchor{28ff}@anchor{library/datetime datetime-basic-date-and-time-types}@anchor{2900}@anchor{library/datetime module-datetime}@anchor{34}
@subsection @code{datetime} — Basic date and time types


@geindex module; datetime

`Source code:' Lib/datetime.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/datetime.py}


__________________________________________________________________


The @code{datetime} module supplies classes for manipulating dates and times.

While date and time arithmetic is supported, the focus of the implementation is
on efficient attribute extraction for output formatting and manipulation.

@cartouche
@quotation Tip 
Skip to @ref{2901,,the format codes}.
@end quotation
@end cartouche


@subsubheading See also



@table @asis

@item Module @ref{15,,calendar}

General calendar related functions.

@item Module @ref{f4,,time}

Time access and conversions.

@item Module @ref{13b,,zoneinfo}

Concrete time zones representing the IANA time zone database.

@item Package dateutil@footnote{https://dateutil.readthedocs.io/en/stable/}

Third-party library with expanded time zone and parsing support.

@item Package DateType@footnote{https://pypi.org/project/DateType/}

Third-party library that introduces distinct static types to for example,
allow @ref{574,,static type checkers}
to differentiate between naive and aware datetimes.
@end table


@menu
* Aware and naive objects:: 
* Constants:: 
* Available types:: 
* timedelta objects:: 
* date objects:: 
* datetime objects:: 
* time objects:: 
* tzinfo objects:: 
* timezone objects:: 
* strftime() and strptime() behavior: strftime and strptime behavior. 

@end menu

@node Aware and naive objects,Constants,,datetime — Basic date and time types
@anchor{library/datetime aware-and-naive-objects}@anchor{2902}@anchor{library/datetime datetime-naive-aware}@anchor{2903}
@subsubsection Aware and naive objects


Date and time objects may be categorized as “aware” or “naive” depending on
whether or not they include time zone information.

With sufficient knowledge of applicable algorithmic and political time
adjustments, such as time zone and daylight saving time information,
an `aware' object can locate itself relative to other aware objects.
An aware object represents a specific moment in time that is not open to
interpretation. @footnote{
If, that is, we ignore the effects of relativity.
}

A `naive' object does not contain enough information to unambiguously locate
itself relative to other date/time objects. Whether a naive object represents
Coordinated Universal Time (UTC), local time, or time in some other time zone is
purely up to the program, just like it is up to the program whether a
particular number represents metres, miles, or mass. Naive objects are easy to
understand and to work with, at the cost of ignoring some aspects of reality.

For applications requiring aware objects, @ref{4e3,,datetime} and @ref{1fd,,time}
objects have an optional time zone information attribute, @code{tzinfo}, that
can be set to an instance of a subclass of the abstract @code{tzinfo} class.
These @ref{7f7,,tzinfo} objects capture information about the offset from UTC
time, the time zone name, and whether daylight saving time is in effect.

Only one concrete @ref{7f7,,tzinfo} class, the @ref{12cb,,timezone} class, is
supplied by the @code{datetime} module. The @code{timezone} class can
represent simple time zones with fixed offsets from UTC, such as UTC itself or
North American EST and EDT time zones. Supporting time zones at deeper levels of
detail is up to the application. The rules for time adjustment across the
world are more political than rational, change frequently, and there is no
standard suitable for every application aside from UTC.

@node Constants,Available types,Aware and naive objects,datetime — Basic date and time types
@anchor{library/datetime constants}@anchor{2904}
@subsubsection Constants


The @code{datetime} module exports the following constants:

@geindex MINYEAR (in module datetime)
@anchor{library/datetime datetime MINYEAR}@anchor{2905}
@deffn {Data} datetime.MINYEAR

The smallest year number allowed in a @ref{1fc,,date} or @ref{4e3,,datetime} object.
@ref{2905,,MINYEAR} is 1.
@end deffn

@geindex MAXYEAR (in module datetime)
@anchor{library/datetime datetime MAXYEAR}@anchor{2906}
@deffn {Data} datetime.MAXYEAR

The largest year number allowed in a @ref{1fc,,date} or @ref{4e3,,datetime} object.
@ref{2906,,MAXYEAR} is 9999.
@end deffn

@geindex UTC (in module datetime)
@anchor{library/datetime datetime UTC}@anchor{714}
@deffn {Data} datetime.UTC

Alias for the UTC time zone singleton @ref{828,,datetime.timezone.utc}.


Added in version 3.11.

@end deffn

@node Available types,timedelta objects,Constants,datetime — Basic date and time types
@anchor{library/datetime available-types}@anchor{2907}
@subsubsection Available types



@deffn {Class} datetime.date

An idealized naive date, assuming the current Gregorian calendar always was, and
always will be, in effect. Attributes: @ref{2908,,year}, @ref{2909,,month}, and
@ref{290a,,day}.
@end deffn


@deffn {Class} datetime.time

An idealized time, independent of any particular day, assuming that every day
has exactly 24*60*60 seconds.  (There is no notion of “leap seconds” here.)
Attributes: @ref{290b,,hour}, @ref{290c,,minute}, @ref{290d,,second}, @ref{290e,,microsecond},
and @ref{290f,,tzinfo}.
@end deffn


@deffn {Class} datetime.datetime

A combination of a date and a time. Attributes: @ref{2910,,year}, @ref{2911,,month},
@ref{2912,,day}, @ref{2913,,hour}, @ref{2914,,minute}, @ref{2915,,second}, @ref{2916,,microsecond},
and @ref{2917,,tzinfo}.
@end deffn


@deffn {Class} datetime.timedelta

A duration expressing the difference between two @ref{4e3,,datetime}
or @ref{1fc,,date} instances to microsecond resolution.
@end deffn


@deffn {Class} datetime.tzinfo

An abstract base class for time zone information objects. These are used by the
@ref{4e3,,datetime} and @ref{1fd,,time} classes to provide a customizable notion of
time adjustment (for example, to account for time zone and/or daylight saving
time).
@end deffn


@deffn {Class} datetime.timezone

A class that implements the @ref{7f7,,tzinfo} abstract base class as a
fixed offset from the UTC.


Added in version 3.2.

@end deffn

Objects of these types are immutable.

Subclass relationships:


@float Figure

@image{python-figures/datetime-inheritance,,,timedelta@comma{} tzinfo@comma{} time@comma{} and date inherit from object; timezone inherits from tzinfo; and datetime inherits from date.,svg}

@end float


@menu
* Common properties:: 
* Determining if an object is aware or naive:: 

@end menu

@node Common properties,Determining if an object is aware or naive,,Available types
@anchor{library/datetime common-properties}@anchor{2918}
@subsubsection Common properties


The @ref{1fc,,date}, @ref{4e3,,datetime}, @ref{1fd,,time}, and @ref{12cb,,timezone} types
share these common features:


@itemize -

@item 
Objects of these types are immutable.

@item 
Objects of these types are @ref{825,,hashable}, meaning that they can be used as
dictionary keys.

@item 
Objects of these types support efficient pickling via the @ref{ab,,pickle} module.
@end itemize

@node Determining if an object is aware or naive,,Common properties,Available types
@anchor{library/datetime determining-if-an-object-is-aware-or-naive}@anchor{2919}
@subsubsection Determining if an object is aware or naive


Objects of the @ref{1fc,,date} type are always naive.

An object of type @ref{1fd,,time} or @ref{4e3,,datetime} may be aware or naive.

A @ref{4e3,,datetime} object @code{d} is aware if both of the following hold:


@enumerate 

@item 
@code{d.tzinfo} is not @code{None}

@item 
@code{d.tzinfo.utcoffset(d)} does not return @code{None}
@end enumerate

Otherwise, @code{d} is naive.

A @ref{1fd,,time} object @code{t} is aware if both of the following hold:


@enumerate 

@item 
@code{t.tzinfo} is not @code{None}

@item 
@code{t.tzinfo.utcoffset(None)} does not return @code{None}.
@end enumerate

Otherwise, @code{t} is naive.

The distinction between aware and naive doesn’t apply to @ref{bc9,,timedelta}
objects.

@node timedelta objects,date objects,Available types,datetime — Basic date and time types
@anchor{library/datetime datetime-timedelta}@anchor{291a}@anchor{library/datetime timedelta-objects}@anchor{291b}
@subsubsection @code{timedelta} objects


A @ref{bc9,,timedelta} object represents a duration, the difference between two
@ref{4e3,,datetime} or @ref{1fc,,date} instances.

@geindex timedelta (class in datetime)
@anchor{library/datetime datetime timedelta}@anchor{bc9}
@deffn {Class} datetime.timedelta (days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)

All arguments are optional and default to 0. Arguments may be integers
or floats, and may be positive or negative.

Only `days', `seconds' and `microseconds' are stored internally.
Arguments are converted to those units:


@itemize *

@item 
A millisecond is converted to 1000 microseconds.

@item 
A minute is converted to 60 seconds.

@item 
An hour is converted to 3600 seconds.

@item 
A week is converted to 7 days.
@end itemize

and days, seconds and microseconds are then normalized so that the
representation is unique, with


@itemize *

@item 
@code{0 <= microseconds < 1000000}

@item 
@code{0 <= seconds < 3600*24} (the number of seconds in one day)

@item 
@code{-999999999 <= days <= 999999999}
@end itemize

The following example illustrates how any arguments besides
`days', `seconds' and `microseconds' are “merged” and normalized into those
three resulting attributes:

@example
>>> import datetime as dt
>>> delta = dt.timedelta(
...     days=50,
...     seconds=27,
...     microseconds=10,
...     milliseconds=29000,
...     minutes=5,
...     hours=8,
...     weeks=2
... )
>>> # Only days, seconds, and microseconds remain
>>> delta
datetime.timedelta(days=64, seconds=29156, microseconds=10)
@end example

@cartouche
@quotation Tip 
@code{import datetime as dt} instead of @code{import datetime} or
@code{from datetime import datetime} to avoid confusion between the module
and the class. See How I Import Python’s datetime Module@footnote{https://adamj.eu/tech/2019/09/12/how-i-import-pythons-datetime-module/}.
@end quotation
@end cartouche

If any argument is a float and there are fractional microseconds,
the fractional microseconds left over from all arguments are
combined and their sum is rounded to the nearest microsecond using
round-half-to-even tiebreaker. If no argument is a float, the
conversion and normalization processes are exact (no information is
lost).

If the normalized value of days lies outside the indicated range,
@ref{a87,,OverflowError} is raised.

Note that normalization of negative values may be surprising at first. For
example:

@example
>>> import datetime as dt
>>> d = dt.timedelta(microseconds=-1)
>>> (d.days, d.seconds, d.microseconds)
(-1, 86399, 999999)
@end example

Since the string representation of @code{timedelta} objects can be confusing,
use the following recipe to produce a more readable format:

@example
>>> def pretty_timedelta(td):
...     if td.days >= 0:
...         return str(td)
...     return f'-(@{-td!s@})'
...
>>> d = timedelta(hours=-1)
>>> str(d)  # not human-friendly
'-1 day, 23:00:00'
>>> pretty_timedelta(d)
'-(1:00:00)'
@end example
@end deffn

Class attributes:

@geindex min (datetime.timedelta attribute)
@anchor{library/datetime datetime timedelta min}@anchor{291c}
@deffn {Attribute} timedelta.min

The most negative @ref{bc9,,timedelta} object, @code{timedelta(-999999999)}.
@end deffn

@geindex max (datetime.timedelta attribute)
@anchor{library/datetime datetime timedelta max}@anchor{291d}
@deffn {Attribute} timedelta.max

The most positive @ref{bc9,,timedelta} object, @code{timedelta(days=999999999,
hours=23, minutes=59, seconds=59, microseconds=999999)}.
@end deffn

@geindex resolution (datetime.timedelta attribute)
@anchor{library/datetime datetime timedelta resolution}@anchor{291e}
@deffn {Attribute} timedelta.resolution

The smallest possible difference between non-equal @ref{bc9,,timedelta} objects,
@code{timedelta(microseconds=1)}.
@end deffn

Note that, because of normalization, @code{timedelta.max} is greater than @code{-timedelta.min}.
@code{-timedelta.max} is not representable as a @ref{bc9,,timedelta} object.

Instance attributes (read-only):

@geindex days (datetime.timedelta attribute)
@anchor{library/datetime datetime timedelta days}@anchor{291f}
@deffn {Attribute} timedelta.days

Between -999,999,999 and 999,999,999 inclusive.
@end deffn

@geindex seconds (datetime.timedelta attribute)
@anchor{library/datetime datetime timedelta seconds}@anchor{2920}
@deffn {Attribute} timedelta.seconds

Between 0 and 86,399 inclusive.

@cartouche
@quotation Caution 
It is a somewhat common bug for code to unintentionally use this attribute
when it is actually intended to get a @ref{1511,,total_seconds()}
value instead:

@example
>>> import datetime as dt
>>> duration = dt.timedelta(seconds=11235813)
>>> duration.days, duration.seconds
(130, 3813)
>>> duration.total_seconds()
11235813.0
@end example
@end quotation
@end cartouche
@end deffn

@geindex microseconds (datetime.timedelta attribute)
@anchor{library/datetime datetime timedelta microseconds}@anchor{2921}
@deffn {Attribute} timedelta.microseconds

Between 0 and 999,999 inclusive.
@end deffn

Supported operations:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Operation

@tab

Result

@item

@code{t1 = t2 + t3}

@tab

Sum of @code{t2} and @code{t3}.
Afterwards @code{t1 - t2 == t3} and
@code{t1 - t3 == t2} are true. (1)

@item

@code{t1 = t2 - t3}

@tab

Difference of @code{t2}  and @code{t3}. Afterwards
@code{t1 == t2 - t3} and @code{t2 == t1 + t3} are
true. (1)(6)

@item

@code{t1 = t2 * i or t1 = i * t2}

@tab

Delta multiplied by an integer.
Afterwards @code{t1 // i == t2} is true,
provided @code{i != 0}.

@item

@tab

In general, @code{t1  * i == t1 * (i-1) + t1}
is true. (1)

@item

@code{t1 = t2 * f or t1 = f * t2}

@tab

Delta multiplied by a float. The result is
rounded to the nearest multiple of
timedelta.resolution using round-half-to-even.

@item

@code{f = t2 / t3}

@tab

Division (3) of overall duration @code{t2} by
interval unit @code{t3}. Returns a @ref{197,,float}
object.

@item

@code{t1 = t2 / f or t1 = t2 / i}

@tab

Delta divided by a float or an int. The result
is rounded to the nearest multiple of
timedelta.resolution using round-half-to-even.

@item

@code{t1 = t2 // i} or
@code{t1 = t2 // t3}

@tab

The floor is computed and the remainder (if
any) is thrown away. In the second case, an
integer is returned. (3)

@item

@code{t1 = t2 % t3}

@tab

The remainder is computed as a
@ref{bc9,,timedelta} object. (3)

@item

@code{q, r = divmod(t1, t2)}

@tab

Computes the quotient and the remainder:
@code{q = t1 // t2} (3) and @code{r = t1 % t2}.
@code{q} is an integer and @code{r} is a
@ref{bc9,,timedelta} object.

@item

@code{+t1}

@tab

Returns a @ref{bc9,,timedelta} object with the
same value. (2)

@item

@code{-t1}

@tab

Equivalent to @code{timedelta(-t1.days,
-t1.seconds, -t1.microseconds)},
and to @code{t1 * -1}. (1)(4)

@item

@code{abs(t)}

@tab

Equivalent to @code{+t} when @code{t.days >= 0},
and to @code{-t} when @code{t.days < 0}. (2)

@item

@code{str(t)}

@tab

Returns a string in the form
@code{[D day[s], ][H]H:MM:SS[.UUUUUU]}, where D
is negative for negative @code{t}. (5)

@item

@code{repr(t)}

@tab

Returns a string representation of the
@ref{bc9,,timedelta} object as a constructor
call with canonical attribute values.

@end multitable


Notes:


@enumerate 

@item 
This is exact but may overflow.

@item 
This is exact and cannot overflow.

@item 
Division by zero raises @ref{b45,,ZeroDivisionError}.

@item 
@code{-timedelta.max} is not representable as a @ref{bc9,,timedelta} object.

@item 
String representations of @ref{bc9,,timedelta} objects are normalized
similarly to their internal representation. This leads to somewhat
unusual results for negative timedeltas. For example:

@example
>>> timedelta(hours=-5)
datetime.timedelta(days=-1, seconds=68400)
>>> print(_)
-1 day, 19:00:00
@end example

@item 
The expression @code{t2 - t3} will always be equal to the expression @code{t2 + (-t3)} except
when t3 is equal to @code{timedelta.max}; in that case the former will produce a result
while the latter will overflow.
@end enumerate

In addition to the operations listed above, @ref{bc9,,timedelta} objects support
certain additions and subtractions with @ref{1fc,,date} and @ref{4e3,,datetime}
objects (see below).


Changed in version 3.2: Floor division and true division of a @ref{bc9,,timedelta} object by another
@code{timedelta} object are now supported, as are remainder operations and
the @ref{b9f,,divmod()} function. True division and multiplication of a
@code{timedelta} object by a @ref{197,,float} object are now supported.


@ref{bc9,,timedelta} objects support equality and order comparisons.

In Boolean contexts, a @ref{bc9,,timedelta} object is
considered to be true if and only if it isn’t equal to @code{timedelta(0)}.

Instance methods:

@geindex total_seconds() (datetime.timedelta method)
@anchor{library/datetime datetime timedelta total_seconds}@anchor{1511}
@deffn {Method} timedelta.total_seconds ()

Return the total number of seconds contained in the duration. Equivalent to
@code{td / timedelta(seconds=1)}. For interval units other than seconds, use the
division form directly (for example, @code{td / timedelta(microseconds=1)}).

Note that for very large time intervals (greater than 270 years on
most platforms) this method will lose microsecond accuracy.


Added in version 3.2.

@end deffn

@menu
* Examples of usage; timedelta: Examples of usage timedelta. 

@end menu

@node Examples of usage timedelta,,,timedelta objects
@anchor{library/datetime examples-of-usage-timedelta}@anchor{2922}
@subsubsection Examples of usage: @code{timedelta}


An additional example of normalization:

@example
>>> # Components of another_year add up to exactly 365 days
>>> import datetime as dt
>>> year = dt.timedelta(days=365)
>>> another_year = dt.timedelta(weeks=40, days=84, hours=23,
...                             minutes=50, seconds=600)
>>> year == another_year
True
>>> year.total_seconds()
31536000.0
@end example

Examples of @ref{bc9,,timedelta} arithmetic:

@example
>>> import datetime as dt
>>> year = dt.timedelta(days=365)
>>> ten_years = 10 * year
>>> ten_years
datetime.timedelta(days=3650)
>>> ten_years.days // 365
10
>>> nine_years = ten_years - year
>>> nine_years
datetime.timedelta(days=3285)
>>> three_years = nine_years // 3
>>> three_years, three_years.days // 365
(datetime.timedelta(days=1095), 3)
@end example

@node date objects,datetime objects,timedelta objects,datetime — Basic date and time types
@anchor{library/datetime date-objects}@anchor{2923}@anchor{library/datetime datetime-date}@anchor{2924}
@subsubsection @code{date} objects


A @ref{1fc,,date} object represents a date (year, month and day) in an idealized
calendar, the current Gregorian calendar indefinitely extended in both
directions.

January 1 of year 1 is called day number 1, January 2 of year 1 is
called day number 2, and so on. @footnote{
This matches the definition of the “proleptic Gregorian” calendar in
Dershowitz and Reingold’s book `Calendrical Calculations',
where it’s the base calendar for all computations. See the book for
algorithms for converting between proleptic Gregorian ordinals and
many other calendar systems.
}

@geindex date (class in datetime)
@anchor{library/datetime datetime date}@anchor{1fc}
@deffn {Class} datetime.date (year, month, day)

All arguments are required. Arguments must be integers, in the following
ranges:


@itemize *

@item 
@code{MINYEAR <= year <= MAXYEAR}

@item 
@code{1 <= month <= 12}

@item 
@code{1 <= day <= number of days in the given month and year}
@end itemize

If an argument outside those ranges is given, @ref{2ee,,ValueError} is raised.
@end deffn

Other constructors, all class methods:

@geindex today() (datetime.date class method)
@anchor{library/datetime datetime date today}@anchor{16d6}
@deffn {Method} classmethod date.today ()

Return the current local date.

This is equivalent to @code{date.fromtimestamp(time.time())}.
@end deffn

@geindex fromtimestamp() (datetime.date class method)
@anchor{library/datetime datetime date fromtimestamp}@anchor{dd3}
@deffn {Method} classmethod date.fromtimestamp (timestamp)

Return the local date corresponding to the POSIX `timestamp', such as is
returned by @ref{55d,,time.time()}.

This may raise @ref{a87,,OverflowError}, if the timestamp is out
of the range of values supported by the platform C @code{localtime()}
function, and @ref{2c2,,OSError} on @code{localtime()} failure.
It’s common for this to be restricted to years from 1970 through 2038. Note
that on non-POSIX systems that include leap seconds in their notion of a
timestamp, leap seconds are ignored by @code{fromtimestamp()}.


Changed in version 3.3: Raise @ref{a87,,OverflowError} instead of @ref{2ee,,ValueError} if the timestamp
is out of the range of values supported by the platform C
@code{localtime()} function. Raise @ref{2c2,,OSError} instead of
@code{ValueError} on @code{localtime()} failure.

@end deffn

@geindex fromordinal() (datetime.date class method)
@anchor{library/datetime datetime date fromordinal}@anchor{dd2}
@deffn {Method} classmethod date.fromordinal (ordinal)

Return the date corresponding to the proleptic Gregorian `ordinal', where
January 1 of year 1 has ordinal 1.

@ref{2ee,,ValueError} is raised unless @code{1 <= ordinal <=
date.max.toordinal()}. For any date @code{d},
@code{date.fromordinal(d.toordinal()) == d}.
@end deffn

@geindex fromisoformat() (datetime.date class method)
@anchor{library/datetime datetime date fromisoformat}@anchor{829}
@deffn {Method} classmethod date.fromisoformat (date_string)

Return a @ref{1fc,,date} corresponding to a `date_string' given in any valid
ISO 8601 format, with the following exceptions:


@enumerate 

@item 
Reduced precision dates are not currently supported (@code{YYYY-MM},
@code{YYYY}).

@item 
Extended date representations are not currently supported
(@code{±YYYYYY-MM-DD}).

@item 
Ordinal dates are not currently supported (@code{YYYY-OOO}).
@end enumerate

Examples:

@example
>>> import datetime as dt
>>> dt.date.fromisoformat('2019-12-04')
datetime.date(2019, 12, 4)
>>> dt.date.fromisoformat('20191204')
datetime.date(2019, 12, 4)
>>> dt.date.fromisoformat('2021-W01-1')
datetime.date(2021, 1, 4)
@end example


Added in version 3.7.



Changed in version 3.11: Previously, this method only supported the format @code{YYYY-MM-DD}.

@end deffn

@geindex fromisocalendar() (datetime.date class method)
@anchor{library/datetime datetime date fromisocalendar}@anchor{be5}
@deffn {Method} classmethod date.fromisocalendar (year, week, day)

Return a @ref{1fc,,date} corresponding to the ISO calendar date specified by
`year', `week' and `day'. This is the inverse of the function @ref{af7,,date.isocalendar()}.


Added in version 3.8.

@end deffn

@geindex strptime() (datetime.date class method)
@anchor{library/datetime datetime date strptime}@anchor{1fb}
@deffn {Method} classmethod date.strptime (date_string, format)

Return a @ref{1fc,,date} corresponding to `date_string', parsed according to
`format'. This is equivalent to:

@example
date(*(time.strptime(date_string, format)[0:3]))
@end example

@ref{2ee,,ValueError} is raised if the date_string and format
can’t be parsed by @ref{1639,,time.strptime()} or if it returns a value which isn’t a
time tuple.  See also @ref{1b98,,strftime() and strptime() behavior} and
@ref{829,,date.fromisoformat()}.

@cartouche
@quotation Note 
If `format' specifies a day of month without a year a
@ref{1a4,,DeprecationWarning} is emitted.  This is to avoid a quadrennial
leap year bug in code seeking to parse only a month and day as the
default year used in absence of one in the format is not a leap year.
Such `format' values may raise an error as of Python 3.15.  The
workaround is to always include a year in your `format'.  If parsing
`date_string' values that do not have a year, explicitly add a year that
is a leap year before parsing:

@example
>>> import datetime as dt
>>> date_string = "02/29"
>>> when = dt.date.strptime(f"@{date_string@};1984", "%m/%d;%Y")  # Avoids leap year bug.
>>> when.strftime("%B %d")
'February 29'
@end example
@end quotation
@end cartouche


Added in version 3.14.

@end deffn

Class attributes:

@geindex min (datetime.date attribute)
@anchor{library/datetime datetime date min}@anchor{2925}
@deffn {Attribute} date.min

The earliest representable date, @code{date(MINYEAR, 1, 1)}.
@end deffn

@geindex max (datetime.date attribute)
@anchor{library/datetime datetime date max}@anchor{2926}
@deffn {Attribute} date.max

The latest representable date, @code{date(MAXYEAR, 12, 31)}.
@end deffn

@geindex resolution (datetime.date attribute)
@anchor{library/datetime datetime date resolution}@anchor{2927}
@deffn {Attribute} date.resolution

The smallest possible difference between non-equal date objects,
@code{timedelta(days=1)}.
@end deffn

Instance attributes (read-only):

@geindex year (datetime.date attribute)
@anchor{library/datetime datetime date year}@anchor{2908}
@deffn {Attribute} date.year

Between @ref{2905,,MINYEAR} and @ref{2906,,MAXYEAR} inclusive.
@end deffn

@geindex month (datetime.date attribute)
@anchor{library/datetime datetime date month}@anchor{2909}
@deffn {Attribute} date.month

Between 1 and 12 inclusive.
@end deffn

@geindex day (datetime.date attribute)
@anchor{library/datetime datetime date day}@anchor{290a}
@deffn {Attribute} date.day

Between 1 and the number of days in the given month of the given year.
@end deffn

Supported operations:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Operation

@tab

Result

@item

@code{date2 = date1 + timedelta}

@tab

@code{date2} will be @code{timedelta.days} days
after @code{date1}. (1)

@item

@code{date2 = date1 - timedelta}

@tab

Computes @code{date2} such that @code{date2 +
timedelta == date1}. (2)

@item

@code{timedelta = date1 - date2}

@tab

(3)

@item


@display
@code{date1 == date2}@w{ }
@code{date1 != date2}@w{ }
@end display



@tab

Equality comparison. (4)

@item


@display
@code{date1 < date2}@w{ }
@code{date1 > date2}@w{ }
@code{date1 <= date2}@w{ }
@code{date1 >= date2}@w{ }
@end display



@tab

Order comparison. (5)

@end multitable


Notes:


@enumerate 

@item 
`date2' is moved forward in time if @code{timedelta.days > 0}, or backward if
@code{timedelta.days < 0}. Afterward @code{date2 - date1 == timedelta.days}.
@code{timedelta.seconds} and @code{timedelta.microseconds} are ignored.
@ref{a87,,OverflowError} is raised if @code{date2.year} would be smaller than
@ref{2905,,MINYEAR} or larger than @ref{2906,,MAXYEAR}.

@item 
@code{timedelta.seconds} and @code{timedelta.microseconds} are ignored.

@item 
This is exact, and cannot overflow. @code{timedelta.seconds} and
@code{timedelta.microseconds} are 0, and @code{date2 + timedelta == date1} after.

@item 
@ref{1fc,,date} objects are equal if they represent the same date.

@code{date} objects that are not also @ref{4e3,,datetime} instances
are never equal to @code{datetime} objects, even if they represent
the same date.

@item 
`date1' is considered less than `date2' when `date1' precedes `date2' in time.
In other words, @code{date1 < date2} if and only if @code{date1.toordinal() <
date2.toordinal()}.

Order comparison between a @ref{1fc,,date} object that is not also a
@ref{4e3,,datetime} instance and a @code{datetime} object raises
@ref{199,,TypeError}.
@end enumerate


Changed in version 3.13: Comparison between @ref{4e3,,datetime} object and an instance of
the @ref{1fc,,date} subclass that is not a @code{datetime} subclass
no longer converts the latter to @code{date}, ignoring the time part
and the time zone.
The default behavior can be changed by overriding the special comparison
methods in subclasses.


In Boolean contexts, all @ref{1fc,,date} objects are considered to be true.

Instance methods:

@geindex replace() (datetime.date method)
@anchor{library/datetime datetime date replace}@anchor{1a40}
@deffn {Method} date.replace (year=self.year, month=self.month, day=self.day)

Return a new @ref{1fc,,date} object with the same values, but with specified
parameters updated.

Example:

@example
>>> import datetime as dt
>>> d = dt.date(2002, 12, 31)
>>> d.replace(day=26)
datetime.date(2002, 12, 26)
@end example

The generic function @ref{1c2,,copy.replace()} also supports @ref{1fc,,date}
objects.
@end deffn

@geindex timetuple() (datetime.date method)
@anchor{library/datetime datetime date timetuple}@anchor{2928}
@deffn {Method} date.timetuple ()

Return a @ref{eec,,time.struct_time} such as returned by @ref{1705,,time.localtime()}.

The hours, minutes and seconds are 0, and the DST flag is -1.

@code{d.timetuple()} is equivalent to:

@example
time.struct_time((d.year, d.month, d.day, 0, 0, 0, d.weekday(), yday, -1))
@end example

where @code{yday = d.toordinal() - date(d.year, 1, 1).toordinal() + 1}
is the day number within the current year starting with 1 for January 1st.
@end deffn

@geindex toordinal() (datetime.date method)
@anchor{library/datetime datetime date toordinal}@anchor{2929}
@deffn {Method} date.toordinal ()

Return the proleptic Gregorian ordinal of the date, where January 1 of year 1
has ordinal 1. For any @ref{1fc,,date} object @code{d},
@code{date.fromordinal(d.toordinal()) == d}.
@end deffn

@geindex weekday() (datetime.date method)
@anchor{library/datetime datetime date weekday}@anchor{292a}
@deffn {Method} date.weekday ()

Return the day of the week as an integer, where Monday is 0 and Sunday is 6.
For example, @code{date(2002, 12, 4).weekday() == 2}, a Wednesday. See also
@ref{292b,,isoweekday()}.
@end deffn

@geindex isoweekday() (datetime.date method)
@anchor{library/datetime datetime date isoweekday}@anchor{292b}
@deffn {Method} date.isoweekday ()

Return the day of the week as an integer, where Monday is 1 and Sunday is 7.
For example, @code{date(2002, 12, 4).isoweekday() == 3}, a Wednesday. See also
@ref{292a,,weekday()}, @ref{af7,,isocalendar()}.
@end deffn

@geindex isocalendar() (datetime.date method)
@anchor{library/datetime datetime date isocalendar}@anchor{af7}
@deffn {Method} date.isocalendar ()

Return a @ref{85f,,named tuple} object with three components: @code{year},
@code{week} and @code{weekday}.

The ISO calendar is a widely used variant of the Gregorian calendar. @footnote{
See R. H. van Gent’s @uref{https://web.archive.org/web/20220531051136/https://webspace.science.uu.nl/~gent0113/calendar/isocalendar.htm,guide to the mathematics of the ISO 8601 calendar}
for a good explanation.
}

The ISO year consists of 52 or 53 full weeks, and where a week starts on a
Monday and ends on a Sunday. The first week of an ISO year is the first
(Gregorian) calendar week of a year containing a Thursday. This is called week
number 1, and the ISO year of that Thursday is the same as its Gregorian year.

For example, 2004 begins on a Thursday, so the first week of ISO year 2004
begins on Monday, 29 Dec 2003 and ends on Sunday, 4 Jan 2004:

@example
>>> import datetime as dt
>>> dt.date(2003, 12, 29).isocalendar()
datetime.IsoCalendarDate(year=2004, week=1, weekday=1)
>>> dt.date(2004, 1, 4).isocalendar()
datetime.IsoCalendarDate(year=2004, week=1, weekday=7)
@end example


Changed in version 3.9: Result changed from a tuple to a @ref{85f,,named tuple}.

@end deffn

@geindex isoformat() (datetime.date method)
@anchor{library/datetime datetime date isoformat}@anchor{292c}
@deffn {Method} date.isoformat ()

Return a string representing the date in ISO 8601 format, @code{YYYY-MM-DD}:

@example
>>> import datetime as dt
>>> dt.date(2002, 12, 4).isoformat()
'2002-12-04'
@end example
@end deffn

@geindex __str__() (datetime.date method)
@anchor{library/datetime datetime date __str__}@anchor{292d}
@deffn {Method} date.__str__ ()

For a date @code{d}, @code{str(d)} is equivalent to @code{d.isoformat()}.
@end deffn

@geindex ctime() (datetime.date method)
@anchor{library/datetime datetime date ctime}@anchor{292e}
@deffn {Method} date.ctime ()

Return a string representing the date:

@example
>>> import datetime as dt
>>> dt.date(2002, 12, 4).ctime()
'Wed Dec  4 00:00:00 2002'
@end example

@code{d.ctime()} is equivalent to:

@example
time.ctime(time.mktime(d.timetuple()))
@end example

on platforms where the native C
@code{ctime()} function (which @ref{292f,,time.ctime()} invokes, but which
@code{date.ctime()} does not invoke) conforms to the C standard.
@end deffn

@geindex strftime() (datetime.date method)
@anchor{library/datetime datetime date strftime}@anchor{e95}
@deffn {Method} date.strftime (format)

Return a string representing the date, controlled by an explicit format string.
Format codes referring to hours, minutes or seconds will see 0 values.
See also @ref{1b98,,strftime() and strptime() behavior} and @ref{292c,,date.isoformat()}.
@end deffn

@geindex __format__() (datetime.date method)
@anchor{library/datetime datetime date __format__}@anchor{2930}
@deffn {Method} date.__format__ (format)

Same as @ref{e95,,date.strftime()}. This makes it possible to specify a format
string for a @ref{1fc,,date} object in @ref{19b,,formatted string literals} and when using @ref{834,,str.format()}.
See also @ref{1b98,,strftime() and strptime() behavior} and @ref{292c,,date.isoformat()}.
@end deffn

@menu
* Examples of usage; date: Examples of usage date. 

@end menu

@node Examples of usage date,,,date objects
@anchor{library/datetime examples-of-usage-date}@anchor{2931}
@subsubsection Examples of usage: @code{date}


Example of counting days to an event:

@example
>>> import time
>>> import datetime as dt
>>> today = dt.date.today()
>>> today
datetime.date(2007, 12, 5)
>>> today == dt.date.fromtimestamp(time.time())
True
>>> my_birthday = dt.date(today.year, 6, 24)
>>> if my_birthday < today:
...     my_birthday = my_birthday.replace(year=today.year + 1)
...
>>> my_birthday
datetime.date(2008, 6, 24)
>>> time_to_birthday = abs(my_birthday - today)
>>> time_to_birthday.days
202
@end example

More examples of working with @ref{1fc,,date}:

@example
>>> import datetime as dt
>>> d = dt.date.fromordinal(730920) # 730920th day after 1. 1. 0001
>>> d
datetime.date(2002, 3, 11)

>>> # Methods related to formatting string output
>>> d.isoformat()
'2002-03-11'
>>> d.strftime("%d/%m/%y")
'11/03/02'
>>> d.strftime("%A %d. %B %Y")
'Monday 11. March 2002'
>>> d.ctime()
'Mon Mar 11 00:00:00 2002'
>>> 'The @{1@} is @{0:%d@}, the @{2@} is @{0:%B@}.'.format(d, "day", "month")
'The day is 11, the month is March.'

>>> # Methods for extracting 'components' under different calendars
>>> t = d.timetuple()
>>> for i in t:
...     print(i)
2002                # year
3                   # month
11                  # day
0
0
0
0                   # weekday (0 = Monday)
70                  # 70th day in the year
-1
>>> ic = d.isocalendar()
>>> for i in ic:
...     print(i)
2002                # ISO year
11                  # ISO week number
1                   # ISO day number ( 1 = Monday )

>>> # A date object is immutable; all operations produce a new object
>>> d.replace(year=2005)
datetime.date(2005, 3, 11)
@end example

@node datetime objects,time objects,date objects,datetime — Basic date and time types
@anchor{library/datetime datetime-datetime}@anchor{2932}@anchor{library/datetime datetime-objects}@anchor{2933}
@subsubsection @code{datetime} objects


A @ref{4e3,,datetime} object is a single object containing all the information
from a @ref{1fc,,date} object and a @ref{1fd,,time} object.

Like a @ref{1fc,,date} object, @ref{4e3,,datetime} assumes the current Gregorian
calendar extended in both directions; like a @ref{1fd,,time} object,
@code{datetime} assumes there are exactly 3600*24 seconds in every day.

Constructor:

@geindex datetime (class in datetime)
@anchor{library/datetime datetime datetime}@anchor{4e3}
@deffn {Class} datetime.datetime (year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)

The `year', `month' and `day' arguments are required. `tzinfo' may be @code{None}, or an
instance of a @ref{7f7,,tzinfo} subclass. The remaining arguments must be integers
in the following ranges:


@itemize *

@item 
@code{MINYEAR <= year <= MAXYEAR},

@item 
@code{1 <= month <= 12},

@item 
@code{1 <= day <= number of days in the given month and year},

@item 
@code{0 <= hour < 24},

@item 
@code{0 <= minute < 60},

@item 
@code{0 <= second < 60},

@item 
@code{0 <= microsecond < 1000000},

@item 
@code{fold in [0, 1]}.
@end itemize

If an argument outside those ranges is given, @ref{2ee,,ValueError} is raised.


Changed in version 3.6: Added the `fold' parameter.

@end deffn

Other constructors, all class methods:

@geindex today() (datetime.datetime class method)
@anchor{library/datetime datetime datetime today}@anchor{2934}
@deffn {Method} classmethod datetime.today ()

Return the current local date and time, with @ref{2917,,tzinfo} @code{None}.

Equivalent to:

@example
datetime.fromtimestamp(time.time())
@end example

See also @ref{712,,now()}, @ref{713,,fromtimestamp()}.

This method is functionally equivalent to @ref{712,,now()}, but without a
@code{tz} parameter.
@end deffn

@geindex now() (datetime.datetime class method)
@anchor{library/datetime datetime datetime now}@anchor{712}
@deffn {Method} classmethod datetime.now (tz=None)

Return the current local date and time.

If optional argument `tz' is @code{None}
or not specified, this is like @ref{2934,,today()}, but, if possible, supplies more
precision than can be gotten from going through a @ref{55d,,time.time()} timestamp
(for example, this may be possible on platforms supplying the C
@code{gettimeofday()} function).

If `tz' is not @code{None}, it must be an instance of a @ref{7f7,,tzinfo} subclass,
and the current date and time are converted to `tz'’s time zone.

This function is preferred over @ref{2934,,today()} and @ref{34f,,utcnow()}.

@cartouche
@quotation Note 
Subsequent calls to @code{datetime.now()} may return the same
instant depending on the precision of the underlying clock.
@end quotation
@end cartouche
@end deffn

@geindex utcnow() (datetime.datetime class method)
@anchor{library/datetime datetime datetime utcnow}@anchor{34f}
@deffn {Method} classmethod datetime.utcnow ()

Return the current UTC date and time, with @ref{2917,,tzinfo} @code{None}.

This is like @ref{712,,now()}, but returns the current UTC date and time, as a naive
@ref{4e3,,datetime} object. An aware current UTC datetime can be obtained by
calling @code{datetime.now(timezone.utc)}. See also @code{now()}.

@cartouche
@quotation Warning 
Because naive @code{datetime} objects are treated by many @code{datetime} methods
as local times, it is preferred to use aware datetimes to represent times
in UTC. As such, the recommended way to create an object representing the
current time in UTC is by calling @code{datetime.now(timezone.utc)}.
@end quotation
@end cartouche


Deprecated since version 3.12: Use @ref{712,,datetime.now()} with @ref{714,,UTC} instead.

@end deffn

@geindex fromtimestamp() (datetime.datetime class method)
@anchor{library/datetime datetime datetime fromtimestamp}@anchor{713}
@deffn {Method} classmethod datetime.fromtimestamp (timestamp, tz=None)

Return the local date and time corresponding to the POSIX timestamp, such as is
returned by @ref{55d,,time.time()}. If optional argument `tz' is @code{None} or not
specified, the timestamp is converted to the platform’s local date and time, and
the returned @ref{4e3,,datetime} object is naive.

If `tz' is not @code{None}, it must be an instance of a @ref{7f7,,tzinfo} subclass, and the
timestamp is converted to `tz'’s time zone.

@code{fromtimestamp()} may raise @ref{a87,,OverflowError}, if the timestamp is out of
the range of values supported by the platform C @code{localtime()} or
@code{gmtime()} functions, and @ref{2c2,,OSError} on @code{localtime()} or
@code{gmtime()} failure.
It’s common for this to be restricted to years in
1970 through 2038. Note that on non-POSIX systems that include leap seconds in
their notion of a timestamp, leap seconds are ignored by @code{fromtimestamp()},
and then it’s possible to have two timestamps differing by a second that yield
identical @ref{4e3,,datetime} objects. This method is preferred over
@ref{350,,utcfromtimestamp()}.


Changed in version 3.3: Raise @ref{a87,,OverflowError} instead of @ref{2ee,,ValueError} if the timestamp
is out of the range of values supported by the platform C
@code{localtime()} or @code{gmtime()} functions. Raise @ref{2c2,,OSError}
instead of @code{ValueError} on @code{localtime()} or @code{gmtime()}
failure.



Changed in version 3.6: @code{fromtimestamp()} may return instances with @ref{e57,,fold} set to 1.

@end deffn

@geindex utcfromtimestamp() (datetime.datetime class method)
@anchor{library/datetime datetime datetime utcfromtimestamp}@anchor{350}
@deffn {Method} classmethod datetime.utcfromtimestamp (timestamp)

Return the UTC @ref{4e3,,datetime} corresponding to the POSIX timestamp, with
@ref{2917,,tzinfo} @code{None}.  (The resulting object is naive.)

This may raise @ref{a87,,OverflowError}, if the timestamp is
out of the range of values supported by the platform C @code{gmtime()} function,
and @ref{2c2,,OSError} on @code{gmtime()} failure.
It’s common for this to be restricted to years in 1970 through 2038.

To get an aware @ref{4e3,,datetime} object, call @ref{713,,fromtimestamp()}:

@example
datetime.fromtimestamp(timestamp, timezone.utc)
@end example

On the POSIX compliant platforms, it is equivalent to the following
expression:

@example
datetime(1970, 1, 1, tzinfo=timezone.utc) + timedelta(seconds=timestamp)
@end example

except the latter formula always supports the full years range: between
@ref{2905,,MINYEAR} and @ref{2906,,MAXYEAR} inclusive.

@cartouche
@quotation Warning 
Because naive @code{datetime} objects are treated by many @code{datetime} methods
as local times, it is preferred to use aware datetimes to represent times
in UTC. As such, the recommended way to create an object representing a
specific timestamp in UTC is by calling
@code{datetime.fromtimestamp(timestamp, tz=timezone.utc)}.
@end quotation
@end cartouche


Changed in version 3.3: Raise @ref{a87,,OverflowError} instead of @ref{2ee,,ValueError} if the timestamp
is out of the range of values supported by the platform C
@code{gmtime()} function. Raise @ref{2c2,,OSError} instead of
@code{ValueError} on @code{gmtime()} failure.



Changed in version 3.15: Accepts any real number as `timestamp', not only integer or float.



Deprecated since version 3.12: Use @ref{713,,datetime.fromtimestamp()} with @ref{714,,UTC} instead.

@end deffn

@geindex fromordinal() (datetime.datetime class method)
@anchor{library/datetime datetime datetime fromordinal}@anchor{2935}
@deffn {Method} classmethod datetime.fromordinal (ordinal)

Return the @ref{4e3,,datetime} corresponding to the proleptic Gregorian ordinal,
where January 1 of year 1 has ordinal 1. @ref{2ee,,ValueError} is raised unless
@code{1 <= ordinal <= datetime.max.toordinal()}. The hour, minute, second and
microsecond of the result are all 0, and @ref{2917,,tzinfo} is @code{None}.
@end deffn

@geindex combine() (datetime.datetime class method)
@anchor{library/datetime datetime datetime combine}@anchor{e96}
@deffn {Method} classmethod datetime.combine (date, time, tzinfo=time.tzinfo)

Return a new @ref{4e3,,datetime} object whose date components are equal to the
given @ref{1fc,,date} object’s, and whose time components
are equal to the given @ref{1fd,,time} object’s. If the `tzinfo'
argument is provided, its value is used to set the @ref{2917,,tzinfo} attribute
of the result, otherwise the @ref{290f,,tzinfo} attribute of the `time' argument
is used.  If the `date' argument is a @code{datetime} object, its time components
and @code{tzinfo} attributes are ignored.

For any @ref{4e3,,datetime} object @code{d},
@code{d == datetime.combine(d.date(), d.time(), d.tzinfo)}.


Changed in version 3.6: Added the `tzinfo' argument.

@end deffn

@geindex fromisoformat() (datetime.datetime class method)
@anchor{library/datetime datetime datetime fromisoformat}@anchor{82b}
@deffn {Method} classmethod datetime.fromisoformat (date_string)

Return a @ref{4e3,,datetime} corresponding to a `date_string' in any valid
ISO 8601 format, with the following exceptions:


@enumerate 

@item 
Time zone offsets may have fractional seconds.

@item 
The @code{T} separator may be replaced by any single unicode character.

@item 
Fractional hours and minutes are not supported.

@item 
Reduced precision dates are not currently supported (@code{YYYY-MM},
@code{YYYY}).

@item 
Extended date representations are not currently supported
(@code{±YYYYYY-MM-DD}).

@item 
Ordinal dates are not currently supported (@code{YYYY-OOO}).
@end enumerate

Examples:

@example
>>> import datetime as dt
>>> dt.datetime.fromisoformat('2011-11-04')
datetime.datetime(2011, 11, 4, 0, 0)
>>> dt.datetime.fromisoformat('20111104')
datetime.datetime(2011, 11, 4, 0, 0)
>>> dt.datetime.fromisoformat('2011-11-04T00:05:23')
datetime.datetime(2011, 11, 4, 0, 5, 23)
>>> dt.datetime.fromisoformat('2011-11-04T00:05:23Z')
datetime.datetime(2011, 11, 4, 0, 5, 23, tzinfo=datetime.timezone.utc)
>>> dt.datetime.fromisoformat('20111104T000523')
datetime.datetime(2011, 11, 4, 0, 5, 23)
>>> dt.datetime.fromisoformat('2011-W01-2T00:05:23.283')
datetime.datetime(2011, 1, 4, 0, 5, 23, 283000)
>>> dt.datetime.fromisoformat('2011-11-04 00:05:23.283')
datetime.datetime(2011, 11, 4, 0, 5, 23, 283000)
>>> dt.datetime.fromisoformat('2011-11-04 00:05:23.283+00:00')
datetime.datetime(2011, 11, 4, 0, 5, 23, 283000, tzinfo=datetime.timezone.utc)
>>> dt.datetime.fromisoformat('2011-11-04T00:05:23+04:00')
datetime.datetime(2011, 11, 4, 0, 5, 23,
    tzinfo=datetime.timezone(datetime.timedelta(seconds=14400)))
@end example


Added in version 3.7.



Changed in version 3.11: Previously, this method only supported formats that could be emitted by
@ref{292c,,date.isoformat()} or @ref{d2b,,datetime.isoformat()}.

@end deffn

@geindex fromisocalendar() (datetime.datetime class method)
@anchor{library/datetime datetime datetime fromisocalendar}@anchor{be6}
@deffn {Method} classmethod datetime.fromisocalendar (year, week, day)

Return a @ref{4e3,,datetime} corresponding to the ISO calendar date specified
by `year', `week' and `day'. The non-date components of the datetime are populated
with their normal default values. This is the inverse of the function
@ref{af8,,datetime.isocalendar()}.


Added in version 3.8.

@end deffn

@geindex strptime() (datetime.datetime class method)
@anchor{library/datetime datetime datetime strptime}@anchor{1994}
@deffn {Method} classmethod datetime.strptime (date_string, format)

Return a @ref{4e3,,datetime} corresponding to `date_string', parsed according to
`format'.

If `format' does not contain microseconds or time zone information, this is equivalent to:

@example
datetime(*(time.strptime(date_string, format)[0:6]))
@end example

@ref{2ee,,ValueError} is raised if the date_string and format
can’t be parsed by @ref{1639,,time.strptime()} or if it returns a value which isn’t a
time tuple.  See also @ref{1b98,,strftime() and strptime() behavior} and
@ref{82b,,datetime.fromisoformat()}.


Changed in version 3.13: If `format' specifies a day of month without a year a
@ref{1a4,,DeprecationWarning} is now emitted.  This is to avoid a quadrennial
leap year bug in code seeking to parse only a month and day as the
default year used in absence of one in the format is not a leap year.
Such `format' values may raise an error as of Python 3.15.  The
workaround is to always include a year in your `format'.  If parsing
`date_string' values that do not have a year, explicitly add a year that
is a leap year before parsing:

@example
>>> import datetime as dt
>>> date_string = "02/29"
>>> when = dt.datetime.strptime(f"@{date_string@};1984", "%m/%d;%Y")  # Avoids leap year bug.
>>> when.strftime("%B %d")
'February 29'
@end example

@end deffn

Class attributes:

@geindex min (datetime.datetime attribute)
@anchor{library/datetime datetime datetime min}@anchor{1ba9}
@deffn {Attribute} datetime.min

The earliest representable @ref{4e3,,datetime}, @code{datetime(MINYEAR, 1, 1,
tzinfo=None)}.
@end deffn

@geindex max (datetime.datetime attribute)
@anchor{library/datetime datetime datetime max}@anchor{2936}
@deffn {Attribute} datetime.max

The latest representable @ref{4e3,,datetime}, @code{datetime(MAXYEAR, 12, 31, 23, 59,
59, 999999, tzinfo=None)}.
@end deffn

@geindex resolution (datetime.datetime attribute)
@anchor{library/datetime datetime datetime resolution}@anchor{2937}
@deffn {Attribute} datetime.resolution

The smallest possible difference between non-equal @ref{4e3,,datetime} objects,
@code{timedelta(microseconds=1)}.
@end deffn

Instance attributes (read-only):

@geindex year (datetime.datetime attribute)
@anchor{library/datetime datetime datetime year}@anchor{2910}
@deffn {Attribute} datetime.year

Between @ref{2905,,MINYEAR} and @ref{2906,,MAXYEAR} inclusive.
@end deffn

@geindex month (datetime.datetime attribute)
@anchor{library/datetime datetime datetime month}@anchor{2911}
@deffn {Attribute} datetime.month

Between 1 and 12 inclusive.
@end deffn

@geindex day (datetime.datetime attribute)
@anchor{library/datetime datetime datetime day}@anchor{2912}
@deffn {Attribute} datetime.day

Between 1 and the number of days in the given month of the given year.
@end deffn

@geindex hour (datetime.datetime attribute)
@anchor{library/datetime datetime datetime hour}@anchor{2913}
@deffn {Attribute} datetime.hour

In @code{range(24)}.
@end deffn

@geindex minute (datetime.datetime attribute)
@anchor{library/datetime datetime datetime minute}@anchor{2914}
@deffn {Attribute} datetime.minute

In @code{range(60)}.
@end deffn

@geindex second (datetime.datetime attribute)
@anchor{library/datetime datetime datetime second}@anchor{2915}
@deffn {Attribute} datetime.second

In @code{range(60)}.
@end deffn

@geindex microsecond (datetime.datetime attribute)
@anchor{library/datetime datetime datetime microsecond}@anchor{2916}
@deffn {Attribute} datetime.microsecond

In @code{range(1000000)}.
@end deffn

@geindex tzinfo (datetime.datetime attribute)
@anchor{library/datetime datetime datetime tzinfo}@anchor{2917}
@deffn {Attribute} datetime.tzinfo

The object passed as the `tzinfo' argument to the @ref{4e3,,datetime} constructor,
or @code{None} if none was passed.
@end deffn

@geindex fold (datetime.datetime attribute)
@anchor{library/datetime datetime datetime fold}@anchor{e57}
@deffn {Attribute} datetime.fold

In @code{[0, 1]}. Used to disambiguate wall times during a repeated interval. (A
repeated interval occurs when clocks are rolled back at the end of daylight saving
time or when the UTC offset for the current zone is decreased for political reasons.)
The values 0 and 1 represent, respectively, the earlier and later of the two
moments with the same wall time representation.


Added in version 3.6.

@end deffn

Supported operations:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Operation

@tab

Result

@item

@code{datetime2 = datetime1 + timedelta}

@tab

(1)

@item

@code{datetime2 = datetime1 - timedelta}

@tab

(2)

@item

@code{timedelta = datetime1 - datetime2}

@tab

(3)

@item


@display
@code{datetime1 == datetime2}@w{ }
@code{datetime1 != datetime2}@w{ }
@end display



@tab

Equality comparison. (4)

@item


@display
@code{datetime1 < datetime2}@w{ }
@code{datetime1 > datetime2}@w{ }
@code{datetime1 <= datetime2}@w{ }
@code{datetime1 >= datetime2}@w{ }
@end display



@tab

Order comparison. (5)

@end multitable



@enumerate 

@item 
@code{datetime2} is a duration of @code{timedelta} removed from @code{datetime1}, moving forward in
time if @code{timedelta.days > 0}, or backward if @code{timedelta.days < 0}. The
result has the same @ref{2917,,tzinfo} attribute as the input datetime, and
@code{datetime2 - datetime1 == timedelta} after. @ref{a87,,OverflowError} is raised if
@code{datetime2.year} would be smaller than @ref{2905,,MINYEAR} or larger than
@ref{2906,,MAXYEAR}. Note that no time zone adjustments are done even if the
input is an aware object.

@item 
Computes the @code{datetime2} such that @code{datetime2 + timedelta == datetime1}. As for
addition, the result has the same @ref{2917,,tzinfo} attribute as the input
datetime, and no time zone adjustments are done even if the input is aware.

@item 
Subtraction of a @ref{4e3,,datetime} from a @code{datetime} is defined only if
both operands are naive, or if both are aware. If one is aware and the other is
naive, @ref{199,,TypeError} is raised.

If both are naive, or both are aware and have the same @ref{2917,,tzinfo} attribute,
the @code{tzinfo} attributes are ignored, and the result is a @ref{bc9,,timedelta}
object @code{t} such that @code{datetime2 + t == datetime1}. No time zone adjustments
are done in this case.

If both are aware and have different @ref{2917,,tzinfo} attributes, @code{a-b} acts
as if @code{a} and @code{b} were first converted to naive UTC datetimes. The
result is @code{(a.replace(tzinfo=None) - a.utcoffset()) - (b.replace(tzinfo=None)
- b.utcoffset())} except that the implementation never overflows.

@item 
@ref{4e3,,datetime} objects are equal if they represent the same date
and time, taking into account the time zone.

Naive and aware @ref{4e3,,datetime} objects are never equal.

If both comparands are aware, and have the same @code{tzinfo} attribute,
the @code{tzinfo} and @ref{e57,,fold} attributes are ignored and
the base datetimes are compared.
If both comparands are aware and have different @ref{2917,,tzinfo}
attributes, the comparison acts as comparands were first converted to UTC
datetimes except that the implementation never overflows.
@ref{4e3,,datetime} instances in a repeated interval are never equal to
@code{datetime} instances in other time zone.

@item 
`datetime1' is considered less than `datetime2' when `datetime1' precedes
`datetime2' in time, taking into account the time zone.

Order comparison between naive and aware @ref{4e3,,datetime} objects
raises @ref{199,,TypeError}.

If both comparands are aware, and have the same @code{tzinfo} attribute,
the @code{tzinfo} and @ref{e57,,fold} attributes are ignored and
the base datetimes are compared.
If both comparands are aware and have different @ref{2917,,tzinfo}
attributes, the comparison acts as comparands were first converted to UTC
datetimes except that the implementation never overflows.
@end enumerate


Changed in version 3.3: Equality comparisons between aware and naive @ref{4e3,,datetime}
instances don’t raise @ref{199,,TypeError}.



Changed in version 3.13: Comparison between @ref{4e3,,datetime} object and an instance of
the @ref{1fc,,date} subclass that is not a @code{datetime} subclass
no longer converts the latter to @code{date}, ignoring the time part
and the time zone.
The default behavior can be changed by overriding the special comparison
methods in subclasses.


Instance methods:

@geindex date() (datetime.datetime method)
@anchor{library/datetime datetime datetime date}@anchor{2938}
@deffn {Method} datetime.date ()

Return @ref{1fc,,date} object with same year, month and day.
@end deffn

@geindex time() (datetime.datetime method)
@anchor{library/datetime datetime datetime time}@anchor{2939}
@deffn {Method} datetime.time ()

Return @ref{1fd,,time} object with same hour, minute, second, microsecond and fold.
@ref{2917,,tzinfo} is @code{None}. See also method @ref{293a,,timetz()}.


Changed in version 3.6: The fold value is copied to the returned @ref{1fd,,time} object.

@end deffn

@geindex timetz() (datetime.datetime method)
@anchor{library/datetime datetime datetime timetz}@anchor{293a}
@deffn {Method} datetime.timetz ()

Return @ref{1fd,,time} object with same hour, minute, second, microsecond, fold, and
tzinfo attributes. See also method @ref{f4,,time()}.


Changed in version 3.6: The fold value is copied to the returned @ref{1fd,,time} object.

@end deffn

@geindex replace() (datetime.datetime method)
@anchor{library/datetime datetime datetime replace}@anchor{16d7}
@deffn {Method} datetime.replace (year=self.year, month=self.month, day=self.day, hour=self.hour, minute=self.minute, second=self.second, microsecond=self.microsecond, tzinfo=self.tzinfo, *, fold=0)

Return a new @ref{34,,datetime} object with the same attributes, but with
specified parameters updated. Note that @code{tzinfo=None} can be specified to
create a naive datetime from an aware datetime with no conversion of date
and time data.

@ref{4e3,,datetime} objects are also supported by generic function
@ref{1c2,,copy.replace()}.


Changed in version 3.6: Added the `fold' parameter.

@end deffn

@geindex astimezone() (datetime.datetime method)
@anchor{library/datetime datetime datetime astimezone}@anchor{bca}
@deffn {Method} datetime.astimezone (tz=None)

Return a @ref{4e3,,datetime} object with new @ref{2917,,tzinfo} attribute `tz',
adjusting the date and time data so the result is the same UTC time as
`self', but in `tz'’s local time.

If provided, `tz' must be an instance of a @ref{7f7,,tzinfo} subclass, and its
@ref{293b,,utcoffset()} and @ref{293c,,dst()} methods must not return @code{None}. If `self'
is naive, it is presumed to represent time in the system time zone.

If called without arguments (or with @code{tz=None}) the system local
time zone is assumed for the target time zone. The @code{.tzinfo} attribute of the converted
datetime instance will be set to an instance of @ref{12cb,,timezone}
with the zone name and offset obtained from the OS.

If @code{self.tzinfo} is `tz', @code{self.astimezone(tz)} is equal to `self':  no
adjustment of date or time data is performed. Else the result is local
time in the time zone `tz', representing the same UTC time as `self':  after
@code{astz = dt.astimezone(tz)}, @code{astz - astz.utcoffset()} will have
the same date and time data as @code{dt - dt.utcoffset()}.

If you merely want to attach a @ref{12cb,,timezone} object `tz' to a datetime `dt' without
adjustment of date and time data, use @code{dt.replace(tzinfo=tz)}. If you
merely want to remove the @code{timezone} object from an aware datetime `dt' without
conversion of date and time data, use @code{dt.replace(tzinfo=None)}.

Note that the default @ref{293d,,tzinfo.fromutc()} method can be overridden in a
@ref{7f7,,tzinfo} subclass to affect the result returned by @code{astimezone()}.
Ignoring error cases, @code{astimezone()} acts like:

@example
def astimezone(self, tz):
    if self.tzinfo is tz:
        return self
    # Convert self to UTC, and attach the new timezone object.
    utc = (self - self.utcoffset()).replace(tzinfo=tz)
    # Convert from UTC to tz's local time.
    return tz.fromutc(utc)
@end example


Changed in version 3.3: `tz' now can be omitted.



Changed in version 3.6: The @code{astimezone()} method can now be called on naive instances that
are presumed to represent system local time.

@end deffn

@geindex utcoffset() (datetime.datetime method)
@anchor{library/datetime datetime datetime utcoffset}@anchor{293b}
@deffn {Method} datetime.utcoffset ()

If @ref{2917,,tzinfo} is @code{None}, returns @code{None}, else returns
@code{self.tzinfo.utcoffset(self)}, and raises an exception if the latter doesn’t
return @code{None} or a @ref{bc9,,timedelta} object with magnitude less than one day.


Changed in version 3.7: The UTC offset is not restricted to a whole number of minutes.

@end deffn

@geindex dst() (datetime.datetime method)
@anchor{library/datetime datetime datetime dst}@anchor{293c}
@deffn {Method} datetime.dst ()

If @ref{2917,,tzinfo} is @code{None}, returns @code{None}, else returns
@code{self.tzinfo.dst(self)}, and raises an exception if the latter doesn’t return
@code{None} or a @ref{bc9,,timedelta} object with magnitude less than one day.


Changed in version 3.7: The DST offset is not restricted to a whole number of minutes.

@end deffn

@geindex tzname() (datetime.datetime method)
@anchor{library/datetime datetime datetime tzname}@anchor{293e}
@deffn {Method} datetime.tzname ()

If @ref{2917,,tzinfo} is @code{None}, returns @code{None}, else returns
@code{self.tzinfo.tzname(self)}, raises an exception if the latter doesn’t return
@code{None} or a string object,
@end deffn

@geindex timetuple() (datetime.datetime method)
@anchor{library/datetime datetime datetime timetuple}@anchor{293f}
@deffn {Method} datetime.timetuple ()

Return a @ref{eec,,time.struct_time} such as returned by @ref{1705,,time.localtime()}.

@code{d.timetuple()} is equivalent to:

@example
time.struct_time((d.year, d.month, d.day,
                  d.hour, d.minute, d.second,
                  d.weekday(), yday, dst))
@end example

where @code{yday = d.toordinal() - date(d.year, 1, 1).toordinal() + 1}
is the day number within the current year starting with 1 for January
1st. The @ref{2940,,tm_isdst} flag of the result is set according to the
@ref{293c,,dst()} method: @ref{2917,,tzinfo} is @code{None} or @code{dst()} returns
@code{None}, @code{tm_isdst} is set to @code{-1}; else if @code{dst()} returns a
non-zero value, @code{tm_isdst} is set to 1; else @code{tm_isdst} is
set to 0.
@end deffn

@geindex utctimetuple() (datetime.datetime method)
@anchor{library/datetime datetime datetime utctimetuple}@anchor{2941}
@deffn {Method} datetime.utctimetuple ()

If @ref{4e3,,datetime} instance @code{d} is naive, this is the same as
@code{d.timetuple()} except that @ref{2940,,tm_isdst} is forced to 0 regardless of what
@code{d.dst()} returns. DST is never in effect for a UTC time.

If @code{d} is aware, @code{d} is normalized to UTC time, by subtracting
@code{d.utcoffset()}, and a @ref{eec,,time.struct_time} for the
normalized time is returned. @code{tm_isdst} is forced to 0. Note
that an @ref{a87,,OverflowError} may be raised if @code{d.year} was
@code{MINYEAR} or @code{MAXYEAR} and UTC adjustment spills over a year
boundary.

@cartouche
@quotation Warning 
Because naive @code{datetime} objects are treated by many @code{datetime} methods
as local times, it is preferred to use aware datetimes to represent times
in UTC; as a result, using @code{datetime.utctimetuple()} may give misleading
results. If you have a naive @code{datetime} representing UTC, use
@code{datetime.replace(tzinfo=timezone.utc)} to make it aware, at which point
you can use @ref{293f,,datetime.timetuple()}.
@end quotation
@end cartouche
@end deffn

@geindex toordinal() (datetime.datetime method)
@anchor{library/datetime datetime datetime toordinal}@anchor{2942}
@deffn {Method} datetime.toordinal ()

Return the proleptic Gregorian ordinal of the date. The same as
@code{self.date().toordinal()}.
@end deffn

@geindex timestamp() (datetime.datetime method)
@anchor{library/datetime datetime datetime timestamp}@anchor{12a6}
@deffn {Method} datetime.timestamp ()

Return POSIX timestamp corresponding to the @ref{4e3,,datetime}
instance. The return value is a @ref{197,,float} similar to that
returned by @ref{55d,,time.time()}.

Naive @ref{4e3,,datetime} instances are assumed to represent local
time and this method relies on the platform C @code{mktime()}
function to perform the conversion. Since @code{datetime}
supports wider range of values than @code{mktime()} on many
platforms, this method may raise @ref{a87,,OverflowError} or @ref{2c2,,OSError}
for times far in the past or far in the future.

For aware @ref{4e3,,datetime} instances, the return value is computed
as:

@example
(dt - datetime(1970, 1, 1, tzinfo=timezone.utc)).total_seconds()
@end example

@cartouche
@quotation Note 
There is no method to obtain the POSIX timestamp directly from a
naive @ref{4e3,,datetime} instance representing UTC time. If your
application uses this convention and your system time zone is not
set to UTC, you can obtain the POSIX timestamp by supplying
@code{tzinfo=timezone.utc}:

@example
timestamp = dt.replace(tzinfo=timezone.utc).timestamp()
@end example

or by calculating the timestamp directly:

@example
timestamp = (dt - datetime(1970, 1, 1)) / timedelta(seconds=1)
@end example
@end quotation
@end cartouche


Added in version 3.3.



Changed in version 3.6: The @code{timestamp()} method uses the @ref{e57,,fold} attribute to
disambiguate the times during a repeated interval.

@end deffn

@geindex weekday() (datetime.datetime method)
@anchor{library/datetime datetime datetime weekday}@anchor{2943}
@deffn {Method} datetime.weekday ()

Return the day of the week as an integer, where Monday is 0 and Sunday is 6.
The same as @code{self.date().weekday()}. See also @ref{2944,,isoweekday()}.
@end deffn

@geindex isoweekday() (datetime.datetime method)
@anchor{library/datetime datetime datetime isoweekday}@anchor{2944}
@deffn {Method} datetime.isoweekday ()

Return the day of the week as an integer, where Monday is 1 and Sunday is 7.
The same as @code{self.date().isoweekday()}. See also @ref{2943,,weekday()},
@ref{af8,,isocalendar()}.
@end deffn

@geindex isocalendar() (datetime.datetime method)
@anchor{library/datetime datetime datetime isocalendar}@anchor{af8}
@deffn {Method} datetime.isocalendar ()

Return a @ref{85f,,named tuple} with three components: @code{year}, @code{week}
and @code{weekday}. The same as @code{self.date().isocalendar()}.
@end deffn

@geindex isoformat() (datetime.datetime method)
@anchor{library/datetime datetime datetime isoformat}@anchor{d2b}
@deffn {Method} datetime.isoformat (sep='T', timespec='auto')

Return a string representing the date and time in ISO 8601 format:


@itemize -

@item 
@code{YYYY-MM-DDTHH:MM:SS.ffffff}, if @ref{2916,,microsecond} is not 0

@item 
@code{YYYY-MM-DDTHH:MM:SS}, if @ref{2916,,microsecond} is 0
@end itemize

If @ref{293b,,utcoffset()} does not return @code{None}, a string is
appended, giving the UTC offset:


@itemize -

@item 
@code{YYYY-MM-DDTHH:MM:SS.ffffff+HH:MM[:SS[.ffffff]]}, if @ref{2916,,microsecond}
is not 0

@item 
@code{YYYY-MM-DDTHH:MM:SS+HH:MM[:SS[.ffffff]]},  if @ref{2916,,microsecond} is 0
@end itemize

Examples:

@example
>>> import datetime as dt
>>> dt.datetime(2019, 5, 18, 15, 17, 8, 132263).isoformat()
'2019-05-18T15:17:08.132263'
>>> dt.datetime(2019, 5, 18, 15, 17, tzinfo=dt.timezone.utc).isoformat()
'2019-05-18T15:17:00+00:00'
@end example

The optional argument `sep' (default @code{'T'}) is a one-character separator,
placed between the date and time portions of the result. For example:

@example
>>> import datetime as dt
>>> class TZ(dt.tzinfo):
...     """A time zone with an arbitrary, constant -06:39 offset."""
...     def utcoffset(self, when):
...         return dt.timedelta(hours=-6, minutes=-39)
...
>>> dt.datetime(2002, 12, 25, tzinfo=TZ()).isoformat(' ')
'2002-12-25 00:00:00-06:39'
>>> dt.datetime(2009, 11, 27, microsecond=100, tzinfo=TZ()).isoformat()
'2009-11-27T00:00:00.000100-06:39'
@end example

The optional argument `timespec' specifies the number of additional
components of the time to include (the default is @code{'auto'}).
It can be one of the following:


@itemize -

@item 
@code{'auto'}: Same as @code{'seconds'} if @ref{2916,,microsecond} is 0,
same as @code{'microseconds'} otherwise.

@item 
@code{'hours'}: Include the @ref{2913,,hour} in the two-digit @code{HH} format.

@item 
@code{'minutes'}: Include @ref{2913,,hour} and @ref{2914,,minute} in @code{HH:MM} format.

@item 
@code{'seconds'}: Include @ref{2913,,hour}, @ref{2914,,minute}, and @ref{2915,,second}
in @code{HH:MM:SS} format.

@item 
@code{'milliseconds'}: Include full time, but truncate fractional second
part to milliseconds. @code{HH:MM:SS.sss} format.

@item 
@code{'microseconds'}: Include full time in @code{HH:MM:SS.ffffff} format.
@end itemize

@cartouche
@quotation Note 
Excluded time components are truncated, not rounded.
@end quotation
@end cartouche

@ref{2ee,,ValueError} will be raised on an invalid `timespec' argument:

@example
>>> import datetime as dt
>>> dt.datetime.now().isoformat(timespec='minutes')
'2002-12-25T00:00'
>>> my_datetime = dt.datetime(2015, 1, 1, 12, 30, 59, 0)
>>> my_datetime.isoformat(timespec='microseconds')
'2015-01-01T12:30:59.000000'
@end example


Changed in version 3.6: Added the `timespec' parameter.

@end deffn

@geindex __str__() (datetime.datetime method)
@anchor{library/datetime datetime datetime __str__}@anchor{2945}
@deffn {Method} datetime.__str__ ()

For a @ref{4e3,,datetime} instance @code{d}, @code{str(d)} is equivalent to
@code{d.isoformat(' ')}.
@end deffn

@geindex ctime() (datetime.datetime method)
@anchor{library/datetime datetime datetime ctime}@anchor{2946}
@deffn {Method} datetime.ctime ()

Return a string representing the date and time:

@example
>>> import datetime as dt
>>> dt.datetime(2002, 12, 4, 20, 30, 40).ctime()
'Wed Dec  4 20:30:40 2002'
@end example

The output string will `not' include time zone information, regardless
of whether the input is aware or naive.

@code{d.ctime()} is equivalent to:

@example
time.ctime(time.mktime(d.timetuple()))
@end example

on platforms where the native C @code{ctime()} function
(which @ref{292f,,time.ctime()} invokes, but which
@code{datetime.ctime()} does not invoke) conforms to the C standard.
@end deffn

@geindex strftime() (datetime.datetime method)
@anchor{library/datetime datetime datetime strftime}@anchor{e94}
@deffn {Method} datetime.strftime (format)

Return a string representing the date and time,
controlled by an explicit format string.
See also @ref{1b98,,strftime() and strptime() behavior} and @ref{d2b,,datetime.isoformat()}.
@end deffn

@geindex __format__() (datetime.datetime method)
@anchor{library/datetime datetime datetime __format__}@anchor{2947}
@deffn {Method} datetime.__format__ (format)

Same as @ref{e94,,datetime.strftime()}. This makes it possible to specify a format
string for a @ref{4e3,,datetime} object in @ref{19b,,formatted string literals} and when using @ref{834,,str.format()}.
See also @ref{1b98,,strftime() and strptime() behavior} and @ref{d2b,,datetime.isoformat()}.
@end deffn

@menu
* Examples of usage; datetime: Examples of usage datetime. 

@end menu

@node Examples of usage datetime,,,datetime objects
@anchor{library/datetime examples-of-usage-datetime}@anchor{2948}
@subsubsection Examples of usage: @code{datetime}


Examples of working with @ref{4e3,,datetime} objects:

@example
>>> import datetime as dt

>>> # Using datetime.combine()
>>> d = dt.date(2005, 7, 14)
>>> t = dt.time(12, 30)
>>> dt.datetime.combine(d, t)
datetime.datetime(2005, 7, 14, 12, 30)

>>> # Using datetime.now()
>>> dt.datetime.now()
datetime.datetime(2007, 12, 6, 16, 29, 43, 79043)   # GMT +1
>>> dt.datetime.now(dt.timezone.utc)
datetime.datetime(2007, 12, 6, 15, 29, 43, 79060, tzinfo=datetime.timezone.utc)

>>> # Using datetime.strptime()
>>> my_datetime = dt.datetime.strptime("21/11/06 16:30", "%d/%m/%y %H:%M")
>>> my_datetime
datetime.datetime(2006, 11, 21, 16, 30)

>>> # Using datetime.timetuple() to get tuple of all attributes
>>> tt = my_datetime.timetuple()
>>> for it in tt:
...     print(it)
...
2006    # year
11      # month
21      # day
16      # hour
30      # minute
0       # second
1       # weekday (0 = Monday)
325     # number of days since 1st January
-1      # dst - method tzinfo.dst() returned None

>>> # Date in ISO format
>>> ic = my_datetime.isocalendar()
>>> for it in ic:
...     print(it)
...
2006    # ISO year
47      # ISO week
2       # ISO weekday

>>> # Formatting a datetime
>>> my_datetime.strftime("%A, %d. %B %Y %I:%M%p")
'Tuesday, 21. November 2006 04:30PM'
>>> 'The @{1@} is @{0:%d@}, the @{2@} is @{0:%B@}, the @{3@} is @{0:%I:%M%p@}.'.format(my_datetime, "day", "month", "time")
'The day is 21, the month is November, the time is 04:30PM.'
@end example

The example below defines a @ref{7f7,,tzinfo} subclass capturing time zone
information for Kabul, Afghanistan, which used +4 UTC until 1945
and then +4:30 UTC thereafter:

@example
import datetime as dt

class KabulTz(dt.tzinfo):
    # Kabul used +4 until 1945, when they moved to +4:30
    UTC_MOVE_DATE = dt.datetime(1944, 12, 31, 20, tzinfo=dt.timezone.utc)

    def utcoffset(self, when):
        if when.year < 1945:
            return dt.timedelta(hours=4)
        elif (1945, 1, 1, 0, 0) <= when.timetuple()[:5] < (1945, 1, 1, 0, 30):
            # An ambiguous ("imaginary") half-hour range representing
            # a 'fold' in time due to the shift from +4 to +4:30.
            # If when falls in the imaginary range, use fold to decide how
            # to resolve. See PEP 495.
            return dt.timedelta(hours=4, minutes=(30 if when.fold else 0))
        else:
            return dt.timedelta(hours=4, minutes=30)

    def fromutc(self, when):
        # Follow same validations as in datetime.tzinfo
        if not isinstance(when, dt.datetime):
            raise TypeError("fromutc() requires a datetime argument")
        if when.tzinfo is not self:
            raise ValueError("when.tzinfo is not self")

        # A custom implementation is required for fromutc as
        # the input to this function is a datetime with utc values
        # but with a tzinfo set to self.
        # See datetime.astimezone or fromtimestamp.
        if when.replace(tzinfo=dt.timezone.utc) >= self.UTC_MOVE_DATE:
            return when + dt.timedelta(hours=4, minutes=30)
        else:
            return when + dt.timedelta(hours=4)

    def dst(self, when):
        # Kabul does not observe daylight saving time.
        return dt.timedelta(0)

    def tzname(self, when):
        if when >= self.UTC_MOVE_DATE:
            return "+04:30"
        return "+04"
@end example

Usage of @code{KabulTz} from above:

@example
>>> tz1 = KabulTz()

>>> # Datetime before the change
>>> dt1 = dt.datetime(1900, 11, 21, 16, 30, tzinfo=tz1)
>>> print(dt1.utcoffset())
4:00:00

>>> # Datetime after the change
>>> dt2 = dt.datetime(2006, 6, 14, 13, 0, tzinfo=tz1)
>>> print(dt2.utcoffset())
4:30:00

>>> # Convert datetime to another time zone
>>> dt3 = dt2.astimezone(dt.timezone.utc)
>>> dt3
datetime.datetime(2006, 6, 14, 8, 30, tzinfo=datetime.timezone.utc)
>>> dt2
datetime.datetime(2006, 6, 14, 13, 0, tzinfo=KabulTz())
>>> dt2 == dt3
True
@end example

@node time objects,tzinfo objects,datetime objects,datetime — Basic date and time types
@anchor{library/datetime datetime-time}@anchor{2949}@anchor{library/datetime time-objects}@anchor{294a}
@subsubsection @code{time} objects


A @ref{1fd,,time} object represents a (local) time of day, independent of any particular
day, and subject to adjustment via a @ref{7f7,,tzinfo} object.

@geindex time (class in datetime)
@anchor{library/datetime datetime time}@anchor{1fd}
@deffn {Class} datetime.time (hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)

All arguments are optional. `tzinfo' may be @code{None}, or an instance of a
@ref{7f7,,tzinfo} subclass. The remaining arguments must be integers in the
following ranges:


@itemize *

@item 
@code{0 <= hour < 24},

@item 
@code{0 <= minute < 60},

@item 
@code{0 <= second < 60},

@item 
@code{0 <= microsecond < 1000000},

@item 
@code{fold in [0, 1]}.
@end itemize

If an argument outside those ranges is given, @ref{2ee,,ValueError} is raised. All
default to 0 except `tzinfo', which defaults to @code{None}.
@end deffn

Class attributes:

@geindex min (datetime.time attribute)
@anchor{library/datetime datetime time min}@anchor{294b}
@deffn {Attribute} time.min

The earliest representable @ref{1fd,,time}, @code{time(0, 0, 0, 0)}.
@end deffn

@geindex max (datetime.time attribute)
@anchor{library/datetime datetime time max}@anchor{294c}
@deffn {Attribute} time.max

The latest representable @ref{1fd,,time}, @code{time(23, 59, 59, 999999)}.
@end deffn

@geindex resolution (datetime.time attribute)
@anchor{library/datetime datetime time resolution}@anchor{294d}
@deffn {Attribute} time.resolution

The smallest possible difference between non-equal @ref{1fd,,time} objects,
@code{timedelta(microseconds=1)}, although note that arithmetic on
@code{time} objects is not supported.
@end deffn

Instance attributes (read-only):

@geindex hour (datetime.time attribute)
@anchor{library/datetime datetime time hour}@anchor{290b}
@deffn {Attribute} time.hour

In @code{range(24)}.
@end deffn

@geindex minute (datetime.time attribute)
@anchor{library/datetime datetime time minute}@anchor{290c}
@deffn {Attribute} time.minute

In @code{range(60)}.
@end deffn

@geindex second (datetime.time attribute)
@anchor{library/datetime datetime time second}@anchor{290d}
@deffn {Attribute} time.second

In @code{range(60)}.
@end deffn

@geindex microsecond (datetime.time attribute)
@anchor{library/datetime datetime time microsecond}@anchor{290e}
@deffn {Attribute} time.microsecond

In @code{range(1000000)}.
@end deffn

@geindex tzinfo (datetime.time attribute)
@anchor{library/datetime datetime time tzinfo}@anchor{290f}
@deffn {Attribute} time.tzinfo

The object passed as the tzinfo argument to the @ref{1fd,,time} constructor, or
@code{None} if none was passed.
@end deffn

@geindex fold (datetime.time attribute)
@anchor{library/datetime datetime time fold}@anchor{e93}
@deffn {Attribute} time.fold

In @code{[0, 1]}. Used to disambiguate wall times during a repeated interval. (A
repeated interval occurs when clocks are rolled back at the end of daylight saving
time or when the UTC offset for the current zone is decreased for political reasons.)
The values 0 and 1 represent, respectively, the earlier and later of the two
moments with the same wall time representation.


Added in version 3.6.

@end deffn

@ref{1fd,,time} objects support equality and order comparisons,
where @code{a} is considered less than @code{b} when @code{a} precedes @code{b} in time.

Naive and aware @code{time} objects are never equal.
Order comparison between naive and aware @code{time} objects raises
@ref{199,,TypeError}.

If both comparands are aware, and have the same @ref{290f,,tzinfo}
attribute, the @code{tzinfo} and @code{fold} attributes are
ignored and the base times are compared. If both comparands are aware and
have different @code{tzinfo} attributes, the comparands are first adjusted by
subtracting their UTC offsets (obtained from @code{self.utcoffset()}).


Changed in version 3.3: Equality comparisons between aware and naive @ref{1fd,,time} instances
don’t raise @ref{199,,TypeError}.


In Boolean contexts, a @ref{1fd,,time} object is always considered to be true.


Changed in version 3.5: Before Python 3.5, a @ref{1fd,,time} object was considered to be false if it
represented midnight in UTC. This behavior was considered obscure and
error-prone and has been removed in Python 3.5. See bpo-13936@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13936} for more
information.


Other constructors:

@geindex fromisoformat() (datetime.time class method)
@anchor{library/datetime datetime time fromisoformat}@anchor{82a}
@deffn {Method} classmethod time.fromisoformat (time_string)

Return a @ref{1fd,,time} corresponding to a `time_string' in any valid
ISO 8601 format, with the following exceptions:


@enumerate 

@item 
Time zone offsets may have fractional seconds.

@item 
The leading @code{T}, normally required in cases where there may be ambiguity between
a date and a time, is not required.

@item 
Fractional seconds may have any number of digits (anything beyond 6 will
be truncated).

@item 
Fractional hours and minutes are not supported.
@end enumerate

Examples:

@example
>>> import datetime as dt
>>> dt.time.fromisoformat('04:23:01')
datetime.time(4, 23, 1)
>>> dt.time.fromisoformat('T04:23:01')
datetime.time(4, 23, 1)
>>> dt.time.fromisoformat('T042301')
datetime.time(4, 23, 1)
>>> dt.time.fromisoformat('04:23:01.000384')
datetime.time(4, 23, 1, 384)
>>> dt.time.fromisoformat('04:23:01,000384')
datetime.time(4, 23, 1, 384)
>>> dt.time.fromisoformat('04:23:01+04:00')
datetime.time(4, 23, 1, tzinfo=datetime.timezone(datetime.timedelta(seconds=14400)))
>>> dt.time.fromisoformat('04:23:01Z')
datetime.time(4, 23, 1, tzinfo=datetime.timezone.utc)
>>> dt.time.fromisoformat('04:23:01+00:00')
datetime.time(4, 23, 1, tzinfo=datetime.timezone.utc)
@end example


Added in version 3.7.



Changed in version 3.11: Previously, this method only supported formats that could be emitted by
@ref{294e,,time.isoformat()}.

@end deffn

@geindex strptime() (datetime.time class method)
@anchor{library/datetime datetime time strptime}@anchor{1990}
@deffn {Method} classmethod time.strptime (date_string, format)

Return a @ref{1fd,,time} corresponding to `date_string', parsed according to
`format'.

If `format' does not contain microseconds or timezone information, this is equivalent to:

@example
time(*(time.strptime(date_string, format)[3:6]))
@end example

@ref{2ee,,ValueError} is raised if the `date_string' and `format'
cannot be parsed by @code{time.strptime()} or if it returns a value which is not a
time tuple.  See also @ref{1b98,,strftime() and strptime() behavior} and
@ref{82a,,time.fromisoformat()}.


Added in version 3.14.

@end deffn

Instance methods:

@geindex replace() (datetime.time method)
@anchor{library/datetime datetime time replace}@anchor{1a41}
@deffn {Method} time.replace (hour=self.hour, minute=self.minute, second=self.second, microsecond=self.microsecond, tzinfo=self.tzinfo, *, fold=0)

Return a new @ref{1fd,,time} with the same values, but with specified
parameters updated. Note that @code{tzinfo=None} can be specified to create a
naive @code{time} from an aware @code{time}, without conversion of the
time data.

@ref{1fd,,time} objects are also supported by generic function
@ref{1c2,,copy.replace()}.


Changed in version 3.6: Added the `fold' parameter.

@end deffn

@geindex isoformat() (datetime.time method)
@anchor{library/datetime datetime time isoformat}@anchor{294e}
@deffn {Method} time.isoformat (timespec='auto')

Return a string representing the time in ISO 8601 format, one of:


@itemize -

@item 
@code{HH:MM:SS.ffffff}, if @ref{290e,,microsecond} is not 0

@item 
@code{HH:MM:SS}, if @ref{290e,,microsecond} is 0

@item 
@code{HH:MM:SS.ffffff+HH:MM[:SS[.ffffff]]}, if @ref{294f,,utcoffset()} does not return @code{None}

@item 
@code{HH:MM:SS+HH:MM[:SS[.ffffff]]}, if @ref{290e,,microsecond} is 0 and @ref{294f,,utcoffset()} does not return @code{None}
@end itemize

The optional argument `timespec' specifies the number of additional
components of the time to include (the default is @code{'auto'}).
It can be one of the following:


@itemize -

@item 
@code{'auto'}: Same as @code{'seconds'} if @ref{290e,,microsecond} is 0,
same as @code{'microseconds'} otherwise.

@item 
@code{'hours'}: Include the @ref{290b,,hour} in the two-digit @code{HH} format.

@item 
@code{'minutes'}: Include @ref{290b,,hour} and @ref{290c,,minute} in @code{HH:MM} format.

@item 
@code{'seconds'}: Include @ref{290b,,hour}, @ref{290c,,minute}, and @ref{290d,,second}
in @code{HH:MM:SS} format.

@item 
@code{'milliseconds'}: Include full time, but truncate fractional second
part to milliseconds. @code{HH:MM:SS.sss} format.

@item 
@code{'microseconds'}: Include full time in @code{HH:MM:SS.ffffff} format.
@end itemize

@cartouche
@quotation Note 
Excluded time components are truncated, not rounded.
@end quotation
@end cartouche

@ref{2ee,,ValueError} will be raised on an invalid `timespec' argument.

Example:

@example
>>> import datetime as dt
>>> dt.time(hour=12, minute=34, second=56, microsecond=123456).isoformat(timespec='minutes')
'12:34'
>>> my_time = dt.time(hour=12, minute=34, second=56, microsecond=0)
>>> my_time.isoformat(timespec='microseconds')
'12:34:56.000000'
>>> my_time.isoformat(timespec='auto')
'12:34:56'
@end example


Changed in version 3.6: Added the `timespec' parameter.

@end deffn

@geindex __str__() (datetime.time method)
@anchor{library/datetime datetime time __str__}@anchor{2950}
@deffn {Method} time.__str__ ()

For a time @code{t}, @code{str(t)} is equivalent to @code{t.isoformat()}.
@end deffn

@geindex strftime() (datetime.time method)
@anchor{library/datetime datetime time strftime}@anchor{1b3c}
@deffn {Method} time.strftime (format)

Return a string representing the time, controlled by an explicit format
string.  See also @ref{1b98,,strftime() and strptime() behavior} and @ref{294e,,time.isoformat()}.
@end deffn

@geindex __format__() (datetime.time method)
@anchor{library/datetime datetime time __format__}@anchor{2951}
@deffn {Method} time.__format__ (format)

Same as @ref{1b3c,,time.strftime()}. This makes it possible to specify
a format string for a @ref{1fd,,time} object in @ref{19b,,formatted string literals} and when using @ref{834,,str.format()}.
See also @ref{1b98,,strftime() and strptime() behavior} and @ref{294e,,time.isoformat()}.
@end deffn

@geindex utcoffset() (datetime.time method)
@anchor{library/datetime datetime time utcoffset}@anchor{294f}
@deffn {Method} time.utcoffset ()

If @ref{290f,,tzinfo} is @code{None}, returns @code{None}, else returns
@code{self.tzinfo.utcoffset(None)}, and raises an exception if the latter doesn’t
return @code{None} or a @ref{bc9,,timedelta} object with magnitude less than one day.


Changed in version 3.7: The UTC offset is not restricted to a whole number of minutes.

@end deffn

@geindex dst() (datetime.time method)
@anchor{library/datetime datetime time dst}@anchor{2952}
@deffn {Method} time.dst ()

If @ref{290f,,tzinfo} is @code{None}, returns @code{None}, else returns
@code{self.tzinfo.dst(None)}, and raises an exception if the latter doesn’t return
@code{None}, or a @ref{bc9,,timedelta} object with magnitude less than one day.


Changed in version 3.7: The DST offset is not restricted to a whole number of minutes.

@end deffn

@geindex tzname() (datetime.time method)
@anchor{library/datetime datetime time tzname}@anchor{2953}
@deffn {Method} time.tzname ()

If @ref{290f,,tzinfo} is @code{None}, returns @code{None}, else returns
@code{self.tzinfo.tzname(None)}, or raises an exception if the latter doesn’t
return @code{None} or a string object.
@end deffn

@menu
* Examples of usage; time: Examples of usage time. 

@end menu

@node Examples of usage time,,,time objects
@anchor{library/datetime examples-of-usage-time}@anchor{2954}
@subsubsection Examples of usage: @code{time}


Examples of working with a @ref{1fd,,time} object:

@example
>>> import datetime as dt
>>> class TZ1(dt.tzinfo):
...     def utcoffset(self, when):
...         return dt.timedelta(hours=1)
...     def dst(self, when):
...         return dt.timedelta(0)
...     def tzname(self, when):
...         return "+01:00"
...     def  __repr__(self):
...         return f"@{self.__class__.__name__@}()"
...
>>> t = dt.time(12, 10, 30, tzinfo=TZ1())
>>> t
datetime.time(12, 10, 30, tzinfo=TZ1())
>>> t.isoformat()
'12:10:30+01:00'
>>> t.dst()
datetime.timedelta(0)
>>> t.tzname()
'+01:00'
>>> t.strftime("%H:%M:%S %Z")
'12:10:30 +01:00'
>>> 'The @{@} is @{:%H:%M@}.'.format("time", t)
'The time is 12:10.'
@end example

@node tzinfo objects,timezone objects,time objects,datetime — Basic date and time types
@anchor{library/datetime datetime-tzinfo}@anchor{2955}@anchor{library/datetime tzinfo-objects}@anchor{2956}
@subsubsection @code{tzinfo} objects


@geindex tzinfo (class in datetime)
@anchor{library/datetime datetime tzinfo}@anchor{7f7}
@deffn {Class} datetime.tzinfo

This is an @ref{13c2,,abstract base class}, meaning that this class should not be
instantiated directly.  Define a subclass of @code{tzinfo} to capture
information about a particular time zone.

An instance of (a concrete subclass of) @code{tzinfo} can be passed to the
constructors for @ref{4e3,,datetime} and @ref{1fd,,time} objects. The latter objects
view their attributes as being in local time, and the @code{tzinfo} object
supports methods revealing offset of local time from UTC, the name of the time
zone, and DST offset, all relative to a date or time object passed to them.

You need to derive a concrete subclass, and (at least)
supply implementations of the standard @code{tzinfo} methods needed by the
@ref{4e3,,datetime} methods you use. The @code{datetime} module provides
@ref{12cb,,timezone}, a simple concrete subclass of @code{tzinfo} which can
represent time zones with fixed offset from UTC such as UTC itself or North
American EST and EDT.

Special requirement for pickling:  A @code{tzinfo} subclass must have an
@ref{8c1,,__init__()} method that can be called with no arguments,
otherwise it can be
pickled but possibly not unpickled again. This is a technical requirement that
may be relaxed in the future.

A concrete subclass of @code{tzinfo} may need to implement the following
methods. Exactly which methods are needed depends on the uses made of aware
@code{datetime} objects. If in doubt, simply implement all of them.
@end deffn

@geindex utcoffset() (datetime.tzinfo method)
@anchor{library/datetime datetime tzinfo utcoffset}@anchor{2957}
@deffn {Method} tzinfo.utcoffset (dt)

Return offset of local time from UTC, as a @ref{bc9,,timedelta} object that is
positive east of UTC. If local time is west of UTC, this should be negative.

This represents the `total' offset from UTC; for example, if a
@ref{7f7,,tzinfo} object represents both time zone and DST adjustments,
@code{utcoffset()} should return their sum. If the UTC offset isn’t known,
return @code{None}. Else the value returned must be a @ref{bc9,,timedelta} object
strictly between @code{-timedelta(hours=24)} and @code{timedelta(hours=24)}
(the magnitude of the offset must be less than one day). Most implementations
of @code{utcoffset()} will probably look like one of these two:

@example
return CONSTANT                 # fixed-offset class
return CONSTANT + self.dst(dt)  # daylight-aware class
@end example

If @code{utcoffset()} does not return @code{None}, @ref{2958,,dst()} should not return
@code{None} either.

The default implementation of @code{utcoffset()} raises
@ref{369,,NotImplementedError}.


Changed in version 3.7: The UTC offset is not restricted to a whole number of minutes.

@end deffn

@geindex dst() (datetime.tzinfo method)
@anchor{library/datetime datetime tzinfo dst}@anchor{2958}
@deffn {Method} tzinfo.dst (dt)

Return the daylight saving time (DST) adjustment, as a @ref{bc9,,timedelta}
object or
@code{None} if DST information isn’t known.

Return @code{timedelta(0)} if DST is not in effect.
If DST is in effect, return the offset as a @ref{bc9,,timedelta} object
(see @ref{2957,,utcoffset()} for details). Note that DST offset, if applicable, has
already been added to the UTC offset returned by @code{utcoffset()}, so there’s
no need to consult @code{dst()} unless you’re interested in obtaining DST info
separately. For example, @ref{293f,,datetime.timetuple()} calls its @ref{2917,,tzinfo}
attribute’s @code{dst()} method to determine how the @ref{2940,,tm_isdst} flag
should be set, and @ref{293d,,tzinfo.fromutc()} calls @code{dst()} to account for
DST changes when crossing time zones.

An instance `tz' of a @ref{7f7,,tzinfo} subclass that models both standard and
daylight times must be consistent in this sense:

@code{tz.utcoffset(dt) - tz.dst(dt)}

must return the same result for every @ref{4e3,,datetime} `dt' with @code{dt.tzinfo ==
tz}. For sane @code{tzinfo} subclasses, this expression yields the time
zone’s “standard offset”, which should not depend on the date or the time, but
only on geographic location. The implementation of @ref{bca,,datetime.astimezone()}
relies on this, but cannot detect violations; it’s the programmer’s
responsibility to ensure it. If a @code{tzinfo} subclass cannot guarantee
this, it may be able to override the default implementation of
@ref{293d,,tzinfo.fromutc()} to work correctly with @code{astimezone()} regardless.

Most implementations of @code{dst()} will probably look like one of these two:

@example
import datetime as dt

def dst(self, when):
    # a fixed-offset class:  doesn't account for DST
    return dt.timedelta(0)
@end example

or:

@example
import datetime as dt

def dst(self, when):
    # Code to set dston and dstoff to the time zone's DST
    # transition times based on the input when.year, and expressed
    # in standard local time.

    if dston <= when.replace(tzinfo=None) < dstoff:
        return dt.timedelta(hours=1)
    else:
        return dt.timedelta(0)
@end example

The default implementation of @code{dst()} raises @ref{369,,NotImplementedError}.


Changed in version 3.7: The DST offset is not restricted to a whole number of minutes.

@end deffn

@geindex tzname() (datetime.tzinfo method)
@anchor{library/datetime datetime tzinfo tzname}@anchor{2959}
@deffn {Method} tzinfo.tzname (dt)

Return the time zone name corresponding to the @ref{4e3,,datetime} object `dt', as
a string. Nothing about string names is defined by the @code{datetime} module,
and there’s no requirement that it mean anything in particular. For example,
@code{"GMT"}, @code{"UTC"}, @code{"-500"}, @code{"-5:00"}, @code{"EDT"}, @code{"US/Eastern"}, @code{"America/New York"} are all
valid replies. Return @code{None} if a string name isn’t known. Note that this is
a method rather than a fixed string primarily because some @ref{7f7,,tzinfo}
subclasses will wish to return different names depending on the specific value
of `dt' passed, especially if the @code{tzinfo} class is accounting for
daylight time.

The default implementation of @code{tzname()} raises @ref{369,,NotImplementedError}.
@end deffn

These methods are called by a @ref{4e3,,datetime} or @ref{1fd,,time} object, in
response to their methods of the same names. A @code{datetime} object passes
itself as the argument, and a @code{time} object passes @code{None} as the
argument. A @ref{7f7,,tzinfo} subclass’s methods should therefore be prepared to
accept a `dt' argument of @code{None}, or of class @code{datetime}.

When @code{None} is passed, it’s up to the class designer to decide the best
response. For example, returning @code{None} is appropriate if the class wishes to
say that time objects don’t participate in the @ref{7f7,,tzinfo} protocols. It
may be more useful for @code{utcoffset(None)} to return the standard UTC offset, as
there is no other convention for discovering the standard offset.

When a @ref{4e3,,datetime} object is passed in response to a @code{datetime}
method, @code{dt.tzinfo} is the same object as `self'. @ref{7f7,,tzinfo} methods can
rely on this, unless user code calls @code{tzinfo} methods directly. The
intent is that the @code{tzinfo} methods interpret `dt' as being in local
time, and not need worry about objects in other time zones.

There is one more @ref{7f7,,tzinfo} method that a subclass may wish to override:

@geindex fromutc() (datetime.tzinfo method)
@anchor{library/datetime datetime tzinfo fromutc}@anchor{293d}
@deffn {Method} tzinfo.fromutc (dt)

This is called from the default @ref{bca,,datetime.astimezone()}
implementation. When called from that, @code{dt.tzinfo} is `self', and `dt'’s
date and time data are to be viewed as expressing a UTC time. The purpose
of @code{fromutc()} is to adjust the date and time data, returning an
equivalent datetime in `self'’s local time.

Most @ref{7f7,,tzinfo} subclasses should be able to inherit the default
@code{fromutc()} implementation without problems. It’s strong enough to handle
fixed-offset time zones, and time zones accounting for both standard and
daylight time, and the latter even if the DST transition times differ in
different years. An example of a time zone the default @code{fromutc()}
implementation may not handle correctly in all cases is one where the standard
offset (from UTC) depends on the specific date and time passed, which can happen
for political reasons. The default implementations of @ref{bca,,astimezone()} and
@code{fromutc()} may not produce the result you want if the result is one of the
hours straddling the moment the standard offset changes.

Skipping code for error cases, the default @code{fromutc()} implementation acts
like:

@example
import datetime as dt

def fromutc(self, when):
    # raise ValueError error if when.tzinfo is not self
    dtoff = when.utcoffset()
    dtdst = when.dst()
    # raise ValueError if dtoff is None or dtdst is None
    delta = dtoff - dtdst  # this is self's standard offset
    if delta:
        when += delta   # convert to standard local time
        dtdst = when.dst()
        # raise ValueError if dtdst is None
    if dtdst:
        return when + dtdst
    else:
        return when
@end example
@end deffn

In the following @code{tzinfo_examples.py} file there are some examples of
@ref{7f7,,tzinfo} classes:

@example
import datetime as dt

# A class capturing the platform's idea of local time.
# (May result in wrong values on historical times in
#  timezones where UTC offset and/or the DST rules had
#  changed in the past.)
import time

ZERO = dt.timedelta(0)
HOUR = dt.timedelta(hours=1)
SECOND = dt.timedelta(seconds=1)

STDOFFSET = dt.timedelta(seconds=-time.timezone)
if time.daylight:
    DSTOFFSET = dt.timedelta(seconds=-time.altzone)
else:
    DSTOFFSET = STDOFFSET

DSTDIFF = DSTOFFSET - STDOFFSET


class LocalTimezone(dt.tzinfo):

    def fromutc(self, when):
        assert when.tzinfo is self
        stamp = (when - dt.datetime(1970, 1, 1, tzinfo=self)) // SECOND
        args = time.localtime(stamp)[:6]
        dst_diff = DSTDIFF // SECOND
        # Detect fold
        fold = (args == time.localtime(stamp - dst_diff))
        return dt.datetime(*args, microsecond=when.microsecond,
                           tzinfo=self, fold=fold)

    def utcoffset(self, when):
        if self._isdst(when):
            return DSTOFFSET
        else:
            return STDOFFSET

    def dst(self, when):
        if self._isdst(when):
            return DSTDIFF
        else:
            return ZERO

    def tzname(self, when):
        return time.tzname[self._isdst(when)]

    def _isdst(self, when):
        tt = (when.year, when.month, when.day,
              when.hour, when.minute, when.second,
              when.weekday(), 0, 0)
        stamp = time.mktime(tt)
        tt = time.localtime(stamp)
        return tt.tm_isdst > 0


Local = LocalTimezone()


# A complete implementation of current DST rules for major US time zones.

def first_sunday_on_or_after(when):
    days_to_go = 6 - when.weekday()
    if days_to_go:
        when += dt.timedelta(days_to_go)
    return when


# US DST Rules
#
# This is a simplified (i.e., wrong for a few cases) set of rules for US
# DST start and end times. For a complete and up-to-date set of DST rules
# and timezone definitions, visit the Olson Database (or try pytz):
# http://www.twinsun.com/tz/tz-link.htm
# https://sourceforge.net/projects/pytz/ (might not be up-to-date)
#
# In the US, since 2007, DST starts at 2am (standard time) on the second
# Sunday in March, which is the first Sunday on or after Mar 8.
DSTSTART_2007 = dt.datetime(1, 3, 8, 2)
# and ends at 2am (DST time) on the first Sunday of Nov.
DSTEND_2007 = dt.datetime(1, 11, 1, 2)
# From 1987 to 2006, DST used to start at 2am (standard time) on the first
# Sunday in April and to end at 2am (DST time) on the last
# Sunday of October, which is the first Sunday on or after Oct 25.
DSTSTART_1987_2006 = dt.datetime(1, 4, 1, 2)
DSTEND_1987_2006 = dt.datetime(1, 10, 25, 2)
# From 1967 to 1986, DST used to start at 2am (standard time) on the last
# Sunday in April (the one on or after April 24) and to end at 2am (DST time)
# on the last Sunday of October, which is the first Sunday
# on or after Oct 25.
DSTSTART_1967_1986 = dt.datetime(1, 4, 24, 2)
DSTEND_1967_1986 = DSTEND_1987_2006


def us_dst_range(year):
    # Find start and end times for US DST. For years before 1967, return
    # start = end for no DST.
    if 2006 < year:
        dststart, dstend = DSTSTART_2007, DSTEND_2007
    elif 1986 < year < 2007:
        dststart, dstend = DSTSTART_1987_2006, DSTEND_1987_2006
    elif 1966 < year < 1987:
        dststart, dstend = DSTSTART_1967_1986, DSTEND_1967_1986
    else:
        return (dt.datetime(year, 1, 1), ) * 2

    start = first_sunday_on_or_after(dststart.replace(year=year))
    end = first_sunday_on_or_after(dstend.replace(year=year))
    return start, end


class USTimeZone(dt.tzinfo):

    def __init__(self, hours, reprname, stdname, dstname):
        self.stdoffset = dt.timedelta(hours=hours)
        self.reprname = reprname
        self.stdname = stdname
        self.dstname = dstname

    def __repr__(self):
        return self.reprname

    def tzname(self, when):
        if self.dst(when):
            return self.dstname
        else:
            return self.stdname

    def utcoffset(self, when):
        return self.stdoffset + self.dst(when)

    def dst(self, when):
        if when is None or when.tzinfo is None:
            # An exception may be sensible here, in one or both cases.
            # It depends on how you want to treat them.  The default
            # fromutc() implementation (called by the default astimezone()
            # implementation) passes a datetime with when.tzinfo is self.
            return ZERO
        assert when.tzinfo is self
        start, end = us_dst_range(when.year)
        # Can't compare naive to aware objects, so strip the timezone from
        # when first.
        when = when.replace(tzinfo=None)
        if start + HOUR <= when < end - HOUR:
            # DST is in effect.
            return HOUR
        if end - HOUR <= when < end:
            # Fold (an ambiguous hour): use when.fold to disambiguate.
            return ZERO if when.fold else HOUR
        if start <= when < start + HOUR:
            # Gap (a non-existent hour): reverse the fold rule.
            return HOUR if when.fold else ZERO
        # DST is off.
        return ZERO

    def fromutc(self, when):
        assert when.tzinfo is self
        start, end = us_dst_range(when.year)
        start = start.replace(tzinfo=self)
        end = end.replace(tzinfo=self)
        std_time = when + self.stdoffset
        dst_time = std_time + HOUR
        if end <= dst_time < end + HOUR:
            # Repeated hour
            return std_time.replace(fold=1)
        if std_time < start or dst_time >= end:
            # Standard time
            return std_time
        if start <= std_time < end - HOUR:
            # Daylight saving time
            return dst_time


Eastern  = USTimeZone(-5, "Eastern",  "EST", "EDT")
Central  = USTimeZone(-6, "Central",  "CST", "CDT")
Mountain = USTimeZone(-7, "Mountain", "MST", "MDT")
Pacific  = USTimeZone(-8, "Pacific",  "PST", "PDT")
@end example

Note that there are unavoidable subtleties twice per year in a @ref{7f7,,tzinfo}
subclass accounting for both standard and daylight time, at the DST transition
points. For concreteness, consider US Eastern (UTC -0500), where EDT begins the
minute after 1:59 (EST) on the second Sunday in March, and ends the minute after
1:59 (EDT) on the first Sunday in November:

@example
  UTC   3:MM  4:MM  5:MM  6:MM  7:MM  8:MM
  EST  22:MM 23:MM  0:MM  1:MM  2:MM  3:MM
  EDT  23:MM  0:MM  1:MM  2:MM  3:MM  4:MM

start  22:MM 23:MM  0:MM  1:MM  3:MM  4:MM

  end  23:MM  0:MM  1:MM  1:MM  2:MM  3:MM
@end example

When DST starts (the “start” line), the local wall clock leaps from 1:59 to
3:00. A wall time of the form 2:MM doesn’t really make sense on that day, so
@code{astimezone(Eastern)} won’t deliver a result with @code{hour == 2} on the day DST
begins. For example, at the Spring forward transition of 2016, we get:

@example
>>> import datetime as dt
>>> from tzinfo_examples import HOUR, Eastern
>>> u0 = dt.datetime(2016, 3, 13, 5, tzinfo=dt.timezone.utc)
>>> for i in range(4):
...     u = u0 + i*HOUR
...     t = u.astimezone(Eastern)
...     print(u.time(), 'UTC =', t.time(), t.tzname())
...
05:00:00 UTC = 00:00:00 EST
06:00:00 UTC = 01:00:00 EST
07:00:00 UTC = 03:00:00 EDT
08:00:00 UTC = 04:00:00 EDT
@end example

When DST ends (the “end” line), there’s a potentially worse problem: there’s an
hour that can’t be spelled unambiguously in local wall time: the last hour of
daylight time. In Eastern, that’s times of the form 5:MM UTC on the day
daylight time ends. The local wall clock leaps from 1:59 (daylight time) back
to 1:00 (standard time) again. Local times of the form 1:MM are ambiguous.
@ref{bca,,astimezone()} mimics the local clock’s behavior by mapping two adjacent UTC
hours into the same local hour then. In the Eastern example, UTC times of the
form 5:MM and 6:MM both map to 1:MM when converted to Eastern, but earlier times
have the @ref{e57,,fold} attribute set to 0 and the later times have it set to 1.
For example, at the Fall back transition of 2016, we get:

@example
>>> import datetime as dt
>>> from tzinfo_examples import HOUR, Eastern
>>> u0 = dt.datetime(2016, 11, 6, 4, tzinfo=dt.timezone.utc)
>>> for i in range(4):
...     u = u0 + i*HOUR
...     t = u.astimezone(Eastern)
...     print(u.time(), 'UTC =', t.time(), t.tzname(), t.fold)
...
04:00:00 UTC = 00:00:00 EDT 0
05:00:00 UTC = 01:00:00 EDT 0
06:00:00 UTC = 01:00:00 EST 1
07:00:00 UTC = 02:00:00 EST 0
@end example

Note that the @ref{4e3,,datetime} instances that differ only by the value of the
@ref{e57,,fold} attribute are considered equal in comparisons.

Applications that can’t bear wall-time ambiguities should explicitly check the
value of the @ref{e57,,fold} attribute or avoid using hybrid
@ref{7f7,,tzinfo} subclasses; there are no ambiguities when using @ref{12cb,,timezone},
or any other fixed-offset @code{tzinfo} subclass (such as a class representing
only EST (fixed offset -5 hours), or only EDT (fixed offset -4 hours)).


@subsubheading See also


@quotation


@table @asis

@item @ref{13b,,zoneinfo}

The @code{datetime} module has a basic @ref{12cb,,timezone} class (for
handling arbitrary fixed offsets from UTC) and its @ref{828,,timezone.utc}
attribute (a UTC @code{timezone} instance).

@code{zoneinfo} brings the `IANA time zone database' (also known as the Olson
database) to Python, and its usage is recommended.
@end table
@end quotation


@table @asis

@item IANA time zone database@footnote{https://www.iana.org/time-zones}

The Time Zone Database (often called tz, tzdata or zoneinfo) contains code
and data that represent the history of local time for many representative
locations around the globe. It is updated periodically to reflect changes
made by political bodies to time zone boundaries, UTC offsets, and
daylight-saving rules.
@end table


@node timezone objects,strftime and strptime behavior,tzinfo objects,datetime — Basic date and time types
@anchor{library/datetime datetime-timezone}@anchor{295a}@anchor{library/datetime timezone-objects}@anchor{295b}
@subsubsection @code{timezone} objects


The @ref{12cb,,timezone} class is a subclass of @ref{7f7,,tzinfo}, each
instance of which represents a time zone defined by a fixed offset from
UTC.

Objects of this class cannot be used to represent time zone information in the
locations where different offsets are used in different days of the year or
where historical changes have been made to civil time.

@geindex timezone (class in datetime)
@anchor{library/datetime datetime timezone}@anchor{12cb}
@deffn {Class} datetime.timezone (offset, name=None)

The `offset' argument must be specified as a @ref{bc9,,timedelta}
object representing the difference between the local time and UTC. It must
be strictly between @code{-timedelta(hours=24)} and
@code{timedelta(hours=24)}, otherwise @ref{2ee,,ValueError} is raised.

The `name' argument is optional. If specified it must be a string that
will be used as the value returned by the @ref{293e,,datetime.tzname()} method.


Added in version 3.2.



Changed in version 3.7: The UTC offset is not restricted to a whole number of minutes.

@end deffn

@geindex utcoffset() (datetime.timezone method)
@anchor{library/datetime datetime timezone utcoffset}@anchor{295c}
@deffn {Method} timezone.utcoffset (dt)

Return the fixed value specified when the @ref{12cb,,timezone} instance is
constructed.

The `dt' argument is ignored. The return value is a @ref{bc9,,timedelta}
instance equal to the difference between the local time and UTC.


Changed in version 3.7: The UTC offset is not restricted to a whole number of minutes.

@end deffn

@geindex tzname() (datetime.timezone method)
@anchor{library/datetime datetime timezone tzname}@anchor{295d}
@deffn {Method} timezone.tzname (dt)

Return the fixed value specified when the @ref{12cb,,timezone} instance
is constructed.

If `name' is not provided in the constructor, the name returned by
@code{tzname(dt)} is generated from the value of the @code{offset} as follows. If
`offset' is @code{timedelta(0)}, the name is “UTC”, otherwise it is a string in
the format @code{UTC±HH:MM}, where ± is the sign of @code{offset}, HH and MM are
two digits of @code{offset.hours} and @code{offset.minutes} respectively.


Changed in version 3.6: Name generated from @code{offset=timedelta(0)} is now plain @code{'UTC'}, not
@code{'UTC+00:00'}.

@end deffn

@geindex dst() (datetime.timezone method)
@anchor{library/datetime datetime timezone dst}@anchor{295e}
@deffn {Method} timezone.dst (dt)

Always returns @code{None}.
@end deffn

@geindex fromutc() (datetime.timezone method)
@anchor{library/datetime datetime timezone fromutc}@anchor{295f}
@deffn {Method} timezone.fromutc (dt)

Return @code{dt + offset}. The `dt' argument must be an aware
@ref{4e3,,datetime} instance, with @code{tzinfo} set to @code{self}.
@end deffn

Class attributes:

@geindex utc (datetime.timezone attribute)
@anchor{library/datetime datetime timezone utc}@anchor{828}
@deffn {Attribute} timezone.utc

The UTC time zone, @code{timezone(timedelta(0))}.
@end deffn

@geindex % (percent); datetime format

@node strftime and strptime behavior,,timezone objects,datetime — Basic date and time types
@anchor{library/datetime strftime-and-strptime-behavior}@anchor{2960}@anchor{library/datetime strftime-strptime-behavior}@anchor{1b98}
@subsubsection @code{strftime()} and @code{strptime()} behavior


@ref{1fc,,date}, @ref{4e3,,datetime}, and @ref{1fd,,time} objects all support a
@code{strftime(format)} method, to create a string representing the time under the
control of an explicit format string.

Conversely, the @ref{1fb,,date.strptime()}, @ref{1994,,datetime.strptime()} and
@ref{1639,,time.strptime()} class methods create an object from a string
representing the time and a corresponding format string.

The table below provides a high-level comparison of @ref{e94,,strftime()}
versus @ref{1994,,strptime()}:


@multitable {xxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

@tab

@code{strftime}

@tab

@code{strptime}

@item

Usage

@tab

Convert object to a string according to a given format

@tab

Parse a string into an object given a corresponding format

@item

Type of method

@tab

Instance method

@tab

Class method

@item

Signature

@tab

@code{strftime(format)}

@tab

@code{strptime(date_string, format)}

@end multitable


@quotation
@anchor{library/datetime format-codes}@anchor{2901}
@end quotation

@menu
* strftime() and strptime() format codes: strftime and strptime format codes. 
* Technical detail:: 

@end menu

@node strftime and strptime format codes,Technical detail,,strftime and strptime behavior
@anchor{library/datetime strftime-and-strptime-format-codes}@anchor{2961}
@subsubsection @code{strftime()} and @code{strptime()} format codes


These methods accept format codes that can be used to parse and format dates:

@example
>>> import datetime as dt
>>> dt.datetime.strptime('31/01/22 23:59:59.999999',
...                      '%d/%m/%y %H:%M:%S.%f')
datetime.datetime(2022, 1, 31, 23, 59, 59, 999999)
>>> _.strftime('%a %d %b %Y, %I:%M%p')
'Mon 31 Jan 2022, 11:59PM'
@end example

The following is a list of all the format codes that the 1989 C standard
requires, and these work on all platforms with a standard C implementation.


@multitable {xxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxx} 
@headitem

Directive

@tab

Meaning

@tab

Example

@tab

Notes

@item

@code{%a}

@tab

Weekday as locale’s
abbreviated name.

@tab


@display
Sun, Mon, …, Sat (en_US);@w{ }
So, Mo, …, Sa (de_DE)@w{ }
@end display



@tab

(1)

@item

@code{%A}

@tab

Weekday as locale’s full name.

@tab


@display
Sunday, Monday, …, Saturday (en_US);@w{ }
Sonntag, Montag, …, Samstag (de_DE)@w{ }
@end display



@tab

(1)

@item

@code{%w}

@tab

Weekday as a decimal number,
where 0 is Sunday and 6 is
Saturday.

@tab

0, 1, …, 6

@tab

@item

@code{%d}

@tab

Day of the month as a
zero-padded decimal number.

@tab

01, 02, …, 31

@tab

(9)

@item

@code{%b}

@tab

Month as locale’s abbreviated
name.

@tab


@display
Jan, Feb, …, Dec (en_US);@w{ }
Jan, Feb, …, Dez (de_DE)@w{ }
@end display



@tab

(1)

@item

@code{%B}

@tab

Month as locale’s full name.

@tab


@display
January, February, …, December (en_US);@w{ }
Januar, Februar, …, Dezember (de_DE)@w{ }
@end display



@tab

(1)

@item

@code{%m}

@tab

Month as a zero-padded
decimal number.

@tab

01, 02, …, 12

@tab

(9)

@item

@code{%y}

@tab

Year without century as a
zero-padded decimal number.

@tab

00, 01, …, 99

@tab

(9)

@item

@code{%Y}

@tab

Year with century as a decimal
number.

@tab

0001, 0002, …, 2013,
2014, …, 9998, 9999

@tab

(2)

@item

@code{%H}

@tab

Hour (24-hour clock) as a
zero-padded decimal number.

@tab

00, 01, …, 23

@tab

(9)

@item

@code{%I}

@tab

Hour (12-hour clock) as a
zero-padded decimal number.

@tab

01, 02, …, 12

@tab

(9)

@item

@code{%p}

@tab

Locale’s equivalent of either
AM or PM.

@tab


@display
AM, PM (en_US);@w{ }
am, pm (de_DE)@w{ }
@end display



@tab

(1),
(3)

@item

@code{%M}

@tab

Minute as a zero-padded
decimal number.

@tab

00, 01, …, 59

@tab

(9)

@item

@code{%S}

@tab

Second as a zero-padded
decimal number.

@tab

00, 01, …, 59

@tab

(4),
(9)

@item

@code{%f}

@tab

Microsecond as a decimal
number, zero-padded to 6
digits.

@tab

000000, 000001, …,
999999

@tab

(5)

@item

@code{%z}

@tab

UTC offset in the form
@code{±HHMM[SS[.ffffff]]} (empty
string if the object is
naive).

@tab

(empty), +0000,
-0400, +1030,
+063415,
-030712.345216

@tab

(6)

@item

@code{%Z}

@tab

Time zone name (empty string
if the object is naive).

@tab

(empty), UTC, GMT

@tab

(6)

@item

@code{%j}

@tab

Day of the year as a
zero-padded decimal number.

@tab

001, 002, …, 366

@tab

(9)

@item

@code{%U}

@tab

Week number of the year
(Sunday as the first day of
the week) as a zero-padded
decimal number. All days in a
new year preceding the first
Sunday are considered to be in
week 0.

@tab

00, 01, …, 53

@tab

(7),
(9)

@item

@code{%W}

@tab

Week number of the year
(Monday as the first day of
the week) as a zero-padded
decimal number. All days in a
new year preceding the first
Monday are considered to be in
week 0.

@tab

00, 01, …, 53

@tab

(7),
(9)

@item

@code{%c}

@tab

Locale’s appropriate date and
time representation.

@tab


@display
Tue Aug 16 21:30:00 1988 (en_US);@w{ }
Di 16 Aug 21:30:00 1988 (de_DE)@w{ }
@end display



@tab

(1)

@item

@code{%x}

@tab

Locale’s appropriate date
representation.

@tab


@display
08/16/88 (None);@w{ }
08/16/1988 (en_US);@w{ }
16.08.1988 (de_DE)@w{ }
@end display



@tab

(1)

@item

@code{%X}

@tab

Locale’s appropriate time
representation.

@tab


@display
21:30:00 (en_US);@w{ }
21:30:00 (de_DE)@w{ }
@end display



@tab

(1)

@item

@code{%%}

@tab

A literal @code{'%'} character.

@tab

%

@tab

@end multitable


Several additional directives not required by the C89 standard are included for
convenience. These parameters all correspond to ISO 8601 date values.


@multitable {xxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxx} 
@headitem

Directive

@tab

Meaning

@tab

Example

@tab

Notes

@item

@code{%G}

@tab

ISO 8601 year with century
representing the year that
contains the greater part of
the ISO week (@code{%V}).

@tab

0001, 0002, …, 2013,
2014, …, 9998, 9999

@tab

(8)

@item

@code{%u}

@tab

ISO 8601 weekday as a decimal
number where 1 is Monday.

@tab

1, 2, …, 7

@tab

@item

@code{%V}

@tab

ISO 8601 week as a decimal
number with Monday as
the first day of the week.
Week 01 is the week containing
Jan 4.

@tab

01, 02, …, 53

@tab

(8),
(9)

@item

@code{%:z}

@tab

UTC offset in the form
@code{±HH:MM[:SS[.ffffff]]}
(empty string if the object is
naive).

@tab

(empty), +00:00,
-04:00, +10:30,
+06:34:15,
-03:07:12.345216

@tab

(6)

@end multitable


These may not be available on all platforms when used with the @ref{e94,,strftime()}
method. The ISO 8601 year and ISO 8601 week directives are not interchangeable
with the year and week number directives above. Calling @ref{1994,,strptime()} with
incomplete or ambiguous ISO 8601 directives will raise a @ref{2ee,,ValueError}.

The full set of format codes supported varies across platforms, because Python
calls the platform C library’s @code{strftime()} function, and platform
variations are common. To see the full set of format codes supported on your
platform, consult the @code{strftime(3)@footnote{https://manpages.debian.org/strftime(3)}} documentation. There are also
differences between platforms in handling of unsupported format specifiers.


Added in version 3.6: @code{%G}, @code{%u} and @code{%V} were added.



Added in version 3.12: @code{%:z} was added.


@node Technical detail,,strftime and strptime format codes,strftime and strptime behavior
@anchor{library/datetime technical-detail}@anchor{2962}
@subsubsection Technical detail


Broadly speaking, @code{d.strftime(fmt)} acts like the @ref{f4,,time} module’s
@code{time.strftime(fmt, d.timetuple())} although not all objects support a
@ref{2928,,timetuple()} method.

For the @ref{1994,,datetime.strptime()} and @ref{1fb,,date.strptime()} class methods,
the default value is @code{1900-01-01T00:00:00.000}: any components not specified
in the format string will be pulled from the default value.

@cartouche
@quotation Note 
Format strings without separators can be ambiguous for parsing. For
example, with @code{%Y%m%d}, the string @code{2026111} may be parsed either as
@code{2026-11-01} or as @code{2026-01-11}.
Use separators to ensure the input is parsed as intended.
@end quotation
@end cartouche

@cartouche
@quotation Note 
When used to parse partial dates lacking a year, @ref{1994,,datetime.strptime()}
and @ref{1fb,,date.strptime()} will raise when encountering February 29 because
the default year of 1900 is `not' a leap year.  Always add a default leap
year to partial date strings before parsing.
@end quotation
@end cartouche

@c # doctest seems to turn the warning into an error which makes it
@c # show up and require matching and prevents the actual interesting
@c # exception from being raised.
@c # Manually apply the catch_warnings context manager
@c import warnings
@c catch_warnings = warnings.catch_warnings()
@c catch_warnings.__enter__()
@c warnings.simplefilter("ignore")

@c catch_warnings.__exit__()

@example
>>> import datetime as dt
>>> value = "2/29"
>>> dt.datetime.strptime(value, "%m/%d")
Traceback (most recent call last):
...
ValueError: day 29 must be in range 1..28 for month 2 in year 1900
>>> dt.datetime.strptime(f"1904 @{value@}", "%Y %m/%d")
datetime.datetime(1904, 2, 29, 0, 0)
@end example

Using @code{datetime.strptime(date_string, format)} is equivalent to:

@example
datetime(*(time.strptime(date_string, format)[0:6]))
@end example

except when the format includes sub-second components or time zone offset
information, which are supported in @code{datetime.strptime} but are discarded by
@code{time.strptime}.

For @ref{1fd,,time} objects, the format codes for year, month, and day should not
be used, as @code{time} objects have no such values. If they’re used anyway,
1900 is substituted for the year, and 1 for the month and day.

For @ref{1fc,,date} objects, the format codes for hours, minutes, seconds, and
microseconds should not be used, as @code{date} objects have no such
values. If they’re used anyway, 0 is substituted for them.

For the same reason, handling of format strings containing Unicode code points
that can’t be represented in the charset of the current locale is also
platform-dependent. On some platforms such code points are preserved intact in
the output, while on others @code{strftime} may raise @ref{460,,UnicodeError} or return
an empty string instead.

Notes:


@enumerate 

@item 
Because the format depends on the current locale, care should be taken when
making assumptions about the output value. Field orderings will vary (for
example, “month/day/year” versus “day/month/year”), and the output may
contain non-ASCII characters.

@item 
The @ref{1994,,strptime()} method can parse years in the full [1, 9999] range, but
years < 1000 must be zero-filled to 4-digit width.


Changed in version 3.2: In previous versions, @ref{e94,,strftime()} method was restricted to
years >= 1900.



Changed in version 3.3: In version 3.2, @ref{e94,,strftime()} method was restricted to
years >= 1000.


@item 
When used with the @ref{1994,,strptime()} method, the @code{%p} directive only affects
the output hour field if the @code{%I} directive is used to parse the hour.

@item 
Unlike the @ref{f4,,time} module, the @code{datetime} module does not support
leap seconds.

@item 
When used with the @ref{1994,,strptime()} method, the @code{%f} directive
accepts from one to six digits and zero pads on the right. @code{%f} is
an extension to the set of format characters in the C standard (but
implemented separately in datetime objects, and therefore always
available).

@item 
For a naive object, the @code{%z}, @code{%:z} and @code{%Z} format codes are replaced
by empty strings.

For an aware object:


@table @asis

@item @code{%z}

@ref{293b,,utcoffset()} is transformed into a string of the form
@code{±HHMM[SS[.ffffff]]}, where @code{HH} is a 2-digit string giving the number
of UTC offset hours, @code{MM} is a 2-digit string giving the number of UTC
offset minutes, @code{SS} is a 2-digit string giving the number of UTC offset
seconds and @code{ffffff} is a 6-digit string giving the number of UTC
offset microseconds. The @code{ffffff} part is omitted when the offset is a
whole number of seconds and both the @code{ffffff} and the @code{SS} part is
omitted when the offset is a whole number of minutes. For example, if
@code{utcoffset()} returns @code{timedelta(hours=-3, minutes=-30)}, @code{%z} is
replaced with the string @code{'-0330'}.
@end table


Changed in version 3.7: The UTC offset is not restricted to a whole number of minutes.



Changed in version 3.7: When the @code{%z} directive is provided to the  @ref{1994,,strptime()} method,
the UTC offsets can have a colon as a separator between hours, minutes
and seconds.
For example, @code{'+01:00:00'} will be parsed as an offset of one hour.
In addition, providing @code{'Z'} is identical to @code{'+00:00'}.



@table @asis

@item @code{%:z}

Behaves exactly as @code{%z}, but has a colon separator added between
hours, minutes and seconds.

@item @code{%Z}

In @ref{e94,,strftime()}, @code{%Z} is replaced by an empty string if
@ref{293e,,tzname()} returns @code{None}; otherwise @code{%Z} is replaced by the
returned value, which must be a string.

@ref{1994,,strptime()} only accepts certain values for @code{%Z}:


@enumerate 

@item 
any value in @code{time.tzname} for your machine’s locale

@item 
the hard-coded values @code{UTC} and @code{GMT}
@end enumerate

So someone living in Japan may have @code{JST}, @code{UTC}, and @code{GMT} as
valid values, but probably not @code{EST}. It will raise @code{ValueError} for
invalid values.
@end table


Changed in version 3.2: When the @code{%z} directive is provided to the @ref{1994,,strptime()} method, an
aware @ref{4e3,,datetime} object will be produced. The @code{tzinfo} of the
result will be set to a @ref{12cb,,timezone} instance.


@item 
When used with the @ref{1994,,strptime()} method, @code{%U} and @code{%W} are only used
in calculations when the day of the week and the calendar year (@code{%Y})
are specified.

@item 
Similar to @code{%U} and @code{%W}, @code{%V} is only used in calculations when the
day of the week and the ISO year (@code{%G}) are specified in a
@ref{1994,,strptime()} format string. Also note that @code{%G} and @code{%Y} are not
interchangeable.

@item 
When used with the @ref{1994,,strptime()} method, the leading zero is optional
for  formats @code{%d}, @code{%m}, @code{%H}, @code{%I}, @code{%M}, @code{%S}, @code{%j}, @code{%U},
@code{%W}, and @code{%V}. Format @code{%y} does require a leading zero.

@item 
When parsing a month and day using @ref{1994,,strptime()}, always
include a year in the format.  If the value you need to parse lacks a year,
append an explicit dummy leap year.  Otherwise your code will raise an
exception when it encounters leap day because the default year used by the
parser (1900) is not a leap year.  Users run into that bug every leap year.

@example
>>> month_day = "02/29"
>>> dt.datetime.strptime(f"@{month_day@};1984", "%m/%d;%Y")  # No leap year bug.
datetime.datetime(1984, 2, 29, 0, 0)
@end example


Deprecated since version 3.13, will be removed in version 3.15: @ref{1994,,strptime()} calls using a format string containing
a day of month without a year now emit a
@ref{1a4,,DeprecationWarning}. In 3.15 or later we may change this into
an error or change the default year to a leap year. See gh-70647@footnote{https://github.com/python/cpython/issues/70647}.

@end enumerate

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node zoneinfo — IANA time zone support,calendar — General calendar-related functions,datetime — Basic date and time types,Data Types
@anchor{library/zoneinfo doc}@anchor{2963}@anchor{library/zoneinfo module-zoneinfo}@anchor{13b}@anchor{library/zoneinfo translation-repo}@anchor{2964}@anchor{library/zoneinfo zoneinfo-iana-time-zone-support}@anchor{2965}
@subsection @code{zoneinfo} — IANA time zone support


@geindex module; zoneinfo


Added in version 3.9.


`Source code:' Lib/zoneinfo@footnote{https://github.com/python/cpython/tree/3.14/Lib/zoneinfo}


__________________________________________________________________


The @code{zoneinfo} module provides a concrete time zone implementation to
support the IANA time zone database as originally specified in 
@geindex Python Enhancement Proposals; PEP 615
PEP 615@footnote{https://peps.python.org/pep-0615/}. By
default, @code{zoneinfo} uses the system’s time zone data if available; if no
system time zone data is available, the library will fall back to using the
first-party tzdata@footnote{https://pypi.org/project/tzdata/} package available on PyPI.


@subsubheading See also



@table @asis

@item Module: @ref{34,,datetime}

Provides the @ref{1fd,,time} and @ref{4e3,,datetime}
types with which the @ref{ae2,,ZoneInfo} class is designed to be used.

@item Package tzdata@footnote{https://pypi.org/project/tzdata/}

First-party package maintained by the CPython core developers to supply
time zone data via PyPI.
@end table


@c include for modules that don't work on WASM

@ref{2181,,Availability}: not WASI.

This module does not work or is not available on WebAssembly. See
@ref{1bae,,WebAssembly platforms} for more information.

@menu
* Using ZoneInfo:: 
* Data sources:: 
* The ZoneInfo class:: 
* Functions: Functions<3>. 
* Globals:: 
* Exceptions and warnings:: 

@end menu

@node Using ZoneInfo,Data sources,,zoneinfo — IANA time zone support
@anchor{library/zoneinfo using-zoneinfo}@anchor{2966}
@subsubsection Using @code{ZoneInfo}


@ref{ae2,,ZoneInfo} is a concrete implementation of the @ref{7f7,,datetime.tzinfo}
abstract base class, and is intended to be attached to @code{tzinfo}, either via
the constructor, the @ref{16d7,,datetime.replace}
method or @ref{bca,,datetime.astimezone}:

@example
>>> from zoneinfo import ZoneInfo
>>> import datetime as dt

>>> when = dt.datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("America/Los_Angeles"))
>>> print(when)
2020-10-31 12:00:00-07:00

>>> when.tzname()
'PDT'
@end example

Datetimes constructed in this way are compatible with datetime arithmetic and
handle daylight saving time transitions with no further intervention:

@example
>>> when_add = when + dt.timedelta(days=1)

>>> print(when_add)
2020-11-01 12:00:00-08:00

>>> when_add.tzname()
'PST'
@end example

These time zones also support the @ref{e57,,fold} attribute
introduced in 
@geindex Python Enhancement Proposals; PEP 495
PEP 495@footnote{https://peps.python.org/pep-0495/}.  During offset transitions which induce ambiguous
times (such as a daylight saving time to standard time transition), the offset
from `before' the transition is used when @code{fold=0}, and the offset `after'
the transition is used when @code{fold=1}, for example:

@example
>>> when = dt.datetime(2020, 11, 1, 1, tzinfo=ZoneInfo("America/Los_Angeles"))
>>> print(when)
2020-11-01 01:00:00-07:00

>>> print(when.replace(fold=1))
2020-11-01 01:00:00-08:00
@end example

When converting from another time zone, the fold will be set to the correct
value:

@example
>>> LOS_ANGELES = ZoneInfo("America/Los_Angeles")
>>> when_utc = dt.datetime(2020, 11, 1, 8, tzinfo=dt.timezone.utc)

>>> # Before the PDT -> PST transition
>>> print(when_utc.astimezone(LOS_ANGELES))
2020-11-01 01:00:00-07:00

>>> # After the PDT -> PST transition
>>> print((when_utc + dt.timedelta(hours=1)).astimezone(LOS_ANGELES))
2020-11-01 01:00:00-08:00
@end example

@node Data sources,The ZoneInfo class,Using ZoneInfo,zoneinfo — IANA time zone support
@anchor{library/zoneinfo data-sources}@anchor{2967}
@subsubsection Data sources


The @code{zoneinfo} module does not directly provide time zone data, and instead
pulls time zone information from the system time zone database or the
first-party PyPI package tzdata@footnote{https://pypi.org/project/tzdata/}, if available. Some systems, including
notably Windows systems, do not have an IANA database available, and so for
projects targeting cross-platform compatibility that require time zone data, it
is recommended to declare a dependency on tzdata. If neither system data nor
tzdata are available, all calls to @ref{ae2,,ZoneInfo} will raise
@ref{1860,,ZoneInfoNotFoundError}.

@menu
* Configuring the data sources:: 

@end menu

@node Configuring the data sources,,,Data sources
@anchor{library/zoneinfo configuring-the-data-sources}@anchor{2968}@anchor{library/zoneinfo zoneinfo-data-configuration}@anchor{2969}
@subsubsection Configuring the data sources


When @code{ZoneInfo(key)} is called, the constructor first searches the
directories specified in @ref{21a8,,TZPATH} for a file matching @code{key}, and on
failure looks for a match in the tzdata package. This behavior can be
configured in three ways:


@enumerate 

@item 
The default @ref{21a8,,TZPATH} when not otherwise specified can be configured at
@ref{21a9,,compile time}.

@item 
@ref{21a8,,TZPATH} can be configured using @ref{296a,,an environment variable}.

@item 
At @ref{296b,,runtime}, the search path can be
manipulated using the @ref{180f,,reset_tzpath()} function.
@end enumerate

@menu
* Compile-time configuration:: 
* Environment configuration:: 
* Runtime configuration:: 

@end menu

@node Compile-time configuration,Environment configuration,,Configuring the data sources
@anchor{library/zoneinfo compile-time-configuration}@anchor{296c}@anchor{library/zoneinfo zoneinfo-data-compile-time-config}@anchor{21a9}
@subsubsection Compile-time configuration


The default @ref{21a8,,TZPATH} includes several common deployment locations for the
time zone database (except on Windows, where there are no “well-known”
locations for time zone data). On POSIX systems, downstream distributors and
those building Python from source who know where their system
time zone data is deployed may change the default time zone path by specifying
the compile-time option @code{TZPATH} (or, more likely, the @ref{21a7,,configure flag --with-tzpath}), which should be a string delimited by
@ref{2177,,os.pathsep}.

On all platforms, the configured value is available as the @code{TZPATH} key in
@ref{175,,sysconfig.get_config_var()}.

@node Environment configuration,Runtime configuration,Compile-time configuration,Configuring the data sources
@anchor{library/zoneinfo environment-configuration}@anchor{296d}@anchor{library/zoneinfo zoneinfo-data-environment-var}@anchor{296a}
@subsubsection Environment configuration


When initializing @ref{21a8,,TZPATH} (either at import time or whenever
@ref{180f,,reset_tzpath()} is called with no arguments), the @code{zoneinfo} module will
use the environment variable @code{PYTHONTZPATH}, if it exists, to set the search
path.

@geindex environment variable; PYTHONTZPATH
@anchor{library/zoneinfo envvar-PYTHONTZPATH}@anchor{296e}
@deffn {Environment Variable} PYTHONTZPATH

This is an @ref{2177,,os.pathsep}-separated string containing the time zone
search path to use. It must consist of only absolute rather than relative
paths. Relative components specified in @code{PYTHONTZPATH} will not be used,
but otherwise the behavior when a relative path is specified is
implementation-defined; CPython will raise @ref{296f,,InvalidTZPathWarning}, but
other implementations are free to silently ignore the erroneous component
or raise an exception.
@end deffn

To set the system to ignore the system data and use the tzdata package
instead, set @code{PYTHONTZPATH=""}.

@node Runtime configuration,,Environment configuration,Configuring the data sources
@anchor{library/zoneinfo runtime-configuration}@anchor{2970}@anchor{library/zoneinfo zoneinfo-data-runtime-config}@anchor{296b}
@subsubsection Runtime configuration


The TZ search path can also be configured at runtime using the
@ref{180f,,reset_tzpath()} function. This is generally not an advisable operation,
though it is reasonable to use it in test functions that require the use of a
specific time zone path (or require disabling access to the system time zones).

@node The ZoneInfo class,Functions<3>,Data sources,zoneinfo — IANA time zone support
@anchor{library/zoneinfo the-zoneinfo-class}@anchor{2971}
@subsubsection The @code{ZoneInfo} class


@geindex ZoneInfo (class in zoneinfo)
@anchor{library/zoneinfo zoneinfo ZoneInfo}@anchor{ae2}
@deffn {Class} zoneinfo.ZoneInfo (key)

A concrete @ref{7f7,,datetime.tzinfo} subclass that represents an IANA time
zone specified by the string @code{key}. Calls to the primary constructor will
always return objects that compare identically; put another way, barring
cache invalidation via @ref{17b7,,ZoneInfo.clear_cache()}, for all values of
@code{key}, the following assertion will always be true:

@example
a = ZoneInfo(key)
b = ZoneInfo(key)
assert a is b
@end example

@code{key} must be in the form of a relative, normalized POSIX path, with no
up-level references. The constructor will raise @ref{2ee,,ValueError} if a
non-conforming key is passed.

If no file matching @code{key} is found, the constructor will raise
@ref{1860,,ZoneInfoNotFoundError}.
@end deffn

The @code{ZoneInfo} class has two alternate constructors:

@geindex from_file() (zoneinfo.ZoneInfo class method)
@anchor{library/zoneinfo zoneinfo ZoneInfo from_file}@anchor{17cd}
@deffn {Method} classmethod ZoneInfo.from_file (file_obj, /, key=None)

Constructs a @code{ZoneInfo} object from a file-like object returning bytes
(e.g. a file opened in binary mode or an @ref{10aa,,io.BytesIO} object).
Unlike the primary constructor, this always constructs a new object.

The @code{key} parameter sets the name of the zone for the purposes of
@ref{831,,__str__()} and @ref{830,,__repr__()}.

Objects created via this constructor cannot be pickled (see @ref{2972,,pickling}).

@ref{2ee,,ValueError} is raised if the data read from `file_obj' is not a valid
TZif file.
@end deffn

@geindex no_cache() (zoneinfo.ZoneInfo class method)
@anchor{library/zoneinfo zoneinfo ZoneInfo no_cache}@anchor{2973}
@deffn {Method} classmethod ZoneInfo.no_cache (key)

An alternate constructor that bypasses the constructor’s cache. It is
identical to the primary constructor, but returns a new object on each
call. This is most likely to be useful for testing or demonstration
purposes, but it can also be used to create a system with a different cache
invalidation strategy.

Objects created via this constructor will also bypass the cache of a
deserializing process when unpickled.

@c TODO: Add "See `cache_behavior`_" reference when that section is ready.

@cartouche
@quotation Caution 
Using this constructor may change the semantics of your datetimes in
surprising ways, only use it if you know that you need to.
@end quotation
@end cartouche
@end deffn

The following class methods are also available:

@geindex clear_cache() (zoneinfo.ZoneInfo class method)
@anchor{library/zoneinfo zoneinfo ZoneInfo clear_cache}@anchor{17b7}
@deffn {Method} classmethod ZoneInfo.clear_cache (*, only_keys=None)

A method for invalidating the cache on the @code{ZoneInfo} class. If no
arguments are passed, all caches are invalidated and the next call to
the primary constructor for each key will return a new instance.

If an iterable of key names is passed to the @code{only_keys} parameter, only
the specified keys will be removed from the cache. Keys passed to
@code{only_keys} but not found in the cache are ignored.

@c TODO: Add "See `cache_behavior`_" reference when that section is ready.

@cartouche
@quotation Warning 
Invoking this function may change the semantics of datetimes using
@code{ZoneInfo} in surprising ways; this modifies module state
and thus may have wide-ranging effects. Only use it if you know that you
need to.
@end quotation
@end cartouche
@end deffn

The class has one attribute:

@geindex key (zoneinfo.ZoneInfo attribute)
@anchor{library/zoneinfo zoneinfo ZoneInfo key}@anchor{2974}
@deffn {Attribute} ZoneInfo.key

This is a read-only @ref{2975,,attribute} that returns the value of @code{key}
passed to the constructor, which should be a lookup key in the IANA time
zone database (e.g. @code{America/New_York}, @code{Europe/Paris} or
@code{Asia/Tokyo}).

For zones constructed from file without specifying a @code{key} parameter,
this will be set to @code{None}.

@cartouche
@quotation Note 
Although it is a somewhat common practice to expose these to end users,
these values are designed to be primary keys for representing the
relevant zones and not necessarily user-facing elements.  Projects like
CLDR (the Unicode Common Locale Data Repository) can be used to get
more user-friendly strings from these keys.
@end quotation
@end cartouche
@end deffn

@menu
* String representations:: 
* Pickle serialization:: 

@end menu

@node String representations,Pickle serialization,,The ZoneInfo class
@anchor{library/zoneinfo string-representations}@anchor{2976}
@subsubsection String representations


The string representation returned when calling @ref{16a,,str} on a
@ref{ae2,,ZoneInfo} object defaults to using the @ref{2974,,ZoneInfo.key} attribute (see
the note on usage in the attribute documentation):

@example
>>> zone = ZoneInfo("Pacific/Kwajalein")
>>> str(zone)
'Pacific/Kwajalein'

>>> when = dt.datetime(2020, 4, 1, 3, 15, tzinfo=zone)
>>> f"@{when.isoformat()@} [@{when.tzinfo@}]"
'2020-04-01T03:15:00+12:00 [Pacific/Kwajalein]'
@end example

For objects constructed from a file without specifying a @code{key} parameter,
@code{str} falls back to calling @ref{1c3,,repr()}. @code{ZoneInfo}’s @code{repr} is
implementation-defined and not necessarily stable between versions, but it is
guaranteed not to be a valid @code{ZoneInfo} key.

@node Pickle serialization,,String representations,The ZoneInfo class
@anchor{library/zoneinfo pickle-serialization}@anchor{2977}@anchor{library/zoneinfo pickling}@anchor{2972}
@subsubsection Pickle serialization


Rather than serializing all transition data, @code{ZoneInfo} objects are
serialized by key, and @code{ZoneInfo} objects constructed from files (even those
with a value for @code{key} specified) cannot be pickled.

The behavior of a @code{ZoneInfo} file depends on how it was constructed:


@enumerate 

@item 
@code{ZoneInfo(key)}: When constructed with the primary constructor, a
@code{ZoneInfo} object is serialized by key, and when deserialized, the
deserializing process uses the primary and thus it is expected that these
are the same object as other references to the same time
zone.  For example, if @code{europe_berlin_pkl} is a string containing a pickle
constructed from @code{ZoneInfo("Europe/Berlin")}, one would expect the
following behavior:

@example
>>> a = ZoneInfo("Europe/Berlin")
>>> b = pickle.loads(europe_berlin_pkl)
>>> a is b
True
@end example

@item 
@code{ZoneInfo.no_cache(key)}: When constructed from the cache-bypassing
constructor, the @code{ZoneInfo} object is also serialized by key, but when
deserialized, the deserializing process uses the cache bypassing
constructor. If @code{europe_berlin_pkl_nc} is a string containing a pickle
constructed from @code{ZoneInfo.no_cache("Europe/Berlin")}, one would expect
the following behavior:

@example
>>> a = ZoneInfo("Europe/Berlin")
>>> b = pickle.loads(europe_berlin_pkl_nc)
>>> a is b
False
@end example

@item 
@code{ZoneInfo.from_file(file_obj, /, key=None)}: When constructed from a file, the
@code{ZoneInfo} object raises an exception on pickling. If an end user wants to
pickle a @code{ZoneInfo} constructed from a file, it is recommended that they
use a wrapper type or a custom serialization function: either serializing by
key or storing the contents of the file object and serializing that.
@end enumerate

This method of serialization requires that the time zone data for the required
key be available on both the serializing and deserializing side, similar to the
way that references to classes and functions are expected to exist in both the
serializing and deserializing environments. It also means that no guarantees
are made about the consistency of results when unpickling a @code{ZoneInfo}
pickled in an environment with a different version of the time zone data.

@node Functions<3>,Globals,The ZoneInfo class,zoneinfo — IANA time zone support
@anchor{library/zoneinfo functions}@anchor{2978}
@subsubsection Functions


@geindex available_timezones() (in module zoneinfo)
@anchor{library/zoneinfo zoneinfo available_timezones}@anchor{1d8c}
@deffn {Function} zoneinfo.available_timezones ()

Get a set containing all the valid keys for IANA time zones available
anywhere on the time zone path. This is recalculated on every call to the
function.

This function only includes canonical zone names and does not include
“special” zones such as those under the @code{posix/} and @code{right/}
directories, or the @code{posixrules} zone.

@cartouche
@quotation Caution 
This function may open a large number of files, as the best way to
determine if a file on the time zone path is a valid time zone is to
read the “magic string” at the beginning.
@end quotation
@end cartouche

@cartouche
@quotation Note 
These values are not designed to be exposed to end-users; for user
facing elements, applications should use something like CLDR (the
Unicode Common Locale Data Repository) to get more user-friendly
strings. See also the cautionary note on @ref{2974,,ZoneInfo.key}.
@end quotation
@end cartouche
@end deffn

@geindex reset_tzpath() (in module zoneinfo)
@anchor{library/zoneinfo zoneinfo reset_tzpath}@anchor{180f}
@deffn {Function} zoneinfo.reset_tzpath (to=None)

Sets or resets the time zone search path (@ref{21a8,,TZPATH}) for the module.
When called with no arguments, @code{TZPATH} is set to the default value.

Calling @code{reset_tzpath} will not invalidate the @ref{ae2,,ZoneInfo} cache,
and so calls to the primary @code{ZoneInfo} constructor will only use the new
@code{TZPATH} in the case of a cache miss.

The @code{to} parameter must be a @ref{717,,sequence} of strings or
@ref{e51,,os.PathLike} and not a string, all of which must be absolute paths.
@ref{2ee,,ValueError} will be raised if something other than an absolute path
is passed.
@end deffn

@node Globals,Exceptions and warnings,Functions<3>,zoneinfo — IANA time zone support
@anchor{library/zoneinfo globals}@anchor{2979}
@subsubsection Globals


@geindex TZPATH (in module zoneinfo)
@anchor{library/zoneinfo zoneinfo TZPATH}@anchor{21a8}
@deffn {Data} zoneinfo.TZPATH

A read-only sequence representing the time zone search path – when
constructing a @code{ZoneInfo} from a key, the key is joined to each entry in
the @code{TZPATH}, and the first file found is used.

@code{TZPATH} may contain only absolute paths, never relative paths,
regardless of how it is configured.

The object that @code{zoneinfo.TZPATH} points to may change in response to a
call to @ref{180f,,reset_tzpath()}, so it is recommended to use
@code{zoneinfo.TZPATH} rather than importing @code{TZPATH} from @code{zoneinfo} or
assigning a long-lived variable to @code{zoneinfo.TZPATH}.

For more information on configuring the time zone search path, see
@ref{2969,,Configuring the data sources}.
@end deffn

@node Exceptions and warnings,,Globals,zoneinfo — IANA time zone support
@anchor{library/zoneinfo exceptions-and-warnings}@anchor{297a}
@subsubsection Exceptions and warnings


@geindex ZoneInfoNotFoundError
@anchor{library/zoneinfo zoneinfo ZoneInfoNotFoundError}@anchor{1860}
@deffn {Exception} zoneinfo.ZoneInfoNotFoundError

Raised when construction of a @ref{ae2,,ZoneInfo} object fails because the
specified key could not be found on the system. This is a subclass of
@ref{5e7,,KeyError}.
@end deffn

@geindex InvalidTZPathWarning
@anchor{library/zoneinfo zoneinfo InvalidTZPathWarning}@anchor{296f}
@deffn {Exception} zoneinfo.InvalidTZPathWarning

Raised when 
@geindex PYTHONTZPATH
@geindex environment variable; PYTHONTZPATH
@ref{296e,,PYTHONTZPATH} contains an invalid component that will
be filtered out, such as a relative path.
@end deffn

@c Links and references:

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node calendar — General calendar-related functions,collections — Container datatypes,zoneinfo — IANA time zone support,Data Types
@anchor{library/calendar doc}@anchor{297b}@anchor{library/calendar calendar-general-calendar-related-functions}@anchor{297c}@anchor{library/calendar module-calendar}@anchor{15}@anchor{library/calendar translation-repo}@anchor{297d}
@subsection @code{calendar} — General calendar-related functions


@geindex module; calendar

`Source code:' Lib/calendar.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/calendar.py}


__________________________________________________________________


This module allows you to output calendars like the Unix @code{cal} program,
and provides additional useful functions related to the calendar. By default,
these calendars have Monday as the first day of the week, and Sunday as the last
(the European convention). Use @ref{297e,,setfirstweekday()} to set the first day of
the week to Sunday (6) or to any other weekday.  Parameters that specify dates
are given as integers. For related
functionality, see also the @ref{34,,datetime} and @ref{f4,,time} modules.

The functions and classes defined in this module
use an idealized calendar, the current Gregorian calendar extended indefinitely
in both directions.  This matches the definition of the “proleptic Gregorian”
calendar in Dershowitz and Reingold’s book “Calendrical Calculations”, where
it’s the base calendar for all computations.  Zero and negative years are
interpreted as prescribed by the ISO 8601 standard.  Year 0 is 1 BC, year -1 is
2 BC, and so on.

@geindex Calendar (class in calendar)
@anchor{library/calendar calendar Calendar}@anchor{297f}
@deffn {Class} calendar.Calendar (firstweekday=0)

Creates a @code{Calendar} object. `firstweekday' is an integer specifying the
first day of the week. @ref{2980,,MONDAY} is @code{0} (the default), @ref{2981,,SUNDAY} is @code{6}.

A @code{Calendar} object provides several methods that can be used for
preparing the calendar data for formatting. This class doesn’t do any formatting
itself. This is the job of subclasses.

@code{Calendar} instances have the following methods and attributes:

@geindex firstweekday (calendar.Calendar attribute)
@anchor{library/calendar calendar Calendar firstweekday}@anchor{2982}
@deffn {Attribute} firstweekday

The first weekday as an integer (0–6).

This property can also be set and read using
@ref{2983,,setfirstweekday()} and
@ref{2984,,getfirstweekday()} respectively.
@end deffn

@geindex getfirstweekday() (calendar.Calendar method)
@anchor{library/calendar calendar Calendar getfirstweekday}@anchor{2984}
@deffn {Method} getfirstweekday ()

Return an @ref{19c,,int} for the current first weekday (0–6).

Identical to reading the @ref{2982,,firstweekday} property.
@end deffn

@geindex setfirstweekday() (calendar.Calendar method)
@anchor{library/calendar calendar Calendar setfirstweekday}@anchor{2983}
@deffn {Method} setfirstweekday (firstweekday)

Set the first weekday to `firstweekday', passed as an @ref{19c,,int} (0–6).

Identical to setting the @ref{2982,,firstweekday} property.
@end deffn

@geindex iterweekdays() (calendar.Calendar method)
@anchor{library/calendar calendar Calendar iterweekdays}@anchor{2985}
@deffn {Method} iterweekdays ()

Return an iterator for the weekday numbers that will be used for one
week.  The first value from the iterator will be the same as the value of
the @ref{2982,,firstweekday} property.
@end deffn

@geindex itermonthdates() (calendar.Calendar method)
@anchor{library/calendar calendar Calendar itermonthdates}@anchor{e19}
@deffn {Method} itermonthdates (year, month)

Return an iterator for the month `month' (1–12) in the year `year'. This
iterator will return all days (as @ref{1fc,,datetime.date} objects) for the
month and all days before the start of the month or after the end of the
month that are required to get a complete week.
@end deffn

@geindex itermonthdays() (calendar.Calendar method)
@anchor{library/calendar calendar Calendar itermonthdays}@anchor{2986}
@deffn {Method} itermonthdays (year, month)

Return an iterator for the month `month' in the year `year' similar to
@ref{e19,,itermonthdates()}, but not restricted by the @ref{1fc,,datetime.date}
range. Days returned will simply be day of the month numbers.  For the
days outside of the specified month, the day number is @code{0}.
@end deffn

@geindex itermonthdays2() (calendar.Calendar method)
@anchor{library/calendar calendar Calendar itermonthdays2}@anchor{2987}
@deffn {Method} itermonthdays2 (year, month)

Return an iterator for the month `month' in the year `year' similar to
@ref{e19,,itermonthdates()}, but not restricted by the @ref{1fc,,datetime.date}
range. Days returned will be tuples consisting of a day of the month
number and a weekday number.
@end deffn

@geindex itermonthdays3() (calendar.Calendar method)
@anchor{library/calendar calendar Calendar itermonthdays3}@anchor{e1a}
@deffn {Method} itermonthdays3 (year, month)

Return an iterator for the month `month' in the year `year' similar to
@ref{e19,,itermonthdates()}, but not restricted by the @ref{1fc,,datetime.date}
range. Days returned will be tuples consisting of a year, a month and a day
of the month numbers.


Added in version 3.7.

@end deffn

@geindex itermonthdays4() (calendar.Calendar method)
@anchor{library/calendar calendar Calendar itermonthdays4}@anchor{e1b}
@deffn {Method} itermonthdays4 (year, month)

Return an iterator for the month `month' in the year `year' similar to
@ref{e19,,itermonthdates()}, but not restricted by the @ref{1fc,,datetime.date}
range. Days returned will be tuples consisting of a year, a month, a day
of the month, and a day of the week numbers.


Added in version 3.7.

@end deffn

@geindex monthdatescalendar() (calendar.Calendar method)
@anchor{library/calendar calendar Calendar monthdatescalendar}@anchor{2988}
@deffn {Method} monthdatescalendar (year, month)

Return a list of the weeks in the month `month' of the `year' as full
weeks.  Weeks are lists of seven @ref{1fc,,datetime.date} objects.
@end deffn

@geindex monthdays2calendar() (calendar.Calendar method)
@anchor{library/calendar calendar Calendar monthdays2calendar}@anchor{2989}
@deffn {Method} monthdays2calendar (year, month)

Return a list of the weeks in the month `month' of the `year' as full
weeks.  Weeks are lists of seven tuples of day numbers and weekday
numbers.
@end deffn

@geindex monthdayscalendar() (calendar.Calendar method)
@anchor{library/calendar calendar Calendar monthdayscalendar}@anchor{298a}
@deffn {Method} monthdayscalendar (year, month)

Return a list of the weeks in the month `month' of the `year' as full
weeks.  Weeks are lists of seven day numbers.
@end deffn

@geindex yeardatescalendar() (calendar.Calendar method)
@anchor{library/calendar calendar Calendar yeardatescalendar}@anchor{298b}
@deffn {Method} yeardatescalendar (year, width=3)

Return the data for the specified year ready for formatting. The return
value is a list of month rows. Each month row contains up to `width'
months (defaulting to 3). Each month contains between 4 and 6 weeks and
each week contains 1–7 days. Days are @ref{1fc,,datetime.date} objects.
@end deffn

@geindex yeardays2calendar() (calendar.Calendar method)
@anchor{library/calendar calendar Calendar yeardays2calendar}@anchor{298c}
@deffn {Method} yeardays2calendar (year, width=3)

Return the data for the specified year ready for formatting (similar to
@ref{298b,,yeardatescalendar()}). Entries in the week lists are tuples of day
numbers and weekday numbers. Day numbers outside this month are zero.
@end deffn

@geindex yeardayscalendar() (calendar.Calendar method)
@anchor{library/calendar calendar Calendar yeardayscalendar}@anchor{298d}
@deffn {Method} yeardayscalendar (year, width=3)

Return the data for the specified year ready for formatting (similar to
@ref{298b,,yeardatescalendar()}). Entries in the week lists are day numbers. Day
numbers outside this month are zero.
@end deffn
@end deffn

@geindex TextCalendar (class in calendar)
@anchor{library/calendar calendar TextCalendar}@anchor{18f1}
@deffn {Class} calendar.TextCalendar (firstweekday=0)

This class can be used to generate plain text calendars.

@code{TextCalendar} instances have the following methods:

@geindex formatday() (calendar.TextCalendar method)
@anchor{library/calendar calendar TextCalendar formatday}@anchor{298e}
@deffn {Method} formatday (theday, weekday, width)

Return a string representing a single day formatted with the given `width'.
If `theday' is @code{0}, return a string of spaces of
the specified width, representing an empty day. The `weekday' parameter
is unused.
@end deffn

@geindex formatweek() (calendar.TextCalendar method)
@anchor{library/calendar calendar TextCalendar formatweek}@anchor{298f}
@deffn {Method} formatweek (theweek, w=0)

Return a single week in a string with no newline. If `w' is provided, it
specifies the width of the date columns, which are centered. Depends
on the first weekday as specified in the constructor or set by the
@ref{297e,,setfirstweekday()} method.
@end deffn

@geindex formatweekday() (calendar.TextCalendar method)
@anchor{library/calendar calendar TextCalendar formatweekday}@anchor{2990}
@deffn {Method} formatweekday (weekday, width)

Return a string representing the name of a single weekday formatted to
the specified `width'. The `weekday' parameter is an integer representing
the day of the week, where @code{0} is Monday and @code{6} is Sunday.
@end deffn

@geindex formatweekheader() (calendar.TextCalendar method)
@anchor{library/calendar calendar TextCalendar formatweekheader}@anchor{2991}
@deffn {Method} formatweekheader (width)

Return a string containing the header row of weekday names, formatted
with the given `width' for each column. The names depend on the locale
settings and are padded to the specified width.
@end deffn

@geindex formatmonth() (calendar.TextCalendar method)
@anchor{library/calendar calendar TextCalendar formatmonth}@anchor{2992}
@deffn {Method} formatmonth (theyear, themonth, w=0, l=0)

Return a month’s calendar in a multi-line string. If `w' is provided, it
specifies the width of the date columns, which are centered. If `l' is
given, it specifies the number of lines that each week will use. Depends
on the first weekday as specified in the constructor or set by the
@ref{297e,,setfirstweekday()} method.
@end deffn

@geindex formatmonthname() (calendar.TextCalendar method)
@anchor{library/calendar calendar TextCalendar formatmonthname}@anchor{2993}
@deffn {Method} formatmonthname (theyear, themonth, width=0, withyear=True)

Return a string representing the month’s name centered within the
specified `width'. If `withyear' is @code{True}, include the year in the
output. The `theyear' and `themonth' parameters specify the year
and month for the name to be formatted respectively.
@end deffn

@geindex prmonth() (calendar.TextCalendar method)
@anchor{library/calendar calendar TextCalendar prmonth}@anchor{2994}
@deffn {Method} prmonth (theyear, themonth, w=0, l=0)

Print a month’s calendar as returned by @ref{2992,,formatmonth()}.
@end deffn

@geindex formatyear() (calendar.TextCalendar method)
@anchor{library/calendar calendar TextCalendar formatyear}@anchor{2995}
@deffn {Method} formatyear (theyear, w=2, l=1, c=6, m=3)

Return a `m'-column calendar for an entire year as a multi-line string.
Optional parameters `w', `l', and `c' are for date column width, lines per
week, and number of spaces between month columns, respectively. Depends on
the first weekday as specified in the constructor or set by the
@ref{297e,,setfirstweekday()} method.  The earliest year for which a calendar
can be generated is platform-dependent.
@end deffn

@geindex pryear() (calendar.TextCalendar method)
@anchor{library/calendar calendar TextCalendar pryear}@anchor{2996}
@deffn {Method} pryear (theyear, w=2, l=1, c=6, m=3)

Print the calendar for an entire year as returned by @ref{2995,,formatyear()}.
@end deffn
@end deffn

@geindex HTMLCalendar (class in calendar)
@anchor{library/calendar calendar HTMLCalendar}@anchor{d1e}
@deffn {Class} calendar.HTMLCalendar (firstweekday=0)

This class can be used to generate HTML calendars.

@code{HTMLCalendar} instances have the following methods:

@geindex formatmonth() (calendar.HTMLCalendar method)
@anchor{library/calendar calendar HTMLCalendar formatmonth}@anchor{2997}
@deffn {Method} formatmonth (theyear, themonth, withyear=True)

Return a month’s calendar as an HTML table. If `withyear' is true the year
will be included in the header, otherwise just the month name will be
used.
@end deffn

@geindex formatyear() (calendar.HTMLCalendar method)
@anchor{library/calendar calendar HTMLCalendar formatyear}@anchor{2998}
@deffn {Method} formatyear (theyear, width=3)

Return a year’s calendar as an HTML table. `width' (defaulting to 3)
specifies the number of months per row.
@end deffn

@geindex formatyearpage() (calendar.HTMLCalendar method)
@anchor{library/calendar calendar HTMLCalendar formatyearpage}@anchor{2999}
@deffn {Method} formatyearpage (theyear, width=3, css='calendar.css', encoding=None)

Return a year’s calendar as a complete HTML page. `width' (defaulting to
3) specifies the number of months per row. `css' is the name for the
cascading style sheet to be used. @ref{887,,None} can be passed if no style
sheet should be used. `encoding' specifies the encoding to be used for the
output (defaulting to the system default encoding).
@end deffn

@geindex formatmonthname() (calendar.HTMLCalendar method)
@anchor{library/calendar calendar HTMLCalendar formatmonthname}@anchor{299a}
@deffn {Method} formatmonthname (theyear, themonth, withyear=True)

Return a month name as an HTML table row. If `withyear' is true the year
will be included in the row, otherwise just the month name will be
used.
@end deffn

@code{HTMLCalendar} has the following attributes you can override to
customize the CSS classes used by the calendar:

@geindex cssclasses (calendar.HTMLCalendar attribute)
@anchor{library/calendar calendar HTMLCalendar cssclasses}@anchor{299b}
@deffn {Attribute} cssclasses

A list of CSS classes used for each weekday. The default class list is:

@example
cssclasses = ["mon", "tue", "wed", "thu", "fri", "sat", "sun"]
@end example

more styles can be added for each day:

@example
cssclasses = ["mon text-bold", "tue", "wed", "thu", "fri", "sat", "sun red"]
@end example

Note that the length of this list must be seven items.
@end deffn

@geindex cssclass_noday (calendar.HTMLCalendar attribute)
@anchor{library/calendar calendar HTMLCalendar cssclass_noday}@anchor{299c}
@deffn {Attribute} cssclass_noday

The CSS class for a weekday occurring in the previous or coming month.


Added in version 3.7.

@end deffn

@geindex cssclasses_weekday_head (calendar.HTMLCalendar attribute)
@anchor{library/calendar calendar HTMLCalendar cssclasses_weekday_head}@anchor{299d}
@deffn {Attribute} cssclasses_weekday_head

A list of CSS classes used for weekday names in the header row.
The default is the same as @ref{299b,,cssclasses}.


Added in version 3.7.

@end deffn

@geindex cssclass_month_head (calendar.HTMLCalendar attribute)
@anchor{library/calendar calendar HTMLCalendar cssclass_month_head}@anchor{299e}
@deffn {Attribute} cssclass_month_head

The month’s head CSS class (used by @ref{299a,,formatmonthname()}).
The default value is @code{"month"}.


Added in version 3.7.

@end deffn

@geindex cssclass_month (calendar.HTMLCalendar attribute)
@anchor{library/calendar calendar HTMLCalendar cssclass_month}@anchor{299f}
@deffn {Attribute} cssclass_month

The CSS class for the whole month’s table (used by @ref{2997,,formatmonth()}).
The default value is @code{"month"}.


Added in version 3.7.

@end deffn

@geindex cssclass_year (calendar.HTMLCalendar attribute)
@anchor{library/calendar calendar HTMLCalendar cssclass_year}@anchor{29a0}
@deffn {Attribute} cssclass_year

The CSS class for the whole year’s table of tables (used by
@ref{2998,,formatyear()}). The default value is @code{"year"}.


Added in version 3.7.

@end deffn

@geindex cssclass_year_head (calendar.HTMLCalendar attribute)
@anchor{library/calendar calendar HTMLCalendar cssclass_year_head}@anchor{29a1}
@deffn {Attribute} cssclass_year_head

The CSS class for the table head for the whole year (used by
@ref{2998,,formatyear()}). The default value is @code{"year"}.


Added in version 3.7.

@end deffn

Note that although the naming for the above described class attributes is
singular (e.g. @code{cssclass_month} @code{cssclass_noday}), one can replace the
single CSS class with a space separated list of CSS classes, for example:

@example
"text-bold text-red"
@end example

Here is an example how @code{HTMLCalendar} can be customized:

@example
class CustomHTMLCal(calendar.HTMLCalendar):
    cssclasses = [style + " text-nowrap" for style in
                  calendar.HTMLCalendar.cssclasses]
    cssclass_month_head = "text-center month-head"
    cssclass_month = "text-center month"
    cssclass_year = "text-italic lead"
@end example
@end deffn

@geindex LocaleTextCalendar (class in calendar)
@anchor{library/calendar calendar LocaleTextCalendar}@anchor{950}
@deffn {Class} calendar.LocaleTextCalendar (firstweekday=0, locale=None)

This subclass of @ref{18f1,,TextCalendar} can be passed a locale name in the
constructor and will return month and weekday names in the specified locale.
@end deffn

@geindex LocaleHTMLCalendar (class in calendar)
@anchor{library/calendar calendar LocaleHTMLCalendar}@anchor{951}
@deffn {Class} calendar.LocaleHTMLCalendar (firstweekday=0, locale=None)

This subclass of @ref{d1e,,HTMLCalendar} can be passed a locale name in the
constructor and will return month and weekday names in the specified
locale.
@end deffn

@cartouche
@quotation Note 
The constructor, @code{formatweekday()} and @code{formatmonthname()} methods
of these two classes temporarily change the @code{LC_TIME} locale to the given
`locale'. Because the current locale is a process-wide setting, they are
not thread-safe.
@end quotation
@end cartouche

For simple text calendars this module provides the following functions.

@geindex setfirstweekday() (in module calendar)
@anchor{library/calendar calendar setfirstweekday}@anchor{297e}
@deffn {Function} calendar.setfirstweekday (weekday)

Sets the weekday (@code{0} is Monday, @code{6} is Sunday) to start each week. The
values @ref{2980,,MONDAY}, @ref{29a2,,TUESDAY}, @ref{29a3,,WEDNESDAY}, @ref{29a4,,THURSDAY},
@ref{29a5,,FRIDAY}, @ref{29a6,,SATURDAY}, and @ref{2981,,SUNDAY} are provided for
convenience. For example, to set the first weekday to Sunday:

@example
import calendar
calendar.setfirstweekday(calendar.SUNDAY)
@end example
@end deffn

@geindex firstweekday() (in module calendar)
@anchor{library/calendar calendar firstweekday}@anchor{29a7}
@deffn {Function} calendar.firstweekday ()

Returns the current setting for the weekday to start each week.
@end deffn

@geindex isleap() (in module calendar)
@anchor{library/calendar calendar isleap}@anchor{29a8}
@deffn {Function} calendar.isleap (year)

Returns @ref{e0d,,True} if `year' is a leap year, otherwise @ref{d31,,False}.
@end deffn

@geindex leapdays() (in module calendar)
@anchor{library/calendar calendar leapdays}@anchor{29a9}
@deffn {Function} calendar.leapdays (y1, y2)

Returns the number of leap years in the range from `y1' to `y2' (exclusive),
where `y1' and `y2' are years.

This function works for ranges spanning a century change.
@end deffn

@geindex weekday() (in module calendar)
@anchor{library/calendar calendar weekday}@anchor{29aa}
@deffn {Function} calendar.weekday (year, month, day)

Returns the day of the week (@code{0} is Monday) for `year' (@code{1970}–…),
`month' (@code{1}–@code{12}), `day' (@code{1}–@code{31}).
@end deffn

@geindex weekheader() (in module calendar)
@anchor{library/calendar calendar weekheader}@anchor{29ab}
@deffn {Function} calendar.weekheader (n)

Return a header containing abbreviated weekday names. `n' specifies the width in
characters for one weekday.
@end deffn

@geindex monthrange() (in module calendar)
@anchor{library/calendar calendar monthrange}@anchor{29ac}
@deffn {Function} calendar.monthrange (year, month)

Returns weekday of first day of the month and number of days in month, for the
specified `year' and `month'.
@end deffn

@geindex monthcalendar() (in module calendar)
@anchor{library/calendar calendar monthcalendar}@anchor{29ad}
@deffn {Function} calendar.monthcalendar (year, month)

Returns a matrix representing a month’s calendar.  Each row represents a week;
days outside of the month are represented by zeros. Each week begins with Monday
unless set by @ref{297e,,setfirstweekday()}.
@end deffn

@geindex prmonth() (in module calendar)
@anchor{library/calendar calendar prmonth}@anchor{29ae}
@deffn {Function} calendar.prmonth (theyear, themonth, w=0, l=0)

Prints a month’s calendar as returned by @ref{194f,,month()}.
@end deffn

@geindex month() (in module calendar)
@anchor{library/calendar calendar month}@anchor{194f}
@deffn {Function} calendar.month (theyear, themonth, w=0, l=0)

Returns a month’s calendar in a multi-line string using the @ref{2992,,formatmonth()}
of the @ref{18f1,,TextCalendar} class.
@end deffn

@geindex prcal() (in module calendar)
@anchor{library/calendar calendar prcal}@anchor{29af}
@deffn {Function} calendar.prcal (year, w=0, l=0, c=6, m=3)

Prints the calendar for an entire year as returned by  @ref{15,,calendar()}.
@end deffn

@geindex calendar() (in module calendar)
@anchor{library/calendar calendar calendar}@anchor{29b0}
@deffn {Function} calendar.calendar (year, w=2, l=1, c=6, m=3)

Returns a 3-column calendar for an entire year as a multi-line string using
the @ref{2995,,formatyear()} of the @ref{18f1,,TextCalendar} class.
@end deffn

@geindex timegm() (in module calendar)
@anchor{library/calendar calendar timegm}@anchor{29b1}
@deffn {Function} calendar.timegm (tuple)

An unrelated but handy function that takes a time tuple such as returned by
the @ref{13cc,,gmtime()} function in the @ref{f4,,time} module, and returns the
corresponding Unix timestamp value, assuming an epoch of 1970, and the POSIX
encoding.  In fact, @code{time.gmtime()} and @code{timegm()} are each other’s
inverse.
@end deffn

The @code{calendar} module exports the following data attributes:

@geindex day_name (in module calendar)
@anchor{library/calendar calendar day_name}@anchor{29b2}
@deffn {Data} calendar.day_name

A sequence that represents the days of the week in the current locale,
where Monday is day number 0.

@example
>>> import calendar
>>> list(calendar.day_name)
['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
@end example
@end deffn

@geindex day_abbr (in module calendar)
@anchor{library/calendar calendar day_abbr}@anchor{29b3}
@deffn {Data} calendar.day_abbr

A sequence that represents the abbreviated days of the week in the current locale,
where Mon is day number 0.

@example
>>> import calendar
>>> list(calendar.day_abbr)
['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
@end example
@end deffn

@geindex MONDAY (in module calendar)
@geindex TUESDAY (in module calendar)
@geindex WEDNESDAY (in module calendar)
@geindex THURSDAY (in module calendar)
@geindex FRIDAY (in module calendar)
@geindex SATURDAY (in module calendar)
@geindex SUNDAY (in module calendar)
@anchor{library/calendar calendar MONDAY}@anchor{2980}
@deffn {Data} calendar.MONDAY
@anchor{library/calendar calendar TUESDAY}@anchor{29a2}
@deffnx {Data} calendar.TUESDAY
@anchor{library/calendar calendar WEDNESDAY}@anchor{29a3}
@deffnx {Data} calendar.WEDNESDAY
@anchor{library/calendar calendar THURSDAY}@anchor{29a4}
@deffnx {Data} calendar.THURSDAY
@anchor{library/calendar calendar FRIDAY}@anchor{29a5}
@deffnx {Data} calendar.FRIDAY
@anchor{library/calendar calendar SATURDAY}@anchor{29a6}
@deffnx {Data} calendar.SATURDAY
@anchor{library/calendar calendar SUNDAY}@anchor{2981}
@deffnx {Data} calendar.SUNDAY

Aliases for the days of the week,
where @code{MONDAY} is @code{0} and @code{SUNDAY} is @code{6}.


Added in version 3.12.

@end deffn

@geindex Day (class in calendar)
@anchor{library/calendar calendar Day}@anchor{6ab}
@deffn {Class} calendar.Day

Enumeration defining days of the week as integer constants.
The members of this enumeration are exported to the module scope as
@ref{2980,,MONDAY} through @ref{2981,,SUNDAY}.


Added in version 3.12.

@end deffn

@geindex month_name (in module calendar)
@anchor{library/calendar calendar month_name}@anchor{29b4}
@deffn {Data} calendar.month_name

A sequence that represents the months of the year in the current locale.  This
follows normal convention of January being month number 1, so it has a length of
13 and @code{month_name[0]} is the empty string.

@example
>>> import calendar
>>> list(calendar.month_name)
['@w{'}, 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']
@end example
@end deffn

@geindex month_abbr (in module calendar)
@anchor{library/calendar calendar month_abbr}@anchor{29b5}
@deffn {Data} calendar.month_abbr

A sequence that represents the abbreviated months of the year in the current
locale.  This follows normal convention of January being month number 1, so it
has a length of 13 and  @code{month_abbr[0]} is the empty string.

@example
>>> import calendar
>>> list(calendar.month_abbr)
['@w{'}, 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
@end example
@end deffn

@geindex JANUARY (in module calendar)
@geindex FEBRUARY (in module calendar)
@geindex MARCH (in module calendar)
@geindex APRIL (in module calendar)
@geindex MAY (in module calendar)
@geindex JUNE (in module calendar)
@geindex JULY (in module calendar)
@geindex AUGUST (in module calendar)
@geindex SEPTEMBER (in module calendar)
@geindex OCTOBER (in module calendar)
@geindex NOVEMBER (in module calendar)
@geindex DECEMBER (in module calendar)
@anchor{library/calendar calendar JANUARY}@anchor{34c}
@deffn {Data} calendar.JANUARY
@anchor{library/calendar calendar FEBRUARY}@anchor{34d}
@deffnx {Data} calendar.FEBRUARY
@anchor{library/calendar calendar MARCH}@anchor{29b6}
@deffnx {Data} calendar.MARCH
@anchor{library/calendar calendar APRIL}@anchor{29b7}
@deffnx {Data} calendar.APRIL
@anchor{library/calendar calendar MAY}@anchor{29b8}
@deffnx {Data} calendar.MAY
@anchor{library/calendar calendar JUNE}@anchor{29b9}
@deffnx {Data} calendar.JUNE
@anchor{library/calendar calendar JULY}@anchor{29ba}
@deffnx {Data} calendar.JULY
@anchor{library/calendar calendar AUGUST}@anchor{29bb}
@deffnx {Data} calendar.AUGUST
@anchor{library/calendar calendar SEPTEMBER}@anchor{29bc}
@deffnx {Data} calendar.SEPTEMBER
@anchor{library/calendar calendar OCTOBER}@anchor{29bd}
@deffnx {Data} calendar.OCTOBER
@anchor{library/calendar calendar NOVEMBER}@anchor{29be}
@deffnx {Data} calendar.NOVEMBER
@anchor{library/calendar calendar DECEMBER}@anchor{29bf}
@deffnx {Data} calendar.DECEMBER

Aliases for the months of the year,
where @code{JANUARY} is @code{1} and @code{DECEMBER} is @code{12}.


Added in version 3.12.

@end deffn

@geindex Month (class in calendar)
@anchor{library/calendar calendar Month}@anchor{6aa}
@deffn {Class} calendar.Month

Enumeration defining months of the year as integer constants.
The members of this enumeration are exported to the module scope as
@ref{34c,,JANUARY} through @ref{29bf,,DECEMBER}.


Added in version 3.12.

@end deffn

The @code{calendar} module defines the following exceptions:

@geindex IllegalMonthError
@anchor{library/calendar calendar IllegalMonthError}@anchor{179e}
@deffn {Exception} calendar.IllegalMonthError (month)

A subclass of @ref{2ee,,ValueError} and @ref{1741,,IndexError},
raised when the given month number is outside of the range 1-12 (inclusive).


Changed in version 3.12: @code{IllegalMonthError} is now also a subclass of
@ref{2ee,,ValueError}. New code should avoid catching
@ref{1741,,IndexError}.


@geindex month (calendar.IllegalMonthError attribute)
@anchor{library/calendar calendar IllegalMonthError month}@anchor{29c0}
@deffn {Attribute} month

The invalid month number.
@end deffn
@end deffn

@geindex IllegalWeekdayError
@anchor{library/calendar calendar IllegalWeekdayError}@anchor{29c1}
@deffn {Exception} calendar.IllegalWeekdayError (weekday)

A subclass of @ref{2ee,,ValueError},
raised when the given weekday number is outside of the range 0-6 (inclusive).

@geindex weekday (calendar.IllegalWeekdayError attribute)
@anchor{library/calendar calendar IllegalWeekdayError weekday}@anchor{29c2}
@deffn {Attribute} weekday

The invalid weekday number.
@end deffn
@end deffn


@subsubheading See also



@table @asis

@item Module @ref{34,,datetime}

Object-oriented interface to dates and times with similar functionality to the
@ref{f4,,time} module.

@item Module @ref{f4,,time}

Low-level time related functions.
@end table


@menu
* Command-line usage:: 

@end menu

@node Command-line usage,,,calendar — General calendar-related functions
@anchor{library/calendar calendar-cli}@anchor{1d2}@anchor{library/calendar command-line-usage}@anchor{29c3}
@subsubsection Command-line usage



Added in version 2.5.


The @code{calendar} module can be executed as a script from the command line
to interactively print a calendar.

@example
python -m calendar [-h] [-L LOCALE] [-e ENCODING] [-t @{text,html@}]
                   [-w WIDTH] [-l LINES] [-s SPACING] [-m MONTHS] [-c CSS]
                   [-f FIRST_WEEKDAY] [year] [month]
@end example

For example, to print a calendar for the year 2000:

@example
$ python -m calendar 2000
                                  2000

      January                   February                   March
Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
                1  2          1  2  3  4  5  6             1  2  3  4  5
 3  4  5  6  7  8  9       7  8  9 10 11 12 13       6  7  8  9 10 11 12
10 11 12 13 14 15 16      14 15 16 17 18 19 20      13 14 15 16 17 18 19
17 18 19 20 21 22 23      21 22 23 24 25 26 27      20 21 22 23 24 25 26
24 25 26 27 28 29 30      28 29                     27 28 29 30 31
31

       April                      May                       June
Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
                1  2       1  2  3  4  5  6  7                1  2  3  4
 3  4  5  6  7  8  9       8  9 10 11 12 13 14       5  6  7  8  9 10 11
10 11 12 13 14 15 16      15 16 17 18 19 20 21      12 13 14 15 16 17 18
17 18 19 20 21 22 23      22 23 24 25 26 27 28      19 20 21 22 23 24 25
24 25 26 27 28 29 30      29 30 31                  26 27 28 29 30

        July                     August                  September
Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
                1  2          1  2  3  4  5  6                   1  2  3
 3  4  5  6  7  8  9       7  8  9 10 11 12 13       4  5  6  7  8  9 10
10 11 12 13 14 15 16      14 15 16 17 18 19 20      11 12 13 14 15 16 17
17 18 19 20 21 22 23      21 22 23 24 25 26 27      18 19 20 21 22 23 24
24 25 26 27 28 29 30      28 29 30 31               25 26 27 28 29 30
31

      October                   November                  December
Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
                   1             1  2  3  4  5                   1  2  3
 2  3  4  5  6  7  8       6  7  8  9 10 11 12       4  5  6  7  8  9 10
 9 10 11 12 13 14 15      13 14 15 16 17 18 19      11 12 13 14 15 16 17
16 17 18 19 20 21 22      20 21 22 23 24 25 26      18 19 20 21 22 23 24
23 24 25 26 27 28 29      27 28 29 30               25 26 27 28 29 30 31
30 31
@end example

The following options are accepted:

@geindex calendar command line option; --help
@geindex calendar command line option; -h
@anchor{library/calendar cmdoption-calendar-help}@anchor{29c4}@anchor{library/calendar cmdoption-calendar-h}@anchor{29c5}
@deffn {Option} @w{-}@w{-}help, @w{-}h

Show the help message and exit.
@end deffn

@geindex calendar command line option; --locale
@geindex calendar command line option; -L
@anchor{library/calendar cmdoption-calendar-locale}@anchor{29c6}@anchor{library/calendar cmdoption-calendar-L}@anchor{29c7}
@deffn {Option} @w{-}@w{-}locale LOCALE, @w{-}L LOCALE

The locale to use for month and weekday names.
Defaults to English.
@end deffn

@geindex calendar command line option; --encoding
@geindex calendar command line option; -e
@anchor{library/calendar cmdoption-calendar-encoding}@anchor{29c8}@anchor{library/calendar cmdoption-calendar-e}@anchor{29c9}
@deffn {Option} @w{-}@w{-}encoding ENCODING, @w{-}e ENCODING

The encoding to use for output.
@ref{29c8,,--encoding} is required if @ref{29c6,,--locale} is set.
@end deffn

@geindex calendar command line option; --type
@geindex calendar command line option; -t
@anchor{library/calendar cmdoption-calendar-type}@anchor{29ca}@anchor{library/calendar cmdoption-calendar-t}@anchor{29cb}
@deffn {Option} @w{-}@w{-}type @{text,html@}, @w{-}t @{text,html@}

Print the calendar to the terminal as text,
or as an HTML document.
@end deffn

@geindex calendar command line option; --first-weekday
@geindex calendar command line option; -f
@anchor{library/calendar cmdoption-calendar-first-weekday}@anchor{29cc}@anchor{library/calendar cmdoption-calendar-f}@anchor{29cd}
@deffn {Option} @w{-}@w{-}first@w{-}weekday FIRST_WEEKDAY, @w{-}f FIRST_WEEKDAY

The weekday to start each week.
Must be a number between 0 (Monday) and 6 (Sunday).
Defaults to 0.


Added in version 3.13.

@end deffn

@geindex calendar command line option; year
@anchor{library/calendar cmdoption-calendar-arg-year}@anchor{29ce}
@deffn {Option} year

The year to print the calendar for.
Defaults to the current year.
@end deffn

@geindex calendar command line option; month
@anchor{library/calendar cmdoption-calendar-arg-month}@anchor{29cf}
@deffn {Option} month

The month of the specified @ref{29ce,,year} to print the calendar for.
Must be a number between 1 and 12,
and may only be used in text mode.
Defaults to printing a calendar for the full year.
@end deffn

`Text-mode options:'

@geindex calendar command line option; --width
@geindex calendar command line option; -w
@anchor{library/calendar cmdoption-calendar-width}@anchor{29d0}@anchor{library/calendar cmdoption-calendar-w}@anchor{29d1}
@deffn {Option} @w{-}@w{-}width WIDTH, @w{-}w WIDTH

The width of the date column in terminal columns.
The date is printed centred in the column.
Any value lower than 2 is ignored.
Defaults to 2.
@end deffn

@geindex calendar command line option; --lines
@geindex calendar command line option; -l
@anchor{library/calendar cmdoption-calendar-lines}@anchor{29d2}@anchor{library/calendar cmdoption-calendar-l}@anchor{29d3}
@deffn {Option} @w{-}@w{-}lines LINES, @w{-}l LINES

The number of lines for each week in terminal rows.
The date is printed top-aligned.
Any value lower than 1 is ignored.
Defaults to 1.
@end deffn

@geindex calendar command line option; --spacing
@geindex calendar command line option; -s
@anchor{library/calendar cmdoption-calendar-spacing}@anchor{29d4}@anchor{library/calendar cmdoption-calendar-s}@anchor{29d5}
@deffn {Option} @w{-}@w{-}spacing SPACING, @w{-}s SPACING

The space between months in columns.
Any value lower than 2 is ignored.
Defaults to 6.
@end deffn

@geindex calendar command line option; --months
@geindex calendar command line option; -m
@anchor{library/calendar cmdoption-calendar-months}@anchor{29d6}@anchor{library/calendar cmdoption-calendar-m}@anchor{29d7}
@deffn {Option} @w{-}@w{-}months MONTHS, @w{-}m MONTHS

The number of months printed per row.
Defaults to 3.
@end deffn


Changed in version 3.14: By default, today’s date is highlighted in color and can be
@ref{1b9,,controlled using environment variables}.


`HTML-mode options:'

@geindex calendar command line option; --css
@geindex calendar command line option; -c
@anchor{library/calendar cmdoption-calendar-css}@anchor{29d8}@anchor{library/calendar cmdoption-calendar-c}@anchor{29d9}
@deffn {Option} @w{-}@w{-}css CSS, @w{-}c CSS

The path of a CSS stylesheet to use for the calendar.
This must either be relative to the generated HTML,
or an absolute HTTP or @code{file:///} URL.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node collections — Container datatypes,collections abc — Abstract Base Classes for Containers,calendar — General calendar-related functions,Data Types
@anchor{library/collections doc}@anchor{29da}@anchor{library/collections collections-container-datatypes}@anchor{29db}@anchor{library/collections module-collections}@anchor{1e}@anchor{library/collections translation-repo}@anchor{29dc}
@subsection @code{collections} — Container datatypes


@geindex module; collections

`Source code:' Lib/collections/__init__.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/collections/__init__.py}

@c from collections import *
@c import itertools
@c __name__ = '<doctest>'


__________________________________________________________________


This module implements specialized container datatypes providing alternatives to
Python’s general purpose built-in containers, @ref{184,,dict}, @ref{24f,,list},
@ref{185,,set}, and @ref{614,,tuple}.


@multitable {xxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@ref{4e1,,namedtuple()}

@tab

factory function for creating tuple subclasses with named fields

@item

@ref{7f5,,deque}

@tab

list-like container with fast appends and pops on either end

@item

@ref{e1c,,ChainMap}

@tab

dict-like class for creating a single view of multiple mappings

@item

@ref{129d,,Counter}

@tab

dict subclass for counting @ref{825,,hashable} objects

@item

@ref{7f4,,OrderedDict}

@tab

dict subclass that remembers the order entries were added

@item

@ref{13c8,,defaultdict}

@tab

dict subclass that calls a factory function to supply missing values

@item

@ref{1dc1,,UserDict}

@tab

wrapper around dictionary objects for easier dict subclassing

@item

@ref{16f0,,UserList}

@tab

wrapper around list objects for easier list subclassing

@item

@ref{fd9,,UserString}

@tab

wrapper around string objects for easier string subclassing

@end multitable


@menu
* ChainMap objects:: 
* Counter objects:: 
* deque objects:: 
* defaultdict objects:: 
* namedtuple() Factory Function for Tuples with Named Fields: namedtuple Factory Function for Tuples with Named Fields. 
* OrderedDict objects:: 
* UserDict objects:: 
* UserList objects:: 
* UserString objects:: 

@end menu

@node ChainMap objects,Counter objects,,collections — Container datatypes
@anchor{library/collections chainmap-objects}@anchor{29dd}
@subsubsection @code{ChainMap} objects



Added in version 3.3.


A @ref{e1c,,ChainMap} class is provided for quickly linking a number of mappings
so they can be treated as a single unit.  It is often much faster than creating
a new dictionary and running multiple @ref{1671,,update()} calls.

The class can be used to simulate nested scopes and is useful in templating.

@geindex ChainMap (class in collections)
@anchor{library/collections collections ChainMap}@anchor{e1c}
@deffn {Class} collections.ChainMap (*maps)

A @code{ChainMap} groups multiple dicts or other mappings together to
create a single, updateable view.  If no `maps' are specified, a single empty
dictionary is provided so that a new chain always has at least one mapping.

The underlying mappings are stored in a list.  That list is public and can
be accessed or updated using the `maps' attribute.  There is no other state.

Lookups search the underlying mappings successively until a key is found.  In
contrast, writes, updates, and deletions only operate on the first mapping.

A @code{ChainMap} incorporates the underlying mappings by reference.  So, if
one of the underlying mappings gets updated, those changes will be reflected
in @code{ChainMap}.

All of the usual dictionary methods are supported.  In addition, there is a
`maps' attribute, a method for creating new subcontexts, and a property for
accessing all but the first mapping:

@geindex maps (collections.ChainMap attribute)
@anchor{library/collections collections ChainMap maps}@anchor{29de}
@deffn {Attribute} maps

A user updateable list of mappings.  The list is ordered from
first-searched to last-searched.  It is the only stored state and can
be modified to change which mappings are searched.  The list should
always contain at least one mapping.
@end deffn

@geindex new_child() (collections.ChainMap method)
@anchor{library/collections collections ChainMap new_child}@anchor{112b}
@deffn {Method} new_child (m=None, **kwargs)

Returns a new @code{ChainMap} containing a new map followed by
all of the maps in the current instance.  If @code{m} is specified,
it becomes the new map at the front of the list of mappings; if not
specified, an empty dict is used, so that a call to @code{d.new_child()}
is equivalent to: @code{ChainMap(@{@}, *d.maps)}. If any keyword arguments
are specified, they update passed map or new empty dict. This method
is used for creating subcontexts that can be updated without altering
values in any of the parent mappings.


Changed in version 3.4: The optional @code{m} parameter was added.



Changed in version 3.10: Keyword arguments support was added.

@end deffn

@geindex parents (collections.ChainMap attribute)
@anchor{library/collections collections ChainMap parents}@anchor{29df}
@deffn {Attribute} parents

Property returning a new @code{ChainMap} containing all of the maps in
the current instance except the first one.  This is useful for skipping
the first map in the search.  Use cases are similar to those for the
@ref{14b3,,nonlocal} keyword used in @ref{23d4,,nested scopes}.  The use cases also parallel those for the built-in
@ref{1a7,,super()} function.  A reference to @code{d.parents} is equivalent to:
@code{ChainMap(*d.maps[1:])}.
@end deffn

Note, the iteration order of a @code{ChainMap} is determined by
scanning the mappings last to first:

@example
>>> baseline = @{'music': 'bach', 'art': 'rembrandt'@}
>>> adjustments = @{'art': 'van gogh', 'opera': 'carmen'@}
>>> list(ChainMap(adjustments, baseline))
['music', 'art', 'opera']
@end example

This gives the same ordering as a series of @ref{1671,,dict.update()} calls
starting with the last mapping:

@example
>>> combined = baseline.copy()
>>> combined.update(adjustments)
>>> list(combined)
['music', 'art', 'opera']
@end example


Changed in version 3.9: Added support for @code{|} and @code{|=} operators, specified in 
@geindex Python Enhancement Proposals; PEP 584
PEP 584@footnote{https://peps.python.org/pep-0584/}.

@end deffn


@subsubheading See also



@itemize *

@item 
The MultiContext class@footnote{https://github.com/enthought/codetools/blob/4.0.0/codetools/contexts/multi_context.py}
in the Enthought CodeTools package@footnote{https://github.com/enthought/codetools} has options to support
writing to any mapping in the chain.

@item 
Django’s Context class@footnote{https://github.com/django/django/blob/main/django/template/context.py}
for templating is a read-only chain of mappings.  It also features
pushing and popping of contexts similar to the
@ref{112b,,new_child()} method and the
@ref{29df,,parents} property.

@item 
The Nested Contexts recipe@footnote{https://code.activestate.com/recipes/577434-nested-contexts-a-chain-of-mapping-objects/} has options to control
whether writes and other mutations apply only to the first mapping or to
any mapping in the chain.

@item 
A greatly simplified read-only version of Chainmap@footnote{https://code.activestate.com/recipes/305268/}.
@end itemize


@menu
* ChainMap Examples and Recipes:: 

@end menu

@node ChainMap Examples and Recipes,,,ChainMap objects
@anchor{library/collections chainmap-examples-and-recipes}@anchor{29e0}
@subsubsection @code{ChainMap} Examples and Recipes


This section shows various approaches to working with chained maps.

Example of simulating Python’s internal lookup chain:

@example
import builtins
pylookup = ChainMap(locals(), globals(), vars(builtins))
@end example

Example of letting user specified command-line arguments take precedence over
environment variables which in turn take precedence over default values:

@example
import os, argparse

defaults = @{'color': 'red', 'user': 'guest'@}

parser = argparse.ArgumentParser()
parser.add_argument('-u', '--user')
parser.add_argument('-c', '--color')
namespace = parser.parse_args()
command_line_args = @{k: v for k, v in vars(namespace).items() if v is not None@}

combined = ChainMap(command_line_args, os.environ, defaults)
print(combined['color'])
print(combined['user'])
@end example

Example patterns for using the @ref{e1c,,ChainMap} class to simulate nested
contexts:

@example
c = ChainMap()        # Create root context
d = c.new_child()     # Create nested child context
e = c.new_child()     # Child of c, independent from d
e.maps[0]             # Current context dictionary -- like Python's locals()
e.maps[-1]            # Root context -- like Python's globals()
e.parents             # Enclosing context chain -- like Python's nonlocals

d['x'] = 1            # Set value in current context
d['x']                # Get first key in the chain of contexts
del d['x']            # Delete from current context
list(d)               # All nested values
k in d                # Check all nested values
len(d)                # Number of nested values
d.items()             # All nested items
dict(d)               # Flatten into a regular dictionary
@end example

The @ref{e1c,,ChainMap} class only makes updates (writes and deletions) to the
first mapping in the chain while lookups will search the full chain.  However,
if deep writes and deletions are desired, it is easy to make a subclass that
updates keys found deeper in the chain:

@example
class DeepChainMap(ChainMap):
    'Variant of ChainMap that allows direct updates to inner scopes'

    def __setitem__(self, key, value):
        for mapping in self.maps:
            if key in mapping:
                mapping[key] = value
                return
        self.maps[0][key] = value

    def __delitem__(self, key):
        for mapping in self.maps:
            if key in mapping:
                del mapping[key]
                return
        raise KeyError(key)

>>> d = DeepChainMap(@{'zebra': 'black'@}, @{'elephant': 'blue'@}, @{'lion': 'yellow'@})
>>> d['lion'] = 'orange'         # update an existing key two levels down
>>> d['snake'] = 'red'           # new keys get added to the topmost dict
>>> del d['elephant']            # remove an existing key one level down
>>> d                            # display result
DeepChainMap(@{'zebra': 'black', 'snake': 'red'@}, @{@}, @{'lion': 'orange'@})
@end example

@node Counter objects,deque objects,ChainMap objects,collections — Container datatypes
@anchor{library/collections counter-objects}@anchor{29e1}
@subsubsection @code{Counter} objects


A counter tool is provided to support convenient and rapid tallies.
For example:

@example
>>> # Tally occurrences of words in a list
>>> cnt = Counter()
>>> for word in ['red', 'blue', 'red', 'green', 'blue', 'blue']:
...     cnt[word] += 1
...
>>> cnt
Counter(@{'blue': 3, 'red': 2, 'green': 1@})

>>> # Find the ten most common words in Hamlet
>>> import re
>>> words = re.findall(r'\w+', open('hamlet.txt').read().lower())
>>> Counter(words).most_common(10)
[('the', 1143), ('and', 966), ('to', 762), ('of', 669), ('i', 631),
 ('you', 554),  ('a', 546), ('my', 514), ('hamlet', 471), ('in', 451)]
@end example

@geindex Counter (class in collections)
@anchor{library/collections collections Counter}@anchor{129d}
@deffn {Class} collections.Counter (**kwargs)

@deffnx {Class} collections.Counter (iterable, /, **kwargs)

@deffnx {Class} collections.Counter (mapping, /, **kwargs)

A @code{Counter} is a @ref{184,,dict} subclass for counting @ref{825,,hashable} objects.
It is a collection where elements are stored as dictionary keys
and their counts are stored as dictionary values.  Counts are allowed to be
any integer value including zero or negative counts.  The @code{Counter}
class is similar to bags or multisets in other languages.

Elements are counted from an `iterable' or initialized from another
`mapping' (or counter):

@example
>>> c = Counter()                           # a new, empty counter
>>> c = Counter('gallahad')                 # a new counter from an iterable
>>> c = Counter(@{'red': 4, 'blue': 2@})      # a new counter from a mapping
>>> c = Counter(cats=4, dogs=8)             # a new counter from keyword args
@end example

Counter objects have a dictionary interface except that they return a zero
count for missing items instead of raising a @ref{5e7,,KeyError}:

@example
>>> c = Counter(['eggs', 'ham'])
>>> c['bacon']                              # count of a missing element is zero
0
@end example

Setting a count to zero does not remove an element from a counter.
Use @code{del} to remove it entirely:

@example
>>> c['sausage'] = 0                        # counter entry with a zero count
>>> del c['sausage']                        # del actually removes the entry
@end example


Added in version 3.1.



Changed in version 3.7: As a @ref{184,,dict} subclass, @code{Counter}
inherited the capability to remember insertion order.  Math operations
on `Counter' objects also preserve order.  Results are ordered
according to when an element is first encountered in the left operand
and then by the order encountered in the right operand.


Counter objects support additional methods beyond those available for all
dictionaries:

@geindex elements() (collections.Counter method)
@anchor{library/collections collections Counter elements}@anchor{150f}
@deffn {Method} elements ()

Return an iterator over elements repeating each as many times as its
count.  Elements are returned in the order first encountered. If an
element’s count is less than one, @code{elements()} will ignore it.

@example
>>> c = Counter(a=4, b=2, c=0, d=-2)
>>> sorted(c.elements())
['a', 'a', 'a', 'a', 'b', 'b']
@end example
@end deffn

@geindex most_common() (collections.Counter method)
@anchor{library/collections collections Counter most_common}@anchor{150e}
@deffn {Method} most_common (n=None)

Return a list of the `n' most common elements and their counts from the
most common to the least.  If `n' is omitted or @code{None},
@code{most_common()} returns `all' elements in the counter.
Elements with equal counts are ordered in the order first encountered:

@example
>>> Counter('abracadabra').most_common(3)
[('a', 5), ('b', 2), ('r', 2)]
@end example
@end deffn

@geindex subtract() (collections.Counter method)
@anchor{library/collections collections Counter subtract}@anchor{13ea}
@deffn {Method} subtract (**kwargs)

@deffnx {Method} subtract (iterable, /, **kwargs)

@deffnx {Method} subtract (mapping, /, **kwargs)

Elements are subtracted from an `iterable' or from another `mapping'
(or counter).  Like @ref{1671,,dict.update()} but subtracts counts instead
of replacing them.  Both inputs and outputs may be zero or negative.

@example
>>> c = Counter(a=4, b=2, c=0, d=-2)
>>> d = Counter(a=1, b=2, c=3, d=4)
>>> c.subtract(d)
>>> c
Counter(@{'a': 3, 'b': 0, 'c': -3, 'd': -6@})
@end example


Added in version 3.2.

@end deffn

@geindex total() (collections.Counter method)
@anchor{library/collections collections Counter total}@anchor{29e2}
@deffn {Method} total ()

Compute the sum of the counts.

@example
>>> c = Counter(a=10, b=5, c=0)
>>> c.total()
15
@end example


Added in version 3.10.

@end deffn

The usual dictionary methods are available for @code{Counter} objects
except for two which work differently for counters.

@geindex fromkeys() (collections.Counter method)
@anchor{library/collections collections Counter fromkeys}@anchor{29e3}
@deffn {Method} fromkeys (iterable)

This class method is not implemented for @code{Counter} objects.
@end deffn

@geindex update() (collections.Counter method)
@anchor{library/collections collections Counter update}@anchor{17ce}
@deffn {Method} update (**kwargs)

@deffnx {Method} update (iterable, /, **kwargs)

@deffnx {Method} update (mapping, /, **kwargs)

Elements are counted from an `iterable' or added-in from another
`mapping' (or counter).  Like @ref{1671,,dict.update()} but adds counts
instead of replacing them.  Also, the `iterable' is expected to be a
sequence of elements, not a sequence of @code{(key, value)} pairs.
@end deffn
@end deffn

Counters support rich comparison operators for equality, subset, and
superset relationships: @code{==}, @code{!=}, @code{<}, @code{<=}, @code{>}, @code{>=}.
All of those tests treat missing elements as having zero counts so that
@code{Counter(a=1) == Counter(a=1, b=0)} returns true.


Changed in version 3.10: Rich comparison operations were added.



Changed in version 3.10: In equality tests, missing elements are treated as having zero counts.
Formerly, @code{Counter(a=3)} and @code{Counter(a=3, b=0)} were considered
distinct.


Common patterns for working with @ref{129d,,Counter} objects:

@example
c.total()                       # total of all counts
c.clear()                       # reset all counts
list(c)                         # list unique elements
set(c)                          # convert to a set
dict(c)                         # convert to a regular dictionary
c.items()                       # access the (elem, cnt) pairs
Counter(dict(list_of_pairs))    # convert from a list of (elem, cnt) pairs
c.most_common()[:-n-1:-1]       # n least common elements
+c                              # remove zero and negative counts
@end example

Several mathematical operations are provided for combining @ref{129d,,Counter}
objects to produce multisets (counters that have counts greater than zero).
Addition and subtraction combine counters by adding or subtracting the counts
of corresponding elements.  Intersection and union return the minimum and
maximum of corresponding counts.  Equality and inclusion compare
corresponding counts.  Each operation can accept inputs with signed
counts, but the output will exclude results with counts of zero or less.

@example
>>> c = Counter(a=3, b=1)
>>> d = Counter(a=1, b=2)
>>> c + d                       # add two counters together:  c[x] + d[x]
Counter(@{'a': 4, 'b': 3@})
>>> c - d                       # subtract (keeping only positive counts)
Counter(@{'a': 2@})
>>> c & d                       # intersection:  min(c[x], d[x])
Counter(@{'a': 1, 'b': 1@})
>>> c | d                       # union:  max(c[x], d[x])
Counter(@{'a': 3, 'b': 2@})
>>> c == d                      # equality:  c[x] == d[x]
False
>>> c <= d                      # inclusion:  c[x] <= d[x]
False
@end example

Unary addition and subtraction are shortcuts for adding an empty counter
or subtracting from an empty counter.

@example
>>> c = Counter(a=2, b=-4)
>>> +c
Counter(@{'a': 2@})
>>> -c
Counter(@{'b': 4@})
@end example


Added in version 3.3: Added support for unary plus, unary minus, and in-place multiset operations.


@cartouche
@quotation Note 
Counters were primarily designed to work with positive integers to represent
running counts; however, care was taken to not unnecessarily preclude use
cases needing other types or negative values.  To help with those use cases,
this section documents the minimum range and type restrictions.


@itemize *

@item 
The @ref{129d,,Counter} class itself is a dictionary subclass with no
restrictions on its keys and values.  The values are intended to be numbers
representing counts, but you `could' store anything in the value field.

@item 
The @ref{150e,,most_common()} method requires only that the values be orderable.

@item 
For in-place operations such as @code{c[key] += 1}, the value type need only
support addition and subtraction.  So fractions, floats, and decimals would
work and negative values are supported.  The same is also true for
@ref{17ce,,update()} and @ref{13ea,,subtract()} which allow negative and zero values
for both inputs and outputs.

@item 
The multiset methods are designed only for use cases with positive values.
The inputs may be negative or zero, but only outputs with positive values
are created.  There are no type restrictions, but the value type needs to
support addition, subtraction, and comparison.

@item 
The @ref{150f,,elements()} method requires integer counts.  It ignores zero and
negative counts.
@end itemize
@end quotation
@end cartouche


@subsubheading See also



@itemize *

@item 
Bag class@footnote{https://www.gnu.org/software/smalltalk/manual-base/html_node/Bag.html}
in Smalltalk.

@item 
Wikipedia entry for Multisets@footnote{https://en.wikipedia.org/wiki/Multiset}.

@item 
C++ multisets@footnote{http://www.java2s.com/Tutorial/Cpp/0380__set-multiset/Catalog0380__set-multiset.htm}
tutorial with examples.

@item 
For mathematical operations on multisets and their use cases, see
`Knuth, Donald. The Art of Computer Programming Volume II,
Section 4.6.3, Exercise 19'.

@item 
To enumerate all distinct multisets of a given size over a given set of
elements, see @ref{148d,,itertools.combinations_with_replacement()}:

@example
map(Counter, combinations_with_replacement('ABC', 2)) # --> AA AB AC BB BC CC
@end example
@end itemize


@node deque objects,defaultdict objects,Counter objects,collections — Container datatypes
@anchor{library/collections deque-objects}@anchor{29e4}
@subsubsection @code{deque} objects


@geindex deque (class in collections)
@anchor{library/collections collections deque}@anchor{7f5}
@deffn {Class} collections.deque ([iterable[, maxlen]])

Returns a new deque object initialized left-to-right (using @ref{29e5,,append()}) with
data from `iterable'.  If `iterable' is not specified, the new deque is empty.

Deques are a generalization of stacks and queues (the name is pronounced “deck”
and is short for “double-ended queue”).  Deques support thread-safe, memory
efficient appends and pops from either side of the deque with approximately the
same `O'(1) performance in either direction.

Though @ref{24f,,list} objects support similar operations, they are optimized for
fast fixed-length operations and incur `O'(`n') memory movement costs for
@code{pop(0)} and @code{insert(0, v)} operations which change both the size and
position of the underlying data representation.

If `maxlen' is not specified or is @code{None}, deques may grow to an
arbitrary length.  Otherwise, the deque is bounded to the specified maximum
length.  Once a bounded length deque is full, when new items are added, a
corresponding number of items are discarded from the opposite end.  Bounded
length deques provide functionality similar to the @code{tail} filter in
Unix. They are also useful for tracking transactions and other pools of data
where only the most recent activity is of interest.

Deques are @ref{2410,,generic} over the type of their contents.

Deque objects support the following methods:

@geindex append() (collections.deque method)
@anchor{library/collections collections deque append}@anchor{29e5}
@deffn {Method} append (item, /)

Add `item' to the right side of the deque.
@end deffn

@geindex appendleft() (collections.deque method)
@anchor{library/collections collections deque appendleft}@anchor{29e6}
@deffn {Method} appendleft (item, /)

Add `item' to the left side of the deque.
@end deffn

@geindex clear() (collections.deque method)
@anchor{library/collections collections deque clear}@anchor{29e7}
@deffn {Method} clear ()

Remove all elements from the deque leaving it with length 0.
@end deffn

@geindex copy() (collections.deque method)
@anchor{library/collections collections deque copy}@anchor{fd8}
@deffn {Method} copy ()

Create a shallow copy of the deque.


Added in version 3.5.

@end deffn

@geindex count() (collections.deque method)
@anchor{library/collections collections deque count}@anchor{13ec}
@deffn {Method} count (value, /)

Count the number of deque elements equal to `value'.


Added in version 3.2.

@end deffn

@geindex extend() (collections.deque method)
@anchor{library/collections collections deque extend}@anchor{29e8}
@deffn {Method} extend (iterable, /)

Extend the right side of the deque by appending elements from the iterable
argument.
@end deffn

@geindex extendleft() (collections.deque method)
@anchor{library/collections collections deque extendleft}@anchor{29e9}
@deffn {Method} extendleft (iterable, /)

Extend the left side of the deque by appending elements from `iterable'.
Note, the series of left appends results in reversing the order of
elements in the iterable argument.
@end deffn

@geindex index() (collections.deque method)
@anchor{library/collections collections deque index}@anchor{fd6}
@deffn {Method} index (value[, start[, stop]])

Return the position of `value' in the deque (at or after index `start'
and before index `stop').  Returns the first match or raises
@ref{2ee,,ValueError} if not found.


Added in version 3.5.

@end deffn

@geindex insert() (collections.deque method)
@anchor{library/collections collections deque insert}@anchor{fd7}
@deffn {Method} insert (index, value, /)

Insert `value' into the deque at position `index'.

If the insertion would cause a bounded deque to grow beyond `maxlen',
an @ref{1741,,IndexError} is raised.


Added in version 3.5.

@end deffn

@geindex pop() (collections.deque method)
@anchor{library/collections collections deque pop}@anchor{29ea}
@deffn {Method} pop ()

Remove and return an element from the right side of the deque. If no
elements are present, raises an @ref{1741,,IndexError}.
@end deffn

@geindex popleft() (collections.deque method)
@anchor{library/collections collections deque popleft}@anchor{29eb}
@deffn {Method} popleft ()

Remove and return an element from the left side of the deque. If no
elements are present, raises an @ref{1741,,IndexError}.
@end deffn

@geindex remove() (collections.deque method)
@anchor{library/collections collections deque remove}@anchor{1d12}
@deffn {Method} remove (value, /)

Remove the first occurrence of `value'.  If not found, raises a
@ref{2ee,,ValueError}.
@end deffn

@geindex reverse() (collections.deque method)
@anchor{library/collections collections deque reverse}@anchor{13ed}
@deffn {Method} reverse ()

Reverse the elements of the deque in-place and then return @code{None}.


Added in version 3.2.

@end deffn

@geindex rotate() (collections.deque method)
@anchor{library/collections collections deque rotate}@anchor{1cd1}
@deffn {Method} rotate (n=1, /)

Rotate the deque `n' steps to the right.  If `n' is negative, rotate
to the left.

When the deque is not empty, rotating one step to the right is equivalent
to @code{d.appendleft(d.pop())}, and rotating one step to the left is
equivalent to @code{d.append(d.popleft())}.
@end deffn

Deque objects also provide one read-only attribute:

@geindex maxlen (collections.deque attribute)
@anchor{library/collections collections deque maxlen}@anchor{1510}
@deffn {Attribute} maxlen

Maximum size of a deque or @code{None} if unbounded.


Added in version 3.1.

@end deffn
@end deffn

In addition to the above, deques support iteration, pickling, @code{len(d)},
@code{reversed(d)}, @code{copy.copy(d)}, @code{copy.deepcopy(d)}, membership testing with
the @ref{349,,in} operator, and subscript references such as @code{d[0]} to access
the first element.  Indexed access is `O'(1) at both ends but slows to `O'(`n') in
the middle.  For fast random access, use lists instead.

Starting in version 3.5, deques support @code{__add__()}, @code{__mul__()},
and @code{__imul__()}.

Example:

@example
>>> from collections import deque
>>> d = deque('ghi')                 # make a new deque with three items
>>> for elem in d:                   # iterate over the deque's elements
...     print(elem.upper())
G
H
I

>>> d.append('j')                    # add a new entry to the right side
>>> d.appendleft('f')                # add a new entry to the left side
>>> d                                # show the representation of the deque
deque(['f', 'g', 'h', 'i', 'j'])

>>> d.pop()                          # return and remove the rightmost item
'j'
>>> d.popleft()                      # return and remove the leftmost item
'f'
>>> list(d)                          # list the contents of the deque
['g', 'h', 'i']
>>> d[0]                             # peek at leftmost item
'g'
>>> d[-1]                            # peek at rightmost item
'i'

>>> list(reversed(d))                # list the contents of a deque in reverse
['i', 'h', 'g']
>>> 'h' in d                         # search the deque
True
>>> d.extend('jkl')                  # add multiple elements at once
>>> d
deque(['g', 'h', 'i', 'j', 'k', 'l'])
>>> d.rotate(1)                      # right rotation
>>> d
deque(['l', 'g', 'h', 'i', 'j', 'k'])
>>> d.rotate(-1)                     # left rotation
>>> d
deque(['g', 'h', 'i', 'j', 'k', 'l'])

>>> deque(reversed(d))               # make a new deque in reverse order
deque(['l', 'k', 'j', 'i', 'h', 'g'])
>>> d.clear()                        # empty the deque
>>> d.pop()                          # cannot pop from an empty deque
Traceback (most recent call last):
    File "<pyshell#6>", line 1, in -toplevel-
        d.pop()
IndexError: pop from an empty deque

>>> d.extendleft('abc')              # extendleft() reverses the input order
>>> d
deque(['c', 'b', 'a'])
@end example

@menu
* deque Recipes:: 

@end menu

@node deque Recipes,,,deque objects
@anchor{library/collections deque-recipes}@anchor{29ec}
@subsubsection @code{deque} Recipes


This section shows various approaches to working with deques.

Bounded length deques provide functionality similar to the @code{tail} filter
in Unix:

@example
def tail(filename, n=10):
    'Return the last n lines of a file'
    with open(filename) as f:
        return deque(f, n)
@end example

Another approach to using deques is to maintain a sequence of recently
added elements by appending to the right and popping to the left:

@example
def moving_average(iterable, n=3):
    # moving_average([40, 30, 50, 46, 39, 44]) --> 40.0 42.0 45.0 43.0
    # https://en.wikipedia.org/wiki/Moving_average
    it = iter(iterable)
    d = deque(itertools.islice(it, n-1))
    d.appendleft(0)
    s = sum(d)
    for elem in it:
        s += elem - d.popleft()
        d.append(elem)
        yield s / n
@end example

A round-robin scheduler@footnote{https://en.wikipedia.org/wiki/Round-robin_scheduling} can be implemented with
input iterators stored in a @ref{7f5,,deque}.  Values are yielded from the active
iterator in position zero.  If that iterator is exhausted, it can be removed
with @ref{29eb,,popleft()}; otherwise, it can be cycled back to the end with
the @ref{1cd1,,rotate()} method:

@example
def roundrobin(*iterables):
    "roundrobin('ABC', 'D', 'EF') --> A D E B F C"
    iterators = deque(map(iter, iterables))
    while iterators:
        try:
            while True:
                yield next(iterators[0])
                iterators.rotate(-1)
        except StopIteration:
            # Remove an exhausted iterator.
            iterators.popleft()
@end example

The @ref{1cd1,,rotate()} method provides a way to implement @ref{7f5,,deque} slicing and
deletion.  For example, a pure Python implementation of @code{del d[n]} relies on
the @code{rotate()} method to position elements to be popped:

@example
def delete_nth(d, n):
    d.rotate(-n)
    d.popleft()
    d.rotate(n)
@end example

To implement @ref{7f5,,deque} slicing, use a similar approach applying
@ref{1cd1,,rotate()} to bring a target element to the left side of the deque. Remove
old entries with @ref{29eb,,popleft()}, add new entries with @ref{29e8,,extend()}, and then
reverse the rotation.
With minor variations on that approach, it is easy to implement Forth style
stack manipulations such as @code{dup}, @code{drop}, @code{swap}, @code{over}, @code{pick},
@code{rot}, and @code{roll}.

@node defaultdict objects,namedtuple Factory Function for Tuples with Named Fields,deque objects,collections — Container datatypes
@anchor{library/collections defaultdict-objects}@anchor{29ed}
@subsubsection @code{defaultdict} objects


@geindex defaultdict (class in collections)
@anchor{library/collections collections defaultdict}@anchor{13c8}
@deffn {Class} collections.defaultdict (default_factory=None, /, **kwargs)

@deffnx {Class} collections.defaultdict (default_factory, mapping, /, **kwargs)

@deffnx {Class} collections.defaultdict (default_factory, iterable, /, **kwargs)

Return a new dictionary-like object.  @code{defaultdict} is a subclass of the
built-in @ref{184,,dict} class.  It overrides one method and adds one writable
instance variable.  The remaining functionality is the same as for the
@code{dict} class and is not documented here.

The first argument provides the initial value for the @ref{29ee,,default_factory}
attribute; it defaults to @code{None}. All remaining arguments are treated the same
as if they were passed to the @ref{184,,dict} constructor, including keyword
arguments.

@code{defaultdict}s are @ref{2410,,generic} over two types,
signifying (respectively) the types of the dictionary’s keys and values.

@code{defaultdict} objects support the following method in addition to the
standard @ref{184,,dict} operations:

@geindex __missing__() (collections.defaultdict method)
@anchor{library/collections collections defaultdict __missing__}@anchor{29ef}
@deffn {Method} __missing__ (key, /)

If the @ref{29ee,,default_factory} attribute is @code{None}, this raises a
@ref{5e7,,KeyError} exception with the `key' as argument.

If @ref{29ee,,default_factory} is not @code{None}, it is called without arguments
to provide a default value for the given `key', this value is inserted in
the dictionary for the `key', and returned.

If calling @ref{29ee,,default_factory} raises an exception this exception is
propagated unchanged.

This method is called by the @ref{588,,__getitem__()} method of the
@ref{184,,dict} class when the requested key is not found; whatever it
returns or raises is then returned or raised by @code{__getitem__()}.

Note that @code{__missing__()} is `not' called for any operations besides
@ref{588,,__getitem__()}. This means that @ref{2078,,get()} will, like
normal dictionaries, return @code{None} as a default rather than using
@ref{29ee,,default_factory}.
@end deffn

@code{defaultdict} objects support the following instance variable:

@geindex default_factory (collections.defaultdict attribute)
@anchor{library/collections collections defaultdict default_factory}@anchor{29ee}
@deffn {Attribute} default_factory

This attribute is used by the @ref{29ef,,__missing__()} method;
it is initialized from the first argument to the constructor, if present,
or to @code{None}, if absent.
@end deffn


Changed in version 3.9: Added merge (@code{|}) and update (@code{|=}) operators, specified in
@geindex Python Enhancement Proposals; PEP 584
PEP 584@footnote{https://peps.python.org/pep-0584/}.

@end deffn

@menu
* defaultdict Examples:: 

@end menu

@node defaultdict Examples,,,defaultdict objects
@anchor{library/collections defaultdict-examples}@anchor{29f0}
@subsubsection @code{defaultdict} Examples


Using @ref{24f,,list} as the @ref{29ee,,default_factory}, it is easy to group a
sequence of key-value pairs into a dictionary of lists:

@example
>>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
>>> d = defaultdict(list)
>>> for k, v in s:
...     d[k].append(v)
...
>>> sorted(d.items())
[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]
@end example

When each key is encountered for the first time, it is not already in the
mapping; so an entry is automatically created using the @ref{29ee,,default_factory}
function which returns an empty @ref{24f,,list}.  The @ref{8de,,list.append()}
operation then attaches the value to the new list.  When keys are encountered
again, the look-up proceeds normally (returning the list for that key) and the
@code{list.append()} operation adds another value to the list. This technique is
simpler and faster than an equivalent technique using @ref{127f,,dict.setdefault()}:

@example
>>> d = @{@}
>>> for k, v in s:
...     d.setdefault(k, []).append(v)
...
>>> sorted(d.items())
[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]
@end example

Setting the @ref{29ee,,default_factory} to @ref{19c,,int} makes the
@ref{13c8,,defaultdict} useful for counting (like a bag or multiset in other
languages):

@example
>>> s = 'mississippi'
>>> d = defaultdict(int)
>>> for k in s:
...     d[k] += 1
...
>>> sorted(d.items())
[('i', 4), ('m', 1), ('p', 2), ('s', 4)]
@end example

When a letter is first encountered, it is missing from the mapping, so the
@ref{29ee,,default_factory} function calls @ref{19c,,int()} to supply a default count of
zero.  The increment operation then builds up the count for each letter.

The function @ref{19c,,int()} which always returns zero is just a special case of
constant functions.  A faster and more flexible way to create constant functions
is to use a lambda function which can supply any constant value (not just
zero):

@example
>>> def constant_factory(value):
...     return lambda: value
...
>>> d = defaultdict(constant_factory('<missing>'))
>>> d.update(name='John', action='ran')
>>> '%(name)s %(action)s to %(object)s' % d
'John ran to <missing>'
@end example

Setting the @ref{29ee,,default_factory} to @ref{185,,set} makes the
@ref{13c8,,defaultdict} useful for building a dictionary of sets:

@example
>>> s = [('red', 1), ('blue', 2), ('red', 3), ('blue', 4), ('red', 1), ('blue', 4)]
>>> d = defaultdict(set)
>>> for k, v in s:
...     d[k].add(v)
...
>>> sorted(d.items())
[('blue', @{2, 4@}), ('red', @{1, 3@})]
@end example

@node namedtuple Factory Function for Tuples with Named Fields,OrderedDict objects,defaultdict objects,collections — Container datatypes
@anchor{library/collections namedtuple-factory-function-for-tuples-with-named-fields}@anchor{29f1}
@subsubsection @code{namedtuple()} Factory Function for Tuples with Named Fields


Named tuples assign meaning to each position in a tuple and allow for more readable,
self-documenting code.  They can be used wherever regular tuples are used, and
they add the ability to access fields by name instead of position index.

@geindex namedtuple() (in module collections)
@anchor{library/collections collections namedtuple}@anchor{4e1}
@deffn {Function} collections.namedtuple (typename, field_names, *, rename=False, defaults=None, module=None)

Returns a new tuple subclass named `typename'.  The new subclass is used to
create tuple-like objects that have fields accessible by attribute lookup as
well as being indexable and iterable.  Instances of the subclass also have a
helpful docstring (with `typename' and `field_names') and a helpful
@ref{830,,__repr__()} method which lists the tuple contents in a @code{name=value}
format.

The `field_names' are a sequence of strings such as @code{['x', 'y']}.
Alternatively, `field_names' can be a single string with each fieldname
separated by whitespace and/or commas, for example @code{'x y'} or @code{'x, y'}.

Any valid Python identifier may be used for a fieldname except for names
starting with an underscore.  Valid identifiers consist of letters, digits,
and underscores but do not start with a digit or underscore and cannot be
a @ref{88,,keyword} such as `class', `for', `return', `global', `pass',
or `raise'.

If `rename' is true, invalid fieldnames are automatically replaced
with positional names.  For example, @code{['abc', 'def', 'ghi', 'abc']} is
converted to @code{['abc', '_1', 'ghi', '_3']}, eliminating the keyword
@code{def} and the duplicate fieldname @code{abc}.

`defaults' can be @code{None} or an @ref{1433,,iterable} of default values.
Since fields with a default value must come after any fields without a
default, the `defaults' are applied to the rightmost parameters.  For
example, if the fieldnames are @code{['x', 'y', 'z']} and the defaults are
@code{(1, 2)}, then @code{x} will be a required argument, @code{y} will default to
@code{1}, and @code{z} will default to @code{2}.

If `module' is defined, the @ref{617,,__module__} attribute of the
named tuple is set to that value.

Named tuple instances do not have per-instance dictionaries, so they are
lightweight and require no more memory than regular tuples.

To support pickling, the named tuple class should be assigned to a variable
that matches `typename'.


Changed in version 3.1: Added support for `rename'.



Changed in version 3.6: The `verbose' and `rename' parameters became
@ref{5a5,,keyword-only arguments}.



Changed in version 3.6: Added the `module' parameter.



Changed in version 3.7: Removed the `verbose' parameter and the @code{_source} attribute.



Changed in version 3.7: Added the `defaults' parameter and the @ref{29f2,,_field_defaults}
attribute.

@end deffn

@example
>>> # Basic example
>>> Point = namedtuple('Point', ['x', 'y'])
>>> p = Point(11, y=22)     # instantiate with positional or keyword arguments
>>> p[0] + p[1]             # indexable like the plain tuple (11, 22)
33
>>> x, y = p                # unpack like a regular tuple
>>> x, y
(11, 22)
>>> p.x + p.y               # fields also accessible by name
33
>>> p                       # readable __repr__ with a name=value style
Point(x=11, y=22)
@end example

Named tuples are especially useful for assigning field names to result tuples returned
by the @ref{2d,,csv} or @ref{d4,,sqlite3} modules:

@example
EmployeeRecord = namedtuple('EmployeeRecord', 'name, age, title, department, paygrade')

import csv
for emp in map(EmployeeRecord._make, csv.reader(open("employees.csv", "rb"))):
    print(emp.name, emp.title)

import sqlite3
conn = sqlite3.connect('/companydata')
cursor = conn.cursor()
cursor.execute('SELECT name, age, title, department, paygrade FROM employees')
for emp in map(EmployeeRecord._make, cursor.fetchall()):
    print(emp.name, emp.title)
@end example

In addition to the methods inherited from tuples, named tuples support
three additional methods and two attributes.  To prevent conflicts with
field names, the method and attribute names start with an underscore.

@geindex _make() (collections.somenamedtuple class method)
@anchor{library/collections collections somenamedtuple _make}@anchor{29f3}
@deffn {Method} classmethod somenamedtuple._make (iterable, /)

Class method that makes a new instance from an existing sequence or iterable.

@example
>>> t = [11, 22]
>>> Point._make(t)
Point(x=11, y=22)
@end example
@end deffn

@geindex _asdict() (collections.somenamedtuple method)
@anchor{library/collections collections somenamedtuple _asdict}@anchor{bda}
@deffn {Method} somenamedtuple._asdict ()

Return a new @ref{184,,dict} which maps field names to their corresponding
values:

@example
>>> p = Point(x=11, y=22)
>>> p._asdict()
@{'x': 11, 'y': 22@}
@end example


Changed in version 3.1: Returns an @ref{7f4,,OrderedDict} instead of a regular @ref{184,,dict}.



Changed in version 3.8: Returns a regular @ref{184,,dict} instead of an @ref{7f4,,OrderedDict}.
As of Python 3.7, regular dicts are guaranteed to be ordered.  If the
extra features of @code{OrderedDict} are required, the suggested
remediation is to cast the result to the desired type:
@code{OrderedDict(nt._asdict())}.

@end deffn

@geindex _replace() (collections.somenamedtuple method)
@anchor{library/collections collections somenamedtuple _replace}@anchor{29f4}
@deffn {Method} somenamedtuple._replace (**kwargs)

Return a new instance of the named tuple replacing specified fields with new
values:

@example
>>> p = Point(x=11, y=22)
>>> p._replace(x=33)
Point(x=33, y=22)

>>> for partnum, record in inventory.items():
...     inventory[partnum] = record._replace(price=newprices[partnum], timestamp=time.now())
@end example

Named tuples are also supported by generic function @ref{1c2,,copy.replace()}.


Changed in version 3.13: Raise @ref{199,,TypeError} instead of @ref{2ee,,ValueError} for invalid
keyword arguments.

@end deffn

@geindex _fields (collections.somenamedtuple attribute)
@anchor{library/collections collections somenamedtuple _fields}@anchor{29f5}
@deffn {Attribute} somenamedtuple._fields

Tuple of strings listing the field names.  Useful for introspection
and for creating new named tuple types from existing named tuples.

@example
>>> p._fields            # view the field names
('x', 'y')

>>> Color = namedtuple('Color', 'red green blue')
>>> Pixel = namedtuple('Pixel', Point._fields + Color._fields)
>>> Pixel(11, 22, 128, 255, 0)
Pixel(x=11, y=22, red=128, green=255, blue=0)
@end example
@end deffn

@geindex _field_defaults (collections.somenamedtuple attribute)
@anchor{library/collections collections somenamedtuple _field_defaults}@anchor{29f2}
@deffn {Attribute} somenamedtuple._field_defaults

Dictionary mapping field names to default values.

@example
>>> Account = namedtuple('Account', ['type', 'balance'], defaults=[0])
>>> Account._field_defaults
@{'balance': 0@}
>>> Account('premium')
Account(type='premium', balance=0)
@end example
@end deffn

To retrieve a field whose name is stored in a string, use the @ref{dd0,,getattr()}
function:

@example
>>> getattr(p, 'x')
11
@end example

To convert a dictionary to a named tuple, use the double-star-operator
(as described in @ref{2055,,Unpacking Argument Lists}):

@example
>>> d = @{'x': 11, 'y': 22@}
>>> Point(**d)
Point(x=11, y=22)
@end example

Since a named tuple is a regular Python class, it is easy to add or change
functionality with a subclass.  Here is how to add a calculated field and
a fixed-width print format:

@example
>>> class Point(namedtuple('Point', ['x', 'y'])):
...     __slots__ = ()
...     @@property
...     def hypot(self):
...         return (self.x ** 2 + self.y ** 2) ** 0.5
...     def __str__(self):
...         return 'Point: x=%6.3f  y=%6.3f  hypot=%6.3f' % (self.x, self.y, self.hypot)

>>> for p in Point(3, 4), Point(14, 5/7):
...     print(p)
Point: x= 3.000  y= 4.000  hypot= 5.000
Point: x=14.000  y= 0.714  hypot=14.018
@end example

The subclass shown above sets @code{__slots__} to an empty tuple.  This helps
keep memory requirements low by preventing the creation of instance dictionaries.

Subclassing is not useful for adding new, stored fields.  Instead, simply
create a new named tuple type from the @ref{29f5,,_fields} attribute:

@example
>>> Point3D = namedtuple('Point3D', Point._fields + ('z',))
@end example

Docstrings can be customized by making direct assignments to the @code{__doc__}
fields:

@example
>>> Book = namedtuple('Book', ['id', 'title', 'authors'])
>>> Book.__doc__ += ': Hardcover book in active collection'
>>> Book.id.__doc__ = '13-digit ISBN'
>>> Book.title.__doc__ = 'Title of first printing'
>>> Book.authors.__doc__ = 'List of authors sorted by last name'
@end example


Changed in version 3.5: Property docstrings became writeable.



@subsubheading See also



@itemize *

@item 
See @ref{32f,,typing.NamedTuple} for a way to add type hints for named
tuples.  It also provides an elegant notation using the @ref{14e3,,class}
keyword:

@example
class Component(NamedTuple):
    part_number: int
    weight: float
    description: Optional[str] = None
@end example

@item 
See @ref{4e6,,types.SimpleNamespace()} for a mutable namespace based on an
underlying dictionary instead of a tuple.

@item 
The @ref{33,,dataclasses} module provides a decorator and functions for
automatically adding generated special methods to user-defined classes.
@end itemize


@node OrderedDict objects,UserDict objects,namedtuple Factory Function for Tuples with Named Fields,collections — Container datatypes
@anchor{library/collections ordereddict-objects}@anchor{29f6}
@subsubsection @code{OrderedDict} objects


Ordered dictionaries are just like regular dictionaries but have some extra
capabilities relating to ordering operations.  They have become less
important now that the built-in @ref{184,,dict} class gained the ability
to remember insertion order (this new behavior became guaranteed in
Python 3.7).

Some differences from @ref{184,,dict} still remain:


@itemize *

@item 
The regular @ref{184,,dict} was designed to be very good at mapping
operations.  Tracking insertion order was secondary.

@item 
The @ref{7f4,,OrderedDict} was designed to be good at reordering operations.
Space efficiency, iteration speed, and the performance of update
operations were secondary.

@item 
The @ref{7f4,,OrderedDict} algorithm can handle frequent reordering operations
better than @ref{184,,dict}.  As shown in the recipes below, this makes it
suitable for implementing various kinds of LRU caches.

@item 
The equality operation for @ref{7f4,,OrderedDict} checks for matching order.

A regular @ref{184,,dict} can emulate the order sensitive equality test with
@code{p == q and all(k1 == k2 for k1, k2 in zip(p, q))}.

@item 
The @ref{14f9,,popitem()} method of @ref{7f4,,OrderedDict} has a different
signature.  It accepts an optional argument to specify which item is popped.

A regular @ref{184,,dict} can emulate OrderedDict’s @code{od.popitem(last=True)}
with @code{d.popitem()} which is guaranteed to pop the rightmost (last) item.

A regular @ref{184,,dict} can emulate OrderedDict’s @code{od.popitem(last=False)}
with @code{(k := next(iter(d)), d.pop(k))} which will return and remove the
leftmost (first) item if it exists.

@item 
@ref{7f4,,OrderedDict} has a @ref{13eb,,move_to_end()} method to efficiently
reposition an element to an endpoint.

A regular @ref{184,,dict} can emulate OrderedDict’s @code{od.move_to_end(k,
last=True)} with @code{d[k] = d.pop(k)} which will move the key and its
associated value to the rightmost (last) position.

A regular @ref{184,,dict} does not have an efficient equivalent for
OrderedDict’s @code{od.move_to_end(k, last=False)} which moves the key
and its associated value to the leftmost (first) position.

@item 
Until Python 3.8, @ref{184,,dict} lacked a @ref{e8c,,__reversed__()} method.
@end itemize

@geindex OrderedDict (class in collections)
@anchor{library/collections collections OrderedDict}@anchor{7f4}
@deffn {Class} collections.OrderedDict (**kwargs)

@deffnx {Class} collections.OrderedDict (mapping, /, **kwargs)

@deffnx {Class} collections.OrderedDict (iterable, /, **kwargs)

Return an instance of a @ref{184,,dict} subclass that has methods
specialized for rearranging dictionary order.


Added in version 3.1.


@geindex popitem() (collections.OrderedDict method)
@anchor{library/collections collections OrderedDict popitem}@anchor{14f9}
@deffn {Method} popitem (last=True)

The @code{popitem()} method for ordered dictionaries returns and removes a
(key, value) pair.  The pairs are returned in
@abbr{LIFO} order if `last' is true
or @abbr{FIFO,first-in@comma{} first-out} order if false.
@end deffn

@geindex move_to_end() (collections.OrderedDict method)
@anchor{library/collections collections OrderedDict move_to_end}@anchor{13eb}
@deffn {Method} move_to_end (key, last=True)

Move an existing `key' to either end of an ordered dictionary.  The item
is moved to the right end if `last' is true (the default) or to the
beginning if `last' is false.  Raises @ref{5e7,,KeyError} if the `key' does
not exist:

@example
>>> d = OrderedDict.fromkeys('abcde')
>>> d.move_to_end('b')
>>> '@w{'}.join(d)
'acdeb'
>>> d.move_to_end('b', last=False)
>>> '@w{'}.join(d)
'bacde'
@end example


Added in version 3.2.

@end deffn
@end deffn

In addition to the usual mapping methods, ordered dictionaries also support
reverse iteration using @ref{a6b,,reversed()}.
@anchor{library/collections collections-ordereddict-eq}@anchor{198d}
Equality tests between @ref{7f4,,OrderedDict} objects are order-sensitive
and are roughly equivalent to @code{list(od1.items())==list(od2.items())}.

Equality tests between @ref{7f4,,OrderedDict} objects and other
@ref{acd,,Mapping} objects are order-insensitive like regular
dictionaries.  This allows @code{OrderedDict} objects to be substituted
anywhere a regular dictionary is used.


Changed in version 3.5: The items, keys, and values @ref{29f7,,views}
of @ref{7f4,,OrderedDict} now support reverse iteration using @ref{a6b,,reversed()}.



Changed in version 3.6: With the acceptance of 
@geindex Python Enhancement Proposals; PEP 468
PEP 468@footnote{https://peps.python.org/pep-0468/}, order is retained for keyword arguments
passed to the @ref{7f4,,OrderedDict} constructor and its @ref{1671,,update()}
method.



Changed in version 3.9: Added merge (@code{|}) and update (@code{|=}) operators, specified in 
@geindex Python Enhancement Proposals; PEP 584
PEP 584@footnote{https://peps.python.org/pep-0584/}.


@menu
* OrderedDict Examples and Recipes:: 

@end menu

@node OrderedDict Examples and Recipes,,,OrderedDict objects
@anchor{library/collections ordereddict-examples-and-recipes}@anchor{29f8}
@subsubsection @code{OrderedDict} Examples and Recipes


It is straightforward to create an ordered dictionary variant
that remembers the order the keys were `last' inserted.
If a new entry overwrites an existing entry, the
original insertion position is changed and moved to the end:

@example
class LastUpdatedOrderedDict(OrderedDict):
    'Store items in the order the keys were last added'

    def __setitem__(self, key, value):
        super().__setitem__(key, value)
        self.move_to_end(key)
@end example

An @ref{7f4,,OrderedDict} would also be useful for implementing
variants of @ref{be8,,functools.lru_cache()}:

@example
from collections import OrderedDict
from time import monotonic

class TimeBoundedLRU:
    "LRU Cache that invalidates and refreshes old entries."

    def __init__(self, func, maxsize=128, maxage=30):
        self.cache = OrderedDict()      # @{ args : (timestamp, result)@}
        self.func = func
        self.maxsize = maxsize
        self.maxage = maxage

    def __call__(self, *args):
        if args in self.cache:
            self.cache.move_to_end(args)
            timestamp, result = self.cache[args]
            if monotonic() - timestamp <= self.maxage:
                return result
        result = self.func(*args)
        self.cache[args] = monotonic(), result
        if len(self.cache) > self.maxsize:
            self.cache.popitem(last=False)
        return result
@end example

@example
class MultiHitLRUCache:
    """ LRU cache that defers caching a result until
        it has been requested multiple times.

        To avoid flushing the LRU cache with one-time requests,
        we don't cache until a request has been made more than once.

    """

    def __init__(self, func, maxsize=128, maxrequests=4096, cache_after=1):
        self.requests = OrderedDict()   # @{ uncached_key : request_count @}
        self.cache = OrderedDict()      # @{ cached_key : function_result @}
        self.func = func
        self.maxrequests = maxrequests  # max number of uncached requests
        self.maxsize = maxsize          # max number of stored return values
        self.cache_after = cache_after

    def __call__(self, *args):
        if args in self.cache:
            self.cache.move_to_end(args)
            return self.cache[args]
        result = self.func(*args)
        self.requests[args] = self.requests.get(args, 0) + 1
        if self.requests[args] <= self.cache_after:
            self.requests.move_to_end(args)
            if len(self.requests) > self.maxrequests:
                self.requests.popitem(last=False)
        else:
            self.requests.pop(args, None)
            self.cache[args] = result
            if len(self.cache) > self.maxsize:
                self.cache.popitem(last=False)
        return result
@end example

@c >>> def square(x):
@c ...     return x * x
@c ...
@c >>> f = MultiHitLRUCache(square, maxsize=4, maxrequests=6)
@c >>> list(map(f, range(10)))  # First requests, don't cache
@c [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
@c >>> f(4)  # Cache the second request
@c 16
@c >>> f(6)  # Cache the second request
@c 36
@c >>> f(2)  # The first request aged out, so don't cache
@c 4
@c >>> f(6)  # Cache hit
@c 36
@c >>> f(4)  # Cache hit and move to front
@c 16
@c >>> list(f.cache.values())
@c [36, 16]
@c >>> set(f.requests).isdisjoint(f.cache)
@c True
@c >>> list(map(f, [9, 8, 7]))   # Cache these second requests
@c [81, 64, 49]
@c >>> list(map(f, [7, 9]))  # Cache hits
@c [49, 81]
@c >>> list(f.cache.values())
@c [16, 64, 49, 81]
@c >>> set(f.requests).isdisjoint(f.cache)
@c True

@node UserDict objects,UserList objects,OrderedDict objects,collections — Container datatypes
@anchor{library/collections userdict-objects}@anchor{29f9}
@subsubsection @code{UserDict} objects


The class, @ref{1dc1,,UserDict} acts as a wrapper around dictionary objects.
The need for this class has been partially supplanted by the ability to
subclass directly from @ref{184,,dict}; however, this class can be easier
to work with because the underlying dictionary is accessible as an
attribute.

@geindex UserDict (class in collections)
@anchor{library/collections collections UserDict}@anchor{1dc1}
@deffn {Class} collections.UserDict (**kwargs)

@deffnx {Class} collections.UserDict (mapping, /, **kwargs)

@deffnx {Class} collections.UserDict (iterable, /, **kwargs)

Class that simulates a dictionary.  The instance’s contents are kept in a
regular dictionary, which is accessible via the @ref{29fa,,data} attribute of
@code{UserDict} instances.  If arguments are provided, they are used to
initialize @code{data}, like a regular dictionary.

In addition to supporting the methods and operations of mappings,
@code{UserDict} instances provide the following attribute:

@geindex data (collections.UserDict attribute)
@anchor{library/collections collections UserDict data}@anchor{29fa}
@deffn {Attribute} data

A real dictionary used to store the contents of the @code{UserDict}
class.
@end deffn
@end deffn

@node UserList objects,UserString objects,UserDict objects,collections — Container datatypes
@anchor{library/collections userlist-objects}@anchor{29fb}
@subsubsection @code{UserList} objects


This class acts as a wrapper around list objects.  It is a useful base class
for your own list-like classes which can inherit from them and override
existing methods or add new ones.  In this way, one can add new behaviors to
lists.

The need for this class has been partially supplanted by the ability to
subclass directly from @ref{24f,,list}; however, this class can be easier
to work with because the underlying list is accessible as an attribute.

@geindex UserList (class in collections)
@anchor{library/collections collections UserList}@anchor{16f0}
@deffn {Class} collections.UserList ([list])

Class that simulates a list.  The instance’s contents are kept in a regular
list, which is accessible via the @ref{29fc,,data} attribute of @code{UserList}
instances.  The instance’s contents are initially set to a copy of `list',
defaulting to the empty list @code{[]}.  `list' can be any iterable, for
example a real Python list or a @code{UserList} object.

In addition to supporting the methods and operations of mutable sequences,
@code{UserList} instances provide the following attribute:

@geindex data (collections.UserList attribute)
@anchor{library/collections collections UserList data}@anchor{29fc}
@deffn {Attribute} data

A real @ref{24f,,list} object used to store the contents of the
@code{UserList} class.
@end deffn
@end deffn

`Subclassing requirements:' Subclasses of @ref{16f0,,UserList} are expected to
offer a constructor which can be called with either no arguments or one
argument.  List operations which return a new sequence attempt to create an
instance of the actual implementation class.  To do so, it assumes that the
constructor can be called with a single parameter, which is a sequence object
used as a data source.

If a derived class does not wish to comply with this requirement, all of the
special methods supported by this class will need to be overridden; please
consult the sources for information about the methods which need to be provided
in that case.

@node UserString objects,,UserList objects,collections — Container datatypes
@anchor{library/collections userstring-objects}@anchor{29fd}
@subsubsection @code{UserString} objects


The class, @ref{fd9,,UserString} acts as a wrapper around string objects.
The need for this class has been partially supplanted by the ability to
subclass directly from @ref{16a,,str}; however, this class can be easier
to work with because the underlying string is accessible as an
attribute.

@geindex UserString (class in collections)
@anchor{library/collections collections UserString}@anchor{fd9}
@deffn {Class} collections.UserString (seq)

Class that simulates a string object.  The instance’s
content is kept in a regular string object, which is accessible via the
@ref{29fe,,data} attribute of @code{UserString} instances.  The instance’s
contents are initially set to a copy of `seq'.  The `seq' argument can
be any object which can be converted into a string using the built-in
@ref{16a,,str()} function.

In addition to supporting the methods and operations of strings,
@code{UserString} instances provide the following attribute:

@geindex data (collections.UserString attribute)
@anchor{library/collections collections UserString data}@anchor{29fe}
@deffn {Attribute} data

A real @ref{16a,,str} object used to store the contents of the
@code{UserString} class.
@end deffn


Changed in version 3.5: New methods @code{__getnewargs__}, @code{__rmod__}, @code{casefold},
@code{format_map}, @code{isprintable}, and @code{maketrans}.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node collections abc — Abstract Base Classes for Containers,heapq — Heap queue algorithm,collections — Container datatypes,Data Types
@anchor{library/collections abc doc}@anchor{29ff}@anchor{library/collections abc collections-abc-abstract-base-classes-for-containers}@anchor{2a00}@anchor{library/collections abc module-collections abc}@anchor{1f}@anchor{library/collections abc translation-repo}@anchor{2a01}
@subsection @code{collections.abc} — Abstract Base Classes for Containers


@geindex module; collections.abc


Added in version 3.3: Formerly, this module was part of the @ref{1e,,collections} module.


`Source code:' Lib/_collections_abc.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/_collections_abc.py}

@c from collections.abc import *
@c import itertools
@c __name__ = '<doctest>'


__________________________________________________________________


This module provides @ref{13c2,,abstract base classes} that
can be used to test whether a class provides a particular interface; for
example, whether it is @ref{825,,hashable} or whether it is a @ref{13c7,,mapping}.

An @ref{9ca,,issubclass()} or @ref{2af,,isinstance()} test for an interface works in one
of three ways.


@enumerate 

@item 
A newly written class can inherit directly from one of the
abstract base classes.  The class must supply the required abstract
methods.  The remaining mixin methods come from inheritance and can be
overridden if desired.  Other methods may be added as needed:

@example
class C(Sequence):                      # Direct inheritance
    def __init__(self): ...             # Extra method not required by the ABC
    def __getitem__(self, index):  ...  # Required abstract method
    def __len__(self):  ...             # Required abstract method
    def count(self, value): ...         # Optionally override a mixin method
@end example

@example
>>> issubclass(C, Sequence)
True
>>> isinstance(C(), Sequence)
True
@end example

@item 
Existing classes and built-in classes can be registered as “virtual
subclasses” of the ABCs.  Those classes should define the full API
including all of the abstract methods and all of the mixin methods.
This lets users rely on @ref{9ca,,issubclass()} or @ref{2af,,isinstance()} tests
to determine whether the full interface is supported.  The exception to
this rule is for methods that are automatically inferred from the rest
of the API:

@example
class D:                                 # No inheritance
    def __init__(self): ...              # Extra method not required by the ABC
    def __getitem__(self, index):  ...   # Abstract method
    def __len__(self):  ...              # Abstract method
    def count(self, value): ...          # Mixin method
    def index(self, value): ...          # Mixin method

Sequence.register(D)                     # Register instead of inherit
@end example

@example
>>> issubclass(D, Sequence)
True
>>> isinstance(D(), Sequence)
True
@end example

In this example, class @code{D} does not need to define
@code{__contains__}, @code{__iter__}, and @code{__reversed__} because the
@ref{2517,,in-operator}, the @ref{1433,,iteration}
logic, and the @ref{a6b,,reversed()} function automatically fall back to
using @code{__getitem__} and @code{__len__}.

@item 
Some simple interfaces are directly recognizable by the presence of
the required methods (unless those methods have been set to @ref{887,,None}):

@example
class E:
    def __iter__(self): ...
    def __next__(self): ...
@end example

@example
>>> issubclass(E, Iterable)
True
>>> isinstance(E(), Iterable)
True
@end example

Complex interfaces do not support this last technique because an
interface is more than just the presence of method names.  Interfaces
specify semantics and relationships between methods that cannot be
inferred solely from the presence of specific method names.  For
example, knowing that a class supplies @code{__getitem__}, @code{__len__}, and
@code{__iter__} is insufficient for distinguishing a @ref{13d0,,Sequence} from
a @ref{acd,,Mapping}.
@end enumerate


Added in version 3.9: These abstract classes now support @code{[]}. See @ref{8c3,,Generic Alias Type}
and 
@geindex Python Enhancement Proposals; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/}.


@menu
* Collections Abstract Base Classes:: 
* Collections Abstract Base Classes – Detailed Descriptions:: 
* Examples and Recipes:: 

@end menu

@node Collections Abstract Base Classes,Collections Abstract Base Classes – Detailed Descriptions,,collections abc — Abstract Base Classes for Containers
@anchor{library/collections abc collections-abstract-base-classes}@anchor{a7e}@anchor{library/collections abc id1}@anchor{2a02}
@subsubsection Collections Abstract Base Classes


The collections module offers the following @ref{13c2,,ABCs}:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

ABC

@tab

Inherits from

@tab

Abstract Methods

@tab

Mixin Methods

@item

@ref{26fb,,Container} @footnote{
These ABCs override @ref{2a03,,__subclasshook__()} to support
testing an interface by verifying the required methods are present
and have not been set to @ref{887,,None}.  This only works for simple
interfaces.  More complex interfaces require registration or direct
subclassing.
}

@tab

@tab

@code{__contains__}

@tab

@item

@ref{71a,,Hashable} @footnote{
These ABCs override @ref{2a03,,__subclasshook__()} to support
testing an interface by verifying the required methods are present
and have not been set to @ref{887,,None}.  This only works for simple
interfaces.  More complex interfaces require registration or direct
subclassing.
}

@tab

@tab

@code{__hash__}

@tab

@item

@ref{26f9,,Iterable} @footnote{
These ABCs override @ref{2a03,,__subclasshook__()} to support
testing an interface by verifying the required methods are present
and have not been set to @ref{887,,None}.  This only works for simple
interfaces.  More complex interfaces require registration or direct
subclassing.
} @footnote{
Checking @code{isinstance(obj, Iterable)} detects classes that are
registered as @ref{26f9,,Iterable} or that have an @ref{20ee,,__iter__()}
method, but it does not detect classes that iterate with the
@ref{588,,__getitem__()} method.  The only reliable way to determine
whether an object is @ref{1433,,iterable} is to call @code{iter(obj)}.
}

@tab

@tab

@code{__iter__}

@tab

@item

@ref{26fa,,Iterator} @footnote{
These ABCs override @ref{2a03,,__subclasshook__()} to support
testing an interface by verifying the required methods are present
and have not been set to @ref{887,,None}.  This only works for simple
interfaces.  More complex interfaces require registration or direct
subclassing.
}

@tab

@ref{26f9,,Iterable}

@tab

@code{__next__}

@tab

@code{__iter__}

@item

@ref{e8b,,Reversible} @footnote{
These ABCs override @ref{2a03,,__subclasshook__()} to support
testing an interface by verifying the required methods are present
and have not been set to @ref{887,,None}.  This only works for simple
interfaces.  More complex interfaces require registration or direct
subclassing.
}

@tab

@ref{26f9,,Iterable}

@tab

@code{__reversed__}

@tab

@item

@ref{fe1,,Generator}  @footnote{
These ABCs override @ref{2a03,,__subclasshook__()} to support
testing an interface by verifying the required methods are present
and have not been set to @ref{887,,None}.  This only works for simple
interfaces.  More complex interfaces require registration or direct
subclassing.
}

@tab

@ref{26fa,,Iterator}

@tab

@code{send}, @code{throw}

@tab

@code{close}, @code{__iter__}, @code{__next__}

@item

@ref{71b,,Sized}  @footnote{
These ABCs override @ref{2a03,,__subclasshook__()} to support
testing an interface by verifying the required methods are present
and have not been set to @ref{887,,None}.  This only works for simple
interfaces.  More complex interfaces require registration or direct
subclassing.
}

@tab

@tab

@code{__len__}

@tab

@item

@ref{9f1,,Callable}  @footnote{
These ABCs override @ref{2a03,,__subclasshook__()} to support
testing an interface by verifying the required methods are present
and have not been set to @ref{887,,None}.  This only works for simple
interfaces.  More complex interfaces require registration or direct
subclassing.
}

@tab

@tab

@code{__call__}

@tab

@item

@ref{e8a,,Collection}  @footnote{
These ABCs override @ref{2a03,,__subclasshook__()} to support
testing an interface by verifying the required methods are present
and have not been set to @ref{887,,None}.  This only works for simple
interfaces.  More complex interfaces require registration or direct
subclassing.
}

@tab

@ref{71b,,Sized},
@ref{26f9,,Iterable},
@ref{26fb,,Container}

@tab

@code{__contains__},
@code{__iter__},
@code{__len__}

@tab

@item

@ref{13d0,,Sequence}

@tab

@ref{e8b,,Reversible},
@ref{e8a,,Collection}

@tab

@code{__getitem__},
@code{__len__}

@tab

@code{__contains__}, @code{__iter__}, @code{__reversed__},
@code{index}, and @code{count}

@item

@ref{4c0,,MutableSequence}

@tab

@ref{13d0,,Sequence}

@tab

@code{__getitem__},
@code{__setitem__},
@code{__delitem__},
@code{__len__},
@code{insert}

@tab

Inherited @ref{13d0,,Sequence} methods and
@code{append}, @code{clear}, @code{reverse}, @code{extend},
@code{pop}, @code{remove}, and @code{__iadd__}

@item

@ref{340,,ByteString}

@tab

@ref{13d0,,Sequence}

@tab

@code{__getitem__},
@code{__len__}

@tab

Inherited @ref{13d0,,Sequence} methods

@item

@ref{26f1,,Set}

@tab

@ref{e8a,,Collection}

@tab

@code{__contains__},
@code{__iter__},
@code{__len__}

@tab

@code{__le__}, @code{__lt__}, @code{__eq__}, @code{__ne__},
@code{__gt__}, @code{__ge__}, @code{__and__}, @code{__or__},
@code{__sub__}, @code{__rsub__}, @code{__xor__}, @code{__rxor__}
and @code{isdisjoint}

@item

@ref{26fc,,MutableSet}

@tab

@ref{26f1,,Set}

@tab

@code{__contains__},
@code{__iter__},
@code{__len__},
@code{add},
@code{discard}

@tab

Inherited @ref{26f1,,Set} methods and
@code{clear}, @code{pop}, @code{remove}, @code{__ior__},
@code{__iand__}, @code{__ixor__}, and @code{__isub__}

@item

@ref{acd,,Mapping}

@tab

@ref{e8a,,Collection}

@tab

@code{__getitem__},
@code{__iter__},
@code{__len__}

@tab

@code{__contains__}, @code{keys}, @code{items}, @code{values},
@code{get}, @code{__eq__}, and @code{__ne__}

@item

@ref{12b8,,MutableMapping}

@tab

@ref{acd,,Mapping}

@tab

@code{__getitem__},
@code{__setitem__},
@code{__delitem__},
@code{__iter__},
@code{__len__}

@tab

Inherited @ref{acd,,Mapping} methods and
@code{pop}, @code{popitem}, @code{clear}, @code{update},
and @code{setdefault}

@item

@ref{26fd,,MappingView}

@tab

@ref{71b,,Sized}

@tab

@tab

@code{__init__}, @code{__len__} and @code{__repr__}

@item

@ref{26ff,,ItemsView}

@tab

@ref{26fd,,MappingView},
@ref{26f1,,Set}

@tab

@tab

@code{__contains__},
@code{__iter__}

@item

@ref{26fe,,KeysView}

@tab

@ref{26fd,,MappingView},
@ref{26f1,,Set}

@tab

@tab

@code{__contains__},
@code{__iter__}

@item

@ref{2700,,ValuesView}

@tab

@ref{26fd,,MappingView},
@ref{e8a,,Collection}

@tab

@tab

@code{__contains__}, @code{__iter__}

@item

@ref{fe2,,Awaitable} @footnote{
These ABCs override @ref{2a03,,__subclasshook__()} to support
testing an interface by verifying the required methods are present
and have not been set to @ref{887,,None}.  This only works for simple
interfaces.  More complex interfaces require registration or direct
subclassing.
}

@tab

@tab

@code{__await__}

@tab

@item

@ref{fe3,,Coroutine} @footnote{
These ABCs override @ref{2a03,,__subclasshook__()} to support
testing an interface by verifying the required methods are present
and have not been set to @ref{887,,None}.  This only works for simple
interfaces.  More complex interfaces require registration or direct
subclassing.
}

@tab

@ref{fe2,,Awaitable}

@tab

@code{send}, @code{throw}

@tab

@code{close}

@item

@ref{fe5,,AsyncIterable} @footnote{
These ABCs override @ref{2a03,,__subclasshook__()} to support
testing an interface by verifying the required methods are present
and have not been set to @ref{887,,None}.  This only works for simple
interfaces.  More complex interfaces require registration or direct
subclassing.
}

@tab

@tab

@code{__aiter__}

@tab

@item

@ref{fe4,,AsyncIterator} @footnote{
These ABCs override @ref{2a03,,__subclasshook__()} to support
testing an interface by verifying the required methods are present
and have not been set to @ref{887,,None}.  This only works for simple
interfaces.  More complex interfaces require registration or direct
subclassing.
}

@tab

@ref{fe5,,AsyncIterable}

@tab

@code{__anext__}

@tab

@code{__aiter__}

@item

@ref{e8d,,AsyncGenerator} @footnote{
These ABCs override @ref{2a03,,__subclasshook__()} to support
testing an interface by verifying the required methods are present
and have not been set to @ref{887,,None}.  This only works for simple
interfaces.  More complex interfaces require registration or direct
subclassing.
}

@tab

@ref{fe4,,AsyncIterator}

@tab

@code{asend}, @code{athrow}

@tab

@code{aclose}, @code{__aiter__}, @code{__anext__}

@item

@ref{341,,Buffer} @footnote{
These ABCs override @ref{2a03,,__subclasshook__()} to support
testing an interface by verifying the required methods are present
and have not been set to @ref{887,,None}.  This only works for simple
interfaces.  More complex interfaces require registration or direct
subclassing.
}

@tab

@tab

@code{__buffer__}

@tab

@end multitable


@node Collections Abstract Base Classes – Detailed Descriptions,Examples and Recipes,Collections Abstract Base Classes,collections abc — Abstract Base Classes for Containers
@anchor{library/collections abc collections-abstract-base-classes-detailed-descriptions}@anchor{2a04}
@subsubsection Collections Abstract Base Classes – Detailed Descriptions


@geindex Container (class in collections.abc)
@anchor{library/collections abc collections abc Container}@anchor{26fb}
@deffn {Class} collections.abc.Container

ABC for classes that provide the @ref{15c5,,__contains__()} method.
@end deffn

@geindex Hashable (class in collections.abc)
@anchor{library/collections abc collections abc Hashable}@anchor{71a}
@deffn {Class} collections.abc.Hashable

ABC for classes that provide the @ref{cf9,,__hash__()} method.
@end deffn

@geindex Sized (class in collections.abc)
@anchor{library/collections abc collections abc Sized}@anchor{71b}
@deffn {Class} collections.abc.Sized

ABC for classes that provide the @ref{17e1,,__len__()} method.
@end deffn

@geindex Callable (class in collections.abc)
@anchor{library/collections abc collections abc Callable}@anchor{9f1}
@deffn {Class} collections.abc.Callable

ABC for classes that provide the @ref{77b,,__call__()} method.

See @ref{271a,,Annotating callable objects} for details on how to use
@code{Callable} in type annotations.
@end deffn

@geindex Iterable (class in collections.abc)
@anchor{library/collections abc collections abc Iterable}@anchor{26f9}
@deffn {Class} collections.abc.Iterable

ABC for classes that provide the @ref{20ee,,__iter__()} method.

Checking @code{isinstance(obj, Iterable)} detects classes that are registered
as @code{Iterable} or that have an @ref{20ee,,__iter__()} method,
but it does
not detect classes that iterate with the @ref{588,,__getitem__()} method.
The only reliable way to determine whether an object is @ref{1433,,iterable}
is to call @code{iter(obj)}.
@end deffn

@geindex Collection (class in collections.abc)
@anchor{library/collections abc collections abc Collection}@anchor{e8a}
@deffn {Class} collections.abc.Collection

ABC for sized iterable container classes.


Added in version 3.6.

@end deffn

@geindex Iterator (class in collections.abc)
@anchor{library/collections abc collections abc Iterator}@anchor{26fa}
@deffn {Class} collections.abc.Iterator

ABC for classes that provide the @ref{20f1,,__iter__()} and
@ref{14d9,,__next__()} methods.  See also the definition of
@ref{4c9,,iterator}.
@end deffn

@geindex Reversible (class in collections.abc)
@anchor{library/collections abc collections abc Reversible}@anchor{e8b}
@deffn {Class} collections.abc.Reversible

ABC for iterable classes that also provide the @ref{e8c,,__reversed__()}
method.


Added in version 3.6.

@end deffn

@geindex Generator (class in collections.abc)
@anchor{library/collections abc collections abc Generator}@anchor{fe1}
@deffn {Class} collections.abc.Generator

ABC for @ref{1267,,generator} classes that implement the protocol defined in
@geindex Python Enhancement Proposals; PEP 342
PEP 342@footnote{https://peps.python.org/pep-0342/} that extends @ref{4c9,,iterators} with the
@ref{2461,,send()},
@ref{71d,,throw()} and @ref{17e5,,close()} methods.

See @ref{2a05,,Annotating generators and coroutines}
for details on using @code{Generator} in type annotations.


Added in version 3.5.

@end deffn

@geindex Sequence (class in collections.abc)
@geindex MutableSequence (class in collections.abc)
@geindex ByteString (class in collections.abc)
@anchor{library/collections abc collections abc Sequence}@anchor{13d0}
@deffn {Class} collections.abc.Sequence
@anchor{library/collections abc collections abc MutableSequence}@anchor{4c0}
@deffnx {Class} collections.abc.MutableSequence
@anchor{library/collections abc collections abc ByteString}@anchor{340}
@deffnx {Class} collections.abc.ByteString

ABCs for read-only and mutable @ref{717,,sequences}.

Implementation note: Some of the mixin methods, such as
@ref{20ee,,__iter__()}, @ref{e8c,,__reversed__()},
and @ref{19bd,,index()} make repeated calls to the underlying
@ref{588,,__getitem__()} method.
Consequently, if @code{__getitem__()} is implemented with constant
access speed, the mixin methods will have linear performance;
however, if the underlying method is linear (as it would be with a
linked list), the mixins will have quadratic performance and will
likely need to be overridden.

@geindex index() (collections.abc.ByteString method)
@anchor{library/collections abc collections abc ByteString index}@anchor{2a06}
@deffn {Method} index (value, start=0, stop=None)

Return first index of `value'.

Raises @ref{2ee,,ValueError} if the value is not present.

Supporting the `start' and `stop' arguments is optional, but recommended.


Changed in version 3.5: The @ref{19bd,,index()} method gained support for
the `stop' and `start' arguments.

@end deffn


Deprecated since version 3.12, will be removed in version 3.17: The @code{ByteString} ABC has been deprecated.

Use @code{isinstance(obj, collections.abc.Buffer)} to test if @code{obj}
implements the @ref{262,,buffer protocol} at runtime. For use
in type annotations, either use @ref{341,,Buffer} or a union that
explicitly specifies the types your code supports (e.g.,
@code{bytes | bytearray | memoryview}).

@code{ByteString} was originally intended to be an abstract class that
would serve as a supertype of both @ref{193,,bytes} and @ref{342,,bytearray}.
However, since the ABC never had any methods, knowing that an object was
an instance of @code{ByteString} never actually told you anything
useful about the object. Other common buffer types such as
@ref{166,,memoryview} were also never understood as subtypes of
@code{ByteString} (either at runtime or by static type checkers).

See 
@geindex Python Enhancement Proposals; PEP 688#current-options
PEP 688@footnote{https://peps.python.org/pep-0688/#current-options} for more details.

@end deffn

@geindex Set (class in collections.abc)
@geindex MutableSet (class in collections.abc)
@anchor{library/collections abc collections abc Set}@anchor{26f1}
@deffn {Class} collections.abc.Set
@anchor{library/collections abc collections abc MutableSet}@anchor{26fc}
@deffnx {Class} collections.abc.MutableSet

ABCs for read-only and mutable @ref{2075,,sets}.
@end deffn

@geindex Mapping (class in collections.abc)
@geindex MutableMapping (class in collections.abc)
@anchor{library/collections abc collections abc Mapping}@anchor{acd}
@deffn {Class} collections.abc.Mapping
@anchor{library/collections abc collections abc MutableMapping}@anchor{12b8}
@deffnx {Class} collections.abc.MutableMapping

ABCs for read-only and mutable @ref{13c7,,mappings}.
@end deffn

@geindex MappingView (class in collections.abc)
@geindex ItemsView (class in collections.abc)
@geindex KeysView (class in collections.abc)
@geindex ValuesView (class in collections.abc)
@anchor{library/collections abc collections abc MappingView}@anchor{26fd}
@deffn {Class} collections.abc.MappingView
@anchor{library/collections abc collections abc ItemsView}@anchor{26ff}
@deffnx {Class} collections.abc.ItemsView
@anchor{library/collections abc collections abc KeysView}@anchor{26fe}
@deffnx {Class} collections.abc.KeysView
@anchor{library/collections abc collections abc ValuesView}@anchor{2700}
@deffnx {Class} collections.abc.ValuesView

ABCs for mapping, items, keys, and values @ref{29f7,,views}.
@end deffn

@geindex Awaitable (class in collections.abc)
@anchor{library/collections abc collections abc Awaitable}@anchor{fe2}
@deffn {Class} collections.abc.Awaitable

ABC for @ref{4ca,,awaitable} objects, which can be used in @ref{18e,,await}
expressions.  Custom implementations must provide the
@ref{f7b,,__await__()} method.

@ref{6ba,,Coroutine} objects and instances of the
@ref{fe3,,Coroutine} ABC are all instances of this ABC.

@cartouche
@quotation Note 
In CPython, generator-based coroutines (@ref{1267,,generators}
decorated with @ref{108e,,@@types.coroutine}) are
`awaitables', even though they do not have an @ref{f7b,,__await__()} method.
Using @code{isinstance(gencoro, Awaitable)} for them will return @code{False}.
Use @ref{101e,,inspect.isawaitable()} to detect them.
@end quotation
@end cartouche


Added in version 3.5.

@end deffn

@geindex Coroutine (class in collections.abc)
@anchor{library/collections abc collections abc Coroutine}@anchor{fe3}
@deffn {Class} collections.abc.Coroutine

ABC for @ref{6ba,,coroutine} compatible classes.  These implement the
following methods, defined in @ref{239a,,Coroutine Objects}:
@ref{2460,,send()}, @ref{71c,,throw()}, and
@ref{2462,,close()}.  Custom implementations must also implement
@ref{f7b,,__await__()}.  All @code{Coroutine} instances are also
instances of @ref{fe2,,Awaitable}.

@cartouche
@quotation Note 
In CPython, generator-based coroutines (@ref{1267,,generators}
decorated with @ref{108e,,@@types.coroutine}) are
`awaitables', even though they do not have an @ref{f7b,,__await__()} method.
Using @code{isinstance(gencoro, Coroutine)} for them will return @code{False}.
Use @ref{101e,,inspect.isawaitable()} to detect them.
@end quotation
@end cartouche

See @ref{2a05,,Annotating generators and coroutines}
for details on using @code{Coroutine} in type annotations.
The variance and order of type parameters correspond to those of
@ref{fe1,,Generator}.


Added in version 3.5.

@end deffn

@geindex AsyncIterable (class in collections.abc)
@anchor{library/collections abc collections abc AsyncIterable}@anchor{fe5}
@deffn {Class} collections.abc.AsyncIterable

ABC for classes that provide an @code{__aiter__} method.  See also the
definition of @ref{f7a,,asynchronous iterable}.


Added in version 3.5.

@end deffn

@geindex AsyncIterator (class in collections.abc)
@anchor{library/collections abc collections abc AsyncIterator}@anchor{fe4}
@deffn {Class} collections.abc.AsyncIterator

ABC for classes that provide @code{__aiter__} and @code{__anext__}
methods.  See also the definition of @ref{4c8,,asynchronous iterator}.


Added in version 3.5.

@end deffn

@geindex AsyncGenerator (class in collections.abc)
@anchor{library/collections abc collections abc AsyncGenerator}@anchor{e8d}
@deffn {Class} collections.abc.AsyncGenerator

ABC for @ref{24e2,,asynchronous generator} classes that implement the protocol
defined in 
@geindex Python Enhancement Proposals; PEP 525
PEP 525@footnote{https://peps.python.org/pep-0525/} and 
@geindex Python Enhancement Proposals; PEP 492
PEP 492@footnote{https://peps.python.org/pep-0492/}.

See @ref{2a05,,Annotating generators and coroutines}
for details on using @code{AsyncGenerator} in type annotations.


Added in version 3.6.

@end deffn

@geindex Buffer (class in collections.abc)
@anchor{library/collections abc collections abc Buffer}@anchor{341}
@deffn {Class} collections.abc.Buffer

ABC for classes that provide the @ref{68d,,__buffer__()} method,
implementing the @ref{262,,buffer protocol}. See 
@geindex Python Enhancement Proposals; PEP 688
PEP 688@footnote{https://peps.python.org/pep-0688/}.


Added in version 3.12.

@end deffn

@node Examples and Recipes,,Collections Abstract Base Classes – Detailed Descriptions,collections abc — Abstract Base Classes for Containers
@anchor{library/collections abc examples-and-recipes}@anchor{2a07}
@subsubsection Examples and Recipes


ABCs allow us to ask classes or instances if they provide
particular functionality, for example:

@example
size = None
if isinstance(myvar, collections.abc.Sized):
    size = len(myvar)
@end example

Several of the ABCs are also useful as mixins that make it easier to develop
classes supporting container APIs.  For example, to write a class supporting
the full @ref{26f1,,Set} API, it is only necessary to supply the three underlying
abstract methods: @ref{15c5,,__contains__()}, @ref{20ee,,__iter__()}, and
@ref{17e1,,__len__()}. The ABC supplies the remaining methods such as
@code{__and__()} and @ref{26db,,isdisjoint()}:

@example
class ListBasedSet(collections.abc.Set):
    '@w{'}' Alternate set implementation favoring space over speed
        and not requiring the set elements to be hashable. '@w{'}'
    def __init__(self, iterable):
        self.elements = lst = []
        for value in iterable:
            if value not in lst:
                lst.append(value)

    def __iter__(self):
        return iter(self.elements)

    def __contains__(self, value):
        return value in self.elements

    def __len__(self):
        return len(self.elements)

s1 = ListBasedSet('abcdef')
s2 = ListBasedSet('defghi')
overlap = s1 & s2            # The __and__() method is supported automatically
@end example

Notes on using @ref{26f1,,Set} and @ref{26fc,,MutableSet} as a mixin:


@enumerate 

@item 
Since some set operations create new sets, the default mixin methods need
a way to create new instances from an @ref{1433,,iterable}. The class constructor is
assumed to have a signature in the form @code{ClassName(iterable)}.
That assumption is factored-out to an internal @ref{48f,,classmethod} called
@code{_from_iterable()} which calls @code{cls(iterable)} to produce a new set.
If the @ref{26f1,,Set} mixin is being used in a class with a different
constructor signature, you will need to override @code{_from_iterable()}
with a classmethod or regular method that can construct new instances from
an iterable argument.

@item 
To override the comparisons (presumably for speed, as the
semantics are fixed), redefine @ref{1516,,__le__()} and
@ref{1518,,__ge__()},
then the other operations will automatically follow suit.

@item 
The @ref{26f1,,Set} mixin provides a @code{_hash()} method to compute a hash value
for the set; however, @ref{cf9,,__hash__()} is not defined because not all sets
are @ref{825,,hashable} or immutable.  To add set hashability using mixins,
inherit from both @code{Set} and @ref{71a,,Hashable}, then define
@code{__hash__ = Set._hash}.
@end enumerate


@subsubheading See also



@itemize *

@item 
OrderedSet recipe@footnote{https://code.activestate.com/recipes/576694/} for an
example built on @ref{26fc,,MutableSet}.

@item 
For more about ABCs, see the @ref{4,,abc} module and 
@geindex Python Enhancement Proposals; PEP 3119
PEP 3119@footnote{https://peps.python.org/pep-3119/}.
@end itemize


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node heapq — Heap queue algorithm,bisect — Array bisection algorithm,collections abc — Abstract Base Classes for Containers,Data Types
@anchor{library/heapq doc}@anchor{2a08}@anchor{library/heapq heapq-heap-queue-algorithm}@anchor{2a09}@anchor{library/heapq module-heapq}@anchor{6d}@anchor{library/heapq translation-repo}@anchor{2a0a}
@subsection @code{heapq} — Heap queue algorithm


@geindex module; heapq

`Source code:' Lib/heapq.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/heapq.py}


__________________________________________________________________


This module provides an implementation of the heap queue algorithm, also known
as the priority queue algorithm.

Min-heaps are binary trees for which every parent node has a value less than
or equal to any of its children.
We refer to this condition as the heap invariant.

For min-heaps, this implementation uses lists for which
@code{heap[k] <= heap[2*k+1]} and @code{heap[k] <= heap[2*k+2]} for all `k' for which
the compared elements exist.  Elements are counted from zero.  The interesting
property of a min-heap is that its smallest element is always the root,
@code{heap[0]}.

Max-heaps satisfy the reverse invariant: every parent node has a value
`greater' than any of its children.  These are implemented as lists for which
@code{maxheap[2*k+1] <= maxheap[k]} and @code{maxheap[2*k+2] <= maxheap[k]} for all
`k' for which the compared elements exist.
The root, @code{maxheap[0]}, contains the `largest' element;
@code{heap.sort(reverse=True)} maintains the max-heap invariant.

The @code{heapq} API differs from textbook heap algorithms in two aspects: (a)
We use zero-based indexing.  This makes the relationship between the index for
a node and the indexes for its children slightly less obvious, but is more
suitable since Python uses zero-based indexing. (b) Textbooks often focus on
max-heaps, due to their suitability for in-place sorting. Our implementation
favors min-heaps as they better correspond to Python @ref{24f,,lists}.

These two aspects make it possible to view the heap as a regular Python list
without surprises: @code{heap[0]} is the smallest item, and @code{heap.sort()}
maintains the heap invariant!

Like @ref{dce,,list.sort()}, this implementation uses only the @code{<} operator
for comparisons, for both min-heaps and max-heaps.

In the API below, and in this documentation, the unqualified term `heap'
generally refers to a min-heap.
The API for max-heaps is named using a @code{_max}  suffix.

To create a heap, use a list initialized as @code{[]}, or transform an existing list
into a min-heap or max-heap using the @ref{2a0b,,heapify()} or @ref{223,,heapify_max()}
functions, respectively.

The following functions are provided for min-heaps:

@geindex heapify() (in module heapq)
@anchor{library/heapq heapq heapify}@anchor{2a0b}
@deffn {Function} heapq.heapify (x)

Transform list `x' into a min-heap, in-place, in linear time.
@end deffn

@geindex heappush() (in module heapq)
@anchor{library/heapq heapq heappush}@anchor{16c8}
@deffn {Function} heapq.heappush (heap, item)

Push the value `item' onto the `heap', maintaining the min-heap invariant.
@end deffn

@geindex heappop() (in module heapq)
@anchor{library/heapq heapq heappop}@anchor{16c9}
@deffn {Function} heapq.heappop (heap)

Pop and return the smallest item from the `heap', maintaining the min-heap
invariant.  If the heap is empty, @ref{1741,,IndexError} is raised.  To access the
smallest item without popping it, use @code{heap[0]}.
@end deffn

@geindex heappushpop() (in module heapq)
@anchor{library/heapq heapq heappushpop}@anchor{2a0c}
@deffn {Function} heapq.heappushpop (heap, item)

Push `item' on the heap, then pop and return the smallest item from the
`heap'.  The combined action runs more efficiently than @ref{16c8,,heappush()}
followed by a separate call to @ref{16c9,,heappop()}.
@end deffn

@geindex heapreplace() (in module heapq)
@anchor{library/heapq heapq heapreplace}@anchor{2a0d}
@deffn {Function} heapq.heapreplace (heap, item)

Pop and return the smallest item from the `heap', and also push the new `item'.
The heap size doesn’t change. If the heap is empty, @ref{1741,,IndexError} is raised.

This one step operation is more efficient than a @ref{16c9,,heappop()} followed by
@ref{16c8,,heappush()} and can be more appropriate when using a fixed-size heap.
The pop/push combination always returns an element from the heap and replaces
it with `item'.

The value returned may be larger than the `item' added.  If that isn’t
desired, consider using @ref{2a0c,,heappushpop()} instead.  Its push/pop
combination returns the smaller of the two values, leaving the larger value
on the heap.
@end deffn

For max-heaps, the following functions are provided:

@geindex heapify_max() (in module heapq)
@anchor{library/heapq heapq heapify_max}@anchor{223}
@deffn {Function} heapq.heapify_max (x)

Transform list `x' into a max-heap, in-place, in linear time.


Added in version 3.14.

@end deffn

@geindex heappush_max() (in module heapq)
@anchor{library/heapq heapq heappush_max}@anchor{224}
@deffn {Function} heapq.heappush_max (heap, item)

Push the value `item' onto the max-heap `heap', maintaining the max-heap
invariant.


Added in version 3.14.

@end deffn

@geindex heappop_max() (in module heapq)
@anchor{library/heapq heapq heappop_max}@anchor{225}
@deffn {Function} heapq.heappop_max (heap)

Pop and return the largest item from the max-heap `heap', maintaining the
max-heap invariant.  If the max-heap is empty, @ref{1741,,IndexError} is raised.
To access the largest item without popping it, use @code{maxheap[0]}.


Added in version 3.14.

@end deffn

@geindex heappushpop_max() (in module heapq)
@anchor{library/heapq heapq heappushpop_max}@anchor{227}
@deffn {Function} heapq.heappushpop_max (heap, item)

Push `item' on the max-heap `heap', then pop and return the largest item
from `heap'.
The combined action runs more efficiently than @ref{224,,heappush_max()}
followed by a separate call to @ref{225,,heappop_max()}.


Added in version 3.14.

@end deffn

@geindex heapreplace_max() (in module heapq)
@anchor{library/heapq heapq heapreplace_max}@anchor{226}
@deffn {Function} heapq.heapreplace_max (heap, item)

Pop and return the largest item from the max-heap `heap' and also push the
new `item'.
The max-heap size doesn’t change. If the max-heap is empty,
@ref{1741,,IndexError} is raised.

The value returned may be smaller than the `item' added.  Refer to the
analogous function @ref{2a0d,,heapreplace()} for detailed usage notes.


Added in version 3.14.

@end deffn

The module also offers three general purpose functions based on heaps.

@geindex merge() (in module heapq)
@anchor{library/heapq heapq merge}@anchor{100b}
@deffn {Function} heapq.merge (*iterables, key=None, reverse=False)

Merge multiple sorted inputs into a single sorted output (for example, merge
timestamped entries from multiple log files).  Returns an @ref{4c9,,iterator}
over the sorted values.

Similar to @code{sorted(itertools.chain(*iterables))} but returns an iterable, does
not pull the data into memory all at once, and assumes that each of the input
streams is already sorted (smallest to largest).

Has two optional arguments which must be specified as keyword arguments.

`key' specifies a @ref{100c,,key function} of one argument that is used to
extract a comparison key from each input element.  The default value is
@code{None} (compare the elements directly).

`reverse' is a boolean value.  If set to @code{True}, then the input elements
are merged as if each comparison were reversed. To achieve behavior similar
to @code{sorted(itertools.chain(*iterables), reverse=True)}, all iterables must
be sorted from largest to smallest.


Changed in version 3.5: Added the optional `key' and `reverse' parameters.

@end deffn

@geindex nlargest() (in module heapq)
@anchor{library/heapq heapq nlargest}@anchor{2a0e}
@deffn {Function} heapq.nlargest (n, iterable, key=None)

Return a list with the `n' largest elements from the dataset defined by
`iterable'.  `key', if provided, specifies a function of one argument that is
used to extract a comparison key from each element in `iterable' (for example,
@code{key=str.lower}).  Equivalent to:  @code{sorted(iterable, key=key,
reverse=True)[:n]}.
@end deffn

@geindex nsmallest() (in module heapq)
@anchor{library/heapq heapq nsmallest}@anchor{2a0f}
@deffn {Function} heapq.nsmallest (n, iterable, key=None)

Return a list with the `n' smallest elements from the dataset defined by
`iterable'.  `key', if provided, specifies a function of one argument that is
used to extract a comparison key from each element in `iterable' (for example,
@code{key=str.lower}).  Equivalent to:  @code{sorted(iterable, key=key)[:n]}.
@end deffn

The latter two functions perform best for smaller values of `n'.  For larger
values, it is more efficient to use the @ref{dcd,,sorted()} function.  Also, when
@code{n==1}, it is more efficient to use the built-in @ref{1111,,min()} and @ref{1112,,max()}
functions.  If repeated usage of these functions is required, consider turning
the iterable into an actual heap.

@menu
* Basic Examples:: 
* Other Applications:: 
* Priority Queue Implementation Notes:: 
* Theory:: 

@end menu

@node Basic Examples,Other Applications,,heapq — Heap queue algorithm
@anchor{library/heapq basic-examples}@anchor{2a10}
@subsubsection Basic Examples


A heapsort@footnote{https://en.wikipedia.org/wiki/Heapsort} can be implemented by
pushing all values onto a heap and then popping off the smallest values one at a
time:

@example
>>> def heapsort(iterable):
...     h = []
...     for value in iterable:
...         heappush(h, value)
...     return [heappop(h) for i in range(len(h))]
...
>>> heapsort([1, 3, 5, 7, 9, 2, 4, 6, 8, 0])
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
@end example

This is similar to @code{sorted(iterable)}, but unlike @ref{dcd,,sorted()}, this
implementation is not stable.

Heap elements can be tuples.  This is useful for assigning comparison values
(such as task priorities) alongside the main record being tracked:

@example
>>> h = []
>>> heappush(h, (5, 'write code'))
>>> heappush(h, (7, 'release product'))
>>> heappush(h, (1, 'write spec'))
>>> heappush(h, (3, 'create tests'))
>>> heappop(h)
(1, 'write spec')
@end example

@node Other Applications,Priority Queue Implementation Notes,Basic Examples,heapq — Heap queue algorithm
@anchor{library/heapq other-applications}@anchor{2a11}
@subsubsection Other Applications


Medians@footnote{https://en.wikipedia.org/wiki/Median} are a measure of
central tendency for a set of numbers.  In distributions skewed by
outliers, the median provides a more stable estimate than an average
(arithmetic mean).  A running median is an online algorithm@footnote{https://en.wikipedia.org/wiki/Online_algorithm} that updates
continuously as new data arrives.

A running median can be efficiently implemented by balancing two heaps,
a max-heap for values at or below the midpoint and a min-heap for values
above the midpoint.  When the two heaps have the same size, the new
median is the average of the tops of the two heaps; otherwise, the
median is at the top of the larger heap:

@example
def running_median(iterable):
    "Yields the cumulative median of values seen so far."

    lo = []  # max-heap
    hi = []  # min-heap (same size as or one smaller than lo)

    for x in iterable:
        if len(lo) == len(hi):
            heappush_max(lo, heappushpop(hi, x))
            yield lo[0]
        else:
            heappush(hi, heappushpop_max(lo, x))
            yield (lo[0] + hi[0]) / 2
@end example

For example:

@example
>>> list(running_median([5.0, 9.0, 4.0, 12.0, 8.0, 9.0]))
[5.0, 7.0, 5.0, 7.0, 8.0, 8.5]
@end example

@node Priority Queue Implementation Notes,Theory,Other Applications,heapq — Heap queue algorithm
@anchor{library/heapq priority-queue-implementation-notes}@anchor{2a12}
@subsubsection Priority Queue Implementation Notes


A priority queue@footnote{https://en.wikipedia.org/wiki/Priority_queue} is common use
for a heap, and it presents several implementation challenges:


@itemize *

@item 
Sort stability:  how do you get two tasks with equal priorities to be returned
in the order they were originally added?

@item 
Tuple comparison breaks for (priority, task) pairs if the priorities are equal
and the tasks do not have a default comparison order.

@item 
If the priority of a task changes, how do you move it to a new position in
the heap?

@item 
Or if a pending task needs to be deleted, how do you find it and remove it
from the queue?
@end itemize

A solution to the first two challenges is to store entries as 3-element list
including the priority, an entry count, and the task.  The entry count serves as
a tie-breaker so that two tasks with the same priority are returned in the order
they were added. And since no two entry counts are the same, the tuple
comparison will never attempt to directly compare two tasks.

Another solution to the problem of non-comparable tasks is to create a wrapper
class that ignores the task item and only compares the priority field:

@example
from dataclasses import dataclass, field
from typing import Any

@@dataclass(order=True)
class PrioritizedItem:
    priority: int
    item: Any=field(compare=False)
@end example

The remaining challenges revolve around finding a pending task and making
changes to its priority or removing it entirely.  Finding a task can be done
with a dictionary pointing to an entry in the queue.

Removing the entry or changing its priority is more difficult because it would
break the heap structure invariants.  So, a possible solution is to mark the
entry as removed and add a new entry with the revised priority:

@example
pq = []                         # list of entries arranged in a heap
entry_finder = @{@}               # mapping of tasks to entries
REMOVED = '<removed-task>'      # placeholder for a removed task
counter = itertools.count()     # unique sequence count

def add_task(task, priority=0):
    'Add a new task or update the priority of an existing task'
    if task in entry_finder:
        remove_task(task)
    count = next(counter)
    entry = [priority, count, task]
    entry_finder[task] = entry
    heappush(pq, entry)

def remove_task(task):
    'Mark an existing task as REMOVED.  Raise KeyError if not found.'
    entry = entry_finder.pop(task)
    entry[-1] = REMOVED

def pop_task():
    'Remove and return the lowest priority task. Raise KeyError if empty.'
    while pq:
        priority, count, task = heappop(pq)
        if task is not REMOVED:
            del entry_finder[task]
            return task
    raise KeyError('pop from an empty priority queue')
@end example

@node Theory,,Priority Queue Implementation Notes,heapq — Heap queue algorithm
@anchor{library/heapq theory}@anchor{2a13}
@subsubsection Theory


Heaps are arrays for which @code{a[k] <= a[2*k+1]} and @code{a[k] <= a[2*k+2]} for all
`k', counting elements from 0.  For the sake of comparison, non-existing
elements are considered to be infinite.  The interesting property of a heap is
that @code{a[0]} is always its smallest element.

The strange invariant above is meant to be an efficient memory representation
for a tournament.  The numbers below are `k', not @code{a[k]}:

@example
                               0

              1                                 2

      3               4                5               6

  7       8       9       10      11      12      13      14

15 16   17 18   19 20   21 22   23 24   25 26   27 28   29 30
@end example

In the tree above, each cell `k' is topping @code{2*k+1} and @code{2*k+2}. In a usual
binary tournament we see in sports, each cell is the winner over the two cells
it tops, and we can trace the winner down the tree to see all opponents s/he
had.  However, in many computer applications of such tournaments, we do not need
to trace the history of a winner. To be more memory efficient, when a winner is
promoted, we try to replace it by something else at a lower level, and the rule
becomes that a cell and the two cells it tops contain three different items, but
the top cell “wins” over the two topped cells.

If this heap invariant is protected at all time, index 0 is clearly the overall
winner.  The simplest algorithmic way to remove it and find the “next” winner is
to move some loser (let’s say cell 30 in the diagram above) into the 0 position,
and then percolate this new 0 down the tree, exchanging values, until the
invariant is re-established. This is clearly logarithmic on the total number of
items in the tree. By iterating over all items, you get an `O'(`n' log `n') sort.

A nice feature of this sort is that you can efficiently insert new items while
the sort is going on, provided that the inserted items are not “better” than the
last 0’th element you extracted.  This is especially useful in simulation
contexts, where the tree holds all incoming events, and the “win” condition
means the smallest scheduled time.  When an event schedules other events for
execution, they are scheduled into the future, so they can easily go into the
heap.  So, a heap is a good structure for implementing schedulers (this is what
I used for my MIDI sequencer :-).

Various structures for implementing schedulers have been extensively studied,
and heaps are good for this, as they are reasonably speedy, the speed is almost
constant, and the worst case is not much different than the average case.
However, there are other representations which are more efficient overall, yet
the worst cases might be terrible.

Heaps are also very useful in big disk sorts.  You most probably all know that a
big sort implies producing “runs” (which are pre-sorted sequences, whose size is
usually related to the amount of CPU memory), followed by a merging passes for
these runs, which merging is often very cleverly organised @footnote{
The disk balancing algorithms which are current, nowadays, are more annoying
than clever, and this is a consequence of the seeking capabilities of the disks.
On devices which cannot seek, like big tape drives, the story was quite
different, and one had to be very clever to ensure (far in advance) that each
tape movement will be the most effective possible (that is, will best
participate at “progressing” the merge).  Some tapes were even able to read
backwards, and this was also used to avoid the rewinding time. Believe me, real
good tape sorts were quite spectacular to watch! From all times, sorting has
always been a Great Art! :-)
}. It is very
important that the initial sort produces the longest runs possible.  Tournaments
are a good way to achieve that.  If, using all the memory available to hold a
tournament, you replace and percolate items that happen to fit the current run,
you’ll produce runs which are twice the size of the memory for random input, and
much better for input fuzzily ordered.

Moreover, if you output the 0’th item on disk and get an input which may not fit
in the current tournament (because the value “wins” over the last output value),
it cannot fit in the heap, so the size of the heap decreases.  The freed memory
could be cleverly reused immediately for progressively building a second heap,
which grows at exactly the same rate the first heap is melting.  When the first
heap completely vanishes, you switch heaps and start a new run.  Clever and
quite effective!

In a word, heaps are useful memory structures to know.  I use them in a few
applications, and I think it is good to keep a ‘heap’ module around. :-)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node bisect — Array bisection algorithm,array — Efficient arrays of numeric values,heapq — Heap queue algorithm,Data Types
@anchor{library/bisect doc}@anchor{2a14}@anchor{library/bisect bisect-array-bisection-algorithm}@anchor{2a15}@anchor{library/bisect module-bisect}@anchor{12}@anchor{library/bisect translation-repo}@anchor{2a16}
@subsection @code{bisect} — Array bisection algorithm


@geindex module; bisect

@c example based on the PyModules FAQ entry by Aaron Watters <arw@pythonpros.com>

`Source code:' Lib/bisect.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/bisect.py}


__________________________________________________________________


This module provides support for maintaining a list in sorted order without
having to sort the list after each insertion.  For long lists of items with
expensive comparison operations, this can be an improvement over
linear searches or frequent resorting.

The module is called @code{bisect} because it uses a basic bisection
algorithm to do its work.  Unlike other bisection tools that search for a
specific value, the functions in this module are designed to locate an
insertion point. Accordingly, the functions never call an @ref{cf8,,__eq__()}
method to determine whether a value has been found.  Instead, the
functions only call the @ref{14ac,,__lt__()} method and will return an insertion
point between values in an array.

@cartouche
@quotation Note 
The functions in this module are not thread-safe. If multiple threads
concurrently use @code{bisect} functions on the same sequence, this
may result in undefined behaviour. Likewise, if the provided sequence
is mutated by a different thread while a @code{bisect} function
is operating on it, the result is undefined. For example, using
@ref{2a17,,insort_left()} on the same list from multiple threads
may result in the list becoming unsorted.
@end quotation
@end cartouche
@anchor{library/bisect bisect-functions}@anchor{2a18}
The following functions are provided:

@geindex bisect_left() (in module bisect)
@anchor{library/bisect bisect bisect_left}@anchor{2a19}
@deffn {Function} bisect.bisect_left (a, x, lo=0, hi=len(a), *, key=None)

Locate the insertion point for `x' in `a' to maintain sorted order.
The parameters `lo' and `hi' may be used to specify a subset of the list
which should be considered; by default the entire list is used.  If `x' is
already present in `a', the insertion point will be before (to the left of)
any existing entries.  The return value is suitable for use as the first
parameter to @code{list.insert()} assuming that `a' is already sorted.

The returned insertion point `ip' partitions the array `a' into two
slices such that @code{all(elem < x for elem in a[lo : ip])} is true for the
left slice and @code{all(elem >= x for elem in a[ip : hi])} is true for the
right slice.

`key' specifies a @ref{100c,,key function} of one argument that is used to
extract a comparison key from each element in the array.  To support
searching complex records, the key function is not applied to the `x' value.

If `key' is @code{None}, the elements are compared directly and
no key function is called.


Changed in version 3.10: Added the `key' parameter.

@end deffn

@geindex bisect_right() (in module bisect)
@geindex bisect() (in module bisect)
@anchor{library/bisect bisect bisect_right}@anchor{2a1a}
@deffn {Function} bisect.bisect_right (a, x, lo=0, hi=len(a), *, key=None)
@anchor{library/bisect bisect bisect}@anchor{2a1b}
@deffnx {Function} bisect.bisect (a, x, lo=0, hi=len(a), *, key=None)

Similar to @ref{2a19,,bisect_left()}, but returns an insertion point which comes
after (to the right of) any existing entries of `x' in `a'.

The returned insertion point `ip' partitions the array `a' into two slices
such that @code{all(elem <= x for elem in a[lo : ip])} is true for the left slice and
@code{all(elem > x for elem in a[ip : hi])} is true for the right slice.


Changed in version 3.10: Added the `key' parameter.

@end deffn

@geindex insort_left() (in module bisect)
@anchor{library/bisect bisect insort_left}@anchor{2a17}
@deffn {Function} bisect.insort_left (a, x, lo=0, hi=len(a), *, key=None)

Insert `x' in `a' in sorted order.

This function first runs @ref{2a19,,bisect_left()} to locate an insertion point.
Next, it runs the @ref{2421,,insert()} method on `a' to insert `x' at the
appropriate position to maintain sort order.

To support inserting records in a table, the `key' function (if any) is
applied to `x' for the search step but not for the insertion step.

Keep in mind that the `O'(log `n') search is dominated by the slow `O'(`n')
insertion step.


Changed in version 3.10: Added the `key' parameter.

@end deffn

@geindex insort_right() (in module bisect)
@geindex insort() (in module bisect)
@anchor{library/bisect bisect insort_right}@anchor{2a1c}
@deffn {Function} bisect.insort_right (a, x, lo=0, hi=len(a), *, key=None)
@anchor{library/bisect bisect insort}@anchor{2a1d}
@deffnx {Function} bisect.insort (a, x, lo=0, hi=len(a), *, key=None)

Similar to @ref{2a17,,insort_left()}, but inserting `x' in `a' after any existing
entries of `x'.

This function first runs @ref{2a1a,,bisect_right()} to locate an insertion point.
Next, it runs the @ref{2421,,insert()} method on `a' to insert `x' at the
appropriate position to maintain sort order.

To support inserting records in a table, the `key' function (if any) is
applied to `x' for the search step but not for the insertion step.

Keep in mind that the `O'(log `n') search is dominated by the slow `O'(`n')
insertion step.


Changed in version 3.10: Added the `key' parameter.

@end deffn

@menu
* Performance Notes:: 
* Searching Sorted Lists:: 
* Examples: Examples<3>. 

@end menu

@node Performance Notes,Searching Sorted Lists,,bisect — Array bisection algorithm
@anchor{library/bisect performance-notes}@anchor{2a1e}
@subsubsection Performance Notes


When writing time sensitive code using `bisect()' and `insort()', keep these
thoughts in mind:


@itemize *

@item 
Bisection is effective for searching ranges of values.
For locating specific values, dictionaries are more performant.

@item 
The `insort()' functions are `O'(`n') because the logarithmic search step
is dominated by the linear time insertion step.

@item 
The search functions are stateless and discard key function results after
they are used.  Consequently, if the search functions are used in a loop,
the key function may be called again and again on the same array elements.
If the key function isn’t fast, consider wrapping it with
@ref{1817,,functools.cache()} to avoid duplicate computations.  Alternatively,
consider searching an array of precomputed keys to locate the insertion
point (as shown in the examples section below).
@end itemize


@subsubheading See also



@itemize *

@item 
Sorted Collections@footnote{https://grantjenks.com/docs/sortedcollections/} is a high performance
module that uses `bisect' to managed sorted collections of data.

@item 
The SortedCollection recipe@footnote{https://code.activestate.com/recipes/577197-sortedcollection/} uses
bisect to build a full-featured collection class with straight-forward search
methods and support for a key-function.  The keys are precomputed to save
unnecessary calls to the key function during searches.
@end itemize


@node Searching Sorted Lists,Examples<3>,Performance Notes,bisect — Array bisection algorithm
@anchor{library/bisect searching-sorted-lists}@anchor{2a1f}
@subsubsection Searching Sorted Lists


The above @ref{2a18,,bisect functions} are useful for finding insertion points but
can be tricky or awkward to use for common searching tasks. The following five
functions show how to transform them into the standard lookups for sorted
lists:

@example
def index(a, x):
    'Locate the leftmost value exactly equal to x'
    i = bisect_left(a, x)
    if i != len(a) and a[i] == x:
        return i
    raise ValueError

def find_lt(a, x):
    'Find rightmost value less than x'
    i = bisect_left(a, x)
    if i:
        return a[i-1]
    raise ValueError

def find_le(a, x):
    'Find rightmost value less than or equal to x'
    i = bisect_right(a, x)
    if i:
        return a[i-1]
    raise ValueError

def find_gt(a, x):
    'Find leftmost value greater than x'
    i = bisect_right(a, x)
    if i != len(a):
        return a[i]
    raise ValueError

def find_ge(a, x):
    'Find leftmost item greater than or equal to x'
    i = bisect_left(a, x)
    if i != len(a):
        return a[i]
    raise ValueError
@end example

@node Examples<3>,,Searching Sorted Lists,bisect — Array bisection algorithm
@anchor{library/bisect examples}@anchor{2a20}
@subsubsection Examples

@anchor{library/bisect bisect-example}@anchor{2a21}
The @ref{2a1b,,bisect()} function can be useful for numeric table lookups. This
example uses @code{bisect()} to look up a letter grade for an exam score (say)
based on a set of ordered numeric breakpoints: 90 and up is an ‘A’, 80 to 89 is
a ‘B’, and so on:

@example
>>> def grade(score):
...     i = bisect([60, 70, 80, 90], score)
...     return "FDCBA"[i]
...
>>> [grade(score) for score in [33, 99, 77, 70, 89, 90, 100]]
['F', 'A', 'C', 'C', 'B', 'A', 'A']
@end example

The @ref{2a1b,,bisect()} and @ref{2a1d,,insort()} functions also work with
lists of tuples.  The `key' argument can serve to extract the field used for ordering
records in a table:

@example
>>> from collections import namedtuple
>>> from operator import attrgetter
>>> from bisect import bisect, insort
>>> from pprint import pprint

>>> Movie = namedtuple('Movie', ('name', 'released', 'director'))

>>> movies = [
...     Movie('Jaws', 1975, 'Spielberg'),
...     Movie('Titanic', 1997, 'Cameron'),
...     Movie('The Birds', 1963, 'Hitchcock'),
...     Movie('Aliens', 1986, 'Cameron')
... ]

>>> # Find the first movie released after 1960
>>> by_year = attrgetter('released')
>>> movies.sort(key=by_year)
>>> movies[bisect(movies, 1960, key=by_year)]
Movie(name='The Birds', released=1963, director='Hitchcock')

>>> # Insert a movie while maintaining sort order
>>> romance = Movie('Love Story', 1970, 'Hiller')
>>> insort(movies, romance, key=by_year)
>>> pprint(movies)
[Movie(name='The Birds', released=1963, director='Hitchcock'),
 Movie(name='Love Story', released=1970, director='Hiller'),
 Movie(name='Jaws', released=1975, director='Spielberg'),
 Movie(name='Aliens', released=1986, director='Cameron'),
 Movie(name='Titanic', released=1997, director='Cameron')]
@end example

If the key function is expensive, it is possible to avoid repeated function
calls by searching a list of precomputed keys to find the index of a record:

@example
>>> data = [('red', 5), ('blue', 1), ('yellow', 8), ('black', 0)]
>>> data.sort(key=lambda r: r[1])       # Or use operator.itemgetter(1).
>>> keys = [r[1] for r in data]         # Precompute a list of keys.
>>> data[bisect_left(keys, 0)]
('black', 0)
>>> data[bisect_left(keys, 1)]
('blue', 1)
>>> data[bisect_left(keys, 5)]
('red', 5)
>>> data[bisect_left(keys, 8)]
('yellow', 8)
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node array — Efficient arrays of numeric values,weakref — Weak references,bisect — Array bisection algorithm,Data Types
@anchor{library/array doc}@anchor{2a22}@anchor{library/array array-efficient-arrays-of-numeric-values}@anchor{2a23}@anchor{library/array module-array}@anchor{8}@anchor{library/array translation-repo}@anchor{2a24}
@subsection @code{array} — Efficient arrays of numeric values


@geindex module; array

@geindex arrays


__________________________________________________________________


This module defines an object type which can compactly represent an array of
basic values: characters, integers, floating-point numbers.  Arrays are mutable @ref{717,,sequence}
types and behave very much like lists, except that the type of objects stored in
them is constrained.  The type is specified at object creation time by using a
`type code', which is a single character.  The following type codes are
defined:


@multitable {xxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxx} 
@headitem

Type code

@tab

C Type

@tab

Python Type

@tab

Minimum size in bytes

@tab

Notes

@item

@code{'b'}

@tab

signed char

@tab

int

@tab

1

@tab

@item

@code{'B'}

@tab

unsigned char

@tab

int

@tab

1

@tab

@item

@code{'u'}

@tab

wchar_t

@tab

Unicode character

@tab

2

@tab

(1)

@item

@code{'w'}

@tab

Py_UCS4

@tab

Unicode character

@tab

4

@tab

(2)

@item

@code{'h'}

@tab

signed short

@tab

int

@tab

2

@tab

@item

@code{'H'}

@tab

unsigned short

@tab

int

@tab

2

@tab

@item

@code{'i'}

@tab

signed int

@tab

int

@tab

2

@tab

@item

@code{'I'}

@tab

unsigned int

@tab

int

@tab

2

@tab

@item

@code{'l'}

@tab

signed long

@tab

int

@tab

4

@tab

@item

@code{'L'}

@tab

unsigned long

@tab

int

@tab

4

@tab

@item

@code{'q'}

@tab

signed long long

@tab

int

@tab

8

@tab

@item

@code{'Q'}

@tab

unsigned long long

@tab

int

@tab

8

@tab

@item

@code{'f'}

@tab

float

@tab

float

@tab

4

@tab

@item

@code{'d'}

@tab

double

@tab

float

@tab

8

@tab

@end multitable


Notes:


@enumerate 

@item 
It can be 16 bits or 32 bits depending on the platform.


Changed in version 3.9: @code{array('u')} now uses @code{wchar_t} as C type instead of deprecated
@code{Py_UNICODE}. This change doesn’t affect its behavior because
@code{Py_UNICODE} is alias of @code{wchar_t} since Python 3.3.



Deprecated since version 3.3, will be removed in version 3.16: Please migrate to @code{'w'} typecode.


@item 

Added in version 3.13.

@end enumerate


@subsubheading See also


The @ref{2885,,ctypes} and
@ref{2881,,struct} modules,
as well as third-party modules like numpy@footnote{https://numpy.org/doc/stable/reference/arrays.interface.html#object.__array_interface__},
use similar – but slightly different – type codes.


The actual representation of values is determined by the machine architecture
(strictly speaking, by the C implementation).  The actual size can be accessed
through the @ref{2a25,,array.itemsize} attribute.

The module defines the following item:

@geindex typecodes (in module array)
@anchor{library/array array typecodes}@anchor{2a26}
@deffn {Data} array.typecodes

A string with all available type codes.
@end deffn

The module defines the following type:

@geindex array (class in array)
@anchor{library/array array array}@anchor{4bf}
@deffn {Class} array.array (typecode[, initializer])

A new array whose items are restricted by `typecode', and initialized
from the optional `initializer' value, which must be a @ref{193,,bytes}
or @ref{342,,bytearray} object, a Unicode string, or iterable over elements
of the appropriate type.

If given a @ref{193,,bytes} or @ref{342,,bytearray} object, the initializer
is passed to the new array’s @ref{147d,,frombytes()} method;
if given a Unicode string, the initializer is passed to the
@ref{2a27,,fromunicode()} method;
otherwise, the initializer’s iterator is passed to the @ref{2a28,,extend()} method
to add initial items to the array.

Array objects support the ordinary @ref{2609,,mutable} @ref{717,,sequence} operations of indexing, slicing,
concatenation, and multiplication.  When using slice assignment, the assigned
value must be an array object with the same type code; in all other cases,
@ref{199,,TypeError} is raised. Array objects also implement the buffer interface,
and may be used wherever @ref{194,,bytes-like objects} are supported.

Arrays are @ref{2410,,generic} over the type of their contents.

Raises an @ref{1cb1,,auditing event} @code{array.__new__} with arguments @code{typecode}, @code{initializer}.

@geindex typecode (array.array attribute)
@anchor{library/array array array typecode}@anchor{2a29}
@deffn {Attribute} typecode

The typecode character used to create the array.
@end deffn

@geindex itemsize (array.array attribute)
@anchor{library/array array array itemsize}@anchor{2a25}
@deffn {Attribute} itemsize

The length in bytes of one array item in the internal representation.
@end deffn

@geindex append() (array.array method)
@anchor{library/array array array append}@anchor{2a2a}
@deffn {Method} append (value, /)

Append a new item with the specified value to the end of the array.
@end deffn

@geindex buffer_info() (array.array method)
@anchor{library/array array array buffer_info}@anchor{2a2b}
@deffn {Method} buffer_info ()

Return a tuple @code{(address, length)} giving the current memory address and the
length in elements of the buffer used to hold array’s contents.  The size of the
memory buffer in bytes can be computed as @code{array.buffer_info()[1] *
array.itemsize}.  This is occasionally useful when working with low-level (and
inherently unsafe) I/O interfaces that require memory addresses, such as certain
@code{ioctl()} operations.  The returned numbers are valid as long as the array
exists and no length-changing operations are applied to it.

@cartouche
@quotation Note 
When using array objects from code written in C or C++ (the only way to
effectively make use of this information), it makes more sense to use the buffer
interface supported by array objects.  This method is maintained for backward
compatibility and should be avoided in new code.  The buffer interface is
documented in @ref{262,,Buffer Protocol}.
@end quotation
@end cartouche
@end deffn

@geindex byteswap() (array.array method)
@anchor{library/array array array byteswap}@anchor{2a2c}
@deffn {Method} byteswap ()

“Byteswap” all items of the array.  This is only supported for values which are
1, 2, 4, or 8 bytes in size; for other types of values, @ref{246,,RuntimeError} is
raised.  It is useful when reading data from a file written on a machine with a
different byte order.
@end deffn

@geindex count() (array.array method)
@anchor{library/array array array count}@anchor{2a2d}
@deffn {Method} count (value, /)

Return the number of occurrences of `value' in the array.
@end deffn

@geindex extend() (array.array method)
@anchor{library/array array array extend}@anchor{2a28}
@deffn {Method} extend (iterable, /)

Append items from `iterable' to the end of the array.  If `iterable' is another
array, it must have `exactly' the same type code; if not, @ref{199,,TypeError} will
be raised.  If `iterable' is not an array, it must be iterable and its elements
must be the right type to be appended to the array.
@end deffn

@geindex frombytes() (array.array method)
@anchor{library/array array array frombytes}@anchor{147d}
@deffn {Method} frombytes (buffer, /)

Appends items from the @ref{194,,bytes-like object}, interpreting
its content as an array of machine values (as if it had been read
from a file using the @ref{14cc,,fromfile()} method).


Added in version 3.2: @code{fromstring()} is renamed to @code{frombytes()} for clarity.

@end deffn

@geindex fromfile() (array.array method)
@anchor{library/array array array fromfile}@anchor{14cc}
@deffn {Method} fromfile (f, n, /)

Read `n' items (as machine values) from the @ref{13cf,,file object} `f' and append
them to the end of the array.  If less than `n' items are available,
@ref{14e5,,EOFError} is raised, but the items that were available are still
inserted into the array.
@end deffn

@geindex fromlist() (array.array method)
@anchor{library/array array array fromlist}@anchor{2a2e}
@deffn {Method} fromlist (list, /)

Append items from the list.  This is equivalent to @code{for x in list:
a.append(x)} except that if there is a type error, the array is unchanged.
@end deffn

@geindex fromunicode() (array.array method)
@anchor{library/array array array fromunicode}@anchor{2a27}
@deffn {Method} fromunicode (ustr, /)

Extends this array with data from the given Unicode string.
The array must have type code @code{'u'} or @code{'w'}; otherwise a @ref{2ee,,ValueError} is raised.
Use @code{array.frombytes(unicodestring.encode(enc))} to append Unicode data to an
array of some other type.
@end deffn

@geindex index() (array.array method)
@anchor{library/array array array index}@anchor{9e7}
@deffn {Method} index (value[, start[, stop]])

Return the smallest `i' such that `i' is the index of the first occurrence of
`value' in the array.  The optional arguments `start' and `stop' can be
specified to search for `value' within a subsection of the array.  Raise
@ref{2ee,,ValueError} if `value' is not found.


Changed in version 3.10: Added optional `start' and `stop' parameters.

@end deffn

@geindex insert() (array.array method)
@anchor{library/array array array insert}@anchor{2a2f}
@deffn {Method} insert (index, value, /)

Insert a new item `value' in the array before position `index'. Negative
values are treated as being relative to the end of the array.
@end deffn

@geindex pop() (array.array method)
@anchor{library/array array array pop}@anchor{2a30}
@deffn {Method} pop (index=-1, /)

Removes the item with the index `i' from the array and returns it. The optional
argument defaults to @code{-1}, so that by default the last item is removed and
returned.
@end deffn

@geindex remove() (array.array method)
@anchor{library/array array array remove}@anchor{2a31}
@deffn {Method} remove (value, /)

Remove the first occurrence of `value' from the array.
@end deffn

@geindex clear() (array.array method)
@anchor{library/array array array clear}@anchor{4c1}
@deffn {Method} clear ()

Remove all elements from the array.


Added in version 3.13.

@end deffn

@geindex reverse() (array.array method)
@anchor{library/array array array reverse}@anchor{2a32}
@deffn {Method} reverse ()

Reverse the order of the items in the array.
@end deffn

@geindex tobytes() (array.array method)
@anchor{library/array array array tobytes}@anchor{147c}
@deffn {Method} tobytes ()

Convert the array to an array of machine values and return the bytes
representation (the same sequence of bytes that would be written to a file by
the @ref{14cd,,tofile()} method.)


Added in version 3.2: @code{tostring()} is renamed to @code{tobytes()} for clarity.

@end deffn

@geindex tofile() (array.array method)
@anchor{library/array array array tofile}@anchor{14cd}
@deffn {Method} tofile (f, /)

Write all items (as machine values) to the @ref{13cf,,file object} `f'.
@end deffn

@geindex tolist() (array.array method)
@anchor{library/array array array tolist}@anchor{2a33}
@deffn {Method} tolist ()

Convert the array to an ordinary list with the same items.
@end deffn

@geindex tounicode() (array.array method)
@anchor{library/array array array tounicode}@anchor{2a34}
@deffn {Method} tounicode ()

Convert the array to a Unicode string.  The array must have a type @code{'u'} or @code{'w'};
otherwise a @ref{2ee,,ValueError} is raised. Use @code{array.tobytes().decode(enc)} to
obtain a Unicode string from an array of some other type.
@end deffn
@end deffn

The string representation of array objects has the form
@code{array(typecode, initializer)}.
The `initializer' is omitted if the array is empty, otherwise it is
a Unicode string if the `typecode' is @code{'u'} or @code{'w'}, otherwise it is
a list of numbers.
The string representation is guaranteed to be able to be converted back to an
array with the same type and value using @ref{4a4,,eval()}, so long as the
@ref{4bf,,array} class has been imported using @code{from array import array}.
Variables @code{inf} and @code{nan} must also be defined if it contains
corresponding floating-point values.
Examples:

@example
array('l')
array('w', 'hello \u2641')
array('l', [1, 2, 3, 4, 5])
array('d', [1.0, 2.0, 3.14, -inf, nan])
@end example


@subsubheading See also



@table @asis

@item Module @ref{db,,struct}

Packing and unpacking of heterogeneous binary data.

@item NumPy@footnote{https://numpy.org/}

The NumPy package defines another array type.
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node weakref — Weak references,types — Dynamic type creation and names for built-in types,array — Efficient arrays of numeric values,Data Types
@anchor{library/weakref doc}@anchor{2a35}@anchor{library/weakref mod-weakref}@anchor{1113}@anchor{library/weakref module-weakref}@anchor{11b}@anchor{library/weakref translation-repo}@anchor{2a36}@anchor{library/weakref weakref-weak-references}@anchor{2a37}
@subsection @code{weakref} — Weak references


@geindex module; weakref

`Source code:' Lib/weakref.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/weakref.py}


__________________________________________________________________


The @code{weakref} module allows the Python programmer to create `weak
references' to objects.

@c When making changes to the examples in this file, be sure to update
@c Lib/test/test_weakref.py::libreftest too!

In the following, the term `referent' means the object which is referred to
by a weak reference.

A weak reference to an object is not enough to keep the object alive: when the
only remaining references to a referent are weak references,
@ref{1826,,garbage collection} is free to destroy the referent and reuse its memory
for something else.  However, until the object is actually destroyed the weak
reference may return the object even if there are no strong references to it.

A primary use for weak references is to implement caches or
mappings holding large objects, where it’s desired that a large object not be
kept alive solely because it appears in a cache or mapping.

For example, if you have a number of large binary image objects, you may wish to
associate a name with each.  If you used a Python dictionary to map names to
images, or images to names, the image objects would remain alive just because
they appeared as values or keys in the dictionaries.  The
@ref{196d,,WeakKeyDictionary} and @ref{196e,,WeakValueDictionary} classes supplied by
the @code{weakref} module are an alternative, using weak references to construct
mappings that don’t keep objects alive solely because they appear in the mapping
objects.  If, for example, an image object is a value in a
@code{WeakValueDictionary}, then when the last remaining references to that
image object are the weak references held by weak mappings, garbage collection
can reclaim the object, and its corresponding entries in weak mappings are
simply deleted.

@ref{196d,,WeakKeyDictionary} and @ref{196e,,WeakValueDictionary} use weak references
in their implementation, setting up callback functions on the weak references
that notify the weak dictionaries when a key or value has been reclaimed by
garbage collection.  @ref{7f6,,WeakSet} implements the @ref{185,,set} interface,
but keeps weak references to its elements, just like a
@code{WeakKeyDictionary} does.

@ref{c75,,finalize} provides a straight forward way to register a
cleanup function to be called when an object is garbage collected.
This is simpler to use than setting up a callback function on a raw
weak reference, since the module automatically ensures that the finalizer
remains alive until the object is collected.

Most programs should find that using one of these weak container types
or @ref{c75,,finalize} is all they need – it’s not usually necessary to
create your own weak references directly.  The low-level machinery is
exposed by the @code{weakref} module for the benefit of advanced uses.

Not all objects can be weakly referenced. Objects which support weak references
include class instances, functions written in Python (but not in C), instance methods,
sets, frozensets, some @ref{13cf,,file objects}, @ref{1267,,generators},
type objects, sockets, arrays, deques, regular expression pattern objects, and code
objects.


Changed in version 3.2: Added support for thread.lock, threading.Lock, and code objects.


Several built-in types such as @ref{24f,,list} and @ref{184,,dict} do not directly
support weak references but can add support through subclassing:

@example
class Dict(dict):
    pass

obj = Dict(red=1, green=2, blue=3)   # this object is weak referenceable
@end example

`CPython implementation detail:' Other built-in types such as @ref{614,,tuple} and @ref{19c,,int} do not support weak
references even when subclassed.

Extension types can easily be made to support weak references; see
@ref{2a38,,Weak Reference Support}.

When @code{__slots__} are defined for a given type, weak reference support is
disabled unless a @code{'__weakref__'} string is also present in the sequence of
strings in the @code{__slots__} declaration.
See @ref{23c2,,__slots__ documentation} for details.

@geindex ref (class in weakref)
@anchor{library/weakref weakref ref}@anchor{11f6}
@deffn {Class} weakref.ref (object[, callback])

Return a weak reference to `object'.  The original object can be retrieved by
calling the reference object if the referent is still alive; if the referent is
no longer alive, calling the reference object will cause @ref{887,,None} to be
returned.  If `callback' is provided and not @code{None}, and the returned
weakref object is still alive, the callback will be called when the object is
about to be finalized; the weak reference object will be passed as the only
parameter to the callback; the referent will no longer be available.

It is allowable for many weak references to be constructed for the same object.
Callbacks registered for each weak reference will be called from the most
recently registered callback to the oldest registered callback.

Exceptions raised by the callback will be noted on the standard error output,
but cannot be propagated; they are handled in exactly the same way as exceptions
raised from an object’s @ref{1203,,__del__()} method.

Weak references are @ref{825,,hashable} if the `object' is hashable.  They will
maintain their hash value even after the `object' was deleted.  If
@ref{802,,hash()} is called the first time only after the `object' was deleted,
the call will raise @ref{199,,TypeError}.

Weak references support tests for equality, but not ordering.  If the referents
are still alive, two references have the same equality relationship as their
referents (regardless of the `callback').  If either referent has been deleted,
the references are equal only if the reference objects are the same object.

This is a subclassable type rather than a factory function.

Weak references are @ref{2410,,generic} over the type of the object they
reference.

@geindex __callback__ (weakref.ref attribute)
@anchor{library/weakref weakref ref __callback__}@anchor{11f7}
@deffn {Attribute} __callback__

This read-only attribute returns the callback currently associated to the
weakref.  If there is no callback or if the referent of the weakref is
no longer alive then this attribute will have value @code{None}.
@end deffn


Changed in version 3.4: Added the @ref{11f7,,__callback__} attribute.

@end deffn

@geindex proxy() (in module weakref)
@anchor{library/weakref weakref proxy}@anchor{c4c}
@deffn {Function} weakref.proxy (object[, callback])

Return a proxy to `object' which uses a weak reference.  This supports use of
the proxy in most contexts instead of requiring the explicit dereferencing used
with weak reference objects.  The returned object will have a type of either
@code{ProxyType} or @code{CallableProxyType}, depending on whether `object' is
callable.  Proxy objects are not @ref{825,,hashable} regardless of the referent; this
avoids a number of problems related to their fundamentally mutable nature, and
prevents their use as dictionary keys.  `callback' is the same as the parameter
of the same name to the @ref{11f6,,ref()} function.

Accessing an attribute of the proxy object after the referent is
garbage collected raises @ref{1719,,ReferenceError}.


Changed in version 3.8: Extended the operator support on proxy objects to include the matrix
multiplication operators @code{@@} and @code{@@=}.

@end deffn

@geindex getweakrefcount() (in module weakref)
@anchor{library/weakref weakref getweakrefcount}@anchor{2a39}
@deffn {Function} weakref.getweakrefcount (object)

Return the number of weak references and proxies which refer to `object'.
@end deffn

@geindex getweakrefs() (in module weakref)
@anchor{library/weakref weakref getweakrefs}@anchor{2a3a}
@deffn {Function} weakref.getweakrefs (object)

Return a list of all weak reference and proxy objects which refer to `object'.
@end deffn

@geindex WeakKeyDictionary (class in weakref)
@anchor{library/weakref weakref WeakKeyDictionary}@anchor{196d}
@deffn {Class} weakref.WeakKeyDictionary ([dict])

Mapping class that references keys weakly.  Entries in the dictionary will be
discarded when there is no longer a strong reference to the key.  This can be
used to associate additional data with an object owned by other parts of an
application without adding attributes to those objects.  This can be especially
useful with objects that override attribute accesses.

Note that when a key with equal value to an existing key (but not equal identity)
is inserted into the dictionary, it replaces the value but does not replace the
existing key. Due to this, when the reference to the original key is deleted, it
also deletes the entry in the dictionary:

@example
>>> class T(str): pass
...
>>> k1, k2 = T(), T()
>>> d = weakref.WeakKeyDictionary()
>>> d[k1] = 1   # d = @{k1: 1@}
>>> d[k2] = 2   # d = @{k1: 2@}
>>> del k1      # d = @{@}
@end example

A workaround would be to remove the key prior to reassignment:

@example
>>> class T(str): pass
...
>>> k1, k2 = T(), T()
>>> d = weakref.WeakKeyDictionary()
>>> d[k1] = 1   # d = @{k1: 1@}
>>> del d[k1]
>>> d[k2] = 2   # d = @{k2: 2@}
>>> del k1      # d = @{k2: 2@}
@end example


Changed in version 3.9: Added support for @code{|} and @code{|=} operators, as specified in 
@geindex Python Enhancement Proposals; PEP 584
PEP 584@footnote{https://peps.python.org/pep-0584/}.

@end deffn

@ref{196d,,WeakKeyDictionary} objects have an additional method that
exposes the internal references directly.  The references are not guaranteed to
be “live” at the time they are used, so the result of calling the references
needs to be checked before being used.  This can be used to avoid creating
references that will cause the garbage collector to keep the keys around longer
than needed.

@geindex keyrefs() (weakref.WeakKeyDictionary method)
@anchor{library/weakref weakref WeakKeyDictionary keyrefs}@anchor{2a3b}
@deffn {Method} WeakKeyDictionary.keyrefs ()

Return an iterable of the weak references to the keys.
@end deffn

@geindex WeakValueDictionary (class in weakref)
@anchor{library/weakref weakref WeakValueDictionary}@anchor{196e}
@deffn {Class} weakref.WeakValueDictionary ([dict])

Mapping class that references values weakly.  Entries in the dictionary will be
discarded when no strong reference to the value exists any more.


Changed in version 3.9: Added support for @code{|} and @code{|=} operators, as specified in 
@geindex Python Enhancement Proposals; PEP 584
PEP 584@footnote{https://peps.python.org/pep-0584/}.

@end deffn

@ref{196e,,WeakValueDictionary} objects have an additional method that has the
same issues as the @ref{2a3b,,WeakKeyDictionary.keyrefs()} method.

@geindex valuerefs() (weakref.WeakValueDictionary method)
@anchor{library/weakref weakref WeakValueDictionary valuerefs}@anchor{2a3c}
@deffn {Method} WeakValueDictionary.valuerefs ()

Return an iterable of the weak references to the values.
@end deffn

@geindex WeakSet (class in weakref)
@anchor{library/weakref weakref WeakSet}@anchor{7f6}
@deffn {Class} weakref.WeakSet ([elements])

Set class that keeps weak references to its elements.  An element will be
discarded when no strong reference to it exists any more.
@end deffn

@geindex WeakMethod (class in weakref)
@anchor{library/weakref weakref WeakMethod}@anchor{11f5}
@deffn {Class} weakref.WeakMethod (method[, callback])

A custom @ref{11f6,,ref} subclass which simulates a weak reference to a bound
method (i.e., a method defined on a class and looked up on an instance).
Since a bound method is ephemeral, a standard weak reference cannot keep
hold of it.  @code{WeakMethod} has special code to recreate the bound
method until either the object or the original function dies:

@example
>>> class C:
...     def method(self):
...         print("method called!")
...
>>> c = C()
>>> r = weakref.ref(c.method)
>>> r()
>>> r = weakref.WeakMethod(c.method)
>>> r()
<bound method C.method of <__main__.C object at 0x7fc859830220>>
>>> r()()
method called!
>>> del c
>>> gc.collect()
0
>>> r()
>>>
@end example

`callback' is the same as the parameter of the same name to the @ref{11f6,,ref()} function.


Added in version 3.4.

@end deffn

@geindex finalize (class in weakref)
@anchor{library/weakref weakref finalize}@anchor{c75}
@deffn {Class} weakref.finalize (obj, func, /, *args, **kwargs)

Return a callable finalizer object which will be called when `obj'
is garbage collected. Unlike an ordinary weak reference, a finalizer
will always survive until the reference object is collected, greatly
simplifying lifecycle management.

A finalizer is considered `alive' until it is called (either explicitly
or at garbage collection), and after that it is `dead'.  Calling a live
finalizer returns the result of evaluating @code{func(*arg, **kwargs)},
whereas calling a dead finalizer returns @ref{887,,None}.

Exceptions raised by finalizer callbacks during garbage collection
will be shown on the standard error output, but cannot be
propagated.  They are handled in the same way as exceptions raised
from an object’s @ref{1203,,__del__()} method or a weak reference’s
callback.

When the program exits, each remaining live finalizer is called
unless its @ref{d,,atexit} attribute has been set to false.  They
are called in reverse order of creation.

A finalizer will never invoke its callback during the later part of
the @ref{47a,,interpreter shutdown} when module globals are liable to have
been replaced by @ref{887,,None}.

@geindex __call__() (weakref.finalize method)
@anchor{library/weakref weakref finalize __call__}@anchor{2a3d}
@deffn {Method} __call__ ()

If `self' is alive then mark it as dead and return the result of
calling @code{func(*args, **kwargs)}.  If `self' is dead then return
@ref{887,,None}.
@end deffn

@geindex detach() (weakref.finalize method)
@anchor{library/weakref weakref finalize detach}@anchor{2a3e}
@deffn {Method} detach ()

If `self' is alive then mark it as dead and return the tuple
@code{(obj, func, args, kwargs)}.  If `self' is dead then return
@ref{887,,None}.
@end deffn

@geindex peek() (weakref.finalize method)
@anchor{library/weakref weakref finalize peek}@anchor{2a3f}
@deffn {Method} peek ()

If `self' is alive then return the tuple @code{(obj, func, args,
kwargs)}.  If `self' is dead then return @ref{887,,None}.
@end deffn

@geindex alive (weakref.finalize attribute)
@anchor{library/weakref weakref finalize alive}@anchor{2a40}
@deffn {Attribute} alive

Property which is true if the finalizer is alive, false otherwise.
@end deffn

@geindex atexit (weakref.finalize attribute)
@anchor{library/weakref weakref finalize atexit}@anchor{2a41}
@deffn {Attribute} atexit

A writable boolean property which by default is true.  When the
program exits, it calls all remaining live finalizers for which
@ref{2a41,,atexit} is true.  They are called in reverse order of
creation.
@end deffn

@cartouche
@quotation Note 
It is important to ensure that `func', `args' and `kwargs' do
not own any references to `obj', either directly or indirectly,
since otherwise `obj' will never be garbage collected.  In
particular, `func' should not be a bound method of `obj'.
@end quotation
@end cartouche


Added in version 3.4.

@end deffn

@geindex ReferenceType (class in weakref)
@anchor{library/weakref weakref ReferenceType}@anchor{1ba1}
@deffn {Class} weakref.ReferenceType

The type object for weak references objects.
@end deffn

@geindex ProxyType (class in weakref)
@anchor{library/weakref weakref ProxyType}@anchor{1ba2}
@deffn {Class} weakref.ProxyType

The type object for proxies of objects which are not callable.
@end deffn

@geindex CallableProxyType (class in weakref)
@anchor{library/weakref weakref CallableProxyType}@anchor{1ba3}
@deffn {Class} weakref.CallableProxyType

The type object for proxies of callable objects.
@end deffn

@geindex ProxyTypes (in module weakref)
@anchor{library/weakref weakref ProxyTypes}@anchor{2a42}
@deffn {Data} weakref.ProxyTypes

Sequence containing all the type objects for proxies.  This can make it simpler
to test if an object is a proxy without being dependent on naming both proxy
types.
@end deffn


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 205

@item PEP 205@footnote{https://peps.python.org/pep-0205/} - Weak References

The proposal and rationale for this feature, including links to earlier
implementations and information about similar features in other languages.
@end table


@menu
* Weak Reference Objects:: 
* Example: Example<2>. 
* Finalizer Objects:: 
* Comparing finalizers with __del__() methods: Comparing finalizers with __del__ methods. 

@end menu

@node Weak Reference Objects,Example<2>,,weakref — Weak references
@anchor{library/weakref weak-reference-objects}@anchor{2a43}@anchor{library/weakref weakref-objects}@anchor{2a44}
@subsubsection Weak Reference Objects


Weak reference objects have no methods and no attributes besides
@ref{11f7,,ref.__callback__}. A weak reference object allows the referent to be
obtained, if it still exists, by calling it:

@example
>>> import weakref
>>> class Object:
...     pass
...
>>> o = Object()
>>> r = weakref.ref(o)
>>> o2 = r()
>>> o is o2
True
@end example

If the referent no longer exists, calling the reference object returns
@ref{887,,None}:

@example
>>> del o, o2
>>> print(r())
None
@end example

Testing that a weak reference object is still live should be done using the
expression @code{ref() is not None}.  Normally, application code that needs to use
a reference object should follow this pattern:

@example
# r is a weak reference object
o = r()
if o is None:
    # referent has been garbage collected
    print("Object has been deallocated; can't frobnicate.")
else:
    print("Object is still live!")
    o.do_something_useful()
@end example

Using a separate test for “liveness” creates race conditions in threaded
applications; another thread can cause a weak reference to become invalidated
before the weak reference is called; the idiom shown above is safe in threaded
applications as well as single-threaded applications.

Specialized versions of @ref{11f6,,ref} objects can be created through subclassing.
This is used in the implementation of the @ref{196e,,WeakValueDictionary} to reduce
the memory overhead for each entry in the mapping.  This may be most useful to
associate additional information with a reference, but could also be used to
insert additional processing on calls to retrieve the referent.

This example shows how a subclass of @ref{11f6,,ref} can be used to store
additional information about an object and affect the value that’s returned when
the referent is accessed:

@example
import weakref

class ExtendedRef(weakref.ref):
    def __init__(self, ob, callback=None, /, **annotations):
        super().__init__(ob, callback)
        self.__counter = 0
        for k, v in annotations.items():
            setattr(self, k, v)

    def __call__(self):
        """Return a pair containing the referent and the number of
        times the reference has been called.
        """
        ob = super().__call__()
        if ob is not None:
            self.__counter += 1
            ob = (ob, self.__counter)
        return ob
@end example

@node Example<2>,Finalizer Objects,Weak Reference Objects,weakref — Weak references
@anchor{library/weakref example}@anchor{2a45}@anchor{library/weakref weakref-example}@anchor{2a46}
@subsubsection Example


This simple example shows how an application can use object IDs to retrieve
objects that it has seen before.  The IDs of the objects can then be used in
other data structures without forcing the objects to remain alive, but the
objects can still be retrieved by ID if they do.

@c Example contributed by Tim Peters.

@example
import weakref

_id2obj_dict = weakref.WeakValueDictionary()

def remember(obj):
    oid = id(obj)
    _id2obj_dict[oid] = obj
    return oid

def id2obj(oid):
    return _id2obj_dict[oid]
@end example

@node Finalizer Objects,Comparing finalizers with __del__ methods,Example<2>,weakref — Weak references
@anchor{library/weakref finalize-examples}@anchor{2a47}@anchor{library/weakref finalizer-objects}@anchor{2a48}
@subsubsection Finalizer Objects


The main benefit of using @ref{c75,,finalize} is that it makes it simple
to register a callback without needing to preserve the returned finalizer
object.  For instance

@example
>>> import weakref
>>> class Object:
...     pass
...
>>> kenny = Object()
>>> weakref.finalize(kenny, print, "You killed Kenny!")
<finalize object at ...; for 'Object' at ...>
>>> del kenny
You killed Kenny!
@end example

The finalizer can be called directly as well.  However the finalizer
will invoke the callback at most once.

@example
>>> def callback(x, y, z):
...     print("CALLBACK")
...     return x + y + z
...
>>> obj = Object()
>>> f = weakref.finalize(obj, callback, 1, 2, z=3)
>>> assert f.alive
>>> assert f() == 6
CALLBACK
>>> assert not f.alive
>>> f()                     # callback not called because finalizer dead
>>> del obj                 # callback not called because finalizer dead
@end example

You can unregister a finalizer using its @ref{2a3e,,detach()}
method.  This kills the finalizer and returns the arguments passed to
the constructor when it was created.

@example
>>> obj = Object()
>>> f = weakref.finalize(obj, callback, 1, 2, z=3)
>>> f.detach()
(<...Object object ...>, <function callback ...>, (1, 2), @{'z': 3@})
>>> newobj, func, args, kwargs = _
>>> assert not f.alive
>>> assert newobj is obj
>>> assert func(*args, **kwargs) == 6
CALLBACK
@end example

Unless you set the @ref{2a41,,atexit} attribute to
@ref{d31,,False}, a finalizer will be called when the program exits if it
is still alive.  For instance

@example
>>> obj = Object()
>>> weakref.finalize(obj, print, "obj dead or exiting")
<finalize object at ...; for 'Object' at ...>
>>> exit()
obj dead or exiting
@end example

@node Comparing finalizers with __del__ methods,,Finalizer Objects,weakref — Weak references
@anchor{library/weakref comparing-finalizers-with-del-methods}@anchor{2a49}
@subsubsection Comparing finalizers with @code{__del__()} methods


Suppose we want to create a class whose instances represent temporary
directories.  The directories should be deleted with their contents
when the first of the following events occurs:


@itemize *

@item 
the object is garbage collected,

@item 
the object’s @code{remove()} method is called, or

@item 
the program exits.
@end itemize

We might try to implement the class using a @ref{1203,,__del__()} method as
follows:

@example
class TempDir:
    def __init__(self):
        self.name = tempfile.mkdtemp()

    def remove(self):
        if self.name is not None:
            shutil.rmtree(self.name)
            self.name = None

    @@property
    def removed(self):
        return self.name is None

    def __del__(self):
        self.remove()
@end example

Starting with Python 3.4, @ref{1203,,__del__()} methods no longer prevent
reference cycles from being garbage collected, and module globals are
no longer forced to @ref{887,,None} during @ref{47a,,interpreter shutdown}.
So this code should work without any issues on CPython.

However, handling of @ref{1203,,__del__()} methods is notoriously implementation
specific, since it depends on internal details of the interpreter’s garbage
collector implementation.

A more robust alternative can be to define a finalizer which only references
the specific functions and objects that it needs, rather than having access
to the full state of the object:

@example
class TempDir:
    def __init__(self):
        self.name = tempfile.mkdtemp()
        self._finalizer = weakref.finalize(self, shutil.rmtree, self.name)

    def remove(self):
        self._finalizer()

    @@property
    def removed(self):
        return not self._finalizer.alive
@end example

Defined like this, our finalizer only receives a reference to the details
it needs to clean up the directory appropriately. If the object never gets
garbage collected the finalizer will still be called at exit.

The other advantage of weakref based finalizers is that they can be used to
register finalizers for classes where the definition is controlled by a
third party, such as running code when a module is unloaded:

@example
import weakref, sys
def unloading_module():
    # implicit reference to the module globals from the function body
weakref.finalize(sys.modules[__name__], unloading_module)
@end example

@cartouche
@quotation Note 
If you create a finalizer object in a daemonic thread just as the program
exits then there is the possibility that the finalizer
does not get called at exit.  However, in a daemonic thread
@ref{a84,,atexit.register()}, @code{try: ... finally: ...} and @code{with: ...}
do not guarantee that cleanup occurs either.
@end quotation
@end cartouche

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node types — Dynamic type creation and names for built-in types,copy — Shallow and deep copy operations,weakref — Weak references,Data Types
@anchor{library/types doc}@anchor{2a4a}@anchor{library/types module-types}@anchor{10a}@anchor{library/types translation-repo}@anchor{2a4b}@anchor{library/types types-dynamic-type-creation-and-names-for-built-in-types}@anchor{2a4c}
@subsection @code{types} — Dynamic type creation and names for built-in types


@geindex module; types

`Source code:' Lib/types.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/types.py}


__________________________________________________________________


This module defines utility functions to assist in dynamic creation of
new types.

It also defines names for some object types that are used by the standard
Python interpreter, but not exposed as builtins like @ref{19c,,int} or
@ref{16a,,str} are.

Finally, it provides some additional type-related utility classes and functions
that are not fundamental enough to be builtins.

@menu
* Dynamic Type Creation:: 
* Standard Interpreter Types:: 
* Additional Utility Classes and Functions:: 
* Coroutine Utility Functions:: 

@end menu

@node Dynamic Type Creation,Standard Interpreter Types,,types — Dynamic type creation and names for built-in types
@anchor{library/types dynamic-type-creation}@anchor{2a4d}
@subsubsection Dynamic Type Creation


@geindex new_class() (in module types)
@anchor{library/types types new_class}@anchor{136d}
@deffn {Function} types.new_class (name, bases=(), kwds=None, exec_body=None)

Creates a class object dynamically using the appropriate metaclass.

The first three arguments are the components that make up a class
definition header: the class name, the base classes (in order), the
keyword arguments (such as @code{metaclass}).

The `exec_body' argument is a callback that is used to populate the
freshly created class namespace. It should accept the class namespace
as its sole argument and update the namespace directly with the class
contents. If no callback is provided, it has the same effect as passing
in @code{lambda ns: None}.


Added in version 3.3.

@end deffn

@geindex prepare_class() (in module types)
@anchor{library/types types prepare_class}@anchor{136e}
@deffn {Function} types.prepare_class (name, bases=(), kwds=None)

Calculates the appropriate metaclass and creates the class namespace.

The arguments are the components that make up a class definition header:
the class name, the base classes (in order) and the keyword arguments
(such as @code{metaclass}).

The return value is a 3-tuple: @code{metaclass, namespace, kwds}

`metaclass' is the appropriate metaclass, `namespace' is the
prepared class namespace and `kwds' is an updated copy of the passed
in `kwds' argument with any @code{'metaclass'} entry removed. If no `kwds'
argument is passed in, this will be an empty dict.


Added in version 3.3.



Changed in version 3.6: The default value for the @code{namespace} element of the returned
tuple has changed.  Now an insertion-order-preserving mapping is
used when the metaclass does not have a @code{__prepare__} method.

@end deffn


@subsubheading See also



@table @asis

@item @ref{2405,,Metaclasses}

Full details of the class creation process supported by these functions

@geindex Python Enhancement Proposals; PEP 3115

@item PEP 3115@footnote{https://peps.python.org/pep-3115/} - Metaclasses in Python 3000

Introduced the @code{__prepare__} namespace hook
@end table


@geindex resolve_bases() (in module types)
@anchor{library/types types resolve_bases}@anchor{d9b}
@deffn {Function} types.resolve_bases (bases)

Resolve MRO entries dynamically as specified by 
@geindex Python Enhancement Proposals; PEP 560
PEP 560@footnote{https://peps.python.org/pep-0560/}.

This function looks for items in `bases' that are not instances of
@ref{f4a,,type}, and returns a tuple where each such object that has
an @ref{ce9,,__mro_entries__()} method is replaced with an unpacked result of
calling this method.  If a `bases' item is an instance of @code{type},
or it doesn’t have an @code{__mro_entries__()} method, then it is included in
the return tuple unchanged.


Added in version 3.7.

@end deffn

@geindex get_original_bases() (in module types)
@anchor{library/types types get_original_bases}@anchor{6f6}
@deffn {Function} types.get_original_bases (cls, /)

Return the tuple of objects originally given as the bases of `cls' before
the @ref{ce9,,__mro_entries__()} method has been called on any bases
(following the mechanisms laid out in 
@geindex Python Enhancement Proposals; PEP 560
PEP 560@footnote{https://peps.python.org/pep-0560/}). This is useful for
introspecting @ref{6f7,,Generics}.

For classes that have an @code{__orig_bases__} attribute, this
function returns the value of @code{cls.__orig_bases__}.
For classes without the @code{__orig_bases__} attribute,
@ref{16b8,,cls.__bases__} is returned.

Examples:

@example
from typing import TypeVar, Generic, NamedTuple, TypedDict

T = TypeVar("T")
class Foo(Generic[T]): ...
class Bar(Foo[int], float): ...
class Baz(list[str]): ...
Eggs = NamedTuple("Eggs", [("a", int), ("b", str)])
Spam = TypedDict("Spam", @{"a": int, "b": str@})

assert Bar.__bases__ == (Foo, float)
assert get_original_bases(Bar) == (Foo[int], float)

assert Baz.__bases__ == (list,)
assert get_original_bases(Baz) == (list[str],)

assert Eggs.__bases__ == (tuple,)
assert get_original_bases(Eggs) == (NamedTuple,)

assert Spam.__bases__ == (dict,)
assert get_original_bases(Spam) == (TypedDict,)

assert int.__bases__ == (object,)
assert get_original_bases(int) == (object,)
@end example


Added in version 3.12.

@end deffn


@subsubheading See also


@geindex Python Enhancement Proposals; PEP 560
PEP 560@footnote{https://peps.python.org/pep-0560/} - Core support for typing module and generic types


@node Standard Interpreter Types,Additional Utility Classes and Functions,Dynamic Type Creation,types — Dynamic type creation and names for built-in types
@anchor{library/types standard-interpreter-types}@anchor{2a4e}
@subsubsection Standard Interpreter Types


This module provides names for many of the types that are required to
implement a Python interpreter. It deliberately avoids including some of
the types that arise only incidentally during processing such as the
@code{listiterator} type.

Typical use of these names is for @ref{2af,,isinstance()} or
@ref{9ca,,issubclass()} checks.

If you instantiate any of these types, note that signatures may vary between Python versions.

Standard names are defined for the following types:

@geindex NoneType (class in types)
@anchor{library/types types NoneType}@anchor{a58}
@deffn {Class} types.NoneType

The type of @ref{887,,None}.


Added in version 3.10.

@end deffn

@geindex FunctionType (in module types)
@geindex LambdaType (in module types)
@anchor{library/types types FunctionType}@anchor{a89}
@deffn {Data} types.FunctionType
@anchor{library/types types LambdaType}@anchor{2a4f}
@deffnx {Data} types.LambdaType

The type of user-defined functions and functions created by
@ref{14a9,,lambda}  expressions.

Raises an @ref{1cb1,,auditing event} @code{function.__new__} with argument @code{code}.

The audit event only occurs for direct instantiation of function objects,
and is not raised for normal compilation.
@end deffn

@geindex GeneratorType (in module types)
@anchor{library/types types GeneratorType}@anchor{19ed}
@deffn {Data} types.GeneratorType

The type of @ref{1267,,generator}-iterator objects, created by
generator functions.
@end deffn

@geindex CoroutineType (in module types)
@anchor{library/types types CoroutineType}@anchor{108f}
@deffn {Data} types.CoroutineType

The type of @ref{6ba,,coroutine} objects, created by
@ref{7ee,,async def} functions.


Added in version 3.5.

@end deffn

@geindex AsyncGeneratorType (in module types)
@anchor{library/types types AsyncGeneratorType}@anchor{2a50}
@deffn {Data} types.AsyncGeneratorType

The type of @ref{24e2,,asynchronous generator}-iterator objects, created by
asynchronous generator functions.


Added in version 3.6.

@end deffn

@geindex CodeType (class in types)
@anchor{library/types types CodeType}@anchor{32d}
@deffn {Class} types.CodeType (**kwargs)

@geindex built-in function; compile

The type of @ref{4e7,,code objects} such as returned by @ref{4b2,,compile()}.

Raises an @ref{1cb1,,auditing event} @code{code.__new__} with arguments @code{code}, @code{filename}, @code{name}, @code{argcount}, @code{posonlyargcount}, @code{kwonlyargcount}, @code{nlocals}, @code{stacksize}, @code{flags}.

Note that the audited arguments may not match the names or positions
required by the initializer.  The audit event only occurs for direct
instantiation of code objects, and is not raised for normal compilation.
@end deffn

@geindex CellType (in module types)
@anchor{library/types types CellType}@anchor{2a51}
@deffn {Data} types.CellType

The type for cell objects: such objects are used as containers for
a function’s @ref{18da,,closure variables}.


Added in version 3.8.

@end deffn

@geindex MethodType (in module types)
@anchor{library/types types MethodType}@anchor{1bc7}
@deffn {Data} types.MethodType

The type of methods of user-defined class instances.
@end deffn

@geindex BuiltinFunctionType (in module types)
@geindex BuiltinMethodType (in module types)
@anchor{library/types types BuiltinFunctionType}@anchor{2a52}
@deffn {Data} types.BuiltinFunctionType
@anchor{library/types types BuiltinMethodType}@anchor{2a53}
@deffnx {Data} types.BuiltinMethodType

The type of built-in functions like @ref{841,,len()} or @ref{279,,sys.exit()}, and
methods of built-in classes.  (Here, the term “built-in” means “written in
C”.)
@end deffn

@geindex WrapperDescriptorType (in module types)
@anchor{library/types types WrapperDescriptorType}@anchor{d98}
@deffn {Data} types.WrapperDescriptorType

The type of methods of some built-in data types and base classes such as
@ref{8c1,,object.__init__()} or @ref{14ac,,object.__lt__()}.


Added in version 3.7.

@end deffn

@geindex MethodWrapperType (in module types)
@anchor{library/types types MethodWrapperType}@anchor{85c}
@deffn {Data} types.MethodWrapperType

The type of `bound' methods of some built-in data types and base classes.
For example it is the type of @code{object().__str__}.


Added in version 3.7.

@end deffn

@geindex NotImplementedType (class in types)
@anchor{library/types types NotImplementedType}@anchor{a59}
@deffn {Class} types.NotImplementedType

The type of @ref{1a3,,NotImplemented}.


Added in version 3.10.

@end deffn

@geindex MethodDescriptorType (in module types)
@anchor{library/types types MethodDescriptorType}@anchor{d99}
@deffn {Data} types.MethodDescriptorType

The type of methods of some built-in data types such as @ref{2651,,str.join()}.


Added in version 3.7.

@end deffn

@geindex ClassMethodDescriptorType (in module types)
@anchor{library/types types ClassMethodDescriptorType}@anchor{d9a}
@deffn {Data} types.ClassMethodDescriptorType

The type of `unbound' class methods of some built-in data types such as
@code{dict.__dict__['fromkeys']}.


Added in version 3.7.

@end deffn

@geindex ModuleType (class in types)
@anchor{library/types types ModuleType}@anchor{101a}
@deffn {Class} types.ModuleType (name, doc=None)

The type of @ref{1a22,,modules}. The constructor takes the name of the
module to be created and optionally its @ref{2330,,docstring}.


@subsubheading See also



@table @asis

@item @ref{23a2,,Documentation on module objects}

Provides details on the special attributes that can be found on
instances of @code{ModuleType}.

@item @ref{1019,,importlib.util.module_from_spec()}

Modules created using the @code{ModuleType} constructor are
created with many of their special attributes unset or set to default
values. @code{module_from_spec()} provides a more robust way of
creating @code{ModuleType} instances which ensures the various
attributes are set appropriately.
@end table

@end deffn

@geindex EllipsisType (class in types)
@anchor{library/types types EllipsisType}@anchor{a57}
@deffn {Class} types.EllipsisType

The type of @ref{236c,,Ellipsis}.


Added in version 3.10.

@end deffn

@geindex GenericAlias (class in types)
@anchor{library/types types GenericAlias}@anchor{9f2}
@deffn {Class} types.GenericAlias (t_origin, t_args)

The type of @ref{8c3,,parameterized generics} such as
@code{list[int]}.

@code{t_origin} should be a non-parameterized generic class, such as @code{list},
@code{tuple} or @code{dict}.  @code{t_args} should be a @ref{614,,tuple} (possibly of
length 1) of types which parameterize @code{t_origin}:

@example
>>> from types import GenericAlias

>>> list[int] == GenericAlias(list, (int,))
True
>>> dict[str, int] == GenericAlias(dict, (str, int))
True
@end example


Added in version 3.9.



Changed in version 3.9.2: This type can now be subclassed.



@subsubheading See also



@table @asis

@item @ref{8c3,,Generic Alias Types}

In-depth documentation on instances of @code{types.GenericAlias}

@geindex Python Enhancement Proposals; PEP 585

@item PEP 585@footnote{https://peps.python.org/pep-0585/} - Type Hinting Generics In Standard Collections

Introducing the @code{types.GenericAlias} class
@end table

@end deffn

@geindex UnionType (class in types)
@anchor{library/types types UnionType}@anchor{2a9}
@deffn {Class} types.UnionType

The type of @ref{9cb,,union type expressions}.


Added in version 3.10.



Changed in version 3.14: This is now an alias for @ref{2aa,,typing.Union}.

@end deffn

@geindex TracebackType (class in types)
@anchor{library/types types TracebackType}@anchor{cf0}
@deffn {Class} types.TracebackType (tb_next, tb_frame, tb_lasti, tb_lineno)

The type of traceback objects such as found in @code{sys.exception().__traceback__}.

See @ref{cf2,,the language reference} for details of the
available attributes and operations, and guidance on creating tracebacks
dynamically.
@end deffn

@geindex FrameType (in module types)
@anchor{library/types types FrameType}@anchor{1c31}
@deffn {Data} types.FrameType

The type of @ref{8f1,,frame objects} such as found in
@ref{23e8,,tb.tb_frame} if @code{tb} is a traceback object.
@end deffn

@geindex GetSetDescriptorType (in module types)
@anchor{library/types types GetSetDescriptorType}@anchor{2a54}
@deffn {Data} types.GetSetDescriptorType

The type of objects defined in extension modules with @code{PyGetSetDef}, such
as @ref{4a6,,FrameType.f_locals} or @code{array.array.typecode}.
This type is used as
descriptor for object attributes; it has the same purpose as the
@ref{4b4,,property} type, but for classes defined in extension modules.
@end deffn

@geindex MemberDescriptorType (in module types)
@anchor{library/types types MemberDescriptorType}@anchor{2a55}
@deffn {Data} types.MemberDescriptorType

The type of objects defined in extension modules with @code{PyMemberDef}, such
as @code{datetime.timedelta.days}.  This type is used as descriptor for simple C
data members which use standard conversion functions; it has the same purpose
as the @ref{4b4,,property} type, but for classes defined in extension modules.

In addition, when a class is defined with a @ref{16f7,,__slots__} attribute, then for
each slot, an instance of @code{MemberDescriptorType} will be added as an attribute
on the class. This allows the slot to appear in the class’s @ref{e5d,,__dict__}.

`CPython implementation detail:' In other implementations of Python, this type may be identical to
@code{GetSetDescriptorType}.
@end deffn

@geindex MappingProxyType (class in types)
@anchor{library/types types MappingProxyType}@anchor{699}
@deffn {Class} types.MappingProxyType (mapping)

Read-only proxy of a mapping. It provides a dynamic view on the mapping’s
entries, which means that when the mapping changes, the view reflects these
changes.

@code{MappingProxyType}s are @ref{2410,,generic} over two types,
signifying (respectively) the types of the underlying mapping’s keys and
values.


Added in version 3.3.



Changed in version 3.9: Updated to support the new union (@code{|}) operator from 
@geindex Python Enhancement Proposals; PEP 584
PEP 584@footnote{https://peps.python.org/pep-0584/}, which
simply delegates to the underlying mapping.



@deffn {Describe} key in proxy

Return @code{True} if the underlying mapping has a key `key', else
@code{False}.
@end deffn


@deffn {Describe} proxy[key]

Return the item of the underlying mapping with key `key'.  Raises a
@ref{5e7,,KeyError} if `key' is not in the underlying mapping.
@end deffn


@deffn {Describe} iter(proxy)

Return an iterator over the keys of the underlying mapping.  This is a
shortcut for @code{iter(proxy.keys())}.
@end deffn


@deffn {Describe} len(proxy)

Return the number of items in the underlying mapping.
@end deffn

@geindex copy() (types.MappingProxyType method)
@anchor{library/types types MappingProxyType copy}@anchor{2a56}
@deffn {Method} copy ()

Return a shallow copy of the underlying mapping.
@end deffn

@geindex get() (types.MappingProxyType method)
@anchor{library/types types MappingProxyType get}@anchor{2a57}
@deffn {Method} get (key[, default])

Return the value for `key' if `key' is in the underlying mapping, else
`default'.  If `default' is not given, it defaults to @code{None}, so that
this method never raises a @ref{5e7,,KeyError}.
@end deffn

@geindex items() (types.MappingProxyType method)
@anchor{library/types types MappingProxyType items}@anchor{2a58}
@deffn {Method} items ()

Return a new view of the underlying mapping’s items (@code{(key, value)}
pairs).
@end deffn

@geindex keys() (types.MappingProxyType method)
@anchor{library/types types MappingProxyType keys}@anchor{2a59}
@deffn {Method} keys ()

Return a new view of the underlying mapping’s keys.
@end deffn

@geindex values() (types.MappingProxyType method)
@anchor{library/types types MappingProxyType values}@anchor{2a5a}
@deffn {Method} values ()

Return a new view of the underlying mapping’s values.
@end deffn


@deffn {Describe} reversed(proxy)

Return a reverse iterator over the keys of the underlying mapping.


Added in version 3.9.

@end deffn


@deffn {Describe} hash(proxy)

Return a hash of the underlying mapping.


Added in version 3.12.

@end deffn
@end deffn

@geindex CapsuleType (class in types)
@anchor{library/types types CapsuleType}@anchor{2a5b}
@deffn {Class} types.CapsuleType

The type of @ref{2a5c,,capsule objects}.


Added in version 3.13.

@end deffn

@node Additional Utility Classes and Functions,Coroutine Utility Functions,Standard Interpreter Types,types — Dynamic type creation and names for built-in types
@anchor{library/types additional-utility-classes-and-functions}@anchor{2a5d}
@subsubsection Additional Utility Classes and Functions


@geindex SimpleNamespace (class in types)
@anchor{library/types types SimpleNamespace}@anchor{4e6}
@deffn {Class} types.SimpleNamespace

A simple @ref{c84,,object} subclass that provides attribute access to its
namespace, as well as a meaningful repr.

Unlike @ref{c84,,object}, with @code{SimpleNamespace} you can add and remove
attributes.

@code{SimpleNamespace} objects may be initialized
in the same way as @ref{184,,dict}: either with keyword arguments,
with a single positional argument, or with both.
When initialized with keyword arguments,
those are directly added to the underlying namespace.
Alternatively, when initialized with a positional argument,
the underlying namespace will be updated with key-value pairs
from that argument (either a mapping object or
an @ref{1433,,iterable} object producing key-value pairs).
All such keys must be strings.

The type is roughly equivalent to the following code:

@example
class SimpleNamespace:
    def __init__(self, mapping_or_iterable=(), /, **kwargs):
        self.__dict__.update(mapping_or_iterable)
        self.__dict__.update(kwargs)

    def __repr__(self):
        items = (f"@{k@}=@{v!r@}" for k, v in self.__dict__.items())
        return "@{@}(@{@})".format(type(self).__name__, ", ".join(items))

    def __eq__(self, other):
        if isinstance(self, SimpleNamespace) and isinstance(other, SimpleNamespace):
           return self.__dict__ == other.__dict__
        return NotImplemented
@end example

@code{SimpleNamespace} may be useful as a replacement for @code{class NS: pass}.
However, for a structured record type use @ref{4e1,,namedtuple()}
instead.

@code{SimpleNamespace} objects are supported by @ref{1c2,,copy.replace()}.


Added in version 3.3.



Changed in version 3.9: Attribute order in the repr changed from alphabetical to insertion (like
@code{dict}).



Changed in version 3.13: Added support for an optional positional argument.

@end deffn

@geindex DynamicClassAttribute() (in module types)
@anchor{library/types types DynamicClassAttribute}@anchor{83d}
@deffn {Function} types.DynamicClassAttribute (fget=None, fset=None, fdel=None, doc=None)

Route attribute access on a class to __getattr__.

This is a descriptor, used to define attributes that act differently when
accessed through an instance and through a class.  Instance access remains
normal, but access to an attribute through a class will be routed to the
class’s __getattr__ method; this is done by raising AttributeError.

This allows one to have properties active on an instance, and have virtual
attributes on the class with the same name (see @ref{843,,enum.Enum} for an example).


Added in version 3.4.

@end deffn

@node Coroutine Utility Functions,,Additional Utility Classes and Functions,types — Dynamic type creation and names for built-in types
@anchor{library/types coroutine-utility-functions}@anchor{2a5e}
@subsubsection Coroutine Utility Functions


@geindex coroutine() (in module types)
@anchor{library/types types coroutine}@anchor{108e}
@deffn {Function} types.coroutine (gen_func)

This function transforms a @ref{1267,,generator} function into a
@ref{f79,,coroutine function} which returns a generator-based coroutine.
The generator-based coroutine is still a @ref{ddf,,generator iterator},
but is also considered to be a @ref{6ba,,coroutine} object and is
@ref{4ca,,awaitable}.  However, it may not necessarily implement
the @ref{f7b,,__await__()} method.

If `gen_func' is a generator function, it will be modified in-place.

If `gen_func' is not a generator function, it will be wrapped. If it
returns an instance of @ref{fe1,,collections.abc.Generator}, the instance
will be wrapped in an `awaitable' proxy object.  All other types
of objects will be returned as is.


Added in version 3.5.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node copy — Shallow and deep copy operations,pprint — Data pretty printer,types — Dynamic type creation and names for built-in types,Data Types
@anchor{library/copy doc}@anchor{2a5f}@anchor{library/copy copy-shallow-and-deep-copy-operations}@anchor{2a60}@anchor{library/copy module-copy}@anchor{29}@anchor{library/copy translation-repo}@anchor{2a61}
@subsection @code{copy} — Shallow and deep copy operations


@geindex module; copy

`Source code:' Lib/copy.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/copy.py}


__________________________________________________________________


Assignment statements in Python do not copy objects, they create bindings
between a target and an object. For collections that are mutable or contain
mutable items, a copy is sometimes needed so one can change one copy without
changing the other. This module provides generic shallow and deep copy
operations (explained below).

Interface summary:

@geindex copy() (in module copy)
@anchor{library/copy copy copy}@anchor{758}
@deffn {Function} copy.copy (obj)

Return a shallow copy of `obj'.
@end deffn

@geindex deepcopy() (in module copy)
@anchor{library/copy copy deepcopy}@anchor{d6b}
@deffn {Function} copy.deepcopy (obj[, memo])

Return a deep copy of `obj'.
@end deffn

@geindex replace() (in module copy)
@anchor{library/copy copy replace}@anchor{1c2}
@deffn {Function} copy.replace (obj, /, **changes)

Creates a new object of the same type as `obj', replacing fields with values
from `changes'.


Added in version 3.13.

@end deffn

@geindex Error
@anchor{library/copy copy Error}@anchor{2a62}
@deffn {Exception} copy.Error

Raised for module specific errors.
@end deffn
@anchor{library/copy shallow-vs-deep-copy}@anchor{2028}
The difference between shallow and deep copying is only relevant for compound
objects (objects that contain other objects, like lists or class instances):


@itemize *

@item 
A `shallow copy' constructs a new compound object and then (to the extent
possible) inserts `references' into it to the objects found in the original.

@item 
A `deep copy' constructs a new compound object and then, recursively, inserts
`copies' into it of the objects found in the original.
@end itemize

Two problems often exist with deep copy operations that don’t exist with shallow
copy operations:


@itemize *

@item 
Recursive objects (compound objects that, directly or indirectly, contain a
reference to themselves) may cause a recursive loop.

@item 
Because deep copy copies everything it may copy too much, such as data
which is intended to be shared between copies.
@end itemize

The @ref{d6b,,deepcopy()} function avoids these problems by:


@itemize *

@item 
keeping a @code{memo} dictionary of objects already copied during the current
copying pass; and

@item 
letting user-defined classes override the copying operation or the set of
components copied.
@end itemize

This module does not copy types like module, method, stack trace, stack frame,
file, socket, window, or any similar types.  It does “copy” functions and
classes (shallow and deeply), by returning the original object unchanged; this
is compatible with the way these are treated by the @ref{ab,,pickle} module.

Shallow copies of many collections can be made using the corresponding
@code{copy()} method (such as @ref{2a63,,list.copy()}, @ref{dcf,,dict.copy()} or
@ref{26e6,,set.copy()}), and of sequences (such as lists or bytearrays) by making
a slice of the entire sequence (@code{sequence[:]}).
However, these methods and slicing can create an instance of the base type
when copying an instance of a subclass, whereas @ref{758,,copy.copy()} normally
returns an instance of the same type.

@geindex module; pickle

Classes can use the same interfaces to control copying that they use to control
pickling.  See the description of module @ref{ab,,pickle} for information on these
methods.  In fact, the @code{copy} module uses the registered
pickle functions from the @ref{2a,,copyreg} module.

@geindex __copy__() (copy protocol)
@geindex __deepcopy__() (copy protocol)

In order for a class to define its own copy implementation, it can define
special methods @ref{182e,,__copy__()} and @ref{1798,,__deepcopy__()}.

@anchor{library/copy object __copy__}@anchor{182e}
@deffn {Method} object.__copy__ (self)

Called to implement the shallow copy operation;
no additional arguments are passed.
@end deffn

@anchor{library/copy object __deepcopy__}@anchor{1798}
@deffn {Method} object.__deepcopy__ (self, memo)

Called to implement the deep copy operation; it is passed one
argument, the `memo' dictionary.  If the @code{__deepcopy__} implementation needs
to make a deep copy of a component, it should call the @ref{d6b,,deepcopy()} function
with the component as first argument and the `memo' dictionary as second argument.
The `memo' dictionary should be treated as an opaque object.
@end deffn

@geindex __replace__() (replace protocol)

Function @code{copy.replace()} is more limited
than @ref{758,,copy()} and @ref{d6b,,deepcopy()},
and only supports named tuples created by @ref{4e1,,namedtuple()},
@ref{33,,dataclasses}, and other classes which define method @ref{47d,,__replace__()}.

@anchor{library/copy object __replace__}@anchor{47d}
@deffn {Method} object.__replace__ (self, /, **changes)

This method should create a new object of the same type,
replacing fields with values from `changes'.


Added in version 3.13.

@end deffn


@subsubheading See also



@table @asis

@item Module @ref{ab,,pickle}

Discussion of the special methods used to support object state retrieval and
restoration.
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node pprint — Data pretty printer,reprlib — Alternate repr implementation,copy — Shallow and deep copy operations,Data Types
@anchor{library/pprint doc}@anchor{2a64}@anchor{library/pprint module-pprint}@anchor{b3}@anchor{library/pprint pprint-data-pretty-printer}@anchor{2a65}@anchor{library/pprint translation-repo}@anchor{2a66}
@subsection @code{pprint} — Data pretty printer


@geindex module; pprint

`Source code:' Lib/pprint.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/pprint.py}


__________________________________________________________________


The @code{pprint} module provides a capability to “pretty-print” arbitrary
Python data structures in a form which can be used as input to the interpreter.
If the formatted structures include objects which are not fundamental Python
types, the representation may not be loadable.  This may be the case if objects
such as files, sockets or classes are included, as well as many other
objects which are not representable as Python literals.

The formatted representation keeps objects on a single line if it can, and
breaks them onto multiple lines if they don’t fit within the allowed width,
adjustable by the `width' parameter defaulting to 80 characters.


Changed in version 3.9: Added support for pretty-printing @ref{4e6,,types.SimpleNamespace}.



Changed in version 3.10: Added support for pretty-printing @ref{4e2,,dataclasses.dataclass}.


@menu
* Functions: Functions<4>. 
* PrettyPrinter Objects:: 
* Example: Example<3>. 

@end menu

@node Functions<4>,PrettyPrinter Objects,,pprint — Data pretty printer
@anchor{library/pprint functions}@anchor{2a67}@anchor{library/pprint pprint-functions}@anchor{2a68}
@subsubsection Functions


@geindex pp() (in module pprint)
@anchor{library/pprint pprint pp}@anchor{c1e}
@deffn {Function} pprint.pp (object, stream=None, indent=1, width=80, depth=None, *, compact=False, sort_dicts=False, underscore_numbers=False)

Prints the formatted representation of `object', followed by a newline.
This function may be used in the interactive interpreter
instead of the @ref{117b,,print()} function for inspecting values.
Tip: you can reassign @code{print = pprint.pp} for use within a scope.

@*Parameters: 

@itemize *

@item 
@code{object} – The object to be printed.

@item 
@code{stream} (@ref{17fd,,file-like object} | None) – A file-like object to which the output will be written
by calling its @code{write()} method.
If @code{None} (the default), @ref{cd3,,sys.stdout} is used.

@item 
@code{indent} (@ref{19c,,int}) – The amount of indentation added for each nesting level.

@item 
@code{width} (@ref{19c,,int}) – The desired maximum number of characters per line in the output.
If a structure cannot be formatted within the width constraint,
a best effort will be made.

@item 
@code{depth} (@ref{19c,,int}@code{ | }@code{None}) – The number of nesting levels which may be printed.
If the data structure being printed is too deep,
the next contained level is replaced by @code{...}.
If @code{None} (the default), there is no constraint
on the depth of the objects being formatted.

@item 
@code{compact} (@ref{3c1,,bool}) – Control the way long @ref{717,,sequences} are formatted.
If @code{False} (the default),
each item of a sequence will be formatted on a separate line,
otherwise as many items as will fit within the `width'
will be formatted on each output line.

@item 
@code{sort_dicts} (@ref{3c1,,bool}) – If @code{True}, dictionaries will be formatted with
their keys sorted, otherwise
they will be displayed in insertion order (the default).

@item 
@code{underscore_numbers} (@ref{3c1,,bool}) – If @code{True},
integers will be formatted with the @code{_} character for a thousands separator,
otherwise underscores are not displayed (the default).
@end itemize


@example
>>> import pprint
>>> stuff = ['spam', 'eggs', 'lumberjack', 'knights', 'ni']
>>> stuff.insert(0, stuff)
>>> pprint.pp(stuff)
[<Recursion on list with id=...>,
 'spam',
 'eggs',
 'lumberjack',
 'knights',
 'ni']
@end example


Added in version 3.8.

@end deffn

@geindex pprint() (in module pprint)
@anchor{library/pprint pprint pprint}@anchor{a2f}
@deffn {Function} pprint.pprint (object, stream=None, indent=1, width=80, depth=None, *, compact=False, sort_dicts=True, underscore_numbers=False)

Alias for @ref{c1e,,pp()} with `sort_dicts' set to @code{True} by default,
which would automatically sort the dictionaries’ keys,
you might want to use @code{pp()} instead where it is @code{False} by default.
@end deffn

@geindex pformat() (in module pprint)
@anchor{library/pprint pprint pformat}@anchor{1186}
@deffn {Function} pprint.pformat (object, indent=1, width=80, depth=None, *, compact=False, sort_dicts=True, underscore_numbers=False)

Return the formatted representation of `object' as a string.  `indent',
`width', `depth', `compact', `sort_dicts' and `underscore_numbers' are
passed to the @ref{1185,,PrettyPrinter} constructor as formatting parameters
and their meanings are as described in the documentation above.
@end deffn

@geindex isreadable() (in module pprint)
@anchor{library/pprint pprint isreadable}@anchor{2a69}
@deffn {Function} pprint.isreadable (object)

@geindex built-in function; eval

Determine if the formatted representation of `object' is “readable”, or can be
used to reconstruct the value using @ref{4a4,,eval()}.  This always returns @code{False}
for recursive objects.

@example
>>> pprint.isreadable(stuff)
False
@end example
@end deffn

@geindex isrecursive() (in module pprint)
@anchor{library/pprint pprint isrecursive}@anchor{2a6a}
@deffn {Function} pprint.isrecursive (object)

Determine if `object' requires a recursive representation.  This function is
subject to the same limitations as noted in @ref{2a6b,,saferepr()} below and may raise an
@ref{f6e,,RecursionError} if it fails to detect a recursive object.
@end deffn

@geindex saferepr() (in module pprint)
@anchor{library/pprint pprint saferepr}@anchor{2a6b}
@deffn {Function} pprint.saferepr (object)

Return a string representation of `object', protected against recursion in
some common data structures, namely instances of @ref{184,,dict}, @ref{24f,,list}
and @ref{614,,tuple} or subclasses whose @code{__repr__} has not been overridden.  If the
representation of object exposes a recursive entry, the recursive reference
will be represented as @code{<Recursion on typename with id=number>}.  The
representation is not otherwise formatted.

@example
>>> pprint.saferepr(stuff)
"[<Recursion on list with id=...>, 'spam', 'eggs', 'lumberjack', 'knights', 'ni']"
@end example
@end deffn

@node PrettyPrinter Objects,Example<3>,Functions<4>,pprint — Data pretty printer
@anchor{library/pprint id1}@anchor{2a6c}@anchor{library/pprint prettyprinter-objects}@anchor{2a6d}
@subsubsection PrettyPrinter Objects


@geindex ...; placeholder

@geindex PrettyPrinter (class in pprint)
@anchor{library/pprint pprint PrettyPrinter}@anchor{1185}
@deffn {Class} pprint.PrettyPrinter (indent=1, width=80, depth=None, stream=None, *, compact=False, sort_dicts=True, underscore_numbers=False)

Construct a @code{PrettyPrinter} instance.

Arguments have the same meaning as for @ref{c1e,,pp()}.
Note that they are in a different order, and that `sort_dicts' defaults to @code{True}.

@example
>>> import pprint
>>> stuff = ['spam', 'eggs', 'lumberjack', 'knights', 'ni']
>>> stuff.insert(0, stuff[:])
>>> pp = pprint.PrettyPrinter(indent=4)
>>> pp.pprint(stuff)
[   ['spam', 'eggs', 'lumberjack', 'knights', 'ni'],
    'spam',
    'eggs',
    'lumberjack',
    'knights',
    'ni']
>>> pp = pprint.PrettyPrinter(width=41, compact=True)
>>> pp.pprint(stuff)
[['spam', 'eggs', 'lumberjack',
  'knights', 'ni'],
 'spam', 'eggs', 'lumberjack', 'knights',
 'ni']
>>> tup = ('spam', ('eggs', ('lumberjack', ('knights', ('ni', ('dead',
... ('parrot', ('fresh fruit',))))))))
>>> pp = pprint.PrettyPrinter(depth=6)
>>> pp.pprint(tup)
('spam', ('eggs', ('lumberjack', ('knights', ('ni', ('dead', (...)))))))
@end example


Changed in version 3.4: Added the `compact' parameter.



Changed in version 3.8: Added the `sort_dicts' parameter.



Changed in version 3.10: Added the `underscore_numbers' parameter.



Changed in version 3.11: No longer attempts to write to @code{sys.stdout} if it is @code{None}.

@end deffn

@ref{1185,,PrettyPrinter} instances have the following methods:

@geindex pformat() (pprint.PrettyPrinter method)
@anchor{library/pprint pprint PrettyPrinter pformat}@anchor{2a6e}
@deffn {Method} PrettyPrinter.pformat (object)

Return the formatted representation of `object'.  This takes into account the
options passed to the @ref{1185,,PrettyPrinter} constructor.
@end deffn

@geindex pprint() (pprint.PrettyPrinter method)
@anchor{library/pprint pprint PrettyPrinter pprint}@anchor{2a6f}
@deffn {Method} PrettyPrinter.pprint (object)

Print the formatted representation of `object' on the configured stream,
followed by a newline.
@end deffn

The following methods provide the implementations for the corresponding
functions of the same names.  Using these methods on an instance is slightly
more efficient since new @ref{1185,,PrettyPrinter} objects don’t need to be
created.

@geindex isreadable() (pprint.PrettyPrinter method)
@anchor{library/pprint pprint PrettyPrinter isreadable}@anchor{2a70}
@deffn {Method} PrettyPrinter.isreadable (object)

@geindex built-in function; eval

Determine if the formatted representation of the object is “readable,” or can be
used to reconstruct the value using @ref{4a4,,eval()}.  Note that this returns
@code{False} for recursive objects.  If the `depth' parameter of the
@ref{1185,,PrettyPrinter} is set and the object is deeper than allowed, this
returns @code{False}.
@end deffn

@geindex isrecursive() (pprint.PrettyPrinter method)
@anchor{library/pprint pprint PrettyPrinter isrecursive}@anchor{2a71}
@deffn {Method} PrettyPrinter.isrecursive (object)

Determine if the object requires a recursive representation.
@end deffn

This method is provided as a hook to allow subclasses to modify the way objects
are converted to strings.  The default implementation uses the internals of the
@ref{2a6b,,saferepr()} implementation.

@geindex format() (pprint.PrettyPrinter method)
@anchor{library/pprint pprint PrettyPrinter format}@anchor{1d2b}
@deffn {Method} PrettyPrinter.format (object, context, maxlevels, level)

Returns three values: the formatted version of `object' as a string, a flag
indicating whether the result is readable, and a flag indicating whether
recursion was detected.  The first argument is the object to be presented.  The
second is a dictionary which contains the @ref{162f,,id()} of objects that are part of
the current presentation context (direct and indirect containers for `object'
that are affecting the presentation) as the keys; if an object needs to be
presented which is already represented in `context', the third return value
should be @code{True}.  Recursive calls to the @code{format()} method should add
additional entries for containers to this dictionary.  The third argument,
`maxlevels', gives the requested limit to recursion; this will be @code{0} if there
is no requested limit.  This argument should be passed unmodified to recursive
calls. The fourth argument, `level', gives the current level; recursive calls
should be passed a value less than that of the current call.
@end deffn

@node Example<3>,,PrettyPrinter Objects,pprint — Data pretty printer
@anchor{library/pprint example}@anchor{2a72}@anchor{library/pprint pprint-example}@anchor{2a73}
@subsubsection Example


To demonstrate several uses of the @ref{c1e,,pp()} function and its parameters,
let’s fetch information about a project from PyPI@footnote{https://pypi.org}:

@example
>>> import json
>>> import pprint
>>> from urllib.request import urlopen
>>> with urlopen('https://pypi.org/pypi/sampleproject/1.2.0/json') as resp:
...     project_info = json.load(resp)['info']
@end example

In its basic form, @ref{c1e,,pp()} shows the whole object:

@example
>>> pprint.pp(project_info)
@{'author': 'The Python Packaging Authority',
 'author_email': 'pypa-dev@@googlegroups.com',
 'bugtrack_url': None,
 'classifiers': ['Development Status :: 3 - Alpha',
                 'Intended Audience :: Developers',
                 'License :: OSI Approved :: MIT License',
                 'Programming Language :: Python :: 2',
                 'Programming Language :: Python :: 2.6',
                 'Programming Language :: Python :: 2.7',
                 'Programming Language :: Python :: 3',
                 'Programming Language :: Python :: 3.2',
                 'Programming Language :: Python :: 3.3',
                 'Programming Language :: Python :: 3.4',
                 'Topic :: Software Development :: Build Tools'],
 'description': 'A sample Python project\n'
                '=======================\n'
                '\n'
                'This is the description file for the project.\n'
                '\n'
                'The file should use UTF-8 encoding and be written using '
                'ReStructured Text. It\n'
                'will be used to generate the project webpage on PyPI, and '
                'should be written for\n'
                'that purpose.\n'
                '\n'
                'Typical contents for this file would include an overview of '
                'the project, basic\n'
                'usage examples, etc. Generally, including the project '
                'changelog in here is not\n'
                'a good idea, although a simple "What\'s New" section for the '
                'most recent version\n'
                'may be appropriate.',
 'description_content_type': None,
 'docs_url': None,
 'download_url': 'UNKNOWN',
 'downloads': @{'last_day': -1, 'last_month': -1, 'last_week': -1@},
 'home_page': 'https://github.com/pypa/sampleproject',
 'keywords': 'sample setuptools development',
 'license': 'MIT',
 'maintainer': None,
 'maintainer_email': None,
 'name': 'sampleproject',
 'package_url': 'https://pypi.org/project/sampleproject/',
 'platform': 'UNKNOWN',
 'project_url': 'https://pypi.org/project/sampleproject/',
 'project_urls': @{'Download': 'UNKNOWN',
                  'Homepage': 'https://github.com/pypa/sampleproject'@},
 'release_url': 'https://pypi.org/project/sampleproject/1.2.0/',
 'requires_dist': None,
 'requires_python': None,
 'summary': 'A sample Python project',
 'version': '1.2.0'@}
@end example

The result can be limited to a certain `depth' (ellipsis is used for deeper
contents):

@example
>>> pprint.pp(project_info, depth=1)
@{'author': 'The Python Packaging Authority',
 'author_email': 'pypa-dev@@googlegroups.com',
 'bugtrack_url': None,
 'classifiers': [...],
 'description': 'A sample Python project\n'
                '=======================\n'
                '\n'
                'This is the description file for the project.\n'
                '\n'
                'The file should use UTF-8 encoding and be written using '
                'ReStructured Text. It\n'
                'will be used to generate the project webpage on PyPI, and '
                'should be written for\n'
                'that purpose.\n'
                '\n'
                'Typical contents for this file would include an overview of '
                'the project, basic\n'
                'usage examples, etc. Generally, including the project '
                'changelog in here is not\n'
                'a good idea, although a simple "What\'s New" section for the '
                'most recent version\n'
                'may be appropriate.',
 'description_content_type': None,
 'docs_url': None,
 'download_url': 'UNKNOWN',
 'downloads': @{...@},
 'home_page': 'https://github.com/pypa/sampleproject',
 'keywords': 'sample setuptools development',
 'license': 'MIT',
 'maintainer': None,
 'maintainer_email': None,
 'name': 'sampleproject',
 'package_url': 'https://pypi.org/project/sampleproject/',
 'platform': 'UNKNOWN',
 'project_url': 'https://pypi.org/project/sampleproject/',
 'project_urls': @{...@},
 'release_url': 'https://pypi.org/project/sampleproject/1.2.0/',
 'requires_dist': None,
 'requires_python': None,
 'summary': 'A sample Python project',
 'version': '1.2.0'@}
@end example

Additionally, maximum character `width' can be suggested. If a long object
cannot be split, the specified width will be exceeded:

@example
>>> pprint.pp(project_info, depth=1, width=60)
@{'author': 'The Python Packaging Authority',
 'author_email': 'pypa-dev@@googlegroups.com',
 'bugtrack_url': None,
 'classifiers': [...],
 'description': 'A sample Python project\n'
                '=======================\n'
                '\n'
                'This is the description file for the '
                'project.\n'
                '\n'
                'The file should use UTF-8 encoding and be '
                'written using ReStructured Text. It\n'
                'will be used to generate the project '
                'webpage on PyPI, and should be written '
                'for\n'
                'that purpose.\n'
                '\n'
                'Typical contents for this file would '
                'include an overview of the project, '
                'basic\n'
                'usage examples, etc. Generally, including '
                'the project changelog in here is not\n'
                'a good idea, although a simple "What\'s '
                'New" section for the most recent version\n'
                'may be appropriate.',
 'description_content_type': None,
 'docs_url': None,
 'download_url': 'UNKNOWN',
 'downloads': @{...@},
 'home_page': 'https://github.com/pypa/sampleproject',
 'keywords': 'sample setuptools development',
 'license': 'MIT',
 'maintainer': None,
 'maintainer_email': None,
 'name': 'sampleproject',
 'package_url': 'https://pypi.org/project/sampleproject/',
 'platform': 'UNKNOWN',
 'project_url': 'https://pypi.org/project/sampleproject/',
 'project_urls': @{...@},
 'release_url': 'https://pypi.org/project/sampleproject/1.2.0/',
 'requires_dist': None,
 'requires_python': None,
 'summary': 'A sample Python project',
 'version': '1.2.0'@}
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node reprlib — Alternate repr implementation,enum — Support for enumerations,pprint — Data pretty printer,Data Types
@anchor{library/reprlib doc}@anchor{2a74}@anchor{library/reprlib module-reprlib}@anchor{c0}@anchor{library/reprlib reprlib-alternate-repr-implementation}@anchor{2a75}@anchor{library/reprlib translation-repo}@anchor{2a76}
@subsection @code{reprlib} — Alternate @code{repr()} implementation


@geindex module; reprlib

`Source code:' Lib/reprlib.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/reprlib.py}


__________________________________________________________________


The @code{reprlib} module provides a means for producing object representations
with limits on the size of the resulting strings. This is used in the Python
debugger and may be useful in other contexts as well.

This module provides a class, an instance, and a function:

@geindex Repr (class in reprlib)
@anchor{library/reprlib reprlib Repr}@anchor{2a77}
@deffn {Class} reprlib.Repr (*, maxlevel=6, maxtuple=6, maxlist=6, maxarray=5, maxdict=4, maxset=6, maxfrozenset=6, maxdeque=6, maxstring=30, maxlong=40, maxother=30, fillvalue='...', indent=None)

Class which provides formatting services useful in implementing functions
similar to the built-in @ref{1c3,,repr()}; size limits for  different object types
are added to avoid the generation of representations which are excessively long.

The keyword arguments of the constructor can be used as a shortcut to set the
attributes of the @code{Repr} instance. Which means that the following
initialization:

@example
aRepr = reprlib.Repr(maxlevel=3)
@end example

Is equivalent to:

@example
aRepr = reprlib.Repr()
aRepr.maxlevel = 3
@end example

See section @ref{2a78,,Repr Objects} for more information about @code{Repr}
attributes.


Changed in version 3.12: Allow attributes to be set via keyword arguments.

@end deffn

@geindex aRepr (in module reprlib)
@anchor{library/reprlib reprlib aRepr}@anchor{2a79}
@deffn {Data} reprlib.aRepr

This is an instance of @ref{2a77,,Repr} which is used to provide the
@ref{2a7a,,repr()} function described below.  Changing the attributes of this
object will affect the size limits used by @code{repr()} and the Python
debugger.
@end deffn

@geindex repr() (in module reprlib)
@anchor{library/reprlib reprlib repr}@anchor{2a7a}
@deffn {Function} reprlib.repr (obj)

This is the @ref{2a7b,,repr()} method of @code{aRepr}.  It returns a string
similar to that returned by the built-in function of the same name, but with
limits on most sizes.
@end deffn

In addition to size-limiting tools, the module also provides a decorator for
detecting recursive calls to @ref{830,,__repr__()} and substituting a
placeholder string instead.

@geindex ...; placeholder

@geindex recursive_repr() (in module reprlib)
@anchor{library/reprlib reprlib recursive_repr}@anchor{13ff}
@deffn {Function} @@reprlib.recursive_repr (fillvalue='...')

Decorator for @ref{830,,__repr__()} methods to detect recursive calls within the
same thread.  If a recursive call is made, the `fillvalue' is returned,
otherwise, the usual @code{__repr__()} call is made.  For example:

@example
>>> from reprlib import recursive_repr
>>> class MyList(list):
...     @@recursive_repr()
...     def __repr__(self):
...         return '<' + '|'.join(map(repr, self)) + '>'
...
>>> m = MyList('abc')
>>> m.append(m)
>>> m.append('x')
>>> print(m)
<'a'|'b'|'c'|...|'x'>
@end example


Added in version 3.2.

@end deffn

@menu
* Repr Objects:: 
* Subclassing Repr Objects:: 

@end menu

@node Repr Objects,Subclassing Repr Objects,,reprlib — Alternate repr implementation
@anchor{library/reprlib id1}@anchor{2a78}@anchor{library/reprlib repr-objects}@anchor{2a7c}
@subsubsection Repr Objects


@ref{2a77,,Repr} instances provide several attributes which can be used to provide
size limits for the representations of different object types,  and methods
which format specific object types.

@geindex fillvalue (reprlib.Repr attribute)
@anchor{library/reprlib reprlib Repr fillvalue}@anchor{2a7d}
@deffn {Attribute} Repr.fillvalue

This string is displayed for recursive references. It defaults to
@code{...}.


Added in version 3.11.

@end deffn

@geindex maxlevel (reprlib.Repr attribute)
@anchor{library/reprlib reprlib Repr maxlevel}@anchor{2a7e}
@deffn {Attribute} Repr.maxlevel

Depth limit on the creation of recursive representations.  The default is @code{6}.
@end deffn

@geindex maxdict (reprlib.Repr attribute)
@geindex maxlist (reprlib.Repr attribute)
@geindex maxtuple (reprlib.Repr attribute)
@geindex maxset (reprlib.Repr attribute)
@geindex maxfrozenset (reprlib.Repr attribute)
@geindex maxdeque (reprlib.Repr attribute)
@geindex maxarray (reprlib.Repr attribute)
@anchor{library/reprlib reprlib Repr maxdict}@anchor{2a7f}
@deffn {Attribute} Repr.maxdict
@anchor{library/reprlib reprlib Repr maxlist}@anchor{2a80}
@deffnx {Attribute} Repr.maxlist
@anchor{library/reprlib reprlib Repr maxtuple}@anchor{2a81}
@deffnx {Attribute} Repr.maxtuple
@anchor{library/reprlib reprlib Repr maxset}@anchor{2a82}
@deffnx {Attribute} Repr.maxset
@anchor{library/reprlib reprlib Repr maxfrozenset}@anchor{2a83}
@deffnx {Attribute} Repr.maxfrozenset
@anchor{library/reprlib reprlib Repr maxdeque}@anchor{2a84}
@deffnx {Attribute} Repr.maxdeque
@anchor{library/reprlib reprlib Repr maxarray}@anchor{2a85}
@deffnx {Attribute} Repr.maxarray

Limits on the number of entries represented for the named object type.  The
default is @code{4} for @ref{2a7f,,maxdict}, @code{5} for @ref{2a85,,maxarray}, and  @code{6} for
the others.
@end deffn

@geindex maxlong (reprlib.Repr attribute)
@anchor{library/reprlib reprlib Repr maxlong}@anchor{2a86}
@deffn {Attribute} Repr.maxlong

Maximum number of characters in the representation for an integer.  Digits
are dropped from the middle.  The default is @code{40}.
@end deffn

@geindex maxstring (reprlib.Repr attribute)
@anchor{library/reprlib reprlib Repr maxstring}@anchor{2a87}
@deffn {Attribute} Repr.maxstring

Limit on the number of characters in the representation of the string.  Note
that the “normal” representation of the string is used as the character source:
if escape sequences are needed in the representation, these may be mangled when
the representation is shortened.  The default is @code{30}.
@end deffn

@geindex maxother (reprlib.Repr attribute)
@anchor{library/reprlib reprlib Repr maxother}@anchor{2a88}
@deffn {Attribute} Repr.maxother

This limit is used to control the size of object types for which no specific
formatting method is available on the @ref{2a77,,Repr} object. It is applied in a
similar manner as @ref{2a87,,maxstring}.  The default is @code{20}.
@end deffn

@geindex indent (reprlib.Repr attribute)
@anchor{library/reprlib reprlib Repr indent}@anchor{2a89}
@deffn {Attribute} Repr.indent

If this attribute is set to @code{None} (the default), the output is formatted
with no line breaks or indentation, like the standard @ref{1c3,,repr()}.
For example:

@example
>>> example = [
...     1, 'spam', @{'a': 2, 'b': 'spam eggs', 'c': @{3: 4.5, 6: []@}@}, 'ham']
>>> import reprlib
>>> aRepr = reprlib.Repr()
>>> print(aRepr.repr(example))
[1, 'spam', @{'a': 2, 'b': 'spam eggs', 'c': @{3: 4.5, 6: []@}@}, 'ham']
@end example

If @code{indent} is set to a string, each recursion level
is placed on its own line, indented by that string:

@example
>>> aRepr.indent = '-->'
>>> print(aRepr.repr(example))
[
-->1,
-->'spam',
-->@{
-->-->'a': 2,
-->-->'b': 'spam eggs',
-->-->'c': @{
-->-->-->3: 4.5,
-->-->-->6: [],
-->-->@},
-->@},
-->'ham',
]
@end example

Setting @code{indent} to a positive integer value behaves as if it
was set to a string with that number of spaces:

@example
>>> aRepr.indent = 4
>>> print(aRepr.repr(example))
[
    1,
    'spam',
    @{
        'a': 2,
        'b': 'spam eggs',
        'c': @{
            3: 4.5,
            6: [],
        @},
    @},
    'ham',
]
@end example


Added in version 3.12.

@end deffn

@geindex repr() (reprlib.Repr method)
@anchor{library/reprlib reprlib Repr repr}@anchor{2a7b}
@deffn {Method} Repr.repr (obj)

The equivalent to the built-in @ref{1c3,,repr()} that uses the formatting imposed by
the instance.
@end deffn

@geindex repr1() (reprlib.Repr method)
@anchor{library/reprlib reprlib Repr repr1}@anchor{2a8a}
@deffn {Method} Repr.repr1 (obj, level)

Recursive implementation used by @ref{2a7b,,repr()}.  This uses the type of `obj' to
determine which formatting method to call, passing it `obj' and `level'.  The
type-specific methods should call @code{repr1()} to perform recursive formatting,
with @code{level - 1} for the value of `level' in the recursive  call.
@end deffn


@deffn {Method} Repr.repr_TYPE (obj, level)

Formatting methods for specific types are implemented as methods with a name
based on the type name.  In the method name, `TYPE' is replaced by
@code{'_'.join(type(obj).__name__.split())}. Dispatch to these methods is
handled by @ref{2a8a,,repr1()}. Type-specific methods which need to recursively
format a value should call @code{self.repr1(subobj, level - 1)}.
@end deffn

@node Subclassing Repr Objects,,Repr Objects,reprlib — Alternate repr implementation
@anchor{library/reprlib subclassing-repr-objects}@anchor{2a8b}@anchor{library/reprlib subclassing-reprs}@anchor{2a8c}
@subsubsection Subclassing Repr Objects


The use of dynamic dispatching by @ref{2a8a,,Repr.repr1()} allows subclasses of
@ref{2a77,,Repr} to add support for additional built-in object types or to modify
the handling of types already supported. This example shows how special support
for file objects could be added:

@example
import reprlib
import sys

class MyRepr(reprlib.Repr):

    def repr_TextIOWrapper(self, obj, level):
        if obj.name in @{'<stdin>', '<stdout>', '<stderr>'@}:
            return obj.name
        return repr(obj)

aRepr = MyRepr()
print(aRepr.repr(sys.stdin))         # prints '<stdin>'
@end example

@example
<stdin>
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node enum — Support for enumerations,graphlib — Functionality to operate with graph-like structures,reprlib — Alternate repr implementation,Data Types
@anchor{library/enum doc}@anchor{2a8d}@anchor{library/enum enum-support-for-enumerations}@anchor{2a8e}@anchor{library/enum module-enum}@anchor{5a}@anchor{library/enum translation-repo}@anchor{2a8f}
@subsection @code{enum} — Support for enumerations


@geindex module; enum


Added in version 3.4.


`Source code:' Lib/enum.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/enum.py}

@subsubheading Important



This page contains the API reference information. For tutorial
information and discussion of more advanced topics, see


@itemize *

@item 
@ref{2a90,,Basic Tutorial}

@item 
@ref{2a91,,Advanced Tutorial}

@item 
@ref{2a92,,Enum Cookbook}
@end itemize


__________________________________________________________________


An enumeration:


@itemize *

@item 
is a set of symbolic names (members) bound to unique values

@item 
can be iterated over to return its canonical (i.e. non-alias) members in
definition order

@item 
uses `call' syntax to return members by value

@item 
uses `index' syntax to return members by name
@end itemize

Enumerations are created either by using @ref{14e3,,class} syntax, or by
using function-call syntax:

@example
>>> from enum import Enum

>>> # class syntax
>>> class Color(Enum):
...     RED = 1
...     GREEN = 2
...     BLUE = 3

>>> # functional syntax
>>> Color = Enum('Color', [('RED', 1), ('GREEN', 2), ('BLUE', 3)])
@end example

Even though we can use @ref{14e3,,class} syntax to create Enums, Enums
are not normal Python classes.  See
@ref{2a93,,How are Enums different?} for more details.

@cartouche
@quotation Note 
Nomenclature


@itemize -

@item 
The class @code{Color} is an `enumeration' (or `enum')

@item 
The attributes @code{Color.RED}, @code{Color.GREEN}, etc., are
`enumeration members' (or `members') and are functionally constants.

@item 
The enum members have `names' and `values' (the name of
@code{Color.RED} is @code{RED}, the value of @code{Color.BLUE} is
@code{3}, etc.)
@end itemize
@end quotation
@end cartouche


__________________________________________________________________


@menu
* Module contents:: 
* Data types:: 
* Utilities and decorators:: 
* Notes:: 

@end menu

@node Module contents,Data types,,enum — Support for enumerations
@anchor{library/enum module-contents}@anchor{2a94}
@subsubsection Module contents


@quotation

@ref{4f8,,EnumType}

@quotation

The @code{type} for Enum and its subclasses.
@end quotation

@ref{843,,Enum}

@quotation

Base class for creating enumerated constants.
@end quotation

@ref{ee1,,IntEnum}

@quotation

Base class for creating enumerated constants that are also
subclasses of @ref{19c,,int}. (@ref{2a95,,Notes})
@end quotation

@ref{82e,,StrEnum}

@quotation

Base class for creating enumerated constants that are also
subclasses of @ref{16a,,str}. (@ref{2a95,,Notes})
@end quotation

@ref{836,,Flag}

@quotation

Base class for creating enumerated constants that can be combined using
the bitwise operations without losing their @ref{836,,Flag} membership.
@end quotation

@ref{ea0,,IntFlag}

@quotation

Base class for creating enumerated constants that can be combined using
the bitwise operators without losing their @ref{ea0,,IntFlag} membership.
@code{IntFlag} members are also subclasses of @ref{19c,,int}. (@ref{2a95,,Notes})
@end quotation

@ref{82f,,ReprEnum}

@quotation

Used by @ref{ee1,,IntEnum}, @ref{82e,,StrEnum}, and @ref{ea0,,IntFlag}
to keep the @ref{16a,,str()} of the mixed-in type.
@end quotation

@ref{839,,EnumCheck}

@quotation

An enumeration with the values @code{CONTINUOUS}, @code{NAMED_FLAGS}, and
@code{UNIQUE}, for use with @ref{838,,verify()} to ensure various constraints
are met by a given enumeration.
@end quotation

@ref{837,,FlagBoundary}

@quotation

An enumeration with the values @code{STRICT}, @code{CONFORM}, @code{EJECT}, and
@code{KEEP} which allows for more fine-grained control over how invalid values
are dealt with in an enumeration.
@end quotation

@ref{4f7,,EnumDict}

@quotation

A subclass of @ref{184,,dict} for use when subclassing @ref{4f8,,EnumType}.
@end quotation

@ref{ea1,,auto}

@quotation

Instances are replaced with an appropriate value for Enum members.
@ref{82e,,StrEnum} defaults to the lower-cased version of the member name,
while other Enums default to 1 and increase from there.
@end quotation

@ref{83c,,property()}

@quotation

Allows @ref{843,,Enum} members to have attributes without conflicting with
member names.  The @code{value} and @code{name} attributes are implemented this
way.
@end quotation

@ref{2a96,,unique()}

@quotation

Enum class decorator that ensures only one name is bound to any one value.
@end quotation

@ref{838,,verify()}

@quotation

Enum class decorator that checks user-selectable constraints on an
enumeration.
@end quotation

@ref{83a,,member()}

@quotation

Make @code{obj} a member.  Can be used as a decorator.
@end quotation

@ref{83b,,nonmember()}

@quotation

Do not make @code{obj} a member.  Can be used as a decorator.
@end quotation

@ref{83e,,global_enum()}

@quotation

Modify the @ref{16a,,str()} and @ref{1c3,,repr()} of an enum
to show its members as belonging to the module instead of its class,
and export the enum members to the global namespace.
@end quotation

@ref{2a97,,show_flag_values()}

@quotation

Return a list of all power-of-two integers contained in a flag.
@end quotation

@ref{17df,,enum.bin()}

@quotation

Like built-in @ref{14b4,,bin()}, except negative values are represented in
two’s complement, and the leading bit always indicates sign
(@code{0} implies positive, @code{1} implies negative).
@end quotation
@end quotation


Added in version 3.6: @code{Flag}, @code{IntFlag}, @code{auto}



Added in version 3.11: @code{StrEnum}, @code{EnumCheck}, @code{ReprEnum}, @code{FlagBoundary}, @code{property}, @code{member}, @code{nonmember}, @code{global_enum}, @code{show_flag_values}



Added in version 3.13: @code{EnumDict}



__________________________________________________________________


@node Data types,Utilities and decorators,Module contents,enum — Support for enumerations
@anchor{library/enum data-types}@anchor{2a98}
@subsubsection Data types


@geindex EnumType (class in enum)
@anchor{library/enum enum EnumType}@anchor{4f8}
@deffn {Class} enum.EnumType

`EnumType' is the @ref{2417,,metaclass} for `enum' enumerations.  It is possible
to subclass `EnumType' – see @ref{2a99,,Subclassing EnumType}
for details.

@code{EnumType} is responsible for setting the correct @code{__repr__()},
@code{__str__()}, @code{__format__()}, and @code{__reduce__()} methods on the
final `enum', as well as creating the enum members, properly handling
duplicates, providing iteration over the enum class, etc.


Added in version 3.11: Before 3.11 @code{EnumType} was called @code{EnumMeta}, which is still available as an alias.


@geindex __call__() (enum.EnumType method)
@anchor{library/enum enum EnumType __call__}@anchor{2a9a}
@deffn {Method} __call__ (cls, value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)

This method is called in two different ways:


@itemize *

@item 
to look up an existing member:

@quotation

@*cls: 
The enum class being called.


@*value: 
The value to lookup.

@end quotation

@item 
to use the @code{cls} enum to create a new enum (only if the existing enum
does not have any members):

@quotation

@*cls: 
The enum class being called.


@*value: 
The name of the new Enum to create.


@*names: 
The names/values of the members for the new Enum.


@*module: 
The name of the module the new Enum is created in.


@*qualname: 
The actual location in the module where this Enum can be found.


@*type: 
A mix-in type for the new Enum.


@*start: 
The first integer value for the Enum (used by @ref{ea1,,auto}).


@*boundary: 
How to handle out-of-range values from bit operations (@ref{836,,Flag} only).

@end quotation
@end itemize
@end deffn

@geindex __contains__() (enum.EnumType method)
@anchor{library/enum enum EnumType __contains__}@anchor{2a9b}
@deffn {Method} __contains__ (cls, member)

Returns @code{True} if member belongs to the @code{cls}:

@example
>>> some_var = Color.RED
>>> some_var in Color
True
>>> Color.RED.value in Color
True
@end example


Changed in version 3.12: Before Python 3.12, a @code{TypeError} is raised if a
non-Enum-member is used in a containment check.

@end deffn

@geindex __dir__() (enum.EnumType method)
@anchor{library/enum enum EnumType __dir__}@anchor{2a9c}
@deffn {Method} __dir__ (cls)

Returns @code{['__class__', '__doc__', '__members__', '__module__']} and the
names of the members in `cls':

@example
>>> dir(Color)
['BLUE', 'GREEN', 'RED', '__class__', '__contains__', '__doc__', '__getitem__', '__init_subclass__', '__iter__', '__len__', '__members__', '__module__', '__name__', '__qualname__']
@end example
@end deffn

@geindex __getitem__() (enum.EnumType method)
@anchor{library/enum enum EnumType __getitem__}@anchor{2a9d}
@deffn {Method} __getitem__ (cls, name)

Returns the Enum member in `cls' matching `name', or raises a @ref{5e7,,KeyError}:

@example
>>> Color['BLUE']
<Color.BLUE: 3>
@end example
@end deffn

@geindex __iter__() (enum.EnumType method)
@anchor{library/enum enum EnumType __iter__}@anchor{2a9e}
@deffn {Method} __iter__ (cls)

Returns each member in `cls' in definition order:

@example
>>> list(Color)
[<Color.RED: 1>, <Color.GREEN: 2>, <Color.BLUE: 3>]
@end example
@end deffn

@geindex __len__() (enum.EnumType method)
@anchor{library/enum enum EnumType __len__}@anchor{2a9f}
@deffn {Method} __len__ (cls)

Returns the number of members in `cls':

@example
>>> len(Color)
3
@end example
@end deffn

@geindex __members__ (enum.EnumType attribute)
@anchor{library/enum enum EnumType __members__}@anchor{2aa0}
@deffn {Attribute} __members__

Returns a mapping of every enum name to its member, including aliases
@end deffn

@geindex __reversed__() (enum.EnumType method)
@anchor{library/enum enum EnumType __reversed__}@anchor{2aa1}
@deffn {Method} __reversed__ (cls)

Returns each member in `cls' in reverse definition order:

@example
>>> list(reversed(Color))
[<Color.BLUE: 3>, <Color.GREEN: 2>, <Color.RED: 1>]
@end example
@end deffn
@end deffn

@geindex Enum (class in enum)
@anchor{library/enum enum Enum}@anchor{843}
@deffn {Class} enum.Enum

`Enum' is the base class for all `enum' enumerations.

@geindex name (enum.Enum attribute)
@anchor{library/enum enum Enum name}@anchor{2aa2}
@deffn {Attribute} name

The name used to define the @code{Enum} member:

@example
>>> Color.BLUE.name
'BLUE'
@end example
@end deffn

@geindex value (enum.Enum attribute)
@anchor{library/enum enum Enum value}@anchor{2aa3}
@deffn {Attribute} value

The value given to the @code{Enum} member:

@example
>>> Color.RED.value
1
@end example

Value of the member, can be set in @ref{2aa4,,__new__()}.

@cartouche
@quotation Note 
Enum member values

Member values can be anything: @ref{19c,,int}, @ref{16a,,str}, etc.  If
the exact value is unimportant you may use @ref{ea1,,auto} instances and an
appropriate value will be chosen for you.  See @code{auto} for the
details.

While mutable/unhashable values, such as @ref{184,,dict}, @ref{24f,,list} or
a mutable @ref{4e2,,dataclass}, can be used, they will have a
quadratic performance impact during creation relative to the
total number of mutable/unhashable values in the enum.
@end quotation
@end cartouche
@end deffn

@geindex _name_ (enum.Enum attribute)
@anchor{library/enum enum Enum _name_}@anchor{2aa5}
@deffn {Attribute} _name_

Name of the member.
@end deffn

@geindex _value_ (enum.Enum attribute)
@anchor{library/enum enum Enum _value_}@anchor{2aa6}
@deffn {Attribute} _value_

Value of the member, can be set in @ref{2aa4,,__new__()}.
@end deffn

@geindex _order_ (enum.Enum attribute)
@anchor{library/enum enum Enum _order_}@anchor{2aa7}
@deffn {Attribute} _order_

No longer used, kept for backward compatibility.
(class attribute, removed during class creation).

The @code{_order_} attribute can be provided to help keep Python 2 / Python 3 code in sync.
It will be checked against the actual order of the enumeration and raise an error if the two do not match:

@example
>>> class Color(Enum):
...     _order_ = 'RED GREEN BLUE'
...     RED = 1
...     BLUE = 3
...     GREEN = 2
...
Traceback (most recent call last):
...
TypeError: member order does not match _order_:
   ['RED', 'BLUE', 'GREEN']
   ['RED', 'GREEN', 'BLUE']
@end example

@cartouche
@quotation Note 
In Python 2 code the @code{_order_} attribute is necessary as definition
order is lost before it can be recorded.
@end quotation
@end cartouche


Added in version 3.6.

@end deffn

@geindex _ignore_ (enum.Enum attribute)
@anchor{library/enum enum Enum _ignore_}@anchor{2aa8}
@deffn {Attribute} _ignore_

@code{_ignore_} is only used during creation and is removed from the
enumeration once creation is complete.

@code{_ignore_} is a list of names that will not become members, and whose
names will also be removed from the completed enumeration.  See
@ref{2aa9,,TimePeriod} for an example.


Added in version 3.7.

@end deffn

@geindex __dir__() (enum.Enum method)
@anchor{library/enum enum Enum __dir__}@anchor{1c47}
@deffn {Method} __dir__ (self)

Returns @code{['__class__', '__doc__', '__module__', 'name', 'value']} and
any public methods defined on `self.__class__':

@example
>>> from enum import Enum
>>> import datetime as dt
>>> class Weekday(Enum):
...     MONDAY = 1
...     TUESDAY = 2
...     WEDNESDAY = 3
...     THURSDAY = 4
...     FRIDAY = 5
...     SATURDAY = 6
...     SUNDAY = 7
...     @@classmethod
...     def today(cls):
...         print(f'today is @{cls(dt.date.today().isoweekday()).name@}')
...
>>> dir(Weekday.SATURDAY)
['__class__', '__doc__', '__eq__', '__hash__', '__module__', 'name', 'today', 'value']
@end example
@end deffn

@geindex _generate_next_value_() (enum.Enum method)
@anchor{library/enum enum Enum _generate_next_value_}@anchor{2aaa}
@deffn {Method} _generate_next_value_ (name, start, count, last_values)

@quotation

@*name: 
The name of the member being defined (e.g. ‘RED’).


@*start: 
The start value for the Enum; the default is 1.


@*count: 
The number of members currently defined, not including this one.


@*last_values: 
A list of the previous values.

@end quotation

A `staticmethod' that is used to determine the next value returned by
@ref{ea1,,auto}.

@cartouche
@quotation Note 
For standard @code{Enum} classes the next value chosen is the highest
value seen incremented by one.

For @ref{836,,Flag} classes the next value chosen will be the next highest
power-of-two.
@end quotation
@end cartouche

This method may be overridden, e.g.:

@example
>>> from enum import auto, Enum
>>> class PowersOfThree(Enum):
...     @@staticmethod
...     def _generate_next_value_(name, start, count, last_values):
...         return 3 ** (count + 1)
...     FIRST = auto()
...     SECOND = auto()
...
>>> PowersOfThree.SECOND.value
9
@end example


Added in version 3.6.



Changed in version 3.13: Prior versions would use the last seen value instead of the highest value.

@end deffn

@geindex __init__() (enum.Enum method)
@anchor{library/enum enum Enum __init__}@anchor{2aab}
@deffn {Method} __init__ (self, *args, **kwds)

By default, does nothing.  If multiple values are given in the member
assignment, those values become separate arguments to @code{__init__}; e.g.

@example
>>> from enum import Enum
>>> class Weekday(Enum):
...     MONDAY = 1, 'Mon'
@end example

@code{Weekday.__init__()} would be called as @code{Weekday.__init__(self, 1, 'Mon')}
@end deffn

@geindex __init_subclass__() (enum.Enum method)
@anchor{library/enum enum Enum __init_subclass__}@anchor{2aac}
@deffn {Method} __init_subclass__ (cls, **kwds)

A `classmethod' that is used to further configure subsequent subclasses.
By default, does nothing.
@end deffn

@geindex _missing_() (enum.Enum method)
@anchor{library/enum enum Enum _missing_}@anchor{2aad}
@deffn {Method} _missing_ (cls, value)

A `classmethod' for looking up values not found in `cls'.  By default it
does nothing, but can be overridden to implement custom search behavior:

@example
>>> from enum import auto, StrEnum
>>> class Build(StrEnum):
...     DEBUG = auto()
...     OPTIMIZED = auto()
...     @@classmethod
...     def _missing_(cls, value):
...         value = value.lower()
...         for member in cls:
...             if member.value == value:
...                 return member
...         return None
...
>>> Build.DEBUG.value
'debug'
>>> Build('deBUG')
<Build.DEBUG: 'debug'>
@end example


Added in version 3.6.

@end deffn

@geindex __new__() (enum.Enum method)
@anchor{library/enum enum Enum __new__}@anchor{2aa4}
@deffn {Method} __new__ (cls, *args, **kwds)

By default, doesn’t exist.  If specified, either in the enum class
definition or in a mixin class (such as @code{int}), all values given
in the member assignment will be passed; e.g.

@example
>>> from enum import Enum
>>> class MyIntEnum(int, Enum):
...     TWENTYSIX = '1a', 16
@end example

results in the call @code{int('1a', 16)} and a value of @code{26} for the member.

@cartouche
@quotation Note 
When writing a custom @code{__new__}, do not use @code{super().__new__} –
call the appropriate @code{__new__} instead.
@end quotation
@end cartouche
@end deffn

@geindex __repr__() (enum.Enum method)
@anchor{library/enum enum Enum __repr__}@anchor{1b3e}
@deffn {Method} __repr__ (self)

Returns the string used for `repr()' calls.  By default, returns the
`Enum' name, member name, and value, but can be overridden:

@example
>>> from enum import auto, Enum
>>> class OtherStyle(Enum):
...     ALTERNATE = auto()
...     OTHER = auto()
...     SOMETHING_ELSE = auto()
...     def __repr__(self):
...         cls_name = self.__class__.__name__
...         return f'@{cls_name@}.@{self.name@}'
...
>>> OtherStyle.ALTERNATE, str(OtherStyle.ALTERNATE), f"@{OtherStyle.ALTERNATE@}"
(OtherStyle.ALTERNATE, 'OtherStyle.ALTERNATE', 'OtherStyle.ALTERNATE')
@end example
@end deffn

@geindex __str__() (enum.Enum method)
@anchor{library/enum enum Enum __str__}@anchor{835}
@deffn {Method} __str__ (self)

Returns the string used for `str()' calls.  By default, returns the
`Enum' name and member name, but can be overridden:

@example
>>> from enum import auto, Enum
>>> class OtherStyle(Enum):
...     ALTERNATE = auto()
...     OTHER = auto()
...     SOMETHING_ELSE = auto()
...     def __str__(self):
...         return f'@{self.name@}'
...
>>> OtherStyle.ALTERNATE, str(OtherStyle.ALTERNATE), f"@{OtherStyle.ALTERNATE@}"
(<OtherStyle.ALTERNATE: 1>, 'ALTERNATE', 'ALTERNATE')
@end example
@end deffn

@geindex __format__() (enum.Enum method)
@anchor{library/enum enum Enum __format__}@anchor{833}
@deffn {Method} __format__ (self)

Returns the string used for `format()' and `f-string' calls.  By default,
returns @ref{835,,__str__()} return value, but can be overridden:

@example
>>> from enum import auto, Enum
>>> class OtherStyle(Enum):
...     ALTERNATE = auto()
...     OTHER = auto()
...     SOMETHING_ELSE = auto()
...     def __format__(self, spec):
...         return f'@{self.name@}'
...
>>> OtherStyle.ALTERNATE, str(OtherStyle.ALTERNATE), f"@{OtherStyle.ALTERNATE@}"
(<OtherStyle.ALTERNATE: 1>, 'OtherStyle.ALTERNATE', 'ALTERNATE')
@end example
@end deffn

@cartouche
@quotation Note 
Using @ref{ea1,,auto} with @code{Enum} results in integers of increasing value,
starting with @code{1}.
@end quotation
@end cartouche


Changed in version 3.12: Added @ref{1b3d,,Dataclass support}


@geindex _add_alias_() (enum.Enum method)
@anchor{library/enum enum Enum _add_alias_}@anchor{2aae}
@deffn {Method} _add_alias_ ()

Adds a new name as an alias to an existing member:

@example
>>> Color.RED._add_alias_("ERROR")
>>> Color.ERROR
<Color.RED: 1>
@end example

Raises a @ref{450,,NameError} if the name is already assigned to a different member.


Added in version 3.13.

@end deffn

@geindex _add_value_alias_() (enum.Enum method)
@anchor{library/enum enum Enum _add_value_alias_}@anchor{2aaf}
@deffn {Method} _add_value_alias_ ()

Adds a new value as an alias to an existing member:

@example
>>> Color.RED._add_value_alias_(42)
>>> Color(42)
<Color.RED: 1>
@end example


@display
Raises a @ref{2ee,,ValueError} if the value is already linked with a different member.@w{ }
See @ref{2ab0,,MultiValueEnum} for an example.@w{ }
@end display




Added in version 3.13.

@end deffn
@end deffn

@geindex IntEnum (class in enum)
@anchor{library/enum enum IntEnum}@anchor{ee1}
@deffn {Class} enum.IntEnum

`IntEnum' is the same as @ref{843,,Enum}, but its members are also integers and can be
used anywhere that an integer can be used.  If any integer operation is performed
with an `IntEnum' member, the resulting value loses its enumeration status.

@example
>>> from enum import IntEnum
>>> class Number(IntEnum):
...     ONE = 1
...     TWO = 2
...     THREE = 3
...
>>> Number.THREE
<Number.THREE: 3>
>>> Number.ONE + Number.TWO
3
>>> Number.THREE + 5
8
>>> Number.THREE == 3
True
@end example

@cartouche
@quotation Note 
Using @ref{ea1,,auto} with @code{IntEnum} results in integers of increasing
value, starting with @code{1}.
@end quotation
@end cartouche


Changed in version 3.11: @ref{831,,__str__()} is now @code{int.__str__()} to
better support the `replacement of existing constants' use-case.
@ref{832,,__format__()} was already @code{int.__format__()} for that same reason.

@end deffn

@geindex StrEnum (class in enum)
@anchor{library/enum enum StrEnum}@anchor{82e}
@deffn {Class} enum.StrEnum

`StrEnum' is the same as @ref{843,,Enum}, but its members are also strings and
can be used in most of the same places that a string can be used. The result
of any string operation performed on or with a `StrEnum' member is not part
of the enumeration.

@example
>>> from enum import StrEnum, auto
>>> class Color(StrEnum):
...     RED = 'r'
...     GREEN = 'g'
...     BLUE = 'b'
...     UNKNOWN = auto()
...
>>> Color.RED
<Color.RED: 'r'>
>>> Color.UNKNOWN
<Color.UNKNOWN: 'unknown'>
>>> str(Color.UNKNOWN)
'unknown'
@end example

@cartouche
@quotation Note 
There are places in the stdlib that check for an exact @ref{16a,,str}
instead of a @code{str} subclass (i.e. @code{type(unknown) == str}
instead of @code{isinstance(unknown, str)}), and in those locations you
will need to use @code{str(MyStrEnum.MY_MEMBER)}.
@end quotation
@end cartouche

@cartouche
@quotation Note 
Using @ref{ea1,,auto} with @code{StrEnum} results in the lower-cased member
name as the value.
@end quotation
@end cartouche

@cartouche
@quotation Note 
@ref{831,,__str__()} is @code{str.__str__()} to better support the
`replacement of existing constants' use-case.  @ref{832,,__format__()} is likewise
@code{str.__format__()} for that same reason.
@end quotation
@end cartouche


Added in version 3.11.

@end deffn

@geindex Flag (class in enum)
@anchor{library/enum enum Flag}@anchor{836}
@deffn {Class} enum.Flag

@code{Flag} is the same as @ref{843,,Enum}, but its members support the bitwise
operators @code{&} (`AND'), @code{|} (`OR'), @code{^} (`XOR'), and @code{~} (`INVERT');
the results of those operations are (aliases of) members of the enumeration.

@geindex __contains__() (enum.Flag method)
@anchor{library/enum enum Flag __contains__}@anchor{2ab1}
@deffn {Method} __contains__ (self, value)

Returns `True' if value is in self:

@example
>>> from enum import Flag, auto
>>> class Color(Flag):
...     RED = auto()
...     GREEN = auto()
...     BLUE = auto()
...
>>> purple = Color.RED | Color.BLUE
>>> white = Color.RED | Color.GREEN | Color.BLUE
>>> Color.GREEN in purple
False
>>> Color.GREEN in white
True
>>> purple in white
True
>>> white in purple
False
@end example
@end deffn

@geindex __iter__() (enum.Flag method)
@anchor{library/enum enum Flag __iter__}@anchor{2ab2}
@deffn {Method} __iter__ (self)

Returns all contained non-alias members:

@example
>>> list(Color.RED)
[<Color.RED: 1>]
>>> list(purple)
[<Color.RED: 1>, <Color.BLUE: 4>]
@end example


Added in version 3.11.

@end deffn

@geindex __len__() (enum.Flag method)
@anchor{library/enum enum Flag __len__}@anchor{2ab3}
@deffn {Method} __len__ (self)

Returns number of members in flag:

@example
>>> len(Color.GREEN)
1
>>> len(white)
3
@end example


Added in version 3.11.

@end deffn

@geindex __bool__() (enum.Flag method)
@anchor{library/enum enum Flag __bool__}@anchor{2ab4}
@deffn {Method} __bool__ (self)

Returns `True' if any members in flag, `False' otherwise:

@example
>>> bool(Color.GREEN)
True
>>> bool(white)
True
>>> black = Color(0)
>>> bool(black)
False
@end example
@end deffn

@geindex __or__() (enum.Flag method)
@anchor{library/enum enum Flag __or__}@anchor{2ab5}
@deffn {Method} __or__ (self, other)

Returns current flag binary or’ed with other:

@example
>>> Color.RED | Color.GREEN
<Color.RED|GREEN: 3>
@end example
@end deffn

@geindex __and__() (enum.Flag method)
@anchor{library/enum enum Flag __and__}@anchor{2ab6}
@deffn {Method} __and__ (self, other)

Returns current flag binary and’ed with other:

@example
>>> purple & white
<Color.RED|BLUE: 5>
>>> purple & Color.GREEN
<Color: 0>
@end example
@end deffn

@geindex __xor__() (enum.Flag method)
@anchor{library/enum enum Flag __xor__}@anchor{2ab7}
@deffn {Method} __xor__ (self, other)

Returns current flag binary xor’ed with other:

@example
>>> purple ^ white
<Color.GREEN: 2>
>>> purple ^ Color.GREEN
<Color.RED|GREEN|BLUE: 7>
@end example
@end deffn

@geindex __invert__() (enum.Flag method)
@anchor{library/enum enum Flag __invert__}@anchor{2ab8}
@deffn {Method} __invert__ (self)

Returns all the flags in `type(self)' that are not in `self':

@example
>>> ~white
<Color: 0>
>>> ~purple
<Color.GREEN: 2>
>>> ~Color.RED
<Color.GREEN|BLUE: 6>
@end example
@end deffn

@geindex _numeric_repr_() (enum.Flag method)
@anchor{library/enum enum Flag _numeric_repr_}@anchor{2ab9}
@deffn {Method} _numeric_repr_ ()

Function used to format any remaining unnamed numeric values.  Default is
the value’s repr; common choices are @ref{14db,,hex()} and @ref{14da,,oct()}.
@end deffn

@cartouche
@quotation Note 
Using @ref{ea1,,auto} with @code{Flag} results in integers that are powers
of two, starting with @code{1}.
@end quotation
@end cartouche


Changed in version 3.11: The `repr()' of zero-valued flags has changed.  It
is now:

@example
>>> Color(0)
<Color: 0>
@end example

@end deffn

@geindex IntFlag (class in enum)
@anchor{library/enum enum IntFlag}@anchor{ea0}
@deffn {Class} enum.IntFlag

@code{IntFlag} is the same as @ref{836,,Flag}, but its members are also integers and can be
used anywhere that an integer can be used.

@example
>>> from enum import IntFlag, auto
>>> class Color(IntFlag):
...     RED = auto()
...     GREEN = auto()
...     BLUE = auto()
...
>>> Color.RED & 2
<Color: 0>
>>> Color.RED | 2
<Color.RED|GREEN: 3>
@end example

If any integer operation is performed with an `IntFlag' member, the result is
not an `IntFlag':

@example
>>> Color.RED + 2
3
@end example

If a @ref{836,,Flag} operation is performed with an `IntFlag' member and:


@itemize *

@item 
the result is a valid `IntFlag': an `IntFlag' is returned

@item 
the result is not a valid `IntFlag': the result depends on the @ref{837,,FlagBoundary} setting
@end itemize

The @ref{1c3,,repr()} of unnamed zero-valued flags has changed.  It is now:

@example
>>> Color(0)
<Color: 0>
@end example

@cartouche
@quotation Note 
Using @ref{ea1,,auto} with @code{IntFlag} results in integers that are powers
of two, starting with @code{1}.
@end quotation
@end cartouche


Changed in version 3.11: @ref{831,,__str__()} is now @code{int.__str__()} to better support the
`replacement of existing constants' use-case.  @ref{832,,__format__()} was
already @code{int.__format__()} for that same reason.

Inversion of an @code{IntFlag} now returns a positive value that is the
union of all flags not in the given flag, rather than a negative value.
This matches the existing @ref{836,,Flag} behavior.

@end deffn

@geindex ReprEnum (class in enum)
@anchor{library/enum enum ReprEnum}@anchor{82f}
@deffn {Class} enum.ReprEnum

@code{ReprEnum} uses the @ref{1b3e,,repr()} of @ref{843,,Enum},
but the @ref{16a,,str()} of the mixed-in data type:


@itemize *

@item 
@code{int.__str__()} for @ref{ee1,,IntEnum} and @ref{ea0,,IntFlag}

@item 
@code{str.__str__()} for @ref{82e,,StrEnum}
@end itemize

Inherit from @code{ReprEnum} to keep the @ref{16a,,str()} / @ref{19a,,format()}
of the mixed-in data type instead of using the
@ref{843,,Enum}-default @ref{835,,str()}.


Added in version 3.11.

@end deffn

@geindex EnumCheck (class in enum)
@anchor{library/enum enum EnumCheck}@anchor{839}
@deffn {Class} enum.EnumCheck

`EnumCheck' contains the options used by the @ref{838,,verify()} decorator to ensure
various constraints; failed constraints result in a @ref{2ee,,ValueError}.

@geindex UNIQUE (enum.EnumCheck attribute)
@anchor{library/enum enum EnumCheck UNIQUE}@anchor{2aba}
@deffn {Attribute} UNIQUE

Ensure that each value has only one name:

@example
>>> from enum import Enum, verify, UNIQUE
>>> @@verify(UNIQUE)
... class Color(Enum):
...     RED = 1
...     GREEN = 2
...     BLUE = 3
...     CRIMSON = 1
Traceback (most recent call last):
...
ValueError: aliases found in <enum 'Color'>: CRIMSON -> RED
@end example
@end deffn

@geindex CONTINUOUS (enum.EnumCheck attribute)
@anchor{library/enum enum EnumCheck CONTINUOUS}@anchor{2abb}
@deffn {Attribute} CONTINUOUS

Ensure that there are no missing values between the lowest-valued member
and the highest-valued member:

@example
>>> from enum import Enum, verify, CONTINUOUS
>>> @@verify(CONTINUOUS)
... class Color(Enum):
...     RED = 1
...     GREEN = 2
...     BLUE = 5
Traceback (most recent call last):
...
ValueError: invalid enum 'Color': missing values 3, 4
@end example
@end deffn

@geindex NAMED_FLAGS (enum.EnumCheck attribute)
@anchor{library/enum enum EnumCheck NAMED_FLAGS}@anchor{2abc}
@deffn {Attribute} NAMED_FLAGS

Ensure that any flag groups/masks contain only named flags – useful when
values are specified instead of being generated by @ref{ea1,,auto()}:

@example
>>> from enum import Flag, verify, NAMED_FLAGS
>>> @@verify(NAMED_FLAGS)
... class Color(Flag):
...     RED = 1
...     GREEN = 2
...     BLUE = 4
...     WHITE = 15
...     NEON = 31
Traceback (most recent call last):
...
ValueError: invalid Flag 'Color': aliases WHITE and NEON are missing combined values of 0x18 [use enum.show_flag_values(value) for details]
@end example
@end deffn

@cartouche
@quotation Note 
CONTINUOUS and NAMED_FLAGS are designed to work with integer-valued members.
@end quotation
@end cartouche


Added in version 3.11.

@end deffn

@geindex FlagBoundary (class in enum)
@anchor{library/enum enum FlagBoundary}@anchor{837}
@deffn {Class} enum.FlagBoundary

@code{FlagBoundary} controls how out-of-range values are handled in @ref{836,,Flag} and its
subclasses.

@geindex STRICT (enum.FlagBoundary attribute)
@anchor{library/enum enum FlagBoundary STRICT}@anchor{2abd}
@deffn {Attribute} STRICT

Out-of-range values cause a @ref{2ee,,ValueError} to be raised. This is the
default for @ref{836,,Flag}:

@example
>>> from enum import Flag, STRICT, auto
>>> class StrictFlag(Flag, boundary=STRICT):
...     RED = auto()
...     GREEN = auto()
...     BLUE = auto()
...
>>> StrictFlag(2**2 + 2**4)
Traceback (most recent call last):
...
ValueError: <flag 'StrictFlag'> invalid value 20
    given 0b0 10100
  allowed 0b0 00111
@end example
@end deffn

@geindex CONFORM (enum.FlagBoundary attribute)
@anchor{library/enum enum FlagBoundary CONFORM}@anchor{2abe}
@deffn {Attribute} CONFORM

Out-of-range values have invalid values removed, leaving a valid @ref{836,,Flag}
value:

@example
>>> from enum import Flag, CONFORM, auto
>>> class ConformFlag(Flag, boundary=CONFORM):
...     RED = auto()
...     GREEN = auto()
...     BLUE = auto()
...
>>> ConformFlag(2**2 + 2**4)
<ConformFlag.BLUE: 4>
@end example
@end deffn

@geindex EJECT (enum.FlagBoundary attribute)
@anchor{library/enum enum FlagBoundary EJECT}@anchor{2abf}
@deffn {Attribute} EJECT

Out-of-range values lose their @ref{836,,Flag} membership and revert to @ref{19c,,int}.

@example
>>> from enum import Flag, EJECT, auto
>>> class EjectFlag(Flag, boundary=EJECT):
...     RED = auto()
...     GREEN = auto()
...     BLUE = auto()
...
>>> EjectFlag(2**2 + 2**4)
20
@end example
@end deffn

@geindex KEEP (enum.FlagBoundary attribute)
@anchor{library/enum enum FlagBoundary KEEP}@anchor{2ac0}
@deffn {Attribute} KEEP

Out-of-range values are kept, and the @ref{836,,Flag} membership is kept.
This is the default for @ref{ea0,,IntFlag}:

@example
>>> from enum import Flag, KEEP, auto
>>> class KeepFlag(Flag, boundary=KEEP):
...     RED = auto()
...     GREEN = auto()
...     BLUE = auto()
...
>>> KeepFlag(2**2 + 2**4)
<KeepFlag.BLUE|16: 20>
@end example
@end deffn


Added in version 3.11.

@end deffn

@geindex EnumDict (class in enum)
@anchor{library/enum enum EnumDict}@anchor{4f7}
@deffn {Class} enum.EnumDict

`EnumDict' is a subclass of @ref{184,,dict} that is used as the namespace
for defining enum classes (see @ref{e5e,,Preparing the class namespace}).
It is exposed to allow subclasses of @ref{4f8,,EnumType} with advanced
behavior like having multiple values per member.
It should be called with the name of the enum class being created, otherwise
private names and internal classes will not be handled correctly.

Note that only the @ref{12b8,,MutableMapping} interface
(@ref{14d7,,__setitem__()} and @ref{1671,,update()}) is overridden.
It may be possible to bypass the checks using other @code{dict}
operations like @ref{2448,,|=}.

@geindex member_names (enum.EnumDict attribute)
@anchor{library/enum enum EnumDict member_names}@anchor{2ac1}
@deffn {Attribute} member_names

A list of member names.
@end deffn


Added in version 3.13.

@end deffn


__________________________________________________________________


@menu
* Supported __dunder__ names:: 
* Supported _sunder_ names:: 

@end menu

@node Supported __dunder__ names,Supported _sunder_ names,,Data types
@anchor{library/enum enum-dunder-sunder}@anchor{2ac2}@anchor{library/enum supported-dunder-names}@anchor{2ac3}
@subsubsection Supported @code{__dunder__} names


@ref{2aa0,,__members__} is a read-only ordered mapping of @code{member_name}:@code{member}
items.  It is only available on the class.

@ref{2aa4,,__new__()}, if specified, must create and return the enum members;
it is also a very good idea to set the member’s @ref{2aa6,,_value_} appropriately.
Once all the members are created it is no longer used.

@node Supported _sunder_ names,,Supported __dunder__ names,Data types
@anchor{library/enum supported-sunder-names}@anchor{2ac4}
@subsubsection Supported @code{_sunder_} names



@itemize -

@item 
@ref{2aa5,,_name_} – name of the member

@item 
@ref{2aa6,,_value_} – value of the member; can be set in @code{__new__}

@item 
@ref{2aad,,_missing_()} – a lookup function used when a value is not found;
may be overridden

@item 
@ref{2aa8,,_ignore_} – a list of names, either as a @ref{24f,,list} or a
@ref{16a,,str}, that will not be transformed into members, and will be removed
from the final class

@item 
@ref{2aa7,,_order_} – no longer used, kept for backward
compatibility (class attribute, removed during class creation)

@item 
@ref{2aaa,,_generate_next_value_()} – used to get an appropriate value for
an enum member; may be overridden

@item 
@ref{2aae,,_add_alias_()} – adds a new name as an alias to an existing
member.

@item 
@ref{2aaf,,_add_value_alias_()} – adds a new value as an alias to an
existing member.

@item 
While @code{_sunder_} names are generally reserved for the further development
of the @ref{843,,Enum} class and can not be used, some are explicitly allowed:


@itemize -

@item 
@code{_repr_*} (e.g. @code{_repr_html_}), as used in IPython's rich display@footnote{https://ipython.readthedocs.io/en/stable/config/integrating.html#rich-display}
@end itemize
@end itemize


Added in version 3.6: @code{_missing_}, @code{_order_}, @code{_generate_next_value_}



Added in version 3.7: @code{_ignore_}



Added in version 3.13: @code{_add_alias_}, @code{_add_value_alias_}, @code{_repr_*}



__________________________________________________________________


@node Utilities and decorators,Notes,Data types,enum — Support for enumerations
@anchor{library/enum ipython-s-rich-display}@anchor{2ac5}@anchor{library/enum utilities-and-decorators}@anchor{2ac6}
@subsubsection Utilities and decorators


@geindex auto (class in enum)
@anchor{library/enum enum auto}@anchor{ea1}
@deffn {Class} enum.auto

`auto' can be used in place of a value.  If used, the `Enum' machinery will
call an @ref{843,,Enum}’s @ref{2aaa,,_generate_next_value_()} to get an appropriate value.
For @code{Enum} and @ref{ee1,,IntEnum} that appropriate value will be the last value plus
one; for @ref{836,,Flag} and @ref{ea0,,IntFlag} it will be the first power-of-two greater
than the highest value; for @ref{82e,,StrEnum} it will be the lower-cased version of
the member’s name.  Care must be taken if mixing `auto()' with manually
specified values.

`auto' instances are only resolved when at the top level of an assignment, either by
itself or as part of a tuple:


@itemize *

@item 
@code{FIRST = auto()} will work (auto() is replaced with @code{1});

@item 
@code{SECOND = auto(), -2} will work (auto is replaced with @code{2}, so @code{2, -2} is
used to create the @code{SECOND} enum member;

@item 
@code{THREE = [auto(), -3]} will `not' work (@code{[<auto instance>, -3]} is used to
create the @code{THREE} enum member)
@end itemize


Changed in version 3.11.1: In prior versions, @code{auto()} had to be the only thing
on the assignment line to work properly.


@code{_generate_next_value_} can be overridden to customize the values used by
`auto'.

@cartouche
@quotation Note 
in 3.13 the default @code{_generate_next_value_} will always return
the highest member value incremented by 1, and will fail if any
member is an incompatible type.
@end quotation
@end cartouche
@end deffn

@geindex property() (in module enum)
@anchor{library/enum enum property}@anchor{83c}
@deffn {Function} @@enum.property

A decorator similar to the built-in `property', but specifically for
enumerations.  It allows member attributes to have the same names as members
themselves.

@cartouche
@quotation Note 
the `property' and the member must be defined in separate classes;
for example, the `value' and `name' attributes are defined in the
`Enum' class, and `Enum' subclasses can define members with the
names @code{value} and @code{name}.
@end quotation
@end cartouche


Added in version 3.11.

@end deffn

@geindex unique() (in module enum)
@anchor{library/enum enum unique}@anchor{2a96}
@deffn {Function} @@enum.unique

A @ref{14e3,,class} decorator specifically for enumerations.  It searches an
enumeration’s @ref{2aa0,,__members__}, gathering any aliases it finds; if any are
found @ref{2ee,,ValueError} is raised with the details:

@example
>>> from enum import Enum, unique
>>> @@unique
... class Mistake(Enum):
...     ONE = 1
...     TWO = 2
...     THREE = 3
...     FOUR = 3
...
Traceback (most recent call last):
...
ValueError: duplicate values found in <enum 'Mistake'>: FOUR -> THREE
@end example
@end deffn

@geindex verify() (in module enum)
@anchor{library/enum enum verify}@anchor{838}
@deffn {Function} @@enum.verify

A @ref{14e3,,class} decorator specifically for enumerations.  Members from
@ref{839,,EnumCheck} are used to specify which constraints should be checked
on the decorated enumeration.


Added in version 3.11.

@end deffn

@geindex member() (in module enum)
@anchor{library/enum enum member}@anchor{83a}
@deffn {Function} @@enum.member

A decorator for use in enums: its target will become a member.


Added in version 3.11.

@end deffn

@geindex nonmember() (in module enum)
@anchor{library/enum enum nonmember}@anchor{83b}
@deffn {Function} @@enum.nonmember

A decorator for use in enums: its target will not become a member.


Added in version 3.11.

@end deffn

@geindex global_enum() (in module enum)
@anchor{library/enum enum global_enum}@anchor{83e}
@deffn {Function} @@enum.global_enum

A decorator to change the @ref{16a,,str()} and @ref{1c3,,repr()} of an enum
to show its members as belonging to the module instead of its class.
Should only be used when the enum members are exported
to the module global namespace (see @ref{840,,re.RegexFlag} for an example).


Added in version 3.11.

@end deffn

@geindex show_flag_values() (in module enum)
@anchor{library/enum enum show_flag_values}@anchor{2a97}
@deffn {Function} enum.show_flag_values (value)

Return a list of all power-of-two integers contained in a flag `value'.


Added in version 3.11.

@end deffn

@geindex bin() (in module enum)
@anchor{library/enum enum bin}@anchor{17df}
@deffn {Function} enum.bin (num, max_bits=None)

Like built-in @code{bin()}, except negative values are represented in
two’s complement, and the leading bit always indicates sign
(@code{0} implies positive, @code{1} implies negative).

@example
>>> import enum
>>> enum.bin(10)
'0b0 1010'
>>> enum.bin(~10)   # ~10 is -11
'0b1 0101'
@end example


Added in version 3.11.

@end deffn


__________________________________________________________________


@node Notes,,Utilities and decorators,enum — Support for enumerations
@anchor{library/enum notes}@anchor{2a95}
@subsubsection Notes


@ref{ee1,,IntEnum}, @ref{82e,,StrEnum}, and @ref{ea0,,IntFlag}

@quotation

These three enum types are designed to be drop-in replacements for existing
integer- and string-based values; as such, they have extra limitations:


@itemize -

@item 
@code{__str__} uses the value and not the name of the enum member

@item 
@code{__format__}, because it uses @code{__str__}, will also use the value of
the enum member instead of its name
@end itemize

If you do not need/want those limitations, you can either create your own
base class by mixing in the @code{int} or @code{str} type yourself:

@example
>>> from enum import Enum
>>> class MyIntEnum(int, Enum):
...     pass
@end example

or you can reassign the appropriate @ref{16a,,str()}, etc., in your enum:

@example
>>> from enum import Enum, IntEnum
>>> class MyIntEnum(IntEnum):
...     __str__ = Enum.__str__
@end example
@end quotation

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node graphlib — Functionality to operate with graph-like structures,,enum — Support for enumerations,Data Types
@anchor{library/graphlib doc}@anchor{2ac7}@anchor{library/graphlib graphlib-functionality-to-operate-with-graph-like-structures}@anchor{2ac8}@anchor{library/graphlib module-graphlib}@anchor{69}@anchor{library/graphlib translation-repo}@anchor{2ac9}
@subsection @code{graphlib} — Functionality to operate with graph-like structures


@geindex module; graphlib

`Source code:' Lib/graphlib.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/graphlib.py}

@c import graphlib
@c from graphlib import *


__________________________________________________________________


@geindex TopologicalSorter (class in graphlib)
@anchor{library/graphlib graphlib TopologicalSorter}@anchor{ae4}
@deffn {Class} graphlib.TopologicalSorter (graph=None)

Provides functionality to topologically sort a graph of @ref{825,,hashable} nodes.

A topological order is a linear ordering of the vertices in a graph such that
for every directed edge u -> v from vertex u to vertex v, vertex u comes
before vertex v in the ordering. For instance, the vertices of the graph may
represent tasks to be performed, and the edges may represent constraints that
one task must be performed before another; in this example, a topological
ordering is just a valid sequence for the tasks. A complete topological
ordering is possible if and only if the graph has no directed cycles, that
is, if it is a directed acyclic graph.

If the optional `graph' argument is provided it must be a dictionary
representing a directed acyclic graph where the keys are nodes and the values
are iterables of all predecessors of that node in the graph (the nodes that
have edges that point to the value in the key). Additional nodes can be added
to the graph using the @ref{2aca,,add()} method.

In the general case, the steps required to perform the sorting of a given
graph are as follows:


@itemize *

@item 
Create an instance of the @code{TopologicalSorter} with an optional
initial graph.

@item 
Add additional nodes to the graph.

@item 
Call @ref{221,,prepare()} on the graph.

@item 
While @ref{2acb,,is_active()} is @code{True}, iterate over
the nodes returned by @ref{2acc,,get_ready()} and
process them. Call @ref{2acd,,done()} on each node as it
finishes processing.
@end itemize

In case just an immediate sorting of the nodes in the graph is required and
no parallelism is involved, the convenience method
@ref{2ace,,TopologicalSorter.static_order()} can be used directly:

@example
>>> graph = @{"D": @{"B", "C"@}, "C": @{"A"@}, "B": @{"A"@}@}
>>> ts = TopologicalSorter(graph)
>>> tuple(ts.static_order())
('A', 'C', 'B', 'D')
@end example

The class is designed to easily support parallel processing of the nodes as
they become ready. For instance:

@example
topological_sorter = TopologicalSorter()

# Add nodes to 'topological_sorter'...

topological_sorter.prepare()
while topological_sorter.is_active():
    for node in topological_sorter.get_ready():
        # Worker threads or processes take nodes to work on off the
        # 'task_queue' queue.
        task_queue.put(node)

    # When the work for a node is done, workers put the node in
    # 'finalized_tasks_queue' so we can get more nodes to work on.
    # The definition of 'is_active()' guarantees that, at this point, at
    # least one node has been placed on 'task_queue' that hasn't yet
    # been passed to 'done()', so this blocking 'get()' must (eventually)
    # succeed.  After calling 'done()', we loop back to call 'get_ready()'
    # again, so put newly freed nodes on 'task_queue' as soon as
    # logically possible.
    node = finalized_tasks_queue.get()
    topological_sorter.done(node)
@end example

@geindex add() (graphlib.TopologicalSorter method)
@anchor{library/graphlib graphlib TopologicalSorter add}@anchor{2aca}
@deffn {Method} add (node, *predecessors)

Add a new node and its predecessors to the graph. Both the `node' and all
elements in `predecessors' must be @ref{825,,hashable}.

If called multiple times with the same node argument, the set of
dependencies will be the union of all dependencies passed in.

It is possible to add a node with no dependencies (`predecessors' is not
provided) or to provide a dependency twice. If a node that has not been
provided before is included among `predecessors' it will be automatically
added to the graph with no predecessors of its own.

Raises @ref{2ee,,ValueError} if called after @ref{221,,prepare()}.
@end deffn

@geindex prepare() (graphlib.TopologicalSorter method)
@anchor{library/graphlib graphlib TopologicalSorter prepare}@anchor{221}
@deffn {Method} prepare ()

Mark the graph as finished and check for cycles in the graph. If any cycle
is detected, @ref{2acf,,CycleError} will be raised, but
@ref{2acc,,get_ready()} can still be used to obtain as many
nodes as possible until cycles block more progress. After a call to this
function, the graph cannot be modified, and therefore no more nodes can be
added using @ref{2aca,,add()}.

A @ref{2ee,,ValueError} will be raised if the sort has been started by
@ref{2ace,,static_order()} or @ref{2acc,,get_ready()}.


Changed in version 3.14: @code{prepare()} can now be called more than once as long as the sort has
not started. Previously this raised @ref{2ee,,ValueError}.

@end deffn

@geindex is_active() (graphlib.TopologicalSorter method)
@anchor{library/graphlib graphlib TopologicalSorter is_active}@anchor{2acb}
@deffn {Method} is_active ()

Returns @code{True} if more progress can be made and @code{False} otherwise.
Progress can be made if cycles do not block the resolution and either
there are still nodes ready that haven’t yet been returned by
@ref{2acc,,TopologicalSorter.get_ready()} or the number of nodes marked
@ref{2acd,,TopologicalSorter.done()} is less than the number that have been
returned by @code{TopologicalSorter.get_ready()}.

The @ref{14e1,,__bool__()} method of this class defers to
this function, so instead of:

@example
if ts.is_active():
    ...
@end example

it is possible to simply do:

@example
if ts:
    ...
@end example

Raises @ref{2ee,,ValueError} if called without calling
@ref{221,,prepare()} previously.
@end deffn

@geindex done() (graphlib.TopologicalSorter method)
@anchor{library/graphlib graphlib TopologicalSorter done}@anchor{2acd}
@deffn {Method} done (*nodes)

Marks a set of nodes returned by @ref{2acc,,TopologicalSorter.get_ready()} as
processed, unblocking any successor of each node in `nodes' for being
returned in the future by a call to @code{TopologicalSorter.get_ready()}.

Raises @ref{2ee,,ValueError} if any node in `nodes' has already been marked as
processed by a previous call to this method or if a node was not added to
the graph by using @ref{2aca,,TopologicalSorter.add()}, if called without
calling @ref{221,,prepare()} or if node has not yet been
returned by @ref{2acc,,get_ready()}.
@end deffn

@geindex get_ready() (graphlib.TopologicalSorter method)
@anchor{library/graphlib graphlib TopologicalSorter get_ready}@anchor{2acc}
@deffn {Method} get_ready ()

Returns a @code{tuple} with all the nodes that are ready. Initially it
returns all nodes with no predecessors, and once those are marked as
processed by calling @ref{2acd,,TopologicalSorter.done()}, further calls will
return all new nodes that have all their predecessors already processed.
Once no more progress can be made, empty tuples are returned.

Raises @ref{2ee,,ValueError} if called without calling
@ref{221,,prepare()} previously.
@end deffn

@geindex static_order() (graphlib.TopologicalSorter method)
@anchor{library/graphlib graphlib TopologicalSorter static_order}@anchor{2ace}
@deffn {Method} static_order ()

Returns an iterator object which will iterate over nodes in a topological
order. When using this method, @ref{221,,prepare()} and
@ref{2acd,,done()} should not be called. This method is
equivalent to:

@example
def static_order(self):
    self.prepare()
    while self.is_active():
        node_group = self.get_ready()
        yield from node_group
        self.done(*node_group)
@end example

The particular order that is returned may depend on the specific order in
which the items were inserted in the graph. For example:

@example
>>> ts = TopologicalSorter()
>>> ts.add(3, 2, 1)
>>> ts.add(1, 0)
>>> print([*ts.static_order()])
[2, 0, 1, 3]

>>> ts2 = TopologicalSorter()
>>> ts2.add(1, 0)
>>> ts2.add(3, 2, 1)
>>> print([*ts2.static_order()])
[0, 2, 1, 3]
@end example

This is due to the fact that “0” and “2” are in the same level in the
graph (they would have been returned in the same call to
@ref{2acc,,get_ready()}) and the order between them is
determined by the order of insertion.

If any cycle is detected, @ref{2acf,,CycleError} will be raised.
@end deffn


Added in version 3.9.

@end deffn

@menu
* Exceptions: Exceptions<4>. 

@end menu

@node Exceptions<4>,,,graphlib — Functionality to operate with graph-like structures
@anchor{library/graphlib exceptions}@anchor{2ad0}
@subsubsection Exceptions


The @code{graphlib} module defines the following exception classes:

@geindex CycleError
@anchor{library/graphlib graphlib CycleError}@anchor{2acf}
@deffn {Exception} graphlib.CycleError

Subclass of @ref{2ee,,ValueError} raised by @ref{221,,TopologicalSorter.prepare()} if cycles exist
in the working graph. If multiple cycles exist, only one undefined choice among them will
be reported and included in the exception.

The detected cycle can be accessed via the second element in the @ref{78e,,args}
attribute of the exception instance and consists in a list of nodes, such that each node is,
in the graph, an immediate predecessor of the next node in the list. In the reported list,
the first and the last node will be the same, to make it clear that it is cyclic.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Numeric and Mathematical Modules,Functional Programming Modules,Data Types,The Python Standard Library
@anchor{library/numeric doc}@anchor{2ad1}@anchor{library/numeric numeric}@anchor{2ad2}@anchor{library/numeric numeric-and-mathematical-modules}@anchor{2ad3}@anchor{library/numeric translation-repo}@anchor{2ad4}
@section Numeric and Mathematical Modules


The modules described in this chapter provide numeric and math-related functions
and data types. The @ref{a2,,numbers} module defines an abstract hierarchy of
numeric types. The @ref{92,,math} and @ref{19,,cmath} modules contain various
mathematical functions for floating-point and complex numbers. The @ref{3a,,decimal}
module supports exact representations of decimal numbers, using arbitrary precision
arithmetic.

The following modules are documented in this chapter:

@menu
* numbers — Numeric abstract base classes:: 
* math — Mathematical functions:: 
* cmath — Mathematical functions for complex numbers:: 
* decimal — Decimal fixed-point and floating-point arithmetic:: 
* fractions — Rational numbers:: 
* random — Generate pseudo-random numbers:: 
* statistics — Mathematical statistics functions:: 

@end menu

@node numbers — Numeric abstract base classes,math — Mathematical functions,,Numeric and Mathematical Modules
@anchor{library/numbers doc}@anchor{2ad5}@anchor{library/numbers module-numbers}@anchor{a2}@anchor{library/numbers numbers-numeric-abstract-base-classes}@anchor{2ad6}
@subsection @code{numbers} — Numeric abstract base classes


@geindex module; numbers

`Source code:' Lib/numbers.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/numbers.py}


__________________________________________________________________


The @code{numbers} module (
@geindex Python Enhancement Proposals; PEP 3141
PEP 3141@footnote{https://peps.python.org/pep-3141/}) defines a hierarchy of numeric
@ref{13c2,,abstract base classes} which progressively define
more operations.  None of the types defined in this module are intended to be instantiated.

@geindex Number (class in numbers)
@anchor{library/numbers numbers Number}@anchor{2ad7}
@deffn {Class} numbers.Number

The root of the numeric hierarchy. If you just want to check if an argument
`x' is a number, without caring what kind, use @code{isinstance(x, Number)}.
@end deffn

@menu
* The numeric tower:: 
* Notes for type implementers:: 

@end menu

@node The numeric tower,Notes for type implementers,,numbers — Numeric abstract base classes
@anchor{library/numbers the-numeric-tower}@anchor{2ad8}
@subsubsection The numeric tower


@geindex Complex (class in numbers)
@anchor{library/numbers numbers Complex}@anchor{2644}
@deffn {Class} numbers.Complex

Subclasses of this type describe complex numbers and include the operations
that work on the built-in @ref{198,,complex} type. These are: conversions to
@code{complex} and @ref{3c1,,bool}, @ref{2ad9,,real}, @ref{2ada,,imag}, @code{+},
@code{-}, @code{*}, @code{/}, @code{**}, @ref{20d1,,abs()}, @ref{2adb,,conjugate()}, @code{==}, and
@code{!=}. All except @code{-} and @code{!=} are abstract.

@geindex real (numbers.Complex attribute)
@anchor{library/numbers numbers Complex real}@anchor{2ad9}
@deffn {Attribute} real

Abstract. Retrieves the real component of this number.
@end deffn

@geindex imag (numbers.Complex attribute)
@anchor{library/numbers numbers Complex imag}@anchor{2ada}
@deffn {Attribute} imag

Abstract. Retrieves the imaginary component of this number.
@end deffn

@geindex conjugate() (numbers.Complex method)
@anchor{library/numbers numbers Complex conjugate}@anchor{2adb}
@deffn {Method} abstractmethod conjugate ()

Abstract. Returns the complex conjugate. For example, @code{(1+3j).conjugate()
== (1-3j)}.
@end deffn
@end deffn

@geindex Real (class in numbers)
@anchor{library/numbers numbers Real}@anchor{263a}
@deffn {Class} numbers.Real

To @ref{2644,,Complex}, @code{Real} adds the operations that work on real
numbers.

In short, those are: a conversion to @ref{197,,float}, @ref{15cb,,math.trunc()},
@ref{14e6,,round()}, @ref{15c9,,math.floor()}, @ref{15ca,,math.ceil()}, @ref{b9f,,divmod()}, @code{//},
@code{%}, @code{<}, @code{<=}, @code{>}, and @code{>=}.

Real also provides defaults for @ref{198,,complex()}, @ref{2ad9,,real},
@ref{2ada,,imag}, and @ref{2adb,,conjugate()}.
@end deffn

@geindex Rational (class in numbers)
@anchor{library/numbers numbers Rational}@anchor{14ca}
@deffn {Class} numbers.Rational

Subtypes @ref{263a,,Real} and adds @ref{2adc,,numerator} and
@ref{2add,,denominator} properties. It also provides a default for
@ref{197,,float()}.

The @ref{2adc,,numerator} and @ref{2add,,denominator} values
should be instances of @ref{2451,,Integral} and should be in lowest terms with
@code{denominator} positive.

@geindex numerator (numbers.Rational attribute)
@anchor{library/numbers numbers Rational numerator}@anchor{2adc}
@deffn {Attribute} numerator

Abstract.  The numerator of this rational number.
@end deffn

@geindex denominator (numbers.Rational attribute)
@anchor{library/numbers numbers Rational denominator}@anchor{2add}
@deffn {Attribute} denominator

Abstract.  The denominator of this rational number.
@end deffn
@end deffn

@geindex Integral (class in numbers)
@anchor{library/numbers numbers Integral}@anchor{2451}
@deffn {Class} numbers.Integral

Subtypes @ref{14ca,,Rational} and adds a conversion to @ref{19c,,int}.  Provides
defaults for @ref{197,,float()}, @ref{2adc,,numerator}, and
@ref{2add,,denominator}.  Adds abstract methods for @ref{1a5,,pow()} with
modulus and bit-string operations: @code{<<}, @code{>>}, @code{&}, @code{^}, @code{|},
@code{~}.
@end deffn

@node Notes for type implementers,,The numeric tower,numbers — Numeric abstract base classes
@anchor{library/numbers notes-for-type-implementers}@anchor{2ade}
@subsubsection Notes for type implementers


Implementers should be careful to make equal numbers equal and hash
them to the same values. This may be subtle if there are two different
extensions of the real numbers. For example, @ref{215,,fractions.Fraction}
implements @ref{802,,hash()} as follows:

@example
def __hash__(self):
    if self.denominator == 1:
        # Get integers right.
        return hash(self.numerator)
    # Expensive check, but definitely correct.
    if self == float(self):
        return hash(float(self))
    else:
        # Use tuple's hash to avoid a high collision rate on
        # simple fractions.
        return hash((self.numerator, self.denominator))
@end example

@menu
* Adding More Numeric ABCs:: 
* Implementing the arithmetic operations:: 

@end menu

@node Adding More Numeric ABCs,Implementing the arithmetic operations,,Notes for type implementers
@anchor{library/numbers adding-more-numeric-abcs}@anchor{2adf}
@subsubsection Adding More Numeric ABCs


There are, of course, more possible ABCs for numbers, and this would
be a poor hierarchy if it precluded the possibility of adding
those. You can add @code{MyFoo} between @ref{2644,,Complex} and
@ref{263a,,Real} with:

@example
class MyFoo(Complex): ...
MyFoo.register(Real)
@end example

@node Implementing the arithmetic operations,,Adding More Numeric ABCs,Notes for type implementers
@anchor{library/numbers id1}@anchor{2ae0}@anchor{library/numbers implementing-the-arithmetic-operations}@anchor{2376}
@subsubsection Implementing the arithmetic operations


We want to implement the arithmetic operations so that mixed-mode
operations either call an implementation whose author knew about the
types of both arguments, or convert both to the nearest built in type
and do the operation there. For subtypes of @ref{2451,,Integral}, this
means that @ref{2424,,__add__()} and @ref{2425,,__radd__()} should be
defined as:

@example
class MyIntegral(Integral):

    def __add__(self, other):
        if isinstance(other, MyIntegral):
            return do_my_adding_stuff(self, other)
        elif isinstance(other, OtherTypeIKnowAbout):
            return do_my_other_adding_stuff(self, other)
        else:
            return NotImplemented

    def __radd__(self, other):
        if isinstance(other, MyIntegral):
            return do_my_adding_stuff(other, self)
        elif isinstance(other, OtherTypeIKnowAbout):
            return do_my_other_adding_stuff(other, self)
        elif isinstance(other, Integral):
            return int(other) + int(self)
        elif isinstance(other, Real):
            return float(other) + float(self)
        elif isinstance(other, Complex):
            return complex(other) + complex(self)
        else:
            return NotImplemented
@end example

There are 5 different cases for a mixed-type operation on subclasses
of @ref{2644,,Complex}. I’ll refer to all of the above code that doesn’t
refer to @code{MyIntegral} and @code{OtherTypeIKnowAbout} as
“boilerplate”. @code{a} will be an instance of @code{A}, which is a subtype
of @code{Complex} (@code{a : A <: Complex}), and @code{b : B <:
Complex}. I’ll consider @code{a + b}:


@enumerate 

@item 
If @code{A} defines an @ref{2424,,__add__()} which accepts @code{b}, all is
well.

@item 
If @code{A} falls back to the boilerplate code, and it were to
return a value from @ref{2424,,__add__()}, we’d miss the possibility
that @code{B} defines a more intelligent @ref{2425,,__radd__()}, so the
boilerplate should return @ref{1a3,,NotImplemented} from
@code{__add__()}. (Or @code{A} may not implement @code{__add__()} at
all.)

@item 
Then @code{B}’s @ref{2425,,__radd__()} gets a chance. If it accepts
@code{a}, all is well.

@item 
If it falls back to the boilerplate, there are no more possible
methods to try, so this is where the default implementation
should live.

@item 
If @code{B <: A}, Python tries @code{B.__radd__} before
@code{A.__add__}. This is ok, because it was implemented with
knowledge of @code{A}, so it can handle those instances before
delegating to @ref{2644,,Complex}.
@end enumerate

If @code{A <: Complex} and @code{B <: Real} without sharing any other knowledge,
then the appropriate shared operation is the one involving the built
in @ref{198,,complex}, and both @ref{2425,,__radd__()} s land there, so @code{a+b
== b+a}.

Because most of the operations on any given type will be very similar,
it can be useful to define a helper function which generates the
forward and reverse instances of any given operator. For example,
@ref{215,,fractions.Fraction} uses:

@example
def _operator_fallbacks(monomorphic_operator, fallback_operator):
    def forward(a, b):
        if isinstance(b, (int, Fraction)):
            return monomorphic_operator(a, b)
        elif isinstance(b, float):
            return fallback_operator(float(a), b)
        elif isinstance(b, complex):
            return fallback_operator(complex(a), b)
        else:
            return NotImplemented
    forward.__name__ = '__' + fallback_operator.__name__ + '__'
    forward.__doc__ = monomorphic_operator.__doc__

    def reverse(b, a):
        if isinstance(a, Rational):
            # Includes ints.
            return monomorphic_operator(a, b)
        elif isinstance(a, Real):
            return fallback_operator(float(a), float(b))
        elif isinstance(a, Complex):
            return fallback_operator(complex(a), complex(b))
        else:
            return NotImplemented
    reverse.__name__ = '__r' + fallback_operator.__name__ + '__'
    reverse.__doc__ = monomorphic_operator.__doc__

    return forward, reverse

def _add(a, b):
    """a + b"""
    return Fraction(a.numerator * b.denominator +
                    b.numerator * a.denominator,
                    a.denominator * b.denominator)

__add__, __radd__ = _operator_fallbacks(_add, operator.add)

# ...
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node math — Mathematical functions,cmath — Mathematical functions for complex numbers,numbers — Numeric abstract base classes,Numeric and Mathematical Modules
@anchor{library/math doc}@anchor{2ae1}@anchor{library/math math-mathematical-functions}@anchor{2ae2}@anchor{library/math module-math}@anchor{92}@anchor{library/math translation-repo}@anchor{2ae3}
@subsection @code{math} — Mathematical functions


@geindex module; math

@c from math import fsum


__________________________________________________________________


This module provides access to common mathematical functions and constants,
including those defined by the C standard.

These functions cannot be used with complex numbers; use the functions of the
same name from the @ref{19,,cmath} module if you require support for complex
numbers.  The distinction between functions which support complex numbers and
those which don’t is made since most users do not want to learn quite as much
mathematics as required to understand complex numbers.  Receiving an exception
instead of a complex result allows earlier detection of the unexpected complex
number used as a parameter, so that the programmer can determine how and why it
was generated in the first place.

The following functions are provided by this module.  Except when explicitly
noted otherwise, all return values are floats.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

`Number-theoretic functions'

@tab

@item

@ref{8e1,,comb(n@comma{} k)}

@tab

Number of ways to choose `k' items from `n' items without repetition and without order

@item

@ref{b47,,factorial(n)}

@tab

`n' factorial

@item

@ref{b12,,gcd(*integers)}

@tab

Greatest common divisor of the integer arguments

@item

@ref{bfe,,isqrt(n)}

@tab

Integer square root of a nonnegative integer `n'

@item

@ref{b13,,lcm(*integers)}

@tab

Least common multiple of the integer arguments

@item

@ref{8e2,,perm(n@comma{} k)}

@tab

Number of ways to choose `k' items from `n' items without repetition and with order

@item

`Floating point arithmetic'

@tab

@item

@ref{15ca,,ceil(x)}

@tab

Ceiling of `x', the smallest integer greater than or equal to `x'

@item

@ref{2ae4,,fabs(x)}

@tab

Absolute value of `x'

@item

@ref{15c9,,floor(x)}

@tab

Floor of `x', the largest integer less than or equal to `x'

@item

@ref{515,,fma(x@comma{} y@comma{} z)}

@tab

Fused multiply-add operation: @code{(x * y) + z}

@item

@ref{250f,,fmod(x@comma{} y)}

@tab

Remainder of division @code{x / y}

@item

@ref{2ae5,,modf(x)}

@tab

Fractional and integer parts of `x'

@item

@ref{d50,,remainder(x@comma{} y)}

@tab

Remainder of `x' with respect to `y'

@item

@ref{15cb,,trunc(x)}

@tab

Integer part of `x'

@item

`Floating point manipulation functions'

@tab

@item

@ref{15df,,copysign(x@comma{} y)}

@tab

Magnitude (absolute value) of `x' with the sign of `y'

@item

@ref{2ae6,,frexp(x)}

@tab

Mantissa and exponent of `x'

@item

@ref{fb6,,isclose(a@comma{} b@comma{} rel_tol@comma{} abs_tol)}

@tab

Check if the values `a' and `b' are close to each other

@item

@ref{13f7,,isfinite(x)}

@tab

Check if `x' is neither an infinity nor a NaN

@item

@ref{15dd,,isinf(x)}

@tab

Check if `x' is a positive or negative infinity

@item

@ref{15de,,isnan(x)}

@tab

Check if `x' is a NaN  (not a number)

@item

@ref{1889,,ldexp(x@comma{} i)}

@tab

@code{x * (2**i)}, inverse of function @ref{2ae6,,frexp()}

@item

@ref{6c1,,nextafter(x@comma{} y@comma{} steps)}

@tab

Floating-point value `steps' steps after `x' towards `y'

@item

@ref{b14,,ulp(x)}

@tab

Value of the least significant bit of `x'

@item

`Power, exponential and logarithmic functions'

@tab

@item

@ref{873,,cbrt(x)}

@tab

Cube root of `x'

@item

@ref{151f,,exp(x)}

@tab

`e' raised to the power `x'

@item

@ref{872,,exp2(x)}

@tab

`2' raised to the power `x'

@item

@ref{13f8,,expm1(x)}

@tab

`e' raised to the power `x', minus 1

@item

@ref{16cc,,log(x@comma{} base)}

@tab

Logarithm of `x' to the given base (`e' by default)

@item

@ref{15e4,,log1p(x)}

@tab

Natural logarithm of `1+x' (base `e')

@item

@ref{12e7,,log2(x)}

@tab

Base-2 logarithm of `x'

@item

@ref{198c,,log10(x)}

@tab

Base-10 logarithm of `x'

@item

@ref{874,,pow(x@comma{} y)}

@tab

`x' raised to the power `y'

@item

@ref{bff,,sqrt(x)}

@tab

Square root of `x'

@item

`Summation and product functions'

@tab

@item

@ref{bfb,,dist(p@comma{} q)}

@tab

Euclidean distance between two points `p' and `q' given as an iterable of coordinates

@item

@ref{15e0,,fsum(iterable)}

@tab

Sum of values in the input `iterable'

@item

@ref{bfc,,hypot(*coordinates)}

@tab

Euclidean norm of an iterable of coordinates

@item

@ref{bfd,,prod(iterable@comma{} start)}

@tab

Product of elements in the input `iterable' with a `start' value

@item

@ref{6c0,,sumprod(p@comma{} q)}

@tab

Sum of products from two iterables `p' and `q'

@item

`Angular conversion'

@tab

@item

@ref{2ae7,,degrees(x)}

@tab

Convert angle `x' from radians to degrees

@item

@ref{2ae8,,radians(x)}

@tab

Convert angle `x' from degrees to radians

@item

`Trigonometric functions'

@tab

@item

@ref{2ae9,,acos(x)}

@tab

Arc cosine of `x'

@item

@ref{2aea,,asin(x)}

@tab

Arc sine of `x'

@item

@ref{2aeb,,atan(x)}

@tab

Arc tangent of `x'

@item

@ref{2aec,,atan2(y@comma{} x)}

@tab

@code{atan(y / x)}

@item

@ref{16cb,,cos(x)}

@tab

Cosine of `x'

@item

@ref{16ca,,sin(x)}

@tab

Sine of `x'

@item

@ref{2aed,,tan(x)}

@tab

Tangent of `x'

@item

`Hyperbolic functions'

@tab

@item

@ref{15e1,,acosh(x)}

@tab

Inverse hyperbolic cosine of `x'

@item

@ref{15e2,,asinh(x)}

@tab

Inverse hyperbolic sine of `x'

@item

@ref{15e3,,atanh(x)}

@tab

Inverse hyperbolic tangent of `x'

@item

@ref{2aee,,cosh(x)}

@tab

Hyperbolic cosine of `x'

@item

@ref{2aef,,sinh(x)}

@tab

Hyperbolic sine of `x'

@item

@ref{2af0,,tanh(x)}

@tab

Hyperbolic tangent of `x'

@item

`Special functions'

@tab

@item

@ref{dd9,,erf(x)}

@tab

Error function@footnote{https://en.wikipedia.org/wiki/Error_function} at `x'

@item

@ref{dda,,erfc(x)}

@tab

Complementary error function@footnote{https://en.wikipedia.org/wiki/Error_function} at `x'

@item

@ref{13f9,,gamma(x)}

@tab

Gamma function@footnote{https://en.wikipedia.org/wiki/Gamma_function} at `x'

@item

@ref{13fa,,lgamma(x)}

@tab

Natural logarithm of the absolute value of the Gamma function@footnote{https://en.wikipedia.org/wiki/Gamma_function} at `x'

@item

`Constants'

@tab

@item

@ref{2af1,,pi}

@tab

`π' = 3.141592…

@item

@ref{2af2,,e}

@tab

`e' = 2.718281…

@item

@ref{2af3,,tau}

@tab

`τ' = 2`π' = 6.283185…

@item

@ref{e86,,inf}

@tab

Positive infinity

@item

@ref{875,,nan}

@tab

“Not a number” (NaN)

@end multitable


@menu
* Number-theoretic functions:: 
* Floating point arithmetic:: 
* Floating point manipulation functions:: 
* Power@comma{} exponential and logarithmic functions: Power exponential and logarithmic functions. 
* Summation and product functions:: 
* Angular conversion:: 
* Trigonometric functions:: 
* Hyperbolic functions:: 
* Special functions:: 
* Constants: Constants<2>. 

@end menu

@node Number-theoretic functions,Floating point arithmetic,,math — Mathematical functions
@anchor{library/math number-theoretic-functions}@anchor{2af4}
@subsubsection Number-theoretic functions


@geindex comb() (in module math)
@anchor{library/math math comb}@anchor{8e1}
@deffn {Function} math.comb (n, k)

Return the number of ways to choose `k' items from `n' items without repetition
and without order.

Evaluates to @code{n! / (k! * (n - k)!)} when @code{k <= n} and evaluates
to zero when @code{k > n}.

Also called the binomial coefficient because it is equivalent
to the coefficient of k-th term in polynomial expansion of
@code{(1 + x)ⁿ}.

Raises @ref{199,,TypeError} if either of the arguments are not integers.
Raises @ref{2ee,,ValueError} if either of the arguments are negative.


Added in version 3.8.

@end deffn

@geindex factorial() (in module math)
@anchor{library/math math factorial}@anchor{b47}
@deffn {Function} math.factorial (n)

Return factorial of the nonnegative integer `n'.


Changed in version 3.10: Floats with integral values (like @code{5.0}) are no longer accepted.

@end deffn

@geindex gcd() (in module math)
@anchor{library/math math gcd}@anchor{b12}
@deffn {Function} math.gcd (*integers)

Return the greatest common divisor of the specified integer arguments.
If any of the arguments is nonzero, then the returned value is the largest
positive integer that is a divisor of all arguments.  If all arguments
are zero, then the returned value is @code{0}.  @code{gcd()} without arguments
returns @code{0}.


Added in version 3.5.



Changed in version 3.9: Added support for an arbitrary number of arguments. Formerly, only two
arguments were supported.

@end deffn

@geindex isqrt() (in module math)
@anchor{library/math math isqrt}@anchor{bfe}
@deffn {Function} math.isqrt (n)

Return the integer square root of the nonnegative integer `n'. This is the
floor of the exact square root of `n', or equivalently the greatest integer
`a' such that `a'² ≤ `n'.

For some applications, it may be more convenient to have the least integer
`a' such that `n' ≤ `a'², or in other words the ceiling of
the exact square root of `n'. For positive `n', this can be computed using
@code{a = 1 + isqrt(n - 1)}.


Added in version 3.8.

@end deffn

@geindex lcm() (in module math)
@anchor{library/math math lcm}@anchor{b13}
@deffn {Function} math.lcm (*integers)

Return the least common multiple of the specified integer arguments.
If all arguments are nonzero, then the returned value is the smallest
positive integer that is a multiple of all arguments.  If any of the arguments
is zero, then the returned value is @code{0}.  @code{lcm()} without arguments
returns @code{1}.


Added in version 3.9.

@end deffn

@geindex perm() (in module math)
@anchor{library/math math perm}@anchor{8e2}
@deffn {Function} math.perm (n, k=None)

Return the number of ways to choose `k' items from `n' items
without repetition and with order.

Evaluates to @code{n! / (n - k)!} when @code{k <= n} and evaluates
to zero when @code{k > n}.

If `k' is not specified or is @code{None}, then `k' defaults to `n'
and the function returns @code{n!}.

Raises @ref{199,,TypeError} if either of the arguments are not integers.
Raises @ref{2ee,,ValueError} if either of the arguments are negative.


Added in version 3.8.

@end deffn

@node Floating point arithmetic,Floating point manipulation functions,Number-theoretic functions,math — Mathematical functions
@anchor{library/math floating-point-arithmetic}@anchor{2af5}
@subsubsection Floating point arithmetic


@geindex ceil() (in module math)
@anchor{library/math math ceil}@anchor{15ca}
@deffn {Function} math.ceil (x)

Return the ceiling of `x', the smallest integer greater than or equal to `x'.
If `x' is not a float, delegates to @ref{2450,,x.__ceil__},
which should return an @ref{2451,,Integral} value.
@end deffn

@geindex fabs() (in module math)
@anchor{library/math math fabs}@anchor{2ae4}
@deffn {Function} math.fabs (x)

Return the absolute value of `x'.
@end deffn

@geindex floor() (in module math)
@anchor{library/math math floor}@anchor{15c9}
@deffn {Function} math.floor (x)

Return the floor of `x', the largest integer less than or equal to `x'.  If
`x' is not a float, delegates to @ref{244f,,x.__floor__}, which
should return an @ref{2451,,Integral} value.
@end deffn

@geindex fma() (in module math)
@anchor{library/math math fma}@anchor{515}
@deffn {Function} math.fma (x, y, z)

Fused multiply-add operation. Return @code{(x * y) + z}, computed as though with
infinite precision and range followed by a single round to the @code{float}
format. This operation often provides better accuracy than the direct
expression @code{(x * y) + z}.

This function follows the specification of the fusedMultiplyAdd operation
described in the IEEE 754 standard. The standard leaves one case
implementation-defined, namely the result of @code{fma(0, inf, nan)}
and @code{fma(inf, 0, nan)}. In these cases, @code{math.fma} returns a NaN,
and does not raise any exception.


Added in version 3.13.

@end deffn

@geindex fmod() (in module math)
@anchor{library/math math fmod}@anchor{250f}
@deffn {Function} math.fmod (x, y)

Return the floating-point remainder of @code{x / y},
as defined by the platform C library function @code{fmod(x, y)}. Note that the
Python expression @code{x % y} may not return the same result.  The intent of the C
standard is that @code{fmod(x, y)} be exactly (mathematically; to infinite
precision) equal to @code{x - n*y} for some integer `n' such that the result has
the same sign as `x' and magnitude less than @code{abs(y)}.  Python’s @code{x % y}
returns a result with the sign of `y' instead, and may not be exactly computable
for float arguments. For example, @code{fmod(-1e-100, 1e100)} is @code{-1e-100}, but
the result of Python’s @code{-1e-100 % 1e100} is @code{1e100-1e-100}, which cannot be
represented exactly as a float, and rounds to the surprising @code{1e100}.  For
this reason, function @code{fmod()} is generally preferred when working with
floats, while Python’s @code{x % y} is preferred when working with integers.
@end deffn

@geindex modf() (in module math)
@anchor{library/math math modf}@anchor{2ae5}
@deffn {Function} math.modf (x)

Return the fractional and integer parts of `x'.  Both results carry the sign
of `x' and are floats.

Note that @code{modf()} has a different call/return pattern
than its C equivalents: it takes a single argument and return a pair of
values, rather than returning its second return value through an ‘output
parameter’ (there is no such thing in Python).
@end deffn

@geindex remainder() (in module math)
@anchor{library/math math remainder}@anchor{d50}
@deffn {Function} math.remainder (x, y)

Return the IEEE 754-style remainder of `x' with respect to `y'.  For
finite `x' and finite nonzero `y', this is the difference @code{x - n*y},
where @code{n} is the closest integer to the exact value of the quotient @code{x /
y}.  If @code{x / y} is exactly halfway between two consecutive integers, the
nearest `even' integer is used for @code{n}.  The remainder @code{r = remainder(x,
y)} thus always satisfies @code{abs(r) <= 0.5 * abs(y)}.

Special cases follow IEEE 754: in particular, @code{remainder(x, math.inf)} is
`x' for any finite `x', and @code{remainder(x, 0)} and
@code{remainder(math.inf, x)} raise @ref{2ee,,ValueError} for any non-NaN `x'.
If the result of the remainder operation is zero, that zero will have
the same sign as `x'.

On platforms using IEEE 754 binary floating point, the result of this
operation is always exactly representable: no rounding error is introduced.


Added in version 3.7.

@end deffn

@geindex trunc() (in module math)
@anchor{library/math math trunc}@anchor{15cb}
@deffn {Function} math.trunc (x)

Return `x' with the fractional part
removed, leaving the integer part.  This rounds toward 0: @code{trunc()} is
equivalent to @ref{15c9,,floor()} for positive `x', and equivalent to @ref{15ca,,ceil()}
for negative `x'. If `x' is not a float, delegates to @ref{19d,,x.__trunc__}, which should return an @ref{2451,,Integral} value.
@end deffn

For the @ref{15ca,,ceil()}, @ref{15c9,,floor()}, and @ref{2ae5,,modf()} functions, note that `all'
floating-point numbers of sufficiently large magnitude are exact integers.
Python floats typically carry no more than 53 bits of precision (the same as the
platform C double type), in which case any float `x' with @code{abs(x) >= 2**52}
necessarily has no fractional bits.

@node Floating point manipulation functions,Power exponential and logarithmic functions,Floating point arithmetic,math — Mathematical functions
@anchor{library/math floating-point-manipulation-functions}@anchor{2af6}
@subsubsection Floating point manipulation functions


@geindex copysign() (in module math)
@anchor{library/math math copysign}@anchor{15df}
@deffn {Function} math.copysign (x, y)

Return a float with the magnitude (absolute value) of `x' but the sign of
`y'.  On platforms that support signed zeros, @code{copysign(1.0, -0.0)}
returns `-1.0'.
@end deffn

@geindex frexp() (in module math)
@anchor{library/math math frexp}@anchor{2ae6}
@deffn {Function} math.frexp (x)

Return the mantissa and exponent of `x' as the pair @code{(m, e)}.
If `x' is a finite nonzero number, then `m' is a float with
@code{0.5 <= abs(m) < 1.0} and an integer `e' is such that
@code{x == m * 2**e} exactly.  Else, return @code{(x, 0)}.
This is used to “pick apart” the internal representation of
a float in a portable way.

Note that @code{frexp()} has a different call/return pattern
than its C equivalents: it takes a single argument and return a pair of
values, rather than returning its second return value through an ‘output
parameter’ (there is no such thing in Python).
@end deffn

@geindex isclose() (in module math)
@anchor{library/math math isclose}@anchor{fb6}
@deffn {Function} math.isclose (a, b, *, rel_tol=1e-09, abs_tol=0.0)

Return @code{True} if the values `a' and `b' are close to each other and
@code{False} otherwise.

Whether or not two values are considered close is determined according to
given absolute and relative tolerances.  If no errors occur, the result will
be: @code{abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)}.

`rel_tol' is the relative tolerance – it is the maximum allowed difference
between `a' and `b', relative to the larger absolute value of `a' or `b'.
For example, to set a tolerance of 5%, pass @code{rel_tol=0.05}.  The default
tolerance is @code{1e-09}, which assures that the two values are the same
within about 9 decimal digits.  `rel_tol' must be nonnegative and less
than @code{1.0}.

`abs_tol' is the absolute tolerance; it defaults to @code{0.0} and it must be
nonnegative.  When comparing @code{x} to @code{0.0}, @code{isclose(x, 0)} is computed
as @code{abs(x) <= rel_tol  * abs(x)}, which is @code{False} for any nonzero @code{x} and
`rel_tol' less than @code{1.0}.  So add an appropriate positive `abs_tol' argument
to the call.

The IEEE 754 special values of @code{NaN}, @code{inf}, and @code{-inf} will be
handled according to IEEE rules.  Specifically, @code{NaN} is not considered
close to any other value, including @code{NaN}.  @code{inf} and @code{-inf} are only
considered close to themselves.


Added in version 3.5.



@subsubheading See also


@geindex Python Enhancement Proposals; PEP 485
PEP 485@footnote{https://peps.python.org/pep-0485/} – A function for testing approximate equality

@end deffn

@geindex isfinite() (in module math)
@anchor{library/math math isfinite}@anchor{13f7}
@deffn {Function} math.isfinite (x)

Return @code{True} if `x' is neither an infinity nor a NaN, and
@code{False} otherwise.  (Note that @code{0.0} `is' considered finite.)


Added in version 3.2.

@end deffn

@geindex isinf() (in module math)
@anchor{library/math math isinf}@anchor{15dd}
@deffn {Function} math.isinf (x)

Return @code{True} if `x' is a positive or negative infinity, and
@code{False} otherwise.
@end deffn

@geindex isnan() (in module math)
@anchor{library/math math isnan}@anchor{15de}
@deffn {Function} math.isnan (x)

Return @code{True} if `x' is a NaN (not a number), and @code{False} otherwise.
@end deffn

@geindex ldexp() (in module math)
@anchor{library/math math ldexp}@anchor{1889}
@deffn {Function} math.ldexp (x, i)

Return @code{x * (2**i)}.  This is essentially the inverse of function
@ref{2ae6,,frexp()}.
@end deffn

@geindex nextafter() (in module math)
@anchor{library/math math nextafter}@anchor{6c1}
@deffn {Function} math.nextafter (x, y, steps=1)

Return the floating-point value `steps' steps after `x' towards `y'.

If `x' is equal to `y', return `y', unless `steps' is zero.

Examples:


@itemize *

@item 
@code{math.nextafter(x, math.inf)} goes up: towards positive infinity.

@item 
@code{math.nextafter(x, -math.inf)} goes down: towards minus infinity.

@item 
@code{math.nextafter(x, 0.0)} goes towards zero.

@item 
@code{math.nextafter(x, math.copysign(math.inf, x))} goes away from zero.
@end itemize

See also @ref{b14,,math.ulp()}.


Added in version 3.9.



Changed in version 3.12: Added the `steps' argument.

@end deffn

@geindex ulp() (in module math)
@anchor{library/math math ulp}@anchor{b14}
@deffn {Function} math.ulp (x)

Return the value of the least significant bit of the float `x':


@itemize *

@item 
If `x' is a NaN (not a number), return `x'.

@item 
If `x' is negative, return @code{ulp(-x)}.

@item 
If `x' is a positive infinity, return `x'.

@item 
If `x' is equal to zero, return the smallest positive
`denormalized' representable float (smaller than the minimum positive
`normalized' float, @ref{1e11,,sys.float_info.min}).

@item 
If `x' is equal to the largest positive representable float,
return the value of the least significant bit of `x', such that the first
float smaller than `x' is @code{x - ulp(x)}.

@item 
Otherwise (`x' is a positive finite number), return the value of the least
significant bit of `x', such that the first float bigger than `x'
is @code{x + ulp(x)}.
@end itemize

ULP stands for “Unit in the Last Place”.

See also @ref{6c1,,math.nextafter()} and @ref{1e11,,sys.float_info.epsilon}.


Added in version 3.9.

@end deffn

@node Power exponential and logarithmic functions,Summation and product functions,Floating point manipulation functions,math — Mathematical functions
@anchor{library/math power-exponential-and-logarithmic-functions}@anchor{2af7}
@subsubsection Power, exponential and logarithmic functions


@geindex cbrt() (in module math)
@anchor{library/math math cbrt}@anchor{873}
@deffn {Function} math.cbrt (x)

Return the cube root of `x'.


Added in version 3.11.

@end deffn

@geindex exp() (in module math)
@anchor{library/math math exp}@anchor{151f}
@deffn {Function} math.exp (x)

Return `e' raised to the power `x', where `e' = 2.718281… is the base
of natural logarithms.  This is usually more accurate than @code{math.e ** x}
or @code{pow(math.e, x)}.
@end deffn

@geindex exp2() (in module math)
@anchor{library/math math exp2}@anchor{872}
@deffn {Function} math.exp2 (x)

Return `2' raised to the power `x'.


Added in version 3.11.

@end deffn

@geindex expm1() (in module math)
@anchor{library/math math expm1}@anchor{13f8}
@deffn {Function} math.expm1 (x)

Return `e' raised to the power `x', minus 1.  Here `e' is the base of natural
logarithms.  For small floats `x', the subtraction in @code{exp(x) - 1}
can result in a significant loss of precision@footnote{https://en.wikipedia.org/wiki/Loss_of_significance}; the @code{expm1()}
function provides a way to compute this quantity to full precision:

@example
>>> from math import exp, expm1
>>> exp(1e-5) - 1  # gives result accurate to 11 places
1.0000050000069649e-05
>>> expm1(1e-5)    # result accurate to full precision
1.0000050000166668e-05
@end example


Added in version 3.2.

@end deffn

@geindex log() (in module math)
@anchor{library/math math log}@anchor{16cc}
@deffn {Function} math.log (x[, base])

With one argument, return the natural logarithm of `x' (to base `e').

With two arguments, return the logarithm of `x' to the given `base',
calculated as @code{log(x)/log(base)}.
@end deffn

@geindex log1p() (in module math)
@anchor{library/math math log1p}@anchor{15e4}
@deffn {Function} math.log1p (x)

Return the natural logarithm of `1+x' (base `e'). The
result is calculated in a way which is accurate for `x' near zero.
@end deffn

@geindex log2() (in module math)
@anchor{library/math math log2}@anchor{12e7}
@deffn {Function} math.log2 (x)

Return the base-2 logarithm of `x'. This is usually more accurate than
@code{log(x, 2)}.


Added in version 3.3.



@subsubheading See also


@ref{263e,,int.bit_length()} returns the number of bits necessary to represent
an integer in binary, excluding the sign and leading zeros.

@end deffn

@geindex log10() (in module math)
@anchor{library/math math log10}@anchor{198c}
@deffn {Function} math.log10 (x)

Return the base-10 logarithm of `x'.  This is usually more accurate
than @code{log(x, 10)}.
@end deffn

@geindex pow() (in module math)
@anchor{library/math math pow}@anchor{874}
@deffn {Function} math.pow (x, y)

Return `x' raised to the power `y'.  Exceptional cases follow
the IEEE 754 standard as far as possible.  In particular,
@code{pow(1.0, x)} and @code{pow(x, 0.0)} always return @code{1.0}, even
when `x' is a zero or a NaN.  If both `x' and `y' are finite,
`x' is negative, and `y' is not an integer then @code{pow(x, y)}
is undefined, and raises @ref{2ee,,ValueError}.

Unlike the built-in @code{**} operator, @code{math.pow()} converts both
its arguments to type @ref{197,,float}.  Use @code{**} or the built-in
@code{pow()} function for computing exact integer powers.


Changed in version 3.11: The special cases @code{pow(0.0, -inf)} and @code{pow(-0.0, -inf)} were
changed to return @code{inf} instead of raising @ref{2ee,,ValueError},
for consistency with IEEE 754.

@end deffn

@geindex sqrt() (in module math)
@anchor{library/math math sqrt}@anchor{bff}
@deffn {Function} math.sqrt (x)

Return the square root of `x'.
@end deffn

@node Summation and product functions,Angular conversion,Power exponential and logarithmic functions,math — Mathematical functions
@anchor{library/math summation-and-product-functions}@anchor{2af8}
@subsubsection Summation and product functions


@geindex dist() (in module math)
@anchor{library/math math dist}@anchor{bfb}
@deffn {Function} math.dist (p, q)

Return the Euclidean distance between two points `p' and `q', each
given as a sequence (or iterable) of coordinates.  The two points
must have the same dimension.

Roughly equivalent to:

@example
sqrt(sum((px - qx) ** 2.0 for px, qx in zip(p, q)))
@end example


Added in version 3.8.

@end deffn

@geindex fsum() (in module math)
@anchor{library/math math fsum}@anchor{15e0}
@deffn {Function} math.fsum (iterable)

Return an accurate floating-point sum of values in the iterable.  Avoids
loss of precision by tracking multiple intermediate partial sums.

The algorithm’s accuracy depends on IEEE-754 arithmetic guarantees and the
typical case where the rounding mode is half-even.  On some non-Windows
builds, the underlying C library uses extended precision addition and may
occasionally double-round an intermediate sum causing it to be off in its
least significant bit.

For further discussion and two alternative approaches, see the ASPN cookbook recipes for accurate floating-point summation@footnote{https://code.activestate.com/recipes/393090-binary-floating-point-summation-accurate-to-full-p/}.
@end deffn

@geindex hypot() (in module math)
@anchor{library/math math hypot}@anchor{bfc}
@deffn {Function} math.hypot (*coordinates)

Return the Euclidean norm, @code{sqrt(sum(x**2 for x in coordinates))}.
This is the length of the vector from the origin to the point
given by the coordinates.

For a two dimensional point @code{(x, y)}, this is equivalent to computing
the hypotenuse of a right triangle using the Pythagorean theorem,
@code{sqrt(x*x + y*y)}.


Changed in version 3.8: Added support for n-dimensional points. Formerly, only the two
dimensional case was supported.



Changed in version 3.10: Improved the algorithm’s accuracy so that the maximum error is
under 1 ulp (unit in the last place).  More typically, the result
is almost always correctly rounded to within 1/2 ulp.

@end deffn

@geindex prod() (in module math)
@anchor{library/math math prod}@anchor{bfd}
@deffn {Function} math.prod (iterable, *, start=1)

Calculate the product of all the elements in the input `iterable'.
The default `start' value for the product is @code{1}.

When the iterable is empty, return the start value.  This function is
intended specifically for use with numeric values and may reject
non-numeric types.


Added in version 3.8.

@end deffn

@geindex sumprod() (in module math)
@anchor{library/math math sumprod}@anchor{6c0}
@deffn {Function} math.sumprod (p, q)

Return the sum of products of values from two iterables `p' and `q'.

Raises @ref{2ee,,ValueError} if the inputs do not have the same length.

Roughly equivalent to:

@example
sum(map(operator.mul, p, q, strict=True))
@end example

For float and mixed int/float inputs, the intermediate products
and sums are computed with extended precision.


Added in version 3.12.

@end deffn

@node Angular conversion,Trigonometric functions,Summation and product functions,math — Mathematical functions
@anchor{library/math angular-conversion}@anchor{2af9}
@subsubsection Angular conversion


@geindex degrees() (in module math)
@anchor{library/math math degrees}@anchor{2ae7}
@deffn {Function} math.degrees (x)

Convert angle `x' from radians to degrees.
@end deffn

@geindex radians() (in module math)
@anchor{library/math math radians}@anchor{2ae8}
@deffn {Function} math.radians (x)

Convert angle `x' from degrees to radians.
@end deffn

@node Trigonometric functions,Hyperbolic functions,Angular conversion,math — Mathematical functions
@anchor{library/math trigonometric-functions}@anchor{2afa}
@subsubsection Trigonometric functions


@geindex acos() (in module math)
@anchor{library/math math acos}@anchor{2ae9}
@deffn {Function} math.acos (x)

Return the arc cosine of `x', in radians. The result is between @code{0} and
@code{pi}.
@end deffn

@geindex asin() (in module math)
@anchor{library/math math asin}@anchor{2aea}
@deffn {Function} math.asin (x)

Return the arc sine of `x', in radians. The result is between @code{-pi/2} and
@code{pi/2}.
@end deffn

@geindex atan() (in module math)
@anchor{library/math math atan}@anchor{2aeb}
@deffn {Function} math.atan (x)

Return the arc tangent of `x', in radians. The result is between @code{-pi/2} and
@code{pi/2}.
@end deffn

@geindex atan2() (in module math)
@anchor{library/math math atan2}@anchor{2aec}
@deffn {Function} math.atan2 (y, x)

Return @code{atan(y / x)}, in radians. The result is between @code{-pi} and @code{pi}.
The vector in the plane from the origin to point @code{(x, y)} makes this angle
with the positive X axis. The point of @code{atan2()} is that the signs of both
inputs are known to it, so it can compute the correct quadrant for the angle.
For example, @code{atan(1)} and @code{atan2(1, 1)} are both @code{pi/4}, but @code{atan2(-1,
-1)} is @code{-3*pi/4}.
@end deffn

@geindex cos() (in module math)
@anchor{library/math math cos}@anchor{16cb}
@deffn {Function} math.cos (x)

Return the cosine of `x' radians.
@end deffn

@geindex sin() (in module math)
@anchor{library/math math sin}@anchor{16ca}
@deffn {Function} math.sin (x)

Return the sine of `x' radians.
@end deffn

@geindex tan() (in module math)
@anchor{library/math math tan}@anchor{2aed}
@deffn {Function} math.tan (x)

Return the tangent of `x' radians.
@end deffn

@node Hyperbolic functions,Special functions,Trigonometric functions,math — Mathematical functions
@anchor{library/math hyperbolic-functions}@anchor{2afb}
@subsubsection Hyperbolic functions


Hyperbolic functions@footnote{https://en.wikipedia.org/wiki/Hyperbolic_functions}
are analogs of trigonometric functions that are based on hyperbolas
instead of circles.

@geindex acosh() (in module math)
@anchor{library/math math acosh}@anchor{15e1}
@deffn {Function} math.acosh (x)

Return the inverse hyperbolic cosine of `x'.
@end deffn

@geindex asinh() (in module math)
@anchor{library/math math asinh}@anchor{15e2}
@deffn {Function} math.asinh (x)

Return the inverse hyperbolic sine of `x'.
@end deffn

@geindex atanh() (in module math)
@anchor{library/math math atanh}@anchor{15e3}
@deffn {Function} math.atanh (x)

Return the inverse hyperbolic tangent of `x'.
@end deffn

@geindex cosh() (in module math)
@anchor{library/math math cosh}@anchor{2aee}
@deffn {Function} math.cosh (x)

Return the hyperbolic cosine of `x'.
@end deffn

@geindex sinh() (in module math)
@anchor{library/math math sinh}@anchor{2aef}
@deffn {Function} math.sinh (x)

Return the hyperbolic sine of `x'.
@end deffn

@geindex tanh() (in module math)
@anchor{library/math math tanh}@anchor{2af0}
@deffn {Function} math.tanh (x)

Return the hyperbolic tangent of `x'.
@end deffn

@node Special functions,Constants<2>,Hyperbolic functions,math — Mathematical functions
@anchor{library/math special-functions}@anchor{2afc}
@subsubsection Special functions


@geindex erf() (in module math)
@anchor{library/math math erf}@anchor{dd9}
@deffn {Function} math.erf (x)

Return the error function@footnote{https://en.wikipedia.org/wiki/Error_function} at
`x'.

The @code{erf()} function can be used to compute traditional statistical
functions such as the cumulative standard normal distribution@footnote{https://en.wikipedia.org/wiki/Cumulative_distribution_function}:

@example
def phi(x):
    'Cumulative distribution function for the standard normal distribution'
    return (1.0 + erf(x / sqrt(2.0))) / 2.0
@end example


Added in version 3.2.

@end deffn

@geindex erfc() (in module math)
@anchor{library/math math erfc}@anchor{dda}
@deffn {Function} math.erfc (x)

Return the complementary error function at `x'.  The complementary error function@footnote{https://en.wikipedia.org/wiki/Error_function} is defined as
@code{1.0 - erf(x)}.  It is used for large values of `x' where a subtraction
from one would cause a loss of significance@footnote{https://en.wikipedia.org/wiki/Loss_of_significance}.


Added in version 3.2.

@end deffn

@geindex gamma() (in module math)
@anchor{library/math math gamma}@anchor{13f9}
@deffn {Function} math.gamma (x)

Return the Gamma function@footnote{https://en.wikipedia.org/wiki/Gamma_function} at
`x'.


Added in version 3.2.

@end deffn

@geindex lgamma() (in module math)
@anchor{library/math math lgamma}@anchor{13fa}
@deffn {Function} math.lgamma (x)

Return the natural logarithm of the absolute value of the Gamma
function at `x'.


Added in version 3.2.

@end deffn

@node Constants<2>,,Special functions,math — Mathematical functions
@anchor{library/math constants}@anchor{2afd}
@subsubsection Constants


@geindex pi (in module math)
@anchor{library/math math pi}@anchor{2af1}
@deffn {Data} math.pi

The mathematical constant `π' = 3.141592…, to available precision.
@end deffn

@geindex e (in module math)
@anchor{library/math math e}@anchor{2af2}
@deffn {Data} math.e

The mathematical constant `e' = 2.718281…, to available precision.
@end deffn

@geindex tau (in module math)
@anchor{library/math math tau}@anchor{2af3}
@deffn {Data} math.tau

The mathematical constant `τ' = 6.283185…, to available precision.
Tau is a circle constant equal to 2`π', the ratio of a circle’s circumference to
its radius. To learn more about Tau, check out Vi Hart’s video Pi is (still) Wrong@footnote{https://vimeo.com/147792667}, and start celebrating
Tau day@footnote{https://tauday.com/} by eating twice as much pie!


Added in version 3.6.

@end deffn

@geindex inf (in module math)
@anchor{library/math math inf}@anchor{e86}
@deffn {Data} math.inf

A floating-point positive infinity.  (For negative infinity, use
@code{-math.inf}.)  Equivalent to the output of @code{float('inf')}.


Added in version 3.5.

@end deffn

@geindex nan (in module math)
@anchor{library/math math nan}@anchor{875}
@deffn {Data} math.nan

A floating-point “not a number” (NaN) value. Equivalent to the output of
@code{float('nan')}. Due to the requirements of the IEEE-754 standard@footnote{https://en.wikipedia.org/wiki/IEEE_754}, @code{math.nan} and @code{float('nan')} are
not considered to equal to any other numeric value, including themselves. To check
whether a number is a NaN, use the @ref{15de,,isnan()} function to test
for NaNs instead of @code{is} or @code{==}.
Example:

@example
>>> import math
>>> math.nan == math.nan
False
>>> float('nan') == float('nan')
False
>>> math.isnan(math.nan)
True
>>> math.isnan(float('nan'))
True
@end example


Added in version 3.5.



Changed in version 3.11: It is now always available.

@end deffn

`CPython implementation detail:' The @code{math} module consists mostly of thin wrappers around the platform C
math library functions.  Behavior in exceptional cases follows Annex F of
the C99 standard where appropriate.  The current implementation will raise
@ref{2ee,,ValueError} for invalid operations like @code{sqrt(-1.0)} or @code{log(0.0)}
(where C99 Annex F recommends signaling invalid operation or divide-by-zero),
and @ref{a87,,OverflowError} for results that overflow (for example,
@code{exp(1000.0)}).  A NaN will not be returned from any of the functions
above unless one or more of the input arguments was a NaN; in that case,
most functions will return a NaN, but (again following C99 Annex F) there
are some exceptions to this rule, for example @code{pow(float('nan'), 0.0)} or
@code{hypot(float('nan'), float('inf'))}.

Note that Python makes no effort to distinguish signaling NaNs from
quiet NaNs, and behavior for signaling NaNs remains unspecified.
Typical behavior is to treat all NaNs as though they were quiet.


@subsubheading See also



@table @asis

@item Module @ref{19,,cmath}

Complex number versions of many of these functions.
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node cmath — Mathematical functions for complex numbers,decimal — Decimal fixed-point and floating-point arithmetic,math — Mathematical functions,Numeric and Mathematical Modules
@anchor{library/cmath doc}@anchor{2afe}@anchor{library/cmath cmath-mathematical-functions-for-complex-numbers}@anchor{2aff}@anchor{library/cmath module-cmath}@anchor{19}@anchor{library/cmath translation-repo}@anchor{2b00}
@subsection @code{cmath} — Mathematical functions for complex numbers


@geindex module; cmath


__________________________________________________________________


This module provides access to mathematical functions for complex numbers.  The
functions in this module accept integers, floating-point numbers or complex
numbers as arguments. They will also accept any Python object that has either a
@ref{7fe,,__complex__()} or a @ref{bc7,,__float__()} method: these methods are used to
convert the object to a complex or floating-point number, respectively, and
the function is then applied to the result of the conversion.

@cartouche
@quotation Note 
For functions involving branch cuts, we have the problem of deciding how to
define those functions on the cut itself. Following Kahan’s “Branch cuts for
complex elementary functions” paper, as well as Annex G of C99 and later C
standards, we use the sign of zero to distinguish one side of the branch cut
from the other: for a branch cut along (a portion of) the real axis we look
at the sign of the imaginary part, while for a branch cut along the
imaginary axis we look at the sign of the real part.

For example, the @ref{2b01,,cmath.sqrt()} function has a branch cut along the
negative real axis. An argument of @code{-2-0j} is treated as
though it lies `below' the branch cut, and so gives a result on the negative
imaginary axis:

@example
>>> cmath.sqrt(-2-0j)
-1.4142135623730951j
@end example

But an argument of @code{-2+0j} is treated as though it lies above
the branch cut:

@example
>>> cmath.sqrt(-2+0j)
1.4142135623730951j
@end example
@end quotation
@end cartouche


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

`Conversions to and from polar coordinates'

@tab

@item

@ref{2b02,,phase(z)}

@tab

Return the phase of `z'

@item

@ref{2b03,,polar(z)}

@tab

Return the representation of `z' in polar coordinates

@item

@ref{2b04,,rect(r@comma{} phi)}

@tab

Return the complex number `z' with polar coordinates `r' and `phi'

@item

`Power and logarithmic functions'

@tab

@item

@ref{2b05,,exp(z)}

@tab

Return `e' raised to the power `z'

@item

@ref{2b06,,log(z[@comma{} base])}

@tab

Return the logarithm of `z' to the given `base' (`e' by default)

@item

@ref{2b07,,log10(z)}

@tab

Return the base-10 logarithm of `z'

@item

@ref{2b01,,sqrt(z)}

@tab

Return the square root of `z'

@item

`Trigonometric functions'

@tab

@item

@ref{2b08,,acos(z)}

@tab

Return the arc cosine of `z'

@item

@ref{2b09,,asin(z)}

@tab

Return the arc sine of `z'

@item

@ref{2b0a,,atan(z)}

@tab

Return the arc tangent of `z'

@item

@ref{2b0b,,cos(z)}

@tab

Return the cosine of `z'

@item

@ref{2b0c,,sin(z)}

@tab

Return the sine of `z'

@item

@ref{2b0d,,tan(z)}

@tab

Return the tangent of `z'

@item

`Hyperbolic functions'

@tab

@item

@ref{2b0e,,acosh(z)}

@tab

Return the inverse hyperbolic cosine of `z'

@item

@ref{2b0f,,asinh(z)}

@tab

Return the inverse hyperbolic sine of `z'

@item

@ref{2b10,,atanh(z)}

@tab

Return the inverse hyperbolic tangent of `z'

@item

@ref{2b11,,cosh(z)}

@tab

Return the hyperbolic cosine of `z'

@item

@ref{2b12,,sinh(z)}

@tab

Return the hyperbolic sine of `z'

@item

@ref{2b13,,tanh(z)}

@tab

Return the hyperbolic tangent of `z'

@item

`Classification functions'

@tab

@item

@ref{2b14,,isfinite(z)}

@tab

Check if all components of `z' are finite

@item

@ref{2b15,,isinf(z)}

@tab

Check if any component of `z' is infinite

@item

@ref{2b16,,isnan(z)}

@tab

Check if any component of `z' is a NaN

@item

@ref{fb7,,isclose(a@comma{} b@comma{} *@comma{} rel_tol@comma{} abs_tol)}

@tab

Check if the values `a' and `b' are close to each other

@item

`Constants'

@tab

@item

@ref{2b17,,pi}

@tab

`π' = 3.141592…

@item

@ref{2b18,,e}

@tab

`e' = 2.718281…

@item

@ref{e83,,tau}

@tab

`τ' = 2`π' = 6.283185…

@item

@ref{e84,,inf}

@tab

Positive infinity

@item

@ref{e87,,infj}

@tab

Pure imaginary infinity

@item

@ref{e85,,nan}

@tab

“Not a number” (NaN)

@item

@ref{e88,,nanj}

@tab

Pure imaginary NaN

@end multitable


@menu
* Conversions to and from polar coordinates:: 
* Power and logarithmic functions:: 
* Trigonometric functions: Trigonometric functions<2>. 
* Hyperbolic functions: Hyperbolic functions<2>. 
* Classification functions:: 
* Constants: Constants<3>. 

@end menu

@node Conversions to and from polar coordinates,Power and logarithmic functions,,cmath — Mathematical functions for complex numbers
@anchor{library/cmath conversions-to-and-from-polar-coordinates}@anchor{2b19}
@subsubsection Conversions to and from polar coordinates


A Python complex number @code{z} is stored internally using `rectangular'
or `Cartesian' coordinates.  It is completely determined by its `real
part' @code{z.real} and its `imaginary part' @code{z.imag}.

`Polar coordinates' give an alternative way to represent a complex
number.  In polar coordinates, a complex number `z' is defined by the
modulus `r' and the phase angle `phi'. The modulus `r' is the distance
from `z' to the origin, while the phase `phi' is the counterclockwise
angle, measured in radians, from the positive x-axis to the line
segment that joins the origin to `z'.

The following functions can be used to convert from the native
rectangular coordinates to polar coordinates and back.

@geindex phase() (in module cmath)
@anchor{library/cmath cmath phase}@anchor{2b02}
@deffn {Function} cmath.phase (z)

Return the phase of `z' (also known as the `argument' of `z'), as a float.
@code{phase(z)} is equivalent to @code{math.atan2(z.imag, z.real)}.  The result
lies in the range [-`π', `π'], and the branch cut for this operation lies
along the negative real axis.  The sign of the result is the same as the
sign of @code{z.imag}, even when @code{z.imag} is zero:

@example
>>> phase(-1+0j)
3.141592653589793
>>> phase(-1-0j)
-3.141592653589793
@end example
@end deffn

@cartouche
@quotation Note 
The modulus (absolute value) of a complex number `z' can be
computed using the built-in @ref{20d1,,abs()} function.  There is no
separate @code{cmath} module function for this operation.
@end quotation
@end cartouche

@geindex polar() (in module cmath)
@anchor{library/cmath cmath polar}@anchor{2b03}
@deffn {Function} cmath.polar (z)

Return the representation of `z' in polar coordinates.  Returns a
pair @code{(r, phi)} where `r' is the modulus of `z' and `phi' is the
phase of `z'.  @code{polar(z)} is equivalent to @code{(abs(z),
phase(z))}.
@end deffn

@geindex rect() (in module cmath)
@anchor{library/cmath cmath rect}@anchor{2b04}
@deffn {Function} cmath.rect (r, phi)

Return the complex number `z' with polar coordinates `r' and `phi'.
Equivalent to @code{complex(r * math.cos(phi), r * math.sin(phi))}.
@end deffn

@node Power and logarithmic functions,Trigonometric functions<2>,Conversions to and from polar coordinates,cmath — Mathematical functions for complex numbers
@anchor{library/cmath power-and-logarithmic-functions}@anchor{2b1a}
@subsubsection Power and logarithmic functions


@geindex exp() (in module cmath)
@anchor{library/cmath cmath exp}@anchor{2b05}
@deffn {Function} cmath.exp (z)

Return `e' raised to the power `z', where `e' is the base of natural
logarithms.
@end deffn

@geindex log() (in module cmath)
@anchor{library/cmath cmath log}@anchor{2b06}
@deffn {Function} cmath.log (z[, base])

Return the logarithm of `z' to the given `base'. If the `base' is not
specified, returns the natural logarithm of `z'. There is one branch cut,
from 0 along the negative real axis to -∞.
@end deffn

@geindex log10() (in module cmath)
@anchor{library/cmath cmath log10}@anchor{2b07}
@deffn {Function} cmath.log10 (z)

Return the base-10 logarithm of `z'. This has the same branch cut as
@ref{2b06,,log()}.
@end deffn

@geindex sqrt() (in module cmath)
@anchor{library/cmath cmath sqrt}@anchor{2b01}
@deffn {Function} cmath.sqrt (z)

Return the square root of `z'. This has the same branch cut as @ref{2b06,,log()}.
@end deffn

@node Trigonometric functions<2>,Hyperbolic functions<2>,Power and logarithmic functions,cmath — Mathematical functions for complex numbers
@anchor{library/cmath trigonometric-functions}@anchor{2b1b}
@subsubsection Trigonometric functions


@geindex acos() (in module cmath)
@anchor{library/cmath cmath acos}@anchor{2b08}
@deffn {Function} cmath.acos (z)

Return the arc cosine of `z'. There are two branch cuts: One extends right
from 1 along the real axis to ∞. The other extends left from -1 along the
real axis to -∞.
@end deffn

@geindex asin() (in module cmath)
@anchor{library/cmath cmath asin}@anchor{2b09}
@deffn {Function} cmath.asin (z)

Return the arc sine of `z'. This has the same branch cuts as @ref{2b08,,acos()}.
@end deffn

@geindex atan() (in module cmath)
@anchor{library/cmath cmath atan}@anchor{2b0a}
@deffn {Function} cmath.atan (z)

Return the arc tangent of `z'. There are two branch cuts: One extends from
@code{1j} along the imaginary axis to @code{∞j}. The other extends from @code{-1j}
along the imaginary axis to @code{-∞j}.
@end deffn

@geindex cos() (in module cmath)
@anchor{library/cmath cmath cos}@anchor{2b0b}
@deffn {Function} cmath.cos (z)

Return the cosine of `z'.
@end deffn

@geindex sin() (in module cmath)
@anchor{library/cmath cmath sin}@anchor{2b0c}
@deffn {Function} cmath.sin (z)

Return the sine of `z'.
@end deffn

@geindex tan() (in module cmath)
@anchor{library/cmath cmath tan}@anchor{2b0d}
@deffn {Function} cmath.tan (z)

Return the tangent of `z'.
@end deffn

@node Hyperbolic functions<2>,Classification functions,Trigonometric functions<2>,cmath — Mathematical functions for complex numbers
@anchor{library/cmath hyperbolic-functions}@anchor{2b1c}
@subsubsection Hyperbolic functions


@geindex acosh() (in module cmath)
@anchor{library/cmath cmath acosh}@anchor{2b0e}
@deffn {Function} cmath.acosh (z)

Return the inverse hyperbolic cosine of `z'. There is one branch cut,
extending left from 1 along the real axis to -∞.
@end deffn

@geindex asinh() (in module cmath)
@anchor{library/cmath cmath asinh}@anchor{2b0f}
@deffn {Function} cmath.asinh (z)

Return the inverse hyperbolic sine of `z'. There are two branch cuts:
One extends from @code{1j} along the imaginary axis to @code{∞j}.  The other
extends from @code{-1j} along the imaginary axis to @code{-∞j}.
@end deffn

@geindex atanh() (in module cmath)
@anchor{library/cmath cmath atanh}@anchor{2b10}
@deffn {Function} cmath.atanh (z)

Return the inverse hyperbolic tangent of `z'. There are two branch cuts: One
extends from @code{1} along the real axis to @code{∞}. The other extends from
@code{-1} along the real axis to @code{-∞}.
@end deffn

@geindex cosh() (in module cmath)
@anchor{library/cmath cmath cosh}@anchor{2b11}
@deffn {Function} cmath.cosh (z)

Return the hyperbolic cosine of `z'.
@end deffn

@geindex sinh() (in module cmath)
@anchor{library/cmath cmath sinh}@anchor{2b12}
@deffn {Function} cmath.sinh (z)

Return the hyperbolic sine of `z'.
@end deffn

@geindex tanh() (in module cmath)
@anchor{library/cmath cmath tanh}@anchor{2b13}
@deffn {Function} cmath.tanh (z)

Return the hyperbolic tangent of `z'.
@end deffn

@node Classification functions,Constants<3>,Hyperbolic functions<2>,cmath — Mathematical functions for complex numbers
@anchor{library/cmath classification-functions}@anchor{2b1d}
@subsubsection Classification functions


@geindex isfinite() (in module cmath)
@anchor{library/cmath cmath isfinite}@anchor{2b14}
@deffn {Function} cmath.isfinite (z)

Return @code{True} if both the real and imaginary parts of `z' are finite, and
@code{False} otherwise.


Added in version 3.2.

@end deffn

@geindex isinf() (in module cmath)
@anchor{library/cmath cmath isinf}@anchor{2b15}
@deffn {Function} cmath.isinf (z)

Return @code{True} if either the real or the imaginary part of `z' is an
infinity, and @code{False} otherwise.
@end deffn

@geindex isnan() (in module cmath)
@anchor{library/cmath cmath isnan}@anchor{2b16}
@deffn {Function} cmath.isnan (z)

Return @code{True} if either the real or the imaginary part of `z' is a NaN,
and @code{False} otherwise.
@end deffn

@geindex isclose() (in module cmath)
@anchor{library/cmath cmath isclose}@anchor{fb7}
@deffn {Function} cmath.isclose (a, b, *, rel_tol=1e-09, abs_tol=0.0)

Return @code{True} if the values `a' and `b' are close to each other and
@code{False} otherwise.

Whether or not two values are considered close is determined according to
given absolute and relative tolerances.  If no errors occur, the result will
be: @code{abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)}.

`rel_tol' is the relative tolerance – it is the maximum allowed difference
between `a' and `b', relative to the larger absolute value of `a' or `b'.
For example, to set a tolerance of 5%, pass @code{rel_tol=0.05}.  The default
tolerance is @code{1e-09}, which assures that the two values are the same
within about 9 decimal digits.  `rel_tol' must be nonnegative and less
than @code{1.0}.

`abs_tol' is the absolute tolerance; it defaults to @code{0.0} and it must be
nonnegative.  When comparing @code{x} to @code{0.0}, @code{isclose(x, 0)} is computed
as @code{abs(x) <= rel_tol  * abs(x)}, which is @code{False} for any @code{x} and
rel_tol less than @code{1.0}.  So add an appropriate positive abs_tol argument
to the call.

The IEEE 754 special values of @code{NaN}, @code{inf}, and @code{-inf} will be
handled according to IEEE rules.  Specifically, @code{NaN} is not considered
close to any other value, including @code{NaN}.  @code{inf} and @code{-inf} are only
considered close to themselves.


Added in version 3.5.



@subsubheading See also


@geindex Python Enhancement Proposals; PEP 485
PEP 485@footnote{https://peps.python.org/pep-0485/} – A function for testing approximate equality

@end deffn

@node Constants<3>,,Classification functions,cmath — Mathematical functions for complex numbers
@anchor{library/cmath constants}@anchor{2b1e}
@subsubsection Constants


@geindex pi (in module cmath)
@anchor{library/cmath cmath pi}@anchor{2b17}
@deffn {Data} cmath.pi

The mathematical constant `π', as a float.
@end deffn

@geindex e (in module cmath)
@anchor{library/cmath cmath e}@anchor{2b18}
@deffn {Data} cmath.e

The mathematical constant `e', as a float.
@end deffn

@geindex tau (in module cmath)
@anchor{library/cmath cmath tau}@anchor{e83}
@deffn {Data} cmath.tau

The mathematical constant `τ', as a float.


Added in version 3.6.

@end deffn

@geindex inf (in module cmath)
@anchor{library/cmath cmath inf}@anchor{e84}
@deffn {Data} cmath.inf

Floating-point positive infinity. Equivalent to @code{float('inf')}.


Added in version 3.6.

@end deffn

@geindex infj (in module cmath)
@anchor{library/cmath cmath infj}@anchor{e87}
@deffn {Data} cmath.infj

Complex number with zero real part and positive infinity imaginary
part. Equivalent to @code{complex(0.0, float('inf'))}.


Added in version 3.6.

@end deffn

@geindex nan (in module cmath)
@anchor{library/cmath cmath nan}@anchor{e85}
@deffn {Data} cmath.nan

A floating-point “not a number” (NaN) value.  Equivalent to
@code{float('nan')}. See also @ref{875,,math.nan}.


Added in version 3.6.

@end deffn

@geindex nanj (in module cmath)
@anchor{library/cmath cmath nanj}@anchor{e88}
@deffn {Data} cmath.nanj

Complex number with zero real part and NaN imaginary part. Equivalent to
@code{complex(0.0, float('nan'))}.


Added in version 3.6.

@end deffn

@geindex module; math

Note that the selection of functions is similar, but not identical, to that in
module @ref{92,,math}.  The reason for having two modules is that some users aren’t
interested in complex numbers, and perhaps don’t even know what they are.  They
would rather have @code{math.sqrt(-1)} raise an exception than return a complex
number. Also note that the functions defined in @code{cmath} always return a
complex number, even if the answer can be expressed as a real number (in which
case the complex number has an imaginary part of zero).

A note on branch cuts: They are curves along which the given function fails to
be continuous.  They are a necessary feature of many complex functions.  It is
assumed that if you need to compute with complex functions, you will understand
about branch cuts.  Consult almost any (not too elementary) book on complex
variables for enlightenment.  For information of the proper choice of branch
cuts for numerical purposes, a good reference should be the following:


@subsubheading See also


Kahan, W:  Branch cuts for complex elementary functions; or, Much ado about
nothing’s sign bit.  In Iserles, A., and Powell, M. (eds.), The state of the art
in numerical analysis. Clarendon Press (1987) pp165–211.


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node decimal — Decimal fixed-point and floating-point arithmetic,fractions — Rational numbers,cmath — Mathematical functions for complex numbers,Numeric and Mathematical Modules
@anchor{library/decimal doc}@anchor{2b1f}@anchor{library/decimal decimal-decimal-fixed-point-and-floating-point-arithmetic}@anchor{2b20}@anchor{library/decimal module-decimal}@anchor{3a}@anchor{library/decimal translation-repo}@anchor{2b21}
@subsection @code{decimal} — Decimal fixed-point and floating-point arithmetic


@geindex module; decimal

`Source code:' Lib/decimal.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/decimal.py}

@c import modules for testing inline doctests with the Sphinx doctest builder

@c import decimal
@c import math
@c from decimal import *
@c # make sure each group gets a fresh context
@c setcontext(Context())

@c # make sure other tests (outside this file) get a fresh context
@c setcontext(Context())


__________________________________________________________________


The @code{decimal} module provides support for fast correctly rounded
decimal floating-point arithmetic. It offers several advantages over the
@ref{197,,float} datatype:


@itemize *

@item 
Decimal “is based on a floating-point model@footnote{https://speleotrove.com/decimal/damodel.html#refnumber} which was designed
with people in mind, and necessarily has a paramount guiding principle –
computers must provide an arithmetic that works in the same way as the
arithmetic that people learn at school.” – excerpt from the decimal
arithmetic specification.

@item 
Decimal numbers can be represented exactly.  In contrast, numbers like
@code{1.1} and @code{2.2} do not have exact representations in binary
floating point. End users typically would not expect @code{1.1 + 2.2} to display
as @code{3.3000000000000003} as it does with binary floating point.

@item 
The exactness carries over into arithmetic.  In decimal floating point, @code{0.1
+ 0.1 + 0.1 - 0.3} is exactly equal to zero.  In binary floating point, the result
is @code{5.5511151231257827e-017}.  While near to zero, the differences
prevent reliable equality testing and differences can accumulate. For this
reason, decimal is preferred in accounting applications which have strict
equality invariants.

@item 
The decimal module incorporates a notion of significant places so that @code{1.30
+ 1.20} is @code{2.50}.  The trailing zero is kept to indicate significance.
This is the customary presentation for monetary applications. For
multiplication, the “schoolbook” approach uses all the figures in the
multiplicands.  For instance, @code{1.3 * 1.2} gives @code{1.56} while @code{1.30 *
1.20} gives @code{1.5600}.

@item 
Unlike hardware based binary floating point, the decimal module has a user
alterable precision (defaulting to 28 places) which can be as large as needed for
a given problem:

@example
>>> from decimal import *
>>> getcontext().prec = 6
>>> Decimal(1) / Decimal(7)
Decimal('0.142857')
>>> getcontext().prec = 28
>>> Decimal(1) / Decimal(7)
Decimal('0.1428571428571428571428571429')
@end example

@item 
Both binary and decimal floating point are implemented in terms of published
standards.  While the built-in float type exposes only a modest portion of its
capabilities, the decimal module exposes all required parts of the standard.
When needed, the programmer has full control over rounding and signal handling.
This includes an option to enforce exact arithmetic by using exceptions
to block any inexact operations.

@item 
The decimal module was designed to support “without prejudice, both exact
unrounded decimal arithmetic (sometimes called fixed-point arithmetic)
and rounded floating-point arithmetic.”  – excerpt from the decimal
arithmetic specification.
@end itemize

The module design is centered around three concepts:  the decimal number, the
context for arithmetic, and signals.

A decimal number is immutable.  It has a sign, coefficient digits, and an
exponent.  To preserve significance, the coefficient digits do not truncate
trailing zeros.  Decimals also include special values such as
@code{Infinity}, @code{-Infinity}, and @code{NaN}.  The standard also
differentiates @code{-0} from @code{+0}.

The context for arithmetic is an environment specifying precision, rounding
rules, limits on exponents, flags indicating the results of operations, and trap
enablers which determine whether signals are treated as exceptions.  Rounding
options include @ref{2b22,,ROUND_CEILING}, @ref{2b23,,ROUND_DOWN},
@ref{2b24,,ROUND_FLOOR}, @ref{2b25,,ROUND_HALF_DOWN}, @ref{2b26,,ROUND_HALF_EVEN},
@ref{2b27,,ROUND_HALF_UP}, @ref{2b28,,ROUND_UP}, and @ref{2b29,,ROUND_05UP}.

Signals are groups of exceptional conditions arising during the course of
computation.  Depending on the needs of the application, signals may be ignored,
considered as informational, or treated as exceptions. The signals in the
decimal module are: @ref{2b2a,,Clamped}, @ref{12b4,,InvalidOperation},
@ref{2b2b,,DivisionByZero}, @ref{2b2c,,Inexact}, @ref{2b2d,,Rounded}, @ref{2b2e,,Subnormal},
@ref{2b2f,,Overflow}, @ref{2b30,,Underflow} and @ref{12a9,,FloatOperation}.

For each signal there is a flag and a trap enabler.  When a signal is
encountered, its flag is set to one, then, if the trap enabler is
set to one, an exception is raised.  Flags are sticky, so the user needs to
reset them before monitoring a calculation.


@subsubheading See also



@itemize *

@item 
IBM’s General Decimal Arithmetic Specification, The General Decimal Arithmetic Specification@footnote{https://speleotrove.com/decimal/decarith.html}.
@end itemize


@c %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

@menu
* Quick-start tutorial:: 
* Decimal objects:: 
* Context objects:: 
* Constants: Constants<4>. 
* Rounding modes:: 
* Signals:: 
* Floating-point notes:: 
* Working with threads:: 
* Recipes:: 
* Decimal FAQ:: 

@end menu

@node Quick-start tutorial,Decimal objects,,decimal — Decimal fixed-point and floating-point arithmetic
@anchor{library/decimal decimal-tutorial}@anchor{2b31}@anchor{library/decimal quick-start-tutorial}@anchor{2b32}
@subsubsection Quick-start tutorial


The usual start to using decimals is importing the module, viewing the current
context with @ref{197b,,getcontext()} and, if necessary, setting new values for
precision, rounding, or enabled traps:

@example
>>> from decimal import *
>>> getcontext()
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
        capitals=1, clamp=0, flags=[], traps=[Overflow, DivisionByZero,
        InvalidOperation])

>>> getcontext().prec = 7       # Set a new precision
@end example

Decimal instances can be constructed from integers, strings, floats, or tuples.
Construction from an integer or a float performs an exact conversion of the
value of that integer or float.  Decimal numbers include special values such as
@code{NaN} which stands for “Not a number”, positive and negative
@code{Infinity}, and @code{-0}:

@example
>>> getcontext().prec = 28
>>> Decimal(10)
Decimal('10')
>>> Decimal('3.14')
Decimal('3.14')
>>> Decimal(3.14)
Decimal('3.140000000000000124344978758017532527446746826171875')
>>> Decimal((0, (3, 1, 4), -2))
Decimal('3.14')
>>> Decimal(str(2.0 ** 0.5))
Decimal('1.4142135623730951')
>>> Decimal(2) ** Decimal('0.5')
Decimal('1.414213562373095048801688724')
>>> Decimal('NaN')
Decimal('NaN')
>>> Decimal('-Infinity')
Decimal('-Infinity')
@end example

If the @ref{12a9,,FloatOperation} signal is trapped, accidental mixing of
decimals and floats in constructors or ordering comparisons raises
an exception:

@example
>>> c = getcontext()
>>> c.traps[FloatOperation] = True
>>> Decimal(3.14)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
decimal.FloatOperation: [<class 'decimal.FloatOperation'>]
>>> Decimal('3.5') < 3.7
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
decimal.FloatOperation: [<class 'decimal.FloatOperation'>]
>>> Decimal('3.5') == 3.5
True
@end example


Added in version 3.3.


The significance of a new Decimal is determined solely by the number of digits
input.  Context precision and rounding only come into play during arithmetic
operations.

@example
>>> getcontext().prec = 6
>>> Decimal('3.0')
Decimal('3.0')
>>> Decimal('3.1415926535')
Decimal('3.1415926535')
>>> Decimal('3.1415926535') + Decimal('2.7182818285')
Decimal('5.85987')
>>> getcontext().rounding = ROUND_UP
>>> Decimal('3.1415926535') + Decimal('2.7182818285')
Decimal('5.85988')
@end example

If the internal limits of the C version are exceeded, constructing
a decimal raises @ref{12b4,,InvalidOperation}:

@example
>>> Decimal("1e9999999999999999999")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
decimal.InvalidOperation: [<class 'decimal.InvalidOperation'>]
@end example


Changed in version 3.3.


Decimals interact well with much of the rest of Python.  Here is a small decimal
floating-point flying circus:

@example
>>> data = list(map(Decimal, '1.34 1.87 3.45 2.35 1.00 0.03 9.25'.split()))
>>> max(data)
Decimal('9.25')
>>> min(data)
Decimal('0.03')
>>> sorted(data)
[Decimal('0.03'), Decimal('1.00'), Decimal('1.34'), Decimal('1.87'),
 Decimal('2.35'), Decimal('3.45'), Decimal('9.25')]
>>> sum(data)
Decimal('19.29')
>>> a,b,c = data[:3]
>>> str(a)
'1.34'
>>> float(a)
1.34
>>> round(a, 1)
Decimal('1.3')
>>> int(a)
1
>>> a * 5
Decimal('6.70')
>>> a * b
Decimal('2.5058')
>>> c % a
Decimal('0.77')
@end example

Decimals can be formatted (with @ref{19a,,format()} built-in or @ref{19b,,f-strings}) in
fixed-point or scientific notation, using the same formatting syntax (see
@ref{4fa,,Format specification mini-language}) as builtin @ref{197,,float} type:

@example
>>> format(Decimal('2.675'), "f")
'2.675'
>>> format(Decimal('2.675'), ".2f")
'2.68'
>>> f"@{Decimal('2.675'):.2f@}"
'2.68'
>>> format(Decimal('2.675'), ".2e")
'2.68e+0'
>>> with localcontext() as ctx:
...     ctx.rounding = ROUND_DOWN
...     print(format(Decimal('2.675'), ".2f"))
...
2.67
@end example

And some mathematical functions are also available to Decimal:

@example
>>> getcontext().prec = 28
>>> Decimal(2).sqrt()
Decimal('1.414213562373095048801688724')
>>> Decimal(1).exp()
Decimal('2.718281828459045235360287471')
>>> Decimal('10').ln()
Decimal('2.302585092994045684017991455')
>>> Decimal('10').log10()
Decimal('1')
@end example

The @ref{12bc,,quantize()} method rounds a number to a fixed exponent.  This method is
useful for monetary applications that often round results to a fixed number of
places:

@example
>>> Decimal('7.325').quantize(Decimal('.01'), rounding=ROUND_DOWN)
Decimal('7.32')
>>> Decimal('7.325').quantize(Decimal('1.'), rounding=ROUND_UP)
Decimal('8')
@end example

As shown above, the @ref{197b,,getcontext()} function accesses the current context and
allows the settings to be changed.  This approach meets the needs of most
applications.

For more advanced work, it may be useful to create alternate contexts using the
@ref{12bb,,Context()} constructor.  To make an alternate active, use the @ref{2b33,,setcontext()}
function.

In accordance with the standard, the @code{decimal} module provides two ready to
use standard contexts, @ref{12b0,,BasicContext} and @ref{12b1,,ExtendedContext}. The
former is especially useful for debugging because many of the traps are
enabled:

@example
>>> myothercontext = Context(prec=60, rounding=ROUND_HALF_DOWN)
>>> setcontext(myothercontext)
>>> Decimal(1) / Decimal(7)
Decimal('0.142857142857142857142857142857142857142857142857142857142857')

>>> ExtendedContext
Context(prec=9, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
        capitals=1, clamp=0, flags=[], traps=[])
>>> setcontext(ExtendedContext)
>>> Decimal(1) / Decimal(7)
Decimal('0.142857143')
>>> Decimal(42) / Decimal(0)
Decimal('Infinity')

>>> setcontext(BasicContext)
>>> Decimal(42) / Decimal(0)
Traceback (most recent call last):
  File "<pyshell#143>", line 1, in -toplevel-
    Decimal(42) / Decimal(0)
DivisionByZero: x / 0
@end example

Contexts also have signal flags for monitoring exceptional conditions
encountered during computations.  The flags remain set until explicitly cleared,
so it is best to clear the flags before each set of monitored computations by
using the @ref{2b34,,clear_flags()} method.

@example
>>> setcontext(ExtendedContext)
>>> getcontext().clear_flags()
>>> Decimal(355) / Decimal(113)
Decimal('3.14159292')
>>> getcontext()
Context(prec=9, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
        capitals=1, clamp=0, flags=[Inexact, Rounded], traps=[])
@end example

The `flags' entry shows that the rational approximation to pi was
rounded (digits beyond the context precision were thrown away) and that the
result is inexact (some of the discarded digits were non-zero).

Individual traps are set using the dictionary in the @ref{12ba,,traps}
attribute of a context:

@example
>>> setcontext(ExtendedContext)
>>> Decimal(1) / Decimal(0)
Decimal('Infinity')
>>> getcontext().traps[DivisionByZero] = 1
>>> Decimal(1) / Decimal(0)
Traceback (most recent call last):
  File "<pyshell#112>", line 1, in -toplevel-
    Decimal(1) / Decimal(0)
DivisionByZero: x / 0
@end example

Most programs adjust the current context only once, at the beginning of the
program.  And, in many applications, data is converted to @ref{200,,Decimal} with
a single cast inside a loop.  With context set and decimals created, the bulk of
the program manipulates the data no differently than with other Python numeric
types.

@c %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

@node Decimal objects,Context objects,Quick-start tutorial,decimal — Decimal fixed-point and floating-point arithmetic
@anchor{library/decimal decimal-decimal}@anchor{2b35}@anchor{library/decimal decimal-objects}@anchor{2b36}
@subsubsection Decimal objects


@geindex Decimal (class in decimal)
@anchor{library/decimal decimal Decimal}@anchor{200}
@deffn {Class} decimal.Decimal (value='0', context=None)

Construct a new @code{Decimal} object based from `value'.

`value' can be an integer, string, tuple, @ref{197,,float}, or another @code{Decimal}
object. If no `value' is given, returns @code{Decimal('0')}.  If `value' is a
string, it should conform to the decimal numeric string syntax after leading
and trailing whitespace characters, as well as underscores throughout, are removed:

@example
sign           ::=  '+' | '-'
digit          ::=  '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'
indicator      ::=  'e' | 'E'
digits         ::=  digit [digit]...
decimal-part   ::=  digits '.' [digits] | ['.'] digits
exponent-part  ::=  indicator [sign] digits
infinity       ::=  'Infinity' | 'Inf'
nan            ::=  'NaN' [digits] | 'sNaN' [digits]
numeric-value  ::=  decimal-part [exponent-part] | infinity
numeric-string ::=  [sign] numeric-value | [sign] nan
@end example

Other Unicode decimal digits are also permitted where @code{digit}
appears above.  These include decimal digits from various other
alphabets (for example, Arabic-Indic and Devanāgarī digits) along
with the fullwidth digits @code{'\uff10'} through @code{'\uff19'}.
Case is not significant, so, for example, @code{inf}, @code{Inf}, @code{INFINITY},
and @code{iNfINity} are all acceptable spellings for positive infinity.

If `value' is a @ref{614,,tuple}, it should have three components, a sign
(@code{0} for positive or @code{1} for negative), a @code{tuple} of
digits, and an integer exponent. For example, @code{Decimal((0, (1, 4, 1, 4), -3))}
returns @code{Decimal('1.414')}.

If `value' is a @ref{197,,float}, the binary floating-point value is losslessly
converted to its exact decimal equivalent.  This conversion can often require
53 or more digits of precision.  For example, @code{Decimal(float('1.1'))}
converts to
@code{Decimal('1.100000000000000088817841970012523233890533447265625')}.

The `context' precision does not affect how many digits are stored. That is
determined exclusively by the number of digits in `value'. For example,
@code{Decimal('3.00000')} records all five zeros even if the context precision is
only three.

The purpose of the `context' argument is determining what to do if `value' is a
malformed string.  If the context traps @ref{12b4,,InvalidOperation}, an exception
is raised; otherwise, the constructor returns a new Decimal with the value of
@code{NaN}.

Once constructed, @code{Decimal} objects are immutable.


Changed in version 3.2: The argument to the constructor is now permitted to be a @ref{197,,float}
instance.



Changed in version 3.3: @ref{197,,float} arguments raise an exception if the @ref{12a9,,FloatOperation}
trap is set. By default the trap is off.



Changed in version 3.6: Underscores are allowed for grouping, as with integral and floating-point
literals in code.


Decimal floating-point objects share many properties with the other built-in
numeric types such as @ref{197,,float} and @ref{19c,,int}.  All of the usual math
operations and special methods apply.  Likewise, decimal objects can be
copied, pickled, printed, used as dictionary keys, used as set elements,
compared, sorted, and coerced to another type (such as @code{float} or
@code{int}).

There are some small differences between arithmetic on Decimal objects and
arithmetic on integers and floats.  When the remainder operator @code{%} is
applied to Decimal objects, the sign of the result is the sign of the
`dividend' rather than the sign of the divisor:

@example
>>> (-7) % 4
1
>>> Decimal(-7) % Decimal(4)
Decimal('-3')
@end example

The integer division operator @code{//} behaves analogously, returning the
integer part of the true quotient (truncating towards zero) rather than its
floor, so as to preserve the usual identity @code{x == (x // y) * y + x % y}:

@example
>>> -7 // 4
-2
>>> Decimal(-7) // Decimal(4)
Decimal('-1')
@end example

The @code{%} and @code{//} operators implement the @code{remainder} and
@code{divide-integer} operations (respectively) as described in the
specification.

Decimal objects cannot generally be combined with floats or
instances of @ref{215,,fractions.Fraction} in arithmetic operations:
an attempt to add a @code{Decimal} to a @ref{197,,float}, for
example, will raise a @ref{199,,TypeError}.  However, it is possible to
use Python’s comparison operators to compare a @code{Decimal}
instance @code{x} with another number @code{y}.  This avoids confusing results
when doing equality comparisons between numbers of different types.


Changed in version 3.2: Mixed-type comparisons between @code{Decimal} instances and other
numeric types are now fully supported.


In addition to the standard numeric properties, decimal floating-point
objects also have a number of specialized methods:

@geindex adjusted() (decimal.Decimal method)
@anchor{library/decimal decimal Decimal adjusted}@anchor{2b37}
@deffn {Method} adjusted ()

Return the adjusted exponent after shifting out the coefficient’s
rightmost digits until only the lead digit remains:
@code{Decimal('321e+5').adjusted()} returns seven.  Used for determining the
position of the most significant digit with respect to the decimal point.
@end deffn

@geindex as_integer_ratio() (decimal.Decimal method)
@anchor{library/decimal decimal Decimal as_integer_ratio}@anchor{e98}
@deffn {Method} as_integer_ratio ()

Return a pair @code{(n, d)} of integers that represent the given
@code{Decimal} instance as a fraction, in lowest terms and
with a positive denominator:

@example
>>> Decimal('-3.14').as_integer_ratio()
(-157, 50)
@end example

The conversion is exact.  Raise OverflowError on infinities and ValueError
on NaNs.
@end deffn


Added in version 3.6.


@geindex as_tuple() (decimal.Decimal method)
@anchor{library/decimal decimal Decimal as_tuple}@anchor{2b38}
@deffn {Method} as_tuple ()

Return a @ref{85f,,named tuple} representation of the number:
@code{DecimalTuple(sign, digits, exponent)}.
@end deffn

@geindex canonical() (decimal.Decimal method)
@anchor{library/decimal decimal Decimal canonical}@anchor{2b39}
@deffn {Method} canonical ()

Return the canonical encoding of the argument.  Currently, the encoding of
a @code{Decimal} instance is always canonical, so this operation returns
its argument unchanged.
@end deffn

@geindex compare() (decimal.Decimal method)
@anchor{library/decimal decimal Decimal compare}@anchor{2b3a}
@deffn {Method} compare (other, context=None)

Compare the values of two Decimal instances.  @code{compare()} returns a
Decimal instance, and if either operand is a NaN then the result is a
NaN:

@example
a or b is a NaN  ==> Decimal('NaN')
a < b            ==> Decimal('-1')
a == b           ==> Decimal('0')
a > b            ==> Decimal('1')
@end example
@end deffn

@geindex compare_signal() (decimal.Decimal method)
@anchor{library/decimal decimal Decimal compare_signal}@anchor{2b3b}
@deffn {Method} compare_signal (other, context=None)

This operation is identical to the @ref{2b3a,,compare()} method, except that all
NaNs signal.  That is, if neither operand is a signaling NaN then any
quiet NaN operand is treated as though it were a signaling NaN.
@end deffn

@geindex compare_total() (decimal.Decimal method)
@anchor{library/decimal decimal Decimal compare_total}@anchor{2b3c}
@deffn {Method} compare_total (other, context=None)

Compare two operands using their abstract representation rather than their
numerical value.  Similar to the @ref{2b3a,,compare()} method, but the result
gives a total ordering on @code{Decimal} instances.  Two
@code{Decimal} instances with the same numeric value but different
representations compare unequal in this ordering:

@example
>>> Decimal('12.0').compare_total(Decimal('12'))
Decimal('-1')
@end example

Quiet and signaling NaNs are also included in the total ordering.  The
result of this function is @code{Decimal('0')} if both operands have the same
representation, @code{Decimal('-1')} if the first operand is lower in the
total order than the second, and @code{Decimal('1')} if the first operand is
higher in the total order than the second operand.  See the specification
for details of the total order.

This operation is unaffected by context and is quiet: no flags are changed
and no rounding is performed.  As an exception, the C version may raise
InvalidOperation if the second operand cannot be converted exactly.
@end deffn

@geindex compare_total_mag() (decimal.Decimal method)
@anchor{library/decimal decimal Decimal compare_total_mag}@anchor{2b3d}
@deffn {Method} compare_total_mag (other, context=None)

Compare two operands using their abstract representation rather than their
value as in @ref{2b3c,,compare_total()}, but ignoring the sign of each operand.
@code{x.compare_total_mag(y)} is equivalent to
@code{x.copy_abs().compare_total(y.copy_abs())}.

This operation is unaffected by context and is quiet: no flags are changed
and no rounding is performed.  As an exception, the C version may raise
InvalidOperation if the second operand cannot be converted exactly.
@end deffn

@geindex conjugate() (decimal.Decimal method)
@anchor{library/decimal decimal Decimal conjugate}@anchor{2b3e}
@deffn {Method} conjugate ()

Just returns self, this method is only to comply with the Decimal
Specification.
@end deffn

@geindex copy_abs() (decimal.Decimal method)
@anchor{library/decimal decimal Decimal copy_abs}@anchor{2b3f}
@deffn {Method} copy_abs ()

Return the absolute value of the argument.  This operation is unaffected
by the context and is quiet: no flags are changed and no rounding is
performed.
@end deffn

@geindex copy_negate() (decimal.Decimal method)
@anchor{library/decimal decimal Decimal copy_negate}@anchor{2b40}
@deffn {Method} copy_negate ()

Return the negation of the argument.  This operation is unaffected by the
context and is quiet: no flags are changed and no rounding is performed.
@end deffn

@geindex copy_sign() (decimal.Decimal method)
@anchor{library/decimal decimal Decimal copy_sign}@anchor{2b41}
@deffn {Method} copy_sign (other, context=None)

Return a copy of the first operand with the sign set to be the same as the
sign of the second operand.  For example:

@example
>>> Decimal('2.3').copy_sign(Decimal('-1.5'))
Decimal('-2.3')
@end example

This operation is unaffected by context and is quiet: no flags are changed
and no rounding is performed.  As an exception, the C version may raise
InvalidOperation if the second operand cannot be converted exactly.
@end deffn

@geindex exp() (decimal.Decimal method)
@anchor{library/decimal decimal Decimal exp}@anchor{12b6}
@deffn {Method} exp (context=None)

Return the value of the (natural) exponential function @code{e**x} at the
given number.  The result is correctly rounded using the
@ref{2b26,,ROUND_HALF_EVEN} rounding mode.

@example
>>> Decimal(1).exp()
Decimal('2.718281828459045235360287471')
>>> Decimal(321).exp()
Decimal('2.561702493119680037517373933E+139')
@end example
@end deffn

@geindex from_float() (decimal.Decimal class method)
@anchor{library/decimal decimal Decimal from_float}@anchor{1410}
@deffn {Method} classmethod from_float (f, /)

Alternative constructor that only accepts instances of @ref{197,,float} or
@ref{19c,,int}.

Note @code{Decimal.from_float(0.1)} is not the same as @code{Decimal('0.1')}.
Since 0.1 is not exactly representable in binary floating point, the
value is stored as the nearest representable value which is
@code{0x1.999999999999ap-4}.  That equivalent value in decimal is
@code{0.1000000000000000055511151231257827021181583404541015625}.

@cartouche
@quotation Note 
From Python 3.2 onwards, a @code{Decimal} instance
can also be constructed directly from a @ref{197,,float}.
@end quotation
@end cartouche

@example
>>> Decimal.from_float(0.1)
Decimal('0.1000000000000000055511151231257827021181583404541015625')
>>> Decimal.from_float(float('nan'))
Decimal('NaN')
>>> Decimal.from_float(float('inf'))
Decimal('Infinity')
>>> Decimal.from_float(float('-inf'))
Decimal('-Infinity')
@end example


Added in version 3.1.

@end deffn

@geindex from_number() (decimal.Decimal class method)
@anchor{library/decimal decimal Decimal from_number}@anchor{1ff}
@deffn {Method} classmethod from_number (number, /)

Alternative constructor that only accepts instances of
@ref{197,,float}, @ref{19c,,int} or @code{Decimal}, but not strings
or tuples.

@example
>>> Decimal.from_number(314)
Decimal('314')
>>> Decimal.from_number(0.1)
Decimal('0.1000000000000000055511151231257827021181583404541015625')
>>> Decimal.from_number(Decimal('3.14'))
Decimal('3.14')
@end example


Added in version 3.14.

@end deffn

@geindex fma() (decimal.Decimal method)
@anchor{library/decimal decimal Decimal fma}@anchor{2b42}
@deffn {Method} fma (other, third, context=None)

Fused multiply-add.  Return self*other+third with no rounding of the
intermediate product self*other.

@example
>>> Decimal(2).fma(3, 5)
Decimal('11')
@end example
@end deffn

@geindex is_canonical() (decimal.Decimal method)
@anchor{library/decimal decimal Decimal is_canonical}@anchor{2b43}
@deffn {Method} is_canonical ()

Return @ref{e0d,,True} if the argument is canonical and @ref{d31,,False}
otherwise.  Currently, a @code{Decimal} instance is always canonical, so
this operation always returns @code{True}.
@end deffn

@geindex is_finite() (decimal.Decimal method)
@anchor{library/decimal decimal Decimal is_finite}@anchor{2b44}
@deffn {Method} is_finite ()

Return @ref{e0d,,True} if the argument is a finite number, and
@ref{d31,,False} if the argument is an infinity or a NaN.
@end deffn

@geindex is_infinite() (decimal.Decimal method)
@anchor{library/decimal decimal Decimal is_infinite}@anchor{2b45}
@deffn {Method} is_infinite ()

Return @ref{e0d,,True} if the argument is either positive or negative
infinity and @ref{d31,,False} otherwise.
@end deffn

@geindex is_nan() (decimal.Decimal method)
@anchor{library/decimal decimal Decimal is_nan}@anchor{2b46}
@deffn {Method} is_nan ()

Return @ref{e0d,,True} if the argument is a (quiet or signaling) NaN and
@ref{d31,,False} otherwise.
@end deffn

@geindex is_normal() (decimal.Decimal method)
@anchor{library/decimal decimal Decimal is_normal}@anchor{2b47}
@deffn {Method} is_normal (context=None)

Return @ref{e0d,,True} if the argument is a `normal' finite number.  Return
@ref{d31,,False} if the argument is zero, subnormal, infinite or a NaN.
@end deffn

@geindex is_qnan() (decimal.Decimal method)
@anchor{library/decimal decimal Decimal is_qnan}@anchor{2b48}
@deffn {Method} is_qnan ()

Return @ref{e0d,,True} if the argument is a quiet NaN, and
@ref{d31,,False} otherwise.
@end deffn

@geindex is_signed() (decimal.Decimal method)
@anchor{library/decimal decimal Decimal is_signed}@anchor{2b49}
@deffn {Method} is_signed ()

Return @ref{e0d,,True} if the argument has a negative sign and
@ref{d31,,False} otherwise.  Note that zeros and NaNs can both carry signs.
@end deffn

@geindex is_snan() (decimal.Decimal method)
@anchor{library/decimal decimal Decimal is_snan}@anchor{2b4a}
@deffn {Method} is_snan ()

Return @ref{e0d,,True} if the argument is a signaling NaN and @ref{d31,,False}
otherwise.
@end deffn

@geindex is_subnormal() (decimal.Decimal method)
@anchor{library/decimal decimal Decimal is_subnormal}@anchor{2b4b}
@deffn {Method} is_subnormal (context=None)

Return @ref{e0d,,True} if the argument is subnormal, and @ref{d31,,False}
otherwise.
@end deffn

@geindex is_zero() (decimal.Decimal method)
@anchor{library/decimal decimal Decimal is_zero}@anchor{2b4c}
@deffn {Method} is_zero ()

Return @ref{e0d,,True} if the argument is a (positive or negative) zero and
@ref{d31,,False} otherwise.
@end deffn

@geindex ln() (decimal.Decimal method)
@anchor{library/decimal decimal Decimal ln}@anchor{12b7}
@deffn {Method} ln (context=None)

Return the natural (base e) logarithm of the operand.  The result is
correctly rounded using the @ref{2b26,,ROUND_HALF_EVEN} rounding mode.
@end deffn

@geindex log10() (decimal.Decimal method)
@anchor{library/decimal decimal Decimal log10}@anchor{2b4d}
@deffn {Method} log10 (context=None)

Return the base ten logarithm of the operand.  The result is correctly
rounded using the @ref{2b26,,ROUND_HALF_EVEN} rounding mode.
@end deffn

@geindex logb() (decimal.Decimal method)
@anchor{library/decimal decimal Decimal logb}@anchor{2b4e}
@deffn {Method} logb (context=None)

For a nonzero number, return the adjusted exponent of its operand as a
@code{Decimal} instance.  If the operand is a zero then
@code{Decimal('-Infinity')} is returned and the @ref{2b2b,,DivisionByZero} flag
is raised.  If the operand is an infinity then @code{Decimal('Infinity')} is
returned.
@end deffn

@geindex logical_and() (decimal.Decimal method)
@anchor{library/decimal decimal Decimal logical_and}@anchor{2b4f}
@deffn {Method} logical_and (other, context=None)

@code{logical_and()} is a logical operation which takes two `logical
operands' (see @ref{2b50,,Logical operands}).  The result is the
digit-wise @code{and} of the two operands.
@end deffn

@geindex logical_invert() (decimal.Decimal method)
@anchor{library/decimal decimal Decimal logical_invert}@anchor{2b51}
@deffn {Method} logical_invert (context=None)

@code{logical_invert()} is a logical operation.  The
result is the digit-wise inversion of the operand.
@end deffn

@geindex logical_or() (decimal.Decimal method)
@anchor{library/decimal decimal Decimal logical_or}@anchor{2b52}
@deffn {Method} logical_or (other, context=None)

@code{logical_or()} is a logical operation which takes two `logical
operands' (see @ref{2b50,,Logical operands}).  The result is the
digit-wise @code{or} of the two operands.
@end deffn

@geindex logical_xor() (decimal.Decimal method)
@anchor{library/decimal decimal Decimal logical_xor}@anchor{2b53}
@deffn {Method} logical_xor (other, context=None)

@code{logical_xor()} is a logical operation which takes two `logical
operands' (see @ref{2b50,,Logical operands}).  The result is the
digit-wise exclusive or of the two operands.
@end deffn

@geindex max() (decimal.Decimal method)
@anchor{library/decimal decimal Decimal max}@anchor{2b54}
@deffn {Method} max (other, context=None)

Like @code{max(self, other)} except that the context rounding rule is applied
before returning and that @code{NaN} values are either signaled or
ignored (depending on the context and whether they are signaling or
quiet).
@end deffn

@geindex max_mag() (decimal.Decimal method)
@anchor{library/decimal decimal Decimal max_mag}@anchor{2b55}
@deffn {Method} max_mag (other, context=None)

Similar to the @ref{2b54,,max()} method, but the comparison is done using the
absolute values of the operands.
@end deffn

@geindex min() (decimal.Decimal method)
@anchor{library/decimal decimal Decimal min}@anchor{2b56}
@deffn {Method} min (other, context=None)

Like @code{min(self, other)} except that the context rounding rule is applied
before returning and that @code{NaN} values are either signaled or
ignored (depending on the context and whether they are signaling or
quiet).
@end deffn

@geindex min_mag() (decimal.Decimal method)
@anchor{library/decimal decimal Decimal min_mag}@anchor{2b57}
@deffn {Method} min_mag (other, context=None)

Similar to the @ref{2b56,,min()} method, but the comparison is done using the
absolute values of the operands.
@end deffn

@geindex next_minus() (decimal.Decimal method)
@anchor{library/decimal decimal Decimal next_minus}@anchor{2b58}
@deffn {Method} next_minus (context=None)

Return the largest number representable in the given context (or in the
current thread’s context if no context is given) that is smaller than the
given operand.
@end deffn

@geindex next_plus() (decimal.Decimal method)
@anchor{library/decimal decimal Decimal next_plus}@anchor{2b59}
@deffn {Method} next_plus (context=None)

Return the smallest number representable in the given context (or in the
current thread’s context if no context is given) that is larger than the
given operand.
@end deffn

@geindex next_toward() (decimal.Decimal method)
@anchor{library/decimal decimal Decimal next_toward}@anchor{2b5a}
@deffn {Method} next_toward (other, context=None)

If the two operands are unequal, return the number closest to the first
operand in the direction of the second operand.  If both operands are
numerically equal, return a copy of the first operand with the sign set to
be the same as the sign of the second operand.
@end deffn

@geindex normalize() (decimal.Decimal method)
@anchor{library/decimal decimal Decimal normalize}@anchor{2b5b}
@deffn {Method} normalize (context=None)

Used for producing canonical values of an equivalence
class within either the current context or the specified context.

This has the same semantics as the unary plus operation, except that if
the final result is finite it is reduced to its simplest form, with all
trailing zeros removed and its sign preserved. That is, while the
coefficient is non-zero and a multiple of ten the coefficient is divided
by ten and the exponent is incremented by 1. Otherwise (the coefficient is
zero) the exponent is set to 0. In all cases the sign is unchanged.

For example, @code{Decimal('32.100')} and @code{Decimal('0.321000e+2')} both
normalize to the equivalent value @code{Decimal('32.1')}.

Note that rounding is applied `before' reducing to simplest form.

In the latest versions of the specification, this operation is also known
as @code{reduce}.
@end deffn

@geindex number_class() (decimal.Decimal method)
@anchor{library/decimal decimal Decimal number_class}@anchor{2b5c}
@deffn {Method} number_class (context=None)

Return a string describing the `class' of the operand.  The returned value
is one of the following ten strings.


@itemize *

@item 
@code{"-Infinity"}, indicating that the operand is negative infinity.

@item 
@code{"-Normal"}, indicating that the operand is a negative normal number.

@item 
@code{"-Subnormal"}, indicating that the operand is negative and subnormal.

@item 
@code{"-Zero"}, indicating that the operand is a negative zero.

@item 
@code{"+Zero"}, indicating that the operand is a positive zero.

@item 
@code{"+Subnormal"}, indicating that the operand is positive and subnormal.

@item 
@code{"+Normal"}, indicating that the operand is a positive normal number.

@item 
@code{"+Infinity"}, indicating that the operand is positive infinity.

@item 
@code{"NaN"}, indicating that the operand is a quiet NaN (Not a Number).

@item 
@code{"sNaN"}, indicating that the operand is a signaling NaN.
@end itemize
@end deffn

@geindex quantize() (decimal.Decimal method)
@anchor{library/decimal decimal Decimal quantize}@anchor{12bc}
@deffn {Method} quantize (exp, rounding=None, context=None)

Return a value equal to the first operand after rounding and having the
exponent of the second operand.

@example
>>> Decimal('1.41421356').quantize(Decimal('1.000'))
Decimal('1.414')
@end example

Unlike other operations, if the length of the coefficient after the
quantize operation would be greater than precision, then an
@ref{12b4,,InvalidOperation} is signaled. This guarantees that, unless there
is an error condition, the quantized exponent is always equal to that of
the right-hand operand.

Also unlike other operations, quantize never signals Underflow, even if
the result is subnormal and inexact.

If the exponent of the second operand is larger than that of the first
then rounding may be necessary.  In this case, the rounding mode is
determined by the @code{rounding} argument if given, else by the given
@code{context} argument; if neither argument is given the rounding mode of
the current thread’s context is used.

An error is returned whenever the resulting exponent is greater than
@ref{12b2,,Emax} or less than @ref{2b5d,,Etiny()}.
@end deffn

@geindex radix() (decimal.Decimal method)
@anchor{library/decimal decimal Decimal radix}@anchor{2b5e}
@deffn {Method} radix ()

Return @code{Decimal(10)}, the radix (base) in which the @code{Decimal}
class does all its arithmetic.  Included for compatibility with the
specification.
@end deffn

@geindex remainder_near() (decimal.Decimal method)
@anchor{library/decimal decimal Decimal remainder_near}@anchor{2b5f}
@deffn {Method} remainder_near (other, context=None)

Return the remainder from dividing `self' by `other'.  This differs from
@code{self % other} in that the sign of the remainder is chosen so as to
minimize its absolute value.  More precisely, the return value is
@code{self - n * other} where @code{n} is the integer nearest to the exact
value of @code{self / other}, and if two integers are equally near then the
even one is chosen.

If the result is zero then its sign will be the sign of `self'.

@example
>>> Decimal(18).remainder_near(Decimal(10))
Decimal('-2')
>>> Decimal(25).remainder_near(Decimal(10))
Decimal('5')
>>> Decimal(35).remainder_near(Decimal(10))
Decimal('-5')
@end example
@end deffn

@geindex rotate() (decimal.Decimal method)
@anchor{library/decimal decimal Decimal rotate}@anchor{2b60}
@deffn {Method} rotate (other, context=None)

Return the result of rotating the digits of the first operand by an amount
specified by the second operand.  The second operand must be an integer in
the range -precision through precision.  The absolute value of the second
operand gives the number of places to rotate.  If the second operand is
positive then rotation is to the left; otherwise rotation is to the right.
The coefficient of the first operand is padded on the left with zeros to
length precision if necessary.  The sign and exponent of the first operand
are unchanged.
@end deffn

@geindex same_quantum() (decimal.Decimal method)
@anchor{library/decimal decimal Decimal same_quantum}@anchor{2b61}
@deffn {Method} same_quantum (other, context=None)

Test whether self and other have the same exponent or whether both are
@code{NaN}.

This operation is unaffected by context and is quiet: no flags are changed
and no rounding is performed.  As an exception, the C version may raise
InvalidOperation if the second operand cannot be converted exactly.
@end deffn

@geindex scaleb() (decimal.Decimal method)
@anchor{library/decimal decimal Decimal scaleb}@anchor{2b62}
@deffn {Method} scaleb (other, context=None)

Return the first operand with exponent adjusted by the second.
Equivalently, return the first operand multiplied by @code{10**other}.  The
second operand must be an integer.
@end deffn

@geindex shift() (decimal.Decimal method)
@anchor{library/decimal decimal Decimal shift}@anchor{2b63}
@deffn {Method} shift (other, context=None)

Return the result of shifting the digits of the first operand by an amount
specified by the second operand.  The second operand must be an integer in
the range -precision through precision.  The absolute value of the second
operand gives the number of places to shift.  If the second operand is
positive then the shift is to the left; otherwise the shift is to the
right.  Digits shifted into the coefficient are zeros.  The sign and
exponent of the first operand are unchanged.
@end deffn

@geindex sqrt() (decimal.Decimal method)
@anchor{library/decimal decimal Decimal sqrt}@anchor{2b64}
@deffn {Method} sqrt (context=None)

Return the square root of the argument to full precision.
@end deffn

@geindex to_eng_string() (decimal.Decimal method)
@anchor{library/decimal decimal Decimal to_eng_string}@anchor{2b65}
@deffn {Method} to_eng_string (context=None)

Convert to a string, using engineering notation if an exponent is needed.

Engineering notation has an exponent which is a multiple of 3.  This
can leave up to 3 digits to the left of the decimal place and may
require the addition of either one or two trailing zeros.

For example, this converts @code{Decimal('123E+1')} to @code{Decimal('1.23E+3')}.
@end deffn

@geindex to_integral() (decimal.Decimal method)
@anchor{library/decimal decimal Decimal to_integral}@anchor{2b66}
@deffn {Method} to_integral (rounding=None, context=None)

Identical to the @ref{2b67,,to_integral_value()} method.  The @code{to_integral}
name has been kept for compatibility with older versions.
@end deffn

@geindex to_integral_exact() (decimal.Decimal method)
@anchor{library/decimal decimal Decimal to_integral_exact}@anchor{2b68}
@deffn {Method} to_integral_exact (rounding=None, context=None)

Round to the nearest integer, signaling @ref{2b2c,,Inexact} or
@ref{2b2d,,Rounded} as appropriate if rounding occurs.  The rounding mode is
determined by the @code{rounding} parameter if given, else by the given
@code{context}.  If neither parameter is given then the rounding mode of the
current context is used.
@end deffn

@geindex to_integral_value() (decimal.Decimal method)
@anchor{library/decimal decimal Decimal to_integral_value}@anchor{2b67}
@deffn {Method} to_integral_value (rounding=None, context=None)

Round to the nearest integer without signaling @ref{2b2c,,Inexact} or
@ref{2b2d,,Rounded}.  If given, applies `rounding'; otherwise, uses the
rounding method in either the supplied `context' or the current context.
@end deffn

Decimal numbers can be rounded using the @ref{14e6,,round()} function:


@deffn {Describe} round(number)
@end deffn


@deffn {Describe} round(number, ndigits)

If `ndigits' is not given or @code{None},
returns the nearest @ref{19c,,int} to `number',
rounding ties to even, and ignoring the rounding mode of the
@code{Decimal} context.  Raises @ref{a87,,OverflowError} if `number' is an
infinity or @ref{2ee,,ValueError} if it is a (quiet or signaling) NaN.

If `ndigits' is an @ref{19c,,int}, the context’s rounding mode is respected
and a @code{Decimal} representing `number' rounded to the nearest
multiple of @code{Decimal('1E-ndigits')} is returned; in this case,
@code{round(number, ndigits)} is equivalent to
@code{self.quantize(Decimal('1E-ndigits'))}.  Returns @code{Decimal('NaN')} if
`number' is a quiet NaN.  Raises @ref{12b4,,InvalidOperation} if `number'
is an infinity, a signaling NaN, or if the length of the coefficient after
the quantize operation would be greater than the current context’s
precision.  In other words, for the non-corner cases:


@itemize *

@item 
if `ndigits' is positive, return `number' rounded to `ndigits' decimal
places;

@item 
if `ndigits' is zero, return `number' rounded to the nearest integer;

@item 
if `ndigits' is negative, return `number' rounded to the nearest
multiple of @code{10**abs(ndigits)}.
@end itemize

For example:

@example
>>> from decimal import Decimal, getcontext, ROUND_DOWN
>>> getcontext().rounding = ROUND_DOWN
>>> round(Decimal('3.75'))     # context rounding ignored
4
>>> round(Decimal('3.5'))      # round-ties-to-even
4
>>> round(Decimal('3.75'), 0)  # uses the context rounding
Decimal('3')
>>> round(Decimal('3.75'), 1)
Decimal('3.7')
>>> round(Decimal('3.75'), -1)
Decimal('0E+1')
@end example
@end deffn
@end deffn

@menu
* Logical operands:: 

@end menu

@node Logical operands,,,Decimal objects
@anchor{library/decimal logical-operands}@anchor{2b69}@anchor{library/decimal logical-operands-label}@anchor{2b50}
@subsubsection Logical operands


The @ref{2b4f,,logical_and()}, @ref{2b51,,logical_invert()}, @ref{2b52,,logical_or()},
and @ref{2b53,,logical_xor()} methods expect their arguments to be `logical
operands'.  A `logical operand' is a @ref{200,,Decimal} instance whose
exponent and sign are both zero, and whose digits are all either
@code{0} or @code{1}.

@c %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

@node Context objects,Constants<4>,Decimal objects,decimal — Decimal fixed-point and floating-point arithmetic
@anchor{library/decimal context-objects}@anchor{2b6a}@anchor{library/decimal decimal-context}@anchor{27b1}
@subsubsection Context objects


Contexts are environments for arithmetic operations.  They govern precision, set
rules for rounding, determine which signals are treated as exceptions, and limit
the range for exponents.

Each thread has its own current context which is accessed or changed using the
@ref{197b,,getcontext()} and @ref{2b33,,setcontext()} functions:

@geindex getcontext() (in module decimal)
@anchor{library/decimal decimal getcontext}@anchor{197b}
@deffn {Function} decimal.getcontext ()

Return the current context for the active thread.
@end deffn

@geindex setcontext() (in module decimal)
@anchor{library/decimal decimal setcontext}@anchor{2b33}
@deffn {Function} decimal.setcontext (c, /)

Set the current context for the active thread to `c'.
@end deffn

You can also use the @ref{187,,with} statement and the @ref{1592,,localcontext()}
function to temporarily change the active context.

@geindex localcontext() (in module decimal)
@anchor{library/decimal decimal localcontext}@anchor{1592}
@deffn {Function} decimal.localcontext (ctx=None, **kwargs)

Return a context manager that will set the current context for the active thread
to a copy of `ctx' on entry to the with-statement and restore the previous context
when exiting the with-statement. If no context is specified, a copy of the
current context is used.  The `kwargs' argument is used to set the attributes
of the new context.

For example, the following code sets the current decimal precision to 42 places,
performs a calculation, and then automatically restores the previous context:

@example
from decimal import localcontext

with localcontext() as ctx:
    ctx.prec = 42   # Perform a high precision calculation
    s = calculate_something()
s = +s  # Round the final result back to the default precision
@end example

Using keyword arguments, the code would be the following:

@example
from decimal import localcontext

with localcontext(prec=42) as ctx:
    s = calculate_something()
s = +s
@end example

Raises @ref{199,,TypeError} if `kwargs' supplies an attribute that @ref{12bb,,Context} doesn’t
support.  Raises either @code{TypeError} or @ref{2ee,,ValueError} if `kwargs' supplies an
invalid value for an attribute.


Changed in version 3.11: @code{localcontext()} now supports setting context attributes through the use of keyword arguments.

@end deffn

@geindex IEEEContext() (in module decimal)
@anchor{library/decimal decimal IEEEContext}@anchor{201}
@deffn {Function} decimal.IEEEContext (bits)

Return a context object initialized to the proper values for one of the
IEEE interchange formats.  The argument must be a multiple of 32 and less
than @ref{2b6b,,IEEE_CONTEXT_MAX_BITS}.


Added in version 3.14.

@end deffn

New contexts can also be created using the @ref{12bb,,Context} constructor
described below. In addition, the module provides three pre-made contexts:

@geindex BasicContext (in module decimal)
@anchor{library/decimal decimal BasicContext}@anchor{12b0}
@deffn {Data} decimal.BasicContext

This is a standard context defined by the General Decimal Arithmetic
Specification.  Precision is set to nine.  Rounding is set to
@ref{2b27,,ROUND_HALF_UP}.  All flags are cleared.  All traps are enabled (treated
as exceptions) except @ref{2b2c,,Inexact}, @ref{2b2d,,Rounded}, and
@ref{2b2e,,Subnormal}.

Because many of the traps are enabled, this context is useful for debugging.
@end deffn

@geindex ExtendedContext (in module decimal)
@anchor{library/decimal decimal ExtendedContext}@anchor{12b1}
@deffn {Data} decimal.ExtendedContext

This is a standard context defined by the General Decimal Arithmetic
Specification.  Precision is set to nine.  Rounding is set to
@ref{2b26,,ROUND_HALF_EVEN}.  All flags are cleared.  No traps are enabled (so that
exceptions are not raised during computations).

Because the traps are disabled, this context is useful for applications that
prefer to have result value of @code{NaN} or @code{Infinity} instead of
raising exceptions.  This allows an application to complete a run in the
presence of conditions that would otherwise halt the program.
@end deffn

@geindex DefaultContext (in module decimal)
@anchor{library/decimal decimal DefaultContext}@anchor{12af}
@deffn {Data} decimal.DefaultContext

This context is used by the @ref{12bb,,Context} constructor as a prototype for new
contexts.  Changing a field (such a precision) has the effect of changing the
default for new contexts created by the @code{Context} constructor.

This context is most useful in multi-threaded environments.  Changing one of the
fields before threads are started has the effect of setting system-wide
defaults.  Changing the fields after threads have started is not recommended as
it would require thread synchronization to prevent race conditions.

In single threaded environments, it is preferable to not use this context at
all.  Instead, simply create contexts explicitly as described below.

The default values are @ref{2b6c,,Context.prec}=@code{28},
@ref{2b6d,,Context.rounding}=@ref{2b26,,ROUND_HALF_EVEN},
and enabled traps for @ref{2b2f,,Overflow}, @ref{12b4,,InvalidOperation}, and
@ref{2b2b,,DivisionByZero}.
@end deffn

In addition to the three supplied contexts, new contexts can be created with the
@ref{12bb,,Context} constructor.

@geindex Context (class in decimal)
@anchor{library/decimal decimal Context}@anchor{12bb}
@deffn {Class} decimal.Context (prec=None, rounding=None, Emin=None, Emax=None, capitals=None, clamp=None, flags=None, traps=None)

Creates a new context.  If a field is not specified or is @ref{887,,None}, the
default values are copied from the @ref{12af,,DefaultContext}.  If the `flags'
field is not specified or is @code{None}, all flags are cleared.

@geindex prec (decimal.Context attribute)
@anchor{library/decimal decimal Context prec}@anchor{2b6c}
@deffn {Attribute} prec

An integer in the range [@code{1}, @ref{12ac,,MAX_PREC}] that sets
the precision for arithmetic operations in the context.
@end deffn

@geindex rounding (decimal.Context attribute)
@anchor{library/decimal decimal Context rounding}@anchor{2b6d}
@deffn {Attribute} rounding

One of the constants listed in the section @ref{2b6e,,Rounding Modes}.
@end deffn

@geindex traps (decimal.Context attribute)
@geindex flags (decimal.Context attribute)
@anchor{library/decimal decimal Context traps}@anchor{12ba}
@deffn {Attribute} traps
@anchor{library/decimal decimal Context flags}@anchor{12b9}
@deffnx {Attribute} flags

Lists of any signals to be set. Generally, new contexts should only set
traps and leave the flags clear.
@end deffn

@geindex Emin (decimal.Context attribute)
@geindex Emax (decimal.Context attribute)
@anchor{library/decimal decimal Context Emin}@anchor{12b3}
@deffn {Attribute} Emin
@anchor{library/decimal decimal Context Emax}@anchor{12b2}
@deffnx {Attribute} Emax

Integers specifying the outer limits allowable for exponents. `Emin' must
be in the range [@ref{12ae,,MIN_EMIN}, @code{0}], `Emax' in the range
[@code{0}, @ref{12ad,,MAX_EMAX}].
@end deffn

@geindex capitals (decimal.Context attribute)
@anchor{library/decimal decimal Context capitals}@anchor{2b6f}
@deffn {Attribute} capitals

Either @code{0} or @code{1} (the default). If set to
@code{1}, exponents are printed with a capital @code{E}; otherwise, a
lowercase @code{e} is used: @code{Decimal('6.02e+23')}.
@end deffn

@geindex clamp (decimal.Context attribute)
@anchor{library/decimal decimal Context clamp}@anchor{13aa}
@deffn {Attribute} clamp

Either @code{0} (the default) or @code{1}.  If set to @code{1}, the exponent @code{e}
of a @ref{200,,Decimal} instance representable in this context is strictly
limited to the range @code{Emin - prec + 1 <= e <= Emax - prec + 1}.
If `clamp' is @code{0} then a weaker condition holds: the adjusted exponent of
the @code{Decimal} instance is at most @ref{12b2,,Emax}.  When `clamp' is
@code{1}, a large normal number will, where possible, have its
exponent reduced and a corresponding number of zeros added to its
coefficient, in order to fit the exponent constraints; this
preserves the value of the number but loses information about
significant trailing zeros.  For example:

@example
>>> Context(prec=6, Emax=999, clamp=1).create_decimal('1.23e999')
Decimal('1.23000E+999')
@end example

A `clamp' value of @code{1} allows compatibility with the
fixed-width decimal interchange formats specified in IEEE 754.
@end deffn

The @code{Context} class defines several general purpose methods as well as
a large number of methods for doing arithmetic directly in a given context.
In addition, for each of the @ref{200,,Decimal} methods described above (with
the exception of the @ref{2b37,,adjusted()} and @ref{2b38,,as_tuple()} methods) there is
a corresponding @code{Context} method.  For example, for a @code{Context}
instance @code{C} and @code{Decimal} instance @code{x}, @code{C.exp(x)} is
equivalent to @code{x.exp(context=C)}.  Each @code{Context} method accepts a
Python integer (an instance of @ref{19c,,int}) anywhere that a
Decimal instance is accepted.

@geindex clear_flags() (decimal.Context method)
@anchor{library/decimal decimal Context clear_flags}@anchor{2b34}
@deffn {Method} clear_flags ()

Resets all of the flags to @code{0}.
@end deffn

@geindex clear_traps() (decimal.Context method)
@anchor{library/decimal decimal Context clear_traps}@anchor{2b70}
@deffn {Method} clear_traps ()

Resets all of the traps to @code{0}.


Added in version 3.3.

@end deffn

@geindex copy() (decimal.Context method)
@anchor{library/decimal decimal Context copy}@anchor{2b71}
@deffn {Method} copy ()

Return a duplicate of the context.
@end deffn

@geindex copy_decimal() (decimal.Context method)
@anchor{library/decimal decimal Context copy_decimal}@anchor{2b72}
@deffn {Method} copy_decimal (num, /)

Return a copy of the Decimal instance num.
@end deffn

@geindex create_decimal() (decimal.Context method)
@anchor{library/decimal decimal Context create_decimal}@anchor{12b5}
@deffn {Method} create_decimal (num='0', /)

Creates a new Decimal instance from `num' but using `self' as
context. Unlike the @ref{200,,Decimal} constructor, the context precision,
rounding method, flags, and traps are applied to the conversion.

This is useful because constants are often given to a greater precision
than is needed by the application.  Another benefit is that rounding
immediately eliminates unintended effects from digits beyond the current
precision. In the following example, using unrounded inputs means that
adding zero to a sum can change the result:

@example
>>> getcontext().prec = 3
>>> Decimal('3.4445') + Decimal('1.0023')
Decimal('4.45')
>>> Decimal('3.4445') + Decimal(0) + Decimal('1.0023')
Decimal('4.44')
@end example

This method implements the to-number operation of the IBM specification.
If the argument is a string, no leading or trailing whitespace or
underscores are permitted.
@end deffn

@geindex create_decimal_from_float() (decimal.Context method)
@anchor{library/decimal decimal Context create_decimal_from_float}@anchor{2b73}
@deffn {Method} create_decimal_from_float (f, /)

Creates a new Decimal instance from a float `f' but rounding using `self'
as the context.  Unlike the @ref{1410,,Decimal.from_float()} class method,
the context precision, rounding method, flags, and traps are applied to
the conversion.

@example
>>> context = Context(prec=5, rounding=ROUND_DOWN)
>>> context.create_decimal_from_float(math.pi)
Decimal('3.1415')
>>> context = Context(prec=5, traps=[Inexact])
>>> context.create_decimal_from_float(math.pi)
Traceback (most recent call last):
    ...
decimal.Inexact: None
@end example


Added in version 3.1.

@end deffn

@geindex Etiny() (decimal.Context method)
@anchor{library/decimal decimal Context Etiny}@anchor{2b5d}
@deffn {Method} Etiny ()

Returns a value equal to @code{Emin - prec + 1} which is the minimum exponent
value for subnormal results.  When underflow occurs, the exponent is set
to @ref{2b5d,,Etiny}.
@end deffn

@geindex Etop() (decimal.Context method)
@anchor{library/decimal decimal Context Etop}@anchor{2b74}
@deffn {Method} Etop ()

Returns a value equal to @code{Emax - prec + 1}.
@end deffn

The usual approach to working with decimals is to create @ref{200,,Decimal}
instances and then apply arithmetic operations which take place within the
current context for the active thread.  An alternative approach is to use
context methods for calculating within a specific context.  The methods are
similar to those for the @code{Decimal} class and are only briefly
recounted here.

@geindex abs() (decimal.Context method)
@anchor{library/decimal decimal Context abs}@anchor{2b75}
@deffn {Method} abs (x, /)

Returns the absolute value of `x'.
@end deffn

@geindex add() (decimal.Context method)
@anchor{library/decimal decimal Context add}@anchor{2b76}
@deffn {Method} add (x, y, /)

Return the sum of `x' and `y'.
@end deffn

@geindex canonical() (decimal.Context method)
@anchor{library/decimal decimal Context canonical}@anchor{1512}
@deffn {Method} canonical (x, /)

Returns the same Decimal object `x'.
@end deffn

@geindex compare() (decimal.Context method)
@anchor{library/decimal decimal Context compare}@anchor{2b77}
@deffn {Method} compare (x, y, /)

Compares `x' and `y' numerically.
@end deffn

@geindex compare_signal() (decimal.Context method)
@anchor{library/decimal decimal Context compare_signal}@anchor{2b78}
@deffn {Method} compare_signal (x, y, /)

Compares the values of the two operands numerically.
@end deffn

@geindex compare_total() (decimal.Context method)
@anchor{library/decimal decimal Context compare_total}@anchor{2b79}
@deffn {Method} compare_total (x, y, /)

Compares two operands using their abstract representation.
@end deffn

@geindex compare_total_mag() (decimal.Context method)
@anchor{library/decimal decimal Context compare_total_mag}@anchor{2b7a}
@deffn {Method} compare_total_mag (x, y, /)

Compares two operands using their abstract representation, ignoring sign.
@end deffn

@geindex copy_abs() (decimal.Context method)
@anchor{library/decimal decimal Context copy_abs}@anchor{2b7b}
@deffn {Method} copy_abs (x, /)

Returns a copy of `x' with the sign set to 0.
@end deffn

@geindex copy_negate() (decimal.Context method)
@anchor{library/decimal decimal Context copy_negate}@anchor{2b7c}
@deffn {Method} copy_negate (x, /)

Returns a copy of `x' with the sign inverted.
@end deffn

@geindex copy_sign() (decimal.Context method)
@anchor{library/decimal decimal Context copy_sign}@anchor{2b7d}
@deffn {Method} copy_sign (x, y, /)

Copies the sign from `y' to `x'.
@end deffn

@geindex divide() (decimal.Context method)
@anchor{library/decimal decimal Context divide}@anchor{2b7e}
@deffn {Method} divide (x, y, /)

Return `x' divided by `y'.
@end deffn

@geindex divide_int() (decimal.Context method)
@anchor{library/decimal decimal Context divide_int}@anchor{2b7f}
@deffn {Method} divide_int (x, y, /)

Return `x' divided by `y', truncated to an integer.
@end deffn

@geindex divmod() (decimal.Context method)
@anchor{library/decimal decimal Context divmod}@anchor{2b80}
@deffn {Method} divmod (x, y, /)

Divides two numbers and returns the integer part of the result.
@end deffn

@geindex exp() (decimal.Context method)
@anchor{library/decimal decimal Context exp}@anchor{2b81}
@deffn {Method} exp (x, /)

Returns @code{e ** x}.
@end deffn

@geindex fma() (decimal.Context method)
@anchor{library/decimal decimal Context fma}@anchor{2b82}
@deffn {Method} fma (x, y, z, /)

Returns `x' multiplied by `y', plus `z'.
@end deffn

@geindex is_canonical() (decimal.Context method)
@anchor{library/decimal decimal Context is_canonical}@anchor{1513}
@deffn {Method} is_canonical (x, /)

Returns @code{True} if `x' is canonical; otherwise returns @code{False}.
@end deffn

@geindex is_finite() (decimal.Context method)
@anchor{library/decimal decimal Context is_finite}@anchor{2b83}
@deffn {Method} is_finite (x, /)

Returns @code{True} if `x' is finite; otherwise returns @code{False}.
@end deffn

@geindex is_infinite() (decimal.Context method)
@anchor{library/decimal decimal Context is_infinite}@anchor{2b84}
@deffn {Method} is_infinite (x, /)

Returns @code{True} if `x' is infinite; otherwise returns @code{False}.
@end deffn

@geindex is_nan() (decimal.Context method)
@anchor{library/decimal decimal Context is_nan}@anchor{2b85}
@deffn {Method} is_nan (x, /)

Returns @code{True} if `x' is a qNaN or sNaN; otherwise returns @code{False}.
@end deffn

@geindex is_normal() (decimal.Context method)
@anchor{library/decimal decimal Context is_normal}@anchor{2b86}
@deffn {Method} is_normal (x, /)

Returns @code{True} if `x' is a normal number; otherwise returns @code{False}.
@end deffn

@geindex is_qnan() (decimal.Context method)
@anchor{library/decimal decimal Context is_qnan}@anchor{2b87}
@deffn {Method} is_qnan (x, /)

Returns @code{True} if `x' is a quiet NaN; otherwise returns @code{False}.
@end deffn

@geindex is_signed() (decimal.Context method)
@anchor{library/decimal decimal Context is_signed}@anchor{2b88}
@deffn {Method} is_signed (x, /)

Returns @code{True} if `x' is negative; otherwise returns @code{False}.
@end deffn

@geindex is_snan() (decimal.Context method)
@anchor{library/decimal decimal Context is_snan}@anchor{2b89}
@deffn {Method} is_snan (x, /)

Returns @code{True} if `x' is a signaling NaN; otherwise returns @code{False}.
@end deffn

@geindex is_subnormal() (decimal.Context method)
@anchor{library/decimal decimal Context is_subnormal}@anchor{2b8a}
@deffn {Method} is_subnormal (x, /)

Returns @code{True} if `x' is subnormal; otherwise returns @code{False}.
@end deffn

@geindex is_zero() (decimal.Context method)
@anchor{library/decimal decimal Context is_zero}@anchor{2b8b}
@deffn {Method} is_zero (x, /)

Returns @code{True} if `x' is a zero; otherwise returns @code{False}.
@end deffn

@geindex ln() (decimal.Context method)
@anchor{library/decimal decimal Context ln}@anchor{2b8c}
@deffn {Method} ln (x, /)

Returns the natural (base e) logarithm of `x'.
@end deffn

@geindex log10() (decimal.Context method)
@anchor{library/decimal decimal Context log10}@anchor{2b8d}
@deffn {Method} log10 (x, /)

Returns the base 10 logarithm of `x'.
@end deffn

@geindex logb() (decimal.Context method)
@anchor{library/decimal decimal Context logb}@anchor{2b8e}
@deffn {Method} logb (x, /)

Returns the exponent of the magnitude of the operand’s MSD.
@end deffn

@geindex logical_and() (decimal.Context method)
@anchor{library/decimal decimal Context logical_and}@anchor{2b8f}
@deffn {Method} logical_and (x, y, /)

Applies the logical operation `and' between each operand’s digits.
@end deffn

@geindex logical_invert() (decimal.Context method)
@anchor{library/decimal decimal Context logical_invert}@anchor{2b90}
@deffn {Method} logical_invert (x, /)

Invert all the digits in `x'.
@end deffn

@geindex logical_or() (decimal.Context method)
@anchor{library/decimal decimal Context logical_or}@anchor{2b91}
@deffn {Method} logical_or (x, y, /)

Applies the logical operation `or' between each operand’s digits.
@end deffn

@geindex logical_xor() (decimal.Context method)
@anchor{library/decimal decimal Context logical_xor}@anchor{2b92}
@deffn {Method} logical_xor (x, y, /)

Applies the logical operation `xor' between each operand’s digits.
@end deffn

@geindex max() (decimal.Context method)
@anchor{library/decimal decimal Context max}@anchor{2b93}
@deffn {Method} max (x, y, /)

Compares two values numerically and returns the maximum.
@end deffn

@geindex max_mag() (decimal.Context method)
@anchor{library/decimal decimal Context max_mag}@anchor{2b94}
@deffn {Method} max_mag (x, y, /)

Compares the values numerically with their sign ignored.
@end deffn

@geindex min() (decimal.Context method)
@anchor{library/decimal decimal Context min}@anchor{2b95}
@deffn {Method} min (x, y, /)

Compares two values numerically and returns the minimum.
@end deffn

@geindex min_mag() (decimal.Context method)
@anchor{library/decimal decimal Context min_mag}@anchor{2b96}
@deffn {Method} min_mag (x, y, /)

Compares the values numerically with their sign ignored.
@end deffn

@geindex minus() (decimal.Context method)
@anchor{library/decimal decimal Context minus}@anchor{2b97}
@deffn {Method} minus (x, /)

Minus corresponds to the unary prefix minus operator in Python.
@end deffn

@geindex multiply() (decimal.Context method)
@anchor{library/decimal decimal Context multiply}@anchor{2b98}
@deffn {Method} multiply (x, y, /)

Return the product of `x' and `y'.
@end deffn

@geindex next_minus() (decimal.Context method)
@anchor{library/decimal decimal Context next_minus}@anchor{2b99}
@deffn {Method} next_minus (x, /)

Returns the largest representable number smaller than `x'.
@end deffn

@geindex next_plus() (decimal.Context method)
@anchor{library/decimal decimal Context next_plus}@anchor{2b9a}
@deffn {Method} next_plus (x, /)

Returns the smallest representable number larger than `x'.
@end deffn

@geindex next_toward() (decimal.Context method)
@anchor{library/decimal decimal Context next_toward}@anchor{2b9b}
@deffn {Method} next_toward (x, y, /)

Returns the number closest to `x', in direction towards `y'.
@end deffn

@geindex normalize() (decimal.Context method)
@anchor{library/decimal decimal Context normalize}@anchor{2b9c}
@deffn {Method} normalize (x, /)

Reduces `x' to its simplest form.
@end deffn

@geindex number_class() (decimal.Context method)
@anchor{library/decimal decimal Context number_class}@anchor{2b9d}
@deffn {Method} number_class (x, /)

Returns an indication of the class of `x'.
@end deffn

@geindex plus() (decimal.Context method)
@anchor{library/decimal decimal Context plus}@anchor{2b9e}
@deffn {Method} plus (x, /)

Plus corresponds to the unary prefix plus operator in Python.  This
operation applies the context precision and rounding, so it is `not' an
identity operation.
@end deffn

@geindex power() (decimal.Context method)
@anchor{library/decimal decimal Context power}@anchor{2b9f}
@deffn {Method} power (x, y, modulo=None)

Return @code{x} to the power of @code{y}, reduced modulo @code{modulo} if given.

With two arguments, compute @code{x**y}.  If @code{x} is negative then @code{y}
must be integral.  The result will be inexact unless @code{y} is integral and
the result is finite and can be expressed exactly in ‘precision’ digits.
The rounding mode of the context is used. Results are always correctly rounded
in the Python version.

@code{Decimal(0) ** Decimal(0)} results in @code{InvalidOperation}, and if @code{InvalidOperation}
is not trapped, then results in @code{Decimal('NaN')}.


Changed in version 3.3: The C module computes @code{power()} in terms of the correctly rounded
@ref{2b81,,exp()} and @ref{2b8c,,ln()} functions. The result is well-defined but
only “almost always correctly rounded”.


With three arguments, compute @code{(x**y) % modulo}.  For the three argument
form, the following restrictions on the arguments hold:


@itemize -

@item 
all three arguments must be integral

@item 
@code{y} must be nonnegative

@item 
at least one of @code{x} or @code{y} must be nonzero

@item 
@code{modulo} must be nonzero and have at most ‘precision’ digits
@end itemize

The value resulting from @code{Context.power(x, y, modulo)} is
equal to the value that would be obtained by computing @code{(x**y)
% modulo} with unbounded precision, but is computed more
efficiently.  The exponent of the result is zero, regardless of
the exponents of @code{x}, @code{y} and @code{modulo}.  The result is
always exact.
@end deffn

@geindex quantize() (decimal.Context method)
@anchor{library/decimal decimal Context quantize}@anchor{2ba0}
@deffn {Method} quantize (x, y, /)

Returns a value equal to `x' (rounded), having the exponent of `y'.
@end deffn

@geindex radix() (decimal.Context method)
@anchor{library/decimal decimal Context radix}@anchor{2ba1}
@deffn {Method} radix ()

Just returns 10, as this is Decimal, :)
@end deffn

@geindex remainder() (decimal.Context method)
@anchor{library/decimal decimal Context remainder}@anchor{2ba2}
@deffn {Method} remainder (x, y, /)

Returns the remainder from integer division.

The sign of the result, if non-zero, is the same as that of the original
dividend.
@end deffn

@geindex remainder_near() (decimal.Context method)
@anchor{library/decimal decimal Context remainder_near}@anchor{2ba3}
@deffn {Method} remainder_near (x, y, /)

Returns @code{x - y * n}, where `n' is the integer nearest the exact value
of @code{x / y} (if the result is 0 then its sign will be the sign of `x').
@end deffn

@geindex rotate() (decimal.Context method)
@anchor{library/decimal decimal Context rotate}@anchor{2ba4}
@deffn {Method} rotate (x, y, /)

Returns a rotated copy of `x', `y' times.
@end deffn

@geindex same_quantum() (decimal.Context method)
@anchor{library/decimal decimal Context same_quantum}@anchor{2ba5}
@deffn {Method} same_quantum (x, y, /)

Returns @code{True} if the two operands have the same exponent.
@end deffn

@geindex scaleb() (decimal.Context method)
@anchor{library/decimal decimal Context scaleb}@anchor{2ba6}
@deffn {Method} scaleb (x, y, /)

Returns the first operand after adding the second value its exp.
@end deffn

@geindex shift() (decimal.Context method)
@anchor{library/decimal decimal Context shift}@anchor{2ba7}
@deffn {Method} shift (x, y, /)

Returns a shifted copy of `x', `y' times.
@end deffn

@geindex sqrt() (decimal.Context method)
@anchor{library/decimal decimal Context sqrt}@anchor{2ba8}
@deffn {Method} sqrt (x, /)

Square root of a non-negative number to context precision.
@end deffn

@geindex subtract() (decimal.Context method)
@anchor{library/decimal decimal Context subtract}@anchor{2ba9}
@deffn {Method} subtract (x, y, /)

Return the difference between `x' and `y'.
@end deffn

@geindex to_eng_string() (decimal.Context method)
@anchor{library/decimal decimal Context to_eng_string}@anchor{2baa}
@deffn {Method} to_eng_string (x, /)

Convert to a string, using engineering notation if an exponent is needed.

Engineering notation has an exponent which is a multiple of 3.  This
can leave up to 3 digits to the left of the decimal place and may
require the addition of either one or two trailing zeros.
@end deffn

@geindex to_integral_exact() (decimal.Context method)
@anchor{library/decimal decimal Context to_integral_exact}@anchor{2bab}
@deffn {Method} to_integral_exact (x, /)

Rounds to an integer.
@end deffn

@geindex to_sci_string() (decimal.Context method)
@anchor{library/decimal decimal Context to_sci_string}@anchor{2bac}
@deffn {Method} to_sci_string (x, /)

Converts a number to a string using scientific notation.
@end deffn
@end deffn

@c %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

@node Constants<4>,Rounding modes,Context objects,decimal — Decimal fixed-point and floating-point arithmetic
@anchor{library/decimal constants}@anchor{2bad}@anchor{library/decimal decimal-rounding-modes}@anchor{2bae}
@subsubsection Constants


The constants in this section are only relevant for the C module. They
are also included in the pure Python version for compatibility.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

@tab

32-bit

@tab

64-bit

@item

@geindex MAX_PREC (in module decimal)
@anchor{library/decimal decimal MAX_PREC}@anchor{12ac}
@deffn {Data} decimal.MAX_PREC
@end deffn

@tab

@code{425000000}

@tab

@code{999999999999999999}

@item

@geindex MAX_EMAX (in module decimal)
@anchor{library/decimal decimal MAX_EMAX}@anchor{12ad}
@deffn {Data} decimal.MAX_EMAX
@end deffn

@tab

@code{425000000}

@tab

@code{999999999999999999}

@item

@geindex MIN_EMIN (in module decimal)
@anchor{library/decimal decimal MIN_EMIN}@anchor{12ae}
@deffn {Data} decimal.MIN_EMIN
@end deffn

@tab

@code{-425000000}

@tab

@code{-999999999999999999}

@item

@geindex MIN_ETINY (in module decimal)
@anchor{library/decimal decimal MIN_ETINY}@anchor{2baf}
@deffn {Data} decimal.MIN_ETINY
@end deffn

@tab

@code{-849999999}

@tab

@code{-1999999999999999997}

@item

@geindex IEEE_CONTEXT_MAX_BITS (in module decimal)
@anchor{library/decimal decimal IEEE_CONTEXT_MAX_BITS}@anchor{2b6b}
@deffn {Data} decimal.IEEE_CONTEXT_MAX_BITS
@end deffn

@tab

@code{256}

@tab

@code{512}

@end multitable


@geindex HAVE_THREADS (in module decimal)
@anchor{library/decimal decimal HAVE_THREADS}@anchor{12aa}
@deffn {Data} decimal.HAVE_THREADS

The value is @code{True}.  Deprecated, because Python now always has threads.


Deprecated since version 3.9.

@end deffn

@geindex HAVE_CONTEXTVAR (in module decimal)
@anchor{library/decimal decimal HAVE_CONTEXTVAR}@anchor{21ab}
@deffn {Data} decimal.HAVE_CONTEXTVAR

The default value is @code{True}. If Python is @ref{21aa,,configured using the --without-decimal-contextvar option},
the C version uses a thread-local rather than a coroutine-local context and the value
is @code{False}.  This is slightly faster in some nested context scenarios.


Added in version 3.8.3.

@end deffn

@node Rounding modes,Signals,Constants<4>,decimal — Decimal fixed-point and floating-point arithmetic
@anchor{library/decimal rounding-modes}@anchor{2b6e}
@subsubsection Rounding modes


@geindex ROUND_CEILING (in module decimal)
@anchor{library/decimal decimal ROUND_CEILING}@anchor{2b22}
@deffn {Data} decimal.ROUND_CEILING

Round towards @code{Infinity}.
@end deffn

@geindex ROUND_DOWN (in module decimal)
@anchor{library/decimal decimal ROUND_DOWN}@anchor{2b23}
@deffn {Data} decimal.ROUND_DOWN

Round towards zero.
@end deffn

@geindex ROUND_FLOOR (in module decimal)
@anchor{library/decimal decimal ROUND_FLOOR}@anchor{2b24}
@deffn {Data} decimal.ROUND_FLOOR

Round towards @code{-Infinity}.
@end deffn

@geindex ROUND_HALF_DOWN (in module decimal)
@anchor{library/decimal decimal ROUND_HALF_DOWN}@anchor{2b25}
@deffn {Data} decimal.ROUND_HALF_DOWN

Round to nearest with ties going towards zero.
@end deffn

@geindex ROUND_HALF_EVEN (in module decimal)
@anchor{library/decimal decimal ROUND_HALF_EVEN}@anchor{2b26}
@deffn {Data} decimal.ROUND_HALF_EVEN

Round to nearest with ties going to nearest even integer.
@end deffn

@geindex ROUND_HALF_UP (in module decimal)
@anchor{library/decimal decimal ROUND_HALF_UP}@anchor{2b27}
@deffn {Data} decimal.ROUND_HALF_UP

Round to nearest with ties going away from zero.
@end deffn

@geindex ROUND_UP (in module decimal)
@anchor{library/decimal decimal ROUND_UP}@anchor{2b28}
@deffn {Data} decimal.ROUND_UP

Round away from zero.
@end deffn

@geindex ROUND_05UP (in module decimal)
@anchor{library/decimal decimal ROUND_05UP}@anchor{2b29}
@deffn {Data} decimal.ROUND_05UP

Round away from zero if last digit after rounding towards zero would have
been 0 or 5; otherwise round towards zero.
@end deffn

@node Signals,Floating-point notes,Rounding modes,decimal — Decimal fixed-point and floating-point arithmetic
@anchor{library/decimal decimal-signals}@anchor{2bb0}@anchor{library/decimal signals}@anchor{2bb1}
@subsubsection Signals


Signals represent conditions that arise during computation. Each corresponds to
one context flag and one context trap enabler.

The context flag is set whenever the condition is encountered. After the
computation, flags may be checked for informational purposes (for instance, to
determine whether a computation was exact). After checking the flags, be sure to
clear all flags before starting the next computation.

If the context’s trap enabler is set for the signal, then the condition causes a
Python exception to be raised.  For example, if the @ref{2b2b,,DivisionByZero} trap
is set, then a @ref{2b2b,,DivisionByZero} exception is raised upon encountering the
condition.

@geindex Clamped (class in decimal)
@anchor{library/decimal decimal Clamped}@anchor{2b2a}
@deffn {Class} decimal.Clamped

Altered an exponent to fit representation constraints.

Typically, clamping occurs when an exponent falls outside the context’s
@ref{12b3,,Emin} and @ref{12b2,,Emax} limits.  If possible, the exponent is reduced to
fit by adding zeros to the coefficient.
@end deffn

@geindex DecimalException (class in decimal)
@anchor{library/decimal decimal DecimalException}@anchor{2bb2}
@deffn {Class} decimal.DecimalException

Base class for other signals and a subclass of @ref{272f,,ArithmeticError}.
@end deffn

@geindex DivisionByZero (class in decimal)
@anchor{library/decimal decimal DivisionByZero}@anchor{2b2b}
@deffn {Class} decimal.DivisionByZero

Signals the division of a non-infinite number by zero.

Can occur with division, modulo division, or when raising a number to a negative
power.  If this signal is not trapped, returns @code{Infinity} or
@code{-Infinity} with the sign determined by the inputs to the calculation.
@end deffn

@geindex Inexact (class in decimal)
@anchor{library/decimal decimal Inexact}@anchor{2b2c}
@deffn {Class} decimal.Inexact

Indicates that rounding occurred and the result is not exact.

Signals when non-zero digits were discarded during rounding. The rounded result
is returned.  The signal flag or trap is used to detect when results are
inexact.
@end deffn

@geindex InvalidOperation (class in decimal)
@anchor{library/decimal decimal InvalidOperation}@anchor{12b4}
@deffn {Class} decimal.InvalidOperation

An invalid operation was performed.

Indicates that an operation was requested that does not make sense. If not
trapped, returns @code{NaN}.  Possible causes include:

@example
Infinity - Infinity
0 * Infinity
Infinity / Infinity
x % 0
Infinity % x
sqrt(-x) and x > 0
0 ** 0
x ** (non-integer)
x ** Infinity
@end example
@end deffn

@geindex Overflow (class in decimal)
@anchor{library/decimal decimal Overflow}@anchor{2b2f}
@deffn {Class} decimal.Overflow

Numerical overflow.

Indicates the exponent is larger than @ref{12b2,,Context.Emax} after rounding has
occurred.  If not trapped, the result depends on the rounding mode, either
pulling inward to the largest representable finite number or rounding outward
to @code{Infinity}.  In either case, @ref{2b2c,,Inexact} and @ref{2b2d,,Rounded}
are also signaled.
@end deffn

@geindex Rounded (class in decimal)
@anchor{library/decimal decimal Rounded}@anchor{2b2d}
@deffn {Class} decimal.Rounded

Rounding occurred though possibly no information was lost.

Signaled whenever rounding discards digits; even if those digits are zero
(such as rounding @code{5.00} to @code{5.0}).  If not trapped, returns
the result unchanged.  This signal is used to detect loss of significant
digits.
@end deffn

@geindex Subnormal (class in decimal)
@anchor{library/decimal decimal Subnormal}@anchor{2b2e}
@deffn {Class} decimal.Subnormal

Exponent was lower than @ref{12b3,,Emin} prior to rounding.

Occurs when an operation result is subnormal (the exponent is too small). If
not trapped, returns the result unchanged.
@end deffn

@geindex Underflow (class in decimal)
@anchor{library/decimal decimal Underflow}@anchor{2b30}
@deffn {Class} decimal.Underflow

Numerical underflow with result rounded to zero.

Occurs when a subnormal result is pushed to zero by rounding. @ref{2b2c,,Inexact}
and @ref{2b2e,,Subnormal} are also signaled.
@end deffn

@geindex FloatOperation (class in decimal)
@anchor{library/decimal decimal FloatOperation}@anchor{12a9}
@deffn {Class} decimal.FloatOperation

Enable stricter semantics for mixing floats and Decimals.

If the signal is not trapped (default), mixing floats and Decimals is
permitted in the @ref{200,,Decimal} constructor,
@ref{12b5,,create_decimal()} and all comparison operators.
Both conversion and comparisons are exact. Any occurrence of a mixed
operation is silently recorded by setting @code{FloatOperation} in the
context flags. Explicit conversions with @ref{1410,,from_float()}
or @ref{2b73,,create_decimal_from_float()} do not set the flag.

Otherwise (the signal is trapped), only equality comparisons and explicit
conversions are silent. All other mixed operations raise @code{FloatOperation}.
@end deffn

The following table summarizes the hierarchy of signals:

@example
exceptions.ArithmeticError(exceptions.Exception)
    DecimalException
        Clamped
        DivisionByZero(DecimalException, exceptions.ZeroDivisionError)
        Inexact
            Overflow(Inexact, Rounded)
            Underflow(Inexact, Rounded, Subnormal)
        InvalidOperation
        Rounded
        Subnormal
        FloatOperation(DecimalException, exceptions.TypeError)
@end example

@c %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

@node Floating-point notes,Working with threads,Signals,decimal — Decimal fixed-point and floating-point arithmetic
@anchor{library/decimal decimal-notes}@anchor{2bb3}@anchor{library/decimal floating-point-notes}@anchor{2bb4}
@subsubsection Floating-point notes


@menu
* Mitigating round-off error with increased precision:: 
* Special values:: 

@end menu

@node Mitigating round-off error with increased precision,Special values,,Floating-point notes
@anchor{library/decimal mitigating-round-off-error-with-increased-precision}@anchor{2bb5}
@subsubsection Mitigating round-off error with increased precision


The use of decimal floating point eliminates decimal representation error
(making it possible to represent @code{0.1} exactly); however, some operations
can still incur round-off error when non-zero digits exceed the fixed precision.

The effects of round-off error can be amplified by the addition or subtraction
of nearly offsetting quantities resulting in loss of significance.  Knuth
provides two instructive examples where rounded floating-point arithmetic with
insufficient precision causes the breakdown of the associative and distributive
properties of addition:

@example
# Examples from Seminumerical Algorithms, Section 4.2.2.
>>> from decimal import Decimal, getcontext
>>> getcontext().prec = 8

>>> u, v, w = Decimal(11111113), Decimal(-11111111), Decimal('7.51111111')
>>> (u + v) + w
Decimal('9.5111111')
>>> u + (v + w)
Decimal('10')

>>> u, v, w = Decimal(20000), Decimal(-6), Decimal('6.0000003')
>>> (u*v) + (u*w)
Decimal('0.01')
>>> u * (v+w)
Decimal('0.0060000')
@end example

The @code{decimal} module makes it possible to restore the identities by
expanding the precision sufficiently to avoid loss of significance:

@example
>>> getcontext().prec = 20
>>> u, v, w = Decimal(11111113), Decimal(-11111111), Decimal('7.51111111')
>>> (u + v) + w
Decimal('9.51111111')
>>> u + (v + w)
Decimal('9.51111111')
>>>
>>> u, v, w = Decimal(20000), Decimal(-6), Decimal('6.0000003')
>>> (u*v) + (u*w)
Decimal('0.0060000')
>>> u * (v+w)
Decimal('0.0060000')
@end example

@node Special values,,Mitigating round-off error with increased precision,Floating-point notes
@anchor{library/decimal special-values}@anchor{2bb6}
@subsubsection Special values


The number system for the @code{decimal} module provides special values
including @code{NaN}, @code{sNaN}, @code{-Infinity}, @code{Infinity},
and two zeros, @code{+0} and @code{-0}.

Infinities can be constructed directly with:  @code{Decimal('Infinity')}. Also,
they can arise from dividing by zero when the @ref{2b2b,,DivisionByZero} signal is
not trapped.  Likewise, when the @ref{2b2f,,Overflow} signal is not trapped, infinity
can result from rounding beyond the limits of the largest representable number.

The infinities are signed (affine) and can be used in arithmetic operations
where they get treated as very large, indeterminate numbers.  For instance,
adding a constant to infinity gives another infinite result.

Some operations are indeterminate and return @code{NaN}, or if the
@ref{12b4,,InvalidOperation} signal is trapped, raise an exception.  For example,
@code{0/0} returns @code{NaN} which means “not a number”.  This variety of
@code{NaN} is quiet and, once created, will flow through other computations
always resulting in another @code{NaN}.  This behavior can be useful for a
series of computations that occasionally have missing inputs — it allows the
calculation to proceed while flagging specific results as invalid.

A variant is @code{sNaN} which signals rather than remaining quiet after every
operation.  This is a useful return value when an invalid result needs to
interrupt a calculation for special handling.

The behavior of Python’s comparison operators can be a little surprising where a
@code{NaN} is involved.  A test for equality where one of the operands is a
quiet or signaling @code{NaN} always returns @ref{d31,,False} (even when doing
@code{Decimal('NaN')==Decimal('NaN')}), while a test for inequality always returns
@ref{e0d,,True}.  An attempt to compare two Decimals using any of the @code{<},
@code{<=}, @code{>} or @code{>=} operators will raise the @ref{12b4,,InvalidOperation} signal
if either operand is a @code{NaN}, and return @code{False} if this signal is
not trapped.  Note that the General Decimal Arithmetic specification does not
specify the behavior of direct comparisons; these rules for comparisons
involving a @code{NaN} were taken from the IEEE 854 standard (see Table 3 in
section 5.7).  To ensure strict standards-compliance, use the @ref{2b3a,,compare()}
and @ref{2b3b,,compare_signal()} methods instead.

The signed zeros can result from calculations that underflow. They keep the sign
that would have resulted if the calculation had been carried out to greater
precision.  Since their magnitude is zero, both positive and negative zeros are
treated as equal and their sign is informational.

In addition to the two signed zeros which are distinct yet equal, there are
various representations of zero with differing precisions yet equivalent in
value.  This takes a bit of getting used to.  For an eye accustomed to
normalized floating-point representations, it is not immediately obvious that
the following calculation returns a value equal to zero:

@example
>>> 1 / Decimal('Infinity')
Decimal('0E-1000026')
@end example

@c %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

@node Working with threads,Recipes,Floating-point notes,decimal — Decimal fixed-point and floating-point arithmetic
@anchor{library/decimal decimal-threads}@anchor{2bb7}@anchor{library/decimal working-with-threads}@anchor{2bb8}
@subsubsection Working with threads


The @ref{197b,,getcontext()} function accesses a different @ref{12bb,,Context} object for
each thread.  Having separate thread contexts means that threads may make
changes (such as @code{getcontext().prec=10}) without interfering with other threads.

Likewise, the @ref{2b33,,setcontext()} function automatically assigns its target to
the current thread.

If @ref{2b33,,setcontext()} has not been called before @ref{197b,,getcontext()}, then
@code{getcontext()} will automatically create a new context for use in the
current thread.  New context objects have default values set from the
@ref{12af,,decimal.DefaultContext} object.

The @ref{176,,sys.flags.thread_inherit_context} flag affects the context for
new threads.  If the flag is false, new threads will start with an empty
context.  In this case, @ref{197b,,getcontext()} will create a new context object
when called and use the default values from `DefaultContext'.  If the flag
is true, new threads will start with a copy of context from the caller of
@ref{179,,threading.Thread.start()}.

To control the defaults so that each thread will use the same values throughout
the application, directly modify the `DefaultContext' object. This should be
done `before' any threads are started so that there won’t be a race condition
between threads calling @ref{197b,,getcontext()}. For example:

@example
# Set applicationwide defaults for all threads about to be launched
DefaultContext.prec = 12
DefaultContext.rounding = ROUND_DOWN
DefaultContext.traps = ExtendedContext.traps.copy()
DefaultContext.traps[InvalidOperation] = 1
setcontext(DefaultContext)

# Afterwards, the threads can be started
t1.start()
t2.start()
t3.start()
 . . .
@end example

@c %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

@node Recipes,Decimal FAQ,Working with threads,decimal — Decimal fixed-point and floating-point arithmetic
@anchor{library/decimal decimal-recipes}@anchor{2bb9}@anchor{library/decimal recipes}@anchor{2bba}
@subsubsection Recipes


Here are a few recipes that serve as utility functions and that demonstrate ways
to work with the @ref{200,,Decimal} class:

@example
def moneyfmt(value, places=2, curr='@w{'}, sep=',', dp='.',
             pos='@w{'}, neg='-', trailneg='@w{'}):
    """Convert Decimal to a money formatted string.

    places:  required number of places after the decimal point
    curr:    optional currency symbol before the sign (may be blank)
    sep:     optional grouping separator (comma, period, space, or blank)
    dp:      decimal point indicator (comma or period)
             only specify as blank when places is zero
    pos:     optional sign for positive numbers: '+', space or blank
    neg:     optional sign for negative numbers: '-', '(', space or blank
    trailneg:optional trailing minus indicator:  '-', ')', space or blank

    >>> d = Decimal('-1234567.8901')
    >>> moneyfmt(d, curr='$')
    '-$1,234,567.89'
    >>> moneyfmt(d, places=0, sep='.', dp='@w{'}, neg='@w{'}, trailneg='-')
    '1.234.568-'
    >>> moneyfmt(d, curr='$', neg='(', trailneg=')')
    '($1,234,567.89)'
    >>> moneyfmt(Decimal(123456789), sep=' ')
    '123 456 789.00'
    >>> moneyfmt(Decimal('-0.02'), neg='<', trailneg='>')
    '<0.02>'

    """
    q = Decimal(10) ** -places      # 2 places --> '0.01'
    sign, digits, exp = value.quantize(q).as_tuple()
    result = []
    digits = list(map(str, digits))
    build, next = result.append, digits.pop
    if sign:
        build(trailneg)
    for i in range(places):
        build(next() if digits else '0')
    if places:
        build(dp)
    if not digits:
        build('0')
    i = 0
    while digits:
        build(next())
        i += 1
        if i == 3 and digits:
            i = 0
            build(sep)
    build(curr)
    build(neg if sign else pos)
    return '@w{'}.join(reversed(result))

def pi():
    """Compute Pi to the current precision.

    >>> print(pi())
    3.141592653589793238462643383

    """
    getcontext().prec += 2  # extra digits for intermediate steps
    three = Decimal(3)      # substitute "three=3.0" for regular floats
    lasts, t, s, n, na, d, da = 0, three, 3, 1, 0, 0, 24
    while s != lasts:
        lasts = s
        n, na = n+na, na+8
        d, da = d+da, da+32
        t = (t * n) / d
        s += t
    getcontext().prec -= 2
    return +s               # unary plus applies the new precision

def exp(x):
    """Return e raised to the power of x.  Result type matches input type.

    >>> print(exp(Decimal(1)))
    2.718281828459045235360287471
    >>> print(exp(Decimal(2)))
    7.389056098930650227230427461
    >>> print(exp(2.0))
    7.38905609893
    >>> print(exp(2+0j))
    (7.38905609893+0j)

    """
    getcontext().prec += 2
    i, lasts, s, fact, num = 0, 0, 1, 1, 1
    while s != lasts:
        lasts = s
        i += 1
        fact *= i
        num *= x
        s += num / fact
    getcontext().prec -= 2
    return +s

def cos(x):
    """Return the cosine of x as measured in radians.

    The Taylor series approximation works best for a small value of x.
    For larger values, first compute x = x % (2 * pi).

    >>> print(cos(Decimal('0.5')))
    0.8775825618903727161162815826
    >>> print(cos(0.5))
    0.87758256189
    >>> print(cos(0.5+0j))
    (0.87758256189+0j)

    """
    getcontext().prec += 2
    i, lasts, s, fact, num, sign = 0, 0, 1, 1, 1, 1
    while s != lasts:
        lasts = s
        i += 2
        fact *= i * (i-1)
        num *= x * x
        sign *= -1
        s += num / fact * sign
    getcontext().prec -= 2
    return +s

def sin(x):
    """Return the sine of x as measured in radians.

    The Taylor series approximation works best for a small value of x.
    For larger values, first compute x = x % (2 * pi).

    >>> print(sin(Decimal('0.5')))
    0.4794255386042030002732879352
    >>> print(sin(0.5))
    0.479425538604
    >>> print(sin(0.5+0j))
    (0.479425538604+0j)

    """
    getcontext().prec += 2
    i, lasts, s, fact, num, sign = 1, 0, x, 1, x, 1
    while s != lasts:
        lasts = s
        i += 2
        fact *= i * (i-1)
        num *= x * x
        sign *= -1
        s += num / fact * sign
    getcontext().prec -= 2
    return +s
@end example

@c %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

@node Decimal FAQ,,Recipes,decimal — Decimal fixed-point and floating-point arithmetic
@anchor{library/decimal decimal-faq}@anchor{2bbb}@anchor{library/decimal id1}@anchor{2bbc}
@subsubsection Decimal FAQ


Q: It is cumbersome to type @code{decimal.Decimal('1234.5')}.  Is there a way to
minimize typing when using the interactive interpreter?

A: Some users abbreviate the constructor to just a single letter:

@example
>>> D = decimal.Decimal
>>> D('1.23') + D('3.45')
Decimal('4.68')
@end example

Q: In a fixed-point application with two decimal places, some inputs have many
places and need to be rounded.  Others are not supposed to have excess digits
and need to be validated.  What methods should be used?

A: The @ref{12bc,,quantize()} method rounds to a fixed number of decimal places. If
the @ref{2b2c,,Inexact} trap is set, it is also useful for validation:

@example
>>> TWOPLACES = Decimal(10) ** -2       # same as Decimal('0.01')
@end example

@example
>>> # Round to two places
>>> Decimal('3.214').quantize(TWOPLACES)
Decimal('3.21')
@end example

@example
>>> # Validate that a number does not exceed two places
>>> Decimal('3.21').quantize(TWOPLACES, context=Context(traps=[Inexact]))
Decimal('3.21')
@end example

@example
>>> Decimal('3.214').quantize(TWOPLACES, context=Context(traps=[Inexact]))
Traceback (most recent call last):
   ...
Inexact: None
@end example

Q: Once I have valid two place inputs, how do I maintain that invariant
throughout an application?

A: Some operations like addition, subtraction, and multiplication by an integer
will automatically preserve fixed point.  Others operations, like division and
non-integer multiplication, will change the number of decimal places and need to
be followed-up with a @ref{12bc,,quantize()} step:

@example
>>> a = Decimal('102.72')           # Initial fixed-point values
>>> b = Decimal('3.17')
>>> a + b                           # Addition preserves fixed-point
Decimal('105.89')
>>> a - b
Decimal('99.55')
>>> a * 42                          # So does integer multiplication
Decimal('4314.24')
>>> (a * b).quantize(TWOPLACES)     # Must quantize non-integer multiplication
Decimal('325.62')
>>> (b / a).quantize(TWOPLACES)     # And quantize division
Decimal('0.03')
@end example

In developing fixed-point applications, it is convenient to define functions
to handle the @ref{12bc,,quantize()} step:

@example
>>> def mul(x, y, fp=TWOPLACES):
...     return (x * y).quantize(fp)
...
>>> def div(x, y, fp=TWOPLACES):
...     return (x / y).quantize(fp)
@end example

@example
>>> mul(a, b)                       # Automatically preserve fixed-point
Decimal('325.62')
>>> div(b, a)
Decimal('0.03')
@end example

Q: There are many ways to express the same value.  The numbers @code{200},
@code{200.000}, @code{2E2}, and @code{.02E+4} all have the same value at
various precisions. Is there a way to transform them to a single recognizable
canonical value?

A: The @ref{2b5b,,normalize()} method maps all equivalent values to a single
representative:

@example
>>> values = map(Decimal, '200 200.000 2E2 .02E+4'.split())
>>> [v.normalize() for v in values]
[Decimal('2E+2'), Decimal('2E+2'), Decimal('2E+2'), Decimal('2E+2')]
@end example

Q: When does rounding occur in a computation?

A: It occurs `after' the computation.  The philosophy of the decimal
specification is that numbers are considered exact and are created
independent of the current context.  They can even have greater
precision than current context.  Computations process with those
exact inputs and then rounding (or other context operations) is
applied to the `result' of the computation:

@example
>>> getcontext().prec = 5
>>> pi = Decimal('3.1415926535')   # More than 5 digits
>>> pi                             # All digits are retained
Decimal('3.1415926535')
>>> pi + 0                         # Rounded after an addition
Decimal('3.1416')
>>> pi - Decimal('0.00005')        # Subtract unrounded numbers, then round
Decimal('3.1415')
>>> pi + 0 - Decimal('0.00005').   # Intermediate values are rounded
Decimal('3.1416')
@end example

Q: Some decimal values always print with exponential notation.  Is there a way
to get a non-exponential representation?

A: For some values, exponential notation is the only way to express the number
of significant places in the coefficient.  For example, expressing
@code{5.0E+3} as @code{5000} keeps the value constant but cannot show the
original’s two-place significance.

If an application does not care about tracking significance, it is easy to
remove the exponent and trailing zeroes, losing significance, but keeping the
value unchanged:

@example
>>> def remove_exponent(d):
...     return d.quantize(Decimal(1)) if d == d.to_integral() else d.normalize()
@end example

@example
>>> remove_exponent(Decimal('5E+3'))
Decimal('5000')
@end example

Q: Is there a way to convert a regular float to a @ref{200,,Decimal}?

A: Yes, any binary floating-point number can be exactly expressed as a
Decimal though an exact conversion may take more precision than intuition would
suggest:

@example
>>> Decimal(math.pi)
Decimal('3.141592653589793115997963468544185161590576171875')
@end example

Q: Within a complex calculation, how can I make sure that I haven’t gotten a
spurious result because of insufficient precision or rounding anomalies.

A: The decimal module makes it easy to test results.  A best practice is to
re-run calculations using greater precision and with various rounding modes.
Widely differing results indicate insufficient precision, rounding mode issues,
ill-conditioned inputs, or a numerically unstable algorithm.

Q: I noticed that context precision is applied to the results of operations but
not to the inputs.  Is there anything to watch out for when mixing values of
different precisions?

A: Yes.  The principle is that all values are considered to be exact and so is
the arithmetic on those values.  Only the results are rounded.  The advantage
for inputs is that “what you type is what you get”.  A disadvantage is that the
results can look odd if you forget that the inputs haven’t been rounded:

@example
>>> getcontext().prec = 3
>>> Decimal('3.104') + Decimal('2.104')
Decimal('5.21')
>>> Decimal('3.104') + Decimal('0.000') + Decimal('2.104')
Decimal('5.20')
@end example

The solution is either to increase precision or to force rounding of inputs
using the unary plus operation:

@example
>>> getcontext().prec = 3
>>> +Decimal('1.23456789')      # unary plus triggers rounding
Decimal('1.23')
@end example

Alternatively, inputs can be rounded upon creation using the
@ref{12b5,,Context.create_decimal()} method:

@example
>>> Context(prec=5, rounding=ROUND_DOWN).create_decimal('1.2345678')
Decimal('1.2345')
@end example

Q: Is the CPython implementation fast for large numbers?

A: Yes.  In the CPython and PyPy3 implementations, the C/CFFI versions of
the decimal module integrate the high speed libmpdec@footnote{https://www.bytereef.org/mpdecimal/doc/libmpdec/index.html} library for
arbitrary precision correctly rounded decimal floating-point arithmetic @footnote{

Added in version 3.3.

}.
@code{libmpdec} uses Karatsuba multiplication@footnote{https://en.wikipedia.org/wiki/Karatsuba_algorithm}
for medium-sized numbers and the Number Theoretic Transform@footnote{https://en.wikipedia.org/wiki/Discrete_Fourier_transform_(general)#Number-theoretic_transform}
for very large numbers.

The context must be adapted for exact arbitrary precision arithmetic. @ref{12b3,,Emin}
and @ref{12b2,,Emax} should always be set to the maximum values, @ref{13aa,,clamp}
should always be 0 (the default).  Setting @ref{2b6c,,prec} requires some care.

The easiest approach for trying out bignum arithmetic is to use the maximum
value for @ref{2b6c,,prec} as well @footnote{

Changed in version 3.9: This approach now works for all exact results except for non-integer powers.

}:

@example
>>> setcontext(Context(prec=MAX_PREC, Emax=MAX_EMAX, Emin=MIN_EMIN))
>>> x = Decimal(2) ** 256
>>> x / 128
Decimal('904625697166532776746648320380374280103671755200316906558262375061821325312')
@end example

For inexact results, @ref{12ac,,MAX_PREC} is far too large on 64-bit platforms and
the available memory will be insufficient:

@example
>>> Decimal(1) / 3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
MemoryError
@end example

On systems with overallocation (e.g. Linux), a more sophisticated approach is to
adjust @ref{2b6c,,prec} to the amount of available RAM.  Suppose that you have 8GB of
RAM and expect 10 simultaneous operands using a maximum of 500MB each:

@example
>>> import sys
>>>
>>> # Maximum number of digits for a single operand using 500MB in 8-byte words
>>> # with 19 digits per word (4-byte and 9 digits for the 32-bit build):
>>> maxdigits = 19 * ((500 * 1024**2) // 8)
>>>
>>> # Check that this works:
>>> c = Context(prec=maxdigits, Emax=MAX_EMAX, Emin=MIN_EMIN)
>>> c.traps[Inexact] = True
>>> setcontext(c)
>>>
>>> # Fill the available precision with nines:
>>> x = Decimal(0).logical_invert() * 9
>>> sys.getsizeof(x)
524288112
>>> x + 2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  decimal.Inexact: [<class 'decimal.Inexact'>]
@end example

In general (and especially on systems without overallocation), it is recommended
to estimate even tighter bounds and set the @ref{2b2c,,Inexact} trap if all calculations
are expected to be exact.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node fractions — Rational numbers,random — Generate pseudo-random numbers,decimal — Decimal fixed-point and floating-point arithmetic,Numeric and Mathematical Modules
@anchor{library/fractions doc}@anchor{2bbd}@anchor{library/fractions fractions-rational-numbers}@anchor{2bbe}@anchor{library/fractions module-fractions}@anchor{61}@anchor{library/fractions translation-repo}@anchor{2bbf}
@subsection @code{fractions} — Rational numbers


@geindex module; fractions

`Source code:' Lib/fractions.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/fractions.py}


__________________________________________________________________


The @code{fractions} module provides support for rational number arithmetic.

A Fraction instance can be constructed from a pair of rational numbers, from
a single number, or from a string.

@geindex as_integer_ratio()

@geindex Fraction (class in fractions)
@anchor{library/fractions fractions Fraction}@anchor{215}
@deffn {Class} fractions.Fraction (numerator=0, denominator=1)

@deffnx {Class} fractions.Fraction (number)

@deffnx {Class} fractions.Fraction (string)

The first version requires that `numerator' and `denominator' are instances
of @ref{14ca,,numbers.Rational} and returns a new @code{Fraction} instance
with a value equal to @code{numerator/denominator}.
If `denominator' is zero, it raises a @ref{b45,,ZeroDivisionError}.

The second version requires that `number' is an instance of
@ref{14ca,,numbers.Rational} or has the @code{as_integer_ratio()} method
(this includes @ref{197,,float} and @ref{200,,decimal.Decimal}).
It returns a @code{Fraction} instance with exactly the same value.
Assumed, that the @code{as_integer_ratio()} method returns a pair
of coprime integers and last one is positive.
Note that due to the
usual issues with binary point (see @ref{2144,,Floating-Point Arithmetic; Issues and Limitations}), the
argument to @code{Fraction(1.1)} is not exactly equal to 11/10, and so
@code{Fraction(1.1)} does `not' return @code{Fraction(11, 10)} as one might expect.
(But see the documentation for the @ref{2bc0,,limit_denominator()} method below.)

The last version of the constructor expects a string.
The usual form for this instance is:

@example
[sign] numerator ['/' denominator]
@end example

where the optional @code{sign} may be either ‘+’ or ‘-’ and
@code{numerator} and @code{denominator} (if present) are strings of
decimal digits (underscores may be used to delimit digits as with
integral literals in code).  In addition, any string that represents a finite
value and is accepted by the @ref{197,,float} constructor is also
accepted by the @code{Fraction} constructor.  In either form the
input string may also have leading and/or trailing whitespace.
Here are some examples:

@example
>>> from fractions import Fraction
>>> Fraction(16, -10)
Fraction(-8, 5)
>>> Fraction(123)
Fraction(123, 1)
>>> Fraction()
Fraction(0, 1)
>>> Fraction('3/7')
Fraction(3, 7)
>>> Fraction(' -3/7 ')
Fraction(-3, 7)
>>> Fraction('1.414213 \t\n')
Fraction(1414213, 1000000)
>>> Fraction('-.125')
Fraction(-1, 8)
>>> Fraction('7e-6')
Fraction(7, 1000000)
>>> Fraction(2.25)
Fraction(9, 4)
>>> Fraction(1.1)
Fraction(2476979795053773, 2251799813685248)
>>> from decimal import Decimal
>>> Fraction(Decimal('1.1'))
Fraction(11, 10)
@end example

The @code{Fraction} class inherits from the abstract base class
@ref{14ca,,numbers.Rational}, and implements all of the methods and
operations from that class.  @code{Fraction} instances are @ref{825,,hashable},
and should be treated as immutable.  In addition,
@code{Fraction} has the following properties and methods:


Changed in version 3.2: The @code{Fraction} constructor now accepts @ref{197,,float} and
@ref{200,,decimal.Decimal} instances.



Changed in version 3.9: The @ref{b12,,math.gcd()} function is now used to normalize the `numerator'
and `denominator'. @code{math.gcd()} always returns an @ref{19c,,int} type.
Previously, the GCD type depended on `numerator' and `denominator'.



Changed in version 3.11: Underscores are now permitted when creating a @code{Fraction} instance
from a string, following 
@geindex Python Enhancement Proposals; PEP 515
PEP 515@footnote{https://peps.python.org/pep-0515/} rules.



Changed in version 3.11: @code{Fraction} implements @code{__int__} now to satisfy
@code{typing.SupportsInt} instance checks.



Changed in version 3.12: Space is allowed around the slash for string inputs: @code{Fraction('2 / 3')}.



Changed in version 3.12: @code{Fraction} instances now support float-style formatting, with
presentation types @code{"e"}, @code{"E"}, @code{"f"}, @code{"F"}, @code{"g"}, @code{"G"}
and @code{"%""}.



Changed in version 3.13: Formatting of @code{Fraction} instances without a presentation type
now supports fill, alignment, sign handling, minimum width and grouping.



Changed in version 3.14: The @code{Fraction} constructor now accepts any objects with the
@code{as_integer_ratio()} method.


@geindex numerator (fractions.Fraction attribute)
@anchor{library/fractions fractions Fraction numerator}@anchor{2bc1}
@deffn {Attribute} numerator

Numerator of the Fraction in lowest term.
@end deffn

@geindex denominator (fractions.Fraction attribute)
@anchor{library/fractions fractions Fraction denominator}@anchor{2bc2}
@deffn {Attribute} denominator

Denominator of the Fraction in lowest terms.
Guaranteed to be positive.
@end deffn

@geindex as_integer_ratio() (fractions.Fraction method)
@anchor{library/fractions fractions Fraction as_integer_ratio}@anchor{2bc3}
@deffn {Method} as_integer_ratio ()

Return a tuple of two integers, whose ratio is equal
to the original Fraction.  The ratio is in lowest terms
and has a positive denominator.


Added in version 3.8.

@end deffn

@geindex is_integer() (fractions.Fraction method)
@anchor{library/fractions fractions Fraction is_integer}@anchor{2bc4}
@deffn {Method} is_integer ()

Return @code{True} if the Fraction is an integer.


Added in version 3.12.

@end deffn

@geindex from_float() (fractions.Fraction class method)
@anchor{library/fractions fractions Fraction from_float}@anchor{1411}
@deffn {Method} classmethod from_float (f)

Alternative constructor which only accepts instances of
@ref{197,,float} or @ref{2451,,numbers.Integral}. Beware that
@code{Fraction.from_float(0.3)} is not the same value as @code{Fraction(3, 10)}.

@cartouche
@quotation Note 
From Python 3.2 onwards, you can also construct a
@code{Fraction} instance directly from a @ref{197,,float}.
@end quotation
@end cartouche
@end deffn

@geindex from_decimal() (fractions.Fraction class method)
@anchor{library/fractions fractions Fraction from_decimal}@anchor{1412}
@deffn {Method} classmethod from_decimal (dec)

Alternative constructor which only accepts instances of
@ref{200,,decimal.Decimal} or @ref{2451,,numbers.Integral}.

@cartouche
@quotation Note 
From Python 3.2 onwards, you can also construct a
@code{Fraction} instance directly from a @ref{200,,decimal.Decimal}
instance.
@end quotation
@end cartouche
@end deffn

@geindex from_number() (fractions.Fraction class method)
@anchor{library/fractions fractions Fraction from_number}@anchor{216}
@deffn {Method} classmethod from_number (number)

Alternative constructor which only accepts instances of
@ref{2451,,numbers.Integral}, @ref{14ca,,numbers.Rational},
@ref{197,,float} or @ref{200,,decimal.Decimal}, and objects with
the @code{as_integer_ratio()} method, but not strings.


Added in version 3.14.

@end deffn

@geindex limit_denominator() (fractions.Fraction method)
@anchor{library/fractions fractions Fraction limit_denominator}@anchor{2bc0}
@deffn {Method} limit_denominator (max_denominator=1000000)

Finds and returns the closest @code{Fraction} to @code{self} that has
denominator at most max_denominator.  This method is useful for finding
rational approximations to a given floating-point number:

@example
>>> from fractions import Fraction
>>> Fraction('3.1415926535897932').limit_denominator(1000)
Fraction(355, 113)
@end example

or for recovering a rational number that’s represented as a float:

@example
>>> from math import pi, cos
>>> Fraction(cos(pi/3))
Fraction(4503599627370497, 9007199254740992)
>>> Fraction(cos(pi/3)).limit_denominator()
Fraction(1, 2)
>>> Fraction(1.1).limit_denominator()
Fraction(11, 10)
@end example
@end deffn

@geindex __floor__() (fractions.Fraction method)
@anchor{library/fractions fractions Fraction __floor__}@anchor{1b3b}
@deffn {Method} __floor__ ()

Returns the greatest @ref{19c,,int} @code{<= self}.  This method can
also be accessed through the @ref{15c9,,math.floor()} function:

@example
>>> from math import floor
>>> floor(Fraction(355, 113))
3
@end example
@end deffn

@geindex __ceil__() (fractions.Fraction method)
@anchor{library/fractions fractions Fraction __ceil__}@anchor{1b3a}
@deffn {Method} __ceil__ ()

Returns the least @ref{19c,,int} @code{>= self}.  This method can
also be accessed through the @ref{15ca,,math.ceil()} function.
@end deffn

@geindex __round__() (fractions.Fraction method)
@anchor{library/fractions fractions Fraction __round__}@anchor{1b39}
@deffn {Method} __round__ ()

@deffnx {Method} __round__ (ndigits)

The first version returns the nearest @ref{19c,,int} to @code{self},
rounding half to even. The second version rounds @code{self} to the
nearest multiple of @code{Fraction(1, 10**ndigits)} (logically, if
@code{ndigits} is negative), again rounding half toward even.  This
method can also be accessed through the @ref{14e6,,round()} function.
@end deffn

@geindex __format__() (fractions.Fraction method)
@anchor{library/fractions fractions Fraction __format__}@anchor{2bc5}
@deffn {Method} __format__ (format_spec, /)

Provides support for formatting of @code{Fraction} instances via the
@ref{834,,str.format()} method, the @ref{19a,,format()} built-in function, or
@ref{19b,,Formatted string literals}.

If the @code{format_spec} format specification string does not end with one
of the presentation types @code{'e'}, @code{'E'}, @code{'f'}, @code{'F'}, @code{'g'},
@code{'G'} or @code{'%'} then formatting follows the general rules for fill,
alignment, sign handling, minimum width, and grouping as described in the
@ref{4fa,,format specification mini-language}. The “alternate
form” flag @code{'#'} is supported: if present, it forces the output string
to always include an explicit denominator, even when the value being
formatted is an exact integer. The zero-fill flag @code{'0'} is not
supported.

If the @code{format_spec} format specification string ends with one of
the presentation types @code{'e'}, @code{'E'}, @code{'f'}, @code{'F'}, @code{'g'},
@code{'G'} or @code{'%'} then formatting follows the rules outlined for the
@ref{197,,float} type in the @ref{4fa,,Format specification mini-language} section.

Here are some examples:

@example
>>> from fractions import Fraction
>>> format(Fraction(103993, 33102), '_')
'103_993/33_102'
>>> format(Fraction(1, 7), '.^+10')
'...+1/7...'
>>> format(Fraction(3, 1), '@w{'})
'3'
>>> format(Fraction(3, 1), '#')
'3/1'
>>> format(Fraction(1, 7), '.40g')
'0.1428571428571428571428571428571428571429'
>>> format(Fraction('1234567.855'), '_.2f')
'1_234_567.86'
>>> f"@{Fraction(355, 113):*>20.6e@}"
'********3.141593e+00'
>>> old_price, new_price = 499, 672
>>> "@{:.2%@} price increase".format(Fraction(new_price, old_price) - 1)
'34.67% price increase'
@end example
@end deffn
@end deffn


@subsubheading See also



@table @asis

@item Module @ref{a2,,numbers}

The abstract base classes making up the numeric tower.
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node random — Generate pseudo-random numbers,statistics — Mathematical statistics functions,fractions — Rational numbers,Numeric and Mathematical Modules
@anchor{library/random doc}@anchor{2bc6}@anchor{library/random module-random}@anchor{bd}@anchor{library/random random-generate-pseudo-random-numbers}@anchor{2bc7}@anchor{library/random translation-repo}@anchor{2bc8}
@subsection @code{random} — Generate pseudo-random numbers


@geindex module; random

`Source code:' Lib/random.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/random.py}


__________________________________________________________________


This module implements pseudo-random number generators for various
distributions.

For integers, there is uniform selection from a range. For sequences, there is
uniform selection of a random element, a function to generate a random
permutation of a list in-place, and a function for random sampling without
replacement.

On the real line, there are functions to compute uniform, normal (Gaussian),
lognormal, negative exponential, gamma, and beta distributions. For generating
distributions of angles, the von Mises distribution is available.

Almost all module functions depend on the basic function @ref{954,,random()}, which
generates a random float uniformly in the half-open range @code{0.0 <= X < 1.0}.
Python uses the Mersenne Twister as the core generator.  It produces 53-bit precision
floats and has a period of 2**19937-1.  The underlying implementation in C is
both fast and threadsafe.  The Mersenne Twister is one of the most extensively
tested random number generators in existence.  However, being completely
deterministic, it is not suitable for all purposes, and is completely unsuitable
for cryptographic purposes.

The functions supplied by this module are actually bound methods of a hidden
instance of the @ref{1c9f,,random.Random} class.  You can instantiate your own
instances of @ref{1c9f,,Random} to get generators that don’t share state.

Class @ref{1c9f,,Random} can also be subclassed if you want to use a different
basic generator of your own devising: see the documentation on that class for
more details.

The @code{random} module also provides the @ref{2bc9,,SystemRandom} class which
uses the system function @ref{747,,os.urandom()} to generate random numbers
from sources provided by the operating system.

@cartouche
@quotation Warning 
The pseudo-random generators of this module should not be used for
security purposes.  For security or cryptographic uses, see the
@ref{c5,,secrets} module.
@end quotation
@end cartouche


@subsubheading See also


M. Matsumoto and T. Nishimura, “Mersenne Twister: A 623-dimensionally
equidistributed uniform pseudorandom number generator”, ACM Transactions on
Modeling and Computer Simulation Vol. 8, No. 1, January pp.3–30 1998.

Complementary-Multiply-with-Carry recipe@footnote{https://code.activestate.com/recipes/576707-long-period-random-number-generator/} for a compatible alternative
random number generator with a long period and comparatively simple update
operations.


@cartouche
@quotation Note 
The global random number generator and instances of @ref{1c9f,,Random} are thread-safe.
However, in the free-threaded build, concurrent calls to the global generator or
to the same instance of @code{Random} may encounter contention and poor performance.
Consider using separate instances of @code{Random} per thread instead.
@end quotation
@end cartouche

@menu
* Bookkeeping functions:: 
* Functions for bytes:: 
* Functions for integers:: 
* Functions for sequences:: 
* Discrete distributions:: 
* Real-valued distributions:: 
* Alternative Generator:: 
* Notes on Reproducibility:: 
* Examples: Examples<4>. 
* Recipes: Recipes<2>. 
* Command-line usage: Command-line usage<2>. 
* Command-line example:: 

@end menu

@node Bookkeeping functions,Functions for bytes,,random — Generate pseudo-random numbers
@anchor{library/random bookkeeping-functions}@anchor{2bca}
@subsubsection Bookkeeping functions


@geindex seed() (in module random)
@anchor{library/random random seed}@anchor{147f}
@deffn {Function} random.seed (a=None, version=2)

Initialize the random number generator.

If `a' is omitted or @code{None}, the current system time is used.  If
randomness sources are provided by the operating system, they are used
instead of the system time (see the @ref{747,,os.urandom()} function for details
on availability).

If `a' is an int, its absolute value is used directly.

With version 2 (the default), a @ref{16a,,str}, @ref{193,,bytes}, or @ref{342,,bytearray}
object gets converted to an @ref{19c,,int} and all of its bits are used.

With version 1 (provided for reproducing random sequences from older versions
of Python), the algorithm for @ref{16a,,str} and @ref{193,,bytes} generates a
narrower range of seeds.


Changed in version 3.2: Moved to the version 2 scheme which uses all of the bits in a string seed.



Changed in version 3.11: The `seed' must be one of the following types:
@code{None}, @ref{19c,,int}, @ref{197,,float}, @ref{16a,,str},
@ref{193,,bytes}, or @ref{342,,bytearray}.

@end deffn

@geindex getstate() (in module random)
@anchor{library/random random getstate}@anchor{2bcb}
@deffn {Function} random.getstate ()

Return an object capturing the current internal state of the generator.  This
object can be passed to @ref{2bcc,,setstate()} to restore the state.
@end deffn

@geindex setstate() (in module random)
@anchor{library/random random setstate}@anchor{2bcc}
@deffn {Function} random.setstate (state)

`state' should have been obtained from a previous call to @ref{2bcb,,getstate()}, and
@code{setstate()} restores the internal state of the generator to what it was at
the time @code{getstate()} was called.
@end deffn

@node Functions for bytes,Functions for integers,Bookkeeping functions,random — Generate pseudo-random numbers
@anchor{library/random functions-for-bytes}@anchor{2bcd}
@subsubsection Functions for bytes


@geindex randbytes() (in module random)
@anchor{library/random random randbytes}@anchor{1870}
@deffn {Function} random.randbytes (n)

Generate `n' random bytes.

This method should not be used for generating security tokens.
Use @ref{2bce,,secrets.token_bytes()} instead.


Added in version 3.9.

@end deffn

@node Functions for integers,Functions for sequences,Functions for bytes,random — Generate pseudo-random numbers
@anchor{library/random functions-for-integers}@anchor{2bcf}
@subsubsection Functions for integers


@geindex randrange() (in module random)
@anchor{library/random random randrange}@anchor{a71}
@deffn {Function} random.randrange (stop)

@deffnx {Function} random.randrange (start, stop[, step])

Return a randomly selected element from @code{range(start, stop, step)}.

This is roughly equivalent to @code{choice(range(start, stop, step))} but
supports arbitrarily large ranges and is optimized for common cases.

The positional argument pattern matches the @ref{b43,,range()} function.

Keyword arguments should not be used because they can be interpreted
in unexpected ways. For example @code{randrange(start=100)} is interpreted
as @code{randrange(0, 100, 1)}.


Changed in version 3.2: @code{randrange()} is more sophisticated about producing equally distributed
values.  Formerly it used a style like @code{int(random()*n)} which could produce
slightly uneven distributions.



Changed in version 3.12: Automatic conversion of non-integer types is no longer supported.
Calls such as @code{randrange(10.0)} and @code{randrange(Fraction(10, 1))}
now raise a @ref{199,,TypeError}.

@end deffn

@geindex randint() (in module random)
@anchor{library/random random randint}@anchor{143b}
@deffn {Function} random.randint (a, b)

Return a random integer `N' such that @code{a <= N <= b}.  Alias for
@code{randrange(a, b+1)}.
@end deffn

@geindex getrandbits() (in module random)
@anchor{library/random random getrandbits}@anchor{1213}
@deffn {Function} random.getrandbits (k)

Returns a non-negative Python integer with `k' random bits. This method
is supplied with the Mersenne Twister generator and some other generators
may also provide it as an optional part of the API. When available,
@code{getrandbits()} enables @ref{a71,,randrange()} to handle arbitrarily large
ranges.


Changed in version 3.9: This method now accepts zero for `k'.

@end deffn

@node Functions for sequences,Discrete distributions,Functions for integers,random — Generate pseudo-random numbers
@anchor{library/random functions-for-sequences}@anchor{2bd0}
@subsubsection Functions for sequences


@geindex choice() (in module random)
@anchor{library/random random choice}@anchor{143c}
@deffn {Function} random.choice (seq)

Return a random element from the non-empty sequence `seq'. If `seq' is empty,
raises @ref{1741,,IndexError}.
@end deffn

@geindex choices() (in module random)
@anchor{library/random random choices}@anchor{ec7}
@deffn {Function} random.choices (population, weights=None, *, cum_weights=None, k=1)

Return a `k' sized list of elements chosen from the `population' with replacement.
If the `population' is empty, raises @ref{1741,,IndexError}.

If a `weights' sequence is specified, selections are made according to the
relative weights.  Alternatively, if a `cum_weights' sequence is given, the
selections are made according to the cumulative weights (perhaps computed
using @ref{bf6,,itertools.accumulate()}).  For example, the relative weights
@code{[10, 5, 30, 5]} are equivalent to the cumulative weights
@code{[10, 15, 45, 50]}.  Internally, the relative weights are converted to
cumulative weights before making selections, so supplying the cumulative
weights saves work.

If neither `weights' nor `cum_weights' are specified, selections are made
with equal probability.  If a weights sequence is supplied, it must be
the same length as the `population' sequence.  It is a @ref{199,,TypeError}
to specify both `weights' and `cum_weights'.

The `weights' or `cum_weights' can use any numeric type that interoperates
with the @ref{197,,float} values returned by @ref{bd,,random()} (that includes
integers, floats, and fractions but excludes decimals).  Weights are assumed
to be non-negative and finite.  A @ref{2ee,,ValueError} is raised if all
weights are zero.

For a given seed, the @code{choices()} function with equal weighting
typically produces a different sequence than repeated calls to
@ref{143c,,choice()}.  The algorithm used by @code{choices()} uses floating-point
arithmetic for internal consistency and speed.  The algorithm used
by @code{choice()} defaults to integer arithmetic with repeated selections
to avoid small biases from round-off error.


Added in version 3.6.



Changed in version 3.9: Raises a @ref{2ee,,ValueError} if all weights are zero.

@end deffn

@geindex shuffle() (in module random)
@anchor{library/random random shuffle}@anchor{953}
@deffn {Function} random.shuffle (x)

Shuffle the sequence `x' in place.

To shuffle an immutable sequence and return a new shuffled list, use
@code{sample(x, k=len(x))} instead.

Note that even for small @code{len(x)}, the total number of permutations of `x'
can quickly grow larger than the period of most random number generators.
This implies that most permutations of a long sequence can never be
generated.  For example, a sequence of length 2080 is the largest that
can fit within the period of the Mersenne Twister random number generator.


Changed in version 3.11: Removed the optional parameter `random'.

@end deffn

@geindex sample() (in module random)
@anchor{library/random random sample}@anchor{952}
@deffn {Function} random.sample (population, k, *, counts=None)

Return a `k' length list of unique elements chosen from the population
sequence.  Used for random sampling without replacement.

Returns a new list containing elements from the population while leaving the
original population unchanged.  The resulting list is in selection order so that
all sub-slices will also be valid random samples.  This allows raffle winners
(the sample) to be partitioned into grand prize and second place winners (the
subslices).

Members of the population need not be @ref{825,,hashable} or unique.  If the population
contains repeats, then each occurrence is a possible selection in the sample.

Repeated elements can be specified one at a time or with the optional
keyword-only `counts' parameter.  For example, @code{sample(['red', 'blue'],
counts=[4, 2], k=5)} is equivalent to @code{sample(['red', 'red', 'red', 'red',
'blue', 'blue'], k=5)}.

To choose a sample from a range of integers, use a @ref{b43,,range()} object as an
argument.  This is especially fast and space efficient for sampling from a large
population:  @code{sample(range(10000000), k=60)}.

If the sample size is larger than the population size, a @ref{2ee,,ValueError}
is raised.


Changed in version 3.9: Added the `counts' parameter.



Changed in version 3.11: The `population' must be a sequence.  Automatic conversion of sets
to lists is no longer supported.

@end deffn

@node Discrete distributions,Real-valued distributions,Functions for sequences,random — Generate pseudo-random numbers
@anchor{library/random discrete-distributions}@anchor{2bd1}
@subsubsection Discrete distributions


The following function generates a discrete distribution.

@geindex binomialvariate() (in module random)
@anchor{library/random random binomialvariate}@anchor{6d8}
@deffn {Function} random.binomialvariate (n=1, p=0.5)

Binomial distribution@footnote{https://mathworld.wolfram.com/BinomialDistribution.html}.
Return the number of successes for `n' independent trials with the
probability of success in each trial being `p':

Mathematically equivalent to:

@example
sum(random() < p for i in range(n))
@end example

The number of trials `n' should be a non-negative integer.
The probability of success `p' should be between @code{0.0 <= p <= 1.0}.
The result is an integer in the range @code{0 <= X <= n}.


Added in version 3.12.

@end deffn

@node Real-valued distributions,Alternative Generator,Discrete distributions,random — Generate pseudo-random numbers
@anchor{library/random id1}@anchor{2bd2}@anchor{library/random real-valued-distributions}@anchor{2bd3}
@subsubsection Real-valued distributions


The following functions generate specific real-valued distributions. Function
parameters are named after the corresponding variables in the distribution’s
equation, as used in common mathematical practice; most of these equations can
be found in any statistics text.

@geindex random() (in module random)
@anchor{library/random random random}@anchor{954}
@deffn {Function} random.random ()

Return the next random floating-point number in the range @code{0.0 <= X < 1.0}
@end deffn

@geindex uniform() (in module random)
@anchor{library/random random uniform}@anchor{2bd4}
@deffn {Function} random.uniform (a, b)

Return a random floating-point number `N' such that @code{a <= N <= b} for
@code{a <= b} and @code{b <= N <= a} for @code{b < a}.

The end-point value @code{b} may or may not be included in the range
depending on floating-point rounding in the expression
@code{a + (b-a) * random()}.
@end deffn

@geindex triangular() (in module random)
@anchor{library/random random triangular}@anchor{2bd5}
@deffn {Function} random.triangular (low, high, mode)

Return a random floating-point number `N' such that @code{low <= N <= high} and
with the specified `mode' between those bounds.  The `low' and `high' bounds
default to zero and one.  The `mode' argument defaults to the midpoint
between the bounds, giving a symmetric distribution.
@end deffn

@geindex betavariate() (in module random)
@anchor{library/random random betavariate}@anchor{2bd6}
@deffn {Function} random.betavariate (alpha, beta)

Beta distribution.  Conditions on the parameters are @code{alpha > 0} and
@code{beta > 0}. Returned values range between 0 and 1.
@end deffn

@geindex expovariate() (in module random)
@anchor{library/random random expovariate}@anchor{6d9}
@deffn {Function} random.expovariate (lambd=1.0)

Exponential distribution.  `lambd' is 1.0 divided by the desired
mean.  It should be nonzero.  (The parameter would be called
“lambda”, but that is a reserved word in Python.)  Returned values
range from 0 to positive infinity if `lambd' is positive, and from
negative infinity to 0 if `lambd' is negative.


Changed in version 3.12: Added the default value for @code{lambd}.

@end deffn

@geindex gammavariate() (in module random)
@anchor{library/random random gammavariate}@anchor{2bd7}
@deffn {Function} random.gammavariate (alpha, beta)

Gamma distribution.  (`Not' the gamma function!)  The shape and
scale parameters, `alpha' and `beta', must have positive values.
(Calling conventions vary and some sources define ‘beta’
as the inverse of the scale).

The probability distribution function is:

@example
          x ** (alpha - 1) * math.exp(-x / beta)
pdf(x) =  --------------------------------------
            math.gamma(alpha) * beta ** alpha
@end example
@end deffn

@geindex gauss() (in module random)
@anchor{library/random random gauss}@anchor{1c1b}
@deffn {Function} random.gauss (mu=0.0, sigma=1.0)

Normal distribution, also called the Gaussian distribution.
`mu' is the mean,
and `sigma' is the standard deviation.  This is slightly faster than
the @ref{1c1c,,normalvariate()} function defined below.

Multithreading note:  When two threads call this function
simultaneously, it is possible that they will receive the
same return value.  This can be avoided in three ways.
1) Have each thread use a different instance of the random
number generator. 2) Put locks around all calls. 3) Use the
slower, but thread-safe @ref{1c1c,,normalvariate()} function instead.


Changed in version 3.11: `mu' and `sigma' now have default arguments.

@end deffn

@geindex lognormvariate() (in module random)
@anchor{library/random random lognormvariate}@anchor{2bd8}
@deffn {Function} random.lognormvariate (mu, sigma)

Log normal distribution.  If you take the natural logarithm of this
distribution, you’ll get a normal distribution with mean `mu' and standard
deviation `sigma'.  `mu' can have any value, and `sigma' must be greater than
zero.
@end deffn

@geindex normalvariate() (in module random)
@anchor{library/random random normalvariate}@anchor{1c1c}
@deffn {Function} random.normalvariate (mu=0.0, sigma=1.0)

Normal distribution.  `mu' is the mean, and `sigma' is the standard deviation.


Changed in version 3.11: `mu' and `sigma' now have default arguments.

@end deffn

@geindex vonmisesvariate() (in module random)
@anchor{library/random random vonmisesvariate}@anchor{2bd9}
@deffn {Function} random.vonmisesvariate (mu, kappa)

`mu' is the mean angle, expressed in radians between 0 and 2*`pi', and `kappa'
is the concentration parameter, which must be greater than or equal to zero.  If
`kappa' is equal to zero, this distribution reduces to a uniform random angle
over the range 0 to 2*`pi'.
@end deffn

@geindex paretovariate() (in module random)
@anchor{library/random random paretovariate}@anchor{2bda}
@deffn {Function} random.paretovariate (alpha)

Pareto distribution.  `alpha' is the shape parameter.
@end deffn

@geindex weibullvariate() (in module random)
@anchor{library/random random weibullvariate}@anchor{2bdb}
@deffn {Function} random.weibullvariate (alpha, beta)

Weibull distribution.  `alpha' is the scale parameter and `beta' is the shape
parameter.
@end deffn

@node Alternative Generator,Notes on Reproducibility,Real-valued distributions,random — Generate pseudo-random numbers
@anchor{library/random alternative-generator}@anchor{2bdc}
@subsubsection Alternative Generator


@geindex Random (class in random)
@anchor{library/random random Random}@anchor{1c9f}
@deffn {Class} random.Random ([seed])

Class that implements the default pseudo-random number generator used by the
@code{random} module.


Changed in version 3.11: Formerly the `seed' could be any hashable object.  Now it is limited to:
@code{None}, @ref{19c,,int}, @ref{197,,float}, @ref{16a,,str},
@ref{193,,bytes}, or @ref{342,,bytearray}.


Subclasses of @code{Random} should override the following methods if they
wish to make use of a different basic generator:

@geindex seed() (random.Random method)
@anchor{library/random random Random seed}@anchor{1dae}
@deffn {Method} seed (a=None, version=2)

Override this method in subclasses to customise the @code{seed()}
behaviour of @code{Random} instances.
@end deffn

@geindex getstate() (random.Random method)
@anchor{library/random random Random getstate}@anchor{2bdd}
@deffn {Method} getstate ()

Override this method in subclasses to customise the @code{getstate()}
behaviour of @code{Random} instances.
@end deffn

@geindex setstate() (random.Random method)
@anchor{library/random random Random setstate}@anchor{2bde}
@deffn {Method} setstate (state)

Override this method in subclasses to customise the @code{setstate()}
behaviour of @code{Random} instances.
@end deffn

@geindex random() (random.Random method)
@anchor{library/random random Random random}@anchor{2bdf}
@deffn {Method} random ()

Override this method in subclasses to customise the @code{random()}
behaviour of @code{Random} instances.
@end deffn

Optionally, a custom generator subclass can also supply the following method:

@geindex getrandbits() (random.Random method)
@anchor{library/random random Random getrandbits}@anchor{2be0}
@deffn {Method} getrandbits (k)

Override this method in subclasses to customise the
@code{getrandbits()} behaviour of @code{Random} instances.
@end deffn

@geindex randbytes() (random.Random method)
@anchor{library/random random Random randbytes}@anchor{b29}
@deffn {Method} randbytes (n)

Override this method in subclasses to customise the
@code{randbytes()} behaviour of @code{Random} instances.
@end deffn
@end deffn

@geindex SystemRandom (class in random)
@anchor{library/random random SystemRandom}@anchor{2bc9}
@deffn {Class} random.SystemRandom ([seed])

Class that uses the @ref{747,,os.urandom()} function for generating random numbers
from sources provided by the operating system. Not available on all systems.
Does not rely on software state, and sequences are not reproducible. Accordingly,
the @ref{147f,,seed()} method has no effect and is ignored.
The @ref{2bcb,,getstate()} and @ref{2bcc,,setstate()} methods raise
@ref{369,,NotImplementedError} if called.
@end deffn

@node Notes on Reproducibility,Examples<4>,Alternative Generator,random — Generate pseudo-random numbers
@anchor{library/random notes-on-reproducibility}@anchor{2be1}
@subsubsection Notes on Reproducibility


Sometimes it is useful to be able to reproduce the sequences given by a
pseudo-random number generator.  By reusing a seed value, the same sequence should be
reproducible from run to run as long as multiple threads are not running.

Most of the random module’s algorithms and seeding functions are subject to
change across Python versions, but two aspects are guaranteed not to change:


@itemize *

@item 
If a new seeding method is added, then a backward compatible seeder will be
offered.

@item 
The generator’s @ref{2bdf,,random()} method will continue to produce the same
sequence when the compatible seeder is given the same seed.
@end itemize

@node Examples<4>,Recipes<2>,Notes on Reproducibility,random — Generate pseudo-random numbers
@anchor{library/random examples}@anchor{2be2}@anchor{library/random random-examples}@anchor{13e8}
@subsubsection Examples


Basic examples:

@example
>>> random()                          # Random float:  0.0 <= x < 1.0
0.37444887175646646

>>> uniform(2.5, 10.0)                # Random float:  2.5 <= x <= 10.0
3.1800146073117523

>>> expovariate(1 / 5)                # Interval between arrivals averaging 5 seconds
5.148957571865031

>>> randrange(10)                     # Integer from 0 to 9 inclusive
7

>>> randrange(0, 101, 2)              # Even integer from 0 to 100 inclusive
26

>>> choice(['win', 'lose', 'draw'])   # Single random element from a sequence
'draw'

>>> deck = 'ace two three four'.split()
>>> shuffle(deck)                     # Shuffle a list
>>> deck
['four', 'two', 'ace', 'three']

>>> sample([10, 20, 30, 40, 50], k=4) # Four samples without replacement
[40, 10, 50, 30]
@end example

Simulations:

@example
>>> # Six roulette wheel spins (weighted sampling with replacement)
>>> choices(['red', 'black', 'green'], [18, 18, 2], k=6)
['red', 'green', 'black', 'black', 'red', 'black']

>>> # Deal 20 cards without replacement from a deck
>>> # of 52 playing cards, and determine the proportion of cards
>>> # with a ten-value:  ten, jack, queen, or king.
>>> deal = sample(['tens', 'low cards'], counts=[16, 36], k=20)
>>> deal.count('tens') / 20
0.15

>>> # Estimate the probability of getting 5 or more heads from 7 spins
>>> # of a biased coin that settles on heads 60% of the time.
>>> sum(binomialvariate(n=7, p=0.6) >= 5 for i in range(10_000)) / 10_000
0.4169

>>> # Probability of the median of 5 samples being in middle two quartiles
>>> def trial():
...     return 2_500 <= sorted(choices(range(10_000), k=5))[2] < 7_500
...
>>> sum(trial() for i in range(10_000)) / 10_000
0.7958
@end example

Example of statistical bootstrapping@footnote{https://en.wikipedia.org/wiki/Bootstrapping_(statistics)} using resampling
with replacement to estimate a confidence interval for the mean of a sample:

@example
# https://www.thoughtco.com/example-of-bootstrapping-3126155
from statistics import fmean as mean
from random import choices

data = [41, 50, 29, 37, 81, 30, 73, 63, 20, 35, 68, 22, 60, 31, 95]
means = sorted(mean(choices(data, k=len(data))) for i in range(100))
print(f'The sample mean of @{mean(data):.1f@} has a 90% confidence '
      f'interval from @{means[5]:.1f@} to @{means[94]:.1f@}')
@end example

Example of a resampling permutation test@footnote{https://en.wikipedia.org/wiki/Resampling_(statistics)#Permutation_tests}
to determine the statistical significance or p-value@footnote{https://en.wikipedia.org/wiki/P-value} of an observed difference
between the effects of a drug versus a placebo:

@example
# Example from "Statistics is Easy" by Dennis Shasha and Manda Wilson
from statistics import fmean as mean
from random import shuffle

drug = [54, 73, 53, 70, 73, 68, 52, 65, 65]
placebo = [54, 51, 58, 44, 55, 52, 42, 47, 58, 46]
observed_diff = mean(drug) - mean(placebo)

n = 10_000
count = 0
combined = drug + placebo
for i in range(n):
    shuffle(combined)
    new_diff = mean(combined[:len(drug)]) - mean(combined[len(drug):])
    count += (new_diff >= observed_diff)

print(f'@{n@} label reshufflings produced only @{count@} instances with a difference')
print(f'at least as extreme as the observed difference of @{observed_diff:.1f@}.')
print(f'The one-sided p-value of @{count / n:.4f@} leads us to reject the null')
print(f'hypothesis that there is no difference between the drug and the placebo.')
@end example

Simulation of arrival times and service deliveries for a multiserver queue:

@example
from heapq import heapify, heapreplace
from random import expovariate, gauss
from statistics import mean, quantiles

average_arrival_interval = 5.6
average_service_time = 15.0
stdev_service_time = 3.5
num_servers = 3

waits = []
arrival_time = 0.0
servers = [0.0] * num_servers  # time when each server becomes available
heapify(servers)
for i in range(1_000_000):
    arrival_time += expovariate(1.0 / average_arrival_interval)
    next_server_available = servers[0]
    wait = max(0.0, next_server_available - arrival_time)
    waits.append(wait)
    service_duration = max(0.0, gauss(average_service_time, stdev_service_time))
    service_completed = arrival_time + wait + service_duration
    heapreplace(servers, service_completed)

print(f'Mean wait: @{mean(waits):.1f@}   Max wait: @{max(waits):.1f@}')
print('Quartiles:', [round(q, 1) for q in quantiles(waits)])
@end example


@subsubheading See also


Statistics for Hackers@footnote{https://www.youtube.com/watch?v=Iq9DzN6mvYA}
a video tutorial by
Jake Vanderplas@footnote{https://us.pycon.org/2016/speaker/profile/295/}
on statistical analysis using just a few fundamental concepts
including simulation, sampling, shuffling, and cross-validation.

Economics Simulation@footnote{https://nbviewer.org/url/norvig.com/ipython/Economics.ipynb}
a simulation of a marketplace by
Peter Norvig@footnote{https://norvig.com/bio.html} that shows effective
use of many of the tools and distributions provided by this module
(gauss, uniform, sample, betavariate, choice, triangular, and randrange).

A Concrete Introduction to Probability (using Python)@footnote{https://nbviewer.org/url/norvig.com/ipython/Probability.ipynb}
a tutorial by Peter Norvig@footnote{https://norvig.com/bio.html} covering
the basics of probability theory, how to write simulations, and
how to perform data analysis using Python.


@node Recipes<2>,Command-line usage<2>,Examples<4>,random — Generate pseudo-random numbers
@anchor{library/random recipes}@anchor{2be3}
@subsubsection Recipes


These recipes show how to efficiently make random selections
from the combinatoric iterators in the @ref{85,,itertools} module:

@example
import random

def random_product(*iterables, repeat=1):
    "Random selection from itertools.product(*iterables, repeat=repeat)"
    pools = tuple(map(tuple, iterables)) * repeat
    return tuple(map(random.choice, pools))

def random_permutation(iterable, r=None):
    "Random selection from itertools.permutations(iterable, r)"
    pool = tuple(iterable)
    r = len(pool) if r is None else r
    return tuple(random.sample(pool, r))

def random_combination(iterable, r):
    "Random selection from itertools.combinations(iterable, r)"
    pool = tuple(iterable)
    n = len(pool)
    indices = sorted(random.sample(range(n), r))
    return tuple(pool[i] for i in indices)

def random_combination_with_replacement(iterable, r):
    "Choose r elements with replacement.  Order the result to match the iterable."
    # Result will be in set(itertools.combinations_with_replacement(iterable, r)).
    pool = tuple(iterable)
    n = len(pool)
    indices = sorted(random.choices(range(n), k=r))
    return tuple(pool[i] for i in indices)

def random_derangement(iterable):
    "Choose a permutation where no element stays in its original position."
    seq = tuple(iterable)
    if len(seq) < 2:
        if not seq:
            return ()
        raise IndexError('No derangments to choose from')
    perm = list(range(len(seq)))
    start = tuple(perm)
    while True:
        random.shuffle(perm)
        if all(p != q for p, q in zip(start, perm)):
            return tuple([seq[i] for i in perm])
@end example

@c >>> import random
@c 
@c 
@c >>> random.seed(8675309)
@c >>> random_product('ABCDEFG', repeat=5)
@c ('D', 'B', 'E', 'F', 'E')
@c 
@c 
@c >>> random.seed(8675309)
@c >>> random_permutation('ABCDEFG')
@c ('D', 'B', 'E', 'C', 'G', 'A', 'F')
@c >>> random_permutation('ABCDEFG', 5)
@c ('A', 'G', 'D', 'C', 'B')
@c 
@c 
@c >>> random.seed(8675309)
@c >>> random_combination('ABCDEFG', 7)
@c ('A', 'B', 'C', 'D', 'E', 'F', 'G')
@c >>> random_combination('ABCDEFG', 6)
@c ('A', 'B', 'C', 'D', 'F', 'G')
@c >>> random_combination('ABCDEFG', 5)
@c ('A', 'B', 'C', 'E', 'F')
@c >>> random_combination('ABCDEFG', 4)
@c ('B', 'C', 'D', 'G')
@c >>> random_combination('ABCDEFG', 3)
@c ('B', 'E', 'G')
@c >>> random_combination('ABCDEFG', 2)
@c ('E', 'G')
@c >>> random_combination('ABCDEFG', 1)
@c ('C',)
@c >>> random_combination('ABCDEFG', 0)
@c ()
@c 
@c 
@c >>> random.seed(8675309)
@c >>> random_combination_with_replacement('ABCDEFG', 7)
@c ('B', 'C', 'D', 'E', 'E', 'E', 'G')
@c >>> random_combination_with_replacement('ABCDEFG', 3)
@c ('A', 'B', 'E')
@c >>> random_combination_with_replacement('ABCDEFG', 2)
@c ('A', 'G')
@c >>> random_combination_with_replacement('ABCDEFG', 1)
@c ('E',)
@c >>> random_combination_with_replacement('ABCDEFG', 0)
@c ()
@c 
@c 
@c >>> random.seed(8675309)
@c >>> random_derangement('')
@c ()
@c >>> random_derangement('A')
@c Traceback (most recent call last):
@c ...
@c IndexError: No derangments to choose from
@c >>> random_derangement('AB')
@c ('B', 'A')
@c >>> random_derangement('ABC')
@c ('C', 'A', 'B')
@c >>> random_derangement('ABCD')
@c ('B', 'A', 'D', 'C')
@c >>> random_derangement('ABCDE')
@c ('B', 'C', 'A', 'E', 'D')
@c >>> # Identical inputs treated as distinct
@c >>> identical = 20
@c >>> random_derangement((10, identical, 30, identical))
@c (20, 30, 10, 20)

The default @ref{954,,random()} returns multiples of 2⁻⁵³ in the range
`0.0 ≤ x < 1.0'.  All such numbers are evenly spaced and are exactly
representable as Python floats.  However, many other representable
floats in that interval are not possible selections.  For example,
@code{0.05954861408025609} isn’t an integer multiple of 2⁻⁵³.

The following recipe takes a different approach.  All floats in the
interval are possible selections.  The mantissa comes from a uniform
distribution of integers in the range `2⁵² ≤ mantissa < 2⁵³'.  The
exponent comes from a geometric distribution where exponents smaller
than `-53' occur half as often as the next larger exponent.

@example
from random import Random
from math import ldexp

class FullRandom(Random):

    def random(self):
        mantissa = 0x10_0000_0000_0000 | self.getrandbits(52)
        exponent = -53
        x = 0
        while not x:
            x = self.getrandbits(32)
            exponent += x.bit_length() - 32
        return ldexp(mantissa, exponent)
@end example

All @ref{2bd3,,real valued distributions}
in the class will use the new method:

@example
>>> fr = FullRandom()
>>> fr.random()
0.05954861408025609
>>> fr.expovariate(0.25)
8.87925541791544
@end example

The recipe is conceptually equivalent to an algorithm that chooses from
all the multiples of 2⁻¹⁰⁷⁴ in the range `0.0 ≤ x < 1.0'.  All such
numbers are evenly spaced, but most have to be rounded down to the
nearest representable Python float.  (The value 2⁻¹⁰⁷⁴ is the smallest
positive unnormalized float and is equal to @code{math.ulp(0.0)}.)


@subsubheading See also


Generating Pseudo-random Floating-Point Values@footnote{https://allendowney.com/research/rand/downey07randfloat.pdf} a
paper by Allen B. Downey describing ways to generate more
fine-grained floats than normally generated by @ref{954,,random()}.


@node Command-line usage<2>,Command-line example,Recipes<2>,random — Generate pseudo-random numbers
@anchor{library/random command-line-usage}@anchor{2be4}@anchor{library/random random-cli}@anchor{47f}
@subsubsection Command-line usage



Added in version 3.13.


The @code{random} module can be executed from the command line.

@example
python -m random [-h] [-c CHOICE [CHOICE ...] | -i N | -f N] [input ...]
@end example

The following options are accepted:

@geindex random command line option; -h
@geindex random command line option; --help
@anchor{library/random cmdoption-random-h}@anchor{2be5}@anchor{library/random cmdoption-random-help}@anchor{2be6}
@deffn {Option} @w{-}h, @w{-}@w{-}help

Show the help message and exit.
@end deffn

@geindex random command line option; -c
@geindex random command line option; --choice
@anchor{library/random cmdoption-random-c}@anchor{2be7}
@deffn {Option} @w{-}c CHOICE [CHOICE ...]
@anchor{library/random cmdoption-random-choice}@anchor{2be8}
@deffnx {Option} @w{-}@w{-}choice CHOICE [CHOICE ...]

Print a random choice, using @ref{143c,,choice()}.
@end deffn

@geindex random command line option; -i
@geindex random command line option; --integer
@anchor{library/random cmdoption-random-i}@anchor{2be9}
@deffn {Option} @w{-}i <N>
@anchor{library/random cmdoption-random-integer}@anchor{2bea}
@deffnx {Option} @w{-}@w{-}integer <N>

Print a random integer between 1 and N inclusive, using @ref{143b,,randint()}.
@end deffn

@geindex random command line option; -f
@geindex random command line option; --float
@anchor{library/random cmdoption-random-f}@anchor{2beb}
@deffn {Option} @w{-}f <N>
@anchor{library/random cmdoption-random-float}@anchor{2bec}
@deffnx {Option} @w{-}@w{-}float <N>

Print a random floating-point number between 0 and N inclusive,
using @ref{2bd4,,uniform()}.
@end deffn

If no options are given, the output depends on the input:


@itemize *

@item 
String or multiple: same as @ref{2be8,,--choice}.

@item 
Integer: same as @ref{2bea,,--integer}.

@item 
Float: same as @ref{2bec,,--float}.
@end itemize

@node Command-line example,,Command-line usage<2>,random — Generate pseudo-random numbers
@anchor{library/random command-line-example}@anchor{2bed}@anchor{library/random random-cli-example}@anchor{2bee}
@subsubsection Command-line example


Here are some examples of the @code{random} command-line interface:

@example
$ # Choose one at random
$ python -m random egg bacon sausage spam "Lobster Thermidor aux crevettes with a Mornay sauce"
Lobster Thermidor aux crevettes with a Mornay sauce

$ # Random integer
$ python -m random 6
6

$ # Random floating-point number
$ python -m random 1.8
1.7080016272295635

$ # With explicit arguments
$ python  -m random --choice egg bacon sausage spam "Lobster Thermidor aux crevettes with a Mornay sauce"
egg

$ python -m random --integer 6
3

$ python -m random --float 1.8
1.5666339105010318

$ python -m random --integer 6
5

$ python -m random --float 6
3.1942323316565915
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node statistics — Mathematical statistics functions,,random — Generate pseudo-random numbers,Numeric and Mathematical Modules
@anchor{library/statistics doc}@anchor{2bef}@anchor{library/statistics module-statistics}@anchor{d7}@anchor{library/statistics statistics-mathematical-statistics-functions}@anchor{2bf0}@anchor{library/statistics translation-repo}@anchor{2bf1}
@subsection @code{statistics} — Mathematical statistics functions


@geindex module; statistics


Added in version 3.4.


`Source code:' Lib/statistics.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/statistics.py}

@c from statistics import *
@c import math
@c __name__ = '<doctest>'


__________________________________________________________________


This module provides functions for calculating mathematical statistics of
numeric (@ref{263a,,Real}-valued) data.

The module is not intended to be a competitor to third-party libraries such
as NumPy@footnote{https://numpy.org}, SciPy@footnote{https://scipy.org/}, or
proprietary full-featured statistics packages aimed at professional
statisticians such as Minitab, SAS and Matlab. It is aimed at the level of
graphing and scientific calculators.

Unless explicitly noted, these functions support @ref{19c,,int},
@ref{197,,float}, @ref{200,,Decimal} and @ref{215,,Fraction}.
Behaviour with other types (whether in the numeric tower or not) is
currently unsupported.  Collections with a mix of types are also undefined
and implementation-dependent.  If your input data consists of mixed types,
you may be able to use @ref{1a0,,map()} to ensure a consistent result, for
example: @code{map(float, input_data)}.

Some datasets use @code{NaN} (not a number) values to represent missing data.
Since NaNs have unusual comparison semantics, they cause surprising or
undefined behaviors in the statistics functions that sort data or that count
occurrences.  The functions affected are @code{median()}, @code{median_low()},
@code{median_high()}, @code{median_grouped()}, @code{mode()}, @code{multimode()}, and
@code{quantiles()}.  The @code{NaN} values should be stripped before calling these
functions:

@example
>>> from statistics import median
>>> from math import isnan
>>> from itertools import filterfalse

>>> data = [20.7, float('NaN'),19.2, 18.3, float('NaN'), 14.4]
>>> sorted(data)  # This has surprising behavior
[20.7, nan, 14.4, 18.3, 19.2, nan]
>>> median(data)  # This result is unexpected
16.35

>>> sum(map(isnan, data))    # Number of missing values
2
>>> clean = list(filterfalse(isnan, data))  # Strip NaN values
>>> clean
[20.7, 19.2, 18.3, 14.4]
>>> sorted(clean)  # Sorting now works as expected
[14.4, 18.3, 19.2, 20.7]
>>> median(clean)       # This result is now well defined
18.75
@end example

@menu
* Averages and measures of central location:: 
* Measures of spread:: 
* Statistics for relations between two inputs:: 
* Function details:: 
* Exceptions: Exceptions<5>. 
* NormalDist objects:: 
* Examples and Recipes: Examples and Recipes<2>. 

@end menu

@node Averages and measures of central location,Measures of spread,,statistics — Mathematical statistics functions
@anchor{library/statistics averages-and-measures-of-central-location}@anchor{2bf2}
@subsubsection Averages and measures of central location


These functions calculate an average or typical value from a population
or sample.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@ref{8e3,,mean()}

@tab

Arithmetic mean (“average”) of data.

@item

@ref{c2f,,fmean()}

@tab

Fast, floating-point arithmetic mean, with optional weighting.

@item

@ref{c30,,geometric_mean()}

@tab

Geometric mean of data.

@item

@ref{ee3,,harmonic_mean()}

@tab

Harmonic mean of data.

@item

@ref{553,,kde()}

@tab

Estimate the probability density distribution of the data.

@item

@ref{554,,kde_random()}

@tab

Random sampling from the PDF generated by kde().

@item

@ref{2bf3,,median()}

@tab

Median (middle value) of data.

@item

@ref{2bf4,,median_low()}

@tab

Low median of data.

@item

@ref{2bf5,,median_high()}

@tab

High median of data.

@item

@ref{2bf6,,median_grouped()}

@tab

Median (50th percentile) of grouped data.

@item

@ref{c8b,,mode()}

@tab

Single mode (most common value) of discrete or nominal data.

@item

@ref{c31,,multimode()}

@tab

List of modes (most common values) of discrete or nominal data.

@item

@ref{c32,,quantiles()}

@tab

Divide data into intervals with equal probability.

@end multitable


@node Measures of spread,Statistics for relations between two inputs,Averages and measures of central location,statistics — Mathematical statistics functions
@anchor{library/statistics measures-of-spread}@anchor{2bf7}
@subsubsection Measures of spread


These functions calculate a measure of how much the population or sample
tends to deviate from the typical or average values.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@ref{1801,,pstdev()}

@tab

Population standard deviation of data.

@item

@ref{2bf8,,pvariance()}

@tab

Population variance of data.

@item

@ref{8e5,,stdev()}

@tab

Sample standard deviation of data.

@item

@ref{8e4,,variance()}

@tab

Sample variance of data.

@end multitable


@node Statistics for relations between two inputs,Function details,Measures of spread,statistics — Mathematical statistics functions
@anchor{library/statistics statistics-for-relations-between-two-inputs}@anchor{2bf9}
@subsubsection Statistics for relations between two inputs


These functions calculate statistics regarding relations between two inputs.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@ref{a37,,covariance()}

@tab

Sample covariance for two variables.

@item

@ref{6e4,,correlation()}

@tab

Pearson and Spearman’s correlation coefficients.

@item

@ref{a38,,linear_regression()}

@tab

Slope and intercept for simple linear regression.

@end multitable


@node Function details,Exceptions<5>,Statistics for relations between two inputs,statistics — Mathematical statistics functions
@anchor{library/statistics function-details}@anchor{2bfa}
@subsubsection Function details


Note: The functions do not require the data given to them to be sorted.
However, for reading convenience, most of the examples show sorted sequences.

@geindex mean() (in module statistics)
@anchor{library/statistics statistics mean}@anchor{8e3}
@deffn {Function} statistics.mean (data)

Return the sample arithmetic mean of `data' which can be a sequence or iterable.

The arithmetic mean is the sum of the data divided by the number of data
points.  It is commonly called “the average”, although it is only one of many
different mathematical averages.  It is a measure of the central location of
the data.

If `data' is empty, @ref{2bfb,,StatisticsError} will be raised.

Some examples of use:

@example
>>> mean([1, 2, 3, 4, 4])
2.8
>>> mean([-1.0, 2.5, 3.25, 5.75])
2.625

>>> from fractions import Fraction as F
>>> mean([F(3, 7), F(1, 21), F(5, 3), F(1, 3)])
Fraction(13, 21)

>>> from decimal import Decimal as D
>>> mean([D("0.5"), D("0.75"), D("0.625"), D("0.375")])
Decimal('0.5625')
@end example

@cartouche
@quotation Note 
The mean is strongly affected by outliers@footnote{https://en.wikipedia.org/wiki/Outlier} and is not necessarily a
typical example of the data points. For a more robust, although less
efficient, measure of central tendency@footnote{https://en.wikipedia.org/wiki/Central_tendency}, see @ref{2bf3,,median()}.

The sample mean gives an unbiased estimate of the true population mean,
so that when taken on average over all the possible samples,
@code{mean(sample)} converges on the true mean of the entire population.  If
`data' represents the entire population rather than a sample, then
@code{mean(data)} is equivalent to calculating the true population mean μ.
@end quotation
@end cartouche
@end deffn

@geindex fmean() (in module statistics)
@anchor{library/statistics statistics fmean}@anchor{c2f}
@deffn {Function} statistics.fmean (data, weights=None)

Convert `data' to floats and compute the arithmetic mean.

This runs faster than the @ref{8e3,,mean()} function and it always returns a
@ref{197,,float}.  The `data' may be a sequence or iterable.  If the input
dataset is empty, raises a @ref{2bfb,,StatisticsError}.

@example
>>> fmean([3.5, 4.0, 5.25])
4.25
@end example

Optional weighting is supported.  For example, a professor assigns a
grade for a course by weighting quizzes at 20%, homework at 20%, a
midterm exam at 30%, and a final exam at 30%:

@example
>>> grades = [85, 92, 83, 91]
>>> weights = [0.20, 0.20, 0.30, 0.30]
>>> fmean(grades, weights)
87.6
@end example

If `weights' is supplied, it must be the same length as the `data' or
a @ref{2ee,,ValueError} will be raised.


Added in version 3.8.



Changed in version 3.11: Added support for `weights'.

@end deffn

@geindex geometric_mean() (in module statistics)
@anchor{library/statistics statistics geometric_mean}@anchor{c30}
@deffn {Function} statistics.geometric_mean (data)

Convert `data' to floats and compute the geometric mean.

The geometric mean indicates the central tendency or typical value of the
`data' using the product of the values (as opposed to the arithmetic mean
which uses their sum).

Raises a @ref{2bfb,,StatisticsError} if the input dataset is empty,
if it contains a zero, or if it contains a negative value.
The `data' may be a sequence or iterable.

No special efforts are made to achieve exact results.
(However, this may change in the future.)

@example
>>> round(geometric_mean([54, 24, 36]), 1)
36.0
@end example


Added in version 3.8.

@end deffn

@geindex harmonic_mean() (in module statistics)
@anchor{library/statistics statistics harmonic_mean}@anchor{ee3}
@deffn {Function} statistics.harmonic_mean (data, weights=None)

Return the harmonic mean of `data', a sequence or iterable of
real-valued numbers.  If `weights' is omitted or @code{None}, then
equal weighting is assumed.

The harmonic mean is the reciprocal of the arithmetic @ref{8e3,,mean()} of the
reciprocals of the data. For example, the harmonic mean of three values `a',
`b' and `c' will be equivalent to @code{3/(1/a + 1/b + 1/c)}.  If one of the
values is zero, the result will be zero.

The harmonic mean is a type of average, a measure of the central
location of the data.  It is often appropriate when averaging
ratios or rates, for example speeds.

Suppose a car travels 10 km at 40 km/hr, then another 10 km at 60 km/hr.
What is the average speed?

@example
>>> harmonic_mean([40, 60])
48.0
@end example

Suppose a car travels 40 km/hr for 5 km, and when traffic clears,
speeds-up to 60 km/hr for the remaining 30 km of the journey. What
is the average speed?

@example
>>> harmonic_mean([40, 60], weights=[5, 30])
56.0
@end example

@ref{2bfb,,StatisticsError} is raised if `data' is empty, any element
is less than zero, or if the weighted sum isn’t positive.

The current algorithm has an early-out when it encounters a zero
in the input.  This means that the subsequent inputs are not tested
for validity.  (This behavior may change in the future.)


Added in version 3.6.



Changed in version 3.10: Added support for `weights'.

@end deffn

@geindex kde() (in module statistics)
@anchor{library/statistics statistics kde}@anchor{553}
@deffn {Function} statistics.kde (data, h, kernel='normal', *, cumulative=False)

Kernel Density Estimation (KDE)@footnote{https://www.itm-conferences.org/articles/itmconf/pdf/2018/08/itmconf_sam2018_00037.pdf}:
Create a continuous probability density function or cumulative
distribution function from discrete samples.

The basic idea is to smooth the data using a kernel function@footnote{https://en.wikipedia.org/wiki/Kernel_(statistics)}.
to help draw inferences about a population from a sample.

The degree of smoothing is controlled by the scaling parameter `h'
which is called the bandwidth.  Smaller values emphasize local
features while larger values give smoother results.

The `kernel' determines the relative weights of the sample data
points.  Generally, the choice of kernel shape does not matter
as much as the more influential bandwidth smoothing parameter.

Kernels that give some weight to every sample point include
`normal' (`gauss'), `logistic', and `sigmoid'.

Kernels that only give weight to sample points within the bandwidth
include `rectangular' (`uniform'), `triangular', `parabolic'
(`epanechnikov'), `quartic' (`biweight'), `triweight', and `cosine'.

If `cumulative' is true, will return a cumulative distribution function.

A @ref{2bfb,,StatisticsError} will be raised if the `data' sequence is empty.

Wikipedia has an example@footnote{https://en.wikipedia.org/wiki/Kernel_density_estimation#Example}
where we can use @code{kde()} to generate and plot a probability
density function estimated from a small sample:

@example
>>> sample = [-2.1, -1.3, -0.4, 1.9, 5.1, 6.2]
>>> f_hat = kde(sample, h=1.5)
>>> xarr = [i/100 for i in range(-750, 1100)]
>>> yarr = [f_hat(x) for x in xarr]
@end example

The points in @code{xarr} and @code{yarr} can be used to make a PDF plot:

@image{python-figures/kde_example,,,Scatter plot of the estimated probability density function.,png}


Added in version 3.13.

@end deffn

@geindex kde_random() (in module statistics)
@anchor{library/statistics statistics kde_random}@anchor{554}
@deffn {Function} statistics.kde_random (data, h, kernel='normal', *, seed=None)

Return a function that makes a random selection from the estimated
probability density function produced by @code{kde(data, h, kernel)}.

Providing a `seed' allows reproducible selections. In the future, the
values may change slightly as more accurate kernel inverse CDF estimates
are implemented.  The seed may be an integer, float, str, or bytes.

A @ref{2bfb,,StatisticsError} will be raised if the `data' sequence is empty.

Continuing the example for @ref{553,,kde()}, we can use
@code{kde_random()} to generate new random selections from an
estimated probability density function:

@example
>>> data = [-2.1, -1.3, -0.4, 1.9, 5.1, 6.2]
>>> rand = kde_random(data, h=1.5, seed=8675309)
>>> new_selections = [rand() for i in range(10)]
>>> [round(x, 1) for x in new_selections]
[0.7, 6.2, 1.2, 6.9, 7.0, 1.8, 2.5, -0.5, -1.8, 5.6]
@end example


Added in version 3.13.

@end deffn

@geindex median() (in module statistics)
@anchor{library/statistics statistics median}@anchor{2bf3}
@deffn {Function} statistics.median (data)

Return the median (middle value) of numeric data, using the common “mean of
middle two” method.  If `data' is empty, @ref{2bfb,,StatisticsError} is raised.
`data' can be a sequence or iterable.

The median is a robust measure of central location and is less affected by
the presence of outliers.  When the number of data points is odd, the
middle data point is returned:

@example
>>> median([1, 3, 5])
3
@end example

When the number of data points is even, the median is interpolated by taking
the average of the two middle values:

@example
>>> median([1, 3, 5, 7])
4.0
@end example

This is suited for when your data is discrete, and you don’t mind that the
median may not be an actual data point.

If the data is ordinal (supports order operations) but not numeric (doesn’t
support addition), consider using @ref{2bf4,,median_low()} or @ref{2bf5,,median_high()}
instead.
@end deffn

@geindex median_low() (in module statistics)
@anchor{library/statistics statistics median_low}@anchor{2bf4}
@deffn {Function} statistics.median_low (data)

Return the low median of numeric data.  If `data' is empty,
@ref{2bfb,,StatisticsError} is raised.  `data' can be a sequence or iterable.

The low median is always a member of the data set.  When the number of data
points is odd, the middle value is returned.  When it is even, the smaller of
the two middle values is returned.

@example
>>> median_low([1, 3, 5])
3
>>> median_low([1, 3, 5, 7])
3
@end example

Use the low median when your data are discrete and you prefer the median to
be an actual data point rather than interpolated.
@end deffn

@geindex median_high() (in module statistics)
@anchor{library/statistics statistics median_high}@anchor{2bf5}
@deffn {Function} statistics.median_high (data)

Return the high median of data.  If `data' is empty, @ref{2bfb,,StatisticsError}
is raised.  `data' can be a sequence or iterable.

The high median is always a member of the data set.  When the number of data
points is odd, the middle value is returned.  When it is even, the larger of
the two middle values is returned.

@example
>>> median_high([1, 3, 5])
3
>>> median_high([1, 3, 5, 7])
5
@end example

Use the high median when your data are discrete and you prefer the median to
be an actual data point rather than interpolated.
@end deffn

@geindex median_grouped() (in module statistics)
@anchor{library/statistics statistics median_grouped}@anchor{2bf6}
@deffn {Function} statistics.median_grouped (data, interval=1.0)

Estimates the median for numeric data that has been grouped or binned@footnote{https://en.wikipedia.org/wiki/Data_binning} around the midpoints
of consecutive, fixed-width intervals.

The `data' can be any iterable of numeric data with each value being
exactly the midpoint of a bin.  At least one value must be present.

The `interval' is the width of each bin.

For example, demographic information may have been summarized into
consecutive ten-year age groups with each group being represented
by the 5-year midpoints of the intervals:

@example
>>> from collections import Counter
>>> demographics = Counter(@{
...    25: 172,   # 20 to 30 years old
...    35: 484,   # 30 to 40 years old
...    45: 387,   # 40 to 50 years old
...    55:  22,   # 50 to 60 years old
...    65:   6,   # 60 to 70 years old
... @})
...
@end example

The 50th percentile (median) is the 536th person out of the 1071
member cohort.  That person is in the 30 to 40 year old age group.

The regular @ref{2bf3,,median()} function would assume that everyone in the
tricenarian age group was exactly 35 years old.  A more tenable
assumption is that the 484 members of that age group are evenly
distributed between 30 and 40.  For that, we use
@code{median_grouped()}:

@example
>>> data = list(demographics.elements())
>>> median(data)
35
>>> round(median_grouped(data, interval=10), 1)
37.5
@end example

The caller is responsible for making sure the data points are separated
by exact multiples of `interval'.  This is essential for getting a
correct result.  The function does not check this precondition.

Inputs may be any numeric type that can be coerced to a float during
the interpolation step.
@end deffn

@geindex mode() (in module statistics)
@anchor{library/statistics statistics mode}@anchor{c8b}
@deffn {Function} statistics.mode (data)

Return the single most common data point from discrete or nominal `data'.
The mode (when it exists) is the most typical value and serves as a
measure of central location.

If there are multiple modes with the same frequency, returns the first one
encountered in the `data'.  If the smallest or largest of those is
desired instead, use @code{min(multimode(data))} or @code{max(multimode(data))}.
If the input `data' is empty, @ref{2bfb,,StatisticsError} is raised.

@code{mode} assumes discrete data and returns a single value. This is the
standard treatment of the mode as commonly taught in schools:

@example
>>> mode([1, 1, 2, 3, 3, 3, 3, 4])
3
@end example

The mode is unique in that it is the only statistic in this package that
also applies to nominal (non-numeric) data:

@example
>>> mode(["red", "blue", "blue", "red", "green", "red", "red"])
'red'
@end example

Only hashable inputs are supported.  To handle type @ref{185,,set},
consider casting to @ref{7f3,,frozenset}.  To handle type @ref{24f,,list},
consider casting to @ref{614,,tuple}.  For mixed or nested inputs, consider
using this slower quadratic algorithm that only depends on equality tests:
@code{max(data, key=data.count)}.


Changed in version 3.8: Now handles multimodal datasets by returning the first mode encountered.
Formerly, it raised @ref{2bfb,,StatisticsError} when more than one mode was
found.

@end deffn

@geindex multimode() (in module statistics)
@anchor{library/statistics statistics multimode}@anchor{c31}
@deffn {Function} statistics.multimode (data)

Return a list of the most frequently occurring values in the order they
were first encountered in the `data'.  Will return more than one result if
there are multiple modes or an empty list if the `data' is empty:

@example
>>> multimode('aabbbbccddddeeffffgg')
['b', 'd', 'f']
>>> multimode('@w{'})
[]
@end example


Added in version 3.8.

@end deffn

@geindex pstdev() (in module statistics)
@anchor{library/statistics statistics pstdev}@anchor{1801}
@deffn {Function} statistics.pstdev (data, mu=None)

Return the population standard deviation (the square root of the population
variance).  See @ref{2bf8,,pvariance()} for arguments and other details.

@example
>>> pstdev([1.5, 2.5, 2.5, 2.75, 3.25, 4.75])
0.986893273527251
@end example
@end deffn

@geindex pvariance() (in module statistics)
@anchor{library/statistics statistics pvariance}@anchor{2bf8}
@deffn {Function} statistics.pvariance (data, mu=None)

Return the population variance of `data', a non-empty sequence or iterable
of real-valued numbers.  Variance, or second moment about the mean, is a
measure of the variability (spread or dispersion) of data.  A large
variance indicates that the data is spread out; a small variance indicates
it is clustered closely around the mean.

If the optional second argument `mu' is given, it should be the `population'
mean of the `data'.  It can also be used to compute the second moment around
a point that is not the mean.  If it is missing or @code{None} (the default),
the arithmetic mean is automatically calculated.

Use this function to calculate the variance from the entire population.  To
estimate the variance from a sample, the @ref{8e4,,variance()} function is usually
a better choice.

Raises @ref{2bfb,,StatisticsError} if `data' is empty.

Examples:

@example
>>> data = [0.0, 0.25, 0.25, 1.25, 1.5, 1.75, 2.75, 3.25]
>>> pvariance(data)
1.25
@end example

If you have already calculated the mean of your data, you can pass it as the
optional second argument `mu' to avoid recalculation:

@example
>>> mu = mean(data)
>>> pvariance(data, mu)
1.25
@end example

Decimals and Fractions are supported:

@example
>>> from decimal import Decimal as D
>>> pvariance([D("27.5"), D("30.25"), D("30.25"), D("34.5"), D("41.75")])
Decimal('24.815')

>>> from fractions import Fraction as F
>>> pvariance([F(1, 4), F(5, 4), F(1, 2)])
Fraction(13, 72)
@end example

@cartouche
@quotation Note 
When called with the entire population, this gives the population variance
σ².  When called on a sample instead, this is the biased sample variance
s², also known as variance with N degrees of freedom.

If you somehow know the true population mean μ, you may use this
function to calculate the variance of a sample, giving the known
population mean as the second argument.  Provided the data points are a
random sample of the population, the result will be an unbiased estimate
of the population variance.
@end quotation
@end cartouche
@end deffn

@geindex stdev() (in module statistics)
@anchor{library/statistics statistics stdev}@anchor{8e5}
@deffn {Function} statistics.stdev (data, xbar=None)

Return the sample standard deviation (the square root of the sample
variance).  See @ref{8e4,,variance()} for arguments and other details.

@example
>>> stdev([1.5, 2.5, 2.5, 2.75, 3.25, 4.75])
1.0810874155219827
@end example
@end deffn

@geindex variance() (in module statistics)
@anchor{library/statistics statistics variance}@anchor{8e4}
@deffn {Function} statistics.variance (data, xbar=None)

Return the sample variance of `data', an iterable of at least two real-valued
numbers.  Variance, or second moment about the mean, is a measure of the
variability (spread or dispersion) of data.  A large variance indicates that
the data is spread out; a small variance indicates it is clustered closely
around the mean.

If the optional second argument `xbar' is given, it should be the `sample'
mean of `data'.  If it is missing or @code{None} (the default), the mean is
automatically calculated.

Use this function when your data is a sample from a population. To calculate
the variance from the entire population, see @ref{2bf8,,pvariance()}.

Raises @ref{2bfb,,StatisticsError} if `data' has fewer than two values.

Examples:

@example
>>> data = [2.75, 1.75, 1.25, 0.25, 0.5, 1.25, 3.5]
>>> variance(data)
1.3720238095238095
@end example

If you have already calculated the sample mean of your data, you can pass it
as the optional second argument `xbar' to avoid recalculation:

@example
>>> m = mean(data)
>>> variance(data, m)
1.3720238095238095
@end example

This function does not attempt to verify that you have passed the actual mean
as `xbar'.  Using arbitrary values for `xbar' can lead to invalid or
impossible results.

Decimal and Fraction values are supported:

@example
>>> from decimal import Decimal as D
>>> variance([D("27.5"), D("30.25"), D("30.25"), D("34.5"), D("41.75")])
Decimal('31.01875')

>>> from fractions import Fraction as F
>>> variance([F(1, 6), F(1, 2), F(5, 3)])
Fraction(67, 108)
@end example

@cartouche
@quotation Note 
This is the sample variance s² with Bessel’s correction, also known as
variance with N-1 degrees of freedom.  Provided that the data points are
representative (e.g. independent and identically distributed), the result
should be an unbiased estimate of the true population variance.

If you somehow know the actual population mean μ you should pass it to the
@ref{2bf8,,pvariance()} function as the `mu' parameter to get the variance of a
sample.
@end quotation
@end cartouche
@end deffn

@geindex quantiles() (in module statistics)
@anchor{library/statistics statistics quantiles}@anchor{c32}
@deffn {Function} statistics.quantiles (data, *, n=4, method='exclusive')

Divide `data' into `n' continuous intervals with equal probability.
Returns a list of @code{n - 1} cut points separating the intervals.

Set `n' to 4 for quartiles (the default).  Set `n' to 10 for deciles.  Set
`n' to 100 for percentiles which gives the 99 cuts points that separate
`data' into 100 equal sized groups.  Raises @ref{2bfb,,StatisticsError} if `n'
is not least 1.

The `data' can be any iterable containing sample data.  For meaningful
results, the number of data points in `data' should be larger than `n'.
Raises @ref{2bfb,,StatisticsError} if there is not at least one data point.

The cut points are linearly interpolated from the
two nearest data points.  For example, if a cut point falls one-third
of the distance between two sample values, @code{100} and @code{112}, the
cut-point will evaluate to @code{104}.

The `method' for computing quantiles can be varied depending on
whether the `data' includes or excludes the lowest and
highest possible values from the population.

The default `method' is “exclusive” and is used for data sampled from
a population that can have more extreme values than found in the
samples.  The portion of the population falling below the `i-th' of
`m' sorted data points is computed as @code{i / (m + 1)}.  Given nine
sample values, the method sorts them and assigns the following
percentiles: 10%, 20%, 30%, 40%, 50%, 60%, 70%, 80%, 90%.

Setting the `method' to “inclusive” is used for describing population
data or for samples that are known to include the most extreme values
from the population.  The minimum value in `data' is treated as the 0th
percentile and the maximum value is treated as the 100th percentile.
The portion of the population falling below the `i-th' of `m' sorted
data points is computed as @code{(i - 1) / (m - 1)}.  Given 11 sample
values, the method sorts them and assigns the following percentiles:
0%, 10%, 20%, 30%, 40%, 50%, 60%, 70%, 80%, 90%, 100%.

@example
# Decile cut points for empirically sampled data
>>> data = [105, 129, 87, 86, 111, 111, 89, 81, 108, 92, 110,
...         100, 75, 105, 103, 109, 76, 119, 99, 91, 103, 129,
...         106, 101, 84, 111, 74, 87, 86, 103, 103, 106, 86,
...         111, 75, 87, 102, 121, 111, 88, 89, 101, 106, 95,
...         103, 107, 101, 81, 109, 104]
>>> [round(q, 1) for q in quantiles(data, n=10)]
[81.0, 86.2, 89.0, 99.4, 102.5, 103.6, 106.0, 109.8, 111.0]
@end example


Added in version 3.8.



Changed in version 3.13: No longer raises an exception for an input with only a single data point.
This allows quantile estimates to be built up one sample point
at a time becoming gradually more refined with each new data point.

@end deffn

@geindex covariance() (in module statistics)
@anchor{library/statistics statistics covariance}@anchor{a37}
@deffn {Function} statistics.covariance (x, y, /)

Return the sample covariance of two inputs `x' and `y'. Covariance
is a measure of the joint variability of two inputs.

Both inputs must be of the same length (no less than two), otherwise
@ref{2bfb,,StatisticsError} is raised.

Examples:

@example
>>> x = [1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> y = [1, 2, 3, 1, 2, 3, 1, 2, 3]
>>> covariance(x, y)
0.75
>>> z = [9, 8, 7, 6, 5, 4, 3, 2, 1]
>>> covariance(x, z)
-7.5
>>> covariance(z, x)
-7.5
@end example


Added in version 3.10.

@end deffn

@geindex correlation() (in module statistics)
@anchor{library/statistics statistics correlation}@anchor{6e4}
@deffn {Function} statistics.correlation (x, y, /, *, method='linear')

Return the Pearson's correlation coefficient@footnote{https://en.wikipedia.org/wiki/Pearson_correlation_coefficient}
for two inputs. Pearson’s correlation coefficient `r' takes values
between -1 and +1. It measures the strength and direction of a linear
relationship.

If `method' is “ranked”, computes Spearman's rank correlation coefficient@footnote{https://en.wikipedia.org/wiki/Spearman%27s_rank_correlation_coefficient}
for two inputs. The data is replaced by ranks.  Ties are averaged so that
equal values receive the same rank.  The resulting coefficient measures the
strength of a monotonic relationship.

Spearman’s correlation coefficient is appropriate for ordinal data or for
continuous data that doesn’t meet the linear proportion requirement for
Pearson’s correlation coefficient.

Both inputs must be of the same length (no less than two), and need
not to be constant, otherwise @ref{2bfb,,StatisticsError} is raised.

Example with Kepler's laws of planetary motion@footnote{https://en.wikipedia.org/wiki/Kepler's_laws_of_planetary_motion}:

@example
>>> # Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, and  Neptune
>>> orbital_period = [88, 225, 365, 687, 4331, 10_756, 30_687, 60_190]    # days
>>> dist_from_sun = [58, 108, 150, 228, 778, 1_400, 2_900, 4_500] # million km

>>> # Show that a perfect monotonic relationship exists
>>> correlation(orbital_period, dist_from_sun, method='ranked')
1.0

>>> # Observe that a linear relationship is imperfect
>>> round(correlation(orbital_period, dist_from_sun), 4)
0.9882

>>> # Demonstrate Kepler's third law: There is a linear correlation
>>> # between the square of the orbital period and the cube of the
>>> # distance from the sun.
>>> period_squared = [p * p for p in orbital_period]
>>> dist_cubed = [d * d * d for d in dist_from_sun]
>>> round(correlation(period_squared, dist_cubed), 4)
1.0
@end example


Added in version 3.10.



Changed in version 3.12: Added support for Spearman’s rank correlation coefficient.

@end deffn

@geindex linear_regression() (in module statistics)
@anchor{library/statistics statistics linear_regression}@anchor{a38}
@deffn {Function} statistics.linear_regression (x, y, /, *, proportional=False)

Return the slope and intercept of simple linear regression@footnote{https://en.wikipedia.org/wiki/Simple_linear_regression}
parameters estimated using ordinary least squares. Simple linear
regression describes the relationship between an independent variable `x' and
a dependent variable `y' in terms of this linear function:

@quotation

`y = slope * x + intercept + noise'
@end quotation

where @code{slope} and @code{intercept} are the regression parameters that are
estimated, and @code{noise} represents the
variability of the data that was not explained by the linear regression
(it is equal to the difference between predicted and actual values
of the dependent variable).

Both inputs must be of the same length (no less than two), and
the independent variable `x' cannot be constant;
otherwise a @ref{2bfb,,StatisticsError} is raised.

For example, we can use the release dates of the Monty Python films@footnote{https://en.wikipedia.org/wiki/Monty_Python#Films}
to predict the cumulative number of Monty Python films
that would have been produced by 2019
assuming that they had kept the pace.

@example
>>> year = [1971, 1975, 1979, 1982, 1983]
>>> films_total = [1, 2, 3, 4, 5]
>>> slope, intercept = linear_regression(year, films_total)
>>> round(slope * 2019 + intercept)
16
@end example

If `proportional' is true, the independent variable `x' and the
dependent variable `y' are assumed to be directly proportional.
The data is fit to a line passing through the origin.
Since the `intercept' will always be 0.0, the underlying linear
function simplifies to:

@quotation

`y = slope * x + noise'
@end quotation

Continuing the example from @ref{6e4,,correlation()}, we look to see
how well a model based on major planets can predict the orbital
distances for dwarf planets:

@example
>>> model = linear_regression(period_squared, dist_cubed, proportional=True)
>>> slope = model.slope

>>> # Dwarf planets:   Pluto,  Eris,    Makemake, Haumea, Ceres
>>> orbital_periods = [90_560, 204_199, 111_845, 103_410, 1_680]  # days
>>> predicted_dist = [math.cbrt(slope * (p * p)) for p in orbital_periods]
>>> list(map(round, predicted_dist))
[5912, 10166, 6806, 6459, 414]

>>> [5_906, 10_152, 6_796, 6_450, 414]  # actual distance in million km
[5906, 10152, 6796, 6450, 414]
@end example


Added in version 3.10.



Changed in version 3.11: Added support for `proportional'.

@end deffn

@node Exceptions<5>,NormalDist objects,Function details,statistics — Mathematical statistics functions
@anchor{library/statistics exceptions}@anchor{2bfc}
@subsubsection Exceptions


A single exception is defined:

@geindex StatisticsError
@anchor{library/statistics statistics StatisticsError}@anchor{2bfb}
@deffn {Exception} statistics.StatisticsError

Subclass of @ref{2ee,,ValueError} for statistics-related exceptions.
@end deffn

@node NormalDist objects,Examples and Recipes<2>,Exceptions<5>,statistics — Mathematical statistics functions
@anchor{library/statistics normaldist-objects}@anchor{2bfd}
@subsubsection @code{NormalDist} objects


@ref{c33,,NormalDist} is a tool for creating and manipulating normal
distributions of a random variable@footnote{http://www.stat.yale.edu/Courses/1997-98/101/ranvar.htm}.  It is a
class that treats the mean and standard deviation of data
measurements as a single entity.

Normal distributions arise from the Central Limit Theorem@footnote{https://en.wikipedia.org/wiki/Central_limit_theorem} and have a wide range
of applications in statistics.

@geindex NormalDist (class in statistics)
@anchor{library/statistics statistics NormalDist}@anchor{c33}
@deffn {Class} statistics.NormalDist (mu=0.0, sigma=1.0)

Returns a new `NormalDist' object where `mu' represents the arithmetic mean@footnote{https://en.wikipedia.org/wiki/Arithmetic_mean} and `sigma'
represents the standard deviation@footnote{https://en.wikipedia.org/wiki/Standard_deviation}.

If `sigma' is negative, raises @ref{2bfb,,StatisticsError}.

@geindex mean (statistics.NormalDist attribute)
@anchor{library/statistics statistics NormalDist mean}@anchor{2bfe}
@deffn {Attribute} mean

A read-only property for the arithmetic mean@footnote{https://en.wikipedia.org/wiki/Arithmetic_mean} of a normal
distribution.
@end deffn

@geindex median (statistics.NormalDist attribute)
@anchor{library/statistics statistics NormalDist median}@anchor{2bff}
@deffn {Attribute} median

A read-only property for the median@footnote{https://en.wikipedia.org/wiki/Median} of a normal
distribution.
@end deffn

@geindex mode (statistics.NormalDist attribute)
@anchor{library/statistics statistics NormalDist mode}@anchor{2c00}
@deffn {Attribute} mode

A read-only property for the mode@footnote{https://en.wikipedia.org/wiki/Mode_(statistics)} of a normal
distribution.
@end deffn

@geindex stdev (statistics.NormalDist attribute)
@anchor{library/statistics statistics NormalDist stdev}@anchor{2c01}
@deffn {Attribute} stdev

A read-only property for the standard deviation@footnote{https://en.wikipedia.org/wiki/Standard_deviation} of a normal
distribution.
@end deffn

@geindex variance (statistics.NormalDist attribute)
@anchor{library/statistics statistics NormalDist variance}@anchor{2c02}
@deffn {Attribute} variance

A read-only property for the variance@footnote{https://en.wikipedia.org/wiki/Variance} of a normal
distribution. Equal to the square of the standard deviation.
@end deffn

@geindex from_samples() (statistics.NormalDist class method)
@anchor{library/statistics statistics NormalDist from_samples}@anchor{2c03}
@deffn {Method} classmethod from_samples (data)

Makes a normal distribution instance with `mu' and `sigma' parameters
estimated from the `data' using @ref{c2f,,fmean()} and @ref{8e5,,stdev()}.

The `data' can be any @ref{1433,,iterable} and should consist of values
that can be converted to type @ref{197,,float}.  If `data' does not
contain at least two elements, raises @ref{2bfb,,StatisticsError} because it
takes at least one point to estimate a central value and at least two
points to estimate dispersion.
@end deffn

@geindex samples() (statistics.NormalDist method)
@anchor{library/statistics statistics NormalDist samples}@anchor{2c04}
@deffn {Method} samples (n, *, seed=None)

Generates `n' random samples for a given mean and standard deviation.
Returns a @ref{24f,,list} of @ref{197,,float} values.

If `seed' is given, creates a new instance of the underlying random
number generator.  This is useful for creating reproducible results,
even in a multi-threading context.


Changed in version 3.13.


Switched to a faster algorithm.  To reproduce samples from previous
versions, use @ref{147f,,random.seed()} and @ref{1c1b,,random.gauss()}.
@end deffn

@geindex pdf() (statistics.NormalDist method)
@anchor{library/statistics statistics NormalDist pdf}@anchor{2c05}
@deffn {Method} pdf (x)

Using a probability density function (pdf)@footnote{https://en.wikipedia.org/wiki/Probability_density_function}, compute
the relative likelihood that a random variable `X' will be near the
given value `x'.  Mathematically, it is the limit of the ratio @code{P(x <=
X < x+dx) / dx} as `dx' approaches zero.

The relative likelihood is computed as the probability of a sample
occurring in a narrow range divided by the width of the range (hence
the word “density”).  Since the likelihood is relative to other points,
its value can be greater than @code{1.0}.
@end deffn

@geindex cdf() (statistics.NormalDist method)
@anchor{library/statistics statistics NormalDist cdf}@anchor{189b}
@deffn {Method} cdf (x)

Using a cumulative distribution function (cdf)@footnote{https://en.wikipedia.org/wiki/Cumulative_distribution_function},
compute the probability that a random variable `X' will be less than or
equal to `x'.  Mathematically, it is written @code{P(X <= x)}.
@end deffn

@geindex inv_cdf() (statistics.NormalDist method)
@anchor{library/statistics statistics NormalDist inv_cdf}@anchor{2c06}
@deffn {Method} inv_cdf (p)

Compute the inverse cumulative distribution function, also known as the
quantile function@footnote{https://en.wikipedia.org/wiki/Quantile_function}
or the percent-point@footnote{https://web.archive.org/web/20190203145224/https://www.statisticshowto.datasciencecentral.com/inverse-distribution-function/}
function.  Mathematically, it is written @code{x : P(X <= x) = p}.

Finds the value `x' of the random variable `X' such that the
probability of the variable being less than or equal to that value
equals the given probability `p'.
@end deffn

@geindex overlap() (statistics.NormalDist method)
@anchor{library/statistics statistics NormalDist overlap}@anchor{2c07}
@deffn {Method} overlap (other)

Measures the agreement between two normal probability distributions.
Returns a value between 0.0 and 1.0 giving the overlapping area for the two probability density functions@footnote{https://www.rasch.org/rmt/rmt101r.htm}.
@end deffn

@geindex quantiles() (statistics.NormalDist method)
@anchor{library/statistics statistics NormalDist quantiles}@anchor{2c08}
@deffn {Method} quantiles (n=4)

Divide the normal distribution into `n' continuous intervals with
equal probability.  Returns a list of (n - 1) cut points separating
the intervals.

Set `n' to 4 for quartiles (the default).  Set `n' to 10 for deciles.
Set `n' to 100 for percentiles which gives the 99 cuts points that
separate the normal distribution into 100 equal sized groups.
@end deffn

@geindex zscore() (statistics.NormalDist method)
@anchor{library/statistics statistics NormalDist zscore}@anchor{2c09}
@deffn {Method} zscore (x)

Compute the
Standard Score@footnote{https://www.statisticshowto.com/probability-and-statistics/z-score/}
describing `x' in terms of the number of standard deviations
above or below the mean of the normal distribution:
@code{(x - mean) / stdev}.


Added in version 3.9.

@end deffn

Instances of @code{NormalDist} support addition, subtraction,
multiplication and division by a constant.  These operations
are used for translation and scaling.  For example:

@example
>>> temperature_february = NormalDist(5, 2.5)             # Celsius
>>> temperature_february * (9/5) + 32                     # Fahrenheit
NormalDist(mu=41.0, sigma=4.5)
@end example

Dividing a constant by an instance of @code{NormalDist} is not supported
because the result wouldn’t be normally distributed.

Since normal distributions arise from additive effects of independent
variables, it is possible to add and subtract two independent normally distributed random variables@footnote{https://en.wikipedia.org/wiki/Sum_of_normally_distributed_random_variables}
represented as instances of @code{NormalDist}.  For example:

@example
>>> birth_weights = NormalDist.from_samples([2.5, 3.1, 2.1, 2.4, 2.7, 3.5])
>>> drug_effects = NormalDist(0.4, 0.15)
>>> combined = birth_weights + drug_effects
>>> round(combined.mean, 1)
3.1
>>> round(combined.stdev, 1)
0.5
@end example


Added in version 3.8.

@end deffn

@node Examples and Recipes<2>,,NormalDist objects,statistics — Mathematical statistics functions
@anchor{library/statistics examples-and-recipes}@anchor{2c0a}
@subsubsection Examples and Recipes


@menu
* Classic probability problems:: 
* Monte Carlo inputs for simulations:: 
* Approximating binomial distributions:: 
* Naive bayesian classifier:: 

@end menu

@node Classic probability problems,Monte Carlo inputs for simulations,,Examples and Recipes<2>
@anchor{library/statistics classic-probability-problems}@anchor{2c0b}
@subsubsection Classic probability problems


@ref{c33,,NormalDist} readily solves classic probability problems.

For example, given historical data for SAT exams@footnote{https://nces.ed.gov/programs/digest/d17/tables/dt17_226.40.asp} showing
that scores are normally distributed with a mean of 1060 and a standard
deviation of 195, determine the percentage of students with test scores
between 1100 and 1200, after rounding to the nearest whole number:

@example
>>> sat = NormalDist(1060, 195)
>>> fraction = sat.cdf(1200 + 0.5) - sat.cdf(1100 - 0.5)
>>> round(fraction * 100.0, 1)
18.4
@end example

Find the quartiles@footnote{https://en.wikipedia.org/wiki/Quartile} and deciles@footnote{https://en.wikipedia.org/wiki/Decile} for the SAT scores:

@example
>>> list(map(round, sat.quantiles()))
[928, 1060, 1192]
>>> list(map(round, sat.quantiles(n=10)))
[810, 896, 958, 1011, 1060, 1109, 1162, 1224, 1310]
@end example

@node Monte Carlo inputs for simulations,Approximating binomial distributions,Classic probability problems,Examples and Recipes<2>
@anchor{library/statistics monte-carlo-inputs-for-simulations}@anchor{2c0c}
@subsubsection Monte Carlo inputs for simulations


To estimate the distribution for a model that isn’t easy to solve
analytically, @ref{c33,,NormalDist} can generate input samples for a Monte Carlo simulation@footnote{https://en.wikipedia.org/wiki/Monte_Carlo_method}:

@example
>>> def model(x, y, z):
...     return (3*x + 7*x*y - 5*y) / (11 * z)
...
>>> n = 100_000
>>> X = NormalDist(10, 2.5).samples(n, seed=3652260728)
>>> Y = NormalDist(15, 1.75).samples(n, seed=4582495471)
>>> Z = NormalDist(50, 1.25).samples(n, seed=6582483453)
>>> quantiles(map(model, X, Y, Z))
[1.4591308524824727, 1.8035946855390597, 2.175091447274739]
@end example

@node Approximating binomial distributions,Naive bayesian classifier,Monte Carlo inputs for simulations,Examples and Recipes<2>
@anchor{library/statistics approximating-binomial-distributions}@anchor{2c0d}
@subsubsection Approximating binomial distributions


Normal distributions can be used to approximate Binomial distributions@footnote{https://mathworld.wolfram.com/BinomialDistribution.html}
when the sample size is large and when the probability of a successful
trial is near 50%.

For example, an open source conference has 750 attendees and two rooms with a
500 person capacity.  There is a talk about Python and another about Ruby.
In previous conferences, 65% of the attendees preferred to listen to Python
talks.  Assuming the population preferences haven’t changed, what is the
probability that the Python room will stay within its capacity limits?

@example
>>> n = 750             # Sample size
>>> p = 0.65            # Preference for Python
>>> q = 1.0 - p         # Preference for Ruby
>>> k = 500             # Room capacity

>>> # Approximation using the cumulative normal distribution
>>> from math import sqrt
>>> round(NormalDist(mu=n*p, sigma=sqrt(n*p*q)).cdf(k + 0.5), 4)
0.8402

>>> # Exact solution using the cumulative binomial distribution
>>> from math import comb, fsum
>>> round(fsum(comb(n, r) * p**r * q**(n-r) for r in range(k+1)), 4)
0.8402

>>> # Approximation using a simulation
>>> from random import seed, binomialvariate
>>> seed(8675309)
>>> mean(binomialvariate(n, p) <= k for i in range(10_000))
0.8406
@end example

@node Naive bayesian classifier,,Approximating binomial distributions,Examples and Recipes<2>
@anchor{library/statistics naive-bayesian-classifier}@anchor{2c0e}
@subsubsection Naive bayesian classifier


Normal distributions commonly arise in machine learning problems.

Wikipedia has a nice example of a Naive Bayesian Classifier@footnote{https://en.wikipedia.org/wiki/Naive_Bayes_classifier#Person_classification}.
The challenge is to predict a person’s gender from measurements of normally
distributed features including height, weight, and foot size.

We’re given a training dataset with measurements for eight people.  The
measurements are assumed to be normally distributed, so we summarize the data
with @ref{c33,,NormalDist}:

@example
>>> height_male = NormalDist.from_samples([6, 5.92, 5.58, 5.92])
>>> height_female = NormalDist.from_samples([5, 5.5, 5.42, 5.75])
>>> weight_male = NormalDist.from_samples([180, 190, 170, 165])
>>> weight_female = NormalDist.from_samples([100, 150, 130, 150])
>>> foot_size_male = NormalDist.from_samples([12, 11, 12, 10])
>>> foot_size_female = NormalDist.from_samples([6, 8, 7, 9])
@end example

Next, we encounter a new person whose feature measurements are known but whose
gender is unknown:

@example
>>> ht = 6.0        # height
>>> wt = 130        # weight
>>> fs = 8          # foot size
@end example

Starting with a 50% prior probability@footnote{https://en.wikipedia.org/wiki/Prior_probability} of being male or female,
we compute the posterior as the prior times the product of likelihoods for the
feature measurements given the gender:

@example
>>> prior_male = 0.5
>>> prior_female = 0.5
>>> posterior_male = (prior_male * height_male.pdf(ht) *
...                   weight_male.pdf(wt) * foot_size_male.pdf(fs))

>>> posterior_female = (prior_female * height_female.pdf(ht) *
...                     weight_female.pdf(wt) * foot_size_female.pdf(fs))
@end example

The final prediction goes to the largest posterior. This is known as the
maximum a posteriori@footnote{https://en.wikipedia.org/wiki/Maximum_a_posteriori_estimation} or MAP:

@example
>>> 'male' if posterior_male > posterior_female else 'female'
'female'
@end example

@c # This modelines must appear within the last ten lines of the file.
@c kate: indent-width 3; remove-trailing-space on; replace-tabs on; encoding utf-8;

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Functional Programming Modules,File and Directory Access,Numeric and Mathematical Modules,The Python Standard Library
@anchor{library/functional doc}@anchor{2c0f}@anchor{library/functional functional-programming-modules}@anchor{2c10}@anchor{library/functional translation-repo}@anchor{2c11}
@section Functional Programming Modules


The modules described in this chapter provide functions and classes that support
a functional programming style, and general operations on callables.

The following modules are documented in this chapter:

@menu
* itertools — Functions creating iterators for efficient looping:: 
* functools — Higher-order functions and operations on callable objects:: 
* operator — Standard operators as functions:: 

@end menu

@node itertools — Functions creating iterators for efficient looping,functools — Higher-order functions and operations on callable objects,,Functional Programming Modules
@anchor{library/itertools doc}@anchor{2c12}@anchor{library/itertools itertools-functions-creating-iterators-for-efficient-looping}@anchor{2c13}@anchor{library/itertools module-itertools}@anchor{85}
@subsection @code{itertools} — Functions creating iterators for efficient looping


@geindex module; itertools

@c from itertools import *
@c import collections
@c import math
@c import operator
@c import random


__________________________________________________________________


This module implements a number of @ref{4c9,,iterator} building blocks inspired
by constructs from APL, Haskell, and SML.  Each has been recast in a form
suitable for Python.

The module standardizes a core set of fast, memory efficient tools that are
useful by themselves or in combination.  Together, they form an “iterator
algebra” making it possible to construct specialized tools succinctly and
efficiently in pure Python.

For instance, SML provides a tabulation tool: @code{tabulate(f)} which produces a
sequence @code{f(0), f(1), ...}.  The same effect can be achieved in Python
by combining @ref{1a0,,map()} and @ref{148f,,count()} to form @code{map(f, count())}.

`General iterators:'


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Iterator

@tab

Arguments

@tab

Results

@tab

Example

@item

@ref{bf6,,accumulate()}

@tab

p [,func]

@tab

p0, p0+p1, p0+p1+p2, …

@tab

@code{accumulate([1,2,3,4,5]) → 1 3 6 10 15}

@item

@ref{512,,batched()}

@tab

p, n

@tab

(p0, p1, …, p_n-1), …

@tab

@code{batched('ABCDEFG', n=3) → ABC DEF G}

@item

@ref{2626,,chain()}

@tab

p, q, …

@tab

p0, p1, … plast, q0, q1, …

@tab

@code{chain('ABC', 'DEF') → A B C D E F}

@item

@ref{2c14,,chain.from_iterable()}

@tab

iterable

@tab

p0, p1, … plast, q0, q1, …

@tab

@code{chain.from_iterable(['ABC', 'DEF']) → A B C D E F}

@item

@ref{148e,,compress()}

@tab

data, selectors

@tab

(d[0] if s[0]), (d[1] if s[1]), …

@tab

@code{compress('ABCDEF', [1,0,1,0,1,1]) → A C E F}

@item

@ref{148f,,count()}

@tab

[start[, step]]

@tab

start, start+step, start+2*step, …

@tab

@code{count(10) → 10 11 12 13 14 ...}

@item

@ref{2c15,,cycle()}

@tab

p

@tab

p0, p1, … plast, p0, p1, …

@tab

@code{cycle('ABCD') → A B C D A B C D ...}

@item

@ref{2c16,,dropwhile()}

@tab

predicate, seq

@tab

seq[n], seq[n+1], starting when predicate fails

@tab

@code{dropwhile(lambda x: x<5, [1,4,6,3,8]) → 6 3 8}

@item

@ref{2615,,filterfalse()}

@tab

predicate, seq

@tab

elements of seq where predicate(elem) fails

@tab

@code{filterfalse(lambda x: x<5, [1,4,6,3,8]) → 6 8}

@item

@ref{17ad,,groupby()}

@tab

iterable[, key]

@tab

sub-iterators grouped by value of key(v)

@tab

@code{groupby(['A','B','DEF'], len) → (1, A B) (3, DEF)}

@item

@ref{d49,,islice()}

@tab

seq, [start,] stop [, step]

@tab

elements from seq[start:stop:step]

@tab

@code{islice('ABCDEFG', 2, None) → C D E F G}

@item

@ref{a1c,,pairwise()}

@tab

iterable

@tab

(p[0], p[1]), (p[1], p[2])

@tab

@code{pairwise('ABCDEFG') → AB BC CD DE EF FG}

@item

@ref{18a2,,repeat()}

@tab

elem [,n]

@tab

elem, elem, elem, … endlessly or up to n times

@tab

@code{repeat(10, 3) → 10 10 10}

@item

@ref{12f0,,starmap()}

@tab

func, seq

@tab

func(*seq[0]), func(*seq[1]), …

@tab

@code{starmap(pow, [(2,5), (3,2), (10,3)]) → 32 9 1000}

@item

@ref{2c17,,takewhile()}

@tab

predicate, seq

@tab

seq[0], seq[1], until predicate fails

@tab

@code{takewhile(lambda x: x<5, [1,4,6,3,8]) → 1 4}

@item

@ref{2c18,,tee()}

@tab

it, n

@tab

it1, it2, … itn  splits one iterator into n

@tab

@code{tee('ABC', 2) → A B C, A B C}

@item

@ref{14aa,,zip_longest()}

@tab

p, q, …

@tab

(p[0], q[0]), (p[1], q[1]), …

@tab

@code{zip_longest('ABCD', 'xy', fillvalue='-') → Ax By C- D-}

@end multitable


`Combinatoric iterators:'


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Iterator

@tab

Arguments

@tab

Results

@item

@ref{151e,,product()}

@tab

p, q, … [repeat=1]

@tab

cartesian product, equivalent to a nested for-loop

@item

@ref{1d21,,permutations()}

@tab

p[, r]

@tab

r-length tuples, all possible orderings, no repeated elements

@item

@ref{151d,,combinations()}

@tab

p, r

@tab

r-length tuples, in sorted order, no repeated elements

@item

@ref{148d,,combinations_with_replacement()}

@tab

p, r

@tab

r-length tuples, in sorted order, with repeated elements

@end multitable



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Examples

@tab

Results

@item

@code{product('ABCD', repeat=2)}

@tab

@code{AA AB AC AD BA BB BC BD CA CB CC CD DA DB DC DD}

@item

@code{permutations('ABCD', 2)}

@tab

@code{AB AC AD BA BC BD CA CB CD DA DB DC}

@item

@code{combinations('ABCD', 2)}

@tab

@code{AB AC AD BC BD CD}

@item

@code{combinations_with_replacement('ABCD', 2)}

@tab

@code{AA AB AC AD BB BC BD CC CD DD}

@end multitable


@menu
* Itertool Functions:: 
* Itertools Recipes:: 

@end menu

@node Itertool Functions,Itertools Recipes,,itertools — Functions creating iterators for efficient looping
@anchor{library/itertools itertool-functions}@anchor{2c19}@anchor{library/itertools itertools-functions}@anchor{2c1a}
@subsubsection Itertool Functions


The following functions all construct and return iterators. Some provide
streams of infinite length, so they should only be accessed by functions or
loops that truncate the stream.

@geindex accumulate() (in module itertools)
@anchor{library/itertools itertools accumulate}@anchor{bf6}
@deffn {Function} itertools.accumulate (iterable[, function, *, initial=None])

Make an iterator that returns accumulated sums or accumulated
results from other binary functions.

The `function' defaults to addition.  The `function' should accept
two arguments, an accumulated total and a value from the `iterable'.

If an `initial' value is provided, the accumulation will start with
that value and the output will have one more element than the input
iterable.

Roughly equivalent to:

@example
def accumulate(iterable, function=operator.add, *, initial=None):
    'Return running totals'
    # accumulate([1,2,3,4,5]) → 1 3 6 10 15
    # accumulate([1,2,3,4,5], initial=100) → 100 101 103 106 110 115
    # accumulate([1,2,3,4,5], operator.mul) → 1 2 6 24 120

    iterator = iter(iterable)
    total = initial
    if initial is None:
        try:
            total = next(iterator)
        except StopIteration:
            return

    yield total
    for element in iterator:
        total = function(total, element)
        yield total
@end example

To compute a running minimum, set `function' to @ref{1111,,min()}.
For a running maximum, set `function' to @ref{1112,,max()}.
Or for a running product, set `function' to @ref{2c1b,,operator.mul()}.
To build an amortization table@footnote{https://www.ramseysolutions.com/real-estate/amortization-schedule},
accumulate the interest and apply payments:

@example
>>> data = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8]
>>> list(accumulate(data, max))              # running maximum
[3, 4, 6, 6, 6, 9, 9, 9, 9, 9]
>>> list(accumulate(data, operator.mul))     # running product
[3, 12, 72, 144, 144, 1296, 0, 0, 0, 0]

# Amortize a 5% loan of 1000 with 10 annual payments of 90
>>> update = lambda balance, payment: round(balance * 1.05) - payment
>>> list(accumulate(repeat(90, 10), update, initial=1_000))
[1000, 960, 918, 874, 828, 779, 728, 674, 618, 559, 497]
@end example

See @ref{21c,,functools.reduce()} for a similar function that returns only the
final accumulated value.


Added in version 3.2.



Changed in version 3.3: Added the optional `function' parameter.



Changed in version 3.8: Added the optional `initial' parameter.

@end deffn

@geindex batched() (in module itertools)
@anchor{library/itertools itertools batched}@anchor{512}
@deffn {Function} itertools.batched (iterable, n, *, strict=False)

Batch data from the `iterable' into tuples of length `n'. The last
batch may be shorter than `n'.

If `strict' is true, will raise a @ref{2ee,,ValueError} if the final
batch is shorter than `n'.

Loops over the input iterable and accumulates data into tuples up to
size `n'.  The input is consumed lazily, just enough to fill a batch.
The result is yielded as soon as the batch is full or when the input
iterable is exhausted:

@example
>>> flattened_data = ['roses', 'red', 'violets', 'blue', 'sugar', 'sweet']
>>> unflattened = list(batched(flattened_data, 2))
>>> unflattened
[('roses', 'red'), ('violets', 'blue'), ('sugar', 'sweet')]
@end example

Roughly equivalent to:

@example
def batched(iterable, n, *, strict=False):
    # batched('ABCDEFG', 3) → ABC DEF G
    if n < 1:
        raise ValueError('n must be at least one')
    iterator = iter(iterable)
    while batch := tuple(islice(iterator, n)):
        if strict and len(batch) != n:
            raise ValueError('batched(): incomplete batch')
        yield batch
@end example


Added in version 3.12.



Changed in version 3.13: Added the `strict' option.

@end deffn

@geindex chain() (in module itertools)
@anchor{library/itertools itertools chain}@anchor{2626}
@deffn {Function} itertools.chain (*iterables)

Make an iterator that returns elements from the first iterable until
it is exhausted, then proceeds to the next iterable, until all of the
iterables are exhausted.  This combines multiple data sources into a
single iterator.  Roughly equivalent to:

@example
def chain(*iterables):
    # chain('ABC', 'DEF') → A B C D E F
    for iterable in iterables:
        yield from iterable
@end example
@end deffn

@geindex from_iterable() (itertools.chain class method)
@anchor{library/itertools itertools chain from_iterable}@anchor{2c14}
@deffn {Method} classmethod chain.from_iterable (iterable)

Alternate constructor for @ref{2626,,chain()}.  Gets chained inputs from a
single iterable argument that is evaluated lazily.  Roughly equivalent to:

@example
def from_iterable(iterables):
    # chain.from_iterable(['ABC', 'DEF']) → A B C D E F
    for iterable in iterables:
        yield from iterable
@end example
@end deffn

@geindex combinations() (in module itertools)
@anchor{library/itertools itertools combinations}@anchor{151d}
@deffn {Function} itertools.combinations (iterable, r)

Return `r' length subsequences of elements from the input `iterable'.

The output is a subsequence of @ref{151e,,product()} keeping only entries that
are subsequences of the `iterable'.  The length of the output is given
by @ref{8e1,,math.comb()} which computes @code{n! / r! / (n - r)!} when @code{0 ≤ r
≤ n} or zero when @code{r > n}.

The combination tuples are emitted in lexicographic order according to
the order of the input `iterable'. If the input `iterable' is sorted,
the output tuples will be produced in sorted order.

Elements are treated as unique based on their position, not on their
value.  If the input elements are unique, there will be no repeated
values within each combination.

Roughly equivalent to:

@example
def combinations(iterable, r):
    # combinations('ABCD', 2) → AB AC AD BC BD CD
    # combinations(range(4), 3) → 012 013 023 123

    pool = tuple(iterable)
    n = len(pool)
    if r > n:
        return
    indices = list(range(r))

    yield tuple(pool[i] for i in indices)
    while True:
        for i in reversed(range(r)):
            if indices[i] != i + n - r:
                break
        else:
            return
        indices[i] += 1
        for j in range(i+1, r):
            indices[j] = indices[j-1] + 1
        yield tuple(pool[i] for i in indices)
@end example
@end deffn

@geindex combinations_with_replacement() (in module itertools)
@anchor{library/itertools itertools combinations_with_replacement}@anchor{148d}
@deffn {Function} itertools.combinations_with_replacement (iterable, r)

Return `r' length subsequences of elements from the input `iterable'
allowing individual elements to be repeated more than once.

The output is a subsequence of @ref{151e,,product()} that keeps only entries
that are subsequences (with possible repeated elements) of the
`iterable'.  The number of subsequence returned is @code{(n + r - 1)! / r! /
(n - 1)!} when @code{n > 0}.

The combination tuples are emitted in lexicographic order according to
the order of the input `iterable'. if the input `iterable' is sorted,
the output tuples will be produced in sorted order.

Elements are treated as unique based on their position, not on their
value.  If the input elements are unique, the generated combinations
will also be unique.

Roughly equivalent to:

@example
def combinations_with_replacement(iterable, r):
    # combinations_with_replacement('ABC', 2) → AA AB AC BB BC CC

    pool = tuple(iterable)
    n = len(pool)
    if not n and r:
        return
    indices = [0] * r

    yield tuple(pool[i] for i in indices)
    while True:
        for i in reversed(range(r)):
            if indices[i] != n - 1:
                break
        else:
            return
        indices[i:] = [indices[i] + 1] * (r - i)
        yield tuple(pool[i] for i in indices)
@end example


Added in version 3.1.

@end deffn

@geindex compress() (in module itertools)
@anchor{library/itertools itertools compress}@anchor{148e}
@deffn {Function} itertools.compress (data, selectors)

Make an iterator that returns elements from `data' where the
corresponding element in `selectors' is true.  Stops when either the
`data' or `selectors' iterables have been exhausted.  Roughly
equivalent to:

@example
def compress(data, selectors):
    # compress('ABCDEF', [1,0,1,0,1,1]) → A C E F
    return (datum for datum, selector in zip(data, selectors) if selector)
@end example


Added in version 3.1.

@end deffn

@geindex count() (in module itertools)
@anchor{library/itertools itertools count}@anchor{148f}
@deffn {Function} itertools.count (start=0, step=1)

Make an iterator that returns evenly spaced values beginning with
`start'. Can be used with @ref{1a0,,map()} to generate consecutive data
points or with @ref{1a1,,zip()} to add sequence numbers.  Roughly
equivalent to:

@example
def count(start=0, step=1):
    # count(10) → 10 11 12 13 14 ...
    # count(2.5, 0.5) → 2.5 3.0 3.5 ...
    n = start
    while True:
        yield n
        n += step
@end example

When counting with floating-point numbers, better accuracy can sometimes be
achieved by substituting multiplicative code such as: @code{(start + step * i
for i in count())}.


Changed in version 3.1: Added `step' argument and allowed non-integer arguments.

@end deffn

@geindex cycle() (in module itertools)
@anchor{library/itertools itertools cycle}@anchor{2c15}
@deffn {Function} itertools.cycle (iterable)

Make an iterator returning elements from the `iterable' and saving a
copy of each.  When the iterable is exhausted, return elements from
the saved copy.  Repeats indefinitely.  Roughly equivalent to:

@example
def cycle(iterable):
    # cycle('ABCD') → A B C D A B C D A B C D ...

    saved = []
    for element in iterable:
        yield element
        saved.append(element)

    while saved:
        for element in saved:
            yield element
@end example

This itertool may require significant auxiliary storage (depending on
the length of the iterable).
@end deffn

@geindex dropwhile() (in module itertools)
@anchor{library/itertools itertools dropwhile}@anchor{2c16}
@deffn {Function} itertools.dropwhile (predicate, iterable)

Make an iterator that drops elements from the `iterable' while the
`predicate' is true and afterwards returns every element.  Roughly
equivalent to:

@example
def dropwhile(predicate, iterable):
    # dropwhile(lambda x: x<5, [1,4,6,3,8]) → 6 3 8

    iterator = iter(iterable)
    for x in iterator:
        if not predicate(x):
            yield x
            break

    for x in iterator:
        yield x
@end example

Note this does not produce `any' output until the predicate first
becomes false, so this itertool may have a lengthy start-up time.
@end deffn

@geindex filterfalse() (in module itertools)
@anchor{library/itertools itertools filterfalse}@anchor{2615}
@deffn {Function} itertools.filterfalse (predicate, iterable)

Make an iterator that filters elements from the `iterable' returning
only those for which the `predicate' returns a false value.  If
`predicate' is @code{None}, returns the items that are false.  Roughly
equivalent to:

@example
def filterfalse(predicate, iterable):
    # filterfalse(lambda x: x<5, [1,4,6,3,8]) → 6 8

    if predicate is None:
        predicate = bool

    for x in iterable:
        if not predicate(x):
            yield x
@end example
@end deffn

@geindex groupby() (in module itertools)
@anchor{library/itertools itertools groupby}@anchor{17ad}
@deffn {Function} itertools.groupby (iterable, key=None)

Make an iterator that returns consecutive keys and groups from the `iterable'.
The `key' is a function computing a key value for each element.  If not
specified or is @code{None}, `key' defaults to an identity function and returns
the element unchanged.  Generally, the iterable needs to already be sorted on
the same key function.

The operation of @code{groupby()} is similar to the @code{uniq} filter in Unix.  It
generates a break or new group every time the value of the key function changes
(which is why it is usually necessary to have sorted the data using the same key
function).  That behavior differs from SQL’s GROUP BY which aggregates common
elements regardless of their input order.

The returned group is itself an iterator that shares the underlying iterable
with @code{groupby()}.  Because the source is shared, when the @code{groupby()}
object is advanced, the previous group is no longer visible.  So, if that data
is needed later, it should be stored as a list:

@example
groups = []
uniquekeys = []
data = sorted(data, key=keyfunc)
for k, g in groupby(data, keyfunc):
    groups.append(list(g))      # Store group iterator as a list
    uniquekeys.append(k)
@end example

@code{groupby()} is roughly equivalent to:

@example
def groupby(iterable, key=None):
    # [k for k, g in groupby('AAAABBBCCDAABBB')] → A B C D A B
    # [list(g) for k, g in groupby('AAAABBBCCD')] → AAAA BBB CC D

    keyfunc = (lambda x: x) if key is None else key
    iterator = iter(iterable)
    exhausted = False

    def _grouper(target_key):
        nonlocal curr_value, curr_key, exhausted
        yield curr_value
        for curr_value in iterator:
            curr_key = keyfunc(curr_value)
            if curr_key != target_key:
                return
            yield curr_value
        exhausted = True

    try:
        curr_value = next(iterator)
    except StopIteration:
        return
    curr_key = keyfunc(curr_value)

    while not exhausted:
        target_key = curr_key
        curr_group = _grouper(target_key)
        yield curr_key, curr_group
        if curr_key == target_key:
            for _ in curr_group:
                pass
@end example
@end deffn

@geindex islice() (in module itertools)
@anchor{library/itertools itertools islice}@anchor{d49}
@deffn {Function} itertools.islice (iterable, stop)

@deffnx {Function} itertools.islice (iterable, start, stop[, step])

Make an iterator that returns selected elements from the iterable.
Works like sequence slicing but does not support negative values for
`start', `stop', or `step'.

If `start' is zero or @code{None}, iteration starts at zero.  Otherwise,
elements from the iterable are skipped until `start' is reached.

If `stop' is @code{None}, iteration continues until the input is
exhausted, if at all.  Otherwise, it stops at the specified position.

If `step' is @code{None}, the step defaults to one.  Elements are returned
consecutively unless `step' is set higher than one which results in
items being skipped.

Roughly equivalent to:

@example
def islice(iterable, *args):
    # islice('ABCDEFG', 2) → A B
    # islice('ABCDEFG', 2, 4) → C D
    # islice('ABCDEFG', 2, None) → C D E F G
    # islice('ABCDEFG', 0, None, 2) → A C E G

    s = slice(*args)
    start = 0 if s.start is None else s.start
    stop = s.stop
    step = 1 if s.step is None else s.step
    if start < 0 or (stop is not None and stop < 0) or step <= 0:
        raise ValueError

    indices = count() if stop is None else range(max(start, stop))
    next_i = start
    for i, element in zip(indices, iterable):
        if i == next_i:
            yield element
            next_i += step
@end example

If the input is an iterator, then fully consuming the `islice'
advances the input iterator by @code{max(start, stop)} steps regardless
of the `step' value.
@end deffn

@geindex pairwise() (in module itertools)
@anchor{library/itertools itertools pairwise}@anchor{a1c}
@deffn {Function} itertools.pairwise (iterable)

Return successive overlapping pairs taken from the input `iterable'.

The number of 2-tuples in the output iterator will be one fewer than the
number of inputs.  It will be empty if the input iterable has fewer than
two values.

Roughly equivalent to:

@example
def pairwise(iterable):
    # pairwise('ABCDEFG') → AB BC CD DE EF FG

    iterator = iter(iterable)
    a = next(iterator, None)

    for b in iterator:
        yield a, b
        a = b
@end example


Added in version 3.10.

@end deffn

@geindex permutations() (in module itertools)
@anchor{library/itertools itertools permutations}@anchor{1d21}
@deffn {Function} itertools.permutations (iterable, r=None)

Return successive `r' length permutations of elements@footnote{https://www.britannica.com/science/permutation} from the `iterable'.

If `r' is not specified or is @code{None}, then `r' defaults to the length
of the `iterable' and all possible full-length permutations
are generated.

The output is a subsequence of @ref{151e,,product()} where entries with
repeated elements have been filtered out.  The length of the output is
given by @ref{8e2,,math.perm()} which computes @code{n! / (n - r)!} when
@code{0 ≤ r ≤ n} or zero when @code{r > n}.

The permutation tuples are emitted in lexicographic order according to
the order of the input `iterable'.  If the input `iterable' is sorted,
the output tuples will be produced in sorted order.

Elements are treated as unique based on their position, not on their
value.  If the input elements are unique, there will be no repeated
values within a permutation.

Roughly equivalent to:

@example
def permutations(iterable, r=None):
    # permutations('ABCD', 2) → AB AC AD BA BC BD CA CB CD DA DB DC
    # permutations(range(3)) → 012 021 102 120 201 210

    pool = tuple(iterable)
    n = len(pool)
    r = n if r is None else r
    if r > n:
        return

    indices = list(range(n))
    cycles = list(range(n, n-r, -1))
    yield tuple(pool[i] for i in indices[:r])

    while n:
        for i in reversed(range(r)):
            cycles[i] -= 1
            if cycles[i] == 0:
                indices[i:] = indices[i+1:] + indices[i:i+1]
                cycles[i] = n - i
            else:
                j = cycles[i]
                indices[i], indices[-j] = indices[-j], indices[i]
                yield tuple(pool[i] for i in indices[:r])
                break
        else:
            return
@end example
@end deffn

@geindex product() (in module itertools)
@anchor{library/itertools itertools product}@anchor{151e}
@deffn {Function} itertools.product (*iterables, repeat=1)

Cartesian product@footnote{https://en.wikipedia.org/wiki/Cartesian_product}
of the input iterables.

Roughly equivalent to nested for-loops in a generator expression. For example,
@code{product(A, B)} returns the same as @code{((x,y) for x in A for y in B)}.

The nested loops cycle like an odometer with the rightmost element advancing
on every iteration.  This pattern creates a lexicographic ordering so that if
the input’s iterables are sorted, the product tuples are emitted in sorted
order.

To compute the product of an iterable with itself, specify the number of
repetitions with the optional `repeat' keyword argument.  For example,
@code{product(A, repeat=4)} means the same as @code{product(A, A, A, A)}.

This function is roughly equivalent to the following code, except that the
actual implementation does not build up intermediate results in memory:

@example
def product(*iterables, repeat=1):
    # product('ABCD', 'xy') → Ax Ay Bx By Cx Cy Dx Dy
    # product(range(2), repeat=3) → 000 001 010 011 100 101 110 111

    if repeat < 0:
        raise ValueError('repeat argument cannot be negative')
    pools = [tuple(pool) for pool in iterables] * repeat

    result = [[]]
    for pool in pools:
        result = [x+[y] for x in result for y in pool]

    for prod in result:
        yield tuple(prod)
@end example

Before @code{product()} runs, it completely consumes the input iterables,
keeping pools of values in memory to generate the products.  Accordingly,
it is only useful with finite inputs.
@end deffn

@geindex repeat() (in module itertools)
@anchor{library/itertools itertools repeat}@anchor{18a2}
@deffn {Function} itertools.repeat (object[, times])

Make an iterator that returns `object' over and over again. Runs indefinitely
unless the `times' argument is specified.

Roughly equivalent to:

@example
def repeat(object, times=None):
    # repeat(10, 3) → 10 10 10
    if times is None:
        while True:
            yield object
    else:
        for i in range(times):
            yield object
@end example

A common use for `repeat' is to supply a stream of constant values to `map'
or `zip':

@example
>>> list(map(pow, range(10), repeat(2)))
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
@end example
@end deffn

@geindex starmap() (in module itertools)
@anchor{library/itertools itertools starmap}@anchor{12f0}
@deffn {Function} itertools.starmap (function, iterable)

Make an iterator that computes the `function' using arguments obtained
from the `iterable'.  Used instead of @ref{1a0,,map()} when argument
parameters have already been “pre-zipped” into tuples.

The difference between @ref{1a0,,map()} and @code{starmap()} parallels the
distinction between @code{function(a,b)} and @code{function(*c)}. Roughly
equivalent to:

@example
def starmap(function, iterable):
    # starmap(pow, [(2,5), (3,2), (10,3)]) → 32 9 1000
    for args in iterable:
        yield function(*args)
@end example
@end deffn

@geindex takewhile() (in module itertools)
@anchor{library/itertools itertools takewhile}@anchor{2c17}
@deffn {Function} itertools.takewhile (predicate, iterable)

Make an iterator that returns elements from the `iterable' as long as
the `predicate' is true.  Roughly equivalent to:

@example
def takewhile(predicate, iterable):
    # takewhile(lambda x: x<5, [1,4,6,3,8]) → 1 4
    for x in iterable:
        if not predicate(x):
            break
        yield x
@end example

Note, the element that first fails the predicate condition is
consumed from the input iterator and there is no way to access it.
This could be an issue if an application wants to further consume the
input iterator after `takewhile' has been run to exhaustion.  To work
around this problem, consider using more-itertools before_and_after()@footnote{https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.before_and_after}
instead.
@end deffn

@geindex tee() (in module itertools)
@anchor{library/itertools itertools tee}@anchor{2c18}
@deffn {Function} itertools.tee (iterable, n=2)

Return `n' independent iterators from a single iterable.

Roughly equivalent to:

@example
def tee(iterable, n=2):
    if n < 0:
        raise ValueError
    if n == 0:
        return ()
    iterator = _tee(iterable)
    result = [iterator]
    for _ in range(n - 1):
        result.append(_tee(iterator))
    return tuple(result)

class _tee:

    def __init__(self, iterable):
        it = iter(iterable)
        if isinstance(it, _tee):
            self.iterator = it.iterator
            self.link = it.link
        else:
            self.iterator = it
            self.link = [None, None]

    def __iter__(self):
        return self

    def __next__(self):
        link = self.link
        if link[1] is None:
            link[0] = next(self.iterator)
            link[1] = [None, None]
        value, self.link = link
        return value
@end example

When the input `iterable' is already a tee iterator object, all
members of the return tuple are constructed as if they had been
produced by the upstream @code{tee()} call.  This “flattening step”
allows nested @code{tee()} calls to share the same underlying data
chain and to have a single update step rather than a chain of calls.

The flattening property makes tee iterators efficiently peekable:

@example
def lookahead(tee_iterator):
     "Return the next value without moving the input forward"
     [forked_iterator] = tee(tee_iterator, 1)
     return next(forked_iterator)
@end example

@example
>>> iterator = iter('abcdef')
>>> [iterator] = tee(iterator, 1)   # Make the input peekable
>>> next(iterator)                  # Move the iterator forward
'a'
>>> lookahead(iterator)             # Check next value
'b'
>>> next(iterator)                  # Continue moving forward
'b'
@end example

@code{tee} iterators are not threadsafe. A @ref{246,,RuntimeError} may be
raised when simultaneously using iterators returned by the same @code{tee()}
call, even if the original `iterable' is threadsafe.

This itertool may require significant auxiliary storage (depending on how
much temporary data needs to be stored). In general, if one iterator uses
most or all of the data before another iterator starts, it is faster to use
@ref{24f,,list()} instead of @code{tee()}.
@end deffn

@geindex zip_longest() (in module itertools)
@anchor{library/itertools itertools zip_longest}@anchor{14aa}
@deffn {Function} itertools.zip_longest (*iterables, fillvalue=None)

Make an iterator that aggregates elements from each of the
`iterables'.

If the iterables are of uneven length, missing values are filled-in
with `fillvalue'.  If not specified, `fillvalue' defaults to @code{None}.

Iteration continues until the longest iterable is exhausted.

Roughly equivalent to:

@example
def zip_longest(*iterables, fillvalue=None):
    # zip_longest('ABCD', 'xy', fillvalue='-') → Ax By C- D-

    iterators = list(map(iter, iterables))
    num_active = len(iterators)
    if not num_active:
        return

    while True:
        values = []
        for i, iterator in enumerate(iterators):
            try:
                value = next(iterator)
            except StopIteration:
                num_active -= 1
                if not num_active:
                    return
                iterators[i] = repeat(fillvalue)
                value = fillvalue
            values.append(value)
        yield tuple(values)
@end example

If one of the iterables is potentially infinite, then the @code{zip_longest()}
function should be wrapped with something that limits the number of calls
(for example @ref{d49,,islice()} or @ref{2c17,,takewhile()}).
@end deffn

@node Itertools Recipes,,Itertool Functions,itertools — Functions creating iterators for efficient looping
@anchor{library/itertools id1}@anchor{2c1c}@anchor{library/itertools itertools-recipes}@anchor{146a}
@subsubsection Itertools Recipes


This section shows recipes for creating an extended toolset using the existing
itertools as building blocks.

The primary purpose of the itertools recipes is educational.  The recipes show
various ways of thinking about individual tools — for example, that
@code{chain.from_iterable} is related to the concept of flattening.  The recipes
also give ideas about ways that the tools can be combined — for example, how
@code{starmap()} and @code{repeat()} can work together.  The recipes also show patterns
for using itertools with the @ref{a3,,operator} and @ref{1e,,collections} modules as
well as with the built-in itertools such as @code{map()}, @code{filter()},
@code{reversed()}, and @code{enumerate()}.

A secondary purpose of the recipes is to serve as an incubator.  The
@code{accumulate()}, @code{compress()}, and @code{pairwise()} itertools started out as
recipes.  Currently, the @code{sliding_window()}, @code{derangements()}, and @code{sieve()}
recipes are being tested to see whether they prove their worth.

Substantially all of these recipes and many, many others can be installed from
the more-itertools@footnote{https://pypi.org/project/more-itertools/} project found
on the Python Package Index:

@example
python -m pip install more-itertools
@end example

Many of the recipes offer the same high performance as the underlying toolset.
Superior memory performance is kept by processing elements one at a time rather
than bringing the whole iterable into memory all at once. Code volume is kept
small by linking the tools together in a functional style@footnote{https://www.cs.kent.ac.uk/people/staff/dat/miranda/whyfp90.pdf}.  High speed
is retained by preferring “vectorized” building blocks over the use of for-loops
and @ref{1267,,generators} which incur interpreter overhead.

@example
from itertools import (accumulate, batched, chain, combinations, compress,
     count, cycle, filterfalse, groupby, islice, permutations, product,
     repeat, starmap, tee, zip_longest)
from collections import Counter, deque
from contextlib import suppress
from functools import reduce
from heapq import heappush, heappushpop, heappush_max, heappushpop_max
from math import comb, isqrt, prod, sumprod
from operator import getitem, is_not, itemgetter, mul, neg, truediv


# ==== Basic one liners ====

def take(n, iterable):
    "Return first n items of the iterable as a list."
    return list(islice(iterable, n))

def prepend(value, iterable):
    "Prepend a single value in front of an iterable."
    # prepend(1, [2, 3, 4]) → 1 2 3 4
    return chain([value], iterable)

def repeatfunc(function, times=None, *args):
    "Repeat calls to a function with specified arguments."
    if times is None:
        return starmap(function, repeat(args))
    return starmap(function, repeat(args, times))

def flatten(list_of_lists):
    "Flatten one level of nesting."
    return chain.from_iterable(list_of_lists)

def ncycles(iterable, n):
    "Returns the sequence elements n times."
    return chain.from_iterable(repeat(tuple(iterable), n))

def loops(n):
    "Loop n times. Like range(n) but without creating integers."
    # for _ in loops(100): ...
    return repeat(None, n)

def tail(n, iterable):
    "Return an iterator over the last n items."
    # tail(3, 'ABCDEFG') → E F G
    return iter(deque(iterable, maxlen=n))

def consume(iterator, n=None):
    "Advance the iterator n-steps ahead. If n is None, consume entirely."
    # Use functions that consume iterators at C speed.
    if n is None:
        deque(iterator, maxlen=0)
    else:
        next(islice(iterator, n, n), None)

def nth(iterable, n, default=None):
    "Returns the nth item or a default value."
    return next(islice(iterable, n, None), default)

def quantify(iterable, predicate=bool):
    "Given a predicate that returns True or False, count the True results."
    return sum(map(predicate, iterable))

def first_true(iterable, default=False, predicate=None):
    "Returns the first true value or the *default* if there is no true value."
    # first_true([a, b, c], x) → a or b or c or x
    # first_true([a, b], x, f) → a if f(a) else b if f(b) else x
    return next(filter(predicate, iterable), default)

def all_equal(iterable, key=None):
    "Returns True if all the elements are equal to each other."
    # all_equal('4٤௪౪໔', key=int) → True
    return len(take(2, groupby(iterable, key))) <= 1


# ==== Data pipelines ====

def unique_justseen(iterable, key=None):
    "Yield unique elements, preserving order. Remember only the element just seen."
    # unique_justseen('AAAABBBCCDAABBB') → A B C D A B
    # unique_justseen('ABBcCAD', str.casefold) → A B c A D
    if key is None:
        return map(itemgetter(0), groupby(iterable))
    return map(next, map(itemgetter(1), groupby(iterable, key)))

def unique_everseen(iterable, key=None):
    "Yield unique elements, preserving order. Remember all elements ever seen."
    # unique_everseen('AAAABBBCCDAABBB') → A B C D
    # unique_everseen('ABBcCAD', str.casefold) → A B c D
    seen = set()
    if key is None:
        for element in filterfalse(seen.__contains__, iterable):
            seen.add(element)
            yield element
    else:
        for element in iterable:
            k = key(element)
            if k not in seen:
                seen.add(k)
                yield element

def unique(iterable, key=None, reverse=False):
    "Yield unique elements in sorted order. Supports unhashable inputs."
    # unique([[1, 2], [3, 4], [1, 2]]) → [1, 2] [3, 4]
    sequenced = sorted(iterable, key=key, reverse=reverse)
    return unique_justseen(sequenced, key=key)

def sliding_window(iterable, n):
    "Collect data into overlapping fixed-length chunks or blocks."
    # sliding_window('ABCDEFG', 3) → ABC BCD CDE DEF EFG
    iterator = iter(iterable)
    window = deque(islice(iterator, n - 1), maxlen=n)
    for x in iterator:
        window.append(x)
        yield tuple(window)

def grouper(iterable, n, *, incomplete='fill', fillvalue=None):
    "Collect data into non-overlapping fixed-length chunks or blocks."
    # grouper('ABCDEFG', 3, fillvalue='x')       → ABC DEF Gxx
    # grouper('ABCDEFG', 3, incomplete='strict') → ABC DEF ValueError
    # grouper('ABCDEFG', 3, incomplete='ignore') → ABC DEF
    iterators = [iter(iterable)] * n
    match incomplete:
        case 'fill':
            return zip_longest(*iterators, fillvalue=fillvalue)
        case 'strict':
            return zip(*iterators, strict=True)
        case 'ignore':
            return zip(*iterators)
        case _:
            raise ValueError('Expected fill, strict, or ignore')

def roundrobin(*iterables):
    "Visit input iterables in a cycle until each is exhausted."
    # roundrobin('ABC', 'D', 'EF') → A D E B F C
    # Algorithm credited to George Sakkis
    iterators = map(iter, iterables)
    for num_active in range(len(iterables), 0, -1):
        iterators = cycle(islice(iterators, num_active))
        yield from map(next, iterators)

def subslices(seq):
    "Return all contiguous non-empty subslices of a sequence."
    # subslices('ABCD') → A AB ABC ABCD B BC BCD C CD D
    slices = starmap(slice, combinations(range(len(seq) + 1), 2))
    return map(getitem, repeat(seq), slices)

def derangements(iterable, r=None):
    "Produce r length permutations without fixed points."
    # derangements('ABCD') → BADC BCDA BDAC CADB CDAB CDBA DABC DCAB DCBA
    # Algorithm credited to Stefan Pochmann
    seq = tuple(iterable)
    pos = tuple(range(len(seq)))
    have_moved = map(map, repeat(is_not), repeat(pos), permutations(pos, r=r))
    valid_derangements = map(all, have_moved)
    return compress(permutations(seq, r=r), valid_derangements)

def iter_index(iterable, value, start=0, stop=None):
    "Return indices where a value occurs in a sequence or iterable."
    # iter_index('AABCADEAF', 'A') → 0 1 4 7
    seq_index = getattr(iterable, 'index', None)
    if seq_index is None:
        iterator = islice(iterable, start, stop)
        for i, element in enumerate(iterator, start):
            if element is value or element == value:
                yield i
    else:
        stop = len(iterable) if stop is None else stop
        i = start
        with suppress(ValueError):
            while True:
                yield (i := seq_index(value, i, stop))
                i += 1

def iter_except(function, exception, first=None):
    "Convert a call-until-exception interface to an iterator interface."
    # iter_except(d.popitem, KeyError) → non-blocking dictionary iterator
    with suppress(exception):
        if first is not None:
            yield first()
        while True:
            yield function()


# ==== Mathematical operations ====

def multinomial(*counts):
    "Number of distinct arrangements of a multiset."
    # Counter('abracadabra').values() → 5 2 2 1 1
    # multinomial(5, 2, 2, 1, 1) → 83160
    return prod(map(comb, accumulate(counts), counts))

def powerset(iterable):
    "Subsequences of the iterable from shortest to longest."
    # powerset([1,2,3]) → () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)
    s = list(iterable)
    return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))

def sum_of_squares(iterable):
    "Add up the squares of the input values."
    # sum_of_squares([10, 20, 30]) → 1400
    return sumprod(*tee(iterable))


# ==== Matrix operations ====

def reshape(matrix, columns):
    "Reshape a 2-D matrix to have a given number of columns."
    # reshape([(0, 1), (2, 3), (4, 5)], 3) →  (0, 1, 2) (3, 4, 5)
    return batched(chain.from_iterable(matrix), columns, strict=True)

def transpose(matrix):
    "Swap the rows and columns of a 2-D matrix."
    # transpose([(1, 2, 3), (11, 22, 33)]) → (1, 11) (2, 22) (3, 33)
    return zip(*matrix, strict=True)

def matmul(m1, m2):
    "Multiply two matrices."
    # matmul([(7, 5), (3, 5)], [(2, 5), (7, 9)]) → (49, 80) (41, 60)
    n = len(m2[0])
    return batched(starmap(sumprod, product(m1, transpose(m2))), n)


# ==== Polynomial arithmetic ====

def convolve(signal, kernel):
    """Discrete linear convolution of two iterables.
    Equivalent to polynomial multiplication.

    Convolutions are mathematically commutative; however, the inputs are
    evaluated differently.  The signal is consumed lazily and can be
    infinite. The kernel is fully consumed before the calculations begin.

    Article:  https://betterexplained.com/articles/intuitive-convolution/
    Video:    https://www.youtube.com/watch?v=KuXjwB4LzSA
    """
    # convolve([1, -1, -20], [1, -3]) → 1 -4 -17 60
    # convolve(data, [0.25, 0.25, 0.25, 0.25]) → Moving average (blur)
    # convolve(data, [1/2, 0, -1/2]) → 1st derivative estimate
    # convolve(data, [1, -2, 1]) → 2nd derivative estimate
    kernel = tuple(kernel)[::-1]
    n = len(kernel)
    padded_signal = chain(repeat(0, n-1), signal, repeat(0, n-1))
    windowed_signal = sliding_window(padded_signal, n)
    return map(sumprod, repeat(kernel), windowed_signal)

def polynomial_from_roots(roots):
    """Compute a polynomial's coefficients from its roots.

       (x - 5) (x + 4) (x - 3)  expands to:   x³ -4x² -17x + 60
    """
    # polynomial_from_roots([5, -4, 3]) → [1, -4, -17, 60]
    factors = zip(repeat(1), map(neg, roots))
    return list(reduce(convolve, factors, [1]))

def polynomial_eval(coefficients, x):
    """Evaluate a polynomial at a specific value.

    Computes with better numeric stability than Horner's method.
    """
    # Evaluate x³ -4x² -17x + 60 at x = 5
    # polynomial_eval([1, -4, -17, 60], x=5) → 0
    n = len(coefficients)
    if not n:
        return type(x)(0)
    powers = map(pow, repeat(x), reversed(range(n)))
    return sumprod(coefficients, powers)

def polynomial_derivative(coefficients):
    """Compute the first derivative of a polynomial.

       f(x)  =  x³ -4x² -17x + 60
       f'(x) = 3x² -8x  -17
    """
    # polynomial_derivative([1, -4, -17, 60]) → [3, -8, -17]
    n = len(coefficients)
    powers = reversed(range(1, n))
    return list(map(mul, coefficients, powers))


# ==== Number theory ====

def sieve(n):
    "Primes less than n."
    # sieve(30) → 2 3 5 7 11 13 17 19 23 29
    if n > 2:
        yield 2
    data = bytearray((0, 1)) * (n // 2)
    for p in iter_index(data, 1, start=3, stop=isqrt(n) + 1):
        data[p*p : n : p+p] = bytes(len(range(p*p, n, p+p)))
    yield from iter_index(data, 1, start=3)

def factor(n):
    "Prime factors of n."
    # factor(99) → 3 3 11
    # factor(1_000_000_000_000_007) → 47 59 360620266859
    # factor(1_000_000_000_000_403) → 1000000000000403
    for prime in sieve(isqrt(n) + 1):
        while not n % prime:
            yield prime
            n //= prime
            if n == 1:
                return
    if n > 1:
        yield n

def is_prime(n):
    "Return True if n is prime."
    # is_prime(1_000_000_000_000_403) → True
    return n > 1 and next(factor(n)) == n

def totient(n):
    "Count of natural numbers up to n that are coprime to n."
    # https://mathworld.wolfram.com/TotientFunction.html
    # totient(12) → 4 because len([1, 5, 7, 11]) == 4
    for prime in set(factor(n)):
        n -= n // prime
    return n


# ==== Running statistics ====

def running_mean(iterable):
    "Average of values seen so far."
    # running_mean([37, 33, 38, 28]) → 37 35 36 34
    return map(truediv, accumulate(iterable), count(1))

def running_min(iterable):
    "Smallest of values seen so far."
    # running_min([37, 33, 38, 28]) → 37 33 33 28
    return accumulate(iterable, func=min)

def running_max(iterable):
    "Largest of values seen so far."
    # running_max([37, 33, 38, 28]) → 37 37 38 38
    return accumulate(iterable, func=max)

def running_median(iterable):
    "Median of values seen so far."
    # running_median([37, 33, 38, 28]) → 37 35 37 35
    read = iter(iterable).__next__
    lo = []  # max-heap
    hi = []  # min-heap the same size as or one smaller than lo
    with suppress(StopIteration):
        while True:
            heappush_max(lo, heappushpop(hi, read()))
            yield lo[0]
            heappush(hi, heappushpop_max(lo, read()))
            yield (lo[0] + hi[0]) / 2

def running_statistics(iterable):
    "Aggregate statistics for values seen so far."
    # Generate tuples:  (size, minimum, median, maximum, mean)
    t0, t1, t2, t3 = tee(iterable, 4)
    return zip(
        count(1),
        running_min(t0),
        running_median(t1),
        running_max(t2),
        running_mean(t3),
    )
@end example

@c These examples no longer appear in the docs but are guaranteed
@c to keep working.
@c 
@c >>> amounts = [120.15, 764.05, 823.14]
@c >>> for checknum, amount in zip(count(1200), amounts):
@c ...     print('Check %d is for $%.2f' % (checknum, amount))
@c ...
@c Check 1200 is for $120.15
@c Check 1201 is for $764.05
@c Check 1202 is for $823.14
@c 
@c >>> import operator
@c >>> for cube in map(operator.pow, range(1,4), repeat(3)):
@c ...    print(cube)
@c ...
@c 1
@c 8
@c 27
@c 
@c >>> reportlines = ['EuroPython', 'Roster', '', 'alex', '', 'laura', '', 'martin', '', 'walter', '', 'samuele']
@c >>> for name in islice(reportlines, 3, None, 2):
@c ...    print(name.title())
@c ...
@c Alex
@c Laura
@c Martin
@c Walter
@c Samuele
@c 
@c >>> from operator import itemgetter
@c >>> d = dict(a=1, b=2, c=1, d=2, e=1, f=2, g=3)
@c >>> di = sorted(sorted(d.items()), key=itemgetter(1))
@c >>> for k, g in groupby(di, itemgetter(1)):
@c ...     print(k, list(map(itemgetter(0), g)))
@c ...
@c 1 ['a', 'c', 'e']
@c 2 ['b', 'd', 'f']
@c 3 ['g']
@c 
@c # Find runs of consecutive numbers using groupby.  The key to the solution
@c # is differencing with a range so that consecutive numbers all appear in
@c # same group.
@c >>> data = [ 1,  4,5,6, 10, 15,16,17,18, 22, 25,26,27,28]
@c >>> for k, g in groupby(enumerate(data), lambda t:t[0]-t[1]):
@c ...     print(list(map(operator.itemgetter(1), g)))
@c ...
@c [1]
@c [4, 5, 6]
@c [10]
@c [15, 16, 17, 18]
@c [22]
@c [25, 26, 27, 28]
@c 
@c Now, we test all of the itertool recipes
@c 
@c >>> take(10, count())
@c [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
@c >>> # Verify that the input is consumed lazily
@c >>> it = iter('abcdef')
@c >>> take(3, it)
@c ['a', 'b', 'c']
@c >>> list(it)
@c ['d', 'e', 'f']
@c 
@c 
@c >>> list(prepend(1, [2, 3, 4]))
@c [1, 2, 3, 4]
@c 
@c 
@c >>> list(enumerate('abc'))
@c [(0, 'a'), (1, 'b'), (2, 'c')]
@c 
@c 
@c >>> for _ in loops(5):
@c ...     print('hi')
@c ...
@c hi
@c hi
@c hi
@c hi
@c hi
@c 
@c 
@c >>> list(tail(3, 'ABCDEFG'))
@c ['E', 'F', 'G']
@c >>> # Verify the input is consumed greedily
@c >>> input_iterator = iter('ABCDEFG')
@c >>> output_iterator = tail(3, input_iterator)
@c >>> list(input_iterator)
@c []
@c 
@c 
@c >>> it = iter(range(10))
@c >>> consume(it, 3)
@c >>> # Verify the input is consumed lazily
@c >>> next(it)
@c 3
@c >>> # Verify the input is consumed completely
@c >>> consume(it)
@c >>> next(it, 'Done')
@c 'Done'
@c 
@c 
@c >>> nth('abcde', 3)
@c 'd'
@c >>> nth('abcde', 9) is None
@c True
@c >>> # Verify that the input is consumed lazily
@c >>> it = iter('abcde')
@c >>> nth(it, 2)
@c 'c'
@c >>> list(it)
@c ['d', 'e']
@c 
@c 
@c >>> [all_equal(s) for s in ('', 'A', 'AAAA', 'AAAB', 'AAABA')]
@c [True, True, True, False, False]
@c >>> [all_equal(s, key=str.casefold) for s in ('', 'A', 'AaAa', 'AAAB', 'AAABA')]
@c [True, True, True, False, False]
@c >>> # Verify that the input is consumed lazily and that only
@c >>> # one element of a second equivalence class is used to disprove
@c >>> # the assertion that all elements are equal.
@c >>> it = iter('aaabbbccc')
@c >>> all_equal(it)
@c False
@c >>> ''.join(it)
@c 'bbccc'
@c 
@c 
@c >>> quantify(range(99), lambda x: x%2==0)
@c 50
@c >>> quantify([True, False, False, True, True])
@c 3
@c >>> quantify(range(12), predicate=lambda x: x%2==1)
@c 6
@c 
@c 
@c >>> a = [[1, 2, 3], [4, 5, 6]]
@c >>> list(flatten(a))
@c [1, 2, 3, 4, 5, 6]
@c 
@c 
@c >>> list(ncycles('abc', 3))
@c ['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
@c >>> # Verify greedy consumption of input iterator
@c >>> input_iterator = iter('abc')
@c >>> output_iterator = ncycles(input_iterator, 3)
@c >>> list(input_iterator)
@c []
@c 
@c 
@c >>> sum_of_squares([10, 20, 30])
@c 1400
@c 
@c 
@c >>> list(reshape([(0, 1), (2, 3), (4, 5)], 3))
@c [(0, 1, 2), (3, 4, 5)]
@c >>> M = [(0, 1, 2, 3), (4, 5, 6, 7), (8, 9, 10, 11)]
@c >>> list(reshape(M, 1))
@c [(0,), (1,), (2,), (3,), (4,), (5,), (6,), (7,), (8,), (9,), (10,), (11,)]
@c >>> list(reshape(M, 2))
@c [(0, 1), (2, 3), (4, 5), (6, 7), (8, 9), (10, 11)]
@c >>> list(reshape(M, 3))
@c [(0, 1, 2), (3, 4, 5), (6, 7, 8), (9, 10, 11)]
@c >>> list(reshape(M, 4))
@c [(0, 1, 2, 3), (4, 5, 6, 7), (8, 9, 10, 11)]
@c >>> list(reshape(M, 5))
@c Traceback (most recent call last):
@c ...
@c ValueError: batched(): incomplete batch
@c >>> list(reshape(M, 6))
@c [(0, 1, 2, 3, 4, 5), (6, 7, 8, 9, 10, 11)]
@c >>> list(reshape(M, 12))
@c [(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)]
@c 
@c 
@c >>> list(transpose([(1, 2, 3), (11, 22, 33)]))
@c [(1, 11), (2, 22), (3, 33)]
@c >>> # Verify that the inputs are consumed lazily
@c >>> input1 = iter([1, 2, 3])
@c >>> input2 = iter([11, 22, 33])
@c >>> output_iterator = transpose([input1, input2])
@c >>> next(output_iterator)
@c (1, 11)
@c >>> list(zip(input1, input2))
@c [(2, 22), (3, 33)]
@c 
@c 
@c >>> list(matmul([(7, 5), (3, 5)], [[2, 5], [7, 9]]))
@c [(49, 80), (41, 60)]
@c >>> list(matmul([[2, 5], [7, 9], [3, 4]], [[7, 11, 5, 4, 9], [3, 5, 2, 6, 3]]))
@c [(29, 47, 20, 38, 33), (76, 122, 53, 82, 90), (33, 53, 23, 36, 39)]
@c 
@c 
@c >>> list(convolve([1, -1, -20], [1, -3])) == [1, -4, -17, 60]
@c True
@c >>> data = [20, 40, 24, 32, 20, 28, 16]
@c >>> list(convolve(data, [0.25, 0.25, 0.25, 0.25]))
@c [5.0, 15.0, 21.0, 29.0, 29.0, 26.0, 24.0, 16.0, 11.0, 4.0]
@c >>> list(convolve(data, [1, -1]))
@c [20, 20, -16, 8, -12, 8, -12, -16]
@c >>> list(convolve(data, [1, -2, 1]))
@c [20, 0, -36, 24, -20, 20, -20, -4, 16]
@c >>> # Verify signal is consumed lazily and the kernel greedily
@c >>> signal_iterator = iter([10, 20, 30, 40, 50])
@c >>> kernel_iterator = iter([1, 2, 3])
@c >>> output_iterator = convolve(signal_iterator, kernel_iterator)
@c >>> list(kernel_iterator)
@c []
@c >>> next(output_iterator)
@c 10
@c >>> next(output_iterator)
@c 40
@c >>> list(signal_iterator)
@c [30, 40, 50]
@c 
@c 
@c >>> from fractions import Fraction
@c >>> from decimal import Decimal
@c >>> polynomial_eval([1, -4, -17, 60], x=5)
@c 0
@c >>> x = 5; x**3 - 4*x**2 -17*x + 60
@c 0
@c >>> polynomial_eval([1, -4, -17, 60], x=2.5)
@c 8.125
@c >>> x = 2.5; x**3 - 4*x**2 -17*x + 60
@c 8.125
@c >>> polynomial_eval([1, -4, -17, 60], x=Fraction(2, 3))
@c Fraction(1274, 27)
@c >>> x = Fraction(2, 3); x**3 - 4*x**2 -17*x + 60
@c Fraction(1274, 27)
@c >>> polynomial_eval([1, -4, -17, 60], x=Decimal('1.75'))
@c Decimal('23.359375')
@c >>> x = Decimal('1.75'); x**3 - 4*x**2 -17*x + 60
@c Decimal('23.359375')
@c >>> polynomial_eval([], 2)
@c 0
@c >>> polynomial_eval([], 2.5)
@c 0.0
@c >>> polynomial_eval([], Fraction(2, 3))
@c Fraction(0, 1)
@c >>> polynomial_eval([], Decimal('1.75'))
@c Decimal('0')
@c >>> polynomial_eval([11], 7) == 11
@c True
@c >>> polynomial_eval([11, 2], 7) == 11 * 7 + 2
@c True
@c 
@c 
@c >>> polynomial_from_roots([5, -4, 3])
@c [1, -4, -17, 60]
@c >>> factored = lambda x: (x - 5) * (x + 4) * (x - 3)
@c >>> expanded = lambda x: x**3 -4*x**2 -17*x + 60
@c >>> all(factored(x) == expanded(x) for x in range(-10, 11))
@c True
@c 
@c 
@c >>> polynomial_derivative([1, -4, -17, 60])
@c [3, -8, -17]
@c 
@c 
@c >>> list(iter_index('AABCADEAF', 'A'))
@c [0, 1, 4, 7]
@c >>> list(iter_index('AABCADEAF', 'B'))
@c [2]
@c >>> list(iter_index('AABCADEAF', 'X'))
@c []
@c >>> list(iter_index('', 'X'))
@c []
@c >>> list(iter_index('AABCADEAF', 'A', 1))
@c [1, 4, 7]
@c >>> list(iter_index(iter('AABCADEAF'), 'A', 1))
@c [1, 4, 7]
@c >>> list(iter_index('AABCADEAF', 'A', 2))
@c [4, 7]
@c >>> list(iter_index(iter('AABCADEAF'), 'A', 2))
@c [4, 7]
@c >>> list(iter_index('AABCADEAF', 'A', 10))
@c []
@c >>> list(iter_index(iter('AABCADEAF'), 'A', 10))
@c []
@c >>> list(iter_index('AABCADEAF', 'A', 1, 7))
@c [1, 4]
@c >>> list(iter_index(iter('AABCADEAF'), 'A', 1, 7))
@c [1, 4]
@c >>> # Verify that ValueErrors not swallowed (gh-107208)
@c >>> def assert_no_value(iterable, forbidden_value):
@c ...     for item in iterable:
@c ...         if item == forbidden_value:
@c ...             raise ValueError
@c ...         yield item
@c ...
@c >>> list(iter_index(assert_no_value('AABCADEAF', 'B'), 'A'))
@c Traceback (most recent call last):
@c ...
@c ValueError
@c >>> # Verify that both paths can find identical NaN values
@c >>> x = float('NaN')
@c >>> y = float('NaN')
@c >>> list(iter_index([0, x, x, y, 0], x))
@c [1, 2]
@c >>> list(iter_index(iter([0, x, x, y, 0]), x))
@c [1, 2]
@c >>> # Test list input. Lists do not support None for the stop argument
@c >>> list(iter_index(list('AABCADEAF'), 'A'))
@c [0, 1, 4, 7]
@c >>> # Verify that input is consumed lazily
@c >>> input_iterator = iter('AABCADEAF')
@c >>> output_iterator = iter_index(input_iterator, 'A')
@c >>> next(output_iterator)
@c 0
@c >>> next(output_iterator)
@c 1
@c >>> next(output_iterator)
@c 4
@c >>> ''.join(input_iterator)
@c 'DEAF'
@c 
@c 
@c >>> # Verify that the target value can be a sequence.
@c >>> seq = [[10, 20], [30, 40], 30, 40, [30, 40], 50]
@c >>> target = [30, 40]
@c >>> list(iter_index(seq, target))
@c [1, 4]
@c 
@c 
@c >>> # Verify faithfulness to type specific index() method behaviors.
@c >>> # For example, bytes and str perform continuous-subsequence searches
@c >>> # that do not match the general behavior specified
@c >>> # in collections.abc.Sequence.index().
@c >>> seq = 'abracadabra'
@c >>> target = 'ab'
@c >>> list(iter_index(seq, target))
@c [0, 7]
@c 
@c 
@c >>> list(sieve(30))
@c [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
@c >>> small_primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
@c >>> all(list(sieve(n)) == [p for p in small_primes if p < n] for n in range(101))
@c True
@c >>> len(list(sieve(100)))
@c 25
@c >>> len(list(sieve(1_000)))
@c 168
@c >>> len(list(sieve(10_000)))
@c 1229
@c >>> len(list(sieve(100_000)))
@c 9592
@c >>> len(list(sieve(1_000_000)))
@c 78498
@c >>> carmichael = {561, 1105, 1729, 2465, 2821, 6601, 8911}  # https://oeis.org/A002997
@c >>> set(sieve(10_000)).isdisjoint(carmichael)
@c True
@c 
@c 
@c >>> small_primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
@c >>> list(filter(is_prime, range(-100, 100))) == small_primes
@c True
@c >>> carmichael = {561, 1105, 1729, 2465, 2821, 6601, 8911}  # https://oeis.org/A002997
@c >>> any(map(is_prime, carmichael))
@c False
@c >>> # https://www.wolframalpha.com/input?i=is+128884753939+prime
@c >>> is_prime(128_884_753_939)           # large prime
@c True
@c >>> is_prime(999953 * 999983)           # large semiprime
@c False
@c >>> is_prime(1_000_000_000_000_007)     # factor() example
@c False
@c >>> is_prime(1_000_000_000_000_403)     # factor() example
@c True
@c 
@c 
@c >>> list(factor(99))                    # Code example 1
@c [3, 3, 11]
@c >>> list(factor(1_000_000_000_000_007)) # Code example 2
@c [47, 59, 360620266859]
@c >>> list(factor(1_000_000_000_000_403)) # Code example 3
@c [1000000000000403]
@c >>> list(factor(0))
@c []
@c >>> list(factor(1))
@c []
@c >>> list(factor(2))
@c [2]
@c >>> list(factor(3))
@c [3]
@c >>> list(factor(4))
@c [2, 2]
@c >>> list(factor(5))
@c [5]
@c >>> list(factor(6))
@c [2, 3]
@c >>> list(factor(7))
@c [7]
@c >>> list(factor(8))
@c [2, 2, 2]
@c >>> list(factor(9))
@c [3, 3]
@c >>> list(factor(10))
@c [2, 5]
@c >>> list(factor(128_884_753_939))       # large prime
@c [128884753939]
@c >>> list(factor(999953 * 999983))       # large semiprime
@c [999953, 999983]
@c >>> list(factor(6 ** 20)) == [2] * 20 + [3] * 20   # large power
@c True
@c >>> list(factor(909_909_090_909))       # large multiterm composite
@c [3, 3, 7, 13, 13, 751, 113797]
@c >>> math.prod([3, 3, 7, 13, 13, 751, 113797])
@c 909909090909
@c >>> all(math.prod(factor(n)) == n for n in range(1, 2_000))
@c True
@c >>> all(set(factor(n)) <= set(sieve(n+1)) for n in range(2_000))
@c True
@c >>> all(list(factor(n)) == sorted(factor(n)) for n in range(2_000))
@c True
@c 
@c 
@c >>> totient(0)  # https://www.wolframalpha.com/input?i=totient+0
@c 0
@c >>> first_totients = [1, 1, 2, 2, 4, 2, 6, 4, 6, 4, 10, 4, 12, 6, 8, 8, 16, 6,
@c ... 18, 8, 12, 10, 22, 8, 20, 12, 18, 12, 28, 8, 30, 16, 20, 16, 24, 12, 36, 18,
@c ... 24, 16, 40, 12, 42, 20, 24, 22, 46, 16, 42, 20, 32, 24, 52, 18, 40, 24, 36,
@c ... 28, 58, 16, 60, 30, 36, 32, 48, 20, 66, 32, 44]  # https://oeis.org/A000010
@c ...
@c >>> list(map(totient, range(1, 70))) == first_totients
@c True
@c >>> reference_totient = lambda n: sum(math.gcd(t, n) == 1 for t in range(1, n+1))
@c >>> all(totient(n) == reference_totient(n) for n in range(1000))
@c True
@c >>> totient(128_884_753_939) == 128_884_753_938  # large prime
@c True
@c >>> totient(999953 * 999983) == 999952 * 999982  # large semiprime
@c True
@c >>> totient(6 ** 20) == 1 * 2**19 * 2 * 3**19    # repeated primes
@c True
@c 
@c 
@c >>> list(flatten([('a', 'b'), (), ('c', 'd', 'e'), ('f',), ('g', 'h', 'i')]))
@c ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
@c 
@c 
@c >>> list(repeatfunc(pow, 5, 2, 3))
@c [8, 8, 8, 8, 8]
@c >>> take(5, map(int, repeatfunc(random.random)))
@c [0, 0, 0, 0, 0]
@c >>> random.seed(85753098575309)
@c >>> list(repeatfunc(random.random, 3))
@c [0.16370491282496968, 0.45889608687313455, 0.3747076837820118]
@c >>> list(repeatfunc(chr, 3, 65))
@c ['A', 'A', 'A']
@c >>> list(repeatfunc(pow, 3, 2, 5))
@c [32, 32, 32]
@c 
@c 
@c >>> list(grouper('abcdefg', 3, fillvalue='x'))
@c [('a', 'b', 'c'), ('d', 'e', 'f'), ('g', 'x', 'x')]
@c 
@c 
@c >>> it = grouper('abcdefg', 3, incomplete='strict')
@c >>> next(it)
@c ('a', 'b', 'c')
@c >>> next(it)
@c ('d', 'e', 'f')
@c >>> next(it)
@c Traceback (most recent call last):
@c   ...
@c ValueError: zip() argument 2 is shorter than argument 1
@c 
@c >>> list(grouper('abcdefg', n=3, incomplete='ignore'))
@c [('a', 'b', 'c'), ('d', 'e', 'f')]
@c 
@c 
@c >>> list(sliding_window('ABCDEFG', 1))
@c [('A',), ('B',), ('C',), ('D',), ('E',), ('F',), ('G',)]
@c >>> list(sliding_window('ABCDEFG', 2))
@c [('A', 'B'), ('B', 'C'), ('C', 'D'), ('D', 'E'), ('E', 'F'), ('F', 'G')]
@c >>> list(sliding_window('ABCDEFG', 3))
@c [('A', 'B', 'C'), ('B', 'C', 'D'), ('C', 'D', 'E'), ('D', 'E', 'F'), ('E', 'F', 'G')]
@c >>> list(sliding_window('ABCDEFG', 4))
@c [('A', 'B', 'C', 'D'), ('B', 'C', 'D', 'E'), ('C', 'D', 'E', 'F'), ('D', 'E', 'F', 'G')]
@c >>> list(sliding_window('ABCDEFG', 5))
@c [('A', 'B', 'C', 'D', 'E'), ('B', 'C', 'D', 'E', 'F'), ('C', 'D', 'E', 'F', 'G')]
@c >>> list(sliding_window('ABCDEFG', 6))
@c [('A', 'B', 'C', 'D', 'E', 'F'), ('B', 'C', 'D', 'E', 'F', 'G')]
@c >>> list(sliding_window('ABCDEFG', 7))
@c [('A', 'B', 'C', 'D', 'E', 'F', 'G')]
@c >>> list(sliding_window('ABCDEFG', 8))
@c []
@c >>> try:
@c ...     list(sliding_window('ABCDEFG', -1))
@c ... except ValueError:
@c ...     'zero or negative n not supported'
@c ...
@c 'zero or negative n not supported'
@c >>> try:
@c ...     list(sliding_window('ABCDEFG', 0))
@c ... except ValueError:
@c ...     'zero or negative n not supported'
@c ...
@c 'zero or negative n not supported'
@c 
@c 
@c >>> list(roundrobin('abc', 'd', 'ef'))
@c ['a', 'd', 'e', 'b', 'f', 'c']
@c >>> ranges = [range(5, 1000), range(4, 3000), range(0), range(3, 2000), range(2, 5000), range(1, 3500)]
@c >>> collections.Counter(roundrobin(*ranges)) == collections.Counter(chain(*ranges))
@c True
@c >>> # Verify that the inputs are consumed lazily
@c >>> input_iterators = list(map(iter, ['abcd', 'ef', '', 'ghijk', 'l', 'mnopqr']))
@c >>> output_iterator = roundrobin(*input_iterators)
@c >>> ''.join(islice(output_iterator, 10))
@c 'aeglmbfhnc'
@c >>> ''.join(chain(*input_iterators))
@c 'dijkopqr'
@c 
@c 
@c >>> list(subslices('ABCD'))
@c ['A', 'AB', 'ABC', 'ABCD', 'B', 'BC', 'BCD', 'C', 'CD', 'D']
@c 
@c 
@c >>> ' '.join(map(''.join, derangements('ABCD')))
@c 'BADC BCDA BDAC CADB CDAB CDBA DABC DCAB DCBA'
@c >>> ' '.join(map(''.join, derangements('ABCD', 3)))
@c 'BAD BCA BCD BDA CAB CAD CDA CDB DAB DCA DCB'
@c >>> ' '.join(map(''.join, derangements('ABCD', 2)))
@c 'BA BC BD CA CD DA DC'
@c >>> ' '.join(map(''.join, derangements('ABCD', 1)))
@c 'B C D'
@c >>> ' '.join(map(''.join, derangements('ABCD', 0)))
@c ''
@c >>> # Compare number of derangements to https://oeis.org/A000166
@c >>> [len(list(derangements(range(n)))) for n in range(10)]
@c [1, 0, 1, 2, 9, 44, 265, 1854, 14833, 133496]
@c >>> # Verify that identical objects are treated as unique by position
@c >>> identical = 'X'
@c >>> distinct = 'x'
@c >>> seq1 = ('A', identical, 'B', identical)
@c >>> result1 = ' '.join(map(''.join, derangements(seq1)))
@c >>> result1
@c 'XAXB XBXA XXAB BAXX BXAX BXXA XAXB XBAX XBXA'
@c >>> seq2 = ('A', identical, 'B', distinct)
@c >>> result2 = ' '.join(map(''.join, derangements(seq2)))
@c >>> result2
@c 'XAxB XBxA XxAB BAxX BxAX BxXA xAXB xBAX xBXA'
@c >>> result1 == result2
@c False
@c >>> result1.casefold() == result2.casefold()
@c True
@c 
@c 
@c >>> list(powerset([1,2,3]))
@c [(), (1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3)]
@c >>> all(len(list(powerset(range(n)))) == 2**n for n in range(18))
@c True
@c >>> list(powerset('abcde')) == sorted(sorted(set(powerset('abcde'))), key=len)
@c True
@c 
@c 
@c >>> list(unique_everseen('AAAABBBCCDAABBB'))
@c ['A', 'B', 'C', 'D']
@c >>> list(unique_everseen('ABBCcAD', str.casefold))
@c ['A', 'B', 'C', 'D']
@c >>> list(unique_everseen('ABBcCAD', str.casefold))
@c ['A', 'B', 'c', 'D']
@c >>> # Verify that the input is consumed lazily
@c >>> input_iterator = iter('AAAABBBCCDAABBB')
@c >>> output_iterator = unique_everseen(input_iterator)
@c >>> next(output_iterator)
@c 'A'
@c >>> ''.join(input_iterator)
@c 'AAABBBCCDAABBB'
@c 
@c 
@c >>> list(unique_justseen('AAAABBBCCDAABBB'))
@c ['A', 'B', 'C', 'D', 'A', 'B']
@c >>> list(unique_justseen('ABBCcAD', str.casefold))
@c ['A', 'B', 'C', 'A', 'D']
@c >>> list(unique_justseen('ABBcCAD', str.casefold))
@c ['A', 'B', 'c', 'A', 'D']
@c >>> # Verify that the input is consumed lazily
@c >>> input_iterator = iter('AAAABBBCCDAABBB')
@c >>> output_iterator = unique_justseen(input_iterator)
@c >>> next(output_iterator)
@c 'A'
@c >>> ''.join(input_iterator)
@c 'AAABBBCCDAABBB'
@c 
@c 
@c >>> list(unique([[1, 2], [3, 4], [1, 2]]))
@c [[1, 2], [3, 4]]
@c >>> list(unique('ABBcCAD', str.casefold))
@c ['A', 'B', 'c', 'D']
@c >>> list(unique('ABBcCAD', str.casefold, reverse=True))
@c ['D', 'c', 'B', 'A']
@c 
@c 
@c >>> d = dict(a=1, b=2, c=3)
@c >>> it = iter_except(d.popitem, KeyError)
@c >>> d['d'] = 4
@c >>> next(it)
@c ('d', 4)
@c >>> next(it)
@c ('c', 3)
@c >>> next(it)
@c ('b', 2)
@c >>> d['e'] = 5
@c >>> next(it)
@c ('e', 5)
@c >>> next(it)
@c ('a', 1)
@c >>> next(it, 'empty')
@c 'empty'
@c 
@c 
@c >>> first_true('ABC0DEF1', '9', str.isdigit)
@c '0'
@c >>> # Verify that inputs are consumed lazily
@c >>> it = iter('ABC0DEF1')
@c >>> first_true(it, predicate=str.isdigit)
@c '0'
@c >>> ''.join(it)
@c 'DEF1'
@c 
@c >>> multinomial(5, 2, 2, 1, 1)
@c 83160
@c >>> word = 'coffee'
@c >>> multinomial(*Counter(word).values()) == len(set(permutations(word)))
@c True
@c 
@c 
@c >>> list(running_mean([8.5, 9.5, 7.5, 6.5]))
@c [8.5, 9.0, 8.5, 8.0]
@c >>> list(running_mean([37, 33, 38, 28]))
@c [37.0, 35.0, 36.0, 34.0]
@c 
@c 
@c >>> list(running_min([37, 33, 38, 28]))
@c [37, 33, 33, 28]
@c 
@c 
@c >>> list(running_max([37, 33, 38, 28]))
@c [37, 37, 38, 38]
@c 
@c 
@c >>> list(running_median([37, 33, 38, 28]))
@c [37, 35.0, 37, 35.0]
@c 
@c 
@c >>> list(running_statistics([37, 33, 38, 28]))
@c [(1, 37, 37, 37, 37.0), (2, 33, 35.0, 37, 35.0), (3, 33, 37, 38, 36.0), (4, 28, 35.0, 38, 34.0)]

@c # Old recipes and their tests which are guaranteed to continue to work.
@c 
@c def tabulate(function, start=0):
@c     "Return function(0), function(1), ..."
@c     return map(function, count(start))
@c 
@c def old_sumprod_recipe(vec1, vec2):
@c     "Compute a sum of products."
@c     return sum(starmap(operator.mul, zip(vec1, vec2, strict=True)))
@c 
@c def dotproduct(vec1, vec2):
@c     return sum(map(operator.mul, vec1, vec2))
@c 
@c def pad_none(iterable):
@c     """Returns the sequence elements and then returns None indefinitely.
@c 
@c     Useful for emulating the behavior of the built-in map() function.
@c     """
@c     return chain(iterable, repeat(None))
@c 
@c def triplewise(iterable):
@c     "Return overlapping triplets from an iterable"
@c     # triplewise('ABCDEFG') → ABC BCD CDE DEF EFG
@c     for (a, _), (b, c) in pairwise(pairwise(iterable)):
@c         yield a, b, c
@c 
@c def nth_combination(iterable, r, index):
@c     "Equivalent to list(combinations(iterable, r))[index]"
@c     pool = tuple(iterable)
@c     n = len(pool)
@c     c = math.comb(n, r)
@c     if index < 0:
@c         index += c
@c     if index < 0 or index >= c:
@c         raise IndexError
@c     result = []
@c     while r:
@c         c, n, r = c*r//n, n-1, r-1
@c         while index >= c:
@c             index -= c
@c             c, n = c*(n-r)//n, n-1
@c         result.append(pool[-1-n])
@c     return tuple(result)
@c 
@c def before_and_after(predicate, it):
@c    """ Variant of takewhile() that allows complete
@c        access to the remainder of the iterator.
@c 
@c        >>> it = iter('ABCdEfGhI')
@c        >>> all_upper, remainder = before_and_after(str.isupper, it)
@c        >>> ''.join(all_upper)
@c        'ABC'
@c        >>> ''.join(remainder)     # takewhile() would lose the 'd'
@c        'dEfGhI'
@c 
@c        Note that the true iterator must be fully consumed
@c        before the remainder iterator can generate valid results.
@c    """
@c    it = iter(it)
@c    transition = []
@c 
@c    def true_iterator():
@c        for elem in it:
@c            if predicate(elem):
@c                yield elem
@c            else:
@c                transition.append(elem)
@c                return
@c 
@c    return true_iterator(), chain(transition, it)
@c 
@c def partition(predicate, iterable):
@c     """Partition entries into false entries and true entries.
@c 
@c     If *predicate* is slow, consider wrapping it with functools.lru_cache().
@c     """
@c     # partition(is_odd, range(10)) → 0 2 4 6 8   and  1 3 5 7 9
@c     t1, t2 = tee(iterable)
@c     return filterfalse(predicate, t1), filter(predicate, t2)

@c >>> list(islice(tabulate(lambda x: 2*x), 4))
@c [0, 2, 4, 6]
@c 
@c 
@c >>> dotproduct([1,2,3], [4,5,6])
@c 32
@c 
@c 
@c >>> old_sumprod_recipe([1,2,3], [4,5,6])
@c 32
@c 
@c 
@c >>> list(islice(pad_none('abc'), 0, 6))
@c ['a', 'b', 'c', None, None, None]
@c 
@c 
@c >>> list(triplewise('ABCDEFG'))
@c [('A', 'B', 'C'), ('B', 'C', 'D'), ('C', 'D', 'E'), ('D', 'E', 'F'), ('E', 'F', 'G')]
@c 
@c 
@c >>> population = 'ABCDEFGH'
@c >>> for r in range(len(population) + 1):
@c ...     seq = list(combinations(population, r))
@c ...     for i in range(len(seq)):
@c ...         assert nth_combination(population, r, i) == seq[i]
@c ...     for i in range(-len(seq), 0):
@c ...         assert nth_combination(population, r, i) == seq[i]
@c ...
@c >>> iterable = 'abcde'
@c >>> r = 3
@c >>> combos = list(combinations(iterable, r))
@c >>> all(nth_combination(iterable, r, i) == comb for i, comb in enumerate(combos))
@c True
@c 
@c 
@c >>> it = iter('ABCdEfGhI')
@c >>> all_upper, remainder = before_and_after(str.isupper, it)
@c >>> ''.join(all_upper)
@c 'ABC'
@c >>> ''.join(remainder)
@c 'dEfGhI'
@c 
@c 
@c >>> def is_odd(x):
@c ...     return x % 2 == 1
@c ...
@c >>> evens, odds = partition(is_odd, range(10))
@c >>> list(evens)
@c [0, 2, 4, 6, 8]
@c >>> list(odds)
@c [1, 3, 5, 7, 9]
@c >>> # Verify that the input is consumed lazily
@c >>> input_iterator = iter(range(10))
@c >>> evens, odds = partition(is_odd, input_iterator)
@c >>> next(odds)
@c 1
@c >>> next(odds)
@c 3
@c >>> next(evens)
@c 0
@c >>> list(input_iterator)
@c [4, 5, 6, 7, 8, 9]

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node functools — Higher-order functions and operations on callable objects,operator — Standard operators as functions,itertools — Functions creating iterators for efficient looping,Functional Programming Modules
@anchor{library/functools doc}@anchor{2c1d}@anchor{library/functools functools-higher-order-functions-and-operations-on-callable-objects}@anchor{2c1e}@anchor{library/functools module-functools}@anchor{63}@anchor{library/functools translation-repo}@anchor{2c1f}
@subsection @code{functools} — Higher-order functions and operations on callable objects


@geindex module; functools

`Source code:' Lib/functools.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/functools.py}

@c import functools
@c from functools import *


__________________________________________________________________


The @code{functools} module is for higher-order functions: functions that act on
or return other functions. In general, any callable object can be treated as a
function for the purposes of this module.

The @code{functools} module defines the following functions:

@geindex cache() (in module functools)
@anchor{library/functools functools cache}@anchor{1817}
@deffn {Function} @@functools.cache (user_function)

Simple lightweight unbounded function cache.  Sometimes called
"memoize"@footnote{https://en.wikipedia.org/wiki/Memoization}.

Returns the same as @code{lru_cache(maxsize=None)}, creating a thin
wrapper around a dictionary lookup for the function arguments.  Because it
never needs to evict old values, this is smaller and faster than
@ref{be8,,lru_cache()} with a size limit.

For example:

@example
@@cache
def factorial(n):
    return n * factorial(n-1) if n else 1

>>> factorial(10)   # no previously cached result, makes 11 recursive calls
3628800
>>> factorial(5)    # no new calls, just returns the cached result
120
>>> factorial(12)   # two new recursive calls, factorial(10) is cached
479001600
@end example

The cache is threadsafe so that the wrapped function can be used in
multiple threads.  This means that the underlying data structure will
remain coherent during concurrent updates.

It is possible for the wrapped function to be called more than once if
another thread makes an additional call before the initial call has been
completed and cached.


Added in version 3.9.

@end deffn

@geindex cached_property() (in module functools)
@anchor{library/functools functools cached_property}@anchor{764}
@deffn {Function} @@functools.cached_property (func)

Transform a method of a class into a property whose value is computed once
and then cached as a normal attribute for the life of the instance. Similar
to @ref{4b4,,property()}, with the addition of caching. Useful for expensive
computed properties of instances that are otherwise effectively immutable.

Example:

@example
class DataSet:

    def __init__(self, sequence_of_numbers):
        self._data = tuple(sequence_of_numbers)

    @@cached_property
    def stdev(self):
        return statistics.stdev(self._data)
@end example

The mechanics of @code{cached_property()} are somewhat different from
@ref{4b4,,property()}.  A regular property blocks attribute writes unless a
setter is defined. In contrast, a `cached_property' allows writes.

The `cached_property' decorator only runs on lookups and only when an
attribute of the same name doesn’t exist.  When it does run, the
`cached_property' writes to the attribute with the same name. Subsequent
attribute reads and writes take precedence over the `cached_property'
method and it works like a normal attribute.

The cached value can be cleared by deleting the attribute.  This
allows the `cached_property' method to run again.

The `cached_property' does not prevent a possible race condition in
multi-threaded usage. The getter function could run more than once on the
same instance, with the latest run setting the cached value. If the cached
property is idempotent or otherwise not harmful to run more than once on an
instance, this is fine. If synchronization is needed, implement the necessary
locking inside the decorated getter function or around the cached property
access.

Note, this decorator interferes with the operation of 
@geindex Python Enhancement Proposals; PEP 412
PEP 412@footnote{https://peps.python.org/pep-0412/}
key-sharing dictionaries.  This means that instance dictionaries
can take more space than usual.

Also, this decorator requires that the @code{__dict__} attribute on each instance
be a mutable mapping. This means it will not work with some types, such as
metaclasses (since the @code{__dict__} attributes on type instances are
read-only proxies for the class namespace), and those that specify
@code{__slots__} without including @code{__dict__} as one of the defined slots
(as such classes don’t provide a @code{__dict__} attribute at all).

If a mutable mapping is not available or if space-efficient key sharing is
desired, an effect similar to @code{cached_property()} can also be achieved by
stacking @ref{4b4,,property()} on top of @ref{be8,,lru_cache()}. See
@ref{2c20,,How do I cache method calls?} for more details on how this differs from @code{cached_property()}.


Added in version 3.8.



Changed in version 3.12: Prior to Python 3.12, @code{cached_property} included an undocumented lock to
ensure that in multi-threaded usage the getter function was guaranteed to
run only once per instance. However, the lock was per-property, not
per-instance, which could result in unacceptably high lock contention. In
Python 3.12+ this locking is removed.

@end deffn

@geindex cmp_to_key() (in module functools)
@anchor{library/functools functools cmp_to_key}@anchor{13e6}
@deffn {Function} functools.cmp_to_key (func)

Transform an old-style comparison function to a @ref{100c,,key function}.  Used
with tools that accept key functions (such as @ref{dcd,,sorted()}, @ref{1111,,min()},
@ref{1112,,max()}, @ref{2a0e,,heapq.nlargest()}, @ref{2a0f,,heapq.nsmallest()},
@ref{17ad,,itertools.groupby()}).  This function is primarily used as a transition
tool for programs being converted from Python 2 which supported the use of
comparison functions.

A comparison function is any callable that accepts two arguments, compares them,
and returns a negative number for less-than, zero for equality, or a positive
number for greater-than.  A key function is a callable that accepts one
argument and returns another value to be used as the sort key.

Example:

@example
sorted(iterable, key=cmp_to_key(locale.strcoll))  # locale-aware sort order
@end example

For sorting examples and a brief sorting tutorial, see @ref{2625,,Sorting Techniques}.


Added in version 3.2.

@end deffn

@geindex lru_cache() (in module functools)
@anchor{library/functools functools lru_cache}@anchor{be8}
@deffn {Function} @@functools.lru_cache (user_function)

@deffnx {Function} @@functools.lru_cache (maxsize=128, typed=False)

Decorator to wrap a function with a memoizing callable that saves up to the
`maxsize' most recent calls.  It can save time when an expensive or I/O bound
function is periodically called with the same arguments.

The cache is threadsafe so that the wrapped function can be used in
multiple threads.  This means that the underlying data structure will
remain coherent during concurrent updates.

It is possible for the wrapped function to be called more than once if
another thread makes an additional call before the initial call has been
completed and cached.

Since a dictionary is used to cache results, the positional and keyword
arguments to the function must be @ref{825,,hashable}.

Distinct argument patterns may be considered to be distinct calls with
separate cache entries.  For example, @code{f(a=1, b=2)} and @code{f(b=2, a=1)}
differ in their keyword argument order and may have two separate cache
entries.

If `user_function' is specified, it must be a callable. This allows the
`lru_cache' decorator to be applied directly to a user function, leaving
the `maxsize' at its default value of 128:

@example
@@lru_cache
def count_vowels(sentence):
    return sum(sentence.count(vowel) for vowel in 'AEIOUaeiou')
@end example

If `maxsize' is set to @code{None}, the LRU feature is disabled and the cache can
grow without bound.

If `typed' is set to true, function arguments of different types will be
cached separately.  If `typed' is false, the implementation will usually
regard them as equivalent calls and only cache a single result. (Some
types such as `str' and `int' may be cached separately even when `typed'
is false.)

Note, type specificity applies only to the function’s immediate arguments
rather than their contents.  The scalar arguments, @code{Decimal(42)} and
@code{Fraction(42)} are treated as distinct calls with distinct results.
In contrast, the tuple arguments @code{('answer', Decimal(42))} and
@code{('answer', Fraction(42))} are treated as equivalent.

The wrapped function is instrumented with a @code{cache_parameters()}
function that returns a new @ref{184,,dict} showing the values for `maxsize'
and `typed'.  This is for information purposes only.  Mutating the values
has no effect.

@geindex cache_info() (functools.lru_cache method)
@anchor{library/functools functools lru_cache cache_info}@anchor{2c21}
To help measure the effectiveness of the cache and tune the `maxsize'
parameter, the wrapped function is instrumented with a @code{cache_info()}
function that returns a @ref{85f,,named tuple} showing `hits', `misses',
`maxsize' and `currsize'.

@geindex cache_clear() (functools.lru_cache method)
@anchor{library/functools functools lru_cache cache_clear}@anchor{2c22}
The decorator also provides a @code{cache_clear()} function for clearing or
invalidating the cache.

The original underlying function is accessible through the
@code{__wrapped__} attribute.  This is useful for introspection, for
bypassing the cache, or for rewrapping the function with a different cache.

The cache keeps references to the arguments and return values until they age
out of the cache or until the cache is cleared.

If a method is cached, the @code{self} instance argument is included in the
cache.  See @ref{2c20,,How do I cache method calls?}

An LRU (least recently used) cache@footnote{https://en.wikipedia.org/wiki/Cache_replacement_policies#Least_Recently_Used_(LRU)}
works best when the most recent calls are the best predictors of upcoming
calls (for example, the most popular articles on a news server tend to
change each day).  The cache’s size limit assures that the cache does not
grow without bound on long-running processes such as web servers.

In general, the LRU cache should only be used when you want to reuse
previously computed values.  Accordingly, it doesn’t make sense to cache
functions with side-effects, functions that need to create
distinct mutable objects on each call (such as generators and async functions),
or impure functions such as time() or random().

Example of an LRU cache for static web content:

@example
@@lru_cache(maxsize=32)
def get_pep(num):
    'Retrieve text of a Python Enhancement Proposal'
    resource = f'https://peps.python.org/pep-@{num:04d@}'
    try:
        with urllib.request.urlopen(resource) as s:
            return s.read()
    except urllib.error.HTTPError:
        return 'Not Found'

>>> for n in 8, 290, 308, 320, 8, 218, 320, 279, 289, 320, 9991:
...     pep = get_pep(n)
...     print(n, len(pep))

>>> get_pep.cache_info()
CacheInfo(hits=3, misses=8, maxsize=32, currsize=8)
@end example

Example of efficiently computing
Fibonacci numbers@footnote{https://en.wikipedia.org/wiki/Fibonacci_number}
using a cache to implement a
dynamic programming@footnote{https://en.wikipedia.org/wiki/Dynamic_programming}
technique:

@example
@@lru_cache(maxsize=None)
def fib(n):
    if n < 2:
        return n
    return fib(n-1) + fib(n-2)

>>> [fib(n) for n in range(16)]
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610]

>>> fib.cache_info()
CacheInfo(hits=28, misses=16, maxsize=None, currsize=16)
@end example


Added in version 3.2.



Changed in version 3.3: Added the `typed' option.



Changed in version 3.8: Added the `user_function' option.



Changed in version 3.9: Added the function @code{cache_parameters()}

@end deffn

@geindex total_ordering() (in module functools)
@anchor{library/functools functools total_ordering}@anchor{1148}
@deffn {Function} @@functools.total_ordering

Given a class defining one or more rich comparison ordering methods, this
class decorator supplies the rest.  This simplifies the effort involved
in specifying all of the possible rich comparison operations:

The class must define one of @ref{14ac,,__lt__()}, @ref{1516,,__le__()},
@ref{1517,,__gt__()}, or @ref{1518,,__ge__()}.
In addition, the class should supply an @ref{cf8,,__eq__()} method.

For example:

@example
@@total_ordering
class Student:
    def _is_valid_operand(self, other):
        return (hasattr(other, "lastname") and
                hasattr(other, "firstname"))
    def __eq__(self, other):
        if not self._is_valid_operand(other):
            return NotImplemented
        return ((self.lastname.lower(), self.firstname.lower()) ==
                (other.lastname.lower(), other.firstname.lower()))
    def __lt__(self, other):
        if not self._is_valid_operand(other):
            return NotImplemented
        return ((self.lastname.lower(), self.firstname.lower()) <
                (other.lastname.lower(), other.firstname.lower()))
@end example

@cartouche
@quotation Note 
While this decorator makes it easy to create well behaved totally
ordered types, it `does' come at the cost of slower execution and
more complex stack traces for the derived comparison methods. If
performance benchmarking indicates this is a bottleneck for a given
application, implementing all six rich comparison methods instead is
likely to provide an easy speed boost.
@end quotation
@end cartouche

@cartouche
@quotation Note 
This decorator makes no attempt to override methods that have been
declared in the class `or its superclasses'. Meaning that if a
superclass defines a comparison operator, `total_ordering' will not
implement it again, even if the original method is abstract.
@end quotation
@end cartouche


Added in version 3.2.



Changed in version 3.4: Returning @code{NotImplemented} from the underlying comparison function for
unrecognised types is now supported.

@end deffn

@geindex Placeholder (in module functools)
@anchor{library/functools functools Placeholder}@anchor{218}
@deffn {Data} functools.Placeholder

A singleton object used as a sentinel to reserve a place
for positional arguments when calling @ref{219,,partial()}
and @ref{21a,,partialmethod()}.


Added in version 3.14.

@end deffn

@geindex partial() (in module functools)
@anchor{library/functools functools partial}@anchor{219}
@deffn {Function} functools.partial (func, /, *args, **keywords)

Return a new @ref{21b,,partial object} which when called
will behave like `func' called with the positional arguments `args'
and keyword arguments `keywords'. If more arguments are supplied to the
call, they are appended to `args'. If additional keyword arguments are
supplied, they extend and override `keywords'.
Roughly equivalent to:

@example
def partial(func, /, *args, **keywords):
    def newfunc(*more_args, **more_keywords):
        return func(*args, *more_args, **(keywords | more_keywords))
    newfunc.func = func
    newfunc.args = args
    newfunc.keywords = keywords
    return newfunc
@end example

The @code{partial()} function is used for partial function application which “freezes”
some portion of a function’s arguments and/or keywords resulting in a new object
with a simplified signature.  For example, @code{partial()} can be used to create
a callable that behaves like the @ref{19c,,int()} function where the `base' argument
defaults to @code{2}:

@example
>>> basetwo = partial(int, base=2)
>>> basetwo.__doc__ = 'Convert base 2 string to an int.'
>>> basetwo('10010')
18
@end example

If @ref{218,,Placeholder} sentinels are present in `args', they will be filled first
when @code{partial()} is called. This makes it possible to pre-fill any positional
argument with a call to @code{partial()}; without @code{Placeholder},
only the chosen number of leading positional arguments can be pre-filled.

If any @code{Placeholder} sentinels are present, all must be filled at call time:

@example
>>> say_to_world = partial(print, Placeholder, Placeholder, "world!")
>>> say_to_world('Hello', 'dear')
Hello dear world!
@end example

Calling @code{say_to_world('Hello')} raises a @ref{199,,TypeError}, because
only one positional argument is provided, but there are two placeholders
that must be filled in.

If @code{partial()} is applied to an existing @code{partial()} object,
@code{Placeholder} sentinels of the input object are filled in with
new positional arguments.
A placeholder can be retained by inserting a new
@code{Placeholder} sentinel to the place held by a previous @code{Placeholder}:

@example
>>> from functools import partial, Placeholder as _
>>> remove = partial(str.replace, _, _, '@w{'})
>>> message = 'Hello, dear dear world!'
>>> remove(message, ' dear')
'Hello, world!'
>>> remove_dear = partial(remove, _, ' dear')
>>> remove_dear(message)
'Hello, world!'
>>> remove_first_dear = partial(remove_dear, _, 1)
>>> remove_first_dear(message)
'Hello, dear world!'
@end example

@code{Placeholder} cannot be passed to @code{partial()} as a keyword argument.


Changed in version 3.14: Added support for @ref{218,,Placeholder} in positional arguments.

@end deffn

@geindex partialmethod (class in functools)
@anchor{library/functools functools partialmethod}@anchor{21a}
@deffn {Class} functools.partialmethod (func, /, *args, **keywords)

Return a new @code{partialmethod} descriptor which behaves
like @ref{219,,partial} except that it is designed to be used as a method
definition rather than being directly callable.

`func' must be a @ref{18c9,,descriptor} or a callable (objects which are both,
like normal functions, are handled as descriptors).

When `func' is a descriptor (such as a normal Python function,
@ref{48f,,classmethod()}, @ref{451,,staticmethod()}, @ref{1291,,abstractmethod()} or
another instance of @code{partialmethod}), calls to @code{__get__} are
delegated to the underlying descriptor, and an appropriate
@ref{21b,,partial object} returned as the result.

When `func' is a non-descriptor callable, an appropriate bound method is
created dynamically. This behaves like a normal Python function when
used as a method: the `self' argument will be inserted as the first
positional argument, even before the `args' and `keywords' supplied to
the @code{partialmethod} constructor.

Example:

@example
>>> class Cell:
...     def __init__(self):
...         self._alive = False
...     @@property
...     def alive(self):
...         return self._alive
...     def set_state(self, state):
...         self._alive = bool(state)
...     set_alive = partialmethod(set_state, True)
...     set_dead = partialmethod(set_state, False)
...
>>> c = Cell()
>>> c.alive
False
>>> c.set_alive()
>>> c.alive
True
@end example


Added in version 3.4.

@end deffn

@geindex reduce() (in module functools)
@anchor{library/functools functools reduce}@anchor{21c}
@deffn {Function} functools.reduce (function, iterable, /[, initial])

Apply `function' of two arguments cumulatively to the items of `iterable', from
left to right, so as to reduce the iterable to a single value.  For example,
@code{reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])} calculates @code{((((1+2)+3)+4)+5)}.
The left argument, `x', is the accumulated value and the right argument, `y', is
the update value from the `iterable'.  If the optional `initial' is present,
it is placed before the items of the iterable in the calculation, and serves as
a default when the iterable is empty.  If `initial' is not given and
`iterable' contains only one item, the first item is returned.

Roughly equivalent to:

@example
initial_missing = object()

def reduce(function, iterable, /, initial=initial_missing):
    it = iter(iterable)
    if initial is initial_missing:
        value = next(it)
    else:
        value = initial
    for element in it:
        value = function(value, element)
    return value
@end example

See @ref{bf6,,itertools.accumulate()} for an iterator that yields all intermediate
values.


Changed in version 3.14: `initial' is now supported as a keyword argument.

@end deffn

@geindex singledispatch() (in module functools)
@anchor{library/functools functools singledispatch}@anchor{84c}
@deffn {Function} @@functools.singledispatch

Transform a function into a @ref{beb,,single-dispatch} @ref{bea,,generic function}.

To define a generic function, decorate it with the @code{@@singledispatch}
decorator. When defining a function using @code{@@singledispatch}, note that the
dispatch happens on the type of the first argument:

@example
>>> from functools import singledispatch
>>> @@singledispatch
... def fun(arg, verbose=False):
...     if verbose:
...         print("Let me just say,", end=" ")
...     print(arg)
@end example

@geindex register() (functools.singledispatch method)
@anchor{library/functools functools singledispatch register}@anchor{2c23}
To add overloaded implementations to the function, use the @code{register()}
attribute of the generic function, which can be used as a decorator.  For
functions annotated with types, the decorator will infer the type of the
first argument automatically:

@example
>>> @@fun.register
... def _(arg: int, verbose=False):
...     if verbose:
...         print("Strength in numbers, eh?", end=" ")
...     print(arg)
...
>>> @@fun.register
... def _(arg: list, verbose=False):
...     if verbose:
...         print("Enumerate this:")
...     for i, elem in enumerate(arg):
...         print(i, elem)
@end example

@ref{2aa,,typing.Union} can also be used:

@example
>>> @@fun.register
... def _(arg: int | float, verbose=False):
...     if verbose:
...         print("Strength in numbers, eh?", end=" ")
...     print(arg)
...
>>> from typing import Union
>>> @@fun.register
... def _(arg: Union[list, set], verbose=False):
...     if verbose:
...         print("Enumerate this:")
...     for i, elem in enumerate(arg):
...         print(i, elem)
...
@end example

For code which doesn’t use type annotations, the appropriate type
argument can be passed explicitly to the decorator itself:

@example
>>> @@fun.register(complex)
... def _(arg, verbose=False):
...     if verbose:
...         print("Better than complicated.", end=" ")
...     print(arg.real, arg.imag)
...
@end example

For code that dispatches on a collections type (e.g., @code{list}), but wants
to typehint the items of the collection (e.g., @code{list[int]}), the
dispatch type should be passed explicitly to the decorator itself with the
typehint going into the function definition:

@example
>>> @@fun.register(list)
... def _(arg: list[int], verbose=False):
...     if verbose:
...         print("Enumerate this:")
...     for i, elem in enumerate(arg):
...         print(i, elem)
@end example

@cartouche
@quotation Note 
At runtime the function will dispatch on an instance of a list regardless
of the type contained within the list i.e. @code{[1,2,3]} will be
dispatched the same as @code{["foo", "bar", "baz"]}. The annotation
provided in this example is for static type checkers only and has no
runtime impact.
@end quotation
@end cartouche

To enable registering @ref{2c24,,lambdas} and pre-existing functions,
the @ref{2c23,,register()} attribute can also be used in a functional form:

@example
>>> def nothing(arg, verbose=False):
...     print("Nothing.")
...
>>> fun.register(type(None), nothing)
@end example

The @ref{2c23,,register()} attribute returns the undecorated function. This
enables decorator stacking, @ref{ab,,pickling}, and the creation
of unit tests for each variant independently:

@example
>>> @@fun.register(float)
... @@fun.register(Decimal)
... def fun_num(arg, verbose=False):
...     if verbose:
...         print("Half of your number:", end=" ")
...     print(arg / 2)
...
>>> fun_num is fun
False
@end example

When called, the generic function dispatches on the type of the first
argument:

@example
>>> fun("Hello, world.")
Hello, world.
>>> fun("test.", verbose=True)
Let me just say, test.
>>> fun(42, verbose=True)
Strength in numbers, eh? 42
>>> fun(['spam', 'spam', 'eggs', 'spam'], verbose=True)
Enumerate this:
0 spam
1 spam
2 eggs
3 spam
>>> fun(None)
Nothing.
>>> fun(1.23)
0.615
@end example

Where there is no registered implementation for a specific type, its
method resolution order is used to find a more generic implementation.
The original function decorated with @code{@@singledispatch} is registered
for the base @ref{c84,,object} type, which means it is used if no better
implementation is found.

If an implementation is registered to an @ref{13c2,,abstract base class},
virtual subclasses of the base class will be dispatched to that
implementation:

@example
>>> from collections.abc import Mapping
>>> @@fun.register
... def _(arg: Mapping, verbose=False):
...     if verbose:
...         print("Keys & Values")
...     for key, value in arg.items():
...         print(key, "=>", value)
...
>>> fun(@{"a": "b"@})
a => b
@end example

To check which implementation the generic function will choose for
a given type, use the @code{dispatch()} attribute:

@example
>>> fun.dispatch(float)
<function fun_num at 0x1035a2840>
>>> fun.dispatch(dict)    # note: default implementation
<function fun at 0x103fe0000>
@end example

To access all registered implementations, use the read-only @code{registry}
attribute:

@example
>>> fun.registry.keys()
dict_keys([<class 'NoneType'>, <class 'int'>, <class 'object'>,
          <class 'decimal.Decimal'>, <class 'list'>,
          <class 'float'>])
>>> fun.registry[float]
<function fun_num at 0x1035a2840>
>>> fun.registry[object]
<function fun at 0x103fe0000>
@end example


Added in version 3.4.



Changed in version 3.7: The @ref{2c23,,register()} attribute now supports using type annotations.



Changed in version 3.11: The @ref{2c23,,register()} attribute now supports
@ref{2aa,,typing.Union} as a type annotation.

@end deffn

@geindex singledispatchmethod (class in functools)
@anchor{library/functools functools singledispatchmethod}@anchor{be9}
@deffn {Class} functools.singledispatchmethod (func)

Transform a method into a @ref{beb,,single-dispatch} @ref{bea,,generic function}.

To define a generic method, decorate it with the @code{@@singledispatchmethod}
decorator. When defining a method using @code{@@singledispatchmethod}, note
that the dispatch happens on the type of the first non-`self' or non-`cls'
argument:

@example
class Negator:
    @@singledispatchmethod
    def neg(self, arg):
        raise NotImplementedError("Cannot negate a")

    @@neg.register
    def _(self, arg: int):
        return -arg

    @@neg.register
    def _(self, arg: bool):
        return not arg
@end example

@code{@@singledispatchmethod} supports nesting with other decorators such as
@ref{48f,,@@classmethod}. Note that to allow for
@code{dispatcher.register}, @code{singledispatchmethod} must be the `outer most'
decorator. Here is the @code{Negator} class with the @code{neg} methods bound to
the class, rather than an instance of the class:

@example
class Negator:
    @@singledispatchmethod
    @@classmethod
    def neg(cls, arg):
        raise NotImplementedError("Cannot negate a")

    @@neg.register
    @@classmethod
    def _(cls, arg: int):
        return -arg

    @@neg.register
    @@classmethod
    def _(cls, arg: bool):
        return not arg
@end example

The same pattern can be used for other similar decorators:
@ref{451,,@@staticmethod}, @ref{1291,,@@~abc.abstractmethod}, and others.


Added in version 3.8.

@end deffn

@geindex update_wrapper() (in module functools)
@anchor{library/functools functools update_wrapper}@anchor{1228}
@deffn {Function} functools.update_wrapper (wrapper, wrapped, assigned=WRAPPER_ASSIGNMENTS, updated=WRAPPER_UPDATES)

Update a `wrapper' function to look like the `wrapped' function. The optional
arguments are tuples to specify which attributes of the original function are
assigned directly to the matching attributes on the wrapper function and which
attributes of the wrapper function are updated with the corresponding attributes
from the original function. The default values for these arguments are the
module level constants @code{WRAPPER_ASSIGNMENTS} (which assigns to the wrapper
function’s @ref{238e,,__module__}, @ref{14e0,,__name__},
@ref{238d,,__qualname__}, @ref{13e4,,__annotations__},
@ref{2391,,__type_params__}, and @ref{13e5,,__doc__}, the
documentation string) and @code{WRAPPER_UPDATES} (which updates the wrapper
function’s @ref{14de,,__dict__}, i.e. the instance dictionary).

To allow access to the original function for introspection and other purposes
(e.g. bypassing a caching decorator such as @ref{be8,,lru_cache()}), this function
automatically adds a @code{__wrapped__} attribute to the wrapper that refers to
the function being wrapped.

The main intended use for this function is in @ref{93f,,decorator} functions which
wrap the decorated function and return the wrapper. If the wrapper function is
not updated, the metadata of the returned function will reflect the wrapper
definition rather than the original function definition, which is typically less
than helpful.

@code{update_wrapper()} may be used with callables other than functions. Any
attributes named in `assigned' or `updated' that are missing from the object
being wrapped are ignored (i.e. this function will not attempt to set them
on the wrapper function). @ref{5f0,,AttributeError} is still raised if the
wrapper function itself is missing any attributes named in `updated'.


Changed in version 3.2: The @code{__wrapped__} attribute is now automatically added.
The @ref{13e4,,__annotations__} attribute is now copied by default.
Missing attributes no longer trigger an @ref{5f0,,AttributeError}.



Changed in version 3.4: The @code{__wrapped__} attribute now always refers to the wrapped
function, even if that function defined a @code{__wrapped__} attribute.
(see bpo-17482@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17482})



Changed in version 3.12: The @ref{2391,,__type_params__} attribute is now copied by default.

@end deffn

@geindex wraps() (in module functools)
@anchor{library/functools functools wraps}@anchor{1163}
@deffn {Function} @@functools.wraps (wrapped, assigned=WRAPPER_ASSIGNMENTS, updated=WRAPPER_UPDATES)

This is a convenience function for invoking @ref{1228,,update_wrapper()} as a
function decorator when defining a wrapper function.  It is equivalent to
@code{partial(update_wrapper, wrapped=wrapped, assigned=assigned, updated=updated)}.
For example:

@example
>>> from functools import wraps
>>> def my_decorator(f):
...     @@wraps(f)
...     def wrapper(*args, **kwds):
...         print('Calling decorated function')
...         return f(*args, **kwds)
...     return wrapper
...
>>> @@my_decorator
... def example():
...     """Docstring"""
...     print('Called example function')
...
>>> example()
Calling decorated function
Called example function
>>> example.__name__
'example'
>>> example.__doc__
'Docstring'
@end example

Without the use of this decorator factory, the name of the example function
would have been @code{'wrapper'}, and the docstring of the original @code{example()}
would have been lost.
@end deffn

@menu
* partial Objects:: 

@end menu

@node partial Objects,,,functools — Higher-order functions and operations on callable objects
@anchor{library/functools id1}@anchor{2c25}@anchor{library/functools partial-objects}@anchor{21b}
@subsubsection @code{partial} Objects


@ref{219,,partial} objects are callable objects created by @ref{219,,partial()}. They
have three read-only attributes:

@geindex func (functools.partial attribute)
@anchor{library/functools functools partial func}@anchor{2c26}
@deffn {Attribute} partial.func

A callable object or function.  Calls to the @ref{219,,partial} object will be
forwarded to @ref{2c26,,func} with new arguments and keywords.
@end deffn

@geindex args (functools.partial attribute)
@anchor{library/functools functools partial args}@anchor{2c27}
@deffn {Attribute} partial.args

The leftmost positional arguments that will be prepended to the positional
arguments provided to a @ref{219,,partial} object call.
@end deffn

@geindex keywords (functools.partial attribute)
@anchor{library/functools functools partial keywords}@anchor{2c28}
@deffn {Attribute} partial.keywords

The keyword arguments that will be supplied when the @ref{219,,partial} object is
called.
@end deffn

@ref{219,,partial} objects are like @ref{59c,,function objects} in that they are
callable, weak referenceable, and can have attributes.  There are some important
differences.  For instance, the @ref{126c,,__name__} and @ref{b27,,__doc__} attributes
are not created automatically.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node operator — Standard operators as functions,,functools — Higher-order functions and operations on callable objects,Functional Programming Modules
@anchor{library/operator doc}@anchor{2c29}@anchor{library/operator module-operator}@anchor{a3}@anchor{library/operator operator-standard-operators-as-functions}@anchor{2c2a}@anchor{library/operator translation-repo}@anchor{2c2b}
@subsection @code{operator} — Standard operators as functions


@geindex module; operator

`Source code:' Lib/operator.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/operator.py}

@c import operator
@c from operator import itemgetter, iadd


__________________________________________________________________


The @code{operator} module exports a set of efficient functions corresponding to
the intrinsic operators of Python.  For example, @code{operator.add(x, y)} is
equivalent to the expression @code{x+y}. Many function names are those used for
special methods, without the double underscores.  For backward compatibility,
many of these have a variant with the double underscores kept. The variants
without the double underscores are preferred for clarity.

The functions fall into categories that perform object comparisons, logical
operations, mathematical operations and sequence operations.

The object comparison functions are useful for all objects, and are named after
the rich comparison operators they support:

@geindex lt() (in module operator)
@geindex le() (in module operator)
@geindex eq() (in module operator)
@geindex ne() (in module operator)
@geindex ge() (in module operator)
@geindex gt() (in module operator)
@geindex __lt__() (in module operator)
@geindex __le__() (in module operator)
@geindex __eq__() (in module operator)
@geindex __ne__() (in module operator)
@geindex __ge__() (in module operator)
@geindex __gt__() (in module operator)
@anchor{library/operator operator lt}@anchor{2c2c}
@deffn {Function} operator.lt (a, b)
@anchor{library/operator operator le}@anchor{2c2d}
@deffnx {Function} operator.le (a, b)
@anchor{library/operator operator eq}@anchor{2c2e}
@deffnx {Function} operator.eq (a, b)
@anchor{library/operator operator ne}@anchor{2c2f}
@deffnx {Function} operator.ne (a, b)
@anchor{library/operator operator ge}@anchor{2c30}
@deffnx {Function} operator.ge (a, b)
@anchor{library/operator operator gt}@anchor{2c31}
@deffnx {Function} operator.gt (a, b)
@anchor{library/operator operator __lt__}@anchor{2c32}
@deffnx {Function} operator.__lt__ (a, b)
@anchor{library/operator operator __le__}@anchor{2c33}
@deffnx {Function} operator.__le__ (a, b)
@anchor{library/operator operator __eq__}@anchor{2c34}
@deffnx {Function} operator.__eq__ (a, b)
@anchor{library/operator operator __ne__}@anchor{2c35}
@deffnx {Function} operator.__ne__ (a, b)
@anchor{library/operator operator __ge__}@anchor{2c36}
@deffnx {Function} operator.__ge__ (a, b)
@anchor{library/operator operator __gt__}@anchor{2c37}
@deffnx {Function} operator.__gt__ (a, b)

Perform “rich comparisons” between `a' and `b'. Specifically, @code{lt(a, b)} is
equivalent to @code{a < b}, @code{le(a, b)} is equivalent to @code{a <= b}, @code{eq(a,
b)} is equivalent to @code{a == b}, @code{ne(a, b)} is equivalent to @code{a != b},
@code{gt(a, b)} is equivalent to @code{a > b} and @code{ge(a, b)} is equivalent to @code{a
>= b}.  Note that these functions can return any value, which may
or may not be interpretable as a Boolean value.  See
@ref{2517,,Comparisons} for more information about rich comparisons.
@end deffn

The logical operations are also generally applicable to all objects, and support
truth tests, identity tests, and boolean operations:

@geindex not_() (in module operator)
@geindex __not__() (in module operator)
@anchor{library/operator operator not_}@anchor{2c38}
@deffn {Function} operator.not_ (obj)
@anchor{library/operator operator __not__}@anchor{2c39}
@deffnx {Function} operator.__not__ (obj)

Return the outcome of @ref{2521,,not} `obj'.  (Note that there is no
@code{__not__()} method for object instances; only the interpreter core defines
this operation.  The result is affected by the @ref{14e1,,__bool__()} and
@ref{17e1,,__len__()} methods.)
@end deffn

@geindex truth() (in module operator)
@anchor{library/operator operator truth}@anchor{2c3a}
@deffn {Function} operator.truth (obj)

Return @ref{e0d,,True} if `obj' is true, and @ref{d31,,False} otherwise.  This is
equivalent to using the @ref{3c1,,bool} constructor.
@end deffn

@geindex is_() (in module operator)
@anchor{library/operator operator is_}@anchor{2c3b}
@deffn {Function} operator.is_ (a, b)

Return @code{a is b}.  Tests object identity.
@end deffn

@geindex is_not() (in module operator)
@anchor{library/operator operator is_not}@anchor{2c3c}
@deffn {Function} operator.is_not (a, b)

Return @code{a is not b}.  Tests object identity.
@end deffn

@geindex is_none() (in module operator)
@anchor{library/operator operator is_none}@anchor{257}
@deffn {Function} operator.is_none (a)

Return @code{a is None}.  Tests object identity.


Added in version 3.14.

@end deffn

@geindex is_not_none() (in module operator)
@anchor{library/operator operator is_not_none}@anchor{258}
@deffn {Function} operator.is_not_none (a)

Return @code{a is not None}.  Tests object identity.


Added in version 3.14.

@end deffn

The mathematical and bitwise operations are the most numerous:

@geindex abs() (in module operator)
@geindex __abs__() (in module operator)
@anchor{library/operator operator abs}@anchor{2c3d}
@deffn {Function} operator.abs (obj)
@anchor{library/operator operator __abs__}@anchor{2c3e}
@deffnx {Function} operator.__abs__ (obj)

Return the absolute value of `obj'.
@end deffn

@geindex add() (in module operator)
@geindex __add__() (in module operator)
@anchor{library/operator operator add}@anchor{2c3f}
@deffn {Function} operator.add (a, b)
@anchor{library/operator operator __add__}@anchor{2c40}
@deffnx {Function} operator.__add__ (a, b)

Return @code{a + b}, for `a' and `b' numbers.
@end deffn

@geindex and_() (in module operator)
@geindex __and__() (in module operator)
@anchor{library/operator operator and_}@anchor{2c41}
@deffn {Function} operator.and_ (a, b)
@anchor{library/operator operator __and__}@anchor{2c42}
@deffnx {Function} operator.__and__ (a, b)

Return @code{a & b}.
@end deffn

@geindex floordiv() (in module operator)
@geindex __floordiv__() (in module operator)
@anchor{library/operator operator floordiv}@anchor{2c43}
@deffn {Function} operator.floordiv (a, b)
@anchor{library/operator operator __floordiv__}@anchor{2c44}
@deffnx {Function} operator.__floordiv__ (a, b)

Return @code{a // b}.
@end deffn

@geindex index() (in module operator)
@geindex __index__() (in module operator)
@anchor{library/operator operator index}@anchor{1d15}
@deffn {Function} operator.index (a)
@anchor{library/operator operator __index__}@anchor{2c45}
@deffnx {Function} operator.__index__ (a)

Return `a' converted to an integer.  Equivalent to @code{a.__index__()}.


Changed in version 3.10: The result always has exact type @ref{19c,,int}.  Previously, the result
could have been an instance of a subclass of @code{int}.

@end deffn

@geindex inv() (in module operator)
@geindex invert() (in module operator)
@geindex __inv__() (in module operator)
@geindex __invert__() (in module operator)
@anchor{library/operator operator inv}@anchor{2c46}
@deffn {Function} operator.inv (obj)
@anchor{library/operator operator invert}@anchor{2c47}
@deffnx {Function} operator.invert (obj)
@anchor{library/operator operator __inv__}@anchor{2c48}
@deffnx {Function} operator.__inv__ (obj)
@anchor{library/operator operator __invert__}@anchor{2c49}
@deffnx {Function} operator.__invert__ (obj)

Return @code{~obj}.
@end deffn

@geindex lshift() (in module operator)
@geindex __lshift__() (in module operator)
@anchor{library/operator operator lshift}@anchor{2c4a}
@deffn {Function} operator.lshift (a, b)
@anchor{library/operator operator __lshift__}@anchor{2c4b}
@deffnx {Function} operator.__lshift__ (a, b)

Return @code{a << b}.
@end deffn

@geindex mod() (in module operator)
@geindex __mod__() (in module operator)
@anchor{library/operator operator mod}@anchor{2c4c}
@deffn {Function} operator.mod (a, b)
@anchor{library/operator operator __mod__}@anchor{2c4d}
@deffnx {Function} operator.__mod__ (a, b)

Return @code{a % b}.
@end deffn

@geindex mul() (in module operator)
@geindex __mul__() (in module operator)
@anchor{library/operator operator mul}@anchor{2c1b}
@deffn {Function} operator.mul (a, b)
@anchor{library/operator operator __mul__}@anchor{2c4e}
@deffnx {Function} operator.__mul__ (a, b)

Return @code{a * b}.
@end deffn

@geindex matmul() (in module operator)
@geindex __matmul__() (in module operator)
@anchor{library/operator operator matmul}@anchor{103b}
@deffn {Function} operator.matmul (a, b)
@anchor{library/operator operator __matmul__}@anchor{2c4f}
@deffnx {Function} operator.__matmul__ (a, b)

Return @code{a @@ b}.


Added in version 3.5.

@end deffn

@geindex neg() (in module operator)
@geindex __neg__() (in module operator)
@anchor{library/operator operator neg}@anchor{2c50}
@deffn {Function} operator.neg (obj)
@anchor{library/operator operator __neg__}@anchor{2c51}
@deffnx {Function} operator.__neg__ (obj)

Return `obj' negated (@code{-obj}).
@end deffn

@geindex or_() (in module operator)
@geindex __or__() (in module operator)
@anchor{library/operator operator or_}@anchor{2c52}
@deffn {Function} operator.or_ (a, b)
@anchor{library/operator operator __or__}@anchor{2c53}
@deffnx {Function} operator.__or__ (a, b)

Return @code{a | b}.
@end deffn

@geindex pos() (in module operator)
@geindex __pos__() (in module operator)
@anchor{library/operator operator pos}@anchor{2c54}
@deffn {Function} operator.pos (obj)
@anchor{library/operator operator __pos__}@anchor{2c55}
@deffnx {Function} operator.__pos__ (obj)

Return @code{+obj}.
@end deffn

@geindex pow() (in module operator)
@geindex __pow__() (in module operator)
@anchor{library/operator operator pow}@anchor{2c56}
@deffn {Function} operator.pow (a, b)
@anchor{library/operator operator __pow__}@anchor{2c57}
@deffnx {Function} operator.__pow__ (a, b)

Return @code{a ** b}.
@end deffn

@geindex rshift() (in module operator)
@geindex __rshift__() (in module operator)
@anchor{library/operator operator rshift}@anchor{2c58}
@deffn {Function} operator.rshift (a, b)
@anchor{library/operator operator __rshift__}@anchor{2c59}
@deffnx {Function} operator.__rshift__ (a, b)

Return @code{a >> b}.
@end deffn

@geindex sub() (in module operator)
@geindex __sub__() (in module operator)
@anchor{library/operator operator sub}@anchor{2c5a}
@deffn {Function} operator.sub (a, b)
@anchor{library/operator operator __sub__}@anchor{2c5b}
@deffnx {Function} operator.__sub__ (a, b)

Return @code{a - b}.
@end deffn

@geindex truediv() (in module operator)
@geindex __truediv__() (in module operator)
@anchor{library/operator operator truediv}@anchor{2c5c}
@deffn {Function} operator.truediv (a, b)
@anchor{library/operator operator __truediv__}@anchor{2c5d}
@deffnx {Function} operator.__truediv__ (a, b)

Return @code{a / b} where 2/3 is .66 rather than 0.  This is also known as
“true” division.
@end deffn

@geindex xor() (in module operator)
@geindex __xor__() (in module operator)
@anchor{library/operator operator xor}@anchor{2c5e}
@deffn {Function} operator.xor (a, b)
@anchor{library/operator operator __xor__}@anchor{2c5f}
@deffnx {Function} operator.__xor__ (a, b)

Return @code{a ^ b}.
@end deffn

Operations which work with sequences (some of them with mappings too) include:

@geindex concat() (in module operator)
@geindex __concat__() (in module operator)
@anchor{library/operator operator concat}@anchor{2c60}
@deffn {Function} operator.concat (a, b)
@anchor{library/operator operator __concat__}@anchor{2c61}
@deffnx {Function} operator.__concat__ (a, b)

Return @code{a + b} for `a' and `b' sequences.
@end deffn

@geindex contains() (in module operator)
@geindex __contains__() (in module operator)
@anchor{library/operator operator contains}@anchor{add}
@deffn {Function} operator.contains (a, b)
@anchor{library/operator operator __contains__}@anchor{2c62}
@deffnx {Function} operator.__contains__ (a, b)

Return the outcome of the test @code{b in a}. Note the reversed operands.
@end deffn

@geindex countOf() (in module operator)
@anchor{library/operator operator countOf}@anchor{adf}
@deffn {Function} operator.countOf (a, b)

Return the number of occurrences of `b' in `a'.
@end deffn

@geindex delitem() (in module operator)
@geindex __delitem__() (in module operator)
@anchor{library/operator operator delitem}@anchor{2c63}
@deffn {Function} operator.delitem (a, b)
@anchor{library/operator operator __delitem__}@anchor{2c64}
@deffnx {Function} operator.__delitem__ (a, b)

Remove the value of `a' at index `b'.
@end deffn

@geindex getitem() (in module operator)
@geindex __getitem__() (in module operator)
@anchor{library/operator operator getitem}@anchor{2c65}
@deffn {Function} operator.getitem (a, b)
@anchor{library/operator operator __getitem__}@anchor{2c66}
@deffnx {Function} operator.__getitem__ (a, b)

Return the value of `a' at index `b'.
@end deffn

@geindex indexOf() (in module operator)
@anchor{library/operator operator indexOf}@anchor{ade}
@deffn {Function} operator.indexOf (a, b)

Return the index of the first of occurrence of `b' in `a'.
@end deffn

@geindex setitem() (in module operator)
@geindex __setitem__() (in module operator)
@anchor{library/operator operator setitem}@anchor{2c67}
@deffn {Function} operator.setitem (a, b, c)
@anchor{library/operator operator __setitem__}@anchor{2c68}
@deffnx {Function} operator.__setitem__ (a, b, c)

Set the value of `a' at index `b' to `c'.
@end deffn

@geindex length_hint() (in module operator)
@anchor{library/operator operator length_hint}@anchor{1173}
@deffn {Function} operator.length_hint (obj, default=0)

Return an estimated length for the object `obj'. First try to return its
actual length, then an estimate using @ref{1114,,object.__length_hint__()}, and
finally return the default value.


Added in version 3.4.

@end deffn

The following operation works with callables:

@geindex call() (in module operator)
@geindex __call__() (in module operator)
@anchor{library/operator operator call}@anchor{1c65}
@deffn {Function} operator.call (obj, /, *args, **kwargs)
@anchor{library/operator operator __call__}@anchor{2c69}
@deffnx {Function} operator.__call__ (obj, /, *args, **kwargs)

Return @code{obj(*args, **kwargs)}.


Added in version 3.11.

@end deffn

The @code{operator} module also defines tools for generalized attribute and item
lookups.  These are useful for making fast field extractors as arguments for
@ref{1a0,,map()}, @ref{dcd,,sorted()}, @ref{17ad,,itertools.groupby()}, or other functions that
expect a function argument.

@geindex attrgetter() (in module operator)
@anchor{library/operator operator attrgetter}@anchor{1039}
@deffn {Function} operator.attrgetter (attr)

@deffnx {Function} operator.attrgetter (*attrs)

Return a callable object that fetches `attr' from its operand.
If more than one attribute is requested, returns a tuple of attributes.
The attribute names can also contain dots. For example:


@itemize *

@item 
After @code{f = attrgetter('name')}, the call @code{f(b)} returns @code{b.name}.

@item 
After @code{f = attrgetter('name', 'date')}, the call @code{f(b)} returns
@code{(b.name, b.date)}.

@item 
After @code{f = attrgetter('name.first', 'name.last')}, the call @code{f(b)}
returns @code{(b.name.first, b.name.last)}.
@end itemize

Equivalent to:

@example
def attrgetter(*items):
    if any(not isinstance(item, str) for item in items):
        raise TypeError('attribute name must be a string')
    if len(items) == 1:
        attr = items[0]
        def g(obj):
            return resolve_attr(obj, attr)
    else:
        def g(obj):
            return tuple(resolve_attr(obj, attr) for attr in items)
    return g

def resolve_attr(obj, attr):
    for name in attr.split("."):
        obj = getattr(obj, name)
    return obj
@end example
@end deffn

@geindex itemgetter() (in module operator)
@anchor{library/operator operator itemgetter}@anchor{c5d}
@deffn {Function} operator.itemgetter (item)

@deffnx {Function} operator.itemgetter (*items)

Return a callable object that fetches `item' from its operand using the
operand’s @ref{588,,__getitem__()} method.  If multiple items are specified,
returns a tuple of lookup values.  For example:


@itemize *

@item 
After @code{f = itemgetter(2)}, the call @code{f(r)} returns @code{r[2]}.

@item 
After @code{g = itemgetter(2, 5, 3)}, the call @code{g(r)} returns
@code{(r[2], r[5], r[3])}.
@end itemize

Equivalent to:

@example
def itemgetter(*items):
    if len(items) == 1:
        item = items[0]
        def g(obj):
            return obj[item]
    else:
        def g(obj):
            return tuple(obj[item] for item in items)
    return g
@end example

The items can be any type accepted by the operand’s @ref{588,,__getitem__()}
method.  Dictionaries accept any @ref{825,,hashable} value.  Lists, tuples, and
strings accept an index or a slice:

@example
>>> itemgetter(1)('ABCDEFG')
'B'
>>> itemgetter(1, 3, 5)('ABCDEFG')
('B', 'D', 'F')
>>> itemgetter(slice(2, None))('ABCDEFG')
'CDEFG'
>>> soldier = dict(rank='captain', name='dotterbart')
>>> itemgetter('rank')(soldier)
'captain'
@end example

Example of using @code{itemgetter()} to retrieve specific fields from a
tuple record:

@example
>>> inventory = [('apple', 3), ('banana', 2), ('pear', 5), ('orange', 1)]
>>> getcount = itemgetter(1)
>>> list(map(getcount, inventory))
[3, 2, 5, 1]
>>> sorted(inventory, key=getcount)
[('orange', 1), ('banana', 2), ('apple', 3), ('pear', 5)]
@end example
@end deffn

@geindex methodcaller() (in module operator)
@anchor{library/operator operator methodcaller}@anchor{103a}
@deffn {Function} operator.methodcaller (name, /, *args, **kwargs)

Return a callable object that calls the method `name' on its operand.  If
additional arguments and/or keyword arguments are given, they will be given
to the method as well.  For example:


@itemize *

@item 
After @code{f = methodcaller('name')}, the call @code{f(b)} returns @code{b.name()}.

@item 
After @code{f = methodcaller('name', 'foo', bar=1)}, the call @code{f(b)}
returns @code{b.name('foo', bar=1)}.
@end itemize

Equivalent to:

@example
def methodcaller(name, /, *args, **kwargs):
    def caller(obj):
        return getattr(obj, name)(*args, **kwargs)
    return caller
@end example
@end deffn

@menu
* Mapping Operators to Functions:: 
* In-place Operators:: 

@end menu

@node Mapping Operators to Functions,In-place Operators,,operator — Standard operators as functions
@anchor{library/operator mapping-operators-to-functions}@anchor{2c6a}@anchor{library/operator operator-map}@anchor{2c6b}
@subsubsection Mapping Operators to Functions


This table shows how abstract operations correspond to operator symbols in the
Python syntax and the functions in the @code{operator} module.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Operation

@tab

Syntax

@tab

Function

@item

Addition

@tab

@code{a + b}

@tab

@code{add(a, b)}

@item

Concatenation

@tab

@code{seq1 + seq2}

@tab

@code{concat(seq1, seq2)}

@item

Containment Test

@tab

@code{obj in seq}

@tab

@code{contains(seq, obj)}

@item

Division

@tab

@code{a / b}

@tab

@code{truediv(a, b)}

@item

Division

@tab

@code{a // b}

@tab

@code{floordiv(a, b)}

@item

Bitwise And, or
Intersection

@tab

@code{a & b}

@tab

@code{and_(a, b)}

@item

Bitwise Exclusive Or,
or Symmetric
Difference

@tab

@code{a ^ b}

@tab

@code{xor(a, b)}

@item

Bitwise Inversion, or
Complement

@tab

@code{~ a}

@tab

@code{invert(a)}

@item

Bitwise Or, or
Union

@tab

@code{a | b}

@tab

@code{or_(a, b)}

@item

Exponentiation

@tab

@code{a ** b}

@tab

@code{pow(a, b)}

@item

Identity

@tab

@code{a is b}

@tab

@code{is_(a, b)}

@item

Identity

@tab

@code{a is not b}

@tab

@code{is_not(a, b)}

@item

Identity

@tab

@code{a is None}

@tab

@code{is_none(a)}

@item

Identity

@tab

@code{a is not None}

@tab

@code{is_not_none(a)}

@item

Indexed Assignment

@tab

@code{obj[k] = v}

@tab

@code{setitem(obj, k, v)}

@item

Indexed Deletion

@tab

@code{del obj[k]}

@tab

@code{delitem(obj, k)}

@item

Indexing

@tab

@code{obj[k]}

@tab

@code{getitem(obj, k)}

@item

Left Shift

@tab

@code{a << b}

@tab

@code{lshift(a, b)}

@item

Modulo

@tab

@code{a % b}

@tab

@code{mod(a, b)}

@item

Multiplication

@tab

@code{a * b}

@tab

@code{mul(a, b)}

@item

Matrix Multiplication

@tab

@code{a @@ b}

@tab

@code{matmul(a, b)}

@item

Negation (Arithmetic)

@tab

@code{- a}

@tab

@code{neg(a)}

@item

Negation (Logical)

@tab

@code{not a}

@tab

@code{not_(a)}

@item

Positive

@tab

@code{+ a}

@tab

@code{pos(a)}

@item

Right Shift

@tab

@code{a >> b}

@tab

@code{rshift(a, b)}

@item

Slice Assignment

@tab

@code{seq[i:j] = values}

@tab

@code{setitem(seq, slice(i, j), values)}

@item

Slice Deletion

@tab

@code{del seq[i:j]}

@tab

@code{delitem(seq, slice(i, j))}

@item

Slicing

@tab

@code{seq[i:j]}

@tab

@code{getitem(seq, slice(i, j))}

@item

String Formatting

@tab

@code{s % obj}

@tab

@code{mod(s, obj)}

@item

Subtraction

@tab

@code{a - b}

@tab

@code{sub(a, b)}

@item

Truth Test

@tab

@code{obj}

@tab

@code{truth(obj)}

@item

Ordering

@tab

@code{a < b}

@tab

@code{lt(a, b)}

@item

Ordering

@tab

@code{a <= b}

@tab

@code{le(a, b)}

@item

Equality

@tab

@code{a == b}

@tab

@code{eq(a, b)}

@item

Difference

@tab

@code{a != b}

@tab

@code{ne(a, b)}

@item

Ordering

@tab

@code{a >= b}

@tab

@code{ge(a, b)}

@item

Ordering

@tab

@code{a > b}

@tab

@code{gt(a, b)}

@end multitable


@node In-place Operators,,Mapping Operators to Functions,operator — Standard operators as functions
@anchor{library/operator in-place-operators}@anchor{2c6c}
@subsubsection In-place Operators


Many operations have an “in-place” version.  Listed below are functions
providing a more primitive access to in-place operators than the usual syntax
does; for example, the @ref{2c6d,,statement} @code{x += y} is equivalent to
@code{x = operator.iadd(x, y)}.  Another way to put it is to say that
@code{z = operator.iadd(x, y)} is equivalent to the compound statement
@code{z = x; z += y}.

In those examples, note that when an in-place method is called, the computation
and assignment are performed in two separate steps.  The in-place functions
listed below only do the first step, calling the in-place method.  The second
step, assignment, is not handled.

For immutable targets such as strings, numbers, and tuples, the updated
value is computed, but not assigned back to the input variable:

@example
>>> a = 'hello'
>>> iadd(a, ' world')
'hello world'
>>> a
'hello'
@end example

For mutable targets such as lists and dictionaries, the in-place method
will perform the update, so no subsequent assignment is necessary:

@example
>>> s = ['h', 'e', 'l', 'l', 'o']
>>> iadd(s, [' ', 'w', 'o', 'r', 'l', 'd'])
['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']
>>> s
['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']
@end example

@geindex iadd() (in module operator)
@geindex __iadd__() (in module operator)
@anchor{library/operator operator iadd}@anchor{2c6e}
@deffn {Function} operator.iadd (a, b)
@anchor{library/operator operator __iadd__}@anchor{2c6f}
@deffnx {Function} operator.__iadd__ (a, b)

@code{a = iadd(a, b)} is equivalent to @code{a += b}.
@end deffn

@geindex iand() (in module operator)
@geindex __iand__() (in module operator)
@anchor{library/operator operator iand}@anchor{2c70}
@deffn {Function} operator.iand (a, b)
@anchor{library/operator operator __iand__}@anchor{2c71}
@deffnx {Function} operator.__iand__ (a, b)

@code{a = iand(a, b)} is equivalent to @code{a &= b}.
@end deffn

@geindex iconcat() (in module operator)
@geindex __iconcat__() (in module operator)
@anchor{library/operator operator iconcat}@anchor{2c72}
@deffn {Function} operator.iconcat (a, b)
@anchor{library/operator operator __iconcat__}@anchor{2c73}
@deffnx {Function} operator.__iconcat__ (a, b)

@code{a = iconcat(a, b)} is equivalent to @code{a += b} for `a' and `b' sequences.
@end deffn

@geindex ifloordiv() (in module operator)
@geindex __ifloordiv__() (in module operator)
@anchor{library/operator operator ifloordiv}@anchor{2c74}
@deffn {Function} operator.ifloordiv (a, b)
@anchor{library/operator operator __ifloordiv__}@anchor{2c75}
@deffnx {Function} operator.__ifloordiv__ (a, b)

@code{a = ifloordiv(a, b)} is equivalent to @code{a //= b}.
@end deffn

@geindex ilshift() (in module operator)
@geindex __ilshift__() (in module operator)
@anchor{library/operator operator ilshift}@anchor{2c76}
@deffn {Function} operator.ilshift (a, b)
@anchor{library/operator operator __ilshift__}@anchor{2c77}
@deffnx {Function} operator.__ilshift__ (a, b)

@code{a = ilshift(a, b)} is equivalent to @code{a <<= b}.
@end deffn

@geindex imod() (in module operator)
@geindex __imod__() (in module operator)
@anchor{library/operator operator imod}@anchor{2c78}
@deffn {Function} operator.imod (a, b)
@anchor{library/operator operator __imod__}@anchor{2c79}
@deffnx {Function} operator.__imod__ (a, b)

@code{a = imod(a, b)} is equivalent to @code{a %= b}.
@end deffn

@geindex imul() (in module operator)
@geindex __imul__() (in module operator)
@anchor{library/operator operator imul}@anchor{2c7a}
@deffn {Function} operator.imul (a, b)
@anchor{library/operator operator __imul__}@anchor{2c7b}
@deffnx {Function} operator.__imul__ (a, b)

@code{a = imul(a, b)} is equivalent to @code{a *= b}.
@end deffn

@geindex imatmul() (in module operator)
@geindex __imatmul__() (in module operator)
@anchor{library/operator operator imatmul}@anchor{103c}
@deffn {Function} operator.imatmul (a, b)
@anchor{library/operator operator __imatmul__}@anchor{2c7c}
@deffnx {Function} operator.__imatmul__ (a, b)

@code{a = imatmul(a, b)} is equivalent to @code{a @@= b}.


Added in version 3.5.

@end deffn

@geindex ior() (in module operator)
@geindex __ior__() (in module operator)
@anchor{library/operator operator ior}@anchor{2c7d}
@deffn {Function} operator.ior (a, b)
@anchor{library/operator operator __ior__}@anchor{2c7e}
@deffnx {Function} operator.__ior__ (a, b)

@code{a = ior(a, b)} is equivalent to @code{a |= b}.
@end deffn

@geindex ipow() (in module operator)
@geindex __ipow__() (in module operator)
@anchor{library/operator operator ipow}@anchor{2c7f}
@deffn {Function} operator.ipow (a, b)
@anchor{library/operator operator __ipow__}@anchor{2c80}
@deffnx {Function} operator.__ipow__ (a, b)

@code{a = ipow(a, b)} is equivalent to @code{a **= b}.
@end deffn

@geindex irshift() (in module operator)
@geindex __irshift__() (in module operator)
@anchor{library/operator operator irshift}@anchor{2c81}
@deffn {Function} operator.irshift (a, b)
@anchor{library/operator operator __irshift__}@anchor{2c82}
@deffnx {Function} operator.__irshift__ (a, b)

@code{a = irshift(a, b)} is equivalent to @code{a >>= b}.
@end deffn

@geindex isub() (in module operator)
@geindex __isub__() (in module operator)
@anchor{library/operator operator isub}@anchor{2c83}
@deffn {Function} operator.isub (a, b)
@anchor{library/operator operator __isub__}@anchor{2c84}
@deffnx {Function} operator.__isub__ (a, b)

@code{a = isub(a, b)} is equivalent to @code{a -= b}.
@end deffn

@geindex itruediv() (in module operator)
@geindex __itruediv__() (in module operator)
@anchor{library/operator operator itruediv}@anchor{2c85}
@deffn {Function} operator.itruediv (a, b)
@anchor{library/operator operator __itruediv__}@anchor{2c86}
@deffnx {Function} operator.__itruediv__ (a, b)

@code{a = itruediv(a, b)} is equivalent to @code{a /= b}.
@end deffn

@geindex ixor() (in module operator)
@geindex __ixor__() (in module operator)
@anchor{library/operator operator ixor}@anchor{2c87}
@deffn {Function} operator.ixor (a, b)
@anchor{library/operator operator __ixor__}@anchor{2c88}
@deffnx {Function} operator.__ixor__ (a, b)

@code{a = ixor(a, b)} is equivalent to @code{a ^= b}.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node File and Directory Access,Data Persistence,Functional Programming Modules,The Python Standard Library
@anchor{library/filesys doc}@anchor{2c89}@anchor{library/filesys file-and-directory-access}@anchor{2c8a}@anchor{library/filesys filesys}@anchor{2c8b}@anchor{library/filesys translation-repo}@anchor{2c8c}
@section File and Directory Access


The modules described in this chapter deal with disk files and directories.  For
example, there are modules for reading the properties of files, manipulating
paths in a portable way, and creating temporary files.  The full list of modules
in this chapter is:

@menu
* pathlib — Object-oriented filesystem paths:: 
* os.path — Common pathname manipulations: os path — Common pathname manipulations. 
* stat — Interpreting stat() results: stat — Interpreting stat results. 
* filecmp — File and Directory Comparisons:: 
* tempfile — Generate temporary files and directories:: 
* glob — Unix style pathname pattern expansion:: 
* fnmatch — Unix filename pattern matching:: 
* linecache — Random access to text lines:: 
* shutil — High-level file operations:: 

@end menu

@node pathlib — Object-oriented filesystem paths,os path — Common pathname manipulations,,File and Directory Access
@anchor{library/pathlib doc}@anchor{2c8d}@anchor{library/pathlib module-pathlib}@anchor{a8}@anchor{library/pathlib pathlib-object-oriented-filesystem-paths}@anchor{2c8e}
@subsection @code{pathlib} — Object-oriented filesystem paths


@geindex module; pathlib


Added in version 3.4.


`Source code:' Lib/pathlib/@footnote{https://github.com/python/cpython/tree/3.14/Lib/pathlib/}

@geindex path; operations


__________________________________________________________________


This module offers classes representing filesystem paths with semantics
appropriate for different operating systems.  Path classes are divided
between @ref{2c8f,,pure paths}, which provide purely computational
operations without I/O, and @ref{2c90,,concrete paths}, which
inherit from pure paths but also provide I/O operations.

@image{python-figures/pathlib-inheritance,,,Inheritance diagram showing the classes available in pathlib. The most basic class is PurePath@comma{} which has three direct subclasses: PurePosixPath@comma{} PureWindowsPath@comma{} and Path. Further to these four classes@comma{} there are two classes that use multiple inheritance: PosixPath subclasses PurePosixPath and Path@comma{} and WindowsPath subclasses PureWindowsPath and Path.,png}

If you’ve never used this module before or just aren’t sure which class is
right for your task, @ref{268,,Path} is most likely what you need. It instantiates
a @ref{2c90,,concrete path} for the platform the code is running on.

Pure paths are useful in some special cases; for example:


@enumerate 

@item 
If you want to manipulate Windows paths on a Unix machine (or vice versa).
You cannot instantiate a @ref{2c91,,WindowsPath} when running on Unix, but you
can instantiate @ref{1abb,,PureWindowsPath}.

@item 
You want to make sure that your code only manipulates paths without actually
accessing the OS. In this case, instantiating one of the pure classes may be
useful since those simply don’t have any OS-accessing operations.
@end enumerate


@subsubheading See also


@geindex Python Enhancement Proposals; PEP 428
PEP 428@footnote{https://peps.python.org/pep-0428/}: The pathlib module – object-oriented filesystem paths.



@subsubheading See also


For low-level path manipulation on strings, you can also use the
@ref{a6,,os.path} module.


@menu
* Basic use: Basic use<2>. 
* Exceptions: Exceptions<6>. 
* Pure paths:: 
* Concrete paths:: 
* Pattern language:: 
* Comparison to the glob module:: 
* Comparison to the os and os.path modules: Comparison to the os and os path modules. 
* Protocols:: 

@end menu

@node Basic use<2>,Exceptions<6>,,pathlib — Object-oriented filesystem paths
@anchor{library/pathlib basic-use}@anchor{2c92}
@subsubsection Basic use


Importing the main class:

@example
>>> from pathlib import Path
@end example

Listing subdirectories:

@example
>>> p = Path('.')
>>> [x for x in p.iterdir() if x.is_dir()]
[PosixPath('.hg'), PosixPath('docs'), PosixPath('dist'),
 PosixPath('__pycache__'), PosixPath('build')]
@end example

Listing Python source files in this directory tree:

@example
>>> list(p.glob('**/*.py'))
[PosixPath('test_pathlib.py'), PosixPath('setup.py'),
 PosixPath('pathlib.py'), PosixPath('docs/conf.py'),
 PosixPath('build/lib/pathlib.py')]
@end example

Navigating inside a directory tree:

@example
>>> p = Path('/etc')
>>> q = p / 'init.d' / 'reboot'
>>> q
PosixPath('/etc/init.d/reboot')
>>> q.resolve()
PosixPath('/etc/rc.d/init.d/halt')
@end example

Querying path properties:

@example
>>> q.exists()
True
>>> q.is_dir()
False
@end example

Opening a file:

@example
>>> with q.open() as f: f.readline()
...
'#!/bin/bash\n'
@end example

@node Exceptions<6>,Pure paths,Basic use<2>,pathlib — Object-oriented filesystem paths
@anchor{library/pathlib exceptions}@anchor{2c93}
@subsubsection Exceptions


@geindex UnsupportedOperation
@anchor{library/pathlib pathlib UnsupportedOperation}@anchor{534}
@deffn {Exception} pathlib.UnsupportedOperation

An exception inheriting @ref{369,,NotImplementedError} that is raised when an
unsupported operation is called on a path object.


Added in version 3.13.

@end deffn

@node Pure paths,Concrete paths,Exceptions<6>,pathlib — Object-oriented filesystem paths
@anchor{library/pathlib id1}@anchor{2c94}@anchor{library/pathlib pure-paths}@anchor{2c8f}
@subsubsection Pure paths


Pure path objects provide path-handling operations which don’t actually
access a filesystem.  There are three ways to access these classes, which
we also call `flavours':

@geindex PurePath (class in pathlib)
@anchor{library/pathlib pathlib PurePath}@anchor{6ce}
@deffn {Class} pathlib.PurePath (*pathsegments)

A generic class that represents the system’s path flavour (instantiating
it creates either a @ref{2c95,,PurePosixPath} or a @ref{1abb,,PureWindowsPath}):

@example
>>> PurePath('setup.py')      # Running on a Unix machine
PurePosixPath('setup.py')
@end example

Each element of `pathsegments' can be either a string representing a
path segment, or an object implementing the @ref{e51,,os.PathLike} interface
where the @ref{e52,,__fspath__()} method returns a string,
such as another path object:

@example
>>> PurePath('foo', 'some/path', 'bar')
PurePosixPath('foo/some/path/bar')
>>> PurePath(Path('foo'), Path('bar'))
PurePosixPath('foo/bar')
@end example

When `pathsegments' is empty, the current directory is assumed:

@example
>>> PurePath()
PurePosixPath('.')
@end example

If a segment is an absolute path, all previous segments are ignored
(like @ref{19eb,,os.path.join()}):

@example
>>> PurePath('/etc', '/usr', 'lib64')
PurePosixPath('/usr/lib64')
>>> PureWindowsPath('c:/Windows', 'd:bar')
PureWindowsPath('d:bar')
@end example

On Windows, the drive is not reset when a rooted relative path
segment (e.g., @code{r'\foo'}) is encountered:

@example
>>> PureWindowsPath('c:/Windows', '/Program Files')
PureWindowsPath('c:/Program Files')
@end example

Spurious slashes and single dots are collapsed, but double dots (@code{'..'})
and leading double slashes (@code{'//'}) are not, since this would change the
meaning of a path for various reasons (e.g. symbolic links, UNC paths):

@example
>>> PurePath('foo//bar')
PurePosixPath('foo/bar')
>>> PurePath('//foo/bar')
PurePosixPath('//foo/bar')
>>> PurePath('foo/./bar')
PurePosixPath('foo/bar')
>>> PurePath('foo/../bar')
PurePosixPath('foo/../bar')
@end example

(a naïve approach would make @code{PurePosixPath('foo/../bar')} equivalent
to @code{PurePosixPath('bar')}, which is wrong if @code{foo} is a symbolic link
to another directory)

Pure path objects implement the @ref{e51,,os.PathLike} interface, allowing them
to be used anywhere the interface is accepted.


Changed in version 3.6: Added support for the @ref{e51,,os.PathLike} interface.

@end deffn

@geindex PurePosixPath (class in pathlib)
@anchor{library/pathlib pathlib PurePosixPath}@anchor{2c95}
@deffn {Class} pathlib.PurePosixPath (*pathsegments)

A subclass of @ref{6ce,,PurePath}, this path flavour represents non-Windows
filesystem paths:

@example
>>> PurePosixPath('/etc/hosts')
PurePosixPath('/etc/hosts')
@end example

`pathsegments' is specified similarly to @ref{6ce,,PurePath}.
@end deffn

@geindex PureWindowsPath (class in pathlib)
@anchor{library/pathlib pathlib PureWindowsPath}@anchor{1abb}
@deffn {Class} pathlib.PureWindowsPath (*pathsegments)

A subclass of @ref{6ce,,PurePath}, this path flavour represents Windows
filesystem paths, including UNC paths@footnote{https://en.wikipedia.org/wiki/Path_(computing)#UNC}:

@example
>>> PureWindowsPath('c:/', 'Users', 'Ximénez')
PureWindowsPath('c:/Users/Ximénez')
>>> PureWindowsPath('//server/share/file')
PureWindowsPath('//server/share/file')
@end example

`pathsegments' is specified similarly to @ref{6ce,,PurePath}.
@end deffn

Regardless of the system you’re running on, you can instantiate all of
these classes, since they don’t provide any operation that does system calls.

@menu
* General properties:: 
* Operators:: 
* Accessing individual parts:: 
* Methods and properties:: 

@end menu

@node General properties,Operators,,Pure paths
@anchor{library/pathlib general-properties}@anchor{2c96}
@subsubsection General properties


Paths are immutable and @ref{825,,hashable}.  Paths of a same flavour are comparable
and orderable.  These properties respect the flavour’s case-folding
semantics:

@example
>>> PurePosixPath('foo') == PurePosixPath('FOO')
False
>>> PureWindowsPath('foo') == PureWindowsPath('FOO')
True
>>> PureWindowsPath('FOO') in @{ PureWindowsPath('foo') @}
True
>>> PureWindowsPath('C:') < PureWindowsPath('d:')
True
@end example

Paths of a different flavour compare unequal and cannot be ordered:

@example
>>> PureWindowsPath('foo') == PurePosixPath('foo')
False
>>> PureWindowsPath('foo') < PurePosixPath('foo')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: '<' not supported between instances of 'PureWindowsPath' and 'PurePosixPath'
@end example

@node Operators,Accessing individual parts,General properties,Pure paths
@anchor{library/pathlib operators}@anchor{2c97}
@subsubsection Operators


The slash operator helps create child paths, like @ref{19eb,,os.path.join()}.
If the argument is an absolute path, the previous path is ignored.
On Windows, the drive is not reset when the argument is a rooted
relative path (e.g., @code{r'\foo'}):

@example
>>> p = PurePath('/etc')
>>> p
PurePosixPath('/etc')
>>> p / 'init.d' / 'apache2'
PurePosixPath('/etc/init.d/apache2')
>>> q = PurePath('bin')
>>> '/usr' / q
PurePosixPath('/usr/bin')
>>> p / '/an_absolute_path'
PurePosixPath('/an_absolute_path')
>>> PureWindowsPath('c:/Windows', '/Program Files')
PureWindowsPath('c:/Program Files')
@end example

A path object can be used anywhere an object implementing @ref{e51,,os.PathLike}
is accepted:

@example
>>> import os
>>> p = PurePath('/etc')
>>> os.fspath(p)
'/etc'
@end example

The string representation of a path is the raw filesystem path itself
(in native form, e.g. with backslashes under Windows), which you can
pass to any function taking a file path as a string:

@example
>>> p = PurePath('/etc')
>>> str(p)
'/etc'
>>> p = PureWindowsPath('c:/Program Files')
>>> str(p)
'c:\\Program Files'
@end example

Similarly, calling @ref{193,,bytes} on a path gives the raw filesystem path as a
bytes object, as encoded by @ref{e55,,os.fsencode()}:

@example
>>> bytes(p)
b'/etc'
@end example

@cartouche
@quotation Note 
Calling @ref{193,,bytes} is only recommended under Unix.  Under Windows,
the unicode form is the canonical representation of filesystem paths.
@end quotation
@end cartouche

@node Accessing individual parts,Methods and properties,Operators,Pure paths
@anchor{library/pathlib accessing-individual-parts}@anchor{2c98}
@subsubsection Accessing individual parts


To access the individual “parts” (components) of a path, use the following
property:

@geindex parts (pathlib.PurePath attribute)
@anchor{library/pathlib pathlib PurePath parts}@anchor{2c99}
@deffn {Attribute} PurePath.parts

A tuple giving access to the path’s various components:

@example
>>> p = PurePath('/usr/bin/python3')
>>> p.parts
('/', 'usr', 'bin', 'python3')

>>> p = PureWindowsPath('c:/Program Files/PSF')
>>> p.parts
('c:\\', 'Program Files', 'PSF')
@end example

(note how the drive and local root are regrouped in a single part)
@end deffn

@node Methods and properties,,Accessing individual parts,Pure paths
@anchor{library/pathlib methods-and-properties}@anchor{2c9a}
@subsubsection Methods and properties


@c from pathlib import PurePath, PurePosixPath, PureWindowsPath

Pure paths provide the following methods and properties:

@geindex parser (pathlib.PurePath attribute)
@anchor{library/pathlib pathlib PurePath parser}@anchor{537}
@deffn {Attribute} PurePath.parser

The implementation of the @ref{a6,,os.path} module used for low-level path
parsing and joining: either @code{posixpath} or @code{ntpath}.


Added in version 3.13.

@end deffn

@geindex drive (pathlib.PurePath attribute)
@anchor{library/pathlib pathlib PurePath drive}@anchor{2c9b}
@deffn {Attribute} PurePath.drive

A string representing the drive letter or name, if any:

@example
>>> PureWindowsPath('c:/Program Files/').drive
'c:'
>>> PureWindowsPath('/Program Files/').drive
'@w{'}
>>> PurePosixPath('/etc').drive
'@w{'}
@end example

UNC shares are also considered drives:

@example
>>> PureWindowsPath('//host/share/foo.txt').drive
'\\\\host\\share'
@end example
@end deffn

@geindex root (pathlib.PurePath attribute)
@anchor{library/pathlib pathlib PurePath root}@anchor{2c9c}
@deffn {Attribute} PurePath.root

A string representing the (local or global) root, if any:

@example
>>> PureWindowsPath('c:/Program Files/').root
'\\'
>>> PureWindowsPath('c:Program Files/').root
'@w{'}
>>> PurePosixPath('/etc').root
'/'
@end example

UNC shares always have a root:

@example
>>> PureWindowsPath('//host/share').root
'\\'
@end example

If the path starts with more than two successive slashes,
@ref{2c95,,PurePosixPath} collapses them:

@example
>>> PurePosixPath('//etc').root
'//'
>>> PurePosixPath('///etc').root
'/'
>>> PurePosixPath('////etc').root
'/'
@end example

@cartouche
@quotation Note 
This behavior conforms to `The Open Group Base Specifications Issue 6',
paragraph 4.11 Pathname Resolution@footnote{https://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap04.html#tag_04_11}:

`“A pathname that begins with two successive slashes may be interpreted in
an implementation-defined manner, although more than two leading slashes
shall be treated as a single slash.”'
@end quotation
@end cartouche
@end deffn

@geindex anchor (pathlib.PurePath attribute)
@anchor{library/pathlib pathlib PurePath anchor}@anchor{2c9d}
@deffn {Attribute} PurePath.anchor

The concatenation of the drive and root:

@example
>>> PureWindowsPath('c:/Program Files/').anchor
'c:\\'
>>> PureWindowsPath('c:Program Files/').anchor
'c:'
>>> PurePosixPath('/etc').anchor
'/'
>>> PureWindowsPath('//host/share').anchor
'\\\\host\\share\\'
@end example
@end deffn

@geindex parents (pathlib.PurePath attribute)
@anchor{library/pathlib pathlib PurePath parents}@anchor{a27}
@deffn {Attribute} PurePath.parents

An immutable sequence providing access to the logical ancestors of
the path:

@example
>>> p = PureWindowsPath('c:/foo/bar/setup.py')
>>> p.parents[0]
PureWindowsPath('c:/foo/bar')
>>> p.parents[1]
PureWindowsPath('c:/foo')
>>> p.parents[2]
PureWindowsPath('c:/')
@end example


Changed in version 3.10: The parents sequence now supports @ref{24f5,,slices} and negative index values.

@end deffn

@geindex parent (pathlib.PurePath attribute)
@anchor{library/pathlib pathlib PurePath parent}@anchor{1ae3}
@deffn {Attribute} PurePath.parent

The logical parent of the path:

@example
>>> p = PurePosixPath('/a/b/c/d')
>>> p.parent
PurePosixPath('/a/b/c')
@end example

You cannot go past an anchor, or empty path:

@example
>>> p = PurePosixPath('/')
>>> p.parent
PurePosixPath('/')
>>> p = PurePosixPath('.')
>>> p.parent
PurePosixPath('.')
@end example

@cartouche
@quotation Note 
This is a purely lexical operation, hence the following behaviour:

@example
>>> p = PurePosixPath('foo/..')
>>> p.parent
PurePosixPath('foo')
@end example

If you want to walk an arbitrary filesystem path upwards, it is
recommended to first call @ref{1ab3,,Path.resolve()} so as to resolve
symlinks and eliminate @code{".."} components.
@end quotation
@end cartouche
@end deffn

@geindex name (pathlib.PurePath attribute)
@anchor{library/pathlib pathlib PurePath name}@anchor{2c9e}
@deffn {Attribute} PurePath.name

A string representing the final path component, excluding the drive and
root, if any:

@example
>>> PurePosixPath('my/library/setup.py').name
'setup.py'
@end example

UNC drive names are not considered:

@example
>>> PureWindowsPath('//some/share/setup.py').name
'setup.py'
>>> PureWindowsPath('//some/share').name
'@w{'}
@end example
@end deffn

@geindex suffix (pathlib.PurePath attribute)
@anchor{library/pathlib pathlib PurePath suffix}@anchor{199b}
@deffn {Attribute} PurePath.suffix

The last dot-separated portion of the final component, if any:

@example
>>> PurePosixPath('my/library/setup.py').suffix
'.py'
>>> PurePosixPath('my/library.tar.gz').suffix
'.gz'
>>> PurePosixPath('my/library').suffix
'@w{'}
@end example

This is commonly called the file extension.


Changed in version 3.14: A single dot (”@code{.}”) is considered a valid suffix.

@end deffn

@geindex suffixes (pathlib.PurePath attribute)
@anchor{library/pathlib pathlib PurePath suffixes}@anchor{199c}
@deffn {Attribute} PurePath.suffixes

A list of the path’s suffixes, often called file extensions:

@example
>>> PurePosixPath('my/library.tar.gar').suffixes
['.tar', '.gar']
>>> PurePosixPath('my/library.tar.gz').suffixes
['.tar', '.gz']
>>> PurePosixPath('my/library').suffixes
[]
@end example


Changed in version 3.14: A single dot (”@code{.}”) is considered a valid suffix.

@end deffn

@geindex stem (pathlib.PurePath attribute)
@anchor{library/pathlib pathlib PurePath stem}@anchor{2c9f}
@deffn {Attribute} PurePath.stem

The final path component, without its suffix:

@example
>>> PurePosixPath('my/library.tar.gz').stem
'library.tar'
>>> PurePosixPath('my/library.tar').stem
'library'
>>> PurePosixPath('my/library').stem
'library'
@end example


Changed in version 3.14: A single dot (”@code{.}”) is considered a valid suffix.

@end deffn

@geindex as_posix() (pathlib.PurePath method)
@anchor{library/pathlib pathlib PurePath as_posix}@anchor{2ca0}
@deffn {Method} PurePath.as_posix ()

Return a string representation of the path with forward slashes (@code{/}):

@example
>>> p = PureWindowsPath('c:\\windows')
>>> str(p)
'c:\\windows'
>>> p.as_posix()
'c:/windows'
@end example
@end deffn

@geindex is_absolute() (pathlib.PurePath method)
@anchor{library/pathlib pathlib PurePath is_absolute}@anchor{1ae2}
@deffn {Method} PurePath.is_absolute ()

Return whether the path is absolute or not.  A path is considered absolute
if it has both a root and (if the flavour allows) a drive:

@example
>>> PurePosixPath('/a/b').is_absolute()
True
>>> PurePosixPath('a/b').is_absolute()
False

>>> PureWindowsPath('c:/a/b').is_absolute()
True
>>> PureWindowsPath('/a/b').is_absolute()
False
>>> PureWindowsPath('c:').is_absolute()
False
>>> PureWindowsPath('//some/share').is_absolute()
True
@end example
@end deffn

@geindex is_relative_to() (pathlib.PurePath method)
@anchor{library/pathlib pathlib PurePath is_relative_to}@anchor{300}
@deffn {Method} PurePath.is_relative_to (other)

Return whether or not this path is relative to the `other' path.

@example
>>> p = PurePath('/etc/passwd')
>>> p.is_relative_to('/etc')
True
>>> p.is_relative_to('/usr')
False
@end example

This method is string-based; it neither accesses the filesystem nor treats
“@code{..}” segments specially. The following code is equivalent:

@example
>>> u = PurePath('/usr')
>>> u == p or u in p.parents
False
@end example


Added in version 3.9.



Deprecated since version 3.12, removed in version 3.14: Passing additional arguments is deprecated; if supplied, they are joined
with `other'.

@end deffn

@geindex is_reserved() (pathlib.PurePath method)
@anchor{library/pathlib pathlib PurePath is_reserved}@anchor{328}
@deffn {Method} PurePath.is_reserved ()

With @ref{1abb,,PureWindowsPath}, return @code{True} if the path is considered
reserved under Windows, @code{False} otherwise.  With @ref{2c95,,PurePosixPath},
@code{False} is always returned.


Changed in version 3.13: Windows path names that contain a colon, or end with a dot or a space,
are considered reserved. UNC paths may be reserved.



Deprecated since version 3.13, will be removed in version 3.15: This method is deprecated; use @ref{329,,os.path.isreserved()} to detect
reserved paths on Windows.

@end deffn

@geindex joinpath() (pathlib.PurePath method)
@anchor{library/pathlib pathlib PurePath joinpath}@anchor{2ca1}
@deffn {Method} PurePath.joinpath (*pathsegments)

Calling this method is equivalent to combining the path with each of
the given `pathsegments' in turn:

@example
>>> PurePosixPath('/etc').joinpath('passwd')
PurePosixPath('/etc/passwd')
>>> PurePosixPath('/etc').joinpath(PurePosixPath('passwd'))
PurePosixPath('/etc/passwd')
>>> PurePosixPath('/etc').joinpath('init.d', 'apache2')
PurePosixPath('/etc/init.d/apache2')
>>> PureWindowsPath('c:').joinpath('/Program Files')
PureWindowsPath('c:/Program Files')
@end example
@end deffn

@geindex full_match() (pathlib.PurePath method)
@anchor{library/pathlib pathlib PurePath full_match}@anchor{536}
@deffn {Method} PurePath.full_match (pattern, *, case_sensitive=None)

Match this path against the provided glob-style pattern.  Return @code{True}
if matching is successful, @code{False} otherwise.  For example:

@example
>>> PurePath('a/b.py').full_match('a/*.py')
True
>>> PurePath('a/b.py').full_match('*.py')
False
>>> PurePath('/a/b/c.py').full_match('/a/**')
True
>>> PurePath('/a/b/c.py').full_match('**/*.py')
True
@end example


@subsubheading See also


@ref{2ca2,,Pattern language} documentation.


As with other methods, case-sensitivity follows platform defaults:

@example
>>> PurePosixPath('b.py').full_match('*.PY')
False
>>> PureWindowsPath('b.py').full_match('*.PY')
True
@end example

Set `case_sensitive' to @code{True} or @code{False} to override this behaviour.


Added in version 3.13.

@end deffn

@geindex match() (pathlib.PurePath method)
@anchor{library/pathlib pathlib PurePath match}@anchor{6d4}
@deffn {Method} PurePath.match (pattern, *, case_sensitive=None)

Match this path against the provided non-recursive glob-style pattern.
Return @code{True} if matching is successful, @code{False} otherwise.

This method is similar to @ref{536,,full_match()}, but empty patterns
aren’t allowed (@ref{2ee,,ValueError} is raised), the recursive wildcard
“@code{**}” isn’t supported (it acts like non-recursive “@code{*}”), and if a
relative pattern is provided, then matching is done from the right:

@example
>>> PurePath('a/b.py').match('*.py')
True
>>> PurePath('/a/b/c.py').match('b/*.py')
True
>>> PurePath('/a/b/c.py').match('a/*.py')
False
@end example


Changed in version 3.12: The `pattern' parameter accepts a @ref{5a1,,path-like object}.



Changed in version 3.12: The `case_sensitive' parameter was added.

@end deffn

@geindex relative_to() (pathlib.PurePath method)
@anchor{library/pathlib pathlib PurePath relative_to}@anchor{2ff}
@deffn {Method} PurePath.relative_to (other, walk_up=False)

Compute a version of this path relative to the path represented by
`other'.  If it’s impossible, @ref{2ee,,ValueError} is raised:

@example
>>> p = PurePosixPath('/etc/passwd')
>>> p.relative_to('/')
PurePosixPath('etc/passwd')
>>> p.relative_to('/etc')
PurePosixPath('passwd')
>>> p.relative_to('/usr')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "pathlib.py", line 941, in relative_to
    raise ValueError(error_message.format(str(self), str(formatted)))
ValueError: '/etc/passwd' is not in the subpath of '/usr' OR one path is relative and the other is absolute.
@end example

When `walk_up' is false (the default), the path must start with `other'.
When the argument is true, @code{..} entries may be added to form the
relative path. In all other cases, such as the paths referencing
different drives, @ref{2ee,,ValueError} is raised.:

@example
>>> p.relative_to('/usr', walk_up=True)
PurePosixPath('../etc/passwd')
>>> p.relative_to('foo', walk_up=True)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "pathlib.py", line 941, in relative_to
    raise ValueError(error_message.format(str(self), str(formatted)))
ValueError: '/etc/passwd' is not on the same drive as 'foo' OR one path is relative and the other is absolute.
@end example

@cartouche
@quotation Warning 
This function is part of @ref{6ce,,PurePath} and works with strings.
It does not check or access the underlying file structure.
This can impact the `walk_up' option as it assumes that no symlinks
are present in the path; call @ref{1ab3,,resolve()} first if
necessary to resolve symlinks.
@end quotation
@end cartouche


Changed in version 3.12: The `walk_up' parameter was added (old behavior is the same as @code{walk_up=False}).



Deprecated since version 3.12, removed in version 3.14: Passing additional positional arguments is deprecated; if supplied,
they are joined with `other'.

@end deffn

@geindex with_name() (pathlib.PurePath method)
@anchor{library/pathlib pathlib PurePath with_name}@anchor{1aae}
@deffn {Method} PurePath.with_name (name)

Return a new path with the @ref{2c9e,,name} changed.  If the original path
doesn’t have a name, ValueError is raised:

@example
>>> p = PureWindowsPath('c:/Downloads/pathlib.tar.gz')
>>> p.with_name('setup.py')
PureWindowsPath('c:/Downloads/setup.py')
>>> p = PureWindowsPath('c:/')
>>> p.with_name('setup.py')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/antoine/cpython/default/Lib/pathlib.py", line 751, in with_name
    raise ValueError("%r has an empty name" % (self,))
ValueError: PureWindowsPath('c:/') has an empty name
@end example
@end deffn

@geindex with_stem() (pathlib.PurePath method)
@anchor{library/pathlib pathlib PurePath with_stem}@anchor{1a20}
@deffn {Method} PurePath.with_stem (stem)

Return a new path with the @ref{2c9f,,stem} changed.  If the original path
doesn’t have a name, ValueError is raised:

@example
>>> p = PureWindowsPath('c:/Downloads/draft.txt')
>>> p.with_stem('final')
PureWindowsPath('c:/Downloads/final.txt')
>>> p = PureWindowsPath('c:/Downloads/pathlib.tar.gz')
>>> p.with_stem('lib')
PureWindowsPath('c:/Downloads/lib.gz')
>>> p = PureWindowsPath('c:/')
>>> p.with_stem('@w{'})
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/antoine/cpython/default/Lib/pathlib.py", line 861, in with_stem
    return self.with_name(stem + self.suffix)
  File "/home/antoine/cpython/default/Lib/pathlib.py", line 851, in with_name
    raise ValueError("%r has an empty name" % (self,))
ValueError: PureWindowsPath('c:/') has an empty name
@end example


Added in version 3.9.

@end deffn

@geindex with_suffix() (pathlib.PurePath method)
@anchor{library/pathlib pathlib PurePath with_suffix}@anchor{199a}
@deffn {Method} PurePath.with_suffix (suffix)

Return a new path with the @ref{199b,,suffix} changed.  If the original path
doesn’t have a suffix, the new `suffix' is appended instead.  If the
`suffix' is an empty string, the original suffix is removed:

@example
>>> p = PureWindowsPath('c:/Downloads/pathlib.tar.gz')
>>> p.with_suffix('.bz2')
PureWindowsPath('c:/Downloads/pathlib.tar.bz2')
>>> p = PureWindowsPath('README')
>>> p.with_suffix('.txt')
PureWindowsPath('README.txt')
>>> p = PureWindowsPath('README.txt')
>>> p.with_suffix('@w{'})
PureWindowsPath('README')
@end example


Changed in version 3.14: A single dot (”@code{.}”) is considered a valid suffix. In previous
versions, @ref{2ee,,ValueError} is raised if a single dot is supplied.

@end deffn

@geindex with_segments() (pathlib.PurePath method)
@anchor{library/pathlib pathlib PurePath with_segments}@anchor{6cf}
@deffn {Method} PurePath.with_segments (*pathsegments)

Create a new path object of the same type by combining the given
`pathsegments'. This method is called whenever a derivative path is created,
such as from @ref{1ae3,,parent} and @ref{2ff,,relative_to()}. Subclasses may
override this method to pass information to derivative paths, for example:

@example
from pathlib import PurePosixPath

class MyPath(PurePosixPath):
    def __init__(self, *pathsegments, session_id):
        super().__init__(*pathsegments)
        self.session_id = session_id

    def with_segments(self, *pathsegments):
        return type(self)(*pathsegments, session_id=self.session_id)

etc = MyPath('/etc', session_id=42)
hosts = etc / 'hosts'
print(hosts.session_id)  # 42
@end example


Added in version 3.12.

@end deffn

@node Concrete paths,Pattern language,Pure paths,pathlib — Object-oriented filesystem paths
@anchor{library/pathlib concrete-paths}@anchor{2c90}@anchor{library/pathlib id2}@anchor{2ca3}
@subsubsection Concrete paths


Concrete paths are subclasses of the pure path classes.  In addition to
operations provided by the latter, they also provide methods to do system
calls on path objects.  There are three ways to instantiate concrete paths:

@geindex Path (class in pathlib)
@anchor{library/pathlib pathlib Path}@anchor{268}
@deffn {Class} pathlib.Path (*pathsegments)

A subclass of @ref{6ce,,PurePath}, this class represents concrete paths of
the system’s path flavour (instantiating it creates either a
@ref{2ca4,,PosixPath} or a @ref{2c91,,WindowsPath}):

@example
>>> Path('setup.py')
PosixPath('setup.py')
@end example

`pathsegments' is specified similarly to @ref{6ce,,PurePath}.
@end deffn

@geindex PosixPath (class in pathlib)
@anchor{library/pathlib pathlib PosixPath}@anchor{2ca4}
@deffn {Class} pathlib.PosixPath (*pathsegments)

A subclass of @ref{268,,Path} and @ref{2c95,,PurePosixPath}, this class
represents concrete non-Windows filesystem paths:

@example
>>> PosixPath('/etc/hosts')
PosixPath('/etc/hosts')
@end example

`pathsegments' is specified similarly to @ref{6ce,,PurePath}.


Changed in version 3.13: Raises @ref{534,,UnsupportedOperation} on Windows. In previous versions,
@ref{369,,NotImplementedError} was raised instead.

@end deffn

@geindex WindowsPath (class in pathlib)
@anchor{library/pathlib pathlib WindowsPath}@anchor{2c91}
@deffn {Class} pathlib.WindowsPath (*pathsegments)

A subclass of @ref{268,,Path} and @ref{1abb,,PureWindowsPath}, this class
represents concrete Windows filesystem paths:

@example
>>> WindowsPath('c:/', 'Users', 'Ximénez')
WindowsPath('c:/Users/Ximénez')
@end example

`pathsegments' is specified similarly to @ref{6ce,,PurePath}.


Changed in version 3.13: Raises @ref{534,,UnsupportedOperation} on non-Windows platforms. In previous
versions, @ref{369,,NotImplementedError} was raised instead.

@end deffn

You can only instantiate the class flavour that corresponds to your system
(allowing system calls on non-compatible path flavours could lead to
bugs or failures in your application):

@example
>>> import os
>>> os.name
'posix'
>>> Path('setup.py')
PosixPath('setup.py')
>>> PosixPath('setup.py')
PosixPath('setup.py')
>>> WindowsPath('setup.py')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "pathlib.py", line 798, in __new__
    % (cls.__name__,))
UnsupportedOperation: cannot instantiate 'WindowsPath' on your system
@end example

Some concrete path methods can raise an @ref{2c2,,OSError} if a system call fails
(for example because the path doesn’t exist).

@menu
* Parsing and generating URIs:: 
* Expanding and resolving paths:: 
* Querying file type and status:: 
* Reading and writing files:: 
* Reading directories:: 
* Creating files and directories:: 
* Copying@comma{} moving and deleting: Copying moving and deleting. 
* Permissions and ownership:: 

@end menu

@node Parsing and generating URIs,Expanding and resolving paths,,Concrete paths
@anchor{library/pathlib parsing-and-generating-uris}@anchor{2ca5}
@subsubsection Parsing and generating URIs


Concrete path objects can be created from, and represented as, ‘file’ URIs
conforming to 
@geindex RFC; RFC 8089
RFC 8089@footnote{https://datatracker.ietf.org/doc/html/rfc8089.html}.

@cartouche
@quotation Note 
File URIs are not portable across machines with different
@ref{2ca6,,filesystem encodings}.
@end quotation
@end cartouche

@geindex from_uri() (pathlib.Path class method)
@anchor{library/pathlib pathlib Path from_uri}@anchor{535}
@deffn {Method} classmethod Path.from_uri (uri)

Return a new path object from parsing a ‘file’ URI. For example:

@example
>>> p = Path.from_uri('file:///etc/hosts')
PosixPath('/etc/hosts')
@end example

On Windows, DOS device and UNC paths may be parsed from URIs:

@example
>>> p = Path.from_uri('file:///c:/windows')
WindowsPath('c:/windows')
>>> p = Path.from_uri('file://server/share')
WindowsPath('//server/share')
@end example

Several variant forms are supported:

@example
>>> p = Path.from_uri('file:////server/share')
WindowsPath('//server/share')
>>> p = Path.from_uri('file://///server/share')
WindowsPath('//server/share')
>>> p = Path.from_uri('file:c:/windows')
WindowsPath('c:/windows')
>>> p = Path.from_uri('file:/c|/windows')
WindowsPath('c:/windows')
@end example

@ref{2ee,,ValueError} is raised if the URI does not start with @code{file:}, or
the parsed path isn’t absolute.


Added in version 3.13.



Changed in version 3.14: The URL authority is discarded if it matches the local hostname.
Otherwise, if the authority isn’t empty or @code{localhost}, then on
Windows a UNC path is returned (as before), and on other platforms a
@ref{2ee,,ValueError} is raised.

@end deffn

@geindex as_uri() (pathlib.Path method)
@anchor{library/pathlib pathlib Path as_uri}@anchor{31e}
@deffn {Method} Path.as_uri ()

Represent the path as a ‘file’ URI.  @ref{2ee,,ValueError} is raised if
the path isn’t absolute.

@example
>>> p = PosixPath('/etc/passwd')
>>> p.as_uri()
'file:///etc/passwd'
>>> p = WindowsPath('c:/Windows')
>>> p.as_uri()
'file:///c:/Windows'
@end example


Deprecated since version 3.14, will be removed in version 3.19: Calling this method from @ref{6ce,,PurePath} rather than @ref{268,,Path} is
possible but deprecated. The method’s use of @ref{e55,,os.fsencode()} makes
it strictly impure.

@end deffn

@node Expanding and resolving paths,Querying file type and status,Parsing and generating URIs,Concrete paths
@anchor{library/pathlib expanding-and-resolving-paths}@anchor{2ca7}
@subsubsection Expanding and resolving paths


@geindex home() (pathlib.Path class method)
@anchor{library/pathlib pathlib Path home}@anchor{1049}
@deffn {Method} classmethod Path.home ()

Return a new path object representing the user’s home directory (as
returned by @ref{c0f,,os.path.expanduser()} with @code{~} construct). If the home
directory can’t be resolved, @ref{246,,RuntimeError} is raised.

@example
>>> Path.home()
PosixPath('/home/antoine')
@end example


Added in version 3.5.

@end deffn

@geindex expanduser() (pathlib.Path method)
@anchor{library/pathlib pathlib Path expanduser}@anchor{1048}
@deffn {Method} Path.expanduser ()

Return a new path with expanded @code{~} and @code{~user} constructs,
as returned by @ref{c0f,,os.path.expanduser()}. If a home directory can’t be
resolved, @ref{246,,RuntimeError} is raised.

@example
>>> p = PosixPath('~/films/Monty Python')
>>> p.expanduser()
PosixPath('/home/eric/films/Monty Python')
@end example


Added in version 3.5.

@end deffn

@geindex cwd() (pathlib.Path class method)
@anchor{library/pathlib pathlib Path cwd}@anchor{1ae1}
@deffn {Method} classmethod Path.cwd ()

Return a new path object representing the current directory (as returned
by @ref{194e,,os.getcwd()}):

@example
>>> Path.cwd()
PosixPath('/home/antoine/pathlib')
@end example
@end deffn

@geindex absolute() (pathlib.Path method)
@anchor{library/pathlib pathlib Path absolute}@anchor{1a6d}
@deffn {Method} Path.absolute ()

Make the path absolute, without normalization or resolving symlinks.
Returns a new path object:

@example
>>> p = Path('tests')
>>> p
PosixPath('tests')
>>> p.absolute()
PosixPath('/home/antoine/pathlib/tests')
@end example
@end deffn

@geindex resolve() (pathlib.Path method)
@anchor{library/pathlib pathlib Path resolve}@anchor{1ab3}
@deffn {Method} Path.resolve (strict=False)

Make the path absolute, resolving any symlinks.  A new path object is
returned:

@example
>>> p = Path()
>>> p
PosixPath('.')
>>> p.resolve()
PosixPath('/home/antoine/pathlib')
@end example

“@code{..}” components are also eliminated (this is the only method to do so):

@example
>>> p = Path('docs/../setup.py')
>>> p.resolve()
PosixPath('/home/antoine/pathlib/setup.py')
@end example

If a path doesn’t exist or a symlink loop is encountered, and `strict' is
@code{True}, @ref{2c2,,OSError} is raised.  If `strict' is @code{False}, the path is
resolved as far as possible and any remainder is appended without checking
whether it exists.


Changed in version 3.6: The `strict' parameter was added (pre-3.6 behavior is strict).



Changed in version 3.13: Symlink loops are treated like other errors: @ref{2c2,,OSError} is raised in
strict mode, and no exception is raised in non-strict mode. In previous
versions, @ref{246,,RuntimeError} is raised no matter the value of `strict'.

@end deffn

@geindex readlink() (pathlib.Path method)
@anchor{library/pathlib pathlib Path readlink}@anchor{b1f}
@deffn {Method} Path.readlink ()

Return the path to which the symbolic link points (as returned by
@ref{b20,,os.readlink()}):

@example
>>> p = Path('mylink')
>>> p.symlink_to('setup.py')
>>> p.readlink()
PosixPath('setup.py')
@end example


Added in version 3.9.



Changed in version 3.13: Raises @ref{534,,UnsupportedOperation} if @ref{b20,,os.readlink()} is not
available. In previous versions, @ref{369,,NotImplementedError} was raised.

@end deffn

@node Querying file type and status,Reading and writing files,Expanding and resolving paths,Concrete paths
@anchor{library/pathlib querying-file-type-and-status}@anchor{2ca8}
@subsubsection Querying file type and status



Changed in version 3.8: @ref{c11,,exists()}, @ref{53b,,is_dir()}, @ref{53a,,is_file()},
@ref{c12,,is_mount()}, @ref{c13,,is_symlink()},
@ref{c14,,is_block_device()}, @ref{c15,,is_char_device()},
@ref{c16,,is_fifo()}, @ref{c17,,is_socket()} now return @code{False}
instead of raising an exception for paths that contain characters
unrepresentable at the OS level.



Changed in version 3.14: The methods given above now return @code{False} instead of raising any
@ref{2c2,,OSError} exception from the operating system. In previous versions,
some kinds of @code{OSError} exception are raised, and others suppressed.
The new behaviour is consistent with @ref{c09,,os.path.exists()},
@ref{c0b,,os.path.isdir()}, etc. Use @ref{a2a,,stat()} to retrieve the file
status without suppressing exceptions.


@geindex stat() (pathlib.Path method)
@anchor{library/pathlib pathlib Path stat}@anchor{a2a}
@deffn {Method} Path.stat (*, follow_symlinks=True)

Return an @ref{16cd,,os.stat_result} object containing information about this path, like @ref{26f,,os.stat()}.
The result is looked up at each call to this method.

This method normally follows symlinks; to stat a symlink add the argument
@code{follow_symlinks=False}, or use @ref{2ca9,,lstat()}.

@example
>>> p = Path('setup.py')
>>> p.stat().st_size
956
>>> p.stat().st_mtime
1327883547.852554
@end example


Changed in version 3.10: The `follow_symlinks' parameter was added.

@end deffn

@geindex lstat() (pathlib.Path method)
@anchor{library/pathlib pathlib Path lstat}@anchor{2ca9}
@deffn {Method} Path.lstat ()

Like @ref{a2a,,Path.stat()} but, if the path points to a symbolic link, return
the symbolic link’s information rather than its target’s.
@end deffn

@geindex exists() (pathlib.Path method)
@anchor{library/pathlib pathlib Path exists}@anchor{c11}
@deffn {Method} Path.exists (*, follow_symlinks=True)

Return @code{True} if the path points to an existing file or directory.
@code{False} will be returned if the path is invalid, inaccessible or missing.
Use @ref{a2a,,Path.stat()} to distinguish between these cases.

This method normally follows symlinks; to check if a symlink exists, add
the argument @code{follow_symlinks=False}.

@example
>>> Path('.').exists()
True
>>> Path('setup.py').exists()
True
>>> Path('/etc').exists()
True
>>> Path('nonexistentfile').exists()
False
@end example


Changed in version 3.12: The `follow_symlinks' parameter was added.

@end deffn

@geindex is_file() (pathlib.Path method)
@anchor{library/pathlib pathlib Path is_file}@anchor{53a}
@deffn {Method} Path.is_file (*, follow_symlinks=True)

Return @code{True} if the path points to a regular file. @code{False} will be
returned if the path is invalid, inaccessible or missing, or if it points
to something other than a regular file. Use @ref{a2a,,Path.stat()} to
distinguish between these cases.

This method normally follows symlinks; to exclude symlinks, add the
argument @code{follow_symlinks=False}.


Changed in version 3.13: The `follow_symlinks' parameter was added.

@end deffn

@geindex is_dir() (pathlib.Path method)
@anchor{library/pathlib pathlib Path is_dir}@anchor{53b}
@deffn {Method} Path.is_dir (*, follow_symlinks=True)

Return @code{True} if the path points to a directory. @code{False} will be
returned if the path is invalid, inaccessible or missing, or if it points
to something other than a directory. Use @ref{a2a,,Path.stat()} to distinguish
between these cases.

This method normally follows symlinks; to exclude symlinks to directories,
add the argument @code{follow_symlinks=False}.


Changed in version 3.13: The `follow_symlinks' parameter was added.

@end deffn

@geindex is_symlink() (pathlib.Path method)
@anchor{library/pathlib pathlib Path is_symlink}@anchor{c13}
@deffn {Method} Path.is_symlink ()

Return @code{True} if the path points to a symbolic link, even if that symlink
is broken. @code{False} will be returned if the path is invalid, inaccessible
or missing, or if it points to something other than a symbolic link. Use
@ref{a2a,,Path.stat()} to distinguish between these cases.
@end deffn

@geindex is_junction() (pathlib.Path method)
@anchor{library/pathlib pathlib Path is_junction}@anchor{6d3}
@deffn {Method} Path.is_junction ()

Return @code{True} if the path points to a junction, and @code{False} for any other
type of file. Currently only Windows supports junctions.


Added in version 3.12.

@end deffn

@geindex is_mount() (pathlib.Path method)
@anchor{library/pathlib pathlib Path is_mount}@anchor{c12}
@deffn {Method} Path.is_mount ()

Return @code{True} if the path is a `mount point': a point in a
file system where a different file system has been mounted.  On POSIX, the
function checks whether `path'’s parent, @code{path/..}, is on a different
device than `path', or whether @code{path/..} and `path' point to the same
i-node on the same device — this should detect mount points for all Unix
and POSIX variants.  On Windows, a mount point is considered to be a drive
letter root (e.g. @code{c:\}), a UNC share (e.g. @code{\\server\share}), or a
mounted filesystem directory.


Added in version 3.7.



Changed in version 3.12: Windows support was added.

@end deffn

@geindex is_socket() (pathlib.Path method)
@anchor{library/pathlib pathlib Path is_socket}@anchor{c17}
@deffn {Method} Path.is_socket ()

Return @code{True} if the path points to a Unix socket. @code{False} will be
returned if the path is invalid, inaccessible or missing, or if it points
to something other than a Unix socket. Use @ref{a2a,,Path.stat()} to
distinguish between these cases.
@end deffn

@geindex is_fifo() (pathlib.Path method)
@anchor{library/pathlib pathlib Path is_fifo}@anchor{c16}
@deffn {Method} Path.is_fifo ()

Return @code{True} if the path points to a FIFO. @code{False} will be returned if
the path is invalid, inaccessible or missing, or if it points to something
other than a FIFO. Use @ref{a2a,,Path.stat()} to distinguish between these
cases.
@end deffn

@geindex is_block_device() (pathlib.Path method)
@anchor{library/pathlib pathlib Path is_block_device}@anchor{c14}
@deffn {Method} Path.is_block_device ()

Return @code{True} if the path points to a block device. @code{False} will be
returned if the path is invalid, inaccessible or missing, or if it points
to something other than a block device. Use @ref{a2a,,Path.stat()} to
distinguish between these cases.
@end deffn

@geindex is_char_device() (pathlib.Path method)
@anchor{library/pathlib pathlib Path is_char_device}@anchor{c15}
@deffn {Method} Path.is_char_device ()

Return @code{True} if the path points to a character device. @code{False} will be
returned if the path is invalid, inaccessible or missing, or if it points
to something other than a character device. Use @ref{a2a,,Path.stat()} to
distinguish between these cases.
@end deffn

@geindex samefile() (pathlib.Path method)
@anchor{library/pathlib pathlib Path samefile}@anchor{1046}
@deffn {Method} Path.samefile (other_path)

Return whether this path points to the same file as `other_path', which
can be either a Path object, or a string.  The semantics are similar
to @ref{1177,,os.path.samefile()} and @ref{1176,,os.path.samestat()}.

An @ref{2c2,,OSError} can be raised if either file cannot be accessed for some
reason.

@example
>>> p = Path('spam')
>>> q = Path('eggs')
>>> p.samefile(q)
False
>>> p.samefile('spam')
True
@end example


Added in version 3.5.

@end deffn

@geindex info (pathlib.Path attribute)
@anchor{library/pathlib pathlib Path info}@anchor{26d}
@deffn {Attribute} Path.info

A @ref{26e,,PathInfo} object that supports querying file type
information. The object exposes methods that cache their results, which can
help reduce the number of system calls needed when switching on file type.
For example:

@example
>>> p = Path('src')
>>> if p.info.is_symlink():
...     print('symlink')
... elif p.info.is_dir():
...     print('directory')
... elif p.info.exists():
...     print('something else')
... else:
...     print('not found')
...
directory
@end example

If the path was generated from @ref{270,,Path.iterdir()} then this attribute is
initialized with some information about the file type gleaned from scanning
the parent directory. Merely accessing @code{Path.info} does not perform
any filesystem queries.

To fetch up-to-date information, it’s best to call @ref{53b,,Path.is_dir()},
@ref{53a,,is_file()} and @ref{c13,,is_symlink()} rather than methods of
this attribute. There is no way to reset the cache; instead you can create
a new path object with an empty info cache via @code{p = Path(p)}.


Added in version 3.14.

@end deffn

@node Reading and writing files,Reading directories,Querying file type and status,Concrete paths
@anchor{library/pathlib reading-and-writing-files}@anchor{2caa}
@subsubsection Reading and writing files


@geindex open() (pathlib.Path method)
@anchor{library/pathlib pathlib Path open}@anchor{2cab}
@deffn {Method} Path.open (mode='r', buffering=-1, encoding=None, errors=None, newline=None)

Open the file pointed to by the path, like the built-in @ref{318,,open()}
function does:

@example
>>> p = Path('setup.py')
>>> with p.open() as f:
...     f.readline()
...
'#!/usr/bin/env python3\n'
@end example
@end deffn

@geindex read_text() (pathlib.Path method)
@anchor{library/pathlib pathlib Path read_text}@anchor{104b}
@deffn {Method} Path.read_text (encoding=None, errors=None, newline=None)

Return the decoded contents of the pointed-to file as a string:

@example
>>> p = Path('my_text_file')
>>> p.write_text('Text file contents')
18
>>> p.read_text()
'Text file contents'
@end example

The file is opened and then closed. The optional parameters have the same
meaning as in @ref{318,,open()}.


Added in version 3.5.



Changed in version 3.13: The `newline' parameter was added.

@end deffn

@geindex read_bytes() (pathlib.Path method)
@anchor{library/pathlib pathlib Path read_bytes}@anchor{2e1}
@deffn {Method} Path.read_bytes ()

Return the binary contents of the pointed-to file as a bytes object:

@example
>>> p = Path('my_binary_file')
>>> p.write_bytes(b'Binary file contents')
20
>>> p.read_bytes()
b'Binary file contents'
@end example


Added in version 3.5.

@end deffn

@geindex write_text() (pathlib.Path method)
@anchor{library/pathlib pathlib Path write_text}@anchor{104a}
@deffn {Method} Path.write_text (data, encoding=None, errors=None, newline=None)

Open the file pointed to in text mode, write `data' to it, and close the
file:

@example
>>> p = Path('my_text_file')
>>> p.write_text('Text file contents')
18
>>> p.read_text()
'Text file contents'
@end example

An existing file of the same name is overwritten. The optional parameters
have the same meaning as in @ref{318,,open()}.


Added in version 3.5.



Changed in version 3.10: The `newline' parameter was added.

@end deffn

@geindex write_bytes() (pathlib.Path method)
@anchor{library/pathlib pathlib Path write_bytes}@anchor{104c}
@deffn {Method} Path.write_bytes (data)

Open the file pointed to in bytes mode, write `data' to it, and close the
file:

@example
>>> p = Path('my_binary_file')
>>> p.write_bytes(b'Binary file contents')
20
>>> p.read_bytes()
b'Binary file contents'
@end example

An existing file of the same name is overwritten.


Added in version 3.5.

@end deffn

@node Reading directories,Creating files and directories,Reading and writing files,Concrete paths
@anchor{library/pathlib reading-directories}@anchor{2cac}
@subsubsection Reading directories


@geindex iterdir() (pathlib.Path method)
@anchor{library/pathlib pathlib Path iterdir}@anchor{270}
@deffn {Method} Path.iterdir ()

When the path points to a directory, yield path objects of the directory
contents:

@example
>>> p = Path('docs')
>>> for child in p.iterdir(): child
...
PosixPath('docs/conf.py')
PosixPath('docs/_templates')
PosixPath('docs/make.bat')
PosixPath('docs/index.rst')
PosixPath('docs/_build')
PosixPath('docs/_static')
PosixPath('docs/Makefile')
@end example

The children are yielded in arbitrary order, and the special entries
@code{'.'} and @code{'..'} are not included.  If a file is removed from or added
to the directory after creating the iterator, it is unspecified whether
a path object for that file is included.

If the path is not a directory or otherwise inaccessible, @ref{2c2,,OSError} is
raised.
@end deffn

@geindex glob() (pathlib.Path method)
@anchor{library/pathlib pathlib Path glob}@anchor{538}
@deffn {Method} Path.glob (pattern, *, case_sensitive=None, recurse_symlinks=False)

Glob the given relative `pattern' in the directory represented by this path,
yielding all matching files (of any kind):

@example
>>> sorted(Path('.').glob('*.py'))
[PosixPath('pathlib.py'), PosixPath('setup.py'), PosixPath('test_pathlib.py')]
>>> sorted(Path('.').glob('*/*.py'))
[PosixPath('docs/conf.py')]
>>> sorted(Path('.').glob('**/*.py'))
[PosixPath('build/lib/pathlib.py'),
 PosixPath('docs/conf.py'),
 PosixPath('pathlib.py'),
 PosixPath('setup.py'),
 PosixPath('test_pathlib.py')]
@end example

@cartouche
@quotation Note 
The paths are returned in no particular order.
If you need a specific order, sort the results.
@end quotation
@end cartouche


@subsubheading See also


@ref{2ca2,,Pattern language} documentation.


By default, or when the `case_sensitive' keyword-only argument is set to
@code{None}, this method matches paths using platform-specific casing rules:
typically, case-sensitive on POSIX, and case-insensitive on Windows.
Set `case_sensitive' to @code{True} or @code{False} to override this behaviour.

By default, or when the `recurse_symlinks' keyword-only argument is set to
@code{False}, this method follows symlinks except when expanding “@code{**}”
wildcards. Set `recurse_symlinks' to @code{True} to always follow symlinks.

@cartouche
@quotation Note 
Any @ref{2c2,,OSError} exceptions raised from scanning the filesystem are
suppressed. This includes @ref{f44,,PermissionError} when accessing
directories without read permission.
@end quotation
@end cartouche

Raises an @ref{1cb1,,auditing event} @code{pathlib.Path.glob} with arguments @code{self}, @code{pattern}.


Changed in version 3.12: The `case_sensitive' parameter was added.



Changed in version 3.13: The `recurse_symlinks' parameter was added.



Changed in version 3.13: The `pattern' parameter accepts a @ref{5a1,,path-like object}.



Changed in version 3.13: Any @ref{2c2,,OSError} exceptions raised from scanning the filesystem are
suppressed. In previous versions, such exceptions are suppressed in many
cases, but not all.

@end deffn

@geindex rglob() (pathlib.Path method)
@anchor{library/pathlib pathlib Path rglob}@anchor{539}
@deffn {Method} Path.rglob (pattern, *, case_sensitive=None, recurse_symlinks=False)

Glob the given relative `pattern' recursively.  This is like calling
@ref{538,,Path.glob()} with “@code{**/}” added in front of the `pattern'.

@cartouche
@quotation Note 
The paths are returned in no particular order.
If you need a specific order, sort the results.
@end quotation
@end cartouche

@cartouche
@quotation Note 
Any @ref{2c2,,OSError} exceptions raised from scanning the filesystem are
suppressed. This includes @ref{f44,,PermissionError} when accessing
directories without read permission.
@end quotation
@end cartouche


@subsubheading See also


@ref{2ca2,,Pattern language} and @ref{538,,Path.glob()} documentation.


Raises an @ref{1cb1,,auditing event} @code{pathlib.Path.rglob} with arguments @code{self}, @code{pattern}.


Changed in version 3.12: The `case_sensitive' parameter was added.



Changed in version 3.13: The `recurse_symlinks' parameter was added.



Changed in version 3.13: The `pattern' parameter accepts a @ref{5a1,,path-like object}.

@end deffn

@geindex walk() (pathlib.Path method)
@anchor{library/pathlib pathlib Path walk}@anchor{6d0}
@deffn {Method} Path.walk (top_down=True, on_error=None, follow_symlinks=False)

Generate the file names in a directory tree by walking the tree
either top-down or bottom-up.

For each directory in the directory tree rooted at `self' (including
`self' but excluding ‘.’ and ‘..’), the method yields a 3-tuple of
@code{(dirpath, dirnames, filenames)}.

`dirpath' is a @ref{268,,Path} to the directory currently being walked,
`dirnames' is a list of strings for the names of subdirectories in `dirpath'
(excluding @code{'.'} and @code{'..'}), and `filenames' is a list of strings for
the names of the non-directory files in `dirpath'. To get a full path
(which begins with `self') to a file or directory in `dirpath', do
@code{dirpath / name}. Whether or not the lists are sorted is file
system-dependent.

If the optional argument `top_down' is true (which is the default), the triple for a
directory is generated before the triples for any of its subdirectories
(directories are walked top-down).  If `top_down' is false, the triple
for a directory is generated after the triples for all of its subdirectories
(directories are walked bottom-up). No matter the value of `top_down', the
list of subdirectories is retrieved before the triples for the directory and
its subdirectories are walked.

When `top_down' is true, the caller can modify the `dirnames' list in-place
(for example, using @ref{1b63,,del} or slice assignment), and @code{Path.walk()}
will only recurse into the subdirectories whose names remain in `dirnames'.
This can be used to prune the search, or to impose a specific order of visiting,
or even to inform @code{Path.walk()} about directories the caller creates or
renames before it resumes @code{Path.walk()} again. Modifying `dirnames' when
`top_down' is false has no effect on the behavior of @code{Path.walk()} since the
directories in `dirnames' have already been generated by the time `dirnames'
is yielded to the caller.

By default, errors from @ref{c5a,,os.scandir()} are ignored.  If the optional
argument `on_error' is specified, it should be a callable; it will be
called with one argument, an @ref{2c2,,OSError} instance. The callable can handle the
error to continue the walk or re-raise it to stop the walk. Note that the
filename is available as the @code{filename} attribute of the exception object.

By default, @code{Path.walk()} does not follow symbolic links, and instead adds them
to the `filenames' list. Set `follow_symlinks' to true to resolve symlinks
and place them in `dirnames' and `filenames' as appropriate for their targets, and
consequently visit directories pointed to by symlinks (where supported).

@cartouche
@quotation Note 
Be aware that setting `follow_symlinks' to true can lead to infinite
recursion if a link points to a parent directory of itself. @code{Path.walk()}
does not keep track of the directories it has already visited.
@end quotation
@end cartouche

@cartouche
@quotation Note 
@code{Path.walk()} assumes the directories it walks are not modified during
execution. For example, if a directory from `dirnames' has been replaced
with a symlink and `follow_symlinks' is false, @code{Path.walk()} will
still try to descend into it. To prevent such behavior, remove directories
from `dirnames' as appropriate.
@end quotation
@end cartouche

@cartouche
@quotation Note 
Unlike @ref{6d1,,os.walk()}, @code{Path.walk()} lists symlinks to directories in
`filenames' if `follow_symlinks' is false.
@end quotation
@end cartouche

This example displays the number of bytes used by all files in each directory,
while ignoring @code{__pycache__} directories:

@example
from pathlib import Path
for root, dirs, files in Path("cpython/Lib/concurrent").walk(on_error=print):
  print(
      root,
      "consumes",
      sum((root / file).stat().st_size for file in files),
      "bytes in",
      len(files),
      "non-directory files"
  )
  if '__pycache__' in dirs:
        dirs.remove('__pycache__')
@end example

This next example is a simple implementation of @ref{354,,shutil.rmtree()}.
Walking the tree bottom-up is essential as @ref{2cad,,rmdir()} doesn’t allow
deleting a directory before it is empty:

@example
# Delete everything reachable from the directory "top".
# CAUTION:  This is dangerous! For example, if top == Path('/'),
# it could delete all of your files.
for root, dirs, files in top.walk(top_down=False):
    for name in files:
        (root / name).unlink()
    for name in dirs:
        (root / name).rmdir()
@end example


Added in version 3.12.

@end deffn

@node Creating files and directories,Copying moving and deleting,Reading directories,Concrete paths
@anchor{library/pathlib creating-files-and-directories}@anchor{2cae}
@subsubsection Creating files and directories


@geindex touch() (pathlib.Path method)
@anchor{library/pathlib pathlib Path touch}@anchor{2caf}
@deffn {Method} Path.touch (mode=0o666, exist_ok=True)

Create a file at this given path.  If `mode' is given, it is combined
with the process’s @code{umask} value to determine the file mode and access
flags.  If the file already exists, the function succeeds when `exist_ok'
is true (and its modification time is updated to the current time),
otherwise @ref{1226,,FileExistsError} is raised.


@subsubheading See also


The @ref{2cab,,open()}, @ref{104a,,write_text()} and
@ref{104c,,write_bytes()} methods are often used to create files.

@end deffn

@geindex mkdir() (pathlib.Path method)
@anchor{library/pathlib pathlib Path mkdir}@anchor{1047}
@deffn {Method} Path.mkdir (mode=0o777, parents=False, exist_ok=False)

Create a new directory at this given path.  If `mode' is given, it is
combined with the process’s @code{umask} value to determine the file mode
and access flags.  If the path already exists, @ref{1226,,FileExistsError}
is raised.

If `parents' is true, any missing parents of this path are created
as needed; they are created with the default permissions without taking
`mode' into account (mimicking the POSIX @code{mkdir -p} command).

If `parents' is false (the default), a missing parent raises
@ref{266,,FileNotFoundError}.

If `exist_ok' is false (the default), @ref{1226,,FileExistsError} is
raised if the target directory already exists.

If `exist_ok' is true, @ref{1226,,FileExistsError} will not be raised unless the given
path already exists in the file system and is not a directory (same
behavior as the POSIX @code{mkdir -p} command).


Changed in version 3.5: The `exist_ok' parameter was added.

@end deffn

@geindex symlink_to() (pathlib.Path method)
@anchor{library/pathlib pathlib Path symlink_to}@anchor{a29}
@deffn {Method} Path.symlink_to (target, target_is_directory=False)

Make this path a symbolic link pointing to `target'.

On Windows, a symlink represents either a file or a directory, and does not
morph to the target dynamically.  If the target is present, the type of the
symlink will be created to match. Otherwise, the symlink will be created
as a directory if `target_is_directory' is true or a file symlink (the
default) otherwise.  On non-Windows platforms, `target_is_directory' is ignored.

@example
>>> p = Path('mylink')
>>> p.symlink_to('setup.py')
>>> p.resolve()
PosixPath('/home/antoine/pathlib/setup.py')
>>> p.stat().st_size
956
>>> p.lstat().st_size
8
@end example

@cartouche
@quotation Note 
The order of arguments (link, target) is the reverse
of @ref{1300,,os.symlink()}’s.
@end quotation
@end cartouche


Changed in version 3.13: Raises @ref{534,,UnsupportedOperation} if @ref{1300,,os.symlink()} is not
available. In previous versions, @ref{369,,NotImplementedError} was raised.

@end deffn

@geindex hardlink_to() (pathlib.Path method)
@anchor{library/pathlib pathlib Path hardlink_to}@anchor{a28}
@deffn {Method} Path.hardlink_to (target)

Make this path a hard link to the same file as `target'.

@cartouche
@quotation Note 
The order of arguments (link, target) is the reverse
of @ref{12fb,,os.link()}’s.
@end quotation
@end cartouche


Added in version 3.10.



Changed in version 3.13: Raises @ref{534,,UnsupportedOperation} if @ref{12fb,,os.link()} is not
available. In previous versions, @ref{369,,NotImplementedError} was raised.

@end deffn

@node Copying moving and deleting,Permissions and ownership,Creating files and directories,Concrete paths
@anchor{library/pathlib copying-moving-and-deleting}@anchor{2cb0}
@subsubsection Copying, moving and deleting


@geindex copy() (pathlib.Path method)
@anchor{library/pathlib pathlib Path copy}@anchor{269}
@deffn {Method} Path.copy (target, *, follow_symlinks=True, preserve_metadata=False)

Copy this file or directory tree to the given `target', and return a new
@code{Path} instance pointing to `target'.

If the source is a file, the target will be replaced if it is an existing
file. If the source is a symlink and `follow_symlinks' is true (the
default), the symlink’s target is copied. Otherwise, the symlink is
recreated at the destination.

If `preserve_metadata' is false (the default), only directory structures
and file data are guaranteed to be copied. Set `preserve_metadata' to true
to ensure that file and directory permissions, flags, last access and
modification times, and extended attributes are copied where supported.
This argument has no effect when copying files on Windows (where
metadata is always preserved).

@cartouche
@quotation Note 
Where supported by the operating system and file system, this method
performs a lightweight copy, where data blocks are only copied when
modified. This is known as copy-on-write.
@end quotation
@end cartouche


Added in version 3.14.

@end deffn

@geindex copy_into() (pathlib.Path method)
@anchor{library/pathlib pathlib Path copy_into}@anchor{26a}
@deffn {Method} Path.copy_into (target_dir, *, follow_symlinks=True, preserve_metadata=False)

Copy this file or directory tree into the given `target_dir', which should
be an existing directory. Other arguments are handled identically to
@ref{269,,Path.copy()}. Returns a new @code{Path} instance pointing to the
copy.


Added in version 3.14.

@end deffn

@geindex rename() (pathlib.Path method)
@anchor{library/pathlib pathlib Path rename}@anchor{18d8}
@deffn {Method} Path.rename (target)

Rename this file or directory to the given `target', and return a new
@code{Path} instance pointing to `target'.  On Unix, if `target' exists
and is a file, it will be replaced silently if the user has permission.
On Windows, if `target' exists, @ref{1226,,FileExistsError} will be raised.
`target' can be either a string or another path object:

@example
>>> p = Path('foo')
>>> p.open('w').write('some text')
9
>>> target = Path('bar')
>>> p.rename(target)
PosixPath('bar')
>>> target.open().read()
'some text'
@end example

The target path may be absolute or relative. Relative paths are interpreted
relative to the current working directory, `not' the directory of the
@code{Path} object.

It is implemented in terms of @ref{12fd,,os.rename()} and gives the same guarantees.


Changed in version 3.8: Added return value, return the new @code{Path} instance.

@end deffn

@geindex replace() (pathlib.Path method)
@anchor{library/pathlib pathlib Path replace}@anchor{2cb1}
@deffn {Method} Path.replace (target)

Rename this file or directory to the given `target', and return a new
@code{Path} instance pointing to `target'.  If `target' points to an
existing file or empty directory, it will be unconditionally replaced.

The target path may be absolute or relative. Relative paths are interpreted
relative to the current working directory, `not' the directory of the
@code{Path} object.


Changed in version 3.8: Added return value, return the new @code{Path} instance.

@end deffn

@geindex move() (pathlib.Path method)
@anchor{library/pathlib pathlib Path move}@anchor{26b}
@deffn {Method} Path.move (target)

Move this file or directory tree to the given `target', and return a new
@code{Path} instance pointing to `target'.

If the `target' doesn’t exist it will be created. If both this path and the
`target' are existing files, then the target is overwritten. If both paths
point to the same file or directory, or the `target' is a non-empty
directory, then @ref{2c2,,OSError} is raised.

If both paths are on the same filesystem, the move is performed with
@ref{12fe,,os.replace()}. Otherwise, this path is copied (preserving metadata and
symlinks) and then deleted.


Added in version 3.14.

@end deffn

@geindex move_into() (pathlib.Path method)
@anchor{library/pathlib pathlib Path move_into}@anchor{26c}
@deffn {Method} Path.move_into (target_dir)

Move this file or directory tree into the given `target_dir', which should
be an existing directory. Returns a new @code{Path} instance pointing to
the moved path.


Added in version 3.14.

@end deffn

@geindex unlink() (pathlib.Path method)
@anchor{library/pathlib pathlib Path unlink}@anchor{1e17}
@deffn {Method} Path.unlink (missing_ok=False)

Remove this file or symbolic link.  If the path points to a directory,
use @ref{2cad,,Path.rmdir()} instead.

If `missing_ok' is false (the default), @ref{266,,FileNotFoundError} is
raised if the path does not exist.

If `missing_ok' is true, @ref{266,,FileNotFoundError} exceptions will be
ignored (same behavior as the POSIX @code{rm -f} command).


Changed in version 3.8: The `missing_ok' parameter was added.

@end deffn

@geindex rmdir() (pathlib.Path method)
@anchor{library/pathlib pathlib Path rmdir}@anchor{2cad}
@deffn {Method} Path.rmdir ()

Remove this directory.  The directory must be empty.
@end deffn

@node Permissions and ownership,,Copying moving and deleting,Concrete paths
@anchor{library/pathlib permissions-and-ownership}@anchor{2cb2}
@subsubsection Permissions and ownership


@geindex owner() (pathlib.Path method)
@anchor{library/pathlib pathlib Path owner}@anchor{53c}
@deffn {Method} Path.owner (*, follow_symlinks=True)

Return the name of the user owning the file. @ref{5e7,,KeyError} is raised
if the file’s user identifier (UID) isn’t found in the system database.

This method normally follows symlinks; to get the owner of the symlink, add
the argument @code{follow_symlinks=False}.


Changed in version 3.13: Raises @ref{534,,UnsupportedOperation} if the @ref{b7,,pwd} module is not
available. In earlier versions, @ref{369,,NotImplementedError} was raised.



Changed in version 3.13: The `follow_symlinks' parameter was added.

@end deffn

@geindex group() (pathlib.Path method)
@anchor{library/pathlib pathlib Path group}@anchor{53d}
@deffn {Method} Path.group (*, follow_symlinks=True)

Return the name of the group owning the file. @ref{5e7,,KeyError} is raised
if the file’s group identifier (GID) isn’t found in the system database.

This method normally follows symlinks; to get the group of the symlink, add
the argument @code{follow_symlinks=False}.


Changed in version 3.13: Raises @ref{534,,UnsupportedOperation} if the @ref{6a,,grp} module is not
available. In earlier versions, @ref{369,,NotImplementedError} was raised.



Changed in version 3.13: The `follow_symlinks' parameter was added.

@end deffn

@geindex chmod() (pathlib.Path method)
@anchor{library/pathlib pathlib Path chmod}@anchor{a2b}
@deffn {Method} Path.chmod (mode, *, follow_symlinks=True)

Change the file mode and permissions, like @ref{52a,,os.chmod()}.

This method normally follows symlinks. Some Unix flavours support changing
permissions on the symlink itself; on these platforms you may add the
argument @code{follow_symlinks=False}, or use @ref{2cb3,,lchmod()}.

@example
>>> p = Path('setup.py')
>>> p.stat().st_mode
33277
>>> p.chmod(0o444)
>>> p.stat().st_mode
33060
@end example


Changed in version 3.10: The `follow_symlinks' parameter was added.

@end deffn

@geindex lchmod() (pathlib.Path method)
@anchor{library/pathlib pathlib Path lchmod}@anchor{2cb3}
@deffn {Method} Path.lchmod (mode)

Like @ref{a2b,,Path.chmod()} but, if the path points to a symbolic link, the
symbolic link’s mode is changed rather than its target’s.
@end deffn

@node Pattern language,Comparison to the glob module,Concrete paths,pathlib — Object-oriented filesystem paths
@anchor{library/pathlib pathlib-pattern-language}@anchor{2ca2}@anchor{library/pathlib pattern-language}@anchor{2cb4}
@subsubsection Pattern language


The following wildcards are supported in patterns for
@ref{536,,full_match()}, @ref{538,,glob()} and @ref{539,,rglob()}:


@table @asis

@item @code{**} (entire segment)

Matches any number of file or directory segments, including zero.

@item @code{*} (entire segment)

Matches one file or directory segment.

@item @code{*} (part of a segment)

Matches any number of non-separator characters, including zero.

@item @code{?}

Matches one non-separator character.

@item @code{[seq]}

Matches one character in `seq', where `seq' is a sequence of characters.
Range expressions are supported; for example, @code{[a-z]} matches any lowercase ASCII letter.
Multiple ranges can be combined: @code{[a-zA-Z0-9_]} matches any ASCII letter, digit, or underscore.

@item @code{[!seq]}

Matches one character not in `seq', where `seq' follows the same rules as above.
@end table

For a literal match, wrap the meta-characters in brackets.
For example, @code{"[?]"} matches the character @code{"?"}.

The “@code{**}” wildcard enables recursive globbing. A few examples:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Pattern

@tab

Meaning

@item

“@code{**/*}”

@tab

Any path with at least one segment.

@item

“@code{**/*.py}”

@tab

Any path with a final segment ending “@code{.py}”.

@item

“@code{assets/**}”

@tab

Any path starting with “@code{assets/}”.

@item

“@code{assets/**/*}”

@tab

Any path starting with “@code{assets/}”, excluding “@code{assets/}” itself.

@end multitable


@cartouche
@quotation Note 
Globbing with the “@code{**}” wildcard visits every directory in the tree.
Large directory trees may take a long time to search.
@end quotation
@end cartouche


Changed in version 3.13: Globbing with a pattern that ends with “@code{**}” returns both files and
directories. In previous versions, only directories were returned.


In @ref{538,,Path.glob()} and @ref{539,,rglob()}, a trailing slash may be added to
the pattern to match only directories.


Changed in version 3.11: Globbing with a pattern that ends with a pathname components separator
(@ref{87c,,sep} or @ref{87d,,altsep}) returns only directories.


@node Comparison to the glob module,Comparison to the os and os path modules,Pattern language,pathlib — Object-oriented filesystem paths
@anchor{library/pathlib comparison-to-the-glob-module}@anchor{2cb5}
@subsubsection Comparison to the @code{glob} module


The patterns accepted and results generated by @ref{538,,Path.glob()} and
@ref{539,,Path.rglob()} differ slightly from those by the @ref{68,,glob} module:


@enumerate 

@item 
Files beginning with a dot are not special in pathlib. This is
like passing @code{include_hidden=True} to @ref{5a0,,glob.glob()}.

@item 
“@code{**}” pattern components are always recursive in pathlib. This is like
passing @code{recursive=True} to @ref{5a0,,glob.glob()}.

@item 
“@code{**}” pattern components do not follow symlinks by default in pathlib.
This behaviour has no equivalent in @ref{5a0,,glob.glob()}, but you can pass
@code{recurse_symlinks=True} to @ref{538,,Path.glob()} for compatible behaviour.

@item 
Like all @ref{6ce,,PurePath} and @ref{268,,Path} objects, the values returned
from @ref{538,,Path.glob()} and @ref{539,,Path.rglob()} don’t include trailing
slashes.

@item 
The values returned from pathlib’s @code{path.glob()} and @code{path.rglob()}
include the `path' as a prefix, unlike the results of
@code{glob.glob(root_dir=path)}.

@item 
The values returned from pathlib’s @code{path.glob()} and @code{path.rglob()}
may include `path' itself, for example when globbing “@code{**}”, whereas the
results of @code{glob.glob(root_dir=path)} never include an empty string that
would correspond to `path'.
@end enumerate

@node Comparison to the os and os path modules,Protocols,Comparison to the glob module,pathlib — Object-oriented filesystem paths
@anchor{library/pathlib comparison-to-the-os-and-os-path-modules}@anchor{2cb6}
@subsubsection Comparison to the @code{os} and @code{os.path} modules


pathlib implements path operations using @ref{6ce,,PurePath} and @ref{268,,Path}
objects, and so it’s said to be `object-oriented'. On the other hand, the
@ref{a5,,os} and @ref{a6,,os.path} modules supply functions that work with low-level
@code{str} and @code{bytes} objects, which is a more `procedural' approach. Some
users consider the object-oriented style to be more readable.

Many functions in @ref{a5,,os} and @ref{a6,,os.path} support @code{bytes} paths and
@ref{12f6,,paths relative to directory descriptors}. These features aren’t
available in pathlib.

Python’s @code{str} and @code{bytes} types, and portions of the @ref{a5,,os} and
@ref{a6,,os.path} modules, are written in C and are very speedy. pathlib is
written in pure Python and is often slower, but rarely slow enough to matter.

pathlib’s path normalization is slightly more opinionated and consistent than
@ref{a6,,os.path}. For example, whereas @ref{1526,,os.path.abspath()} eliminates
“@code{..}” segments from a path, which may change its meaning if symlinks are
involved, @ref{1a6d,,Path.absolute()} preserves these segments for greater safety.

pathlib’s path normalization may render it unsuitable for some applications:


@enumerate 

@item 
pathlib normalizes @code{Path("my_folder/")} to @code{Path("my_folder")}, which
changes a path’s meaning when supplied to various operating system APIs and
command-line utilities. Specifically, the absence of a trailing separator
may allow the path to be resolved as either a file or directory, rather
than a directory only.

@item 
pathlib normalizes @code{Path("./my_program")} to @code{Path("my_program")},
which changes a path’s meaning when used as an executable search path, such
as in a shell or when spawning a child process. Specifically, the absence
of a separator in the path may force it to be looked up in 
@geindex PATH
@geindex environment variable; PATH
@code{PATH}
rather than the current directory.
@end enumerate

As a consequence of these differences, pathlib is not a drop-in replacement
for @ref{a6,,os.path}.

@menu
* Corresponding tools:: 

@end menu

@node Corresponding tools,,,Comparison to the os and os path modules
@anchor{library/pathlib corresponding-tools}@anchor{2cb7}
@subsubsection Corresponding tools


Below is a table mapping various @ref{a5,,os} functions to their corresponding
@ref{6ce,,PurePath}/@ref{268,,Path} equivalent.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

@ref{a5,,os} and @ref{a6,,os.path}

@tab

@code{pathlib}

@item

@ref{2cb8,,os.path.dirname()}

@tab

@ref{1ae3,,PurePath.parent}

@item

@ref{2cb9,,os.path.basename()}

@tab

@ref{2c9e,,PurePath.name}

@item

@ref{199d,,os.path.splitext()}

@tab

@ref{2c9f,,PurePath.stem}, @ref{199b,,PurePath.suffix}

@item

@ref{19eb,,os.path.join()}

@tab

@ref{2ca1,,PurePath.joinpath()}

@item

@ref{532,,os.path.isabs()}

@tab

@ref{1ae2,,PurePath.is_absolute()}

@item

@ref{6d2,,os.path.relpath()}

@tab

@ref{2ff,,PurePath.relative_to()} @footnote{
@ref{6d2,,os.path.relpath()} calls @ref{1526,,abspath()} to make paths
absolute and remove “@code{..}” parts, whereas @ref{2ff,,PurePath.relative_to()}
is a lexical operation that raises @ref{2ee,,ValueError} when its inputs’
anchors differ (e.g. if one path is absolute and the other relative.)
}

@item

@ref{c0f,,os.path.expanduser()}

@tab

@ref{1048,,Path.expanduser()} @footnote{
@ref{c0f,,os.path.expanduser()} returns the path unchanged if the home
directory can’t be resolved, whereas @ref{1048,,Path.expanduser()} raises
@ref{246,,RuntimeError}.
}

@item

@ref{264,,os.path.realpath()}

@tab

@ref{1ab3,,Path.resolve()}

@item

@ref{1526,,os.path.abspath()}

@tab

@ref{1a6d,,Path.absolute()} @footnote{
@ref{1526,,os.path.abspath()} removes “@code{..}” components without resolving
symlinks, which may change the meaning of the path, whereas
@ref{1a6d,,Path.absolute()} leaves any “@code{..}” components in the path.
}

@item

@ref{c09,,os.path.exists()}

@tab

@ref{c11,,Path.exists()}

@item

@ref{c0c,,os.path.isfile()}

@tab

@ref{53a,,Path.is_file()}

@item

@ref{c0b,,os.path.isdir()}

@tab

@ref{53b,,Path.is_dir()}

@item

@ref{c07,,os.path.islink()}

@tab

@ref{c13,,Path.is_symlink()}

@item

@ref{6cb,,os.path.isjunction()}

@tab

@ref{6d3,,Path.is_junction()}

@item

@ref{c0d,,os.path.ismount()}

@tab

@ref{c12,,Path.is_mount()}

@item

@ref{1177,,os.path.samefile()}

@tab

@ref{1046,,Path.samefile()}

@item

@ref{194e,,os.getcwd()}

@tab

@ref{1ae1,,Path.cwd()}

@item

@ref{26f,,os.stat()}

@tab

@ref{a2a,,Path.stat()}

@item

@ref{6c9,,os.lstat()}

@tab

@ref{2ca9,,Path.lstat()}

@item

@ref{1306,,os.listdir()}

@tab

@ref{270,,Path.iterdir()}

@item

@ref{6d1,,os.walk()}

@tab

@ref{6d0,,Path.walk()} @footnote{
@ref{6d1,,os.walk()} always follows symlinks when categorizing paths into
`dirnames' and `filenames', whereas @ref{6d0,,Path.walk()} categorizes all
symlinks into `filenames' when `follow_symlinks' is false (the default.)
}

@item

@ref{52c,,os.mkdir()}, @ref{52d,,os.makedirs()}

@tab

@ref{1047,,Path.mkdir()}

@item

@ref{12fb,,os.link()}

@tab

@ref{a28,,Path.hardlink_to()}

@item

@ref{1300,,os.symlink()}

@tab

@ref{a29,,Path.symlink_to()}

@item

@ref{b20,,os.readlink()}

@tab

@ref{b1f,,Path.readlink()}

@item

@ref{12fd,,os.rename()}

@tab

@ref{18d8,,Path.rename()}

@item

@ref{12fe,,os.replace()}

@tab

@ref{2cb1,,Path.replace()}

@item

@ref{12fc,,os.remove()}, @ref{1301,,os.unlink()}

@tab

@ref{1e17,,Path.unlink()}

@item

@ref{12ff,,os.rmdir()}

@tab

@ref{2cad,,Path.rmdir()}

@item

@ref{52a,,os.chmod()}

@tab

@ref{a2b,,Path.chmod()}

@item

@ref{529,,os.lchmod()}

@tab

@ref{2cb3,,Path.lchmod()}

@end multitable


@node Protocols,,Comparison to the os and os path modules,pathlib — Object-oriented filesystem paths
@anchor{library/pathlib module-pathlib types}@anchor{a9}@anchor{library/pathlib protocols}@anchor{2cba}
@subsubsection Protocols


@geindex module; pathlib.types

The @code{pathlib.types} module provides types for static type checking.


Added in version 3.14.


@geindex PathInfo (class in pathlib.types)
@anchor{library/pathlib pathlib types PathInfo}@anchor{26e}
@deffn {Class} pathlib.types.PathInfo

A @ref{56b,,typing.Protocol} describing the
@ref{26d,,Path.info} attribute. Implementations may
return cached results from their methods.

@geindex exists() (pathlib.types.PathInfo method)
@anchor{library/pathlib pathlib types PathInfo exists}@anchor{2cbb}
@deffn {Method} exists (*, follow_symlinks=True)

Return @code{True} if the path is an existing file or directory, or any
other kind of file; return @code{False} if the path doesn’t exist.

If `follow_symlinks' is @code{False}, return @code{True} for symlinks without
checking if their targets exist.
@end deffn

@geindex is_dir() (pathlib.types.PathInfo method)
@anchor{library/pathlib pathlib types PathInfo is_dir}@anchor{2cbc}
@deffn {Method} is_dir (*, follow_symlinks=True)

Return @code{True} if the path is a directory, or a symbolic link pointing
to a directory; return @code{False} if the path is (or points to) any other
kind of file, or if it doesn’t exist.

If `follow_symlinks' is @code{False}, return @code{True} only if the path
is a directory (without following symlinks); return @code{False} if the
path is any other kind of file, or if it doesn’t exist.
@end deffn

@geindex is_file() (pathlib.types.PathInfo method)
@anchor{library/pathlib pathlib types PathInfo is_file}@anchor{2cbd}
@deffn {Method} is_file (*, follow_symlinks=True)

Return @code{True} if the path is a file, or a symbolic link pointing to
a file; return @code{False} if the path is (or points to) a directory or
other non-file, or if it doesn’t exist.

If `follow_symlinks' is @code{False}, return @code{True} only if the path
is a file (without following symlinks); return @code{False} if the path
is a directory or other non-file, or if it doesn’t exist.
@end deffn

@geindex is_symlink() (pathlib.types.PathInfo method)
@anchor{library/pathlib pathlib types PathInfo is_symlink}@anchor{2cbe}
@deffn {Method} is_symlink ()

Return @code{True} if the path is a symbolic link (even if broken); return
@code{False} if the path is a directory or any kind of file, or if it
doesn’t exist.
@end deffn
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node os path — Common pathname manipulations,stat — Interpreting stat results,pathlib — Object-oriented filesystem paths,File and Directory Access
@anchor{library/os path doc}@anchor{2cbf}@anchor{library/os path module-os path}@anchor{a6}@anchor{library/os path os-path-common-pathname-manipulations}@anchor{2cc0}@anchor{library/os path translation-repo}@anchor{2cc1}
@subsection @code{os.path} — Common pathname manipulations


@geindex module; os.path

`Source code:' Lib/genericpath.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/genericpath.py}, Lib/posixpath.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/posixpath.py} (for POSIX) and
Lib/ntpath.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/ntpath.py} (for Windows).

@geindex path; operations


__________________________________________________________________


This module implements some useful functions on pathnames. To read or write
files see @ref{318,,open()}, and for accessing the filesystem see the @ref{a5,,os}
module. The path parameters can be passed as strings, or bytes, or any object
implementing the @ref{e51,,os.PathLike} protocol.

Unlike a Unix shell, Python does not do any `automatic' path expansions.
Functions such as @ref{c0f,,expanduser()} and @ref{15e5,,expandvars()} can be invoked
explicitly when an application desires shell-like path expansion.  (See also
the @ref{68,,glob} module.)


@subsubheading See also


The @ref{a8,,pathlib} module offers high-level path objects.


@cartouche
@quotation Note 
All of these functions accept either only bytes or only string objects as
their parameters.  The result is an object of the same type, if a path or
file name is returned.
@end quotation
@end cartouche

@cartouche
@quotation Note 
Since different operating systems have different path name conventions, there
are several versions of this module in the standard library.  The
@code{os.path} module is always the path module suitable for the operating
system Python is running on, and therefore usable for local paths.  However,
you can also import and use the individual modules if you want to manipulate
a path that is `always' in one of the different formats.  They all have the
same interface:


@itemize *

@item 
@code{posixpath} for UNIX-style paths

@item 
@code{ntpath} for Windows paths
@end itemize
@end quotation
@end cartouche


Changed in version 3.8: @ref{c09,,exists()}, @ref{c0a,,lexists()}, @ref{c0b,,isdir()}, @ref{c0c,,isfile()},
@ref{c07,,islink()}, and @ref{c0d,,ismount()} now return @code{False} instead of
raising an exception for paths that contain characters or bytes
unrepresentable at the OS level.


@geindex abspath() (in module os.path)
@anchor{library/os path os path abspath}@anchor{1526}
@deffn {Function} os.path.abspath (path)

Return a normalized absolutized version of the pathname `path'. On most
platforms, this is equivalent to calling @code{normpath(join(os.getcwd(), path))}.


@subsubheading See also


@ref{19eb,,os.path.join()} and @ref{1525,,os.path.normpath()}.



Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.

@end deffn

@geindex basename() (in module os.path)
@anchor{library/os path os path basename}@anchor{2cb9}
@deffn {Function} os.path.basename (path, /)

Return the base name of pathname `path'.  This is the second element of the
pair returned by passing `path' to the function @ref{2cc2,,split()}.  Note that
the result of this function is different
from the Unix @code{basename} program; where @code{basename} for
@code{'/foo/bar/'} returns @code{'bar'}, the @code{basename()} function returns an
empty string (@code{'@w{'}}).


Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.

@end deffn

@geindex commonpath() (in module os.path)
@anchor{library/os path os path commonpath}@anchor{1043}
@deffn {Function} os.path.commonpath (paths)

Return the longest common sub-path of each pathname in the iterable
`paths'.  Raise @ref{2ee,,ValueError} if `paths' contain both absolute
and relative pathnames, if `paths' are on different drives, or
if `paths' is empty.  Unlike @ref{1044,,commonprefix()}, this returns a
valid path.


Added in version 3.5.



Changed in version 3.6: Accepts a sequence of @ref{5a1,,path-like objects}.



Changed in version 3.13: Any iterable can now be passed, rather than just sequences.

@end deffn

@geindex commonprefix() (in module os.path)
@anchor{library/os path os path commonprefix}@anchor{1044}
@deffn {Function} os.path.commonprefix (list, /)

Return the longest string prefix (taken character-by-character) that is a
prefix of all strings in `list'.  If `list' is empty, return the empty string
(@code{'@w{'}}).

@cartouche
@quotation Warning 
This function may return invalid paths because it works a
character at a time.
If you need a `common path prefix', then the algorithm
implemented in this function is not secure. Use
@ref{1043,,commonpath()} for finding a common path prefix.

@example
>>> os.path.commonprefix(['/usr/lib', '/usr/local/lib'])
'/usr/l'

>>> os.path.commonpath(['/usr/lib', '/usr/local/lib'])
'/usr'
@end example
@end quotation
@end cartouche


Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.

@end deffn

@geindex dirname() (in module os.path)
@anchor{library/os path os path dirname}@anchor{2cb8}
@deffn {Function} os.path.dirname (path, /)

Return the directory name of pathname `path'.  This is the first element of
the pair returned by passing `path' to the function @ref{2cc2,,split()}.


Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.

@end deffn

@geindex exists() (in module os.path)
@anchor{library/os path os path exists}@anchor{c09}
@deffn {Function} os.path.exists (path)

Return @code{True} if `path' refers to an existing path or an open
file descriptor.  Returns @code{False} for broken symbolic links.  On
some platforms, this function may return @code{False} if permission is
not granted to execute @ref{26f,,os.stat()} on the requested file, even
if the `path' physically exists.


Changed in version 3.3: `path' can now be an integer: @code{True} is returned if it is an
 open file descriptor, @code{False} otherwise.



Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.

@end deffn

@geindex lexists() (in module os.path)
@anchor{library/os path os path lexists}@anchor{c0a}
@deffn {Function} os.path.lexists (path)

Return @code{True} if `path' refers to an existing path, including
broken symbolic links.   Equivalent to @ref{c09,,exists()} on platforms lacking
@ref{6c9,,os.lstat()}.


Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.

@end deffn

@geindex ~ (tilde); home directory expansion

@geindex expanduser() (in module os.path)
@anchor{library/os path os path expanduser}@anchor{c0f}
@deffn {Function} os.path.expanduser (path)

On Unix and Windows, return the argument with an initial component of @code{~} or
@code{~user} replaced by that `user'’s home directory.

@geindex module; pwd

On Unix, an initial @code{~} is replaced by the environment variable 
@geindex HOME
@geindex environment variable; HOME
@code{HOME}
if it is set; otherwise the current user’s home directory is looked up in the
password directory through the built-in module @ref{b7,,pwd}. An initial @code{~user}
is looked up directly in the password directory.

On Windows, 
@geindex USERPROFILE
@geindex environment variable; USERPROFILE
@code{USERPROFILE} will be used if set, otherwise a combination
of 
@geindex HOMEPATH
@geindex environment variable; HOMEPATH
@code{HOMEPATH} and 
@geindex HOMEDRIVE
@geindex environment variable; HOMEDRIVE
@code{HOMEDRIVE} will be used.  An initial
@code{~user} is handled by checking that the last directory component of the current
user’s home directory matches 
@geindex USERNAME
@geindex environment variable; USERNAME
@code{USERNAME}, and replacing it if so.

If the expansion fails or if the path does not begin with a tilde, the path is
returned unchanged.


Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.



Changed in version 3.8: No longer uses 
@geindex HOME
@geindex environment variable; HOME
@code{HOME} on Windows.

@end deffn

@geindex $ (dollar); environment variables expansion
@geindex % (percent); environment variables expansion (Windows)

@geindex expandvars() (in module os.path)
@anchor{library/os path os path expandvars}@anchor{15e5}
@deffn {Function} os.path.expandvars (path)

Return the argument with environment variables expanded.  Substrings of the form
@code{$name} or @code{$@{name@}} are replaced by the value of environment variable
`name'.  Malformed variable names and references to non-existing variables are
left unchanged.

On Windows, @code{%name%} expansions are supported in addition to @code{$name} and
@code{$@{name@}}.


Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.

@end deffn

@geindex getatime() (in module os.path)
@anchor{library/os path os path getatime}@anchor{2cc3}
@deffn {Function} os.path.getatime (path, /)

Return the time of last access of `path'.  The return value is a floating-point number giving
the number of seconds since the epoch (see the  @ref{f4,,time} module).  Raise
@ref{2c2,,OSError} if the file does not exist or is inaccessible.
@end deffn

@geindex getmtime() (in module os.path)
@anchor{library/os path os path getmtime}@anchor{2cc4}
@deffn {Function} os.path.getmtime (path, /)

Return the time of last modification of `path'.  The return value is a floating-point number
giving the number of seconds since the epoch (see the  @ref{f4,,time} module).
Raise @ref{2c2,,OSError} if the file does not exist or is inaccessible.


Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.

@end deffn

@geindex getctime() (in module os.path)
@anchor{library/os path os path getctime}@anchor{2cc5}
@deffn {Function} os.path.getctime (path, /)

Return the system’s ctime which, on some systems (like Unix) is the time of the
last metadata change, and, on others (like Windows), is the creation time for `path'.
The return value is a number giving the number of seconds since the epoch (see
the  @ref{f4,,time} module).  Raise @ref{2c2,,OSError} if the file does not exist or
is inaccessible.


Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.

@end deffn

@geindex getsize() (in module os.path)
@anchor{library/os path os path getsize}@anchor{2cc6}
@deffn {Function} os.path.getsize (path, /)

Return the size, in bytes, of `path'.  Raise @ref{2c2,,OSError} if the file does
not exist or is inaccessible.


Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.

@end deffn

@geindex isabs() (in module os.path)
@anchor{library/os path os path isabs}@anchor{532}
@deffn {Function} os.path.isabs (path, /)

Return @code{True} if `path' is an absolute pathname.  On Unix, that means it
begins with a slash, on Windows that it begins with two (back)slashes, or a
drive letter, colon, and (back)slash together.


@subsubheading See also


@ref{1526,,abspath()}



Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.



Changed in version 3.13: On Windows, returns @code{False} if the given path starts with exactly one
(back)slash.

@end deffn

@geindex isfile() (in module os.path)
@anchor{library/os path os path isfile}@anchor{c0c}
@deffn {Function} os.path.isfile (path)

Return @code{True} if `path' is an @ref{c09,,existing} regular file.
This follows symbolic links, so both @ref{c07,,islink()} and @code{isfile()} can
be true for the same path.


Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.

@end deffn

@geindex isdir() (in module os.path)
@anchor{library/os path os path isdir}@anchor{c0b}
@deffn {Function} os.path.isdir (path, /)

Return @code{True} if `path' is an @ref{c09,,existing} directory.  This
follows symbolic links, so both @ref{c07,,islink()} and @code{isdir()} can be true
for the same path.


Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.

@end deffn

@geindex isjunction() (in module os.path)
@anchor{library/os path os path isjunction}@anchor{6cb}
@deffn {Function} os.path.isjunction (path)

Return @code{True} if `path' refers to an @ref{c0a,,existing} directory
entry that is a junction.  Always return @code{False} if junctions are not
supported on the current platform.


Added in version 3.12.

@end deffn

@geindex islink() (in module os.path)
@anchor{library/os path os path islink}@anchor{c07}
@deffn {Function} os.path.islink (path)

Return @code{True} if `path' refers to an @ref{c09,,existing} directory
entry that is a symbolic link.  Always @code{False} if symbolic links are not
supported by the Python runtime.


Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.

@end deffn

@geindex ismount() (in module os.path)
@anchor{library/os path os path ismount}@anchor{c0d}
@deffn {Function} os.path.ismount (path)

Return @code{True} if pathname `path' is a `mount point': a point in a
file system where a different file system has been mounted.  On POSIX, the
function checks whether `path'’s parent, @code{`path'/..}, is on a different
device than `path', or whether @code{`path'/..} and `path' point to the same
i-node on the same device — this should detect mount points for all Unix
and POSIX variants.  It is not able to reliably detect bind mounts on the
same filesystem. On Linux systems, it will always return @code{True} for btrfs
subvolumes, even if they aren’t mount points. On Windows, a drive letter root
and a share UNC are always mount points, and for any other path
@code{GetVolumePathName} is called to see if it is different from the input path.


Changed in version 3.4: Added support for detecting non-root mount points on Windows.



Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.

@end deffn

@geindex isdevdrive() (in module os.path)
@anchor{library/os path os path isdevdrive}@anchor{1a04}
@deffn {Function} os.path.isdevdrive (path)

Return @code{True} if pathname `path' is located on a Windows Dev Drive.
A Dev Drive is optimized for developer scenarios, and offers faster
performance for reading and writing files. It is recommended for use for
source code, temporary build directories, package caches, and other
IO-intensive operations.

May raise an error for an invalid path, for example, one without a
recognizable drive, but returns @code{False} on platforms that do not support
Dev Drives. See the Windows documentation@footnote{https://learn.microsoft.com/windows/dev-drive/}
for information on enabling and creating Dev Drives.


Added in version 3.12.



Changed in version 3.13: The function is now available on all platforms, and will always return @code{False} on those that have no support for Dev Drives

@end deffn

@geindex isreserved() (in module os.path)
@anchor{library/os path os path isreserved}@anchor{329}
@deffn {Function} os.path.isreserved (path)

Return @code{True} if `path' is a reserved pathname on the current system.

On Windows, reserved filenames include those that end with a space or dot;
those that contain colons (i.e. file streams such as “name:stream”),
wildcard characters (i.e. @code{'*?"<>'}), pipe, or ASCII control characters;
as well as DOS device names such as “NUL”, “CON”, “CONIN$”, “CONOUT$”,
“AUX”, “PRN”, “COM1”, and “LPT1”.

@cartouche
@quotation Note 
This function approximates rules for reserved paths on most Windows
systems. These rules change over time in various Windows releases.
This function may be updated in future Python releases as changes to
the rules become broadly available.
@end quotation
@end cartouche

@ref{2181,,Availability}: Windows.


Added in version 3.13.

@end deffn

@geindex join() (in module os.path)
@anchor{library/os path os path join}@anchor{19eb}
@deffn {Function} os.path.join (path, /, *paths)

Join one or more path segments intelligently.  The return value is the
concatenation of `path' and all members of `*paths', with exactly one
directory separator following each non-empty part, except the last. That is,
the result will only end in a separator if the last part is either empty or
ends in a separator.

If a segment is an absolute path (which on Windows requires both a drive and
a root), then all previous segments are ignored and joining continues from the
absolute path segment. On Linux, for example:

@example
>>> os.path.join('/home/foo', 'bar')
'/home/foo/bar'
>>> os.path.join('/home/foo', '/home/bar')
'/home/bar'
@end example

On Windows, the drive is not reset when a rooted path segment (e.g.,
@code{r'\foo'}) is encountered. If a segment is on a different drive or is an
absolute path, all previous segments are ignored and the drive is reset. For
example:

@example
>>> os.path.join('c:\\', 'foo')
'c:\\foo'
>>> os.path.join('c:\\foo', 'd:\\bar')
'd:\\bar'
@end example

Note that since there is a current directory for each drive,
@code{os.path.join("c:", "foo")} represents a path relative to the current
directory on drive @code{C:} (@code{c:foo}), not @code{c:\foo}.


Changed in version 3.6: Accepts a @ref{5a1,,path-like object} for `path' and `paths'.

@end deffn

@geindex normcase() (in module os.path)
@anchor{library/os path os path normcase}@anchor{2cc7}
@deffn {Function} os.path.normcase (path, /)

Normalize the case of a pathname.  On Windows, convert all characters in the
pathname to lowercase, and also convert forward slashes to backward slashes.
On other operating systems, return the path unchanged.


Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.

@end deffn

@geindex normpath() (in module os.path)
@anchor{library/os path os path normpath}@anchor{1525}
@deffn {Function} os.path.normpath (path)

Normalize a pathname by collapsing redundant separators and up-level
references so that @code{A//B}, @code{A/B/}, @code{A/./B} and @code{A/foo/../B} all
become @code{A/B}.  This string manipulation may change the meaning of a path
that contains symbolic links.  On Windows, it converts forward slashes to
backward slashes. To normalize case, use @ref{2cc7,,normcase()}.

@cartouche
@quotation Note 
On POSIX systems, in accordance with IEEE Std 1003.1 2013 Edition; 4.13 Pathname Resolution@footnote{https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_13},
if a pathname begins with exactly two slashes, the first component
following the leading characters may be interpreted in an implementation-defined
manner, although more than two leading characters shall be treated as a
single character.
@end quotation
@end cartouche


Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.

@end deffn

@geindex realpath() (in module os.path)
@anchor{library/os path os path realpath}@anchor{264}
@deffn {Function} os.path.realpath (path, /, *, strict=False)

Return the canonical path of the specified filename, eliminating any symbolic
links encountered in the path (if they are supported by the operating
system). On Windows, this function will also resolve MS-DOS (also called 8.3)
style names such as @code{C:\\PROGRA~1} to @code{C:\\Program Files}.

By default, the path is evaluated up to the first component that does not
exist, is a symlink loop, or whose evaluation raises @ref{2c2,,OSError}.
All such components are appended unchanged to the existing part of the path.

Some errors that are handled this way include “access denied”, “not a
directory”, or “bad argument to internal function”. Thus, the
resulting path may be missing or inaccessible, may still contain
links or loops, and may traverse non-directories.

This behavior can be modified by keyword arguments:

If `strict' is @code{True}, the first error encountered when evaluating the path is
re-raised.
In particular, @ref{266,,FileNotFoundError} is raised if `path' does not exist,
or another @ref{2c2,,OSError} if it is otherwise inaccessible.

If `strict' is @ref{265,,os.path.ALLOW_MISSING}, errors other than
@ref{266,,FileNotFoundError} are re-raised (as with @code{strict=True}).
Thus, the returned path will not contain any symbolic links, but the named
file and some of its parent directories may be missing.

@cartouche
@quotation Note 
This function emulates the operating system’s procedure for making a path
canonical, which differs slightly between Windows and UNIX with respect
to how links and subsequent path components interact.

Operating system APIs make paths canonical as needed, so it’s not
normally necessary to call this function.
@end quotation
@end cartouche


Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.



Changed in version 3.8: Symbolic links and junctions are now resolved on Windows.



Changed in version 3.10: The `strict' parameter was added.



Changed in version 3.14: The @ref{265,,ALLOW_MISSING} value for the `strict' parameter
was added.

@end deffn

@geindex ALLOW_MISSING (in module os.path)
@anchor{library/os path os path ALLOW_MISSING}@anchor{265}
@deffn {Data} os.path.ALLOW_MISSING

Special value used for the `strict' argument in @ref{264,,realpath()}.


Added in version 3.14.

@end deffn

@geindex relpath() (in module os.path)
@anchor{library/os path os path relpath}@anchor{6d2}
@deffn {Function} os.path.relpath (path, start=os.curdir)

Return a relative filepath to `path' either from the current directory or
from an optional `start' directory.  This is a path computation:  the
filesystem is not accessed to confirm the existence or nature of `path' or
`start'.  On Windows, @ref{2ee,,ValueError} is raised when `path' and `start'
are on different drives.

`start' defaults to @ref{2cc8,,os.curdir}.


Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.

@end deffn

@geindex samefile() (in module os.path)
@anchor{library/os path os path samefile}@anchor{1177}
@deffn {Function} os.path.samefile (path1, path2, /)

Return @code{True} if both pathname arguments refer to the same file or directory.
This is determined by the device number and i-node number and raises an
exception if an @ref{26f,,os.stat()} call on either pathname fails.


Changed in version 3.2: Added Windows support.



Changed in version 3.4: Windows now uses the same implementation as all other platforms.



Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.

@end deffn

@geindex sameopenfile() (in module os.path)
@anchor{library/os path os path sameopenfile}@anchor{2cc9}
@deffn {Function} os.path.sameopenfile (fp1, fp2)

Return @code{True} if the file descriptors `fp1' and `fp2' refer to the same file.


Changed in version 3.2: Added Windows support.



Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.

@end deffn

@geindex samestat() (in module os.path)
@anchor{library/os path os path samestat}@anchor{1176}
@deffn {Function} os.path.samestat (stat1, stat2, /)

Return @code{True} if the stat tuples `stat1' and `stat2' refer to the same file.
These structures may have been returned by @ref{f92,,os.fstat()},
@ref{6c9,,os.lstat()}, or @ref{26f,,os.stat()}.  This function implements the
underlying comparison used by @ref{1177,,samefile()} and @ref{2cc9,,sameopenfile()}.


Changed in version 3.4: Added Windows support.

@end deffn

@geindex split() (in module os.path)
@anchor{library/os path os path split}@anchor{2cc2}
@deffn {Function} os.path.split (path, /)

Split the pathname `path' into a pair, @code{(head, tail)} where `tail' is the
last pathname component and `head' is everything leading up to that.  The
`tail' part will never contain a slash; if `path' ends in a slash, `tail'
will be empty.  If there is no slash in `path', `head' will be empty.  If
`path' is empty, both `head' and `tail' are empty.  Trailing slashes are
stripped from `head' unless it is the root (one or more slashes only).  In
all cases, @code{join(head, tail)} returns a path to the same location as `path'
(but the strings may differ).  Also see the functions @ref{19eb,,join()},
@ref{2cb8,,dirname()} and @ref{2cb9,,basename()}.


Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.

@end deffn

@geindex splitdrive() (in module os.path)
@anchor{library/os path os path splitdrive}@anchor{df5}
@deffn {Function} os.path.splitdrive (path, /)

Split the pathname `path' into a pair @code{(drive, tail)} where `drive' is either
a mount point or the empty string.  On systems which do not use drive
specifications, `drive' will always be the empty string.  In all cases, @code{drive
+ tail} will be the same as `path'.

On Windows, splits a pathname into drive/UNC sharepoint and relative path.

If the path contains a drive letter, drive will contain everything
up to and including the colon:

@example
>>> splitdrive("c:/dir")
("c:", "/dir")
@end example

If the path contains a UNC path, drive will contain the host name
and share:

@example
>>> splitdrive("//host/computer/dir")
("//host/computer", "/dir")
@end example


Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.

@end deffn

@geindex splitroot() (in module os.path)
@anchor{library/os path os path splitroot}@anchor{6cc}
@deffn {Function} os.path.splitroot (path, /)

Split the pathname `path' into a 3-item tuple @code{(drive, root, tail)} where
`drive' is a device name or mount point, `root' is a string of separators
after the drive, and `tail' is everything after the root. Any of these
items may be the empty string. In all cases, @code{drive + root + tail} will
be the same as `path'.

On POSIX systems, `drive' is always empty. The `root' may be empty (if `path' is
relative), a single forward slash (if `path' is absolute), or two forward slashes
(implementation-defined per IEEE Std 1003.1-2017; 4.13 Pathname Resolution@footnote{https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_13}.)
For example:

@example
>>> splitroot('/home/sam')
('@w{'}, '/', 'home/sam')
>>> splitroot('//home/sam')
('@w{'}, '//', 'home/sam')
>>> splitroot('///home/sam')
('@w{'}, '/', '//home/sam')
@end example

On Windows, `drive' may be empty, a drive-letter name, a UNC share, or a device
name. The `root' may be empty, a forward slash, or a backward slash. For
example:

@example
>>> splitroot('C:/Users/Sam')
('C:', '/', 'Users/Sam')
>>> splitroot('//Server/Share/Users/Sam')
('//Server/Share', '/', 'Users/Sam')
@end example


Added in version 3.12.

@end deffn

@geindex splitext() (in module os.path)
@anchor{library/os path os path splitext}@anchor{199d}
@deffn {Function} os.path.splitext (path, /)

Split the pathname `path' into a pair @code{(root, ext)}  such that @code{root + ext ==
path}, and the extension, `ext', is empty or begins with a period and contains at
most one period.

If the path contains no extension, `ext' will be @code{'@w{'}}:

@example
>>> splitext('bar')
('bar', '@w{'})
@end example

If the path contains an extension, then `ext' will be set to this extension,
including the leading period. Note that previous periods will be ignored:

@example
>>> splitext('foo.bar.exe')
('foo.bar', '.exe')
>>> splitext('/foo/bar.exe')
('/foo/bar', '.exe')
@end example

Leading periods of the last component of the path are considered to
be part of the root:

@example
>>> splitext('.cshrc')
('.cshrc', '@w{'})
>>> splitext('/foo/....jpg')
('/foo/....jpg', '@w{'})
@end example


Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.

@end deffn

@geindex supports_unicode_filenames (in module os.path)
@anchor{library/os path os path supports_unicode_filenames}@anchor{169a}
@deffn {Data} os.path.supports_unicode_filenames

@code{True} if arbitrary Unicode strings can be used as file names (within limitations
imposed by the file system).
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node stat — Interpreting stat results,filecmp — File and Directory Comparisons,os path — Common pathname manipulations,File and Directory Access
@anchor{library/stat doc}@anchor{2cca}@anchor{library/stat module-stat}@anchor{d6}@anchor{library/stat stat-interpreting-stat-results}@anchor{2ccb}@anchor{library/stat translation-repo}@anchor{2ccc}
@subsection @code{stat} — Interpreting @code{stat()} results


@geindex module; stat

`Source code:' Lib/stat.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/stat.py}


__________________________________________________________________


The @code{stat} module defines constants and functions for interpreting the
results of @ref{26f,,os.stat()}, @ref{f92,,os.fstat()} and @ref{6c9,,os.lstat()} (if they
exist).  For complete details about the @code{stat()}, @code{fstat()} and
@code{lstat()} calls, consult the documentation for your system.


Changed in version 3.4: The stat module is backed by a C implementation.


The @code{stat} module defines the following functions to test for specific file
types:

@geindex S_ISDIR() (in module stat)
@anchor{library/stat stat S_ISDIR}@anchor{2ccd}
@deffn {Function} stat.S_ISDIR (mode)

Return non-zero if the mode is from a directory.
@end deffn

@geindex S_ISCHR() (in module stat)
@anchor{library/stat stat S_ISCHR}@anchor{2cce}
@deffn {Function} stat.S_ISCHR (mode)

Return non-zero if the mode is from a character special device file.
@end deffn

@geindex S_ISBLK() (in module stat)
@anchor{library/stat stat S_ISBLK}@anchor{2ccf}
@deffn {Function} stat.S_ISBLK (mode)

Return non-zero if the mode is from a block special device file.
@end deffn

@geindex S_ISREG() (in module stat)
@anchor{library/stat stat S_ISREG}@anchor{2cd0}
@deffn {Function} stat.S_ISREG (mode)

Return non-zero if the mode is from a regular file.
@end deffn

@geindex S_ISFIFO() (in module stat)
@anchor{library/stat stat S_ISFIFO}@anchor{2cd1}
@deffn {Function} stat.S_ISFIFO (mode)

Return non-zero if the mode is from a FIFO (named pipe).
@end deffn

@geindex S_ISLNK() (in module stat)
@anchor{library/stat stat S_ISLNK}@anchor{2cd2}
@deffn {Function} stat.S_ISLNK (mode)

Return non-zero if the mode is from a symbolic link.
@end deffn

@geindex S_ISSOCK() (in module stat)
@anchor{library/stat stat S_ISSOCK}@anchor{2cd3}
@deffn {Function} stat.S_ISSOCK (mode)

Return non-zero if the mode is from a socket.
@end deffn

@geindex S_ISDOOR() (in module stat)
@anchor{library/stat stat S_ISDOOR}@anchor{1dee}
@deffn {Function} stat.S_ISDOOR (mode)

Return non-zero if the mode is from a door.


Added in version 3.4.

@end deffn

@geindex S_ISPORT() (in module stat)
@anchor{library/stat stat S_ISPORT}@anchor{1def}
@deffn {Function} stat.S_ISPORT (mode)

Return non-zero if the mode is from an event port.


Added in version 3.4.

@end deffn

@geindex S_ISWHT() (in module stat)
@anchor{library/stat stat S_ISWHT}@anchor{1df0}
@deffn {Function} stat.S_ISWHT (mode)

Return non-zero if the mode is from a whiteout.


Added in version 3.4.

@end deffn

Two additional functions are defined for more general manipulation of the file’s
mode:

@geindex S_IMODE() (in module stat)
@anchor{library/stat stat S_IMODE}@anchor{2cd4}
@deffn {Function} stat.S_IMODE (mode)

Return the portion of the file’s mode that can be set by
@ref{52a,,os.chmod()}—that is, the file’s permission bits, plus the sticky
bit, set-group-id, and set-user-id bits (on systems that support them).
@end deffn

@geindex S_IFMT() (in module stat)
@anchor{library/stat stat S_IFMT}@anchor{2cd5}
@deffn {Function} stat.S_IFMT (mode)

Return the portion of the file’s mode that describes the file type (used by the
@code{S_IS*()} functions above).
@end deffn

Normally, you would use the @code{os.path.is*()} functions for testing the type
of a file; the functions here are useful when you are doing multiple tests of
the same file and wish to avoid the overhead of the @code{stat()} system call
for each test.  These are also useful when checking for information about a file
that isn’t handled by @ref{a6,,os.path}, like the tests for block and character
devices.

Example:

@example
import os, sys
from stat import *

def walktree(top, callback):
    '@w{'}'recursively descend the directory tree rooted at top,
       calling the callback function for each regular file'@w{'}'

    for f in os.listdir(top):
        pathname = os.path.join(top, f)
        mode = os.lstat(pathname).st_mode
        if S_ISDIR(mode):
            # It's a directory, recurse into it
            walktree(pathname, callback)
        elif S_ISREG(mode):
            # It's a file, call the callback function
            callback(pathname)
        else:
            # Unknown file type, print a message
            print('Skipping %s' % pathname)

def visitfile(file):
    print('visiting', file)

if __name__ == '__main__':
    walktree(sys.argv[1], visitfile)
@end example

An additional utility function is provided to convert a file’s mode in a human
readable string:

@geindex filemode() (in module stat)
@anchor{library/stat stat filemode}@anchor{1357}
@deffn {Function} stat.filemode (mode)

Convert a file’s mode to a string of the form ‘-rwxrwxrwx’.


Added in version 3.3.



Changed in version 3.4: The function supports @ref{11c1,,S_IFDOOR}, @ref{11c2,,S_IFPORT} and
@ref{11c3,,S_IFWHT}.

@end deffn

All the variables below are simply symbolic indexes into the 10-tuple returned
by @ref{26f,,os.stat()}, @ref{f92,,os.fstat()} or @ref{6c9,,os.lstat()}.

@geindex ST_MODE (in module stat)
@anchor{library/stat stat ST_MODE}@anchor{11c0}
@deffn {Data} stat.ST_MODE

Inode protection mode.
@end deffn

@geindex ST_INO (in module stat)
@anchor{library/stat stat ST_INO}@anchor{2cd6}
@deffn {Data} stat.ST_INO

Inode number.
@end deffn

@geindex ST_DEV (in module stat)
@anchor{library/stat stat ST_DEV}@anchor{2cd7}
@deffn {Data} stat.ST_DEV

Device inode resides on.
@end deffn

@geindex ST_NLINK (in module stat)
@anchor{library/stat stat ST_NLINK}@anchor{2cd8}
@deffn {Data} stat.ST_NLINK

Number of links to the inode.
@end deffn

@geindex ST_UID (in module stat)
@anchor{library/stat stat ST_UID}@anchor{2cd9}
@deffn {Data} stat.ST_UID

User id of the owner.
@end deffn

@geindex ST_GID (in module stat)
@anchor{library/stat stat ST_GID}@anchor{2cda}
@deffn {Data} stat.ST_GID

Group id of the owner.
@end deffn

@geindex ST_SIZE (in module stat)
@anchor{library/stat stat ST_SIZE}@anchor{2cdb}
@deffn {Data} stat.ST_SIZE

Size in bytes of a plain file; amount of data waiting on some special files.
@end deffn

@geindex ST_ATIME (in module stat)
@anchor{library/stat stat ST_ATIME}@anchor{2cdc}
@deffn {Data} stat.ST_ATIME

Time of last access.
@end deffn

@geindex ST_MTIME (in module stat)
@anchor{library/stat stat ST_MTIME}@anchor{2cdd}
@deffn {Data} stat.ST_MTIME

Time of last modification.
@end deffn

@geindex ST_CTIME (in module stat)
@anchor{library/stat stat ST_CTIME}@anchor{2cde}
@deffn {Data} stat.ST_CTIME

The “ctime” as reported by the operating system.  On some systems (like Unix) is
the time of the last metadata change, and, on others (like Windows), is the
creation time (see platform documentation for details).
@end deffn

The interpretation of “file size” changes according to the file type.  For plain
files this is the size of the file in bytes.  For FIFOs and sockets under most
flavors of Unix (including Linux in particular), the “size” is the number of
bytes waiting to be read at the time of the call to @ref{26f,,os.stat()},
@ref{f92,,os.fstat()}, or @ref{6c9,,os.lstat()}; this can sometimes be useful, especially
for polling one of these special files after a non-blocking open.  The meaning
of the size field for other character and block devices varies more, depending
on the implementation of the underlying system call.

The variables below define the flags used in the @ref{11c0,,ST_MODE} field.

Use of the functions above is more portable than use of the first set of flags:

@geindex S_IFSOCK (in module stat)
@anchor{library/stat stat S_IFSOCK}@anchor{2cdf}
@deffn {Data} stat.S_IFSOCK

Socket.
@end deffn

@geindex S_IFLNK (in module stat)
@anchor{library/stat stat S_IFLNK}@anchor{2ce0}
@deffn {Data} stat.S_IFLNK

Symbolic link.
@end deffn

@geindex S_IFREG (in module stat)
@anchor{library/stat stat S_IFREG}@anchor{2ce1}
@deffn {Data} stat.S_IFREG

Regular file.
@end deffn

@geindex S_IFBLK (in module stat)
@anchor{library/stat stat S_IFBLK}@anchor{2ce2}
@deffn {Data} stat.S_IFBLK

Block device.
@end deffn

@geindex S_IFDIR (in module stat)
@anchor{library/stat stat S_IFDIR}@anchor{2ce3}
@deffn {Data} stat.S_IFDIR

Directory.
@end deffn

@geindex S_IFCHR (in module stat)
@anchor{library/stat stat S_IFCHR}@anchor{2ce4}
@deffn {Data} stat.S_IFCHR

Character device.
@end deffn

@geindex S_IFIFO (in module stat)
@anchor{library/stat stat S_IFIFO}@anchor{2ce5}
@deffn {Data} stat.S_IFIFO

FIFO.
@end deffn

@geindex S_IFDOOR (in module stat)
@anchor{library/stat stat S_IFDOOR}@anchor{11c1}
@deffn {Data} stat.S_IFDOOR

Door.


Added in version 3.4.

@end deffn

@geindex S_IFPORT (in module stat)
@anchor{library/stat stat S_IFPORT}@anchor{11c2}
@deffn {Data} stat.S_IFPORT

Event port.


Added in version 3.4.

@end deffn

@geindex S_IFWHT (in module stat)
@anchor{library/stat stat S_IFWHT}@anchor{11c3}
@deffn {Data} stat.S_IFWHT

Whiteout.


Added in version 3.4.

@end deffn

@cartouche
@quotation Note 
@ref{11c1,,S_IFDOOR}, @ref{11c2,,S_IFPORT} or @ref{11c3,,S_IFWHT} are defined as
0 when the platform does not have support for the file types.
@end quotation
@end cartouche

The following flags can also be used in the `mode' argument of @ref{52a,,os.chmod()}:

@geindex S_ISUID (in module stat)
@anchor{library/stat stat S_ISUID}@anchor{2ce6}
@deffn {Data} stat.S_ISUID

Set UID bit.
@end deffn

@geindex S_ISGID (in module stat)
@anchor{library/stat stat S_ISGID}@anchor{2ce7}
@deffn {Data} stat.S_ISGID

Set-group-ID bit.  This bit has several special uses.  For a directory
it indicates that BSD semantics is to be used for that directory:
files created there inherit their group ID from the directory, not
from the effective group ID of the creating process, and directories
created there will also get the @code{S_ISGID} bit set.  For a
file that does not have the group execution bit (@ref{2ce8,,S_IXGRP})
set, the set-group-ID bit indicates mandatory file/record locking
(see also @ref{2ce9,,S_ENFMT}).
@end deffn

@geindex S_ISVTX (in module stat)
@anchor{library/stat stat S_ISVTX}@anchor{2cea}
@deffn {Data} stat.S_ISVTX

Sticky bit.  When this bit is set on a directory it means that a file
in that directory can be renamed or deleted only by the owner of the
file, by the owner of the directory, or by a privileged process.
@end deffn

@geindex S_IRWXU (in module stat)
@anchor{library/stat stat S_IRWXU}@anchor{2ceb}
@deffn {Data} stat.S_IRWXU

Mask for file owner permissions.
@end deffn

@geindex S_IRUSR (in module stat)
@anchor{library/stat stat S_IRUSR}@anchor{2cec}
@deffn {Data} stat.S_IRUSR

Owner has read permission.
@end deffn

@geindex S_IWUSR (in module stat)
@anchor{library/stat stat S_IWUSR}@anchor{2ced}
@deffn {Data} stat.S_IWUSR

Owner has write permission.
@end deffn

@geindex S_IXUSR (in module stat)
@anchor{library/stat stat S_IXUSR}@anchor{2cee}
@deffn {Data} stat.S_IXUSR

Owner has execute permission.
@end deffn

@geindex S_IRWXG (in module stat)
@anchor{library/stat stat S_IRWXG}@anchor{2cef}
@deffn {Data} stat.S_IRWXG

Mask for group permissions.
@end deffn

@geindex S_IRGRP (in module stat)
@anchor{library/stat stat S_IRGRP}@anchor{2cf0}
@deffn {Data} stat.S_IRGRP

Group has read permission.
@end deffn

@geindex S_IWGRP (in module stat)
@anchor{library/stat stat S_IWGRP}@anchor{2cf1}
@deffn {Data} stat.S_IWGRP

Group has write permission.
@end deffn

@geindex S_IXGRP (in module stat)
@anchor{library/stat stat S_IXGRP}@anchor{2ce8}
@deffn {Data} stat.S_IXGRP

Group has execute permission.
@end deffn

@geindex S_IRWXO (in module stat)
@anchor{library/stat stat S_IRWXO}@anchor{2cf2}
@deffn {Data} stat.S_IRWXO

Mask for permissions for others (not in group).
@end deffn

@geindex S_IROTH (in module stat)
@anchor{library/stat stat S_IROTH}@anchor{2cf3}
@deffn {Data} stat.S_IROTH

Others have read permission.
@end deffn

@geindex S_IWOTH (in module stat)
@anchor{library/stat stat S_IWOTH}@anchor{2cf4}
@deffn {Data} stat.S_IWOTH

Others have write permission.
@end deffn

@geindex S_IXOTH (in module stat)
@anchor{library/stat stat S_IXOTH}@anchor{2cf5}
@deffn {Data} stat.S_IXOTH

Others have execute permission.
@end deffn

@geindex S_ENFMT (in module stat)
@anchor{library/stat stat S_ENFMT}@anchor{2ce9}
@deffn {Data} stat.S_ENFMT

System V file locking enforcement.  This flag is shared with @ref{2ce7,,S_ISGID}:
file/record locking is enforced on files that do not have the group
execution bit (@ref{2ce8,,S_IXGRP}) set.
@end deffn

@geindex S_IREAD (in module stat)
@anchor{library/stat stat S_IREAD}@anchor{2cf6}
@deffn {Data} stat.S_IREAD

Unix V7 synonym for @ref{2cec,,S_IRUSR}.
@end deffn

@geindex S_IWRITE (in module stat)
@anchor{library/stat stat S_IWRITE}@anchor{2cf7}
@deffn {Data} stat.S_IWRITE

Unix V7 synonym for @ref{2ced,,S_IWUSR}.
@end deffn

@geindex S_IEXEC (in module stat)
@anchor{library/stat stat S_IEXEC}@anchor{2cf8}
@deffn {Data} stat.S_IEXEC

Unix V7 synonym for @ref{2cee,,S_IXUSR}.
@end deffn

The following flags can be used in the `flags' argument of @ref{12f9,,os.chflags()}:

@geindex UF_SETTABLE (in module stat)
@anchor{library/stat stat UF_SETTABLE}@anchor{2cf9}
@deffn {Data} stat.UF_SETTABLE

All user settable flags.


Added in version 3.13.

@end deffn

@geindex UF_NODUMP (in module stat)
@anchor{library/stat stat UF_NODUMP}@anchor{2cfa}
@deffn {Data} stat.UF_NODUMP

Do not dump the file.
@end deffn

@geindex UF_IMMUTABLE (in module stat)
@anchor{library/stat stat UF_IMMUTABLE}@anchor{2cfb}
@deffn {Data} stat.UF_IMMUTABLE

The file may not be changed.
@end deffn

@geindex UF_APPEND (in module stat)
@anchor{library/stat stat UF_APPEND}@anchor{2cfc}
@deffn {Data} stat.UF_APPEND

The file may only be appended to.
@end deffn

@geindex UF_OPAQUE (in module stat)
@anchor{library/stat stat UF_OPAQUE}@anchor{2cfd}
@deffn {Data} stat.UF_OPAQUE

The directory is opaque when viewed through a union stack.
@end deffn

@geindex UF_NOUNLINK (in module stat)
@anchor{library/stat stat UF_NOUNLINK}@anchor{2cfe}
@deffn {Data} stat.UF_NOUNLINK

The file may not be renamed or deleted.
@end deffn

@geindex UF_COMPRESSED (in module stat)
@anchor{library/stat stat UF_COMPRESSED}@anchor{2cff}
@deffn {Data} stat.UF_COMPRESSED

The file is stored compressed (macOS 10.6+).
@end deffn

@geindex UF_TRACKED (in module stat)
@anchor{library/stat stat UF_TRACKED}@anchor{2d00}
@deffn {Data} stat.UF_TRACKED

Used for handling document IDs (macOS)


Added in version 3.13.

@end deffn

@geindex UF_DATAVAULT (in module stat)
@anchor{library/stat stat UF_DATAVAULT}@anchor{2d01}
@deffn {Data} stat.UF_DATAVAULT

The file needs an entitlement for reading or writing (macOS 10.13+)


Added in version 3.13.

@end deffn

@geindex UF_HIDDEN (in module stat)
@anchor{library/stat stat UF_HIDDEN}@anchor{2d02}
@deffn {Data} stat.UF_HIDDEN

The file should not be displayed in a GUI (macOS 10.5+).
@end deffn

@geindex SF_SETTABLE (in module stat)
@anchor{library/stat stat SF_SETTABLE}@anchor{2d03}
@deffn {Data} stat.SF_SETTABLE

All super-user changeable flags


Added in version 3.13.

@end deffn

@geindex SF_SUPPORTED (in module stat)
@anchor{library/stat stat SF_SUPPORTED}@anchor{2d04}
@deffn {Data} stat.SF_SUPPORTED

All super-user supported flags

@ref{2181,,Availability}: macOS


Added in version 3.13.

@end deffn

@geindex SF_SYNTHETIC (in module stat)
@anchor{library/stat stat SF_SYNTHETIC}@anchor{2d05}
@deffn {Data} stat.SF_SYNTHETIC

All super-user read-only synthetic flags

@ref{2181,,Availability}: macOS


Added in version 3.13.

@end deffn

@geindex SF_ARCHIVED (in module stat)
@anchor{library/stat stat SF_ARCHIVED}@anchor{2d06}
@deffn {Data} stat.SF_ARCHIVED

The file may be archived.
@end deffn

@geindex SF_IMMUTABLE (in module stat)
@anchor{library/stat stat SF_IMMUTABLE}@anchor{2d07}
@deffn {Data} stat.SF_IMMUTABLE

The file may not be changed.
@end deffn

@geindex SF_APPEND (in module stat)
@anchor{library/stat stat SF_APPEND}@anchor{2d08}
@deffn {Data} stat.SF_APPEND

The file may only be appended to.
@end deffn

@geindex SF_RESTRICTED (in module stat)
@anchor{library/stat stat SF_RESTRICTED}@anchor{2d09}
@deffn {Data} stat.SF_RESTRICTED

The file needs an entitlement to write to (macOS 10.13+)


Added in version 3.13.

@end deffn

@geindex SF_NOUNLINK (in module stat)
@anchor{library/stat stat SF_NOUNLINK}@anchor{2d0a}
@deffn {Data} stat.SF_NOUNLINK

The file may not be renamed or deleted.
@end deffn

@geindex SF_SNAPSHOT (in module stat)
@anchor{library/stat stat SF_SNAPSHOT}@anchor{2d0b}
@deffn {Data} stat.SF_SNAPSHOT

The file is a snapshot file.
@end deffn

@geindex SF_FIRMLINK (in module stat)
@anchor{library/stat stat SF_FIRMLINK}@anchor{2d0c}
@deffn {Data} stat.SF_FIRMLINK

The file is a firmlink (macOS 10.15+)


Added in version 3.13.

@end deffn

@geindex SF_DATALESS (in module stat)
@anchor{library/stat stat SF_DATALESS}@anchor{2d0d}
@deffn {Data} stat.SF_DATALESS

The file is a dataless object (macOS 10.15+)


Added in version 3.13.

@end deffn

See the *BSD or macOS systems man page @code{chflags(2)@footnote{https://manpages.debian.org/chflags(2)}} for more information.

On Windows, the following file attribute constants are available for use when
testing bits in the @code{st_file_attributes} member returned by @ref{26f,,os.stat()}.
See the Windows API documentation@footnote{https://msdn.microsoft.com/en-us/library/windows/desktop/gg258117.aspx}
for more detail on the meaning of these constants.

@geindex FILE_ATTRIBUTE_ARCHIVE (in module stat)
@geindex FILE_ATTRIBUTE_COMPRESSED (in module stat)
@geindex FILE_ATTRIBUTE_DEVICE (in module stat)
@geindex FILE_ATTRIBUTE_DIRECTORY (in module stat)
@geindex FILE_ATTRIBUTE_ENCRYPTED (in module stat)
@geindex FILE_ATTRIBUTE_HIDDEN (in module stat)
@geindex FILE_ATTRIBUTE_INTEGRITY_STREAM (in module stat)
@geindex FILE_ATTRIBUTE_NORMAL (in module stat)
@geindex FILE_ATTRIBUTE_NOT_CONTENT_INDEXED (in module stat)
@geindex FILE_ATTRIBUTE_NO_SCRUB_DATA (in module stat)
@geindex FILE_ATTRIBUTE_OFFLINE (in module stat)
@geindex FILE_ATTRIBUTE_READONLY (in module stat)
@geindex FILE_ATTRIBUTE_REPARSE_POINT (in module stat)
@geindex FILE_ATTRIBUTE_SPARSE_FILE (in module stat)
@geindex FILE_ATTRIBUTE_SYSTEM (in module stat)
@geindex FILE_ATTRIBUTE_TEMPORARY (in module stat)
@geindex FILE_ATTRIBUTE_VIRTUAL (in module stat)
@anchor{library/stat stat FILE_ATTRIBUTE_ARCHIVE}@anchor{2d0e}
@deffn {Data} stat.FILE_ATTRIBUTE_ARCHIVE
@anchor{library/stat stat FILE_ATTRIBUTE_COMPRESSED}@anchor{2d0f}
@deffnx {Data} stat.FILE_ATTRIBUTE_COMPRESSED
@anchor{library/stat stat FILE_ATTRIBUTE_DEVICE}@anchor{2d10}
@deffnx {Data} stat.FILE_ATTRIBUTE_DEVICE
@anchor{library/stat stat FILE_ATTRIBUTE_DIRECTORY}@anchor{2d11}
@deffnx {Data} stat.FILE_ATTRIBUTE_DIRECTORY
@anchor{library/stat stat FILE_ATTRIBUTE_ENCRYPTED}@anchor{2d12}
@deffnx {Data} stat.FILE_ATTRIBUTE_ENCRYPTED
@anchor{library/stat stat FILE_ATTRIBUTE_HIDDEN}@anchor{2d13}
@deffnx {Data} stat.FILE_ATTRIBUTE_HIDDEN
@anchor{library/stat stat FILE_ATTRIBUTE_INTEGRITY_STREAM}@anchor{2d14}
@deffnx {Data} stat.FILE_ATTRIBUTE_INTEGRITY_STREAM
@anchor{library/stat stat FILE_ATTRIBUTE_NORMAL}@anchor{2d15}
@deffnx {Data} stat.FILE_ATTRIBUTE_NORMAL
@anchor{library/stat stat FILE_ATTRIBUTE_NOT_CONTENT_INDEXED}@anchor{2d16}
@deffnx {Data} stat.FILE_ATTRIBUTE_NOT_CONTENT_INDEXED
@anchor{library/stat stat FILE_ATTRIBUTE_NO_SCRUB_DATA}@anchor{2d17}
@deffnx {Data} stat.FILE_ATTRIBUTE_NO_SCRUB_DATA
@anchor{library/stat stat FILE_ATTRIBUTE_OFFLINE}@anchor{2d18}
@deffnx {Data} stat.FILE_ATTRIBUTE_OFFLINE
@anchor{library/stat stat FILE_ATTRIBUTE_READONLY}@anchor{2d19}
@deffnx {Data} stat.FILE_ATTRIBUTE_READONLY
@anchor{library/stat stat FILE_ATTRIBUTE_REPARSE_POINT}@anchor{2d1a}
@deffnx {Data} stat.FILE_ATTRIBUTE_REPARSE_POINT
@anchor{library/stat stat FILE_ATTRIBUTE_SPARSE_FILE}@anchor{2d1b}
@deffnx {Data} stat.FILE_ATTRIBUTE_SPARSE_FILE
@anchor{library/stat stat FILE_ATTRIBUTE_SYSTEM}@anchor{2d1c}
@deffnx {Data} stat.FILE_ATTRIBUTE_SYSTEM
@anchor{library/stat stat FILE_ATTRIBUTE_TEMPORARY}@anchor{2d1d}
@deffnx {Data} stat.FILE_ATTRIBUTE_TEMPORARY
@anchor{library/stat stat FILE_ATTRIBUTE_VIRTUAL}@anchor{2d1e}
@deffnx {Data} stat.FILE_ATTRIBUTE_VIRTUAL


Added in version 3.5.

@end deffn

On Windows, the following constants are available for comparing against the
@code{st_reparse_tag} member returned by @ref{6c9,,os.lstat()}. These are well-known
constants, but are not an exhaustive list.

@geindex IO_REPARSE_TAG_SYMLINK (in module stat)
@geindex IO_REPARSE_TAG_MOUNT_POINT (in module stat)
@geindex IO_REPARSE_TAG_APPEXECLINK (in module stat)
@anchor{library/stat stat IO_REPARSE_TAG_SYMLINK}@anchor{2d1f}
@deffn {Data} stat.IO_REPARSE_TAG_SYMLINK
@anchor{library/stat stat IO_REPARSE_TAG_MOUNT_POINT}@anchor{2d20}
@deffnx {Data} stat.IO_REPARSE_TAG_MOUNT_POINT
@anchor{library/stat stat IO_REPARSE_TAG_APPEXECLINK}@anchor{2d21}
@deffnx {Data} stat.IO_REPARSE_TAG_APPEXECLINK


Added in version 3.8.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node filecmp — File and Directory Comparisons,tempfile — Generate temporary files and directories,stat — Interpreting stat results,File and Directory Access
@anchor{library/filecmp doc}@anchor{2d22}@anchor{library/filecmp filecmp-file-and-directory-comparisons}@anchor{2d23}@anchor{library/filecmp module-filecmp}@anchor{5e}@anchor{library/filecmp translation-repo}@anchor{2d24}
@subsection @code{filecmp} — File and Directory Comparisons


@geindex module; filecmp

`Source code:' Lib/filecmp.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/filecmp.py}


__________________________________________________________________


The @code{filecmp} module defines functions to compare files and directories,
with various optional time/correctness trade-offs. For comparing files,
see also the @ref{3b,,difflib} module.

The @code{filecmp} module defines the following functions:

@geindex cmp() (in module filecmp)
@anchor{library/filecmp filecmp cmp}@anchor{1a21}
@deffn {Function} filecmp.cmp (f1, f2, shallow=True)

Compare the files named `f1' and `f2', returning @code{True} if they seem equal,
@code{False} otherwise.

If `shallow' is true and the @ref{26f,,os.stat()} signatures (file type, size, and
modification time) of both files are identical, the files are taken to be
equal.

Otherwise, the files are treated as different if their sizes or contents differ.

Note that no external programs are called from this function, giving it
portability and efficiency.

This function uses a cache for past comparisons and the results,
with cache entries invalidated if the @ref{26f,,os.stat()} information for the
file changes.  The entire cache may be cleared using @ref{1144,,clear_cache()}.
@end deffn

@geindex cmpfiles() (in module filecmp)
@anchor{library/filecmp filecmp cmpfiles}@anchor{1989}
@deffn {Function} filecmp.cmpfiles (dir1, dir2, common, shallow=True)

Compare the files in the two directories `dir1' and `dir2' whose names are
given by `common'.

Returns three lists of file names: `match', `mismatch',
`errors'.  `match' contains the list of files that match, `mismatch' contains
the names of those that don’t, and `errors' lists the names of files which
could not be compared.  Files are listed in `errors' if they don’t exist in
one of the directories, the user lacks permission to read them or if the
comparison could not be done for some other reason.

The `shallow' parameter has the same meaning and default value as for
@ref{1a21,,filecmp.cmp()}.

For example, @code{cmpfiles('a', 'b', ['c', 'd/e'])} will compare @code{a/c} with
@code{b/c} and @code{a/d/e} with @code{b/d/e}.  @code{'c'} and @code{'d/e'} will each be in
one of the three returned lists.
@end deffn

@geindex clear_cache() (in module filecmp)
@anchor{library/filecmp filecmp clear_cache}@anchor{1144}
@deffn {Function} filecmp.clear_cache ()

Clear the filecmp cache. This may be useful if a file is compared so quickly
after it is modified that it is within the mtime resolution of
the underlying filesystem.


Added in version 3.4.

@end deffn

@menu
* The dircmp class:: 

@end menu

@node The dircmp class,,,filecmp — File and Directory Comparisons
@anchor{library/filecmp dircmp-objects}@anchor{2d25}@anchor{library/filecmp the-dircmp-class}@anchor{2d26}
@subsubsection The @code{dircmp} class


@geindex dircmp (class in filecmp)
@anchor{library/filecmp filecmp dircmp}@anchor{1146}
@deffn {Class} filecmp.dircmp (a, b, ignore=None, hide=None, *, shallow=True)

Construct a new directory comparison object, to compare the directories `a'
and `b'.  `ignore' is a list of names to ignore, and defaults to
@ref{1145,,filecmp.DEFAULT_IGNORES}.  `hide' is a list of names to hide, and
defaults to @code{[os.curdir, os.pardir]}.

The @code{dircmp} class compares files by doing `shallow' comparisons
as described for @ref{1a21,,filecmp.cmp()} by default using the `shallow'
parameter.


Changed in version 3.13: Added the `shallow' parameter.


The @code{dircmp} class provides the following methods:

@geindex report() (filecmp.dircmp method)
@anchor{library/filecmp filecmp dircmp report}@anchor{2d27}
@deffn {Method} report ()

Print (to @ref{cd3,,sys.stdout}) a comparison between `a' and `b'.
@end deffn

@geindex report_partial_closure() (filecmp.dircmp method)
@anchor{library/filecmp filecmp dircmp report_partial_closure}@anchor{2d28}
@deffn {Method} report_partial_closure ()

Print a comparison between `a' and `b' and common immediate
subdirectories.
@end deffn

@geindex report_full_closure() (filecmp.dircmp method)
@anchor{library/filecmp filecmp dircmp report_full_closure}@anchor{2d29}
@deffn {Method} report_full_closure ()

Print a comparison between `a' and `b' and common subdirectories
(recursively).
@end deffn

The @code{dircmp} class offers a number of interesting attributes that may be
used to get various bits of information about the directory trees being
compared.

Note that via @ref{6fb,,__getattr__()} hooks, all attributes are computed lazily,
so there is no speed penalty if only those attributes which are lightweight
to compute are used.

@geindex left (filecmp.dircmp attribute)
@anchor{library/filecmp filecmp dircmp left}@anchor{2d2a}
@deffn {Attribute} left

The directory `a'.
@end deffn

@geindex right (filecmp.dircmp attribute)
@anchor{library/filecmp filecmp dircmp right}@anchor{2d2b}
@deffn {Attribute} right

The directory `b'.
@end deffn

@geindex left_list (filecmp.dircmp attribute)
@anchor{library/filecmp filecmp dircmp left_list}@anchor{2d2c}
@deffn {Attribute} left_list

Files and subdirectories in `a', filtered by `hide' and `ignore'.
@end deffn

@geindex right_list (filecmp.dircmp attribute)
@anchor{library/filecmp filecmp dircmp right_list}@anchor{2d2d}
@deffn {Attribute} right_list

Files and subdirectories in `b', filtered by `hide' and `ignore'.
@end deffn

@geindex common (filecmp.dircmp attribute)
@anchor{library/filecmp filecmp dircmp common}@anchor{2d2e}
@deffn {Attribute} common

Files and subdirectories in both `a' and `b'.
@end deffn

@geindex left_only (filecmp.dircmp attribute)
@anchor{library/filecmp filecmp dircmp left_only}@anchor{2d2f}
@deffn {Attribute} left_only

Files and subdirectories only in `a'.
@end deffn

@geindex right_only (filecmp.dircmp attribute)
@anchor{library/filecmp filecmp dircmp right_only}@anchor{2d30}
@deffn {Attribute} right_only

Files and subdirectories only in `b'.
@end deffn

@geindex common_dirs (filecmp.dircmp attribute)
@anchor{library/filecmp filecmp dircmp common_dirs}@anchor{2d31}
@deffn {Attribute} common_dirs

Subdirectories in both `a' and `b'.
@end deffn

@geindex common_files (filecmp.dircmp attribute)
@anchor{library/filecmp filecmp dircmp common_files}@anchor{2d32}
@deffn {Attribute} common_files

Files in both `a' and `b'.
@end deffn

@geindex common_funny (filecmp.dircmp attribute)
@anchor{library/filecmp filecmp dircmp common_funny}@anchor{2d33}
@deffn {Attribute} common_funny

Names in both `a' and `b', such that the type differs between the
directories, or names for which @ref{26f,,os.stat()} reports an error.
@end deffn

@geindex same_files (filecmp.dircmp attribute)
@anchor{library/filecmp filecmp dircmp same_files}@anchor{2d34}
@deffn {Attribute} same_files

Files which are identical in both `a' and `b', using the class’s
file comparison operator.
@end deffn

@geindex diff_files (filecmp.dircmp attribute)
@anchor{library/filecmp filecmp dircmp diff_files}@anchor{2d35}
@deffn {Attribute} diff_files

Files which are in both `a' and `b', whose contents differ according
to the class’s file comparison operator.
@end deffn

@geindex funny_files (filecmp.dircmp attribute)
@anchor{library/filecmp filecmp dircmp funny_files}@anchor{2d36}
@deffn {Attribute} funny_files

Files which are in both `a' and `b', but could not be compared.
@end deffn

@geindex subdirs (filecmp.dircmp attribute)
@anchor{library/filecmp filecmp dircmp subdirs}@anchor{1d29}
@deffn {Attribute} subdirs

A dictionary mapping names in @ref{2d31,,common_dirs} to @code{dircmp}
instances (or MyDirCmp instances if this instance is of type MyDirCmp, a
subclass of @code{dircmp}).


Changed in version 3.10: Previously entries were always @code{dircmp} instances. Now entries
are the same type as `self', if `self' is a subclass of
@code{dircmp}.

@end deffn
@end deffn

@geindex DEFAULT_IGNORES (in module filecmp)
@anchor{library/filecmp filecmp DEFAULT_IGNORES}@anchor{1145}
@deffn {Data} filecmp.DEFAULT_IGNORES


Added in version 3.4.


List of directories ignored by @ref{1146,,dircmp} by default.
@end deffn

Here is a simplified example of using the @code{subdirs} attribute to search
recursively through two directories to show common different files:

@example
>>> from filecmp import dircmp
>>> def print_diff_files(dcmp):
...     for name in dcmp.diff_files:
...         print("diff_file %s found in %s and %s" % (name, dcmp.left,
...               dcmp.right))
...     for sub_dcmp in dcmp.subdirs.values():
...         print_diff_files(sub_dcmp)
...
>>> dcmp = dircmp('dir1', 'dir2')
>>> print_diff_files(dcmp)
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node tempfile — Generate temporary files and directories,glob — Unix style pathname pattern expansion,filecmp — File and Directory Comparisons,File and Directory Access
@anchor{library/tempfile doc}@anchor{2d37}@anchor{library/tempfile module-tempfile}@anchor{e6}@anchor{library/tempfile tempfile-generate-temporary-files-and-directories}@anchor{2d38}@anchor{library/tempfile translation-repo}@anchor{2d39}
@subsection @code{tempfile} — Generate temporary files and directories


@geindex module; tempfile

`Source code:' Lib/tempfile.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/tempfile.py}

@geindex temporary; file name
@geindex temporary; file


__________________________________________________________________


This module creates temporary files and directories.  It works on all
supported platforms. @ref{2d3a,,TemporaryFile}, @ref{6ee,,NamedTemporaryFile},
@ref{1440,,TemporaryDirectory}, and @ref{8a4,,SpooledTemporaryFile} are high-level
interfaces which provide automatic cleanup and can be used as
@ref{1e3,,context managers}. @ref{2d3b,,mkstemp()} and
@ref{52e,,mkdtemp()} are lower-level functions which require manual cleanup.

All the user-callable functions and constructors take additional arguments which
allow direct control over the location and name of temporary files and
directories. Files names used by this module include a string of
random characters which allows those files to be securely created in
shared temporary directories.
To maintain backward compatibility, the argument order is somewhat odd; it
is recommended to use keyword arguments for clarity.

The module defines the following user-callable items:

@geindex TemporaryFile() (in module tempfile)
@anchor{library/tempfile tempfile TemporaryFile}@anchor{2d3a}
@deffn {Function} tempfile.TemporaryFile (mode='w+b', buffering=-1, encoding=None, newline=None, suffix=None, prefix=None, dir=None, *, errors=None)

Return a @ref{17fd,,file-like object} that can be used as a temporary storage area.
The file is created securely, using the same rules as @ref{2d3b,,mkstemp()}. It will be destroyed as soon
as it is closed (including an implicit close when the object is garbage
collected).  Under Unix, the directory entry for the file is either not created at all or is removed
immediately after the file is created.  Other platforms do not support
this; your code should not rely on a temporary file created using this
function having or not having a visible name in the file system.

The resulting object can be used as a @ref{1e3,,context manager} (see
@ref{2d3c,,Examples}).  On completion of the context or
destruction of the file object the temporary file will be removed
from the filesystem.

The `mode' parameter defaults to @code{'w+b'} so that the file created can
be read and written without being closed.  Binary mode is used so that it
behaves consistently on all platforms without regard for the data that is
stored.  `buffering', `encoding', `errors' and `newline' are interpreted as for
@ref{318,,open()}.

The `dir', `prefix' and `suffix' parameters have the same meaning and
defaults as with @ref{2d3b,,mkstemp()}.

The returned object is a true file object on POSIX platforms.  On other
platforms, it is a file-like object whose @code{file} attribute is the
underlying true file object.

The @ref{1179,,os.O_TMPFILE} flag is used if it is available and works
(Linux-specific, requires Linux kernel 3.11 or later).

On platforms that are neither Posix nor Cygwin, TemporaryFile is an alias
for NamedTemporaryFile.

Raises an @ref{1cb1,,auditing event} @code{tempfile.mkstemp} with argument @code{fullpath}.


Changed in version 3.5: The @ref{1179,,os.O_TMPFILE} flag is now used if available.



Changed in version 3.8: Added `errors' parameter.

@end deffn

@geindex NamedTemporaryFile() (in module tempfile)
@anchor{library/tempfile tempfile NamedTemporaryFile}@anchor{6ee}
@deffn {Function} tempfile.NamedTemporaryFile (mode='w+b', buffering=-1, encoding=None, newline=None, suffix=None, prefix=None, dir=None, delete=True, *, errors=None, delete_on_close=True)

This function operates exactly as @ref{2d3a,,TemporaryFile()} does, except the
following differences:


@itemize *

@item 
This function returns a file that is guaranteed to have a visible name in
the file system.

@item 
To manage the named file, it extends the parameters of
@ref{2d3a,,TemporaryFile()} with `delete' and `delete_on_close' parameters that
determine whether and how the named file should be automatically deleted.
@end itemize

The returned object is always a @ref{17fd,,file-like object} whose @code{file}
attribute is the underlying true file object. This file-like object
can be used in a @ref{187,,with} statement, just like a normal file.  The
name of the temporary file can be retrieved from the @code{name} attribute
of the returned file-like object. On Unix, unlike with the
@ref{2d3a,,TemporaryFile()}, the directory entry does not get unlinked immediately
after the file creation.

If `delete' is true (the default) and `delete_on_close' is true (the
default), the file is deleted as soon as it is closed. If `delete' is true
and `delete_on_close' is false, the file is deleted on context manager exit
only, or else when the @ref{17fd,,file-like object} is finalized. Deletion is not
always guaranteed in this case (see @ref{1203,,object.__del__()}). If `delete' is
false, the value of `delete_on_close' is ignored.

Therefore to use the name of the temporary file to reopen the file after
closing it, either make sure not to delete the file upon closure (set the
`delete' parameter to be false) or, in case the temporary file is created in
a @ref{187,,with} statement, set the `delete_on_close' parameter to be false.
The latter approach is recommended as it provides assistance in automatic
cleaning of the temporary file upon the context manager exit.

Opening the temporary file again by its name while it is still open works as
follows:


@itemize *

@item 
On POSIX the file can always be opened again.

@item 
On Windows, make sure that at least one of the following conditions are
fulfilled:


@itemize *

@item 
`delete' is false

@item 
additional open shares delete access (e.g. by calling @ref{f98,,os.open()}
with the flag @code{O_TEMPORARY})

@item 
`delete' is true but `delete_on_close' is false. Note, that in this
case the additional opens that do not share delete access (e.g.
created via builtin @ref{318,,open()}) must be closed before exiting the
context manager, else the @ref{1301,,os.unlink()} call on context manager
exit will fail with a @ref{f44,,PermissionError}.
@end itemize
@end itemize

On Windows, if `delete_on_close' is false, and the file is created in a
directory for which the user lacks delete access, then the @ref{1301,,os.unlink()}
call on exit of the context manager will fail with a @ref{f44,,PermissionError}.
This cannot happen when `delete_on_close' is true because delete access is
requested by the open, which fails immediately if the requested access is not
granted.

On POSIX (only), a process that is terminated abruptly with SIGKILL
cannot automatically delete any NamedTemporaryFiles it created.

Raises an @ref{1cb1,,auditing event} @code{tempfile.mkstemp} with argument @code{fullpath}.


Changed in version 3.8: Added `errors' parameter.



Changed in version 3.12: Added `delete_on_close' parameter.

@end deffn

@geindex SpooledTemporaryFile (class in tempfile)
@anchor{library/tempfile tempfile SpooledTemporaryFile}@anchor{8a4}
@deffn {Class} tempfile.SpooledTemporaryFile (max_size=0, mode='w+b', buffering=-1, encoding=None, newline=None, suffix=None, prefix=None, dir=None, *, errors=None)

This class operates exactly as @ref{2d3a,,TemporaryFile()} does, except that
data is spooled in memory until the file size exceeds `max_size', or
until the file’s @ref{17fe,,fileno()} method is called, at which point the
contents are written to disk and operation proceeds as with
@code{TemporaryFile()}.

@geindex rollover() (tempfile.SpooledTemporaryFile method)
@anchor{library/tempfile tempfile SpooledTemporaryFile rollover}@anchor{2d3d}
@deffn {Method} rollover ()

The resulting file has one additional method, @code{rollover()}, which
causes the file to roll over to an on-disk file regardless of its size.
@end deffn

The returned object is a file-like object whose @code{_file} attribute
is either an @ref{10aa,,io.BytesIO} or @ref{9c4,,io.TextIOWrapper} object
(depending on whether binary or text `mode' was specified) or a true file
object, depending on whether @ref{2d3d,,rollover()} has been called.  This
file-like object can be used in a @ref{187,,with} statement, just like
a normal file.


Changed in version 3.3: the truncate method now accepts a `size' argument.



Changed in version 3.8: Added `errors' parameter.



Changed in version 3.11: Fully implements the @ref{8a5,,io.BufferedIOBase} and
@ref{8a6,,io.TextIOBase} abstract base classes (depending on whether binary
or text `mode' was specified).

@end deffn

@geindex TemporaryDirectory (class in tempfile)
@anchor{library/tempfile tempfile TemporaryDirectory}@anchor{1440}
@deffn {Class} tempfile.TemporaryDirectory (suffix=None, prefix=None, dir=None, ignore_cleanup_errors=False, *, delete=True)

This class securely creates a temporary directory using the same rules as @ref{52e,,mkdtemp()}.
The resulting object can be used as a @ref{1e3,,context manager} (see
@ref{2d3c,,Examples}).  On completion of the context or destruction
of the temporary directory object, the newly created temporary directory
and all its contents are removed from the filesystem.

@geindex name (tempfile.TemporaryDirectory attribute)
@anchor{library/tempfile tempfile TemporaryDirectory name}@anchor{2d3e}
@deffn {Attribute} name

The directory name can be retrieved from the @code{name} attribute of the
returned object.  When the returned object is used as a @ref{1e3,,context manager}, the
@code{name} will be assigned to the target of the @code{as} clause in
the @ref{187,,with} statement, if there is one.
@end deffn

@geindex cleanup() (tempfile.TemporaryDirectory method)
@anchor{library/tempfile tempfile TemporaryDirectory cleanup}@anchor{2d3f}
@deffn {Method} cleanup ()

The directory can be explicitly cleaned up by calling the
@code{cleanup()} method. If `ignore_cleanup_errors' is true, any unhandled
exceptions during explicit or implicit cleanup (such as a
@ref{f44,,PermissionError} removing open files on Windows) will be ignored,
and the remaining removable items deleted on a “best-effort” basis.
Otherwise, errors will be raised in whatever context cleanup occurs
(the @code{cleanup()} call, exiting the context manager, when the object
is garbage-collected or during interpreter shutdown).
@end deffn

The `delete' parameter can be used to disable cleanup of the directory tree
upon exiting the context.  While it may seem unusual for a context manager
to disable the action taken when exiting the context, it can be useful during
debugging or when you need your cleanup behavior to be conditional based on
other logic.

Raises an @ref{1cb1,,auditing event} @code{tempfile.mkdtemp} with argument @code{fullpath}.


Added in version 3.2.



Changed in version 3.10: Added `ignore_cleanup_errors' parameter.



Changed in version 3.12: Added the `delete' parameter.

@end deffn

@geindex mkstemp() (in module tempfile)
@anchor{library/tempfile tempfile mkstemp}@anchor{2d3b}
@deffn {Function} tempfile.mkstemp (suffix=None, prefix=None, dir=None, text=False)

Creates a temporary file in the most secure manner possible.  There are
no race conditions in the file’s creation, assuming that the platform
properly implements the @ref{2d40,,os.O_EXCL} flag for @ref{f98,,os.open()}.  The
file is readable and writable only by the creating user ID.  If the
platform uses permission bits to indicate whether a file is executable,
the file is executable by no one.

The file descriptor is @ref{1102,,not inherited by child processes}.

Unlike @ref{2d3a,,TemporaryFile()}, the user of @code{mkstemp()} is responsible
for deleting the temporary file when done with it.

If `suffix' is not @code{None}, the file name will end with that suffix,
otherwise there will be no suffix.  @code{mkstemp()} does not put a dot
between the file name and the suffix; if you need one, put it at the
beginning of `suffix'.

If `prefix' is not @code{None}, the file name will begin with that prefix;
otherwise, a default prefix is used.  The default is the return value of
@ref{2d41,,gettempprefix()} or @ref{2d42,,gettempprefixb()}, as appropriate.

If `dir' is not @code{None}, the file will be created in that directory;
otherwise, a default directory is used.  The default directory is chosen
from a platform-dependent list, but the user of the application can
control the directory location by setting the `TMPDIR', `TEMP' or `TMP'
environment variables.  There is thus no guarantee that the generated
filename will have any nice properties, such as not requiring quoting
when passed to external commands via @code{os.popen()}.

If any of `suffix', `prefix', and `dir' are not
@code{None}, they must be the same type.
If they are bytes, the returned name will be bytes instead of str.
If you want to force a bytes return value with otherwise default behavior,
pass @code{suffix=b'@w{'}}.

If `text' is specified and true, the file is opened in text mode.
Otherwise, (the default) the file is opened in binary mode.

@code{mkstemp()} returns a tuple containing an OS-level handle to an open
file (as would be returned by @ref{f98,,os.open()}) and the absolute pathname
of that file, in that order.

Raises an @ref{1cb1,,auditing event} @code{tempfile.mkstemp} with argument @code{fullpath}.


Changed in version 3.5: `suffix', `prefix', and `dir' may now be supplied in bytes in order to
obtain a bytes return value.  Prior to this, only str was allowed.
`suffix' and `prefix' now accept and default to @code{None} to cause
an appropriate default value to be used.



Changed in version 3.6: The `dir' parameter now accepts a @ref{5a1,,path-like object}.

@end deffn

@geindex mkdtemp() (in module tempfile)
@anchor{library/tempfile tempfile mkdtemp}@anchor{52e}
@deffn {Function} tempfile.mkdtemp (suffix=None, prefix=None, dir=None)

Creates a temporary directory in the most secure manner possible. There
are no race conditions in the directory’s creation.  The directory is
readable, writable, and searchable only by the creating user ID.

The user of @code{mkdtemp()} is responsible for deleting the temporary
directory and its contents when done with it.

The `prefix', `suffix', and `dir' arguments are the same as for
@ref{2d3b,,mkstemp()}.

@code{mkdtemp()} returns the absolute pathname of the new directory.

Raises an @ref{1cb1,,auditing event} @code{tempfile.mkdtemp} with argument @code{fullpath}.


Changed in version 3.5: `suffix', `prefix', and `dir' may now be supplied in bytes in order to
obtain a bytes return value.  Prior to this, only str was allowed.
`suffix' and `prefix' now accept and default to @code{None} to cause
an appropriate default value to be used.



Changed in version 3.6: The `dir' parameter now accepts a @ref{5a1,,path-like object}.



Changed in version 3.12: @code{mkdtemp()} now always returns an absolute path, even if `dir' is relative.

@end deffn

@geindex gettempdir() (in module tempfile)
@anchor{library/tempfile tempfile gettempdir}@anchor{1cd4}
@deffn {Function} tempfile.gettempdir ()

Return the name of the directory used for temporary files. This
defines the default value for the `dir' argument to all functions
in this module.

Python searches a standard list of directories to find one which
the calling user can create files in.  The list is:


@enumerate 

@item 
The directory named by the 
@geindex TMPDIR
@geindex environment variable; TMPDIR
@code{TMPDIR} environment variable.

@item 
The directory named by the 
@geindex TEMP
@geindex environment variable; TEMP
@code{TEMP} environment variable.

@item 
The directory named by the 
@geindex TMP
@geindex environment variable; TMP
@code{TMP} environment variable.

@item 
A platform-specific location:


@itemize *

@item 
On Windows, the directories @code{C:\TEMP}, @code{C:\TMP},
@code{\TEMP}, and @code{\TMP}, in that order.

@item 
On all other platforms, the directories @code{/tmp}, @code{/var/tmp}, and
@code{/usr/tmp}, in that order.
@end itemize

@item 
As a last resort, the current working directory.
@end enumerate

The result of this search is cached, see the description of
@ref{1cd3,,tempdir} below.


Changed in version 3.10: Always returns a str.  Previously it would return any @ref{1cd3,,tempdir}
value regardless of type so long as it was not @code{None}.

@end deffn

@geindex gettempdirb() (in module tempfile)
@anchor{library/tempfile tempfile gettempdirb}@anchor{1cd5}
@deffn {Function} tempfile.gettempdirb ()

Same as @ref{1cd4,,gettempdir()} but the return value is in bytes.


Added in version 3.5.

@end deffn

@geindex gettempprefix() (in module tempfile)
@anchor{library/tempfile tempfile gettempprefix}@anchor{2d41}
@deffn {Function} tempfile.gettempprefix ()

Return the filename prefix used to create temporary files.  This does not
contain the directory component.
@end deffn

@geindex gettempprefixb() (in module tempfile)
@anchor{library/tempfile tempfile gettempprefixb}@anchor{2d42}
@deffn {Function} tempfile.gettempprefixb ()

Same as @ref{2d41,,gettempprefix()} but the return value is in bytes.


Added in version 3.5.

@end deffn

The module uses a global variable to store the name of the directory
used for temporary files returned by @ref{1cd4,,gettempdir()}.  It can be
set directly to override the selection process, but this is discouraged.
All functions in this module take a `dir' argument which can be used
to specify the directory. This is the recommended approach that does
not surprise other unsuspecting code by changing global API behavior.

@geindex tempdir (in module tempfile)
@anchor{library/tempfile tempfile tempdir}@anchor{1cd3}
@deffn {Data} tempfile.tempdir

When set to a value other than @code{None}, this variable defines the
default value for the `dir' argument to the functions defined in this
module, including its type, bytes or str.  It cannot be a
@ref{5a1,,path-like object}.

If @code{tempdir} is @code{None} (the default) at any call to any of the above
functions except @ref{2d41,,gettempprefix()} it is initialized following the
algorithm described in @ref{1cd4,,gettempdir()}.

@cartouche
@quotation Note 
Beware that if you set @code{tempdir} to a bytes value, there is a
nasty side effect: The global default return type of
@ref{2d3b,,mkstemp()} and @ref{52e,,mkdtemp()} changes to bytes when no
explicit @code{prefix}, @code{suffix}, or @code{dir} arguments of type
str are supplied. Please do not write code expecting or
depending on this. This awkward behavior is maintained for
compatibility with the historical implementation.
@end quotation
@end cartouche
@end deffn

@menu
* Examples: Examples<5>. 
* Deprecated functions and variables:: 

@end menu

@node Examples<5>,Deprecated functions and variables,,tempfile — Generate temporary files and directories
@anchor{library/tempfile examples}@anchor{2d43}@anchor{library/tempfile tempfile-examples}@anchor{2d3c}
@subsubsection Examples


Here are some examples of typical usage of the @code{tempfile} module:

@example
>>> import tempfile

# create a temporary file and write some data to it
>>> fp = tempfile.TemporaryFile()
>>> fp.write(b'Hello world!')
# read data from file
>>> fp.seek(0)
>>> fp.read()
b'Hello world!'
# close the file, it will be removed
>>> fp.close()

# create a temporary file using a context manager
>>> with tempfile.TemporaryFile() as fp:
...     fp.write(b'Hello world!')
...     fp.seek(0)
...     fp.read()
b'Hello world!'
>>>
# file is now closed and removed

# create a temporary file using a context manager
# close the file, use the name to open the file again
>>> with tempfile.NamedTemporaryFile(delete_on_close=False) as fp:
...     fp.write(b'Hello world!')
...     fp.close()
... # the file is closed, but not removed
... # open the file again by using its name
...     with open(fp.name, mode='rb') as f:
...         f.read()
b'Hello world!'
>>>
# file is now removed

# create a temporary directory using the context manager
>>> with tempfile.TemporaryDirectory() as tmpdirname:
...     print('created temporary directory', tmpdirname)
>>>
# directory and contents have been removed
@end example

@node Deprecated functions and variables,,Examples<5>,tempfile — Generate temporary files and directories
@anchor{library/tempfile deprecated-functions-and-variables}@anchor{2d44}@anchor{library/tempfile tempfile-mktemp-deprecated}@anchor{2d45}
@subsubsection Deprecated functions and variables


A historical way to create temporary files was to first generate a
file name with the @ref{1c73,,mktemp()} function and then create a file
using this name. Unfortunately this is not secure, because a different
process may create a file with this name in the time between the call
to @code{mktemp()} and the subsequent attempt to create the file by the
first process. The solution is to combine the two steps and create the
file immediately. This approach is used by @ref{2d3b,,mkstemp()} and the
other functions described above.

@geindex mktemp() (in module tempfile)
@anchor{library/tempfile tempfile mktemp}@anchor{1c73}
@deffn {Function} tempfile.mktemp (suffix='@w{'}, prefix='tmp', dir=None)


Deprecated since version 2.3: Use @ref{2d3b,,mkstemp()} instead.


Return an absolute pathname of a file that did not exist at the time the
call is made.  The `prefix', `suffix', and `dir' arguments are similar
to those of @ref{2d3b,,mkstemp()}, except that bytes file names, @code{suffix=None}
and @code{prefix=None} are not supported.

@cartouche
@quotation Warning 
Use of this function may introduce a security hole in your program.  By
the time you get around to doing anything with the file name it returns,
someone else may have beaten you to the punch.  @code{mktemp()} usage can
be replaced easily with @ref{6ee,,NamedTemporaryFile()}, passing it the
@code{delete=False} parameter:

@example
>>> f = NamedTemporaryFile(delete=False)
>>> f.name
'/tmp/tmptjujjt'
>>> f.write(b"Hello World!\n")
13
>>> f.close()
>>> os.unlink(f.name)
>>> os.path.exists(f.name)
False
@end example
@end quotation
@end cartouche
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node glob — Unix style pathname pattern expansion,fnmatch — Unix filename pattern matching,tempfile — Generate temporary files and directories,File and Directory Access
@anchor{library/glob doc}@anchor{2d46}@anchor{library/glob glob-unix-style-pathname-pattern-expansion}@anchor{2d47}@anchor{library/glob module-glob}@anchor{68}@anchor{library/glob translation-repo}@anchor{2d48}
@subsection @code{glob} — Unix style pathname pattern expansion


@geindex module; glob

`Source code:' Lib/glob.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/glob.py}

@geindex filenames; pathname expansion


__________________________________________________________________


@geindex * (asterisk); in glob-style wildcards
@geindex ? (question mark); in glob-style wildcards
@geindex [] (square brackets); in glob-style wildcards
@geindex ! (exclamation); in glob-style wildcards
@geindex - (minus); in glob-style wildcards
@geindex . (dot); in glob-style wildcards

The @code{glob} module finds pathnames
using pattern matching rules similar to the Unix shell.
No tilde expansion is done, but @code{*}, @code{?}, and character
ranges expressed with @code{[]} will be correctly matched.  This is done by using
the @ref{c5a,,os.scandir()} and @ref{1c97,,fnmatch.fnmatch()} functions in concert, and
not by actually invoking a subshell.

@cartouche
@quotation Note 
The pathnames are returned in no particular order.  If you need a specific
order, sort the results.
@end quotation
@end cartouche

Files beginning with a dot (@code{.}) can only be matched by
patterns that also start with a dot,
unlike @ref{1c97,,fnmatch.fnmatch()} or @ref{538,,pathlib.Path.glob()}.
For tilde and shell variable expansion, use @ref{c0f,,os.path.expanduser()} and
@ref{15e5,,os.path.expandvars()}.

For a literal match, wrap the meta-characters in brackets.
For example, @code{'[?]'} matches the character @code{'?'}.

The @code{glob} module defines the following functions:

@geindex glob() (in module glob)
@anchor{library/glob glob glob}@anchor{5a0}
@deffn {Function} glob.glob (pathname, *, root_dir=None, dir_fd=None, recursive=False, include_hidden=False)

Return a possibly empty list of path names that match `pathname', which must be
a string containing a path specification. `pathname' can be either absolute
(like @code{/usr/src/Python-1.5/Makefile}) or relative (like
@code{../../Tools/*/*.gif}), and can contain shell-style wildcards. Broken
symlinks are included in the results (as in the shell). Whether or not the
results are sorted depends on the file system.  If a file that satisfies
conditions is removed or added during the call of this function, whether
a path name for that file will be included is unspecified.

If `root_dir' is not @code{None}, it should be a @ref{5a1,,path-like object}
specifying the root directory for searching.  It has the same effect on
@code{glob()} as changing the current directory before calling it.  If
`pathname' is relative, the result will contain paths relative to
`root_dir'.

This function can support @ref{12f6,,paths relative to directory descriptors} with the `dir_fd' parameter.

@geindex **; in glob-style wildcards

If `recursive' is true, the pattern “@code{**}” will match any files and zero or
more directories, subdirectories and symbolic links to directories. If the
pattern is followed by an @ref{87c,,os.sep} or @ref{87d,,os.altsep} then files will not
match.

If `include_hidden' is true, “@code{**}” pattern will match hidden directories.

Raises an @ref{1cb1,,auditing event} @code{glob.glob} with arguments @code{pathname}, @code{recursive}.

Raises an @ref{1cb1,,auditing event} @code{glob.glob/2} with arguments @code{pathname}, @code{recursive}, @code{root_dir}, @code{dir_fd}.

@cartouche
@quotation Note 
Using the “@code{**}” pattern in large directory trees may consume
an inordinate amount of time.
@end quotation
@end cartouche

@cartouche
@quotation Note 
This function may return duplicate path names if `pathname'
contains multiple “@code{**}” patterns and `recursive' is true.
@end quotation
@end cartouche

@cartouche
@quotation Note 
Any @ref{2c2,,OSError} exceptions raised from scanning the filesystem are
suppressed. This includes @ref{f44,,PermissionError} when accessing
directories without read permission.
@end quotation
@end cartouche


Changed in version 3.5: Support for recursive globs using “@code{**}”.



Changed in version 3.10: Added the `root_dir' and `dir_fd' parameters.



Changed in version 3.11: Added the `include_hidden' parameter.

@end deffn

@geindex iglob() (in module glob)
@anchor{library/glob glob iglob}@anchor{a0e}
@deffn {Function} glob.iglob (pathname, *, root_dir=None, dir_fd=None, recursive=False, include_hidden=False)

Return an @ref{4c9,,iterator} which yields the same values as @ref{68,,glob()}
without actually storing them all simultaneously.

Raises an @ref{1cb1,,auditing event} @code{glob.glob} with arguments @code{pathname}, @code{recursive}.

Raises an @ref{1cb1,,auditing event} @code{glob.glob/2} with arguments @code{pathname}, @code{recursive}, @code{root_dir}, @code{dir_fd}.

@cartouche
@quotation Note 
This function may return duplicate path names if `pathname'
contains multiple “@code{**}” patterns and `recursive' is true.
@end quotation
@end cartouche

@cartouche
@quotation Note 
Any @ref{2c2,,OSError} exceptions raised from scanning the filesystem are
suppressed. This includes @ref{f44,,PermissionError} when accessing
directories without read permission.
@end quotation
@end cartouche


Changed in version 3.5: Support for recursive globs using “@code{**}”.



Changed in version 3.10: Added the `root_dir' and `dir_fd' parameters.



Changed in version 3.11: Added the `include_hidden' parameter.

@end deffn

@geindex escape() (in module glob)
@anchor{library/glob glob escape}@anchor{114b}
@deffn {Function} glob.escape (pathname)

Escape all special characters (@code{'?'}, @code{'*'} and @code{'['}).
This is useful if you want to match an arbitrary literal string that may
have special characters in it.  Special characters in drive/UNC
sharepoints are not escaped, e.g. on Windows
@code{escape('//?/c:/Quo vadis?.txt')} returns @code{'//?/c:/Quo vadis[?].txt'}.


Added in version 3.4.

@end deffn

@geindex translate() (in module glob)
@anchor{library/glob glob translate}@anchor{4fc}
@deffn {Function} glob.translate (pathname, *, recursive=False, include_hidden=False, seps=None)

Convert the given path specification to a regular expression for use with
@ref{1439,,re.match()}. The path specification can contain shell-style wildcards.

For example:

@example
>>> import glob, re
>>>
>>> regex = glob.translate('**/*.txt', recursive=True, include_hidden=True)
>>> regex
'(?s:(?:.+/)?[^/]*\\.txt)\\z'
>>> reobj = re.compile(regex)
>>> reobj.match('foo/bar/baz.txt')
<re.Match object; span=(0, 15), match='foo/bar/baz.txt'>
@end example

Path separators and segments are meaningful to this function, unlike
@ref{1898,,fnmatch.translate()}. By default wildcards do not match path
separators, and @code{*} pattern segments match precisely one path segment.

If `recursive' is true, the pattern segment “@code{**}” will match any number
of path segments.

If `include_hidden' is true, wildcards can match path segments that start
with a dot (@code{.}).

A sequence of path separators may be supplied to the `seps' argument. If
not given, @ref{87c,,os.sep} and @ref{87d,,altsep} (if available) are used.


@subsubheading See also


@ref{536,,pathlib.PurePath.full_match()} and @ref{538,,pathlib.Path.glob()}
methods, which call this function to implement pattern matching and
globbing.



Added in version 3.13.

@end deffn

@menu
* Examples: Examples<6>. 

@end menu

@node Examples<6>,,,glob — Unix style pathname pattern expansion
@anchor{library/glob examples}@anchor{2d49}
@subsubsection Examples


Consider a directory containing the following files:
@code{1.gif}, @code{2.txt}, @code{card.gif} and a subdirectory @code{sub}
which contains only the file @code{3.txt}.  @ref{68,,glob()} will produce
the following results.  Notice how any leading components of the path are
preserved.

@example
>>> import glob
>>> glob.glob('./[0-9].*')
['./1.gif', './2.txt']
>>> glob.glob('*.gif')
['1.gif', 'card.gif']
>>> glob.glob('?.gif')
['1.gif']
>>> glob.glob('**/*.txt', recursive=True)
['2.txt', 'sub/3.txt']
>>> glob.glob('./**/', recursive=True)
['./', './sub/']
@end example

If the directory contains files starting with @code{.} they won’t be matched by
default. For example, consider a directory containing @code{card.gif} and
@code{.card.gif}:

@example
>>> import glob
>>> glob.glob('*.gif')
['card.gif']
>>> glob.glob('.c*')
['.card.gif']
@end example


@subsubheading See also


The @ref{60,,fnmatch} module offers shell-style filename (not path) expansion.



@subsubheading See also


The @ref{a8,,pathlib} module offers high-level path objects.


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node fnmatch — Unix filename pattern matching,linecache — Random access to text lines,glob — Unix style pathname pattern expansion,File and Directory Access
@anchor{library/fnmatch doc}@anchor{2d4a}@anchor{library/fnmatch fnmatch-unix-filename-pattern-matching}@anchor{2d4b}@anchor{library/fnmatch module-fnmatch}@anchor{60}@anchor{library/fnmatch translation-repo}@anchor{2d4c}
@subsection @code{fnmatch} — Unix filename pattern matching


@geindex module; fnmatch

`Source code:' Lib/fnmatch.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/fnmatch.py}

@geindex filenames; wildcard expansion

@geindex module; re


__________________________________________________________________


This module provides support for Unix shell-style wildcards, which are `not' the
same as regular expressions (which are documented in the @ref{be,,re} module).  The
special characters used in shell-style wildcards are:

@geindex * (asterisk); in glob-style wildcards
@geindex ? (question mark); in glob-style wildcards
@geindex [] (square brackets); in glob-style wildcards
@geindex ! (exclamation); in glob-style wildcards
@geindex - (minus); in glob-style wildcards


@multitable {xxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Pattern

@tab

Meaning

@item

@code{*}

@tab

matches everything

@item

@code{?}

@tab

matches any single character

@item

@code{[seq]}

@tab

matches any character in `seq'

@item

@code{[!seq]}

@tab

matches any character not in `seq'

@end multitable


For a literal match, wrap the meta-characters in brackets.
For example, @code{'[?]'} matches the character @code{'?'}.

@geindex module; glob

Note that the filename separator (@code{'/'} on Unix) is `not' special to this
module.  See module @ref{68,,glob} for pathname expansion (@code{glob} uses
@ref{1c99,,filter()} to match pathname segments).  Similarly, filenames starting with
a period are not special for this module, and are matched by the @code{*} and @code{?}
patterns.

Unless stated otherwise, “filename string” and “pattern string” either refer to
@ref{16a,,str} or @code{ISO-8859-1} encoded @ref{193,,bytes} objects. Note that the
functions documented below do not allow to mix a @code{bytes} pattern with
a @code{str} filename, and vice-versa.

Finally, note that @ref{be8,,functools.lru_cache()} with a `maxsize' of 32768
is used to cache the (typed) compiled regex patterns in the following
functions: @ref{60,,fnmatch()}, @ref{1c98,,fnmatchcase()}, @ref{1c99,,filter()}, @ref{213,,filterfalse()}.

@geindex fnmatch() (in module fnmatch)
@anchor{library/fnmatch fnmatch fnmatch}@anchor{1c97}
@deffn {Function} fnmatch.fnmatch (name, pat)

Test whether the filename string `name' matches the pattern string `pat',
returning @code{True} or @code{False}.  Both parameters are case-normalized
using @ref{2cc7,,os.path.normcase()}. @ref{1c98,,fnmatchcase()} can be used to perform a
case-sensitive comparison, regardless of whether that’s standard for the
operating system.

This example will print all file names in the current directory with the
extension @code{.txt}:

@example
import fnmatch
import os

for file in os.listdir('.'):
    if fnmatch.fnmatch(file, '*.txt'):
        print(file)
@end example
@end deffn

@geindex fnmatchcase() (in module fnmatch)
@anchor{library/fnmatch fnmatch fnmatchcase}@anchor{1c98}
@deffn {Function} fnmatch.fnmatchcase (name, pat)

Test whether the filename string `name' matches the pattern string `pat',
returning @code{True} or @code{False};
the comparison is case-sensitive and does not apply @ref{2cc7,,os.path.normcase()}.
@end deffn

@geindex filter() (in module fnmatch)
@anchor{library/fnmatch fnmatch filter}@anchor{1c99}
@deffn {Function} fnmatch.filter (names, pat)

Construct a list from those elements of the @ref{1433,,iterable} of filename
strings `names' that match the pattern string `pat'.
It is the same as @code{[n for n in names if fnmatch(n, pat)]},
but implemented more efficiently.
@end deffn

@geindex filterfalse() (in module fnmatch)
@anchor{library/fnmatch fnmatch filterfalse}@anchor{213}
@deffn {Function} fnmatch.filterfalse (names, pat)

Construct a list from those elements of the @ref{1433,,iterable} of filename
strings `names' that do not match the pattern string `pat'.
It is the same as @code{[n for n in names if not fnmatch(n, pat)]},
but implemented more efficiently.


Added in version 3.14.

@end deffn

@geindex translate() (in module fnmatch)
@anchor{library/fnmatch fnmatch translate}@anchor{1898}
@deffn {Function} fnmatch.translate (pat)

Return the shell-style pattern `pat' converted to a regular expression for
using with @ref{1439,,re.match()}. The pattern is expected to be a @ref{16a,,str}.

Example:

@example
>>> import fnmatch, re
>>>
>>> regex = fnmatch.translate('*.txt')
>>> regex
'(?s:.*\\.txt)\\z'
>>> reobj = re.compile(regex)
>>> reobj.match('foobar.txt')
<re.Match object; span=(0, 10), match='foobar.txt'>
@end example
@end deffn


@subsubheading See also



@table @asis

@item Module @ref{68,,glob}

Unix shell-style path expansion.
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node linecache — Random access to text lines,shutil — High-level file operations,fnmatch — Unix filename pattern matching,File and Directory Access
@anchor{library/linecache doc}@anchor{2d4d}@anchor{library/linecache linecache-random-access-to-text-lines}@anchor{2d4e}@anchor{library/linecache module-linecache}@anchor{89}@anchor{library/linecache translation-repo}@anchor{2d4f}
@subsection @code{linecache} — Random access to text lines


@geindex module; linecache

`Source code:' Lib/linecache.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/linecache.py}


__________________________________________________________________


The @code{linecache} module allows one to get any line from a Python source file, while
attempting to optimize internally, using a cache, the common case where many
lines are read from a single file.  This is used by the @ref{105,,traceback} module
to retrieve source lines for inclusion in  the formatted traceback.

The @ref{2d50,,tokenize.open()} function is used to open files. This
function uses @ref{1808,,tokenize.detect_encoding()} to get the encoding of the
file; in the absence of an encoding token, the file encoding defaults to UTF-8.

The @code{linecache} module defines the following functions:

@geindex getline() (in module linecache)
@anchor{library/linecache linecache getline}@anchor{242}
@deffn {Function} linecache.getline (filename, lineno, module_globals=None)

Get line `lineno' from file named `filename'. This function will never raise an
exception — it will return @code{'@w{'}} on errors (the terminating newline character
will be included for lines that are found).

@geindex module; search; path

If `filename' indicates a frozen module (starting with @code{'<frozen '}), the function
will attempt to get the real file name from @code{module_globals['__file__']} if
`module_globals' is not @code{None}.

If a file named `filename' is not found, the function first checks
for a 
@geindex Python Enhancement Proposals; PEP 302
PEP 302@footnote{https://peps.python.org/pep-0302/} @code{__loader__} in `module_globals'.
If there is such a loader and it defines a @code{get_source} method,
then that determines the source lines
(if @code{get_source()} returns @code{None}, then @code{'@w{'}} is returned).
Finally, if `filename' is a relative filename,
it is looked up relative to the entries in the module search path, @code{sys.path}.


Changed in version 3.14: Support `filename' of frozen modules.

@end deffn

@geindex clearcache() (in module linecache)
@anchor{library/linecache linecache clearcache}@anchor{2d51}
@deffn {Function} linecache.clearcache ()

Clear the cache.  Use this function if you no longer need lines from files
previously read using @ref{242,,getline()}.
@end deffn

@geindex checkcache() (in module linecache)
@anchor{library/linecache linecache checkcache}@anchor{1931}
@deffn {Function} linecache.checkcache (filename=None)

Check the cache for validity.  Use this function if files in the cache  may have
changed on disk, and you require the updated version.  If `filename' is omitted,
it will check all the entries in the cache.
@end deffn

@geindex lazycache() (in module linecache)
@anchor{library/linecache linecache lazycache}@anchor{102a}
@deffn {Function} linecache.lazycache (filename, module_globals)

Capture enough detail about a non-file-based module to permit getting its
lines later via @ref{242,,getline()} even if `module_globals' is @code{None} in the later
call. This avoids doing I/O until a line is actually needed, without having
to carry the module globals around indefinitely.


Added in version 3.5.

@end deffn

Example:

@example
>>> import linecache
>>> linecache.getline(linecache.__file__, 8)
'import sys\n'
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node shutil — High-level file operations,,linecache — Random access to text lines,File and Directory Access
@anchor{library/shutil doc}@anchor{2d52}@anchor{library/shutil module-shutil}@anchor{ca}@anchor{library/shutil shutil-high-level-file-operations}@anchor{2d53}@anchor{library/shutil translation-repo}@anchor{2d54}
@subsection @code{shutil} — High-level file operations


@geindex module; shutil

@c partly based on the docstrings

`Source code:' Lib/shutil.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/shutil.py}

@geindex file; copying
@geindex copying files


__________________________________________________________________


The @code{shutil} module offers a number of high-level operations on files and
collections of files.  In particular, functions are provided  which support file
copying and removal. For operations on individual files, see also the
@ref{a5,,os} module.

@cartouche
@quotation Warning 
Even the higher-level file copying functions (@ref{c55,,shutil.copy()},
@ref{c56,,shutil.copy2()}) cannot copy all file metadata.

On POSIX platforms, this means that file owner and group are lost as well
as ACLs.  On Mac OS, the resource fork and other metadata are not used.
This means that resources will be lost and file type and creator codes will
not be correct. On Windows, file owners, ACLs and alternate data streams
are not copied.
@end quotation
@end cartouche

@menu
* Directory and files operations:: 
* Archiving operations:: 
* Querying the size of the output terminal:: 

@end menu

@node Directory and files operations,Archiving operations,,shutil — High-level file operations
@anchor{library/shutil directory-and-files-operations}@anchor{2d55}@anchor{library/shutil file-operations}@anchor{2d56}
@subsubsection Directory and files operations


@geindex copyfileobj() (in module shutil)
@anchor{library/shutil shutil copyfileobj}@anchor{c58}
@deffn {Function} shutil.copyfileobj (fsrc, fdst[, length])

Copy the contents of the @ref{13cf,,file-like object} `fsrc' to the file-like object `fdst'.
The integer `length', if given, is the buffer size. In particular, a negative
`length' value means to copy the data without looping over the source data in
chunks; by default the data is read in chunks to avoid uncontrolled memory
consumption. Note that if the current file position of the `fsrc' object is not
0, only the contents from the current file position to the end of the file will
be copied.

@code{copyfileobj()} will `not' guarantee that the destination stream has
been flushed on completion of the copy. If you want to read from the
destination at the completion of the copy operation (for example, reading
the contents of a temporary file that has been copied from a HTTP stream),
you must ensure that you have called @ref{2d57,,flush()} or
@ref{507,,close()} on the file-like object before attempting to read
the destination file.
@end deffn

@geindex copyfile() (in module shutil)
@anchor{library/shutil shutil copyfile}@anchor{c54}
@deffn {Function} shutil.copyfile (src, dst, *, follow_symlinks=True)

Copy the contents (no metadata) of the file named `src' to a file named
`dst' and return `dst' in the most efficient way possible.
`src' and `dst' are @ref{5a1,,path-like objects} or path names given as strings.

`dst' must be the complete target file name; look at @ref{c55,,copy()}
for a copy that accepts a target directory path.  If `src' and `dst'
specify the same file, @ref{11a4,,SameFileError} is raised.

The destination location must be writable; otherwise, an @ref{2c2,,OSError}
exception will be raised. If `dst' already exists, it will be replaced.
Special files such as character or block devices and pipes cannot be
copied with this function.

If `follow_symlinks' is false and `src' is a symbolic link,
a new symbolic link will be created instead of copying the
file `src' points to.

Raises an @ref{1cb1,,auditing event} @code{shutil.copyfile} with arguments @code{src}, @code{dst}.


Changed in version 3.3: @ref{1259,,IOError} used to be raised instead of @ref{2c2,,OSError}.
Added `follow_symlinks' argument.
Now returns `dst'.



Changed in version 3.4: Raise @ref{11a4,,SameFileError} instead of @ref{11a3,,Error}.  Since the former is
a subclass of the latter, this change is backward compatible.



Changed in version 3.8: Platform-specific fast-copy syscalls may be used internally in order to
copy the file more efficiently. See
@ref{c59,,Platform-dependent efficient copy operations} section.

@end deffn

@geindex SpecialFileError
@anchor{library/shutil shutil SpecialFileError}@anchor{1527}
@deffn {Exception} shutil.SpecialFileError

This exception is raised when @ref{c54,,copyfile()} or @ref{c24,,copytree()} attempt
to copy a named pipe.


Added in version 2.7.

@end deffn

@geindex SameFileError
@anchor{library/shutil shutil SameFileError}@anchor{11a4}
@deffn {Exception} shutil.SameFileError

This exception is raised if source and destination in @ref{c54,,copyfile()}
are the same file.


Added in version 3.4.

@end deffn

@geindex copymode() (in module shutil)
@anchor{library/shutil shutil copymode}@anchor{1a6b}
@deffn {Function} shutil.copymode (src, dst, *, follow_symlinks=True)

Copy the permission bits from `src' to `dst'.  The file contents, owner, and
group are unaffected.  `src' and `dst' are @ref{5a1,,path-like objects} or path names
given as strings.
If `follow_symlinks' is false, and both `src' and `dst' are symbolic links,
@code{copymode()} will attempt to modify the mode of `dst' itself (rather
than the file it points to).  This functionality is not available on every
platform; please see @ref{133a,,copystat()} for more information.  If
@code{copymode()} cannot modify symbolic links on the local platform, and it
is asked to do so, it will do nothing and return.

Raises an @ref{1cb1,,auditing event} @code{shutil.copymode} with arguments @code{src}, @code{dst}.


Changed in version 3.3: Added `follow_symlinks' argument.

@end deffn

@geindex copystat() (in module shutil)
@anchor{library/shutil shutil copystat}@anchor{133a}
@deffn {Function} shutil.copystat (src, dst, *, follow_symlinks=True)

Copy the permission bits, last access time, last modification time, and
flags from `src' to `dst'.  On Linux, @code{copystat()} also copies the
“extended attributes” where possible.  The file contents, owner, and
group are unaffected.  `src' and `dst' are @ref{5a1,,path-like objects} or path
names given as strings.

If `follow_symlinks' is false, and `src' and `dst' both
refer to symbolic links, @code{copystat()} will operate on
the symbolic links themselves rather than the files the
symbolic links refer to—reading the information from the
`src' symbolic link, and writing the information to the
`dst' symbolic link.

@cartouche
@quotation Note 
Not all platforms provide the ability to examine and
modify symbolic links.  Python itself can tell you what
functionality is locally available.


@itemize *

@item 
If @code{os.chmod in os.supports_follow_symlinks} is
@code{True}, @code{copystat()} can modify the permission
bits of a symbolic link.

@item 
If @code{os.utime in os.supports_follow_symlinks} is
@code{True}, @code{copystat()} can modify the last access
and modification times of a symbolic link.

@item 
If @code{os.chflags in os.supports_follow_symlinks} is
@code{True}, @code{copystat()} can modify the flags of
a symbolic link.  (@code{os.chflags} is not available on
all platforms.)
@end itemize

On platforms where some or all of this functionality
is unavailable, when asked to modify a symbolic link,
@code{copystat()} will copy everything it can.
@code{copystat()} never returns failure.

Please see @ref{1304,,os.supports_follow_symlinks}
for more information.
@end quotation
@end cartouche

Raises an @ref{1cb1,,auditing event} @code{shutil.copystat} with arguments @code{src}, @code{dst}.


Changed in version 3.3: Added `follow_symlinks' argument and support for Linux extended attributes.

@end deffn

@geindex copy() (in module shutil)
@anchor{library/shutil shutil copy}@anchor{c55}
@deffn {Function} shutil.copy (src, dst, *, follow_symlinks=True)

Copies the file `src' to the file or directory `dst'.  `src' and `dst'
should be @ref{5a1,,path-like objects} or strings.  If
`dst' specifies a directory, the file will be copied into `dst' using the
base filename from `src'. If `dst' specifies a file that already exists,
it will be replaced. Returns the path to the newly created file.

If `follow_symlinks' is false, and `src' is a symbolic link,
`dst' will be created as a symbolic link.  If `follow_symlinks'
is true and `src' is a symbolic link, `dst' will be a copy of
the file `src' refers to.

@code{copy()} copies the file data and the file’s permission
mode (see @ref{52a,,os.chmod()}).  Other metadata, like the
file’s creation and modification times, is not preserved.
To preserve all file metadata from the original, use
@ref{c56,,copy2()} instead.

Raises an @ref{1cb1,,auditing event} @code{shutil.copyfile} with arguments @code{src}, @code{dst}.

Raises an @ref{1cb1,,auditing event} @code{shutil.copymode} with arguments @code{src}, @code{dst}.


Changed in version 3.3: Added `follow_symlinks' argument.
Now returns path to the newly created file.



Changed in version 3.8: Platform-specific fast-copy syscalls may be used internally in order to
copy the file more efficiently. See
@ref{c59,,Platform-dependent efficient copy operations} section.

@end deffn

@geindex copy2() (in module shutil)
@anchor{library/shutil shutil copy2}@anchor{c56}
@deffn {Function} shutil.copy2 (src, dst, *, follow_symlinks=True)

Identical to @ref{c55,,copy()} except that @code{copy2()}
also attempts to preserve file metadata.

When `follow_symlinks' is false, and `src' is a symbolic
link, @code{copy2()} attempts to copy all metadata from the
`src' symbolic link to the newly created `dst' symbolic link.
However, this functionality is not available on all platforms.
On platforms where some or all of this functionality is
unavailable, @code{copy2()} will preserve all the metadata
it can; @code{copy2()} never raises an exception because it
cannot preserve file metadata.

@code{copy2()} uses @ref{133a,,copystat()} to copy the file metadata.
Please see @code{copystat()} for more information
about platform support for modifying symbolic link metadata.

Raises an @ref{1cb1,,auditing event} @code{shutil.copyfile} with arguments @code{src}, @code{dst}.

Raises an @ref{1cb1,,auditing event} @code{shutil.copystat} with arguments @code{src}, @code{dst}.


Changed in version 3.3: Added `follow_symlinks' argument, try to copy extended
file system attributes too (currently Linux only).
Now returns path to the newly created file.



Changed in version 3.8: Platform-specific fast-copy syscalls may be used internally in order to
copy the file more efficiently. See
@ref{c59,,Platform-dependent efficient copy operations} section.

@end deffn

@geindex ignore_patterns() (in module shutil)
@anchor{library/shutil shutil ignore_patterns}@anchor{2d58}
@deffn {Function} shutil.ignore_patterns (*patterns)

This factory function creates a function that can be used as a callable for
@ref{c24,,copytree()}'s `ignore' argument, ignoring files and directories that
match one of the glob-style `patterns' provided.  See the example below.
@end deffn

@geindex copytree() (in module shutil)
@anchor{library/shutil shutil copytree}@anchor{c24}
@deffn {Function} shutil.copytree (src, dst, symlinks=False, ignore=None, copy_function=copy2, ignore_dangling_symlinks=False, dirs_exist_ok=False)

Recursively copy an entire directory tree rooted at `src' to a directory
named `dst' and return the destination directory.  All intermediate
directories needed to contain `dst' will also be created by default.

Permissions and times of directories are copied with @ref{133a,,copystat()},
individual files are copied using @ref{c56,,copy2()}.

If `symlinks' is true, symbolic links in the source tree are represented as
symbolic links in the new tree and the metadata of the original links will
be copied as far as the platform allows; if false or omitted, the contents
and metadata of the linked files are copied to the new tree.

When `symlinks' is false, if the file pointed to by the symlink doesn’t
exist, an exception will be added in the list of errors raised in
an @ref{11a3,,Error} exception at the end of the copy process.
You can set the optional `ignore_dangling_symlinks' flag to true if you
want to silence this exception. Notice that this option has no effect
on platforms that don’t support @ref{1300,,os.symlink()}.

If `ignore' is given, it must be a callable that will receive as its
arguments the directory being visited by @code{copytree()}, and a list of its
contents, as returned by @ref{1306,,os.listdir()}.  Since @code{copytree()} is
called recursively, the `ignore' callable will be called once for each
directory that is copied.  The callable must return a sequence of directory
and file names relative to the current directory (i.e. a subset of the items
in its second argument); these names will then be ignored in the copy
process.  @ref{2d58,,ignore_patterns()} can be used to create such a callable that
ignores names based on glob-style patterns.

If exception(s) occur, an @ref{11a3,,Error} is raised with a list of reasons.

If `copy_function' is given, it must be a callable that will be used to copy
each file. It will be called with the source path and the destination path
as arguments. By default, @ref{c56,,copy2()} is used, but any function
that supports the same signature (like @ref{c55,,copy()}) can be used.

If `dirs_exist_ok' is false (the default) and `dst' already exists, a
@ref{1226,,FileExistsError} is raised. If `dirs_exist_ok' is true, the copying
operation will continue if it encounters existing directories, and files
within the `dst' tree will be overwritten by corresponding files from the
`src' tree.

Raises an @ref{1cb1,,auditing event} @code{shutil.copytree} with arguments @code{src}, @code{dst}.


Changed in version 3.2: Added the `copy_function' argument to be able to provide a custom copy
function.
Added the `ignore_dangling_symlinks' argument to silence dangling symlinks
errors when `symlinks' is false.



Changed in version 3.3: Copy metadata when `symlinks' is false.
Now returns `dst'.



Changed in version 3.8: Platform-specific fast-copy syscalls may be used internally in order to
copy the file more efficiently. See
@ref{c59,,Platform-dependent efficient copy operations} section.



Changed in version 3.8: Added the `dirs_exist_ok' parameter.

@end deffn

@geindex rmtree() (in module shutil)
@anchor{library/shutil shutil rmtree}@anchor{354}
@deffn {Function} shutil.rmtree (path, ignore_errors=False, onerror=None, *, onexc=None, dir_fd=None)

@geindex directory; deleting

Delete an entire directory tree; `path' must point to a directory (but not a
symbolic link to a directory).  If `ignore_errors' is true, errors resulting
from failed removals will be ignored; if false or omitted, such errors are
handled by calling a handler specified by `onexc' or `onerror' or, if both
are omitted, exceptions are propagated to the caller.

This function can support @ref{12f6,,paths relative to directory descriptors}.

@cartouche
@quotation Note 
On platforms that support the necessary fd-based functions a symlink
attack resistant version of @code{rmtree()} is used by default.  On other
platforms, the @code{rmtree()} implementation is susceptible to a symlink
attack: given proper timing and circumstances, attackers can manipulate
symlinks on the filesystem to delete files they wouldn’t be able to access
otherwise.  Applications can use the @ref{2d59,,rmtree.avoids_symlink_attacks}
function attribute to determine which case applies.
@end quotation
@end cartouche

If `onexc' is provided, it must be a callable that accepts three parameters:
`function', `path', and `excinfo'.

The first parameter, `function', is the function which raised the exception;
it depends on the platform and implementation.  The second parameter,
`path', will be the path name passed to `function'.  The third parameter,
`excinfo', is the exception that was raised. Exceptions raised by `onexc'
will not be caught.

The deprecated `onerror' is similar to `onexc', except that the third
parameter it receives is the tuple returned from @ref{89c,,sys.exc_info()}.


@subsubheading See also


@ref{2d5a,,rmtree example} for an example of handling the removal
of a directory tree that contains read-only files.


Raises an @ref{1cb1,,auditing event} @code{shutil.rmtree} with arguments @code{path}, @code{dir_fd}.


Changed in version 3.3: Added a symlink attack resistant version that is used automatically
if platform supports fd-based functions.



Changed in version 3.8: On Windows, will no longer delete the contents of a directory junction
before removing the junction.



Changed in version 3.11: Added the `dir_fd' parameter.



Changed in version 3.12: Added the `onexc' parameter, deprecated `onerror'.



Changed in version 3.13: @code{rmtree()} now ignores @ref{266,,FileNotFoundError} exceptions for all
but the top-level path.
Exceptions other than @ref{2c2,,OSError} and subclasses of @code{OSError}
are now always propagated to the caller.


@geindex avoids_symlink_attacks (shutil.rmtree attribute)
@anchor{library/shutil shutil rmtree avoids_symlink_attacks}@anchor{2d59}
@deffn {Attribute} rmtree.avoids_symlink_attacks

Indicates whether the current platform and implementation provides a
symlink attack resistant version of @code{rmtree()}.  Currently this is
only true for platforms supporting fd-based directory access functions.


Added in version 3.3.

@end deffn
@end deffn

@geindex move() (in module shutil)
@anchor{library/shutil shutil move}@anchor{c57}
@deffn {Function} shutil.move (src, dst, copy_function=copy2)

Recursively move a file or directory (`src') to another location and return
the destination.

If `dst' is an existing directory or a symlink to a directory, then `src'
is moved inside that directory. The destination path in that directory must
not already exist.

If `dst' already exists but is not a directory, it may be overwritten
depending on @ref{12fd,,os.rename()} semantics.

@ref{12fd,,os.rename()} is preferably used internally when `src' and the destination are on
the same filesystem. In case @code{os.rename()} fails due to @ref{2c2,,OSError}
(e.g. the user has write permission to the destination file but not to its parent
directory), this method falls back to using `copy_function', in which case
`src' is copied to the destination using `copy_function' and then removed.

In case of symlinks, a new symlink pointing to the target of `src' will be
created in or as the destination, and `src' will be removed.

If `copy_function' is given, it must be a callable that takes two arguments,
`src' and the destination, and will be used to copy `src' to the destination
if @ref{12fd,,os.rename()} cannot be used.  If the source is a directory,
@ref{c24,,copytree()} is called, passing it the `copy_function'. The
default `copy_function' is @ref{c56,,copy2()}.  Using @ref{c55,,copy()} as the
`copy_function' allows the move to succeed when it is not possible to also
copy the metadata, at the expense of not copying any of the metadata.

Raises an @ref{1cb1,,auditing event} @code{shutil.move} with arguments @code{src}, @code{dst}.


Changed in version 3.3: Added explicit symlink handling for foreign filesystems, thus adapting
it to the behavior of GNU’s @code{mv}.
Now returns `dst'.



Changed in version 3.5: Added the `copy_function' keyword argument.



Changed in version 3.8: Platform-specific fast-copy syscalls may be used internally in order to
copy the file more efficiently. See
@ref{c59,,Platform-dependent efficient copy operations} section.



Changed in version 3.9: Accepts a @ref{5a1,,path-like object} for both `src' and `dst'.

@end deffn

@geindex disk_usage() (in module shutil)
@anchor{library/shutil shutil disk_usage}@anchor{1339}
@deffn {Function} shutil.disk_usage (path)

Return disk usage statistics about the given path as a @ref{85f,,named tuple}
with the attributes `total', `used' and `free', which are the amount of
total, used and free space, in bytes. `path' may be a file or a
directory.

@cartouche
@quotation Note 
On Unix filesystems, `path' must point to a path within a `mounted'
filesystem partition. On those platforms, CPython doesn’t attempt to
retrieve disk usage information from non-mounted filesystems.
@end quotation
@end cartouche


Added in version 3.3.



Changed in version 3.8: On Windows, `path' can now be a file or directory.


@ref{2181,,Availability}: Unix, Windows.
@end deffn

@geindex chown() (in module shutil)
@anchor{library/shutil shutil chown}@anchor{549}
@deffn {Function} shutil.chown (path, user=None, group=None, *, dir_fd=None, follow_symlinks=True)

Change owner `user' and/or `group' of the given `path'.

`user' can be a system user name or a uid; the same applies to `group'. At
least one argument is required.

See also @ref{12fa,,os.chown()}, the underlying function.

Raises an @ref{1cb1,,auditing event} @code{shutil.chown} with arguments @code{path}, @code{user}, @code{group}.

@ref{2181,,Availability}: Unix.


Added in version 3.3.



Changed in version 3.13: Added `dir_fd' and `follow_symlinks' parameters.

@end deffn

@geindex which() (in module shutil)
@anchor{library/shutil shutil which}@anchor{6dc}
@deffn {Function} shutil.which (cmd, mode=os.F_OK | os.X_OK, path=None)

Return the path to an executable which would be run if the given `cmd' was
called.  If no `cmd' would be called, return @code{None}.

`mode' is a permission mask passed to @ref{12f8,,os.access()}, by default
determining if the file exists and is executable.

`path' is a “@code{PATH} string” specifying the directories to look in,
delimited by @ref{2177,,os.pathsep}. When no `path' is specified, the
@geindex PATH
@geindex environment variable; PATH
@code{PATH} environment variable is read from @ref{25b,,os.environ},
falling back to @ref{1e26,,os.defpath} if it is not set.

If `cmd' contains a directory component, @code{which()} only checks the
specified path directly and does not search the directories listed in
`path' or in the system’s 
@geindex PATH
@geindex environment variable; PATH
@code{PATH} environment variable.

On Windows, the current directory is prepended to the `path' if `mode' does
not include @code{os.X_OK}. When the `mode' does include @code{os.X_OK}, the
Windows API @code{NeedCurrentDirectoryForExePathW} will be consulted to
determine if the current directory should be prepended to `path'. To avoid
consulting the current working directory for executables: set the environment
variable @code{NoDefaultCurrentDirectoryInExePath}.

Also on Windows, the 
@geindex PATHEXT
@geindex environment variable; PATHEXT
@code{PATHEXT} environment variable is used to
resolve commands that may not already include an extension. For example,
if you call @code{shutil.which("python")}, @code{which()} will search @code{PATHEXT}
to know that it should look for @code{python.exe} within the `path'
directories. For example, on Windows:

@example
>>> shutil.which("python")
'C:\\Python33\\python.EXE'
@end example

This is also applied when `cmd' is a path that contains a directory
component:

@example
>>> shutil.which("C:\\Python33\\python")
'C:\\Python33\\python.EXE'
@end example


Added in version 3.3.



Changed in version 3.8: The @ref{193,,bytes} type is now accepted.  If `cmd' type is
@code{bytes}, the result type is also @code{bytes}.



Changed in version 3.12: On Windows, the current directory is no longer prepended to the search
path if `mode' includes @code{os.X_OK} and WinAPI
@code{NeedCurrentDirectoryForExePathW(cmd)} is false, else the current
directory is prepended even if it is already in the search path;
@code{PATHEXT} is used now even when `cmd' includes a directory component
or ends with an extension that is in @code{PATHEXT}; and filenames that
have no extension can now be found.

@end deffn

@geindex Error
@anchor{library/shutil shutil Error}@anchor{11a3}
@deffn {Exception} shutil.Error

This exception collects exceptions that are raised during a multi-file
operation. For @ref{c24,,copytree()}, the exception argument is a list of 3-tuples
(`srcname', `dstname', `exception').
@end deffn

@menu
* Platform-dependent efficient copy operations:: 
* copytree example:: 
* rmtree example:: 

@end menu

@node Platform-dependent efficient copy operations,copytree example,,Directory and files operations
@anchor{library/shutil platform-dependent-efficient-copy-operations}@anchor{2d5b}@anchor{library/shutil shutil-platform-dependent-efficient-copy-operations}@anchor{c59}
@subsubsection Platform-dependent efficient copy operations


Starting from Python 3.8, all functions involving a file copy
(@ref{c54,,copyfile()}, @ref{c55,,copy()}, @ref{c56,,copy2()},
@ref{c24,,copytree()}, and @ref{c57,,move()}) may use
platform-specific “fast-copy” syscalls in order to copy the file more
efficiently (see bpo-33671@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33671}).
“fast-copy” means that the copying operation occurs within the kernel, avoiding
the use of userspace buffers in Python as in “@code{outfd.write(infd.read())}”.

On macOS fcopyfile@footnote{http://www.manpagez.com/man/3/copyfile/} is used to copy the file content (not metadata).

On Linux @ref{18fa,,os.copy_file_range()} or @ref{d0b,,os.sendfile()} is used.

On Solaris @ref{d0b,,os.sendfile()} is used.

On Windows @ref{c54,,shutil.copyfile()} uses a bigger default buffer size (1 MiB
instead of 64 KiB) and a @ref{166,,memoryview()}-based variant of
@ref{c58,,shutil.copyfileobj()} is used.

If the fast-copy operation fails and no data was written in the destination
file then shutil will silently fall back to less efficient
@ref{c58,,copyfileobj()} function internally.


Changed in version 3.8.



Changed in version 3.14: Solaris now uses @ref{d0b,,os.sendfile()}.



Changed in version 3.14: Copy-on-write or server-side copy may be used internally via
@ref{18fa,,os.copy_file_range()} on supported Linux filesystems.


@node copytree example,rmtree example,Platform-dependent efficient copy operations,Directory and files operations
@anchor{library/shutil copytree-example}@anchor{2d5c}@anchor{library/shutil shutil-copytree-example}@anchor{2d5d}
@subsubsection copytree example


An example that uses the @ref{2d58,,ignore_patterns()} helper:

@example
from shutil import copytree, ignore_patterns

copytree(source, destination, ignore=ignore_patterns('*.pyc', 'tmp*'))
@end example

This will copy everything except @code{.pyc} files and files or directories whose
name starts with @code{tmp}.

Another example that uses the `ignore' argument to add a logging call:

@example
from shutil import copytree
import logging

def _logpath(path, names):
    logging.info('Working in %s', path)
    return []   # nothing will be ignored

copytree(source, destination, ignore=_logpath)
@end example

@node rmtree example,,copytree example,Directory and files operations
@anchor{library/shutil rmtree-example}@anchor{2d5e}@anchor{library/shutil shutil-rmtree-example}@anchor{2d5a}
@subsubsection rmtree example


This example shows how to remove a directory tree on Windows where some
of the files have their read-only bit set. It uses the onexc callback
to clear the readonly bit and reattempt the remove. Any subsequent failure
will propagate.

@example
import os, stat
import shutil

def remove_readonly(func, path, _):
    "Clear the readonly bit and reattempt the removal"
    os.chmod(path, stat.S_IWRITE)
    func(path)

shutil.rmtree(directory, onexc=remove_readonly)
@end example

@node Archiving operations,Querying the size of the output terminal,Directory and files operations,shutil — High-level file operations
@anchor{library/shutil archiving-operations}@anchor{1424}@anchor{library/shutil id1}@anchor{2d5f}
@subsubsection Archiving operations



Added in version 3.2.



Changed in version 3.5: Added support for the `xztar' format.


High-level utilities to create and read compressed and archived files are also
provided.  They rely on the @ref{138,,zipfile} and @ref{e4,,tarfile} modules.

@geindex make_archive() (in module shutil)
@anchor{library/shutil shutil make_archive}@anchor{6db}
@deffn {Function} shutil.make_archive (base_name, format[, root_dir[, base_dir[, verbose[, dry_run[, owner[, group[, logger]]]]]]])

Create an archive file (such as zip or tar) and return its name.

`base_name' is the name of the file to create, including the path, minus
any format-specific extension.

`format' is the archive format: one of
“zip” (if the @ref{13a,,zlib} module is available), “tar”, “gztar” (if the
@code{zlib} module is available), “bztar” (if the @ref{14,,bz2} module is
available), “xztar” (if the @ref{8e,,lzma} module is available), or “zstdtar”
(if the @ref{23,,compression.zstd} module is available).

`root_dir' is a directory that will be the root directory of the
archive, all paths in the archive will be relative to it; for example,
we typically chdir into `root_dir' before creating the archive.

`base_dir' is the directory where we start archiving from;
i.e. `base_dir' will be the common prefix of all files and
directories in the archive.  `base_dir' must be given relative
to `root_dir'.  See @ref{2d60,,Archiving example with base_dir} for how to
use `base_dir' and `root_dir' together.

`root_dir' and `base_dir' both default to the current directory.

If `dry_run' is true, no archive is created, but the operations that would be
executed are logged to `logger'.

`owner' and `group' are used when creating a tar archive. By default,
uses the current owner and group.

`logger' must be an object compatible with 
@geindex Python Enhancement Proposals; PEP 282
PEP 282@footnote{https://peps.python.org/pep-0282/}, usually an instance of
@ref{d4c,,logging.Logger}.

The `verbose' argument is unused and deprecated.

Raises an @ref{1cb1,,auditing event} @code{shutil.make_archive} with arguments @code{base_name}, @code{format}, @code{root_dir}, @code{base_dir}.

@cartouche
@quotation Note 
This function is not thread-safe when custom archivers registered
with @ref{2d61,,register_archive_format()} do not support the `root_dir'
argument.  In this case it
temporarily changes the current working directory of the process
to `root_dir' to perform archiving.
@end quotation
@end cartouche


Changed in version 3.8: The modern pax (POSIX.1-2001) format is now used instead of
the legacy GNU format for archives created with @code{format="tar"}.



Changed in version 3.10.6: This function is now made thread-safe during creation of standard
@code{.zip} and tar archives.

@end deffn

@geindex get_archive_formats() (in module shutil)
@anchor{library/shutil shutil get_archive_formats}@anchor{2d62}
@deffn {Function} shutil.get_archive_formats ()

Return a list of supported formats for archiving.
Each element of the returned sequence is a tuple @code{(name, description)}.

By default @code{shutil} provides these formats:


@itemize -

@item 
`zip': ZIP file (if the @ref{13a,,zlib} module is available).

@item 
`tar': Uncompressed tar file. Uses POSIX.1-2001 pax format for new archives.

@item 
`gztar': gzip’ed tar-file (if the @ref{13a,,zlib} module is available).

@item 
`bztar': bzip2’ed tar-file (if the @ref{14,,bz2} module is available).

@item 
`xztar': xz’ed tar-file (if the @ref{8e,,lzma} module is available).

@item 
`zstdtar': Zstandard compressed tar-file (if the @ref{23,,compression.zstd}
module is available).
@end itemize

You can register new formats or provide your own archiver for any existing
formats, by using @ref{2d61,,register_archive_format()}.
@end deffn

@geindex register_archive_format() (in module shutil)
@anchor{library/shutil shutil register_archive_format}@anchor{2d61}
@deffn {Function} shutil.register_archive_format (name, function[, extra_args[, description]])

Register an archiver for the format `name'.

`function' is the callable that will be used to create archives. The callable
will receive the `base_name' of the file to create, followed by the
`base_dir' (which defaults to @ref{2cc8,,os.curdir}) to start archiving from.
Further arguments are passed as keyword arguments: `owner', `group',
`dry_run' and `logger' (as passed in @ref{6db,,make_archive()}).

If `function' has the custom attribute @code{function.supports_root_dir} set to @code{True},
the `root_dir' argument is passed as a keyword argument.
Otherwise the current working directory of the process is temporarily
changed to `root_dir' before calling `function'.
In this case @ref{6db,,make_archive()} is not thread-safe.

If given, `extra_args' is a sequence of @code{(name, value)} pairs that will be
used as extra keywords arguments when the archiver callable is used.

`description' is used by @ref{2d62,,get_archive_formats()} which returns the
list of archivers.  Defaults to an empty string.


Changed in version 3.12: Added support for functions supporting the `root_dir' argument.

@end deffn

@geindex unregister_archive_format() (in module shutil)
@anchor{library/shutil shutil unregister_archive_format}@anchor{2d63}
@deffn {Function} shutil.unregister_archive_format (name)

Remove the archive format `name' from the list of supported formats.
@end deffn

@geindex unpack_archive() (in module shutil)
@anchor{library/shutil shutil unpack_archive}@anchor{697}
@deffn {Function} shutil.unpack_archive (filename[, extract_dir[, format[, filter]]])

Unpack an archive. `filename' is the full path of the archive.

`extract_dir' is the name of the target directory where the archive is
unpacked. If not provided, the current working directory is used.

`format' is the archive format: one of “zip”, “tar”, “gztar”, “bztar”,
“xztar”, or “zstdtar”.  Or any other format registered with
@ref{2d64,,register_unpack_format()}.  If not provided, @code{unpack_archive()}
will use the archive file name extension and see if an unpacker was
registered for that extension.  In case none is found,
a @ref{2ee,,ValueError} is raised.

The keyword-only `filter' argument is passed to the underlying unpacking
function. For zip files, `filter' is not accepted.
For tar files, it is recommended to use @code{'data'} (default since Python
3.14), unless using features specific to tar and UNIX-like filesystems.
(See @ref{698,,Extraction filters} for details.)

Raises an @ref{1cb1,,auditing event} @code{shutil.unpack_archive} with arguments @code{filename}, @code{extract_dir}, @code{format}.

@cartouche
@quotation Warning 
Never extract archives from untrusted sources without prior inspection.
It is possible that files are created outside of the path specified in
the `extract_dir' argument, for example, members that have absolute filenames
or filenames with “..” components.

Since Python 3.14, the defaults for both built-in formats (zip and tar
files) will prevent the most dangerous of such security issues,
but will not prevent `all' unintended behavior.
Read the @ref{2d65,,Hints for further verification}
section for tar-specific details.
@end quotation
@end cartouche


Changed in version 3.7: Accepts a @ref{5a1,,path-like object} for `filename' and `extract_dir'.



Changed in version 3.12: Added the `filter' argument.

@end deffn

@geindex register_unpack_format() (in module shutil)
@anchor{library/shutil shutil register_unpack_format}@anchor{2d64}
@deffn {Function} shutil.register_unpack_format (name, extensions, function[, extra_args[, description]])

Registers an unpack format. `name' is the name of the format and
`extensions' is a list of extensions corresponding to the format, like
@code{.zip} for Zip files.

`function' is the callable that will be used to unpack archives. The
callable will receive:


@itemize -

@item 
the path of the archive, as a positional argument;

@item 
the directory the archive must be extracted to, as a positional argument;

@item 
possibly a `filter' keyword argument, if it was given to
@ref{697,,unpack_archive()};

@item 
additional keyword arguments, specified by `extra_args' as a sequence
of @code{(name, value)} tuples.
@end itemize

`description' can be provided to describe the format, and will be returned
by the @ref{2d66,,get_unpack_formats()} function.
@end deffn

@geindex unregister_unpack_format() (in module shutil)
@anchor{library/shutil shutil unregister_unpack_format}@anchor{2d67}
@deffn {Function} shutil.unregister_unpack_format (name)

Unregister an unpack format. `name' is the name of the format.
@end deffn

@geindex get_unpack_formats() (in module shutil)
@anchor{library/shutil shutil get_unpack_formats}@anchor{2d66}
@deffn {Function} shutil.get_unpack_formats ()

Return a list of all registered formats for unpacking.
Each element of the returned sequence is a tuple
@code{(name, extensions, description)}.

By default @code{shutil} provides these formats:


@itemize -

@item 
`zip': ZIP file (unpacking compressed files works only if the corresponding
module is available).

@item 
`tar': uncompressed tar file.

@item 
`gztar': gzip’ed tar-file (if the @ref{13a,,zlib} module is available).

@item 
`bztar': bzip2’ed tar-file (if the @ref{14,,bz2} module is available).

@item 
`xztar': xz’ed tar-file (if the @ref{8e,,lzma} module is available).

@item 
`zstdtar': Zstandard compressed tar-file (if the @ref{23,,compression.zstd}
module is available).
@end itemize

You can register new formats or provide your own unpacker for any existing
formats, by using @ref{2d64,,register_unpack_format()}.
@end deffn

@menu
* Archiving example:: 
* Archiving example with base_dir:: 

@end menu

@node Archiving example,Archiving example with base_dir,,Archiving operations
@anchor{library/shutil archiving-example}@anchor{2d68}@anchor{library/shutil shutil-archiving-example}@anchor{2d69}
@subsubsection Archiving example


In this example, we create a gzip’ed tar-file archive containing all files
found in the @code{.ssh} directory of the user:

@example
>>> from shutil import make_archive
>>> import os
>>> archive_name = os.path.expanduser(os.path.join('~', 'myarchive'))
>>> root_dir = os.path.expanduser(os.path.join('~', '.ssh'))
>>> make_archive(archive_name, 'gztar', root_dir)
'/Users/tarek/myarchive.tar.gz'
@end example

The resulting archive contains:

@example
$ tar -tzvf /Users/tarek/myarchive.tar.gz
drwx------ tarek/staff       0 2010-02-01 16:23:40 ./
-rw-r--r-- tarek/staff     609 2008-06-09 13:26:54 ./authorized_keys
-rwxr-xr-x tarek/staff      65 2008-06-09 13:26:54 ./config
-rwx------ tarek/staff     668 2008-06-09 13:26:54 ./id_dsa
-rwxr-xr-x tarek/staff     609 2008-06-09 13:26:54 ./id_dsa.pub
-rw------- tarek/staff    1675 2008-06-09 13:26:54 ./id_rsa
-rw-r--r-- tarek/staff     397 2008-06-09 13:26:54 ./id_rsa.pub
-rw-r--r-- tarek/staff   37192 2010-02-06 18:23:10 ./known_hosts
@end example

@node Archiving example with base_dir,,Archiving example,Archiving operations
@anchor{library/shutil archiving-example-with-base-dir}@anchor{2d6a}@anchor{library/shutil shutil-archiving-example-with-basedir}@anchor{2d60}
@subsubsection Archiving example with `base_dir'


In this example, similar to the @ref{2d69,,one above},
we show how to use @ref{6db,,make_archive()}, but this time with the usage of
`base_dir'.  We now have the following directory structure:

@example
$ tree tmp
tmp
└── root
    └── structure
        ├── content
            └── please_add.txt
        └── do_not_add.txt
@end example

In the final archive, @code{please_add.txt} should be included, but
@code{do_not_add.txt} should not.  Therefore we use the following:

@example
>>> from shutil import make_archive
>>> import os
>>> archive_name = os.path.expanduser(os.path.join('~', 'myarchive'))
>>> make_archive(
...     archive_name,
...     'tar',
...     root_dir='tmp/root',
...     base_dir='structure/content',
... )
'/Users/tarek/myarchive.tar'
@end example

Listing the files in the resulting archive gives us:

@example
$ python -m tarfile -l /Users/tarek/myarchive.tar
structure/content/
structure/content/please_add.txt
@end example

@node Querying the size of the output terminal,,Archiving operations,shutil — High-level file operations
@anchor{library/shutil querying-the-size-of-the-output-terminal}@anchor{2d6b}
@subsubsection Querying the size of the output terminal


@geindex get_terminal_size() (in module shutil)
@anchor{library/shutil shutil get_terminal_size}@anchor{130f}
@deffn {Function} shutil.get_terminal_size (fallback=(columns, lines))

Get the size of the terminal window.

For each of the two dimensions, the environment variable, @code{COLUMNS}
and @code{LINES} respectively, is checked. If the variable is defined and
the value is a positive integer, it is used.

When @code{COLUMNS} or @code{LINES} is not defined, which is the common case,
the terminal connected to @ref{2d6c,,sys.__stdout__} is queried
by invoking @ref{130e,,os.get_terminal_size()}.

If the terminal size cannot be successfully queried, either because
the system doesn’t support querying, or because we are not
connected to a terminal, the value given in @code{fallback} parameter
is used. @code{fallback} defaults to @code{(80, 24)} which is the default
size used by many terminal emulators.

The value returned is a named tuple of type @ref{2d6d,,os.terminal_size}.

See also: The Single UNIX Specification, Version 2,
Other Environment Variables@footnote{https://pubs.opengroup.org/onlinepubs/7908799/xbd/envvar.html#tag_002_003}.


Added in version 3.3.



Changed in version 3.11: The @code{fallback} values are also used if @ref{130e,,os.get_terminal_size()}
returns zeroes.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)


@subsubheading See also



@table @asis

@item Module @ref{a5,,os}

Operating system interfaces, including functions to work with files at a
lower level than Python @ref{13cf,,file objects}.

@item Module @ref{83,,io}

Python’s built-in I/O library, including both abstract classes and
some concrete classes such as file I/O.

@item Built-in function @ref{318,,open()}

The standard way to open files for reading and writing with Python.
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Data Persistence,Data Compression and Archiving,File and Directory Access,The Python Standard Library
@anchor{library/persistence doc}@anchor{2d6e}@anchor{library/persistence data-persistence}@anchor{2d6f}@anchor{library/persistence persistence}@anchor{2d70}@anchor{library/persistence translation-repo}@anchor{2d71}
@section Data Persistence


The modules described in this chapter support storing Python data in a
persistent form on disk.  The @ref{ab,,pickle} and @ref{91,,marshal} modules can turn
many Python data types into a stream of bytes and then recreate the objects from
the bytes.  The various DBM-related modules support a family of hash-based file
formats that store a mapping of strings to other strings.

The list of modules described in this chapter is:

@menu
* pickle — Python object serialization:: 
* copyreg — Register pickle support functions:: 
* shelve — Python object persistence:: 
* marshal — Internal Python object serialization:: 
* dbm — Interfaces to Unix “databases”:: 
* sqlite3 — DB-API 2.0 interface for SQLite databases: sqlite3 — DB-API 2 0 interface for SQLite databases. 

@end menu

@node pickle — Python object serialization,copyreg — Register pickle support functions,,Data Persistence
@anchor{library/pickle doc}@anchor{2d72}@anchor{library/pickle module-pickle}@anchor{ab}@anchor{library/pickle pickle-python-object-serialization}@anchor{2d73}
@subsection @code{pickle} — Python object serialization


@geindex module; pickle

`Source code:' Lib/pickle.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/pickle.py}

@geindex persistence
@geindex persistent; objects
@geindex serializing; objects
@geindex marshalling; objects
@geindex flattening; objects
@geindex pickling; objects


__________________________________________________________________


The @code{pickle} module implements binary protocols for serializing and
de-serializing a Python object structure.  `“Pickling”' is the process
whereby a Python object hierarchy is converted into a byte stream, and
`“unpickling”' is the inverse operation, whereby a byte stream
(from a @ref{20b2,,binary file} or @ref{194,,bytes-like object}) is converted
back into an object hierarchy.  Pickling (and unpickling) is alternatively
known as “serialization”, “marshalling,” @footnote{
Don’t confuse this with the @ref{91,,marshal} module
} or “flattening”; however, to
avoid confusion, the terms used here are “pickling” and “unpickling”.

@cartouche
@quotation Warning 
The @code{pickle} module `is not secure'. Only unpickle data you trust.

It is possible to construct malicious pickle data which will `execute
arbitrary code during unpickling'. Never unpickle data that could have come
from an untrusted source, or that could have been tampered with.

Consider signing data with @ref{6e,,hmac} if you need to ensure that it has not
been tampered with.

Safer serialization formats such as @ref{86,,json} may be more appropriate if
you are processing untrusted data. See @ref{2d74,,Comparison with json}.
@end quotation
@end cartouche

@menu
* Relationship to other Python modules:: 
* Data stream format:: 
* Module Interface:: 
* What can be pickled and unpickled?:: 
* Pickling Class Instances:: 
* Custom Reduction for Types@comma{} Functions@comma{} and Other Objects: Custom Reduction for Types Functions and Other Objects. 
* Out-of-band Buffers:: 
* Restricting Globals:: 
* Performance: Performance<2>. 
* Examples: Examples<7>. 
* Command-line interface:: 

@end menu

@node Relationship to other Python modules,Data stream format,,pickle — Python object serialization
@anchor{library/pickle relationship-to-other-python-modules}@anchor{2d75}
@subsubsection Relationship to other Python modules


@menu
* Comparison with marshal:: 
* Comparison with json:: 

@end menu

@node Comparison with marshal,Comparison with json,,Relationship to other Python modules
@anchor{library/pickle comparison-with-marshal}@anchor{2d76}
@subsubsection Comparison with @code{marshal}


Python has a more primitive serialization module called @ref{91,,marshal}, but in
general @code{pickle} should always be the preferred way to serialize Python
objects.  @code{marshal} exists primarily to support Python’s @code{.pyc}
files.

The @code{pickle} module differs from @ref{91,,marshal} in several significant ways:


@itemize *

@item 
@ref{91,,marshal} cannot be used to serialize user-defined classes and their
instances.  @code{pickle} can save and restore class instances transparently,
however the class definition must be importable and live in the same module as
when the object was pickled.

@item 
The @ref{91,,marshal} serialization format is not guaranteed to be portable
across Python versions.  Because its primary job in life is to support
@code{.pyc} files, the Python implementers reserve the right to change the
serialization format in non-backwards compatible ways should the need arise.
The @code{pickle} serialization format is guaranteed to be backwards compatible
across Python releases provided a compatible pickle protocol is chosen and
pickling and unpickling code deals with Python 2 to Python 3 type differences
if your data is crossing that unique breaking change language boundary.
@end itemize

@node Comparison with json,,Comparison with marshal,Relationship to other Python modules
@anchor{library/pickle comparison-with-json}@anchor{2d74}@anchor{library/pickle id2}@anchor{2d77}
@subsubsection Comparison with @code{json}


There are fundamental differences between the pickle protocols and
JSON (JavaScript Object Notation)@footnote{https://json.org}:


@itemize *

@item 
JSON is a text serialization format (it outputs unicode text, although
most of the time it is then encoded to @code{utf-8}), while pickle is
a binary serialization format;

@item 
JSON is human-readable, while pickle is not;

@item 
JSON is interoperable and widely used outside of the Python ecosystem,
while pickle is Python-specific;

@item 
JSON, by default, can only represent a subset of the Python built-in
types, and no custom classes; pickle can represent an extremely large
number of Python types (many of them automatically, by clever usage
of Python’s introspection facilities; complex cases can be tackled by
implementing @ref{2d78,,specific object APIs});

@item 
Unlike pickle, deserializing untrusted JSON does not in itself create an
arbitrary code execution vulnerability.
@end itemize


@subsubheading See also


The @ref{86,,json} module: a standard library module allowing JSON
serialization and deserialization.


@node Data stream format,Module Interface,Relationship to other Python modules,pickle — Python object serialization
@anchor{library/pickle data-stream-format}@anchor{2d79}@anchor{library/pickle pickle-protocols}@anchor{27d}
@subsubsection Data stream format


@geindex External Data Representation

The data format used by @code{pickle} is Python-specific.  This has the
advantage that there are no restrictions imposed by external standards such as
JSON (which can’t represent pointer sharing); however it means that
non-Python programs may not be able to reconstruct pickled Python objects.

By default, the @code{pickle} data format uses a relatively compact binary
representation.  If you need optimal size characteristics, you can efficiently
@ref{2d7a,,compress} pickled data.

The module @ref{ac,,pickletools} contains tools for analyzing data streams
generated by @code{pickle}.  @code{pickletools} source code has extensive
comments about opcodes used by pickle protocols.

There are currently 6 different protocols which can be used for pickling.
The higher the protocol used, the more recent the version of Python needed
to read the pickle produced.


@itemize *

@item 
Protocol version 0 is the original “human-readable” protocol and is
backwards compatible with earlier versions of Python.

@item 
Protocol version 1 is an old binary format which is also compatible with
earlier versions of Python.

@item 
Protocol version 2 was introduced in Python 2.3.  It provides much more
efficient pickling of @ref{2d7b,,new-style classes}.  Refer to 
@geindex Python Enhancement Proposals; PEP 307
PEP 307@footnote{https://peps.python.org/pep-0307/} for
information about improvements brought by protocol 2.

@item 
Protocol version 3 was added in Python 3.0.  It has explicit support for
@ref{193,,bytes} objects and cannot be unpickled by Python 2.x.  This was
the default protocol in Python 3.0–3.7.

@item 
Protocol version 4 was added in Python 3.4.  It adds support for very large
objects, pickling more kinds of objects, and some data format
optimizations.  This was the default protocol in Python 3.8–3.13.
Refer to 
@geindex Python Enhancement Proposals; PEP 3154
PEP 3154@footnote{https://peps.python.org/pep-3154/} for information about improvements brought by
protocol 4.

@item 
Protocol version 5 was added in Python 3.8.  It adds support for out-of-band
data and speedup for in-band data.  It is the default protocol starting with
Python 3.14.  Refer to 
@geindex Python Enhancement Proposals; PEP 574
PEP 574@footnote{https://peps.python.org/pep-0574/} for information about improvements brought
by protocol 5.
@end itemize

@cartouche
@quotation Note 
Serialization is a more primitive notion than persistence; although
@code{pickle} reads and writes file objects, it does not handle the issue of
naming persistent objects, nor the (even more complicated) issue of concurrent
access to persistent objects.  The @code{pickle} module can transform a complex
object into a byte stream and it can transform the byte stream into an object
with the same internal structure.  Perhaps the most obvious thing to do with
these byte streams is to write them onto a file, but it is also conceivable to
send them across a network or store them in a database.  The @ref{c8,,shelve}
module provides a simple interface to pickle and unpickle objects on
DBM-style database files.
@end quotation
@end cartouche

@node Module Interface,What can be pickled and unpickled?,Data stream format,pickle — Python object serialization
@anchor{library/pickle module-interface}@anchor{2d7c}
@subsubsection Module Interface


To serialize an object hierarchy, you simply call the @ref{16b0,,dumps()} function.
Similarly, to de-serialize a data stream, you call the @ref{f13,,loads()} function.
However, if you want more control over serialization and de-serialization,
you can create a @ref{c19,,Pickler} or an @ref{17ca,,Unpickler} object, respectively.

The @code{pickle} module provides the following constants:

@geindex HIGHEST_PROTOCOL (in module pickle)
@anchor{library/pickle pickle HIGHEST_PROTOCOL}@anchor{16b1}
@deffn {Data} pickle.HIGHEST_PROTOCOL

An integer, the highest @ref{27d,,protocol version}
available.  This value can be passed as a `protocol' value to functions
@ref{2d7d,,dump()} and @ref{16b0,,dumps()} as well as the @ref{c19,,Pickler}
constructor.
@end deffn

@geindex DEFAULT_PROTOCOL (in module pickle)
@anchor{library/pickle pickle DEFAULT_PROTOCOL}@anchor{a35}
@deffn {Data} pickle.DEFAULT_PROTOCOL

An integer, the default @ref{27d,,protocol version} used
for pickling.  May be less than @ref{16b1,,HIGHEST_PROTOCOL}.  Currently the
default protocol is 5, introduced in Python 3.8 and incompatible
with previous versions. This version introduces support for out-of-band
buffers, where 
@geindex Python Enhancement Proposals; PEP 3118
PEP 3118@footnote{https://peps.python.org/pep-3118/}-compatible data can be transmitted separately
from the main pickle stream.


Changed in version 3.0: The default protocol is 3.



Changed in version 3.8: The default protocol is 4.



Changed in version 3.14: The default protocol is 5.

@end deffn

The @code{pickle} module provides the following functions to make the pickling
process more convenient:

@geindex dump() (in module pickle)
@anchor{library/pickle pickle dump}@anchor{2d7d}
@deffn {Function} pickle.dump (obj, file, protocol=None, *, fix_imports=True, buffer_callback=None)

Write the pickled representation of the object `obj' to the open
@ref{13cf,,file object} `file'.  This is equivalent to
@code{Pickler(file, protocol).dump(obj)}.

Arguments `file', `protocol', `fix_imports' and `buffer_callback' have
the same meaning as in the @ref{c19,,Pickler} constructor.


Changed in version 3.8: The `buffer_callback' argument was added.

@end deffn

@geindex dumps() (in module pickle)
@anchor{library/pickle pickle dumps}@anchor{16b0}
@deffn {Function} pickle.dumps (obj, protocol=None, *, fix_imports=True, buffer_callback=None)

Return the pickled representation of the object `obj' as a @ref{193,,bytes} object,
instead of writing it to a file.

Arguments `protocol', `fix_imports' and `buffer_callback' have the same
meaning as in the @ref{c19,,Pickler} constructor.


Changed in version 3.8: The `buffer_callback' argument was added.

@end deffn

@geindex load() (in module pickle)
@anchor{library/pickle pickle load}@anchor{f12}
@deffn {Function} pickle.load (file, *, fix_imports=True, encoding='ASCII', errors='strict', buffers=None)

Read the pickled representation of an object from the open @ref{13cf,,file object}
`file' and return the reconstituted object hierarchy specified therein.
This is equivalent to @code{Unpickler(file).load()}.

The protocol version of the pickle is detected automatically, so no
protocol argument is needed.  Bytes past the pickled representation
of the object are ignored.

Arguments `file', `fix_imports', `encoding', `errors', `strict' and `buffers'
have the same meaning as in the @ref{17ca,,Unpickler} constructor.


Changed in version 3.8: The `buffers' argument was added.

@end deffn

@geindex loads() (in module pickle)
@anchor{library/pickle pickle loads}@anchor{f13}
@deffn {Function} pickle.loads (data, /, *, fix_imports=True, encoding='ASCII', errors='strict', buffers=None)

Return the reconstituted object hierarchy of the pickled representation
`data' of an object. `data' must be a @ref{194,,bytes-like object}.

The protocol version of the pickle is detected automatically, so no
protocol argument is needed.  Bytes past the pickled representation
of the object are ignored.

Arguments `fix_imports', `encoding', `errors', `strict' and `buffers'
have the same meaning as in the @ref{17ca,,Unpickler} constructor.


Changed in version 3.8: The `buffers' argument was added.

@end deffn

The @code{pickle} module defines three exceptions:

@geindex PickleError
@anchor{library/pickle pickle PickleError}@anchor{2d7e}
@deffn {Exception} pickle.PickleError

Common base class for the other pickling exceptions.  It inherits from
@ref{bd3,,Exception}.
@end deffn

@geindex PicklingError
@anchor{library/pickle pickle PicklingError}@anchor{1986}
@deffn {Exception} pickle.PicklingError

Error raised when an unpicklable object is encountered by @ref{c19,,Pickler}.
It inherits from @ref{2d7e,,PickleError}.

Refer to @ref{2d7f,,What can be pickled and unpickled?} to learn what kinds of objects can be
pickled.
@end deffn

@geindex UnpicklingError
@anchor{library/pickle pickle UnpicklingError}@anchor{2d80}
@deffn {Exception} pickle.UnpicklingError

Error raised when there is a problem unpickling an object, such as a data
corruption or a security violation.  It inherits from @ref{2d7e,,PickleError}.

Note that other exceptions may also be raised during unpickling, including
(but not necessarily limited to) AttributeError, EOFError, ImportError, and
IndexError.
@end deffn

The @code{pickle} module exports three classes, @ref{c19,,Pickler},
@ref{17ca,,Unpickler} and @ref{1797,,PickleBuffer}:

@geindex Pickler (class in pickle)
@anchor{library/pickle pickle Pickler}@anchor{c19}
@deffn {Class} pickle.Pickler (file, protocol=None, *, fix_imports=True, buffer_callback=None)

This takes a binary file for writing a pickle data stream.

The optional `protocol' argument, an integer, tells the pickler to use
the given protocol; supported protocols are 0 to @ref{16b1,,HIGHEST_PROTOCOL}.
If not specified, the default is @ref{a35,,DEFAULT_PROTOCOL}.  If a negative
number is specified, @code{HIGHEST_PROTOCOL} is selected.

The `file' argument must have a write() method that accepts a single bytes
argument.  It can thus be an on-disk file opened for binary writing, an
@ref{10aa,,io.BytesIO} instance, or any other custom object that meets this
interface.

If `fix_imports' is true and `protocol' is less than 3, pickle will try to
map the new Python 3 names to the old module names used in Python 2, so
that the pickle data stream is readable with Python 2.

If `buffer_callback' is @code{None} (the default), buffer views are
serialized into `file' as part of the pickle stream.

If `buffer_callback' is not @code{None}, then it can be called any number
of times with a buffer view.  If the callback returns a false value
(such as @code{None}), the given buffer is @ref{2d81,,out-of-band};
otherwise the buffer is serialized in-band, i.e. inside the pickle stream.

It is an error if `buffer_callback' is not @code{None} and `protocol' is
@code{None} or smaller than 5.


Changed in version 3.8: The `buffer_callback' argument was added.


@geindex dump() (pickle.Pickler method)
@anchor{library/pickle pickle Pickler dump}@anchor{1e67}
@deffn {Method} dump (obj)

Write the pickled representation of `obj' to the open file object given in
the constructor.
@end deffn

@geindex persistent_id() (pickle.Pickler method)
@anchor{library/pickle pickle Pickler persistent_id}@anchor{1950}
@deffn {Method} persistent_id (obj)

Do nothing by default.  This exists so a subclass can override it.

If @code{persistent_id()} returns @code{None}, `obj' is pickled as usual.  Any
other value causes @code{Pickler} to emit the returned value as a
persistent ID for `obj'.  The meaning of this persistent ID should be
defined by @ref{1958,,Unpickler.persistent_load()}.  Note that the value
returned by @code{persistent_id()} cannot itself have a persistent ID.

See @ref{2d82,,Persistence of External Objects} for details and examples of uses.


Changed in version 3.13: Add the default implementation of this method in the C implementation
of @code{Pickler}.

@end deffn

@geindex dispatch_table (pickle.Pickler attribute)
@anchor{library/pickle pickle Pickler dispatch_table}@anchor{132e}
@deffn {Attribute} dispatch_table

A pickler object’s dispatch table is a registry of `reduction
functions' of the kind which can be declared using
@ref{2d83,,copyreg.pickle()}.  It is a mapping whose keys are classes
and whose values are reduction functions.  A reduction function
takes a single argument of the associated class and should
conform to the same interface as a @ref{bcc,,__reduce__()}
method.

By default, a pickler object will not have a
@ref{132e,,dispatch_table} attribute, and it will instead use the
global dispatch table managed by the @ref{2a,,copyreg} module.
However, to customize the pickling for a specific pickler object
one can set the @code{dispatch_table} attribute to a dict-like
object.  Alternatively, if a subclass of @code{Pickler} has a
@code{dispatch_table} attribute then this will be used as the
default dispatch table for instances of that class.

See @ref{2d84,,Dispatch Tables} for usage examples.


Added in version 3.3.

@end deffn

@geindex reducer_override() (pickle.Pickler method)
@anchor{library/pickle pickle Pickler reducer_override}@anchor{c1a}
@deffn {Method} reducer_override (obj)

Special reducer that can be defined in @code{Pickler} subclasses. This
method has priority over any reducer in the @ref{132e,,dispatch_table}.  It
should conform to the same interface as a @ref{bcc,,__reduce__()} method, and
can optionally return @ref{1a3,,NotImplemented} to fallback on
@code{dispatch_table}-registered reducers to pickle @code{obj}.

For a detailed example, see @ref{2d85,,Custom Reduction for Types@comma{} Functions@comma{} and Other Objects}.


Added in version 3.8.

@end deffn

@geindex fast (pickle.Pickler attribute)
@anchor{library/pickle pickle Pickler fast}@anchor{2d86}
@deffn {Attribute} fast

Deprecated. Enable fast mode if set to a true value.  The fast mode
disables the usage of memo, therefore speeding the pickling process by not
generating superfluous PUT opcodes.  It should not be used with
self-referential objects, doing otherwise will cause @code{Pickler} to
recurse infinitely.

Use @ref{2d87,,pickletools.optimize()} if you need more compact pickles.
@end deffn

@geindex clear_memo() (pickle.Pickler method)
@anchor{library/pickle pickle Pickler clear_memo}@anchor{2d88}
@deffn {Method} clear_memo ()

Clears the pickler’s “memo”.

The memo is the data structure that remembers which objects the
pickler has already seen, so that shared or recursive objects
are pickled by reference and not by value.  This method is
useful when re-using picklers.
@end deffn
@end deffn

@geindex Unpickler (class in pickle)
@anchor{library/pickle pickle Unpickler}@anchor{17ca}
@deffn {Class} pickle.Unpickler (file, *, fix_imports=True, encoding='ASCII', errors='strict', buffers=None)

This takes a binary file for reading a pickle data stream.

The protocol version of the pickle is detected automatically, so no
protocol argument is needed.

The argument `file' must have three methods, a read() method that takes an
integer argument, a readinto() method that takes a buffer argument
and a readline() method that requires no arguments, as in the
@ref{8a5,,io.BufferedIOBase} interface.  Thus `file' can be an on-disk file
opened for binary reading, an @ref{10aa,,io.BytesIO} object, or any other
custom object that meets this interface.

The optional arguments `fix_imports', `encoding' and `errors' are used
to control compatibility support for pickle stream generated by Python 2.
If `fix_imports' is true, pickle will try to map the old Python 2 names
to the new names used in Python 3.  The `encoding' and `errors' tell
pickle how to decode 8-bit string instances pickled by Python 2;
these default to ‘ASCII’ and ‘strict’, respectively.  The `encoding' can
be ‘bytes’ to read these 8-bit string instances as bytes objects.
Using @code{encoding='latin1'} is required for unpickling NumPy arrays and
instances of @ref{4e3,,datetime}, @ref{1fc,,date} and
@ref{1fd,,time} pickled by Python 2.

If `buffers' is @code{None} (the default), then all data necessary for
deserialization must be contained in the pickle stream.  This means
that the `buffer_callback' argument was @code{None} when a @ref{c19,,Pickler}
was instantiated (or when @ref{2d7d,,dump()} or @ref{16b0,,dumps()} was called).

If `buffers' is not @code{None}, it should be an iterable of buffer-enabled
objects that is consumed each time the pickle stream references
an @ref{2d81,,out-of-band} buffer view.  Such buffers have been
given in order to the `buffer_callback' of a Pickler object.


Changed in version 3.8: The `buffers' argument was added.


@geindex load() (pickle.Unpickler method)
@anchor{library/pickle pickle Unpickler load}@anchor{2d89}
@deffn {Method} load ()

Read the pickled representation of an object from the open file object
given in the constructor, and return the reconstituted object hierarchy
specified therein.  Bytes past the pickled representation of the object
are ignored.
@end deffn

@geindex persistent_load() (pickle.Unpickler method)
@anchor{library/pickle pickle Unpickler persistent_load}@anchor{1958}
@deffn {Method} persistent_load (pid)

Raise an @ref{2d80,,UnpicklingError} by default.

If defined, @code{persistent_load()} should return the object specified by
the persistent ID `pid'.  If an invalid persistent ID is encountered, an
@ref{2d80,,UnpicklingError} should be raised.

See @ref{2d82,,Persistence of External Objects} for details and examples of uses.


Changed in version 3.13: Add the default implementation of this method in the C implementation
of @code{Unpickler}.

@end deffn

@geindex find_class() (pickle.Unpickler method)
@anchor{library/pickle pickle Unpickler find_class}@anchor{2d8a}
@deffn {Method} find_class (module, name)

Import `module' if necessary and return the object called `name' from it,
where the `module' and `name' arguments are @ref{16a,,str} objects.  Note,
unlike its name suggests, @code{find_class()} is also used for finding
functions.

Subclasses may override this to gain control over what type of objects and
how they can be loaded, potentially reducing security risks. Refer to
@ref{2d8b,,Restricting Globals} for details.

Raises an @ref{1cb1,,auditing event} @code{pickle.find_class} with arguments @code{module}, @code{name}.
@end deffn
@end deffn

@geindex PickleBuffer (class in pickle)
@anchor{library/pickle pickle PickleBuffer}@anchor{1797}
@deffn {Class} pickle.PickleBuffer (buffer)

A wrapper for a buffer representing picklable data.  `buffer' must be a
@ref{262,,buffer-providing} object, such as a
@ref{194,,bytes-like object} or a N-dimensional array.

@code{PickleBuffer} is itself a buffer provider, therefore it is
possible to pass it to other APIs expecting a buffer-providing object,
such as @ref{166,,memoryview}.

@code{PickleBuffer} objects can only be serialized using pickle
protocol 5 or higher.  They are eligible for
@ref{2d81,,out-of-band serialization}.


Added in version 3.8.


@geindex raw() (pickle.PickleBuffer method)
@anchor{library/pickle pickle PickleBuffer raw}@anchor{2d8c}
@deffn {Method} raw ()

Return a @ref{166,,memoryview} of the memory area underlying this buffer.
The returned object is a one-dimensional, C-contiguous memoryview
with format @code{B} (unsigned bytes).  @ref{17e9,,BufferError} is raised if
the buffer is neither C- nor Fortran-contiguous.
@end deffn

@geindex release() (pickle.PickleBuffer method)
@anchor{library/pickle pickle PickleBuffer release}@anchor{2d8d}
@deffn {Method} release ()

Release the underlying buffer exposed by the PickleBuffer object.
@end deffn
@end deffn

@node What can be pickled and unpickled?,Pickling Class Instances,Module Interface,pickle — Python object serialization
@anchor{library/pickle pickle-picklable}@anchor{2d7f}@anchor{library/pickle what-can-be-pickled-and-unpickled}@anchor{2d8e}
@subsubsection What can be pickled and unpickled?


The following types can be pickled:


@itemize *

@item 
built-in constants (@code{None}, @code{True}, @code{False}, @code{Ellipsis}, and
@ref{1a3,,NotImplemented});

@item 
integers, floating-point numbers, complex numbers;

@item 
strings, bytes, bytearrays;

@item 
tuples, lists, sets, and dictionaries containing only picklable objects;

@item 
functions (built-in and user-defined) accessible from the top level of a
module (using @ref{1666,,def}, not @ref{14a9,,lambda});

@item 
classes accessible from the top level of a module;

@item 
instances of such classes for which the result of calling @ref{7f2,,__getstate__()}
is picklable  (see section @ref{2d78,,Pickling Class Instances} for details).
@end itemize

Attempts to pickle unpicklable objects will raise the @ref{1986,,PicklingError}
exception; when this happens, an unspecified number of bytes may have already
been written to the underlying file.  Trying to pickle a highly recursive data
structure may exceed the maximum recursion depth, a @ref{f6e,,RecursionError} will be
raised in this case.  You can carefully raise this limit with
@ref{6eb,,sys.setrecursionlimit()}.

Note that functions (built-in and user-defined) are pickled by fully
@ref{1d68,,qualified name}, not by value. @footnote{
This is why @ref{14a9,,lambda} functions cannot be pickled:  all
@code{lambda} functions share the same name:  @code{<lambda>}.
}  This means that only the function name is
pickled, along with the name of the containing module and classes.  Neither
the function’s code, nor any of its function attributes are pickled.  Thus the
defining module must be importable in the unpickling environment, and the module
must contain the named object, otherwise an exception will be raised. @footnote{
The exception raised will likely be an @ref{65b,,ImportError} or an
@ref{5f0,,AttributeError} but it could be something else.
}

Similarly, classes are pickled by fully qualified name, so the same restrictions in
the unpickling environment apply.  Note that none of the class’s code or data is
pickled, so in the following example the class attribute @code{attr} is not
restored in the unpickling environment:

@example
class Foo:
    attr = 'A class attribute'

picklestring = pickle.dumps(Foo)
@end example

These restrictions are why picklable functions and classes must be defined at
the top level of a module.

Similarly, when class instances are pickled, their class’s code and data are not
pickled along with them.  Only the instance data are pickled.  This is done on
purpose, so you can fix bugs in a class or add methods to the class and still
load objects that were created with an earlier version of the class.  If you
plan to have long-lived objects that will see many versions of a class, it may
be worthwhile to put a version number in the objects so that suitable
conversions can be made by the class’s @ref{bcd,,__setstate__()} method.

@node Pickling Class Instances,Custom Reduction for Types Functions and Other Objects,What can be pickled and unpickled?,pickle — Python object serialization
@anchor{library/pickle pickle-inst}@anchor{2d78}@anchor{library/pickle pickling-class-instances}@anchor{2d8f}
@subsubsection Pickling Class Instances


In this section, we describe the general mechanisms available to you to define,
customize, and control how class instances are pickled and unpickled.

In most cases, no additional code is needed to make instances picklable.  By
default, pickle will retrieve the class and the attributes of an instance via
introspection. When a class instance is unpickled, its @ref{8c1,,__init__()} method
is usually `not' invoked.  The default behaviour first creates an uninitialized
instance and then restores the saved attributes.  The following code shows an
implementation of this behaviour:

@example
def save(obj):
    return (obj.__class__, obj.__dict__)

def restore(cls, attributes):
    obj = cls.__new__(cls)
    obj.__dict__.update(attributes)
    return obj
@end example

Classes can alter the default behaviour by providing one or several special
methods:

@geindex __getnewargs_ex__() (object method)
@anchor{library/pickle object __getnewargs_ex__}@anchor{2d90}
@deffn {Method} object.__getnewargs_ex__ ()

In protocols 2 and newer, classes that implement the
@code{__getnewargs_ex__()} method can dictate the values passed to the
@ref{7a1,,__new__()} method upon unpickling.  The method must return a pair
@code{(args, kwargs)} where `args' is a tuple of positional arguments
and `kwargs' a dictionary of named arguments for constructing the
object.  Those will be passed to the @code{__new__()} method upon
unpickling.

You should implement this method if the @ref{7a1,,__new__()} method of your
class requires keyword-only arguments.  Otherwise, it is recommended for
compatibility to implement @ref{fda,,__getnewargs__()}.


Changed in version 3.6: @code{__getnewargs_ex__()} is now used in protocols 2 and 3.

@end deffn

@geindex __getnewargs__() (object method)
@anchor{library/pickle object __getnewargs__}@anchor{fda}
@deffn {Method} object.__getnewargs__ ()

This method serves a similar purpose as @ref{2d90,,__getnewargs_ex__()}, but
supports only positional arguments.  It must return a tuple of arguments
@code{args} which will be passed to the @ref{7a1,,__new__()} method upon unpickling.

@code{__getnewargs__()} will not be called if @ref{2d90,,__getnewargs_ex__()} is
defined.


Changed in version 3.6: Before Python 3.6, @code{__getnewargs__()} was called instead of
@ref{2d90,,__getnewargs_ex__()} in protocols 2 and 3.

@end deffn

@geindex __getstate__() (object method)
@anchor{library/pickle object __getstate__}@anchor{7f2}
@deffn {Method} object.__getstate__ ()

Classes can further influence how their instances are pickled by overriding
the method @code{__getstate__()}.  It is called and the returned object
is pickled as the contents for the instance, instead of a default state.
There are several cases:


@itemize *

@item 
For a class that has no instance @ref{77e,,__dict__} and no
@ref{16f7,,__slots__}, the default state is @code{None}.

@item 
For a class that has an instance @ref{77e,,__dict__} and no
@ref{16f7,,__slots__}, the default state is @code{self.__dict__}.

@item 
For a class that has an instance @ref{77e,,__dict__} and
@ref{16f7,,__slots__}, the default state is a tuple consisting of two
dictionaries:  @code{self.__dict__}, and a dictionary mapping slot
names to slot values.  Only slots that have a value are
included in the latter.

@item 
For a class that has @ref{16f7,,__slots__} and no instance
@ref{77e,,__dict__}, the default state is a tuple whose first item
is @code{None} and whose second item is a dictionary mapping slot names
to slot values described in the previous bullet.
@end itemize


Changed in version 3.11: Added the default implementation of the @code{__getstate__()} method in the
@ref{c84,,object} class.

@end deffn

@geindex __setstate__() (object method)
@anchor{library/pickle object __setstate__}@anchor{bcd}
@deffn {Method} object.__setstate__ (state)

Upon unpickling, if the class defines @code{__setstate__()}, it is called with
the unpickled state.  In that case, there is no requirement for the state
object to be a dictionary.  Otherwise, the pickled state must be a dictionary
and its items are assigned to the new instance’s dictionary.

@cartouche
@quotation Note 
If @ref{bcc,,__reduce__()} returns a state with value @code{None} at pickling,
the @code{__setstate__()} method will not be called upon unpickling.
@end quotation
@end cartouche
@end deffn

Refer to the section @ref{2d91,,Handling Stateful Objects} for more information about how to use
the methods @ref{7f2,,__getstate__()} and @ref{bcd,,__setstate__()}.

@cartouche
@quotation Note 
At unpickling time, some methods like @ref{6fb,,__getattr__()},
@ref{dd1,,__getattribute__()}, or @ref{23bf,,__setattr__()} may be called upon the
instance.  In case those methods rely on some internal invariant being
true, the type should implement @ref{7a1,,__new__()} to establish such an
invariant, as @ref{8c1,,__init__()} is not called when unpickling an
instance.
@end quotation
@end cartouche

@geindex copy; protocol

As we shall see, pickle does not use directly the methods described above.  In
fact, these methods are part of the copy protocol which implements the
@ref{bcc,,__reduce__()} special method.  The copy protocol provides a unified
interface for retrieving the data necessary for pickling and copying
objects. @footnote{
The @ref{29,,copy} module uses this protocol for shallow and deep copying
operations.
}

Although powerful, implementing @ref{bcc,,__reduce__()} directly in your classes is
error prone.  For this reason, class designers should use the high-level
interface (i.e., @ref{2d90,,__getnewargs_ex__()}, @ref{7f2,,__getstate__()} and
@ref{bcd,,__setstate__()}) whenever possible.  We will show, however, cases where
using @code{__reduce__()} is the only option or leads to more efficient pickling
or both.

@geindex __reduce__() (object method)
@anchor{library/pickle object __reduce__}@anchor{bcc}
@deffn {Method} object.__reduce__ ()

The interface is currently defined as follows.  The @code{__reduce__()} method
takes no argument and shall return either a string or preferably a tuple (the
returned object is often referred to as the “reduce value”).

If a string is returned, the string should be interpreted as the name of a
global variable.  It should be the object’s local name relative to its
module; the pickle module searches the module namespace to determine the
object’s module: for a given @code{obj} to be pickled, the @code{__module__}
attribute is looked up on @code{obj} directly, which falls back to a lookup
on the type of @code{obj} if no @code{__module__} instance attribute is set.
This behaviour is typically useful for singletons.

When a tuple is returned, it must be between two and six items long.
Optional items can either be omitted, or @code{None} can be provided as their
value.  The semantics of each item are in order:

@c XXX Mention __newobj__ special-case?


@itemize *

@item 
A callable object that will be called to create the initial version of the
object.

@item 
A tuple of arguments for the callable object.  An empty tuple must be given
if the callable does not accept any argument.

@item 
Optionally, the object’s state, which will be passed to the object’s
@ref{bcd,,__setstate__()} method as previously described.  If the object has no
such method then, the value must be a dictionary and it will be added to
the object’s @ref{77e,,__dict__} attribute.

@item 
Optionally, an iterator (and not a sequence) yielding successive items.
These items will be appended to the object either using
@code{obj.append(item)} or, in batch, using @code{obj.extend(list_of_items)}.
This is primarily used for list subclasses, but may be used by other
classes as long as they have @ref{241d,,append()}
and @ref{2420,,extend()} methods with
the appropriate signature.  (Whether @code{append()} or @code{extend()} is
used depends on which pickle protocol version is used as well as the number
of items to append, so both must be supported.)

@item 
Optionally, an iterator (not a sequence) yielding successive key-value
pairs.  These items will be stored to the object using @code{obj[key] =
value}.  This is primarily used for dictionary subclasses, but may be used
by other classes as long as they implement @ref{14d7,,__setitem__()}.

@item 
Optionally, a callable with a @code{(obj, state)} signature. This
callable allows the user to programmatically control the state-updating
behavior of a specific object, instead of using @code{obj}’s static
@ref{bcd,,__setstate__()} method. If not @code{None}, this callable will have
priority over @code{obj}’s @code{__setstate__()}.


Added in version 3.8: The optional sixth tuple item, @code{(obj, state)}, was added.

@end itemize
@end deffn

@geindex __reduce_ex__() (object method)
@anchor{library/pickle object __reduce_ex__}@anchor{19af}
@deffn {Method} object.__reduce_ex__ (protocol)

Alternatively, a @code{__reduce_ex__()} method may be defined.  The only
difference is this method should take a single integer argument, the protocol
version.  When defined, pickle will prefer it over the @ref{bcc,,__reduce__()}
method.  In addition, @code{__reduce__()} automatically becomes a synonym for
the extended version.  The main use for this method is to provide
backwards-compatible reduce values for older Python releases.
@end deffn

@menu
* Persistence of External Objects:: 
* Dispatch Tables:: 
* Handling Stateful Objects:: 

@end menu

@node Persistence of External Objects,Dispatch Tables,,Pickling Class Instances
@anchor{library/pickle persistence-of-external-objects}@anchor{2d92}@anchor{library/pickle pickle-persistent}@anchor{2d82}
@subsubsection Persistence of External Objects


@geindex persistent_id (pickle protocol)
@geindex persistent_load (pickle protocol)

For the benefit of object persistence, the @code{pickle} module supports the
notion of a reference to an object outside the pickled data stream.  Such
objects are referenced by a persistent ID, which should be either a string of
alphanumeric characters (for protocol 0) @footnote{
The limitation on alphanumeric characters is due to the fact
that persistent IDs in protocol 0 are delimited by the newline
character.  Therefore if any kind of newline characters occurs in
persistent IDs, the resulting pickled data will become unreadable.
} or just an arbitrary object (for
any newer protocol).

The resolution of such persistent IDs is not defined by the @code{pickle}
module; it will delegate this resolution to the user-defined methods on the
pickler and unpickler, @ref{1950,,persistent_id()} and
@ref{1958,,persistent_load()} respectively.

To pickle objects that have an external persistent ID, the pickler must have a
custom @ref{1950,,persistent_id()} method that takes an object as an
argument and returns either @code{None} or the persistent ID for that object.
When @code{None} is returned, the pickler simply pickles the object as normal.
When a persistent ID string is returned, the pickler will pickle that object,
along with a marker so that the unpickler will recognize it as a persistent ID.

To unpickle external objects, the unpickler must have a custom
@ref{1958,,persistent_load()} method that takes a persistent ID object and
returns the referenced object.

Here is a comprehensive example presenting how persistent ID can be used to
pickle external objects by reference.

@example
# Simple example presenting how persistent ID can be used to pickle
# external objects by reference.

import pickle
import sqlite3
from collections import namedtuple

# Simple class representing a record in our database.
MemoRecord = namedtuple("MemoRecord", "key, task")

class DBPickler(pickle.Pickler):

    def persistent_id(self, obj):
        # Instead of pickling MemoRecord as a regular class instance, we emit a
        # persistent ID.
        if isinstance(obj, MemoRecord):
            # Here, our persistent ID is simply a tuple, containing a tag and a
            # key, which refers to a specific record in the database.
            return ("MemoRecord", obj.key)
        else:
            # If obj does not have a persistent ID, return None. This means obj
            # needs to be pickled as usual.
            return None


class DBUnpickler(pickle.Unpickler):

    def __init__(self, file, connection):
        super().__init__(file)
        self.connection = connection

    def persistent_load(self, pid):
        # This method is invoked whenever a persistent ID is encountered.
        # Here, pid is the tuple returned by DBPickler.
        cursor = self.connection.cursor()
        type_tag, key_id = pid
        if type_tag == "MemoRecord":
            # Fetch the referenced record from the database and return it.
            cursor.execute("SELECT * FROM memos WHERE key=?", (str(key_id),))
            key, task = cursor.fetchone()
            return MemoRecord(key, task)
        else:
            # Always raises an error if you cannot return the correct object.
            # Otherwise, the unpickler will think None is the object referenced
            # by the persistent ID.
            raise pickle.UnpicklingError("unsupported persistent object")


def main():
    import io
    import pprint

    # Initialize and populate our database.
    conn = sqlite3.connect(":memory:")
    cursor = conn.cursor()
    cursor.execute("CREATE TABLE memos(key INTEGER PRIMARY KEY, task TEXT)")
    tasks = (
        'give food to fish',
        'prepare group meeting',
        'fight with a zebra',
        )
    for task in tasks:
        cursor.execute("INSERT INTO memos VALUES(NULL, ?)", (task,))

    # Fetch the records to be pickled.
    cursor.execute("SELECT * FROM memos")
    memos = [MemoRecord(key, task) for key, task in cursor]
    # Save the records using our custom DBPickler.
    file = io.BytesIO()
    DBPickler(file).dump(memos)

    print("Pickled records:")
    pprint.pprint(memos)

    # Update a record, just for good measure.
    cursor.execute("UPDATE memos SET task='learn italian' WHERE key=1")

    # Load the records from the pickle data stream.
    file.seek(0)
    memos = DBUnpickler(file, conn).load()

    print("Unpickled records:")
    pprint.pprint(memos)


if __name__ == '__main__':
    main()
@end example

@node Dispatch Tables,Handling Stateful Objects,Persistence of External Objects,Pickling Class Instances
@anchor{library/pickle dispatch-tables}@anchor{2d93}@anchor{library/pickle pickle-dispatch}@anchor{2d84}
@subsubsection Dispatch Tables


If one wants to customize pickling of some classes without disturbing
any other code which depends on pickling, then one can create a
pickler with a private dispatch table.

The global dispatch table managed by the @ref{2a,,copyreg} module is
available as @code{copyreg.dispatch_table}.  Therefore, one may
choose to use a modified copy of @code{copyreg.dispatch_table} as a
private dispatch table.

For example

@example
f = io.BytesIO()
p = pickle.Pickler(f)
p.dispatch_table = copyreg.dispatch_table.copy()
p.dispatch_table[SomeClass] = reduce_SomeClass
@end example

creates an instance of @ref{c19,,pickle.Pickler} with a private dispatch
table which handles the @code{SomeClass} class specially.  Alternatively,
the code

@example
class MyPickler(pickle.Pickler):
    dispatch_table = copyreg.dispatch_table.copy()
    dispatch_table[SomeClass] = reduce_SomeClass
f = io.BytesIO()
p = MyPickler(f)
@end example

does the same but all instances of @code{MyPickler} will by default
share the private dispatch table.  On the other hand, the code

@example
copyreg.pickle(SomeClass, reduce_SomeClass)
f = io.BytesIO()
p = pickle.Pickler(f)
@end example

modifies the global dispatch table shared by all users of the @ref{2a,,copyreg} module.

@node Handling Stateful Objects,,Dispatch Tables,Pickling Class Instances
@anchor{library/pickle handling-stateful-objects}@anchor{2d94}@anchor{library/pickle pickle-state}@anchor{2d91}
@subsubsection Handling Stateful Objects


@geindex __getstate__() (copy protocol)
@geindex __setstate__() (copy protocol)

Here’s an example that shows how to modify pickling behavior for a class.
The @code{TextReader} class below opens a text file, and returns the line number and
line contents each time its @code{readline()} method is called. If a
@code{TextReader} instance is pickled, all attributes `except' the file object
member are saved. When the instance is unpickled, the file is reopened, and
reading resumes from the last location. The @code{__setstate__()} and
@code{__getstate__()} methods are used to implement this behavior.

@example
class TextReader:
    """Print and number lines in a text file."""

    def __init__(self, filename):
        self.filename = filename
        self.file = open(filename)
        self.lineno = 0

    def readline(self):
        self.lineno += 1
        line = self.file.readline()
        if not line:
            return None
        if line.endswith('\n'):
            line = line[:-1]
        return "%i: %s" % (self.lineno, line)

    def __getstate__(self):
        # Copy the object's state from self.__dict__ which contains
        # all our instance attributes. Always use the dict.copy()
        # method to avoid modifying the original state.
        state = self.__dict__.copy()
        # Remove the unpicklable entries.
        del state['file']
        return state

    def __setstate__(self, state):
        # Restore instance attributes (i.e., filename and lineno).
        self.__dict__.update(state)
        # Restore the previously opened file's state. To do so, we need to
        # reopen it and read from it until the line count is restored.
        file = open(self.filename)
        for _ in range(self.lineno):
            file.readline()
        # Finally, save the file.
        self.file = file
@end example

A sample usage might be something like this:

@example
>>> reader = TextReader("hello.txt")
>>> reader.readline()
'1: Hello world!'
>>> reader.readline()
'2: I am line number two.'
>>> new_reader = pickle.loads(pickle.dumps(reader))
>>> new_reader.readline()
'3: Goodbye!'
@end example

@node Custom Reduction for Types Functions and Other Objects,Out-of-band Buffers,Pickling Class Instances,pickle — Python object serialization
@anchor{library/pickle custom-reduction-for-types-functions-and-other-objects}@anchor{2d95}@anchor{library/pickle reducer-override}@anchor{2d85}
@subsubsection Custom Reduction for Types, Functions, and Other Objects



Added in version 3.8.


Sometimes, @ref{132e,,dispatch_table} may not be flexible enough.
In particular we may want to customize pickling based on another criterion
than the object’s type, or we may want to customize the pickling of
functions and classes.

For those cases, it is possible to subclass from the @ref{c19,,Pickler} class and
implement a @ref{c1a,,reducer_override()} method. This method can return an
arbitrary reduction tuple (see @ref{bcc,,__reduce__()}). It can alternatively return
@ref{1a3,,NotImplemented} to fallback to the traditional behavior.

If both the @ref{132e,,dispatch_table} and
@ref{c1a,,reducer_override()} are defined, then
@code{reducer_override()} method takes priority.

@cartouche
@quotation Note 
For performance reasons, @ref{c1a,,reducer_override()} may not be
called for the following objects: @code{None}, @code{True}, @code{False}, and
exact instances of @ref{19c,,int}, @ref{197,,float}, @ref{193,,bytes},
@ref{16a,,str}, @ref{184,,dict}, @ref{185,,set}, @ref{7f3,,frozenset}, @ref{24f,,list}
and @ref{614,,tuple}.
@end quotation
@end cartouche

Here is a simple example where we allow pickling and reconstructing
a given class:

@example
import io
import pickle

class MyClass:
    my_attribute = 1

class MyPickler(pickle.Pickler):
    def reducer_override(self, obj):
        """Custom reducer for MyClass."""
        if getattr(obj, "__name__", None) == "MyClass":
            return type, (obj.__name__, obj.__bases__,
                          @{'my_attribute': obj.my_attribute@})
        else:
            # For any other object, fallback to usual reduction
            return NotImplemented

f = io.BytesIO()
p = MyPickler(f)
p.dump(MyClass)

del MyClass

unpickled_class = pickle.loads(f.getvalue())

assert isinstance(unpickled_class, type)
assert unpickled_class.__name__ == "MyClass"
assert unpickled_class.my_attribute == 1
@end example

@node Out-of-band Buffers,Restricting Globals,Custom Reduction for Types Functions and Other Objects,pickle — Python object serialization
@anchor{library/pickle out-of-band-buffers}@anchor{2d96}@anchor{library/pickle pickle-oob}@anchor{2d81}
@subsubsection Out-of-band Buffers



Added in version 3.8.


In some contexts, the @code{pickle} module is used to transfer massive amounts
of data.  Therefore, it can be important to minimize the number of memory
copies, to preserve performance and resource consumption.  However, normal
operation of the @code{pickle} module, as it transforms a graph-like structure
of objects into a sequential stream of bytes, intrinsically involves copying
data to and from the pickle stream.

This constraint can be eschewed if both the `provider' (the implementation
of the object types to be transferred) and the `consumer' (the implementation
of the communications system) support the out-of-band transfer facilities
provided by pickle protocol 5 and higher.

@menu
* Provider API:: 
* Consumer API:: 
* Example: Example<4>. 

@end menu

@node Provider API,Consumer API,,Out-of-band Buffers
@anchor{library/pickle provider-api}@anchor{2d97}
@subsubsection Provider API


The large data objects to be pickled must implement a @ref{19af,,__reduce_ex__()}
method specialized for protocol 5 and higher, which returns a
@ref{1797,,PickleBuffer} instance (instead of e.g. a @ref{193,,bytes} object)
for any large data.

A @ref{1797,,PickleBuffer} object `signals' that the underlying buffer is
eligible for out-of-band data transfer.  Those objects remain compatible
with normal usage of the @code{pickle} module.  However, consumers can also
opt-in to tell @code{pickle} that they will handle those buffers by
themselves.

@node Consumer API,Example<4>,Provider API,Out-of-band Buffers
@anchor{library/pickle consumer-api}@anchor{2d98}
@subsubsection Consumer API


A communications system can enable custom handling of the @ref{1797,,PickleBuffer}
objects generated when serializing an object graph.

On the sending side, it needs to pass a `buffer_callback' argument to
@ref{c19,,Pickler} (or to the @ref{2d7d,,dump()} or @ref{16b0,,dumps()} function), which
will be called with each @ref{1797,,PickleBuffer} generated while pickling
the object graph.  Buffers accumulated by the `buffer_callback' will not
see their data copied into the pickle stream, only a cheap marker will be
inserted.

On the receiving side, it needs to pass a `buffers' argument to
@ref{17ca,,Unpickler} (or to the @ref{f12,,load()} or @ref{f13,,loads()} function),
which is an iterable of the buffers which were passed to `buffer_callback'.
That iterable should produce buffers in the same order as they were passed
to `buffer_callback'.  Those buffers will provide the data expected by the
reconstructors of the objects whose pickling produced the original
@ref{1797,,PickleBuffer} objects.

Between the sending side and the receiving side, the communications system
is free to implement its own transfer mechanism for out-of-band buffers.
Potential optimizations include the use of shared memory or datatype-dependent
compression.

@node Example<4>,,Consumer API,Out-of-band Buffers
@anchor{library/pickle example}@anchor{2d99}
@subsubsection Example


Here is a trivial example where we implement a @ref{342,,bytearray} subclass
able to participate in out-of-band buffer pickling:

@example
class ZeroCopyByteArray(bytearray):

    def __reduce_ex__(self, protocol):
        if protocol >= 5:
            return type(self)._reconstruct, (PickleBuffer(self),), None
        else:
            # PickleBuffer is forbidden with pickle protocols <= 4.
            return type(self)._reconstruct, (bytearray(self),)

    @@classmethod
    def _reconstruct(cls, obj):
        with memoryview(obj) as m:
            # Get a handle over the original buffer object
            obj = m.obj
            if type(obj) is cls:
                # Original buffer object is a ZeroCopyByteArray, return it
                # as-is.
                return obj
            else:
                return cls(obj)
@end example

The reconstructor (the @code{_reconstruct} class method) returns the buffer’s
providing object if it has the right type.  This is an easy way to simulate
zero-copy behaviour on this toy example.

On the consumer side, we can pickle those objects the usual way, which
when unserialized will give us a copy of the original object:

@example
b = ZeroCopyByteArray(b"abc")
data = pickle.dumps(b, protocol=5)
new_b = pickle.loads(data)
print(b == new_b)  # True
print(b is new_b)  # False: a copy was made
@end example

But if we pass a `buffer_callback' and then give back the accumulated
buffers when unserializing, we are able to get back the original object:

@example
b = ZeroCopyByteArray(b"abc")
buffers = []
data = pickle.dumps(b, protocol=5, buffer_callback=buffers.append)
new_b = pickle.loads(data, buffers=buffers)
print(b == new_b)  # True
print(b is new_b)  # True: no copy was made
@end example

This example is limited by the fact that @ref{342,,bytearray} allocates its
own memory: you cannot create a @code{bytearray} instance that is backed
by another object’s memory.  However, third-party datatypes such as NumPy
arrays do not have this limitation, and allow use of zero-copy pickling
(or making as few copies as possible) when transferring between distinct
processes or systems.


@subsubheading See also


@geindex Python Enhancement Proposals; PEP 574
PEP 574@footnote{https://peps.python.org/pep-0574/} – Pickle protocol 5 with out-of-band data


@node Restricting Globals,Performance<2>,Out-of-band Buffers,pickle — Python object serialization
@anchor{library/pickle pickle-restrict}@anchor{2d8b}@anchor{library/pickle restricting-globals}@anchor{2d9a}
@subsubsection Restricting Globals


@geindex find_class() (pickle protocol)

By default, unpickling will import any class or function that it finds in the
pickle data.  For many applications, this behaviour is unacceptable as it
permits the unpickler to import and invoke arbitrary code.  Just consider what
this hand-crafted pickle data stream does when loaded:

@example
>>> import pickle
>>> pickle.loads(b"cos\nsystem\n(S'echo hello world'\ntR.")
hello world
0
@end example

In this example, the unpickler imports the @ref{1669,,os.system()} function and then
apply the string argument “echo hello world”.  Although this example is
inoffensive, it is not difficult to imagine one that could damage your system.

For this reason, you may want to control what gets unpickled by customizing
@ref{2d8a,,Unpickler.find_class()}.  Unlike its name suggests,
@code{Unpickler.find_class()} is called whenever a global (i.e., a class or
a function) is requested.  Thus it is possible to either completely forbid
globals or restrict them to a safe subset.

Here is an example of an unpickler allowing only few safe classes from the
@ref{13,,builtins} module to be loaded:

@example
import builtins
import io
import pickle

safe_builtins = @{
    'range',
    'complex',
    'set',
    'frozenset',
    'slice',
@}

class RestrictedUnpickler(pickle.Unpickler):

    def find_class(self, module, name):
        # Only allow safe classes from builtins.
        if module == "builtins" and name in safe_builtins:
            return getattr(builtins, name)
        # Forbid everything else.
        raise pickle.UnpicklingError("global '%s.%s' is forbidden" %
                                     (module, name))

def restricted_loads(s):
    """Helper function analogous to pickle.loads()."""
    return RestrictedUnpickler(io.BytesIO(s)).load()
@end example

A sample usage of our unpickler working as intended:

@example
>>> restricted_loads(pickle.dumps([1, 2, range(15)]))
[1, 2, range(0, 15)]
>>> restricted_loads(b"cos\nsystem\n(S'echo hello world'\ntR.")
Traceback (most recent call last):
  ...
pickle.UnpicklingError: global 'os.system' is forbidden
>>> restricted_loads(b'cbuiltins\neval\n'
...                  b'(S\'getattr(__import__("os"), "system")'
...                  b'("echo hello world")\'\ntR.')
Traceback (most recent call last):
  ...
pickle.UnpicklingError: global 'builtins.eval' is forbidden
@end example

@c XXX Add note about how extension codes could evade our protection
@c mechanism (e.g. cached classes do not invokes find_class()).

As our examples shows, you have to be careful with what you allow to be
unpickled.  Therefore if security is a concern, you may want to consider
alternatives such as the marshalling API in @ref{135,,xmlrpc.client} or
third-party solutions.

@node Performance<2>,Examples<7>,Restricting Globals,pickle — Python object serialization
@anchor{library/pickle performance}@anchor{2d9b}
@subsubsection Performance


Recent versions of the pickle protocol (from protocol 2 and upwards) feature
efficient binary encodings for several common features and built-in types.
Also, the @code{pickle} module has a transparent optimizer written in C.

@node Examples<7>,Command-line interface,Performance<2>,pickle — Python object serialization
@anchor{library/pickle examples}@anchor{2d9c}@anchor{library/pickle pickle-example}@anchor{2d9d}
@subsubsection Examples


For the simplest code, use the @ref{2d7d,,dump()} and @ref{f12,,load()} functions.

@example
import pickle

# An arbitrary collection of objects supported by pickle.
data = @{
    'a': [1, 2.0, 3+4j],
    'b': ("character string", b"byte string"),
    'c': @{None, True, False@}
@}

with open('data.pickle', 'wb') as f:
    # Pickle the 'data' dictionary using the highest protocol available.
    pickle.dump(data, f, pickle.HIGHEST_PROTOCOL)
@end example

The following example reads the resulting pickled data.

@example
import pickle

with open('data.pickle', 'rb') as f:
    # The protocol version used is detected automatically, so we do not
    # have to specify it.
    data = pickle.load(f)
@end example

@c XXX: Add examples showing how to optimize pickles for size (like using

@c pickletools.optimize() or the gzip module).

@node Command-line interface,,Examples<7>,pickle — Python object serialization
@anchor{library/pickle command-line-interface}@anchor{2d9e}@anchor{library/pickle pickle-cli}@anchor{2d9f}
@subsubsection Command-line interface


The @code{pickle} module can be invoked as a script from the command line,
it will display contents of the pickle files. However, when the pickle file
that you want to examine comes from an untrusted source, @code{-m pickletools}
is a safer option because it does not execute pickle bytecode, see
@ref{2da0,,pickletools CLI usage}.

@example
python -m pickle pickle_file [pickle_file ...]
@end example

The following option is accepted:

@geindex pickle command line option; pickle_file
@anchor{library/pickle cmdoption-pickle-arg-pickle_file}@anchor{2da1}
@deffn {Option} pickle_file

A pickle file to read, or @code{-} to indicate reading from standard input.
@end deffn


@subsubheading See also



@table @asis

@item Module @ref{2a,,copyreg}

Pickle interface constructor registration for extension types.

@item Module @ref{ac,,pickletools}

Tools for working with and analyzing pickled data.

@item Module @ref{c8,,shelve}

Indexed databases of objects; uses @code{pickle}.

@item Module @ref{29,,copy}

Shallow and deep object copying.

@item Module @ref{91,,marshal}

High-performance serialization of built-in types.
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node copyreg — Register pickle support functions,shelve — Python object persistence,pickle — Python object serialization,Data Persistence
@anchor{library/copyreg doc}@anchor{2da2}@anchor{library/copyreg copyreg-register-pickle-support-functions}@anchor{2da3}@anchor{library/copyreg module-copyreg}@anchor{2a}@anchor{library/copyreg translation-repo}@anchor{2da4}
@subsection @code{copyreg} — Register @code{pickle} support functions


@geindex module; copyreg

`Source code:' Lib/copyreg.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/copyreg.py}

@geindex module; pickle
@geindex module; copy


__________________________________________________________________


The @code{copyreg} module offers a way to define functions used while pickling
specific objects.  The @ref{ab,,pickle} and @ref{29,,copy} modules use those functions
when pickling/copying those objects.  The module provides configuration
information about object constructors which are not classes.
Such constructors may be factory functions or class instances.

@geindex constructor() (in module copyreg)
@anchor{library/copyreg copyreg constructor}@anchor{2da5}
@deffn {Function} copyreg.constructor (object)

Declares `object' to be a valid constructor.  If `object' is not callable (and
hence not valid as a constructor), raises @ref{199,,TypeError}.
@end deffn

@geindex pickle() (in module copyreg)
@anchor{library/copyreg copyreg pickle}@anchor{2d83}
@deffn {Function} copyreg.pickle (type, function, constructor_ob=None)

Declares that `function' should be used as a “reduction” function for objects
of type `type'.  `function' must return either a string or a tuple
containing between two and six elements. See the @ref{132e,,dispatch_table}
for more details on the interface of `function'.

The `constructor_ob' parameter is a legacy feature and is now ignored, but if
passed it must be a callable.

Note that the @ref{132e,,dispatch_table} attribute of a pickler
object or subclass of @ref{c19,,pickle.Pickler} can also be used for
declaring reduction functions.
@end deffn

@menu
* Example: Example<5>. 

@end menu

@node Example<5>,,,copyreg — Register pickle support functions
@anchor{library/copyreg example}@anchor{2da6}
@subsubsection Example


The example below would like to show how to register a pickle function and how
it will be used:

@example
>>> import copyreg, copy, pickle
>>> class C:
...     def __init__(self, a):
...         self.a = a
...
>>> def pickle_c(c):
...     print("pickling a C instance...")
...     return C, (c.a,)
...
>>> copyreg.pickle(C, pickle_c)
>>> c = C(1)
>>> d = copy.copy(c)
pickling a C instance...
>>> p = pickle.dumps(c)
pickling a C instance...
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node shelve — Python object persistence,marshal — Internal Python object serialization,copyreg — Register pickle support functions,Data Persistence
@anchor{library/shelve doc}@anchor{2da7}@anchor{library/shelve module-shelve}@anchor{c8}@anchor{library/shelve shelve-python-object-persistence}@anchor{2da8}@anchor{library/shelve translation-repo}@anchor{2da9}
@subsection @code{shelve} — Python object persistence


@geindex module; shelve

`Source code:' Lib/shelve.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/shelve.py}

@geindex module; pickle


__________________________________________________________________


A “shelf” is a persistent, dictionary-like object.  The difference with “dbm”
databases is that the values (not the keys!) in a shelf can be essentially
arbitrary Python objects — anything that the @ref{ab,,pickle} module can handle.
This includes most class instances, recursive data types, and objects containing
lots of shared  sub-objects.  The keys are ordinary strings.

@geindex open() (in module shelve)
@anchor{library/shelve shelve open}@anchor{1ab7}
@deffn {Function} shelve.open (filename, flag='c', protocol=None, writeback=False)

Open a persistent dictionary.  The filename specified is the base filename for
the underlying database.  As a side-effect, an extension may be added to the
filename and more than one file may be created.  By default, the underlying
database file is opened for reading and writing.  The optional `flag' parameter
has the same interpretation as the `flag' parameter of @ref{1132,,dbm.open()}.

By default, pickles created with @ref{a35,,pickle.DEFAULT_PROTOCOL} are used
to serialize values.  The version of the pickle protocol can be specified
with the `protocol' parameter.

Because of Python semantics, a shelf cannot know when a mutable
persistent-dictionary entry is modified.  By default modified objects are
written `only' when assigned to the shelf (see @ref{2daa,,Example}).  If the
optional `writeback' parameter is set to @code{True}, all entries accessed are also
cached in memory, and written back on @ref{2dab,,sync()} and
@ref{2dac,,close()}; this can make it handier to mutate mutable entries in
the persistent dictionary, but, if many entries are accessed, it can consume
vast amounts of memory for the cache, and it can make the close operation
very slow since all accessed entries are written back (there is no way to
determine which accessed entries are mutable, nor which ones were actually
mutated).


Changed in version 3.10: @ref{a35,,pickle.DEFAULT_PROTOCOL} is now used as the default pickle
protocol.



Changed in version 3.11: Accepts @ref{5a1,,path-like object} for filename.


@cartouche
@quotation Note 
Do not rely on the shelf being closed automatically; always call
@ref{2dac,,close()} explicitly when you don’t need it any more, or
use @code{shelve.open()} as a context manager:

@example
with shelve.open('spam') as db:
    db['eggs'] = 'eggs'
@end example
@end quotation
@end cartouche
@end deffn
@anchor{library/shelve shelve-security}@anchor{2dad}
@cartouche
@quotation Warning 
Because the @code{shelve} module is backed by @ref{ab,,pickle}, it is insecure
to load a shelf from an untrusted source.  Like with pickle, loading a shelf
can execute arbitrary code.
@end quotation
@end cartouche

Shelf objects support most of the methods and operations supported by dictionaries
(except copying, constructors and operators @code{|} and @code{|=}).  This eases the
transition from dictionary based scripts to those requiring persistent storage.

Two additional methods are supported:

@geindex sync() (shelve.Shelf method)
@anchor{library/shelve shelve Shelf sync}@anchor{2dab}
@deffn {Method} Shelf.sync ()

Write back all entries in the cache if the shelf was opened with `writeback'
set to @ref{e0d,,True}.  Also empty the cache and synchronize the persistent
dictionary on disk, if feasible.  This is called automatically when the shelf
is closed with @ref{2dac,,close()}.
@end deffn

@geindex close() (shelve.Shelf method)
@anchor{library/shelve shelve Shelf close}@anchor{2dac}
@deffn {Method} Shelf.close ()

Synchronize and close the persistent `dict' object.  Operations on a closed
shelf will fail with a @ref{2ee,,ValueError}.
@end deffn


@subsubheading See also


Persistent dictionary recipe@footnote{https://code.activestate.com/recipes/576642-persistent-dict-with-multiple-standard-file-format/}
with widely supported storage formats and having the speed of native
dictionaries.


@menu
* Restrictions:: 
* Example: Example<6>. 

@end menu

@node Restrictions,Example<6>,,shelve — Python object persistence
@anchor{library/shelve restrictions}@anchor{2dae}
@subsubsection Restrictions


@geindex module; dbm.ndbm
@geindex module; dbm.gnu


@itemize *

@item 
The choice of which database package will be used (such as @ref{38,,dbm.ndbm} or
@ref{37,,dbm.gnu}) depends on which interface is available.  Therefore it is not
safe to open the database directly using @ref{35,,dbm}.  The database is also
(unfortunately) subject to the limitations of @code{dbm}, if it is used —
this means that (the pickled representation of) the objects stored in the
database should be fairly small, and in rare cases key collisions may cause
the database to refuse updates.

@item 
The @code{shelve} module does not support `concurrent' read/write access to
shelved objects.  (Multiple simultaneous read accesses are safe.)  When a
program has a shelf open for writing, no other program should have it open for
reading or writing.  Unix file locking can be used to solve this, but this
differs across Unix versions and requires knowledge about the database
implementation used.

@item 
On macOS @ref{38,,dbm.ndbm} can silently corrupt the database file on updates,
which can cause hard crashes when trying to read from the database.
@end itemize

@geindex Shelf (class in shelve)
@anchor{library/shelve shelve Shelf}@anchor{11a1}
@deffn {Class} shelve.Shelf (dict, protocol=None, writeback=False, keyencoding='utf-8')

A subclass of @ref{12b8,,collections.abc.MutableMapping} which stores pickled
values in the `dict' object.

By default, pickles created with @ref{a35,,pickle.DEFAULT_PROTOCOL} are used
to serialize values.  The version of the pickle protocol can be specified
with the `protocol' parameter.  See the @ref{ab,,pickle} documentation for a
discussion of the pickle protocols.

If the `writeback' parameter is @code{True}, the object will hold a cache of all
entries accessed and write them back to the `dict' at sync and close times.
This allows natural operations on mutable entries, but can consume much more
memory and make sync and close take a long time.

The `keyencoding' parameter is the encoding used to encode keys before they
are used with the underlying dict.

A @code{Shelf} object can also be used as a context manager, in which
case it will be automatically closed when the @ref{187,,with} block ends.


Changed in version 3.2: Added the `keyencoding' parameter; previously, keys were always encoded in
UTF-8.



Changed in version 3.4: Added context manager support.



Changed in version 3.10: @ref{a35,,pickle.DEFAULT_PROTOCOL} is now used as the default pickle
protocol.

@end deffn

@geindex BsdDbShelf (class in shelve)
@anchor{library/shelve shelve BsdDbShelf}@anchor{2703}
@deffn {Class} shelve.BsdDbShelf (dict, protocol=None, writeback=False, keyencoding='utf-8')

A subclass of @ref{11a1,,Shelf} which exposes @code{first()}, @code{next()},
@code{previous()}, @code{last()} and @code{set_location()} methods.
These are available
in the third-party @code{bsddb} module from pybsddb@footnote{https://www.jcea.es/programacion/pybsddb.htm} but not in other database
modules.  The `dict' object passed to the constructor must support those
methods.  This is generally accomplished by calling one of
@code{bsddb.hashopen()}, @code{bsddb.btopen()} or @code{bsddb.rnopen()}.  The
optional `protocol', `writeback', and `keyencoding' parameters have the same
interpretation as for the @code{Shelf} class.
@end deffn

@geindex DbfilenameShelf (class in shelve)
@anchor{library/shelve shelve DbfilenameShelf}@anchor{2704}
@deffn {Class} shelve.DbfilenameShelf (filename, flag='c', protocol=None, writeback=False)

A subclass of @ref{11a1,,Shelf} which accepts a `filename' instead of a dict-like
object.  The underlying file will be opened using @ref{1132,,dbm.open()}.  By
default, the file will be created and opened for both read and write.  The
optional `flag' parameter has the same interpretation as for the @ref{1ab7,,open()}
function.  The optional `protocol' and `writeback' parameters have the same
interpretation as for the @code{Shelf} class.
@end deffn

@node Example<6>,,Restrictions,shelve — Python object persistence
@anchor{library/shelve example}@anchor{2daf}@anchor{library/shelve shelve-example}@anchor{2daa}
@subsubsection Example


To summarize the interface (@code{key} is a string, @code{data} is an arbitrary
object):

@example
import shelve

d = shelve.open(filename)  # open -- file may get suffix added by low-level
                           # library

d[key] = data              # store data at key (overwrites old data if
                           # using an existing key)
data = d[key]              # retrieve a COPY of data at key (raise KeyError
                           # if no such key)
del d[key]                 # delete data stored at key (raises KeyError
                           # if no such key)

flag = key in d            # true if the key exists
klist = list(d.keys())     # a list of all existing keys (slow!)

# as d was opened WITHOUT writeback=True, beware:
d['xx'] = [0, 1, 2]        # this works as expected, but...
d['xx'].append(3)          # *this doesn't!* -- d['xx'] is STILL [0, 1, 2]!

# having opened d without writeback=True, you need to code carefully:
temp = d['xx']             # extracts the copy
temp.append(5)             # mutates the copy
d['xx'] = temp             # stores the copy right back, to persist it

# or, d=shelve.open(filename,writeback=True) would let you just code
# d['xx'].append(5) and have it work as expected, BUT it would also
# consume more memory and make the d.close() operation slower.

d.close()                  # close it
@end example


@subsubheading See also



@table @asis

@item Module @ref{35,,dbm}

Generic interface to @code{dbm}-style databases.

@item Module @ref{ab,,pickle}

Object serialization used by @code{shelve}.
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node marshal — Internal Python object serialization,dbm — Interfaces to Unix “databases”,shelve — Python object persistence,Data Persistence
@anchor{library/marshal doc}@anchor{2db0}@anchor{library/marshal marshal-internal-python-object-serialization}@anchor{2db1}@anchor{library/marshal module-marshal}@anchor{91}@anchor{library/marshal translation-repo}@anchor{2db2}
@subsection @code{marshal} — Internal Python object serialization


@geindex module; marshal


__________________________________________________________________


This module contains functions that can read and write Python values in a binary
format.  The format is specific to Python, but independent of machine
architecture issues (e.g., you can write a Python value to a file on a PC,
transport the file to a Mac, and read it back there).  Details of the format are
undocumented on purpose; it may change between Python versions (although it
rarely does). @footnote{
The name of this module stems from a bit of terminology used by the designers of
Modula-3 (amongst others), who use the term “marshalling” for shipping of data
around in a self-contained form. Strictly speaking, “to marshal” means to
convert some data from internal to external form (in an RPC buffer for instance)
and “unmarshalling” for the reverse process.
}

@geindex module; pickle
@geindex module; shelve

This is not a general “persistence” module.  For general persistence and
transfer of Python objects through RPC calls, see the modules @ref{ab,,pickle} and
@ref{c8,,shelve}.  The @code{marshal} module exists mainly to support reading and
writing the “pseudo-compiled” code for Python modules of @code{.pyc} files.
Therefore, the Python maintainers reserve the right to modify the marshal format
in backward incompatible ways should the need arise.
The format of code objects is not compatible between Python versions,
even if the version of the format is the same.
De-serializing a code object in the incorrect Python version has undefined behavior.
If you’re serializing and
de-serializing Python objects, use the @code{pickle} module instead – the
performance is comparable, version independence is guaranteed, and pickle
supports a substantially wider range of objects than marshal.

@cartouche
@quotation Warning 
The @code{marshal} module is not intended to be secure against erroneous or
maliciously constructed data.  Never unmarshal data received from an
untrusted or unauthenticated source.
@end quotation
@end cartouche

There are functions that read/write files as well as functions operating on
bytes-like objects.

@geindex object; code
@geindex code object

Not all Python object types are supported; in general, only objects whose value
is independent from a particular invocation of Python can be written and read by
this module.  The following types are supported:


@itemize *

@item 
Numeric types: @ref{19c,,int}, @ref{3c1,,bool}, @ref{197,,float}, @ref{198,,complex}.

@item 
Strings (@ref{16a,,str}) and @ref{193,,bytes}.
@ref{194,,Bytes-like objects} like @ref{342,,bytearray} are
marshalled as @code{bytes}.

@item 
Containers: @ref{614,,tuple}, @ref{24f,,list}, @ref{185,,set}, @ref{7f3,,frozenset},
and (since @ref{2db3,,version} 5), @ref{695,,slice}.
It should be understood that these are supported only if the values contained
therein are themselves supported.
Recursive containers are supported since @code{version} 3.

@item 
The singletons @ref{887,,None}, @ref{236c,,Ellipsis} and @ref{dfb,,StopIteration}.

@item 
@ref{1b,,code} objects, if `allow_code' is true. See note above about
version dependence.
@end itemize


Changed in version 3.4: 


@itemize *

@item 
Added format version 3, which supports marshalling recursive lists, sets
and dictionaries.

@item 
Added format version 4, which supports efficient representations
of short strings.
@end itemize



Changed in version 3.14: Added format version 5, which allows marshalling slices.


The module defines these functions:

@geindex dump() (in module marshal)
@anchor{library/marshal marshal dump}@anchor{2db4}
@deffn {Function} marshal.dump (value, file, version=version, /, *, allow_code=True)

Write the value on the open file.  The value must be a supported type.  The
file must be a writeable @ref{20b2,,binary file}.

If the value has (or contains an object that has) an unsupported type, a
@ref{2ee,,ValueError} exception is raised — but garbage data will also be written
to the file.  The object will not be properly read back by @ref{1e39,,load()}.
@ref{4e7,,Code objects} are only supported if `allow_code' is true.

The `version' argument indicates the data format that @code{dump} should use
(see below).

Raises an @ref{1cb1,,auditing event} @code{marshal.dumps} with arguments @code{value}, @code{version}.


Changed in version 3.13: Added the `allow_code' parameter.

@end deffn

@geindex load() (in module marshal)
@anchor{library/marshal marshal load}@anchor{1e39}
@deffn {Function} marshal.load (file, /, *, allow_code=True)

Read one value from the open file and return it.  If no valid value is read
(e.g. because the data has a different Python version’s incompatible marshal
format), raise @ref{14e5,,EOFError}, @ref{2ee,,ValueError} or @ref{199,,TypeError}.
@ref{4e7,,Code objects} are only supported if `allow_code' is true.
The file must be a readable @ref{20b2,,binary file}.

Raises an @ref{1cb1,,auditing event} @code{marshal.load} with no arguments.

@cartouche
@quotation Note 
If an object containing an unsupported type was marshalled with @ref{2db4,,dump()},
@code{load()} will substitute @code{None} for the unmarshallable type.
@end quotation
@end cartouche


Changed in version 3.10: This call used to raise a @code{code.__new__} audit event for each code object. Now
it raises a single @code{marshal.load} event for the entire load operation.



Changed in version 3.13: Added the `allow_code' parameter.

@end deffn

@geindex dumps() (in module marshal)
@anchor{library/marshal marshal dumps}@anchor{10ab}
@deffn {Function} marshal.dumps (value, version=version, /, *, allow_code=True)

Return the bytes object that would be written to a file by @code{dump(value, file)}.  The
value must be a supported type.  Raise a @ref{2ee,,ValueError} exception if value
has (or contains an object that has) an unsupported type.
@ref{4e7,,Code objects} are only supported if `allow_code' is true.

The `version' argument indicates the data format that @code{dumps} should use
(see below).

Raises an @ref{1cb1,,auditing event} @code{marshal.dumps} with arguments @code{value}, @code{version}.


Changed in version 3.13: Added the `allow_code' parameter.

@end deffn

@geindex loads() (in module marshal)
@anchor{library/marshal marshal loads}@anchor{2db5}
@deffn {Function} marshal.loads (bytes, /, *, allow_code=True)

Convert the @ref{194,,bytes-like object} to a value.  If no valid value is found, raise
@ref{14e5,,EOFError}, @ref{2ee,,ValueError} or @ref{199,,TypeError}.
@ref{4e7,,Code objects} are only supported if `allow_code' is true.
Extra bytes in the input are ignored.

Raises an @ref{1cb1,,auditing event} @code{marshal.loads} with argument @code{bytes}.


Changed in version 3.10: This call used to raise a @code{code.__new__} audit event for each code object. Now
it raises a single @code{marshal.loads} event for the entire load operation.



Changed in version 3.13: Added the `allow_code' parameter.

@end deffn

In addition, the following constants are defined:

@geindex version (in module marshal)
@anchor{library/marshal marshal version}@anchor{2db3}
@deffn {Data} marshal.version

Indicates the format that the module uses.
Version 0 is the historical first version; subsequent versions
add new features.
Generally, a new version becomes the default when it is introduced.


@multitable {xxxxxxxxx} {xxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Version

@tab

Available since

@tab

New features

@item

1

@tab

Python 2.4

@tab

Sharing interned strings

@item

2

@tab

Python 2.5

@tab

Binary representation of floats

@item

3

@tab

Python 3.4

@tab

Support for object instancing and recursion

@item

4

@tab

Python 3.4

@tab

Efficient representation of short strings

@item

5

@tab

Python 3.14

@tab

Support for @ref{695,,slice} objects

@end multitable

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node dbm — Interfaces to Unix “databases”,sqlite3 — DB-API 2 0 interface for SQLite databases,marshal — Internal Python object serialization,Data Persistence
@anchor{library/dbm doc}@anchor{2db6}@anchor{library/dbm dbm-interfaces-to-unix-databases}@anchor{2db7}@anchor{library/dbm module-dbm}@anchor{35}@anchor{library/dbm translation-repo}@anchor{2db8}
@subsection @code{dbm} — Interfaces to Unix “databases”


@geindex module; dbm

`Source code:' Lib/dbm/__init__.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/dbm/__init__.py}


__________________________________________________________________


@code{dbm} is a generic interface to variants of the DBM database:


@itemize *

@item 
@ref{39,,dbm.sqlite3}

@item 
@ref{37,,dbm.gnu}

@item 
@ref{38,,dbm.ndbm}
@end itemize

If none of these modules are installed, the
slow-but-simple implementation in module @ref{36,,dbm.dumb} will be used.  There
is a third party interface@footnote{https://www.jcea.es/programacion/pybsddb.htm} to
the Oracle Berkeley DB.

@geindex error
@anchor{library/dbm dbm error}@anchor{2db9}
@deffn {Exception} dbm.error

A tuple containing the exceptions that can be raised by each of the supported
modules, with a unique exception also named @ref{2db9,,dbm.error} as the first
item — the latter is used when @code{dbm.error} is raised.
@end deffn

@geindex whichdb() (in module dbm)
@anchor{library/dbm dbm whichdb}@anchor{2dba}
@deffn {Function} dbm.whichdb (filename)

This function attempts to guess which of the several simple database modules
available — @ref{39,,dbm.sqlite3}, @ref{37,,dbm.gnu}, @ref{38,,dbm.ndbm},
or @ref{36,,dbm.dumb} — should be used to open a given file.

Return one of the following values:


@itemize *

@item 
@code{None} if the file can’t be opened because it’s unreadable or doesn’t exist

@item 
the empty string (@code{'@w{'}}) if the file’s format can’t be guessed

@item 
a string containing the required module name, such as @code{'dbm.ndbm'} or @code{'dbm.gnu'}
@end itemize


Changed in version 3.11: `filename' accepts a @ref{5a1,,path-like object}.

@end deffn

@c Substitutions for the open() flag param docs;
@c all submodules use the same text.

@geindex open() (in module dbm)
@anchor{library/dbm dbm open}@anchor{1132}
@deffn {Function} dbm.open (file, flag='r', mode=0o666)

Open a database and return the corresponding database object.

@*Parameters: 

@itemize *

@item 
@code{file} (@ref{5a1,,path-like object}) – 
The database file to open.

If the database file already exists, the @ref{2dba,,whichdb()} function is used to
determine its type and the appropriate module is used; if it does not exist,
the first submodule listed above that can be imported is used.


@item 
@code{flag} (@ref{16a,,str}) – 

@itemize *

@item 
@code{'r'} (default): Open existing database for reading only.

@item 
@code{'w'}: Open existing database for reading and writing.

@item 
@code{'c'}: Open database for reading and writing, creating it if it doesn’t exist.

@item 
@code{'n'}: Always create a new, empty database, open for reading and writing.
@end itemize


@item 
@code{mode} (@ref{19c,,int}) – The Unix file access mode of the file (default: octal @code{0o666}),
used only when the database has to be created.
@end itemize



Changed in version 3.11: `file' accepts a @ref{5a1,,path-like object}.

@end deffn

The object returned by @ref{1132,,open()} supports the basic
functionality of mutable @ref{13c7,,mappings};
keys and their corresponding values can be stored, retrieved, and
deleted, and iteration, the @ref{349,,in} operator and methods @code{keys()},
@code{get()}, @code{setdefault()} and @code{clear()} are available.
The @code{keys()} method returns a list instead of a view object.
The @code{setdefault()} method requires two arguments.

Key and values are always stored as @ref{193,,bytes}. This means that when
strings are used they are implicitly converted to the default encoding before
being stored.

These objects also support being used in a @ref{187,,with} statement, which
will automatically close them when done.


Changed in version 3.2: @code{get()} and @code{setdefault()} methods are now available for all
@code{dbm} backends.



Changed in version 3.4: Added native support for the context management protocol to the objects
returned by @ref{1132,,open()}.



Changed in version 3.8: Deleting a key from a read-only database raises a database module specific exception
instead of @ref{5e7,,KeyError}.



Changed in version 3.13: @code{clear()} methods are now available for all @code{dbm} backends.


The following example records some hostnames and a corresponding title,  and
then prints out the contents of the database:

@example
import dbm

# Open database, creating it if necessary.
with dbm.open('cache', 'c') as db:

    # Record some values
    db[b'hello'] = b'there'
    db['www.python.org'] = 'Python Website'
    db['www.cnn.com'] = 'Cable News Network'

    # Note that the keys are considered bytes now.
    assert db[b'www.python.org'] == b'Python Website'
    # Notice how the value is now in bytes.
    assert db['www.cnn.com'] == b'Cable News Network'

    # Often-used methods of the dict interface work too.
    print(db.get('python.org', b'not present'))

    # Storing a non-string key or value will raise an exception (most
    # likely a TypeError).
    db['www.yahoo.com'] = 4

# db is automatically closed when leaving the with statement.
@end example


@subsubheading See also



@table @asis

@item Module @ref{c8,,shelve}

Persistence module which stores non-string data.
@end table


The individual submodules are described in the following sections.

@menu
* dbm.sqlite3 — SQLite backend for dbm: dbm sqlite3 — SQLite backend for dbm. 
* dbm.gnu — GNU database manager: dbm gnu — GNU database manager. 
* dbm.ndbm — New Database Manager: dbm ndbm — New Database Manager. 
* dbm.dumb — Portable DBM implementation: dbm dumb — Portable DBM implementation. 

@end menu

@node dbm sqlite3 — SQLite backend for dbm,dbm gnu — GNU database manager,,dbm — Interfaces to Unix “databases”
@anchor{library/dbm dbm-sqlite3-sqlite-backend-for-dbm}@anchor{2dbb}@anchor{library/dbm module-dbm sqlite3}@anchor{39}
@subsubsection @code{dbm.sqlite3} — SQLite backend for dbm


@geindex module; dbm.sqlite3


Added in version 3.13.


`Source code:' Lib/dbm/sqlite3.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/dbm/sqlite3.py}


__________________________________________________________________


This module uses the standard library @ref{d4,,sqlite3} module to provide an
SQLite backend for the @code{dbm} module.
The files created by @code{dbm.sqlite3} can thus be opened by @code{sqlite3},
or any other SQLite browser, including the SQLite CLI.

@c include for modules that don't work on WASM

@ref{2181,,Availability}: not WASI.

This module does not work or is not available on WebAssembly. See
@ref{1bae,,WebAssembly platforms} for more information.

@geindex open() (in module dbm.sqlite3)
@anchor{library/dbm dbm sqlite3 open}@anchor{2dbc}
@deffn {Function} dbm.sqlite3.open (filename, /, flag='r', mode=0o666)

Open an SQLite database.

@*Parameters: 

@itemize *

@item 
@code{filename} (@ref{5a1,,path-like object}) – The path to the database to be opened.

@item 
@code{flag} (@ref{16a,,str}) – 

@itemize *

@item 
@code{'r'} (default): Open existing database for reading only.

@item 
@code{'w'}: Open existing database for reading and writing.

@item 
@code{'c'}: Open database for reading and writing, creating it if it doesn’t exist.

@item 
@code{'n'}: Always create a new, empty database, open for reading and writing.
@end itemize


@item 
@code{mode} – The Unix file access mode of the file (default: octal @code{0o666}),
used only when the database has to be created.
@end itemize


The returned database object behaves similar to a mutable @ref{13c7,,mapping},
but the @code{keys()} method returns a list, and
the @code{setdefault()} method requires two arguments.
It also supports a “closing” context manager via the @ref{187,,with} keyword.

The following method is also provided:

@geindex close() (dbm.sqlite3.sqlite3 method)
@anchor{library/dbm dbm sqlite3 sqlite3 close}@anchor{2dbd}
@deffn {Method} sqlite3.close ()

Close the SQLite database.
@end deffn
@end deffn

@node dbm gnu — GNU database manager,dbm ndbm — New Database Manager,dbm sqlite3 — SQLite backend for dbm,dbm — Interfaces to Unix “databases”
@anchor{library/dbm dbm-gnu-gnu-database-manager}@anchor{2dbe}@anchor{library/dbm module-dbm gnu}@anchor{37}
@subsubsection @code{dbm.gnu} — GNU database manager


@geindex module; dbm.gnu

`Source code:' Lib/dbm/gnu.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/dbm/gnu.py}


__________________________________________________________________


The @code{dbm.gnu} module provides an interface to the @abbr{GDBM,GNU dbm}
library, similar to the @ref{38,,dbm.ndbm} module, but with additional
functionality like crash tolerance.

@cartouche
@quotation Note 
The file formats created by @code{dbm.gnu} and @ref{38,,dbm.ndbm} are incompatible
and can not be used interchangeably.
@end quotation
@end cartouche

@c include for modules that don't work on WASM or mobile platforms

@ref{2181,,Availability}: not Android, not iOS, not WASI.

This module is not supported on @ref{22a0,,mobile platforms}
or @ref{1bae,,WebAssembly platforms}.

@ref{2181,,Availability}: Unix.

@geindex error
@anchor{library/dbm dbm gnu error}@anchor{c97}
@deffn {Exception} dbm.gnu.error

Raised on @code{dbm.gnu}-specific errors, such as I/O errors. @ref{5e7,,KeyError} is
raised for general mapping errors like specifying an incorrect key.
@end deffn

@geindex open_flags (in module dbm.gnu)
@anchor{library/dbm dbm gnu open_flags}@anchor{2dbf}
@deffn {Data} dbm.gnu.open_flags

A string of characters the `flag' parameter of @ref{1e62,,open()} supports.
@end deffn

@geindex open() (in module dbm.gnu)
@anchor{library/dbm dbm gnu open}@anchor{1e62}
@deffn {Function} dbm.gnu.open (filename, flag='r', mode=0o666, /)

Open a GDBM database and return a @code{gdbm} object.

@*Parameters: 

@itemize *

@item 
@code{filename} (@ref{5a1,,path-like object}) – The database file to open.

@item 
@code{flag} (@ref{16a,,str}) – 

@itemize *

@item 
@code{'r'} (default): Open existing database for reading only.

@item 
@code{'w'}: Open existing database for reading and writing.

@item 
@code{'c'}: Open database for reading and writing, creating it if it doesn’t exist.

@item 
@code{'n'}: Always create a new, empty database, open for reading and writing.
@end itemize

The following additional characters may be appended
to control how the database is opened:


@itemize *

@item 
@code{'f'}: Open the database in fast mode.
Writes to the database will not be synchronized.

@item 
@code{'s'}: Synchronized mode.
Changes to the database will be written immediately to the file.

@item 
@code{'u'}: Do not lock database.
@end itemize

Not all flags are valid for all versions of GDBM.
See the @ref{2dbf,,open_flags} member for a list of supported flag characters.


@item 
@code{mode} (@ref{19c,,int}) – The Unix file access mode of the file (default: octal @code{0o666}),
used only when the database has to be created.
@end itemize


@*Raises: 
@ref{c97,,error} – If an invalid `flag' argument is passed.



Changed in version 3.11: `filename' accepts a @ref{5a1,,path-like object}.


@code{gdbm} objects behave similar to mutable @ref{13c7,,mappings},
but methods @code{items()}, @code{values()}, @code{pop()}, @code{popitem()},
and @code{update()} are not supported,
the @code{keys()} method returns a list, and
the @code{setdefault()} method requires two arguments.
It also supports a “closing” context manager via the @ref{187,,with} keyword.


Changed in version 3.2: Added the @code{get()} and @code{setdefault()} methods.



Changed in version 3.13: Added the @code{clear()} method.


The following methods are also provided:

@geindex close() (dbm.gnu.gdbm method)
@anchor{library/dbm dbm gnu gdbm close}@anchor{2dc0}
@deffn {Method} gdbm.close ()

Close the GDBM database.
@end deffn

@geindex firstkey() (dbm.gnu.gdbm method)
@anchor{library/dbm dbm gnu gdbm firstkey}@anchor{2dc1}
@deffn {Method} gdbm.firstkey ()

It’s possible to loop over every key in the database using this method  and the
@ref{2dc2,,nextkey()} method.  The traversal is ordered by GDBM’s internal
hash values, and won’t be sorted by the key values.  This method returns
the starting key.
@end deffn

@geindex nextkey() (dbm.gnu.gdbm method)
@anchor{library/dbm dbm gnu gdbm nextkey}@anchor{2dc2}
@deffn {Method} gdbm.nextkey (key)

Returns the key that follows `key' in the traversal.  The following code prints
every key in the database @code{db}, without having to create a list in memory that
contains them all:

@example
k = db.firstkey()
while k is not None:
    print(k)
    k = db.nextkey(k)
@end example
@end deffn

@geindex reorganize() (dbm.gnu.gdbm method)
@anchor{library/dbm dbm gnu gdbm reorganize}@anchor{2dc3}
@deffn {Method} gdbm.reorganize ()

If you have carried out a lot of deletions and would like to shrink the space
used by the GDBM file, this routine will reorganize the database.  @code{gdbm}
objects will not shorten the length of a database file except by using this
reorganization; otherwise, deleted file space will be kept and reused as new
(key, value) pairs are added.
@end deffn

@geindex sync() (dbm.gnu.gdbm method)
@anchor{library/dbm dbm gnu gdbm sync}@anchor{2dc4}
@deffn {Method} gdbm.sync ()

When the database has been opened in fast mode, this method forces any
unwritten data to be written to the disk.
@end deffn
@end deffn

@node dbm ndbm — New Database Manager,dbm dumb — Portable DBM implementation,dbm gnu — GNU database manager,dbm — Interfaces to Unix “databases”
@anchor{library/dbm dbm-ndbm-new-database-manager}@anchor{2dc5}@anchor{library/dbm module-dbm ndbm}@anchor{38}
@subsubsection @code{dbm.ndbm} — New Database Manager


@geindex module; dbm.ndbm

`Source code:' Lib/dbm/ndbm.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/dbm/ndbm.py}


__________________________________________________________________


The @code{dbm.ndbm} module provides an interface to the
@abbr{NDBM,New Database Manager} library.
This module can be used with the “classic” NDBM interface or the
@abbr{GDBM} compatibility interface.

@cartouche
@quotation Note 
The file formats created by @ref{37,,dbm.gnu} and @code{dbm.ndbm} are incompatible
and can not be used interchangeably.
@end quotation
@end cartouche

@cartouche
@quotation Warning 
The NDBM library shipped as part of macOS has an undocumented limitation on the
size of values, which can result in corrupted database files
when storing values larger than this limit. Reading such corrupted files can
result in a hard crash (segmentation fault).
@end quotation
@end cartouche

@c include for modules that don't work on WASM or mobile platforms

@ref{2181,,Availability}: not Android, not iOS, not WASI.

This module is not supported on @ref{22a0,,mobile platforms}
or @ref{1bae,,WebAssembly platforms}.

@ref{2181,,Availability}: Unix.

@geindex error
@anchor{library/dbm dbm ndbm error}@anchor{c98}
@deffn {Exception} dbm.ndbm.error

Raised on @code{dbm.ndbm}-specific errors, such as I/O errors. @ref{5e7,,KeyError} is raised
for general mapping errors like specifying an incorrect key.
@end deffn

@geindex library (in module dbm.ndbm)
@anchor{library/dbm dbm ndbm library}@anchor{2dc6}
@deffn {Data} dbm.ndbm.library

Name of the NDBM implementation library used.
@end deffn

@geindex open() (in module dbm.ndbm)
@anchor{library/dbm dbm ndbm open}@anchor{1e63}
@deffn {Function} dbm.ndbm.open (filename, flag='r', mode=0o666, /)

Open an NDBM database and return an @code{ndbm} object.

@*Parameters: 

@itemize *

@item 
@code{filename} (@ref{5a1,,path-like object}) – The basename of the database file
(without the @code{.dir} or @code{.pag} extensions).

@item 
@code{flag} (@ref{16a,,str}) – 

@itemize *

@item 
@code{'r'} (default): Open existing database for reading only.

@item 
@code{'w'}: Open existing database for reading and writing.

@item 
@code{'c'}: Open database for reading and writing, creating it if it doesn’t exist.

@item 
@code{'n'}: Always create a new, empty database, open for reading and writing.
@end itemize


@item 
@code{mode} (@ref{19c,,int}) – The Unix file access mode of the file (default: octal @code{0o666}),
used only when the database has to be created.
@end itemize



Changed in version 3.11: Accepts @ref{5a1,,path-like object} for filename.


@code{ndbm} objects behave similar to mutable @ref{13c7,,mappings},
but methods @code{items()}, @code{values()}, @code{pop()}, @code{popitem()},
and @code{update()} are not supported,
the @code{keys()} method returns a list, and
the @code{setdefault()} method requires two arguments.
It also supports a “closing” context manager via the @ref{187,,with} keyword.


Changed in version 3.2: Added the @code{get()} and @code{setdefault()} methods.



Changed in version 3.13: Added the @code{clear()} method.


The following method is also provided:

@geindex close() (dbm.ndbm.ndbm method)
@anchor{library/dbm dbm ndbm ndbm close}@anchor{2dc7}
@deffn {Method} ndbm.close ()

Close the NDBM database.
@end deffn
@end deffn

@node dbm dumb — Portable DBM implementation,,dbm ndbm — New Database Manager,dbm — Interfaces to Unix “databases”
@anchor{library/dbm dbm-dumb-portable-dbm-implementation}@anchor{2dc8}@anchor{library/dbm module-dbm dumb}@anchor{36}
@subsubsection @code{dbm.dumb} — Portable DBM implementation


@geindex module; dbm.dumb

`Source code:' Lib/dbm/dumb.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/dbm/dumb.py}

@geindex databases

@cartouche
@quotation Note 
The @code{dbm.dumb} module is intended as a last resort fallback for the
@code{dbm} module when a more robust module is not available. The @code{dbm.dumb}
module is not written for speed and is not nearly as heavily used as the other
database modules.
@end quotation
@end cartouche


__________________________________________________________________


The @code{dbm.dumb} module provides a persistent @ref{184,,dict}-like
interface which is written entirely in Python.
Unlike other @code{dbm} backends, such as @ref{37,,dbm.gnu}, no
external library is required.

The @code{dbm.dumb} module defines the following:

@geindex error
@anchor{library/dbm dbm dumb error}@anchor{c96}
@deffn {Exception} dbm.dumb.error

Raised on @code{dbm.dumb}-specific errors, such as I/O errors.  @ref{5e7,,KeyError} is
raised for general mapping errors like specifying an incorrect key.
@end deffn

@geindex open() (in module dbm.dumb)
@anchor{library/dbm dbm dumb open}@anchor{c93}
@deffn {Function} dbm.dumb.open (filename, flag='c', mode=0o666)

Open a @code{dbm.dumb} database.

@*Parameters: 

@itemize *

@item 
@code{filename} – 
The basename of the database file (without extensions).
A new database creates the following files:


@itemize -

@item 
@code{`filename'.dat}

@item 
@code{`filename'.dir}
@end itemize


@item 
@code{flag} (@ref{16a,,str}) – 

@itemize *

@item 
@code{'r'}: Open existing database for reading only.

@item 
@code{'w'}: Open existing database for reading and writing.

@item 
@code{'c'} (default): Open database for reading and writing, creating it if it doesn’t exist.

@item 
@code{'n'}: Always create a new, empty database, open for reading and writing.
@end itemize


@item 
@code{mode} (@ref{19c,,int}) – The Unix file access mode of the file (default: octal @code{0o666}),
used only when the database has to be created.
@end itemize


@cartouche
@quotation Warning 
It is possible to crash the Python interpreter when loading a database
with a sufficiently large/complex entry due to stack depth limitations in
Python’s AST compiler.
@end quotation
@end cartouche


Changed in version 3.5: @code{open()} always creates a new database when `flag' is @code{'n'}.



Changed in version 3.8: A database opened read-only if `flag' is @code{'r'}.
A database is not created if it does not exist if `flag' is @code{'r'} or @code{'w'}.



Changed in version 3.11: `filename' accepts a @ref{5a1,,path-like object}.


The returned database object behaves similar to a mutable @ref{13c7,,mapping},
but the @code{keys()} and @code{items()} methods return lists, and
the @code{setdefault()} method requires two arguments.
It also supports a “closing” context manager via the @ref{187,,with} keyword.

The following methods are also provided:

@geindex close() (dbm.dumb.dumbdbm method)
@anchor{library/dbm dbm dumb dumbdbm close}@anchor{2dc9}
@deffn {Method} dumbdbm.close ()

Close the database.
@end deffn

@geindex sync() (dbm.dumb.dumbdbm method)
@anchor{library/dbm dbm dumb dumbdbm sync}@anchor{2dca}
@deffn {Method} dumbdbm.sync ()

Synchronize the on-disk directory and data files.  This method is called
by the @ref{2dab,,shelve.Shelf.sync()} method.
@end deffn
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node sqlite3 — DB-API 2 0 interface for SQLite databases,,dbm — Interfaces to Unix “databases”,Data Persistence
@anchor{library/sqlite3 doc}@anchor{2dcb}@anchor{library/sqlite3 module-sqlite3}@anchor{d4}@anchor{library/sqlite3 sqlite3-db-api-2-0-interface-for-sqlite-databases}@anchor{2dcc}@anchor{library/sqlite3 translation-repo}@anchor{2dcd}
@subsection @code{sqlite3} — DB-API 2.0 interface for SQLite databases


@geindex module; sqlite3

`Source code:' Lib/sqlite3/@footnote{https://github.com/python/cpython/tree/3.14/Lib/sqlite3/}

@c Make sure we always doctest the tutorial with an empty database.

@c import sqlite3
@c src = sqlite3.connect(":memory:", isolation_level=None)
@c dst = sqlite3.connect("tutorial.db", isolation_level=None)
@c src.backup(dst)
@c src.close()
@c dst.close()
@c del src, dst
@anchor{library/sqlite3 sqlite3-intro}@anchor{2dce}
SQLite is a C library that provides a lightweight disk-based database that
doesn’t require a separate server process and allows accessing the database
using a nonstandard variant of the SQL query language. Some applications can use
SQLite for internal data storage.  It’s also possible to prototype an
application using SQLite and then port the code to a larger database such as
PostgreSQL or Oracle.

The @code{sqlite3} module was written by Gerhard Häring.  It provides an SQL interface
compliant with the DB-API 2.0 specification described by 
@geindex Python Enhancement Proposals; PEP 249
PEP 249@footnote{https://peps.python.org/pep-0249/}, and
requires the third-party SQLite@footnote{https://sqlite.org/} library.

This is an @ref{219c,,optional module}.
If it is missing from your copy of CPython,
look for documentation from your distributor (that is,
whoever provided Python to you).
If you are the distributor, see @ref{219a,,Requirements for optional modules}.

@c Similar notes appear in the docs of the modules:
@c - zipfile
@c - tarfile

This document includes four main sections:


@itemize *

@item 
@ref{2dcf,,Tutorial} teaches how to use the @code{sqlite3} module.

@item 
@ref{2dd0,,Reference} describes the classes and functions this module
defines.

@item 
@ref{2dd1,,How-to guides} details how to handle specific tasks.

@item 
@ref{2dd2,,Explanation} provides in-depth background on
transaction control.
@end itemize


@subsubheading See also



@table @asis

@item @indicateurl{https://www.sqlite.org}

The SQLite web page; the documentation describes the syntax and the
available data types for the supported SQL dialect.

@item @indicateurl{https://www.w3schools.com/sql/}

Tutorial, reference and examples for learning SQL syntax.

@geindex Python Enhancement Proposals; PEP 249

@item PEP 249@footnote{https://peps.python.org/pep-0249/} - Database API Specification 2.0

PEP written by Marc-André Lemburg.
@end table


@c We use the following practices for SQL code:
@c - UPPERCASE for keywords
@c - snake_case for schema
@c - single quotes for string literals
@c - singular for table names
@c - if needed, use double quotes for table and column names

@menu
* Tutorial:: 
* Reference:: 
* How-to guides:: 
* Explanation:: 

@end menu

@node Tutorial,Reference,,sqlite3 — DB-API 2 0 interface for SQLite databases
@anchor{library/sqlite3 sqlite3-tutorial}@anchor{2dcf}@anchor{library/sqlite3 tutorial}@anchor{2dd3}
@subsubsection Tutorial


In this tutorial, you will create a database of Monty Python movies
using basic @code{sqlite3} functionality.
It assumes a fundamental understanding of database concepts,
including cursors@footnote{https://en.wikipedia.org/wiki/Cursor_(databases)} and transactions@footnote{https://en.wikipedia.org/wiki/Database_transaction}.

First, we need to create a new database and open
a database connection to allow @code{sqlite3} to work with it.
Call @ref{5a6,,sqlite3.connect()} to create a connection to
the database @code{tutorial.db} in the current working directory,
implicitly creating it if it does not exist:

@example
import sqlite3
con = sqlite3.connect("tutorial.db")
@end example

The returned @ref{54e,,Connection} object @code{con}
represents the connection to the on-disk database.

In order to execute SQL statements and fetch results from SQL queries,
we will need to use a database cursor.
Call @ref{2dd4,,con.cursor()} to create the @ref{2dd5,,Cursor}:

@example
cur = con.cursor()
@end example

Now that we’ve got a database connection and a cursor,
we can create a database table @code{movie} with columns for title,
release year, and review score.
For simplicity, we can just use column names in the table declaration –
thanks to the flexible typing@footnote{https://www.sqlite.org/flextypegood.html} feature of SQLite,
specifying the data types is optional.
Execute the @code{CREATE TABLE} statement
by calling @ref{5b0,,cur.execute(...)}:

@example
cur.execute("CREATE TABLE movie(title, year, score)")
@end example

@c Ideally, we'd use sqlite_schema instead of sqlite_master below,
@c but SQLite versions older than 3.33.0 do not recognise that variant.

We can verify that the new table has been created by querying
the @code{sqlite_master} table built-in to SQLite,
which should now contain an entry for the @code{movie} table definition
(see The Schema Table@footnote{https://www.sqlite.org/schematab.html} for details).
Execute that query by calling @ref{5b0,,cur.execute(...)},
assign the result to @code{res},
and call @ref{2dd6,,res.fetchone()} to fetch the resulting row:

@example
>>> res = cur.execute("SELECT name FROM sqlite_master")
>>> res.fetchone()
('movie',)
@end example

We can see that the table has been created,
as the query returns a @ref{614,,tuple} containing the table’s name.
If we query @code{sqlite_master} for a non-existent table @code{spam},
@code{res.fetchone()} will return @code{None}:

@example
>>> res = cur.execute("SELECT name FROM sqlite_master WHERE name='spam'")
>>> res.fetchone() is None
True
@end example

Now, add two rows of data supplied as SQL literals
by executing an @code{INSERT} statement,
once again by calling @ref{5b0,,cur.execute(...)}:

@example
cur.execute("""
    INSERT INTO movie VALUES
        ('Monty Python and the Holy Grail', 1975, 8.2),
        ('And Now for Something Completely Different', 1971, 7.5)
""")
@end example

The @code{INSERT} statement implicitly opens a transaction,
which needs to be committed before changes are saved in the database
(see @ref{2dd7,,Transaction control} for details).
Call @ref{2dd8,,con.commit()} on the connection object
to commit the transaction:

@example
con.commit()
@end example

We can verify that the data was inserted correctly
by executing a @code{SELECT} query.
Use the now-familiar @ref{5b0,,cur.execute(...)} to
assign the result to @code{res},
and call @ref{2dd9,,res.fetchall()} to return all resulting rows:

@example
>>> res = cur.execute("SELECT score FROM movie")
>>> res.fetchall()
[(8.2,), (7.5,)]
@end example

The result is a @ref{24f,,list} of two @code{tuple}s, one per row,
each containing that row’s @code{score} value.

Now, insert three more rows by calling
@ref{5b1,,cur.executemany(...)}:

@example
data = [
    ("Monty Python Live at the Hollywood Bowl", 1982, 7.9),
    ("Monty Python's The Meaning of Life", 1983, 7.5),
    ("Monty Python's Life of Brian", 1979, 8.0),
]
cur.executemany("INSERT INTO movie VALUES(?, ?, ?)", data)
con.commit()  # Remember to commit the transaction after executing INSERT.
@end example

Notice that @code{?} placeholders are used to bind @code{data} to the query.
Always use placeholders instead of @ref{209e,,string formatting}
to bind Python values to SQL statements,
to avoid SQL injection attacks@footnote{https://en.wikipedia.org/wiki/SQL_injection}
(see @ref{5b2,,How to use placeholders to bind values in SQL queries} for more details).

We can verify that the new rows were inserted
by executing a @code{SELECT} query,
this time iterating over the results of the query:

@example
>>> for row in cur.execute("SELECT year, title FROM movie ORDER BY year"):
...     print(row)
(1971, 'And Now for Something Completely Different')
(1975, 'Monty Python and the Holy Grail')
(1979, "Monty Python's Life of Brian")
(1982, 'Monty Python Live at the Hollywood Bowl')
(1983, "Monty Python's The Meaning of Life")
@end example

Each row is a two-item @ref{614,,tuple} of @code{(year, title)},
matching the columns selected in the query.

Finally, verify that the database has been written to disk
by calling @ref{54f,,con.close()}
to close the existing connection, opening a new one,
creating a new cursor, then querying the database:

@example
>>> con.close()
>>> new_con = sqlite3.connect("tutorial.db")
>>> new_cur = new_con.cursor()
>>> res = new_cur.execute("SELECT title, year FROM movie ORDER BY score DESC")
>>> title, year = res.fetchone()
>>> print(f'The highest scoring Monty Python movie is @{title!r@}, released in @{year@}')
The highest scoring Monty Python movie is 'Monty Python and the Holy Grail', released in 1975
>>> new_con.close()
@end example

You’ve now created an SQLite database using the @code{sqlite3} module,
inserted data and retrieved values from it in multiple ways.


@subsubheading See also



@itemize *

@item 
@ref{2dd1,,How-to guides} for further reading:


@itemize *

@item 
@ref{5b2,,How to use placeholders to bind values in SQL queries}

@item 
@ref{2dda,,How to adapt custom Python types to SQLite values}

@item 
@ref{2ddb,,How to convert SQLite values to custom Python types}

@item 
@ref{1bb0,,How to use the connection context manager}

@item 
@ref{2ddc,,How to create and use row factories}
@end itemize

@item 
@ref{2dd2,,Explanation} for in-depth background on transaction control.
@end itemize


@node Reference,How-to guides,Tutorial,sqlite3 — DB-API 2 0 interface for SQLite databases
@anchor{library/sqlite3 reference}@anchor{2ddd}@anchor{library/sqlite3 sqlite3-reference}@anchor{2dd0}
@subsubsection Reference


@c We keep the old sqlite3-module-contents ref to prevent breaking links.
@anchor{library/sqlite3 sqlite3-module-contents}@anchor{2dde}
@menu
* Module functions:: 
* Module constants:: 
* Connection objects:: 
* Cursor objects:: 
* Row objects:: 
* Blob objects:: 
* PrepareProtocol objects:: 
* Exceptions: Exceptions<7>. 
* SQLite and Python types:: 
* Default adapters and converters (deprecated): Default adapters and converters deprecated. 
* Command-line interface: Command-line interface<2>. 

@end menu

@node Module functions,Module constants,,Reference
@anchor{library/sqlite3 module-functions}@anchor{2ddf}@anchor{library/sqlite3 sqlite3-module-functions}@anchor{2de0}
@subsubsection Module functions


@geindex connect() (in module sqlite3)
@anchor{library/sqlite3 sqlite3 connect}@anchor{5a6}
@deffn {Function} sqlite3.connect (database, timeout=5.0, detect_types=0, isolation_level='DEFERRED', check_same_thread=True, factory=sqlite3.Connection, cached_statements=128, uri=False, *, autocommit=sqlite3.LEGACY_TRANSACTION_CONTROL)

Open a connection to an SQLite database.

@*Parameters: 

@itemize *

@item 
@code{database} (@ref{5a1,,path-like object}) – The path to the database file to be opened.
You can pass @code{":memory:"} to create an SQLite database existing only in memory@footnote{https://sqlite.org/inmemorydb.html}, and open a connection
to it.

@item 
@code{timeout} (@ref{197,,float}) – How many seconds the connection should wait before raising
an @ref{1c95,,OperationalError} when a table is locked.
If another connection opens a transaction to modify a table,
that table will be locked until the transaction is committed.
Default five seconds.

@item 
@code{detect_types} (@ref{19c,,int}) – Control whether and how data types not
@ref{2de1,,natively supported by SQLite}
are looked up to be converted to Python types,
using the converters registered with @ref{2de2,,register_converter()}.
Set it to any combination (using @code{|}, bitwise or) of
@ref{2de3,,PARSE_DECLTYPES} and @ref{2de4,,PARSE_COLNAMES}
to enable this.
Column names take precedence over declared types if both flags are set.
By default (@code{0}), type detection is disabled.

@item 
@code{isolation_level} (@ref{16a,,str}@code{ | }@code{None}) – Control legacy transaction handling behaviour.
See @ref{2de5,,Connection.isolation_level} and
@ref{2de6,,Transaction control via the isolation_level attribute} for more information.
Can be @code{"DEFERRED"} (default), @code{"EXCLUSIVE"} or @code{"IMMEDIATE"};
or @code{None} to disable opening transactions implicitly.
Has no effect unless @ref{6de,,Connection.autocommit} is set to
@ref{2de7,,LEGACY_TRANSACTION_CONTROL} (the default).

@item 
@code{check_same_thread} (@ref{3c1,,bool}) – If @code{True} (default), @ref{307,,ProgrammingError} will be raised
if the database connection is used by a thread
other than the one that created it.
If @code{False}, the connection may be accessed in multiple threads;
write operations may need to be serialized by the user
to avoid data corruption.
See @ref{88e,,threadsafety} for more information.

@item 
@code{factory} (@ref{54e,,Connection}) – A custom subclass of @ref{54e,,Connection} to create the connection with,
if not the default @code{Connection} class.

@item 
@code{cached_statements} (@ref{19c,,int}) – The number of statements that @code{sqlite3}
should internally cache for this connection, to avoid parsing overhead.
By default, 128 statements.

@item 
@code{uri} (@ref{3c1,,bool}) – If set to @code{True}, `database' is interpreted as a
@abbr{URI,Uniform Resource Identifier} with a file path
and an optional query string.
The scheme part `must' be @code{"file:"},
and the path can be relative or absolute.
The query string allows passing parameters to SQLite,
enabling various @ref{2de8,,How to work with SQLite URIs}.

@item 
@code{autocommit} (@ref{3c1,,bool}) – Control 
@geindex Python Enhancement Proposals; PEP 249
PEP 249@footnote{https://peps.python.org/pep-0249/} transaction handling behaviour.
See @ref{6de,,Connection.autocommit} and
@ref{6df,,Transaction control via the autocommit attribute} for more information.
`autocommit' currently defaults to
@ref{2de7,,LEGACY_TRANSACTION_CONTROL}.
The default will change to @code{False} in a future Python release.
@end itemize


@*Return type: 
@ref{54e,,Connection}


Raises an @ref{1cb1,,auditing event} @code{sqlite3.connect} with argument @code{database}.

Raises an @ref{1cb1,,auditing event} @code{sqlite3.connect/handle} with argument @code{connection_handle}.


Changed in version 3.4: Added the `uri' parameter.



Changed in version 3.7: `database' can now also be a @ref{5a1,,path-like object}, not only a string.



Changed in version 3.10: Added the @code{sqlite3.connect/handle} auditing event.



Changed in version 3.12: Added the `autocommit' parameter.



Changed in version 3.13: Positional use of the parameters `timeout', `detect_types',
`isolation_level', `check_same_thread', `factory', `cached_statements',
and `uri' is deprecated.
They will become keyword-only parameters in Python 3.15.

@end deffn

@geindex complete_statement() (in module sqlite3)
@anchor{library/sqlite3 sqlite3 complete_statement}@anchor{2de9}
@deffn {Function} sqlite3.complete_statement (statement)

Return @code{True} if the string `statement' appears to contain
one or more complete SQL statements.
No syntactic verification or parsing of any kind is performed,
other than checking that there are no unclosed string literals
and the statement is terminated by a semicolon.

For example:

@example
>>> sqlite3.complete_statement("SELECT foo FROM bar;")
True
>>> sqlite3.complete_statement("SELECT foo")
False
@end example

This function may be useful during command-line input
to determine if the entered text seems to form a complete SQL statement,
or if additional input is needed before calling @ref{5b0,,execute()}.

See @code{runsource()} in Lib/sqlite3/__main__.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/sqlite3/__main__.py}
for real-world use.
@end deffn

@geindex enable_callback_tracebacks() (in module sqlite3)
@anchor{library/sqlite3 sqlite3 enable_callback_tracebacks}@anchor{2dea}
@deffn {Function} sqlite3.enable_callback_tracebacks (flag, /)

Enable or disable callback tracebacks.
By default you will not get any tracebacks in user-defined functions,
aggregates, converters, authorizer callbacks etc. If you want to debug them,
you can call this function with `flag' set to @code{True}. Afterwards, you
will get tracebacks from callbacks on @ref{b39,,sys.stderr}. Use @code{False}
to disable the feature again.

@cartouche
@quotation Note 
Errors in user-defined function callbacks are logged as unraisable exceptions.
Use an @ref{508,,unraisable hook handler} for
introspection of the failed callback.
@end quotation
@end cartouche
@end deffn

@geindex register_adapter() (in module sqlite3)
@anchor{library/sqlite3 sqlite3 register_adapter}@anchor{2deb}
@deffn {Function} sqlite3.register_adapter (type, adapter, /)

Register an `adapter' @ref{2dec,,callable} to adapt the Python type `type'
into an SQLite type.
The adapter is called with a Python object of type `type' as its sole
argument, and must return a value of a
@ref{2de1,,type that SQLite natively understands}.
@end deffn

@geindex register_converter() (in module sqlite3)
@anchor{library/sqlite3 sqlite3 register_converter}@anchor{2de2}
@deffn {Function} sqlite3.register_converter (typename, converter, /)

Register the `converter' @ref{2dec,,callable} to convert SQLite objects of type
`typename' into a Python object of a specific type.
The converter is invoked for all SQLite values of type `typename';
it is passed a @ref{193,,bytes} object and should return an object of the
desired Python type.
Consult the parameter `detect_types' of
@ref{5a6,,connect()} for information regarding how type detection works.

Note: `typename' and the name of the type in your query are matched
case-insensitively.
@end deffn

@node Module constants,Connection objects,Module functions,Reference
@anchor{library/sqlite3 module-constants}@anchor{2ded}@anchor{library/sqlite3 sqlite3-module-constants}@anchor{2dee}
@subsubsection Module constants


@geindex LEGACY_TRANSACTION_CONTROL (in module sqlite3)
@anchor{library/sqlite3 sqlite3 LEGACY_TRANSACTION_CONTROL}@anchor{2de7}
@deffn {Data} sqlite3.LEGACY_TRANSACTION_CONTROL

Set @ref{6de,,autocommit} to this constant to select
old style (pre-Python 3.12) transaction control behaviour.
See @ref{2de6,,Transaction control via the isolation_level attribute} for more information.
@end deffn

@geindex PARSE_DECLTYPES (in module sqlite3)
@anchor{library/sqlite3 sqlite3 PARSE_DECLTYPES}@anchor{2de3}
@deffn {Data} sqlite3.PARSE_DECLTYPES

Pass this flag value to the `detect_types' parameter of
@ref{5a6,,connect()} to look up a converter function using
the declared types for each column.
The types are declared when the database table is created.
@code{sqlite3} will look up a converter function using the first word of the
declared type as the converter dictionary key.
For example:

@example
CREATE TABLE test(
   i integer primary key,  ! will look up a converter named "integer"
   p point,                ! will look up a converter named "point"
   n number(10)            ! will look up a converter named "number"
 )
@end example

This flag may be combined with @ref{2de4,,PARSE_COLNAMES} using the @code{|}
(bitwise or) operator.

@cartouche
@quotation Note 
Generated fields (for example @code{MAX(p)}) are returned as @ref{16a,,str}.
Use @code{PARSE_COLNAMES} to enforce types for such queries.
@end quotation
@end cartouche
@end deffn

@geindex PARSE_COLNAMES (in module sqlite3)
@anchor{library/sqlite3 sqlite3 PARSE_COLNAMES}@anchor{2de4}
@deffn {Data} sqlite3.PARSE_COLNAMES

Pass this flag value to the `detect_types' parameter of
@ref{5a6,,connect()} to look up a converter function by
using the type name, parsed from the query column name,
as the converter dictionary key.
The query column name must be wrapped in double quotes (@code{"})
and the type name must be wrapped in square brackets (@code{[]}).

@example
SELECT MAX(p) as "p [point]" FROM test;  ! will look up converter "point"
@end example

This flag may be combined with @ref{2de3,,PARSE_DECLTYPES} using the @code{|}
(bitwise or) operator.
@end deffn

@geindex SQLITE_OK (in module sqlite3)
@geindex SQLITE_DENY (in module sqlite3)
@geindex SQLITE_IGNORE (in module sqlite3)
@anchor{library/sqlite3 sqlite3 SQLITE_OK}@anchor{2def}
@deffn {Data} sqlite3.SQLITE_OK
@anchor{library/sqlite3 sqlite3 SQLITE_DENY}@anchor{2df0}
@deffnx {Data} sqlite3.SQLITE_DENY
@anchor{library/sqlite3 sqlite3 SQLITE_IGNORE}@anchor{2df1}
@deffnx {Data} sqlite3.SQLITE_IGNORE

Flags that should be returned by the `authorizer_callback' @ref{2dec,,callable}
passed to @ref{5a9,,Connection.set_authorizer()}, to indicate whether:


@itemize *

@item 
Access is allowed (@code{SQLITE_OK}),

@item 
The SQL statement should be aborted with an error (@code{SQLITE_DENY})

@item 
The column should be treated as a @code{NULL} value (@code{SQLITE_IGNORE})
@end itemize
@end deffn

@geindex apilevel (in module sqlite3)
@anchor{library/sqlite3 sqlite3 apilevel}@anchor{2df2}
@deffn {Data} sqlite3.apilevel

String constant stating the supported DB-API level. Required by the DB-API.
Hard-coded to @code{"2.0"}.
@end deffn

@geindex paramstyle (in module sqlite3)
@anchor{library/sqlite3 sqlite3 paramstyle}@anchor{2df3}
@deffn {Data} sqlite3.paramstyle

String constant stating the type of parameter marker formatting expected by
the @code{sqlite3} module. Required by the DB-API. Hard-coded to
@code{"qmark"}.

@cartouche
@quotation Note 
The @code{named} DB-API parameter style is also supported.
@end quotation
@end cartouche
@end deffn

@geindex sqlite_version (in module sqlite3)
@anchor{library/sqlite3 sqlite3 sqlite_version}@anchor{305}
@deffn {Data} sqlite3.sqlite_version

Version number of the runtime SQLite library as a @ref{16a,,string}.
@end deffn

@geindex sqlite_version_info (in module sqlite3)
@anchor{library/sqlite3 sqlite3 sqlite_version_info}@anchor{306}
@deffn {Data} sqlite3.sqlite_version_info

Version number of the runtime SQLite library as a @ref{614,,tuple} of
@ref{19c,,integers}.
@end deffn

@geindex threadsafety (in module sqlite3)
@anchor{library/sqlite3 sqlite3 threadsafety}@anchor{88e}
@deffn {Data} sqlite3.threadsafety

Integer constant required by the DB-API 2.0, stating the level of thread
safety the @code{sqlite3} module supports. This attribute is set based on
the default threading mode@footnote{https://sqlite.org/threadsafe.html} the
underlying SQLite library is compiled with. The SQLite threading modes are:


@enumerate 

@item 
`Single-thread': In this mode, all mutexes are disabled and SQLite is
unsafe to use in more than a single thread at once.

@item 
`Multi-thread': In this mode, SQLite can be safely used by multiple
threads provided that no single database connection is used
simultaneously in two or more threads.

@item 
`Serialized': In serialized mode, SQLite can be safely used by
multiple threads with no restriction.
@end enumerate

The mappings from SQLite threading modes to DB-API 2.0 threadsafety levels
are as follows:


@multitable {xxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

SQLite threading
mode

@tab

@geindex Python Enhancement Proposals; PEP 0249#threadsafety
threadsafety@footnote{https://peps.python.org/pep-0249/#threadsafety}

@tab

SQLITE_THREADSAFE@footnote{https://sqlite.org/compile.html#threadsafe}

@tab

DB-API 2.0 meaning

@item

single-thread

@tab

0

@tab

0

@tab

Threads may not share the
module

@item

multi-thread

@tab

1

@tab

2

@tab

Threads may share the module,
but not connections

@item

serialized

@tab

3

@tab

1

@tab

Threads may share the module,
connections and cursors

@end multitable



Changed in version 3.11: Set `threadsafety' dynamically instead of hard-coding it to @code{1}.

@end deffn

@geindex SQLITE_DBCONFIG_DEFENSIVE (in module sqlite3)
@geindex SQLITE_DBCONFIG_DQS_DDL (in module sqlite3)
@geindex SQLITE_DBCONFIG_DQS_DML (in module sqlite3)
@geindex SQLITE_DBCONFIG_ENABLE_FKEY (in module sqlite3)
@geindex SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER (in module sqlite3)
@geindex SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION (in module sqlite3)
@geindex SQLITE_DBCONFIG_ENABLE_QPSG (in module sqlite3)
@geindex SQLITE_DBCONFIG_ENABLE_TRIGGER (in module sqlite3)
@geindex SQLITE_DBCONFIG_ENABLE_VIEW (in module sqlite3)
@geindex SQLITE_DBCONFIG_LEGACY_ALTER_TABLE (in module sqlite3)
@geindex SQLITE_DBCONFIG_LEGACY_FILE_FORMAT (in module sqlite3)
@geindex SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE (in module sqlite3)
@geindex SQLITE_DBCONFIG_RESET_DATABASE (in module sqlite3)
@geindex SQLITE_DBCONFIG_TRIGGER_EQP (in module sqlite3)
@geindex SQLITE_DBCONFIG_TRUSTED_SCHEMA (in module sqlite3)
@geindex SQLITE_DBCONFIG_WRITABLE_SCHEMA (in module sqlite3)
@anchor{library/sqlite3 sqlite3-dbconfig-constants}@anchor{2df4}@anchor{library/sqlite3 sqlite3 SQLITE_DBCONFIG_DEFENSIVE}@anchor{2df5}
@deffn {Data} sqlite3.SQLITE_DBCONFIG_DEFENSIVE
@anchor{library/sqlite3 sqlite3 SQLITE_DBCONFIG_DQS_DDL}@anchor{2df6}
@deffnx {Data} sqlite3.SQLITE_DBCONFIG_DQS_DDL
@anchor{library/sqlite3 sqlite3 SQLITE_DBCONFIG_DQS_DML}@anchor{2df7}
@deffnx {Data} sqlite3.SQLITE_DBCONFIG_DQS_DML
@anchor{library/sqlite3 sqlite3 SQLITE_DBCONFIG_ENABLE_FKEY}@anchor{2df8}
@deffnx {Data} sqlite3.SQLITE_DBCONFIG_ENABLE_FKEY
@anchor{library/sqlite3 sqlite3 SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER}@anchor{2df9}
@deffnx {Data} sqlite3.SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER
@anchor{library/sqlite3 sqlite3 SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION}@anchor{2dfa}
@deffnx {Data} sqlite3.SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION
@anchor{library/sqlite3 sqlite3 SQLITE_DBCONFIG_ENABLE_QPSG}@anchor{2dfb}
@deffnx {Data} sqlite3.SQLITE_DBCONFIG_ENABLE_QPSG
@anchor{library/sqlite3 sqlite3 SQLITE_DBCONFIG_ENABLE_TRIGGER}@anchor{2dfc}
@deffnx {Data} sqlite3.SQLITE_DBCONFIG_ENABLE_TRIGGER
@anchor{library/sqlite3 sqlite3 SQLITE_DBCONFIG_ENABLE_VIEW}@anchor{2dfd}
@deffnx {Data} sqlite3.SQLITE_DBCONFIG_ENABLE_VIEW
@anchor{library/sqlite3 sqlite3 SQLITE_DBCONFIG_LEGACY_ALTER_TABLE}@anchor{2dfe}
@deffnx {Data} sqlite3.SQLITE_DBCONFIG_LEGACY_ALTER_TABLE
@anchor{library/sqlite3 sqlite3 SQLITE_DBCONFIG_LEGACY_FILE_FORMAT}@anchor{2dff}
@deffnx {Data} sqlite3.SQLITE_DBCONFIG_LEGACY_FILE_FORMAT
@anchor{library/sqlite3 sqlite3 SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE}@anchor{2e00}
@deffnx {Data} sqlite3.SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE
@anchor{library/sqlite3 sqlite3 SQLITE_DBCONFIG_RESET_DATABASE}@anchor{2e01}
@deffnx {Data} sqlite3.SQLITE_DBCONFIG_RESET_DATABASE
@anchor{library/sqlite3 sqlite3 SQLITE_DBCONFIG_TRIGGER_EQP}@anchor{2e02}
@deffnx {Data} sqlite3.SQLITE_DBCONFIG_TRIGGER_EQP
@anchor{library/sqlite3 sqlite3 SQLITE_DBCONFIG_TRUSTED_SCHEMA}@anchor{2e03}
@deffnx {Data} sqlite3.SQLITE_DBCONFIG_TRUSTED_SCHEMA
@anchor{library/sqlite3 sqlite3 SQLITE_DBCONFIG_WRITABLE_SCHEMA}@anchor{2e04}
@deffnx {Data} sqlite3.SQLITE_DBCONFIG_WRITABLE_SCHEMA

These constants are used for the @ref{6e2,,Connection.setconfig()}
and @ref{6e1,,getconfig()} methods.

The availability of these constants varies depending on the version of SQLite
Python was compiled with.


Added in version 3.12.



@subsubheading See also



@table @asis

@item @indicateurl{https://www.sqlite.org/c3ref/c_dbconfig_defensive.html}

SQLite docs: Database Connection Configuration Options
@end table

@end deffn


Deprecated since version 3.12, removed in version 3.14: The @code{version} and @code{version_info} constants.


@node Connection objects,Cursor objects,Module constants,Reference
@anchor{library/sqlite3 connection-objects}@anchor{2e05}@anchor{library/sqlite3 sqlite3-connection-objects}@anchor{2e06}
@subsubsection Connection objects


@geindex Connection (class in sqlite3)
@anchor{library/sqlite3 sqlite3 Connection}@anchor{54e}
@deffn {Class} sqlite3.Connection

Each open SQLite database is represented by a @code{Connection} object,
which is created using @ref{5a6,,sqlite3.connect()}.
Their main purpose is creating @ref{2dd5,,Cursor} objects,
and @ref{2dd7,,Transaction control}.


@subsubheading See also



@itemize *

@item 
@ref{2e07,,How to use connection shortcut methods}

@item 
@ref{1bb0,,How to use the connection context manager}
@end itemize



Changed in version 3.13: A @ref{54d,,ResourceWarning} is emitted if @ref{54f,,close()} is not called before
a @code{Connection} object is deleted.


An SQLite database connection has the following attributes and methods:

@geindex cursor() (sqlite3.Connection method)
@anchor{library/sqlite3 sqlite3 Connection cursor}@anchor{2dd4}
@deffn {Method} cursor (factory=Cursor)

Create and return a @ref{2dd5,,Cursor} object.
The cursor method accepts a single optional parameter `factory'. If
supplied, this must be a @ref{2dec,,callable} returning
an instance of @code{Cursor} or its subclasses.
@end deffn

@geindex blobopen() (sqlite3.Connection method)
@anchor{library/sqlite3 sqlite3 Connection blobopen}@anchor{893}
@deffn {Method} blobopen (table, column, rowid, /, *, readonly=False, name='main')

Open a @ref{894,,Blob} handle to an existing
@abbr{BLOB,Binary Large OBject}.

@*Parameters: 

@itemize *

@item 
@code{table} (@ref{16a,,str}) – The name of the table where the blob is located.

@item 
@code{column} (@ref{16a,,str}) – The name of the column where the blob is located.

@item 
@code{rowid} (@ref{19c,,int}) – The row id where the blob is located.

@item 
@code{readonly} (@ref{3c1,,bool}) – Set to @code{True} if the blob should be opened without write
permissions.
Defaults to @code{False}.

@item 
@code{name} (@ref{16a,,str}) – The name of the database where the blob is located.
Defaults to @code{"main"}.
@end itemize


@*Raises: 
@ref{1c95,,OperationalError} – When trying to open a blob in a @code{WITHOUT ROWID} table.


@*Return type: 
@ref{894,,Blob}


@cartouche
@quotation Note 
The blob size cannot be changed using the @ref{894,,Blob} class.
Use the SQL function @code{zeroblob} to create a blob with a fixed size.
@end quotation
@end cartouche


Added in version 3.11.

@end deffn

@geindex commit() (sqlite3.Connection method)
@anchor{library/sqlite3 sqlite3 Connection commit}@anchor{2dd8}
@deffn {Method} commit ()

Commit any pending transaction to the database.
If @ref{6de,,autocommit} is @code{True}, or there is no open transaction,
this method does nothing.
If @code{autocommit} is @code{False}, a new transaction is implicitly
opened if a pending transaction was committed by this method.
@end deffn

@geindex rollback() (sqlite3.Connection method)
@anchor{library/sqlite3 sqlite3 Connection rollback}@anchor{2e08}
@deffn {Method} rollback ()

Roll back to the start of any pending transaction.
If @ref{6de,,autocommit} is @code{True}, or there is no open transaction,
this method does nothing.
If @code{autocommit} is @code{False}, a new transaction is implicitly
opened if a pending transaction was rolled back by this method.
@end deffn

@geindex close() (sqlite3.Connection method)
@anchor{library/sqlite3 sqlite3 Connection close}@anchor{54f}
@deffn {Method} close ()

Close the database connection.
If @ref{6de,,autocommit} is @code{False},
any pending transaction is implicitly rolled back.
If @code{autocommit} is @code{True} or @ref{2de7,,LEGACY_TRANSACTION_CONTROL},
no implicit transaction control is executed.
Make sure to @ref{2dd8,,commit()} before closing
to avoid losing pending changes.
@end deffn

@geindex execute() (sqlite3.Connection method)
@anchor{library/sqlite3 sqlite3 Connection execute}@anchor{2e09}
@deffn {Method} execute (sql, parameters=(), /)

Create a new @ref{2dd5,,Cursor} object and call
@ref{5b0,,execute()} on it with the given `sql' and `parameters'.
Return the new cursor object.
@end deffn

@geindex executemany() (sqlite3.Connection method)
@anchor{library/sqlite3 sqlite3 Connection executemany}@anchor{2e0a}
@deffn {Method} executemany (sql, parameters, /)

Create a new @ref{2dd5,,Cursor} object and call
@ref{5b1,,executemany()} on it with the given `sql' and `parameters'.
Return the new cursor object.
@end deffn

@geindex executescript() (sqlite3.Connection method)
@anchor{library/sqlite3 sqlite3 Connection executescript}@anchor{2e0b}
@deffn {Method} executescript (sql_script, /)

Create a new @ref{2dd5,,Cursor} object and call
@ref{2e0c,,executescript()} on it with the given `sql_script'.
Return the new cursor object.
@end deffn

@geindex create_function() (sqlite3.Connection method)
@anchor{library/sqlite3 sqlite3 Connection create_function}@anchor{5a7}
@deffn {Method} create_function (name, narg, func, *, deterministic=False)

Create or remove a user-defined SQL function.

@*Parameters: 

@itemize *

@item 
@code{name} (@ref{16a,,str}) – The name of the SQL function.

@item 
@code{narg} (@ref{19c,,int}) – The number of arguments the SQL function can accept.
If @code{-1}, it may take any number of arguments.

@item 
@code{func} (@ref{2e0d,,callback} | None) – A @ref{2dec,,callable} that is called when the SQL function is invoked.
The callable must return @ref{2de1,,a type natively supported by SQLite}.
Set to @code{None} to remove an existing SQL function.

@item 
@code{deterministic} (@ref{3c1,,bool}) – If @code{True}, the created SQL function is marked as
deterministic@footnote{https://sqlite.org/deterministic.html},
which allows SQLite to perform additional optimizations.
@end itemize



Changed in version 3.8: Added the `deterministic' parameter.


Example:

@example
>>> import hashlib
>>> def md5sum(t):
...     return hashlib.md5(t).hexdigest()
>>> con = sqlite3.connect(":memory:")
>>> con.create_function("md5", 1, md5sum)
>>> for row in con.execute("SELECT md5(?)", (b"foo",)):
...     print(row)
('acbd18db4cc2f85cedef654fccc4a4d8',)
>>> con.close()
@end example


Changed in version 3.13: Passing `name', `narg', and `func' as keyword arguments is deprecated.
These parameters will become positional-only in Python 3.15.

@end deffn

@geindex create_aggregate() (sqlite3.Connection method)
@anchor{library/sqlite3 sqlite3 Connection create_aggregate}@anchor{5a8}
@deffn {Method} create_aggregate (name, n_arg, aggregate_class)

Create or remove a user-defined SQL aggregate function.

@*Parameters: 

@itemize *

@item 
@code{name} (@ref{16a,,str}) – The name of the SQL aggregate function.

@item 
@code{n_arg} (@ref{19c,,int}) – The number of arguments the SQL aggregate function can accept.
If @code{-1}, it may take any number of arguments.

@item 
@code{aggregate_class} (@ref{1d41,,class} | None) – 
A class must implement the following methods:


@itemize *

@item 
@code{step()}: Add a row to the aggregate.

@item 
@code{finalize()}: Return the final result of the aggregate as
@ref{2de1,,a type natively supported by SQLite}.
@end itemize

The number of arguments that the @code{step()} method must accept
is controlled by `n_arg'.

Set to @code{None} to remove an existing SQL aggregate function.

@end itemize


Example:

@example
class MySum:
    def __init__(self):
        self.count = 0

    def step(self, value):
        self.count += value

    def finalize(self):
        return self.count

con = sqlite3.connect(":memory:")
con.create_aggregate("mysum", 1, MySum)
cur = con.execute("CREATE TABLE test(i)")
cur.execute("INSERT INTO test(i) VALUES(1)")
cur.execute("INSERT INTO test(i) VALUES(2)")
cur.execute("SELECT mysum(i) FROM test")
print(cur.fetchone()[0])

con.close()
@end example

@c 3


Changed in version 3.13: Passing `name', `n_arg', and `aggregate_class' as keyword arguments is deprecated.
These parameters will become positional-only in Python 3.15.

@end deffn

@geindex create_window_function() (sqlite3.Connection method)
@anchor{library/sqlite3 sqlite3 Connection create_window_function}@anchor{892}
@deffn {Method} create_window_function (name, num_params, aggregate_class, /)

Create or remove a user-defined aggregate window function.

@*Parameters: 

@itemize *

@item 
@code{name} (@ref{16a,,str}) – The name of the SQL aggregate window function to create or remove.

@item 
@code{num_params} (@ref{19c,,int}) – The number of arguments the SQL aggregate window function can accept.
If @code{-1}, it may take any number of arguments.

@item 
@code{aggregate_class} (@ref{1d41,,class} | None) – 
A class that must implement the following methods:


@itemize *

@item 
@code{step()}: Add a row to the current window.

@item 
@code{value()}: Return the current value of the aggregate.

@item 
@code{inverse()}: Remove a row from the current window.

@item 
@code{finalize()}: Return the final result of the aggregate as
@ref{2de1,,a type natively supported by SQLite}.
@end itemize

The number of arguments that the @code{step()} and @code{value()} methods
must accept is controlled by `num_params'.

Set to @code{None} to remove an existing SQL aggregate window function.

@end itemize


@*Raises: 
@ref{2e0e,,NotSupportedError} – If used with a version of SQLite older than 3.25.0,
which does not support aggregate window functions.



Added in version 3.11.


Example:

@example
# Example taken from https://www.sqlite.org/windowfunctions.html#udfwinfunc
class WindowSumInt:
    def __init__(self):
        self.count = 0

    def step(self, value):
        """Add a row to the current window."""
        self.count += value

    def value(self):
        """Return the current value of the aggregate."""
        return self.count

    def inverse(self, value):
        """Remove a row from the current window."""
        self.count -= value

    def finalize(self):
        """Return the final value of the aggregate.

        Any clean-up actions should be placed here.
        """
        return self.count


con = sqlite3.connect(":memory:")
cur = con.execute("CREATE TABLE test(x, y)")
values = [
    ("a", 4),
    ("b", 5),
    ("c", 3),
    ("d", 8),
    ("e", 1),
]
cur.executemany("INSERT INTO test VALUES(?, ?)", values)
con.create_window_function("sumint", 1, WindowSumInt)
cur.execute("""
    SELECT x, sumint(y) OVER (
        ORDER BY x ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
    ) AS sum_y
    FROM test ORDER BY x
""")
print(cur.fetchall())
con.close()
@end example

@c [('a', 9), ('b', 12), ('c', 16), ('d', 12), ('e', 9)]
@end deffn

@geindex create_collation() (sqlite3.Connection method)
@anchor{library/sqlite3 sqlite3 Connection create_collation}@anchor{888}
@deffn {Method} create_collation (name, callable, /)

Create a collation named `name' using the collating function `callable'.
`callable' is passed two @ref{16a,,string} arguments,
and it should return an @ref{19c,,integer}:


@itemize *

@item 
@code{1} if the first is ordered higher than the second

@item 
@code{-1} if the first is ordered lower than the second

@item 
@code{0} if they are ordered equal
@end itemize

The following example shows a reverse sorting collation:

@example
def collate_reverse(string1, string2):
    if string1 == string2:
        return 0
    elif string1 < string2:
        return 1
    else:
        return -1

con = sqlite3.connect(":memory:")
con.create_collation("reverse", collate_reverse)

cur = con.execute("CREATE TABLE test(x)")
cur.executemany("INSERT INTO test(x) VALUES(?)", [("a",), ("b",)])
cur.execute("SELECT x FROM test ORDER BY x COLLATE reverse")
for row in cur:
    print(row)
con.close()
@end example

@c ('b',)
@c ('a',)

Remove a collation function by setting `callable' to @code{None}.


Changed in version 3.11: The collation name can contain any Unicode character.  Earlier, only
ASCII characters were allowed.

@end deffn

@geindex interrupt() (sqlite3.Connection method)
@anchor{library/sqlite3 sqlite3 Connection interrupt}@anchor{2e0f}
@deffn {Method} interrupt ()

Call this method from a different thread to abort any queries that might
be executing on the connection.
Aborted queries will raise an @ref{1c95,,OperationalError}.
@end deffn

@geindex set_authorizer() (sqlite3.Connection method)
@anchor{library/sqlite3 sqlite3 Connection set_authorizer}@anchor{5a9}
@deffn {Method} set_authorizer (authorizer_callback)

Register @ref{2dec,,callable} `authorizer_callback' to be invoked
for each attempt to access a column of a table in the database.
The callback should return one of @ref{2def,,SQLITE_OK},
@ref{2df0,,SQLITE_DENY}, or @ref{2df1,,SQLITE_IGNORE}
to signal how access to the column should be handled
by the underlying SQLite library.

The first argument to the callback signifies what kind of operation is to be
authorized. The second and third argument will be arguments or @code{None}
depending on the first argument. The 4th argument is the name of the database
(“main”, “temp”, etc.) if applicable. The 5th argument is the name of the
inner-most trigger or view that is responsible for the access attempt or
@code{None} if this access attempt is directly from input SQL code.

Please consult the SQLite documentation about the possible values for the first
argument and the meaning of the second and third argument depending on the first
one. All necessary constants are available in the @code{sqlite3} module.

Passing @code{None} as `authorizer_callback' will disable the authorizer.


Changed in version 3.11: Added support for disabling the authorizer using @code{None}.



Changed in version 3.13: Passing `authorizer_callback' as a keyword argument is deprecated.
The parameter will become positional-only in Python 3.15.

@end deffn

@geindex set_progress_handler() (sqlite3.Connection method)
@anchor{library/sqlite3 sqlite3 Connection set_progress_handler}@anchor{5aa}
@deffn {Method} set_progress_handler (progress_handler, n)

Register @ref{2dec,,callable} `progress_handler' to be invoked for every `n'
instructions of the SQLite virtual machine. This is useful if you want to
get called from SQLite during long-running operations, for example to update
a GUI.

If you want to clear any previously installed progress handler, call the
method with @code{None} for `progress_handler'.

Returning a non-zero value from the handler function will terminate the
currently executing query and cause it to raise a @ref{2e10,,DatabaseError}
exception.


Changed in version 3.13: Passing `progress_handler' as a keyword argument is deprecated.
The parameter will become positional-only in Python 3.15.

@end deffn

@geindex set_trace_callback() (sqlite3.Connection method)
@anchor{library/sqlite3 sqlite3 Connection set_trace_callback}@anchor{5ab}
@deffn {Method} set_trace_callback (trace_callback)

Register @ref{2dec,,callable} `trace_callback' to be invoked
for each SQL statement that is actually executed by the SQLite backend.

The only argument passed to the callback is the statement (as
@ref{16a,,str}) that is being executed. The return value of the callback is
ignored. Note that the backend does not only run statements passed to the
@ref{5b0,,Cursor.execute()} methods.  Other sources include the
@ref{2dd7,,transaction management} of the
@code{sqlite3} module and the execution of triggers defined in the current
database.

Passing @code{None} as `trace_callback' will disable the trace callback.

@cartouche
@quotation Note 
Exceptions raised in the trace callback are not propagated. As a
development and debugging aid, use
@ref{2dea,,enable_callback_tracebacks()} to enable printing
tracebacks from exceptions raised in the trace callback.
@end quotation
@end cartouche


Added in version 3.3.



Changed in version 3.13: Passing `trace_callback' as a keyword argument is deprecated.
The parameter will become positional-only in Python 3.15.

@end deffn

@geindex enable_load_extension() (sqlite3.Connection method)
@anchor{library/sqlite3 sqlite3 Connection enable_load_extension}@anchor{a45}
@deffn {Method} enable_load_extension (enabled, /)

Enable the SQLite engine to load SQLite extensions from shared libraries
if `enabled' is @code{True};
else, disallow loading SQLite extensions.
SQLite extensions can define new functions,
aggregates or whole new virtual table implementations.  One well-known
extension is the fulltext-search extension distributed with SQLite.

@cartouche
@quotation Note 
The @code{sqlite3} module is not built with loadable extension support by
default, because some platforms (notably macOS) have SQLite
libraries which are compiled without this feature.
To get loadable extension support,
you must pass the @ref{21a4,,--enable-loadable-sqlite-extensions} option
to @code{configure}.
@end quotation
@end cartouche

Raises an @ref{1cb1,,auditing event} @code{sqlite3.enable_load_extension} with arguments @code{connection}, @code{enabled}.


Added in version 3.2.



Changed in version 3.10: Added the @code{sqlite3.enable_load_extension} auditing event.


@c We cannot doctest the load extension API, since there is no convenient
@c way to skip it.

@example
con.enable_load_extension(True)

# Load the fulltext search extension
con.execute("select load_extension('./fts3.so')")

# alternatively you can load the extension using an API call:
# con.load_extension("./fts3.so")

# disable extension loading again
con.enable_load_extension(False)

# example from SQLite wiki
con.execute("CREATE VIRTUAL TABLE recipe USING fts3(name, ingredients)")
con.executescript("""
    INSERT INTO recipe (name, ingredients) VALUES('broccoli stew', 'broccoli peppers cheese tomatoes');
    INSERT INTO recipe (name, ingredients) VALUES('pumpkin stew', 'pumpkin onions garlic celery');
    INSERT INTO recipe (name, ingredients) VALUES('broccoli pie', 'broccoli cheese onions flour');
    INSERT INTO recipe (name, ingredients) VALUES('pumpkin pie', 'pumpkin sugar flour butter');
    """)
for row in con.execute("SELECT rowid, name, ingredients FROM recipe WHERE name MATCH 'pie'"):
    print(row)
@end example
@end deffn

@geindex load_extension() (sqlite3.Connection method)
@anchor{library/sqlite3 sqlite3 Connection load_extension}@anchor{6e0}
@deffn {Method} load_extension (path, /, *, entrypoint=None)

Load an SQLite extension from a shared library.
Enable extension loading with @ref{a45,,enable_load_extension()} before
calling this method.

@*Parameters: 

@itemize *

@item 
@code{path} (@ref{16a,,str}) – The path to the SQLite extension.

@item 
@code{entrypoint} (@ref{16a,,str}@code{ | }@code{None}) – Entry point name.
If @code{None} (the default),
SQLite will come up with an entry point name of its own;
see the SQLite docs Loading an Extension@footnote{https://www.sqlite.org/loadext.html#loading_an_extension} for details.
@end itemize


Raises an @ref{1cb1,,auditing event} @code{sqlite3.load_extension} with arguments @code{connection}, @code{path}.


Added in version 3.2.



Changed in version 3.10: Added the @code{sqlite3.load_extension} auditing event.



Changed in version 3.12: Added the `entrypoint' parameter.

@end deffn

@geindex iterdump() (sqlite3.Connection method)
@anchor{library/sqlite3 sqlite3 Connection iterdump}@anchor{550}
@deffn {Method} iterdump (*, filter=None)

Return an @ref{4c9,,iterator} to dump the database as SQL source code.
Useful when saving an in-memory database for later restoration.
Similar to the @code{.dump} command in the @code{sqlite3} shell.

@*Parameters: 
@code{filter} (@ref{16a,,str}@code{ | }@code{None}) – An optional @code{LIKE} pattern for database objects to dump, e.g. @code{prefix_%}.
If @code{None} (the default), all database objects will be included.


Example:

@example
# Convert file example.db to SQL dump file dump.sql
con = sqlite3.connect('example.db')
with open('dump.sql', 'w') as f:
    for line in con.iterdump():
        f.write('%s\n' % line)
con.close()
@end example


@subsubheading See also


@ref{2e11,,How to handle non-UTF-8 text encodings}



Changed in version 3.13: Added the `filter' parameter.

@end deffn

@geindex backup() (sqlite3.Connection method)
@anchor{library/sqlite3 sqlite3 Connection backup}@anchor{d79}
@deffn {Method} backup (target, *, pages=-1, progress=None, name='main', sleep=0.250)

Create a backup of an SQLite database.

Works even if the database is being accessed by other clients
or concurrently by the same connection.

@*Parameters: 

@itemize *

@item 
@code{target} (@ref{54e,,Connection}) – The database connection to save the backup to.

@item 
@code{pages} (@ref{19c,,int}) – The number of pages to copy at a time.
If equal to or less than @code{0},
the entire database is copied in a single step.
Defaults to @code{-1}.

@item 
@code{progress} (@ref{2e0d,,callback} | None) – If set to a @ref{2dec,,callable},
it is invoked with three integer arguments for every backup iteration:
the `status' of the last iteration,
the `remaining' number of pages still to be copied,
and the `total' number of pages.
Defaults to @code{None}.

@item 
@code{name} (@ref{16a,,str}) – The name of the database to back up.
Either @code{"main"} (the default) for the main database,
@code{"temp"} for the temporary database,
or the name of a custom database as attached using the
@code{ATTACH DATABASE} SQL statement.

@item 
@code{sleep} (@ref{197,,float}) – The number of seconds to sleep between successive attempts
to back up remaining pages.
@end itemize


Example 1, copy an existing database into another:

@example
def progress(status, remaining, total):
    print(f'Copied @{total-remaining@} of @{total@} pages...')

src = sqlite3.connect('example.db')
dst = sqlite3.connect('backup.db')
with dst:
    src.backup(dst, pages=1, progress=progress)
dst.close()
src.close()
@end example

@c Copied 0 of 0 pages...

Example 2, copy an existing database into a transient copy:

@example
src = sqlite3.connect('example.db')
dst = sqlite3.connect(':memory:')
src.backup(dst)
dst.close()
src.close()
@end example


Added in version 3.7.



@subsubheading See also


@ref{2e11,,How to handle non-UTF-8 text encodings}

@end deffn

@geindex getlimit() (sqlite3.Connection method)
@anchor{library/sqlite3 sqlite3 Connection getlimit}@anchor{88d}
@deffn {Method} getlimit (category, /)

Get a connection runtime limit.

@*Parameters: 
@code{category} (@ref{19c,,int}) – The SQLite limit category@footnote{https://www.sqlite.org/c3ref/c_limit_attached.html} to be queried.


@*Return type: 
@ref{19c,,int}


@*Raises: 
@ref{307,,ProgrammingError} – If `category' is not recognised by the underlying SQLite library.


Example, query the maximum length of an SQL statement
for @code{Connection} @code{con} (the default is 1000000000):

@c import sqlite3
@c con = sqlite3.connect(":memory:")
@c con.setlimit(sqlite3.SQLITE_LIMIT_SQL_LENGTH, 1_000_000_000)
@c con.setlimit(sqlite3.SQLITE_LIMIT_ATTACHED, 10)

@example
>>> con.getlimit(sqlite3.SQLITE_LIMIT_SQL_LENGTH)
1000000000
@end example


Added in version 3.11.

@end deffn

@geindex setlimit() (sqlite3.Connection method)
@anchor{library/sqlite3 sqlite3 Connection setlimit}@anchor{88c}
@deffn {Method} setlimit (category, limit, /)

Set a connection runtime limit.
Attempts to increase a limit above its hard upper bound are silently
truncated to the hard upper bound. Regardless of whether or not the limit
was changed, the prior value of the limit is returned.

@*Parameters: 

@itemize *

@item 
@code{category} (@ref{19c,,int}) – The SQLite limit category@footnote{https://www.sqlite.org/c3ref/c_limit_attached.html} to be set.

@item 
@code{limit} (@ref{19c,,int}) – The value of the new limit.
If negative, the current limit is unchanged.
@end itemize


@*Return type: 
@ref{19c,,int}


@*Raises: 
@ref{307,,ProgrammingError} – If `category' is not recognised by the underlying SQLite library.


Example, limit the number of attached databases to 1
for @code{Connection} @code{con} (the default limit is 10):

@example
>>> con.setlimit(sqlite3.SQLITE_LIMIT_ATTACHED, 1)
10
>>> con.getlimit(sqlite3.SQLITE_LIMIT_ATTACHED)
1
@end example

@c con.close()


Added in version 3.11.

@end deffn

@geindex getconfig() (sqlite3.Connection method)
@anchor{library/sqlite3 sqlite3 Connection getconfig}@anchor{6e1}
@deffn {Method} getconfig (op, /)

Query a boolean connection configuration option.

@*Parameters: 
@code{op} (@ref{19c,,int}) – A @ref{2df4,,SQLITE_DBCONFIG code}.


@*Return type: 
@ref{3c1,,bool}



Added in version 3.12.

@end deffn

@geindex setconfig() (sqlite3.Connection method)
@anchor{library/sqlite3 sqlite3 Connection setconfig}@anchor{6e2}
@deffn {Method} setconfig (op, enable=True, /)

Set a boolean connection configuration option.

@*Parameters: 

@itemize *

@item 
@code{op} (@ref{19c,,int}) – A @ref{2df4,,SQLITE_DBCONFIG code}.

@item 
@code{enable} (@ref{3c1,,bool}) – @code{True} if the configuration option should be enabled (default);
@code{False} if it should be disabled.
@end itemize



Added in version 3.12.

@end deffn

@geindex serialize() (sqlite3.Connection method)
@anchor{library/sqlite3 sqlite3 Connection serialize}@anchor{890}
@deffn {Method} serialize (*, name='main')

Serialize a database into a @ref{193,,bytes} object.  For an
ordinary on-disk database file, the serialization is just a copy of the
disk file.  For an in-memory database or a “temp” database, the
serialization is the same sequence of bytes which would be written to
disk if that database were backed up to disk.

@*Parameters: 
@code{name} (@ref{16a,,str}) – The database name to be serialized.
Defaults to @code{"main"}.


@*Return type: 
@ref{193,,bytes}


@cartouche
@quotation Note 
This method is only available if the underlying SQLite library has the
serialize API.
@end quotation
@end cartouche


Added in version 3.11.

@end deffn

@geindex deserialize() (sqlite3.Connection method)
@anchor{library/sqlite3 sqlite3 Connection deserialize}@anchor{891}
@deffn {Method} deserialize (data, /, *, name='main')

Deserialize a @ref{890,,serialized} database into a
@code{Connection}.
This method causes the database connection to disconnect from database
`name', and reopen `name' as an in-memory database based on the
serialization contained in `data'.

@*Parameters: 

@itemize *

@item 
@code{data} (@ref{193,,bytes}) – A serialized database.

@item 
@code{name} (@ref{16a,,str}) – The database name to deserialize into.
Defaults to @code{"main"}.
@end itemize


@*Raises: 

@itemize *

@item 
@ref{1c95,,OperationalError} – If the database connection is currently involved in a read
transaction or a backup operation.

@item 
@ref{2e10,,DatabaseError} – If `data' does not contain a valid SQLite database.

@item 
@ref{a87,,OverflowError} – If @ref{841,,len(data)} is larger than @code{2**63 - 1}.
@end itemize


@cartouche
@quotation Note 
This method is only available if the underlying SQLite library has the
deserialize API.
@end quotation
@end cartouche


Added in version 3.11.

@end deffn

@geindex autocommit (sqlite3.Connection attribute)
@anchor{library/sqlite3 sqlite3 Connection autocommit}@anchor{6de}
@deffn {Attribute} autocommit

This attribute controls 
@geindex Python Enhancement Proposals; PEP 249
PEP 249@footnote{https://peps.python.org/pep-0249/}-compliant transaction behaviour.
@code{autocommit} has three allowed values:


@itemize *

@item 
@code{False}: Select 
@geindex Python Enhancement Proposals; PEP 249
PEP 249@footnote{https://peps.python.org/pep-0249/}-compliant transaction behaviour,
implying that @code{sqlite3} ensures a transaction is always open.
Use @ref{2dd8,,commit()} and @ref{2e08,,rollback()} to close transactions.

This is the recommended value of @code{autocommit}.

@item 
@code{True}: Use SQLite’s autocommit mode@footnote{https://www.sqlite.org/lang_transaction.html#implicit_versus_explicit_transactions}.
@ref{2dd8,,commit()} and @ref{2e08,,rollback()} have no effect in this mode.

@item 
@ref{2de7,,LEGACY_TRANSACTION_CONTROL}:
Pre-Python 3.12 (non-
@geindex Python Enhancement Proposals; PEP 249
PEP 249@footnote{https://peps.python.org/pep-0249/}-compliant) transaction control.
See @ref{2de5,,isolation_level} for more details.

This is currently the default value of @code{autocommit}.
@end itemize

Changing @code{autocommit} to @code{False} will open a new transaction,
and changing it to @code{True} will commit any pending transaction.

See @ref{6df,,Transaction control via the autocommit attribute} for more details.

@cartouche
@quotation Note 
The @ref{2de5,,isolation_level} attribute has no effect unless
@ref{6de,,autocommit} is @ref{2de7,,LEGACY_TRANSACTION_CONTROL}.
@end quotation
@end cartouche


Added in version 3.12.

@end deffn

@geindex in_transaction (sqlite3.Connection attribute)
@anchor{library/sqlite3 sqlite3 Connection in_transaction}@anchor{2e12}
@deffn {Attribute} in_transaction

This read-only attribute corresponds to the low-level SQLite
autocommit mode@footnote{https://www.sqlite.org/lang_transaction.html#implicit_versus_explicit_transactions}.

@code{True} if a transaction is active (there are uncommitted changes),
@code{False} otherwise.


Added in version 3.2.

@end deffn

@geindex isolation_level (sqlite3.Connection attribute)
@anchor{library/sqlite3 sqlite3 Connection isolation_level}@anchor{2de5}
@deffn {Attribute} isolation_level

Controls the @ref{2de6,,legacy transaction handling mode} of @code{sqlite3}.
If set to @code{None}, transactions are never implicitly opened.
If set to one of @code{"DEFERRED"}, @code{"IMMEDIATE"}, or @code{"EXCLUSIVE"},
corresponding to the underlying SQLite transaction behaviour@footnote{https://www.sqlite.org/lang_transaction.html#deferred_immediate_and_exclusive_transactions},
@ref{2de6,,implicit transaction management} is performed.

If not overridden by the `isolation_level' parameter of @ref{5a6,,connect()},
the default is @code{""}, which is an alias for @code{"DEFERRED"}.

@cartouche
@quotation Note 
Using @ref{6de,,autocommit} to control transaction handling is
recommended over using @code{isolation_level}.
@code{isolation_level} has no effect unless @code{autocommit} is
set to @ref{2de7,,LEGACY_TRANSACTION_CONTROL} (the default).
@end quotation
@end cartouche
@end deffn

@geindex row_factory (sqlite3.Connection attribute)
@anchor{library/sqlite3 sqlite3 Connection row_factory}@anchor{19e7}
@deffn {Attribute} row_factory

The initial @ref{2e13,,row_factory}
for @ref{2dd5,,Cursor} objects created from this connection.
Assigning to this attribute does not affect the @code{row_factory}
of existing cursors belonging to this connection, only new ones.
Is @code{None} by default,
meaning each row is returned as a @ref{614,,tuple}.

See @ref{2ddc,,How to create and use row factories} for more details.


Changed in version 3.14.6: Deleting the @code{row_factory} attribute is no longer allowed.

@end deffn

@geindex text_factory (sqlite3.Connection attribute)
@anchor{library/sqlite3 sqlite3 Connection text_factory}@anchor{2e14}
@deffn {Attribute} text_factory

A @ref{2dec,,callable} that accepts a @ref{193,,bytes} parameter
and returns a text representation of it.
The callable is invoked for SQLite values with the @code{TEXT} data type.
By default, this attribute is set to @ref{16a,,str}.

See @ref{2e11,,How to handle non-UTF-8 text encodings} for more details.


Changed in version 3.14.6: Deleting the @code{text_factory} attribute is no longer allowed.

@end deffn

@geindex total_changes (sqlite3.Connection attribute)
@anchor{library/sqlite3 sqlite3 Connection total_changes}@anchor{2e15}
@deffn {Attribute} total_changes

Return the total number of database rows that have been modified, inserted, or
deleted since the database connection was opened.
@end deffn
@end deffn

@node Cursor objects,Row objects,Connection objects,Reference
@anchor{library/sqlite3 cursor-objects}@anchor{2e16}@anchor{library/sqlite3 sqlite3-cursor-objects}@anchor{2e17}
@subsubsection Cursor objects


@quotation

A @code{Cursor} object represents a database cursor@footnote{https://en.wikipedia.org/wiki/Cursor_(databases)}
which is used to execute SQL statements,
and manage the context of a fetch operation.
Cursors are created using @ref{2dd4,,Connection.cursor()},
or by using any of the @ref{2e07,,connection shortcut methods}.

Cursor objects are @ref{4c9,,iterators},
meaning that if you @ref{5b0,,execute()} a @code{SELECT} query,
you can simply iterate over the cursor to fetch the resulting rows:

@c import sqlite3
@c con = sqlite3.connect(":memory:", isolation_level=None)
@c cur = con.execute("CREATE TABLE data(t)")
@c cur.execute("INSERT INTO data VALUES(1)")

@example
for row in cur.execute("SELECT t FROM data"):
    print(row)
@end example

@c (1,)
@end quotation

@geindex Cursor (class in sqlite3)
@anchor{library/sqlite3 sqlite3 Cursor}@anchor{2dd5}
@deffn {Class} sqlite3.Cursor

A @code{Cursor} instance has the following attributes and methods.

@geindex ? (question mark); in SQL statements

@geindex ; (colon); in SQL statements

@geindex execute() (sqlite3.Cursor method)
@anchor{library/sqlite3 sqlite3 Cursor execute}@anchor{5b0}
@deffn {Method} execute (sql, parameters=(), /)

Execute a single SQL statement,
optionally binding Python values using
@ref{5b2,,placeholders}.

@*Parameters: 

@itemize *

@item 
@code{sql} (@ref{16a,,str}) – A single SQL statement.

@item 
@code{parameters} (@ref{184,,dict} | @ref{717,,sequence}) – Python values to bind to placeholders in `sql'.
A @code{dict} if named placeholders are used.
A sequence if unnamed placeholders are used.
See @ref{5b2,,How to use placeholders to bind values in SQL queries}.
@end itemize


@*Raises: 
@ref{307,,ProgrammingError} – When `sql' contains more than one SQL statement.
When @ref{5b2,,named placeholders} are used
and `parameters' is a sequence instead of a @ref{184,,dict}.


If @ref{6de,,autocommit} is
@ref{2de7,,LEGACY_TRANSACTION_CONTROL},
@ref{2de5,,isolation_level} is not @code{None},
`sql' is an @code{INSERT}, @code{UPDATE}, @code{DELETE}, or @code{REPLACE} statement,
and there is no open transaction,
a transaction is implicitly opened before executing `sql'.


Changed in version 3.14: @ref{307,,ProgrammingError} is emitted if
@ref{5b2,,named placeholders} are used
and `parameters' is a sequence instead of a @ref{184,,dict}.


Use @ref{2e0c,,executescript()} to execute multiple SQL statements.
@end deffn

@geindex executemany() (sqlite3.Cursor method)
@anchor{library/sqlite3 sqlite3 Cursor executemany}@anchor{5b1}
@deffn {Method} executemany (sql, parameters, /)

For every item in `parameters',
repeatedly execute the @ref{5b2,,parameterized}
@abbr{DML,Data Manipulation Language} SQL statement `sql'.

Uses the same implicit transaction handling as @ref{5b0,,execute()}.

@*Parameters: 

@itemize *

@item 
@code{sql} (@ref{16a,,str}) – A single SQL DML statement.

@item 
@code{parameters} (@ref{1433,,iterable}) – An iterable of parameters to bind with
the placeholders in `sql'.
See @ref{5b2,,How to use placeholders to bind values in SQL queries}.
@end itemize


@*Raises: 
@ref{307,,ProgrammingError} – When `sql' contains more than one SQL statement
or is not a DML statement,
When @ref{5b2,,named placeholders} are used
and the items in `parameters' are sequences instead of @ref{184,,dict}s.


Example:

@example
rows = [
    ("row1",),
    ("row2",),
]
# cur is an sqlite3.Cursor object
cur.executemany("INSERT INTO data VALUES(?)", rows)
@end example

@c con.close()

@cartouche
@quotation Note 
Any resulting rows are discarded,
including DML statements with RETURNING clauses@footnote{https://www.sqlite.org/lang_returning.html}.
@end quotation
@end cartouche


Changed in version 3.14: @ref{307,,ProgrammingError} is emitted if
@ref{5b2,,named placeholders} are used
and the items in `parameters' are sequences
instead of @ref{184,,dict}s.

@end deffn

@geindex executescript() (sqlite3.Cursor method)
@anchor{library/sqlite3 sqlite3 Cursor executescript}@anchor{2e0c}
@deffn {Method} executescript (sql_script, /)

Execute the SQL statements in `sql_script'.
If the @ref{6de,,autocommit} is
@ref{2de7,,LEGACY_TRANSACTION_CONTROL}
and there is a pending transaction,
an implicit @code{COMMIT} statement is executed first.
No other implicit transaction control is performed;
any transaction control must be added to `sql_script'.

`sql_script' must be a @ref{16a,,string}.

Example:

@example
# cur is an sqlite3.Cursor object
cur.executescript("""
    BEGIN;
    CREATE TABLE person(firstname, lastname, age);
    CREATE TABLE book(title, author, published);
    CREATE TABLE publisher(name, address);
    COMMIT;
""")
@end example
@end deffn

@geindex fetchone() (sqlite3.Cursor method)
@anchor{library/sqlite3 sqlite3 Cursor fetchone}@anchor{2dd6}
@deffn {Method} fetchone ()

If @ref{2e13,,row_factory} is @code{None},
return the next row query result set as a @ref{614,,tuple}.
Else, pass it to the row factory and return its result.
Return @code{None} if no more data is available.
@end deffn

@geindex fetchmany() (sqlite3.Cursor method)
@anchor{library/sqlite3 sqlite3 Cursor fetchmany}@anchor{17f8}
@deffn {Method} fetchmany (size=cursor.arraysize)

Return the next set of rows of a query result as a @ref{24f,,list}.
Return an empty list if no more rows are available.

The number of rows to fetch per call is specified by the `size' parameter.
If `size' is not given, @ref{17f9,,arraysize} determines the number of rows
to be fetched.
If fewer than `size' rows are available,
as many rows as are available are returned.

Note there are performance considerations involved with the `size' parameter.
For optimal performance, it is usually best to use the arraysize attribute.
If the `size' parameter is used, then it is best for it to retain the same
value from one @code{fetchmany()} call to the next.


Changed in version 3.14.1: Negative `size' values are rejected by raising @ref{2ee,,ValueError}.

@end deffn

@geindex fetchall() (sqlite3.Cursor method)
@anchor{library/sqlite3 sqlite3 Cursor fetchall}@anchor{2dd9}
@deffn {Method} fetchall ()

Return all (remaining) rows of a query result as a @ref{24f,,list}.
Return an empty list if no rows are available.
Note that the @ref{17f9,,arraysize} attribute can affect the performance of
this operation.
@end deffn

@geindex close() (sqlite3.Cursor method)
@anchor{library/sqlite3 sqlite3 Cursor close}@anchor{2e18}
@deffn {Method} close ()

Close the cursor now (rather than whenever @code{__del__} is called).

The cursor will be unusable from this point forward; a @ref{307,,ProgrammingError}
exception will be raised if any operation is attempted with the cursor.
@end deffn

@geindex setinputsizes() (sqlite3.Cursor method)
@anchor{library/sqlite3 sqlite3 Cursor setinputsizes}@anchor{2e19}
@deffn {Method} setinputsizes (sizes, /)

Required by the DB-API. Does nothing in @code{sqlite3}.
@end deffn

@geindex setoutputsize() (sqlite3.Cursor method)
@anchor{library/sqlite3 sqlite3 Cursor setoutputsize}@anchor{2e1a}
@deffn {Method} setoutputsize (size, column=None, /)

Required by the DB-API. Does nothing in @code{sqlite3}.
@end deffn

@geindex arraysize (sqlite3.Cursor attribute)
@anchor{library/sqlite3 sqlite3 Cursor arraysize}@anchor{17f9}
@deffn {Attribute} arraysize

Read/write attribute that controls the number of rows returned by @ref{17f8,,fetchmany()}.
The default value is 1 which means a single row would be fetched per call.


Changed in version 3.14.1: Negative values are rejected by raising @ref{2ee,,ValueError}.

@end deffn

@geindex connection (sqlite3.Cursor attribute)
@anchor{library/sqlite3 sqlite3 Cursor connection}@anchor{2e1b}
@deffn {Attribute} connection

Read-only attribute that provides the SQLite database @ref{54e,,Connection}
belonging to the cursor.  A @code{Cursor} object created by
calling @ref{2dd4,,con.cursor()} will have a
@ref{2e1b,,connection} attribute that refers to `con':

@example
>>> con = sqlite3.connect(":memory:")
>>> cur = con.cursor()
>>> cur.connection == con
True
>>> con.close()
@end example
@end deffn

@geindex description (sqlite3.Cursor attribute)
@anchor{library/sqlite3 sqlite3 Cursor description}@anchor{18f2}
@deffn {Attribute} description

Read-only attribute that provides the column names of the last query. To
remain compatible with the Python DB API, it returns a 7-tuple for each
column where the last six items of each tuple are @code{None}.

It is set for @code{SELECT} statements without any matching rows as well.
@end deffn

@geindex lastrowid (sqlite3.Cursor attribute)
@anchor{library/sqlite3 sqlite3 Cursor lastrowid}@anchor{ed2}
@deffn {Attribute} lastrowid

Read-only attribute that provides the row id of the last inserted row. It
is only updated after successful @code{INSERT} or @code{REPLACE} statements
using the @ref{5b0,,execute()} method.  For other statements, after
@ref{5b1,,executemany()} or @ref{2e0c,,executescript()}, or if the insertion failed,
the value of @code{lastrowid} is left unchanged.  The initial value of
@code{lastrowid} is @code{None}.

@cartouche
@quotation Note 
Inserts into @code{WITHOUT ROWID} tables are not recorded.
@end quotation
@end cartouche


Changed in version 3.6: Added support for the @code{REPLACE} statement.

@end deffn

@geindex rowcount (sqlite3.Cursor attribute)
@anchor{library/sqlite3 sqlite3 Cursor rowcount}@anchor{1ba4}
@deffn {Attribute} rowcount

Read-only attribute that provides the number of modified rows for
@code{INSERT}, @code{UPDATE}, @code{DELETE}, and @code{REPLACE} statements;
is @code{-1} for other statements,
including @abbr{CTE,Common Table Expression} queries.
It is only updated by the @ref{5b0,,execute()} and @ref{5b1,,executemany()} methods,
after the statement has run to completion.
This means that any resulting rows must be fetched in order for
@code{rowcount} to be updated.
@end deffn

@geindex row_factory (sqlite3.Cursor attribute)
@anchor{library/sqlite3 sqlite3 Cursor row_factory}@anchor{2e13}
@deffn {Attribute} row_factory

Control how a row fetched from this @code{Cursor} is represented.
If @code{None}, a row is represented as a @ref{614,,tuple}.
Can be set to the included @ref{1077,,sqlite3.Row};
or a @ref{2dec,,callable} that accepts two arguments,
a @code{Cursor} object and the @code{tuple} of row values,
and returns a custom object representing an SQLite row.

Defaults to what @ref{19e7,,Connection.row_factory} was set to
when the @code{Cursor} was created.
Assigning to this attribute does not affect
@code{Connection.row_factory} of the parent connection.

See @ref{2ddc,,How to create and use row factories} for more details.


Changed in version 3.14.6: Deleting the @code{row_factory} attribute is no longer allowed.

@end deffn
@end deffn

@c The sqlite3.Row example used to be a how-to. It has now been incorporated
@c into the Row reference. We keep the anchor here in order not to break
@c existing links.
@anchor{library/sqlite3 sqlite3-columns-by-name}@anchor{2e1c}
@node Row objects,Blob objects,Cursor objects,Reference
@anchor{library/sqlite3 row-objects}@anchor{2e1d}@anchor{library/sqlite3 sqlite3-row-objects}@anchor{2e1e}
@subsubsection Row objects


@geindex Row (class in sqlite3)
@anchor{library/sqlite3 sqlite3 Row}@anchor{1077}
@deffn {Class} sqlite3.Row

A @code{Row} instance serves as a highly optimized
@ref{19e7,,row_factory} for @ref{54e,,Connection} objects.
It supports iteration, equality testing, @ref{841,,len()},
and @ref{13c7,,mapping} access by column name and index.

Two @code{Row} objects compare equal
if they have identical column names and values.

See @ref{2ddc,,How to create and use row factories} for more details.

@geindex keys() (sqlite3.Row method)
@anchor{library/sqlite3 sqlite3 Row keys}@anchor{2e1f}
@deffn {Method} keys ()

Return a @ref{24f,,list} of column names as @ref{16a,,strings}.
Immediately after a query,
it is the first member of each tuple in @ref{18f2,,Cursor.description}.
@end deffn


Changed in version 3.5: Added support of slicing.

@end deffn

@node Blob objects,PrepareProtocol objects,Row objects,Reference
@anchor{library/sqlite3 blob-objects}@anchor{2e20}@anchor{library/sqlite3 sqlite3-blob-objects}@anchor{2e21}
@subsubsection Blob objects


@geindex Blob (class in sqlite3)
@anchor{library/sqlite3 sqlite3 Blob}@anchor{894}
@deffn {Class} sqlite3.Blob


Added in version 3.11.


A @code{Blob} instance is a @ref{17fd,,file-like object}
that can read and write data in an SQLite @abbr{BLOB}.
Call @ref{841,,len(blob)} to get the size (number of bytes) of the blob.
Use indices and @ref{24f5,,slices} for direct access to the blob data.

Use the @code{Blob} as a @ref{1e3,,context manager} to ensure that the blob
handle is closed after use.

@example
con = sqlite3.connect(":memory:")
con.execute("CREATE TABLE test(blob_col blob)")
con.execute("INSERT INTO test(blob_col) VALUES(zeroblob(13))")

# Write to our blob, using two write operations:
with con.blobopen("test", "blob_col", 1) as blob:
    blob.write(b"hello, ")
    blob.write(b"world.")
    # Modify the first and last bytes of our blob
    blob[0] = ord("H")
    blob[-1] = ord("!")

# Read the contents of our blob
with con.blobopen("test", "blob_col", 1) as blob:
    greeting = blob.read()

print(greeting)  # outputs "b'Hello, world!'"
con.close()
@end example

@c b'Hello, world!'

@geindex close() (sqlite3.Blob method)
@anchor{library/sqlite3 sqlite3 Blob close}@anchor{2e22}
@deffn {Method} close ()

Close the blob.

The blob will be unusable from this point onward.  An
@ref{1c68,,Error} (or subclass) exception will be raised if any
further operation is attempted with the blob.
@end deffn

@geindex read() (sqlite3.Blob method)
@anchor{library/sqlite3 sqlite3 Blob read}@anchor{2e23}
@deffn {Method} read (length=-1, /)

Read `length' bytes of data from the blob at the current offset position.
If the end of the blob is reached, the data up to
@abbr{EOF,End of File} will be returned.  When `length' is not
specified, or is negative, @code{read()} will read until the end of
the blob.
@end deffn

@geindex write() (sqlite3.Blob method)
@anchor{library/sqlite3 sqlite3 Blob write}@anchor{2e24}
@deffn {Method} write (data, /)

Write `data' to the blob at the current offset.  This function cannot
change the blob length.  Writing beyond the end of the blob will raise
@ref{2ee,,ValueError}.
@end deffn

@geindex tell() (sqlite3.Blob method)
@anchor{library/sqlite3 sqlite3 Blob tell}@anchor{2e25}
@deffn {Method} tell ()

Return the current access position of the blob.
@end deffn

@geindex seek() (sqlite3.Blob method)
@anchor{library/sqlite3 sqlite3 Blob seek}@anchor{2e26}
@deffn {Method} seek (offset, origin=os.SEEK_SET, /)

Set the current access position of the blob to `offset'.  The `origin'
argument defaults to @ref{1499,,os.SEEK_SET} (absolute blob positioning).
Other values for `origin' are @ref{149a,,os.SEEK_CUR} (seek relative to the
current position) and @ref{149b,,os.SEEK_END} (seek relative to the blob’s
end).
@end deffn
@end deffn

@node PrepareProtocol objects,Exceptions<7>,Blob objects,Reference
@anchor{library/sqlite3 prepareprotocol-objects}@anchor{2e27}
@subsubsection PrepareProtocol objects


@geindex PrepareProtocol (class in sqlite3)
@anchor{library/sqlite3 sqlite3 PrepareProtocol}@anchor{1baf}
@deffn {Class} sqlite3.PrepareProtocol

The PrepareProtocol type’s single purpose is to act as a 
@geindex Python Enhancement Proposals; PEP 246
PEP 246@footnote{https://peps.python.org/pep-0246/} style
adaption protocol for objects that can @ref{2e28,,adapt themselves} to @ref{2de1,,native SQLite types}.
@end deffn

@node Exceptions<7>,SQLite and Python types,PrepareProtocol objects,Reference
@anchor{library/sqlite3 exceptions}@anchor{2e29}@anchor{library/sqlite3 sqlite3-exceptions}@anchor{2e2a}
@subsubsection Exceptions


The exception hierarchy is defined by the DB-API 2.0 (
@geindex Python Enhancement Proposals; PEP 249
PEP 249@footnote{https://peps.python.org/pep-0249/}).

@geindex Warning
@anchor{library/sqlite3 sqlite3 Warning}@anchor{1bf9}
@deffn {Exception} sqlite3.Warning

This exception is not currently raised by the @code{sqlite3} module,
but may be raised by applications using @code{sqlite3},
for example if a user-defined function truncates data while inserting.
@code{Warning} is a subclass of @ref{bd3,,Exception}.
@end deffn

@geindex Error
@anchor{library/sqlite3 sqlite3 Error}@anchor{1c68}
@deffn {Exception} sqlite3.Error

The base class of the other exceptions in this module.
Use this to catch all errors with one single @ref{1ac,,except} statement.
@code{Error} is a subclass of @ref{bd3,,Exception}.

If the exception originated from within the SQLite library,
the following two attributes are added to the exception:

@geindex sqlite_errorcode (sqlite3.Error attribute)
@anchor{library/sqlite3 sqlite3 Error sqlite_errorcode}@anchor{88a}
@deffn {Attribute} sqlite_errorcode

The numeric error code from the
SQLite API@footnote{https://sqlite.org/rescode.html}


Added in version 3.11.

@end deffn

@geindex sqlite_errorname (sqlite3.Error attribute)
@anchor{library/sqlite3 sqlite3 Error sqlite_errorname}@anchor{88b}
@deffn {Attribute} sqlite_errorname

The symbolic name of the numeric error code
from the SQLite API@footnote{https://sqlite.org/rescode.html}


Added in version 3.11.

@end deffn
@end deffn

@geindex InterfaceError
@anchor{library/sqlite3 sqlite3 InterfaceError}@anchor{88f}
@deffn {Exception} sqlite3.InterfaceError

Exception raised for misuse of the low-level SQLite C API.
In other words, if this exception is raised, it probably indicates a bug in the
@code{sqlite3} module.
@code{InterfaceError} is a subclass of @ref{1c68,,Error}.
@end deffn

@geindex DatabaseError
@anchor{library/sqlite3 sqlite3 DatabaseError}@anchor{2e10}
@deffn {Exception} sqlite3.DatabaseError

Exception raised for errors that are related to the database.
This serves as the base exception for several types of database errors.
It is only raised implicitly through the specialised subclasses.
@code{DatabaseError} is a subclass of @ref{1c68,,Error}.
@end deffn

@geindex DataError
@anchor{library/sqlite3 sqlite3 DataError}@anchor{1c94}
@deffn {Exception} sqlite3.DataError

Exception raised for errors caused by problems with the processed data,
like numeric values out of range, and strings which are too long.
@code{DataError} is a subclass of @ref{2e10,,DatabaseError}.
@end deffn

@geindex OperationalError
@anchor{library/sqlite3 sqlite3 OperationalError}@anchor{1c95}
@deffn {Exception} sqlite3.OperationalError

Exception raised for errors that are related to the database’s operation,
and not necessarily under the control of the programmer.
For example, the database path is not found,
or a transaction could not be processed.
@code{OperationalError} is a subclass of @ref{2e10,,DatabaseError}.
@end deffn

@geindex IntegrityError
@anchor{library/sqlite3 sqlite3 IntegrityError}@anchor{2e2b}
@deffn {Exception} sqlite3.IntegrityError

Exception raised when the relational integrity of the database is affected,
e.g. a foreign key check fails.  It is a subclass of @ref{2e10,,DatabaseError}.
@end deffn

@geindex InternalError
@anchor{library/sqlite3 sqlite3 InternalError}@anchor{2e2c}
@deffn {Exception} sqlite3.InternalError

Exception raised when SQLite encounters an internal error.
If this is raised, it may indicate that there is a problem with the runtime
SQLite library.
@code{InternalError} is a subclass of @ref{2e10,,DatabaseError}.
@end deffn

@geindex ProgrammingError
@anchor{library/sqlite3 sqlite3 ProgrammingError}@anchor{307}
@deffn {Exception} sqlite3.ProgrammingError

Exception raised for @code{sqlite3} API programming errors,
for example supplying the wrong number of bindings to a query,
or trying to operate on a closed @ref{54e,,Connection}.
@code{ProgrammingError} is a subclass of @ref{2e10,,DatabaseError}.
@end deffn

@geindex NotSupportedError
@anchor{library/sqlite3 sqlite3 NotSupportedError}@anchor{2e0e}
@deffn {Exception} sqlite3.NotSupportedError

Exception raised in case a method or database API is not supported by the
underlying SQLite library. For example, setting `deterministic' to
@code{True} in @ref{5a7,,create_function()}, if the underlying SQLite library
does not support deterministic functions.
@code{NotSupportedError} is a subclass of @ref{2e10,,DatabaseError}.
@end deffn

@node SQLite and Python types,Default adapters and converters deprecated,Exceptions<7>,Reference
@anchor{library/sqlite3 sqlite-and-python-types}@anchor{2e2d}@anchor{library/sqlite3 sqlite3-types}@anchor{2de1}
@subsubsection SQLite and Python types


SQLite natively supports the following types: @code{NULL}, @code{INTEGER},
@code{REAL}, @code{TEXT}, @code{BLOB}.

The following Python types can thus be sent to SQLite without any problem:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxx} 
@headitem

Python type

@tab

SQLite type

@item

@code{None}

@tab

@code{NULL}

@item

@ref{19c,,int}

@tab

@code{INTEGER}

@item

@ref{197,,float}

@tab

@code{REAL}

@item

@ref{16a,,str}

@tab

@code{TEXT}

@item

@ref{193,,bytes}

@tab

@code{BLOB}

@end multitable


This is how SQLite types are converted to Python types by default:


@multitable {xxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

SQLite type

@tab

Python type

@item

@code{NULL}

@tab

@code{None}

@item

@code{INTEGER}

@tab

@ref{19c,,int}

@item

@code{REAL}

@tab

@ref{197,,float}

@item

@code{TEXT}

@tab

depends on @ref{2e14,,text_factory},
@ref{16a,,str} by default

@item

@code{BLOB}

@tab

@ref{193,,bytes}

@end multitable


The type system of the @code{sqlite3} module is extensible in two ways: you can
store additional Python types in an SQLite database via
@ref{2dda,,object adapters},
and you can let the @code{sqlite3} module convert SQLite types to
Python types via @ref{2ddb,,converters}.

@node Default adapters and converters deprecated,Command-line interface<2>,SQLite and Python types,Reference
@anchor{library/sqlite3 default-adapters-and-converters-deprecated}@anchor{2e2e}@anchor{library/sqlite3 sqlite3-default-converters}@anchor{715}
@subsubsection Default adapters and converters (deprecated)


@cartouche
@quotation Note 
The default adapters and converters are deprecated as of Python 3.12.
Instead, use the @ref{716,,Adapter and converter recipes}
and tailor them to your needs.
@end quotation
@end cartouche

The deprecated default adapters and converters consist of:


@itemize *

@item 
An adapter for @ref{1fc,,datetime.date} objects to @ref{16a,,strings} in
ISO 8601@footnote{https://en.wikipedia.org/wiki/ISO_8601} format.

@item 
An adapter for @ref{4e3,,datetime.datetime} objects to strings in
ISO 8601 format.

@item 
A converter for @ref{2ddb,,declared} “date” types to
@ref{1fc,,datetime.date} objects.

@item 
A converter for declared “timestamp” types to
@ref{4e3,,datetime.datetime} objects.
Fractional parts will be truncated to 6 digits (microsecond precision).
@end itemize

@cartouche
@quotation Note 
The default “timestamp” converter ignores UTC offsets in the database and
always returns a naive @ref{4e3,,datetime.datetime} object. To preserve UTC
offsets in timestamps, either leave converters disabled, or register an
offset-aware converter with @ref{2de2,,register_converter()}.
@end quotation
@end cartouche


Deprecated since version 3.12.


@node Command-line interface<2>,,Default adapters and converters deprecated,Reference
@anchor{library/sqlite3 command-line-interface}@anchor{2e2f}@anchor{library/sqlite3 sqlite3-cli}@anchor{674}
@subsubsection Command-line interface


The @code{sqlite3} module can be invoked as a script,
using the interpreter’s @ref{23e,,-m} switch,
in order to provide a simple SQLite shell.
The argument signature is as follows:

@example
python -m sqlite3 [-h] [-v] [filename] [sql]
@end example

Type @code{.quit} or CTRL-D to exit the shell.

@geindex python--m-sqlite3-[-h]-[-v]-[filename]-[sql] command line option; -h
@geindex python--m-sqlite3-[-h]-[-v]-[filename]-[sql] command line option; --help
@anchor{library/sqlite3 cmdoption-python-m-sqlite3-h-v-filename-sql-h}@anchor{2e30}@anchor{library/sqlite3 cmdoption-python-m-sqlite3-h-v-filename-sql-help}@anchor{2e31}
@deffn {Option} @w{-}h, @w{-}@w{-}help

Print CLI help.
@end deffn

@geindex python--m-sqlite3-[-h]-[-v]-[filename]-[sql] command line option; -v
@geindex python--m-sqlite3-[-h]-[-v]-[filename]-[sql] command line option; --version
@anchor{library/sqlite3 cmdoption-python-m-sqlite3-h-v-filename-sql-v}@anchor{2e32}@anchor{library/sqlite3 cmdoption-python-m-sqlite3-h-v-filename-sql-version}@anchor{2e33}
@deffn {Option} @w{-}v, @w{-}@w{-}version

Print underlying SQLite library version.
@end deffn


Added in version 3.12.


@node How-to guides,Explanation,Reference,sqlite3 — DB-API 2 0 interface for SQLite databases
@anchor{library/sqlite3 how-to-guides}@anchor{2e34}@anchor{library/sqlite3 sqlite3-howtos}@anchor{2dd1}
@subsubsection How-to guides


@menu
* How to use placeholders to bind values in SQL queries:: 
* How to adapt custom Python types to SQLite values:: 
* How to convert SQLite values to custom Python types:: 
* Adapter and converter recipes:: 
* How to use connection shortcut methods:: 
* How to use the connection context manager:: 
* How to work with SQLite URIs:: 
* How to create and use row factories:: 
* How to handle non-UTF-8 text encodings:: 

@end menu

@node How to use placeholders to bind values in SQL queries,How to adapt custom Python types to SQLite values,,How-to guides
@anchor{library/sqlite3 how-to-use-placeholders-to-bind-values-in-sql-queries}@anchor{2e35}@anchor{library/sqlite3 sqlite3-placeholders}@anchor{5b2}
@subsubsection How to use placeholders to bind values in SQL queries


SQL operations usually need to use values from Python variables. However,
beware of using Python’s string operations to assemble queries, as they
are vulnerable to SQL injection attacks@footnote{https://en.wikipedia.org/wiki/SQL_injection}. For example, an attacker can simply
close the single quote and inject @code{OR TRUE} to select all rows:

@example
>>> # Never do this -- insecure!
>>> symbol = input()
' OR TRUE; --
>>> sql = "SELECT * FROM stocks WHERE symbol = '%s'" % symbol
>>> print(sql)
SELECT * FROM stocks WHERE symbol = '@w{'} OR TRUE; --'
>>> cur.execute(sql)
@end example

Instead, use the DB-API’s parameter substitution. To insert a variable into a
query string, use a placeholder in the string, and substitute the actual values
into the query by providing them as a @ref{614,,tuple} of values to the second
argument of the cursor’s @ref{5b0,,execute()} method.

An SQL statement may use one of two kinds of placeholders:
question marks (qmark style) or named placeholders (named style).
For the qmark style, `parameters' must be a
@ref{717,,sequence} whose length must match the number of placeholders,
or a @ref{307,,ProgrammingError} is raised.
For the named style, `parameters' must be
an instance of a @ref{184,,dict} (or a subclass),
which must contain keys for all named parameters;
any extra items are ignored.
Here’s an example of both styles:

@example
con = sqlite3.connect(":memory:")
cur = con.execute("CREATE TABLE lang(name, first_appeared)")

# This is the named style used with executemany():
data = (
    @{"name": "C", "year": 1972@},
    @{"name": "Fortran", "year": 1957@},
    @{"name": "Python", "year": 1991@},
    @{"name": "Go", "year": 2009@},
)
cur.executemany("INSERT INTO lang VALUES(:name, :year)", data)

# This is the qmark style used in a SELECT query:
params = (1972,)
cur.execute("SELECT * FROM lang WHERE first_appeared = ?", params)
print(cur.fetchall())
con.close()
@end example

@c [('C', 1972)]

@cartouche
@quotation Note 
@geindex Python Enhancement Proposals; PEP 249
PEP 249@footnote{https://peps.python.org/pep-0249/} numeric placeholders are `not' supported.
If used, they will be interpreted as named placeholders.
@end quotation
@end cartouche

@node How to adapt custom Python types to SQLite values,How to convert SQLite values to custom Python types,How to use placeholders to bind values in SQL queries,How-to guides
@anchor{library/sqlite3 how-to-adapt-custom-python-types-to-sqlite-values}@anchor{2e36}@anchor{library/sqlite3 sqlite3-adapters}@anchor{2dda}
@subsubsection How to adapt custom Python types to SQLite values


SQLite supports only a limited set of data types natively.
To store custom Python types in SQLite databases, `adapt' them to one of the
@ref{2de1,,Python types SQLite natively understands}.

There are two ways to adapt Python objects to SQLite types:
letting your object adapt itself, or using an `adapter callable'.
The latter will take precedence above the former.
For a library that exports a custom type,
it may make sense to enable that type to adapt itself.
As an application developer, it may make more sense to take direct control by
registering custom adapter functions.

@menu
* How to write adaptable objects:: 
* How to register adapter callables:: 

@end menu

@node How to write adaptable objects,How to register adapter callables,,How to adapt custom Python types to SQLite values
@anchor{library/sqlite3 how-to-write-adaptable-objects}@anchor{2e37}@anchor{library/sqlite3 sqlite3-conform}@anchor{2e28}
@subsubsection How to write adaptable objects


Suppose we have a @code{Point} class that represents a pair of coordinates,
@code{x} and @code{y}, in a Cartesian coordinate system.
The coordinate pair will be stored as a text string in the database,
using a semicolon to separate the coordinates.
This can be implemented by adding a @code{__conform__(self, protocol)}
method which returns the adapted value.
The object passed to `protocol' will be of type @ref{1baf,,PrepareProtocol}.

@example
class Point:
    def __init__(self, x, y):
        self.x, self.y = x, y

    def __conform__(self, protocol):
        if protocol is sqlite3.PrepareProtocol:
            return f"@{self.x@};@{self.y@}"

con = sqlite3.connect(":memory:")
cur = con.cursor()

cur.execute("SELECT ?", (Point(4.0, -3.2),))
print(cur.fetchone()[0])
con.close()
@end example

@c 4.0;-3.2

@node How to register adapter callables,,How to write adaptable objects,How to adapt custom Python types to SQLite values
@anchor{library/sqlite3 how-to-register-adapter-callables}@anchor{2e38}
@subsubsection How to register adapter callables


The other possibility is to create a function that converts the Python object
to an SQLite-compatible type.
This function can then be registered using @ref{2deb,,register_adapter()}.

@example
class Point:
    def __init__(self, x, y):
        self.x, self.y = x, y

def adapt_point(point):
    return f"@{point.x@};@{point.y@}"

sqlite3.register_adapter(Point, adapt_point)

con = sqlite3.connect(":memory:")
cur = con.cursor()

cur.execute("SELECT ?", (Point(1.0, 2.5),))
print(cur.fetchone()[0])
con.close()
@end example

@c 1.0;2.5

@node How to convert SQLite values to custom Python types,Adapter and converter recipes,How to adapt custom Python types to SQLite values,How-to guides
@anchor{library/sqlite3 how-to-convert-sqlite-values-to-custom-python-types}@anchor{2e39}@anchor{library/sqlite3 sqlite3-converters}@anchor{2ddb}
@subsubsection How to convert SQLite values to custom Python types


Writing an adapter lets you convert `from' custom Python types `to' SQLite
values.
To be able to convert `from' SQLite values `to' custom Python types,
we use `converters'.

Let’s go back to the @code{Point} class. We stored the x and y coordinates
separated via semicolons as strings in SQLite.

First, we’ll define a converter function that accepts the string as a parameter
and constructs a @code{Point} object from it.

@cartouche
@quotation Note 
Converter functions are `always' passed a @ref{193,,bytes} object,
no matter the underlying SQLite data type.
@end quotation
@end cartouche

@example
def convert_point(s):
    x, y = map(float, s.split(b";"))
    return Point(x, y)
@end example

We now need to tell @code{sqlite3} when it should convert a given SQLite value.
This is done when connecting to a database, using the `detect_types' parameter
of @ref{5a6,,connect()}. There are three options:


@itemize *

@item 
Implicit: set `detect_types' to @ref{2de3,,PARSE_DECLTYPES}

@item 
Explicit: set `detect_types' to @ref{2de4,,PARSE_COLNAMES}

@item 
Both: set `detect_types' to
@code{sqlite3.PARSE_DECLTYPES | sqlite3.PARSE_COLNAMES}.
Column names take precedence over declared types.
@end itemize

The following example illustrates the implicit and explicit approaches:

@example
class Point:
    def __init__(self, x, y):
        self.x, self.y = x, y

    def __repr__(self):
        return f"Point(@{self.x@}, @{self.y@})"

def adapt_point(point):
    return f"@{point.x@};@{point.y@}"

def convert_point(s):
    x, y = list(map(float, s.split(b";")))
    return Point(x, y)

# Register the adapter and converter
sqlite3.register_adapter(Point, adapt_point)
sqlite3.register_converter("point", convert_point)

# 1) Parse using declared types
p = Point(4.0, -3.2)
con = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_DECLTYPES)
cur = con.execute("CREATE TABLE test(p point)")

cur.execute("INSERT INTO test(p) VALUES(?)", (p,))
cur.execute("SELECT p FROM test")
print("with declared types:", cur.fetchone()[0])
cur.close()
con.close()

# 2) Parse using column names
con = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_COLNAMES)
cur = con.execute("CREATE TABLE test(p)")

cur.execute("INSERT INTO test(p) VALUES(?)", (p,))
cur.execute('SELECT p AS "p [point]" FROM test')
print("with column names:", cur.fetchone()[0])
cur.close()
con.close()
@end example

@c with declared types: Point(4.0, -3.2)
@c with column names: Point(4.0, -3.2)

@node Adapter and converter recipes,How to use connection shortcut methods,How to convert SQLite values to custom Python types,How-to guides
@anchor{library/sqlite3 adapter-and-converter-recipes}@anchor{2e3a}@anchor{library/sqlite3 sqlite3-adapter-converter-recipes}@anchor{716}
@subsubsection Adapter and converter recipes


This section shows recipes for common adapters and converters.

@example
import datetime as dt
import sqlite3

def adapt_date_iso(val):
    """Adapt datetime.date to ISO 8601 date."""
    return val.isoformat()

def adapt_datetime_iso(val):
    """Adapt datetime.datetime to timezone-naive ISO 8601 date."""
    return val.replace(tzinfo=None).isoformat()

def adapt_datetime_epoch(val):
    """Adapt datetime.datetime to Unix timestamp."""
    return int(val.timestamp())

sqlite3.register_adapter(dt.date, adapt_date_iso)
sqlite3.register_adapter(dt.datetime, adapt_datetime_iso)
sqlite3.register_adapter(dt.datetime, adapt_datetime_epoch)

def convert_date(val):
    """Convert ISO 8601 date to datetime.date object."""
    return dt.date.fromisoformat(val.decode())

def convert_datetime(val):
    """Convert ISO 8601 datetime to datetime.datetime object."""
    return dt.datetime.fromisoformat(val.decode())

def convert_timestamp(val):
    """Convert Unix epoch timestamp to datetime.datetime object."""
    return dt.datetime.fromtimestamp(int(val))

sqlite3.register_converter("date", convert_date)
sqlite3.register_converter("datetime", convert_datetime)
sqlite3.register_converter("timestamp", convert_timestamp)
@end example

@c when = dt.datetime(2019, 5, 18, 15, 17, 8, 123456)
@c 
@c assert adapt_date_iso(when.date()) == "2019-05-18"
@c assert convert_date(b"2019-05-18") == when.date()
@c 
@c assert adapt_datetime_iso(when) == "2019-05-18T15:17:08.123456"
@c assert convert_datetime(b"2019-05-18T15:17:08.123456") == when
@c 
@c # Using current time as fromtimestamp() returns local date/time.
@c # Dropping microseconds as adapt_datetime_epoch truncates fractional second part.
@c now = dt.datetime.now().replace(microsecond=0)
@c current_timestamp = int(now.timestamp())
@c 
@c assert adapt_datetime_epoch(now) == current_timestamp
@c assert convert_timestamp(str(current_timestamp).encode()) == now

@node How to use connection shortcut methods,How to use the connection context manager,Adapter and converter recipes,How-to guides
@anchor{library/sqlite3 how-to-use-connection-shortcut-methods}@anchor{2e3b}@anchor{library/sqlite3 sqlite3-connection-shortcuts}@anchor{2e07}
@subsubsection How to use connection shortcut methods


Using the @ref{2e09,,execute()},
@ref{2e0a,,executemany()}, and @ref{2e0b,,executescript()}
methods of the @ref{54e,,Connection} class, your code can
be written more concisely because you don’t have to create the (often
superfluous) @ref{2dd5,,Cursor} objects explicitly. Instead, the @code{Cursor}
objects are created implicitly and these shortcut methods return the cursor
objects. This way, you can execute a @code{SELECT} statement and iterate over it
directly using only a single call on the @code{Connection} object.

@example
# Create and fill the table.
con = sqlite3.connect(":memory:")
con.execute("CREATE TABLE lang(name, first_appeared)")
data = [
    ("C++", 1985),
    ("Objective-C", 1984),
]
con.executemany("INSERT INTO lang(name, first_appeared) VALUES(?, ?)", data)

# Print the table contents
for row in con.execute("SELECT name, first_appeared FROM lang"):
    print(row)

print("I just deleted", con.execute("DELETE FROM lang").rowcount, "rows")

# close() is not a shortcut method and it's not called automatically;
# the connection object should be closed manually
con.close()
@end example

@c ('C++', 1985)
@c ('Objective-C', 1984)
@c I just deleted 2 rows

@node How to use the connection context manager,How to work with SQLite URIs,How to use connection shortcut methods,How-to guides
@anchor{library/sqlite3 how-to-use-the-connection-context-manager}@anchor{2e3c}@anchor{library/sqlite3 sqlite3-connection-context-manager}@anchor{1bb0}
@subsubsection How to use the connection context manager


A @ref{54e,,Connection} object can be used as a context manager that
automatically commits or rolls back open transactions when leaving the body of
the context manager.
If the body of the @ref{187,,with} statement finishes without exceptions,
the transaction is committed.
If this commit fails,
or if the body of the @code{with} statement raises an uncaught exception,
the transaction is rolled back.
If @ref{6de,,autocommit} is @code{False},
a new transaction is implicitly opened after committing or rolling back.

If there is no open transaction upon leaving the body of the @code{with} statement,
or if @ref{6de,,autocommit} is @code{True},
the context manager does nothing.

@cartouche
@quotation Note 
The context manager neither implicitly opens a new transaction
nor closes the connection. If you need a closing context manager, consider
using @ref{1595,,contextlib.closing()}.
@end quotation
@end cartouche

@example
con = sqlite3.connect(":memory:")
con.execute("CREATE TABLE lang(id INTEGER PRIMARY KEY, name VARCHAR UNIQUE)")

# Successful, con.commit() is called automatically afterwards
with con:
    con.execute("INSERT INTO lang(name) VALUES(?)", ("Python",))

# con.rollback() is called after the with block finishes with an exception,
# the exception is still raised and must be caught
try:
    with con:
        con.execute("INSERT INTO lang(name) VALUES(?)", ("Python",))
except sqlite3.IntegrityError:
    print("couldn't add Python twice")

# Connection object used as context manager only commits or rollbacks transactions,
# so the connection object should be closed manually
con.close()
@end example

@c couldn't add Python twice

@node How to work with SQLite URIs,How to create and use row factories,How to use the connection context manager,How-to guides
@anchor{library/sqlite3 how-to-work-with-sqlite-uris}@anchor{2e3d}@anchor{library/sqlite3 sqlite3-uri-tricks}@anchor{2de8}
@subsubsection How to work with SQLite URIs


Some useful URI tricks include:


@itemize *

@item 
Open a database in read-only mode:
@end itemize

@example
>>> con = sqlite3.connect("file:tutorial.db?mode=ro", uri=True)
>>> con.execute("CREATE TABLE readonly(data)")
Traceback (most recent call last):
OperationalError: attempt to write a readonly database
>>> con.close()
@end example


@itemize *

@item 
Do not implicitly create a new database file if it does not already exist;
will raise @ref{1c95,,OperationalError} if unable to create a new file:
@end itemize

@example
>>> con = sqlite3.connect("file:nosuchdb.db?mode=rw", uri=True)
Traceback (most recent call last):
OperationalError: unable to open database file
@end example


@itemize *

@item 
Create a shared named in-memory database:
@end itemize

@example
db = "file:mem1?mode=memory&cache=shared"
con1 = sqlite3.connect(db, uri=True)
con2 = sqlite3.connect(db, uri=True)
with con1:
    con1.execute("CREATE TABLE shared(data)")
    con1.execute("INSERT INTO shared VALUES(28)")
res = con2.execute("SELECT data FROM shared")
assert res.fetchone() == (28,)

con1.close()
con2.close()
@end example

More information about this feature, including a list of parameters,
can be found in the SQLite URI documentation@footnote{https://www.sqlite.org/uri.html}.

@node How to create and use row factories,How to handle non-UTF-8 text encodings,How to work with SQLite URIs,How-to guides
@anchor{library/sqlite3 how-to-create-and-use-row-factories}@anchor{2e3e}@anchor{library/sqlite3 sqlite3-howto-row-factory}@anchor{2ddc}
@subsubsection How to create and use row factories


By default, @code{sqlite3} represents each row as a @ref{614,,tuple}.
If a @code{tuple} does not suit your needs,
you can use the @ref{1077,,sqlite3.Row} class
or a custom @ref{2e13,,row_factory}.

While @code{row_factory} exists as an attribute both on the
@ref{2dd5,,Cursor} and the @ref{54e,,Connection},
it is recommended to set @ref{19e7,,Connection.row_factory},
so all cursors created from the connection will use the same row factory.

@code{Row} provides indexed and case-insensitive named access to columns,
with minimal memory overhead and performance impact over a @code{tuple}.
To use @code{Row} as a row factory,
assign it to the @code{row_factory} attribute:

@example
>>> con = sqlite3.connect(":memory:")
>>> con.row_factory = sqlite3.Row
@end example

Queries now return @code{Row} objects:

@example
>>> res = con.execute("SELECT 'Earth' AS name, 6378 AS radius")
>>> row = res.fetchone()
>>> row.keys()
['name', 'radius']
>>> row[0]         # Access by index.
'Earth'
>>> row["name"]    # Access by name.
'Earth'
>>> row["RADIUS"]  # Column names are case-insensitive.
6378
>>> con.close()
@end example

@cartouche
@quotation Note 
The @code{FROM} clause can be omitted in the @code{SELECT} statement, as in the
above example. In such cases, SQLite returns a single row with columns
defined by expressions, e.g. literals, with the given aliases
@code{expr AS alias}.
@end quotation
@end cartouche

You can create a custom @ref{2e13,,row_factory}
that returns each row as a @ref{184,,dict}, with column names mapped to values:

@example
def dict_factory(cursor, row):
    fields = [column[0] for column in cursor.description]
    return @{key: value for key, value in zip(fields, row)@}
@end example

Using it, queries now return a @code{dict} instead of a @code{tuple}:

@example
>>> con = sqlite3.connect(":memory:")
>>> con.row_factory = dict_factory
>>> for row in con.execute("SELECT 1 AS a, 2 AS b"):
...     print(row)
@{'a': 1, 'b': 2@}
>>> con.close()
@end example

The following row factory returns a @ref{85f,,named tuple}:

@example
from collections import namedtuple

def namedtuple_factory(cursor, row):
    fields = [column[0] for column in cursor.description]
    cls = namedtuple("Row", fields)
    return cls._make(row)
@end example

@code{namedtuple_factory()} can be used as follows:

@example
>>> con = sqlite3.connect(":memory:")
>>> con.row_factory = namedtuple_factory
>>> cur = con.execute("SELECT 1 AS a, 2 AS b")
>>> row = cur.fetchone()
>>> row
Row(a=1, b=2)
>>> row[0]  # Indexed access.
1
>>> row.b   # Attribute access.
2
>>> con.close()
@end example

With some adjustments, the above recipe can be adapted to use a
@ref{4e2,,dataclass}, or any other custom class,
instead of a @ref{4e1,,namedtuple}.

@node How to handle non-UTF-8 text encodings,,How to create and use row factories,How-to guides
@anchor{library/sqlite3 how-to-handle-non-utf-8-text-encodings}@anchor{2e3f}@anchor{library/sqlite3 sqlite3-howto-encoding}@anchor{2e11}
@subsubsection How to handle non-UTF-8 text encodings


By default, @code{sqlite3} uses @ref{16a,,str} to adapt SQLite values
with the @code{TEXT} data type.
This works well for UTF-8 encoded text, but it might fail for other encodings
and invalid UTF-8.
You can use a custom @ref{2e14,,text_factory} to handle such cases.

Because of SQLite’s flexible typing@footnote{https://www.sqlite.org/flextypegood.html}, it is not uncommon to encounter table
columns with the @code{TEXT} data type containing non-UTF-8 encodings,
or even arbitrary data.
To demonstrate, let’s assume we have a database with ISO-8859-2 (Latin-2)
encoded text, for example a table of Czech-English dictionary entries.
Assuming we now have a @ref{54e,,Connection} instance @code{con}
connected to this database,
we can decode the Latin-2 encoded text using this @ref{2e14,,text_factory}:

@example
con.text_factory = lambda data: str(data, encoding="latin2")
@end example

For invalid UTF-8 or arbitrary data in stored in @code{TEXT} table columns,
you can use the following technique, borrowed from the @ref{14b0,,Unicode HOWTO}:

@example
con.text_factory = lambda data: str(data, errors="surrogateescape")
@end example

@cartouche
@quotation Note 
The @code{sqlite3} module API does not support strings
containing surrogates.
@end quotation
@end cartouche


@subsubheading See also


@ref{14b0,,Unicode HOWTO}


@node Explanation,,How-to guides,sqlite3 — DB-API 2 0 interface for SQLite databases
@anchor{library/sqlite3 explanation}@anchor{2e40}@anchor{library/sqlite3 sqlite3-explanation}@anchor{2dd2}
@subsubsection Explanation

@anchor{library/sqlite3 sqlite3-transaction-control}@anchor{2e41}
@menu
* Transaction control:: 

@end menu

@node Transaction control,,,Explanation
@anchor{library/sqlite3 sqlite3-controlling-transactions}@anchor{2dd7}@anchor{library/sqlite3 transaction-control}@anchor{2e42}
@subsubsection Transaction control


@code{sqlite3} offers multiple methods of controlling whether,
when and how database transactions are opened and closed.
@ref{6df,,Transaction control via the autocommit attribute} is recommended,
while @ref{2de6,,Transaction control via the isolation_level attribute}
retains the pre-Python 3.12 behaviour.

@menu
* Transaction control via the autocommit attribute:: 
* Transaction control via the isolation_level attribute:: 

@end menu

@node Transaction control via the autocommit attribute,Transaction control via the isolation_level attribute,,Transaction control
@anchor{library/sqlite3 sqlite3-transaction-control-autocommit}@anchor{6df}@anchor{library/sqlite3 transaction-control-via-the-autocommit-attribute}@anchor{2e43}
@subsubsection Transaction control via the @code{autocommit} attribute


The recommended way of controlling transaction behaviour is through
the @ref{6de,,Connection.autocommit} attribute,
which should preferably be set using the `autocommit' parameter
of @ref{5a6,,connect()}.

It is suggested to set `autocommit' to @code{False},
which implies 
@geindex Python Enhancement Proposals; PEP 249
PEP 249@footnote{https://peps.python.org/pep-0249/}-compliant transaction control.
This means:


@itemize *

@item 
@code{sqlite3} ensures that a transaction is always open,
so @ref{5a6,,connect()}, @ref{2dd8,,Connection.commit()}, and @ref{2e08,,Connection.rollback()}
will implicitly open a new transaction
(immediately after closing the pending one, for the latter two).
@code{sqlite3} uses @code{BEGIN DEFERRED} statements when opening transactions.

@item 
Transactions should be committed explicitly using @code{commit()}.

@item 
Transactions should be rolled back explicitly using @code{rollback()}.

@item 
An implicit rollback is performed if the database is
@ref{54f,,close()}-ed with pending changes.
@end itemize

Set `autocommit' to @code{True} to enable SQLite’s autocommit mode@footnote{https://www.sqlite.org/lang_transaction.html#implicit_versus_explicit_transactions}.
In this mode, @ref{2dd8,,Connection.commit()} and @ref{2e08,,Connection.rollback()}
have no effect.
Note that SQLite’s autocommit mode is distinct from
the 
@geindex Python Enhancement Proposals; PEP 249
PEP 249@footnote{https://peps.python.org/pep-0249/}-compliant @ref{6de,,Connection.autocommit} attribute;
use @ref{2e12,,Connection.in_transaction} to query
the low-level SQLite autocommit mode.

Set `autocommit' to @ref{2de7,,LEGACY_TRANSACTION_CONTROL}
to leave transaction control behaviour to the
@ref{2de5,,Connection.isolation_level} attribute.
See @ref{2de6,,Transaction control via the isolation_level attribute} for more information.

@node Transaction control via the isolation_level attribute,,Transaction control via the autocommit attribute,Transaction control
@anchor{library/sqlite3 sqlite3-transaction-control-isolation-level}@anchor{2de6}@anchor{library/sqlite3 transaction-control-via-the-isolation-level-attribute}@anchor{2e44}
@subsubsection Transaction control via the @code{isolation_level} attribute


@cartouche
@quotation Note 
The recommended way of controlling transactions is via the
@ref{6de,,autocommit} attribute.
See @ref{6df,,Transaction control via the autocommit attribute}.
@end quotation
@end cartouche

If @ref{6de,,Connection.autocommit} is set to
@ref{2de7,,LEGACY_TRANSACTION_CONTROL} (the default),
transaction behaviour is controlled using
the @ref{2de5,,Connection.isolation_level} attribute.
Otherwise, @code{isolation_level} has no effect.

If the connection attribute @ref{2de5,,isolation_level}
is not @code{None},
new transactions are implicitly opened before
@ref{5b0,,execute()} and @ref{5b1,,executemany()} executes
@code{INSERT}, @code{UPDATE}, @code{DELETE}, or @code{REPLACE} statements;
for other statements, no implicit transaction handling is performed.
Use the @ref{2dd8,,commit()} and @ref{2e08,,rollback()} methods
to respectively commit and roll back pending transactions.
You can choose the underlying SQLite transaction behaviour@footnote{https://www.sqlite.org/lang_transaction.html#deferred_immediate_and_exclusive_transactions} —
that is, whether and what type of @code{BEGIN} statements @code{sqlite3}
implicitly executes –
via the @code{isolation_level} attribute.

If @ref{2de5,,isolation_level} is set to @code{None},
no transactions are implicitly opened at all.
This leaves the underlying SQLite library in autocommit mode@footnote{https://www.sqlite.org/lang_transaction.html#implicit_versus_explicit_transactions},
but also allows the user to perform their own transaction handling
using explicit SQL statements.
The underlying SQLite library autocommit mode can be queried using the
@ref{2e12,,in_transaction} attribute.

The @ref{2e0c,,executescript()} method implicitly commits
any pending transaction before execution of the given SQL script,
regardless of the value of @ref{2de5,,isolation_level}.


Changed in version 3.6: @code{sqlite3} used to implicitly commit an open transaction before DDL
statements.  This is no longer the case.



Changed in version 3.12: The recommended way of controlling transactions is now via the
@ref{6de,,autocommit} attribute.


@c import os
@c os.remove("backup.db")
@c os.remove("dump.sql")
@c os.remove("example.db")
@c os.remove("tutorial.db")

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Data Compression and Archiving,File Formats,Data Persistence,The Python Standard Library
@anchor{library/archiving doc}@anchor{2d7a}@anchor{library/archiving archiving}@anchor{2e45}@anchor{library/archiving data-compression-and-archiving}@anchor{2e46}@anchor{library/archiving translation-repo}@anchor{2e47}
@section Data Compression and Archiving


The modules described in this chapter support data compression with the zlib,
gzip, bzip2, lzma, and zstd algorithms, and the creation of ZIP- and tar-format
archives.  See also @ref{1424,,Archiving operations} provided by the @ref{ca,,shutil}
module.

@menu
* The compression package:: 
* compression.zstd — Compression compatible with the Zstandard format: compression zstd — Compression compatible with the Zstandard format. 
* zlib — Compression compatible with gzip:: 
* gzip — Support for gzip files:: 
* bz2 — Support for bzip2 compression:: 
* lzma — Compression using the LZMA algorithm:: 
* zipfile — Work with ZIP archives:: 
* tarfile — Read and write tar archive files:: 

@end menu

@node The compression package,compression zstd — Compression compatible with the Zstandard format,,Data Compression and Archiving
@anchor{library/compression doc}@anchor{2e48}@anchor{library/compression module-compression}@anchor{22}@anchor{library/compression the-compression-package}@anchor{2e49}
@subsection The @code{compression} package


@geindex module; compression


Added in version 3.14.


The @code{compression} package contains the canonical compression modules
containing interfaces to several different compression algorithms. Some of
these modules have historically been available as separate modules; those will
continue to be available under their original names for compatibility reasons,
and will not be removed without a deprecation cycle. The use of modules in
@code{compression} is encouraged where practical.


@itemize *

@item 
@code{compression.bz2} – Re-exports @ref{14,,bz2}

@item 
@code{compression.gzip} – Re-exports @ref{6b,,gzip}

@item 
@code{compression.lzma} – Re-exports @ref{8e,,lzma}

@item 
@code{compression.zlib} – Re-exports @ref{13a,,zlib}

@item 
@ref{23,,compression.zstd} – Wrapper for the Zstandard compression library
@end itemize

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node compression zstd — Compression compatible with the Zstandard format,zlib — Compression compatible with gzip,The compression package,Data Compression and Archiving
@anchor{library/compression zstd doc}@anchor{2e4a}@anchor{library/compression zstd compression-zstd-compression-compatible-with-the-zstandard-format}@anchor{2e4b}@anchor{library/compression zstd module-compression zstd}@anchor{23}@anchor{library/compression zstd translation-repo}@anchor{2e4c}
@subsection @code{compression.zstd} — Compression compatible with the Zstandard format


@geindex module; compression.zstd


Added in version 3.14.


`Source code:' Lib/compression/zstd/__init__.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/compression/zstd/__init__.py}


__________________________________________________________________


This module provides classes and functions for compressing and decompressing
data using the Zstandard (or `zstd') compression algorithm. The
zstd manual@footnote{https://facebook.github.io/zstd/doc/api_manual_latest.html}
describes Zstandard as “a fast lossless compression algorithm, targeting
real-time compression scenarios at zlib-level and better compression ratios.”
Also included is a file interface that supports reading and writing the
contents of @code{.zst} files created by the @code{zstd} utility, as well as
raw zstd compressed streams.

The @code{compression.zstd} module contains:


@itemize *

@item 
The @ref{2e4d,,open()} function and @ref{2e4e,,ZstdFile} class for reading and
writing compressed files.

@item 
The @ref{2e4f,,ZstdCompressor} and @ref{179a,,ZstdDecompressor} classes for
incremental (de)compression.

@item 
The @ref{2e50,,compress()} and @ref{2e51,,decompress()} functions for one-shot
(de)compression.

@item 
The @ref{2e52,,train_dict()} and @ref{2e53,,finalize_dict()} functions and the
@ref{2e54,,ZstdDict} class to train and manage Zstandard dictionaries.

@item 
The @ref{2e55,,CompressionParameter}, @ref{2e56,,DecompressionParameter}, and
@ref{2e57,,Strategy} classes for setting advanced (de)compression parameters.
@end itemize

This is an @ref{219c,,optional module}.
If it is missing from your copy of CPython,
look for documentation from your distributor (that is,
whoever provided Python to you).
If you are the distributor, see @ref{219a,,Requirements for optional modules}.

@c Similar notes appear in the docs of the modules:
@c - zipfile
@c - tarfile

@menu
* Exceptions: Exceptions<8>. 
* Reading and writing compressed files:: 
* Compressing and decompressing data in memory:: 
* Zstandard dictionaries:: 
* Advanced parameter control:: 
* Miscellaneous: Miscellaneous<2>. 
* Examples: Examples<8>. 

@end menu

@node Exceptions<8>,Reading and writing compressed files,,compression zstd — Compression compatible with the Zstandard format
@anchor{library/compression zstd exceptions}@anchor{2e58}
@subsubsection Exceptions


@geindex ZstdError
@anchor{library/compression zstd compression zstd ZstdError}@anchor{2e59}
@deffn {Exception} compression.zstd.ZstdError

This exception is raised when an error occurs during compression or
decompression, or while initializing the (de)compressor state.
@end deffn

@node Reading and writing compressed files,Compressing and decompressing data in memory,Exceptions<8>,compression zstd — Compression compatible with the Zstandard format
@anchor{library/compression zstd reading-and-writing-compressed-files}@anchor{2e5a}
@subsubsection Reading and writing compressed files


@geindex open() (in module compression.zstd)
@anchor{library/compression zstd compression zstd open}@anchor{2e4d}
@deffn {Function} compression.zstd.open (file, /, mode='rb', *, level=None, options=None, zstd_dict=None, encoding=None, errors=None, newline=None)

Open a Zstandard-compressed file in binary or text mode, returning a
@ref{13cf,,file object}.

The `file' argument can be either a file name (given as a
@ref{16a,,str}, @ref{193,,bytes} or @ref{5a1,,path-like}
object), in which case the named file is opened, or it can be an existing
file object to read from or write to.

The mode argument can be either @code{'rb'} for reading (default), @code{'wb'} for
overwriting, @code{'ab'} for appending, or @code{'xb'} for exclusive creation.
These can equivalently be given as @code{'r'}, @code{'w'}, @code{'a'}, and @code{'x'}
respectively. You may also open in text mode with @code{'rt'}, @code{'wt'},
@code{'at'}, and @code{'xt'} respectively.

When reading, the `options' argument can be a dictionary providing advanced
decompression parameters; see @ref{2e56,,DecompressionParameter} for detailed
information about supported
parameters. The `zstd_dict' argument is a @ref{2e54,,ZstdDict} instance to be
used during decompression. When reading, if the `level'
argument is not None, a @code{TypeError} will be raised.

When writing, the `options' argument can be a dictionary
providing advanced compression parameters; see
@ref{2e55,,CompressionParameter} for detailed information about supported
parameters. The `level' argument is the compression level to use when
writing compressed data. Only one of `level' or `options' may be non-None.
The `zstd_dict' argument is a @ref{2e54,,ZstdDict} instance to be used during
compression.

In binary mode, this function is equivalent to the @ref{2e4e,,ZstdFile}
constructor: @code{ZstdFile(file, mode, ...)}. In this case, the
`encoding', `errors', and `newline' parameters must not be provided.

In text mode, a @ref{2e4e,,ZstdFile} object is created, and wrapped in an
@ref{9c4,,io.TextIOWrapper} instance with the specified encoding, error
handling behavior, and line endings.
@end deffn

@geindex ZstdFile (class in compression.zstd)
@anchor{library/compression zstd compression zstd ZstdFile}@anchor{2e4e}
@deffn {Class} compression.zstd.ZstdFile (file, /, mode='rb', *, level=None, options=None, zstd_dict=None)

Open a Zstandard-compressed file in binary mode.

A @code{ZstdFile} can wrap an already-open @ref{13cf,,file object}, or operate
directly on a named file. The `file' argument specifies either the file
object to wrap, or the name of the file to open (as a @ref{16a,,str},
@ref{193,,bytes} or @ref{5a1,,path-like} object). If
wrapping an existing file object, the wrapped file will not be closed when
the @code{ZstdFile} is closed.

The `mode' argument can be either @code{'rb'} for reading (default), @code{'wb'}
for overwriting, @code{'xb'} for exclusive creation, or @code{'ab'} for appending.
These can equivalently be given as @code{'r'}, @code{'w'}, @code{'x'} and @code{'a'}
respectively.

If `file' is a file object (rather than an actual file name), a mode of
@code{'w'} does not truncate the file, and is instead equivalent to @code{'a'}.

When reading, the `options' argument can be a dictionary
providing advanced decompression parameters; see
@ref{2e56,,DecompressionParameter} for detailed information about supported
parameters. The `zstd_dict' argument is a @ref{2e54,,ZstdDict} instance to be
used during decompression. When reading, if the `level'
argument is not None, a @code{TypeError} will be raised.

When writing, the `options' argument can be a dictionary
providing advanced compression parameters; see
@ref{2e55,,CompressionParameter} for detailed information about supported
parameters. The `level' argument is the compression level to use when
writing compressed data. Only one of `level' or `options' may be passed. The
`zstd_dict' argument is a @ref{2e54,,ZstdDict} instance to be used during
compression.

@code{ZstdFile} supports all the members specified by
@ref{8a5,,io.BufferedIOBase}, except for @ref{2e5b,,detach()}
and @ref{151c,,truncate()}.
Iteration and the @ref{187,,with} statement are supported.

The following method and attributes are also provided:

@geindex peek() (compression.zstd.ZstdFile method)
@anchor{library/compression zstd compression zstd ZstdFile peek}@anchor{2e5c}
@deffn {Method} peek (size=-1)

Return buffered data without advancing the file position. At least one
byte of data will be returned, unless EOF has been reached. The exact
number of bytes returned is unspecified (the `size' argument is ignored).

@cartouche
@quotation Note 
While calling @code{peek()} does not change the file position of
the @code{ZstdFile}, it may change the position of the underlying
file object (for example, if the @code{ZstdFile} was constructed by
passing a file object for `file').
@end quotation
@end cartouche
@end deffn

@geindex mode (compression.zstd.ZstdFile attribute)
@anchor{library/compression zstd compression zstd ZstdFile mode}@anchor{2e5d}
@deffn {Attribute} mode

@code{'rb'} for reading and @code{'wb'} for writing.
@end deffn

@geindex name (compression.zstd.ZstdFile attribute)
@anchor{library/compression zstd compression zstd ZstdFile name}@anchor{2e5e}
@deffn {Attribute} name

The name of the Zstandard file. Equivalent to the @ref{2e5f,,name}
attribute of the underlying @ref{13cf,,file object}.
@end deffn
@end deffn

@node Compressing and decompressing data in memory,Zstandard dictionaries,Reading and writing compressed files,compression zstd — Compression compatible with the Zstandard format
@anchor{library/compression zstd compressing-and-decompressing-data-in-memory}@anchor{2e60}
@subsubsection Compressing and decompressing data in memory


@geindex compress() (in module compression.zstd)
@anchor{library/compression zstd compression zstd compress}@anchor{2e50}
@deffn {Function} compression.zstd.compress (data, level=None, options=None, zstd_dict=None)

Compress `data' (a @ref{194,,bytes-like object}), returning the compressed
data as a @ref{193,,bytes} object.

The `level' argument is an integer controlling the level of
compression. `level' is an alternative to setting
@ref{2e61,,CompressionParameter.compression_level} in `options'. Use
@ref{2e62,,bounds()} on
@code{compression_level} to get the values that can
be passed for `level'. If advanced compression options are needed, the
`level' argument must be omitted and in the `options' dictionary the
@code{CompressionParameter.compression_level} parameter should be set.

The `options' argument is a Python dictionary containing advanced
compression parameters. The valid keys and values for compression parameters
are documented as part of the @ref{2e55,,CompressionParameter} documentation.

The `zstd_dict' argument is an instance of @ref{2e54,,ZstdDict}
containing trained data to improve compression efficiency. The
function @ref{2e52,,train_dict()} can be used to generate a Zstandard dictionary.
@end deffn

@geindex decompress() (in module compression.zstd)
@anchor{library/compression zstd compression zstd decompress}@anchor{2e51}
@deffn {Function} compression.zstd.decompress (data, zstd_dict=None, options=None)

Decompress `data' (a @ref{194,,bytes-like object}), returning the uncompressed
data as a @ref{193,,bytes} object.

The `options' argument is a Python dictionary containing advanced
decompression parameters. The valid keys and values for compression
parameters are documented as part of the @ref{2e56,,DecompressionParameter}
documentation.

The `zstd_dict' argument is an instance of @ref{2e54,,ZstdDict}
containing trained data used during compression. This must be
the same Zstandard dictionary used during compression.

If `data' is the concatenation of multiple distinct compressed frames,
decompress all of these frames, and return the concatenation of the results.
@end deffn

@geindex ZstdCompressor (class in compression.zstd)
@anchor{library/compression zstd compression zstd ZstdCompressor}@anchor{2e4f}
@deffn {Class} compression.zstd.ZstdCompressor (level=None, options=None, zstd_dict=None)

Create a compressor object, which can be used to compress data
incrementally.

For a more convenient way of compressing a single chunk of data, see the
module-level function @ref{2e50,,compress()}.

The `level' argument is an integer controlling the level of
compression. `level' is an alternative to setting
@ref{2e61,,CompressionParameter.compression_level} in `options'. Use
@ref{2e62,,bounds()} on
@code{compression_level} to get the values that can
be passed for `level'. If advanced compression options are needed, the
`level' argument must be omitted and in the `options' dictionary the
@code{CompressionParameter.compression_level} parameter should be set.

The `options' argument is a Python dictionary containing advanced
compression parameters. The valid keys and values for compression parameters
are documented as part of the @ref{2e55,,CompressionParameter} documentation.

The `zstd_dict' argument is an optional instance of @ref{2e54,,ZstdDict}
containing trained data to improve compression efficiency. The
function @ref{2e52,,train_dict()} can be used to generate a Zstandard dictionary.

@geindex compress() (compression.zstd.ZstdCompressor method)
@anchor{library/compression zstd compression zstd ZstdCompressor compress}@anchor{2e63}
@deffn {Method} compress (data, mode=ZstdCompressor.CONTINUE)

Compress `data' (a @ref{194,,bytes-like object}), returning a @ref{193,,bytes}
object with compressed data if possible, or otherwise an empty
@code{bytes} object. Some of `data' may be buffered internally, for
use in later calls to @code{compress()} and @ref{2e64,,flush()}. The returned
data should be concatenated with the output of any previous calls to
@code{compress()}.

The `mode' argument is a @code{ZstdCompressor} attribute, either
@ref{2e65,,CONTINUE}, @ref{2e66,,FLUSH_BLOCK},
or @ref{2e67,,FLUSH_FRAME}.

When all data has been provided to the compressor, call the
@ref{2e64,,flush()} method to finish the compression process. If
@code{compress()} is called with `mode' set to @ref{2e67,,FLUSH_FRAME},
@code{flush()} should not be called, as it would write out a new empty
frame.
@end deffn

@geindex flush() (compression.zstd.ZstdCompressor method)
@anchor{library/compression zstd compression zstd ZstdCompressor flush}@anchor{2e64}
@deffn {Method} flush (mode=ZstdCompressor.FLUSH_FRAME)

Finish the compression process, returning a @ref{193,,bytes} object
containing any data stored in the compressor’s internal buffers.

The `mode' argument is a @code{ZstdCompressor} attribute, either
@ref{2e66,,FLUSH_BLOCK}, or @ref{2e67,,FLUSH_FRAME}.
@end deffn

@geindex set_pledged_input_size() (compression.zstd.ZstdCompressor method)
@anchor{library/compression zstd compression zstd ZstdCompressor set_pledged_input_size}@anchor{2e68}
@deffn {Method} set_pledged_input_size (size)

Specify the amount of uncompressed data `size' that will be provided for
the next frame. `size' will be written into the frame header of the next
frame unless @ref{2e69,,CompressionParameter.content_size_flag} is @code{False}
or @code{0}. A size of @code{0} means that the frame is empty. If `size' is
@code{None}, the frame header will omit the frame size. Frames that include
the uncompressed data size require less memory to decompress, especially
at higher compression levels.

If @ref{2e6a,,last_mode} is not @ref{2e67,,FLUSH_FRAME}, a
@ref{2ee,,ValueError} is raised as the compressor is not at the start of
a frame. If the pledged size does not match the actual size of data
provided to @ref{2e63,,compress()}, future calls to @code{compress()} or
@ref{2e64,,flush()} may raise @ref{2e59,,ZstdError} and the last chunk of data may
be lost.

After @ref{2e64,,flush()} or @ref{2e63,,compress()} are called with mode
@ref{2e67,,FLUSH_FRAME}, the next frame will not include the frame size into
the header unless @code{set_pledged_input_size()} is called again.
@end deffn

@geindex CONTINUE (compression.zstd.ZstdCompressor attribute)
@anchor{library/compression zstd compression zstd ZstdCompressor CONTINUE}@anchor{2e65}
@deffn {Attribute} CONTINUE

Collect more data for compression, which may or may not generate output
immediately. This mode optimizes the compression ratio by maximizing the
amount of data per block and frame.
@end deffn

@geindex FLUSH_BLOCK (compression.zstd.ZstdCompressor attribute)
@anchor{library/compression zstd compression zstd ZstdCompressor FLUSH_BLOCK}@anchor{2e66}
@deffn {Attribute} FLUSH_BLOCK

Complete and write a block to the data stream. The data returned so far
can be immediately decompressed. Past data can still be referenced in
future blocks generated by calls to @ref{2e63,,compress()},
improving compression.
@end deffn

@geindex FLUSH_FRAME (compression.zstd.ZstdCompressor attribute)
@anchor{library/compression zstd compression zstd ZstdCompressor FLUSH_FRAME}@anchor{2e67}
@deffn {Attribute} FLUSH_FRAME

Complete and write out a frame. Future data provided to
@ref{2e63,,compress()} will be written into a new frame and
`cannot' reference past data.
@end deffn

@geindex last_mode (compression.zstd.ZstdCompressor attribute)
@anchor{library/compression zstd compression zstd ZstdCompressor last_mode}@anchor{2e6a}
@deffn {Attribute} last_mode

The last mode passed to either @ref{2e63,,compress()} or @ref{2e64,,flush()}.
The value can be one of @ref{2e65,,CONTINUE}, @ref{2e66,,FLUSH_BLOCK}, or
@ref{2e67,,FLUSH_FRAME}. The initial value is @code{FLUSH_FRAME},
signifying that the compressor is at the start of a new frame.
@end deffn
@end deffn

@geindex ZstdDecompressor (class in compression.zstd)
@anchor{library/compression zstd compression zstd ZstdDecompressor}@anchor{179a}
@deffn {Class} compression.zstd.ZstdDecompressor (zstd_dict=None, options=None)

Create a decompressor object, which can be used to decompress data
incrementally.

For a more convenient way of decompressing an entire compressed stream at
once, see the module-level function @ref{2e51,,decompress()}.

The `options' argument is a Python dictionary containing advanced
decompression parameters. The valid keys and values for compression
parameters are documented as part of the @ref{2e56,,DecompressionParameter}
documentation.

The `zstd_dict' argument is an instance of @ref{2e54,,ZstdDict}
containing trained data used during compression. This must be
the same Zstandard dictionary used during compression.

@cartouche
@quotation Note 
This class does not transparently handle inputs containing multiple
compressed frames, unlike the @ref{2e51,,decompress()} function and
@ref{2e4e,,ZstdFile} class. To decompress a multi-frame input, you should
use @code{decompress()}, @code{ZstdFile} if working with a
@ref{13cf,,file object}, or multiple @code{ZstdDecompressor} instances.
@end quotation
@end cartouche

@geindex decompress() (compression.zstd.ZstdDecompressor method)
@anchor{library/compression zstd compression zstd ZstdDecompressor decompress}@anchor{2e6b}
@deffn {Method} decompress (data, max_length=-1)

Decompress `data' (a @ref{194,,bytes-like object}), returning
uncompressed data as bytes. Some of `data' may be buffered
internally, for use in later calls to @code{decompress()}.
The returned data should be concatenated with the output of any previous
calls to @code{decompress()}.

If `max_length' is non-negative, the method returns at most `max_length'
bytes of decompressed data. If this limit is reached and further
output can be produced, the @ref{2e6c,,needs_input} attribute will
be set to @code{False}. In this case, the next call to
@code{decompress()} may provide `data' as @code{b'@w{'}} to obtain
more of the output.

If all of the input data was decompressed and returned (either
because this was less than `max_length' bytes, or because
`max_length' was negative), the @ref{2e6c,,needs_input} attribute
will be set to @code{True}.

Attempting to decompress data after the end of a frame will raise a
@ref{2e59,,ZstdError}. Any data found after the end of the frame is ignored
and saved in the @ref{2e6d,,unused_data} attribute.
@end deffn

@geindex eof (compression.zstd.ZstdDecompressor attribute)
@anchor{library/compression zstd compression zstd ZstdDecompressor eof}@anchor{2e6e}
@deffn {Attribute} eof

@code{True} if the end-of-stream marker has been reached.
@end deffn

@geindex unused_data (compression.zstd.ZstdDecompressor attribute)
@anchor{library/compression zstd compression zstd ZstdDecompressor unused_data}@anchor{2e6d}
@deffn {Attribute} unused_data

Data found after the end of the compressed stream.

Before the end of the stream is reached, this will be @code{b'@w{'}}.
@end deffn

@geindex needs_input (compression.zstd.ZstdDecompressor attribute)
@anchor{library/compression zstd compression zstd ZstdDecompressor needs_input}@anchor{2e6c}
@deffn {Attribute} needs_input

@code{False} if the @ref{2e6b,,decompress()} method can provide more
decompressed data before requiring new compressed input.
@end deffn
@end deffn

@node Zstandard dictionaries,Advanced parameter control,Compressing and decompressing data in memory,compression zstd — Compression compatible with the Zstandard format
@anchor{library/compression zstd zstandard-dictionaries}@anchor{2e6f}
@subsubsection Zstandard dictionaries


@geindex train_dict() (in module compression.zstd)
@anchor{library/compression zstd compression zstd train_dict}@anchor{2e52}
@deffn {Function} compression.zstd.train_dict (samples, dict_size)

Train a Zstandard dictionary, returning a @ref{2e54,,ZstdDict} instance.
Zstandard dictionaries enable more efficient compression of smaller sizes
of data, which is traditionally difficult to compress due to less
repetition. If you are compressing multiple similar groups of data (such as
similar files), Zstandard dictionaries can improve compression ratios and
speed significantly.

The `samples' argument (an iterable of @ref{193,,bytes} objects), is the
population of samples used to train the Zstandard dictionary.

The `dict_size' argument, an integer, is the maximum size (in bytes) the
Zstandard dictionary should be. The Zstandard documentation suggests an
absolute maximum of no more than 100 KB, but the maximum can often be smaller
depending on the data. Larger dictionaries generally slow down compression,
but improve compression ratios. Smaller dictionaries lead to faster
compression, but reduce the compression ratio.
@end deffn

@geindex finalize_dict() (in module compression.zstd)
@anchor{library/compression zstd compression zstd finalize_dict}@anchor{2e53}
@deffn {Function} compression.zstd.finalize_dict (zstd_dict, /, samples, dict_size, level)

An advanced function for converting a “raw content” Zstandard dictionary into
a regular Zstandard dictionary. “Raw content” dictionaries are a sequence of
bytes that do not need to follow the structure of a normal Zstandard
dictionary.

The `zstd_dict' argument is a @ref{2e54,,ZstdDict} instance with
the @ref{2e70,,dict_content} containing the raw dictionary contents.

The `samples' argument (an iterable of @ref{193,,bytes} objects), contains
sample data for generating the Zstandard dictionary.

The `dict_size' argument, an integer, is the maximum size (in bytes) the
Zstandard dictionary should be. See @ref{2e52,,train_dict()} for
suggestions on the maximum dictionary size.

The `level' argument (an integer) is the compression level expected to be
passed to the compressors using this dictionary. The dictionary information
varies for each compression level, so tuning for the proper compression
level can make compression more efficient.
@end deffn

@geindex ZstdDict (class in compression.zstd)
@anchor{library/compression zstd compression zstd ZstdDict}@anchor{2e54}
@deffn {Class} compression.zstd.ZstdDict (dict_content, /, *, is_raw=False)

A wrapper around Zstandard dictionaries. Dictionaries can be used to improve
the compression of many small chunks of data. Use @ref{2e52,,train_dict()} if you
need to train a new dictionary from sample data.

The `dict_content' argument (a @ref{194,,bytes-like object}), is the already
trained dictionary information.

The `is_raw' argument, a boolean, is an advanced parameter controlling the
meaning of `dict_content'. @code{True} means `dict_content' is a “raw content”
dictionary, without any format restrictions. @code{False} means `dict_content'
is an ordinary Zstandard dictionary, created from Zstandard functions,
for example, @ref{2e52,,train_dict()} or the external @code{zstd} CLI.

When passing a @code{ZstdDict} to a function, the
@code{as_digested_dict} and @code{as_undigested_dict} attributes can
control how the dictionary is loaded by passing them as the @code{zstd_dict}
argument, for example, @code{compress(data, zstd_dict=zd.as_digested_dict)}.
Digesting a dictionary is a costly operation that occurs when loading a
Zstandard dictionary. When making multiple calls to compression or
decompression, passing a digested dictionary will reduce the overhead of
loading the dictionary.

@quotation
Difference for compression



@multitable {xxxxxxxxxxxx} {xxxxxxxxxxxxxxxx} {xxxxxxxxxxxx} 
@headitem

@tab

Digested dictionary

@tab

Undigested dictionary

@item

Advanced parameters of the compressor which may be overridden by
the dictionary’s parameters

@tab

@code{window_log}, @code{hash_log}, @code{chain_log}, @code{search_log},
@code{min_match}, @code{target_length}, @code{strategy},
@code{enable_long_distance_matching}, @code{ldm_hash_log},
@code{ldm_min_match}, @code{ldm_bucket_size_log}, @code{ldm_hash_rate_log},
and some non-public parameters.

@tab

None

@item

@code{ZstdDict} internally caches the dictionary

@tab

Yes. It’s faster when loading a digested dictionary again with the
same compression level.

@tab

No. If you wish to load an undigested dictionary multiple times,
consider reusing a compressor object.

@end multitable

@end quotation

If passing a @code{ZstdDict} without any attribute, an undigested
dictionary is passed by default when compressing and a digested dictionary
is generated if necessary and passed by default when decompressing.

@quotation

@geindex dict_content (compression.zstd.ZstdDict attribute)
@anchor{library/compression zstd compression zstd ZstdDict dict_content}@anchor{2e70}
@deffn {Attribute} dict_content

The content of the Zstandard dictionary, a @code{bytes} object. It’s the
same as the `dict_content' argument in the @code{__init__} method. It can
be used with other programs, such as the @code{zstd} CLI program.
@end deffn

@geindex dict_id (compression.zstd.ZstdDict attribute)
@anchor{library/compression zstd compression zstd ZstdDict dict_id}@anchor{2e71}
@deffn {Attribute} dict_id

Identifier of the Zstandard dictionary, a non-negative int value.

Non-zero means the dictionary is ordinary, created by Zstandard
functions and following the Zstandard format.

@code{0} means a “raw content” dictionary, free of any format restriction,
used for advanced users.

@cartouche
@quotation Note 
The meaning of @code{0} for @code{ZstdDict.dict_id} is different
from the @code{dictionary_id} attribute to the @ref{2e72,,get_frame_info()}
function.
@end quotation
@end cartouche
@end deffn

@geindex as_digested_dict (compression.zstd.ZstdDict attribute)
@anchor{library/compression zstd compression zstd ZstdDict as_digested_dict}@anchor{2e73}
@deffn {Attribute} as_digested_dict

Load as a digested dictionary.
@end deffn

@geindex as_undigested_dict (compression.zstd.ZstdDict attribute)
@anchor{library/compression zstd compression zstd ZstdDict as_undigested_dict}@anchor{2e74}
@deffn {Attribute} as_undigested_dict

Load as an undigested dictionary.
@end deffn
@end quotation
@end deffn

@node Advanced parameter control,Miscellaneous<2>,Zstandard dictionaries,compression zstd — Compression compatible with the Zstandard format
@anchor{library/compression zstd advanced-parameter-control}@anchor{2e75}
@subsubsection Advanced parameter control


@geindex CompressionParameter (class in compression.zstd)
@anchor{library/compression zstd compression zstd CompressionParameter}@anchor{2e55}
@deffn {Class} compression.zstd.CompressionParameter

An @ref{ee1,,IntEnum} containing the advanced compression parameter
keys that can be used when compressing data.

The @ref{2e62,,bounds()} method can be used on any attribute to get the valid
values for that parameter.

Parameters are optional; any omitted parameter will have it’s value selected
automatically.

Example getting the lower and upper bound of @ref{2e61,,compression_level}:

@example
lower, upper = CompressionParameter.compression_level.bounds()
@end example

Example setting the @ref{2e76,,window_log} to the maximum size:

@example
_lower, upper = CompressionParameter.window_log.bounds()
options = @{CompressionParameter.window_log: upper@}
compress(b'venezuelan beaver cheese', options=options)
@end example

@geindex bounds() (compression.zstd.CompressionParameter method)
@anchor{library/compression zstd compression zstd CompressionParameter bounds}@anchor{2e62}
@deffn {Method} bounds ()

Return the tuple of int bounds, @code{(lower, upper)}, of a compression
parameter. This method should be called on the attribute you wish to
retrieve the bounds of. For example, to get the valid values for
@ref{2e61,,compression_level}, one may check the result of
@code{CompressionParameter.compression_level.bounds()}.

Both the lower and upper bounds are inclusive.
@end deffn

@geindex compression_level (compression.zstd.CompressionParameter attribute)
@anchor{library/compression zstd compression zstd CompressionParameter compression_level}@anchor{2e61}
@deffn {Attribute} compression_level

A high-level means of setting other compression parameters that affect
the speed and ratio of compressing data.

Regular compression levels are greater than @code{0}. Values greater than
@code{20} are considered “ultra” compression and require more memory than
other levels. Negative values can be used to trade off faster compression
for worse compression ratios.

Setting the level to zero uses @ref{2e77,,COMPRESSION_LEVEL_DEFAULT}.
@end deffn

@geindex window_log (compression.zstd.CompressionParameter attribute)
@anchor{library/compression zstd compression zstd CompressionParameter window_log}@anchor{2e76}
@deffn {Attribute} window_log

Maximum allowed back-reference distance the compressor can use when
compressing data, expressed as power of two, @code{1 << window_log} bytes.
This parameter greatly influences the memory usage of compression. Higher
values require more memory but gain better compression values.

A value of zero causes the value to be selected automatically.
@end deffn

@geindex hash_log (compression.zstd.CompressionParameter attribute)
@anchor{library/compression zstd compression zstd CompressionParameter hash_log}@anchor{2e78}
@deffn {Attribute} hash_log

Size of the initial probe table, as a power of two. The resulting memory
usage is @code{1 << (hash_log+2)} bytes. Larger tables improve compression
ratio of strategies <= @ref{2e79,,dfast}, and improve compression
speed of strategies > @code{dfast}.

A value of zero causes the value to be selected automatically.
@end deffn

@geindex chain_log (compression.zstd.CompressionParameter attribute)
@anchor{library/compression zstd compression zstd CompressionParameter chain_log}@anchor{2e7a}
@deffn {Attribute} chain_log

Size of the multi-probe search table, as a power of two. The resulting
memory usage is @code{1 << (chain_log+2)} bytes. Larger tables result in
better and slower compression. This parameter has no effect for the
@ref{2e7b,,fast} strategy. It’s still useful when using
@ref{2e79,,dfast} strategy, in which case it defines a secondary
probe table.

A value of zero causes the value to be selected automatically.
@end deffn

@geindex search_log (compression.zstd.CompressionParameter attribute)
@anchor{library/compression zstd compression zstd CompressionParameter search_log}@anchor{2e7c}
@deffn {Attribute} search_log

Number of search attempts, as a power of two. More attempts result in
better and slower compression. This parameter is useless for
@ref{2e7b,,fast} and @ref{2e79,,dfast} strategies.

A value of zero causes the value to be selected automatically.
@end deffn

@geindex min_match (compression.zstd.CompressionParameter attribute)
@anchor{library/compression zstd compression zstd CompressionParameter min_match}@anchor{2e7d}
@deffn {Attribute} min_match

Minimum size of searched matches. Larger values increase compression and
decompression speed, but decrease ratio. Note that Zstandard can still
find matches of smaller size, it just tweaks its search algorithm to look
for this size and larger. For all strategies < @ref{2e7e,,btopt},
the effective minimum is @code{4}; for all strategies
> @ref{2e7b,,fast}, the effective maximum is @code{6}.

A value of zero causes the value to be selected automatically.
@end deffn

@geindex target_length (compression.zstd.CompressionParameter attribute)
@anchor{library/compression zstd compression zstd CompressionParameter target_length}@anchor{2e7f}
@deffn {Attribute} target_length

The impact of this field depends on the selected @ref{2e57,,Strategy}.

For strategies @ref{2e7e,,btopt}, @ref{2e80,,btultra} and
@ref{2e81,,btultra2}, the value is the length of a match
considered “good enough” to stop searching. Larger values make
compression ratios better, but compresses slower.

For strategy @ref{2e7b,,fast}, it is the distance between match
sampling. Larger values make compression faster, but with a worse
compression ratio.

A value of zero causes the value to be selected automatically.
@end deffn

@geindex strategy (compression.zstd.CompressionParameter attribute)
@anchor{library/compression zstd compression zstd CompressionParameter strategy}@anchor{2e82}
@deffn {Attribute} strategy

The higher the value of selected strategy, the more complex the
compression technique used by zstd, resulting in higher compression
ratios but slower compression.


@subsubheading See also


@ref{2e57,,Strategy}

@end deffn

@geindex enable_long_distance_matching (compression.zstd.CompressionParameter attribute)
@anchor{library/compression zstd compression zstd CompressionParameter enable_long_distance_matching}@anchor{2e83}
@deffn {Attribute} enable_long_distance_matching

Long distance matching can be used to improve compression for large
inputs by finding large matches at greater distances. It increases memory
usage and window size.

@code{True} or @code{1} enable long distance matching while @code{False} or @code{0}
disable it.

Enabling this parameter increases default
@ref{2e76,,window_log} to 128 MiB except when expressly
set to a different value. This setting is enabled by default if
@code{window_log} >= 128 MiB and the compression
strategy >= @ref{2e7e,,btopt} (compression level 16+).
@end deffn

@geindex ldm_hash_log (compression.zstd.CompressionParameter attribute)
@anchor{library/compression zstd compression zstd CompressionParameter ldm_hash_log}@anchor{2e84}
@deffn {Attribute} ldm_hash_log

Size of the table for long distance matching, as a power of two. Larger
values increase memory usage and compression ratio, but decrease
compression speed.

A value of zero causes the value to be selected automatically.
@end deffn

@geindex ldm_min_match (compression.zstd.CompressionParameter attribute)
@anchor{library/compression zstd compression zstd CompressionParameter ldm_min_match}@anchor{2e85}
@deffn {Attribute} ldm_min_match

Minimum match size for long distance matcher. Larger or too small values
can often decrease the compression ratio.

A value of zero causes the value to be selected automatically.
@end deffn

@geindex ldm_bucket_size_log (compression.zstd.CompressionParameter attribute)
@anchor{library/compression zstd compression zstd CompressionParameter ldm_bucket_size_log}@anchor{2e86}
@deffn {Attribute} ldm_bucket_size_log

Log size of each bucket in the long distance matcher hash table for
collision resolution. Larger values improve collision resolution but
decrease compression speed.

A value of zero causes the value to be selected automatically.
@end deffn

@geindex ldm_hash_rate_log (compression.zstd.CompressionParameter attribute)
@anchor{library/compression zstd compression zstd CompressionParameter ldm_hash_rate_log}@anchor{2e87}
@deffn {Attribute} ldm_hash_rate_log

Frequency of inserting/looking up entries into the long distance matcher
hash table. Larger values improve compression speed. Deviating far from
the default value will likely result in a compression ratio decrease.

A value of zero causes the value to be selected automatically.
@end deffn

@geindex content_size_flag (compression.zstd.CompressionParameter attribute)
@anchor{library/compression zstd compression zstd CompressionParameter content_size_flag}@anchor{2e69}
@deffn {Attribute} content_size_flag

Write the size of the data to be compressed into the Zstandard frame
header when known prior to compressing.

This flag only takes effect under the following scenarios:


@itemize *

@item 
Calling @ref{2e50,,compress()} for one-shot compression

@item 
Providing all of the data to be compressed in the frame in a single
@ref{2e63,,ZstdCompressor.compress()} call, with the
@ref{2e67,,ZstdCompressor.FLUSH_FRAME} mode.

@item 
Calling @ref{2e68,,ZstdCompressor.set_pledged_input_size()} with the exact
amount of data that will be provided to the compressor prior to any
calls to @ref{2e63,,ZstdCompressor.compress()} for the current frame.
@code{ZstdCompressor.set_pledged_input_size()} must be called for each
new frame.
@end itemize

All other compression calls may not write the size information into the
frame header.

@code{True} or @code{1} enable the content size flag while @code{False} or @code{0}
disable it.
@end deffn

@geindex checksum_flag (compression.zstd.CompressionParameter attribute)
@anchor{library/compression zstd compression zstd CompressionParameter checksum_flag}@anchor{2e88}
@deffn {Attribute} checksum_flag

A four-byte checksum using XXHash64 of the uncompressed content is
written at the end of each frame. Zstandard’s decompression code verifies
the checksum. If there is a mismatch a @ref{2e59,,ZstdError} exception is
raised.

@code{True} or @code{1} enable checksum generation while @code{False} or @code{0}
disable it.
@end deffn

@geindex dict_id_flag (compression.zstd.CompressionParameter attribute)
@anchor{library/compression zstd compression zstd CompressionParameter dict_id_flag}@anchor{2e89}
@deffn {Attribute} dict_id_flag

When compressing with a @ref{2e54,,ZstdDict}, the dictionary’s ID is written
into the frame header.

@code{True} or @code{1} enable storing the dictionary ID while @code{False} or
@code{0} disable it.
@end deffn

@geindex nb_workers (compression.zstd.CompressionParameter attribute)
@anchor{library/compression zstd compression zstd CompressionParameter nb_workers}@anchor{2e8a}
@deffn {Attribute} nb_workers

Select how many threads will be spawned to compress in parallel. When
@code{nb_workers} > 0, enables multi-threaded compression, a value of
@code{1} means “one-thread multi-threaded mode”. More workers improve speed,
but also increase memory usage and slightly reduce compression ratio.

A value of zero disables multi-threading.
@end deffn

@geindex job_size (compression.zstd.CompressionParameter attribute)
@anchor{library/compression zstd compression zstd CompressionParameter job_size}@anchor{2e8b}
@deffn {Attribute} job_size

Size of a compression job, in bytes. This value is enforced only when
@ref{2e8a,,nb_workers} >= 1. Each compression job is
completed in parallel, so this value can indirectly impact the number of
active threads.

A value of zero causes the value to be selected automatically.
@end deffn

@geindex overlap_log (compression.zstd.CompressionParameter attribute)
@anchor{library/compression zstd compression zstd CompressionParameter overlap_log}@anchor{2e8c}
@deffn {Attribute} overlap_log

Sets how much data is reloaded from previous jobs (threads) for new jobs
to be used by the look behind window during compression. This value is
only used when @ref{2e8a,,nb_workers} >= 1. Acceptable
values vary from 0 to 9.

@quotation


@itemize *

@item 
0 means dynamically set the overlap amount

@item 
1 means no overlap

@item 
9 means use a full window size from the previous job
@end itemize
@end quotation

Each increment halves/doubles the overlap size. “8” means an overlap of
@code{window_size/2}, “7” means an overlap of @code{window_size/4}, etc.
@end deffn
@end deffn

@geindex DecompressionParameter (class in compression.zstd)
@anchor{library/compression zstd compression zstd DecompressionParameter}@anchor{2e56}
@deffn {Class} compression.zstd.DecompressionParameter

An @ref{ee1,,IntEnum} containing the advanced decompression parameter
keys that can be used when decompressing data. Parameters are optional; any
omitted parameter will have it’s value selected automatically.

The @ref{2e8d,,bounds()} method can be used on any attribute to get the valid
values for that parameter.

Example setting the @ref{2e8e,,window_log_max} to the maximum size:

@example
data = compress(b'Some very long buffer of bytes...')

_lower, upper = DecompressionParameter.window_log_max.bounds()

options = @{DecompressionParameter.window_log_max: upper@}
decompress(data, options=options)
@end example

@geindex bounds() (compression.zstd.DecompressionParameter method)
@anchor{library/compression zstd compression zstd DecompressionParameter bounds}@anchor{2e8d}
@deffn {Method} bounds ()

Return the tuple of int bounds, @code{(lower, upper)}, of a decompression
parameter. This method should be called on the attribute you wish to
retrieve the bounds of.

Both the lower and upper bounds are inclusive.
@end deffn

@geindex window_log_max (compression.zstd.DecompressionParameter attribute)
@anchor{library/compression zstd compression zstd DecompressionParameter window_log_max}@anchor{2e8e}
@deffn {Attribute} window_log_max

The base-two logarithm of the maximum size of the window used during
decompression. This can be useful to limit the amount of memory used when
decompressing data. A larger maximum window size leads to faster
decompression.

A value of zero causes the value to be selected automatically.
@end deffn
@end deffn

@geindex Strategy (class in compression.zstd)
@anchor{library/compression zstd compression zstd Strategy}@anchor{2e57}
@deffn {Class} compression.zstd.Strategy

An @ref{ee1,,IntEnum} containing strategies for compression.
Higher-numbered strategies correspond to more complex and slower
compression.

@cartouche
@quotation Note 
The values of attributes of @code{Strategy} are not necessarily stable
across zstd versions. Only the ordering of the attributes may be relied
upon. The attributes are listed below in order.
@end quotation
@end cartouche

The following strategies are available:

@geindex fast (compression.zstd.Strategy attribute)
@anchor{library/compression zstd compression zstd Strategy fast}@anchor{2e7b}
@deffn {Attribute} fast
@end deffn

@geindex dfast (compression.zstd.Strategy attribute)
@anchor{library/compression zstd compression zstd Strategy dfast}@anchor{2e79}
@deffn {Attribute} dfast
@end deffn

@geindex greedy (compression.zstd.Strategy attribute)
@anchor{library/compression zstd compression zstd Strategy greedy}@anchor{2e8f}
@deffn {Attribute} greedy
@end deffn

@geindex lazy (compression.zstd.Strategy attribute)
@anchor{library/compression zstd compression zstd Strategy lazy}@anchor{2e90}
@deffn {Attribute} lazy
@end deffn

@geindex lazy2 (compression.zstd.Strategy attribute)
@anchor{library/compression zstd compression zstd Strategy lazy2}@anchor{2e91}
@deffn {Attribute} lazy2
@end deffn

@geindex btlazy2 (compression.zstd.Strategy attribute)
@anchor{library/compression zstd compression zstd Strategy btlazy2}@anchor{2e92}
@deffn {Attribute} btlazy2
@end deffn

@geindex btopt (compression.zstd.Strategy attribute)
@anchor{library/compression zstd compression zstd Strategy btopt}@anchor{2e7e}
@deffn {Attribute} btopt
@end deffn

@geindex btultra (compression.zstd.Strategy attribute)
@anchor{library/compression zstd compression zstd Strategy btultra}@anchor{2e80}
@deffn {Attribute} btultra
@end deffn

@geindex btultra2 (compression.zstd.Strategy attribute)
@anchor{library/compression zstd compression zstd Strategy btultra2}@anchor{2e81}
@deffn {Attribute} btultra2
@end deffn
@end deffn

@node Miscellaneous<2>,Examples<8>,Advanced parameter control,compression zstd — Compression compatible with the Zstandard format
@anchor{library/compression zstd miscellaneous}@anchor{2e93}
@subsubsection Miscellaneous


@geindex get_frame_info() (in module compression.zstd)
@anchor{library/compression zstd compression zstd get_frame_info}@anchor{2e72}
@deffn {Function} compression.zstd.get_frame_info (frame_buffer)

Retrieve a @ref{2e94,,FrameInfo} object containing metadata about a Zstandard
frame. Frames contain metadata related to the compressed data they hold.
@end deffn

@geindex FrameInfo (class in compression.zstd)
@anchor{library/compression zstd compression zstd FrameInfo}@anchor{2e94}
@deffn {Class} compression.zstd.FrameInfo

Metadata related to a Zstandard frame.

@geindex decompressed_size (compression.zstd.FrameInfo attribute)
@anchor{library/compression zstd compression zstd FrameInfo decompressed_size}@anchor{2e95}
@deffn {Attribute} decompressed_size

The size of the decompressed contents of the frame.
@end deffn

@geindex dictionary_id (compression.zstd.FrameInfo attribute)
@anchor{library/compression zstd compression zstd FrameInfo dictionary_id}@anchor{2e96}
@deffn {Attribute} dictionary_id

An integer representing the Zstandard dictionary ID needed for
decompressing the frame. @code{0} means the dictionary ID was not
recorded in the frame header. This may mean that a Zstandard dictionary
is not needed, or that the ID of a required dictionary was not recorded.
@end deffn
@end deffn

@geindex COMPRESSION_LEVEL_DEFAULT (in module compression.zstd)
@anchor{library/compression zstd compression zstd COMPRESSION_LEVEL_DEFAULT}@anchor{2e77}
@deffn {Attribute} compression.zstd.COMPRESSION_LEVEL_DEFAULT

The default compression level for Zstandard: @code{3}.
@end deffn

@geindex zstd_version_info (in module compression.zstd)
@anchor{library/compression zstd compression zstd zstd_version_info}@anchor{2e97}
@deffn {Attribute} compression.zstd.zstd_version_info

Version number of the runtime zstd library as a tuple of integers
(major, minor, release).
@end deffn

@node Examples<8>,,Miscellaneous<2>,compression zstd — Compression compatible with the Zstandard format
@anchor{library/compression zstd examples}@anchor{2e98}
@subsubsection Examples


Reading in a compressed file:

@example
from compression import zstd

with zstd.open("file.zst") as f:
    file_content = f.read()
@end example

Creating a compressed file:

@example
from compression import zstd

data = b"Insert Data Here"
with zstd.open("file.zst", "w") as f:
    f.write(data)
@end example

Compressing data in memory:

@example
from compression import zstd

data_in = b"Insert Data Here"
data_out = zstd.compress(data_in)
@end example

Incremental compression:

@example
from compression import zstd

comp = zstd.ZstdCompressor()
out1 = comp.compress(b"Some data\n")
out2 = comp.compress(b"Another piece of data\n")
out3 = comp.compress(b"Even more data\n")
out4 = comp.flush()
# Concatenate all the partial results:
result = b"".join([out1, out2, out3, out4])
@end example

Writing compressed data to an already-open file:

@example
from compression import zstd

with open("myfile", "wb") as f:
    f.write(b"This data will not be compressed\n")
    with zstd.open(f, "w") as zstf:
        zstf.write(b"This *will* be compressed\n")
    f.write(b"Not compressed\n")
@end example

Creating a compressed file using compression parameters:

@example
from compression import zstd

options = @{
   zstd.CompressionParameter.checksum_flag: 1
@}
with zstd.open("file.zst", "w", options=options) as f:
    f.write(b"Mind if I squeeze in?")
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node zlib — Compression compatible with gzip,gzip — Support for gzip files,compression zstd — Compression compatible with the Zstandard format,Data Compression and Archiving
@anchor{library/zlib doc}@anchor{2e99}@anchor{library/zlib module-zlib}@anchor{13a}@anchor{library/zlib translation-repo}@anchor{2e9a}@anchor{library/zlib zlib-compression-compatible-with-gzip}@anchor{2e9b}
@subsection @code{zlib} — Compression compatible with @code{gzip}


@geindex module; zlib


__________________________________________________________________


For applications that require data compression, the functions in this module
allow compression and decompression, using the zlib library@footnote{https://www.zlib.net}.

This is an @ref{219c,,optional module}.
If it is missing from your copy of CPython,
look for documentation from your distributor (that is,
whoever provided Python to you).
If you are the distributor, see @ref{219a,,Requirements for optional modules}.

@c Similar notes appear in the docs of the modules:
@c - zipfile
@c - tarfile

zlib’s functions have many options and often need to be used in a particular
order.  This documentation doesn’t attempt to cover all of the permutations;
consult the zlib manual@footnote{https://www.zlib.net/manual.html} for authoritative
information.

For reading and writing @code{.gz} files see the @ref{6b,,gzip} module.

The available exception and functions in this module are:

@geindex error
@anchor{library/zlib zlib error}@anchor{2e9c}
@deffn {Exception} zlib.error

Exception raised on compression and decompression errors.
@end deffn

@geindex adler32() (in module zlib)
@anchor{library/zlib zlib adler32}@anchor{1bfd}
@deffn {Function} zlib.adler32 (data[, value])

Computes an Adler-32 checksum of `data'.  (An Adler-32 checksum is almost as
reliable as a CRC32 but can be computed much more quickly.)  The result
is an unsigned 32-bit integer.  If `value' is present, it is used as
the starting value of the checksum; otherwise, a default value of 1
is used.  Passing in `value' allows computing a running checksum over the
concatenation of several inputs.  The algorithm is not cryptographically
strong, and should not be used for authentication or digital signatures.  Since
the algorithm is designed for use as a checksum algorithm, it is not suitable
for use as a general hash algorithm.


Changed in version 3.0: The result is always unsigned.

@end deffn

@geindex compress() (in module zlib)
@anchor{library/zlib zlib compress}@anchor{850}
@deffn {Function} zlib.compress (data, /, level=Z_DEFAULT_COMPRESSION, wbits=MAX_WBITS)

Compresses the bytes in `data', returning a bytes object containing compressed data.
`level' is an integer from @code{0} to @code{9} or @code{-1} controlling the level of compression;
See @ref{2e9d,,Z_BEST_SPEED} (@code{1}), @ref{2e9e,,Z_BEST_COMPRESSION} (@code{9}),
@ref{2e9f,,Z_NO_COMPRESSION} (@code{0}), and the default,
@ref{2ea0,,Z_DEFAULT_COMPRESSION} (@code{-1}) for more information about these values.
@anchor{library/zlib compress-wbits}@anchor{2ea1}
The `wbits' argument controls the size of the history buffer (or the
“window size”) used when compressing data, and whether a header and
trailer is included in the output.  It can take several ranges of values,
defaulting to @code{15} (@ref{2ea2,,MAX_WBITS}):


@itemize *

@item 
+9 to +15: The base-two logarithm of the window size, which
therefore ranges between 512 and 32768.  Larger values produce
better compression at the expense of greater memory usage.  The
resulting output will include a zlib-specific header and trailer.

@item 
−9 to −15: Uses the absolute value of `wbits' as the
window size logarithm, while producing a raw output stream with no
header or trailing checksum.

@item 
+25 to +31 = 16 + (9 to 15): Uses the low 4 bits of the value as the
window size logarithm, while including a basic @code{gzip} header
and trailing checksum in the output.
@end itemize

Raises the @ref{2e9c,,error} exception if any error occurs.


Changed in version 3.6: `level' can now be used as a keyword parameter.



Changed in version 3.11: The `wbits' parameter is now available to set window bits and
compression type.

@end deffn

@geindex compressobj() (in module zlib)
@anchor{library/zlib zlib compressobj}@anchor{2ea3}
@deffn {Function} zlib.compressobj (level=Z_DEFAULT_COMPRESSION, method=DEFLATED, wbits=MAX_WBITS, memLevel=DEF_MEM_LEVEL, strategy=Z_DEFAULT_STRATEGY[, zdict])

Returns a compression object, to be used for compressing data streams that won’t
fit into memory at once.

`level' is the compression level – an integer from @code{0} to @code{9} or @code{-1}.
See @ref{2e9d,,Z_BEST_SPEED} (@code{1}), @ref{2e9e,,Z_BEST_COMPRESSION} (@code{9}),
@ref{2e9f,,Z_NO_COMPRESSION} (@code{0}), and the default,
@ref{2ea0,,Z_DEFAULT_COMPRESSION} (@code{-1}) for more information about these values.

`method' is the compression algorithm. Currently, the only supported value is
@ref{2ea4,,DEFLATED}.

The `wbits' parameter controls the size of the history buffer (or the
“window size”), and what header and trailer format will be used. It has
the same meaning as @ref{2ea1,,described for compress()}.

The `memLevel' argument controls the amount of memory used for the
internal compression state. Valid values range from @code{1} to @code{9}.
Higher values use more memory, but are faster and produce smaller output.

`strategy' is used to tune the compression algorithm. Possible values are
@ref{2ea5,,Z_DEFAULT_STRATEGY}, @ref{2ea6,,Z_FILTERED}, @ref{2ea7,,Z_HUFFMAN_ONLY},
@ref{2ea8,,Z_RLE} and @ref{2ea9,,Z_FIXED}.

`zdict' is a predefined compression dictionary. This is a sequence of bytes
(such as a @ref{193,,bytes} object) containing subsequences that are expected
to occur frequently in the data that is to be compressed. Those subsequences
that are expected to be most common should come at the end of the dictionary.


Changed in version 3.3: Added the `zdict' parameter and keyword argument support.

@end deffn

@geindex crc32() (in module zlib)
@anchor{library/zlib zlib crc32}@anchor{1a57}
@deffn {Function} zlib.crc32 (data[, value])

@geindex Cyclic Redundancy Check
@geindex checksum; Cyclic Redundancy Check

Computes a CRC (Cyclic Redundancy Check) checksum of `data'. The
result is an unsigned 32-bit integer. If `value' is present, it is used
as the starting value of the checksum; otherwise, a default value of 0
is used.  Passing in `value' allows computing a running checksum over the
concatenation of several inputs.  The algorithm is not cryptographically
strong, and should not be used for authentication or digital signatures.  Since
the algorithm is designed for use as a checksum algorithm, it is not suitable
for use as a general hash algorithm.


Changed in version 3.0: The result is always unsigned.

@end deffn

@geindex decompress() (in module zlib)
@anchor{library/zlib zlib decompress}@anchor{f0f}
@deffn {Function} zlib.decompress (data, /, wbits=MAX_WBITS, bufsize=DEF_BUF_SIZE)

Decompresses the bytes in `data', returning a bytes object containing the
uncompressed data.  The `wbits' parameter depends on
the format of `data', and is discussed further below.
If `bufsize' is given, it is used as the initial size of the output
buffer.  Raises the @ref{2e9c,,error} exception if any error occurs.
@anchor{library/zlib decompress-wbits}@anchor{2eaa}
The `wbits' parameter controls the size of the history buffer
(or “window size”), and what header and trailer format is expected.
It is similar to the parameter for @ref{2ea3,,compressobj()}, but accepts
more ranges of values:


@itemize *

@item 
+8 to +15: The base-two logarithm of the window size.  The input
must include a zlib header and trailer.

@item 
0: Automatically determine the window size from the zlib header.
Only supported since zlib 1.2.3.5.

@item 
−8 to −15: Uses the absolute value of `wbits' as the window size
logarithm.  The input must be a raw stream with no header or trailer.

@item 
+24 to +31 = 16 + (8 to 15): Uses the low 4 bits of the value as
the window size logarithm.  The input must include a gzip header and
trailer.

@item 
+40 to +47 = 32 + (8 to 15): Uses the low 4 bits of the value as
the window size logarithm, and automatically accepts either
the zlib or gzip format.
@end itemize

When decompressing a stream, the window size must not be smaller
than the size originally used to compress the stream; using a too-small
value may result in an @ref{2e9c,,error} exception. The default `wbits' value
corresponds to the largest window size and requires a zlib header and
trailer to be included.

`bufsize' is the initial size of the buffer used to hold decompressed data.  If
more space is required, the buffer size will be increased as needed, so you
don’t have to get this value exactly right; tuning it will only save a few calls
to @code{malloc()}.


Changed in version 3.6: `wbits' and `bufsize' can be used as keyword arguments.

@end deffn

@geindex decompressobj() (in module zlib)
@anchor{library/zlib zlib decompressobj}@anchor{2eab}
@deffn {Function} zlib.decompressobj (wbits=MAX_WBITS[, zdict])

Returns a decompression object, to be used for decompressing data streams that
won’t fit into memory at once.

The `wbits' parameter controls the size of the history buffer (or the
“window size”), and what header and trailer format is expected.  It has
the same meaning as @ref{2eaa,,described for decompress()}.

The `zdict' parameter specifies a predefined compression dictionary. If
provided, this must be the same dictionary as was used by the compressor that
produced the data that is to be decompressed.

@cartouche
@quotation Note 
If `zdict' is a mutable object (such as a @ref{342,,bytearray}), you must not
modify its contents between the call to @code{decompressobj()} and the first
call to the decompressor’s @code{decompress()} method.
@end quotation
@end cartouche


Changed in version 3.3: Added the `zdict' parameter.

@end deffn

Compression objects support the following methods:

@geindex compress() (zlib.Compress method)
@anchor{library/zlib zlib Compress compress}@anchor{2eac}
@deffn {Method} Compress.compress (data)

Compress `data', returning a bytes object containing compressed data for at least
part of the data in `data'.  This data should be concatenated to the output
produced by any preceding calls to the @code{compress()} method.  Some input may
be kept in internal buffers for later processing.
@end deffn

@geindex flush() (zlib.Compress method)
@anchor{library/zlib zlib Compress flush}@anchor{2ead}
@deffn {Method} Compress.flush ([mode])

All pending input is processed, and a bytes object containing the remaining compressed
output is returned.  `mode' can be selected from the constants
@ref{2eae,,Z_NO_FLUSH}, @ref{2eaf,,Z_PARTIAL_FLUSH}, @ref{2eb0,,Z_SYNC_FLUSH},
@ref{2eb1,,Z_FULL_FLUSH}, @ref{2eb2,,Z_BLOCK}, or @ref{2eb3,,Z_FINISH},
defaulting to @code{Z_FINISH}.  Except @code{Z_FINISH}, all constants
allow compressing further bytestrings of data, while @code{Z_FINISH} finishes the
compressed stream and prevents compressing any more data.  After calling @code{flush()}
with `mode' set to @code{Z_FINISH}, the @ref{850,,compress()} method cannot be called again;
the only realistic action is to delete the object.
@end deffn

@geindex copy() (zlib.Compress method)
@anchor{library/zlib zlib Compress copy}@anchor{2eb4}
@deffn {Method} Compress.copy ()

Returns a copy of the compression object.  This can be used to efficiently
compress a set of data that share a common initial prefix.
@end deffn


Changed in version 3.8: Added @ref{758,,copy.copy()} and @ref{d6b,,copy.deepcopy()} support to compression
objects.


Decompression objects support the following methods and attributes:

@geindex unused_data (zlib.Decompress attribute)
@anchor{library/zlib zlib Decompress unused_data}@anchor{2eb5}
@deffn {Attribute} Decompress.unused_data

A bytes object which contains any bytes past the end of the compressed data. That is,
this remains @code{b""} until the last byte that contains compression data is
available.  If the whole bytestring turned out to contain compressed data, this is
@code{b""}, an empty bytes object.
@end deffn

@geindex unconsumed_tail (zlib.Decompress attribute)
@anchor{library/zlib zlib Decompress unconsumed_tail}@anchor{2eb6}
@deffn {Attribute} Decompress.unconsumed_tail

A bytes object that contains any data that was not consumed by the last
@ref{f0f,,decompress()} call because it exceeded the limit for the uncompressed data
buffer.  This data has not yet been seen by the zlib machinery, so you must feed
it (possibly with further data concatenated to it) back to a subsequent
@code{decompress()} method call in order to get correct output.
@end deffn

@geindex eof (zlib.Decompress attribute)
@anchor{library/zlib zlib Decompress eof}@anchor{1379}
@deffn {Attribute} Decompress.eof

A boolean indicating whether the end of the compressed data stream has been
reached.

This makes it possible to distinguish between a properly formed compressed
stream, and an incomplete or truncated one.


Added in version 3.3.

@end deffn

@geindex decompress() (zlib.Decompress method)
@anchor{library/zlib zlib Decompress decompress}@anchor{2eb7}
@deffn {Method} Decompress.decompress (data, max_length=0)

Decompress `data', returning a bytes object containing the uncompressed data
corresponding to at least part of the data in `string'.  This data should be
concatenated to the output produced by any preceding calls to the
@code{decompress()} method.  Some of the input data may be preserved in internal
buffers for later processing.

If the optional parameter `max_length' is non-zero then the return value will be
no longer than `max_length'. This may mean that not all of the compressed input
can be processed; and unconsumed data will be stored in the attribute
@ref{2eb6,,unconsumed_tail}. This bytestring must be passed to a subsequent call to
@code{decompress()} if decompression is to continue.  If `max_length' is zero
then the whole input is decompressed, and @code{unconsumed_tail} is empty.


Changed in version 3.6: `max_length' can be used as a keyword argument.

@end deffn

@geindex flush() (zlib.Decompress method)
@anchor{library/zlib zlib Decompress flush}@anchor{2eb8}
@deffn {Method} Decompress.flush ([length])

All pending input is processed, and a bytes object containing the remaining
uncompressed output is returned.  After calling @code{flush()}, the
@ref{f0f,,decompress()} method cannot be called again; the only realistic action is
to delete the object.

The optional parameter `length' sets the initial size of the output buffer.
@end deffn

@geindex copy() (zlib.Decompress method)
@anchor{library/zlib zlib Decompress copy}@anchor{2eb9}
@deffn {Method} Decompress.copy ()

Returns a copy of the decompression object.  This can be used to save the state
of the decompressor midway through the data stream in order to speed up random
seeks into the stream at a future point.
@end deffn


Changed in version 3.8: Added @ref{758,,copy.copy()} and @ref{d6b,,copy.deepcopy()} support to decompression
objects.


The following constants are available to configure compression and decompression
behavior:

@geindex DEFLATED (in module zlib)
@anchor{library/zlib zlib DEFLATED}@anchor{2ea4}
@deffn {Data} zlib.DEFLATED

The deflate compression method.
@end deffn

@geindex MAX_WBITS (in module zlib)
@anchor{library/zlib zlib MAX_WBITS}@anchor{2ea2}
@deffn {Data} zlib.MAX_WBITS

The maximum window size, expressed as a power of 2.
For example, if @code{MAX_WBITS} is @code{15} it results in a window size
of @code{32 KiB}.
@end deffn

@geindex DEF_MEM_LEVEL (in module zlib)
@anchor{library/zlib zlib DEF_MEM_LEVEL}@anchor{2eba}
@deffn {Data} zlib.DEF_MEM_LEVEL

The default memory level for compression objects.
@end deffn

@geindex DEF_BUF_SIZE (in module zlib)
@anchor{library/zlib zlib DEF_BUF_SIZE}@anchor{2ebb}
@deffn {Data} zlib.DEF_BUF_SIZE

The default buffer size for decompression operations.
@end deffn

@geindex Z_NO_COMPRESSION (in module zlib)
@anchor{library/zlib zlib Z_NO_COMPRESSION}@anchor{2e9f}
@deffn {Data} zlib.Z_NO_COMPRESSION

Compression level @code{0}; no compression.


Added in version 3.6.

@end deffn

@geindex Z_BEST_SPEED (in module zlib)
@anchor{library/zlib zlib Z_BEST_SPEED}@anchor{2e9d}
@deffn {Data} zlib.Z_BEST_SPEED

Compression level @code{1}; fastest and produces the least compression.
@end deffn

@geindex Z_BEST_COMPRESSION (in module zlib)
@anchor{library/zlib zlib Z_BEST_COMPRESSION}@anchor{2e9e}
@deffn {Data} zlib.Z_BEST_COMPRESSION

Compression level @code{9}; slowest and produces the most compression.
@end deffn

@geindex Z_DEFAULT_COMPRESSION (in module zlib)
@anchor{library/zlib zlib Z_DEFAULT_COMPRESSION}@anchor{2ea0}
@deffn {Data} zlib.Z_DEFAULT_COMPRESSION

Default compression level (@code{-1}); a compromise between speed and
compression. Currently equivalent to compression level @code{6}.
@end deffn

@geindex Z_DEFAULT_STRATEGY (in module zlib)
@anchor{library/zlib zlib Z_DEFAULT_STRATEGY}@anchor{2ea5}
@deffn {Data} zlib.Z_DEFAULT_STRATEGY

Default compression strategy, for normal data.
@end deffn

@geindex Z_FILTERED (in module zlib)
@anchor{library/zlib zlib Z_FILTERED}@anchor{2ea6}
@deffn {Data} zlib.Z_FILTERED

Compression strategy for data produced by a filter (or predictor).
@end deffn

@geindex Z_HUFFMAN_ONLY (in module zlib)
@anchor{library/zlib zlib Z_HUFFMAN_ONLY}@anchor{2ea7}
@deffn {Data} zlib.Z_HUFFMAN_ONLY

Compression strategy that forces Huffman coding only.
@end deffn

@geindex Z_RLE (in module zlib)
@anchor{library/zlib zlib Z_RLE}@anchor{2ea8}
@deffn {Data} zlib.Z_RLE

Compression strategy that limits match distances to one (run-length encoding).

This constant is only available if Python was compiled with zlib
1.2.0.1 or greater.


Added in version 3.6.

@end deffn

@geindex Z_FIXED (in module zlib)
@anchor{library/zlib zlib Z_FIXED}@anchor{2ea9}
@deffn {Data} zlib.Z_FIXED

Compression strategy that prevents the use of dynamic Huffman codes.

This constant is only available if Python was compiled with zlib
1.2.2.2 or greater.


Added in version 3.6.

@end deffn

@geindex Z_NO_FLUSH (in module zlib)
@anchor{library/zlib zlib Z_NO_FLUSH}@anchor{2eae}
@deffn {Data} zlib.Z_NO_FLUSH

Flush mode @code{0}. No special flushing behavior.


Added in version 3.6.

@end deffn

@geindex Z_PARTIAL_FLUSH (in module zlib)
@anchor{library/zlib zlib Z_PARTIAL_FLUSH}@anchor{2eaf}
@deffn {Data} zlib.Z_PARTIAL_FLUSH

Flush mode @code{1}. Flush as much output as possible.
@end deffn

@geindex Z_SYNC_FLUSH (in module zlib)
@anchor{library/zlib zlib Z_SYNC_FLUSH}@anchor{2eb0}
@deffn {Data} zlib.Z_SYNC_FLUSH

Flush mode @code{2}. All output is flushed and the output is aligned to a byte boundary.
@end deffn

@geindex Z_FULL_FLUSH (in module zlib)
@anchor{library/zlib zlib Z_FULL_FLUSH}@anchor{2eb1}
@deffn {Data} zlib.Z_FULL_FLUSH

Flush mode @code{3}. All output is flushed and the compression state is reset.
@end deffn

@geindex Z_FINISH (in module zlib)
@anchor{library/zlib zlib Z_FINISH}@anchor{2eb3}
@deffn {Data} zlib.Z_FINISH

Flush mode @code{4}. All pending input is processed, no more input is expected.
@end deffn

@geindex Z_BLOCK (in module zlib)
@anchor{library/zlib zlib Z_BLOCK}@anchor{2eb2}
@deffn {Data} zlib.Z_BLOCK

Flush mode @code{5}. A deflate block is completed and emitted.

This constant is only available if Python was compiled with zlib
1.2.2.2 or greater.


Added in version 3.6.

@end deffn

@geindex Z_TREES (in module zlib)
@anchor{library/zlib zlib Z_TREES}@anchor{2ebc}
@deffn {Data} zlib.Z_TREES

Flush mode @code{6}, for inflate operations. Instructs inflate to return when
it gets to the next deflate block boundary.

This constant is only available if Python was compiled with zlib
1.2.3.4 or greater.


Added in version 3.6.

@end deffn

Information about the version of the zlib library in use is available through
the following constants:

@geindex ZLIB_VERSION (in module zlib)
@anchor{library/zlib zlib ZLIB_VERSION}@anchor{2ebd}
@deffn {Data} zlib.ZLIB_VERSION

The version string of the zlib library that was used for building the module.
This may be different from the zlib library actually used at runtime, which
is available as @ref{137a,,ZLIB_RUNTIME_VERSION}.
@end deffn

@geindex ZLIB_RUNTIME_VERSION (in module zlib)
@anchor{library/zlib zlib ZLIB_RUNTIME_VERSION}@anchor{137a}
@deffn {Data} zlib.ZLIB_RUNTIME_VERSION

The version string of the zlib library actually loaded by the interpreter.


Added in version 3.3.

@end deffn

@geindex ZLIBNG_VERSION (in module zlib)
@anchor{library/zlib zlib ZLIBNG_VERSION}@anchor{2ebe}
@deffn {Data} zlib.ZLIBNG_VERSION

The version string of the zlib-ng library that was used for building the
module if zlib-ng was used. When present, the @ref{2ebd,,ZLIB_VERSION} and
@ref{137a,,ZLIB_RUNTIME_VERSION} constants reflect the version of the zlib API
provided by zlib-ng.

If zlib-ng was not used to build the module, this constant will be absent.


Added in version 3.14.

@end deffn


@subsubheading See also



@table @asis

@item Module @ref{6b,,gzip}

Reading and writing @code{gzip}-format files.

@item @indicateurl{https://www.zlib.net}

The zlib library home page.

@item @indicateurl{https://www.zlib.net/manual.html}

The zlib manual explains  the semantics and usage of the library’s many
functions.
@end table

In case gzip (de)compression is a bottleneck, the python-isal@footnote{https://github.com/pycompression/python-isal}
package speeds up (de)compression with a mostly compatible API.


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node gzip — Support for gzip files,bz2 — Support for bzip2 compression,zlib — Compression compatible with gzip,Data Compression and Archiving
@anchor{library/gzip doc}@anchor{2ebf}@anchor{library/gzip gzip-support-for-gzip-files}@anchor{2ec0}@anchor{library/gzip module-gzip}@anchor{6b}@anchor{library/gzip translation-repo}@anchor{2ec1}
@subsection @code{gzip} — Support for @code{gzip} files


@geindex module; gzip

`Source code:' Lib/gzip.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/gzip.py}


__________________________________________________________________


This module provides a simple interface to compress and decompress files just
like the GNU programs @code{gzip} and @code{gunzip} would.

This is an @ref{219c,,optional module}.
If it is missing from your copy of CPython,
look for documentation from your distributor (that is,
whoever provided Python to you).
If you are the distributor, see @ref{219a,,Requirements for optional modules}.

@c Similar notes appear in the docs of the modules:
@c - zipfile
@c - tarfile

The data compression is provided by the @ref{13a,,zlib} module.

The @code{gzip} module provides the @ref{65c,,GzipFile} class, as well as the
@ref{2ec2,,open()}, @ref{84f,,compress()} and @ref{1419,,decompress()} convenience functions.
The @code{GzipFile} class reads and writes @code{gzip}-format files,
automatically compressing or decompressing the data so that it looks like an
ordinary @ref{13cf,,file object}.

Note that additional file formats which can be decompressed by the
@code{gzip} and @code{gunzip} programs, such  as those produced by
@code{compress} and @code{pack}, are not supported by this module.

The module defines the following items:

@geindex open() (in module gzip)
@anchor{library/gzip gzip open}@anchor{2ec2}
@deffn {Function} gzip.open (filename, mode='rb', compresslevel=9, encoding=None, errors=None, newline=None)

Open a gzip-compressed file in binary or text mode, returning a @ref{13cf,,file object}.

The `filename' argument can be an actual filename (a @ref{16a,,str} or
@ref{193,,bytes} object), or an existing file object to read from or write to.

The `mode' argument can be any of @code{'r'}, @code{'rb'}, @code{'a'}, @code{'ab'},
@code{'w'}, @code{'wb'}, @code{'x'} or @code{'xb'} for binary mode, or @code{'rt'},
@code{'at'}, @code{'wt'}, or @code{'xt'} for text mode. The default is @code{'rb'}.

The `compresslevel' argument is an integer from 0 to 9, as for the
@ref{65c,,GzipFile} constructor.

For binary mode, this function is equivalent to the @ref{65c,,GzipFile}
constructor: @code{GzipFile(filename, mode, compresslevel)}. In this case, the
`encoding', `errors' and `newline' arguments must not be provided.

For text mode, a @ref{65c,,GzipFile} object is created, and wrapped in an
@ref{9c4,,io.TextIOWrapper} instance with the specified encoding, error
handling behavior, and line ending(s).


Changed in version 3.3: Added support for `filename' being a file object, support for text mode,
and the `encoding', `errors' and `newline' arguments.



Changed in version 3.4: Added support for the @code{'x'}, @code{'xb'} and @code{'xt'} modes.



Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.

@end deffn

@geindex BadGzipFile
@anchor{library/gzip gzip BadGzipFile}@anchor{bf0}
@deffn {Exception} gzip.BadGzipFile

An exception raised for invalid gzip files.  It inherits from @ref{2c2,,OSError}.
@ref{14e5,,EOFError} and @ref{2e9c,,zlib.error} can also be raised for invalid gzip
files.


Added in version 3.8.

@end deffn

@geindex GzipFile (class in gzip)
@anchor{library/gzip gzip GzipFile}@anchor{65c}
@deffn {Class} gzip.GzipFile (filename=None, mode=None, compresslevel=9, fileobj=None, mtime=None)

Constructor for the @code{GzipFile} class, which simulates most of the
methods of a @ref{13cf,,file object}, with the exception of the @ref{151c,,truncate()}
method.  At least one of `fileobj' and `filename' must be given a non-trivial
value.

The new class instance is based on `fileobj', which can be a regular file, an
@ref{10aa,,io.BytesIO} object, or any other object which simulates a file.  It
defaults to @code{None}, in which case `filename' is opened to provide a file
object.

When `fileobj' is not @code{None}, the `filename' argument is only used to be
included in the @code{gzip} file header, which may include the original
filename of the uncompressed file.  It defaults to the filename of `fileobj', if
discernible; otherwise, it defaults to the empty string, and in this case the
original filename is not included in the header.

The `mode' argument can be any of @code{'r'}, @code{'rb'}, @code{'a'}, @code{'ab'}, @code{'w'},
@code{'wb'}, @code{'x'}, or @code{'xb'}, depending on whether the file will be read or
written.  The default is the mode of `fileobj' if discernible; otherwise, the
default is @code{'rb'}.  In future Python releases the mode of `fileobj' will
not be used.  It is better to always specify `mode' for writing.

Note that the file is always opened in binary mode. To open a compressed file
in text mode, use @ref{2ec2,,open()} (or wrap your @code{GzipFile} with an
@ref{9c4,,io.TextIOWrapper}).

The `compresslevel' argument is an integer from @code{0} to @code{9} controlling
the level of compression; @code{1} is fastest and produces the least
compression, and @code{9} is slowest and produces the most compression. @code{0}
is no compression. The default is @code{9}.

The optional `mtime' argument is the timestamp requested by gzip. The time
is in Unix format, i.e., seconds since 00:00:00 UTC, January 1, 1970.
If `mtime' is omitted or @code{None}, the current time is used. Use `mtime' = 0
to generate a compressed stream that does not depend on creation time.

See below for the @ref{2ec3,,mtime} attribute that is set when decompressing.

Calling a @code{GzipFile} object’s @code{close()} method does not close
`fileobj', since you might wish to append more material after the compressed
data.  This also allows you to pass an @ref{10aa,,io.BytesIO} object opened for
writing as `fileobj', and retrieve the resulting memory buffer using the
@code{io.BytesIO} object’s @ref{2ec4,,getvalue()} method.

@code{GzipFile} supports the @ref{8a5,,io.BufferedIOBase} interface,
including iteration and the @ref{187,,with} statement.  Only the
@ref{151c,,truncate()} method isn’t implemented.

@code{GzipFile} also provides the following method and attribute:

@geindex peek() (gzip.GzipFile method)
@anchor{library/gzip gzip GzipFile peek}@anchor{1418}
@deffn {Method} peek (n)

Read `n' uncompressed bytes without advancing the file position.
The number of bytes returned may be more or less than requested.

@cartouche
@quotation Note 
While calling @code{peek()} does not change the file position of
the @code{GzipFile}, it may change the position of the underlying
file object (e.g. if the @code{GzipFile} was constructed with the
`fileobj' parameter).
@end quotation
@end cartouche


Added in version 3.2.

@end deffn

@geindex mode (gzip.GzipFile attribute)
@anchor{library/gzip gzip GzipFile mode}@anchor{2ec5}
@deffn {Attribute} mode

@code{'rb'} for reading and @code{'wb'} for writing.


Changed in version 3.13: In previous versions it was an integer @code{1} or @code{2}.

@end deffn

@geindex mtime (gzip.GzipFile attribute)
@anchor{library/gzip gzip GzipFile mtime}@anchor{2ec3}
@deffn {Attribute} mtime

When decompressing, this attribute is set to the last timestamp in the most
recently read header.  It is an integer, holding the number of seconds
since the Unix epoch (00:00:00 UTC, January 1, 1970).
The initial value before reading any headers is @code{None}.
@end deffn

@geindex name (gzip.GzipFile attribute)
@anchor{library/gzip gzip GzipFile name}@anchor{732}
@deffn {Attribute} name

The path to the gzip file on disk, as a @ref{16a,,str} or @ref{193,,bytes}.
Equivalent to the output of @ref{e53,,os.fspath()} on the original input path,
with no other normalization, resolution or expansion.
@end deffn


Changed in version 3.1: Support for the @ref{187,,with} statement was added, along with the
`mtime' constructor argument and @ref{2ec3,,mtime} attribute.



Changed in version 3.2: Support for zero-padded and unseekable files was added.



Changed in version 3.3: The @ref{2ec6,,io.BufferedIOBase.read1()} method is now implemented.



Changed in version 3.4: Added support for the @code{'x'} and @code{'xb'} modes.



Changed in version 3.5: Added support for writing arbitrary
@ref{194,,bytes-like objects}.
The @ref{1534,,read()} method now accepts an argument of
@code{None}.



Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.



Deprecated since version 3.9: Opening @code{GzipFile} for writing without specifying the `mode'
argument is deprecated.



Changed in version 3.12: Remove the @code{filename} attribute, use the @ref{732,,name}
attribute instead.

@end deffn

@geindex compress() (in module gzip)
@anchor{library/gzip gzip compress}@anchor{84f}
@deffn {Function} gzip.compress (data, compresslevel=9, *, mtime=0)

Compress the `data', returning a @ref{193,,bytes} object containing
the compressed data.  `compresslevel' and `mtime' have the same meaning as in
the @ref{65c,,GzipFile} constructor above,
but `mtime' defaults to 0 for reproducible output.


Added in version 3.2.



Changed in version 3.8: Added the `mtime' parameter for reproducible output.



Changed in version 3.11: Speed is improved by compressing all data at once instead of in a
streamed fashion. Calls with `mtime' set to @code{0} are delegated to
@ref{850,,zlib.compress()} for better speed. In this situation the
output may contain a gzip header “OS” byte value other than 255
“unknown” as supplied by the underlying zlib implementation.



Changed in version 3.13: The gzip header OS byte is guaranteed to be set to 255 when this function
is used as was the case in 3.10 and earlier.



Changed in version 3.14: The `mtime' parameter now defaults to 0 for reproducible output.
For the previous behaviour of using the current time,
pass @code{None} to `mtime'.

@end deffn

@geindex decompress() (in module gzip)
@anchor{library/gzip gzip decompress}@anchor{1419}
@deffn {Function} gzip.decompress (data)

Decompress the `data', returning a @ref{193,,bytes} object containing the
uncompressed data. This function is capable of decompressing multi-member
gzip data (multiple gzip blocks concatenated together). When the data is
certain to contain only one member the @ref{f0f,,zlib.decompress()} function with
`wbits' set to 31 is faster.


Added in version 3.2.



Changed in version 3.11: Speed is improved by decompressing members at once in memory instead of in
a streamed fashion.

@end deffn

@menu
* Examples of usage:: 
* Command-line interface: Command-line interface<3>. 

@end menu

@node Examples of usage,Command-line interface<3>,,gzip — Support for gzip files
@anchor{library/gzip examples-of-usage}@anchor{2ec7}@anchor{library/gzip gzip-usage-examples}@anchor{2ec8}
@subsubsection Examples of usage


Example of how to read a compressed file:

@example
import gzip
with gzip.open('/home/joe/file.txt.gz', 'rb') as f:
    file_content = f.read()
@end example

Example of how to create a compressed GZIP file:

@example
import gzip
content = b"Lots of content here"
with gzip.open('/home/joe/file.txt.gz', 'wb') as f:
    f.write(content)
@end example

Example of how to GZIP compress an existing file:

@example
import gzip
import shutil
with open('/home/joe/file.txt', 'rb') as f_in:
    with gzip.open('/home/joe/file.txt.gz', 'wb') as f_out:
        shutil.copyfileobj(f_in, f_out)
@end example

Example of how to GZIP compress a binary string:

@example
import gzip
s_in = b"Lots of content here"
s_out = gzip.compress(s_in)
@end example


@subsubheading See also



@table @asis

@item Module @ref{13a,,zlib}

The basic data compression module needed to support the @code{gzip} file
format.
@end table

In case gzip (de)compression is a bottleneck, the python-isal@footnote{https://github.com/pycompression/python-isal}
package speeds up (de)compression with a mostly compatible API.


@node Command-line interface<3>,,Examples of usage,gzip — Support for gzip files
@anchor{library/gzip command-line-interface}@anchor{2ec9}@anchor{library/gzip gzip-cli}@anchor{2eca}
@subsubsection Command-line interface


The @code{gzip} module provides a simple command line interface to compress or
decompress files.

Once executed the @code{gzip} module keeps the input file(s).


Changed in version 3.8: Add a new command line interface with a usage.
By default, when you will execute the CLI, the default compression level is 6.


@menu
* Command-line options:: 

@end menu

@node Command-line options,,,Command-line interface<3>
@anchor{library/gzip command-line-options}@anchor{2ecb}
@subsubsection Command-line options


@geindex gzip command line option; file
@anchor{library/gzip cmdoption-gzip-arg-file}@anchor{2ecc}
@deffn {Option} file

If `file' is not specified, read from @ref{760,,sys.stdin}.
@end deffn

@geindex gzip command line option; --fast
@anchor{library/gzip cmdoption-gzip-fast}@anchor{2ecd}
@deffn {Option} @w{-}@w{-}fast

Indicates the fastest compression method (less compression).
@end deffn

@geindex gzip command line option; --best
@anchor{library/gzip cmdoption-gzip-best}@anchor{2ece}
@deffn {Option} @w{-}@w{-}best

Indicates the slowest compression method (best compression).
@end deffn

@geindex gzip command line option; -d
@geindex gzip command line option; --decompress
@anchor{library/gzip cmdoption-gzip-d}@anchor{2ecf}@anchor{library/gzip cmdoption-gzip-decompress}@anchor{2ed0}
@deffn {Option} @w{-}d, @w{-}@w{-}decompress

Decompress the given file.
@end deffn

@geindex gzip command line option; -h
@geindex gzip command line option; --help
@anchor{library/gzip cmdoption-gzip-h}@anchor{2ed1}@anchor{library/gzip cmdoption-gzip-help}@anchor{2ed2}
@deffn {Option} @w{-}h, @w{-}@w{-}help

Show the help message.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node bz2 — Support for bzip2 compression,lzma — Compression using the LZMA algorithm,gzip — Support for gzip files,Data Compression and Archiving
@anchor{library/bz2 doc}@anchor{2ed3}@anchor{library/bz2 bz2-support-for-bzip2-compression}@anchor{2ed4}@anchor{library/bz2 module-bz2}@anchor{14}@anchor{library/bz2 translation-repo}@anchor{2ed5}
@subsection @code{bz2} — Support for @code{bzip2} compression


@geindex module; bz2

`Source code:' Lib/bz2.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/bz2.py}


__________________________________________________________________


This module provides a comprehensive interface for compressing and
decompressing data using the bzip2 compression algorithm.

The @code{bz2} module contains:


@itemize *

@item 
The @ref{1299,,open()} function and @ref{a6c,,BZ2File} class for reading and
writing compressed files.

@item 
The @ref{1b12,,BZ2Compressor} and @ref{176f,,BZ2Decompressor} classes for
incremental (de)compression.

@item 
The @ref{28e8,,compress()} and @ref{129a,,decompress()} functions for one-shot
(de)compression.
@end itemize

This is an @ref{219c,,optional module}.
If it is missing from your copy of CPython,
look for documentation from your distributor (that is,
whoever provided Python to you).
If you are the distributor, see @ref{219a,,Requirements for optional modules}.

@c Similar notes appear in the docs of the modules:
@c - zipfile
@c - tarfile

@menu
* (De)compression of files: De compression of files. 
* Incremental (de)compression: Incremental de compression. 
* One-shot (de)compression: One-shot de compression. 
* Examples of usage: Examples of usage<2>. 

@end menu

@node De compression of files,Incremental de compression,,bz2 — Support for bzip2 compression
@anchor{library/bz2 de-compression-of-files}@anchor{2ed6}
@subsubsection (De)compression of files


@geindex open() (in module bz2)
@anchor{library/bz2 bz2 open}@anchor{1299}
@deffn {Function} bz2.open (filename, mode='rb', compresslevel=9, encoding=None, errors=None, newline=None)

Open a bzip2-compressed file in binary or text mode, returning a @ref{13cf,,file object}.

As with the constructor for @ref{a6c,,BZ2File}, the `filename' argument can be
an actual filename (a @ref{16a,,str} or @ref{193,,bytes} object), or an existing
file object to read from or write to.

The `mode' argument can be any of @code{'r'}, @code{'rb'}, @code{'w'}, @code{'wb'},
@code{'x'}, @code{'xb'}, @code{'a'} or @code{'ab'} for binary mode, or @code{'rt'},
@code{'wt'}, @code{'xt'}, or @code{'at'} for text mode. The default is @code{'rb'}.

The `compresslevel' argument is an integer from 1 to 9, as for the
@ref{a6c,,BZ2File} constructor.

For binary mode, this function is equivalent to the @ref{a6c,,BZ2File}
constructor: @code{BZ2File(filename, mode, compresslevel=compresslevel)}. In
this case, the `encoding', `errors' and `newline' arguments must not be
provided.

For text mode, a @ref{a6c,,BZ2File} object is created, and wrapped in an
@ref{9c4,,io.TextIOWrapper} instance with the specified encoding, error
handling behavior, and line ending(s).


Added in version 3.3.



Changed in version 3.4: The @code{'x'} (exclusive creation) mode was added.



Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.

@end deffn

@geindex BZ2File (class in bz2)
@anchor{library/bz2 bz2 BZ2File}@anchor{a6c}
@deffn {Class} bz2.BZ2File (filename, mode='r', *, compresslevel=9)

Open a bzip2-compressed file in binary mode.

If `filename' is a @ref{16a,,str} or @ref{193,,bytes} object, open the named file
directly. Otherwise, `filename' should be a @ref{13cf,,file object}, which will
be used to read or write the compressed data.

The `mode' argument can be either @code{'r'} for reading (default), @code{'w'} for
overwriting, @code{'x'} for exclusive creation, or @code{'a'} for appending. These
can equivalently be given as @code{'rb'}, @code{'wb'}, @code{'xb'} and @code{'ab'}
respectively.

If `filename' is a file object (rather than an actual file name), a mode of
@code{'w'} does not truncate the file, and is instead equivalent to @code{'a'}.

If `mode' is @code{'w'} or @code{'a'}, `compresslevel' can be an integer between
@code{1} and @code{9} specifying the level of compression: @code{1} produces the
least compression, and @code{9} (default) produces the most compression.

If `mode' is @code{'r'}, the input file may be the concatenation of multiple
compressed streams.

@code{BZ2File} provides all of the members specified by the
@ref{8a5,,io.BufferedIOBase}, except for @ref{2e5b,,detach()}
and @ref{151c,,truncate()}.
Iteration and the @ref{187,,with} statement are supported.

@code{BZ2File} also provides the following methods and attributes:

@geindex peek() (bz2.BZ2File method)
@anchor{library/bz2 bz2 BZ2File peek}@anchor{2ed7}
@deffn {Method} peek ([n])

Return buffered data without advancing the file position. At least one
byte of data will be returned (unless at EOF). The exact number of bytes
returned is unspecified.

@cartouche
@quotation Note 
While calling @code{peek()} does not change the file position of
the @code{BZ2File}, it may change the position of the underlying file
object (e.g. if the @code{BZ2File} was constructed by passing a file
object for `filename').
@end quotation
@end cartouche


Added in version 3.3.

@end deffn

@geindex fileno() (bz2.BZ2File method)
@anchor{library/bz2 bz2 BZ2File fileno}@anchor{2ed8}
@deffn {Method} fileno ()

Return the file descriptor for the underlying file.


Added in version 3.3.

@end deffn

@geindex readable() (bz2.BZ2File method)
@anchor{library/bz2 bz2 BZ2File readable}@anchor{2ed9}
@deffn {Method} readable ()

Return whether the file was opened for reading.


Added in version 3.3.

@end deffn

@geindex seekable() (bz2.BZ2File method)
@anchor{library/bz2 bz2 BZ2File seekable}@anchor{2eda}
@deffn {Method} seekable ()

Return whether the file supports seeking.


Added in version 3.3.

@end deffn

@geindex writable() (bz2.BZ2File method)
@anchor{library/bz2 bz2 BZ2File writable}@anchor{2edb}
@deffn {Method} writable ()

Return whether the file was opened for writing.


Added in version 3.3.

@end deffn

@geindex read1() (bz2.BZ2File method)
@anchor{library/bz2 bz2 BZ2File read1}@anchor{2edc}
@deffn {Method} read1 (size=-1)

Read up to `size' uncompressed bytes, while trying to avoid
making multiple reads from the underlying stream. Reads up to a
buffer’s worth of data if size is negative.

Returns @code{b'@w{'}} if the file is at EOF.


Added in version 3.3.

@end deffn

@geindex readinto() (bz2.BZ2File method)
@anchor{library/bz2 bz2 BZ2File readinto}@anchor{2edd}
@deffn {Method} readinto (b)

Read bytes into `b'.

Returns the number of bytes read (0 for EOF).


Added in version 3.3.

@end deffn

@geindex mode (bz2.BZ2File attribute)
@anchor{library/bz2 bz2 BZ2File mode}@anchor{2ede}
@deffn {Attribute} mode

@code{'rb'} for reading and @code{'wb'} for writing.


Added in version 3.13.

@end deffn

@geindex name (bz2.BZ2File attribute)
@anchor{library/bz2 bz2 BZ2File name}@anchor{2edf}
@deffn {Attribute} name

The bzip2 file name.  Equivalent to the @ref{2e5f,,name}
attribute of the underlying @ref{13cf,,file object}.


Added in version 3.13.

@end deffn


Changed in version 3.1: Support for the @ref{187,,with} statement was added.



Changed in version 3.3: Support was added for `filename' being a @ref{13cf,,file object} instead of an
actual filename.

The @code{'a'} (append) mode was added, along with support for reading
multi-stream files.



Changed in version 3.4: The @code{'x'} (exclusive creation) mode was added.



Changed in version 3.5: The @ref{1534,,read()} method now accepts an argument of
@code{None}.



Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.



Changed in version 3.9: The `buffering' parameter has been removed. It was ignored and deprecated
since Python 3.0. Pass an open file object to control how the file is
opened.

The `compresslevel' parameter became keyword-only.



Changed in version 3.10: This class is thread unsafe in the face of multiple simultaneous
readers or writers, just like its equivalent classes in @ref{6b,,gzip} and
@ref{8e,,lzma} have always been.

@end deffn

@node Incremental de compression,One-shot de compression,De compression of files,bz2 — Support for bzip2 compression
@anchor{library/bz2 incremental-de-compression}@anchor{2ee0}
@subsubsection Incremental (de)compression


@geindex BZ2Compressor (class in bz2)
@anchor{library/bz2 bz2 BZ2Compressor}@anchor{1b12}
@deffn {Class} bz2.BZ2Compressor (compresslevel=9)

Create a new compressor object. This object may be used to compress data
incrementally. For one-shot compression, use the @ref{28e8,,compress()} function
instead.

`compresslevel', if given, must be an integer between @code{1} and @code{9}. The
default is @code{9}.

@geindex compress() (bz2.BZ2Compressor method)
@anchor{library/bz2 bz2 BZ2Compressor compress}@anchor{2ee1}
@deffn {Method} compress (data)

Provide data to the compressor object. Returns a chunk of compressed data
if possible, or an empty byte string otherwise.

When you have finished providing data to the compressor, call the
@ref{2ee2,,flush()} method to finish the compression process.
@end deffn

@geindex flush() (bz2.BZ2Compressor method)
@anchor{library/bz2 bz2 BZ2Compressor flush}@anchor{2ee2}
@deffn {Method} flush ()

Finish the compression process. Returns the compressed data left in
internal buffers.

The compressor object may not be used after this method has been called.
@end deffn
@end deffn

@geindex BZ2Decompressor (class in bz2)
@anchor{library/bz2 bz2 BZ2Decompressor}@anchor{176f}
@deffn {Class} bz2.BZ2Decompressor

Create a new decompressor object. This object may be used to decompress data
incrementally. For one-shot compression, use the @ref{129a,,decompress()} function
instead.

@cartouche
@quotation Note 
This class does not transparently handle inputs containing multiple
compressed streams, unlike @ref{129a,,decompress()} and @ref{a6c,,BZ2File}. If
you need to decompress a multi-stream input with @code{BZ2Decompressor},
you must use a new decompressor for each stream.
@end quotation
@end cartouche

@geindex decompress() (bz2.BZ2Decompressor method)
@anchor{library/bz2 bz2 BZ2Decompressor decompress}@anchor{fd0}
@deffn {Method} decompress (data, max_length=-1)

Decompress `data' (a @ref{194,,bytes-like object}), returning
uncompressed data as bytes. Some of `data' may be buffered
internally, for use in later calls to @code{decompress()}. The
returned data should be concatenated with the output of any
previous calls to @code{decompress()}.

If `max_length' is nonnegative, returns at most `max_length'
bytes of decompressed data. If this limit is reached and further
output can be produced, the @ref{2ee3,,needs_input} attribute will
be set to @code{False}. In this case, the next call to
@code{decompress()} may provide `data' as @code{b'@w{'}} to obtain
more of the output.

If all of the input data was decompressed and returned (either
because this was less than `max_length' bytes, or because
`max_length' was negative), the @ref{2ee3,,needs_input} attribute
will be set to @code{True}.

Attempting to decompress data after the end of stream is reached
raises an @ref{14e5,,EOFError}.  Any data found after the end of the
stream is ignored and saved in the @ref{2ee4,,unused_data} attribute.


Changed in version 3.5: Added the `max_length' parameter.

@end deffn

@geindex eof (bz2.BZ2Decompressor attribute)
@anchor{library/bz2 bz2 BZ2Decompressor eof}@anchor{2ee5}
@deffn {Attribute} eof

@code{True} if the end-of-stream marker has been reached.


Added in version 3.3.

@end deffn

@geindex unused_data (bz2.BZ2Decompressor attribute)
@anchor{library/bz2 bz2 BZ2Decompressor unused_data}@anchor{2ee4}
@deffn {Attribute} unused_data

Data found after the end of the compressed stream.

If this attribute is accessed before the end of the stream has been
reached, its value will be @code{b'@w{'}}.
@end deffn

@geindex needs_input (bz2.BZ2Decompressor attribute)
@anchor{library/bz2 bz2 BZ2Decompressor needs_input}@anchor{2ee3}
@deffn {Attribute} needs_input

@code{False} if the @ref{fd0,,decompress()} method can provide more
decompressed data before requiring new uncompressed input.


Added in version 3.5.

@end deffn
@end deffn

@node One-shot de compression,Examples of usage<2>,Incremental de compression,bz2 — Support for bzip2 compression
@anchor{library/bz2 one-shot-de-compression}@anchor{2ee6}
@subsubsection One-shot (de)compression


@geindex compress() (in module bz2)
@anchor{library/bz2 bz2 compress}@anchor{28e8}
@deffn {Function} bz2.compress (data, compresslevel=9)

Compress `data', a @ref{194,,bytes-like object}.

`compresslevel', if given, must be an integer between @code{1} and @code{9}. The
default is @code{9}.

For incremental compression, use a @ref{1b12,,BZ2Compressor} instead.
@end deffn

@geindex decompress() (in module bz2)
@anchor{library/bz2 bz2 decompress}@anchor{129a}
@deffn {Function} bz2.decompress (data)

Decompress `data', a @ref{194,,bytes-like object}.

If `data' is the concatenation of multiple compressed streams, decompress
all of the streams.

For incremental decompression, use a @ref{176f,,BZ2Decompressor} instead.


Changed in version 3.3: Support for multi-stream inputs was added.

@end deffn

@node Examples of usage<2>,,One-shot de compression,bz2 — Support for bzip2 compression
@anchor{library/bz2 bz2-usage-examples}@anchor{2ee7}@anchor{library/bz2 examples-of-usage}@anchor{2ee8}
@subsubsection Examples of usage


Below are some examples of typical usage of the @code{bz2} module.

Using @ref{28e8,,compress()} and @ref{129a,,decompress()} to demonstrate round-trip compression:

@example
>>> import bz2
>>> data = b"""\
... Donec rhoncus quis sapien sit amet molestie. Fusce scelerisque vel augue
... nec ullamcorper. Nam rutrum pretium placerat. Aliquam vel tristique lorem,
... sit amet cursus ante. In interdum laoreet mi, sit amet ultrices purus
... pulvinar a. Nam gravida euismod magna, non varius justo tincidunt feugiat.
... Aliquam pharetra lacus non risus vehicula rutrum. Maecenas aliquam leo
... felis. Pellentesque semper nunc sit amet nibh ullamcorper, ac elementum
... dolor luctus. Curabitur lacinia mi ornare consectetur vestibulum."""
>>> c = bz2.compress(data)
>>> len(data) / len(c)  # Data compression ratio
1.513595166163142
>>> d = bz2.decompress(c)
>>> data == d  # Check equality to original object after round-trip
True
@end example

Using @ref{1b12,,BZ2Compressor} for incremental compression:

@example
>>> import bz2
>>> def gen_data(chunks=10, chunksize=1000):
...     """Yield incremental blocks of chunksize bytes."""
...     for _ in range(chunks):
...         yield b"z" * chunksize
...
>>> comp = bz2.BZ2Compressor()
>>> out = b""
>>> for chunk in gen_data():
...     # Provide data to the compressor object
...     out = out + comp.compress(chunk)
...
>>> # Finish the compression process.  Call this once you have
>>> # finished providing data to the compressor.
>>> out = out + comp.flush()
@end example

The example above uses a very “nonrandom” stream of data
(a stream of @code{b"z"} chunks).  Random data tends to compress poorly,
while ordered, repetitive data usually yields a high compression ratio.

Writing and reading a bzip2-compressed file in binary mode:

@example
>>> import bz2
>>> data = b"""\
... Donec rhoncus quis sapien sit amet molestie. Fusce scelerisque vel augue
... nec ullamcorper. Nam rutrum pretium placerat. Aliquam vel tristique lorem,
... sit amet cursus ante. In interdum laoreet mi, sit amet ultrices purus
... pulvinar a. Nam gravida euismod magna, non varius justo tincidunt feugiat.
... Aliquam pharetra lacus non risus vehicula rutrum. Maecenas aliquam leo
... felis. Pellentesque semper nunc sit amet nibh ullamcorper, ac elementum
... dolor luctus. Curabitur lacinia mi ornare consectetur vestibulum."""
>>> with bz2.open("myfile.bz2", "wb") as f:
...     # Write compressed data to file
...     unused = f.write(data)
...
>>> with bz2.open("myfile.bz2", "rb") as f:
...     # Decompress data from file
...     content = f.read()
...
>>> content == data  # Check equality to original object after round-trip
True
@end example

@c import os
@c os.remove("myfile.bz2")

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node lzma — Compression using the LZMA algorithm,zipfile — Work with ZIP archives,bz2 — Support for bzip2 compression,Data Compression and Archiving
@anchor{library/lzma doc}@anchor{2ee9}@anchor{library/lzma lzma-compression-using-the-lzma-algorithm}@anchor{2eea}@anchor{library/lzma module-lzma}@anchor{8e}@anchor{library/lzma translation-repo}@anchor{2eeb}
@subsection @code{lzma} — Compression using the LZMA algorithm


@geindex module; lzma


Added in version 3.3.


`Source code:' Lib/lzma.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/lzma.py}


__________________________________________________________________


This module provides classes and convenience functions for compressing and
decompressing data using the LZMA compression algorithm. Also included is a file
interface supporting the @code{.xz} and legacy @code{.lzma} file formats used by the
@code{xz} utility, as well as raw compressed streams.

The interface provided by this module is very similar to that of the @ref{14,,bz2}
module. Note that @ref{1212,,LZMAFile} and @ref{a6c,,bz2.BZ2File} are `not'
thread-safe, so if you need to use a single @code{LZMAFile} instance
from multiple threads, it is necessary to protect it with a lock.

This is an @ref{219c,,optional module}.
If it is missing from your copy of CPython,
look for documentation from your distributor (that is,
whoever provided Python to you).
If you are the distributor, see @ref{219a,,Requirements for optional modules}.

@c Similar notes appear in the docs of the modules:
@c - zipfile
@c - tarfile

@geindex LZMAError
@anchor{library/lzma lzma LZMAError}@anchor{2eec}
@deffn {Exception} lzma.LZMAError

This exception is raised when an error occurs during compression or
decompression, or while initializing the compressor/decompressor state.
@end deffn

@menu
* Reading and writing compressed files: Reading and writing compressed files<2>. 
* Compressing and decompressing data in memory: Compressing and decompressing data in memory<2>. 
* Miscellaneous: Miscellaneous<3>. 
* Specifying custom filter chains:: 
* Examples: Examples<9>. 

@end menu

@node Reading and writing compressed files<2>,Compressing and decompressing data in memory<2>,,lzma — Compression using the LZMA algorithm
@anchor{library/lzma reading-and-writing-compressed-files}@anchor{2eed}
@subsubsection Reading and writing compressed files


@geindex open() (in module lzma)
@anchor{library/lzma lzma open}@anchor{2eee}
@deffn {Function} lzma.open (filename, mode='rb', *, format=None, check=-1, preset=None, filters=None, encoding=None, errors=None, newline=None)

Open an LZMA-compressed file in binary or text mode, returning a @ref{13cf,,file object}.

The `filename' argument can be either an actual file name (given as a
@ref{16a,,str}, @ref{193,,bytes} or @ref{5a1,,path-like} object), in
which case the named file is opened, or it can be an existing file object
to read from or write to.

The `mode' argument can be any of @code{"r"}, @code{"rb"}, @code{"w"}, @code{"wb"},
@code{"x"}, @code{"xb"}, @code{"a"} or @code{"ab"} for binary mode, or @code{"rt"},
@code{"wt"}, @code{"xt"}, or @code{"at"} for text mode. The default is @code{"rb"}.

When opening a file for reading, the `format' and `filters' arguments have
the same meanings as for @ref{178e,,LZMADecompressor}. In this case, the `check'
and `preset' arguments should not be used.

When opening a file for writing, the `format', `check', `preset' and
`filters' arguments have the same meanings as for @ref{1b11,,LZMACompressor}.

For binary mode, this function is equivalent to the @ref{1212,,LZMAFile}
constructor: @code{LZMAFile(filename, mode, ...)}. In this case, the `encoding',
`errors' and `newline' arguments must not be provided.

For text mode, a @ref{1212,,LZMAFile} object is created, and wrapped in an
@ref{9c4,,io.TextIOWrapper} instance with the specified encoding, error
handling behavior, and line ending(s).


Changed in version 3.4: Added support for the @code{"x"}, @code{"xb"} and @code{"xt"} modes.



Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.

@end deffn

@geindex LZMAFile (class in lzma)
@anchor{library/lzma lzma LZMAFile}@anchor{1212}
@deffn {Class} lzma.LZMAFile (filename=None, mode='r', *, format=None, check=-1, preset=None, filters=None)

Open an LZMA-compressed file in binary mode.

An @code{LZMAFile} can wrap an already-open @ref{13cf,,file object}, or operate
directly on a named file. The `filename' argument specifies either the file
object to wrap, or the name of the file to open (as a @ref{16a,,str},
@ref{193,,bytes} or @ref{5a1,,path-like} object). When wrapping an
existing file object, the wrapped file will not be closed when the
@code{LZMAFile} is closed.

The `mode' argument can be either @code{"r"} for reading (default), @code{"w"} for
overwriting, @code{"x"} for exclusive creation, or @code{"a"} for appending. These
can equivalently be given as @code{"rb"}, @code{"wb"}, @code{"xb"} and @code{"ab"}
respectively.

If `filename' is a file object (rather than an actual file name), a mode of
@code{"w"} does not truncate the file, and is instead equivalent to @code{"a"}.

When opening a file for reading, the input file may be the concatenation of
multiple separate compressed streams. These are transparently decoded as a
single logical stream.

When opening a file for reading, the `format' and `filters' arguments have
the same meanings as for @ref{178e,,LZMADecompressor}. In this case, the `check'
and `preset' arguments should not be used.

When opening a file for writing, the `format', `check', `preset' and
`filters' arguments have the same meanings as for @ref{1b11,,LZMACompressor}.

@code{LZMAFile} supports all the members specified by
@ref{8a5,,io.BufferedIOBase}, except for @ref{2e5b,,detach()}
and @ref{151c,,truncate()}.
Iteration and the @ref{187,,with} statement are supported.

The following method and attributes are also provided:

@geindex peek() (lzma.LZMAFile method)
@anchor{library/lzma lzma LZMAFile peek}@anchor{2eef}
@deffn {Method} peek (size=-1)

Return buffered data without advancing the file position. At least one
byte of data will be returned, unless EOF has been reached. The exact
number of bytes returned is unspecified (the `size' argument is ignored).

@cartouche
@quotation Note 
While calling @code{peek()} does not change the file position of
the @code{LZMAFile}, it may change the position of the underlying
file object (e.g. if the @code{LZMAFile} was constructed by passing a
file object for `filename').
@end quotation
@end cartouche
@end deffn

@geindex mode (lzma.LZMAFile attribute)
@anchor{library/lzma lzma LZMAFile mode}@anchor{2ef0}
@deffn {Attribute} mode

@code{'rb'} for reading and @code{'wb'} for writing.


Added in version 3.13.

@end deffn

@geindex name (lzma.LZMAFile attribute)
@anchor{library/lzma lzma LZMAFile name}@anchor{2ef1}
@deffn {Attribute} name

The lzma file name.  Equivalent to the @ref{2e5f,,name}
attribute of the underlying @ref{13cf,,file object}.


Added in version 3.13.

@end deffn


Changed in version 3.4: Added support for the @code{"x"} and @code{"xb"} modes.



Changed in version 3.5: The @ref{1534,,read()} method now accepts an argument of
@code{None}.



Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.

@end deffn

@node Compressing and decompressing data in memory<2>,Miscellaneous<3>,Reading and writing compressed files<2>,lzma — Compression using the LZMA algorithm
@anchor{library/lzma compressing-and-decompressing-data-in-memory}@anchor{2ef2}
@subsubsection Compressing and decompressing data in memory


@geindex LZMACompressor (class in lzma)
@anchor{library/lzma lzma LZMACompressor}@anchor{1b11}
@deffn {Class} lzma.LZMACompressor (format=FORMAT_XZ, check=-1, preset=None, filters=None)

Create a compressor object, which can be used to compress data incrementally.

For a more convenient way of compressing a single chunk of data, see
@ref{2ef3,,compress()}.

The `format' argument specifies what container format should be used.
Possible values are:


@itemize *

@item 

@table @asis

@item @code{FORMAT_XZ}: The @code{.xz} container format.

This is the default format.
@end table

@item 

@table @asis

@item @code{FORMAT_ALONE}: The legacy @code{.lzma} container format.

This format is more limited than @code{.xz} – it does not support integrity
checks or multiple filters.
@end table

@item 

@table @asis

@item @code{FORMAT_RAW}: A raw data stream, not using any container format.

This format specifier does not support integrity checks, and requires that
you always specify a custom filter chain (for both compression and
decompression). Additionally, data compressed in this manner cannot be
decompressed using @code{FORMAT_AUTO} (see @ref{178e,,LZMADecompressor}).
@end table
@end itemize

The `check' argument specifies the type of integrity check to include in the
compressed data. This check is used when decompressing, to ensure that the
data has not been corrupted. Possible values are:


@itemize *

@item 
@code{CHECK_NONE}: No integrity check.
This is the default (and the only acceptable value) for
@code{FORMAT_ALONE} and @code{FORMAT_RAW}.

@item 
@code{CHECK_CRC32}: 32-bit Cyclic Redundancy Check.

@item 
@code{CHECK_CRC64}: 64-bit Cyclic Redundancy Check.
This is the default for @code{FORMAT_XZ}.

@item 
@code{CHECK_SHA256}: 256-bit Secure Hash Algorithm.
@end itemize

If the specified check is not supported, an @ref{2eec,,LZMAError} is raised.

The compression settings can be specified either as a preset compression
level (with the `preset' argument), or in detail as a custom filter chain
(with the `filters' argument).

The `preset' argument (if provided) should be an integer between @code{0} and
@code{9} (inclusive), optionally OR-ed with the constant
@code{PRESET_EXTREME}. If neither `preset' nor `filters' are given, the
default behavior is to use @code{PRESET_DEFAULT} (preset level @code{6}).
Higher presets produce smaller output, but make the compression process
slower.

@cartouche
@quotation Note 
In addition to being more CPU-intensive, compression with higher presets
also requires much more memory (and produces output that needs more memory
to decompress). With preset @code{9} for example, the overhead for an
@code{LZMACompressor} object can be as high as 800 MiB. For this reason,
it is generally best to stick with the default preset.
@end quotation
@end cartouche

The `filters' argument (if provided) should be a filter chain specifier.
See @ref{2ef4,,Specifying custom filter chains} for details.

@geindex compress() (lzma.LZMACompressor method)
@anchor{library/lzma lzma LZMACompressor compress}@anchor{2ef5}
@deffn {Method} compress (data)

Compress `data' (a @ref{193,,bytes} object), returning a @code{bytes}
object containing compressed data for at least part of the input. Some of
`data' may be buffered internally, for use in later calls to
@code{compress()} and @ref{2ef6,,flush()}. The returned data should be
concatenated with the output of any previous calls to @code{compress()}.
@end deffn

@geindex flush() (lzma.LZMACompressor method)
@anchor{library/lzma lzma LZMACompressor flush}@anchor{2ef6}
@deffn {Method} flush ()

Finish the compression process, returning a @ref{193,,bytes} object
containing any data stored in the compressor’s internal buffers.

The compressor cannot be used after this method has been called.
@end deffn
@end deffn

@geindex LZMADecompressor (class in lzma)
@anchor{library/lzma lzma LZMADecompressor}@anchor{178e}
@deffn {Class} lzma.LZMADecompressor (format=FORMAT_AUTO, memlimit=None, filters=None)

Create a decompressor object, which can be used to decompress data
incrementally.

For a more convenient way of decompressing an entire compressed stream at
once, see @ref{2ef7,,decompress()}.

The `format' argument specifies the container format that should be used. The
default is @code{FORMAT_AUTO}, which can decompress both @code{.xz} and
@code{.lzma} files. Other possible values are @code{FORMAT_XZ},
@code{FORMAT_ALONE}, and @code{FORMAT_RAW}.

The `memlimit' argument specifies a limit (in bytes) on the amount of memory
that the decompressor can use. When this argument is used, decompression will
fail with an @ref{2eec,,LZMAError} if it is not possible to decompress the input
within the given memory limit.

The `filters' argument specifies the filter chain that was used to create
the stream being decompressed. This argument is required if `format' is
@code{FORMAT_RAW}, but should not be used for other formats.
See @ref{2ef4,,Specifying custom filter chains} for more information about filter chains.

@cartouche
@quotation Note 
This class does not transparently handle inputs containing multiple
compressed streams, unlike @ref{2ef7,,decompress()} and @ref{1212,,LZMAFile}. To
decompress a multi-stream input with @code{LZMADecompressor}, you must
create a new decompressor for each stream.
@end quotation
@end cartouche

@geindex decompress() (lzma.LZMADecompressor method)
@anchor{library/lzma lzma LZMADecompressor decompress}@anchor{1034}
@deffn {Method} decompress (data, max_length=-1)

Decompress `data' (a @ref{194,,bytes-like object}), returning
uncompressed data as bytes. Some of `data' may be buffered
internally, for use in later calls to @code{decompress()}. The
returned data should be concatenated with the output of any
previous calls to @code{decompress()}.

If `max_length' is nonnegative, returns at most `max_length'
bytes of decompressed data. If this limit is reached and further
output can be produced, the @ref{2ef8,,needs_input} attribute will
be set to @code{False}. In this case, the next call to
@code{decompress()} may provide `data' as @code{b'@w{'}} to obtain
more of the output.

If all of the input data was decompressed and returned (either
because this was less than `max_length' bytes, or because
`max_length' was negative), the @ref{2ef8,,needs_input} attribute
will be set to @code{True}.

Attempting to decompress data after the end of stream is reached
raises an @ref{14e5,,EOFError}.  Any data found after the end of the
stream is ignored and saved in the @ref{2ef9,,unused_data} attribute.


Changed in version 3.5: Added the `max_length' parameter.

@end deffn

@geindex check (lzma.LZMADecompressor attribute)
@anchor{library/lzma lzma LZMADecompressor check}@anchor{2efa}
@deffn {Attribute} check

The ID of the integrity check used by the input stream. This may be
@code{CHECK_UNKNOWN} until enough of the input has been decoded to
determine what integrity check it uses.
@end deffn

@geindex eof (lzma.LZMADecompressor attribute)
@anchor{library/lzma lzma LZMADecompressor eof}@anchor{2efb}
@deffn {Attribute} eof

@code{True} if the end-of-stream marker has been reached.
@end deffn

@geindex unused_data (lzma.LZMADecompressor attribute)
@anchor{library/lzma lzma LZMADecompressor unused_data}@anchor{2ef9}
@deffn {Attribute} unused_data

Data found after the end of the compressed stream.

Before the end of the stream is reached, this will be @code{b""}.
@end deffn

@geindex needs_input (lzma.LZMADecompressor attribute)
@anchor{library/lzma lzma LZMADecompressor needs_input}@anchor{2ef8}
@deffn {Attribute} needs_input

@code{False} if the @ref{1034,,decompress()} method can provide more
decompressed data before requiring new uncompressed input.


Added in version 3.5.

@end deffn
@end deffn

@geindex compress() (in module lzma)
@anchor{library/lzma lzma compress}@anchor{2ef3}
@deffn {Function} lzma.compress (data, format=FORMAT_XZ, check=-1, preset=None, filters=None)

Compress `data' (a @ref{193,,bytes} object), returning the compressed data as a
@code{bytes} object.

See @ref{1b11,,LZMACompressor} above for a description of the `format', `check',
`preset' and `filters' arguments.
@end deffn

@geindex decompress() (in module lzma)
@anchor{library/lzma lzma decompress}@anchor{2ef7}
@deffn {Function} lzma.decompress (data, format=FORMAT_AUTO, memlimit=None, filters=None)

Decompress `data' (a @ref{193,,bytes} object), returning the uncompressed data
as a @code{bytes} object.

If `data' is the concatenation of multiple distinct compressed streams,
decompress all of these streams, and return the concatenation of the results.

See @ref{178e,,LZMADecompressor} above for a description of the `format',
`memlimit' and `filters' arguments.
@end deffn

@node Miscellaneous<3>,Specifying custom filter chains,Compressing and decompressing data in memory<2>,lzma — Compression using the LZMA algorithm
@anchor{library/lzma miscellaneous}@anchor{2efc}
@subsubsection Miscellaneous


@geindex is_check_supported() (in module lzma)
@anchor{library/lzma lzma is_check_supported}@anchor{2efd}
@deffn {Function} lzma.is_check_supported (check)

Return @code{True} if the given integrity check is supported on this system.

@code{CHECK_NONE} and @code{CHECK_CRC32} are always supported.
@code{CHECK_CRC64} and @code{CHECK_SHA256} may be unavailable if you are
using a version of @code{liblzma} that was compiled with a limited
feature set.
@end deffn

@node Specifying custom filter chains,Examples<9>,Miscellaneous<3>,lzma — Compression using the LZMA algorithm
@anchor{library/lzma filter-chain-specs}@anchor{2ef4}@anchor{library/lzma specifying-custom-filter-chains}@anchor{2efe}
@subsubsection Specifying custom filter chains


A filter chain specifier is a sequence of dictionaries, where each dictionary
contains the ID and options for a single filter. Each dictionary must contain
the key @code{"id"}, and may contain additional keys to specify filter-dependent
options. Valid filter IDs are as follows:


@itemize *

@item 
Compression filters:


@itemize *

@item 
@code{FILTER_LZMA1} (for use with @code{FORMAT_ALONE})

@item 
@code{FILTER_LZMA2} (for use with @code{FORMAT_XZ} and @code{FORMAT_RAW})
@end itemize

@item 
Delta filter:


@itemize *

@item 
@code{FILTER_DELTA}
@end itemize

@item 
Branch-Call-Jump (BCJ) filters:


@itemize *

@item 
@code{FILTER_X86}

@item 
@code{FILTER_IA64}

@item 
@code{FILTER_ARM}

@item 
@code{FILTER_ARMTHUMB}

@item 
@code{FILTER_POWERPC}

@item 
@code{FILTER_SPARC}
@end itemize
@end itemize

A filter chain can consist of up to 4 filters, and cannot be empty. The last
filter in the chain must be a compression filter, and any other filters must be
delta or BCJ filters.

Compression filters support the following options (specified as additional
entries in the dictionary representing the filter):


@itemize *

@item 
@code{preset}: A compression preset to use as a source of default values for
options that are not specified explicitly.

@item 
@code{dict_size}: Dictionary size in bytes. This should be between 4 KiB and
1.5 GiB (inclusive).

@item 
@code{lc}: Number of literal context bits.

@item 
@code{lp}: Number of literal position bits. The sum @code{lc + lp} must be at
most 4.

@item 
@code{pb}: Number of position bits; must be at most 4.

@item 
@code{mode}: @code{MODE_FAST} or @code{MODE_NORMAL}.

@item 
@code{nice_len}: What should be considered a “nice length” for a match.
This should be 273 or less.

@item 
@code{mf}: What match finder to use – @code{MF_HC3}, @code{MF_HC4},
@code{MF_BT2}, @code{MF_BT3}, or @code{MF_BT4}.

@item 
@code{depth}: Maximum search depth used by match finder. 0 (default) means to
select automatically based on other filter options.
@end itemize

The delta filter stores the differences between bytes, producing more repetitive
input for the compressor in certain circumstances. It supports one option,
@code{dist}. This indicates the distance between bytes to be subtracted. The
default is 1, i.e. take the differences between adjacent bytes.

The BCJ filters are intended to be applied to machine code. They convert
relative branches, calls and jumps in the code to use absolute addressing, with
the aim of increasing the redundancy that can be exploited by the compressor.
These filters support one option, @code{start_offset}. This specifies the address
that should be mapped to the beginning of the input data. The default is 0.

@node Examples<9>,,Specifying custom filter chains,lzma — Compression using the LZMA algorithm
@anchor{library/lzma examples}@anchor{2eff}
@subsubsection Examples


Reading in a compressed file:

@example
import lzma
with lzma.open("file.xz") as f:
    file_content = f.read()
@end example

Creating a compressed file:

@example
import lzma
data = b"Insert Data Here"
with lzma.open("file.xz", "w") as f:
    f.write(data)
@end example

Compressing data in memory:

@example
import lzma
data_in = b"Insert Data Here"
data_out = lzma.compress(data_in)
@end example

Incremental compression:

@example
import lzma
lzc = lzma.LZMACompressor()
out1 = lzc.compress(b"Some data\n")
out2 = lzc.compress(b"Another piece of data\n")
out3 = lzc.compress(b"Even more data\n")
out4 = lzc.flush()
# Concatenate all the partial results:
result = b"".join([out1, out2, out3, out4])
@end example

Writing compressed data to an already-open file:

@example
import lzma
with open("file.xz", "wb") as f:
    f.write(b"This data will not be compressed\n")
    with lzma.open(f, "w") as lzf:
        lzf.write(b"This *will* be compressed\n")
    f.write(b"Not compressed\n")
@end example

Creating a compressed file using a custom filter chain:

@example
import lzma
my_filters = [
    @{"id": lzma.FILTER_DELTA, "dist": 5@},
    @{"id": lzma.FILTER_LZMA2, "preset": 7 | lzma.PRESET_EXTREME@},
]
with lzma.open("file.xz", "w", filters=my_filters) as f:
    f.write(b"blah blah blah")
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node zipfile — Work with ZIP archives,tarfile — Read and write tar archive files,lzma — Compression using the LZMA algorithm,Data Compression and Archiving
@anchor{library/zipfile doc}@anchor{2f00}@anchor{library/zipfile module-zipfile}@anchor{138}@anchor{library/zipfile translation-repo}@anchor{2f01}@anchor{library/zipfile zipfile-work-with-zip-archives}@anchor{2f02}
@subsection @code{zipfile} — Work with ZIP archives


@geindex module; zipfile

`Source code:' Lib/zipfile/@footnote{https://github.com/python/cpython/tree/3.14/Lib/zipfile/}


__________________________________________________________________


The ZIP file format is a common archive and compression standard. This module
provides tools to create, read, write, append, and list a ZIP file.  Any
advanced use of this module will require an understanding of the format, as
defined in PKZIP Application Note@footnote{https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT}.

This module does not handle multipart ZIP files.
It can handle ZIP files that use the ZIP64 extensions
(that is ZIP files that are more than 4 GiB in size).  It supports
decryption of encrypted files in ZIP archives, but it cannot
create an encrypted file.  Decryption is extremely slow as it is
implemented in native Python rather than C.

@c The following paragraph should be similar to ../includes/optional-module.rst

Handling compressed archives requires @ref{219c,,optional modules}
such as @ref{13a,,zlib}, @ref{14,,bz2}, @ref{8e,,lzma}, and @ref{23,,compression.zstd}.
If any of them are missing from your copy of CPython,
look for documentation from your distributor (that is,
whoever provided Python to you).
If you are the distributor, see @ref{219a,,Requirements for optional modules}.

The module defines the following items:

@geindex BadZipFile
@anchor{library/zipfile zipfile BadZipFile}@anchor{1bac}
@deffn {Exception} zipfile.BadZipFile

The error raised for bad ZIP files.


Added in version 3.2.

@end deffn

@geindex BadZipfile
@anchor{library/zipfile zipfile BadZipfile}@anchor{2f03}
@deffn {Exception} zipfile.BadZipfile

Alias of @ref{1bac,,BadZipFile}, for compatibility with older Python versions.


Deprecated since version 3.2.

@end deffn

@geindex LargeZipFile
@anchor{library/zipfile zipfile LargeZipFile}@anchor{2f04}
@deffn {Exception} zipfile.LargeZipFile

The error raised when a ZIP file would require ZIP64 functionality but that has
not been enabled.
@end deffn


@deffn {Class} zipfile.ZipFile

The class for reading and writing ZIP files.  See section
@ref{2f05,,ZipFile objects} for constructor details.
@end deffn


@deffn {Class} zipfile.Path

Class that implements a subset of the interface provided by
@ref{268,,pathlib.Path}, including the full
@ref{2fc,,importlib.resources.abc.Traversable} interface.


Added in version 3.8.

@end deffn


@deffn {Class} zipfile.PyZipFile

Class for creating ZIP archives containing Python libraries.
@end deffn

@geindex ZipInfo (class in zipfile)
@anchor{library/zipfile zipfile ZipInfo}@anchor{2cd}
@deffn {Class} zipfile.ZipInfo (filename='NoName', date_time=(1980, 1, 1, 0, 0, 0))

Class used to represent information about a member of an archive. Instances
of this class are returned by the @ref{2f06,,getinfo()} and @ref{2f07,,infolist()}
methods of @ref{8d5,,ZipFile} objects.  Most users of the @code{zipfile} module
will not need to create these, but only use those created by this
module. `filename' should be the full name of the archive member, and
`date_time' should be a tuple containing six fields which describe the time
of the last modification to the file; the fields are described in section
@ref{2f08,,ZipInfo objects}.


Changed in version 3.13: A public @code{compress_level} attribute has been added to expose the
formerly protected @code{_compresslevel}.  The older protected name
continues to work as a property for backwards compatibility.


@geindex _for_archive() (zipfile.ZipInfo method)
@anchor{library/zipfile zipfile ZipInfo _for_archive}@anchor{2cc}
@deffn {Method} _for_archive (archive)

Resolve the date_time, compression attributes, and external attributes
to suitable defaults as used by @ref{2ce,,ZipFile.writestr()}.

Returns self for chaining.


Added in version 3.14.

@end deffn
@end deffn

@geindex is_zipfile() (in module zipfile)
@anchor{library/zipfile zipfile is_zipfile}@anchor{1536}
@deffn {Function} zipfile.is_zipfile (filename)

Returns @code{True} if `filename' is a valid ZIP file based on its magic number,
otherwise returns @code{False}.  `filename' may be a file or file-like object too.


Changed in version 3.1: Support for file and file-like objects.

@end deffn

@geindex ZIP_STORED (in module zipfile)
@anchor{library/zipfile zipfile ZIP_STORED}@anchor{2f09}
@deffn {Data} zipfile.ZIP_STORED

The numeric constant for an uncompressed archive member.
@end deffn

@geindex ZIP_DEFLATED (in module zipfile)
@anchor{library/zipfile zipfile ZIP_DEFLATED}@anchor{2f0a}
@deffn {Data} zipfile.ZIP_DEFLATED

The numeric constant for the usual ZIP compression method.  This requires the
@ref{13a,,zlib} module.
@end deffn

@geindex ZIP_BZIP2 (in module zipfile)
@anchor{library/zipfile zipfile ZIP_BZIP2}@anchor{2f0b}
@deffn {Data} zipfile.ZIP_BZIP2

The numeric constant for the BZIP2 compression method.  This requires the
@ref{14,,bz2} module.


Added in version 3.3.

@end deffn

@geindex ZIP_LZMA (in module zipfile)
@anchor{library/zipfile zipfile ZIP_LZMA}@anchor{2f0c}
@deffn {Data} zipfile.ZIP_LZMA

The numeric constant for the LZMA compression method.  This requires the
@ref{8e,,lzma} module.


Added in version 3.3.

@end deffn

@geindex ZIP_ZSTANDARD (in module zipfile)
@anchor{library/zipfile zipfile ZIP_ZSTANDARD}@anchor{2f0d}
@deffn {Data} zipfile.ZIP_ZSTANDARD

The numeric constant for Zstandard compression. This requires the
@ref{23,,compression.zstd} module.

@cartouche
@quotation Note 
In APPNOTE 6.3.7, the method ID @code{20} was assigned to Zstandard
compression. This was changed in APPNOTE 6.3.8 to method ID @code{93} to
avoid conflicts, with method ID @code{20} being deprecated. For
compatibility, the @code{zipfile} module reads both method IDs but will
only write data with method ID @code{93}.
@end quotation
@end cartouche


Added in version 3.14.

@end deffn

@cartouche
@quotation Note 
The ZIP file format specification has included support for bzip2 compression
since 2001, for LZMA compression since 2006, and Zstandard compression since
2020. However, some tools (including older Python releases) do not support
these compression methods, and may either refuse to process the ZIP file
altogether, or fail to extract individual files.
@end quotation
@end cartouche


@subsubheading See also



@table @asis

@item PKZIP Application Note@footnote{https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT}

Documentation on the ZIP file format by Phil Katz, the creator of the format and
algorithms used.

@item Info-ZIP Home Page@footnote{https://infozip.sourceforge.net/}

Information about the Info-ZIP project’s ZIP archive programs and development
libraries.
@end table


@menu
* ZipFile objects:: 
* Path objects:: 
* PyZipFile objects:: 
* ZipInfo objects:: 
* Command-line interface: Command-line interface<4>. 
* Decompression pitfalls:: 

@end menu

@node ZipFile objects,Path objects,,zipfile — Work with ZIP archives
@anchor{library/zipfile id1}@anchor{2f0e}@anchor{library/zipfile zipfile-objects}@anchor{2f05}
@subsubsection ZipFile objects


@geindex ZipFile (class in zipfile)
@anchor{library/zipfile zipfile ZipFile}@anchor{8d5}
@deffn {Class} zipfile.ZipFile (file, mode='r', compression=ZIP_STORED, allowZip64=True, compresslevel=None, *, strict_timestamps=True, metadata_encoding=None)

Open a ZIP file, where `file' can be a path to a file (a string), a
file-like object or a @ref{5a1,,path-like object}.

The `mode' parameter should be @code{'r'} to read an existing
file, @code{'w'} to truncate and write a new file, @code{'a'} to append to an
existing file, or @code{'x'} to exclusively create and write a new file.
If `mode' is @code{'x'} and `file' refers to an existing file,
a @ref{1226,,FileExistsError} will be raised.
If `mode' is @code{'a'} and `file' refers to an existing ZIP
file, then additional files are added to it.  If `file' does not refer to a
ZIP file, then a new ZIP archive is appended to the file.  This is meant for
adding a ZIP archive to another file (such as @code{python.exe}).  If
`mode' is @code{'a'} and the file does not exist at all, it is created.
If `mode' is @code{'r'} or @code{'a'}, the file should be seekable.

`compression' is the ZIP compression method to use when writing the archive,
and should be @ref{2f09,,ZIP_STORED}, @ref{2f0a,,ZIP_DEFLATED},
@ref{2f0b,,ZIP_BZIP2}, @ref{2f0c,,ZIP_LZMA}, or @ref{2f0d,,ZIP_ZSTANDARD};
unrecognized values will cause @ref{369,,NotImplementedError} to be raised.  If
@code{ZIP_DEFLATED}, @code{ZIP_BZIP2}, @code{ZIP_LZMA}, or
@code{ZIP_ZSTANDARD} is specified but the corresponding module
(@ref{13a,,zlib}, @ref{14,,bz2}, @ref{8e,,lzma}, or @ref{23,,compression.zstd}) is not
available, @ref{246,,RuntimeError} is raised. The default is @code{ZIP_STORED}.

If `allowZip64' is @code{True} (the default) zipfile will create ZIP files that
use the ZIP64 extensions when the zipfile is larger than 4 GiB. If it is
@code{false} @code{zipfile} will raise an exception when the ZIP file would
require ZIP64 extensions.

The `compresslevel' parameter controls the compression level to use when
writing files to the archive.
When using @ref{2f09,,ZIP_STORED} or @ref{2f0c,,ZIP_LZMA} it has no effect.
When using @ref{2f0a,,ZIP_DEFLATED} integers @code{0} through @code{9} are accepted
(see @ref{2ea3,,zlib} for more information).
When using @ref{2f0b,,ZIP_BZIP2} integers @code{1} through @code{9} are accepted
(see @ref{a6c,,bz2} for more information).
When using @ref{2f0d,,ZIP_ZSTANDARD} integers @code{-131072} through @code{22} are
commonly accepted (see
@ref{2e61,,CompressionParameter.compression_level}
for more on retrieving valid values and their meaning).

The `strict_timestamps' argument, when set to @code{False}, allows to
zip files older than 1980-01-01 at the cost of setting the
timestamp to 1980-01-01.
Similar behavior occurs with files newer than 2107-12-31,
the timestamp is also set to the limit.

When mode is @code{'r'}, `metadata_encoding' may be set to the name of a codec,
which will be used to decode metadata such as the names of members and ZIP
comments.

If the file is created with mode @code{'w'}, @code{'x'} or @code{'a'} and then
@ref{2f0f,,closed} without adding any files to the archive, the appropriate
ZIP structures for an empty archive will be written to the file.

ZipFile is also a context manager and therefore supports the
@ref{187,,with} statement.  In the example, `myzip' is closed after the
@code{with} statement’s suite is finished—even if an exception occurs:

@example
with ZipFile('spam.zip', 'w') as myzip:
    myzip.write('eggs.txt')
@end example

@cartouche
@quotation Note 
`metadata_encoding' is an instance-wide setting for the ZipFile.
It is not possible to set this on a per-member basis.

This attribute is a workaround for legacy implementations which produce
archives with names in the current locale encoding or code page (mostly
on Windows).  According to the .ZIP standard, the encoding of metadata
may be specified to be either IBM code page (default) or UTF-8 by a flag
in the archive header.
That flag takes precedence over `metadata_encoding', which is
a Python-specific extension.
@end quotation
@end cartouche


Changed in version 3.2: Added the ability to use @code{ZipFile} as a context manager.



Changed in version 3.3: Added support for @ref{14,,bzip2} and @ref{8e,,lzma} compression.



Changed in version 3.4: ZIP64 extensions are enabled by default.



Changed in version 3.5: Added support for writing to unseekable streams.
Added support for the @code{'x'} mode.



Changed in version 3.6: Previously, a plain @ref{246,,RuntimeError} was raised for unrecognized
compression values.



Changed in version 3.6.2: The `file' parameter accepts a @ref{5a1,,path-like object}.



Changed in version 3.7: Add the `compresslevel' parameter.



Changed in version 3.8: The `strict_timestamps' keyword-only parameter.



Changed in version 3.11: Added support for specifying member name encoding for reading
metadata in the zipfile’s directory and file headers.

@end deffn

@geindex close() (zipfile.ZipFile method)
@anchor{library/zipfile zipfile ZipFile close}@anchor{2f0f}
@deffn {Method} ZipFile.close ()

Close the archive file.  You must call @code{close()} before exiting your program
or essential records will not be written.
@end deffn

@geindex getinfo() (zipfile.ZipFile method)
@anchor{library/zipfile zipfile ZipFile getinfo}@anchor{2f06}
@deffn {Method} ZipFile.getinfo (name)

Return a @ref{2cd,,ZipInfo} object with information about the archive member
`name'.  Calling @code{getinfo()} for a name not currently contained in the
archive will raise a @ref{5e7,,KeyError}.
@end deffn

@geindex infolist() (zipfile.ZipFile method)
@anchor{library/zipfile zipfile ZipFile infolist}@anchor{2f07}
@deffn {Method} ZipFile.infolist ()

Return a list containing a @ref{2cd,,ZipInfo} object for each member of the
archive.  The objects are in the same order as their entries in the actual ZIP
file on disk if an existing archive was opened.
@end deffn

@geindex namelist() (zipfile.ZipFile method)
@anchor{library/zipfile zipfile ZipFile namelist}@anchor{2f10}
@deffn {Method} ZipFile.namelist ()

Return a list of archive members by name.
@end deffn

@geindex open() (zipfile.ZipFile method)
@anchor{library/zipfile zipfile ZipFile open}@anchor{65d}
@deffn {Method} ZipFile.open (name, mode='r', pwd=None, *, force_zip64=False)

Access a member of the archive as a binary file-like object.  `name'
can be either the name of a file within the archive or a @ref{2cd,,ZipInfo}
object.  The `mode' parameter, if included, must be @code{'r'} (the default)
or @code{'w'}.  `pwd' is the password used to decrypt encrypted ZIP files as a
@ref{193,,bytes} object.

@code{open()} is also a context manager and therefore supports the
@ref{187,,with} statement:

@example
with ZipFile('spam.zip') as myzip:
    with myzip.open('eggs.txt') as myfile:
        print(myfile.read())
@end example

With `mode' @code{'r'} the file-like object
(@code{ZipExtFile}) is read-only and provides the following methods:
@ref{1534,,read()}, @ref{1535,,readline()},
@ref{280b,,readlines()}, @ref{1498,,seek()},
@ref{15b8,,tell()}, @ref{20ee,,__iter__()}, @ref{14d9,,__next__()}.
These objects can operate independently of the ZipFile.

With @code{mode='w'}, a writable file handle is returned, which supports the
@ref{edd,,write()} method.  While a writable file handle is open,
attempting to read or write other files in the ZIP file will raise a
@ref{2ee,,ValueError}.

In both cases the file-like object has also attributes @code{name},
which is equivalent to the name of a file within the archive, and
@code{mode}, which is @code{'rb'} or @code{'wb'} depending on the input mode.

When writing a file, if the file size is not known in advance but may exceed
2 GiB, pass @code{force_zip64=True} to ensure that the header format is
capable of supporting large files.  If the file size is known in advance,
construct a @ref{2cd,,ZipInfo} object with @ref{2f11,,file_size} set, and
use that as the `name' parameter.

@cartouche
@quotation Note 
The @code{open()}, @ref{2f12,,read()} and @ref{2f13,,extract()} methods can take a filename
or a @ref{2cd,,ZipInfo} object.  You will appreciate this when trying to read a
ZIP file that contains members with duplicate names.
@end quotation
@end cartouche


Changed in version 3.6: Removed support of @code{mode='U'}.  Use @ref{9c4,,io.TextIOWrapper} for reading
compressed text files in @ref{f3b,,universal newlines} mode.



Changed in version 3.6: @code{ZipFile.open()} can now be used to write files into the archive with the
@code{mode='w'} option.



Changed in version 3.6: Calling @code{open()} on a closed ZipFile will raise a @ref{2ee,,ValueError}.
Previously, a @ref{246,,RuntimeError} was raised.



Changed in version 3.13: Added attributes @code{name} and @code{mode} for the writeable
file-like object.
The value of the @code{mode} attribute for the readable file-like
object was changed from @code{'r'} to @code{'rb'}.

@end deffn

@geindex extract() (zipfile.ZipFile method)
@anchor{library/zipfile zipfile ZipFile extract}@anchor{2f13}
@deffn {Method} ZipFile.extract (member, path=None, pwd=None)

Extract a member from the archive to the current working directory; `member'
must be its full name or a @ref{2cd,,ZipInfo} object.  Its file information is
extracted as accurately as possible.  `path' specifies a different directory
to extract to.  `member' can be a filename or a @code{ZipInfo} object.
`pwd' is the password used for encrypted files as a @ref{193,,bytes} object.

Returns the normalized path created (a directory or new file).

@cartouche
@quotation Note 
If a member filename is an absolute path, a drive/UNC sharepoint and
leading (back)slashes will be stripped, e.g.: @code{///foo/bar} becomes
@code{foo/bar} on Unix, and @code{C:\foo\bar} becomes @code{foo\bar} on Windows.
And all @code{".."} components in a member filename will be removed, e.g.:
@code{../../foo../../ba..r} becomes @code{foo../ba..r}.  On Windows illegal
characters (@code{:}, @code{<}, @code{>}, @code{|}, @code{"}, @code{?}, and @code{*})
replaced by underscore (@code{_}).
@end quotation
@end cartouche


Changed in version 3.6: Calling @code{extract()} on a closed ZipFile will raise a
@ref{2ee,,ValueError}.  Previously, a @ref{246,,RuntimeError} was raised.



Changed in version 3.6.2: The `path' parameter accepts a @ref{5a1,,path-like object}.

@end deffn

@geindex extractall() (zipfile.ZipFile method)
@anchor{library/zipfile zipfile ZipFile extractall}@anchor{2f14}
@deffn {Method} ZipFile.extractall (path=None, members=None, pwd=None)

Extract all members from the archive to the current working directory.  `path'
specifies a different directory to extract to.  `members' is optional and must
be a subset of the list returned by @ref{2f10,,namelist()}.  `pwd' is the password
used for encrypted files as a @ref{193,,bytes} object.

@cartouche
@quotation Warning 
Never extract archives from untrusted sources without prior inspection.
It is possible that files are created outside of `path', for example, members
that have absolute filenames or filenames with “..” components.
This module attempts to prevent that.
See @ref{2f13,,extract()} note.
@end quotation
@end cartouche


Changed in version 3.6: Calling @code{extractall()} on a closed ZipFile will raise a
@ref{2ee,,ValueError}.  Previously, a @ref{246,,RuntimeError} was raised.



Changed in version 3.6.2: The `path' parameter accepts a @ref{5a1,,path-like object}.

@end deffn

@geindex printdir() (zipfile.ZipFile method)
@anchor{library/zipfile zipfile ZipFile printdir}@anchor{2f15}
@deffn {Method} ZipFile.printdir ()

Print a table of contents for the archive to @code{sys.stdout}.
@end deffn

@geindex setpassword() (zipfile.ZipFile method)
@anchor{library/zipfile zipfile ZipFile setpassword}@anchor{2f16}
@deffn {Method} ZipFile.setpassword (pwd)

Set `pwd' (a @ref{193,,bytes} object) as default password to extract encrypted files.
@end deffn

@geindex read() (zipfile.ZipFile method)
@anchor{library/zipfile zipfile ZipFile read}@anchor{2f12}
@deffn {Method} ZipFile.read (name, pwd=None)

Return the bytes of the file `name' in the archive.  `name' is the name of the
file in the archive, or a @ref{2cd,,ZipInfo} object.  The archive must be open for
read or append. `pwd' is the password used for encrypted files as a @ref{193,,bytes}
object and, if specified, overrides the default password set with @ref{2f16,,setpassword()}.
Calling @code{read()} on a ZipFile that uses a compression method other than
@ref{2f09,,ZIP_STORED}, @ref{2f0a,,ZIP_DEFLATED}, @ref{2f0b,,ZIP_BZIP2},
@ref{2f0c,,ZIP_LZMA}, or @ref{2f0d,,ZIP_ZSTANDARD} will raise a
@ref{369,,NotImplementedError}. An error will also be raised if the
corresponding compression module is not available.


Changed in version 3.6: Calling @code{read()} on a closed ZipFile will raise a @ref{2ee,,ValueError}.
Previously, a @ref{246,,RuntimeError} was raised.

@end deffn

@geindex testzip() (zipfile.ZipFile method)
@anchor{library/zipfile zipfile ZipFile testzip}@anchor{2f17}
@deffn {Method} ZipFile.testzip ()

Read all the files in the archive and check their CRC’s and file headers.
Return the name of the first bad file, or else return @code{None}.


Changed in version 3.6: Calling @code{testzip()} on a closed ZipFile will raise a
@ref{2ee,,ValueError}.  Previously, a @ref{246,,RuntimeError} was raised.

@end deffn

@geindex write() (zipfile.ZipFile method)
@anchor{library/zipfile zipfile ZipFile write}@anchor{f4f}
@deffn {Method} ZipFile.write (filename, arcname=None, compress_type=None, compresslevel=None)

Write the file named `filename' to the archive, giving it the archive name
`arcname' (by default, this will be the same as `filename', but without a drive
letter and with leading path separators removed).  If given, `compress_type'
overrides the value given for the `compression' parameter to the constructor for
the new entry. Similarly, `compresslevel' will override the constructor if
given.
The archive must be open with mode @code{'w'}, @code{'x'} or @code{'a'}.

@cartouche
@quotation Note 
The ZIP file standard historically did not specify a metadata encoding,
but strongly recommended CP437 (the original IBM PC encoding) for
interoperability.  Recent versions allow use of UTF-8 (only).  In this
module, UTF-8 will automatically be used to write the member names if
they contain any non-ASCII characters.  It is not possible to write
member names in any encoding other than ASCII or UTF-8.
@end quotation
@end cartouche

@cartouche
@quotation Note 
Archive names should be relative to the archive root, that is, they should not
start with a path separator.
@end quotation
@end cartouche

@cartouche
@quotation Note 
If @code{arcname} (or @code{filename}, if @code{arcname} is  not given) contains a null
byte, the name of the file in the archive will be truncated at the null byte.
@end quotation
@end cartouche

@cartouche
@quotation Note 
A leading slash in the filename may lead to the archive being impossible to
open in some zip programs on Windows systems.
@end quotation
@end cartouche


Changed in version 3.6: Calling @code{write()} on a ZipFile created with mode @code{'r'} or
a closed ZipFile will raise a @ref{2ee,,ValueError}.  Previously,
a @ref{246,,RuntimeError} was raised.

@end deffn

@geindex writestr() (zipfile.ZipFile method)
@anchor{library/zipfile zipfile ZipFile writestr}@anchor{2ce}
@deffn {Method} ZipFile.writestr (zinfo_or_arcname, data, compress_type=None, compresslevel=None)

Write a file into the archive.  The contents is `data', which may be either
a @ref{16a,,str} or a @ref{193,,bytes} instance; if it is a @code{str},
it is encoded as UTF-8 first.  `zinfo_or_arcname' is either the file
name it will be given in the archive, or a @ref{2cd,,ZipInfo} instance.  If it’s
an instance, at least the filename, date, and time must be given.  If it’s a
name, the date and time is set to the current date and time.
The archive must be opened with mode @code{'w'}, @code{'x'} or @code{'a'}.

If given, `compress_type' overrides the value given for the `compression'
parameter to the constructor for the new entry, or in the `zinfo_or_arcname'
(if that is a @ref{2cd,,ZipInfo} instance). Similarly, `compresslevel' will
override the constructor if given.

@cartouche
@quotation Note 
When passing a @ref{2cd,,ZipInfo} instance as the `zinfo_or_arcname' parameter,
the compression method used will be that specified in the `compress_type'
member of the given @code{ZipInfo} instance.  By default, the
@code{ZipInfo} constructor sets this member to @ref{2f09,,ZIP_STORED}.
@end quotation
@end cartouche


Changed in version 3.2: The `compress_type' argument.



Changed in version 3.6: Calling @code{writestr()} on a ZipFile created with mode @code{'r'} or
a closed ZipFile will raise a @ref{2ee,,ValueError}.  Previously,
a @ref{246,,RuntimeError} was raised.



Changed in version 3.14: Now respects the 
@geindex SOURCE_DATE_EPOCH
@geindex environment variable; SOURCE_DATE_EPOCH
@code{SOURCE_DATE_EPOCH} environment variable.
If set, it uses this value as the modification timestamp for the file
written into the ZIP archive, instead of using the current time.

@end deffn

@geindex mkdir() (zipfile.ZipFile method)
@anchor{library/zipfile zipfile ZipFile mkdir}@anchor{8d6}
@deffn {Method} ZipFile.mkdir (zinfo_or_directory, mode=511)

Create a directory inside the archive.  If `zinfo_or_directory' is a string,
a directory is created inside the archive with the mode that is specified in
the `mode' argument. If, however, `zinfo_or_directory' is
a @ref{2cd,,ZipInfo} instance then the `mode' argument is ignored.

The archive must be opened with mode @code{'w'}, @code{'x'} or @code{'a'}.


Added in version 3.11.

@end deffn

The following data attributes are also available:

@geindex filename (zipfile.ZipFile attribute)
@anchor{library/zipfile zipfile ZipFile filename}@anchor{2f18}
@deffn {Attribute} ZipFile.filename

Name of the ZIP file.
@end deffn

@geindex debug (zipfile.ZipFile attribute)
@anchor{library/zipfile zipfile ZipFile debug}@anchor{2f19}
@deffn {Attribute} ZipFile.debug

The level of debug output to use.  This may be set from @code{0} (the default, no
output) to @code{3} (the most output).  Debugging information is written to
@code{sys.stdout}.
@end deffn

@geindex comment (zipfile.ZipFile attribute)
@anchor{library/zipfile zipfile ZipFile comment}@anchor{2f1a}
@deffn {Attribute} ZipFile.comment

The comment associated with the ZIP file as a @ref{193,,bytes} object.
If assigning a comment to a
@ref{8d5,,ZipFile} instance created with mode @code{'w'}, @code{'x'} or @code{'a'},
it should be no longer than 65535 bytes.  Comments longer than this will be
truncated.
@end deffn

@node Path objects,PyZipFile objects,ZipFile objects,zipfile — Work with ZIP archives
@anchor{library/zipfile id2}@anchor{2f1b}@anchor{library/zipfile path-objects}@anchor{2f1c}
@subsubsection Path objects


@geindex Path (class in zipfile)
@anchor{library/zipfile zipfile Path}@anchor{8da}
@deffn {Class} zipfile.Path (root, at='@w{'})

Construct a Path object from a @code{root} zipfile (which may be a
@ref{8d5,,ZipFile} instance or @code{file} suitable for passing to
the @code{ZipFile} constructor).

@code{at} specifies the location of this Path within the zipfile,
e.g. ‘dir/file.txt’, ‘dir/’, or ‘’. Defaults to the empty string,
indicating the root.

@cartouche
@quotation Note 
The @code{Path} class does not sanitize filenames within the ZIP archive. Unlike
the @ref{2f13,,ZipFile.extract()} and @ref{2f14,,ZipFile.extractall()} methods, it is the
caller’s responsibility to validate or sanitize filenames to prevent path traversal
vulnerabilities (for example, absolute paths or paths with “..” components). When handling
untrusted archives, consider resolving filenames using @ref{1526,,os.path.abspath()}
and checking against the target directory with @ref{1043,,os.path.commonpath()}.
@end quotation
@end cartouche
@end deffn

Path objects expose the following features of @ref{268,,pathlib.Path}
objects:

Path objects are traversable using the @code{/} operator or @code{joinpath}.

@geindex name (zipfile.Path attribute)
@anchor{library/zipfile zipfile Path name}@anchor{2f1d}
@deffn {Attribute} Path.name

The final path component.
@end deffn

@geindex open() (zipfile.Path method)
@anchor{library/zipfile zipfile Path open}@anchor{194c}
@deffn {Method} Path.open (mode='r', *, pwd, **)

Invoke @ref{65d,,ZipFile.open()} on the current path.
Allows opening for read or write, text or binary
through supported modes: ‘r’, ‘w’, ‘rb’, ‘wb’.
Positional and keyword arguments are passed through to
@ref{9c4,,io.TextIOWrapper} when opened as text and
ignored otherwise.
@code{pwd} is the @code{pwd} parameter to
@code{ZipFile.open()}.


Changed in version 3.9: Added support for text and binary modes for open. Default
mode is now text.



Changed in version 3.11.2: The @code{encoding} parameter can be supplied as a positional argument
without causing a @ref{199,,TypeError}. As it could in 3.9. Code needing to
be compatible with unpatched 3.10 and 3.11 versions must pass all
@ref{9c4,,io.TextIOWrapper} arguments, @code{encoding} included, as keywords.

@end deffn

@geindex iterdir() (zipfile.Path method)
@anchor{library/zipfile zipfile Path iterdir}@anchor{2f1e}
@deffn {Method} Path.iterdir ()

Enumerate the children of the current directory.
@end deffn

@geindex is_dir() (zipfile.Path method)
@anchor{library/zipfile zipfile Path is_dir}@anchor{2f1f}
@deffn {Method} Path.is_dir ()

Return @code{True} if the current context references a directory.
@end deffn

@geindex is_file() (zipfile.Path method)
@anchor{library/zipfile zipfile Path is_file}@anchor{2f20}
@deffn {Method} Path.is_file ()

Return @code{True} if the current context references a file.
@end deffn

@geindex is_symlink() (zipfile.Path method)
@anchor{library/zipfile zipfile Path is_symlink}@anchor{2f21}
@deffn {Method} Path.is_symlink ()

Return @code{True} if the current context references a symbolic link.


Added in version 3.12.



Changed in version 3.13: Previously, @code{is_symlink} would unconditionally return @code{False}.

@end deffn

@geindex exists() (zipfile.Path method)
@anchor{library/zipfile zipfile Path exists}@anchor{2f22}
@deffn {Method} Path.exists ()

Return @code{True} if the current context references a file or
directory in the zip file.
@end deffn

@geindex Path.suffix (in module zipfile)
@anchor{library/zipfile zipfile Path suffix}@anchor{8d8}
@deffn {Data} Path.suffix

The last dot-separated portion of the final component, if any.
This is commonly called the file extension.


Added in version 3.11: Added @code{Path.suffix} property.

@end deffn

@geindex Path.stem (in module zipfile)
@anchor{library/zipfile zipfile Path stem}@anchor{8d7}
@deffn {Data} Path.stem

The final path component, without its suffix.


Added in version 3.11: Added @code{Path.stem} property.

@end deffn

@geindex Path.suffixes (in module zipfile)
@anchor{library/zipfile zipfile Path suffixes}@anchor{8d9}
@deffn {Data} Path.suffixes

A list of the path’s suffixes, commonly called file extensions.


Added in version 3.11: Added @code{Path.suffixes} property.

@end deffn

@geindex read_text() (zipfile.Path method)
@anchor{library/zipfile zipfile Path read_text}@anchor{1b22}
@deffn {Method} Path.read_text (*, **)

Read the current file as unicode text. Positional and
keyword arguments are passed through to
@ref{9c4,,io.TextIOWrapper} (except @code{buffer}, which is
implied by the context).


Changed in version 3.11.2: The @code{encoding} parameter can be supplied as a positional argument
without causing a @ref{199,,TypeError}. As it could in 3.9. Code needing to
be compatible with unpatched 3.10 and 3.11 versions must pass all
@ref{9c4,,io.TextIOWrapper} arguments, @code{encoding} included, as keywords.

@end deffn

@geindex read_bytes() (zipfile.Path method)
@anchor{library/zipfile zipfile Path read_bytes}@anchor{2f23}
@deffn {Method} Path.read_bytes ()

Read the current file as bytes.
@end deffn

@geindex joinpath() (zipfile.Path method)
@anchor{library/zipfile zipfile Path joinpath}@anchor{2f24}
@deffn {Method} Path.joinpath (*other)

Return a new Path object with each of the `other' arguments
joined. The following are equivalent:

@example
>>> Path(...).joinpath('child').joinpath('grandchild')
>>> Path(...).joinpath('child', 'grandchild')
>>> Path(...) / 'child' / 'grandchild'
@end example


Changed in version 3.10: Prior to 3.10, @code{joinpath} was undocumented and accepted
exactly one parameter.

@end deffn

The zipp@footnote{https://pypi.org/project/zipp/} project provides backports
of the latest path object functionality to older Pythons. Use
@code{zipp.Path} in place of @code{zipfile.Path} for early access to
changes.

@node PyZipFile objects,ZipInfo objects,Path objects,zipfile — Work with ZIP archives
@anchor{library/zipfile id3}@anchor{2f25}@anchor{library/zipfile pyzipfile-objects}@anchor{2f26}
@subsubsection PyZipFile objects


The @ref{11ff,,PyZipFile} constructor takes the same parameters as the
@ref{8d5,,ZipFile} constructor, and one additional parameter, `optimize'.

@geindex PyZipFile (class in zipfile)
@anchor{library/zipfile zipfile PyZipFile}@anchor{11ff}
@deffn {Class} zipfile.PyZipFile (file, mode='r', compression=ZIP_STORED, allowZip64=True, optimize=-1)


Changed in version 3.2: Added the `optimize' parameter.



Changed in version 3.4: ZIP64 extensions are enabled by default.


Instances have one method in addition to those of @ref{8d5,,ZipFile} objects:

@geindex writepy() (zipfile.PyZipFile method)
@anchor{library/zipfile zipfile PyZipFile writepy}@anchor{11fe}
@deffn {Method} writepy (pathname, basename='@w{'}, filterfunc=None)

Search for files @code{*.py} and add the corresponding file to the
archive.

If the `optimize' parameter to @code{PyZipFile} was not given or @code{-1},
the corresponding file is a @code{*.pyc} file, compiling if necessary.

If the `optimize' parameter to @code{PyZipFile} was @code{0}, @code{1} or
@code{2}, only files with that optimization level (see @ref{4b2,,compile()}) are
added to the archive, compiling if necessary.

If `pathname' is a file, the filename must end with @code{.py}, and
just the (corresponding @code{*.pyc}) file is added at the top level
(no path information).  If `pathname' is a file that does not end with
@code{.py}, a @ref{246,,RuntimeError} will be raised.  If it is a directory,
and the directory is not a package directory, then all the files
@code{*.pyc} are added at the top level.  If the directory is a
package directory, then all @code{*.pyc} are added under the package
name as a file path, and if any subdirectories are package directories,
all of these are added recursively in sorted order.

`basename' is intended for internal use only.

`filterfunc', if given, must be a function taking a single string
argument.  It will be passed each path (including each individual full
file path) before it is added to the archive.  If `filterfunc' returns a
false value, the path will not be added, and if it is a directory its
contents will be ignored.  For example, if our test files are all either
in @code{test} directories or start with the string @code{test_}, we can use a
`filterfunc' to exclude them:

@example
>>> zf = PyZipFile('myprog.zip')
>>> def notests(s):
...     fn = os.path.basename(s)
...     return (not (fn == 'test' or fn.startswith('test_')))
...
>>> zf.writepy('myprog', filterfunc=notests)
@end example

The @code{writepy()} method makes archives with file names like
this:

@example
string.pyc                   # Top level name
test/__init__.pyc            # Package directory
test/testall.pyc             # Module test.testall
test/bogus/__init__.pyc      # Subpackage directory
test/bogus/myfile.pyc        # Submodule test.bogus.myfile
@end example


Changed in version 3.4: Added the `filterfunc' parameter.



Changed in version 3.6.2: The `pathname' parameter accepts a @ref{5a1,,path-like object}.



Changed in version 3.7: Recursion sorts directory entries.

@end deffn
@end deffn

@node ZipInfo objects,Command-line interface<4>,PyZipFile objects,zipfile — Work with ZIP archives
@anchor{library/zipfile id4}@anchor{2f27}@anchor{library/zipfile zipinfo-objects}@anchor{2f08}
@subsubsection ZipInfo objects


Instances of the @ref{2cd,,ZipInfo} class are returned by the @ref{2f06,,getinfo()} and
@ref{2f07,,infolist()} methods of @ref{8d5,,ZipFile} objects.  Each object stores
information about a single member of the ZIP archive.

There is one classmethod to make a @ref{2cd,,ZipInfo} instance for a filesystem
file:

@geindex from_file() (zipfile.ZipInfo class method)
@anchor{library/zipfile zipfile ZipInfo from_file}@anchor{f0c}
@deffn {Method} classmethod ZipInfo.from_file (filename, arcname=None, *, strict_timestamps=True)

Construct a @ref{2cd,,ZipInfo} instance for a file on the filesystem, in
preparation for adding it to a zip file.

`filename' should be the path to a file or directory on the filesystem.

If `arcname' is specified, it is used as the name within the archive.
If `arcname' is not specified, the name will be the same as `filename', but
with any drive letter and leading path separators removed.

The `strict_timestamps' argument, when set to @code{False}, allows to
zip files older than 1980-01-01 at the cost of setting the
timestamp to 1980-01-01.
Similar behavior occurs with files newer than 2107-12-31,
the timestamp is also set to the limit.


Added in version 3.6.



Changed in version 3.6.2: The `filename' parameter accepts a @ref{5a1,,path-like object}.



Changed in version 3.8: Added the `strict_timestamps' keyword-only parameter.

@end deffn

Instances have the following methods and attributes:

@geindex is_dir() (zipfile.ZipInfo method)
@anchor{library/zipfile zipfile ZipInfo is_dir}@anchor{f0d}
@deffn {Method} ZipInfo.is_dir ()

Return @code{True} if this archive member is a directory.

This uses the entry’s name: directories should always end with @code{/}.


Added in version 3.6.

@end deffn

@geindex filename (zipfile.ZipInfo attribute)
@anchor{library/zipfile zipfile ZipInfo filename}@anchor{2f28}
@deffn {Attribute} ZipInfo.filename

Name of the file in the archive.
@end deffn

@geindex date_time (zipfile.ZipInfo attribute)
@anchor{library/zipfile zipfile ZipInfo date_time}@anchor{2f29}
@deffn {Attribute} ZipInfo.date_time

The time and date of the last modification to the archive member.  This is a
tuple of six values representing the “last [modified] file time” and “last [modified] file date”
fields from the ZIP file’s central directory.

The tuple contains:


@multitable {xxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Index

@tab

Value

@item

@code{0}

@tab

Year (>= 1980)

@item

@code{1}

@tab

Month (one-based)

@item

@code{2}

@tab

Day of month (one-based)

@item

@code{3}

@tab

Hours (zero-based)

@item

@code{4}

@tab

Minutes (zero-based)

@item

@code{5}

@tab

Seconds (zero-based)

@end multitable


@cartouche
@quotation Note 
The ZIP format supports multiple timestamp fields in different locations
(central directory, extra fields for NTFS/UNIX systems, etc.). This attribute
specifically returns the timestamp from the central directory. The central
directory timestamp format in ZIP files does not support timestamps before
1980. While some extra field formats (such as UNIX timestamps) can represent
earlier dates, this attribute only returns the central directory timestamp.

The central directory timestamp is interpreted as representing local
time, rather than UTC time, to match the behavior of other zip tools.
@end quotation
@end cartouche
@end deffn

@geindex compress_type (zipfile.ZipInfo attribute)
@anchor{library/zipfile zipfile ZipInfo compress_type}@anchor{2f2a}
@deffn {Attribute} ZipInfo.compress_type

Type of compression for the archive member.
@end deffn

@geindex comment (zipfile.ZipInfo attribute)
@anchor{library/zipfile zipfile ZipInfo comment}@anchor{2f2b}
@deffn {Attribute} ZipInfo.comment

Comment for the individual archive member as a @ref{193,,bytes} object.
@end deffn

@geindex extra (zipfile.ZipInfo attribute)
@anchor{library/zipfile zipfile ZipInfo extra}@anchor{2f2c}
@deffn {Attribute} ZipInfo.extra

Expansion field data.  The PKZIP Application Note@footnote{https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT} contains
some comments on the internal structure of the data contained in this
@ref{193,,bytes} object.
@end deffn

@geindex create_system (zipfile.ZipInfo attribute)
@anchor{library/zipfile zipfile ZipInfo create_system}@anchor{2f2d}
@deffn {Attribute} ZipInfo.create_system

System which created ZIP archive.
@end deffn

@geindex create_version (zipfile.ZipInfo attribute)
@anchor{library/zipfile zipfile ZipInfo create_version}@anchor{2f2e}
@deffn {Attribute} ZipInfo.create_version

PKZIP version which created ZIP archive.
@end deffn

@geindex extract_version (zipfile.ZipInfo attribute)
@anchor{library/zipfile zipfile ZipInfo extract_version}@anchor{2f2f}
@deffn {Attribute} ZipInfo.extract_version

PKZIP version needed to extract archive.
@end deffn

@geindex reserved (zipfile.ZipInfo attribute)
@anchor{library/zipfile zipfile ZipInfo reserved}@anchor{2f30}
@deffn {Attribute} ZipInfo.reserved

Must be zero.
@end deffn

@geindex flag_bits (zipfile.ZipInfo attribute)
@anchor{library/zipfile zipfile ZipInfo flag_bits}@anchor{2f31}
@deffn {Attribute} ZipInfo.flag_bits

ZIP flag bits.
@end deffn

@geindex volume (zipfile.ZipInfo attribute)
@anchor{library/zipfile zipfile ZipInfo volume}@anchor{2f32}
@deffn {Attribute} ZipInfo.volume

Volume number of file header.
@end deffn

@geindex internal_attr (zipfile.ZipInfo attribute)
@anchor{library/zipfile zipfile ZipInfo internal_attr}@anchor{2f33}
@deffn {Attribute} ZipInfo.internal_attr

Internal attributes.
@end deffn

@geindex external_attr (zipfile.ZipInfo attribute)
@anchor{library/zipfile zipfile ZipInfo external_attr}@anchor{2f34}
@deffn {Attribute} ZipInfo.external_attr

External file attributes.
@end deffn

@geindex header_offset (zipfile.ZipInfo attribute)
@anchor{library/zipfile zipfile ZipInfo header_offset}@anchor{2f35}
@deffn {Attribute} ZipInfo.header_offset

Byte offset to the file header.
@end deffn

@geindex CRC (zipfile.ZipInfo attribute)
@anchor{library/zipfile zipfile ZipInfo CRC}@anchor{2f36}
@deffn {Attribute} ZipInfo.CRC

CRC-32 of the uncompressed file.
@end deffn

@geindex compress_size (zipfile.ZipInfo attribute)
@anchor{library/zipfile zipfile ZipInfo compress_size}@anchor{2f37}
@deffn {Attribute} ZipInfo.compress_size

Size of the compressed data.
@end deffn

@geindex file_size (zipfile.ZipInfo attribute)
@anchor{library/zipfile zipfile ZipInfo file_size}@anchor{2f11}
@deffn {Attribute} ZipInfo.file_size

Size of the uncompressed file.
@end deffn

@node Command-line interface<4>,Decompression pitfalls,ZipInfo objects,zipfile — Work with ZIP archives
@anchor{library/zipfile command-line-interface}@anchor{2f38}@anchor{library/zipfile zipfile-commandline}@anchor{2f39}
@subsubsection Command-line interface


The @code{zipfile} module provides a simple command-line interface to interact
with ZIP archives.

If you want to create a new ZIP archive, specify its name after the @ref{2f3a,,-c}
option and then list the filename(s) that should be included:

@example
$ python -m zipfile -c monty.zip spam.txt eggs.txt
@end example

Passing a directory is also acceptable:

@example
$ python -m zipfile -c monty.zip life-of-brian_1979/
@end example

If you want to extract a ZIP archive into the specified directory, use
the @ref{2f3b,,-e} option:

@example
$ python -m zipfile -e monty.zip target-dir/
@end example

For a list of the files in a ZIP archive, use the @ref{2f3c,,-l} option:

@example
$ python -m zipfile -l monty.zip
@end example

@menu
* Command-line options: Command-line options<2>. 

@end menu

@node Command-line options<2>,,,Command-line interface<4>
@anchor{library/zipfile command-line-options}@anchor{2f3d}
@subsubsection Command-line options


@geindex zipfile command line option; -l
@geindex zipfile command line option; --list
@anchor{library/zipfile cmdoption-zipfile-l}@anchor{2f3c}
@deffn {Option} @w{-}l <zipfile>
@anchor{library/zipfile cmdoption-zipfile-list}@anchor{2f3e}
@deffnx {Option} @w{-}@w{-}list <zipfile>

List files in a zipfile.
@end deffn

@geindex zipfile command line option; -c
@geindex zipfile command line option; --create
@anchor{library/zipfile cmdoption-zipfile-c}@anchor{2f3a}
@deffn {Option} @w{-}c <zipfile> <source1> ... <sourceN>
@anchor{library/zipfile cmdoption-zipfile-create}@anchor{2f3f}
@deffnx {Option} @w{-}@w{-}create <zipfile> <source1> ... <sourceN>

Create zipfile from source files.
@end deffn

@geindex zipfile command line option; -e
@geindex zipfile command line option; --extract
@anchor{library/zipfile cmdoption-zipfile-e}@anchor{2f3b}
@deffn {Option} @w{-}e <zipfile> <output_dir>
@anchor{library/zipfile cmdoption-zipfile-extract}@anchor{2f40}
@deffnx {Option} @w{-}@w{-}extract <zipfile> <output_dir>

Extract zipfile into target directory.
@end deffn

@geindex zipfile command line option; -t
@geindex zipfile command line option; --test
@anchor{library/zipfile cmdoption-zipfile-t}@anchor{2f41}
@deffn {Option} @w{-}t <zipfile>
@anchor{library/zipfile cmdoption-zipfile-test}@anchor{2f42}
@deffnx {Option} @w{-}@w{-}test <zipfile>

Test whether the zipfile is valid or not.
@end deffn

@geindex zipfile command line option; --metadata-encoding
@anchor{library/zipfile cmdoption-zipfile-metadata-encoding}@anchor{2f43}
@deffn {Option} @w{-}@w{-}metadata@w{-}encoding <encoding>

Specify encoding of member names for @ref{2f3c,,-l}, @ref{2f3b,,-e} and
@ref{2f41,,-t}.


Added in version 3.11.

@end deffn

@node Decompression pitfalls,,Command-line interface<4>,zipfile — Work with ZIP archives
@anchor{library/zipfile decompression-pitfalls}@anchor{2f44}
@subsubsection Decompression pitfalls


The extraction in zipfile module might fail due to some pitfalls listed below.

@menu
* From file itself:: 
* File system limitations:: 
* Resources limitations:: 
* Interruption:: 
* Default behaviors of extraction:: 

@end menu

@node From file itself,File system limitations,,Decompression pitfalls
@anchor{library/zipfile from-file-itself}@anchor{2f45}
@subsubsection From file itself


Decompression may fail due to incorrect password / CRC checksum / ZIP format or
unsupported compression method / decryption.

@node File system limitations,Resources limitations,From file itself,Decompression pitfalls
@anchor{library/zipfile file-system-limitations}@anchor{2f46}
@subsubsection File system limitations


Exceeding limitations on different file systems can cause decompression failed.
Such as allowable characters in the directory entries, length of the file name,
length of the pathname, size of a single file, and number of files, etc.

@node Resources limitations,Interruption,File system limitations,Decompression pitfalls
@anchor{library/zipfile resources-limitations}@anchor{2f47}@anchor{library/zipfile zipfile-resources-limitations}@anchor{2f48}
@subsubsection Resources limitations


The lack of memory or disk volume would lead to decompression
failed. For example, decompression bombs (aka ZIP bomb@footnote{https://en.wikipedia.org/wiki/Zip_bomb})
apply to zipfile library that can cause disk volume exhaustion.

@node Interruption,Default behaviors of extraction,Resources limitations,Decompression pitfalls
@anchor{library/zipfile interruption}@anchor{2f49}
@subsubsection Interruption


Interruption during the decompression, such as pressing control-C or killing the
decompression process may result in incomplete decompression of the archive.

@node Default behaviors of extraction,,Interruption,Decompression pitfalls
@anchor{library/zipfile default-behaviors-of-extraction}@anchor{2f4a}
@subsubsection Default behaviors of extraction


Not knowing the default extraction behaviors
can cause unexpected decompression results.
For example, when extracting the same archive twice,
it overwrites files without asking.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node tarfile — Read and write tar archive files,,zipfile — Work with ZIP archives,Data Compression and Archiving
@anchor{library/tarfile doc}@anchor{2f4b}@anchor{library/tarfile module-tarfile}@anchor{e4}@anchor{library/tarfile tarfile-read-and-write-tar-archive-files}@anchor{2f4c}@anchor{library/tarfile translation-repo}@anchor{2f4d}
@subsection @code{tarfile} — Read and write tar archive files


@geindex module; tarfile

`Source code:' Lib/tarfile.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/tarfile.py}


__________________________________________________________________


The @code{tarfile} module makes it possible to read and write tar
archives, including those using gzip, bz2 and lzma compression.
Use the @ref{138,,zipfile} module to read or write @code{.zip} files, or the
higher-level functions in @ref{1424,,shutil}.

Some facts and figures:


@itemize *

@item 
reads and writes @ref{6b,,gzip}, @ref{14,,bz2}, @ref{23,,compression.zstd}, and
@ref{8e,,lzma} compressed archives if the respective modules are available.

@c The following paragraph should be similar to ../includes/optional-module.rst

If any of these @ref{219c,,optional modules} are missing from
your copy of CPython, look for documentation from your distributor (that is,
whoever provided Python to you).
If you are the distributor, see @ref{219a,,Requirements for optional modules}.

@item 
read/write support for the POSIX.1-1988 (ustar) format.

@item 
read/write support for the GNU tar format including `longname' and `longlink'
extensions, read-only support for all variants of the `sparse' extension
including restoration of sparse files.

@item 
read/write support for the POSIX.1-2001 (pax) format.

@item 
handles directories, regular files, hardlinks, symbolic links, fifos,
character devices and block devices and is able to acquire and restore file
information like timestamp, access permissions and owner.
@end itemize


Changed in version 3.3: Added support for @ref{8e,,lzma} compression.



Changed in version 3.12: Archives are extracted using a @ref{698,,filter},
which makes it possible to either limit surprising/dangerous features,
or to acknowledge that they are expected and the archive is fully trusted.



Changed in version 3.14: Set the default extraction filter to @ref{29c,,data},
which disallows some dangerous features such as links to absolute paths
or paths outside of the destination. Previously, the filter strategy
was equivalent to @ref{2f4e,,fully_trusted}.



Changed in version 3.14: Added support for Zstandard compression using @ref{23,,compression.zstd}.


@geindex open() (in module tarfile)
@anchor{library/tarfile tarfile open}@anchor{107d}
@deffn {Function} tarfile.open (name=None, mode='r', fileobj=None, bufsize=10240, **kwargs)

Return a @ref{141c,,TarFile} object for the pathname `name'. For detailed
information on @code{TarFile} objects and the keyword arguments that are
allowed, see @ref{2f4f,,TarFile Objects}.

`mode' has to be a string of the form @code{'filemode[:compression]'}, it defaults
to @code{'r'}. Here is a full list of mode combinations:


@multitable {xxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

mode

@tab

action

@item

@code{'r'} or
@code{'r:*'}

@tab

Open for reading with transparent
compression (recommended).

@item

@code{'r:'}

@tab

Open for reading exclusively without
compression.

@item

@code{'r:gz'}

@tab

Open for reading with gzip compression.

@item

@code{'r:bz2'}

@tab

Open for reading with bzip2 compression.

@item

@code{'r:xz'}

@tab

Open for reading with lzma compression.

@item

@code{'r:zst'}

@tab

Open for reading with Zstandard compression.

@item

@code{'x'} or
@code{'x:'}

@tab

Create a tarfile exclusively without
compression.
Raise a @ref{1226,,FileExistsError} exception
if it already exists.

@item

@code{'x:gz'}

@tab

Create a tarfile with gzip compression.
Raise a @ref{1226,,FileExistsError} exception
if it already exists.

@item

@code{'x:bz2'}

@tab

Create a tarfile with bzip2 compression.
Raise a @ref{1226,,FileExistsError} exception
if it already exists.

@item

@code{'x:xz'}

@tab

Create a tarfile with lzma compression.
Raise a @ref{1226,,FileExistsError} exception
if it already exists.

@item

@code{'x:zst'}

@tab

Create a tarfile with Zstandard compression.
Raise a @ref{1226,,FileExistsError} exception
if it already exists.

@item

@code{'a'} or
@code{'a:'}

@tab

Open for appending with no compression. The
file is created if it does not exist.

@item

@code{'w'} or
@code{'w:'}

@tab

Open for uncompressed writing.

@item

@code{'w:gz'}

@tab

Open for gzip compressed writing.

@item

@code{'w:bz2'}

@tab

Open for bzip2 compressed writing.

@item

@code{'w:xz'}

@tab

Open for lzma compressed writing.

@item

@code{'w:zst'}

@tab

Open for Zstandard compressed writing.

@end multitable


Note that @code{'a:gz'}, @code{'a:bz2'} or @code{'a:xz'} is not possible. If `mode'
is not suitable to open a certain (compressed) file for reading,
@ref{1c92,,ReadError} is raised. Use `mode' @code{'r'} to avoid this.  If a
compression method is not supported, @ref{2f50,,CompressionError} is raised.

If `fileobj' is specified, it is used as an alternative to a @ref{13cf,,file object}
opened in binary mode for `name'. It is supposed to be at position 0.

For modes @code{'w:gz'}, @code{'x:gz'}, @code{'w|gz'}, @code{'w:bz2'}, @code{'x:bz2'},
@code{'w|bz2'}, @code{tarfile.open()} accepts the keyword argument
`compresslevel' (default @code{9}) to specify the compression level of the file.

For modes @code{'w:xz'}, @code{'x:xz'} and @code{'w|xz'}, @code{tarfile.open()} accepts the
keyword argument `preset' to specify the compression level of the file.

For modes @code{'w:zst'}, @code{'x:zst'} and @code{'w|zst'}, @code{tarfile.open()}
accepts the keyword argument `level' to specify the compression level of
the file. The keyword argument `options' may also be passed, providing
advanced Zstandard compression parameters described by
@ref{2e55,,CompressionParameter}. The keyword argument
`zstd_dict' can be passed to provide a @ref{2e54,,ZstdDict},
a Zstandard dictionary used to improve compression of smaller amounts of
data.

For special purposes, there is a second format for `mode':
@code{'filemode|[compression]'}.  @code{tarfile.open()} will return a @ref{141c,,TarFile}
object that processes its data as a stream of blocks.  No random seeking will
be done on the file. If given, `fileobj' may be any object that has a
@ref{1023,,read()} or @ref{15b7,,write()} method
(depending on the `mode') that works with bytes.
`bufsize' specifies the blocksize and defaults to @code{20 * 512} bytes.
Use this variant in combination with e.g. @code{sys.stdin.buffer}, a socket
@ref{13cf,,file object} or a tape device.
However, such a @code{TarFile} object is limited in that it does
not allow random access, see @ref{2f51,,Examples}.  The currently
possible modes:


@multitable {xxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Mode

@tab

Action

@item

@code{'r|*'}

@tab

Open a `stream' of tar blocks for reading
with transparent compression.

@item

@code{'r|'}

@tab

Open a `stream' of uncompressed tar blocks
for reading.

@item

@code{'r|gz'}

@tab

Open a gzip compressed `stream' for
reading.

@item

@code{'r|bz2'}

@tab

Open a bzip2 compressed `stream' for
reading.

@item

@code{'r|xz'}

@tab

Open an lzma compressed `stream' for
reading.

@item

@code{'r|zst'}

@tab

Open a Zstandard compressed `stream' for
reading.

@item

@code{'w|'}

@tab

Open an uncompressed `stream' for writing.

@item

@code{'w|gz'}

@tab

Open a gzip compressed `stream' for
writing.

@item

@code{'w|bz2'}

@tab

Open a bzip2 compressed `stream' for
writing.

@item

@code{'w|xz'}

@tab

Open an lzma compressed `stream' for
writing.

@item

@code{'w|zst'}

@tab

Open a Zstandard compressed `stream' for
writing.

@end multitable



Changed in version 3.5: The @code{'x'} (exclusive creation) mode was added.



Changed in version 3.6: The `name' parameter accepts a @ref{5a1,,path-like object}.



Changed in version 3.12: The `compresslevel' keyword argument also works for streams.



Changed in version 3.14: The `preset' keyword argument also works for streams.

@end deffn


@deffn {Class} tarfile.TarFile

Class for reading and writing tar archives. Do not use this class directly:
use @ref{107d,,tarfile.open()} instead. See @ref{2f4f,,TarFile Objects}.
@end deffn

@geindex is_tarfile() (in module tarfile)
@anchor{library/tarfile tarfile is_tarfile}@anchor{1c1e}
@deffn {Function} tarfile.is_tarfile (name)

Return @ref{e0d,,True} if `name' is a tar archive file, that the @code{tarfile}
module can read. `name' may be a @ref{16a,,str}, file, or file-like object.


Changed in version 3.9: Support for file and file-like objects.

@end deffn

The @code{tarfile} module defines the following exceptions:

@geindex TarError
@anchor{library/tarfile tarfile TarError}@anchor{2f52}
@deffn {Exception} tarfile.TarError

Base class for all @code{tarfile} exceptions.
@end deffn

@geindex ReadError
@anchor{library/tarfile tarfile ReadError}@anchor{1c92}
@deffn {Exception} tarfile.ReadError

Is raised when a tar archive is opened, that either cannot be handled by the
@code{tarfile} module or is somehow invalid.
@end deffn

@geindex CompressionError
@anchor{library/tarfile tarfile CompressionError}@anchor{2f50}
@deffn {Exception} tarfile.CompressionError

Is raised when a compression method is not supported or when the data cannot be
decoded properly.
@end deffn

@geindex StreamError
@anchor{library/tarfile tarfile StreamError}@anchor{2f53}
@deffn {Exception} tarfile.StreamError

Is raised for the limitations that are typical for stream-like @ref{141c,,TarFile}
objects.
@end deffn

@geindex ExtractError
@anchor{library/tarfile tarfile ExtractError}@anchor{2f54}
@deffn {Exception} tarfile.ExtractError

Is raised for `non-fatal' errors when using @ref{29e,,TarFile.extract()}, but only if
@ref{2a0,,TarFile.errorlevel}@code{== 2}.
@end deffn

@geindex HeaderError
@anchor{library/tarfile tarfile HeaderError}@anchor{2f55}
@deffn {Exception} tarfile.HeaderError

Is raised by @ref{2f56,,TarInfo.frombuf()} if the buffer it gets is invalid.
@end deffn

@geindex FilterError
@anchor{library/tarfile tarfile FilterError}@anchor{2f57}
@deffn {Exception} tarfile.FilterError

Base class for members @ref{2f58,,refused} by
filters.

@geindex tarinfo (tarfile.FilterError attribute)
@anchor{library/tarfile tarfile FilterError tarinfo}@anchor{2f59}
@deffn {Attribute} tarinfo

Information about the member that the filter refused to extract,
as @ref{2f5a,,TarInfo}.
@end deffn
@end deffn

@geindex AbsolutePathError
@anchor{library/tarfile tarfile AbsolutePathError}@anchor{2f5b}
@deffn {Exception} tarfile.AbsolutePathError

Raised to refuse extracting a member with an absolute path.
@end deffn

@geindex OutsideDestinationError
@anchor{library/tarfile tarfile OutsideDestinationError}@anchor{2f5c}
@deffn {Exception} tarfile.OutsideDestinationError

Raised to refuse extracting a member outside the destination directory.
@end deffn

@geindex SpecialFileError
@anchor{library/tarfile tarfile SpecialFileError}@anchor{2f5d}
@deffn {Exception} tarfile.SpecialFileError

Raised to refuse extracting a special file (e.g. a device or pipe).
@end deffn

@geindex AbsoluteLinkError
@anchor{library/tarfile tarfile AbsoluteLinkError}@anchor{2f5e}
@deffn {Exception} tarfile.AbsoluteLinkError

Raised to refuse extracting a symbolic link with an absolute path.
@end deffn

@geindex LinkOutsideDestinationError
@anchor{library/tarfile tarfile LinkOutsideDestinationError}@anchor{2f5f}
@deffn {Exception} tarfile.LinkOutsideDestinationError

Raised to refuse extracting a symbolic link pointing outside the destination
directory.
@end deffn

@geindex LinkFallbackError
@anchor{library/tarfile tarfile LinkFallbackError}@anchor{29f}
@deffn {Exception} tarfile.LinkFallbackError

Raised to refuse emulating a link (hard or symbolic) by extracting another
archive member, when that member would be rejected by the filter location.
The exception that was raised to reject the replacement member is available
as @code{BaseException.__context__}.


Added in version 3.14.

@end deffn

The following constants are available at the module level:

@geindex ENCODING (in module tarfile)
@anchor{library/tarfile tarfile ENCODING}@anchor{2f60}
@deffn {Data} tarfile.ENCODING

The default character encoding: @code{'utf-8'} on Windows, the value returned by
@ref{e59,,sys.getfilesystemencoding()} otherwise.
@end deffn

@geindex REGTYPE (in module tarfile)
@geindex AREGTYPE (in module tarfile)
@anchor{library/tarfile tarfile REGTYPE}@anchor{2f61}
@deffn {Data} tarfile.REGTYPE
@anchor{library/tarfile tarfile AREGTYPE}@anchor{2f62}
@deffnx {Data} tarfile.AREGTYPE

A regular file @ref{2f63,,type}.
@end deffn

@geindex LNKTYPE (in module tarfile)
@anchor{library/tarfile tarfile LNKTYPE}@anchor{2f64}
@deffn {Data} tarfile.LNKTYPE

A link (inside tarfile) @ref{2f63,,type}.
@end deffn

@geindex SYMTYPE (in module tarfile)
@anchor{library/tarfile tarfile SYMTYPE}@anchor{2f65}
@deffn {Data} tarfile.SYMTYPE

A symbolic link @ref{2f63,,type}.
@end deffn

@geindex CHRTYPE (in module tarfile)
@anchor{library/tarfile tarfile CHRTYPE}@anchor{2f66}
@deffn {Data} tarfile.CHRTYPE

A character special device @ref{2f63,,type}.
@end deffn

@geindex BLKTYPE (in module tarfile)
@anchor{library/tarfile tarfile BLKTYPE}@anchor{2f67}
@deffn {Data} tarfile.BLKTYPE

A block special device @ref{2f63,,type}.
@end deffn

@geindex DIRTYPE (in module tarfile)
@anchor{library/tarfile tarfile DIRTYPE}@anchor{2f68}
@deffn {Data} tarfile.DIRTYPE

A directory @ref{2f63,,type}.
@end deffn

@geindex FIFOTYPE (in module tarfile)
@anchor{library/tarfile tarfile FIFOTYPE}@anchor{2f69}
@deffn {Data} tarfile.FIFOTYPE

A FIFO special device @ref{2f63,,type}.
@end deffn

@geindex CONTTYPE (in module tarfile)
@anchor{library/tarfile tarfile CONTTYPE}@anchor{2f6a}
@deffn {Data} tarfile.CONTTYPE

A contiguous file @ref{2f63,,type}.
@end deffn

@geindex GNUTYPE_LONGNAME (in module tarfile)
@anchor{library/tarfile tarfile GNUTYPE_LONGNAME}@anchor{2f6b}
@deffn {Data} tarfile.GNUTYPE_LONGNAME

A GNU tar longname @ref{2f63,,type}.
@end deffn

@geindex GNUTYPE_LONGLINK (in module tarfile)
@anchor{library/tarfile tarfile GNUTYPE_LONGLINK}@anchor{2f6c}
@deffn {Data} tarfile.GNUTYPE_LONGLINK

A GNU tar longlink @ref{2f63,,type}.
@end deffn

@geindex GNUTYPE_SPARSE (in module tarfile)
@anchor{library/tarfile tarfile GNUTYPE_SPARSE}@anchor{2f6d}
@deffn {Data} tarfile.GNUTYPE_SPARSE

A GNU tar sparse file @ref{2f63,,type}.
@end deffn

Each of the following constants defines a tar archive format that the
@code{tarfile} module is able to create. See section @ref{2f6e,,Supported tar formats} for
details.

@geindex USTAR_FORMAT (in module tarfile)
@anchor{library/tarfile tarfile USTAR_FORMAT}@anchor{2f6f}
@deffn {Data} tarfile.USTAR_FORMAT

POSIX.1-1988 (ustar) format.
@end deffn

@geindex GNU_FORMAT (in module tarfile)
@anchor{library/tarfile tarfile GNU_FORMAT}@anchor{2f70}
@deffn {Data} tarfile.GNU_FORMAT

GNU tar format.
@end deffn

@geindex PAX_FORMAT (in module tarfile)
@anchor{library/tarfile tarfile PAX_FORMAT}@anchor{2f71}
@deffn {Data} tarfile.PAX_FORMAT

POSIX.1-2001 (pax) format.
@end deffn

@geindex DEFAULT_FORMAT (in module tarfile)
@anchor{library/tarfile tarfile DEFAULT_FORMAT}@anchor{2f72}
@deffn {Data} tarfile.DEFAULT_FORMAT

The default format for creating archives. This is currently @ref{2f71,,PAX_FORMAT}.


Changed in version 3.8: The default format for new archives was changed to
@ref{2f71,,PAX_FORMAT} from @ref{2f70,,GNU_FORMAT}.

@end deffn


@subsubheading See also



@table @asis

@item Module @ref{138,,zipfile}

Documentation of the @ref{138,,zipfile} standard module.

@item @ref{1424,,Archiving operations}

Documentation of the higher-level archiving facilities provided by the
standard @ref{ca,,shutil} module.

@item GNU tar manual@comma{} Basic Tar Format@footnote{https://www.gnu.org/software/tar/manual/html_node/Standard.html}

Documentation for tar archive files, including GNU tar extensions.
@end table


@menu
* TarFile Objects:: 
* TarInfo Objects:: 
* Extraction filters:: 
* Command-Line Interface:: 
* Examples: Examples<10>. 
* Supported tar formats:: 
* Unicode issues:: 

@end menu

@node TarFile Objects,TarInfo Objects,,tarfile — Read and write tar archive files
@anchor{library/tarfile id1}@anchor{2f73}@anchor{library/tarfile tarfile-objects}@anchor{2f4f}
@subsubsection TarFile Objects


The @ref{141c,,TarFile} object provides an interface to a tar archive. A tar
archive is a sequence of blocks. An archive member (a stored file) is made up of
a header block followed by data blocks. It is possible to store a file in a tar
archive several times. Each archive member is represented by a @ref{141d,,TarInfo}
object, see @ref{2f5a,,TarInfo Objects} for details.

A @ref{141c,,TarFile} object can be used as a context manager in a @ref{187,,with}
statement. It will automatically be closed when the block is completed. Please
note that in the event of an exception an archive opened for writing will not
be finalized; only the internally used file object will be closed. See the
@ref{2f51,,Examples} section for a use case.


Added in version 3.2: Added support for the context management protocol.


@geindex TarFile (class in tarfile)
@anchor{library/tarfile tarfile TarFile}@anchor{141c}
@deffn {Class} tarfile.TarFile (name=None, mode='r', fileobj=None, format=DEFAULT_FORMAT, tarinfo=TarInfo, dereference=False, ignore_zeros=False, encoding=ENCODING, errors='surrogateescape', pax_headers=None, debug=0, errorlevel=1, stream=False)

All following arguments are optional and can be accessed as instance attributes
as well.

`name' is the pathname of the archive. `name' may be a @ref{5a1,,path-like object}.
It can be omitted if `fileobj' is given.
In this case, the file object’s @code{name} attribute is used if it exists.

`mode' is either @code{'r'} to read from an existing archive, @code{'a'} to append
data to an existing file, @code{'w'} to create a new file overwriting an existing
one, or @code{'x'} to create a new file only if it does not already exist.

If `fileobj' is given, it is used for reading or writing data. If it can be
determined, `mode' is overridden by `fileobj'’s mode. `fileobj' will be used
from position 0.

@cartouche
@quotation Note 
`fileobj' is not closed, when @code{TarFile} is closed.
@end quotation
@end cartouche

`format' controls the archive format for writing. It must be one of the constants
@ref{2f6f,,USTAR_FORMAT}, @ref{2f70,,GNU_FORMAT} or @ref{2f71,,PAX_FORMAT} that are
defined at module level. When reading, format will be automatically detected, even
if different formats are present in a single archive.

The `tarinfo' argument can be used to replace the default @ref{141d,,TarInfo} class
with a different one.

If `dereference' is @ref{d31,,False}, add symbolic and hard links to the archive. If it
is @ref{e0d,,True}, add the content of the target files to the archive. This has no
effect on systems that do not support symbolic links.

If `ignore_zeros' is @ref{d31,,False}, treat an empty block as the end of the archive.
If it is @ref{e0d,,True}, skip empty (and invalid) blocks and try to get as many members
as possible. This is only useful for reading concatenated or damaged archives.

`debug' can be set from @code{0} (no debug messages) up to @code{3} (all debug
messages). The messages are written to @code{sys.stderr}.

`errorlevel' controls how extraction errors are handled,
see @ref{2a0,,the corresponding attribute}.

The `encoding' and `errors' arguments define the character encoding to be
used for reading or writing the archive and how conversion errors are going
to be handled. The default settings will work for most users.
See section @ref{2f74,,Unicode issues} for in-depth information.

The `pax_headers' argument is an optional dictionary of strings which
will be added as a pax global header if `format' is @ref{2f71,,PAX_FORMAT}.

If `stream' is set to @ref{e0d,,True} then while reading the archive info about files
in the archive are not cached, saving memory.


Changed in version 3.2: Use @code{'surrogateescape'} as the default for the `errors' argument.



Changed in version 3.5: The @code{'x'} (exclusive creation) mode was added.



Changed in version 3.6: The `name' parameter accepts a @ref{5a1,,path-like object}.



Changed in version 3.13: Add the `stream' parameter.

@end deffn

@geindex open() (tarfile.TarFile class method)
@anchor{library/tarfile tarfile TarFile open}@anchor{1c1f}
@deffn {Method} classmethod TarFile.open (...)

Alternative constructor. The @ref{107d,,tarfile.open()} function is actually a
shortcut to this classmethod.
@end deffn

@geindex getmember() (tarfile.TarFile method)
@anchor{library/tarfile tarfile TarFile getmember}@anchor{1c33}
@deffn {Method} TarFile.getmember (name)

Return a @ref{141d,,TarInfo} object for member `name'. If `name' can not be found
in the archive, @ref{5e7,,KeyError} is raised.

@cartouche
@quotation Note 
If a member occurs more than once in the archive, its last occurrence is assumed
to be the most up-to-date version.
@end quotation
@end cartouche
@end deffn

@geindex getmembers() (tarfile.TarFile method)
@anchor{library/tarfile tarfile TarFile getmembers}@anchor{107f}
@deffn {Method} TarFile.getmembers ()

Return the members of the archive as a list of @ref{141d,,TarInfo} objects. The
list has the same order as the members in the archive.
@end deffn

@geindex getnames() (tarfile.TarFile method)
@anchor{library/tarfile tarfile TarFile getnames}@anchor{2f75}
@deffn {Method} TarFile.getnames ()

Return the members as a list of their names. It has the same order as the list
returned by @ref{107f,,getmembers()}.
@end deffn

@geindex list() (tarfile.TarFile method)
@anchor{library/tarfile tarfile TarFile list}@anchor{107e}
@deffn {Method} TarFile.list (verbose=True, *, members=None)

Print a table of contents to @code{sys.stdout}. If `verbose' is @ref{d31,,False},
only the names of the members are printed. If it is @ref{e0d,,True}, output
similar to that of @code{ls -l} is produced. If optional `members' is
given, it must be a subset of the list returned by @ref{107f,,getmembers()}.


Changed in version 3.5: Added the `members' parameter.

@end deffn

@geindex next() (tarfile.TarFile method)
@anchor{library/tarfile tarfile TarFile next}@anchor{2f76}
@deffn {Method} TarFile.next ()

Return the next member of the archive as a @ref{141d,,TarInfo} object, when
@ref{141c,,TarFile} is opened for reading. Return @ref{887,,None} if there is no more
available.
@end deffn

@geindex extractall() (tarfile.TarFile method)
@anchor{library/tarfile tarfile TarFile extractall}@anchor{29d}
@deffn {Method} TarFile.extractall (path='.', members=None, *, numeric_owner=False, filter=None)

Extract all members from the archive to the current working directory or
directory `path'. If optional `members' is given, it must be a subset of the
list returned by @ref{107f,,getmembers()}. Directory information like owner,
modification time and permissions are set after all members have been extracted.
This is done to work around two problems: A directory’s modification time is
reset each time a file is created in it. And, if a directory’s permissions do
not allow writing, extracting files to it will fail.

If `numeric_owner' is @ref{e0d,,True}, the uid and gid numbers from the tarfile
are used to set the owner/group for the extracted files. Otherwise, the named
values from the tarfile are used.

The `filter' argument specifies how @code{members} are modified or rejected
before extraction.
See @ref{698,,Extraction filters} for details.
It is recommended to set this explicitly only if specific `tar' features
are required, or as @code{filter='data'} to support Python versions with a less
secure default (3.13 and lower).

@cartouche
@quotation Warning 
Never extract archives from untrusted sources without prior inspection.

Since Python 3.14, the default (@ref{29c,,data}) will prevent
the most dangerous security issues.
However, it will not prevent `all' unintended or insecure behavior.
Read the @ref{698,,Extraction filters} section for details.
@end quotation
@end cartouche


Changed in version 3.5: Added the `numeric_owner' parameter.



Changed in version 3.6: The `path' parameter accepts a @ref{5a1,,path-like object}.



Changed in version 3.12: Added the `filter' parameter.



Changed in version 3.14: The `filter' parameter now defaults to @code{'data'}.

@end deffn

@geindex extract() (tarfile.TarFile method)
@anchor{library/tarfile tarfile TarFile extract}@anchor{29e}
@deffn {Method} TarFile.extract (member, path='@w{'}, set_attrs=True, *, numeric_owner=False, filter=None)

Extract a member from the archive to the current working directory, using its
full name. Its file information is extracted as accurately as possible. `member'
may be a filename or a @ref{141d,,TarInfo} object. You can specify a different
directory using `path'. `path' may be a @ref{5a1,,path-like object}.
File attributes (owner, mtime, mode) are set unless `set_attrs' is false.

The `numeric_owner' and `filter' arguments are the same as
for @ref{29d,,extractall()}.

@cartouche
@quotation Note 
The @code{extract()} method does not take care of several extraction issues.
In most cases you should consider using the @ref{29d,,extractall()} method.
@end quotation
@end cartouche

@cartouche
@quotation Warning 
Never extract archives from untrusted sources without prior inspection.
See the warning for @ref{29d,,extractall()} for details.
@end quotation
@end cartouche


Changed in version 3.2: Added the `set_attrs' parameter.



Changed in version 3.5: Added the `numeric_owner' parameter.



Changed in version 3.6: The `path' parameter accepts a @ref{5a1,,path-like object}.



Changed in version 3.12: Added the `filter' parameter.

@end deffn

@geindex extractfile() (tarfile.TarFile method)
@anchor{library/tarfile tarfile TarFile extractfile}@anchor{2f77}
@deffn {Method} TarFile.extractfile (member)

Extract a member from the archive as a file object. `member' may be
a filename or a @ref{141d,,TarInfo} object. If `member' is a regular file or
a link, an @ref{141a,,io.BufferedReader} object is returned. For all other
existing members, @ref{887,,None} is returned. If `member' does not appear
in the archive, @ref{5e7,,KeyError} is raised.


Changed in version 3.3: Return an @ref{141a,,io.BufferedReader} object.



Changed in version 3.13: The returned @ref{141a,,io.BufferedReader} object has the @code{mode}
attribute which is always equal to @code{'rb'}.

@end deffn

@geindex errorlevel (tarfile.TarFile attribute)
@anchor{library/tarfile tarfile TarFile errorlevel}@anchor{2a0}
@deffn {Attribute} TarFile.errorlevel: @ref{19c,,int}

If `errorlevel' is @code{0}, errors are ignored when using @ref{29e,,TarFile.extract()}
and @ref{29d,,TarFile.extractall()}.
Nevertheless, they appear as error messages in the debug output when
`debug' is greater than 0.
If @code{1} (the default), all `fatal' errors are raised as @ref{2c2,,OSError} or
@ref{2f57,,FilterError} exceptions. If @code{2}, all `non-fatal' errors are raised
as @ref{2f52,,TarError} exceptions as well.

Some exceptions, e.g. ones caused by wrong argument types or data
corruption, are always raised.

Custom @ref{698,,extraction filters}
should raise @ref{2f57,,FilterError} for `fatal' errors
and @ref{2f54,,ExtractError} for `non-fatal' ones.

Note that when an exception is raised, the archive may be partially
extracted. It is the user’s responsibility to clean up.
@end deffn

@geindex extraction_filter (tarfile.TarFile attribute)
@anchor{library/tarfile tarfile TarFile extraction_filter}@anchor{2f78}
@deffn {Attribute} TarFile.extraction_filter


Added in version 3.12.


The @ref{698,,extraction filter} used
as a default for the `filter' argument of @ref{29e,,extract()}
and @ref{29d,,extractall()}.

The attribute may be @code{None} or a callable.
String names are not allowed for this attribute, unlike the `filter'
argument to @ref{29e,,extract()}.

If @code{extraction_filter} is @code{None} (the default), extraction methods
will use the @ref{29c,,data} filter by default.

The attribute may be set on instances or overridden in subclasses.
It also is possible to set it on the @code{TarFile} class itself to set a
global default, although, since it affects all uses of `tarfile',
it is best practice to only do so in top-level applications or
@ref{cc,,site configuration}.
To set a global default this way, a filter function needs to be wrapped in
@ref{451,,staticmethod()} to prevent injection of a @code{self} argument.


Changed in version 3.14: The default filter is set to @ref{29c,,data},
which disallows some dangerous features such as links to absolute paths
or paths outside of the destination.
Previously, the default was equivalent to
@ref{2f4e,,fully_trusted}.

@end deffn

@geindex add() (tarfile.TarFile method)
@anchor{library/tarfile tarfile TarFile add}@anchor{df4}
@deffn {Method} TarFile.add (name, arcname=None, recursive=True, *, filter=None)

Add the file `name' to the archive. `name' may be any type of file
(directory, fifo, symbolic link, etc.). If given, `arcname' specifies an
alternative name for the file in the archive. Directories are added
recursively by default. This can be avoided by setting `recursive' to
@ref{d31,,False}. Recursion adds entries in sorted order.
If `filter' is given, it
should be a function that takes a @ref{141d,,TarInfo} object argument and
returns the changed @code{TarInfo} object. If it instead returns
@ref{887,,None} the @code{TarInfo} object will be excluded from the
archive. See @ref{2f51,,Examples} for an example.


Changed in version 3.2: Added the `filter' parameter.



Changed in version 3.7: Recursion adds entries in sorted order.

@end deffn

@geindex addfile() (tarfile.TarFile method)
@anchor{library/tarfile tarfile TarFile addfile}@anchor{19e9}
@deffn {Method} TarFile.addfile (tarinfo, fileobj=None)

Add the @ref{141d,,TarInfo} object `tarinfo' to the archive. If `tarinfo' represents
a non zero-size regular file, the `fileobj' argument should be a @ref{20b2,,binary file},
and @code{tarinfo.size} bytes are read from it and added to the archive.  You can
create @code{TarInfo} objects directly, or by using @ref{2f79,,gettarinfo()}.


Changed in version 3.13: `fileobj' must be given for non-zero-sized regular files.

@end deffn

@geindex gettarinfo() (tarfile.TarFile method)
@anchor{library/tarfile tarfile TarFile gettarinfo}@anchor{2f79}
@deffn {Method} TarFile.gettarinfo (name=None, arcname=None, fileobj=None)

Create a @ref{141d,,TarInfo} object from the result of @ref{26f,,os.stat()} or
equivalent on an existing file.  The file is either named by `name', or
specified as a @ref{13cf,,file object} `fileobj' with a file descriptor.
`name' may be a @ref{5a1,,path-like object}.  If
given, `arcname' specifies an alternative name for the file in the
archive, otherwise, the name is taken from `fileobj'’s
@ref{2e5f,,name} attribute, or the `name' argument.  The name
should be a text string.

You can modify
some of the @ref{141d,,TarInfo}’s attributes before you add it using @ref{19e9,,addfile()}.
If the file object is not an ordinary file object positioned at the
beginning of the file, attributes such as @ref{2f7a,,size} may need
modifying.  This is the case for objects such as @ref{65c,,GzipFile}.
The @ref{2f7b,,name} may also be modified, in which case `arcname'
could be a dummy string.


Changed in version 3.6: The `name' parameter accepts a @ref{5a1,,path-like object}.

@end deffn

@geindex close() (tarfile.TarFile method)
@anchor{library/tarfile tarfile TarFile close}@anchor{2f7c}
@deffn {Method} TarFile.close ()

Close the @ref{141c,,TarFile}. In write mode, two finishing zero blocks are
appended to the archive.
@end deffn

@geindex pax_headers (tarfile.TarFile attribute)
@anchor{library/tarfile tarfile TarFile pax_headers}@anchor{2f7d}
@deffn {Attribute} TarFile.pax_headers: @ref{184,,dict}

A dictionary containing key-value pairs of pax global headers.
@end deffn

@node TarInfo Objects,Extraction filters,TarFile Objects,tarfile — Read and write tar archive files
@anchor{library/tarfile id2}@anchor{2f7e}@anchor{library/tarfile tarinfo-objects}@anchor{2f5a}
@subsubsection TarInfo Objects


A @ref{141d,,TarInfo} object represents one member in a @ref{141c,,TarFile}. Aside
from storing all required attributes of a file (like file type, size, time,
permissions, owner etc.), it provides some useful methods to determine its type.
It does `not' contain the file’s data itself.

@ref{141d,,TarInfo} objects are returned by @ref{141c,,TarFile}’s methods
@ref{1c33,,getmember()}, @ref{107f,,getmembers()} and
@ref{2f79,,gettarinfo()}.

Modifying the objects returned by @ref{1c33,,getmember()} or
@ref{107f,,getmembers()} will affect all subsequent
operations on the archive.
For cases where this is unwanted, you can use @ref{29,,copy.copy()} or
call the @ref{2f7f,,replace()} method to create a modified copy in one step.

Several attributes can be set to @code{None} to indicate that a piece of metadata
is unused or unknown.
Different @ref{141d,,TarInfo} methods handle @code{None} differently:


@itemize -

@item 
The @ref{29e,,extract()} or @ref{29d,,extractall()} methods will
ignore the corresponding metadata, leaving it set to a default.

@item 
@ref{19e9,,addfile()} will fail.

@item 
@ref{107e,,list()} will print a placeholder string.
@end itemize

@geindex TarInfo (class in tarfile)
@anchor{library/tarfile tarfile TarInfo}@anchor{141d}
@deffn {Class} tarfile.TarInfo (name='@w{'})

Create a @code{TarInfo} object.
@end deffn

@geindex frombuf() (tarfile.TarInfo class method)
@anchor{library/tarfile tarfile TarInfo frombuf}@anchor{2f56}
@deffn {Method} classmethod TarInfo.frombuf (buf, encoding, errors)

Create and return a @ref{141d,,TarInfo} object from string buffer `buf'.

Raises @ref{2f55,,HeaderError} if the buffer is invalid.
@end deffn

@geindex fromtarfile() (tarfile.TarInfo class method)
@anchor{library/tarfile tarfile TarInfo fromtarfile}@anchor{2f80}
@deffn {Method} classmethod TarInfo.fromtarfile (tarfile)

Read the next member from the @ref{141c,,TarFile} object `tarfile' and return it as
a @ref{141d,,TarInfo} object.
@end deffn

@geindex tobuf() (tarfile.TarInfo method)
@anchor{library/tarfile tarfile TarInfo tobuf}@anchor{2f81}
@deffn {Method} TarInfo.tobuf (format=DEFAULT_FORMAT, encoding=ENCODING, errors='surrogateescape')

Create a string buffer from a @ref{141d,,TarInfo} object. For information on the
arguments see the constructor of the @ref{141c,,TarFile} class.


Changed in version 3.2: Use @code{'surrogateescape'} as the default for the `errors' argument.

@end deffn

A @code{TarInfo} object has the following public data attributes:

@geindex name (tarfile.TarInfo attribute)
@anchor{library/tarfile tarfile TarInfo name}@anchor{2f7b}
@deffn {Attribute} TarInfo.name: @ref{16a,,str}

Name of the archive member.
@end deffn

@geindex size (tarfile.TarInfo attribute)
@anchor{library/tarfile tarfile TarInfo size}@anchor{2f7a}
@deffn {Attribute} TarInfo.size: @ref{19c,,int}

Size in bytes.
@end deffn

@geindex mtime (tarfile.TarInfo attribute)
@anchor{library/tarfile tarfile TarInfo mtime}@anchor{2f82}
@deffn {Attribute} TarInfo.mtime: @ref{19c,,int} | @ref{197,,float}

Time of last modification in seconds since the @ref{2f83,,epoch},
as in @ref{2f84,,os.stat_result.st_mtime}.


Changed in version 3.12: Can be set to @code{None} for @ref{29e,,extract()} and
@ref{29d,,extractall()}, causing extraction to skip applying this
attribute.

@end deffn

@geindex mode (tarfile.TarInfo attribute)
@anchor{library/tarfile tarfile TarInfo mode}@anchor{2f85}
@deffn {Attribute} TarInfo.mode: @ref{19c,,int}

Permission bits, as for @ref{52a,,os.chmod()}.


Changed in version 3.12: Can be set to @code{None} for @ref{29e,,extract()} and
@ref{29d,,extractall()}, causing extraction to skip applying this
attribute.

@end deffn

@geindex type (tarfile.TarInfo attribute)
@anchor{library/tarfile tarfile TarInfo type}@anchor{2f63}
@deffn {Attribute} TarInfo.type

File type.  `type' is usually one of these constants: @ref{2f61,,REGTYPE},
@ref{2f62,,AREGTYPE}, @ref{2f64,,LNKTYPE}, @ref{2f65,,SYMTYPE}, @ref{2f68,,DIRTYPE},
@ref{2f69,,FIFOTYPE}, @ref{2f6a,,CONTTYPE}, @ref{2f66,,CHRTYPE}, @ref{2f67,,BLKTYPE},
@ref{2f6d,,GNUTYPE_SPARSE}.  To determine the type of a @ref{141d,,TarInfo} object
more conveniently, use the @code{is*()} methods below.
@end deffn

@geindex linkname (tarfile.TarInfo attribute)
@anchor{library/tarfile tarfile TarInfo linkname}@anchor{2f86}
@deffn {Attribute} TarInfo.linkname: @ref{16a,,str}

Name of the target file name, which is only present in @ref{141d,,TarInfo} objects
of type @ref{2f64,,LNKTYPE} and @ref{2f65,,SYMTYPE}.

For symbolic links (@code{SYMTYPE}), the `linkname' is relative to the directory
that contains the link.
For hard links (@code{LNKTYPE}), the `linkname' is relative to the root of
the archive.
@end deffn

@geindex uid (tarfile.TarInfo attribute)
@anchor{library/tarfile tarfile TarInfo uid}@anchor{2f87}
@deffn {Attribute} TarInfo.uid: @ref{19c,,int}

User ID of the user who originally stored this member.


Changed in version 3.12: Can be set to @code{None} for @ref{29e,,extract()} and
@ref{29d,,extractall()}, causing extraction to skip applying this
attribute.

@end deffn

@geindex gid (tarfile.TarInfo attribute)
@anchor{library/tarfile tarfile TarInfo gid}@anchor{2f88}
@deffn {Attribute} TarInfo.gid: @ref{19c,,int}

Group ID of the user who originally stored this member.


Changed in version 3.12: Can be set to @code{None} for @ref{29e,,extract()} and
@ref{29d,,extractall()}, causing extraction to skip applying this
attribute.

@end deffn

@geindex uname (tarfile.TarInfo attribute)
@anchor{library/tarfile tarfile TarInfo uname}@anchor{2f89}
@deffn {Attribute} TarInfo.uname: @ref{16a,,str}

User name.


Changed in version 3.12: Can be set to @code{None} for @ref{29e,,extract()} and
@ref{29d,,extractall()}, causing extraction to skip applying this
attribute.

@end deffn

@geindex gname (tarfile.TarInfo attribute)
@anchor{library/tarfile tarfile TarInfo gname}@anchor{2f8a}
@deffn {Attribute} TarInfo.gname: @ref{16a,,str}

Group name.


Changed in version 3.12: Can be set to @code{None} for @ref{29e,,extract()} and
@ref{29d,,extractall()}, causing extraction to skip applying this
attribute.

@end deffn

@geindex chksum (tarfile.TarInfo attribute)
@anchor{library/tarfile tarfile TarInfo chksum}@anchor{2f8b}
@deffn {Attribute} TarInfo.chksum: @ref{19c,,int}

Header checksum.
@end deffn

@geindex devmajor (tarfile.TarInfo attribute)
@anchor{library/tarfile tarfile TarInfo devmajor}@anchor{2f8c}
@deffn {Attribute} TarInfo.devmajor: @ref{19c,,int}

Device major number.
@end deffn

@geindex devminor (tarfile.TarInfo attribute)
@anchor{library/tarfile tarfile TarInfo devminor}@anchor{2f8d}
@deffn {Attribute} TarInfo.devminor: @ref{19c,,int}

Device minor number.
@end deffn

@geindex offset (tarfile.TarInfo attribute)
@anchor{library/tarfile tarfile TarInfo offset}@anchor{2f8e}
@deffn {Attribute} TarInfo.offset: @ref{19c,,int}

The tar header starts here.
@end deffn

@geindex offset_data (tarfile.TarInfo attribute)
@anchor{library/tarfile tarfile TarInfo offset_data}@anchor{2f8f}
@deffn {Attribute} TarInfo.offset_data: @ref{19c,,int}

The file’s data starts here.
@end deffn

@geindex sparse (tarfile.TarInfo attribute)
@anchor{library/tarfile tarfile TarInfo sparse}@anchor{2f90}
@deffn {Attribute} TarInfo.sparse

Sparse member information.
@end deffn

@geindex pax_headers (tarfile.TarInfo attribute)
@anchor{library/tarfile tarfile TarInfo pax_headers}@anchor{2f91}
@deffn {Attribute} TarInfo.pax_headers: @ref{184,,dict}

A dictionary containing key-value pairs of an associated pax extended header.
@end deffn

@geindex replace() (tarfile.TarInfo method)
@anchor{library/tarfile tarfile TarInfo replace}@anchor{2f7f}
@deffn {Method} TarInfo.replace (name=..., mtime=..., mode=..., linkname=..., uid=..., gid=..., uname=..., gname=..., deep=True)


Added in version 3.12.


Return a `new' copy of the @code{TarInfo} object with the given attributes
changed. For example, to return a @code{TarInfo} with the group name set to
@code{'staff'}, use:

@example
new_tarinfo = old_tarinfo.replace(gname='staff')
@end example

By default, a deep copy is made.
If `deep' is false, the copy is shallow, i.e. @code{pax_headers}
and any custom attributes are shared with the original @code{TarInfo} object.
@end deffn

A @ref{141d,,TarInfo} object also provides some convenient query methods:

@geindex isfile() (tarfile.TarInfo method)
@anchor{library/tarfile tarfile TarInfo isfile}@anchor{2f92}
@deffn {Method} TarInfo.isfile ()

Return @ref{e0d,,True} if the @ref{141d,,TarInfo} object is a regular file.
@end deffn

@geindex isreg() (tarfile.TarInfo method)
@anchor{library/tarfile tarfile TarInfo isreg}@anchor{2f93}
@deffn {Method} TarInfo.isreg ()

Same as @ref{2f92,,isfile()}.
@end deffn

@geindex isdir() (tarfile.TarInfo method)
@anchor{library/tarfile tarfile TarInfo isdir}@anchor{2f94}
@deffn {Method} TarInfo.isdir ()

Return @ref{e0d,,True} if it is a directory.
@end deffn

@geindex issym() (tarfile.TarInfo method)
@anchor{library/tarfile tarfile TarInfo issym}@anchor{2f95}
@deffn {Method} TarInfo.issym ()

Return @ref{e0d,,True} if it is a symbolic link.
@end deffn

@geindex islnk() (tarfile.TarInfo method)
@anchor{library/tarfile tarfile TarInfo islnk}@anchor{2f96}
@deffn {Method} TarInfo.islnk ()

Return @ref{e0d,,True} if it is a hard link.
@end deffn

@geindex ischr() (tarfile.TarInfo method)
@anchor{library/tarfile tarfile TarInfo ischr}@anchor{2f97}
@deffn {Method} TarInfo.ischr ()

Return @ref{e0d,,True} if it is a character device.
@end deffn

@geindex isblk() (tarfile.TarInfo method)
@anchor{library/tarfile tarfile TarInfo isblk}@anchor{2f98}
@deffn {Method} TarInfo.isblk ()

Return @ref{e0d,,True} if it is a block device.
@end deffn

@geindex isfifo() (tarfile.TarInfo method)
@anchor{library/tarfile tarfile TarInfo isfifo}@anchor{2f99}
@deffn {Method} TarInfo.isfifo ()

Return @ref{e0d,,True} if it is a FIFO.
@end deffn

@geindex isdev() (tarfile.TarInfo method)
@anchor{library/tarfile tarfile TarInfo isdev}@anchor{2f9a}
@deffn {Method} TarInfo.isdev ()

Return @ref{e0d,,True} if it is one of character device, block device or FIFO.
@end deffn

@node Extraction filters,Command-Line Interface,TarInfo Objects,tarfile — Read and write tar archive files
@anchor{library/tarfile extraction-filters}@anchor{2f9b}@anchor{library/tarfile tarfile-extraction-filter}@anchor{698}
@subsubsection Extraction filters



Added in version 3.12.


The `tar' format is designed to capture all details of a UNIX-like filesystem,
which makes it very powerful.
Unfortunately, the features make it easy to create tar files that have
unintended – and possibly malicious – effects when extracted.
For example, extracting a tar file can overwrite arbitrary files in various
ways (e.g.  by using absolute paths, @code{..} path components, or symlinks that
affect later members).

In most cases, the full functionality is not needed.
Therefore, `tarfile' supports extraction filters: a mechanism to limit
functionality, and thus mitigate some of the security issues.

@cartouche
@quotation Warning 
None of the available filters blocks `all' dangerous archive features.
Never extract archives from untrusted sources without prior inspection.
See also @ref{2d65,,Hints for further verification}.
@end quotation
@end cartouche


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 706

@item PEP 706@footnote{https://peps.python.org/pep-0706/}

Contains further motivation and rationale behind the design.
@end table


The `filter' argument to @ref{29e,,TarFile.extract()} or @ref{29d,,extractall()}
can be:


@itemize *

@item 
the string @code{'fully_trusted'}: Honor all metadata as specified in the
archive.
Should be used if the user trusts the archive completely, or implements
their own complex verification.

@item 
the string @code{'tar'}: Honor most `tar'-specific features (i.e. features of
UNIX-like filesystems), but block features that are very likely to be
surprising or malicious. See @ref{2f9c,,tar_filter()} for details.

@item 
the string @code{'data'}: Ignore or block most features specific to UNIX-like
filesystems. Intended for extracting cross-platform data archives.
See @ref{29c,,data_filter()} for details.

@item 
@code{None} (default): Use @ref{2f78,,TarFile.extraction_filter}.

If that is also @code{None} (the default), the @code{'data'} filter will be used.

@quotation


Changed in version 3.14: The default filter is set to @ref{29c,,data}.
Previously, the default was equivalent to
@ref{2f4e,,fully_trusted}.

@end quotation

@item 
A callable which will be called for each extracted member with a
@ref{2f5a,,TarInfo} describing the member and the destination
path to where the archive is extracted (i.e. the same path is used for all
members):

@example
filter(member: TarInfo, path: str, /) -> TarInfo | None
@end example

The callable is called just before each member is extracted, so it can
take the current state of the disk into account.
It can:


@itemize -

@item 
return a @ref{141d,,TarInfo} object which will be used instead of the metadata
in the archive, or

@item 
return @code{None}, in which case the member will be skipped, or

@item 
raise an exception to abort the operation or skip the member,
depending on @ref{2a0,,errorlevel}.
Note that when extraction is aborted, @ref{29d,,extractall()} may leave
the archive partially extracted. It does not attempt to clean up.
@end itemize
@end itemize

@menu
* Default named filters:: 
* Filter errors:: 
* Hints for further verification:: 
* Supporting older Python versions:: 
* Stateful extraction filter example:: 

@end menu

@node Default named filters,Filter errors,,Extraction filters
@anchor{library/tarfile default-named-filters}@anchor{2f9d}
@subsubsection Default named filters


The pre-defined, named filters are available as functions, so they can be
reused in custom filters:

@geindex fully_trusted_filter() (in module tarfile)
@anchor{library/tarfile tarfile fully_trusted_filter}@anchor{2f4e}
@deffn {Function} tarfile.fully_trusted_filter (member, path)

Return `member' unchanged.

This implements the @code{'fully_trusted'} filter.
@end deffn

@geindex tar_filter() (in module tarfile)
@anchor{library/tarfile tarfile tar_filter}@anchor{2f9c}
@deffn {Function} tarfile.tar_filter (member, path)

Implements the @code{'tar'} filter.


@itemize -

@item 
Strip leading slashes (@code{/} and @ref{87c,,os.sep}) from filenames.

@item 
@ref{2f58,,Refuse} to extract files with absolute
paths (in case the name is absolute
even after stripping slashes, e.g. @code{C:/foo} on Windows).
This raises @ref{2f5b,,AbsolutePathError}.

@item 
@ref{2f58,,Refuse} to extract files whose absolute
path (after following symlinks) would end up outside the destination.
This raises @ref{2f5c,,OutsideDestinationError}.

@item 
Clear high mode bits (setuid, setgid, sticky) and group/other write bits
(@ref{2cf1,,S_IWGRP} | @ref{2cf4,,S_IWOTH}).
@end itemize

Return the modified @code{TarInfo} member.
@end deffn

@geindex data_filter() (in module tarfile)
@anchor{library/tarfile tarfile data_filter}@anchor{29c}
@deffn {Function} tarfile.data_filter (member, path)

Implements the @code{'data'} filter.
In addition to what @code{tar_filter} does:


@itemize -

@item 
Normalize link targets (@ref{2f86,,TarInfo.linkname}) using
@ref{1525,,os.path.normpath()}.
Note that this removes internal @code{..} components, which may change the
meaning of the link if the path in @code{TarInfo.linkname} traverses
symbolic links.

@item 
@ref{2f58,,Refuse} to extract links (hard or soft)
that link to absolute paths, or ones that link outside the destination.

This raises @ref{2f5e,,AbsoluteLinkError} or
@ref{2f5f,,LinkOutsideDestinationError}.

Note that such files are refused even on platforms that do not support
symbolic links.

@item 
@ref{2f58,,Refuse} to extract device files
(including pipes).
This raises @ref{2f5d,,SpecialFileError}.

@item 
For regular files, including hard links:


@itemize -

@item 
Set the owner read and write permissions
(@ref{2cec,,S_IRUSR} | @ref{2ced,,S_IWUSR}).

@item 
Remove the group & other executable permission
(@ref{2ce8,,S_IXGRP} | @ref{2cf5,,S_IXOTH})
if the owner doesn’t have it (@ref{2cee,,S_IXUSR}).
@end itemize

@item 
For other files (directories), set @code{mode} to @code{None}, so
that extraction methods skip applying permission bits.

@item 
Set user and group info (@code{uid}, @code{gid}, @code{uname}, @code{gname})
to @code{None}, so that extraction methods skip setting it.
@end itemize

Return the modified @code{TarInfo} member.

Note that this filter does not block `all' dangerous archive features.
See @ref{2d65,,Hints for further verification}  for details.


Changed in version 3.14: Link targets are now normalized.

@end deffn

@node Filter errors,Hints for further verification,Default named filters,Extraction filters
@anchor{library/tarfile filter-errors}@anchor{2f9e}@anchor{library/tarfile tarfile-extraction-refuse}@anchor{2f58}
@subsubsection Filter errors


When a filter refuses to extract a file, it will raise an appropriate exception,
a subclass of @ref{2f57,,FilterError}.
This will abort the extraction if @ref{2a0,,TarFile.errorlevel} is 1 or more.
With @code{errorlevel=0} the error will be logged and the member will be skipped,
but extraction will continue.

@node Hints for further verification,Supporting older Python versions,Filter errors,Extraction filters
@anchor{library/tarfile hints-for-further-verification}@anchor{2f9f}@anchor{library/tarfile tarfile-further-verification}@anchor{2d65}
@subsubsection Hints for further verification


Even with @code{filter='data'}, `tarfile' is not suited for extracting untrusted
files without prior inspection.
Among other issues, the pre-defined filters do not prevent denial-of-service
attacks. Users should do additional checks.

Here is an incomplete list of things to consider:


@itemize *

@item 
Extract to a @ref{52e,,new temporary directory}
to prevent e.g. exploiting pre-existing links, and to make it easier to
clean up after a failed extraction.

@item 
Disallow symbolic links if you do not need the functionality.

@item 
When working with untrusted data, use external (e.g. OS-level) limits on
disk, memory and CPU usage.

@item 
Check filenames against an allow-list of characters
(to filter out control characters, confusables, foreign path separators,
and so on).

@item 
Check that filenames have expected extensions (discouraging files that
execute when you “click on them”, or extension-less files like Windows
special device names).

@item 
Limit the number of extracted files, total size of extracted data,
filename length (including symlink length), and size of individual files.

@item 
Check for files that would be shadowed on case-insensitive filesystems.
@end itemize

Also note that:


@itemize *

@item 
Tar files may contain multiple versions of the same file.
Later ones are expected to overwrite any earlier ones.
This feature is crucial to allow updating tape archives, but can be abused
maliciously.

@item 
`tarfile' does not protect against issues with “live” data,
e.g. an attacker tinkering with the destination (or source) directory while
extraction (or archiving) is in progress.
@end itemize

@node Supporting older Python versions,Stateful extraction filter example,Hints for further verification,Extraction filters
@anchor{library/tarfile supporting-older-python-versions}@anchor{2fa0}
@subsubsection Supporting older Python versions


Extraction filters were added to Python 3.12, but may be backported to older
versions as security updates.
To check whether the feature is available, use e.g.
@code{hasattr(tarfile, 'data_filter')} rather than checking the Python version.

The following examples show how to support Python versions with and without
the feature.
Note that setting @code{extraction_filter} will affect any subsequent operations.


@itemize *

@item 
Fully trusted archive:

@example
my_tarfile.extraction_filter = (lambda member, path: member)
my_tarfile.extractall()
@end example

@item 
Use the @code{'data'} filter if available, but revert to Python 3.11 behavior
(@code{'fully_trusted'}) if this feature is not available:

@example
my_tarfile.extraction_filter = getattr(tarfile, 'data_filter',
                                       (lambda member, path: member))
my_tarfile.extractall()
@end example

@item 
Use the @code{'data'} filter; `fail' if it is not available:

@example
my_tarfile.extractall(filter=tarfile.data_filter)
@end example

or:

@example
my_tarfile.extraction_filter = tarfile.data_filter
my_tarfile.extractall()
@end example

@item 
Use the @code{'data'} filter; `warn' if it is not available:

@example
if hasattr(tarfile, 'data_filter'):
    my_tarfile.extractall(filter='data')
else:
    # remove this when no longer needed
    warn_the_user('Extracting may be unsafe; consider updating Python')
    my_tarfile.extractall()
@end example
@end itemize

@node Stateful extraction filter example,,Supporting older Python versions,Extraction filters
@anchor{library/tarfile stateful-extraction-filter-example}@anchor{2fa1}
@subsubsection Stateful extraction filter example


While `tarfile'’s extraction methods take a simple `filter' callable,
custom filters may be more complex objects with an internal state.
It may be useful to write these as context managers, to be used like this:

@example
with StatefulFilter() as filter_func:
    tar.extractall(path, filter=filter_func)
@end example

Such a filter can be written as, for example:

@example
class StatefulFilter:
    def __init__(self):
        self.file_count = 0

    def __enter__(self):
        return self

    def __call__(self, member, path):
        self.file_count += 1
        return member

    def __exit__(self, *exc_info):
        print(f'@{self.file_count@} files extracted')
@end example

@node Command-Line Interface,Examples<10>,Extraction filters,tarfile — Read and write tar archive files
@anchor{library/tarfile command-line-interface}@anchor{2fa2}@anchor{library/tarfile tarfile-commandline}@anchor{11d1}
@subsubsection Command-Line Interface



Added in version 3.4.


The @code{tarfile} module provides a simple command-line interface to interact
with tar archives.

If you want to create a new tar archive, specify its name after the @ref{2fa3,,-c}
option and then list the filename(s) that should be included:

@example
$ python -m tarfile -c monty.tar  spam.txt eggs.txt
@end example

Passing a directory is also acceptable:

@example
$ python -m tarfile -c monty.tar life-of-brian_1979/
@end example

If you want to extract a tar archive into the current directory, use
the @ref{2fa4,,-e} option:

@example
$ python -m tarfile -e monty.tar
@end example

You can also extract a tar archive into a different directory by passing the
directory’s name:

@example
$ python -m tarfile -e monty.tar  other-dir/
@end example

For a list of the files in a tar archive, use the @ref{2fa5,,-l} option:

@example
$ python -m tarfile -l monty.tar
@end example

@menu
* Command-line options: Command-line options<3>. 

@end menu

@node Command-line options<3>,,,Command-Line Interface
@anchor{library/tarfile command-line-options}@anchor{2fa6}
@subsubsection Command-line options


@geindex tarfile command line option; -l
@geindex tarfile command line option; --list
@anchor{library/tarfile cmdoption-tarfile-l}@anchor{2fa5}
@deffn {Option} @w{-}l <tarfile>
@anchor{library/tarfile cmdoption-tarfile-list}@anchor{2fa7}
@deffnx {Option} @w{-}@w{-}list <tarfile>

List files in a tarfile.
@end deffn

@geindex tarfile command line option; -c
@geindex tarfile command line option; --create
@anchor{library/tarfile cmdoption-tarfile-c}@anchor{2fa3}
@deffn {Option} @w{-}c <tarfile> <source1> ... <sourceN>
@anchor{library/tarfile cmdoption-tarfile-create}@anchor{2fa8}
@deffnx {Option} @w{-}@w{-}create <tarfile> <source1> ... <sourceN>

Create tarfile from source files.
@end deffn

@geindex tarfile command line option; -e
@geindex tarfile command line option; --extract
@anchor{library/tarfile cmdoption-tarfile-e}@anchor{2fa4}
@deffn {Option} @w{-}e <tarfile> [<output_dir>]
@anchor{library/tarfile cmdoption-tarfile-extract}@anchor{2fa9}
@deffnx {Option} @w{-}@w{-}extract <tarfile> [<output_dir>]

Extract tarfile into the current directory if `output_dir' is not specified.
@end deffn

@geindex tarfile command line option; -t
@geindex tarfile command line option; --test
@anchor{library/tarfile cmdoption-tarfile-t}@anchor{2faa}
@deffn {Option} @w{-}t <tarfile>
@anchor{library/tarfile cmdoption-tarfile-test}@anchor{2fab}
@deffnx {Option} @w{-}@w{-}test <tarfile>

Test whether the tarfile is valid or not.
@end deffn

@geindex tarfile command line option; -v
@geindex tarfile command line option; --verbose
@anchor{library/tarfile cmdoption-tarfile-v}@anchor{2fac}@anchor{library/tarfile cmdoption-tarfile-verbose}@anchor{2fad}
@deffn {Option} @w{-}v, @w{-}@w{-}verbose

Verbose output.
@end deffn

@geindex tarfile command line option; --filter
@anchor{library/tarfile cmdoption-tarfile-filter}@anchor{2fae}
@deffn {Option} @w{-}@w{-}filter <filtername>

Specifies the `filter' for @code{--extract}.
See @ref{698,,Extraction filters} for details.
Only string names are accepted (that is, @code{fully_trusted}, @code{tar},
and @code{data}).
@end deffn

@node Examples<10>,Supported tar formats,Command-Line Interface,tarfile — Read and write tar archive files
@anchor{library/tarfile examples}@anchor{2faf}@anchor{library/tarfile tar-examples}@anchor{2f51}
@subsubsection Examples


@menu
* Reading examples:: 
* Writing examples:: 

@end menu

@node Reading examples,Writing examples,,Examples<10>
@anchor{library/tarfile reading-examples}@anchor{2fb0}
@subsubsection Reading examples


How to extract an entire tar archive to the current working directory:

@example
import tarfile
tar = tarfile.open("sample.tar.gz")
tar.extractall(filter='data')
tar.close()
@end example

How to extract a subset of a tar archive with @ref{29d,,TarFile.extractall()} using
a generator function instead of a list:

@example
import os
import tarfile

def py_files(members):
    for tarinfo in members:
        if os.path.splitext(tarinfo.name)[1] == ".py":
            yield tarinfo

tar = tarfile.open("sample.tar.gz")
tar.extractall(members=py_files(tar))
tar.close()
@end example

How to read a gzip compressed tar archive and display some member information:

@example
import tarfile
tar = tarfile.open("sample.tar.gz", "r:gz")
for tarinfo in tar:
    print(tarinfo.name, "is", tarinfo.size, "bytes in size and is ", end="")
    if tarinfo.isreg():
        print("a regular file.")
    elif tarinfo.isdir():
        print("a directory.")
    else:
        print("something else.")
tar.close()
@end example

@node Writing examples,,Reading examples,Examples<10>
@anchor{library/tarfile writing-examples}@anchor{2fb1}
@subsubsection Writing examples


How to create an uncompressed tar archive from a list of filenames:

@example
import tarfile
tar = tarfile.open("sample.tar", "w")
for name in ["foo", "bar", "quux"]:
    tar.add(name)
tar.close()
@end example

The same example using the @ref{187,,with} statement:

@example
import tarfile
with tarfile.open("sample.tar", "w") as tar:
    for name in ["foo", "bar", "quux"]:
        tar.add(name)
@end example

How to create and write an archive to stdout using
@ref{cd3,,sys.stdout.buffer} in the `fileobj' parameter
in @ref{df4,,TarFile.add()}:

@example
import sys
import tarfile
with tarfile.open("sample.tar.gz", "w|gz", fileobj=sys.stdout.buffer) as tar:
    for name in ["foo", "bar", "quux"]:
        tar.add(name)
@end example

How to create an archive and reset the user information using the `filter'
parameter in @ref{df4,,TarFile.add()}:

@example
import tarfile
def reset(tarinfo):
    tarinfo.uid = tarinfo.gid = 0
    tarinfo.uname = tarinfo.gname = "root"
    return tarinfo
tar = tarfile.open("sample.tar.gz", "w:gz")
tar.add("foo", filter=reset)
tar.close()
@end example

@node Supported tar formats,Unicode issues,Examples<10>,tarfile — Read and write tar archive files
@anchor{library/tarfile supported-tar-formats}@anchor{2fb2}@anchor{library/tarfile tar-formats}@anchor{2f6e}
@subsubsection Supported tar formats


There are three tar formats that can be created with the @code{tarfile} module:


@itemize *

@item 
The POSIX.1-1988 ustar format (@ref{2f6f,,USTAR_FORMAT}). It supports filenames
up to a length of at best 256 characters and linknames up to 100 characters.
The maximum file size is 8 GiB. This is an old and limited but widely
supported format.

@item 
The GNU tar format (@ref{2f70,,GNU_FORMAT}). It supports long filenames and
linknames, files bigger than 8 GiB and sparse files. It is the de facto
standard on GNU/Linux systems. @code{tarfile} fully supports the GNU tar
extensions for long names, sparse file support is read-only.

@item 
The POSIX.1-2001 pax format (@ref{2f71,,PAX_FORMAT}). It is the most flexible
format with virtually no limits. It supports long filenames and linknames, large
files and stores pathnames in a portable way. Modern tar implementations,
including GNU tar, bsdtar/libarchive and star, fully support extended `pax'
features; some old or unmaintained libraries may not, but should treat
`pax' archives as if they were in the universally supported `ustar' format.
It is the current default format for new archives.

It extends the existing `ustar' format with extra headers for information
that cannot be stored otherwise. There are two flavours of pax headers:
Extended headers only affect the subsequent file header, global
headers are valid for the complete archive and affect all following files.
All the data in a pax header is encoded in `UTF-8' for portability reasons.
@end itemize

There are some more variants of the tar format which can be read, but not
created:


@itemize *

@item 
The ancient V7 format. This is the first tar format from Unix Seventh Edition,
storing only regular files and directories. Names must not be longer than 100
characters, there is no user/group name information. Some archives have
miscalculated header checksums in case of fields with non-ASCII characters.

@item 
The SunOS tar extended format. This format is a variant of the POSIX.1-2001
pax format, but is not compatible.
@end itemize

@node Unicode issues,,Supported tar formats,tarfile — Read and write tar archive files
@anchor{library/tarfile tar-unicode}@anchor{2f74}@anchor{library/tarfile unicode-issues}@anchor{2fb3}
@subsubsection Unicode issues


The tar format was originally conceived to make backups on tape drives with the
main focus on preserving file system information. Nowadays tar archives are
commonly used for file distribution and exchanging archives over networks. One
problem of the original format (which is the basis of all other formats) is
that there is no concept of supporting different character encodings. For
example, an ordinary tar archive created on a `UTF-8' system cannot be read
correctly on a `Latin-1' system if it contains non-`ASCII' characters. Textual
metadata (like filenames, linknames, user/group names) will appear damaged.
Unfortunately, there is no way to autodetect the encoding of an archive. The
pax format was designed to solve this problem. It stores non-ASCII metadata
using the universal character encoding `UTF-8'.

The details of character conversion in @code{tarfile} are controlled by the
`encoding' and `errors' keyword arguments of the @ref{141c,,TarFile} class.

`encoding' defines the character encoding to use for the metadata in the
archive. The default value is @ref{e59,,sys.getfilesystemencoding()} or @code{'ascii'}
as a fallback. Depending on whether the archive is read or written, the
metadata must be either decoded or encoded. If `encoding' is not set
appropriately, this conversion may fail.

The `errors' argument defines how characters are treated that cannot be
converted. Possible values are listed in section @ref{1bb3,,Error Handlers}.
The default scheme is @code{'surrogateescape'} which Python also uses for its
file system calls, see @ref{2fb4,,File Names@comma{} Command Line Arguments@comma{} and Environment Variables}.

For @ref{2f71,,PAX_FORMAT} archives (the default), `encoding' is generally not needed
because all the metadata is stored using `UTF-8'. `encoding' is only used in
the rare cases when binary pax headers are decoded or when strings with
surrogate characters are stored.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node File Formats,Cryptographic Services,Data Compression and Archiving,The Python Standard Library
@anchor{library/fileformats doc}@anchor{2fb5}@anchor{library/fileformats file-formats}@anchor{2fb6}@anchor{library/fileformats fileformats}@anchor{2fb7}@anchor{library/fileformats translation-repo}@anchor{2fb8}
@section File Formats


The modules described in this chapter parse various miscellaneous file formats
that aren’t markup languages and are not related to e-mail.

@menu
* csv — CSV File Reading and Writing:: 
* configparser — Configuration file parser:: 
* tomllib — Parse TOML files:: 
* netrc — netrc file processing:: 
* plistlib — Generate and parse Apple .plist files: plistlib — Generate and parse Apple plist files. 

@end menu

@node csv — CSV File Reading and Writing,configparser — Configuration file parser,,File Formats
@anchor{library/csv doc}@anchor{2fb9}@anchor{library/csv csv-csv-file-reading-and-writing}@anchor{2fba}@anchor{library/csv module-csv}@anchor{2d}
@subsection @code{csv} — CSV File Reading and Writing


@geindex module; csv

`Source code:' Lib/csv.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/csv.py}

@geindex csv
@geindex data; tabular


__________________________________________________________________


The so-called CSV (Comma Separated Values) format is the most common import and
export format for spreadsheets and databases.  CSV format was used for many
years prior to attempts to describe the format in a standardized way in
@geindex RFC; RFC 4180
RFC 4180@footnote{https://datatracker.ietf.org/doc/html/rfc4180.html}.  The lack of a well-defined standard means that subtle differences
often exist in the data produced and consumed by different applications.  These
differences can make it annoying to process CSV files from multiple sources.
Still, while the delimiters and quoting characters vary, the overall format is
similar enough that it is possible to write a single module which can
efficiently manipulate such data, hiding the details of reading and writing the
data from the programmer.

The @code{csv} module implements classes to read and write tabular data in CSV
format.  It allows programmers to say, “write this data in the format preferred
by Excel,” or “read data from this file which was generated by Excel,” without
knowing the precise details of the CSV format used by Excel.  Programmers can
also describe the CSV formats understood by other applications or define their
own special-purpose CSV formats.

The @code{csv} module’s @ref{6af,,reader} and @ref{6b0,,writer} objects read and
write sequences.  Programmers can also read and write data in dictionary form
using the @ref{bde,,DictReader} and @ref{140a,,DictWriter} classes.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 305

@item PEP 305@footnote{https://peps.python.org/pep-0305/} - CSV File API

The Python Enhancement Proposal which proposed this addition to Python.
@end table


@menu
* Module Contents: Module Contents<2>. 
* Dialects and Formatting Parameters:: 
* Reader Objects:: 
* Writer Objects:: 
* Examples: Examples<11>. 

@end menu

@node Module Contents<2>,Dialects and Formatting Parameters,,csv — CSV File Reading and Writing
@anchor{library/csv csv-contents}@anchor{2fbb}@anchor{library/csv module-contents}@anchor{2fbc}
@subsubsection Module Contents


The @code{csv} module defines the following functions:

@geindex universal newlines; csv.reader function

@geindex reader() (in module csv)
@anchor{library/csv csv reader}@anchor{6af}
@deffn {Function} csv.reader (csvfile, /, dialect='excel', **fmtparams)

Return a @ref{2fbd,,reader object} that will process
lines from the given `csvfile'.  A csvfile must be an iterable of
strings, each in the reader’s defined csv format.
A csvfile is most commonly a file-like object or list.
If `csvfile' is a file object,
it should be opened with @code{newline='@w{'}}. @footnote{
If @code{newline='@w{'}} is not specified, newlines embedded inside quoted fields
will not be interpreted correctly, and on platforms that use @code{\r\n} line endings
on write an extra @code{\r} will be added.  It should always be safe to specify
@code{newline='@w{'}}, since the csv module does its own
(@ref{f3b,,universal}) newline handling.
}  An optional
`dialect' parameter can be given which is used to define a set of parameters
specific to a particular CSV dialect.  It may be an instance of a subclass of
the @ref{1871,,Dialect} class or one of the strings returned by the
@ref{1bd8,,list_dialects()} function.  The other optional `fmtparams' keyword arguments
can be given to override individual formatting parameters in the current
dialect.  For full details about the dialect and formatting parameters, see
section @ref{2fbe,,Dialects and Formatting Parameters}.

Each row read from the csv file is returned as a list of strings.  No
automatic data type conversion is performed unless the @ref{198b,,QUOTE_NONNUMERIC} format
option is specified (in which case unquoted fields are transformed into floats).

A short usage example:

@example
>>> import csv
>>> with open('eggs.csv', newline='@w{'}) as csvfile:
...     spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|')
...     for row in spamreader:
...         print(', '.join(row))
Spam, Spam, Spam, Spam, Spam, Baked Beans
Spam, Lovely Spam, Wonderful Spam
@end example
@end deffn

@geindex writer() (in module csv)
@anchor{library/csv csv writer}@anchor{6b0}
@deffn {Function} csv.writer (csvfile, /, dialect='excel', **fmtparams)

Return a writer object responsible for converting the user’s data into delimited
strings on the given file-like object.  `csvfile' can be any object with a
@ref{209f,,write()} method.  If `csvfile' is a file object, it should be opened with
@code{newline='@w{'}} @footnote{
If @code{newline='@w{'}} is not specified, newlines embedded inside quoted fields
will not be interpreted correctly, and on platforms that use @code{\r\n} line endings
on write an extra @code{\r} will be added.  It should always be safe to specify
@code{newline='@w{'}}, since the csv module does its own
(@ref{f3b,,universal}) newline handling.
}.  An optional `dialect'
parameter can be given which is used to define a set of parameters specific to a
particular CSV dialect.  It may be an instance of a subclass of the
@ref{1871,,Dialect} class or one of the strings returned by the
@ref{1bd8,,list_dialects()} function.  The other optional `fmtparams' keyword arguments
can be given to override individual formatting parameters in the current
dialect.  For full details about dialects and formatting parameters, see
the @ref{2fbe,,Dialects and Formatting Parameters} section. To make it
as easy as possible to interface with modules which implement the DB API, the
value @ref{887,,None} is written as the empty string.  While this isn’t a
reversible transformation, it makes it easier to dump SQL NULL data values to
CSV files without preprocessing the data returned from a @code{cursor.fetch*} call.
All other non-string data are stringified with @ref{16a,,str()} before being written.

A short usage example:

@example
import csv
with open('eggs.csv', 'w', newline='@w{'}) as csvfile:
    spamwriter = csv.writer(csvfile, delimiter=' ',
                            quotechar='|', quoting=csv.QUOTE_MINIMAL)
    spamwriter.writerow(['Spam'] * 5 + ['Baked Beans'])
    spamwriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])
@end example
@end deffn

@geindex register_dialect() (in module csv)
@anchor{library/csv csv register_dialect}@anchor{197d}
@deffn {Function} csv.register_dialect (name, /, dialect='excel', **fmtparams)

Associate `dialect' with `name'.  `name' must be a string. The
dialect can be specified either by passing a sub-class of @ref{1871,,Dialect}, or
by `fmtparams' keyword arguments, or both, with keyword arguments overriding
parameters of the dialect. For full details about dialects and formatting
parameters, see section @ref{2fbe,,Dialects and Formatting Parameters}.
@end deffn

@geindex unregister_dialect() (in module csv)
@anchor{library/csv csv unregister_dialect}@anchor{1bd7}
@deffn {Function} csv.unregister_dialect (name)

Delete the dialect associated with `name' from the dialect registry.  An
@ref{2fbf,,Error} is raised if `name' is not a registered dialect name.
@end deffn

@geindex get_dialect() (in module csv)
@anchor{library/csv csv get_dialect}@anchor{1bd6}
@deffn {Function} csv.get_dialect (name)

Return the dialect associated with `name'.  An @ref{2fbf,,Error} is raised if
`name' is not a registered dialect name.  This function returns an immutable
@ref{1871,,Dialect}.
@end deffn

@geindex list_dialects() (in module csv)
@anchor{library/csv csv list_dialects}@anchor{1bd8}
@deffn {Function} csv.list_dialects ()

Return the names of all registered dialects.
@end deffn

@geindex field_size_limit() (in module csv)
@anchor{library/csv csv field_size_limit}@anchor{1bd5}
@deffn {Function} csv.field_size_limit ()

@deffnx {Function} csv.field_size_limit (new_limit)

Returns the current maximum field size allowed by the parser. If `new_limit' is
given, this becomes the new limit.
@end deffn

The @code{csv} module defines the following classes:

@geindex DictReader (class in csv)
@anchor{library/csv csv DictReader}@anchor{bde}
@deffn {Class} csv.DictReader (f, fieldnames=None, restkey=None, restval=None, dialect='excel', *args, **kwds)

Create an object that operates like a regular reader but maps the
information in each row to a @ref{184,,dict} whose keys are given by the
optional `fieldnames' parameter.

The `fieldnames' parameter is a @ref{717,,sequence}.  If `fieldnames' is
omitted, the values in the first row of file `f' will be used as the
fieldnames and will be omitted from the results. If
`fieldnames' is provided, they will be used and the first row will be
included in the results.  Regardless of how the fieldnames are determined,
the dictionary preserves their original ordering.

If a row has more fields than fieldnames, the remaining data is put in a
list and stored with the fieldname specified by `restkey' (which defaults
to @code{None}).  If a non-blank row has fewer fields than fieldnames, the
missing values are filled-in with the value of `restval' (which defaults
to @code{None}).

All other optional or keyword arguments are passed to the underlying
@ref{6af,,reader} instance.

If the argument passed to `fieldnames' is an iterator, it will be coerced to a @ref{24f,,list}.


Changed in version 3.6: Returned rows are now of type @code{OrderedDict}.



Changed in version 3.8: Returned rows are now of type @ref{184,,dict}.


A short usage example:

@example
>>> import csv
>>> with open('names.csv', newline='@w{'}) as csvfile:
...     reader = csv.DictReader(csvfile)
...     for row in reader:
...         print(row['first_name'], row['last_name'])
...
Eric Idle
John Cleese

>>> print(row)
@{'first_name': 'John', 'last_name': 'Cleese'@}
@end example
@end deffn

@geindex DictWriter (class in csv)
@anchor{library/csv csv DictWriter}@anchor{140a}
@deffn {Class} csv.DictWriter (f, fieldnames, restval='@w{'}, extrasaction='raise', dialect='excel', *args, **kwds)

Create an object which operates like a regular writer but maps dictionaries
onto output rows.  The `fieldnames' parameter is a @ref{1f,,sequence} of keys that identify the order in which values in the
dictionary passed to the @ref{fef,,writerow()} method are written to file
`f'.  The optional `restval' parameter specifies the value to be
written if the dictionary is missing a key in `fieldnames'.  If the
dictionary passed to the @code{writerow()} method contains a key not found in
`fieldnames', the optional `extrasaction' parameter indicates what action to
take.
If it is set to @code{'raise'}, the default value, a @ref{2ee,,ValueError}
is raised.
If it is set to @code{'ignore'}, extra values in the dictionary are ignored.
Any other optional or keyword arguments are passed to the underlying
@ref{6b0,,writer} instance.

Note that unlike the @ref{bde,,DictReader} class, the `fieldnames' parameter
of the @code{DictWriter} class is not optional.

If the argument passed to `fieldnames' is an iterator, it will be coerced to a @ref{24f,,list}.

A short usage example:

@example
import csv

with open('names.csv', 'w', newline='@w{'}) as csvfile:
    fieldnames = ['first_name', 'last_name']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)

    writer.writeheader()
    writer.writerow(@{'first_name': 'Baked', 'last_name': 'Beans'@})
    writer.writerow(@{'first_name': 'Lovely', 'last_name': 'Spam'@})
    writer.writerow(@{'first_name': 'Wonderful', 'last_name': 'Spam'@})
@end example
@end deffn

@geindex Dialect (class in csv)
@anchor{library/csv csv Dialect}@anchor{1871}
@deffn {Class} csv.Dialect

The @code{Dialect} class is a container class whose attributes contain
information for how to handle doublequotes, whitespace, delimiters, etc.
Due to the lack of a strict CSV specification, different applications
produce subtly different CSV data.  @code{Dialect} instances define how
@ref{6af,,reader} and @ref{6b0,,writer} instances behave.

All available @code{Dialect} names are returned by @ref{1bd8,,list_dialects()},
and they can be registered with specific @ref{6af,,reader} and @ref{6b0,,writer}
classes through their initializer (@code{__init__}) functions like this:

@example
import csv

with open('students.csv', 'w', newline='@w{'}) as csvfile:
    writer = csv.writer(csvfile, dialect='unix')
@end example
@end deffn

@geindex excel (class in csv)
@anchor{library/csv csv excel}@anchor{2fc0}
@deffn {Class} csv.excel

The @code{excel} class defines the usual properties of an Excel-generated CSV
file.  It is registered with the dialect name @code{'excel'}.
@end deffn

@geindex excel_tab (class in csv)
@anchor{library/csv csv excel_tab}@anchor{2fc1}
@deffn {Class} csv.excel_tab

The @code{excel_tab} class defines the usual properties of an Excel-generated
TAB-delimited file.  It is registered with the dialect name @code{'excel-tab'}.
@end deffn

@geindex unix_dialect (class in csv)
@anchor{library/csv csv unix_dialect}@anchor{1409}
@deffn {Class} csv.unix_dialect

The @code{unix_dialect} class defines the usual properties of a CSV file
generated on UNIX systems, i.e. using @code{'\n'} as line terminator and quoting
all fields.  It is registered with the dialect name @code{'unix'}.


Added in version 3.2.

@end deffn

@geindex Sniffer (class in csv)
@anchor{library/csv csv Sniffer}@anchor{2fc2}
@deffn {Class} csv.Sniffer

The @code{Sniffer} class is used to deduce the format of a CSV file.

The @code{Sniffer} class provides two methods:

@geindex sniff() (csv.Sniffer method)
@anchor{library/csv csv Sniffer sniff}@anchor{2fc3}
@deffn {Method} sniff (sample, delimiters=None)

Analyze the given `sample' and return a @ref{1871,,Dialect} subclass
reflecting the parameters found.  If the optional `delimiters' parameter
is given, it is interpreted as a string containing possible valid
delimiter characters.
@end deffn

@geindex has_header() (csv.Sniffer method)
@anchor{library/csv csv Sniffer has_header}@anchor{1c9a}
@deffn {Method} has_header (sample)

Analyze the sample text (presumed to be in CSV format) and return
@ref{e0d,,True} if the first row appears to be a series of column headers.
Inspecting each column, one of two key criteria will be considered to
estimate if the sample contains a header:


@itemize -

@item 
the second through n-th rows contain numeric values

@item 
the second through n-th rows contain strings where at least one value’s
length differs from that of the putative header of that column.
@end itemize

Twenty-one rows after the header are sampled; if more than half of the
columns + rows meet the criteria, @ref{e0d,,True} is returned.
@end deffn

@cartouche
@quotation Note 
This method is a rough heuristic and may produce both false positives and
negatives.
@end quotation
@end cartouche
@end deffn

An example for @ref{2fc2,,Sniffer} use:

@example
with open('example.csv', newline='@w{'}) as csvfile:
    dialect = csv.Sniffer().sniff(csvfile.read(1024))
    csvfile.seek(0)
    reader = csv.reader(csvfile, dialect)
    # ... process CSV file contents here ...
@end example
@anchor{library/csv csv-constants}@anchor{2fc4}
The @code{csv} module defines the following constants:

@geindex QUOTE_ALL (in module csv)
@anchor{library/csv csv QUOTE_ALL}@anchor{2fc5}
@deffn {Data} csv.QUOTE_ALL

Instructs @ref{6b0,,writer} objects to quote all fields.
@end deffn

@geindex QUOTE_MINIMAL (in module csv)
@anchor{library/csv csv QUOTE_MINIMAL}@anchor{2fc6}
@deffn {Data} csv.QUOTE_MINIMAL

Instructs @ref{6b0,,writer} objects to only quote those fields which contain
special characters such as `delimiter', `quotechar', @code{'\r'}, @code{'\n'}
or any of the characters in `lineterminator'.
@end deffn

@geindex QUOTE_NONNUMERIC (in module csv)
@anchor{library/csv csv QUOTE_NONNUMERIC}@anchor{198b}
@deffn {Data} csv.QUOTE_NONNUMERIC

Instructs @ref{6b0,,writer} objects to quote all non-numeric fields.

Instructs @ref{6af,,reader} objects to convert all non-quoted fields to type @ref{197,,float}.

@cartouche
@quotation Note 
Some numeric types, such as @ref{3c1,,bool}, @ref{215,,Fraction},
or @ref{ee1,,IntEnum}, have a string representation that cannot be
converted to @ref{197,,float}.
They cannot be read in the @code{QUOTE_NONNUMERIC} and
@ref{6ae,,QUOTE_STRINGS} modes.
@end quotation
@end cartouche
@end deffn

@geindex QUOTE_NONE (in module csv)
@anchor{library/csv csv QUOTE_NONE}@anchor{2fc7}
@deffn {Data} csv.QUOTE_NONE

Instructs @ref{6b0,,writer} objects to never quote fields.
When the current `delimiter', `quotechar', `escapechar', @code{'\r'}, @code{'\n'}
or any of the characters in `lineterminator' occurs in output data
it is preceded by the current `escapechar' character.
If `escapechar' is not set, the writer will raise @ref{2fbf,,Error} if
any characters that require escaping are encountered.
Set `quotechar' to @code{None} to prevent its escaping.

Instructs @ref{6af,,reader} objects to perform no special processing of quote characters.
@end deffn

@geindex QUOTE_NOTNULL (in module csv)
@anchor{library/csv csv QUOTE_NOTNULL}@anchor{6ad}
@deffn {Data} csv.QUOTE_NOTNULL

Instructs @ref{6b0,,writer} objects to quote all fields which are not
@code{None}.  This is similar to @ref{2fc5,,QUOTE_ALL}, except that if a
field value is @code{None} an empty (unquoted) string is written.

Instructs @ref{6af,,reader} objects to interpret an empty (unquoted) field
as @code{None} and to otherwise behave as @ref{2fc5,,QUOTE_ALL}.


Added in version 3.12.

@end deffn

@geindex QUOTE_STRINGS (in module csv)
@anchor{library/csv csv QUOTE_STRINGS}@anchor{6ae}
@deffn {Data} csv.QUOTE_STRINGS

Instructs @ref{6b0,,writer} objects to always place quotes around fields
which are strings.  This is similar to @ref{198b,,QUOTE_NONNUMERIC}, except that if a
field value is @code{None} an empty (unquoted) string is written.

Instructs @ref{6af,,reader} objects to interpret an empty (unquoted) string as @code{None} and
to otherwise behave as @ref{198b,,QUOTE_NONNUMERIC}.


Added in version 3.12.

@end deffn

The @code{csv} module defines the following exception:

@geindex Error
@anchor{library/csv csv Error}@anchor{2fbf}
@deffn {Exception} csv.Error

Raised by any of the functions when an error is detected.
@end deffn

@node Dialects and Formatting Parameters,Reader Objects,Module Contents<2>,csv — CSV File Reading and Writing
@anchor{library/csv csv-fmt-params}@anchor{2fbe}@anchor{library/csv dialects-and-formatting-parameters}@anchor{2fc8}
@subsubsection Dialects and Formatting Parameters


To make it easier to specify the format of input and output records, specific
formatting parameters are grouped together into dialects.  A dialect is a
subclass of the @ref{1871,,Dialect} class containing various attributes
describing the format of the CSV file.  When creating @ref{6af,,reader} or
@ref{6b0,,writer} objects, the programmer can specify a string or a subclass of
the @code{Dialect} class as the dialect parameter.  In addition to, or instead
of, the `dialect' parameter, the programmer can also specify individual
formatting parameters, which have the same names as the attributes defined below
for the @code{Dialect} class.

Dialects support the following attributes:

@geindex delimiter (csv.Dialect attribute)
@anchor{library/csv csv Dialect delimiter}@anchor{2fc9}
@deffn {Attribute} Dialect.delimiter

A one-character string used to separate fields.  It defaults to @code{','}.
@end deffn

@geindex doublequote (csv.Dialect attribute)
@anchor{library/csv csv Dialect doublequote}@anchor{2fca}
@deffn {Attribute} Dialect.doublequote

Controls how instances of `quotechar' appearing inside a field should
themselves be quoted.  When @ref{e0d,,True}, the character is doubled. When
@ref{d31,,False}, the `escapechar' is used as a prefix to the `quotechar'.  It
defaults to @code{True}.

On output, if `doublequote' is @ref{d31,,False} and no `escapechar' is set,
@ref{2fbf,,Error} is raised if a `quotechar' is found in a field.
@end deffn

@geindex escapechar (csv.Dialect attribute)
@anchor{library/csv csv Dialect escapechar}@anchor{2fcb}
@deffn {Attribute} Dialect.escapechar

A one-character string used by the writer to escape characters that
require escaping:

@quotation


@itemize *

@item 
the `delimiter', the `quotechar', @code{'\r'}, @code{'\n'} and any of the
characters in `lineterminator' are escaped if `quoting' is set to
@ref{2fc7,,QUOTE_NONE};

@item 
the `quotechar' is escaped if `doublequote' is @ref{d31,,False};

@item 
the `escapechar' itself.
@end itemize
@end quotation

On reading, the `escapechar' removes any special meaning from
the following character. It defaults to @ref{887,,None}, which disables escaping.


Changed in version 3.11: An empty `escapechar' is not allowed.

@end deffn

@geindex lineterminator (csv.Dialect attribute)
@anchor{library/csv csv Dialect lineterminator}@anchor{2fcc}
@deffn {Attribute} Dialect.lineterminator

The string used to terminate lines produced by the @ref{6b0,,writer}. It defaults
to @code{'\r\n'}.

@cartouche
@quotation Note 
The @ref{6af,,reader} is hard-coded to recognise either @code{'\r'} or @code{'\n'} as
end-of-line, and ignores `lineterminator'. This behavior may change in the
future.
@end quotation
@end cartouche
@end deffn

@geindex quotechar (csv.Dialect attribute)
@anchor{library/csv csv Dialect quotechar}@anchor{2fcd}
@deffn {Attribute} Dialect.quotechar

A one-character string used to quote fields containing special characters,
such as the `delimiter' or the `quotechar', or which contain new-line
characters (@code{'\r'}, @code{'\n'} or any of the characters in `lineterminator').
It defaults to @code{'"'}.
Can be set to @code{None} to prevent escaping @code{'"'} if `quoting' is set
to @ref{2fc7,,QUOTE_NONE}.


Changed in version 3.11: An empty `quotechar' is not allowed.

@end deffn

@geindex quoting (csv.Dialect attribute)
@anchor{library/csv csv Dialect quoting}@anchor{2fce}
@deffn {Attribute} Dialect.quoting

Controls when quotes should be generated by the writer and recognised by the
reader.  It can take on any of the @ref{2fc4,,QUOTE_* constants}
and defaults to @ref{2fc6,,QUOTE_MINIMAL} if `quotechar' is not @code{None},
and @ref{2fc7,,QUOTE_NONE} otherwise.
@end deffn

@geindex skipinitialspace (csv.Dialect attribute)
@anchor{library/csv csv Dialect skipinitialspace}@anchor{2fcf}
@deffn {Attribute} Dialect.skipinitialspace

When @ref{e0d,,True}, spaces immediately following the `delimiter' are ignored.
The default is @ref{d31,,False}.  When combining @code{delimiter=' '} with
@code{skipinitialspace=True}, unquoted empty fields are not allowed.
@end deffn

@geindex strict (csv.Dialect attribute)
@anchor{library/csv csv Dialect strict}@anchor{2fd0}
@deffn {Attribute} Dialect.strict

When @code{True}, raise exception @ref{2fbf,,Error} on bad CSV input.
The default is @code{False}.
@end deffn

@node Reader Objects,Writer Objects,Dialects and Formatting Parameters,csv — CSV File Reading and Writing
@anchor{library/csv id3}@anchor{2fd1}@anchor{library/csv reader-objects}@anchor{2fbd}
@subsubsection Reader Objects


Reader objects (@ref{bde,,DictReader} instances and objects returned by the
@ref{6af,,reader()} function) have the following public methods:

@geindex __next__() (csv.csvreader method)
@anchor{library/csv csv csvreader __next__}@anchor{2fd2}
@deffn {Method} csvreader.__next__ ()

Return the next row of the reader’s iterable object as a list (if the object
was returned from @ref{6af,,reader()}) or a dict (if it is a @ref{bde,,DictReader}
instance), parsed according to the current @ref{1871,,Dialect}.  Usually you
should call this as @code{next(reader)}.
@end deffn

Reader objects have the following public attributes:

@geindex dialect (csv.csvreader attribute)
@anchor{library/csv csv csvreader dialect}@anchor{2fd3}
@deffn {Attribute} csvreader.dialect

A read-only description of the dialect in use by the parser.
@end deffn

@geindex line_num (csv.csvreader attribute)
@anchor{library/csv csv csvreader line_num}@anchor{2fd4}
@deffn {Attribute} csvreader.line_num

The number of lines read from the source iterator. This is not the same as the
number of records returned, as records can span multiple lines.
@end deffn

DictReader objects have the following public attribute:

@geindex fieldnames (csv.DictReader attribute)
@anchor{library/csv csv DictReader fieldnames}@anchor{2fd5}
@deffn {Attribute} DictReader.fieldnames

If not passed as a parameter when creating the object, this attribute is
initialized upon first access or when the first record is read from the
file.
@end deffn

@node Writer Objects,Examples<11>,Reader Objects,csv — CSV File Reading and Writing
@anchor{library/csv writer-objects}@anchor{2fd6}
@subsubsection Writer Objects


@ref{6b0,,writer} objects (@ref{140a,,DictWriter} instances and objects returned by
the @ref{6b0,,writer()} function) have the following public methods.  A `row' must be
an iterable of strings or numbers for @code{writer} objects and a dictionary
mapping fieldnames to strings or numbers (by passing them through @ref{16a,,str()}
first) for @code{DictWriter} objects.  Note that complex numbers are written
out surrounded by parens. This may cause some problems for other programs which
read CSV files (assuming they support complex numbers at all).

@geindex writerow() (csv.csvwriter method)
@anchor{library/csv csv csvwriter writerow}@anchor{fef}
@deffn {Method} csvwriter.writerow (row, /)

Write the `row' parameter to the writer’s file object, formatted according
to the current @ref{1871,,Dialect}. Return the return value of the call to the
`write' method of the underlying file object.


Changed in version 3.5: Added support of arbitrary iterables.

@end deffn

@geindex writerows() (csv.csvwriter method)
@anchor{library/csv csv csvwriter writerows}@anchor{2fd7}
@deffn {Method} csvwriter.writerows (rows, /)

Write all elements in `rows' (an iterable of `row' objects as described
above) to the writer’s file object, formatted according to the current
dialect.
@end deffn

Writer objects have the following public attribute:

@geindex dialect (csv.csvwriter attribute)
@anchor{library/csv csv csvwriter dialect}@anchor{2fd8}
@deffn {Attribute} csvwriter.dialect

A read-only description of the dialect in use by the writer.
@end deffn

DictWriter objects have the following public method:

@geindex writeheader() (csv.DictWriter method)
@anchor{library/csv csv DictWriter writeheader}@anchor{140b}
@deffn {Method} DictWriter.writeheader ()

Write a row with the field names (as specified in the constructor) to
the writer’s file object, formatted according to the current dialect. Return
the return value of the @ref{fef,,csvwriter.writerow()} call used internally.


Added in version 3.2.



Changed in version 3.8: @code{writeheader()} now also returns the value returned by
the @ref{fef,,csvwriter.writerow()} method it uses internally.

@end deffn

@node Examples<11>,,Writer Objects,csv — CSV File Reading and Writing
@anchor{library/csv csv-examples}@anchor{2fd9}@anchor{library/csv examples}@anchor{2fda}
@subsubsection Examples


The simplest example of reading a CSV file:

@example
import csv
with open('some.csv', newline='@w{'}) as f:
    reader = csv.reader(f)
    for row in reader:
        print(row)
@end example

Reading a file with an alternate format:

@example
import csv
with open('passwd', newline='@w{'}) as f:
    reader = csv.reader(f, delimiter=':', quoting=csv.QUOTE_NONE)
    for row in reader:
        print(row)
@end example

The corresponding simplest possible writing example is:

@example
import csv
with open('some.csv', 'w', newline='@w{'}) as f:
    writer = csv.writer(f)
    writer.writerows(someiterable)
@end example

Since @ref{318,,open()} is used to open a CSV file for reading, the file
will by default be decoded into unicode using the system default
encoding (see @ref{867,,locale.getencoding()}).  To decode a file
using a different encoding, use the @code{encoding} argument of open:

@example
import csv
with open('some.csv', newline='@w{'}, encoding='utf-8') as f:
    reader = csv.reader(f)
    for row in reader:
        print(row)
@end example

The same applies to writing in something other than the system default
encoding: specify the encoding argument when opening the output file.

Registering a new dialect:

@example
import csv
csv.register_dialect('unixpwd', delimiter=':', quoting=csv.QUOTE_NONE)
with open('passwd', newline='@w{'}) as f:
    reader = csv.reader(f, 'unixpwd')
@end example

A slightly more advanced use of the reader — catching and reporting errors:

@example
import csv, sys
filename = 'some.csv'
with open(filename, newline='@w{'}) as f:
    reader = csv.reader(f)
    try:
        for row in reader:
            print(row)
    except csv.Error as e:
        sys.exit(f'file @{filename@}, line @{reader.line_num@}: @{e@}')
@end example

And while the module doesn’t directly support parsing strings, it can easily be
done:

@example
import csv
for row in csv.reader(['one,two,three']):
    print(row)
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node configparser — Configuration file parser,tomllib — Parse TOML files,csv — CSV File Reading and Writing,File Formats
@anchor{library/configparser doc}@anchor{2fdb}@anchor{library/configparser configparser-configuration-file-parser}@anchor{2fdc}@anchor{library/configparser module-configparser}@anchor{26}@anchor{library/configparser translation-repo}@anchor{2fdd}
@subsection @code{configparser} — Configuration file parser


@geindex module; configparser

`Source code:' Lib/configparser.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/configparser.py}

@geindex .ini; file
@geindex configuration; file
@geindex ini file
@geindex Windows ini file


__________________________________________________________________


This module provides the @ref{4df,,ConfigParser} class which implements a basic
configuration language which provides a structure similar to what’s found in
Microsoft Windows INI files.  You can use this to write Python programs which
can be customized by end users easily.

@cartouche
@quotation Note 
This library does `not' interpret or write the value-type prefixes used in
the Windows Registry extended version of INI syntax.
@end quotation
@end cartouche


@subsubheading See also



@table @asis

@item Module @ref{103,,tomllib}

TOML is a well-specified format for application configuration files.
It is specifically designed to be an improved version of INI.

@item Module @ref{c9,,shlex}

Support for creating Unix shell-like mini-languages which can also
be used for application configuration files.

@item Module @ref{86,,json}

The @code{json} module implements a subset of JavaScript syntax which is
sometimes used for configuration, but does not support comments.
@end table


@c import configparser

@c import os
@c os.remove("example.ini")
@c os.remove("override.ini")

@menu
* Quick Start:: 
* Supported Datatypes:: 
* Fallback Values:: 
* Supported INI File Structure:: 
* Unnamed Sections:: 
* Interpolation of values:: 
* Mapping Protocol Access:: 
* Customizing Parser Behaviour:: 
* Legacy API Examples:: 
* ConfigParser Objects:: 
* RawConfigParser Objects:: 
* Exceptions: Exceptions<9>. 

@end menu

@node Quick Start,Supported Datatypes,,configparser — Configuration file parser
@anchor{library/configparser quick-start}@anchor{2fde}
@subsubsection Quick Start


Let’s take a very basic configuration file that looks like this:

@example
[DEFAULT]
ServerAliveInterval = 45
Compression = yes
CompressionLevel = 9
ForwardX11 = yes

[forge.example]
User = hg

[topsecret.server.example]
Port = 50022
ForwardX11 = no
@end example

The structure of INI files is described @ref{2fdf,,in the following section}.  Essentially, the file
consists of sections, each of which contains keys with values.
@code{configparser} classes can read and write such files.  Let’s start by
creating the above configuration file programmatically.

@example
>>> import configparser
>>> config = configparser.ConfigParser()
>>> config['DEFAULT'] = @{'ServerAliveInterval': '45',
...                      'Compression': 'yes',
...                      'CompressionLevel': '9'@}
>>> config['forge.example'] = @{@}
>>> config['forge.example']['User'] = 'hg'
>>> config['topsecret.server.example'] = @{@}
>>> topsecret = config['topsecret.server.example']
>>> topsecret['Port'] = '50022'     # mutates the parser
>>> topsecret['ForwardX11'] = 'no'  # same here
>>> config['DEFAULT']['ForwardX11'] = 'yes'
>>> with open('example.ini', 'w') as configfile:
...   config.write(configfile)
...
@end example

As you can see, we can treat a config parser much like a dictionary.
There are differences, @ref{2fe0,,outlined later}, but
the behavior is very close to what you would expect from a dictionary.

Now that we have created and saved a configuration file, let’s read it
back and explore the data it holds.

@example
>>> config = configparser.ConfigParser()
>>> config.sections()
[]
>>> config.read('example.ini')
['example.ini']
>>> config.sections()
['forge.example', 'topsecret.server.example']
>>> 'forge.example' in config
True
>>> 'python.org' in config
False
>>> config['forge.example']['User']
'hg'
>>> config['DEFAULT']['Compression']
'yes'
>>> topsecret = config['topsecret.server.example']
>>> topsecret['ForwardX11']
'no'
>>> topsecret['Port']
'50022'
>>> for key in config['forge.example']:
...     print(key)
user
compressionlevel
serveraliveinterval
compression
forwardx11
>>> config['forge.example']['ForwardX11']
'yes'
@end example

As we can see above, the API is pretty straightforward.  The only bit of magic
involves the @code{DEFAULT} section which provides default values for all other
sections @footnote{
Config parsers allow for heavy customization.  If you are interested in
changing the behaviour outlined by the footnote reference, consult the
@ref{2fe1,,Customizing Parser Behaviour} section.
}.  Note also that keys in sections are
case-insensitive and stored in lowercase @footnote{
Config parsers allow for heavy customization.  If you are interested in
changing the behaviour outlined by the footnote reference, consult the
@ref{2fe1,,Customizing Parser Behaviour} section.
}.

It is possible to read several configurations into a single
@ref{4df,,ConfigParser}, where the most recently added configuration has the
highest priority. Any conflicting keys are taken from the more recent
configuration while the previously existing keys are retained. The example
below reads in an @code{override.ini} file, which will override any conflicting
keys from the @code{example.ini} file.

@example
[DEFAULT]
ServerAliveInterval = -1
@end example

@example
>>> config_override = configparser.ConfigParser()
>>> config_override['DEFAULT'] = @{'ServerAliveInterval': '-1'@}
>>> with open('override.ini', 'w') as configfile:
...     config_override.write(configfile)
...
>>> config_override = configparser.ConfigParser()
>>> config_override.read(['example.ini', 'override.ini'])
['example.ini', 'override.ini']
>>> print(config_override.get('DEFAULT', 'ServerAliveInterval'))
-1
@end example

This behaviour is equivalent to a @ref{1674,,ConfigParser.read()} call with several
files passed to the `filenames' parameter.

@node Supported Datatypes,Fallback Values,Quick Start,configparser — Configuration file parser
@anchor{library/configparser supported-datatypes}@anchor{2fe2}
@subsubsection Supported Datatypes


Config parsers do not guess datatypes of values in configuration files, always
storing them internally as strings.  This means that if you need other
datatypes, you should convert on your own:

@example
>>> int(topsecret['Port'])
50022
>>> float(topsecret['CompressionLevel'])
9.0
@end example

Since this task is so common, config parsers provide a range of handy getter
methods to handle integers, floats and booleans.  The last one is the most
interesting because simply passing the value to @code{bool()} would do no good
since @code{bool('False')} is still @code{True}.  This is why config parsers also
provide @ref{2fe3,,getboolean()}.  This method is case-insensitive and
recognizes Boolean values from @code{'yes'}/@code{'no'}, @code{'on'}/@code{'off'},
@code{'true'}/@code{'false'} and @code{'1'}/@code{'0'} @footnote{
Config parsers allow for heavy customization.  If you are interested in
changing the behaviour outlined by the footnote reference, consult the
@ref{2fe1,,Customizing Parser Behaviour} section.
}.  For example:

@example
>>> topsecret.getboolean('ForwardX11')
False
>>> config['forge.example'].getboolean('ForwardX11')
True
>>> config.getboolean('forge.example', 'Compression')
True
@end example

Apart from @ref{2fe3,,getboolean()}, config parsers also
provide equivalent @ref{2fe4,,getint()} and
@ref{2fe5,,getfloat()} methods.  You can register your own
converters and customize the provided ones. @footnote{
Config parsers allow for heavy customization.  If you are interested in
changing the behaviour outlined by the footnote reference, consult the
@ref{2fe1,,Customizing Parser Behaviour} section.
}

@node Fallback Values,Supported INI File Structure,Supported Datatypes,configparser — Configuration file parser
@anchor{library/configparser fallback-values}@anchor{2fe6}
@subsubsection Fallback Values


As with a dictionary, you can use a section’s @ref{1477,,get()} method to
provide fallback values:

@example
>>> topsecret.get('Port')
'50022'
>>> topsecret.get('CompressionLevel')
'9'
>>> topsecret.get('Cipher')
>>> topsecret.get('Cipher', '3des-cbc')
'3des-cbc'
@end example

Please note that default values have precedence over fallback values.
For instance, in our example the @code{'CompressionLevel'} key was
specified only in the @code{'DEFAULT'} section.  If we try to get it from
the section @code{'topsecret.server.example'}, we will always get the default,
even if we specify a fallback:

@example
>>> topsecret.get('CompressionLevel', '3')
'9'
@end example

One more thing to be aware of is that the parser-level @ref{1477,,get()} method
provides a custom, more complex interface, maintained for backwards
compatibility.  When using this method, a fallback value can be provided via
the @code{fallback} keyword-only argument:

@example
>>> config.get('forge.example', 'monster',
...            fallback='No such things as monsters')
'No such things as monsters'
@end example

The same @code{fallback} argument can be used with the
@ref{2fe4,,getint()}, @ref{2fe5,,getfloat()} and
@ref{2fe3,,getboolean()} methods, for example:

@example
>>> 'BatchMode' in topsecret
False
>>> topsecret.getboolean('BatchMode', fallback=True)
True
>>> config['DEFAULT']['BatchMode'] = 'no'
>>> topsecret.getboolean('BatchMode', fallback=True)
False
@end example

@node Supported INI File Structure,Unnamed Sections,Fallback Values,configparser — Configuration file parser
@anchor{library/configparser supported-ini-file-structure}@anchor{2fdf}
@subsubsection Supported INI File Structure


A configuration file consists of sections, each led by a @code{[section]} header,
followed by key/value entries separated by a specific string (@code{=} or @code{:} by
default @footnote{
Config parsers allow for heavy customization.  If you are interested in
changing the behaviour outlined by the footnote reference, consult the
@ref{2fe1,,Customizing Parser Behaviour} section.
}).  By default, section names are case sensitive but keys are not
@footnote{
Config parsers allow for heavy customization.  If you are interested in
changing the behaviour outlined by the footnote reference, consult the
@ref{2fe1,,Customizing Parser Behaviour} section.
}.  Leading and trailing whitespace is removed from keys and values.
Values can be omitted if the parser is configured to allow it @footnote{
Config parsers allow for heavy customization.  If you are interested in
changing the behaviour outlined by the footnote reference, consult the
@ref{2fe1,,Customizing Parser Behaviour} section.
},
in which case the key/value delimiter may also be left
out.  Values can also span multiple lines, as long as they are indented deeper
than the first line of the value.  Depending on the parser’s mode, blank lines
may be treated as parts of multiline values or ignored.

By default, a valid section name can be any string that does not contain ‘\n’.
To change this, see @ref{2fe7,,ConfigParser.SECTCRE}.

The first section name may be omitted if the parser is configured to allow an
unnamed top level section with @code{allow_unnamed_section=True}. In this case,
the keys/values may be retrieved by @ref{17dc,,UNNAMED_SECTION} as in
@code{config[UNNAMED_SECTION]}.

Configuration files may include comments, prefixed by specific
characters (@code{#} and @code{;} by default @footnote{
Config parsers allow for heavy customization.  If you are interested in
changing the behaviour outlined by the footnote reference, consult the
@ref{2fe1,,Customizing Parser Behaviour} section.
}).  Comments may appear on
their own on an otherwise empty line, possibly indented. @footnote{
Config parsers allow for heavy customization.  If you are interested in
changing the behaviour outlined by the footnote reference, consult the
@ref{2fe1,,Customizing Parser Behaviour} section.
}

For example:

@example
[Simple Values]
key=value
spaces in keys=allowed
spaces in values=allowed as well
spaces around the delimiter = obviously
you can also use : to delimit keys from values

[All Values Are Strings]
values like this: 1000000
or this: 3.14159265359
are they treated as numbers? : no
integers, floats and booleans are held as: strings
can use the API to get converted values directly: true

[Multiline Values]
chorus: I'm a lumberjack, and I'm okay
    I sleep all night and I work all day

[No Values]
key_without_value
empty string value here =

[You can use comments]
# like this
; or this

# By default only in an empty line.
# Inline comments can be harmful because they prevent users
# from using the delimiting characters as parts of values.
# That being said, this can be customized.

    [Sections Can Be Indented]
        can_values_be_as_well = True
        does_that_mean_anything_special = False
        purpose = formatting for readability
        multiline_values = are
            handled just fine as
            long as they are indented
            deeper than the first line
            of a value
        # Did I mention we can indent comments, too?
@end example

@node Unnamed Sections,Interpolation of values,Supported INI File Structure,configparser — Configuration file parser
@anchor{library/configparser id10}@anchor{2fe8}@anchor{library/configparser unnamed-sections}@anchor{2fe9}
@subsubsection Unnamed Sections


The name of the first section (or unique) may be omitted and values
retrieved by the @ref{17dc,,UNNAMED_SECTION} attribute.

@example
>>> config = """
... option = value
...
... [  Section 2  ]
... another = val
... """
>>> unnamed = configparser.ConfigParser(allow_unnamed_section=True)
>>> unnamed.read_string(config)
>>> unnamed.get(configparser.UNNAMED_SECTION, 'option')
'value'
@end example

@node Interpolation of values,Mapping Protocol Access,Unnamed Sections,configparser — Configuration file parser
@anchor{library/configparser interpolation-of-values}@anchor{2fea}
@subsubsection Interpolation of values


On top of the core functionality, @ref{4df,,ConfigParser} supports
interpolation.  This means values can be preprocessed before returning them
from @code{get()} calls.

@geindex % (percent); interpolation in configuration files

@geindex BasicInterpolation (class in configparser)
@anchor{library/configparser configparser BasicInterpolation}@anchor{92e}
@deffn {Class} configparser.BasicInterpolation

The default implementation used by @ref{4df,,ConfigParser}.  It enables
values to contain format strings which refer to other values in the same
section, or values in the special default section @footnote{
Config parsers allow for heavy customization.  If you are interested in
changing the behaviour outlined by the footnote reference, consult the
@ref{2fe1,,Customizing Parser Behaviour} section.
}.  Additional default
values can be provided on initialization.

For example:

@example
[Paths]
home_dir: /Users
my_dir: %(home_dir)s/lumberjack
my_pictures: %(my_dir)s/Pictures

[Escape]
# use a %% to escape the % sign (% is the only character that needs to be escaped):
gain: 80%%
@end example

In the example above, @ref{4df,,ConfigParser} with `interpolation' set to
@code{BasicInterpolation()} would resolve @code{%(home_dir)s} to the value of
@code{home_dir} (@code{/Users} in this case).  @code{%(my_dir)s} in effect would
resolve to @code{/Users/lumberjack}.  All interpolations are done on demand so
keys used in the chain of references do not have to be specified in any
specific order in the configuration file.

With @code{interpolation} set to @code{None}, the parser would simply return
@code{%(my_dir)s/Pictures} as the value of @code{my_pictures} and
@code{%(home_dir)s/lumberjack} as the value of @code{my_dir}.
@end deffn

@geindex $ (dollar); interpolation in configuration files

@geindex ExtendedInterpolation (class in configparser)
@anchor{library/configparser configparser ExtendedInterpolation}@anchor{92f}
@deffn {Class} configparser.ExtendedInterpolation

An alternative handler for interpolation which implements a more advanced
syntax, used for instance in @code{zc.buildout}.  Extended interpolation is
using @code{$@{section:option@}} to denote a value from a foreign section.
Interpolation can span multiple levels.  For convenience, if the
@code{section:} part is omitted, interpolation defaults to the current section
(and possibly the default values from the special section).

For example, the configuration specified above with basic interpolation,
would look like this with extended interpolation:

@example
[Paths]
home_dir: /Users
my_dir: $@{home_dir@}/lumberjack
my_pictures: $@{my_dir@}/Pictures

[Escape]
# use a $$ to escape the $ sign ($ is the only character that needs to be escaped):
cost: $$80
@end example

Values from other sections can be fetched as well:

@example
[Common]
home_dir: /Users
library_dir: /Library
system_dir: /System
macports_dir: /opt/local

[Frameworks]
Python: 3.2
path: $@{Common:system_dir@}/Library/Frameworks/

[Arthur]
nickname: Two Sheds
last_name: Jackson
my_dir: $@{Common:home_dir@}/twosheds
my_pictures: $@{my_dir@}/Pictures
python_dir: $@{Frameworks:path@}/Python/Versions/$@{Frameworks:Python@}
@end example
@end deffn

@node Mapping Protocol Access,Customizing Parser Behaviour,Interpolation of values,configparser — Configuration file parser
@anchor{library/configparser mapping-protocol-access}@anchor{2fe0}
@subsubsection Mapping Protocol Access



Added in version 3.2.


Mapping protocol access is a generic name for functionality that enables using
custom objects as if they were dictionaries.  In case of @code{configparser},
the mapping interface implementation is using the
@code{parser['section']['option']} notation.

@code{parser['section']} in particular returns a proxy for the section’s data in
the parser.  This means that the values are not copied but they are taken from
the original parser on demand.  What’s even more important is that when values
are changed on a section proxy, they are actually mutated in the original
parser.

@code{configparser} objects behave as close to actual dictionaries as possible.
The mapping interface is complete and adheres to the
@ref{12b8,,MutableMapping} ABC.
However, there are a few differences that should be taken into account:


@itemize *

@item 
By default, all keys in sections are accessible in a case-insensitive manner
@footnote{
Config parsers allow for heavy customization.  If you are interested in
changing the behaviour outlined by the footnote reference, consult the
@ref{2fe1,,Customizing Parser Behaviour} section.
}.  E.g. @code{for option in parser["section"]} yields only @code{optionxform}’ed
option key names.  This means lowercased keys by default.  At the same time,
for a section that holds the key @code{'a'}, both expressions return @code{True}:

@example
"a" in parser["section"]
"A" in parser["section"]
@end example

@item 
All sections include @code{DEFAULTSECT} values as well which means that
@code{.clear()} on a section may not leave the section visibly empty.  This is
because default values cannot be deleted from the section (because technically
they are not there).  If they are overridden in the section, deleting causes
the default value to be visible again.  Trying to delete a default value
causes a @ref{5e7,,KeyError}.

@item 
@code{DEFAULTSECT} cannot be removed from the parser:


@itemize *

@item 
trying to delete it raises @ref{2ee,,ValueError},

@item 
@code{parser.clear()} leaves it intact,

@item 
@code{parser.popitem()} never returns it.
@end itemize

@item 
@code{parser.get(section, option, **kwargs)} - the second argument is `not'
a fallback value.  Note however that the section-level @code{get()} methods are
compatible both with the mapping protocol and the classic configparser API.

@item 
@code{parser.items()} is compatible with the mapping protocol (returns a list of
`section_name', `section_proxy' pairs including the DEFAULTSECT).  However,
this method can also be invoked with arguments: @code{parser.items(section, raw,
vars)}.  The latter call returns a list of `option', `value' pairs for
a specified @code{section}, with all interpolations expanded (unless
@code{raw=True} is provided).
@end itemize

The mapping protocol is implemented on top of the existing legacy API so that
subclasses overriding the original interface still should have mappings working
as expected.

@node Customizing Parser Behaviour,Legacy API Examples,Mapping Protocol Access,configparser — Configuration file parser
@anchor{library/configparser customizing-parser-behaviour}@anchor{2fe1}
@subsubsection Customizing Parser Behaviour


There are nearly as many INI format variants as there are applications using it.
@code{configparser} goes a long way to provide support for the largest sensible
set of INI styles available.  The default functionality is mainly dictated by
historical background and it’s very likely that you will want to customize some
of the features.

The most common way to change the way a specific config parser works is to use
the @code{__init__()} options:


@itemize *

@item 
`defaults', default value: @code{None}

This option accepts a dictionary of key-value pairs which will be initially
put in the @code{DEFAULT} section.  This makes for an elegant way to support
concise configuration files that don’t specify values which are the same as
the documented default.

Hint: if you want to specify default values for a specific section, use
@ref{2feb,,read_dict()} before you read the actual file.

@item 
`dict_type', default value: @ref{184,,dict}

This option has a major impact on how the mapping protocol will behave and how
the written configuration files look.  With the standard dictionary, every
section is stored in the order they were added to the parser.  Same goes for
options within sections.

An alternative dictionary type can be used for example to sort sections and
options on write-back.

Please note: there are ways to add a set of key-value pairs in a single
operation.  When you use a regular dictionary in those operations, the order
of the keys will be ordered.  For example:

@example
>>> parser = configparser.ConfigParser()
>>> parser.read_dict(@{'section1': @{'key1': 'value1',
...                                'key2': 'value2',
...                                'key3': 'value3'@},
...                   'section2': @{'keyA': 'valueA',
...                                'keyB': 'valueB',
...                                'keyC': 'valueC'@},
...                   'section3': @{'foo': 'x',
...                                'bar': 'y',
...                                'baz': 'z'@}
... @})
>>> parser.sections()
['section1', 'section2', 'section3']
>>> [option for option in parser['section3']]
['foo', 'bar', 'baz']
@end example

@item 
`allow_no_value', default value: @code{False}

Some configuration files are known to include settings without values, but
which otherwise conform to the syntax supported by @code{configparser}.  The
`allow_no_value' parameter to the constructor can be used to
indicate that such values should be accepted:

@example
>>> import configparser

>>> sample_config = """
... [mysqld]
...   user = mysql
...   pid-file = /var/run/mysqld/mysqld.pid
...   skip-external-locking
...   old_passwords = 1
...   skip-bdb
...   # we don't need ACID today
...   skip-innodb
... """
>>> config = configparser.ConfigParser(allow_no_value=True)
>>> config.read_string(sample_config)

>>> # Settings with values are treated as before:
>>> config["mysqld"]["user"]
'mysql'

>>> # Settings without values provide None:
>>> config["mysqld"]["skip-bdb"]

>>> # Settings which aren't specified still raise an error:
>>> config["mysqld"]["does-not-exist"]
Traceback (most recent call last):
  ...
KeyError: 'does-not-exist'
@end example

@item 
`delimiters', default value: @code{('=', ':')}

Delimiters are substrings that delimit keys from values within a section.
The first occurrence of a delimiting substring on a line is considered
a delimiter.  This means values (but not keys) can contain the delimiters.

See also the `space_around_delimiters' argument to
@ref{1e0,,ConfigParser.write()}.

@item 
`comment_prefixes', default value: @code{('#', ';')}

@item 
`inline_comment_prefixes', default value: @code{None}

Comment prefixes are strings that indicate the start of a valid comment within
a config file. `comment_prefixes' are used only on otherwise empty lines
(optionally indented) whereas `inline_comment_prefixes' can be used after
every valid value (e.g. section names, options and empty lines as well).  By
default inline comments are disabled and @code{'#'} and @code{';'} are used as
prefixes for whole line comments.


Changed in version 3.2: In previous versions of @code{configparser} behaviour matched
@code{comment_prefixes=('#',';')} and @code{inline_comment_prefixes=(';',)}.


Please note that config parsers don’t support escaping of comment prefixes so
using `inline_comment_prefixes' may prevent users from specifying option
values with characters used as comment prefixes.  When in doubt, avoid
setting `inline_comment_prefixes'.  In any circumstances, the only way of
storing comment prefix characters at the beginning of a line in multiline
values is to interpolate the prefix, for example:

@example
>>> from configparser import ConfigParser, ExtendedInterpolation
>>> parser = ConfigParser(interpolation=ExtendedInterpolation())
>>> # the default BasicInterpolation could be used as well
>>> parser.read_string("""
... [DEFAULT]
... hash = #
...
... [hashes]
... shebang =
...   $@{hash@}!/usr/bin/env python
...   $@{hash@} -*- coding: utf-8 -*-
...
... extensions =
...   enabled_extension
...   another_extension
...   #disabled_by_comment
...   yet_another_extension
...
... interpolation not necessary = if # is not at line start
... even in multiline values = line #1
...   line #2
...   line #3
... """)
>>> print(parser['hashes']['shebang'])

#!/usr/bin/env python
# -*- coding: utf-8 -*-
>>> print(parser['hashes']['extensions'])

enabled_extension
another_extension
yet_another_extension
>>> print(parser['hashes']['interpolation not necessary'])
if # is not at line start
>>> print(parser['hashes']['even in multiline values'])
line #1
line #2
line #3
@end example

@item 
`strict', default value: @code{True}

When set to @code{True}, the parser will not allow for any section or option
duplicates while reading from a single source (using @ref{72b,,read_file()},
@ref{2fec,,read_string()} or @ref{2feb,,read_dict()}).  It is recommended to use strict
parsers in new applications.


Changed in version 3.2: In previous versions of @code{configparser} behaviour matched
@code{strict=False}.


@item 
`empty_lines_in_values', default value: @code{True}

In config parsers, values can span multiple lines as long as they are
indented more than the key that holds them.  By default parsers also let
empty lines to be parts of values.  At the same time, keys can be arbitrarily
indented themselves to improve readability.  In consequence, when
configuration files get big and complex, it is easy for the user to lose
track of the file structure.  Take for instance:

@example
[Section]
key = multiline
  value with a gotcha

 this = is still a part of the multiline value of 'key'
@end example

This can be especially problematic for the user to see if she’s using a
proportional font to edit the file.  That is why when your application does
not need values with empty lines, you should consider disallowing them.  This
will make empty lines split keys every time.  In the example above, it would
produce two keys, @code{key} and @code{this}.

@item 
`default_section', default value: @code{configparser.DEFAULTSECT} (that is:
@code{"DEFAULT"})

The convention of allowing a special section of default values for other
sections or interpolation purposes is a powerful concept of this library,
letting users create complex declarative configurations.  This section is
normally called @code{"DEFAULT"} but this can be customized to point to any
other valid section name.  Some typical values include: @code{"general"} or
@code{"common"}.  The name provided is used for recognizing default sections
when reading from any source and is used when writing configuration back to
a file.  Its current value can be retrieved using the
@code{parser_instance.default_section} attribute and may be modified at runtime
(i.e. to convert files from one format to another).

@item 
`interpolation', default value: @code{configparser.BasicInterpolation}

Interpolation behaviour may be customized by providing a custom handler
through the `interpolation' argument. @code{None} can be used to turn off
interpolation completely, @code{ExtendedInterpolation()} provides a more
advanced variant inspired by @code{zc.buildout}.  More on the subject in the
@ref{2fea,,dedicated documentation section}.
@ref{116a,,RawConfigParser} has a default value of @code{None}.

@item 
`converters', default value: not set

Config parsers provide option value getters that perform type conversion.  By
default @ref{2fe4,,getint()}, @ref{2fe5,,getfloat()}, and
@ref{2fe3,,getboolean()} are implemented.  Should other getters be
desirable, users may define them in a subclass or pass a dictionary where each
key is a name of the converter and each value is a callable implementing said
conversion.  For instance, passing @code{@{'decimal': decimal.Decimal@}} would add
@code{getdecimal()} on both the parser object and all section proxies.  In
other words, it will be possible to write both
@code{parser_instance.getdecimal('section', 'key', fallback=0)} and
@code{parser_instance['section'].getdecimal('key', 0)}.

If the converter needs to access the state of the parser, it can be
implemented as a method on a config parser subclass.  If the name of this
method starts with @code{get}, it will be available on all section proxies, in
the dict-compatible form (see the @code{getdecimal()} example above).
@end itemize

More advanced customization may be achieved by overriding default values of
these parser attributes.  The defaults are defined on the classes, so they may
be overridden by subclasses or by attribute assignment.

@geindex BOOLEAN_STATES (configparser.ConfigParser attribute)
@anchor{library/configparser configparser ConfigParser BOOLEAN_STATES}@anchor{2fed}
@deffn {Attribute} ConfigParser.BOOLEAN_STATES

By default when using @ref{2fe3,,getboolean()}, config parsers
consider the following values @code{True}: @code{'1'}, @code{'yes'}, @code{'true'},
@code{'on'} and the following values @code{False}: @code{'0'}, @code{'no'}, @code{'false'},
@code{'off'}.  You can override this by specifying a custom dictionary of strings
and their Boolean outcomes. For example:

@example
>>> custom = configparser.ConfigParser()
>>> custom['section1'] = @{'funky': 'nope'@}
>>> custom['section1'].getboolean('funky')
Traceback (most recent call last):
...
ValueError: Not a boolean: nope
>>> custom.BOOLEAN_STATES = @{'sure': True, 'nope': False@}
>>> custom['section1'].getboolean('funky')
False
@end example

Other typical Boolean pairs include @code{accept}/@code{reject} or
@code{enabled}/@code{disabled}.
@end deffn


@deffn {Method} ConfigParser.optionxform (option)

This method transforms option names on every read, get, or set
operation.  The default converts the name to lowercase.  This also
means that when a configuration file gets written, all keys will be
lowercase.  Override this method if that’s unsuitable.
For example:

@example
>>> config = """
... [Section1]
... Key = Value
...
... [Section2]
... AnotherKey = Value
... """
>>> typical = configparser.ConfigParser()
>>> typical.read_string(config)
>>> list(typical['Section1'].keys())
['key']
>>> list(typical['Section2'].keys())
['anotherkey']
>>> custom = configparser.RawConfigParser()
>>> custom.optionxform = lambda option: option
>>> custom.read_string(config)
>>> list(custom['Section1'].keys())
['Key']
>>> list(custom['Section2'].keys())
['AnotherKey']
@end example

@cartouche
@quotation Note 
The optionxform function transforms option names to a canonical form.
This should be an idempotent function: if the name is already in
canonical form, it should be returned unchanged.
@end quotation
@end cartouche
@end deffn

@geindex SECTCRE (configparser.ConfigParser attribute)
@anchor{library/configparser configparser ConfigParser SECTCRE}@anchor{2fe7}
@deffn {Attribute} ConfigParser.SECTCRE

A compiled regular expression used to parse section headers.  The default
matches @code{[section]} to the name @code{"section"}.  Whitespace is considered
part of the section name, thus @code{[  larch  ]} will be read as a section of
name @code{"  larch  "}.  Override this attribute if that’s unsuitable.  For
example:

@example
>>> import re
>>> config = """
... [Section 1]
... option = value
...
... [  Section 2  ]
... another = val
... """
>>> typical = configparser.ConfigParser()
>>> typical.read_string(config)
>>> typical.sections()
['Section 1', '  Section 2  ']
>>> custom = configparser.ConfigParser()
>>> custom.SECTCRE = re.compile(r"\[ *(?P<header>[^]]+?) *\]")
>>> custom.read_string(config)
>>> custom.sections()
['Section 1', 'Section 2']
@end example

@cartouche
@quotation Note 
While ConfigParser objects also use an @code{OPTCRE} attribute for recognizing
option lines, it’s not recommended to override it because that would
interfere with constructor options `allow_no_value' and `delimiters'.
@end quotation
@end cartouche
@end deffn

@node Legacy API Examples,ConfigParser Objects,Customizing Parser Behaviour,configparser — Configuration file parser
@anchor{library/configparser legacy-api-examples}@anchor{2fee}
@subsubsection Legacy API Examples


Mainly because of backwards compatibility concerns, @code{configparser}
provides also a legacy API with explicit @code{get}/@code{set} methods.  While there
are valid use cases for the methods outlined below, mapping protocol access is
preferred for new projects.  The legacy API is at times more advanced,
low-level and downright counterintuitive.

An example of writing to a configuration file:

@example
import configparser

config = configparser.RawConfigParser()

# Please note that using RawConfigParser's set functions, you can assign
# non-string values to keys internally, but will receive an error when
# attempting to write to a file or when you get it in non-raw mode. Setting
# values using the mapping protocol or ConfigParser's set() does not allow
# such assignments to take place.
config.add_section('Section1')
config.set('Section1', 'an_int', '15')
config.set('Section1', 'a_bool', 'true')
config.set('Section1', 'a_float', '3.1415')
config.set('Section1', 'baz', 'fun')
config.set('Section1', 'bar', 'Python')
config.set('Section1', 'foo', '%(bar)s is %(baz)s!')

# Writing our configuration file to 'example.cfg'
with open('example.cfg', 'w') as configfile:
    config.write(configfile)
@end example

An example of reading the configuration file again:

@example
import configparser

config = configparser.RawConfigParser()
config.read('example.cfg')

# getfloat() raises an exception if the value is not a float
# getint() and getboolean() also do this for their respective types
a_float = config.getfloat('Section1', 'a_float')
an_int = config.getint('Section1', 'an_int')
print(a_float + an_int)

# Notice that the next output does not interpolate '%(bar)s' or '%(baz)s'.
# This is because we are using a RawConfigParser().
if config.getboolean('Section1', 'a_bool'):
    print(config.get('Section1', 'foo'))
@end example

To get interpolation, use @ref{4df,,ConfigParser}:

@example
import configparser

cfg = configparser.ConfigParser()
cfg.read('example.cfg')

# Set the optional *raw* argument of get() to True if you wish to disable
# interpolation in a single get operation.
print(cfg.get('Section1', 'foo', raw=False))  # -> "Python is fun!"
print(cfg.get('Section1', 'foo', raw=True))   # -> "%(bar)s is %(baz)s!"

# The optional *vars* argument is a dict with members that will take
# precedence in interpolation.
print(cfg.get('Section1', 'foo', vars=@{'bar': 'Documentation',
                                       'baz': 'evil'@}))

# The optional *fallback* argument can be used to provide a fallback value
print(cfg.get('Section1', 'foo'))
      # -> "Python is fun!"

print(cfg.get('Section1', 'foo', fallback='Monty is not.'))
      # -> "Python is fun!"

print(cfg.get('Section1', 'monster', fallback='No such things as monsters.'))
      # -> "No such things as monsters."

# A bare print(cfg.get('Section1', 'monster')) would raise NoOptionError
# but we can also use:

print(cfg.get('Section1', 'monster', fallback=None))
      # -> None
@end example

Default values are available in both types of ConfigParsers.  They are used in
interpolation if an option used is not defined elsewhere.

@example
import configparser

# New instance with 'bar' and 'baz' defaulting to 'Life' and 'hard' each
config = configparser.ConfigParser(@{'bar': 'Life', 'baz': 'hard'@})
config.read('example.cfg')

print(config.get('Section1', 'foo'))     # -> "Python is fun!"
config.remove_option('Section1', 'bar')
config.remove_option('Section1', 'baz')
print(config.get('Section1', 'foo'))     # -> "Life is hard!"
@end example

@node ConfigParser Objects,RawConfigParser Objects,Legacy API Examples,configparser — Configuration file parser
@anchor{library/configparser configparser-objects}@anchor{2fef}@anchor{library/configparser id13}@anchor{2ff0}
@subsubsection ConfigParser Objects


@geindex ConfigParser (class in configparser)
@anchor{library/configparser configparser ConfigParser}@anchor{4df}
@deffn {Class} configparser.ConfigParser (defaults=None, dict_type=dict, allow_no_value=False, *, delimiters=('=', ':'), comment_prefixes=('#', ';'), inline_comment_prefixes=None, strict=True, empty_lines_in_values=True, default_section=configparser.DEFAULTSECT, interpolation=BasicInterpolation(), converters=@{@}, allow_unnamed_section=False)

The main configuration parser.  When `defaults' is given, it is initialized
into the dictionary of intrinsic defaults.  When `dict_type' is given, it
will be used to create the dictionary objects for the list of sections, for
the options within a section, and for the default values.

When `delimiters' is given, it is used as the set of substrings that
divide keys from values.  When `comment_prefixes' is given, it will be used
as the set of substrings that prefix comments in otherwise empty lines.
Comments can be indented.  When `inline_comment_prefixes' is given, it will
be used as the set of substrings that prefix comments in non-empty lines.

When `strict' is @code{True} (the default), the parser won’t allow for
any section or option duplicates while reading from a single source (file,
string or dictionary), raising @ref{147a,,DuplicateSectionError} or
@ref{147b,,DuplicateOptionError}.  When `empty_lines_in_values' is @code{False}
(default: @code{True}), each empty line marks the end of an option.  Otherwise,
internal empty lines of a multiline option are kept as part of the value.
When `allow_no_value' is @code{True} (default: @code{False}), options without
values are accepted; the value held for these is @code{None} and they are
serialized without the trailing delimiter.

When `default_section' is given, it specifies the name for the special
section holding default values for other sections and interpolation purposes
(normally named @code{"DEFAULT"}).  This value can be retrieved and changed at
runtime using the @code{default_section} instance attribute. This won’t
re-evaluate an already parsed config file, but will be used when writing
parsed settings to a new config file.

Interpolation behaviour may be customized by providing a custom handler
through the `interpolation' argument. @code{None} can be used to turn off
interpolation completely, @code{ExtendedInterpolation()} provides a more
advanced variant inspired by @code{zc.buildout}.  More on the subject in the
@ref{2fea,,dedicated documentation section}.

All option names used in interpolation will be passed through the
@ref{2ff1,,optionxform()} method just like any other option name reference.  For
example, using the default implementation of @code{optionxform()} (which
converts option names to lower case), the values @code{foo %(bar)s} and @code{foo
%(BAR)s} are equivalent.

When `converters' is given, it should be a dictionary where each key
represents the name of a type converter and each value is a callable
implementing the conversion from string to the desired datatype.  Every
converter gets its own corresponding @code{get*()} method on the parser
object and section proxies.

When `allow_unnamed_section' is @code{True} (default: @code{False}),
the first section name can be omitted. See the
@ref{2fe9,,"Unnamed Sections" section}.

It is possible to read several configurations into a single
@code{ConfigParser}, where the most recently added configuration has the
highest priority. Any conflicting keys are taken from the more recent
configuration while the previously existing keys are retained. The example
below reads in an @code{override.ini} file, which will override any conflicting
keys from the @code{example.ini} file.

@example
[DEFAULT]
ServerAliveInterval = -1
@end example

@example
>>> config_override = configparser.ConfigParser()
>>> config_override['DEFAULT'] = @{'ServerAliveInterval': '-1'@}
>>> with open('override.ini', 'w') as configfile:
...     config_override.write(configfile)
...
>>> config_override = configparser.ConfigParser()
>>> config_override.read(['example.ini', 'override.ini'])
['example.ini', 'override.ini']
>>> print(config_override.get('DEFAULT', 'ServerAliveInterval'))
-1
@end example


Changed in version 3.1: The default `dict_type' is @ref{7f4,,collections.OrderedDict}.



Changed in version 3.2: `allow_no_value', `delimiters', `comment_prefixes', `strict',
`empty_lines_in_values', `default_section' and `interpolation' were
added.



Changed in version 3.5: The `converters' argument was added.



Changed in version 3.7: The `defaults' argument is read with @ref{2feb,,read_dict()},
providing consistent behavior across the parser: non-string
keys and values are implicitly converted to strings.



Changed in version 3.8: The default `dict_type' is @ref{184,,dict}, since it now preserves
insertion order.



Changed in version 3.13: Raise a @ref{2ff2,,MultilineContinuationError} when `allow_no_value' is
@code{True}, and a key without a value is continued with an indented line.



Changed in version 3.13: The `allow_unnamed_section' argument was added.


@geindex defaults() (configparser.ConfigParser method)
@anchor{library/configparser configparser ConfigParser defaults}@anchor{2ff3}
@deffn {Method} defaults ()

Return a dictionary containing the instance-wide defaults.
@end deffn

@geindex sections() (configparser.ConfigParser method)
@anchor{library/configparser configparser ConfigParser sections}@anchor{2ff4}
@deffn {Method} sections ()

Return a list of the sections available; the `default section' is not
included in the list.
@end deffn

@geindex add_section() (configparser.ConfigParser method)
@anchor{library/configparser configparser ConfigParser add_section}@anchor{1479}
@deffn {Method} add_section (section)

Add a section named `section' to the instance.  If a section by the given
name already exists, @ref{147a,,DuplicateSectionError} is raised.  If the
`default section' name is passed, @ref{2ee,,ValueError} is raised.  The name
of the section must be a string; if not, @ref{199,,TypeError} is raised.


Changed in version 3.2: Non-string section names raise @ref{199,,TypeError}.

@end deffn

@geindex has_section() (configparser.ConfigParser method)
@anchor{library/configparser configparser ConfigParser has_section}@anchor{2ff5}
@deffn {Method} has_section (section)

Indicates whether the named `section' is present in the configuration.
The `default section' is not acknowledged.
@end deffn

@geindex options() (configparser.ConfigParser method)
@anchor{library/configparser configparser ConfigParser options}@anchor{2ff6}
@deffn {Method} options (section)

Return a list of options available in the specified `section'.
@end deffn

@geindex has_option() (configparser.ConfigParser method)
@anchor{library/configparser configparser ConfigParser has_option}@anchor{2ff7}
@deffn {Method} has_option (section, option)

If the given `section' exists, and contains the given `option', return
@ref{e0d,,True}; otherwise return @ref{d31,,False}.  If the specified
`section' is @ref{887,,None} or an empty string, DEFAULT is assumed.
@end deffn

@geindex read() (configparser.ConfigParser method)
@anchor{library/configparser configparser ConfigParser read}@anchor{1674}
@deffn {Method} read (filenames, encoding=None)

Attempt to read and parse an iterable of filenames, returning a list of
filenames which were successfully parsed.

If `filenames' is a string, a @ref{193,,bytes} object or a
@ref{5a1,,path-like object}, it is treated as
a single filename.  If a file named in `filenames' cannot be opened, that
file will be ignored.  This is designed so that you can specify an
iterable of potential configuration file locations (for example, the
current directory, the user’s home directory, and some system-wide
directory), and all existing configuration files in the iterable will be
read.

If none of the named files exist, the @code{ConfigParser}
instance will contain an empty dataset.  An application which requires
initial values to be loaded from a file should load the required file or
files using @ref{72b,,read_file()} before calling @code{read()} for any
optional files:

@example
import configparser, os

config = configparser.ConfigParser()
config.read_file(open('defaults.cfg'))
config.read(['site.cfg', os.path.expanduser('~/.myapp.cfg')],
            encoding='cp1250')
@end example


Changed in version 3.2: Added the `encoding' parameter.
Previously, all files were read using the default encoding for @ref{318,,open()}.



Changed in version 3.6.1: The `filenames' parameter accepts a @ref{5a1,,path-like object}.



Changed in version 3.7: The `filenames' parameter accepts a @ref{193,,bytes} object.

@end deffn

@geindex read_file() (configparser.ConfigParser method)
@anchor{library/configparser configparser ConfigParser read_file}@anchor{72b}
@deffn {Method} read_file (f, source=None)

Read and parse configuration data from `f' which must be an iterable
yielding Unicode strings (for example files opened in text mode).

Optional argument `source' specifies the name of the file being read.  If
not given and `f' has a @code{name} attribute, that is used for
`source'; the default is @code{'<???>'}.


Added in version 3.2: Replaces @code{readfp()}.

@end deffn

@geindex read_string() (configparser.ConfigParser method)
@anchor{library/configparser configparser ConfigParser read_string}@anchor{2fec}
@deffn {Method} read_string (string, source='<string>')

Parse configuration data from a string.

Optional argument `source' specifies a context-specific name of the
string passed.  If not given, @code{'<string>'} is used.  This should
commonly be a filesystem path or a URL.


Added in version 3.2.

@end deffn

@geindex read_dict() (configparser.ConfigParser method)
@anchor{library/configparser configparser ConfigParser read_dict}@anchor{2feb}
@deffn {Method} read_dict (dictionary, source='<dict>')

Load configuration from any object that provides a dict-like @code{items()}
method.  Keys are section names, values are dictionaries with keys and
values that should be present in the section.  If the used dictionary
type preserves order, sections and their keys will be added in order.
Values are automatically converted to strings.

Optional argument `source' specifies a context-specific name of the
dictionary passed.  If not given, @code{<dict>} is used.

This method can be used to copy state between parsers.


Added in version 3.2.

@end deffn

@geindex get() (configparser.ConfigParser method)
@anchor{library/configparser configparser ConfigParser get}@anchor{1477}
@deffn {Method} get (section, option, *, raw=False, vars=None[, fallback])

Get an `option' value for the named `section'.  If `vars' is provided, it
must be a dictionary.  The `option' is looked up in `vars' (if provided),
`section', and in `DEFAULTSECT' in that order.  If the key is not found
and `fallback' is provided, it is used as a fallback value.  @code{None} can
be provided as a `fallback' value.

All the @code{'%'} interpolations are expanded in the return values, unless
the `raw' argument is true.  Values for interpolation keys are looked up
in the same manner as the option.


Changed in version 3.2: Arguments `raw', `vars' and `fallback' are keyword only to protect
users from trying to use the third argument as the `fallback' fallback
(especially when using the mapping protocol).

@end deffn

@geindex getint() (configparser.ConfigParser method)
@anchor{library/configparser configparser ConfigParser getint}@anchor{2fe4}
@deffn {Method} getint (section, option, *, raw=False, vars=None[, fallback])

A convenience method which coerces the `option' in the specified `section'
to an integer.  See @ref{1477,,get()} for explanation of `raw', `vars' and
`fallback'.
@end deffn

@geindex getfloat() (configparser.ConfigParser method)
@anchor{library/configparser configparser ConfigParser getfloat}@anchor{2fe5}
@deffn {Method} getfloat (section, option, *, raw=False, vars=None[, fallback])

A convenience method which coerces the `option' in the specified `section'
to a floating-point number.  See @ref{1477,,get()} for explanation of `raw',
`vars' and `fallback'.
@end deffn

@geindex getboolean() (configparser.ConfigParser method)
@anchor{library/configparser configparser ConfigParser getboolean}@anchor{2fe3}
@deffn {Method} getboolean (section, option, *, raw=False, vars=None[, fallback])

A convenience method which coerces the `option' in the specified `section'
to a Boolean value.  Note that the accepted values for the option are
@code{'1'}, @code{'yes'}, @code{'true'}, and @code{'on'}, which cause this method to
return @code{True}, and @code{'0'}, @code{'no'}, @code{'false'}, and @code{'off'}, which
cause it to return @code{False}.  These string values are checked in a
case-insensitive manner.  Any other value will cause it to raise
@ref{2ee,,ValueError}.  See @ref{1477,,get()} for explanation of `raw', `vars' and
`fallback'.
@end deffn

@geindex items() (configparser.ConfigParser method)
@anchor{library/configparser configparser ConfigParser items}@anchor{2ff8}
@deffn {Method} items (raw=False, vars=None)

@deffnx {Method} items (section, raw=False, vars=None)

When `section' is not given, return a list of `section_name',
`section_proxy' pairs, including DEFAULTSECT.

Otherwise, return a list of `name', `value' pairs for the options in the
given `section'.  Optional arguments have the same meaning as for the
@ref{1477,,get()} method.


Changed in version 3.8: Items present in `vars' no longer appear in the result.  The previous
behaviour mixed actual parser options with variables provided for
interpolation.

@end deffn

@geindex set() (configparser.ConfigParser method)
@anchor{library/configparser configparser ConfigParser set}@anchor{1478}
@deffn {Method} set (section, option, value)

If the given section exists, set the given option to the specified value;
otherwise raise @ref{2ff9,,NoSectionError}.  `option' and `value' must be
strings; if not, @ref{199,,TypeError} is raised.
@end deffn

@geindex write() (configparser.ConfigParser method)
@anchor{library/configparser configparser ConfigParser write}@anchor{1e0}
@deffn {Method} write (fileobject, space_around_delimiters=True)

Write a representation of the configuration to the specified @ref{13cf,,file object}, which must be opened in text mode (accepting strings).  This
representation can be parsed by a future @ref{1674,,read()} call.  If
`space_around_delimiters' is true, delimiters between
keys and values are surrounded by spaces.


Changed in version 3.14: Raises InvalidWriteError if this would write a representation which cannot
be accurately parsed by a future @ref{1674,,read()} call from this parser.

@end deffn

@cartouche
@quotation Note 
Comments in the original configuration file are not preserved when
writing the configuration back.
What is considered a comment, depends on the given values for
`comment_prefix' and `inline_comment_prefix'.
@end quotation
@end cartouche

@geindex remove_option() (configparser.ConfigParser method)
@anchor{library/configparser configparser ConfigParser remove_option}@anchor{2ffa}
@deffn {Method} remove_option (section, option)

Remove the specified `option' from the specified `section'.  If the
section does not exist, raise @ref{2ff9,,NoSectionError}.  If the option
existed to be removed, return @ref{e0d,,True}; otherwise return
@ref{d31,,False}.
@end deffn

@geindex remove_section() (configparser.ConfigParser method)
@anchor{library/configparser configparser ConfigParser remove_section}@anchor{2ffb}
@deffn {Method} remove_section (section)

Remove the specified `section' from the configuration.  If the section in
fact existed, return @code{True}.  Otherwise return @code{False}.
@end deffn

@geindex optionxform() (configparser.ConfigParser method)
@anchor{library/configparser configparser ConfigParser optionxform}@anchor{2ff1}
@deffn {Method} optionxform (option)

Transforms the option name `option' as found in an input file or as passed
in by client code to the form that should be used in the internal
structures.  The default implementation returns a lower-case version of
`option'; subclasses may override this or client code can set an attribute
of this name on instances to affect this behavior.

You don’t need to subclass the parser to use this method, you can also
set it on an instance, to a function that takes a string argument and
returns a string.  Setting it to @code{str}, for example, would make option
names case sensitive:

@example
cfgparser = ConfigParser()
cfgparser.optionxform = str
@end example

Note that when reading configuration files, whitespace around the option
names is stripped before @code{optionxform()} is called.
@end deffn
@end deffn

@geindex UNNAMED_SECTION (in module configparser)
@anchor{library/configparser configparser UNNAMED_SECTION}@anchor{17dc}
@deffn {Data} configparser.UNNAMED_SECTION

A special object representing a section name used to reference the unnamed section (see @ref{2fe9,,Unnamed Sections}).
@end deffn

@geindex MAX_INTERPOLATION_DEPTH (in module configparser)
@anchor{library/configparser configparser MAX_INTERPOLATION_DEPTH}@anchor{2ffc}
@deffn {Data} configparser.MAX_INTERPOLATION_DEPTH

The maximum depth for recursive interpolation for @ref{1477,,get()} when the `raw'
parameter is false.  This is relevant only when the default `interpolation'
is used.
@end deffn

@node RawConfigParser Objects,Exceptions<9>,ConfigParser Objects,configparser — Configuration file parser
@anchor{library/configparser id15}@anchor{2ffd}@anchor{library/configparser rawconfigparser-objects}@anchor{2ffe}
@subsubsection RawConfigParser Objects


@geindex RawConfigParser (class in configparser)
@anchor{library/configparser configparser RawConfigParser}@anchor{116a}
@deffn {Class} configparser.RawConfigParser (defaults=None, dict_type=dict, allow_no_value=False, *, delimiters=('=', ':'), comment_prefixes=('#', ';'), inline_comment_prefixes=None, strict=True, empty_lines_in_values=True, default_section=configparser.DEFAULTSECT, interpolation=BasicInterpolation(), converters=@{@}, allow_unnamed_section=False)

Legacy variant of the @ref{4df,,ConfigParser}.  It has interpolation
disabled by default and allows for non-string section names, option
names, and values via its unsafe @code{add_section} and @code{set} methods,
as well as the legacy @code{defaults=} keyword argument handling.


Changed in version 3.2: `allow_no_value', `delimiters', `comment_prefixes', `strict',
`empty_lines_in_values', `default_section' and `interpolation' were
added.



Changed in version 3.5: The `converters' argument was added.



Changed in version 3.8: The default `dict_type' is @ref{184,,dict}, since it now preserves
insertion order.



Changed in version 3.13: The `allow_unnamed_section' argument was added.


@cartouche
@quotation Note 
Consider using @ref{4df,,ConfigParser} instead which checks types of
the values to be stored internally.  If you don’t want interpolation, you
can use @code{ConfigParser(interpolation=None)}.
@end quotation
@end cartouche

@geindex add_section() (configparser.RawConfigParser method)
@anchor{library/configparser configparser RawConfigParser add_section}@anchor{2fff}
@deffn {Method} add_section (section)

Add a section named `section' or @ref{17dc,,UNNAMED_SECTION} to the instance.

If the given section already exists, @ref{147a,,DuplicateSectionError} is
raised. If the `default section' name is passed, @ref{2ee,,ValueError} is
raised. If @ref{17dc,,UNNAMED_SECTION} is passed and support is disabled,
@ref{3000,,UnnamedSectionDisabledError} is raised.

Type of `section' is not checked which lets users create non-string named
sections.  This behaviour is unsupported and may cause internal errors.
@end deffn


Changed in version 3.14: Added support for @ref{17dc,,UNNAMED_SECTION}.


@geindex set() (configparser.RawConfigParser method)
@anchor{library/configparser configparser RawConfigParser set}@anchor{3001}
@deffn {Method} set (section, option, value)

If the given section exists, set the given option to the specified value;
otherwise raise @ref{2ff9,,NoSectionError}.  While it is possible to use
@code{RawConfigParser} (or @ref{4df,,ConfigParser} with `raw' parameters
set to true) for `internal' storage of non-string values, full
functionality (including interpolation and output to files) can only be
achieved using string values.

This method lets users assign non-string values to keys internally.  This
behaviour is unsupported and will cause errors when attempting to write
to a file or get it in non-raw mode.  `Use the mapping protocol API'
which does not allow such assignments to take place.
@end deffn
@end deffn

@node Exceptions<9>,,RawConfigParser Objects,configparser — Configuration file parser
@anchor{library/configparser exceptions}@anchor{3002}
@subsubsection Exceptions


@geindex Error
@anchor{library/configparser configparser Error}@anchor{3003}
@deffn {Exception} configparser.Error

Base class for all other @code{configparser} exceptions.
@end deffn

@geindex NoSectionError
@anchor{library/configparser configparser NoSectionError}@anchor{2ff9}
@deffn {Exception} configparser.NoSectionError

Exception raised when a specified section is not found.
@end deffn

@geindex DuplicateSectionError
@anchor{library/configparser configparser DuplicateSectionError}@anchor{147a}
@deffn {Exception} configparser.DuplicateSectionError

Exception raised if @ref{1479,,add_section()} is called with the name of a section
that is already present or in strict parsers when a section if found more
than once in a single input file, string or dictionary.


Changed in version 3.2: Added the optional `source' and `lineno' attributes and parameters to
@code{__init__()}.

@end deffn

@geindex DuplicateOptionError
@anchor{library/configparser configparser DuplicateOptionError}@anchor{147b}
@deffn {Exception} configparser.DuplicateOptionError

Exception raised by strict parsers if a single option appears twice during
reading from a single file, string or dictionary. This catches misspellings
and case sensitivity-related errors, e.g. a dictionary may have two keys
representing the same case-insensitive configuration key.
@end deffn

@geindex NoOptionError
@anchor{library/configparser configparser NoOptionError}@anchor{3004}
@deffn {Exception} configparser.NoOptionError

Exception raised when a specified option is not found in the specified
section.
@end deffn

@geindex InterpolationError
@anchor{library/configparser configparser InterpolationError}@anchor{3005}
@deffn {Exception} configparser.InterpolationError

Base class for exceptions raised when problems occur performing string
interpolation.
@end deffn

@geindex InterpolationDepthError
@anchor{library/configparser configparser InterpolationDepthError}@anchor{3006}
@deffn {Exception} configparser.InterpolationDepthError

Exception raised when string interpolation cannot be completed because the
number of iterations exceeds @ref{2ffc,,MAX_INTERPOLATION_DEPTH}.  Subclass of
@ref{3005,,InterpolationError}.
@end deffn

@geindex InterpolationMissingOptionError
@anchor{library/configparser configparser InterpolationMissingOptionError}@anchor{3007}
@deffn {Exception} configparser.InterpolationMissingOptionError

Exception raised when an option referenced from a value does not exist.
Subclass of @ref{3005,,InterpolationError}.
@end deffn

@geindex InterpolationSyntaxError
@anchor{library/configparser configparser InterpolationSyntaxError}@anchor{3008}
@deffn {Exception} configparser.InterpolationSyntaxError

Exception raised when the source text into which substitutions are made does
not conform to the required syntax.  Subclass of @ref{3005,,InterpolationError}.
@end deffn

@geindex MissingSectionHeaderError
@anchor{library/configparser configparser MissingSectionHeaderError}@anchor{3009}
@deffn {Exception} configparser.MissingSectionHeaderError

Exception raised when attempting to parse a file which has no section
headers.
@end deffn

@geindex ParsingError
@anchor{library/configparser configparser ParsingError}@anchor{72a}
@deffn {Exception} configparser.ParsingError

Exception raised when errors occur attempting to parse a file.


Changed in version 3.12: The @code{filename} attribute and @code{__init__()} constructor argument were
removed.  They have been available using the name @code{source} since 3.2.

@end deffn

@geindex MultilineContinuationError
@anchor{library/configparser configparser MultilineContinuationError}@anchor{2ff2}
@deffn {Exception} configparser.MultilineContinuationError

Exception raised when a key without a corresponding value is continued with
an indented line.


Added in version 3.13.

@end deffn

@geindex UnnamedSectionDisabledError
@anchor{library/configparser configparser UnnamedSectionDisabledError}@anchor{3000}
@deffn {Exception} configparser.UnnamedSectionDisabledError

Exception raised when attempting to use the
@ref{17dc,,UNNAMED_SECTION} without enabling it.

@quotation


Added in version 3.14.

@end quotation
@end deffn

@geindex InvalidWriteError
@anchor{library/configparser configparser InvalidWriteError}@anchor{1e1}
@deffn {Exception} configparser.InvalidWriteError

Exception raised when an attempted @ref{1e0,,ConfigParser.write()} would not be parsed
accurately with a future @ref{1674,,ConfigParser.read()} call.

Ex: Writing a key beginning with the @ref{2fe7,,ConfigParser.SECTCRE} pattern
would parse as a section header when read. Attempting to write this will raise
this exception.


Added in version 3.14.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node tomllib — Parse TOML files,netrc — netrc file processing,configparser — Configuration file parser,File Formats
@anchor{library/tomllib doc}@anchor{300a}@anchor{library/tomllib module-tomllib}@anchor{103}@anchor{library/tomllib tomllib-parse-toml-files}@anchor{300b}@anchor{library/tomllib translation-repo}@anchor{300c}
@subsection @code{tomllib} — Parse TOML files


@geindex module; tomllib


Added in version 3.11.


`Source code:' Lib/tomllib@footnote{https://github.com/python/cpython/tree/3.14/Lib/tomllib}


__________________________________________________________________


This module provides an interface for parsing TOML 1.0.0 (Tom’s Obvious Minimal
Language, https://toml.io@footnote{https://toml.io/en/}). This module does not
support writing TOML.

@cartouche
@quotation Warning 
Be cautious when parsing data from untrusted sources.
A malicious TOML string may cause the decoder to consume considerable
CPU and memory resources.
Limiting the size of data to be parsed is recommended.
@end quotation
@end cartouche


@subsubheading See also


The Tomli-W package@footnote{https://pypi.org/project/tomli-w/}
is a TOML writer that can be used in conjunction with this module,
providing a write API familiar to users of the standard library
@ref{91,,marshal} and @ref{ab,,pickle} modules.



@subsubheading See also


The TOML Kit package@footnote{https://pypi.org/project/tomlkit/}
is a style-preserving TOML library with both read and write capability.
It is a recommended replacement for this module for editing already
existing TOML files.


This module defines the following functions:

@geindex load() (in module tomllib)
@anchor{library/tomllib tomllib load}@anchor{300d}
@deffn {Function} tomllib.load (fp, /, *, parse_float=float)

Read a TOML file. The first argument should be a readable and binary file object.
Return a @ref{184,,dict}. Convert TOML types to Python using this
@ref{300e,,conversion table}.

`parse_float' will be called with the string of every TOML
float to be decoded.  By default, this is equivalent to @code{float(num_str)}.
This can be used to use another datatype or parser for TOML floats
(e.g. @ref{200,,decimal.Decimal}). The callable must not return a
@ref{184,,dict} or a @ref{24f,,list}, else a @ref{2ee,,ValueError} is raised.

A @ref{1951,,TOMLDecodeError} will be raised on an invalid TOML document.
@end deffn

@geindex loads() (in module tomllib)
@anchor{library/tomllib tomllib loads}@anchor{1970}
@deffn {Function} tomllib.loads (s, /, *, parse_float=float)

Load TOML from a @ref{16a,,str} object. Return a @ref{184,,dict}. Convert TOML
types to Python using this @ref{300e,,conversion table}. The
`parse_float' argument has the same meaning as in @ref{300d,,load()}.

A @ref{1951,,TOMLDecodeError} will be raised on an invalid TOML document.
@end deffn

The following exceptions are available:

@geindex TOMLDecodeError
@anchor{library/tomllib tomllib TOMLDecodeError}@anchor{1951}
@deffn {Exception} tomllib.TOMLDecodeError (msg, doc, pos)

Subclass of @ref{2ee,,ValueError} with the following additional attributes:

@geindex msg (tomllib.TOMLDecodeError attribute)
@anchor{library/tomllib tomllib TOMLDecodeError msg}@anchor{300f}
@deffn {Attribute} msg

The unformatted error message.
@end deffn

@geindex doc (tomllib.TOMLDecodeError attribute)
@anchor{library/tomllib tomllib TOMLDecodeError doc}@anchor{3010}
@deffn {Attribute} doc

The TOML document being parsed.
@end deffn

@geindex pos (tomllib.TOMLDecodeError attribute)
@anchor{library/tomllib tomllib TOMLDecodeError pos}@anchor{3011}
@deffn {Attribute} pos

The index of `doc' where parsing failed.
@end deffn

@geindex lineno (tomllib.TOMLDecodeError attribute)
@anchor{library/tomllib tomllib TOMLDecodeError lineno}@anchor{3012}
@deffn {Attribute} lineno

The line corresponding to `pos'.
@end deffn

@geindex colno (tomllib.TOMLDecodeError attribute)
@anchor{library/tomllib tomllib TOMLDecodeError colno}@anchor{3013}
@deffn {Attribute} colno

The column corresponding to `pos'.
@end deffn


Changed in version 3.14: Added the `msg', `doc' and `pos' parameters.
Added the @ref{300f,,msg}, @ref{3010,,doc}, @ref{3011,,pos}, @ref{3012,,lineno} and @ref{3013,,colno} attributes.



Deprecated since version 3.14: Passing free-form positional arguments is deprecated.

@end deffn

@menu
* Examples: Examples<12>. 
* Conversion Table:: 

@end menu

@node Examples<12>,Conversion Table,,tomllib — Parse TOML files
@anchor{library/tomllib examples}@anchor{3014}
@subsubsection Examples


Parsing a TOML file:

@example
import tomllib

with open("pyproject.toml", "rb") as f:
    data = tomllib.load(f)
@end example

Parsing a TOML string:

@example
import tomllib

toml_str = """
python-version = "3.11.0"
python-implementation = "CPython"
"""

data = tomllib.loads(toml_str)
@end example

@node Conversion Table,,Examples<12>,tomllib — Parse TOML files
@anchor{library/tomllib conversion-table}@anchor{3015}
@subsubsection Conversion Table

@anchor{library/tomllib toml-to-py-table}@anchor{300e}

@multitable {xxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

TOML

@tab

Python

@item

TOML document

@tab

dict

@item

string

@tab

str

@item

integer

@tab

int

@item

float

@tab

float (configurable with `parse_float')

@item

boolean

@tab

bool

@item

offset date-time

@tab

datetime.datetime (@code{tzinfo} attribute set to an instance of @code{datetime.timezone})

@item

local date-time

@tab

datetime.datetime (@code{tzinfo} attribute set to @code{None})

@item

local date

@tab

datetime.date

@item

local time

@tab

datetime.time

@item

array

@tab

list

@item

table

@tab

dict

@item

inline table

@tab

dict

@item

array of tables

@tab

list of dicts

@end multitable


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node netrc — netrc file processing,plistlib — Generate and parse Apple plist files,tomllib — Parse TOML files,File Formats
@anchor{library/netrc doc}@anchor{3016}@anchor{library/netrc module-netrc}@anchor{9f}@anchor{library/netrc netrc-netrc-file-processing}@anchor{3017}@anchor{library/netrc translation-repo}@anchor{3018}
@subsection @code{netrc} — netrc file processing


@geindex module; netrc

`Source code:' Lib/netrc.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/netrc.py}


__________________________________________________________________


The @ref{1cbc,,netrc} class parses and encapsulates the netrc file format used by
the Unix @code{ftp} program and other FTP clients.

@geindex netrc (class in netrc)
@anchor{library/netrc netrc netrc}@anchor{1cbc}
@deffn {Class} netrc.netrc ([file])

A @code{netrc} instance or subclass instance encapsulates data from  a netrc
file.  The initialization argument, if present, specifies the file to parse.  If
no argument is given, the file @code{.netrc} in the user’s home directory –
as determined by @ref{c0f,,os.path.expanduser()} – will be read.  Otherwise,
a @ref{266,,FileNotFoundError} exception will be raised.
Parse errors will raise @ref{3019,,NetrcParseError} with diagnostic
information including the file name, line number, and terminating token.

If no argument is specified on a POSIX system, the presence of passwords in
the @code{.netrc} file will raise a @ref{3019,,NetrcParseError} if the file
ownership or permissions are insecure (owned by a user other than the user
running the process, or accessible for read or write by any other user).
This implements security behavior equivalent to that of ftp and other
programs that use @code{.netrc}. Such security checks are not available
on platforms that do not support @ref{1861,,os.getuid()}.


Changed in version 3.4: Added the POSIX permission check.



Changed in version 3.7: @ref{c0f,,os.path.expanduser()} is used to find the location of the
@code{.netrc} file when `file' is not passed as argument.



Changed in version 3.10: @code{netrc} try UTF-8 encoding before using locale specific
encoding.
The entry in the netrc file no longer needs to contain all tokens.  The missing
tokens’ value default to an empty string.  All the tokens and their values now
can contain arbitrary characters, like whitespace and non-ASCII characters.
If the login name is anonymous, it won’t trigger the security check.

@end deffn

@geindex NetrcParseError
@anchor{library/netrc netrc NetrcParseError}@anchor{3019}
@deffn {Exception} netrc.NetrcParseError

Exception raised by the @ref{1cbc,,netrc} class when syntactical errors are
encountered in source text.  Instances of this exception provide three
interesting attributes:

@geindex msg (netrc.NetrcParseError attribute)
@anchor{library/netrc netrc NetrcParseError msg}@anchor{301a}
@deffn {Attribute} msg

Textual explanation of the error.
@end deffn

@geindex filename (netrc.NetrcParseError attribute)
@anchor{library/netrc netrc NetrcParseError filename}@anchor{301b}
@deffn {Attribute} filename

The name of the source file.
@end deffn

@geindex lineno (netrc.NetrcParseError attribute)
@anchor{library/netrc netrc NetrcParseError lineno}@anchor{301c}
@deffn {Attribute} lineno

The line number on which the error was found.
@end deffn
@end deffn

@menu
* netrc Objects:: 

@end menu

@node netrc Objects,,,netrc — netrc file processing
@anchor{library/netrc id1}@anchor{301d}@anchor{library/netrc netrc-objects}@anchor{301e}
@subsubsection netrc Objects


A @ref{1cbc,,netrc} instance has the following methods:

@geindex authenticators() (netrc.netrc method)
@anchor{library/netrc netrc netrc authenticators}@anchor{301f}
@deffn {Method} netrc.authenticators (host)

Return a 3-tuple @code{(login, account, password)} of authenticators for `host'.
If the netrc file did not contain an entry for the given host, return the tuple
associated with the ‘default’ entry.  If neither matching host nor default entry
is available, return @code{None}.
@end deffn

@geindex __repr__() (netrc.netrc method)
@anchor{library/netrc netrc netrc __repr__}@anchor{3020}
@deffn {Method} netrc.__repr__ ()

Dump the class data as a string in the format of a netrc file. (This discards
comments and may reorder the entries.)
@end deffn

Instances of @ref{1cbc,,netrc} have public instance variables:

@geindex hosts (netrc.netrc attribute)
@anchor{library/netrc netrc netrc hosts}@anchor{3021}
@deffn {Attribute} netrc.hosts

Dictionary mapping host names to @code{(login, account, password)} tuples.  The
‘default’ entry, if any, is represented as a pseudo-host by that name.
@end deffn

@geindex macros (netrc.netrc attribute)
@anchor{library/netrc netrc netrc macros}@anchor{3022}
@deffn {Attribute} netrc.macros

Dictionary mapping macro names to string lists.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node plistlib — Generate and parse Apple plist files,,netrc — netrc file processing,File Formats
@anchor{library/plistlib doc}@anchor{3023}@anchor{library/plistlib module-plistlib}@anchor{b0}@anchor{library/plistlib plistlib-generate-and-parse-apple-plist-files}@anchor{3024}@anchor{library/plistlib translation-repo}@anchor{3025}
@subsection @code{plistlib} — Generate and parse Apple @code{.plist} files


@geindex module; plistlib

@c (harvested from docstrings in the original file)

`Source code:' Lib/plistlib.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/plistlib.py}

@geindex plist; file
@geindex property list


__________________________________________________________________


This module provides an interface for reading and writing the “property list”
files used by Apple, primarily on macOS and iOS. This module supports both binary
and XML plist files.

The property list (@code{.plist}) file format is a simple serialization supporting
basic object types, like dictionaries, lists, numbers and strings.  Usually the
top level object is a dictionary.

To write out and to parse a plist file, use the @ref{b50,,dump()} and
@ref{b4e,,load()} functions.

To work with plist data in bytes or string objects, use @ref{b51,,dumps()}
and @ref{b4f,,loads()}.

Values can be strings, integers, floats, booleans, tuples, lists, dictionaries
(but only with string keys), @ref{193,,bytes}, @ref{342,,bytearray}
or @ref{4e3,,datetime.datetime} objects.


Changed in version 3.4: New API, old API deprecated.  Support for binary format plists added.



Changed in version 3.8: Support added for reading and writing @ref{c1c,,UID} tokens in binary plists as used
by NSKeyedArchiver and NSKeyedUnarchiver.



Changed in version 3.9: Old API removed.



@subsubheading See also



@table @asis

@item PList manual page@footnote{https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/PropertyLists/}

Apple’s documentation of the file format.
@end table


This module defines the following functions:

@geindex load() (in module plistlib)
@anchor{library/plistlib plistlib load}@anchor{b4e}
@deffn {Function} plistlib.load (fp, *, fmt=None, dict_type=dict, aware_datetime=False)

Read a plist file. `fp' should be a readable and binary file object.
Return the unpacked root object (which usually is a
dictionary).

The `fmt' is the format of the file and the following values are valid:


@itemize *

@item 
@ref{887,,None}: Autodetect the file format

@item 
@ref{117f,,FMT_XML}: XML file format

@item 
@ref{1180,,FMT_BINARY}: Binary plist format
@end itemize

The `dict_type' is the type used for dictionaries that are read from the
plist file.

When `aware_datetime' is true, fields with type @code{datetime.datetime} will
be created as @ref{2903,,aware object}, with
@code{tzinfo} as @ref{714,,datetime.UTC}.

XML data for the @ref{117f,,FMT_XML} format is parsed using the Expat parser
from @ref{12d,,xml.parsers.expat} – see its documentation for possible
exceptions on ill-formed XML.  Unknown elements will simply be ignored
by the plist parser.

The parser raises @ref{1d3e,,InvalidFileException} when the file cannot be parsed.


Added in version 3.4.



Changed in version 3.13: The keyword-only parameter `aware_datetime' has been added.

@end deffn

@geindex loads() (in module plistlib)
@anchor{library/plistlib plistlib loads}@anchor{b4f}
@deffn {Function} plistlib.loads (data, *, fmt=None, dict_type=dict, aware_datetime=False)

Load a plist from a bytes or string object. See @ref{b4e,,load()} for an
explanation of the keyword arguments.


Added in version 3.4.



Changed in version 3.13: `data' can be a string when `fmt' equals @ref{117f,,FMT_XML}.

@end deffn

@geindex dump() (in module plistlib)
@anchor{library/plistlib plistlib dump}@anchor{b50}
@deffn {Function} plistlib.dump (value, fp, *, fmt=FMT_XML, sort_keys=True, skipkeys=False, aware_datetime=False)

Write `value' to a plist file. `fp' should be a writable, binary
file object.

The `fmt' argument specifies the format of the plist file and can be
one of the following values:


@itemize *

@item 
@ref{117f,,FMT_XML}: XML formatted plist file

@item 
@ref{1180,,FMT_BINARY}: Binary formatted plist file
@end itemize

When `sort_keys' is true (the default) the keys for dictionaries will be
written to the plist in sorted order, otherwise they will be written in
the iteration order of the dictionary.

When `skipkeys' is false (the default) the function raises @ref{199,,TypeError}
when a key of a dictionary is not a string, otherwise such keys are skipped.

When `aware_datetime' is true and any field with type @code{datetime.datetime}
is set as an @ref{2903,,aware object}, it will convert to
UTC timezone before writing it.

A @ref{199,,TypeError} will be raised if the object is of an unsupported type or
a container that contains objects of unsupported types.

An @ref{a87,,OverflowError} will be raised for integer values that cannot
be represented in (binary) plist files.


Added in version 3.4.



Changed in version 3.13: The keyword-only parameter `aware_datetime' has been added.

@end deffn

@geindex dumps() (in module plistlib)
@anchor{library/plistlib plistlib dumps}@anchor{b51}
@deffn {Function} plistlib.dumps (value, *, fmt=FMT_XML, sort_keys=True, skipkeys=False, aware_datetime=False)

Return `value' as a plist-formatted bytes object. See
the documentation for @ref{b50,,dump()} for an explanation of the keyword
arguments of this function.


Added in version 3.4.

@end deffn

The following classes are available:

@geindex UID (class in plistlib)
@anchor{library/plistlib plistlib UID}@anchor{c1c}
@deffn {Class} plistlib.UID (data)

Wraps an @ref{19c,,int}.  This is used when reading or writing NSKeyedArchiver
encoded data, which contains UID (see PList manual).

@geindex data (plistlib.UID attribute)
@anchor{library/plistlib plistlib UID data}@anchor{3026}
@deffn {Attribute} data

Int value of the UID.  It must be in the range @code{0 <= data < 2**64}.
@end deffn


Added in version 3.8.

@end deffn

The following constants are available:

@geindex FMT_XML (in module plistlib)
@anchor{library/plistlib plistlib FMT_XML}@anchor{117f}
@deffn {Data} plistlib.FMT_XML

The XML format for plist files.


Added in version 3.4.

@end deffn

@geindex FMT_BINARY (in module plistlib)
@anchor{library/plistlib plistlib FMT_BINARY}@anchor{1180}
@deffn {Data} plistlib.FMT_BINARY

The binary format for plist files


Added in version 3.4.

@end deffn

The module defines the following exceptions:

@geindex InvalidFileException
@anchor{library/plistlib plistlib InvalidFileException}@anchor{1d3e}
@deffn {Exception} plistlib.InvalidFileException

Raised when a file cannot be parsed.


Added in version 3.4.

@end deffn

@menu
* Examples: Examples<13>. 

@end menu

@node Examples<13>,,,plistlib — Generate and parse Apple plist files
@anchor{library/plistlib examples}@anchor{3027}
@subsubsection Examples


Generating a plist:

@example
import datetime as dt
import plistlib

pl = dict(
    aString = "Doodah",
    aList = ["A", "B", 12, 32.1, [1, 2, 3]],
    aFloat = 0.1,
    anInt = 728,
    aDict = dict(
        anotherString = "<hello & hi there!>",
        aThirdString = "M\xe4ssig, Ma\xdf",
        aTrueValue = True,
        aFalseValue = False,
    ),
    someData = b"<binary gunk>",
    someMoreData = b"<lots of binary gunk>" * 10,
    aDate = dt.datetime.now()
)
print(plistlib.dumps(pl).decode())
@end example

Parsing a plist:

@example
import plistlib

plist = b"""<plist version="1.0">
<dict>
    <key>foo</key>
    <string>bar</string>
</dict>
</plist>"""
pl = plistlib.loads(plist)
print(pl["foo"])
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Cryptographic Services,Generic Operating System Services,File Formats,The Python Standard Library
@anchor{library/crypto doc}@anchor{3028}@anchor{library/crypto crypto}@anchor{3029}@anchor{library/crypto cryptographic-services}@anchor{302a}@anchor{library/crypto translation-repo}@anchor{302b}
@section Cryptographic Services


@geindex cryptography

The modules described in this chapter implement various algorithms of a
cryptographic nature.  They are available at the discretion of the installation.
Here’s an overview:

@menu
* hashlib — Secure hashes and message digests:: 
* hmac — Keyed-Hashing for Message Authentication:: 
* secrets — Generate secure random numbers for managing secrets:: 

@end menu

@node hashlib — Secure hashes and message digests,hmac — Keyed-Hashing for Message Authentication,,Cryptographic Services
@anchor{library/hashlib doc}@anchor{302c}@anchor{library/hashlib hashlib-secure-hashes-and-message-digests}@anchor{302d}@anchor{library/hashlib module-hashlib}@anchor{6c}
@subsection @code{hashlib} — Secure hashes and message digests


@geindex module; hashlib

`Source code:' Lib/hashlib.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/hashlib.py}

@geindex message digest@comma{} MD5
@geindex secure hash algorithm@comma{} SHA1@comma{} SHA2@comma{} SHA224@comma{} SHA256@comma{} SHA384@comma{} SHA512@comma{} SHA3@comma{} Shake@comma{} Blake2

@c import hashlib


__________________________________________________________________


This module implements a common interface to many different hash algorithms.
Included are the FIPS secure hash algorithms SHA224, SHA256, SHA384, SHA512,
(defined in the FIPS 180-4 standard@footnote{https://csrc.nist.gov/pubs/fips/180-4/upd1/final}), the SHA-3 series (defined in the FIPS 202 standard@footnote{https://csrc.nist.gov/pubs/fips/202/final}) as well as the legacy algorithms SHA1 (formerly part of FIPS@footnote{https://csrc.nist.gov/news/2023/decision-to-revise-fips-180-4})
and the MD5 algorithm (defined in internet 
@geindex RFC; RFC 1321
RFC 1321@footnote{https://datatracker.ietf.org/doc/html/rfc1321.html}).

@cartouche
@quotation Note 
If you want the adler32 or crc32 hash functions, they are available in
the @ref{13a,,zlib} module.
@end quotation
@end cartouche

@menu
* Hash algorithms:: 
* Usage:: 
* Constructors:: 
* Attributes:: 
* Hash Objects:: 
* SHAKE variable length digests:: 
* File hashing:: 
* Key derivation:: 
* BLAKE2:: 

@end menu

@node Hash algorithms,Usage,,hashlib — Secure hashes and message digests
@anchor{library/hashlib hash-algorithms}@anchor{302e}@anchor{library/hashlib id1}@anchor{302f}
@subsubsection Hash algorithms


There is one constructor method named for each type of `hash'.  All return
a hash object with the same simple interface. For example: use @ref{18f4,,sha256()}
to create a SHA-256 hash object. You can now feed this object with
@ref{194,,bytes-like objects} (normally @ref{193,,bytes}) using
the @ref{3030,,update} method.  At any point you can ask it for the
`digest' of the concatenation of the data fed to it so far using the
@ref{3031,,digest()} or @ref{3032,,hexdigest()} methods.

To allow multithreading, the Python @ref{165,,GIL} is released while computing a
hash supplied more than 2047 bytes of data at once in its constructor or
@ref{3030,,.update} method.

@geindex OpenSSL; (use in module hashlib)

Constructors for hash algorithms that are always present in this module are
@ref{3033,,sha1()}, @ref{3034,,sha224()}, @ref{18f4,,sha256()}, @ref{3035,,sha384()}, @ref{3036,,sha512()},
@ref{ea6,,sha3_224()}, @ref{ea7,,sha3_256()}, @ref{ea8,,sha3_384()}, @ref{ea9,,sha3_512()},
@ref{eaa,,shake_128()}, @ref{eab,,shake_256()}, @ref{853,,blake2b()}, and @ref{854,,blake2s()}.
@ref{186d,,md5()} is normally available as well, though it may be missing or blocked
if you are using a rare “FIPS compliant” build of Python.
These correspond to @ref{157f,,algorithms_guaranteed}.

Additional algorithms may also be available if your Python distribution’s
@code{hashlib} was linked against a build of OpenSSL that provides others.
Others `are not guaranteed available' on all installations and will only be
accessible by name via @ref{1d72,,new()}.  See @ref{1580,,algorithms_available}.

@cartouche
@quotation Warning 
Some algorithms have known hash collision weaknesses (including MD5 and
SHA1). Refer to Attacks on cryptographic hash algorithms@footnote{https://en.wikipedia.org/wiki/Cryptographic_hash_function#Attacks_on_cryptographic_hash_algorithms} and the
@ref{3037,,hashlib-seealso} section at the end of this document.
@end quotation
@end cartouche


Added in version 3.6: SHA3 (Keccak) and SHAKE constructors @ref{ea6,,sha3_224()}, @ref{ea7,,sha3_256()},
@ref{ea8,,sha3_384()}, @ref{ea9,,sha3_512()}, @ref{eaa,,shake_128()}, @ref{eab,,shake_256()}
were added.
@ref{853,,blake2b()} and @ref{854,,blake2s()} were added.

@anchor{library/hashlib hashlib-usedforsecurity}@anchor{3038}

Changed in version 3.9: All hashlib constructors take a keyword-only argument `usedforsecurity'
with default value @code{True}. A false value allows the use of insecure and
blocked hashing algorithms in restricted environments. @code{False} indicates
that the hashing algorithm is not used in a security context, e.g. as a
non-cryptographic one-way compression function.



Changed in version 3.9: Hashlib now uses SHA3 and SHAKE from OpenSSL if it provides it.



Changed in version 3.12: For any of the MD5, SHA1, SHA2, or SHA3 algorithms that the linked
OpenSSL does not provide we fall back to a verified implementation from
the HACL* project@footnote{https://github.com/hacl-star/hacl-star}.


@node Usage,Constructors,Hash algorithms,hashlib — Secure hashes and message digests
@anchor{library/hashlib usage}@anchor{3039}
@subsubsection Usage


To obtain the digest of the byte string @code{b"Nobody inspects the spammish
repetition"}:

@example
>>> import hashlib
>>> m = hashlib.sha256()
>>> m.update(b"Nobody inspects")
>>> m.update(b" the spammish repetition")
>>> m.digest()
b'\x03\x1e\xdd@}Ae\x15\x93\xc5\xfe\\\x00o\xa5u+7\xfd\xdf\xf7\xbcN\x84:\xa6\xaf\x0c\x95\x0fK\x94\x06'
>>> m.hexdigest()
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
@end example

More condensed:

@example
>>> hashlib.sha256(b"Nobody inspects the spammish repetition").hexdigest()
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
@end example

@node Constructors,Attributes,Usage,hashlib — Secure hashes and message digests
@anchor{library/hashlib constructors}@anchor{303a}
@subsubsection Constructors


@geindex new() (in module hashlib)
@anchor{library/hashlib hashlib new}@anchor{1d72}
@deffn {Function} hashlib.new (name[, data], *, usedforsecurity=True)

Is a generic constructor that takes the string `name' of the desired
algorithm as its first parameter.  It also exists to allow access to the
above listed hashes as well as any other algorithms that your OpenSSL
library may offer.
@end deffn

Using @ref{1d72,,new()} with an algorithm name:

@example
>>> h = hashlib.new('sha256')
>>> h.update(b"Nobody inspects the spammish repetition")
>>> h.hexdigest()
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
@end example

@geindex md5() (in module hashlib)
@anchor{library/hashlib hashlib md5}@anchor{186d}
@deffn {Function} hashlib.md5 ([data], *, usedforsecurity=True)
@end deffn

@geindex sha1() (in module hashlib)
@anchor{library/hashlib hashlib sha1}@anchor{3033}
@deffn {Function} hashlib.sha1 ([data], *, usedforsecurity=True)
@end deffn

@geindex sha224() (in module hashlib)
@anchor{library/hashlib hashlib sha224}@anchor{3034}
@deffn {Function} hashlib.sha224 ([data], *, usedforsecurity=True)
@end deffn

@geindex sha256() (in module hashlib)
@anchor{library/hashlib hashlib sha256}@anchor{18f4}
@deffn {Function} hashlib.sha256 ([data], *, usedforsecurity=True)
@end deffn

@geindex sha384() (in module hashlib)
@anchor{library/hashlib hashlib sha384}@anchor{3035}
@deffn {Function} hashlib.sha384 ([data], *, usedforsecurity=True)
@end deffn

@geindex sha512() (in module hashlib)
@anchor{library/hashlib hashlib sha512}@anchor{3036}
@deffn {Function} hashlib.sha512 ([data], *, usedforsecurity=True)
@end deffn

@geindex sha3_224() (in module hashlib)
@anchor{library/hashlib hashlib sha3_224}@anchor{ea6}
@deffn {Function} hashlib.sha3_224 ([data], *, usedforsecurity=True)
@end deffn

@geindex sha3_256() (in module hashlib)
@anchor{library/hashlib hashlib sha3_256}@anchor{ea7}
@deffn {Function} hashlib.sha3_256 ([data], *, usedforsecurity=True)
@end deffn

@geindex sha3_384() (in module hashlib)
@anchor{library/hashlib hashlib sha3_384}@anchor{ea8}
@deffn {Function} hashlib.sha3_384 ([data], *, usedforsecurity=True)
@end deffn

@geindex sha3_512() (in module hashlib)
@anchor{library/hashlib hashlib sha3_512}@anchor{ea9}
@deffn {Function} hashlib.sha3_512 ([data], *, usedforsecurity=True)
@end deffn

Named constructors such as these are faster than passing an algorithm name to
@ref{1d72,,new()}.

@node Attributes,Hash Objects,Constructors,hashlib — Secure hashes and message digests
@anchor{library/hashlib attributes}@anchor{303b}
@subsubsection Attributes


Hashlib provides the following constant module attributes:

@geindex algorithms_guaranteed (in module hashlib)
@anchor{library/hashlib hashlib algorithms_guaranteed}@anchor{157f}
@deffn {Data} hashlib.algorithms_guaranteed

A set containing the names of the hash algorithms guaranteed to be supported
by this module on all platforms.  Note that ‘md5’ is in this list despite
some upstream vendors offering an odd “FIPS compliant” Python build that
excludes it.


Added in version 3.2.

@end deffn

@geindex algorithms_available (in module hashlib)
@anchor{library/hashlib hashlib algorithms_available}@anchor{1580}
@deffn {Data} hashlib.algorithms_available

A set containing the names of the hash algorithms that are available in the
running Python interpreter.  These names will be recognized when passed to
@ref{1d72,,new()}.  @ref{157f,,algorithms_guaranteed} will always be a subset.  The
same algorithm may appear multiple times in this set under different names
(thanks to OpenSSL).


Added in version 3.2.

@end deffn

@node Hash Objects,SHAKE variable length digests,Attributes,hashlib — Secure hashes and message digests
@anchor{library/hashlib hash-objects}@anchor{303c}
@subsubsection Hash Objects


The following values are provided as constant attributes of the hash objects
returned by the constructors:

@geindex hash.digest_size (in module hashlib)
@anchor{library/hashlib hashlib hash digest_size}@anchor{303d}
@deffn {Data} hash.digest_size

The size of the resulting hash in bytes.
@end deffn

@geindex hash.block_size (in module hashlib)
@anchor{library/hashlib hashlib hash block_size}@anchor{303e}
@deffn {Data} hash.block_size

The internal block size of the hash algorithm in bytes.
@end deffn

A hash object has the following attributes:

@geindex name (hashlib.hash attribute)
@anchor{library/hashlib hashlib hash name}@anchor{114d}
@deffn {Attribute} hash.name

The canonical name of this hash, always lowercase and always suitable as a
parameter to @ref{1d72,,new()} to create another hash of this type.


Changed in version 3.4: The name attribute has been present in CPython since its inception, but
until Python 3.4 was not formally specified, so may not exist on some
platforms.

@end deffn

A hash object has the following methods:

@geindex update() (hashlib.hash method)
@anchor{library/hashlib hashlib hash update}@anchor{3030}
@deffn {Method} hash.update (data)

Update the hash object with the @ref{194,,bytes-like object}.
Repeated calls are equivalent to a single call with the
concatenation of all the arguments: @code{m.update(a); m.update(b)} is
equivalent to @code{m.update(a+b)}.
@end deffn

@geindex digest() (hashlib.hash method)
@anchor{library/hashlib hashlib hash digest}@anchor{3031}
@deffn {Method} hash.digest ()

Return the digest of the data passed to the @ref{3030,,update()} method so far.
This is a bytes object of size @ref{303d,,digest_size} which may contain bytes in
the whole range from 0 to 255.
@end deffn

@geindex hexdigest() (hashlib.hash method)
@anchor{library/hashlib hashlib hash hexdigest}@anchor{3032}
@deffn {Method} hash.hexdigest ()

Like @ref{3031,,digest()} except the digest is returned as a string object of
double length, containing only hexadecimal digits.  This may be used to
exchange the value safely in email or other non-binary environments.
@end deffn

@geindex copy() (hashlib.hash method)
@anchor{library/hashlib hashlib hash copy}@anchor{303f}
@deffn {Method} hash.copy ()

Return a copy (“clone”) of the hash object.  This can be used to efficiently
compute the digests of data sharing a common initial substring.
@end deffn

@node SHAKE variable length digests,File hashing,Hash Objects,hashlib — Secure hashes and message digests
@anchor{library/hashlib shake-variable-length-digests}@anchor{3040}
@subsubsection SHAKE variable length digests


@geindex shake_128() (in module hashlib)
@anchor{library/hashlib hashlib shake_128}@anchor{eaa}
@deffn {Function} hashlib.shake_128 ([data], *, usedforsecurity=True)
@end deffn

@geindex shake_256() (in module hashlib)
@anchor{library/hashlib hashlib shake_256}@anchor{eab}
@deffn {Function} hashlib.shake_256 ([data], *, usedforsecurity=True)
@end deffn

The @ref{eaa,,shake_128()} and @ref{eab,,shake_256()} algorithms provide variable
length digests with length_in_bits//2 up to 128 or 256 bits of security.
As such, their digest methods require a length. Maximum length is not limited
by the SHAKE algorithm.

@geindex digest() (hashlib.shake method)
@anchor{library/hashlib hashlib shake digest}@anchor{1e5c}
@deffn {Method} shake.digest (length)

Return the digest of the data passed to the @ref{3030,,update()} method so far.
This is a bytes object of size `length' which may contain bytes in
the whole range from 0 to 255.
@end deffn

@geindex hexdigest() (hashlib.shake method)
@anchor{library/hashlib hashlib shake hexdigest}@anchor{1e5d}
@deffn {Method} shake.hexdigest (length)

Like @ref{1e5c,,digest()} except the digest is returned as a string object of
double length, containing only hexadecimal digits.  This may be used to
exchange the value in email or other non-binary environments.
@end deffn

Example use:

@example
>>> h = hashlib.shake_256(b'Nobody inspects the spammish repetition')
>>> h.hexdigest(20)
'44709d6fcb83d92a76dcb0b668c98e1b1d3dafe7'
@end example

@node File hashing,Key derivation,SHAKE variable length digests,hashlib — Secure hashes and message digests
@anchor{library/hashlib file-hashing}@anchor{3041}
@subsubsection File hashing


The hashlib module provides a helper function for efficient hashing of
a file or file-like object.

@geindex file_digest() (in module hashlib)
@anchor{library/hashlib hashlib file_digest}@anchor{855}
@deffn {Function} hashlib.file_digest (fileobj, digest, /)

Return a digest object that has been updated with contents of file object.

`fileobj' must be a file-like object opened for reading in binary mode.
It accepts file objects from  builtin @ref{318,,open()}, @ref{10aa,,BytesIO}
instances, SocketIO objects from @ref{13ab,,socket.socket.makefile()}, and
similar. `fileobj' must be opened in blocking mode, otherwise a
@ref{237,,BlockingIOError} may be raised.

The function may bypass Python’s I/O and use the file descriptor
from @ref{17fe,,fileno()} directly. `fileobj' must be assumed to be
in an unknown state after this function returns or raises. It is up to
the caller to close `fileobj'.

`digest' must either be a hash algorithm name as a `str', a hash
constructor, or a callable that returns a hash object.

Example:

@example
>>> import io, hashlib, hmac
>>> with open("library/hashlib.rst", "rb") as f:
...     digest = hashlib.file_digest(f, "sha256")
...
>>> digest.hexdigest()
'...'
@end example

@example
>>> buf = io.BytesIO(b"somedata")
>>> mac1 = hmac.HMAC(b"key", digestmod=hashlib.sha512)
>>> digest = hashlib.file_digest(buf, lambda: mac1)
@end example

@example
>>> digest is mac1
True
>>> mac2 = hmac.HMAC(b"key", b"somedata", digestmod=hashlib.sha512)
>>> mac1.digest() == mac2.digest()
True
@end example


Added in version 3.11.



Changed in version 3.14: Now raises a @ref{237,,BlockingIOError} if the file is opened in non-blocking
mode. Previously, spurious null bytes were added to the digest.

@end deffn

@node Key derivation,BLAKE2,File hashing,hashlib — Secure hashes and message digests
@anchor{library/hashlib key-derivation}@anchor{3042}
@subsubsection Key derivation


Key derivation and key stretching algorithms are designed for secure password
hashing. Naive algorithms such as @code{sha1(password)} are not resistant against
brute-force attacks. A good password hashing function must be tunable, slow, and
include a salt@footnote{https://en.wikipedia.org/wiki/Salt_%28cryptography%29}.

@geindex pbkdf2_hmac() (in module hashlib)
@anchor{library/hashlib hashlib pbkdf2_hmac}@anchor{734}
@deffn {Function} hashlib.pbkdf2_hmac (hash_name, password, salt, iterations, dklen=None)

The function provides PKCS#5 password-based key derivation function 2. It
uses HMAC as pseudorandom function.

The string `hash_name' is the desired name of the hash digest algorithm for
HMAC, e.g. ‘sha1’ or ‘sha256’. `password' and `salt' are interpreted as
buffers of bytes. Applications and libraries should limit `password' to
a sensible length (e.g. 1024). `salt' should be about 16 or more bytes from
a proper source, e.g. @ref{747,,os.urandom()}.

The number of `iterations' should be chosen based on the hash algorithm and
computing power. As of 2022, hundreds of thousands of iterations of SHA-256
are suggested. For rationale as to why and how to choose what is best for
your application, read `Appendix A.2.2' of NIST-SP-800-132@footnote{https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-132.pdf}. The answers
on the stackexchange pbkdf2 iterations question@footnote{https://security.stackexchange.com/questions/3959/recommended-of-iterations-when-using-pbkdf2-sha256/} explain in detail.

`dklen' is the length of the derived key in bytes. If `dklen' is @code{None} then the
digest size of the hash algorithm `hash_name' is used, e.g. 64 for SHA-512.

@example
>>> from hashlib import pbkdf2_hmac
>>> our_app_iters = 500_000  # Application specific, read above.
>>> dk = pbkdf2_hmac('sha256', b'password', b'bad salt' * 2, our_app_iters)
>>> dk.hex()
'15530bba69924174860db778f2c6f8104d3aaf9d26241840c8c4a641c8d000a9'
@end example

Function only available when Python is compiled with OpenSSL.


Added in version 3.4.



Changed in version 3.12: Function now only available when Python is built with OpenSSL. The slow
pure Python implementation has been removed.

@end deffn

@geindex scrypt() (in module hashlib)
@anchor{library/hashlib hashlib scrypt}@anchor{e3e}
@deffn {Function} hashlib.scrypt (password, *, salt, n, r, p, maxmem=0, dklen=64)

The function provides scrypt password-based key derivation function as
defined in 
@geindex RFC; RFC 7914
RFC 7914@footnote{https://datatracker.ietf.org/doc/html/rfc7914.html}.

`password' and `salt' must be @ref{194,,bytes-like objects}.  Applications and libraries should limit `password'
to a sensible length (e.g. 1024).  `salt' should be about 16 or more
bytes from a proper source, e.g. @ref{747,,os.urandom()}.

`n' is the CPU/Memory cost factor, `r' the block size, `p' parallelization
factor and `maxmem' limits memory (OpenSSL 1.1.0 defaults to 32 MiB).
`dklen' is the length of the derived key in bytes.


Added in version 3.6.

@end deffn

@node BLAKE2,,Key derivation,hashlib — Secure hashes and message digests
@anchor{library/hashlib blake2}@anchor{3043}@anchor{library/hashlib hashlib-blake2}@anchor{3044}
@subsubsection BLAKE2


@geindex blake2b@comma{} blake2s

BLAKE2@footnote{https://www.blake2.net} is a cryptographic hash function defined in 
@geindex RFC; RFC 7693
RFC 7693@footnote{https://datatracker.ietf.org/doc/html/rfc7693.html} that comes in two
flavors:


@itemize *

@item 
`BLAKE2b', optimized for 64-bit platforms and produces digests of any size
between 1 and 64 bytes,

@item 
`BLAKE2s', optimized for 8- to 32-bit platforms and produces digests of any
size between 1 and 32 bytes.
@end itemize

BLAKE2 supports `keyed mode' (a faster and simpler replacement for HMAC@footnote{https://en.wikipedia.org/wiki/Hash-based_message_authentication_code}),
`salted hashing', `personalization', and `tree hashing'.

Hash objects from this module follow the API of standard library’s
@code{hashlib} objects.

@menu
* Creating hash objects:: 
* Constants: Constants<5>. 
* Examples: Examples<14>. 
* Credits:: 

@end menu

@node Creating hash objects,Constants<5>,,BLAKE2
@anchor{library/hashlib creating-hash-objects}@anchor{3045}
@subsubsection Creating hash objects


New hash objects are created by calling constructor functions:

@geindex blake2b() (in module hashlib)
@anchor{library/hashlib hashlib blake2b}@anchor{853}
@deffn {Function} hashlib.blake2b (data=b'@w{'}, *, digest_size=64, key=b'@w{'}, salt=b'@w{'}, person=b'@w{'}, fanout=1, depth=1, leaf_size=0, node_offset=0, node_depth=0, inner_size=0, last_node=False, usedforsecurity=True)
@end deffn

@geindex blake2s() (in module hashlib)
@anchor{library/hashlib hashlib blake2s}@anchor{854}
@deffn {Function} hashlib.blake2s (data=b'@w{'}, *, digest_size=32, key=b'@w{'}, salt=b'@w{'}, person=b'@w{'}, fanout=1, depth=1, leaf_size=0, node_offset=0, node_depth=0, inner_size=0, last_node=False, usedforsecurity=True)
@end deffn

These functions return the corresponding hash objects for calculating
BLAKE2b or BLAKE2s. They optionally take these general parameters:


@itemize *

@item 
`data': initial chunk of data to hash, which must be
@ref{194,,bytes-like object}.  It can be passed only as positional argument.

@item 
`digest_size': size of output digest in bytes.

@item 
`key': key for keyed hashing (up to 64 bytes for BLAKE2b, up to 32 bytes for
BLAKE2s).

@item 
`salt': salt for randomized hashing (up to 16 bytes for BLAKE2b, up to 8
bytes for BLAKE2s).

@item 
`person': personalization string (up to 16 bytes for BLAKE2b, up to 8 bytes
for BLAKE2s).
@end itemize

The following table shows limits for general parameters (in bytes):


@multitable {xxxxxxxxx} {xxxxxxxxxxxxx} {xxxxxxxxxx} {xxxxxxxxxxx} {xxxxxxxxxxxxx} 
@headitem

Hash

@tab

digest_size

@tab

len(key)

@tab

len(salt)

@tab

len(person)

@item

BLAKE2b

@tab

64

@tab

64

@tab

16

@tab

16

@item

BLAKE2s

@tab

32

@tab

32

@tab

8

@tab

8

@end multitable


@cartouche
@quotation Note 
BLAKE2 specification defines constant lengths for salt and personalization
parameters, however, for convenience, this implementation accepts byte
strings of any size up to the specified length. If the length of the
parameter is less than specified, it is padded with zeros, thus, for
example, @code{b'salt'} and @code{b'salt\x00'} is the same value. (This is not
the case for `key'.)
@end quotation
@end cartouche

These sizes are available as module @ref{3046,,constants} described below.

Constructor functions also accept the following tree hashing parameters:


@itemize *

@item 
`fanout': fanout (0 to 255, 0 if unlimited, 1 in sequential mode).

@item 
`depth': maximal depth of tree (1 to 255, 255 if unlimited, 1 in
sequential mode).

@item 
`leaf_size': maximal byte length of leaf (0 to @code{2**32-1}, 0 if unlimited or in
sequential mode).

@item 
`node_offset': node offset (0 to @code{2**64-1} for BLAKE2b, 0 to @code{2**48-1} for
BLAKE2s, 0 for the first, leftmost, leaf, or in sequential mode).

@item 
`node_depth': node depth (0 to 255, 0 for leaves, or in sequential mode).

@item 
`inner_size': inner digest size (0 to 64 for BLAKE2b, 0 to 32 for
BLAKE2s, 0 in sequential mode).

@item 
`last_node': boolean indicating whether the processed node is the last
one (@code{False} for sequential mode).
@end itemize


@float Figure

@image{python-figures/hashlib-blake2-tree,,,Explanation of tree mode parameters.,png}

@end float


See section 2.10 in BLAKE2 specification@footnote{https://www.blake2.net/blake2_20130129.pdf} for comprehensive review of tree
hashing.

@node Constants<5>,Examples<14>,Creating hash objects,BLAKE2
@anchor{library/hashlib constants}@anchor{3046}
@subsubsection Constants


@geindex blake2b.SALT_SIZE (in module hashlib)
@anchor{library/hashlib hashlib blake2b SALT_SIZE}@anchor{3047}
@deffn {Data} blake2b.SALT_SIZE
@end deffn

@geindex blake2s.SALT_SIZE (in module hashlib)
@anchor{library/hashlib hashlib blake2s SALT_SIZE}@anchor{3048}
@deffn {Data} blake2s.SALT_SIZE
@end deffn

Salt length (maximum length accepted by constructors).

@geindex blake2b.PERSON_SIZE (in module hashlib)
@anchor{library/hashlib hashlib blake2b PERSON_SIZE}@anchor{3049}
@deffn {Data} blake2b.PERSON_SIZE
@end deffn

@geindex blake2s.PERSON_SIZE (in module hashlib)
@anchor{library/hashlib hashlib blake2s PERSON_SIZE}@anchor{304a}
@deffn {Data} blake2s.PERSON_SIZE
@end deffn

Personalization string length (maximum length accepted by constructors).

@geindex blake2b.MAX_KEY_SIZE (in module hashlib)
@anchor{library/hashlib hashlib blake2b MAX_KEY_SIZE}@anchor{304b}
@deffn {Data} blake2b.MAX_KEY_SIZE
@end deffn

@geindex blake2s.MAX_KEY_SIZE (in module hashlib)
@anchor{library/hashlib hashlib blake2s MAX_KEY_SIZE}@anchor{304c}
@deffn {Data} blake2s.MAX_KEY_SIZE
@end deffn

Maximum key size.

@geindex blake2b.MAX_DIGEST_SIZE (in module hashlib)
@anchor{library/hashlib hashlib blake2b MAX_DIGEST_SIZE}@anchor{304d}
@deffn {Data} blake2b.MAX_DIGEST_SIZE
@end deffn

@geindex blake2s.MAX_DIGEST_SIZE (in module hashlib)
@anchor{library/hashlib hashlib blake2s MAX_DIGEST_SIZE}@anchor{304e}
@deffn {Data} blake2s.MAX_DIGEST_SIZE
@end deffn

Maximum digest size that the hash function can output.

@node Examples<14>,Credits,Constants<5>,BLAKE2
@anchor{library/hashlib examples}@anchor{304f}
@subsubsection Examples


@menu
* Simple hashing:: 
* Using different digest sizes:: 
* Keyed hashing:: 
* Randomized hashing:: 
* Personalization:: 
* Tree mode:: 

@end menu

@node Simple hashing,Using different digest sizes,,Examples<14>
@anchor{library/hashlib simple-hashing}@anchor{3050}
@subsubsection Simple hashing


To calculate hash of some data, you should first construct a hash object by
calling the appropriate constructor function (@ref{853,,blake2b()} or
@ref{854,,blake2s()}), then update it with the data by calling @ref{3030,,update()} on the
object, and, finally, get the digest out of the object by calling
@ref{3031,,digest()} (or @ref{3032,,hexdigest()} for hex-encoded string).

@example
>>> from hashlib import blake2b
>>> h = blake2b()
>>> h.update(b'Hello world')
>>> h.hexdigest()
'6ff843ba685842aa82031d3f53c48b66326df7639a63d128974c5c14f31a0f33343a8c65551134ed1ae0f2b0dd2bb495dc81039e3eeb0aa1bb0388bbeac29183'
@end example

As a shortcut, you can pass the first chunk of data to update directly to the
constructor as the positional argument:

@example
>>> from hashlib import blake2b
>>> blake2b(b'Hello world').hexdigest()
'6ff843ba685842aa82031d3f53c48b66326df7639a63d128974c5c14f31a0f33343a8c65551134ed1ae0f2b0dd2bb495dc81039e3eeb0aa1bb0388bbeac29183'
@end example

You can call @ref{3030,,hash.update()} as many times as you need to iteratively
update the hash:

@example
>>> from hashlib import blake2b
>>> items = [b'Hello', b' ', b'world']
>>> h = blake2b()
>>> for item in items:
...     h.update(item)
...
>>> h.hexdigest()
'6ff843ba685842aa82031d3f53c48b66326df7639a63d128974c5c14f31a0f33343a8c65551134ed1ae0f2b0dd2bb495dc81039e3eeb0aa1bb0388bbeac29183'
@end example

@node Using different digest sizes,Keyed hashing,Simple hashing,Examples<14>
@anchor{library/hashlib using-different-digest-sizes}@anchor{3051}
@subsubsection Using different digest sizes


BLAKE2 has configurable size of digests up to 64 bytes for BLAKE2b and up to 32
bytes for BLAKE2s. For example, to replace SHA-1 with BLAKE2b without changing
the size of output, we can tell BLAKE2b to produce 20-byte digests:

@example
>>> from hashlib import blake2b
>>> h = blake2b(digest_size=20)
>>> h.update(b'Replacing SHA1 with the more secure function')
>>> h.hexdigest()
'd24f26cf8de66472d58d4e1b1774b4c9158b1f4c'
>>> h.digest_size
20
>>> len(h.digest())
20
@end example

Hash objects with different digest sizes have completely different outputs
(shorter hashes are `not' prefixes of longer hashes); BLAKE2b and BLAKE2s
produce different outputs even if the output length is the same:

@example
>>> from hashlib import blake2b, blake2s
>>> blake2b(digest_size=10).hexdigest()
'6fa1d8fcfd719046d762'
>>> blake2b(digest_size=11).hexdigest()
'eb6ec15daf9546254f0809'
>>> blake2s(digest_size=10).hexdigest()
'1bf21a98c78a1c376ae9'
>>> blake2s(digest_size=11).hexdigest()
'567004bf96e4a25773ebf4'
@end example

@node Keyed hashing,Randomized hashing,Using different digest sizes,Examples<14>
@anchor{library/hashlib keyed-hashing}@anchor{3052}
@subsubsection Keyed hashing


Keyed hashing can be used for authentication as a faster and simpler
replacement for Hash-based message authentication code@footnote{https://en.wikipedia.org/wiki/HMAC} (HMAC).
BLAKE2 can be securely used in prefix-MAC mode thanks to the
indifferentiability property inherited from BLAKE.

This example shows how to get a (hex-encoded) 128-bit authentication code for
message @code{b'message data'} with key @code{b'pseudorandom key'}:

@example
>>> from hashlib import blake2b
>>> h = blake2b(key=b'pseudorandom key', digest_size=16)
>>> h.update(b'message data')
>>> h.hexdigest()
'3d363ff7401e02026f4a4687d4863ced'
@end example

As a practical example, a web application can symmetrically sign cookies sent
to users and later verify them to make sure they weren’t tampered with:

@example
>>> from hashlib import blake2b
>>> from hmac import compare_digest
>>>
>>> SECRET_KEY = b'pseudorandomly generated server secret key'
>>> AUTH_SIZE = 16
>>>
>>> def sign(cookie):
...     h = blake2b(digest_size=AUTH_SIZE, key=SECRET_KEY)
...     h.update(cookie)
...     return h.hexdigest().encode('utf-8')
>>>
>>> def verify(cookie, sig):
...     good_sig = sign(cookie)
...     return compare_digest(good_sig, sig)
>>>
>>> cookie = b'user-alice'
>>> sig = sign(cookie)
>>> print("@{0@},@{1@}".format(cookie.decode('utf-8'), sig))
user-alice,b'43b3c982cf697e0c5ab22172d1ca7421'
>>> verify(cookie, sig)
True
>>> verify(b'user-bob', sig)
False
>>> verify(cookie, b'0102030405060708090a0b0c0d0e0f00')
False
@end example

Even though there’s a native keyed hashing mode, BLAKE2 can, of course, be used
in HMAC construction with @ref{6e,,hmac} module:

@example
>>> import hmac, hashlib
>>> m = hmac.new(b'secret key', digestmod=hashlib.blake2s)
>>> m.update(b'message')
>>> m.hexdigest()
'e3c8102868d28b5ff85fc35dda07329970d1a01e273c37481326fe0c861c8142'
@end example

@node Randomized hashing,Personalization,Keyed hashing,Examples<14>
@anchor{library/hashlib randomized-hashing}@anchor{3053}
@subsubsection Randomized hashing


By setting `salt' parameter users can introduce randomization to the hash
function. Randomized hashing is useful for protecting against collision attacks
on the hash function used in digital signatures.

@quotation

Randomized hashing is designed for situations where one party, the message
preparer, generates all or part of a message to be signed by a second
party, the message signer. If the message preparer is able to find
cryptographic hash function collisions (i.e., two messages producing the
same hash value), then they might prepare meaningful versions of the message
that would produce the same hash value and digital signature, but with
different results (e.g., transferring $1,000,000 to an account, rather than
$10). Cryptographic hash functions have been designed with collision
resistance as a major goal, but the current concentration on attacking
cryptographic hash functions may result in a given cryptographic hash
function providing less collision resistance than expected. Randomized
hashing offers the signer additional protection by reducing the likelihood
that a preparer can generate two or more messages that ultimately yield the
same hash value during the digital signature generation process — even if
it is practical to find collisions for the hash function. However, the use
of randomized hashing may reduce the amount of security provided by a
digital signature when all portions of the message are prepared
by the signer.

(NIST SP-800-106 "Randomized Hashing for Digital Signatures"@footnote{https://csrc.nist.gov/pubs/sp/800/106/final})
@end quotation

In BLAKE2 the salt is processed as a one-time input to the hash function during
initialization, rather than as an input to each compression function.

@cartouche
@quotation Warning 
`Salted hashing' (or just hashing) with BLAKE2 or any other general-purpose
cryptographic hash function, such as SHA-256, is not suitable for hashing
passwords.  See BLAKE2 FAQ@footnote{https://www.blake2.net/#qa} for more
information.
@end quotation
@end cartouche


@example
>>> import os
>>> from hashlib import blake2b
>>> msg = b'some message'
>>> # Calculate the first hash with a random salt.
>>> salt1 = os.urandom(blake2b.SALT_SIZE)
>>> h1 = blake2b(salt=salt1)
>>> h1.update(msg)
>>> # Calculate the second hash with a different random salt.
>>> salt2 = os.urandom(blake2b.SALT_SIZE)
>>> h2 = blake2b(salt=salt2)
>>> h2.update(msg)
>>> # The digests are different.
>>> h1.digest() != h2.digest()
True
@end example

@node Personalization,Tree mode,Randomized hashing,Examples<14>
@anchor{library/hashlib personalization}@anchor{3054}
@subsubsection Personalization


Sometimes it is useful to force hash function to produce different digests for
the same input for different purposes. Quoting the authors of the Skein hash
function:

@quotation

We recommend that all application designers seriously consider doing this;
we have seen many protocols where a hash that is computed in one part of
the protocol can be used in an entirely different part because two hash
computations were done on similar or related data, and the attacker can
force the application to make the hash inputs the same. Personalizing each
hash function used in the protocol summarily stops this type of attack.

(The Skein Hash Function Family@footnote{https://www.schneier.com/wp-content/uploads/2016/02/skein.pdf},
p. 21)
@end quotation

BLAKE2 can be personalized by passing bytes to the `person' argument:

@example
>>> from hashlib import blake2b
>>> FILES_HASH_PERSON = b'MyApp Files Hash'
>>> BLOCK_HASH_PERSON = b'MyApp Block Hash'
>>> h = blake2b(digest_size=32, person=FILES_HASH_PERSON)
>>> h.update(b'the same content')
>>> h.hexdigest()
'20d9cd024d4fb086aae819a1432dd2466de12947831b75c5a30cf2676095d3b4'
>>> h = blake2b(digest_size=32, person=BLOCK_HASH_PERSON)
>>> h.update(b'the same content')
>>> h.hexdigest()
'cf68fb5761b9c44e7878bfb2c4c9aea52264a80b75005e65619778de59f383a3'
@end example

Personalization together with the keyed mode can also be used to derive different
keys from a single one.

@example
>>> from hashlib import blake2s
>>> from base64 import b64decode, b64encode
>>> orig_key = b64decode(b'Rm5EPJai72qcK3RGBpW3vPNfZy5OZothY+kHY6h21KM=')
>>> enc_key = blake2s(key=orig_key, person=b'kEncrypt').digest()
>>> mac_key = blake2s(key=orig_key, person=b'kMAC').digest()
>>> print(b64encode(enc_key).decode('utf-8'))
rbPb15S/Z9t+agffno5wuhB77VbRi6F9Iv2qIxU7WHw=
>>> print(b64encode(mac_key).decode('utf-8'))
G9GtHFE1YluXY1zWPlYk1e/nWfu0WSEb0KRcjhDeP/o=
@end example

@node Tree mode,,Personalization,Examples<14>
@anchor{library/hashlib tree-mode}@anchor{3055}
@subsubsection Tree mode


Here’s an example of hashing a minimal tree with two leaf nodes:

@example
  10
 /  \
00  01
@end example

This example uses 64-byte internal digests, and returns the 32-byte final
digest:

@example
>>> from hashlib import blake2b
>>>
>>> FANOUT = 2
>>> DEPTH = 2
>>> LEAF_SIZE = 4096
>>> INNER_SIZE = 64
>>>
>>> buf = bytearray(6000)
>>>
>>> # Left leaf
... h00 = blake2b(buf[0:LEAF_SIZE], fanout=FANOUT, depth=DEPTH,
...               leaf_size=LEAF_SIZE, inner_size=INNER_SIZE,
...               node_offset=0, node_depth=0, last_node=False)
>>> # Right leaf
... h01 = blake2b(buf[LEAF_SIZE:], fanout=FANOUT, depth=DEPTH,
...               leaf_size=LEAF_SIZE, inner_size=INNER_SIZE,
...               node_offset=1, node_depth=0, last_node=True)
>>> # Root node
... h10 = blake2b(digest_size=32, fanout=FANOUT, depth=DEPTH,
...               leaf_size=LEAF_SIZE, inner_size=INNER_SIZE,
...               node_offset=0, node_depth=1, last_node=True)
>>> h10.update(h00.digest())
>>> h10.update(h01.digest())
>>> h10.hexdigest()
'3ad2a9b37c6070e374c7a8c508fe20ca86b6ed54e286e93a0318e95e881db5aa'
@end example

@node Credits,,Examples<14>,BLAKE2
@anchor{library/hashlib credits}@anchor{3056}
@subsubsection Credits


BLAKE2@footnote{https://www.blake2.net} was designed by `Jean-Philippe Aumasson', `Samuel Neves', `Zooko
Wilcox-O’Hearn', and `Christian Winnerlein' based on SHA-3@footnote{https://en.wikipedia.org/wiki/Secure_Hash_Algorithms} finalist BLAKE@footnote{https://web.archive.org/web/20200918190133/https://131002.net/blake/}
created by `Jean-Philippe Aumasson', `Luca Henzen', `Willi Meier', and
`Raphael C.-W. Phan'.

It uses core algorithm from ChaCha@footnote{https://cr.yp.to/chacha.html} cipher designed by `Daniel J.  Bernstein'.

The stdlib implementation is based on pyblake2@footnote{https://pythonhosted.org/pyblake2/} module. It was written by
`Dmitry Chestnykh' based on C implementation written by `Samuel Neves'. The
documentation was copied from pyblake2@footnote{https://pythonhosted.org/pyblake2/} and written by `Dmitry Chestnykh'.

The C code was partly rewritten for Python by `Christian Heimes'.

The following public domain dedication applies for both C hash function
implementation, extension code, and this documentation:

@quotation

To the extent possible under law, the author(s) have dedicated all copyright
and related and neighboring rights to this software to the public domain
worldwide. This software is distributed without any warranty.

You should have received a copy of the CC0 Public Domain Dedication along
with this software. If not, see
@indicateurl{https://creativecommons.org/publicdomain/zero/1.0/}.
@end quotation

The following people have helped with development or contributed their changes
to the project and the public domain according to the Creative Commons Public
Domain Dedication 1.0 Universal:


@itemize *

@item 
`Alexandr Sokolovskiy'
@end itemize
@anchor{library/hashlib hashlib-seealso}@anchor{3037}

@subsubheading See also



@table @asis

@item Module @ref{6e,,hmac}

A module to generate message authentication codes using hashes.

@item Module @ref{f,,base64}

Another way to encode binary hashes for non-binary environments.

@item @indicateurl{https://nvlpubs.nist.gov/nistpubs/fips/nist.fips.180-4.pdf}

The FIPS 180-4 publication on Secure Hash Algorithms.

@item @indicateurl{https://csrc.nist.gov/pubs/fips/202/final}

The FIPS 202 publication on the SHA-3 Standard.

@item @indicateurl{https://www.blake2.net/}

Official BLAKE2 website.

@item @indicateurl{https://en.wikipedia.org/wiki/Cryptographic_hash_function}

Wikipedia article with information on which algorithms have known issues
and what that means regarding their use.

@item @indicateurl{https://www.ietf.org/rfc/rfc8018.txt}

PKCS #5: Password-Based Cryptography Specification Version 2.1

@item @indicateurl{https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-132.pdf}

NIST Recommendation for Password-Based Key Derivation.
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node hmac — Keyed-Hashing for Message Authentication,secrets — Generate secure random numbers for managing secrets,hashlib — Secure hashes and message digests,Cryptographic Services
@anchor{library/hmac doc}@anchor{3057}@anchor{library/hmac hmac-keyed-hashing-for-message-authentication}@anchor{3058}@anchor{library/hmac module-hmac}@anchor{6e}@anchor{library/hmac translation-repo}@anchor{3059}
@subsection @code{hmac} — Keyed-Hashing for Message Authentication


@geindex module; hmac

`Source code:' Lib/hmac.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/hmac.py}


__________________________________________________________________


This module implements the HMAC algorithm as described by 
@geindex RFC; RFC 2104
RFC 2104@footnote{https://datatracker.ietf.org/doc/html/rfc2104.html}.
The interface allows to use any hash function with a `fixed' digest size.
In particular, extendable output functions such as SHAKE-128 or SHAKE-256
cannot be used with HMAC.

@geindex new() (in module hmac)
@anchor{library/hmac hmac new}@anchor{c9c}
@deffn {Function} hmac.new (key, msg=None, digestmod)

Return a new hmac object.  `key' is a bytes or bytearray object giving the
secret key.  If `msg' is present, the method call @code{update(msg)} is made.
`digestmod' is the digest name, digest constructor or module for the HMAC
object to use.  It may be any name suitable to @ref{1d72,,hashlib.new()}.
Despite its argument position, it is required.


Changed in version 3.4: Parameter `key' can be a bytes or bytearray object.
Parameter `msg' can be of any type supported by @ref{6c,,hashlib}.
Parameter `digestmod' can be the name of a hash algorithm.



Changed in version 3.8: The `digestmod' argument is now required.  Pass it as a keyword
argument to avoid awkwardness when you do not have an initial `msg'.

@end deffn

@geindex digest() (in module hmac)
@anchor{library/hmac hmac digest}@anchor{d38}
@deffn {Function} hmac.digest (key, msg, digest)

Return digest of `msg' for given secret `key' and `digest'. The
function is equivalent to @code{HMAC(key, msg, digest).digest()}, but
uses an optimized C or inline implementation, which is faster for messages
that fit into memory. The parameters `key', `msg', and `digest' have
the same meaning as in @ref{c9c,,new()}.

CPython implementation detail, the optimized C implementation is only used
when `digest' is a string and name of a digest algorithm, which is
supported by OpenSSL.


Added in version 3.7.

@end deffn

@geindex HMAC (class in hmac)
@anchor{library/hmac hmac HMAC}@anchor{d39}
@deffn {Class} hmac.HMAC

An HMAC object has the following methods:
@end deffn

@geindex update() (hmac.HMAC method)
@anchor{library/hmac hmac HMAC update}@anchor{114f}
@deffn {Method} HMAC.update (msg)

Update the hmac object with `msg'.  Repeated calls are equivalent to a
single call with the concatenation of all the arguments:
@code{m.update(a); m.update(b)} is equivalent to @code{m.update(a + b)}.


Changed in version 3.4: Parameter `msg' can be of any type supported by @ref{6c,,hashlib}.

@end deffn

@geindex digest() (hmac.HMAC method)
@anchor{library/hmac hmac HMAC digest}@anchor{305a}
@deffn {Method} HMAC.digest ()

Return the digest of the bytes passed to the @ref{114f,,update()} method so far.
This bytes object will be the same length as the `digest_size' of the digest
given to the constructor.  It may contain non-ASCII bytes, including NUL
bytes.

@cartouche
@quotation Warning 
When comparing the output of @code{digest()} to an externally supplied
digest during a verification routine, it is recommended to use the
@ref{12d5,,compare_digest()} function instead of the @code{==} operator
to reduce the vulnerability to timing attacks.
@end quotation
@end cartouche
@end deffn

@geindex hexdigest() (hmac.HMAC method)
@anchor{library/hmac hmac HMAC hexdigest}@anchor{305b}
@deffn {Method} HMAC.hexdigest ()

Like @ref{d38,,digest()} except the digest is returned as a string twice the
length containing only hexadecimal digits.  This may be used to exchange the
value safely in email or other non-binary environments.

@cartouche
@quotation Warning 
When comparing the output of @code{hexdigest()} to an externally supplied
digest during a verification routine, it is recommended to use the
@ref{12d5,,compare_digest()} function instead of the @code{==} operator
to reduce the vulnerability to timing attacks.
@end quotation
@end cartouche
@end deffn

@geindex copy() (hmac.HMAC method)
@anchor{library/hmac hmac HMAC copy}@anchor{17d3}
@deffn {Method} HMAC.copy ()

Return a copy (“clone”) of the hmac object.  This can be used to efficiently
compute the digests of strings that share a common initial substring.
@end deffn

A hash object has the following attributes:

@geindex digest_size (hmac.HMAC attribute)
@anchor{library/hmac hmac HMAC digest_size}@anchor{1152}
@deffn {Attribute} HMAC.digest_size

The size of the resulting HMAC digest in bytes.
@end deffn

@geindex block_size (hmac.HMAC attribute)
@anchor{library/hmac hmac HMAC block_size}@anchor{1150}
@deffn {Attribute} HMAC.block_size

The internal block size of the hash algorithm in bytes.


Added in version 3.4.

@end deffn

@geindex name (hmac.HMAC attribute)
@anchor{library/hmac hmac HMAC name}@anchor{1151}
@deffn {Attribute} HMAC.name

The canonical name of this HMAC, always lowercase, e.g. @code{hmac-md5}.


Added in version 3.4.

@end deffn


Changed in version 3.10: Removed the undocumented attributes @code{HMAC.digest_cons}, @code{HMAC.inner},
and @code{HMAC.outer}.


This module also provides the following helper function:

@geindex compare_digest() (in module hmac)
@anchor{library/hmac hmac compare_digest}@anchor{12d5}
@deffn {Function} hmac.compare_digest (a, b)

Return @code{a == b}.  This function uses an approach designed to prevent
timing analysis by avoiding content-based short circuiting behaviour,
making it appropriate for cryptography.  `a' and `b' must both be of the
same type: either @ref{16a,,str} (ASCII only, as e.g. returned by
@ref{305b,,HMAC.hexdigest()}), or a @ref{194,,bytes-like object}.

@cartouche
@quotation Note 
If `a' and `b' are of different lengths, or if an error occurs,
a timing attack could theoretically reveal information about the
types and lengths of `a' and `b'—but not their values.
@end quotation
@end cartouche


Added in version 3.3.



Changed in version 3.10: The function uses OpenSSL’s @code{CRYPTO_memcmp()} internally when
available.

@end deffn


@subsubheading See also



@table @asis

@item Module @ref{6c,,hashlib}

The Python module providing secure hash functions.
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node secrets — Generate secure random numbers for managing secrets,,hmac — Keyed-Hashing for Message Authentication,Cryptographic Services
@anchor{library/secrets doc}@anchor{305c}@anchor{library/secrets module-secrets}@anchor{c5}@anchor{library/secrets secrets-generate-secure-random-numbers-for-managing-secrets}@anchor{305d}@anchor{library/secrets translation-repo}@anchor{305e}
@subsection @code{secrets} — Generate secure random numbers for managing secrets


@geindex module; secrets


Added in version 3.6.


@c from secrets import *
@c __name__ = '<doctest>'

`Source code:' Lib/secrets.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/secrets.py}


__________________________________________________________________


The @code{secrets} module is used for generating cryptographically strong
random numbers suitable for managing data such as passwords, account
authentication, security tokens, and related secrets.

In particular, @code{secrets} should be used in preference to the
default pseudo-random number generator in the @ref{bd,,random} module, which
is designed for modelling and simulation, not security or cryptography.


@subsubheading See also


@geindex Python Enhancement Proposals; PEP 506
PEP 506@footnote{https://peps.python.org/pep-0506/}


@menu
* Random numbers:: 
* Generating tokens:: 
* Other functions:: 
* Recipes and best practices:: 

@end menu

@node Random numbers,Generating tokens,,secrets — Generate secure random numbers for managing secrets
@anchor{library/secrets random-numbers}@anchor{305f}
@subsubsection Random numbers


The @code{secrets} module provides access to the most secure source of
randomness that your operating system provides.

@geindex SystemRandom (class in secrets)
@anchor{library/secrets secrets SystemRandom}@anchor{3060}
@deffn {Class} secrets.SystemRandom

A class for generating random numbers using the highest-quality
sources provided by the operating system.  See
@ref{2bc9,,random.SystemRandom} for additional details.
@end deffn

@geindex choice() (in module secrets)
@anchor{library/secrets secrets choice}@anchor{3061}
@deffn {Function} secrets.choice (seq)

Return a randomly chosen element from a non-empty sequence.
@end deffn

@geindex randbelow() (in module secrets)
@anchor{library/secrets secrets randbelow}@anchor{3062}
@deffn {Function} secrets.randbelow (exclusive_upper_bound)

Return a random int in the range [0, `exclusive_upper_bound').
@end deffn

@geindex randbits() (in module secrets)
@anchor{library/secrets secrets randbits}@anchor{3063}
@deffn {Function} secrets.randbits (k)

Return a non-negative int with `k' random bits.
@end deffn

@node Generating tokens,Other functions,Random numbers,secrets — Generate secure random numbers for managing secrets
@anchor{library/secrets generating-tokens}@anchor{3064}
@subsubsection Generating tokens


The @code{secrets} module provides functions for generating secure
tokens, suitable for applications such as password resets,
hard-to-guess URLs, and similar.

@geindex token_bytes() (in module secrets)
@anchor{library/secrets secrets token_bytes}@anchor{2bce}
@deffn {Function} secrets.token_bytes (nbytes=None)

Return a random byte string containing `nbytes' number of bytes.

If `nbytes' is not specified or @code{None}, @ref{3065,,DEFAULT_ENTROPY}
is used instead.

@example
>>> token_bytes(16)
b'\xebr\x17D*t\xae\xd4\xe3S\xb6\xe2\xebP1\x8b'
@end example
@end deffn

@geindex token_hex() (in module secrets)
@anchor{library/secrets secrets token_hex}@anchor{1b6a}
@deffn {Function} secrets.token_hex (nbytes=None)

Return a random text string, in hexadecimal.  The string has `nbytes'
random bytes, each byte converted to two hex digits.

If `nbytes' is not specified or @code{None}, @ref{3065,,DEFAULT_ENTROPY}
is used instead.

@example
>>> token_hex(16)
'f9bf78b9a18ce6d46a0cd2b0b86df9da'
@end example
@end deffn

@geindex token_urlsafe() (in module secrets)
@anchor{library/secrets secrets token_urlsafe}@anchor{3066}
@deffn {Function} secrets.token_urlsafe (nbytes=None)

Return a random URL-safe text string, containing `nbytes' random
bytes.  The text is Base64 encoded, so on average each byte results
in approximately 1.3 characters.

If `nbytes' is not specified or @code{None}, @ref{3065,,DEFAULT_ENTROPY}
is used instead.

@example
>>> token_urlsafe(16)
'Drmhze6EPcv0fN_81Bj-nA'
@end example
@end deffn

@menu
* How many bytes should tokens use?:: 

@end menu

@node How many bytes should tokens use?,,,Generating tokens
@anchor{library/secrets how-many-bytes-should-tokens-use}@anchor{3067}
@subsubsection How many bytes should tokens use?


To be secure against
brute-force attacks@footnote{https://en.wikipedia.org/wiki/Brute-force_attack},
tokens need to have sufficient randomness.  Unfortunately, what is
considered sufficient will necessarily increase as computers get more
powerful and able to make more guesses in a shorter period.  As of 2015,
it is believed that 32 bytes (256 bits) of randomness is sufficient for
the typical use-case expected for the @code{secrets} module.

For those who want to manage their own token length, you can explicitly
specify how much randomness is used for tokens by giving an @ref{19c,,int}
argument to the various @code{token_*} functions.  That argument is taken
as the number of bytes of randomness to use.

Otherwise, if no argument is provided, or if the argument is @code{None},
the @code{token_*} functions use @ref{3065,,DEFAULT_ENTROPY} instead.

@geindex DEFAULT_ENTROPY (in module secrets)
@anchor{library/secrets secrets DEFAULT_ENTROPY}@anchor{3065}
@deffn {Data} secrets.DEFAULT_ENTROPY

Default number of bytes of randomness used by the @code{token_*} functions.

The exact value is subject to change at any time, including during
maintenance releases.
@end deffn

@node Other functions,Recipes and best practices,Generating tokens,secrets — Generate secure random numbers for managing secrets
@anchor{library/secrets other-functions}@anchor{3068}
@subsubsection Other functions


@geindex compare_digest() (in module secrets)
@anchor{library/secrets secrets compare_digest}@anchor{3069}
@deffn {Function} secrets.compare_digest (a, b)

Return @code{True} if strings or
@ref{194,,bytes-like objects}
`a' and `b' are equal, otherwise @code{False},
using a “constant-time compare” to reduce the risk of
timing attacks@footnote{https://codahale.com/a-lesson-in-timing-attacks/}.
See @ref{12d5,,hmac.compare_digest()} for additional details.
@end deffn

@node Recipes and best practices,,Other functions,secrets — Generate secure random numbers for managing secrets
@anchor{library/secrets recipes-and-best-practices}@anchor{306a}
@subsubsection Recipes and best practices


This section shows recipes and best practices for using @code{secrets}
to manage a basic level of security.

Generate an eight-character alphanumeric password:

@example
import string
import secrets
alphabet = string.ascii_letters + string.digits
password = '@w{'}.join(secrets.choice(alphabet) for i in range(8))
@end example

@cartouche
@quotation Note 
Applications should not
@geindex Common Weakness Enumeration; CWE 257
store passwords in a recoverable format@footnote{https://cwe.mitre.org/data/definitions/257.html},
whether plain text or encrypted.  They should be salted and hashed
using a cryptographically strong one-way (irreversible) hash function.
@end quotation
@end cartouche

Generate a ten-character alphanumeric password with at least one
lowercase character, at least one uppercase character, and at least
three digits:

@example
import string
import secrets
alphabet = string.ascii_letters + string.digits
while True:
    password = '@w{'}.join(secrets.choice(alphabet) for i in range(10))
    if (any(c.islower() for c in password)
            and any(c.isupper() for c in password)
            and sum(c.isdigit() for c in password) >= 3):
        break
@end example

Generate an XKCD-style passphrase@footnote{https://xkcd.com/936/}:

@example
import secrets
# On standard Linux systems, use a convenient dictionary file.
# Other platforms may need to provide their own word-list.
with open('/usr/share/dict/words') as f:
    words = [word.strip() for word in f]
    password = ' '.join(secrets.choice(words) for i in range(4))
@end example

Generate a hard-to-guess temporary URL containing a security token
suitable for password recovery applications:

@example
import secrets
url = 'https://example.com/reset=' + secrets.token_urlsafe()
@end example

@c # This modeline must appear within the last ten lines of the file.
@c kate: indent-width 3; remove-trailing-space on; replace-tabs on; encoding utf-8;

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Generic Operating System Services,Command-line interface libraries,Cryptographic Services,The Python Standard Library
@anchor{library/allos doc}@anchor{306b}@anchor{library/allos allos}@anchor{306c}@anchor{library/allos generic-operating-system-services}@anchor{306d}@anchor{library/allos translation-repo}@anchor{306e}
@section Generic Operating System Services


The modules described in this chapter provide interfaces to operating system
features that are available on (almost) all operating systems, such as files and
a clock.  The interfaces are generally modeled after the Unix or C interfaces,
but they are available on most other systems as well.  Here’s an overview:

@menu
* os — Miscellaneous operating system interfaces:: 
* io — Core tools for working with streams:: 
* time — Time access and conversions:: 
* logging — Logging facility for Python:: 
* logging.config — Logging configuration: logging config — Logging configuration. 
* logging.handlers — Logging handlers: logging handlers — Logging handlers. 
* platform — Access to underlying platform’s identifying data:: 
* errno — Standard errno system symbols:: 
* ctypes — A foreign function library for Python:: 

@end menu

@node os — Miscellaneous operating system interfaces,io — Core tools for working with streams,,Generic Operating System Services
@anchor{library/os doc}@anchor{306f}@anchor{library/os module-os}@anchor{a5}@anchor{library/os os-miscellaneous-operating-system-interfaces}@anchor{3070}
@subsection @code{os} — Miscellaneous operating system interfaces


@geindex module; os

`Source code:' Lib/os.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/os.py}


__________________________________________________________________


This module provides a portable way of using operating system dependent
functionality.  If you just want to read or write a file see @ref{318,,open()}, if
you want to manipulate paths, see the @ref{a6,,os.path} module, and if you want to
read all the lines in all the files on the command line see the @ref{5f,,fileinput}
module.  For creating temporary files and directories see the @ref{e6,,tempfile}
module, and for high-level file and directory handling see the @ref{ca,,shutil}
module.

Notes on the availability of these functions:


@itemize *

@item 
The design of all built-in operating system dependent modules of Python is
such that as long as the same functionality is available, it uses the same
interface; for example, the function @code{os.stat(path)} returns stat
information about `path' in the same format (which happens to have originated
with the POSIX interface).

@item 
Extensions peculiar to a particular operating system are also available
through the @code{os} module, but using them is of course a threat to
portability.

@item 
All functions accepting path or file names accept both bytes and string
objects, and result in an object of the same type, if a path or file name is
returned.

@item 
On VxWorks, os.popen, os.fork, os.execv and os.spawn*p* are not supported.

@item 
On WebAssembly platforms, Android and iOS, large parts of the @code{os} module are
not available or behave differently. APIs related to processes (e.g.
@ref{4b6,,fork()}, @ref{1305,,execve()}) and resources (e.g. @ref{130d,,nice()})
are not available. Others like @ref{1861,,getuid()} and @ref{3071,,getpid()} are
emulated or stubs. WebAssembly platforms also lack support for signals (e.g.
@ref{1573,,kill()}, @ref{f9e,,wait()}).
@end itemize

@cartouche
@quotation Note 
All functions in this module raise @ref{2c2,,OSError} (or subclasses thereof) in
the case of invalid or inaccessible file names and paths, or other arguments
that have the correct type, but are not accepted by the operating system.
@end quotation
@end cartouche

@geindex error
@anchor{library/os os error}@anchor{3072}
@deffn {Exception} os.error

An alias for the built-in @ref{2c2,,OSError} exception.
@end deffn

@geindex name (in module os)
@anchor{library/os os name}@anchor{3073}
@deffn {Data} os.name

The name of the operating system dependent module imported.  The following
names have currently been registered: @code{'posix'}, @code{'nt'},
@code{'java'}.


@subsubheading See also


@ref{293,,sys.platform} has a finer granularity.  @ref{1322,,os.uname()} gives
system-dependent version information.

The @ref{af,,platform} module provides detailed checks for the
system’s identity.

@end deffn
@anchor{library/os os-filenames}@anchor{2fb4}
@menu
* File Names@comma{} Command Line Arguments@comma{} and Environment Variables: File Names Command Line Arguments and Environment Variables. 
* Python UTF-8 Mode:: 
* Process Parameters:: 
* File Object Creation:: 
* File Descriptor Operations:: 
* Files and Directories:: 
* Process Management:: 
* Interface to the scheduler:: 
* Miscellaneous System Information:: 
* Random numbers: Random numbers<2>. 

@end menu

@node File Names Command Line Arguments and Environment Variables,Python UTF-8 Mode,,os — Miscellaneous operating system interfaces
@anchor{library/os file-names-command-line-arguments-and-environment-variables}@anchor{3074}@anchor{library/os filesystem-encoding}@anchor{2ca6}
@subsubsection File Names, Command Line Arguments, and Environment Variables


In Python, file names, command line arguments, and environment variables are
represented using the string type. On some systems, decoding these strings to
and from bytes is necessary before passing them to the operating system. Python
uses the @ref{75e,,filesystem encoding and error handler} to perform this
conversion (see @ref{e59,,sys.getfilesystemencoding()}).

The @ref{75e,,filesystem encoding and error handler} are configured at Python
startup by the @ref{998,,PyConfig_Read()} function: see
@ref{419,,filesystem_encoding} and
@ref{41a,,filesystem_errors} members of @ref{3f5,,PyConfig}.


Changed in version 3.1: On some systems, conversion using the file system encoding may fail. In this
case, Python uses the @ref{28be,,surrogateescape encoding error handler}, which means that undecodable bytes are replaced by a
Unicode character U+DC`xx' on decoding, and these are again
translated to the original byte on encoding.


The @ref{75e,,file system encoding} must
guarantee to successfully decode all bytes below 128. If the file system
encoding fails to provide this guarantee, API functions can raise
@ref{460,,UnicodeError}.

See also the @ref{54b,,locale encoding}.

@node Python UTF-8 Mode,Process Parameters,File Names Command Line Arguments and Environment Variables,os — Miscellaneous operating system interfaces
@anchor{library/os python-utf-8-mode}@anchor{3075}@anchor{library/os utf8-mode}@anchor{868}
@subsubsection Python UTF-8 Mode



Added in version 3.7: See 
@geindex Python Enhancement Proposals; PEP 540
PEP 540@footnote{https://peps.python.org/pep-0540/} for more details.


The Python UTF-8 Mode ignores the @ref{54b,,locale encoding} and forces the usage
of the UTF-8 encoding:


@itemize *

@item 
Use UTF-8 as the @ref{75e,,filesystem encoding}.

@item 
@ref{e59,,sys.getfilesystemencoding()} returns @code{'utf-8'}.

@item 
@ref{75d,,locale.getpreferredencoding()} returns @code{'utf-8'} (the `do_setlocale'
argument has no effect).

@item 
@ref{760,,sys.stdin}, @ref{cd3,,sys.stdout}, and @ref{b39,,sys.stderr} all use
UTF-8 as their text encoding, with the @code{surrogateescape}
@ref{1bb3,,error handler} being enabled for @code{sys.stdin}
and @code{sys.stdout} (@code{sys.stderr} continues to use
@code{backslashreplace} as it does in the default locale-aware mode)

@item 
On Unix, @ref{1c78,,os.device_encoding()} returns @code{'utf-8'} rather than the
device encoding.
@end itemize

Note that the standard stream settings in UTF-8 mode can be overridden by
@geindex PYTHONIOENCODING
@geindex environment variable; PYTHONIOENCODING
@ref{1210,,PYTHONIOENCODING} (just as they can be in the default locale-aware
mode).

As a consequence of the changes in those lower level APIs, other higher
level APIs also exhibit different default behaviours:


@itemize *

@item 
Command line arguments, environment variables and filenames are decoded
to text using the UTF-8 encoding.

@item 
@ref{e54,,os.fsdecode()} and @ref{e55,,os.fsencode()} use the UTF-8 encoding.

@item 
@ref{318,,open()}, @ref{741,,io.open()}, and @ref{317,,codecs.open()} use the UTF-8
encoding by default. However, they still use the strict error handler by
default so that attempting to open a binary file in text mode is likely
to raise an exception rather than producing nonsense data.
@end itemize

The @ref{868,,Python UTF-8 Mode} is enabled if the LC_CTYPE locale is
@code{C} or @code{POSIX} at Python startup (see the @ref{998,,PyConfig_Read()}
function).

It can be enabled or disabled using the @ref{170,,-X utf8} command line
option and the 
@geindex PYTHONUTF8
@geindex environment variable; PYTHONUTF8
@ref{cd5,,PYTHONUTF8} environment variable.

If the 
@geindex PYTHONUTF8
@geindex environment variable; PYTHONUTF8
@ref{cd5,,PYTHONUTF8} environment variable is not set at all, then the
interpreter defaults to using the current locale settings, `unless' the current
locale is identified as a legacy ASCII-based locale (as described for
@geindex PYTHONCOERCECLOCALE
@geindex environment variable; PYTHONCOERCECLOCALE
@ref{cd2,,PYTHONCOERCECLOCALE}), and locale coercion is either disabled or
fails. In such legacy locales, the interpreter will default to enabling UTF-8
mode unless explicitly instructed not to do so.

The Python UTF-8 Mode can only be enabled at the Python startup. Its value
can be read from @ref{89e,,sys.flags.utf8_mode}.

See also the @ref{2261,,UTF-8 mode on Windows}
and the @ref{75e,,filesystem encoding and error handler}.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 686

@item PEP 686@footnote{https://peps.python.org/pep-0686/}

Python 3.15 will make @ref{868,,Python UTF-8 Mode} default.
@end table


@node Process Parameters,File Object Creation,Python UTF-8 Mode,os — Miscellaneous operating system interfaces
@anchor{library/os os-procinfo}@anchor{3076}@anchor{library/os process-parameters}@anchor{3077}
@subsubsection Process Parameters


These functions and data items provide information and operate on the current
process and user.

@geindex ctermid() (in module os)
@anchor{library/os os ctermid}@anchor{3078}
@deffn {Function} os.ctermid ()

Return the filename corresponding to the controlling terminal of the process.

@ref{2181,,Availability}: Unix, not WASI.
@end deffn

@geindex environ (in module os)
@anchor{library/os os environ}@anchor{25b}
@deffn {Data} os.environ

A @ref{13c7,,mapping} object where keys and values are strings that represent
the process environment.  For example, @code{environ['HOME']} is the pathname
of your home directory (on some platforms), and is equivalent to
@code{getenv("HOME")} in C.

This mapping is captured the first time the @code{os} module is imported,
typically during Python startup as part of processing @code{site.py}.  Changes
to the environment made after this time are not reflected in @code{os.environ},
except for changes made by modifying @code{os.environ} directly.

This mapping may be used to modify the environment as well as query the
environment.  @ref{25d,,putenv()} will be called automatically when the mapping
is modified.

On Unix, keys and values use @ref{e59,,sys.getfilesystemencoding()} and
@code{'surrogateescape'} error handler. Use @ref{25c,,environb} if you would like
to use a different encoding.

On Windows, the keys are converted to uppercase. This also applies when
getting, setting, or deleting an item. For example,
@code{environ['monty'] = 'python'} maps the key @code{'MONTY'} to the value
@code{'python'}.

@cartouche
@quotation Note 
Calling @ref{25d,,putenv()} directly does not change @code{os.environ}, so it’s better
to modify @code{os.environ}.
@end quotation
@end cartouche

@cartouche
@quotation Note 
On some platforms, including FreeBSD and macOS, setting @code{environ} may
cause memory leaks.  Refer to the system documentation for
@code{putenv()}.
@end quotation
@end cartouche

You can delete items in this mapping to unset environment variables.
@ref{25e,,unsetenv()} will be called automatically when an item is deleted from
@code{os.environ}, and when one of the @code{pop()} or @code{clear()} methods is
called.


@subsubheading See also


The @ref{25a,,os.reload_environ()} function.



Changed in version 3.9: Updated to support 
@geindex Python Enhancement Proposals; PEP 584
PEP 584@footnote{https://peps.python.org/pep-0584/}’s merge (@code{|}) and update (@code{|=}) operators.

@end deffn

@geindex environb (in module os)
@anchor{library/os os environb}@anchor{25c}
@deffn {Data} os.environb

Bytes version of @ref{25b,,environ}: a @ref{13c7,,mapping} object where both keys
and values are @ref{193,,bytes} objects representing the process environment.
@code{environ} and @code{environb} are synchronized (modifying
@code{environb} updates @code{environ}, and vice versa).

@code{environb} is only available if @ref{1421,,supports_bytes_environ} is
@code{True}.


Added in version 3.2.



Changed in version 3.9: Updated to support 
@geindex Python Enhancement Proposals; PEP 584
PEP 584@footnote{https://peps.python.org/pep-0584/}’s merge (@code{|}) and update (@code{|=}) operators.

@end deffn

@geindex reload_environ() (in module os)
@anchor{library/os os reload_environ}@anchor{25a}
@deffn {Function} os.reload_environ ()

The @ref{25b,,os.environ} and @ref{25c,,os.environb} mappings are a cache of
environment variables at the time that Python started.
As such, changes to the current process environment are not reflected
if made outside Python, or by @ref{25d,,os.putenv()} or @ref{25e,,os.unsetenv()}.
Use @code{os.reload_environ()} to update @code{os.environ} and @code{os.environb}
with any such changes to the current process environment.

@cartouche
@quotation Warning 
This function is not thread-safe. Calling it while the environment is
being modified in another thread is an undefined behavior. Reading from
@ref{25b,,os.environ} or @ref{25c,,os.environb}, or calling @ref{3079,,os.getenv()}
while reloading, may return an empty result.
@end quotation
@end cartouche


Added in version 3.14.

@end deffn


@deffn {Function} os.chdir (path)

@deffnx {Function} os.fchdir (fd)

@deffnx {Function} os.getcwd ()

These functions are described in @ref{307a,,Files and Directories}.
@end deffn

@geindex fsencode() (in module os)
@anchor{library/os os fsencode}@anchor{e55}
@deffn {Function} os.fsencode (filename)

Encode @ref{5a1,,path-like} `filename' to the
@ref{75e,,filesystem encoding and error handler}; return @ref{193,,bytes}
unchanged.

@ref{e54,,fsdecode()} is the reverse function.


Added in version 3.2.



Changed in version 3.6: Support added to accept objects implementing the @ref{e51,,os.PathLike}
interface.

@end deffn

@geindex fsdecode() (in module os)
@anchor{library/os os fsdecode}@anchor{e54}
@deffn {Function} os.fsdecode (filename)

Decode the @ref{5a1,,path-like} `filename' from the
@ref{75e,,filesystem encoding and error handler}; return @ref{16a,,str}
unchanged.

@ref{e55,,fsencode()} is the reverse function.


Added in version 3.2.



Changed in version 3.6: Support added to accept objects implementing the @ref{e51,,os.PathLike}
interface.

@end deffn

@geindex fspath() (in module os)
@anchor{library/os os fspath}@anchor{e53}
@deffn {Function} os.fspath (path)

Return the file system representation of the path.

If @ref{16a,,str} or @ref{193,,bytes} is passed in, it is returned unchanged.
Otherwise @ref{e52,,__fspath__()} is called and its value is
returned as long as it is a @code{str} or @code{bytes} object.
In all other cases, @ref{199,,TypeError} is raised.


Added in version 3.6.

@end deffn

@geindex PathLike (class in os)
@anchor{library/os os PathLike}@anchor{e51}
@deffn {Class} os.PathLike

An @ref{13c2,,abstract base class} for objects representing a file system path,
e.g. @ref{6ce,,pathlib.PurePath}.


Added in version 3.6.


@geindex __fspath__() (os.PathLike method)
@anchor{library/os os PathLike __fspath__}@anchor{e52}
@deffn {Method} abstractmethod __fspath__ ()

Return the file system path representation of the object.

The method should only return a @ref{16a,,str} or @ref{193,,bytes} object,
with the preference being for @code{str}.
@end deffn
@end deffn

@geindex getenv() (in module os)
@anchor{library/os os getenv}@anchor{3079}
@deffn {Function} os.getenv (key, default=None)

Return the value of the environment variable `key' as a string if it exists, or
`default' if it doesn’t. `key' is a string. Note that
since @code{getenv()} uses @ref{25b,,os.environ}, the mapping of @code{getenv()} is
similarly also captured on import, and the function may not reflect
future environment changes.

On Unix, keys and values are decoded with @ref{e59,,sys.getfilesystemencoding()}
and @code{'surrogateescape'} error handler. Use @ref{1422,,os.getenvb()} if you
would like to use a different encoding.

@ref{2181,,Availability}: Unix, Windows.
@end deffn

@geindex getenvb() (in module os)
@anchor{library/os os getenvb}@anchor{1422}
@deffn {Function} os.getenvb (key, default=None)

Return the value of the environment variable `key' as bytes if it exists, or
`default' if it doesn’t. `key' must be bytes. Note that
since @code{getenvb()} uses @ref{25c,,os.environb}, the mapping of @code{getenvb()} is
similarly also captured on import, and the function may not reflect
future environment changes.

@code{getenvb()} is only available if @ref{1421,,supports_bytes_environ}
is @code{True}.

@ref{2181,,Availability}: Unix.


Added in version 3.2.

@end deffn

@geindex get_exec_path() (in module os)
@anchor{library/os os get_exec_path}@anchor{307b}
@deffn {Function} os.get_exec_path (env=None)

Returns the list of directories that will be searched for a named
executable, similar to a shell, when launching a process.
`env', when specified, should be an environment variable dictionary
to lookup the PATH in.
By default, when `env' is @code{None}, @ref{25b,,environ} is used.


Added in version 3.2.

@end deffn

@geindex getegid() (in module os)
@anchor{library/os os getegid}@anchor{307c}
@deffn {Function} os.getegid ()

Return the effective group id of the current process.  This corresponds to the
“set id” bit on the file being executed in the current process.

@ref{2181,,Availability}: Unix, not WASI.
@end deffn

@geindex geteuid() (in module os)
@anchor{library/os os geteuid}@anchor{1bb6}
@deffn {Function} os.geteuid ()

@geindex user; effective id

Return the current process’s effective user id.

@ref{2181,,Availability}: Unix, not WASI.
@end deffn

@geindex getgid() (in module os)
@anchor{library/os os getgid}@anchor{307d}
@deffn {Function} os.getgid ()

@geindex process; group

Return the real group id of the current process.

@ref{2181,,Availability}: Unix.

The function is a stub on WASI, see @ref{1bae,,WebAssembly platforms} for more
information.
@end deffn

@geindex getgrouplist() (in module os)
@anchor{library/os os getgrouplist}@anchor{1320}
@deffn {Function} os.getgrouplist (user, group, /)

Return list of group ids that `user' belongs to. If `group' is not in the
list, it is included; typically, `group' is specified as the group ID
field from the password record for `user', because that group ID will
otherwise be potentially omitted.

@ref{2181,,Availability}: Unix, not WASI.


Added in version 3.3.

@end deffn

@geindex getgroups() (in module os)
@anchor{library/os os getgroups}@anchor{307e}
@deffn {Function} os.getgroups ()

Return list of supplemental group ids associated with the current process.

@ref{2181,,Availability}: Unix, not WASI.

@cartouche
@quotation Note 
On macOS, @code{getgroups()} behavior differs somewhat from
other Unix platforms. If the Python interpreter was built with a
deployment target of @code{10.5} or earlier, @code{getgroups()} returns
the list of effective group ids associated with the current user process;
this list is limited to a system-defined number of entries, typically 16,
and may be modified by calls to @ref{307f,,setgroups()} if suitably privileged.
If built with a deployment target greater than @code{10.5},
@code{getgroups()} returns the current group access list for the user
associated with the effective user id of the process; the group access
list may change over the lifetime of the process, it is not affected by
calls to @code{setgroups()}, and its length is not limited to 16.  The
deployment target value, @code{MACOSX_DEPLOYMENT_TARGET}, can be
obtained with @ref{175,,sysconfig.get_config_var()}.
@end quotation
@end cartouche
@end deffn

@geindex getlogin() (in module os)
@anchor{library/os os getlogin}@anchor{186c}
@deffn {Function} os.getlogin ()

Return the name of the user logged in on the controlling terminal of the
process.  For most purposes, it is more useful to use
@ref{65a,,getpass.getuser()} since the latter checks the environment variables
@geindex LOGNAME
@geindex environment variable; LOGNAME
@code{LOGNAME} or 
@geindex USERNAME
@geindex environment variable; USERNAME
@code{USERNAME} to find out who the user is, and
falls back to @code{pwd.getpwuid(os.getuid())[0]} to get the login name of the
current real user id.

@ref{2181,,Availability}: Unix, Windows, not WASI.
@end deffn

@geindex getpgid() (in module os)
@anchor{library/os os getpgid}@anchor{3080}
@deffn {Function} os.getpgid (pid)

Return the process group id of the process with process id `pid'. If `pid' is 0,
the process group id of the current process is returned.

@ref{2181,,Availability}: Unix, not WASI.
@end deffn

@geindex getpgrp() (in module os)
@anchor{library/os os getpgrp}@anchor{3081}
@deffn {Function} os.getpgrp ()

@geindex process; group

Return the id of the current process group.

@ref{2181,,Availability}: Unix, not WASI.
@end deffn

@geindex getpid() (in module os)
@anchor{library/os os getpid}@anchor{3071}
@deffn {Function} os.getpid ()

@geindex process; id

Return the current process id.

The function is a stub on WASI, see @ref{1bae,,WebAssembly platforms} for more
information.
@end deffn

@geindex getppid() (in module os)
@anchor{library/os os getppid}@anchor{1a10}
@deffn {Function} os.getppid ()

@geindex process; id of parent

Return the parent’s process id.  When the parent process has exited, on Unix
the id returned is the one of the init process (1), on Windows it is still
the same id, which may be already reused by another process.

@ref{2181,,Availability}: Unix, Windows, not WASI.


Changed in version 3.2: Added support for Windows.

@end deffn

@geindex getpriority() (in module os)
@anchor{library/os os getpriority}@anchor{130b}
@deffn {Function} os.getpriority (which, who)

@geindex process; scheduling priority

Get program scheduling priority.  The value `which' is one of
@ref{3082,,PRIO_PROCESS}, @ref{3083,,PRIO_PGRP}, or @ref{3084,,PRIO_USER}, and `who'
is interpreted relative to `which' (a process identifier for
@code{PRIO_PROCESS}, process group identifier for @code{PRIO_PGRP}, and a
user ID for @code{PRIO_USER}).  A zero value for `who' denotes
(respectively) the calling process, the process group of the calling process,
or the real user ID of the calling process.

@ref{2181,,Availability}: Unix, not WASI.


Added in version 3.3.

@end deffn

@geindex PRIO_PROCESS (in module os)
@geindex PRIO_PGRP (in module os)
@geindex PRIO_USER (in module os)
@anchor{library/os os PRIO_PROCESS}@anchor{3082}
@deffn {Data} os.PRIO_PROCESS
@anchor{library/os os PRIO_PGRP}@anchor{3083}
@deffnx {Data} os.PRIO_PGRP
@anchor{library/os os PRIO_USER}@anchor{3084}
@deffnx {Data} os.PRIO_USER

Parameters for the @ref{130b,,getpriority()} and @ref{130c,,setpriority()} functions.

@ref{2181,,Availability}: Unix, not WASI.


Added in version 3.3.

@end deffn

@geindex PRIO_DARWIN_THREAD (in module os)
@geindex PRIO_DARWIN_PROCESS (in module os)
@geindex PRIO_DARWIN_BG (in module os)
@geindex PRIO_DARWIN_NONUI (in module os)
@anchor{library/os os PRIO_DARWIN_THREAD}@anchor{3085}
@deffn {Data} os.PRIO_DARWIN_THREAD
@anchor{library/os os PRIO_DARWIN_PROCESS}@anchor{3086}
@deffnx {Data} os.PRIO_DARWIN_PROCESS
@anchor{library/os os PRIO_DARWIN_BG}@anchor{3087}
@deffnx {Data} os.PRIO_DARWIN_BG
@anchor{library/os os PRIO_DARWIN_NONUI}@anchor{3088}
@deffnx {Data} os.PRIO_DARWIN_NONUI

Parameters for the @ref{130b,,getpriority()} and @ref{130c,,setpriority()} functions.

@ref{2181,,Availability}: macOS


Added in version 3.12.

@end deffn

@geindex getresuid() (in module os)
@anchor{library/os os getresuid}@anchor{1521}
@deffn {Function} os.getresuid ()

Return a tuple (ruid, euid, suid) denoting the current process’s
real, effective, and saved user ids.

@ref{2181,,Availability}: Unix, not WASI, not macOS, not iOS.


Added in version 3.2.

@end deffn

@geindex getresgid() (in module os)
@anchor{library/os os getresgid}@anchor{1520}
@deffn {Function} os.getresgid ()

Return a tuple (rgid, egid, sgid) denoting the current process’s
real, effective, and saved group ids.

@ref{2181,,Availability}: Unix, not WASI, not macOS, not iOS.


Added in version 3.2.

@end deffn

@geindex getuid() (in module os)
@anchor{library/os os getuid}@anchor{1861}
@deffn {Function} os.getuid ()

@geindex user; id

Return the current process’s real user id.

@ref{2181,,Availability}: Unix.

The function is a stub on WASI, see @ref{1bae,,WebAssembly platforms} for more
information.
@end deffn

@geindex initgroups() (in module os)
@anchor{library/os os initgroups}@anchor{1524}
@deffn {Function} os.initgroups (username, gid, /)

Call the system @code{initgroups()} to initialize the group access list with all of
the groups of which the specified username is a member, plus the specified
group id.

@ref{2181,,Availability}: Unix, not WASI, not Android.


Added in version 3.2.

@end deffn

@geindex putenv() (in module os)
@anchor{library/os os putenv}@anchor{25d}
@deffn {Function} os.putenv (key, value, /)

@geindex environment variables; setting

Set the environment variable named `key' to the string `value'.  Such
changes to the environment affect subprocesses started with @ref{1669,,os.system()},
@ref{31c,,popen()} or @ref{4b6,,fork()} and @ref{3089,,execv()}.

Assignments to items in @ref{25b,,os.environ} are automatically translated into
corresponding calls to @code{putenv()}; however, calls to @code{putenv()}
don’t update @code{os.environ}, so it is actually preferable to assign to items
of @code{os.environ}. This also applies to @ref{3079,,getenv()} and @ref{1422,,getenvb()}, which
respectively use @code{os.environ} and @ref{25c,,os.environb} in their implementations.

See also the @ref{25a,,os.reload_environ()} function.

@cartouche
@quotation Note 
On some platforms, including FreeBSD and macOS, setting @code{environ} may
cause memory leaks. Refer to the system documentation for @code{putenv()}.
@end quotation
@end cartouche

Raises an @ref{1cb1,,auditing event} @code{os.putenv} with arguments @code{key}, @code{value}.


Changed in version 3.9: The function is now always available.

@end deffn

@geindex setegid() (in module os)
@anchor{library/os os setegid}@anchor{308a}
@deffn {Function} os.setegid (egid, /)

Set the current process’s effective group id.

@ref{2181,,Availability}: Unix, not WASI, not Android.
@end deffn

@geindex seteuid() (in module os)
@anchor{library/os os seteuid}@anchor{308b}
@deffn {Function} os.seteuid (euid, /)

Set the current process’s effective user id.

@ref{2181,,Availability}: Unix, not WASI, not Android.
@end deffn

@geindex setgid() (in module os)
@anchor{library/os os setgid}@anchor{308c}
@deffn {Function} os.setgid (gid, /)

Set the current process’ group id.

@ref{2181,,Availability}: Unix, not WASI, not Android.
@end deffn

@geindex setgroups() (in module os)
@anchor{library/os os setgroups}@anchor{307f}
@deffn {Function} os.setgroups (groups, /)

Set the list of supplemental group ids associated with the current process to
`groups'. `groups' must be a sequence, and each element must be an integer
identifying a group. This operation is typically available only to the superuser.

@ref{2181,,Availability}: Unix, not WASI.

@cartouche
@quotation Note 
On macOS, the length of `groups' may not exceed the
system-defined maximum number of effective group ids, typically 16.
See the documentation for @ref{307e,,getgroups()} for cases where it may not
return the same group list set by calling setgroups().
@end quotation
@end cartouche
@end deffn

@geindex setns() (in module os)
@anchor{library/os os setns}@anchor{1b85}
@deffn {Function} os.setns (fd, nstype=0)

Reassociate the current thread with a Linux namespace.
See the @code{setns(2)@footnote{https://manpages.debian.org/setns(2)}} and @code{namespaces(7)@footnote{https://manpages.debian.org/namespaces(7)}} man pages for more
details.

If `fd' refers to a @code{/proc/`pid'/ns/} link, @code{setns()} reassociates the
calling thread with the namespace associated with that link,
and `nstype' may be set to one of the
@ref{308d,,CLONE_NEW* constants}
to impose constraints on the operation
(@code{0} means no constraints).

Since Linux 5.8, `fd' may refer to a PID file descriptor obtained from
@ref{6a5,,pidfd_open()}. In this case, @code{setns()} reassociates the calling thread
into one or more of the same namespaces as the thread referred to by `fd'.
This is subject to any constraints imposed by `nstype',
which is a bit mask combining one or more of the
@ref{308d,,CLONE_NEW* constants},
e.g. @code{setns(fd, os.CLONE_NEWUTS | os.CLONE_NEWPID)}.
The caller’s memberships in unspecified namespaces are left unchanged.

`fd' can be any object with a @ref{17fe,,fileno()} method, or a raw file descriptor.

This example reassociates the thread with the @code{init} process’s network namespace:

@example
fd = os.open("/proc/1/ns/net", os.O_RDONLY)
os.setns(fd, os.CLONE_NEWNET)
os.close(fd)
@end example

@ref{2181,,Availability}: Linux >= 3.0 with glibc >= 2.14.


Added in version 3.12.



@subsubheading See also


The @ref{1b86,,unshare()} function.

@end deffn

@geindex setpgrp() (in module os)
@anchor{library/os os setpgrp}@anchor{308e}
@deffn {Function} os.setpgrp ()

Call the system call @code{setpgrp()} or @code{setpgrp(0, 0)} depending on
which version is implemented (if any).  See the Unix manual for the semantics.

@ref{2181,,Availability}: Unix, not WASI.
@end deffn

@geindex setpgid() (in module os)
@anchor{library/os os setpgid}@anchor{308f}
@deffn {Function} os.setpgid (pid, pgrp, /)

Call the system call @code{setpgid()} to set the process group id of the
process with id `pid' to the process group with id `pgrp'.  See the Unix manual
for the semantics.

@ref{2181,,Availability}: Unix, not WASI.
@end deffn

@geindex setpriority() (in module os)
@anchor{library/os os setpriority}@anchor{130c}
@deffn {Function} os.setpriority (which, who, priority)

@geindex process; scheduling priority

Set program scheduling priority. The value `which' is one of
@ref{3082,,PRIO_PROCESS}, @ref{3083,,PRIO_PGRP}, or @ref{3084,,PRIO_USER}, and `who'
is interpreted relative to `which' (a process identifier for
@code{PRIO_PROCESS}, process group identifier for @code{PRIO_PGRP}, and a
user ID for @code{PRIO_USER}). A zero value for `who' denotes
(respectively) the calling process, the process group of the calling process,
or the real user ID of the calling process.
`priority' is a value in the range -20 to 19. The default priority is 0;
lower priorities cause more favorable scheduling.

@ref{2181,,Availability}: Unix, not WASI.


Added in version 3.3.

@end deffn

@geindex setregid() (in module os)
@anchor{library/os os setregid}@anchor{3090}
@deffn {Function} os.setregid (rgid, egid, /)

Set the current process’s real and effective group ids.

@ref{2181,,Availability}: Unix, not WASI, not Android.
@end deffn

@geindex setresgid() (in module os)
@anchor{library/os os setresgid}@anchor{1522}
@deffn {Function} os.setresgid (rgid, egid, sgid, /)

Set the current process’s real, effective, and saved group ids.

@ref{2181,,Availability}: Unix, not WASI, not Android, not macOS, not iOS.


Added in version 3.2.

@end deffn

@geindex setresuid() (in module os)
@anchor{library/os os setresuid}@anchor{1523}
@deffn {Function} os.setresuid (ruid, euid, suid, /)

Set the current process’s real, effective, and saved user ids.

@ref{2181,,Availability}: Unix, not WASI, not Android, not macOS, not iOS.


Added in version 3.2.

@end deffn

@geindex setreuid() (in module os)
@anchor{library/os os setreuid}@anchor{3091}
@deffn {Function} os.setreuid (ruid, euid, /)

Set the current process’s real and effective user ids.

@ref{2181,,Availability}: Unix, not WASI, not Android.
@end deffn

@geindex getsid() (in module os)
@anchor{library/os os getsid}@anchor{3092}
@deffn {Function} os.getsid (pid, /)

Call the system call @code{getsid()}.  See the Unix manual for the semantics.

@ref{2181,,Availability}: Unix, not WASI.
@end deffn

@geindex setsid() (in module os)
@anchor{library/os os setsid}@anchor{1dfc}
@deffn {Function} os.setsid ()

Call the system call @code{setsid()}.  See the Unix manual for the semantics.

@ref{2181,,Availability}: Unix, not WASI.
@end deffn

@geindex setuid() (in module os)
@anchor{library/os os setuid}@anchor{3093}
@deffn {Function} os.setuid (uid, /)

@geindex user; id@comma{} setting

Set the current process’s user id.

@ref{2181,,Availability}: Unix, not WASI, not Android.
@end deffn

@c placed in this section since it relates to errno.... a little weak

@geindex strerror() (in module os)
@anchor{library/os os strerror}@anchor{3094}
@deffn {Function} os.strerror (code, /)

Return the error message corresponding to the error code in `code'.
On platforms where @code{strerror()} returns @code{NULL} when given an unknown
error number, @ref{2ee,,ValueError} is raised.
@end deffn

@geindex supports_bytes_environ (in module os)
@anchor{library/os os supports_bytes_environ}@anchor{1421}
@deffn {Data} os.supports_bytes_environ

@code{True} if the native OS type of the environment is bytes (eg. @code{False} on
Windows).


Added in version 3.2.

@end deffn

@geindex umask() (in module os)
@anchor{library/os os umask}@anchor{3095}
@deffn {Function} os.umask (mask, /)

Set the current numeric umask and return the previous umask.

The function is a stub on WASI, see @ref{1bae,,WebAssembly platforms} for more
information.
@end deffn

@geindex uname() (in module os)
@anchor{library/os os uname}@anchor{1322}
@deffn {Function} os.uname ()

@geindex gethostname() (in module socket)
@geindex gethostbyaddr() (in module socket)

Returns information identifying the current operating system.
The return value is an object with five attributes:


@itemize *

@item 
@code{sysname} - operating system name

@item 
@code{nodename} - name of machine on network (implementation-defined)

@item 
@code{release} - operating system release

@item 
@code{version} - operating system version

@item 
@code{machine} - hardware identifier
@end itemize

For backwards compatibility, this object is also iterable, behaving
like a five-tuple containing @code{sysname}, @code{nodename},
@code{release}, @code{version}, and @code{machine}
in that order.

Some systems truncate @code{nodename} to 8 characters or to the
leading component; a better way to get the hostname is
@ref{3096,,socket.gethostname()}  or even
@code{socket.gethostbyaddr(socket.gethostname())}.

On macOS, iOS and Android, this returns the `kernel' name and version (i.e.,
@code{'Darwin'} on macOS and iOS; @code{'Linux'} on Android). @ref{1e55,,platform.uname()}
can be used to get the user-facing operating system name and version on iOS and
Android.

@ref{2181,,Availability}: Unix.


Changed in version 3.3: Return type changed from a tuple to a tuple-like object
with named attributes.

@end deffn

@geindex unsetenv() (in module os)
@anchor{library/os os unsetenv}@anchor{25e}
@deffn {Function} os.unsetenv (key, /)

@geindex environment variables; deleting

Unset (delete) the environment variable named `key'. Such changes to the
environment affect subprocesses started with @ref{1669,,os.system()}, @ref{31c,,popen()} or
@ref{4b6,,fork()} and @ref{3089,,execv()}.

Deletion of items in @ref{25b,,os.environ} is automatically translated into a
corresponding call to @code{unsetenv()}; however, calls to @code{unsetenv()}
don’t update @code{os.environ}, so it is actually preferable to delete items of
@code{os.environ}.

See also the @ref{25a,,os.reload_environ()} function.

Raises an @ref{1cb1,,auditing event} @code{os.unsetenv} with argument @code{key}.


Changed in version 3.9: The function is now always available and is also available on Windows.

@end deffn

@geindex unshare() (in module os)
@anchor{library/os os unshare}@anchor{1b86}
@deffn {Function} os.unshare (flags)

Disassociate parts of the process execution context, and move them into a
newly created namespace.
See the @code{unshare(2)@footnote{https://manpages.debian.org/unshare(2)}}
man page for more details.
The `flags' argument is a bit mask, combining zero or more of the
@ref{308d,,CLONE_* constants},
that specifies which parts of the execution context should be
unshared from their existing associations and moved to a new namespace.
If the `flags' argument is @code{0}, no changes are made to the calling process’s
execution context.

@ref{2181,,Availability}: Linux >= 2.6.16.


Added in version 3.12.



@subsubheading See also


The @ref{1b85,,setns()} function.

@end deffn
@anchor{library/os os-unshare-clone-flags}@anchor{308d}
Flags to the @ref{1b86,,unshare()} function, if the implementation supports them.
See @code{unshare(2)@footnote{https://manpages.debian.org/unshare(2)}} in the Linux manual
for their exact effect and availability.

@geindex CLONE_FILES (in module os)
@geindex CLONE_FS (in module os)
@geindex CLONE_NEWCGROUP (in module os)
@geindex CLONE_NEWIPC (in module os)
@geindex CLONE_NEWNET (in module os)
@geindex CLONE_NEWNS (in module os)
@geindex CLONE_NEWPID (in module os)
@geindex CLONE_NEWTIME (in module os)
@geindex CLONE_NEWUSER (in module os)
@geindex CLONE_NEWUTS (in module os)
@geindex CLONE_SIGHAND (in module os)
@geindex CLONE_SYSVSEM (in module os)
@geindex CLONE_THREAD (in module os)
@geindex CLONE_VM (in module os)
@anchor{library/os os CLONE_FILES}@anchor{3097}
@deffn {Data} os.CLONE_FILES
@anchor{library/os os CLONE_FS}@anchor{3098}
@deffnx {Data} os.CLONE_FS
@anchor{library/os os CLONE_NEWCGROUP}@anchor{3099}
@deffnx {Data} os.CLONE_NEWCGROUP
@anchor{library/os os CLONE_NEWIPC}@anchor{309a}
@deffnx {Data} os.CLONE_NEWIPC
@anchor{library/os os CLONE_NEWNET}@anchor{309b}
@deffnx {Data} os.CLONE_NEWNET
@anchor{library/os os CLONE_NEWNS}@anchor{309c}
@deffnx {Data} os.CLONE_NEWNS
@anchor{library/os os CLONE_NEWPID}@anchor{309d}
@deffnx {Data} os.CLONE_NEWPID
@anchor{library/os os CLONE_NEWTIME}@anchor{309e}
@deffnx {Data} os.CLONE_NEWTIME
@anchor{library/os os CLONE_NEWUSER}@anchor{309f}
@deffnx {Data} os.CLONE_NEWUSER
@anchor{library/os os CLONE_NEWUTS}@anchor{30a0}
@deffnx {Data} os.CLONE_NEWUTS
@anchor{library/os os CLONE_SIGHAND}@anchor{30a1}
@deffnx {Data} os.CLONE_SIGHAND
@anchor{library/os os CLONE_SYSVSEM}@anchor{30a2}
@deffnx {Data} os.CLONE_SYSVSEM
@anchor{library/os os CLONE_THREAD}@anchor{30a3}
@deffnx {Data} os.CLONE_THREAD
@anchor{library/os os CLONE_VM}@anchor{30a4}
@deffnx {Data} os.CLONE_VM
@end deffn

@node File Object Creation,File Descriptor Operations,Process Parameters,os — Miscellaneous operating system interfaces
@anchor{library/os file-object-creation}@anchor{30a5}@anchor{library/os os-newstreams}@anchor{30a6}
@subsubsection File Object Creation


These functions create new @ref{13cf,,file objects}.  (See also
@ref{f98,,open()} for opening file descriptors.)

@geindex fdopen() (in module os)
@anchor{library/os os fdopen}@anchor{23c4}
@deffn {Function} os.fdopen (fd, *args, **kwargs)

Return an open file object connected to the file descriptor `fd'.  This is an
alias of the @ref{318,,open()} built-in function and accepts the same arguments.
The only difference is that the first argument of @code{fdopen()} must always
be an integer.
@end deffn

@node File Descriptor Operations,Files and Directories,File Object Creation,os — Miscellaneous operating system interfaces
@anchor{library/os file-descriptor-operations}@anchor{30a7}@anchor{library/os os-fd-ops}@anchor{30a8}
@subsubsection File Descriptor Operations


These functions operate on I/O streams referenced using file descriptors.

File descriptors are small integers corresponding to a file that has been opened
by the current process.  For example, standard input is usually file descriptor
0, standard output is 1, and standard error is 2.  Further files opened by a
process will then be assigned 3, 4, 5, and so forth.  The name “file descriptor”
is slightly deceptive; on Unix platforms, sockets and pipes are also referenced
by file descriptors.

The @ref{17fe,,fileno()} method can be used to obtain the file descriptor
associated with a @ref{13cf,,file object} when required.  Note that using the file
descriptor directly will bypass the file object methods, ignoring aspects such
as internal buffering of data.

@geindex close() (in module os)
@anchor{library/os os close}@anchor{d71}
@deffn {Function} os.close (fd)

Close file descriptor `fd'.

@cartouche
@quotation Note 
This function is intended for low-level I/O and must be applied to a file
descriptor as returned by @ref{f98,,os.open()} or @ref{1ba8,,pipe()}.  To close a “file
object” returned by the built-in function @ref{318,,open()} or by @ref{31c,,popen()} or
@ref{23c4,,fdopen()}, use its @ref{507,,close()} method.
@end quotation
@end cartouche
@end deffn

@geindex closerange() (in module os)
@anchor{library/os os closerange}@anchor{30a9}
@deffn {Function} os.closerange (fd_low, fd_high, /)

Close all file descriptors from `fd_low' (inclusive) to `fd_high' (exclusive),
ignoring errors. Equivalent to (but much faster than):

@example
for fd in range(fd_low, fd_high):
    try:
        os.close(fd)
    except OSError:
        pass
@end example
@end deffn

@geindex copy_file_range() (in module os)
@anchor{library/os os copy_file_range}@anchor{18fa}
@deffn {Function} os.copy_file_range (src, dst, count, offset_src=None, offset_dst=None)

Copy `count' bytes from file descriptor `src', starting from offset
`offset_src', to file descriptor `dst', starting from offset `offset_dst'.
If `offset_src' is @code{None}, then `src' is read from the current position;
respectively for `offset_dst'.

In Linux kernel older than 5.3, the files pointed to by `src' and `dst'
must reside in the same filesystem, otherwise an @ref{2c2,,OSError} is
raised with @ref{1804,,errno} set to @ref{30aa,,errno.EXDEV}.

This copy is done without the additional cost of transferring data
from the kernel to user space and then back into the kernel. Additionally,
some filesystems could implement extra optimizations, such as the use of
reflinks (i.e., two or more inodes that share pointers to the same
copy-on-write disk blocks; supported file systems include btrfs and XFS)
and server-side copy (in the case of NFS).

The function copies bytes between two file descriptors. Text options, like
the encoding and the line ending, are ignored.

The return value is the amount of bytes copied. This could be less than the
amount requested.

@cartouche
@quotation Note 
On Linux, @code{os.copy_file_range()} should not be used for copying a
range of a pseudo file from a special filesystem like procfs and sysfs.
It will always copy no bytes and return 0 as if the file was empty
because of a known Linux kernel issue.
@end quotation
@end cartouche

@ref{2181,,Availability}: Linux >= 4.5 with glibc >= 2.27.


Added in version 3.8.

@end deffn

@geindex device_encoding() (in module os)
@anchor{library/os os device_encoding}@anchor{1c78}
@deffn {Function} os.device_encoding (fd)

Return a string describing the encoding of the device associated with `fd'
if it is connected to a terminal; else return @ref{887,,None}.

On Unix, if the @ref{868,,Python UTF-8 Mode} is enabled, return
@code{'UTF-8'} rather than the device encoding.


Changed in version 3.10: On Unix, the function now implements the Python UTF-8 Mode.

@end deffn

@geindex dup() (in module os)
@anchor{library/os os dup}@anchor{1e04}
@deffn {Function} os.dup (fd, /)

Return a duplicate of file descriptor `fd'. The new file descriptor is
@ref{1102,,non-inheritable}.

On Windows, when duplicating a standard stream (0: stdin, 1: stdout,
2: stderr), the new file descriptor is @ref{1102,,inheritable}.

@ref{2181,,Availability}: not WASI.


Changed in version 3.4: The new file descriptor is now non-inheritable.

@end deffn

@geindex dup2() (in module os)
@anchor{library/os os dup2}@anchor{d60}
@deffn {Function} os.dup2 (fd, fd2, inheritable=True)

Duplicate file descriptor `fd' to `fd2', closing the latter first if
necessary. Return `fd2'. The new file descriptor is @ref{1102,,inheritable} by default or non-inheritable if `inheritable'
is @code{False}.

@ref{2181,,Availability}: not WASI.


Changed in version 3.4: Add the optional `inheritable' parameter.



Changed in version 3.7: Return `fd2' on success. Previously, @code{None} was always returned.

@end deffn

@geindex fchmod() (in module os)
@anchor{library/os os fchmod}@anchor{52b}
@deffn {Function} os.fchmod (fd, mode)

Change the mode of the file given by `fd' to the numeric `mode'.  See the
docs for @ref{52a,,chmod()} for possible values of `mode'.  As of Python 3.3, this
is equivalent to @code{os.chmod(fd, mode)}.

Raises an @ref{1cb1,,auditing event} @code{os.chmod} with arguments @code{path}, @code{mode}, @code{dir_fd}.

@ref{2181,,Availability}: Unix, Windows.

The function is limited on WASI, see @ref{1bae,,WebAssembly platforms} for more
information.


Changed in version 3.13: Added support on Windows.

@end deffn

@geindex fchown() (in module os)
@anchor{library/os os fchown}@anchor{f90}
@deffn {Function} os.fchown (fd, uid, gid)

Change the owner and group id of the file given by `fd' to the numeric `uid'
and `gid'.  To leave one of the ids unchanged, set it to -1.  See
@ref{12fa,,chown()}.  As of Python 3.3, this is equivalent to @code{os.chown(fd, uid,
gid)}.

Raises an @ref{1cb1,,auditing event} @code{os.chown} with arguments @code{path}, @code{uid}, @code{gid}, @code{dir_fd}.

@ref{2181,,Availability}: Unix.

The function is limited on WASI, see @ref{1bae,,WebAssembly platforms} for more
information.
@end deffn

@geindex fdatasync() (in module os)
@anchor{library/os os fdatasync}@anchor{f91}
@deffn {Function} os.fdatasync (fd)

Force write of file with filedescriptor `fd' to disk. Does not force update of
metadata.

@ref{2181,,Availability}: Unix, not macOS, not iOS.
@end deffn

@geindex fpathconf() (in module os)
@anchor{library/os os fpathconf}@anchor{30ab}
@deffn {Function} os.fpathconf (fd, name, /)

Return system configuration information relevant to an open file. `name'
specifies the configuration value to retrieve; it may be a string which is the
name of a defined system value; these names are specified in a number of
standards (POSIX.1, Unix 95, Unix 98, and others).  Some platforms define
additional names as well.  The names known to the host operating system are
given in the @code{pathconf_names} dictionary.  For configuration variables not
included in that mapping, passing an integer for `name' is also accepted.

If `name' is a string and is not known, @ref{2ee,,ValueError} is raised.  If a
specific value for `name' is not supported by the host system, even if it is
included in @code{pathconf_names}, an @ref{2c2,,OSError} is raised with
@ref{1e14,,errno.EINVAL} for the error number.

As of Python 3.3, this is equivalent to @code{os.pathconf(fd, name)}.

@ref{2181,,Availability}: Unix.
@end deffn

@geindex fstat() (in module os)
@anchor{library/os os fstat}@anchor{f92}
@deffn {Function} os.fstat (fd)

Get the status of the file descriptor `fd'. Return a @ref{16cd,,stat_result}
object.

As of Python 3.3, this is equivalent to @code{os.stat(fd)}.


@subsubheading See also


The @ref{26f,,stat()} function.

@end deffn

@geindex fstatvfs() (in module os)
@anchor{library/os os fstatvfs}@anchor{f93}
@deffn {Function} os.fstatvfs (fd, /)

Return information about the filesystem containing the file associated with
file descriptor `fd', like @ref{1308,,statvfs()}.  As of Python 3.3, this is
equivalent to @code{os.statvfs(fd)}.

@ref{2181,,Availability}: Unix.
@end deffn

@geindex fsync() (in module os)
@anchor{library/os os fsync}@anchor{f94}
@deffn {Function} os.fsync (fd)

Force write of file with filedescriptor `fd' to disk.  On Unix, this calls the
native @code{fsync()} function; on Windows, the MS @code{_commit()} function.

If you’re starting with a buffered Python @ref{13cf,,file object} `f', first do
@code{f.flush()}, and then do @code{os.fsync(f.fileno())}, to ensure that all internal
buffers associated with `f' are written to disk.

@ref{2181,,Availability}: Unix, Windows.
@end deffn

@geindex ftruncate() (in module os)
@anchor{library/os os ftruncate}@anchor{f95}
@deffn {Function} os.ftruncate (fd, length, /)

Truncate the file corresponding to file descriptor `fd', so that it is at
most `length' bytes in size.  As of Python 3.3, this is equivalent to
@code{os.truncate(fd, length)}.

Raises an @ref{1cb1,,auditing event} @code{os.truncate} with arguments @code{fd}, @code{length}.

@ref{2181,,Availability}: Unix, Windows.


Changed in version 3.5: Added support for Windows

@end deffn

@geindex get_blocking() (in module os)
@anchor{library/os os get_blocking}@anchor{103f}
@deffn {Function} os.get_blocking (fd, /)

Get the blocking mode of the file descriptor: @code{False} if the
@ref{1041,,O_NONBLOCK} flag is set, @code{True} if the flag is cleared.

See also @ref{1040,,set_blocking()} and @ref{30ac,,socket.socket.setblocking()}.

@ref{2181,,Availability}: Unix, Windows.

The function is limited on WASI, see @ref{1bae,,WebAssembly platforms} for more
information.

On Windows, this function is limited to pipes.


Added in version 3.5.



Changed in version 3.12: Added support for pipes on Windows.

@end deffn

@geindex grantpt() (in module os)
@anchor{library/os os grantpt}@anchor{1a45}
@deffn {Function} os.grantpt (fd, /)

Grant access to the slave pseudo-terminal device associated with the
master pseudo-terminal device to which the file descriptor `fd' refers.
The file descriptor `fd' is not closed upon failure.

Calls the C standard library function @code{grantpt()}.

@ref{2181,,Availability}: Unix, not WASI.


Added in version 3.13.

@end deffn

@geindex isatty() (in module os)
@anchor{library/os os isatty}@anchor{1c77}
@deffn {Function} os.isatty (fd, /)

Return @code{True} if the file descriptor `fd' is open and connected to a
tty(-like) device, else @code{False}.
@end deffn

@geindex lockf() (in module os)
@anchor{library/os os lockf}@anchor{131f}
@deffn {Function} os.lockf (fd, cmd, len, /)

Apply, test or remove a POSIX lock on an open file descriptor.
`fd' is an open file descriptor.
`cmd' specifies the command to use - one of @ref{30ad,,F_LOCK}, @ref{30ae,,F_TLOCK},
@ref{30af,,F_ULOCK} or @ref{30b0,,F_TEST}.
`len' specifies the section of the file to lock.

Raises an @ref{1cb1,,auditing event} @code{os.lockf} with arguments @code{fd}, @code{cmd}, @code{len}.

@ref{2181,,Availability}: Unix.


Added in version 3.3.

@end deffn

@geindex F_LOCK (in module os)
@geindex F_TLOCK (in module os)
@geindex F_ULOCK (in module os)
@geindex F_TEST (in module os)
@anchor{library/os os F_LOCK}@anchor{30ad}
@deffn {Data} os.F_LOCK
@anchor{library/os os F_TLOCK}@anchor{30ae}
@deffnx {Data} os.F_TLOCK
@anchor{library/os os F_ULOCK}@anchor{30af}
@deffnx {Data} os.F_ULOCK
@anchor{library/os os F_TEST}@anchor{30b0}
@deffnx {Data} os.F_TEST

Flags that specify what action @ref{131f,,lockf()} will take.

@ref{2181,,Availability}: Unix.


Added in version 3.3.

@end deffn

@geindex login_tty() (in module os)
@anchor{library/os os login_tty}@anchor{1b10}
@deffn {Function} os.login_tty (fd, /)

Prepare the tty of which fd is a file descriptor for a new login session.
Make the calling process a session leader; make the tty the controlling tty,
the stdin, the stdout, and the stderr of the calling process; close fd.

@ref{2181,,Availability}: Unix, not WASI.


Added in version 3.11.

@end deffn

@geindex lseek() (in module os)
@anchor{library/os os lseek}@anchor{1323}
@deffn {Function} os.lseek (fd, pos, whence, /)

Set the current position of file descriptor `fd' to position `pos', modified
by `whence', and return the new position in bytes relative to
the start of the file.
Valid values for `whence' are:


@itemize *

@item 
@ref{1499,,SEEK_SET} or @code{0} – set `pos' relative to the beginning of the file

@item 
@ref{149a,,SEEK_CUR} or @code{1} – set `pos' relative to the current file position

@item 
@ref{149b,,SEEK_END} or @code{2} – set `pos' relative to the end of the file

@item 
@ref{30b1,,SEEK_HOLE} – set `pos' to the next data location, relative to `pos'

@item 
@ref{30b2,,SEEK_DATA} – set `pos' to the next data hole, relative to `pos'
@end itemize


Changed in version 3.3: Add support for @code{SEEK_HOLE} and @code{SEEK_DATA}.

@end deffn

@geindex SEEK_SET (in module os)
@geindex SEEK_CUR (in module os)
@geindex SEEK_END (in module os)
@anchor{library/os os SEEK_SET}@anchor{1499}
@deffn {Data} os.SEEK_SET
@anchor{library/os os SEEK_CUR}@anchor{149a}
@deffnx {Data} os.SEEK_CUR
@anchor{library/os os SEEK_END}@anchor{149b}
@deffnx {Data} os.SEEK_END

Parameters to the @ref{1323,,lseek()} function and the @ref{1498,,seek()}
method on @ref{13cf,,file-like objects},
for whence to adjust the file position indicator.


@table @asis

@item @ref{1499,,SEEK_SET}

Adjust the file position relative to the beginning of the file.

@item @ref{149a,,SEEK_CUR}

Adjust the file position relative to the current file position.

@item @ref{149b,,SEEK_END}

Adjust the file position relative to the end of the file.
@end table

Their values are 0, 1, and 2, respectively.
@end deffn

@geindex SEEK_HOLE (in module os)
@geindex SEEK_DATA (in module os)
@anchor{library/os os SEEK_HOLE}@anchor{30b1}
@deffn {Data} os.SEEK_HOLE
@anchor{library/os os SEEK_DATA}@anchor{30b2}
@deffnx {Data} os.SEEK_DATA

Parameters to the @ref{1323,,lseek()} function and the @ref{1498,,seek()}
method on @ref{13cf,,file-like objects},
for seeking file data and holes on sparsely allocated files.


@table @asis

@item @code{SEEK_DATA}

Adjust the file offset to the next location containing data,
relative to the seek position.

@item @code{SEEK_HOLE}

Adjust the file offset to the next location containing a hole,
relative to the seek position.
A hole is defined as a sequence of zeros.
@end table

@cartouche
@quotation Note 
These operations only make sense for filesystems that support them.
@end quotation
@end cartouche

@ref{2181,,Availability}: Linux >= 3.1, macOS, Unix


Added in version 3.3.

@end deffn

@geindex open() (in module os)
@anchor{library/os os open}@anchor{f98}
@deffn {Function} os.open (path, flags, mode=0o777, *, dir_fd=None)

Open the file `path' and set various flags according to `flags' and possibly
its mode according to `mode'.  When computing `mode', the current umask value
is first masked out.  Return the file descriptor for the newly opened file.
The new file descriptor is @ref{1102,,non-inheritable}.

For a description of the flag and mode values, see the C run-time documentation;
flag constants (like @ref{30b3,,O_RDONLY} and @ref{30b4,,O_WRONLY}) are defined in
the @code{os} module.  In particular, on Windows adding
@ref{30b5,,O_BINARY} is needed to open files in binary mode.

This function can support @ref{12f6,,paths relative to directory descriptors} with the `dir_fd' parameter.

Raises an @ref{1cb1,,auditing event} @code{open} with arguments @code{path}, @code{mode}, @code{flags}.


Changed in version 3.4: The new file descriptor is now non-inheritable.


@cartouche
@quotation Note 
This function is intended for low-level I/O.  For normal usage, use the
built-in function @code{open()}, which returns a @ref{13cf,,file object} with
@ref{1534,,read()} and @ref{edd,,write()} methods.
To wrap a file descriptor in a file object, use @ref{23c4,,fdopen()}.
@end quotation
@end cartouche


Changed in version 3.3: Added the `dir_fd' parameter.



Changed in version 3.5: If the system call is interrupted and the signal handler does not raise an
exception, the function now retries the system call instead of raising an
@ref{f8e,,InterruptedError} exception (see 
@geindex Python Enhancement Proposals; PEP 475
PEP 475@footnote{https://peps.python.org/pep-0475/} for the rationale).



Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.

@end deffn

The following constants are options for the `flags' parameter to the
@ref{f98,,open()} function.  They can be combined using the bitwise OR operator
@code{|}.  Some of them are not available on all platforms.  For descriptions of
their availability and use, consult the @code{open(2)@footnote{https://manpages.debian.org/open(2)}} manual page on Unix
or the MSDN@footnote{https://msdn.microsoft.com/en-us/library/z0kc8e3z.aspx} on Windows.

@geindex O_RDONLY (in module os)
@geindex O_WRONLY (in module os)
@geindex O_RDWR (in module os)
@geindex O_APPEND (in module os)
@geindex O_CREAT (in module os)
@geindex O_EXCL (in module os)
@geindex O_TRUNC (in module os)
@anchor{library/os os O_RDONLY}@anchor{30b3}
@deffn {Data} os.O_RDONLY
@anchor{library/os os O_WRONLY}@anchor{30b4}
@deffnx {Data} os.O_WRONLY
@anchor{library/os os O_RDWR}@anchor{30b6}
@deffnx {Data} os.O_RDWR
@anchor{library/os os O_APPEND}@anchor{30b7}
@deffnx {Data} os.O_APPEND
@anchor{library/os os O_CREAT}@anchor{30b8}
@deffnx {Data} os.O_CREAT
@anchor{library/os os O_EXCL}@anchor{2d40}
@deffnx {Data} os.O_EXCL
@anchor{library/os os O_TRUNC}@anchor{30b9}
@deffnx {Data} os.O_TRUNC

The above constants are available on Unix and Windows.
@end deffn

@geindex O_DSYNC (in module os)
@geindex O_RSYNC (in module os)
@geindex O_SYNC (in module os)
@geindex O_NDELAY (in module os)
@geindex O_NONBLOCK (in module os)
@geindex O_NOCTTY (in module os)
@geindex O_CLOEXEC (in module os)
@anchor{library/os os O_DSYNC}@anchor{30ba}
@deffn {Data} os.O_DSYNC
@anchor{library/os os O_RSYNC}@anchor{30bb}
@deffnx {Data} os.O_RSYNC
@anchor{library/os os O_SYNC}@anchor{30bc}
@deffnx {Data} os.O_SYNC
@anchor{library/os os O_NDELAY}@anchor{30bd}
@deffnx {Data} os.O_NDELAY
@anchor{library/os os O_NONBLOCK}@anchor{1041}
@deffnx {Data} os.O_NONBLOCK
@anchor{library/os os O_NOCTTY}@anchor{30be}
@deffnx {Data} os.O_NOCTTY
@anchor{library/os os O_CLOEXEC}@anchor{1282}
@deffnx {Data} os.O_CLOEXEC

The above constants are only available on Unix.


Changed in version 3.3: Add @code{O_CLOEXEC} constant.

@end deffn

@geindex O_BINARY (in module os)
@geindex O_NOINHERIT (in module os)
@geindex O_SHORT_LIVED (in module os)
@geindex O_TEMPORARY (in module os)
@geindex O_RANDOM (in module os)
@geindex O_SEQUENTIAL (in module os)
@geindex O_TEXT (in module os)
@anchor{library/os os O_BINARY}@anchor{30b5}
@deffn {Data} os.O_BINARY
@anchor{library/os os O_NOINHERIT}@anchor{30bf}
@deffnx {Data} os.O_NOINHERIT
@anchor{library/os os O_SHORT_LIVED}@anchor{30c0}
@deffnx {Data} os.O_SHORT_LIVED
@anchor{library/os os O_TEMPORARY}@anchor{30c1}
@deffnx {Data} os.O_TEMPORARY
@anchor{library/os os O_RANDOM}@anchor{30c2}
@deffnx {Data} os.O_RANDOM
@anchor{library/os os O_SEQUENTIAL}@anchor{30c3}
@deffnx {Data} os.O_SEQUENTIAL
@anchor{library/os os O_TEXT}@anchor{30c4}
@deffnx {Data} os.O_TEXT

The above constants are only available on Windows.
@end deffn

@geindex O_EVTONLY (in module os)
@geindex O_FSYNC (in module os)
@geindex O_SYMLINK (in module os)
@geindex O_NOFOLLOW_ANY (in module os)
@anchor{library/os os O_EVTONLY}@anchor{a21}
@deffn {Data} os.O_EVTONLY
@anchor{library/os os O_FSYNC}@anchor{a22}
@deffnx {Data} os.O_FSYNC
@anchor{library/os os O_SYMLINK}@anchor{a23}
@deffnx {Data} os.O_SYMLINK
@anchor{library/os os O_NOFOLLOW_ANY}@anchor{a24}
@deffnx {Data} os.O_NOFOLLOW_ANY

The above constants are only available on macOS.


Changed in version 3.10: Add @code{O_EVTONLY}, @code{O_FSYNC}, @code{O_SYMLINK}
and @code{O_NOFOLLOW_ANY} constants.

@end deffn

@geindex O_ASYNC (in module os)
@geindex O_DIRECT (in module os)
@geindex O_DIRECTORY (in module os)
@geindex O_NOFOLLOW (in module os)
@geindex O_NOATIME (in module os)
@geindex O_PATH (in module os)
@geindex O_TMPFILE (in module os)
@geindex O_SHLOCK (in module os)
@geindex O_EXLOCK (in module os)
@anchor{library/os os O_ASYNC}@anchor{30c5}
@deffn {Data} os.O_ASYNC
@anchor{library/os os O_DIRECT}@anchor{30c6}
@deffnx {Data} os.O_DIRECT
@anchor{library/os os O_DIRECTORY}@anchor{30c7}
@deffnx {Data} os.O_DIRECTORY
@anchor{library/os os O_NOFOLLOW}@anchor{30c8}
@deffnx {Data} os.O_NOFOLLOW
@anchor{library/os os O_NOATIME}@anchor{30c9}
@deffnx {Data} os.O_NOATIME
@anchor{library/os os O_PATH}@anchor{1178}
@deffnx {Data} os.O_PATH
@anchor{library/os os O_TMPFILE}@anchor{1179}
@deffnx {Data} os.O_TMPFILE
@anchor{library/os os O_SHLOCK}@anchor{163b}
@deffnx {Data} os.O_SHLOCK
@anchor{library/os os O_EXLOCK}@anchor{163c}
@deffnx {Data} os.O_EXLOCK

The above constants are extensions and not present if they are not defined by
the C library.


Changed in version 3.4: Add @code{O_PATH} on systems that support it.
Add @code{O_TMPFILE}, only available on Linux Kernel 3.11
  or newer.

@end deffn

@geindex openpty() (in module os)
@anchor{library/os os openpty}@anchor{30ca}
@deffn {Function} os.openpty ()

@geindex module; pty

Open a new pseudo-terminal pair. Return a pair of file descriptors
@code{(master, slave)} for the pty and the tty, respectively. The new file
descriptors are @ref{1102,,non-inheritable}. For a (slightly) more
portable approach, use the @ref{b6,,pty} module.

@ref{2181,,Availability}: Unix, not WASI.


Changed in version 3.4: The new file descriptors are now non-inheritable.

@end deffn

@geindex pipe() (in module os)
@anchor{library/os os pipe}@anchor{1ba8}
@deffn {Function} os.pipe ()

Create a pipe.  Return a pair of file descriptors @code{(r, w)} usable for
reading and writing, respectively. The new file descriptor is
@ref{1102,,non-inheritable}.

@ref{2181,,Availability}: Unix, Windows.


Changed in version 3.4: The new file descriptors are now non-inheritable.

@end deffn

@geindex pipe2() (in module os)
@anchor{library/os os pipe2}@anchor{12f5}
@deffn {Function} os.pipe2 (flags, /)

Create a pipe with `flags' set atomically.
`flags' can be constructed by ORing together one or more of these values:
@ref{1041,,O_NONBLOCK}, @ref{1282,,O_CLOEXEC}.
Return a pair of file descriptors @code{(r, w)} usable for reading and writing,
respectively.

@ref{2181,,Availability}: Unix, not WASI, not macOS, not iOS.


Added in version 3.3.

@end deffn

@geindex posix_fallocate() (in module os)
@anchor{library/os os posix_fallocate}@anchor{f9a}
@deffn {Function} os.posix_fallocate (fd, offset, len, /)

Ensures that enough disk space is allocated for the file specified by `fd'
starting from `offset' and continuing for `len' bytes.

@ref{2181,,Availability}: Unix, not macOS, not iOS.


Added in version 3.3.

@end deffn

@geindex posix_fadvise() (in module os)
@anchor{library/os os posix_fadvise}@anchor{f99}
@deffn {Function} os.posix_fadvise (fd, offset, len, advice, /)

Announces an intention to access data in a specific pattern thus allowing
the kernel to make optimizations.
The advice applies to the region of the file specified by `fd' starting at
`offset' and continuing for `len' bytes.
`advice' is one of @ref{30cb,,POSIX_FADV_NORMAL}, @ref{30cc,,POSIX_FADV_SEQUENTIAL},
@ref{30cd,,POSIX_FADV_RANDOM}, @ref{30ce,,POSIX_FADV_NOREUSE},
@ref{30cf,,POSIX_FADV_WILLNEED} or @ref{30d0,,POSIX_FADV_DONTNEED}.

@ref{2181,,Availability}: Unix, not macOS, not iOS.


Added in version 3.3.

@end deffn

@geindex POSIX_FADV_NORMAL (in module os)
@geindex POSIX_FADV_SEQUENTIAL (in module os)
@geindex POSIX_FADV_RANDOM (in module os)
@geindex POSIX_FADV_NOREUSE (in module os)
@geindex POSIX_FADV_WILLNEED (in module os)
@geindex POSIX_FADV_DONTNEED (in module os)
@anchor{library/os os POSIX_FADV_NORMAL}@anchor{30cb}
@deffn {Data} os.POSIX_FADV_NORMAL
@anchor{library/os os POSIX_FADV_SEQUENTIAL}@anchor{30cc}
@deffnx {Data} os.POSIX_FADV_SEQUENTIAL
@anchor{library/os os POSIX_FADV_RANDOM}@anchor{30cd}
@deffnx {Data} os.POSIX_FADV_RANDOM
@anchor{library/os os POSIX_FADV_NOREUSE}@anchor{30ce}
@deffnx {Data} os.POSIX_FADV_NOREUSE
@anchor{library/os os POSIX_FADV_WILLNEED}@anchor{30cf}
@deffnx {Data} os.POSIX_FADV_WILLNEED
@anchor{library/os os POSIX_FADV_DONTNEED}@anchor{30d0}
@deffnx {Data} os.POSIX_FADV_DONTNEED

Flags that can be used in `advice' in @ref{f99,,posix_fadvise()} that specify
the access pattern that is likely to be used.

@ref{2181,,Availability}: Unix.


Added in version 3.3.

@end deffn

@geindex pread() (in module os)
@anchor{library/os os pread}@anchor{d5c}
@deffn {Function} os.pread (fd, n, offset, /)

Read at most `n' bytes from file descriptor `fd' at a position of `offset',
leaving the file offset unchanged.

Return a bytestring containing the bytes read. If the end of the file
referred to by `fd' has been reached, an empty bytes object is returned.

@ref{2181,,Availability}: Unix.


Added in version 3.3.

@end deffn

@geindex posix_openpt() (in module os)
@anchor{library/os os posix_openpt}@anchor{1a44}
@deffn {Function} os.posix_openpt (oflag, /)

Open and return a file descriptor for a master pseudo-terminal device.

Calls the C standard library function @code{posix_openpt()}. The `oflag'
argument is used to set file status flags and file access modes as
specified in the manual page of @code{posix_openpt()} of your system.

The returned file descriptor is @ref{1102,,non-inheritable}.
If the value @ref{1282,,O_CLOEXEC} is available on the system, it is added to
`oflag'.

@ref{2181,,Availability}: Unix, not WASI.


Added in version 3.13.

@end deffn

@geindex preadv() (in module os)
@anchor{library/os os preadv}@anchor{d5a}
@deffn {Function} os.preadv (fd, buffers, offset, flags=0, /)

Read from a file descriptor `fd' at a position of `offset' into mutable
@ref{194,,bytes-like objects} `buffers', leaving the file
offset unchanged.  Transfer data into each buffer until it is full and then
move on to the next buffer in the sequence to hold the rest of the data.

The flags argument contains a bitwise OR of zero or more of the following
flags:


@itemize -

@item 
@ref{30d1,,RWF_HIPRI}

@item 
@ref{30d2,,RWF_NOWAIT}
@end itemize

Return the total number of bytes actually read which can be less than the
total capacity of all the objects.

The operating system may set a limit (@ref{1933,,sysconf()} value
@code{'SC_IOV_MAX'}) on the number of buffers that can be used.

Combine the functionality of @ref{d5b,,os.readv()} and @ref{d5c,,os.pread()}.

@ref{2181,,Availability}: Linux >= 2.6.30, FreeBSD >= 6.0, OpenBSD >= 2.7, AIX >= 7.1.

Using flags requires Linux >= 4.6.


Added in version 3.7.

@end deffn

@geindex RWF_NOWAIT (in module os)
@anchor{library/os os RWF_NOWAIT}@anchor{30d2}
@deffn {Data} os.RWF_NOWAIT

Do not wait for data which is not immediately available. If this flag is
specified, the system call will return instantly if it would have to read
data from the backing storage or wait for a lock.

If some data was successfully read, it will return the number of bytes read.
If no bytes were read, it will return @code{-1} and set errno to
@ref{2746,,errno.EAGAIN}.

@ref{2181,,Availability}: Linux >= 4.14.


Added in version 3.7.

@end deffn

@geindex RWF_HIPRI (in module os)
@anchor{library/os os RWF_HIPRI}@anchor{30d1}
@deffn {Data} os.RWF_HIPRI

High priority read/write. Allows block-based filesystems to use polling
of the device, which provides lower latency, but may use additional
resources.

Currently, on Linux, this feature is usable only on a file descriptor opened
using the @ref{30c6,,O_DIRECT} flag.

@ref{2181,,Availability}: Linux >= 4.6.


Added in version 3.7.

@end deffn

@geindex ptsname() (in module os)
@anchor{library/os os ptsname}@anchor{1a47}
@deffn {Function} os.ptsname (fd, /)

Return the name of the slave pseudo-terminal device associated with the
master pseudo-terminal device to which the file descriptor `fd' refers.
The file descriptor `fd' is not closed upon failure.

Calls the reentrant C standard library function @code{ptsname_r()} if
it is available; otherwise, the C standard library function
@code{ptsname()}, which is not guaranteed to be thread-safe, is called.

@ref{2181,,Availability}: Unix, not WASI.


Added in version 3.13.

@end deffn

@geindex pwrite() (in module os)
@anchor{library/os os pwrite}@anchor{d5f}
@deffn {Function} os.pwrite (fd, str, offset, /)

Write the bytestring in `str' to file descriptor `fd' at position of
`offset', leaving the file offset unchanged.

Return the number of bytes actually written.

@ref{2181,,Availability}: Unix.


Added in version 3.3.

@end deffn

@geindex pwritev() (in module os)
@anchor{library/os os pwritev}@anchor{d5d}
@deffn {Function} os.pwritev (fd, buffers, offset, flags=0, /)

Write the `buffers' contents to file descriptor `fd' at an offset `offset',
leaving the file offset unchanged.  `buffers' must be a sequence of
@ref{194,,bytes-like objects}. Buffers are processed in
array order. Entire contents of the first buffer is written before
proceeding to the second, and so on.

The flags argument contains a bitwise OR of zero or more of the following
flags:


@itemize -

@item 
@ref{30d3,,RWF_DSYNC}

@item 
@ref{30d4,,RWF_SYNC}

@item 
@ref{1d71,,RWF_APPEND}
@end itemize

Return the total number of bytes actually written.

The operating system may set a limit (@ref{1933,,sysconf()} value
@code{'SC_IOV_MAX'}) on the number of buffers that can be used.

Combine the functionality of @ref{d5e,,os.writev()} and @ref{d5f,,os.pwrite()}.

@ref{2181,,Availability}: Linux >= 2.6.30, FreeBSD >= 6.0, OpenBSD >= 2.7, AIX >= 7.1.

Using flags requires Linux >= 4.6.


Added in version 3.7.

@end deffn

@geindex RWF_DSYNC (in module os)
@anchor{library/os os RWF_DSYNC}@anchor{30d3}
@deffn {Data} os.RWF_DSYNC

Provide a per-write equivalent of the @ref{30ba,,O_DSYNC} @ref{f98,,os.open()} flag.
This flag effect applies only to the data range written by the system call.

@ref{2181,,Availability}: Linux >= 4.7.


Added in version 3.7.

@end deffn

@geindex RWF_SYNC (in module os)
@anchor{library/os os RWF_SYNC}@anchor{30d4}
@deffn {Data} os.RWF_SYNC

Provide a per-write equivalent of the @ref{30bc,,O_SYNC} @ref{f98,,os.open()} flag.
This flag effect applies only to the data range written by the system call.

@ref{2181,,Availability}: Linux >= 4.7.


Added in version 3.7.

@end deffn

@geindex RWF_APPEND (in module os)
@anchor{library/os os RWF_APPEND}@anchor{1d71}
@deffn {Data} os.RWF_APPEND

Provide a per-write equivalent of the @ref{30b7,,O_APPEND} @ref{f98,,os.open()}
flag. This flag is meaningful only for @ref{d5d,,os.pwritev()}, and its
effect applies only to the data range written by the system call. The
`offset' argument does not affect the write operation; the data is always
appended to the end of the file. However, if the `offset' argument is
@code{-1}, the current file `offset' is updated.

@ref{2181,,Availability}: Linux >= 4.16.


Added in version 3.10.

@end deffn

@geindex read() (in module os)
@anchor{library/os os read}@anchor{f9b}
@deffn {Function} os.read (fd, n, /)

Read at most `n' bytes from file descriptor `fd'.

Return a bytestring containing the bytes read. If the end of the file
referred to by `fd' has been reached, an empty bytes object is returned.

@cartouche
@quotation Note 
This function is intended for low-level I/O and must be applied to a file
descriptor as returned by @ref{f98,,os.open()} or @ref{1ba8,,pipe()}.  To read a
“file object” returned by the built-in function @ref{318,,open()} or by
@ref{31c,,popen()} or @ref{23c4,,fdopen()}, or @ref{760,,sys.stdin}, use its
@ref{20b0,,read()} or @ref{1535,,readline()} methods.
@end quotation
@end cartouche


Changed in version 3.5: If the system call is interrupted and the signal handler does not raise an
exception, the function now retries the system call instead of raising an
@ref{f8e,,InterruptedError} exception (see 
@geindex Python Enhancement Proposals; PEP 475
PEP 475@footnote{https://peps.python.org/pep-0475/} for the rationale).

@end deffn

@geindex readinto() (in module os)
@anchor{library/os os readinto}@anchor{261}
@deffn {Function} os.readinto (fd, buffer, /)

Read from a file descriptor `fd' into a mutable
@ref{262,,buffer object} `buffer'.

The `buffer' should be mutable and @ref{194,,bytes-like}. On
success, returns the number of bytes read. Less bytes may be read than the
size of the buffer. The underlying system call will be retried when
interrupted by a signal, unless the signal handler raises an exception.
Other errors will not be retried and an error will be raised.

Returns 0 if `fd' is at end of file or if the provided `buffer' has
length 0 (which can be used to check for errors without reading data).
Never returns negative.

@cartouche
@quotation Note 
This function is intended for low-level I/O and must be applied to a file
descriptor as returned by @ref{f98,,os.open()} or @ref{1ba8,,os.pipe()}.  To read a
“file object” returned by the built-in function @ref{318,,open()}, or
@ref{760,,sys.stdin}, use its member functions, for example
@ref{18dc,,io.BufferedIOBase.readinto()}, @ref{1534,,io.BufferedIOBase.read()}, or
@ref{20b0,,io.TextIOBase.read()}
@end quotation
@end cartouche


Added in version 3.14.

@end deffn

@geindex sendfile() (in module os)
@anchor{library/os os sendfile}@anchor{d0b}
@deffn {Function} os.sendfile (out_fd, in_fd, offset, count)

@deffnx {Function} os.sendfile (out_fd, in_fd, offset, count, headers=(), trailers=(), flags=0)

Copy `count' bytes from file descriptor `in_fd' to file descriptor `out_fd'
starting at `offset'.
Return the number of bytes sent. When EOF is reached return @code{0}.

The first function notation is supported by all platforms that define
@code{sendfile()}.

On Linux, if `offset' is given as @code{None}, the bytes are read from the
current position of `in_fd' and the position of `in_fd' is updated.

The second case may be used on macOS and FreeBSD where `headers' and
`trailers' are arbitrary sequences of buffers that are written before and
after the data from `in_fd' is written. It returns the same as the first case.

On macOS and FreeBSD, a value of @code{0} for `count' specifies to send until
the end of `in_fd' is reached.

All platforms support sockets as `out_fd' file descriptor, and some platforms
allow other types (e.g. regular file, pipe) as well.

Cross-platform applications should not use `headers', `trailers' and `flags'
arguments.

@ref{2181,,Availability}: Unix, not WASI.

@cartouche
@quotation Note 
For a higher-level wrapper of @code{sendfile()}, see
@ref{1063,,socket.socket.sendfile()}.
@end quotation
@end cartouche


Added in version 3.3.



Changed in version 3.9: Parameters `out' and `in' was renamed to `out_fd' and `in_fd'.

@end deffn

@geindex SF_NODISKIO (in module os)
@geindex SF_MNOWAIT (in module os)
@geindex SF_SYNC (in module os)
@anchor{library/os os SF_NODISKIO}@anchor{30d5}
@deffn {Data} os.SF_NODISKIO
@anchor{library/os os SF_MNOWAIT}@anchor{30d6}
@deffnx {Data} os.SF_MNOWAIT
@anchor{library/os os SF_SYNC}@anchor{30d7}
@deffnx {Data} os.SF_SYNC

Parameters to the @ref{d0b,,sendfile()} function, if the implementation supports
them.

@ref{2181,,Availability}: Unix, not WASI.


Added in version 3.3.

@end deffn

@geindex SF_NOCACHE (in module os)
@anchor{library/os os SF_NOCACHE}@anchor{30d8}
@deffn {Data} os.SF_NOCACHE

Parameter to the @ref{d0b,,sendfile()} function, if the implementation supports
it. The data won’t be cached in the virtual memory and will be freed afterwards.

@ref{2181,,Availability}: Unix, not WASI.


Added in version 3.11.

@end deffn

@geindex set_blocking() (in module os)
@anchor{library/os os set_blocking}@anchor{1040}
@deffn {Function} os.set_blocking (fd, blocking, /)

Set the blocking mode of the specified file descriptor. Set the
@ref{1041,,O_NONBLOCK} flag if blocking is @code{False}, clear the flag otherwise.

See also @ref{103f,,get_blocking()} and @ref{30ac,,socket.socket.setblocking()}.

@ref{2181,,Availability}: Unix, Windows.

The function is limited on WASI, see @ref{1bae,,WebAssembly platforms} for more
information.

On Windows, this function is limited to pipes.


Added in version 3.5.



Changed in version 3.12: Added support for pipes on Windows.

@end deffn

@geindex splice() (in module os)
@anchor{library/os os splice}@anchor{a20}
@deffn {Function} os.splice (src, dst, count, offset_src=None, offset_dst=None, flags=0)

Transfer `count' bytes from file descriptor `src', starting from offset
`offset_src', to file descriptor `dst', starting from offset `offset_dst'.

The splicing behaviour can be modified by specifying a `flags' value.
Any of the following variables may used, combined using bitwise OR
(the @code{|} operator):


@itemize *

@item 
If @ref{30d9,,SPLICE_F_MOVE} is specified,
the kernel is asked to move pages instead of copying,
but pages may still be copied if the kernel cannot move the pages from the pipe.

@item 
If @ref{30da,,SPLICE_F_NONBLOCK} is specified,
the kernel is asked to not block on I/O.
This makes the splice pipe operations nonblocking,
but splice may nevertheless block because the spliced file descriptors may block.

@item 
If @ref{30db,,SPLICE_F_MORE} is specified,
it hints to the kernel that more data will be coming in a subsequent splice.
@end itemize

At least one of the file descriptors must refer to a pipe. If `offset_src'
is @code{None}, then `src' is read from the current position; respectively for
`offset_dst'. The offset associated to the file descriptor that refers to a
pipe must be @code{None}. The files pointed to by `src' and `dst' must reside in
the same filesystem, otherwise an @ref{2c2,,OSError} is raised with
@ref{1804,,errno} set to @ref{30aa,,errno.EXDEV}.

This copy is done without the additional cost of transferring data
from the kernel to user space and then back into the kernel. Additionally,
some filesystems could implement extra optimizations. The copy is done as if
both files are opened as binary.

Upon successful completion, returns the number of bytes spliced to or from
the pipe. A return value of 0 means end of input. If `src' refers to a
pipe, then this means that there was no data to transfer, and it would not
make sense to block because there are no writers connected to the write end
of the pipe.


@subsubheading See also


The @code{splice(2)@footnote{https://manpages.debian.org/splice(2)}} man page.


@ref{2181,,Availability}: Linux >= 2.6.17 with glibc >= 2.5


Added in version 3.10.

@end deffn

@geindex SPLICE_F_MOVE (in module os)
@geindex SPLICE_F_NONBLOCK (in module os)
@geindex SPLICE_F_MORE (in module os)
@anchor{library/os os SPLICE_F_MOVE}@anchor{30d9}
@deffn {Data} os.SPLICE_F_MOVE
@anchor{library/os os SPLICE_F_NONBLOCK}@anchor{30da}
@deffnx {Data} os.SPLICE_F_NONBLOCK
@anchor{library/os os SPLICE_F_MORE}@anchor{30db}
@deffnx {Data} os.SPLICE_F_MORE


Added in version 3.10.

@end deffn

@geindex readv() (in module os)
@anchor{library/os os readv}@anchor{d5b}
@deffn {Function} os.readv (fd, buffers, /)

Read from a file descriptor `fd' into a number of mutable @ref{194,,bytes-like objects} `buffers'. Transfer data into each buffer until
it is full and then move on to the next buffer in the sequence to hold the
rest of the data.

Return the total number of bytes actually read which can be less than the
total capacity of all the objects.

The operating system may set a limit (@ref{1933,,sysconf()} value
@code{'SC_IOV_MAX'}) on the number of buffers that can be used.

@ref{2181,,Availability}: Unix.


Added in version 3.3.

@end deffn

@geindex tcgetpgrp() (in module os)
@anchor{library/os os tcgetpgrp}@anchor{30dc}
@deffn {Function} os.tcgetpgrp (fd, /)

Return the process group associated with the terminal given by `fd' (an open
file descriptor as returned by @ref{f98,,os.open()}).

@ref{2181,,Availability}: Unix, not WASI.
@end deffn

@geindex tcsetpgrp() (in module os)
@anchor{library/os os tcsetpgrp}@anchor{30dd}
@deffn {Function} os.tcsetpgrp (fd, pg, /)

Set the process group associated with the terminal given by `fd' (an open file
descriptor as returned by @ref{f98,,os.open()}) to `pg'.

@ref{2181,,Availability}: Unix, not WASI.
@end deffn

@geindex ttyname() (in module os)
@anchor{library/os os ttyname}@anchor{30de}
@deffn {Function} os.ttyname (fd, /)

Return a string which specifies the terminal device associated with
file descriptor `fd'.  If `fd' is not associated with a terminal device, an
exception is raised.

@ref{2181,,Availability}: Unix.
@end deffn

@geindex unlockpt() (in module os)
@anchor{library/os os unlockpt}@anchor{1a46}
@deffn {Function} os.unlockpt (fd, /)

Unlock the slave pseudo-terminal device associated with the master
pseudo-terminal device to which the file descriptor `fd' refers.
The file descriptor `fd' is not closed upon failure.

Calls the C standard library function @code{unlockpt()}.

@ref{2181,,Availability}: Unix, not WASI.


Added in version 3.13.

@end deffn

@geindex write() (in module os)
@anchor{library/os os write}@anchor{fa1}
@deffn {Function} os.write (fd, str, /)

Write the bytestring in `str' to file descriptor `fd'.

Return the number of bytes actually written.

@cartouche
@quotation Note 
This function is intended for low-level I/O and must be applied to a file
descriptor as returned by @ref{f98,,os.open()} or @ref{1ba8,,pipe()}.  To write a “file
object” returned by the built-in function @ref{318,,open()} or by @ref{31c,,popen()} or
@ref{23c4,,fdopen()}, or @ref{cd3,,sys.stdout} or @ref{b39,,sys.stderr}, use its
@ref{209f,,write()} method.
@end quotation
@end cartouche


Changed in version 3.5: If the system call is interrupted and the signal handler does not raise an
exception, the function now retries the system call instead of raising an
@ref{f8e,,InterruptedError} exception (see 
@geindex Python Enhancement Proposals; PEP 475
PEP 475@footnote{https://peps.python.org/pep-0475/} for the rationale).

@end deffn

@geindex writev() (in module os)
@anchor{library/os os writev}@anchor{d5e}
@deffn {Function} os.writev (fd, buffers, /)

Write the contents of `buffers' to file descriptor `fd'. `buffers' must be
a sequence of @ref{194,,bytes-like objects}. Buffers are
processed in array order. Entire contents of the first buffer is written
before proceeding to the second, and so on.

Returns the total number of bytes actually written.

The operating system may set a limit (@ref{1933,,sysconf()} value
@code{'SC_IOV_MAX'}) on the number of buffers that can be used.

@ref{2181,,Availability}: Unix.


Added in version 3.3.

@end deffn

@menu
* Querying the size of a terminal:: 
* Inheritance of File Descriptors:: 

@end menu

@node Querying the size of a terminal,Inheritance of File Descriptors,,File Descriptor Operations
@anchor{library/os querying-the-size-of-a-terminal}@anchor{30df}@anchor{library/os terminal-size}@anchor{30e0}
@subsubsection Querying the size of a terminal



Added in version 3.3.


@geindex get_terminal_size() (in module os)
@anchor{library/os os get_terminal_size}@anchor{130e}
@deffn {Function} os.get_terminal_size (fd=STDOUT_FILENO, /)

Return the size of the terminal window as @code{(columns, lines)},
tuple of type @ref{2d6d,,terminal_size}.

The optional argument @code{fd} (default @code{STDOUT_FILENO}, or standard
output) specifies which file descriptor should be queried.

If the file descriptor is not connected to a terminal, an @ref{2c2,,OSError}
is raised.

@ref{130f,,shutil.get_terminal_size()} is the high-level function which
should normally be used, @code{os.get_terminal_size} is the low-level
implementation.

@ref{2181,,Availability}: Unix, Windows.
@end deffn

@geindex terminal_size (class in os)
@anchor{library/os os terminal_size}@anchor{2d6d}
@deffn {Class} os.terminal_size

A subclass of tuple, holding @code{(columns, lines)} of the terminal window size.

@geindex columns (os.terminal_size attribute)
@anchor{library/os os terminal_size columns}@anchor{30e1}
@deffn {Attribute} columns

Width of the terminal window in characters.
@end deffn

@geindex lines (os.terminal_size attribute)
@anchor{library/os os terminal_size lines}@anchor{30e2}
@deffn {Attribute} lines

Height of the terminal window in characters.
@end deffn
@end deffn

@node Inheritance of File Descriptors,,Querying the size of a terminal,File Descriptor Operations
@anchor{library/os fd-inheritance}@anchor{1102}@anchor{library/os inheritance-of-file-descriptors}@anchor{30e3}
@subsubsection Inheritance of File Descriptors



Added in version 3.4.


A file descriptor has an “inheritable” flag which indicates if the file descriptor
can be inherited by child processes.  Since Python 3.4, file descriptors
created by Python are non-inheritable by default.

On UNIX, non-inheritable file descriptors are closed in child processes at the
execution of a new program, other file descriptors are inherited. Note that
non-inheritable file descriptors are still `inherited' by child processes on @ref{4b6,,os.fork()}.

On Windows, non-inheritable handles and file descriptors are closed in child
processes, except for standard streams (file descriptors 0, 1 and 2: stdin, stdout
and stderr), which are always inherited.  Using @ref{31d,,spawn*} functions,
all inheritable handles and all inheritable file descriptors are inherited.
Using the @ref{dc,,subprocess} module, all file descriptors except standard
streams are closed, and inheritable handles are only inherited if the
`close_fds' parameter is @code{False}.

On WebAssembly platforms, the file descriptor cannot be modified.

@geindex get_inheritable() (in module os)
@anchor{library/os os get_inheritable}@anchor{1103}
@deffn {Function} os.get_inheritable (fd, /)

Get the “inheritable” flag of the specified file descriptor (a boolean).
@end deffn

@geindex set_inheritable() (in module os)
@anchor{library/os os set_inheritable}@anchor{1104}
@deffn {Function} os.set_inheritable (fd, inheritable, /)

Set the “inheritable” flag of the specified file descriptor.
@end deffn

@geindex get_handle_inheritable() (in module os)
@anchor{library/os os get_handle_inheritable}@anchor{1105}
@deffn {Function} os.get_handle_inheritable (handle, /)

Get the “inheritable” flag of the specified handle (a boolean).

@ref{2181,,Availability}: Windows.
@end deffn

@geindex set_handle_inheritable() (in module os)
@anchor{library/os os set_handle_inheritable}@anchor{1106}
@deffn {Function} os.set_handle_inheritable (handle, inheritable, /)

Set the “inheritable” flag of the specified handle.

@ref{2181,,Availability}: Windows.
@end deffn

@node Files and Directories,Process Management,File Descriptor Operations,os — Miscellaneous operating system interfaces
@anchor{library/os files-and-directories}@anchor{30e4}@anchor{library/os os-file-dir}@anchor{307a}
@subsubsection Files and Directories


On some Unix platforms, many of these functions support one or more of these
features:
@anchor{library/os path-fd}@anchor{d59}

@itemize *

@item 
`specifying a file descriptor:'
Normally the `path' argument provided to functions in the @code{os} module
must be a string specifying a file path.  However, some functions now
alternatively accept an open file descriptor for their `path' argument.
The function will then operate on the file referred to by the descriptor.
For POSIX systems, Python will call the variant of the function prefixed
with @code{f} (e.g. call @code{fchdir} instead of @code{chdir}).

You can check whether or not `path' can be specified as a file descriptor
for a particular function on your platform using @ref{1309,,os.supports_fd}.
If this functionality is unavailable, using it will raise a
@ref{369,,NotImplementedError}.

If the function also supports `dir_fd' or `follow_symlinks' arguments, it’s
an error to specify one of those when supplying `path' as a file descriptor.
@end itemize
@anchor{library/os dir-fd}@anchor{12f6}

@itemize *

@item 
`paths relative to directory descriptors:' If `dir_fd' is not @code{None}, it
should be a file descriptor referring to a directory, and the path to operate
on should be relative; path will then be relative to that directory.  If the
path is absolute, `dir_fd' is ignored.  For POSIX systems, Python will call
the variant of the function with an @code{at} suffix and possibly prefixed with
@code{f} (e.g. call @code{faccessat} instead of @code{access}).

You can check whether or not `dir_fd' is supported for a particular function
on your platform using @ref{1303,,os.supports_dir_fd}.  If it’s unavailable,
using it will raise a @ref{369,,NotImplementedError}.
@end itemize
@anchor{library/os follow-symlinks}@anchor{12f7}

@itemize *

@item 
`not following symlinks:' If `follow_symlinks' is
@code{False}, and the last element of the path to operate on is a symbolic link,
the function will operate on the symbolic link itself rather than the file
pointed to by the link.  For POSIX systems, Python will call the @code{l...}
variant of the function.

You can check whether or not `follow_symlinks' is supported for a particular
function on your platform using @ref{1304,,os.supports_follow_symlinks}.
If it’s unavailable, using it will raise a @ref{369,,NotImplementedError}.
@end itemize

@geindex access() (in module os)
@anchor{library/os os access}@anchor{12f8}
@deffn {Function} os.access (path, mode, *, dir_fd=None, effective_ids=False, follow_symlinks=True)

Use the real uid/gid to test for access to `path'.  Note that most operations
will use the effective uid/gid, therefore this routine can be used in a
suid/sgid environment to test if the invoking user has the specified access to
`path'.  `mode' should be @ref{30e5,,F_OK} to test the existence of `path', or it
can be the inclusive OR of one or more of @ref{30e6,,R_OK}, @ref{30e7,,W_OK}, and
@ref{30e8,,X_OK} to test permissions.  Return @ref{e0d,,True} if access is allowed,
@ref{d31,,False} if not. See the Unix man page @code{access(2)@footnote{https://manpages.debian.org/access(2)}} for more
information.

This function can support specifying @ref{12f6,,paths relative to directory descriptors} and @ref{12f7,,not following symlinks}.

If `effective_ids' is @code{True}, @code{access()} will perform its access
checks using the effective uid/gid instead of the real uid/gid.
`effective_ids' may not be supported on your platform; you can check whether
or not it is available using @ref{130a,,os.supports_effective_ids}.  If it is
unavailable, using it will raise a @ref{369,,NotImplementedError}.

@cartouche
@quotation Note 
Using @code{access()} to check if a user is authorized to e.g. open a file
before actually doing so using @ref{318,,open()} creates a security hole,
because the user might exploit the short time interval between checking
and opening the file to manipulate it. It’s preferable to use @ref{30e9,,EAFP}
techniques. For example:

@example
if os.access("myfile", os.R_OK):
    with open("myfile") as fp:
        return fp.read()
return "some default data"
@end example

is better written as:

@example
try:
    fp = open("myfile")
except PermissionError:
    return "some default data"
else:
    with fp:
        return fp.read()
@end example
@end quotation
@end cartouche

@cartouche
@quotation Note 
I/O operations may fail even when @code{access()} indicates that they would
succeed, particularly for operations on network filesystems which may have
permissions semantics beyond the usual POSIX permission-bit model.
@end quotation
@end cartouche


Changed in version 3.3: Added the `dir_fd', `effective_ids', and `follow_symlinks' parameters.



Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.

@end deffn

@geindex F_OK (in module os)
@geindex R_OK (in module os)
@geindex W_OK (in module os)
@geindex X_OK (in module os)
@anchor{library/os os F_OK}@anchor{30e5}
@deffn {Data} os.F_OK
@anchor{library/os os R_OK}@anchor{30e6}
@deffnx {Data} os.R_OK
@anchor{library/os os W_OK}@anchor{30e7}
@deffnx {Data} os.W_OK
@anchor{library/os os X_OK}@anchor{30e8}
@deffnx {Data} os.X_OK

Values to pass as the `mode' parameter of @ref{12f8,,access()} to test the
existence, readability, writability and executability of `path',
respectively.
@end deffn

@geindex chdir() (in module os)
@anchor{library/os os chdir}@anchor{822}
@deffn {Function} os.chdir (path)

@geindex directory; changing

Change the current working directory to `path'.

This function can support @ref{d59,,specifying a file descriptor}.  The
descriptor must refer to an opened directory, not an open file.

This function can raise @ref{2c2,,OSError} and subclasses such as
@ref{266,,FileNotFoundError}, @ref{f44,,PermissionError}, and @ref{1260,,NotADirectoryError}.

Raises an @ref{1cb1,,auditing event} @code{os.chdir} with argument @code{path}.


Changed in version 3.3: Added support for specifying `path' as a file descriptor
on some platforms.



Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.

@end deffn

@geindex chflags() (in module os)
@anchor{library/os os chflags}@anchor{12f9}
@deffn {Function} os.chflags (path, flags, *, follow_symlinks=True)

Set the flags of `path' to the numeric `flags'. `flags' may take a combination
(bitwise OR) of the following values (as defined in the @ref{d6,,stat} module):


@itemize *

@item 
@ref{2cfa,,stat.UF_NODUMP}

@item 
@ref{2cfb,,stat.UF_IMMUTABLE}

@item 
@ref{2cfc,,stat.UF_APPEND}

@item 
@ref{2cfd,,stat.UF_OPAQUE}

@item 
@ref{2cfe,,stat.UF_NOUNLINK}

@item 
@ref{2cff,,stat.UF_COMPRESSED}

@item 
@ref{2d02,,stat.UF_HIDDEN}

@item 
@ref{2d06,,stat.SF_ARCHIVED}

@item 
@ref{2d07,,stat.SF_IMMUTABLE}

@item 
@ref{2d08,,stat.SF_APPEND}

@item 
@ref{2d0a,,stat.SF_NOUNLINK}

@item 
@ref{2d0b,,stat.SF_SNAPSHOT}
@end itemize

This function can support @ref{12f7,,not following symlinks}.

Raises an @ref{1cb1,,auditing event} @code{os.chflags} with arguments @code{path}, @code{flags}.

@ref{2181,,Availability}: Unix, not WASI.


Changed in version 3.3: Added the `follow_symlinks' parameter.



Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.

@end deffn

@geindex chmod() (in module os)
@anchor{library/os os chmod}@anchor{52a}
@deffn {Function} os.chmod (path, mode, *, dir_fd=None, follow_symlinks=True)

Change the mode of `path' to the numeric `mode'. `mode' may take one of the
following values (as defined in the @ref{d6,,stat} module) or bitwise ORed
combinations of them:


@itemize *

@item 
@ref{2ce6,,stat.S_ISUID}

@item 
@ref{2ce7,,stat.S_ISGID}

@item 
@ref{2ce9,,stat.S_ENFMT}

@item 
@ref{2cea,,stat.S_ISVTX}

@item 
@ref{2cf6,,stat.S_IREAD}

@item 
@ref{2cf7,,stat.S_IWRITE}

@item 
@ref{2cf8,,stat.S_IEXEC}

@item 
@ref{2ceb,,stat.S_IRWXU}

@item 
@ref{2cec,,stat.S_IRUSR}

@item 
@ref{2ced,,stat.S_IWUSR}

@item 
@ref{2cee,,stat.S_IXUSR}

@item 
@ref{2cef,,stat.S_IRWXG}

@item 
@ref{2cf0,,stat.S_IRGRP}

@item 
@ref{2cf1,,stat.S_IWGRP}

@item 
@ref{2ce8,,stat.S_IXGRP}

@item 
@ref{2cf2,,stat.S_IRWXO}

@item 
@ref{2cf3,,stat.S_IROTH}

@item 
@ref{2cf4,,stat.S_IWOTH}

@item 
@ref{2cf5,,stat.S_IXOTH}
@end itemize

This function can support @ref{d59,,specifying a file descriptor},
@ref{12f6,,paths relative to directory descriptors} and @ref{12f7,,not following symlinks}.

@cartouche
@quotation Note 
Although Windows supports @code{chmod()}, you can only set the file’s
read-only flag with it (via the @code{stat.S_IWRITE} and @code{stat.S_IREAD}
constants or a corresponding integer value).  All other bits are ignored.
The default value of `follow_symlinks' is @code{False} on Windows.

The function is limited on WASI, see @ref{1bae,,WebAssembly platforms} for more
information.
@end quotation
@end cartouche

Raises an @ref{1cb1,,auditing event} @code{os.chmod} with arguments @code{path}, @code{mode}, @code{dir_fd}.


Changed in version 3.3: Added support for specifying `path' as an open file descriptor,
and the `dir_fd' and `follow_symlinks' arguments.



Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.



Changed in version 3.13: Added support for a file descriptor and the `follow_symlinks' argument
on Windows.

@end deffn

@geindex chown() (in module os)
@anchor{library/os os chown}@anchor{12fa}
@deffn {Function} os.chown (path, uid, gid, *, dir_fd=None, follow_symlinks=True)

Change the owner and group id of `path' to the numeric `uid' and `gid'.  To
leave one of the ids unchanged, set it to -1.

This function can support @ref{d59,,specifying a file descriptor},
@ref{12f6,,paths relative to directory descriptors} and @ref{12f7,,not following symlinks}.

See @ref{549,,shutil.chown()} for a higher-level function that accepts names in
addition to numeric ids.

Raises an @ref{1cb1,,auditing event} @code{os.chown} with arguments @code{path}, @code{uid}, @code{gid}, @code{dir_fd}.

@ref{2181,,Availability}: Unix.

The function is limited on WASI, see @ref{1bae,,WebAssembly platforms} for more
information.


Changed in version 3.3: Added support for specifying `path' as an open file descriptor,
and the `dir_fd' and `follow_symlinks' arguments.



Changed in version 3.6: Supports a @ref{5a1,,path-like object}.

@end deffn

@geindex chroot() (in module os)
@anchor{library/os os chroot}@anchor{1dc0}
@deffn {Function} os.chroot (path)

Change the root directory of the current process to `path'.

@ref{2181,,Availability}: Unix, not WASI, not Android.


Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.

@end deffn

@geindex fchdir() (in module os)
@anchor{library/os os fchdir}@anchor{f8f}
@deffn {Function} os.fchdir (fd)

Change the current working directory to the directory represented by the file
descriptor `fd'.  The descriptor must refer to an opened directory, not an
open file.  As of Python 3.3, this is equivalent to @code{os.chdir(fd)}.

Raises an @ref{1cb1,,auditing event} @code{os.chdir} with argument @code{path}.

@ref{2181,,Availability}: Unix.
@end deffn

@geindex getcwd() (in module os)
@anchor{library/os os getcwd}@anchor{194e}
@deffn {Function} os.getcwd ()

Return a string representing the current working directory.
@end deffn

@geindex getcwdb() (in module os)
@anchor{library/os os getcwdb}@anchor{c88}
@deffn {Function} os.getcwdb ()

Return a bytestring representing the current working directory.


Changed in version 3.8: The function now uses the UTF-8 encoding on Windows, rather than the ANSI
code page: see 
@geindex Python Enhancement Proposals; PEP 529
PEP 529@footnote{https://peps.python.org/pep-0529/} for the rationale. The function is no longer
deprecated on Windows.

@end deffn

@geindex lchflags() (in module os)
@anchor{library/os os lchflags}@anchor{30ea}
@deffn {Function} os.lchflags (path, flags)

Set the flags of `path' to the numeric `flags', like @ref{12f9,,chflags()}, but do
not follow symbolic links.  As of Python 3.3, this is equivalent to
@code{os.chflags(path, flags, follow_symlinks=False)}.

Raises an @ref{1cb1,,auditing event} @code{os.chflags} with arguments @code{path}, @code{flags}.

@ref{2181,,Availability}: Unix, not WASI.


Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.

@end deffn

@geindex lchmod() (in module os)
@anchor{library/os os lchmod}@anchor{529}
@deffn {Function} os.lchmod (path, mode)

Change the mode of `path' to the numeric `mode'. If path is a symlink, this
affects the symlink rather than the target.  See the docs for @ref{52a,,chmod()}
for possible values of `mode'.  As of Python 3.3, this is equivalent to
@code{os.chmod(path, mode, follow_symlinks=False)}.

@code{lchmod()} is not part of POSIX, but Unix implementations may have it if
changing the mode of symbolic links is supported.

Raises an @ref{1cb1,,auditing event} @code{os.chmod} with arguments @code{path}, @code{mode}, @code{dir_fd}.

@ref{2181,,Availability}: Unix, Windows, not Linux, FreeBSD >= 1.3, NetBSD >= 1.3, not OpenBSD


Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.



Changed in version 3.13: Added support on Windows.

@end deffn

@geindex lchown() (in module os)
@anchor{library/os os lchown}@anchor{30eb}
@deffn {Function} os.lchown (path, uid, gid)

Change the owner and group id of `path' to the numeric `uid' and `gid'.  This
function will not follow symbolic links.  As of Python 3.3, this is equivalent
to @code{os.chown(path, uid, gid, follow_symlinks=False)}.

Raises an @ref{1cb1,,auditing event} @code{os.chown} with arguments @code{path}, @code{uid}, @code{gid}, @code{dir_fd}.

@ref{2181,,Availability}: Unix.


Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.

@end deffn

@geindex link() (in module os)
@anchor{library/os os link}@anchor{12fb}
@deffn {Function} os.link (src, dst, *, src_dir_fd=None, dst_dir_fd=None, follow_symlinks=True)

Create a hard link pointing to `src' named `dst'.

This function can support specifying `src_dir_fd' and/or `dst_dir_fd' to
supply @ref{12f6,,paths relative to directory descriptors}, and @ref{12f7,,not following symlinks}.
The default value of `follow_symlinks' is @code{False} on Windows.

Raises an @ref{1cb1,,auditing event} @code{os.link} with arguments @code{src}, @code{dst}, @code{src_dir_fd}, @code{dst_dir_fd}.

@ref{2181,,Availability}: Unix, Windows.


Changed in version 3.2: Added Windows support.



Changed in version 3.3: Added the `src_dir_fd', `dst_dir_fd', and `follow_symlinks' parameters.



Changed in version 3.6: Accepts a @ref{5a1,,path-like object} for `src' and `dst'.

@end deffn

@geindex listdir() (in module os)
@anchor{library/os os listdir}@anchor{1306}
@deffn {Function} os.listdir (path='.')

Return a list containing the names of the entries in the directory given by
`path'.  The list is in arbitrary order, and does not include the special
entries @code{'.'} and @code{'..'} even if they are present in the directory.
If a file is removed from or added to the directory during the call of
this function, whether a name for that file be included is unspecified.

`path' may be a @ref{5a1,,path-like object}.  If `path' is of type @code{bytes}
(directly or indirectly through the @ref{e51,,PathLike} interface),
the filenames returned will also be of type @code{bytes};
in all other circumstances, they will be of type @code{str}.

This function can also support @ref{d59,,specifying a file descriptor}; the file descriptor must refer to a directory.

Raises an @ref{1cb1,,auditing event} @code{os.listdir} with argument @code{path}.

@cartouche
@quotation Note 
To encode @code{str} filenames to @code{bytes}, use @ref{e55,,fsencode()}.
@end quotation
@end cartouche


@subsubheading See also


The @ref{c5a,,scandir()} function returns directory entries along with
file attribute information, giving better performance for many
common use cases.



Changed in version 3.2: The `path' parameter became optional.



Changed in version 3.3: Added support for specifying `path' as an open file descriptor.



Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.

@end deffn

@geindex listdrives() (in module os)
@anchor{library/os os listdrives}@anchor{6c6}
@deffn {Function} os.listdrives ()

Return a list containing the names of drives on a Windows system.

A drive name typically looks like @code{'C:\\'}. Not every drive name
will be associated with a volume, and some may be inaccessible for
a variety of reasons, including permissions, network connectivity
or missing media. This function does not test for access.

May raise @ref{2c2,,OSError} if an error occurs collecting the drive
names.

Raises an @ref{1cb1,,auditing event} @code{os.listdrives} with no arguments.

@ref{2181,,Availability}: Windows


Added in version 3.12.

@end deffn

@geindex listmounts() (in module os)
@anchor{library/os os listmounts}@anchor{6c8}
@deffn {Function} os.listmounts (volume)

Return a list containing the mount points for a volume on a Windows
system.

`volume' must be represented as a GUID path, like those returned by
@ref{6c7,,os.listvolumes()}. Volumes may be mounted in multiple locations
or not at all. In the latter case, the list will be empty. Mount
points that are not associated with a volume will not be returned by
this function.

The mount points return by this function will be absolute paths, and
may be longer than the drive name.

Raises @ref{2c2,,OSError} if the volume is not recognized or if an error
occurs collecting the paths.

Raises an @ref{1cb1,,auditing event} @code{os.listmounts} with argument @code{volume}.

@ref{2181,,Availability}: Windows


Added in version 3.12.

@end deffn

@geindex listvolumes() (in module os)
@anchor{library/os os listvolumes}@anchor{6c7}
@deffn {Function} os.listvolumes ()

Return a list containing the volumes in the system.

Volumes are typically represented as a GUID path that looks like
@code{\\?\Volume@{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx@}\}. Files can
usually be accessed through a GUID path, permissions allowing.
However, users are generally not familiar with them, and so the
recommended use of this function is to retrieve mount points
using @ref{6c8,,os.listmounts()}.

May raise @ref{2c2,,OSError} if an error occurs collecting the volumes.

Raises an @ref{1cb1,,auditing event} @code{os.listvolumes} with no arguments.

@ref{2181,,Availability}: Windows


Added in version 3.12.

@end deffn

@geindex lstat() (in module os)
@anchor{library/os os lstat}@anchor{6c9}
@deffn {Function} os.lstat (path, *, dir_fd=None)

Perform the equivalent of an @code{lstat()} system call on the given path.
Similar to @ref{26f,,stat()}, but does not follow symbolic links. Return a
@ref{16cd,,stat_result} object.

On platforms that do not support symbolic links, this is an alias for
@ref{26f,,stat()}.

As of Python 3.3, this is equivalent to @code{os.stat(path, dir_fd=dir_fd,
follow_symlinks=False)}.

This function can also support @ref{12f6,,paths relative to directory descriptors}.


@subsubheading See also


The @ref{26f,,stat()} function.



Changed in version 3.2: Added support for Windows 6.0 (Vista) symbolic links.



Changed in version 3.3: Added the `dir_fd' parameter.



Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.



Changed in version 3.8: On Windows, now opens reparse points that represent another path
(name surrogates), including symbolic links and directory junctions.
Other kinds of reparse points are resolved by the operating system as
for @ref{26f,,stat()}.

@end deffn

@geindex mkdir() (in module os)
@anchor{library/os os mkdir}@anchor{52c}
@deffn {Function} os.mkdir (path, mode=0o777, *, dir_fd=None)

Create a directory named `path' with numeric mode `mode'.

If the directory already exists, @ref{1226,,FileExistsError} is raised. If a parent
directory in the path does not exist, @ref{266,,FileNotFoundError} is raised.
@anchor{library/os mkdir-modebits}@anchor{30ec}
On some systems, `mode' is ignored.  Where it is used, the current umask
value is first masked out.  If bits other than the last 9 (i.e. the last 3
digits of the octal representation of the `mode') are set, their meaning is
platform-dependent.  On some platforms, they are ignored and you should call
@ref{52a,,chmod()} explicitly to set them.

On Windows, a `mode' of @code{0o700} is specifically handled to apply access
control to the new directory such that only the current user and
administrators have access. Other values of `mode' are ignored.

This function can also support @ref{12f6,,paths relative to directory descriptors}.

It is also possible to create temporary directories; see the
@ref{e6,,tempfile} module’s @ref{52e,,tempfile.mkdtemp()} function.

Raises an @ref{1cb1,,auditing event} @code{os.mkdir} with arguments @code{path}, @code{mode}, @code{dir_fd}.


Changed in version 3.3: Added the `dir_fd' parameter.



Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.



Changed in version 3.13: Windows now handles a `mode' of @code{0o700}.

@end deffn

@geindex makedirs() (in module os)
@anchor{library/os os makedirs}@anchor{52d}
@deffn {Function} os.makedirs (name, mode=0o777, exist_ok=False)

@geindex directory; creating
@geindex UNC paths; and os.makedirs()

Recursive directory creation function.  Like @ref{52c,,mkdir()}, but makes all
intermediate-level directories needed to contain the leaf directory.

The `mode' parameter is passed to @ref{52c,,mkdir()} for creating the leaf
directory; see @ref{30ec,,the mkdir() description} for how it
is interpreted.  To set the file permission bits of any newly created parent
directories you can set the umask before invoking @code{makedirs()}.  The
file permission bits of existing parent directories are not changed.

If `exist_ok' is @code{False} (the default), a @ref{1226,,FileExistsError} is
raised if the target directory already exists.

@cartouche
@quotation Note 
@code{makedirs()} will become confused if the path elements to create
include @ref{30ed,,pardir} (eg. “..” on UNIX systems).
@end quotation
@end cartouche

This function handles UNC paths correctly.

Raises an @ref{1cb1,,auditing event} @code{os.mkdir} with arguments @code{path}, @code{mode}, @code{dir_fd}.


Changed in version 3.2: Added the `exist_ok' parameter.



Changed in version 3.4.1: Before Python 3.4.1, if `exist_ok' was @code{True} and the directory existed,
@code{makedirs()} would still raise an error if `mode' did not match the
mode of the existing directory. Since this behavior was impossible to
implement safely, it was removed in Python 3.4.1. See bpo-21082@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21082}.



Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.



Changed in version 3.7: The `mode' argument no longer affects the file permission bits of
newly created intermediate-level directories.

@end deffn

@geindex mkfifo() (in module os)
@anchor{library/os os mkfifo}@anchor{f96}
@deffn {Function} os.mkfifo (path, mode=0o666, *, dir_fd=None)

Create a FIFO (a named pipe) named `path' with numeric mode `mode'.
The current umask value is first masked out from the mode.

This function can also support @ref{12f6,,paths relative to directory descriptors}.

FIFOs are pipes that can be accessed like regular files.  FIFOs exist until they
are deleted (for example with @ref{1301,,os.unlink()}). Generally, FIFOs are used as
rendezvous between “client” and “server” type processes: the server opens the
FIFO for reading, and the client opens it for writing.  Note that @code{mkfifo()}
doesn’t open the FIFO — it just creates the rendezvous point.

@ref{2181,,Availability}: Unix, not WASI.


Changed in version 3.3: Added the `dir_fd' parameter.



Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.

@end deffn

@geindex mknod() (in module os)
@anchor{library/os os mknod}@anchor{f97}
@deffn {Function} os.mknod (path, mode=0o600, device=0, *, dir_fd=None)

Create a filesystem node (file, device special file or named pipe) named
`path'. `mode' specifies both the permissions to use and the type of node
to be created, being combined (bitwise OR) with one of @code{stat.S_IFREG},
@code{stat.S_IFCHR}, @code{stat.S_IFBLK}, and @code{stat.S_IFIFO} (those constants are
available in @ref{d6,,stat}).  For @code{stat.S_IFCHR} and @code{stat.S_IFBLK},
`device' defines the newly created device special file (probably using
@ref{19a4,,os.makedev()}), otherwise it is ignored.

This function can also support @ref{12f6,,paths relative to directory descriptors}.

@ref{2181,,Availability}: Unix, not WASI.


Changed in version 3.3: Added the `dir_fd' parameter.



Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.

@end deffn

@geindex major() (in module os)
@anchor{library/os os major}@anchor{19a2}
@deffn {Function} os.major (device, /)

Extract the device major number from a raw device number (usually the
@code{st_dev} or @code{st_rdev} field from @code{stat}).
@end deffn

@geindex minor() (in module os)
@anchor{library/os os minor}@anchor{19a3}
@deffn {Function} os.minor (device, /)

Extract the device minor number from a raw device number (usually the
@code{st_dev} or @code{st_rdev} field from @code{stat}).
@end deffn

@geindex makedev() (in module os)
@anchor{library/os os makedev}@anchor{19a4}
@deffn {Function} os.makedev (major, minor, /)

Compose a raw device number from the major and minor device numbers.
@end deffn

@geindex pathconf() (in module os)
@anchor{library/os os pathconf}@anchor{1307}
@deffn {Function} os.pathconf (path, name)

Return system configuration information relevant to a named file. `name'
specifies the configuration value to retrieve; it may be a string which is the
name of a defined system value; these names are specified in a number of
standards (POSIX.1, Unix 95, Unix 98, and others).  Some platforms define
additional names as well.  The names known to the host operating system are
given in the @code{pathconf_names} dictionary.  For configuration variables not
included in that mapping, passing an integer for `name' is also accepted.

If `name' is a string and is not known, @ref{2ee,,ValueError} is raised.  If a
specific value for `name' is not supported by the host system, even if it is
included in @code{pathconf_names}, an @ref{2c2,,OSError} is raised with
@ref{1e14,,errno.EINVAL} for the error number.

This function can support @ref{d59,,specifying a file descriptor}.

@ref{2181,,Availability}: Unix.


Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.

@end deffn

@geindex pathconf_names (in module os)
@anchor{library/os os pathconf_names}@anchor{30ee}
@deffn {Data} os.pathconf_names

Dictionary mapping names accepted by @ref{1307,,pathconf()} and @ref{30ab,,fpathconf()} to
the integer values defined for those names by the host operating system.  This
can be used to determine the set of names known to the system.

@ref{2181,,Availability}: Unix.
@end deffn

@geindex readlink() (in module os)
@anchor{library/os os readlink}@anchor{b20}
@deffn {Function} os.readlink (path, *, dir_fd=None)

Return a string representing the path to which the symbolic link points.  The
result may be either an absolute or relative pathname; if it is relative, it
may be converted to an absolute pathname using
@code{os.path.join(os.path.dirname(path), result)}.

If the `path' is a string object (directly or indirectly through a
@ref{e51,,PathLike} interface), the result will also be a string object,
and the call may raise a UnicodeDecodeError. If the `path' is a bytes
object (direct or indirectly), the result will be a bytes object.

This function can also support @ref{12f6,,paths relative to directory descriptors}.

When trying to resolve a path that may contain links, use
@ref{264,,realpath()} to properly handle recursion and platform
differences.

@ref{2181,,Availability}: Unix, Windows.


Changed in version 3.2: Added support for Windows 6.0 (Vista) symbolic links.



Changed in version 3.3: Added the `dir_fd' parameter.



Changed in version 3.6: Accepts a @ref{5a1,,path-like object} on Unix.



Changed in version 3.8: Accepts a @ref{5a1,,path-like object} and a bytes object on Windows.

Added support for directory junctions, and changed to return the
substitution path (which typically includes @code{\\?\} prefix) rather
than the optional “print name” field that was previously returned.

@end deffn

@geindex remove() (in module os)
@anchor{library/os os remove}@anchor{12fc}
@deffn {Function} os.remove (path, *, dir_fd=None)

Remove (delete) the file `path'.  If `path' is a directory, an
@ref{2c2,,OSError} is raised.  Use @ref{12ff,,rmdir()} to remove directories.
If the file does not exist, a @ref{266,,FileNotFoundError} is raised.

This function can support @ref{12f6,,paths relative to directory descriptors}.

On Windows, attempting to remove a file that is in use causes an exception to
be raised; on Unix, the directory entry is removed but the storage allocated
to the file is not made available until the original file is no longer in use.

This function is semantically identical to @ref{1301,,unlink()}.

Raises an @ref{1cb1,,auditing event} @code{os.remove} with arguments @code{path}, @code{dir_fd}.


Changed in version 3.3: Added the `dir_fd' parameter.



Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.

@end deffn

@geindex removedirs() (in module os)
@anchor{library/os os removedirs}@anchor{30ef}
@deffn {Function} os.removedirs (name)

@geindex directory; deleting

Remove directories recursively.  Works like @ref{12ff,,rmdir()} except that, if the
leaf directory is successfully removed, @code{removedirs()}  tries to
successively remove every parent directory mentioned in  `path' until an error
is raised (which is ignored, because it generally means that a parent directory
is not empty). For example, @code{os.removedirs('foo/bar/baz')} will first remove
the directory @code{'foo/bar/baz'}, and then remove @code{'foo/bar'} and @code{'foo'} if
they are empty. Raises @ref{2c2,,OSError} if the leaf directory could not be
successfully removed.

Raises an @ref{1cb1,,auditing event} @code{os.remove} with arguments @code{path}, @code{dir_fd}.


Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.

@end deffn

@geindex rename() (in module os)
@anchor{library/os os rename}@anchor{12fd}
@deffn {Function} os.rename (src, dst, *, src_dir_fd=None, dst_dir_fd=None)

Rename the file or directory `src' to `dst'. If `dst' exists, the operation
will fail with an @ref{2c2,,OSError} subclass in a number of cases:

On Windows, if `dst' exists a @ref{1226,,FileExistsError} is always raised.
The operation may fail if `src' and `dst' are on different filesystems. Use
@ref{c57,,shutil.move()} to support moves to a different filesystem.

On Unix, if `src' is a file and `dst' is a directory or vice-versa, an
@ref{125f,,IsADirectoryError} or a @ref{1260,,NotADirectoryError} will be raised
respectively.  If both are directories and `dst' is empty, `dst' will be
silently replaced.  If `dst' is a non-empty directory, an @ref{2c2,,OSError}
is raised. If both are files, `dst' will be replaced silently if the user
has permission.  The operation may fail on some Unix flavors if `src' and
`dst' are on different filesystems.  If successful, the renaming will be an
atomic operation (this is a POSIX requirement).

This function can support specifying `src_dir_fd' and/or `dst_dir_fd' to
supply @ref{12f6,,paths relative to directory descriptors}.

If you want cross-platform overwriting of the destination, use @ref{12fe,,replace()}.

Raises an @ref{1cb1,,auditing event} @code{os.rename} with arguments @code{src}, @code{dst}, @code{src_dir_fd}, @code{dst_dir_fd}.


Changed in version 3.3: Added the `src_dir_fd' and `dst_dir_fd' parameters.



Changed in version 3.6: Accepts a @ref{5a1,,path-like object} for `src' and `dst'.

@end deffn

@geindex renames() (in module os)
@anchor{library/os os renames}@anchor{30f0}
@deffn {Function} os.renames (old, new)

Recursive directory or file renaming function. Works like @ref{12fd,,rename()}, except
creation of any intermediate directories needed to make the new pathname good is
attempted first. After the rename, directories corresponding to rightmost path
segments of the old name will be pruned away using @ref{30ef,,removedirs()}.

@cartouche
@quotation Note 
This function can fail with the new directory structure made if you lack
permissions needed to remove the leaf directory or file.
@end quotation
@end cartouche

Raises an @ref{1cb1,,auditing event} @code{os.rename} with arguments @code{src}, @code{dst}, @code{src_dir_fd}, @code{dst_dir_fd}.


Changed in version 3.6: Accepts a @ref{5a1,,path-like object} for `old' and `new'.

@end deffn

@geindex replace() (in module os)
@anchor{library/os os replace}@anchor{12fe}
@deffn {Function} os.replace (src, dst, *, src_dir_fd=None, dst_dir_fd=None)

Rename the file or directory `src' to `dst'.  If `dst' is a non-empty directory,
@ref{2c2,,OSError} will be raised.  If `dst' exists and is a file, it will
be replaced silently if the user has permission.  The operation may fail
if `src' and `dst' are on different filesystems.  If successful,
the renaming will be an atomic operation (this is a POSIX requirement).

This function can support specifying `src_dir_fd' and/or `dst_dir_fd' to
supply @ref{12f6,,paths relative to directory descriptors}.

Raises an @ref{1cb1,,auditing event} @code{os.rename} with arguments @code{src}, @code{dst}, @code{src_dir_fd}, @code{dst_dir_fd}.


Added in version 3.3.



Changed in version 3.6: Accepts a @ref{5a1,,path-like object} for `src' and `dst'.

@end deffn

@geindex rmdir() (in module os)
@anchor{library/os os rmdir}@anchor{12ff}
@deffn {Function} os.rmdir (path, *, dir_fd=None)

Remove (delete) the directory `path'.  If the directory does not exist or is
not empty, a @ref{266,,FileNotFoundError} or an @ref{2c2,,OSError} is raised
respectively.  In order to remove whole directory trees,
@ref{354,,shutil.rmtree()} can be used.

This function can support @ref{12f6,,paths relative to directory descriptors}.

Raises an @ref{1cb1,,auditing event} @code{os.rmdir} with arguments @code{path}, @code{dir_fd}.


Changed in version 3.3: Added the `dir_fd' parameter.



Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.

@end deffn

@geindex scandir() (in module os)
@anchor{library/os os scandir}@anchor{c5a}
@deffn {Function} os.scandir (path='.')

Return an iterator of @ref{6c4,,os.DirEntry} objects corresponding to the
entries in the directory given by `path'. The entries are yielded in
arbitrary order, and the special entries @code{'.'} and @code{'..'} are not
included.  If a file is removed from or added to the directory after
creating the iterator, whether an entry for that file be included is
unspecified.

Using @code{scandir()} instead of @ref{1306,,listdir()} can significantly
increase the performance of code that also needs file type or file
attribute information, because @ref{6c4,,os.DirEntry} objects expose this
information if the operating system provides it when scanning a directory.
All @code{os.DirEntry} methods may perform a system call, but
@ref{30f1,,is_dir()} and @ref{f8a,,is_file()} usually only
require a system call for symbolic links; @ref{1ab1,,os.DirEntry.stat()}
always requires a system call on Unix but only requires one for
symbolic links on Windows.

`path' may be a @ref{5a1,,path-like object}.  If `path' is of type @code{bytes}
(directly or indirectly through the @ref{e51,,PathLike} interface),
the type of the @ref{30f2,,name} and @ref{1a3f,,path}
attributes of each @ref{6c4,,os.DirEntry} will be @code{bytes}; in all other
circumstances, they will be of type @code{str}.

This function can also support @ref{d59,,specifying a file descriptor}; the file descriptor must refer to a directory.

Raises an @ref{1cb1,,auditing event} @code{os.scandir} with argument @code{path}.

The @code{scandir()} iterator supports the @ref{1e3,,context manager} protocol
and has the following method:

@geindex close() (os.scandir method)
@anchor{library/os os scandir close}@anchor{ebe}
@deffn {Method} scandir.close ()

Close the iterator and free acquired resources.

This is called automatically when the iterator is exhausted or garbage
collected, or when an error happens during iterating.  However it
is advisable to call it explicitly or use the @ref{187,,with}
statement.


Added in version 3.6.

@end deffn

The following example shows a simple use of @code{scandir()} to display all
the files (excluding directories) in the given `path' that don’t start with
@code{'.'}. The @code{entry.is_file()} call will generally not make an additional
system call:

@example
with os.scandir(path) as it:
    for entry in it:
        if not entry.name.startswith('.') and entry.is_file():
            print(entry.name)
@end example

@cartouche
@quotation Note 
On Unix-based systems, @code{scandir()} uses the system’s
opendir()@footnote{https://pubs.opengroup.org/onlinepubs/009695399/functions/opendir.html}
and
readdir()@footnote{https://pubs.opengroup.org/onlinepubs/009695399/functions/readdir_r.html}
functions. On Windows, it uses the Win32
FindFirstFileW@footnote{https://msdn.microsoft.com/en-us/library/windows/desktop/aa364418(v=vs.85).aspx}
and
FindNextFileW@footnote{https://msdn.microsoft.com/en-us/library/windows/desktop/aa364428(v=vs.85).aspx}
functions.
@end quotation
@end cartouche


Added in version 3.5.



Changed in version 3.6: Added support for the @ref{1e3,,context manager} protocol and the
@ref{ebe,,close()} method.  If a @code{scandir()} iterator is neither
exhausted nor explicitly closed a @ref{54d,,ResourceWarning} will be emitted
in its destructor.

The function accepts a @ref{5a1,,path-like object}.



Changed in version 3.7: Added support for @ref{d59,,file descriptors} on Unix.

@end deffn

@geindex DirEntry (class in os)
@anchor{library/os os DirEntry}@anchor{6c4}
@deffn {Class} os.DirEntry

Object yielded by @ref{c5a,,scandir()} to expose the file path and other file
attributes of a directory entry.

@ref{c5a,,scandir()} will provide as much of this information as possible without
making additional system calls. When a @code{stat()} or @code{lstat()} system call
is made, the @code{os.DirEntry} object will cache the result.

@code{os.DirEntry} instances are not intended to be stored in long-lived data
structures; if you know the file metadata has changed or if a long time has
elapsed since calling @ref{c5a,,scandir()}, call @code{os.stat(entry.path)} to fetch
up-to-date information.

Because the @code{os.DirEntry} methods can make operating system calls, they may
also raise @ref{2c2,,OSError}. If you need very fine-grained
control over errors, you can catch @code{OSError} when calling one of the
@code{os.DirEntry} methods and handle as appropriate.

To be directly usable as a @ref{5a1,,path-like object}, @code{os.DirEntry}
implements the @ref{e51,,PathLike} interface.

@code{DirEntry} objects are @ref{2410,,generic} over the type of the
path (@ref{16a,,str} or @ref{193,,bytes}).

Attributes and methods on a @code{os.DirEntry} instance are as follows:

@geindex name (os.DirEntry attribute)
@anchor{library/os os DirEntry name}@anchor{30f2}
@deffn {Attribute} name

The entry’s base filename, relative to the @ref{c5a,,scandir()} `path'
argument.

The @ref{3073,,name} attribute will be @code{bytes} if the @ref{c5a,,scandir()}
`path' argument is of type @code{bytes} and @code{str} otherwise.  Use
@ref{e54,,fsdecode()} to decode byte filenames.
@end deffn

@geindex path (os.DirEntry attribute)
@anchor{library/os os DirEntry path}@anchor{1a3f}
@deffn {Attribute} path

The entry’s full path name: equivalent to @code{os.path.join(scandir_path,
entry.name)} where `scandir_path' is the @ref{c5a,,scandir()} `path'
argument.  The path is only absolute if the @code{scandir()} `path'
argument was absolute.  If the @code{scandir()} `path'
argument was a @ref{d59,,file descriptor}, the @ref{a6,,path}
attribute is the same as the @ref{3073,,name} attribute.

The @ref{a6,,path} attribute will be @code{bytes} if the @ref{c5a,,scandir()}
`path' argument is of type @code{bytes} and @code{str} otherwise.  Use
@ref{e54,,fsdecode()} to decode byte filenames.
@end deffn

@geindex inode() (os.DirEntry method)
@anchor{library/os os DirEntry inode}@anchor{1a93}
@deffn {Method} inode ()

Return the inode number of the entry.

The result is cached on the @code{os.DirEntry} object. Use
@code{os.stat(entry.path, follow_symlinks=False).st_ino} to fetch up-to-date
information.

On the first, uncached call, a system call is required on Windows but
not on Unix.
@end deffn

@geindex is_dir() (os.DirEntry method)
@anchor{library/os os DirEntry is_dir}@anchor{30f1}
@deffn {Method} is_dir (*, follow_symlinks=True)

Return @code{True} if this entry is a directory or a symbolic link pointing
to a directory; return @code{False} if the entry is or points to any other
kind of file, or if it doesn’t exist anymore.

If `follow_symlinks' is @code{False}, return @code{True} only if this entry
is a directory (without following symlinks); return @code{False} if the
entry is any other kind of file or if it doesn’t exist anymore.

The result is cached on the @code{os.DirEntry} object, with a separate cache
for `follow_symlinks' @code{True} and @code{False}. Call @ref{26f,,os.stat()} along
with @ref{2ccd,,stat.S_ISDIR()} to fetch up-to-date information.

On the first, uncached call, no system call is required in most cases.
Specifically, for non-symlinks, neither Windows or Unix require a system
call, except on certain Unix file systems, such as network file systems,
that return @code{dirent.d_type == DT_UNKNOWN}. If the entry is a symlink,
a system call will be required to follow the symlink unless
`follow_symlinks' is @code{False}.

This method can raise @ref{2c2,,OSError}, such as @ref{f44,,PermissionError},
but @ref{266,,FileNotFoundError} is caught and not raised.
@end deffn

@geindex is_file() (os.DirEntry method)
@anchor{library/os os DirEntry is_file}@anchor{f8a}
@deffn {Method} is_file (*, follow_symlinks=True)

Return @code{True} if this entry is a file or a symbolic link pointing to a
file; return @code{False} if the entry is or points to a directory or other
non-file entry, or if it doesn’t exist anymore.

If `follow_symlinks' is @code{False}, return @code{True} only if this entry
is a file (without following symlinks); return @code{False} if the entry is
a directory or other non-file entry, or if it doesn’t exist anymore.

The result is cached on the @code{os.DirEntry} object. Caching, system calls
made, and exceptions raised are as per @ref{30f1,,is_dir()}.
@end deffn

@geindex is_symlink() (os.DirEntry method)
@anchor{library/os os DirEntry is_symlink}@anchor{30f3}
@deffn {Method} is_symlink ()

Return @code{True} if this entry is a symbolic link (even if broken);
return @code{False} if the entry points to a directory or any kind of file,
or if it doesn’t exist anymore.

The result is cached on the @code{os.DirEntry} object. Call
@ref{c07,,os.path.islink()} to fetch up-to-date information.

On the first, uncached call, no system call is required in most cases.
Specifically, neither Windows or Unix require a system call, except on
certain Unix file systems, such as network file systems, that return
@code{dirent.d_type == DT_UNKNOWN}.

This method can raise @ref{2c2,,OSError}, such as @ref{f44,,PermissionError},
but @ref{266,,FileNotFoundError} is caught and not raised.
@end deffn

@geindex is_junction() (os.DirEntry method)
@anchor{library/os os DirEntry is_junction}@anchor{6c5}
@deffn {Method} is_junction ()

Return @code{True} if this entry is a junction (even if broken);
return @code{False} if the entry points to a regular directory, any kind
of file, a symlink, or if it doesn’t exist anymore.

The result is cached on the @code{os.DirEntry} object. Call
@ref{6cb,,os.path.isjunction()} to fetch up-to-date information.


Added in version 3.12.

@end deffn

@geindex stat() (os.DirEntry method)
@anchor{library/os os DirEntry stat}@anchor{1ab1}
@deffn {Method} stat (*, follow_symlinks=True)

Return a @ref{16cd,,stat_result} object for this entry. This method
follows symbolic links by default; to stat a symbolic link add the
@code{follow_symlinks=False} argument.

On Unix, this method always requires a system call. On Windows, it
only requires a system call if `follow_symlinks' is @code{True} and the
entry is a reparse point (for example, a symbolic link or directory
junction).

On Windows, the @code{st_ino}, @code{st_dev} and @code{st_nlink} attributes of the
@ref{16cd,,stat_result} are always set to zero. Call @ref{26f,,os.stat()} to
get these attributes.

The result is cached on the @code{os.DirEntry} object, with a separate cache
for `follow_symlinks' @code{True} and @code{False}. Call @ref{26f,,os.stat()} to
fetch up-to-date information.
@end deffn

Note that there is a nice correspondence between several attributes
and methods of @code{os.DirEntry} and of @ref{268,,pathlib.Path}.  In
particular, the @code{name} attribute has the same
meaning, as do the @code{is_dir()}, @code{is_file()}, @code{is_symlink()},
@code{is_junction()}, and @code{stat()} methods.


Added in version 3.5.



Changed in version 3.6: Added support for the @ref{e51,,PathLike} interface.  Added support
for @ref{193,,bytes} paths on Windows.



Changed in version 3.12: The @code{st_ctime} attribute of a stat result is deprecated on Windows.
The file creation time is properly available as @code{st_birthtime}, and
in the future @code{st_ctime} may be changed to return zero or the
metadata change time, if available.

@end deffn

@geindex stat() (in module os)
@anchor{library/os os stat}@anchor{26f}
@deffn {Function} os.stat (path, *, dir_fd=None, follow_symlinks=True)

Get the status of a file or a file descriptor. Perform the equivalent of a
@code{stat()} system call on the given path. `path' may be specified as
either a string or bytes – directly or indirectly through the @ref{e51,,PathLike}
interface – or as an open file descriptor. Return a @ref{16cd,,stat_result}
object.

This function normally follows symlinks; to stat a symlink add the argument
@code{follow_symlinks=False}, or use @ref{6c9,,lstat()}.

This function can support @ref{d59,,specifying a file descriptor} and
@ref{12f7,,not following symlinks}.

On Windows, passing @code{follow_symlinks=False} will disable following all
name-surrogate reparse points, which includes symlinks and directory
junctions. Other types of reparse points that do not resemble links or that
the operating system is unable to follow will be opened directly. When
following a chain of multiple links, this may result in the original link
being returned instead of the non-link that prevented full traversal. To
obtain stat results for the final path in this case, use the
@ref{264,,os.path.realpath()} function to resolve the path name as far as
possible and call @ref{6c9,,lstat()} on the result. This does not apply to
dangling symlinks or junction points, which will raise the usual exceptions.

@geindex module; stat

Example:

@example
>>> import os
>>> statinfo = os.stat('somefile.txt')
>>> statinfo
os.stat_result(st_mode=33188, st_ino=7876932, st_dev=234881026,
st_nlink=1, st_uid=501, st_gid=501, st_size=264, st_atime=1297230295,
st_mtime=1297230027, st_ctime=1297230027)
>>> statinfo.st_size
264
@end example


@subsubheading See also


@ref{f92,,fstat()} and @ref{6c9,,lstat()} functions.



Changed in version 3.3: Added the `dir_fd' and `follow_symlinks' parameters,
specifying a file descriptor instead of a path.



Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.



Changed in version 3.8: On Windows, all reparse points that can be resolved by the operating
system are now followed, and passing @code{follow_symlinks=False}
disables following all name surrogate reparse points. If the operating
system reaches a reparse point that it is not able to follow, `stat' now
returns the information for the original path as if
@code{follow_symlinks=False} had been specified instead of raising an error.

@end deffn

@geindex stat_result (class in os)
@anchor{library/os os stat_result}@anchor{16cd}
@deffn {Class} os.stat_result

Object whose attributes correspond roughly to the members of the
@code{stat} structure. It is used for the result of @ref{26f,,os.stat()},
@ref{f92,,os.fstat()} and @ref{6c9,,os.lstat()}.

Attributes:

@geindex st_mode (os.stat_result attribute)
@anchor{library/os os stat_result st_mode}@anchor{c05}
@deffn {Attribute} st_mode

File mode: file type and file mode bits (permissions).
@end deffn

@geindex st_ino (os.stat_result attribute)
@anchor{library/os os stat_result st_ino}@anchor{30f4}
@deffn {Attribute} st_ino

Platform dependent, but if non-zero, uniquely identifies the
file for a given value of @code{st_dev}. Typically:


@itemize *

@item 
the inode number on Unix,

@item 
the file index@footnote{https://msdn.microsoft.com/en-us/library/aa363788} on
Windows
@end itemize
@end deffn

@geindex st_dev (os.stat_result attribute)
@anchor{library/os os stat_result st_dev}@anchor{30f5}
@deffn {Attribute} st_dev

Identifier of the device on which this file resides.
@end deffn

@geindex st_nlink (os.stat_result attribute)
@anchor{library/os os stat_result st_nlink}@anchor{30f6}
@deffn {Attribute} st_nlink

Number of hard links.
@end deffn

@geindex st_uid (os.stat_result attribute)
@anchor{library/os os stat_result st_uid}@anchor{30f7}
@deffn {Attribute} st_uid

User identifier of the file owner.
@end deffn

@geindex st_gid (os.stat_result attribute)
@anchor{library/os os stat_result st_gid}@anchor{30f8}
@deffn {Attribute} st_gid

Group identifier of the file owner.
@end deffn

@geindex st_size (os.stat_result attribute)
@anchor{library/os os stat_result st_size}@anchor{30f9}
@deffn {Attribute} st_size

Size of the file in bytes, if it is a regular file or a symbolic link.
The size of a symbolic link is the length of the pathname it contains,
without a terminating null byte.
@end deffn

Timestamps:

@geindex st_atime (os.stat_result attribute)
@anchor{library/os os stat_result st_atime}@anchor{30fa}
@deffn {Attribute} st_atime

Time of most recent access expressed in seconds.
@end deffn

@geindex st_mtime (os.stat_result attribute)
@anchor{library/os os stat_result st_mtime}@anchor{2f84}
@deffn {Attribute} st_mtime

Time of most recent content modification expressed in seconds.
@end deffn

@geindex st_ctime (os.stat_result attribute)
@anchor{library/os os stat_result st_ctime}@anchor{30fb}
@deffn {Attribute} st_ctime

Time of most recent metadata change expressed in seconds.


Changed in version 3.12: @code{st_ctime} is deprecated on Windows. Use @code{st_birthtime} for
the file creation time. In the future, @code{st_ctime} will contain
the time of the most recent metadata change, as for other platforms.

@end deffn

@geindex st_atime_ns (os.stat_result attribute)
@anchor{library/os os stat_result st_atime_ns}@anchor{30fc}
@deffn {Attribute} st_atime_ns

Time of most recent access expressed in nanoseconds as an integer.


Added in version 3.3.

@end deffn

@geindex st_mtime_ns (os.stat_result attribute)
@anchor{library/os os stat_result st_mtime_ns}@anchor{30fd}
@deffn {Attribute} st_mtime_ns

Time of most recent content modification expressed in nanoseconds as an
integer.


Added in version 3.3.

@end deffn

@geindex st_ctime_ns (os.stat_result attribute)
@anchor{library/os os stat_result st_ctime_ns}@anchor{30fe}
@deffn {Attribute} st_ctime_ns

Time of most recent metadata change expressed in nanoseconds as an
integer.


Added in version 3.3.



Changed in version 3.12: @code{st_ctime_ns} is deprecated on Windows. Use @code{st_birthtime_ns}
for the file creation time. In the future, @code{st_ctime} will contain
the time of the most recent metadata change, as for other platforms.

@end deffn

@geindex st_birthtime (os.stat_result attribute)
@anchor{library/os os stat_result st_birthtime}@anchor{30ff}
@deffn {Attribute} st_birthtime

Time of file creation expressed in seconds. This attribute is not
always available, and may raise @ref{5f0,,AttributeError}.


Changed in version 3.12: @code{st_birthtime} is now available on Windows.

@end deffn

@geindex st_birthtime_ns (os.stat_result attribute)
@anchor{library/os os stat_result st_birthtime_ns}@anchor{3100}
@deffn {Attribute} st_birthtime_ns

Time of file creation expressed in nanoseconds as an integer.
This attribute is not always available, and may raise
@ref{5f0,,AttributeError}.


Added in version 3.12.

@end deffn

@cartouche
@quotation Note 
The exact meaning and resolution of the @ref{30fa,,st_atime},
@ref{2f84,,st_mtime}, @ref{30fb,,st_ctime} and @ref{30ff,,st_birthtime} attributes
depend on the operating system and the file system. For example, on
Windows systems using the FAT32 file systems, @code{st_mtime} has
2-second resolution, and @code{st_atime} has only 1-day resolution.
See your operating system documentation for details.

Similarly, although @ref{30fc,,st_atime_ns}, @ref{30fd,,st_mtime_ns},
@ref{30fe,,st_ctime_ns} and @ref{3100,,st_birthtime_ns} are always expressed in
nanoseconds, many systems do not provide nanosecond precision.  On
systems that do provide nanosecond precision, the floating-point object
used to store @ref{30fa,,st_atime}, @ref{2f84,,st_mtime}, @ref{30fb,,st_ctime} and
@ref{30ff,,st_birthtime} cannot preserve all of it, and as such will be
slightly inexact. If you need the exact timestamps you should always use
@code{st_atime_ns}, @code{st_mtime_ns}, @code{st_ctime_ns} and
@code{st_birthtime_ns}.
@end quotation
@end cartouche

On some Unix systems (such as Linux), the following attributes may also be
available:

@geindex st_blocks (os.stat_result attribute)
@anchor{library/os os stat_result st_blocks}@anchor{3101}
@deffn {Attribute} st_blocks

Number of 512-byte blocks allocated for file.
This may be smaller than @ref{30f9,,st_size}/512 when the file has holes.
@end deffn

@geindex st_blksize (os.stat_result attribute)
@anchor{library/os os stat_result st_blksize}@anchor{3102}
@deffn {Attribute} st_blksize

“Preferred” blocksize for efficient file system I/O. Writing to a file in
smaller chunks may cause an inefficient read-modify-rewrite.
@end deffn

@geindex st_rdev (os.stat_result attribute)
@anchor{library/os os stat_result st_rdev}@anchor{180e}
@deffn {Attribute} st_rdev

Type of device if an inode device.
@end deffn

@geindex st_flags (os.stat_result attribute)
@anchor{library/os os stat_result st_flags}@anchor{3103}
@deffn {Attribute} st_flags

User defined flags for file.
@end deffn

On other Unix systems (such as FreeBSD), the following attributes may be
available (but may be only filled out if root tries to use them):

@geindex st_gen (os.stat_result attribute)
@anchor{library/os os stat_result st_gen}@anchor{3104}
@deffn {Attribute} st_gen

File generation number.
@end deffn

On Solaris and derivatives, the following attributes may also be
available:

@geindex st_fstype (os.stat_result attribute)
@anchor{library/os os stat_result st_fstype}@anchor{d61}
@deffn {Attribute} st_fstype

String that uniquely identifies the type of the filesystem that
contains the file.
@end deffn

On macOS systems, the following attributes may also be available:

@geindex st_rsize (os.stat_result attribute)
@anchor{library/os os stat_result st_rsize}@anchor{3105}
@deffn {Attribute} st_rsize

Real size of the file.
@end deffn

@geindex st_creator (os.stat_result attribute)
@anchor{library/os os stat_result st_creator}@anchor{3106}
@deffn {Attribute} st_creator

Creator of the file.
@end deffn

@geindex st_type (os.stat_result attribute)
@anchor{library/os os stat_result st_type}@anchor{3107}
@deffn {Attribute} st_type

File type.
@end deffn

On Windows systems, the following attributes are also available:

@geindex st_file_attributes (os.stat_result attribute)
@anchor{library/os os stat_result st_file_attributes}@anchor{103e}
@deffn {Attribute} st_file_attributes

Windows file attributes: @code{dwFileAttributes} member of the
@code{BY_HANDLE_FILE_INFORMATION} structure returned by
@code{GetFileInformationByHandle()}.
See the @code{FILE_ATTRIBUTE_* <stat.FILE_ATTRIBUTE_ARCHIVE>}
constants in the @ref{d6,,stat} module.


Added in version 3.5.

@end deffn

@geindex st_reparse_tag (os.stat_result attribute)
@anchor{library/os os stat_result st_reparse_tag}@anchor{c06}
@deffn {Attribute} st_reparse_tag

When @ref{103e,,st_file_attributes} has the @ref{2d1a,,FILE_ATTRIBUTE_REPARSE_POINT}
set, this field contains the tag identifying the type of reparse point.
See the @ref{2d1f,,IO_REPARSE_TAG_*}
constants in the @ref{d6,,stat} module.
@end deffn

The standard module @ref{d6,,stat} defines functions and constants that are
useful for extracting information from a @code{stat} structure. (On
Windows, some items are filled with dummy values.)

For backward compatibility, a @code{stat_result} instance is also
accessible as a tuple of at least 10 integers giving the most important (and
portable) members of the @code{stat} structure, in the order
@ref{c05,,st_mode}, @ref{30f4,,st_ino}, @ref{30f5,,st_dev}, @ref{30f6,,st_nlink},
@ref{30f7,,st_uid}, @ref{30f8,,st_gid}, @ref{30f9,,st_size}, @ref{30fa,,st_atime},
@ref{2f84,,st_mtime}, @ref{30fb,,st_ctime}. More items may be added at the end by
some implementations. For compatibility with older Python versions,
accessing @code{stat_result} as a tuple always returns integers.


Changed in version 3.5: Windows now returns the file index as @ref{30f4,,st_ino} when
available.



Changed in version 3.7: Added the @ref{d61,,st_fstype} member to Solaris/derivatives.



Changed in version 3.8: Added the @ref{c06,,st_reparse_tag} member on Windows.



Changed in version 3.8: On Windows, the @ref{c05,,st_mode} member now identifies special
files as @code{S_IFCHR}, @code{S_IFIFO} or @code{S_IFBLK}
as appropriate.



Changed in version 3.12: On Windows, @ref{30fb,,st_ctime} is deprecated. Eventually, it will
contain the last metadata change time, for consistency with other
platforms, but for now still contains creation time.
Use @ref{30ff,,st_birthtime} for the creation time.

On Windows, @ref{30f4,,st_ino} may now be up to 128 bits, depending
on the file system. Previously it would not be above 64 bits, and
larger file identifiers would be arbitrarily packed.

On Windows, @ref{180e,,st_rdev} no longer returns a value. Previously
it would contain the same as @ref{30f5,,st_dev}, which was incorrect.

Added the @ref{30ff,,st_birthtime} member on Windows.

@end deffn

@geindex statvfs() (in module os)
@anchor{library/os os statvfs}@anchor{1308}
@deffn {Function} os.statvfs (path)

Perform a @code{statvfs()} system call on the given path.  The return value is
an object whose attributes describe the filesystem on the given path, and
correspond to the members of the @code{statvfs} structure, namely:
@code{f_bsize}, @code{f_frsize}, @code{f_blocks}, @code{f_bfree},
@code{f_bavail}, @code{f_files}, @code{f_ffree}, @code{f_favail},
@code{f_flag}, @code{f_namemax}, @code{f_fsid}.

Two module-level constants are defined for the @code{f_flag} attribute’s
bit-flags: if @code{ST_RDONLY} is set, the filesystem is mounted
read-only, and if @code{ST_NOSUID} is set, the semantics of
setuid/setgid bits are disabled or not supported.

Additional module-level constants are defined for GNU/glibc based systems.
These are @code{ST_NODEV} (disallow access to device special files),
@code{ST_NOEXEC} (disallow program execution), @code{ST_SYNCHRONOUS}
(writes are synced at once), @code{ST_MANDLOCK} (allow mandatory locks on an FS),
@code{ST_WRITE} (write on file/directory/symlink), @code{ST_APPEND}
(append-only file), @code{ST_IMMUTABLE} (immutable file), @code{ST_NOATIME}
(do not update access times), @code{ST_NODIRATIME} (do not update directory access
times), @code{ST_RELATIME} (update atime relative to mtime/ctime).

This function can support @ref{d59,,specifying a file descriptor}.

@ref{2181,,Availability}: Unix.


Changed in version 3.2: The @code{ST_RDONLY} and @code{ST_NOSUID} constants were added.



Changed in version 3.3: Added support for specifying `path' as an open file descriptor.



Changed in version 3.4: The @code{ST_NODEV}, @code{ST_NOEXEC}, @code{ST_SYNCHRONOUS},
@code{ST_MANDLOCK}, @code{ST_WRITE}, @code{ST_APPEND},
@code{ST_IMMUTABLE}, @code{ST_NOATIME}, @code{ST_NODIRATIME},
and @code{ST_RELATIME} constants were added.



Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.



Changed in version 3.7: Added the @code{f_fsid} attribute.

@end deffn

@geindex supports_dir_fd (in module os)
@anchor{library/os os supports_dir_fd}@anchor{1303}
@deffn {Data} os.supports_dir_fd

A @ref{185,,set} object indicating which functions in the @code{os}
module accept an open file descriptor for their `dir_fd' parameter.
Different platforms provide different features, and the underlying
functionality Python uses to implement the `dir_fd' parameter is not
available on all platforms Python supports.  For consistency’s sake,
functions that may support `dir_fd' always allow specifying the
parameter, but will throw an exception if the functionality is used
when it’s not locally available. (Specifying @code{None} for `dir_fd'
is always supported on all platforms.)

To check whether a particular function accepts an open file descriptor
for its `dir_fd' parameter, use the @code{in} operator on @code{supports_dir_fd}.
As an example, this expression evaluates to @code{True} if @ref{26f,,os.stat()}
accepts open file descriptors for `dir_fd' on the local platform:

@example
os.stat in os.supports_dir_fd
@end example

Currently `dir_fd' parameters only work on Unix platforms;
none of them work on Windows.


Added in version 3.3.

@end deffn

@geindex supports_effective_ids (in module os)
@anchor{library/os os supports_effective_ids}@anchor{130a}
@deffn {Data} os.supports_effective_ids

A @ref{185,,set} object indicating whether @ref{12f8,,os.access()} permits
specifying @code{True} for its `effective_ids' parameter on the local platform.
(Specifying @code{False} for `effective_ids' is always supported on all
platforms.)  If the local platform supports it, the collection will contain
@code{os.access()}; otherwise it will be empty.

This expression evaluates to @code{True} if @ref{12f8,,os.access()} supports
@code{effective_ids=True} on the local platform:

@example
os.access in os.supports_effective_ids
@end example

Currently `effective_ids' is only supported on Unix platforms;
it does not work on Windows.


Added in version 3.3.

@end deffn

@geindex supports_fd (in module os)
@anchor{library/os os supports_fd}@anchor{1309}
@deffn {Data} os.supports_fd

A @ref{185,,set} object indicating which functions in the
@code{os} module permit specifying their `path' parameter as an open file
descriptor on the local platform.  Different platforms provide different
features, and the underlying functionality Python uses to accept open file
descriptors as `path' arguments is not available on all platforms Python
supports.

To determine whether a particular function permits specifying an open file
descriptor for its `path' parameter, use the @code{in} operator on
@code{supports_fd}. As an example, this expression evaluates to @code{True} if
@ref{822,,os.chdir()} accepts open file descriptors for `path' on your local
platform:

@example
os.chdir in os.supports_fd
@end example


Added in version 3.3.

@end deffn

@geindex supports_follow_symlinks (in module os)
@anchor{library/os os supports_follow_symlinks}@anchor{1304}
@deffn {Data} os.supports_follow_symlinks

A @ref{185,,set} object indicating which functions in the @code{os} module
accept @code{False} for their `follow_symlinks' parameter on the local platform.
Different platforms provide different features, and the underlying
functionality Python uses to implement `follow_symlinks' is not available
on all platforms Python supports.  For consistency’s sake, functions that
may support `follow_symlinks' always allow specifying the parameter, but
will throw an exception if the functionality is used when it’s not locally
available.  (Specifying @code{True} for `follow_symlinks' is always supported
on all platforms.)

To check whether a particular function accepts @code{False} for its
`follow_symlinks' parameter, use the @code{in} operator on
@code{supports_follow_symlinks}.  As an example, this expression evaluates
to @code{True} if you may specify @code{follow_symlinks=False} when calling
@ref{26f,,os.stat()} on the local platform:

@example
os.stat in os.supports_follow_symlinks
@end example


Added in version 3.3.

@end deffn

@geindex symlink() (in module os)
@anchor{library/os os symlink}@anchor{1300}
@deffn {Function} os.symlink (src, dst, target_is_directory=False, *, dir_fd=None)

Create a symbolic link pointing to `src' named `dst'.

The `src' parameter refers to the target of the link (the file or directory being linked to),
and `dst' is the name of the link being created.

On Windows, a symlink represents either a file or a directory, and does not
morph to the target dynamically.  If the target is present, the type of the
symlink will be created to match. Otherwise, the symlink will be created
as a directory if `target_is_directory' is @code{True} or a file symlink (the
default) otherwise.  On non-Windows platforms, `target_is_directory' is ignored.

This function can support @ref{12f6,,paths relative to directory descriptors}.

@cartouche
@quotation Note 
On newer versions of Windows 10, unprivileged accounts can create symlinks
if Developer Mode is enabled. When Developer Mode is not available/enabled,
the `SeCreateSymbolicLinkPrivilege' privilege is required, or the process
must be run as an administrator.

@ref{2c2,,OSError} is raised when the function is called by an unprivileged
user.
@end quotation
@end cartouche

Raises an @ref{1cb1,,auditing event} @code{os.symlink} with arguments @code{src}, @code{dst}, @code{dir_fd}.

@ref{2181,,Availability}: Unix, Windows.

The function is limited on WASI, see @ref{1bae,,WebAssembly platforms} for more
information.


Changed in version 3.2: Added support for Windows 6.0 (Vista) symbolic links.



Changed in version 3.3: Added the `dir_fd' parameter, and now allow `target_is_directory'
on non-Windows platforms.



Changed in version 3.6: Accepts a @ref{5a1,,path-like object} for `src' and `dst'.



Changed in version 3.8: Added support for unelevated symlinks on Windows with Developer Mode.

@end deffn

@geindex sync() (in module os)
@anchor{library/os os sync}@anchor{131e}
@deffn {Function} os.sync ()

Force write of everything to disk.

@ref{2181,,Availability}: Unix.


Added in version 3.3.

@end deffn

@geindex truncate() (in module os)
@anchor{library/os os truncate}@anchor{1042}
@deffn {Function} os.truncate (path, length)

Truncate the file corresponding to `path', so that it is at most
`length' bytes in size.

This function can support @ref{d59,,specifying a file descriptor}.

Raises an @ref{1cb1,,auditing event} @code{os.truncate} with arguments @code{path}, @code{length}.

@ref{2181,,Availability}: Unix, Windows.


Added in version 3.3.



Changed in version 3.5: Added support for Windows



Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.

@end deffn

@geindex unlink() (in module os)
@anchor{library/os os unlink}@anchor{1301}
@deffn {Function} os.unlink (path, *, dir_fd=None)

Remove (delete) the file `path'.  This function is semantically
identical to @ref{12fc,,remove()}; the @code{unlink} name is its
traditional Unix name.  Please see the documentation for
@code{remove()} for further information.

Raises an @ref{1cb1,,auditing event} @code{os.remove} with arguments @code{path}, @code{dir_fd}.


Changed in version 3.3: Added the `dir_fd' parameter.



Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.

@end deffn

@geindex utime() (in module os)
@anchor{library/os os utime}@anchor{1302}
@deffn {Function} os.utime (path, times=None, *[, ns], dir_fd=None, follow_symlinks=True)

Set the access and modified times of the file specified by `path'.

@code{utime()} takes two optional parameters, `times' and `ns'.
These specify the times set on `path' and are used as follows:


@itemize -

@item 
If `ns' is specified,
it must be a 2-tuple of the form @code{(atime_ns, mtime_ns)}
where each member is an int expressing nanoseconds.

@item 
If `times' is not @code{None},
it must be a 2-tuple of the form @code{(atime, mtime)}
where each member is an int or float expressing seconds.

@item 
If `times' is @code{None} and `ns' is unspecified,
this is equivalent to specifying @code{ns=(atime_ns, mtime_ns)}
where both times are the current time.
@end itemize

It is an error to specify tuples for both `times' and `ns'.

Note that the exact times you set here may not be returned by a subsequent
@ref{26f,,stat()} call, depending on the resolution with which your operating
system records access and modification times; see @code{stat()}. The best
way to preserve exact times is to use the `st_atime_ns' and `st_mtime_ns'
fields from the @code{os.stat()} result object with the `ns' parameter to
@code{utime()}.

This function can support @ref{d59,,specifying a file descriptor},
@ref{12f6,,paths relative to directory descriptors} and @ref{12f7,,not following symlinks}.

Raises an @ref{1cb1,,auditing event} @code{os.utime} with arguments @code{path}, @code{times}, @code{ns}, @code{dir_fd}.


Changed in version 3.3: Added support for specifying `path' as an open file descriptor,
and the `dir_fd', `follow_symlinks', and `ns' parameters.



Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.

@end deffn

@geindex walk() (in module os)
@anchor{library/os os walk}@anchor{6d1}
@deffn {Function} os.walk (top, topdown=True, onerror=None, followlinks=False)

@geindex directory; walking
@geindex directory; traversal

Generate the file names in a directory tree by walking the tree
either top-down or bottom-up. For each directory in the tree rooted at directory
`top' (including `top' itself), it yields a 3-tuple @code{(dirpath, dirnames,
filenames)}.

`dirpath' is a string, the path to the directory.  `dirnames' is a list of the
names of the subdirectories in `dirpath' (including symlinks to directories,
and excluding @code{'.'} and @code{'..'}).
`filenames' is a list of the names of the non-directory files in `dirpath'.
Note that the names in the lists contain no path components.  To get a full path
(which begins with `top') to a file or directory in `dirpath', do
@code{os.path.join(dirpath, name)}.  Whether or not the lists are sorted
depends on the file system.  If a file is removed from or added to the
`dirpath' directory during generating the lists, whether a name for that
file be included is unspecified.

If optional argument `topdown' is @code{True} or not specified, the triple for a
directory is generated before the triples for any of its subdirectories
(directories are generated top-down).  If `topdown' is @code{False}, the triple
for a directory is generated after the triples for all of its subdirectories
(directories are generated bottom-up). No matter the value of `topdown', the
list of subdirectories is retrieved before the tuples for the directory and
its subdirectories are generated.

When `topdown' is @code{True}, the caller can modify the `dirnames' list in-place
(perhaps using @ref{1b63,,del} or slice assignment), and @code{walk()} will only
recurse into the subdirectories whose names remain in `dirnames'; this can be
used to prune the search, impose a specific order of visiting, or even to inform
@code{walk()} about directories the caller creates or renames before it resumes
@code{walk()} again.  Modifying `dirnames' when `topdown' is @code{False} has
no effect on the behavior of the walk, because in bottom-up mode the directories
in `dirnames' are generated before `dirpath' itself is generated.

By default, errors from the @ref{c5a,,scandir()} call are ignored.  If optional
argument `onerror' is specified, it should be a function; it will be called with
one argument, an @ref{2c2,,OSError} instance.  It can report the error to continue
with the walk, or raise the exception to abort the walk.  Note that the filename
is available as the @code{filename} attribute of the exception object.

By default, @code{walk()} will not walk down into symbolic links that resolve to
directories. Set `followlinks' to @code{True} to visit directories pointed to by
symlinks, on systems that support them.

@cartouche
@quotation Note 
Be aware that setting `followlinks' to @code{True} can lead to infinite
recursion if a link points to a parent directory of itself. @code{walk()}
does not keep track of the directories it visited already.
@end quotation
@end cartouche

@cartouche
@quotation Note 
If you pass a relative pathname, don’t change the current working directory
between resumptions of @code{walk()}.  @code{walk()} never changes the current
directory, and assumes that its caller doesn’t either.
@end quotation
@end cartouche

This example displays the number of bytes taken by non-directory files in each
directory under the starting directory, except that it doesn’t look under any
@code{__pycache__} subdirectory:

@example
import os
from os.path import join, getsize
for root, dirs, files in os.walk('python/Lib/xml'):
    print(root, "consumes", end=" ")
    print(sum(getsize(join(root, name)) for name in files), end=" ")
    print("bytes in", len(files), "non-directory files")
    if '__pycache__' in dirs:
        dirs.remove('__pycache__')  # don't visit __pycache__ directories
@end example

In the next example (simple implementation of @ref{354,,shutil.rmtree()}),
walking the tree bottom-up is essential, @ref{12ff,,rmdir()} doesn’t allow
deleting a directory before the directory is empty:

@example
# Delete everything reachable from the directory named in "top",
# assuming there are no symbolic links.
# CAUTION:  This is dangerous!  For example, if top == '/', it
# could delete all your disk files.
import os
for root, dirs, files in os.walk(top, topdown=False):
    for name in files:
        os.remove(os.path.join(root, name))
    for name in dirs:
        os.rmdir(os.path.join(root, name))
os.rmdir(top)
@end example

Raises an @ref{1cb1,,auditing event} @code{os.walk} with arguments @code{top}, @code{topdown}, @code{onerror}, @code{followlinks}.


Changed in version 3.5: This function now calls @ref{c5a,,os.scandir()} instead of @ref{1306,,os.listdir()},
making it faster by reducing the number of calls to @ref{26f,,os.stat()}.



Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.

@end deffn

@geindex fwalk() (in module os)
@anchor{library/os os fwalk}@anchor{d58}
@deffn {Function} os.fwalk (top='.', topdown=True, onerror=None, *, follow_symlinks=False, dir_fd=None)

@geindex directory; walking
@geindex directory; traversal

This behaves exactly like @ref{6d1,,walk()}, except that it yields a 4-tuple
@code{(dirpath, dirnames, filenames, dirfd)}, and it supports @code{dir_fd}.

`dirpath', `dirnames' and `filenames' are identical to @ref{6d1,,walk()} output,
and `dirfd' is a file descriptor referring to the directory `dirpath'.

This function always supports @ref{12f6,,paths relative to directory descriptors} and @ref{12f7,,not following symlinks}.  Note however
that, unlike other functions, the @code{fwalk()} default value for
`follow_symlinks' is @code{False}.

@cartouche
@quotation Note 
Since @code{fwalk()} yields file descriptors, those are only valid until
the next iteration step, so you should duplicate them (e.g. with
@ref{1e04,,dup()}) if you want to keep them longer.
@end quotation
@end cartouche

This example displays the number of bytes taken by non-directory files in each
directory under the starting directory, except that it doesn’t look under any
@code{__pycache__} subdirectory:

@example
import os
for root, dirs, files, rootfd in os.fwalk('python/Lib/xml'):
    print(root, "consumes", end=" ")
    print(sum([os.stat(name, dir_fd=rootfd).st_size for name in files]),
          end=" ")
    print("bytes in", len(files), "non-directory files")
    if '__pycache__' in dirs:
        dirs.remove('__pycache__')  # don't visit __pycache__ directories
@end example

In the next example, walking the tree bottom-up is essential:
@ref{12ff,,rmdir()} doesn’t allow deleting a directory before the directory is
empty:

@example
# Delete everything reachable from the directory named in "top",
# assuming there are no symbolic links.
# CAUTION:  This is dangerous!  For example, if top == '/', it
# could delete all your disk files.
import os
for root, dirs, files, rootfd in os.fwalk(top, topdown=False):
    for name in files:
        os.unlink(name, dir_fd=rootfd)
    for name in dirs:
        os.rmdir(name, dir_fd=rootfd)
@end example

Raises an @ref{1cb1,,auditing event} @code{os.fwalk} with arguments @code{top}, @code{topdown}, @code{onerror}, @code{follow_symlinks}, @code{dir_fd}.

@ref{2181,,Availability}: Unix.


Added in version 3.3.



Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.



Changed in version 3.7: Added support for @ref{193,,bytes} paths.

@end deffn

@geindex memfd_create() (in module os)
@anchor{library/os os memfd_create}@anchor{c04}
@deffn {Function} os.memfd_create (name[, flags=os.MFD_CLOEXEC])

Create an anonymous file and return a file descriptor that refers to it.
`flags' must be one of the @code{os.MFD_*} constants available on the system
(or a bitwise ORed combination of them).  By default, the new file
descriptor is @ref{1102,,non-inheritable}.

The name supplied in `name' is used as a filename and will be displayed as
the target of the corresponding symbolic link in the directory
@code{/proc/self/fd/}. The displayed name is always prefixed with @code{memfd:}
and serves only for debugging purposes. Names do not affect the behavior of
the file descriptor, and as such multiple files can have the same name
without any side effects.

@ref{2181,,Availability}: Linux >= 3.17 with glibc >= 2.27.


Added in version 3.8.

@end deffn

@geindex MFD_CLOEXEC (in module os)
@geindex MFD_ALLOW_SEALING (in module os)
@geindex MFD_HUGETLB (in module os)
@geindex MFD_HUGE_SHIFT (in module os)
@geindex MFD_HUGE_MASK (in module os)
@geindex MFD_HUGE_64KB (in module os)
@geindex MFD_HUGE_512KB (in module os)
@geindex MFD_HUGE_1MB (in module os)
@geindex MFD_HUGE_2MB (in module os)
@geindex MFD_HUGE_8MB (in module os)
@geindex MFD_HUGE_16MB (in module os)
@geindex MFD_HUGE_32MB (in module os)
@geindex MFD_HUGE_256MB (in module os)
@geindex MFD_HUGE_512MB (in module os)
@geindex MFD_HUGE_1GB (in module os)
@geindex MFD_HUGE_2GB (in module os)
@geindex MFD_HUGE_16GB (in module os)
@anchor{library/os os MFD_CLOEXEC}@anchor{3108}
@deffn {Data} os.MFD_CLOEXEC
@anchor{library/os os MFD_ALLOW_SEALING}@anchor{3109}
@deffnx {Data} os.MFD_ALLOW_SEALING
@anchor{library/os os MFD_HUGETLB}@anchor{310a}
@deffnx {Data} os.MFD_HUGETLB
@anchor{library/os os MFD_HUGE_SHIFT}@anchor{310b}
@deffnx {Data} os.MFD_HUGE_SHIFT
@anchor{library/os os MFD_HUGE_MASK}@anchor{310c}
@deffnx {Data} os.MFD_HUGE_MASK
@anchor{library/os os MFD_HUGE_64KB}@anchor{310d}
@deffnx {Data} os.MFD_HUGE_64KB
@anchor{library/os os MFD_HUGE_512KB}@anchor{310e}
@deffnx {Data} os.MFD_HUGE_512KB
@anchor{library/os os MFD_HUGE_1MB}@anchor{310f}
@deffnx {Data} os.MFD_HUGE_1MB
@anchor{library/os os MFD_HUGE_2MB}@anchor{3110}
@deffnx {Data} os.MFD_HUGE_2MB
@anchor{library/os os MFD_HUGE_8MB}@anchor{3111}
@deffnx {Data} os.MFD_HUGE_8MB
@anchor{library/os os MFD_HUGE_16MB}@anchor{3112}
@deffnx {Data} os.MFD_HUGE_16MB
@anchor{library/os os MFD_HUGE_32MB}@anchor{3113}
@deffnx {Data} os.MFD_HUGE_32MB
@anchor{library/os os MFD_HUGE_256MB}@anchor{3114}
@deffnx {Data} os.MFD_HUGE_256MB
@anchor{library/os os MFD_HUGE_512MB}@anchor{3115}
@deffnx {Data} os.MFD_HUGE_512MB
@anchor{library/os os MFD_HUGE_1GB}@anchor{3116}
@deffnx {Data} os.MFD_HUGE_1GB
@anchor{library/os os MFD_HUGE_2GB}@anchor{3117}
@deffnx {Data} os.MFD_HUGE_2GB
@anchor{library/os os MFD_HUGE_16GB}@anchor{3118}
@deffnx {Data} os.MFD_HUGE_16GB

These flags can be passed to @ref{c04,,memfd_create()}.

@ref{2181,,Availability}: Linux >= 3.17 with glibc >= 2.27

The @code{MFD_HUGE*} flags are only available since Linux 4.14.


Added in version 3.8.

@end deffn

@geindex eventfd() (in module os)
@anchor{library/os os eventfd}@anchor{a1f}
@deffn {Function} os.eventfd (initval[, flags=os.EFD_CLOEXEC])

Create and return an event file descriptor. The file descriptors supports
raw @ref{f9b,,read()} and @ref{fa1,,write()} with a buffer size of 8,
@ref{fa6,,select()}, @ref{3119,,poll()} and similar. See man page
@code{eventfd(2)@footnote{https://manpages.debian.org/eventfd(2)}} for more information.  By default, the
new file descriptor is @ref{1102,,non-inheritable}.

`initval' is the initial value of the event counter. The initial value
must be a 32 bit unsigned integer. Please note that the initial value is
limited to a 32 bit unsigned int although the event counter is an unsigned
64 bit integer with a maximum value of 2@w{^64}-2.

`flags' can be constructed from @ref{1b9c,,EFD_CLOEXEC},
@ref{1b9d,,EFD_NONBLOCK}, and @ref{1b9e,,EFD_SEMAPHORE}.

If @ref{1b9e,,EFD_SEMAPHORE} is specified and the event counter is non-zero,
@ref{311a,,eventfd_read()} returns 1 and decrements the counter by one.

If @ref{1b9e,,EFD_SEMAPHORE} is not specified and the event counter is
non-zero, @ref{311a,,eventfd_read()} returns the current event counter value and
resets the counter to zero.

If the event counter is zero and @ref{1b9d,,EFD_NONBLOCK} is not
specified, @ref{311a,,eventfd_read()} blocks.

@ref{311b,,eventfd_write()} increments the event counter. Write blocks if the
write operation would increment the counter to a value larger than
2@w{^64}-2.

Example:

@example
import os

# semaphore with start value '1'
fd = os.eventfd(1, os.EFD_SEMAPHORE | os.EFD_CLOEXEC)
try:
    # acquire semaphore
    v = os.eventfd_read(fd)
    try:
        do_work()
    finally:
        # release semaphore
        os.eventfd_write(fd, v)
finally:
    os.close(fd)
@end example

@ref{2181,,Availability}: Linux >= 2.6.27 with glibc >= 2.8


Added in version 3.10.

@end deffn

@geindex eventfd_read() (in module os)
@anchor{library/os os eventfd_read}@anchor{311a}
@deffn {Function} os.eventfd_read (fd)

Read value from an @ref{a1f,,eventfd()} file descriptor and return a 64 bit
unsigned int. The function does not verify that `fd' is an @code{eventfd()}.

@ref{2181,,Availability}: Linux >= 2.6.27


Added in version 3.10.

@end deffn

@geindex eventfd_write() (in module os)
@anchor{library/os os eventfd_write}@anchor{311b}
@deffn {Function} os.eventfd_write (fd, value)

Add value to an @ref{a1f,,eventfd()} file descriptor. `value' must be a 64 bit
unsigned int. The function does not verify that `fd' is an @code{eventfd()}.

@ref{2181,,Availability}: Linux >= 2.6.27


Added in version 3.10.

@end deffn

@geindex EFD_CLOEXEC (in module os)
@anchor{library/os os EFD_CLOEXEC}@anchor{1b9c}
@deffn {Data} os.EFD_CLOEXEC

Set close-on-exec flag for new @ref{a1f,,eventfd()} file descriptor.

@ref{2181,,Availability}: Linux >= 2.6.27


Added in version 3.10.

@end deffn

@geindex EFD_NONBLOCK (in module os)
@anchor{library/os os EFD_NONBLOCK}@anchor{1b9d}
@deffn {Data} os.EFD_NONBLOCK

Set @ref{1041,,O_NONBLOCK} status flag for new @ref{a1f,,eventfd()} file
descriptor.

@ref{2181,,Availability}: Linux >= 2.6.27


Added in version 3.10.

@end deffn

@geindex EFD_SEMAPHORE (in module os)
@anchor{library/os os EFD_SEMAPHORE}@anchor{1b9e}
@deffn {Data} os.EFD_SEMAPHORE

Provide semaphore-like semantics for reads from an @ref{a1f,,eventfd()} file
descriptor. On read the internal counter is decremented by one.

@ref{2181,,Availability}: Linux >= 2.6.30


Added in version 3.10.

@end deffn

@menu
* Timer File Descriptors:: 
* Linux extended attributes:: 

@end menu

@node Timer File Descriptors,Linux extended attributes,,Files and Directories
@anchor{library/os os-timerfd}@anchor{47e}@anchor{library/os timer-file-descriptors}@anchor{311c}
@subsubsection Timer File Descriptors



Added in version 3.13.


These functions provide support for Linux’s `timer file descriptor' API.
Naturally, they are all only available on Linux.

@geindex timerfd_create() (in module os)
@anchor{library/os os timerfd_create}@anchor{520}
@deffn {Function} os.timerfd_create (clockid, /, *, flags=0)

Create and return a timer file descriptor (`timerfd').

The file descriptor returned by @code{timerfd_create()} supports:


@itemize -

@item 
@ref{f9b,,read()}

@item 
@ref{fa6,,select()}

@item 
@ref{3119,,poll()}
@end itemize

The file descriptor’s @ref{f9b,,read()} method can be called with a buffer size
of 8. If the timer has already expired one or more times, @code{read()}
returns the number of expirations with the host’s endianness, which may be
converted to an @ref{19c,,int} by @code{int.from_bytes(x, byteorder=sys.byteorder)}.

@ref{fa6,,select()} and @ref{3119,,poll()} can be used to wait until
timer expires and the file descriptor is readable.

`clockid' must be a valid @ref{311d,,clock ID},
as defined in the @ref{f4,,time} module:


@itemize -

@item 
@ref{8ab,,time.CLOCK_REALTIME}

@item 
@ref{8aa,,time.CLOCK_MONOTONIC}

@item 
@ref{d8d,,time.CLOCK_BOOTTIME} (Since Linux 3.15 for timerfd_create)
@end itemize

If `clockid' is @ref{8ab,,time.CLOCK_REALTIME}, a settable system-wide
real-time clock is used. If system clock is changed, timer setting need
to be updated. To cancel timer when system clock is changed, see
@ref{528,,TFD_TIMER_CANCEL_ON_SET}.

If `clockid' is @ref{8aa,,time.CLOCK_MONOTONIC}, a non-settable monotonically
increasing clock is used. Even if the system clock is changed, the timer
setting will not be affected.

If `clockid' is @ref{d8d,,time.CLOCK_BOOTTIME}, same as @ref{8aa,,time.CLOCK_MONOTONIC}
except it includes any time that the system is suspended.

The file descriptor’s behaviour can be modified by specifying a `flags' value.
Any of the following variables may be used, combined using bitwise OR
(the @code{|} operator):


@itemize -

@item 
@ref{525,,TFD_NONBLOCK}

@item 
@ref{526,,TFD_CLOEXEC}
@end itemize

If @ref{525,,TFD_NONBLOCK} is not set as a flag, @ref{f9b,,read()} blocks until
the timer expires. If it is set as a flag, @code{read()} doesn’t block, but
If there hasn’t been an expiration since the last call to read,
@code{read()} raises @ref{2c2,,OSError} with @code{errno} is set to
@ref{2746,,errno.EAGAIN}.

@ref{526,,TFD_CLOEXEC} is always set by Python automatically.

The file descriptor must be closed with @ref{d71,,os.close()} when it is no
longer needed, or else the file descriptor will be leaked.


@subsubheading See also


The @code{timerfd_create(2)@footnote{https://manpages.debian.org/timerfd_create(2)}} man page.


@ref{2181,,Availability}: Linux >= 2.6.27 with glibc >= 2.8


Added in version 3.13.

@end deffn

@geindex timerfd_settime() (in module os)
@anchor{library/os os timerfd_settime}@anchor{521}
@deffn {Function} os.timerfd_settime (fd, /, *, flags=flags, initial=0.0, interval=0.0)

Alter a timer file descriptor’s internal timer.
This function operates the same interval timer as @ref{522,,timerfd_settime_ns()}.

`fd' must be a valid timer file descriptor.

The timer’s behaviour can be modified by specifying a `flags' value.
Any of the following variables may be used, combined using bitwise OR
(the @code{|} operator):


@itemize -

@item 
@ref{527,,TFD_TIMER_ABSTIME}

@item 
@ref{528,,TFD_TIMER_CANCEL_ON_SET}
@end itemize

The timer is disabled by setting `initial' to zero (@code{0}).
If `initial' is equal to or greater than zero, the timer is enabled.
If `initial' is less than zero, it raises an @ref{2c2,,OSError} exception
with @code{errno} set to @ref{1e14,,errno.EINVAL}

By default the timer will fire when `initial' seconds have elapsed.
(If `initial' is zero, timer will fire immediately.)

However, if the @ref{527,,TFD_TIMER_ABSTIME} flag is set,
the timer will fire when the timer’s clock
(set by `clockid' in @ref{520,,timerfd_create()}) reaches `initial' seconds.

The timer’s interval is set by the `interval' @ref{197,,float}.
If `interval' is zero, the timer only fires once, on the initial expiration.
If `interval' is greater than zero, the timer fires every time `interval'
seconds have elapsed since the previous expiration.
If `interval' is less than zero, it raises @ref{2c2,,OSError} with @code{errno}
set to @ref{1e14,,errno.EINVAL}

If the @ref{528,,TFD_TIMER_CANCEL_ON_SET} flag is set along with
@ref{527,,TFD_TIMER_ABSTIME} and the clock for this timer is
@ref{8ab,,time.CLOCK_REALTIME}, the timer is marked as cancelable if the
real-time clock is changed discontinuously. Reading the descriptor is
aborted with the error ECANCELED.

Linux manages system clock as UTC. A daylight-savings time transition is
done by changing time offset only and doesn’t cause discontinuous system
clock change.

Discontinuous system clock change will be caused by the following events:


@itemize -

@item 
@code{settimeofday}

@item 
@code{clock_settime}

@item 
set the system date and time by @code{date} command
@end itemize

Return a two-item tuple of (@code{next_expiration}, @code{interval}) from
the previous timer state, before this function executed.


@subsubheading See also


@code{timerfd_create(2)@footnote{https://manpages.debian.org/timerfd_create(2)}}, @code{timerfd_settime(2)@footnote{https://manpages.debian.org/timerfd_settime(2)}},
@code{settimeofday(2)@footnote{https://manpages.debian.org/settimeofday(2)}}, @code{clock_settime(2)@footnote{https://manpages.debian.org/clock_settime(2)}},
and @code{date(1)@footnote{https://manpages.debian.org/date(1)}}.


@ref{2181,,Availability}: Linux >= 2.6.27 with glibc >= 2.8


Added in version 3.13.

@end deffn

@geindex timerfd_settime_ns() (in module os)
@anchor{library/os os timerfd_settime_ns}@anchor{522}
@deffn {Function} os.timerfd_settime_ns (fd, /, *, flags=0, initial=0, interval=0)

Similar to @ref{521,,timerfd_settime()}, but use time as nanoseconds.
This function operates the same interval timer as @code{timerfd_settime()}.

@ref{2181,,Availability}: Linux >= 2.6.27 with glibc >= 2.8


Added in version 3.13.

@end deffn

@geindex timerfd_gettime() (in module os)
@anchor{library/os os timerfd_gettime}@anchor{523}
@deffn {Function} os.timerfd_gettime (fd, /)

Return a two-item tuple of floats (@code{next_expiration}, @code{interval}).

@code{next_expiration} denotes the relative time until the timer next fires,
regardless of if the @ref{527,,TFD_TIMER_ABSTIME} flag is set.

@code{interval} denotes the timer’s interval.
If zero, the timer will only fire once, after @code{next_expiration} seconds
have elapsed.


@subsubheading See also


@code{timerfd_gettime(2)@footnote{https://manpages.debian.org/timerfd_gettime(2)}}


@ref{2181,,Availability}: Linux >= 2.6.27 with glibc >= 2.8


Added in version 3.13.

@end deffn

@geindex timerfd_gettime_ns() (in module os)
@anchor{library/os os timerfd_gettime_ns}@anchor{524}
@deffn {Function} os.timerfd_gettime_ns (fd, /)

Similar to @ref{523,,timerfd_gettime()}, but return time as nanoseconds.

@ref{2181,,Availability}: Linux >= 2.6.27 with glibc >= 2.8


Added in version 3.13.

@end deffn

@geindex TFD_NONBLOCK (in module os)
@anchor{library/os os TFD_NONBLOCK}@anchor{525}
@deffn {Data} os.TFD_NONBLOCK

A flag for the @ref{520,,timerfd_create()} function,
which sets the @ref{1041,,O_NONBLOCK} status flag for the new timer file
descriptor. If @ref{525,,TFD_NONBLOCK} is not set as a flag, @ref{f9b,,read()} blocks.

@ref{2181,,Availability}: Linux >= 2.6.27 with glibc >= 2.8


Added in version 3.13.

@end deffn

@geindex TFD_CLOEXEC (in module os)
@anchor{library/os os TFD_CLOEXEC}@anchor{526}
@deffn {Data} os.TFD_CLOEXEC

A flag for the @ref{520,,timerfd_create()} function,
If @ref{526,,TFD_CLOEXEC} is set as a flag, set close-on-exec flag for new file
descriptor.

@ref{2181,,Availability}: Linux >= 2.6.27 with glibc >= 2.8


Added in version 3.13.

@end deffn

@geindex TFD_TIMER_ABSTIME (in module os)
@anchor{library/os os TFD_TIMER_ABSTIME}@anchor{527}
@deffn {Data} os.TFD_TIMER_ABSTIME

A flag for the @ref{521,,timerfd_settime()} and @ref{522,,timerfd_settime_ns()} functions.
If this flag is set, `initial' is interpreted as an absolute value on the
timer’s clock (in UTC seconds or nanoseconds since the Unix Epoch).

@ref{2181,,Availability}: Linux >= 2.6.27 with glibc >= 2.8


Added in version 3.13.

@end deffn

@geindex TFD_TIMER_CANCEL_ON_SET (in module os)
@anchor{library/os os TFD_TIMER_CANCEL_ON_SET}@anchor{528}
@deffn {Data} os.TFD_TIMER_CANCEL_ON_SET

A flag for the @ref{521,,timerfd_settime()} and @ref{522,,timerfd_settime_ns()}
functions along with @ref{527,,TFD_TIMER_ABSTIME}.
The timer is cancelled when the time of the underlying clock changes
discontinuously.

@ref{2181,,Availability}: Linux >= 2.6.27 with glibc >= 2.8


Added in version 3.13.

@end deffn

@node Linux extended attributes,,Timer File Descriptors,Files and Directories
@anchor{library/os linux-extended-attributes}@anchor{311e}
@subsubsection Linux extended attributes



Added in version 3.3.


These functions are all available on Linux only.

@geindex getxattr() (in module os)
@anchor{library/os os getxattr}@anchor{1310}
@deffn {Function} os.getxattr (path, attribute, *, follow_symlinks=True)

Return the value of the extended filesystem attribute `attribute' for
`path'. `attribute' can be bytes or str (directly or indirectly through the
@ref{e51,,PathLike} interface). If it is str, it is encoded with the filesystem
encoding.

This function can support @ref{d59,,specifying a file descriptor} and
@ref{12f7,,not following symlinks}.

Raises an @ref{1cb1,,auditing event} @code{os.getxattr} with arguments @code{path}, @code{attribute}.


Changed in version 3.6: Accepts a @ref{5a1,,path-like object} for `path' and `attribute'.

@end deffn

@geindex listxattr() (in module os)
@anchor{library/os os listxattr}@anchor{1311}
@deffn {Function} os.listxattr (path=None, *, follow_symlinks=True)

Return a list of the extended filesystem attributes on `path'.  The
attributes in the list are represented as strings decoded with the filesystem
encoding.  If `path' is @code{None}, @code{listxattr()} will examine the current
directory.

This function can support @ref{d59,,specifying a file descriptor} and
@ref{12f7,,not following symlinks}.

Raises an @ref{1cb1,,auditing event} @code{os.listxattr} with argument @code{path}.


Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.

@end deffn

@geindex removexattr() (in module os)
@anchor{library/os os removexattr}@anchor{1312}
@deffn {Function} os.removexattr (path, attribute, *, follow_symlinks=True)

Removes the extended filesystem attribute `attribute' from `path'.
`attribute' should be bytes or str (directly or indirectly through the
@ref{e51,,PathLike} interface). If it is a string, it is encoded
with the @ref{75e,,filesystem encoding and error handler}.

This function can support @ref{d59,,specifying a file descriptor} and
@ref{12f7,,not following symlinks}.

Raises an @ref{1cb1,,auditing event} @code{os.removexattr} with arguments @code{path}, @code{attribute}.


Changed in version 3.6: Accepts a @ref{5a1,,path-like object} for `path' and `attribute'.

@end deffn

@geindex setxattr() (in module os)
@anchor{library/os os setxattr}@anchor{1313}
@deffn {Function} os.setxattr (path, attribute, value, flags=0, *, follow_symlinks=True)

Set the extended filesystem attribute `attribute' on `path' to `value'.
`attribute' must be a bytes or str with no embedded NULs (directly or
indirectly through the @ref{e51,,PathLike} interface). If it is a str,
it is encoded with the @ref{75e,,filesystem encoding and error handler}.  `flags' may be
@ref{311f,,XATTR_REPLACE} or @ref{3120,,XATTR_CREATE}. If @code{XATTR_REPLACE} is
given and the attribute does not exist, @code{ENODATA} will be raised.
If @code{XATTR_CREATE} is given and the attribute already exists, the
attribute will not be created and @code{EEXISTS} will be raised.

This function can support @ref{d59,,specifying a file descriptor} and
@ref{12f7,,not following symlinks}.

@cartouche
@quotation Note 
A bug in Linux kernel versions less than 2.6.39 caused the flags argument
to be ignored on some filesystems.
@end quotation
@end cartouche

Raises an @ref{1cb1,,auditing event} @code{os.setxattr} with arguments @code{path}, @code{attribute}, @code{value}, @code{flags}.


Changed in version 3.6: Accepts a @ref{5a1,,path-like object} for `path' and `attribute'.

@end deffn

@geindex XATTR_SIZE_MAX (in module os)
@anchor{library/os os XATTR_SIZE_MAX}@anchor{3121}
@deffn {Data} os.XATTR_SIZE_MAX

The maximum size the value of an extended attribute can be. Currently, this
is 64 KiB on Linux.
@end deffn

@geindex XATTR_CREATE (in module os)
@anchor{library/os os XATTR_CREATE}@anchor{3120}
@deffn {Data} os.XATTR_CREATE

This is a possible value for the flags argument in @ref{1313,,setxattr()}. It
indicates the operation must create an attribute.
@end deffn

@geindex XATTR_REPLACE (in module os)
@anchor{library/os os XATTR_REPLACE}@anchor{311f}
@deffn {Data} os.XATTR_REPLACE

This is a possible value for the flags argument in @ref{1313,,setxattr()}. It
indicates the operation must replace an existing attribute.
@end deffn

@node Process Management,Interface to the scheduler,Files and Directories,os — Miscellaneous operating system interfaces
@anchor{library/os os-process}@anchor{3122}@anchor{library/os process-management}@anchor{3123}
@subsubsection Process Management


These functions may be used to create and manage processes.

The various @ref{3124,,exec*} functions take a list of arguments for the new
program loaded into the process.  In each case, the first of these arguments is
passed to the new program as its own name rather than as an argument a user may
have typed on a command line.  For the C programmer, this is the @code{argv[0]}
passed to a program’s @code{main()}.  For example, @code{os.execv('/bin/echo',
['foo', 'bar'])} will only print @code{bar} on standard output; @code{foo} will seem
to be ignored.

@geindex abort() (in module os)
@anchor{library/os os abort}@anchor{3125}
@deffn {Function} os.abort ()

Generate a @code{SIGABRT} signal to the current process.  On Unix, the default
behavior is to produce a core dump; on Windows, the process immediately returns
an exit code of @code{3}.  Be aware that calling this function will not call the
Python signal handler registered for @code{SIGABRT} with
@ref{1340,,signal.signal()}.
@end deffn

@geindex add_dll_directory() (in module os)
@anchor{library/os os add_dll_directory}@anchor{be3}
@deffn {Function} os.add_dll_directory (path)

Add a path to the DLL search path.

This search path is used when resolving dependencies for imported
extension modules (the module itself is resolved through
@ref{3e2,,sys.path}), and also by @ref{2e,,ctypes}.

Remove the directory by calling `close()' on the returned object
or using it in a @ref{187,,with} statement.

See the Microsoft documentation@footnote{https://msdn.microsoft.com/44228cf2-6306-466c-8f16-f513cd3ba8b5}
for more information about how DLLs are loaded.

Raises an @ref{1cb1,,auditing event} @code{os.add_dll_directory} with argument @code{path}.

@ref{2181,,Availability}: Windows.


Added in version 3.8: Previous versions of CPython would resolve DLLs using the default
behavior for the current process. This led to inconsistencies,
such as only sometimes searching 
@geindex PATH
@geindex environment variable; PATH
@code{PATH} or the current
working directory, and OS functions such as @code{AddDllDirectory}
having no effect.

In 3.8, the two primary ways DLLs are loaded now explicitly
override the process-wide behavior to ensure consistency. See the
@ref{c9b,,porting notes} for information on
updating libraries.

@end deffn

@geindex execl() (in module os)
@geindex execle() (in module os)
@geindex execlp() (in module os)
@geindex execlpe() (in module os)
@geindex execv() (in module os)
@geindex execve() (in module os)
@geindex execvp() (in module os)
@geindex execvpe() (in module os)
@anchor{library/os os execl}@anchor{3124}
@deffn {Function} os.execl (path, arg0, arg1, ...)
@anchor{library/os os execle}@anchor{3126}
@deffnx {Function} os.execle (path, arg0, arg1, ..., env)
@anchor{library/os os execlp}@anchor{3127}
@deffnx {Function} os.execlp (file, arg0, arg1, ...)
@anchor{library/os os execlpe}@anchor{3128}
@deffnx {Function} os.execlpe (file, arg0, arg1, ..., env)
@anchor{library/os os execv}@anchor{3089}
@deffnx {Function} os.execv (path, args)
@anchor{library/os os execve}@anchor{1305}
@deffnx {Function} os.execve (path, args, env)
@anchor{library/os os execvp}@anchor{3129}
@deffnx {Function} os.execvp (file, args)
@anchor{library/os os execvpe}@anchor{312a}
@deffnx {Function} os.execvpe (file, args, env)

These functions all execute a new program, replacing the current process; they
do not return.  On Unix, the new executable is loaded into the current process,
and will have the same process id as the caller.  Errors will be reported as
@ref{2c2,,OSError} exceptions.

The current process is replaced immediately. Open file objects and
descriptors are not flushed, so if there may be data buffered
on these open files, you should flush them using
@ref{2d57,,flush()} or @ref{f94,,os.fsync()} before calling an
@code{exec*} function.

The “l” and “v” variants of the @code{exec*} functions differ in how
command-line arguments are passed.  The “l” variants are perhaps the easiest
to work with if the number of parameters is fixed when the code is written; the
individual parameters simply become additional parameters to the @code{execl*()}
functions.  The “v” variants are good when the number of parameters is
variable, with the arguments being passed in a list or tuple as the `args'
parameter.  In either case, the arguments to the child process should start with
the name of the command being run, but this is not enforced.

The variants which include a “p” near the end (@code{execlp()},
@code{execlpe()}, @code{execvp()}, and @code{execvpe()}) will use the
@geindex PATH
@geindex environment variable; PATH
@code{PATH} environment variable to locate the program `file'.  When the
environment is being replaced (using one of the @code{exec*e} variants,
discussed in the next paragraph), the new environment is used as the source of
the 
@geindex PATH
@geindex environment variable; PATH
@code{PATH} variable. The other variants, @code{execl()}, @code{execle()},
@code{execv()}, and @code{execve()}, will not use the 
@geindex PATH
@geindex environment variable; PATH
@code{PATH} variable to
locate the executable; `path' must contain an appropriate absolute or relative
path. Relative paths must include at least one slash, even on Windows, as
plain names will not be resolved.

For @code{execle()}, @code{execlpe()}, @code{execve()}, and @code{execvpe()} (note
that these all end in “e”), the `env' parameter must be a mapping which is
used to define the environment variables for the new process (these are used
instead of the current process’ environment); the functions @code{execl()},
@code{execlp()}, @code{execv()}, and @code{execvp()} all cause the new process to
inherit the environment of the current process.

For @code{execve()} on some platforms, `path' may also be specified as an open
file descriptor.  This functionality may not be supported on your platform;
you can check whether or not it is available using @ref{1309,,os.supports_fd}.
If it is unavailable, using it will raise a @ref{369,,NotImplementedError}.

Raises an @ref{1cb1,,auditing event} @code{os.exec} with arguments @code{path}, @code{args}, @code{env}.

@ref{2181,,Availability}: Unix, Windows, not WASI, not Android, not iOS.


Changed in version 3.3: Added support for specifying `path' as an open file descriptor
for @code{execve()}.



Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.

@end deffn

@geindex _exit() (in module os)
@anchor{library/os os _exit}@anchor{2742}
@deffn {Function} os._exit (n)

Exit the process with status `n', without calling cleanup handlers, flushing
stdio buffers, etc.

@cartouche
@quotation Note 
The standard way to exit is @ref{279,,sys.exit(n)}.  @code{_exit()} should
normally only be used in the child process after a @ref{4b6,,fork()}.
@end quotation
@end cartouche
@end deffn

The following exit codes are defined and can be used with @ref{2742,,_exit()},
although they are not required.  These are typically used for system programs
written in Python, such as a mail server’s external command delivery program.

@cartouche
@quotation Note 
Some of these may not be available on all Unix platforms, since there is some
variation.  These constants are defined where they are defined by the underlying
platform.
@end quotation
@end cartouche

@geindex EX_OK (in module os)
@anchor{library/os os EX_OK}@anchor{312b}
@deffn {Data} os.EX_OK

Exit code that means no error occurred. May be taken from the defined value of
@code{EXIT_SUCCESS} on some platforms. Generally has a value of zero.

@ref{2181,,Availability}: Unix, Windows.
@end deffn

@geindex EX_USAGE (in module os)
@anchor{library/os os EX_USAGE}@anchor{312c}
@deffn {Data} os.EX_USAGE

Exit code that means the command was used incorrectly, such as when the wrong
number of arguments are given.

@ref{2181,,Availability}: Unix, not WASI.
@end deffn

@geindex EX_DATAERR (in module os)
@anchor{library/os os EX_DATAERR}@anchor{312d}
@deffn {Data} os.EX_DATAERR

Exit code that means the input data was incorrect.

@ref{2181,,Availability}: Unix, not WASI.
@end deffn

@geindex EX_NOINPUT (in module os)
@anchor{library/os os EX_NOINPUT}@anchor{312e}
@deffn {Data} os.EX_NOINPUT

Exit code that means an input file did not exist or was not readable.

@ref{2181,,Availability}: Unix, not WASI.
@end deffn

@geindex EX_NOUSER (in module os)
@anchor{library/os os EX_NOUSER}@anchor{312f}
@deffn {Data} os.EX_NOUSER

Exit code that means a specified user did not exist.

@ref{2181,,Availability}: Unix, not WASI.
@end deffn

@geindex EX_NOHOST (in module os)
@anchor{library/os os EX_NOHOST}@anchor{3130}
@deffn {Data} os.EX_NOHOST

Exit code that means a specified host did not exist.

@ref{2181,,Availability}: Unix, not WASI.
@end deffn

@geindex EX_UNAVAILABLE (in module os)
@anchor{library/os os EX_UNAVAILABLE}@anchor{3131}
@deffn {Data} os.EX_UNAVAILABLE

Exit code that means that a required service is unavailable.

@ref{2181,,Availability}: Unix, not WASI.
@end deffn

@geindex EX_SOFTWARE (in module os)
@anchor{library/os os EX_SOFTWARE}@anchor{3132}
@deffn {Data} os.EX_SOFTWARE

Exit code that means an internal software error was detected.

@ref{2181,,Availability}: Unix, not WASI.
@end deffn

@geindex EX_OSERR (in module os)
@anchor{library/os os EX_OSERR}@anchor{3133}
@deffn {Data} os.EX_OSERR

Exit code that means an operating system error was detected, such as the
inability to fork or create a pipe.

@ref{2181,,Availability}: Unix, not WASI.
@end deffn

@geindex EX_OSFILE (in module os)
@anchor{library/os os EX_OSFILE}@anchor{3134}
@deffn {Data} os.EX_OSFILE

Exit code that means some system file did not exist, could not be opened, or had
some other kind of error.

@ref{2181,,Availability}: Unix, not WASI.
@end deffn

@geindex EX_CANTCREAT (in module os)
@anchor{library/os os EX_CANTCREAT}@anchor{3135}
@deffn {Data} os.EX_CANTCREAT

Exit code that means a user specified output file could not be created.

@ref{2181,,Availability}: Unix, not WASI.
@end deffn

@geindex EX_IOERR (in module os)
@anchor{library/os os EX_IOERR}@anchor{3136}
@deffn {Data} os.EX_IOERR

Exit code that means that an error occurred while doing I/O on some file.

@ref{2181,,Availability}: Unix, not WASI.
@end deffn

@geindex EX_TEMPFAIL (in module os)
@anchor{library/os os EX_TEMPFAIL}@anchor{3137}
@deffn {Data} os.EX_TEMPFAIL

Exit code that means a temporary failure occurred.  This indicates something
that may not really be an error, such as a network connection that couldn’t be
made during a retryable operation.

@ref{2181,,Availability}: Unix, not WASI.
@end deffn

@geindex EX_PROTOCOL (in module os)
@anchor{library/os os EX_PROTOCOL}@anchor{3138}
@deffn {Data} os.EX_PROTOCOL

Exit code that means that a protocol exchange was illegal, invalid, or not
understood.

@ref{2181,,Availability}: Unix, not WASI.
@end deffn

@geindex EX_NOPERM (in module os)
@anchor{library/os os EX_NOPERM}@anchor{3139}
@deffn {Data} os.EX_NOPERM

Exit code that means that there were insufficient permissions to perform the
operation (but not intended for file system problems).

@ref{2181,,Availability}: Unix, not WASI.
@end deffn

@geindex EX_CONFIG (in module os)
@anchor{library/os os EX_CONFIG}@anchor{313a}
@deffn {Data} os.EX_CONFIG

Exit code that means that some kind of configuration error occurred.

@ref{2181,,Availability}: Unix, not WASI.
@end deffn

@geindex EX_NOTFOUND (in module os)
@anchor{library/os os EX_NOTFOUND}@anchor{313b}
@deffn {Data} os.EX_NOTFOUND

Exit code that means something like “an entry was not found”.

@ref{2181,,Availability}: Unix, not WASI.
@end deffn

@geindex fork() (in module os)
@anchor{library/os os fork}@anchor{4b6}
@deffn {Function} os.fork ()

Fork a child process.  Return @code{0} in the child and the child’s process id in the
parent.  If an error occurs @ref{2c2,,OSError} is raised.

Note that some platforms including FreeBSD <= 6.3 and Cygwin have
known issues when using @code{fork()} from a thread.

Raises an @ref{1cb1,,auditing event} @code{os.fork} with no arguments.

@cartouche
@quotation Warning 
If you use TLS sockets in an application calling @code{fork()}, see
the warning in the @ref{d5,,ssl} documentation.
@end quotation
@end cartouche

@cartouche
@quotation Warning 
On macOS the use of this function is unsafe when mixed with using
higher-level system APIs, and that includes using @ref{112,,urllib.request}.
@end quotation
@end cartouche


Changed in version 3.8: Calling @code{fork()} in a subinterpreter is no longer supported
(@ref{246,,RuntimeError} is raised).



Changed in version 3.12: If Python is able to detect that your process has multiple
threads, @code{os.fork()} now raises a @ref{1a4,,DeprecationWarning}.

We chose to surface this as a warning, when detectable, to better
inform developers of a design problem that the POSIX platform
specifically notes as not supported. Even in code that
`appears' to work, it has never been safe to mix threading with
@code{os.fork()} on POSIX platforms. The CPython runtime itself has
always made API calls that are not safe for use in the child
process when threads existed in the parent (such as @code{malloc} and
@code{free}).

Users of macOS or users of libc or malloc implementations other
than those typically found in glibc to date are among those
already more likely to experience deadlocks running such code.

See this discussion on fork being incompatible with threads@footnote{https://discuss.python.org/t/33555}
for technical details of why we’re surfacing this longstanding
platform compatibility problem to developers.


@ref{2181,,Availability}: POSIX, not WASI, not Android, not iOS.
@end deffn

@geindex forkpty() (in module os)
@anchor{library/os os forkpty}@anchor{4b7}
@deffn {Function} os.forkpty ()

Fork a child process, using a new pseudo-terminal as the child’s controlling
terminal. Return a pair of @code{(pid, fd)}, where `pid' is @code{0} in the child, the
new child’s process id in the parent, and `fd' is the file descriptor of the
master end of the pseudo-terminal.  For a more portable approach, use the
@ref{b6,,pty} module.  If an error occurs @ref{2c2,,OSError} is raised.

Raises an @ref{1cb1,,auditing event} @code{os.forkpty} with no arguments.

@cartouche
@quotation Warning 
On macOS the use of this function is unsafe when mixed with using
higher-level system APIs, and that includes using @ref{112,,urllib.request}.
@end quotation
@end cartouche


Changed in version 3.8: Calling @code{forkpty()} in a subinterpreter is no longer supported
(@ref{246,,RuntimeError} is raised).



Changed in version 3.12: If Python is able to detect that your process has multiple
threads, this now raises a @ref{1a4,,DeprecationWarning}. See the
longer explanation on @ref{4b6,,os.fork()}.


@ref{2181,,Availability}: Unix, not WASI, not Android, not iOS.
@end deffn

@geindex kill() (in module os)
@anchor{library/os os kill}@anchor{1573}
@deffn {Function} os.kill (pid, sig, /)

@geindex process; killing
@geindex process; signalling

Send signal `sig' to the process `pid'.  Constants for the specific signals
available on the host platform are defined in the @ref{cb,,signal} module.

Windows: The @ref{1574,,signal.CTRL_C_EVENT} and
@ref{1575,,signal.CTRL_BREAK_EVENT} signals are special signals which can
only be sent to console processes which share a common console window,
e.g., some subprocesses. Any other value for `sig' will cause the process
to be unconditionally killed by the TerminateProcess API, and the exit code
will be set to `sig'.

See also @ref{133d,,signal.pthread_kill()}.

Raises an @ref{1cb1,,auditing event} @code{os.kill} with arguments @code{pid}, @code{sig}.

@ref{2181,,Availability}: Unix, Windows, not WASI, not iOS.


Changed in version 3.2: Added Windows support.

@end deffn

@geindex killpg() (in module os)
@anchor{library/os os killpg}@anchor{1dfd}
@deffn {Function} os.killpg (pgid, sig, /)

@geindex process; killing
@geindex process; signalling

Send the signal `sig' to the process group `pgid'.

Raises an @ref{1cb1,,auditing event} @code{os.killpg} with arguments @code{pgid}, @code{sig}.

@ref{2181,,Availability}: Unix, not WASI, not iOS.
@end deffn

@geindex nice() (in module os)
@anchor{library/os os nice}@anchor{130d}
@deffn {Function} os.nice (increment, /)

Add `increment' to the process’s “niceness”.  Return the new niceness.

@ref{2181,,Availability}: Unix, not WASI.
@end deffn

@geindex pidfd_open() (in module os)
@anchor{library/os os pidfd_open}@anchor{6a5}
@deffn {Function} os.pidfd_open (pid, flags=0)

Return a file descriptor referring to the process `pid' with `flags' set.
This descriptor can be used to perform process management without races
and signals.

See the @code{pidfd_open(2)@footnote{https://manpages.debian.org/pidfd_open(2)}} man page for more details.

@ref{2181,,Availability}: Linux >= 5.3, Android >= @ref{d89,,build-time} API level 31


Added in version 3.9.


@geindex PIDFD_NONBLOCK (in module os)
@anchor{library/os os PIDFD_NONBLOCK}@anchor{6c3}
@deffn {Data} os.PIDFD_NONBLOCK

This flag indicates that the file descriptor will be non-blocking.
If the process referred to by the file descriptor has not yet terminated,
then an attempt to wait on the file descriptor using @code{waitid(2)@footnote{https://manpages.debian.org/waitid(2)}}
will immediately return the error @ref{2746,,EAGAIN} rather than blocking.
@end deffn

@ref{2181,,Availability}: Linux >= 5.10


Added in version 3.12.

@end deffn

@geindex plock() (in module os)
@anchor{library/os os plock}@anchor{313c}
@deffn {Function} os.plock (op, /)

Lock program segments into memory.  The value of `op' (defined in
@code{<sys/lock.h>}) determines which segments are locked.

@ref{2181,,Availability}: Unix, not WASI, not macOS, not iOS.
@end deffn

@geindex popen() (in module os)
@anchor{library/os os popen}@anchor{31c}
@deffn {Function} os.popen (cmd, mode='r', buffering=-1)

Open a pipe to or from command `cmd'.
The return value is an open file object
connected to the pipe, which can be read or written depending on whether `mode'
is @code{'r'} (default) or @code{'w'}.
The `buffering' argument have the same meaning as
the corresponding argument to the built-in @ref{318,,open()} function. The
returned file object reads or writes text strings rather than bytes.

The @code{close} method returns @ref{887,,None} if the subprocess exited
successfully, or the subprocess’s return code if there was an
error. On POSIX systems, if the return code is positive it
represents the return value of the process left-shifted by one
byte.  If the return code is negative, the process was terminated
by the signal given by the negated value of the return code.  (For
example, the return value might be @code{- signal.SIGKILL} if the
subprocess was killed.)  On Windows systems, the return value
contains the signed integer return code from the child process.

On Unix, @ref{b1d,,waitstatus_to_exitcode()} can be used to convert the @code{close}
method result (exit status) into an exit code if it is not @code{None}. On
Windows, the @code{close} method result is directly the exit code
(or @code{None}).

This is implemented using @ref{4b8,,subprocess.Popen}; see that class’s
documentation for more powerful ways to manage and communicate with
subprocesses.

@ref{2181,,Availability}: not WASI, not Android, not iOS.

@cartouche
@quotation Note 
The @ref{868,,Python UTF-8 Mode} affects encodings used
for `cmd' and pipe contents.

@code{popen()} is a simple wrapper around @ref{4b8,,subprocess.Popen}.
Use @code{subprocess.Popen} or @ref{d85,,subprocess.run()} to
control options like encodings.
@end quotation
@end cartouche


@ref{23f,,Soft deprecated} since version 3.14: The @ref{dc,,subprocess} module is recommended instead.

@end deffn

@geindex posix_spawn() (in module os)
@anchor{library/os os posix_spawn}@anchor{52f}
@deffn {Function} os.posix_spawn (path, argv, env, *, file_actions=None, setpgroup=None, resetids=False, setsid=False, setsigmask=(), setsigdef=(), scheduler=None)

Wraps the @code{posix_spawn()} C library API for use from Python.

Most users should use @ref{d85,,subprocess.run()} instead of @code{posix_spawn()}.

The positional-only arguments `path', `args', and `env' are similar to
@ref{1305,,execve()}. `env' is allowed to be @code{None}, in which case current
process’ environment is used.

The `path' parameter is the path to the executable file.  The `path' should
contain a directory.  Use @ref{17b6,,posix_spawnp()} to pass an executable file
without directory.

The `file_actions' argument may be a sequence of tuples describing actions
to take on specific file descriptors in the child process between the C
library implementation’s @code{fork()} and @code{exec()} steps.
The first item in each tuple must be one of the three type indicator
listed below describing the remaining tuple elements:

@geindex POSIX_SPAWN_OPEN (in module os)
@anchor{library/os os POSIX_SPAWN_OPEN}@anchor{313d}
@deffn {Data} os.POSIX_SPAWN_OPEN

(@code{os.POSIX_SPAWN_OPEN}, `fd', `path', `flags', `mode')

Performs @code{os.dup2(os.open(path, flags, mode), fd)}.
@end deffn

@geindex POSIX_SPAWN_CLOSE (in module os)
@anchor{library/os os POSIX_SPAWN_CLOSE}@anchor{313e}
@deffn {Data} os.POSIX_SPAWN_CLOSE

(@code{os.POSIX_SPAWN_CLOSE}, `fd')

Performs @code{os.close(fd)}.
@end deffn

@geindex POSIX_SPAWN_DUP2 (in module os)
@anchor{library/os os POSIX_SPAWN_DUP2}@anchor{313f}
@deffn {Data} os.POSIX_SPAWN_DUP2

(@code{os.POSIX_SPAWN_DUP2}, `fd', `new_fd')

Performs @code{os.dup2(fd, new_fd)}.
@end deffn

@geindex POSIX_SPAWN_CLOSEFROM (in module os)
@anchor{library/os os POSIX_SPAWN_CLOSEFROM}@anchor{530}
@deffn {Data} os.POSIX_SPAWN_CLOSEFROM

(@code{os.POSIX_SPAWN_CLOSEFROM}, `fd')

Performs @code{os.closerange(fd, INF)}.
@end deffn

These tuples correspond to the C library
@code{posix_spawn_file_actions_addopen()},
@code{posix_spawn_file_actions_addclose()},
@code{posix_spawn_file_actions_adddup2()}, and
@code{posix_spawn_file_actions_addclosefrom_np()} API calls used to prepare
for the @code{posix_spawn()} call itself.

The `setpgroup' argument will set the process group of the child to the value
specified. If the value specified is 0, the child’s process group ID will be
made the same as its process ID. If the value of `setpgroup' is not set, the
child will inherit the parent’s process group ID. This argument corresponds
to the C library @code{POSIX_SPAWN_SETPGROUP} flag.

If the `resetids' argument is @code{True} it will reset the effective UID and
GID of the child to the real UID and GID of the parent process. If the
argument is @code{False}, then the child retains the effective UID and GID of
the parent. In either case, if the set-user-ID and set-group-ID permission
bits are enabled on the executable file, their effect will override the
setting of the effective UID and GID. This argument corresponds to the C
library @code{POSIX_SPAWN_RESETIDS} flag.

If the `setsid' argument is @code{True}, it will create a new session ID
for @code{posix_spawn}. `setsid' requires @code{POSIX_SPAWN_SETSID}
or @code{POSIX_SPAWN_SETSID_NP} flag. Otherwise, @ref{369,,NotImplementedError}
is raised.

The `setsigmask' argument will set the signal mask to the signal set
specified. If the parameter is not used, then the child inherits the
parent’s signal mask. This argument corresponds to the C library
@code{POSIX_SPAWN_SETSIGMASK} flag.

The `sigdef' argument will reset the disposition of all signals in the set
specified. This argument corresponds to the C library
@code{POSIX_SPAWN_SETSIGDEF} flag.

The `scheduler' argument must be a tuple containing the (optional) scheduler
policy and an instance of @ref{1954,,sched_param} with the scheduler parameters.
A value of @code{None} in the place of the scheduler policy indicates that is
not being provided. This argument is a combination of the C library
@code{POSIX_SPAWN_SETSCHEDPARAM} and @code{POSIX_SPAWN_SETSCHEDULER}
flags.

Raises an @ref{1cb1,,auditing event} @code{os.posix_spawn} with arguments @code{path}, @code{argv}, @code{env}.


Added in version 3.8.



Changed in version 3.13: `env' parameter accepts @code{None}.
@code{os.POSIX_SPAWN_CLOSEFROM} is available on platforms where
@code{posix_spawn_file_actions_addclosefrom_np()} exists.


@ref{2181,,Availability}: Unix, not WASI, not Android, not iOS.
@end deffn

@geindex posix_spawnp() (in module os)
@anchor{library/os os posix_spawnp}@anchor{17b6}
@deffn {Function} os.posix_spawnp (path, argv, env, *, file_actions=None, setpgroup=None, resetids=False, setsid=False, setsigmask=(), setsigdef=(), scheduler=None)

Wraps the @code{posix_spawnp()} C library API for use from Python.

Similar to @ref{52f,,posix_spawn()} except that the system searches
for the `executable' file in the list of directories specified by the
@geindex PATH
@geindex environment variable; PATH
@code{PATH} environment variable (in the same way as for @code{execvp(3)}).

Raises an @ref{1cb1,,auditing event} @code{os.posix_spawn} with arguments @code{path}, @code{argv}, @code{env}.


Added in version 3.8.


@ref{2181,,Availability}: POSIX, not WASI, not Android, not iOS.

See @ref{52f,,posix_spawn()} documentation.
@end deffn

@geindex register_at_fork() (in module os)
@anchor{library/os os register_at_fork}@anchor{353}
@deffn {Function} os.register_at_fork (*, before=None, after_in_parent=None, after_in_child=None)

Register callables to be executed when a new child process is forked
using @ref{4b6,,os.fork()} or similar process cloning APIs.
The parameters are optional and keyword-only.
Each specifies a different call point.


@itemize *

@item 
`before' is a function called before forking a child process.

@item 
`after_in_parent' is a function called from the parent process
after forking a child process.

@item 
`after_in_child' is a function called from the child process.
@end itemize

These calls are only made if control is expected to return to the
Python interpreter.  A typical @ref{dc,,subprocess} launch will not
trigger them as the child is not going to re-enter the interpreter.

Functions registered for execution before forking are called in
reverse registration order.  Functions registered for execution
after forking (either in the parent or in the child) are called
in registration order.

Note that @code{fork()} calls made by third-party C code may not
call those functions, unless it explicitly calls @ref{dbe,,PyOS_BeforeFork()},
@ref{dbf,,PyOS_AfterFork_Parent()} and @ref{42e,,PyOS_AfterFork_Child()}.

There is no way to unregister a function.

@ref{2181,,Availability}: Unix, not WASI, not Android, not iOS.


Added in version 3.7.

@end deffn

@geindex spawnl() (in module os)
@geindex spawnle() (in module os)
@geindex spawnlp() (in module os)
@geindex spawnlpe() (in module os)
@geindex spawnv() (in module os)
@geindex spawnve() (in module os)
@geindex spawnvp() (in module os)
@geindex spawnvpe() (in module os)
@anchor{library/os os spawnl}@anchor{31d}
@deffn {Function} os.spawnl (mode, path, ...)
@anchor{library/os os spawnle}@anchor{3140}
@deffnx {Function} os.spawnle (mode, path, ..., env)
@anchor{library/os os spawnlp}@anchor{3141}
@deffnx {Function} os.spawnlp (mode, file, ...)
@anchor{library/os os spawnlpe}@anchor{3142}
@deffnx {Function} os.spawnlpe (mode, file, ..., env)
@anchor{library/os os spawnv}@anchor{3143}
@deffnx {Function} os.spawnv (mode, path, args)
@anchor{library/os os spawnve}@anchor{3144}
@deffnx {Function} os.spawnve (mode, path, args, env)
@anchor{library/os os spawnvp}@anchor{3145}
@deffnx {Function} os.spawnvp (mode, file, args)
@anchor{library/os os spawnvpe}@anchor{3146}
@deffnx {Function} os.spawnvpe (mode, file, args, env)

Execute the program `path' in a new process.

(Note that the @ref{dc,,subprocess} module provides more powerful facilities for
spawning new processes and retrieving their results; using that module is
preferable to using these functions.  Check especially the
@ref{1394,,Replacing Older Functions with the subprocess Module} section.)

If `mode' is @ref{3147,,P_NOWAIT}, this function returns the process id of the new
process; if `mode' is @ref{3148,,P_WAIT}, returns the process’s exit code if it
exits normally, or @code{-signal}, where `signal' is the signal that killed the
process.  On Windows, the process id will actually be the process handle, so can
be used with the @ref{fa0,,waitpid()} function.

Note on VxWorks, this function doesn’t return @code{-signal} when the new process is
killed. Instead it raises OSError exception.

The “l” and “v” variants of the @code{spawn*} functions differ in how
command-line arguments are passed.  The “l” variants are perhaps the easiest
to work with if the number of parameters is fixed when the code is written; the
individual parameters simply become additional parameters to the
@code{spawnl*()} functions.  The “v” variants are good when the number of
parameters is variable, with the arguments being passed in a list or tuple as
the `args' parameter.  In either case, the arguments to the child process must
start with the name of the command being run.

The variants which include a second “p” near the end (@code{spawnlp()},
@code{spawnlpe()}, @code{spawnvp()}, and @code{spawnvpe()}) will use the
@geindex PATH
@geindex environment variable; PATH
@code{PATH} environment variable to locate the program `file'.  When the
environment is being replaced (using one of the @code{spawn*e} variants,
discussed in the next paragraph), the new environment is used as the source of
the 
@geindex PATH
@geindex environment variable; PATH
@code{PATH} variable.  The other variants, @code{spawnl()},
@code{spawnle()}, @code{spawnv()}, and @code{spawnve()}, will not use the
@geindex PATH
@geindex environment variable; PATH
@code{PATH} variable to locate the executable; `path' must contain an
appropriate absolute or relative path.

For @code{spawnle()}, @code{spawnlpe()}, @code{spawnve()}, and @code{spawnvpe()}
(note that these all end in “e”), the `env' parameter must be a mapping
which is used to define the environment variables for the new process (they are
used instead of the current process’ environment); the functions
@code{spawnl()}, @code{spawnlp()}, @code{spawnv()}, and @code{spawnvp()} all cause
the new process to inherit the environment of the current process.  Note that
keys and values in the `env' dictionary must be strings; invalid keys or
values will cause the function to fail, with a return value of @code{127}.

As an example, the following calls to @code{spawnlp()} and @code{spawnvpe()} are
equivalent:

@example
import os
os.spawnlp(os.P_WAIT, 'cp', 'cp', 'index.html', '/dev/null')

L = ['cp', 'index.html', '/dev/null']
os.spawnvpe(os.P_WAIT, 'cp', L, os.environ)
@end example

Raises an @ref{1cb1,,auditing event} @code{os.spawn} with arguments @code{mode}, @code{path}, @code{args}, @code{env}.

@ref{2181,,Availability}: Unix, Windows, not WASI, not Android, not iOS.

@code{spawnlp()}, @code{spawnlpe()}, @code{spawnvp()}
and @code{spawnvpe()} are not available on Windows.  @code{spawnle()} and
@code{spawnve()} are not thread-safe on Windows; we advise you to use the
@ref{dc,,subprocess} module instead.


Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.



@ref{23f,,Soft deprecated} since version 3.14: The @ref{dc,,subprocess} module is recommended instead.

@end deffn

@geindex P_NOWAIT (in module os)
@geindex P_NOWAITO (in module os)
@anchor{library/os os P_NOWAIT}@anchor{3147}
@deffn {Data} os.P_NOWAIT
@anchor{library/os os P_NOWAITO}@anchor{3149}
@deffnx {Data} os.P_NOWAITO

Possible values for the `mode' parameter to the @ref{31d,,spawn*} family of
functions.  If either of these values is given, the @code{spawn*} functions
will return as soon as the new process has been created, with the process id as
the return value.

@ref{2181,,Availability}: Unix, Windows.
@end deffn

@geindex P_WAIT (in module os)
@anchor{library/os os P_WAIT}@anchor{3148}
@deffn {Data} os.P_WAIT

Possible value for the `mode' parameter to the @ref{31d,,spawn*} family of
functions.  If this is given as `mode', the @code{spawn*} functions will not
return until the new process has run to completion and will return the exit code
of the process the run is successful, or @code{-signal} if a signal kills the
process.

@ref{2181,,Availability}: Unix, Windows.
@end deffn

@geindex P_DETACH (in module os)
@geindex P_OVERLAY (in module os)
@anchor{library/os os P_DETACH}@anchor{314a}
@deffn {Data} os.P_DETACH
@anchor{library/os os P_OVERLAY}@anchor{314b}
@deffnx {Data} os.P_OVERLAY

Possible values for the `mode' parameter to the @ref{31d,,spawn*} family of
functions.  These are less portable than those listed above. @ref{314a,,P_DETACH}
is similar to @ref{3147,,P_NOWAIT}, but the new process is detached from the
console of the calling process. If @ref{314b,,P_OVERLAY} is used, the current
process will be replaced; the @code{spawn*} function will not return.

@ref{2181,,Availability}: Windows.
@end deffn

@geindex startfile() (in module os)
@anchor{library/os os startfile}@anchor{1cc5}
@deffn {Function} os.startfile (path[, operation][, arguments][, cwd][, show_cmd])

Start a file with its associated application.

When `operation' is not specified, this acts like double-clicking
the file in Windows Explorer, or giving the file name as an argument to the
@code{start} command from the interactive command shell: the file is opened
with whatever application (if any) its extension is associated.

When another `operation' is given, it must be a “command verb” that specifies
what should be done with the file. Common verbs documented by Microsoft are @code{'open'},
@code{'print'} and  @code{'edit'} (to be used on files) as well as @code{'explore'} and
@code{'find'} (to be used on directories).

When launching an application, specify `arguments' to be passed as a single
string. This argument may have no effect when using this function to launch a
document.

The default working directory is inherited, but may be overridden by the `cwd'
argument. This should be an absolute path. A relative `path' will be resolved
against this argument.

Use `show_cmd' to override the default window style. Whether this has any
effect will depend on the application being launched. Values are integers as
supported by the Win32 @code{ShellExecute()} function.

@code{startfile()} returns as soon as the associated application is launched.
There is no option to wait for the application to close, and no way to retrieve
the application’s exit status.  The `path' parameter is relative to the current
directory or `cwd'.  If you want to use an absolute path, make sure the first
character is not a slash (@code{'/'})  Use @ref{a8,,pathlib} or the
@ref{1525,,os.path.normpath()} function to ensure that paths are properly encoded for
Win32.

To reduce interpreter startup overhead, the Win32 @code{ShellExecute()}
function is not resolved until this function is first called.  If the function
cannot be resolved, @ref{369,,NotImplementedError} will be raised.

Raises an @ref{1cb1,,auditing event} @code{os.startfile} with arguments @code{path}, @code{operation}.

Raises an @ref{1cb1,,auditing event} @code{os.startfile/2} with arguments @code{path}, @code{operation}, @code{arguments}, @code{cwd}, @code{show_cmd}.

@ref{2181,,Availability}: Windows.


Changed in version 3.10: Added the `arguments', `cwd' and `show_cmd' arguments, and the
@code{os.startfile/2} audit event.

@end deffn

@geindex system() (in module os)
@anchor{library/os os system}@anchor{1669}
@deffn {Function} os.system (command)

Execute the command (a string) in a subshell.  This is implemented by calling
the Standard C function @code{system()}, and has the same limitations.
Changes to @ref{760,,sys.stdin}, etc. are not reflected in the environment of
the executed command. If `command' generates any output, it will be sent to
the interpreter standard output stream. The C standard does not
specify the meaning of the return value of the C function, so the return
value of the Python function is system-dependent.

On Unix, the return value is the exit status of the process encoded in the
format specified for @ref{f9e,,wait()}.

On Windows, the return value is that returned by the system shell after
running `command'.  The shell is given by the Windows environment variable
@geindex COMSPEC
@geindex environment variable; COMSPEC
@code{COMSPEC}: it is usually @code{cmd.exe}, which returns the exit
status of the command run; on systems using a non-native shell, consult your
shell documentation.

The @ref{dc,,subprocess} module provides more powerful facilities for spawning
new processes and retrieving their results; using that module is recommended
to using this function.  See the @ref{1394,,Replacing Older Functions with the subprocess Module} section in
the @code{subprocess} documentation for some helpful recipes.

On Unix, @ref{b1d,,waitstatus_to_exitcode()} can be used to convert the result
(exit status) into an exit code. On Windows, the result is directly the exit
code.

Raises an @ref{1cb1,,auditing event} @code{os.system} with argument @code{command}.

@ref{2181,,Availability}: Unix, Windows, not WASI, not Android, not iOS.
@end deffn

@geindex times() (in module os)
@anchor{library/os os times}@anchor{1321}
@deffn {Function} os.times ()

Returns the current global process times.
The return value is an object with five attributes:


@itemize *

@item 
@code{user} - user time

@item 
@code{system} - system time

@item 
@code{children_user} - user time of all child processes

@item 
@code{children_system} - system time of all child processes

@item 
@code{elapsed} - elapsed real time since a fixed point in the past
@end itemize

For backwards compatibility, this object also behaves like a five-tuple
containing @code{user}, @code{system}, @code{children_user},
@code{children_system}, and @code{elapsed} in that order.

See the Unix manual page
@code{times(2)@footnote{https://manpages.debian.org/times(2)}} and times(3)@footnote{https://man.freebsd.org/cgi/man.cgi?time(3)} manual page on Unix or the GetProcessTimes MSDN@footnote{https://docs.microsoft.com/windows/win32/api/processthreadsapi/nf-processthreadsapi-getprocesstimes}
on Windows. On Windows, only @code{user} and @code{system} are known; the other attributes are zero.

@ref{2181,,Availability}: Unix, Windows.


Changed in version 3.3: Return type changed from a tuple to a tuple-like object
with named attributes.

@end deffn

@geindex wait() (in module os)
@anchor{library/os os wait}@anchor{f9e}
@deffn {Function} os.wait ()

Wait for completion of a child process, and return a tuple containing its pid
and exit status indication: a 16-bit number, whose low byte is the signal number
that killed the process, and whose high byte is the exit status (if the signal
number is zero); the high bit of the low byte is set if a core file was
produced.

If there are no children that could be waited for, @ref{125e,,ChildProcessError}
is raised.

@ref{b1d,,waitstatus_to_exitcode()} can be used to convert the exit status into an
exit code.

@ref{2181,,Availability}: Unix, not WASI, not Android, not iOS.


@subsubheading See also


The other @code{wait*()} functions documented below can be used to wait for the
completion of a specific child process and have more options.
@ref{fa0,,waitpid()} is the only one also available on Windows.

@end deffn

@geindex waitid() (in module os)
@anchor{library/os os waitid}@anchor{f9f}
@deffn {Function} os.waitid (idtype, id, options, /)

Wait for the completion of a child process.

`idtype' can be @ref{314c,,P_PID}, @ref{314d,,P_PGID}, @ref{314e,,P_ALL}, or (on Linux) @ref{b1c,,P_PIDFD}.
The interpretation of `id' depends on it; see their individual descriptions.

`options' is an OR combination of flags.  At least one of @ref{314f,,WEXITED},
@ref{3150,,WSTOPPED} or @ref{3151,,WCONTINUED} is required;
@ref{3152,,WNOHANG} and @ref{3153,,WNOWAIT} are additional optional flags.

The return value is an object representing the data contained in the
@code{siginfo_t} structure with the following attributes:


@itemize *

@item 
@code{si_pid} (process ID)

@item 
@code{si_uid} (real user ID of the child)

@item 
@code{si_signo} (always @ref{3154,,SIGCHLD})

@item 
@code{si_status} (the exit status or signal number, depending on @code{si_code})

@item 
@code{si_code} (see @ref{3155,,CLD_EXITED} for possible values)
@end itemize

If @ref{3152,,WNOHANG} is specified and there are no matching children in the
requested state, @code{None} is returned.
Otherwise, if there are no matching children
that could be waited for, @ref{125e,,ChildProcessError} is raised.

@ref{2181,,Availability}: Unix, not WASI, not Android, not iOS.


Added in version 3.3.



Changed in version 3.13: This function is now available on macOS as well.

@end deffn

@geindex waitpid() (in module os)
@anchor{library/os os waitpid}@anchor{fa0}
@deffn {Function} os.waitpid (pid, options, /)

The details of this function differ on Unix and Windows.

On Unix: Wait for completion of a child process given by process id `pid', and
return a tuple containing its process id and exit status indication (encoded as
for @ref{f9e,,wait()}).  The semantics of the call are affected by the value of the
integer `options', which should be @code{0} for normal operation.

If `pid' is greater than @code{0}, @code{waitpid()} requests status information for
that specific process.  If `pid' is @code{0}, the request is for the status of any
child in the process group of the current process.  If `pid' is @code{-1}, the
request pertains to any child of the current process.  If `pid' is less than
@code{-1}, status is requested for any process in the process group @code{-pid} (the
absolute value of `pid').

`options' is an OR combination of flags.  If it contains @ref{3152,,WNOHANG} and
there are no matching children in the requested state, @code{(0, 0)} is
returned.  Otherwise, if there are no matching children that could be waited
for, @ref{125e,,ChildProcessError} is raised.  Other options that can be used are
@ref{3156,,WUNTRACED} and @ref{3151,,WCONTINUED}.

On Windows: Wait for completion of a process given by process handle `pid', and
return a tuple containing `pid', and its exit status shifted left by 8 bits
(shifting makes cross-platform use of the function easier). A `pid' less than or
equal to @code{0} has no special meaning on Windows, and raises an exception. The
value of integer `options' has no effect. `pid' can refer to any process whose
id is known, not necessarily a child process. The @ref{31d,,spawn*}
functions called with @ref{3147,,P_NOWAIT} return suitable process handles.

@ref{b1d,,waitstatus_to_exitcode()} can be used to convert the exit status into an
exit code.

@ref{2181,,Availability}: Unix, Windows, not WASI, not Android, not iOS.


Changed in version 3.5: If the system call is interrupted and the signal handler does not raise an
exception, the function now retries the system call instead of raising an
@ref{f8e,,InterruptedError} exception (see 
@geindex Python Enhancement Proposals; PEP 475
PEP 475@footnote{https://peps.python.org/pep-0475/} for the rationale).

@end deffn

@geindex wait3() (in module os)
@anchor{library/os os wait3}@anchor{f9c}
@deffn {Function} os.wait3 (options)

Similar to @ref{fa0,,waitpid()}, except no process id argument is given and a
3-element tuple containing the child’s process id, exit status indication,
and resource usage information is returned.  Refer to
@ref{163d,,resource.getrusage()} for details on resource usage information.  The
`options' argument is the same as that provided to @code{waitpid()} and
@ref{f9d,,wait4()}.

@ref{b1d,,waitstatus_to_exitcode()} can be used to convert the exit status into an
exitcode.

@ref{2181,,Availability}: Unix, not WASI, not Android, not iOS.
@end deffn

@geindex wait4() (in module os)
@anchor{library/os os wait4}@anchor{f9d}
@deffn {Function} os.wait4 (pid, options)

Similar to @ref{fa0,,waitpid()}, except a 3-element tuple, containing the child’s
process id, exit status indication, and resource usage information is
returned.  Refer to @ref{163d,,resource.getrusage()} for details on resource usage
information.  The arguments to @code{wait4()} are the same as those provided
to @code{waitpid()}.

@ref{b1d,,waitstatus_to_exitcode()} can be used to convert the exit status into an
exitcode.

@ref{2181,,Availability}: Unix, not WASI, not Android, not iOS.
@end deffn

@geindex P_PID (in module os)
@geindex P_PGID (in module os)
@geindex P_ALL (in module os)
@geindex P_PIDFD (in module os)
@anchor{library/os os P_PID}@anchor{314c}
@deffn {Data} os.P_PID
@anchor{library/os os P_PGID}@anchor{314d}
@deffnx {Data} os.P_PGID
@anchor{library/os os P_ALL}@anchor{314e}
@deffnx {Data} os.P_ALL
@anchor{library/os os P_PIDFD}@anchor{b1c}
@deffnx {Data} os.P_PIDFD

These are the possible values for `idtype' in @ref{f9f,,waitid()}. They affect
how `id' is interpreted:


@itemize *

@item 
@code{P_PID} - wait for the child whose PID is `id'.

@item 
@code{P_PGID} - wait for any child whose progress group ID is `id'.

@item 
@code{P_ALL} - wait for any child; `id' is ignored.

@item 
@code{P_PIDFD} - wait for the child identified by the file descriptor
`id' (a process file descriptor created with @ref{6a5,,pidfd_open()}).
@end itemize

@ref{2181,,Availability}: Unix, not WASI, not Android, not iOS.

@cartouche
@quotation Note 
@code{P_PIDFD} is only available on Linux >= 5.4.
@end quotation
@end cartouche


Added in version 3.3.



Added in version 3.9: The @code{P_PIDFD} constant.

@end deffn

@geindex WCONTINUED (in module os)
@anchor{library/os os WCONTINUED}@anchor{3151}
@deffn {Data} os.WCONTINUED

This `options' flag for @ref{fa0,,waitpid()}, @ref{f9c,,wait3()}, @ref{f9d,,wait4()}, and
@ref{f9f,,waitid()} causes child processes to be reported if they have been
continued from a job control stop since they were last reported.

@ref{2181,,Availability}: Unix, not WASI, not Android, not iOS.
@end deffn

@geindex WEXITED (in module os)
@anchor{library/os os WEXITED}@anchor{314f}
@deffn {Data} os.WEXITED

This `options' flag for @ref{f9f,,waitid()} causes child processes that have terminated to
be reported.

The other @code{wait*} functions always report children that have terminated,
so this option is not available for them.

@ref{2181,,Availability}: Unix, not WASI, not Android, not iOS.


Added in version 3.3.

@end deffn

@geindex WSTOPPED (in module os)
@anchor{library/os os WSTOPPED}@anchor{3150}
@deffn {Data} os.WSTOPPED

This `options' flag for @ref{f9f,,waitid()} causes child processes that have been stopped
by the delivery of a signal to be reported.

This option is not available for the other @code{wait*} functions.

@ref{2181,,Availability}: Unix, not WASI, not Android, not iOS.


Added in version 3.3.

@end deffn

@geindex WUNTRACED (in module os)
@anchor{library/os os WUNTRACED}@anchor{3156}
@deffn {Data} os.WUNTRACED

This `options' flag for @ref{fa0,,waitpid()}, @ref{f9c,,wait3()}, and @ref{f9d,,wait4()} causes
child processes to also be reported if they have been stopped but their
current state has not been reported since they were stopped.

This option is not available for @ref{f9f,,waitid()}.

@ref{2181,,Availability}: Unix, not WASI, not Android, not iOS.
@end deffn

@geindex WNOHANG (in module os)
@anchor{library/os os WNOHANG}@anchor{3152}
@deffn {Data} os.WNOHANG

This `options' flag causes @ref{fa0,,waitpid()}, @ref{f9c,,wait3()}, @ref{f9d,,wait4()}, and
@ref{f9f,,waitid()} to return right away if no child process status is available
immediately.

@ref{2181,,Availability}: Unix, not WASI, not Android, not iOS.
@end deffn

@geindex WNOWAIT (in module os)
@anchor{library/os os WNOWAIT}@anchor{3153}
@deffn {Data} os.WNOWAIT

This `options' flag causes @ref{f9f,,waitid()} to leave the child in a waitable state, so that
a later @code{wait*()} call can be used to retrieve the child status information again.

This option is not available for the other @code{wait*} functions.

@ref{2181,,Availability}: Unix, not WASI, not Android, not iOS.
@end deffn

@geindex CLD_EXITED (in module os)
@geindex CLD_KILLED (in module os)
@geindex CLD_DUMPED (in module os)
@geindex CLD_TRAPPED (in module os)
@geindex CLD_STOPPED (in module os)
@geindex CLD_CONTINUED (in module os)
@anchor{library/os os CLD_EXITED}@anchor{3155}
@deffn {Data} os.CLD_EXITED
@anchor{library/os os CLD_KILLED}@anchor{b1a}
@deffnx {Data} os.CLD_KILLED
@anchor{library/os os CLD_DUMPED}@anchor{3157}
@deffnx {Data} os.CLD_DUMPED
@anchor{library/os os CLD_TRAPPED}@anchor{3158}
@deffnx {Data} os.CLD_TRAPPED
@anchor{library/os os CLD_STOPPED}@anchor{b1b}
@deffnx {Data} os.CLD_STOPPED
@anchor{library/os os CLD_CONTINUED}@anchor{3159}
@deffnx {Data} os.CLD_CONTINUED

These are the possible values for @code{si_code} in the result returned by
@ref{f9f,,waitid()}.

@ref{2181,,Availability}: Unix, not WASI, not Android, not iOS.


Added in version 3.3.



Changed in version 3.9: Added @code{CLD_KILLED} and @code{CLD_STOPPED} values.

@end deffn

@geindex waitstatus_to_exitcode() (in module os)
@anchor{library/os os waitstatus_to_exitcode}@anchor{b1d}
@deffn {Function} os.waitstatus_to_exitcode (status)

Convert a wait status to an exit code.

On Unix:


@itemize *

@item 
If the process exited normally (if @code{WIFEXITED(status)} is true),
return the process exit status (return @code{WEXITSTATUS(status)}):
result greater than or equal to 0.

@item 
If the process was terminated by a signal (if @code{WIFSIGNALED(status)} is
true), return @code{-signum} where `signum' is the number of the signal that
caused the process to terminate (return @code{-WTERMSIG(status)}):
result less than 0.

@item 
Otherwise, raise a @ref{2ee,,ValueError}.
@end itemize

On Windows, return `status' shifted right by 8 bits.

On Unix, if the process is being traced or if @ref{fa0,,waitpid()} was called
with @ref{3156,,WUNTRACED} option, the caller must first check if
@code{WIFSTOPPED(status)} is true. This function must not be called if
@code{WIFSTOPPED(status)} is true.


@subsubheading See also


@ref{315a,,WIFEXITED()}, @ref{315b,,WEXITSTATUS()}, @ref{315c,,WIFSIGNALED()},
@ref{315d,,WTERMSIG()}, @ref{315e,,WIFSTOPPED()}, @ref{315f,,WSTOPSIG()} functions.


@ref{2181,,Availability}: Unix, Windows, not WASI, not Android, not iOS.


Added in version 3.9.

@end deffn

The following functions take a process status code as returned by
@ref{1669,,system()}, @ref{f9e,,wait()}, or @ref{fa0,,waitpid()} as a parameter.  They may be
used to determine the disposition of a process.

@geindex WCOREDUMP() (in module os)
@anchor{library/os os WCOREDUMP}@anchor{3160}
@deffn {Function} os.WCOREDUMP (status, /)

Return @code{True} if a core dump was generated for the process, otherwise
return @code{False}.

This function should be employed only if @ref{315c,,WIFSIGNALED()} is true.

@ref{2181,,Availability}: Unix, not WASI, not Android, not iOS.
@end deffn

@geindex WIFCONTINUED() (in module os)
@anchor{library/os os WIFCONTINUED}@anchor{3161}
@deffn {Function} os.WIFCONTINUED (status)

Return @code{True} if a stopped child has been resumed by delivery of
@ref{3162,,SIGCONT} (if the process has been continued from a job
control stop), otherwise return @code{False}.

See @ref{3151,,WCONTINUED} option.

@ref{2181,,Availability}: Unix, not WASI, not Android, not iOS.
@end deffn

@geindex WIFSTOPPED() (in module os)
@anchor{library/os os WIFSTOPPED}@anchor{315e}
@deffn {Function} os.WIFSTOPPED (status)

Return @code{True} if the process was stopped by delivery of a signal,
otherwise return @code{False}.

@code{WIFSTOPPED()} only returns @code{True} if the @ref{fa0,,waitpid()} call was
done using @ref{3156,,WUNTRACED} option or when the process is being traced (see
@code{ptrace(2)@footnote{https://manpages.debian.org/ptrace(2)}}).

@ref{2181,,Availability}: Unix, not WASI, not Android, not iOS.
@end deffn

@geindex WIFSIGNALED() (in module os)
@anchor{library/os os WIFSIGNALED}@anchor{315c}
@deffn {Function} os.WIFSIGNALED (status)

Return @code{True} if the process was terminated by a signal, otherwise return
@code{False}.

@ref{2181,,Availability}: Unix, not WASI, not Android, not iOS.
@end deffn

@geindex WIFEXITED() (in module os)
@anchor{library/os os WIFEXITED}@anchor{315a}
@deffn {Function} os.WIFEXITED (status)

Return @code{True} if the process exited terminated normally, that is,
by calling @code{exit()} or @code{_exit()}, or by returning from @code{main()};
otherwise return @code{False}.

@ref{2181,,Availability}: Unix, not WASI, not Android, not iOS.
@end deffn

@geindex WEXITSTATUS() (in module os)
@anchor{library/os os WEXITSTATUS}@anchor{315b}
@deffn {Function} os.WEXITSTATUS (status)

Return the process exit status.

This function should be employed only if @ref{315a,,WIFEXITED()} is true.

@ref{2181,,Availability}: Unix, not WASI, not Android, not iOS.
@end deffn

@geindex WSTOPSIG() (in module os)
@anchor{library/os os WSTOPSIG}@anchor{315f}
@deffn {Function} os.WSTOPSIG (status)

Return the signal which caused the process to stop.

This function should be employed only if @ref{315e,,WIFSTOPPED()} is true.

@ref{2181,,Availability}: Unix, not WASI, not Android, not iOS.
@end deffn

@geindex WTERMSIG() (in module os)
@anchor{library/os os WTERMSIG}@anchor{315d}
@deffn {Function} os.WTERMSIG (status)

Return the number of the signal that caused the process to terminate.

This function should be employed only if @ref{315c,,WIFSIGNALED()} is true.

@ref{2181,,Availability}: Unix, not WASI, not Android, not iOS.
@end deffn

@node Interface to the scheduler,Miscellaneous System Information,Process Management,os — Miscellaneous operating system interfaces
@anchor{library/os interface-to-the-scheduler}@anchor{3163}
@subsubsection Interface to the scheduler


These functions control how a process is allocated CPU time by the operating
system. They are only available on some Unix platforms. For more detailed
information, consult your Unix manpages.


Added in version 3.3.


The following scheduling policies are exposed if they are supported by the
operating system.

@geindex SCHED_OTHER (in module os)
@anchor{library/os os-scheduling-policy}@anchor{3164}@anchor{library/os os SCHED_OTHER}@anchor{3165}
@deffn {Data} os.SCHED_OTHER

The default scheduling policy.
@end deffn

@geindex SCHED_BATCH (in module os)
@anchor{library/os os SCHED_BATCH}@anchor{3166}
@deffn {Data} os.SCHED_BATCH

Scheduling policy for CPU-intensive processes that tries to preserve
interactivity on the rest of the computer.
@end deffn

@geindex SCHED_DEADLINE (in module os)
@anchor{library/os os SCHED_DEADLINE}@anchor{25f}
@deffn {Data} os.SCHED_DEADLINE

Scheduling policy for tasks with deadline constraints.


Added in version 3.14.

@end deffn

@geindex SCHED_IDLE (in module os)
@anchor{library/os os SCHED_IDLE}@anchor{3167}
@deffn {Data} os.SCHED_IDLE

Scheduling policy for extremely low priority background tasks.
@end deffn

@geindex SCHED_NORMAL (in module os)
@anchor{library/os os SCHED_NORMAL}@anchor{260}
@deffn {Data} os.SCHED_NORMAL

Alias for @ref{3165,,SCHED_OTHER}.


Added in version 3.14.

@end deffn

@geindex SCHED_SPORADIC (in module os)
@anchor{library/os os SCHED_SPORADIC}@anchor{3168}
@deffn {Data} os.SCHED_SPORADIC

Scheduling policy for sporadic server programs.
@end deffn

@geindex SCHED_FIFO (in module os)
@anchor{library/os os SCHED_FIFO}@anchor{3169}
@deffn {Data} os.SCHED_FIFO

A First In First Out scheduling policy.
@end deffn

@geindex SCHED_RR (in module os)
@anchor{library/os os SCHED_RR}@anchor{316a}
@deffn {Data} os.SCHED_RR

A round-robin scheduling policy.
@end deffn

@geindex SCHED_RESET_ON_FORK (in module os)
@anchor{library/os os SCHED_RESET_ON_FORK}@anchor{316b}
@deffn {Data} os.SCHED_RESET_ON_FORK

This flag can be OR’ed with any other scheduling policy. When a process with
this flag set forks, its child’s scheduling policy and priority are reset to
the default.
@end deffn

@geindex sched_param (class in os)
@anchor{library/os os sched_param}@anchor{1954}
@deffn {Class} os.sched_param (sched_priority)

This class represents tunable scheduling parameters used in
@ref{131b,,sched_setparam()}, @ref{131c,,sched_setscheduler()}, and
@ref{1317,,sched_getparam()}. It is immutable.

At the moment, there is only one possible parameter:

@geindex sched_priority (os.sched_param attribute)
@anchor{library/os os sched_param sched_priority}@anchor{316c}
@deffn {Attribute} sched_priority

The scheduling priority for a scheduling policy.
@end deffn
@end deffn

@geindex sched_get_priority_min() (in module os)
@anchor{library/os os sched_get_priority_min}@anchor{1315}
@deffn {Function} os.sched_get_priority_min (policy)

Get the minimum priority value for `policy'. `policy' is one of the
scheduling policy constants above.
@end deffn

@geindex sched_get_priority_max() (in module os)
@anchor{library/os os sched_get_priority_max}@anchor{1314}
@deffn {Function} os.sched_get_priority_max (policy)

Get the maximum priority value for `policy'. `policy' is one of the
scheduling policy constants above.
@end deffn

@geindex sched_setscheduler() (in module os)
@anchor{library/os os sched_setscheduler}@anchor{131c}
@deffn {Function} os.sched_setscheduler (pid, policy, param, /)

Set the scheduling policy for the process with PID `pid'. A `pid' of 0 means
the calling process. `policy' is one of the scheduling policy constants
above. `param' is a @ref{1954,,sched_param} instance.
@end deffn

@geindex sched_getscheduler() (in module os)
@anchor{library/os os sched_getscheduler}@anchor{1318}
@deffn {Function} os.sched_getscheduler (pid, /)

Return the scheduling policy for the process with PID `pid'. A `pid' of 0
means the calling process. The result is one of the scheduling policy
constants above.
@end deffn

@geindex sched_setparam() (in module os)
@anchor{library/os os sched_setparam}@anchor{131b}
@deffn {Function} os.sched_setparam (pid, param, /)

Set the scheduling parameters for the process with PID `pid'. A `pid' of 0 means
the calling process. `param' is a @ref{1954,,sched_param} instance.
@end deffn

@geindex sched_getparam() (in module os)
@anchor{library/os os sched_getparam}@anchor{1317}
@deffn {Function} os.sched_getparam (pid, /)

Return the scheduling parameters as a @ref{1954,,sched_param} instance for the
process with PID `pid'. A `pid' of 0 means the calling process.
@end deffn

@geindex sched_rr_get_interval() (in module os)
@anchor{library/os os sched_rr_get_interval}@anchor{1319}
@deffn {Function} os.sched_rr_get_interval (pid, /)

Return the round-robin quantum in seconds for the process with PID `pid'. A
`pid' of 0 means the calling process.
@end deffn

@geindex sched_yield() (in module os)
@anchor{library/os os sched_yield}@anchor{131d}
@deffn {Function} os.sched_yield ()

Voluntarily relinquish the CPU. See @code{sched_yield(2)@footnote{https://manpages.debian.org/sched_yield(2)}} for details.
@end deffn

@geindex sched_setaffinity() (in module os)
@anchor{library/os os sched_setaffinity}@anchor{131a}
@deffn {Function} os.sched_setaffinity (pid, mask, /)

Restrict the process with PID `pid' (or the current process if zero) to a
set of CPUs.  `mask' is an iterable of integers representing the set of
CPUs to which the process should be restricted.
@end deffn

@geindex sched_getaffinity() (in module os)
@anchor{library/os os sched_getaffinity}@anchor{1316}
@deffn {Function} os.sched_getaffinity (pid, /)

Return the set of CPUs the process with PID `pid' is restricted to.

If `pid' is zero, return the set of CPUs the calling thread of the current
process is restricted to.

See also the @ref{4db,,process_cpu_count()} function.
@end deffn

@node Miscellaneous System Information,Random numbers<2>,Interface to the scheduler,os — Miscellaneous operating system interfaces
@anchor{library/os miscellaneous-system-information}@anchor{316d}@anchor{library/os os-path}@anchor{316e}
@subsubsection Miscellaneous System Information


@geindex confstr() (in module os)
@anchor{library/os os confstr}@anchor{1932}
@deffn {Function} os.confstr (name, /)

Return string-valued system configuration values. `name' specifies the
configuration value to retrieve; it may be a string which is the name of a
defined system value; these names are specified in a number of standards (POSIX,
Unix 95, Unix 98, and others).  Some platforms define additional names as well.
The names known to the host operating system are given as the keys of the
@code{confstr_names} dictionary.  For configuration variables not included in that
mapping, passing an integer for `name' is also accepted.

If the configuration value specified by `name' isn’t defined, @code{None} is
returned.

If `name' is a string and is not known, @ref{2ee,,ValueError} is raised.  If a
specific value for `name' is not supported by the host system, even if it is
included in @code{confstr_names}, an @ref{2c2,,OSError} is raised with
@ref{1e14,,errno.EINVAL} for the error number.

@ref{2181,,Availability}: Unix.
@end deffn

@geindex confstr_names (in module os)
@anchor{library/os os confstr_names}@anchor{316f}
@deffn {Data} os.confstr_names

Dictionary mapping names accepted by @ref{1932,,confstr()} to the integer values
defined for those names by the host operating system. This can be used to
determine the set of names known to the system.

@ref{2181,,Availability}: Unix.
@end deffn

@geindex cpu_count() (in module os)
@anchor{library/os os cpu_count}@anchor{4dc}
@deffn {Function} os.cpu_count ()

Return the number of logical CPUs in the `system'. Returns @code{None} if
undetermined.

The @ref{4db,,process_cpu_count()} function can be used to get the number of
logical CPUs usable by the calling thread of the `current process'.


Added in version 3.4.



Changed in version 3.13: If @ref{170,,-X cpu_count} is given or 
@geindex PYTHON_CPU_COUNT
@geindex environment variable; PYTHON_CPU_COUNT
@ref{51f,,PYTHON_CPU_COUNT} is set,
@code{cpu_count()} returns the override value `n'.

@end deffn

@geindex getloadavg() (in module os)
@anchor{library/os os getloadavg}@anchor{1969}
@deffn {Function} os.getloadavg ()

Return the number of processes in the system run queue averaged over the last
1, 5, and 15 minutes or raises @ref{2c2,,OSError} if the load average was
unobtainable.

@ref{2181,,Availability}: Unix.
@end deffn

@geindex process_cpu_count() (in module os)
@anchor{library/os os process_cpu_count}@anchor{4db}
@deffn {Function} os.process_cpu_count ()

Get the number of logical CPUs usable by the calling thread of the `current
process'. Returns @code{None} if undetermined. It can be less than
@ref{4dc,,cpu_count()} depending on the CPU affinity.

The @ref{4dc,,cpu_count()} function can be used to get the number of logical CPUs
in the `system'.

If @ref{170,,-X cpu_count} is given or 
@geindex PYTHON_CPU_COUNT
@geindex environment variable; PYTHON_CPU_COUNT
@ref{51f,,PYTHON_CPU_COUNT} is set,
@code{process_cpu_count()} returns the override value `n'.

See also the @ref{1316,,sched_getaffinity()} function.


Added in version 3.13.

@end deffn

@geindex sysconf() (in module os)
@anchor{library/os os sysconf}@anchor{1933}
@deffn {Function} os.sysconf (name, /)

Return integer-valued system configuration values. If the configuration value
specified by `name' isn’t defined, @code{-1} is returned.  The comments regarding
the `name' parameter for @ref{1932,,confstr()} apply here as well; the dictionary that
provides information on the known names is given by @code{sysconf_names}.

@ref{2181,,Availability}: Unix.
@end deffn

@geindex sysconf_names (in module os)
@anchor{library/os os sysconf_names}@anchor{3170}
@deffn {Data} os.sysconf_names

Dictionary mapping names accepted by @ref{1933,,sysconf()} to the integer values
defined for those names by the host operating system. This can be used to
determine the set of names known to the system.

@ref{2181,,Availability}: Unix.


Changed in version 3.11: Add @code{'SC_MINSIGSTKSZ'} name.

@end deffn

The following data values are used to support path manipulation operations.  These
are defined for all platforms.

Higher-level operations on pathnames are defined in the @ref{a6,,os.path} module.

@geindex . (dot); in pathnames

@geindex curdir (in module os)
@anchor{library/os os curdir}@anchor{2cc8}
@deffn {Data} os.curdir

The constant string used by the operating system to refer to the current
directory. This is @code{'.'} for Windows and POSIX. Also available via
@ref{a6,,os.path}.
@end deffn

@geindex ..; in pathnames

@geindex pardir (in module os)
@anchor{library/os os pardir}@anchor{30ed}
@deffn {Data} os.pardir

The constant string used by the operating system to refer to the parent
directory. This is @code{'..'} for Windows and POSIX. Also available via
@ref{a6,,os.path}.
@end deffn

@geindex / (slash); in pathnames

@geindex \ (backslash); in pathnames (Windows)

@geindex sep (in module os)
@anchor{library/os os sep}@anchor{87c}
@deffn {Data} os.sep

The character used by the operating system to separate pathname components.
This is @code{'/'} for POSIX and @code{'\\'} for Windows.  Note that knowing this
is not sufficient to be able to parse or concatenate pathnames — use
@ref{2cc2,,os.path.split()} and @ref{19eb,,os.path.join()} — but it is occasionally
useful. Also available via @ref{a6,,os.path}.
@end deffn

@geindex / (slash); in pathnames

@geindex altsep (in module os)
@anchor{library/os os altsep}@anchor{87d}
@deffn {Data} os.altsep

An alternative character used by the operating system to separate pathname
components, or @code{None} if only one separator character exists.  This is set to
@code{'/'} on Windows systems where @code{sep} is a backslash. Also available via
@ref{a6,,os.path}.
@end deffn

@geindex . (dot); in pathnames

@geindex extsep (in module os)
@anchor{library/os os extsep}@anchor{3171}
@deffn {Data} os.extsep

The character which separates the base filename from the extension; for example,
the @code{'.'} in @code{os.py}. Also available via @ref{a6,,os.path}.
@end deffn

@geindex ; (colon); path separator (POSIX)
@geindex ; (semicolon)

@geindex pathsep (in module os)
@anchor{library/os os pathsep}@anchor{2177}
@deffn {Data} os.pathsep

The character conventionally used by the operating system to separate search
path components (as in 
@geindex PATH
@geindex environment variable; PATH
@code{PATH}), such as @code{':'} for POSIX or @code{';'} for
Windows. Also available via @ref{a6,,os.path}.
@end deffn

@geindex defpath (in module os)
@anchor{library/os os defpath}@anchor{1e26}
@deffn {Data} os.defpath

The default search path used by @ref{3124,,exec*p*} and
@ref{31d,,spawn*p*} if the environment doesn’t have a @code{'PATH'}
key. Also available via @ref{a6,,os.path}.
@end deffn

@geindex linesep (in module os)
@anchor{library/os os linesep}@anchor{2623}
@deffn {Data} os.linesep

The string used to separate (or, rather, terminate) lines on the current
platform.  This may be a single character, such as @code{'\n'} for POSIX, or
multiple characters, for example, @code{'\r\n'} for Windows. Do not use
`os.linesep' as a line terminator when writing files opened in text mode (the
default); use a single @code{'\n'} instead, on all platforms.
@end deffn

@geindex devnull (in module os)
@anchor{library/os os devnull}@anchor{1e56}
@deffn {Data} os.devnull

The file path of the null device. For example: @code{'/dev/null'} for
POSIX, @code{'nul'} for Windows.  Also available via @ref{a6,,os.path}.
@end deffn

@geindex RTLD_LAZY (in module os)
@geindex RTLD_NOW (in module os)
@geindex RTLD_GLOBAL (in module os)
@geindex RTLD_LOCAL (in module os)
@geindex RTLD_NODELETE (in module os)
@geindex RTLD_NOLOAD (in module os)
@geindex RTLD_DEEPBIND (in module os)
@anchor{library/os os RTLD_LAZY}@anchor{1324}
@deffn {Data} os.RTLD_LAZY
@anchor{library/os os RTLD_NOW}@anchor{1325}
@deffnx {Data} os.RTLD_NOW
@anchor{library/os os RTLD_GLOBAL}@anchor{1326}
@deffnx {Data} os.RTLD_GLOBAL
@anchor{library/os os RTLD_LOCAL}@anchor{1327}
@deffnx {Data} os.RTLD_LOCAL
@anchor{library/os os RTLD_NODELETE}@anchor{1328}
@deffnx {Data} os.RTLD_NODELETE
@anchor{library/os os RTLD_NOLOAD}@anchor{1329}
@deffnx {Data} os.RTLD_NOLOAD
@anchor{library/os os RTLD_DEEPBIND}@anchor{132a}
@deffnx {Data} os.RTLD_DEEPBIND

Flags for use with the @ref{132b,,setdlopenflags()} and
@ref{171a,,getdlopenflags()} functions.  See the Unix manual page
@code{dlopen(3)@footnote{https://manpages.debian.org/dlopen(3)}} for what the different flags mean.


Added in version 3.3.

@end deffn

@node Random numbers<2>,,Miscellaneous System Information,os — Miscellaneous operating system interfaces
@anchor{library/os random-numbers}@anchor{3172}
@subsubsection Random numbers


@geindex getrandom() (in module os)
@anchor{library/os os getrandom}@anchor{ebf}
@deffn {Function} os.getrandom (size, flags=0)

Get up to `size' random bytes. The function can return less bytes than
requested.

These bytes can be used to seed user-space random number generators or for
cryptographic purposes.

@code{getrandom()} relies on entropy gathered from device drivers and other
sources of environmental noise. Unnecessarily reading large quantities of
data will have a negative impact on  other users  of the @code{/dev/random} and
@code{/dev/urandom} devices.

The flags argument is a bit mask that can contain zero or more of the
following values ORed together: @ref{3173,,os.GRND_RANDOM} and
@ref{3174,,GRND_NONBLOCK}.

See also the Linux getrandom() manual page@footnote{https://man7.org/linux/man-pages/man2/getrandom.2.html}.

@ref{2181,,Availability}: Linux >= 3.17.


Added in version 3.6.

@end deffn

@geindex urandom() (in module os)
@anchor{library/os os urandom}@anchor{747}
@deffn {Function} os.urandom (size, /)

Return a bytestring of `size' random bytes suitable for cryptographic use.

This function returns random bytes from an OS-specific randomness source.  The
returned data should be unpredictable enough for cryptographic applications,
though its exact quality depends on the OS implementation.

On Linux, if the @code{getrandom()} syscall is available, it is used in
blocking mode: block until the system urandom entropy pool is initialized
(128 bits of entropy are collected by the kernel). See the 
@geindex Python Enhancement Proposals; PEP 524
PEP 524@footnote{https://peps.python.org/pep-0524/} for
the rationale. On Linux, the @ref{ebf,,getrandom()} function can be used to get
random bytes in non-blocking mode (using the @ref{3174,,GRND_NONBLOCK} flag) or
to poll until the system urandom entropy pool is initialized.

On a Unix-like system, random bytes are read from the @code{/dev/urandom}
device. If the @code{/dev/urandom} device is not available or not readable, the
@ref{369,,NotImplementedError} exception is raised.

On Windows, it will use @code{BCryptGenRandom()}.


@subsubheading See also


The @ref{c5,,secrets} module provides higher level functions. For an
easy-to-use interface to the random number generator provided by your
platform, please see @ref{2bc9,,random.SystemRandom}.



Changed in version 3.5: On Linux 3.17 and newer, the @code{getrandom()} syscall is now used
when available.  On OpenBSD 5.6 and newer, the C @code{getentropy()}
function is now used. These functions avoid the usage of an internal file
descriptor.



Changed in version 3.5.2: On Linux, if the @code{getrandom()} syscall blocks (the urandom entropy pool
is not initialized yet), fall back on reading @code{/dev/urandom}.



Changed in version 3.6: On Linux, @code{getrandom()} is now used in blocking mode to increase the
security.



Changed in version 3.11: On Windows, @code{BCryptGenRandom()} is used instead of @code{CryptGenRandom()}
which is deprecated.

@end deffn

@geindex GRND_NONBLOCK (in module os)
@anchor{library/os os GRND_NONBLOCK}@anchor{3174}
@deffn {Data} os.GRND_NONBLOCK

By  default, when reading from @code{/dev/random}, @ref{ebf,,getrandom()} blocks if
no random bytes are available, and when reading from @code{/dev/urandom}, it blocks
if the entropy pool has not yet been initialized.

If the @code{GRND_NONBLOCK} flag is set, then @ref{ebf,,getrandom()} does not
block in these cases, but instead immediately raises @ref{237,,BlockingIOError}.


Added in version 3.6.

@end deffn

@geindex GRND_RANDOM (in module os)
@anchor{library/os os GRND_RANDOM}@anchor{3173}
@deffn {Data} os.GRND_RANDOM

If  this  bit  is  set,  then  random bytes are drawn from the
@code{/dev/random} pool instead of the @code{/dev/urandom} pool.


Added in version 3.6.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node io — Core tools for working with streams,time — Time access and conversions,os — Miscellaneous operating system interfaces,Generic Operating System Services
@anchor{library/io doc}@anchor{3175}@anchor{library/io io-core-tools-for-working-with-streams}@anchor{3176}@anchor{library/io module-io}@anchor{83}@anchor{library/io translation-repo}@anchor{3177}
@subsection @code{io} — Core tools for working with streams


@geindex module; io

`Source code:' Lib/io.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/io.py}


__________________________________________________________________


@menu
* Overview: Overview<2>. 
* Text Encoding:: 
* High-level Module Interface:: 
* Class hierarchy:: 
* Static Typing:: 
* Performance: Performance<3>. 

@end menu

@node Overview<2>,Text Encoding,,io — Core tools for working with streams
@anchor{library/io io-overview}@anchor{2621}@anchor{library/io overview}@anchor{3178}
@subsubsection Overview


@geindex file object; io module

The @code{io} module provides Python’s main facilities for dealing with various
types of I/O.  There are three main types of I/O: `text I/O', `binary I/O'
and `raw I/O'.  These are generic categories, and various backing stores can
be used for each of them.  A concrete object belonging to any of these
categories is called a @ref{13cf,,file object}.  Other common terms are `stream'
and `file-like object'.

Independent of its category, each concrete stream object will also have
various capabilities: it can be read-only, write-only, or read-write. It can
also allow arbitrary random access (seeking forwards or backwards to any
location), or only sequential access (for example in the case of a socket or
pipe).

All streams are careful about the type of data you give to them.  For example
giving a @ref{16a,,str} object to the @code{write()} method of a binary stream
will raise a @ref{199,,TypeError}.  So will giving a @ref{193,,bytes} object to the
@code{write()} method of a text stream.


Changed in version 3.3: Operations that used to raise @ref{1259,,IOError} now raise @ref{2c2,,OSError}, since
@code{IOError} is now an alias of @code{OSError}.


@menu
* Text I/O:: 
* Binary I/O:: 
* Raw I/O:: 

@end menu

@node Text I/O,Binary I/O,,Overview<2>
@anchor{library/io text-i-o}@anchor{3179}@anchor{library/io text-io}@anchor{317a}
@subsubsection Text I/O


Text I/O expects and produces @ref{16a,,str} objects.  This means that whenever
the backing store is natively made of bytes (such as in the case of a file),
encoding and decoding of data is made transparently as well as optional
translation of platform-specific newline characters.

The easiest way to create a text stream is with @ref{318,,open()}, optionally
specifying an encoding:

@example
f = open("myfile.txt", "r", encoding="utf-8")
@end example

In-memory text streams are also available as @ref{112f,,StringIO} objects:

@example
f = io.StringIO("some initial text data")
@end example

@cartouche
@quotation Note 
When working with a non-blocking stream, be aware that read operations on text I/O objects
might raise a @ref{237,,BlockingIOError} if the stream cannot perform the operation
immediately.
@end quotation
@end cartouche

The text stream API is described in detail in the documentation of
@ref{8a6,,TextIOBase}.

@node Binary I/O,Raw I/O,Text I/O,Overview<2>
@anchor{library/io binary-i-o}@anchor{317b}@anchor{library/io binary-io}@anchor{317c}
@subsubsection Binary I/O


Binary I/O (also called `buffered I/O') expects
@ref{194,,bytes-like objects} and produces @ref{193,,bytes}
objects.  No encoding, decoding, or newline translation is performed.  This
category of streams can be used for all kinds of non-text data, and also when
manual control over the handling of text data is desired.

The easiest way to create a binary stream is with @ref{318,,open()} with @code{'b'} in
the mode string:

@example
f = open("myfile.jpg", "rb")
@end example

In-memory binary streams are also available as @ref{10aa,,BytesIO} objects:

@example
f = io.BytesIO(b"some initial binary data: \x00\x01")
@end example

The binary stream API is described in detail in the docs of
@ref{8a5,,BufferedIOBase}.

Other library modules may provide additional ways to create text or binary
streams.  See @ref{13ab,,socket.socket.makefile()} for example.

@node Raw I/O,,Binary I/O,Overview<2>
@anchor{library/io raw-i-o}@anchor{317d}
@subsubsection Raw I/O


Raw I/O (also called `unbuffered I/O') is generally used as a low-level
building-block for binary and text streams; it is rarely useful to directly
manipulate a raw stream from user code.  Nevertheless, you can create a raw
stream by opening a file in binary mode with buffering disabled:

@example
f = open("myfile.jpg", "rb", buffering=0)
@end example

The raw stream API is described in detail in the docs of @ref{12dc,,RawIOBase}.

@cartouche
@quotation Warning 
Raw I/O is a low-level interface and methods generally must have their return
values checked and be explicitly retried to ensure an operation completes.
For instance @ref{15b7,,write()} returns the number of bytes written
which may be less than the number of bytes provided (a partial write).
High-level I/O objects like @ref{317c,,Binary I/O} and @ref{317a,,Text I/O} implement
retry behavior.
@end quotation
@end cartouche

@node Text Encoding,High-level Module Interface,Overview<2>,io — Core tools for working with streams
@anchor{library/io io-text-encoding}@anchor{9c6}@anchor{library/io text-encoding}@anchor{317e}
@subsubsection Text Encoding


The default encoding of @ref{9c4,,TextIOWrapper} and @ref{318,,open()} is
locale-specific (@ref{867,,locale.getencoding()}).

However, many developers forget to specify the encoding when opening text files
encoded in UTF-8 (e.g. JSON, TOML, Markdown, etc…) since most Unix
platforms use UTF-8 locale by default. This causes bugs because the locale
encoding is not UTF-8 for most Windows users. For example:

@example
# May not work on Windows when non-ASCII characters in the file.
with open("README.md") as f:
    long_description = f.read()
@end example

Accordingly, it is highly recommended that you specify the encoding
explicitly when opening text files. If you want to use UTF-8, pass
@code{encoding="utf-8"}. To use the current locale encoding,
@code{encoding="locale"} is supported since Python 3.10.


@subsubheading See also



@table @asis

@item @ref{868,,Python UTF-8 Mode}

Python UTF-8 Mode can be used to change the default encoding to
UTF-8 from locale-specific encoding.

@geindex Python Enhancement Proposals; PEP 686

@item PEP 686@footnote{https://peps.python.org/pep-0686/}

Python 3.15 will make @ref{868,,Python UTF-8 Mode} default.
@end table


@menu
* Opt-in EncodingWarning:: 

@end menu

@node Opt-in EncodingWarning,,,Text Encoding
@anchor{library/io io-encoding-warning}@anchor{2182}@anchor{library/io opt-in-encodingwarning}@anchor{317f}
@subsubsection Opt-in EncodingWarning



Added in version 3.10: See 
@geindex Python Enhancement Proposals; PEP 597
PEP 597@footnote{https://peps.python.org/pep-0597/} for more details.


To find where the default locale encoding is used, you can enable
the @ref{170,,-X warn_default_encoding} command line option or set the
@geindex PYTHONWARNDEFAULTENCODING
@geindex environment variable; PYTHONWARNDEFAULTENCODING
@ref{9c5,,PYTHONWARNDEFAULTENCODING} environment variable, which will
emit an @ref{2171,,EncodingWarning} when the default encoding is used.

If you are providing an API that uses @ref{318,,open()} or
@ref{9c4,,TextIOWrapper} and passes @code{encoding=None} as a parameter, you
can use @ref{1a83,,text_encoding()} so that callers of the API will emit an
@ref{2171,,EncodingWarning} if they don’t pass an @code{encoding}. However,
please consider using UTF-8 by default (i.e. @code{encoding="utf-8"}) for
new APIs.

@node High-level Module Interface,Class hierarchy,Text Encoding,io — Core tools for working with streams
@anchor{library/io high-level-module-interface}@anchor{3180}
@subsubsection High-level Module Interface


@geindex DEFAULT_BUFFER_SIZE (in module io)
@anchor{library/io io DEFAULT_BUFFER_SIZE}@anchor{1a84}
@deffn {Data} io.DEFAULT_BUFFER_SIZE

An int containing the default buffer size used by the module’s buffered I/O
classes.  @ref{318,,open()} uses the file’s blksize (as obtained by
@ref{26f,,os.stat()}) if possible.
@end deffn

@geindex open() (in module io)
@anchor{library/io io open}@anchor{741}
@deffn {Function} io.open (file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

This is an alias for the builtin @code{open()} function.


This function raises an @ref{1cb1,,auditing event} @code{open} with
arguments `path', `mode' and `flags'. The `mode' and `flags'
arguments may have been modified or inferred from the original call.

@end deffn

@geindex open_code() (in module io)
@anchor{library/io io open_code}@anchor{17a5}
@deffn {Function} io.open_code (path)

Opens the provided file with mode @code{'rb'}. This function should be used
when the intent is to treat the contents as executable code.

`path' should be a @ref{16a,,str} and an absolute path.

The behavior of this function may be overridden by an earlier call to the
@ref{1ae0,,PyFile_SetOpenCodeHook()}. However, assuming that `path' is a
@ref{16a,,str} and an absolute path, @code{open_code(path)} should always behave
the same as @code{open(path, 'rb')}. Overriding the behavior is intended for
additional validation or preprocessing of the file.


Added in version 3.8.

@end deffn

@geindex text_encoding() (in module io)
@anchor{library/io io text_encoding}@anchor{1a83}
@deffn {Function} io.text_encoding (encoding, stacklevel=2, /)

This is a helper function for callables that use @ref{318,,open()} or
@ref{9c4,,TextIOWrapper} and have an @code{encoding=None} parameter.

This function returns `encoding' if it is not @code{None}.
Otherwise, it returns @code{"locale"} or @code{"utf-8"} depending on
@ref{868,,UTF-8 Mode}.

This function emits an @ref{2171,,EncodingWarning} if
@ref{89e,,sys.flags.warn_default_encoding} is true and `encoding'
is @code{None}. `stacklevel' specifies where the warning is emitted.
For example:

@example
def read_text(path, encoding=None):
    encoding = io.text_encoding(encoding)  # stacklevel=2
    with open(path, encoding) as f:
        return f.read()
@end example

In this example, an @ref{2171,,EncodingWarning} is emitted for the caller of
@code{read_text()}.

See @ref{9c6,,Text Encoding} for more information.


Added in version 3.10.



Changed in version 3.11: @code{text_encoding()} returns “utf-8” when UTF-8 mode is enabled and
`encoding' is @code{None}.

@end deffn

@geindex BlockingIOError
@anchor{library/io io BlockingIOError}@anchor{3181}
@deffn {Exception} io.BlockingIOError

This is a compatibility alias for the builtin @code{BlockingIOError}
exception.
@end deffn

@geindex UnsupportedOperation
@anchor{library/io io UnsupportedOperation}@anchor{1dc3}
@deffn {Exception} io.UnsupportedOperation

An exception inheriting @ref{2c2,,OSError} and @ref{2ee,,ValueError} that is raised
when an unsupported operation is called on a stream.
@end deffn


@subsubheading See also



@table @asis

@item @ref{df,,sys}

contains the standard IO streams: @ref{760,,sys.stdin}, @ref{cd3,,sys.stdout},
and @ref{b39,,sys.stderr}.
@end table


@node Class hierarchy,Static Typing,High-level Module Interface,io — Core tools for working with streams
@anchor{library/io class-hierarchy}@anchor{3182}
@subsubsection Class hierarchy


The implementation of I/O streams is organized as a hierarchy of classes.  First
@ref{13c2,,abstract base classes} (ABCs), which are used to
specify the various categories of streams, then concrete classes providing the
standard stream implementations.

@cartouche
@quotation Note 
The abstract base classes also provide default implementations of some
methods in order to help implementation of concrete stream classes.  For
example, @ref{8a5,,BufferedIOBase} provides unoptimized implementations of
@code{readinto()} and @code{readline()}.
@end quotation
@end cartouche

At the top of the I/O hierarchy is the abstract base class @ref{506,,IOBase}.  It
defines the basic interface to a stream.  Note, however, that there is no
separation between reading and writing to streams; implementations are allowed
to raise @ref{1dc3,,UnsupportedOperation} if they do not support a given operation.

The @ref{12dc,,RawIOBase} ABC extends @ref{506,,IOBase}.  It deals with the reading
and writing of bytes to a stream.  @ref{151b,,FileIO} subclasses @code{RawIOBase}
to provide an interface to files in the machine’s file system.

The @ref{8a5,,BufferedIOBase} ABC extends @ref{506,,IOBase}.  It deals with
buffering on a raw binary stream (@ref{12dc,,RawIOBase}).  Its subclasses,
@ref{15bd,,BufferedWriter}, @ref{141a,,BufferedReader}, and @ref{15bf,,BufferedRWPair}
buffer raw binary streams that are writable, readable, and both readable and writable,
respectively. @ref{15be,,BufferedRandom} provides a buffered interface to seekable streams.
Another @code{BufferedIOBase} subclass, @ref{10aa,,BytesIO}, is a stream of
in-memory bytes.

The @ref{8a6,,TextIOBase} ABC extends @ref{506,,IOBase}.  It deals with
streams whose bytes represent text, and handles encoding and decoding to and
from strings.  @ref{9c4,,TextIOWrapper}, which extends @code{TextIOBase}, is a buffered text
interface to a buffered raw stream (@ref{8a5,,BufferedIOBase}).  Finally,
@ref{112f,,StringIO} is an in-memory stream for text.

Argument names are not part of the specification, and only the arguments of
@ref{318,,open()} are intended to be used as keyword arguments.

The following table summarizes the ABCs provided by the @code{io} module:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

ABC

@tab

Inherits

@tab

Stub Methods

@tab

Mixin Methods and Properties

@item

@ref{506,,IOBase}

@tab

@tab

@code{fileno}, @code{seek},
and @code{truncate}

@tab

@code{close}, @code{closed}, @code{__enter__},
@code{__exit__}, @code{flush}, @code{isatty}, @code{__iter__},
@code{__next__}, @code{readable}, @code{readline},
@code{readlines}, @code{seekable}, @code{tell},
@code{writable}, and @code{writelines}

@item

@ref{12dc,,RawIOBase}

@tab

@ref{506,,IOBase}

@tab

@code{readinto} and
@code{write}

@tab

Inherited @ref{506,,IOBase} methods, @code{read},
and @code{readall}

@item

@ref{8a5,,BufferedIOBase}

@tab

@ref{506,,IOBase}

@tab

@code{detach}, @code{read},
@code{read1}, and @code{write}

@tab

Inherited @ref{506,,IOBase} methods, @code{readinto},
and @code{readinto1}

@item

@ref{8a6,,TextIOBase}

@tab

@ref{506,,IOBase}

@tab

@code{detach}, @code{read},
@code{readline}, and
@code{write}

@tab

Inherited @ref{506,,IOBase} methods, @code{encoding},
@code{errors}, and @code{newlines}

@end multitable


@menu
* I/O Base Classes:: 
* Raw File I/O:: 
* Buffered Streams:: 
* Text I/O: Text I/O<2>. 

@end menu

@node I/O Base Classes,Raw File I/O,,Class hierarchy
@anchor{library/io i-o-base-classes}@anchor{3183}
@subsubsection I/O Base Classes


@geindex IOBase (class in io)
@anchor{library/io io IOBase}@anchor{506}
@deffn {Class} io.IOBase

The abstract base class for all I/O classes.

This class provides empty abstract implementations for many methods
that derived classes can override selectively; the default
implementations represent a file that cannot be read, written or
seeked.

Even though @code{IOBase} does not declare @code{read()}
or @code{write()} because their signatures will vary, implementations and
clients should consider those methods part of the interface.  Also,
implementations may raise a @ref{2ee,,ValueError} (or @ref{1dc3,,UnsupportedOperation})
when operations they do not support are called.

The basic type used for binary data read from or written to a file is
@ref{193,,bytes}.  Other @ref{194,,bytes-like objects} are
accepted as method arguments too.  Text I/O classes work with @ref{16a,,str} data.

Note that calling any method (even inquiries) on a closed stream is
undefined.  Implementations may raise @ref{2ee,,ValueError} in this case.

@code{IOBase} (and its subclasses) supports the iterator protocol, meaning
that an @code{IOBase} object can be iterated over yielding the lines in a
stream.  Lines are defined slightly differently depending on whether the
stream is a binary stream (yielding bytes), or a text stream (yielding
character strings).  See @ref{1535,,readline()} below.

@code{IOBase} is also a context manager and therefore supports the
@ref{187,,with} statement.  In this example, `file' is closed after the
@code{with} statement’s suite is finished—even if an exception occurs:

@example
with open('spam.txt', 'w') as file:
    file.write('Spam and eggs!')
@end example

@code{IOBase} provides these data attributes and methods:

@geindex close() (io.IOBase method)
@anchor{library/io io IOBase close}@anchor{507}
@deffn {Method} close ()

Flush and close this stream. This method has no effect if the file is
already closed. Once the file is closed, any operation on the file
(e.g. reading or writing) will raise a @ref{2ee,,ValueError}.

As a convenience, it is allowed to call this method more than once;
only the first call, however, will have an effect.
@end deffn

@geindex closed (io.IOBase attribute)
@anchor{library/io io IOBase closed}@anchor{1e51}
@deffn {Attribute} closed

@code{True} if the stream is closed.
@end deffn

@geindex fileno() (io.IOBase method)
@anchor{library/io io IOBase fileno}@anchor{17fe}
@deffn {Method} fileno ()

Return the underlying file descriptor (an integer) of the stream if it
exists.  An @ref{2c2,,OSError} is raised if the IO object does not use a file
descriptor.
@end deffn

@geindex flush() (io.IOBase method)
@anchor{library/io io IOBase flush}@anchor{2d57}
@deffn {Method} flush ()

Flush the write buffers of the stream if applicable.  This does nothing
for read-only and non-blocking streams.
@end deffn

@geindex isatty() (io.IOBase method)
@anchor{library/io io IOBase isatty}@anchor{20ad}
@deffn {Method} isatty ()

Return @code{True} if the stream is interactive (i.e., connected to
a terminal/tty device).
@end deffn

@geindex readable() (io.IOBase method)
@anchor{library/io io IOBase readable}@anchor{15b9}
@deffn {Method} readable ()

Return @code{True} if the stream can be read from.
If @code{False}, @code{read()} will raise @ref{2c2,,OSError}.
@end deffn

@geindex readline() (io.IOBase method)
@anchor{library/io io IOBase readline}@anchor{1535}
@deffn {Method} readline (size=-1, /)

Read and return one line from the stream.  If `size' is specified, at
most `size' bytes will be read.

The line terminator is always @code{b'\n'} for binary files; for text files,
the `newline' argument to @ref{318,,open()} can be used to select the line
terminator(s) recognized.
@end deffn

@geindex readlines() (io.IOBase method)
@anchor{library/io io IOBase readlines}@anchor{280b}
@deffn {Method} readlines (hint=-1, /)

Read and return a list of lines from the stream.  `hint' can be specified
to control the number of lines read: no more lines will be read if the
total size (in bytes/characters) of all lines so far exceeds `hint'.

`hint' values of @code{0} or less, as well as @code{None}, are treated as no
hint.

Note that it’s already possible to iterate on file objects using @code{for
line in file: ...} without calling @code{file.readlines()}.
@end deffn

@geindex seek() (io.IOBase method)
@anchor{library/io io IOBase seek}@anchor{1498}
@deffn {Method} seek (offset, whence=os.SEEK_SET, /)

Change the stream position to the given byte `offset',
interpreted relative to the position indicated by `whence',
and return the new absolute position.
Values for `whence' are:


@itemize *

@item 
@ref{1499,,os.SEEK_SET} or @code{0} – start of the stream (the default);
`offset' should be zero or positive

@item 
@ref{149a,,os.SEEK_CUR} or @code{1} – current stream position;
`offset' may be negative

@item 
@ref{149b,,os.SEEK_END} or @code{2} – end of the stream;
`offset' is usually negative
@end itemize


Added in version 3.1: The @code{SEEK_*} constants.



Added in version 3.3: Some operating systems could support additional values, like
@ref{30b1,,os.SEEK_HOLE} or @ref{30b2,,os.SEEK_DATA}. The valid values
for a file could depend on it being open in text or binary mode.

@end deffn

@geindex seekable() (io.IOBase method)
@anchor{library/io io IOBase seekable}@anchor{15bb}
@deffn {Method} seekable ()

Return @code{True} if the stream supports random access.  If @code{False},
@ref{1498,,seek()}, @ref{15b8,,tell()} and @ref{151c,,truncate()} will raise @ref{2c2,,OSError}.
@end deffn

@geindex tell() (io.IOBase method)
@anchor{library/io io IOBase tell}@anchor{15b8}
@deffn {Method} tell ()

Return the current stream position.
@end deffn

@geindex truncate() (io.IOBase method)
@anchor{library/io io IOBase truncate}@anchor{151c}
@deffn {Method} truncate (size=None, /)

Resize the stream to the given `size' in bytes (or the current position
if `size' is not specified).  The current stream position isn’t changed.
This resizing can extend or reduce the current file size.  In case of
extension, the contents of the new file area depend on the platform
(on most systems, additional bytes are zero-filled).  The new file size
is returned.


Changed in version 3.5: Windows will now zero-fill files when extending.

@end deffn

@geindex writable() (io.IOBase method)
@anchor{library/io io IOBase writable}@anchor{15ba}
@deffn {Method} writable ()

Return @code{True} if the stream supports writing.  If @code{False},
@code{write()} and @ref{151c,,truncate()} will raise @ref{2c2,,OSError}.
@end deffn

@geindex writelines() (io.IOBase method)
@anchor{library/io io IOBase writelines}@anchor{17cc}
@deffn {Method} writelines (lines, /)

Write a list of lines to the stream.  Line separators are not added, so it
is usual for each of the lines provided to have a line separator at the
end.
@end deffn

@geindex __del__() (io.IOBase method)
@anchor{library/io io IOBase __del__}@anchor{3184}
@deffn {Method} __del__ ()

Prepare for object destruction. @code{IOBase} provides a default
implementation of this method that calls the instance’s
@ref{507,,close()} method.
@end deffn
@end deffn

@geindex RawIOBase (class in io)
@anchor{library/io io RawIOBase}@anchor{12dc}
@deffn {Class} io.RawIOBase

Base class for raw binary streams.  It inherits from @ref{506,,IOBase}.

Raw binary streams typically provide low-level access to an underlying OS
device or API, and do not try to encapsulate it in high-level primitives
(this functionality is done at a higher-level in buffered binary streams and text streams, described later
in this page).

@code{RawIOBase} provides these methods in addition to those from
@ref{506,,IOBase}:

@geindex read() (io.RawIOBase method)
@anchor{library/io io RawIOBase read}@anchor{1023}
@deffn {Method} read (size=-1, /)

Read up to `size' bytes from the object and return them.  As a convenience,
if `size' is unspecified or -1, all bytes until EOF are returned.

Attempts to make only one system call but will retry if interrupted and
the signal handler does not raise an exception (see 
@geindex Python Enhancement Proposals; PEP 475
PEP 475@footnote{https://peps.python.org/pep-0475/} for the
rationale). This means fewer than `size' bytes may be returned if the
operating system call returns fewer than `size' bytes.

If 0 bytes are returned, and `size' was not 0, this indicates end of file.
If the object is in non-blocking mode and no bytes are available,
@code{None} is returned.

The default implementation defers to @ref{3185,,readall()} and
@ref{1024,,readinto()}.
@end deffn

@geindex readall() (io.RawIOBase method)
@anchor{library/io io RawIOBase readall}@anchor{3185}
@deffn {Method} readall ()

Read and return all the bytes from the stream until EOF, using multiple
calls to the stream if necessary.

If @code{0} bytes are returned this indicates end of file. If the object is in
non-blocking mode and the underlying @ref{1023,,read()} returns @code{None}
indicating no bytes are available, @code{None} is returned.
@end deffn

@geindex readinto() (io.RawIOBase method)
@anchor{library/io io RawIOBase readinto}@anchor{1024}
@deffn {Method} readinto (b, /)

Read bytes into a pre-allocated, writable
@ref{194,,bytes-like object} `b', and return the
number of bytes read.  For example, `b' might be a @ref{342,,bytearray}.

If @code{0} is returned and @code{len(b)} is not @code{0}, this indicates end of file. If
the object is in non-blocking mode and no bytes are available, @code{None} is
returned.
@end deffn

@geindex write() (io.RawIOBase method)
@anchor{library/io io RawIOBase write}@anchor{15b7}
@deffn {Method} write (b, /)

Write the given @ref{194,,bytes-like object}, `b', to the
underlying raw stream, and return the number of
bytes written.  This can be less than the length of `b' in
bytes, depending on specifics of the underlying raw
stream, and especially if it is in non-blocking mode.  @code{None} is
returned if the raw stream is set not to block and no single byte could
be readily written to it.  The caller may release or mutate `b' after
this method returns, so the implementation should only access `b'
during the method call.

@cartouche
@quotation Warning 
This function does not ensure all bytes are written or an exception is
thrown. Callers may implement that behavior by checking the return
value and, if it is less than the length of `b', looping with additional
write calls until all unwritten bytes are written. High-level I/O
objects like @ref{317c,,Binary I/O} and @ref{317a,,Text I/O} implement retry behavior.
@end quotation
@end cartouche
@end deffn
@end deffn

@geindex BufferedIOBase (class in io)
@anchor{library/io io BufferedIOBase}@anchor{8a5}
@deffn {Class} io.BufferedIOBase

Base class for binary streams that support some kind of buffering.
It inherits from @ref{506,,IOBase}.

The main difference with @ref{12dc,,RawIOBase} is that methods @ref{1534,,read()},
@ref{18dc,,readinto()} and @ref{edd,,write()} will try (respectively) to read
as much input as requested or to emit all provided data.

In addition, if the underlying raw stream is in non-blocking mode, when the
system returns would block @ref{edd,,write()} will raise @ref{237,,BlockingIOError}
with @ref{274a,,BlockingIOError.characters_written} and @ref{1534,,read()} will return
data read so far or @code{None} if no data is available.

Besides, the @ref{1534,,read()} method does not have a default
implementation that defers to @ref{18dc,,readinto()}.

A typical @code{BufferedIOBase} implementation should not inherit from a
@ref{12dc,,RawIOBase} implementation, but wrap one, like
@ref{15bd,,BufferedWriter} and @ref{141a,,BufferedReader} do.

@code{BufferedIOBase} provides or overrides these data attributes and
methods in addition to those from @ref{506,,IOBase}:

@geindex raw (io.BufferedIOBase attribute)
@anchor{library/io io BufferedIOBase raw}@anchor{15bc}
@deffn {Attribute} raw

The underlying raw stream (a @ref{12dc,,RawIOBase} instance) that
@code{BufferedIOBase} deals with.  This is not part of the
@code{BufferedIOBase} API and may not exist on some implementations.
@end deffn

@geindex detach() (io.BufferedIOBase method)
@anchor{library/io io BufferedIOBase detach}@anchor{2e5b}
@deffn {Method} detach ()

Separate the underlying raw stream from the buffer and return it.

After the raw stream has been detached, the buffer is in an unusable
state.

Some buffers, like @ref{10aa,,BytesIO}, do not have the concept of a single
raw stream to return from this method.  They raise
@ref{1dc3,,UnsupportedOperation}.


Added in version 3.1.

@end deffn

@geindex read() (io.BufferedIOBase method)
@anchor{library/io io BufferedIOBase read}@anchor{1534}
@deffn {Method} read (size=-1, /)

Read and return up to `size' bytes. If the argument is omitted, @code{None},
or negative read as much as possible.

Fewer bytes may be returned than requested. An empty @ref{193,,bytes} object
is returned if the stream is already at EOF. More than one read may be
made and calls may be retried if specific errors are encountered, see
@ref{f9b,,os.read()} and 
@geindex Python Enhancement Proposals; PEP 475
PEP 475@footnote{https://peps.python.org/pep-0475/} for more details. Less than size bytes
being returned does not imply that EOF is imminent.

When reading as much as possible the default implementation will use
@code{raw.readall} if available (which should implement
@ref{3185,,RawIOBase.readall()}), otherwise will read in a loop until read
returns @code{None}, an empty @ref{193,,bytes}, or a non-retryable error. For
most streams this is to EOF, but for non-blocking streams more data may
become available.

@cartouche
@quotation Note 
When the underlying raw stream is non-blocking, implementations may
either raise @ref{237,,BlockingIOError} or return @code{None} if no data is
available. @code{io} implementations return @code{None}.
@end quotation
@end cartouche
@end deffn

@geindex read1() (io.BufferedIOBase method)
@anchor{library/io io BufferedIOBase read1}@anchor{2ec6}
@deffn {Method} read1 (size=-1, /)

Read and return up to `size' bytes, calling @ref{1024,,readinto()}
which may retry if @ref{f8d,,EINTR} is encountered per
@geindex Python Enhancement Proposals; PEP 475
PEP 475@footnote{https://peps.python.org/pep-0475/}. If `size' is @code{-1} or not provided, the implementation will
choose an arbitrary value for `size'.

@cartouche
@quotation Note 
When the underlying raw stream is non-blocking, implementations may
either raise @ref{237,,BlockingIOError} or return @code{None} if no data is
available. @code{io} implementations return @code{None}.
@end quotation
@end cartouche
@end deffn

@geindex readinto() (io.BufferedIOBase method)
@anchor{library/io io BufferedIOBase readinto}@anchor{18dc}
@deffn {Method} readinto (b, /)

Read bytes into a pre-allocated, writable
@ref{194,,bytes-like object} `b' and return the number of bytes read.
For example, `b' might be a @ref{342,,bytearray}.

Like @ref{1534,,read()}, multiple reads may be issued to the underlying raw
stream, unless the latter is interactive.

A @ref{237,,BlockingIOError} is raised if the underlying raw stream is in non
blocking-mode, and has no data available at the moment.
@end deffn

@geindex readinto1() (io.BufferedIOBase method)
@anchor{library/io io BufferedIOBase readinto1}@anchor{1022}
@deffn {Method} readinto1 (b, /)

Read bytes into a pre-allocated, writable
@ref{194,,bytes-like object} `b', using at most one call to
the underlying raw stream’s @ref{1023,,read()} (or
@ref{1024,,readinto()}) method. Return the number of bytes read.

A @ref{237,,BlockingIOError} is raised if the underlying raw stream is in non
blocking-mode, and has no data available at the moment.


Added in version 3.5.

@end deffn

@geindex write() (io.BufferedIOBase method)
@anchor{library/io io BufferedIOBase write}@anchor{edd}
@deffn {Method} write (b, /)

Write the given @ref{194,,bytes-like object}, `b', and return the number
of bytes written (always equal to the length of `b' in bytes, since if
the write fails an @ref{2c2,,OSError} will be raised).  Depending on the
actual implementation, these bytes may be readily written to the
underlying stream, or held in a buffer for performance and latency
reasons.

When in non-blocking mode, a @ref{237,,BlockingIOError} is raised if the
data needed to be written to the raw stream but it couldn’t accept
all the data without blocking.

The caller may release or mutate `b' after this method returns,
so the implementation should only access `b' during the method call.
@end deffn
@end deffn

@node Raw File I/O,Buffered Streams,I/O Base Classes,Class hierarchy
@anchor{library/io raw-file-i-o}@anchor{3186}
@subsubsection Raw File I/O


@geindex FileIO (class in io)
@anchor{library/io io FileIO}@anchor{151b}
@deffn {Class} io.FileIO (name, mode='r', closefd=True, opener=None)

A raw binary stream representing an OS-level file containing bytes data.  It
inherits from @ref{12dc,,RawIOBase} and implements its low-level access design.
This means @ref{15b7,,write()} does not guarantee all bytes are written
and @ref{1023,,read()} may read less bytes than requested even when more
bytes may be present in the underlying file. To get “write all” and
“read at least” behavior, use @ref{317c,,Binary I/O}.

The `name' can be one of two things:


@itemize *

@item 
a character string or @ref{193,,bytes} object representing the path to the
file which will be opened. In this case closefd must be @code{True} (the default)
otherwise an error will be raised.

@item 
an integer representing the number of an existing OS-level file descriptor
to which the resulting @code{FileIO} object will give access. When the
FileIO object is closed this fd will be closed as well, unless `closefd'
is set to @code{False}.
@end itemize

The `mode' can be @code{'r'}, @code{'w'}, @code{'x'} or @code{'a'} for reading
(default), writing, exclusive creation or appending. The file will be
created if it doesn’t exist when opened for writing or appending; it will be
truncated when opened for writing. @ref{1226,,FileExistsError} will be raised if
it already exists when opened for creating. Opening a file for creating
implies writing, so this mode behaves in a similar way to @code{'w'}. Add a
@code{'+'} to the mode to allow simultaneous reading and writing.

A custom opener can be used by passing a callable as `opener'. The underlying
file descriptor for the file object is then obtained by calling `opener' with
(`name', `flags'). `opener' must return an open file descriptor (passing
@ref{f98,,os.open} as `opener' results in functionality similar to passing
@code{None}).

The newly created file is @ref{1102,,non-inheritable}.

See the @ref{318,,open()} built-in function for examples on using the `opener'
parameter.

@cartouche
@quotation Warning 
@code{FileIO} is a low-level I/O object and members, such as
@ref{1023,,read()} and @ref{15b7,,write()}, need to have their
return values checked explicitly in a retry loop to implement “write all”
and “read at least” behavior. High-level I/O objects @ref{317c,,Binary I/O} and
@ref{317a,,Text I/O} implement retry behavior.
@end quotation
@end cartouche


Changed in version 3.3: The `opener' parameter was added.
The @code{'x'} mode was added.



Changed in version 3.4: The file is now non-inheritable.


@code{FileIO} provides these data attributes in addition to those from
@ref{12dc,,RawIOBase} and @ref{506,,IOBase}:

@geindex mode (io.FileIO attribute)
@anchor{library/io io FileIO mode}@anchor{3187}
@deffn {Attribute} mode

The mode as given in the constructor.
@end deffn

@geindex name (io.FileIO attribute)
@anchor{library/io io FileIO name}@anchor{2e5f}
@deffn {Attribute} name

The file name.  This is the file descriptor of the file when no name is
given in the constructor.
@end deffn
@end deffn

@node Buffered Streams,Text I/O<2>,Raw File I/O,Class hierarchy
@anchor{library/io buffered-streams}@anchor{3188}
@subsubsection Buffered Streams


Buffered I/O streams provide a higher-level interface to an I/O device
than raw I/O does.

@geindex BytesIO (class in io)
@anchor{library/io io BytesIO}@anchor{10aa}
@deffn {Class} io.BytesIO (initial_bytes=b'@w{'})

A binary stream using an in-memory bytes buffer.  It inherits from
@ref{8a5,,BufferedIOBase}.  The buffer is discarded when the
@ref{507,,close()} method is called.

The optional argument `initial_bytes' is a @ref{194,,bytes-like object} that
contains initial data.

@code{BytesIO} provides or overrides these methods in addition to those
from @ref{8a5,,BufferedIOBase} and @ref{506,,IOBase}:

@geindex getbuffer() (io.BytesIO method)
@anchor{library/io io BytesIO getbuffer}@anchor{13fd}
@deffn {Method} getbuffer ()

Return a readable and writable view over the contents of the buffer
without copying them.  Also, mutating the view will transparently
update the contents of the buffer:

@example
>>> b = io.BytesIO(b"abcdef")
>>> view = b.getbuffer()
>>> view[2:4] = b"56"
>>> b.getvalue()
b'ab56ef'
@end example

@cartouche
@quotation Note 
As long as the view exists, the @code{BytesIO} object cannot be
resized or closed.
@end quotation
@end cartouche


Added in version 3.2.

@end deffn

@geindex getvalue() (io.BytesIO method)
@anchor{library/io io BytesIO getvalue}@anchor{2ec4}
@deffn {Method} getvalue ()

Return @ref{193,,bytes} containing the entire contents of the buffer.
@end deffn

@geindex read1() (io.BytesIO method)
@anchor{library/io io BytesIO read1}@anchor{3189}
@deffn {Method} read1 (size=-1, /)

In @code{BytesIO}, this is the same as @ref{1534,,read()}.


Changed in version 3.7: The `size' argument is now optional.

@end deffn

@geindex readinto1() (io.BytesIO method)
@anchor{library/io io BytesIO readinto1}@anchor{318a}
@deffn {Method} readinto1 (b, /)

In @code{BytesIO}, this is the same as @ref{18dc,,readinto()}.


Added in version 3.5.

@end deffn
@end deffn

@geindex BufferedReader (class in io)
@anchor{library/io io BufferedReader}@anchor{141a}
@deffn {Class} io.BufferedReader (raw, buffer_size=DEFAULT_BUFFER_SIZE)

A buffered binary stream providing higher-level access to a readable, non
seekable @ref{12dc,,RawIOBase} raw binary stream.  It inherits from
@ref{8a5,,BufferedIOBase}.

When reading data from this object, a larger amount of data may be
requested from the underlying raw stream, and kept in an internal buffer.
The buffered data can then be returned directly on subsequent reads.

The constructor creates a @code{BufferedReader} for the given readable
`raw' stream and `buffer_size'.  If `buffer_size' is omitted,
@ref{1a84,,DEFAULT_BUFFER_SIZE} is used.

@code{BufferedReader} provides or overrides these methods in addition to
those from @ref{8a5,,BufferedIOBase} and @ref{506,,IOBase}:

@geindex peek() (io.BufferedReader method)
@anchor{library/io io BufferedReader peek}@anchor{318b}
@deffn {Method} peek (size=0, /)

Return bytes from the stream without advancing the position. The number of
bytes returned may be less or more than requested. If the underlying raw
stream is non-blocking and the operation would block, returns empty bytes.
@end deffn

@geindex read() (io.BufferedReader method)
@anchor{library/io io BufferedReader read}@anchor{318c}
@deffn {Method} read (size=-1, /)

In @code{BufferedReader} this is the same as @ref{1534,,io.BufferedIOBase.read()}
@end deffn

@geindex read1() (io.BufferedReader method)
@anchor{library/io io BufferedReader read1}@anchor{318d}
@deffn {Method} read1 (size=-1, /)

In @code{BufferedReader} this is the same as @ref{2ec6,,io.BufferedIOBase.read1()}


Changed in version 3.7: The `size' argument is now optional.

@end deffn
@end deffn

@geindex BufferedWriter (class in io)
@anchor{library/io io BufferedWriter}@anchor{15bd}
@deffn {Class} io.BufferedWriter (raw, buffer_size=DEFAULT_BUFFER_SIZE)

A buffered binary stream providing higher-level access to a writeable, non
seekable @ref{12dc,,RawIOBase} raw binary stream.  It inherits from
@ref{8a5,,BufferedIOBase}.

When writing to this object, data is normally placed into an internal
buffer.  The buffer will be written out to the underlying @ref{12dc,,RawIOBase}
object under various conditions, including:


@itemize *

@item 
when the buffer gets too small for all pending data;

@item 
when @ref{318e,,flush()} is called;

@item 
when a @ref{1498,,seek()} is requested (for @ref{15be,,BufferedRandom} objects);

@item 
when the @code{BufferedWriter} object is closed or destroyed.
@end itemize

The constructor creates a @code{BufferedWriter} for the given writeable
`raw' stream.  If the `buffer_size' is not given, it defaults to
@ref{1a84,,DEFAULT_BUFFER_SIZE}.

@code{BufferedWriter} provides or overrides these methods in addition to
those from @ref{8a5,,BufferedIOBase} and @ref{506,,IOBase}:

@geindex flush() (io.BufferedWriter method)
@anchor{library/io io BufferedWriter flush}@anchor{318e}
@deffn {Method} flush ()

Force bytes held in the buffer into the raw stream.  A
@ref{237,,BlockingIOError} should be raised if the raw stream blocks.
@end deffn

@geindex write() (io.BufferedWriter method)
@anchor{library/io io BufferedWriter write}@anchor{318f}
@deffn {Method} write (b, /)

Write the @ref{194,,bytes-like object}, `b', and return the
number of bytes written.  When in non-blocking mode, a
@ref{237,,BlockingIOError} with @ref{274a,,BlockingIOError.characters_written} set
is raised if the buffer needs to be written out but the raw stream blocks.
@end deffn
@end deffn

@geindex BufferedRandom (class in io)
@anchor{library/io io BufferedRandom}@anchor{15be}
@deffn {Class} io.BufferedRandom (raw, buffer_size=DEFAULT_BUFFER_SIZE)

A buffered binary stream implementing @ref{8a5,,BufferedIOBase} interfaces
providing higher-level access to a seekable @ref{12dc,,RawIOBase} raw binary
stream.

The constructor creates a reader and writer for a seekable raw stream, given
in the first argument.  If the `buffer_size' is omitted it defaults to
@ref{1a84,,DEFAULT_BUFFER_SIZE}.

@code{BufferedRandom} is capable of anything @ref{141a,,BufferedReader} or
@ref{15bd,,BufferedWriter} can do.  In addition, @ref{1498,,seek()} and
@ref{15b8,,tell()} are guaranteed to be implemented.
@end deffn

@geindex BufferedRWPair (class in io)
@anchor{library/io io BufferedRWPair}@anchor{15bf}
@deffn {Class} io.BufferedRWPair (reader, writer, buffer_size=DEFAULT_BUFFER_SIZE, /)

A buffered binary stream providing higher-level access to two non seekable
@ref{12dc,,RawIOBase} raw binary streams—one readable, the other writeable.
It inherits from @ref{8a5,,BufferedIOBase}.

`reader' and `writer' are @ref{12dc,,RawIOBase} objects that are readable and
writeable respectively.  If the `buffer_size' is omitted it defaults to
@ref{1a84,,DEFAULT_BUFFER_SIZE}.

@code{BufferedRWPair} implements all of @ref{8a5,,BufferedIOBase}'s methods
except for @ref{2e5b,,detach()}, which raises
@ref{1dc3,,UnsupportedOperation}.

@cartouche
@quotation Warning 
@code{BufferedRWPair} does not attempt to synchronize accesses to
its underlying raw streams.  You should not pass it the same object
as reader and writer; use @ref{15be,,BufferedRandom} instead.
@end quotation
@end cartouche
@end deffn

@node Text I/O<2>,,Buffered Streams,Class hierarchy
@anchor{library/io id1}@anchor{3190}
@subsubsection Text I/O


@geindex TextIOBase (class in io)
@anchor{library/io io TextIOBase}@anchor{8a6}
@deffn {Class} io.TextIOBase

Base class for text streams.  This class provides a character and line based
interface to stream I/O.  It inherits from @ref{506,,IOBase}.

@code{TextIOBase} provides or overrides these data attributes and
methods in addition to those from @ref{506,,IOBase}:

@geindex encoding (io.TextIOBase attribute)
@anchor{library/io io TextIOBase encoding}@anchor{3191}
@deffn {Attribute} encoding

The name of the encoding used to decode the stream’s bytes into
strings, and to encode strings into bytes.
@end deffn

@geindex errors (io.TextIOBase attribute)
@anchor{library/io io TextIOBase errors}@anchor{151a}
@deffn {Attribute} errors

The error setting of the decoder or encoder.
@end deffn

@geindex newlines (io.TextIOBase attribute)
@anchor{library/io io TextIOBase newlines}@anchor{3192}
@deffn {Attribute} newlines

A string, a tuple of strings, or @code{None}, indicating the newlines
translated so far.  Depending on the implementation and the initial
constructor flags, this may not be available.
@end deffn

@geindex buffer (io.TextIOBase attribute)
@anchor{library/io io TextIOBase buffer}@anchor{14af}
@deffn {Attribute} buffer

The underlying binary buffer (a @ref{8a5,,BufferedIOBase}
or @ref{12dc,,RawIOBase} instance) that @code{TextIOBase} deals with.
This is not part of the @code{TextIOBase} API and may not exist
in some implementations.
@end deffn

@geindex detach() (io.TextIOBase method)
@anchor{library/io io TextIOBase detach}@anchor{17d2}
@deffn {Method} detach ()

Separate the underlying binary buffer from the @code{TextIOBase} and
return it.

After the underlying buffer has been detached, the @code{TextIOBase} is
in an unusable state.

Some @code{TextIOBase} implementations, like @ref{112f,,StringIO}, may not
have the concept of an underlying buffer and calling this method will
raise @ref{1dc3,,UnsupportedOperation}.


Added in version 3.1.

@end deffn

@geindex read() (io.TextIOBase method)
@anchor{library/io io TextIOBase read}@anchor{20b0}
@deffn {Method} read (size=-1, /)

Read and return at most `size' characters from the stream as a single
@ref{16a,,str}.  If `size' is negative or @code{None}, reads until EOF.
@end deffn

@geindex readline() (io.TextIOBase method)
@anchor{library/io io TextIOBase readline}@anchor{20ea}
@deffn {Method} readline (size=-1, /)

Read until newline or EOF and return a single @ref{16a,,str}.  If the stream is
already at EOF, an empty string is returned.

If `size' is specified, at most `size' characters will be read.
@end deffn

@geindex seek() (io.TextIOBase method)
@anchor{library/io io TextIOBase seek}@anchor{3193}
@deffn {Method} seek (offset, whence=SEEK_SET, /)

Change the stream position to the given `offset'.  Behaviour depends on
the `whence' parameter.  The default value for `whence' is
@code{SEEK_SET}.


@itemize *

@item 
@code{SEEK_SET} or @code{0}: seek from the start of the stream
(the default); `offset' must either be a number returned by
@ref{3194,,TextIOBase.tell()}, or zero.  Any other `offset' value
produces undefined behaviour.

@item 
@code{SEEK_CUR} or @code{1}: “seek” to the current position;
`offset' must be zero, which is a no-operation (all other values
are unsupported).

@item 
@code{SEEK_END} or @code{2}: seek to the end of the stream;
`offset' must be zero (all other values are unsupported).
@end itemize

Return the new absolute position as an opaque number.


Added in version 3.1: The @code{SEEK_*} constants.

@end deffn

@geindex tell() (io.TextIOBase method)
@anchor{library/io io TextIOBase tell}@anchor{3194}
@deffn {Method} tell ()

Return the current stream position as an opaque number.  The number
does not usually represent a number of bytes in the underlying
binary storage.
@end deffn

@geindex write() (io.TextIOBase method)
@anchor{library/io io TextIOBase write}@anchor{209f}
@deffn {Method} write (s, /)

Write the string `s' to the stream and return the number of characters
written.
@end deffn
@end deffn

@geindex TextIOWrapper (class in io)
@anchor{library/io io TextIOWrapper}@anchor{9c4}
@deffn {Class} io.TextIOWrapper (buffer, encoding=None, errors=None, newline=None, line_buffering=False, write_through=False)

A buffered text stream providing higher-level access to a
@ref{8a5,,BufferedIOBase} buffered binary stream.  It inherits from
@ref{8a6,,TextIOBase}.

`encoding' gives the name of the encoding that the stream will be decoded or
encoded with.  In @ref{868,,UTF-8 Mode}, this defaults to UTF-8.
Otherwise, it defaults to @ref{867,,locale.getencoding()}.
@code{encoding="locale"} can be used to specify the current locale’s encoding
explicitly. See @ref{9c6,,Text Encoding} for more information.

`errors' is an optional string that specifies how encoding and decoding
errors are to be handled.  Pass @code{'strict'} to raise a @ref{2ee,,ValueError}
exception if there is an encoding error (the default of @code{None} has the same
effect), or pass @code{'ignore'} to ignore errors.  (Note that ignoring encoding
errors can lead to data loss.)  @code{'replace'} causes a replacement marker
(such as @code{'?'}) to be inserted where there is malformed data.
@code{'backslashreplace'} causes malformed data to be replaced by a
backslashed escape sequence.  When writing, @code{'xmlcharrefreplace'}
(replace with the appropriate XML character reference)  or @code{'namereplace'}
(replace with @code{\N@{...@}} escape sequences) can be used.  Any other error
handling name that has been registered with
@ref{16a7,,codecs.register_error()} is also valid.

@geindex universal newlines; io.TextIOWrapper class

`newline' controls how line endings are handled.  It can be @code{None},
@code{'@w{'}}, @code{'\n'}, @code{'\r'}, and @code{'\r\n'}.  It works as follows:


@itemize *

@item 
When reading input from the stream, if `newline' is @code{None},
@ref{f3b,,universal newlines} mode is enabled.  Lines in the input can end in
@code{'\n'}, @code{'\r'}, or @code{'\r\n'}, and these are translated into @code{'\n'}
before being returned to the caller.  If `newline' is @code{'@w{'}}, universal
newlines mode is enabled, but line endings are returned to the caller
untranslated.  If `newline' has any of the other legal values, input lines
are only terminated by the given string, and the line ending is returned to
the caller untranslated.

@item 
When writing output to the stream, if `newline' is @code{None}, any @code{'\n'}
characters written are translated to the system default line separator,
@ref{2623,,os.linesep}.  If `newline' is @code{'@w{'}} or @code{'\n'}, no translation
takes place.  If `newline' is any of the other legal values, any @code{'\n'}
characters written are translated to the given string.
@end itemize

If `line_buffering' is @code{True}, @ref{2d57,,flush()} is implied when a call to
write contains a newline character or a carriage return.

If `write_through' is @code{True}, calls to @ref{edd,,write()} are guaranteed
not to be buffered: any data written on the @code{TextIOWrapper}
object is immediately handled to its underlying binary `buffer'.


Changed in version 3.3: The `write_through' argument has been added.



Changed in version 3.3: The default `encoding' is now @code{locale.getpreferredencoding(False)}
instead of @code{locale.getpreferredencoding()}. Don’t change temporary the
locale encoding using @ref{931,,locale.setlocale()}, use the current locale
encoding instead of the user preferred encoding.



Changed in version 3.10: The `encoding' argument now supports the @code{"locale"} dummy encoding name.


@cartouche
@quotation Note 
When the underlying raw stream is non-blocking, a @ref{237,,BlockingIOError}
may be raised if a read operation cannot be completed immediately.
@end quotation
@end cartouche

@code{TextIOWrapper} provides these data attributes and methods in
addition to those from @ref{8a6,,TextIOBase} and @ref{506,,IOBase}:

@geindex line_buffering (io.TextIOWrapper attribute)
@anchor{library/io io TextIOWrapper line_buffering}@anchor{3195}
@deffn {Attribute} line_buffering

Whether line buffering is enabled.
@end deffn

@geindex write_through (io.TextIOWrapper attribute)
@anchor{library/io io TextIOWrapper write_through}@anchor{3196}
@deffn {Attribute} write_through

Whether writes are passed immediately to the underlying binary
buffer.


Added in version 3.7.

@end deffn

@geindex reconfigure() (io.TextIOWrapper method)
@anchor{library/io io TextIOWrapper reconfigure}@anchor{d46}
@deffn {Method} reconfigure (*, encoding=None, errors=None, newline=None, line_buffering=None, write_through=None)

Reconfigure this text stream using new settings for `encoding',
`errors', `newline', `line_buffering' and `write_through'.

Parameters not specified keep current settings, except
@code{errors='strict'} is used when `encoding' is specified but
`errors' is not specified.

It is not possible to change the encoding or newline if some data
has already been read from the stream. On the other hand, changing
encoding after write is possible.

This method does an implicit stream flush before setting the
new parameters.


Added in version 3.7.



Changed in version 3.11: The method supports @code{encoding="locale"} option.

@end deffn

@geindex seek() (io.TextIOWrapper method)
@anchor{library/io io TextIOWrapper seek}@anchor{3197}
@deffn {Method} seek (cookie, whence=os.SEEK_SET, /)

Set the stream position.
Return the new stream position as an @ref{19c,,int}.

Four operations are supported,
given by the following argument combinations:


@itemize *

@item 
@code{seek(0, SEEK_SET)}: Rewind to the start of the stream.

@item 
@code{seek(cookie, SEEK_SET)}: Restore a previous position;
`cookie' `must be' a number returned by @ref{1802,,tell()}.

@item 
@code{seek(0, SEEK_END)}: Fast-forward to the end of the stream.

@item 
@code{seek(0, SEEK_CUR)}: Leave the current stream position unchanged.
@end itemize

Any other argument combinations are invalid,
and may raise exceptions.


@subsubheading See also


@ref{1499,,os.SEEK_SET}, @ref{149a,,os.SEEK_CUR}, and @ref{149b,,os.SEEK_END}.

@end deffn

@geindex tell() (io.TextIOWrapper method)
@anchor{library/io io TextIOWrapper tell}@anchor{1802}
@deffn {Method} tell ()

Return the stream position as an opaque number.
The return value of @code{tell()} can be given as input to @ref{3197,,seek()},
to restore a previous stream position.
@end deffn
@end deffn

@geindex StringIO (class in io)
@anchor{library/io io StringIO}@anchor{112f}
@deffn {Class} io.StringIO (initial_value='@w{'}, newline='\n')

A text stream using an in-memory text buffer.  It inherits from
@ref{8a6,,TextIOBase}.

The text buffer is discarded when the @ref{507,,close()} method is
called.

The initial value of the buffer can be set by providing `initial_value'.
If newline translation is enabled, newlines will be encoded as if by
@ref{209f,,write()}.  The stream is positioned at the start of the
buffer which emulates opening an existing file in a @code{w+} mode, making it
ready for an immediate write from the beginning or for a write that
would overwrite the initial value.  To emulate opening a file in an @code{a+}
mode ready for appending, use @code{f.seek(0, io.SEEK_END)} to reposition the
stream at the end of the buffer.

The `newline' argument works like that of @ref{9c4,,TextIOWrapper},
except that when writing output to the stream, if `newline' is @code{None},
newlines are written as @code{\n} on all platforms.

@code{StringIO} provides this method in addition to those from
@ref{8a6,,TextIOBase} and @ref{506,,IOBase}:

@geindex getvalue() (io.StringIO method)
@anchor{library/io io StringIO getvalue}@anchor{3198}
@deffn {Method} getvalue ()

Return a @ref{16a,,str} containing the entire contents of the buffer.
Newlines are decoded as if by @ref{20b0,,read()}, although
the stream position is not changed.
@end deffn

Example usage:

@example
import io

output = io.StringIO()
output.write('First line.\n')
print('Second line.', file=output)

# Retrieve file contents -- this will be
# 'First line.\nSecond line.\n'
contents = output.getvalue()

# Close object and discard memory buffer --
# .getvalue() will now raise an exception.
output.close()
@end example
@end deffn

@geindex universal newlines; io.IncrementalNewlineDecoder class

@geindex IncrementalNewlineDecoder (class in io)
@anchor{library/io io IncrementalNewlineDecoder}@anchor{17b4}
@deffn {Class} io.IncrementalNewlineDecoder

A helper codec that decodes newlines for @ref{f3b,,universal newlines} mode.
It inherits from @ref{28a2,,codecs.IncrementalDecoder}.
@end deffn

@node Static Typing,Performance<3>,Class hierarchy,io — Core tools for working with streams
@anchor{library/io static-typing}@anchor{3199}
@subsubsection Static Typing


The following protocols can be used for annotating function and method
arguments for simple stream reading or writing operations. They are decorated
with @ref{675,,@@typing.runtime_checkable}.

@geindex Reader (class in io)
@anchor{library/io io Reader}@anchor{238}
@deffn {Class} io.Reader [T]

Generic protocol for reading from a file or other input stream. @code{T} will
usually be @ref{16a,,str} or @ref{193,,bytes}, but can be any type that is
read from the stream.


Added in version 3.14.


@geindex read() (io.Reader method)
@anchor{library/io io Reader read}@anchor{319a}
@deffn {Method} read ()

@deffnx {Method} read (size, /)

Read data from the input stream and return it. If `size' is
specified, it should be an integer, and at most `size' items
(bytes/characters) will be read.
@end deffn

For example:

@example
def read_it(reader: Reader[str]):
    data = reader.read(11)
    assert isinstance(data, str)
@end example
@end deffn

@geindex Writer (class in io)
@anchor{library/io io Writer}@anchor{239}
@deffn {Class} io.Writer [T]

Generic protocol for writing to a file or other output stream. @code{T} will
usually be @ref{16a,,str} or @ref{193,,bytes}, but can be any type that can be
written to the stream.


Added in version 3.14.


@geindex write() (io.Writer method)
@anchor{library/io io Writer write}@anchor{319b}
@deffn {Method} write (data, /)

Write `data' to the output stream and return the number of items
(bytes/characters) written.
@end deffn

For example:

@example
def write_binary(writer: Writer[bytes]):
    writer.write(b"Hello world!\n")
@end example
@end deffn

See @ref{319c,,ABCs and Protocols for working with I/O} for other I/O related protocols and classes that can be
used for static type checking.

@node Performance<3>,,Static Typing,io — Core tools for working with streams
@anchor{library/io performance}@anchor{319d}
@subsubsection Performance


This section discusses the performance of the provided concrete I/O
implementations.

@menu
* Binary I/O: Binary I/O<2>. 
* Text I/O: Text I/O<3>. 
* Multi-threading: Multi-threading<3>. 
* Reentrancy:: 

@end menu

@node Binary I/O<2>,Text I/O<3>,,Performance<3>
@anchor{library/io id2}@anchor{319e}
@subsubsection Binary I/O


By reading and writing only large chunks of data even when the user asks for a
single byte, buffered I/O hides any inefficiency in calling and executing the
operating system’s unbuffered I/O routines.  The gain depends on the OS and the
kind of I/O which is performed.  For example, on some modern OSes such as Linux,
unbuffered disk I/O can be as fast as buffered I/O.  The bottom line, however,
is that buffered I/O offers predictable performance regardless of the platform
and the backing device.  Therefore, it is almost always preferable to use
buffered I/O rather than unbuffered I/O for binary data.

@node Text I/O<3>,Multi-threading<3>,Binary I/O<2>,Performance<3>
@anchor{library/io id3}@anchor{319f}
@subsubsection Text I/O


Text I/O over a binary storage (such as a file) is significantly slower than
binary I/O over the same storage, because it requires conversions between
unicode and binary data using a character codec.  This can become noticeable
handling huge amounts of text data like large log files.  Also,
@ref{3194,,tell()} and @ref{3193,,seek()} are both quite slow
due to the reconstruction algorithm used.

@ref{112f,,StringIO}, however, is a native in-memory unicode container and will
exhibit similar speed to @ref{10aa,,BytesIO}.

@node Multi-threading<3>,Reentrancy,Text I/O<3>,Performance<3>
@anchor{library/io multi-threading}@anchor{31a0}
@subsubsection Multi-threading


@ref{151b,,FileIO} objects are thread-safe to the extent that the operating system
calls (such as @code{read(2)@footnote{https://manpages.debian.org/read(2)}} under Unix) they wrap are thread-safe too.

Binary buffered objects (instances of @ref{141a,,BufferedReader},
@ref{15bd,,BufferedWriter}, @ref{15be,,BufferedRandom} and @ref{15bf,,BufferedRWPair})
protect their internal structures using a lock; it is therefore safe to call
them from multiple threads at once.

@ref{9c4,,TextIOWrapper} objects are not thread-safe.

@node Reentrancy,,Multi-threading<3>,Performance<3>
@anchor{library/io reentrancy}@anchor{31a1}
@subsubsection Reentrancy


Binary buffered objects (instances of @ref{141a,,BufferedReader},
@ref{15bd,,BufferedWriter}, @ref{15be,,BufferedRandom} and @ref{15bf,,BufferedRWPair})
are not reentrant.  While reentrant calls will not happen in normal situations,
they can arise from doing I/O in a @ref{cb,,signal} handler.  If a thread tries to
re-enter a buffered object which it is already accessing, a @ref{246,,RuntimeError}
is raised.  Note this doesn’t prohibit a different thread from entering the
buffered object.

The above implicitly extends to text files, since the @ref{318,,open()} function
will wrap a buffered object inside a @ref{9c4,,TextIOWrapper}.  This includes
standard streams and therefore affects the built-in @ref{117b,,print()} function as
well.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node time — Time access and conversions,logging — Logging facility for Python,io — Core tools for working with streams,Generic Operating System Services
@anchor{library/time doc}@anchor{31a2}@anchor{library/time module-time}@anchor{f4}@anchor{library/time time-time-access-and-conversions}@anchor{31a3}@anchor{library/time translation-repo}@anchor{31a4}
@subsection @code{time} — Time access and conversions


@geindex module; time


__________________________________________________________________


This module provides various time-related functions. For related
functionality, see also the @ref{34,,datetime} and @ref{15,,calendar} modules.

Although this module is always available,
not all functions are available on all platforms.  Most of the functions
defined in this module call platform C library functions with the same name.  It
may sometimes be helpful to consult the platform documentation, because the
semantics of these functions varies among platforms.

An explanation of some terminology and conventions is in order.

@geindex epoch
@anchor{library/time epoch}@anchor{2f83}

@itemize *

@item 
The `epoch' is the point where the time starts, the return value of
@code{time.gmtime(0)}. It is January 1, 1970, 00:00:00 (UTC) on all platforms.
@end itemize

@geindex seconds since the epoch


@itemize *

@item 
The term `seconds since the epoch' refers to the total number
of elapsed seconds since the epoch, typically excluding
leap seconds@footnote{https://en.wikipedia.org/wiki/Leap_second}.  Leap seconds are excluded from this total on all
POSIX-compliant platforms.
@end itemize

@geindex Year 2038


@itemize *

@item 
The functions in this module may not handle dates and times before the @ref{2f83,,epoch} or
far in the future.  The cut-off point in the future is determined by the C
library; for 32-bit systems, it is typically in 2038.
@end itemize

@geindex 2-digit years


@itemize *

@item 
Function @ref{1639,,strptime()} can parse 2-digit years when given @code{%y} format
code. When 2-digit years are parsed, they are converted according to the POSIX
and ISO C standards: values 69–99 are mapped to 1969–1999, and values 0–68
are mapped to 2000–2068.
@end itemize

@geindex UTC
@geindex Coordinated Universal Time
@geindex Greenwich Mean Time


@itemize *

@item 
UTC is Coordinated Universal Time@footnote{https://en.wikipedia.org/wiki/Coordinated_Universal_Time} and superseded Greenwich Mean Time@footnote{https://en.wikipedia.org/wiki/Greenwich_Mean_Time} or
GMT as the basis of international timekeeping. The acronym UTC is not a
mistake but conforms to an earlier, language-agnostic naming scheme for time
standards such as UT0, UT1, and UT2.
@end itemize

@geindex Daylight Saving Time


@itemize *

@item 
DST is Daylight Saving Time, an adjustment of the timezone by (usually) one
hour during part of the year.  DST rules are magic (determined by local law) and
can change from year to year.  The C library has a table containing the local
rules (often it is read from a system file for flexibility) and is the only
source of True Wisdom in this respect.

@item 
The precision of the various real-time functions may be less than suggested by
the units in which their value or argument is expressed. E.g. on most Unix
systems, the clock “ticks” only 50 or 100 times a second.

@item 
On the other hand, the precision of @ref{55d,,time()} and @ref{8ae,,sleep()} is better
than their Unix equivalents: times are expressed as floating-point numbers,
@code{time()} returns the most accurate time available (using Unix
@code{gettimeofday()} where available), and @code{sleep()} will accept a time
with a nonzero fraction (Unix @code{select()} is used to implement this, where
available).

@item 
The time value as returned by @ref{13cc,,gmtime()}, @ref{1705,,localtime()}, and
@ref{1639,,strptime()}, and accepted by @ref{13f3,,asctime()}, @ref{13f4,,mktime()} and
@ref{13f5,,strftime()}, is a sequence of 9 integers.  The return values of
@code{gmtime()}, @code{localtime()}, and @code{strptime()} also offer attribute
names for individual fields.

See @ref{eec,,struct_time} for a description of these objects.


Changed in version 3.3: The @ref{eec,,struct_time} type was extended to provide
the @ref{31a5,,tm_gmtoff} and @ref{31a6,,tm_zone}
attributes when platform supports corresponding
@code{struct tm} members.



Changed in version 3.6: The @ref{eec,,struct_time} attributes
@ref{31a5,,tm_gmtoff} and @ref{31a6,,tm_zone}
are now available on all platforms.


@item 
Use the following functions to convert between time representations:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

From

@tab

To

@tab

Use

@item

seconds since the epoch

@tab

@ref{eec,,struct_time} in
UTC

@tab

@ref{13cc,,gmtime()}

@item

seconds since the epoch

@tab

@ref{eec,,struct_time} in
local time

@tab

@ref{1705,,localtime()}

@item

@ref{eec,,struct_time} in
UTC

@tab

seconds since the epoch

@tab

@ref{29b1,,calendar.timegm()}

@item

@ref{eec,,struct_time} in
local time

@tab

seconds since the epoch

@tab

@ref{13f4,,mktime()}

@end multitable

@end itemize

@menu
* Functions: Functions<5>. 
* Clock ID Constants:: 
* Timezone Constants:: 

@end menu

@node Functions<5>,Clock ID Constants,,time — Time access and conversions
@anchor{library/time functions}@anchor{31a7}@anchor{library/time time-functions}@anchor{31a8}
@subsubsection Functions


@geindex asctime() (in module time)
@anchor{library/time time asctime}@anchor{13f3}
@deffn {Function} time.asctime ([t])

Convert a tuple or @ref{eec,,struct_time} representing a time as returned by
@ref{13cc,,gmtime()} or @ref{1705,,localtime()} to a string of the following
form: @code{'Sun Jun 20 23:21:05 1993'}. The day field is two characters long
and is space padded if the day is a single digit,
e.g.: @code{'Wed Jun  9 04:26:40 1993'}.

If `t' is not provided, the current time as returned by @ref{1705,,localtime()}
is used. Locale information is not used by @code{asctime()}.

@cartouche
@quotation Note 
Unlike the C function of the same name, @code{asctime()} does not add a
trailing newline.
@end quotation
@end cartouche
@end deffn

@geindex pthread_getcpuclockid() (in module time)
@anchor{library/time time pthread_getcpuclockid}@anchor{d91}
@deffn {Function} time.pthread_getcpuclockid (thread_id)

Return the `clk_id' of the thread-specific CPU-time clock for the specified `thread_id'.

Use @ref{1366,,threading.get_ident()} or the @ref{31a9,,ident}
attribute of @ref{177,,threading.Thread} objects to get a suitable value
for `thread_id'.

@cartouche
@quotation Warning 
Passing an invalid or expired `thread_id' may result in
undefined behavior, such as segmentation fault.
@end quotation
@end cartouche

@ref{2181,,Availability}: Unix

See the man page for @code{pthread_getcpuclockid(3)@footnote{https://manpages.debian.org/pthread_getcpuclockid(3)}} for
further information.


Added in version 3.7.

@end deffn

@geindex clock_getres() (in module time)
@anchor{library/time time clock_getres}@anchor{1369}
@deffn {Function} time.clock_getres (clk_id)

Return the resolution (precision) of the specified clock `clk_id'.  Refer to
@ref{311d,,Clock ID Constants} for a list of accepted values for `clk_id'.

@ref{2181,,Availability}: Unix.


Added in version 3.3.

@end deffn

@geindex clock_gettime() (in module time)
@anchor{library/time time clock_gettime}@anchor{136a}
@deffn {Function} time.clock_gettime (clk_id) -> float

Return the time of the specified clock `clk_id'.  Refer to
@ref{311d,,Clock ID Constants} for a list of accepted values for `clk_id'.

Use @ref{ce1,,clock_gettime_ns()} to avoid the precision loss caused by the
@ref{197,,float} type.

@ref{2181,,Availability}: Unix.


Added in version 3.3.

@end deffn

@geindex clock_gettime_ns() (in module time)
@anchor{library/time time clock_gettime_ns}@anchor{ce1}
@deffn {Function} time.clock_gettime_ns (clk_id) -> int

Similar to @ref{136a,,clock_gettime()} but return time as nanoseconds.

@ref{2181,,Availability}: Unix.


Added in version 3.7.

@end deffn

@geindex clock_settime() (in module time)
@anchor{library/time time clock_settime}@anchor{136b}
@deffn {Function} time.clock_settime (clk_id, time: float)

Set the time of the specified clock `clk_id'.  Currently,
@ref{8ab,,CLOCK_REALTIME} is the only accepted value for `clk_id'.

Use @ref{ce2,,clock_settime_ns()} to avoid the precision loss caused by the
@ref{197,,float} type.

@ref{2181,,Availability}: Unix, not Android, not iOS.


Added in version 3.3.

@end deffn

@geindex clock_settime_ns() (in module time)
@anchor{library/time time clock_settime_ns}@anchor{ce2}
@deffn {Function} time.clock_settime_ns (clk_id, time: int)

Similar to @ref{136b,,clock_settime()} but set time with nanoseconds.

@ref{2181,,Availability}: Unix, not Android, not iOS.


Added in version 3.7.

@end deffn

@geindex ctime() (in module time)
@anchor{library/time time ctime}@anchor{292f}
@deffn {Function} time.ctime ([secs])

Convert a time expressed in seconds since the @ref{2f83,,epoch} to a string of a form:
@code{'Sun Jun 20 23:21:05 1993'} representing local time. The day field
is two characters long and is space padded if the day is a single digit,
e.g.: @code{'Wed Jun  9 04:26:40 1993'}.

If `secs' is not provided or @ref{887,,None}, the current time as
returned by @ref{55d,,time()} is used. @code{ctime(secs)} is equivalent to
@code{asctime(localtime(secs))}. Locale information is not used by
@code{ctime()}.
@end deffn

@geindex get_clock_info() (in module time)
@anchor{library/time time get_clock_info}@anchor{1368}
@deffn {Function} time.get_clock_info (name)

Get information on the specified clock as a namespace object.
Supported clock names and the corresponding functions to read their value
are:


@itemize *

@item 
@code{'monotonic'}: @ref{55c,,time.monotonic()}

@item 
@code{'perf_counter'}: @ref{c80,,time.perf_counter()}

@item 
@code{'process_time'}: @ref{c81,,time.process_time()}

@item 
@code{'thread_time'}: @ref{b36,,time.thread_time()}

@item 
@code{'time'}: @ref{55d,,time.time()}
@end itemize

The result has the following attributes:


@itemize -

@item 
`adjustable': @code{True} if the clock can be set to jump forward or backward
in time, @code{False} otherwise. Does not refer to gradual NTP rate adjustments.

@item 
`implementation': The name of the underlying C function used to get
the clock value.  Refer to @ref{311d,,Clock ID Constants} for possible values.

@item 
`monotonic': @code{True} if the clock cannot go backward,
@code{False} otherwise

@item 
`resolution': The resolution of the clock in seconds (@ref{197,,float})
@end itemize


Added in version 3.3.

@end deffn

@geindex gmtime() (in module time)
@anchor{library/time time gmtime}@anchor{13cc}
@deffn {Function} time.gmtime ([secs])

Convert a time expressed in seconds since the @ref{2f83,,epoch} to a @ref{eec,,struct_time} in
UTC in which the dst flag is always zero.  If `secs' is not provided or
@ref{887,,None}, the current time as returned by @ref{55d,,time()} is used.  Fractions
of a second are ignored.  See above for a description of the
@code{struct_time} object. See @ref{29b1,,calendar.timegm()} for the inverse of this
function.
@end deffn

@geindex localtime() (in module time)
@anchor{library/time time localtime}@anchor{1705}
@deffn {Function} time.localtime ([secs])

Like @ref{13cc,,gmtime()} but converts to local time.  If `secs' is not provided or
@ref{887,,None}, the current time as returned by @ref{55d,,time()} is used.  The dst
flag is set to @code{1} when DST applies to the given time.

@code{localtime()} may raise @ref{a87,,OverflowError}, if the timestamp is
outside the range of values supported by the platform C @code{localtime()}
or @code{gmtime()} functions, and @ref{2c2,,OSError} on @code{localtime()} or
@code{gmtime()} failure. It’s common for this to be restricted to years
between 1970 and 2038.
@end deffn

@geindex mktime() (in module time)
@anchor{library/time time mktime}@anchor{13f4}
@deffn {Function} time.mktime (t)

This is the inverse function of @ref{1705,,localtime()}.  Its argument is the
@ref{eec,,struct_time} or full 9-tuple (since the dst flag is needed; use @code{-1}
as the dst flag if it is unknown) which expresses the time in `local' time, not
UTC.  It returns a floating-point number, for compatibility with @ref{55d,,time()}.
If the input value cannot be represented as a valid time, either
@ref{a87,,OverflowError} or @ref{2ee,,ValueError} will be raised (which depends on
whether the invalid value is caught by Python or the underlying C libraries).
The earliest date for which it can generate a time is platform-dependent.
@end deffn

@geindex monotonic() (in module time)
@anchor{library/time time monotonic}@anchor{55c}
@deffn {Function} time.monotonic () -> float

Return the value (in fractional seconds) of a monotonic clock, i.e. a clock
that cannot go backwards.  The clock is not affected by system clock updates.
The reference point of the returned value is undefined, so that only the
difference between the results of two calls is valid.

Clock:


@itemize *

@item 
On Windows, call @code{QueryPerformanceCounter()} and
@code{QueryPerformanceFrequency()}.

@item 
On macOS, call @code{mach_absolute_time()} and @code{mach_timebase_info()}.

@item 
On HP-UX, call @code{gethrtime()}.

@item 
Call @code{clock_gettime(CLOCK_HIGHRES)} if available.

@item 
Otherwise, call @code{clock_gettime(CLOCK_MONOTONIC)}.
@end itemize

Use @ref{ce3,,monotonic_ns()} to avoid the precision loss caused by the
@ref{197,,float} type.


Added in version 3.3.



Changed in version 3.5: The function is now always available and the clock is now the same for
all processes.



Changed in version 3.10: On macOS, the clock is now the same for all processes.

@end deffn

@geindex monotonic_ns() (in module time)
@anchor{library/time time monotonic_ns}@anchor{ce3}
@deffn {Function} time.monotonic_ns () -> int

Similar to @ref{55c,,monotonic()}, but return time as nanoseconds.


Added in version 3.7.

@end deffn

@geindex perf_counter() (in module time)
@anchor{library/time time perf_counter}@anchor{c80}
@deffn {Function} time.perf_counter () -> float

@geindex benchmarking

Return the value (in fractional seconds) of a performance counter, i.e. a
clock with the highest available resolution to measure a short duration.  It
does include time elapsed during sleep. The clock is the same for all
processes. The reference
point of the returned value is undefined, so that only the difference between
the results of two calls is valid.

`CPython implementation detail:' On CPython, use the same clock as @ref{55c,,time.monotonic()} and is a
monotonic clock, i.e. a clock that cannot go backwards.

Use @ref{ce4,,perf_counter_ns()} to avoid the precision loss caused by the
@ref{197,,float} type.


Added in version 3.3.



Changed in version 3.10: On Windows, the clock is now the same for all processes.



Changed in version 3.13: Use the same clock as @ref{55c,,time.monotonic()}.

@end deffn

@geindex perf_counter_ns() (in module time)
@anchor{library/time time perf_counter_ns}@anchor{ce4}
@deffn {Function} time.perf_counter_ns () -> int

Similar to @ref{c80,,perf_counter()}, but return time as nanoseconds.


Added in version 3.7.

@end deffn

@geindex process_time() (in module time)
@anchor{library/time time process_time}@anchor{c81}
@deffn {Function} time.process_time () -> float

@geindex CPU time
@geindex processor time
@geindex benchmarking

Return the value (in fractional seconds) of the sum of the system and user
CPU time of the current process.  It does not include time elapsed during
sleep.  It is process-wide by definition.  The reference point of the
returned value is undefined, so that only the difference between the results
of two calls is valid.

Use @ref{ce5,,process_time_ns()} to avoid the precision loss caused by the
@ref{197,,float} type.


Added in version 3.3.

@end deffn

@geindex process_time_ns() (in module time)
@anchor{library/time time process_time_ns}@anchor{ce5}
@deffn {Function} time.process_time_ns () -> int

Similar to @ref{c81,,process_time()} but return time as nanoseconds.


Added in version 3.7.

@end deffn

@geindex sleep() (in module time)
@anchor{library/time time sleep}@anchor{8ae}
@deffn {Function} time.sleep (secs)

Suspend execution of the calling thread for the given number of seconds.
The argument may be a floating-point number to indicate a more precise sleep
time.

If the sleep is interrupted by a signal and no exception is raised by the
signal handler, the sleep is restarted with a recomputed timeout.

The suspension time may be longer than requested by an arbitrary amount,
because of the scheduling of other activity in the system.

@subsubheading Windows implementation


On Windows, if `secs' is zero, the thread relinquishes the remainder of its
time slice to any other thread that is ready to run. If there are no other
threads ready to run, the function returns immediately, and the thread
continues execution.  On Windows 10 and newer the implementation uses
a high-resolution timer@footnote{https://learn.microsoft.com/windows/win32/api/synchapi/nf-synchapi-createwaitabletimerexw}
which provides resolution of 100 nanoseconds. If `secs' is zero, @code{Sleep(0)} is used.

@subsubheading Unix implementation



@itemize *

@item 
Use @code{clock_nanosleep()} if available (resolution: 1 nanosecond);

@item 
Or use @code{nanosleep()} if available (resolution: 1 nanosecond);

@item 
Or use @code{select()} (resolution: 1 microsecond).
@end itemize

@cartouche
@quotation Note 
To emulate a “no-op”, use @ref{17f,,pass} instead of @code{time.sleep(0)}.

To voluntarily relinquish the CPU, specify a real-time @ref{3164,,scheduling policy} and use @ref{131d,,os.sched_yield()} instead.
@end quotation
@end cartouche

Raises an @ref{1cb1,,auditing event} @code{time.sleep} with argument @code{secs}.


Changed in version 3.5: The function now sleeps at least `secs' even if the sleep is interrupted
by a signal, except if the signal handler raises an exception (see
@geindex Python Enhancement Proposals; PEP 475
PEP 475@footnote{https://peps.python.org/pep-0475/} for the rationale).



Changed in version 3.11: On Unix, the @code{clock_nanosleep()} and @code{nanosleep()} functions are now
used if available. On Windows, a waitable timer is now used.



Changed in version 3.13: Raises an auditing event.

@end deffn

@geindex % (percent); datetime format

@geindex strftime() (in module time)
@anchor{library/time time strftime}@anchor{13f5}
@deffn {Function} time.strftime (format[, t])

Convert a tuple or @ref{eec,,struct_time} representing a time as returned by
@ref{13cc,,gmtime()} or @ref{1705,,localtime()} to a string as specified by the `format'
argument.  If `t' is not provided, the current time as returned by
@code{localtime()} is used.  `format' must be a string.  @ref{2ee,,ValueError} is
raised if any field in `t' is outside of the allowed range.

0 is a legal argument for any position in the time tuple; if it is normally
illegal the value is forced to a correct one.

The following directives can be embedded in the `format' string. They are shown
without the optional field width and precision specification, and are replaced
by the indicated characters in the @code{strftime()} result:


@multitable {xxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxx} 
@headitem

Directive

@tab

Meaning

@tab

Notes

@item

@code{%a}

@tab

Locale’s abbreviated weekday name.

@tab

@item

@code{%A}

@tab

Locale’s full weekday name.

@tab

@item

@code{%b}

@tab

Locale’s abbreviated month name.

@tab

@item

@code{%B}

@tab

Locale’s full month name.

@tab

@item

@code{%c}

@tab

Locale’s appropriate date and time
representation.

@tab

@item

@code{%d}

@tab

Day of the month as a decimal number [01,31].

@tab

@item

@code{%f}

@tab


@table @asis

@item Microseconds as a decimal number

[000000,999999].
@end table

@tab

(1)

@item

@code{%H}

@tab

Hour (24-hour clock) as a decimal number
[00,23].

@tab

@item

@code{%I}

@tab

Hour (12-hour clock) as a decimal number
[01,12].

@tab

@item

@code{%j}

@tab

Day of the year as a decimal number [001,366].

@tab

@item

@code{%m}

@tab

Month as a decimal number [01,12].

@tab

@item

@code{%M}

@tab

Minute as a decimal number [00,59].

@tab

@item

@code{%p}

@tab

Locale’s equivalent of either AM or PM.

@tab

(2)

@item

@code{%S}

@tab

Second as a decimal number [00,61].

@tab

(3)

@item

@code{%U}

@tab

Week number of the year (Sunday as the first
day of the week) as a decimal number [00,53].
All days in a new year preceding the first
Sunday are considered to be in week 0.

@tab

(4)

@item

@code{%u}

@tab

Day of the week (Monday is 1; Sunday is 7)
as a decimal number [1, 7].

@tab

@item

@code{%w}

@tab

Weekday as a decimal number [0(Sunday),6].

@tab

@item

@code{%W}

@tab

Week number of the year (Monday as the first
day of the week) as a decimal number [00,53].
All days in a new year preceding the first
Monday are considered to be in week 0.

@tab

(4)

@item

@code{%x}

@tab

Locale’s appropriate date representation.

@tab

@item

@code{%X}

@tab

Locale’s appropriate time representation.

@tab

@item

@code{%y}

@tab

Year without century as a decimal number
[00,99].

@tab

@item

@code{%Y}

@tab

Year with century as a decimal number.

@tab

@item

@code{%z}

@tab

Time zone offset indicating a positive or
negative time difference from UTC/GMT of the
form +HHMM or -HHMM, where H represents decimal
hour digits and M represents decimal minute
digits [-23:59, +23:59]. @footnote{
The use of @code{%Z} is now deprecated, but the @code{%z} escape that expands to the
preferred hour/minute offset is not supported by all ANSI C libraries. Also, a
strict reading of the original 1982 
@geindex RFC; RFC 822
@uref{https://datatracker.ietf.org/doc/html/rfc822.html,RFC 822} standard calls for a two-digit
year (@code{%y} rather than @code{%Y}), but practice moved to 4-digit years long before the
year 2000.  After that, 
@geindex RFC; RFC 822
@uref{https://datatracker.ietf.org/doc/html/rfc822.html,RFC 822} became obsolete and the 4-digit year has
been first recommended by 
@geindex RFC; RFC 1123
@uref{https://datatracker.ietf.org/doc/html/rfc1123.html,RFC 1123} and then mandated by 
@geindex RFC; RFC 2822
@uref{https://datatracker.ietf.org/doc/html/rfc2822.html,RFC 2822},
with 
@geindex RFC; RFC 5322
@uref{https://datatracker.ietf.org/doc/html/rfc5322.html,RFC 5322} continuing this requirement.
}

@tab

@item

@code{%Z}

@tab

Time zone name (no characters if no time zone
exists). Deprecated. @footnote{
The use of @code{%Z} is now deprecated, but the @code{%z} escape that expands to the
preferred hour/minute offset is not supported by all ANSI C libraries. Also, a
strict reading of the original 1982 
@geindex RFC; RFC 822
@uref{https://datatracker.ietf.org/doc/html/rfc822.html,RFC 822} standard calls for a two-digit
year (@code{%y} rather than @code{%Y}), but practice moved to 4-digit years long before the
year 2000.  After that, 
@geindex RFC; RFC 822
@uref{https://datatracker.ietf.org/doc/html/rfc822.html,RFC 822} became obsolete and the 4-digit year has
been first recommended by 
@geindex RFC; RFC 1123
@uref{https://datatracker.ietf.org/doc/html/rfc1123.html,RFC 1123} and then mandated by 
@geindex RFC; RFC 2822
@uref{https://datatracker.ietf.org/doc/html/rfc2822.html,RFC 2822},
with 
@geindex RFC; RFC 5322
@uref{https://datatracker.ietf.org/doc/html/rfc5322.html,RFC 5322} continuing this requirement.
}

@tab

@item

@code{%G}

@tab

ISO 8601 year (similar to @code{%Y} but follows
the rules for the ISO 8601 calendar year).
The year starts with the week that contains
the first Thursday of the calendar year.

@tab

@item

@code{%V}

@tab

ISO 8601 week number (as a decimal number
[01,53]). The first week of the year is the
one that contains the first Thursday of the
year. Weeks start on Monday.

@tab

@item

@code{%%}

@tab

A literal @code{'%'} character.

@tab

@end multitable


Notes:


@enumerate 

@item 
The @code{%f} format directive only applies to @ref{1639,,strptime()},
not to @code{strftime()}. However, see also @ref{1994,,datetime.datetime.strptime()} and
@ref{e94,,datetime.datetime.strftime()} where the @code{%f} format directive
@ref{2901,,applies to microseconds}.

@item 
When used with the @ref{1639,,strptime()} function, the @code{%p} directive only affects
the output hour field if the @code{%I} directive is used to parse the hour.
@end enumerate
@anchor{library/time leap-second}@anchor{31aa}

@enumerate 3

@item 
The range really is @code{0} to @code{61}; value @code{60} is valid in
timestamps representing leap seconds@footnote{https://en.wikipedia.org/wiki/Leap_second} and value @code{61} is supported
for historical reasons.

@item 
When used with the @ref{1639,,strptime()} function, @code{%U} and @code{%W} are only used in
calculations when the day of the week and the year are specified.
@end enumerate

Here is an example, a format for dates compatible with that specified  in the
@geindex RFC; RFC 5322
RFC 5322@footnote{https://datatracker.ietf.org/doc/html/rfc5322.html} Internet email standard.  @footnote{
The use of @code{%Z} is now deprecated, but the @code{%z} escape that expands to the
preferred hour/minute offset is not supported by all ANSI C libraries. Also, a
strict reading of the original 1982 
@geindex RFC; RFC 822
@uref{https://datatracker.ietf.org/doc/html/rfc822.html,RFC 822} standard calls for a two-digit
year (@code{%y} rather than @code{%Y}), but practice moved to 4-digit years long before the
year 2000.  After that, 
@geindex RFC; RFC 822
@uref{https://datatracker.ietf.org/doc/html/rfc822.html,RFC 822} became obsolete and the 4-digit year has
been first recommended by 
@geindex RFC; RFC 1123
@uref{https://datatracker.ietf.org/doc/html/rfc1123.html,RFC 1123} and then mandated by 
@geindex RFC; RFC 2822
@uref{https://datatracker.ietf.org/doc/html/rfc2822.html,RFC 2822},
with 
@geindex RFC; RFC 5322
@uref{https://datatracker.ietf.org/doc/html/rfc5322.html,RFC 5322} continuing this requirement.
}

@example
>>> from time import gmtime, strftime
>>> strftime("%a, %d %b %Y %H:%M:%S +0000", gmtime())
'Thu, 28 Jun 2001 14:17:15 +0000'
@end example

Additional directives may be supported on certain platforms, but only the
ones listed here have a meaning standardized by ANSI C.  To see the full set
of format codes supported on your platform, consult the @code{strftime(3)@footnote{https://manpages.debian.org/strftime(3)}}
documentation.

On some platforms, an optional field width and precision specification can
immediately follow the initial @code{'%'} of a directive in the following order;
this is also not portable. The field width is normally 2 except for @code{%j} where
it is 3.
@end deffn

@geindex % (percent); datetime format

@geindex strptime() (in module time)
@anchor{library/time time strptime}@anchor{1639}
@deffn {Function} time.strptime (string[, format])

Parse a string representing a time according to a format.  The return value
is a @ref{eec,,struct_time} as returned by @ref{13cc,,gmtime()} or
@ref{1705,,localtime()}.

The `format' parameter uses the same directives as those used by
@ref{13f5,,strftime()}; it defaults to @code{"%a %b %d %H:%M:%S %Y"} which matches the
formatting returned by @ref{292f,,ctime()}. If `string' cannot be parsed according
to `format', or if it has excess data after parsing, @ref{2ee,,ValueError} is
raised. The default values used to fill in any missing data when more
accurate values cannot be inferred are @code{(1900, 1, 1, 0, 0, 0, 0, 1, -1)}.
Both `string' and `format' must be strings.

For example:

@example
>>> import time
>>> time.strptime("30 Nov 00", "%d %b %y")
time.struct_time(tm_year=2000, tm_mon=11, tm_mday=30, tm_hour=0, tm_min=0,
                 tm_sec=0, tm_wday=3, tm_yday=335, tm_isdst=-1)
@end example

Support for the @code{%Z} directive is based on the values contained in @code{tzname}
and whether @code{daylight} is true.  Because of this, it is platform-specific
except for recognizing UTC and GMT which are always known (and are considered to
be non-daylight savings timezones).

Only the directives specified in the documentation are supported.  Because
@code{strftime()} is implemented per platform it can sometimes offer more
directives than those listed.  But @code{strptime()} is independent of any platform
and thus does not necessarily support all directives available that are not
documented as supported.
@end deffn

@geindex struct_time (class in time)
@anchor{library/time time struct_time}@anchor{eec}
@deffn {Class} time.struct_time

The type of the time value sequence returned by @ref{13cc,,gmtime()},
@ref{1705,,localtime()}, and @ref{1639,,strptime()}.  It is an object with a @ref{85f,,named tuple} interface: values can be accessed by index and by attribute name.  The
following values are present:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

Index

@tab

Attribute

@tab

Values

@item

0

@tab

@geindex tm_year (time.struct_time attribute)
@anchor{library/time time struct_time tm_year}@anchor{1704}
@deffn {Attribute} tm_year
@end deffn

@tab

(for example, 1993)

@item

1

@tab

@geindex tm_mon (time.struct_time attribute)
@anchor{library/time time struct_time tm_mon}@anchor{31ab}
@deffn {Attribute} tm_mon
@end deffn

@tab

range [1, 12]

@item

2

@tab

@geindex tm_mday (time.struct_time attribute)
@anchor{library/time time struct_time tm_mday}@anchor{31ac}
@deffn {Attribute} tm_mday
@end deffn

@tab

range [1, 31]

@item

3

@tab

@geindex tm_hour (time.struct_time attribute)
@anchor{library/time time struct_time tm_hour}@anchor{31ad}
@deffn {Attribute} tm_hour
@end deffn

@tab

range [0, 23]

@item

4

@tab

@geindex tm_min (time.struct_time attribute)
@anchor{library/time time struct_time tm_min}@anchor{31ae}
@deffn {Attribute} tm_min
@end deffn

@tab

range [0, 59]

@item

5

@tab

@geindex tm_sec (time.struct_time attribute)
@anchor{library/time time struct_time tm_sec}@anchor{31af}
@deffn {Attribute} tm_sec
@end deffn

@tab

range [0, 61]; see @ref{31aa,,Note (2)} in @ref{13f5,,strftime()}

@item

6

@tab

@geindex tm_wday (time.struct_time attribute)
@anchor{library/time time struct_time tm_wday}@anchor{31b0}
@deffn {Attribute} tm_wday
@end deffn

@tab

range [0, 6]; Monday is 0

@item

7

@tab

@geindex tm_yday (time.struct_time attribute)
@anchor{library/time time struct_time tm_yday}@anchor{31b1}
@deffn {Attribute} tm_yday
@end deffn

@tab

range [1, 366]

@item

8

@tab

@geindex tm_isdst (time.struct_time attribute)
@anchor{library/time time struct_time tm_isdst}@anchor{2940}
@deffn {Attribute} tm_isdst
@end deffn

@tab

0, 1 or -1; see below

@item

N/A

@tab

@geindex tm_zone (time.struct_time attribute)
@anchor{library/time time struct_time tm_zone}@anchor{31a6}
@deffn {Attribute} tm_zone
@end deffn

@tab

abbreviation of timezone name

@item

N/A

@tab

@geindex tm_gmtoff (time.struct_time attribute)
@anchor{library/time time struct_time tm_gmtoff}@anchor{31a5}
@deffn {Attribute} tm_gmtoff
@end deffn

@tab

offset east of UTC in seconds

@end multitable


Note that unlike the C structure, the month value is a range of [1, 12], not
[0, 11].

In calls to @ref{13f4,,mktime()}, @ref{2940,,tm_isdst} may be set to 1 when daylight
savings time is in effect, and 0 when it is not.  A value of -1 indicates that
this is not known, and will usually result in the correct state being filled in.

When a tuple with an incorrect length is passed to a function expecting a
@code{struct_time}, or having elements of the wrong type, a
@ref{199,,TypeError} is raised.
@end deffn

@geindex time() (in module time)
@anchor{library/time time time}@anchor{55d}
@deffn {Function} time.time () -> float

Return the time in seconds since the @ref{2f83,,epoch} as a floating-point
number. The handling of leap seconds@footnote{https://en.wikipedia.org/wiki/Leap_second} is platform dependent.
On Windows and most Unix systems, the leap seconds are not counted towards
the time in seconds since the @ref{2f83,,epoch}. This is commonly referred to as Unix time@footnote{https://en.wikipedia.org/wiki/Unix_time}.

Note that even though the time is always returned as a floating-point
number, not all systems provide time with a better precision than 1 second.
While this function normally returns non-decreasing values, it can return a
lower value than a previous call if the system clock has been set back
between the two calls.

The number returned by @code{time()} may be converted into a more common
time format (i.e. year, month, day, hour, etc…) in UTC by passing it to
@ref{13cc,,gmtime()} function or in local time by passing it to the
@ref{1705,,localtime()} function. In both cases a
@ref{eec,,struct_time} object is returned, from which the components
of the calendar date may be accessed as attributes.

Clock:


@itemize *

@item 
On Windows, call @code{GetSystemTimePreciseAsFileTime()}.

@item 
Call @code{clock_gettime(CLOCK_REALTIME)} if available.

@item 
Otherwise, call @code{gettimeofday()}.
@end itemize

Use @ref{ce6,,time_ns()} to avoid the precision loss caused by the @ref{197,,float}
type.
@end deffn


Changed in version 3.13: On Windows, calls @code{GetSystemTimePreciseAsFileTime()} instead of
@code{GetSystemTimeAsFileTime()}.


@geindex time_ns() (in module time)
@anchor{library/time time time_ns}@anchor{ce6}
@deffn {Function} time.time_ns () -> int

Similar to @ref{55d,,time()} but returns time as an integer number of
nanoseconds since the @ref{2f83,,epoch}.


Added in version 3.7.

@end deffn

@geindex thread_time() (in module time)
@anchor{library/time time thread_time}@anchor{b36}
@deffn {Function} time.thread_time () -> float

@geindex CPU time
@geindex processor time
@geindex benchmarking

Return the value (in fractional seconds) of the sum of the system and user
CPU time of the current thread.  It does not include time elapsed during
sleep.  It is thread-specific by definition.  The reference point of the
returned value is undefined, so that only the difference between the results
of two calls in the same thread is valid.

Use @ref{d90,,thread_time_ns()} to avoid the precision loss caused by the
@ref{197,,float} type.

@ref{2181,,Availability}: Linux, Unix, Windows.

Unix systems supporting @code{CLOCK_THREAD_CPUTIME_ID}.


Added in version 3.7.

@end deffn

@geindex thread_time_ns() (in module time)
@anchor{library/time time thread_time_ns}@anchor{d90}
@deffn {Function} time.thread_time_ns () -> int

Similar to @ref{b36,,thread_time()} but return time as nanoseconds.


Added in version 3.7.

@end deffn

@geindex tzset() (in module time)
@anchor{library/time time tzset}@anchor{31b2}
@deffn {Function} time.tzset ()

Reset the time conversion rules used by the library routines. The environment
variable 
@geindex TZ
@geindex environment variable; TZ
@code{TZ} specifies how this is done. It will also set the variables
@code{tzname} (from the 
@geindex TZ
@geindex environment variable; TZ
@code{TZ} environment variable), @code{timezone} (non-DST
seconds West of UTC), @code{altzone} (DST seconds west of UTC) and @code{daylight}
(to 0 if this timezone does not have any daylight saving time rules, or to
nonzero if there is a time, past, present or future when daylight saving time
applies).

@ref{2181,,Availability}: Unix.

@cartouche
@quotation Note 
Although in many cases, changing the 
@geindex TZ
@geindex environment variable; TZ
@code{TZ} environment variable may
affect the output of functions like @ref{1705,,localtime()} without calling
@code{tzset()}, this behavior should not be relied on.

The 
@geindex TZ
@geindex environment variable; TZ
@code{TZ} environment variable should contain no whitespace.
@end quotation
@end cartouche

The standard format of the 
@geindex TZ
@geindex environment variable; TZ
@code{TZ} environment variable is (whitespace
added for clarity):

@example
std offset [dst [offset [,start[/time], end[/time]]]]
@end example

Where the components are:


@table @asis

@item @code{std} and @code{dst}

Three or more alphanumerics giving the timezone abbreviations. These will be
propagated into time.tzname

@item @code{offset}

The offset has the form: @code{± hh[:mm[:ss]]}. This indicates the value
added the local time to arrive at UTC.  If preceded by a ‘-’, the timezone
is east of the Prime Meridian; otherwise, it is west. If no offset follows
dst, summer time is assumed to be one hour ahead of standard time.

@item @code{start[/time], end[/time]}

Indicates when to change to and back from DST. The format of the
start and end dates are one of the following:


@table @asis

@item @code{J@var{n}}

The Julian day `n' (1 <= `n' <= 365). Leap days are not counted, so in
all years February 28 is day 59 and March 1 is day 60.

@item @code{@var{n}}

The zero-based Julian day (0 <= `n' <= 365). Leap days are counted, and
it is possible to refer to February 29.

@item @code{M@var{m}.@var{n}.@var{d}}

The `d'’th day (0 <= `d' <= 6) of week `n' of month `m' of the year (1
<= `n' <= 5, 1 <= `m' <= 12, where week 5 means “the last `d' day in
month `m'” which may occur in either the fourth or the fifth
week). Week 1 is the first week in which the `d'’th day occurs. Day
zero is a Sunday.
@end table

@code{time} has the same format as @code{offset} except that no leading sign
(‘-’ or ‘+’) is allowed. The default, if time is not given, is 02:00:00.
@end table

@example
>>> os.environ['TZ'] = 'EST+05EDT,M4.1.0,M10.5.0'
>>> time.tzset()
>>> time.strftime('%X %x %Z')
'02:07:36 05/08/03 EDT'
>>> os.environ['TZ'] = 'AEST-10AEDT-11,M10.5.0,M3.5.0'
>>> time.tzset()
>>> time.strftime('%X %x %Z')
'16:08:12 05/08/03 AEST'
@end example

On many Unix systems (including *BSD, Linux, Solaris, and Darwin), it is more
convenient to use the system’s zoneinfo (@code{tzfile(5)@footnote{https://manpages.debian.org/tzfile(5)}})  database to
specify the timezone rules. To do this, set the  
@geindex TZ
@geindex environment variable; TZ
@code{TZ} environment
variable to the path of the required timezone  datafile, relative to the root of
the systems ‘zoneinfo’ timezone database, usually located at
@code{/usr/share/zoneinfo}. For example,  @code{'US/Eastern'},
@code{'Australia/Melbourne'}, @code{'Egypt'} or  @code{'Europe/Amsterdam'}.

@example
>>> os.environ['TZ'] = 'US/Eastern'
>>> time.tzset()
>>> time.tzname
('EST', 'EDT')
>>> os.environ['TZ'] = 'Egypt'
>>> time.tzset()
>>> time.tzname
('EET', 'EEST')
@end example
@end deffn

@node Clock ID Constants,Timezone Constants,Functions<5>,time — Time access and conversions
@anchor{library/time clock-id-constants}@anchor{31b3}@anchor{library/time time-clock-id-constants}@anchor{311d}
@subsubsection Clock ID Constants


These constants are used as parameters for @ref{1369,,clock_getres()} and
@ref{136a,,clock_gettime()}.

@geindex CLOCK_BOOTTIME (in module time)
@anchor{library/time time CLOCK_BOOTTIME}@anchor{d8d}
@deffn {Data} time.CLOCK_BOOTTIME

Identical to @ref{8aa,,CLOCK_MONOTONIC}, except it also includes any time that
the system is suspended.

This allows applications to get a suspend-aware monotonic  clock  without
having to deal with the complications of @ref{8ab,,CLOCK_REALTIME}, which may
have  discontinuities if the time is changed using @code{settimeofday()} or
similar.

@ref{2181,,Availability}: Linux >= 2.6.39.


Added in version 3.7.

@end deffn

@geindex CLOCK_HIGHRES (in module time)
@anchor{library/time time CLOCK_HIGHRES}@anchor{31b4}
@deffn {Data} time.CLOCK_HIGHRES

The Solaris OS has a @code{CLOCK_HIGHRES} timer that attempts to use an optimal
hardware source, and may give close to nanosecond resolution.
@code{CLOCK_HIGHRES} is the nonadjustable, high-resolution clock.

@ref{2181,,Availability}: Solaris.


Added in version 3.3.

@end deffn

@geindex CLOCK_MONOTONIC (in module time)
@anchor{library/time time CLOCK_MONOTONIC}@anchor{8aa}
@deffn {Data} time.CLOCK_MONOTONIC

Clock that cannot be set and represents monotonic time since some unspecified
starting point.

@ref{2181,,Availability}: Unix.


Added in version 3.3.

@end deffn

@geindex CLOCK_MONOTONIC_RAW (in module time)
@anchor{library/time time CLOCK_MONOTONIC_RAW}@anchor{31b5}
@deffn {Data} time.CLOCK_MONOTONIC_RAW

Similar to @ref{8aa,,CLOCK_MONOTONIC}, but provides access to a raw
hardware-based time that is not subject to NTP adjustments.

@ref{2181,,Availability}: Linux >= 2.6.28, macOS >= 10.12.


Added in version 3.3.

@end deffn

@geindex CLOCK_MONOTONIC_RAW_APPROX (in module time)
@anchor{library/time time CLOCK_MONOTONIC_RAW_APPROX}@anchor{31b6}
@deffn {Data} time.CLOCK_MONOTONIC_RAW_APPROX

Similar to @ref{31b5,,CLOCK_MONOTONIC_RAW}, but reads a value cached by
the system at context switch and hence has less accuracy.

@ref{2181,,Availability}: macOS >= 10.12.


Added in version 3.13.

@end deffn

@geindex CLOCK_PROCESS_CPUTIME_ID (in module time)
@anchor{library/time time CLOCK_PROCESS_CPUTIME_ID}@anchor{31b7}
@deffn {Data} time.CLOCK_PROCESS_CPUTIME_ID

High-resolution per-process timer from the CPU.

@ref{2181,,Availability}: Unix.


Added in version 3.3.

@end deffn

@geindex CLOCK_PROF (in module time)
@anchor{library/time time CLOCK_PROF}@anchor{d8e}
@deffn {Data} time.CLOCK_PROF

High-resolution per-process timer from the CPU.

@ref{2181,,Availability}: FreeBSD, NetBSD >= 7, OpenBSD.


Added in version 3.7.

@end deffn

@geindex CLOCK_TAI (in module time)
@anchor{library/time time CLOCK_TAI}@anchor{1d9b}
@deffn {Data} time.CLOCK_TAI

International Atomic Time@footnote{https://www.nist.gov/pml/time-and-frequency-division/how-utcnist-related-coordinated-universal-time-utc-international}

The system must have a current leap second table in order for this to give
the correct answer.  PTP or NTP software can maintain a leap second table.

@ref{2181,,Availability}: Linux.


Added in version 3.9.

@end deffn

@geindex CLOCK_THREAD_CPUTIME_ID (in module time)
@anchor{library/time time CLOCK_THREAD_CPUTIME_ID}@anchor{31b8}
@deffn {Data} time.CLOCK_THREAD_CPUTIME_ID

Thread-specific CPU-time clock.

@ref{2181,,Availability}: Unix.


Added in version 3.3.

@end deffn

@geindex CLOCK_UPTIME (in module time)
@anchor{library/time time CLOCK_UPTIME}@anchor{d8f}
@deffn {Data} time.CLOCK_UPTIME

Time whose absolute value is the time the system has been running and not
suspended, providing accurate uptime measurement, both absolute and
interval.

@ref{2181,,Availability}: FreeBSD, OpenBSD >= 5.5.


Added in version 3.7.

@end deffn

@geindex CLOCK_UPTIME_RAW (in module time)
@anchor{library/time time CLOCK_UPTIME_RAW}@anchor{c3d}
@deffn {Data} time.CLOCK_UPTIME_RAW

Clock that increments monotonically, tracking the time since an arbitrary
point, unaffected by frequency or time adjustments and not incremented while
the system is asleep.

@ref{2181,,Availability}: macOS >= 10.12.


Added in version 3.8.

@end deffn

@geindex CLOCK_UPTIME_RAW_APPROX (in module time)
@anchor{library/time time CLOCK_UPTIME_RAW_APPROX}@anchor{31b9}
@deffn {Data} time.CLOCK_UPTIME_RAW_APPROX

Like @ref{c3d,,CLOCK_UPTIME_RAW}, but the value is cached by the system
at context switches and therefore has less accuracy.

@ref{2181,,Availability}: macOS >= 10.12.


Added in version 3.13.

@end deffn

The following constant is the only parameter that can be sent to
@ref{136b,,clock_settime()}.

@geindex CLOCK_REALTIME (in module time)
@anchor{library/time time CLOCK_REALTIME}@anchor{8ab}
@deffn {Data} time.CLOCK_REALTIME

Real-time clock.  Setting this clock requires appropriate privileges.
The clock is the same for all processes.

@ref{2181,,Availability}: Unix.


Added in version 3.3.

@end deffn

@node Timezone Constants,,Clock ID Constants,time — Time access and conversions
@anchor{library/time time-timezone-constants}@anchor{31ba}@anchor{library/time timezone-constants}@anchor{31bb}
@subsubsection Timezone Constants


@geindex altzone (in module time)
@anchor{library/time time altzone}@anchor{31bc}
@deffn {Data} time.altzone

The offset of the local DST timezone, in seconds west of UTC, if one is defined.
This is negative if the local DST timezone is east of UTC (as in Western Europe,
including the UK).  Only use this if @code{daylight} is nonzero.  See note below.
@end deffn

@geindex daylight (in module time)
@anchor{library/time time daylight}@anchor{31bd}
@deffn {Data} time.daylight

Nonzero if a DST timezone is defined.  See note below.
@end deffn

@geindex timezone (in module time)
@anchor{library/time time timezone}@anchor{31be}
@deffn {Data} time.timezone

The offset of the local (non-DST) timezone, in seconds west of UTC (negative in
most of Western Europe, positive in the US, zero in the UK).  See note below.
@end deffn

@geindex tzname (in module time)
@anchor{library/time time tzname}@anchor{31bf}
@deffn {Data} time.tzname

A tuple of two strings: the first is the name of the local non-DST timezone, the
second is the name of the local DST timezone.  If no DST timezone is defined,
the second string should not be used.  See note below.
@end deffn

@cartouche
@quotation Note 
For the above Timezone constants (@ref{31bc,,altzone}, @ref{31bd,,daylight}, @ref{31be,,timezone},
and @ref{31bf,,tzname}), the value is determined by the timezone rules in effect
at module load time or the last time @ref{31b2,,tzset()} is called and may be incorrect
for times in the past.  It is recommended to use the @ref{31a5,,tm_gmtoff} and
@ref{31a6,,tm_zone} results from @ref{1705,,localtime()} to obtain timezone information.
@end quotation
@end cartouche


@subsubheading See also



@table @asis

@item Module @ref{34,,datetime}

More object-oriented interface to dates and times.

@item Module @ref{8a,,locale}

Internationalization services.  The locale setting affects the interpretation
of many format specifiers in @ref{13f5,,strftime()} and @ref{1639,,strptime()}.

@item Module @ref{15,,calendar}

General calendar-related functions.   @ref{29b1,,timegm()} is the
inverse of @ref{13cc,,gmtime()} from this module.
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node logging — Logging facility for Python,logging config — Logging configuration,time — Time access and conversions,Generic Operating System Services
@anchor{library/logging doc}@anchor{31c0}@anchor{library/logging logging-logging-facility-for-python}@anchor{31c1}@anchor{library/logging module-logging}@anchor{8b}@anchor{library/logging translation-repo}@anchor{31c2}
@subsection @code{logging} — Logging facility for Python


@geindex module; logging

`Source code:' Lib/logging/__init__.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/logging/__init__.py}

@geindex Errors; logging

@subsubheading Important



This page contains the API reference information. For tutorial
information and discussion of more advanced topics, see


@itemize *

@item 
@ref{1401,,Basic Tutorial}

@item 
@ref{1402,,Advanced Tutorial}

@item 
@ref{1403,,Logging Cookbook}
@end itemize


__________________________________________________________________


This module defines functions and classes which implement a flexible event
logging system for applications and libraries.

The key benefit of having the logging API provided by a standard library module
is that all Python modules can participate in logging, so your application log
can include your own messages integrated with messages from third-party
modules.

Here’s a simple example of idiomatic usage:

@example
# myapp.py
import logging
import mylib
logger = logging.getLogger(__name__)

def main():
    logging.basicConfig(filename='myapp.log', level=logging.INFO)
    logger.info('Started')
    mylib.do_something()
    logger.info('Finished')

if __name__ == '__main__':
    main()
@end example

@example
# mylib.py
import logging
logger = logging.getLogger(__name__)

def do_something():
    logger.info('Doing something')
@end example

If you run `myapp.py', you should see this in `myapp.log':

@example
INFO:__main__:Started
INFO:mylib:Doing something
INFO:__main__:Finished
@end example

The key feature of this idiomatic usage is that the majority of code is simply
creating a module level logger with @code{getLogger(__name__)}, and using that
logger to do any needed logging. This is concise, while allowing downstream
code fine-grained control if needed. Logged messages to the module-level logger
get forwarded to handlers of loggers in higher-level modules, all the way up to
the highest-level logger known as the root logger; this approach is known as
hierarchical logging.

For logging to be useful, it needs to be configured: setting the levels and
destinations for each logger, potentially changing how specific modules log,
often based on command-line arguments or application configuration. In most
cases, like the one above, only the root logger needs to be so configured, since
all the lower level loggers at module level eventually forward their messages to
its handlers.  @ref{bf9,,basicConfig()} provides a quick way to configure
the root logger that handles many use cases.

The module provides a lot of functionality and flexibility.  If you are
unfamiliar with logging, the best way to get to grips with it is to view the
tutorials (`see the links above and on the right').

The basic classes defined by the module, together with their attributes and
methods, are listed in the sections below.


@itemize *

@item 
Loggers expose the interface that application code directly uses.

@item 
Handlers send the log records (created by loggers) to the appropriate
destination.

@item 
Filters provide a finer grained facility for determining which log records
to output.

@item 
Formatters specify the layout of log records in the final output.
@end itemize

@menu
* Logger Objects:: 
* Logging Levels:: 
* Handler Objects:: 
* Formatter Objects:: 
* Filter Objects:: 
* LogRecord Objects:: 
* LogRecord attributes:: 
* LoggerAdapter Objects:: 
* Thread Safety:: 
* Module-Level Functions:: 
* Module-Level Attributes:: 
* Integration with the warnings module:: 

@end menu

@node Logger Objects,Logging Levels,,logging — Logging facility for Python
@anchor{library/logging logger}@anchor{31c3}@anchor{library/logging logger-objects}@anchor{31c4}
@subsubsection Logger Objects


Loggers have the following attributes and methods.  Note that Loggers should
`NEVER' be instantiated directly, but always through the module-level function
@code{logging.getLogger(name)}.  Multiple calls to @ref{b5f,,getLogger()} with the same
name will always return a reference to the same Logger object.

The @code{name} is potentially a period-separated hierarchical value, like
@code{foo.bar.baz} (though it could also be just plain @code{foo}, for example).
Loggers that are further down in the hierarchical list are children of loggers
higher up in the list.  For example, given a logger with a name of @code{foo},
loggers with names of @code{foo.bar}, @code{foo.bar.baz}, and @code{foo.bam} are all
descendants of @code{foo}.  In addition, all loggers are descendants of the root
logger. The logger name hierarchy is analogous to the Python package hierarchy,
and identical to it if you organise your loggers on a per-module basis using
the recommended construction @code{logging.getLogger(__name__)}.  That’s because
in a module, @code{__name__} is the module’s name in the Python package namespace.

@geindex Logger (class in logging)
@anchor{library/logging logging Logger}@anchor{d4c}
@deffn {Class} logging.Logger

@geindex name (logging.Logger attribute)
@anchor{library/logging logging Logger name}@anchor{31c5}
@deffn {Attribute} name

This is the logger’s name, and is the value that was passed to @ref{b5f,,getLogger()}
to obtain the logger.

@cartouche
@quotation Note 
This attribute should be treated as read-only.
@end quotation
@end cartouche
@end deffn

@geindex level (logging.Logger attribute)
@anchor{library/logging logging Logger level}@anchor{31c6}
@deffn {Attribute} level

The threshold of this logger, as set by the @ref{169f,,setLevel()} method.

@cartouche
@quotation Note 
Do not set this attribute directly - always use @ref{169f,,setLevel()},
which has checks for the level passed to it.
@end quotation
@end cartouche
@end deffn

@geindex parent (logging.Logger attribute)
@anchor{library/logging logging Logger parent}@anchor{31c7}
@deffn {Attribute} parent

The parent logger of this logger. It may change based on later instantiation
of loggers which are higher up in the namespace hierarchy.

@cartouche
@quotation Note 
This value should be treated as read-only.
@end quotation
@end cartouche
@end deffn

@geindex propagate (logging.Logger attribute)
@anchor{library/logging logging Logger propagate}@anchor{16a1}
@deffn {Attribute} propagate

If this attribute evaluates to true, events logged to this logger will be
passed to the handlers of higher level (ancestor) loggers, in addition to
any handlers attached to this logger. Messages are passed directly to the
ancestor loggers’ handlers - neither the level nor filters of the ancestor
loggers in question are considered.

If this evaluates to false, logging messages are not passed to the handlers
of ancestor loggers.

Spelling it out with an example: If the propagate attribute of the logger named
@code{A.B.C} evaluates to true, any event logged to @code{A.B.C} via a method call such as
@code{logging.getLogger('A.B.C').error(...)} will [subject to passing that logger’s
level and filter settings] be passed in turn to any handlers attached to loggers
named @code{A.B}, @code{A} and the root logger, after first being passed to any handlers
attached to @code{A.B.C}. If any logger in the chain @code{A.B.C}, @code{A.B}, @code{A} has its
@code{propagate} attribute set to false, then that is the last logger whose handlers
are offered the event to handle, and propagation stops at that point.

The constructor sets this attribute to @code{True}.

@cartouche
@quotation Note 
If you attach a handler to a logger `and' one or more of its
ancestors, it may emit the same record multiple times. In general, you
should not need to attach a handler to more than one logger - if you just
attach it to the appropriate logger which is highest in the logger
hierarchy, then it will see all events logged by all descendant loggers,
provided that their propagate setting is left set to @code{True}. A common
scenario is to attach handlers only to the root logger, and to let
propagation take care of the rest.
@end quotation
@end cartouche
@end deffn

@geindex handlers (logging.Logger attribute)
@anchor{library/logging logging Logger handlers}@anchor{31c8}
@deffn {Attribute} handlers

The list of handlers directly attached to this logger instance.

@cartouche
@quotation Note 
This attribute should be treated as read-only; it is normally changed via
the @ref{31c9,,addHandler()} and @ref{31ca,,removeHandler()} methods, which use locks to ensure
thread-safe operation.
@end quotation
@end cartouche
@end deffn

@geindex disabled (logging.Logger attribute)
@anchor{library/logging logging Logger disabled}@anchor{31cb}
@deffn {Attribute} disabled

This attribute disables handling of any events. It is set to @code{False} in the
initializer, and only changed by logging configuration code.

@cartouche
@quotation Note 
This attribute should be treated as read-only.
@end quotation
@end cartouche
@end deffn

@geindex setLevel() (logging.Logger method)
@anchor{library/logging logging Logger setLevel}@anchor{169f}
@deffn {Method} setLevel (level)

Sets the threshold for this logger to `level'. Logging messages which are less
severe than `level' will be ignored; logging messages which have severity `level'
or higher will be emitted by whichever handler or handlers service this logger,
unless a handler’s level has been set to a higher severity level than `level'.

When a logger is created, the level is set to @ref{31cc,,NOTSET} (which causes
all messages to be processed when the logger is the root logger, or delegation
to the parent when the logger is a non-root logger). Note that the root logger
is created with level @ref{2123,,WARNING}.

The term ‘delegation to the parent’ means that if a logger has a level of
NOTSET, its chain of ancestor loggers is traversed until either an ancestor with
a level other than NOTSET is found, or the root is reached.

If an ancestor is found with a level other than NOTSET, then that ancestor’s
level is treated as the effective level of the logger where the ancestor search
began, and is used to determine how a logging event is handled.

If the root is reached, and it has a level of NOTSET, then all messages will be
processed. Otherwise, the root’s level will be used as the effective level.

See @ref{86c,,Logging Levels} for a list of levels.


Changed in version 3.2: The `level' parameter now accepts a string representation of the
level such as ‘INFO’ as an alternative to the integer constants
such as @ref{2122,,INFO}. Note, however, that levels are internally stored
as integers, and methods such as e.g. @ref{31cd,,getEffectiveLevel()} and
@ref{1502,,isEnabledFor()} will return/expect to be passed integers.

@end deffn

@geindex isEnabledFor() (logging.Logger method)
@anchor{library/logging logging Logger isEnabledFor}@anchor{1502}
@deffn {Method} isEnabledFor (level)

Indicates if a message of severity `level' would be processed by this logger.
This method checks first the module-level level set by
@code{logging.disable(level)} and then the logger’s effective level as determined
by @ref{31cd,,getEffectiveLevel()}.
@end deffn

@geindex getEffectiveLevel() (logging.Logger method)
@anchor{library/logging logging Logger getEffectiveLevel}@anchor{31cd}
@deffn {Method} getEffectiveLevel ()

Indicates the effective level for this logger. If a value other than
@ref{31cc,,NOTSET} has been set using @ref{169f,,setLevel()}, it is returned. Otherwise,
the hierarchy is traversed towards the root until a value other than
@code{NOTSET} is found, and that value is returned. The value returned is
an integer, typically one of @ref{2121,,logging.DEBUG}, @ref{2122,,logging.INFO}
etc.
@end deffn

@geindex getChild() (logging.Logger method)
@anchor{library/logging logging Logger getChild}@anchor{1500}
@deffn {Method} getChild (suffix)

Returns a logger which is a descendant to this logger, as determined by the suffix.
Thus, @code{logging.getLogger('abc').getChild('def.ghi')} would return the same
logger as would be returned by @code{logging.getLogger('abc.def.ghi')}. This is a
convenience method, useful when the parent logger is named using e.g. @code{__name__}
rather than a literal string.


Added in version 3.2.

@end deffn

@geindex getChildren() (logging.Logger method)
@anchor{library/logging logging Logger getChildren}@anchor{1b96}
@deffn {Method} getChildren ()

Returns a set of loggers which are immediate children of this logger. So for
example @code{logging.getLogger().getChildren()} might return a set containing
loggers named @code{foo} and @code{bar}, but a logger named @code{foo.bar} wouldn’t be
included in the set. Likewise, @code{logging.getLogger('foo').getChildren()} might
return a set including a logger named @code{foo.bar}, but it wouldn’t include one
named @code{foo.bar.baz}.


Added in version 3.12.

@end deffn

@geindex debug() (logging.Logger method)
@anchor{library/logging logging Logger debug}@anchor{1031}
@deffn {Method} debug (msg, *args, **kwargs)

Logs a message with level @ref{2121,,DEBUG} on this logger. The `msg' is the
message format string, and the `args' are the arguments which are merged into
`msg' using the string formatting operator. (Note that this means that you can
use keywords in the format string, together with a single dictionary argument.)
No % formatting operation is performed on `msg' when no `args' are supplied.

There are four keyword arguments in `kwargs' which are inspected:
`exc_info', `stack_info', `stacklevel' and `extra'.

If `exc_info' does not evaluate as false, it causes exception information to be
added to the logging message. If an exception tuple (in the format returned by
@ref{89c,,sys.exc_info()}) or an exception instance is provided, it is used;
otherwise, @code{sys.exc_info()} is called to get the exception information.

The second optional keyword argument is `stack_info', which defaults to
@code{False}. If true, stack information is added to the logging
message, including the actual logging call. Note that this is not the same
stack information as that displayed through specifying `exc_info': The
former is stack frames from the bottom of the stack up to the logging call
in the current thread, whereas the latter is information about stack frames
which have been unwound, following an exception, while searching for
exception handlers.

You can specify `stack_info' independently of `exc_info', e.g. to just show
how you got to a certain point in your code, even when no exceptions were
raised. The stack frames are printed following a header line which says:

@example
Stack (most recent call last):
@end example

This mimics the @code{Traceback (most recent call last):} which is used when
displaying exception frames.

The third optional keyword argument is `stacklevel', which defaults to @code{1}.
If greater than 1, the corresponding number of stack frames are skipped
when computing the line number and function name set in the @ref{11ec,,LogRecord}
created for the logging event. This can be used in logging helpers so that
the function name, filename and line number recorded are not the information
for the helper function/method, but rather its caller. The name of this
parameter mirrors the equivalent one in the @ref{119,,warnings} module.

The fourth keyword argument is `extra' which can be used to pass a
dictionary which is used to populate the @ref{77e,,__dict__} of the
@ref{11ec,,LogRecord}
created for the logging event with user-defined attributes. These custom
attributes can then be used as you like. For example, they could be
incorporated into logged messages. For example:

@example
FORMAT = '%(asctime)s %(clientip)-15s %(user)-8s %(message)s'
logging.basicConfig(format=FORMAT)
d = @{'clientip': '192.168.0.1', 'user': 'fbloggs'@}
logger = logging.getLogger('tcpserver')
logger.warning('Protocol problem: %s', 'connection reset', extra=d)
@end example

would print something like

@example
2006-02-08 22:20:02,165 192.168.0.1 fbloggs  Protocol problem: connection reset
@end example

The keys in the dictionary passed in `extra' should not clash with the keys used
by the logging system. (See the section on @ref{31ce,,LogRecord attributes} for more
information on which keys are used by the logging system.)

If you choose to use these attributes in logged messages, you need to exercise
some care. In the above example, for instance, the @ref{16a3,,Formatter} has been
set up with a format string which expects ‘clientip’ and ‘user’ in the attribute
dictionary of the @ref{11ec,,LogRecord}. If these are missing, the message will
not be logged because a string formatting exception will occur. So in this case,
you always need to pass the `extra' dictionary with these keys.

While this might be annoying, this feature is intended for use in specialized
circumstances, such as multi-threaded servers where the same code executes in
many contexts, and interesting conditions which arise are dependent on this
context (such as remote client IP address and authenticated user name, in the
above example). In such circumstances, it is likely that specialized
@ref{16a3,,Formatter}s would be used with particular @ref{16a2,,Handler}s.

If no handler is attached to this logger (or any of its ancestors,
taking into account the relevant @ref{16a1,,Logger.propagate} attributes),
the message will be sent to the handler set on @ref{1406,,lastResort}.


Changed in version 3.2: The `stack_info' parameter was added.



Changed in version 3.5: The `exc_info' parameter can now accept exception instances.



Changed in version 3.8: The `stacklevel' parameter was added.

@end deffn

@geindex info() (logging.Logger method)
@anchor{library/logging logging Logger info}@anchor{31cf}
@deffn {Method} info (msg, *args, **kwargs)

Logs a message with level @ref{2122,,INFO} on this logger. The arguments are
interpreted as for @ref{31d0,,debug()}.
@end deffn

@geindex warning() (logging.Logger method)
@anchor{library/logging logging Logger warning}@anchor{1aba}
@deffn {Method} warning (msg, *args, **kwargs)

Logs a message with level @ref{2123,,WARNING} on this logger. The arguments are
interpreted as for @ref{31d0,,debug()}.

@cartouche
@quotation Note 
There is an obsolete method @code{warn} which is functionally
identical to @code{warning}. As @code{warn} is deprecated, please do not use
it - use @code{warning} instead.
@end quotation
@end cartouche
@end deffn

@geindex error() (logging.Logger method)
@anchor{library/logging logging Logger error}@anchor{31d1}
@deffn {Method} error (msg, *args, **kwargs)

Logs a message with level @ref{2124,,ERROR} on this logger. The arguments are
interpreted as for @ref{31d0,,debug()}.
@end deffn

@geindex critical() (logging.Logger method)
@anchor{library/logging logging Logger critical}@anchor{1030}
@deffn {Method} critical (msg, *args, **kwargs)

Logs a message with level @ref{2125,,CRITICAL} on this logger. The arguments are
interpreted as for @ref{31d0,,debug()}.
@end deffn

@geindex log() (logging.Logger method)
@anchor{library/logging logging Logger log}@anchor{102e}
@deffn {Method} log (level, msg, *args, **kwargs)

Logs a message with integer level `level' on this logger. The other arguments are
interpreted as for @ref{31d0,,debug()}.
@end deffn

@geindex exception() (logging.Logger method)
@anchor{library/logging logging Logger exception}@anchor{102f}
@deffn {Method} exception (msg, *args, **kwargs)

Logs a message with level @ref{2124,,ERROR} on this logger. The arguments are
interpreted as for @ref{31d0,,debug()}. Exception info is added to the logging
message. This method should only be called from an exception handler.
@end deffn

@geindex addFilter() (logging.Logger method)
@anchor{library/logging logging Logger addFilter}@anchor{31d2}
@deffn {Method} addFilter (filter)

Adds the specified filter `filter' to this logger.
@end deffn

@geindex removeFilter() (logging.Logger method)
@anchor{library/logging logging Logger removeFilter}@anchor{31d3}
@deffn {Method} removeFilter (filter)

Removes the specified filter `filter' from this logger.
@end deffn

@geindex filter() (logging.Logger method)
@anchor{library/logging logging Logger filter}@anchor{31d4}
@deffn {Method} filter (record)

Apply this logger’s filters to the record and return @code{True} if the
record is to be processed. The filters are consulted in turn, until one of
them returns a false value. If none of them return a false value, the record
will be processed (passed to handlers). If one returns a false value, no
further processing of the record occurs.
@end deffn

@geindex addHandler() (logging.Logger method)
@anchor{library/logging logging Logger addHandler}@anchor{31c9}
@deffn {Method} addHandler (hdlr)

Adds the specified handler `hdlr' to this logger.
@end deffn

@geindex removeHandler() (logging.Logger method)
@anchor{library/logging logging Logger removeHandler}@anchor{31ca}
@deffn {Method} removeHandler (hdlr)

Removes the specified handler `hdlr' from this logger.
@end deffn

@geindex findCaller() (logging.Logger method)
@anchor{library/logging logging Logger findCaller}@anchor{31d5}
@deffn {Method} findCaller (stack_info=False, stacklevel=1)

Finds the caller’s source filename and line number. Returns the filename, line
number, function name and stack information as a 4-element tuple. The stack
information is returned as @code{None} unless `stack_info' is @code{True}.

The `stacklevel' parameter is passed from code calling the @ref{31d0,,debug()}
and other APIs. If greater than 1, the excess is used to skip stack frames
before determining the values to be returned. This will generally be useful
when calling logging APIs from helper/wrapper code, so that the information
in the event log refers not to the helper/wrapper code, but to the code that
calls it.
@end deffn

@geindex handle() (logging.Logger method)
@anchor{library/logging logging Logger handle}@anchor{31d6}
@deffn {Method} handle (record)

Handles a record by passing it to all handlers associated with this logger and
its ancestors (until a false value of `propagate' is found). This method is used
for unpickled records received from a socket, as well as those created locally.
Logger-level filtering is applied using @ref{31d4,,filter()}.
@end deffn

@geindex makeRecord() (logging.Logger method)
@anchor{library/logging logging Logger makeRecord}@anchor{31d7}
@deffn {Method} makeRecord (name, level, fn, lno, msg, args, exc_info, func=None, extra=None, sinfo=None)

This is a factory method which can be overridden in subclasses to create
specialized @ref{11ec,,LogRecord} instances.
@end deffn

@geindex hasHandlers() (logging.Logger method)
@anchor{library/logging logging Logger hasHandlers}@anchor{31d8}
@deffn {Method} hasHandlers ()

Checks to see if this logger has any handlers configured. This is done by
looking for handlers in this logger and its parents in the logger hierarchy.
Returns @code{True} if a handler was found, else @code{False}. The method stops searching
up the hierarchy whenever a logger with the ‘propagate’ attribute set to
false is found - that will be the last logger which is checked for the
existence of handlers.


Added in version 3.2.

@end deffn


Changed in version 3.7: Loggers can now be pickled and unpickled.

@end deffn

@node Logging Levels,Handler Objects,Logger Objects,logging — Logging facility for Python
@anchor{library/logging levels}@anchor{86c}@anchor{library/logging logging-levels}@anchor{31d9}
@subsubsection Logging Levels


The numeric values of logging levels are given in the following table. These are
primarily of interest if you want to define your own levels, and need them to
have specific values relative to the predefined levels. If you define a level
with the same numeric value, it overwrites the predefined value; the predefined
name is lost.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Level

@tab

Numeric value

@tab

What it means / When to use it

@item

@geindex NOTSET (in module logging)
@anchor{library/logging logging NOTSET}@anchor{31cc}
@deffn {Data} logging.NOTSET
@end deffn

@tab

0

@tab

When set on a logger, indicates that
ancestor loggers are to be consulted
to determine the effective level.
If that still resolves to
@code{NOTSET}, then all events
are logged. When set on a handler,
all events are handled.

@item

@geindex DEBUG (in module logging)
@anchor{library/logging logging DEBUG}@anchor{2121}
@deffn {Data} logging.DEBUG
@end deffn

@tab

10

@tab

Detailed information, typically only
of interest to a developer trying to
diagnose a problem.

@item

@geindex INFO (in module logging)
@anchor{library/logging logging INFO}@anchor{2122}
@deffn {Data} logging.INFO
@end deffn

@tab

20

@tab

Confirmation that things are working
as expected.

@item

@geindex WARNING (in module logging)
@anchor{library/logging logging WARNING}@anchor{2123}
@deffn {Data} logging.WARNING
@end deffn

@tab

30

@tab

An indication that something
unexpected happened, or that a
problem might occur in the near
future (e.g. ‘disk space low’). The
software is still working as
expected.

@item

@geindex ERROR (in module logging)
@anchor{library/logging logging ERROR}@anchor{2124}
@deffn {Data} logging.ERROR
@end deffn

@tab

40

@tab

Due to a more serious problem, the
software has not been able to
perform some function.

@item

@geindex CRITICAL (in module logging)
@anchor{library/logging logging CRITICAL}@anchor{2125}
@deffn {Data} logging.CRITICAL
@end deffn

@tab

50

@tab

A serious error, indicating that the
program itself may be unable to
continue running.

@end multitable


@node Handler Objects,Formatter Objects,Logging Levels,logging — Logging facility for Python
@anchor{library/logging handler}@anchor{31da}@anchor{library/logging handler-objects}@anchor{31db}
@subsubsection Handler Objects


Handlers have the following attributes and methods. Note that @ref{16a2,,Handler}
is never instantiated directly; this class acts as a base for more useful
subclasses. However, the @code{__init__()} method in subclasses needs to call
@ref{31dc,,Handler.__init__()}.

@geindex Handler (class in logging)
@anchor{library/logging logging Handler}@anchor{16a2}
@deffn {Class} logging.Handler

@geindex __init__() (logging.Handler method)
@anchor{library/logging logging Handler __init__}@anchor{31dc}
@deffn {Method} __init__ (level=NOTSET)

Initializes the @code{Handler} instance by setting its level, setting the list
of filters to the empty list and creating a lock (using @ref{31dd,,createLock()}) for
serializing access to an I/O mechanism.
@end deffn

@geindex createLock() (logging.Handler method)
@anchor{library/logging logging Handler createLock}@anchor{31dd}
@deffn {Method} createLock ()

Initializes a thread lock which can be used to serialize access to underlying
I/O functionality which may not be threadsafe.
@end deffn

@geindex acquire() (logging.Handler method)
@anchor{library/logging logging Handler acquire}@anchor{31de}
@deffn {Method} acquire ()

Acquires the thread lock created with @ref{31dd,,createLock()}.
@end deffn

@geindex release() (logging.Handler method)
@anchor{library/logging logging Handler release}@anchor{31df}
@deffn {Method} release ()

Releases the thread lock acquired with @ref{31de,,acquire()}.
@end deffn

@geindex setLevel() (logging.Handler method)
@anchor{library/logging logging Handler setLevel}@anchor{31e0}
@deffn {Method} setLevel (level)

Sets the threshold for this handler to `level'. Logging messages which are
less severe than `level' will be ignored. When a handler is created, the
level is set to @ref{31cc,,NOTSET} (which causes all messages to be
processed).

See @ref{86c,,Logging Levels} for a list of levels.


Changed in version 3.2: The `level' parameter now accepts a string representation of the
level such as ‘INFO’ as an alternative to the integer constants
such as @ref{2122,,INFO}.

@end deffn

@geindex setFormatter() (logging.Handler method)
@anchor{library/logging logging Handler setFormatter}@anchor{31e1}
@deffn {Method} setFormatter (fmt)

Sets the formatter for this handler to `fmt'.
The `fmt' argument must be a @ref{16a3,,Formatter} instance or @code{None}.
@end deffn

@geindex addFilter() (logging.Handler method)
@anchor{library/logging logging Handler addFilter}@anchor{31e2}
@deffn {Method} addFilter (filter)

Adds the specified filter `filter' to this handler.
@end deffn

@geindex removeFilter() (logging.Handler method)
@anchor{library/logging logging Handler removeFilter}@anchor{31e3}
@deffn {Method} removeFilter (filter)

Removes the specified filter `filter' from this handler.
@end deffn

@geindex filter() (logging.Handler method)
@anchor{library/logging logging Handler filter}@anchor{31e4}
@deffn {Method} filter (record)

Apply this handler’s filters to the record and return @code{True} if the
record is to be processed. The filters are consulted in turn, until one of
them returns a false value. If none of them return a false value, the record
will be emitted. If one returns a false value, the handler will not emit the
record.
@end deffn

@geindex flush() (logging.Handler method)
@anchor{library/logging logging Handler flush}@anchor{31e5}
@deffn {Method} flush ()

Ensure all logging output has been flushed. This version does nothing and is
intended to be implemented by subclasses.
@end deffn

@geindex close() (logging.Handler method)
@anchor{library/logging logging Handler close}@anchor{31e6}
@deffn {Method} close ()

Tidy up any resources used by the handler. This version does no output
but removes the handler from an internal map of handlers, which is used
for handler lookup by name.

Subclasses should ensure that this gets called from overridden @code{close()}
methods.
@end deffn

@geindex handle() (logging.Handler method)
@anchor{library/logging logging Handler handle}@anchor{31e7}
@deffn {Method} handle (record)

Conditionally emits the specified logging record, depending on filters which may
have been added to the handler. Wraps the actual emission of the record with
acquisition/release of the I/O thread lock.
@end deffn

@geindex handleError() (logging.Handler method)
@anchor{library/logging logging Handler handleError}@anchor{31e8}
@deffn {Method} handleError (record)

This method should be called from handlers when an exception is encountered
during an @ref{31e9,,emit()} call. If the module-level attribute
@ref{1405,,raiseExceptions} is @code{False}, exceptions get silently ignored. This is
what is mostly wanted for a logging system - most users will not care about
errors in the logging system, they are more interested in application
errors. You could, however, replace this with a custom handler if you wish.
The specified record is the one which was being processed when the exception
occurred. (The default value of @code{raiseExceptions} is @code{True}, as that is
more useful during development).
@end deffn

@geindex format() (logging.Handler method)
@anchor{library/logging logging Handler format}@anchor{31ea}
@deffn {Method} format (record)

Do formatting for a record - if a formatter is set, use it. Otherwise, use the
default formatter for the module.
@end deffn

@geindex emit() (logging.Handler method)
@anchor{library/logging logging Handler emit}@anchor{31e9}
@deffn {Method} emit (record)

Do whatever it takes to actually log the specified logging record. This version
is intended to be implemented by subclasses and so raises a
@ref{369,,NotImplementedError}.

@cartouche
@quotation Warning 
This method is called after a handler-level lock is acquired, which
is released after this method returns. When you override this method, note
that you should be careful when calling anything that invokes other parts of
the logging API which might do locking, because that might result in a
deadlock. Specifically:


@itemize *

@item 
Logging configuration APIs acquire the module-level lock, and then
individual handler-level locks as those handlers are configured.

@item 
Many logging APIs lock the module-level lock. If such an API is called
from this method, it could cause a deadlock if a configuration call is
made on another thread, because that thread will try to acquire the
module-level lock `before' the handler-level lock, whereas this thread
tries to acquire the module-level lock `after' the handler-level lock
(because in this method, the handler-level lock has already been acquired).
@end itemize
@end quotation
@end cartouche
@end deffn
@end deffn

For a list of handlers included as standard, see @ref{8d,,logging.handlers}.

@node Formatter Objects,Filter Objects,Handler Objects,logging — Logging facility for Python
@anchor{library/logging formatter-objects}@anchor{31eb}@anchor{library/logging id1}@anchor{31ec}
@subsubsection Formatter Objects


@geindex Formatter (class in logging)
@anchor{library/logging logging Formatter}@anchor{16a3}
@deffn {Class} logging.Formatter (fmt=None, datefmt=None, style='%', validate=True, *, defaults=None)

Responsible for converting a @ref{11ec,,LogRecord} to an output string
to be interpreted by a human or external system.

@*Parameters: 

@itemize *

@item 
@code{fmt} (@ref{16a,,str}) – A format string in the given `style' for
the logged output as a whole.
The possible mapping keys are drawn from the @ref{11ec,,LogRecord} object’s
@ref{31ce,,LogRecord attributes}.
If not specified, @code{'%(message)s'} is used,
which is just the logged message.

@item 
@code{datefmt} (@ref{16a,,str}) – A format string for the date/time portion of the logged output.
If not specified, the default described in @ref{31ed,,formatTime()} is used.

@item 
@code{style} (@ref{16a,,str}) – Can be one of @code{'%'}, @code{'@{'} or @code{'$'} and determines
how the format string will be merged with its data: using one of
@ref{8dd,,printf-style String Formatting} (@code{%}), @ref{834,,str.format()} (@code{@{})
or @ref{899,,string.Template} (@code{$}). This only applies to
`fmt' (e.g. @code{'%(message)s'} versus @code{'@{message@}'}),
not to the actual log messages passed to the logging methods.
However, there are @ref{31ee,,other ways}
to use @code{@{}- and @code{$}-formatting for log messages.

@item 
@code{validate} (@ref{3c1,,bool}) – If @code{True} (the default), incorrect or mismatched
`fmt' and `style' will raise a @ref{2ee,,ValueError}; for example,
@code{logging.Formatter('%(asctime)s - %(message)s', style='@{')}.

@item 
@code{defaults} (@ref{184,,dict}@code{[}@ref{16a,,str}@code{, }@code{Any}@code{]}) – A dictionary with default values to use in custom fields.
For example,
@code{logging.Formatter('%(ip)s %(message)s', defaults=@{"ip": None@})}
@end itemize



Changed in version 3.2: Added the `style' parameter.



Changed in version 3.8: Added the `validate' parameter.



Changed in version 3.10: Added the `defaults' parameter.


@geindex format() (logging.Formatter method)
@anchor{library/logging logging Formatter format}@anchor{31ef}
@deffn {Method} format (record)

The record’s attribute dictionary is used as the operand to a string
formatting operation. Returns the resulting string. Before formatting the
dictionary, a couple of preparatory steps are carried out. The `message'
attribute of the record is computed using `msg' % `args'. If the
formatting string contains @code{'(asctime)'}, @ref{31ed,,formatTime()} is called
to format the event time. If there is exception information, it is
formatted using @ref{31f0,,formatException()} and appended to the message. Note
that the formatted exception information is cached in attribute
`exc_text'. This is useful because the exception information can be
pickled and sent across the wire, but you should be careful if you have
more than one @code{Formatter} subclass which customizes the formatting
of exception information. In this case, you will have to clear the cached
value (by setting the `exc_text' attribute to @code{None}) after a formatter
has done its formatting, so that the next formatter to handle the event
doesn’t use the cached value, but recalculates it afresh.

If stack information is available, it’s appended after the exception
information, using @ref{31f1,,formatStack()} to transform it if necessary.
@end deffn

@geindex formatTime() (logging.Formatter method)
@anchor{library/logging logging Formatter formatTime}@anchor{31ed}
@deffn {Method} formatTime (record, datefmt=None)

This method should be called from @ref{19a,,format()} by a formatter which
wants to make use of a formatted time. This method can be overridden in
formatters to provide for any specific requirement, but the basic behavior
is as follows: if `datefmt' (a string) is specified, it is used with
@ref{13f5,,time.strftime()} to format the creation time of the
record. Otherwise, the format ‘%Y-%m-%d %H:%M:%S,uuu’ is used, where the
uuu part is a millisecond value and the other letters are as per the
@code{time.strftime()} documentation.  An example time in this format is
@code{2003-01-23 00:29:50,411}.  The resulting string is returned.

This function uses a user-configurable function to convert the creation
time to a tuple. By default, @ref{1705,,time.localtime()} is used; to change
this for a particular formatter instance, set the @code{converter} attribute
to a function with the same signature as @code{time.localtime()} or
@ref{13cc,,time.gmtime()}. To change it for all formatters, for example if you
want all logging times to be shown in GMT, set the @code{converter}
attribute in the @code{Formatter} class.


Changed in version 3.3: Previously, the default format was hard-coded as in this example:
@code{2010-09-06 22:38:15,292} where the part before the comma is
handled by a strptime format string (@code{'%Y-%m-%d %H:%M:%S'}), and the
part after the comma is a millisecond value. Because strptime does not
have a format placeholder for milliseconds, the millisecond value is
appended using another format string, @code{'%s,%03d'} — and both of these
format strings have been hardcoded into this method. With the change,
these strings are defined as class-level attributes which can be
overridden at the instance level when desired. The names of the
attributes are @code{default_time_format} (for the strptime format string)
and @code{default_msec_format} (for appending the millisecond value).



Changed in version 3.9: The @code{default_msec_format} can be @code{None}.

@end deffn

@geindex formatException() (logging.Formatter method)
@anchor{library/logging logging Formatter formatException}@anchor{31f0}
@deffn {Method} formatException (exc_info)

Formats the specified exception information (a standard exception tuple as
returned by @ref{89c,,sys.exc_info()}) as a string. This default implementation
just uses @ref{a55,,traceback.print_exception()}. The resulting string is
returned.
@end deffn

@geindex formatStack() (logging.Formatter method)
@anchor{library/logging logging Formatter formatStack}@anchor{31f1}
@deffn {Method} formatStack (stack_info)

Formats the specified stack information (a string as returned by
@ref{108c,,traceback.print_stack()}, but with the last newline removed) as a
string. This default implementation just returns the input value.
@end deffn
@end deffn

@geindex BufferingFormatter (class in logging)
@anchor{library/logging logging BufferingFormatter}@anchor{31f2}
@deffn {Class} logging.BufferingFormatter (linefmt=None)

A base formatter class suitable for subclassing when you want to format a
number of records. You can pass a @ref{16a3,,Formatter} instance which you want
to use to format each line (that corresponds to a single record). If not
specified, the default formatter (which just outputs the event message) is
used as the line formatter.

@geindex formatHeader() (logging.BufferingFormatter method)
@anchor{library/logging logging BufferingFormatter formatHeader}@anchor{31f3}
@deffn {Method} formatHeader (records)

Return a header for a list of `records'. The base implementation just
returns the empty string. You will need to override this method if you
want specific behaviour, e.g. to show the count of records, a title or a
separator line.
@end deffn

@geindex formatFooter() (logging.BufferingFormatter method)
@anchor{library/logging logging BufferingFormatter formatFooter}@anchor{31f4}
@deffn {Method} formatFooter (records)

Return a footer for a list of `records'. The base implementation just
returns the empty string. You will need to override this method if you
want specific behaviour, e.g. to show the count of records or a separator
line.
@end deffn

@geindex format() (logging.BufferingFormatter method)
@anchor{library/logging logging BufferingFormatter format}@anchor{31f5}
@deffn {Method} format (records)

Return formatted text for a list of `records'. The base implementation
just returns the empty string if there are no records; otherwise, it
returns the concatenation of the header, each record formatted with the
line formatter, and the footer.
@end deffn
@end deffn

@node Filter Objects,LogRecord Objects,Formatter Objects,logging — Logging facility for Python
@anchor{library/logging filter}@anchor{31f6}@anchor{library/logging filter-objects}@anchor{31f7}
@subsubsection Filter Objects


@code{Filters} can be used by @code{Handlers} and @code{Loggers} for more sophisticated
filtering than is provided by levels. The base filter class only allows events
which are below a certain point in the logger hierarchy. For example, a filter
initialized with ‘A.B’ will allow events logged by loggers ‘A.B’, ‘A.B.C’,
‘A.B.C.D’, ‘A.B.D’ etc. but not ‘A.BB’, ‘B.A.B’ etc. If initialized with the
empty string, all events are passed.

@geindex Filter (class in logging)
@anchor{library/logging logging Filter}@anchor{1407}
@deffn {Class} logging.Filter (name='@w{'})

Returns an instance of the @code{Filter} class. If `name' is specified, it
names a logger which, together with its children, will have its events allowed
through the filter. If `name' is the empty string, allows every event.

@geindex filter() (logging.Filter method)
@anchor{library/logging logging Filter filter}@anchor{31f8}
@deffn {Method} filter (record)

Is the specified record to be logged? Returns false for no, true for
yes. Filters can either modify log records in-place or return a completely
different record instance which will replace the original
log record in any future processing of the event.
@end deffn
@end deffn

Note that filters attached to handlers are consulted before an event is
emitted by the handler, whereas filters attached to loggers are consulted
whenever an event is logged (using @ref{31d0,,debug()}, @ref{31f9,,info()},
etc.), before sending an event to handlers. This means that events which have
been generated by descendant loggers will not be filtered by a logger’s filter
setting, unless the filter has also been applied to those descendant loggers.

You don’t actually need to subclass @code{Filter}: you can pass any instance
which has a @code{filter} method with the same semantics.


Changed in version 3.2: You don’t need to create specialized @code{Filter} classes, or use other
classes with a @code{filter} method: you can use a function (or other
callable) as a filter. The filtering logic will check to see if the filter
object has a @code{filter} attribute: if it does, it’s assumed to be a
@code{Filter} and its @ref{31f8,,filter()} method is called. Otherwise, it’s
assumed to be a callable and called with the record as the single
parameter. The returned value should conform to that returned by
@code{filter()}.



Changed in version 3.12: You can now return a @ref{11ec,,LogRecord} instance from filters to replace
the log record rather than modifying it in place. This allows filters attached to
a @ref{16a2,,Handler} to modify the log record before it is emitted, without
having side effects on other handlers.


Although filters are used primarily to filter records based on more
sophisticated criteria than levels, they get to see every record which is
processed by the handler or logger they’re attached to: this can be useful if
you want to do things like counting how many records were processed by a
particular logger or handler, or adding, changing or removing attributes in
the @ref{11ec,,LogRecord} being processed. Obviously changing the LogRecord needs
to be done with some care, but it does allow the injection of contextual
information into logs (see @ref{31fa,,Using Filters to impart contextual information}).

@node LogRecord Objects,LogRecord attributes,Filter Objects,logging — Logging facility for Python
@anchor{library/logging log-record}@anchor{31fb}@anchor{library/logging logrecord-objects}@anchor{31fc}
@subsubsection LogRecord Objects


@ref{11ec,,LogRecord} instances are created automatically by the @ref{d4c,,Logger}
every time something is logged, and can be created manually via
@ref{31fd,,makeLogRecord()} (for example, from a pickled event received over the
wire).

@geindex LogRecord (class in logging)
@anchor{library/logging logging LogRecord}@anchor{11ec}
@deffn {Class} logging.LogRecord (name, level, pathname, lineno, msg, args, exc_info, func=None, sinfo=None)

Contains all the information pertinent to the event being logged.

The primary information is passed in `msg' and `args',
which are combined using @code{msg % args} to create
the @code{message} attribute of the record.

@*Parameters: 

@itemize *

@item 
@code{name} (@ref{16a,,str}) – The name of the logger used to log the event
represented by this @code{LogRecord}.
Note that the logger name in the @code{LogRecord}
will always have this value,
even though it may be emitted by a handler
attached to a different (ancestor) logger.

@item 
@code{level} (@ref{19c,,int}) – The @ref{86c,,numeric level} of the logging event
(such as @code{10} for @code{DEBUG}, @code{20} for @code{INFO}, etc).
Note that this is converted to `two' attributes of the LogRecord:
@code{levelno} for the numeric value
and @code{levelname} for the corresponding level name.

@item 
@code{pathname} (@ref{16a,,str}) – The full string path of the source file
where the logging call was made.

@item 
@code{lineno} (@ref{19c,,int}) – The line number in the source file
where the logging call was made.

@item 
@code{msg} (@ref{8bd,,Any}) – The event description message,
which can be a %-format string with placeholders for variable data,
or an arbitrary object (see @ref{31fe,,Using arbitrary objects as messages}).

@item 
@code{args} (@ref{614,,tuple}@code{ | }@ref{184,,dict}@code{[}@ref{16a,,str}@code{, }@ref{8bd,,Any}@code{]}) – Variable data to merge into the `msg' argument
to obtain the event description.

@item 
@code{exc_info} (@ref{614,,tuple}@code{[}@ref{f4a,,type}@code{[}@ref{7d8,,BaseException}@code{]}@code{, }@code{BaseException}@code{, }@ref{cf0,,types.TracebackType}@code{] }@code{| }@code{None}) – An exception tuple with the current exception information,
as returned by @ref{89c,,sys.exc_info()},
or @code{None} if no exception information is available.

@item 
@code{func} (@ref{16a,,str}@code{ | }@code{None}) – The name of the function or method
from which the logging call was invoked.

@item 
@code{sinfo} (@ref{16a,,str}@code{ | }@code{None}) – A text string representing stack information
from the base of the stack in the current thread,
up to the logging call.
@end itemize


@geindex getMessage() (logging.LogRecord method)
@anchor{library/logging logging LogRecord getMessage}@anchor{31ff}
@deffn {Method} getMessage ()

Returns the message for this @code{LogRecord} instance after merging any
user-supplied arguments with the message. If the user-supplied message
argument to the logging call is not a string, @ref{16a,,str()} is called on it to
convert it to a string. This allows use of user-defined classes as
messages, whose @code{__str__} method can return the actual format string to
be used.
@end deffn


Changed in version 3.2: The creation of a @code{LogRecord} has been made more configurable by
providing a factory which is used to create the record. The factory can be
set using @ref{3200,,getLogRecordFactory()} and @ref{3201,,setLogRecordFactory()}
(see this for the factory’s signature).


This functionality can be used to inject your own values into a
@code{LogRecord} at creation time. You can use the following pattern:

@example
old_factory = logging.getLogRecordFactory()

def record_factory(*args, **kwargs):
    record = old_factory(*args, **kwargs)
    record.custom_attribute = 0xdecafbad
    return record

logging.setLogRecordFactory(record_factory)
@end example

With this pattern, multiple factories could be chained, and as long
as they don’t overwrite each other’s attributes or unintentionally
overwrite the standard attributes listed above, there should be no
surprises.
@end deffn

@node LogRecord attributes,LoggerAdapter Objects,LogRecord Objects,logging — Logging facility for Python
@anchor{library/logging id2}@anchor{3202}@anchor{library/logging logrecord-attributes}@anchor{31ce}
@subsubsection LogRecord attributes


The LogRecord has a number of attributes, most of which are derived from the
parameters to the constructor. (Note that the names do not always correspond
exactly between the LogRecord constructor parameters and the LogRecord
attributes.) These attributes can be used to merge data from the record into
the format string. The following table lists (in alphabetical order) the
attribute names, their meanings and the corresponding placeholder in a %-style
format string.

If you are using @{@}-formatting (@ref{834,,str.format()}), you can use
@code{@{attrname@}} as the placeholder in the format string. If you are using
$-formatting (@ref{899,,string.Template}), use the form @code{$@{attrname@}}. In
both cases, of course, replace @code{attrname} with the actual attribute name
you want to use.

In the case of @{@}-formatting, you can specify formatting flags by placing them
after the attribute name, separated from it with a colon. For example: a
placeholder of @code{@{msecs:03.0f@}} would format a millisecond value of @code{4} as
@code{004}. Refer to the @ref{834,,str.format()} documentation for full details on
the options available to you.


@multitable {xxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Attribute name

@tab

Format

@tab

Description

@item

args

@tab

You shouldn’t need to
format this yourself.

@tab

The tuple of arguments merged into @code{msg} to
produce @code{message}, or a dict whose values
are used for the merge (when there is only one
argument, and it is a dictionary).

@item

asctime

@tab

@code{%(asctime)s}

@tab

Human-readable time when the
@ref{11ec,,LogRecord} was created.  By default
this is of the form ‘2003-07-08 16:49:45,896’
(the numbers after the comma are millisecond
portion of the time).

@item

created

@tab

@code{%(created)f}

@tab

Time when the @ref{11ec,,LogRecord} was created
(as returned by @ref{ce6,,time.time_ns()} / 1e9).

@item

exc_info

@tab

You shouldn’t need to
format this yourself.

@tab

Exception tuple (à la @code{sys.exc_info}) or,
if no exception has occurred, @code{None}.

@item

exc_text

@tab

You shouldn’t need to
format this yourself.

@tab

Exception information formatted as a string.
This is set when @ref{31ef,,Formatter.format()} is
invoked, or @code{None} if no exception has
occurred.

@item

filename

@tab

@code{%(filename)s}

@tab

Filename portion of @code{pathname}.

@item

funcName

@tab

@code{%(funcName)s}

@tab

Name of function containing the logging call.

@item

levelname

@tab

@code{%(levelname)s}

@tab

Text logging level for the message
(@code{'DEBUG'}, @code{'INFO'}, @code{'WARNING'},
@code{'ERROR'}, @code{'CRITICAL'}).

@item

levelno

@tab

@code{%(levelno)s}

@tab

Numeric logging level for the message
(@ref{2121,,DEBUG}, @ref{2122,,INFO},
@ref{2123,,WARNING}, @ref{2124,,ERROR},
@ref{2125,,CRITICAL}).

@item

lineno

@tab

@code{%(lineno)d}

@tab

Source line number where the logging call was
issued (if available).

@item

message

@tab

@code{%(message)s}

@tab

The logged message, computed as @code{msg %
args}. This is set when
@ref{31ef,,Formatter.format()} is invoked.

@item

module

@tab

@code{%(module)s}

@tab

Module (name portion of @code{filename}).

@item

msecs

@tab

@code{%(msecs)d}

@tab

Millisecond portion of the time when the
@ref{11ec,,LogRecord} was created.

@item

msg

@tab

You shouldn’t need to
format this yourself.

@tab

The format string passed in the original
logging call. Merged with @code{args} to
produce @code{message}, or an arbitrary object
(see @ref{31fe,,Using arbitrary objects as messages}).

@item

name

@tab

@code{%(name)s}

@tab

Name of the logger used to log the call.

@item

pathname

@tab

@code{%(pathname)s}

@tab

Full pathname of the source file where the
logging call was issued (if available).

@item

process

@tab

@code{%(process)d}

@tab

Process ID (if available).

@item

processName

@tab

@code{%(processName)s}

@tab

Process name (if available).

@item

relativeCreated

@tab

@code{%(relativeCreated)d}

@tab

Time in milliseconds when the LogRecord was
created, relative to the time the logging
module was loaded.

@item

stack_info

@tab

You shouldn’t need to
format this yourself.

@tab

Stack frame information (where available)
from the bottom of the stack in the current
thread, up to and including the stack frame
of the logging call which resulted in the
creation of this record.

@item

thread

@tab

@code{%(thread)d}

@tab

Thread ID (if available).

@item

threadName

@tab

@code{%(threadName)s}

@tab

Thread name (if available).

@item

taskName

@tab

@code{%(taskName)s}

@tab

@ref{1c9,,asyncio.Task} name (if available).

@end multitable



Changed in version 3.1: `processName' was added.



Changed in version 3.12: `taskName' was added.


@node LoggerAdapter Objects,Thread Safety,LogRecord attributes,logging — Logging facility for Python
@anchor{library/logging logger-adapter}@anchor{3203}@anchor{library/logging loggeradapter-objects}@anchor{3204}
@subsubsection LoggerAdapter Objects


@ref{1501,,LoggerAdapter} instances are used to conveniently pass contextual
information into logging calls. For a usage example, see the section on
@ref{3205,,adding contextual information to your logging output}.

@geindex LoggerAdapter (class in logging)
@anchor{library/logging logging LoggerAdapter}@anchor{1501}
@deffn {Class} logging.LoggerAdapter (logger, extra=None, merge_extra=False)

Returns an instance of @code{LoggerAdapter} initialized with an
underlying @ref{d4c,,Logger} instance, an optional dict-like object (`extra'),
and an optional boolean (`merge_extra') indicating whether or not
the `extra' argument of individual log calls should be merged with
the @code{LoggerAdapter} extra.
The default behavior is to ignore the `extra' argument of individual log
calls and only use the one of the @code{LoggerAdapter} instance

@geindex process() (logging.LoggerAdapter method)
@anchor{library/logging logging LoggerAdapter process}@anchor{3206}
@deffn {Method} process (msg, kwargs)

Modifies the message and/or keyword arguments passed to a logging call in
order to insert contextual information. This implementation takes the object
passed as `extra' to the constructor and adds it to `kwargs' using key
‘extra’. The return value is a (`msg', `kwargs') tuple which has the
(possibly modified) versions of the arguments passed in.
@end deffn

@geindex manager (logging.LoggerAdapter attribute)
@anchor{library/logging logging LoggerAdapter manager}@anchor{3207}
@deffn {Attribute} manager

Delegates to the underlying @code{manager} on `logger'.
@end deffn

@geindex _log (logging.LoggerAdapter attribute)
@anchor{library/logging logging LoggerAdapter _log}@anchor{3208}
@deffn {Attribute} _log

Delegates to the underlying @code{_log()} method on `logger'.
@end deffn

In addition to the above, @code{LoggerAdapter} supports the following
methods of @ref{d4c,,Logger}: @ref{1031,,debug()}, @ref{31cf,,info()},
@ref{1aba,,warning()}, @ref{31d1,,error()}, @ref{102f,,exception()},
@ref{1030,,critical()}, @ref{102e,,log()}, @ref{1502,,isEnabledFor()},
@ref{31cd,,getEffectiveLevel()}, @ref{169f,,setLevel()} and
@ref{31d8,,hasHandlers()}. These methods have the same signatures as their
counterparts in @code{Logger}, so you can use the two types of instances
interchangeably.


Changed in version 3.2: The @ref{1502,,isEnabledFor()}, @ref{31cd,,getEffectiveLevel()},
@ref{169f,,setLevel()} and @ref{31d8,,hasHandlers()} methods were added
to @code{LoggerAdapter}.  These methods delegate to the underlying logger.



Changed in version 3.6: Attribute @code{manager} and method @code{_log()} were added, which
delegate to the underlying logger and allow adapters to be nested.



Changed in version 3.10: The `extra' argument is now optional.



Changed in version 3.13: The `merge_extra' parameter was added.

@end deffn

@node Thread Safety,Module-Level Functions,LoggerAdapter Objects,logging — Logging facility for Python
@anchor{library/logging thread-safety}@anchor{3209}
@subsubsection Thread Safety


The logging module is intended to be thread-safe without any special work
needing to be done by its clients. It achieves this through using threading
locks; there is one lock to serialize access to the module’s shared data, and
each handler also creates a lock to serialize access to its underlying I/O.

If you are implementing asynchronous signal handlers using the @ref{cb,,signal}
module, you may not be able to use logging from within such handlers. This is
because lock implementations in the @ref{f3,,threading} module are not always
re-entrant, and so cannot be invoked from such signal handlers.

@node Module-Level Functions,Module-Level Attributes,Thread Safety,logging — Logging facility for Python
@anchor{library/logging module-level-functions}@anchor{320a}
@subsubsection Module-Level Functions


In addition to the classes described above, there are a number of module-level
functions.

@geindex getLogger() (in module logging)
@anchor{library/logging logging getLogger}@anchor{b5f}
@deffn {Function} logging.getLogger (name=None)

Return a logger with the specified name or, if name is @code{None}, return the
root logger of the hierarchy. If specified, the name is typically a
dot-separated hierarchical name like `‘a’', `‘a.b’' or `‘a.b.c.d’'. Choice
of these names is entirely up to the developer who is using logging, though
it is recommended that @code{__name__} be used unless you have a specific
reason for not doing that, as mentioned in @ref{31c3,,Logger Objects}.

All calls to this function with a given name return the same logger instance.
This means that logger instances never need to be passed between different parts
of an application.
@end deffn

@geindex getLoggerClass() (in module logging)
@anchor{library/logging logging getLoggerClass}@anchor{320b}
@deffn {Function} logging.getLoggerClass ()

Return either the standard @ref{d4c,,Logger} class, or the last class passed to
@ref{320c,,setLoggerClass()}. This function may be called from within a new class
definition, to ensure that installing a customized @code{Logger} class will
not undo customizations already applied by other code. For example:

@example
class MyLogger(logging.getLoggerClass()):
    # ... override behaviour here
@end example
@end deffn

@geindex getLogRecordFactory() (in module logging)
@anchor{library/logging logging getLogRecordFactory}@anchor{3200}
@deffn {Function} logging.getLogRecordFactory ()

Return a callable which is used to create a @ref{11ec,,LogRecord}.


Added in version 3.2: This function has been provided, along with @ref{3201,,setLogRecordFactory()},
to allow developers more control over how the @ref{11ec,,LogRecord}
representing a logging event is constructed.


See @ref{3201,,setLogRecordFactory()} for more information about the how the
factory is called.
@end deffn

@geindex debug() (in module logging)
@anchor{library/logging logging debug}@anchor{31d0}
@deffn {Function} logging.debug (msg, *args, **kwargs)

This is a convenience function that calls @ref{1031,,Logger.debug()}, on the root
logger. The handling of the arguments is in every way identical
to what is described in that method.

The only difference is that if the root logger has no handlers, then
@ref{bf9,,basicConfig()} is called, prior to calling @code{debug} on the root logger.

For very short scripts or quick demonstrations of @code{logging} facilities,
@code{debug} and the other module-level functions may be convenient. However,
most programs will want to carefully and explicitly control the logging
configuration, and should therefore prefer creating a module-level logger and
calling @ref{1031,,Logger.debug()} (or other level-specific methods) on it, as
described at the beginning of this documentation.
@end deffn

@geindex info() (in module logging)
@anchor{library/logging logging info}@anchor{31f9}
@deffn {Function} logging.info (msg, *args, **kwargs)

Logs a message with level @ref{2122,,INFO} on the root logger. The arguments and behavior
are otherwise the same as for @ref{31d0,,debug()}.
@end deffn

@geindex warning() (in module logging)
@anchor{library/logging logging warning}@anchor{352}
@deffn {Function} logging.warning (msg, *args, **kwargs)

Logs a message with level @ref{2123,,WARNING} on the root logger. The arguments and behavior
are otherwise the same as for @ref{31d0,,debug()}.

@cartouche
@quotation Note 
There is an obsolete function @code{warn} which is functionally
identical to @code{warning}. As @code{warn} is deprecated, please do not use
it - use @code{warning} instead.
@end quotation
@end cartouche
@end deffn

@geindex error() (in module logging)
@anchor{library/logging logging error}@anchor{320d}
@deffn {Function} logging.error (msg, *args, **kwargs)

Logs a message with level @ref{2124,,ERROR} on the root logger. The arguments and behavior
are otherwise the same as for @ref{31d0,,debug()}.
@end deffn

@geindex critical() (in module logging)
@anchor{library/logging logging critical}@anchor{320e}
@deffn {Function} logging.critical (msg, *args, **kwargs)

Logs a message with level @ref{2125,,CRITICAL} on the root logger. The arguments and behavior
are otherwise the same as for @ref{31d0,,debug()}.
@end deffn

@geindex exception() (in module logging)
@anchor{library/logging logging exception}@anchor{16a0}
@deffn {Function} logging.exception (msg, *args, **kwargs)

Logs a message with level @ref{2124,,ERROR} on the root logger. The arguments and behavior
are otherwise the same as for @ref{31d0,,debug()}. Exception info is added to the logging
message. This function should only be called from an exception handler.
@end deffn

@geindex log() (in module logging)
@anchor{library/logging logging log}@anchor{320f}
@deffn {Function} logging.log (level, msg, *args, **kwargs)

Logs a message with level `level' on the root logger. The arguments and behavior
are otherwise the same as for @ref{31d0,,debug()}.
@end deffn

@geindex disable() (in module logging)
@anchor{library/logging logging disable}@anchor{3210}
@deffn {Function} logging.disable (level=CRITICAL)

Provides an overriding level `level' for all loggers which takes precedence over
the logger’s own level. When the need arises to temporarily throttle logging
output down across the whole application, this function can be useful. Its
effect is to disable all logging calls of severity `level' and below, so that
if you call it with a value of INFO, then all INFO and DEBUG events would be
discarded, whereas those of severity WARNING and above would be processed
according to the logger’s effective level. If
@code{logging.disable(logging.NOTSET)} is called, it effectively removes this
overriding level, so that logging output again depends on the effective
levels of individual loggers.

Note that if you have defined any custom logging level higher than
@code{CRITICAL} (this is not recommended), you won’t be able to rely on the
default value for the `level' parameter, but will have to explicitly supply a
suitable value.


Changed in version 3.7: The `level' parameter was defaulted to level @code{CRITICAL}. See
bpo-28524@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28524} for more information about this change.

@end deffn

@geindex addLevelName() (in module logging)
@anchor{library/logging logging addLevelName}@anchor{3211}
@deffn {Function} logging.addLevelName (level, levelName)

Associates level `level' with text `levelName' in an internal dictionary, which is
used to map numeric levels to a textual representation, for example when a
@ref{16a3,,Formatter} formats a message. This function can also be used to define
your own levels. The only constraints are that all levels used must be
registered using this function, levels should be positive integers and they
should increase in increasing order of severity.

@cartouche
@quotation Note 
If you are thinking of defining your own levels, please see the
section on @ref{3212,,Custom Levels}.
@end quotation
@end cartouche
@end deffn

@geindex getLevelNamesMapping() (in module logging)
@anchor{library/logging logging getLevelNamesMapping}@anchor{86b}
@deffn {Function} logging.getLevelNamesMapping ()

Returns a mapping from level names to their corresponding logging levels. For example, the
string “CRITICAL” maps to @ref{2125,,CRITICAL}. The returned mapping is copied from an internal
mapping on each call to this function.


Added in version 3.11.

@end deffn

@geindex getLevelName() (in module logging)
@anchor{library/logging logging getLevelName}@anchor{3213}
@deffn {Function} logging.getLevelName (level)

Returns the textual or numeric representation of logging level `level'.

If `level' is one of the predefined levels @ref{2125,,CRITICAL}, @ref{2124,,ERROR},
@ref{2123,,WARNING}, @ref{2122,,INFO} or @ref{2121,,DEBUG} then you get the
corresponding string. If you have associated levels with names using
@ref{3211,,addLevelName()} then the name you have associated with `level' is
returned. If a numeric value corresponding to one of the defined levels is
passed in, the corresponding string representation is returned.

The `level' parameter also accepts a string representation of the level such
as ‘INFO’. In such cases, this functions returns the corresponding numeric
value of the level.

If no matching numeric or string value is passed in, the string
‘Level %s’ % level is returned.

@cartouche
@quotation Note 
Levels are internally integers (as they need to be compared in the
logging logic). This function is used to convert between an integer level
and the level name displayed in the formatted log output by means of the
@code{%(levelname)s} format specifier (see @ref{31ce,,LogRecord attributes}), and
vice versa.
@end quotation
@end cartouche


Changed in version 3.4: In Python versions earlier than 3.4, this function could also be passed a
text level, and would return the corresponding numeric value of the level.
This undocumented behaviour was considered a mistake, and was removed in
Python 3.4, but reinstated in 3.4.2 due to retain backward compatibility.

@end deffn

@geindex getHandlerByName() (in module logging)
@anchor{library/logging logging getHandlerByName}@anchor{1ba6}
@deffn {Function} logging.getHandlerByName (name)

Returns a handler with the specified `name', or @code{None} if there is no handler
with that name.


Added in version 3.12.

@end deffn

@geindex getHandlerNames() (in module logging)
@anchor{library/logging logging getHandlerNames}@anchor{1ab4}
@deffn {Function} logging.getHandlerNames ()

Returns an immutable set of all known handler names.


Added in version 3.12.

@end deffn

@geindex makeLogRecord() (in module logging)
@anchor{library/logging logging makeLogRecord}@anchor{31fd}
@deffn {Function} logging.makeLogRecord (attrdict)

Creates and returns a new @ref{11ec,,LogRecord} instance whose attributes are
defined by `attrdict'. This function is useful for taking a pickled
@code{LogRecord} attribute dictionary, sent over a socket, and reconstituting
it as a @code{LogRecord} instance at the receiving end.
@end deffn

@geindex basicConfig() (in module logging)
@anchor{library/logging logging basicConfig}@anchor{bf9}
@deffn {Function} logging.basicConfig (**kwargs)

Does basic configuration for the logging system by creating a
@ref{1404,,StreamHandler} with a default @ref{16a3,,Formatter} and adding it to the
root logger. The functions @ref{31d0,,debug()}, @ref{31f9,,info()}, @ref{352,,warning()},
@ref{320d,,error()} and @ref{320e,,critical()} will call @code{basicConfig()} automatically
if no handlers are defined for the root logger.

This function does nothing if the root logger already has handlers
configured, unless the keyword argument `force' is set to @code{True}.

@cartouche
@quotation Note 
This function should be called from the main thread
before other threads are started. In versions of Python prior to
2.7.1 and 3.2, if this function is called from multiple threads,
it is possible (in rare circumstances) that a handler will be added
to the root logger more than once, leading to unexpected results
such as messages being duplicated in the log.
@end quotation
@end cartouche

The following keyword arguments are supported.


@multitable {xxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Format

@tab

Description

@item

`filename'

@tab

Specifies that a @ref{1c96,,FileHandler} be
created, using the specified filename,
rather than a @ref{1404,,StreamHandler}.

@item

`filemode'

@tab

If `filename' is specified, open the file
in this @ref{2620,,mode}. Defaults
to @code{'a'}.

@item

`format'

@tab

Use the specified format string for the
handler. Defaults to attributes
@code{levelname}, @code{name} and @code{message}
separated by colons.

@item

`datefmt'

@tab

Use the specified date/time format, as
accepted by @ref{13f5,,time.strftime()}.

@item

`style'

@tab

If `format' is specified, use this style
for the format string. One of @code{'%'},
@code{'@{'} or @code{'$'} for @ref{8dd,,printf-style},
@ref{834,,str.format()} or
@ref{899,,string.Template} respectively.
Defaults to @code{'%'}.

@item

`level'

@tab

Set the root logger level to the specified
@ref{86c,,level}.

@item

`stream'

@tab

Use the specified stream to initialize the
@ref{1404,,StreamHandler}. Note that this
argument is incompatible with `filename' -
if both are present, a @code{ValueError} is
raised.

@item

`handlers'

@tab

If specified, this should be an iterable of
already created handlers to add to the root
logger. Any handlers which don’t already
have a formatter set will be assigned the
default formatter created in this function.
Note that this argument is incompatible
with `filename' or `stream' - if both
are present, a @code{ValueError} is raised.

@item

`force'

@tab

If this keyword argument is specified as
true, any existing handlers attached to the
root logger are removed and closed, before
carrying out the configuration as specified
by the other arguments.

@item

`encoding'

@tab

If this keyword argument is specified along
with `filename', its value is used when the
@ref{1c96,,FileHandler} is created, and thus
used when opening the output file.

@item

`errors'

@tab

If this keyword argument is specified along
with `filename', its value is used when the
@ref{1c96,,FileHandler} is created, and thus
used when opening the output file. If not
specified, the value ‘backslashreplace’ is
used. Note that if @code{None} is specified,
it will be passed as such to @ref{318,,open()},
which means that it will be treated the
same as passing ‘errors’.

@end multitable



Changed in version 3.2: The `style' argument was added.



Changed in version 3.3: The `handlers' argument was added. Additional checks were added to
catch situations where incompatible arguments are specified (e.g.
`handlers' together with `stream' or `filename', or `stream'
together with `filename').



Changed in version 3.8: The `force' argument was added.



Changed in version 3.9: The `encoding' and `errors' arguments were added.

@end deffn

@geindex shutdown() (in module logging)
@anchor{library/logging logging shutdown}@anchor{3214}
@deffn {Function} logging.shutdown ()

Informs the logging system to perform an orderly shutdown by flushing and
closing all handlers. This should be called at application exit and no
further use of the logging system should be made after this call.

When the logging module is imported, it registers this function as an exit
handler (see @ref{d,,atexit}), so normally there’s no need to do that
manually.
@end deffn

@geindex setLoggerClass() (in module logging)
@anchor{library/logging logging setLoggerClass}@anchor{320c}
@deffn {Function} logging.setLoggerClass (klass)

Tells the logging system to use the class `klass' when instantiating a logger.
The class should define @code{__init__()} such that only a name argument is
required, and the @code{__init__()} should call @code{Logger.__init__()}. This
function is typically called before any loggers are instantiated by applications
which need to use custom logger behavior. After this call, as at any other
time, do not instantiate loggers directly using the subclass: continue to use
the @ref{b5f,,logging.getLogger()} API to get your loggers.
@end deffn

@geindex setLogRecordFactory() (in module logging)
@anchor{library/logging logging setLogRecordFactory}@anchor{3201}
@deffn {Function} logging.setLogRecordFactory (factory)

Set a callable which is used to create a @ref{11ec,,LogRecord}.

@*Parameters: 
@code{factory} – The factory callable to be used to instantiate a log record.



Added in version 3.2: This function has been provided, along with @ref{3200,,getLogRecordFactory()}, to
allow developers more control over how the @ref{11ec,,LogRecord} representing
a logging event is constructed.


The factory has the following signature:

@code{factory(name, level, fn, lno, msg, args, exc_info, func=None, sinfo=None, **kwargs)}

@quotation

@*name: 
The logger name.


@*level: 
The logging level (numeric).


@*fn: 
The full pathname of the file where the logging call was made.


@*lno: 
The line number in the file where the logging call was made.


@*msg: 
The logging message.


@*args: 
The arguments for the logging message.


@*exc_info: 
An exception tuple, or @code{None}.


@*func: 
The name of the function or method which invoked the logging
call.


@*sinfo: 
A stack traceback such as is provided by
@ref{108c,,traceback.print_stack()}, showing the call hierarchy.


@*kwargs: 
Additional keyword arguments.

@end quotation
@end deffn

@node Module-Level Attributes,Integration with the warnings module,Module-Level Functions,logging — Logging facility for Python
@anchor{library/logging module-level-attributes}@anchor{3215}
@subsubsection Module-Level Attributes


@geindex lastResort (in module logging)
@anchor{library/logging logging lastResort}@anchor{1406}
@deffn {Data} logging.lastResort

A “handler of last resort” is available through this attribute. This
is a @ref{1404,,StreamHandler} writing to @code{sys.stderr} with a level of
@code{WARNING}, and is used to handle logging events in the absence of any
logging configuration. The end result is to just print the message to
@code{sys.stderr}. This replaces the earlier error message saying that
“no handlers could be found for logger XYZ”. If you need the earlier
behaviour for some reason, @code{lastResort} can be set to @code{None}.


Added in version 3.2.

@end deffn

@geindex raiseExceptions (in module logging)
@anchor{library/logging logging raiseExceptions}@anchor{1405}
@deffn {Data} logging.raiseExceptions

Used to see if exceptions during handling should be propagated.

Default: @code{True}.

If @code{raiseExceptions} is @code{False},
exceptions get silently ignored. This is what is mostly wanted
for a logging system - most users will not care about errors in
the logging system, they are more interested in application errors.
@end deffn

@node Integration with the warnings module,,Module-Level Attributes,logging — Logging facility for Python
@anchor{library/logging integration-with-the-warnings-module}@anchor{3216}
@subsubsection Integration with the warnings module


The @ref{3217,,captureWarnings()} function can be used to integrate @code{logging}
with the @ref{119,,warnings} module.

@geindex captureWarnings() (in module logging)
@anchor{library/logging logging captureWarnings}@anchor{3217}
@deffn {Function} logging.captureWarnings (capture)

This function is used to turn the capture of warnings by logging on and
off.

If `capture' is @code{True}, warnings issued by the @ref{119,,warnings} module will
be redirected to the logging system. Specifically, a warning will be
formatted using @ref{1e3b,,warnings.formatwarning()} and the resulting string
logged to a logger named @code{'py.warnings'} with a severity of @ref{2123,,WARNING}.

If `capture' is @code{False}, the redirection of warnings to the logging system
will stop, and warnings will be redirected to their original destinations
(i.e. those in effect before @code{captureWarnings(True)} was called).
@end deffn


@subsubheading See also



@table @asis

@item Module @ref{8c,,logging.config}

Configuration API for the logging module.

@item Module @ref{8d,,logging.handlers}

Useful handlers included with the logging module.

@geindex Python Enhancement Proposals; PEP 282

@item PEP 282@footnote{https://peps.python.org/pep-0282/} - A Logging System

The proposal which described this feature for inclusion in the Python standard
library.

@item Original Python logging package@footnote{https://old.red-dove.com/python_logging.html}

This is the original source for the @code{logging} package.  The version of the
package available from this site is suitable for use with Python 1.5.2, 2.1.x
and 2.2.x, which do not include the @code{logging} package in the standard
library.
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node logging config — Logging configuration,logging handlers — Logging handlers,logging — Logging facility for Python,Generic Operating System Services
@anchor{library/logging config doc}@anchor{3218}@anchor{library/logging config logging-config-logging-configuration}@anchor{3219}@anchor{library/logging config module-logging config}@anchor{8c}@anchor{library/logging config translation-repo}@anchor{321a}
@subsection @code{logging.config} — Logging configuration


@geindex module; logging.config

`Source code:' Lib/logging/config.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/logging/config.py}

@subsubheading Important



This page contains only reference information. For tutorials,
please see


@itemize *

@item 
@ref{1401,,Basic Tutorial}

@item 
@ref{1402,,Advanced Tutorial}

@item 
@ref{1403,,Logging Cookbook}
@end itemize


__________________________________________________________________


This section describes the API for configuring the logging module.

@menu
* Configuration functions:: 
* Security considerations:: 
* Configuration dictionary schema:: 
* Configuration file format:: 

@end menu

@node Configuration functions,Security considerations,,logging config — Logging configuration
@anchor{library/logging config configuration-functions}@anchor{321b}@anchor{library/logging config logging-config-api}@anchor{14fd}
@subsubsection Configuration functions


The following functions configure the logging module. They are located in the
@code{logging.config} module.  Their use is optional — you can configure the
logging module using these functions or by making calls to the main API (defined
in @ref{8b,,logging} itself) and defining handlers which are declared either in
@code{logging} or @ref{8d,,logging.handlers}.

@geindex dictConfig() (in module logging.config)
@anchor{library/logging config logging config dictConfig}@anchor{13bc}
@deffn {Function} logging.config.dictConfig (config)

Takes the logging configuration from a dictionary.  The contents of
this dictionary are described in @ref{321c,,Configuration dictionary schema}
below.

If an error is encountered during configuration, this function will
raise a @ref{2ee,,ValueError}, @ref{199,,TypeError}, @ref{5f0,,AttributeError}
or @ref{65b,,ImportError} with a suitably descriptive message.  The
following is a (possibly incomplete) list of conditions which will
raise an error:


@itemize *

@item 
A @code{level} which is not a string or which is a string not
corresponding to an actual logging level.

@item 
A @code{propagate} value which is not a boolean.

@item 
An id which does not have a corresponding destination.

@item 
A non-existent handler id found during an incremental call.

@item 
An invalid logger name.

@item 
Inability to resolve to an internal or external object.
@end itemize

Parsing is performed by the @code{DictConfigurator} class, whose
constructor is passed the dictionary used for configuration, and
has a @code{configure()} method.  The @code{logging.config} module
has a callable attribute @code{dictConfigClass}
which is initially set to @code{DictConfigurator}.
You can replace the value of @code{dictConfigClass} with a
suitable implementation of your own.

@code{dictConfig()} calls @code{dictConfigClass} passing
the specified dictionary, and then calls the @code{configure()} method on
the returned object to put the configuration into effect:

@example
def dictConfig(config):
    dictConfigClass(config).configure()
@end example

For example, a subclass of @code{DictConfigurator} could call
@code{DictConfigurator.__init__()} in its own @code{__init__()}, then
set up custom prefixes which would be usable in the subsequent
@code{configure()} call. @code{dictConfigClass} would be bound to
this new subclass, and then @code{dictConfig()} could be called exactly as
in the default, uncustomized state.


Added in version 3.2.

@end deffn

@geindex fileConfig() (in module logging.config)
@anchor{library/logging config logging config fileConfig}@anchor{d4e}
@deffn {Function} logging.config.fileConfig (fname, defaults=None, disable_existing_loggers=True, encoding=None)

Reads the logging configuration from a @ref{26,,configparser}-format file. The
format of the file should be as described in
@ref{321d,,Configuration file format}.
This function can be called several times from an application, allowing an
end user to select from various pre-canned configurations (if the developer
provides a mechanism to present the choices and load the chosen
configuration).

It will raise @ref{266,,FileNotFoundError} if the file
doesn’t exist and @ref{246,,RuntimeError} if the file is invalid or
empty.

@*Parameters: 

@itemize *

@item 
@code{fname} – A filename, or a file-like object, or an instance derived
from @ref{116a,,RawConfigParser}. If a
@code{RawConfigParser}-derived instance is passed, it is used as
is. Otherwise, a @ref{4df,,ConfigParser} is
instantiated, and the configuration read by it from the
object passed in @code{fname}. If that has a @ref{bf,,readline()}
method, it is assumed to be a file-like object and read using
@ref{72b,,read_file()}; otherwise,
it is assumed to be a filename and passed to
@ref{1674,,read()}.

@item 
@code{defaults} – Defaults to be passed to the @code{ConfigParser} can be specified
in this argument.

@item 
@code{disable_existing_loggers} – If specified as @code{False}, loggers which
exist when this call is made are left
enabled. The default is @code{True} because this
enables old behaviour in a
backward-compatible way. This behaviour is to
disable any existing non-root loggers unless
they or their ancestors are explicitly named
in the logging configuration.

@item 
@code{encoding} – The encoding used to open file when `fname' is filename.
@end itemize



Changed in version 3.4: An instance of a subclass of @ref{116a,,RawConfigParser} is
  now accepted as a value for @code{fname}. This facilitates:

@quotation


@itemize *

@item 
Use of a configuration file where logging configuration is just part
of the overall application configuration.

@item 
Use of a configuration read from a file, and then modified by the using
application (e.g. based on command-line parameters or other aspects
of the runtime environment) before being passed to @code{fileConfig}.
@end itemize
@end quotation


Changed in version 3.10: Added the `encoding' parameter.



Changed in version 3.12: An exception will be thrown if the provided file
doesn’t exist or is invalid or empty.


@end deffn

@geindex listen() (in module logging.config)
@anchor{library/logging config logging config listen}@anchor{116b}
@deffn {Function} logging.config.listen (port=DEFAULT_LOGGING_CONFIG_PORT, verify=None)

Starts up a socket server on the specified port, and listens for new
configurations. If no port is specified, the module’s default
@code{DEFAULT_LOGGING_CONFIG_PORT} is used. Logging configurations will be
sent as a file suitable for processing by @ref{13bc,,dictConfig()} or
@ref{d4e,,fileConfig()}. Returns a @ref{177,,Thread} instance on which
you can call @ref{179,,start()} to start the server, and which
you can @ref{13f0,,join()} when appropriate. To stop the server,
call @ref{321e,,stopListening()}.

The @code{verify} argument, if specified, should be a callable which should
verify whether bytes received across the socket are valid and should be
processed. This could be done by encrypting and/or signing what is sent
across the socket, such that the @code{verify} callable can perform
signature verification and/or decryption. The @code{verify} callable is called
with a single argument - the bytes received across the socket - and should
return the bytes to be processed, or @code{None} to indicate that the bytes should
be discarded. The returned bytes could be the same as the passed in bytes
(e.g. when only verification is done), or they could be completely different
(perhaps if decryption were performed).

To send a configuration to the socket, read in the configuration file and
send it to the socket as a sequence of bytes preceded by a four-byte length
string packed in binary using @code{struct.pack('>L', n)}.
@anchor{library/logging config logging-eval-security}@anchor{321f}
@cartouche
@quotation Note 
Because portions of the configuration are passed through
@ref{4a4,,eval()}, use of this function may open its users to a security risk.
While the function only binds to a socket on @code{localhost}, and so does
not accept connections from remote machines, there are scenarios where
untrusted code could be run under the account of the process which calls
@code{listen()}. Specifically, if the process calling @code{listen()} runs
on a multi-user machine where users cannot trust each other, then a
malicious user could arrange to run essentially arbitrary code in a
victim user’s process, simply by connecting to the victim’s
@code{listen()} socket and sending a configuration which runs whatever
code the attacker wants to have executed in the victim’s process. This is
especially easy to do if the default port is used, but not hard even if a
different port is used. To avoid the risk of this happening, use the
@code{verify} argument to @code{listen()} to prevent unrecognised
configurations from being applied.
@end quotation
@end cartouche


Changed in version 3.4: The @code{verify} argument was added.


@cartouche
@quotation Note 
If you want to send configurations to the listener which don’t
disable existing loggers, you will need to use a JSON format for
the configuration, which will use @ref{13bc,,dictConfig()} for configuration.
This method allows you to specify @code{disable_existing_loggers} as
@code{False} in the configuration you send.
@end quotation
@end cartouche
@end deffn

@geindex stopListening() (in module logging.config)
@anchor{library/logging config logging config stopListening}@anchor{321e}
@deffn {Function} logging.config.stopListening ()

Stops the listening server which was created with a call to @ref{116b,,listen()}.
This is typically called before calling @code{join()} on the return value from
@code{listen()}.
@end deffn

@node Security considerations,Configuration dictionary schema,Configuration functions,logging config — Logging configuration
@anchor{library/logging config security-considerations}@anchor{3220}
@subsubsection Security considerations


The logging configuration functionality tries to offer convenience, and in part this
is done by offering the ability to convert text in configuration files into Python
objects used in logging configuration - for example, as described in
@ref{3221,,User-defined objects}. However, these same mechanisms (importing
callables from user-defined modules and calling them with parameters from the
configuration) could be used to invoke any code you like, and for this reason you
should treat configuration files from untrusted sources with `extreme caution' and
satisfy yourself that nothing bad can happen if you load them, before actually loading
them.

@node Configuration dictionary schema,Configuration file format,Security considerations,logging config — Logging configuration
@anchor{library/logging config configuration-dictionary-schema}@anchor{3222}@anchor{library/logging config logging-config-dictschema}@anchor{321c}
@subsubsection Configuration dictionary schema


Describing a logging configuration requires listing the various
objects to create and the connections between them; for example, you
may create a handler named ‘console’ and then say that the logger
named ‘startup’ will send its messages to the ‘console’ handler.
These objects aren’t limited to those provided by the @ref{8b,,logging}
module because you might write your own formatter or handler class.
The parameters to these classes may also need to include external
objects such as @code{sys.stderr}.  The syntax for describing these
objects and connections is defined in @ref{3223,,Object connections}
below.

@menu
* Dictionary Schema Details:: 
* Incremental Configuration:: 
* Object connections:: 
* User-defined objects:: 
* Handler configuration order:: 
* Access to external objects:: 
* Access to internal objects:: 
* Import resolution and custom importers:: 
* Configuring QueueHandler and QueueListener:: 

@end menu

@node Dictionary Schema Details,Incremental Configuration,,Configuration dictionary schema
@anchor{library/logging config dictionary-schema-details}@anchor{3224}
@subsubsection Dictionary Schema Details


The dictionary passed to @ref{13bc,,dictConfig()} must contain the following
keys:


@itemize *

@item 
`version' - to be set to an integer value representing the schema
version.  The only valid value at present is 1, but having this key
allows the schema to evolve while still preserving backwards
compatibility.
@end itemize

All other keys are optional, but if present they will be interpreted
as described below.  In all cases below where a ‘configuring dict’ is
mentioned, it will be checked for the special @code{'()'} key to see if a
custom instantiation is required.  If so, the mechanism described in
@ref{3221,,User-defined objects} below is used to create an instance;
otherwise, the context is used to determine what to instantiate.
@anchor{library/logging config logging-config-dictschema-formatters}@anchor{3225}

@itemize *

@item 
`formatters' - the corresponding value will be a dict in which each
key is a formatter id and each value is a dict describing how to
configure the corresponding @ref{16a3,,Formatter} instance.

The configuring dict is searched for the following optional keys
which correspond to the arguments passed to create a
@ref{16a3,,Formatter} object:


@itemize *

@item 
@code{format}

@item 
@code{datefmt}

@item 
@code{style}

@item 
@code{validate} (since version >=3.8)

@item 
@code{defaults} (since version >=3.12)
@end itemize

An optional @code{class} key indicates the name of the formatter’s
class (as a dotted module and class name).  The instantiation
arguments are as for @ref{16a3,,Formatter}, thus this key is
most useful for instantiating a customised subclass of
@code{Formatter}.  For example, the alternative class
might present exception tracebacks in an expanded or condensed
format.  If your formatter requires different or extra configuration
keys, you should use @ref{3221,,User-defined objects}.

@item 
`filters' - the corresponding value will be a dict in which each key
is a filter id and each value is a dict describing how to configure
the corresponding Filter instance.

The configuring dict is searched for the key @code{name} (defaulting to the
empty string) and this is used to construct a @ref{1407,,logging.Filter}
instance.

@item 
`handlers' - the corresponding value will be a dict in which each
key is a handler id and each value is a dict describing how to
configure the corresponding Handler instance.

The configuring dict is searched for the following keys:


@itemize *

@item 
@code{class} (mandatory).  This is the fully qualified name of the
handler class.

@item 
@code{level} (optional).  The level of the handler.

@item 
@code{formatter} (optional).  The id of the formatter for this
handler.

@item 
@code{filters} (optional).  A list of ids of the filters for this
handler.


Changed in version 3.11: @code{filters} can take filter instances in addition to ids.

@end itemize

All `other' keys are passed through as keyword arguments to the
handler’s constructor.  For example, given the snippet:

@example
handlers:
  console:
    class : logging.StreamHandler
    formatter: brief
    level   : INFO
    filters: [allow_foo]
    stream  : ext://sys.stdout
  file:
    class : logging.handlers.RotatingFileHandler
    formatter: precise
    filename: logconfig.log
    maxBytes: 1024
    backupCount: 3
@end example

the handler with id @code{console} is instantiated as a
@ref{1404,,logging.StreamHandler}, using @code{sys.stdout} as the underlying
stream.  The handler with id @code{file} is instantiated as a
@ref{1985,,logging.handlers.RotatingFileHandler} with the keyword arguments
@code{filename='logconfig.log', maxBytes=1024, backupCount=3}.

@item 
`loggers' - the corresponding value will be a dict in which each key
is a logger name and each value is a dict describing how to
configure the corresponding Logger instance.

The configuring dict is searched for the following keys:


@itemize *

@item 
@code{level} (optional).  The level of the logger.

@item 
@code{propagate} (optional).  The propagation setting of the logger.

@item 
@code{filters} (optional).  A list of ids of the filters for this
logger.


Changed in version 3.11: @code{filters} can take filter instances in addition to ids.


@item 
@code{handlers} (optional).  A list of ids of the handlers for this
logger.
@end itemize

The specified loggers will be configured according to the level,
propagation, filters and handlers specified.

@item 
`root' - this will be the configuration for the root logger.
Processing of the configuration will be as for any logger, except
that the @code{propagate} setting will not be applicable.

@item 
`incremental' - whether the configuration is to be interpreted as
incremental to the existing configuration.  This value defaults to
@code{False}, which means that the specified configuration replaces the
existing configuration with the same semantics as used by the
existing @ref{d4e,,fileConfig()} API.

If the specified value is @code{True}, the configuration is processed
as described in the section on @ref{3226,,Incremental Configuration}.

@item 
`disable_existing_loggers' - whether any existing non-root loggers are
to be disabled. This setting mirrors the parameter of the same name in
@ref{d4e,,fileConfig()}. If absent, this parameter defaults to @code{True}.
This value is ignored if `incremental' is @code{True}.
@end itemize

@node Incremental Configuration,Object connections,Dictionary Schema Details,Configuration dictionary schema
@anchor{library/logging config incremental-configuration}@anchor{3227}@anchor{library/logging config logging-config-dict-incremental}@anchor{3226}
@subsubsection Incremental Configuration


It is difficult to provide complete flexibility for incremental
configuration.  For example, because objects such as filters
and formatters are anonymous, once a configuration is set up, it is
not possible to refer to such anonymous objects when augmenting a
configuration.

Furthermore, there is not a compelling case for arbitrarily altering
the object graph of loggers, handlers, filters, formatters at
run-time, once a configuration is set up; the verbosity of loggers and
handlers can be controlled just by setting levels (and, in the case of
loggers, propagation flags).  Changing the object graph arbitrarily in
a safe way is problematic in a multi-threaded environment; while not
impossible, the benefits are not worth the complexity it adds to the
implementation.

Thus, when the @code{incremental} key of a configuration dict is present
and is @code{True}, the system will completely ignore any @code{formatters} and
@code{filters} entries, and process only the @code{level}
settings in the @code{handlers} entries, and the @code{level} and
@code{propagate} settings in the @code{loggers} and @code{root} entries.

Using a value in the configuration dict lets configurations to be sent
over the wire as pickled dicts to a socket listener. Thus, the logging
verbosity of a long-running application can be altered over time with
no need to stop and restart the application.

@node Object connections,User-defined objects,Incremental Configuration,Configuration dictionary schema
@anchor{library/logging config logging-config-dict-connections}@anchor{3223}@anchor{library/logging config object-connections}@anchor{3228}
@subsubsection Object connections


The schema describes a set of logging objects - loggers,
handlers, formatters, filters - which are connected to each other in
an object graph.  Thus, the schema needs to represent connections
between the objects.  For example, say that, once configured, a
particular logger has attached to it a particular handler.  For the
purposes of this discussion, we can say that the logger represents the
source, and the handler the destination, of a connection between the
two.  Of course in the configured objects this is represented by the
logger holding a reference to the handler.  In the configuration dict,
this is done by giving each destination object an id which identifies
it unambiguously, and then using the id in the source object’s
configuration to indicate that a connection exists between the source
and the destination object with that id.

So, for example, consider the following YAML snippet:

@example
formatters:
  brief:
    # configuration for formatter with id 'brief' goes here
  precise:
    # configuration for formatter with id 'precise' goes here
handlers:
  h1: #This is an id
   # configuration of handler with id 'h1' goes here
   formatter: brief
  h2: #This is another id
   # configuration of handler with id 'h2' goes here
   formatter: precise
loggers:
  foo.bar.baz:
    # other configuration for logger 'foo.bar.baz'
    handlers: [h1, h2]
@end example

(Note: YAML used here because it’s a little more readable than the
equivalent Python source form for the dictionary.)

The ids for loggers are the logger names which would be used
programmatically to obtain a reference to those loggers, e.g.
@code{foo.bar.baz}.  The ids for Formatters and Filters can be any string
value (such as @code{brief}, @code{precise} above) and they are transient,
in that they are only meaningful for processing the configuration
dictionary and used to determine connections between objects, and are
not persisted anywhere when the configuration call is complete.

The above snippet indicates that logger named @code{foo.bar.baz} should
have two handlers attached to it, which are described by the handler
ids @code{h1} and @code{h2}. The formatter for @code{h1} is that described by id
@code{brief}, and the formatter for @code{h2} is that described by id
@code{precise}.

@node User-defined objects,Handler configuration order,Object connections,Configuration dictionary schema
@anchor{library/logging config logging-config-dict-userdef}@anchor{3221}@anchor{library/logging config user-defined-objects}@anchor{3229}
@subsubsection User-defined objects


The schema supports user-defined objects for handlers, filters and
formatters.  (Loggers do not need to have different types for
different instances, so there is no support in this configuration
schema for user-defined logger classes.)

Objects to be configured are described by dictionaries
which detail their configuration.  In some places, the logging system
will be able to infer from the context how an object is to be
instantiated, but when a user-defined object is to be instantiated,
the system will not know how to do this.  In order to provide complete
flexibility for user-defined object instantiation, the user needs
to provide a ‘factory’ - a callable which is called with a
configuration dictionary and which returns the instantiated object.
This is signalled by an absolute import path to the factory being
made available under the special key @code{'()'}.  Here’s a concrete
example:

@example
formatters:
  brief:
    format: '%(message)s'
  default:
    format: '%(asctime)s %(levelname)-8s %(name)-15s %(message)s'
    datefmt: '%Y-%m-%d %H:%M:%S'
  custom:
      (): my.package.customFormatterFactory
      bar: baz
      spam: 99.9
      answer: 42
@end example

The above YAML snippet defines three formatters.  The first, with id
@code{brief}, is a standard @ref{16a3,,logging.Formatter} instance with the
specified format string.  The second, with id @code{default}, has a
longer format and also defines the time format explicitly, and will
result in a @code{logging.Formatter} initialized with those two format
strings.  Shown in Python source form, the @code{brief} and @code{default}
formatters have configuration sub-dictionaries:

@example
@{
  'format' : '%(message)s'
@}
@end example

and:

@example
@{
  'format' : '%(asctime)s %(levelname)-8s %(name)-15s %(message)s',
  'datefmt' : '%Y-%m-%d %H:%M:%S'
@}
@end example

respectively, and as these dictionaries do not contain the special key
@code{'()'}, the instantiation is inferred from the context: as a result,
standard @ref{16a3,,logging.Formatter} instances are created.  The
configuration sub-dictionary for the third formatter, with id
@code{custom}, is:

@example
@{
  '()' : 'my.package.customFormatterFactory',
  'bar' : 'baz',
  'spam' : 99.9,
  'answer' : 42
@}
@end example

and this contains the special key @code{'()'}, which means that
user-defined instantiation is wanted.  In this case, the specified
factory callable will be used. If it is an actual callable it will be
used directly - otherwise, if you specify a string (as in the example)
the actual callable will be located using normal import mechanisms.
The callable will be called with the `remaining' items in the
configuration sub-dictionary as keyword arguments.  In the above
example, the formatter with id @code{custom} will be assumed to be
returned by the call:

@example
my.package.customFormatterFactory(bar='baz', spam=99.9, answer=42)
@end example

@cartouche
@quotation Warning 
The values for keys such as @code{bar}, @code{spam} and @code{answer} in
the above example should not be configuration dictionaries or references such
as @code{cfg://foo} or @code{ext://bar}, because they will not be processed by the
configuration machinery, but passed to the callable as-is.
@end quotation
@end cartouche

The key @code{'()'} has been used as the special key because it is not a
valid keyword parameter name, and so will not clash with the names of
the keyword arguments used in the call.  The @code{'()'} also serves as a
mnemonic that the corresponding value is a callable.


Changed in version 3.11: The @code{filters} member of @code{handlers} and @code{loggers} can take
filter instances in addition to ids.


You can also specify a special key @code{'.'} whose value is a
mapping of attribute names to values. If found, the specified attributes will
be set on the user-defined object before it is returned. Thus, with the
following configuration:

@example
@{
  '()' : 'my.package.customFormatterFactory',
  'bar' : 'baz',
  'spam' : 99.9,
  'answer' : 42,
  '.' @{
    'foo': 'bar',
    'baz': 'bozz'
  @}
@}
@end example

the returned formatter will have attribute @code{foo} set to @code{'bar'} and
attribute @code{baz} set to @code{'bozz'}.

@cartouche
@quotation Warning 
The values for attributes such as @code{foo} and @code{baz} in
the above example should not be configuration dictionaries or references such
as @code{cfg://foo} or @code{ext://bar}, because they will not be processed by the
configuration machinery, but set as attribute values as-is.
@end quotation
@end cartouche

@node Handler configuration order,Access to external objects,User-defined objects,Configuration dictionary schema
@anchor{library/logging config handler-config-dict-order}@anchor{322a}@anchor{library/logging config handler-configuration-order}@anchor{322b}
@subsubsection Handler configuration order


Handlers are configured in alphabetical order of their keys, and a configured
handler replaces the configuration dictionary in (a working copy of) the
@code{handlers} dictionary in the schema. If you use a construct such as
@code{cfg://handlers.foo}, then initially @code{handlers['foo']} points to the
configuration dictionary for the handler named @code{foo}, and later (once that
handler has been configured) it points to the configured handler instance.
Thus, @code{cfg://handlers.foo} could resolve to either a dictionary or a handler
instance. In general, it is wise to name handlers in a way such that dependent
handlers are configured `after' any handlers they depend on; that allows
something like @code{cfg://handlers.foo} to be used in configuring a handler that
depends on handler @code{foo}. If that dependent handler were named @code{bar},
problems would result, because the configuration of @code{bar} would be attempted
before that of @code{foo}, and @code{foo} would not yet have been configured.
However, if the dependent handler were named @code{foobar}, it would be configured
after @code{foo}, with the result that @code{cfg://handlers.foo} would resolve to
configured handler @code{foo}, and not its configuration dictionary.

@node Access to external objects,Access to internal objects,Handler configuration order,Configuration dictionary schema
@anchor{library/logging config access-to-external-objects}@anchor{322c}@anchor{library/logging config logging-config-dict-externalobj}@anchor{322d}
@subsubsection Access to external objects


There are times where a configuration needs to refer to objects
external to the configuration, for example @code{sys.stderr}.  If the
configuration dict is constructed using Python code, this is
straightforward, but a problem arises when the configuration is
provided via a text file (e.g. JSON, YAML).  In a text file, there is
no standard way to distinguish @code{sys.stderr} from the literal string
@code{'sys.stderr'}.  To facilitate this distinction, the configuration
system looks for certain special prefixes in string values and
treat them specially.  For example, if the literal string
@code{'ext://sys.stderr'} is provided as a value in the configuration,
then the @code{ext://} will be stripped off and the remainder of the
value processed using normal import mechanisms.

The handling of such prefixes is done in a way analogous to protocol
handling: there is a generic mechanism to look for prefixes which
match the regular expression @code{^(?P<prefix>[a-z]+)://(?P<suffix>.*)$}
whereby, if the @code{prefix} is recognised, the @code{suffix} is processed
in a prefix-dependent manner and the result of the processing replaces
the string value.  If the prefix is not recognised, then the string
value will be left as-is.

@node Access to internal objects,Import resolution and custom importers,Access to external objects,Configuration dictionary schema
@anchor{library/logging config access-to-internal-objects}@anchor{322e}@anchor{library/logging config logging-config-dict-internalobj}@anchor{322f}
@subsubsection Access to internal objects


As well as external objects, there is sometimes also a need to refer
to objects in the configuration.  This will be done implicitly by the
configuration system for things that it knows about.  For example, the
string value @code{'DEBUG'} for a @code{level} in a logger or handler will
automatically be converted to the value @code{logging.DEBUG}, and the
@code{handlers}, @code{filters} and @code{formatter} entries will take an
object id and resolve to the appropriate destination object.

However, a more generic mechanism is needed for user-defined
objects which are not known to the @ref{8b,,logging} module.  For
example, consider @ref{3230,,logging.handlers.MemoryHandler}, which takes
a @code{target} argument which is another handler to delegate to. Since
the system already knows about this class, then in the configuration,
the given @code{target} just needs to be the object id of the relevant
target handler, and the system will resolve to the handler from the
id.  If, however, a user defines a @code{my.package.MyHandler} which has
an @code{alternate} handler, the configuration system would not know that
the @code{alternate} referred to a handler.  To cater for this, a generic
resolution system allows the user to specify:

@example
handlers:
  file:
    # configuration of file handler goes here

  custom:
    (): my.package.MyHandler
    alternate: cfg://handlers.file
@end example

The literal string @code{'cfg://handlers.file'} will be resolved in an
analogous way to strings with the @code{ext://} prefix, but looking
in the configuration itself rather than the import namespace.  The
mechanism allows access by dot or by index, in a similar way to
that provided by @code{str.format}.  Thus, given the following snippet:

@example
handlers:
  email:
    class: logging.handlers.SMTPHandler
    mailhost: localhost
    fromaddr: my_app@@domain.tld
    toaddrs:
      - support_team@@domain.tld
      - dev_team@@domain.tld
    subject: Houston, we have a problem.
@end example

in the configuration, the string @code{'cfg://handlers'} would resolve to
the dict with key @code{handlers}, the string @code{'cfg://handlers.email}
would resolve to the dict with key @code{email} in the @code{handlers} dict,
and so on.  The string @code{'cfg://handlers.email.toaddrs[1]} would
resolve to @code{'dev_team@@domain.tld'} and the string
@code{'cfg://handlers.email.toaddrs[0]'} would resolve to the value
@code{'support_team@@domain.tld'}. The @code{subject} value could be accessed
using either @code{'cfg://handlers.email.subject'} or, equivalently,
@code{'cfg://handlers.email[subject]'}.  The latter form only needs to be
used if the key contains spaces or non-alphanumeric characters. Please note
that the characters @code{[} and @code{]} are not allowed in the keys. If an
index value consists only of decimal digits, access will be attempted
using the corresponding integer value, falling back to the string
value if needed.

Given a string @code{cfg://handlers.myhandler.mykey.123}, this will
resolve to @code{config_dict['handlers']['myhandler']['mykey']['123']}.
If the string is specified as @code{cfg://handlers.myhandler.mykey[123]},
the system will attempt to retrieve the value from
@code{config_dict['handlers']['myhandler']['mykey'][123]}, and fall back
to @code{config_dict['handlers']['myhandler']['mykey']['123']} if that
fails.

@node Import resolution and custom importers,Configuring QueueHandler and QueueListener,Access to internal objects,Configuration dictionary schema
@anchor{library/logging config import-resolution-and-custom-importers}@anchor{3231}@anchor{library/logging config logging-import-resolution}@anchor{3232}
@subsubsection Import resolution and custom importers


Import resolution, by default, uses the builtin @ref{ad7,,__import__()} function
to do its importing. You may want to replace this with your own importing
mechanism: if so, you can replace the @code{importer} attribute of the
@code{DictConfigurator} or its superclass, the
@code{BaseConfigurator} class. However, you need to be
careful because of the way functions are accessed from classes via
descriptors. If you are using a Python callable to do your imports, and you
want to define it at class level rather than instance level, you need to wrap
it with @ref{451,,staticmethod()}. For example:

@example
from importlib import import_module
from logging.config import BaseConfigurator

BaseConfigurator.importer = staticmethod(import_module)
@end example

You don’t need to wrap with @ref{451,,staticmethod()} if you’re setting the import
callable on a configurator `instance'.

@node Configuring QueueHandler and QueueListener,,Import resolution and custom importers,Configuration dictionary schema
@anchor{library/logging config configure-queue}@anchor{198a}@anchor{library/logging config configuring-queuehandler-and-queuelistener}@anchor{3233}
@subsubsection Configuring QueueHandler and QueueListener


If you want to configure a @ref{1ba5,,QueueHandler}, noting that this
is normally used in conjunction with a @ref{244,,QueueListener}, you
can configure both together. After the configuration, the @code{QueueListener} instance
will be available as the @ref{3234,,listener} attribute of
the created handler, and that in turn will be available to you using
@ref{1ba6,,getHandlerByName()} and passing the name you have used for the
@code{QueueHandler} in your configuration. The dictionary schema for configuring the pair
is shown in the example YAML snippet below.

@example
handlers:
  qhand:
    class: logging.handlers.QueueHandler
    queue: my.module.queue_factory
    listener: my.package.CustomListener
    handlers:
      - hand_name_1
      - hand_name_2
      ...
@end example

The @code{queue} and @code{listener} keys are optional.

If the @code{queue} key is present, the corresponding value can be one of the following:


@itemize *

@item 
An object implementing the @ref{3235,,Queue.put_nowait}
and @ref{3236,,Queue.get} public API. For instance, this may be
an actual instance of @ref{15a0,,queue.Queue} or a subclass thereof, or a proxy
obtained by @ref{3237,,multiprocessing.managers.SyncManager.Queue()}.

This is of course only possible if you are constructing or modifying
the configuration dictionary in code.

@item 
A string that resolves to a callable which, when called with no arguments, returns
the queue instance to use. That callable could be a @ref{15a0,,queue.Queue} subclass
or a function which returns a suitable queue instance,
such as @code{my.module.queue_factory()}.

@item 
A dict with a @code{'()'} key which is constructed in the usual way as discussed in
@ref{3221,,User-defined objects}. The result of this construction should be a
@ref{15a0,,queue.Queue} instance.
@end itemize

If the  @code{queue} key is absent, a standard unbounded @ref{15a0,,queue.Queue} instance is
created and used.

If the @code{listener} key is present, the corresponding value can be one of the following:


@itemize *

@item 
A subclass of @ref{244,,logging.handlers.QueueListener}. This is of course only
possible if you are constructing or modifying the configuration dictionary in
code.

@item 
A string which resolves to a class which is a subclass of @code{QueueListener}, such as
@code{'my.package.CustomListener'}.

@item 
A dict with a @code{'()'} key which is constructed in the usual way as discussed in
@ref{3221,,User-defined objects}. The result of this construction should be a
callable with the same signature as the @code{QueueListener} initializer.
@end itemize

If the @code{listener} key is absent, @ref{244,,logging.handlers.QueueListener} is used.

The values under the @code{handlers} key are the names of other handlers in the
configuration (not shown in the above snippet) which will be passed to the queue
listener.

Any custom queue handler and listener classes will need to be defined with the same
initialization signatures as @ref{1ba5,,QueueHandler} and
@ref{244,,QueueListener}.


Added in version 3.12.


@node Configuration file format,,Configuration dictionary schema,logging config — Logging configuration
@anchor{library/logging config configuration-file-format}@anchor{3238}@anchor{library/logging config logging-config-fileformat}@anchor{321d}
@subsubsection Configuration file format


The configuration file format understood by @ref{d4e,,fileConfig()} is based on
@ref{26,,configparser} functionality. The file must contain sections called
@code{[loggers]}, @code{[handlers]} and @code{[formatters]} which identify by name the
entities of each type which are defined in the file. For each such entity, there
is a separate section which identifies how that entity is configured.  Thus, for
a logger named @code{log01} in the @code{[loggers]} section, the relevant
configuration details are held in a section @code{[logger_log01]}. Similarly, a
handler called @code{hand01} in the @code{[handlers]} section will have its
configuration held in a section called @code{[handler_hand01]}, while a formatter
called @code{form01} in the @code{[formatters]} section will have its configuration
specified in a section called @code{[formatter_form01]}. The root logger
configuration must be specified in a section called @code{[logger_root]}.

@cartouche
@quotation Note 
The @ref{d4e,,fileConfig()} API is older than the @ref{13bc,,dictConfig()} API and does
not provide functionality to cover certain aspects of logging. For example,
you cannot configure @ref{1407,,Filter} objects, which provide for
filtering of messages beyond simple integer levels, using @code{fileConfig()}.
If you need to have instances of @code{Filter} in your logging
configuration, you will need to use @code{dictConfig()}. Note that future
enhancements to configuration functionality will be added to
@code{dictConfig()}, so it’s worth considering transitioning to this newer
API when it’s convenient to do so.
@end quotation
@end cartouche

Examples of these sections in the file are given below.

@example
[loggers]
keys=root,log02,log03,log04,log05,log06,log07

[handlers]
keys=hand01,hand02,hand03,hand04,hand05,hand06,hand07,hand08,hand09

[formatters]
keys=form01,form02,form03,form04,form05,form06,form07,form08,form09
@end example

The root logger must specify a level and a list of handlers. An example of a
root logger section is given below.

@example
[logger_root]
level=NOTSET
handlers=hand01
@end example

The @code{level} entry can be one of @code{DEBUG, INFO, WARNING, ERROR, CRITICAL} or
@code{NOTSET}. For the root logger only, @code{NOTSET} means that all messages will be
logged. Level values are @ref{2614,,evaluated} in the context of the @code{logging}
package’s namespace.

The @code{handlers} entry is a comma-separated list of handler names, which must
appear in the @code{[handlers]} section. These names must appear in the
@code{[handlers]} section and have corresponding sections in the configuration
file.

For loggers other than the root logger, some additional information is required.
This is illustrated by the following example.

@example
[logger_parser]
level=DEBUG
handlers=hand01
propagate=1
qualname=compiler.parser
@end example

The @code{level} and @code{handlers} entries are interpreted as for the root logger,
except that if a non-root logger’s level is specified as @code{NOTSET}, the system
consults loggers higher up the hierarchy to determine the effective level of the
logger. The @code{propagate} entry is set to 1 to indicate that messages must
propagate to handlers higher up the logger hierarchy from this logger, or 0 to
indicate that messages are `not' propagated to handlers up the hierarchy. The
@code{qualname} entry is the hierarchical channel name of the logger, that is to
say the name used by the application to get the logger.

Sections which specify handler configuration are exemplified by the following.

@example
[handler_hand01]
class=StreamHandler
level=NOTSET
formatter=form01
args=(sys.stdout,)
@end example

The @code{class} entry indicates the handler’s class (as determined by @ref{4a4,,eval()}
in the @code{logging} package’s namespace). The @code{level} is interpreted as for
loggers, and @code{NOTSET} is taken to mean ‘log everything’.

The @code{formatter} entry indicates the key name of the formatter for this
handler. If blank, a default formatter (@code{logging._defaultFormatter}) is used.
If a name is specified, it must appear in the @code{[formatters]} section and have
a corresponding section in the configuration file.

The @code{args} entry, when @ref{2614,,evaluated} in the context of the @code{logging}
package’s namespace, is the list of arguments to the constructor for the handler
class. Refer to the constructors for the relevant handlers, or to the examples
below, to see how typical entries are constructed. If not provided, it defaults
to @code{()}.

The optional @code{kwargs} entry, when @ref{2614,,evaluated} in the context of the
@code{logging} package’s namespace, is the keyword argument dict to the constructor
for the handler class. If not provided, it defaults to @code{@{@}}.

@example
[handler_hand02]
class=FileHandler
level=DEBUG
formatter=form02
args=('python.log', 'w')

[handler_hand03]
class=handlers.SocketHandler
level=INFO
formatter=form03
args=('localhost', handlers.DEFAULT_TCP_LOGGING_PORT)

[handler_hand04]
class=handlers.DatagramHandler
level=WARN
formatter=form04
args=('localhost', handlers.DEFAULT_UDP_LOGGING_PORT)

[handler_hand05]
class=handlers.SysLogHandler
level=ERROR
formatter=form05
args=(('localhost', handlers.SYSLOG_UDP_PORT), handlers.SysLogHandler.LOG_USER)

[handler_hand06]
class=handlers.NTEventLogHandler
level=CRITICAL
formatter=form06
args=('Python Application', '@w{'}, 'Application')

[handler_hand07]
class=handlers.SMTPHandler
level=WARN
formatter=form07
args=('localhost', 'from@@abc', ['user1@@abc', 'user2@@xyz'], 'Logger Subject')
kwargs=@{'timeout': 10.0@}

[handler_hand08]
class=handlers.MemoryHandler
level=NOTSET
formatter=form08
target=
args=(10, ERROR)

[handler_hand09]
class=handlers.HTTPHandler
level=NOTSET
formatter=form09
args=('localhost:9022', '/log', 'GET')
kwargs=@{'secure': True@}
@end example

Sections which specify formatter configuration are typified by the following.

@example
[formatter_form01]
format=F1 %(asctime)s %(levelname)s %(message)s %(customfield)s
datefmt=
style=%
validate=True
defaults=@{'customfield': 'defaultvalue'@}
class=logging.Formatter
@end example

The arguments for the formatter configuration are the same as the keys
in the dictionary schema @ref{3225,,formatters section}.

The @code{defaults} entry, when @ref{2614,,evaluated} in the context of
the @code{logging} package’s namespace, is a dictionary of default values for
custom formatting fields. If not provided, it defaults to @code{None}.

@cartouche
@quotation Note 
Due to the use of @ref{4a4,,eval()} as described above, there are
potential security risks which result from using the @ref{116b,,listen()} to send
and receive configurations via sockets. The risks are limited to where
multiple users with no mutual trust run code on the same machine; see the
@code{listen()} documentation for more information.
@end quotation
@end cartouche


@subsubheading See also



@table @asis

@item Module @ref{8b,,logging}

API reference for the logging module.

@item Module @ref{8d,,logging.handlers}

Useful handlers included with the logging module.
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node logging handlers — Logging handlers,platform — Access to underlying platform’s identifying data,logging config — Logging configuration,Generic Operating System Services
@anchor{library/logging handlers doc}@anchor{3239}@anchor{library/logging handlers logging-handlers-logging-handlers}@anchor{323a}@anchor{library/logging handlers module-logging handlers}@anchor{8d}@anchor{library/logging handlers translation-repo}@anchor{323b}
@subsection @code{logging.handlers} — Logging handlers


@geindex module; logging.handlers

`Source code:' Lib/logging/handlers.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/logging/handlers.py}

@subsubheading Important



This page contains only reference information. For tutorials,
please see


@itemize *

@item 
@ref{1401,,Basic Tutorial}

@item 
@ref{1402,,Advanced Tutorial}

@item 
@ref{1403,,Logging Cookbook}
@end itemize


__________________________________________________________________


The following useful handlers are provided in the package. Note that three of
the handlers (@ref{1404,,StreamHandler}, @ref{1c96,,FileHandler} and
@ref{1490,,NullHandler}) are actually defined in the @ref{8b,,logging} module itself,
but have been documented here along with the other handlers.

@menu
* StreamHandler:: 
* FileHandler:: 
* NullHandler:: 
* WatchedFileHandler:: 
* BaseRotatingHandler:: 
* RotatingFileHandler:: 
* TimedRotatingFileHandler:: 
* SocketHandler:: 
* DatagramHandler:: 
* SysLogHandler:: 
* NTEventLogHandler:: 
* SMTPHandler:: 
* MemoryHandler:: 
* HTTPHandler:: 
* QueueHandler:: 
* QueueListener:: 

@end menu

@node StreamHandler,FileHandler,,logging handlers — Logging handlers
@anchor{library/logging handlers stream-handler}@anchor{323c}@anchor{library/logging handlers streamhandler}@anchor{323d}
@subsubsection StreamHandler


The @ref{1404,,StreamHandler} class, located in the core @ref{8b,,logging} package,
sends logging output to streams such as `sys.stdout', `sys.stderr' or any
file-like object (or, more precisely, any object which supports @code{write()}
and @code{flush()} methods).

@geindex StreamHandler (class in logging)
@anchor{library/logging handlers logging StreamHandler}@anchor{1404}
@deffn {Class} logging.StreamHandler (stream=None)

Returns a new instance of the @code{StreamHandler} class. If `stream' is
specified, the instance will use it for logging output; otherwise, `sys.stderr'
will be used.

@geindex emit() (logging.StreamHandler method)
@anchor{library/logging handlers logging StreamHandler emit}@anchor{323e}
@deffn {Method} emit (record)

If a formatter is specified, it is used to format the record. The record
is then written to the stream followed by @ref{323f,,terminator}. If exception information
is present, it is formatted using @ref{a55,,traceback.print_exception()} and
appended to the stream.
@end deffn

@geindex flush() (logging.StreamHandler method)
@anchor{library/logging handlers logging StreamHandler flush}@anchor{3240}
@deffn {Method} flush ()

Flushes the stream by calling its @code{flush()} method. Note that the
@code{close()} method is inherited from @ref{16a2,,Handler} and so
does no output, so an explicit @code{flush()} call may be needed at times.
@end deffn

@geindex setStream() (logging.StreamHandler method)
@anchor{library/logging handlers logging StreamHandler setStream}@anchor{d4d}
@deffn {Method} setStream (stream)

Sets the instance’s stream to the specified value, if it is different.
The old stream is flushed before the new stream is set.

@*Parameters: 
@code{stream} – The stream that the handler should use.


@*Returns: 
the old stream, if the stream was changed, or @code{None} if it wasn’t.



Added in version 3.7.

@end deffn

@geindex terminator (logging.StreamHandler attribute)
@anchor{library/logging handlers logging StreamHandler terminator}@anchor{323f}
@deffn {Attribute} terminator

String used as the terminator when writing a formatted record to a stream.
Default value is @code{'\n'}.

If you don’t want a newline termination, you can set the handler instance’s
@code{terminator} attribute to the empty string.

In earlier versions, the terminator was hardcoded as @code{'\n'}.


Added in version 3.2.

@end deffn
@end deffn

@node FileHandler,NullHandler,StreamHandler,logging handlers — Logging handlers
@anchor{library/logging handlers file-handler}@anchor{3241}@anchor{library/logging handlers filehandler}@anchor{3242}
@subsubsection FileHandler


The @ref{1c96,,FileHandler} class, located in the core @ref{8b,,logging} package,
sends logging output to a disk file.  It inherits the output functionality from
@ref{1404,,StreamHandler}.

@geindex FileHandler (class in logging)
@anchor{library/logging handlers logging FileHandler}@anchor{1c96}
@deffn {Class} logging.FileHandler (filename, mode='a', encoding=None, delay=False, errors=None)

Returns a new instance of the @code{FileHandler} class. The specified file is
opened and used as the stream for logging. If `mode' is not specified,
@code{'a'} is used.  If `encoding' is not @code{None}, it is used to open the file
with that encoding.  If `delay' is true, then file opening is deferred until the
first call to @ref{3243,,emit()}. By default, the file grows indefinitely. If
`errors' is specified, it’s used to determine how encoding errors are handled.


Changed in version 3.6: As well as string values, @ref{268,,Path} objects are also accepted
for the `filename' argument.



Changed in version 3.9: The `errors' parameter was added.


@geindex close() (logging.FileHandler method)
@anchor{library/logging handlers logging FileHandler close}@anchor{3244}
@deffn {Method} close ()

Closes the file.
@end deffn

@geindex emit() (logging.FileHandler method)
@anchor{library/logging handlers logging FileHandler emit}@anchor{3243}
@deffn {Method} emit (record)

Outputs the record to the file.

Note that if the file was closed due to logging shutdown at exit and the file
mode is ‘w’, the record will not be emitted (see bpo-42378@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42378}).
@end deffn
@end deffn

@node NullHandler,WatchedFileHandler,FileHandler,logging handlers — Logging handlers
@anchor{library/logging handlers null-handler}@anchor{3245}@anchor{library/logging handlers nullhandler}@anchor{3246}
@subsubsection NullHandler



Added in version 3.1.


The @ref{1490,,NullHandler} class, located in the core @ref{8b,,logging} package,
does not do any formatting or output. It is essentially a ‘no-op’ handler
for use by library developers.

@geindex NullHandler (class in logging)
@anchor{library/logging handlers logging NullHandler}@anchor{1490}
@deffn {Class} logging.NullHandler

Returns a new instance of the @code{NullHandler} class.

@geindex emit() (logging.NullHandler method)
@anchor{library/logging handlers logging NullHandler emit}@anchor{3247}
@deffn {Method} emit (record)

This method does nothing.
@end deffn

@geindex handle() (logging.NullHandler method)
@anchor{library/logging handlers logging NullHandler handle}@anchor{3248}
@deffn {Method} handle (record)

This method does nothing.
@end deffn

@geindex createLock() (logging.NullHandler method)
@anchor{library/logging handlers logging NullHandler createLock}@anchor{3249}
@deffn {Method} createLock ()

This method returns @code{None} for the lock, since there is no
underlying I/O to which access needs to be serialized.
@end deffn
@end deffn

See @ref{324a,,Configuring Logging for a Library} for more information on how to use
@ref{1490,,NullHandler}.

@node WatchedFileHandler,BaseRotatingHandler,NullHandler,logging handlers — Logging handlers
@anchor{library/logging handlers watched-file-handler}@anchor{324b}@anchor{library/logging handlers watchedfilehandler}@anchor{324c}
@subsubsection WatchedFileHandler


The @ref{324d,,WatchedFileHandler} class, located in the @code{logging.handlers}
module, is a @code{FileHandler} which watches the file it is logging to. If
the file changes, it is closed and reopened using the file name.

A file change can happen because of usage of programs such as `newsyslog' and
`logrotate' which perform log file rotation. This handler, intended for use
under Unix/Linux, watches the file to see if it has changed since the last emit.
(A file is deemed to have changed if its device or inode have changed.) If the
file has changed, the old file stream is closed, and the file opened to get a
new stream.

This handler is not appropriate for use under Windows, because under Windows
open log files cannot be moved or renamed - logging opens the files with
exclusive locks - and so there is no need for such a handler. Furthermore,
`ST_INO' is not supported under Windows; @ref{26f,,stat()} always returns zero
for this value.

@geindex WatchedFileHandler (class in logging.handlers)
@anchor{library/logging handlers logging handlers WatchedFileHandler}@anchor{324d}
@deffn {Class} logging.handlers.WatchedFileHandler (filename, mode='a', encoding=None, delay=False, errors=None)

Returns a new instance of the @code{WatchedFileHandler} class. The specified
file is opened and used as the stream for logging. If `mode' is not specified,
@code{'a'} is used.  If `encoding' is not @code{None}, it is used to open the file
with that encoding.  If `delay' is true, then file opening is deferred until the
first call to @ref{324e,,emit()}.  By default, the file grows indefinitely. If
`errors' is provided, it determines how encoding errors are handled.


Changed in version 3.6: As well as string values, @ref{268,,Path} objects are also accepted
for the `filename' argument.



Changed in version 3.9: The `errors' parameter was added.


@geindex reopenIfNeeded() (logging.handlers.WatchedFileHandler method)
@anchor{library/logging handlers logging handlers WatchedFileHandler reopenIfNeeded}@anchor{eba}
@deffn {Method} reopenIfNeeded ()

Checks to see if the file has changed.  If it has, the existing stream is
flushed and closed and the file opened again, typically as a precursor to
outputting the record to the file.


Added in version 3.6.

@end deffn

@geindex emit() (logging.handlers.WatchedFileHandler method)
@anchor{library/logging handlers logging handlers WatchedFileHandler emit}@anchor{324e}
@deffn {Method} emit (record)

Outputs the record to the file, but first calls @ref{eba,,reopenIfNeeded()} to
reopen the file if it has changed.
@end deffn
@end deffn

@node BaseRotatingHandler,RotatingFileHandler,WatchedFileHandler,logging handlers — Logging handlers
@anchor{library/logging handlers base-rotating-handler}@anchor{324f}@anchor{library/logging handlers baserotatinghandler}@anchor{3250}
@subsubsection BaseRotatingHandler


The @ref{3251,,BaseRotatingHandler} class, located in the @code{logging.handlers}
module, is the base class for the rotating file handlers,
@ref{1985,,RotatingFileHandler} and @ref{1167,,TimedRotatingFileHandler}. You should
not need to instantiate this class, but it has attributes and methods you may
need to override.

@geindex BaseRotatingHandler (class in logging.handlers)
@anchor{library/logging handlers logging handlers BaseRotatingHandler}@anchor{3251}
@deffn {Class} logging.handlers.BaseRotatingHandler (filename, mode, encoding=None, delay=False, errors=None)

The parameters are as for @code{FileHandler}. The attributes are:

@geindex namer (logging.handlers.BaseRotatingHandler attribute)
@anchor{library/logging handlers logging handlers BaseRotatingHandler namer}@anchor{3252}
@deffn {Attribute} namer

If this attribute is set to a callable, the @ref{3253,,rotation_filename()}
method delegates to this callable. The parameters passed to the callable
are those passed to @code{rotation_filename()}.

@cartouche
@quotation Note 
The namer function is called quite a few times during rollover,
so it should be as simple and as fast as possible. It should also
return the same output every time for a given input, otherwise the
rollover behaviour may not work as expected.

It’s also worth noting that care should be taken when using a namer to
preserve certain attributes in the filename which are used during rotation.
For example, @ref{1985,,RotatingFileHandler} expects to have a set of log files
whose names contain successive integers, so that rotation works as expected,
and @ref{1167,,TimedRotatingFileHandler} deletes old log files (based on the
@code{backupCount} parameter passed to the handler’s initializer) by determining
the oldest files to delete. For this to happen, the filenames should be
sortable using the date/time portion of the filename, and a namer needs to
respect this. (If a namer is wanted that doesn’t respect this scheme, it will
need to be used in a subclass of @code{TimedRotatingFileHandler} which
overrides the @ref{3254,,getFilesToDelete()} method to
fit in with the custom naming scheme.)
@end quotation
@end cartouche


Added in version 3.3.

@end deffn

@geindex rotator (logging.handlers.BaseRotatingHandler attribute)
@anchor{library/logging handlers logging handlers BaseRotatingHandler rotator}@anchor{3255}
@deffn {Attribute} rotator

If this attribute is set to a callable, the @ref{3256,,rotate()} method
delegates to this callable.  The parameters passed to the callable are
those passed to @code{rotate()}.


Added in version 3.3.

@end deffn

@geindex rotation_filename() (logging.handlers.BaseRotatingHandler method)
@anchor{library/logging handlers logging handlers BaseRotatingHandler rotation_filename}@anchor{3253}
@deffn {Method} rotation_filename (default_name)

Modify the filename of a log file when rotating.

This is provided so that a custom filename can be provided.

The default implementation calls the ‘namer’ attribute of the handler,
if it’s callable, passing the default name to it. If the attribute isn’t
callable (the default is @code{None}), the name is returned unchanged.

@*Parameters: 
@code{default_name} – The default name for the log file.



Added in version 3.3.

@end deffn

@geindex rotate() (logging.handlers.BaseRotatingHandler method)
@anchor{library/logging handlers logging handlers BaseRotatingHandler rotate}@anchor{3256}
@deffn {Method} rotate (source, dest)

When rotating, rotate the current log.

The default implementation calls the ‘rotator’ attribute of the handler,
if it’s callable, passing the source and dest arguments to it. If the
attribute isn’t callable (the default is @code{None}), the source is simply
renamed to the destination.

@*Parameters: 

@itemize *

@item 
@code{source} – The source filename. This is normally the base
filename, e.g. ‘test.log’.

@item 
@code{dest} – The destination filename. This is normally
what the source is rotated to, e.g. ‘test.log.1’.
@end itemize



Added in version 3.3.

@end deffn
@end deffn

The reason the attributes exist is to save you having to subclass - you can use
the same callables for instances of @ref{1985,,RotatingFileHandler} and
@ref{1167,,TimedRotatingFileHandler}. If either the namer or rotator callable
raises an exception, this will be handled in the same way as any other
exception during an @code{emit()} call, i.e. via the @code{handleError()} method
of the handler.

If you need to make more significant changes to rotation processing, you can
override the methods.

For an example, see @ref{3257,,Using a rotator and namer to customize log rotation processing}.

@node RotatingFileHandler,TimedRotatingFileHandler,BaseRotatingHandler,logging handlers — Logging handlers
@anchor{library/logging handlers rotating-file-handler}@anchor{3258}@anchor{library/logging handlers rotatingfilehandler}@anchor{3259}
@subsubsection RotatingFileHandler


The @ref{1985,,RotatingFileHandler} class, located in the @code{logging.handlers}
module, supports rotation of disk log files.

@geindex RotatingFileHandler (class in logging.handlers)
@anchor{library/logging handlers logging handlers RotatingFileHandler}@anchor{1985}
@deffn {Class} logging.handlers.RotatingFileHandler (filename, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=False, errors=None)

Returns a new instance of the @code{RotatingFileHandler} class. The specified
file is opened and used as the stream for logging. If `mode' is not specified,
@code{'a'} is used.  If `encoding' is not @code{None}, it is used to open the file
with that encoding.  If `delay' is true, then file opening is deferred until the
first call to @ref{325a,,emit()}.  By default, the file grows indefinitely. If
`errors' is provided, it determines how encoding errors are handled.

You can use the `maxBytes' and `backupCount' values to allow the file to
`rollover' at a predetermined size. When the size is about to be exceeded,
the file is closed and a new file is silently opened for output. Rollover occurs
whenever the current log file is nearly `maxBytes' in length; but if either of
`maxBytes' or `backupCount' is zero, rollover never occurs, so you generally want
to set `backupCount' to at least 1, and have a non-zero `maxBytes'.
When `backupCount' is non-zero, the system will save old log files by appending
the extensions ‘.1’, ‘.2’ etc., to the filename. For example, with a `backupCount'
of 5 and a base file name of @code{app.log}, you would get @code{app.log},
@code{app.log.1}, @code{app.log.2}, up to @code{app.log.5}. The file being
written to is always @code{app.log}.  When this file is filled, it is closed
and renamed to @code{app.log.1}, and if files @code{app.log.1},
@code{app.log.2}, etc. exist, then they are renamed to @code{app.log.2},
@code{app.log.3} etc. respectively.


Changed in version 3.6: As well as string values, @ref{268,,Path} objects are also accepted
for the `filename' argument.



Changed in version 3.9: The `errors' parameter was added.


@geindex doRollover() (logging.handlers.RotatingFileHandler method)
@anchor{library/logging handlers logging handlers RotatingFileHandler doRollover}@anchor{325b}
@deffn {Method} doRollover ()

Does a rollover, as described above.
@end deffn

@geindex emit() (logging.handlers.RotatingFileHandler method)
@anchor{library/logging handlers logging handlers RotatingFileHandler emit}@anchor{325a}
@deffn {Method} emit (record)

Outputs the record to the file, catering for rollover as described
previously.
@end deffn

@geindex shouldRollover() (logging.handlers.RotatingFileHandler method)
@anchor{library/logging handlers logging handlers RotatingFileHandler shouldRollover}@anchor{325c}
@deffn {Method} shouldRollover (record)

See if the supplied record would cause the file to exceed the configured size limit.
@end deffn
@end deffn

@node TimedRotatingFileHandler,SocketHandler,RotatingFileHandler,logging handlers — Logging handlers
@anchor{library/logging handlers timed-rotating-file-handler}@anchor{325d}@anchor{library/logging handlers timedrotatingfilehandler}@anchor{325e}
@subsubsection TimedRotatingFileHandler


The @ref{1167,,TimedRotatingFileHandler} class, located in the
@code{logging.handlers} module, supports rotation of disk log files at certain
timed intervals.

@geindex TimedRotatingFileHandler (class in logging.handlers)
@anchor{library/logging handlers logging handlers TimedRotatingFileHandler}@anchor{1167}
@deffn {Class} logging.handlers.TimedRotatingFileHandler (filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False, atTime=None, errors=None)

Returns a new instance of the @code{TimedRotatingFileHandler} class. The
specified file is opened and used as the stream for logging. On rotating it also
sets the filename suffix. Rotating happens based on the product of `when' and
`interval'.

You can use the `when' to specify the type of `interval'. The list of possible
values is below.  Note that they are not case sensitive.


@multitable {xxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Value

@tab

Type of interval

@tab

If/how `atTime' is used

@item

@code{'S'}

@tab

Seconds

@tab

Ignored

@item

@code{'M'}

@tab

Minutes

@tab

Ignored

@item

@code{'H'}

@tab

Hours

@tab

Ignored

@item

@code{'D'}

@tab

Days

@tab

Ignored

@item

@code{'W0'-'W6'}

@tab

Weekday (0=Monday)

@tab

Used to compute initial
rollover time

@item

@code{'midnight'}

@tab

Roll over at midnight, if
`atTime' not specified,
else at time `atTime'

@tab

Used to compute initial
rollover time

@end multitable


When using weekday-based rotation, specify ‘W0’ for Monday, ‘W1’ for
Tuesday, and so on up to ‘W6’ for Sunday. In this case, the value passed for
`interval' isn’t used.

The system will save old log files by appending extensions to the filename.
The extensions are date-and-time based, using the strftime format
@code{%Y-%m-%d_%H-%M-%S} or a leading portion thereof, depending on the
rollover interval.

When computing the next rollover time for the first time (when the handler
is created), the last modification time of an existing log file, or else
the current time, is used to compute when the next rotation will occur.

If the `utc' argument is true, times in UTC will be used; otherwise
local time is used.

If `backupCount' is nonzero, at most `backupCount' files
will be kept, and if more would be created when rollover occurs, the oldest
one is deleted. The deletion logic uses the interval to determine which
files to delete, so changing the interval may leave old files lying around.

If `delay' is true, then file opening is deferred until the first call to
@ref{325f,,emit()}.

If `atTime' is not @code{None}, it must be a @code{datetime.time} instance which
specifies the time of day when rollover occurs, for the cases where rollover
is set to happen “at midnight” or “on a particular weekday”. Note that in
these cases, the `atTime' value is effectively used to compute the `initial'
rollover, and subsequent rollovers would be calculated via the normal
interval calculation.

If `errors' is specified, it’s used to determine how encoding errors are
handled.

@cartouche
@quotation Note 
Calculation of the initial rollover time is done when the handler
is initialised. Calculation of subsequent rollover times is done only
when rollover occurs, and rollover occurs only when emitting output. If
this is not kept in mind, it might lead to some confusion. For example,
if an interval of “every minute” is set, that does not mean you will
always see log files with times (in the filename) separated by a minute;
if, during application execution, logging output is generated more
frequently than once a minute, `then' you can expect to see log files
with times separated by a minute. If, on the other hand, logging messages
are only output once every five minutes (say), then there will be gaps in
the file times corresponding to the minutes where no output (and hence no
rollover) occurred.
@end quotation
@end cartouche


Changed in version 3.4: `atTime' parameter was added.



Changed in version 3.6: As well as string values, @ref{268,,Path} objects are also accepted
for the `filename' argument.



Changed in version 3.9: The `errors' parameter was added.


@geindex doRollover() (logging.handlers.TimedRotatingFileHandler method)
@anchor{library/logging handlers logging handlers TimedRotatingFileHandler doRollover}@anchor{3260}
@deffn {Method} doRollover ()

Does a rollover, as described above.
@end deffn

@geindex emit() (logging.handlers.TimedRotatingFileHandler method)
@anchor{library/logging handlers logging handlers TimedRotatingFileHandler emit}@anchor{325f}
@deffn {Method} emit (record)

Outputs the record to the file, catering for rollover as described above.
@end deffn

@geindex getFilesToDelete() (logging.handlers.TimedRotatingFileHandler method)
@anchor{library/logging handlers logging handlers TimedRotatingFileHandler getFilesToDelete}@anchor{3254}
@deffn {Method} getFilesToDelete ()

Returns a list of filenames which should be deleted as part of rollover. These
are the absolute paths of the oldest backup log files written by the handler.
@end deffn

@geindex shouldRollover() (logging.handlers.TimedRotatingFileHandler method)
@anchor{library/logging handlers logging handlers TimedRotatingFileHandler shouldRollover}@anchor{3261}
@deffn {Method} shouldRollover (record)

See if enough time has passed for a rollover to occur and if it has, compute
the next rollover time.
@end deffn
@end deffn

@node SocketHandler,DatagramHandler,TimedRotatingFileHandler,logging handlers — Logging handlers
@anchor{library/logging handlers socket-handler}@anchor{3262}@anchor{library/logging handlers sockethandler}@anchor{3263}
@subsubsection SocketHandler


The @ref{1168,,SocketHandler} class, located in the @code{logging.handlers} module,
sends logging output to a network socket. The base class uses a TCP socket.

@geindex SocketHandler (class in logging.handlers)
@anchor{library/logging handlers logging handlers SocketHandler}@anchor{1168}
@deffn {Class} logging.handlers.SocketHandler (host, port)

Returns a new instance of the @code{SocketHandler} class intended to
communicate with a remote machine whose address is given by `host' and `port'.


Changed in version 3.4: If @code{port} is specified as @code{None}, a Unix domain socket is created
using the value in @code{host} - otherwise, a TCP socket is created.


@geindex close() (logging.handlers.SocketHandler method)
@anchor{library/logging handlers logging handlers SocketHandler close}@anchor{3264}
@deffn {Method} close ()

Closes the socket.
@end deffn

@geindex emit() (logging.handlers.SocketHandler method)
@anchor{library/logging handlers logging handlers SocketHandler emit}@anchor{3265}
@deffn {Method} emit ()

Pickles the record’s attribute dictionary and writes it to the socket in
binary format. If there is an error with the socket, silently drops the
packet. If the connection was previously lost, re-establishes the
connection. To unpickle the record at the receiving end into a
@ref{11ec,,LogRecord}, use the @ref{31fd,,makeLogRecord()}
function.
@end deffn

@geindex handleError() (logging.handlers.SocketHandler method)
@anchor{library/logging handlers logging handlers SocketHandler handleError}@anchor{3266}
@deffn {Method} handleError ()

Handles an error which has occurred during @ref{3265,,emit()}. The most likely
cause is a lost connection. Closes the socket so that we can retry on the
next event.
@end deffn

@geindex makeSocket() (logging.handlers.SocketHandler method)
@anchor{library/logging handlers logging handlers SocketHandler makeSocket}@anchor{3267}
@deffn {Method} makeSocket ()

This is a factory method which allows subclasses to define the precise
type of socket they want. The default implementation creates a TCP socket
(@ref{14ff,,socket.SOCK_STREAM}).
@end deffn

@geindex makePickle() (logging.handlers.SocketHandler method)
@anchor{library/logging handlers logging handlers SocketHandler makePickle}@anchor{3268}
@deffn {Method} makePickle (record)

Pickles the record’s attribute dictionary in binary format with a length
prefix, and returns it ready for transmission across the socket. The
details of this operation are equivalent to:

@example
data = pickle.dumps(record_attr_dict, 1)
datalen = struct.pack('>L', len(data))
return datalen + data
@end example

Note that pickles aren’t completely secure. If you are concerned about
security, you may want to override this method to implement a more secure
mechanism. For example, you can sign pickles using HMAC and then verify
them on the receiving end, or alternatively you can disable unpickling of
global objects on the receiving end.
@end deffn

@geindex send() (logging.handlers.SocketHandler method)
@anchor{library/logging handlers logging handlers SocketHandler send}@anchor{3269}
@deffn {Method} send (packet)

Send a pickled byte-string `packet' to the socket. The format of the sent
byte-string is as described in the documentation for
@ref{3268,,makePickle()}.

This function allows for partial sends, which can happen when the network
is busy.
@end deffn

@geindex createSocket() (logging.handlers.SocketHandler method)
@anchor{library/logging handlers logging handlers SocketHandler createSocket}@anchor{86f}
@deffn {Method} createSocket ()

Tries to create a socket; on failure, uses an exponential back-off
algorithm.  On initial failure, the handler will drop the message it was
trying to send.  When subsequent messages are handled by the same
instance, it will not try connecting until some time has passed.  The
default parameters are such that the initial delay is one second, and if
after that delay the connection still can’t be made, the handler will
double the delay each time up to a maximum of 30 seconds.

This behaviour is controlled by the following handler attributes:


@itemize *

@item 
@code{retryStart} (initial delay, defaulting to 1.0 seconds).

@item 
@code{retryFactor} (multiplier, defaulting to 2.0).

@item 
@code{retryMax} (maximum delay, defaulting to 30.0 seconds).
@end itemize

This means that if the remote listener starts up `after' the handler has
been used, you could lose messages (since the handler won’t even attempt
a connection until the delay has elapsed, but just silently drop messages
during the delay period).
@end deffn
@end deffn

@node DatagramHandler,SysLogHandler,SocketHandler,logging handlers — Logging handlers
@anchor{library/logging handlers datagram-handler}@anchor{326a}@anchor{library/logging handlers datagramhandler}@anchor{326b}
@subsubsection DatagramHandler


The @ref{1169,,DatagramHandler} class, located in the @code{logging.handlers}
module, inherits from @ref{1168,,SocketHandler} to support sending logging messages
over UDP sockets.

@geindex DatagramHandler (class in logging.handlers)
@anchor{library/logging handlers logging handlers DatagramHandler}@anchor{1169}
@deffn {Class} logging.handlers.DatagramHandler (host, port)

Returns a new instance of the @code{DatagramHandler} class intended to
communicate with a remote machine whose address is given by `host' and `port'.

@cartouche
@quotation Note 
As UDP is not a streaming protocol, there is no persistent connection
between an instance of this handler and `host'. For this reason, when using a
network socket, a DNS lookup might have to be made each time an event is
logged, which can introduce some latency into the system. If this affects you,
you can do a lookup yourself and initialize this handler using the looked-up IP
address rather than the hostname.
@end quotation
@end cartouche


Changed in version 3.4: If @code{port} is specified as @code{None}, a Unix domain socket is created
using the value in @code{host} - otherwise, a UDP socket is created.


@geindex emit() (logging.handlers.DatagramHandler method)
@anchor{library/logging handlers logging handlers DatagramHandler emit}@anchor{326c}
@deffn {Method} emit ()

Pickles the record’s attribute dictionary and writes it to the socket in
binary format. If there is an error with the socket, silently drops the
packet. To unpickle the record at the receiving end into a
@ref{11ec,,LogRecord}, use the @ref{31fd,,makeLogRecord()}
function.
@end deffn

@geindex makeSocket() (logging.handlers.DatagramHandler method)
@anchor{library/logging handlers logging handlers DatagramHandler makeSocket}@anchor{326d}
@deffn {Method} makeSocket ()

The factory method of @ref{1168,,SocketHandler} is here overridden to create
a UDP socket (@ref{14fe,,socket.SOCK_DGRAM}).
@end deffn

@geindex send() (logging.handlers.DatagramHandler method)
@anchor{library/logging handlers logging handlers DatagramHandler send}@anchor{326e}
@deffn {Method} send (s)

Send a pickled byte-string to a socket. The format of the sent byte-string
is as described in the documentation for @ref{3268,,SocketHandler.makePickle()}.
@end deffn
@end deffn

@node SysLogHandler,NTEventLogHandler,DatagramHandler,logging handlers — Logging handlers
@anchor{library/logging handlers syslog-handler}@anchor{326f}@anchor{library/logging handlers sysloghandler}@anchor{3270}
@subsubsection SysLogHandler


The @ref{86e,,SysLogHandler} class, located in the @code{logging.handlers} module,
supports sending logging messages to a remote or local Unix syslog.

@geindex SysLogHandler (class in logging.handlers)
@anchor{library/logging handlers logging handlers SysLogHandler}@anchor{86e}
@deffn {Class} logging.handlers.SysLogHandler (address=('localhost', SYSLOG_UDP_PORT), facility=LOG_USER, socktype=socket.SOCK_DGRAM, timeout=None)

Returns a new instance of the @code{SysLogHandler} class intended to
communicate with a remote Unix machine whose address is given by `address' in
the form of a @code{(host, port)} tuple.  If `address' is not specified,
@code{('localhost', 514)} is used.  The address is used to open a socket.  An
alternative to providing a @code{(host, port)} tuple is providing an address as a
string, for example ‘/dev/log’. In this case, a Unix domain socket is used to
send the message to the syslog. If `facility' is not specified,
@code{LOG_USER} is used. The type of socket opened depends on the
`socktype' argument, which defaults to @ref{14fe,,socket.SOCK_DGRAM} and thus
opens a UDP socket. To open a TCP socket (for use with the newer syslog
daemons such as rsyslog), specify a value of @ref{14ff,,socket.SOCK_STREAM}.
If `timeout' is specified, it sets a timeout (in seconds) for the socket operations.
This can help prevent the program from hanging indefinitely if the syslog server is
unreachable. By default, `timeout' is @code{None}, meaning no timeout is applied.

Note that if your server is not listening on UDP port 514,
@code{SysLogHandler} may appear not to work. In that case, check what
address you should be using for a domain socket - it’s system dependent.
For example, on Linux it’s usually ‘/dev/log’ but on OS/X it’s
‘/var/run/syslog’. You’ll need to check your platform and use the
appropriate address (you may need to do this check at runtime if your
application needs to run on several platforms). On Windows, you pretty
much have to use the UDP option.

@cartouche
@quotation Note 
On macOS 12.x (Monterey), Apple has changed the behaviour of their
syslog daemon - it no longer listens on a domain socket. Therefore, you cannot
expect @code{SysLogHandler} to work on this system.

See gh-91070@footnote{https://github.com/python/cpython/issues/91070} for more information.
@end quotation
@end cartouche


Changed in version 3.2: `socktype' was added.



Changed in version 3.14: `timeout' was added.


@geindex close() (logging.handlers.SysLogHandler method)
@anchor{library/logging handlers logging handlers SysLogHandler close}@anchor{3271}
@deffn {Method} close ()

Closes the socket to the remote host.
@end deffn

@geindex createSocket() (logging.handlers.SysLogHandler method)
@anchor{library/logging handlers logging handlers SysLogHandler createSocket}@anchor{86d}
@deffn {Method} createSocket ()

Tries to create a socket and, if it’s not a datagram socket, connect it
to the other end. This method is called during handler initialization,
but it’s not regarded as an error if the other end isn’t listening at
this point - the method will be called again when emitting an event, if
there is no socket at that point.


Added in version 3.11.

@end deffn

@geindex emit() (logging.handlers.SysLogHandler method)
@anchor{library/logging handlers logging handlers SysLogHandler emit}@anchor{3272}
@deffn {Method} emit (record)

The record is formatted, and then sent to the syslog server. If exception
information is present, it is `not' sent to the server.


Changed in version 3.2.1: (See: bpo-12168@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12168}.) In earlier versions, the message sent to the
syslog daemons was always terminated with a NUL byte, because early
versions of these daemons expected a NUL terminated message - even
though it’s not in the relevant specification (
@geindex RFC; RFC 5424
RFC 5424@footnote{https://datatracker.ietf.org/doc/html/rfc5424.html}). More recent
versions of these daemons don’t expect the NUL byte but strip it off
if it’s there, and even more recent daemons (which adhere more closely
to RFC 5424) pass the NUL byte on as part of the message.

To enable easier handling of syslog messages in the face of all these
differing daemon behaviours, the appending of the NUL byte has been
made configurable, through the use of a class-level attribute,
@code{append_nul}. This defaults to @code{True} (preserving the existing
behaviour) but can be set to @code{False} on a @code{SysLogHandler} instance
in order for that instance to `not' append the NUL terminator.



Changed in version 3.3: (See: bpo-12419@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12419}.) In earlier versions, there was no facility for
an “ident” or “tag” prefix to identify the source of the message. This
can now be specified using a class-level attribute, defaulting to
@code{""} to preserve existing behaviour, but which can be overridden on
a @code{SysLogHandler} instance in order for that instance to prepend
the ident to every message handled. Note that the provided ident must
be text, not bytes, and is prepended to the message exactly as is.

@end deffn

@geindex encodePriority() (logging.handlers.SysLogHandler method)
@anchor{library/logging handlers logging handlers SysLogHandler encodePriority}@anchor{3273}
@deffn {Method} encodePriority (facility, priority)

Encodes the facility and priority into an integer. You can pass in strings
or integers - if strings are passed, internal mapping dictionaries are
used to convert them to integers.

The symbolic @code{LOG_} values are defined in @code{SysLogHandler} and
mirror the values defined in the @code{sys/syslog.h} header file.

`Priorities'


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxx} 
@headitem

Name (string)

@tab

Symbolic value

@item

@code{alert}

@tab

LOG_ALERT

@item

@code{crit} or @code{critical}

@tab

LOG_CRIT

@item

@code{debug}

@tab

LOG_DEBUG

@item

@code{emerg} or @code{panic}

@tab

LOG_EMERG

@item

@code{err} or @code{error}

@tab

LOG_ERR

@item

@code{info}

@tab

LOG_INFO

@item

@code{notice}

@tab

LOG_NOTICE

@item

@code{warn} or @code{warning}

@tab

LOG_WARNING

@end multitable


`Facilities'


@multitable {xxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxx} 
@headitem

Name (string)

@tab

Symbolic value

@item

@code{auth}

@tab

LOG_AUTH

@item

@code{authpriv}

@tab

LOG_AUTHPRIV

@item

@code{cron}

@tab

LOG_CRON

@item

@code{daemon}

@tab

LOG_DAEMON

@item

@code{ftp}

@tab

LOG_FTP

@item

@code{kern}

@tab

LOG_KERN

@item

@code{lpr}

@tab

LOG_LPR

@item

@code{mail}

@tab

LOG_MAIL

@item

@code{news}

@tab

LOG_NEWS

@item

@code{syslog}

@tab

LOG_SYSLOG

@item

@code{user}

@tab

LOG_USER

@item

@code{uucp}

@tab

LOG_UUCP

@item

@code{local0}

@tab

LOG_LOCAL0

@item

@code{local1}

@tab

LOG_LOCAL1

@item

@code{local2}

@tab

LOG_LOCAL2

@item

@code{local3}

@tab

LOG_LOCAL3

@item

@code{local4}

@tab

LOG_LOCAL4

@item

@code{local5}

@tab

LOG_LOCAL5

@item

@code{local6}

@tab

LOG_LOCAL6

@item

@code{local7}

@tab

LOG_LOCAL7

@end multitable

@end deffn

@geindex mapPriority() (logging.handlers.SysLogHandler method)
@anchor{library/logging handlers logging handlers SysLogHandler mapPriority}@anchor{3274}
@deffn {Method} mapPriority (levelname)

Maps a logging level name to a syslog priority name.
You may need to override this if you are using custom levels, or
if the default algorithm is not suitable for your needs. The
default algorithm maps @code{DEBUG}, @code{INFO}, @code{WARNING}, @code{ERROR} and
@code{CRITICAL} to the equivalent syslog names, and all other level
names to ‘warning’.
@end deffn
@end deffn

@node NTEventLogHandler,SMTPHandler,SysLogHandler,logging handlers — Logging handlers
@anchor{library/logging handlers nt-eventlog-handler}@anchor{3275}@anchor{library/logging handlers nteventloghandler}@anchor{3276}
@subsubsection NTEventLogHandler


The @ref{3277,,NTEventLogHandler} class, located in the @code{logging.handlers}
module, supports sending logging messages to a local Windows NT, Windows 2000 or
Windows XP event log. Before you can use it, you need Mark Hammond’s Win32
extensions for Python installed.

@geindex NTEventLogHandler (class in logging.handlers)
@anchor{library/logging handlers logging handlers NTEventLogHandler}@anchor{3277}
@deffn {Class} logging.handlers.NTEventLogHandler (appname, dllname=None, logtype='Application')

Returns a new instance of the @code{NTEventLogHandler} class. The `appname' is
used to define the application name as it appears in the event log. An
appropriate registry entry is created using this name. The `dllname' should give
the fully qualified pathname of a .dll or .exe which contains message
definitions to hold in the log (if not specified, @code{'win32service.pyd'} is used
- this is installed with the Win32 extensions and contains some basic
placeholder message definitions. Note that use of these placeholders will make
your event logs big, as the entire message source is held in the log. If you
want slimmer logs, you have to pass in the name of your own .dll or .exe which
contains the message definitions you want to use in the event log). The
`logtype' is one of @code{'Application'}, @code{'System'} or @code{'Security'}, and
defaults to @code{'Application'}.

@geindex close() (logging.handlers.NTEventLogHandler method)
@anchor{library/logging handlers logging handlers NTEventLogHandler close}@anchor{3278}
@deffn {Method} close ()

At this point, you can remove the application name from the registry as a
source of event log entries. However, if you do this, you will not be able
to see the events as you intended in the Event Log Viewer - it needs to be
able to access the registry to get the .dll name. The current version does
not do this.
@end deffn

@geindex emit() (logging.handlers.NTEventLogHandler method)
@anchor{library/logging handlers logging handlers NTEventLogHandler emit}@anchor{3279}
@deffn {Method} emit (record)

Determines the message ID, event category and event type, and then logs
the message in the NT event log.
@end deffn

@geindex getEventCategory() (logging.handlers.NTEventLogHandler method)
@anchor{library/logging handlers logging handlers NTEventLogHandler getEventCategory}@anchor{327a}
@deffn {Method} getEventCategory (record)

Returns the event category for the record. Override this if you want to
specify your own categories. This version returns 0.
@end deffn

@geindex getEventType() (logging.handlers.NTEventLogHandler method)
@anchor{library/logging handlers logging handlers NTEventLogHandler getEventType}@anchor{327b}
@deffn {Method} getEventType (record)

Returns the event type for the record. Override this if you want to
specify your own types. This version does a mapping using the handler’s
typemap attribute, which is set up in @code{__init__()} to a dictionary
which contains mappings for @code{DEBUG}, @code{INFO},
@code{WARNING}, @code{ERROR} and @code{CRITICAL}. If you are using
your own levels, you will either need to override this method or place a
suitable dictionary in the handler’s `typemap' attribute.
@end deffn

@geindex getMessageID() (logging.handlers.NTEventLogHandler method)
@anchor{library/logging handlers logging handlers NTEventLogHandler getMessageID}@anchor{327c}
@deffn {Method} getMessageID (record)

Returns the message ID for the record. If you are using your own messages,
you could do this by having the `msg' passed to the logger being an ID
rather than a format string. Then, in here, you could use a dictionary
lookup to get the message ID. This version returns 1, which is the base
message ID in @code{win32service.pyd}.
@end deffn
@end deffn

@node SMTPHandler,MemoryHandler,NTEventLogHandler,logging handlers — Logging handlers
@anchor{library/logging handlers smtp-handler}@anchor{327d}@anchor{library/logging handlers smtphandler}@anchor{327e}
@subsubsection SMTPHandler


The @ref{18f8,,SMTPHandler} class, located in the @code{logging.handlers} module,
supports sending logging messages to an email address via SMTP.

@geindex SMTPHandler (class in logging.handlers)
@anchor{library/logging handlers logging handlers SMTPHandler}@anchor{18f8}
@deffn {Class} logging.handlers.SMTPHandler (mailhost, fromaddr, toaddrs, subject, credentials=None, secure=None, timeout=1.0)

Returns a new instance of the @code{SMTPHandler} class. The instance is
initialized with the from and to addresses and subject line of the email. The
`toaddrs' should be a list of strings. To specify a non-standard SMTP port, use
the (host, port) tuple format for the `mailhost' argument. If you use a string,
the standard SMTP port is used. If your SMTP server requires authentication, you
can specify a (username, password) tuple for the `credentials' argument.

To specify the use of a secure protocol (TLS), pass in a tuple to the
`secure' argument. This will only be used when authentication credentials are
supplied. The tuple should be either an empty tuple, or a single-value tuple
with the name of a keyfile, or a 2-value tuple with the names of the keyfile
and certificate file. (This tuple is passed to the
@ref{1344,,smtplib.SMTP.starttls()} method.)

A timeout can be specified for communication with the SMTP server using the
`timeout' argument.


Changed in version 3.3: Added the `timeout' parameter.


@geindex emit() (logging.handlers.SMTPHandler method)
@anchor{library/logging handlers logging handlers SMTPHandler emit}@anchor{327f}
@deffn {Method} emit (record)

Formats the record and sends it to the specified addressees.
@end deffn

@geindex getSubject() (logging.handlers.SMTPHandler method)
@anchor{library/logging handlers logging handlers SMTPHandler getSubject}@anchor{3280}
@deffn {Method} getSubject (record)

If you want to specify a subject line which is record-dependent, override
this method.
@end deffn
@end deffn

@node MemoryHandler,HTTPHandler,SMTPHandler,logging handlers — Logging handlers
@anchor{library/logging handlers memory-handler}@anchor{3281}@anchor{library/logging handlers memoryhandler}@anchor{3282}
@subsubsection MemoryHandler


The @ref{3230,,MemoryHandler} class, located in the @code{logging.handlers} module,
supports buffering of logging records in memory, periodically flushing them to a
`target' handler. Flushing occurs whenever the buffer is full, or when an
event of a certain severity or greater is seen.

@ref{3230,,MemoryHandler} is a subclass of the more general
@ref{3283,,BufferingHandler}, which is an abstract class. This buffers logging
records in memory. Whenever each record is added to the buffer, a check is made
by calling @code{shouldFlush()} to see if the buffer should be flushed.  If it
should, then @code{flush()} is expected to do the flushing.

@geindex BufferingHandler (class in logging.handlers)
@anchor{library/logging handlers logging handlers BufferingHandler}@anchor{3283}
@deffn {Class} logging.handlers.BufferingHandler (capacity)

Initializes the handler with a buffer of the specified capacity. Here,
`capacity' means the number of logging records buffered.

@geindex emit() (logging.handlers.BufferingHandler method)
@anchor{library/logging handlers logging handlers BufferingHandler emit}@anchor{3284}
@deffn {Method} emit (record)

Append the record to the buffer. If @ref{3285,,shouldFlush()} returns true,
call @ref{3286,,flush()} to process the buffer.
@end deffn

@geindex flush() (logging.handlers.BufferingHandler method)
@anchor{library/logging handlers logging handlers BufferingHandler flush}@anchor{3286}
@deffn {Method} flush ()

For a @code{BufferingHandler} instance, flushing means that it sets the
buffer to an empty list. This method can be overwritten to implement more useful
flushing behavior.
@end deffn

@geindex shouldFlush() (logging.handlers.BufferingHandler method)
@anchor{library/logging handlers logging handlers BufferingHandler shouldFlush}@anchor{3285}
@deffn {Method} shouldFlush (record)

Return @code{True} if the buffer is up to capacity. This method can be
overridden to implement custom flushing strategies.
@end deffn
@end deffn

@geindex MemoryHandler (class in logging.handlers)
@anchor{library/logging handlers logging handlers MemoryHandler}@anchor{3230}
@deffn {Class} logging.handlers.MemoryHandler (capacity, flushLevel=ERROR, target=None, flushOnClose=True)

Returns a new instance of the @code{MemoryHandler} class. The instance is
initialized with a buffer size of `capacity' (number of records buffered).
If `flushLevel' is not specified, @code{ERROR} is used. If no `target' is
specified, the target will need to be set using @ref{3287,,setTarget()} before this
handler does anything useful. If `flushOnClose' is specified as @code{False},
then the buffer is `not' flushed when the handler is closed. If not specified
or specified as @code{True}, the previous behaviour of flushing the buffer will
occur when the handler is closed.


Changed in version 3.6: The `flushOnClose' parameter was added.


@geindex close() (logging.handlers.MemoryHandler method)
@anchor{library/logging handlers logging handlers MemoryHandler close}@anchor{3288}
@deffn {Method} close ()

Calls @ref{3289,,flush()}, sets the target to @code{None} and clears the
buffer.
@end deffn

@geindex flush() (logging.handlers.MemoryHandler method)
@anchor{library/logging handlers logging handlers MemoryHandler flush}@anchor{3289}
@deffn {Method} flush ()

For a @code{MemoryHandler} instance, flushing means just sending the buffered
records to the target, if there is one. The buffer is also cleared when
buffered records are sent to the target. Override if you want different behavior.
@end deffn

@geindex setTarget() (logging.handlers.MemoryHandler method)
@anchor{library/logging handlers logging handlers MemoryHandler setTarget}@anchor{3287}
@deffn {Method} setTarget (target)

Sets the target handler for this handler.
@end deffn

@geindex shouldFlush() (logging.handlers.MemoryHandler method)
@anchor{library/logging handlers logging handlers MemoryHandler shouldFlush}@anchor{328a}
@deffn {Method} shouldFlush (record)

Checks for buffer full or a record at the `flushLevel' or higher.
@end deffn
@end deffn

@node HTTPHandler,QueueHandler,MemoryHandler,logging handlers — Logging handlers
@anchor{library/logging handlers http-handler}@anchor{328b}@anchor{library/logging handlers httphandler}@anchor{328c}
@subsubsection HTTPHandler


The @ref{1032,,HTTPHandler} class, located in the @code{logging.handlers} module,
supports sending logging messages to a web server, using either @code{GET} or
@code{POST} semantics.

@geindex HTTPHandler (class in logging.handlers)
@anchor{library/logging handlers logging handlers HTTPHandler}@anchor{1032}
@deffn {Class} logging.handlers.HTTPHandler (host, url, method='GET', secure=False, credentials=None, context=None)

Returns a new instance of the @code{HTTPHandler} class. The `host' can be
of the form @code{host:port}, should you need to use a specific port number.  If
no `method' is specified, @code{GET} is used. If `secure' is true, a HTTPS
connection will be used. The `context' parameter may be set to a
@ref{355,,ssl.SSLContext} instance to configure the SSL settings used for the
HTTPS connection. If `credentials' is specified, it should be a 2-tuple
consisting of userid and password, which will be placed in a HTTP
‘Authorization’ header using Basic authentication. If you specify
credentials, you should also specify secure=True so that your userid and
password are not passed in cleartext across the wire.


Changed in version 3.5: The `context' parameter was added.


@geindex mapLogRecord() (logging.handlers.HTTPHandler method)
@anchor{library/logging handlers logging handlers HTTPHandler mapLogRecord}@anchor{328d}
@deffn {Method} mapLogRecord (record)

Provides a dictionary, based on @code{record}, which is to be URL-encoded
and sent to the web server. The default implementation just returns
@code{record.__dict__}. This method can be overridden if e.g. only a
subset of @ref{11ec,,LogRecord} is to be sent to the web server, or
if more specific customization of what’s sent to the server is required.
@end deffn

@geindex emit() (logging.handlers.HTTPHandler method)
@anchor{library/logging handlers logging handlers HTTPHandler emit}@anchor{328e}
@deffn {Method} emit (record)

Sends the record to the web server as a URL-encoded dictionary. The
@ref{328d,,mapLogRecord()} method is used to convert the record to the
dictionary to be sent.
@end deffn

@cartouche
@quotation Note 
Since preparing a record for sending it to a web server is not
the same as a generic formatting operation, using
@ref{31e1,,setFormatter()} to specify a
@ref{16a3,,Formatter} for a @code{HTTPHandler} has no effect.
Instead of calling @ref{31ea,,format()}, this handler calls
@ref{328d,,mapLogRecord()} and then @ref{109b,,urllib.parse.urlencode()} to encode the
dictionary in a form suitable for sending to a web server.
@end quotation
@end cartouche
@end deffn

@node QueueHandler,QueueListener,HTTPHandler,logging handlers — Logging handlers
@anchor{library/logging handlers queue-handler}@anchor{328f}@anchor{library/logging handlers queuehandler}@anchor{3290}
@subsubsection QueueHandler



Added in version 3.2.


The @ref{1ba5,,QueueHandler} class, located in the @code{logging.handlers} module,
supports sending logging messages to a queue, such as those implemented in the
@ref{bb,,queue} or @ref{98,,multiprocessing} modules.

Along with the @ref{244,,QueueListener} class, @ref{1ba5,,QueueHandler} can be used
to let handlers do their work on a separate thread from the one which does the
logging. This is important in web applications and also other service
applications where threads servicing clients need to respond as quickly as
possible, while any potentially slow operations (such as sending an email via
@ref{18f8,,SMTPHandler}) are done on a separate thread.

@geindex QueueHandler (class in logging.handlers)
@anchor{library/logging handlers logging handlers QueueHandler}@anchor{1ba5}
@deffn {Class} logging.handlers.QueueHandler (queue)

Returns a new instance of the @code{QueueHandler} class. The instance is
initialized with the queue to send messages to. The `queue' can be any
queue-like object; it’s used as-is by the @ref{3291,,enqueue()} method, which
needs to know how to send messages to it. The queue is not `required' to
have the task tracking API, which means that you can use
@ref{d67,,SimpleQueue} instances for `queue'.

@cartouche
@quotation Note 
If you are using @ref{98,,multiprocessing}, you should avoid using
@ref{d67,,SimpleQueue} and instead use @ref{1bcd,,multiprocessing.Queue}.
@end quotation
@end cartouche

@cartouche
@quotation Warning 
The @ref{98,,multiprocessing} module uses an internal logger created and
accessed via @ref{3292,,get_logger()}.
@ref{1bcd,,multiprocessing.Queue} will log @code{DEBUG} level messages upon
items being queued. If those log messages are processed by a
@code{QueueHandler} using the same @code{multiprocessing.Queue} instance,
it will cause a deadlock or infinite recursion.
@end quotation
@end cartouche

@geindex emit() (logging.handlers.QueueHandler method)
@anchor{library/logging handlers logging handlers QueueHandler emit}@anchor{3293}
@deffn {Method} emit (record)

Enqueues the result of preparing the LogRecord. Should an exception
occur (e.g. because a bounded queue has filled up), the
@ref{31e8,,handleError()} method is called to handle the
error. This can result in the record silently being dropped (if
@ref{1405,,logging.raiseExceptions} is @code{False}) or a message printed to
@code{sys.stderr} (if @code{logging.raiseExceptions} is @code{True}).
@end deffn

@geindex prepare() (logging.handlers.QueueHandler method)
@anchor{library/logging handlers logging handlers QueueHandler prepare}@anchor{3294}
@deffn {Method} prepare (record)

Prepares a record for queuing. The object returned by this
method is enqueued.

The base implementation formats the record to merge the message,
arguments, exception and stack information, if present.  It also removes
unpickleable items from the record in-place. Specifically, it overwrites
the record’s @code{msg} and @code{message} attributes with the merged
message (obtained by calling the handler’s @ref{19a,,format()} method), and
sets the @code{args}, @code{exc_info} and @code{exc_text} attributes
to @code{None}.

You might want to override this method if you want to convert
the record to a dict or JSON string, or send a modified copy
of the record while leaving the original intact.

@cartouche
@quotation Note 
The base implementation formats the message with arguments, sets
the @code{message} and @code{msg} attributes to the formatted message and
sets the @code{args} and @code{exc_text} attributes to @code{None} to allow
pickling and to prevent further attempts at formatting. This means
that a handler on the @ref{244,,QueueListener} side won’t have the
information to do custom formatting, e.g. of exceptions. You may wish
to subclass @code{QueueHandler} and override this method to e.g. avoid
setting @code{exc_text} to @code{None}. Note that the @code{message} / @code{msg}
/ @code{args} changes are related to ensuring the record is pickleable,
and you might or might not be able to avoid doing that depending on
whether your @code{args} are pickleable. (Note that you may have to
consider not only your own code but also code in any libraries that
you use.)
@end quotation
@end cartouche
@end deffn

@geindex enqueue() (logging.handlers.QueueHandler method)
@anchor{library/logging handlers logging handlers QueueHandler enqueue}@anchor{3291}
@deffn {Method} enqueue (record)

Enqueues the record on the queue using @code{put_nowait()}; you may
want to override this if you want to use blocking behaviour, or a
timeout, or a customized queue implementation.
@end deffn

@geindex listener (logging.handlers.QueueHandler attribute)
@anchor{library/logging handlers logging handlers QueueHandler listener}@anchor{3234}
@deffn {Attribute} listener

When created via configuration using @ref{13bc,,dictConfig()}, this
attribute will contain a @ref{244,,QueueListener} instance for use with this
handler. Otherwise, it will be @code{None}.


Added in version 3.12.

@end deffn
@end deffn

@node QueueListener,,QueueHandler,logging handlers — Logging handlers
@anchor{library/logging handlers queue-listener}@anchor{3295}@anchor{library/logging handlers queuelistener}@anchor{3296}
@subsubsection QueueListener



Added in version 3.2.


The @ref{244,,QueueListener} class, located in the @code{logging.handlers}
module, supports receiving logging messages from a queue, such as those
implemented in the @ref{bb,,queue} or @ref{98,,multiprocessing} modules. The
messages are received from a queue in an internal thread and passed, on
the same thread, to one or more handlers for processing. While
@code{QueueListener} is not itself a handler, it is documented here
because it works hand-in-hand with @ref{1ba5,,QueueHandler}.

Along with the @ref{1ba5,,QueueHandler} class, @ref{244,,QueueListener} can be used
to let handlers do their work on a separate thread from the one which does the
logging. This is important in web applications and also other service
applications where threads servicing clients need to respond as quickly as
possible, while any potentially slow operations (such as sending an email via
@ref{18f8,,SMTPHandler}) are done on a separate thread.

@geindex QueueListener (class in logging.handlers)
@anchor{library/logging handlers logging handlers QueueListener}@anchor{244}
@deffn {Class} logging.handlers.QueueListener (queue, *handlers, respect_handler_level=False)

Returns a new instance of the @code{QueueListener} class. The instance is
initialized with the queue to send messages to and a list of handlers which
will handle entries placed on the queue. The queue can be any queue-like
object; it’s passed as-is to the @ref{3297,,dequeue()} method, which needs
to know how to get messages from it. The queue is not `required' to have the
task tracking API (though it’s used if available), which means that you can
use @ref{d67,,SimpleQueue} instances for `queue'.

@cartouche
@quotation Note 
If you are using @ref{98,,multiprocessing}, you should avoid using
@ref{d67,,SimpleQueue} and instead use @ref{1bcd,,multiprocessing.Queue}.
@end quotation
@end cartouche

If @code{respect_handler_level} is @code{True}, a handler’s level is respected
(compared with the level for the message) when deciding whether to pass
messages to that handler; otherwise, the behaviour is as in previous Python
versions - to always pass each message to each handler.


Changed in version 3.5: The @code{respect_handler_level} argument was added.



Changed in version 3.14: @code{QueueListener} can now be used as a context manager via
@ref{187,,with}. When entering the context, the listener is started. When
exiting the context, the listener is stopped.
@ref{26f3,,__enter__()} returns the
@code{QueueListener} object.


@geindex dequeue() (logging.handlers.QueueListener method)
@anchor{library/logging handlers logging handlers QueueListener dequeue}@anchor{3297}
@deffn {Method} dequeue (block)

Dequeues a record and return it, optionally blocking.

The base implementation uses @code{get()}. You may want to override this
method if you want to use timeouts or work with custom queue
implementations.
@end deffn

@geindex prepare() (logging.handlers.QueueListener method)
@anchor{library/logging handlers logging handlers QueueListener prepare}@anchor{3298}
@deffn {Method} prepare (record)

Prepare a record for handling.

This implementation just returns the passed-in record. You may want to
override this method if you need to do any custom marshalling or
manipulation of the record before passing it to the handlers.
@end deffn

@geindex handle() (logging.handlers.QueueListener method)
@anchor{library/logging handlers logging handlers QueueListener handle}@anchor{3299}
@deffn {Method} handle (record)

Handle a record.

This just loops through the handlers offering them the record
to handle. The actual object passed to the handlers is that which
is returned from @ref{3298,,prepare()}.
@end deffn

@geindex start() (logging.handlers.QueueListener method)
@anchor{library/logging handlers logging handlers QueueListener start}@anchor{245}
@deffn {Method} start ()

Starts the listener.

This starts up a background thread to monitor the queue for
LogRecords to process.


Changed in version 3.14: Raises @ref{246,,RuntimeError} if called and the listener is already
running.

@end deffn

@geindex stop() (logging.handlers.QueueListener method)
@anchor{library/logging handlers logging handlers QueueListener stop}@anchor{329a}
@deffn {Method} stop ()

Stops the listener.

This asks the thread to terminate, and then waits for it to do so.
Note that if you don’t call this before your application exits, there
may be some records still left on the queue, which won’t be processed.
@end deffn

@geindex enqueue_sentinel() (logging.handlers.QueueListener method)
@anchor{library/logging handlers logging handlers QueueListener enqueue_sentinel}@anchor{329b}
@deffn {Method} enqueue_sentinel ()

Writes a sentinel to the queue to tell the listener to quit. This
implementation uses @code{put_nowait()}.  You may want to override this
method if you want to use timeouts or work with custom queue
implementations.


Added in version 3.3.

@end deffn
@end deffn


@subsubheading See also



@table @asis

@item Module @ref{8b,,logging}

API reference for the logging module.

@item Module @ref{8c,,logging.config}

Configuration API for the logging module.
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node platform — Access to underlying platform’s identifying data,errno — Standard errno system symbols,logging handlers — Logging handlers,Generic Operating System Services
@anchor{library/platform doc}@anchor{329c}@anchor{library/platform module-platform}@anchor{af}@anchor{library/platform platform-access-to-underlying-platform-s-identifying-data}@anchor{329d}@anchor{library/platform translation-repo}@anchor{329e}
@subsection @code{platform} —  Access to underlying platform’s identifying data


@geindex module; platform

`Source code:' Lib/platform.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/platform.py}


__________________________________________________________________


@cartouche
@quotation Note 
Specific platforms listed alphabetically, with Linux included in the Unix
section.
@end quotation
@end cartouche

@menu
* Cross platform:: 
* Java platform:: 
* Windows platform:: 
* macOS platform:: 
* iOS platform:: 
* Unix platforms:: 
* Linux platforms:: 
* Android platform:: 
* Command-line usage: Command-line usage<3>. 

@end menu

@node Cross platform,Java platform,,platform — Access to underlying platform’s identifying data
@anchor{library/platform cross-platform}@anchor{329f}
@subsubsection Cross platform


@geindex architecture() (in module platform)
@anchor{library/platform platform architecture}@anchor{1a4d}
@deffn {Function} platform.architecture (executable=sys.executable, bits='@w{'}, linkage='@w{'})

Queries the given executable (defaults to the Python interpreter binary) for
various architecture information.

Returns a tuple @code{(bits, linkage)} which contain information about the bit
architecture and the linkage format used for the executable. Both values are
returned as strings.

Values that cannot be determined are returned as given by the parameter presets.
If bits is given as @code{'@w{'}}, the @code{sizeof(pointer)} (or
@code{sizeof(long)} on Python version < 1.5.2) is used as indicator for the
supported pointer size.

The function relies on the system’s @code{file} command to do the actual work.
This is available on most if not all Unix  platforms and some non-Unix platforms
and then only if the executable points to the Python interpreter.  Reasonable
defaults are used when the above needs are not met.

@cartouche
@quotation Note 
On macOS (and perhaps other platforms), executable files may be
universal files containing multiple architectures.

To get at the “64-bitness” of the current interpreter, it is more
reliable to query the @ref{13d1,,sys.maxsize} attribute:

@example
is_64bits = sys.maxsize > 2**32
@end example
@end quotation
@end cartouche
@end deffn

@geindex machine() (in module platform)
@anchor{library/platform platform machine}@anchor{32a0}
@deffn {Function} platform.machine ()

Returns the machine type, e.g. @code{'AMD64'}. An empty string is returned if the
value cannot be determined.

The output is platform-dependent and may differ in casing and naming conventions.
@end deffn

@geindex node() (in module platform)
@anchor{library/platform platform node}@anchor{32a1}
@deffn {Function} platform.node ()

Returns the computer’s network name (may not be fully qualified!). An empty
string is returned if the value cannot be determined.
@end deffn

@geindex platform() (in module platform)
@anchor{library/platform platform platform}@anchor{1b0c}
@deffn {Function} platform.platform (aliased=False, terse=False)

Returns a single string identifying the underlying platform with as much useful
information as possible.

The output is intended to be `human readable' rather than machine parseable. It
may look different on different platforms and this is intended.

If `aliased' is true, the function will use aliases for various platforms that
report system names which differ from their common names, for example SunOS will
be reported as Solaris.  The @ref{32a2,,system_alias()} function is used to implement
this.

Setting `terse' to true causes the function to return only the absolute minimum
information needed to identify the platform.


Changed in version 3.8: On macOS, the function now uses @ref{1e57,,mac_ver()}, if it returns a
non-empty release string, to get the macOS version rather than the darwin
version.

@end deffn

@geindex processor() (in module platform)
@anchor{library/platform platform processor}@anchor{32a3}
@deffn {Function} platform.processor ()

Returns the (real) processor name, e.g. @code{'amdk6'}.

An empty string is returned if the value cannot be determined. Note that many
platforms do not provide this information or simply return the same value as for
@ref{32a0,,machine()}.  NetBSD does this.
@end deffn

@geindex python_build() (in module platform)
@anchor{library/platform platform python_build}@anchor{32a4}
@deffn {Function} platform.python_build ()

Returns a tuple @code{(buildno, builddate)} stating the Python build number and
date as strings.
@end deffn

@geindex python_compiler() (in module platform)
@anchor{library/platform platform python_compiler}@anchor{32a5}
@deffn {Function} platform.python_compiler ()

Returns a string identifying the compiler used for compiling Python.
@end deffn

@geindex python_branch() (in module platform)
@anchor{library/platform platform python_branch}@anchor{32a6}
@deffn {Function} platform.python_branch ()

Returns a string identifying the Python implementation SCM branch.
@end deffn

@geindex python_implementation() (in module platform)
@anchor{library/platform platform python_implementation}@anchor{32a7}
@deffn {Function} platform.python_implementation ()

Returns a string identifying the Python implementation. Possible return values
are: ‘CPython’, ‘IronPython’, ‘Jython’, ‘PyPy’.
@end deffn

@geindex python_revision() (in module platform)
@anchor{library/platform platform python_revision}@anchor{32a8}
@deffn {Function} platform.python_revision ()

Returns a string identifying the Python implementation SCM revision.
@end deffn

@geindex python_version() (in module platform)
@anchor{library/platform platform python_version}@anchor{32a9}
@deffn {Function} platform.python_version ()

Returns the Python version as string @code{'major.minor.patchlevel'}.

Note that unlike the Python @code{sys.version}, the returned value will always
include the patchlevel (it defaults to 0).
@end deffn

@geindex python_version_tuple() (in module platform)
@anchor{library/platform platform python_version_tuple}@anchor{32aa}
@deffn {Function} platform.python_version_tuple ()

Returns the Python version as tuple @code{(major, minor, patchlevel)} of strings.

Note that unlike the Python @code{sys.version}, the returned value will always
include the patchlevel (it defaults to @code{'0'}).
@end deffn

@geindex release() (in module platform)
@anchor{library/platform platform release}@anchor{32ab}
@deffn {Function} platform.release ()

Returns the system’s release, e.g. @code{'2.2.0'} or @code{'NT'}. An empty string is
returned if the value cannot be determined.
@end deffn

@geindex system() (in module platform)
@anchor{library/platform platform system}@anchor{22ab}
@deffn {Function} platform.system ()

Returns the system/OS name, such as @code{'Linux'}, @code{'Darwin'}, @code{'Java'},
@code{'Windows'}. An empty string is returned if the value cannot be determined.

On iOS and Android, this returns the user-facing OS name (i.e, @code{'iOS},
@code{'iPadOS'} or @code{'Android'}). To obtain the kernel name (@code{'Darwin'} or
@code{'Linux'}), use @ref{1322,,os.uname()}.
@end deffn

@geindex system_alias() (in module platform)
@anchor{library/platform platform system_alias}@anchor{32a2}
@deffn {Function} platform.system_alias (system, release, version)

Returns @code{(system, release, version)} aliased to common marketing names used
for some systems.  It also does some reordering of the information in some cases
where it would otherwise cause confusion.
@end deffn

@geindex version() (in module platform)
@anchor{library/platform platform version}@anchor{32ac}
@deffn {Function} platform.version ()

Returns the system’s release version, e.g. @code{'#3 on degas'}. An empty string is
returned if the value cannot be determined.

On iOS and Android, this is the user-facing OS version. To obtain the
Darwin or Linux kernel version, use @ref{1322,,os.uname()}.
@end deffn

@geindex uname() (in module platform)
@anchor{library/platform platform uname}@anchor{1e55}
@deffn {Function} platform.uname ()

Fairly portable uname interface. Returns a @ref{4e1,,namedtuple()}
containing six attributes: @ref{22ab,,system}, @ref{32a1,,node}, @ref{32ab,,release},
@ref{32ac,,version}, @ref{32a0,,machine}, and @ref{32a3,,processor}.

@ref{32a3,,processor} is resolved late, on demand.

Note: the first two attribute names differ from the names presented by
@ref{1322,,os.uname()}, where they are named @code{sysname} and
@code{nodename}.

Entries which cannot be determined are set to @code{'@w{'}}.


Changed in version 3.3: Result changed from a tuple to a @ref{4e1,,namedtuple()}.



Changed in version 3.9: @ref{32a3,,processor} is resolved late instead of immediately.

@end deffn

@geindex invalidate_caches() (in module platform)
@anchor{library/platform platform invalidate_caches}@anchor{27f}
@deffn {Function} platform.invalidate_caches ()

Clear out the internal cache of information, such as the @ref{1e55,,uname()}.
This is typically useful when the platform’s @ref{32a1,,node()} is changed
by an external process and one needs to retrieve the updated value.


Added in version 3.14.

@end deffn

@node Java platform,Windows platform,Cross platform,platform — Access to underlying platform’s identifying data
@anchor{library/platform java-platform}@anchor{32ad}
@subsubsection Java platform


@geindex java_ver() (in module platform)
@anchor{library/platform platform java_ver}@anchor{32a}
@deffn {Function} platform.java_ver (release='@w{'}, vendor='@w{'}, vminfo=('@w{'}, '@w{'}, '@w{'}), osinfo=('@w{'}, '@w{'}, '@w{'}))

Version interface for Jython.

Returns a tuple @code{(release, vendor, vminfo, osinfo)} with `vminfo' being a
tuple @code{(vm_name, vm_release, vm_vendor)} and `osinfo' being a tuple
@code{(os_name, os_version, os_arch)}. Values which cannot be determined are set to
the defaults given as parameters (which all default to @code{'@w{'}}).


Deprecated since version 3.13, will be removed in version 3.15: It was largely untested, had a confusing API,
and was only useful for Jython support.

@end deffn

@node Windows platform,macOS platform,Java platform,platform — Access to underlying platform’s identifying data
@anchor{library/platform windows-platform}@anchor{32ae}
@subsubsection Windows platform


@geindex win32_ver() (in module platform)
@anchor{library/platform platform win32_ver}@anchor{1d8e}
@deffn {Function} platform.win32_ver (release='@w{'}, version='@w{'}, csd='@w{'}, ptype='@w{'})

Get additional version information from the Windows Registry and return a tuple
@code{(release, version, csd, ptype)} referring to OS release, version number,
CSD level (service pack) and OS type (multi/single processor). Values which
cannot be determined are set to the defaults given as parameters (which all
default to an empty string).

As a hint: `ptype' is @code{'Uniprocessor Free'} on single processor NT machines
and @code{'Multiprocessor Free'} on multi processor machines. The @code{'Free'} refers
to the OS version being free of debugging code. It could also state @code{'Checked'}
which means the OS version uses debugging code, i.e. code that checks arguments,
ranges, etc.
@end deffn

@geindex win32_edition() (in module platform)
@anchor{library/platform platform win32_edition}@anchor{32af}
@deffn {Function} platform.win32_edition ()

Returns a string representing the current Windows edition, or @code{None} if the
value cannot be determined.  Possible values include but are not limited to
@code{'Enterprise'}, @code{'IoTUAP'}, @code{'ServerStandard'}, and @code{'nanoserver'}.


Added in version 3.8.

@end deffn

@geindex win32_is_iot() (in module platform)
@anchor{library/platform platform win32_is_iot}@anchor{32b0}
@deffn {Function} platform.win32_is_iot ()

Return @code{True} if the Windows edition returned by @ref{32af,,win32_edition()}
is recognized as an IoT edition.


Added in version 3.8.

@end deffn

@node macOS platform,iOS platform,Windows platform,platform — Access to underlying platform’s identifying data
@anchor{library/platform macos-platform}@anchor{32b1}
@subsubsection macOS platform


@geindex mac_ver() (in module platform)
@anchor{library/platform platform mac_ver}@anchor{1e57}
@deffn {Function} platform.mac_ver (release='@w{'}, versioninfo=('@w{'}, '@w{'}, '@w{'}), machine='@w{'})

Get macOS version information and return it as tuple @code{(release, versioninfo,
machine)} with `versioninfo' being a tuple @code{(version, dev_stage,
non_release_version)}.

Entries which cannot be determined are set to @code{'@w{'}}.  All tuple entries are
strings.
@end deffn

@node iOS platform,Unix platforms,macOS platform,platform — Access to underlying platform’s identifying data
@anchor{library/platform ios-platform}@anchor{32b2}
@subsubsection iOS platform


@geindex ios_ver() (in module platform)
@anchor{library/platform platform ios_ver}@anchor{22aa}
@deffn {Function} platform.ios_ver (system='@w{'}, release='@w{'}, model='@w{'}, is_simulator=False)

Get iOS version information and return it as a
@ref{4e1,,namedtuple()} with the following attributes:


@itemize *

@item 
@code{system} is the OS name; either @code{'iOS'} or @code{'iPadOS'}.

@item 
@code{release} is the iOS version number as a string (e.g., @code{'17.2'}).

@item 
@code{model} is the device model identifier; this will be a string like
@code{'iPhone13,2'} for a physical device, or @code{'iPhone'} on a simulator.

@item 
@code{is_simulator} is a boolean describing if the app is running on a
simulator or a physical device.
@end itemize

Entries which cannot be determined are set to the defaults given as
parameters.
@end deffn

@node Unix platforms,Linux platforms,iOS platform,platform — Access to underlying platform’s identifying data
@anchor{library/platform unix-platforms}@anchor{32b3}
@subsubsection Unix platforms


@geindex libc_ver() (in module platform)
@anchor{library/platform platform libc_ver}@anchor{183f}
@deffn {Function} platform.libc_ver (executable=sys.executable, lib='@w{'}, version='@w{'}, chunksize=16384)

Tries to determine the libc version against which the file executable (defaults
to the Python interpreter) is linked.  Returns a tuple of strings @code{(lib,
version)} which default to the given parameters in case the lookup fails.

Note that this function has intimate knowledge of how different libc versions
add symbols to the executable is probably only usable for executables compiled
using @code{gcc}.

The file is read and scanned in chunks of `chunksize' bytes.
@end deffn

@node Linux platforms,Android platform,Unix platforms,platform — Access to underlying platform’s identifying data
@anchor{library/platform linux-platforms}@anchor{32b4}
@subsubsection Linux platforms


@geindex freedesktop_os_release() (in module platform)
@anchor{library/platform platform freedesktop_os_release}@anchor{a2d}
@deffn {Function} platform.freedesktop_os_release ()

Get operating system identification from @code{os-release} file and return
it as a dict. The @code{os-release} file is a freedesktop.org standard@footnote{https://www.freedesktop.org/software/systemd/man/os-release.html} and
is available in most Linux distributions. A noticeable exception is
Android and Android-based distributions.

Raises @ref{2c2,,OSError} or subclass when neither @code{/etc/os-release} nor
@code{/usr/lib/os-release} can be read.

On success, the function returns a dictionary where keys and values are
strings. Values have their special characters like @code{"} and @code{$}
unquoted. The fields @code{NAME}, @code{ID}, and @code{PRETTY_NAME} are always
defined according to the standard. All other fields are optional. Vendors
may include additional fields.

Note that fields like @code{NAME}, @code{VERSION}, and @code{VARIANT} are strings
suitable for presentation to users. Programs should use fields like
@code{ID}, @code{ID_LIKE}, @code{VERSION_ID}, or @code{VARIANT_ID} to identify
Linux distributions.

Example:

@example
def get_like_distro():
    info = platform.freedesktop_os_release()
    ids = [info["ID"]]
    if "ID_LIKE" in info:
        # ids are space separated and ordered by precedence
        ids.extend(info["ID_LIKE"].split())
    return ids
@end example


Added in version 3.10.

@end deffn

@node Android platform,Command-line usage<3>,Linux platforms,platform — Access to underlying platform’s identifying data
@anchor{library/platform android-platform}@anchor{32b5}
@subsubsection Android platform


@geindex android_ver() (in module platform)
@anchor{library/platform platform android_ver}@anchor{1a08}
@deffn {Function} platform.android_ver (release='@w{'}, api_level=0, manufacturer='@w{'}, model='@w{'}, device='@w{'}, is_emulator=False)

Get Android device information. Returns a @ref{4e1,,namedtuple()}
with the following attributes. Values which cannot be determined are set to
the defaults given as parameters.


@itemize *

@item 
@code{release} - Android version, as a string (e.g. @code{"14"}).

@item 
@code{api_level} - API level of the running device, as an integer (e.g. @code{34}
for Android 14). To get the API level which Python was built against, see
@ref{d89,,sys.getandroidapilevel()}.

@item 
@code{manufacturer} - Manufacturer name@footnote{https://developer.android.com/reference/android/os/Build#MANUFACTURER}.

@item 
@code{model} - Model name@footnote{https://developer.android.com/reference/android/os/Build#MODEL} –
typically the marketing name or model number.

@item 
@code{device} - Device name@footnote{https://developer.android.com/reference/android/os/Build#DEVICE} –
typically the model number or a codename.

@item 
@code{is_emulator} - @code{True} if the device is an emulator; @code{False} if it’s
a physical device.
@end itemize

Google maintains a list of known model and device names@footnote{https://storage.googleapis.com/play_public/supported_devices.html}.


Added in version 3.13.

@end deffn

@node Command-line usage<3>,,Android platform,platform — Access to underlying platform’s identifying data
@anchor{library/platform command-line-usage}@anchor{32b6}@anchor{library/platform platform-cli}@anchor{32b7}
@subsubsection Command-line usage


@code{platform} can also be invoked directly using the @ref{23e,,-m}
switch of the interpreter:

@example
python -m platform [--terse] [--nonaliased] [@{nonaliased,terse@} ...]
@end example

The following options are accepted:

@geindex platform command line option; --terse
@anchor{library/platform cmdoption-platform-terse}@anchor{32b8}
@deffn {Option} @w{-}@w{-}terse

Print terse information about the platform. This is equivalent to
calling @ref{1b0c,,platform.platform()} with the `terse' argument set to @code{True}.
@end deffn

@geindex platform command line option; --nonaliased
@anchor{library/platform cmdoption-platform-nonaliased}@anchor{32b9}
@deffn {Option} @w{-}@w{-}nonaliased

Print platform information without system/OS name aliasing. This is
equivalent to calling @ref{1b0c,,platform.platform()} with the `aliased' argument
set to @code{True}.
@end deffn

You can also pass one or more positional arguments (@code{terse}, @code{nonaliased})
to explicitly control the output format. These behave similarly to their
corresponding options.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node errno — Standard errno system symbols,ctypes — A foreign function library for Python,platform — Access to underlying platform’s identifying data,Generic Operating System Services
@anchor{library/errno doc}@anchor{32ba}@anchor{library/errno errno-standard-errno-system-symbols}@anchor{32bb}@anchor{library/errno module-errno}@anchor{5b}@anchor{library/errno translation-repo}@anchor{32bc}
@subsection @code{errno} — Standard errno system symbols


@geindex module; errno


__________________________________________________________________


This module makes available standard @code{errno} system symbols. The value of each
symbol is the corresponding integer value. The names and descriptions are
borrowed from @code{linux/include/errno.h}, which should be
all-inclusive.

@geindex errorcode (in module errno)
@anchor{library/errno errno errorcode}@anchor{32bd}
@deffn {Data} errno.errorcode

Dictionary providing a mapping from the errno value to the string name in the
underlying system.  For instance, @code{errno.errorcode[errno.EPERM]} maps to
@code{'EPERM'}.
@end deffn

To translate a numeric error code to an error message, use @ref{3094,,os.strerror()}.

Of the following list, symbols that are not used on the current platform are not
defined by the module.  The specific list of defined symbols is available as
@code{errno.errorcode.keys()}.  Symbols available can include:

@geindex EPERM (in module errno)
@anchor{library/errno errno EPERM}@anchor{1b9a}
@deffn {Data} errno.EPERM

Operation not permitted. This error is mapped to the exception
@ref{f44,,PermissionError}.
@end deffn

@geindex ENOENT (in module errno)
@anchor{library/errno errno ENOENT}@anchor{2752}
@deffn {Data} errno.ENOENT

No such file or directory. This error is mapped to the exception
@ref{266,,FileNotFoundError}.
@end deffn

@geindex ESRCH (in module errno)
@anchor{library/errno errno ESRCH}@anchor{2756}
@deffn {Data} errno.ESRCH

No such process. This error is mapped to the exception
@ref{1261,,ProcessLookupError}.
@end deffn

@geindex EINTR (in module errno)
@anchor{library/errno errno EINTR}@anchor{f8d}
@deffn {Data} errno.EINTR

Interrupted system call. This error is mapped to the exception
@ref{f8e,,InterruptedError}.
@end deffn

@geindex EIO (in module errno)
@anchor{library/errno errno EIO}@anchor{32be}
@deffn {Data} errno.EIO

I/O error
@end deffn

@geindex ENXIO (in module errno)
@anchor{library/errno errno ENXIO}@anchor{32bf}
@deffn {Data} errno.ENXIO

No such device or address
@end deffn

@geindex E2BIG (in module errno)
@anchor{library/errno errno E2BIG}@anchor{32c0}
@deffn {Data} errno.E2BIG

Arg list too long
@end deffn

@geindex ENOEXEC (in module errno)
@anchor{library/errno errno ENOEXEC}@anchor{32c1}
@deffn {Data} errno.ENOEXEC

Exec format error
@end deffn

@geindex EBADF (in module errno)
@anchor{library/errno errno EBADF}@anchor{b5a}
@deffn {Data} errno.EBADF

Bad file number
@end deffn

@geindex ECHILD (in module errno)
@anchor{library/errno errno ECHILD}@anchor{274b}
@deffn {Data} errno.ECHILD

No child processes. This error is mapped to the exception
@ref{125e,,ChildProcessError}.
@end deffn

@geindex EAGAIN (in module errno)
@anchor{library/errno errno EAGAIN}@anchor{2746}
@deffn {Data} errno.EAGAIN

Try again. This error is mapped to the exception @ref{237,,BlockingIOError}.
@end deffn

@geindex ENOMEM (in module errno)
@anchor{library/errno errno ENOMEM}@anchor{32c2}
@deffn {Data} errno.ENOMEM

Out of memory
@end deffn

@geindex EACCES (in module errno)
@anchor{library/errno errno EACCES}@anchor{2755}
@deffn {Data} errno.EACCES

Permission denied.  This error is mapped to the exception
@ref{f44,,PermissionError}.
@end deffn

@geindex EFAULT (in module errno)
@anchor{library/errno errno EFAULT}@anchor{32c3}
@deffn {Data} errno.EFAULT

Bad address
@end deffn

@geindex ENOTBLK (in module errno)
@anchor{library/errno errno ENOTBLK}@anchor{32c4}
@deffn {Data} errno.ENOTBLK

Block device required
@end deffn

@geindex EBUSY (in module errno)
@anchor{library/errno errno EBUSY}@anchor{32c5}
@deffn {Data} errno.EBUSY

Device or resource busy
@end deffn

@geindex EEXIST (in module errno)
@anchor{library/errno errno EEXIST}@anchor{2751}
@deffn {Data} errno.EEXIST

File exists. This error is mapped to the exception
@ref{1226,,FileExistsError}.
@end deffn

@geindex EXDEV (in module errno)
@anchor{library/errno errno EXDEV}@anchor{30aa}
@deffn {Data} errno.EXDEV

Cross-device link
@end deffn

@geindex ENODEV (in module errno)
@anchor{library/errno errno ENODEV}@anchor{32c6}
@deffn {Data} errno.ENODEV

No such device
@end deffn

@geindex ENOTDIR (in module errno)
@anchor{library/errno errno ENOTDIR}@anchor{2754}
@deffn {Data} errno.ENOTDIR

Not a directory. This error is mapped to the exception
@ref{1260,,NotADirectoryError}.
@end deffn

@geindex EISDIR (in module errno)
@anchor{library/errno errno EISDIR}@anchor{2753}
@deffn {Data} errno.EISDIR

Is a directory. This error is mapped to the exception
@ref{125f,,IsADirectoryError}.
@end deffn

@geindex EINVAL (in module errno)
@anchor{library/errno errno EINVAL}@anchor{1e14}
@deffn {Data} errno.EINVAL

Invalid argument
@end deffn

@geindex ENFILE (in module errno)
@anchor{library/errno errno ENFILE}@anchor{32c7}
@deffn {Data} errno.ENFILE

File table overflow
@end deffn

@geindex EMFILE (in module errno)
@anchor{library/errno errno EMFILE}@anchor{32c8}
@deffn {Data} errno.EMFILE

Too many open files
@end deffn

@geindex ENOTTY (in module errno)
@anchor{library/errno errno ENOTTY}@anchor{32c9}
@deffn {Data} errno.ENOTTY

Not a typewriter
@end deffn

@geindex ETXTBSY (in module errno)
@anchor{library/errno errno ETXTBSY}@anchor{32ca}
@deffn {Data} errno.ETXTBSY

Text file busy
@end deffn

@geindex EFBIG (in module errno)
@anchor{library/errno errno EFBIG}@anchor{32cb}
@deffn {Data} errno.EFBIG

File too large
@end deffn

@geindex ENOSPC (in module errno)
@anchor{library/errno errno ENOSPC}@anchor{32cc}
@deffn {Data} errno.ENOSPC

No space left on device
@end deffn

@geindex ESPIPE (in module errno)
@anchor{library/errno errno ESPIPE}@anchor{32cd}
@deffn {Data} errno.ESPIPE

Illegal seek
@end deffn

@geindex EROFS (in module errno)
@anchor{library/errno errno EROFS}@anchor{32ce}
@deffn {Data} errno.EROFS

Read-only file system
@end deffn

@geindex EMLINK (in module errno)
@anchor{library/errno errno EMLINK}@anchor{32cf}
@deffn {Data} errno.EMLINK

Too many links
@end deffn

@geindex EPIPE (in module errno)
@anchor{library/errno errno EPIPE}@anchor{274c}
@deffn {Data} errno.EPIPE

Broken pipe. This error is mapped to the exception
@ref{1262,,BrokenPipeError}.
@end deffn

@geindex EDOM (in module errno)
@anchor{library/errno errno EDOM}@anchor{32d0}
@deffn {Data} errno.EDOM

Math argument out of domain of func
@end deffn

@geindex ERANGE (in module errno)
@anchor{library/errno errno ERANGE}@anchor{32d1}
@deffn {Data} errno.ERANGE

Math result not representable
@end deffn

@geindex EDEADLK (in module errno)
@anchor{library/errno errno EDEADLK}@anchor{32d2}
@deffn {Data} errno.EDEADLK

Resource deadlock would occur
@end deffn

@geindex ENAMETOOLONG (in module errno)
@anchor{library/errno errno ENAMETOOLONG}@anchor{32d3}
@deffn {Data} errno.ENAMETOOLONG

File name too long
@end deffn

@geindex ENOLCK (in module errno)
@anchor{library/errno errno ENOLCK}@anchor{32d4}
@deffn {Data} errno.ENOLCK

No record locks available
@end deffn

@geindex ENOSYS (in module errno)
@anchor{library/errno errno ENOSYS}@anchor{1b9b}
@deffn {Data} errno.ENOSYS

Function not implemented
@end deffn

@geindex ENOTEMPTY (in module errno)
@anchor{library/errno errno ENOTEMPTY}@anchor{32d5}
@deffn {Data} errno.ENOTEMPTY

Directory not empty
@end deffn

@geindex ELOOP (in module errno)
@anchor{library/errno errno ELOOP}@anchor{32d6}
@deffn {Data} errno.ELOOP

Too many symbolic links encountered
@end deffn

@geindex EWOULDBLOCK (in module errno)
@anchor{library/errno errno EWOULDBLOCK}@anchor{2748}
@deffn {Data} errno.EWOULDBLOCK

Operation would block. This error is mapped to the exception
@ref{237,,BlockingIOError}.
@end deffn

@geindex ENOMSG (in module errno)
@anchor{library/errno errno ENOMSG}@anchor{32d7}
@deffn {Data} errno.ENOMSG

No message of desired type
@end deffn

@geindex EIDRM (in module errno)
@anchor{library/errno errno EIDRM}@anchor{32d8}
@deffn {Data} errno.EIDRM

Identifier removed
@end deffn

@geindex ECHRNG (in module errno)
@anchor{library/errno errno ECHRNG}@anchor{32d9}
@deffn {Data} errno.ECHRNG

Channel number out of range
@end deffn

@geindex EL2NSYNC (in module errno)
@anchor{library/errno errno EL2NSYNC}@anchor{32da}
@deffn {Data} errno.EL2NSYNC

Level 2 not synchronized
@end deffn

@geindex EL3HLT (in module errno)
@anchor{library/errno errno EL3HLT}@anchor{32db}
@deffn {Data} errno.EL3HLT

Level 3 halted
@end deffn

@geindex EL3RST (in module errno)
@anchor{library/errno errno EL3RST}@anchor{32dc}
@deffn {Data} errno.EL3RST

Level 3 reset
@end deffn

@geindex ELNRNG (in module errno)
@anchor{library/errno errno ELNRNG}@anchor{32dd}
@deffn {Data} errno.ELNRNG

Link number out of range
@end deffn

@geindex EUNATCH (in module errno)
@anchor{library/errno errno EUNATCH}@anchor{32de}
@deffn {Data} errno.EUNATCH

Protocol driver not attached
@end deffn

@geindex ENOCSI (in module errno)
@anchor{library/errno errno ENOCSI}@anchor{32df}
@deffn {Data} errno.ENOCSI

No CSI structure available
@end deffn

@geindex EL2HLT (in module errno)
@anchor{library/errno errno EL2HLT}@anchor{32e0}
@deffn {Data} errno.EL2HLT

Level 2 halted
@end deffn

@geindex EBADE (in module errno)
@anchor{library/errno errno EBADE}@anchor{32e1}
@deffn {Data} errno.EBADE

Invalid exchange
@end deffn

@geindex EBADR (in module errno)
@anchor{library/errno errno EBADR}@anchor{32e2}
@deffn {Data} errno.EBADR

Invalid request descriptor
@end deffn

@geindex EXFULL (in module errno)
@anchor{library/errno errno EXFULL}@anchor{32e3}
@deffn {Data} errno.EXFULL

Exchange full
@end deffn

@geindex ENOANO (in module errno)
@anchor{library/errno errno ENOANO}@anchor{32e4}
@deffn {Data} errno.ENOANO

No anode
@end deffn

@geindex EBADRQC (in module errno)
@anchor{library/errno errno EBADRQC}@anchor{32e5}
@deffn {Data} errno.EBADRQC

Invalid request code
@end deffn

@geindex EBADSLT (in module errno)
@anchor{library/errno errno EBADSLT}@anchor{32e6}
@deffn {Data} errno.EBADSLT

Invalid slot
@end deffn

@geindex EDEADLOCK (in module errno)
@anchor{library/errno errno EDEADLOCK}@anchor{32e7}
@deffn {Data} errno.EDEADLOCK

File locking deadlock error
@end deffn

@geindex EBFONT (in module errno)
@anchor{library/errno errno EBFONT}@anchor{32e8}
@deffn {Data} errno.EBFONT

Bad font file format
@end deffn

@geindex ENOSTR (in module errno)
@anchor{library/errno errno ENOSTR}@anchor{32e9}
@deffn {Data} errno.ENOSTR

Device not a stream
@end deffn

@geindex ENODATA (in module errno)
@anchor{library/errno errno ENODATA}@anchor{32ea}
@deffn {Data} errno.ENODATA

No data available
@end deffn

@geindex ETIME (in module errno)
@anchor{library/errno errno ETIME}@anchor{32eb}
@deffn {Data} errno.ETIME

Timer expired
@end deffn

@geindex ENOSR (in module errno)
@anchor{library/errno errno ENOSR}@anchor{32ec}
@deffn {Data} errno.ENOSR

Out of streams resources
@end deffn

@geindex ENONET (in module errno)
@anchor{library/errno errno ENONET}@anchor{32ed}
@deffn {Data} errno.ENONET

Machine is not on the network
@end deffn

@geindex ENOPKG (in module errno)
@anchor{library/errno errno ENOPKG}@anchor{32ee}
@deffn {Data} errno.ENOPKG

Package not installed
@end deffn

@geindex EREMOTE (in module errno)
@anchor{library/errno errno EREMOTE}@anchor{32ef}
@deffn {Data} errno.EREMOTE

Object is remote
@end deffn

@geindex ENOLINK (in module errno)
@anchor{library/errno errno ENOLINK}@anchor{32f0}
@deffn {Data} errno.ENOLINK

Link has been severed
@end deffn

@geindex EADV (in module errno)
@anchor{library/errno errno EADV}@anchor{32f1}
@deffn {Data} errno.EADV

Advertise error
@end deffn

@geindex ESRMNT (in module errno)
@anchor{library/errno errno ESRMNT}@anchor{32f2}
@deffn {Data} errno.ESRMNT

Srmount error
@end deffn

@geindex ECOMM (in module errno)
@anchor{library/errno errno ECOMM}@anchor{32f3}
@deffn {Data} errno.ECOMM

Communication error on send
@end deffn

@geindex EPROTO (in module errno)
@anchor{library/errno errno EPROTO}@anchor{32f4}
@deffn {Data} errno.EPROTO

Protocol error
@end deffn

@geindex EMULTIHOP (in module errno)
@anchor{library/errno errno EMULTIHOP}@anchor{32f5}
@deffn {Data} errno.EMULTIHOP

Multihop attempted
@end deffn

@geindex EDOTDOT (in module errno)
@anchor{library/errno errno EDOTDOT}@anchor{32f6}
@deffn {Data} errno.EDOTDOT

RFS specific error
@end deffn

@geindex EBADMSG (in module errno)
@anchor{library/errno errno EBADMSG}@anchor{32f7}
@deffn {Data} errno.EBADMSG

Not a data message
@end deffn

@geindex EOVERFLOW (in module errno)
@anchor{library/errno errno EOVERFLOW}@anchor{32f8}
@deffn {Data} errno.EOVERFLOW

Value too large for defined data type
@end deffn

@geindex ENOTUNIQ (in module errno)
@anchor{library/errno errno ENOTUNIQ}@anchor{32f9}
@deffn {Data} errno.ENOTUNIQ

Name not unique on network
@end deffn

@geindex EBADFD (in module errno)
@anchor{library/errno errno EBADFD}@anchor{32fa}
@deffn {Data} errno.EBADFD

File descriptor in bad state
@end deffn

@geindex EREMCHG (in module errno)
@anchor{library/errno errno EREMCHG}@anchor{32fb}
@deffn {Data} errno.EREMCHG

Remote address changed
@end deffn

@geindex ELIBACC (in module errno)
@anchor{library/errno errno ELIBACC}@anchor{32fc}
@deffn {Data} errno.ELIBACC

Can not access a needed shared library
@end deffn

@geindex ELIBBAD (in module errno)
@anchor{library/errno errno ELIBBAD}@anchor{32fd}
@deffn {Data} errno.ELIBBAD

Accessing a corrupted shared library
@end deffn

@geindex ELIBSCN (in module errno)
@anchor{library/errno errno ELIBSCN}@anchor{32fe}
@deffn {Data} errno.ELIBSCN

.lib section in a.out corrupted
@end deffn

@geindex ELIBMAX (in module errno)
@anchor{library/errno errno ELIBMAX}@anchor{32ff}
@deffn {Data} errno.ELIBMAX

Attempting to link in too many shared libraries
@end deffn

@geindex ELIBEXEC (in module errno)
@anchor{library/errno errno ELIBEXEC}@anchor{3300}
@deffn {Data} errno.ELIBEXEC

Cannot exec a shared library directly
@end deffn

@geindex EILSEQ (in module errno)
@anchor{library/errno errno EILSEQ}@anchor{3301}
@deffn {Data} errno.EILSEQ

Illegal byte sequence
@end deffn

@geindex ERESTART (in module errno)
@anchor{library/errno errno ERESTART}@anchor{3302}
@deffn {Data} errno.ERESTART

Interrupted system call should be restarted
@end deffn

@geindex ESTRPIPE (in module errno)
@anchor{library/errno errno ESTRPIPE}@anchor{3303}
@deffn {Data} errno.ESTRPIPE

Streams pipe error
@end deffn

@geindex EUSERS (in module errno)
@anchor{library/errno errno EUSERS}@anchor{3304}
@deffn {Data} errno.EUSERS

Too many users
@end deffn

@geindex ENOTSOCK (in module errno)
@anchor{library/errno errno ENOTSOCK}@anchor{3305}
@deffn {Data} errno.ENOTSOCK

Socket operation on non-socket
@end deffn

@geindex EDESTADDRREQ (in module errno)
@anchor{library/errno errno EDESTADDRREQ}@anchor{3306}
@deffn {Data} errno.EDESTADDRREQ

Destination address required
@end deffn

@geindex EMSGSIZE (in module errno)
@anchor{library/errno errno EMSGSIZE}@anchor{3307}
@deffn {Data} errno.EMSGSIZE

Message too long
@end deffn

@geindex EPROTOTYPE (in module errno)
@anchor{library/errno errno EPROTOTYPE}@anchor{3308}
@deffn {Data} errno.EPROTOTYPE

Protocol wrong type for socket
@end deffn

@geindex ENOPROTOOPT (in module errno)
@anchor{library/errno errno ENOPROTOOPT}@anchor{3309}
@deffn {Data} errno.ENOPROTOOPT

Protocol not available
@end deffn

@geindex EPROTONOSUPPORT (in module errno)
@anchor{library/errno errno EPROTONOSUPPORT}@anchor{330a}
@deffn {Data} errno.EPROTONOSUPPORT

Protocol not supported
@end deffn

@geindex ESOCKTNOSUPPORT (in module errno)
@anchor{library/errno errno ESOCKTNOSUPPORT}@anchor{330b}
@deffn {Data} errno.ESOCKTNOSUPPORT

Socket type not supported
@end deffn

@geindex EOPNOTSUPP (in module errno)
@anchor{library/errno errno EOPNOTSUPP}@anchor{330c}
@deffn {Data} errno.EOPNOTSUPP

Operation not supported on transport endpoint
@end deffn

@geindex ENOTSUP (in module errno)
@anchor{library/errno errno ENOTSUP}@anchor{330d}
@deffn {Data} errno.ENOTSUP

Operation not supported


Added in version 3.2.

@end deffn

@geindex EPFNOSUPPORT (in module errno)
@anchor{library/errno errno EPFNOSUPPORT}@anchor{330e}
@deffn {Data} errno.EPFNOSUPPORT

Protocol family not supported
@end deffn

@geindex EAFNOSUPPORT (in module errno)
@anchor{library/errno errno EAFNOSUPPORT}@anchor{330f}
@deffn {Data} errno.EAFNOSUPPORT

Address family not supported by protocol
@end deffn

@geindex EADDRINUSE (in module errno)
@anchor{library/errno errno EADDRINUSE}@anchor{3310}
@deffn {Data} errno.EADDRINUSE

Address already in use
@end deffn

@geindex EADDRNOTAVAIL (in module errno)
@anchor{library/errno errno EADDRNOTAVAIL}@anchor{3311}
@deffn {Data} errno.EADDRNOTAVAIL

Cannot assign requested address
@end deffn

@geindex ENETDOWN (in module errno)
@anchor{library/errno errno ENETDOWN}@anchor{3312}
@deffn {Data} errno.ENETDOWN

Network is down
@end deffn

@geindex ENETUNREACH (in module errno)
@anchor{library/errno errno ENETUNREACH}@anchor{1e2c}
@deffn {Data} errno.ENETUNREACH

Network is unreachable
@end deffn

@geindex ENETRESET (in module errno)
@anchor{library/errno errno ENETRESET}@anchor{3313}
@deffn {Data} errno.ENETRESET

Network dropped connection because of reset
@end deffn

@geindex ECONNABORTED (in module errno)
@anchor{library/errno errno ECONNABORTED}@anchor{274e}
@deffn {Data} errno.ECONNABORTED

Software caused connection abort. This error is mapped to the
exception @ref{1263,,ConnectionAbortedError}.
@end deffn

@geindex ECONNRESET (in module errno)
@anchor{library/errno errno ECONNRESET}@anchor{2750}
@deffn {Data} errno.ECONNRESET

Connection reset by peer. This error is mapped to the exception
@ref{1265,,ConnectionResetError}.
@end deffn

@geindex ENOBUFS (in module errno)
@anchor{library/errno errno ENOBUFS}@anchor{1bb5}
@deffn {Data} errno.ENOBUFS

No buffer space available
@end deffn

@geindex EISCONN (in module errno)
@anchor{library/errno errno EISCONN}@anchor{3314}
@deffn {Data} errno.EISCONN

Transport endpoint is already connected
@end deffn

@geindex ENOTCONN (in module errno)
@anchor{library/errno errno ENOTCONN}@anchor{3315}
@deffn {Data} errno.ENOTCONN

Transport endpoint is not connected
@end deffn

@geindex ESHUTDOWN (in module errno)
@anchor{library/errno errno ESHUTDOWN}@anchor{274d}
@deffn {Data} errno.ESHUTDOWN

Cannot send after transport endpoint shutdown. This error is mapped
to the exception @ref{1262,,BrokenPipeError}.
@end deffn

@geindex ETOOMANYREFS (in module errno)
@anchor{library/errno errno ETOOMANYREFS}@anchor{3316}
@deffn {Data} errno.ETOOMANYREFS

Too many references: cannot splice
@end deffn

@geindex ETIMEDOUT (in module errno)
@anchor{library/errno errno ETIMEDOUT}@anchor{2757}
@deffn {Data} errno.ETIMEDOUT

Connection timed out. This error is mapped to the exception
@ref{a3c,,TimeoutError}.
@end deffn

@geindex ECONNREFUSED (in module errno)
@anchor{library/errno errno ECONNREFUSED}@anchor{274f}
@deffn {Data} errno.ECONNREFUSED

Connection refused. This error is mapped to the exception
@ref{1264,,ConnectionRefusedError}.
@end deffn

@geindex EHOSTDOWN (in module errno)
@anchor{library/errno errno EHOSTDOWN}@anchor{3317}
@deffn {Data} errno.EHOSTDOWN

Host is down
@end deffn

@geindex EHOSTUNREACH (in module errno)
@anchor{library/errno errno EHOSTUNREACH}@anchor{3318}
@deffn {Data} errno.EHOSTUNREACH

No route to host
@end deffn

@geindex EHWPOISON (in module errno)
@anchor{library/errno errno EHWPOISON}@anchor{20d}
@deffn {Data} errno.EHWPOISON

Memory page has hardware error.


Added in version 3.14.

@end deffn

@geindex EALREADY (in module errno)
@anchor{library/errno errno EALREADY}@anchor{2747}
@deffn {Data} errno.EALREADY

Operation already in progress. This error is mapped to the
exception @ref{237,,BlockingIOError}.
@end deffn

@geindex EINPROGRESS (in module errno)
@anchor{library/errno errno EINPROGRESS}@anchor{2749}
@deffn {Data} errno.EINPROGRESS

Operation now in progress. This error is mapped to the exception
@ref{237,,BlockingIOError}.
@end deffn

@geindex ESTALE (in module errno)
@anchor{library/errno errno ESTALE}@anchor{3319}
@deffn {Data} errno.ESTALE

Stale NFS file handle
@end deffn

@geindex EUCLEAN (in module errno)
@anchor{library/errno errno EUCLEAN}@anchor{331a}
@deffn {Data} errno.EUCLEAN

Structure needs cleaning
@end deffn

@geindex ENOTNAM (in module errno)
@anchor{library/errno errno ENOTNAM}@anchor{331b}
@deffn {Data} errno.ENOTNAM

Not a XENIX named type file
@end deffn

@geindex ENAVAIL (in module errno)
@anchor{library/errno errno ENAVAIL}@anchor{331c}
@deffn {Data} errno.ENAVAIL

No XENIX semaphores available
@end deffn

@geindex EISNAM (in module errno)
@anchor{library/errno errno EISNAM}@anchor{331d}
@deffn {Data} errno.EISNAM

Is a named type file
@end deffn

@geindex EREMOTEIO (in module errno)
@anchor{library/errno errno EREMOTEIO}@anchor{331e}
@deffn {Data} errno.EREMOTEIO

Remote I/O error
@end deffn

@geindex EDQUOT (in module errno)
@anchor{library/errno errno EDQUOT}@anchor{331f}
@deffn {Data} errno.EDQUOT

Quota exceeded
@end deffn

@geindex EQFULL (in module errno)
@anchor{library/errno errno EQFULL}@anchor{3320}
@deffn {Data} errno.EQFULL

Interface output queue is full


Added in version 3.11.

@end deffn

@geindex ENOMEDIUM (in module errno)
@anchor{library/errno errno ENOMEDIUM}@anchor{3321}
@deffn {Data} errno.ENOMEDIUM

No medium found
@end deffn

@geindex EMEDIUMTYPE (in module errno)
@anchor{library/errno errno EMEDIUMTYPE}@anchor{3322}
@deffn {Data} errno.EMEDIUMTYPE

Wrong medium type
@end deffn

@geindex ENOKEY (in module errno)
@anchor{library/errno errno ENOKEY}@anchor{3323}
@deffn {Data} errno.ENOKEY

Required key not available
@end deffn

@geindex EKEYEXPIRED (in module errno)
@anchor{library/errno errno EKEYEXPIRED}@anchor{3324}
@deffn {Data} errno.EKEYEXPIRED

Key has expired
@end deffn

@geindex EKEYREVOKED (in module errno)
@anchor{library/errno errno EKEYREVOKED}@anchor{3325}
@deffn {Data} errno.EKEYREVOKED

Key has been revoked
@end deffn

@geindex EKEYREJECTED (in module errno)
@anchor{library/errno errno EKEYREJECTED}@anchor{3326}
@deffn {Data} errno.EKEYREJECTED

Key was rejected by service
@end deffn

@geindex ERFKILL (in module errno)
@anchor{library/errno errno ERFKILL}@anchor{3327}
@deffn {Data} errno.ERFKILL

Operation not possible due to RF-kill
@end deffn

@geindex ELOCKUNMAPPED (in module errno)
@anchor{library/errno errno ELOCKUNMAPPED}@anchor{3328}
@deffn {Data} errno.ELOCKUNMAPPED

Locked lock was unmapped
@end deffn

@geindex ENOTACTIVE (in module errno)
@anchor{library/errno errno ENOTACTIVE}@anchor{3329}
@deffn {Data} errno.ENOTACTIVE

Facility is not active
@end deffn

@geindex EAUTH (in module errno)
@anchor{library/errno errno EAUTH}@anchor{332a}
@deffn {Data} errno.EAUTH

Authentication error


Added in version 3.2.

@end deffn

@geindex EBADARCH (in module errno)
@anchor{library/errno errno EBADARCH}@anchor{332b}
@deffn {Data} errno.EBADARCH

Bad CPU type in executable


Added in version 3.2.

@end deffn

@geindex EBADEXEC (in module errno)
@anchor{library/errno errno EBADEXEC}@anchor{332c}
@deffn {Data} errno.EBADEXEC

Bad executable (or shared library)


Added in version 3.2.

@end deffn

@geindex EBADMACHO (in module errno)
@anchor{library/errno errno EBADMACHO}@anchor{332d}
@deffn {Data} errno.EBADMACHO

Malformed Mach-o file


Added in version 3.2.

@end deffn

@geindex EDEVERR (in module errno)
@anchor{library/errno errno EDEVERR}@anchor{332e}
@deffn {Data} errno.EDEVERR

Device error


Added in version 3.2.

@end deffn

@geindex EFTYPE (in module errno)
@anchor{library/errno errno EFTYPE}@anchor{332f}
@deffn {Data} errno.EFTYPE

Inappropriate file type or format


Added in version 3.2.

@end deffn

@geindex ENEEDAUTH (in module errno)
@anchor{library/errno errno ENEEDAUTH}@anchor{3330}
@deffn {Data} errno.ENEEDAUTH

Need authenticator


Added in version 3.2.

@end deffn

@geindex ENOATTR (in module errno)
@anchor{library/errno errno ENOATTR}@anchor{3331}
@deffn {Data} errno.ENOATTR

Attribute not found


Added in version 3.2.

@end deffn

@geindex ENOPOLICY (in module errno)
@anchor{library/errno errno ENOPOLICY}@anchor{3332}
@deffn {Data} errno.ENOPOLICY

Policy not found


Added in version 3.2.

@end deffn

@geindex EPROCLIM (in module errno)
@anchor{library/errno errno EPROCLIM}@anchor{3333}
@deffn {Data} errno.EPROCLIM

Too many processes


Added in version 3.2.

@end deffn

@geindex EPROCUNAVAIL (in module errno)
@anchor{library/errno errno EPROCUNAVAIL}@anchor{3334}
@deffn {Data} errno.EPROCUNAVAIL

Bad procedure for program


Added in version 3.2.

@end deffn

@geindex EPROGMISMATCH (in module errno)
@anchor{library/errno errno EPROGMISMATCH}@anchor{3335}
@deffn {Data} errno.EPROGMISMATCH

Program version wrong


Added in version 3.2.

@end deffn

@geindex EPROGUNAVAIL (in module errno)
@anchor{library/errno errno EPROGUNAVAIL}@anchor{3336}
@deffn {Data} errno.EPROGUNAVAIL

RPC prog. not avail


Added in version 3.2.

@end deffn

@geindex EPWROFF (in module errno)
@anchor{library/errno errno EPWROFF}@anchor{3337}
@deffn {Data} errno.EPWROFF

Device power is off


Added in version 3.2.

@end deffn

@geindex EBADRPC (in module errno)
@anchor{library/errno errno EBADRPC}@anchor{3338}
@deffn {Data} errno.EBADRPC

RPC struct is bad


Added in version 3.2.

@end deffn

@geindex ERPCMISMATCH (in module errno)
@anchor{library/errno errno ERPCMISMATCH}@anchor{3339}
@deffn {Data} errno.ERPCMISMATCH

RPC version wrong


Added in version 3.2.

@end deffn

@geindex ESHLIBVERS (in module errno)
@anchor{library/errno errno ESHLIBVERS}@anchor{333a}
@deffn {Data} errno.ESHLIBVERS

Shared library version mismatch


Added in version 3.2.

@end deffn

@geindex ENOTCAPABLE (in module errno)
@anchor{library/errno errno ENOTCAPABLE}@anchor{1b83}
@deffn {Data} errno.ENOTCAPABLE

Capabilities insufficient. This error is mapped to the exception
@ref{f44,,PermissionError}.

@ref{2181,,Availability}: WASI, FreeBSD


Added in version 3.11.1.

@end deffn

@geindex ECANCELED (in module errno)
@anchor{library/errno errno ECANCELED}@anchor{1811}
@deffn {Data} errno.ECANCELED

Operation canceled


Added in version 3.2.

@end deffn

@geindex EOWNERDEAD (in module errno)
@anchor{library/errno errno EOWNERDEAD}@anchor{333b}
@deffn {Data} errno.EOWNERDEAD

Owner died


Added in version 3.2.

@end deffn

@geindex ENOTRECOVERABLE (in module errno)
@anchor{library/errno errno ENOTRECOVERABLE}@anchor{333c}
@deffn {Data} errno.ENOTRECOVERABLE

State not recoverable


Added in version 3.2.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node ctypes — A foreign function library for Python,,errno — Standard errno system symbols,Generic Operating System Services
@anchor{library/ctypes doc}@anchor{333d}@anchor{library/ctypes ctypes-a-foreign-function-library-for-python}@anchor{333e}@anchor{library/ctypes module-ctypes}@anchor{2e}@anchor{library/ctypes translation-repo}@anchor{333f}
@subsection @code{ctypes} — A foreign function library for Python


@geindex module; ctypes

`Source code:' Lib/ctypes@footnote{https://github.com/python/cpython/tree/3.14/Lib/ctypes}


__________________________________________________________________


@code{ctypes} is a foreign function library for Python.  It provides C compatible
data types, and allows calling functions in DLLs or shared libraries.  It can be
used to wrap these libraries in pure Python.

This is an @ref{219c,,optional module}.
If it is missing from your copy of CPython,
look for documentation from your distributor (that is,
whoever provided Python to you).
If you are the distributor, see @ref{219a,,Requirements for optional modules}.

@c Similar notes appear in the docs of the modules:
@c - zipfile
@c - tarfile

@cartouche
@quotation Warning 
@code{ctypes} provides low-level access to native libraries and the
process’s memory, bypassing Python’s safety mechanisms and allowing
execution of arbitrary native code.
Incorrect use can corrupt data and objects, reveal sensitive information,
cause crashes, or otherwise compromise the running process.
@end quotation
@end cartouche

@menu
* ctypes tutorial:: 
* ctypes reference:: 

@end menu

@node ctypes tutorial,ctypes reference,,ctypes — A foreign function library for Python
@anchor{library/ctypes ctypes-ctypes-tutorial}@anchor{3340}@anchor{library/ctypes ctypes-tutorial}@anchor{3341}
@subsubsection ctypes tutorial


Note: Some code samples reference the ctypes @ref{3342,,c_int} type.  On platforms
where @code{sizeof(long) == sizeof(int)} it is an alias to @ref{3343,,c_long}.
So, you should not be confused if @code{c_long} is printed if you would expect
@code{c_int} — they are actually the same type.

@menu
* Loading dynamic link libraries:: 
* Accessing functions from loaded dlls:: 
* Calling functions:: 
* Fundamental data types:: 
* Calling functions@comma{} continued: Calling functions continued. 
* Calling variadic functions:: 
* Calling functions with your own custom data types:: 
* Specifying the required argument types (function prototypes): Specifying the required argument types function prototypes. 
* Return types:: 
* Passing pointers (or; passing parameters by reference): Passing pointers or passing parameters by reference. 
* Structures and unions:: 
* Structure/union layout@comma{} alignment and byte order: Structure/union layout alignment and byte order. 
* Bit fields in structures and unions:: 
* Arrays:: 
* Pointers:: 
* Thread safety without the GIL:: 
* Type conversions:: 
* Incomplete Types:: 
* Callback functions:: 
* Accessing values exported from dlls:: 
* Surprises:: 
* Variable-sized data types:: 

@end menu

@node Loading dynamic link libraries,Accessing functions from loaded dlls,,ctypes tutorial
@anchor{library/ctypes ctypes-loading-dynamic-link-libraries}@anchor{3344}@anchor{library/ctypes loading-dynamic-link-libraries}@anchor{3345}
@subsubsection Loading dynamic link libraries


@code{ctypes} exports the @ref{3346,,cdll}, and on Windows
@ref{3347,,windll} and @ref{3348,,oledll}
objects, for loading dynamic link libraries.

You load libraries by accessing them as attributes of these objects.
@code{cdll} loads libraries which export functions using the
standard @code{cdecl} calling convention, while @code{windll}
libraries call functions using the @code{stdcall}
calling convention.
@ref{3348,,oledll} also uses the @code{stdcall} calling convention, and
assumes the functions return a Windows @code{HRESULT} error code. The error
code is used to automatically raise an @ref{2c2,,OSError} exception when the
function call fails.


Changed in version 3.3: Windows errors used to raise @ref{125b,,WindowsError}, which is now an alias
of @ref{2c2,,OSError}.


Here are some examples for Windows. Note that @code{msvcrt} is the MS standard C
library containing most standard C functions, and uses the @code{cdecl} calling
convention:

@example
>>> from ctypes import *
>>> print(windll.kernel32)
<WinDLL 'kernel32', handle ... at ...>
>>> print(cdll.msvcrt)
<CDLL 'msvcrt', handle ... at ...>
>>> libc = cdll.msvcrt
>>>
@end example

Windows appends the usual @code{.dll} file suffix automatically.

@cartouche
@quotation Note 
Accessing the standard C library through @code{cdll.msvcrt} will use an
outdated version of the library that may be incompatible with the one
being used by Python. Where possible, use native Python functionality,
or else import and use the @code{msvcrt} module.
@end quotation
@end cartouche

Other systems require the filename `including' the extension to
load a library, so attribute access can not be used to load libraries. Either the
@ref{3349,,LoadLibrary()} method of the dll loaders should be used,
or you should load the library by creating an instance of @ref{be2,,CDLL}
by calling the constructor.

For example, on Linux:

@example
>>> cdll.LoadLibrary("libc.so.6")
<CDLL 'libc.so.6', handle ... at ...>
>>> libc = CDLL("libc.so.6")
>>> libc
<CDLL 'libc.so.6', handle ... at ...>
>>>
@end example

On macOS:

@example
>>> cdll.LoadLibrary("libc.dylib")
<CDLL 'libc.dylib', handle ... at ...>
>>> libc = CDLL("libc.dylib")
>>> libc
<CDLL 'libc.dylib', handle ... at ...>
@end example

@node Accessing functions from loaded dlls,Calling functions,Loading dynamic link libraries,ctypes tutorial
@anchor{library/ctypes accessing-functions-from-loaded-dlls}@anchor{334a}@anchor{library/ctypes ctypes-accessing-functions-from-loaded-dlls}@anchor{334b}
@subsubsection Accessing functions from loaded dlls


Functions are accessed as attributes of dll objects:

@example
>>> libc.printf
<_FuncPtr object at 0x...>
>>> print(windll.kernel32.GetModuleHandleA)
<_FuncPtr object at 0x...>
>>> print(windll.kernel32.MyOwnFunction)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "ctypes.py", line 239, in __getattr__
    func = _StdcallFuncPtr(name, self)
AttributeError: function 'MyOwnFunction' not found
>>>
@end example

Note that win32 system dlls like @code{kernel32} and @code{user32} often export ANSI
as well as UNICODE versions of a function. The UNICODE version is exported with
a @code{W} appended to the name, while the ANSI version is exported with an @code{A}
appended to the name. The win32 @code{GetModuleHandle} function, which returns a
`module handle' for a given module name, has the following C prototype, and a
macro is used to expose one of them as @code{GetModuleHandle} depending on whether
UNICODE is defined or not:

@example
/* ANSI version */
HMODULE GetModuleHandleA(LPCSTR lpModuleName);
/* UNICODE version */
HMODULE GetModuleHandleW(LPCWSTR lpModuleName);
@end example

`windll' does not try to select one of them by magic, you must access the
version you need by specifying @code{GetModuleHandleA} or @code{GetModuleHandleW}
explicitly, and then call it with bytes or string objects respectively.

Sometimes, dlls export functions with names which aren’t valid Python
identifiers, like @code{"??2@@YAPAXI@@Z"}. In this case you have to use
@ref{dd0,,getattr()} to retrieve the function:

@example
>>> getattr(cdll.msvcrt, "??2@@YAPAXI@@Z")
<_FuncPtr object at 0x...>
>>>
@end example

On Windows, some dlls export functions not by name but by ordinal. These
functions can be accessed by indexing the dll object with the ordinal number:

@example
>>> cdll.kernel32[1]
<_FuncPtr object at 0x...>
>>> cdll.kernel32[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "ctypes.py", line 310, in __getitem__
    func = _StdcallFuncPtr(name, self)
AttributeError: function ordinal 0 not found
>>>
@end example

@node Calling functions,Fundamental data types,Accessing functions from loaded dlls,ctypes tutorial
@anchor{library/ctypes calling-functions}@anchor{334c}@anchor{library/ctypes ctypes-calling-functions}@anchor{334d}
@subsubsection Calling functions


You can call these functions like any other Python callable. This example uses
the @code{rand()} function, which takes no arguments and returns a pseudo-random integer:

@example
>>> print(libc.rand())
1804289383
@end example

On Windows, you can call the @code{GetModuleHandleA()} function, which returns a win32 module
handle (passing @code{None} as single argument to call it with a @code{NULL} pointer):

@example
>>> print(hex(windll.kernel32.GetModuleHandleA(None)))
0x1d000000
>>>
@end example

@ref{2ee,,ValueError} is raised when you call an @code{stdcall} function with the
@code{cdecl} calling convention, or vice versa:

@example
>>> cdll.kernel32.GetModuleHandleA(None)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: Procedure probably called with not enough arguments (4 bytes missing)
>>>

>>> windll.msvcrt.printf(b"spam")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: Procedure probably called with too many arguments (4 bytes in excess)
>>>
@end example

To find out the correct calling convention you have to look into the C header
file or the documentation for the function you want to call.

On Windows, @code{ctypes} uses win32 structured exception handling to prevent
crashes from general protection faults when functions are called with invalid
argument values:

@example
>>> windll.kernel32.GetModuleHandleA(32)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OSError: exception: access violation reading 0x00000020
>>>
@end example

The @ref{5c,,faulthandler} module can help debug crashes,
such as segmentation faults produced by erroneous C library calls.

@code{None}, integers, bytes objects and (unicode) strings are the only native
Python objects that can directly be used as parameters in these function calls.
@code{None} is passed as a C @code{NULL} pointer, bytes objects and strings are passed
as pointer to the memory block that contains their data (char* or
wchar_t*).  Python integers are passed as the platform’s default C
int type, their value is masked to fit into the C type.

Before we move on calling functions with other parameter types, we have to learn
more about @code{ctypes} data types.

@node Fundamental data types,Calling functions continued,Calling functions,ctypes tutorial
@anchor{library/ctypes ctypes-fundamental-data-types}@anchor{2885}@anchor{library/ctypes fundamental-data-types}@anchor{334e}
@subsubsection Fundamental data types


@code{ctypes} defines a number of primitive C compatible data types:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

ctypes type

@tab

C type

@tab

Python type

@tab

@ref{334f,,_type_}

@item

@ref{3350,,c_bool}

@tab

_Bool

@tab

@ref{3c1,,bool}

@tab

@code{'?'}

@item

@ref{3351,,c_char}

@tab

char

@tab

1-character @ref{193,,bytes}

@tab

@code{'c'}

@item

@ref{3352,,c_wchar}

@tab

@code{wchar_t}

@tab

1-character @ref{16a,,str}

@tab

@code{'u'}

@item

@ref{1b24,,c_byte}

@tab

char

@tab

@ref{19c,,int}

@tab

@code{'b'}

@item

@ref{1b25,,c_ubyte}

@tab

unsigned char

@tab

@ref{19c,,int}

@tab

@code{'B'}

@item

@ref{3353,,c_short}

@tab

short

@tab

@ref{19c,,int}

@tab

@code{'h'}

@item

@ref{3354,,c_ushort}

@tab

unsigned short

@tab

@ref{19c,,int}

@tab

@code{'H'}

@item

@ref{3342,,c_int}

@tab

int

@tab

@ref{19c,,int}

@tab

@code{'i'} *

@item

@ref{3355,,c_int8}

@tab

@code{int8_t}

@tab

@ref{19c,,int}

@tab

*

@item

@ref{3356,,c_int16}

@tab

@code{int16_t}

@tab

@ref{19c,,int}

@tab

*

@item

@ref{3357,,c_int32}

@tab

@code{int32_t}

@tab

@ref{19c,,int}

@tab

*

@item

@ref{3358,,c_int64}

@tab

@code{int64_t}

@tab

@ref{19c,,int}

@tab

*

@item

@ref{3359,,c_uint}

@tab

unsigned int

@tab

@ref{19c,,int}

@tab

@code{'I'} *

@item

@ref{335a,,c_uint8}

@tab

@code{uint8_t}

@tab

@ref{19c,,int}

@tab

*

@item

@ref{335b,,c_uint16}

@tab

@code{uint16_t}

@tab

@ref{19c,,int}

@tab

*

@item

@ref{335c,,c_uint32}

@tab

@code{uint32_t}

@tab

@ref{19c,,int}

@tab

*

@item

@ref{335d,,c_uint64}

@tab

@code{uint64_t}

@tab

@ref{19c,,int}

@tab

*

@item

@ref{3343,,c_long}

@tab

long

@tab

@ref{19c,,int}

@tab

@code{'l'}

@item

@ref{335e,,c_ulong}

@tab

unsigned long

@tab

@ref{19c,,int}

@tab

@code{'L'}

@item

@ref{335f,,c_longlong}

@tab

long long

@tab

@ref{19c,,int}

@tab

@code{'q'} *

@item

@ref{3360,,c_ulonglong}

@tab

unsigned long long

@tab

@ref{19c,,int}

@tab

@code{'Q'} *

@item

@ref{3361,,c_size_t}

@tab

@code{size_t}

@tab

@ref{19c,,int}

@tab

*

@item

@ref{1448,,c_ssize_t}

@tab

@ref{c5b,,Py_ssize_t}

@tab

@ref{19c,,int}

@tab

*

@item

@ref{1ba7,,c_time_t}

@tab

@code{time_t}

@tab

@ref{19c,,int}

@tab

*

@item

@ref{3362,,c_float}

@tab

float

@tab

@ref{197,,float}

@tab

@code{'f'}

@item

@ref{1cf9,,c_double}

@tab

double

@tab

@ref{197,,float}

@tab

@code{'d'}

@item

@ref{1cfa,,c_longdouble}

@tab

long double

@tab

@ref{197,,float}

@tab

@code{'g'} *

@item

@ref{1a9d,,c_char_p}

@tab

char* (NUL terminated)

@tab

@ref{193,,bytes} or @code{None}

@tab

@code{'z'}

@item

@ref{1a9e,,c_wchar_p}

@tab

wchar_t* (NUL terminated)

@tab

@ref{16a,,str} or @code{None}

@tab

@code{'Z'}

@item

@ref{1a9f,,c_void_p}

@tab

void*

@tab

@ref{19c,,int} or @code{None}

@tab

@code{'P'}

@item

@ref{1f5,,py_object}

@tab

@ref{5df,,PyObject}*

@tab

@ref{c84,,object}

@tab

@code{'O'}

@item

@ref{3363,,VARIANT_BOOL}

@tab

short int

@tab

@ref{3c1,,bool}

@tab

@code{'v'}

@end multitable


Additionally, if IEC 60559 compatible complex arithmetic (Annex G) is supported
in both C and @code{libffi}, the following complex types are available:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

ctypes type

@tab

C type

@tab

Python type

@tab

@ref{334f,,_type_}

@item

@ref{1ef,,c_float_complex}

@tab

float complex

@tab

@ref{198,,complex}

@tab

@code{'F'}

@item

@ref{1f0,,c_double_complex}

@tab

double complex

@tab

@ref{198,,complex}

@tab

@code{'D'}

@item

@ref{1f1,,c_longdouble_complex}

@tab

long double complex

@tab

@ref{198,,complex}

@tab

@code{'G'}

@end multitable


All these types can be created by calling them with an optional initializer of
the correct type and value:

@example
>>> c_int()
c_long(0)
>>> c_wchar_p("Hello, World")
c_wchar_p(140018365411392)
>>> c_ushort(-3)
c_ushort(65533)
>>>
@end example

The constructors for numeric types will convert input using
@ref{14e1,,__bool__()},
@ref{19f,,__index__()} (for @code{int}),
@ref{bc7,,__float__()} or @ref{7fe,,__complex__()}.
This means @ref{3350,,c_bool} accepts any object with a truth value:

@example
>>> empty_list = []
>>> c_bool(empty_list)
c_bool(False)
@end example

Since these types are mutable, their value can also be changed afterwards:

@example
>>> i = c_int(42)
>>> print(i)
c_long(42)
>>> print(i.value)
42
>>> i.value = -99
>>> print(i.value)
-99
>>>
@end example

Assigning a new value to instances of the pointer types @ref{1a9d,,c_char_p},
@ref{1a9e,,c_wchar_p}, and @ref{1a9f,,c_void_p} changes the `memory location' they
point to, `not the contents' of the memory block (of course not, because Python
string objects are immutable):

@example
>>> s = "Hello, World"
>>> c_s = c_wchar_p(s)
>>> print(c_s)
c_wchar_p(139966785747344)
>>> print(c_s.value)
Hello World
>>> c_s.value = "Hi, there"
>>> print(c_s)              # the memory location has changed
c_wchar_p(139966783348904)
>>> print(c_s.value)
Hi, there
>>> print(s)                # first object is unchanged
Hello, World
>>>
@end example

You should be careful, however, not to pass them to functions expecting pointers
to mutable memory. If you need mutable memory blocks, ctypes has a
@ref{3364,,create_string_buffer()} function which creates these in various ways.  The
current memory block contents can be accessed (or changed) with the @code{raw}
property; if you want to access it as NUL terminated string, use the @code{value}
property:

@example
>>> from ctypes import *
>>> p = create_string_buffer(3)            # create a 3 byte buffer, initialized to NUL bytes
>>> print(sizeof(p), repr(p.raw))
3 b'\x00\x00\x00'
>>> p = create_string_buffer(b"Hello")     # create a buffer containing a NUL terminated string
>>> print(sizeof(p), repr(p.raw))
6 b'Hello\x00'
>>> print(repr(p.value))
b'Hello'
>>> p = create_string_buffer(b"Hello", 10) # create a 10 byte buffer
>>> print(sizeof(p), repr(p.raw))
10 b'Hello\x00\x00\x00\x00\x00'
>>> p.value = b"Hi"
>>> print(sizeof(p), repr(p.raw))
10 b'Hi\x00lo\x00\x00\x00\x00\x00'
>>>
@end example

The @ref{3364,,create_string_buffer()} function replaces the old @code{c_buffer()}
function (which is still available as an alias).  To create a mutable memory
block containing unicode characters of the C type @code{wchar_t}, use the
@ref{1df6,,create_unicode_buffer()} function.

@node Calling functions continued,Calling variadic functions,Fundamental data types,ctypes tutorial
@anchor{library/ctypes calling-functions-continued}@anchor{3365}@anchor{library/ctypes ctypes-calling-functions-continued}@anchor{3366}
@subsubsection Calling functions, continued


Note that printf prints to the real standard output channel, `not' to
@ref{cd3,,sys.stdout}, so these examples will only work at the console prompt, not
from within `IDLE' or `PythonWin':

@example
>>> printf = libc.printf
>>> printf(b"Hello, %s\n", b"World!")
Hello, World!
14
>>> printf(b"Hello, %S\n", "World!")
Hello, World!
14
>>> printf(b"%d bottles of beer\n", 42)
42 bottles of beer
19
>>> printf(b"%f bottles of beer\n", 42.5)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ctypes.ArgumentError: argument 2: TypeError: Don't know how to convert parameter 2
>>>
@end example

As has been mentioned before, all Python types except integers, strings, and
bytes objects have to be wrapped in their corresponding @code{ctypes} type, so
that they can be converted to the required C data type:

@example
>>> printf(b"An int %d, a double %f\n", 1234, c_double(3.14))
An int 1234, a double 3.140000
31
>>>
@end example

@node Calling variadic functions,Calling functions with your own custom data types,Calling functions continued,ctypes tutorial
@anchor{library/ctypes calling-variadic-functions}@anchor{3367}@anchor{library/ctypes ctypes-calling-variadic-functions}@anchor{3368}
@subsubsection Calling variadic functions


On a lot of platforms calling variadic functions through ctypes is exactly the same
as calling functions with a fixed number of parameters. On some platforms, and in
particular ARM64 for Apple Platforms, the calling convention for variadic functions
is different than that for regular functions.

On those platforms it is required to specify the @ref{1810,,argtypes}
attribute for the regular, non-variadic, function arguments:

@example
libc.printf.argtypes = [ctypes.c_char_p]
@end example

Because specifying the attribute does not inhibit portability it is advised to always
specify @ref{1810,,argtypes} for all variadic functions.

@node Calling functions with your own custom data types,Specifying the required argument types function prototypes,Calling variadic functions,ctypes tutorial
@anchor{library/ctypes calling-functions-with-your-own-custom-data-types}@anchor{3369}@anchor{library/ctypes ctypes-calling-functions-with-own-custom-data-types}@anchor{336a}
@subsubsection Calling functions with your own custom data types


You can also customize @code{ctypes} argument conversion to allow instances of
your own classes be used as function arguments. @code{ctypes} looks for an
@code{_as_parameter_} attribute and uses this as the function argument. The
attribute must be an integer, string, bytes, a @code{ctypes} instance, or an
object with an @code{_as_parameter_} attribute:

@example
>>> class Bottles:
...     def __init__(self, number):
...         self._as_parameter_ = number
...
>>> bottles = Bottles(42)
>>> printf(b"%d bottles of beer\n", bottles)
42 bottles of beer
19
>>>
@end example

If you don’t want to store the instance’s data in the @code{_as_parameter_}
instance variable, you could define a @ref{4b4,,property} which makes the
attribute available on request.

@node Specifying the required argument types function prototypes,Return types,Calling functions with your own custom data types,ctypes tutorial
@anchor{library/ctypes ctypes-specifying-required-argument-types}@anchor{336b}@anchor{library/ctypes specifying-the-required-argument-types-function-prototypes}@anchor{336c}
@subsubsection Specifying the required argument types (function prototypes)


It is possible to specify the required argument types of functions exported from
DLLs by setting the @ref{1810,,argtypes} attribute.

@ref{1810,,argtypes} must be a sequence of C data types (the @code{printf()} function is
probably not a good example here, because it takes a variable number and
different types of parameters depending on the format string, on the other hand
this is quite handy to experiment with this feature):

@example
>>> printf.argtypes = [c_char_p, c_char_p, c_int, c_double]
>>> printf(b"String '%s', Int %d, Double %f\n", b"Hi", 10, 2.2)
String 'Hi', Int 10, Double 2.200000
37
>>>
@end example

Specifying a format protects against incompatible argument types (just as a
prototype for a C function), and tries to convert the arguments to valid types:

@example
>>> printf(b"%d %d %d", 1, 2, 3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ctypes.ArgumentError: argument 2: TypeError: 'int' object cannot be interpreted as ctypes.c_char_p
>>> printf(b"%s %d %f\n", b"X", 2, 3)
X 2 3.000000
13
>>>
@end example

If you have defined your own classes which you pass to function calls, you have
to implement a @ref{336d,,from_param()} class method for them to be able to use them
in the @ref{1810,,argtypes} sequence. The @code{from_param()} class method receives
the Python object passed to the function call, it should do a typecheck or
whatever is needed to make sure this object is acceptable, and then return the
object itself, its @code{_as_parameter_} attribute, or whatever you want to
pass as the C function argument in this case. Again, the result should be an
integer, string, bytes, a @code{ctypes} instance, or an object with an
@code{_as_parameter_} attribute.

@node Return types,Passing pointers or passing parameters by reference,Specifying the required argument types function prototypes,ctypes tutorial
@anchor{library/ctypes ctypes-return-types}@anchor{336e}@anchor{library/ctypes return-types}@anchor{336f}
@subsubsection Return types


@c from ctypes import CDLL, c_char, c_char_p
@c from ctypes.util import find_library
@c libc = CDLL(find_library('c'))
@c strchr = libc.strchr

By default functions are assumed to return the C int type.  Other
return types can be specified by setting the @ref{3370,,restype} attribute of the
function object.

The C prototype of @code{time()} is @code{time_t time(time_t *)}. Because @code{time_t}
might be of a different type than the default return type int, you should
specify the @code{restype} attribute:

@example
>>> libc.time.restype = c_time_t
@end example

The argument types can be specified using @ref{1810,,argtypes}:

@example
>>> libc.time.argtypes = (POINTER(c_time_t),)
@end example

To call the function with a @code{NULL} pointer as first argument, use @code{None}:

@example
>>> print(libc.time(None))
1150640792
@end example

Here is a more advanced example, it uses the @code{strchr()} function, which expects
a string pointer and a char, and returns a pointer to a string:

@example
>>> strchr = libc.strchr
>>> strchr(b"abcdef", ord("d"))
8059983
>>> strchr.restype = c_char_p    # c_char_p is a pointer to a string
>>> strchr(b"abcdef", ord("d"))
b'def'
>>> print(strchr(b"abcdef", ord("x")))
None
>>>
@end example

If you want to avoid the @ref{237f,,ord("x")} calls above, you can set the
@ref{1810,,argtypes} attribute, and the second argument will be converted from a
single character Python bytes object into a C char:

@example
>>> strchr.restype = c_char_p
>>> strchr.argtypes = [c_char_p, c_char]
>>> strchr(b"abcdef", b"d")
b'def'
>>> strchr(b"abcdef", b"def")
Traceback (most recent call last):
ctypes.ArgumentError: argument 2: TypeError: one character bytes, bytearray or integer expected
>>> print(strchr(b"abcdef", b"x"))
None
>>> strchr(b"abcdef", b"d")
b'def'
>>>
@end example

You can also use a callable Python object (a function or a class for example) as
the @ref{3370,,restype} attribute, if the foreign function returns an integer.  The
callable will be called with the `integer' the C function returns, and the
result of this call will be used as the result of your function call. This is
useful to check for error return values and automatically raise an exception:

@example
>>> GetModuleHandle = windll.kernel32.GetModuleHandleA
>>> def ValidHandle(value):
...     if value == 0:
...         raise WinError()
...     return value
...
>>>
>>> GetModuleHandle.restype = ValidHandle
>>> GetModuleHandle(None)
486539264
>>> GetModuleHandle("something silly")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in ValidHandle
OSError: [Errno 126] The specified module could not be found.
>>>
@end example

@code{WinError} is a function which will call Windows @code{FormatMessage()} api to
get the string representation of an error code, and `returns' an exception.
@code{WinError} takes an optional error code parameter, if no one is used, it calls
@ref{3371,,GetLastError()} to retrieve it.

Please note that a much more powerful error checking mechanism is available
through the @ref{3372,,errcheck} attribute;
see the reference manual for details.

@node Passing pointers or passing parameters by reference,Structures and unions,Return types,ctypes tutorial
@anchor{library/ctypes ctypes-passing-pointers}@anchor{3373}@anchor{library/ctypes passing-pointers-or-passing-parameters-by-reference}@anchor{3374}
@subsubsection Passing pointers (or: passing parameters by reference)


Sometimes a C api function expects a `pointer' to a data type as parameter,
probably to write into the corresponding location, or if the data is too large
to be passed by value. This is also known as `passing parameters by reference'.

@code{ctypes} exports the @ref{3375,,byref()} function which is used to pass parameters
by reference.  The same effect can be achieved with the @ref{1a9c,,pointer()} function,
although @code{pointer()} does a lot more work since it constructs a real pointer
object, so it is faster to use @code{byref()} if you don’t need the pointer
object in Python itself:

@example
>>> i = c_int()
>>> f = c_float()
>>> s = create_string_buffer(b'\000' * 32)
>>> print(i.value, f.value, repr(s.value))
0 0.0 b'@w{'}
>>> libc.sscanf(b"1 3.14 Hello", b"%d %f %s",
...             byref(i), byref(f), s)
3
>>> print(i.value, f.value, repr(s.value))
1 3.1400001049 b'Hello'
>>>
@end example

@node Structures and unions,Structure/union layout alignment and byte order,Passing pointers or passing parameters by reference,ctypes tutorial
@anchor{library/ctypes ctypes-structures-unions}@anchor{3376}@anchor{library/ctypes structures-and-unions}@anchor{3377}
@subsubsection Structures and unions


Structures and unions must derive from the @ref{1e7,,Structure} and @ref{1e8,,Union}
base classes which are defined in the @code{ctypes} module. Each subclass must
define a @ref{197a,,_fields_} attribute.  @code{_fields_} must be a list of
`2-tuples', containing a `field name' and a `field type'.

The field type must be a @code{ctypes} type like @ref{3342,,c_int}, or any other
derived @code{ctypes} type: structure, union, array, pointer.

Here is a simple example of a POINT structure, which contains two integers named
`x' and `y', and also shows how to initialize a structure in the constructor:

@example
>>> from ctypes import *
>>> class POINT(Structure):
...     _fields_ = [("x", c_int),
...                 ("y", c_int)]
...
>>> point = POINT(10, 20)
>>> print(point.x, point.y)
10 20
>>> point = POINT(y=5)
>>> print(point.x, point.y)
0 5
>>> POINT(1, 2, 3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: too many initializers
>>>
@end example

You can, however, build much more complicated structures.  A structure can
itself contain other structures by using a structure as a field type.

Here is a RECT structure which contains two POINTs named `upperleft' and
`lowerright':

@example
>>> class RECT(Structure):
...     _fields_ = [("upperleft", POINT),
...                 ("lowerright", POINT)]
...
>>> rc = RECT(point)
>>> print(rc.upperleft.x, rc.upperleft.y)
0 5
>>> print(rc.lowerright.x, rc.lowerright.y)
0 0
>>>
@end example

Nested structures can also be initialized in the constructor in several ways:

@example
>>> r = RECT(POINT(1, 2), POINT(3, 4))
>>> r = RECT((1, 2), (3, 4))
@end example

Field @ref{18c9,,descriptor}s can be retrieved from the `class', they are useful
for debugging because they can provide useful information.
See @ref{1ea,,CField}:

@example
>>> POINT.x
<ctypes.CField 'x' type=c_int, ofs=0, size=4>
>>> POINT.y
<ctypes.CField 'y' type=c_int, ofs=4, size=4>
>>>
@end example
@anchor{library/ctypes ctypes-structureunion-alignment-byte-order}@anchor{3378}
@cartouche
@quotation Warning 
@code{ctypes} does not support passing unions or structures with bit-fields
to functions by value.  While this may work on 32-bit x86, it’s not
guaranteed by the library to work in the general case.  Unions and
structures with bit-fields should always be passed to functions by pointer.
@end quotation
@end cartouche

@node Structure/union layout alignment and byte order,Bit fields in structures and unions,Structures and unions,ctypes tutorial
@anchor{library/ctypes structure-union-layout-alignment-and-byte-order}@anchor{3379}
@subsubsection Structure/union layout, alignment and byte order


By default, Structure and Union fields are laid out in the same way the C
compiler does it.  It is possible to override this behavior entirely by specifying a
@ref{1e9,,_layout_} class attribute in the subclass definition; see
the attribute documentation for details.

It is possible to specify the maximum alignment for the fields and/or for the
structure itself by setting the class attributes @ref{319,,_pack_}
and/or @ref{4e9,,_align_}, respectively.
See the attribute documentation for details.

@code{ctypes} uses the native byte order for Structures and Unions.  To build
structures with non-native byte order, you can use one of the
@ref{337a,,BigEndianStructure}, @ref{337b,,LittleEndianStructure},
@ref{1bfa,,BigEndianUnion}, and @ref{1bfb,,LittleEndianUnion} base classes.  These
classes cannot contain pointer fields.

@node Bit fields in structures and unions,Arrays,Structure/union layout alignment and byte order,ctypes tutorial
@anchor{library/ctypes bit-fields-in-structures-and-unions}@anchor{337c}@anchor{library/ctypes ctypes-bit-fields-in-structures-unions}@anchor{1e6}
@subsubsection Bit fields in structures and unions


It is possible to create structures and unions containing bit fields. Bit fields
are only possible for integer fields, the bit width is specified as the third
item in the @ref{197a,,_fields_} tuples:

@example
>>> class Int(Structure):
...     _fields_ = [("first_16", c_int, 16),
...                 ("second_16", c_int, 16)]
...
>>> print(Int.first_16)
<ctypes.CField 'first_16' type=c_int, ofs=0, bit_size=16, bit_offset=0>
>>> print(Int.second_16)
<ctypes.CField 'second_16' type=c_int, ofs=0, bit_size=16, bit_offset=16>
@end example

It is important to note that bit field allocation and layout in memory are not
defined as a C standard; their implementation is compiler-specific.
By default, Python will attempt to match the behavior of a “native” compiler
for the current platform.
See the @ref{1e9,,_layout_} attribute for details on the default
behavior and how to change it.

@node Arrays,Pointers,Bit fields in structures and unions,ctypes tutorial
@anchor{library/ctypes arrays}@anchor{337d}@anchor{library/ctypes ctypes-arrays}@anchor{337e}
@subsubsection Arrays


Arrays are sequences, containing a fixed number of instances of the same type.

The recommended way to create array types is by multiplying a data type with a
positive integer:

@example
TenPointsArrayType = POINT * 10
@end example

Here is an example of a somewhat artificial data type, a structure containing 4
POINTs among other stuff:

@example
>>> from ctypes import *
>>> class POINT(Structure):
...     _fields_ = ("x", c_int), ("y", c_int)
...
>>> class MyStruct(Structure):
...     _fields_ = [("a", c_int),
...                 ("b", c_float),
...                 ("point_array", POINT * 4)]
>>>
>>> print(len(MyStruct().point_array))
4
>>>
@end example

Instances are created in the usual way, by calling the class:

@example
arr = TenPointsArrayType()
for pt in arr:
    print(pt.x, pt.y)
@end example

The above code print a series of @code{0 0} lines, because the array contents is
initialized to zeros.

Initializers of the correct type can also be specified:

@example
>>> from ctypes import *
>>> TenIntegers = c_int * 10
>>> ii = TenIntegers(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
>>> print(ii)
<c_long_Array_10 object at 0x...>
>>> for i in ii: print(i, end=" ")
...
1 2 3 4 5 6 7 8 9 10
>>>
@end example

@node Pointers,Thread safety without the GIL,Arrays,ctypes tutorial
@anchor{library/ctypes ctypes-pointers}@anchor{337f}@anchor{library/ctypes pointers}@anchor{3380}
@subsubsection Pointers


Pointer instances are created by calling the @ref{1a9c,,pointer()} function on a
@code{ctypes} type:

@example
>>> from ctypes import *
>>> i = c_int(42)
>>> pi = pointer(i)
>>>
@end example

Pointer instances have a @ref{3381,,contents} attribute which
returns the object to which the pointer points, the @code{i} object above:

@example
>>> pi.contents
c_long(42)
>>>
@end example

Note that @code{ctypes} does not have OOR (original object return), it constructs a
new, equivalent object each time you retrieve an attribute:

@example
>>> pi.contents is i
False
>>> pi.contents is pi.contents
False
>>>
@end example

Assigning another @ref{3342,,c_int} instance to the pointer’s contents attribute
would cause the pointer to point to the memory location where this is stored:

@example
>>> i = c_int(99)
>>> pi.contents = i
>>> pi.contents
c_long(99)
>>>
@end example

@c XXX Document dereferencing pointers, and that it is preferred over the
@c .contents attribute.

Pointer instances can also be indexed with integers:

@example
>>> pi[0]
99
>>>
@end example

Assigning to an integer index changes the pointed to value:

@example
>>> print(i)
c_long(99)
>>> pi[0] = 22
>>> print(i)
c_long(22)
>>>
@end example

It is also possible to use indexes different from 0, but you must know what
you’re doing, just as in C: You can access or change arbitrary memory locations.
Generally you only use this feature if you receive a pointer from a C function,
and you `know' that the pointer actually points to an array instead of a single
item.

Behind the scenes, the @ref{1a9c,,pointer()} function does more than simply create
pointer instances, it has to create pointer `types' first. This is done with the
@ref{1f3,,POINTER()} function, which accepts any @code{ctypes} type, and returns a
new type:

@example
>>> PI = POINTER(c_int)
>>> PI
<class 'ctypes.LP_c_long'>
>>> PI(42)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: expected c_long instead of int
>>> PI(c_int(42))
<ctypes.LP_c_long object at 0x...>
>>>
@end example

Calling the pointer type without an argument creates a @code{NULL} pointer.
@code{NULL} pointers have a @code{False} boolean value:

@example
>>> null_ptr = POINTER(c_int)()
>>> print(bool(null_ptr))
False
>>>
@end example

@code{ctypes} checks for @code{NULL} when dereferencing pointers (but dereferencing
invalid non-@code{NULL} pointers would crash Python):

@example
>>> null_ptr[0]
Traceback (most recent call last):
    ....
ValueError: NULL pointer access
>>>

>>> null_ptr[0] = 1234
Traceback (most recent call last):
    ....
ValueError: NULL pointer access
>>>
@end example

@node Thread safety without the GIL,Type conversions,Pointers,ctypes tutorial
@anchor{library/ctypes ctypes-thread-safety}@anchor{3382}@anchor{library/ctypes thread-safety-without-the-gil}@anchor{3383}
@subsubsection Thread safety without the GIL


From Python 3.13 onward, the @ref{165,,GIL} can be disabled on the @ref{1791,,free-threaded build}.
In ctypes, reads and writes to a single object concurrently is safe, but not across multiple objects:

@quotation

@example
>>> number = c_int(42)
>>> pointer_a = pointer(number)
>>> pointer_b = pointer(number)
@end example
@end quotation

In the above, it’s only safe for one object to read and write to the address at once if the GIL is disabled.
So, @code{pointer_a} can be shared and written to across multiple threads, but only if @code{pointer_b}
is not also attempting to do the same. If this is an issue, consider using a @ref{1a39,,threading.Lock}
to synchronize access to memory:

@quotation

@example
>>> import threading
>>> lock = threading.Lock()
>>> # Thread 1
>>> with lock:
...    pointer_a.contents = 24
>>> # Thread 2
>>> with lock:
...    pointer_b.contents = 42
@end example
@end quotation

@node Type conversions,Incomplete Types,Thread safety without the GIL,ctypes tutorial
@anchor{library/ctypes ctypes-type-conversions}@anchor{3384}@anchor{library/ctypes type-conversions}@anchor{3385}
@subsubsection Type conversions


Usually, ctypes does strict type checking.  This means, if you have
@code{POINTER(c_int)} in the @ref{1810,,argtypes} list of a function or as the type of
a member field in a structure definition, only instances of exactly the same
type are accepted.  There are some exceptions to this rule, where ctypes accepts
other objects.  For example, you can pass compatible array instances instead of
pointer types.  So, for @code{POINTER(c_int)}, ctypes accepts an array of c_int:

@example
>>> class Bar(Structure):
...     _fields_ = [("count", c_int), ("values", POINTER(c_int))]
...
>>> bar = Bar()
>>> bar.values = (c_int * 3)(1, 2, 3)
>>> bar.count = 3
>>> for i in range(bar.count):
...     print(bar.values[i])
...
1
2
3
>>>
@end example

In addition, if a function argument is explicitly declared to be a pointer type
(such as @code{POINTER(c_int)}) in @ref{1810,,argtypes}, an object of the pointed
type (@code{c_int} in this case) can be passed to the function.  ctypes will apply
the required @ref{3375,,byref()} conversion in this case automatically.

To set a POINTER type field to @code{NULL}, you can assign @code{None}:

@example
>>> bar.values = None
>>>
@end example

@c XXX list other conversions...

Sometimes you have instances of incompatible types.  In C, you can cast one type
into another type.  @code{ctypes} provides a @ref{3386,,cast()} function which can be
used in the same way.  The @code{Bar} structure defined above accepts
@code{POINTER(c_int)} pointers or @ref{3342,,c_int} arrays for its @code{values} field,
but not instances of other types:

@example
>>> bar.values = (c_byte * 4)()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: incompatible types, c_byte_Array_4 instance instead of LP_c_long instance
>>>
@end example

For these cases, the @ref{3386,,cast()} function is handy.

The @ref{3386,,cast()} function can be used to cast a ctypes instance into a pointer
to a different ctypes data type.  @code{cast()} takes two parameters, a ctypes
object that is or can be converted to a pointer of some kind, and a ctypes
pointer type.  It returns an instance of the second argument, which references
the same memory block as the first argument:

@example
>>> a = (c_byte * 4)()
>>> cast(a, POINTER(c_int))
<ctypes.LP_c_long object at ...>
>>>
@end example

So, @ref{3386,,cast()} can be used to assign to the @code{values} field of @code{Bar} the
structure:

@example
>>> bar = Bar()
>>> bar.values = cast((c_byte * 4)(), POINTER(c_int))
>>> print(bar.values[0])
0
>>>
@end example

@node Incomplete Types,Callback functions,Type conversions,ctypes tutorial
@anchor{library/ctypes ctypes-incomplete-types}@anchor{31a}@anchor{library/ctypes incomplete-types}@anchor{3387}
@subsubsection Incomplete Types


`Incomplete Types' are structures, unions or arrays whose members are not yet
specified. In C, they are specified by forward declarations, which are defined
later:

@example
struct cell; /* forward declaration */

struct cell @{
    char *name;
    struct cell *next;
@};
@end example

The straightforward translation into ctypes code would be this, but it does not
work:

@example
>>> class cell(Structure):
...     _fields_ = [("name", c_char_p),
...                 ("next", POINTER(cell))]
...
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in cell
NameError: name 'cell' is not defined
>>>
@end example

because the new @code{class cell} is not available in the class statement itself.
In @code{ctypes}, we can define the @code{cell} class and set the
@ref{197a,,_fields_} attribute later, after the class statement:

@example
>>> from ctypes import *
>>> class cell(Structure):
...     pass
...
>>> cell._fields_ = [("name", c_char_p),
...                  ("next", POINTER(cell))]
>>>
@end example

Let’s try it. We create two instances of @code{cell}, and let them point to each
other, and finally follow the pointer chain a few times:

@example
>>> c1 = cell()
>>> c1.name = b"foo"
>>> c2 = cell()
>>> c2.name = b"bar"
>>> c1.next = pointer(c2)
>>> c2.next = pointer(c1)
>>> p = c1
>>> for i in range(8):
...     print(p.name, end=" ")
...     p = p.next[0]
...
foo bar foo bar foo bar foo bar
>>>
@end example

@node Callback functions,Accessing values exported from dlls,Incomplete Types,ctypes tutorial
@anchor{library/ctypes callback-functions}@anchor{3388}@anchor{library/ctypes ctypes-callback-functions}@anchor{3389}
@subsubsection Callback functions


@code{ctypes} allows creating C callable function pointers from Python callables.
These are sometimes called `callback functions'.

First, you must create a class for the callback function. The class knows the
calling convention, the return type, and the number and types of arguments this
function will receive.

The @ref{338a,,CFUNCTYPE()} factory function creates types for callback functions
using the @code{cdecl} calling convention. On Windows, the @ref{338b,,WINFUNCTYPE()}
factory function creates types for callback functions using the @code{stdcall}
calling convention.

Both of these factory functions are called with the result type as first
argument, and the callback functions expected argument types as the remaining
arguments.

I will present an example here which uses the standard C library’s
@code{qsort()} function, that is used to sort items with the help of a callback
function.  @code{qsort()} will be used to sort an array of integers:

@example
>>> IntArray5 = c_int * 5
>>> ia = IntArray5(5, 1, 7, 33, 99)
>>> qsort = libc.qsort
>>> qsort.restype = None
>>>
@end example

@code{qsort()} must be called with a pointer to the data to sort, the number of
items in the data array, the size of one item, and a pointer to the comparison
function, the callback. The callback will then be called with two pointers to
items, and it must return a negative integer if the first item is smaller than
the second, a zero if they are equal, and a positive integer otherwise.

So our callback function receives pointers to integers, and must return an
integer. First we create the @code{type} for the callback function:

@example
>>> CMPFUNC = CFUNCTYPE(c_int, POINTER(c_int), POINTER(c_int))
>>>
@end example

To get started, here is a simple callback that shows the values it gets
passed:

@example
>>> def py_cmp_func(a, b):
...     print("py_cmp_func", a[0], b[0])
...     return 0
...
>>> cmp_func = CMPFUNC(py_cmp_func)
>>>
@end example

The result:

@example
>>> qsort(ia, len(ia), sizeof(c_int), cmp_func)
py_cmp_func 5 1
py_cmp_func 33 99
py_cmp_func 7 33
py_cmp_func 5 7
py_cmp_func 1 7
>>>
@end example

Now we can actually compare the two items and return a useful result:

@example
>>> def py_cmp_func(a, b):
...     print("py_cmp_func", a[0], b[0])
...     return a[0] - b[0]
...
>>>
>>> qsort(ia, len(ia), sizeof(c_int), CMPFUNC(py_cmp_func))
py_cmp_func 5 1
py_cmp_func 33 99
py_cmp_func 7 33
py_cmp_func 1 7
py_cmp_func 5 7
>>>
@end example

As we can easily check, our array is sorted now:

@example
>>> for i in ia: print(i, end=" ")
...
1 5 7 33 99
>>>
@end example

The function factories can be used as decorator factories, so we may as well
write:

@example
>>> @@CFUNCTYPE(c_int, POINTER(c_int), POINTER(c_int))
... def py_cmp_func(a, b):
...     print("py_cmp_func", a[0], b[0])
...     return a[0] - b[0]
...
>>> qsort(ia, len(ia), sizeof(c_int), py_cmp_func)
py_cmp_func 5 1
py_cmp_func 33 99
py_cmp_func 7 33
py_cmp_func 1 7
py_cmp_func 5 7
>>>
@end example

@cartouche
@quotation Note 
Make sure you keep references to @ref{338a,,CFUNCTYPE()} objects as long as they
are used from C code. @code{ctypes} doesn’t, and if you don’t, they may be
garbage collected, crashing your program when a callback is made.

Also, note that if the callback function is called in a thread created
outside of Python’s control (e.g. by the foreign code that calls the
callback), ctypes creates a new dummy Python thread on every invocation. This
behavior is correct for most purposes, but it means that values stored with
@ref{18a8,,threading.local} will `not' survive across different callbacks, even when
those calls are made from the same C thread.
@end quotation
@end cartouche

@node Accessing values exported from dlls,Surprises,Callback functions,ctypes tutorial
@anchor{library/ctypes accessing-values-exported-from-dlls}@anchor{338c}@anchor{library/ctypes ctypes-accessing-values-exported-from-dlls}@anchor{338d}
@subsubsection Accessing values exported from dlls


Some shared libraries not only export functions, they also export variables. An
example in the Python library itself is the @ref{37f,,Py_Version}, Python
runtime version number encoded in a single constant integer.

@code{ctypes} can access values like this with the @ref{338e,,in_dll()} class methods of
the type.  `pythonapi' is a predefined symbol giving access to the Python C
api:

@example
>>> version = ctypes.c_int.in_dll(ctypes.pythonapi, "Py_Version")
>>> print(hex(version.value))
0x30c00a0
@end example

An extended example which also demonstrates the use of pointers accesses the
@ref{338f,,PyImport_FrozenModules} pointer exported by Python.

Quoting the docs for that value:

@quotation

This pointer is initialized to point to an array of @ref{97e,,_frozen}
records, terminated by one whose members are all @code{NULL} or zero.  When a frozen
module is imported, it is searched in this table.  Third-party code could play
tricks with this to provide a dynamically created collection of frozen modules.
@end quotation

So manipulating this pointer could even prove useful. To restrict the example
size, we show only how this table can be read with @code{ctypes}:

@example
>>> from ctypes import *
>>>
>>> class struct_frozen(Structure):
...     _fields_ = [("name", c_char_p),
...                 ("code", POINTER(c_ubyte)),
...                 ("size", c_int),
...                 ("get_code", POINTER(c_ubyte)),  # Function pointer
...                ]
...
>>>
@end example

We have defined the @ref{97e,,_frozen} data type, so we can get the pointer
to the table:

@example
>>> FrozenTable = POINTER(struct_frozen)
>>> table = FrozenTable.in_dll(pythonapi, "_PyImport_FrozenBootstrap")
>>>
@end example

Since @code{table} is a @code{pointer} to the array of @code{struct_frozen} records, we
can iterate over it, but we just have to make sure that our loop terminates,
because pointers have no size. Sooner or later it would probably crash with an
access violation or whatever, so it’s better to break out of the loop when we
hit the @code{NULL} entry:

@example
>>> for item in table:
...     if item.name is None:
...         break
...     print(item.name.decode("ascii"), item.size)
...
_frozen_importlib 31764
_frozen_importlib_external 41499
zipimport 12345
>>>
@end example

The fact that standard Python has a frozen module and a frozen package
(indicated by the negative @code{size} member) is not well known, it is only used
for testing. Try it out with @code{import __hello__} for example.

@node Surprises,Variable-sized data types,Accessing values exported from dlls,ctypes tutorial
@anchor{library/ctypes ctypes-surprises}@anchor{3390}@anchor{library/ctypes surprises}@anchor{3391}
@subsubsection Surprises


There are some edges in @code{ctypes} where you might expect something other
than what actually happens.

Consider the following example:

@example
>>> from ctypes import *
>>> class POINT(Structure):
...     _fields_ = ("x", c_int), ("y", c_int)
...
>>> class RECT(Structure):
...     _fields_ = ("a", POINT), ("b", POINT)
...
>>> p1 = POINT(1, 2)
>>> p2 = POINT(3, 4)
>>> rc = RECT(p1, p2)
>>> print(rc.a.x, rc.a.y, rc.b.x, rc.b.y)
1 2 3 4
>>> # now swap the two points
>>> rc.a, rc.b = rc.b, rc.a
>>> print(rc.a.x, rc.a.y, rc.b.x, rc.b.y)
3 4 3 4
>>>
@end example

Hm. We certainly expected the last statement to print @code{3 4 1 2}. What
happened? Here are the steps of the @code{rc.a, rc.b = rc.b, rc.a} line above:

@example
>>> temp0, temp1 = rc.b, rc.a
>>> rc.a = temp0
>>> rc.b = temp1
>>>
@end example

Note that @code{temp0} and @code{temp1} are objects still using the internal buffer of
the @code{rc} object above. So executing @code{rc.a = temp0} copies the buffer
contents of @code{temp0} into @code{rc} ‘s buffer.  This, in turn, changes the
contents of @code{temp1}. So, the last assignment @code{rc.b = temp1}, doesn’t have
the expected effect.

Keep in mind that retrieving sub-objects from Structure, Unions, and Arrays
doesn’t `copy' the sub-object, instead it retrieves a wrapper object accessing
the root-object’s underlying buffer.

Another example that may behave differently from what one would expect is this:

@example
>>> s = c_char_p()
>>> s.value = b"abc def ghi"
>>> s.value
b'abc def ghi'
>>> s.value is s.value
False
>>>
@end example

@cartouche
@quotation Note 
Objects instantiated from @ref{1a9d,,c_char_p} can only have their value set to bytes
or integers.
@end quotation
@end cartouche

Why is it printing @code{False}?  ctypes instances are objects containing a memory
block plus some @ref{18c9,,descriptor}s accessing the contents of the memory.
Storing a Python object in the memory block does not store the object itself,
instead the @code{contents} of the object is stored.  Accessing the contents again
constructs a new Python object each time!

@node Variable-sized data types,,Surprises,ctypes tutorial
@anchor{library/ctypes ctypes-variable-sized-data-types}@anchor{3392}@anchor{library/ctypes variable-sized-data-types}@anchor{3393}
@subsubsection Variable-sized data types


@code{ctypes} provides some support for variable-sized arrays and structures.

The @ref{3394,,resize()} function can be used to resize the memory buffer of an
existing ctypes object.  The function takes the object as first argument, and
the requested size in bytes as the second argument.  The memory block cannot be
made smaller than the natural memory block specified by the objects type, a
@ref{2ee,,ValueError} is raised if this is tried:

@example
>>> short_array = (c_short * 4)()
>>> print(sizeof(short_array))
8
>>> resize(short_array, 4)
Traceback (most recent call last):
    ...
ValueError: minimum size is 8
>>> resize(short_array, 32)
>>> sizeof(short_array)
32
>>> sizeof(type(short_array))
8
>>>
@end example

This is nice and fine, but how would one access the additional elements
contained in this array?  Since the type still only knows about 4 elements, we
get errors accessing other elements:

@example
>>> short_array[:]
[0, 0, 0, 0]
>>> short_array[7]
Traceback (most recent call last):
    ...
IndexError: invalid index
>>>
@end example

Another way to use variable-sized data types with @code{ctypes} is to use the
dynamic nature of Python, and (re-)define the data type after the required size
is already known, on a case by case basis.

@node ctypes reference,,ctypes tutorial,ctypes — A foreign function library for Python
@anchor{library/ctypes ctypes-ctypes-reference}@anchor{3395}@anchor{library/ctypes ctypes-reference}@anchor{3396}
@subsubsection ctypes reference


@menu
* Finding shared libraries:: 
* Listing loaded shared libraries:: 
* Loading shared libraries:: 
* Foreign functions:: 
* Function prototypes:: 
* Utility functions:: 
* Data types: Data types<2>. 
* Fundamental data types: Fundamental data types<2>. 
* Structured data types:: 
* Arrays and pointers:: 
* Exceptions: Exceptions<10>. 

@end menu

@node Finding shared libraries,Listing loaded shared libraries,,ctypes reference
@anchor{library/ctypes ctypes-finding-shared-libraries}@anchor{3397}@anchor{library/ctypes finding-shared-libraries}@anchor{3398}
@subsubsection Finding shared libraries


When programming in a compiled language, shared libraries are accessed when
compiling/linking a program, and when the program is run.

The purpose of the @ref{f4b,,find_library()} function is to locate a library in a way
similar to what the compiler or runtime loader does (on platforms with several
versions of a shared library the most recent should be loaded), while the ctypes
library loaders act like when a program is run, and call the runtime loader
directly.

The @code{ctypes.util} module provides a function which can help to determine
the library to load.


@deffn {Data} ctypes.util.find_library (name)

Try to find a library and return a pathname.  `name' is the library name without
any prefix like `lib', suffix like @code{.so}, @code{.dylib} or version number (this
is the form used for the posix linker option @code{-l}).  If no library can
be found, returns @code{None}.
@end deffn

The exact functionality is system dependent.

On Linux, @ref{f4b,,find_library()} tries to run external programs
(@code{/sbin/ldconfig}, @code{gcc}, @code{objdump} and @code{ld}) to find the library file.
It returns the filename of the library file.

Note that if the output of these programs does not correspond to the dynamic
linker used by Python, the result of this function may be misleading.


Changed in version 3.6: On Linux, the value of the environment variable @code{LD_LIBRARY_PATH} is used
when searching for libraries, if a library cannot be found by any other means.


Here are some examples:

@example
>>> from ctypes.util import find_library
>>> find_library("m")
'libm.so.6'
>>> find_library("c")
'libc.so.6'
>>> find_library("bz2")
'libbz2.so.1.0'
>>>
@end example

On macOS and Android, @ref{f4b,,find_library()} uses the system’s
standard naming schemes and paths to locate the library, and returns a full
pathname if successful:

@example
>>> from ctypes.util import find_library
>>> find_library("c")
'/usr/lib/libc.dylib'
>>> find_library("m")
'/usr/lib/libm.dylib'
>>> find_library("bz2")
'/usr/lib/libbz2.dylib'
>>> find_library("AGL")
'/System/Library/Frameworks/AGL.framework/AGL'
>>>
@end example

On Windows, @ref{f4b,,find_library()} searches along the system search path, and
returns the full pathname, but since there is no predefined naming scheme a call
like @code{find_library("c")} will fail and return @code{None}.

If wrapping a shared library with @code{ctypes}, it `may' be better to determine
the shared library name at development time, and hardcode that into the wrapper
module instead of using @ref{f4b,,find_library()} to locate the library at runtime.

@node Listing loaded shared libraries,Loading shared libraries,Finding shared libraries,ctypes reference
@anchor{library/ctypes ctypes-listing-loaded-shared-libraries}@anchor{3399}@anchor{library/ctypes listing-loaded-shared-libraries}@anchor{339a}
@subsubsection Listing loaded shared libraries


When writing code that relies on code loaded from shared libraries, it can be
useful to know which shared libraries have already been loaded into the current
process.

The @code{ctypes.util} module provides the @ref{1f2,,dllist()} function,
which calls the different APIs provided by the various platforms to help determine
which shared libraries have already been loaded into the current process.

The exact output of this function will be system dependent. On most platforms,
the first entry of this list represents the current process itself, which may
be an empty string.
For example, on glibc-based Linux, the return may look like:

@example
>>> from ctypes.util import dllist
>>> dllist()
['@w{'}, 'linux-vdso.so.1', '/lib/x86_64-linux-gnu/libm.so.6', '/lib/x86_64-linux-gnu/libc.so.6', ... ]
@end example

@node Loading shared libraries,Foreign functions,Listing loaded shared libraries,ctypes reference
@anchor{library/ctypes ctypes-loading-shared-libraries}@anchor{339b}@anchor{library/ctypes loading-shared-libraries}@anchor{339c}
@subsubsection Loading shared libraries


There are several ways to load shared libraries into the Python process.  One
way is to instantiate @ref{be2,,CDLL} or one of its subclasses:

@geindex CDLL (class in ctypes)
@anchor{library/ctypes ctypes CDLL}@anchor{be2}
@deffn {Class} ctypes.CDLL (name, mode=DEFAULT_MODE, handle=None, use_errno=False, use_last_error=False, winmode=None)

Represents a loaded shared library.

Functions in this library use the standard C calling convention, and are
assumed to return int.
The Python @ref{474,,global interpreter lock} is released before calling any
function exported by these libraries, and reacquired afterwards.
For different function behavior, use a subclass: @ref{1b26,,OleDLL},
@ref{1b27,,WinDLL}, or @ref{1b28,,PyDLL}.

If you have an existing @ref{339d,,handle} to an already
loaded shared library, it can be passed as the `handle' argument to wrap
the opened library in a new @code{CDLL} object.
In this case, `name' is only used to set the @ref{339e,,_name}
attribute, but it may be adjusted and/or validated.

If `handle' is @code{None}, the underlying platform’s @code{dlopen(3)@footnote{https://manpages.debian.org/dlopen(3)}} or
@code{LoadLibrary()} function is used to load the library into
the process, and to get a handle to it.

`name' is the pathname of the shared library to open.
If `name' does not contain a path separator, the library is found
in a platform-specific way.

On non-Windows systems, `name' can  be @code{None}. In this case,
@code{dlopen()} is called with @code{NULL}, which opens the main program
as a “library”.
(Some systems do the same is `name' is empty; @code{None}/@code{NULL} is more
portable.)

@cartouche
@quotation CPython implementation detail 
Since CPython is linked to @code{libc}, a @code{None} `name' is often used
to access the C standard library:

@example
>>> printf = ctypes.CDLL(None).printf
>>> printf.argtypes = [ctypes.c_char_p]
>>> printf(b"hello\n")
hello
6
@end example

To access the Python C API, prefer @ref{339f,,ctypes.pythonapi} which
works across platforms.
@end quotation
@end cartouche

The `mode' parameter can be used to specify how the library is loaded.  For
details, consult the @code{dlopen(3)@footnote{https://manpages.debian.org/dlopen(3)}} manpage.  On Windows, `mode' is
ignored.  On posix systems, RTLD_NOW is always added, and is not
configurable.

The `use_errno' parameter, when set to true, enables a ctypes mechanism that
allows accessing the system @ref{5b,,errno} error number in a safe way.
@code{ctypes} maintains a thread-local copy of the system’s @code{errno}
variable; if you call foreign functions created with @code{use_errno=True} then the
@code{errno} value before the function call is swapped with the ctypes private
copy, the same happens immediately after the function call.

The function @ref{1762,,ctypes.get_errno()} returns the value of the ctypes private
copy, and the function @ref{33a0,,ctypes.set_errno()} changes the ctypes private copy
to a new value and returns the former value.

The `use_last_error' parameter, when set to true, enables the same mechanism for
the Windows error code which is managed by the @ref{3371,,GetLastError()} and
@code{SetLastError()} Windows API functions; @ref{33a1,,ctypes.get_last_error()} and
@ref{33a2,,ctypes.set_last_error()} are used to request and change the ctypes private
copy of the windows error code.

The `winmode' parameter is used on Windows to specify how the library is loaded
(since `mode' is ignored). It takes any value that is valid for the Win32 API
@code{LoadLibraryEx} flags parameter. When omitted, the default is to use the
flags that result in the most secure DLL load, which avoids issues such as DLL
hijacking. Passing the full path to the DLL is the safest way to ensure the
correct library and dependencies are loaded.

On Windows creating a @code{CDLL} instance may fail even if the DLL name
exists. When a dependent DLL of the loaded DLL is not found, a
@ref{2c2,,OSError} error is raised with the message `“[WinError 126] The
specified module could not be found”.' This error message does not contain
the name of the missing DLL because the Windows API does not return this
information making this error hard to diagnose. To resolve this error and
determine which DLL is not found, you need to find the list of dependent
DLLs and determine which one is not found using Windows debugging and
tracing tools.


@subsubheading See also


Microsoft DUMPBIN tool@footnote{https://learn.microsoft.com/en-us/cpp/build/reference/dumpbin-reference?view=msvc-170}
– A tool to find DLL dependents.



Changed in version 3.8: Added `winmode' parameter.



Changed in version 3.12: The `name' parameter can now be a @ref{5a1,,path-like object}.


Instances of this class have no public methods.  Functions exported by the
shared library can be accessed as attributes or by index.  Please note that
accessing the function through an attribute caches the result and therefore
accessing it repeatedly returns the same object each time.  On the other hand,
accessing it through an index returns a new object each time:

@example
>>> from ctypes import CDLL
>>> libc = CDLL("libc.so.6")  # On Linux
>>> libc.time == libc.time
True
>>> libc['time'] == libc['time']
False
@end example

The following public attributes are available. Their name starts with an
underscore to not clash with exported function names:

@geindex _handle (ctypes.CDLL attribute)
@anchor{library/ctypes ctypes CDLL _handle}@anchor{339d}
@deffn {Attribute} _handle

The system handle used to access the library.
@end deffn

@geindex _name (ctypes.CDLL attribute)
@anchor{library/ctypes ctypes CDLL _name}@anchor{339e}
@deffn {Attribute} _name

The name of the library passed in the constructor.
@end deffn
@end deffn

@geindex OleDLL (class in ctypes)
@anchor{library/ctypes ctypes OleDLL}@anchor{1b26}
@deffn {Class} ctypes.OleDLL

See @ref{be2,,CDLL}, the superclass, for common information.

Functions in this library use the @code{stdcall} calling convention, and are
assumed to return the windows specific @ref{33a3,,HRESULT} code.  @code{HRESULT}
values contain information specifying whether the function call failed or
succeeded, together with additional error code.  If the return value signals a
failure, an @ref{2c2,,OSError} is automatically raised.

@ref{2181,,Availability}: Windows


Changed in version 3.3: @ref{125b,,WindowsError} used to be raised,
which is now an alias of @ref{2c2,,OSError}.

@end deffn

@geindex WinDLL (class in ctypes)
@anchor{library/ctypes ctypes WinDLL}@anchor{1b27}
@deffn {Class} ctypes.WinDLL

See @ref{be2,,CDLL}, the superclass, for common information.

Functions in these libraries use the @code{stdcall} calling convention, and are
assumed to return int by default.

@ref{2181,,Availability}: Windows
@end deffn

@geindex PyDLL (class in ctypes)
@anchor{library/ctypes ctypes PyDLL}@anchor{1b28}
@deffn {Class} ctypes.PyDLL

See @ref{be2,,CDLL}, the superclass, for common information.

When functions in this library are called, the
Python GIL is `not' released during the function call, and after the function
execution the Python error flag is checked. If the error flag is set, a Python
exception is raised.

Thus, this is only useful to call Python C API functions directly.
@end deffn

@geindex RTLD_GLOBAL (in module ctypes)
@anchor{library/ctypes ctypes RTLD_GLOBAL}@anchor{33a4}
@deffn {Data} ctypes.RTLD_GLOBAL

Flag to use as `mode' parameter.  On platforms where this flag is not available,
it is defined as the integer zero.
@end deffn

@geindex RTLD_LOCAL (in module ctypes)
@anchor{library/ctypes ctypes RTLD_LOCAL}@anchor{33a5}
@deffn {Data} ctypes.RTLD_LOCAL

Flag to use as `mode' parameter.  On platforms where this is not available, it
is the same as `RTLD_GLOBAL'.
@end deffn

@geindex DEFAULT_MODE (in module ctypes)
@anchor{library/ctypes ctypes DEFAULT_MODE}@anchor{33a6}
@deffn {Data} ctypes.DEFAULT_MODE

The default mode which is used to load shared libraries.  On OSX 10.3, this is
`RTLD_GLOBAL', otherwise it is the same as `RTLD_LOCAL'.
@end deffn

Shared libraries can also be loaded by using one of the prefabricated objects,
which are instances of the @ref{33a7,,LibraryLoader} class, either by calling the
@ref{3349,,LoadLibrary()} method, or by retrieving the library as
attribute of the loader instance.

@geindex LibraryLoader (class in ctypes)
@anchor{library/ctypes ctypes LibraryLoader}@anchor{33a7}
@deffn {Class} ctypes.LibraryLoader (dlltype)

Class which loads shared libraries.  `dlltype' should be one of the
@ref{be2,,CDLL}, @ref{1b28,,PyDLL}, @ref{1b27,,WinDLL}, or @ref{1b26,,OleDLL} types.

@code{__getattr__()} has special behavior: It allows loading a shared library by
accessing it as attribute of a library loader instance.  The result is cached,
so repeated attribute accesses return the same library each time.

@geindex LoadLibrary() (ctypes.LibraryLoader method)
@anchor{library/ctypes ctypes LibraryLoader LoadLibrary}@anchor{3349}
@deffn {Method} LoadLibrary (name)

Load a shared library into the process and return it.  This method always
returns a new instance of the library.
@end deffn
@end deffn

These prefabricated library loaders are available:

@geindex cdll (in module ctypes)
@anchor{library/ctypes ctypes cdll}@anchor{3346}
@deffn {Data} ctypes.cdll

Creates @ref{be2,,CDLL} instances.
@end deffn

@geindex windll (in module ctypes)
@anchor{library/ctypes ctypes windll}@anchor{3347}
@deffn {Data} ctypes.windll

Creates @ref{1b27,,WinDLL} instances.

@ref{2181,,Availability}: Windows
@end deffn

@geindex oledll (in module ctypes)
@anchor{library/ctypes ctypes oledll}@anchor{3348}
@deffn {Data} ctypes.oledll

Creates @ref{1b26,,OleDLL} instances.

@ref{2181,,Availability}: Windows
@end deffn

@geindex pydll (in module ctypes)
@anchor{library/ctypes ctypes pydll}@anchor{33a8}
@deffn {Data} ctypes.pydll

Creates @ref{1b28,,PyDLL} instances.
@end deffn

For accessing the C Python api directly, a ready-to-use Python shared library
object is available:

@geindex pythonapi (in module ctypes)
@anchor{library/ctypes ctypes pythonapi}@anchor{339f}
@deffn {Data} ctypes.pythonapi

An instance of @ref{1b28,,PyDLL} that exposes Python C API functions as
attributes.  Note that all these functions are assumed to return C
int, which is of course not always the truth, so you have to assign
the correct @code{restype} attribute to use these functions.
@end deffn


Loading a library through any of these objects raises an
@ref{1cb1,,auditing event} @code{ctypes.dlopen} with string argument
@code{name}, the name used to load the library.



Accessing a function on a loaded library raises an auditing event
@code{ctypes.dlsym} with arguments @code{library} (the library object) and @code{name}
(the symbol’s name as a string or integer).



In cases when only the library handle is available rather than the object,
accessing a function raises an auditing event @code{ctypes.dlsym/handle} with
arguments @code{handle} (the raw library handle) and @code{name}.


@node Foreign functions,Function prototypes,Loading shared libraries,ctypes reference
@anchor{library/ctypes ctypes-foreign-functions}@anchor{33a9}@anchor{library/ctypes foreign-functions}@anchor{33aa}
@subsubsection Foreign functions


As explained in the previous section, foreign functions can be accessed as
attributes of loaded shared libraries.  The function objects created in this way
by default accept any number of arguments, accept any ctypes data instances as
arguments, and return the default result type specified by the library loader.

They are instances of a private local class @code{_FuncPtr} (not exposed
in @code{ctypes}) which inherits from the private @ref{1918,,_CFuncPtr} class:

@example
>>> import ctypes
>>> lib = ctypes.CDLL(None)
>>> issubclass(lib._FuncPtr, ctypes._CFuncPtr)
True
>>> lib._FuncPtr is ctypes._CFuncPtr
False
@end example

@geindex _CFuncPtr (class in ctypes)
@anchor{library/ctypes ctypes _CFuncPtr}@anchor{1918}
@deffn {Class} ctypes._CFuncPtr

Base class for C callable foreign functions.

Instances of foreign functions are also C compatible data types; they
represent C function pointers.

This behavior can be customized by assigning to special attributes of the
foreign function object.

@geindex restype (ctypes._CFuncPtr attribute)
@anchor{library/ctypes ctypes _CFuncPtr restype}@anchor{3370}
@deffn {Attribute} restype

Assign a ctypes type to specify the result type of the foreign function.
Use @code{None} for void, a function not returning anything.

It is possible to assign a callable Python object that is not a ctypes
type, in this case the function is assumed to return a C int, and
the callable will be called with this integer, allowing further
processing or error checking.  Using this is deprecated, for more flexible
post processing or error checking use a ctypes data type as
@code{restype} and assign a callable to the @ref{3372,,errcheck} attribute.
@end deffn

@geindex argtypes (ctypes._CFuncPtr attribute)
@anchor{library/ctypes ctypes _CFuncPtr argtypes}@anchor{1810}
@deffn {Attribute} argtypes

Assign a tuple of ctypes types to specify the argument types that the
function accepts.  Functions using the @code{stdcall} calling convention can
only be called with the same number of arguments as the length of this
tuple; functions using the C calling convention accept additional,
unspecified arguments as well.

When a foreign function is called, each actual argument is passed to the
@ref{336d,,from_param()} class method of the items in the @ref{1810,,argtypes}
tuple, this method allows adapting the actual argument to an object that
the foreign function accepts.  For example, a @ref{1a9d,,c_char_p} item in
the @code{argtypes} tuple will convert a string passed as argument into
a bytes object using ctypes conversion rules.

New: It is now possible to put items in argtypes which are not ctypes
types, but each item must have a @ref{336d,,from_param()} method which returns a
value usable as argument (integer, string, ctypes instance).  This allows
defining adapters that can adapt custom objects as function parameters.
@end deffn

@geindex errcheck (ctypes._CFuncPtr attribute)
@anchor{library/ctypes ctypes _CFuncPtr errcheck}@anchor{3372}
@deffn {Attribute} errcheck

Assign a Python function or another callable to this attribute. The
callable will be called with three or more arguments:


@deffn {Function} callable (result, func, arguments)

`result' is what the foreign function returns, as specified by the
@code{restype} attribute.

`func' is the foreign function object itself, this allows reusing the
same callable object to check or post process the results of several
functions.

`arguments' is a tuple containing the parameters originally passed to
the function call, this allows specializing the behavior on the
arguments used.
@end deffn

The object that this function returns will be returned from the
foreign function call, but it can also check the result value
and raise an exception if the foreign function call failed.
@end deffn
@end deffn


On Windows, when a foreign function call raises a system exception (for
example, due to an access violation), it will be captured and replaced with
a suitable Python exception. Further, an auditing event
@code{ctypes.set_exception} with argument @code{code} will be raised, allowing an
audit hook to replace the exception with its own.



Some ways to invoke foreign function calls as well as some of the
functions in this module may raise an auditing event
@code{ctypes.call_function} with arguments @code{function pointer} and @code{arguments}.


@node Function prototypes,Utility functions,Foreign functions,ctypes reference
@anchor{library/ctypes ctypes-function-prototypes}@anchor{33ab}@anchor{library/ctypes function-prototypes}@anchor{33ac}
@subsubsection Function prototypes


Foreign functions can also be created by instantiating function prototypes.
Function prototypes are similar to function prototypes in C; they describe a
function (return type, argument types, calling convention) without defining an
implementation.  The factory functions must be called with the desired result
type and the argument types of the function, and can be used as decorator
factories, and as such, be applied to functions through the @code{@@wrapper} syntax.
See @ref{3389,,Callback functions} for examples.

@geindex CFUNCTYPE() (in module ctypes)
@anchor{library/ctypes ctypes CFUNCTYPE}@anchor{338a}
@deffn {Function} ctypes.CFUNCTYPE (restype, *argtypes, use_errno=False, use_last_error=False)

The returned function prototype creates functions that use the standard C
calling convention.  The function will release the GIL during the call.  If
`use_errno' is set to true, the ctypes private copy of the system
@ref{5b,,errno} variable is exchanged with the real @code{errno} value before
and after the call; `use_last_error' does the same for the Windows error
code.
@end deffn

@geindex WINFUNCTYPE() (in module ctypes)
@anchor{library/ctypes ctypes WINFUNCTYPE}@anchor{338b}
@deffn {Function} ctypes.WINFUNCTYPE (restype, *argtypes, use_errno=False, use_last_error=False)

The returned function prototype creates functions that use the
@code{stdcall} calling convention.  The function will
release the GIL during the call.  `use_errno' and `use_last_error' have the
same meaning as above.

@ref{2181,,Availability}: Windows
@end deffn

@geindex PYFUNCTYPE() (in module ctypes)
@anchor{library/ctypes ctypes PYFUNCTYPE}@anchor{33ad}
@deffn {Function} ctypes.PYFUNCTYPE (restype, *argtypes)

The returned function prototype creates functions that use the Python calling
convention.  The function will `not' release the GIL during the call.
@end deffn

Function prototypes created by these factory functions can be instantiated in
different ways, depending on the type and number of the parameters in the call:


@deffn {Function} prototype (address)

Returns a foreign function at the specified address which must be an integer.
@end deffn


@deffn {Function} prototype (callable)

Create a C callable function (a callback function) from a Python `callable'.
@end deffn


@deffn {Function} prototype (func_spec[, paramflags])

Returns a foreign function exported by a shared library. `func_spec' must
be a 2-tuple @code{(name_or_ordinal, library)}. The first item is the name of
the exported function as string, or the ordinal of the exported function
as small integer.  The second item is the shared library instance.
@end deffn


@deffn {Function} prototype (vtbl_index, name[, paramflags[, iid]])

Returns a foreign function that will call a COM method. `vtbl_index' is
the index into the virtual function table, a small non-negative
integer. `name' is name of the COM method. `iid' is an optional pointer to
the interface identifier which is used in extended error reporting.

If `iid' is not specified, an @ref{2c2,,OSError} is raised if the COM method
call fails. If `iid' is specified, a @ref{1eb,,COMError} is raised
instead.

COM methods use a special calling convention: They require a pointer to
the COM interface as first argument, in addition to those parameters that
are specified in the @code{argtypes} tuple.

@ref{2181,,Availability}: Windows
@end deffn

The optional `paramflags' parameter creates foreign function wrappers with much
more functionality than the features described above.

`paramflags' must be a tuple of the same length as @ref{1810,,argtypes}.

Each item in this tuple contains further information about a parameter, it must
be a tuple containing one, two, or three items.

The first item is an integer containing a combination of direction
flags for the parameter:

@quotation


@table @asis

@item 1

Specifies an input parameter to the function.

@item 2

Output parameter.  The foreign function fills in a value.

@item 4

Input parameter which defaults to the integer zero.
@end table
@end quotation

The optional second item is the parameter name as string.  If this is specified,
the foreign function can be called with named parameters.

The optional third item is the default value for this parameter.

The following example demonstrates how to wrap the Windows @code{MessageBoxW} function so
that it supports default parameters and named arguments. The C declaration from
the windows header file is this:

@example
WINUSERAPI int WINAPI
MessageBoxW(
    HWND hWnd,
    LPCWSTR lpText,
    LPCWSTR lpCaption,
    UINT uType);
@end example

Here is the wrapping with @code{ctypes}:

@example
>>> from ctypes import c_int, WINFUNCTYPE, windll
>>> from ctypes.wintypes import HWND, LPCWSTR, UINT
>>> prototype = WINFUNCTYPE(c_int, HWND, LPCWSTR, LPCWSTR, UINT)
>>> paramflags = (1, "hwnd", 0), (1, "text", "Hi"), (1, "caption", "Hello from ctypes"), (1, "flags", 0)
>>> MessageBox = prototype(("MessageBoxW", windll.user32), paramflags)
@end example

The @code{MessageBox} foreign function can now be called in these ways:

@example
>>> MessageBox()
>>> MessageBox(text="Spam, spam, spam")
>>> MessageBox(flags=2, text="foo bar")
@end example

A second example demonstrates output parameters.  The win32 @code{GetWindowRect}
function retrieves the dimensions of a specified window by copying them into
@code{RECT} structure that the caller has to supply.  Here is the C declaration:

@example
WINUSERAPI BOOL WINAPI
GetWindowRect(
     HWND hWnd,
     LPRECT lpRect);
@end example

Here is the wrapping with @code{ctypes}:

@example
>>> from ctypes import POINTER, WINFUNCTYPE, windll, WinError
>>> from ctypes.wintypes import BOOL, HWND, RECT
>>> prototype = WINFUNCTYPE(BOOL, HWND, POINTER(RECT))
>>> paramflags = (1, "hwnd"), (2, "lprect")
>>> GetWindowRect = prototype(("GetWindowRect", windll.user32), paramflags)
>>>
@end example

Functions with output parameters will automatically return the output parameter
value if there is a single one, or a tuple containing the output parameter
values when there are more than one, so the GetWindowRect function now returns a
RECT instance, when called.

Output parameters can be combined with the @ref{3372,,errcheck} protocol to do
further output processing and error checking.  The win32 @code{GetWindowRect} api
function returns a @code{BOOL} to signal success or failure, so this function could
do the error checking, and raises an exception when the api call failed:

@example
>>> def errcheck(result, func, args):
...     if not result:
...         raise WinError()
...     return args
...
>>> GetWindowRect.errcheck = errcheck
>>>
@end example

If the @ref{3372,,errcheck} function returns the argument tuple it receives
unchanged, @code{ctypes} continues the normal processing it does on the output
parameters.  If you want to return a tuple of window coordinates instead of a
@code{RECT} instance, you can retrieve the fields in the function and return them
instead, the normal processing will no longer take place:

@example
>>> def errcheck(result, func, args):
...     if not result:
...         raise WinError()
...     rc = args[1]
...     return rc.left, rc.top, rc.bottom, rc.right
...
>>> GetWindowRect.errcheck = errcheck
>>>
@end example

@node Utility functions,Data types<2>,Function prototypes,ctypes reference
@anchor{library/ctypes ctypes-utility-functions}@anchor{33ae}@anchor{library/ctypes utility-functions}@anchor{33af}
@subsubsection Utility functions


@geindex addressof() (in module ctypes)
@anchor{library/ctypes ctypes addressof}@anchor{33b0}
@deffn {Function} ctypes.addressof (obj)

Returns the address of the memory buffer as integer.  `obj' must be an
instance of a ctypes type.

Raises an @ref{1cb1,,auditing event} @code{ctypes.addressof} with argument @code{obj}.
@end deffn

@geindex alignment() (in module ctypes)
@anchor{library/ctypes ctypes alignment}@anchor{33b1}
@deffn {Function} ctypes.alignment (obj_or_type)

Returns the alignment requirements of a ctypes type. `obj_or_type' must be a
ctypes type or instance.
@end deffn

@geindex byref() (in module ctypes)
@anchor{library/ctypes ctypes byref}@anchor{3375}
@deffn {Function} ctypes.byref (obj[, offset])

Returns a light-weight pointer to `obj', which must be an instance of a
ctypes type.  `offset' defaults to zero, and must be an integer that will be
added to the internal pointer value.

@code{byref(obj, offset)} corresponds to this C code:

@example
(((char *)&obj) + offset)
@end example

The returned object can only be used as a foreign function call parameter.
It behaves similar to @code{pointer(obj)}, but the construction is a lot faster.
@end deffn

@geindex CopyComPointer() (in module ctypes)
@anchor{library/ctypes ctypes CopyComPointer}@anchor{1ec}
@deffn {Function} ctypes.CopyComPointer (src, dst)

Copies a COM pointer from `src' to `dst' and returns the Windows specific
@code{HRESULT} value.

If `src' is not @code{NULL}, its @code{AddRef} method is called, incrementing the
reference count.

In contrast, the reference count of `dst' will not be decremented before
assigning the new value. Unless `dst' is @code{NULL}, the caller is responsible
for decrementing the reference count by calling its @code{Release} method when
necessary.

@ref{2181,,Availability}: Windows


Added in version 3.14.

@end deffn

@geindex cast() (in module ctypes)
@anchor{library/ctypes ctypes cast}@anchor{3386}
@deffn {Function} ctypes.cast (obj, type)

This function is similar to the cast operator in C. It returns a new instance
of `type' which points to the same memory block as `obj'.  `type' must be a
pointer type, and `obj' must be an object that can be interpreted as a
pointer.
@end deffn

@geindex create_string_buffer() (in module ctypes)
@anchor{library/ctypes ctypes create_string_buffer}@anchor{3364}
@deffn {Function} ctypes.create_string_buffer (init, size=None)

@deffnx {Function} ctypes.create_string_buffer (size)

This function creates a mutable character buffer. The returned object is a
ctypes array of @ref{3351,,c_char}.

If `size' is given (and not @code{None}), it must be an @ref{19c,,int}.
It specifies the size of the returned array.

If the `init' argument is given, it must be @ref{193,,bytes}. It is used
to initialize the array items. Bytes not initialized this way are
set to zero (NUL).

If `size' is not given (or if it is @code{None}), the buffer is made one element
larger than `init', effectively adding a NUL terminator.

If both arguments are given, `size' must not be less than @code{len(init)}.

@cartouche
@quotation Warning 
If `size' is equal to @code{len(init)}, a NUL terminator is
not added. Do not treat such a buffer as a C string.
@end quotation
@end cartouche

For example:

@example
>>> bytes(create_string_buffer(2))
b'\x00\x00'
>>> bytes(create_string_buffer(b'ab'))
b'ab\x00'
>>> bytes(create_string_buffer(b'ab', 2))
b'ab'
>>> bytes(create_string_buffer(b'ab', 4))
b'ab\x00\x00'
>>> bytes(create_string_buffer(b'abcdef', 2))
Traceback (most recent call last):
   ...
ValueError: byte string too long
@end example

Raises an @ref{1cb1,,auditing event} @code{ctypes.create_string_buffer} with arguments @code{init}, @code{size}.
@end deffn

@geindex create_unicode_buffer() (in module ctypes)
@anchor{library/ctypes ctypes create_unicode_buffer}@anchor{1df6}
@deffn {Function} ctypes.create_unicode_buffer (init, size=None)

@deffnx {Function} ctypes.create_unicode_buffer (size)

This function creates a mutable unicode character buffer. The returned object is
a ctypes array of @ref{3352,,c_wchar}.

The function takes the same arguments as @ref{3364,,create_string_buffer()} except
`init' must be a string and `size' counts @ref{3352,,c_wchar}.

Raises an @ref{1cb1,,auditing event} @code{ctypes.create_unicode_buffer} with arguments @code{init}, @code{size}.
@end deffn

@geindex DllCanUnloadNow() (in module ctypes)
@anchor{library/ctypes ctypes DllCanUnloadNow}@anchor{33b2}
@deffn {Function} ctypes.DllCanUnloadNow ()

This function is a hook which allows implementing in-process
COM servers with ctypes.  It is called from the DllCanUnloadNow function that
the _ctypes extension dll exports.

@ref{2181,,Availability}: Windows
@end deffn

@geindex DllGetClassObject() (in module ctypes)
@anchor{library/ctypes ctypes DllGetClassObject}@anchor{33b3}
@deffn {Function} ctypes.DllGetClassObject ()

This function is a hook which allows implementing in-process
COM servers with ctypes.  It is called from the DllGetClassObject function
that the @code{_ctypes} extension dll exports.

@ref{2181,,Availability}: Windows
@end deffn

@geindex find_library() (in module ctypes.util)
@anchor{library/ctypes ctypes util find_library}@anchor{f4b}
@deffn {Function} ctypes.util.find_library (name)

Try to find a library and return a pathname.  `name' is the library name
without any prefix like @code{lib}, suffix like @code{.so}, @code{.dylib} or version
number (this is the form used for the posix linker option @code{-l}).  If
no library can be found, returns @code{None}.

The exact functionality is system dependent.

See @ref{3397,,Finding shared libraries} for complete documentation.
@end deffn

@geindex find_msvcrt() (in module ctypes.util)
@anchor{library/ctypes ctypes util find_msvcrt}@anchor{33b4}
@deffn {Function} ctypes.util.find_msvcrt ()

Returns the filename of the VC runtime library used by Python,
and by the extension modules.  If the name of the library cannot be
determined, @code{None} is returned.

If you need to free memory, for example, allocated by an extension module
with a call to the @code{free(void *)}, it is important that you use the
function in the same library that allocated the memory.

@ref{2181,,Availability}: Windows
@end deffn

@geindex dllist() (in module ctypes.util)
@anchor{library/ctypes ctypes util dllist}@anchor{1f2}
@deffn {Function} ctypes.util.dllist ()

Try to provide a list of paths of the shared libraries loaded into the current
process.  These paths are not normalized or processed in any way.  The function
can raise @ref{2c2,,OSError} if the underlying platform APIs fail.
The exact functionality is system dependent.

On most platforms, the first element of the list represents the current
executable file. It may be an empty string.

@ref{2181,,Availability}: Windows, macOS, iOS, glibc, BSD libc, musl


Added in version 3.14.

@end deffn

@geindex FormatError() (in module ctypes)
@anchor{library/ctypes ctypes FormatError}@anchor{33b5}
@deffn {Function} ctypes.FormatError ([code])

Returns a textual description of the error code `code'.  If no error code is
specified, the last error code is used by calling the Windows API function
@ref{3371,,GetLastError()}.

@ref{2181,,Availability}: Windows
@end deffn

@geindex GetLastError() (in module ctypes)
@anchor{library/ctypes ctypes GetLastError}@anchor{3371}
@deffn {Function} ctypes.GetLastError ()

Returns the last error code set by Windows in the calling thread.
This function calls the Windows @code{GetLastError()} function directly,
it does not return the ctypes-private copy of the error code.

@ref{2181,,Availability}: Windows
@end deffn

@geindex get_errno() (in module ctypes)
@anchor{library/ctypes ctypes get_errno}@anchor{1762}
@deffn {Function} ctypes.get_errno ()

Returns the current value of the ctypes-private copy of the system
@ref{5b,,errno} variable in the calling thread.

Raises an @ref{1cb1,,auditing event} @code{ctypes.get_errno} with no arguments.
@end deffn

@geindex get_last_error() (in module ctypes)
@anchor{library/ctypes ctypes get_last_error}@anchor{33a1}
@deffn {Function} ctypes.get_last_error ()

Returns the current value of the ctypes-private copy of the system
@code{LastError} variable in the calling thread.

@ref{2181,,Availability}: Windows

Raises an @ref{1cb1,,auditing event} @code{ctypes.get_last_error} with no arguments.
@end deffn

@geindex memmove() (in module ctypes)
@anchor{library/ctypes ctypes memmove}@anchor{33b6}
@deffn {Function} ctypes.memmove (dst, src, count)

Same as the standard C memmove library function: copies `count' bytes from
`src' to `dst'. `dst' and `src' must be integers or ctypes instances that can
be converted to pointers.
@end deffn

@geindex memset() (in module ctypes)
@anchor{library/ctypes ctypes memset}@anchor{33b7}
@deffn {Function} ctypes.memset (dst, c, count)

Same as the standard C memset library function: fills the memory block at
address `dst' with `count' bytes of value `c'. `dst' must be an integer
specifying an address, or a ctypes instance.
@end deffn

@geindex POINTER() (in module ctypes)
@anchor{library/ctypes ctypes POINTER}@anchor{1f3}
@deffn {Function} ctypes.POINTER (type, /)

Create or return a ctypes pointer type. Pointer types are cached and
reused internally, so calling this function repeatedly is cheap.
`type' must be a ctypes type.

`CPython implementation detail:' The resulting pointer type is cached in the @code{__pointer_type__}
attribute of `type'.
It is possible to set this attribute before the first call to
@code{POINTER} in order to set a custom pointer type.
However, doing this is discouraged: manually creating a suitable
pointer type is difficult without relying on implementation
details that may change in future Python versions.
@end deffn

@geindex pointer() (in module ctypes)
@anchor{library/ctypes ctypes pointer}@anchor{1a9c}
@deffn {Function} ctypes.pointer (obj, /)

Create a new pointer instance, pointing to `obj'.
The returned object is of the type @code{POINTER(type(obj))}.

Note: If you just want to pass a pointer to an object to a foreign function
call, you should use @code{byref(obj)} which is much faster.
@end deffn

@geindex resize() (in module ctypes)
@anchor{library/ctypes ctypes resize}@anchor{3394}
@deffn {Function} ctypes.resize (obj, size)

This function resizes the internal memory buffer of `obj', which must be an
instance of a ctypes type.  It is not possible to make the buffer smaller
than the native size of the objects type, as given by @code{sizeof(type(obj))},
but it is possible to enlarge the buffer.
@end deffn

@geindex set_errno() (in module ctypes)
@anchor{library/ctypes ctypes set_errno}@anchor{33a0}
@deffn {Function} ctypes.set_errno (value)

Set the current value of the ctypes-private copy of the system @ref{5b,,errno}
variable in the calling thread to `value' and return the previous value.

Raises an @ref{1cb1,,auditing event} @code{ctypes.set_errno} with argument @code{errno}.
@end deffn

@geindex set_last_error() (in module ctypes)
@anchor{library/ctypes ctypes set_last_error}@anchor{33a2}
@deffn {Function} ctypes.set_last_error (value)

Sets the current value of the ctypes-private copy of the system
@code{LastError} variable in the calling thread to `value' and return the
previous value.

@ref{2181,,Availability}: Windows

Raises an @ref{1cb1,,auditing event} @code{ctypes.set_last_error} with argument @code{error}.
@end deffn

@geindex sizeof() (in module ctypes)
@anchor{library/ctypes ctypes sizeof}@anchor{33b8}
@deffn {Function} ctypes.sizeof (obj_or_type)

Returns the size in bytes of a ctypes type or instance memory buffer.
Does the same as the C @code{sizeof} operator.
@end deffn

@geindex string_at() (in module ctypes)
@anchor{library/ctypes ctypes string_at}@anchor{1ee}
@deffn {Function} ctypes.string_at (ptr, size=-1)

Return the byte string at `void *ptr'.
If `size' is specified, it is used as size, otherwise the string is assumed
to be zero-terminated.

Raises an @ref{1cb1,,auditing event} @code{ctypes.string_at} with arguments @code{ptr}, @code{size}.
@end deffn

@geindex WinError() (in module ctypes)
@anchor{library/ctypes ctypes WinError}@anchor{33b9}
@deffn {Function} ctypes.WinError (code=None, descr=None)

Creates an instance of @ref{2c2,,OSError}.  If `code' is not specified,
@ref{3371,,GetLastError()} is called to determine the error code. If `descr' is not
specified, @ref{33b5,,FormatError()} is called to get a textual description of the
error.

@ref{2181,,Availability}: Windows


Changed in version 3.3: An instance of @ref{125b,,WindowsError} used to be created, which is now an
alias of @ref{2c2,,OSError}.

@end deffn

@geindex wstring_at() (in module ctypes)
@anchor{library/ctypes ctypes wstring_at}@anchor{33ba}
@deffn {Function} ctypes.wstring_at (ptr, size=-1)

Return the wide-character string at `void *ptr'.
If `size' is specified, it is used as the number of
characters of the string, otherwise the string is assumed to be
zero-terminated.

Raises an @ref{1cb1,,auditing event} @code{ctypes.wstring_at} with arguments @code{ptr}, @code{size}.
@end deffn

@geindex memoryview_at() (in module ctypes)
@anchor{library/ctypes ctypes memoryview_at}@anchor{1ed}
@deffn {Function} ctypes.memoryview_at (ptr, size, readonly=False)

Return a @ref{166,,memoryview} object of length `size' that references memory
starting at `void *ptr'.

If `readonly' is true, the returned @code{memoryview} object can
not be used to modify the underlying memory.
(Changes made by other means will still be reflected in the returned
object.)

This function is similar to @ref{1ee,,string_at()} with the key
difference of not making a copy of the specified memory.
It is a semantically equivalent (but more efficient) alternative to
@code{memoryview((c_byte * size).from_address(ptr))}.
(While @ref{33bb,,from_address()} only takes integers, `ptr' can also
be given as a @ref{1f3,,ctypes.POINTER} or a @ref{3375,,byref()} object.)

Raises an @ref{1cb1,,auditing event} @code{ctypes.memoryview_at} with arguments @code{address}, @code{size}, @code{readonly}.


Added in version 3.14.

@end deffn

@node Data types<2>,Fundamental data types<2>,Utility functions,ctypes reference
@anchor{library/ctypes ctypes-data-types}@anchor{33bc}@anchor{library/ctypes data-types}@anchor{33bd}
@subsubsection Data types


@geindex _CData (class in ctypes)
@anchor{library/ctypes ctypes _CData}@anchor{33be}
@deffn {Class} ctypes._CData

This non-public class is the common base class of all ctypes data types.
Among other things, all ctypes type instances contain a memory block that
hold C compatible data; the address of the memory block is returned by the
@ref{33b0,,addressof()} helper function. Another instance variable is exposed as
@ref{33bf,,_objects}; this contains other Python objects that need to be kept
alive in case the memory block contains pointers.

Common methods of ctypes data types, these are all class methods (to be
exact, they are methods of the @ref{2417,,metaclass}):

@geindex from_buffer() (ctypes._CData method)
@anchor{library/ctypes ctypes _CData from_buffer}@anchor{33c0}
@deffn {Method} from_buffer (source[, offset])

This method returns a ctypes instance that shares the buffer of the
`source' object.  The `source' object must support the writeable buffer
interface.  The optional `offset' parameter specifies an offset into the
source buffer in bytes; the default is zero.  If the source buffer is not
large enough a @ref{2ee,,ValueError} is raised.

Raises an @ref{1cb1,,auditing event} @code{ctypes.cdata/buffer} with arguments @code{pointer}, @code{size}, @code{offset}.
@end deffn

@geindex from_buffer_copy() (ctypes._CData method)
@anchor{library/ctypes ctypes _CData from_buffer_copy}@anchor{33c1}
@deffn {Method} from_buffer_copy (source[, offset])

This method creates a ctypes instance, copying the buffer from the
`source' object buffer which must be readable.  The optional `offset'
parameter specifies an offset into the source buffer in bytes; the default
is zero.  If the source buffer is not large enough a @ref{2ee,,ValueError} is
raised.

Raises an @ref{1cb1,,auditing event} @code{ctypes.cdata/buffer} with arguments @code{pointer}, @code{size}, @code{offset}.
@end deffn

@geindex from_address() (ctypes._CData method)
@anchor{library/ctypes ctypes _CData from_address}@anchor{33bb}
@deffn {Method} from_address (address)

This method returns a ctypes type instance using the memory specified by
`address' which must be an integer.


This method, and others that indirectly call this method, raises an
@ref{1cb1,,auditing event} @code{ctypes.cdata} with argument
@code{address}.

@end deffn

@geindex from_param() (ctypes._CData method)
@anchor{library/ctypes ctypes _CData from_param}@anchor{336d}
@deffn {Method} from_param (obj)

This method adapts `obj' to a ctypes type.  It is called with the actual
object used in a foreign function call when the type is present in the
foreign function’s @ref{1810,,argtypes} tuple;
it must return an object that can be used as a function call parameter.

All ctypes data types have a default implementation of this classmethod
that normally returns `obj' if that is an instance of the type.  Some
types accept other objects as well.
@end deffn

@geindex in_dll() (ctypes._CData method)
@anchor{library/ctypes ctypes _CData in_dll}@anchor{338e}
@deffn {Method} in_dll (library, name)

This method returns a ctypes type instance exported by a shared
library. `name' is the name of the symbol that exports the data, `library'
is the loaded shared library.
@end deffn

Common class variables of ctypes data types:

@geindex __pointer_type__ (ctypes._CData attribute)
@anchor{library/ctypes ctypes _CData __pointer_type__}@anchor{1f4}
@deffn {Attribute} __pointer_type__

The pointer type that was created by calling
@ref{1f3,,POINTER()} for corresponding ctypes data type. If a pointer type
was not yet created, the attribute is missing.


Added in version 3.14.

@end deffn

Common instance variables of ctypes data types:

@geindex _b_base_ (ctypes._CData attribute)
@anchor{library/ctypes ctypes _CData _b_base_}@anchor{33c2}
@deffn {Attribute} _b_base_

Sometimes ctypes data instances do not own the memory block they contain,
instead they share part of the memory block of a base object.  The
@ref{33c2,,_b_base_} read-only member is the root ctypes object that owns the
memory block.
@end deffn

@geindex _b_needsfree_ (ctypes._CData attribute)
@anchor{library/ctypes ctypes _CData _b_needsfree_}@anchor{33c3}
@deffn {Attribute} _b_needsfree_

This read-only variable is true when the ctypes data instance has
allocated the memory block itself, false otherwise.
@end deffn

@geindex _objects (ctypes._CData attribute)
@anchor{library/ctypes ctypes _CData _objects}@anchor{33bf}
@deffn {Attribute} _objects

This member is either @code{None} or a dictionary containing Python objects
that need to be kept alive so that the memory block contents is kept
valid.  This object is only exposed for debugging; never modify the
contents of this dictionary.
@end deffn
@end deffn

@node Fundamental data types<2>,Structured data types,Data types<2>,ctypes reference
@anchor{library/ctypes ctypes-fundamental-data-types-2}@anchor{33c4}@anchor{library/ctypes id1}@anchor{33c5}
@subsubsection Fundamental data types


@geindex _SimpleCData (class in ctypes)
@anchor{library/ctypes ctypes _SimpleCData}@anchor{33c6}
@deffn {Class} ctypes._SimpleCData

This non-public class is the base class of all fundamental ctypes data
types. It is mentioned here because it contains the common attributes of the
fundamental ctypes data types.  @code{_SimpleCData} is a subclass of
@ref{33be,,_CData}, so it inherits their methods and attributes. ctypes data
types that are not and do not contain pointers can now be pickled.

Instances have a single attribute:

@geindex value (ctypes._SimpleCData attribute)
@anchor{library/ctypes ctypes _SimpleCData value}@anchor{33c7}
@deffn {Attribute} value

This attribute contains the actual value of the instance. For integer and
pointer types, it is an integer, for character types, it is a single
character bytes object or string, for character pointer types it is a
Python bytes object or string.

When the @code{value} attribute is retrieved from a ctypes instance, usually
a new object is returned each time.  @code{ctypes} does `not' implement
original object return, always a new object is constructed.  The same is
true for all other ctypes object instances.
@end deffn

Each subclass has a class attribute:

@geindex _type_ (ctypes._SimpleCData attribute)
@anchor{library/ctypes ctypes _SimpleCData _type_}@anchor{334f}
@deffn {Attribute} _type_

Class attribute that contains an internal type code, as a
single-character string.
See @ref{2885,,Fundamental data types} for a summary.

Types marked * in the summary may be (or always are) aliases of a
different @code{_SimpleCData} subclass, and will not necessarily
use the listed type code.
For example, if the platform’s long, long long
and time_t C types are the same, then @ref{3343,,c_long},
@ref{335f,,c_longlong} and @ref{1ba7,,c_time_t} all refer to a single class,
@code{c_long}, whose @ref{334f,,_type_} code is @code{'l'}.
The @code{'L'} code will be unused.


@subsubheading See also


The @ref{8,,array} and @ref{2881,,struct} modules,
as well as third-party modules like numpy@footnote{https://numpy.org/doc/stable/reference/arrays.interface.html#object.__array_interface__},
use similar – but slightly different – type codes.

@end deffn
@end deffn

Fundamental data types, when returned as foreign function call results, or, for
example, by retrieving structure field members or array items, are transparently
converted to native Python types.  In other words, if a foreign function has a
@ref{3370,,restype} of @ref{1a9d,,c_char_p}, you will always receive a Python bytes
object, `not' a @code{c_char_p} instance.

@c XXX above is false, it actually returns a Unicode string

Subclasses of fundamental data types do `not' inherit this behavior. So, if a
foreign functions @code{restype} is a subclass of @ref{1a9f,,c_void_p}, you will
receive an instance of this subclass from the function call. Of course, you can
get the value of the pointer by accessing the @code{value} attribute.

These are the fundamental ctypes data types:

@geindex c_byte (class in ctypes)
@anchor{library/ctypes ctypes c_byte}@anchor{1b24}
@deffn {Class} ctypes.c_byte

Represents the C signed char datatype, and interprets the value as
small integer.  The constructor accepts an optional integer initializer; no
overflow checking is done.
@end deffn

@geindex c_char (class in ctypes)
@anchor{library/ctypes ctypes c_char}@anchor{3351}
@deffn {Class} ctypes.c_char

Represents the C char datatype, and interprets the value as a single
character.  The constructor accepts an optional string initializer, the
length of the string must be exactly one character.
@end deffn

@geindex c_char_p (class in ctypes)
@anchor{library/ctypes ctypes c_char_p}@anchor{1a9d}
@deffn {Class} ctypes.c_char_p

Represents the C char* datatype when it points to a zero-terminated
string.  For a general character pointer that may also point to binary data,
@code{POINTER(c_char)} must be used.  The constructor accepts an integer
address, or a bytes object.
@end deffn

@geindex c_double (class in ctypes)
@anchor{library/ctypes ctypes c_double}@anchor{1cf9}
@deffn {Class} ctypes.c_double

Represents the C double datatype.  The constructor accepts an
optional float initializer.
@end deffn

@geindex c_longdouble (class in ctypes)
@anchor{library/ctypes ctypes c_longdouble}@anchor{1cfa}
@deffn {Class} ctypes.c_longdouble

Represents the C long double datatype.  The constructor accepts an
optional float initializer.  On platforms where @code{sizeof(long double) ==
sizeof(double)} it is an alias to @ref{1cf9,,c_double}.
@end deffn

@geindex c_float (class in ctypes)
@anchor{library/ctypes ctypes c_float}@anchor{3362}
@deffn {Class} ctypes.c_float

Represents the C float datatype.  The constructor accepts an
optional float initializer.
@end deffn

@geindex c_double_complex (class in ctypes)
@anchor{library/ctypes ctypes c_double_complex}@anchor{1f0}
@deffn {Class} ctypes.c_double_complex

Represents the C double complex datatype, if available.  The
constructor accepts an optional @ref{198,,complex} initializer.


Added in version 3.14.

@end deffn

@geindex c_float_complex (class in ctypes)
@anchor{library/ctypes ctypes c_float_complex}@anchor{1ef}
@deffn {Class} ctypes.c_float_complex

Represents the C float complex datatype, if available.  The
constructor accepts an optional @ref{198,,complex} initializer.


Added in version 3.14.

@end deffn

@geindex c_longdouble_complex (class in ctypes)
@anchor{library/ctypes ctypes c_longdouble_complex}@anchor{1f1}
@deffn {Class} ctypes.c_longdouble_complex

Represents the C long double complex datatype, if available.  The
constructor accepts an optional @ref{198,,complex} initializer.


Added in version 3.14.

@end deffn

@geindex c_int (class in ctypes)
@anchor{library/ctypes ctypes c_int}@anchor{3342}
@deffn {Class} ctypes.c_int

Represents the C signed int datatype.  The constructor accepts an
optional integer initializer; no overflow checking is done.  On platforms
where @code{sizeof(int) == sizeof(long)} it is an alias to @ref{3343,,c_long}.
@end deffn

@geindex c_int8 (class in ctypes)
@anchor{library/ctypes ctypes c_int8}@anchor{3355}
@deffn {Class} ctypes.c_int8

Represents the C 8-bit signed int datatype.  It is an alias for
@ref{1b24,,c_byte}.
@end deffn

@geindex c_int16 (class in ctypes)
@anchor{library/ctypes ctypes c_int16}@anchor{3356}
@deffn {Class} ctypes.c_int16

Represents the C 16-bit signed int datatype.  Usually an alias for
@ref{3353,,c_short}.
@end deffn

@geindex c_int32 (class in ctypes)
@anchor{library/ctypes ctypes c_int32}@anchor{3357}
@deffn {Class} ctypes.c_int32

Represents the C 32-bit signed int datatype.  Usually an alias for
@ref{3342,,c_int}.
@end deffn

@geindex c_int64 (class in ctypes)
@anchor{library/ctypes ctypes c_int64}@anchor{3358}
@deffn {Class} ctypes.c_int64

Represents the C 64-bit signed int datatype.  Usually an alias for
@ref{335f,,c_longlong}.
@end deffn

@geindex c_long (class in ctypes)
@anchor{library/ctypes ctypes c_long}@anchor{3343}
@deffn {Class} ctypes.c_long

Represents the C signed long datatype.  The constructor accepts an
optional integer initializer; no overflow checking is done.
@end deffn

@geindex c_longlong (class in ctypes)
@anchor{library/ctypes ctypes c_longlong}@anchor{335f}
@deffn {Class} ctypes.c_longlong

Represents the C signed long long datatype.  The constructor accepts
an optional integer initializer; no overflow checking is done.
On platforms where @code{sizeof(long long) == sizeof(long)} it is an alias
to @ref{3343,,c_long}.
@end deffn

@geindex c_short (class in ctypes)
@anchor{library/ctypes ctypes c_short}@anchor{3353}
@deffn {Class} ctypes.c_short

Represents the C signed short datatype.  The constructor accepts an
optional integer initializer; no overflow checking is done.
@end deffn

@geindex c_size_t (class in ctypes)
@anchor{library/ctypes ctypes c_size_t}@anchor{3361}
@deffn {Class} ctypes.c_size_t

Represents the C @code{size_t} datatype.
Usually an alias for another unsigned integer type.
@end deffn

@geindex c_ssize_t (class in ctypes)
@anchor{library/ctypes ctypes c_ssize_t}@anchor{1448}
@deffn {Class} ctypes.c_ssize_t

Represents the @ref{c5b,,Py_ssize_t} datatype.
This is a signed version of @code{size_t};
that is, the POSIX @code{ssize_t} type.
Usually an alias for another integer type.


Added in version 3.2.

@end deffn

@geindex c_time_t (class in ctypes)
@anchor{library/ctypes ctypes c_time_t}@anchor{1ba7}
@deffn {Class} ctypes.c_time_t

Represents the C @code{time_t} datatype.
Usually an alias for another integer type.


Added in version 3.12.

@end deffn

@geindex c_ubyte (class in ctypes)
@anchor{library/ctypes ctypes c_ubyte}@anchor{1b25}
@deffn {Class} ctypes.c_ubyte

Represents the C unsigned char datatype, it interprets the value as
small integer.  The constructor accepts an optional integer initializer; no
overflow checking is done.
@end deffn

@geindex c_uint (class in ctypes)
@anchor{library/ctypes ctypes c_uint}@anchor{3359}
@deffn {Class} ctypes.c_uint

Represents the C unsigned int datatype.  The constructor accepts an
optional integer initializer; no overflow checking is done.  On platforms
where @code{sizeof(int) == sizeof(long)} it is an alias for @ref{335e,,c_ulong}.
@end deffn

@geindex c_uint8 (class in ctypes)
@anchor{library/ctypes ctypes c_uint8}@anchor{335a}
@deffn {Class} ctypes.c_uint8

Represents the C 8-bit unsigned int datatype.  It is an alias for
@ref{1b25,,c_ubyte}.
@end deffn

@geindex c_uint16 (class in ctypes)
@anchor{library/ctypes ctypes c_uint16}@anchor{335b}
@deffn {Class} ctypes.c_uint16

Represents the C 16-bit unsigned int datatype.  Usually an alias for
@ref{3354,,c_ushort}.
@end deffn

@geindex c_uint32 (class in ctypes)
@anchor{library/ctypes ctypes c_uint32}@anchor{335c}
@deffn {Class} ctypes.c_uint32

Represents the C 32-bit unsigned int datatype.  Usually an alias for
@ref{3359,,c_uint}.
@end deffn

@geindex c_uint64 (class in ctypes)
@anchor{library/ctypes ctypes c_uint64}@anchor{335d}
@deffn {Class} ctypes.c_uint64

Represents the C 64-bit unsigned int datatype.  Usually an alias for
@ref{3360,,c_ulonglong}.
@end deffn

@geindex c_ulong (class in ctypes)
@anchor{library/ctypes ctypes c_ulong}@anchor{335e}
@deffn {Class} ctypes.c_ulong

Represents the C unsigned long datatype.  The constructor accepts an
optional integer initializer; no overflow checking is done.
@end deffn

@geindex c_ulonglong (class in ctypes)
@anchor{library/ctypes ctypes c_ulonglong}@anchor{3360}
@deffn {Class} ctypes.c_ulonglong

Represents the C unsigned long long datatype.  The constructor
accepts an optional integer initializer; no overflow checking is done.
On platforms where @code{sizeof(long long) == sizeof(long)} it is an alias
to @ref{3343,,c_long}.
@end deffn

@geindex c_ushort (class in ctypes)
@anchor{library/ctypes ctypes c_ushort}@anchor{3354}
@deffn {Class} ctypes.c_ushort

Represents the C unsigned short datatype.  The constructor accepts
an optional integer initializer; no overflow checking is done.
@end deffn

@geindex c_void_p (class in ctypes)
@anchor{library/ctypes ctypes c_void_p}@anchor{1a9f}
@deffn {Class} ctypes.c_void_p

Represents the C void* type.  The value is represented as integer.
The constructor accepts an optional integer initializer.
@end deffn

@geindex c_wchar (class in ctypes)
@anchor{library/ctypes ctypes c_wchar}@anchor{3352}
@deffn {Class} ctypes.c_wchar

Represents the C @code{wchar_t} datatype, and interprets the value as a
single character unicode string.  The constructor accepts an optional string
initializer, the length of the string must be exactly one character.
@end deffn

@geindex c_wchar_p (class in ctypes)
@anchor{library/ctypes ctypes c_wchar_p}@anchor{1a9e}
@deffn {Class} ctypes.c_wchar_p

Represents the C wchar_t* datatype, which must be a pointer to a
zero-terminated wide character string.  The constructor accepts an integer
address, or a string.
@end deffn

@geindex c_bool (class in ctypes)
@anchor{library/ctypes ctypes c_bool}@anchor{3350}
@deffn {Class} ctypes.c_bool

Represent the C bool datatype (more accurately, _Bool from
C99).  Its value can be @code{True} or @code{False}, and the constructor accepts any object
that has a truth value.
@end deffn

@geindex HRESULT (class in ctypes)
@anchor{library/ctypes ctypes HRESULT}@anchor{33a3}
@deffn {Class} ctypes.HRESULT

Represents a @code{HRESULT} value, which contains success or
error information for a function or method call.

@ref{2181,,Availability}: Windows
@end deffn

@geindex py_object (class in ctypes)
@anchor{library/ctypes ctypes py_object}@anchor{1f5}
@deffn {Class} ctypes.py_object

Represents the C @ref{5df,,PyObject}* datatype.  Calling this without an
argument creates a @code{NULL} PyObject* pointer.


Changed in version 3.14: @code{py_object} is now a @ref{1a2,,generic type}.

@end deffn
@anchor{library/ctypes ctypes-wintypes}@anchor{3363}
The @code{ctypes.wintypes} module provides quite some other Windows specific
data types, for example @code{HWND}, @code{WPARAM},
@code{VARIANT_BOOL} or @code{DWORD}.
Some useful structures like @code{MSG} or @code{RECT} are also defined.

@node Structured data types,Arrays and pointers,Fundamental data types<2>,ctypes reference
@anchor{library/ctypes ctypes-structured-data-types}@anchor{33c8}@anchor{library/ctypes structured-data-types}@anchor{33c9}
@subsubsection Structured data types


@geindex Union (class in ctypes)
@anchor{library/ctypes ctypes Union}@anchor{1e8}
@deffn {Class} ctypes.Union (*args, **kw)

Abstract base class for unions in native byte order.

Unions share common attributes and behavior with structures;
see @ref{1e7,,Structure} documentation for details.
@end deffn

@geindex BigEndianUnion (class in ctypes)
@anchor{library/ctypes ctypes BigEndianUnion}@anchor{1bfa}
@deffn {Class} ctypes.BigEndianUnion (*args, **kw)

Abstract base class for unions in `big endian' byte order.


Added in version 3.11.

@end deffn

@geindex LittleEndianUnion (class in ctypes)
@anchor{library/ctypes ctypes LittleEndianUnion}@anchor{1bfb}
@deffn {Class} ctypes.LittleEndianUnion (*args, **kw)

Abstract base class for unions in `little endian' byte order.


Added in version 3.11.

@end deffn

@geindex BigEndianStructure (class in ctypes)
@anchor{library/ctypes ctypes BigEndianStructure}@anchor{337a}
@deffn {Class} ctypes.BigEndianStructure (*args, **kw)

Abstract base class for structures in `big endian' byte order.
@end deffn

@geindex LittleEndianStructure (class in ctypes)
@anchor{library/ctypes ctypes LittleEndianStructure}@anchor{337b}
@deffn {Class} ctypes.LittleEndianStructure (*args, **kw)

Abstract base class for structures in `little endian' byte order.
@end deffn

Structures and unions with non-native byte order cannot contain pointer type
fields, or any other data types containing pointer type fields.

@geindex Structure (class in ctypes)
@anchor{library/ctypes ctypes Structure}@anchor{1e7}
@deffn {Class} ctypes.Structure (*args, **kw)

Abstract base class for structures in `native' byte order.

Concrete structure and union types must be created by subclassing one of these
types, and at least define a @ref{197a,,_fields_} class variable. @code{ctypes} will
create @ref{18c9,,descriptor}s which allow reading and writing the fields by direct
attribute accesses.  These are the

@geindex _fields_ (ctypes.Structure attribute)
@anchor{library/ctypes ctypes Structure _fields_}@anchor{197a}
@deffn {Attribute} _fields_

A sequence defining the structure fields.  The items must be 2-tuples or
3-tuples.  The first item is the name of the field, the second item
specifies the type of the field; it can be any ctypes data type.

For integer type fields like @ref{3342,,c_int}, a third optional item can be
given.  It must be a small positive integer defining the bit width of the
field.

Field names must be unique within one structure or union.  This is not
checked, only one field can be accessed when names are repeated.

It is possible to define the @ref{197a,,_fields_} class variable `after' the
class statement that defines the Structure subclass, this allows creating
data types that directly or indirectly reference themselves:

@example
class List(Structure):
    pass
List._fields_ = [("pnext", POINTER(List)),
                 ...
                ]
@end example

The @code{_fields_} class variable can only be set once.
Later assignments will raise an @ref{5f0,,AttributeError}.

Additionally, the @code{_fields_} class variable must be defined before
the structure or union type is first used: an instance or subclass is
created, @ref{33b8,,sizeof()} is called on it, and so on.
Later assignments to @code{_fields_} will raise an @ref{5f0,,AttributeError}.
If @code{_fields_} has not been set before such use,
the structure or union will have no own fields, as if @code{_fields_}
was empty.

Sub-subclasses of structure types inherit the fields of the base class
plus the @ref{197a,,_fields_} defined in the sub-subclass, if any.
@end deffn

@geindex _pack_ (ctypes.Structure attribute)
@anchor{library/ctypes ctypes Structure _pack_}@anchor{319}
@deffn {Attribute} _pack_

An optional small integer that allows overriding the alignment of
structure fields in the instance.

This is only implemented for the MSVC-compatible memory layout
(see @ref{1e9,,_layout_}).

Setting @code{_pack_} to 0 is the same as not setting it at all.
Otherwise, the value must be a positive power of two.
The effect is equivalent to @code{#pragma pack(N)} in C, except
@code{ctypes} may allow larger `n' than what the compiler accepts.

@code{_pack_} must already be defined
when @ref{197a,,_fields_} is assigned, otherwise it will have no effect.


Deprecated since version 3.14, will be removed in version 3.19: For historical reasons, if @code{_pack_} is non-zero,
the MSVC-compatible layout will be used by default.
On non-Windows platforms, this default is deprecated and is slated to
become an error in Python 3.19.
If it is intended, set @ref{1e9,,_layout_} to @code{'ms'}
explicitly.

@end deffn

@geindex _align_ (ctypes.Structure attribute)
@anchor{library/ctypes ctypes Structure _align_}@anchor{4e9}
@deffn {Attribute} _align_

An optional small integer that allows increasing the alignment of
the structure when being packed or unpacked to/from memory.

The value must not be negative.
The effect is equivalent to @code{__attribute__((aligned(N)))} on GCC
or @code{#pragma align(N)} on MSVC, except @code{ctypes} may allow
values that the compiler would reject.

@code{_align_} can only `increase' a structure’s alignment
requirements. Setting it to 0 or 1 has no effect.

Using values that are not powers of two is discouraged and may lead to
surprising behavior.

@code{_align_} must already be defined
when @ref{197a,,_fields_} is assigned, otherwise it will have no effect.


Added in version 3.13.

@end deffn

@geindex _layout_ (ctypes.Structure attribute)
@anchor{library/ctypes ctypes Structure _layout_}@anchor{1e9}
@deffn {Attribute} _layout_

An optional string naming the struct/union layout. It can currently
be set to:


@itemize -

@item 
@code{"ms"}: the layout used by the Microsoft compiler (MSVC).
On GCC and Clang, this layout can be selected with
@code{__attribute__((ms_struct))}.

@item 
@code{"gcc-sysv"}: the layout used by GCC with the System V or “SysV-like”
data model, as used on Linux and macOS.
With this layout, @ref{319,,_pack_} must be unset or zero.
@end itemize

If not set explicitly, @code{ctypes} will use a default that
matches the platform conventions. This default may change in future
Python releases (for example, when a new platform gains official support,
or when a difference between similar platforms is found).
Currently the default will be:


@itemize -

@item 
On Windows: @code{"ms"}

@item 
When @ref{319,,_pack_} is specified: @code{"ms"}.
(This is deprecated; see @code{_pack_} documentation.)

@item 
Otherwise: @code{"gcc-sysv"}
@end itemize

@code{_layout_} must already be defined when
@ref{197a,,_fields_} is assigned, otherwise it will have no effect.


Added in version 3.14.

@end deffn

@geindex _anonymous_ (ctypes.Structure attribute)
@anchor{library/ctypes ctypes Structure _anonymous_}@anchor{33ca}
@deffn {Attribute} _anonymous_

An optional sequence that lists the names of unnamed (anonymous) fields.
@ref{33ca,,_anonymous_} must be already defined when @ref{197a,,_fields_} is
assigned, otherwise it will have no effect.

The fields listed in this variable must be structure or union type fields.
@code{ctypes} will create descriptors in the structure type that allows
accessing the nested fields directly, without the need to create the
structure or union field.

Here is an example type (Windows):

@example
class _U(Union):
    _fields_ = [("lptdesc", POINTER(TYPEDESC)),
                ("lpadesc", POINTER(ARRAYDESC)),
                ("hreftype", HREFTYPE)]

class TYPEDESC(Structure):
    _anonymous_ = ("u",)
    _fields_ = [("u", _U),
                ("vt", VARTYPE)]
@end example

The @code{TYPEDESC} structure describes a COM data type, the @code{vt} field
specifies which one of the union fields is valid.  Since the @code{u} field
is defined as anonymous field, it is now possible to access the members
directly off the TYPEDESC instance. @code{td.lptdesc} and @code{td.u.lptdesc}
are equivalent, but the former is faster since it does not need to create
a temporary union instance:

@example
td = TYPEDESC()
td.vt = VT_PTR
td.lptdesc = POINTER(some_type)
td.u.lptdesc = POINTER(some_type)
@end example
@end deffn

It is possible to define sub-subclasses of structures, they inherit the
fields of the base class.  If the subclass definition has a separate
@ref{197a,,_fields_} variable, the fields specified in this are appended to the
fields of the base class.

Structure and union constructors accept both positional and keyword
arguments.  Positional arguments are used to initialize member fields in the
same order as they are appear in @ref{197a,,_fields_}.  Keyword arguments in the
constructor are interpreted as attribute assignments, so they will initialize
@code{_fields_} with the same name, or create new attributes for names not
present in @code{_fields_}.
@end deffn

@geindex CField (class in ctypes)
@anchor{library/ctypes ctypes CField}@anchor{1ea}
@deffn {Class} ctypes.CField (*args, **kw)

Descriptor for fields of a @ref{1e7,,Structure} and @ref{1e8,,Union}.
For example:

@example
>>> class Color(Structure):
...     _fields_ = (
...         ('red', c_uint8),
...         ('green', c_uint8),
...         ('blue', c_uint8),
...         ('intense', c_bool, 1),
...         ('blinking', c_bool, 1),
...    )
...
>>> Color.red
<ctypes.CField 'red' type=c_ubyte, ofs=0, size=1>
>>> Color.green.type
<class 'ctypes.c_ubyte'>
>>> Color.blue.byte_offset
2
>>> Color.intense
<ctypes.CField 'intense' type=c_bool, ofs=3, bit_size=1, bit_offset=0>
>>> Color.blinking.bit_offset
1
@end example

All attributes are read-only.

@code{CField} objects are created via @ref{197a,,_fields_};
do not instantiate the class directly.


Added in version 3.14: Previously, descriptors only had @code{offset} and @code{size} attributes
and a readable string representation; the @code{CField} class was not
available directly.


@geindex name (ctypes.CField attribute)
@anchor{library/ctypes ctypes CField name}@anchor{33cb}
@deffn {Attribute} name

Name of the field, as a string.
@end deffn

@geindex type (ctypes.CField attribute)
@anchor{library/ctypes ctypes CField type}@anchor{33cc}
@deffn {Attribute} type

Type of the field, as a @ref{33bc,,ctypes class}.
@end deffn

@geindex offset (ctypes.CField attribute)
@geindex byte_offset (ctypes.CField attribute)
@anchor{library/ctypes ctypes CField offset}@anchor{33cd}
@deffn {Attribute} offset
@anchor{library/ctypes ctypes CField byte_offset}@anchor{33ce}
@deffnx {Attribute} byte_offset

Offset of the field, in bytes.

For bitfields, this is the offset of the underlying byte-aligned
`storage unit'; see @ref{33cf,,bit_offset}.
@end deffn

@geindex byte_size (ctypes.CField attribute)
@anchor{library/ctypes ctypes CField byte_size}@anchor{33d0}
@deffn {Attribute} byte_size

Size of the field, in bytes.

For bitfields, this is the size of the underlying `storage unit'.
Typically, it has the same size as the bitfield’s type.
@end deffn

@geindex size (ctypes.CField attribute)
@anchor{library/ctypes ctypes CField size}@anchor{33d1}
@deffn {Attribute} size

For non-bitfields, equivalent to @ref{33d0,,byte_size}.

For bitfields, this contains a backwards-compatible bit-packed
value that combines @ref{33d2,,bit_size} and
@ref{33cf,,bit_offset}.
Prefer using the explicit attributes instead.
@end deffn

@geindex is_bitfield (ctypes.CField attribute)
@anchor{library/ctypes ctypes CField is_bitfield}@anchor{33d3}
@deffn {Attribute} is_bitfield

True if this is a bitfield.
@end deffn

@geindex bit_offset (ctypes.CField attribute)
@geindex bit_size (ctypes.CField attribute)
@anchor{library/ctypes ctypes CField bit_offset}@anchor{33cf}
@deffn {Attribute} bit_offset
@anchor{library/ctypes ctypes CField bit_size}@anchor{33d2}
@deffnx {Attribute} bit_size

The location of a bitfield within its `storage unit', that is, within
@ref{33d0,,byte_size} bytes of memory starting at
@ref{33ce,,byte_offset}.

To get the field’s value, read the storage unit as an integer,
@ref{2510,,shift left} by @code{bit_offset} and
take the @code{bit_size} least significant bits.

For non-bitfields, @code{bit_offset} is zero
and @code{bit_size} is equal to @code{byte_size * 8}.
@end deffn

@geindex is_anonymous (ctypes.CField attribute)
@anchor{library/ctypes ctypes CField is_anonymous}@anchor{33d4}
@deffn {Attribute} is_anonymous

True if this field is anonymous, that is, it contains nested sub-fields
that should be merged into a containing structure or union.
@end deffn
@end deffn

@node Arrays and pointers,Exceptions<10>,Structured data types,ctypes reference
@anchor{library/ctypes arrays-and-pointers}@anchor{33d5}@anchor{library/ctypes ctypes-arrays-pointers}@anchor{33d6}
@subsubsection Arrays and pointers


@geindex Array (class in ctypes)
@anchor{library/ctypes ctypes Array}@anchor{1e4f}
@deffn {Class} ctypes.Array (*args)

Abstract base class for arrays.

The recommended way to create concrete array types is by multiplying any
@code{ctypes} data type with a non-negative integer.  Alternatively, you can subclass
this type and define @ref{33d7,,_length_} and @ref{33d8,,_type_} class variables.
Array elements can be read and written using standard
subscript and slice accesses; for slice reads, the resulting object is
`not' itself an @code{Array}.

Arrays are @ref{2410,,generic} over the type of their elements.

@geindex _length_ (ctypes.Array attribute)
@anchor{library/ctypes ctypes Array _length_}@anchor{33d7}
@deffn {Attribute} _length_

A positive integer specifying the number of elements in the array.
Out-of-range subscripts result in an @ref{1741,,IndexError}. Will be
returned by @ref{841,,len()}.
@end deffn

@geindex _type_ (ctypes.Array attribute)
@anchor{library/ctypes ctypes Array _type_}@anchor{33d8}
@deffn {Attribute} _type_

Specifies the type of each element in the array.
@end deffn

Array subclass constructors accept positional arguments, used to
initialize the elements in order.
@end deffn

@geindex ARRAY() (in module ctypes)
@anchor{library/ctypes ctypes ARRAY}@anchor{59e}
@deffn {Function} ctypes.ARRAY (type, length)

Create an array.
Equivalent to @code{type * length}, where `type' is a
@code{ctypes} data type and `length' an integer.

This function is @ref{23f,,soft deprecated} in favor of multiplication.
There are no plans to remove it.
@end deffn

@geindex _Pointer (class in ctypes)
@anchor{library/ctypes ctypes _Pointer}@anchor{33d9}
@deffn {Class} ctypes._Pointer

Private, abstract base class for pointers.

Concrete pointer types are created by calling @ref{1f3,,POINTER()} with the
type that will be pointed to; this is done automatically by
@ref{1a9c,,pointer()}.

If a pointer points to an array, its elements can be read and
written using standard subscript and slice accesses.  Pointer objects
have no size, so @ref{841,,len()} will raise @ref{199,,TypeError}.  Negative
subscripts will read from the memory `before' the pointer (as in C), and
out-of-range subscripts will probably crash with an access violation (if
you’re lucky).

@geindex _type_ (ctypes._Pointer attribute)
@anchor{library/ctypes ctypes _Pointer _type_}@anchor{1899}
@deffn {Attribute} _type_

Specifies the type pointed to.
@end deffn

@geindex contents (ctypes._Pointer attribute)
@anchor{library/ctypes ctypes _Pointer contents}@anchor{3381}
@deffn {Attribute} contents

Returns the object to which to pointer points.  Assigning to this
attribute changes the pointer to point to the assigned object.
@end deffn
@end deffn

@node Exceptions<10>,,Arrays and pointers,ctypes reference
@anchor{library/ctypes ctypes-exceptions}@anchor{33da}@anchor{library/ctypes exceptions}@anchor{33db}
@subsubsection Exceptions


@geindex ArgumentError
@anchor{library/ctypes ctypes ArgumentError}@anchor{33dc}
@deffn {Exception} ctypes.ArgumentError

This exception is raised when a foreign function call cannot convert one of the
passed arguments.
@end deffn

@geindex COMError
@anchor{library/ctypes ctypes COMError}@anchor{1eb}
@deffn {Exception} ctypes.COMError (hresult, text, details)

This exception is raised when a COM method call failed.

@geindex hresult (ctypes.COMError attribute)
@anchor{library/ctypes ctypes COMError hresult}@anchor{33dd}
@deffn {Attribute} hresult

The integer value representing the error code.
@end deffn

@geindex text (ctypes.COMError attribute)
@anchor{library/ctypes ctypes COMError text}@anchor{33de}
@deffn {Attribute} text

The error message.
@end deffn

@geindex details (ctypes.COMError attribute)
@anchor{library/ctypes ctypes COMError details}@anchor{33df}
@deffn {Attribute} details

The 5-tuple @code{(descr, source, helpfile, helpcontext, progid)}.

`descr' is the textual description.  `source' is the language-dependent
@code{ProgID} for the class or application that raised the error.  `helpfile'
is the path of the help file.  `helpcontext' is the help context
identifier.  `progid' is the @code{ProgID} of the interface that defined the
error.
@end deffn

@ref{2181,,Availability}: Windows


Added in version 3.14.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Command-line interface libraries,Concurrent Execution,Generic Operating System Services,The Python Standard Library
@anchor{library/cmdlinelibs doc}@anchor{33e0}@anchor{library/cmdlinelibs cmdlinelibs}@anchor{33e1}@anchor{library/cmdlinelibs command-line-interface-libraries}@anchor{33e2}@anchor{library/cmdlinelibs translation-repo}@anchor{33e3}
@section Command-line interface libraries


The modules described in this chapter assist with implementing
command line and terminal interfaces for applications.

Here’s an overview:

@menu
* argparse — Parser for command-line options@comma{} arguments and subcommands: argparse — Parser for command-line options arguments and subcommands. 
* optparse — Parser for command line options:: 
* getpass — Portable password input:: 
* fileinput — Iterate over lines from multiple input streams:: 
* curses — Terminal handling for character-cell displays:: 
* curses.textpad — Text input widget for curses programs: curses textpad — Text input widget for curses programs. 
* curses.ascii — Utilities for ASCII characters: curses ascii — Utilities for ASCII characters. 
* curses.panel — A panel stack extension for curses: curses panel — A panel stack extension for curses. 
* cmd — Support for line-oriented command interpreters:: 

@end menu

@node argparse — Parser for command-line options arguments and subcommands,optparse — Parser for command line options,,Command-line interface libraries
@anchor{library/argparse doc}@anchor{33e4}@anchor{library/argparse argparse-parser-for-command-line-options-arguments-and-subcommands}@anchor{33e5}@anchor{library/argparse module-argparse}@anchor{7}
@subsection @code{argparse} — Parser for command-line options, arguments and subcommands


@geindex module; argparse


Added in version 3.2.


`Source code:' Lib/argparse.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/argparse.py}

@cartouche
@quotation Note 
While @code{argparse} is the default recommended standard library module
for implementing basic command line applications, authors with more
exacting requirements for exactly how their command line applications
behave may find it doesn’t provide the necessary level of control.
Refer to @ref{33e6,,Choosing an argument parsing library} for alternatives to
consider when @code{argparse} doesn’t support behaviors that the application
requires (such as entirely disabling support for interspersed options and
positional arguments, or accepting option parameter values that start
with @code{-} even when they correspond to another defined option).
@end quotation
@end cartouche


__________________________________________________________________


@subsubheading Tutorial



This page contains the API reference information. For a more gentle
introduction to Python command-line parsing, have a look at the
@ref{33e7,,argparse tutorial}.

The @code{argparse} module makes it easy to write user-friendly command-line
interfaces. The program defines what arguments it requires, and @code{argparse}
will figure out how to parse those out of @ref{1470,,sys.argv}.  The @code{argparse}
module also automatically generates help and usage messages.  The module
will also issue errors when users give the program invalid arguments.

The @code{argparse} module’s support for command-line interfaces is built
around an instance of @ref{1bf,,argparse.ArgumentParser}.  It is a container for
argument specifications and has options that apply to the parser as whole:

@example
parser = argparse.ArgumentParser(
                    prog='ProgramName',
                    description='What the program does',
                    epilog='Text at the bottom of help')
@end example

The @ref{4bd,,ArgumentParser.add_argument()} method attaches individual argument
specifications to the parser.  It supports positional arguments, options that
accept values, and on/off flags:

@example
parser.add_argument('filename')           # positional argument
parser.add_argument('-c', '--count')      # option that takes a value
parser.add_argument('-v', '--verbose',
                    action='store_true')  # on/off flag
@end example

The @ref{33e8,,ArgumentParser.parse_args()} method runs the parser and places
the extracted data in a @ref{33e9,,argparse.Namespace} object:

@example
args = parser.parse_args()
print(args.filename, args.count, args.verbose)
@end example

@cartouche
@quotation Note 
If you’re looking for a guide about how to upgrade @ref{a4,,optparse} code
to @code{argparse}, see @ref{13ba,,Upgrading Optparse Code}.
@end quotation
@end cartouche

@menu
* ArgumentParser objects:: 
* The add_argument() method: The add_argument method. 
* The parse_args() method: The parse_args method. 
* Other utilities:: 
* Exceptions: Exceptions<11>. 

@end menu

@node ArgumentParser objects,The add_argument method,,argparse — Parser for command-line options arguments and subcommands
@anchor{library/argparse argumentparser-objects}@anchor{33ea}
@subsubsection ArgumentParser objects


@geindex ArgumentParser (class in argparse)
@anchor{library/argparse argparse ArgumentParser}@anchor{1bf}
@deffn {Class} argparse.ArgumentParser (prog=None, usage=None, description=None, epilog=None, parents=[], formatter_class=argparse.HelpFormatter, prefix_chars='-', fromfile_prefix_chars=None, argument_default=None, conflict_handler='error', add_help=True, allow_abbrev=True, exit_on_error=True, *, suggest_on_error=False, color=True)

Create a new @code{ArgumentParser} object. All parameters should be passed
as keyword arguments. Each parameter has its own more detailed description
below, but in short they are:


@itemize *

@item 
@ref{1be,,prog} - The name of the program (default: generated from the @code{__main__}
module attributes and @code{sys.argv[0]})

@item 
@ref{33eb,,usage} - The string describing the program usage (default: generated from
arguments added to parser)

@item 
@ref{33ec,,description} - Text to display before the argument help
(by default, no text)

@item 
@ref{33ed,,epilog} - Text to display after the argument help (by default, no text)

@item 
@ref{33ee,,parents} - A list of @code{ArgumentParser} objects whose arguments should
also be included

@item 
@ref{33ef,,formatter_class} - A class for customizing the help output

@item 
@ref{33f0,,prefix_chars} - The set of characters that prefix optional arguments
(default: ‘-‘)

@item 
@ref{33f1,,fromfile_prefix_chars} - The set of characters that prefix files from
which additional arguments should be read (default: @code{None})

@item 
@ref{33f2,,argument_default} - The global default value for arguments
(default: @code{None})

@item 
@ref{33f3,,conflict_handler} - The strategy for resolving conflicting optionals
(usually unnecessary)

@item 
@ref{33f4,,add_help} - Add a @code{-h/--help} option to the parser (default: @code{True})

@item 
@ref{fc5,,allow_abbrev} - Allows long options to be abbreviated if the
abbreviation is unambiguous (default: @code{True})

@item 
@ref{33f5,,exit_on_error} - Determines whether or not @code{ArgumentParser} exits with
error info when an error occurs. (default: @code{True})

@item 
@ref{33f6,,suggest_on_error} - Enables suggestions for mistyped argument choices
and subparser names (default: @code{False})

@item 
@ref{33f7,,color} - Allow color output (default: @code{True})
@end itemize


Changed in version 3.5: `allow_abbrev' parameter was added.



Changed in version 3.8: In previous versions, `allow_abbrev' also disabled grouping of short
flags such as @code{-vv} to mean @code{-v -v}.



Changed in version 3.9: `exit_on_error' parameter was added.



Changed in version 3.14: `suggest_on_error' and `color' parameters were added.

@end deffn

The following sections describe how each of these are used.

@menu
* prog:: 
* usage:: 
* description:: 
* epilog:: 
* parents:: 
* formatter_class:: 
* prefix_chars:: 
* fromfile_prefix_chars:: 
* argument_default:: 
* allow_abbrev:: 
* conflict_handler:: 
* add_help:: 
* exit_on_error:: 
* suggest_on_error:: 
* color:: 

@end menu

@node prog,usage,,ArgumentParser objects
@anchor{library/argparse id1}@anchor{33f8}@anchor{library/argparse prog}@anchor{1be}
@subsubsection prog


By default, @ref{1bf,,ArgumentParser} calculates the name of the program
to display in help messages depending on the way the Python interpreter was run:


@itemize *

@item 
The @ref{2cb9,,base name} of @code{sys.argv[0]} if a file was
passed as argument.

@item 
The Python interpreter name followed by @code{sys.argv[0]} if a directory or
a zipfile was passed as argument.

@item 
The Python interpreter name followed by @code{-m} followed by the
module or package name if the @ref{23e,,-m} option was used.
@end itemize

This default is almost always desirable because it will make the help messages
match the string that was used to invoke the program on the command line.
However, to change this default behavior, another value can be supplied using
the @code{prog=} argument to @ref{1bf,,ArgumentParser}:

@example
>>> parser = argparse.ArgumentParser(prog='myprogram')
>>> parser.print_help()
usage: myprogram [-h]

options:
 -h, --help  show this help message and exit
@end example

Note that the program name, whether determined from @code{sys.argv[0]},
from the @code{__main__} module attributes or from the
@code{prog=} argument, is available to help messages using the @code{%(prog)s} format
specifier.

@example
>>> parser = argparse.ArgumentParser(prog='myprogram')
>>> parser.add_argument('--foo', help='foo of the %(prog)s program')
>>> parser.print_help()
usage: myprogram [-h] [--foo FOO]

options:
 -h, --help  show this help message and exit
 --foo FOO   foo of the myprogram program
@end example


Changed in version 3.14: The default @code{prog} value now reflects how @code{__main__} was actually executed,
rather than always being @code{os.path.basename(sys.argv[0])}.


@node usage,description,prog,ArgumentParser objects
@anchor{library/argparse usage}@anchor{33eb}
@subsubsection usage


By default, @ref{1bf,,ArgumentParser} calculates the usage message from the
arguments it contains. The default message can be overridden with the
@code{usage=} keyword argument:

@example
>>> parser = argparse.ArgumentParser(prog='PROG', usage='%(prog)s [options]')
>>> parser.add_argument('--foo', nargs='?', help='foo help')
>>> parser.add_argument('bar', nargs='+', help='bar help')
>>> parser.print_help()
usage: PROG [options]

positional arguments:
 bar          bar help

options:
 -h, --help   show this help message and exit
 --foo [FOO]  foo help
@end example

The @code{%(prog)s} format specifier is available to fill in the program name in
your usage messages.

When a custom usage message is specified for the main parser, you may also want to
consider passing  the @code{prog} argument to @ref{e17,,add_subparsers()}
or the @code{prog} and the @code{usage} arguments to
@code{add_parser()}, to ensure consistent command prefixes and
usage information across subparsers.

@node description,epilog,usage,ArgumentParser objects
@anchor{library/argparse description}@anchor{33ec}@anchor{library/argparse id2}@anchor{33f9}
@subsubsection description


Most calls to the @ref{1bf,,ArgumentParser} constructor will use the
@code{description=} keyword argument.  This argument gives a brief description of
what the program does and how it works.  In help messages, the description is
displayed between the command-line usage string and the help messages for the
various arguments.

By default, the description will be line-wrapped so that it fits within the
given space.  To change this behavior, see the @ref{33ef,,formatter_class} argument.

@node epilog,parents,description,ArgumentParser objects
@anchor{library/argparse epilog}@anchor{33ed}
@subsubsection epilog


Some programs like to display additional description of the program after the
description of the arguments.  Such text can be specified using the @code{epilog=}
argument to @ref{1bf,,ArgumentParser}:

@example
>>> parser = argparse.ArgumentParser(
...     description='A foo that bars',
...     epilog="And that's how you'd foo a bar")
>>> parser.print_help()
usage: argparse.py [-h]

A foo that bars

options:
 -h, --help  show this help message and exit

And that's how you'd foo a bar
@end example

As with the @ref{33ec,,description} argument, the @code{epilog=} text is by default
line-wrapped, but this behavior can be adjusted with the @ref{33ef,,formatter_class}
argument to @ref{1bf,,ArgumentParser}.

@node parents,formatter_class,epilog,ArgumentParser objects
@anchor{library/argparse parents}@anchor{33ee}
@subsubsection parents


Sometimes, several parsers share a common set of arguments. Rather than
repeating the definitions of these arguments, a single parser with all the
shared arguments and passed to @code{parents=} argument to @ref{1bf,,ArgumentParser}
can be used.  The @code{parents=} argument takes a list of @code{ArgumentParser}
objects, collects all the positional and optional actions from them, and adds
these actions to the @code{ArgumentParser} object being constructed:

@example
>>> parent_parser = argparse.ArgumentParser(add_help=False)
>>> parent_parser.add_argument('--parent', type=int)

>>> foo_parser = argparse.ArgumentParser(parents=[parent_parser])
>>> foo_parser.add_argument('foo')
>>> foo_parser.parse_args(['--parent', '2', 'XXX'])
Namespace(foo='XXX', parent=2)

>>> bar_parser = argparse.ArgumentParser(parents=[parent_parser])
>>> bar_parser.add_argument('--bar')
>>> bar_parser.parse_args(['--bar', 'YYY'])
Namespace(bar='YYY', parent=None)
@end example

Note that most parent parsers will specify @code{add_help=False}.  Otherwise, the
@ref{1bf,,ArgumentParser} will see two @code{-h/--help} options (one in the parent
and one in the child) and raise an error.

@cartouche
@quotation Note 
You must fully initialize the parsers before passing them via @code{parents=}.
If you change the parent parsers after the child parser, those changes will
not be reflected in the child.
@end quotation
@end cartouche

@node formatter_class,prefix_chars,parents,ArgumentParser objects
@anchor{library/argparse formatter-class}@anchor{33ef}@anchor{library/argparse id3}@anchor{33fa}
@subsubsection formatter_class


@ref{1bf,,ArgumentParser} objects allow the help formatting to be customized by
specifying an alternate formatting class.  Currently, there are four such
classes:

@geindex RawDescriptionHelpFormatter (class in argparse)
@geindex RawTextHelpFormatter (class in argparse)
@geindex ArgumentDefaultsHelpFormatter (class in argparse)
@geindex MetavarTypeHelpFormatter (class in argparse)
@anchor{library/argparse argparse RawDescriptionHelpFormatter}@anchor{33fb}
@deffn {Class} argparse.RawDescriptionHelpFormatter
@anchor{library/argparse argparse RawTextHelpFormatter}@anchor{33fc}
@deffnx {Class} argparse.RawTextHelpFormatter
@anchor{library/argparse argparse ArgumentDefaultsHelpFormatter}@anchor{1c93}
@deffnx {Class} argparse.ArgumentDefaultsHelpFormatter
@anchor{library/argparse argparse MetavarTypeHelpFormatter}@anchor{33fd}
@deffnx {Class} argparse.MetavarTypeHelpFormatter
@end deffn

@ref{33fb,,RawDescriptionHelpFormatter} and @ref{33fc,,RawTextHelpFormatter} give
more control over how textual descriptions are displayed.
By default, @ref{1bf,,ArgumentParser} objects line-wrap the @ref{33ec,,description} and
@ref{33ed,,epilog} texts in command-line help messages:

@example
>>> parser = argparse.ArgumentParser(
...     prog='PROG',
...     description='@w{'}'this description
...         was indented weird
...             but that is okay'@w{'}',
...     epilog='@w{'}'
...             likewise for this epilog whose whitespace will
...         be cleaned up and whose words will be wrapped
...         across a couple lines'@w{'}')
>>> parser.print_help()
usage: PROG [-h]

this description was indented weird but that is okay

options:
 -h, --help  show this help message and exit

likewise for this epilog whose whitespace will be cleaned up and whose words
will be wrapped across a couple lines
@end example

Passing @ref{33fb,,RawDescriptionHelpFormatter} as @code{formatter_class=}
indicates that @ref{33ec,,description} and @ref{33ed,,epilog} are already correctly formatted and
should not be line-wrapped:

@example
>>> parser = argparse.ArgumentParser(
...     prog='PROG',
...     formatter_class=argparse.RawDescriptionHelpFormatter,
...     description=textwrap.dedent('@w{'}'\
...         Please do not mess up this text!
...         --------------------------------
...             I have indented it
...             exactly the way
...             I want it
...         '@w{'}'))
>>> parser.print_help()
usage: PROG [-h]

Please do not mess up this text!
--------------------------------
   I have indented it
   exactly the way
   I want it

options:
 -h, --help  show this help message and exit
@end example

@ref{33fc,,RawTextHelpFormatter} maintains whitespace for all sorts of help text,
including argument descriptions. However, multiple newlines are replaced with
one. If you wish to preserve multiple blank lines, add spaces between the
newlines.

@ref{1c93,,ArgumentDefaultsHelpFormatter} automatically adds information about
default values to each of the argument help messages:

@example
>>> parser = argparse.ArgumentParser(
...     prog='PROG',
...     formatter_class=argparse.ArgumentDefaultsHelpFormatter)
>>> parser.add_argument('--foo', type=int, default=42, help='FOO!')
>>> parser.add_argument('bar', nargs='*', default=[1, 2, 3], help='BAR!')
>>> parser.print_help()
usage: PROG [-h] [--foo FOO] [bar ...]

positional arguments:
 bar         BAR! (default: [1, 2, 3])

options:
 -h, --help  show this help message and exit
 --foo FOO   FOO! (default: 42)
@end example

@ref{33fd,,MetavarTypeHelpFormatter} uses the name of the @ref{33fe,,type} argument for each
argument as the display name for its values (rather than using the @ref{33ff,,dest}
as the regular formatter does):

@example
>>> parser = argparse.ArgumentParser(
...     prog='PROG',
...     formatter_class=argparse.MetavarTypeHelpFormatter)
>>> parser.add_argument('--foo', type=int)
>>> parser.add_argument('bar', type=float)
>>> parser.print_help()
usage: PROG [-h] [--foo int] float

positional arguments:
  float

options:
  -h, --help  show this help message and exit
  --foo int
@end example

@node prefix_chars,fromfile_prefix_chars,formatter_class,ArgumentParser objects
@anchor{library/argparse prefix-chars}@anchor{33f0}
@subsubsection prefix_chars


Most command-line options will use @code{-} as the prefix, e.g. @code{-f/--foo}.
Parsers that need to support different or additional prefix
characters, e.g. for options
like @code{+f} or @code{/foo}, may specify them using the @code{prefix_chars=} argument
to the @ref{1bf,,ArgumentParser} constructor:

@example
>>> parser = argparse.ArgumentParser(prog='PROG', prefix_chars='-+')
>>> parser.add_argument('+f')
>>> parser.add_argument('++bar')
>>> parser.parse_args('+f X ++bar Y'.split())
Namespace(bar='Y', f='X')
@end example

The @code{prefix_chars=} argument defaults to @code{'-'}. Supplying a set of
characters that does not include @code{-} will cause @code{-f/--foo} options to be
disallowed.

@node fromfile_prefix_chars,argument_default,prefix_chars,ArgumentParser objects
@anchor{library/argparse fromfile-prefix-chars}@anchor{33f1}
@subsubsection fromfile_prefix_chars


Sometimes, when dealing with a particularly long argument list, it
may make sense to keep the list of arguments in a file rather than typing it out
at the command line.  If the @code{fromfile_prefix_chars=} argument is given to the
@ref{1bf,,ArgumentParser} constructor, then arguments that start with any of the
specified characters will be treated as files, and will be replaced by the
arguments they contain.  For example:

@example
>>> with open('args.txt', 'w', encoding=sys.getfilesystemencoding()) as fp:
...     fp.write('-f\nbar')
...
>>> parser = argparse.ArgumentParser(fromfile_prefix_chars='@@')
>>> parser.add_argument('-f')
>>> parser.parse_args(['-f', 'foo', '@@args.txt'])
Namespace(f='bar')
@end example

Arguments read from a file must be one per line by default (but see also
@ref{3400,,convert_arg_line_to_args()}) and are treated as if they
were in the same place as the original file referencing argument on the command
line.  So in the example above, the expression @code{['-f', 'foo', '@@args.txt']}
is considered equivalent to the expression @code{['-f', 'foo', '-f', 'bar']}.

@cartouche
@quotation Note 
Each line is treated as a single argument, so an empty line is read as an
empty string (@code{'@w{'}}).
@end quotation
@end cartouche

@ref{1bf,,ArgumentParser} uses @ref{75e,,filesystem encoding and error handler}
to read the file containing arguments.

The @code{fromfile_prefix_chars=} argument defaults to @code{None}, meaning that
arguments will never be treated as file references.


Changed in version 3.12: @ref{1bf,,ArgumentParser} changed encoding and errors to read arguments files
from default (e.g. @ref{75d,,locale.getpreferredencoding(False)}
and @code{"strict"}) to the @ref{75e,,filesystem encoding and error handler}.
Arguments file should be encoded in UTF-8 instead of ANSI Codepage on Windows.


@node argument_default,allow_abbrev,fromfile_prefix_chars,ArgumentParser objects
@anchor{library/argparse argument-default}@anchor{33f2}
@subsubsection argument_default


Generally, argument defaults are specified either by passing a default to
@ref{4bd,,add_argument()} or by calling the
@ref{3401,,set_defaults()} methods with a specific set of name-value
pairs.  Sometimes however, it may be useful to specify a single parser-wide
default for arguments.  This can be accomplished by passing the
@code{argument_default=} keyword argument to @ref{1bf,,ArgumentParser}.  For example,
to globally suppress attribute creation on @ref{33e8,,parse_args()}
calls, we supply @code{argument_default=SUPPRESS}:

@example
>>> parser = argparse.ArgumentParser(argument_default=argparse.SUPPRESS)
>>> parser.add_argument('--foo')
>>> parser.add_argument('bar', nargs='?')
>>> parser.parse_args(['--foo', '1', 'BAR'])
Namespace(bar='BAR', foo='1')
>>> parser.parse_args([])
Namespace()
@end example

@node allow_abbrev,conflict_handler,argument_default,ArgumentParser objects
@anchor{library/argparse allow-abbrev}@anchor{fc5}@anchor{library/argparse id4}@anchor{3402}
@subsubsection allow_abbrev


Normally, when you pass an argument list to the
@ref{33e8,,parse_args()} method of an @ref{1bf,,ArgumentParser},
it @ref{fc4,,recognizes abbreviations} of long options.

This feature can be disabled by setting @code{allow_abbrev} to @code{False}:

@example
>>> parser = argparse.ArgumentParser(prog='PROG', allow_abbrev=False)
>>> parser.add_argument('--foobar', action='store_true')
>>> parser.add_argument('--foonley', action='store_false')
>>> parser.parse_args(['--foon'])
usage: PROG [-h] [--foobar] [--foonley]
PROG: error: unrecognized arguments: --foon
@end example


Added in version 3.5.


@node conflict_handler,add_help,allow_abbrev,ArgumentParser objects
@anchor{library/argparse conflict-handler}@anchor{33f3}
@subsubsection conflict_handler


@ref{1bf,,ArgumentParser} objects do not allow two actions with the same option
string.  By default, @code{ArgumentParser} objects raise an exception if an
attempt is made to create an argument with an option string that is already in
use:

@example
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-f', '--foo', help='old foo help')
>>> parser.add_argument('--foo', help='new foo help')
Traceback (most recent call last):
 ..
ArgumentError: argument --foo: conflicting option string(s): --foo
@end example

Sometimes (e.g. when using @ref{33ee,,parents}) it may be useful to simply override any
older arguments with the same option string.  To get this behavior, the value
@code{'resolve'} can be supplied to the @code{conflict_handler=} argument of
@ref{1bf,,ArgumentParser}:

@example
>>> parser = argparse.ArgumentParser(prog='PROG', conflict_handler='resolve')
>>> parser.add_argument('-f', '--foo', help='old foo help')
>>> parser.add_argument('--foo', help='new foo help')
>>> parser.print_help()
usage: PROG [-h] [-f FOO] [--foo FOO]

options:
 -h, --help  show this help message and exit
 -f FOO      old foo help
 --foo FOO   new foo help
@end example

Note that @ref{1bf,,ArgumentParser} objects only remove an action if all of its
option strings are overridden.  So, in the example above, the old @code{-f/--foo}
action is retained as the @code{-f} action, because only the @code{--foo} option
string was overridden.

@node add_help,exit_on_error,conflict_handler,ArgumentParser objects
@anchor{library/argparse add-help}@anchor{33f4}
@subsubsection add_help


By default, @ref{1bf,,ArgumentParser} objects add an option which simply displays
the parser’s help message. If @code{-h} or @code{--help} is supplied at the command
line, the @code{ArgumentParser} help will be printed.

Occasionally, it may be useful to disable the addition of this help option.
This can be achieved by passing @code{False} as the @code{add_help=} argument to
@ref{1bf,,ArgumentParser}:

@example
>>> parser = argparse.ArgumentParser(prog='PROG', add_help=False)
>>> parser.add_argument('--foo', help='foo help')
>>> parser.print_help()
usage: PROG [--foo FOO]

options:
 --foo FOO  foo help
@end example

The help option is typically @code{-h/--help}. The exception to this is
if the @code{prefix_chars=} is specified and does not include @code{-}, in
which case @code{-h} and @code{--help} are not valid options.  In
this case, the first character in @code{prefix_chars} is used to prefix
the help options:

@example
>>> parser = argparse.ArgumentParser(prog='PROG', prefix_chars='+/')
>>> parser.print_help()
usage: PROG [+h]

options:
  +h, ++help  show this help message and exit
@end example

@node exit_on_error,suggest_on_error,add_help,ArgumentParser objects
@anchor{library/argparse exit-on-error}@anchor{33f5}
@subsubsection exit_on_error


Normally, when you pass an invalid argument list to the @ref{33e8,,parse_args()}
method of an @ref{1bf,,ArgumentParser}, it will print a `message' to @ref{b39,,sys.stderr} and exit with a status
code of 2.

If the user would like to catch errors manually, the feature can be enabled by setting
@code{exit_on_error} to @code{False}:

@example
>>> parser = argparse.ArgumentParser(exit_on_error=False)
>>> parser.add_argument('--integers', type=int)
_StoreAction(option_strings=['--integers'], dest='integers', nargs=None, const=None, default=None, type=<class 'int'>, choices=None, help=None, metavar=None)
>>> try:
...     parser.parse_args('--integers a'.split())
... except argparse.ArgumentError:
...     print('Catching an argumentError')
...
Catching an argumentError
@end example


Added in version 3.9.


@node suggest_on_error,color,exit_on_error,ArgumentParser objects
@anchor{library/argparse suggest-on-error}@anchor{33f6}
@subsubsection suggest_on_error


By default, when a user passes an invalid argument choice or subparser name,
@ref{1bf,,ArgumentParser} will exit with error info and list the permissible
argument choices (if specified) or subparser names as part of the error message.

If the user would like to enable suggestions for mistyped argument choices and
subparser names, the feature can be enabled by setting @code{suggest_on_error} to
@code{True}. Note that this only applies for arguments when the choices specified
are strings:

@example
>>> parser = argparse.ArgumentParser(suggest_on_error=True)
>>> parser.add_argument('--action', choices=['debug', 'dryrun'])
>>> parser.parse_args(['--action', 'debugg'])
usage: tester.py [-h] [--action @{debug,dryrun@}]
tester.py: error: argument --action: invalid choice: 'debugg', maybe you meant 'debug'? (choose from debug, dryrun)
@end example

If you’re writing code that needs to be compatible with older Python versions
and want to opportunistically use @code{suggest_on_error} when it’s available, you
can set it as an attribute after initializing the parser instead of using the
keyword argument:

@example
>>> parser = argparse.ArgumentParser(description='Process some integers.')
>>> parser.suggest_on_error = True
@end example


Added in version 3.14.


@node color,,suggest_on_error,ArgumentParser objects
@anchor{library/argparse color}@anchor{33f7}
@subsubsection color


By default, the help message is printed in color using ANSI escape sequences@footnote{https://en.wikipedia.org/wiki/ANSI_escape_code}.
If you want plain text help messages, you can disable this @ref{1b9,,in your local environment}, or in the argument parser itself
by setting @code{color} to @code{False}:

@example
>>> parser = argparse.ArgumentParser(description='Process some integers.',
...                                  color=False)
>>> parser.add_argument('--action', choices=['sum', 'max'])
>>> parser.add_argument('integers', metavar='N', type=int, nargs='+',
...                     help='an integer for the accumulator')
>>> parser.parse_args(['--help'])
@end example

Note that when @code{color=True}, colored output depends on both environment
variables and terminal capabilities.  However, if @code{color=False}, colored
output is always disabled, even if environment variables like @code{FORCE_COLOR}
are set.

@cartouche
@quotation Note 
Error messages will include color codes when redirecting stderr to a
file. To avoid this, set the NO_COLOR@footnote{https://no-color.org/} or 
@geindex PYTHON_COLORS
@geindex environment variable; PYTHON_COLORS
@ref{476,,PYTHON_COLORS}
environment variable (for example,
@code{NO_COLOR=1 python script.py 2> errors.txt}).
@end quotation
@end cartouche


Added in version 3.14.


@node The add_argument method,The parse_args method,ArgumentParser objects,argparse — Parser for command-line options arguments and subcommands
@anchor{library/argparse the-add-argument-method}@anchor{3403}
@subsubsection The add_argument() method


@geindex add_argument() (argparse.ArgumentParser method)
@anchor{library/argparse argparse ArgumentParser add_argument}@anchor{4bd}
@deffn {Method} ArgumentParser.add_argument (name or flags..., *[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest][, deprecated])

Define how a single command-line argument should be parsed.  Each parameter
has its own more detailed description below, but in short they are:


@itemize *

@item 
@ref{3404,,name or flags} - Either a name or a list of option strings, e.g. @code{'foo'}
or @code{'-f', '--foo'}.

@item 
@ref{196f,,action} - The basic type of action to be taken when this argument is
encountered at the command line.

@item 
@ref{1975,,nargs} - The number of command-line arguments that should be consumed.

@item 
@ref{1977,,const} - A constant value required by some @ref{196f,,action} and @ref{1975,,nargs} selections.

@item 
@ref{1976,,default} - The value produced if the argument is absent from the
command line and if it is absent from the namespace object.

@item 
@ref{33fe,,type} - The type to which the command-line argument should be converted.

@item 
@ref{1971,,choices} - A sequence of the allowable values for the argument.

@item 
@ref{3405,,required} - Whether or not the command-line option may be omitted
(optionals only).

@item 
@ref{3406,,help} - A brief description of what the argument does.

@item 
@ref{3407,,metavar} - A name for the argument in usage messages.

@item 
@ref{33ff,,dest} - The name of the attribute to be added to the object returned by
@ref{33e8,,parse_args()}.

@item 
@ref{3408,,deprecated} - Whether or not use of the argument is deprecated.
@end itemize

The method returns an @ref{1bd0,,Action} object representing the argument.
@end deffn

The following sections describe how each of these are used.

@menu
* name or flags:: 
* action:: 
* nargs:: 
* const:: 
* default:: 
* type:: 
* choices:: 
* required:: 
* help:: 
* metavar:: 
* dest:: 
* deprecated:: 
* Action classes:: 

@end menu

@node name or flags,action,,The add_argument method
@anchor{library/argparse id5}@anchor{3409}@anchor{library/argparse name-or-flags}@anchor{3404}
@subsubsection name or flags


The @ref{4bd,,add_argument()} method must know whether an optional
argument, like @code{-f} or @code{--foo}, or a positional argument, like a list of
filenames, is expected.  The first arguments passed to
@code{add_argument()} must therefore be either a series of
flags, or a simple argument name.

For example, an optional argument could be created like:

@example
>>> parser.add_argument('-f', '--foo')
@end example

while a positional argument could be created like:

@example
>>> parser.add_argument('bar')
@end example

When @ref{33e8,,parse_args()} is called, optional arguments will be
identified by the @code{-} prefix, and the remaining arguments will be assumed to
be positional:

@example
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-f', '--foo')
>>> parser.add_argument('bar')
>>> parser.parse_args(['BAR'])
Namespace(bar='BAR', foo=None)
>>> parser.parse_args(['BAR', '--foo', 'FOO'])
Namespace(bar='BAR', foo='FOO')
>>> parser.parse_args(['--foo', 'FOO'])
usage: PROG [-h] [-f FOO] bar
PROG: error: the following arguments are required: bar
@end example

By default, @code{argparse} automatically handles the internal naming and
display names of arguments, simplifying the process without requiring
additional configuration.
As such, you do not need to specify the @ref{33ff,,dest} and @ref{3407,,metavar} parameters.
For optional arguments, the @ref{33ff,,dest} parameter defaults to the argument name, with
underscores @code{_} replacing hyphens @code{-}. The @ref{3407,,metavar} parameter defaults to
the upper-cased name. For example:

@example
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('--foo-bar')
>>> parser.parse_args(['--foo-bar', 'FOO-BAR'])
Namespace(foo_bar='FOO-BAR')
>>> parser.print_help()
usage:  [-h] [--foo-bar FOO-BAR]

optional arguments:
 -h, --help  show this help message and exit
 --foo-bar FOO-BAR
@end example

@node action,nargs,name or flags,The add_argument method
@anchor{library/argparse action}@anchor{196f}@anchor{library/argparse id6}@anchor{340a}
@subsubsection action


@ref{1bf,,ArgumentParser} objects associate command-line arguments with actions.  These
actions can do just about anything with the command-line arguments associated with
them, though most actions simply add an attribute to the object returned by
@ref{33e8,,parse_args()}.  The @code{action} keyword argument specifies
how the command-line arguments should be handled. The supplied actions are:


@itemize *

@item 
@code{'store'} - This just stores the argument’s value.  This is the default
action.

@item 
@code{'store_const'} - This stores the value specified by the @ref{1977,,const} keyword
argument; note that the @ref{1977,,const} keyword argument defaults to @code{None}.  The
@code{'store_const'} action is most commonly used with optional arguments that
specify some sort of flag.  For example:

@example
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='store_const', const=42)
>>> parser.parse_args(['--foo'])
Namespace(foo=42)
@end example

@item 
@code{'store_true'} and @code{'store_false'} - These are special cases of
@code{'store_const'} that respectively store the values @code{True} and @code{False}
with default values of @code{False} and
@code{True}:

@example
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='store_true')
>>> parser.add_argument('--bar', action='store_false')
>>> parser.add_argument('--baz', action='store_false')
>>> parser.parse_args('--foo --bar'.split())
Namespace(foo=True, bar=False, baz=True)
@end example

@item 
@code{'append'} - This appends each argument value to a list.
It is useful for allowing an option to be specified multiple times.
If the default value is a non-empty list, the parsed value will start
with the default list’s elements and any values from the command line
will be appended after those default values. Example usage:

@example
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append', default=['0'])
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['0', '1', '2'])
@end example

@item 
@code{'append_const'} - This appends the value specified by
the @ref{1977,,const} keyword argument to a list; note that the @ref{1977,,const} keyword
argument defaults to @code{None}. The @code{'append_const'} action is typically
useful when multiple arguments need to store constants to the same list. For
example:

@example
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--str', dest='types', action='append_const', const=str)
>>> parser.add_argument('--int', dest='types', action='append_const', const=int)
>>> parser.parse_args('--str --int'.split())
Namespace(types=[<class 'str'>, <class 'int'>])
@end example

@item 
@code{'extend'} - This appends each item from a multi-value
argument to a list.
The @code{'extend'} action is typically used with the @ref{1975,,nargs} keyword argument
value @code{'+'} or @code{'*'}.
Note that when @ref{1975,,nargs} is @code{None} (the default) or @code{'?'}, each
character of the argument string will be appended to the list.
Example usage:

@example
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument("--foo", action="extend", nargs="+", type=str)
>>> parser.parse_args(["--foo", "f1", "--foo", "f2", "f3", "f4"])
Namespace(foo=['f1', 'f2', 'f3', 'f4'])
@end example


Added in version 3.8.


@item 
@code{'count'} - This counts the number of times an argument occurs. For
example, this is useful for increasing verbosity levels:

@example
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--verbose', '-v', action='count', default=0)
>>> parser.parse_args(['-vvv'])
Namespace(verbose=3)
@end example

Note, the `default' will be @code{None} unless explicitly set to `0'.

@item 
@code{'help'} - This prints a complete help message for all the options in the
current parser and then exits. By default a help action is automatically
added to the parser. See @ref{1bf,,ArgumentParser} for details of how the
output is created.

@item 
@code{'version'} - This expects a @code{version=} keyword argument in the
@ref{4bd,,add_argument()} call, and prints version information
and exits when invoked:

@example
>>> import argparse
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('--version', action='version', version='%(prog)s 2.0')
>>> parser.parse_args(['--version'])
PROG 2.0
@end example
@end itemize

You may also specify an arbitrary action by passing an @ref{1bd0,,Action} subclass
(e.g. @ref{1c35,,BooleanOptionalAction}) or other object that implements the same
interface. Only actions that consume command-line arguments (e.g. @code{'store'},
@code{'append'}, @code{'extend'}, or custom actions with non-zero @code{nargs}) can be used
with positional arguments.

The recommended way to create a custom action is to extend @ref{1bd0,,Action},
overriding the @code{__call__()} method and optionally the @code{__init__()} and
@code{format_usage()} methods. You can also register custom actions using the
@ref{340b,,register()} method and reference them by their registered name.

An example of a custom action:

@example
>>> class FooAction(argparse.Action):
...     def __init__(self, option_strings, dest, nargs=None, **kwargs):
...         if nargs is not None:
...             raise ValueError("nargs not allowed")
...         super().__init__(option_strings, dest, **kwargs)
...     def __call__(self, parser, namespace, values, option_string=None):
...         print('%r %r %r' % (namespace, values, option_string))
...         setattr(namespace, self.dest, values)
...
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action=FooAction)
>>> parser.add_argument('bar', action=FooAction)
>>> args = parser.parse_args('1 --foo 2'.split())
Namespace(bar=None, foo=None) '1' None
Namespace(bar='1', foo=None) '2' '--foo'
>>> args
Namespace(bar='1', foo='2')
@end example

For more details, see @ref{1bd0,,Action}.

@node nargs,const,action,The add_argument method
@anchor{library/argparse id7}@anchor{340c}@anchor{library/argparse nargs}@anchor{1975}
@subsubsection nargs


@ref{1bf,,ArgumentParser} objects usually associate a single command-line argument with a
single action to be taken.  The @code{nargs} keyword argument associates a
different number of command-line arguments with a single action.
See also @ref{340d,,Specifying ambiguous arguments}. The supported values are:


@itemize *

@item 
@code{N} (an integer).  @code{N} arguments from the command line will be gathered
together into a list.  For example:

@example
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', nargs=2)
>>> parser.add_argument('bar', nargs=1)
>>> parser.parse_args('c --foo a b'.split())
Namespace(bar=['c'], foo=['a', 'b'])
@end example

Note that @code{nargs=1} produces a list of one item.  This is different from
the default, in which the item is produced by itself.
@end itemize

@geindex ? (question mark); in argparse module


@itemize *

@item 
@code{'?'}. One argument will be consumed from the command line if possible, and
produced as a single item.  If no command-line argument is present, the value from
@ref{1976,,default} will be produced.  Note that for optional arguments, there is an
additional case - the option string is present but not followed by a
command-line argument.  In this case the value from @ref{1977,,const} will be produced.  Some
examples to illustrate this:

@example
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', nargs='?', const='c', default='d')
>>> parser.add_argument('bar', nargs='?', default='d')
>>> parser.parse_args(['XX', '--foo', 'YY'])
Namespace(bar='XX', foo='YY')
>>> parser.parse_args(['XX', '--foo'])
Namespace(bar='XX', foo='c')
>>> parser.parse_args([])
Namespace(bar='d', foo='d')
@end example

One of the more common uses of @code{nargs='?'} is to allow optional input and
output files:

@example
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('infile', nargs='?')
>>> parser.add_argument('outfile', nargs='?')
>>> parser.parse_args(['input.txt', 'output.txt'])
Namespace(infile='input.txt', outfile='output.txt')
>>> parser.parse_args(['input.txt'])
Namespace(infile='input.txt', outfile=None)
>>> parser.parse_args([])
Namespace(infile=None, outfile=None)
@end example
@end itemize

@geindex * (asterisk); in argparse module


@itemize *

@item 
@code{'*'}.  All command-line arguments present are gathered into a list.  Note that
it generally doesn’t make much sense to have more than one positional argument
with @code{nargs='*'}, but multiple optional arguments with @code{nargs='*'} is
possible.  For example:

@example
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', nargs='*')
>>> parser.add_argument('--bar', nargs='*')
>>> parser.add_argument('baz', nargs='*')
>>> parser.parse_args('a b --foo x y --bar 1 2'.split())
Namespace(bar=['1', '2'], baz=['a', 'b'], foo=['x', 'y'])
@end example
@end itemize

@geindex + (plus); in argparse module


@itemize *

@item 
@code{'+'}. Just like @code{'*'}, all command-line arguments present are gathered into a
list.  Additionally, an error message will be generated if there wasn’t at
least one command-line argument present.  For example:

@example
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('foo', nargs='+')
>>> parser.parse_args(['a', 'b'])
Namespace(foo=['a', 'b'])
>>> parser.parse_args([])
usage: PROG [-h] foo [foo ...]
PROG: error: the following arguments are required: foo
@end example
@end itemize

If the @code{nargs} keyword argument is not provided, the number of arguments consumed
is determined by the @ref{196f,,action}.  Generally this means a single command-line argument
will be consumed and a single item (not a list) will be produced.
Actions that do not consume command-line arguments (e.g.
@code{'store_const'}) set @code{nargs=0}.

@node const,default,nargs,The add_argument method
@anchor{library/argparse const}@anchor{1977}@anchor{library/argparse id8}@anchor{340e}
@subsubsection const


The @code{const} argument of @ref{4bd,,add_argument()} is used to hold
constant values that are not read from the command line but are required for
the various @ref{1bf,,ArgumentParser} actions.  The two most common uses of it are:


@itemize *

@item 
When @ref{4bd,,add_argument()} is called with
@code{action='store_const'} or @code{action='append_const'}.  These actions add the
@code{const} value to one of the attributes of the object returned by
@ref{33e8,,parse_args()}. See the @ref{196f,,action} description for examples.
If @code{const} is not provided to @code{add_argument()}, it will
receive a default value of @code{None}.

@item 
When @ref{4bd,,add_argument()} is called with option strings
(like @code{-f} or @code{--foo}) and @code{nargs='?'}.  This creates an optional
argument that can be followed by zero or one command-line arguments.
When parsing the command line, if the option string is encountered with no
command-line argument following it, the value from @code{const} will be used.
See the @ref{1975,,nargs} description for examples.
@end itemize


Changed in version 3.11: @code{const=None} by default, including when @code{action='append_const'} or
@code{action='store_const'}.


@node default,type,const,The add_argument method
@anchor{library/argparse default}@anchor{1976}@anchor{library/argparse id9}@anchor{340f}
@subsubsection default


All optional arguments and some positional arguments may be omitted at the
command line.  The @code{default} keyword argument of
@ref{4bd,,add_argument()}, whose value defaults to @code{None},
specifies what value should be used if the command-line argument is not present.
For optional arguments, the @code{default} value is used when the option string
was not present at the command line:

@example
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', default=42)
>>> parser.parse_args(['--foo', '2'])
Namespace(foo='2')
>>> parser.parse_args([])
Namespace(foo=42)
@end example

If the target namespace already has an attribute set, the action `default'
will not overwrite it:

@example
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', default=42)
>>> parser.parse_args([], namespace=argparse.Namespace(foo=101))
Namespace(foo=101)
@end example

If the @code{default} value is a string, the parser parses the value as if it
were a command-line argument.  In particular, the parser applies any @ref{33fe,,type}
conversion argument, if provided, before setting the attribute on the
@ref{33e9,,Namespace} return value.  Otherwise, the parser uses the value as is:

@example
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--length', default='10', type=int)
>>> parser.add_argument('--width', default=10.5, type=int)
>>> parser.parse_args()
Namespace(length=10, width=10.5)
@end example

For positional arguments with @ref{1975,,nargs} equal to @code{?} or @code{*}, the @code{default} value
is used when no command-line argument was present:

@example
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('foo', nargs='?', default=42)
>>> parser.parse_args(['a'])
Namespace(foo='a')
>>> parser.parse_args([])
Namespace(foo=42)
@end example

Because @code{nargs='*'} gathers any supplied values into a list, an absent
positional argument yields an empty list (@code{[]}). Only a non-@code{None}
`default' overrides this (so @code{default=None} still gives @code{[]}).

For @ref{3405,,required} arguments, the @code{default} value is ignored. For example, this
applies to positional arguments with @ref{1975,,nargs} values other than @code{?} or @code{*},
or optional arguments marked as @code{required=True}.

Providing @code{default=argparse.SUPPRESS} causes no attribute to be added if the
command-line argument was not present:

@example
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', default=argparse.SUPPRESS)
>>> parser.parse_args([])
Namespace()
>>> parser.parse_args(['--foo', '1'])
Namespace(foo='1')
@end example

@node type,choices,default,The add_argument method
@anchor{library/argparse argparse-type}@anchor{3410}@anchor{library/argparse type}@anchor{33fe}
@subsubsection type


By default, the parser reads command-line arguments in as simple
strings. However, quite often the command-line string should instead be
interpreted as another type, such as a @ref{197,,float} or @ref{19c,,int}.  The
@code{type} keyword for @ref{4bd,,add_argument()} allows any
necessary type-checking and type conversions to be performed.

If the @ref{33fe,,type} keyword is used with the @ref{1976,,default} keyword, the type converter
is only applied if the default is a string.

The argument to @code{type} can be a callable that accepts a single string or
the name of a registered type (see @ref{340b,,register()})
If the function raises @ref{3411,,ArgumentTypeError}, @ref{199,,TypeError}, or
@ref{2ee,,ValueError}, the exception is caught and a nicely formatted error
message is displayed. Other exception types are not handled.

Common built-in types and functions can be used as type converters:

@example
import argparse
import pathlib

parser = argparse.ArgumentParser()
parser.add_argument('count', type=int)
parser.add_argument('distance', type=float)
parser.add_argument('street', type=ascii)
parser.add_argument('code_point', type=ord)
parser.add_argument('datapath', type=pathlib.Path)
@end example

User defined functions can be used as well:

@example
>>> def hyphenated(string):
...     return '-'.join([word[:4] for word in string.casefold().split()])
...
>>> parser = argparse.ArgumentParser()
>>> _ = parser.add_argument('short_title', type=hyphenated)
>>> parser.parse_args(['"The Tale of Two Cities"'])
Namespace(short_title='"the-tale-of-two-citi')
@end example

The @ref{3c1,,bool()} function is not recommended as a type converter.  All it does
is convert empty strings to @code{False} and non-empty strings to @code{True}.
This is usually not what is desired:

@example
>>> parser = argparse.ArgumentParser()
>>> _ = parser.add_argument('--verbose', type=bool)
>>> parser.parse_args(['--verbose', 'False'])
Namespace(verbose=True)
@end example

See @ref{1c35,,BooleanOptionalAction} or @code{action='store_true'} for common
alternatives.

In general, the @code{type} keyword is a convenience that should only be used for
simple conversions that can only raise one of the three supported exceptions.
Anything with more interesting error-handling or resource management should be
done downstream after the arguments are parsed.

For example, JSON or YAML conversions have complex error cases that require
better reporting than can be given by the @code{type} keyword.  A
@ref{1028,,JSONDecodeError} would not be well formatted and a
@ref{266,,FileNotFoundError} exception would not be handled at all.

Even @ref{30e,,FileType} has its limitations for use with the @code{type}
keyword.  If one argument uses @code{FileType} and then a
subsequent argument fails, an error is reported but the file is not
automatically closed.  In this case, it would be better to wait until after
the parser has run and then use the @ref{187,,with}-statement to manage the
files.

For type checkers that simply check against a fixed set of values, consider
using the @ref{1971,,choices} keyword instead.

@node choices,required,type,The add_argument method
@anchor{library/argparse choices}@anchor{1971}@anchor{library/argparse id10}@anchor{3412}
@subsubsection choices


Some command-line arguments should be selected from a restricted set of values.
These can be handled by passing a sequence object as the `choices' keyword
argument to @ref{4bd,,add_argument()}.  When the command line is
parsed, argument values will be checked, and an error message will be displayed
if the argument was not one of the acceptable values:

@example
>>> parser = argparse.ArgumentParser(prog='game.py')
>>> parser.add_argument('move', choices=['rock', 'paper', 'scissors'])
>>> parser.parse_args(['rock'])
Namespace(move='rock')
>>> parser.parse_args(['fire'])
usage: game.py [-h] @{rock,paper,scissors@}
game.py: error: argument move: invalid choice: 'fire' (choose from 'rock',
'paper', 'scissors')
@end example

Any sequence can be passed as the `choices' value, so @ref{24f,,list} objects,
@ref{614,,tuple} objects, and custom sequences are all supported.

Use of @ref{843,,enum.Enum} is not recommended because it is difficult to
control its appearance in usage, help, and error messages.

Note that `choices' are checked after any @ref{33fe,,type}
conversions have been performed, so objects in `choices'
should match the @ref{33fe,,type} specified. This can make `choices'
appear unfamiliar in usage, help, or error messages.

To keep `choices' user-friendly, consider a custom type wrapper that
converts and formats values, or omit @ref{33fe,,type} and handle conversion in
your application code.

Formatted choices override the default `metavar' which is normally derived
from `dest'.  This is usually what you want because the user never sees the
`dest' parameter.  If this display isn’t desirable (perhaps because there are
many choices), just specify an explicit @ref{3407,,metavar}.

@node required,help,choices,The add_argument method
@anchor{library/argparse id11}@anchor{3413}@anchor{library/argparse required}@anchor{3405}
@subsubsection required


In general, the @code{argparse} module assumes that flags like @code{-f} and @code{--bar}
indicate `optional' arguments, which can always be omitted at the command line.
To make an option `required', @code{True} can be specified for the @code{required=}
keyword argument to @ref{4bd,,add_argument()}:

@example
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', required=True)
>>> parser.parse_args(['--foo', 'BAR'])
Namespace(foo='BAR')
>>> parser.parse_args([])
usage: [-h] --foo FOO
: error: the following arguments are required: --foo
@end example

As the example shows, if an option is marked as @code{required},
@ref{33e8,,parse_args()} will report an error if that option is not
present at the command line.

@cartouche
@quotation Note 
Required options are generally considered bad form because users expect
`options' to be `optional', and thus they should be avoided when possible.
@end quotation
@end cartouche

@node help,metavar,required,The add_argument method
@anchor{library/argparse help}@anchor{3406}@anchor{library/argparse id12}@anchor{3414}
@subsubsection help


The @code{help} value is a string containing a brief description of the argument.
When a user requests help (usually by using @code{-h} or @code{--help} at the
command line), these @code{help} descriptions will be displayed with each
argument.

The @code{help} strings can include various format specifiers to avoid repetition
of things like the program name or the argument @ref{1976,,default}.  The available
specifiers include the program name, @code{%(prog)s} and most keyword arguments to
@ref{4bd,,add_argument()}, e.g. @code{%(default)s}, @code{%(type)s}, etc.:

@example
>>> parser = argparse.ArgumentParser(prog='frobble')
>>> parser.add_argument('bar', nargs='?', type=int, default=42,
...                     help='the bar to %(prog)s (default: %(default)s)')
>>> parser.print_help()
usage: frobble [-h] [bar]

positional arguments:
 bar     the bar to frobble (default: 42)

options:
 -h, --help  show this help message and exit
@end example

As the help string supports %-formatting, if you want a literal @code{%} to appear
in the help string, you must escape it as @code{%%}.

@code{argparse} supports silencing the help entry for certain options, by
setting the @code{help} value to @code{argparse.SUPPRESS}:

@example
>>> parser = argparse.ArgumentParser(prog='frobble')
>>> parser.add_argument('--foo', help=argparse.SUPPRESS)
>>> parser.print_help()
usage: frobble [-h]

options:
  -h, --help  show this help message and exit
@end example

@node metavar,dest,help,The add_argument method
@anchor{library/argparse id13}@anchor{3415}@anchor{library/argparse metavar}@anchor{3407}
@subsubsection metavar


When @ref{1bf,,ArgumentParser} generates help messages, it needs some way to refer
to each expected argument.  By default, @code{ArgumentParser} objects use the @ref{33ff,,dest}
value as the “name” of each object.  By default, for positional argument
actions, the @ref{33ff,,dest} value is used directly, and for optional argument actions,
the @ref{33ff,,dest} value is uppercased.  So, a single positional argument with
@code{dest='bar'} will be referred to as @code{bar}. A single
optional argument @code{--foo} that should be followed by a single command-line argument
will be referred to as @code{FOO}.  An example:

@example
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo')
>>> parser.add_argument('bar')
>>> parser.parse_args('X --foo Y'.split())
Namespace(bar='X', foo='Y')
>>> parser.print_help()
usage:  [-h] [--foo FOO] bar

positional arguments:
 bar

options:
 -h, --help  show this help message and exit
 --foo FOO
@end example

An alternative name can be specified with @code{metavar}:

@example
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', metavar='YYY')
>>> parser.add_argument('bar', metavar='XXX')
>>> parser.parse_args('X --foo Y'.split())
Namespace(bar='X', foo='Y')
>>> parser.print_help()
usage:  [-h] [--foo YYY] XXX

positional arguments:
 XXX

options:
 -h, --help  show this help message and exit
 --foo YYY
@end example

Note that @code{metavar} only changes the `displayed' name - the name of the
attribute on the @ref{33e8,,parse_args()} object is still determined
by the @ref{33ff,,dest} value.

Different values of @code{nargs} may cause the metavar to be used multiple times.
Providing a tuple to @code{metavar} specifies a different display for each of the
arguments:

@example
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-x', nargs=2)
>>> parser.add_argument('--foo', nargs=2, metavar=('bar', 'baz'))
>>> parser.print_help()
usage: PROG [-h] [-x X X] [--foo bar baz]

options:
 -h, --help     show this help message and exit
 -x X X
 --foo bar baz
@end example

@node dest,deprecated,metavar,The add_argument method
@anchor{library/argparse dest}@anchor{33ff}@anchor{library/argparse id14}@anchor{3416}
@subsubsection dest


Most @ref{1bf,,ArgumentParser} actions add some value as an attribute of the
object returned by @ref{33e8,,parse_args()}.  The name of this
attribute is determined by the @code{dest} keyword argument of
@ref{4bd,,add_argument()}.  For positional argument actions,
@code{dest} is normally supplied as the first argument to
@code{add_argument()}:

@example
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('bar')
>>> parser.parse_args(['XXX'])
Namespace(bar='XXX')
@end example

For optional argument actions, the value of @code{dest} is normally inferred from
the option strings.  @ref{1bf,,ArgumentParser} generates the value of @code{dest} by
taking the first long option string and stripping away the initial @code{--}
string.  If no long option strings were supplied, @code{dest} will be derived from
the first short option string by stripping the initial @code{-} character.  Any
internal @code{-} characters will be converted to @code{_} characters to make sure
the string is a valid attribute name.  The examples below illustrate this
behavior:

@example
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('-f', '--foo-bar', '--foo')
>>> parser.add_argument('-x', '-y')
>>> parser.parse_args('-f 1 -x 2'.split())
Namespace(foo_bar='1', x='2')
>>> parser.parse_args('--foo 1 -y 2'.split())
Namespace(foo_bar='1', x='2')
@end example

@code{dest} allows a custom attribute name to be provided:

@example
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', dest='bar')
>>> parser.parse_args('--foo XXX'.split())
Namespace(bar='XXX')
@end example

Multiple arguments may share the same @code{dest}.  By default, the value from the
last such argument given on the command line wins.  Use @code{action='append'} to
collect values from all of them into a list instead.  For conflicting `option
strings' rather than @code{dest} names, see @ref{33f3,,conflict_handler}.

@node deprecated,Action classes,dest,The add_argument method
@anchor{library/argparse deprecated}@anchor{3408}@anchor{library/argparse id15}@anchor{3417}
@subsubsection deprecated


During a project’s lifetime, some arguments may need to be removed from the
command line. Before removing them, you should inform
your users that the arguments are deprecated and will be removed.
The @code{deprecated} keyword argument of
@ref{4bd,,add_argument()}, which defaults to @code{False},
specifies if the argument is deprecated and will be removed
in the future.
For arguments, if @code{deprecated} is @code{True}, then a warning will be
printed to @ref{b39,,sys.stderr} when the argument is used:

@example
>>> import argparse
>>> parser = argparse.ArgumentParser(prog='snake.py')
>>> parser.add_argument('--legs', default=0, type=int, deprecated=True)
>>> parser.parse_args([])
Namespace(legs=0)
>>> parser.parse_args(['--legs', '4'])
snake.py: warning: option '--legs' is deprecated
Namespace(legs=4)
@end example


Added in version 3.13.


@node Action classes,,deprecated,The add_argument method
@anchor{library/argparse action-classes}@anchor{3418}
@subsubsection Action classes


@code{Action} classes implement the Action API, a callable which returns a callable
which processes arguments from the command-line. Any object which follows
this API may be passed as the @code{action} parameter to
@ref{4bd,,add_argument()}.

@geindex Action (class in argparse)
@anchor{library/argparse argparse Action}@anchor{1bd0}
@deffn {Class} argparse.Action (option_strings, dest, nargs=None, const=None, default=None, type=None, choices=None, required=False, help=None, metavar=None)

@code{Action} objects are used by an @ref{1bf,,ArgumentParser} to represent the information
needed to parse a single argument from one or more strings from the
command line. The @code{Action} class must accept the two positional arguments
plus any keyword arguments passed to @ref{4bd,,ArgumentParser.add_argument()}
except for the @code{action} itself.

Instances of @code{Action} (or return value of any callable to the
@code{action} parameter) should have attributes @code{dest},
@code{option_strings}, @code{default}, @code{type}, @code{required},
@code{help}, etc. defined. The easiest way to ensure these attributes
are defined is to call @code{Action.__init__()}.

@geindex __call__() (argparse.Action method)
@anchor{library/argparse argparse Action __call__}@anchor{3419}
@deffn {Method} __call__ (parser, namespace, values, option_string=None)

@code{Action} instances should be callable, so subclasses must override the
@code{__call__()} method, which should accept four parameters:


@itemize *

@item 
`parser' - The @ref{1bf,,ArgumentParser} object which contains this action.

@item 
`namespace' - The @ref{33e9,,Namespace} object that will be returned by
@ref{33e8,,parse_args()}.  Most actions add an attribute to this
object using @ref{2605,,setattr()}.

@item 
`values' - The associated command-line arguments, with any type conversions
applied.  Type conversions are specified with the @ref{33fe,,type} keyword argument to
@ref{4bd,,add_argument()}.

@item 
`option_string' - The option string that was used to invoke this action.
The @code{option_string} argument is optional, and will be absent if the action
is associated with a positional argument.
@end itemize

The @code{__call__()} method may perform arbitrary actions, but will typically set
attributes on the @code{namespace} based on @code{dest} and @code{values}.
@end deffn

@geindex format_usage() (argparse.Action method)
@anchor{library/argparse argparse Action format_usage}@anchor{341a}
@deffn {Method} format_usage ()

@code{Action} subclasses can define a @code{format_usage()} method that takes no argument
and return a string which will be used when printing the usage of the program.
If such method is not provided, a sensible default will be used.
@end deffn
@end deffn

@geindex BooleanOptionalAction (class in argparse)
@anchor{library/argparse argparse BooleanOptionalAction}@anchor{1c35}
@deffn {Class} argparse.BooleanOptionalAction

A subclass of @ref{1bd0,,Action} for handling boolean flags with positive
and negative options. Adding a single argument such as @code{--foo} automatically
creates both @code{--foo} and @code{--no-foo} options, storing @code{True} and @code{False}
respectively:

@example
>>> import argparse
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action=argparse.BooleanOptionalAction)
>>> parser.parse_args(['--no-foo'])
Namespace(foo=False)
@end example


Added in version 3.9.

@end deffn

@node The parse_args method,Other utilities,The add_argument method,argparse — Parser for command-line options arguments and subcommands
@anchor{library/argparse the-parse-args-method}@anchor{341b}
@subsubsection The parse_args() method


@geindex parse_args() (argparse.ArgumentParser method)
@anchor{library/argparse argparse ArgumentParser parse_args}@anchor{33e8}
@deffn {Method} ArgumentParser.parse_args (args=None, namespace=None)

Convert argument strings to objects and assign them as attributes of the
namespace.  Return the populated namespace.

Previous calls to @ref{4bd,,add_argument()} determine exactly what objects are
created and how they are assigned. See the documentation for
@code{add_argument()} for details.


@itemize *

@item 
@ref{341c,,args} - List of strings to parse.  The default is taken from
@ref{1470,,sys.argv}.

@item 
@ref{341d,,namespace} - An object to take the attributes.  The default is a new empty
@ref{33e9,,Namespace} object.
@end itemize
@end deffn

@menu
* Option value syntax:: 
* Invalid arguments:: 
* Arguments containing -:: 
* Argument abbreviations (prefix matching): Argument abbreviations prefix matching. 
* Beyond sys.argv: Beyond sys argv. 
* The Namespace object:: 

@end menu

@node Option value syntax,Invalid arguments,,The parse_args method
@anchor{library/argparse option-value-syntax}@anchor{341e}
@subsubsection Option value syntax


The @ref{33e8,,parse_args()} method supports several ways of
specifying the value of an option (if it takes one).  In the simplest case, the
option and its value are passed as two separate arguments:

@example
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-x')
>>> parser.add_argument('--foo')
>>> parser.parse_args(['-x', 'X'])
Namespace(foo=None, x='X')
>>> parser.parse_args(['--foo', 'FOO'])
Namespace(foo='FOO', x=None)
@end example

For long options (options with names longer than a single character), the option
and value can also be passed as a single command-line argument, using @code{=} to
separate them:

@example
>>> parser.parse_args(['--foo=FOO'])
Namespace(foo='FOO', x=None)
@end example

For short options (options only one character long), the option and its value
can be concatenated:

@example
>>> parser.parse_args(['-xX'])
Namespace(foo=None, x='X')
@end example

Several short options can be joined together, using only a single @code{-} prefix,
as long as only the last option (or none of them) requires a value:

@example
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-x', action='store_true')
>>> parser.add_argument('-y', action='store_true')
>>> parser.add_argument('-z')
>>> parser.parse_args(['-xyzZ'])
Namespace(x=True, y=True, z='Z')
@end example

@node Invalid arguments,Arguments containing -,Option value syntax,The parse_args method
@anchor{library/argparse invalid-arguments}@anchor{341f}
@subsubsection Invalid arguments


While parsing the command line, @ref{33e8,,parse_args()} checks for a
variety of errors, including ambiguous options, invalid types, invalid options,
wrong number of positional arguments, etc.  When it encounters such an error,
it exits and prints the error along with a usage message:

@example
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('--foo', type=int)
>>> parser.add_argument('bar', nargs='?')

>>> # invalid type
>>> parser.parse_args(['--foo', 'spam'])
usage: PROG [-h] [--foo FOO] [bar]
PROG: error: argument --foo: invalid int value: 'spam'

>>> # invalid option
>>> parser.parse_args(['--bar'])
usage: PROG [-h] [--foo FOO] [bar]
PROG: error: no such option: --bar

>>> # wrong number of arguments
>>> parser.parse_args(['spam', 'badger'])
usage: PROG [-h] [--foo FOO] [bar]
PROG: error: extra arguments found: badger
@end example

@node Arguments containing -,Argument abbreviations prefix matching,Invalid arguments,The parse_args method
@anchor{library/argparse arguments-containing}@anchor{3420}
@subsubsection Arguments containing @code{-}


The @ref{33e8,,parse_args()} method attempts to give errors whenever
the user has clearly made a mistake, but some situations are inherently
ambiguous.  For example, the command-line argument @code{-1} could either be an
attempt to specify an option or an attempt to provide a positional argument.
The @code{parse_args()} method is cautious here: positional
arguments may only begin with @code{-} if they look like negative numbers and
there are no options in the parser that look like negative numbers:

@example
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-x')
>>> parser.add_argument('foo', nargs='?')

>>> # no negative number options, so -1 is a positional argument
>>> parser.parse_args(['-x', '-1'])
Namespace(foo=None, x='-1')

>>> # no negative number options, so -1 and -5 are positional arguments
>>> parser.parse_args(['-x', '-1', '-5'])
Namespace(foo='-5', x='-1')

>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-1', dest='one')
>>> parser.add_argument('foo', nargs='?')

>>> # negative number options present, so -1 is an option
>>> parser.parse_args(['-1', 'X'])
Namespace(foo=None, one='X')

>>> # negative number options present, so -2 is an option
>>> parser.parse_args(['-2'])
usage: PROG [-h] [-1 ONE] [foo]
PROG: error: no such option: -2

>>> # negative number options present, so both -1s are options
>>> parser.parse_args(['-1', '-1'])
usage: PROG [-h] [-1 ONE] [foo]
PROG: error: argument -1: expected one argument
@end example

If you have positional arguments that must begin with @code{-} and don’t look
like negative numbers, you can insert the pseudo-argument @code{'--'} which tells
@ref{33e8,,parse_args()} that everything after that is a positional
argument:

@example
>>> parser.parse_args(['--', '-f'])
Namespace(foo='-f', one=None)
@end example

See also @ref{340d,,the argparse howto on ambiguous arguments}
for more details.

@node Argument abbreviations prefix matching,Beyond sys argv,Arguments containing -,The parse_args method
@anchor{library/argparse argument-abbreviations-prefix-matching}@anchor{3421}@anchor{library/argparse prefix-matching}@anchor{fc4}
@subsubsection Argument abbreviations (prefix matching)


The @ref{33e8,,parse_args()} method @ref{fc5,,by default}
allows long options to be abbreviated to a prefix, if the abbreviation is
unambiguous (the prefix matches a unique option):

@example
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-bacon')
>>> parser.add_argument('-badger')
>>> parser.parse_args('-bac MMM'.split())
Namespace(bacon='MMM', badger=None)
>>> parser.parse_args('-bad WOOD'.split())
Namespace(bacon=None, badger='WOOD')
>>> parser.parse_args('-ba BA'.split())
usage: PROG [-h] [-bacon BACON] [-badger BADGER]
PROG: error: ambiguous option: -ba could match -badger, -bacon
@end example

An error is produced for arguments that could produce more than one options.
This feature can be disabled by setting @ref{fc5,,allow_abbrev} to @code{False}.

@node Beyond sys argv,The Namespace object,Argument abbreviations prefix matching,The parse_args method
@anchor{library/argparse args}@anchor{341c}@anchor{library/argparse beyond-sys-argv}@anchor{3422}
@subsubsection Beyond @code{sys.argv}


Sometimes it may be useful to have an @ref{1bf,,ArgumentParser} parse arguments other than those
of @ref{1470,,sys.argv}.  This can be accomplished by passing a list of strings to
@ref{33e8,,parse_args()}.  This is useful for testing at the
interactive prompt:

@example
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument(
...     'integers', metavar='int', type=int, choices=range(10),
...     nargs='+', help='an integer in the range 0..9')
>>> parser.add_argument(
...     '--sum', dest='accumulate', action='store_const', const=sum,
...     default=max, help='sum the integers (default: find the max)')
>>> parser.parse_args(['1', '2', '3', '4'])
Namespace(accumulate=<built-in function max>, integers=[1, 2, 3, 4])
>>> parser.parse_args(['1', '2', '3', '4', '--sum'])
Namespace(accumulate=<built-in function sum>, integers=[1, 2, 3, 4])
@end example

@node The Namespace object,,Beyond sys argv,The parse_args method
@anchor{library/argparse namespace}@anchor{341d}@anchor{library/argparse the-namespace-object}@anchor{3423}
@subsubsection The Namespace object


@geindex Namespace (class in argparse)
@anchor{library/argparse argparse Namespace}@anchor{33e9}
@deffn {Class} argparse.Namespace

Simple class used by default by @ref{33e8,,parse_args()} to create
an object holding attributes and return it.

This class is deliberately simple, just an @ref{c84,,object} subclass with a
readable string representation. If you prefer to have dict-like view of the
attributes, you can use the standard Python idiom, @ref{1e65,,vars()}:

@example
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo')
>>> args = parser.parse_args(['--foo', 'BAR'])
>>> vars(args)
@{'foo': 'BAR'@}
@end example

It may also be useful to have an @ref{1bf,,ArgumentParser} assign attributes to an
already existing object, rather than a new @code{Namespace} object.  This can
be achieved by specifying the @code{namespace=} keyword argument:

@example
>>> class C:
...     pass
...
>>> c = C()
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo')
>>> parser.parse_args(args=['--foo', 'BAR'], namespace=c)
>>> c.foo
'BAR'
@end example
@end deffn

@node Other utilities,Exceptions<11>,The parse_args method,argparse — Parser for command-line options arguments and subcommands
@anchor{library/argparse other-utilities}@anchor{3424}
@subsubsection Other utilities


@menu
* Subcommands:: 
* FileType objects:: 
* Argument groups:: 
* Mutual exclusion:: 
* Parser defaults:: 
* Printing help:: 
* Partial parsing:: 
* Customizing file parsing:: 
* Exiting methods:: 
* Intermixed parsing:: 
* Registering custom types or actions:: 

@end menu

@node Subcommands,FileType objects,,Other utilities
@anchor{library/argparse subcommands}@anchor{3425}
@subsubsection Subcommands


@geindex add_subparsers() (argparse.ArgumentParser method)
@anchor{library/argparse argparse ArgumentParser add_subparsers}@anchor{e17}
@deffn {Method} ArgumentParser.add_subparsers (*[, title][, description][, prog][, parser_class][, action][, dest][, required][, help][, metavar])

Many programs split up their functionality into a number of subcommands,
for example, the @code{svn} program can invoke subcommands like @code{svn
checkout}, @code{svn update}, and @code{svn commit}.  Splitting up functionality
this way can be a particularly good idea when a program performs several
different functions which require different kinds of command-line arguments.
@ref{1bf,,ArgumentParser} supports the creation of such subcommands with the
@code{add_subparsers()} method.  The @code{add_subparsers()} method is normally
called with no arguments and returns a special action object.  This object
has a single method, @code{add_parser()}, which takes a
command name and any @code{ArgumentParser} constructor arguments, and
returns an @code{ArgumentParser} object that can be modified as usual.

Description of parameters:


@itemize *

@item 
`title' - title for the sub-parser group in help output; by default
“subcommands” if description is provided, otherwise uses title for
positional arguments

@item 
`description' - description for the sub-parser group in help output, by
default @code{None}

@item 
`prog' - usage information that will be displayed with subcommand help,
by default the name of the program and any positional arguments before the
subparser argument

@item 
`parser_class' - class which will be used to create sub-parser instances, by
default the class of the current parser (e.g. @ref{1bf,,ArgumentParser})

@item 
@ref{196f,,action} - the basic type of action to be taken when this argument is
encountered at the command line

@item 
@ref{33ff,,dest} - name of the attribute under which subcommand name will be
stored; by default @code{None} and no value is stored

@item 
@ref{3405,,required} - Whether or not a subcommand must be provided, by default
@code{False} (added in 3.7)

@item 
@ref{3406,,help} - help for sub-parser group in help output, by default @code{None}

@item 
@ref{3407,,metavar} - string presenting available subcommands in help; by default it
is @code{None} and presents subcommands in form @{cmd1, cmd2, ..@}
@end itemize

Some example usage:

@example
>>> # create the top-level parser
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('--foo', action='store_true', help='foo help')
>>> subparsers = parser.add_subparsers(help='subcommand help')
>>>
>>> # create the parser for the "a" command
>>> parser_a = subparsers.add_parser('a', help='a help')
>>> parser_a.add_argument('bar', type=int, help='bar help')
>>>
>>> # create the parser for the "b" command
>>> parser_b = subparsers.add_parser('b', help='b help')
>>> parser_b.add_argument('--baz', choices=('X', 'Y', 'Z'), help='baz help')
>>>
>>> # parse some argument lists
>>> parser.parse_args(['a', '12'])
Namespace(bar=12, foo=False)
>>> parser.parse_args(['--foo', 'b', '--baz', 'Z'])
Namespace(baz='Z', foo=True)
@end example

Note that the object returned by @ref{33e8,,parse_args()} will only contain
attributes for the main parser and the subparser that was selected by the
command line (and not any other subparsers).  So in the example above, when
the @code{a} command is specified, only the @code{foo} and @code{bar} attributes are
present, and when the @code{b} command is specified, only the @code{foo} and
@code{baz} attributes are present.

If a subparser defines an argument with the same @code{dest} as the parent
parser, the two share a single namespace attribute, so the parent’s value
won’t be retained. Users should give them  distinct @code{dest} values to
keep both.

Similarly, when a help message is requested from a subparser, only the help
for that particular parser will be printed.  The help message will not
include parent parser or sibling parser messages.  (A help message for each
subparser command, however, can be given by supplying the @code{help=} argument
to @code{add_parser()} as above.)

@example
>>> parser.parse_args(['--help'])
usage: PROG [-h] [--foo] @{a,b@} ...

positional arguments:
  @{a,b@}   subcommand help
    a     a help
    b     b help

options:
  -h, --help  show this help message and exit
  --foo   foo help

>>> parser.parse_args(['a', '--help'])
usage: PROG a [-h] bar

positional arguments:
  bar     bar help

options:
  -h, --help  show this help message and exit

>>> parser.parse_args(['b', '--help'])
usage: PROG b [-h] [--baz @{X,Y,Z@}]

options:
  -h, --help     show this help message and exit
  --baz @{X,Y,Z@}  baz help
@end example

The @code{add_subparsers()} method also supports @code{title} and @code{description}
keyword arguments.  When either is present, the subparser’s commands will
appear in their own group in the help output.  For example:

@example
>>> parser = argparse.ArgumentParser()
>>> subparsers = parser.add_subparsers(title='subcommands',
...                                    description='valid subcommands',
...                                    help='additional help')
>>> subparsers.add_parser('foo')
>>> subparsers.add_parser('bar')
>>> parser.parse_args(['-h'])
usage:  [-h] @{foo,bar@} ...

options:
  -h, --help  show this help message and exit

subcommands:
  valid subcommands

  @{foo,bar@}   additional help
@end example

Furthermore, @code{add_parser()} supports an additional
`aliases' argument,
which allows multiple strings to refer to the same subparser. This example,
like @code{svn}, aliases @code{co} as a shorthand for @code{checkout}:

@example
>>> parser = argparse.ArgumentParser()
>>> subparsers = parser.add_subparsers()
>>> checkout = subparsers.add_parser('checkout', aliases=['co'])
>>> checkout.add_argument('foo')
>>> parser.parse_args(['co', 'bar'])
Namespace(foo='bar')
@end example

@code{add_parser()} supports also an additional
`deprecated' argument, which allows to deprecate the subparser.

@example
>>> import argparse
>>> parser = argparse.ArgumentParser(prog='chicken.py')
>>> subparsers = parser.add_subparsers()
>>> run = subparsers.add_parser('run')
>>> fly = subparsers.add_parser('fly', deprecated=True)
>>> parser.parse_args(['fly'])
chicken.py: warning: command 'fly' is deprecated
Namespace()
@end example


Added in version 3.13.


One particularly effective way of handling subcommands is to combine the use
of the @code{add_subparsers()} method with calls to @ref{3401,,set_defaults()} so
that each subparser knows which Python function it should execute.  For
example:

@example
>>> # subcommand functions
>>> def foo(args):
...     print(args.x * args.y)
...
>>> def bar(args):
...     print('((%s))' % args.z)
...
>>> # create the top-level parser
>>> parser = argparse.ArgumentParser()
>>> subparsers = parser.add_subparsers(required=True)
>>>
>>> # create the parser for the "foo" command
>>> parser_foo = subparsers.add_parser('foo')
>>> parser_foo.add_argument('-x', type=int, default=1)
>>> parser_foo.add_argument('y', type=float)
>>> parser_foo.set_defaults(func=foo)
>>>
>>> # create the parser for the "bar" command
>>> parser_bar = subparsers.add_parser('bar')
>>> parser_bar.add_argument('z')
>>> parser_bar.set_defaults(func=bar)
>>>
>>> # parse the args and call whatever function was selected
>>> args = parser.parse_args('foo 1 -x 2'.split())
>>> args.func(args)
2.0
>>>
>>> # parse the args and call whatever function was selected
>>> args = parser.parse_args('bar XYZYX'.split())
>>> args.func(args)
((XYZYX))
@end example

This way, you can let @ref{33e8,,parse_args()} do the job of calling the
appropriate function after argument parsing is complete.  Associating
functions with actions like this is typically the easiest way to handle the
different actions for each of your subparsers.  However, if it is necessary
to check the name of the subparser that was invoked, the @code{dest} keyword
argument to the @code{add_subparsers()} call will work:

@example
>>> parser = argparse.ArgumentParser()
>>> subparsers = parser.add_subparsers(dest='subparser_name')
>>> subparser1 = subparsers.add_parser('1')
>>> subparser1.add_argument('-x')
>>> subparser2 = subparsers.add_parser('2')
>>> subparser2.add_argument('y')
>>> parser.parse_args(['2', 'frobble'])
Namespace(subparser_name='2', y='frobble')
@end example


Changed in version 3.7: New `required' keyword-only parameter.



Changed in version 3.14: Subparser’s `prog' is no longer affected by a custom usage message in
the main parser.

@end deffn

@node FileType objects,Argument groups,Subcommands,Other utilities
@anchor{library/argparse filetype-objects}@anchor{3426}
@subsubsection FileType objects


@geindex FileType (class in argparse)
@anchor{library/argparse argparse FileType}@anchor{30e}
@deffn {Class} argparse.FileType (mode='r', bufsize=-1, encoding=None, errors=None)

The @code{FileType} factory creates objects that can be passed to the type
argument of @ref{4bd,,ArgumentParser.add_argument()}.  Arguments that have
@code{FileType} objects as their type will open command-line arguments as
files with the requested modes, buffer sizes, encodings and error handling
(see the @ref{318,,open()} function for more details):

@example
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--raw', type=argparse.FileType('wb', 0))
>>> parser.add_argument('out', type=argparse.FileType('w', encoding='UTF-8'))
>>> parser.parse_args(['--raw', 'raw.dat', 'file.txt'])
Namespace(out=<_io.TextIOWrapper name='file.txt' mode='w' encoding='UTF-8'>, raw=<_io.FileIO name='raw.dat' mode='wb'>)
@end example

FileType objects understand the pseudo-argument @code{'-'} and automatically
convert this into @ref{760,,sys.stdin} for readable @code{FileType} objects and
@ref{cd3,,sys.stdout} for writable @code{FileType} objects:

@example
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('infile', type=argparse.FileType('r'))
>>> parser.parse_args(['-'])
Namespace(infile=<_io.TextIOWrapper name='<stdin>' encoding='UTF-8'>)
@end example

@cartouche
@quotation Note 
If one argument uses `FileType' and then a subsequent argument fails,
an error is reported but the file is not automatically closed.
This can also clobber the output files.
In this case, it would be better to wait until after the parser has
run and then use the @ref{187,,with}-statement to manage the files.
@end quotation
@end cartouche


Changed in version 3.4: Added the `encoding' and `errors' parameters.



Deprecated since version 3.14.

@end deffn

@node Argument groups,Mutual exclusion,FileType objects,Other utilities
@anchor{library/argparse argument-groups}@anchor{3427}
@subsubsection Argument groups


@geindex add_argument_group() (argparse.ArgumentParser method)
@anchor{library/argparse argparse ArgumentParser add_argument_group}@anchor{2ed}
@deffn {Method} ArgumentParser.add_argument_group (title=None, description=None, *[, argument_default][, conflict_handler])

By default, @ref{1bf,,ArgumentParser} groups command-line arguments into
“positional arguments” and “options” when displaying help
messages. When there is a better conceptual grouping of arguments than this
default one, appropriate groups can be created using the
@code{add_argument_group()} method:

@example
>>> parser = argparse.ArgumentParser(prog='PROG', add_help=False)
>>> group = parser.add_argument_group('group')
>>> group.add_argument('--foo', help='foo help')
>>> group.add_argument('bar', help='bar help')
>>> parser.print_help()
usage: PROG [--foo FOO] bar

group:
  bar    bar help
  --foo FOO  foo help
@end example

The @code{add_argument_group()} method returns an argument group object which
has an @ref{4bd,,add_argument()} method just like a regular
@ref{1bf,,ArgumentParser}.  When an argument is added to the group, the parser
treats it just like a normal argument, but displays the argument in a
separate group for help messages.  The @code{add_argument_group()} method
accepts `title' and `description' arguments which can be used to
customize this display:

@example
>>> parser = argparse.ArgumentParser(prog='PROG', add_help=False)
>>> group1 = parser.add_argument_group('group1', 'group1 description')
>>> group1.add_argument('foo', help='foo help')
>>> group2 = parser.add_argument_group('group2', 'group2 description')
>>> group2.add_argument('--bar', help='bar help')
>>> parser.print_help()
usage: PROG [--bar BAR] foo

group1:
  group1 description

  foo    foo help

group2:
  group2 description

  --bar BAR  bar help
@end example

The optional, keyword-only parameters @ref{33f2,,argument_default} and @ref{33f3,,conflict_handler}
allow for finer-grained control of the behavior of the argument group. These
parameters have the same meaning as in the @ref{1bf,,ArgumentParser} constructor,
but apply specifically to the argument group rather than the entire parser.

Note that any arguments not in your user-defined groups will end up back
in the usual “positional arguments” and “optional arguments” sections.

Within each argument group, arguments are displayed in help output in the
order in which they are added.


Deprecated since version 3.11, removed in version 3.14: Calling @code{add_argument_group()} on an argument group now raises an
exception. This nesting was never supported, often failed to work
correctly, and was unintentionally exposed through inheritance.



Deprecated since version 3.14: Passing @ref{33f0,,prefix_chars} to @code{add_argument_group()}
is now deprecated.

@end deffn

@node Mutual exclusion,Parser defaults,Argument groups,Other utilities
@anchor{library/argparse mutual-exclusion}@anchor{3428}
@subsubsection Mutual exclusion


@geindex add_mutually_exclusive_group() (argparse.ArgumentParser method)
@anchor{library/argparse argparse ArgumentParser add_mutually_exclusive_group}@anchor{2ef}
@deffn {Method} ArgumentParser.add_mutually_exclusive_group (required=False)

Create a mutually exclusive group. @code{argparse} will make sure that only
one of the arguments in the mutually exclusive group was present on the
command line:

@example
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> group = parser.add_mutually_exclusive_group()
>>> group.add_argument('--foo', action='store_true')
>>> group.add_argument('--bar', action='store_false')
>>> parser.parse_args(['--foo'])
Namespace(bar=True, foo=True)
>>> parser.parse_args(['--bar'])
Namespace(bar=False, foo=False)
>>> parser.parse_args(['--foo', '--bar'])
usage: PROG [-h] [--foo | --bar]
PROG: error: argument --bar: not allowed with argument --foo
@end example

The @code{add_mutually_exclusive_group()} method also accepts a `required'
argument, to indicate that at least one of the mutually exclusive arguments
is required:

@example
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> group = parser.add_mutually_exclusive_group(required=True)
>>> group.add_argument('--foo', action='store_true')
>>> group.add_argument('--bar', action='store_false')
>>> parser.parse_args([])
usage: PROG [-h] (--foo | --bar)
PROG: error: one of the arguments --foo --bar is required
@end example

Note that currently mutually exclusive argument groups do not support the
`title' and `description' arguments of
@ref{2ed,,add_argument_group()}. However, a mutually exclusive
group can be added to an argument group that has a title and description.
For example:

@example
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> group = parser.add_argument_group('Group title', 'Group description')
>>> exclusive_group = group.add_mutually_exclusive_group(required=True)
>>> exclusive_group.add_argument('--foo', help='foo help')
>>> exclusive_group.add_argument('--bar', help='bar help')
>>> parser.print_help()
usage: PROG [-h] (--foo FOO | --bar BAR)

options:
  -h, --help  show this help message and exit

Group title:
  Group description

  --foo FOO   foo help
  --bar BAR   bar help
@end example


Deprecated since version 3.11, removed in version 3.14: Calling @ref{2ed,,add_argument_group()} or @code{add_mutually_exclusive_group()}
on a mutually exclusive group now raises an exception. This nesting was
never supported, often failed to work correctly, and was unintentionally
exposed through inheritance.

@end deffn

@node Parser defaults,Printing help,Mutual exclusion,Other utilities
@anchor{library/argparse parser-defaults}@anchor{3429}
@subsubsection Parser defaults


@geindex set_defaults() (argparse.ArgumentParser method)
@anchor{library/argparse argparse ArgumentParser set_defaults}@anchor{3401}
@deffn {Method} ArgumentParser.set_defaults (**kwargs)

Most of the time, the attributes of the object returned by @ref{33e8,,parse_args()}
will be fully determined by inspecting the command-line arguments and the argument
actions.  @code{set_defaults()} allows some additional
attributes that are determined without any inspection of the command line to
be added:

@example
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('foo', type=int)
>>> parser.set_defaults(bar=42, baz='badger')
>>> parser.parse_args(['736'])
Namespace(bar=42, baz='badger', foo=736)
@end example

Note that defaults can be set at both the parser level using @code{set_defaults()}
and at the argument level using @ref{4bd,,add_argument()}. If both are called for the
same argument, the last default set for an argument is used:

@example
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', default='bar')
>>> parser.set_defaults(foo='spam')
>>> parser.parse_args([])
Namespace(foo='spam')
@end example

Parser-level defaults can be particularly useful when working with multiple
parsers.  See the @ref{e17,,add_subparsers()} method for an
example of this type.
@end deffn

@geindex get_default() (argparse.ArgumentParser method)
@anchor{library/argparse argparse ArgumentParser get_default}@anchor{342a}
@deffn {Method} ArgumentParser.get_default (dest)

Get the default value for a namespace attribute, as set by either
@ref{4bd,,add_argument()} or by
@ref{3401,,set_defaults()}:

@example
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', default='badger')
>>> parser.get_default('foo')
'badger'
@end example
@end deffn

@node Printing help,Partial parsing,Parser defaults,Other utilities
@anchor{library/argparse printing-help}@anchor{342b}
@subsubsection Printing help


In most typical applications, @ref{33e8,,parse_args()} will take
care of formatting and printing any usage or error messages.  However, several
formatting methods are available:

@geindex print_usage() (argparse.ArgumentParser method)
@anchor{library/argparse argparse ArgumentParser print_usage}@anchor{342c}
@deffn {Method} ArgumentParser.print_usage (file=None)

Print a brief description of how the @ref{1bf,,ArgumentParser} should be
invoked on the command line.  If `file' is @code{None}, @ref{cd3,,sys.stdout} is
assumed.
@end deffn

@geindex print_help() (argparse.ArgumentParser method)
@anchor{library/argparse argparse ArgumentParser print_help}@anchor{342d}
@deffn {Method} ArgumentParser.print_help (file=None)

Print a help message, including the program usage and information about the
arguments registered with the @ref{1bf,,ArgumentParser}.  If `file' is
@code{None}, @ref{cd3,,sys.stdout} is assumed.
@end deffn

There are also variants of these methods that simply return a string instead of
printing it:

@geindex format_usage() (argparse.ArgumentParser method)
@anchor{library/argparse argparse ArgumentParser format_usage}@anchor{1df2}
@deffn {Method} ArgumentParser.format_usage ()

Return a string containing a brief description of how the
@ref{1bf,,ArgumentParser} should be invoked on the command line.
@end deffn

@geindex format_help() (argparse.ArgumentParser method)
@anchor{library/argparse argparse ArgumentParser format_help}@anchor{342e}
@deffn {Method} ArgumentParser.format_help ()

Return a string containing a help message, including the program usage and
information about the arguments registered with the @ref{1bf,,ArgumentParser}.
@end deffn

@node Partial parsing,Customizing file parsing,Printing help,Other utilities
@anchor{library/argparse partial-parsing}@anchor{342f}
@subsubsection Partial parsing


@geindex parse_known_args() (argparse.ArgumentParser method)
@anchor{library/argparse argparse ArgumentParser parse_known_args}@anchor{3430}
@deffn {Method} ArgumentParser.parse_known_args (args=None, namespace=None)

Sometimes a script only needs to handle a specific set of command-line
arguments, leaving any unrecognized arguments for another script or program.
In these cases, the @code{parse_known_args()} method can be
useful.

This method works similarly to @ref{33e8,,parse_args()}, but it does
not raise an error for extra, unrecognized arguments. Instead, it parses the
known arguments and returns a two item tuple that contains the populated
namespace and the list of any unrecognized arguments.

@example
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='store_true')
>>> parser.add_argument('bar')
>>> parser.parse_known_args(['--foo', '--badger', 'BAR', 'spam'])
(Namespace(bar='BAR', foo=True), ['--badger', 'spam'])
@end example
@end deffn

@cartouche
@quotation Warning 
@ref{fc4,,Prefix matching} rules apply to
@ref{3430,,parse_known_args()}. The parser may consume an option even if it’s just
a prefix of one of its known options, instead of leaving it in the remaining
arguments list.
@end quotation
@end cartouche

@node Customizing file parsing,Exiting methods,Partial parsing,Other utilities
@anchor{library/argparse customizing-file-parsing}@anchor{3431}
@subsubsection Customizing file parsing


@geindex convert_arg_line_to_args() (argparse.ArgumentParser method)
@anchor{library/argparse argparse ArgumentParser convert_arg_line_to_args}@anchor{3400}
@deffn {Method} ArgumentParser.convert_arg_line_to_args (arg_line)

Arguments that are read from a file (see the `fromfile_prefix_chars'
keyword argument to the @ref{1bf,,ArgumentParser} constructor) are read one
argument per line. @code{convert_arg_line_to_args()} can be overridden for
fancier reading.

This method takes a single argument `arg_line' which is a string read from
the argument file.  It returns a list of arguments parsed from this string.
The method is called once per line read from the argument file, in order.

A useful override of this method is one that treats each space-separated word
as an argument.  The following example demonstrates how to do this:

@example
class MyArgumentParser(argparse.ArgumentParser):
    def convert_arg_line_to_args(self, arg_line):
        return arg_line.split()
@end example

Note that with this override an argument can no longer contain spaces, since
each space-separated word becomes a separate argument.
@end deffn

@node Exiting methods,Intermixed parsing,Customizing file parsing,Other utilities
@anchor{library/argparse exiting-methods}@anchor{3432}
@subsubsection Exiting methods


@geindex exit() (argparse.ArgumentParser method)
@anchor{library/argparse argparse ArgumentParser exit}@anchor{3433}
@deffn {Method} ArgumentParser.exit (status=0, message=None)

This method terminates the program, exiting with the specified `status'
and, if given, it prints a `message' to @ref{b39,,sys.stderr} before that.
The user can override this method to handle these steps differently:

@example
class ErrorCatchingArgumentParser(argparse.ArgumentParser):
    def exit(self, status=0, message=None):
        if status:
            raise Exception(f'Exiting because of an error: @{message@}')
        exit(status)
@end example
@end deffn

@geindex error() (argparse.ArgumentParser method)
@anchor{library/argparse argparse ArgumentParser error}@anchor{3434}
@deffn {Method} ArgumentParser.error (message)

This method prints a usage message, including the `message', to
@ref{b39,,sys.stderr} and terminates the program with a status code of 2.
@end deffn

@node Intermixed parsing,Registering custom types or actions,Exiting methods,Other utilities
@anchor{library/argparse intermixed-parsing}@anchor{3435}
@subsubsection Intermixed parsing


@geindex parse_intermixed_args() (argparse.ArgumentParser method)
@anchor{library/argparse argparse ArgumentParser parse_intermixed_args}@anchor{cfd}
@deffn {Method} ArgumentParser.parse_intermixed_args (args=None, namespace=None)
@end deffn

@geindex parse_known_intermixed_args() (argparse.ArgumentParser method)
@anchor{library/argparse argparse ArgumentParser parse_known_intermixed_args}@anchor{3436}
@deffn {Method} ArgumentParser.parse_known_intermixed_args (args=None, namespace=None)

A number of Unix commands allow the user to intermix optional arguments with
positional arguments.  The @ref{cfd,,parse_intermixed_args()}
and @code{parse_known_intermixed_args()} methods
support this parsing style.

These parsers do not support all the @code{argparse} features, and will raise
exceptions if unsupported features are used.  In particular, subparsers,
and mutually exclusive groups that include both
optionals and positionals are not supported.

The following example shows the difference between
@ref{3430,,parse_known_args()} and
@ref{cfd,,parse_intermixed_args()}: the former returns @code{['2',
'3']} as unparsed arguments, while the latter collects all the positionals
into @code{rest}.

@example
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo')
>>> parser.add_argument('cmd')
>>> parser.add_argument('rest', nargs='*', type=int)
>>> parser.parse_known_args('doit 1 --foo bar 2 3'.split())
(Namespace(cmd='doit', foo='bar', rest=[1]), ['2', '3'])
>>> parser.parse_intermixed_args('doit 1 --foo bar 2 3'.split())
Namespace(cmd='doit', foo='bar', rest=[1, 2, 3])
@end example

@code{parse_known_intermixed_args()} returns a two item tuple
containing the populated namespace and the list of remaining argument strings.
@ref{cfd,,parse_intermixed_args()} raises an error if there are any
remaining unparsed argument strings.


Added in version 3.7.

@end deffn

@node Registering custom types or actions,,Intermixed parsing,Other utilities
@anchor{library/argparse registering-custom-types-or-actions}@anchor{3437}
@subsubsection Registering custom types or actions


@geindex register() (argparse.ArgumentParser method)
@anchor{library/argparse argparse ArgumentParser register}@anchor{340b}
@deffn {Method} ArgumentParser.register (registry_name, value, object)

Sometimes it’s desirable to use a custom string in error messages to provide
more user-friendly output. In these cases, @code{register()} can be used to
register custom actions or types with a parser and allow you to reference the
type by their registered name instead of their callable name.

The @code{register()} method accepts three arguments - a `registry_name',
specifying the internal registry where the object will be stored (e.g.,
@code{action}, @code{type}), `value', which is the key under which the object will
be registered, and object, the callable to be registered.

The following example shows how to register a custom type with a parser:

@example
>>> import argparse
>>> parser = argparse.ArgumentParser()
>>> parser.register('type', 'hexadecimal integer', lambda s: int(s, 16))
>>> parser.add_argument('--foo', type='hexadecimal integer')
_StoreAction(option_strings=['--foo'], dest='foo', nargs=None, const=None, default=None, type='hexadecimal integer', choices=None, required=False, help=None, metavar=None, deprecated=False)
>>> parser.parse_args(['--foo', '0xFA'])
Namespace(foo=250)
>>> parser.parse_args(['--foo', '1.2'])
usage: PROG [-h] [--foo FOO]
PROG: error: argument --foo: invalid 'hexadecimal integer' value: '1.2'
@end example
@end deffn

@node Exceptions<11>,,Other utilities,argparse — Parser for command-line options arguments and subcommands
@anchor{library/argparse exceptions}@anchor{3438}
@subsubsection Exceptions


@geindex ArgumentError
@anchor{library/argparse argparse ArgumentError}@anchor{3439}
@deffn {Exception} argparse.ArgumentError

An error from creating or using an argument (optional or positional).

The string value of this exception is the message, augmented with
information about the argument that caused it.
@end deffn

@geindex ArgumentTypeError
@anchor{library/argparse argparse ArgumentTypeError}@anchor{3411}
@deffn {Exception} argparse.ArgumentTypeError

Raised when something goes wrong converting a command line string to a type.
@end deffn

@subsubheading Guides and Tutorials


@menu
* Argparse Tutorial:: 
* Migrating optparse code to argparse:: 

@end menu

@node Argparse Tutorial,Migrating optparse code to argparse,,Exceptions<11>
@anchor{howto/argparse doc}@anchor{343a}@anchor{howto/argparse argparse-tutorial}@anchor{33e7}@anchor{howto/argparse id1}@anchor{343b}
@subsubsection Argparse Tutorial


@*author: 
Tshepang Mbambo


This tutorial is intended to be a gentle introduction to @ref{7,,argparse}, the
recommended command-line parsing module in the Python standard library.

@cartouche
@quotation Note 
The standard library includes two other libraries directly related
to command-line parameter processing: the lower level @ref{a4,,optparse}
module (which may require more code to configure for a given application,
but also allows an application to request behaviors that @code{argparse}
doesn’t support), and the very low level @ref{65,,getopt} (which specifically
serves as an equivalent to the @code{getopt()} family of functions
available to C programmers).
While neither of those modules is covered directly in this guide, many of
the core concepts in @code{argparse} first originated in @code{optparse}, so
some aspects of this tutorial will also be relevant to @code{optparse} users.
@end quotation
@end cartouche

@menu
* Concepts:: 
* The basics:: 
* Introducing Positional arguments:: 
* Introducing Optional arguments:: 
* Combining Positional and Optional arguments:: 
* Getting a little more advanced:: 
* How to translate the argparse output:: 
* Custom type converters:: 
* Conclusion:: 

@end menu

@node Concepts,The basics,,Argparse Tutorial
@anchor{howto/argparse concepts}@anchor{343c}
@subsubsection Concepts


Let’s show the sort of functionality that we are going to explore in this
introductory tutorial by making use of the @code{ls} command:

@example
$ ls
cpython  devguide  prog.py  pypy  rm-unused-function.patch
$ ls pypy
ctypes_configure  demo  dotviewer  include  lib_pypy  lib-python ...
$ ls -l
total 20
drwxr-xr-x 19 wena wena 4096 Feb 18 18:51 cpython
drwxr-xr-x  4 wena wena 4096 Feb  8 12:04 devguide
-rwxr-xr-x  1 wena wena  535 Feb 19 00:05 prog.py
drwxr-xr-x 14 wena wena 4096 Feb  7 00:59 pypy
-rw-r--r--  1 wena wena  741 Feb 18 01:01 rm-unused-function.patch
$ ls --help
Usage: ls [OPTION]... [FILE]...
List information about the FILEs (the current directory by default).
Sort entries alphabetically if none of -cftuvSUX nor --sort is specified.
...
@end example

A few concepts we can learn from the four commands:


@itemize *

@item 
The @code{ls} command is useful when run without any options at all. It defaults
to displaying the contents of the current directory.

@item 
If we want beyond what it provides by default, we tell it a bit more. In
this case, we want it to display a different directory, @code{pypy}.
What we did is specify what is known as a positional argument. It’s named so
because the program should know what to do with the value, solely based on
where it appears on the command line. This concept is more relevant
to a command like @code{cp}, whose most basic usage is @code{cp SRC DEST}.
The first position is `what you want copied,' and the second
position is `where you want it copied to'.

@item 
Now, say we want to change behaviour of the program. In our example,
we display more info for each file instead of just showing the file names.
The @code{-l} in that case is known as an optional argument.

@item 
That’s a snippet of the help text. It’s very useful in that you can
come across a program you have never used before, and can figure out
how it works simply by reading its help text.
@end itemize

@node The basics,Introducing Positional arguments,Concepts,Argparse Tutorial
@anchor{howto/argparse the-basics}@anchor{343d}
@subsubsection The basics


Let us start with a very simple example which does (almost) nothing:

@example
import argparse
parser = argparse.ArgumentParser()
parser.parse_args()
@end example

Following is a result of running the code:

@example
$ python prog.py
$ python prog.py --help
usage: prog.py [-h]

options:
  -h, --help  show this help message and exit
$ python prog.py --verbose
usage: prog.py [-h]
prog.py: error: unrecognized arguments: --verbose
$ python prog.py foo
usage: prog.py [-h]
prog.py: error: unrecognized arguments: foo
@end example

Here is what is happening:


@itemize *

@item 
Running the script without any options results in nothing displayed to
stdout. Not so useful.

@item 
The second one starts to display the usefulness of the @ref{7,,argparse}
module. We have done almost nothing, but already we get a nice help message.

@item 
The @code{--help} option, which can also be shortened to @code{-h}, is the only
option we get for free (i.e. no need to specify it). Specifying anything
else results in an error. But even then, we do get a useful usage message,
also for free.
@end itemize

@node Introducing Positional arguments,Introducing Optional arguments,The basics,Argparse Tutorial
@anchor{howto/argparse introducing-positional-arguments}@anchor{343e}
@subsubsection Introducing Positional arguments


An example:

@example
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("echo")
args = parser.parse_args()
print(args.echo)
@end example

And running the code:

@example
$ python prog.py
usage: prog.py [-h] echo
prog.py: error: the following arguments are required: echo
$ python prog.py --help
usage: prog.py [-h] echo

positional arguments:
  echo

options:
  -h, --help  show this help message and exit
$ python prog.py foo
foo
@end example

Here is what’s happening:


@itemize *

@item 
We’ve added the @ref{4bd,,add_argument()} method, which is what we use to specify
which command-line options the program is willing to accept. In this case,
I’ve named it @code{echo} so that it’s in line with its function.

@item 
Calling our program now requires us to specify an option.

@item 
The @ref{33e8,,parse_args()} method actually returns some data from the
options specified, in this case, @code{echo}.

@item 
The variable is some form of ‘magic’ that @ref{7,,argparse} performs for free
(i.e. no need to specify which variable that value is stored in).
You will also notice that its name matches the string argument given
to the method, @code{echo}.
@end itemize

Note however that, although the help display looks nice and all, it currently
is not as helpful as it can be. For example we see that we got @code{echo} as a
positional argument, but we don’t know what it does, other than by guessing or
by reading the source code. So, let’s make it a bit more useful:

@example
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("echo", help="echo the string you use here")
args = parser.parse_args()
print(args.echo)
@end example

And we get:

@example
$ python prog.py -h
usage: prog.py [-h] echo

positional arguments:
  echo        echo the string you use here

options:
  -h, --help  show this help message and exit
@end example

Now, how about doing something even more useful:

@example
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", help="display a square of a given number")
args = parser.parse_args()
print(args.square**2)
@end example

Following is a result of running the code:

@example
$ python prog.py 4
Traceback (most recent call last):
  File "prog.py", line 5, in <module>
    print(args.square**2)
TypeError: unsupported operand type(s) for ** or pow(): 'str' and 'int'
@end example

That didn’t go so well. That’s because @ref{7,,argparse} treats the options we
give it as strings, unless we tell it otherwise. So, let’s tell
@code{argparse} to treat that input as an integer:

@example
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", help="display a square of a given number",
                    type=int)
args = parser.parse_args()
print(args.square**2)
@end example

Following is a result of running the code:

@example
$ python prog.py 4
16
$ python prog.py four
usage: prog.py [-h] square
prog.py: error: argument square: invalid int value: 'four'
@end example

That went well. The program now even helpfully quits on bad illegal input
before proceeding.

@node Introducing Optional arguments,Combining Positional and Optional arguments,Introducing Positional arguments,Argparse Tutorial
@anchor{howto/argparse introducing-optional-arguments}@anchor{343f}
@subsubsection Introducing Optional arguments


So far we have been playing with positional arguments. Let us
have a look on how to add optional ones:

@example
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--verbosity", help="increase output verbosity")
args = parser.parse_args()
if args.verbosity:
    print("verbosity turned on")
@end example

And the output:

@example
$ python prog.py --verbosity 1
verbosity turned on
$ python prog.py
$ python prog.py --help
usage: prog.py [-h] [--verbosity VERBOSITY]

options:
  -h, --help            show this help message and exit
  --verbosity VERBOSITY
                        increase output verbosity
$ python prog.py --verbosity
usage: prog.py [-h] [--verbosity VERBOSITY]
prog.py: error: argument --verbosity: expected one argument
@end example

Here is what is happening:


@itemize *

@item 
The program is written so as to display something when @code{--verbosity} is
specified and display nothing when not.

@item 
To show that the option is actually optional, there is no error when running
the program without it. Note that by default, if an optional argument isn’t
used, the relevant variable, in this case @code{args.verbosity}, is
given @code{None} as a value, which is the reason it fails the truth
test of the @ref{182,,if} statement.

@item 
The help message is a bit different.

@item 
When using the @code{--verbosity} option, one must also specify some value,
any value.
@end itemize

The above example accepts arbitrary integer values for @code{--verbosity}, but for
our simple program, only two values are actually useful, @code{True} or @code{False}.
Let’s modify the code accordingly:

@example
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--verbose", help="increase output verbosity",
                    action="store_true")
args = parser.parse_args()
if args.verbose:
    print("verbosity turned on")
@end example

And the output:

@example
$ python prog.py --verbose
verbosity turned on
$ python prog.py --verbose 1
usage: prog.py [-h] [--verbose]
prog.py: error: unrecognized arguments: 1
$ python prog.py --help
usage: prog.py [-h] [--verbose]

options:
  -h, --help  show this help message and exit
  --verbose   increase output verbosity
@end example

Here is what is happening:


@itemize *

@item 
The option is now more of a flag than something that requires a value.
We even changed the name of the option to match that idea.
Note that we now specify a new keyword, @code{action}, and give it the value
@code{"store_true"}. This means that, if the option is specified,
assign the value @code{True} to @code{args.verbose}.
Not specifying it implies @code{False}.

@item 
It complains when you specify a value, in true spirit of what flags
actually are.

@item 
Notice the different help text.
@end itemize

@menu
* Short options:: 

@end menu

@node Short options,,,Introducing Optional arguments
@anchor{howto/argparse short-options}@anchor{3440}
@subsubsection Short options


If you are familiar with command line usage,
you will notice that I haven’t yet touched on the topic of short
versions of the options. It’s quite simple:

@example
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-v", "--verbose", help="increase output verbosity",
                    action="store_true")
args = parser.parse_args()
if args.verbose:
    print("verbosity turned on")
@end example

And here goes:

@example
$ python prog.py -v
verbosity turned on
$ python prog.py --help
usage: prog.py [-h] [-v]

options:
  -h, --help     show this help message and exit
  -v, --verbose  increase output verbosity
@end example

Note that the new ability is also reflected in the help text.

@node Combining Positional and Optional arguments,Getting a little more advanced,Introducing Optional arguments,Argparse Tutorial
@anchor{howto/argparse combining-positional-and-optional-arguments}@anchor{3441}
@subsubsection Combining Positional and Optional arguments


Our program keeps growing in complexity:

@example
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,
                    help="display a square of a given number")
parser.add_argument("-v", "--verbose", action="store_true",
                    help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
if args.verbose:
    print(f"the square of @{args.square@} equals @{answer@}")
else:
    print(answer)
@end example

And now the output:

@example
$ python prog.py
usage: prog.py [-h] [-v] square
prog.py: error: the following arguments are required: square
$ python prog.py 4
16
$ python prog.py 4 --verbose
the square of 4 equals 16
$ python prog.py --verbose 4
the square of 4 equals 16
@end example


@itemize *

@item 
We’ve brought back a positional argument, hence the complaint.

@item 
Note that the order does not matter.
@end itemize

How about we give this program of ours back the ability to have
multiple verbosity values, and actually get to use them:

@example
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,
                    help="display a square of a given number")
parser.add_argument("-v", "--verbosity", type=int,
                    help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
if args.verbosity == 2:
    print(f"the square of @{args.square@} equals @{answer@}")
elif args.verbosity == 1:
    print(f"@{args.square@}^2 == @{answer@}")
else:
    print(answer)
@end example

And the output:

@example
$ python prog.py 4
16
$ python prog.py 4 -v
usage: prog.py [-h] [-v VERBOSITY] square
prog.py: error: argument -v/--verbosity: expected one argument
$ python prog.py 4 -v 1
4^2 == 16
$ python prog.py 4 -v 2
the square of 4 equals 16
$ python prog.py 4 -v 3
16
@end example

These all look good except the last one, which exposes a bug in our program.
Let’s fix it by restricting the values the @code{--verbosity} option can accept:

@example
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,
                    help="display a square of a given number")
parser.add_argument("-v", "--verbosity", type=int, choices=[0, 1, 2],
                    help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
if args.verbosity == 2:
    print(f"the square of @{args.square@} equals @{answer@}")
elif args.verbosity == 1:
    print(f"@{args.square@}^2 == @{answer@}")
else:
    print(answer)
@end example

And the output:

@example
$ python prog.py 4 -v 3
usage: prog.py [-h] [-v @{0,1,2@}] square
prog.py: error: argument -v/--verbosity: invalid choice: 3 (choose from 0, 1, 2)
$ python prog.py 4 -h
usage: prog.py [-h] [-v @{0,1,2@}] square

positional arguments:
  square                display a square of a given number

options:
  -h, --help            show this help message and exit
  -v, --verbosity @{0,1,2@}
                        increase output verbosity
@end example

Note that the change also reflects both in the error message as well as the
help string.

Now, let’s use a different approach of playing with verbosity, which is pretty
common. It also matches the way the CPython executable handles its own
verbosity argument (check the output of @code{python --help}):

@example
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,
                    help="display the square of a given number")
parser.add_argument("-v", "--verbosity", action="count",
                    help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
if args.verbosity == 2:
    print(f"the square of @{args.square@} equals @{answer@}")
elif args.verbosity == 1:
    print(f"@{args.square@}^2 == @{answer@}")
else:
    print(answer)
@end example

We have introduced another action, “count”,
to count the number of occurrences of specific options.

@example
$ python prog.py 4
16
$ python prog.py 4 -v
4^2 == 16
$ python prog.py 4 -vv
the square of 4 equals 16
$ python prog.py 4 --verbosity --verbosity
the square of 4 equals 16
$ python prog.py 4 -v 1
usage: prog.py [-h] [-v] square
prog.py: error: unrecognized arguments: 1
$ python prog.py 4 -h
usage: prog.py [-h] [-v] square

positional arguments:
  square           display a square of a given number

options:
  -h, --help       show this help message and exit
  -v, --verbosity  increase output verbosity
$ python prog.py 4 -vvv
16
@end example


@itemize *

@item 
Yes, it’s now more of a flag (similar to @code{action="store_true"}) in the
previous version of our script. That should explain the complaint.

@item 
It also behaves similar to “store_true” action.

@item 
Now here’s a demonstration of what the “count” action gives. You’ve probably
seen this sort of usage before.

@item 
And if you don’t specify the @code{-v} flag, that flag is considered to have
@code{None} value.

@item 
As should be expected, specifying the long form of the flag, we should get
the same output.

@item 
Sadly, our help output isn’t very informative on the new ability our script
has acquired, but that can always be fixed by improving the documentation for
our script (e.g. via the @code{help} keyword argument).

@item 
That last output exposes a bug in our program.
@end itemize

Let’s fix:

@example
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,
                    help="display a square of a given number")
parser.add_argument("-v", "--verbosity", action="count",
                    help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2

# bugfix: replace == with >=
if args.verbosity >= 2:
    print(f"the square of @{args.square@} equals @{answer@}")
elif args.verbosity >= 1:
    print(f"@{args.square@}^2 == @{answer@}")
else:
    print(answer)
@end example

And this is what it gives:

@example
$ python prog.py 4 -vvv
the square of 4 equals 16
$ python prog.py 4 -vvvv
the square of 4 equals 16
$ python prog.py 4
Traceback (most recent call last):
  File "prog.py", line 11, in <module>
    if args.verbosity >= 2:
TypeError: '>=' not supported between instances of 'NoneType' and 'int'
@end example


@itemize *

@item 
First output went well, and fixes the bug we had before.
That is, we want any value >= 2 to be as verbose as possible.

@item 
Third output not so good.
@end itemize

Let’s fix that bug:

@example
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,
                    help="display a square of a given number")
parser.add_argument("-v", "--verbosity", action="count", default=0,
                    help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
if args.verbosity >= 2:
    print(f"the square of @{args.square@} equals @{answer@}")
elif args.verbosity >= 1:
    print(f"@{args.square@}^2 == @{answer@}")
else:
    print(answer)
@end example

We’ve just introduced yet another keyword, @code{default}.
We’ve set it to @code{0} in order to make it comparable to the other int values.
Remember that by default,
if an optional argument isn’t specified,
it gets the @code{None} value, and that cannot be compared to an int value
(hence the @ref{199,,TypeError} exception).

And:

@example
$ python prog.py 4
16
@end example

You can go quite far just with what we’ve learned so far,
and we have only scratched the surface.
The @ref{7,,argparse} module is very powerful,
and we’ll explore a bit more of it before we end this tutorial.

@node Getting a little more advanced,How to translate the argparse output,Combining Positional and Optional arguments,Argparse Tutorial
@anchor{howto/argparse getting-a-little-more-advanced}@anchor{3442}
@subsubsection Getting a little more advanced


What if we wanted to expand our tiny program to perform other powers,
not just squares:

@example
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("x", type=int, help="the base")
parser.add_argument("y", type=int, help="the exponent")
parser.add_argument("-v", "--verbosity", action="count", default=0)
args = parser.parse_args()
answer = args.x**args.y
if args.verbosity >= 2:
    print(f"@{args.x@} to the power @{args.y@} equals @{answer@}")
elif args.verbosity >= 1:
    print(f"@{args.x@}^@{args.y@} == @{answer@}")
else:
    print(answer)
@end example

Output:

@example
$ python prog.py
usage: prog.py [-h] [-v] x y
prog.py: error: the following arguments are required: x, y
$ python prog.py -h
usage: prog.py [-h] [-v] x y

positional arguments:
  x                the base
  y                the exponent

options:
  -h, --help       show this help message and exit
  -v, --verbosity
$ python prog.py 4 2 -v
4^2 == 16
@end example

Notice that so far we’ve been using verbosity level to `change' the text
that gets displayed. The following example instead uses verbosity level
to display `more' text instead:

@example
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("x", type=int, help="the base")
parser.add_argument("y", type=int, help="the exponent")
parser.add_argument("-v", "--verbosity", action="count", default=0)
args = parser.parse_args()
answer = args.x**args.y
if args.verbosity >= 2:
    print(f"Running '@{__file__@}'")
if args.verbosity >= 1:
    print(f"@{args.x@}^@{args.y@} == ", end="")
print(answer)
@end example

Output:

@example
$ python prog.py 4 2
16
$ python prog.py 4 2 -v
4^2 == 16
$ python prog.py 4 2 -vv
Running 'prog.py'
4^2 == 16
@end example

@menu
* Specifying ambiguous arguments:: 
* Conflicting options:: 

@end menu

@node Specifying ambiguous arguments,Conflicting options,,Getting a little more advanced
@anchor{howto/argparse id2}@anchor{3443}@anchor{howto/argparse specifying-ambiguous-arguments}@anchor{340d}
@subsubsection Specifying ambiguous arguments


When there is ambiguity in deciding whether an argument is positional or for an
argument, @code{--} can be used to tell @ref{33e8,,parse_args()} that
everything after that is a positional argument:

@example
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-n', nargs='+')
>>> parser.add_argument('args', nargs='*')

>>> # ambiguous, so parse_args assumes it's an option
>>> parser.parse_args(['-f'])
usage: PROG [-h] [-n N [N ...]] [args ...]
PROG: error: unrecognized arguments: -f

>>> parser.parse_args(['--', '-f'])
Namespace(args=['-f'], n=None)

>>> # ambiguous, so the -n option greedily accepts arguments
>>> parser.parse_args(['-n', '1', '2', '3'])
Namespace(args=[], n=['1', '2', '3'])

>>> parser.parse_args(['-n', '1', '--', '2', '3'])
Namespace(args=['2', '3'], n=['1'])
@end example

@node Conflicting options,,Specifying ambiguous arguments,Getting a little more advanced
@anchor{howto/argparse conflicting-options}@anchor{3444}
@subsubsection Conflicting options


So far, we have been working with two methods of an
@ref{1bf,,argparse.ArgumentParser} instance. Let’s introduce a third one,
@ref{2ef,,add_mutually_exclusive_group()}. It allows for us to specify options that
conflict with each other. Let’s also change the rest of the program so that
the new functionality makes more sense:
we’ll introduce the @code{--quiet} option,
which will be the opposite of the @code{--verbose} one:

@example
import argparse

parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument("-v", "--verbose", action="store_true")
group.add_argument("-q", "--quiet", action="store_true")
parser.add_argument("x", type=int, help="the base")
parser.add_argument("y", type=int, help="the exponent")
args = parser.parse_args()
answer = args.x**args.y

if args.quiet:
    print(answer)
elif args.verbose:
    print(f"@{args.x@} to the power @{args.y@} equals @{answer@}")
else:
    print(f"@{args.x@}^@{args.y@} == @{answer@}")
@end example

Our program is now simpler, and we’ve lost some functionality for the sake of
demonstration. Anyways, here’s the output:

@example
$ python prog.py 4 2
4^2 == 16
$ python prog.py 4 2 -q
16
$ python prog.py 4 2 -v
4 to the power 2 equals 16
$ python prog.py 4 2 -vq
usage: prog.py [-h] [-v | -q] x y
prog.py: error: argument -q/--quiet: not allowed with argument -v/--verbose
$ python prog.py 4 2 -v --quiet
usage: prog.py [-h] [-v | -q] x y
prog.py: error: argument -q/--quiet: not allowed with argument -v/--verbose
@end example

That should be easy to follow. I’ve added that last output so you can see the
sort of flexibility you get, i.e. mixing long form options with short form
ones.

Before we conclude, you probably want to tell your users the main purpose of
your program, just in case they don’t know:

@example
import argparse

parser = argparse.ArgumentParser(description="calculate X to the power of Y")
group = parser.add_mutually_exclusive_group()
group.add_argument("-v", "--verbose", action="store_true")
group.add_argument("-q", "--quiet", action="store_true")
parser.add_argument("x", type=int, help="the base")
parser.add_argument("y", type=int, help="the exponent")
args = parser.parse_args()
answer = args.x**args.y

if args.quiet:
    print(answer)
elif args.verbose:
    print(f"@{args.x@} to the power @{args.y@} equals @{answer@}")
else:
    print(f"@{args.x@}^@{args.y@} == @{answer@}")
@end example

Note that slight difference in the usage text. Note the @code{[-v | -q]},
which tells us that we can either use @code{-v} or @code{-q},
but not both at the same time:

@example
$ python prog.py --help
usage: prog.py [-h] [-v | -q] x y

calculate X to the power of Y

positional arguments:
  x              the base
  y              the exponent

options:
  -h, --help     show this help message and exit
  -v, --verbose
  -q, --quiet
@end example

@node How to translate the argparse output,Custom type converters,Getting a little more advanced,Argparse Tutorial
@anchor{howto/argparse how-to-translate-the-argparse-output}@anchor{3445}
@subsubsection How to translate the argparse output


The output of the @ref{7,,argparse} module such as its help text and error
messages are all made translatable using the @ref{67,,gettext} module. This
allows applications to easily localize messages produced by
@code{argparse}. See also @ref{3446,,Internationalizing your programs and modules}.

For instance, in this @ref{7,,argparse} output:

@example
$ python prog.py --help
usage: prog.py [-h] [-v | -q] x y

calculate X to the power of Y

positional arguments:
  x              the base
  y              the exponent

options:
  -h, --help     show this help message and exit
  -v, --verbose
  -q, --quiet
@end example

The strings @code{usage:}, @code{positional arguments:}, @code{options:} and
@code{show this help message and exit} are all translatable.

In order to translate these strings, they must first be extracted
into a @code{.po} file. For example, using Babel@footnote{https://babel.pocoo.org/},
run this command:

@example
$ pybabel extract -o messages.po /usr/lib/python3.12/argparse.py
@end example

This command will extract all translatable strings from the @ref{7,,argparse}
module and output them into a file named @code{messages.po}. This command assumes
that your Python installation is in @code{/usr/lib}.

You can find out the location of the @ref{7,,argparse} module on your system
using this script:

@example
import argparse
print(argparse.__file__)
@end example

Once the messages in the @code{.po} file are translated and the translations are
installed using @ref{67,,gettext}, @ref{7,,argparse} will be able to display the
translated messages.

To translate your own strings in the @ref{7,,argparse} output, use @ref{67,,gettext}.

@node Custom type converters,Conclusion,How to translate the argparse output,Argparse Tutorial
@anchor{howto/argparse custom-type-converters}@anchor{3447}
@subsubsection Custom type converters


The @ref{7,,argparse} module allows you to specify custom type converters for
your command-line arguments. This allows you to modify user input before it’s
stored in the @ref{33e9,,argparse.Namespace}. This can be useful when you need to
pre-process the input before it is used in your program.

When using a custom type converter, you can use any callable that takes a
single string argument (the argument value) and returns the converted value.
However, if you need to handle more complex scenarios, you can use a custom
action class with the `action' parameter instead.

For example, let’s say you want to handle arguments with different prefixes and
process them accordingly:

@example
import argparse

parser = argparse.ArgumentParser(prefix_chars='-+')

parser.add_argument('-a', metavar='<value>', action='append',
                    type=lambda x: ('-', x))
parser.add_argument('+a', metavar='<value>', action='append',
                    type=lambda x: ('+', x))

args = parser.parse_args()
print(args)
@end example

Output:

@example
$ python prog.py -a value1 +a value2
Namespace(a=[('-', 'value1'), ('+', 'value2')])
@end example

In this example, we:


@itemize *

@item 
Created a parser with custom prefix characters using the @code{prefix_chars}
parameter.

@item 
Defined two arguments, @code{-a} and @code{+a}, which used the @code{type} parameter to
create custom type converters to store the value in a tuple with the prefix.
@end itemize

Without the custom type converters, the arguments would have treated the @code{-a}
and @code{+a} as the same argument, which would have been undesirable. By using custom
type converters, we were able to differentiate between the two arguments.

@node Conclusion,,Custom type converters,Argparse Tutorial
@anchor{howto/argparse conclusion}@anchor{3448}
@subsubsection Conclusion


The @ref{7,,argparse} module offers a lot more than shown here.
Its docs are quite detailed and thorough, and full of examples.
Having gone through this tutorial, you should easily digest them
without feeling overwhelmed.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)
@anchor{howto/argparse-optparse upgrading-optparse-code}@anchor{13ba}
@node Migrating optparse code to argparse,,Argparse Tutorial,Exceptions<11>
@anchor{howto/argparse-optparse doc}@anchor{3449}@anchor{howto/argparse-optparse migrating-optparse-code}@anchor{344a}@anchor{howto/argparse-optparse migrating-optparse-code-to-argparse}@anchor{344b}@anchor{howto/argparse-optparse translation-repo}@anchor{344c}
@subsubsection Migrating @code{optparse} code to @code{argparse}


The @ref{7,,argparse} module offers several higher level features not natively
provided by the @ref{a4,,optparse} module, including:


@itemize *

@item 
Handling positional arguments.

@item 
Supporting subcommands.

@item 
Allowing alternative option prefixes like @code{+} and @code{/}.

@item 
Handling zero-or-more and one-or-more style arguments.

@item 
Producing more informative usage messages.

@item 
Providing a much simpler interface for custom @code{type} and @code{action}.
@end itemize

Originally, the @ref{7,,argparse} module attempted to maintain compatibility
with @ref{a4,,optparse}.  However, the fundamental design differences between
supporting declarative command line option processing (while leaving positional
argument processing to application code), and supporting both named options
and positional arguments in the declarative interface mean that the
API has diverged from that of @code{optparse} over time.

As described in @ref{33e6,,Choosing an argument parsing library}, applications that are
currently using @ref{a4,,optparse} and are happy with the way it works can
just continue to use @code{optparse}.

Application developers that are considering migrating should also review
the list of intrinsic behavioural differences described in that section
before deciding whether or not migration is desirable.

For applications that do choose to migrate from @ref{a4,,optparse} to @ref{7,,argparse},
the following suggestions should be helpful:


@itemize *

@item 
Replace all @ref{344d,,optparse.OptionParser.add_option()} calls with
@ref{4bd,,ArgumentParser.add_argument()} calls.

@item 
Replace @code{(options, args) = parser.parse_args()} with @code{args =
parser.parse_args()} and add additional @ref{4bd,,ArgumentParser.add_argument()}
calls for the positional arguments. Keep in mind that what was previously
called @code{options}, now in the @ref{7,,argparse} context is called @code{args}.

@item 
Replace @ref{344e,,optparse.OptionParser.disable_interspersed_args()}
by using @ref{cfd,,parse_intermixed_args()} instead of
@ref{33e8,,parse_args()}.

@item 
Replace callback actions and the @code{callback_*} keyword arguments with
@code{type} or @code{action} arguments.

@item 
Replace string names for @code{type} keyword arguments with the corresponding
type objects (e.g. int, float, complex, etc).

@item 
Replace @ref{344f,,optparse.Values} with @ref{33e9,,Namespace} and
@ref{3450,,optparse.OptionError} and @ref{3451,,optparse.OptionValueError} with
@ref{3439,,ArgumentError}.

@item 
Replace strings with implicit arguments such as @code{%default} or @code{%prog} with
the standard Python syntax to use dictionaries to format strings, that is,
@code{%(default)s} and @code{%(prog)s}.

@item 
Replace the OptionParser constructor @code{version} argument with a call to
@code{parser.add_argument('--version', action='version', version='<the version>')}.
@end itemize

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node optparse — Parser for command line options,getpass — Portable password input,argparse — Parser for command-line options arguments and subcommands,Command-line interface libraries
@anchor{library/optparse doc}@anchor{3452}@anchor{library/optparse module-optparse}@anchor{a4}@anchor{library/optparse optparse-parser-for-command-line-options}@anchor{3453}@anchor{library/optparse translation-repo}@anchor{3454}
@subsection @code{optparse} — Parser for command line options


@geindex module; optparse

`Source code:' Lib/optparse.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/optparse.py}


__________________________________________________________________


@menu
* Choosing an argument parsing library:: 
* Introduction: Introduction<7>. 
* Background:: 
* Tutorial: Tutorial<2>. 
* Reference Guide:: 
* Option Callbacks:: 
* Extending optparse:: 
* Exceptions: Exceptions<12>. 

@end menu

@node Choosing an argument parsing library,Introduction<7>,,optparse — Parser for command line options
@anchor{library/optparse choosing-an-argument-parser}@anchor{33e6}@anchor{library/optparse choosing-an-argument-parsing-library}@anchor{3455}
@subsubsection Choosing an argument parsing library


The standard library includes three argument parsing libraries:


@itemize *

@item 
@ref{65,,getopt}: a module that closely mirrors the procedural C @code{getopt} API.
Included in the standard library since before the initial Python 1.0 release.

@item 
@code{optparse}: a declarative replacement for @code{getopt} that
provides equivalent functionality without requiring each application
to implement its own procedural option parsing logic. Included
in the standard library since the Python 2.3 release.

@item 
@ref{7,,argparse}: a more opinionated alternative to @code{optparse} that
provides more functionality by default, at the expense of reduced application
flexibility in controlling exactly how arguments are processed. Included in
the standard library since the Python 2.7 and Python 3.2 releases.
@end itemize

In the absence of more specific argument parsing design constraints, @ref{7,,argparse}
is the recommended choice for implementing command line applications, as it offers
the highest level of baseline functionality with the least application level code.

@ref{65,,getopt} is retained almost entirely for backwards compatibility reasons.
However, it also serves a niche use case as a tool for prototyping and testing
command line argument handling in @code{getopt}-based C applications.

@code{optparse} should be considered as an alternative to @ref{7,,argparse} in the
following cases:


@itemize *

@item 
an application is already using @code{optparse} and doesn’t want to risk the
subtle behavioural changes that may arise when migrating to @ref{7,,argparse}

@item 
the application requires additional control over the way options and
positional parameters are interleaved on the command line (including
the ability to disable the interleaving feature completely)

@item 
the application requires additional control over the incremental parsing
of command line elements (while @code{argparse} does support this, the
exact way it works in practice is undesirable for some use cases)

@item 
the application requires additional control over the handling of options
which accept parameter values that may start with @code{-} (such as delegated
options to be passed to invoked subprocesses)

@item 
the application requires some other command line parameter processing
behavior which @code{argparse} does not support, but which can be implemented
in terms of the lower level interface offered by @code{optparse}
@end itemize

These considerations also mean that @code{optparse} is likely to provide a
better foundation for library authors writing third party command line
argument processing libraries.

As a concrete example, consider the following two command line argument
parsing configurations, the first using @code{optparse}, and the second
using @code{argparse}:

@example
import optparse

if __name__ == '__main__':
    parser = optparse.OptionParser()
    parser.add_option('-o', '--output')
    parser.add_option('-v', dest='verbose', action='store_true')
    opts, args = parser.parse_args()
    process(args, output=opts.output, verbose=opts.verbose)
@end example

@example
import argparse

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('-o', '--output')
    parser.add_argument('-v', dest='verbose', action='store_true')
    parser.add_argument('rest', nargs='*')
    args = parser.parse_args()
    process(args.rest, output=args.output, verbose=args.verbose)
@end example

The most obvious difference is that in the @code{optparse} version, the non-option
arguments are processed separately by the application after the option processing
is complete. In the @code{argparse} version, positional arguments are declared and
processed in the same way as the named options.

However, the @code{argparse} version will also handle some parameter combination
differently from the way the @code{optparse} version would handle them.
For example (amongst other differences):


@itemize *

@item 
supplying @code{-o -v} gives @code{output="-v"} and @code{verbose=False}
when using @code{optparse}, but a usage error with @code{argparse}
(complaining that no value has been supplied for @code{-o/--output},
since @code{-v} is interpreted as meaning the verbosity flag)

@item 
similarly, supplying @code{-o --} gives @code{output="--"} and @code{args=()}
when using @code{optparse}, but a usage error with @code{argparse}
(also complaining that no value has been supplied for @code{-o/--output},
since @code{--} is interpreted as terminating the option processing
and treating all remaining values as positional arguments)

@item 
supplying @code{-o=foo} gives @code{output="=foo"} when using @code{optparse},
but gives @code{output="foo"} with @code{argparse} (since @code{=} is special
cased as an alternative separator for option parameter values)
@end itemize

Whether these differing behaviors in the @code{argparse} version are
considered desirable or a problem will depend on the specific command line
application use case.


@subsubheading See also


click@footnote{https://pypi.org/project/click/} is a third party argument processing library (originally
based on @code{optparse}), which allows command line applications to be
developed as a set of decorated command implementation functions.

Other third party libraries, such as typer@footnote{https://pypi.org/project/typer/} or msgspec-click@footnote{https://pypi.org/project/msgspec-click/},
allow command line interfaces to be specified in ways that more effectively
integrate with static checking of Python type annotations.


@node Introduction<7>,Background,Choosing an argument parsing library,optparse — Parser for command line options
@anchor{library/optparse introduction}@anchor{3456}
@subsubsection Introduction


@code{optparse} is a more convenient, flexible, and powerful library for parsing
command-line options than the minimalist @ref{65,,getopt} module.
@code{optparse} uses a more declarative style of command-line parsing:
you create an instance of @ref{16d9,,OptionParser},
populate it with options, and parse the command line.
@code{optparse} allows users to specify options in the conventional
GNU/POSIX syntax, and additionally generates usage and help messages for you.

Here’s an example of using @code{optparse} in a simple script:

@example
from optparse import OptionParser
...
parser = OptionParser()
parser.add_option("-f", "--file", dest="filename",
                  help="write report to FILE", metavar="FILE")
parser.add_option("-q", "--quiet",
                  action="store_false", dest="verbose", default=True,
                  help="don't print status messages to stdout")

(options, args) = parser.parse_args()
@end example

With these few lines of code, users of your script can now do the “usual thing”
on the command-line, for example:

@example
<yourscript> --file=outfile -q
@end example

As it parses the command line, @code{optparse} sets attributes of the
@code{options} object returned by @ref{16da,,parse_args()} based on user-supplied
command-line values.  When @code{parse_args()} returns from parsing this command
line, @code{options.filename} will be @code{"outfile"} and @code{options.verbose} will be
@code{False}.  @code{optparse} supports both long and short options, allows short
options to be merged together, and allows options to be associated with their
arguments in a variety of ways.  Thus, the following command lines are all
equivalent to the above example:

@example
<yourscript> -f outfile --quiet
<yourscript> --quiet --file outfile
<yourscript> -q -foutfile
<yourscript> -qfoutfile
@end example

Additionally, users can run one of the following

@example
<yourscript> -h
<yourscript> --help
@end example

and @code{optparse} will print out a brief summary of your script’s options:

@example
Usage: <yourscript> [options]

Options:
  -h, --help            show this help message and exit
  -f FILE, --file=FILE  write report to FILE
  -q, --quiet           don't print status messages to stdout
@end example

where the value of `yourscript' is determined at runtime (normally from
@code{sys.argv[0]}).

@node Background,Tutorial<2>,Introduction<7>,optparse — Parser for command line options
@anchor{library/optparse background}@anchor{3457}@anchor{library/optparse optparse-background}@anchor{3458}
@subsubsection Background


@code{optparse} was explicitly designed to encourage the creation of programs
with straightforward command-line interfaces that follow the conventions
established by the @code{getopt()} family of functions available to C developers.
To that end, it supports only the most common command-line syntax and semantics
conventionally used under Unix.  If you are unfamiliar with these conventions,
reading this section will allow you to acquaint yourself with them.

@menu
* Terminology:: 
* What are options for?:: 
* What are positional arguments for?:: 

@end menu

@node Terminology,What are options for?,,Background
@anchor{library/optparse optparse-terminology}@anchor{3459}@anchor{library/optparse terminology}@anchor{345a}
@subsubsection Terminology



@table @asis

@item argument

a string entered on the command-line, and passed by the shell to @code{execl()}
or @code{execv()}.  In Python, arguments are elements of @code{sys.argv[1:]}
(@code{sys.argv[0]} is the name of the program being executed).  Unix shells
also use the term “word”.

It is occasionally desirable to substitute an argument list other than
@code{sys.argv[1:]}, so you should read “argument” as “an element of
@code{sys.argv[1:]}, or of some other list provided as a substitute for
@code{sys.argv[1:]}”.

@item option

an argument used to supply extra information to guide or customize the
execution of a program.  There are many different syntaxes for options; the
traditional Unix syntax is a hyphen (“-”) followed by a single letter,
e.g. @code{-x} or @code{-F}.  Also, traditional Unix syntax allows multiple
options to be merged into a single argument, e.g. @code{-x -F} is equivalent
to @code{-xF}.  The GNU project introduced @code{--} followed by a series of
hyphen-separated words, e.g. @code{--file} or @code{--dry-run}.  These are the
only two option syntaxes provided by @code{optparse}.

Some other option syntaxes that the world has seen include:


@itemize *

@item 
a hyphen followed by a few letters, e.g. @code{-pf} (this is `not' the same
as multiple options merged into a single argument)

@item 
a hyphen followed by a whole word, e.g. @code{-file} (this is technically
equivalent to the previous syntax, but they aren’t usually seen in the same
program)

@item 
a plus sign followed by a single letter, or a few letters, or a word, e.g.
@code{+f}, @code{+rgb}

@item 
a slash followed by a letter, or a few letters, or a word, e.g. @code{/f},
@code{/file}
@end itemize

These option syntaxes are not supported by @code{optparse}, and they never
will be.  This is deliberate: the first three are non-standard on any
environment, and the last only makes sense if you’re exclusively targeting
Windows or certain legacy platforms (e.g. VMS, MS-DOS).

@item option argument

an argument that follows an option, is closely associated with that option,
and is consumed from the argument list when that option is. With
@code{optparse}, option arguments may either be in a separate argument from
their option:

@example
-f foo
--file foo
@end example

or included in the same argument:

@example
-ffoo
--file=foo
@end example

Typically, a given option either takes an argument or it doesn’t. Lots of
people want an “optional option arguments” feature, meaning that some options
will take an argument if they see it, and won’t if they don’t.  This is
somewhat controversial, because it makes parsing ambiguous: if @code{-a} takes
an optional argument and @code{-b} is another option entirely, how do we
interpret @code{-ab}?  Because of this ambiguity, @code{optparse} does not
support this feature.

@item positional argument

something leftover in the argument list after options have been parsed, i.e.
after options and their arguments have been parsed and removed from the
argument list.

@item required option

an option that must be supplied on the command-line; note that the phrase
“required option” is self-contradictory in English.  @code{optparse} doesn’t
prevent you from implementing required options, but doesn’t give you much
help at it either.
@end table

For example, consider this hypothetical command-line:

@example
prog -v --report report.txt foo bar
@end example

@code{-v} and @code{--report} are both options.  Assuming that @code{--report}
takes one argument, @code{report.txt} is an option argument.  @code{foo} and
@code{bar} are positional arguments.

@node What are options for?,What are positional arguments for?,Terminology,Background
@anchor{library/optparse optparse-what-options-for}@anchor{345b}@anchor{library/optparse what-are-options-for}@anchor{345c}
@subsubsection What are options for?


Options are used to provide extra information to tune or customize the execution
of a program.  In case it wasn’t clear, options are usually `optional'.  A
program should be able to run just fine with no options whatsoever.  (Pick a
random program from the Unix or GNU toolsets.  Can it run without any options at
all and still make sense?  The main exceptions are @code{find}, @code{tar}, and
@code{dd}—all of which are mutant oddballs that have been rightly criticized
for their non-standard syntax and confusing interfaces.)

Lots of people want their programs to have “required options”.  Think about it.
If it’s required, then it’s `not optional'!  If there is a piece of information
that your program absolutely requires in order to run successfully, that’s what
positional arguments are for.

As an example of good command-line interface design, consider the humble @code{cp}
utility, for copying files.  It doesn’t make much sense to try to copy files
without supplying a destination and at least one source. Hence, @code{cp} fails if
you run it with no arguments.  However, it has a flexible, useful syntax that
does not require any options at all:

@example
cp SOURCE DEST
cp SOURCE ... DEST-DIR
@end example

You can get pretty far with just that.  Most @code{cp} implementations provide a
bunch of options to tweak exactly how the files are copied: you can preserve
mode and modification time, avoid following symlinks, ask before clobbering
existing files, etc.  But none of this distracts from the core mission of
@code{cp}, which is to copy either one file to another, or several files to another
directory.

@node What are positional arguments for?,,What are options for?,Background
@anchor{library/optparse optparse-what-positional-arguments-for}@anchor{345d}@anchor{library/optparse what-are-positional-arguments-for}@anchor{345e}
@subsubsection What are positional arguments for?


Positional arguments are for those pieces of information that your program
absolutely, positively requires to run.

A good user interface should have as few absolute requirements as possible.  If
your program requires 17 distinct pieces of information in order to run
successfully, it doesn’t much matter `how' you get that information from the
user—most people will give up and walk away before they successfully run the
program.  This applies whether the user interface is a command-line, a
configuration file, or a GUI: if you make that many demands on your users, most
of them will simply give up.

In short, try to minimize the amount of information that users are absolutely
required to supply—use sensible defaults whenever possible.  Of course, you
also want to make your programs reasonably flexible.  That’s what options are
for.  Again, it doesn’t matter if they are entries in a config file, widgets in
the “Preferences” dialog of a GUI, or command-line options—the more options
you implement, the more flexible your program is, and the more complicated its
implementation becomes.  Too much flexibility has drawbacks as well, of course;
too many options can overwhelm users and make your code much harder to maintain.

@node Tutorial<2>,Reference Guide,Background,optparse — Parser for command line options
@anchor{library/optparse optparse-tutorial}@anchor{345f}@anchor{library/optparse tutorial}@anchor{3460}
@subsubsection Tutorial


While @code{optparse} is quite flexible and powerful, it’s also straightforward
to use in most cases.  This section covers the code patterns that are common to
any @code{optparse}-based program.

First, you need to import the OptionParser class; then, early in the main
program, create an OptionParser instance:

@example
from optparse import OptionParser
...
parser = OptionParser()
@end example

Then you can start defining options.  The basic syntax is:

@example
parser.add_option(opt_str, ...,
                  attr=value, ...)
@end example

Each option has one or more option strings, such as @code{-f} or @code{--file},
and several option attributes that tell @code{optparse} what to expect and what
to do when it encounters that option on the command line.

Typically, each option will have one short option string and one long option
string, e.g.:

@example
parser.add_option("-f", "--file", ...)
@end example

You’re free to define as many short option strings and as many long option
strings as you like (including zero), as long as there is at least one option
string overall.

The option strings passed to @ref{344d,,OptionParser.add_option()} are effectively
labels for the
option defined by that call.  For brevity, we will frequently refer to
`encountering an option' on the command line; in reality, @code{optparse}
encounters `option strings' and looks up options from them.

Once all of your options are defined, instruct @code{optparse} to parse your
program’s command line:

@example
(options, args) = parser.parse_args()
@end example

(If you like, you can pass a custom argument list to @ref{16da,,parse_args()}, but
that’s rarely necessary: by default it uses @code{sys.argv[1:]}.)

@ref{16da,,parse_args()} returns two values:


@itemize *

@item 
@code{options}, an object containing values for all of your options—e.g. if
@code{--file} takes a single string argument, then @code{options.file} will be the
filename supplied by the user, or @code{None} if the user did not supply that
option

@item 
@code{args}, the list of positional arguments leftover after parsing options
@end itemize

This tutorial section only covers the four most important option attributes:
@ref{3461,,action}, @ref{3462,,type}, @ref{3463,,dest}
(destination), and @ref{3464,,help}. Of these, @code{action} is the
most fundamental.

@menu
* Understanding option actions:: 
* The store action:: 
* Handling boolean (flag) options: Handling boolean flag options. 
* Other actions:: 
* Default values:: 
* Generating help:: 
* Printing a version string:: 
* How optparse handles errors:: 
* Putting it all together:: 

@end menu

@node Understanding option actions,The store action,,Tutorial<2>
@anchor{library/optparse optparse-understanding-option-actions}@anchor{3465}@anchor{library/optparse understanding-option-actions}@anchor{3466}
@subsubsection Understanding option actions


Actions tell @code{optparse} what to do when it encounters an option on the
command line.  There is a fixed set of actions hard-coded into @code{optparse};
adding new actions is an advanced topic covered in section
@ref{3467,,Extending optparse}.  Most actions tell @code{optparse} to store
a value in some variable—for example, take a string from the command line and
store it in an attribute of @code{options}.

If you don’t specify an option action, @code{optparse} defaults to @code{store}.

@node The store action,Handling boolean flag options,Understanding option actions,Tutorial<2>
@anchor{library/optparse optparse-store-action}@anchor{3468}@anchor{library/optparse the-store-action}@anchor{3469}
@subsubsection The store action


The most common option action is @code{store}, which tells @code{optparse} to take
the next argument (or the remainder of the current argument), ensure that it is
of the correct type, and store it to your chosen destination.

For example:

@example
parser.add_option("-f", "--file",
                  action="store", type="string", dest="filename")
@end example

Now let’s make up a fake command line and ask @code{optparse} to parse it:

@example
args = ["-f", "foo.txt"]
(options, args) = parser.parse_args(args)
@end example

When @code{optparse} sees the option string @code{-f}, it consumes the next
argument, @code{foo.txt}, and stores it in @code{options.filename}.  So, after this
call to @ref{16da,,parse_args()}, @code{options.filename} is @code{"foo.txt"}.

Some other option types supported by @code{optparse} are @code{int} and @code{float}.
Here’s an option that expects an integer argument:

@example
parser.add_option("-n", type="int", dest="num")
@end example

Note that this option has no long option string, which is perfectly acceptable.
Also, there’s no explicit action, since the default is @code{store}.

Let’s parse another fake command-line.  This time, we’ll jam the option argument
right up against the option: since @code{-n42} (one argument) is equivalent to
@code{-n 42} (two arguments), the code

@example
(options, args) = parser.parse_args(["-n42"])
print(options.num)
@end example

will print @code{42}.

If you don’t specify a type, @code{optparse} assumes @code{string}.  Combined with
the fact that the default action is @code{store}, that means our first example can
be a lot shorter:

@example
parser.add_option("-f", "--file", dest="filename")
@end example

If you don’t supply a destination, @code{optparse} figures out a sensible
default from the option strings: if the first long option string is
@code{--foo-bar}, then the default destination is @code{foo_bar}.  If there are no
long option strings, @code{optparse} looks at the first short option string: the
default destination for @code{-f} is @code{f}.

@code{optparse} also includes the built-in @code{complex} type.  Adding
types is covered in section @ref{3467,,Extending optparse}.

@node Handling boolean flag options,Other actions,The store action,Tutorial<2>
@anchor{library/optparse handling-boolean-flag-options}@anchor{346a}@anchor{library/optparse optparse-handling-boolean-options}@anchor{346b}
@subsubsection Handling boolean (flag) options


Flag options—set a variable to true or false when a particular option is
seen—are quite common.  @code{optparse} supports them with two separate actions,
@code{store_true} and @code{store_false}.  For example, you might have a @code{verbose}
flag that is turned on with @code{-v} and off with @code{-q}:

@example
parser.add_option("-v", action="store_true", dest="verbose")
parser.add_option("-q", action="store_false", dest="verbose")
@end example

Here we have two different options with the same destination, which is perfectly
OK.  (It just means you have to be a bit careful when setting default
values—see below.)

When @code{optparse} encounters @code{-v} on the command line, it sets
@code{options.verbose} to @code{True}; when it encounters @code{-q},
@code{options.verbose} is set to @code{False}.

@node Other actions,Default values,Handling boolean flag options,Tutorial<2>
@anchor{library/optparse optparse-other-actions}@anchor{346c}@anchor{library/optparse other-actions}@anchor{346d}
@subsubsection Other actions


Some other actions supported by @code{optparse} are:


@table @asis

@item @code{"store_const"}

store a constant value, pre-set via @ref{346e,,Option.const}

@item @code{"append"}

append this option’s argument to a list

@item @code{"count"}

increment a counter by one

@item @code{"callback"}

call a specified function
@end table

These are covered in section @ref{346f,,Reference Guide},
and section @ref{3470,,Option Callbacks}.

@node Default values,Generating help,Other actions,Tutorial<2>
@anchor{library/optparse default-values}@anchor{3471}@anchor{library/optparse optparse-default-values}@anchor{3472}
@subsubsection Default values


All of the above examples involve setting some variable (the “destination”) when
certain command-line options are seen.  What happens if those options are never
seen?  Since we didn’t supply any defaults, they are all set to @code{None}.  This
is usually fine, but sometimes you want more control.  @code{optparse} lets you
supply a default value for each destination, which is assigned before the
command line is parsed.

First, consider the verbose/quiet example.  If we want @code{optparse} to set
@code{verbose} to @code{True} unless @code{-q} is seen, then we can do this:

@example
parser.add_option("-v", action="store_true", dest="verbose", default=True)
parser.add_option("-q", action="store_false", dest="verbose")
@end example

Since default values apply to the `destination' rather than to any particular
option, and these two options happen to have the same destination, this is
exactly equivalent:

@example
parser.add_option("-v", action="store_true", dest="verbose")
parser.add_option("-q", action="store_false", dest="verbose", default=True)
@end example

Consider this:

@example
parser.add_option("-v", action="store_true", dest="verbose", default=False)
parser.add_option("-q", action="store_false", dest="verbose", default=True)
@end example

Again, the default value for @code{verbose} will be @code{True}: the last default
value supplied for any particular destination is the one that counts.

A clearer way to specify default values is the @code{set_defaults()} method of
OptionParser, which you can call at any time before calling
@ref{16da,,parse_args()}:

@example
parser.set_defaults(verbose=True)
parser.add_option(...)
(options, args) = parser.parse_args()
@end example

As before, the last value specified for a given option destination is the one
that counts.  For clarity, try to use one method or the other of setting default
values, not both.

@node Generating help,Printing a version string,Default values,Tutorial<2>
@anchor{library/optparse generating-help}@anchor{3473}@anchor{library/optparse optparse-generating-help}@anchor{3474}
@subsubsection Generating help


@code{optparse}’s ability to generate help and usage text automatically is
useful for creating user-friendly command-line interfaces.  All you have to do
is supply a @ref{3464,,help} value for each option, and optionally a short
usage message for your whole program.  Here’s an OptionParser populated with
user-friendly (documented) options:

@example
usage = "usage: %prog [options] arg1 arg2"
parser = OptionParser(usage=usage)
parser.add_option("-v", "--verbose",
                  action="store_true", dest="verbose", default=True,
                  help="make lots of noise [default]")
parser.add_option("-q", "--quiet",
                  action="store_false", dest="verbose",
                  help="be vewwy quiet (I'm hunting wabbits)")
parser.add_option("-f", "--filename",
                  metavar="FILE", help="write output to FILE")
parser.add_option("-m", "--mode",
                  default="intermediate",
                  help="interaction mode: novice, intermediate, "
                       "or expert [default: %default]")
@end example

If @code{optparse} encounters either @code{-h} or @code{--help} on the
command-line, or if you just call @code{parser.print_help()}, it prints the
following to standard output:

@example
Usage: <yourscript> [options] arg1 arg2

Options:
  -h, --help            show this help message and exit
  -v, --verbose         make lots of noise [default]
  -q, --quiet           be vewwy quiet (I'm hunting wabbits)
  -f FILE, --filename=FILE
                        write output to FILE
  -m MODE, --mode=MODE  interaction mode: novice, intermediate, or
                        expert [default: intermediate]
@end example

(If the help output is triggered by a help option, @code{optparse} exits after
printing the help text.)

There’s a lot going on here to help @code{optparse} generate the best possible
help message:


@itemize *

@item 
the script defines its own usage message:

@example
usage = "usage: %prog [options] arg1 arg2"
@end example

@code{optparse} expands @code{%prog} in the usage string to the name of the
current program, i.e. @code{os.path.basename(sys.argv[0])}.  The expanded string
is then printed before the detailed option help.

If you don’t supply a usage string, @code{optparse} uses a bland but sensible
default: @code{"Usage: %prog [options]"}, which is fine if your script doesn’t
take any positional arguments.

@item 
every option defines a help string, and doesn’t worry about
line-wrapping—@code{optparse} takes care of wrapping lines and making
the help output look good.

@item 
options that take a value indicate this fact in their automatically generated
help message, e.g. for the “mode” option:

@example
-m MODE, --mode=MODE
@end example

Here, “MODE” is called the meta-variable: it stands for the argument that the
user is expected to supply to @code{-m}/@code{--mode}.  By default,
@code{optparse} converts the destination variable name to uppercase and uses
that for the meta-variable.  Sometimes, that’s not what you want—for
example, the @code{--filename} option explicitly sets @code{metavar="FILE"},
resulting in this automatically generated option description:

@example
-f FILE, --filename=FILE
@end example

This is important for more than just saving space, though: the manually
written help text uses the meta-variable @code{FILE} to clue the user in that
there’s a connection between the semi-formal syntax @code{-f FILE} and the informal
semantic description “write output to FILE”. This is a simple but effective
way to make your help text a lot clearer and more useful for end users.

@item 
options that have a default value can include @code{%default} in the help
string—@code{optparse} will replace it with @ref{16a,,str()} of the option’s
default value.  If an option has no default value (or the default value is
@code{None}), @code{%default} expands to @code{none}.
@end itemize

@menu
* Grouping Options:: 

@end menu

@node Grouping Options,,,Generating help
@anchor{library/optparse grouping-options}@anchor{3475}
@subsubsection Grouping Options


When dealing with many options, it is convenient to group these options for
better help output.  An @ref{16d9,,OptionParser} can contain several option groups,
each of which can contain several options.

An option group is obtained using the class @ref{3476,,OptionGroup}:

@geindex OptionGroup (class in optparse)
@anchor{library/optparse optparse OptionGroup}@anchor{3476}
@deffn {Class} optparse.OptionGroup (parser, title, description=None)

where


@itemize *

@item 
parser is the @ref{16d9,,OptionParser} instance the group will be inserted in
to

@item 
title is the group title

@item 
description, optional, is a long description of the group
@end itemize
@end deffn

@ref{3476,,OptionGroup} inherits from @code{OptionContainer} (like
@ref{16d9,,OptionParser}) and so the @code{add_option()} method can be used to add
an option to the group.

Once all the options are declared, using the @ref{16d9,,OptionParser} method
@code{add_option_group()} the group is added to the previously defined parser.

Continuing with the parser defined in the previous section, adding an
@ref{3476,,OptionGroup} to a parser is easy:

@example
group = OptionGroup(parser, "Dangerous Options",
                    "Caution: use these options at your own risk.  "
                    "It is believed that some of them bite.")
group.add_option("-g", action="store_true", help="Group option.")
parser.add_option_group(group)
@end example

This would result in the following help output:

@example
Usage: <yourscript> [options] arg1 arg2

Options:
  -h, --help            show this help message and exit
  -v, --verbose         make lots of noise [default]
  -q, --quiet           be vewwy quiet (I'm hunting wabbits)
  -f FILE, --filename=FILE
                        write output to FILE
  -m MODE, --mode=MODE  interaction mode: novice, intermediate, or
                        expert [default: intermediate]

  Dangerous Options:
    Caution: use these options at your own risk.  It is believed that some
    of them bite.

    -g                  Group option.
@end example

A bit more complete example might involve using more than one group: still
extending the previous example:

@example
group = OptionGroup(parser, "Dangerous Options",
                    "Caution: use these options at your own risk.  "
                    "It is believed that some of them bite.")
group.add_option("-g", action="store_true", help="Group option.")
parser.add_option_group(group)

group = OptionGroup(parser, "Debug Options")
group.add_option("-d", "--debug", action="store_true",
                 help="Print debug information")
group.add_option("-s", "--sql", action="store_true",
                 help="Print all SQL statements executed")
group.add_option("-e", action="store_true", help="Print every action done")
parser.add_option_group(group)
@end example

that results in the following output:

@example
Usage: <yourscript> [options] arg1 arg2

Options:
  -h, --help            show this help message and exit
  -v, --verbose         make lots of noise [default]
  -q, --quiet           be vewwy quiet (I'm hunting wabbits)
  -f FILE, --filename=FILE
                        write output to FILE
  -m MODE, --mode=MODE  interaction mode: novice, intermediate, or expert
                        [default: intermediate]

  Dangerous Options:
    Caution: use these options at your own risk.  It is believed that some
    of them bite.

    -g                  Group option.

  Debug Options:
    -d, --debug         Print debug information
    -s, --sql           Print all SQL statements executed
    -e                  Print every action done
@end example

Another interesting method, in particular when working programmatically with
option groups is:

@geindex get_option_group() (optparse.OptionParser method)
@anchor{library/optparse optparse OptionParser get_option_group}@anchor{3477}
@deffn {Method} OptionParser.get_option_group (opt_str)

Return the @ref{3476,,OptionGroup} to which the short or long option
string `opt_str' (e.g. @code{'-o'} or @code{'--option'}) belongs. If
there’s no such @code{OptionGroup}, return @code{None}.
@end deffn

@node Printing a version string,How optparse handles errors,Generating help,Tutorial<2>
@anchor{library/optparse optparse-printing-version-string}@anchor{3478}@anchor{library/optparse printing-a-version-string}@anchor{3479}
@subsubsection Printing a version string


Similar to the brief usage string, @code{optparse} can also print a version
string for your program.  You have to supply the string as the @code{version}
argument to OptionParser:

@example
parser = OptionParser(usage="%prog [-f] [-q]", version="%prog 1.0")
@end example

@code{%prog} is expanded just like it is in @code{usage}.  Apart from that,
@code{version} can contain anything you like.  When you supply it, @code{optparse}
automatically adds a @code{--version} option to your parser. If it encounters
this option on the command line, it expands your @code{version} string (by
replacing @code{%prog}), prints it to stdout, and exits.

For example, if your script is called @code{/usr/bin/foo}:

@example
$ /usr/bin/foo --version
foo 1.0
@end example

The following two methods can be used to print and get the @code{version} string:

@geindex print_version() (optparse.OptionParser method)
@anchor{library/optparse optparse OptionParser print_version}@anchor{347a}
@deffn {Method} OptionParser.print_version (file=None)

Print the version message for the current program (@code{self.version}) to
`file' (default stdout).  As with @ref{347b,,print_usage()}, any occurrence
of @code{%prog} in @code{self.version} is replaced with the name of the current
program.  Does nothing if @code{self.version} is empty or undefined.
@end deffn

@geindex get_version() (optparse.OptionParser method)
@anchor{library/optparse optparse OptionParser get_version}@anchor{347c}
@deffn {Method} OptionParser.get_version ()

Same as @ref{347a,,print_version()} but returns the version string instead of
printing it.
@end deffn

@node How optparse handles errors,Putting it all together,Printing a version string,Tutorial<2>
@anchor{library/optparse how-optparse-handles-errors}@anchor{347d}@anchor{library/optparse optparse-how-optparse-handles-errors}@anchor{347e}
@subsubsection How @code{optparse} handles errors


There are two broad classes of errors that @code{optparse} has to worry about:
programmer errors and user errors.  Programmer errors are usually erroneous
calls to @ref{344d,,OptionParser.add_option()}, e.g. invalid option strings, unknown
option attributes, missing option attributes, etc.  These are dealt with in the
usual way: raise an exception (either @ref{3450,,optparse.OptionError} or
@ref{199,,TypeError}) and let the program crash.

Handling user errors is much more important, since they are guaranteed to happen
no matter how stable your code is.  @code{optparse} can automatically detect
some user errors, such as bad option arguments (passing @code{-n 4x} where
@code{-n} takes an integer argument), missing arguments (@code{-n} at the end
of the command line, where @code{-n} takes an argument of any type).  Also,
you can call @code{OptionParser.error()} to signal an application-defined error
condition:

@example
(options, args) = parser.parse_args()
...
if options.a and options.b:
    parser.error("options -a and -b are mutually exclusive")
@end example

In either case, @code{optparse} handles the error the same way: it prints the
program’s usage message and an error message to standard error and exits with
error status 2.

Consider the first example above, where the user passes @code{4x} to an option
that takes an integer:

@example
$ /usr/bin/foo -n 4x
Usage: foo [options]

foo: error: option -n: invalid integer value: '4x'
@end example

Or, where the user fails to pass a value at all:

@example
$ /usr/bin/foo -n
Usage: foo [options]

foo: error: -n option requires an argument
@end example

@code{optparse}-generated error messages take care always to mention the
option involved in the error; be sure to do the same when calling
@code{OptionParser.error()} from your application code.

If @code{optparse}’s default error-handling behaviour does not suit your needs,
you’ll need to subclass OptionParser and override its @code{exit()}
and/or @code{error()} methods.

@node Putting it all together,,How optparse handles errors,Tutorial<2>
@anchor{library/optparse optparse-putting-it-all-together}@anchor{347f}@anchor{library/optparse putting-it-all-together}@anchor{3480}
@subsubsection Putting it all together


Here’s what @code{optparse}-based scripts usually look like:

@example
from optparse import OptionParser
...
def main():
    usage = "usage: %prog [options] arg"
    parser = OptionParser(usage)
    parser.add_option("-f", "--file", dest="filename",
                      help="read data from FILENAME")
    parser.add_option("-v", "--verbose",
                      action="store_true", dest="verbose")
    parser.add_option("-q", "--quiet",
                      action="store_false", dest="verbose")
    ...
    (options, args) = parser.parse_args()
    if len(args) != 1:
        parser.error("incorrect number of arguments")
    if options.verbose:
        print("reading %s..." % options.filename)
    ...

if __name__ == "__main__":
    main()
@end example

@node Reference Guide,Option Callbacks,Tutorial<2>,optparse — Parser for command line options
@anchor{library/optparse optparse-reference-guide}@anchor{346f}@anchor{library/optparse reference-guide}@anchor{3481}
@subsubsection Reference Guide


@menu
* Creating the parser:: 
* Populating the parser:: 
* Defining options:: 
* Option attributes:: 
* Standard option actions:: 
* Standard option types:: 
* Parsing arguments:: 
* Querying and manipulating your option parser:: 
* Conflicts between options:: 
* Cleanup:: 
* Other methods:: 

@end menu

@node Creating the parser,Populating the parser,,Reference Guide
@anchor{library/optparse creating-the-parser}@anchor{3482}@anchor{library/optparse optparse-creating-parser}@anchor{3483}
@subsubsection Creating the parser


The first step in using @code{optparse} is to create an OptionParser instance.

@geindex OptionParser (class in optparse)
@anchor{library/optparse optparse OptionParser}@anchor{16d9}
@deffn {Class} optparse.OptionParser (...)

The OptionParser constructor has no required arguments, but a number of
optional keyword arguments.  You should always pass them as keyword
arguments, i.e. do not rely on the order in which the arguments are declared.


@table @asis

@item @code{usage} (default: @code{"%prog [options]"})

The usage summary to print when your program is run incorrectly or with a
help option.  When @code{optparse} prints the usage string, it expands
@code{%prog} to @code{os.path.basename(sys.argv[0])} (or to @code{prog} if you
passed that keyword argument).  To suppress a usage message, pass the
special value @code{optparse.SUPPRESS_USAGE}.

@item @code{option_list} (default: @code{[]})

A list of Option objects to populate the parser with.  The options in
@code{option_list} are added after any options in @code{standard_option_list} (a
class attribute that may be set by OptionParser subclasses), but before
any version or help options. Deprecated; use @ref{344d,,add_option()} after
creating the parser instead.

@item @code{option_class} (default: optparse.Option)

Class to use when adding options to the parser in @ref{344d,,add_option()}.

@item @code{version} (default: @code{None})

A version string to print when the user supplies a version option. If you
supply a true value for @code{version}, @code{optparse} automatically adds a
version option with the single option string @code{--version}.  The
substring @code{%prog} is expanded the same as for @code{usage}.

@item @code{conflict_handler} (default: @code{"error"})

Specifies what to do when options with conflicting option strings are
added to the parser; see section
@ref{3484,,Conflicts between options}.

@item @code{description} (default: @code{None})

A paragraph of text giving a brief overview of your program.
@code{optparse} reformats this paragraph to fit the current terminal width
and prints it when the user requests help (after @code{usage}, but before the
list of options).

@item @code{formatter} (default: a new @code{IndentedHelpFormatter})

An instance of optparse.HelpFormatter that will be used for printing help
text.  @code{optparse} provides two concrete classes for this purpose:
IndentedHelpFormatter and TitledHelpFormatter.

@item @code{add_help_option} (default: @code{True})

If true, @code{optparse} will add a help option (with option strings @code{-h}
and @code{--help}) to the parser.

@item @code{prog}

The string to use when expanding @code{%prog} in @code{usage} and @code{version}
instead of @code{os.path.basename(sys.argv[0])}.

@item @code{epilog} (default: @code{None})

A paragraph of help text to print after the option help.
@end table
@end deffn

@node Populating the parser,Defining options,Creating the parser,Reference Guide
@anchor{library/optparse optparse-populating-parser}@anchor{3485}@anchor{library/optparse populating-the-parser}@anchor{3486}
@subsubsection Populating the parser


There are several ways to populate the parser with options.  The preferred way
is by using @ref{344d,,OptionParser.add_option()}, as shown in section
@ref{345f,,Tutorial}.  @code{add_option()} can be called in one of two ways:


@itemize *

@item 
pass it an Option instance (as returned by @code{make_option()})

@item 
pass it any combination of positional and keyword arguments that are
acceptable to @code{make_option()} (i.e., to the Option constructor), and it
will create the Option instance for you
@end itemize

The other alternative is to pass a list of pre-constructed Option instances to
the OptionParser constructor, as in:

@example
option_list = [
    make_option("-f", "--filename",
                action="store", type="string", dest="filename"),
    make_option("-q", "--quiet",
                action="store_false", dest="verbose"),
    ]
parser = OptionParser(option_list=option_list)
@end example

(@code{make_option()} is a factory function for creating Option instances;
currently it is an alias for the Option constructor.  A future version of
@code{optparse} may split Option into several classes, and @code{make_option()}
will pick the right class to instantiate.  Do not instantiate Option directly.)

@node Defining options,Option attributes,Populating the parser,Reference Guide
@anchor{library/optparse defining-options}@anchor{3487}@anchor{library/optparse optparse-defining-options}@anchor{3488}
@subsubsection Defining options


Each Option instance represents a set of synonymous command-line option strings,
e.g. @code{-f} and @code{--file}.  You can specify any number of short or
long option strings, but you must specify at least one overall option string.

The canonical way to create an @ref{3489,,Option} instance is with the
@code{add_option()} method of @ref{16d9,,OptionParser}.

@geindex add_option() (optparse.OptionParser method)
@anchor{library/optparse optparse OptionParser add_option}@anchor{344d}
@deffn {Method} OptionParser.add_option (option)

@deffnx {Method} OptionParser.add_option (*opt_str, attr=value, ...)

To define an option with only a short option string:

@example
parser.add_option("-f", attr=value, ...)
@end example

And to define an option with only a long option string:

@example
parser.add_option("--foo", attr=value, ...)
@end example

The keyword arguments define attributes of the new Option object.  The most
important option attribute is @ref{3461,,action}, and it largely
determines which other attributes are relevant or required.  If you pass
irrelevant option attributes, or fail to pass required ones, @code{optparse}
raises an @ref{3450,,OptionError} exception explaining your mistake.

An option’s `action' determines what @code{optparse} does when it encounters
this option on the command-line.  The standard option actions hard-coded into
@code{optparse} are:


@table @asis

@item @code{"store"}

store this option’s argument (default)

@item @code{"store_const"}

store a constant value, pre-set via @ref{346e,,Option.const}

@item @code{"store_true"}

store @code{True}

@item @code{"store_false"}

store @code{False}

@item @code{"append"}

append this option’s argument to a list

@item @code{"append_const"}

append a constant value to a list, pre-set via @ref{346e,,Option.const}

@item @code{"count"}

increment a counter by one

@item @code{"callback"}

call a specified function

@item @code{"help"}

print a usage message including all options and the documentation for them
@end table

(If you don’t supply an action, the default is @code{"store"}.  For this action,
you may also supply @ref{3462,,type} and @ref{3463,,dest} option
attributes; see @ref{348a,,Standard option actions}.)
@end deffn

As you can see, most actions involve storing or updating a value somewhere.
@code{optparse} always creates a special object for this, conventionally called
@code{options}, which is an instance of @ref{344f,,optparse.Values}.

@geindex Values (class in optparse)
@anchor{library/optparse optparse Values}@anchor{344f}
@deffn {Class} optparse.Values

An object holding parsed argument names and values as attributes.
Normally created by calling when calling @ref{16da,,OptionParser.parse_args()},
and can be overridden by a custom subclass passed to the `values' argument of
@code{OptionParser.parse_args()} (as described in @ref{348b,,Parsing arguments}).
@end deffn

Option
arguments (and various other values) are stored as attributes of this object,
according to the @ref{3463,,dest} (destination) option attribute.

For example, when you call

@example
parser.parse_args()
@end example

one of the first things @code{optparse} does is create the @code{options} object:

@example
options = Values()
@end example

If one of the options in this parser is defined with

@example
parser.add_option("-f", "--file", action="store", type="string", dest="filename")
@end example

and the command-line being parsed includes any of the following:

@example
-ffoo
-f foo
--file=foo
--file foo
@end example

then @code{optparse}, on seeing this option, will do the equivalent of

@example
options.filename = "foo"
@end example

The @ref{3462,,type} and @ref{3463,,dest} option attributes are almost
as important as @ref{3461,,action}, but @code{action} is the only
one that makes sense for `all' options.

@node Option attributes,Standard option actions,Defining options,Reference Guide
@anchor{library/optparse option-attributes}@anchor{348c}@anchor{library/optparse optparse-option-attributes}@anchor{348d}
@subsubsection Option attributes


@geindex Option (class in optparse)
@anchor{library/optparse optparse Option}@anchor{3489}
@deffn {Class} optparse.Option

A single command line argument,
with various attributes passed by keyword to the constructor.
Normally created with @ref{344d,,OptionParser.add_option()} rather than directly,
and can be overridden by a custom class via the `option_class' argument
to @ref{16d9,,OptionParser}.
@end deffn

The following option attributes may be passed as keyword arguments to
@ref{344d,,OptionParser.add_option()}.  If you pass an option attribute that is not
relevant to a particular option, or fail to pass a required option attribute,
@code{optparse} raises @ref{3450,,OptionError}.

@geindex action (optparse.Option attribute)
@anchor{library/optparse optparse Option action}@anchor{3461}
@deffn {Attribute} Option.action

(default: @code{"store"})

Determines @code{optparse}’s behaviour when this option is seen on the
command line; the available options are documented @ref{348a,,here}.
@end deffn

@geindex type (optparse.Option attribute)
@anchor{library/optparse optparse Option type}@anchor{3462}
@deffn {Attribute} Option.type

(default: @code{"string"})

The argument type expected by this option (e.g., @code{"string"} or @code{"int"});
the available option types are documented @ref{348e,,here}.
@end deffn

@geindex dest (optparse.Option attribute)
@anchor{library/optparse optparse Option dest}@anchor{3463}
@deffn {Attribute} Option.dest

(default: derived from option strings)

If the option’s action implies writing or modifying a value somewhere, this
tells @code{optparse} where to write it: @code{dest} names an
attribute of the @code{options} object that @code{optparse} builds as it parses
the command line.
@end deffn

@geindex default (optparse.Option attribute)
@anchor{library/optparse optparse Option default}@anchor{348f}
@deffn {Attribute} Option.default

The value to use for this option’s destination if the option is not seen on
the command line.  See also @ref{3490,,OptionParser.set_defaults()}.
@end deffn

@geindex nargs (optparse.Option attribute)
@anchor{library/optparse optparse Option nargs}@anchor{3491}
@deffn {Attribute} Option.nargs

(default: 1)

How many arguments of type @ref{3462,,type} should be consumed when this
option is seen.  If > 1, @code{optparse} will store a tuple of values to
@ref{3463,,dest}.
@end deffn

@geindex const (optparse.Option attribute)
@anchor{library/optparse optparse Option const}@anchor{346e}
@deffn {Attribute} Option.const

For actions that store a constant value, the constant value to store.
@end deffn

@geindex choices (optparse.Option attribute)
@anchor{library/optparse optparse Option choices}@anchor{3492}
@deffn {Attribute} Option.choices

For options of type @code{"choice"}, the list of strings the user may choose
from.
@end deffn

@geindex callback (optparse.Option attribute)
@anchor{library/optparse optparse Option callback}@anchor{3493}
@deffn {Attribute} Option.callback

For options with action @code{"callback"}, the callable to call when this option
is seen.  See section @ref{3470,,Option Callbacks} for detail on the
arguments passed to the callable.
@end deffn

@geindex callback_args (optparse.Option attribute)
@geindex callback_kwargs (optparse.Option attribute)
@anchor{library/optparse optparse Option callback_args}@anchor{3494}
@deffn {Attribute} Option.callback_args
@anchor{library/optparse optparse Option callback_kwargs}@anchor{3495}
@deffnx {Attribute} Option.callback_kwargs

Additional positional and keyword arguments to pass to @code{callback} after the
four standard callback arguments.
@end deffn

@geindex help (optparse.Option attribute)
@anchor{library/optparse optparse Option help}@anchor{3464}
@deffn {Attribute} Option.help

Help text to print for this option when listing all available options after
the user supplies a @code{help} option (such as @code{--help}).  If
no help text is supplied, the option will be listed without help text.  To
hide this option, use the special value @code{optparse.SUPPRESS_HELP}.
@end deffn

@geindex metavar (optparse.Option attribute)
@anchor{library/optparse optparse Option metavar}@anchor{3496}
@deffn {Attribute} Option.metavar

(default: derived from option strings)

Stand-in for the option argument(s) to use when printing help text.  See
section @ref{345f,,Tutorial} for an example.
@end deffn

@node Standard option actions,Standard option types,Option attributes,Reference Guide
@anchor{library/optparse optparse-standard-option-actions}@anchor{348a}@anchor{library/optparse standard-option-actions}@anchor{3497}
@subsubsection Standard option actions


The various option actions all have slightly different requirements and effects.
Most actions have several relevant option attributes which you may specify to
guide @code{optparse}’s behaviour; a few have required attributes, which you
must specify for any option using that action.


@itemize *

@item 
@code{"store"} [relevant: @ref{3462,,type}, @ref{3463,,dest},
@ref{3491,,nargs}, @ref{3492,,choices}]

The option must be followed by an argument, which is converted to a value
according to @ref{3462,,type} and stored in @ref{3463,,dest}.  If
@ref{3491,,nargs} > 1, multiple arguments will be consumed from the
command line; all will be converted according to @code{type} and
stored to @code{dest} as a tuple.  See the
@ref{348e,,Standard option types} section.

If @ref{3492,,choices} is supplied (a list or tuple of strings), the type
defaults to @code{"choice"}.

If @ref{3462,,type} is not supplied, it defaults to @code{"string"}.

If @ref{3463,,dest} is not supplied, @code{optparse} derives a destination
from the first long option string (e.g., @code{--foo-bar} implies
@code{foo_bar}). If there are no long option strings, @code{optparse} derives a
destination from the first short option string (e.g., @code{-f} implies @code{f}).

Example:

@example
parser.add_option("-f")
parser.add_option("-p", type="float", nargs=3, dest="point")
@end example

As it parses the command line

@example
-f foo.txt -p 1 -3.5 4 -fbar.txt
@end example

@code{optparse} will set

@example
options.f = "foo.txt"
options.point = (1.0, -3.5, 4.0)
options.f = "bar.txt"
@end example

@item 
@code{"store_const"} [required: @ref{346e,,const}; relevant:
@ref{3463,,dest}]

The value @ref{346e,,const} is stored in @ref{3463,,dest}.

Example:

@example
parser.add_option("-q", "--quiet",
                  action="store_const", const=0, dest="verbose")
parser.add_option("-v", "--verbose",
                  action="store_const", const=1, dest="verbose")
parser.add_option("--noisy",
                  action="store_const", const=2, dest="verbose")
@end example

If @code{--noisy} is seen, @code{optparse} will set

@example
options.verbose = 2
@end example

@item 
@code{"store_true"} [relevant: @ref{3463,,dest}]

A special case of @code{"store_const"} that stores @code{True} to
@ref{3463,,dest}.

@item 
@code{"store_false"} [relevant: @ref{3463,,dest}]

Like @code{"store_true"}, but stores @code{False}.

Example:

@example
parser.add_option("--clobber", action="store_true", dest="clobber")
parser.add_option("--no-clobber", action="store_false", dest="clobber")
@end example

@item 
@code{"append"} [relevant: @ref{3462,,type}, @ref{3463,,dest},
@ref{3491,,nargs}, @ref{3492,,choices}]

The option must be followed by an argument, which is appended to the list in
@ref{3463,,dest}.  If no default value for @code{dest} is
supplied, an empty list is automatically created when @code{optparse} first
encounters this option on the command-line.  If @ref{3491,,nargs} > 1,
multiple arguments are consumed, and a tuple of length @code{nargs}
is appended to @code{dest}.

The defaults for @ref{3462,,type} and @ref{3463,,dest} are the same as
for the @code{"store"} action.

Example:

@example
parser.add_option("-t", "--tracks", action="append", type="int")
@end example

If @code{-t3} is seen on the command-line, @code{optparse} does the equivalent
of:

@example
options.tracks = []
options.tracks.append(int("3"))
@end example

If, a little later on, @code{--tracks=4} is seen, it does:

@example
options.tracks.append(int("4"))
@end example

The @code{append} action calls the @code{append} method on the current value of the
option.  This means that any default value specified must have an @code{append}
method.  It also means that if the default value is non-empty, the default
elements will be present in the parsed value for the option, with any values
from the command line appended after those default values:

@example
>>> parser.add_option("--files", action="append", default=['~/.mypkg/defaults'])
>>> opts, args = parser.parse_args(['--files', 'overrides.mypkg'])
>>> opts.files
['~/.mypkg/defaults', 'overrides.mypkg']
@end example

@item 
@code{"append_const"} [required: @ref{346e,,const}; relevant:
@ref{3463,,dest}]

Like @code{"store_const"}, but the value @ref{346e,,const} is appended to
@ref{3463,,dest}; as with @code{"append"}, @code{dest} defaults to
@code{None}, and an empty list is automatically created the first time the option
is encountered.

@item 
@code{"count"} [relevant: @ref{3463,,dest}]

Increment the integer stored at @ref{3463,,dest}.  If no default value is
supplied, @code{dest} is set to zero before being incremented the
first time.

Example:

@example
parser.add_option("-v", action="count", dest="verbosity")
@end example

The first time @code{-v} is seen on the command line, @code{optparse} does the
equivalent of:

@example
options.verbosity = 0
options.verbosity += 1
@end example

Every subsequent occurrence of @code{-v} results in

@example
options.verbosity += 1
@end example

@item 
@code{"callback"} [required: @ref{3493,,callback}; relevant:
@ref{3462,,type}, @ref{3491,,nargs}, @ref{3494,,callback_args},
@ref{3495,,callback_kwargs}]

Call the function specified by @ref{3493,,callback}, which is called as

@example
func(option, opt_str, value, parser, *args, **kwargs)
@end example

See section @ref{3470,,Option Callbacks} for more detail.

@item 
@code{"help"}

Prints a complete help message for all the options in the current option
parser.  The help message is constructed from the @code{usage} string passed to
OptionParser’s constructor and the @ref{3464,,help} string passed to every
option.

If no @ref{3464,,help} string is supplied for an option, it will still be
listed in the help message.  To omit an option entirely, use the special value
@code{optparse.SUPPRESS_HELP}.

@code{optparse} automatically adds a @ref{3464,,help} option to all
OptionParsers, so you do not normally need to create one.

Example:

@example
from optparse import OptionParser, SUPPRESS_HELP

# usually, a help option is added automatically, but that can
# be suppressed using the add_help_option argument
parser = OptionParser(add_help_option=False)

parser.add_option("-h", "--help", action="help")
parser.add_option("-v", action="store_true", dest="verbose",
                  help="Be moderately verbose")
parser.add_option("--file", dest="filename",
                  help="Input file to read data from")
parser.add_option("--secret", help=SUPPRESS_HELP)
@end example

If @code{optparse} sees either @code{-h} or @code{--help} on the command line,
it will print something like the following help message to stdout (assuming
@code{sys.argv[0]} is @code{"foo.py"}):

@example
Usage: foo.py [options]

Options:
  -h, --help        Show this help message and exit
  -v                Be moderately verbose
  --file=FILENAME   Input file to read data from
@end example

After printing the help message, @code{optparse} terminates your process with
@code{sys.exit(0)}.

@item 
@code{"version"}

Prints the version number supplied to the OptionParser to stdout and exits.
The version number is actually formatted and printed by the
@code{print_version()} method of OptionParser.  Generally only relevant if the
@code{version} argument is supplied to the OptionParser constructor.  As with
@ref{3464,,help} options, you will rarely create @code{version} options,
since @code{optparse} automatically adds them when needed.
@end itemize

@node Standard option types,Parsing arguments,Standard option actions,Reference Guide
@anchor{library/optparse optparse-standard-option-types}@anchor{348e}@anchor{library/optparse standard-option-types}@anchor{3498}
@subsubsection Standard option types


@code{optparse} has five built-in option types: @code{"string"}, @code{"int"},
@code{"choice"}, @code{"float"} and @code{"complex"}.  If you need to add new
option types, see section @ref{3467,,Extending optparse}.

Arguments to string options are not checked or converted in any way: the text on
the command line is stored in the destination (or passed to the callback) as-is.

Integer arguments (type @code{"int"}) are parsed as follows:


@itemize *

@item 
if the number starts with @code{0x}, it is parsed as a hexadecimal number

@item 
if the number starts with @code{0}, it is parsed as an octal number

@item 
if the number starts with @code{0b}, it is parsed as a binary number

@item 
otherwise, the number is parsed as a decimal number
@end itemize

The conversion is done by calling @ref{19c,,int()} with the appropriate base (2, 8,
10, or 16).  If this fails, so will @code{optparse}, although with a more useful
error message.

@code{"float"} and @code{"complex"} option arguments are converted directly with
@ref{197,,float()} and @ref{198,,complex()}, with similar error-handling.

@code{"choice"} options are a subtype of @code{"string"} options.  The
@ref{3492,,choices} option attribute (a sequence of strings) defines the
set of allowed option arguments.  @code{optparse.check_choice()} compares
user-supplied option arguments against this master list and raises
@ref{3451,,OptionValueError} if an invalid string is given.

@node Parsing arguments,Querying and manipulating your option parser,Standard option types,Reference Guide
@anchor{library/optparse optparse-parsing-arguments}@anchor{348b}@anchor{library/optparse parsing-arguments}@anchor{3499}
@subsubsection Parsing arguments


The whole point of creating and populating an OptionParser is to call its
@ref{16da,,parse_args()} method.

@geindex parse_args() (optparse.OptionParser method)
@anchor{library/optparse optparse OptionParser parse_args}@anchor{16da}
@deffn {Method} OptionParser.parse_args (args=None, values=None)

Parse the command-line options found in `args'.

The input parameters are


@table @asis

@item @code{args}

the list of arguments to process (default: @code{sys.argv[1:]})

@item @code{values}

a @ref{344f,,Values} object to store option arguments in (default: a
new instance of @code{Values}) – if you give an existing object, the
option defaults will not be initialized on it
@end table

and the return value is a pair @code{(options, args)} where


@table @asis

@item @code{options}

the same object that was passed in as `values', or the @code{optparse.Values}
instance created by @code{optparse}

@item @code{args}

the leftover positional arguments after all options have been processed
@end table
@end deffn

The most common usage is to supply neither keyword argument.  If you supply
@code{values}, it will be modified with repeated @ref{2605,,setattr()} calls (roughly one
for every option argument stored to an option destination) and returned by
@ref{16da,,parse_args()}.

If @ref{16da,,parse_args()} encounters any errors in the argument list, it calls the
OptionParser’s @code{error()} method with an appropriate end-user error message.
This ultimately terminates your process with an exit status of 2 (the
traditional Unix exit status for command-line errors).

@node Querying and manipulating your option parser,Conflicts between options,Parsing arguments,Reference Guide
@anchor{library/optparse optparse-querying-manipulating-option-parser}@anchor{349a}@anchor{library/optparse querying-and-manipulating-your-option-parser}@anchor{349b}
@subsubsection Querying and manipulating your option parser


The default behavior of the option parser can be customized slightly, and you
can also poke around your option parser and see what’s there.  OptionParser
provides several methods to help you out:

@geindex disable_interspersed_args() (optparse.OptionParser method)
@anchor{library/optparse optparse OptionParser disable_interspersed_args}@anchor{344e}
@deffn {Method} OptionParser.disable_interspersed_args ()

Set parsing to stop on the first non-option.  For example, if @code{-a} and
@code{-b} are both simple options that take no arguments, @code{optparse}
normally accepts this syntax:

@example
prog -a arg1 -b arg2
@end example

and treats it as equivalent to

@example
prog -a -b arg1 arg2
@end example

To disable this feature, call @code{disable_interspersed_args()}.  This
restores traditional Unix syntax, where option parsing stops with the first
non-option argument.

Use this if you have a command processor which runs another command which has
options of its own and you want to make sure these options don’t get
confused.  For example, each command might have a different set of options.
@end deffn

@geindex enable_interspersed_args() (optparse.OptionParser method)
@anchor{library/optparse optparse OptionParser enable_interspersed_args}@anchor{349c}
@deffn {Method} OptionParser.enable_interspersed_args ()

Set parsing to not stop on the first non-option, allowing interspersing
switches with command arguments.  This is the default behavior.
@end deffn

@geindex get_option() (optparse.OptionParser method)
@anchor{library/optparse optparse OptionParser get_option}@anchor{349d}
@deffn {Method} OptionParser.get_option (opt_str)

Returns the Option instance with the option string `opt_str', or @code{None} if
no options have that option string.
@end deffn

@geindex has_option() (optparse.OptionParser method)
@anchor{library/optparse optparse OptionParser has_option}@anchor{349e}
@deffn {Method} OptionParser.has_option (opt_str)

Return @code{True} if the OptionParser has an option with option string `opt_str'
(e.g., @code{-q} or @code{--verbose}).
@end deffn

@geindex remove_option() (optparse.OptionParser method)
@anchor{library/optparse optparse OptionParser remove_option}@anchor{349f}
@deffn {Method} OptionParser.remove_option (opt_str)

If the @ref{16d9,,OptionParser} has an option corresponding to `opt_str', that
option is removed.  If that option provided any other option strings, all of
those option strings become invalid. If `opt_str' does not occur in any
option belonging to this @code{OptionParser}, raises @ref{2ee,,ValueError}.
@end deffn

@node Conflicts between options,Cleanup,Querying and manipulating your option parser,Reference Guide
@anchor{library/optparse conflicts-between-options}@anchor{34a0}@anchor{library/optparse optparse-conflicts-between-options}@anchor{3484}
@subsubsection Conflicts between options


If you’re not careful, it’s easy to define options with conflicting option
strings:

@example
parser.add_option("-n", "--dry-run", ...)
...
parser.add_option("-n", "--noisy", ...)
@end example

(This is particularly true if you’ve defined your own OptionParser subclass with
some standard options.)

Every time you add an option, @code{optparse} checks for conflicts with existing
options.  If it finds any, it invokes the current conflict-handling mechanism.
You can set the conflict-handling mechanism either in the constructor:

@example
parser = OptionParser(..., conflict_handler=handler)
@end example

or with a separate call:

@example
parser.set_conflict_handler(handler)
@end example

The available conflict handlers are:

@quotation


@table @asis

@item @code{"error"} (default)

assume option conflicts are a programming error and raise
@ref{34a1,,OptionConflictError}

@item @code{"resolve"}

resolve option conflicts intelligently (see below)
@end table
@end quotation

As an example, let’s define an @ref{16d9,,OptionParser} that resolves conflicts
intelligently and add conflicting options to it:

@example
parser = OptionParser(conflict_handler="resolve")
parser.add_option("-n", "--dry-run", ..., help="do no harm")
parser.add_option("-n", "--noisy", ..., help="be noisy")
@end example

At this point, @code{optparse} detects that a previously added option is already
using the @code{-n} option string.  Since @code{conflict_handler} is @code{"resolve"},
it resolves the situation by removing @code{-n} from the earlier option’s list of
option strings.  Now @code{--dry-run} is the only way for the user to activate
that option.  If the user asks for help, the help message will reflect that:

@example
Options:
  --dry-run     do no harm
  ...
  -n, --noisy   be noisy
@end example

It’s possible to whittle away the option strings for a previously added option
until there are none left, and the user has no way of invoking that option from
the command-line.  In that case, @code{optparse} removes that option completely,
so it doesn’t show up in help text or anywhere else. Carrying on with our
existing OptionParser:

@example
parser.add_option("--dry-run", ..., help="new dry-run option")
@end example

At this point, the original @code{-n}/@code{--dry-run} option is no longer
accessible, so @code{optparse} removes it, leaving this help text:

@example
Options:
  ...
  -n, --noisy   be noisy
  --dry-run     new dry-run option
@end example

@node Cleanup,Other methods,Conflicts between options,Reference Guide
@anchor{library/optparse cleanup}@anchor{34a2}@anchor{library/optparse optparse-cleanup}@anchor{34a3}
@subsubsection Cleanup


OptionParser instances have several cyclic references.  This should not be a
problem for Python’s garbage collector, but you may wish to break the cyclic
references explicitly by calling @code{destroy()} on your
OptionParser once you are done with it.  This is particularly useful in
long-running applications where large object graphs are reachable from your
OptionParser.

@node Other methods,,Cleanup,Reference Guide
@anchor{library/optparse optparse-other-methods}@anchor{34a4}@anchor{library/optparse other-methods}@anchor{34a5}
@subsubsection Other methods


OptionParser supports several other public methods:

@geindex set_usage() (optparse.OptionParser method)
@anchor{library/optparse optparse OptionParser set_usage}@anchor{34a6}
@deffn {Method} OptionParser.set_usage (usage)

Set the usage string according to the rules described above for the @code{usage}
constructor keyword argument.  Passing @code{None} sets the default usage
string; use @code{optparse.SUPPRESS_USAGE} to suppress a usage message.
@end deffn

@geindex print_usage() (optparse.OptionParser method)
@anchor{library/optparse optparse OptionParser print_usage}@anchor{347b}
@deffn {Method} OptionParser.print_usage (file=None)

Print the usage message for the current program (@code{self.usage}) to `file'
(default stdout).  Any occurrence of the string @code{%prog} in @code{self.usage}
is replaced with the name of the current program.  Does nothing if
@code{self.usage} is empty or not defined.
@end deffn

@geindex get_usage() (optparse.OptionParser method)
@anchor{library/optparse optparse OptionParser get_usage}@anchor{34a7}
@deffn {Method} OptionParser.get_usage ()

Same as @ref{347b,,print_usage()} but returns the usage string instead of
printing it.
@end deffn

@geindex set_defaults() (optparse.OptionParser method)
@anchor{library/optparse optparse OptionParser set_defaults}@anchor{3490}
@deffn {Method} OptionParser.set_defaults (dest=value, ...)

Set default values for several option destinations at once.  Using
@code{set_defaults()} is the preferred way to set default values for options,
since multiple options can share the same destination.  For example, if
several “mode” options all set the same destination, any one of them can set
the default, and the last one wins:

@example
parser.add_option("--advanced", action="store_const",
                  dest="mode", const="advanced",
                  default="novice")    # overridden below
parser.add_option("--novice", action="store_const",
                  dest="mode", const="novice",
                  default="advanced")  # overrides above setting
@end example

To avoid this confusion, use @code{set_defaults()}:

@example
parser.set_defaults(mode="advanced")
parser.add_option("--advanced", action="store_const",
                  dest="mode", const="advanced")
parser.add_option("--novice", action="store_const",
                  dest="mode", const="novice")
@end example
@end deffn

@node Option Callbacks,Extending optparse,Reference Guide,optparse — Parser for command line options
@anchor{library/optparse option-callbacks}@anchor{34a8}@anchor{library/optparse optparse-option-callbacks}@anchor{3470}
@subsubsection Option Callbacks


When @code{optparse}’s built-in actions and types aren’t quite enough for your
needs, you have two choices: extend @code{optparse} or define a callback option.
Extending @code{optparse} is more general, but overkill for a lot of simple
cases.  Quite often a simple callback is all you need.

There are two steps to defining a callback option:


@itemize *

@item 
define the option itself using the @code{"callback"} action

@item 
write the callback; this is a function (or method) that takes at least four
arguments, as described below
@end itemize

@menu
* Defining a callback option:: 
* How callbacks are called:: 
* Raising errors in a callback:: 
* Callback example 1; trivial callback: Callback example 1 trivial callback. 
* Callback example 2; check option order: Callback example 2 check option order. 
* Callback example 3; check option order (generalized): Callback example 3 check option order generalized. 
* Callback example 4; check arbitrary condition: Callback example 4 check arbitrary condition. 
* Callback example 5; fixed arguments: Callback example 5 fixed arguments. 
* Callback example 6; variable arguments: Callback example 6 variable arguments. 

@end menu

@node Defining a callback option,How callbacks are called,,Option Callbacks
@anchor{library/optparse defining-a-callback-option}@anchor{34a9}@anchor{library/optparse optparse-defining-callback-option}@anchor{34aa}
@subsubsection Defining a callback option


As always, the easiest way to define a callback option is by using the
@ref{344d,,OptionParser.add_option()} method.  Apart from @ref{3461,,action}, the
only option attribute you must specify is @code{callback}, the function to call:

@example
parser.add_option("-c", action="callback", callback=my_callback)
@end example

@code{callback} is a function (or other callable object), so you must have already
defined @code{my_callback()} when you create this callback option. In this simple
case, @code{optparse} doesn’t even know if @code{-c} takes any arguments,
which usually means that the option takes no arguments—the mere presence of
@code{-c} on the command-line is all it needs to know.  In some
circumstances, though, you might want your callback to consume an arbitrary
number of command-line arguments.  This is where writing callbacks gets tricky;
it’s covered later in this section.

@code{optparse} always passes four particular arguments to your callback, and it
will only pass additional arguments if you specify them via
@ref{3494,,callback_args} and @ref{3495,,callback_kwargs}.  Thus, the
minimal callback function signature is:

@example
def my_callback(option, opt, value, parser):
@end example

The four arguments to a callback are described below.

There are several other option attributes that you can supply when you define a
callback option:


@table @asis

@item @ref{3462,,type}

has its usual meaning: as with the @code{"store"} or @code{"append"} actions, it
instructs @code{optparse} to consume one argument and convert it to
@ref{3462,,type}.  Rather than storing the converted value(s) anywhere,
though, @code{optparse} passes it to your callback function.

@item @ref{3491,,nargs}

also has its usual meaning: if it is supplied and > 1, @code{optparse} will
consume @ref{3491,,nargs} arguments, each of which must be convertible to
@ref{3462,,type}.  It then passes a tuple of converted values to your
callback.

@item @ref{3494,,callback_args}

a tuple of extra positional arguments to pass to the callback

@item @ref{3495,,callback_kwargs}

a dictionary of extra keyword arguments to pass to the callback
@end table

@node How callbacks are called,Raising errors in a callback,Defining a callback option,Option Callbacks
@anchor{library/optparse how-callbacks-are-called}@anchor{34ab}@anchor{library/optparse optparse-how-callbacks-called}@anchor{34ac}
@subsubsection How callbacks are called


All callbacks are called as follows:

@example
func(option, opt_str, value, parser, *args, **kwargs)
@end example

where


@table @asis

@item @code{option}

is the Option instance that’s calling the callback

@item @code{opt_str}

is the option string seen on the command-line that’s triggering the callback.
(If an abbreviated long option was used, @code{opt_str} will be the full,
canonical option string—e.g. if the user puts @code{--foo} on the
command-line as an abbreviation for @code{--foobar}, then @code{opt_str} will be
@code{"--foobar"}.)

@item @code{value}

is the argument to this option seen on the command-line.  @code{optparse} will
only expect an argument if @ref{3462,,type} is set; the type of @code{value} will be
the type implied by the option’s type.  If @code{type} for this option is
@code{None} (no argument expected), then @code{value} will be @code{None}.  If @ref{3491,,nargs}
> 1, @code{value} will be a tuple of values of the appropriate type.

@item @code{parser}

is the OptionParser instance driving the whole thing, mainly useful because
you can access some other interesting data through its instance attributes:


@table @asis

@item @code{parser.largs}

the current list of leftover arguments, ie. arguments that have been
consumed but are neither options nor option arguments. Feel free to modify
@code{parser.largs}, e.g. by adding more arguments to it.  (This list will
become @code{args}, the second return value of @ref{16da,,parse_args()}.)

@item @code{parser.rargs}

the current list of remaining arguments, ie. with @code{opt_str} and
@code{value} (if applicable) removed, and only the arguments following them
still there.  Feel free to modify @code{parser.rargs}, e.g. by consuming more
arguments.

@item @code{parser.values}

the object where option values are by default stored (an instance of
optparse.OptionValues).  This lets callbacks use the same mechanism as the
rest of @code{optparse} for storing option values; you don’t need to mess
around with globals or closures.  You can also access or modify the
value(s) of any options already encountered on the command-line.
@end table

@item @code{args}

is a tuple of arbitrary positional arguments supplied via the
@ref{3494,,callback_args} option attribute.

@item @code{kwargs}

is a dictionary of arbitrary keyword arguments supplied via
@ref{3495,,callback_kwargs}.
@end table

@node Raising errors in a callback,Callback example 1 trivial callback,How callbacks are called,Option Callbacks
@anchor{library/optparse optparse-raising-errors-in-callback}@anchor{34ad}@anchor{library/optparse raising-errors-in-a-callback}@anchor{34ae}
@subsubsection Raising errors in a callback


The callback function should raise @ref{3451,,OptionValueError} if there are any
problems with the option or its argument(s).  @code{optparse} catches this and
terminates the program, printing the error message you supply to stderr.  Your
message should be clear, concise, accurate, and mention the option at fault.
Otherwise, the user will have a hard time figuring out what they did wrong.

@node Callback example 1 trivial callback,Callback example 2 check option order,Raising errors in a callback,Option Callbacks
@anchor{library/optparse callback-example-1-trivial-callback}@anchor{34af}@anchor{library/optparse optparse-callback-example-1}@anchor{34b0}
@subsubsection Callback example 1: trivial callback


Here’s an example of a callback option that takes no arguments, and simply
records that the option was seen:

@example
def record_foo_seen(option, opt_str, value, parser):
    parser.values.saw_foo = True

parser.add_option("--foo", action="callback", callback=record_foo_seen)
@end example

Of course, you could do that with the @code{"store_true"} action.

@node Callback example 2 check option order,Callback example 3 check option order generalized,Callback example 1 trivial callback,Option Callbacks
@anchor{library/optparse callback-example-2-check-option-order}@anchor{34b1}@anchor{library/optparse optparse-callback-example-2}@anchor{34b2}
@subsubsection Callback example 2: check option order


Here’s a slightly more interesting example: record the fact that @code{-a} is
seen, but blow up if it comes after @code{-b} in the command-line.

@example
def check_order(option, opt_str, value, parser):
    if parser.values.b:
        raise OptionValueError("can't use -a after -b")
    parser.values.a = 1
...
parser.add_option("-a", action="callback", callback=check_order)
parser.add_option("-b", action="store_true", dest="b")
@end example

@node Callback example 3 check option order generalized,Callback example 4 check arbitrary condition,Callback example 2 check option order,Option Callbacks
@anchor{library/optparse callback-example-3-check-option-order-generalized}@anchor{34b3}@anchor{library/optparse optparse-callback-example-3}@anchor{34b4}
@subsubsection Callback example 3: check option order (generalized)


If you want to reuse this callback for several similar options (set a flag, but
blow up if @code{-b} has already been seen), it needs a bit of work: the error
message and the flag that it sets must be generalized.

@example
def check_order(option, opt_str, value, parser):
    if parser.values.b:
        raise OptionValueError("can't use %s after -b" % opt_str)
    setattr(parser.values, option.dest, 1)
...
parser.add_option("-a", action="callback", callback=check_order, dest='a')
parser.add_option("-b", action="store_true", dest="b")
parser.add_option("-c", action="callback", callback=check_order, dest='c')
@end example

@node Callback example 4 check arbitrary condition,Callback example 5 fixed arguments,Callback example 3 check option order generalized,Option Callbacks
@anchor{library/optparse callback-example-4-check-arbitrary-condition}@anchor{34b5}@anchor{library/optparse optparse-callback-example-4}@anchor{34b6}
@subsubsection Callback example 4: check arbitrary condition


Of course, you could put any condition in there—you’re not limited to checking
the values of already-defined options.  For example, if you have options that
should not be called when the moon is full, all you have to do is this:

@example
def check_moon(option, opt_str, value, parser):
    if is_moon_full():
        raise OptionValueError("%s option invalid when moon is full"
                               % opt_str)
    setattr(parser.values, option.dest, 1)
...
parser.add_option("--foo",
                  action="callback", callback=check_moon, dest="foo")
@end example

(The definition of @code{is_moon_full()} is left as an exercise for the reader.)

@node Callback example 5 fixed arguments,Callback example 6 variable arguments,Callback example 4 check arbitrary condition,Option Callbacks
@anchor{library/optparse callback-example-5-fixed-arguments}@anchor{34b7}@anchor{library/optparse optparse-callback-example-5}@anchor{34b8}
@subsubsection Callback example 5: fixed arguments


Things get slightly more interesting when you define callback options that take
a fixed number of arguments.  Specifying that a callback option takes arguments
is similar to defining a @code{"store"} or @code{"append"} option: if you define
@ref{3462,,type}, then the option takes one argument that must be
convertible to that type; if you further define @ref{3491,,nargs}, then the
option takes @code{nargs} arguments.

Here’s an example that just emulates the standard @code{"store"} action:

@example
def store_value(option, opt_str, value, parser):
    setattr(parser.values, option.dest, value)
...
parser.add_option("--foo",
                  action="callback", callback=store_value,
                  type="int", nargs=3, dest="foo")
@end example

Note that @code{optparse} takes care of consuming 3 arguments and converting
them to integers for you; all you have to do is store them.  (Or whatever;
obviously you don’t need a callback for this example.)

@node Callback example 6 variable arguments,,Callback example 5 fixed arguments,Option Callbacks
@anchor{library/optparse callback-example-6-variable-arguments}@anchor{34b9}@anchor{library/optparse optparse-callback-example-6}@anchor{34ba}
@subsubsection Callback example 6: variable arguments


Things get hairy when you want an option to take a variable number of arguments.
For this case, you must write a callback, as @code{optparse} doesn’t provide any
built-in capabilities for it.  And you have to deal with certain intricacies of
conventional Unix command-line parsing that @code{optparse} normally handles for
you.  In particular, callbacks should implement the conventional rules for bare
@code{--} and @code{-} arguments:


@itemize *

@item 
either @code{--} or @code{-} can be option arguments

@item 
bare @code{--} (if not the argument to some option): halt command-line
processing and discard the @code{--}

@item 
bare @code{-} (if not the argument to some option): halt command-line
processing but keep the @code{-} (append it to @code{parser.largs})
@end itemize

If you want an option that takes a variable number of arguments, there are
several subtle, tricky issues to worry about.  The exact implementation you
choose will be based on which trade-offs you’re willing to make for your
application (which is why @code{optparse} doesn’t support this sort of thing
directly).

Nevertheless, here’s a stab at a callback for an option with variable
arguments:

@example
def vararg_callback(option, opt_str, value, parser):
    assert value is None
    value = []

    def floatable(str):
        try:
            float(str)
            return True
        except ValueError:
            return False

    for arg in parser.rargs:
        # stop on --foo like options
        if arg[:2] == "--" and len(arg) > 2:
            break
        # stop on -a, but not on -3 or -3.0
        if arg[:1] == "-" and len(arg) > 1 and not floatable(arg):
            break
        value.append(arg)

    del parser.rargs[:len(value)]
    setattr(parser.values, option.dest, value)

...
parser.add_option("-c", "--callback", dest="vararg_attr",
                  action="callback", callback=vararg_callback)
@end example

@node Extending optparse,Exceptions<12>,Option Callbacks,optparse — Parser for command line options
@anchor{library/optparse extending-optparse}@anchor{34bb}@anchor{library/optparse optparse-extending-optparse}@anchor{3467}
@subsubsection Extending @code{optparse}


Since the two major controlling factors in how @code{optparse} interprets
command-line options are the action and type of each option, the most likely
direction of extension is to add new actions and new types.

@menu
* Adding new types:: 
* Adding new actions:: 

@end menu

@node Adding new types,Adding new actions,,Extending optparse
@anchor{library/optparse adding-new-types}@anchor{34bc}@anchor{library/optparse optparse-adding-new-types}@anchor{34bd}
@subsubsection Adding new types


To add new types, you need to define your own subclass of @code{optparse}’s
@ref{3489,,Option} class.  This class has a couple of attributes that define
@code{optparse}’s types: @ref{34be,,TYPES} and @ref{34bf,,TYPE_CHECKER}.

@geindex TYPES (optparse.Option attribute)
@anchor{library/optparse optparse Option TYPES}@anchor{34be}
@deffn {Attribute} Option.TYPES

A tuple of type names; in your subclass, simply define a new tuple
@ref{34be,,TYPES} that builds on the standard one.
@end deffn

@geindex TYPE_CHECKER (optparse.Option attribute)
@anchor{library/optparse optparse Option TYPE_CHECKER}@anchor{34bf}
@deffn {Attribute} Option.TYPE_CHECKER

A dictionary mapping type names to type-checking functions.  A type-checking
function has the following signature:

@example
def check_mytype(option, opt, value)
@end example

where @code{option} is an @ref{3489,,Option} instance, @code{opt} is an option string
(e.g., @code{-f}), and @code{value} is the string from the command line that must
be checked and converted to your desired type.  @code{check_mytype()} should
return an object of the hypothetical type @code{mytype}.  The value returned by
a type-checking function will wind up in the OptionValues instance returned
by @ref{16da,,OptionParser.parse_args()}, or be passed to a callback as the
@code{value} parameter.

Your type-checking function should raise @ref{3451,,OptionValueError} if it
encounters any problems.  @code{OptionValueError} takes a single string
argument, which is passed as-is to @ref{16d9,,OptionParser}’s @code{error()}
method, which in turn prepends the program name and the string @code{"error:"}
and prints everything to stderr before terminating the process.
@end deffn

Here’s a silly example that demonstrates adding a @code{"complex"} option type to
parse Python-style complex numbers on the command line.  (This is even sillier
than it used to be, because @code{optparse} 1.3 added built-in support for
complex numbers, but never mind.)

First, the necessary imports:

@example
from copy import copy
from optparse import Option, OptionValueError
@end example

You need to define your type-checker first, since it’s referred to later (in the
@ref{34bf,,TYPE_CHECKER} class attribute of your Option subclass):

@example
def check_complex(option, opt, value):
    try:
        return complex(value)
    except ValueError:
        raise OptionValueError(
            "option %s: invalid complex value: %r" % (opt, value))
@end example

Finally, the Option subclass:

@example
class MyOption (Option):
    TYPES = Option.TYPES + ("complex",)
    TYPE_CHECKER = copy(Option.TYPE_CHECKER)
    TYPE_CHECKER["complex"] = check_complex
@end example

(If we didn’t make a @ref{29,,copy()} of @ref{34bf,,Option.TYPE_CHECKER}, we would end
up modifying the @code{TYPE_CHECKER} attribute of @code{optparse}’s
Option class.  This being Python, nothing stops you from doing that except good
manners and common sense.)

That’s it!  Now you can write a script that uses the new option type just like
any other @code{optparse}-based script, except you have to instruct your
OptionParser to use MyOption instead of Option:

@example
parser = OptionParser(option_class=MyOption)
parser.add_option("-c", type="complex")
@end example

Alternately, you can build your own option list and pass it to OptionParser; if
you don’t use @code{add_option()} in the above way, you don’t need to tell
OptionParser which option class to use:

@example
option_list = [MyOption("-c", action="store", type="complex", dest="c")]
parser = OptionParser(option_list=option_list)
@end example

@node Adding new actions,,Adding new types,Extending optparse
@anchor{library/optparse adding-new-actions}@anchor{34c0}@anchor{library/optparse optparse-adding-new-actions}@anchor{34c1}
@subsubsection Adding new actions


Adding new actions is a bit trickier, because you have to understand that
@code{optparse} has a couple of classifications for actions:


@table @asis

@item “store” actions

actions that result in @code{optparse} storing a value to an attribute of the
current OptionValues instance; these options require a @ref{3463,,dest}
attribute to be supplied to the Option constructor.

@item “typed” actions

actions that take a value from the command line and expect it to be of a
certain type; or rather, a string that can be converted to a certain type.
These options require a @ref{3462,,type} attribute to the Option
constructor.
@end table

These are overlapping sets: some default “store” actions are @code{"store"},
@code{"store_const"}, @code{"append"}, and @code{"count"}, while the default “typed”
actions are @code{"store"}, @code{"append"}, and @code{"callback"}.

When you add an action, you need to categorize it by listing it in at least one
of the following class attributes of Option (all are lists of strings):

@geindex ACTIONS (optparse.Option attribute)
@anchor{library/optparse optparse Option ACTIONS}@anchor{34c2}
@deffn {Attribute} Option.ACTIONS

All actions must be listed in ACTIONS.
@end deffn

@geindex STORE_ACTIONS (optparse.Option attribute)
@anchor{library/optparse optparse Option STORE_ACTIONS}@anchor{34c3}
@deffn {Attribute} Option.STORE_ACTIONS

“store” actions are additionally listed here.
@end deffn

@geindex TYPED_ACTIONS (optparse.Option attribute)
@anchor{library/optparse optparse Option TYPED_ACTIONS}@anchor{34c4}
@deffn {Attribute} Option.TYPED_ACTIONS

“typed” actions are additionally listed here.
@end deffn

@geindex ALWAYS_TYPED_ACTIONS (optparse.Option attribute)
@anchor{library/optparse optparse Option ALWAYS_TYPED_ACTIONS}@anchor{34c5}
@deffn {Attribute} Option.ALWAYS_TYPED_ACTIONS

Actions that always take a type (i.e. whose options always take a value) are
additionally listed here.  The only effect of this is that @code{optparse}
assigns the default type, @code{"string"}, to options with no explicit type
whose action is listed in @ref{34c5,,ALWAYS_TYPED_ACTIONS}.
@end deffn

In order to actually implement your new action, you must override Option’s
@code{take_action()} method and add a case that recognizes your action.

For example, let’s add an @code{"extend"} action.  This is similar to the standard
@code{"append"} action, but instead of taking a single value from the command-line
and appending it to an existing list, @code{"extend"} will take multiple values in
a single comma-delimited string, and extend an existing list with them.  That
is, if @code{--names} is an @code{"extend"} option of type @code{"string"}, the command
line

@example
--names=foo,bar --names blah --names ding,dong
@end example

would result in a list

@example
["foo", "bar", "blah", "ding", "dong"]
@end example

Again we define a subclass of Option:

@example
class MyOption(Option):

    ACTIONS = Option.ACTIONS + ("extend",)
    STORE_ACTIONS = Option.STORE_ACTIONS + ("extend",)
    TYPED_ACTIONS = Option.TYPED_ACTIONS + ("extend",)
    ALWAYS_TYPED_ACTIONS = Option.ALWAYS_TYPED_ACTIONS + ("extend",)

    def take_action(self, action, dest, opt, value, values, parser):
        if action == "extend":
            lvalue = value.split(",")
            values.ensure_value(dest, []).extend(lvalue)
        else:
            Option.take_action(
                self, action, dest, opt, value, values, parser)
@end example

Features of note:


@itemize *

@item 
@code{"extend"} both expects a value on the command-line and stores that value
somewhere, so it goes in both @ref{34c3,,STORE_ACTIONS} and
@ref{34c4,,TYPED_ACTIONS}.

@item 
to ensure that @code{optparse} assigns the default type of @code{"string"} to
@code{"extend"} actions, we put the @code{"extend"} action in
@ref{34c5,,ALWAYS_TYPED_ACTIONS} as well.

@item 
@code{MyOption.take_action()} implements just this one new action, and passes
control back to @code{Option.take_action()} for the standard @code{optparse}
actions.

@item 
@code{values} is an instance of the optparse_parser.Values class, which provides
the very useful @code{ensure_value()} method. @code{ensure_value()} is
essentially @ref{dd0,,getattr()} with a safety valve; it is called as

@example
values.ensure_value(attr, value)
@end example

If the @code{attr} attribute of @code{values} doesn’t exist or is @code{None}, then
ensure_value() first sets it to @code{value}, and then returns @code{value}. This is
very handy for actions like @code{"extend"}, @code{"append"}, and @code{"count"}, all
of which accumulate data in a variable and expect that variable to be of a
certain type (a list for the first two, an integer for the latter).  Using
@code{ensure_value()} means that scripts using your action don’t have to worry
about setting a default value for the option destinations in question; they
can just leave the default as @code{None} and @code{ensure_value()} will take care of
getting it right when it’s needed.
@end itemize

@node Exceptions<12>,,Extending optparse,optparse — Parser for command line options
@anchor{library/optparse exceptions}@anchor{34c6}
@subsubsection Exceptions


@geindex OptionError
@anchor{library/optparse optparse OptionError}@anchor{3450}
@deffn {Exception} optparse.OptionError

Raised if an @ref{3489,,Option} instance is created with invalid or
inconsistent arguments.
@end deffn

@geindex OptionConflictError
@anchor{library/optparse optparse OptionConflictError}@anchor{34a1}
@deffn {Exception} optparse.OptionConflictError

Raised if conflicting options are added to an @ref{16d9,,OptionParser}.
@end deffn

@geindex OptionValueError
@anchor{library/optparse optparse OptionValueError}@anchor{3451}
@deffn {Exception} optparse.OptionValueError

Raised if an invalid option value is encountered on the command line.
@end deffn

@geindex BadOptionError
@anchor{library/optparse optparse BadOptionError}@anchor{34c7}
@deffn {Exception} optparse.BadOptionError

Raised if an invalid option is passed on the command line.
@end deffn

@geindex AmbiguousOptionError
@anchor{library/optparse optparse AmbiguousOptionError}@anchor{34c8}
@deffn {Exception} optparse.AmbiguousOptionError

Raised if an ambiguous option is passed on the command line.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node getpass — Portable password input,fileinput — Iterate over lines from multiple input streams,optparse — Parser for command line options,Command-line interface libraries
@anchor{library/getpass doc}@anchor{34c9}@anchor{library/getpass getpass-portable-password-input}@anchor{34ca}@anchor{library/getpass module-getpass}@anchor{66}@anchor{library/getpass translation-repo}@anchor{34cb}
@subsection @code{getpass} — Portable password input


@geindex module; getpass

@c Windows (& Mac?) support by Guido van Rossum.

`Source code:' Lib/getpass.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/getpass.py}


__________________________________________________________________


@c include for modules that don't work on WASM

@ref{2181,,Availability}: not WASI.

This module does not work or is not available on WebAssembly. See
@ref{1bae,,WebAssembly platforms} for more information.

The @code{getpass} module provides two functions:

@geindex getpass() (in module getpass)
@anchor{library/getpass getpass getpass}@anchor{21f}
@deffn {Function} getpass.getpass (prompt='Password: ', stream=None, *, echo_char=None)

Prompt the user for a password without echoing.  The user is prompted using
the string `prompt', which defaults to @code{'Password: '}.  On Unix, the
prompt is written to the file-like object `stream' using the replace error
handler if needed.  `stream' defaults to the controlling terminal
(@code{/dev/tty}) or if that is unavailable to @code{sys.stderr} (this
argument is ignored on Windows).

The `echo_char' argument controls how user input is displayed while typing.
If `echo_char' is @code{None} (default), input remains hidden. Otherwise,
`echo_char' must be a single printable ASCII character and each
typed character is replaced by it. For example, @code{echo_char='*'} will
display asterisks instead of the actual input.

If echo free input is unavailable getpass() falls back to printing
a warning message to `stream' and reading from @code{sys.stdin} and
issuing a @ref{34cc,,GetPassWarning}.

@cartouche
@quotation Note 
If you call getpass from within IDLE, the input may be done in the
terminal you launched IDLE from rather than the idle window itself.
@end quotation
@end cartouche

@cartouche
@quotation Note 
On Unix systems, when `echo_char' is set, the terminal will be
configured to operate in
@code{noncanonical mode@footnote{https://manpages.debian.org/termios(3)#Canonical_and_noncanonical_mode}}.
In particular, this means that line editing shortcuts such as
@code{Ctrl}+@code{U} will not work and may insert unexpected characters into
the input.
@end quotation
@end cartouche


Changed in version 3.14: Added the `echo_char' parameter for keyboard feedback.

@end deffn

@geindex GetPassWarning
@anchor{library/getpass getpass GetPassWarning}@anchor{34cc}
@deffn {Exception} getpass.GetPassWarning

A @ref{275c,,UserWarning} subclass issued when password input may be echoed.
@end deffn

@geindex getuser() (in module getpass)
@anchor{library/getpass getpass getuser}@anchor{65a}
@deffn {Function} getpass.getuser ()

Return the “login name” of the user.

This function checks the environment variables 
@geindex LOGNAME
@geindex environment variable; LOGNAME
@code{LOGNAME},
@geindex USER
@geindex environment variable; USER
@code{USER}, @code{LNAME} and 
@geindex USERNAME
@geindex environment variable; USERNAME
@code{USERNAME}, in order, and
returns the value of the first one which is set to a non-empty string.  If
none are set, the login name from the password database is returned on
systems which support the @ref{b7,,pwd} module, otherwise, an @ref{2c2,,OSError}
is raised.

In general, this function should be preferred over @ref{186c,,os.getlogin()}.


Changed in version 3.13: Previously, various exceptions beyond just @ref{2c2,,OSError} were raised.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node fileinput — Iterate over lines from multiple input streams,curses — Terminal handling for character-cell displays,getpass — Portable password input,Command-line interface libraries
@anchor{library/fileinput doc}@anchor{34cd}@anchor{library/fileinput fileinput-iterate-over-lines-from-multiple-input-streams}@anchor{34ce}@anchor{library/fileinput module-fileinput}@anchor{5f}@anchor{library/fileinput translation-repo}@anchor{34cf}
@subsection @code{fileinput} — Iterate over lines from multiple input streams


@geindex module; fileinput

`Source code:' Lib/fileinput.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/fileinput.py}


__________________________________________________________________


This module implements a helper class and functions to quickly write a
loop over standard input or a list of files. If you just want to read or
write one file see @ref{318,,open()}.

The typical use is:

@example
import fileinput
for line in fileinput.input(encoding="utf-8"):
    process(line)
@end example

This iterates over the lines of all files listed in @code{sys.argv[1:]}, defaulting
to @code{sys.stdin} if the list is empty.  If a filename is @code{'-'}, it is also
replaced by @code{sys.stdin} and the optional arguments `mode' and `openhook'
are ignored.  To specify an alternative list of filenames, pass it as the
first argument to @ref{a06,,input()}.  A single file name is also allowed.

All files are opened in text mode by default, but you can override this by
specifying the `mode' parameter in the call to @ref{a06,,input()} or
@ref{945,,FileInput}.  If an I/O error occurs during opening or reading a file,
@ref{2c2,,OSError} is raised.


Changed in version 3.3: @ref{1259,,IOError} used to be raised; it is now an alias of @ref{2c2,,OSError}.


If @code{sys.stdin} is used more than once, the second and further use will return
no lines, except perhaps for interactive use, or if it has been explicitly reset
(e.g. using @code{sys.stdin.seek(0)}).

Empty files are opened and immediately closed; the only time their presence in
the list of filenames is noticeable at all is when the last file opened is
empty.

Lines are returned with any newlines intact, which means that the last line in
a file may not have one.

You can control how files are opened by providing an opening hook via the
`openhook' parameter to @ref{a06,,fileinput.input()} or @ref{945,,FileInput()}. The
hook must be a function that takes two arguments, `filename' and `mode', and
returns an accordingly opened file-like object. If `encoding' and/or `errors'
are specified, they will be passed to the hook as additional keyword arguments.
This module provides a @ref{a07,,hook_compressed()} to support compressed files.

The following function is the primary interface of this module:

@geindex input() (in module fileinput)
@anchor{library/fileinput fileinput input}@anchor{a06}
@deffn {Function} fileinput.input (files=None, inplace=False, backup='@w{'}, *, mode='r', openhook=None, encoding=None, errors=None)

Create an instance of the @ref{945,,FileInput} class.  The instance will be used
as global state for the functions of this module, and is also returned to use
during iteration.  The parameters to this function will be passed along to the
constructor of the @code{FileInput} class.

The @ref{945,,FileInput} instance can be used as a context manager in the
@ref{187,,with} statement.  In this example, `input' is closed after the
@code{with} statement is exited, even if an exception occurs:

@example
with fileinput.input(files=('spam.txt', 'eggs.txt'), encoding="utf-8") as f:
    for line in f:
        process(line)
@end example


Changed in version 3.2: Can be used as a context manager.



Changed in version 3.8: The keyword parameters `mode' and `openhook' are now keyword-only.



Changed in version 3.10: The keyword-only parameter `encoding' and `errors' are added.

@end deffn

The following functions use the global state created by @ref{a06,,fileinput.input()};
if there is no active state, @ref{246,,RuntimeError} is raised.

@geindex filename() (in module fileinput)
@anchor{library/fileinput fileinput filename}@anchor{34d0}
@deffn {Function} fileinput.filename ()

Return the name of the file currently being read.  Before the first line has
been read, returns @code{None}.
@end deffn

@geindex fileno() (in module fileinput)
@anchor{library/fileinput fileinput fileno}@anchor{163a}
@deffn {Function} fileinput.fileno ()

Return the integer “file descriptor” for the current file. When no file is
opened (before the first line and between files), returns @code{-1}.
@end deffn

@geindex lineno() (in module fileinput)
@anchor{library/fileinput fileinput lineno}@anchor{34d1}
@deffn {Function} fileinput.lineno ()

Return the cumulative line number of the line that has just been read.  Before
the first line has been read, returns @code{0}.  After the last line of the last
file has been read, returns the line number of that line.
@end deffn

@geindex filelineno() (in module fileinput)
@anchor{library/fileinput fileinput filelineno}@anchor{34d2}
@deffn {Function} fileinput.filelineno ()

Return the line number in the current file.  Before the first line has been
read, returns @code{0}.  After the last line of the last file has been read,
returns the line number of that line within the file.
@end deffn

@geindex isfirstline() (in module fileinput)
@anchor{library/fileinput fileinput isfirstline}@anchor{34d3}
@deffn {Function} fileinput.isfirstline ()

Return @code{True} if the line just read is the first line of its file, otherwise
return @code{False}.
@end deffn

@geindex isstdin() (in module fileinput)
@anchor{library/fileinput fileinput isstdin}@anchor{34d4}
@deffn {Function} fileinput.isstdin ()

Return @code{True} if the last line was read from @code{sys.stdin}, otherwise return
@code{False}.
@end deffn

@geindex nextfile() (in module fileinput)
@anchor{library/fileinput fileinput nextfile}@anchor{34d5}
@deffn {Function} fileinput.nextfile ()

Close the current file so that the next iteration will read the first line from
the next file (if any); lines not read from the file will not count towards the
cumulative line count.  The filename is not changed until after the first line
of the next file has been read.  Before the first line has been read, this
function has no effect; it cannot be used to skip the first file.  After the
last line of the last file has been read, this function has no effect.
@end deffn

@geindex close() (in module fileinput)
@anchor{library/fileinput fileinput close}@anchor{34d6}
@deffn {Function} fileinput.close ()

Close the sequence.
@end deffn

The class which implements the sequence behavior provided by the module is
available for subclassing as well:

@geindex FileInput (class in fileinput)
@anchor{library/fileinput fileinput FileInput}@anchor{945}
@deffn {Class} fileinput.FileInput (files=None, inplace=False, backup='@w{'}, *, mode='r', openhook=None, encoding=None, errors=None)

Class @code{FileInput} is the implementation; its methods @ref{34d0,,filename()},
@ref{163a,,fileno()}, @ref{34d1,,lineno()}, @ref{34d2,,filelineno()}, @ref{34d3,,isfirstline()},
@ref{34d4,,isstdin()}, @ref{34d5,,nextfile()} and @ref{34d6,,close()} correspond to the
functions of the same name in the module. In addition it is @ref{1433,,iterable}
and has a @ref{20ea,,readline()} method which returns the next
input line. The sequence must be accessed in strictly sequential order;
random access and @code{readline()} cannot be mixed.

With `mode' you can specify which file mode will be passed to @ref{318,,open()}. It
must be one of @code{'r'} and @code{'rb'}.

The `openhook', when given, must be a function that takes two arguments,
`filename' and `mode', and returns an accordingly opened file-like object. You
cannot use `inplace' and `openhook' together.

You can specify `encoding' and `errors' that is passed to @ref{318,,open()} or `openhook'.

A @code{FileInput} instance can be used as a context manager in the
@ref{187,,with} statement.  In this example, `input' is closed after the
@code{with} statement is exited, even if an exception occurs:

@example
with FileInput(files=('spam.txt', 'eggs.txt')) as input:
    process(input)
@end example


Changed in version 3.2: Can be used as a context manager.



Changed in version 3.8: The keyword parameter `mode' and `openhook' are now keyword-only.



Changed in version 3.10: The keyword-only parameter `encoding' and `errors' are added.



Changed in version 3.11: The @code{'rU'} and @code{'U'} modes and the @code{__getitem__()} method have
been removed.

@end deffn

`Optional in-place filtering:' if the keyword argument @code{inplace=True} is
passed to @ref{a06,,fileinput.input()} or to the @ref{945,,FileInput} constructor, the
file is moved to a backup file and standard output is directed to the input file
(if a file of the same name as the backup file already exists, it will be
replaced silently).  This makes it possible to write a filter that rewrites its
input file in place.  If the `backup' parameter is given (typically as
@code{backup='.<some extension>'}), it specifies the extension for the backup file,
and the backup file remains around; by default, the extension is @code{'.bak'} and
it is deleted when the output file is closed.  In-place filtering is disabled
when standard input is read.

The two following opening hooks are provided by this module:

@geindex hook_compressed() (in module fileinput)
@anchor{library/fileinput fileinput hook_compressed}@anchor{a07}
@deffn {Function} fileinput.hook_compressed (filename, mode, *, encoding=None, errors=None)

Transparently opens files compressed with gzip and bzip2 (recognized by the
extensions @code{'.gz'} and @code{'.bz2'}) using the @ref{6b,,gzip} and @ref{14,,bz2}
modules.  If the filename extension is not @code{'.gz'} or @code{'.bz2'}, the file is
opened normally (ie, using @ref{318,,open()} without any decompression).

The `encoding' and `errors' values are passed to @ref{9c4,,io.TextIOWrapper}
for compressed files and open for normal files.

Usage example:  @code{fi = fileinput.FileInput(openhook=fileinput.hook_compressed, encoding="utf-8")}


Changed in version 3.10: The keyword-only parameter `encoding' and `errors' are added.

@end deffn

@geindex hook_encoded() (in module fileinput)
@anchor{library/fileinput fileinput hook_encoded}@anchor{ea4}
@deffn {Function} fileinput.hook_encoded (encoding, errors=None)

Returns a hook which opens each file with @ref{318,,open()}, using the given
`encoding' and `errors' to read the file.

Usage example: @code{fi =
fileinput.FileInput(openhook=fileinput.hook_encoded("utf-8",
"surrogateescape"))}


Changed in version 3.6: Added the optional `errors' parameter.



Deprecated since version 3.10: This function is deprecated since @ref{a06,,fileinput.input()} and @ref{945,,FileInput}
now have `encoding' and `errors' parameters.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node curses — Terminal handling for character-cell displays,curses textpad — Text input widget for curses programs,fileinput — Iterate over lines from multiple input streams,Command-line interface libraries
@anchor{library/curses doc}@anchor{34d7}@anchor{library/curses curses-terminal-handling-for-character-cell-displays}@anchor{34d8}@anchor{library/curses module-curses}@anchor{2f}@anchor{library/curses translation-repo}@anchor{34d9}
@subsection @code{curses} — Terminal handling for character-cell displays


@geindex module; curses

`Source code:' Lib/curses@footnote{https://github.com/python/cpython/tree/3.14/Lib/curses}


__________________________________________________________________


The @code{curses} module provides an interface to the curses library, the
de-facto standard for portable advanced terminal handling.

While curses is most widely used in the Unix environment, versions are available
for Windows, DOS, and possibly other systems as well.  This extension module is
designed to match the API of ncurses, an open-source curses library hosted on
Linux and the BSD variants of Unix.

@c include for modules that don't work on WASM or mobile platforms

@ref{2181,,Availability}: not Android, not iOS, not WASI.

This module is not supported on @ref{22a0,,mobile platforms}
or @ref{1bae,,WebAssembly platforms}.

This is an @ref{219c,,optional module}.
If it is missing from your copy of CPython,
look for documentation from your distributor (that is,
whoever provided Python to you).
If you are the distributor, see @ref{219a,,Requirements for optional modules}.

@c Similar notes appear in the docs of the modules:
@c - zipfile
@c - tarfile

@ref{2181,,Availability}: Unix.

@cartouche
@quotation Note 
Whenever the documentation mentions a `character' it can be specified
as an integer, a one-character Unicode string or a one-byte byte string.

Whenever the documentation mentions a `character string' it can be specified
as a Unicode string or a byte string.
@end quotation
@end cartouche


@subsubheading See also



@table @asis

@item Module @ref{30,,curses.ascii}

Utilities for working with ASCII characters, regardless of your locale settings.

@item Module @ref{31,,curses.panel}

A panel stack extension that adds depth to  curses windows.

@item Module @ref{32,,curses.textpad}

Editable text widget for curses supporting  @code{Emacs}-like bindings.

@item @ref{34da,,Curses Programming with Python}

Tutorial material on using curses with Python, by Andrew Kuchling and Eric
Raymond.
@end table


@menu
* Functions: Functions<6>. 
* Window objects:: 
* Constants: Constants<6>. 

@end menu

@node Functions<6>,Window objects,,curses — Terminal handling for character-cell displays
@anchor{library/curses curses-functions}@anchor{34db}@anchor{library/curses functions}@anchor{34dc}
@subsubsection Functions


The module @code{curses} defines the following exception:

@geindex error
@anchor{library/curses curses error}@anchor{34dd}
@deffn {Exception} curses.error

Exception raised when a curses library function returns an error.
@end deffn

@cartouche
@quotation Note 
Whenever `x' or `y' arguments to a function or a method are optional, they
default to the current cursor location. Whenever `attr' is optional, it defaults
to @ref{34de,,A_NORMAL}.
@end quotation
@end cartouche

The module @code{curses} defines the following functions:

@geindex assume_default_colors() (in module curses)
@anchor{library/curses curses assume_default_colors}@anchor{1f8}
@deffn {Function} curses.assume_default_colors (fg, bg, /)

Allow use of default values for colors on terminals supporting this feature.
Use this to support transparency in your application.


@itemize *

@item 
Assign terminal default foreground/background colors to color number @code{-1}.
So @code{init_pair(x, COLOR_RED, -1)} will initialize pair `x' as red
on default background and @code{init_pair(x, -1, COLOR_BLUE)} will
initialize pair `x' as default foreground on blue.

@item 
Change the definition of the color-pair @code{0} to @code{(fg, bg)}.
@end itemize

This is an ncurses extension.


Added in version 3.14.

@end deffn

@geindex baudrate() (in module curses)
@anchor{library/curses curses baudrate}@anchor{34df}
@deffn {Function} curses.baudrate ()

Return the output speed of the terminal in bits per second.  On software
terminal emulators it will have a fixed high value. Included for historical
reasons; in former times, it was used to  write output loops for time delays and
occasionally to change interfaces depending on the line speed.
@end deffn

@geindex beep() (in module curses)
@anchor{library/curses curses beep}@anchor{34e0}
@deffn {Function} curses.beep ()

Emit a short attention sound.
@end deffn

@geindex can_change_color() (in module curses)
@anchor{library/curses curses can_change_color}@anchor{34e1}
@deffn {Function} curses.can_change_color ()

Return @code{True} or @code{False}, depending on whether the programmer can change the colors
displayed by the terminal.
@end deffn

@geindex cbreak() (in module curses)
@anchor{library/curses curses cbreak}@anchor{34e2}
@deffn {Function} curses.cbreak ()

Enter cbreak mode.  In cbreak mode (sometimes called “rare” mode) normal tty
line buffering is turned off and characters are available to be read one by one.
However, unlike raw mode, special characters (interrupt, quit, suspend, and flow
control) retain their effects on the tty driver and calling program.  Calling
first @ref{34e3,,raw()} then @code{cbreak()} leaves the terminal in cbreak mode.
@end deffn

@geindex color_content() (in module curses)
@anchor{library/curses curses color_content}@anchor{9f8}
@deffn {Function} curses.color_content (color_number)

Return the intensity of the red, green, and blue (RGB) components in the color
`color_number', which must be between @code{0} and @code{COLORS - 1}.  Return a 3-tuple,
containing the R,G,B values for the given color, which will be between
@code{0} (no component) and @code{1000} (maximum amount of component).  Raise an
exception if the color is not supported.
@end deffn

@geindex color_pair() (in module curses)
@anchor{library/curses curses color_pair}@anchor{34e4}
@deffn {Function} curses.color_pair (pair_number)

Return the attribute value for displaying text in the specified color pair.
Only the first 256 color pairs are supported. This
attribute value can be combined with @ref{34e5,,A_STANDOUT}, @ref{34e6,,A_REVERSE},
and the other @code{A_*} attributes.  @ref{34e7,,pair_number()} is the counterpart
to this function.
@end deffn

@geindex curs_set() (in module curses)
@anchor{library/curses curses curs_set}@anchor{34e8}
@deffn {Function} curses.curs_set (visibility)

Set the cursor state.  `visibility' can be set to @code{0}, @code{1}, or @code{2}, for invisible,
normal, or very visible.  If the terminal supports the visibility requested, return the
previous cursor state; otherwise raise an exception.  On many
terminals, the “visible” mode is an underline cursor and the “very visible” mode
is a block cursor.
@end deffn

@geindex def_prog_mode() (in module curses)
@anchor{library/curses curses def_prog_mode}@anchor{34e9}
@deffn {Function} curses.def_prog_mode ()

Save the current terminal mode as the “program” mode, the mode when the running
program is using curses.  (Its counterpart is the “shell” mode, for when the
program is not in curses.)  Subsequent calls to @ref{34ea,,reset_prog_mode()} will
restore this mode.
@end deffn

@geindex def_shell_mode() (in module curses)
@anchor{library/curses curses def_shell_mode}@anchor{34eb}
@deffn {Function} curses.def_shell_mode ()

Save the current terminal mode as the “shell” mode, the mode when the running
program is not using curses.  (Its counterpart is the “program” mode, when the
program is using curses capabilities.) Subsequent calls to
@ref{34ec,,reset_shell_mode()} will restore this mode.
@end deffn

@geindex delay_output() (in module curses)
@anchor{library/curses curses delay_output}@anchor{34ed}
@deffn {Function} curses.delay_output (ms)

Insert an `ms' millisecond pause in output.
@end deffn

@geindex doupdate() (in module curses)
@anchor{library/curses curses doupdate}@anchor{34ee}
@deffn {Function} curses.doupdate ()

Update the physical screen.  The curses library keeps two data structures, one
representing the current physical screen contents and a virtual screen
representing the desired next state.  The @code{doupdate()} function updates the
physical screen to match the virtual screen.

The virtual screen may be updated by a @ref{34ef,,noutrefresh()} call after write
operations such as @ref{34f0,,addstr()} have been performed on a window.  The normal
@ref{34f1,,refresh()} call is simply @code{noutrefresh()} followed by @code{doupdate()};
if you have to update multiple windows, you can speed performance and perhaps
reduce screen flicker by issuing @code{noutrefresh()} calls on all windows,
followed by a single @code{doupdate()}.
@end deffn

@geindex echo() (in module curses)
@anchor{library/curses curses echo}@anchor{34f2}
@deffn {Function} curses.echo ()

Enter echo mode.  In echo mode, each character input is echoed to the screen as
it is entered.
@end deffn

@geindex endwin() (in module curses)
@anchor{library/curses curses endwin}@anchor{34f3}
@deffn {Function} curses.endwin ()

De-initialize the library, and return terminal to normal status.
@end deffn

@geindex erasechar() (in module curses)
@anchor{library/curses curses erasechar}@anchor{34f4}
@deffn {Function} curses.erasechar ()

Return the user’s current erase character as a one-byte bytes object.  Under Unix operating systems this
is a property of the controlling tty of the curses program, and is not set by
the curses library itself.
@end deffn

@geindex filter() (in module curses)
@anchor{library/curses curses filter}@anchor{34f5}
@deffn {Function} curses.filter ()

The @code{filter()} routine, if used, must be called before @ref{1953,,initscr()} is
called.  The effect is that, during the initialization, 
@geindex LINES
@geindex environment variable; LINES
@code{LINES} is set to @code{1}; the
capabilities @code{clear}, @code{cup}, @code{cud}, @code{cud1}, @code{cuu1}, @code{cuu}, @code{vpa} are disabled; and the @code{home}
string is set to the value of @code{cr}. The effect is that the cursor is confined to
the current line, and so are screen updates.  This may be used for enabling
character-at-a-time  line editing without touching the rest of the screen.
@end deffn

@geindex flash() (in module curses)
@anchor{library/curses curses flash}@anchor{34f6}
@deffn {Function} curses.flash ()

Flash the screen.  That is, change it to reverse-video and then change it back
in a short interval.  Some people prefer such as ‘visible bell’ to the audible
attention signal produced by @ref{34e0,,beep()}.
@end deffn

@geindex flushinp() (in module curses)
@anchor{library/curses curses flushinp}@anchor{34f7}
@deffn {Function} curses.flushinp ()

Flush all input buffers.  This throws away any  typeahead  that  has been typed
by the user and has not yet been processed by the program.
@end deffn

@geindex getmouse() (in module curses)
@anchor{library/curses curses getmouse}@anchor{34f8}
@deffn {Function} curses.getmouse ()

After @ref{186f,,getch()} returns @ref{34f9,,KEY_MOUSE} to signal a mouse event, this
method should be called to retrieve the queued mouse event, represented as a
5-tuple @code{(id, x, y, z, bstate)}. `id' is an ID value used to distinguish
multiple devices, and `x', `y', `z' are the event’s coordinates.  (`z' is
currently unused.)  `bstate' is an integer value whose bits will be set to
indicate the type of event, and will be the bitwise OR of one or more of the
following constants, where `n' is the button number from 1 to 5:
@ref{34fa,,BUTTONn_PRESSED}, @ref{34fb,,BUTTONn_RELEASED}, @ref{34fc,,BUTTONn_CLICKED},
@ref{34fd,,BUTTONn_DOUBLE_CLICKED}, @ref{34fe,,BUTTONn_TRIPLE_CLICKED},
@ref{34ff,,BUTTON_SHIFT}, @ref{3500,,BUTTON_CTRL}, @ref{3501,,BUTTON_ALT}.


Changed in version 3.10: The @code{BUTTON5_*} constants are now exposed if they are provided by the
underlying curses library.

@end deffn

@geindex getsyx() (in module curses)
@anchor{library/curses curses getsyx}@anchor{3502}
@deffn {Function} curses.getsyx ()

Return the current coordinates of the virtual screen cursor as a tuple
@code{(y, x)}.  If @ref{3503,,leaveok} is currently @code{True}, then return @code{(-1, -1)}.
@end deffn

@geindex getwin() (in module curses)
@anchor{library/curses curses getwin}@anchor{3504}
@deffn {Function} curses.getwin (file)

Read window-related data stored in the file by an earlier @ref{3505,,window.putwin()} call.
The routine then creates and initializes a new window using that data, returning
the new window object.  The `file' argument must be a file object opened for
reading in binary mode.
@end deffn

@geindex has_colors() (in module curses)
@anchor{library/curses curses has_colors}@anchor{3506}
@deffn {Function} curses.has_colors ()

Return @code{True} if the terminal can display colors; otherwise, return @code{False}.
@end deffn

@geindex has_extended_color_support() (in module curses)
@anchor{library/curses curses has_extended_color_support}@anchor{9fc}
@deffn {Function} curses.has_extended_color_support ()

Return @code{True} if the module supports extended colors; otherwise, return
@code{False}. Extended color support allows more than 256 color pairs for
terminals that support more than 16 colors (for example, xterm-256color).

Extended color support requires ncurses version 6.1 or later.


Added in version 3.10.

@end deffn

@geindex has_ic() (in module curses)
@anchor{library/curses curses has_ic}@anchor{3507}
@deffn {Function} curses.has_ic ()

Return @code{True} if the terminal has insert- and delete-character capabilities.
This function is included for historical reasons only, as all modern software
terminal emulators have such capabilities.
@end deffn

@geindex has_il() (in module curses)
@anchor{library/curses curses has_il}@anchor{3508}
@deffn {Function} curses.has_il ()

Return @code{True} if the terminal has insert- and delete-line capabilities, or can
simulate  them  using scrolling regions. This function is included for
historical reasons only, as all modern software terminal emulators have such
capabilities.
@end deffn

@geindex has_key() (in module curses)
@anchor{library/curses curses has_key}@anchor{3509}
@deffn {Function} curses.has_key (ch)

Take a key value `ch', and return @code{True} if the current terminal type recognizes
a key with that value.
@end deffn

@geindex halfdelay() (in module curses)
@anchor{library/curses curses halfdelay}@anchor{350a}
@deffn {Function} curses.halfdelay (tenths)

Used for half-delay mode, which is similar to cbreak mode in that characters
typed by the user are immediately available to the program. However, after
blocking for `tenths' tenths of seconds, raise an exception if nothing has
been typed.  The value of `tenths' must be a number between @code{1} and @code{255}.  Use
@ref{350b,,nocbreak()} to leave half-delay mode.
@end deffn

@geindex init_color() (in module curses)
@anchor{library/curses curses init_color}@anchor{9f9}
@deffn {Function} curses.init_color (color_number, r, g, b)

Change the definition of a color, taking the number of the color to be changed
followed by three RGB values (for the amounts of red, green, and blue
components).  The value of `color_number' must be between @code{0} and
@code{COLORS - 1}.  Each of `r', `g', `b', must be a value between @code{0} and
@code{1000}.  When @code{init_color()} is used, all occurrences of that color on the
screen immediately change to the new definition.  This function is a no-op on
most terminals; it is active only if @ref{34e1,,can_change_color()} returns @code{True}.
@end deffn

@geindex init_pair() (in module curses)
@anchor{library/curses curses init_pair}@anchor{9fa}
@deffn {Function} curses.init_pair (pair_number, fg, bg)

Change the definition of a color-pair.  It takes three arguments: the number of
the color-pair to be changed, the foreground color number, and the background
color number.  The value of `pair_number' must be between @code{1} and
@code{COLOR_PAIRS - 1} (the @code{0} color pair can only be changed by
@ref{1f9,,use_default_colors()} and @ref{1f8,,assume_default_colors()}).
The value of `fg' and `bg' arguments must be between @code{0} and
@code{COLORS - 1}, or, after calling @code{use_default_colors()} or
@code{assume_default_colors()}, @code{-1}.
If the color-pair was previously initialized, the screen is
refreshed and all occurrences of that color-pair are changed to the new
definition.
@end deffn

@geindex initscr() (in module curses)
@anchor{library/curses curses initscr}@anchor{1953}
@deffn {Function} curses.initscr ()

Initialize the library. Return a @ref{19cd,,window} object
which represents the whole screen.

@cartouche
@quotation Note 
If there is an error opening the terminal, the underlying curses library may
cause the interpreter to exit.
@end quotation
@end cartouche
@end deffn

@geindex intrflush() (in module curses)
@anchor{library/curses curses intrflush}@anchor{350c}
@deffn {Function} curses.intrflush (flag)

If `flag' is @code{True}, pressing an interrupt key (interrupt, break, or quit)
will flush all output in the terminal driver queue.  If `flag' is @code{False},
no flushing is done.
@end deffn

@geindex is_term_resized() (in module curses)
@anchor{library/curses curses is_term_resized}@anchor{350d}
@deffn {Function} curses.is_term_resized (nlines, ncols)

Return @code{True} if @ref{1974,,resize_term()} would modify the window structure,
@code{False} otherwise.
@end deffn

@geindex isendwin() (in module curses)
@anchor{library/curses curses isendwin}@anchor{350e}
@deffn {Function} curses.isendwin ()

Return @code{True} if @ref{34f3,,endwin()} has been called (that is, the  curses library has
been deinitialized).
@end deffn

@geindex keyname() (in module curses)
@anchor{library/curses curses keyname}@anchor{350f}
@deffn {Function} curses.keyname (k)

Return the name of the key numbered `k' as a bytes object.  The name of a key generating printable
ASCII character is the key’s character.  The name of a control-key combination
is a two-byte bytes object consisting of a caret (@code{b'^'}) followed by the corresponding
printable ASCII character.  The name of an alt-key combination (128–255) is a
bytes object consisting of the prefix @code{b'M-'} followed by the name of the corresponding
ASCII character.

Raise a @ref{2ee,,ValueError} if `k' is negative.
@end deffn

@geindex killchar() (in module curses)
@anchor{library/curses curses killchar}@anchor{3510}
@deffn {Function} curses.killchar ()

Return the user’s current line kill character as a one-byte bytes object. Under Unix operating systems
this is a property of the controlling tty of the curses program, and is not set
by the curses library itself.
@end deffn

@geindex longname() (in module curses)
@anchor{library/curses curses longname}@anchor{3511}
@deffn {Function} curses.longname ()

Return a bytes object containing the terminfo long name field describing the current
terminal.  The maximum length of a verbose description is 128 characters.  It is
defined only after the call to @ref{1953,,initscr()}.
@end deffn

@geindex meta() (in module curses)
@anchor{library/curses curses meta}@anchor{3512}
@deffn {Function} curses.meta (flag)

If `flag' is @code{True}, allow 8-bit characters to be input.  If
`flag' is @code{False},  allow only 7-bit chars.
@end deffn

@geindex mouseinterval() (in module curses)
@anchor{library/curses curses mouseinterval}@anchor{3513}
@deffn {Function} curses.mouseinterval (interval)

Set the maximum time in milliseconds that can elapse between press and release
events in order for them to be recognized as a click, and return the previous
interval value.  The default value is 166 milliseconds, or one sixth of a second.
Use a negative `interval' to obtain the interval value without changing it.
@end deffn

@geindex mousemask() (in module curses)
@anchor{library/curses curses mousemask}@anchor{3514}
@deffn {Function} curses.mousemask (mousemask)

Set the mouse events to be reported, and return a tuple @code{(availmask,
oldmask)}.   `availmask' indicates which of the specified mouse events can be
reported; on complete failure it returns @code{0}.  `oldmask' is the previous value of
the mouse event mask.  If this function is never called, no mouse
events are ever reported.
@end deffn

@geindex napms() (in module curses)
@anchor{library/curses curses napms}@anchor{1952}
@deffn {Function} curses.napms (ms)

Sleep for `ms' milliseconds.
@end deffn

@geindex newpad() (in module curses)
@anchor{library/curses curses newpad}@anchor{3515}
@deffn {Function} curses.newpad (nlines, ncols)

Create and return a pointer to a new pad data structure with the given number
of lines and columns.  Return a pad as a window object.

A pad is like a window, except that it is not restricted by the screen size, and
is not necessarily associated with a particular part of the screen.  Pads can be
used when a large window is needed, and only a part of the window will be on the
screen at one time.  Automatic refreshes of pads (such as from scrolling or
echoing of input) do not occur.  The @ref{34f1,,refresh()} and @ref{34ef,,noutrefresh()}
methods of a pad require 6 arguments to specify the part of the pad to be
displayed and the location on the screen to be used for the display. The
arguments are `pminrow', `pmincol', `sminrow', `smincol', `smaxrow', `smaxcol'; the `p'
arguments refer to the upper-left corner of the pad region to be displayed and
the `s' arguments define a clipping box on the screen within which the pad region
is to be displayed.
@end deffn

@geindex newwin() (in module curses)
@anchor{library/curses curses newwin}@anchor{3516}
@deffn {Function} curses.newwin (nlines, ncols)

@deffnx {Function} curses.newwin (nlines, ncols, begin_y, begin_x)

Return a new @ref{19cd,,window}, whose left-upper corner
is at  @code{(begin_y, begin_x)}, and whose height/width is  `nlines'/`ncols'.

By default, the window will extend from the  specified position to the lower
right corner of the screen.
@end deffn

@geindex nl() (in module curses)
@anchor{library/curses curses nl}@anchor{3517}
@deffn {Function} curses.nl (flag=True)

Enter newline mode.  This mode translates the return key into newline on input,
and translates newline into return and line-feed on output. Newline mode is
initially on.

If `flag' is @code{False}, the effect is the same as calling @ref{3518,,nonl()}.
@end deffn

@geindex nocbreak() (in module curses)
@anchor{library/curses curses nocbreak}@anchor{350b}
@deffn {Function} curses.nocbreak ()

Leave cbreak mode.  Return to normal “cooked” mode with line buffering.
@end deffn

@geindex noecho() (in module curses)
@anchor{library/curses curses noecho}@anchor{3519}
@deffn {Function} curses.noecho ()

Leave echo mode.  Echoing of input characters is turned off.
@end deffn

@geindex nonl() (in module curses)
@anchor{library/curses curses nonl}@anchor{3518}
@deffn {Function} curses.nonl ()

Leave newline mode.  Disable translation of return into newline on input, and
disable low-level translation of newline into newline/return on output (but this
does not change the behavior of @code{addch('\n')}, which always does the
equivalent of return and line feed on the virtual screen).  With translation
off, curses can sometimes speed up vertical motion a little; also, it will be
able to detect the return key on input.
@end deffn

@geindex noqiflush() (in module curses)
@anchor{library/curses curses noqiflush}@anchor{351a}
@deffn {Function} curses.noqiflush ()

When the @code{noqiflush()} routine is used, normal flush of input and output queues
associated with the @code{INTR}, @code{QUIT} and @code{SUSP} characters will not be done.  You may
want to call @code{noqiflush()} in a signal handler if you want output to
continue as though the interrupt had not occurred, after the handler exits.
@end deffn

@geindex noraw() (in module curses)
@anchor{library/curses curses noraw}@anchor{351b}
@deffn {Function} curses.noraw ()

Leave raw mode. Return to normal “cooked” mode with line buffering.
@end deffn

@geindex pair_content() (in module curses)
@anchor{library/curses curses pair_content}@anchor{9fb}
@deffn {Function} curses.pair_content (pair_number)

Return a tuple @code{(fg, bg)} containing the colors for the requested color pair.
The value of `pair_number' must be between @code{0} and @code{COLOR_PAIRS - 1}.
@end deffn

@geindex pair_number() (in module curses)
@anchor{library/curses curses pair_number}@anchor{34e7}
@deffn {Function} curses.pair_number (attr)

Return the number of the color-pair set by the attribute value `attr'.
@ref{34e4,,color_pair()} is the counterpart to this function.
@end deffn

@geindex putp() (in module curses)
@anchor{library/curses curses putp}@anchor{351c}
@deffn {Function} curses.putp (str)

Equivalent to @code{tputs(str, 1, putchar)}; emit the value of a specified
terminfo capability for the current terminal.  Note that the output of @code{putp()}
always goes to standard output.

@ref{351d,,setupterm()} (or @ref{1953,,initscr()}) must be called first.
@end deffn

@geindex qiflush() (in module curses)
@anchor{library/curses curses qiflush}@anchor{351e}
@deffn {Function} curses.qiflush ([flag])

If `flag' is @code{False}, the effect is the same as calling @ref{351a,,noqiflush()}. If
`flag' is @code{True}, or no argument is provided, the queues will be flushed when
these control characters are read.
@end deffn

@geindex raw() (in module curses)
@anchor{library/curses curses raw}@anchor{34e3}
@deffn {Function} curses.raw ()

Enter raw mode.  In raw mode, normal line buffering and  processing of
interrupt, quit, suspend, and flow control keys are turned off; characters are
presented to curses input functions one by one.
@end deffn

@geindex reset_prog_mode() (in module curses)
@anchor{library/curses curses reset_prog_mode}@anchor{34ea}
@deffn {Function} curses.reset_prog_mode ()

Restore the  terminal  to “program” mode, as previously saved  by
@ref{34e9,,def_prog_mode()}.
@end deffn

@geindex reset_shell_mode() (in module curses)
@anchor{library/curses curses reset_shell_mode}@anchor{34ec}
@deffn {Function} curses.reset_shell_mode ()

Restore the  terminal  to “shell” mode, as previously saved  by
@ref{34eb,,def_shell_mode()}.
@end deffn

@geindex resetty() (in module curses)
@anchor{library/curses curses resetty}@anchor{351f}
@deffn {Function} curses.resetty ()

Restore the state of the terminal modes to what it was at the last call to
@ref{3520,,savetty()}.
@end deffn

@geindex resize_term() (in module curses)
@anchor{library/curses curses resize_term}@anchor{1974}
@deffn {Function} curses.resize_term (nlines, ncols)

Backend function used by @ref{1973,,resizeterm()}, performing most of the work;
when resizing the windows, @code{resize_term()} blank-fills the areas that are
extended.  The calling application should fill in these areas with
appropriate data.  The @code{resize_term()} function attempts to resize all
windows.  However, due to the calling convention of pads, it is not possible
to resize these without additional interaction with the application.
@end deffn

@geindex resizeterm() (in module curses)
@anchor{library/curses curses resizeterm}@anchor{1973}
@deffn {Function} curses.resizeterm (nlines, ncols)

Resize the standard and current windows to the specified dimensions, and
adjusts other bookkeeping data used by the curses library that record the
window dimensions (in particular the SIGWINCH handler).
@end deffn

@geindex savetty() (in module curses)
@anchor{library/curses curses savetty}@anchor{3520}
@deffn {Function} curses.savetty ()

Save the current state of the terminal modes in a buffer, usable by
@ref{351f,,resetty()}.
@end deffn

@geindex get_escdelay() (in module curses)
@anchor{library/curses curses get_escdelay}@anchor{af2}
@deffn {Function} curses.get_escdelay ()

Retrieves the value set by @ref{af3,,set_escdelay()}.


Added in version 3.9.

@end deffn

@geindex set_escdelay() (in module curses)
@anchor{library/curses curses set_escdelay}@anchor{af3}
@deffn {Function} curses.set_escdelay (ms)

Sets the number of milliseconds to wait after reading an escape character,
to distinguish between an individual escape character entered on the
keyboard from escape sequences sent by cursor and function keys.


Added in version 3.9.

@end deffn

@geindex get_tabsize() (in module curses)
@anchor{library/curses curses get_tabsize}@anchor{af4}
@deffn {Function} curses.get_tabsize ()

Retrieves the value set by @ref{af5,,set_tabsize()}.


Added in version 3.9.

@end deffn

@geindex set_tabsize() (in module curses)
@anchor{library/curses curses set_tabsize}@anchor{af5}
@deffn {Function} curses.set_tabsize (size)

Sets the number of columns used by the curses library when converting a tab
character to spaces as it adds the tab to a window.


Added in version 3.9.

@end deffn

@geindex setsyx() (in module curses)
@anchor{library/curses curses setsyx}@anchor{3521}
@deffn {Function} curses.setsyx (y, x)

Set the virtual screen cursor to `y', `x'. If `y' and `x' are both @code{-1}, then
@ref{3503,,leaveok} is set @code{True}.
@end deffn

@geindex setupterm() (in module curses)
@anchor{library/curses curses setupterm}@anchor{351d}
@deffn {Function} curses.setupterm (term=None, fd=-1)

Initialize the terminal.  `term' is a string giving
the terminal name, or @code{None}; if omitted or @code{None}, the value of the
@geindex TERM
@geindex environment variable; TERM
@code{TERM} environment variable will be used.  `fd' is the
file descriptor to which any initialization sequences will be sent; if not
supplied or @code{-1}, the file descriptor for @code{sys.stdout} will be used.

Raise a @ref{34dd,,curses.error} if the terminal could not be found or its
terminfo database entry could not be read.  If the terminal has already
been initialized, this function has no effect.
@end deffn

@geindex start_color() (in module curses)
@anchor{library/curses curses start_color}@anchor{3522}
@deffn {Function} curses.start_color ()

Must be called if the programmer wants to use colors, and before any other color
manipulation routine is called.  It is good practice to call this routine right
after @ref{1953,,initscr()}.

@code{start_color()} initializes eight basic colors (black, red,  green, yellow,
blue, magenta, cyan, and white), and two global variables in the @code{curses}
module, @ref{3523,,COLORS} and @ref{3524,,COLOR_PAIRS}, containing the maximum number
of colors and color-pairs the terminal can support.  It also restores the colors
on the terminal to the values they had when the terminal was just turned on.
@end deffn

@geindex termattrs() (in module curses)
@anchor{library/curses curses termattrs}@anchor{3525}
@deffn {Function} curses.termattrs ()

Return a logical OR of all video attributes supported by the terminal.  This
information is useful when a curses program needs complete control over the
appearance of the screen.
@end deffn

@geindex termname() (in module curses)
@anchor{library/curses curses termname}@anchor{3526}
@deffn {Function} curses.termname ()

Return the value of the environment variable 
@geindex TERM
@geindex environment variable; TERM
@code{TERM}, as a bytes object,
truncated to 14 characters.
@end deffn

@geindex tigetflag() (in module curses)
@anchor{library/curses curses tigetflag}@anchor{3527}
@deffn {Function} curses.tigetflag (capname)

Return the value of the Boolean capability corresponding to the terminfo
capability name `capname' as an integer.  Return the value @code{-1} if `capname' is not a
Boolean capability, or @code{0} if it is canceled or absent from the terminal
description.

@ref{351d,,setupterm()} (or @ref{1953,,initscr()}) must be called first.
@end deffn

@geindex tigetnum() (in module curses)
@anchor{library/curses curses tigetnum}@anchor{3528}
@deffn {Function} curses.tigetnum (capname)

Return the value of the numeric capability corresponding to the terminfo
capability name `capname' as an integer.  Return the value @code{-2} if `capname' is not a
numeric capability, or @code{-1} if it is canceled or absent from the terminal
description.

@ref{351d,,setupterm()} (or @ref{1953,,initscr()}) must be called first.
@end deffn

@geindex tigetstr() (in module curses)
@anchor{library/curses curses tigetstr}@anchor{3529}
@deffn {Function} curses.tigetstr (capname)

Return the value of the string capability corresponding to the terminfo
capability name `capname' as a bytes object.  Return @code{None} if `capname'
is not a terminfo “string capability”, or is canceled or absent from the
terminal description.

@ref{351d,,setupterm()} (or @ref{1953,,initscr()}) must be called first.
@end deffn

@geindex tparm() (in module curses)
@anchor{library/curses curses tparm}@anchor{352a}
@deffn {Function} curses.tparm (str[, ...])

Instantiate the bytes object `str' with the supplied parameters, where `str' should
be a parameterized string obtained from the terminfo database.  For example,
@code{tparm(tigetstr("cup"), 5, 3)} could result in @code{b'\033[6;4H'}, the exact
result depending on terminal type.  Up to nine integer parameters may be supplied.

@ref{351d,,setupterm()} (or @ref{1953,,initscr()}) must be called first.
@end deffn

@geindex typeahead() (in module curses)
@anchor{library/curses curses typeahead}@anchor{352b}
@deffn {Function} curses.typeahead (fd)

Specify that the file descriptor `fd' be used for typeahead checking.  If `fd'
is @code{-1}, then no typeahead checking is done.

The curses library does “line-breakout optimization” by looking for typeahead
periodically while updating the screen.  If input is found, and it is coming
from a tty, the current update is postponed until refresh or doupdate is called
again, allowing faster response to commands typed in advance. This function
allows specifying a different file descriptor for typeahead checking.
@end deffn

@geindex unctrl() (in module curses)
@anchor{library/curses curses unctrl}@anchor{175f}
@deffn {Function} curses.unctrl (ch)

Return a bytes object which is a printable representation of the character `ch'.
Control characters are represented as a caret followed by the character, for
example as @code{b'^C'}. Printing characters are left as they are.
@end deffn

@geindex ungetch() (in module curses)
@anchor{library/curses curses ungetch}@anchor{1760}
@deffn {Function} curses.ungetch (ch)

Push `ch' so the next @ref{186f,,getch()} will return it.

@cartouche
@quotation Note 
Only one `ch' can be pushed before @code{getch()} is called.
@end quotation
@end cartouche
@end deffn

@geindex update_lines_cols() (in module curses)
@anchor{library/curses curses update_lines_cols}@anchor{ff1}
@deffn {Function} curses.update_lines_cols ()

Update the @ref{ff2,,LINES} and @ref{ff3,,COLS} module variables.
Useful for detecting manual screen resize.


Added in version 3.5.

@end deffn

@geindex unget_wch() (in module curses)
@anchor{library/curses curses unget_wch}@anchor{12a4}
@deffn {Function} curses.unget_wch (ch)

Push `ch' so the next @ref{12a3,,get_wch()} will return it.

@cartouche
@quotation Note 
Only one `ch' can be pushed before @code{get_wch()} is called.
@end quotation
@end cartouche


Added in version 3.3.

@end deffn

@geindex ungetmouse() (in module curses)
@anchor{library/curses curses ungetmouse}@anchor{352c}
@deffn {Function} curses.ungetmouse (id, x, y, z, bstate)

Push a @ref{34f9,,KEY_MOUSE} event onto the input queue, associating the given
state data with it.
@end deffn

@geindex use_env() (in module curses)
@anchor{library/curses curses use_env}@anchor{352d}
@deffn {Function} curses.use_env (flag)

If used, this function should be called before @ref{1953,,initscr()} or newterm are
called.  When `flag' is @code{False}, the values of lines and columns specified in the
terminfo database will be used, even if environment variables 
@geindex LINES
@geindex environment variable; LINES
@code{LINES}
and 
@geindex COLUMNS
@geindex environment variable; COLUMNS
@code{COLUMNS} (used by default) are set, or if curses is running in a
window (in which case default behavior would be to use the window size if
@geindex LINES
@geindex environment variable; LINES
@code{LINES} and 
@geindex COLUMNS
@geindex environment variable; COLUMNS
@code{COLUMNS} are not set).
@end deffn

@geindex use_default_colors() (in module curses)
@anchor{library/curses curses use_default_colors}@anchor{1f9}
@deffn {Function} curses.use_default_colors ()

Equivalent to @code{assume_default_colors(-1, -1)}.
@end deffn

@geindex wrapper() (in module curses)
@anchor{library/curses curses wrapper}@anchor{c79}
@deffn {Function} curses.wrapper (func, /, *args, **kwargs)

Initialize curses and call another callable object, `func', which should be the
rest of your curses-using application.  If the application raises an exception,
this function will restore the terminal to a sane state before re-raising the
exception and generating a traceback.  The callable object `func' is then passed
the main window ‘stdscr’ as its first argument, followed by any other arguments
passed to @code{wrapper()}.  Before calling `func', @code{wrapper()} turns on
cbreak mode, turns off echo, enables the terminal keypad, and initializes colors
if the terminal has color support.  On exit (whether normally or by exception)
it restores cooked mode, turns on echo, and disables the terminal keypad.
@end deffn

@node Window objects,Constants<6>,Functions<6>,curses — Terminal handling for character-cell displays
@anchor{library/curses curses-window-objects}@anchor{19cd}@anchor{library/curses window-objects}@anchor{352e}
@subsubsection Window objects


@geindex window (class in curses)
@anchor{library/curses curses window}@anchor{12a1}
@deffn {Class} curses.window

Window objects, as returned by @ref{1953,,initscr()} and @ref{3516,,newwin()} above, have
the following methods and attributes:
@end deffn

@geindex addch() (curses.window method)
@anchor{library/curses curses window addch}@anchor{352f}
@deffn {Method} window.addch (ch[, attr])

@deffnx {Method} window.addch (y, x, ch[, attr])

Paint character `ch' at @code{(y, x)} with attributes `attr', overwriting any
character previously painted at that location.  By default, the character
position and attributes are the current settings for the window object.

@cartouche
@quotation Note 
Writing outside the window, subwindow, or pad raises a @ref{34dd,,curses.error}.
Attempting to write to the lower-right corner of a window, subwindow,
or pad will cause an exception to be raised after the character is printed.
@end quotation
@end cartouche
@end deffn

@geindex addnstr() (curses.window method)
@anchor{library/curses curses window addnstr}@anchor{3530}
@deffn {Method} window.addnstr (str, n[, attr])

@deffnx {Method} window.addnstr (y, x, str, n[, attr])

Paint at most `n' characters of the character string `str' at
@code{(y, x)} with attributes
`attr', overwriting anything previously on the display.
@end deffn

@geindex addstr() (curses.window method)
@anchor{library/curses curses window addstr}@anchor{34f0}
@deffn {Method} window.addstr (str[, attr])

@deffnx {Method} window.addstr (y, x, str[, attr])

Paint the character string `str' at @code{(y, x)} with attributes
`attr', overwriting anything previously on the display.

@cartouche
@quotation Note 

@itemize *

@item 
Writing outside the window, subwindow, or pad raises @ref{34dd,,curses.error}.
Attempting to write to the lower-right corner of a window, subwindow,
or pad will cause an exception to be raised after the string is printed.

@item 
A bug in ncurses, the backend for this Python module, could cause
segfaults when resizing windows.  This was fixed in ncurses-6.1-20190511.
If you are stuck with an earlier ncurses, you can avoid triggering it by
not calling @code{addstr()} with a `str' that has embedded newlines;
instead, call @code{addstr()} separately for each line.
@end itemize
@end quotation
@end cartouche
@end deffn

@geindex attroff() (curses.window method)
@anchor{library/curses curses window attroff}@anchor{3531}
@deffn {Method} window.attroff (attr)

Remove attribute `attr' from the “background” set applied to all writes to the
current window.
@end deffn

@geindex attron() (curses.window method)
@anchor{library/curses curses window attron}@anchor{3532}
@deffn {Method} window.attron (attr)

Add attribute `attr' to the “background” set applied to all writes to the
current window.
@end deffn

@geindex attrset() (curses.window method)
@anchor{library/curses curses window attrset}@anchor{3533}
@deffn {Method} window.attrset (attr)

Set the “background” set of attributes to `attr'.  This set is initially
@code{0} (no attributes).
@end deffn

@geindex bkgd() (curses.window method)
@anchor{library/curses curses window bkgd}@anchor{3534}
@deffn {Method} window.bkgd (ch[, attr])

Set the background property of the window to the character `ch', with
attributes `attr'.  The change is then applied to every character position in
that window:


@itemize *

@item 
The attribute of every character in the window  is changed to the new
background attribute.

@item 
Wherever  the  former background character appears, it is changed to the new
background character.
@end itemize
@end deffn

@geindex bkgdset() (curses.window method)
@anchor{library/curses curses window bkgdset}@anchor{3535}
@deffn {Method} window.bkgdset (ch[, attr])

Set the window’s background.  A window’s background consists of a character and
any combination of attributes.  The attribute part of the background is combined
(OR’ed) with all non-blank characters that are written into the window.  Both
the character and attribute parts of the background are combined with the blank
characters.  The background becomes a property of the character and moves with
the character through any scrolling and insert/delete line/character operations.
@end deffn

@geindex border() (curses.window method)
@anchor{library/curses curses window border}@anchor{3536}
@deffn {Method} window.border ([ls[, rs[, ts[, bs[, tl[, tr[, bl[, br]]]]]]]])

Draw a border around the edges of the window. Each parameter specifies  the
character to use for a specific part of the border; see the table below for more
details.

@cartouche
@quotation Note 
A @code{0} value for any parameter will cause the default character to be used for
that parameter.  Keyword parameters can `not' be used.  The defaults are listed
in this table:
@end quotation
@end cartouche


@multitable {xxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Parameter

@tab

Description

@tab

Default value

@item

`ls'

@tab

Left side

@tab

@ref{3537,,ACS_VLINE}

@item

`rs'

@tab

Right side

@tab

@ref{3537,,ACS_VLINE}

@item

`ts'

@tab

Top

@tab

@ref{3538,,ACS_HLINE}

@item

`bs'

@tab

Bottom

@tab

@ref{3538,,ACS_HLINE}

@item

`tl'

@tab

Upper-left corner

@tab

@ref{3539,,ACS_ULCORNER}

@item

`tr'

@tab

Upper-right corner

@tab

@ref{353a,,ACS_URCORNER}

@item

`bl'

@tab

Bottom-left corner

@tab

@ref{353b,,ACS_LLCORNER}

@item

`br'

@tab

Bottom-right corner

@tab

@ref{353c,,ACS_LRCORNER}

@end multitable

@end deffn

@geindex box() (curses.window method)
@anchor{library/curses curses window box}@anchor{353d}
@deffn {Method} window.box ([vertch, horch])

Similar to @ref{3536,,border()}, but both `ls' and `rs' are `vertch' and both `ts' and
`bs' are `horch'.  The default corner characters are always used by this function.
@end deffn

@geindex chgat() (curses.window method)
@anchor{library/curses curses window chgat}@anchor{353e}
@deffn {Method} window.chgat (attr)

@deffnx {Method} window.chgat (num, attr)

@deffnx {Method} window.chgat (y, x, attr)

@deffnx {Method} window.chgat (y, x, num, attr)

Set the attributes of `num' characters at the current cursor position, or at
position @code{(y, x)} if supplied. If `num' is not given or is @code{-1},
the attribute will be set on all the characters to the end of the line.  This
function moves cursor to position @code{(y, x)} if supplied. The changed line
will be touched using the @ref{353f,,touchline()} method so that the contents will
be redisplayed by the next window refresh.
@end deffn

@geindex clear() (curses.window method)
@anchor{library/curses curses window clear}@anchor{3540}
@deffn {Method} window.clear ()

Like @ref{3541,,erase()}, but also cause the whole window to be repainted upon next
call to @ref{34f1,,refresh()}.
@end deffn

@geindex clearok() (curses.window method)
@anchor{library/curses curses window clearok}@anchor{3542}
@deffn {Method} window.clearok (flag)

If `flag' is @code{True}, the next call to @ref{34f1,,refresh()} will clear the window
completely.
@end deffn

@geindex clrtobot() (curses.window method)
@anchor{library/curses curses window clrtobot}@anchor{3543}
@deffn {Method} window.clrtobot ()

Erase from cursor to the end of the window: all lines below the cursor are
deleted, and then the equivalent of @ref{3544,,clrtoeol()} is performed.
@end deffn

@geindex clrtoeol() (curses.window method)
@anchor{library/curses curses window clrtoeol}@anchor{3544}
@deffn {Method} window.clrtoeol ()

Erase from cursor to the end of the line.
@end deffn

@geindex cursyncup() (curses.window method)
@anchor{library/curses curses window cursyncup}@anchor{3545}
@deffn {Method} window.cursyncup ()

Update the current cursor position of all the ancestors of the window to
reflect the current cursor position of the window.
@end deffn

@geindex delch() (curses.window method)
@anchor{library/curses curses window delch}@anchor{3546}
@deffn {Method} window.delch ([y, x])

Delete the character under the cursor, or at @code{(y, x)} if specified.  All
characters to the right on the same line are shifted one position left.
@end deffn

@geindex deleteln() (curses.window method)
@anchor{library/curses curses window deleteln}@anchor{3547}
@deffn {Method} window.deleteln ()

Delete the line under the cursor. All following lines are moved up by one line.
@end deffn

@geindex derwin() (curses.window method)
@anchor{library/curses curses window derwin}@anchor{3548}
@deffn {Method} window.derwin (begin_y, begin_x)

@deffnx {Method} window.derwin (nlines, ncols, begin_y, begin_x)

An abbreviation for “derive window”, @code{derwin()} is the same as calling
@ref{3549,,subwin()}, except that `begin_y' and `begin_x' are relative to the origin
of the window, rather than relative to the entire screen.  Return a window
object for the derived window.
@end deffn

@geindex echochar() (curses.window method)
@anchor{library/curses curses window echochar}@anchor{354a}
@deffn {Method} window.echochar (ch[, attr])

Add character `ch' with attribute `attr', and immediately  call @ref{34f1,,refresh()}
on the window.
@end deffn

@geindex enclose() (curses.window method)
@anchor{library/curses curses window enclose}@anchor{1cd2}
@deffn {Method} window.enclose (y, x)

Test whether the given pair of screen-relative character-cell coordinates are
enclosed by the given window, returning @code{True} or @code{False}.  It is useful for
determining what subset of the screen windows enclose the location of a mouse
event.


Changed in version 3.10: Previously it returned @code{1} or @code{0} instead of @code{True} or @code{False}.

@end deffn

@geindex encoding (curses.window attribute)
@anchor{library/curses curses window encoding}@anchor{12a2}
@deffn {Attribute} window.encoding

Encoding used to encode method arguments (Unicode strings and characters).
The encoding attribute is inherited from the parent window when a subwindow
is created, for example with @ref{3549,,window.subwin()}.
By default, current locale encoding is used (see @ref{867,,locale.getencoding()}).


Added in version 3.3.

@end deffn

@geindex erase() (curses.window method)
@anchor{library/curses curses window erase}@anchor{3541}
@deffn {Method} window.erase ()

Clear the window.
@end deffn

@geindex getbegyx() (curses.window method)
@anchor{library/curses curses window getbegyx}@anchor{354b}
@deffn {Method} window.getbegyx ()

Return a tuple @code{(y, x)} of coordinates of upper-left corner.
@end deffn

@geindex getbkgd() (curses.window method)
@anchor{library/curses curses window getbkgd}@anchor{354c}
@deffn {Method} window.getbkgd ()

Return the given window’s current background character/attribute pair.
@end deffn

@geindex getch() (curses.window method)
@anchor{library/curses curses window getch}@anchor{186f}
@deffn {Method} window.getch ([y, x])

Get a character. Note that the integer returned does `not' have to be in ASCII
range: function keys, keypad keys and so on are represented by numbers higher
than 255.  In no-delay mode, return @code{-1} if there is no input, otherwise
wait until a key is pressed.
@end deffn

@geindex get_wch() (curses.window method)
@anchor{library/curses curses window get_wch}@anchor{12a3}
@deffn {Method} window.get_wch ([y, x])

Get a wide character. Return a character for most keys, or an integer for
function keys, keypad keys, and other special keys.
In no-delay mode, raise an exception if there is no input.


Added in version 3.3.

@end deffn

@geindex getkey() (curses.window method)
@anchor{library/curses curses window getkey}@anchor{354d}
@deffn {Method} window.getkey ([y, x])

Get a character, returning a string instead of an integer, as @ref{186f,,getch()}
does. Function keys, keypad keys and other special keys return a multibyte
string containing the key name.  In no-delay mode, raise an exception if
there is no input.
@end deffn

@geindex getmaxyx() (curses.window method)
@anchor{library/curses curses window getmaxyx}@anchor{354e}
@deffn {Method} window.getmaxyx ()

Return a tuple @code{(y, x)} of the height and width of the window.
@end deffn

@geindex getparyx() (curses.window method)
@anchor{library/curses curses window getparyx}@anchor{354f}
@deffn {Method} window.getparyx ()

Return the beginning coordinates of this window relative to its parent window
as a tuple @code{(y, x)}.  Return @code{(-1, -1)} if this window has no
parent.
@end deffn

@geindex getstr() (curses.window method)
@anchor{library/curses curses window getstr}@anchor{1887}
@deffn {Method} window.getstr ()

@deffnx {Method} window.getstr (n)

@deffnx {Method} window.getstr (y, x)

@deffnx {Method} window.getstr (y, x, n)

Read a bytes object from the user, with primitive line editing capacity.
At most `n' characters are read;
`n' defaults to and cannot exceed 2047.


Changed in version 3.14: The maximum value for `n' was increased from 1023 to 2047.

@end deffn

@geindex getyx() (curses.window method)
@anchor{library/curses curses window getyx}@anchor{3550}
@deffn {Method} window.getyx ()

Return a tuple @code{(y, x)} of current cursor position  relative to the window’s
upper-left corner.
@end deffn

@geindex hline() (curses.window method)
@anchor{library/curses curses window hline}@anchor{3551}
@deffn {Method} window.hline (ch, n[, attr])

@deffnx {Method} window.hline (y, x, ch, n[, attr])

Display a horizontal line starting at @code{(y, x)} with length `n' consisting of
the character `ch' with attributes `attr'.  The line stops at the right edge
of the window if fewer than `n' cells are available.
@end deffn

@geindex idcok() (curses.window method)
@anchor{library/curses curses window idcok}@anchor{3552}
@deffn {Method} window.idcok (flag)

If `flag' is @code{False}, curses no longer considers using the hardware insert/delete
character feature of the terminal; if `flag' is @code{True}, use of character insertion
and deletion is enabled.  When curses is first initialized, use of character
insert/delete is enabled by default.
@end deffn

@geindex idlok() (curses.window method)
@anchor{library/curses curses window idlok}@anchor{3553}
@deffn {Method} window.idlok (flag)

If `flag' is @code{True}, @code{curses} will try to use hardware line
editing facilities.  Otherwise, curses will not use them.
@end deffn

@geindex immedok() (curses.window method)
@anchor{library/curses curses window immedok}@anchor{3554}
@deffn {Method} window.immedok (flag)

If `flag' is @code{True}, any change in the window image automatically causes the
window to be refreshed; you no longer have to call @ref{34f1,,refresh()} yourself.
However, it may degrade performance considerably, due to repeated calls to
wrefresh.  This option is disabled by default.
@end deffn

@geindex inch() (curses.window method)
@anchor{library/curses curses window inch}@anchor{3555}
@deffn {Method} window.inch ([y, x])

Return the character at the given position in the window. The bottom 8 bits are
the character proper, and upper bits are the attributes.
@end deffn

@geindex insch() (curses.window method)
@anchor{library/curses curses window insch}@anchor{3556}
@deffn {Method} window.insch (ch[, attr])

@deffnx {Method} window.insch (y, x, ch[, attr])

Insert character `ch' with attributes `attr' before the character under the
cursor, or at @code{(y, x)} if specified.  All characters to the right of the
cursor are shifted one position right, with the rightmost character on the
line being lost.  The cursor position does not change.
@end deffn

@geindex insdelln() (curses.window method)
@anchor{library/curses curses window insdelln}@anchor{3557}
@deffn {Method} window.insdelln (nlines)

Insert `nlines' lines into the specified window above the current line.  The
`nlines' bottom lines are lost.  For negative `nlines', delete `nlines' lines
starting with the one under the cursor, and move the remaining lines up.  The
bottom `nlines' lines are cleared.  The current cursor position remains the
same.
@end deffn

@geindex insertln() (curses.window method)
@anchor{library/curses curses window insertln}@anchor{3558}
@deffn {Method} window.insertln ()

Insert a blank line under the cursor. All following lines are moved down by one
line.
@end deffn

@geindex insnstr() (curses.window method)
@anchor{library/curses curses window insnstr}@anchor{3559}
@deffn {Method} window.insnstr (str, n[, attr])

@deffnx {Method} window.insnstr (y, x, str, n[, attr])

Insert a character string (as many characters as will fit on the line) before
the character under the cursor, up to `n' characters.   If `n' is zero or
negative, the entire string is inserted. All characters to the right of the
cursor are shifted right, with the rightmost characters on the line being lost.
The cursor position does not change (after moving to `y', `x', if specified).
@end deffn

@geindex insstr() (curses.window method)
@anchor{library/curses curses window insstr}@anchor{355a}
@deffn {Method} window.insstr (str[, attr])

@deffnx {Method} window.insstr (y, x, str[, attr])

Insert a character string (as many characters as will fit on the line) before
the character under the cursor.  All characters to the right of the cursor are
shifted right, with the rightmost characters on the line being lost.  The cursor
position does not change (after moving to `y', `x', if specified).
@end deffn

@geindex instr() (curses.window method)
@anchor{library/curses curses window instr}@anchor{1886}
@deffn {Method} window.instr ([n])

@deffnx {Method} window.instr (y, x[, n])

Return a bytes object of characters, extracted from the window starting at the
current cursor position, or at `y', `x' if specified, and stopping at the end
of the line. Attributes and color information are stripped
from the characters.  If `n' is specified, @code{instr()} returns a string
at most `n' characters long (exclusive of the trailing NUL).
The maximum value for `n' is 2047.


Changed in version 3.14: The maximum value for `n' was increased from 1023 to 2047.

@end deffn

@geindex is_linetouched() (curses.window method)
@anchor{library/curses curses window is_linetouched}@anchor{355b}
@deffn {Method} window.is_linetouched (line)

Return @code{True} if the specified line was modified since the last call to
@ref{34f1,,refresh()}; otherwise return @code{False}.  Raise a @ref{34dd,,curses.error}
exception if `line' is not valid for the given window.
@end deffn

@geindex is_wintouched() (curses.window method)
@anchor{library/curses curses window is_wintouched}@anchor{355c}
@deffn {Method} window.is_wintouched ()

Return @code{True} if the specified window was modified since the last call to
@ref{34f1,,refresh()}; otherwise return @code{False}.
@end deffn

@geindex keypad() (curses.window method)
@anchor{library/curses curses window keypad}@anchor{355d}
@deffn {Method} window.keypad (flag)

If `flag' is @code{True}, escape sequences generated by some keys (keypad,  function keys)
will be interpreted by @code{curses}. If `flag' is @code{False}, escape sequences will be
left as is in the input stream.
@end deffn

@geindex leaveok() (curses.window method)
@anchor{library/curses curses window leaveok}@anchor{3503}
@deffn {Method} window.leaveok (flag)

If `flag' is @code{True}, cursor is left where it is on update, instead of being at “cursor
position.”  This reduces cursor movement where possible.

If `flag' is @code{False}, cursor will always be at “cursor position” after an update.
@end deffn

@geindex move() (curses.window method)
@anchor{library/curses curses window move}@anchor{355e}
@deffn {Method} window.move (new_y, new_x)

Move cursor to @code{(new_y, new_x)}.
@end deffn

@geindex mvderwin() (curses.window method)
@anchor{library/curses curses window mvderwin}@anchor{355f}
@deffn {Method} window.mvderwin (y, x)

Move the window inside its parent window.  The screen-relative parameters of
the window are not changed.  This routine is used to display different parts of
the parent window at the same physical position on the screen.
@end deffn

@geindex mvwin() (curses.window method)
@anchor{library/curses curses window mvwin}@anchor{3560}
@deffn {Method} window.mvwin (new_y, new_x)

Move the window so its upper-left corner is at @code{(new_y, new_x)}.

Moving the window so that any part of it would be off the screen is an error:
the window is not moved and @ref{34dd,,curses.error} is raised.
@end deffn

@geindex nodelay() (curses.window method)
@anchor{library/curses curses window nodelay}@anchor{3561}
@deffn {Method} window.nodelay (flag)

If `flag' is @code{True}, @ref{186f,,getch()} will be non-blocking.
@end deffn

@geindex notimeout() (curses.window method)
@anchor{library/curses curses window notimeout}@anchor{3562}
@deffn {Method} window.notimeout (flag)

If `flag' is @code{True}, escape sequences will not be timed out.

If `flag' is @code{False}, after a few milliseconds, an escape sequence will not be
interpreted, and will be left in the input stream as is.
@end deffn

@geindex noutrefresh() (curses.window method)
@anchor{library/curses curses window noutrefresh}@anchor{34ef}
@deffn {Method} window.noutrefresh ()

@deffnx {Method} window.noutrefresh (pminrow, pmincol, sminrow, smincol, smaxrow, smaxcol)

Mark for refresh but wait.  This function updates the data structure
representing the desired state of the window, but does not force an update of
the physical screen.  To accomplish that, call  @ref{34ee,,doupdate()}.

The 6 arguments can only be specified, and are then required, when the window
is a pad created with @ref{3515,,newpad()}; they have the same meaning as for
@ref{34f1,,refresh()}.
@end deffn

@geindex overlay() (curses.window method)
@anchor{library/curses curses window overlay}@anchor{3563}
@deffn {Method} window.overlay (destwin[, sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol])

Overlay the window on top of `destwin'. The windows need not be the same size,
only the overlapping region is copied. This copy is non-destructive, which means
that the current background character does not overwrite the old contents of
`destwin'.

To get fine-grained control over the copied region, the second form of
@code{overlay()} can be used. `sminrow' and `smincol' are the upper-left
coordinates of the source window, and the other variables mark a rectangle in
the destination window.
@end deffn

@geindex overwrite() (curses.window method)
@anchor{library/curses curses window overwrite}@anchor{3564}
@deffn {Method} window.overwrite (destwin[, sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol])

Overwrite the window on top of `destwin'. The windows need not be the same size,
in which case only the overlapping region is copied. This copy is destructive,
which means that the current background character overwrites the old contents of
`destwin'.

To get fine-grained control over the copied region, the second form of
@code{overwrite()} can be used. `sminrow' and `smincol' are the upper-left
coordinates of the source window, the other variables mark a rectangle in the
destination window.
@end deffn

@geindex putwin() (curses.window method)
@anchor{library/curses curses window putwin}@anchor{3505}
@deffn {Method} window.putwin (file)

Write all data associated with the window into the provided file object.  This
information can be later retrieved using the @ref{3504,,getwin()} function.
@end deffn

@geindex redrawln() (curses.window method)
@anchor{library/curses curses window redrawln}@anchor{3565}
@deffn {Method} window.redrawln (beg, num)

Indicate that the `num' screen lines, starting at line `beg', are corrupted and
should be completely redrawn on the next @ref{34f1,,refresh()} call.
@end deffn

@geindex redrawwin() (curses.window method)
@anchor{library/curses curses window redrawwin}@anchor{3566}
@deffn {Method} window.redrawwin ()

Touch the entire window, causing it to be completely redrawn on the next
@ref{34f1,,refresh()} call.
@end deffn

@geindex refresh() (curses.window method)
@anchor{library/curses curses window refresh}@anchor{34f1}
@deffn {Method} window.refresh ([pminrow, pmincol, sminrow, smincol, smaxrow, smaxcol])

Update the display immediately (sync actual screen with previous
drawing/deleting methods).

The 6 arguments can only be specified, and are then required, when the window
is a pad created with @ref{3515,,newpad()}.  The additional parameters are needed to indicate what part
of the pad and screen are involved. `pminrow' and `pmincol' specify the
upper-left corner of the rectangle to be displayed in the pad.  `sminrow',
`smincol', `smaxrow', and `smaxcol' specify the edges of the rectangle to be
displayed on the screen.  The lower-right corner of the rectangle to be
displayed in the pad is calculated from the screen coordinates, since the
rectangles must be the same size.  Both rectangles must be entirely contained
within their respective structures.  Negative values of `pminrow', `pmincol',
`sminrow', or `smincol' are treated as if they were zero.
@end deffn

@geindex resize() (curses.window method)
@anchor{library/curses curses window resize}@anchor{3567}
@deffn {Method} window.resize (nlines, ncols)

Reallocate storage for a curses window to adjust its dimensions to the
specified values.  If either dimension is larger than the current values, the
window’s data is filled with blanks that have the current background
rendition (as set by @ref{3535,,bkgdset()}) merged into them.
@end deffn

@geindex scroll() (curses.window method)
@anchor{library/curses curses window scroll}@anchor{3568}
@deffn {Method} window.scroll ([lines=1])

Scroll the screen or scrolling region.  Scroll upward by `lines' lines if
`lines' is positive, or downward if it is negative.  Scrolling has no effect
unless it has been enabled for the window with @ref{3569,,scrollok()}.
@end deffn

@geindex scrollok() (curses.window method)
@anchor{library/curses curses window scrollok}@anchor{3569}
@deffn {Method} window.scrollok (flag)

Control what happens when the cursor of a window is moved off the edge of the
window or scrolling region, either as a result of a newline action on the bottom
line, or typing the last character of the last line.  If `flag' is @code{False}, the
cursor is left on the bottom line.  If `flag' is @code{True}, the window is scrolled up
one line.  Note that in order to get the physical scrolling effect on the
terminal, it is also necessary to call @ref{3553,,idlok()}.
@end deffn

@geindex setscrreg() (curses.window method)
@anchor{library/curses curses window setscrreg}@anchor{356a}
@deffn {Method} window.setscrreg (top, bottom)

Set the scrolling region from line `top' to line `bottom'. All scrolling actions
will take place in this region.
@end deffn

@geindex standend() (curses.window method)
@anchor{library/curses curses window standend}@anchor{356b}
@deffn {Method} window.standend ()

Turn off the standout attribute.  On some terminals this has the side effect of
turning off all attributes.
@end deffn

@geindex standout() (curses.window method)
@anchor{library/curses curses window standout}@anchor{356c}
@deffn {Method} window.standout ()

Turn on attribute `A_STANDOUT'.
@end deffn

@geindex subpad() (curses.window method)
@anchor{library/curses curses window subpad}@anchor{356d}
@deffn {Method} window.subpad (begin_y, begin_x)

@deffnx {Method} window.subpad (nlines, ncols, begin_y, begin_x)

Return a sub-pad, whose upper-left corner is at @code{(begin_y, begin_x)}, and
whose width/height is `ncols'/`nlines'.  The coordinates are relative to the
parent pad (unlike @ref{3549,,subwin()}, which uses screen coordinates).  This
method is only available for pads created with @ref{3515,,newpad()}.
@end deffn

@geindex subwin() (curses.window method)
@anchor{library/curses curses window subwin}@anchor{3549}
@deffn {Method} window.subwin (begin_y, begin_x)

@deffnx {Method} window.subwin (nlines, ncols, begin_y, begin_x)

Return a sub-window, whose upper-left corner is at the screen-relative
coordinates @code{(begin_y, begin_x)}, and whose width/height is `ncols'/`nlines'.

By default, the sub-window will extend from the specified position to the lower
right corner of the window.
@end deffn

@geindex syncdown() (curses.window method)
@anchor{library/curses curses window syncdown}@anchor{356e}
@deffn {Method} window.syncdown ()

Touch each location in the window that has been touched in any of its ancestor
windows.  This routine is called by @ref{34f1,,refresh()}, so it should almost never
be necessary to call it manually.
@end deffn

@geindex syncok() (curses.window method)
@anchor{library/curses curses window syncok}@anchor{356f}
@deffn {Method} window.syncok (flag)

If `flag' is @code{True}, then @ref{3570,,syncup()} is called automatically
whenever there is a change in the window.
@end deffn

@geindex syncup() (curses.window method)
@anchor{library/curses curses window syncup}@anchor{3570}
@deffn {Method} window.syncup ()

Touch all locations in ancestors of the window that have been changed in  the
window.
@end deffn

@geindex timeout() (curses.window method)
@anchor{library/curses curses window timeout}@anchor{3571}
@deffn {Method} window.timeout (delay)

Set blocking or non-blocking read behavior for the window.  If `delay' is
negative, blocking read is used (which will wait indefinitely for input).  If
`delay' is zero, then non-blocking read is used, and @ref{186f,,getch()} will
return @code{-1} if no input is waiting.  If `delay' is positive, then
@code{getch()} will block for `delay' milliseconds, and return @code{-1} if there is
still no input at the end of that time.
@end deffn

@geindex touchline() (curses.window method)
@anchor{library/curses curses window touchline}@anchor{353f}
@deffn {Method} window.touchline (start, count[, changed])

Pretend `count' lines have been changed, starting with line `start'.  If
`changed' is supplied, it specifies whether the affected lines are marked as
having been changed (`changed'@code{=True}) or unchanged (`changed'@code{=False}).
@end deffn

@geindex touchwin() (curses.window method)
@anchor{library/curses curses window touchwin}@anchor{3572}
@deffn {Method} window.touchwin ()

Pretend the whole window has been changed, for purposes of drawing
optimizations.
@end deffn

@geindex untouchwin() (curses.window method)
@anchor{library/curses curses window untouchwin}@anchor{3573}
@deffn {Method} window.untouchwin ()

Mark all lines in  the  window  as unchanged since the last call to
@ref{34f1,,refresh()}.
@end deffn

@geindex vline() (curses.window method)
@anchor{library/curses curses window vline}@anchor{1b42}
@deffn {Method} window.vline (ch, n[, attr])

@deffnx {Method} window.vline (y, x, ch, n[, attr])

Display a vertical line starting at @code{(y, x)} with length `n' consisting of the
character `ch' with attributes `attr'.
@end deffn

@node Constants<6>,,Window objects,curses — Terminal handling for character-cell displays
@anchor{library/curses constants}@anchor{3574}
@subsubsection Constants


The @code{curses} module defines the following data members:

@geindex ERR (in module curses)
@anchor{library/curses curses ERR}@anchor{3575}
@deffn {Data} curses.ERR

Some curses routines  that  return  an integer, such as @ref{186f,,getch()}, return
@ref{3575,,ERR} upon failure.
@end deffn

@geindex OK (in module curses)
@anchor{library/curses curses OK}@anchor{3576}
@deffn {Data} curses.OK

Some curses routines  that  return  an integer, such as  @ref{1952,,napms()}, return
@ref{3576,,OK} upon success.
@end deffn

@geindex version (in module curses)
@anchor{library/curses curses version}@anchor{3577}
@deffn {Data} curses.version

A bytes object representing the current version of the module.
@end deffn

@geindex ncurses_version (in module curses)
@anchor{library/curses curses ncurses_version}@anchor{be0}
@deffn {Data} curses.ncurses_version

A named tuple containing the three components of the ncurses library
version: `major', `minor', and `patch'.  All values are integers.  The
components can also be accessed by name,  so @code{curses.ncurses_version[0]}
is equivalent to @code{curses.ncurses_version.major} and so on.

Availability: if the ncurses library is used.


Added in version 3.8.

@end deffn

@geindex COLORS (in module curses)
@anchor{library/curses curses COLORS}@anchor{3523}
@deffn {Data} curses.COLORS

The maximum number of colors the terminal can support.
It is defined only after the call to @ref{3522,,start_color()}.
@end deffn

@geindex COLOR_PAIRS (in module curses)
@anchor{library/curses curses COLOR_PAIRS}@anchor{3524}
@deffn {Data} curses.COLOR_PAIRS

The maximum number of color pairs the terminal can support.
It is defined only after the call to @ref{3522,,start_color()}.
@end deffn

@geindex COLS (in module curses)
@anchor{library/curses curses COLS}@anchor{ff3}
@deffn {Data} curses.COLS

The width of the screen, that is, the number of columns.
It is defined only after the call to @ref{1953,,initscr()}.
Updated by @ref{ff1,,update_lines_cols()}, @ref{1973,,resizeterm()} and
@ref{1974,,resize_term()}.
@end deffn

@geindex LINES (in module curses)
@anchor{library/curses curses LINES}@anchor{ff2}
@deffn {Data} curses.LINES

The height of the screen, that is, the number of lines.
It is defined only after the call to @ref{1953,,initscr()}.
Updated by @ref{ff1,,update_lines_cols()}, @ref{1973,,resizeterm()} and
@ref{1974,,resize_term()}.
@end deffn

Some constants are available to specify character cell attributes.
The exact constants available are system dependent.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Attribute

@tab

Meaning

@item

@geindex A_ALTCHARSET (in module curses)
@anchor{library/curses curses A_ALTCHARSET}@anchor{3578}
@deffn {Data} curses.A_ALTCHARSET
@end deffn

@tab

Alternate character set mode

@item

@geindex A_BLINK (in module curses)
@anchor{library/curses curses A_BLINK}@anchor{3579}
@deffn {Data} curses.A_BLINK
@end deffn

@tab

Blink mode

@item

@geindex A_BOLD (in module curses)
@anchor{library/curses curses A_BOLD}@anchor{357a}
@deffn {Data} curses.A_BOLD
@end deffn

@tab

Bold mode

@item

@geindex A_DIM (in module curses)
@anchor{library/curses curses A_DIM}@anchor{357b}
@deffn {Data} curses.A_DIM
@end deffn

@tab

Dim mode

@item

@geindex A_INVIS (in module curses)
@anchor{library/curses curses A_INVIS}@anchor{357c}
@deffn {Data} curses.A_INVIS
@end deffn

@tab

Invisible or blank mode

@item

@geindex A_ITALIC (in module curses)
@anchor{library/curses curses A_ITALIC}@anchor{357d}
@deffn {Data} curses.A_ITALIC
@end deffn

@tab

Italic mode

@item

@geindex A_NORMAL (in module curses)
@anchor{library/curses curses A_NORMAL}@anchor{34de}
@deffn {Data} curses.A_NORMAL
@end deffn

@tab

Normal attribute

@item

@geindex A_PROTECT (in module curses)
@anchor{library/curses curses A_PROTECT}@anchor{357e}
@deffn {Data} curses.A_PROTECT
@end deffn

@tab

Protected mode

@item

@geindex A_REVERSE (in module curses)
@anchor{library/curses curses A_REVERSE}@anchor{34e6}
@deffn {Data} curses.A_REVERSE
@end deffn

@tab

Reverse background and
foreground colors

@item

@geindex A_STANDOUT (in module curses)
@anchor{library/curses curses A_STANDOUT}@anchor{34e5}
@deffn {Data} curses.A_STANDOUT
@end deffn

@tab

Standout mode

@item

@geindex A_UNDERLINE (in module curses)
@anchor{library/curses curses A_UNDERLINE}@anchor{357f}
@deffn {Data} curses.A_UNDERLINE
@end deffn

@tab

Underline mode

@item

@geindex A_HORIZONTAL (in module curses)
@anchor{library/curses curses A_HORIZONTAL}@anchor{3580}
@deffn {Data} curses.A_HORIZONTAL
@end deffn

@tab

Horizontal highlight

@item

@geindex A_LEFT (in module curses)
@anchor{library/curses curses A_LEFT}@anchor{3581}
@deffn {Data} curses.A_LEFT
@end deffn

@tab

Left highlight

@item

@geindex A_LOW (in module curses)
@anchor{library/curses curses A_LOW}@anchor{3582}
@deffn {Data} curses.A_LOW
@end deffn

@tab

Low highlight

@item

@geindex A_RIGHT (in module curses)
@anchor{library/curses curses A_RIGHT}@anchor{3583}
@deffn {Data} curses.A_RIGHT
@end deffn

@tab

Right highlight

@item

@geindex A_TOP (in module curses)
@anchor{library/curses curses A_TOP}@anchor{3584}
@deffn {Data} curses.A_TOP
@end deffn

@tab

Top highlight

@item

@geindex A_VERTICAL (in module curses)
@anchor{library/curses curses A_VERTICAL}@anchor{3585}
@deffn {Data} curses.A_VERTICAL
@end deffn

@tab

Vertical highlight

@end multitable



Added in version 3.7: @code{A_ITALIC} was added.


Several constants are available to extract corresponding attributes returned
by some methods.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Bit-mask

@tab

Meaning

@item

@geindex A_ATTRIBUTES (in module curses)
@anchor{library/curses curses A_ATTRIBUTES}@anchor{3586}
@deffn {Data} curses.A_ATTRIBUTES
@end deffn

@tab

Bit-mask to extract
attributes

@item

@geindex A_CHARTEXT (in module curses)
@anchor{library/curses curses A_CHARTEXT}@anchor{3587}
@deffn {Data} curses.A_CHARTEXT
@end deffn

@tab

Bit-mask to extract a
character

@item

@geindex A_COLOR (in module curses)
@anchor{library/curses curses A_COLOR}@anchor{3588}
@deffn {Data} curses.A_COLOR
@end deffn

@tab

Bit-mask to extract
color-pair field information

@end multitable


Keys are referred to by integer constants with names starting with  @code{KEY_}.
The exact keycaps available are system dependent.

@c XXX this table is far too large! should it be alphabetized?


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Key constant

@tab

Key

@item

@geindex KEY_MIN (in module curses)
@anchor{library/curses curses KEY_MIN}@anchor{3589}
@deffn {Data} curses.KEY_MIN
@end deffn

@tab

Minimum key value

@item

@geindex KEY_BREAK (in module curses)
@anchor{library/curses curses KEY_BREAK}@anchor{358a}
@deffn {Data} curses.KEY_BREAK
@end deffn

@tab

Break key (unreliable)

@item

@geindex KEY_DOWN (in module curses)
@anchor{library/curses curses KEY_DOWN}@anchor{358b}
@deffn {Data} curses.KEY_DOWN
@end deffn

@tab

Down-arrow

@item

@geindex KEY_UP (in module curses)
@anchor{library/curses curses KEY_UP}@anchor{358c}
@deffn {Data} curses.KEY_UP
@end deffn

@tab

Up-arrow

@item

@geindex KEY_LEFT (in module curses)
@anchor{library/curses curses KEY_LEFT}@anchor{358d}
@deffn {Data} curses.KEY_LEFT
@end deffn

@tab

Left-arrow

@item

@geindex KEY_RIGHT (in module curses)
@anchor{library/curses curses KEY_RIGHT}@anchor{358e}
@deffn {Data} curses.KEY_RIGHT
@end deffn

@tab

Right-arrow

@item

@geindex KEY_HOME (in module curses)
@anchor{library/curses curses KEY_HOME}@anchor{358f}
@deffn {Data} curses.KEY_HOME
@end deffn

@tab

Home key (upward+left arrow)

@item

@geindex KEY_BACKSPACE (in module curses)
@anchor{library/curses curses KEY_BACKSPACE}@anchor{3590}
@deffn {Data} curses.KEY_BACKSPACE
@end deffn

@tab

Backspace (unreliable)

@item

@geindex KEY_F0 (in module curses)
@anchor{library/curses curses KEY_F0}@anchor{3591}
@deffn {Data} curses.KEY_F0
@end deffn

@tab

Function keys.  Up to 64 function keys are
supported.

@item

@geindex KEY_Fn (in module curses)
@anchor{library/curses curses KEY_Fn}@anchor{3592}
@deffn {Data} curses.KEY_Fn
@end deffn

@tab

Value of function key `n'

@item

@geindex KEY_DL (in module curses)
@anchor{library/curses curses KEY_DL}@anchor{3593}
@deffn {Data} curses.KEY_DL
@end deffn

@tab

Delete line

@item

@geindex KEY_IL (in module curses)
@anchor{library/curses curses KEY_IL}@anchor{3594}
@deffn {Data} curses.KEY_IL
@end deffn

@tab

Insert line

@item

@geindex KEY_DC (in module curses)
@anchor{library/curses curses KEY_DC}@anchor{3595}
@deffn {Data} curses.KEY_DC
@end deffn

@tab

Delete character

@item

@geindex KEY_IC (in module curses)
@anchor{library/curses curses KEY_IC}@anchor{3596}
@deffn {Data} curses.KEY_IC
@end deffn

@tab

Insert char or enter insert mode

@item

@geindex KEY_EIC (in module curses)
@anchor{library/curses curses KEY_EIC}@anchor{3597}
@deffn {Data} curses.KEY_EIC
@end deffn

@tab

Exit insert char mode

@item

@geindex KEY_CLEAR (in module curses)
@anchor{library/curses curses KEY_CLEAR}@anchor{3598}
@deffn {Data} curses.KEY_CLEAR
@end deffn

@tab

Clear screen

@item

@geindex KEY_EOS (in module curses)
@anchor{library/curses curses KEY_EOS}@anchor{3599}
@deffn {Data} curses.KEY_EOS
@end deffn

@tab

Clear to end of screen

@item

@geindex KEY_EOL (in module curses)
@anchor{library/curses curses KEY_EOL}@anchor{359a}
@deffn {Data} curses.KEY_EOL
@end deffn

@tab

Clear to end of line

@item

@geindex KEY_SF (in module curses)
@anchor{library/curses curses KEY_SF}@anchor{359b}
@deffn {Data} curses.KEY_SF
@end deffn

@tab

Scroll 1 line forward

@item

@geindex KEY_SR (in module curses)
@anchor{library/curses curses KEY_SR}@anchor{359c}
@deffn {Data} curses.KEY_SR
@end deffn

@tab

Scroll 1 line backward (reverse)

@item

@geindex KEY_NPAGE (in module curses)
@anchor{library/curses curses KEY_NPAGE}@anchor{359d}
@deffn {Data} curses.KEY_NPAGE
@end deffn

@tab

Next page

@item

@geindex KEY_PPAGE (in module curses)
@anchor{library/curses curses KEY_PPAGE}@anchor{359e}
@deffn {Data} curses.KEY_PPAGE
@end deffn

@tab

Previous page

@item

@geindex KEY_STAB (in module curses)
@anchor{library/curses curses KEY_STAB}@anchor{359f}
@deffn {Data} curses.KEY_STAB
@end deffn

@tab

Set tab

@item

@geindex KEY_CTAB (in module curses)
@anchor{library/curses curses KEY_CTAB}@anchor{35a0}
@deffn {Data} curses.KEY_CTAB
@end deffn

@tab

Clear tab

@item

@geindex KEY_CATAB (in module curses)
@anchor{library/curses curses KEY_CATAB}@anchor{35a1}
@deffn {Data} curses.KEY_CATAB
@end deffn

@tab

Clear all tabs

@item

@geindex KEY_ENTER (in module curses)
@anchor{library/curses curses KEY_ENTER}@anchor{35a2}
@deffn {Data} curses.KEY_ENTER
@end deffn

@tab

Enter or send (unreliable)

@item

@geindex KEY_SRESET (in module curses)
@anchor{library/curses curses KEY_SRESET}@anchor{35a3}
@deffn {Data} curses.KEY_SRESET
@end deffn

@tab

Soft (partial) reset (unreliable)

@item

@geindex KEY_RESET (in module curses)
@anchor{library/curses curses KEY_RESET}@anchor{35a4}
@deffn {Data} curses.KEY_RESET
@end deffn

@tab

Reset or hard reset (unreliable)

@item

@geindex KEY_PRINT (in module curses)
@anchor{library/curses curses KEY_PRINT}@anchor{35a5}
@deffn {Data} curses.KEY_PRINT
@end deffn

@tab

Print

@item

@geindex KEY_LL (in module curses)
@anchor{library/curses curses KEY_LL}@anchor{35a6}
@deffn {Data} curses.KEY_LL
@end deffn

@tab

Home down or bottom (lower left)

@item

@geindex KEY_A1 (in module curses)
@anchor{library/curses curses KEY_A1}@anchor{35a7}
@deffn {Data} curses.KEY_A1
@end deffn

@tab

Upper left of keypad

@item

@geindex KEY_A3 (in module curses)
@anchor{library/curses curses KEY_A3}@anchor{35a8}
@deffn {Data} curses.KEY_A3
@end deffn

@tab

Upper right of keypad

@item

@geindex KEY_B2 (in module curses)
@anchor{library/curses curses KEY_B2}@anchor{35a9}
@deffn {Data} curses.KEY_B2
@end deffn

@tab

Center of keypad

@item

@geindex KEY_C1 (in module curses)
@anchor{library/curses curses KEY_C1}@anchor{35aa}
@deffn {Data} curses.KEY_C1
@end deffn

@tab

Lower left of keypad

@item

@geindex KEY_C3 (in module curses)
@anchor{library/curses curses KEY_C3}@anchor{35ab}
@deffn {Data} curses.KEY_C3
@end deffn

@tab

Lower right of keypad

@item

@geindex KEY_BTAB (in module curses)
@anchor{library/curses curses KEY_BTAB}@anchor{35ac}
@deffn {Data} curses.KEY_BTAB
@end deffn

@tab

Back tab

@item

@geindex KEY_BEG (in module curses)
@anchor{library/curses curses KEY_BEG}@anchor{35ad}
@deffn {Data} curses.KEY_BEG
@end deffn

@tab

Beg (beginning)

@item

@geindex KEY_CANCEL (in module curses)
@anchor{library/curses curses KEY_CANCEL}@anchor{35ae}
@deffn {Data} curses.KEY_CANCEL
@end deffn

@tab

Cancel

@item

@geindex KEY_CLOSE (in module curses)
@anchor{library/curses curses KEY_CLOSE}@anchor{35af}
@deffn {Data} curses.KEY_CLOSE
@end deffn

@tab

Close

@item

@geindex KEY_COMMAND (in module curses)
@anchor{library/curses curses KEY_COMMAND}@anchor{35b0}
@deffn {Data} curses.KEY_COMMAND
@end deffn

@tab

Cmd (command)

@item

@geindex KEY_COPY (in module curses)
@anchor{library/curses curses KEY_COPY}@anchor{35b1}
@deffn {Data} curses.KEY_COPY
@end deffn

@tab

Copy

@item

@geindex KEY_CREATE (in module curses)
@anchor{library/curses curses KEY_CREATE}@anchor{35b2}
@deffn {Data} curses.KEY_CREATE
@end deffn

@tab

Create

@item

@geindex KEY_END (in module curses)
@anchor{library/curses curses KEY_END}@anchor{35b3}
@deffn {Data} curses.KEY_END
@end deffn

@tab

End

@item

@geindex KEY_EXIT (in module curses)
@anchor{library/curses curses KEY_EXIT}@anchor{35b4}
@deffn {Data} curses.KEY_EXIT
@end deffn

@tab

Exit

@item

@geindex KEY_FIND (in module curses)
@anchor{library/curses curses KEY_FIND}@anchor{35b5}
@deffn {Data} curses.KEY_FIND
@end deffn

@tab

Find

@item

@geindex KEY_HELP (in module curses)
@anchor{library/curses curses KEY_HELP}@anchor{35b6}
@deffn {Data} curses.KEY_HELP
@end deffn

@tab

Help

@item

@geindex KEY_MARK (in module curses)
@anchor{library/curses curses KEY_MARK}@anchor{35b7}
@deffn {Data} curses.KEY_MARK
@end deffn

@tab

Mark

@item

@geindex KEY_MESSAGE (in module curses)
@anchor{library/curses curses KEY_MESSAGE}@anchor{35b8}
@deffn {Data} curses.KEY_MESSAGE
@end deffn

@tab

Message

@item

@geindex KEY_MOVE (in module curses)
@anchor{library/curses curses KEY_MOVE}@anchor{35b9}
@deffn {Data} curses.KEY_MOVE
@end deffn

@tab

Move

@item

@geindex KEY_NEXT (in module curses)
@anchor{library/curses curses KEY_NEXT}@anchor{35ba}
@deffn {Data} curses.KEY_NEXT
@end deffn

@tab

Next

@item

@geindex KEY_OPEN (in module curses)
@anchor{library/curses curses KEY_OPEN}@anchor{35bb}
@deffn {Data} curses.KEY_OPEN
@end deffn

@tab

Open

@item

@geindex KEY_OPTIONS (in module curses)
@anchor{library/curses curses KEY_OPTIONS}@anchor{35bc}
@deffn {Data} curses.KEY_OPTIONS
@end deffn

@tab

Options

@item

@geindex KEY_PREVIOUS (in module curses)
@anchor{library/curses curses KEY_PREVIOUS}@anchor{35bd}
@deffn {Data} curses.KEY_PREVIOUS
@end deffn

@tab

Prev (previous)

@item

@geindex KEY_REDO (in module curses)
@anchor{library/curses curses KEY_REDO}@anchor{35be}
@deffn {Data} curses.KEY_REDO
@end deffn

@tab

Redo

@item

@geindex KEY_REFERENCE (in module curses)
@anchor{library/curses curses KEY_REFERENCE}@anchor{35bf}
@deffn {Data} curses.KEY_REFERENCE
@end deffn

@tab

Ref (reference)

@item

@geindex KEY_REFRESH (in module curses)
@anchor{library/curses curses KEY_REFRESH}@anchor{35c0}
@deffn {Data} curses.KEY_REFRESH
@end deffn

@tab

Refresh

@item

@geindex KEY_REPLACE (in module curses)
@anchor{library/curses curses KEY_REPLACE}@anchor{35c1}
@deffn {Data} curses.KEY_REPLACE
@end deffn

@tab

Replace

@item

@geindex KEY_RESTART (in module curses)
@anchor{library/curses curses KEY_RESTART}@anchor{35c2}
@deffn {Data} curses.KEY_RESTART
@end deffn

@tab

Restart

@item

@geindex KEY_RESUME (in module curses)
@anchor{library/curses curses KEY_RESUME}@anchor{35c3}
@deffn {Data} curses.KEY_RESUME
@end deffn

@tab

Resume

@item

@geindex KEY_SAVE (in module curses)
@anchor{library/curses curses KEY_SAVE}@anchor{35c4}
@deffn {Data} curses.KEY_SAVE
@end deffn

@tab

Save

@item

@geindex KEY_SBEG (in module curses)
@anchor{library/curses curses KEY_SBEG}@anchor{35c5}
@deffn {Data} curses.KEY_SBEG
@end deffn

@tab

Shifted Beg (beginning)

@item

@geindex KEY_SCANCEL (in module curses)
@anchor{library/curses curses KEY_SCANCEL}@anchor{35c6}
@deffn {Data} curses.KEY_SCANCEL
@end deffn

@tab

Shifted Cancel

@item

@geindex KEY_SCOMMAND (in module curses)
@anchor{library/curses curses KEY_SCOMMAND}@anchor{35c7}
@deffn {Data} curses.KEY_SCOMMAND
@end deffn

@tab

Shifted Command

@item

@geindex KEY_SCOPY (in module curses)
@anchor{library/curses curses KEY_SCOPY}@anchor{35c8}
@deffn {Data} curses.KEY_SCOPY
@end deffn

@tab

Shifted Copy

@item

@geindex KEY_SCREATE (in module curses)
@anchor{library/curses curses KEY_SCREATE}@anchor{35c9}
@deffn {Data} curses.KEY_SCREATE
@end deffn

@tab

Shifted Create

@item

@geindex KEY_SDC (in module curses)
@anchor{library/curses curses KEY_SDC}@anchor{35ca}
@deffn {Data} curses.KEY_SDC
@end deffn

@tab

Shifted Delete char

@item

@geindex KEY_SDL (in module curses)
@anchor{library/curses curses KEY_SDL}@anchor{35cb}
@deffn {Data} curses.KEY_SDL
@end deffn

@tab

Shifted Delete line

@item

@geindex KEY_SELECT (in module curses)
@anchor{library/curses curses KEY_SELECT}@anchor{35cc}
@deffn {Data} curses.KEY_SELECT
@end deffn

@tab

Select

@item

@geindex KEY_SEND (in module curses)
@anchor{library/curses curses KEY_SEND}@anchor{35cd}
@deffn {Data} curses.KEY_SEND
@end deffn

@tab

Shifted End

@item

@geindex KEY_SEOL (in module curses)
@anchor{library/curses curses KEY_SEOL}@anchor{35ce}
@deffn {Data} curses.KEY_SEOL
@end deffn

@tab

Shifted Clear line

@item

@geindex KEY_SEXIT (in module curses)
@anchor{library/curses curses KEY_SEXIT}@anchor{35cf}
@deffn {Data} curses.KEY_SEXIT
@end deffn

@tab

Shifted Exit

@item

@geindex KEY_SFIND (in module curses)
@anchor{library/curses curses KEY_SFIND}@anchor{35d0}
@deffn {Data} curses.KEY_SFIND
@end deffn

@tab

Shifted Find

@item

@geindex KEY_SHELP (in module curses)
@anchor{library/curses curses KEY_SHELP}@anchor{35d1}
@deffn {Data} curses.KEY_SHELP
@end deffn

@tab

Shifted Help

@item

@geindex KEY_SHOME (in module curses)
@anchor{library/curses curses KEY_SHOME}@anchor{35d2}
@deffn {Data} curses.KEY_SHOME
@end deffn

@tab

Shifted Home

@item

@geindex KEY_SIC (in module curses)
@anchor{library/curses curses KEY_SIC}@anchor{35d3}
@deffn {Data} curses.KEY_SIC
@end deffn

@tab

Shifted Input

@item

@geindex KEY_SLEFT (in module curses)
@anchor{library/curses curses KEY_SLEFT}@anchor{35d4}
@deffn {Data} curses.KEY_SLEFT
@end deffn

@tab

Shifted Left arrow

@item

@geindex KEY_SMESSAGE (in module curses)
@anchor{library/curses curses KEY_SMESSAGE}@anchor{35d5}
@deffn {Data} curses.KEY_SMESSAGE
@end deffn

@tab

Shifted Message

@item

@geindex KEY_SMOVE (in module curses)
@anchor{library/curses curses KEY_SMOVE}@anchor{35d6}
@deffn {Data} curses.KEY_SMOVE
@end deffn

@tab

Shifted Move

@item

@geindex KEY_SNEXT (in module curses)
@anchor{library/curses curses KEY_SNEXT}@anchor{35d7}
@deffn {Data} curses.KEY_SNEXT
@end deffn

@tab

Shifted Next

@item

@geindex KEY_SOPTIONS (in module curses)
@anchor{library/curses curses KEY_SOPTIONS}@anchor{35d8}
@deffn {Data} curses.KEY_SOPTIONS
@end deffn

@tab

Shifted Options

@item

@geindex KEY_SPREVIOUS (in module curses)
@anchor{library/curses curses KEY_SPREVIOUS}@anchor{35d9}
@deffn {Data} curses.KEY_SPREVIOUS
@end deffn

@tab

Shifted Prev

@item

@geindex KEY_SPRINT (in module curses)
@anchor{library/curses curses KEY_SPRINT}@anchor{35da}
@deffn {Data} curses.KEY_SPRINT
@end deffn

@tab

Shifted Print

@item

@geindex KEY_SREDO (in module curses)
@anchor{library/curses curses KEY_SREDO}@anchor{35db}
@deffn {Data} curses.KEY_SREDO
@end deffn

@tab

Shifted Redo

@item

@geindex KEY_SREPLACE (in module curses)
@anchor{library/curses curses KEY_SREPLACE}@anchor{35dc}
@deffn {Data} curses.KEY_SREPLACE
@end deffn

@tab

Shifted Replace

@item

@geindex KEY_SRIGHT (in module curses)
@anchor{library/curses curses KEY_SRIGHT}@anchor{35dd}
@deffn {Data} curses.KEY_SRIGHT
@end deffn

@tab

Shifted Right arrow

@item

@geindex KEY_SRSUME (in module curses)
@anchor{library/curses curses KEY_SRSUME}@anchor{35de}
@deffn {Data} curses.KEY_SRSUME
@end deffn

@tab

Shifted Resume

@item

@geindex KEY_SSAVE (in module curses)
@anchor{library/curses curses KEY_SSAVE}@anchor{35df}
@deffn {Data} curses.KEY_SSAVE
@end deffn

@tab

Shifted Save

@item

@geindex KEY_SSUSPEND (in module curses)
@anchor{library/curses curses KEY_SSUSPEND}@anchor{35e0}
@deffn {Data} curses.KEY_SSUSPEND
@end deffn

@tab

Shifted Suspend

@item

@geindex KEY_SUNDO (in module curses)
@anchor{library/curses curses KEY_SUNDO}@anchor{35e1}
@deffn {Data} curses.KEY_SUNDO
@end deffn

@tab

Shifted Undo

@item

@geindex KEY_SUSPEND (in module curses)
@anchor{library/curses curses KEY_SUSPEND}@anchor{35e2}
@deffn {Data} curses.KEY_SUSPEND
@end deffn

@tab

Suspend

@item

@geindex KEY_UNDO (in module curses)
@anchor{library/curses curses KEY_UNDO}@anchor{35e3}
@deffn {Data} curses.KEY_UNDO
@end deffn

@tab

Undo

@item

@geindex KEY_MOUSE (in module curses)
@anchor{library/curses curses KEY_MOUSE}@anchor{34f9}
@deffn {Data} curses.KEY_MOUSE
@end deffn

@tab

Mouse event has occurred

@item

@geindex KEY_RESIZE (in module curses)
@anchor{library/curses curses KEY_RESIZE}@anchor{35e4}
@deffn {Data} curses.KEY_RESIZE
@end deffn

@tab

Terminal resize event

@item

@geindex KEY_MAX (in module curses)
@anchor{library/curses curses KEY_MAX}@anchor{35e5}
@deffn {Data} curses.KEY_MAX
@end deffn

@tab

Maximum key value

@end multitable


On VT100s and their software emulations, such as X terminal emulators, there are
normally at least four function keys (@ref{3592,,KEY_F1}, @code{KEY_F2},
@code{KEY_F3}, @code{KEY_F4}) available, and the arrow keys mapped to
@ref{358c,,KEY_UP}, @ref{358b,,KEY_DOWN}, @ref{358d,,KEY_LEFT} and @ref{358e,,KEY_RIGHT} in
the obvious way.  If your machine has a PC keyboard, it is safe to expect arrow
keys and twelve function keys (older PC keyboards may have only ten function
keys); also, the following keypad mappings are standard:


@multitable {xxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxx} 
@headitem

Keycap

@tab

Constant

@item

@code{Insert}

@tab

KEY_IC

@item

@code{Delete}

@tab

KEY_DC

@item

@code{Home}

@tab

KEY_HOME

@item

@code{End}

@tab

KEY_END

@item

@code{Page Up}

@tab

KEY_PPAGE

@item

@code{Page Down}

@tab

KEY_NPAGE

@end multitable

@anchor{library/curses curses-acs-codes}@anchor{35e6}
The following table lists characters from the alternate character set. These are
inherited from the VT100 terminal, and will generally be  available on software
emulations such as X terminals.  When there is no graphic available, curses
falls back on a crude printable ASCII approximation.

@cartouche
@quotation Note 
These are available only after @ref{1953,,initscr()} has  been called.
@end quotation
@end cartouche


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

ACS code

@tab

Meaning

@item

@geindex ACS_BBSS (in module curses)
@anchor{library/curses curses ACS_BBSS}@anchor{35e7}
@deffn {Data} curses.ACS_BBSS
@end deffn

@tab

alternate name for upper-right corner

@item

@geindex ACS_BLOCK (in module curses)
@anchor{library/curses curses ACS_BLOCK}@anchor{35e8}
@deffn {Data} curses.ACS_BLOCK
@end deffn

@tab

solid square block

@item

@geindex ACS_BOARD (in module curses)
@anchor{library/curses curses ACS_BOARD}@anchor{35e9}
@deffn {Data} curses.ACS_BOARD
@end deffn

@tab

board of squares

@item

@geindex ACS_BSBS (in module curses)
@anchor{library/curses curses ACS_BSBS}@anchor{35ea}
@deffn {Data} curses.ACS_BSBS
@end deffn

@tab

alternate name for horizontal line

@item

@geindex ACS_BSSB (in module curses)
@anchor{library/curses curses ACS_BSSB}@anchor{35eb}
@deffn {Data} curses.ACS_BSSB
@end deffn

@tab

alternate name for upper-left corner

@item

@geindex ACS_BSSS (in module curses)
@anchor{library/curses curses ACS_BSSS}@anchor{35ec}
@deffn {Data} curses.ACS_BSSS
@end deffn

@tab

alternate name for top tee

@item

@geindex ACS_BTEE (in module curses)
@anchor{library/curses curses ACS_BTEE}@anchor{35ed}
@deffn {Data} curses.ACS_BTEE
@end deffn

@tab

bottom tee

@item

@geindex ACS_BULLET (in module curses)
@anchor{library/curses curses ACS_BULLET}@anchor{35ee}
@deffn {Data} curses.ACS_BULLET
@end deffn

@tab

bullet

@item

@geindex ACS_CKBOARD (in module curses)
@anchor{library/curses curses ACS_CKBOARD}@anchor{35ef}
@deffn {Data} curses.ACS_CKBOARD
@end deffn

@tab

checker board (stipple)

@item

@geindex ACS_DARROW (in module curses)
@anchor{library/curses curses ACS_DARROW}@anchor{35f0}
@deffn {Data} curses.ACS_DARROW
@end deffn

@tab

arrow pointing down

@item

@geindex ACS_DEGREE (in module curses)
@anchor{library/curses curses ACS_DEGREE}@anchor{35f1}
@deffn {Data} curses.ACS_DEGREE
@end deffn

@tab

degree symbol

@item

@geindex ACS_DIAMOND (in module curses)
@anchor{library/curses curses ACS_DIAMOND}@anchor{35f2}
@deffn {Data} curses.ACS_DIAMOND
@end deffn

@tab

diamond

@item

@geindex ACS_GEQUAL (in module curses)
@anchor{library/curses curses ACS_GEQUAL}@anchor{35f3}
@deffn {Data} curses.ACS_GEQUAL
@end deffn

@tab

greater-than-or-equal-to

@item

@geindex ACS_HLINE (in module curses)
@anchor{library/curses curses ACS_HLINE}@anchor{3538}
@deffn {Data} curses.ACS_HLINE
@end deffn

@tab

horizontal line

@item

@geindex ACS_LANTERN (in module curses)
@anchor{library/curses curses ACS_LANTERN}@anchor{35f4}
@deffn {Data} curses.ACS_LANTERN
@end deffn

@tab

lantern symbol

@item

@geindex ACS_LARROW (in module curses)
@anchor{library/curses curses ACS_LARROW}@anchor{35f5}
@deffn {Data} curses.ACS_LARROW
@end deffn

@tab

left arrow

@item

@geindex ACS_LEQUAL (in module curses)
@anchor{library/curses curses ACS_LEQUAL}@anchor{35f6}
@deffn {Data} curses.ACS_LEQUAL
@end deffn

@tab

less-than-or-equal-to

@item

@geindex ACS_LLCORNER (in module curses)
@anchor{library/curses curses ACS_LLCORNER}@anchor{353b}
@deffn {Data} curses.ACS_LLCORNER
@end deffn

@tab

lower-left corner

@item

@geindex ACS_LRCORNER (in module curses)
@anchor{library/curses curses ACS_LRCORNER}@anchor{353c}
@deffn {Data} curses.ACS_LRCORNER
@end deffn

@tab

lower-right corner

@item

@geindex ACS_LTEE (in module curses)
@anchor{library/curses curses ACS_LTEE}@anchor{35f7}
@deffn {Data} curses.ACS_LTEE
@end deffn

@tab

left tee

@item

@geindex ACS_NEQUAL (in module curses)
@anchor{library/curses curses ACS_NEQUAL}@anchor{35f8}
@deffn {Data} curses.ACS_NEQUAL
@end deffn

@tab

not-equal sign

@item

@geindex ACS_PI (in module curses)
@anchor{library/curses curses ACS_PI}@anchor{35f9}
@deffn {Data} curses.ACS_PI
@end deffn

@tab

letter pi

@item

@geindex ACS_PLMINUS (in module curses)
@anchor{library/curses curses ACS_PLMINUS}@anchor{35fa}
@deffn {Data} curses.ACS_PLMINUS
@end deffn

@tab

plus-or-minus sign

@item

@geindex ACS_PLUS (in module curses)
@anchor{library/curses curses ACS_PLUS}@anchor{35fb}
@deffn {Data} curses.ACS_PLUS
@end deffn

@tab

big plus sign

@item

@geindex ACS_RARROW (in module curses)
@anchor{library/curses curses ACS_RARROW}@anchor{35fc}
@deffn {Data} curses.ACS_RARROW
@end deffn

@tab

right arrow

@item

@geindex ACS_RTEE (in module curses)
@anchor{library/curses curses ACS_RTEE}@anchor{35fd}
@deffn {Data} curses.ACS_RTEE
@end deffn

@tab

right tee

@item

@geindex ACS_S1 (in module curses)
@anchor{library/curses curses ACS_S1}@anchor{35fe}
@deffn {Data} curses.ACS_S1
@end deffn

@tab

scan line 1

@item

@geindex ACS_S3 (in module curses)
@anchor{library/curses curses ACS_S3}@anchor{35ff}
@deffn {Data} curses.ACS_S3
@end deffn

@tab

scan line 3

@item

@geindex ACS_S7 (in module curses)
@anchor{library/curses curses ACS_S7}@anchor{3600}
@deffn {Data} curses.ACS_S7
@end deffn

@tab

scan line 7

@item

@geindex ACS_S9 (in module curses)
@anchor{library/curses curses ACS_S9}@anchor{3601}
@deffn {Data} curses.ACS_S9
@end deffn

@tab

scan line 9

@item

@geindex ACS_SBBS (in module curses)
@anchor{library/curses curses ACS_SBBS}@anchor{3602}
@deffn {Data} curses.ACS_SBBS
@end deffn

@tab

alternate name for lower-right corner

@item

@geindex ACS_SBSB (in module curses)
@anchor{library/curses curses ACS_SBSB}@anchor{3603}
@deffn {Data} curses.ACS_SBSB
@end deffn

@tab

alternate name for vertical line

@item

@geindex ACS_SBSS (in module curses)
@anchor{library/curses curses ACS_SBSS}@anchor{3604}
@deffn {Data} curses.ACS_SBSS
@end deffn

@tab

alternate name for right tee

@item

@geindex ACS_SSBB (in module curses)
@anchor{library/curses curses ACS_SSBB}@anchor{3605}
@deffn {Data} curses.ACS_SSBB
@end deffn

@tab

alternate name for lower-left corner

@item

@geindex ACS_SSBS (in module curses)
@anchor{library/curses curses ACS_SSBS}@anchor{3606}
@deffn {Data} curses.ACS_SSBS
@end deffn

@tab

alternate name for bottom tee

@item

@geindex ACS_SSSB (in module curses)
@anchor{library/curses curses ACS_SSSB}@anchor{3607}
@deffn {Data} curses.ACS_SSSB
@end deffn

@tab

alternate name for left tee

@item

@geindex ACS_SSSS (in module curses)
@anchor{library/curses curses ACS_SSSS}@anchor{3608}
@deffn {Data} curses.ACS_SSSS
@end deffn

@tab

alternate name for crossover or big plus

@item

@geindex ACS_STERLING (in module curses)
@anchor{library/curses curses ACS_STERLING}@anchor{3609}
@deffn {Data} curses.ACS_STERLING
@end deffn

@tab

pound sterling

@item

@geindex ACS_TTEE (in module curses)
@anchor{library/curses curses ACS_TTEE}@anchor{360a}
@deffn {Data} curses.ACS_TTEE
@end deffn

@tab

top tee

@item

@geindex ACS_UARROW (in module curses)
@anchor{library/curses curses ACS_UARROW}@anchor{360b}
@deffn {Data} curses.ACS_UARROW
@end deffn

@tab

up arrow

@item

@geindex ACS_ULCORNER (in module curses)
@anchor{library/curses curses ACS_ULCORNER}@anchor{3539}
@deffn {Data} curses.ACS_ULCORNER
@end deffn

@tab

upper-left corner

@item

@geindex ACS_URCORNER (in module curses)
@anchor{library/curses curses ACS_URCORNER}@anchor{353a}
@deffn {Data} curses.ACS_URCORNER
@end deffn

@tab

upper-right corner

@item

@geindex ACS_VLINE (in module curses)
@anchor{library/curses curses ACS_VLINE}@anchor{3537}
@deffn {Data} curses.ACS_VLINE
@end deffn

@tab

vertical line

@end multitable


The following table lists mouse button constants used by @ref{34f8,,getmouse()}:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Mouse button constant

@tab

Meaning

@item

@geindex BUTTONn_PRESSED (in module curses)
@anchor{library/curses curses BUTTONn_PRESSED}@anchor{34fa}
@deffn {Data} curses.BUTTONn_PRESSED
@end deffn

@tab

Mouse button `n' pressed

@item

@geindex BUTTONn_RELEASED (in module curses)
@anchor{library/curses curses BUTTONn_RELEASED}@anchor{34fb}
@deffn {Data} curses.BUTTONn_RELEASED
@end deffn

@tab

Mouse button `n' released

@item

@geindex BUTTONn_CLICKED (in module curses)
@anchor{library/curses curses BUTTONn_CLICKED}@anchor{34fc}
@deffn {Data} curses.BUTTONn_CLICKED
@end deffn

@tab

Mouse button `n' clicked

@item

@geindex BUTTONn_DOUBLE_CLICKED (in module curses)
@anchor{library/curses curses BUTTONn_DOUBLE_CLICKED}@anchor{34fd}
@deffn {Data} curses.BUTTONn_DOUBLE_CLICKED
@end deffn

@tab

Mouse button `n' double clicked

@item

@geindex BUTTONn_TRIPLE_CLICKED (in module curses)
@anchor{library/curses curses BUTTONn_TRIPLE_CLICKED}@anchor{34fe}
@deffn {Data} curses.BUTTONn_TRIPLE_CLICKED
@end deffn

@tab

Mouse button `n' triple clicked

@item

@geindex BUTTON_SHIFT (in module curses)
@anchor{library/curses curses BUTTON_SHIFT}@anchor{34ff}
@deffn {Data} curses.BUTTON_SHIFT
@end deffn

@tab

Shift was down during button state change

@item

@geindex BUTTON_CTRL (in module curses)
@anchor{library/curses curses BUTTON_CTRL}@anchor{3500}
@deffn {Data} curses.BUTTON_CTRL
@end deffn

@tab

Control was down during button state change

@item

@geindex BUTTON_ALT (in module curses)
@anchor{library/curses curses BUTTON_ALT}@anchor{3501}
@deffn {Data} curses.BUTTON_ALT
@end deffn

@tab

Alt was down during button state change

@end multitable



Changed in version 3.10: The @code{BUTTON5_*} constants are now exposed if they are provided by the
underlying curses library.


The following table lists the predefined colors:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Constant

@tab

Color

@item

@geindex COLOR_BLACK (in module curses)
@anchor{library/curses curses COLOR_BLACK}@anchor{360c}
@deffn {Data} curses.COLOR_BLACK
@end deffn

@tab

Black

@item

@geindex COLOR_BLUE (in module curses)
@anchor{library/curses curses COLOR_BLUE}@anchor{360d}
@deffn {Data} curses.COLOR_BLUE
@end deffn

@tab

Blue

@item

@geindex COLOR_CYAN (in module curses)
@anchor{library/curses curses COLOR_CYAN}@anchor{360e}
@deffn {Data} curses.COLOR_CYAN
@end deffn

@tab

Cyan (light greenish blue)

@item

@geindex COLOR_GREEN (in module curses)
@anchor{library/curses curses COLOR_GREEN}@anchor{360f}
@deffn {Data} curses.COLOR_GREEN
@end deffn

@tab

Green

@item

@geindex COLOR_MAGENTA (in module curses)
@anchor{library/curses curses COLOR_MAGENTA}@anchor{3610}
@deffn {Data} curses.COLOR_MAGENTA
@end deffn

@tab

Magenta (purplish red)

@item

@geindex COLOR_RED (in module curses)
@anchor{library/curses curses COLOR_RED}@anchor{3611}
@deffn {Data} curses.COLOR_RED
@end deffn

@tab

Red

@item

@geindex COLOR_WHITE (in module curses)
@anchor{library/curses curses COLOR_WHITE}@anchor{3612}
@deffn {Data} curses.COLOR_WHITE
@end deffn

@tab

White

@item

@geindex COLOR_YELLOW (in module curses)
@anchor{library/curses curses COLOR_YELLOW}@anchor{3613}
@deffn {Data} curses.COLOR_YELLOW
@end deffn

@tab

Yellow

@end multitable


@node curses textpad — Text input widget for curses programs,curses ascii — Utilities for ASCII characters,curses — Terminal handling for character-cell displays,Command-line interface libraries
@anchor{library/curses curses-textpad-text-input-widget-for-curses-programs}@anchor{3614}@anchor{library/curses module-curses textpad}@anchor{32}
@subsection @code{curses.textpad} — Text input widget for curses programs


@geindex module; curses.textpad

The @code{curses.textpad} module provides a @ref{3615,,Textbox} class that handles
elementary text editing in a curses window, supporting a set of keybindings
resembling those of Emacs (thus, also of Netscape Navigator, BBedit 6.x,
FrameMaker, and many other programs).  The module also provides a
rectangle-drawing function useful for framing text boxes or for other purposes.

The module @code{curses.textpad} defines the following function:

@geindex rectangle() (in module curses.textpad)
@anchor{library/curses curses textpad rectangle}@anchor{3616}
@deffn {Function} curses.textpad.rectangle (win, uly, ulx, lry, lrx)

Draw a rectangle.  The first argument must be a window object; the remaining
arguments are coordinates relative to that window.  The second and third
arguments are the y and x coordinates of the upper-left corner of the
rectangle to be drawn; the fourth and fifth arguments are the y and x
coordinates of the lower-right corner. The rectangle will be drawn using
VT100/IBM PC forms characters on terminals that make this possible (including
xterm and most other software terminal emulators).  Otherwise it will be drawn
with ASCII  dashes, vertical bars, and plus signs.
@end deffn

@menu
* Textbox objects:: 

@end menu

@node Textbox objects,,,curses textpad — Text input widget for curses programs
@anchor{library/curses curses-textpad-objects}@anchor{3617}@anchor{library/curses textbox-objects}@anchor{3618}
@subsubsection Textbox objects


You can instantiate a @ref{3615,,Textbox} object as follows:

@geindex Textbox (class in curses.textpad)
@anchor{library/curses curses textpad Textbox}@anchor{3615}
@deffn {Class} curses.textpad.Textbox (win, insert_mode=False)

Return a textbox widget object.  The `win' argument should be a curses
@ref{19cd,,window} object in which the textbox is to
be contained.  If `insert_mode' is true, the textbox inserts typed
characters, shifting existing text to the right, rather than overwriting it.
The edit cursor of the textbox is initially located at the
upper-left corner of the containing window, with coordinates @code{(0, 0)}.
The instance’s @ref{3619,,stripspaces} flag is initially on.

@code{Textbox} objects have the following methods:

@geindex edit() (curses.textpad.Textbox method)
@anchor{library/curses curses textpad Textbox edit}@anchor{361a}
@deffn {Method} edit (validate=None)

This is the entry point you will normally use.  It accepts editing
keystrokes until one of the termination keystrokes is entered.  If
`validate' is supplied, it must be a function.  It will be called for
each keystroke entered with the keystroke as a parameter; command dispatch
is done on the result.  If it returns a false value, the keystroke is
ignored.  This method returns the window contents as a
string; whether blanks in the window are included is affected by the
@ref{3619,,stripspaces} attribute.
@end deffn

@geindex do_command() (curses.textpad.Textbox method)
@anchor{library/curses curses textpad Textbox do_command}@anchor{361b}
@deffn {Method} do_command (ch)

Process a single command keystroke.  Returns @code{1} to continue editing,
or @code{0} if a termination keystroke was processed.  Here are the supported
special keystrokes:


@multitable {xxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Keystroke

@tab

Action

@item

@code{Control}-@code{A}

@tab

Go to left edge of window.

@item

@code{Control}-@code{B}

@tab

Cursor left, wrapping to previous line if
appropriate.

@item

@code{Control}-@code{D}

@tab

Delete character under cursor.

@item

@code{Control}-@code{E}

@tab

Go to right edge (stripspaces off) or end
of line (stripspaces on).

@item

@code{Control}-@code{F}

@tab

Cursor right, wrapping to next line when
appropriate.

@item

@code{Control}-@code{G}

@tab

Terminate, returning the window contents.

@item

@code{Control}-@code{H}

@tab

Delete character backward.

@item

@code{Control}-@code{J}

@tab

Terminate if the window is 1 line,
otherwise move to the start of the next
line.

@item

@code{Control}-@code{K}

@tab

If line is blank, delete it, otherwise
clear to end of line.

@item

@code{Control}-@code{L}

@tab

Refresh screen.

@item

@code{Control}-@code{N}

@tab

Cursor down; move down one line.

@item

@code{Control}-@code{O}

@tab

Insert a blank line at cursor location.

@item

@code{Control}-@code{P}

@tab

Cursor up; move up one line.

@end multitable


Move operations do nothing if the cursor is at an edge where the movement
is not possible.  The following synonyms are supported where possible:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxx} 
@headitem

Constant

@tab

Keystroke

@item

@ref{358d,,KEY_LEFT}

@tab

@code{Control}-@code{B}

@item

@ref{358e,,KEY_RIGHT}

@tab

@code{Control}-@code{F}

@item

@ref{358c,,KEY_UP}

@tab

@code{Control}-@code{P}

@item

@ref{358b,,KEY_DOWN}

@tab

@code{Control}-@code{N}

@item

@ref{3590,,KEY_BACKSPACE}

@tab

@code{Control}-@code{h}

@end multitable


All other keystrokes are treated as a command to insert the given
character and move right (with line wrapping).
@end deffn

@geindex gather() (curses.textpad.Textbox method)
@anchor{library/curses curses textpad Textbox gather}@anchor{361c}
@deffn {Method} gather ()

Return the window contents as a string; whether blanks in the
window are included is affected by the @ref{3619,,stripspaces} member.
@end deffn

@geindex stripspaces (curses.textpad.Textbox attribute)
@anchor{library/curses curses textpad Textbox stripspaces}@anchor{3619}
@deffn {Attribute} stripspaces

This attribute is a flag which controls the interpretation of blanks in
the window.  When it is on, trailing blanks on each line are ignored; any
cursor motion that would land the cursor on a trailing blank goes to the
end of that line instead, and trailing blanks are stripped when the window
contents are gathered.
@end deffn
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node curses ascii — Utilities for ASCII characters,curses panel — A panel stack extension for curses,curses textpad — Text input widget for curses programs,Command-line interface libraries
@anchor{library/curses ascii doc}@anchor{361d}@anchor{library/curses ascii curses-ascii-utilities-for-ascii-characters}@anchor{361e}@anchor{library/curses ascii module-curses ascii}@anchor{30}@anchor{library/curses ascii translation-repo}@anchor{361f}
@subsection @code{curses.ascii} — Utilities for ASCII characters


@geindex module; curses.ascii

`Source code:' Lib/curses/ascii.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/curses/ascii.py}


__________________________________________________________________


The @code{curses.ascii} module supplies name constants for ASCII characters and
functions to test membership in various ASCII character classes.  The constants
supplied are names for control characters as follows:


@multitable {xxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Name

@tab

Meaning

@item

@geindex NUL (in module curses.ascii)
@anchor{library/curses ascii curses ascii NUL}@anchor{3620}
@deffn {Data} curses.ascii.NUL
@end deffn

@tab

@item

@geindex SOH (in module curses.ascii)
@anchor{library/curses ascii curses ascii SOH}@anchor{3621}
@deffn {Data} curses.ascii.SOH
@end deffn

@tab

Start of heading, console interrupt

@item

@geindex STX (in module curses.ascii)
@anchor{library/curses ascii curses ascii STX}@anchor{3622}
@deffn {Data} curses.ascii.STX
@end deffn

@tab

Start of text

@item

@geindex ETX (in module curses.ascii)
@anchor{library/curses ascii curses ascii ETX}@anchor{3623}
@deffn {Data} curses.ascii.ETX
@end deffn

@tab

End of text

@item

@geindex EOT (in module curses.ascii)
@anchor{library/curses ascii curses ascii EOT}@anchor{3624}
@deffn {Data} curses.ascii.EOT
@end deffn

@tab

End of transmission

@item

@geindex ENQ (in module curses.ascii)
@anchor{library/curses ascii curses ascii ENQ}@anchor{3625}
@deffn {Data} curses.ascii.ENQ
@end deffn

@tab

Enquiry, goes with @ref{3626,,ACK} flow control

@item

@geindex ACK (in module curses.ascii)
@anchor{library/curses ascii curses ascii ACK}@anchor{3626}
@deffn {Data} curses.ascii.ACK
@end deffn

@tab

Acknowledgement

@item

@geindex BEL (in module curses.ascii)
@anchor{library/curses ascii curses ascii BEL}@anchor{3627}
@deffn {Data} curses.ascii.BEL
@end deffn

@tab

Bell

@item

@geindex BS (in module curses.ascii)
@anchor{library/curses ascii curses ascii BS}@anchor{3628}
@deffn {Data} curses.ascii.BS
@end deffn

@tab

Backspace

@item

@geindex TAB (in module curses.ascii)
@anchor{library/curses ascii curses ascii TAB}@anchor{3629}
@deffn {Data} curses.ascii.TAB
@end deffn

@tab

Tab

@item

@geindex HT (in module curses.ascii)
@anchor{library/curses ascii curses ascii HT}@anchor{362a}
@deffn {Data} curses.ascii.HT
@end deffn

@tab

Alias for @ref{3629,,TAB}: “Horizontal tab”

@item

@geindex LF (in module curses.ascii)
@anchor{library/curses ascii curses ascii LF}@anchor{362b}
@deffn {Data} curses.ascii.LF
@end deffn

@tab

Line feed

@item

@geindex NL (in module curses.ascii)
@anchor{library/curses ascii curses ascii NL}@anchor{362c}
@deffn {Data} curses.ascii.NL
@end deffn

@tab

Alias for @ref{362b,,LF}: “New line”

@item

@geindex VT (in module curses.ascii)
@anchor{library/curses ascii curses ascii VT}@anchor{362d}
@deffn {Data} curses.ascii.VT
@end deffn

@tab

Vertical tab

@item

@geindex FF (in module curses.ascii)
@anchor{library/curses ascii curses ascii FF}@anchor{362e}
@deffn {Data} curses.ascii.FF
@end deffn

@tab

Form feed

@item

@geindex CR (in module curses.ascii)
@anchor{library/curses ascii curses ascii CR}@anchor{362f}
@deffn {Data} curses.ascii.CR
@end deffn

@tab

Carriage return

@item

@geindex SO (in module curses.ascii)
@anchor{library/curses ascii curses ascii SO}@anchor{3630}
@deffn {Data} curses.ascii.SO
@end deffn

@tab

Shift-out, begin alternate character set

@item

@geindex SI (in module curses.ascii)
@anchor{library/curses ascii curses ascii SI}@anchor{3631}
@deffn {Data} curses.ascii.SI
@end deffn

@tab

Shift-in, resume default character set

@item

@geindex DLE (in module curses.ascii)
@anchor{library/curses ascii curses ascii DLE}@anchor{3632}
@deffn {Data} curses.ascii.DLE
@end deffn

@tab

Data-link escape

@item

@geindex DC1 (in module curses.ascii)
@anchor{library/curses ascii curses ascii DC1}@anchor{3633}
@deffn {Data} curses.ascii.DC1
@end deffn

@tab

XON, for flow control

@item

@geindex DC2 (in module curses.ascii)
@anchor{library/curses ascii curses ascii DC2}@anchor{3634}
@deffn {Data} curses.ascii.DC2
@end deffn

@tab

Device control 2, block-mode flow control

@item

@geindex DC3 (in module curses.ascii)
@anchor{library/curses ascii curses ascii DC3}@anchor{3635}
@deffn {Data} curses.ascii.DC3
@end deffn

@tab

XOFF, for flow control

@item

@geindex DC4 (in module curses.ascii)
@anchor{library/curses ascii curses ascii DC4}@anchor{3636}
@deffn {Data} curses.ascii.DC4
@end deffn

@tab

Device control 4

@item

@geindex NAK (in module curses.ascii)
@anchor{library/curses ascii curses ascii NAK}@anchor{3637}
@deffn {Data} curses.ascii.NAK
@end deffn

@tab

Negative acknowledgement

@item

@geindex SYN (in module curses.ascii)
@anchor{library/curses ascii curses ascii SYN}@anchor{3638}
@deffn {Data} curses.ascii.SYN
@end deffn

@tab

Synchronous idle

@item

@geindex ETB (in module curses.ascii)
@anchor{library/curses ascii curses ascii ETB}@anchor{3639}
@deffn {Data} curses.ascii.ETB
@end deffn

@tab

End transmission block

@item

@geindex CAN (in module curses.ascii)
@anchor{library/curses ascii curses ascii CAN}@anchor{363a}
@deffn {Data} curses.ascii.CAN
@end deffn

@tab

Cancel

@item

@geindex EM (in module curses.ascii)
@anchor{library/curses ascii curses ascii EM}@anchor{363b}
@deffn {Data} curses.ascii.EM
@end deffn

@tab

End of medium

@item

@geindex SUB (in module curses.ascii)
@anchor{library/curses ascii curses ascii SUB}@anchor{363c}
@deffn {Data} curses.ascii.SUB
@end deffn

@tab

Substitute

@item

@geindex ESC (in module curses.ascii)
@anchor{library/curses ascii curses ascii ESC}@anchor{363d}
@deffn {Data} curses.ascii.ESC
@end deffn

@tab

Escape

@item

@geindex FS (in module curses.ascii)
@anchor{library/curses ascii curses ascii FS}@anchor{363e}
@deffn {Data} curses.ascii.FS
@end deffn

@tab

File separator

@item

@geindex GS (in module curses.ascii)
@anchor{library/curses ascii curses ascii GS}@anchor{363f}
@deffn {Data} curses.ascii.GS
@end deffn

@tab

Group separator

@item

@geindex RS (in module curses.ascii)
@anchor{library/curses ascii curses ascii RS}@anchor{3640}
@deffn {Data} curses.ascii.RS
@end deffn

@tab

Record separator, block-mode terminator

@item

@geindex US (in module curses.ascii)
@anchor{library/curses ascii curses ascii US}@anchor{3641}
@deffn {Data} curses.ascii.US
@end deffn

@tab

Unit separator

@item

@geindex SP (in module curses.ascii)
@anchor{library/curses ascii curses ascii SP}@anchor{3642}
@deffn {Data} curses.ascii.SP
@end deffn

@tab

Space

@item

@geindex DEL (in module curses.ascii)
@anchor{library/curses ascii curses ascii DEL}@anchor{3643}
@deffn {Data} curses.ascii.DEL
@end deffn

@tab

Delete

@end multitable


Note that many of these have little practical significance in modern usage.  The
mnemonics derive from teleprinter conventions that predate digital computers.

The module supplies the following functions, patterned on those in the standard
C library:

@geindex isalnum() (in module curses.ascii)
@anchor{library/curses ascii curses ascii isalnum}@anchor{3644}
@deffn {Function} curses.ascii.isalnum (c)

Checks for an ASCII alphanumeric character; it is equivalent to @code{isalpha(c) or
isdigit(c)}.
@end deffn

@geindex isalpha() (in module curses.ascii)
@anchor{library/curses ascii curses ascii isalpha}@anchor{3645}
@deffn {Function} curses.ascii.isalpha (c)

Checks for an ASCII alphabetic character; it is equivalent to @code{isupper(c) or
islower(c)}.
@end deffn

@geindex isascii() (in module curses.ascii)
@anchor{library/curses ascii curses ascii isascii}@anchor{3646}
@deffn {Function} curses.ascii.isascii (c)

Checks for a character value that fits in the 7-bit ASCII set.
@end deffn

@geindex isblank() (in module curses.ascii)
@anchor{library/curses ascii curses ascii isblank}@anchor{3647}
@deffn {Function} curses.ascii.isblank (c)

Checks for an ASCII blank character; space or horizontal tab.
@end deffn

@geindex iscntrl() (in module curses.ascii)
@anchor{library/curses ascii curses ascii iscntrl}@anchor{3648}
@deffn {Function} curses.ascii.iscntrl (c)

Checks for an ASCII control character (in the range 0x00 to 0x1f or 0x7f).
@end deffn

@geindex isdigit() (in module curses.ascii)
@anchor{library/curses ascii curses ascii isdigit}@anchor{3649}
@deffn {Function} curses.ascii.isdigit (c)

Checks for an ASCII decimal digit, @code{'0'} through @code{'9'}.  This is equivalent
to @code{c in string.digits}.
@end deffn

@geindex isgraph() (in module curses.ascii)
@anchor{library/curses ascii curses ascii isgraph}@anchor{364a}
@deffn {Function} curses.ascii.isgraph (c)

Checks for any ASCII printable character except space.
@end deffn

@geindex islower() (in module curses.ascii)
@anchor{library/curses ascii curses ascii islower}@anchor{364b}
@deffn {Function} curses.ascii.islower (c)

Checks for an ASCII lower-case character.
@end deffn

@geindex isprint() (in module curses.ascii)
@anchor{library/curses ascii curses ascii isprint}@anchor{364c}
@deffn {Function} curses.ascii.isprint (c)

Checks for any ASCII printable character including space.
@end deffn

@geindex ispunct() (in module curses.ascii)
@anchor{library/curses ascii curses ascii ispunct}@anchor{364d}
@deffn {Function} curses.ascii.ispunct (c)

Checks for any ASCII printable character which is not a space or an alphanumeric
character.
@end deffn

@geindex isspace() (in module curses.ascii)
@anchor{library/curses ascii curses ascii isspace}@anchor{364e}
@deffn {Function} curses.ascii.isspace (c)

Checks for ASCII white-space characters; space, line feed, carriage return, form
feed, horizontal tab, vertical tab.
@end deffn

@geindex isupper() (in module curses.ascii)
@anchor{library/curses ascii curses ascii isupper}@anchor{364f}
@deffn {Function} curses.ascii.isupper (c)

Checks for an ASCII uppercase letter.
@end deffn

@geindex isxdigit() (in module curses.ascii)
@anchor{library/curses ascii curses ascii isxdigit}@anchor{3650}
@deffn {Function} curses.ascii.isxdigit (c)

Checks for an ASCII hexadecimal digit.  This is equivalent to @code{c in
string.hexdigits}.
@end deffn

@geindex isctrl() (in module curses.ascii)
@anchor{library/curses ascii curses ascii isctrl}@anchor{3651}
@deffn {Function} curses.ascii.isctrl (c)

Checks for an ASCII control character (ordinal values 0 to 31).  Unlike
@ref{3648,,iscntrl()}, this does not include the delete character (0x7f).
@end deffn

@geindex ismeta() (in module curses.ascii)
@anchor{library/curses ascii curses ascii ismeta}@anchor{3652}
@deffn {Function} curses.ascii.ismeta (c)

Checks for a non-ASCII character (ordinal values 0x80 and above).
@end deffn

These functions accept either integers or single-character strings; when the argument is a
string, it is first converted using the built-in function @ref{237f,,ord()}.

Note that all these functions check ordinal bit values derived from the
character of the string you pass in; they do not actually know anything about
the host machine’s character encoding.

The following two functions take either a single-character string or integer
byte value; they return a value of the same type.

@geindex ascii() (in module curses.ascii)
@anchor{library/curses ascii curses ascii ascii}@anchor{3653}
@deffn {Function} curses.ascii.ascii (c)

Return the ASCII value corresponding to the low 7 bits of `c'.
@end deffn

@geindex ctrl() (in module curses.ascii)
@anchor{library/curses ascii curses ascii ctrl}@anchor{3654}
@deffn {Function} curses.ascii.ctrl (c)

Return the control character corresponding to the given character (the character
bit value is bitwise-anded with 0x1f).
@end deffn

@geindex alt() (in module curses.ascii)
@anchor{library/curses ascii curses ascii alt}@anchor{3655}
@deffn {Function} curses.ascii.alt (c)

Return the 8-bit character corresponding to the given ASCII character (the
character bit value is bitwise-ored with 0x80).
@end deffn

The following function takes either a single-character string or integer value;
it returns a string.

@geindex ^ (caret); in curses module
@geindex ! (exclamation); in curses module

@geindex unctrl() (in module curses.ascii)
@anchor{library/curses ascii curses ascii unctrl}@anchor{3656}
@deffn {Function} curses.ascii.unctrl (c)

Return a string representation of the ASCII character `c'.  If `c' is printable,
this string is the character itself.  If the character is a control character
(0x00–0x1f) the string consists of a caret (@code{'^'}) followed by the
corresponding uppercase letter. If the character is an ASCII delete (0x7f) the
string is @code{'^?'}.  If the character has its meta bit (0x80) set, the meta bit
is stripped, the preceding rules applied, and @code{'!'} prepended to the result.
@end deffn

@geindex controlnames (in module curses.ascii)
@anchor{library/curses ascii curses ascii controlnames}@anchor{3657}
@deffn {Data} curses.ascii.controlnames

A 33-element string array that contains the ASCII mnemonics for the thirty-two
ASCII control characters from 0 (NUL) to 0x1f (US), in order, plus the mnemonic
@code{SP} for the space character.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node curses panel — A panel stack extension for curses,cmd — Support for line-oriented command interpreters,curses ascii — Utilities for ASCII characters,Command-line interface libraries
@anchor{library/curses panel doc}@anchor{3658}@anchor{library/curses panel curses-panel-a-panel-stack-extension-for-curses}@anchor{3659}@anchor{library/curses panel module-curses panel}@anchor{31}@anchor{library/curses panel translation-repo}@anchor{365a}
@subsection @code{curses.panel} — A panel stack extension for curses


@geindex module; curses.panel


__________________________________________________________________


Panels are windows with the added feature of depth, so they can be stacked on
top of each other, and only the visible portions of each window will be
displayed.  Panels can be added, moved up or down in the stack, and removed.

@menu
* Functions: Functions<7>. 
* Panel objects:: 

@end menu

@node Functions<7>,Panel objects,,curses panel — A panel stack extension for curses
@anchor{library/curses panel cursespanel-functions}@anchor{365b}@anchor{library/curses panel functions}@anchor{365c}
@subsubsection Functions


The module @code{curses.panel} defines the following functions:

@geindex bottom_panel() (in module curses.panel)
@anchor{library/curses panel curses panel bottom_panel}@anchor{365d}
@deffn {Function} curses.panel.bottom_panel ()

Returns the bottom panel in the panel stack.
@end deffn

@geindex new_panel() (in module curses.panel)
@anchor{library/curses panel curses panel new_panel}@anchor{365e}
@deffn {Function} curses.panel.new_panel (win)

Returns a panel object, associating it with the given window `win' and
placing the new panel on top of the panel stack.  Be aware
that you need to keep the returned panel object referenced explicitly.  If you
don’t, the panel object is garbage collected and removed from the panel stack.
@end deffn

@geindex top_panel() (in module curses.panel)
@anchor{library/curses panel curses panel top_panel}@anchor{365f}
@deffn {Function} curses.panel.top_panel ()

Returns the top panel in the panel stack.
@end deffn

@geindex update_panels() (in module curses.panel)
@anchor{library/curses panel curses panel update_panels}@anchor{3660}
@deffn {Function} curses.panel.update_panels ()

Updates the virtual screen after changes in the panel stack. This does not call
@ref{34ee,,curses.doupdate()}, so you’ll have to do this yourself.
@end deffn

@node Panel objects,,Functions<7>,curses panel — A panel stack extension for curses
@anchor{library/curses panel curses-panel-objects}@anchor{3661}@anchor{library/curses panel panel-objects}@anchor{3662}
@subsubsection Panel objects


Panel objects, as returned by @ref{365e,,new_panel()} above, are windows with a
stacking order. There’s always a window associated with a panel which determines
the content, while the panel methods are responsible for the window’s depth in
the panel stack.

Panel objects have the following methods:

@geindex above() (curses.panel.Panel method)
@anchor{library/curses panel curses panel Panel above}@anchor{3663}
@deffn {Method} Panel.above ()

Returns the panel above the current panel.
@end deffn

@geindex below() (curses.panel.Panel method)
@anchor{library/curses panel curses panel Panel below}@anchor{3664}
@deffn {Method} Panel.below ()

Returns the panel below the current panel.
@end deffn

@geindex bottom() (curses.panel.Panel method)
@anchor{library/curses panel curses panel Panel bottom}@anchor{3665}
@deffn {Method} Panel.bottom ()

Push the panel to the bottom of the stack.
@end deffn

@geindex hidden() (curses.panel.Panel method)
@anchor{library/curses panel curses panel Panel hidden}@anchor{3666}
@deffn {Method} Panel.hidden ()

Returns @code{True} if the panel is hidden (not visible), @code{False} otherwise.
@end deffn

@geindex hide() (curses.panel.Panel method)
@anchor{library/curses panel curses panel Panel hide}@anchor{3667}
@deffn {Method} Panel.hide ()

Hide the panel. This does not delete the object, it just makes the window on
screen invisible.
@end deffn

@geindex move() (curses.panel.Panel method)
@anchor{library/curses panel curses panel Panel move}@anchor{3668}
@deffn {Method} Panel.move (y, x)

Move the panel to the screen coordinates @code{(y, x)}.
@end deffn

@geindex replace() (curses.panel.Panel method)
@anchor{library/curses panel curses panel Panel replace}@anchor{3669}
@deffn {Method} Panel.replace (win)

Change the window associated with the panel to the window `win'.
@end deffn

@geindex set_userptr() (curses.panel.Panel method)
@anchor{library/curses panel curses panel Panel set_userptr}@anchor{366a}
@deffn {Method} Panel.set_userptr (obj)

Set the panel’s user pointer to `obj'. This is used to associate an arbitrary
piece of data with the panel, and can be any Python object.
@end deffn

@geindex show() (curses.panel.Panel method)
@anchor{library/curses panel curses panel Panel show}@anchor{366b}
@deffn {Method} Panel.show ()

Display the panel (which might have been hidden), placing it on top of
the panel stack.
@end deffn

@geindex top() (curses.panel.Panel method)
@anchor{library/curses panel curses panel Panel top}@anchor{366c}
@deffn {Method} Panel.top ()

Push panel to the top of the stack.
@end deffn

@geindex userptr() (curses.panel.Panel method)
@anchor{library/curses panel curses panel Panel userptr}@anchor{366d}
@deffn {Method} Panel.userptr ()

Returns the user pointer for the panel.  This might be any Python object.
@end deffn

@geindex window() (curses.panel.Panel method)
@anchor{library/curses panel curses panel Panel window}@anchor{366e}
@deffn {Method} Panel.window ()

Returns the window object associated with the panel.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node cmd — Support for line-oriented command interpreters,,curses panel — A panel stack extension for curses,Command-line interface libraries
@anchor{library/cmd doc}@anchor{366f}@anchor{library/cmd cmd-support-for-line-oriented-command-interpreters}@anchor{3670}@anchor{library/cmd module-cmd}@anchor{1a}@anchor{library/cmd translation-repo}@anchor{3671}
@subsection @code{cmd} — Support for line-oriented command interpreters


@geindex module; cmd

`Source code:' Lib/cmd.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/cmd.py}


__________________________________________________________________


The @ref{1897,,Cmd} class provides a simple framework for writing line-oriented
command interpreters.  These are often useful for test harnesses, administrative
tools, and prototypes that will later be wrapped in a more sophisticated
interface.

@geindex Cmd (class in cmd)
@anchor{library/cmd cmd Cmd}@anchor{1897}
@deffn {Class} cmd.Cmd (completekey='tab', stdin=None, stdout=None)

A @code{Cmd} instance or subclass instance is a line-oriented interpreter
framework.  There is no good reason to instantiate @code{Cmd} itself; rather,
it’s useful as a superclass of an interpreter class you define yourself in order
to inherit @code{Cmd}’s methods and encapsulate action methods.

The optional argument `completekey' is the @ref{bf,,readline} name of a completion
key; it defaults to @code{Tab}. If `completekey' is not @ref{887,,None} and
@code{readline} is available, command completion is done automatically.

The default, @code{'tab'}, is treated specially, so that it refers to the
@code{Tab} key on every @ref{1a6e,,readline.backend}.
Specifically, if @code{readline.backend} is @code{editline},
@code{Cmd} will use @code{'^I'} instead of @code{'tab'}.
Note that other values are not treated this way, and might only work
with a specific backend.

The optional arguments `stdin' and `stdout' specify the  input and output file
objects that the Cmd instance or subclass  instance will use for input and
output. If not specified, they will default to @ref{760,,sys.stdin} and
@ref{cd3,,sys.stdout}.

If you want a given `stdin' to be used, make sure to set the instance’s
@ref{3672,,use_rawinput} attribute to @code{False}, otherwise `stdin' will be
ignored.


Changed in version 3.13: @code{completekey='tab'} is replaced by @code{'^I'} for @code{editline}.

@end deffn

@menu
* Cmd Objects:: 
* Cmd Example:: 

@end menu

@node Cmd Objects,Cmd Example,,cmd — Support for line-oriented command interpreters
@anchor{library/cmd cmd-objects}@anchor{3673}@anchor{library/cmd id1}@anchor{3674}
@subsubsection Cmd Objects


A @ref{1897,,Cmd} instance has the following methods:

@geindex cmdloop() (cmd.Cmd method)
@anchor{library/cmd cmd Cmd cmdloop}@anchor{3675}
@deffn {Method} Cmd.cmdloop (intro=None)

Repeatedly issue a prompt, accept input, parse an initial prefix off the
received input, and dispatch to action methods, passing them the remainder of
the line as argument.

The optional argument is a banner or intro string to be issued before the first
prompt (this overrides the @ref{3676,,intro} class attribute).

If the @ref{bf,,readline} module is loaded, input will automatically inherit
@code{bash}-like history-list editing (e.g. @code{Control}-@code{P} scrolls back
to the last command, @code{Control}-@code{N} forward to the next one, @code{Control}-@code{F}
moves the cursor to the right non-destructively, @code{Control}-@code{B} moves the
cursor to the left non-destructively, etc.).

An end-of-file on input is passed back as the string @code{'EOF'}.

@geindex ? (question mark); in a command interpreter
@geindex ! (exclamation); in a command interpreter

An interpreter instance will recognize a command name @code{foo} if and only if it
has a method @code{do_foo()}.  As a special case, a line beginning with the
character @code{'?'} is dispatched to the method @ref{1a72,,do_help()}.  As another
special case, a line beginning with the character @code{'!'} is dispatched to the
method @code{do_shell()} (if such a method is defined).

This method will return when the @ref{3677,,postcmd()} method returns a true value.
The `stop' argument to @code{postcmd()} is the return value from the command’s
corresponding @code{do_*()} method.

If completion is enabled, completing commands will be done automatically, and
completing of commands args is done by calling @code{complete_foo()} with
arguments `text', `line', `begidx', and `endidx'.  `text' is the string prefix
we are attempting to match: all returned matches must begin with it. `line' is
the current input line with leading whitespace removed, `begidx' and `endidx'
are the beginning and ending indexes of the prefix text, which could be used to
provide different completion depending upon which position the argument is in.
@end deffn

@geindex do_help() (cmd.Cmd method)
@anchor{library/cmd cmd Cmd do_help}@anchor{1a72}
@deffn {Method} Cmd.do_help (arg)

All subclasses of @ref{1897,,Cmd} inherit a predefined @code{do_help()}.  This
method, called with an argument @code{'bar'}, invokes the corresponding method
@code{help_bar()}, and if that is not present, prints the docstring of
@code{do_bar()}, if available.  With no argument, @code{do_help()} lists all
available help topics (that is, all commands with corresponding
@code{help_*()} methods or commands that have docstrings), and also lists any
undocumented commands.
@end deffn

@geindex onecmd() (cmd.Cmd method)
@anchor{library/cmd cmd Cmd onecmd}@anchor{3678}
@deffn {Method} Cmd.onecmd (str)

Interpret the argument as though it had been typed in response to the prompt.
This may be overridden, but should not normally need to be; see the
@ref{3679,,precmd()} and @ref{3677,,postcmd()} methods for useful execution hooks.  The
return value is a flag indicating whether interpretation of commands by the
interpreter should stop.  If there is a @code{do_*()} method for the command
`str', the return value of that method is returned, otherwise the return value
from the @ref{367a,,default()} method is returned.
@end deffn

@geindex emptyline() (cmd.Cmd method)
@anchor{library/cmd cmd Cmd emptyline}@anchor{367b}
@deffn {Method} Cmd.emptyline ()

Method called when an empty line is entered in response to the prompt. If this
method is not overridden, it repeats the last nonempty command entered.
@end deffn

@geindex default() (cmd.Cmd method)
@anchor{library/cmd cmd Cmd default}@anchor{367a}
@deffn {Method} Cmd.default (line)

Method called on an input line when the command prefix is not recognized. If
this method is not overridden, it prints an error message and returns.
@end deffn

@geindex completedefault() (cmd.Cmd method)
@anchor{library/cmd cmd Cmd completedefault}@anchor{367c}
@deffn {Method} Cmd.completedefault (text, line, begidx, endidx)

Method called to complete an input line when no command-specific
@code{complete_*()} method is available.  By default, it returns an empty list.
@end deffn

@geindex columnize() (cmd.Cmd method)
@anchor{library/cmd cmd Cmd columnize}@anchor{1c4c}
@deffn {Method} Cmd.columnize (list, displaywidth=80)

Method called to display a list of strings as a compact set of columns.
Each column is only as wide as necessary.
Columns are separated by two spaces for readability.
@end deffn

@geindex precmd() (cmd.Cmd method)
@anchor{library/cmd cmd Cmd precmd}@anchor{3679}
@deffn {Method} Cmd.precmd (line)

Hook method executed just before the command line `line' is interpreted, but
after the input prompt is generated and issued.  This method is a stub in
@ref{1897,,Cmd}; it exists to be overridden by subclasses.  The return value is
used as the command which will be executed by the @ref{3678,,onecmd()} method; the
@code{precmd()} implementation may re-write the command or simply return `line'
unchanged.
@end deffn

@geindex postcmd() (cmd.Cmd method)
@anchor{library/cmd cmd Cmd postcmd}@anchor{3677}
@deffn {Method} Cmd.postcmd (stop, line)

Hook method executed just after a command dispatch is finished.  This method is
a stub in @ref{1897,,Cmd}; it exists to be overridden by subclasses.  `line' is the
command line which was executed, and `stop' is a flag which indicates whether
execution will be terminated after the call to @code{postcmd()}; this will be the
return value of the @ref{3678,,onecmd()} method.  The return value of this method will
be used as the new value for the internal flag which corresponds to `stop';
returning false will cause interpretation to continue.
@end deffn

@geindex preloop() (cmd.Cmd method)
@anchor{library/cmd cmd Cmd preloop}@anchor{367d}
@deffn {Method} Cmd.preloop ()

Hook method executed once when @ref{3675,,cmdloop()} is called.  This method is a stub
in @ref{1897,,Cmd}; it exists to be overridden by subclasses.
@end deffn

@geindex postloop() (cmd.Cmd method)
@anchor{library/cmd cmd Cmd postloop}@anchor{367e}
@deffn {Method} Cmd.postloop ()

Hook method executed once when @ref{3675,,cmdloop()} is about to return. This method
is a stub in @ref{1897,,Cmd}; it exists to be overridden by subclasses.
@end deffn

Instances of @ref{1897,,Cmd} subclasses have some public instance variables:

@geindex prompt (cmd.Cmd attribute)
@anchor{library/cmd cmd Cmd prompt}@anchor{367f}
@deffn {Attribute} Cmd.prompt

The prompt issued to solicit input.
@end deffn

@geindex identchars (cmd.Cmd attribute)
@anchor{library/cmd cmd Cmd identchars}@anchor{3680}
@deffn {Attribute} Cmd.identchars

The string of characters accepted for the command prefix.
@end deffn

@geindex lastcmd (cmd.Cmd attribute)
@anchor{library/cmd cmd Cmd lastcmd}@anchor{3681}
@deffn {Attribute} Cmd.lastcmd

The last nonempty command prefix seen.
@end deffn

@geindex cmdqueue (cmd.Cmd attribute)
@anchor{library/cmd cmd Cmd cmdqueue}@anchor{3682}
@deffn {Attribute} Cmd.cmdqueue

A list of queued input lines.  The cmdqueue list is checked in
@ref{3675,,cmdloop()} when new input is needed; if it is nonempty, its elements
will be processed in order, as if entered at the prompt.
@end deffn

@geindex intro (cmd.Cmd attribute)
@anchor{library/cmd cmd Cmd intro}@anchor{3676}
@deffn {Attribute} Cmd.intro

A string to issue as an intro or banner.  May be overridden by giving the
@ref{3675,,cmdloop()} method an argument.
@end deffn

@geindex doc_header (cmd.Cmd attribute)
@anchor{library/cmd cmd Cmd doc_header}@anchor{3683}
@deffn {Attribute} Cmd.doc_header

The header to issue if the help output has a section for documented commands.
@end deffn

@geindex misc_header (cmd.Cmd attribute)
@anchor{library/cmd cmd Cmd misc_header}@anchor{3684}
@deffn {Attribute} Cmd.misc_header

The header to issue if the help output has a section for miscellaneous  help
topics (that is, there are @code{help_*()} methods without corresponding
@code{do_*()} methods).
@end deffn

@geindex undoc_header (cmd.Cmd attribute)
@anchor{library/cmd cmd Cmd undoc_header}@anchor{3685}
@deffn {Attribute} Cmd.undoc_header

The header to issue if the help output has a section for undocumented  commands
(that is, there are @code{do_*()} methods without corresponding @code{help_*()}
methods).
@end deffn

@geindex ruler (cmd.Cmd attribute)
@anchor{library/cmd cmd Cmd ruler}@anchor{3686}
@deffn {Attribute} Cmd.ruler

The character used to draw separator lines under the help-message headers.  If
empty, no ruler line is drawn.  It defaults to @code{'='}.
@end deffn

@geindex use_rawinput (cmd.Cmd attribute)
@anchor{library/cmd cmd Cmd use_rawinput}@anchor{3672}
@deffn {Attribute} Cmd.use_rawinput

A flag, defaulting to true.  If true, @ref{3675,,cmdloop()} uses @ref{14e4,,input()} to
display a prompt and read the next command; if false, @ref{cd3,,sys.stdout.write()}
and @ref{760,,sys.stdin.readline()} are used. (This means that by importing
@ref{bf,,readline}, on systems that support it, the interpreter will automatically
support @code{Emacs}-like line editing  and command-history keystrokes.)
@end deffn

@node Cmd Example,,Cmd Objects,cmd — Support for line-oriented command interpreters
@anchor{library/cmd cmd-example}@anchor{3687}@anchor{library/cmd id2}@anchor{3688}
@subsubsection Cmd Example


The @code{cmd} module is mainly useful for building custom shells that let a
user work with a program interactively.

This section presents a simple example of how to build a shell around a few of
the commands in the @ref{108,,turtle} module.

Basic turtle commands such as @ref{3689,,forward()} are added to a
@ref{1897,,Cmd} subclass with method named @code{do_forward()}.  The argument is
converted to a number and dispatched to the turtle module.  The docstring is
used in the help utility provided by the shell.

The example also includes a basic record and playback facility implemented with
the @ref{3679,,precmd()} method which is responsible for converting the input to
lowercase and writing the commands to a file.  The @code{do_playback()} method
reads the file and adds the recorded commands to the @ref{3682,,cmdqueue} for
immediate playback:

@example
import cmd, sys
from turtle import *

class TurtleShell(cmd.Cmd):
    intro = 'Welcome to the turtle shell.   Type help or ? to list commands.\n'
    prompt = '(turtle) '
    file = None

    # ----- basic turtle commands -----
    def do_forward(self, arg):
        'Move the turtle forward by the specified distance:  FORWARD 10'
        forward(*parse(arg))
    def do_right(self, arg):
        'Turn turtle right by given number of degrees:  RIGHT 20'
        right(*parse(arg))
    def do_left(self, arg):
        'Turn turtle left by given number of degrees:  LEFT 90'
        left(*parse(arg))
    def do_goto(self, arg):
        'Move turtle to an absolute position with changing orientation.  GOTO 100 200'
        goto(*parse(arg))
    def do_home(self, arg):
        'Return turtle to the home position:  HOME'
        home()
    def do_circle(self, arg):
        'Draw circle with given radius an options extent and steps:  CIRCLE 50'
        circle(*parse(arg))
    def do_position(self, arg):
        'Print the current turtle position:  POSITION'
        print('Current position is %d %d\n' % position())
    def do_heading(self, arg):
        'Print the current turtle heading in degrees:  HEADING'
        print('Current heading is %d\n' % (heading(),))
    def do_color(self, arg):
        'Set the color:  COLOR BLUE'
        color(arg.lower())
    def do_undo(self, arg):
        'Undo (repeatedly) the last turtle action(s):  UNDO'
    def do_reset(self, arg):
        'Clear the screen and return turtle to center:  RESET'
        reset()
    def do_bye(self, arg):
        'Stop recording, close the turtle window, and exit:  BYE'
        print('Thank you for using Turtle')
        self.close()
        bye()
        return True

    # ----- record and playback -----
    def do_record(self, arg):
        'Save future commands to filename:  RECORD rose.cmd'
        self.file = open(arg, 'w')
    def do_playback(self, arg):
        'Playback commands from a file:  PLAYBACK rose.cmd'
        self.close()
        with open(arg) as f:
            self.cmdqueue.extend(f.read().splitlines())
    def precmd(self, line):
        line = line.lower()
        if self.file and 'playback' not in line:
            print(line, file=self.file)
        return line
    def close(self):
        if self.file:
            self.file.close()
            self.file = None

def parse(arg):
    'Convert a series of zero or more numbers to an argument tuple'
    return tuple(map(int, arg.split()))

if __name__ == '__main__':
    TurtleShell().cmdloop()
@end example

Here is a sample session with the turtle shell showing the help functions, using
blank lines to repeat commands, and the simple record and playback facility:

@example
Welcome to the turtle shell.   Type help or ? to list commands.

(turtle) ?

Documented commands (type help <topic>):
========================================
bye     color    goto     home  playback  record  right
circle  forward  heading  left  position  reset   undo

(turtle) help forward
Move the turtle forward by the specified distance:  FORWARD 10
(turtle) record spiral.cmd
(turtle) position
Current position is 0 0

(turtle) heading
Current heading is 0

(turtle) reset
(turtle) circle 20
(turtle) right 30
(turtle) circle 40
(turtle) right 30
(turtle) circle 60
(turtle) right 30
(turtle) circle 80
(turtle) right 30
(turtle) circle 100
(turtle) right 30
(turtle) circle 120
(turtle) right 30
(turtle) circle 120
(turtle) heading
Current heading is 180

(turtle) forward 100
(turtle)
(turtle) right 90
(turtle) forward 100
(turtle)
(turtle) right 90
(turtle) forward 400
(turtle) right 90
(turtle) forward 500
(turtle) right 90
(turtle) forward 400
(turtle) right 90
(turtle) forward 300
(turtle) playback spiral.cmd
Current position is 0 0

Current heading is 0

Current heading is 180

(turtle) bye
Thank you for using Turtle
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Concurrent Execution,Networking and Interprocess Communication,Command-line interface libraries,The Python Standard Library
@anchor{library/concurrency doc}@anchor{368a}@anchor{library/concurrency concurrency}@anchor{368b}@anchor{library/concurrency concurrent-execution}@anchor{368c}@anchor{library/concurrency translation-repo}@anchor{368d}
@section Concurrent Execution


The modules described in this chapter provide support for concurrent
execution of code. The appropriate choice of tool will depend on the
task to be executed (CPU bound vs IO bound) and preferred style of
development (event driven cooperative multitasking vs preemptive
multitasking). Here’s an overview:

@menu
* threading — Thread-based parallelism:: 
* multiprocessing — Process-based parallelism:: 
* multiprocessing.shared_memory — Shared memory for direct access across processes: multiprocessing shared_memory — Shared memory for direct access across processes. 
* The concurrent package:: 
* concurrent.futures — Launching parallel tasks: concurrent futures — Launching parallel tasks. 
* concurrent.interpreters — Multiple interpreters in the same process: concurrent interpreters — Multiple interpreters in the same process. 
* subprocess — Subprocess management:: 
* sched — Event scheduler:: 
* queue — A synchronized queue class:: 
* contextvars — Context Variables:: 
* _thread — Low-level threading API:: 

@end menu

@node threading — Thread-based parallelism,multiprocessing — Process-based parallelism,,Concurrent Execution
@anchor{library/threading doc}@anchor{368e}@anchor{library/threading module-threading}@anchor{f3}@anchor{library/threading threading-thread-based-parallelism}@anchor{368f}
@subsection @code{threading} — Thread-based parallelism


@geindex module; threading

`Source code:' Lib/threading.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/threading.py}


__________________________________________________________________


This module constructs higher-level threading interfaces on top of the lower
level @ref{2,,_thread} module.

@c include for modules that don't work on WASM

@ref{2181,,Availability}: not WASI.

This module does not work or is not available on WebAssembly. See
@ref{1bae,,WebAssembly platforms} for more information.

@menu
* Introduction: Introduction<8>. 
* GIL and performance considerations:: 
* Reference: Reference<2>. 
* Using locks@comma{} conditions@comma{} and semaphores in the with statement: Using locks conditions and semaphores in the with statement. 

@end menu

@node Introduction<8>,GIL and performance considerations,,threading — Thread-based parallelism
@anchor{library/threading introduction}@anchor{3690}
@subsubsection Introduction


The @code{threading} module provides a way to run multiple threads@footnote{https://en.wikipedia.org/wiki/Thread_(computing)} (smaller
units of a process) concurrently within a single process. It allows for the
creation and management of threads, making it possible to execute tasks in
parallel, sharing memory space. Threads are particularly useful when tasks are
I/O bound, such as file operations or making network requests,
where much of the time is spent waiting for external resources.

A typical use case for @code{threading} includes managing a pool of worker
threads that can process multiple tasks concurrently.  Here’s a basic example of
creating and starting threads using @ref{177,,Thread}:

@example
import threading
import time

def crawl(link, delay=3):
    print(f"crawl started for @{link@}")
    time.sleep(delay)  # Blocking I/O (simulating a network request)
    print(f"crawl ended for @{link@}")

links = [
    "https://python.org",
    "https://docs.python.org",
    "https://peps.python.org",
]

# Start threads for each link
threads = []
for link in links:
    # Using `args` to pass positional arguments and `kwargs` for keyword arguments
    t = threading.Thread(target=crawl, args=(link,), kwargs=@{"delay": 2@})
    threads.append(t)

# Start each thread
for t in threads:
    t.start()

# Wait for all threads to finish
for t in threads:
    t.join()
@end example


Changed in version 3.7: This module used to be optional, it is now always available.



@subsubheading See also


@ref{94e,,concurrent.futures.ThreadPoolExecutor} offers a higher level interface
to push tasks to a background thread without blocking execution of the
calling thread, while still being able to retrieve their results when needed.

@ref{bb,,queue} provides a thread-safe interface for exchanging data between
running threads.

@ref{b,,asyncio} offers an alternative approach to achieving task level
concurrency without requiring the use of multiple operating system threads.


@cartouche
@quotation Note 
In the Python 2.x series, this module contained @code{camelCase} names
for some methods and functions. These are deprecated as of Python 3.10,
but they are still supported for compatibility with Python 2.5 and lower.
@end quotation
@end cartouche

`CPython implementation detail:' In CPython, due to the @ref{474,,Global Interpreter Lock}, only one thread
can execute Python code at once (even though certain performance-oriented
libraries might overcome this limitation).
If you want your application to make better use of the computational
resources of multi-core machines, you are advised to use
@ref{98,,multiprocessing} or @ref{1d8,,concurrent.futures.ProcessPoolExecutor}.
However, threading is still an appropriate model if you want to run
multiple I/O-bound tasks simultaneously.

@node GIL and performance considerations,Reference<2>,Introduction<8>,threading — Thread-based parallelism
@anchor{library/threading gil-and-performance-considerations}@anchor{3691}
@subsubsection GIL and performance considerations


Unlike the @ref{98,,multiprocessing} module, which uses separate processes to
bypass the @ref{474,,global interpreter lock} (GIL), the threading module operates
within a single process, meaning that all threads share the same memory space.
However, the GIL limits the performance gains of threading when it comes to
CPU-bound tasks, as only one thread can execute Python bytecode at a time.
Despite this, threads remain a useful tool for achieving concurrency in many
scenarios.

As of Python 3.13, @ref{1f6,,free-threaded} builds
can disable the GIL, enabling true parallel execution of threads, but this
feature is not available by default (see 
@geindex Python Enhancement Proposals; PEP 703
PEP 703@footnote{https://peps.python.org/pep-0703/}).

@c TODO: At some point this feature will become available by default.

@node Reference<2>,Using locks conditions and semaphores in the with statement,GIL and performance considerations,threading — Thread-based parallelism
@anchor{library/threading reference}@anchor{3692}
@subsubsection Reference


This module defines the following functions:

@geindex active_count() (in module threading)
@anchor{library/threading threading active_count}@anchor{35d}
@deffn {Function} threading.active_count ()

Return the number of @ref{177,,Thread} objects currently alive.  The returned
count is equal to the length of the list returned by @ref{1c9d,,enumerate()}.

The function @code{activeCount} is a deprecated alias for this function.
@end deffn

@geindex current_thread() (in module threading)
@anchor{library/threading threading current_thread}@anchor{35c}
@deffn {Function} threading.current_thread ()

Return the current @ref{177,,Thread} object, corresponding to the caller’s thread
of control.  If the caller’s thread of control was not created through the
@code{threading} module, a dummy thread object with limited functionality is
returned.

The function @code{currentThread} is a deprecated alias for this function.
@end deffn

@geindex excepthook() (in module threading)
@anchor{library/threading threading excepthook}@anchor{a51}
@deffn {Function} threading.excepthook (args, /)

Handle uncaught exception raised by @ref{c37,,Thread.run()}.

The `args' argument has the following attributes:


@itemize *

@item 
`exc_type': Exception type.

@item 
`exc_value': Exception value, can be @code{None}.

@item 
`exc_traceback': Exception traceback, can be @code{None}.

@item 
`thread': Thread which raised the exception, can be @code{None}.
@end itemize

If `exc_type' is @ref{f42,,SystemExit}, the exception is silently ignored.
Otherwise, the exception is printed out on @ref{b39,,sys.stderr}.

If  this function raises an exception, @ref{a12,,sys.excepthook()} is called to
handle it.

@code{threading.excepthook()} can be overridden to control how uncaught
exceptions raised by @ref{c37,,Thread.run()} are handled.

Storing `exc_value' using a custom hook can create a reference cycle. It
should be cleared explicitly to break the reference cycle when the
exception is no longer needed.

Storing `thread' using a custom hook can resurrect it if it is set to an
object which is being finalized. Avoid storing `thread' after the custom
hook completes to avoid resurrecting objects.


@subsubheading See also


@ref{a12,,sys.excepthook()} handles uncaught exceptions.



Added in version 3.8.

@end deffn

@geindex __excepthook__ (in module threading)
@anchor{library/threading threading __excepthook__}@anchor{a50}
@deffn {Data} threading.__excepthook__

Holds the original value of @ref{a51,,threading.excepthook()}. It is saved so that the
original value can be restored in case they happen to get replaced with
broken or alternative objects.


Added in version 3.10.

@end deffn

@geindex get_ident() (in module threading)
@anchor{library/threading threading get_ident}@anchor{1366}
@deffn {Function} threading.get_ident ()

Return the ‘thread identifier’ of the current thread.  This is a nonzero
integer.  Its value has no direct meaning; it is intended as a magic cookie
to be used e.g. to index a dictionary of thread-specific data.  Thread
identifiers may be recycled when a thread exits and another thread is
created.


Added in version 3.3.

@end deffn

@geindex get_native_id() (in module threading)
@anchor{library/threading threading get_native_id}@anchor{c38}
@deffn {Function} threading.get_native_id ()

Return the native integral Thread ID of the current thread assigned by the kernel.
This is a non-negative integer.
Its value may be used to uniquely identify this particular thread system-wide
(until the thread terminates, after which the value may be recycled by the OS).

@ref{2181,,Availability}: Windows, FreeBSD, Linux, macOS, OpenBSD, NetBSD, AIX, DragonFlyBSD, GNU/kFreeBSD.


Added in version 3.8.



Changed in version 3.13: Added support for GNU/kFreeBSD.

@end deffn

@geindex enumerate() (in module threading)
@anchor{library/threading threading enumerate}@anchor{1c9d}
@deffn {Function} threading.enumerate ()

Return a list of all @ref{177,,Thread} objects currently active.  The list
includes daemonic threads and dummy thread objects created by
@ref{35c,,current_thread()}.  It excludes terminated threads and threads
that have not yet been started.  However, the main thread is always part
of the result, even when terminated.
@end deffn

@geindex main_thread() (in module threading)
@anchor{library/threading threading main_thread}@anchor{11d8}
@deffn {Function} threading.main_thread ()

Return the main @ref{177,,Thread} object.  In normal conditions, the
main thread is the thread from which the Python interpreter was
started.


Added in version 3.4.

@end deffn

@geindex settrace() (in module threading)
@anchor{library/threading threading settrace}@anchor{a4e}
@deffn {Function} threading.settrace (func)

@geindex trace function

Set a trace function for all threads started from the @code{threading} module.
The `func' will be passed to  @ref{2e3,,sys.settrace()} for each thread, before its
@ref{c37,,run()} method is called.
@end deffn

@geindex settrace_all_threads() (in module threading)
@anchor{library/threading threading settrace_all_threads}@anchor{6f0}
@deffn {Function} threading.settrace_all_threads (func)

Set a trace function for all threads started from the @code{threading} module
and all Python threads that are currently executing.

The `func' will be passed to  @ref{2e3,,sys.settrace()} for each thread, before its
@ref{c37,,run()} method is called.


Added in version 3.12.

@end deffn

@geindex gettrace() (in module threading)
@anchor{library/threading threading gettrace}@anchor{a4c}
@deffn {Function} threading.gettrace ()

@geindex trace function
@geindex debugger

Get the trace function as set by @ref{a4e,,settrace()}.


Added in version 3.10.

@end deffn

@geindex setprofile() (in module threading)
@anchor{library/threading threading setprofile}@anchor{a4f}
@deffn {Function} threading.setprofile (func)

@geindex profile function

Set a profile function for all threads started from the @code{threading} module.
The `func' will be passed to  @ref{170a,,sys.setprofile()} for each thread, before its
@ref{c37,,run()} method is called.
@end deffn

@geindex setprofile_all_threads() (in module threading)
@anchor{library/threading threading setprofile_all_threads}@anchor{6f1}
@deffn {Function} threading.setprofile_all_threads (func)

Set a profile function for all threads started from the @code{threading} module
and all Python threads that are currently executing.

The `func' will be passed to  @ref{170a,,sys.setprofile()} for each thread, before its
@ref{c37,,run()} method is called.


Added in version 3.12.

@end deffn

@geindex getprofile() (in module threading)
@anchor{library/threading threading getprofile}@anchor{a4d}
@deffn {Function} threading.getprofile ()

@geindex profile function

Get the profiler function as set by @ref{a4f,,setprofile()}.


Added in version 3.10.

@end deffn

@geindex stack_size() (in module threading)
@anchor{library/threading threading stack_size}@anchor{3693}
@deffn {Function} threading.stack_size ([size])

Return the thread stack size used when creating new threads.  The optional
`size' argument specifies the stack size to be used for subsequently created
threads, and must be 0 (use platform or configured default) or a positive
integer value of at least 32,768 (32 KiB). If `size' is not specified,
0 is used.  If changing the thread stack size is
unsupported, a @ref{246,,RuntimeError} is raised.  If the specified stack size is
invalid, a @ref{2ee,,ValueError} is raised and the stack size is unmodified.  32 KiB
is currently the minimum supported stack size value to guarantee sufficient
stack space for the interpreter itself.  Note that some platforms may have
particular restrictions on values for the stack size, such as requiring a
minimum stack size > 32 KiB or requiring allocation in multiples of the system
memory page size - platform documentation should be referred to for more
information (4 KiB pages are common; using multiples of 4096 for the stack size is
the suggested approach in the absence of more specific information).

@ref{2181,,Availability}: Windows, pthreads.

Unix platforms with POSIX threads support.
@end deffn

This module also defines the following constant:

@geindex TIMEOUT_MAX (in module threading)
@anchor{library/threading threading TIMEOUT_MAX}@anchor{3694}
@deffn {Data} threading.TIMEOUT_MAX

The maximum value allowed for the `timeout' parameter of blocking functions
(@ref{8a9,,Lock.acquire()}, @ref{1081,,RLock.acquire()}, @ref{1ca9,,Condition.wait()}, etc.).
Specifying a timeout greater than this value will raise an
@ref{a87,,OverflowError}.


Added in version 3.2.

@end deffn

This module defines a number of classes, which are detailed in the sections
below.

The design of this module is loosely based on Java’s threading model. However,
where Java makes locks and condition variables basic behavior of every object,
they are separate objects in Python.  Python’s @ref{177,,Thread} class supports a
subset of the behavior of Java’s Thread class; currently, there are no
priorities, no thread groups, and threads cannot be destroyed, stopped,
suspended, resumed, or interrupted.  The static methods of Java’s Thread class,
when implemented, are mapped to module-level functions.

All of the methods described below are executed atomically.

@menu
* Thread-local data:: 
* Thread objects:: 
* Lock objects:: 
* RLock objects:: 
* Condition objects:: 
* Semaphore objects:: 
* Semaphore example:: 
* Event objects:: 
* Timer objects:: 
* Barrier objects:: 

@end menu

@node Thread-local data,Thread objects,,Reference<2>
@anchor{library/threading thread-local-data}@anchor{3695}
@subsubsection Thread-local data


Thread-local data is data whose values are thread specific. If you
have data that you want to be local to a thread, create a
@ref{18a8,,local} object and use its attributes:

@example
>>> mydata = local()
>>> mydata.number = 42
>>> mydata.number
42
@end example

You can also access the @ref{18a8,,local}-object’s dictionary:

@example
>>> mydata.__dict__
@{'number': 42@}
>>> mydata.__dict__.setdefault('widgets', [])
[]
>>> mydata.widgets
[]
@end example

If we access the data in a different thread:

@example
>>> log = []
>>> def f():
...     items = sorted(mydata.__dict__.items())
...     log.append(items)
...     mydata.number = 11
...     log.append(mydata.number)

>>> import threading
>>> thread = threading.Thread(target=f)
>>> thread.start()
>>> thread.join()
>>> log
[[], 11]
@end example

we get different data.  Furthermore, changes made in the other thread
don’t affect data seen in this thread:

@example
>>> mydata.number
42
@end example

Of course, values you get from a @ref{18a8,,local} object, including their
@ref{77e,,__dict__} attribute, are for whatever thread was current
at the time the attribute was read.  For that reason, you generally
don’t want to save these values across threads, as they apply only to
the thread they came from.

You can create custom @ref{18a8,,local} objects by subclassing the
@code{local} class:

@example
>>> class MyLocal(local):
...     number = 2
...     def __init__(self, /, **kw):
...         self.__dict__.update(kw)
...     def squared(self):
...         return self.number ** 2
@end example

This can be useful to support default values, methods and
initialization.  Note that if you define an @ref{8c1,,__init__()}
method, it will be called each time the @ref{18a8,,local} object is used
in a separate thread.  This is necessary to initialize each thread’s
dictionary.

Now if we create a @ref{18a8,,local} object:

@example
>>> mydata = MyLocal(color='red')
@end example

we have a default number:

@example
>>> mydata.number
2
@end example

an initial color:

@example
>>> mydata.color
'red'
>>> del mydata.color
@end example

And a method that operates on the data:

@example
>>> mydata.squared()
4
@end example

As before, we can access the data in a separate thread:

@example
>>> log = []
>>> thread = threading.Thread(target=f)
>>> thread.start()
>>> thread.join()
>>> log
[[('color', 'red')], 11]
@end example

without affecting this thread’s data:

@example
>>> mydata.number
2
>>> mydata.color
Traceback (most recent call last):
...
AttributeError: 'MyLocal' object has no attribute 'color'
@end example

Note that subclasses can define @ref{7f8,,__slots__}, but they are not
thread local. They are shared across threads:

@example
>>> class MyLocal(local):
...     __slots__ = 'number'

>>> mydata = MyLocal()
>>> mydata.number = 42
>>> mydata.color = 'red'
@end example

So, the separate thread:

@example
>>> thread = threading.Thread(target=f)
>>> thread.start()
>>> thread.join()
@end example

affects what we see:

@example
>>> mydata.number
11
@end example

@geindex local (class in threading)
@anchor{library/threading threading local}@anchor{18a8}
@deffn {Class} threading.local

A class that represents thread-local data.
@end deffn

@node Thread objects,Lock objects,Thread-local data,Reference<2>
@anchor{library/threading id1}@anchor{3696}@anchor{library/threading thread-objects}@anchor{3697}
@subsubsection Thread objects


The @ref{177,,Thread} class represents an activity that is run in a separate
thread of control.  There are two ways to specify the activity: by passing a
callable object to the constructor, or by overriding the @ref{c37,,run()}
method in a subclass.  No other methods (except for the constructor) should be
overridden in a subclass.  In other words, `only'  override the
@code{__init__()} and @code{run()} methods of this class.

Once a thread object is created, its activity must be started by calling the
thread’s @ref{179,,start()} method.  This invokes the @ref{c37,,run()}
method in a separate thread of control.

Once the thread’s activity is started, the thread is considered ‘alive’. It
stops being alive when its @ref{c37,,run()} method terminates – either
normally, or by raising an unhandled exception.  The @ref{b4c,,is_alive()}
method tests whether the thread is alive.

Other threads can call a thread’s @ref{13f0,,join()} method.  This blocks
the calling thread until the thread whose @code{join()} method is
called is terminated.

A thread has a name.  The name can be passed to the constructor, and read or
changed through the @ref{2a2,,name} attribute.

If the @ref{c37,,run()} method raises an exception,
@ref{a51,,threading.excepthook()} is called to handle it. By default,
@code{threading.excepthook()} ignores silently @ref{f42,,SystemExit}.

A thread can be flagged as a “daemon thread”.  The significance of this flag is
that the entire Python program exits when only daemon threads are left.  The
initial value is inherited from the creating thread.  The flag can be set
through the @ref{35a,,daemon} property or the `daemon' constructor
argument.

@cartouche
@quotation Note 
Daemon threads are abruptly stopped at shutdown.  Their resources (such
as open files, database transactions, etc.) may not be released properly.
If you want your threads to stop gracefully, make them non-daemonic and
use a suitable signalling mechanism such as an @ref{1364,,Event}.
@end quotation
@end cartouche

There is a “main thread” object; this corresponds to the initial thread of
control in the Python program.  It is not a daemon thread.

There is the possibility that “dummy thread objects” are created. These are
thread objects corresponding to “alien threads”, which are threads of control
started outside the threading module, such as directly from C code.  Dummy
thread objects have limited functionality; they are always considered alive and
daemonic, and cannot be @ref{3698,,joined}.  They are never deleted,
since it is impossible to detect the termination of alien threads.

@geindex Thread (class in threading)
@anchor{library/threading threading Thread}@anchor{177}
@deffn {Class} threading.Thread (group=None, target=None, name=None, args=(), kwargs=@{@}, *, daemon=None, context=None)

This constructor should always be called with keyword arguments.  Arguments
are:

`group' must be @code{None} as it is reserved for future extension when a
@code{ThreadGroup} class is implemented.

`target' is the callable object to be invoked by the @ref{c37,,run()} method.
Defaults to @code{None}, meaning nothing is called.

`name' is the thread name. By default, a unique name is constructed
of the form “Thread-`N'” where `N' is a small decimal number,
or “Thread-`N' (target)” where “target” is @code{target.__name__} if the
`target' argument is specified.

`args' is a list or tuple of arguments for the target invocation.  Defaults to @code{()}.

`kwargs' is a dictionary of keyword arguments for the target invocation.
Defaults to @code{@{@}}.

If not @code{None}, `daemon' explicitly sets whether the thread is daemonic.
If @code{None} (the default), the daemonic property is inherited from the
current thread.

`context' is the @ref{178,,Context} value to use when starting
the thread.  The default value is @code{None} which indicates that the
@ref{176,,sys.flags.thread_inherit_context} flag controls the behaviour.  If
the flag is true, threads will start with a copy of the context of the
caller of @ref{179,,start()}.  If false, they will start with an empty
context.  To explicitly start with an empty context, pass a new instance of
@ref{178,,Context()}.  To explicitly start with a copy of the
current context, pass the value from @ref{3699,,copy_context()}. The
flag defaults true on free-threaded builds and false otherwise.

If the subclass overrides the constructor, it must make sure to invoke the
base class constructor (@code{Thread.__init__()}) before doing anything else to
the thread.


Changed in version 3.3: Added the `daemon' parameter.



Changed in version 3.10: Use the `target' name if `name' argument is omitted.



Changed in version 3.14: Added the `context' parameter.


@geindex start() (threading.Thread method)
@anchor{library/threading threading Thread start}@anchor{179}
@deffn {Method} start ()

Start the thread’s activity.

It must be called at most once per thread object.  It arranges for the
object’s @ref{c37,,run()} method to be invoked in a separate thread
of control.

This method will raise a @ref{246,,RuntimeError} if called more than once
on the same thread object.

If supported, set the operating system thread name to
@ref{2a2,,threading.Thread.name}. The name can be truncated depending on the
operating system thread name limits.


Changed in version 3.14: Set the operating system thread name.

@end deffn

@geindex run() (threading.Thread method)
@anchor{library/threading threading Thread run}@anchor{c37}
@deffn {Method} run ()

Method representing the thread’s activity.

You may override this method in a subclass.  The standard @code{run()}
method invokes the callable object passed to the object’s constructor as
the `target' argument, if any, with positional and keyword arguments taken
from the `args' and `kwargs' arguments, respectively.

Using list or tuple as the `args' argument which passed to the @code{Thread}
could achieve the same effect.

Example:

@example
>>> from threading import Thread
>>> t = Thread(target=print, args=[1])
>>> t.run()
1
>>> t = Thread(target=print, args=(1,))
>>> t.run()
1
@end example
@end deffn

@geindex join() (threading.Thread method)
@anchor{library/threading meth-thread-join}@anchor{3698}@anchor{library/threading threading Thread join}@anchor{13f0}
@deffn {Method} join (timeout=None)

Wait until the thread terminates. This blocks the calling thread until
the thread whose @code{join()} method is called terminates – either
normally or through an unhandled exception – or until the optional
timeout occurs.

When the `timeout' argument is present and not @code{None}, it should be a
floating-point number specifying a timeout for the operation in seconds
(or fractions thereof). As @code{join()} always returns @code{None},
you must call @ref{b4c,,is_alive()} after @code{join()} to
decide whether a timeout happened – if the thread is still alive, the
@code{join()} call timed out.

When the `timeout' argument is not present or @code{None}, the operation will
block until the thread terminates.

A thread can be joined many times.

@code{join()} raises a @ref{246,,RuntimeError} if an attempt is made
to join the current thread as that would cause a deadlock. It is also
an error to @code{join()} a thread before it has been started
and attempts to do so raise the same exception.

If an attempt is made to join a running daemonic thread in late stages
of @ref{47a,,Python finalization} @code{join()}
raises a @ref{479,,PythonFinalizationError}.


Changed in version 3.14: May raise @ref{479,,PythonFinalizationError}.

@end deffn

@geindex name (threading.Thread attribute)
@anchor{library/threading threading Thread name}@anchor{2a2}
@deffn {Attribute} name

A string used for identification purposes only. It has no semantics.
Multiple threads may be given the same name.  The initial name is set by
the constructor.

On some platforms, the thread name is set at the operating system level
when the thread starts, so that it is visible in task managers.
This name may be truncated to fit in a system-specific limit (for example,
15 bytes on Linux or 63 bytes on macOS).

Changes to `name' are only reflected at the OS level when the currently
running thread is renamed. (Setting the `name' attribute of a
different thread only updates the Python Thread object.)
@end deffn

@geindex getName() (threading.Thread method)
@geindex setName() (threading.Thread method)
@anchor{library/threading threading Thread getName}@anchor{369a}
@deffn {Method} getName ()
@anchor{library/threading threading Thread setName}@anchor{35b}
@deffnx {Method} setName ()

Deprecated getter/setter API for @ref{2a2,,name}; use it directly as a
property instead.


Deprecated since version 3.10.

@end deffn

@geindex ident (threading.Thread attribute)
@anchor{library/threading threading Thread ident}@anchor{31a9}
@deffn {Attribute} ident

The ‘thread identifier’ of this thread or @code{None} if the thread has not
been started.  This is a nonzero integer.  See the @ref{1366,,get_ident()}
function.  Thread identifiers may be recycled when a thread exits and
another thread is created.  The identifier is available even after the
thread has exited.
@end deffn

@geindex native_id (threading.Thread attribute)
@anchor{library/threading threading Thread native_id}@anchor{c39}
@deffn {Attribute} native_id

The Thread ID (@code{TID}) of this thread, as assigned by the OS (kernel).
This is a non-negative integer, or @code{None} if the thread has not
been started. See the @ref{c38,,get_native_id()} function.
This value may be used to uniquely identify this particular thread
system-wide (until the thread terminates, after which the value
may be recycled by the OS).

@cartouche
@quotation Note 
Similar to Process IDs, Thread IDs are only valid (guaranteed unique
system-wide) from the time the thread is created until the thread
has been terminated.
@end quotation
@end cartouche

@ref{2181,,Availability}: Windows, FreeBSD, Linux, macOS, OpenBSD, NetBSD, AIX, DragonFlyBSD.


Added in version 3.8.

@end deffn

@geindex is_alive() (threading.Thread method)
@anchor{library/threading threading Thread is_alive}@anchor{b4c}
@deffn {Method} is_alive ()

Return whether the thread is alive.

This method returns @code{True} just before the @ref{c37,,run()} method
starts until just after the @code{run()} method terminates.  The
module function @ref{1c9d,,enumerate()} returns a list of all alive threads.
@end deffn

@geindex daemon (threading.Thread attribute)
@anchor{library/threading threading Thread daemon}@anchor{35a}
@deffn {Attribute} daemon

A boolean value indicating whether this thread is a daemon thread (@code{True})
or not (@code{False}).  This must be set before @ref{179,,start()} is called,
otherwise @ref{246,,RuntimeError} is raised.  Its initial value is inherited
from the creating thread; the main thread is not a daemon thread and
therefore all threads created in the main thread default to
@code{daemon} = @code{False}.

The entire Python program exits when no alive non-daemon threads are left.
@end deffn

@geindex isDaemon() (threading.Thread method)
@geindex setDaemon() (threading.Thread method)
@anchor{library/threading threading Thread isDaemon}@anchor{369b}
@deffn {Method} isDaemon ()
@anchor{library/threading threading Thread setDaemon}@anchor{359}
@deffnx {Method} setDaemon ()

Deprecated getter/setter API for @ref{35a,,daemon}; use it directly as a
property instead.


Deprecated since version 3.10.

@end deffn
@end deffn

@node Lock objects,RLock objects,Thread objects,Reference<2>
@anchor{library/threading id2}@anchor{369c}@anchor{library/threading lock-objects}@anchor{369d}
@subsubsection Lock objects


A primitive lock is a synchronization primitive that is not owned by a
particular thread when locked.  In Python, it is currently the lowest level
synchronization primitive available, implemented directly by the @ref{2,,_thread}
extension module.

A primitive lock is in one of two states, “locked” or “unlocked”. It is created
in the unlocked state.  It has two basic methods, @ref{8a9,,acquire()} and
@ref{14ce,,release()}.  When the state is unlocked, @code{acquire()}
changes the state to locked and returns immediately.  When the state is locked,
@code{acquire()} blocks until a call to @code{release()} in another
thread changes it to unlocked, then the @code{acquire()} call resets it
to locked and returns.  The @code{release()} method should only be
called in the locked state; it changes the state to unlocked and returns
immediately. If an attempt is made to release an unlocked lock, a
@ref{246,,RuntimeError} will be raised.

Locks also support the @ref{369e,,context management protocol}.

When more than one thread is blocked in @ref{8a9,,acquire()} waiting for the
state to turn to unlocked, only one thread proceeds when a @ref{14ce,,release()}
call resets the state to unlocked; which one of the waiting threads proceeds
is not defined, and may vary across implementations.

All methods are executed atomically.

@geindex Lock (class in threading)
@anchor{library/threading threading Lock}@anchor{1a39}
@deffn {Class} threading.Lock

The class implementing primitive lock objects.  Once a thread has acquired a
lock, subsequent attempts to acquire it block, until it is released; any
thread may release it.


Changed in version 3.13: @code{Lock} is now a class. In earlier Pythons, @code{Lock} was a factory
function which returned an instance of the underlying private lock
type.


@geindex acquire() (threading.Lock method)
@anchor{library/threading threading Lock acquire}@anchor{8a9}
@deffn {Method} acquire (blocking=True, timeout=-1)

Acquire a lock, blocking or non-blocking.

When invoked with the `blocking' argument set to @code{True} (the default),
block until the lock is unlocked, then set it to locked and return @code{True}.

When invoked with the `blocking' argument set to @code{False}, do not block.
If a call with `blocking' set to @code{True} would block, return @code{False}
immediately; otherwise, set the lock to locked and return @code{True}.

When invoked with the floating-point `timeout' argument set to a positive
value, block for at most the number of seconds specified by `timeout'
and as long as the lock cannot be acquired.  A `timeout' argument of @code{-1}
specifies an unbounded wait.  It is forbidden to specify a `timeout'
when `blocking' is @code{False}.

The return value is @code{True} if the lock is acquired successfully,
@code{False} if not (for example if the `timeout' expired).


Changed in version 3.2: The `timeout' parameter is new.



Changed in version 3.2: Lock acquisition can now be interrupted by signals on POSIX if the
underlying threading implementation supports it.



Changed in version 3.14: Lock acquisition can now be interrupted by signals on Windows.

@end deffn

@geindex release() (threading.Lock method)
@anchor{library/threading threading Lock release}@anchor{14ce}
@deffn {Method} release ()

Release a lock.  This can be called from any thread, not only the thread
which has acquired the lock.

When the lock is locked, reset it to unlocked, and return.  If any other threads
are blocked waiting for the lock to become unlocked, allow exactly one of them
to proceed.

When invoked on an unlocked lock, a @ref{246,,RuntimeError} is raised.

There is no return value.
@end deffn

@geindex locked() (threading.Lock method)
@anchor{library/threading threading Lock locked}@anchor{369f}
@deffn {Method} locked ()

Return @code{True} if the lock is acquired.
@end deffn
@end deffn

@node RLock objects,Condition objects,Lock objects,Reference<2>
@anchor{library/threading id3}@anchor{36a0}@anchor{library/threading rlock-objects}@anchor{36a1}
@subsubsection RLock objects


A reentrant lock is a synchronization primitive that may be acquired multiple
times by the same thread.  Internally, it uses the concepts of “owning thread”
and “recursion level” in addition to the locked/unlocked state used by primitive
locks.  In the locked state, some thread owns the lock; in the unlocked state,
no thread owns it.

Threads call a lock’s @ref{1081,,acquire()} method to lock it,
and its @ref{14ce,,release()} method to unlock it.

@cartouche
@quotation Note 
Reentrant locks support the @ref{369e,,context management protocol},
so it is recommended to use @ref{187,,with} instead of manually calling
@ref{1081,,acquire()} and @ref{36a2,,release()}
to handle acquiring and releasing the lock for a block of code.
@end quotation
@end cartouche

RLock’s @ref{1081,,acquire()}/@ref{36a2,,release()} call pairs may be nested,
unlike Lock’s @ref{8a9,,acquire()}/@ref{14ce,,release()}. Only the final
@code{release()} (the @code{release()} of the outermost pair) resets
the lock to an unlocked state and allows another thread blocked in
@code{acquire()} to proceed.

@ref{1081,,acquire()}/@ref{36a2,,release()} must be used in pairs: each acquire
must have a release in the thread that has acquired the lock. Failing to
call release as many times the lock has been acquired can lead to deadlock.

@geindex RLock (class in threading)
@anchor{library/threading threading RLock}@anchor{32c}
@deffn {Class} threading.RLock

This class implements reentrant lock objects.  A reentrant lock must be
released by the thread that acquired it.  Once a thread has acquired a
reentrant lock, the same thread may acquire it again without blocking; the
thread must release it once for each time it has acquired it.

Note that @code{RLock} is actually a factory function which returns an instance
of the most efficient version of the concrete RLock class that is supported
by the platform.

@geindex acquire() (threading.RLock method)
@anchor{library/threading threading RLock acquire}@anchor{1081}
@deffn {Method} acquire (blocking=True, timeout=-1)

Acquire a lock, blocking or non-blocking.


@subsubheading See also



@table @asis

@item @ref{369e,,Using RLock as a context manager}

Recommended over manual @code{acquire()} and @ref{36a2,,release()} calls
whenever practical.
@end table


When invoked with the `blocking' argument set to @code{True} (the default):

@quotation


@itemize *

@item 
If no thread owns the lock, acquire the lock and return immediately.

@item 
If another thread owns the lock, block until we are able to acquire
lock, or `timeout', if set to a positive float value.

@item 
If the same thread owns the lock, acquire the lock again, and
return immediately. This is the difference between @ref{1a39,,Lock} and
@code{RLock}; @code{Lock} handles this case the same as the previous,
blocking until the lock can be acquired.
@end itemize
@end quotation

When invoked with the `blocking' argument set to @code{False}:

@quotation


@itemize *

@item 
If no thread owns the lock, acquire the lock and return immediately.

@item 
If another thread owns the lock, return immediately.

@item 
If the same thread owns the lock, acquire the lock again and return
immediately.
@end itemize
@end quotation

In all cases, if the thread was able to acquire the lock, return @code{True}.
If the thread was unable to acquire the lock (i.e. if not blocking or
the timeout was reached) return @code{False}.

If called multiple times, failing to call @ref{36a2,,release()} as many times
may lead to deadlock. Consider using @code{RLock} as a context manager rather than
calling acquire/release directly.


Changed in version 3.2: The `timeout' parameter is new.

@end deffn

@geindex release() (threading.RLock method)
@anchor{library/threading threading RLock release}@anchor{36a2}
@deffn {Method} release ()

Release a lock, decrementing the recursion level.  If after the decrement it is
zero, reset the lock to unlocked (not owned by any thread), and if any other
threads are blocked waiting for the lock to become unlocked, allow exactly one
of them to proceed.  If after the decrement the recursion level is still
nonzero, the lock remains locked and owned by the calling thread.

Only call this method when the calling thread owns the lock. A
@ref{246,,RuntimeError} is raised if this method is called when the lock is
not acquired.

There is no return value.
@end deffn

@geindex locked() (threading.RLock method)
@anchor{library/threading threading RLock locked}@anchor{1885}
@deffn {Method} locked ()

Return a boolean indicating whether this object is locked right now.


Added in version 3.14.

@end deffn
@end deffn

@node Condition objects,Semaphore objects,RLock objects,Reference<2>
@anchor{library/threading condition-objects}@anchor{36a3}@anchor{library/threading id4}@anchor{36a4}
@subsubsection Condition objects


A condition variable is always associated with some kind of lock; this can be
passed in or one will be created by default.  Passing one in is useful when
several condition variables must share the same lock.  The lock is part of
the condition object: you don’t have to track it separately.

A condition variable obeys the @ref{369e,,context management protocol}:
using the @code{with} statement acquires the associated lock for the duration of
the enclosed block.  The @ref{36a5,,acquire()} and
@ref{36a6,,release()} methods also call the corresponding methods of
the associated lock.

Other methods must be called with the associated lock held.  The
@ref{1ca9,,wait()} method releases the lock, and then blocks until
another thread awakens it by calling @ref{1baa,,notify()} or
@ref{357,,notify_all()}.  Once awakened, @code{wait()}
re-acquires the lock and returns.  It is also possible to specify a timeout.

The @ref{1baa,,notify()} method wakes up one of the threads waiting for
the condition variable, if any are waiting.  The @ref{357,,notify_all()}
method wakes up all threads waiting for the condition variable.

Note: the @ref{1baa,,notify()} and @ref{357,,notify_all()} methods
don’t release the lock; this means that the thread or threads awakened will
not return from their @ref{1ca9,,wait()} call immediately, but only when
the thread that called @code{notify()} or @code{notify_all()}
finally relinquishes ownership of the lock.

The typical programming style using condition variables uses the lock to
synchronize access to some shared state; threads that are interested in a
particular change of state call @ref{1ca9,,wait()} repeatedly until they
see the desired state, while threads that modify the state call
@ref{1baa,,notify()} or @ref{357,,notify_all()} when they change
the state in such a way that it could possibly be a desired state for one
of the waiters.  For example, the following code is a generic
producer-consumer situation with unlimited buffer capacity:

@example
# Consume one item
with cv:
    while not an_item_is_available():
        cv.wait()
    get_an_available_item()

# Produce one item
with cv:
    make_an_item_available()
    cv.notify()
@end example

The @code{while} loop checking for the application’s condition is necessary
because @ref{1ca9,,wait()} can return after an arbitrary long time,
and the condition which prompted the @ref{1baa,,notify()} call may
no longer hold true.  This is inherent to multi-threaded programming.  The
@ref{36a7,,wait_for()} method can be used to automate the condition
checking, and eases the computation of timeouts:

@example
# Consume an item
with cv:
    cv.wait_for(an_item_is_available)
    get_an_available_item()
@end example

To choose between @ref{1baa,,notify()} and @ref{357,,notify_all()},
consider whether one state change can be interesting for only one or several
waiting threads.  E.g. in a typical producer-consumer situation, adding one
item to the buffer only needs to wake up one consumer thread.

@geindex Condition (class in threading)
@anchor{library/threading threading Condition}@anchor{1361}
@deffn {Class} threading.Condition (lock=None)

This class implements condition variable objects.  A condition variable
allows one or more threads to wait until they are notified by another thread.

If the `lock' argument is given and not @code{None}, it must be a @ref{1a39,,Lock}
or @ref{32c,,RLock} object, and it is used as the underlying lock.  Otherwise,
a new @code{RLock} object is created and used as the underlying lock.


Changed in version 3.3: changed from a factory function to a class.


@geindex acquire() (threading.Condition method)
@anchor{library/threading threading Condition acquire}@anchor{36a5}
@deffn {Method} acquire (*args)

Acquire the underlying lock. This method calls the corresponding method on
the underlying lock; the return value is whatever that method returns.
@end deffn

@geindex release() (threading.Condition method)
@anchor{library/threading threading Condition release}@anchor{36a6}
@deffn {Method} release ()

Release the underlying lock. This method calls the corresponding method on
the underlying lock; there is no return value.
@end deffn

@geindex locked() (threading.Condition method)
@anchor{library/threading threading Condition locked}@anchor{36a8}
@deffn {Method} locked ()

Return a boolean indicating whether this object is locked right now.


Added in version 3.14.

@end deffn

@geindex wait() (threading.Condition method)
@anchor{library/threading threading Condition wait}@anchor{1ca9}
@deffn {Method} wait (timeout=None)

Wait until notified or until a timeout occurs. If the calling thread has
not acquired the lock when this method is called, a @ref{246,,RuntimeError} is
raised.

This method releases the underlying lock, and then blocks until it is
awakened by a @ref{1baa,,notify()} or @ref{357,,notify_all()} call for the same
condition variable in another thread, or until the optional timeout
occurs.  Once awakened or timed out, it re-acquires the lock and returns.

When the `timeout' argument is present and not @code{None}, it should be a
floating-point number specifying a timeout for the operation in seconds
(or fractions thereof).

When the underlying lock is an @ref{32c,,RLock}, it is not released using
its @ref{36a6,,release()} method, since this may not actually unlock the lock
when it was acquired multiple times recursively.  Instead, an internal
interface of the @code{RLock} class is used, which really unlocks it
even when it has been recursively acquired several times. Another internal
interface is then used to restore the recursion level when the lock is
reacquired.

The return value is @code{True} unless a given `timeout' expired, in which
case it is @code{False}.


Changed in version 3.2: Previously, the method always returned @code{None}.

@end deffn

@geindex wait_for() (threading.Condition method)
@anchor{library/threading threading Condition wait_for}@anchor{36a7}
@deffn {Method} wait_for (predicate, timeout=None)

Wait until a condition evaluates to true.  `predicate' should be a
callable which result will be interpreted as a boolean value.
A `timeout' may be provided giving the maximum time to wait.

This utility method may call @ref{1ca9,,wait()} repeatedly until the predicate
is satisfied, or until a timeout occurs. The return value is
the last return value of the predicate and will evaluate to
@code{False} if the method timed out.

Ignoring the timeout feature, calling this method is roughly equivalent to
writing:

@example
while not predicate():
    cv.wait()
@end example

Therefore, the same rules apply as with @ref{1ca9,,wait()}: The lock must be
held when called and is re-acquired on return.  The predicate is evaluated
with the lock held.


Added in version 3.2.

@end deffn

@geindex notify() (threading.Condition method)
@anchor{library/threading threading Condition notify}@anchor{1baa}
@deffn {Method} notify (n=1)

By default, wake up one thread waiting on this condition, if any.  If the
calling thread has not acquired the lock when this method is called, a
@ref{246,,RuntimeError} is raised.

This method wakes up at most `n' of the threads waiting for the condition
variable; it is a no-op if no threads are waiting.

The current implementation wakes up exactly `n' threads, if at least `n'
threads are waiting.  However, it’s not safe to rely on this behavior.
A future, optimized implementation may occasionally wake up more than
`n' threads.

Note: an awakened thread does not actually return from its @ref{1ca9,,wait()}
call until it can reacquire the lock.  Since @code{notify()} does not
release the lock, its caller should.
@end deffn

@geindex notify_all() (threading.Condition method)
@anchor{library/threading threading Condition notify_all}@anchor{357}
@deffn {Method} notify_all ()

Wake up all threads waiting on this condition.  This method acts like
@ref{1baa,,notify()}, but wakes up all waiting threads instead of one. If the
calling thread has not acquired the lock when this method is called, a
@ref{246,,RuntimeError} is raised.

The method @code{notifyAll} is a deprecated alias for this method.
@end deffn
@end deffn

@node Semaphore objects,Semaphore example,Condition objects,Reference<2>
@anchor{library/threading id5}@anchor{36a9}@anchor{library/threading semaphore-objects}@anchor{36aa}
@subsubsection Semaphore objects


This is one of the oldest synchronization primitives in the history of computer
science, invented by the early Dutch computer scientist Edsger W. Dijkstra (he
used the names @code{P()} and @code{V()} instead of @ref{145f,,acquire()} and
@ref{36ab,,release()}).

A semaphore manages an internal counter which is decremented by each
@ref{145f,,acquire()} call and incremented by each @ref{36ab,,release()}
call.  The counter can never go below zero; when @code{acquire()}
finds that it is zero, it blocks, waiting until some other thread calls
@code{release()}.

Semaphores also support the @ref{369e,,context management protocol}.

@geindex Semaphore (class in threading)
@anchor{library/threading threading Semaphore}@anchor{1362}
@deffn {Class} threading.Semaphore (value=1)

This class implements semaphore objects.  A semaphore manages an atomic
counter representing the number of @ref{36ab,,release()} calls minus the number of
@ref{145f,,acquire()} calls, plus an initial value.  The @code{acquire()} method
blocks if necessary until it can return without making the counter negative.
If not given, `value' defaults to 1.

The optional argument gives the initial `value' for the internal counter; it
defaults to @code{1}. If the `value' given is less than 0, @ref{2ee,,ValueError} is
raised.


Changed in version 3.3: changed from a factory function to a class.


@geindex acquire() (threading.Semaphore method)
@anchor{library/threading threading Semaphore acquire}@anchor{145f}
@deffn {Method} acquire (blocking=True, timeout=None)

Acquire a semaphore.

When invoked without arguments:


@itemize *

@item 
If the internal counter is larger than zero on entry, decrement it by
one and return @code{True} immediately.

@item 
If the internal counter is zero on entry, block until awoken by a call to
@ref{36ab,,release()}.  Once awoken (and the counter is greater
than 0), decrement the counter by 1 and return @code{True}.  Exactly one
thread will be awoken by each call to @code{release()}.  The
order in which threads are awoken should not be relied on.
@end itemize

When invoked with `blocking' set to @code{False}, do not block.  If a call
without an argument would block, return @code{False} immediately; otherwise, do
the same thing as when called without arguments, and return @code{True}.

When invoked with a `timeout' other than @code{None}, it will block for at
most `timeout' seconds.  If acquire does not complete successfully in
that interval, return @code{False}.  Return @code{True} otherwise.


Changed in version 3.2: The `timeout' parameter is new.

@end deffn

@geindex release() (threading.Semaphore method)
@anchor{library/threading threading Semaphore release}@anchor{36ab}
@deffn {Method} release (n=1)

Release a semaphore, incrementing the internal counter by `n'.  When it
was zero on entry and other threads are waiting for it to become larger
than zero again, wake up `n' of those threads.


Changed in version 3.9: Added the `n' parameter to release multiple waiting threads at once.

@end deffn
@end deffn

@geindex BoundedSemaphore (class in threading)
@anchor{library/threading threading BoundedSemaphore}@anchor{1363}
@deffn {Class} threading.BoundedSemaphore (value=1)

Class implementing bounded semaphore objects.  A bounded semaphore checks to
make sure its current value doesn’t exceed its initial value.  If it does,
@ref{2ee,,ValueError} is raised. In most situations semaphores are used to guard
resources with limited capacity.  If the semaphore is released too many times
it’s a sign of a bug.  If not given, `value' defaults to 1.


Changed in version 3.3: changed from a factory function to a class.

@end deffn

@node Semaphore example,Event objects,Semaphore objects,Reference<2>
@anchor{library/threading semaphore-example}@anchor{36ac}@anchor{library/threading semaphore-examples}@anchor{36ad}
@subsubsection @code{Semaphore} example


Semaphores are often used to guard resources with limited capacity, for example,
a database server.  In any situation where the size of the resource is fixed,
you should use a bounded semaphore.  Before spawning any worker threads, your
main thread would initialize the semaphore:

@example
maxconnections = 5
# ...
pool_sema = BoundedSemaphore(value=maxconnections)
@end example

Once spawned, worker threads call the semaphore’s acquire and release methods
when they need to connect to the server:

@example
with pool_sema:
    conn = connectdb()
    try:
        # ... use connection ...
    finally:
        conn.close()
@end example

The use of a bounded semaphore reduces the chance that a programming error which
causes the semaphore to be released more than it’s acquired will go undetected.

@node Event objects,Timer objects,Semaphore example,Reference<2>
@anchor{library/threading event-objects}@anchor{36ae}@anchor{library/threading id6}@anchor{36af}
@subsubsection Event objects


This is one of the simplest mechanisms for communication between threads: one
thread signals an event and other threads wait for it.

An event object manages an internal flag that can be set to true with the
@ref{36b0,,set()} method and reset to false with the @ref{36b1,,clear()}
method.  The @ref{1532,,wait()} method blocks until the flag is true.

@geindex Event (class in threading)
@anchor{library/threading threading Event}@anchor{1364}
@deffn {Class} threading.Event

Class implementing event objects.  An event manages a flag that can be set to
true with the @ref{36b0,,set()} method and reset to false with the
@ref{36b1,,clear()} method.  The @ref{1532,,wait()} method blocks until the flag is true.
The flag is initially false.


Changed in version 3.3: changed from a factory function to a class.


@geindex is_set() (threading.Event method)
@anchor{library/threading threading Event is_set}@anchor{358}
@deffn {Method} is_set ()

Return @code{True} if and only if the internal flag is true.

The method @code{isSet} is a deprecated alias for this method.
@end deffn

@geindex set() (threading.Event method)
@anchor{library/threading threading Event set}@anchor{36b0}
@deffn {Method} set ()

Set the internal flag to true. All threads waiting for it to become true
are awakened. Threads that call @ref{1532,,wait()} once the flag is true will
not block at all.
@end deffn

@geindex clear() (threading.Event method)
@anchor{library/threading threading Event clear}@anchor{36b1}
@deffn {Method} clear ()

Reset the internal flag to false. Subsequently, threads calling
@ref{1532,,wait()} will block until @ref{36b0,,set()} is called to set the internal
flag to true again.
@end deffn

@geindex wait() (threading.Event method)
@anchor{library/threading threading Event wait}@anchor{1532}
@deffn {Method} wait (timeout=None)

Block as long as the internal flag is false and the timeout, if given,
has not expired. The return value represents the
reason that this blocking method returned; @code{True} if returning because
the internal flag is set to true, or @code{False} if a timeout is given and
the internal flag did not become true within the given wait time.

When the timeout argument is present and not @code{None}, it should be a
floating-point number specifying a timeout for the operation in seconds,
or fractions thereof.


Changed in version 3.1: Previously, the method always returned @code{None}.

@end deffn
@end deffn

@node Timer objects,Barrier objects,Event objects,Reference<2>
@anchor{library/threading id7}@anchor{36b2}@anchor{library/threading timer-objects}@anchor{36b3}
@subsubsection Timer objects


This class represents an action that should be run only after a certain amount
of time has passed — a timer.  @ref{1365,,Timer} is a subclass of @ref{177,,Thread}
and as such also functions as an example of creating custom threads.

Timers are started, as with threads, by calling their @ref{179,,Timer.start}
method.  The timer can be stopped (before its action has begun) by calling the
@ref{36b4,,cancel()} method.  The interval the timer will wait before
executing its action may not be exactly the same as the interval specified by
the user.

For example:

@example
def hello():
    print("hello, world")

t = Timer(30.0, hello)
t.start()  # after 30 seconds, "hello, world" will be printed
@end example

@geindex Timer (class in threading)
@anchor{library/threading threading Timer}@anchor{1365}
@deffn {Class} threading.Timer (interval, function, args=None, kwargs=None)

Create a timer that will run `function' with arguments `args' and  keyword
arguments `kwargs', after `interval' seconds have passed.
If `args' is @code{None} (the default) then an empty list will be used.
If `kwargs' is @code{None} (the default) then an empty dict will be used.


Changed in version 3.3: changed from a factory function to a class.


@geindex cancel() (threading.Timer method)
@anchor{library/threading threading Timer cancel}@anchor{36b4}
@deffn {Method} cancel ()

Stop the timer, and cancel the execution of the timer’s action.  This will
only work if the timer is still in its waiting stage.
@end deffn
@end deffn

@node Barrier objects,,Timer objects,Reference<2>
@anchor{library/threading barrier-objects}@anchor{36b5}
@subsubsection Barrier objects



Added in version 3.2.


This class provides a simple synchronization primitive for use by a fixed number
of threads that need to wait for each other.  Each of the threads tries to pass
the barrier by calling the @ref{36b6,,wait()} method and will block until
all of the threads have made their @code{wait()} calls. At this point,
the threads are released simultaneously.

The barrier can be reused any number of times for the same number of threads.

As an example, here is a simple way to synchronize a client and server thread:

@example
b = Barrier(2, timeout=5)

def server():
    start_server()
    b.wait()
    while True:
        connection = accept_connection()
        process_server_connection(connection)

def client():
    b.wait()
    while True:
        connection = make_connection()
        process_client_connection(connection)
@end example

@geindex Barrier (class in threading)
@anchor{library/threading threading Barrier}@anchor{13ef}
@deffn {Class} threading.Barrier (parties, action=None, timeout=None)

Create a barrier object for `parties' number of threads.  An `action', when
provided, is a callable to be called by one of the threads when they are
released.  `timeout' is the default timeout value if none is specified for
the @ref{36b6,,wait()} method.

@geindex wait() (threading.Barrier method)
@anchor{library/threading threading Barrier wait}@anchor{36b6}
@deffn {Method} wait (timeout=None)

Pass the barrier.  When all the threads party to the barrier have called
this function, they are all released simultaneously.  If a `timeout' is
provided, it is used in preference to any that was supplied to the class
constructor.

The return value is an integer in the range 0 to `parties' – 1, different
for each thread.  This can be used to select a thread to do some special
housekeeping, e.g.:

@example
i = barrier.wait()
if i == 0:
    # Only one thread needs to print this
    print("passed the barrier")
@end example

If an `action' was provided to the constructor, one of the threads will
have called it prior to being released.  Should this call raise an error,
the barrier is put into the broken state.

If the call times out, the barrier is put into the broken state.

This method may raise a @ref{13f1,,BrokenBarrierError} exception if the
barrier is broken or reset while a thread is waiting.
@end deffn

@geindex reset() (threading.Barrier method)
@anchor{library/threading threading Barrier reset}@anchor{36b7}
@deffn {Method} reset ()

Return the barrier to the default, empty state.  Any threads waiting on it
will receive the @ref{13f1,,BrokenBarrierError} exception.

Note that using this function may require some external
synchronization if there are other threads whose state is unknown.  If a
barrier is broken it may be better to just leave it and create a new one.
@end deffn

@geindex abort() (threading.Barrier method)
@anchor{library/threading threading Barrier abort}@anchor{36b8}
@deffn {Method} abort ()

Put the barrier into a broken state.  This causes any active or future
calls to @ref{36b6,,wait()} to fail with the @ref{13f1,,BrokenBarrierError}.  Use
this for example if one of the threads needs to abort, to avoid deadlocking the
application.

It may be preferable to simply create the barrier with a sensible
`timeout' value to automatically guard against one of the threads going
awry.
@end deffn

@geindex parties (threading.Barrier attribute)
@anchor{library/threading threading Barrier parties}@anchor{36b9}
@deffn {Attribute} parties

The number of threads required to pass the barrier.
@end deffn

@geindex n_waiting (threading.Barrier attribute)
@anchor{library/threading threading Barrier n_waiting}@anchor{36ba}
@deffn {Attribute} n_waiting

The number of threads currently waiting in the barrier.
@end deffn

@geindex broken (threading.Barrier attribute)
@anchor{library/threading threading Barrier broken}@anchor{36bb}
@deffn {Attribute} broken

A boolean that is @code{True} if the barrier is in the broken state.
@end deffn
@end deffn

@geindex BrokenBarrierError
@anchor{library/threading threading BrokenBarrierError}@anchor{13f1}
@deffn {Exception} threading.BrokenBarrierError

This exception, a subclass of @ref{246,,RuntimeError}, is raised when the
@ref{13ef,,Barrier} object is reset or broken.
@end deffn

@node Using locks conditions and semaphores in the with statement,,Reference<2>,threading — Thread-based parallelism
@anchor{library/threading using-locks-conditions-and-semaphores-in-the-with-statement}@anchor{36bc}@anchor{library/threading with-locks}@anchor{369e}
@subsubsection Using locks, conditions, and semaphores in the @code{with} statement


All of the objects provided by this module that have @code{acquire} and
@code{release} methods can be used as context managers for a @ref{187,,with}
statement.  The @code{acquire} method will be called when the block is
entered, and @code{release} will be called when the block is exited.  Hence,
the following snippet:

@example
with some_lock:
    # do something...
@end example

is equivalent to:

@example
some_lock.acquire()
try:
    # do something...
finally:
    some_lock.release()
@end example

Currently, @ref{1a39,,Lock}, @ref{32c,,RLock}, @ref{1361,,Condition},
@ref{1362,,Semaphore}, and @ref{1363,,BoundedSemaphore} objects may be used as
@ref{187,,with} statement context managers.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node multiprocessing — Process-based parallelism,multiprocessing shared_memory — Shared memory for direct access across processes,threading — Thread-based parallelism,Concurrent Execution
@anchor{library/multiprocessing doc}@anchor{36bd}@anchor{library/multiprocessing module-multiprocessing}@anchor{98}@anchor{library/multiprocessing multiprocessing-process-based-parallelism}@anchor{36be}@anchor{library/multiprocessing translation-repo}@anchor{36bf}
@subsection @code{multiprocessing} — Process-based parallelism


@geindex module; multiprocessing

`Source code:' Lib/multiprocessing/@footnote{https://github.com/python/cpython/tree/3.14/Lib/multiprocessing/}


__________________________________________________________________


@c include for modules that don't work on WASM or mobile platforms

@ref{2181,,Availability}: not Android, not iOS, not WASI.

This module is not supported on @ref{22a0,,mobile platforms}
or @ref{1bae,,WebAssembly platforms}.

@menu
* Introduction: Introduction<9>. 
* Reference: Reference<3>. 
* Programming guidelines:: 
* Examples: Examples<15>. 

@end menu

@node Introduction<9>,Reference<3>,,multiprocessing — Process-based parallelism
@anchor{library/multiprocessing introduction}@anchor{36c0}
@subsubsection Introduction


@code{multiprocessing} is a package that supports spawning processes using an
API similar to the @ref{f3,,threading} module.  The @code{multiprocessing} package
offers both local and remote concurrency, effectively side-stepping the
@ref{474,,Global Interpreter Lock} by using
subprocesses instead of threads.  Due
to this, the @code{multiprocessing} module allows the programmer to fully
leverage multiple processors on a given machine.  It runs on both POSIX and
Windows.

The @code{multiprocessing} module also introduces the
@ref{1171,,Pool} object which offers a convenient means of
parallelizing the execution of a function across multiple input values,
distributing the input data across processes (data parallelism).  The following
example demonstrates the common practice of defining such functions in a module
so that child processes can successfully import that module.  This basic example
of data parallelism using @code{Pool},

@example
from multiprocessing import Pool

def f(x):
    return x*x

if __name__ == '__main__':
    with Pool(5) as p:
        print(p.map(f, [1, 2, 3]))
@end example

will print to standard output

@example
[1, 4, 9]
@end example

The @code{multiprocessing} module also introduces APIs which do not have
analogs in the @ref{f3,,threading} module, like the ability to @ref{18a0,,terminate}, @ref{253,,interrupt} or @ref{d55,,kill} a running process.


@subsubheading See also


@ref{1d8,,concurrent.futures.ProcessPoolExecutor} offers a higher level interface
to push tasks to a background process without blocking execution of the
calling process. Compared to using the @ref{1171,,Pool}
interface directly, the @ref{24,,concurrent.futures} API more readily allows
the submission of work to the underlying process pool to be separated from
waiting for the results.


@menu
* The Process class:: 
* Contexts and start methods:: 
* Exchanging objects between processes:: 
* Synchronization between processes:: 
* Sharing state between processes:: 
* Using a pool of workers:: 

@end menu

@node The Process class,Contexts and start methods,,Introduction<9>
@anchor{library/multiprocessing the-process-class}@anchor{36c1}
@subsubsection The @code{Process} class


In @code{multiprocessing}, processes are spawned by creating a @ref{254,,Process}
object and then calling its @ref{159d,,start()} method.  @code{Process}
follows the API of @ref{177,,threading.Thread}.  A trivial example of a
multiprocess program is

@example
from multiprocessing import Process

def f(name):
    print('hello', name)

if __name__ == '__main__':
    p = Process(target=f, args=('bob',))
    p.start()
    p.join()
@end example

To show the individual process IDs involved, here is an expanded example:

@example
from multiprocessing import Process
import os

def info(title):
    print(title)
    print('module name:', __name__)
    print('parent process:', os.getppid())
    print('process id:', os.getpid())

def f(name):
    info('function f')
    print('hello', name)

if __name__ == '__main__':
    info('main line')
    p = Process(target=f, args=('bob',))
    p.start()
    p.join()
@end example

For an explanation of why the @code{if __name__ == '__main__'} part is
necessary, see @ref{36c2,,Programming guidelines}.

The arguments to @ref{254,,Process} usually need to be picklable so they can be
passed to the child process. If you tried typing the above example directly
into a REPL it could lead to an @ref{5f0,,AttributeError} in the child process
trying to locate the `f' function in the @code{__main__} module.

@node Contexts and start methods,Exchanging objects between processes,The Process class,Introduction<9>
@anchor{library/multiprocessing contexts-and-start-methods}@anchor{36c3}@anchor{library/multiprocessing multiprocessing-start-methods}@anchor{1d7}
@subsubsection Contexts and start methods


Depending on the platform, @code{multiprocessing} supports three ways
to start a process.  These `start methods' are

@quotation
@anchor{library/multiprocessing multiprocessing-start-method-spawn}@anchor{1da}

@table @asis

@item `spawn'

The parent process starts a fresh Python interpreter process.  The
child process will only inherit those resources necessary to run
the process object’s @ref{36c4,,run()} method.  In particular,
unnecessary file descriptors and handles from the parent process
will not be inherited.  Starting a process using this method is
rather slow compared to using `fork' or `forkserver'.

Available on POSIX and Windows platforms.  The default on Windows and macOS.
@end table
@anchor{library/multiprocessing multiprocessing-start-method-fork}@anchor{1d9}

@table @asis

@item `fork'

The parent process uses @ref{4b6,,os.fork()} to fork the Python
interpreter.  The child process, when it begins, is effectively
identical to the parent process.  All resources of the parent are
inherited by the child process.  Note that safely forking a
multithreaded process is problematic.

Available on POSIX systems.


Changed in version 3.14: This is no longer the default start method on any platform.
Code that requires `fork' must explicitly specify that via
@ref{24c,,get_context()} or @ref{24d,,set_start_method()}.



Changed in version 3.12: If Python is able to detect that your process has multiple threads, the
@ref{4b6,,os.fork()} function that this start method calls internally will
raise a @ref{1a4,,DeprecationWarning}. Use a different start method.
See the @code{os.fork()} documentation for further explanation.

@end table
@anchor{library/multiprocessing multiprocessing-start-method-forkserver}@anchor{1d6}

@table @asis

@item `forkserver'

When the program starts and selects the `forkserver' start method,
a server process is spawned.  From then on, whenever a new process
is needed, the parent process connects to the server and requests
that it fork a new process.  The fork server process is single threaded
unless system libraries or preloaded imports spawn threads as a
side-effect so it is generally safe for it to use @ref{4b6,,os.fork()}.
No unnecessary resources are inherited.

Available on POSIX platforms which support passing file descriptors over
Unix pipes such as Linux.  The default on those.


Changed in version 3.14: This became the default start method on POSIX platforms.

@end table
@end quotation


Changed in version 3.4: `spawn' added on all POSIX platforms, and `forkserver' added for
some POSIX platforms.
Child processes no longer inherit all of the parents inheritable
handles on Windows.



Changed in version 3.8: On macOS, the `spawn' start method is now the default.  The `fork' start
method should be considered unsafe as it can lead to crashes of the
subprocess as macOS system libraries may start threads. See bpo-33725@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33725}.



Changed in version 3.14: On POSIX platforms the default start method was changed from `fork' to
`forkserver' to retain the performance but avoid common multithreaded
process incompatibilities. See gh-84559@footnote{https://github.com/python/cpython/issues/84559}.


On POSIX using the `spawn' or `forkserver' start methods will also
start a `resource tracker' process which tracks the unlinked named
system resources (such as named semaphores or
@ref{1a1c,,SharedMemory} objects) created
by processes of the program.  When all processes
have exited the resource tracker unlinks any remaining tracked object.
Usually there should be none, but if a process was killed by a signal
there may be some “leaked” resources.  (Neither leaked semaphores nor shared
memory segments will be automatically unlinked until the next reboot. This is
problematic for both objects because the system allows only a limited number of
named semaphores, and shared memory segments occupy some space in the main
memory.)

To select a start method you use the @ref{24d,,set_start_method()} in
the @code{if __name__ == '__main__'} clause of the main module.  For
example:

@example
import multiprocessing as mp

def foo(q):
    q.put('hello')

if __name__ == '__main__':
    mp.set_start_method('spawn')
    q = mp.Queue()
    p = mp.Process(target=foo, args=(q,))
    p.start()
    print(q.get())
    p.join()
@end example

@ref{24d,,set_start_method()} should not be used more than once in the
program.

Alternatively, you can use @ref{24c,,get_context()} to obtain a context
object.  Context objects have the same API as the multiprocessing
module, and allow one to use multiple start methods in the same
program.

@example
import multiprocessing as mp

def foo(q):
    q.put('hello')

if __name__ == '__main__':
    ctx = mp.get_context('spawn')
    q = ctx.Queue()
    p = ctx.Process(target=foo, args=(q,))
    p.start()
    print(q.get())
    p.join()
@end example

Note that objects related to one context may not be compatible with
processes for a different context.  In particular, locks created using
the `fork' context cannot be passed to processes started using the
`spawn' or `forkserver' start methods.

Libraries using @code{multiprocessing} or
@ref{1d8,,ProcessPoolExecutor} should be designed to allow
their users to provide their own multiprocessing context.  Using a specific
context of your own within a library can lead to incompatibilities with the
rest of the library user’s application.  Always document if your library
requires a specific start method.

@cartouche
@quotation Warning 
The @code{'spawn'} and @code{'forkserver'} start methods generally cannot
be used with “frozen” executables (i.e., binaries produced by
packages like `PyInstaller' and `cx_Freeze') on POSIX systems.
The @code{'fork'} start method may work if code does not use threads.
@end quotation
@end cartouche

@node Exchanging objects between processes,Synchronization between processes,Contexts and start methods,Introduction<9>
@anchor{library/multiprocessing exchanging-objects-between-processes}@anchor{36c5}
@subsubsection Exchanging objects between processes


@code{multiprocessing} supports two types of communication channel between
processes:

`Queues'

@quotation

The @ref{1bcd,,Queue} class is a near clone of @ref{15a0,,queue.Queue}.  For
example:

@example
from multiprocessing import Process, Queue

def f(q):
    q.put([42, None, 'hello'])

if __name__ == '__main__':
    q = Queue()
    p = Process(target=f, args=(q,))
    p.start()
    print(q.get())    # prints "[42, None, 'hello']"
    p.join()
@end example

Queues are thread and process safe.
Any object put into a @code{multiprocessing} queue will be serialized.
@end quotation

`Pipes'

@quotation

The @ref{36c6,,Pipe()} function returns a pair of connection objects connected by a
pipe which by default is duplex (two-way).  For example:

@example
from multiprocessing import Process, Pipe

def f(conn):
    conn.send([42, None, 'hello'])
    conn.close()

if __name__ == '__main__':
    parent_conn, child_conn = Pipe()
    p = Process(target=f, args=(child_conn,))
    p.start()
    print(parent_conn.recv())   # prints "[42, None, 'hello']"
    p.join()
@end example

The two connection objects returned by @ref{36c6,,Pipe()} represent the two ends of
the pipe.  Each connection object has @code{send()} and
@code{recv()} methods (among others).  Note that data in a pipe
may become corrupted if two processes (or threads) try to read from or write
to the `same' end of the pipe at the same time.  Of course there is no risk
of corruption from processes using different ends of the pipe at the same
time.

The @code{send()} method serializes the object and
@code{recv()} re-creates the object.
@end quotation

@node Synchronization between processes,Sharing state between processes,Exchanging objects between processes,Introduction<9>
@anchor{library/multiprocessing synchronization-between-processes}@anchor{36c7}
@subsubsection Synchronization between processes


@code{multiprocessing} contains equivalents of all the synchronization
primitives from @ref{f3,,threading}.  For instance one can use a lock to ensure
that only one process prints to standard output at a time:

@example
from multiprocessing import Process, Lock

def f(l, i):
    l.acquire()
    try:
        print('hello world', i)
    finally:
        l.release()

if __name__ == '__main__':
    lock = Lock()

    for num in range(10):
        Process(target=f, args=(lock, num)).start()
@end example

Without using the lock output from the different processes is liable to get all
mixed up.

@node Sharing state between processes,Using a pool of workers,Synchronization between processes,Introduction<9>
@anchor{library/multiprocessing sharing-state-between-processes}@anchor{36c8}
@subsubsection Sharing state between processes


As mentioned above, when doing concurrent programming it is usually best to
avoid using shared state as far as possible.  This is particularly true when
using multiple processes.

However, if you really do need to use some shared data then
@code{multiprocessing} provides a couple of ways of doing so.

`Shared memory'

@quotation

Data can be stored in a shared memory map using @ref{36c9,,Value} or
@ref{36ca,,Array}.  For example, the following code

@example
from multiprocessing import Process, Value, Array

def f(n, a):
    n.value = 3.1415927
    for i in range(len(a)):
        a[i] = -a[i]

if __name__ == '__main__':
    num = Value('d', 0.0)
    arr = Array('i', range(10))

    p = Process(target=f, args=(num, arr))
    p.start()
    p.join()

    print(num.value)
    print(arr[:])
@end example

will print

@example
3.1415927
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
@end example

The @code{'d'} and @code{'i'} arguments used when creating @code{num} and @code{arr} are
typecodes of the kind used by the @ref{8,,array} module: @code{'d'} indicates a
double precision float and @code{'i'} indicates a signed integer.  These shared
objects will be process and thread-safe.

For more flexibility in using shared memory one can use the
@ref{9e,,multiprocessing.sharedctypes} module which supports the creation of
arbitrary ctypes objects allocated from shared memory.
@end quotation

`Server process'

@quotation

A manager object returned by @ref{252,,Manager()} controls a server process which
holds Python objects and allows other processes to manipulate them using
proxies.

A manager returned by @ref{252,,Manager()} will support types
@ref{24f,,list}, @ref{184,,dict}, @ref{185,,set}, @ref{36cb,,Namespace}, @ref{189c,,Lock},
@ref{189d,,RLock}, @ref{36cc,,Semaphore}, @ref{36cd,,BoundedSemaphore},
@ref{36ce,,Condition}, @ref{1c49,,Event}, @ref{36cf,,Barrier},
@ref{1bcd,,Queue}, @ref{36c9,,Value} and @ref{36ca,,Array}.  For example,

@example
from multiprocessing import Process, Manager

def f(d, l, s):
    d[1] = '1'
    d['2'] = 2
    d[0.25] = None
    l.reverse()
    s.add('a')
    s.add('b')

if __name__ == '__main__':
    with Manager() as manager:
        d = manager.dict()
        l = manager.list(range(10))
        s = manager.set()

        p = Process(target=f, args=(d, l, s))
        p.start()
        p.join()

        print(d)
        print(l)
        print(s)
@end example

will print

@example
@{0.25: None, 1: '1', '2': 2@}
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
@{'a', 'b'@}
@end example

Server process managers are more flexible than using shared memory objects
because they can be made to support arbitrary object types.  Also, a single
manager can be shared by processes on different computers over a network.
They are, however, slower than using shared memory.
@end quotation

@node Using a pool of workers,,Sharing state between processes,Introduction<9>
@anchor{library/multiprocessing using-a-pool-of-workers}@anchor{36d0}
@subsubsection Using a pool of workers


The @ref{1171,,Pool} class represents a pool of worker
processes.  It has methods which allows tasks to be offloaded to the worker
processes in a few different ways.

For example:

@example
from multiprocessing import Pool, TimeoutError
import time
import os

def f(x):
    return x*x

if __name__ == '__main__':
    # start 4 worker processes
    with Pool(processes=4) as pool:

        # print "[0, 1, 4,..., 81]"
        print(pool.map(f, range(10)))

        # print same numbers in arbitrary order
        for i in pool.imap_unordered(f, range(10)):
            print(i)

        # evaluate "f(20)" asynchronously
        res = pool.apply_async(f, (20,))      # runs in *only* one process
        print(res.get(timeout=1))             # prints "400"

        # evaluate "os.getpid()" asynchronously
        res = pool.apply_async(os.getpid, ()) # runs in *only* one process
        print(res.get(timeout=1))             # prints the PID of that process

        # launching multiple evaluations asynchronously *may* use more processes
        multiple_results = [pool.apply_async(os.getpid, ()) for i in range(4)]
        print([res.get(timeout=1) for res in multiple_results])

        # make a single worker sleep for 10 seconds
        res = pool.apply_async(time.sleep, (10,))
        try:
            print(res.get(timeout=1))
        except TimeoutError:
            print("We lacked patience and got a multiprocessing.TimeoutError")

        print("For the moment, the pool remains available for more work")

    # exiting the 'with'-block has stopped the pool
    print("Now the pool is closed and no longer available")
@end example

Note that the methods of a pool should only ever be used by the
process which created it.

@cartouche
@quotation Note 
Functionality within this package requires that the @code{__main__} module be
importable by the children. This is covered in @ref{36c2,,Programming guidelines}
however it is worth pointing out here. This means that some examples, such
as the @ref{1171,,multiprocessing.pool.Pool} examples will not work in the
interactive interpreter. For example:

@example
>>> from multiprocessing import Pool
>>> p = Pool(5)
>>> def f(x):
...     return x*x
...
>>> with p:
...     p.map(f, [1,2,3])
Process PoolWorker-1:
Process PoolWorker-2:
Process PoolWorker-3:
Traceback (most recent call last):
Traceback (most recent call last):
Traceback (most recent call last):
AttributeError: Can't get attribute 'f' on <module '__main__' (<class '_frozen_importlib.BuiltinImporter'>)>
AttributeError: Can't get attribute 'f' on <module '__main__' (<class '_frozen_importlib.BuiltinImporter'>)>
AttributeError: Can't get attribute 'f' on <module '__main__' (<class '_frozen_importlib.BuiltinImporter'>)>
@end example

(If you try this it will actually output three full tracebacks
interleaved in a semi-random fashion, and then you may have to
stop the parent process somehow.)
@end quotation
@end cartouche

@node Reference<3>,Programming guidelines,Introduction<9>,multiprocessing — Process-based parallelism
@anchor{library/multiprocessing reference}@anchor{36d1}
@subsubsection Reference


The @code{multiprocessing} package mostly replicates the API of the
@ref{f3,,threading} module.

@menu
* Global start method:: 
* Process and exceptions:: 
* Pipes and Queues:: 
* Miscellaneous: Miscellaneous<4>. 
* Connection Objects:: 
* Synchronization primitives:: 
* Shared ctypes Objects:: 
* Managers:: 
* Proxy Objects:: 
* Process Pools:: 
* Listeners and Clients:: 
* Authentication keys:: 
* Logging: Logging<2>. 
* The multiprocessing.dummy module: The multiprocessing dummy module. 

@end menu

@node Global start method,Process and exceptions,,Reference<3>
@anchor{library/multiprocessing global-start-method}@anchor{36d2}@anchor{library/multiprocessing id1}@anchor{36d3}
@subsubsection Global start method


Python supports several ways to create and initialize a process.
The global start method sets the default mechanism for creating a process.

Several multiprocessing functions and methods that may also instantiate
certain objects will implicitly set the global start method to the system’s default,
if it hasn’t been set already. The global start method can only be set once.
If you need to change the start method from the system default, you must
proactively set the global start method before calling functions or methods,
or creating these objects.

@node Process and exceptions,Pipes and Queues,Global start method,Reference<3>
@anchor{library/multiprocessing process-and-exceptions}@anchor{36d4}
@subsubsection @code{Process} and exceptions


@geindex Process (class in multiprocessing)
@anchor{library/multiprocessing multiprocessing Process}@anchor{254}
@deffn {Class} multiprocessing.Process (group=None, target=None, name=None, args=(), kwargs=@{@}, *, daemon=None)

Process objects represent activity that is run in a separate process. The
@code{Process} class has equivalents of all the methods of
@ref{177,,threading.Thread}.

The constructor should always be called with keyword arguments. `group'
should always be @code{None}; it exists solely for compatibility with
@ref{177,,threading.Thread}.  `target' is the callable object to be invoked by
the @ref{36c4,,run()} method.  It defaults to @code{None}, meaning nothing is
called. `name' is the process name (see @ref{36d5,,name} for more details).
`args' is the argument tuple for the target invocation.  `kwargs' is a
dictionary of keyword arguments for the target invocation.  If provided,
the keyword-only `daemon' argument sets the process @ref{36d6,,daemon} flag
to @code{True} or @code{False}.  If @code{None} (the default), this flag will be
inherited from the creating process.

By default, no arguments are passed to `target'. The `args' argument,
which defaults to @code{()}, can be used to specify a list or tuple of the arguments
to pass to `target'.

If a subclass overrides the constructor, it must make sure it invokes the
base class constructor (@code{super().__init__()}) before doing anything else
to the process.

@cartouche
@quotation Note 
In general, all arguments to @code{Process} must be picklable.  This is
frequently observed when trying to create a @code{Process} or use a
@ref{1d8,,concurrent.futures.ProcessPoolExecutor} from a REPL with a
locally defined `target' function.

Passing a callable object defined in the current REPL session causes the
child process to die via an uncaught @ref{5f0,,AttributeError} exception when
starting as `target' must have been defined within an importable module
in order to be loaded during unpickling.

Example of this uncatchable error from the child:

@example
>>> import multiprocessing as mp
>>> def knigit():
...     print("Ni!")
...
>>> process = mp.Process(target=knigit)
>>> process.start()
>>> Traceback (most recent call last):
  File ".../multiprocessing/spawn.py", line ..., in spawn_main
  File ".../multiprocessing/spawn.py", line ..., in _main
AttributeError: module '__main__' has no attribute 'knigit'
>>> process
<SpawnProcess name='SpawnProcess-1' pid=379473 parent=378707 stopped exitcode=1>
@end example

See @ref{36d7,,The spawn and forkserver start methods}.  While this restriction is
not true if using the @code{"fork"} start method, as of Python @code{3.14} that
is no longer the default on any platform.  See
@ref{1d7,,Contexts and start methods}.
See also gh-132898@footnote{https://github.com/python/cpython/issues/132898}.
@end quotation
@end cartouche


Changed in version 3.3: Added the `daemon' parameter.


@geindex run() (multiprocessing.Process method)
@anchor{library/multiprocessing multiprocessing Process run}@anchor{36c4}
@deffn {Method} run ()

Method representing the process’s activity.

You may override this method in a subclass.  The standard @code{run()}
method invokes the callable object passed to the object’s constructor as
the target argument, if any, with sequential and keyword arguments taken
from the `args' and `kwargs' arguments, respectively.

Using a list or tuple as the `args' argument passed to @code{Process}
achieves the same effect.

Example:

@example
>>> from multiprocessing import Process
>>> p = Process(target=print, args=[1])
>>> p.run()
1
>>> p = Process(target=print, args=(1,))
>>> p.run()
1
@end example
@end deffn

@geindex start() (multiprocessing.Process method)
@anchor{library/multiprocessing multiprocessing Process start}@anchor{159d}
@deffn {Method} start ()

Start the process’s activity.

This must be called at most once per process object.  It arranges for the
object’s @ref{36c4,,run()} method to be invoked in a separate process.
@end deffn

@geindex join() (multiprocessing.Process method)
@anchor{library/multiprocessing multiprocessing Process join}@anchor{159f}
@deffn {Method} join ([timeout])

If the optional argument `timeout' is @code{None} (the default), the method
blocks until the process whose @code{join()} method is called terminates.
If `timeout' is a positive number, it blocks at most `timeout' seconds.
Note that the method returns @code{None} if its process terminates or if the
method times out.  Check the process’s @ref{36d8,,exitcode} to determine if
it terminated.

A process can be joined many times.

A process cannot join itself because this would cause a deadlock.  It is
an error to attempt to join a process before it has been started.
@end deffn

@geindex name (multiprocessing.Process attribute)
@anchor{library/multiprocessing multiprocessing Process name}@anchor{36d5}
@deffn {Attribute} name

The process’s name.  The name is a string used for identification purposes
only.  It has no semantics.  Multiple processes may be given the same
name.

The initial name is set by the constructor.  If no explicit name is
provided to the constructor, a name of the form
‘Process-N@w{[1]}:N@w{[2]}:…:N@w{[k]}’ is constructed, where
each N@w{[k]} is the N-th child of its parent.
@end deffn

@geindex is_alive() (multiprocessing.Process method)
@anchor{library/multiprocessing multiprocessing Process is_alive}@anchor{159e}
@deffn {Method} is_alive ()

Return whether the process is alive.

Roughly, a process object is alive from the moment the @ref{159d,,start()}
method returns until the child process terminates.
@end deffn

@geindex daemon (multiprocessing.Process attribute)
@anchor{library/multiprocessing multiprocessing Process daemon}@anchor{36d6}
@deffn {Attribute} daemon

The process’s daemon flag, a Boolean value.  This must be set before
@ref{159d,,start()} is called.

The initial value is inherited from the creating process.

When a process exits, it attempts to terminate all of its daemonic child
processes.

Note that a daemonic process is not allowed to create child processes.
Otherwise a daemonic process would leave its children orphaned if it gets
terminated when its parent process exits. Additionally, these are `not'
Unix daemons or services, they are normal processes that will be
terminated (and not joined) if non-daemonic processes have exited.
@end deffn

In addition to the  @ref{177,,threading.Thread} API, @code{Process} objects
also support the following attributes and methods:

@geindex pid (multiprocessing.Process attribute)
@anchor{library/multiprocessing multiprocessing Process pid}@anchor{36d9}
@deffn {Attribute} pid

Return the process ID.  Before the process is spawned, this will be
@code{None}.
@end deffn

@geindex exitcode (multiprocessing.Process attribute)
@anchor{library/multiprocessing multiprocessing Process exitcode}@anchor{36d8}
@deffn {Attribute} exitcode

The child’s exit code.  This will be @code{None} if the process has not yet
terminated.

If the child’s @ref{36c4,,run()} method returned normally, the exit code
will be 0.  If it terminated via @ref{279,,sys.exit()} with an integer
argument `N', the exit code will be `N'.

If the child terminated due to an exception not caught within
@ref{36c4,,run()}, the exit code will be 1.  If it was terminated by
signal `N', the exit code will be the negative value `-N'.
@end deffn

@geindex authkey (multiprocessing.Process attribute)
@anchor{library/multiprocessing multiprocessing Process authkey}@anchor{36da}
@deffn {Attribute} authkey

The process’s authentication key (a byte string).

When @code{multiprocessing} is initialized the main process is assigned a
random string using @ref{747,,os.urandom()}.

When a @code{Process} object is created, it will inherit the
authentication key of its parent process, although this may be changed by
setting @ref{36da,,authkey} to another byte string.

See @ref{36db,,Authentication keys}.
@end deffn

@geindex sentinel (multiprocessing.Process attribute)
@anchor{library/multiprocessing multiprocessing Process sentinel}@anchor{12ed}
@deffn {Attribute} sentinel

A numeric handle of a system object which will become “ready” when
the process ends.

You can use this value if you want to wait on several events at
once using @ref{12eb,,multiprocessing.connection.wait()}.  Otherwise
calling @ref{159f,,join()} is simpler.

On Windows, this is an OS handle usable with the @code{WaitForSingleObject}
and @code{WaitForMultipleObjects} family of API calls.  On POSIX, this is
a file descriptor usable with primitives from the @ref{c6,,select} module.


Added in version 3.3.

@end deffn

@geindex interrupt() (multiprocessing.Process method)
@anchor{library/multiprocessing multiprocessing Process interrupt}@anchor{253}
@deffn {Method} interrupt ()

Terminate the process. Works on POSIX using the @ref{255,,SIGINT} signal.
Behavior on Windows is undefined.

By default, this terminates the child process by raising @ref{bcb,,KeyboardInterrupt}.
This behavior can be altered by setting the respective signal handler in the child
process @ref{1340,,signal.signal()} for @ref{255,,SIGINT}.

Note: if the child process catches and discards @ref{bcb,,KeyboardInterrupt}, the
process will not be terminated.

Note: the default behavior will also set @ref{36d8,,exitcode} to @code{1} as if an
uncaught exception was raised in the child process. To have a different
@code{exitcode} you may simply catch @ref{bcb,,KeyboardInterrupt} and call
@code{exit(your_code)}.


Added in version 3.14.

@end deffn

@geindex terminate() (multiprocessing.Process method)
@anchor{library/multiprocessing multiprocessing Process terminate}@anchor{18a0}
@deffn {Method} terminate ()

Terminate the process.  On POSIX this is done using the @ref{15eb,,SIGTERM} signal;
on Windows @code{TerminateProcess()} is used.  Note that exit handlers and
finally clauses, etc., will not be executed.

Note that descendant processes of the process will `not' be terminated –
they will simply become orphaned.

@cartouche
@quotation Warning 
If this method is used when the associated process is using a pipe or
queue then the pipe or queue is liable to become corrupted and may
become unusable by other process.  Similarly, if the process has
acquired a lock or semaphore etc. then terminating it is liable to
cause other processes to deadlock.
@end quotation
@end cartouche
@end deffn

@geindex kill() (multiprocessing.Process method)
@anchor{library/multiprocessing multiprocessing Process kill}@anchor{d55}
@deffn {Method} kill ()

Same as @ref{18a0,,terminate()} but using the @code{SIGKILL} signal on POSIX.


Added in version 3.7.

@end deffn

@geindex close() (multiprocessing.Process method)
@anchor{library/multiprocessing multiprocessing Process close}@anchor{d54}
@deffn {Method} close ()

Close the @code{Process} object, releasing all resources associated
with it.  @ref{2ee,,ValueError} is raised if the underlying process
is still running.  Once @code{close()} returns successfully, most
other methods and attributes of the @code{Process} object will
raise @code{ValueError}.


Added in version 3.7.

@end deffn

Note that the @ref{159d,,start()}, @ref{159f,,join()}, @ref{159e,,is_alive()},
@ref{18a0,,terminate()} and @ref{36d8,,exitcode} methods should only be called by
the process that created the process object.

Example usage of some of the methods of @code{Process}:

@example
>>> import multiprocessing, time, signal
>>> mp_context = multiprocessing.get_context('spawn')
>>> p = mp_context.Process(target=time.sleep, args=(1000,))
>>> print(p, p.is_alive())
<...Process ... initial> False
>>> p.start()
>>> print(p, p.is_alive())
<...Process ... started> True
>>> p.terminate()
>>> time.sleep(0.1)
>>> print(p, p.is_alive())
<...Process ... stopped exitcode=-SIGTERM> False
>>> p.exitcode == -signal.SIGTERM
True
@end example
@end deffn

@geindex ProcessError
@anchor{library/multiprocessing multiprocessing ProcessError}@anchor{36dc}
@deffn {Exception} multiprocessing.ProcessError

The base class of all @code{multiprocessing} exceptions.
@end deffn

@geindex BufferTooShort
@anchor{library/multiprocessing multiprocessing BufferTooShort}@anchor{36dd}
@deffn {Exception} multiprocessing.BufferTooShort

Exception raised by @code{Connection.recv_bytes_into()} when the supplied
buffer object is too small for the message read.

If @code{e} is an instance of @code{BufferTooShort} then @code{e.args[0]} will give
the message as a byte string.
@end deffn

@geindex AuthenticationError
@anchor{library/multiprocessing multiprocessing AuthenticationError}@anchor{36de}
@deffn {Exception} multiprocessing.AuthenticationError

Raised when there is an authentication error.
@end deffn

@geindex TimeoutError
@anchor{library/multiprocessing multiprocessing TimeoutError}@anchor{36df}
@deffn {Exception} multiprocessing.TimeoutError

Raised by methods with a timeout when the timeout expires.
@end deffn

@node Pipes and Queues,Miscellaneous<4>,Process and exceptions,Reference<3>
@anchor{library/multiprocessing pipes-and-queues}@anchor{36e0}
@subsubsection Pipes and Queues


When using multiple processes, one generally uses message passing for
communication between processes and avoids having to use any synchronization
primitives like locks.

For passing messages one can use @ref{36c6,,Pipe()} (for a connection between two
processes) or a queue (which allows multiple producers and consumers).

The @ref{1bcd,,Queue}, @ref{b16,,SimpleQueue} and @ref{36e1,,JoinableQueue} types
are multi-producer, multi-consumer @abbr{FIFO}
queues modelled on the @ref{15a0,,queue.Queue} class in the
standard library.  They differ in that @code{Queue} lacks the
@ref{36e2,,task_done()} and @ref{36e3,,join()} methods introduced
into Python 2.5’s @code{queue.Queue} class.

If you use @ref{36e1,,JoinableQueue} then you `must' call
@ref{36e4,,JoinableQueue.task_done()} for each task removed from the queue or else the
semaphore used to count the number of unfinished tasks may eventually overflow,
raising an exception.

One difference from other Python queue implementations, is that @code{multiprocessing}
queues serializes all objects that are put into them using @ref{ab,,pickle}.
The object returned by the get method is a re-created object that does not share
memory with the original object.

Note that one can also create a shared queue by using a manager object – see
@ref{36e5,,Managers}.

@cartouche
@quotation Note 
@code{multiprocessing} uses the usual @ref{36e6,,queue.Empty} and
@ref{36e7,,queue.Full} exceptions to signal a timeout.  They are not available in
the @code{multiprocessing} namespace so you need to import them from
@ref{bb,,queue}.
@end quotation
@end cartouche

@cartouche
@quotation Note 
When an object is put on a queue, the object is pickled and a
background thread later flushes the pickled data to an underlying
pipe.  This has some consequences which are a little surprising,
but should not cause any practical difficulties – if they really
bother you then you can instead use a queue created with a
@ref{36e5,,manager}.


@enumerate 

@item 
After putting an object on an empty queue there may be an
infinitesimal delay before the queue’s @ref{19ac,,empty()}
method returns @ref{d31,,False} and @ref{36e8,,get_nowait()} can
return without raising @ref{36e6,,queue.Empty}.

@item 
If multiple processes are enqueuing objects, it is possible for
the objects to be received at the other end out-of-order.
However, objects enqueued by the same process will always be in
the expected order with respect to each other.
@end enumerate
@end quotation
@end cartouche

@cartouche
@quotation Warning 
If a process is killed using @ref{18a0,,Process.terminate()} or @ref{1573,,os.kill()}
while it is trying to use a @ref{1bcd,,Queue}, then the data in the queue is
likely to become corrupted.  This may cause any other process to get an
exception when it tries to use the queue later on.
@end quotation
@end cartouche

@cartouche
@quotation Warning 
As mentioned above, if a child process has put items on a queue (and it has
not used @ref{36e9,,JoinableQueue.cancel_join_thread}), then that process will
not terminate until all buffered items have been flushed to the pipe.

This means that if you try joining that process you may get a deadlock unless
you are sure that all items which have been put on the queue have been
consumed.  Similarly, if the child process is non-daemonic then the parent
process may hang on exit when it tries to join all its non-daemonic children.

Note that a queue created using a manager does not have this issue.  See
@ref{36c2,,Programming guidelines}.
@end quotation
@end cartouche

For an example of the usage of queues for interprocess communication see
@ref{36ea,,Examples}.

@geindex Pipe() (in module multiprocessing)
@anchor{library/multiprocessing multiprocessing Pipe}@anchor{36c6}
@deffn {Function} multiprocessing.Pipe (duplex=True)

Returns a pair @code{(conn1, conn2)} of
@ref{12ec,,Connection} objects representing the
ends of a pipe.

If `duplex' is @code{True} (the default) then the pipe is bidirectional.  If
`duplex' is @code{False} then the pipe is unidirectional: @code{conn1} can only be
used for receiving messages and @code{conn2} can only be used for sending
messages.

The @code{send()} method serializes the object using
@ref{ab,,pickle} and the @code{recv()} re-creates the object.
@end deffn

@geindex Queue (class in multiprocessing)
@anchor{library/multiprocessing multiprocessing Queue}@anchor{1bcd}
@deffn {Class} multiprocessing.Queue ([maxsize])

Returns a process shared queue implemented using a pipe and a few
locks/semaphores.  When a process first puts an item on the queue a feeder
thread is started which transfers objects from a buffer into the pipe.

Instantiating this class may set the global start method. See
@ref{36d2,,Global start method} for more details.

The usual @ref{36e6,,queue.Empty} and @ref{36e7,,queue.Full} exceptions from the
standard library’s @ref{bb,,queue} module are raised to signal timeouts.

@code{Queue} implements all the methods of @ref{15a0,,queue.Queue} except for
@ref{36e2,,task_done()}, @ref{36e3,,join()}, and
@ref{543,,shutdown()}.

@geindex qsize() (multiprocessing.Queue method)
@anchor{library/multiprocessing multiprocessing Queue qsize}@anchor{36eb}
@deffn {Method} qsize ()

Return the approximate size of the queue.  Because of
multithreading/multiprocessing semantics, this number is not reliable.

Note that this may raise @ref{369,,NotImplementedError} on platforms like
macOS where @code{sem_getvalue()} is not implemented.
@end deffn

@geindex empty() (multiprocessing.Queue method)
@anchor{library/multiprocessing multiprocessing Queue empty}@anchor{19ac}
@deffn {Method} empty ()

Return @code{True} if the queue is empty, @code{False} otherwise.  Because of
multithreading/multiprocessing semantics, this is not reliable.

May raise an @ref{2c2,,OSError} on closed queues. (not guaranteed)
@end deffn

@geindex full() (multiprocessing.Queue method)
@anchor{library/multiprocessing multiprocessing Queue full}@anchor{36ec}
@deffn {Method} full ()

Return @code{True} if the queue is full, @code{False} otherwise.  Because of
multithreading/multiprocessing semantics, this is not reliable.
@end deffn

@geindex put() (multiprocessing.Queue method)
@anchor{library/multiprocessing multiprocessing Queue put}@anchor{1e5f}
@deffn {Method} put (obj[, block[, timeout]])

Put obj into the queue.  If the optional argument `block' is @code{True}
(the default) and `timeout' is @code{None} (the default), block if necessary until
a free slot is available.  If `timeout' is a positive number, it blocks at
most `timeout' seconds and raises the @ref{36e7,,queue.Full} exception if no
free slot was available within that time.  Otherwise (`block' is
@code{False}), put an item on the queue if a free slot is immediately
available, else raise the @code{queue.Full} exception (`timeout' is
ignored in that case).


Changed in version 3.8: If the queue is closed, @ref{2ee,,ValueError} is raised instead of
@ref{8ba,,AssertionError}.

@end deffn

@geindex put_nowait() (multiprocessing.Queue method)
@anchor{library/multiprocessing multiprocessing Queue put_nowait}@anchor{36ed}
@deffn {Method} put_nowait (obj)

Equivalent to @code{put(obj, False)}.
@end deffn

@geindex get() (multiprocessing.Queue method)
@anchor{library/multiprocessing multiprocessing Queue get}@anchor{1e60}
@deffn {Method} get ([block[, timeout]])

Remove and return an item from the queue.  If optional args `block' is
@code{True} (the default) and `timeout' is @code{None} (the default), block if
necessary until an item is available.  If `timeout' is a positive number,
it blocks at most `timeout' seconds and raises the @ref{36e6,,queue.Empty}
exception if no item was available within that time.  Otherwise (block is
@code{False}), return an item if one is immediately available, else raise the
@code{queue.Empty} exception (`timeout' is ignored in that case).


Changed in version 3.8: If the queue is closed, @ref{2ee,,ValueError} is raised instead of
@ref{2c2,,OSError}.

@end deffn

@geindex get_nowait() (multiprocessing.Queue method)
@anchor{library/multiprocessing multiprocessing Queue get_nowait}@anchor{36e8}
@deffn {Method} get_nowait ()

Equivalent to @code{get(False)}.
@end deffn

@code{multiprocessing.Queue} has a few additional methods not found in
@ref{15a0,,queue.Queue}.  These methods are usually unnecessary for most
code:

@geindex close() (multiprocessing.Queue method)
@anchor{library/multiprocessing multiprocessing Queue close}@anchor{1bce}
@deffn {Method} close ()

Close the queue: release internal resources.

A queue must not be used anymore after it is closed. For example,
@ref{1e60,,get()}, @ref{1e5f,,put()} and @ref{19ac,,empty()}
methods must no longer be called.

The background thread will quit once it has flushed all buffered
data to the pipe.  This is called automatically when the queue is garbage
collected.
@end deffn

@geindex join_thread() (multiprocessing.Queue method)
@anchor{library/multiprocessing multiprocessing Queue join_thread}@anchor{36ee}
@deffn {Method} join_thread ()

Join the background thread.  This can only be used after @ref{1bce,,close()} has
been called.  It blocks until the background thread exits, ensuring that
all data in the buffer has been flushed to the pipe.

By default if a process is not the creator of the queue then on exit it
will attempt to join the queue’s background thread.  The process can call
@ref{36e9,,cancel_join_thread()} to make @code{join_thread()} do nothing.
@end deffn

@geindex cancel_join_thread() (multiprocessing.Queue method)
@anchor{library/multiprocessing multiprocessing Queue cancel_join_thread}@anchor{36e9}
@deffn {Method} cancel_join_thread ()

Prevent @ref{36ee,,join_thread()} from blocking.  In particular, this prevents
the background thread from being joined automatically when the process
exits – see @code{join_thread()}.

A better name for this method might be
@code{allow_exit_without_flush()}.  It is likely to cause enqueued
data to be lost, and you almost certainly will not need to use it.
It is really only there if you need the current process to exit
immediately without waiting to flush enqueued data to the
underlying pipe, and you don’t care about lost data.
@end deffn

@cartouche
@quotation Note 
This class’s functionality requires a functioning shared semaphore
implementation on the host operating system. Without one, the
functionality in this class will be disabled, and attempts to
instantiate a @code{Queue} will result in an @ref{65b,,ImportError}. See
bpo-3770@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3770} for additional information.  The same holds true for any
of the specialized queue types listed below.
@end quotation
@end cartouche
@end deffn

@geindex SimpleQueue (class in multiprocessing)
@anchor{library/multiprocessing multiprocessing SimpleQueue}@anchor{b16}
@deffn {Class} multiprocessing.SimpleQueue

It is a simplified @ref{1bcd,,Queue} type, very close to a locked @ref{36c6,,Pipe}.

Instantiating this class may set the global start method. See
@ref{36d2,,Global start method} for more details.

@geindex close() (multiprocessing.SimpleQueue method)
@anchor{library/multiprocessing multiprocessing SimpleQueue close}@anchor{b17}
@deffn {Method} close ()

Close the queue: release internal resources.

A queue must not be used anymore after it is closed. For example,
@ref{36ef,,get()}, @ref{36f0,,put()} and @ref{19ad,,empty()} methods must no longer be
called.


Added in version 3.9.

@end deffn

@geindex empty() (multiprocessing.SimpleQueue method)
@anchor{library/multiprocessing multiprocessing SimpleQueue empty}@anchor{19ad}
@deffn {Method} empty ()

Return @code{True} if the queue is empty, @code{False} otherwise.

Always raises an @ref{2c2,,OSError} if the SimpleQueue is closed.
@end deffn

@geindex get() (multiprocessing.SimpleQueue method)
@anchor{library/multiprocessing multiprocessing SimpleQueue get}@anchor{36ef}
@deffn {Method} get ()

Remove and return an item from the queue.
@end deffn

@geindex put() (multiprocessing.SimpleQueue method)
@anchor{library/multiprocessing multiprocessing SimpleQueue put}@anchor{36f0}
@deffn {Method} put (item)

Put `item' into the queue.
@end deffn
@end deffn

@geindex JoinableQueue (class in multiprocessing)
@anchor{library/multiprocessing multiprocessing JoinableQueue}@anchor{36e1}
@deffn {Class} multiprocessing.JoinableQueue ([maxsize])

@code{JoinableQueue}, a @ref{1bcd,,Queue} subclass, is a queue which
additionally has @ref{36e4,,task_done()} and @ref{36f1,,join()} methods.

Instantiating this class may set the global start method. See
@ref{36d2,,Global start method} for more details.

@geindex task_done() (multiprocessing.JoinableQueue method)
@anchor{library/multiprocessing multiprocessing JoinableQueue task_done}@anchor{36e4}
@deffn {Method} task_done ()

Indicate that a formerly enqueued task is complete. Used by queue
consumers.  For each @ref{1e60,,get()} used to fetch a task, a subsequent
call to @code{task_done()} tells the queue that the processing on the task
is complete.

If a @ref{36e3,,join()} is currently blocking, it will resume when all
items have been processed (meaning that a @code{task_done()} call was
received for every item that had been @ref{1e5f,,put()} into the queue).

Raises a @ref{2ee,,ValueError} if called more times than there were items
placed in the queue.
@end deffn

@geindex join() (multiprocessing.JoinableQueue method)
@anchor{library/multiprocessing multiprocessing JoinableQueue join}@anchor{36f1}
@deffn {Method} join ()

Block until all items in the queue have been gotten and processed.

The count of unfinished tasks goes up whenever an item is added to the
queue.  The count goes down whenever a consumer calls
@ref{36e4,,task_done()} to indicate that the item was retrieved and all work on
it is complete.  When the count of unfinished tasks drops to zero,
@ref{36e3,,join()} unblocks.
@end deffn
@end deffn

@node Miscellaneous<4>,Connection Objects,Pipes and Queues,Reference<3>
@anchor{library/multiprocessing miscellaneous}@anchor{36f2}
@subsubsection Miscellaneous


@geindex active_children() (in module multiprocessing)
@anchor{library/multiprocessing multiprocessing active_children}@anchor{36f3}
@deffn {Function} multiprocessing.active_children ()

Return list of all live children of the current process.

Calling this has the side effect of “joining” any processes which have
already finished.
@end deffn

@geindex cpu_count() (in module multiprocessing)
@anchor{library/multiprocessing multiprocessing cpu_count}@anchor{1175}
@deffn {Function} multiprocessing.cpu_count ()

Return the number of CPUs in the system.

This number is not equivalent to the number of CPUs the current process can
use.  The number of usable CPUs can be obtained with
@ref{4db,,os.process_cpu_count()} (or @code{len(os.sched_getaffinity(0))}).

When the number of CPUs cannot be determined a @ref{369,,NotImplementedError}
is raised.


@subsubheading See also


@ref{4dc,,os.cpu_count()}
@ref{4db,,os.process_cpu_count()}



Changed in version 3.13: The return value can also be overridden using the
@ref{170,,-X cpu_count} flag or 
@geindex PYTHON_CPU_COUNT
@geindex environment variable; PYTHON_CPU_COUNT
@ref{51f,,PYTHON_CPU_COUNT} as this is
merely a wrapper around the @ref{a5,,os} cpu count APIs.

@end deffn

@geindex current_process() (in module multiprocessing)
@anchor{library/multiprocessing multiprocessing current_process}@anchor{36f4}
@deffn {Function} multiprocessing.current_process ()

Return the @ref{254,,Process} object corresponding to the current process.

An analogue of @ref{35c,,threading.current_thread()}.
@end deffn

@geindex parent_process() (in module multiprocessing)
@anchor{library/multiprocessing multiprocessing parent_process}@anchor{36f5}
@deffn {Function} multiprocessing.parent_process ()

Return the @ref{254,,Process} object corresponding to the parent process of
the @ref{36f4,,current_process()}. For the main process, @code{parent_process} will
be @code{None}.


Added in version 3.8.

@end deffn

@geindex freeze_support() (in module multiprocessing)
@anchor{library/multiprocessing multiprocessing freeze_support}@anchor{17b5}
@deffn {Function} multiprocessing.freeze_support ()

Add support for when a program which uses @code{multiprocessing} has been
frozen to produce an executable.  (Has been tested with `py2exe',
`PyInstaller' and `cx_Freeze'.)

One needs to call this function straight after the @code{if __name__ ==
'__main__'} line of the main module.  For example:

@example
from multiprocessing import Process, freeze_support

def f():
    print('hello world!')

if __name__ == '__main__':
    freeze_support()
    Process(target=f).start()
@end example

If the @code{freeze_support()} line is omitted then trying to run the frozen
executable will raise @ref{246,,RuntimeError}.

Calling @code{freeze_support()} has no effect when the start method is not
`spawn'. In addition, if the module is being run normally by the Python
interpreter (the program has not been frozen), then @code{freeze_support()}
has no effect.
@end deffn

@geindex get_all_start_methods() (in module multiprocessing)
@anchor{library/multiprocessing multiprocessing get_all_start_methods}@anchor{116f}
@deffn {Function} multiprocessing.get_all_start_methods ()

Returns a list of the supported start methods, the first of which
is the default.  The possible start methods are @code{'fork'},
@code{'spawn'} and @code{'forkserver'}.  Not all platforms support all
methods.  See @ref{1d7,,Contexts and start methods}.


Added in version 3.4.

@end deffn

@geindex get_context() (in module multiprocessing)
@anchor{library/multiprocessing multiprocessing get_context}@anchor{24c}
@deffn {Function} multiprocessing.get_context (method=None)

Return a context object which has the same attributes as the
@code{multiprocessing} module.

If `method' is @code{None} then the default context is returned. Note that if
the global start method has not been set, this will set it to the system default
See @ref{36d2,,Global start method} for more details.
Otherwise `method' should be @code{'fork'}, @code{'spawn'},
@code{'forkserver'}.  @ref{2ee,,ValueError} is raised if the specified
start method is not available.  See @ref{1d7,,Contexts and start methods}.


Added in version 3.4.

@end deffn

@geindex get_start_method() (in module multiprocessing)
@anchor{library/multiprocessing multiprocessing get_start_method}@anchor{1170}
@deffn {Function} multiprocessing.get_start_method (allow_none=False)

Return the name of start method used for starting processes.

If the global start method is not set and `allow_none' is @code{False}, the global start
method is set to the default, and its name is returned. See
@ref{36d2,,Global start method} for more details.

The return value can be @code{'fork'}, @code{'spawn'}, @code{'forkserver'}
or @code{None}.  See @ref{1d7,,Contexts and start methods}.


Added in version 3.4.



Changed in version 3.8: On macOS, the `spawn' start method is now the default.  The `fork' start
method should be considered unsafe as it can lead to crashes of the
subprocess. See bpo-33725@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33725}.

@end deffn

@geindex set_executable() (in module multiprocessing)
@anchor{library/multiprocessing multiprocessing set_executable}@anchor{1bd4}
@deffn {Function} multiprocessing.set_executable (executable)

Set the path of the Python interpreter to use when starting a child process.
(By default @ref{3eb,,sys.executable} is used).  Embedders will probably need to
do something like

@example
set_executable(os.path.join(sys.exec_prefix, 'pythonw.exe'))
@end example

before they can create child processes.


Changed in version 3.4: Now supported on POSIX when the @code{'spawn'} start method is used.



Changed in version 3.11: Accepts a @ref{5a1,,path-like object}.

@end deffn

@geindex set_forkserver_preload() (in module multiprocessing)
@anchor{library/multiprocessing multiprocessing set_forkserver_preload}@anchor{194d}
@deffn {Function} multiprocessing.set_forkserver_preload (module_names)

Set a list of module names for the forkserver main process to attempt to
import so that their already imported state is inherited by forked
processes. Any @ref{65b,,ImportError} when doing so is silently ignored.
This can be used as a performance enhancement to avoid repeated work
in every process.

For this to work, it must be called before the forkserver process has been
launched (before creating a @code{Pool} or starting a @ref{254,,Process}).

Only meaningful when using the @code{'forkserver'} start method.
See @ref{1d7,,Contexts and start methods}.


Added in version 3.4.

@end deffn

@geindex set_start_method() (in module multiprocessing)
@anchor{library/multiprocessing multiprocessing set_start_method}@anchor{24d}
@deffn {Function} multiprocessing.set_start_method (method, force=False)

Set the method which should be used to start child processes.
The `method' argument can be @code{'fork'}, @code{'spawn'} or @code{'forkserver'}.
Raises @ref{246,,RuntimeError} if the start method has already been set and `force'
is not @code{True}.  If `method' is @code{None} and `force' is @code{True} then the start
method is set to @code{None}.  If `method' is @code{None} and `force' is @code{False}
then the context is set to the default context.

Note that this should be called at most once, and it should be
protected inside the @code{if __name__ == '__main__'} clause of the
main module.

See @ref{1d7,,Contexts and start methods}.


Added in version 3.4.

@end deffn

@cartouche
@quotation Note 
@code{multiprocessing} contains no analogues of
@ref{35d,,threading.active_count()}, @ref{1c9d,,threading.enumerate()},
@ref{a4e,,threading.settrace()}, @ref{a4f,,threading.setprofile()},
@ref{1365,,threading.Timer}, or @ref{18a8,,threading.local}.
@end quotation
@end cartouche

@node Connection Objects,Synchronization primitives,Miscellaneous<4>,Reference<3>
@anchor{library/multiprocessing connection-objects}@anchor{36f6}
@subsubsection Connection Objects


Connection objects allow the sending and receiving of picklable objects or
strings.  They can be thought of as message oriented connected sockets.

Connection objects are usually created using
@ref{36c6,,Pipe} – see also
@ref{36f7,,Listeners and Clients}.

@geindex Connection (class in multiprocessing.connection)
@anchor{library/multiprocessing multiprocessing connection Connection}@anchor{12ec}
@deffn {Class} multiprocessing.connection.Connection

@geindex send() (multiprocessing.connection.Connection method)
@anchor{library/multiprocessing multiprocessing connection Connection send}@anchor{36f8}
@deffn {Method} send (obj)

Send an object to the other end of the connection which should be read
using @ref{36f9,,recv()}.

The object must be picklable.  Very large pickles (approximately 32 MiB+,
though it depends on the OS) may raise a @ref{2ee,,ValueError} exception.
@end deffn

@geindex recv() (multiprocessing.connection.Connection method)
@anchor{library/multiprocessing multiprocessing connection Connection recv}@anchor{36f9}
@deffn {Method} recv ()

Return an object sent from the other end of the connection using
@ref{36f8,,send()}.  Blocks until there is something to receive.  Raises
@ref{14e5,,EOFError} if there is nothing left to receive
and the other end was closed.
@end deffn

@geindex fileno() (multiprocessing.connection.Connection method)
@anchor{library/multiprocessing multiprocessing connection Connection fileno}@anchor{36fa}
@deffn {Method} fileno ()

Return the file descriptor or handle used by the connection.
@end deffn

@geindex close() (multiprocessing.connection.Connection method)
@anchor{library/multiprocessing multiprocessing connection Connection close}@anchor{36fb}
@deffn {Method} close ()

Close the connection.

This is called automatically when the connection is garbage collected.
@end deffn

@geindex poll() (multiprocessing.connection.Connection method)
@anchor{library/multiprocessing multiprocessing connection Connection poll}@anchor{36fc}
@deffn {Method} poll ([timeout])

Return whether there is any data available to be read.

If `timeout' is not specified then it will return immediately.  If
`timeout' is a number then this specifies the maximum time in seconds to
block.  If `timeout' is @code{None} then an infinite timeout is used.

Note that multiple connection objects may be polled at once by
using @ref{12eb,,multiprocessing.connection.wait()}.
@end deffn

@geindex send_bytes() (multiprocessing.connection.Connection method)
@anchor{library/multiprocessing multiprocessing connection Connection send_bytes}@anchor{36fd}
@deffn {Method} send_bytes (buf[, offset[, size]])

Send byte data from a @ref{194,,bytes-like object} as a complete message.

If `offset' is given then data is read from that position in `buf'.  If
`size' is given then that many bytes will be read from `buf'.  Very large
buffers (approximately 32 MiB+, though it depends on the OS) may raise a
@ref{2ee,,ValueError} exception
@end deffn

@geindex recv_bytes() (multiprocessing.connection.Connection method)
@anchor{library/multiprocessing multiprocessing connection Connection recv_bytes}@anchor{36fe}
@deffn {Method} recv_bytes ([maxlength])

Return a complete message of byte data sent from the other end of the
connection as a string.  Blocks until there is something to receive.
Raises @ref{14e5,,EOFError} if there is nothing left
to receive and the other end has closed.

If `maxlength' is specified and the message is longer than `maxlength'
then @ref{2c2,,OSError} is raised and the connection will no longer be
readable.


Changed in version 3.3: This function used to raise @ref{1259,,IOError}, which is now an
alias of @ref{2c2,,OSError}.

@end deffn

@geindex recv_bytes_into() (multiprocessing.connection.Connection method)
@anchor{library/multiprocessing multiprocessing connection Connection recv_bytes_into}@anchor{36ff}
@deffn {Method} recv_bytes_into (buf[, offset])

Read into `buf' a complete message of byte data sent from the other end
of the connection and return the number of bytes in the message.  Blocks
until there is something to receive.  Raises
@ref{14e5,,EOFError} if there is nothing left to receive and the other end was
closed.

`buf' must be a writable @ref{194,,bytes-like object}.  If
`offset' is given then the message will be written into the buffer from
that position.  Offset must be a non-negative integer less than the
length of `buf' (in bytes).

If the buffer is too short then a @code{BufferTooShort} exception is
raised and the complete message is available as @code{e.args[0]} where @code{e}
is the exception instance.
@end deffn


Changed in version 3.3: Connection objects themselves can now be transferred between processes
using @ref{36f8,,Connection.send()} and @ref{36f9,,Connection.recv()}.

Connection objects also now support the context management protocol – see
@ref{2453,,Context Manager Types}.  @ref{26f3,,__enter__()} returns the
connection object, and @ref{26f4,,__exit__()} calls @ref{36fb,,close()}.

@end deffn

For example:

@example
>>> from multiprocessing import Pipe
>>> a, b = Pipe()
>>> a.send([1, 'hello', None])
>>> b.recv()
[1, 'hello', None]
>>> b.send_bytes(b'thank you')
>>> a.recv_bytes()
b'thank you'
>>> import array
>>> arr1 = array.array('i', range(5))
>>> arr2 = array.array('i', [0] * 10)
>>> a.send_bytes(arr1)
>>> count = b.recv_bytes_into(arr2)
>>> assert count == len(arr1) * arr1.itemsize
>>> arr2
array('i', [0, 1, 2, 3, 4, 0, 0, 0, 0, 0])
@end example
@anchor{library/multiprocessing multiprocessing-recv-pickle-security}@anchor{3700}
@cartouche
@quotation Warning 
The @ref{36f9,,Connection.recv()} method automatically unpickles the data it
receives, which can be a security risk unless you can trust the process
which sent the message.

Therefore, unless the connection object was produced using @code{Pipe()} you
should only use the @ref{36f9,,recv()} and @ref{36f8,,send()}
methods after performing some sort of authentication.  See
@ref{36db,,Authentication keys}.
@end quotation
@end cartouche

@cartouche
@quotation Warning 
If a process is killed while it is trying to read or write to a pipe then
the data in the pipe is likely to become corrupted, because it may become
impossible to be sure where the message boundaries lie.
@end quotation
@end cartouche

@node Synchronization primitives,Shared ctypes Objects,Connection Objects,Reference<3>
@anchor{library/multiprocessing synchronization-primitives}@anchor{3701}
@subsubsection Synchronization primitives


Generally synchronization primitives are not as necessary in a multiprocess
program as they are in a multithreaded program.  See the documentation for
@ref{f3,,threading} module.

Note that one can also create synchronization primitives by using a manager
object – see @ref{36e5,,Managers}.

@geindex Barrier (class in multiprocessing)
@anchor{library/multiprocessing multiprocessing Barrier}@anchor{36cf}
@deffn {Class} multiprocessing.Barrier (parties[, action[, timeout]])

A barrier object: a clone of @ref{13ef,,threading.Barrier}.

Instantiating this class may set the global start method. See
@ref{36d2,,Global start method} for more details.


Added in version 3.3.

@end deffn

@geindex BoundedSemaphore (class in multiprocessing)
@anchor{library/multiprocessing multiprocessing BoundedSemaphore}@anchor{36cd}
@deffn {Class} multiprocessing.BoundedSemaphore ([value])

A bounded semaphore object: a close analog of
@ref{1363,,threading.BoundedSemaphore}.

Instantiating this class may set the global start method. See
@ref{36d2,,Global start method} for more details.

A solitary difference from its close analog exists: its @code{acquire} method’s
first argument is named `block', as is consistent with @ref{3702,,Lock.acquire()}.

@geindex locked() (multiprocessing.BoundedSemaphore method)
@anchor{library/multiprocessing multiprocessing BoundedSemaphore locked}@anchor{3703}
@deffn {Method} locked ()

Return a boolean indicating whether this object is locked right now.


Added in version 3.14.

@end deffn

@cartouche
@quotation Note 
On macOS, this is indistinguishable from @ref{36cc,,Semaphore} because
@code{sem_getvalue()} is not implemented on that platform.
@end quotation
@end cartouche
@end deffn

@geindex Condition (class in multiprocessing)
@anchor{library/multiprocessing multiprocessing Condition}@anchor{36ce}
@deffn {Class} multiprocessing.Condition ([lock])

A condition variable: an alias for @ref{1361,,threading.Condition}.

If `lock' is specified then it should be a @ref{189c,,Lock} or @ref{189d,,RLock}
object from @code{multiprocessing}.

Instantiating this class may set the global start method. See
@ref{36d2,,Global start method} for more details.


Changed in version 3.3: The @ref{36a7,,wait_for()} method was added.

@end deffn

@geindex Event (class in multiprocessing)
@anchor{library/multiprocessing multiprocessing Event}@anchor{1c49}
@deffn {Class} multiprocessing.Event

A clone of @ref{1364,,threading.Event}.

Instantiating this class may set the global start method. See
@ref{36d2,,Global start method} for more details.
@end deffn

@geindex Lock (class in multiprocessing)
@anchor{library/multiprocessing multiprocessing Lock}@anchor{189c}
@deffn {Class} multiprocessing.Lock

A non-recursive lock object: a close analog of @ref{1a39,,threading.Lock}.
Once a process or thread has acquired a lock, subsequent attempts to
acquire it from any process or thread will block until it is released;
any process or thread may release it.  The concepts and behaviors of
@code{threading.Lock} as it applies to threads are replicated here in
@code{multiprocessing.Lock} as it applies to either processes or threads,
except as noted.

Note that @code{Lock} is actually a factory function which returns an
instance of @code{multiprocessing.synchronize.Lock} initialized with a
default context.

Instantiating this class may set the global start method. See
@ref{36d2,,Global start method} for more details.

@code{Lock} supports the @ref{1e3,,context manager} protocol and thus may be
used in @ref{187,,with} statements.

@geindex acquire() (multiprocessing.Lock method)
@anchor{library/multiprocessing multiprocessing Lock acquire}@anchor{3702}
@deffn {Method} acquire (block=True, timeout=None)

Acquire a lock, blocking or non-blocking.

With the `block' argument set to @code{True} (the default), the method call
will block until the lock is in an unlocked state, then set it to locked
and return @code{True}.  Note that the name of this first argument differs
from that in @ref{8a9,,threading.Lock.acquire()}.

With the `block' argument set to @code{False}, the method call does not
block.  If the lock is currently in a locked state, return @code{False};
otherwise set the lock to a locked state and return @code{True}.

When invoked with a positive, floating-point value for `timeout', block
for at most the number of seconds specified by `timeout' as long as
the lock can not be acquired.  Invocations with a negative value for
`timeout' are equivalent to a `timeout' of zero.  Invocations with a
`timeout' value of @code{None} (the default) set the timeout period to
infinite.  Note that the treatment of negative or @code{None} values for
`timeout' differs from the implemented behavior in
@ref{8a9,,threading.Lock.acquire()}.  The `timeout' argument has no practical
implications if the `block' argument is set to @code{False} and is thus
ignored.  Returns @code{True} if the lock has been acquired or @code{False} if
the timeout period has elapsed.
@end deffn

@geindex release() (multiprocessing.Lock method)
@anchor{library/multiprocessing multiprocessing Lock release}@anchor{3704}
@deffn {Method} release ()

Release a lock.  This can be called from any process or thread, not only
the process or thread which originally acquired the lock.

Behavior is the same as in @ref{14ce,,threading.Lock.release()} except that
when invoked on an unlocked lock, a @ref{2ee,,ValueError} is raised.
@end deffn

@geindex locked() (multiprocessing.Lock method)
@anchor{library/multiprocessing multiprocessing Lock locked}@anchor{18c0}
@deffn {Method} locked ()

Return a boolean indicating whether this object is locked right now.


Added in version 3.14.

@end deffn
@end deffn

@geindex RLock (class in multiprocessing)
@anchor{library/multiprocessing multiprocessing RLock}@anchor{189d}
@deffn {Class} multiprocessing.RLock

A recursive lock object: a close analog of @ref{32c,,threading.RLock}.  A
recursive lock must be released by the process or thread that acquired it.
Once a process or thread has acquired a recursive lock, the same process
or thread may acquire it again without blocking; that process or thread
must release it once for each time it has been acquired.

Note that @code{RLock} is actually a factory function which returns an
instance of @code{multiprocessing.synchronize.RLock} initialized with a
default context.

Instantiating this class may set the global start method. See
@ref{36d2,,Global start method} for more details.

@code{RLock} supports the @ref{1e3,,context manager} protocol and thus may be
used in @ref{187,,with} statements.

@geindex acquire() (multiprocessing.RLock method)
@anchor{library/multiprocessing multiprocessing RLock acquire}@anchor{3705}
@deffn {Method} acquire (block=True, timeout=None)

Acquire a lock, blocking or non-blocking.

When invoked with the `block' argument set to @code{True}, block until the
lock is in an unlocked state (not owned by any process or thread) unless
the lock is already owned by the current process or thread.  The current
process or thread then takes ownership of the lock (if it does not
already have ownership) and the recursion level inside the lock increments
by one, resulting in a return value of @code{True}.  Note that there are
several differences in this first argument’s behavior compared to the
implementation of @ref{1081,,threading.RLock.acquire()}, starting with the name
of the argument itself.

When invoked with the `block' argument set to @code{False}, do not block.
If the lock has already been acquired (and thus is owned) by another
process or thread, the current process or thread does not take ownership
and the recursion level within the lock is not changed, resulting in
a return value of @code{False}.  If the lock is in an unlocked state, the
current process or thread takes ownership and the recursion level is
incremented, resulting in a return value of @code{True}.

Use and behaviors of the `timeout' argument are the same as in
@ref{3702,,Lock.acquire()}.  Note that some of these behaviors of `timeout'
differ from the implemented behaviors in @ref{1081,,threading.RLock.acquire()}.
@end deffn

@geindex release() (multiprocessing.RLock method)
@anchor{library/multiprocessing multiprocessing RLock release}@anchor{3706}
@deffn {Method} release ()

Release a lock, decrementing the recursion level.  If after the
decrement the recursion level is zero, reset the lock to unlocked (not
owned by any process or thread) and if any other processes or threads
are blocked waiting for the lock to become unlocked, allow exactly one
of them to proceed.  If after the decrement the recursion level is still
nonzero, the lock remains locked and owned by the calling process or
thread.

Only call this method when the calling process or thread owns the lock.
An @ref{8ba,,AssertionError} is raised if this method is called by a process
or thread other than the owner or if the lock is in an unlocked (unowned)
state.  Note that the type of exception raised in this situation
differs from the implemented behavior in @ref{36a2,,threading.RLock.release()}.
@end deffn

@geindex locked() (multiprocessing.RLock method)
@anchor{library/multiprocessing multiprocessing RLock locked}@anchor{18c1}
@deffn {Method} locked ()

Return a boolean indicating whether this object is locked right now.


Added in version 3.14.

@end deffn
@end deffn

@geindex Semaphore (class in multiprocessing)
@anchor{library/multiprocessing multiprocessing Semaphore}@anchor{36cc}
@deffn {Class} multiprocessing.Semaphore ([value])

A semaphore object: a close analog of @ref{1362,,threading.Semaphore}.

Instantiating this class may set the global start method. See
@ref{36d2,,Global start method} for more details.

A solitary difference from its close analog exists: its @code{acquire} method’s
first argument is named `block', as is consistent with @ref{3702,,Lock.acquire()}.

@geindex get_value() (multiprocessing.Semaphore method)
@anchor{library/multiprocessing multiprocessing Semaphore get_value}@anchor{3707}
@deffn {Method} get_value ()

Return the current value of semaphore.

Note that this may raise @ref{369,,NotImplementedError} on platforms like
macOS where @code{sem_getvalue()} is not implemented.
@end deffn

@geindex locked() (multiprocessing.Semaphore method)
@anchor{library/multiprocessing multiprocessing Semaphore locked}@anchor{3708}
@deffn {Method} locked ()

Return a boolean indicating whether this object is locked right now.


Added in version 3.14.

@end deffn
@end deffn

@cartouche
@quotation Note 
On macOS, @code{sem_timedwait} is unsupported, so calling @code{acquire()} with
a timeout will emulate that function’s behavior using a sleeping loop.
@end quotation
@end cartouche

@cartouche
@quotation Note 
Some of this package’s functionality requires a functioning shared semaphore
implementation on the host operating system. Without one, the
@code{multiprocessing.synchronize} module will be disabled, and attempts to
import it will result in an @ref{65b,,ImportError}. See
bpo-3770@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3770} for additional information.
@end quotation
@end cartouche

@node Shared ctypes Objects,Managers,Synchronization primitives,Reference<3>
@anchor{library/multiprocessing shared-ctypes-objects}@anchor{3709}
@subsubsection Shared @code{ctypes} Objects


It is possible to create shared objects using shared memory which can be
inherited by child processes.

@geindex Value() (in module multiprocessing)
@anchor{library/multiprocessing multiprocessing Value}@anchor{36c9}
@deffn {Function} multiprocessing.Value (typecode_or_type, *args, lock=True)

Return a @ref{2e,,ctypes} object allocated from shared memory.  By default the
return value is actually a synchronized wrapper for the object.  The object
itself can be accessed via the `value' attribute of a @ref{36c9,,Value}.

`typecode_or_type' determines the type of the returned object: it is either a
ctypes type or a one character typecode of the kind used by the @ref{8,,array}
module.  `*args' is passed on to the constructor for the type.

If `lock' is @code{True} (the default) then a new recursive lock
object is created to synchronize access to the value.  If `lock' is
a @ref{189c,,Lock} or @ref{189d,,RLock} object then that will be used to
synchronize access to the value.  If `lock' is @code{False} then
access to the returned object will not be automatically protected
by a lock, so it will not necessarily be “process-safe”.

Operations like @code{+=} which involve a read and write are not
atomic.  So if, for instance, you want to atomically increment a
shared value it is insufficient to just do

@example
counter.value += 1
@end example

Assuming the associated lock is recursive (which it is by default)
you can instead do

@example
with counter.get_lock():
    counter.value += 1
@end example

Note that `lock' is a keyword-only argument.
@end deffn

@geindex Array() (in module multiprocessing)
@anchor{library/multiprocessing multiprocessing Array}@anchor{36ca}
@deffn {Function} multiprocessing.Array (typecode_or_type, size_or_initializer, *, lock=True)

Return a ctypes array allocated from shared memory.  By default the return
value is actually a synchronized wrapper for the array.

`typecode_or_type' determines the type of the elements of the returned array:
it is either a @ref{2885,,ctypes type} or a one
character typecode of the kind used by the @ref{8,,array} module with the
exception of @code{'w'}, which is not supported.  In addition, the @code{'c'}
typecode is an alias for @ref{3351,,ctypes.c_char}.  If `size_or_initializer'
is an integer, then it determines the length of the array, and the array
will be initially zeroed. Otherwise, `size_or_initializer' is a sequence
which is used to initialize the array and whose length determines the length
of the array.

If `lock' is @code{True} (the default) then a new lock object is created to
synchronize access to the value.  If `lock' is a @ref{189c,,Lock} or
@ref{189d,,RLock} object then that will be used to synchronize access to the
value.  If `lock' is @code{False} then access to the returned object will not be
automatically protected by a lock, so it will not necessarily be
“process-safe”.

Note that `lock' is a keyword only argument.

Note that an array of @ref{3351,,ctypes.c_char} has `value' and `raw'
attributes which can both be used to store and retrieve byte strings.
While `raw' allows interaction with a @ref{193,,bytes} object the full size of
the array, reading `value' will terminate after a null byte, like most
programming languages handle strings.
@end deffn

@menu
* The multiprocessing.sharedctypes module: The multiprocessing sharedctypes module. 

@end menu

@node The multiprocessing sharedctypes module,,,Shared ctypes Objects
@anchor{library/multiprocessing module-multiprocessing sharedctypes}@anchor{9e}@anchor{library/multiprocessing the-multiprocessing-sharedctypes-module}@anchor{370a}
@subsubsection The @code{multiprocessing.sharedctypes} module


@geindex module; multiprocessing.sharedctypes

The @code{multiprocessing.sharedctypes} module provides functions for allocating
@ref{2e,,ctypes} objects from shared memory which can be inherited by child
processes.

@cartouche
@quotation Note 
Although it is possible to store a pointer in shared memory remember that
this will refer to a location in the address space of a specific process.
However, the pointer is quite likely to be invalid in the context of a second
process and trying to dereference the pointer from the second process may
cause a crash.
@end quotation
@end cartouche

@geindex RawArray() (in module multiprocessing.sharedctypes)
@anchor{library/multiprocessing multiprocessing sharedctypes RawArray}@anchor{370b}
@deffn {Function} multiprocessing.sharedctypes.RawArray (typecode_or_type, size_or_initializer)

Return a ctypes array allocated from shared memory.

`typecode_or_type' determines the type of the elements of the returned array:
it is either a ctypes type or a one character typecode of the kind used by
the @ref{8,,array} module.  If `size_or_initializer' is an integer then it
determines the length of the array, and the array will be initially zeroed.
Otherwise `size_or_initializer' is a sequence which is used to initialize the
array and whose length determines the length of the array.

Note that setting and getting an element is potentially non-atomic – use
@ref{370c,,Array()} instead to make sure that access is automatically synchronized
using a lock.
@end deffn

@geindex RawValue() (in module multiprocessing.sharedctypes)
@anchor{library/multiprocessing multiprocessing sharedctypes RawValue}@anchor{370d}
@deffn {Function} multiprocessing.sharedctypes.RawValue (typecode_or_type, *args)

Return a ctypes object allocated from shared memory.

`typecode_or_type' determines the type of the returned object: it is either a
ctypes type or a one character typecode of the kind used by the @ref{8,,array}
module.  `*args' is passed on to the constructor for the type.

Note that setting and getting the value is potentially non-atomic – use
@ref{370e,,Value()} instead to make sure that access is automatically synchronized
using a lock.

Note that an array of @ref{3351,,ctypes.c_char} has @code{value} and @code{raw}
attributes which allow one to use it to store and retrieve strings – see
documentation for @ref{2e,,ctypes}.
@end deffn

@geindex Array() (in module multiprocessing.sharedctypes)
@anchor{library/multiprocessing multiprocessing sharedctypes Array}@anchor{370c}
@deffn {Function} multiprocessing.sharedctypes.Array (typecode_or_type, size_or_initializer, *, lock=True, ctx=None)

The same as @ref{370b,,RawArray()} except that depending on the value of `lock' a
process-safe synchronization wrapper may be returned instead of a raw ctypes
array.

If `lock' is @code{True} (the default) then a new lock object is created to
synchronize access to the value.  If `lock' is a
@ref{189c,,Lock} or @ref{189d,,RLock} object
then that will be used to synchronize access to the
value.  If `lock' is @code{False} then access to the returned object will not be
automatically protected by a lock, so it will not necessarily be
“process-safe”.

`ctx' is a context object, or @code{None} (use the current context). If @code{None},
calling this may set the global start method. See
@ref{36d2,,Global start method} for more details.

Note that `lock' and `ctx' are keyword-only parameters.
@end deffn

@geindex Value() (in module multiprocessing.sharedctypes)
@anchor{library/multiprocessing multiprocessing sharedctypes Value}@anchor{370e}
@deffn {Function} multiprocessing.sharedctypes.Value (typecode_or_type, *args, lock=True, ctx=None)

The same as @ref{370d,,RawValue()} except that depending on the value of `lock' a
process-safe synchronization wrapper may be returned instead of a raw ctypes
object.

If `lock' is @code{True} (the default) then a new lock object is created to
synchronize access to the value.  If `lock' is a @ref{189c,,Lock} or
@ref{189d,,RLock} object then that will be used to synchronize access to the
value.  If `lock' is @code{False} then access to the returned object will not be
automatically protected by a lock, so it will not necessarily be
“process-safe”.

`ctx' is a context object, or @code{None} (use the current context). If @code{None},
calling this may set the global start method. See
@ref{36d2,,Global start method} for more details.

Note that `lock' and `ctx' are keyword-only parameters.
@end deffn

@geindex copy() (in module multiprocessing.sharedctypes)
@anchor{library/multiprocessing multiprocessing sharedctypes copy}@anchor{370f}
@deffn {Function} multiprocessing.sharedctypes.copy (obj)

Return a ctypes object allocated from shared memory which is a copy of the
ctypes object `obj'.
@end deffn

@geindex synchronized() (in module multiprocessing.sharedctypes)
@anchor{library/multiprocessing multiprocessing sharedctypes synchronized}@anchor{1037}
@deffn {Function} multiprocessing.sharedctypes.synchronized (obj, lock=None, ctx=None)

Return a process-safe wrapper object for a ctypes object which uses `lock' to
synchronize access.  If `lock' is @code{None} (the default) then a
@ref{189d,,multiprocessing.RLock} object is created automatically.

`ctx' is a context object, or @code{None} (use the current context). If @code{None},
calling this may set the global start method. See
@ref{36d2,,Global start method} for more details.

A synchronized wrapper will have two methods in addition to those of the
object it wraps: @code{get_obj()} returns the wrapped object and
@code{get_lock()} returns the lock object used for synchronization.

Note that accessing the ctypes object through the wrapper can be a lot slower
than accessing the raw ctypes object.


Changed in version 3.5: Synchronized objects support the @ref{1e3,,context manager} protocol.

@end deffn

The table below compares the syntax for creating shared ctypes objects from
shared memory with the normal ctypes syntax.  (In the table @code{MyStruct} is some
subclass of @ref{1e7,,ctypes.Structure}.)


@multitable {xxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

ctypes

@tab

sharedctypes using type

@tab

sharedctypes using typecode

@item

c_double(2.4)

@tab

RawValue(c_double, 2.4)

@tab

RawValue(‘d’, 2.4)

@item

MyStruct(4, 6)

@tab

RawValue(MyStruct, 4, 6)

@tab

@item

(c_short * 7)()

@tab

RawArray(c_short, 7)

@tab

RawArray(‘h’, 7)

@item

(c_int * 3)(9, 2, 8)

@tab

RawArray(c_int, (9, 2, 8))

@tab

RawArray(‘i’, (9, 2, 8))

@end multitable


Below is an example where a number of ctypes objects are modified by a child
process:

@example
from multiprocessing import Process, Lock
from multiprocessing.sharedctypes import Value, Array
from ctypes import Structure, c_double

class Point(Structure):
    _fields_ = [('x', c_double), ('y', c_double)]

def modify(n, x, s, A):
    n.value **= 2
    x.value **= 2
    s.value = s.value.upper()
    for a in A:
        a.x **= 2
        a.y **= 2

if __name__ == '__main__':
    lock = Lock()

    n = Value('i', 7)
    x = Value(c_double, 1.0/3.0, lock=False)
    s = Array('c', b'hello world', lock=lock)
    A = Array(Point, [(1.875,-6.25), (-5.75,2.0), (2.375,9.5)], lock=lock)

    p = Process(target=modify, args=(n, x, s, A))
    p.start()
    p.join()

    print(n.value)
    print(x.value)
    print(s.value)
    print([(a.x, a.y) for a in A])
@end example

The results printed are

@example
49
0.1111111111111111
HELLO WORLD
[(3.515625, 39.0625), (33.0625, 4.0), (5.640625, 90.25)]
@end example

@node Managers,Proxy Objects,Shared ctypes Objects,Reference<3>
@anchor{library/multiprocessing managers}@anchor{3710}@anchor{library/multiprocessing multiprocessing-managers}@anchor{36e5}
@subsubsection Managers


Managers provide a way to create data which can be shared between different
processes, including sharing over a network between processes running on
different machines. A manager object controls a server process which manages
`shared objects'.  Other processes can access the shared objects by using
proxies.

@geindex built-in function; multiprocessing.Manager()
@anchor{library/multiprocessing multiprocessing Manager}@anchor{252}
@deffn {Function} multiprocessing.Manager ()

Returns a started @ref{18db,,SyncManager} object which
can be used for sharing objects between processes.  The returned manager
object corresponds to a spawned child process and has methods which will
create shared objects and return corresponding proxies.
@end deffn

@geindex module; multiprocessing.managers
@anchor{library/multiprocessing module-multiprocessing managers}@anchor{9b}
Manager processes will be shutdown as soon as they are garbage collected or
their parent process exits.  The manager classes are defined in the
@ref{9b,,multiprocessing.managers} module:

@geindex BaseManager (class in multiprocessing.managers)
@anchor{library/multiprocessing multiprocessing managers BaseManager}@anchor{3711}
@deffn {Class} multiprocessing.managers.BaseManager (address=None, authkey=None, serializer='pickle', ctx=None, *, shutdown_timeout=1.0)

Create a BaseManager object.

Once created one should call @ref{3712,,start()} or @code{get_server().serve_forever()} to ensure
that the manager object refers to a started manager process.

`address' is the address on which the manager process listens for new
connections.  If `address' is @code{None} then an arbitrary one is chosen.

`authkey' is the authentication key which will be used to check the
validity of incoming connections to the server process.  If
`authkey' is @code{None} then @code{current_process().authkey} is used.
Otherwise `authkey' is used and it must be a byte string.

`serializer' must be @code{'pickle'} (use @ref{ab,,pickle} serialization) or
@code{'xmlrpclib'} (use @ref{135,,xmlrpc.client} serialization).

`ctx' is a context object, or @code{None} (use the current context). If @code{None},
calling this may set the global start method. See
@ref{36d2,,Global start method} for more details.

`shutdown_timeout' is a timeout in seconds used to wait until the process
used by the manager completes in the @ref{3713,,shutdown()} method. If the
shutdown times out, the process is terminated. If terminating the process
also times out, the process is killed.


Changed in version 3.11: Added the `shutdown_timeout' parameter.


@geindex start() (multiprocessing.managers.BaseManager method)
@anchor{library/multiprocessing multiprocessing managers BaseManager start}@anchor{3712}
@deffn {Method} start ([initializer[, initargs]])

Start a subprocess to start the manager.  If `initializer' is not @code{None}
then the subprocess will call @code{initializer(*initargs)} when it starts.
@end deffn

@geindex get_server() (multiprocessing.managers.BaseManager method)
@anchor{library/multiprocessing multiprocessing managers BaseManager get_server}@anchor{3714}
@deffn {Method} get_server ()

Returns a @code{Server} object which represents the actual server under
the control of the Manager. The @code{Server} object supports the
@code{serve_forever()} method:

@example
>>> from multiprocessing.managers import BaseManager
>>> manager = BaseManager(address=('@w{'}, 50000), authkey=b'abc')
>>> server = manager.get_server()
>>> server.serve_forever()
@end example

@code{Server} additionally has an @ref{3715,,address} attribute.
@end deffn

@geindex connect() (multiprocessing.managers.BaseManager method)
@anchor{library/multiprocessing multiprocessing managers BaseManager connect}@anchor{3716}
@deffn {Method} connect ()

Connect a local manager object to a remote manager process:

@example
>>> from multiprocessing.managers import BaseManager
>>> m = BaseManager(address=('127.0.0.1', 50000), authkey=b'abc')
>>> m.connect()
@end example
@end deffn

@geindex shutdown() (multiprocessing.managers.BaseManager method)
@anchor{library/multiprocessing multiprocessing managers BaseManager shutdown}@anchor{3713}
@deffn {Method} shutdown ()

Stop the process used by the manager.  This is only available if
@ref{3712,,start()} has been used to start the server process.

This can be called multiple times.
@end deffn

@geindex register() (multiprocessing.managers.BaseManager method)
@anchor{library/multiprocessing multiprocessing managers BaseManager register}@anchor{3717}
@deffn {Method} register (typeid[, callable[, proxytype[, exposed[, method_to_typeid[, create_method]]]]])

A classmethod which can be used for registering a type or callable with
the manager class.

`typeid' is a “type identifier” which is used to identify a particular
type of shared object.  This must be a string.

`callable' is a callable used for creating objects for this type
identifier.  If a manager instance will be connected to the
server using the @ref{3716,,connect()} method, or if the
`create_method' argument is @code{False} then this can be left as
@code{None}.

`proxytype' is a subclass of @ref{3718,,BaseProxy} which is used to create
proxies for shared objects with this `typeid'.  If @code{None} then a proxy
class is created automatically.

`exposed' is used to specify a sequence of method names which proxies for
this typeid should be allowed to access using
@ref{3719,,BaseProxy._callmethod()}.  (If `exposed' is @code{None} then
@code{proxytype._exposed_} is used instead if it exists.)  In the case
where no exposed list is specified, all “public methods” of the shared
object will be accessible.  (Here a “public method” means any attribute
which has a @ref{77b,,__call__()} method and whose name does not begin
with @code{'_'}.)

`method_to_typeid' is a mapping used to specify the return type of those
exposed methods which should return a proxy.  It maps method names to
typeid strings.  (If `method_to_typeid' is @code{None} then
@code{proxytype._method_to_typeid_} is used instead if it exists.)  If a
method’s name is not a key of this mapping or if the mapping is @code{None}
then the object returned by the method will be copied by value.

`create_method' determines whether a method should be created with name
`typeid' which can be used to tell the server process to create a new
shared object and return a proxy for it.  By default it is @code{True}.
@end deffn

@code{BaseManager} instances also have one read-only property:

@geindex address (multiprocessing.managers.BaseManager attribute)
@anchor{library/multiprocessing multiprocessing managers BaseManager address}@anchor{3715}
@deffn {Attribute} address

The address used by the manager.
@end deffn


Changed in version 3.3: Manager objects support the context management protocol – see
@ref{2453,,Context Manager Types}.  @ref{26f3,,__enter__()} starts the
server process (if it has not already started) and then returns the
manager object.  @ref{26f4,,__exit__()} calls @ref{3713,,shutdown()}.

In previous versions @ref{26f3,,__enter__()} did not start the
manager’s server process if it was not already started.

@end deffn

@geindex SyncManager (class in multiprocessing.managers)
@anchor{library/multiprocessing multiprocessing managers SyncManager}@anchor{18db}
@deffn {Class} multiprocessing.managers.SyncManager

A subclass of @ref{3711,,BaseManager} which can be used for the synchronization
of processes.  Objects of this type are returned by
@ref{252,,multiprocessing.Manager()}.

Its methods create and return @ref{24e,,Proxy Objects} for a
number of commonly used data types to be synchronized across processes.
This notably includes shared lists and dictionaries.

@geindex Barrier() (multiprocessing.managers.SyncManager method)
@anchor{library/multiprocessing multiprocessing managers SyncManager Barrier}@anchor{371a}
@deffn {Method} Barrier (parties[, action[, timeout]])

Create a shared @ref{13ef,,threading.Barrier} object and return a
proxy for it.


Added in version 3.3.

@end deffn

@geindex BoundedSemaphore() (multiprocessing.managers.SyncManager method)
@anchor{library/multiprocessing multiprocessing managers SyncManager BoundedSemaphore}@anchor{371b}
@deffn {Method} BoundedSemaphore ([value])

Create a shared @ref{1363,,threading.BoundedSemaphore} object and return a
proxy for it.
@end deffn

@geindex Condition() (multiprocessing.managers.SyncManager method)
@anchor{library/multiprocessing multiprocessing managers SyncManager Condition}@anchor{371c}
@deffn {Method} Condition ([lock])

Create a shared @ref{1361,,threading.Condition} object and return a proxy for
it.

If `lock' is supplied then it should be a proxy for a
@ref{1a39,,threading.Lock} or @ref{32c,,threading.RLock} object.


Changed in version 3.3: The @ref{36a7,,wait_for()} method was added.

@end deffn

@geindex Event() (multiprocessing.managers.SyncManager method)
@anchor{library/multiprocessing multiprocessing managers SyncManager Event}@anchor{371d}
@deffn {Method} Event ()

Create a shared @ref{1364,,threading.Event} object and return a proxy for it.
@end deffn

@geindex Lock() (multiprocessing.managers.SyncManager method)
@anchor{library/multiprocessing multiprocessing managers SyncManager Lock}@anchor{15a3}
@deffn {Method} Lock ()

Create a shared @ref{1a39,,threading.Lock} object and return a proxy for it.
@end deffn

@geindex Namespace() (multiprocessing.managers.SyncManager method)
@anchor{library/multiprocessing multiprocessing managers SyncManager Namespace}@anchor{371e}
@deffn {Method} Namespace ()

Create a shared @ref{36cb,,Namespace} object and return a proxy for it.
@end deffn

@geindex Queue() (multiprocessing.managers.SyncManager method)
@anchor{library/multiprocessing multiprocessing managers SyncManager Queue}@anchor{3237}
@deffn {Method} Queue ([maxsize])

Create a shared @ref{15a0,,queue.Queue} object and return a proxy for it.
@end deffn

@geindex RLock() (multiprocessing.managers.SyncManager method)
@anchor{library/multiprocessing multiprocessing managers SyncManager RLock}@anchor{15a4}
@deffn {Method} RLock ()

Create a shared @ref{32c,,threading.RLock} object and return a proxy for it.
@end deffn

@geindex Semaphore() (multiprocessing.managers.SyncManager method)
@anchor{library/multiprocessing multiprocessing managers SyncManager Semaphore}@anchor{15a5}
@deffn {Method} Semaphore ([value])

Create a shared @ref{1362,,threading.Semaphore} object and return a proxy for
it.
@end deffn

@geindex Array() (multiprocessing.managers.SyncManager method)
@anchor{library/multiprocessing multiprocessing managers SyncManager Array}@anchor{371f}
@deffn {Method} Array (typecode, sequence)

Create an array and return a proxy for it.
@end deffn

@geindex Value() (multiprocessing.managers.SyncManager method)
@anchor{library/multiprocessing multiprocessing managers SyncManager Value}@anchor{3720}
@deffn {Method} Value (typecode, value)

Create an object with a writable @code{value} attribute and return a proxy
for it.
@end deffn

@geindex dict() (multiprocessing.managers.SyncManager method)
@anchor{library/multiprocessing multiprocessing managers SyncManager dict}@anchor{3721}
@deffn {Method} dict ()

@deffnx {Method} dict (mapping)

@deffnx {Method} dict (sequence)

Create a shared @ref{184,,dict} object and return a proxy for it.
@end deffn

@geindex list() (multiprocessing.managers.SyncManager method)
@anchor{library/multiprocessing multiprocessing managers SyncManager list}@anchor{3722}
@deffn {Method} list ()

@deffnx {Method} list (sequence)

Create a shared @ref{24f,,list} object and return a proxy for it.
@end deffn

@geindex set() (multiprocessing.managers.SyncManager method)
@anchor{library/multiprocessing multiprocessing managers SyncManager set}@anchor{251}
@deffn {Method} set ()

@deffnx {Method} set (sequence)

@deffnx {Method} set (mapping)

Create a shared @ref{185,,set} object and return a proxy for it.


Added in version 3.14: @ref{185,,set} support was added.

@end deffn


Changed in version 3.6: Shared objects are capable of being nested.  For example, a shared
container object such as a shared list can contain other shared objects
which will all be managed and synchronized by the @code{SyncManager}.

@end deffn

@geindex Namespace (class in multiprocessing.managers)
@anchor{library/multiprocessing multiprocessing managers Namespace}@anchor{36cb}
@deffn {Class} multiprocessing.managers.Namespace

A type that can register with @ref{18db,,SyncManager}.

A namespace object has no public methods, but does have writable attributes.
Its representation shows the values of its attributes.

However, when using a proxy for a namespace object, an attribute beginning
with @code{'_'} will be an attribute of the proxy and not an attribute of the
referent:

@example
>>> mp_context = multiprocessing.get_context('spawn')
>>> manager = mp_context.Manager()
>>> Global = manager.Namespace()
>>> Global.x = 10
>>> Global.y = 'hello'
>>> Global._z = 12.3    # this is an attribute of the proxy
>>> print(Global)
Namespace(x=10, y='hello')
@end example
@end deffn

@menu
* Customized managers:: 
* Using a remote manager:: 

@end menu

@node Customized managers,Using a remote manager,,Managers
@anchor{library/multiprocessing customized-managers}@anchor{3723}
@subsubsection Customized managers


To create one’s own manager, one creates a subclass of @ref{3711,,BaseManager} and
uses the @ref{3717,,register()} classmethod to register new types or
callables with the manager class.  For example:

@example
from multiprocessing.managers import BaseManager

class MathsClass:
    def add(self, x, y):
        return x + y
    def mul(self, x, y):
        return x * y

class MyManager(BaseManager):
    pass

MyManager.register('Maths', MathsClass)

if __name__ == '__main__':
    with MyManager() as manager:
        maths = manager.Maths()
        print(maths.add(4, 3))         # prints 7
        print(maths.mul(7, 8))         # prints 56
@end example

@node Using a remote manager,,Customized managers,Managers
@anchor{library/multiprocessing using-a-remote-manager}@anchor{3724}
@subsubsection Using a remote manager


It is possible to run a manager server on one machine and have clients use it
from other machines (assuming that the firewalls involved allow it).

Running the following commands creates a server for a single shared queue which
remote clients can access:

@example
>>> from multiprocessing.managers import BaseManager
>>> from queue import Queue
>>> queue = Queue()
>>> class QueueManager(BaseManager): pass
>>> QueueManager.register('get_queue', callable=lambda:queue)
>>> m = QueueManager(address=('@w{'}, 50000), authkey=b'abracadabra')
>>> s = m.get_server()
>>> s.serve_forever()
@end example

One client can access the server as follows:

@example
>>> from multiprocessing.managers import BaseManager
>>> class QueueManager(BaseManager): pass
>>> QueueManager.register('get_queue')
>>> m = QueueManager(address=('foo.bar.org', 50000), authkey=b'abracadabra')
>>> m.connect()
>>> queue = m.get_queue()
>>> queue.put('hello')
@end example

Another client can also use it:

@example
>>> from multiprocessing.managers import BaseManager
>>> class QueueManager(BaseManager): pass
>>> QueueManager.register('get_queue')
>>> m = QueueManager(address=('foo.bar.org', 50000), authkey=b'abracadabra')
>>> m.connect()
>>> queue = m.get_queue()
>>> queue.get()
'hello'
@end example

Local processes can also access that queue, using the code from above on the
client to access it remotely:

@example
>>> from multiprocessing import Process, Queue
>>> from multiprocessing.managers import BaseManager
>>> class Worker(Process):
...     def __init__(self, q):
...         self.q = q
...         super().__init__()
...     def run(self):
...         self.q.put('local hello')
...
>>> queue = Queue()
>>> w = Worker(queue)
>>> w.start()
>>> class QueueManager(BaseManager): pass
...
>>> QueueManager.register('get_queue', callable=lambda: queue)
>>> m = QueueManager(address=('@w{'}, 50000), authkey=b'abracadabra')
>>> s = m.get_server()
>>> s.serve_forever()
@end example

@node Proxy Objects,Process Pools,Managers,Reference<3>
@anchor{library/multiprocessing multiprocessing-proxy-objects}@anchor{24e}@anchor{library/multiprocessing proxy-objects}@anchor{3725}
@subsubsection Proxy Objects


A proxy is an object which `refers' to a shared object which lives (presumably)
in a different process.  The shared object is said to be the `referent' of the
proxy.  Multiple proxy objects may have the same referent.

A proxy object has methods which invoke corresponding methods of its referent
(although not every method of the referent will necessarily be available through
the proxy).  In this way, a proxy can be used just like its referent can:

@example
>>> mp_context = multiprocessing.get_context('spawn')
>>> manager = mp_context.Manager()
>>> l = manager.list([i*i for i in range(10)])
>>> print(l)
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> print(repr(l))
<ListProxy object, typeid 'list' at 0x...>
>>> l[4]
16
>>> l[2:5]
[4, 9, 16]
@end example

Notice that applying @ref{16a,,str()} to a proxy will return the representation of
the referent, whereas applying @ref{1c3,,repr()} will return the representation of
the proxy.

An important feature of proxy objects is that they are picklable so they can be
passed between processes.  As such, a referent can contain
@ref{24e,,Proxy Objects}.  This permits nesting of these managed
lists, dicts, and other @ref{24e,,Proxy Objects}:

@example
>>> a = manager.list()
>>> b = manager.list()
>>> a.append(b)         # referent of a now contains referent of b
>>> print(a, b)
[<ListProxy object, typeid 'list' at ...>] []
>>> b.append('hello')
>>> print(a[0], b)
['hello'] ['hello']
@end example

Similarly, dict and list proxies may be nested inside one another:

@example
>>> l_outer = manager.list([ manager.dict() for i in range(2) ])
>>> d_first_inner = l_outer[0]
>>> d_first_inner['a'] = 1
>>> d_first_inner['b'] = 2
>>> l_outer[1]['c'] = 3
>>> l_outer[1]['z'] = 26
>>> print(l_outer[0])
@{'a': 1, 'b': 2@}
>>> print(l_outer[1])
@{'c': 3, 'z': 26@}
@end example

If standard (non-proxy) @ref{24f,,list} or @ref{184,,dict} objects are contained
in a referent, modifications to those mutable values will not be propagated
through the manager because the proxy has no way of knowing when the values
contained within are modified.  However, storing a value in a container proxy
(which triggers a @code{__setitem__} on the proxy object) does propagate through
the manager and so to effectively modify such an item, one could re-assign the
modified value to the container proxy:

@example
# create a list proxy and append a mutable object (a dictionary)
lproxy = manager.list()
lproxy.append(@{@})
# now mutate the dictionary
d = lproxy[0]
d['a'] = 1
d['b'] = 2
# at this point, the changes to d are not yet synced, but by
# updating the dictionary, the proxy is notified of the change
lproxy[0] = d
@end example

This approach is perhaps less convenient than employing nested
@ref{24e,,Proxy Objects} for most use cases but also
demonstrates a level of control over the synchronization.

@cartouche
@quotation Note 
The proxy types in @code{multiprocessing} do nothing to support comparisons
by value.  So, for instance, we have:

@example
>>> manager.list([1,2,3]) == [1,2,3]
False
@end example

One should just use a copy of the referent instead when making comparisons.
@end quotation
@end cartouche

@geindex BaseProxy (class in multiprocessing.managers)
@anchor{library/multiprocessing multiprocessing managers BaseProxy}@anchor{3718}
@deffn {Class} multiprocessing.managers.BaseProxy

Proxy objects are instances of subclasses of @code{BaseProxy}.

@geindex _callmethod() (multiprocessing.managers.BaseProxy method)
@anchor{library/multiprocessing multiprocessing managers BaseProxy _callmethod}@anchor{3719}
@deffn {Method} _callmethod (methodname[, args[, kwds]])

Call and return the result of a method of the proxy’s referent.

If @code{proxy} is a proxy whose referent is @code{obj} then the expression

@example
proxy._callmethod(methodname, args, kwds)
@end example

will evaluate the expression

@example
getattr(obj, methodname)(*args, **kwds)
@end example

in the manager’s process.

The returned value will be a copy of the result of the call or a proxy to
a new shared object – see documentation for the `method_to_typeid'
argument of @ref{3717,,BaseManager.register()}.

If an exception is raised by the call, then is re-raised by
@code{_callmethod()}.  If some other exception is raised in the manager’s
process then this is converted into a @code{RemoteError} exception and is
raised by @code{_callmethod()}.

Note in particular that an exception will be raised if `methodname' has
not been `exposed'.

An example of the usage of @code{_callmethod()}:

@example
>>> l = manager.list(range(10))
>>> l._callmethod('__len__')
10
>>> l._callmethod('__getitem__', (slice(2, 7),)) # equivalent to l[2:7]
[2, 3, 4, 5, 6]
>>> l._callmethod('__getitem__', (20,))          # equivalent to l[20]
Traceback (most recent call last):
...
IndexError: list index out of range
@end example
@end deffn

@geindex _getvalue() (multiprocessing.managers.BaseProxy method)
@anchor{library/multiprocessing multiprocessing managers BaseProxy _getvalue}@anchor{3726}
@deffn {Method} _getvalue ()

Return a copy of the referent.

If the referent is unpicklable then this will raise an exception.
@end deffn

@geindex __repr__() (multiprocessing.managers.BaseProxy method)
@anchor{library/multiprocessing multiprocessing managers BaseProxy __repr__}@anchor{3727}
@deffn {Method} __repr__ ()

Return a representation of the proxy object.
@end deffn

@geindex __str__() (multiprocessing.managers.BaseProxy method)
@anchor{library/multiprocessing multiprocessing managers BaseProxy __str__}@anchor{3728}
@deffn {Method} __str__ ()

Return the representation of the referent.
@end deffn
@end deffn

@menu
* Cleanup: Cleanup<2>. 

@end menu

@node Cleanup<2>,,,Proxy Objects
@anchor{library/multiprocessing cleanup}@anchor{3729}
@subsubsection Cleanup


A proxy object uses a weakref callback so that when it gets garbage collected it
deregisters itself from the manager which owns its referent.

A shared object gets deleted from the manager process when there are no longer
any proxies referring to it.

@node Process Pools,Listeners and Clients,Proxy Objects,Reference<3>
@anchor{library/multiprocessing module-multiprocessing pool}@anchor{9c}@anchor{library/multiprocessing process-pools}@anchor{372a}
@subsubsection Process Pools


@geindex module; multiprocessing.pool

One can create a pool of processes which will carry out tasks submitted to it
with the @ref{1171,,Pool} class.

@geindex Pool (class in multiprocessing.pool)
@anchor{library/multiprocessing multiprocessing pool Pool}@anchor{1171}
@deffn {Class} multiprocessing.pool.Pool ([processes[, initializer[, initargs[, maxtasksperchild[, context]]]]])

A process pool object which controls a pool of worker processes to which jobs
can be submitted.  It supports asynchronous results with timeouts and
callbacks and has a parallel map implementation.

`processes' is the number of worker processes to use.  If `processes' is
@code{None} then the number returned by @ref{4db,,os.process_cpu_count()} is used.

If `initializer' is not @code{None} then each worker process will call
@code{initializer(*initargs)} when it starts.

`maxtasksperchild' is the number of tasks a worker process can complete
before it will exit and be replaced with a fresh worker process, to enable
unused resources to be freed. The default `maxtasksperchild' is @code{None}, which
means worker processes will live as long as the pool.

`context' can be used to specify the context used for starting
the worker processes.  Usually a pool is created using the
function @code{multiprocessing.Pool()} or the @ref{1171,,Pool()} method
of a context object.  In both cases `context' is set
appropriately. If @code{None}, calling this function will have the side effect
of setting the current global start method if it has not been set already.
See the @code{get_context()} function.

Note that the methods of the pool object should only be called by
the process which created the pool.

@cartouche
@quotation Warning 
@ref{9c,,multiprocessing.pool} objects have internal resources that need to be
properly managed (like any other resource) by using the pool as a context manager
or by calling @ref{372b,,close()} and @ref{372c,,terminate()} manually. Failure to do this
can lead to the process hanging on finalization.

Note that it is `not correct' to rely on the garbage collector to destroy the pool
as CPython does not assure that the finalizer of the pool will be called
(see @ref{1203,,object.__del__()} for more information).
@end quotation
@end cartouche


Changed in version 3.2: Added the `maxtasksperchild' parameter.



Changed in version 3.4: Added the `context' parameter.



Changed in version 3.13: `processes' uses @ref{4db,,os.process_cpu_count()} by default, instead of
@ref{4dc,,os.cpu_count()}.


@cartouche
@quotation Note 
Worker processes within a @code{Pool} typically live for the complete
duration of the Pool’s work queue. A frequent pattern found in other
systems (such as Apache, mod_wsgi, etc) to free resources held by
workers is to allow a worker within a pool to complete only a set
amount of work before exiting, being cleaned up and a new
process spawned to replace the old one. The `maxtasksperchild'
argument to the @code{Pool} exposes this ability to the end user.
@end quotation
@end cartouche

@geindex apply() (multiprocessing.pool.Pool method)
@anchor{library/multiprocessing multiprocessing pool Pool apply}@anchor{15a1}
@deffn {Method} apply (func[, args[, kwds]])

Call `func' with arguments `args' and keyword arguments `kwds'.  It blocks
until the result is ready. Given this blocks, @ref{15a2,,apply_async()} is
better suited for performing work in parallel. Additionally, `func'
is only executed in one of the workers of the pool.
@end deffn

@geindex apply_async() (multiprocessing.pool.Pool method)
@anchor{library/multiprocessing multiprocessing pool Pool apply_async}@anchor{15a2}
@deffn {Method} apply_async (func[, args[, kwds[, callback[, error_callback]]]])

A variant of the @ref{15a1,,apply()} method which returns a
@ref{372d,,AsyncResult} object.

If `callback' is specified then it should be a callable which accepts a
single argument.  When the result becomes ready `callback' is applied to
it, that is unless the call failed, in which case the `error_callback'
is applied instead.

If `error_callback' is specified then it should be a callable which
accepts a single argument.  If the target function fails, then
the `error_callback' is called with the exception instance.

Callbacks should complete immediately since otherwise the thread which
handles the results will get blocked.
@end deffn

@geindex map() (multiprocessing.pool.Pool method)
@anchor{library/multiprocessing multiprocessing pool Pool map}@anchor{12f1}
@deffn {Method} map (func, iterable[, chunksize])

A parallel equivalent of the @ref{1a0,,map()} built-in function (it supports only
one `iterable' argument though, for multiple iterables see @ref{12ee,,starmap()}).
It blocks until the result is ready.

This method chops the iterable into a number of chunks which it submits to
the process pool as separate tasks.  The (approximate) size of these
chunks can be specified by setting `chunksize' to a positive integer.

Note that it may cause high memory usage for very long iterables. Consider
using @ref{372e,,imap()} or @ref{372f,,imap_unordered()} with explicit `chunksize'
option for better efficiency.
@end deffn

@geindex map_async() (multiprocessing.pool.Pool method)
@anchor{library/multiprocessing multiprocessing pool Pool map_async}@anchor{12f2}
@deffn {Method} map_async (func, iterable[, chunksize[, callback[, error_callback]]])

A variant of the @ref{12f1,,map()} method which returns a
@ref{372d,,AsyncResult} object.

If `callback' is specified then it should be a callable which accepts a
single argument.  When the result becomes ready `callback' is applied to
it, that is unless the call failed, in which case the `error_callback'
is applied instead.

If `error_callback' is specified then it should be a callable which
accepts a single argument.  If the target function fails, then
the `error_callback' is called with the exception instance.

Callbacks should complete immediately since otherwise the thread which
handles the results will get blocked.
@end deffn

@geindex imap() (multiprocessing.pool.Pool method)
@anchor{library/multiprocessing multiprocessing pool Pool imap}@anchor{372e}
@deffn {Method} imap (func, iterable[, chunksize])

A lazier version of @ref{12f1,,map()}.

The `chunksize' argument is the same as the one used by the @ref{12f1,,map()}
method.  For very long iterables using a large value for `chunksize' can
make the job complete `much' faster than using the default value of
@code{1}.

Also if `chunksize' is @code{1} then the @code{next()} method of the iterator
returned by the @code{imap()} method has an optional `timeout' parameter:
@code{next(timeout)} will raise @ref{36df,,multiprocessing.TimeoutError} if the
result cannot be returned within `timeout' seconds.
@end deffn

@geindex imap_unordered() (multiprocessing.pool.Pool method)
@anchor{library/multiprocessing multiprocessing pool Pool imap_unordered}@anchor{372f}
@deffn {Method} imap_unordered (func, iterable[, chunksize])

The same as @ref{372e,,imap()} except that the ordering of the results from the
returned iterator should be considered arbitrary.  (Only when there is
only one worker process is the order guaranteed to be “correct”.)
@end deffn

@geindex starmap() (multiprocessing.pool.Pool method)
@anchor{library/multiprocessing multiprocessing pool Pool starmap}@anchor{12ee}
@deffn {Method} starmap (func, iterable[, chunksize])

Like @ref{12f1,,map()} except that the
elements of the `iterable' are expected to be iterables that are
unpacked as arguments.

Hence an `iterable' of @code{[(1,2), (3, 4)]} results in @code{[func(1,2),
func(3,4)]}.


Added in version 3.3.

@end deffn

@geindex starmap_async() (multiprocessing.pool.Pool method)
@anchor{library/multiprocessing multiprocessing pool Pool starmap_async}@anchor{12ef}
@deffn {Method} starmap_async (func, iterable[, chunksize[, callback[, error_callback]]])

A combination of @ref{12ee,,starmap()} and @ref{12f2,,map_async()} that iterates over
`iterable' of iterables and calls `func' with the iterables unpacked.
Returns a result object.


Added in version 3.3.

@end deffn

@geindex close() (multiprocessing.pool.Pool method)
@anchor{library/multiprocessing multiprocessing pool Pool close}@anchor{372b}
@deffn {Method} close ()

Prevents any more tasks from being submitted to the pool.  Once all the
tasks have been completed the worker processes will exit.
@end deffn

@geindex terminate() (multiprocessing.pool.Pool method)
@anchor{library/multiprocessing multiprocessing pool Pool terminate}@anchor{372c}
@deffn {Method} terminate ()

Stops the worker processes immediately without completing outstanding
work.  When the pool object is garbage collected @code{terminate()} will be
called immediately.
@end deffn

@geindex join() (multiprocessing.pool.Pool method)
@anchor{library/multiprocessing multiprocessing pool Pool join}@anchor{3730}
@deffn {Method} join ()

Wait for the worker processes to exit.  One must call @ref{372b,,close()} or
@ref{372c,,terminate()} before using @code{join()}.
@end deffn


Changed in version 3.3: Pool objects now support the context management protocol – see
@ref{2453,,Context Manager Types}.  @ref{26f3,,__enter__()} returns the
pool object, and @ref{26f4,,__exit__()} calls @ref{372c,,terminate()}.

@end deffn

@geindex AsyncResult (class in multiprocessing.pool)
@anchor{library/multiprocessing multiprocessing pool AsyncResult}@anchor{372d}
@deffn {Class} multiprocessing.pool.AsyncResult

The class of the result returned by @ref{15a2,,Pool.apply_async()} and
@ref{12f2,,Pool.map_async()}.

@geindex get() (multiprocessing.pool.AsyncResult method)
@anchor{library/multiprocessing multiprocessing pool AsyncResult get}@anchor{3731}
@deffn {Method} get ([timeout])

Return the result when it arrives.  If `timeout' is not @code{None} and the
result does not arrive within `timeout' seconds then
@ref{36df,,multiprocessing.TimeoutError} is raised.  If the remote call raised
an exception then that exception will be reraised by @code{get()}.
@end deffn

@geindex wait() (multiprocessing.pool.AsyncResult method)
@anchor{library/multiprocessing multiprocessing pool AsyncResult wait}@anchor{3732}
@deffn {Method} wait ([timeout])

Wait until the result is available or until `timeout' seconds pass.
@end deffn

@geindex ready() (multiprocessing.pool.AsyncResult method)
@anchor{library/multiprocessing multiprocessing pool AsyncResult ready}@anchor{3733}
@deffn {Method} ready ()

Return whether the call has completed.
@end deffn

@geindex successful() (multiprocessing.pool.AsyncResult method)
@anchor{library/multiprocessing multiprocessing pool AsyncResult successful}@anchor{3734}
@deffn {Method} successful ()

Return whether the call completed without raising an exception.  Will
raise @ref{2ee,,ValueError} if the result is not ready.


Changed in version 3.7: If the result is not ready, @ref{2ee,,ValueError} is raised instead of
@ref{8ba,,AssertionError}.

@end deffn
@end deffn

The following example demonstrates the use of a pool:

@example
from multiprocessing import Pool
import time

def f(x):
    return x*x

if __name__ == '__main__':
    with Pool(processes=4) as pool:         # start 4 worker processes
        result = pool.apply_async(f, (10,)) # evaluate "f(10)" asynchronously in a single process
        print(result.get(timeout=1))        # prints "100" unless your computer is *very* slow

        print(pool.map(f, range(10)))       # prints "[0, 1, 4,..., 81]"

        it = pool.imap(f, range(10))
        print(next(it))                     # prints "0"
        print(next(it))                     # prints "1"
        print(it.next(timeout=1))           # prints "4" unless your computer is *very* slow

        result = pool.apply_async(time.sleep, (10,))
        print(result.get(timeout=1))        # raises multiprocessing.TimeoutError
@end example

@node Listeners and Clients,Authentication keys,Process Pools,Reference<3>
@anchor{library/multiprocessing listeners-and-clients}@anchor{3735}@anchor{library/multiprocessing module-multiprocessing connection}@anchor{99}@anchor{library/multiprocessing multiprocessing-listeners-clients}@anchor{36f7}
@subsubsection Listeners and Clients


@geindex module; multiprocessing.connection

Usually message passing between processes is done using queues or by using
@ref{12ec,,Connection} objects returned by
@ref{36c6,,Pipe()}.

However, the @code{multiprocessing.connection} module allows some extra
flexibility.  It basically gives a high level message oriented API for dealing
with sockets or Windows named pipes.  It also has support for `digest
authentication' using the @ref{6e,,hmac} module, and for polling
multiple connections at the same time.

@geindex deliver_challenge() (in module multiprocessing.connection)
@anchor{library/multiprocessing multiprocessing connection deliver_challenge}@anchor{3736}
@deffn {Function} multiprocessing.connection.deliver_challenge (connection, authkey)

Send a randomly generated message to the other end of the connection and wait
for a reply.

If the reply matches the digest of the message using `authkey' as the key
then a welcome message is sent to the other end of the connection.  Otherwise
@ref{36de,,AuthenticationError} is raised.
@end deffn

@geindex answer_challenge() (in module multiprocessing.connection)
@anchor{library/multiprocessing multiprocessing connection answer_challenge}@anchor{3737}
@deffn {Function} multiprocessing.connection.answer_challenge (connection, authkey)

Receive a message, calculate the digest of the message using `authkey' as the
key, and then send the digest back.

If a welcome message is not received, then
@ref{36de,,AuthenticationError} is raised.
@end deffn

@geindex Client() (in module multiprocessing.connection)
@anchor{library/multiprocessing multiprocessing connection Client}@anchor{3738}
@deffn {Function} multiprocessing.connection.Client (address[, family[, authkey]])

Attempt to set up a connection to the listener which is using address
`address', returning a @ref{12ec,,Connection}.

The type of the connection is determined by `family' argument, but this can
generally be omitted since it can usually be inferred from the format of
`address'. (See @ref{3739,,Address Formats})

If `authkey' is given and not @code{None}, it should be a byte string and will be
used as the secret key for an HMAC-based authentication challenge. No
authentication is done if `authkey' is @code{None}.
@ref{36de,,AuthenticationError} is raised if authentication fails.
See @ref{36db,,Authentication keys}.
@end deffn

@geindex Listener (class in multiprocessing.connection)
@anchor{library/multiprocessing multiprocessing connection Listener}@anchor{1a6a}
@deffn {Class} multiprocessing.connection.Listener ([address[, family[, backlog[, authkey]]]])

A wrapper for a bound socket or Windows named pipe which is ‘listening’ for
connections.

`address' is the address to be used by the bound socket or named pipe of the
listener object.

@cartouche
@quotation Note 
If an address of ‘0.0.0.0’ is used, the address will not be a connectable
end point on Windows. If you require a connectable end-point,
you should use ‘127.0.0.1’.
@end quotation
@end cartouche

`family' is the type of socket (or named pipe) to use.  This can be one of
the strings @code{'AF_INET'} (for a TCP socket), @code{'AF_UNIX'} (for a Unix
domain socket) or @code{'AF_PIPE'} (for a Windows named pipe).  Of these only
the first is guaranteed to be available.  If `family' is @code{None} then the
family is inferred from the format of `address'.  If `address' is also
@code{None} then a default is chosen.  This default is the family which is
assumed to be the fastest available.  See
@ref{3739,,Address Formats}.  Note that if `family' is
@code{'AF_UNIX'} and address is @code{None} then the socket will be created in a
private temporary directory created using @ref{2d3b,,tempfile.mkstemp()}.

If the listener object uses a socket then `backlog' (1 by default) is passed
to the @ref{1064,,listen()} method of the socket once it has been
bound.

If `authkey' is given and not @code{None}, it should be a byte string and will be
used as the secret key for an HMAC-based authentication challenge. No
authentication is done if `authkey' is @code{None}.
@ref{36de,,AuthenticationError} is raised if authentication fails.
See @ref{36db,,Authentication keys}.

@geindex accept() (multiprocessing.connection.Listener method)
@anchor{library/multiprocessing multiprocessing connection Listener accept}@anchor{1a23}
@deffn {Method} accept ()

Accept a connection on the bound socket or named pipe of the listener
object and return a @ref{12ec,,Connection} object.
If authentication is attempted and fails, then
@ref{36de,,AuthenticationError} is raised.
@end deffn

@geindex close() (multiprocessing.connection.Listener method)
@anchor{library/multiprocessing multiprocessing connection Listener close}@anchor{373a}
@deffn {Method} close ()

Close the bound socket or named pipe of the listener object.  This is
called automatically when the listener is garbage collected.  However it
is advisable to call it explicitly.
@end deffn

Listener objects have the following read-only properties:

@geindex address (multiprocessing.connection.Listener attribute)
@anchor{library/multiprocessing multiprocessing connection Listener address}@anchor{373b}
@deffn {Attribute} address

The address which is being used by the Listener object.
@end deffn

@geindex last_accepted (multiprocessing.connection.Listener attribute)
@anchor{library/multiprocessing multiprocessing connection Listener last_accepted}@anchor{373c}
@deffn {Attribute} last_accepted

The address from which the last accepted connection came.  If this is
unavailable then it is @code{None}.
@end deffn


Changed in version 3.3: Listener objects now support the context management protocol – see
@ref{2453,,Context Manager Types}.  @ref{26f3,,__enter__()} returns the
listener object, and @ref{26f4,,__exit__()} calls @ref{373a,,close()}.

@end deffn

@geindex wait() (in module multiprocessing.connection)
@anchor{library/multiprocessing multiprocessing connection wait}@anchor{12eb}
@deffn {Function} multiprocessing.connection.wait (object_list, timeout=None)

Wait till an object in `object_list' is ready.  Returns the list of
those objects in `object_list' which are ready.  If `timeout' is a
float then the call blocks for at most that many seconds.  If
`timeout' is @code{None} then it will block for an unlimited period.
A negative timeout is equivalent to a zero timeout.

For both POSIX and Windows, an object can appear in `object_list' if
it is


@itemize *

@item 
a readable @ref{12ec,,Connection} object;

@item 
a connected and readable @ref{fa7,,socket.socket} object; or

@item 
the @ref{12ed,,sentinel} attribute of a
@ref{254,,Process} object.
@end itemize

A connection or socket object is ready when there is data available
to be read from it, or the other end has been closed.

`POSIX': @code{wait(object_list, timeout)} almost equivalent
@code{select.select(object_list, [], [], timeout)}.  The difference is
that, if @ref{fa6,,select.select()} is interrupted by a signal, it can
raise @ref{2c2,,OSError} with an error number of @code{EINTR}, whereas
@code{wait()} will not.

`Windows': An item in `object_list' must either be an integer
handle which is waitable (according to the definition used by the
documentation of the Win32 function @code{WaitForMultipleObjects()})
or it can be an object with a @ref{17fe,,fileno()} method which returns a
socket handle or pipe handle.  (Note that pipe handles and socket
handles are `not' waitable handles.)


Added in version 3.3.

@end deffn

`Examples'

The following server code creates a listener which uses @code{'secret password'} as
an authentication key.  It then waits for a connection and sends some data to
the client:

@example
from multiprocessing.connection import Listener
from array import array

address = ('localhost', 6000)     # family is deduced to be 'AF_INET'

with Listener(address, authkey=b'secret password') as listener:
    with listener.accept() as conn:
        print('connection accepted from', listener.last_accepted)

        conn.send([2.25, None, 'junk', float])

        conn.send_bytes(b'hello')

        conn.send_bytes(array('i', [42, 1729]))
@end example

The following code connects to the server and receives some data from the
server:

@example
from multiprocessing.connection import Client
from array import array

address = ('localhost', 6000)

with Client(address, authkey=b'secret password') as conn:
    print(conn.recv())                  # => [2.25, None, 'junk', float]

    print(conn.recv_bytes())            # => 'hello'

    arr = array('i', [0, 0, 0, 0, 0])
    print(conn.recv_bytes_into(arr))    # => 8
    print(arr)                          # => array('i', [42, 1729, 0, 0, 0])
@end example

The following code uses @ref{12eb,,wait()} to
wait for messages from multiple processes at once:

@example
from multiprocessing import Process, Pipe, current_process
from multiprocessing.connection import wait

def foo(w):
    for i in range(10):
        w.send((i, current_process().name))
    w.close()

if __name__ == '__main__':
    readers = []

    for i in range(4):
        r, w = Pipe(duplex=False)
        readers.append(r)
        p = Process(target=foo, args=(w,))
        p.start()
        # We close the writable end of the pipe now to be sure that
        # p is the only process which owns a handle for it.  This
        # ensures that when p closes its handle for the writable end,
        # wait() will promptly report the readable end as being ready.
        w.close()

    while readers:
        for r in wait(readers):
            try:
                msg = r.recv()
            except EOFError:
                readers.remove(r)
            else:
                print(msg)
@end example

@menu
* Address Formats:: 

@end menu

@node Address Formats,,,Listeners and Clients
@anchor{library/multiprocessing address-formats}@anchor{373d}@anchor{library/multiprocessing multiprocessing-address-formats}@anchor{3739}
@subsubsection Address Formats



@itemize *

@item 
An @code{'AF_INET'} address is a tuple of the form @code{(hostname, port)} where
`hostname' is a string and `port' is an integer.

@item 
An @code{'AF_UNIX'} address is a string representing a filename on the
filesystem.

@item 
An @code{'AF_PIPE'} address is a string of the form
@code{r'\\.\pipe\@var{PipeName}'}.  To use @ref{3738,,Client()} to connect to a named
pipe on a remote computer called `ServerName' one should use an address of the
form @code{r'\\@var{ServerName}\pipe\@var{PipeName}'} instead.
@end itemize

Note that any string beginning with two backslashes is assumed by default to be
an @code{'AF_PIPE'} address rather than an @code{'AF_UNIX'} address.

@node Authentication keys,Logging<2>,Listeners and Clients,Reference<3>
@anchor{library/multiprocessing authentication-keys}@anchor{373e}@anchor{library/multiprocessing multiprocessing-auth-keys}@anchor{36db}
@subsubsection Authentication keys


When one uses @ref{36f9,,Connection.recv}, the
data received is automatically
unpickled. Unfortunately unpickling data from an untrusted source is a security
risk. Therefore @ref{1a6a,,Listener} and @ref{3738,,Client()} use the @ref{6e,,hmac} module
to provide digest authentication.

An authentication key is a byte string which can be thought of as a
password: once a connection is established both ends will demand proof
that the other knows the authentication key.  (Demonstrating that both
ends are using the same key does `not' involve sending the key over
the connection.)

If authentication is requested but no authentication key is specified then the
return value of @code{current_process().authkey} is used (see
@ref{254,,Process}).  This value will be automatically inherited by
any @code{Process} object that the current process creates.
This means that (by default) all processes of a multi-process program will share
a single authentication key which can be used when setting up connections
between themselves.

Suitable authentication keys can also be generated by using @ref{747,,os.urandom()}.

This authentication protects @ref{1a6a,,Listener} and @ref{3738,,Client()} connections,
which are reachable by address.  It is not applied to the anonymous pipes
created by @ref{36c6,,Pipe()} or used internally by
@ref{1bcd,,Queue}.
@code{multiprocessing} treats all local processes running as the same user as
trusted; on most operating systems such processes can access each other’s pipe
file descriptors regardless.  Applications that require isolation between
processes of the same user must arrange it at the operating-system level –
for example, by running workers under a different user account or in a sandbox.

@node Logging<2>,The multiprocessing dummy module,Authentication keys,Reference<3>
@anchor{library/multiprocessing logging}@anchor{373f}
@subsubsection Logging


Some support for logging is available.  Note, however, that the @ref{8b,,logging}
package does not use process shared locks so it is possible (depending on the
handler type) for messages from different processes to get mixed up.

@geindex get_logger() (in module multiprocessing)
@anchor{library/multiprocessing multiprocessing get_logger}@anchor{3292}
@deffn {Function} multiprocessing.get_logger ()

Returns the logger used by @code{multiprocessing}.  If necessary, a new one
will be created.

When first created the logger has level @ref{31cc,,logging.NOTSET} and no
default handler. Messages sent to this logger will not by default propagate
to the root logger.

Note that on Windows child processes will only inherit the level of the
parent process’s logger – any other customization of the logger will not be
inherited.
@end deffn

@geindex log_to_stderr() (in module multiprocessing)
@anchor{library/multiprocessing multiprocessing log_to_stderr}@anchor{3740}
@deffn {Function} multiprocessing.log_to_stderr (level=None)

This function performs a call to @ref{3292,,get_logger()} but in addition to
returning the logger created by get_logger, it adds a handler which sends
output to @ref{b39,,sys.stderr} using format
@code{'[%(levelname)s/%(processName)s] %(message)s'}.
You can modify @code{levelname} of the logger by passing a @code{level} argument.
@end deffn

Below is an example session with logging turned on:

@example
>>> import multiprocessing, logging
>>> logger = multiprocessing.log_to_stderr()
>>> logger.setLevel(logging.INFO)
>>> logger.warning('doomed')
[WARNING/MainProcess] doomed
>>> m = multiprocessing.Manager()
[INFO/SyncManager-...] child process calling self.run()
[INFO/SyncManager-...] created temp directory /.../pymp-...
[INFO/SyncManager-...] manager serving at '/.../listener-...'
>>> del m
[INFO/MainProcess] sending shutdown message to manager
[INFO/SyncManager-...] manager exiting with exitcode 0
@end example

For a full table of logging levels, see the @ref{8b,,logging} module.

@node The multiprocessing dummy module,,Logging<2>,Reference<3>
@anchor{library/multiprocessing module-multiprocessing dummy}@anchor{9a}@anchor{library/multiprocessing the-multiprocessing-dummy-module}@anchor{3741}
@subsubsection The @code{multiprocessing.dummy} module


@geindex module; multiprocessing.dummy

@code{multiprocessing.dummy} replicates the API of @code{multiprocessing} but is
no more than a wrapper around the @ref{f3,,threading} module.

In particular, the @code{Pool} function provided by @code{multiprocessing.dummy}
returns an instance of @ref{1d18,,ThreadPool}, which is a subclass of
@ref{1171,,Pool} that supports all the same method calls but uses a pool of
worker threads rather than worker processes.

@geindex ThreadPool (class in multiprocessing.pool)
@anchor{library/multiprocessing multiprocessing pool ThreadPool}@anchor{1d18}
@deffn {Class} multiprocessing.pool.ThreadPool ([processes[, initializer[, initargs]]])

A thread pool object which controls a pool of worker threads to which jobs
can be submitted.  @code{ThreadPool} instances are fully interface
compatible with @ref{1171,,Pool} instances, and their resources must also be
properly managed, either by using the pool as a context manager or by
calling @ref{372b,,close()} and
@ref{372c,,terminate()} manually.

`processes' is the number of worker threads to use.  If `processes' is
@code{None} then the number returned by @ref{4db,,os.process_cpu_count()} is used.

If `initializer' is not @code{None} then each worker process will call
@code{initializer(*initargs)} when it starts.

Unlike @ref{1171,,Pool}, `maxtasksperchild' and `context' cannot be provided.

@cartouche
@quotation Note 
A @code{ThreadPool} shares the same interface as @ref{1171,,Pool}, which
is designed around a pool of processes and predates the introduction of
the @ref{24,,concurrent.futures} module.  As such, it inherits some
operations that don’t make sense for a pool backed by threads, and it
has its own type for representing the status of asynchronous jobs,
@ref{372d,,AsyncResult}, that is not understood by any other libraries.

Users should generally prefer to use
@ref{94e,,concurrent.futures.ThreadPoolExecutor}, which has a simpler
interface that was designed around threads from the start, and which
returns @ref{13be,,concurrent.futures.Future} instances that are
compatible with many other libraries, including @ref{b,,asyncio}.
@end quotation
@end cartouche
@end deffn

@node Programming guidelines,Examples<15>,Reference<3>,multiprocessing — Process-based parallelism
@anchor{library/multiprocessing multiprocessing-programming}@anchor{36c2}@anchor{library/multiprocessing programming-guidelines}@anchor{3742}
@subsubsection Programming guidelines


There are certain guidelines and idioms which should be adhered to when using
@code{multiprocessing}.

@menu
* All start methods:: 
* The spawn and forkserver start methods:: 

@end menu

@node All start methods,The spawn and forkserver start methods,,Programming guidelines
@anchor{library/multiprocessing all-start-methods}@anchor{3743}
@subsubsection All start methods


The following applies to all start methods.

Avoid shared state

@quotation

As far as possible one should try to avoid shifting large amounts of data
between processes.

It is probably best to stick to using queues or pipes for communication
between processes rather than using the lower level synchronization
primitives.
@end quotation

Picklability

@quotation

Ensure that the arguments to the methods of proxies are picklable.
@end quotation

Thread safety of proxies

@quotation

Do not use a proxy object from more than one thread unless you protect it
with a lock.

(There is never a problem with different processes using the `same' proxy.)
@end quotation

Joining zombie processes

@quotation

On POSIX when a process finishes but has not been joined it becomes a zombie.
There should never be very many because each time a new process starts (or
@ref{36f3,,active_children()} is called) all completed processes
which have not yet been joined will be joined.  Also calling a finished
process’s @ref{159e,,Process.is_alive} will
join the process.  Even so it is probably good
practice to explicitly join all the processes that you start.
@end quotation

Better to inherit than pickle/unpickle

@quotation

When using the `spawn' or `forkserver' start methods many types
from @code{multiprocessing} need to be picklable so that child
processes can use them.  However, one should generally avoid
sending shared objects to other processes using pipes or queues.
Instead you should arrange the program so that a process which
needs access to a shared resource created elsewhere can inherit it
from an ancestor process.
@end quotation

Avoid terminating processes

@quotation

Using the @ref{18a0,,Process.terminate}
method to stop a process is liable to
cause any shared resources (such as locks, semaphores, pipes and queues)
currently being used by the process to become broken or unavailable to other
processes.

Therefore it is probably best to only consider using
@ref{18a0,,Process.terminate} on processes
which never use any shared resources.
@end quotation

Joining processes that use queues

@quotation

Bear in mind that a process that has put items in a queue will wait before
terminating until all the buffered items are fed by the “feeder” thread to
the underlying pipe.  (The child process can call the
@ref{36e9,,Queue.cancel_join_thread}
method of the queue to avoid this behaviour.)

This means that whenever you use a queue you need to make sure that all
items which have been put on the queue will eventually be removed before the
process is joined.  Otherwise you cannot be sure that processes which have
put items on the queue will terminate.  Remember also that non-daemonic
processes will be joined automatically.

An example which will deadlock is the following:

@example
from multiprocessing import Process, Queue

def f(q):
    q.put('X' * 1000000)

if __name__ == '__main__':
    queue = Queue()
    p = Process(target=f, args=(queue,))
    p.start()
    p.join()                    # this deadlocks
    obj = queue.get()
@end example

A fix here would be to swap the last two lines (or simply remove the
@code{p.join()} line).
@end quotation

Explicitly pass resources to child processes

@quotation

On POSIX using the `fork' start method, a child process can make
use of a shared resource created in a parent process using a
global resource.  However, it is better to pass the object as an
argument to the constructor for the child process.

Apart from making the code (potentially) compatible with Windows
and the other start methods this also ensures that as long as the
child process is still alive the object will not be garbage
collected in the parent process.  This might be important if some
resource is freed when the object is garbage collected in the
parent process.

So for instance

@example
from multiprocessing import Process, Lock

def f():
    ... do something using "lock" ...

if __name__ == '__main__':
    lock = Lock()
    for i in range(10):
        Process(target=f).start()
@end example

should be rewritten as

@example
from multiprocessing import Process, Lock

def f(l):
    ... do something using "l" ...

if __name__ == '__main__':
    lock = Lock()
    for i in range(10):
        Process(target=f, args=(lock,)).start()
@end example
@end quotation

Beware of replacing @ref{760,,sys.stdin} with a “file like object”

@quotation

@code{multiprocessing} originally unconditionally called:

@example
os.close(sys.stdin.fileno())
@end example

in the @code{multiprocessing.Process._bootstrap()} method — this resulted
in issues with processes-in-processes. This has been changed to:

@example
sys.stdin.close()
sys.stdin = open(os.open(os.devnull, os.O_RDONLY), closefd=False)
@end example

Which solves the fundamental issue of processes colliding with each other
resulting in a bad file descriptor error, but introduces a potential danger
to applications which replace @ref{760,,sys.stdin()} with a “file-like object”
with output buffering.  This danger is that if multiple processes call
@ref{507,,close()} on this file-like object, it could result in the same
data being flushed to the object multiple times, resulting in corruption.

If you write a file-like object and implement your own caching, you can
make it fork-safe by storing the pid whenever you append to the cache,
and discarding the cache when the pid changes. For example:

@example
@@property
def cache(self):
    pid = os.getpid()
    if pid != self._pid:
        self._pid = pid
        self._cache = []
    return self._cache
@end example

For more information, see bpo-5155@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5155}, bpo-5313@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5313} and bpo-5331@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5331}
@end quotation
@anchor{library/multiprocessing multiprocessing-programming-spawn}@anchor{36d7}
@node The spawn and forkserver start methods,,All start methods,Programming guidelines
@anchor{library/multiprocessing multiprocessing-programming-forkserver}@anchor{1db}@anchor{library/multiprocessing the-spawn-and-forkserver-start-methods}@anchor{3744}
@subsubsection The `spawn' and `forkserver' start methods


There are a few extra restrictions which don’t apply to the `fork'
start method.

More picklability

@quotation

Ensure that all arguments to @ref{254,,Process} are
picklable.  Also, if you subclass @code{Process.__init__}, you must make sure
that instances will be picklable when the
@ref{159d,,Process.start} method is called.
@end quotation

Global variables

@quotation

Bear in mind that if code run in a child process tries to access a global
variable, then the value it sees (if any) may not be the same as the value
in the parent process at the time that @ref{159d,,Process.start} was called.

However, global variables which are just module level constants cause no
problems.
@end quotation
@anchor{library/multiprocessing multiprocessing-safe-main-import}@anchor{3745}
Safe importing of main module

@quotation

Make sure that the main module can be safely imported by a new Python
interpreter without causing unintended side effects (such as starting a new
process).

For example, using the `spawn' or `forkserver' start method
running the following module would fail with a
@ref{246,,RuntimeError}:

@example
from multiprocessing import Process

def foo():
    print('hello')

p = Process(target=foo)
p.start()
@end example

Instead one should protect the “entry point” of the program by using @code{if
__name__ == '__main__':} as follows:

@example
from multiprocessing import Process, freeze_support, set_start_method

def foo():
    print('hello')

if __name__ == '__main__':
    freeze_support()
    set_start_method('spawn')
    p = Process(target=foo)
    p.start()
@end example

(The @code{freeze_support()} line can be omitted if the program will be run
normally instead of frozen.)

This allows the newly spawned Python interpreter to safely import the module
and then run the module’s @code{foo()} function.

Similar restrictions apply if a pool or manager is created in the main
module.
@end quotation

@node Examples<15>,,Programming guidelines,multiprocessing — Process-based parallelism
@anchor{library/multiprocessing examples}@anchor{3746}@anchor{library/multiprocessing multiprocessing-examples}@anchor{36ea}
@subsubsection Examples


Demonstration of how to create and use customized managers and proxies:

@example
from multiprocessing import freeze_support
from multiprocessing.managers import BaseManager, BaseProxy
import operator

##

class Foo:
    def f(self):
        print('you called Foo.f()')
    def g(self):
        print('you called Foo.g()')
    def _h(self):
        print('you called Foo._h()')

# A simple generator function
def baz():
    for i in range(10):
        yield i*i

# Proxy type for generator objects
class GeneratorProxy(BaseProxy):
    _exposed_ = ['__next__']
    def __iter__(self):
        return self
    def __next__(self):
        return self._callmethod('__next__')

# Function to return the operator module
def get_operator_module():
    return operator

##

class MyManager(BaseManager):
    pass

# register the Foo class; make `f()` and `g()` accessible via proxy
MyManager.register('Foo1', Foo)

# register the Foo class; make `g()` and `_h()` accessible via proxy
MyManager.register('Foo2', Foo, exposed=('g', '_h'))

# register the generator function baz; use `GeneratorProxy` to make proxies
MyManager.register('baz', baz, proxytype=GeneratorProxy)

# register get_operator_module(); make public functions accessible via proxy
MyManager.register('operator', get_operator_module)

##

def test():
    manager = MyManager()
    manager.start()

    print('-' * 20)

    f1 = manager.Foo1()
    f1.f()
    f1.g()
    assert not hasattr(f1, '_h')
    assert sorted(f1._exposed_) == sorted(['f', 'g'])

    print('-' * 20)

    f2 = manager.Foo2()
    f2.g()
    f2._h()
    assert not hasattr(f2, 'f')
    assert sorted(f2._exposed_) == sorted(['g', '_h'])

    print('-' * 20)

    it = manager.baz()
    for i in it:
        print('<%d>' % i, end=' ')
    print()

    print('-' * 20)

    op = manager.operator()
    print('op.add(23, 45) =', op.add(23, 45))
    print('op.pow(2, 94) =', op.pow(2, 94))
    print('op._exposed_ =', op._exposed_)

##

if __name__ == '__main__':
    freeze_support()
    test()
@end example

Using @ref{1171,,Pool}:

@example
import multiprocessing
import time
import random
import sys

#
# Functions used by test code
#

def calculate(func, args):
    result = func(*args)
    return '%s says that %s%s = %s' % (
        multiprocessing.current_process().name,
        func.__name__, args, result
        )

def calculatestar(args):
    return calculate(*args)

def mul(a, b):
    time.sleep(0.5 * random.random())
    return a * b

def plus(a, b):
    time.sleep(0.5 * random.random())
    return a + b

def f(x):
    return 1.0 / (x - 5.0)

def pow3(x):
    return x ** 3

def noop(x):
    pass

#
# Test code
#

def test():
    PROCESSES = 4
    print('Creating pool with %d processes\n' % PROCESSES)

    with multiprocessing.Pool(PROCESSES) as pool:
        #
        # Tests
        #

        TASKS = [(mul, (i, 7)) for i in range(10)] + \
                [(plus, (i, 8)) for i in range(10)]

        results = [pool.apply_async(calculate, t) for t in TASKS]
        imap_it = pool.imap(calculatestar, TASKS)
        imap_unordered_it = pool.imap_unordered(calculatestar, TASKS)

        print('Ordered results using pool.apply_async():')
        for r in results:
            print('\t', r.get())
        print()

        print('Ordered results using pool.imap():')
        for x in imap_it:
            print('\t', x)
        print()

        print('Unordered results using pool.imap_unordered():')
        for x in imap_unordered_it:
            print('\t', x)
        print()

        print('Ordered results using pool.map() --- will block till complete:')
        for x in pool.map(calculatestar, TASKS):
            print('\t', x)
        print()

        #
        # Test error handling
        #

        print('Testing error handling:')

        try:
            print(pool.apply(f, (5,)))
        except ZeroDivisionError:
            print('\tGot ZeroDivisionError as expected from pool.apply()')
        else:
            raise AssertionError('expected ZeroDivisionError')

        try:
            print(pool.map(f, list(range(10))))
        except ZeroDivisionError:
            print('\tGot ZeroDivisionError as expected from pool.map()')
        else:
            raise AssertionError('expected ZeroDivisionError')

        try:
            print(list(pool.imap(f, list(range(10)))))
        except ZeroDivisionError:
            print('\tGot ZeroDivisionError as expected from list(pool.imap())')
        else:
            raise AssertionError('expected ZeroDivisionError')

        it = pool.imap(f, list(range(10)))
        for i in range(10):
            try:
                x = next(it)
            except ZeroDivisionError:
                if i == 5:
                    pass
            except StopIteration:
                break
            else:
                if i == 5:
                    raise AssertionError('expected ZeroDivisionError')

        assert i == 9
        print('\tGot ZeroDivisionError as expected from IMapIterator.next()')
        print()

        #
        # Testing timeouts
        #

        print('Testing ApplyResult.get() with timeout:', end=' ')
        res = pool.apply_async(calculate, TASKS[0])
        while 1:
            sys.stdout.flush()
            try:
                sys.stdout.write('\n\t%s' % res.get(0.02))
                break
            except multiprocessing.TimeoutError:
                sys.stdout.write('.')
        print()
        print()

        print('Testing IMapIterator.next() with timeout:', end=' ')
        it = pool.imap(calculatestar, TASKS)
        while 1:
            sys.stdout.flush()
            try:
                sys.stdout.write('\n\t%s' % it.next(0.02))
            except StopIteration:
                break
            except multiprocessing.TimeoutError:
                sys.stdout.write('.')
        print()
        print()


if __name__ == '__main__':
    multiprocessing.freeze_support()
    test()
@end example

An example showing how to use queues to feed tasks to a collection of worker
processes and collect the results:

@example
import time
import random

from multiprocessing import Process, Queue, current_process, freeze_support

#
# Function run by worker processes
#

def worker(input, output):
    for func, args in iter(input.get, 'STOP'):
        result = calculate(func, args)
        output.put(result)

#
# Function used to calculate result
#

def calculate(func, args):
    result = func(*args)
    return '%s says that %s%s = %s' % \
        (current_process().name, func.__name__, args, result)

#
# Functions referenced by tasks
#

def mul(a, b):
    time.sleep(0.5*random.random())
    return a * b

def plus(a, b):
    time.sleep(0.5*random.random())
    return a + b

#
#
#

def test():
    NUMBER_OF_PROCESSES = 4
    TASKS1 = [(mul, (i, 7)) for i in range(20)]
    TASKS2 = [(plus, (i, 8)) for i in range(10)]

    # Create queues
    task_queue = Queue()
    done_queue = Queue()

    # Submit tasks
    for task in TASKS1:
        task_queue.put(task)

    # Start worker processes
    for i in range(NUMBER_OF_PROCESSES):
        Process(target=worker, args=(task_queue, done_queue)).start()

    # Get and print results
    print('Unordered results:')
    for i in range(len(TASKS1)):
        print('\t', done_queue.get())

    # Add more tasks using `put()`
    for task in TASKS2:
        task_queue.put(task)

    # Get and print some more results
    for i in range(len(TASKS2)):
        print('\t', done_queue.get())

    # Tell child processes to stop
    for i in range(NUMBER_OF_PROCESSES):
        task_queue.put('STOP')


if __name__ == '__main__':
    freeze_support()
    test()
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node multiprocessing shared_memory — Shared memory for direct access across processes,The concurrent package,multiprocessing — Process-based parallelism,Concurrent Execution
@anchor{library/multiprocessing shared_memory doc}@anchor{3747}@anchor{library/multiprocessing shared_memory module-multiprocessing shared_memory}@anchor{9d}@anchor{library/multiprocessing shared_memory multiprocessing-shared-memory-shared-memory-for-direct-access-across-processes}@anchor{3748}@anchor{library/multiprocessing shared_memory translation-repo}@anchor{3749}
@subsection @code{multiprocessing.shared_memory} — Shared memory for direct access across processes


@geindex module; multiprocessing.shared_memory

`Source code:' Lib/multiprocessing/shared_memory.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/multiprocessing/shared_memory.py}


Added in version 3.8.


@geindex Shared Memory
@geindex POSIX Shared Memory
@geindex Named Shared Memory


__________________________________________________________________


This module provides a class, @ref{1a1c,,SharedMemory}, for the allocation
and management of shared memory to be accessed by one or more processes
on a multicore or symmetric multiprocessor (SMP) machine.  To assist with
the life-cycle management of shared memory especially across distinct
processes, a @ref{3711,,BaseManager} subclass,
@ref{374a,,SharedMemoryManager}, is also provided in the
@ref{9b,,multiprocessing.managers} module.

In this module, shared memory refers to “POSIX style” shared memory blocks
(though is not necessarily implemented explicitly as such) and does not refer
to “distributed shared memory”.  This style of shared memory permits distinct
processes to potentially read and write to a common (or shared) region of
volatile memory.  Processes are conventionally limited to only have access to
their own process memory space but shared memory permits the sharing
of data between processes, avoiding the need to instead send messages between
processes containing that data.  Sharing data directly via memory can provide
significant performance benefits compared to sharing data via disk or socket
or other communications requiring the serialization/deserialization and
copying of data.

@geindex SharedMemory (class in multiprocessing.shared_memory)
@anchor{library/multiprocessing shared_memory multiprocessing shared_memory SharedMemory}@anchor{1a1c}
@deffn {Class} multiprocessing.shared_memory.SharedMemory (name=None, create=False, size=0, *, track=True)

Create an instance of the @code{SharedMemory} class for either
creating a new shared memory block or attaching to an existing shared
memory block.  Each shared memory block is assigned a unique name.
In this way, one process can create a shared memory block with a
particular name and a different process can attach to that same shared
memory block using that same name.

As a resource for sharing data across processes, shared memory blocks
may outlive the original process that created them.  When one process
no longer needs access to a shared memory block that might still be
needed by other processes, the @ref{374b,,close()} method should be called.
When a shared memory block is no longer needed by any process, the
@ref{374c,,unlink()} method should be called to ensure proper cleanup.

@*Parameters: 

@itemize *

@item 
@code{name} (@ref{16a,,str}@code{ | }@code{None}) – The unique name for the requested shared memory, specified as a string.
When creating a new shared memory block, if @code{None} (the default)
is supplied for the name, a novel name will be generated.

@item 
@code{create} (@ref{3c1,,bool}) – Control whether a new shared memory block is created (@code{True})
or an existing shared memory block is attached (@code{False}).

@item 
@code{size} (@ref{19c,,int}) – The requested number of bytes when creating a new shared memory block.
Because some platforms choose to allocate chunks of memory
based upon that platform’s memory page size, the exact size of the shared
memory block may be larger or equal to the size requested.
When attaching to an existing shared memory block,
the `size' parameter is ignored.

@item 
@code{track} (@ref{3c1,,bool}) – When @code{True}, register the shared memory block with a resource
tracker process on platforms where the OS does not do this automatically.
The resource tracker ensures proper cleanup of the shared memory even
if all other processes with access to the memory exit without doing so.
Python processes created from a common ancestor using @ref{98,,multiprocessing}
facilities share a single resource tracker process, and the lifetime of
shared memory segments is handled automatically among these processes.
Python processes created in any other way will receive their own
resource tracker when accessing shared memory with `track' enabled.
This will cause the shared memory to be deleted by the resource tracker
of the first process that terminates.
To avoid this issue, users of @ref{dc,,subprocess} or standalone Python
processes should set `track' to @code{False} when there is already another
process in place that does the bookkeeping.
`track' is ignored on Windows, which has its own tracking and
automatically deletes shared memory when all handles to it have been closed.
@end itemize



Changed in version 3.13: Added the `track' parameter.


@geindex close() (multiprocessing.shared_memory.SharedMemory method)
@anchor{library/multiprocessing shared_memory multiprocessing shared_memory SharedMemory close}@anchor{374b}
@deffn {Method} close ()

Close the file descriptor/handle to the shared memory from this
instance.  @code{close()} should be called once access to the shared
memory block from this instance is no longer needed.  Depending
on operating system, the underlying memory may or may not be freed
even if all handles to it have been closed.  To ensure proper cleanup,
use the @ref{374c,,unlink()} method.
@end deffn

@geindex unlink() (multiprocessing.shared_memory.SharedMemory method)
@anchor{library/multiprocessing shared_memory multiprocessing shared_memory SharedMemory unlink}@anchor{374c}
@deffn {Method} unlink ()

Delete the underlying shared memory block.  This should be called only
once per shared memory block regardless of the number of handles to it,
even in other processes.
@code{unlink()} and @ref{374b,,close()} can be called in any order, but
trying to access data inside a shared memory block after @code{unlink()}
may result in memory access errors, depending on platform.

This method has no effect on Windows, where the only way to delete a
shared memory block is to close all handles.
@end deffn

@geindex buf (multiprocessing.shared_memory.SharedMemory attribute)
@anchor{library/multiprocessing shared_memory multiprocessing shared_memory SharedMemory buf}@anchor{374d}
@deffn {Attribute} buf

A memoryview of contents of the shared memory block.
@end deffn

@geindex name (multiprocessing.shared_memory.SharedMemory attribute)
@anchor{library/multiprocessing shared_memory multiprocessing shared_memory SharedMemory name}@anchor{374e}
@deffn {Attribute} name

Read-only access to the unique name of the shared memory block.
@end deffn

@geindex size (multiprocessing.shared_memory.SharedMemory attribute)
@anchor{library/multiprocessing shared_memory multiprocessing shared_memory SharedMemory size}@anchor{374f}
@deffn {Attribute} size

Read-only access to size in bytes of the shared memory block.
@end deffn
@end deffn

The following example demonstrates low-level use of @ref{1a1c,,SharedMemory}
instances:

@example
>>> from multiprocessing import shared_memory
>>> shm_a = shared_memory.SharedMemory(create=True, size=10)
>>> type(shm_a.buf)
<class 'memoryview'>
>>> buffer = shm_a.buf
>>> len(buffer)
10
>>> buffer[:4] = bytearray([22, 33, 44, 55])  # Modify multiple at once
>>> buffer[4] = 100                           # Modify single byte at a time
>>> # Attach to an existing shared memory block
>>> shm_b = shared_memory.SharedMemory(shm_a.name)
>>> import array
>>> array.array('b', shm_b.buf[:5])  # Copy the data into a new array.array
array('b', [22, 33, 44, 55, 100])
>>> shm_b.buf[:5] = b'howdy'  # Modify via shm_b using bytes
>>> bytes(shm_a.buf[:5])      # Access via shm_a
b'howdy'
>>> shm_b.close()   # Close each SharedMemory instance
>>> shm_a.close()
>>> shm_a.unlink()  # Call unlink only once to release the shared memory
@end example

The following example demonstrates a practical use of the @ref{1a1c,,SharedMemory}
class with NumPy arrays@footnote{https://numpy.org/}, accessing the
same @code{numpy.ndarray} from two distinct Python shells:

@example
>>> # In the first Python interactive shell
>>> import numpy as np
>>> a = np.array([1, 1, 2, 3, 5, 8])  # Start with an existing NumPy array
>>> from multiprocessing import shared_memory
>>> shm = shared_memory.SharedMemory(create=True, size=a.nbytes)
>>> # Now create a NumPy array backed by shared memory
>>> b = np.ndarray(a.shape, dtype=a.dtype, buffer=shm.buf)
>>> b[:] = a[:]  # Copy the original data into shared memory
>>> b
array([1, 1, 2, 3, 5, 8])
>>> type(b)
<class 'numpy.ndarray'>
>>> type(a)
<class 'numpy.ndarray'>
>>> shm.name  # We did not specify a name so one was chosen for us
'psm_21467_46075'

>>> # In either the same shell or a new Python shell on the same machine
>>> import numpy as np
>>> from multiprocessing import shared_memory
>>> # Attach to the existing shared memory block
>>> existing_shm = shared_memory.SharedMemory(name='psm_21467_46075')
>>> # Note that a.shape is (6,) and a.dtype is np.int64 in this example
>>> c = np.ndarray((6,), dtype=np.int64, buffer=existing_shm.buf)
>>> c
array([1, 1, 2, 3, 5, 8])
>>> c[-1] = 888
>>> c
array([  1,   1,   2,   3,   5, 888])

>>> # Back in the first Python interactive shell, b reflects this change
>>> b
array([  1,   1,   2,   3,   5, 888])

>>> # Clean up from within the second Python shell
>>> del c  # Unnecessary; merely emphasizing the array is no longer used
>>> existing_shm.close()

>>> # Clean up from within the first Python shell
>>> del b  # Unnecessary; merely emphasizing the array is no longer used
>>> shm.close()
>>> shm.unlink()  # Free and release the shared memory block at the very end
@end example

@geindex SharedMemoryManager (class in multiprocessing.managers)
@anchor{library/multiprocessing shared_memory multiprocessing managers SharedMemoryManager}@anchor{374a}
@deffn {Class} multiprocessing.managers.SharedMemoryManager ([address[, authkey]])

A subclass of @ref{3711,,multiprocessing.managers.BaseManager} which can be
used for the management of shared memory blocks across processes.

A call to @ref{3712,,start()} on a
@code{SharedMemoryManager} instance causes a new process to be started.
This new process’s sole purpose is to manage the life cycle
of all shared memory blocks created through it.  To trigger the release
of all shared memory blocks managed by that process, call
@ref{3713,,shutdown()} on the instance.
This triggers a @ref{374c,,unlink()} call
on all of the @ref{3750,,SharedMemory} objects managed by that process and then
stops the process itself.  By creating @code{SharedMemory} instances
through a @code{SharedMemoryManager}, we avoid the need to manually track
and trigger the freeing of shared memory resources.

This class provides methods for creating and returning @ref{3750,,SharedMemory}
instances and for creating a list-like object (@ref{3751,,ShareableList})
backed by shared memory.

Refer to @ref{3711,,BaseManager} for a description
of the inherited `address' and `authkey' optional input arguments and how
they may be used to connect to an existing @code{SharedMemoryManager} service
from other processes.

@geindex SharedMemory() (multiprocessing.managers.SharedMemoryManager method)
@anchor{library/multiprocessing shared_memory multiprocessing managers SharedMemoryManager SharedMemory}@anchor{3750}
@deffn {Method} SharedMemory (size)

Create and return a new @ref{3750,,SharedMemory} object with the
specified `size' in bytes.
@end deffn

@geindex ShareableList() (multiprocessing.managers.SharedMemoryManager method)
@anchor{library/multiprocessing shared_memory multiprocessing managers SharedMemoryManager ShareableList}@anchor{3751}
@deffn {Method} ShareableList (sequence)

Create and return a new @ref{3751,,ShareableList} object, initialized
by the values from the input `sequence'.
@end deffn
@end deffn

The following example demonstrates the basic mechanisms of a
@ref{374a,,SharedMemoryManager}:

@example
>>> from multiprocessing.managers import SharedMemoryManager
>>> smm = SharedMemoryManager()
>>> smm.start()  # Start the process that manages the shared memory blocks
>>> sl = smm.ShareableList(range(4))
>>> sl
ShareableList([0, 1, 2, 3], name='psm_6572_7512')
>>> raw_shm = smm.SharedMemory(size=128)
>>> another_sl = smm.ShareableList('alpha')
>>> another_sl
ShareableList(['a', 'l', 'p', 'h', 'a'], name='psm_6572_12221')
>>> smm.shutdown()  # Calls unlink() on sl, raw_shm, and another_sl
@end example

The following example depicts a potentially more convenient pattern for using
@ref{374a,,SharedMemoryManager} objects via the
@ref{187,,with} statement to ensure that all shared memory blocks are released
after they are no longer needed:

@example
>>> with SharedMemoryManager() as smm:
...     sl = smm.ShareableList(range(2000))
...     # Divide the work among two processes, storing partial results in sl
...     p1 = Process(target=do_work, args=(sl, 0, 1000))
...     p2 = Process(target=do_work, args=(sl, 1000, 2000))
...     p1.start()
...     p2.start()  # A multiprocessing.Pool might be more efficient
...     p1.join()
...     p2.join()   # Wait for all work to complete in both processes
...     total_result = sum(sl)  # Consolidate the partial results now in sl
@end example

When using a @ref{374a,,SharedMemoryManager}
in a @ref{187,,with} statement, the shared memory blocks created using that
manager are all released when the @code{with} statement’s code block
finishes execution.

@geindex ShareableList (class in multiprocessing.shared_memory)
@anchor{library/multiprocessing shared_memory multiprocessing shared_memory ShareableList}@anchor{1d9c}
@deffn {Class} multiprocessing.shared_memory.ShareableList (sequence=None, *, name=None)

Provide a mutable list-like object where all values stored within are
stored in a shared memory block.
This constrains storable values to the following built-in data types:


@itemize *

@item 
@ref{19c,,int} (signed 64-bit)

@item 
@ref{197,,float}

@item 
@ref{3c1,,bool}

@item 
@ref{16a,,str} (less than 10M bytes each when encoded as UTF-8)

@item 
@ref{193,,bytes} (less than 10M bytes each)

@item 
@code{None}
@end itemize

It also notably differs from the built-in @ref{24f,,list} type
in that these lists can not change their overall length
(i.e. no @code{append()}, @code{insert()}, etc.) and do not
support the dynamic creation of new @code{ShareableList} instances
via slicing.

`sequence' is used in populating a new @code{ShareableList} full of values.
Set to @code{None} to instead attach to an already existing
@code{ShareableList} by its unique shared memory name.

`name' is the unique name for the requested shared memory, as described
in the definition for @ref{1a1c,,SharedMemory}.  When attaching to an
existing @code{ShareableList}, specify its shared memory block’s unique
name while leaving `sequence' set to @code{None}.

@cartouche
@quotation Note 
A known issue exists for @ref{193,,bytes} and @ref{16a,,str} values.
If they end with @code{\x00} nul bytes or characters, those may be
`silently stripped' when fetching them by index from the
@code{ShareableList}. This @code{.rstrip(b'\x00')} behavior is
considered a bug and may go away in the future. See gh-106939@footnote{https://github.com/python/cpython/issues/106939}.
@end quotation
@end cartouche

For applications where rstripping of trailing nulls is a problem,
work around it by always unconditionally appending an extra non-0
byte to the end of such values when storing and unconditionally
removing it when fetching:

@example
>>> from multiprocessing import shared_memory
>>> nul_bug_demo = shared_memory.ShareableList(['?\x00', b'\x03\x02\x01\x00\x00\x00'])
>>> nul_bug_demo[0]
'?'
>>> nul_bug_demo[1]
b'\x03\x02\x01'
>>> nul_bug_demo.shm.unlink()
>>> padded = shared_memory.ShareableList(['?\x00\x07', b'\x03\x02\x01\x00\x00\x00\x07'])
>>> padded[0][:-1]
'?\x00'
>>> padded[1][:-1]
b'\x03\x02\x01\x00\x00\x00'
>>> padded.shm.unlink()
@end example

@geindex count() (multiprocessing.shared_memory.ShareableList method)
@anchor{library/multiprocessing shared_memory multiprocessing shared_memory ShareableList count}@anchor{3752}
@deffn {Method} count (value)

Return the number of occurrences of `value'.
@end deffn

@geindex index() (multiprocessing.shared_memory.ShareableList method)
@anchor{library/multiprocessing shared_memory multiprocessing shared_memory ShareableList index}@anchor{3753}
@deffn {Method} index (value)

Return first index position of `value'.
Raise @ref{2ee,,ValueError} if `value' is not present.
@end deffn

@geindex format (multiprocessing.shared_memory.ShareableList attribute)
@anchor{library/multiprocessing shared_memory multiprocessing shared_memory ShareableList format}@anchor{3754}
@deffn {Attribute} format

Read-only attribute containing the @ref{db,,struct} packing format used by
all currently stored values.
@end deffn

@geindex shm (multiprocessing.shared_memory.ShareableList attribute)
@anchor{library/multiprocessing shared_memory multiprocessing shared_memory ShareableList shm}@anchor{3755}
@deffn {Attribute} shm

The @ref{1a1c,,SharedMemory} instance where the values are stored.
@end deffn
@end deffn

The following example demonstrates basic use of a @ref{1d9c,,ShareableList}
instance:

@example
>>> from multiprocessing import shared_memory
>>> a = shared_memory.ShareableList(['howdy', b'HoWdY', -273.154, 100, None, True, 42])
>>> [ type(entry) for entry in a ]
[<class 'str'>, <class 'bytes'>, <class 'float'>, <class 'int'>, <class 'NoneType'>, <class 'bool'>, <class 'int'>]
>>> a[2]
-273.154
>>> a[2] = -78.5
>>> a[2]
-78.5
>>> a[2] = 'dry ice'  # Changing data types is supported as well
>>> a[2]
'dry ice'
>>> a[2] = 'larger than previously allocated storage space'
Traceback (most recent call last):
  ...
ValueError: exceeds available storage for existing str
>>> a[2]
'dry ice'
>>> len(a)
7
>>> a.index(42)
6
>>> a.count(b'howdy')
0
>>> a.count(b'HoWdY')
1
>>> a.shm.close()
>>> a.shm.unlink()
>>> del a  # Use of a ShareableList after call to unlink() is unsupported
@end example

The following example depicts how one, two, or many processes may access the
same @ref{1d9c,,ShareableList} by supplying the name of the shared memory block
behind it:

@example
>>> b = shared_memory.ShareableList(range(5))         # In a first process
>>> c = shared_memory.ShareableList(name=b.shm.name)  # In a second process
>>> c
ShareableList([0, 1, 2, 3, 4], name='...')
>>> c[-1] = -999
>>> b[-1]
-999
>>> b.shm.close()
>>> c.shm.close()
>>> c.shm.unlink()
@end example

The following examples demonstrates that @ref{1d9c,,ShareableList}
(and underlying @ref{1a1c,,SharedMemory}) objects
can be pickled and unpickled if needed.
Note, that it will still be the same shared object.
This happens, because the deserialized object has
the same unique name and is just attached to an existing
object with the same name (if the object is still alive):

@example
>>> import pickle
>>> from multiprocessing import shared_memory
>>> sl = shared_memory.ShareableList(range(10))
>>> list(sl)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
@end example

@example
>>> deserialized_sl = pickle.loads(pickle.dumps(sl))
>>> list(deserialized_sl)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
@end example

@example
>>> sl[0] = -1
>>> deserialized_sl[1] = -2
>>> list(sl)
[-1, -2, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(deserialized_sl)
[-1, -2, 2, 3, 4, 5, 6, 7, 8, 9]
@end example

@example
>>> sl.shm.close()
>>> sl.shm.unlink()
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node The concurrent package,concurrent futures — Launching parallel tasks,multiprocessing shared_memory — Shared memory for direct access across processes,Concurrent Execution
@anchor{library/concurrent doc}@anchor{3756}@anchor{library/concurrent the-concurrent-package}@anchor{3757}@anchor{library/concurrent translation-repo}@anchor{3758}
@subsection The @code{concurrent} package


This package contains the following modules:


@itemize *

@item 
@ref{24,,concurrent.futures} – Launching parallel tasks

@item 
@ref{25,,concurrent.interpreters} – Multiple interpreters in the same process
@end itemize

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node concurrent futures — Launching parallel tasks,concurrent interpreters — Multiple interpreters in the same process,The concurrent package,Concurrent Execution
@anchor{library/concurrent futures doc}@anchor{3759}@anchor{library/concurrent futures concurrent-futures-launching-parallel-tasks}@anchor{375a}@anchor{library/concurrent futures module-concurrent futures}@anchor{24}@anchor{library/concurrent futures translation-repo}@anchor{375b}
@subsection @code{concurrent.futures} — Launching parallel tasks


@geindex module; concurrent.futures


Added in version 3.2.


`Source code:' Lib/concurrent/futures/thread.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/concurrent/futures/thread.py},
Lib/concurrent/futures/process.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/concurrent/futures/process.py},
and Lib/concurrent/futures/interpreter.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/concurrent/futures/interpreter.py}


__________________________________________________________________


The @code{concurrent.futures} module provides a high-level interface for
asynchronously executing callables.

The asynchronous execution can be performed with threads, using
@ref{94e,,ThreadPoolExecutor} or @ref{1d4,,InterpreterPoolExecutor},
or separate processes, using @ref{1d8,,ProcessPoolExecutor}.
Each implements the same interface, which is defined
by the abstract @ref{375c,,Executor} class.

@ref{13be,,concurrent.futures.Future} must not be confused with
@ref{dcc,,asyncio.Future}, which is designed for use with @ref{b,,asyncio}
tasks and coroutines. See the @ref{375d,,asyncio’s Future}
documentation for a detailed comparison of the two.

@c include for modules that don't work on WASM

@ref{2181,,Availability}: not WASI.

This module does not work or is not available on WebAssembly. See
@ref{1bae,,WebAssembly platforms} for more information.

@menu
* Executor Objects:: 
* ThreadPoolExecutor:: 
* InterpreterPoolExecutor:: 
* ProcessPoolExecutor:: 
* Future Objects:: 
* Module Functions:: 
* Exception classes:: 

@end menu

@node Executor Objects,ThreadPoolExecutor,,concurrent futures — Launching parallel tasks
@anchor{library/concurrent futures executor-objects}@anchor{375e}
@subsubsection Executor Objects


@geindex Executor (class in concurrent.futures)
@anchor{library/concurrent futures concurrent futures Executor}@anchor{375c}
@deffn {Class} concurrent.futures.Executor

An abstract class that provides methods to execute calls asynchronously.  It
should not be used directly, but through its concrete subclasses.

@geindex submit() (concurrent.futures.Executor method)
@anchor{library/concurrent futures concurrent futures Executor submit}@anchor{c7b}
@deffn {Method} submit (fn, /, *args, **kwargs)

Schedules the callable, `fn', to be executed as @code{fn(*args, **kwargs)}
and returns a @ref{13be,,Future} object representing the execution of the
callable.

@example
with ThreadPoolExecutor(max_workers=1) as executor:
    future = executor.submit(pow, 323, 1235)
    print(future.result())
@end example
@end deffn

@geindex map() (concurrent.futures.Executor method)
@anchor{library/concurrent futures concurrent futures Executor map}@anchor{1de}
@deffn {Method} map (fn, *iterables, timeout=None, chunksize=1, buffersize=None)

Similar to @ref{1a0,,map(fn@comma{} *iterables)} except:


@itemize *

@item 
The `iterables' are collected immediately rather than lazily, unless a
`buffersize' is specified to limit the number of submitted tasks whose
results have not yet been yielded. If the buffer is full, iteration over
the `iterables' pauses until a result is yielded from the buffer.

@item 
`fn' is executed asynchronously and several calls to
`fn' may be made concurrently.
@end itemize

The returned iterator raises a @ref{a3c,,TimeoutError}
if @ref{14d9,,__next__()} is called and the result isn’t available
after `timeout' seconds from the original call to @code{Executor.map()}.
`timeout' can be an int or a float.  If `timeout' is not specified or
@code{None}, there is no limit to the wait time.

If a `fn' call raises an exception, then that exception will be
raised when its value is retrieved from the iterator.

When using @ref{1d8,,ProcessPoolExecutor}, this method chops `iterables'
into a number of chunks which it submits to the pool as separate
tasks.  The (approximate) size of these chunks can be specified by
setting `chunksize' to a positive integer.  For very long iterables,
using a large value for `chunksize' can significantly improve
performance compared to the default size of 1.  With
@ref{94e,,ThreadPoolExecutor} and @ref{1d4,,InterpreterPoolExecutor},
`chunksize' has no effect.


Changed in version 3.5: Added the `chunksize' parameter.



Changed in version 3.14: Added the `buffersize' parameter.

@end deffn

@geindex shutdown() (concurrent.futures.Executor method)
@anchor{library/concurrent futures concurrent futures Executor shutdown}@anchor{af0}
@deffn {Method} shutdown (wait=True, *, cancel_futures=False)

Signal the executor that it should free any resources that it is using
when the currently pending futures are done executing.  Calls to
@ref{c7b,,Executor.submit()} and @ref{1de,,Executor.map()} made after shutdown will
raise @ref{246,,RuntimeError}.

If `wait' is @code{True} then this method will not return until all the
pending futures are done executing and the resources associated with the
executor have been freed.  If `wait' is @code{False} then this method will
return immediately and the resources associated with the executor will be
freed when all pending futures are done executing.  Regardless of the
value of `wait', the entire Python program will not exit until all
pending futures are done executing.

If `cancel_futures' is @code{True}, this method will cancel all pending
futures that the executor has not started running. Any futures that
are completed or running won’t be cancelled, regardless of the value
of `cancel_futures'.

If both `cancel_futures' and `wait' are @code{True}, all futures that the
executor has started running will be completed prior to this method
returning. The remaining futures are cancelled.

You can avoid having to call this method explicitly if you use the executor
as a @ref{1e3,,context manager} via the  @ref{187,,with} statement, which
will shutdown the @code{Executor} (waiting as if @code{Executor.shutdown()}
were called with `wait' set to @code{True}):

@example
import shutil
with ThreadPoolExecutor(max_workers=4) as e:
    e.submit(shutil.copy, 'src1.txt', 'dest1.txt')
    e.submit(shutil.copy, 'src2.txt', 'dest2.txt')
    e.submit(shutil.copy, 'src3.txt', 'dest3.txt')
    e.submit(shutil.copy, 'src4.txt', 'dest4.txt')
@end example


Changed in version 3.9: Added `cancel_futures'.

@end deffn
@end deffn

@node ThreadPoolExecutor,InterpreterPoolExecutor,Executor Objects,concurrent futures — Launching parallel tasks
@anchor{library/concurrent futures threadpoolexecutor}@anchor{375f}
@subsubsection ThreadPoolExecutor


@ref{94e,,ThreadPoolExecutor} is an @ref{375c,,Executor} subclass that uses a pool of
threads to execute calls asynchronously.

Deadlocks can occur when the callable associated with a @ref{13be,,Future} waits on
the results of another @code{Future}.  For example:

@example
import time
def wait_on_b():
    time.sleep(5)
    print(b.result())  # b will never complete because it is waiting on a.
    return 5

def wait_on_a():
    time.sleep(5)
    print(a.result())  # a will never complete because it is waiting on b.
    return 6


executor = ThreadPoolExecutor(max_workers=2)
a = executor.submit(wait_on_b)
b = executor.submit(wait_on_a)
@end example

And:

@example
def wait_on_future():
    f = executor.submit(pow, 5, 2)
    # This will never complete because there is only one worker thread and
    # it is executing this function.
    print(f.result())

executor = ThreadPoolExecutor(max_workers=1)
future = executor.submit(wait_on_future)
# Note: calling future.result() would also cause a deadlock because
# the single worker thread is already waiting for wait_on_future().
@end example

@geindex ThreadPoolExecutor (class in concurrent.futures)
@anchor{library/concurrent futures concurrent futures ThreadPoolExecutor}@anchor{94e}
@deffn {Class} concurrent.futures.ThreadPoolExecutor (max_workers=None, thread_name_prefix='@w{'}, initializer=None, initargs=())

An @ref{375c,,Executor} subclass that uses a pool of at most `max_workers'
threads to execute calls asynchronously.

All threads enqueued to @code{ThreadPoolExecutor} will be joined before the
interpreter can exit. Note that the exit handler which does this is
executed `before' any exit handlers added using @code{atexit}. This means
exceptions in the main thread must be caught and handled in order to
signal threads to exit gracefully. For this reason, it is recommended
that @code{ThreadPoolExecutor} not be used for long-running tasks.

`initializer' is an optional callable that is called at the start of
each worker thread; `initargs' is a tuple of arguments passed to the
initializer.  Should `initializer' raise an exception, all currently
pending jobs will raise a @ref{3760,,BrokenThreadPool},
as well as any attempt to submit more jobs to the pool.


Changed in version 3.5: If `max_workers' is @code{None} or
not given, it will default to the number of processors on the machine,
multiplied by @code{5}, assuming that @code{ThreadPoolExecutor} is often
used to overlap I/O instead of CPU work and the number of workers
should be higher than the number of workers
for @ref{1d8,,ProcessPoolExecutor}.



Changed in version 3.6: Added the `thread_name_prefix' parameter to allow users to
control the @ref{177,,threading.Thread} names for worker threads created by
the pool for easier debugging.



Changed in version 3.7: Added the `initializer' and `initargs' arguments.



Changed in version 3.8: Default value of `max_workers' is changed to @code{min(32, os.cpu_count() + 4)}.
This default value preserves at least 5 workers for I/O bound tasks.
It utilizes at most 32 CPU cores for CPU bound tasks which release the GIL.
And it avoids using very large resources implicitly on many-core machines.

ThreadPoolExecutor now reuses idle worker threads before starting
`max_workers' worker threads too.



Changed in version 3.13: Default value of `max_workers' is changed to
@code{min(32, (os.process_cpu_count() or 1) + 4)}.

@end deffn

@menu
* ThreadPoolExecutor Example:: 

@end menu

@node ThreadPoolExecutor Example,,,ThreadPoolExecutor
@anchor{library/concurrent futures id1}@anchor{3761}@anchor{library/concurrent futures threadpoolexecutor-example}@anchor{13bf}
@subsubsection ThreadPoolExecutor Example


@example
import concurrent.futures
import urllib.request

URLS = ['http://www.foxnews.com/',
        'http://www.cnn.com/',
        'http://europe.wsj.com/',
        'http://www.bbc.co.uk/',
        'http://nonexistent-subdomain.python.org/']

# Retrieve a single page and report the URL and contents
def load_url(url, timeout):
    with urllib.request.urlopen(url, timeout=timeout) as conn:
        return conn.read()

# We can use a with statement to ensure threads are cleaned up promptly
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
    # Start the load operations and mark each future with its URL
    future_to_url = @{executor.submit(load_url, url, 60): url for url in URLS@}
    for future in concurrent.futures.as_completed(future_to_url):
        url = future_to_url[future]
        try:
            data = future.result()
        except Exception as exc:
            print('%r generated an exception: %s' % (url, exc))
        else:
            print('%r page is %d bytes' % (url, len(data)))
@end example

@node InterpreterPoolExecutor,ProcessPoolExecutor,ThreadPoolExecutor,concurrent futures — Launching parallel tasks
@anchor{library/concurrent futures interpreterpoolexecutor}@anchor{3762}
@subsubsection InterpreterPoolExecutor



Added in version 3.14.


The @ref{1d4,,InterpreterPoolExecutor} class uses a pool of interpreters
to execute calls asynchronously.  It is a @ref{94e,,ThreadPoolExecutor}
subclass, which means each worker is running in its own thread.
The difference here is that each worker has its own interpreter,
and runs each task using that interpreter.

The biggest benefit to using interpreters instead of only threads
is true multi-core parallelism.  Each interpreter has its own
@ref{474,,Global Interpreter Lock}, so code
running in one interpreter can run on one CPU core, while code in
another interpreter runs unblocked on a different core.

The tradeoff is that writing concurrent code for use with multiple
interpreters can take extra effort.  However, this is because it
forces you to be deliberate about how and when interpreters interact,
and to be explicit about what data is shared between interpreters.
This results in several benefits that help balance the extra effort,
including true multi-core parallelism,  For example, code written
this way can make it easier to reason about concurrency.  Another
major benefit is that you don’t have to deal with several of the
big pain points of using threads, like race conditions.

Each worker’s interpreter is isolated from all the other interpreters.
“Isolated” means each interpreter has its own runtime state and
operates completely independently.  For example, if you redirect
@ref{cd3,,sys.stdout} in one interpreter, it will not be automatically
redirected to any other interpreter.  If you import a module in one
interpreter, it is not automatically imported in any other.  You
would need to import the module separately in interpreter where
you need it.  In fact, each module imported in an interpreter is
a completely separate object from the same module in a different
interpreter, including @ref{df,,sys}, @ref{13,,builtins},
and even @code{__main__}.

Isolation means a mutable object, or other data, cannot be used
by more than one interpreter at the same time.  That effectively means
interpreters cannot actually share such objects or data.  Instead,
each interpreter must have its own copy, and you will have to
synchronize any changes between the copies manually.  Immutable
objects and data, like the builtin singletons, strings, and tuples
of immutable objects, don’t have these limitations.

Communicating and synchronizing between interpreters is most effectively
done using dedicated tools, like those proposed in 
@geindex Python Enhancement Proposals; PEP 734
PEP 734@footnote{https://peps.python.org/pep-0734/}.  One less
efficient alternative is to serialize with @ref{ab,,pickle} and then send
the bytes over a shared @ref{d1,,socket} or
@ref{1ba8,,pipe}.

@geindex InterpreterPoolExecutor (class in concurrent.futures)
@anchor{library/concurrent futures concurrent futures InterpreterPoolExecutor}@anchor{1d4}
@deffn {Class} concurrent.futures.InterpreterPoolExecutor (max_workers=None, thread_name_prefix='@w{'}, initializer=None, initargs=())

A @ref{94e,,ThreadPoolExecutor} subclass that executes calls asynchronously
using a pool of at most `max_workers' threads.  Each thread runs
tasks in its own interpreter.  The worker interpreters are isolated
from each other, which means each has its own runtime state and that
they can’t share any mutable objects or other data.  Each interpreter
has its own @ref{474,,Global Interpreter Lock},
which means code run with this executor has true multi-core parallelism.

The optional `initializer' and `initargs' arguments have the same
meaning as for @code{ThreadPoolExecutor}: the initializer is run
when each worker is created, though in this case it is run in
the worker’s interpreter.  The executor serializes the `initializer'
and `initargs' using @ref{ab,,pickle} when sending them to the worker’s
interpreter.

@cartouche
@quotation Note 
The executor may replace uncaught exceptions from `initializer'
with @ref{3763,,ExecutionFailed}.
@end quotation
@end cartouche

Other caveats from parent @ref{94e,,ThreadPoolExecutor} apply here.
@end deffn

@ref{c7b,,submit()} and @ref{1de,,map()} work like normal,
except the worker serializes the callable and arguments using
@ref{ab,,pickle} when sending them to its interpreter.  The worker
likewise serializes the return value when sending it back.

When a worker’s current task raises an uncaught exception, the worker
always tries to preserve the exception as-is.  If that is successful
then it also sets the @code{__cause__} to a corresponding
@ref{3763,,ExecutionFailed}
instance, which contains a summary of the original exception.
In the uncommon case that the worker is not able to preserve the
original as-is then it directly preserves the corresponding
@code{ExecutionFailed}
instance instead.

@node ProcessPoolExecutor,Future Objects,InterpreterPoolExecutor,concurrent futures — Launching parallel tasks
@anchor{library/concurrent futures processpoolexecutor}@anchor{3764}
@subsubsection ProcessPoolExecutor


The @ref{1d8,,ProcessPoolExecutor} class is an @ref{375c,,Executor} subclass that
uses a pool of processes to execute calls asynchronously.
@code{ProcessPoolExecutor} uses the @ref{98,,multiprocessing} module, which
allows it to side-step the @ref{474,,Global Interpreter Lock} but also means that
only picklable objects can be executed and returned.

The @code{__main__} module must be importable by worker subprocesses. This means
that @ref{1d8,,ProcessPoolExecutor} will not work in the interactive interpreter.

Calling @ref{375c,,Executor} or @ref{13be,,Future} methods from a callable submitted
to a @ref{1d8,,ProcessPoolExecutor} will result in deadlock.

Note that the restrictions on functions and arguments needing to picklable as
per @ref{254,,multiprocessing.Process} apply when using @ref{c7b,,submit()}
and @ref{1de,,map()} on a @ref{1d8,,ProcessPoolExecutor}. A function defined
in a REPL or a lambda should not be expected to work.

@geindex ProcessPoolExecutor (class in concurrent.futures)
@anchor{library/concurrent futures concurrent futures ProcessPoolExecutor}@anchor{1d8}
@deffn {Class} concurrent.futures.ProcessPoolExecutor (max_workers=None, mp_context=None, initializer=None, initargs=(), max_tasks_per_child=None)

An @ref{375c,,Executor} subclass that executes calls asynchronously using a pool
of at most `max_workers' processes.  If `max_workers' is @code{None} or not
given, it will default to @ref{4db,,os.process_cpu_count()}.
If `max_workers' is less than or equal to @code{0}, then a @ref{2ee,,ValueError}
will be raised.
On Windows, `max_workers' must be less than or equal to @code{61}. If it is not
then @code{ValueError} will be raised. If `max_workers' is @code{None}, then
the default chosen will be at most @code{61}, even if more processors are
available.
`mp_context' can be a @ref{98,,multiprocessing} context or @code{None}. It will be
used to launch the workers. If `mp_context' is @code{None} or not given, the
default @code{multiprocessing} context is used.
See @ref{1d7,,Contexts and start methods}.

`initializer' is an optional callable that is called at the start of
each worker process; `initargs' is a tuple of arguments passed to the
initializer.  Should `initializer' raise an exception, all currently
pending jobs will raise a @ref{1765,,BrokenProcessPool},
as well as any attempt to submit more jobs to the pool.

`max_tasks_per_child' is an optional argument that specifies the maximum
number of tasks a single process can execute before it will exit and be
replaced with a fresh worker process. By default `max_tasks_per_child' is
@code{None} which means worker processes will live as long as the pool. When
a max is specified, the “spawn” multiprocessing start method will be used by
default in absence of a `mp_context' parameter. This feature is incompatible
with the “fork” start method.

@cartouche
@quotation Note 
Bugs have been reported when using the `max_tasks_per_child' feature that
can result in the @code{ProcessPoolExecutor} hanging in some
circumstances. Follow its eventual resolution in gh-115634@footnote{https://github.com/python/cpython/issues/115634}.
@end quotation
@end cartouche


Changed in version 3.3: When one of the worker processes terminates abruptly, a
@ref{1765,,BrokenProcessPool} error is now raised.
Previously, behaviour
was undefined but operations on the executor or its futures would often
freeze or deadlock.



Changed in version 3.7: The `mp_context' argument was added to allow users to control the
start_method for worker processes created by the pool.

Added the `initializer' and `initargs' arguments.



Changed in version 3.11: The `max_tasks_per_child' argument was added to allow users to
control the lifetime of workers in the pool.



Changed in version 3.12: On POSIX systems, if your application has multiple threads and the
@ref{98,,multiprocessing} context uses the @code{"fork"} start method:
The @ref{4b6,,os.fork()} function called internally to spawn workers may raise a
@ref{1a4,,DeprecationWarning}. Pass a `mp_context' configured to use a
different start method. See the @code{os.fork()} documentation for
further explanation.



Changed in version 3.13: `max_workers' uses @ref{4db,,os.process_cpu_count()} by default, instead of
@ref{4dc,,os.cpu_count()}.



Changed in version 3.14: The default process start method (see
@ref{1d7,,Contexts and start methods}) changed away from `fork'. If you
require the `fork' start method for @code{ProcessPoolExecutor} you must
explicitly pass @code{mp_context=multiprocessing.get_context("fork")}.


@geindex terminate_workers() (concurrent.futures.ProcessPoolExecutor method)
@anchor{library/concurrent futures concurrent futures ProcessPoolExecutor terminate_workers}@anchor{1dc}
@deffn {Method} terminate_workers ()

Attempt to terminate all living worker processes immediately by calling
@ref{18a0,,Process.terminate} on each of them.
Internally, it will also call @ref{af0,,Executor.shutdown()} to ensure that all
other resources associated with the executor are freed.

After calling this method the caller should no longer submit tasks to the
executor.


Added in version 3.14.

@end deffn

@geindex kill_workers() (concurrent.futures.ProcessPoolExecutor method)
@anchor{library/concurrent futures concurrent futures ProcessPoolExecutor kill_workers}@anchor{1dd}
@deffn {Method} kill_workers ()

Attempt to kill all living worker processes immediately by calling
@ref{d55,,Process.kill} on each of them.
Internally, it will also call @ref{af0,,Executor.shutdown()} to ensure that all
other resources associated with the executor are freed.

After calling this method the caller should no longer submit tasks to the
executor.


Added in version 3.14.

@end deffn
@end deffn

@menu
* ProcessPoolExecutor Example:: 

@end menu

@node ProcessPoolExecutor Example,,,ProcessPoolExecutor
@anchor{library/concurrent futures id2}@anchor{3765}@anchor{library/concurrent futures processpoolexecutor-example}@anchor{13c0}
@subsubsection ProcessPoolExecutor Example


@example
import concurrent.futures
import math

PRIMES = [
    112272535095293,
    112582705942171,
    112272535095293,
    115280095190773,
    115797848077099,
    1099726899285419]

def is_prime(n):
    if n < 2:
        return False
    if n == 2:
        return True
    if n % 2 == 0:
        return False

    sqrt_n = int(math.floor(math.sqrt(n)))
    for i in range(3, sqrt_n + 1, 2):
        if n % i == 0:
            return False
    return True

def main():
    with concurrent.futures.ProcessPoolExecutor() as executor:
        for number, prime in zip(PRIMES, executor.map(is_prime, PRIMES)):
            print('%d is prime: %s' % (number, prime))

if __name__ == '__main__':
    main()
@end example

@node Future Objects,Module Functions,ProcessPoolExecutor,concurrent futures — Launching parallel tasks
@anchor{library/concurrent futures future-objects}@anchor{3766}
@subsubsection Future Objects


The @ref{13be,,Future} class encapsulates the asynchronous execution of a callable.
@code{Future} instances are created by @ref{c7b,,Executor.submit()}.

@geindex Future (class in concurrent.futures)
@anchor{library/concurrent futures concurrent futures Future}@anchor{13be}
@deffn {Class} concurrent.futures.Future

Encapsulates the asynchronous execution of a callable.  @code{Future}
instances are created by @ref{c7b,,Executor.submit()} and should not be created
directly except for testing.

@geindex cancel() (concurrent.futures.Future method)
@anchor{library/concurrent futures concurrent futures Future cancel}@anchor{3767}
@deffn {Method} cancel ()

Attempt to cancel the call.  If the call is currently being executed or
finished running and cannot be cancelled then the method will return
@code{False}, otherwise the call will be cancelled and the method will
return @code{True}.
@end deffn

@geindex cancelled() (concurrent.futures.Future method)
@anchor{library/concurrent futures concurrent futures Future cancelled}@anchor{3768}
@deffn {Method} cancelled ()

Return @code{True} if the call was successfully cancelled.
@end deffn

@geindex running() (concurrent.futures.Future method)
@anchor{library/concurrent futures concurrent futures Future running}@anchor{3769}
@deffn {Method} running ()

Return @code{True} if the call is currently being executed and cannot be
cancelled.
@end deffn

@geindex done() (concurrent.futures.Future method)
@anchor{library/concurrent futures concurrent futures Future done}@anchor{376a}
@deffn {Method} done ()

Return @code{True} if the call was successfully cancelled or finished
running.
@end deffn

@geindex result() (concurrent.futures.Future method)
@anchor{library/concurrent futures concurrent futures Future result}@anchor{1766}
@deffn {Method} result (timeout=None)

Return the value returned by the call. If the call hasn’t yet completed
then this method will wait up to `timeout' seconds.  If the call hasn’t
completed in `timeout' seconds, then a
@ref{a3c,,TimeoutError} will be raised. `timeout' can be
an int or float.  If `timeout' is not specified or @code{None}, there is no
limit to the wait time.

If the future is cancelled before completing then @ref{bd4,,CancelledError}
will be raised.

If the call raised an exception, this method will raise the same exception.
@end deffn

@geindex exception() (concurrent.futures.Future method)
@anchor{library/concurrent futures concurrent futures Future exception}@anchor{376b}
@deffn {Method} exception (timeout=None)

Return the exception raised by the call.  If the call hasn’t yet
completed then this method will wait up to `timeout' seconds.  If the
call hasn’t completed in `timeout' seconds, then a
@ref{a3c,,TimeoutError} will be raised.  `timeout' can be
an int or float.  If `timeout' is not specified or @code{None}, there is no
limit to the wait time.

If the future is cancelled before completing then @ref{bd4,,CancelledError}
will be raised.

If the call completed without raising, @code{None} is returned.
@end deffn

@geindex add_done_callback() (concurrent.futures.Future method)
@anchor{library/concurrent futures concurrent futures Future add_done_callback}@anchor{376c}
@deffn {Method} add_done_callback (fn)

Attaches the callable `fn' to the future.  `fn' will be called, with the
future as its only argument, when the future is cancelled or finishes
running.

Added callables are called in the order that they were added and are
always called in a thread belonging to the process that added them.  If
the callable raises an @ref{bd3,,Exception} subclass, it will be logged and
ignored.  If the callable raises a @ref{7d8,,BaseException} subclass, the
behavior is undefined.

If the future has already completed or been cancelled, `fn' will be
called immediately.
@end deffn

The following @code{Future} methods are meant for use in unit tests and
@ref{375c,,Executor} implementations.

@geindex set_running_or_notify_cancel() (concurrent.futures.Future method)
@anchor{library/concurrent futures concurrent futures Future set_running_or_notify_cancel}@anchor{376d}
@deffn {Method} set_running_or_notify_cancel ()

This method should only be called by @ref{375c,,Executor} implementations
before executing the work associated with the @code{Future} and by unit
tests.

If the method returns @code{False} then the @code{Future} was cancelled,
i.e. @ref{3767,,Future.cancel()} was called and returned @code{True}.  Any threads
waiting on the @code{Future} completing (i.e. through
@ref{1a0b,,as_completed()} or @ref{1c48,,wait()}) will be woken up.

If the method returns @code{True} then the @code{Future} was not cancelled
and has been put in the running state, i.e. calls to
@ref{3769,,Future.running()} will return @code{True}.

This method can only be called once and cannot be called after
@ref{376e,,Future.set_result()} or @ref{376f,,Future.set_exception()} have been
called.
@end deffn

@geindex set_result() (concurrent.futures.Future method)
@anchor{library/concurrent futures concurrent futures Future set_result}@anchor{376e}
@deffn {Method} set_result (result)

Sets the result of the work associated with the @code{Future} to
`result'.

This method should only be used by @ref{375c,,Executor} implementations and
unit tests.


Changed in version 3.8: This method raises
@ref{1995,,concurrent.futures.InvalidStateError} if the @code{Future} is
already done.

@end deffn

@geindex set_exception() (concurrent.futures.Future method)
@anchor{library/concurrent futures concurrent futures Future set_exception}@anchor{376f}
@deffn {Method} set_exception (exception)

Sets the result of the work associated with the @code{Future} to the
@ref{bd3,,Exception} `exception'.

This method should only be used by @ref{375c,,Executor} implementations and
unit tests.


Changed in version 3.8: This method raises
@ref{1995,,concurrent.futures.InvalidStateError} if the @code{Future} is
already done.

@end deffn
@end deffn

@node Module Functions,Exception classes,Future Objects,concurrent futures — Launching parallel tasks
@anchor{library/concurrent futures module-functions}@anchor{3770}
@subsubsection Module Functions


@geindex wait() (in module concurrent.futures)
@anchor{library/concurrent futures concurrent futures wait}@anchor{1c48}
@deffn {Function} concurrent.futures.wait (fs, timeout=None, return_when=ALL_COMPLETED)

Wait for the @ref{13be,,Future} instances (possibly created by different
@ref{375c,,Executor} instances) given by `fs' to complete. Duplicate futures
given to `fs' are removed and will be returned only once. Returns a named
2-tuple of sets.  The first set, named @code{done}, contains the futures that
completed (finished or cancelled futures) before the wait completed.  The
second set, named @code{not_done}, contains the futures that did not complete
(pending or running futures).

`timeout' can be used to control the maximum number of seconds to wait before
returning.  `timeout' can be an int or float.  If `timeout' is not specified
or @code{None}, there is no limit to the wait time.

`return_when' indicates when this function should return.  It must be one of
the following constants:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Constant

@tab

Description

@item

@geindex FIRST_COMPLETED (in module concurrent.futures)
@anchor{library/concurrent futures concurrent futures FIRST_COMPLETED}@anchor{3771}
@deffn {Data} concurrent.futures.FIRST_COMPLETED
@end deffn

@tab

The function will return when any future finishes or is cancelled.

@item

@geindex FIRST_EXCEPTION (in module concurrent.futures)
@anchor{library/concurrent futures concurrent futures FIRST_EXCEPTION}@anchor{3772}
@deffn {Data} concurrent.futures.FIRST_EXCEPTION
@end deffn

@tab

The function will return when any future finishes by raising an
exception. If no future raises an exception
then it is equivalent to @ref{3773,,ALL_COMPLETED}.

@item

@geindex ALL_COMPLETED (in module concurrent.futures)
@anchor{library/concurrent futures concurrent futures ALL_COMPLETED}@anchor{3773}
@deffn {Data} concurrent.futures.ALL_COMPLETED
@end deffn

@tab

The function will return when all futures finish or are cancelled.

@end multitable

@end deffn

@geindex as_completed() (in module concurrent.futures)
@anchor{library/concurrent futures concurrent futures as_completed}@anchor{1a0b}
@deffn {Function} concurrent.futures.as_completed (fs, timeout=None)

Returns an iterator over the @ref{13be,,Future} instances (possibly created by
different @ref{375c,,Executor} instances) given by `fs' that yields futures as
they complete (finished or cancelled futures). Any futures given by `fs' that
are duplicated will be returned once. Any futures that completed before
@code{as_completed()} is called will be yielded first.  The returned iterator
raises a @ref{a3c,,TimeoutError} if @ref{14d9,,__next__()}
is called and the result isn’t available after `timeout' seconds from the
original call to @code{as_completed()}.  `timeout' can be an int or float. If
`timeout' is not specified or @code{None}, there is no limit to the wait time.
@end deffn


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 3148

@item PEP 3148@footnote{https://peps.python.org/pep-3148/} – futures - execute computations asynchronously

The proposal which described this feature for inclusion in the Python
standard library.
@end table


@node Exception classes,,Module Functions,concurrent futures — Launching parallel tasks
@anchor{library/concurrent futures exception-classes}@anchor{3774}
@subsubsection Exception classes


@geindex CancelledError
@anchor{library/concurrent futures concurrent futures CancelledError}@anchor{bd4}
@deffn {Exception} concurrent.futures.CancelledError

Raised when a future is cancelled.
@end deffn

@geindex TimeoutError
@anchor{library/concurrent futures concurrent futures TimeoutError}@anchor{3775}
@deffn {Exception} concurrent.futures.TimeoutError

A deprecated alias of @code{TimeoutError},
raised when a future operation exceeds the given timeout.


Changed in version 3.11: This class was made an alias of @code{TimeoutError}.

@end deffn

@geindex BrokenExecutor
@anchor{library/concurrent futures concurrent futures BrokenExecutor}@anchor{3776}
@deffn {Exception} concurrent.futures.BrokenExecutor

Derived from @ref{246,,RuntimeError}, this exception class is raised
when an executor is broken for some reason, and cannot be used
to submit or execute new tasks.


Added in version 3.7.

@end deffn

@geindex InvalidStateError
@anchor{library/concurrent futures concurrent futures InvalidStateError}@anchor{1995}
@deffn {Exception} concurrent.futures.InvalidStateError

Raised when an operation is performed on a future that is not allowed
in the current state.


Added in version 3.8.

@end deffn

@geindex BrokenThreadPool
@anchor{library/concurrent futures concurrent futures thread BrokenThreadPool}@anchor{3760}
@deffn {Exception} concurrent.futures.thread.BrokenThreadPool

Derived from @ref{3776,,BrokenExecutor}, this exception
class is raised when one of the workers
of a @ref{94e,,ThreadPoolExecutor}
has failed initializing.


Added in version 3.7.

@end deffn

@geindex BrokenInterpreterPool
@anchor{library/concurrent futures concurrent futures interpreter BrokenInterpreterPool}@anchor{3777}
@deffn {Exception} concurrent.futures.interpreter.BrokenInterpreterPool

Derived from @ref{3760,,BrokenThreadPool},
this exception class is raised when one of the workers
of a @ref{1d4,,InterpreterPoolExecutor}
has failed initializing.


Added in version 3.14.

@end deffn

@geindex BrokenProcessPool
@anchor{library/concurrent futures concurrent futures process BrokenProcessPool}@anchor{1765}
@deffn {Exception} concurrent.futures.process.BrokenProcessPool

Derived from @ref{3776,,BrokenExecutor} (formerly
@ref{246,,RuntimeError}), this exception class is raised when one of the
workers of a @ref{1d8,,ProcessPoolExecutor}
has terminated in a non-clean
fashion (for example, if it was killed from the outside).


Added in version 3.3.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node concurrent interpreters — Multiple interpreters in the same process,subprocess — Subprocess management,concurrent futures — Launching parallel tasks,Concurrent Execution
@anchor{library/concurrent interpreters doc}@anchor{3778}@anchor{library/concurrent interpreters concurrent-interpreters-multiple-interpreters-in-the-same-process}@anchor{3779}@anchor{library/concurrent interpreters module-concurrent interpreters}@anchor{25}@anchor{library/concurrent interpreters translation-repo}@anchor{377a}
@subsection @code{concurrent.interpreters} — Multiple interpreters in the same process


@geindex module; concurrent.interpreters


Added in version 3.14.


`Source code:' Lib/concurrent/interpreters@footnote{https://github.com/python/cpython/tree/3.14/Lib/concurrent/interpreters}


__________________________________________________________________


The @code{concurrent.interpreters} module constructs higher-level
interfaces on top of the lower level @code{_interpreters} module.

The module is primarily meant to provide a basic API for managing
interpreters (AKA “subinterpreters”) and running things in them.
Running mostly involves switching to an interpreter (in the current
thread) and calling a function in that execution context.

For concurrency, interpreters themselves (and this module) don’t
provide much more than isolation, which on its own isn’t useful.
Actual concurrency is available separately through
@ref{f3,,threads}  See @ref{377b,,below}@anchor{library/concurrent interpreters interp-concurrency}@anchor{377b}


@subsubheading See also



@table @asis

@item @ref{1d4,,InterpreterPoolExecutor}

Combines threads with interpreters in a familiar interface.
@end table

@c XXX Add references to the upcoming HOWTO docs in the seealso block.


@table @asis

@item @ref{167,,Isolating Extension Modules}

How to update an extension module to support multiple interpreters.
@end table

@geindex Python Enhancement Proposals; PEP 554
PEP 554@footnote{https://peps.python.org/pep-0554/}

@geindex Python Enhancement Proposals; PEP 734
PEP 734@footnote{https://peps.python.org/pep-0734/}

@geindex Python Enhancement Proposals; PEP 684
PEP 684@footnote{https://peps.python.org/pep-0684/}


@c XXX Why do we disallow multiple interpreters on WASM?

@c include for modules that don't work on WASM

@ref{2181,,Availability}: not WASI.

This module does not work or is not available on WebAssembly. See
@ref{1bae,,WebAssembly platforms} for more information.

@menu
* Key details:: 
* Introduction: Introduction<10>. 
* Reference: Reference<4>. 
* Basic usage:: 

@end menu

@node Key details,Introduction<10>,,concurrent interpreters — Multiple interpreters in the same process
@anchor{library/concurrent interpreters key-details}@anchor{377c}
@subsubsection Key details


Before we dive in further, there are a small number of details
to keep in mind about using multiple interpreters:


@itemize *

@item 
@ref{377d,,isolated}@anchor{library/concurrent interpreters interp-isolation}@anchor{377d}, by default

@item 
no implicit threads

@item 
not all PyPI packages support use in multiple interpreters yet
@end itemize

@c XXX Are there other relevant details to list?

@node Introduction<10>,Reference<4>,Key details,concurrent interpreters — Multiple interpreters in the same process
@anchor{library/concurrent interpreters interpreters-intro}@anchor{377e}@anchor{library/concurrent interpreters introduction}@anchor{377f}
@subsubsection Introduction


An “interpreter” is effectively the execution context of the Python
runtime.  It contains all of the state the runtime needs to execute
a program.  This includes things like the import state and builtins.
(Each thread, even if there’s only the main thread, has some extra
runtime state, in addition to the current interpreter, related to
the current exception and the bytecode eval loop.)

The concept and functionality of the interpreter have been a part of
Python since version 2.2, but the feature was only available through
the C-API and not well known, and the @ref{377d,,isolation}
was relatively incomplete until version 3.12.

@menu
* Multiple Interpreters and Isolation:: 
* Running in an Interpreter:: 
* Concurrency and Parallelism:: 
* Communication Between Interpreters:: 
* “Sharing” Objects:: 

@end menu

@node Multiple Interpreters and Isolation,Running in an Interpreter,,Introduction<10>
@anchor{library/concurrent interpreters multiple-interpreters-and-isolation}@anchor{3780}
@subsubsection Multiple Interpreters and Isolation


A Python implementation may support using multiple interpreters in the
same process.  CPython has this support.  Each interpreter is
effectively isolated from the others (with a limited number of
carefully managed process-global exceptions to the rule).

That isolation is primarily useful as a strong separation between
distinct logical components of a program, where you want to have
careful control of how those components interact.

@cartouche
@quotation Note 
Interpreters in the same process can technically never be strictly
isolated from one another since there are few restrictions on memory
access within the same process.  The Python runtime makes a best
effort at isolation but extension modules may easily violate that.
Therefore, do not use multiple interpreters in security-sensitive
situations, where they shouldn’t have access to each other’s data.
@end quotation
@end cartouche

@node Running in an Interpreter,Concurrency and Parallelism,Multiple Interpreters and Isolation,Introduction<10>
@anchor{library/concurrent interpreters running-in-an-interpreter}@anchor{3781}
@subsubsection Running in an Interpreter


Running in a different interpreter involves switching to it in the
current thread and then calling some function.  The runtime will
execute the function using the current interpreter’s state.  The
@code{concurrent.interpreters} module provides a basic API for
creating and managing interpreters, as well as the switch-and-call
operation.

No other threads are automatically started for the operation.
There is @ref{3782,,a helper}@anchor{library/concurrent interpreters interp-call-in-thread}@anchor{3782} for that though.
There is another dedicated helper for calling the builtin
@ref{4a3,,exec()} in an interpreter.

When @ref{4a3,,exec()} (or @ref{4a4,,eval()}) are called in an interpreter,
they run using the interpreter’s @code{__main__} module as the
“globals” namespace.  The same is true for functions that aren’t
associated with any module.  This is the same as how scripts invoked
from the command-line run in the @code{__main__} module.

@node Concurrency and Parallelism,Communication Between Interpreters,Running in an Interpreter,Introduction<10>
@anchor{library/concurrent interpreters concurrency-and-parallelism}@anchor{3783}
@subsubsection Concurrency and Parallelism


As noted earlier, interpreters do not provide any concurrency
on their own.  They strictly represent the isolated execution
context the runtime will use `in the current thread'.  That isolation
makes them similar to processes, but they still enjoy in-process
efficiency, like threads.

All that said, interpreters do naturally support certain flavors of
concurrency.
There’s a powerful side effect of that isolation.  It enables a
different approach to concurrency than you can take with async or
threads.  It’s a similar concurrency model to CSP or the actor model,
a model which is relatively easy to reason about.

You can take advantage of that concurrency model in a single thread,
switching back and forth between interpreters, Stackless-style.
However, this model is more useful when you combine interpreters
with multiple threads.  This mostly involves starting a new thread,
where you switch to another interpreter and run what you want there.

Each actual thread in Python, even if you’re only running in the main
thread, has its own `current' execution context.  Multiple threads can
use the same interpreter or different ones.

At a high level, you can think of the combination of threads and
interpreters as threads with opt-in sharing.

As a significant bonus, interpreters are sufficiently isolated that
they do not share the @ref{165,,GIL}, which means combining threads with
multiple interpreters enables full multi-core parallelism.
(This has been the case since Python 3.12.)

@node Communication Between Interpreters,“Sharing” Objects,Concurrency and Parallelism,Introduction<10>
@anchor{library/concurrent interpreters communication-between-interpreters}@anchor{3784}
@subsubsection Communication Between Interpreters


In practice, multiple interpreters are useful only if we have a way
to communicate between them.  This usually involves some form of
message passing, but can even mean sharing data in some carefully
managed way.

With this in mind, the @code{concurrent.interpreters} module provides
a @ref{15a0,,queue.Queue} implementation, available through
@ref{3785,,create_queue()}.

@node “Sharing” Objects,,Communication Between Interpreters,Introduction<10>
@anchor{library/concurrent interpreters interp-object-sharing}@anchor{3786}@anchor{library/concurrent interpreters sharing-objects}@anchor{3787}
@subsubsection “Sharing” Objects


Any data actually shared between interpreters loses the thread-safety
provided by the @ref{165,,GIL}.  There are various options for dealing with
this in extension modules.  However, from Python code the lack of
thread-safety means objects can’t actually be shared, with a few
exceptions.  Instead, a copy must be created, which means mutable
objects won’t stay in sync.

By default, most objects are copied with @ref{ab,,pickle} when they are
passed to another interpreter.  Nearly all of the immutable builtin
objects are either directly shared or copied efficiently.  For example:


@itemize *

@item 
@ref{887,,None}

@item 
@ref{3c1,,bool} (@ref{e0d,,True} and @ref{d31,,False})

@item 
@ref{193,,bytes}

@item 
@ref{16a,,str}

@item 
@ref{19c,,int}

@item 
@ref{197,,float}

@item 
@ref{614,,tuple} (of similarly supported objects)
@end itemize

There is a small number of Python types that actually share mutable
data between interpreters:


@itemize *

@item 
@ref{166,,memoryview}

@item 
@ref{3788,,Queue}
@end itemize

@node Reference<4>,Basic usage,Introduction<10>,concurrent interpreters — Multiple interpreters in the same process
@anchor{library/concurrent interpreters reference}@anchor{3789}
@subsubsection Reference


This module defines the following functions:

@geindex list_all() (in module concurrent.interpreters)
@anchor{library/concurrent interpreters concurrent interpreters list_all}@anchor{378a}
@deffn {Function} concurrent.interpreters.list_all ()

Return a @ref{24f,,list} of @ref{378b,,Interpreter} objects,
one for each existing interpreter.
@end deffn

@geindex get_current() (in module concurrent.interpreters)
@anchor{library/concurrent interpreters concurrent interpreters get_current}@anchor{378c}
@deffn {Function} concurrent.interpreters.get_current ()

Return an @ref{378b,,Interpreter} object for the currently running
interpreter.
@end deffn

@geindex get_main() (in module concurrent.interpreters)
@anchor{library/concurrent interpreters concurrent interpreters get_main}@anchor{378d}
@deffn {Function} concurrent.interpreters.get_main ()

Return an @ref{378b,,Interpreter} object for the main interpreter.
This is the interpreter the runtime created to run the @ref{492,,REPL}
or the script given at the command-line.  It is usually the only one.
@end deffn

@geindex create() (in module concurrent.interpreters)
@anchor{library/concurrent interpreters concurrent interpreters create}@anchor{180b}
@deffn {Function} concurrent.interpreters.create ()

Initialize a new (idle) Python interpreter
and return a @ref{378b,,Interpreter} object for it.
@end deffn

@geindex create_queue() (in module concurrent.interpreters)
@anchor{library/concurrent interpreters concurrent interpreters create_queue}@anchor{3785}
@deffn {Function} concurrent.interpreters.create_queue ()

Initialize a new cross-interpreter queue and return a @ref{3788,,Queue}
object for it.
@end deffn

@menu
* Interpreter objects:: 
* Exceptions: Exceptions<13>. 
* Communicating Between Interpreters:: 

@end menu

@node Interpreter objects,Exceptions<13>,,Reference<4>
@anchor{library/concurrent interpreters interpreter-objects}@anchor{378e}
@subsubsection Interpreter objects


@geindex Interpreter (class in concurrent.interpreters)
@anchor{library/concurrent interpreters concurrent interpreters Interpreter}@anchor{378b}
@deffn {Class} concurrent.interpreters.Interpreter (id)

A single interpreter in the current process.

Generally, @code{Interpreter} shouldn’t be called directly.
Instead, use @ref{180b,,create()} or one of the other module functions.

@geindex id (concurrent.interpreters.Interpreter attribute)
@anchor{library/concurrent interpreters concurrent interpreters Interpreter id}@anchor{378f}
@deffn {Attribute} id

(read-only)

The underlying interpreter’s ID.
@end deffn

@geindex whence (concurrent.interpreters.Interpreter attribute)
@anchor{library/concurrent interpreters concurrent interpreters Interpreter whence}@anchor{3790}
@deffn {Attribute} whence

(read-only)

A string describing where the interpreter came from.
@end deffn

@geindex is_running() (concurrent.interpreters.Interpreter method)
@anchor{library/concurrent interpreters concurrent interpreters Interpreter is_running}@anchor{3791}
@deffn {Method} is_running ()

Return @code{True} if the interpreter is currently executing code
in its @code{__main__} module and @code{False} otherwise.
@end deffn

@geindex close() (concurrent.interpreters.Interpreter method)
@anchor{library/concurrent interpreters concurrent interpreters Interpreter close}@anchor{1820}
@deffn {Method} close ()

Finalize and destroy the interpreter.
@end deffn

@geindex prepare_main() (concurrent.interpreters.Interpreter method)
@anchor{library/concurrent interpreters concurrent interpreters Interpreter prepare_main}@anchor{3792}
@deffn {Method} prepare_main (ns=None, **kwargs)

Bind objects in the interpreter’s @code{__main__} module.

Some objects are actually shared and some are copied efficiently,
but most are copied via @ref{ab,,pickle}.  See @ref{3786,,“Sharing” Objects}.
@end deffn

@geindex exec() (concurrent.interpreters.Interpreter method)
@anchor{library/concurrent interpreters concurrent interpreters Interpreter exec}@anchor{3793}
@deffn {Method} exec (code, /, dedent=True)

Run the given source code in the interpreter (in the current thread).
@end deffn

@geindex call() (concurrent.interpreters.Interpreter method)
@anchor{library/concurrent interpreters concurrent interpreters Interpreter call}@anchor{3794}
@deffn {Method} call (callable, /, *args, **kwargs)

Return the result of calling running the given function in the
interpreter (in the current thread).
@end deffn

@geindex call_in_thread() (concurrent.interpreters.Interpreter method)
@anchor{library/concurrent interpreters concurrent interpreters Interpreter call_in_thread}@anchor{3795}
@deffn {Method} call_in_thread (callable, /, *args, **kwargs)

Run the given function in the interpreter (in a new thread).
@end deffn
@end deffn

@node Exceptions<13>,Communicating Between Interpreters,Interpreter objects,Reference<4>
@anchor{library/concurrent interpreters exceptions}@anchor{3796}
@subsubsection Exceptions


@geindex InterpreterError
@anchor{library/concurrent interpreters concurrent interpreters InterpreterError}@anchor{3797}
@deffn {Exception} concurrent.interpreters.InterpreterError

This exception, a subclass of @ref{bd3,,Exception}, is raised when
an interpreter-related error happens.
@end deffn

@geindex InterpreterNotFoundError
@anchor{library/concurrent interpreters concurrent interpreters InterpreterNotFoundError}@anchor{3798}
@deffn {Exception} concurrent.interpreters.InterpreterNotFoundError

This exception, a subclass of @ref{3797,,InterpreterError}, is raised when
the targeted interpreter no longer exists.
@end deffn

@geindex ExecutionFailed
@anchor{library/concurrent interpreters concurrent interpreters ExecutionFailed}@anchor{3763}
@deffn {Exception} concurrent.interpreters.ExecutionFailed

This exception, a subclass of @ref{3797,,InterpreterError}, is raised when
the running code raised an uncaught exception.

@geindex excinfo (concurrent.interpreters.ExecutionFailed attribute)
@anchor{library/concurrent interpreters concurrent interpreters ExecutionFailed excinfo}@anchor{3799}
@deffn {Attribute} excinfo

A basic snapshot of the exception raised in the other interpreter.
@end deffn
@end deffn

@c XXX Document the excinfoattrs?

@geindex NotShareableError
@anchor{library/concurrent interpreters concurrent interpreters NotShareableError}@anchor{379a}
@deffn {Exception} concurrent.interpreters.NotShareableError

This exception, a subclass of @ref{199,,TypeError}, is raised when
an object cannot be sent to another interpreter.
@end deffn

@node Communicating Between Interpreters,,Exceptions<13>,Reference<4>
@anchor{library/concurrent interpreters communicating-between-interpreters}@anchor{379b}
@subsubsection Communicating Between Interpreters


@geindex Queue (class in concurrent.interpreters)
@anchor{library/concurrent interpreters concurrent interpreters Queue}@anchor{3788}
@deffn {Class} concurrent.interpreters.Queue (id)

A wrapper around a low-level, cross-interpreter queue, which
implements the @ref{15a0,,queue.Queue} interface.  The underlying queue
can only be created through @ref{3785,,create_queue()}.

Some objects are actually shared and some are copied efficiently,
but most are copied via @ref{ab,,pickle}.  See @ref{3786,,“Sharing” Objects}.

@geindex id (concurrent.interpreters.Queue attribute)
@anchor{library/concurrent interpreters concurrent interpreters Queue id}@anchor{379c}
@deffn {Attribute} id

(read-only)

The queue’s ID.
@end deffn
@end deffn

@geindex QueueEmptyError
@anchor{library/concurrent interpreters concurrent interpreters QueueEmptyError}@anchor{379d}
@deffn {Exception} concurrent.interpreters.QueueEmptyError

This exception, a subclass of @ref{36e6,,queue.Empty}, is raised from
@code{Queue.get()} and @code{Queue.get_nowait()} when the queue
is empty.
@end deffn

@geindex QueueFullError
@anchor{library/concurrent interpreters concurrent interpreters QueueFullError}@anchor{379e}
@deffn {Exception} concurrent.interpreters.QueueFullError

This exception, a subclass of @ref{36e7,,queue.Full}, is raised from
@code{Queue.put()} and @code{Queue.put_nowait()} when the queue
is full.
@end deffn

@node Basic usage,,Reference<4>,concurrent interpreters — Multiple interpreters in the same process
@anchor{library/concurrent interpreters basic-usage}@anchor{379f}
@subsubsection Basic usage


Creating an interpreter and running code in it:

@example
from concurrent import interpreters

interp = interpreters.create()

# Run in the current OS thread.

interp.exec('print("spam!")')

interp.exec("""if True:
    print('spam!')
    """)

from textwrap import dedent
interp.exec(dedent("""
    print('spam!')
    """))

def run(arg):
    return arg

res = interp.call(run, 'spam!')
print(res)

def run():
    print('spam!')

interp.call(run)

# Run in new OS thread.

t = interp.call_in_thread(run)
t.join()
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node subprocess — Subprocess management,sched — Event scheduler,concurrent interpreters — Multiple interpreters in the same process,Concurrent Execution
@anchor{library/subprocess doc}@anchor{37a0}@anchor{library/subprocess module-subprocess}@anchor{dc}@anchor{library/subprocess subprocess-subprocess-management}@anchor{37a1}@anchor{library/subprocess translation-repo}@anchor{37a2}
@subsection @code{subprocess} — Subprocess management


@geindex module; subprocess

`Source code:' Lib/subprocess.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/subprocess.py}


__________________________________________________________________


The @code{subprocess} module allows you to spawn new processes, connect to their
input/output/error pipes, and obtain their return codes.  This module intends to
replace several older modules and functions:

@example
os.system
os.spawn*
@end example

Information about how the @code{subprocess} module can be used to replace these
modules and functions can be found in the following sections.


@subsubheading See also


@geindex Python Enhancement Proposals; PEP 324
PEP 324@footnote{https://peps.python.org/pep-0324/} – PEP proposing the subprocess module


@c include for modules that don't work on WASM or mobile platforms

@ref{2181,,Availability}: not Android, not iOS, not WASI.

This module is not supported on @ref{22a0,,mobile platforms}
or @ref{1bae,,WebAssembly platforms}.

@menu
* Using the subprocess Module:: 
* Security Considerations:: 
* Popen Objects:: 
* Windows Popen Helpers:: 
* Older high-level API:: 
* Replacing Older Functions with the subprocess Module:: 
* Legacy Shell Invocation Functions:: 
* Notes: Notes<2>. 

@end menu

@node Using the subprocess Module,Security Considerations,,subprocess — Subprocess management
@anchor{library/subprocess using-the-subprocess-module}@anchor{37a3}
@subsubsection Using the @code{subprocess} Module


The recommended approach to invoking subprocesses is to use the @ref{d85,,run()}
function for all use cases it can handle. For more advanced use cases, the
underlying @ref{4b8,,Popen} interface can be used directly.

@geindex run() (in module subprocess)
@anchor{library/subprocess subprocess run}@anchor{d85}
@deffn {Function} subprocess.run (args, *, stdin=None, input=None, stdout=None, stderr=None, capture_output=False, shell=False, cwd=None, timeout=None, check=False, encoding=None, errors=None, text=None, env=None, universal_newlines=None, **other_popen_kwargs)

Run the command described by `args'.  Wait for command to complete, then
return a @ref{1079,,CompletedProcess} instance.

The arguments shown above are merely the most common ones, described below
in @ref{37a4,,Frequently Used Arguments} (hence the use of keyword-only notation
in the abbreviated signature). The full function signature is largely the
same as that of the @ref{4b8,,Popen} constructor - most of the arguments to
this function are passed through to that interface. (`timeout',  `input',
`check', and `capture_output' are not.)

If `capture_output' is true, stdout and stderr will be captured.
When used, the internal @ref{4b8,,Popen} object is automatically created with
`stdout' and `stderr' both set to @ref{d86,,PIPE}.
The `stdout' and `stderr' arguments may not be supplied at the same time as `capture_output'.
If you wish to capture and combine both streams into one,
set `stdout' to @code{PIPE}
and `stderr' to @ref{37a5,,STDOUT},
instead of using `capture_output'.

A `timeout' may be specified in seconds, it is internally passed on to
@ref{17fb,,Popen.communicate()}. If the timeout expires, the child process will be
killed and waited for. The @ref{17fc,,TimeoutExpired} exception will be
re-raised after the child process has terminated. The initial process
creation itself cannot be interrupted on many platform APIs so you are not
guaranteed to see a timeout exception until at least after however long
process creation takes.

The `input' argument is passed to @ref{17fb,,Popen.communicate()} and thus to the
subprocess’s stdin.  If used it must be a byte sequence, or a string if
`encoding' or `errors' is specified or `text' is true.  When
used, the internal @ref{4b8,,Popen} object is automatically created with
`stdin' set to @ref{d86,,PIPE},
and the `stdin' argument may not be used as well.

If `check' is true, and the process exits with a non-zero exit code, a
@ref{1530,,CalledProcessError} exception will be raised. Attributes of that
exception hold the arguments, the exit code, and stdout and stderr if they
were captured.

If `encoding' or `errors' are specified, or `text' is true,
file objects for stdin, stdout and stderr are opened in text mode using the
specified `encoding' and `errors' or the @ref{9c4,,io.TextIOWrapper} default.
The `universal_newlines' argument is equivalent  to `text' and is provided
for backwards compatibility. By default, file objects are opened in binary mode.

If `env' is not @code{None}, it must be a mapping that defines the environment
variables for the new process; these are used instead of the default
behavior of inheriting the current process’ environment. It is passed
directly to @ref{4b8,,Popen}. This mapping can be str to str on any platform
or bytes to bytes on POSIX platforms much like @ref{25b,,os.environ} or
@ref{25c,,os.environb}.

Examples:

@example
>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'@w{'})
@end example


Added in version 3.5.



Changed in version 3.6: Added `encoding' and `errors' parameters



Changed in version 3.7: Added the `text' parameter, as a more understandable alias of `universal_newlines'.
Added the `capture_output' parameter.



Changed in version 3.12: Changed Windows shell search order for @code{shell=True}. The current
directory and @code{%PATH%} are replaced with @code{%COMSPEC%} and
@code{%SystemRoot%\System32\cmd.exe}. As a result, dropping a
malicious program named @code{cmd.exe} into a current directory no
longer works.

@end deffn

@geindex CompletedProcess (class in subprocess)
@anchor{library/subprocess subprocess CompletedProcess}@anchor{1079}
@deffn {Class} subprocess.CompletedProcess

The return value from @ref{d85,,run()}, representing a process that has finished.

@geindex args (subprocess.CompletedProcess attribute)
@anchor{library/subprocess subprocess CompletedProcess args}@anchor{37a6}
@deffn {Attribute} args

The arguments used to launch the process. This may be a list or a string.
@end deffn

@geindex returncode (subprocess.CompletedProcess attribute)
@anchor{library/subprocess subprocess CompletedProcess returncode}@anchor{37a7}
@deffn {Attribute} returncode

Exit status of the child process. Typically, an exit status of 0 indicates
that it ran successfully.

A negative value @code{-N} indicates that the child was terminated by signal
@code{N} (POSIX only).
@end deffn

@geindex stdout (subprocess.CompletedProcess attribute)
@anchor{library/subprocess subprocess CompletedProcess stdout}@anchor{37a8}
@deffn {Attribute} stdout

Captured stdout from the child process. A bytes sequence, or a string if
@ref{d85,,run()} was called with an encoding, errors, or text=True.
@code{None} if stdout was not captured.

If you ran the process with @code{stderr=subprocess.STDOUT}, stdout and
stderr will be combined in this attribute, and @ref{37a9,,stderr} will be
@code{None}.
@end deffn

@geindex stderr (subprocess.CompletedProcess attribute)
@anchor{library/subprocess subprocess CompletedProcess stderr}@anchor{37a9}
@deffn {Attribute} stderr

Captured stderr from the child process. A bytes sequence, or a string if
@ref{d85,,run()} was called with an encoding, errors, or text=True.
@code{None} if stderr was not captured.
@end deffn

@geindex check_returncode() (subprocess.CompletedProcess method)
@anchor{library/subprocess subprocess CompletedProcess check_returncode}@anchor{37aa}
@deffn {Method} check_returncode ()

If @ref{37a7,,returncode} is non-zero, raise a @ref{1530,,CalledProcessError}.
@end deffn


Added in version 3.5.

@end deffn

@geindex DEVNULL (in module subprocess)
@anchor{library/subprocess subprocess DEVNULL}@anchor{135a}
@deffn {Data} subprocess.DEVNULL

Special value that can be used as the `stdin', `stdout' or `stderr' argument
to @ref{4b8,,Popen} and indicates that the special file @ref{1e56,,os.devnull}
will be used.


Added in version 3.3.

@end deffn

@geindex PIPE (in module subprocess)
@anchor{library/subprocess subprocess PIPE}@anchor{d86}
@deffn {Data} subprocess.PIPE

Special value that can be used as the `stdin', `stdout' or `stderr' argument
to @ref{4b8,,Popen} and indicates that a pipe to the standard stream should be
opened.  Most useful with @ref{17fb,,Popen.communicate()}.
@end deffn

@geindex STDOUT (in module subprocess)
@anchor{library/subprocess subprocess STDOUT}@anchor{37a5}
@deffn {Data} subprocess.STDOUT

Special value that can be used as the `stderr' argument to @ref{4b8,,Popen} and
indicates that standard error should go into the same handle as standard
output.
@end deffn

@geindex SubprocessError
@anchor{library/subprocess subprocess SubprocessError}@anchor{37ab}
@deffn {Exception} subprocess.SubprocessError

Base class for all other exceptions from this module.


Added in version 3.3.

@end deffn

@geindex TimeoutExpired
@anchor{library/subprocess subprocess TimeoutExpired}@anchor{17fc}
@deffn {Exception} subprocess.TimeoutExpired

Subclass of @ref{37ab,,SubprocessError}, raised when a timeout expires
while waiting for a child process.

@geindex cmd (subprocess.TimeoutExpired attribute)
@anchor{library/subprocess subprocess TimeoutExpired cmd}@anchor{37ac}
@deffn {Attribute} cmd

Command that was used to spawn the child process.
@end deffn

@geindex timeout (subprocess.TimeoutExpired attribute)
@anchor{library/subprocess subprocess TimeoutExpired timeout}@anchor{37ad}
@deffn {Attribute} timeout

Timeout in seconds.
@end deffn

@geindex output (subprocess.TimeoutExpired attribute)
@anchor{library/subprocess subprocess TimeoutExpired output}@anchor{37ae}
@deffn {Attribute} output

Output of the child process if it was captured by @ref{d85,,run()} or
@ref{11c8,,check_output()}.  Otherwise, @code{None}.  This is always
@ref{193,,bytes} when any output was captured regardless of the
@code{text=True} setting.  It may remain @code{None} instead of @code{b'@w{'}}
when no output was observed.
@end deffn

@geindex stdout (subprocess.TimeoutExpired attribute)
@anchor{library/subprocess subprocess TimeoutExpired stdout}@anchor{37af}
@deffn {Attribute} stdout

Alias for output, for symmetry with @ref{37b0,,stderr}.
@end deffn

@geindex stderr (subprocess.TimeoutExpired attribute)
@anchor{library/subprocess subprocess TimeoutExpired stderr}@anchor{37b0}
@deffn {Attribute} stderr

Stderr output of the child process if it was captured by @ref{d85,,run()}.
Otherwise, @code{None}.  This is always @ref{193,,bytes} when stderr output
was captured regardless of the @code{text=True} setting.  It may remain
@code{None} instead of @code{b'@w{'}} when no stderr output was observed.
@end deffn


Added in version 3.3.



Changed in version 3.5: `stdout' and `stderr' attributes added

@end deffn

@geindex CalledProcessError
@anchor{library/subprocess subprocess CalledProcessError}@anchor{1530}
@deffn {Exception} subprocess.CalledProcessError

Subclass of @ref{37ab,,SubprocessError}, raised when a process run by
@ref{37b1,,check_call()}, @ref{11c8,,check_output()}, or @ref{d85,,run()} (with @code{check=True})
returns a non-zero exit status.

@geindex returncode (subprocess.CalledProcessError attribute)
@anchor{library/subprocess subprocess CalledProcessError returncode}@anchor{37b2}
@deffn {Attribute} returncode

Exit status of the child process.  If the process exited due to a
signal, this will be the negative signal number.
@end deffn

@geindex cmd (subprocess.CalledProcessError attribute)
@anchor{library/subprocess subprocess CalledProcessError cmd}@anchor{37b3}
@deffn {Attribute} cmd

Command that was used to spawn the child process.
@end deffn

@geindex output (subprocess.CalledProcessError attribute)
@anchor{library/subprocess subprocess CalledProcessError output}@anchor{37b4}
@deffn {Attribute} output

Output of the child process if it was captured by @ref{d85,,run()} or
@ref{11c8,,check_output()}.  Otherwise, @code{None}.
@end deffn

@geindex stdout (subprocess.CalledProcessError attribute)
@anchor{library/subprocess subprocess CalledProcessError stdout}@anchor{37b5}
@deffn {Attribute} stdout

Alias for output, for symmetry with @ref{37b6,,stderr}.
@end deffn

@geindex stderr (subprocess.CalledProcessError attribute)
@anchor{library/subprocess subprocess CalledProcessError stderr}@anchor{37b6}
@deffn {Attribute} stderr

Stderr output of the child process if it was captured by @ref{d85,,run()}.
Otherwise, @code{None}.
@end deffn


Changed in version 3.5: `stdout' and `stderr' attributes added

@end deffn

@menu
* Frequently Used Arguments:: 
* Popen Constructor:: 
* Exceptions: Exceptions<14>. 

@end menu

@node Frequently Used Arguments,Popen Constructor,,Using the subprocess Module
@anchor{library/subprocess frequently-used-arguments}@anchor{37a4}@anchor{library/subprocess id1}@anchor{37b7}
@subsubsection Frequently Used Arguments


To support a wide variety of use cases, the @ref{4b8,,Popen} constructor (and
the convenience functions) accept a large number of optional arguments. For
most typical use cases, many of these arguments can be safely left at their
default values. The arguments that are most commonly needed are:

@quotation

`args' is required for all calls and should be a string, or a sequence of
program arguments. Providing a sequence of arguments is generally
preferred, as it allows the module to take care of any required escaping
and quoting of arguments (e.g. to permit spaces in file names). If passing
a single string, either `shell' must be @ref{e0d,,True} (see below) or else
the string must simply name the program to be executed without specifying
any arguments.

`stdin', `stdout' and `stderr' specify the executed program’s standard input,
standard output and standard error file handles, respectively.  Valid values
are @code{None}, @ref{d86,,PIPE}, @ref{135a,,DEVNULL}, an existing file descriptor (a
positive integer), and an existing @ref{13cf,,file object} with a valid file
descriptor.  With the default settings of @code{None}, no redirection will
occur.  @code{PIPE} indicates that a new pipe to the child should be
created.  @code{DEVNULL} indicates that the special file @ref{1e56,,os.devnull}
will be used.  Additionally, `stderr' can be @ref{37a5,,STDOUT}, which indicates
that the stderr data from the child process should be captured into the same
file handle as for `stdout'.

@geindex universal newlines; subprocess module

If `encoding' or `errors' are specified, or `text' (also known as
`universal_newlines') is true,
the file objects `stdin', `stdout' and `stderr' will be opened in text
mode using the `encoding' and `errors' specified in the call or the
defaults for @ref{9c4,,io.TextIOWrapper}.

For `stdin', line ending characters @code{'\n'} in the input will be converted
to the default line separator @ref{2623,,os.linesep}. For `stdout' and `stderr',
all line endings in the output will be converted to @code{'\n'}.  For more
information see the documentation of the @ref{9c4,,io.TextIOWrapper} class
when the `newline' argument to its constructor is @code{None}.

If text mode is not used, `stdin', `stdout' and `stderr' will be opened as
binary streams. No encoding or line ending conversion is performed.


Changed in version 3.6: Added the `encoding' and `errors' parameters.



Changed in version 3.7: Added the `text' parameter as an alias for `universal_newlines'.


@cartouche
@quotation Note 
The newlines attribute of the file objects @ref{37b8,,Popen.stdin},
@ref{37b9,,Popen.stdout} and @ref{37ba,,Popen.stderr} are not updated by
the @ref{17fb,,Popen.communicate()} method.
@end quotation
@end cartouche

If `shell' is @code{True}, the specified command will be executed through
the shell.  This can be useful if you are using Python primarily for the
enhanced control flow it offers over most system shells and still want
convenient access to other shell features such as shell pipes, filename
wildcards, environment variable expansion, and expansion of @code{~} to a
user’s home directory.  However, note that Python itself offers
implementations of many shell-like features (in particular, @ref{68,,glob},
@ref{60,,fnmatch}, @ref{6d1,,os.walk()}, @ref{15e5,,os.path.expandvars()},
@ref{c0f,,os.path.expanduser()}, and @ref{ca,,shutil}).


Changed in version 3.3: When `universal_newlines' is @code{True}, the class uses the encoding
@ref{75d,,locale.getpreferredencoding(False)}
instead of @code{locale.getpreferredencoding()}.  See the
@ref{9c4,,io.TextIOWrapper} class for more information on this change.


@cartouche
@quotation Note 
Read the @ref{37bb,,Security Considerations} section before using @code{shell=True}.
@end quotation
@end cartouche
@end quotation

These options, along with all of the other options, are described in more
detail in the @ref{4b8,,Popen} constructor documentation.

@node Popen Constructor,Exceptions<14>,Frequently Used Arguments,Using the subprocess Module
@anchor{library/subprocess popen-constructor}@anchor{37bc}
@subsubsection Popen Constructor


The underlying process creation and management in this module is handled by
the @ref{4b8,,Popen} class. It offers a lot of flexibility so that developers
are able to handle the less common cases not covered by the convenience
functions.

@geindex Popen (class in subprocess)
@anchor{library/subprocess subprocess Popen}@anchor{4b8}
@deffn {Class} subprocess.Popen (args, bufsize=-1, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=True, shell=False, cwd=None, env=None, universal_newlines=None, startupinfo=None, creationflags=0, restore_signals=True, start_new_session=False, pass_fds=(), *, group=None, extra_groups=None, user=None, umask=-1, encoding=None, errors=None, text=None, pipesize=-1, process_group=None)

Execute a child program in a new process.  On POSIX, the class uses
@ref{312a,,os.execvpe()}-like behavior to execute the child program.  On Windows,
the class uses the Windows @code{CreateProcess()} function.  The arguments to
@code{Popen} are as follows.

`args' should be a sequence of program arguments or else a single string
or @ref{5a1,,path-like object}.
By default, the program to execute is the first item in `args' if `args' is
a sequence.  If `args' is a string, the interpretation is
platform-dependent and described below.  See the `shell' and `executable'
arguments for additional differences from the default behavior.  Unless
otherwise stated, it is recommended to pass `args' as a sequence.

@cartouche
@quotation Warning 
For maximum reliability, use a fully qualified path for the executable.
To search for an unqualified name on 
@geindex PATH
@geindex environment variable; PATH
@code{PATH}, use
@ref{6dc,,shutil.which()}. On all platforms, passing @ref{3eb,,sys.executable}
is the recommended way to launch the current Python interpreter again,
and use the @code{-m} command-line format to launch an installed module.

Resolving the path of `executable' (or the first item of `args') is
platform dependent. For POSIX, see @ref{312a,,os.execvpe()}, and note that
when resolving or searching for the executable path, `cwd' overrides the
current working directory and `env' can override the @code{PATH}
environment variable. For Windows, see the documentation of the
@code{lpApplicationName} and @code{lpCommandLine} parameters of WinAPI
@code{CreateProcess}, and note that when resolving or searching for the
executable path with @code{shell=False}, `cwd' does not override the
current working directory and `env' cannot override the @code{PATH}
environment variable. Using a full path avoids all of these variations.
@end quotation
@end cartouche

An example of passing some arguments to an external program
as a sequence is:

@example
Popen(["/usr/bin/git", "commit", "-m", "Fixes a bug."])
@end example

On POSIX, if `args' is a string, the string is interpreted as the name or
path of the program to execute.  However, this can only be done if not
passing arguments to the program.

@cartouche
@quotation Note 
It may not be obvious how to break a shell command into a sequence of arguments,
especially in complex cases. @ref{75f,,shlex.split()} can illustrate how to
determine the correct tokenization for `args':

@example
>>> import shlex, subprocess
>>> command_line = input()
/bin/vikings -input eggs.txt -output "spam spam.txt" -cmd "echo '$MONEY'"
>>> args = shlex.split(command_line)
>>> print(args)
['/bin/vikings', '-input', 'eggs.txt', '-output', 'spam spam.txt', '-cmd', "echo '$MONEY'"]
>>> p = subprocess.Popen(args) # Success!
@end example

Note in particular that options (such as `-input') and arguments (such
as `eggs.txt') that are separated by whitespace in the shell go in separate
list elements, while arguments that need quoting or backslash escaping when
used in the shell (such as filenames containing spaces or the `echo' command
shown above) are single list elements.
@end quotation
@end cartouche

On Windows, if `args' is a sequence, it will be converted to a string in a
manner described in @ref{37bd,,Converting an argument sequence to a string on Windows}.  This is because
the underlying @code{CreateProcess()} operates on strings.


Changed in version 3.6: `args' parameter accepts a @ref{5a1,,path-like object} if `shell' is
@code{False} and a sequence containing path-like objects on POSIX.



Changed in version 3.8: `args' parameter accepts a @ref{5a1,,path-like object} if `shell' is
@code{False} and a sequence containing bytes and path-like objects
on Windows.


The `shell' argument (which defaults to @code{False}) specifies whether to use
the shell as the program to execute.  If `shell' is @code{True}, it is
recommended to pass `args' as a string rather than as a sequence.

On POSIX with @code{shell=True}, the shell defaults to @code{/bin/sh}.  If
`args' is a string, the string specifies the command
to execute through the shell.  This means that the string must be
formatted exactly as it would be when typed at the shell prompt.  This
includes, for example, quoting or backslash escaping filenames with spaces in
them.  If `args' is a sequence, the first item specifies the command string, and
any additional items will be treated as additional arguments to the shell
itself.  That is to say, @code{Popen} does the equivalent of:

@example
Popen(['/bin/sh', '-c', args[0], args[1], ...])
@end example

On Windows with @code{shell=True}, the 
@geindex COMSPEC
@geindex environment variable; COMSPEC
@code{COMSPEC} environment variable
specifies the default shell.  The only time you need to specify
@code{shell=True} on Windows is when the command you wish to execute is built
into the shell (e.g. @code{dir} or @code{copy}).  You do not need
@code{shell=True} to run a batch file or console-based executable.

@cartouche
@quotation Note 
Read the @ref{37bb,,Security Considerations} section before using @code{shell=True}.
@end quotation
@end cartouche

`bufsize' will be supplied as the corresponding argument to the
@ref{318,,open()} function when creating the stdin/stdout/stderr pipe
file objects:


@itemize -

@item 
@code{0} means unbuffered (read and write are one
system call and can return short)

@item 
@code{1} means line buffered
(only usable if @code{text=True} or @code{universal_newlines=True})

@item 
any other positive value means use a buffer of approximately that
size

@item 
negative bufsize (the default) means the system default of
io.DEFAULT_BUFFER_SIZE will be used.
@end itemize


Changed in version 3.3.1: `bufsize' now defaults to -1 to enable buffering by default to match the
behavior that most code expects.  In versions prior to Python 3.2.4 and
3.3.1 it incorrectly defaulted to @code{0} which was unbuffered
and allowed short reads.  This was unintentional and did not match the
behavior of Python 2 as most code expected.


The `executable' argument specifies a replacement program to execute.   It
is very seldom needed.  When @code{shell=False}, `executable' replaces the
program to execute specified by `args'.  However, the original `args' is
still passed to the program.  Most programs treat the program specified
by `args' as the command name, which can then be different from the program
actually executed.  On POSIX, the `args' name
becomes the display name for the executable in utilities such as
@code{ps}.  If @code{shell=True}, on POSIX the `executable' argument
specifies a replacement shell for the default @code{/bin/sh}.


Changed in version 3.6: `executable' parameter accepts a @ref{5a1,,path-like object} on POSIX.



Changed in version 3.8: `executable' parameter accepts a bytes and @ref{5a1,,path-like object}
on Windows.



Changed in version 3.12: Changed Windows shell search order for @code{shell=True}. The current
directory and @code{%PATH%} are replaced with @code{%COMSPEC%} and
@code{%SystemRoot%\System32\cmd.exe}. As a result, dropping a
malicious program named @code{cmd.exe} into a current directory no
longer works.


`stdin', `stdout' and `stderr' specify the executed program’s standard input,
standard output and standard error file handles, respectively.  Valid values
are @code{None}, @ref{d86,,PIPE}, @ref{135a,,DEVNULL}, an existing file descriptor (a
positive integer), and an existing @ref{13cf,,file object} with a valid file
descriptor.  With the default settings of @code{None}, no redirection will
occur.  @code{PIPE} indicates that a new pipe to the child should be
created.  @code{DEVNULL} indicates that the special file @ref{1e56,,os.devnull}
will be used.  Additionally, `stderr' can be @ref{37a5,,STDOUT}, which indicates
that the stderr data from the applications should be captured into the same
file handle as for `stdout'.

If `preexec_fn' is set to a callable object, this object will be called in the
child process just before the child is executed.
(POSIX only)

@cartouche
@quotation Warning 
The `preexec_fn' parameter is NOT SAFE to use in the presence of threads
in your application.  The child process could deadlock before exec is
called.
@end quotation
@end cartouche

@cartouche
@quotation Note 
If you need to modify the environment for the child use the `env'
parameter rather than doing it in a `preexec_fn'.
The `start_new_session' and `process_group' parameters should take the place of
code using `preexec_fn' to call @ref{1dfc,,os.setsid()} or @ref{308f,,os.setpgid()} in the child.
@end quotation
@end cartouche


Changed in version 3.8: The `preexec_fn' parameter is no longer supported in subinterpreters.
The use of the parameter in a subinterpreter raises
@ref{246,,RuntimeError}. The new restriction may affect applications that
are deployed in mod_wsgi, uWSGI, and other embedded environments.


If `close_fds' is true, all file descriptors except @code{0}, @code{1} and
@code{2} will be closed before the child process is executed.  Otherwise
when `close_fds' is false, file descriptors obey their inheritable flag
as described in @ref{1102,,Inheritance of File Descriptors}.

On Windows, if `close_fds' is true then no handles will be inherited by the
child process unless explicitly passed in the @code{handle_list} element of
@ref{e0e,,STARTUPINFO.lpAttributeList}, or by standard handle redirection.


Changed in version 3.2: The default for `close_fds' was changed from @ref{d31,,False} to
what is described above.



Changed in version 3.7: On Windows the default for `close_fds' was changed from @ref{d31,,False} to
@ref{e0d,,True} when redirecting the standard handles. It’s now possible to
set `close_fds' to @code{True} when redirecting the standard handles.


`pass_fds' is an optional sequence of file descriptors to keep open
between the parent and child.  Providing any `pass_fds' forces
`close_fds' to be @ref{e0d,,True}.  (POSIX only)


Changed in version 3.2: The `pass_fds' parameter was added.


If `cwd' is not @code{None}, the function changes the working directory to
`cwd' before executing the child.  `cwd' can be a string, bytes or
@ref{5a1,,path-like} object.  On POSIX, the function
looks for `executable' (or for the first item in `args') relative to `cwd'
if the executable path is a relative path.


Changed in version 3.6: `cwd' parameter accepts a @ref{5a1,,path-like object} on POSIX.



Changed in version 3.7: `cwd' parameter accepts a @ref{5a1,,path-like object} on Windows.



Changed in version 3.8: `cwd' parameter accepts a bytes object on Windows.


If `restore_signals' is true (the default) all signals that Python has set to
SIG_IGN are restored to SIG_DFL in the child process before the exec.
Currently this includes the SIGPIPE, SIGXFZ and SIGXFSZ signals.
(POSIX only)


Changed in version 3.2: `restore_signals' was added.


If `start_new_session' is true the @code{setsid()} system call will be made in the
child process prior to the execution of the subprocess.

@ref{2181,,Availability}: POSIX


Changed in version 3.2: `start_new_session' was added.


If `process_group' is a non-negative integer, the @code{setpgid(0, value)} system call will
be made in the child process prior to the execution of the subprocess.

@ref{2181,,Availability}: POSIX


Changed in version 3.11: `process_group' was added.


If `group' is not @code{None}, the setregid() system call will be made in the
child process prior to the execution of the subprocess. If the provided
value is a string, it will be looked up via @ref{37be,,grp.getgrnam()} and
the value in @code{gr_gid} will be used. If the value is an integer, it
will be passed verbatim. (POSIX only)

@ref{2181,,Availability}: POSIX


Added in version 3.9.


If `extra_groups' is not @code{None}, the setgroups() system call will be
made in the child process prior to the execution of the subprocess.
Strings provided in `extra_groups' will be looked up via
@ref{37be,,grp.getgrnam()} and the values in @code{gr_gid} will be used.
Integer values will be passed verbatim. (POSIX only)

@ref{2181,,Availability}: POSIX


Added in version 3.9.


If `user' is not @code{None}, the setreuid() system call will be made in the
child process prior to the execution of the subprocess. If the provided
value is a string, it will be looked up via @ref{37bf,,pwd.getpwnam()} and
the value in @code{pw_uid} will be used. If the value is an integer, it will
be passed verbatim. (POSIX only)

@cartouche
@quotation Note 
Specifying `user' will not drop existing supplementary group memberships!
The caller must also pass @code{extra_groups=()} to reduce the group membership
of the child process for security purposes.
@end quotation
@end cartouche

@ref{2181,,Availability}: POSIX


Added in version 3.9.


If `umask' is not negative, the umask() system call will be made in the
child process prior to the execution of the subprocess.

@ref{2181,,Availability}: POSIX


Added in version 3.9.


If `env' is not @code{None}, it must be a mapping that defines the environment
variables for the new process; these are used instead of the default
behavior of inheriting the current process’ environment. This mapping can be
str to str on any platform or bytes to bytes on POSIX platforms much like
@ref{25b,,os.environ} or @ref{25c,,os.environb}.

@cartouche
@quotation Note 
If specified, `env' must provide any variables required for the program to
execute.  On Windows, in order to run a side-by-side assembly@footnote{https://en.wikipedia.org/wiki/Side-by-Side_Assembly} the
specified `env' `must' include a valid @code{%SystemRoot%}.
@end quotation
@end cartouche

If `encoding' or `errors' are specified, or `text' is true, the file objects
`stdin', `stdout' and `stderr' are opened in text mode with the specified
`encoding' and `errors', as described above in @ref{37a4,,Frequently Used Arguments}.
The `universal_newlines' argument is equivalent  to `text' and is provided
for backwards compatibility. By default, file objects are opened in binary mode.


Added in version 3.6: `encoding' and `errors' were added.



Added in version 3.7: `text' was added as a more readable alias for `universal_newlines'.


If given, `startupinfo' will be a @ref{37c0,,STARTUPINFO} object, which is
passed to the underlying @code{CreateProcess} function.

If given, `creationflags', can be one or more of the following flags:


@itemize *

@item 
@ref{37c1,,CREATE_NEW_CONSOLE}

@item 
@ref{37c2,,CREATE_NEW_PROCESS_GROUP}

@item 
@ref{37c3,,ABOVE_NORMAL_PRIORITY_CLASS}

@item 
@ref{37c4,,BELOW_NORMAL_PRIORITY_CLASS}

@item 
@ref{37c5,,HIGH_PRIORITY_CLASS}

@item 
@ref{37c6,,IDLE_PRIORITY_CLASS}

@item 
@ref{37c7,,NORMAL_PRIORITY_CLASS}

@item 
@ref{37c8,,REALTIME_PRIORITY_CLASS}

@item 
@ref{37c9,,CREATE_NO_WINDOW}

@item 
@ref{37ca,,DETACHED_PROCESS}

@item 
@ref{37cb,,CREATE_DEFAULT_ERROR_MODE}

@item 
@ref{37cc,,CREATE_BREAKAWAY_FROM_JOB}
@end itemize

`pipesize' can be used to change the size of the pipe when
@ref{d86,,PIPE} is used for `stdin', `stdout' or `stderr'. The size of the pipe
is only changed on platforms that support this (only Linux at this time of
writing). Other platforms will ignore this parameter.


Changed in version 3.10: Added the `pipesize' parameter.


Popen objects are supported as context managers via the @ref{187,,with} statement:
on exit, standard file descriptors are closed, and the process is waited for.

@example
with Popen(["ifconfig"], stdout=PIPE) as proc:
    log.write(proc.stdout.read())
@end example


Popen and the other functions in this module that use it raise an
@ref{1cb1,,auditing event} @code{subprocess.Popen} with arguments
@code{executable}, @code{args}, @code{cwd}, and @code{env}. The value for @code{args}
may be a single string or a list of strings, depending on platform.



Changed in version 3.2: Added context manager support.



Changed in version 3.6: Popen destructor now emits a @ref{54d,,ResourceWarning} warning if the child
process is still running.



Changed in version 3.8: Popen can use @ref{52f,,os.posix_spawn()} in some cases for better
performance. On Windows Subsystem for Linux and QEMU User Emulation,
Popen constructor using @code{os.posix_spawn()} no longer raise an
exception on errors like missing program, but the child process fails
with a non-zero @ref{c89,,returncode}.

@end deffn

@node Exceptions<14>,,Popen Constructor,Using the subprocess Module
@anchor{library/subprocess exceptions}@anchor{37cd}
@subsubsection Exceptions


Exceptions raised in the child process, before the new program has started to
execute, will be re-raised in the parent.

The most common exception raised is @ref{2c2,,OSError}.  This occurs, for example,
when trying to execute a non-existent file.  Applications should prepare for
@code{OSError} exceptions. Note that, when @code{shell=True}, @code{OSError}
will be raised by the child only if the selected shell itself was not found.
To determine if the shell failed to find the requested application, it is
necessary to check the return code or output from the subprocess.

A @ref{2ee,,ValueError} will be raised if @ref{4b8,,Popen} is called with invalid
arguments.

@ref{37b1,,check_call()} and @ref{11c8,,check_output()} will raise
@ref{1530,,CalledProcessError} if the called process returns a non-zero return
code.

All of the functions and methods that accept a `timeout' parameter, such as
@ref{d85,,run()} and @ref{17fb,,Popen.communicate()} will raise @ref{17fc,,TimeoutExpired} if
the timeout expires before the process exits.

Exceptions defined in this module all inherit from @ref{37ab,,SubprocessError}.


Added in version 3.3: The @ref{37ab,,SubprocessError} base class was added.


@node Security Considerations,Popen Objects,Using the subprocess Module,subprocess — Subprocess management
@anchor{library/subprocess security-considerations}@anchor{37bb}@anchor{library/subprocess subprocess-security}@anchor{37ce}
@subsubsection Security Considerations


Unlike some other popen functions, this library will not
implicitly choose to call a system shell.  This means that all characters,
including shell metacharacters, can safely be passed to child processes.
If the shell is invoked explicitly, via @code{shell=True}, it is the application’s
responsibility to ensure that all whitespace and metacharacters are
quoted appropriately to avoid
shell injection@footnote{https://en.wikipedia.org/wiki/Shell_injection#Shell_injection}
vulnerabilities. On @ref{37cf,,some platforms}, it is possible
to use @ref{582,,shlex.quote()} for this escaping.

On Windows, batch files (@code{*.bat} or @code{*.cmd}) may be launched by the
operating system in a system shell regardless of the arguments passed to this
library. This could result in arguments being parsed according to shell rules,
but without any escaping added by Python. If you are intentionally launching a
batch file with arguments from untrusted sources, consider passing
@code{shell=True} to allow Python to escape special characters. See gh-114539@footnote{https://github.com/python/cpython/issues/114539}
for additional discussion.

@node Popen Objects,Windows Popen Helpers,Security Considerations,subprocess — Subprocess management
@anchor{library/subprocess popen-objects}@anchor{37d0}
@subsubsection Popen Objects


Instances of the @ref{4b8,,Popen} class have the following methods:

@geindex poll() (subprocess.Popen method)
@anchor{library/subprocess subprocess Popen poll}@anchor{37d1}
@deffn {Method} Popen.poll ()

Check if child process has terminated.  Set and return
@ref{c89,,returncode} attribute. Otherwise, returns @code{None}.
@end deffn

@geindex wait() (subprocess.Popen method)
@anchor{library/subprocess subprocess Popen wait}@anchor{ee6}
@deffn {Method} Popen.wait (timeout=None)

Wait for child process to terminate.  Set and return
@ref{c89,,returncode} attribute.

If the process does not terminate after `timeout' seconds, raise a
@ref{17fc,,TimeoutExpired} exception.  It is safe to catch this exception and
retry the wait.

@cartouche
@quotation Note 
This will deadlock when using @code{stdout=PIPE} or @code{stderr=PIPE}
and the child process generates enough output to a pipe such that
it blocks waiting for the OS pipe buffer to accept more data.
Use @ref{17fb,,Popen.communicate()} when using pipes to avoid that.
@end quotation
@end cartouche

@cartouche
@quotation Note 
When the @code{timeout} parameter is not @code{None}, then (on POSIX) the
function is implemented using a busy loop (non-blocking call and short
sleeps). Use the @ref{b,,asyncio} module for an asynchronous wait: see
@ref{c71,,asyncio.create_subprocess_exec}.
@end quotation
@end cartouche


Changed in version 3.3: `timeout' was added.

@end deffn

@geindex communicate() (subprocess.Popen method)
@anchor{library/subprocess subprocess Popen communicate}@anchor{17fb}
@deffn {Method} Popen.communicate (input=None, timeout=None)

Interact with process: Send data to stdin.  Read data from stdout and stderr,
until end-of-file is reached.  Wait for process to terminate and set the
@ref{c89,,returncode} attribute.  The optional `input' argument should be
data to be sent to the child process, or @code{None}, if no data should be sent
to the child.  If streams were opened in text mode, `input' must be a string.
Otherwise, it must be bytes.

@code{communicate()} returns a tuple @code{(stdout_data, stderr_data)}.
The data will be strings if streams were opened in text mode; otherwise,
bytes.

Note that if you want to send data to the process’s stdin, you need to create
the Popen object with @code{stdin=PIPE}.  Similarly, to get anything other than
@code{None} in the result tuple, you need to give @code{stdout=PIPE} and/or
@code{stderr=PIPE} too.

If the process does not terminate after `timeout' seconds, a
@ref{17fc,,TimeoutExpired} exception will be raised.  Catching this exception and
retrying communication will not lose any output.  Supplying `input' to a
subsequent post-timeout @code{communicate()} call is in undefined behavior
and may become an error in the future.

The child process is not killed if the timeout expires, so in order to
cleanup properly a well-behaved application should kill the child process and
finish communication:

@example
proc = subprocess.Popen(...)
try:
    outs, errs = proc.communicate(timeout=15)
except TimeoutExpired:
    proc.kill()
    outs, errs = proc.communicate()
@end example

After a call to @code{communicate()} raises @ref{17fc,,TimeoutExpired}, do
not call @ref{ee6,,wait()}. Use an additional @code{communicate()}
call to finish handling pipes and populate the @ref{c89,,returncode}
attribute.

@cartouche
@quotation Note 
The data read is buffered in memory, so do not use this method if the data
size is large or unlimited.
@end quotation
@end cartouche


Changed in version 3.3: `timeout' was added.

@end deffn

@geindex send_signal() (subprocess.Popen method)
@anchor{library/subprocess subprocess Popen send_signal}@anchor{15ea}
@deffn {Method} Popen.send_signal (signal)

Sends the signal `signal' to the child.

Do nothing if the process completed.

@cartouche
@quotation Note 
On Windows, SIGTERM is an alias for @ref{15e8,,terminate()}. CTRL_C_EVENT and
CTRL_BREAK_EVENT can be sent to processes started with a `creationflags'
parameter which includes @code{CREATE_NEW_PROCESS_GROUP}.
@end quotation
@end cartouche
@end deffn

@geindex terminate() (subprocess.Popen method)
@anchor{library/subprocess subprocess Popen terminate}@anchor{15e8}
@deffn {Method} Popen.terminate ()

Stop the child. On POSIX OSs the method sends @ref{15eb,,SIGTERM} to the
child. On Windows the Win32 API function @code{TerminateProcess()} is called
to stop the child.
@end deffn

@geindex kill() (subprocess.Popen method)
@anchor{library/subprocess subprocess Popen kill}@anchor{15e9}
@deffn {Method} Popen.kill ()

Kills the child. On POSIX OSs the function sends SIGKILL to the child.
On Windows @code{kill()} is an alias for @ref{15e8,,terminate()}.
@end deffn

The following attributes are also set by the class for you to access.
Reassigning them to new values is unsupported:

@geindex args (subprocess.Popen attribute)
@anchor{library/subprocess subprocess Popen args}@anchor{37d2}
@deffn {Attribute} Popen.args

The `args' argument as it was passed to @ref{4b8,,Popen} – a
sequence of program arguments or else a single string.


Added in version 3.3.

@end deffn

@geindex stdin (subprocess.Popen attribute)
@anchor{library/subprocess subprocess Popen stdin}@anchor{37b8}
@deffn {Attribute} Popen.stdin

If the `stdin' argument was @ref{d86,,PIPE}, this attribute is a writeable
stream object as returned by @ref{318,,open()}. If the `encoding' or `errors'
arguments were specified or the `text' or `universal_newlines' argument
was @code{True}, the stream is a text stream, otherwise it is a byte stream.
If the `stdin' argument was not @code{PIPE}, this attribute is @code{None}.
@end deffn

@geindex stdout (subprocess.Popen attribute)
@anchor{library/subprocess subprocess Popen stdout}@anchor{37b9}
@deffn {Attribute} Popen.stdout

If the `stdout' argument was @ref{d86,,PIPE}, this attribute is a readable
stream object as returned by @ref{318,,open()}. Reading from the stream provides
output from the child process. If the `encoding' or `errors' arguments were
specified or the `text' or `universal_newlines' argument was @code{True}, the
stream is a text stream, otherwise it is a byte stream. If the `stdout'
argument was not @code{PIPE}, this attribute is @code{None}.
@end deffn

@geindex stderr (subprocess.Popen attribute)
@anchor{library/subprocess subprocess Popen stderr}@anchor{37ba}
@deffn {Attribute} Popen.stderr

If the `stderr' argument was @ref{d86,,PIPE}, this attribute is a readable
stream object as returned by @ref{318,,open()}. Reading from the stream provides
error output from the child process. If the `encoding' or `errors' arguments
were specified or the `text' or `universal_newlines' argument was @code{True}, the
stream is a text stream, otherwise it is a byte stream. If the `stderr' argument
was not @code{PIPE}, this attribute is @code{None}.
@end deffn

@cartouche
@quotation Warning 
Use @ref{17fb,,communicate()} rather than @ref{37b8,,.stdin.write},
@ref{37b9,,.stdout.read} or @ref{37ba,,.stderr.read} to avoid
deadlocks due to any of the other OS pipe buffers filling up and blocking the
child process.
@end quotation
@end cartouche

@geindex pid (subprocess.Popen attribute)
@anchor{library/subprocess subprocess Popen pid}@anchor{37d3}
@deffn {Attribute} Popen.pid

The process ID of the child process.

Note that if you set the `shell' argument to @code{True}, this is the process ID
of the spawned shell.
@end deffn

@geindex returncode (subprocess.Popen attribute)
@anchor{library/subprocess subprocess Popen returncode}@anchor{c89}
@deffn {Attribute} Popen.returncode

The child return code. Initially @code{None}, @ref{c89,,returncode} is set by
a call to the @ref{37d1,,poll()}, @ref{ee6,,wait()}, or @ref{17fb,,communicate()} methods
if they detect that the process has terminated.

A @code{None} value indicates that the process hadn’t yet terminated at the
time of the last method call.

A negative value @code{-N} indicates that the child was terminated by signal
@code{N} (POSIX only).

When @code{shell=True}, the return code reflects the exit status of the shell
itself (e.g. @code{/bin/sh}), which may map signals to codes such as
@code{128+N}. See the documentation of the shell (for example, the Bash
manual’s Exit Status) for details.
@end deffn

@node Windows Popen Helpers,Older high-level API,Popen Objects,subprocess — Subprocess management
@anchor{library/subprocess windows-popen-helpers}@anchor{37d4}
@subsubsection Windows Popen Helpers


The @ref{37c0,,STARTUPINFO} class and following constants are only available
on Windows.

@geindex STARTUPINFO (class in subprocess)
@anchor{library/subprocess subprocess STARTUPINFO}@anchor{37c0}
@deffn {Class} subprocess.STARTUPINFO (*, dwFlags=0, hStdInput=None, hStdOutput=None, hStdError=None, wShowWindow=0, lpAttributeList=None)

Partial support of the Windows
STARTUPINFO@footnote{https://msdn.microsoft.com/en-us/library/ms686331(v=vs.85).aspx}
structure is used for @ref{4b8,,Popen} creation.  The following attributes can
be set by passing them as keyword-only arguments.


Changed in version 3.7: Keyword-only argument support was added.


@geindex dwFlags (subprocess.STARTUPINFO attribute)
@anchor{library/subprocess subprocess STARTUPINFO dwFlags}@anchor{37d5}
@deffn {Attribute} dwFlags

A bit field that determines whether certain @code{STARTUPINFO}
attributes are used when the process creates a window.

@example
si = subprocess.STARTUPINFO()
si.dwFlags = subprocess.STARTF_USESTDHANDLES | subprocess.STARTF_USESHOWWINDOW
@end example
@end deffn

@geindex hStdInput (subprocess.STARTUPINFO attribute)
@anchor{library/subprocess subprocess STARTUPINFO hStdInput}@anchor{37d6}
@deffn {Attribute} hStdInput

If @ref{37d5,,dwFlags} specifies @ref{37d7,,STARTF_USESTDHANDLES}, this attribute
is the standard input handle for the process. If
@code{STARTF_USESTDHANDLES} is not specified, the default for standard
input is the keyboard buffer.
@end deffn

@geindex hStdOutput (subprocess.STARTUPINFO attribute)
@anchor{library/subprocess subprocess STARTUPINFO hStdOutput}@anchor{37d8}
@deffn {Attribute} hStdOutput

If @ref{37d5,,dwFlags} specifies @ref{37d7,,STARTF_USESTDHANDLES}, this attribute
is the standard output handle for the process. Otherwise, this attribute
is ignored and the default for standard output is the console window’s
buffer.
@end deffn

@geindex hStdError (subprocess.STARTUPINFO attribute)
@anchor{library/subprocess subprocess STARTUPINFO hStdError}@anchor{37d9}
@deffn {Attribute} hStdError

If @ref{37d5,,dwFlags} specifies @ref{37d7,,STARTF_USESTDHANDLES}, this attribute
is the standard error handle for the process. Otherwise, this attribute is
ignored and the default for standard error is the console window’s buffer.
@end deffn

@geindex wShowWindow (subprocess.STARTUPINFO attribute)
@anchor{library/subprocess subprocess STARTUPINFO wShowWindow}@anchor{37da}
@deffn {Attribute} wShowWindow

If @ref{37d5,,dwFlags} specifies @ref{37db,,STARTF_USESHOWWINDOW}, this attribute
can be any of the values that can be specified in the @code{nCmdShow}
parameter for the
ShowWindow@footnote{https://msdn.microsoft.com/en-us/library/ms633548(v=vs.85).aspx}
function, except for @code{SW_SHOWDEFAULT}. Otherwise, this attribute is
ignored.

@ref{37dc,,SW_HIDE} is provided for this attribute. It is used when
@ref{4b8,,Popen} is called with @code{shell=True}.
@end deffn

@geindex lpAttributeList (subprocess.STARTUPINFO attribute)
@anchor{library/subprocess subprocess STARTUPINFO lpAttributeList}@anchor{e0e}
@deffn {Attribute} lpAttributeList

A dictionary of additional attributes for process creation as given in
@code{STARTUPINFOEX}, see
UpdateProcThreadAttribute@footnote{https://msdn.microsoft.com/en-us/library/windows/desktop/ms686880(v=vs.85).aspx}.

Supported attributes:


@table @asis

@item `handle_list'

Sequence of handles that will be inherited. `close_fds' must be true if
non-empty.

The handles must be temporarily made inheritable by
@ref{1106,,os.set_handle_inheritable()} when passed to the @ref{4b8,,Popen}
constructor, else @ref{2c2,,OSError} will be raised with Windows error
@code{ERROR_INVALID_PARAMETER} (87).

@cartouche
@quotation Warning 
In a multithreaded process, use caution to avoid leaking handles
that are marked inheritable when combining this feature with
concurrent calls to other process creation functions that inherit
all handles such as @ref{1669,,os.system()}.  This also applies to
standard handle redirection, which temporarily creates inheritable
handles.
@end quotation
@end cartouche
@end table


Added in version 3.7.

@end deffn
@end deffn

@menu
* Windows Constants:: 

@end menu

@node Windows Constants,,,Windows Popen Helpers
@anchor{library/subprocess windows-constants}@anchor{37dd}
@subsubsection Windows Constants


The @code{subprocess} module exposes the following constants.

@geindex STD_INPUT_HANDLE (in module subprocess)
@anchor{library/subprocess subprocess STD_INPUT_HANDLE}@anchor{37de}
@deffn {Data} subprocess.STD_INPUT_HANDLE

The standard input device. Initially, this is the console input buffer,
@code{CONIN$}.
@end deffn

@geindex STD_OUTPUT_HANDLE (in module subprocess)
@anchor{library/subprocess subprocess STD_OUTPUT_HANDLE}@anchor{37df}
@deffn {Data} subprocess.STD_OUTPUT_HANDLE

The standard output device. Initially, this is the active console screen
buffer, @code{CONOUT$}.
@end deffn

@geindex STD_ERROR_HANDLE (in module subprocess)
@anchor{library/subprocess subprocess STD_ERROR_HANDLE}@anchor{37e0}
@deffn {Data} subprocess.STD_ERROR_HANDLE

The standard error device. Initially, this is the active console screen
buffer, @code{CONOUT$}.
@end deffn

@geindex SW_HIDE (in module subprocess)
@anchor{library/subprocess subprocess SW_HIDE}@anchor{37dc}
@deffn {Data} subprocess.SW_HIDE

Hides the window. Another window will be activated.
@end deffn

@geindex STARTF_USESTDHANDLES (in module subprocess)
@anchor{library/subprocess subprocess STARTF_USESTDHANDLES}@anchor{37d7}
@deffn {Data} subprocess.STARTF_USESTDHANDLES

Specifies that the @ref{37d6,,STARTUPINFO.hStdInput},
@ref{37d8,,STARTUPINFO.hStdOutput}, and @ref{37d9,,STARTUPINFO.hStdError} attributes
contain additional information.
@end deffn

@geindex STARTF_USESHOWWINDOW (in module subprocess)
@anchor{library/subprocess subprocess STARTF_USESHOWWINDOW}@anchor{37db}
@deffn {Data} subprocess.STARTF_USESHOWWINDOW

Specifies that the @ref{37da,,STARTUPINFO.wShowWindow} attribute contains
additional information.
@end deffn

@geindex STARTF_FORCEONFEEDBACK (in module subprocess)
@anchor{library/subprocess subprocess STARTF_FORCEONFEEDBACK}@anchor{37e1}
@deffn {Data} subprocess.STARTF_FORCEONFEEDBACK

A @ref{37d5,,STARTUPINFO.dwFlags} parameter to specify that the
`Working in Background' mouse cursor will be displayed while a
process is launching. This is the default behavior for GUI
processes.


Added in version 3.13.

@end deffn

@geindex STARTF_FORCEOFFFEEDBACK (in module subprocess)
@anchor{library/subprocess subprocess STARTF_FORCEOFFFEEDBACK}@anchor{37e2}
@deffn {Data} subprocess.STARTF_FORCEOFFFEEDBACK

A @ref{37d5,,STARTUPINFO.dwFlags} parameter to specify that the mouse
cursor will not be changed when launching a process.


Added in version 3.13.

@end deffn

@geindex CREATE_NEW_CONSOLE (in module subprocess)
@anchor{library/subprocess subprocess CREATE_NEW_CONSOLE}@anchor{37c1}
@deffn {Data} subprocess.CREATE_NEW_CONSOLE

The new process has a new console, instead of inheriting its parent’s
console (the default).
@end deffn

@geindex CREATE_NEW_PROCESS_GROUP (in module subprocess)
@anchor{library/subprocess subprocess CREATE_NEW_PROCESS_GROUP}@anchor{37c2}
@deffn {Data} subprocess.CREATE_NEW_PROCESS_GROUP

A @ref{4b8,,Popen} @code{creationflags} parameter to specify that a new process
group will be created. This flag is necessary for using @ref{1573,,os.kill()}
on the subprocess.

This flag is ignored if @ref{37c1,,CREATE_NEW_CONSOLE} is specified.
@end deffn

@geindex ABOVE_NORMAL_PRIORITY_CLASS (in module subprocess)
@anchor{library/subprocess subprocess ABOVE_NORMAL_PRIORITY_CLASS}@anchor{37c3}
@deffn {Data} subprocess.ABOVE_NORMAL_PRIORITY_CLASS

A @ref{4b8,,Popen} @code{creationflags} parameter to specify that a new process
will have an above average priority.


Added in version 3.7.

@end deffn

@geindex BELOW_NORMAL_PRIORITY_CLASS (in module subprocess)
@anchor{library/subprocess subprocess BELOW_NORMAL_PRIORITY_CLASS}@anchor{37c4}
@deffn {Data} subprocess.BELOW_NORMAL_PRIORITY_CLASS

A @ref{4b8,,Popen} @code{creationflags} parameter to specify that a new process
will have a below average priority.


Added in version 3.7.

@end deffn

@geindex HIGH_PRIORITY_CLASS (in module subprocess)
@anchor{library/subprocess subprocess HIGH_PRIORITY_CLASS}@anchor{37c5}
@deffn {Data} subprocess.HIGH_PRIORITY_CLASS

A @ref{4b8,,Popen} @code{creationflags} parameter to specify that a new process
will have a high priority.


Added in version 3.7.

@end deffn

@geindex IDLE_PRIORITY_CLASS (in module subprocess)
@anchor{library/subprocess subprocess IDLE_PRIORITY_CLASS}@anchor{37c6}
@deffn {Data} subprocess.IDLE_PRIORITY_CLASS

A @ref{4b8,,Popen} @code{creationflags} parameter to specify that a new process
will have an idle (lowest) priority.


Added in version 3.7.

@end deffn

@geindex NORMAL_PRIORITY_CLASS (in module subprocess)
@anchor{library/subprocess subprocess NORMAL_PRIORITY_CLASS}@anchor{37c7}
@deffn {Data} subprocess.NORMAL_PRIORITY_CLASS

A @ref{4b8,,Popen} @code{creationflags} parameter to specify that a new process
will have a normal priority. (default)


Added in version 3.7.

@end deffn

@geindex REALTIME_PRIORITY_CLASS (in module subprocess)
@anchor{library/subprocess subprocess REALTIME_PRIORITY_CLASS}@anchor{37c8}
@deffn {Data} subprocess.REALTIME_PRIORITY_CLASS

A @ref{4b8,,Popen} @code{creationflags} parameter to specify that a new process
will have realtime priority.
You should almost never use REALTIME_PRIORITY_CLASS, because this interrupts
system threads that manage mouse input, keyboard input, and background disk
flushing. This class can be appropriate for applications that “talk” directly
to hardware or that perform brief tasks that should have limited interruptions.


Added in version 3.7.

@end deffn

@geindex CREATE_NO_WINDOW (in module subprocess)
@anchor{library/subprocess subprocess CREATE_NO_WINDOW}@anchor{37c9}
@deffn {Data} subprocess.CREATE_NO_WINDOW

A @ref{4b8,,Popen} @code{creationflags} parameter to specify that a new process
will not create a window.


Added in version 3.7.

@end deffn

@geindex DETACHED_PROCESS (in module subprocess)
@anchor{library/subprocess subprocess DETACHED_PROCESS}@anchor{37ca}
@deffn {Data} subprocess.DETACHED_PROCESS

A @ref{4b8,,Popen} @code{creationflags} parameter to specify that a new process
will not inherit its parent’s console.
This value cannot be used with CREATE_NEW_CONSOLE.


Added in version 3.7.

@end deffn

@geindex CREATE_DEFAULT_ERROR_MODE (in module subprocess)
@anchor{library/subprocess subprocess CREATE_DEFAULT_ERROR_MODE}@anchor{37cb}
@deffn {Data} subprocess.CREATE_DEFAULT_ERROR_MODE

A @ref{4b8,,Popen} @code{creationflags} parameter to specify that a new process
does not inherit the error mode of the calling process. Instead, the new
process gets the default error mode.
This feature is particularly useful for multithreaded shell applications
that run with hard errors disabled.


Added in version 3.7.

@end deffn

@geindex CREATE_BREAKAWAY_FROM_JOB (in module subprocess)
@anchor{library/subprocess subprocess CREATE_BREAKAWAY_FROM_JOB}@anchor{37cc}
@deffn {Data} subprocess.CREATE_BREAKAWAY_FROM_JOB

A @ref{4b8,,Popen} @code{creationflags} parameter to specify that a new process
is not associated with the job.


Added in version 3.7.

@end deffn

@node Older high-level API,Replacing Older Functions with the subprocess Module,Windows Popen Helpers,subprocess — Subprocess management
@anchor{library/subprocess call-function-trio}@anchor{37e3}@anchor{library/subprocess older-high-level-api}@anchor{37e4}
@subsubsection Older high-level API


Prior to Python 3.5, these three functions comprised the high level API to
subprocess. You can now use @ref{d85,,run()} in many cases, but lots of existing code
calls these functions.

@geindex call() (in module subprocess)
@anchor{library/subprocess subprocess call}@anchor{d87}
@deffn {Function} subprocess.call (args, *, stdin=None, stdout=None, stderr=None, shell=False, cwd=None, timeout=None, **other_popen_kwargs)

Run the command described by `args'.  Wait for command to complete, then
return the @ref{c89,,returncode} attribute.

Code needing to capture stdout or stderr should use @ref{d85,,run()} instead:

@example
run(...).returncode
@end example

To suppress stdout or stderr, supply a value of @ref{135a,,DEVNULL}.

The arguments shown above are merely some common ones.
The full function signature is the
same as that of the @ref{4b8,,Popen} constructor - this function passes all
supplied arguments other than `timeout' directly through to that interface.

@cartouche
@quotation Note 
Do not use @code{stdout=PIPE} or @code{stderr=PIPE} with this
function.  The child process will block if it generates enough
output to a pipe to fill up the OS pipe buffer as the pipes are
not being read from.
@end quotation
@end cartouche


Changed in version 3.3: `timeout' was added.



Changed in version 3.12: Changed Windows shell search order for @code{shell=True}. The current
directory and @code{%PATH%} are replaced with @code{%COMSPEC%} and
@code{%SystemRoot%\System32\cmd.exe}. As a result, dropping a
malicious program named @code{cmd.exe} into a current directory no
longer works.

@end deffn

@geindex check_call() (in module subprocess)
@anchor{library/subprocess subprocess check_call}@anchor{37b1}
@deffn {Function} subprocess.check_call (args, *, stdin=None, stdout=None, stderr=None, shell=False, cwd=None, timeout=None, **other_popen_kwargs)

Run command with arguments.  Wait for command to complete. If the return
code was zero then return, otherwise raise @ref{1530,,CalledProcessError}. The
@code{CalledProcessError} object will have the return code in the
@ref{37b2,,returncode} attribute.
If @code{check_call()} was unable to start the process it will propagate the exception
that was raised.

Code needing to capture stdout or stderr should use @ref{d85,,run()} instead:

@example
run(..., check=True)
@end example

To suppress stdout or stderr, supply a value of @ref{135a,,DEVNULL}.

The arguments shown above are merely some common ones.
The full function signature is the
same as that of the @ref{4b8,,Popen} constructor - this function passes all
supplied arguments other than `timeout' directly through to that interface.

@cartouche
@quotation Note 
Do not use @code{stdout=PIPE} or @code{stderr=PIPE} with this
function.  The child process will block if it generates enough
output to a pipe to fill up the OS pipe buffer as the pipes are
not being read from.
@end quotation
@end cartouche


Changed in version 3.3: `timeout' was added.



Changed in version 3.12: Changed Windows shell search order for @code{shell=True}. The current
directory and @code{%PATH%} are replaced with @code{%COMSPEC%} and
@code{%SystemRoot%\System32\cmd.exe}. As a result, dropping a
malicious program named @code{cmd.exe} into a current directory no
longer works.

@end deffn

@geindex check_output() (in module subprocess)
@anchor{library/subprocess subprocess check_output}@anchor{11c8}
@deffn {Function} subprocess.check_output (args, *, stdin=None, stderr=None, shell=False, cwd=None, encoding=None, errors=None, universal_newlines=None, timeout=None, text=None, **other_popen_kwargs)

Run command with arguments and return its output.

If the return code was non-zero it raises a @ref{1530,,CalledProcessError}. The
@code{CalledProcessError} object will have the return code in the
@ref{37b2,,returncode} attribute and any output in the
@ref{37b4,,output} attribute.

This is equivalent to:

@example
run(..., check=True, stdout=PIPE).stdout
@end example

The arguments shown above are merely some common ones.
The full function signature is largely the same as that of @ref{d85,,run()} -
most arguments are passed directly through to that interface.
One API deviation from @code{run()} behavior exists: passing @code{input=None}
will behave the same as @code{input=b'@w{'}} (or @code{input='@w{'}}, depending on other
arguments) rather than using the parent’s standard input file handle.

By default, this function will return the data as encoded bytes. The actual
encoding of the output data may depend on the command being invoked, so the
decoding to text will often need to be handled at the application level.

This behaviour may be overridden by setting `text', `encoding', `errors',
or `universal_newlines' to @code{True} as described in
@ref{37a4,,Frequently Used Arguments} and @ref{d85,,run()}.

To also capture standard error in the result, use
@code{stderr=subprocess.STDOUT}:

@example
>>> subprocess.check_output(
...     "ls non_existent_file; exit 0",
...     stderr=subprocess.STDOUT,
...     shell=True)
'ls: non_existent_file: No such file or directory\n'
@end example


Added in version 3.1.



Changed in version 3.3: `timeout' was added.



Changed in version 3.4: Support for the `input' keyword argument was added.



Changed in version 3.6: `encoding' and `errors' were added.  See @ref{d85,,run()} for details.



Added in version 3.7: `text' was added as a more readable alias for `universal_newlines'.



Changed in version 3.12: Changed Windows shell search order for @code{shell=True}. The current
directory and @code{%PATH%} are replaced with @code{%COMSPEC%} and
@code{%SystemRoot%\System32\cmd.exe}. As a result, dropping a
malicious program named @code{cmd.exe} into a current directory no
longer works.

@end deffn

@node Replacing Older Functions with the subprocess Module,Legacy Shell Invocation Functions,Older high-level API,subprocess — Subprocess management
@anchor{library/subprocess replacing-older-functions-with-the-subprocess-module}@anchor{37e5}@anchor{library/subprocess subprocess-replacements}@anchor{1394}
@subsubsection Replacing Older Functions with the @code{subprocess} Module


In this section, “a becomes b” means that b can be used as a replacement for a.

@cartouche
@quotation Note 
All “a” functions in this section fail (more or less) silently if the
executed program cannot be found; the “b” replacements raise @ref{2c2,,OSError}
instead.

In addition, the replacements using @ref{11c8,,check_output()} will fail with a
@ref{1530,,CalledProcessError} if the requested operation produces a non-zero
return code. The output is still available as the
@ref{37b4,,output} attribute of the raised exception.
@end quotation
@end cartouche

In the following examples, we assume that the relevant functions have already
been imported from the @code{subprocess} module.

@menu
* Replacing /bin/sh shell command substitution:: 
* Replacing shell pipeline:: 
* Replacing os.system(): Replacing os system. 
* Replacing the os.spawn family: Replacing the os spawn family. 
* Replacing os.popen(): Replacing os popen. 

@end menu

@node Replacing /bin/sh shell command substitution,Replacing shell pipeline,,Replacing Older Functions with the subprocess Module
@anchor{library/subprocess replacing-bin-sh-shell-command-substitution}@anchor{37e6}
@subsubsection Replacing @code{/bin/sh} shell command substitution


@example
output=$(mycmd myarg)
@end example

becomes:

@example
output = check_output(["mycmd", "myarg"])
@end example

@node Replacing shell pipeline,Replacing os system,Replacing /bin/sh shell command substitution,Replacing Older Functions with the subprocess Module
@anchor{library/subprocess replacing-shell-pipeline}@anchor{37e7}
@subsubsection Replacing shell pipeline


@example
output=$(dmesg | grep hda)
@end example

becomes:

@example
p1 = Popen(["dmesg"], stdout=PIPE)
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
p1.stdout.close()  # Allow p1 to receive a SIGPIPE if p2 exits.
output = p2.communicate()[0]
@end example

The @code{p1.stdout.close()} call after starting the p2 is important in order for
p1 to receive a SIGPIPE if p2 exits before p1.

Alternatively, for trusted input, the shell’s own pipeline support may still
be used directly:

@example
output=$(dmesg | grep hda)
@end example

becomes:

@example
output = check_output("dmesg | grep hda", shell=True)
@end example

@node Replacing os system,Replacing the os spawn family,Replacing shell pipeline,Replacing Older Functions with the subprocess Module
@anchor{library/subprocess replacing-os-system}@anchor{37e8}
@subsubsection Replacing @code{os.system()}


@example
sts = os.system("mycmd" + " myarg")
# becomes
retcode = call("mycmd" + " myarg", shell=True)
@end example

Notes:


@itemize *

@item 
Calling the program through the shell is usually not required.

@item 
The @ref{d87,,call()} return value is encoded differently to that of
@ref{1669,,os.system()}.

@item 
The @ref{1669,,os.system()} function ignores SIGINT and SIGQUIT signals while
the command is running, but the caller must do this separately when
using the @code{subprocess} module.
@end itemize

A more realistic example would look like this:

@example
try:
    retcode = call("mycmd" + " myarg", shell=True)
    if retcode < 0:
        print("Child was terminated by signal", -retcode, file=sys.stderr)
    else:
        print("Child returned", retcode, file=sys.stderr)
except OSError as e:
    print("Execution failed:", e, file=sys.stderr)
@end example

@node Replacing the os spawn family,Replacing os popen,Replacing os system,Replacing Older Functions with the subprocess Module
@anchor{library/subprocess replacing-the-os-spawn-family}@anchor{37e9}
@subsubsection Replacing the @code{os.spawn} family


P_NOWAIT example:

@example
pid = os.spawnlp(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg")
==>
pid = Popen(["/bin/mycmd", "myarg"]).pid
@end example

P_WAIT example:

@example
retcode = os.spawnlp(os.P_WAIT, "/bin/mycmd", "mycmd", "myarg")
==>
retcode = call(["/bin/mycmd", "myarg"])
@end example

Vector example:

@example
os.spawnvp(os.P_NOWAIT, path, args)
==>
Popen([path] + args[1:])
@end example

Environment example:

@example
os.spawnlpe(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg", env)
==>
Popen(["/bin/mycmd", "myarg"], env=@{"PATH": "/usr/bin"@})
@end example

@node Replacing os popen,,Replacing the os spawn family,Replacing Older Functions with the subprocess Module
@anchor{library/subprocess replacing-os-popen}@anchor{37ea}
@subsubsection Replacing @code{os.popen()}


Return code handling translates as follows:

@example
pipe = os.popen(cmd, 'w')
...
rc = pipe.close()
if rc is not None and rc >> 8:
    print("There were some errors")
==>
process = Popen(cmd, stdin=PIPE)
...
process.stdin.close()
if process.wait() != 0:
    print("There were some errors")
@end example

@node Legacy Shell Invocation Functions,Notes<2>,Replacing Older Functions with the subprocess Module,subprocess — Subprocess management
@anchor{library/subprocess legacy-shell-invocation-functions}@anchor{37eb}
@subsubsection Legacy Shell Invocation Functions


This module also provides the following legacy functions from the 2.x
@code{commands} module. These operations implicitly invoke the system shell and
none of the guarantees described above regarding security and exception
handling consistency are valid for these functions.

@geindex getstatusoutput() (in module subprocess)
@anchor{library/subprocess subprocess getstatusoutput}@anchor{11ca}
@deffn {Function} subprocess.getstatusoutput (cmd, *, encoding=None, errors=None)

Return @code{(exitcode, output)} of executing `cmd' in a shell.

Execute the string `cmd' in a shell with @ref{11c8,,check_output()} and
return a 2-tuple @code{(exitcode, output)}.
`encoding' and `errors' are used to decode output;
see the notes on @ref{37a4,,Frequently Used Arguments} for more details.

A trailing newline is stripped from the output.
The exit code for the command can be interpreted as the return code
of subprocess.  Example:

@example
>>> subprocess.getstatusoutput('ls /bin/ls')
(0, '/bin/ls')
>>> subprocess.getstatusoutput('cat /bin/junk')
(1, 'cat: /bin/junk: No such file or directory')
>>> subprocess.getstatusoutput('/bin/junk')
(127, 'sh: /bin/junk: not found')
>>> subprocess.getstatusoutput('/bin/kill $$')
(-15, '@w{'})
@end example

@ref{2181,,Availability}: Unix, Windows.


Changed in version 3.3.4: Windows support was added.

The function now returns (exitcode, output) instead of (status, output)
as it did in Python 3.3.3 and earlier.  exitcode has the same value as
@ref{c89,,returncode}.



Changed in version 3.11: Added the `encoding' and `errors' parameters.

@end deffn

@geindex getoutput() (in module subprocess)
@anchor{library/subprocess subprocess getoutput}@anchor{11c9}
@deffn {Function} subprocess.getoutput (cmd, *, encoding=None, errors=None)

Return output (stdout and stderr) of executing `cmd' in a shell.

Like @ref{11ca,,getstatusoutput()}, except the exit code is ignored and the return
value is a string containing the command’s output.  Example:

@example
>>> subprocess.getoutput('ls /bin/ls')
'/bin/ls'
@end example

@ref{2181,,Availability}: Unix, Windows.


Changed in version 3.3.4: Windows support added



Changed in version 3.11: Added the `encoding' and `errors' parameters.

@end deffn

@node Notes<2>,,Legacy Shell Invocation Functions,subprocess — Subprocess management
@anchor{library/subprocess notes}@anchor{37ec}
@subsubsection Notes


@menu
* Timeout Behavior:: 
* Converting an argument sequence to a string on Windows:: 
* Disable use of posix_spawn(): Disable use of posix_spawn. 

@end menu

@node Timeout Behavior,Converting an argument sequence to a string on Windows,,Notes<2>
@anchor{library/subprocess subprocess-timeout-behavior}@anchor{37ed}@anchor{library/subprocess timeout-behavior}@anchor{37ee}
@subsubsection Timeout Behavior


When using the @code{timeout} parameter in functions like @ref{d85,,run()},
@ref{ee6,,Popen.wait()}, or @ref{17fb,,Popen.communicate()},
users should be aware of the following behaviors:


@enumerate 

@item 
`Process Creation Delay': The initial process creation itself cannot be interrupted
on many platform APIs. This means that even when specifying a timeout, you are not
guaranteed to see a timeout exception until at least after however long process
creation takes.

@item 
`Extremely Small Timeout Values': Setting very small timeout values (such as a few
milliseconds) may result in almost immediate @ref{17fc,,TimeoutExpired} exceptions because
process creation and system scheduling inherently require time.
@end enumerate

@node Converting an argument sequence to a string on Windows,Disable use of posix_spawn,Timeout Behavior,Notes<2>
@anchor{library/subprocess converting-an-argument-sequence-to-a-string-on-windows}@anchor{37ef}@anchor{library/subprocess converting-argument-sequence}@anchor{37bd}
@subsubsection Converting an argument sequence to a string on Windows


On Windows, an `args' sequence is converted to a string that can be parsed
using the following rules (which correspond to the rules used by the MS C
runtime):


@enumerate 

@item 
Arguments are delimited by white space, which is either a
space or a tab.

@item 
A string surrounded by double quotation marks is
interpreted as a single argument, regardless of white space
contained within.  A quoted string can be embedded in an
argument.

@item 
A double quotation mark preceded by a backslash is
interpreted as a literal double quotation mark.

@item 
Backslashes are interpreted literally, unless they
immediately precede a double quotation mark.

@item 
If backslashes immediately precede a double quotation mark,
every pair of backslashes is interpreted as a literal
backslash.  If the number of backslashes is odd, the last
backslash escapes the next double quotation mark as
described in rule 3.
@end enumerate


@subsubheading See also



@table @asis

@item @ref{c9,,shlex}

Module which provides function to parse and escape command lines.
@end table


@node Disable use of posix_spawn,,Converting an argument sequence to a string on Windows,Notes<2>
@anchor{library/subprocess disable-posix-spawn}@anchor{37f0}@anchor{library/subprocess disable-use-of-posix-spawn}@anchor{37f1}
@subsubsection Disable use of @code{posix_spawn()}


On Linux, @code{subprocess} defaults to using the @code{vfork()} system call
internally when it is safe to do so rather than @code{fork()}. This greatly
improves performance.

@example
subprocess._USE_POSIX_SPAWN = False  # See CPython issue gh-NNNNNN.
@end example

It is safe to set this to false on any Python version. It will have no
effect on older or newer versions where unsupported. Do not assume the attribute
is available to read. Despite the name, a true value does not indicate the
corresponding function will be used, only that it may be.

Please file issues any time you have to use these private knobs with a way to
reproduce the issue you were seeing. Link to that issue from a comment in your
code.


Added in version 3.8: @code{_USE_POSIX_SPAWN}


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node sched — Event scheduler,queue — A synchronized queue class,subprocess — Subprocess management,Concurrent Execution
@anchor{library/sched doc}@anchor{37f2}@anchor{library/sched module-sched}@anchor{c4}@anchor{library/sched sched-event-scheduler}@anchor{37f3}@anchor{library/sched translation-repo}@anchor{37f4}
@subsection @code{sched} — Event scheduler


@geindex module; sched

`Source code:' Lib/sched.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/sched.py}

@geindex event scheduling


__________________________________________________________________


The @code{sched} module defines a class which implements a general purpose event
scheduler:

@geindex scheduler (class in sched)
@anchor{library/sched sched scheduler}@anchor{1333}
@deffn {Class} sched.scheduler (timefunc=time.monotonic, delayfunc=time.sleep)

The @code{scheduler} class defines a generic interface to scheduling events.
It needs two functions to actually deal with the “outside world” — `timefunc'
should be callable without arguments, and return  a number (the “time”, in any
units whatsoever).  The `delayfunc' function should be callable with one
argument, compatible with the output of `timefunc', and should delay that many
time units. `delayfunc' will also be called with the argument @code{0} after each
event is run to allow other threads an opportunity to run in multi-threaded
applications.


Changed in version 3.3: `timefunc' and `delayfunc' parameters are optional.



Changed in version 3.3: @code{scheduler} class can be safely used in multi-threaded
environments.

@end deffn

Example:

@example
>>> import sched, time
>>> s = sched.scheduler(time.time, time.sleep)
>>> def print_time(a='default'):
...     print("From print_time", time.time(), a)
...
>>> def print_some_times():
...     print(time.time())
...     s.enter(10, 1, print_time)
...     s.enter(5, 2, print_time, argument=('positional',))
...     # despite having higher priority, 'keyword' runs after 'positional' as enter() is relative
...     s.enter(5, 1, print_time, kwargs=@{'a': 'keyword'@})
...     s.enterabs(1_650_000_000, 10, print_time, argument=("first enterabs",))
...     s.enterabs(1_650_000_000, 5, print_time, argument=("second enterabs",))
...     s.run()
...     print(time.time())
...
>>> print_some_times()
1652342830.3640375
From print_time 1652342830.3642538 second enterabs
From print_time 1652342830.3643398 first enterabs
From print_time 1652342835.3694863 positional
From print_time 1652342835.3696074 keyword
From print_time 1652342840.369612 default
1652342840.3697174
@end example

@menu
* Scheduler Objects:: 

@end menu

@node Scheduler Objects,,,sched — Event scheduler
@anchor{library/sched id1}@anchor{37f5}@anchor{library/sched scheduler-objects}@anchor{37f6}
@subsubsection Scheduler Objects


@ref{1333,,scheduler} instances have the following methods and attributes:

@geindex enterabs() (sched.scheduler method)
@anchor{library/sched sched scheduler enterabs}@anchor{1335}
@deffn {Method} scheduler.enterabs (time, priority, action, argument=(), kwargs=@{@})

Schedule a new event. The `time' argument should be a numeric type compatible
with the return value of the `timefunc' function passed  to the constructor.
Events scheduled for the same `time' will be executed in the order of their
`priority'. A lower number represents a higher priority.

Executing the event means executing @code{action(*argument, **kwargs)}.
`argument' is a sequence holding the positional arguments for `action'.
`kwargs' is a dictionary holding the keyword arguments for `action'.

Return value is an event which may be used for later cancellation of the event
(see @ref{1d3f,,cancel()}).


Changed in version 3.3: `argument' parameter is optional.



Changed in version 3.3: `kwargs' parameter was added.

@end deffn

@geindex enter() (sched.scheduler method)
@anchor{library/sched sched scheduler enter}@anchor{1334}
@deffn {Method} scheduler.enter (delay, priority, action, argument=(), kwargs=@{@})

Schedule an event for `delay' more time units. Other than the relative time, the
other arguments, the effect and the return value are the same as those for
@ref{1335,,enterabs()}.


Changed in version 3.3: `argument' parameter is optional.



Changed in version 3.3: `kwargs' parameter was added.

@end deffn

@geindex cancel() (sched.scheduler method)
@anchor{library/sched sched scheduler cancel}@anchor{1d3f}
@deffn {Method} scheduler.cancel (event)

Remove the event from the queue. If `event' is not an event currently in the
queue, this method will raise a @ref{2ee,,ValueError}.
@end deffn

@geindex empty() (sched.scheduler method)
@anchor{library/sched sched scheduler empty}@anchor{37f7}
@deffn {Method} scheduler.empty ()

Return @code{True} if the event queue is empty.
@end deffn

@geindex run() (sched.scheduler method)
@anchor{library/sched sched scheduler run}@anchor{1332}
@deffn {Method} scheduler.run (blocking=True)

Run all scheduled events. This method will wait  (using the `delayfunc'
function passed to the constructor) for the next event, then execute it and so
on until there are no more scheduled events.

If `blocking' is false, immediately executes all events in the queue which have
a time value less than or equal to the current `timefunc' value (if any) and
returns the difference between the current `timefunc' value and the time value
of the next scheduled event in the scheduler’s event queue.  If the queue is
empty, returns @code{None}.

Either `action' or `delayfunc' can raise an exception.  In either case, the
scheduler will maintain a consistent state and propagate the exception.  If an
exception is raised by `action', the event will not be attempted in future calls
to @code{run()}.

If a sequence of events takes longer to run than the time available before the
next event, the scheduler will simply fall behind.  No events will be dropped;
the calling code is responsible for canceling  events which are no longer
pertinent.


Changed in version 3.3: `blocking' parameter was added.

@end deffn

@geindex queue (sched.scheduler attribute)
@anchor{library/sched sched scheduler queue}@anchor{37f8}
@deffn {Attribute} scheduler.queue

Read-only attribute returning a list of upcoming events in the order they
will be run.  Each event is shown as a @ref{85f,,named tuple} with the
following fields:  time, priority, action, argument, kwargs.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node queue — A synchronized queue class,contextvars — Context Variables,sched — Event scheduler,Concurrent Execution
@anchor{library/queue doc}@anchor{37f9}@anchor{library/queue module-queue}@anchor{bb}@anchor{library/queue queue-a-synchronized-queue-class}@anchor{37fa}@anchor{library/queue translation-repo}@anchor{37fb}
@subsection @code{queue} — A synchronized queue class


@geindex module; queue

`Source code:' Lib/queue.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/queue.py}


__________________________________________________________________


The @code{queue} module implements multi-producer, multi-consumer queues.
It is especially useful in threaded programming when information must be
exchanged safely between multiple threads.  The @ref{15a0,,Queue} class in this
module implements all the required locking semantics.

The module implements three types of queue, which differ only in the order in
which the entries are retrieved.  In a @abbr{FIFO}
queue, the first tasks added are the first retrieved.  In a
@abbr{LIFO} queue, the most recently added entry is
the first retrieved (operating like a stack).  With a priority queue,
the entries are kept sorted (using the @ref{6d,,heapq} module) and the
lowest valued entry is retrieved first.

Internally, those three types of queues use locks to temporarily block
competing threads; however, they are not designed to handle reentrancy
within a thread.

In addition, the module implements a “simple”
@abbr{FIFO} queue type, @ref{d67,,SimpleQueue}, whose
specific implementation provides additional guarantees
in exchange for the smaller functionality.

The @code{queue} module defines the following classes and exceptions:

@geindex Queue (class in queue)
@anchor{library/queue queue Queue}@anchor{15a0}
@deffn {Class} queue.Queue (maxsize=0)

Constructor for a @abbr{FIFO} queue.  `maxsize' is
an integer that sets the upperbound
limit on the number of items that can be placed in the queue.  Insertion will
block once this size has been reached, until queue items are consumed.  If
`maxsize' is less than or equal to zero, the queue size is infinite.
@end deffn

@geindex LifoQueue (class in queue)
@anchor{library/queue queue LifoQueue}@anchor{2701}
@deffn {Class} queue.LifoQueue (maxsize=0)

Constructor for a @abbr{LIFO} queue.  `maxsize' is
an integer that sets the upperbound
limit on the number of items that can be placed in the queue.  Insertion will
block once this size has been reached, until queue items are consumed.  If
`maxsize' is less than or equal to zero, the queue size is infinite.
@end deffn

@geindex PriorityQueue (class in queue)
@anchor{library/queue queue PriorityQueue}@anchor{2702}
@deffn {Class} queue.PriorityQueue (maxsize=0)

Constructor for a priority queue.  `maxsize' is an integer that sets the upperbound
limit on the number of items that can be placed in the queue.  Insertion will
block once this size has been reached, until queue items are consumed.  If
`maxsize' is less than or equal to zero, the queue size is infinite.

The lowest valued entries are retrieved first (the lowest valued entry is the
one that would be returned by @code{min(entries)}).  A typical pattern for
entries is a tuple in the form: @code{(priority_number, data)}.

If the `data' elements are not comparable, the data can be wrapped in a class
that ignores the data item and only compares the priority number:

@example
from dataclasses import dataclass, field
from typing import Any

@@dataclass(order=True)
class PrioritizedItem:
    priority: int
    item: Any=field(compare=False)
@end example
@end deffn

@geindex SimpleQueue (class in queue)
@anchor{library/queue queue SimpleQueue}@anchor{d67}
@deffn {Class} queue.SimpleQueue

Constructor for an unbounded @abbr{FIFO} queue.
Simple queues lack advanced functionality such as task tracking.

Simple queues are @ref{2410,,generic} over the type of their items.


Added in version 3.7.

@end deffn

@geindex Empty
@anchor{library/queue queue Empty}@anchor{36e6}
@deffn {Exception} queue.Empty

Exception raised when non-blocking @ref{3236,,get()} (or
@ref{37fc,,get_nowait()}) is called
on a @ref{15a0,,Queue} object which is empty.
@end deffn

@geindex Full
@anchor{library/queue queue Full}@anchor{36e7}
@deffn {Exception} queue.Full

Exception raised when non-blocking @ref{37fd,,put()} (or
@ref{3235,,put_nowait()}) is called
on a @ref{15a0,,Queue} object which is full.
@end deffn

@geindex ShutDown
@anchor{library/queue queue ShutDown}@anchor{544}
@deffn {Exception} queue.ShutDown

Exception raised when @ref{37fd,,put()} or @ref{3236,,get()} is called on
a @ref{15a0,,Queue} object which has been shut down.


Added in version 3.13.

@end deffn

@menu
* Queue Objects:: 
* SimpleQueue Objects:: 

@end menu

@node Queue Objects,SimpleQueue Objects,,queue — A synchronized queue class
@anchor{library/queue queue-objects}@anchor{37fe}@anchor{library/queue queueobjects}@anchor{37ff}
@subsubsection Queue Objects


Queue objects (@ref{15a0,,Queue}, @ref{2701,,LifoQueue}, or @ref{2702,,PriorityQueue})
provide the public methods described below.

@geindex qsize() (queue.Queue method)
@anchor{library/queue queue Queue qsize}@anchor{3800}
@deffn {Method} Queue.qsize ()

Return the approximate size of the queue.  Note, qsize() > 0 doesn’t
guarantee that a subsequent get() will not block, nor will qsize() < maxsize
guarantee that put() will not block.
@end deffn

@geindex empty() (queue.Queue method)
@anchor{library/queue queue Queue empty}@anchor{3801}
@deffn {Method} Queue.empty ()

Return @code{True} if the queue is empty, @code{False} otherwise.  If empty()
returns @code{True} it doesn’t guarantee that a subsequent call to put()
will not block.  Similarly, if empty() returns @code{False} it doesn’t
guarantee that a subsequent call to get() will not block.
@end deffn

@geindex full() (queue.Queue method)
@anchor{library/queue queue Queue full}@anchor{3802}
@deffn {Method} Queue.full ()

Return @code{True} if the queue is full, @code{False} otherwise.  If full()
returns @code{True} it doesn’t guarantee that a subsequent call to get()
will not block.  Similarly, if full() returns @code{False} it doesn’t
guarantee that a subsequent call to put() will not block.
@end deffn

@geindex put() (queue.Queue method)
@anchor{library/queue queue Queue put}@anchor{37fd}
@deffn {Method} Queue.put (item, block=True, timeout=None)

Put `item' into the queue.  If optional args `block' is true and `timeout' is
@code{None} (the default), block if necessary until a free slot is available.  If
`timeout' is a positive number, it blocks at most `timeout' seconds and raises
the @ref{36e7,,Full} exception if no free slot was available within that time.
Otherwise (`block' is false), put an item on the queue if a free slot is
immediately available, else raise the @code{Full} exception (`timeout' is
ignored in that case).

Raises @ref{544,,ShutDown} if the queue has been shut down.
@end deffn

@geindex put_nowait() (queue.Queue method)
@anchor{library/queue queue Queue put_nowait}@anchor{3235}
@deffn {Method} Queue.put_nowait (item)

Equivalent to @code{put(item, block=False)}.
@end deffn

@geindex get() (queue.Queue method)
@anchor{library/queue queue Queue get}@anchor{3236}
@deffn {Method} Queue.get (block=True, timeout=None)

Remove and return an item from the queue.  If optional args `block' is true and
`timeout' is @code{None} (the default), block if necessary until an item is available.
If `timeout' is a positive number, it blocks at most `timeout' seconds and
raises the @ref{36e6,,Empty} exception if no item was available within that time.
Otherwise (`block' is false), return an item if one is immediately available,
else raise the @code{Empty} exception (`timeout' is ignored in that case).

Prior to 3.0 on POSIX systems, and for all versions on Windows, if
`block' is true and `timeout' is @code{None}, this operation goes into
an uninterruptible wait on an underlying lock.  This means that no exceptions
can occur, and in particular a SIGINT will not trigger a @ref{bcb,,KeyboardInterrupt}.

Raises @ref{544,,ShutDown} if the queue has been shut down and is empty, or if
the queue has been shut down immediately.
@end deffn

@geindex get_nowait() (queue.Queue method)
@anchor{library/queue queue Queue get_nowait}@anchor{37fc}
@deffn {Method} Queue.get_nowait ()

Equivalent to @code{get(False)}.
@end deffn

Two methods are offered to support tracking whether enqueued tasks have been
fully processed by daemon consumer threads.

@geindex task_done() (queue.Queue method)
@anchor{library/queue queue Queue task_done}@anchor{36e2}
@deffn {Method} Queue.task_done ()

Indicate that a formerly enqueued task is complete.  Used by queue consumer
threads.  For each @ref{3236,,get()} used to fetch a task, a subsequent call to
@code{task_done()} tells the queue that the processing on the task is complete.

If a @ref{36e3,,join()} is currently blocking, it will resume when all items have been
processed (meaning that a @code{task_done()} call was received for every item
that had been @ref{37fd,,put()} into the queue).

Raises a @ref{2ee,,ValueError} if called more times than there were items placed in
the queue.
@end deffn

@geindex join() (queue.Queue method)
@anchor{library/queue queue Queue join}@anchor{36e3}
@deffn {Method} Queue.join ()

Blocks until all items in the queue have been gotten and processed.

The count of unfinished tasks goes up whenever an item is added to the queue.
The count goes down whenever a consumer thread calls @ref{36e2,,task_done()} to
indicate that the item was retrieved and all work on it is complete.  When the
count of unfinished tasks drops to zero, @code{join()} unblocks.
@end deffn

@menu
* Waiting for task completion:: 
* Terminating queues:: 

@end menu

@node Waiting for task completion,Terminating queues,,Queue Objects
@anchor{library/queue waiting-for-task-completion}@anchor{3803}
@subsubsection Waiting for task completion


Example of how to wait for enqueued tasks to be completed:

@example
import threading
import queue

q = queue.Queue()

def worker():
    while True:
        item = q.get()
        print(f'Working on @{item@}')
        print(f'Finished @{item@}')
        q.task_done()

# Turn-on the worker thread.
threading.Thread(target=worker, daemon=True).start()

# Send thirty task requests to the worker.
for item in range(30):
    q.put(item)

# Block until all tasks are done.
q.join()
print('All work completed')
@end example

@node Terminating queues,,Waiting for task completion,Queue Objects
@anchor{library/queue terminating-queues}@anchor{3804}
@subsubsection Terminating queues


When no longer needed, @ref{15a0,,Queue} objects can be wound down
until empty or terminated immediately with a hard shutdown.

@geindex shutdown() (queue.Queue method)
@anchor{library/queue queue Queue shutdown}@anchor{543}
@deffn {Method} Queue.shutdown (immediate=False)

Put a @ref{15a0,,Queue} instance into a shutdown mode.

The queue can no longer grow.
Future calls to @ref{37fd,,put()} raise @ref{544,,ShutDown}.
Currently blocked callers of @code{put()} will be unblocked
and will raise @code{ShutDown} in the formerly blocked thread.

If `immediate' is false (the default), the queue can be wound
down normally with @ref{3236,,get()} calls to extract tasks
that have already been loaded.

And if @ref{36e2,,task_done()} is called for each remaining task, a
pending @ref{36e3,,join()} will be unblocked normally.

Once the queue is empty, future calls to @ref{3236,,get()} will
raise @ref{544,,ShutDown}.

If `immediate' is true, the queue is terminated immediately.
The queue is drained to be completely empty and the count
of unfinished tasks is reduced by the number of tasks drained.
If unfinished tasks is zero, callers of @ref{36e3,,join()}
are unblocked.  Also, blocked callers of @ref{3236,,get()}
are unblocked and will raise @ref{544,,ShutDown} because the
queue is empty.

Use caution when using @ref{36e3,,join()} with `immediate' set
to true. This unblocks the join even when no work has been done
on the tasks, violating the usual invariant for joining a queue.


Added in version 3.13.

@end deffn

@node SimpleQueue Objects,,Queue Objects,queue — A synchronized queue class
@anchor{library/queue simplequeue-objects}@anchor{3805}
@subsubsection SimpleQueue Objects


@ref{d67,,SimpleQueue} objects provide the public methods described below.

@geindex qsize() (queue.SimpleQueue method)
@anchor{library/queue queue SimpleQueue qsize}@anchor{3806}
@deffn {Method} SimpleQueue.qsize ()

Return the approximate size of the queue.  Note, qsize() > 0 doesn’t
guarantee that a subsequent get() will not block.
@end deffn

@geindex empty() (queue.SimpleQueue method)
@anchor{library/queue queue SimpleQueue empty}@anchor{3807}
@deffn {Method} SimpleQueue.empty ()

Return @code{True} if the queue is empty, @code{False} otherwise.  If empty()
returns @code{False} it doesn’t guarantee that a subsequent call to get()
will not block.
@end deffn

@geindex put() (queue.SimpleQueue method)
@anchor{library/queue queue SimpleQueue put}@anchor{3808}
@deffn {Method} SimpleQueue.put (item, block=True, timeout=None)

Put `item' into the queue.  The method never blocks and always succeeds
(except for potential low-level errors such as failure to allocate memory).
The optional args `block' and `timeout' are ignored and only provided
for compatibility with @ref{37fd,,Queue.put()}.

`CPython implementation detail:' This method has a C implementation which is reentrant.  That is, a
@code{put()} or @code{get()} call can be interrupted by another @code{put()}
call in the same thread without deadlocking or corrupting internal
state inside the queue.  This makes it appropriate for use in
destructors such as @code{__del__} methods or @ref{11b,,weakref} callbacks.
@end deffn

@geindex put_nowait() (queue.SimpleQueue method)
@anchor{library/queue queue SimpleQueue put_nowait}@anchor{3809}
@deffn {Method} SimpleQueue.put_nowait (item)

Equivalent to @code{put(item, block=False)}, provided for compatibility with
@ref{3235,,Queue.put_nowait()}.
@end deffn

@geindex get() (queue.SimpleQueue method)
@anchor{library/queue queue SimpleQueue get}@anchor{380a}
@deffn {Method} SimpleQueue.get (block=True, timeout=None)

Remove and return an item from the queue.  If optional args `block' is true and
`timeout' is @code{None} (the default), block if necessary until an item is available.
If `timeout' is a positive number, it blocks at most `timeout' seconds and
raises the @ref{36e6,,Empty} exception if no item was available within that time.
Otherwise (`block' is false), return an item if one is immediately available,
else raise the @code{Empty} exception (`timeout' is ignored in that case).
@end deffn

@geindex get_nowait() (queue.SimpleQueue method)
@anchor{library/queue queue SimpleQueue get_nowait}@anchor{380b}
@deffn {Method} SimpleQueue.get_nowait ()

Equivalent to @code{get(False)}.
@end deffn


@subsubheading See also



@table @asis

@item Class @ref{1bcd,,multiprocessing.Queue}

A queue class for use in a multi-processing (rather than multi-threading)
context.
@end table

@ref{7f5,,collections.deque} is an alternative implementation of unbounded
queues with fast atomic @ref{29e5,,append()} and
@ref{29eb,,popleft()} operations that do not require locking
and also support indexing.


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node contextvars — Context Variables,_thread — Low-level threading API,queue — A synchronized queue class,Concurrent Execution
@anchor{library/contextvars doc}@anchor{380c}@anchor{library/contextvars contextvars-context-variables}@anchor{380d}@anchor{library/contextvars module-contextvars}@anchor{28}@anchor{library/contextvars translation-repo}@anchor{380e}
@subsection @code{contextvars} — Context Variables


@geindex module; contextvars


__________________________________________________________________


This module provides APIs to manage, store, and access context-local
state.  The @ref{18be,,ContextVar} class is used to declare
and work with `Context Variables'.  The @ref{3699,,copy_context()}
function and the @ref{178,,Context} class should be used to
manage the current context in asynchronous frameworks.

Context managers that have state should use Context Variables
instead of @ref{18a8,,threading.local()} to prevent their state from
bleeding to other code unexpectedly, when used in concurrent code.

See also 
@geindex Python Enhancement Proposals; PEP 567
PEP 567@footnote{https://peps.python.org/pep-0567/} for additional details.


Added in version 3.7.


@menu
* Context Variables:: 
* Manual Context Management:: 
* asyncio support:: 

@end menu

@node Context Variables,Manual Context Management,,contextvars — Context Variables
@anchor{library/contextvars context-variables}@anchor{380f}
@subsubsection Context Variables


@geindex ContextVar (class in contextvars)
@anchor{library/contextvars contextvars ContextVar}@anchor{18be}
@deffn {Class} contextvars.ContextVar (name[, *, default])

This class is used to declare a new Context Variable, e.g.:

@example
var: ContextVar[int] = ContextVar('var', default=42)
@end example

The required `name' parameter is used for introspection and debug
purposes.

The optional keyword-only `default' parameter is returned by
@ref{3810,,ContextVar.get()} when no value for the variable is found
in the current context.

`Important:' Context Variables should be created at the top module
level and never in closures.  @ref{178,,Context} objects hold strong
references to context variables which prevents context variables
from being properly garbage collected.

@code{ContextVar}s are @ref{2410,,generic} over the type of
their contained value.

@geindex name (contextvars.ContextVar attribute)
@anchor{library/contextvars contextvars ContextVar name}@anchor{3811}
@deffn {Attribute} name

The name of the variable.  This is a read-only property.


Added in version 3.7.1.

@end deffn

@geindex get() (contextvars.ContextVar method)
@anchor{library/contextvars contextvars ContextVar get}@anchor{3810}
@deffn {Method} get ([default])

Return a value for the context variable for the current context.

If there is no value for the variable in the current context,
the method will:


@itemize *

@item 
return the value of the `default' argument of the method,
if provided; or

@item 
return the default value for the context variable,
if it was created with one; or

@item 
raise a @ref{242c,,LookupError}.
@end itemize
@end deffn

@geindex set() (contextvars.ContextVar method)
@anchor{library/contextvars contextvars ContextVar set}@anchor{17e4}
@deffn {Method} set (value)

Call to set a new value for the context variable in the current
context.

The required `value' argument is the new value for the context
variable.

Returns a @ref{1e4,,Token} object that can be used
to restore the variable to its previous value via the
@ref{3812,,ContextVar.reset()} method.

For convenience, the token object can be used as a context manager
to avoid calling @ref{3812,,ContextVar.reset()} manually:

@example
var = ContextVar('var', default='default value')

with var.set('new value'):
    assert var.get() == 'new value'

assert var.get() == 'default value'
@end example

It is a shorthand for:

@example
var = ContextVar('var', default='default value')

token = var.set('new value')
try:
    assert var.get() == 'new value'
finally:
    var.reset(token)

assert var.get() == 'default value'
@end example


Added in version 3.14: Added support for using tokens as context managers.

@end deffn

@geindex reset() (contextvars.ContextVar method)
@anchor{library/contextvars contextvars ContextVar reset}@anchor{3812}
@deffn {Method} reset (token)

Reset the context variable to the value it had before the
@ref{17e4,,ContextVar.set()} that created the `token' was used.

For example:

@example
var = ContextVar('var')

token = var.set('new value')
# code that uses 'var'; var.get() returns 'new value'.
var.reset(token)

# After the reset call the var has no value again, so
# var.get() would raise a LookupError.
@end example

The same `token' cannot be used twice.
@end deffn
@end deffn

@geindex Token (class in contextvars)
@anchor{library/contextvars contextvars Token}@anchor{1e4}
@deffn {Class} contextvars.Token

`Token' objects are returned by the @ref{17e4,,ContextVar.set()} method.
They can be passed to the @ref{3812,,ContextVar.reset()} method to revert
the value of the variable to what it was before the corresponding
`set'. A single token cannot reset a context variable more than once.

Tokens support the @ref{23c5,,context manager protocol}
to automatically reset context variables. See @ref{17e4,,ContextVar.set()}.

Tokens are @ref{2410,,generic} over the same type as the
@ref{18be,,ContextVar} which created them.


Added in version 3.14: Added support for usage as a context manager.


@geindex var (contextvars.Token attribute)
@anchor{library/contextvars contextvars Token var}@anchor{3813}
@deffn {Attribute} var

A read-only property.  Points to the @ref{18be,,ContextVar} object
that created the token.
@end deffn

@geindex old_value (contextvars.Token attribute)
@anchor{library/contextvars contextvars Token old_value}@anchor{3814}
@deffn {Attribute} old_value

A read-only property.  Set to the value the variable had before
the @ref{17e4,,ContextVar.set()} method call that created the token.
It points to @ref{1843,,Token.MISSING} if the variable was not set
before the call.
@end deffn

@geindex MISSING (contextvars.Token attribute)
@anchor{library/contextvars contextvars Token MISSING}@anchor{1843}
@deffn {Attribute} MISSING

A marker object used by @ref{3814,,Token.old_value}.
@end deffn
@end deffn

@node Manual Context Management,asyncio support,Context Variables,contextvars — Context Variables
@anchor{library/contextvars manual-context-management}@anchor{3815}
@subsubsection Manual Context Management


@geindex copy_context() (in module contextvars)
@anchor{library/contextvars contextvars copy_context}@anchor{3699}
@deffn {Function} contextvars.copy_context ()

Returns a copy of the current @ref{178,,Context} object.

The following snippet gets a copy of the current context and prints
all variables and their values that are set in it:

@example
ctx: Context = copy_context()
print(list(ctx.items()))
@end example

The function has an `O'(1) complexity, i.e. works equally fast for
contexts with a few context variables and for contexts that have
a lot of them.
@end deffn

@geindex Context (class in contextvars)
@anchor{library/contextvars contextvars Context}@anchor{178}
@deffn {Class} contextvars.Context

A mapping of @ref{18be,,ContextVars} to their values.

@code{Context()} creates an empty context with no values in it.
To get a copy of the current context use the
@ref{3699,,copy_context()} function.

Each thread has its own effective stack of @code{Context} objects.  The
@ref{19a8,,current context} is the @code{Context} object at the top of the
current thread’s stack.  All @code{Context} objects in the stacks are
considered to be `entered'.

`Entering' a context, which can be done by calling its @ref{198f,,run()}
method, makes the context the current context by pushing it onto the top of
the current thread’s context stack.

`Exiting' from the current context, which can be done by returning from the
callback passed to the @ref{198f,,run()} method, restores the current
context to what it was before the context was entered by popping the context
off the top of the context stack.

Since each thread has its own context stack, @ref{18be,,ContextVar} objects
behave in a similar fashion to @ref{18a8,,threading.local()} when values are
assigned in different threads.

Attempting to enter an already entered context, including contexts entered in
other threads, raises a @ref{246,,RuntimeError}.

After exiting a context, it can later be re-entered (from any thread).

Any changes to @ref{18be,,ContextVar} values via the @ref{17e4,,ContextVar.set()}
method are recorded in the current context.  The @ref{3810,,ContextVar.get()}
method returns the value associated with the current context.  Exiting a
context effectively reverts any changes made to context variables while the
context was entered (if needed, the values can be restored by re-entering the
context).

Context implements the @ref{acd,,collections.abc.Mapping} interface.

@geindex run() (contextvars.Context method)
@anchor{library/contextvars contextvars Context run}@anchor{198f}
@deffn {Method} run (callable, *args, **kwargs)

Enters the Context, executes @code{callable(*args, **kwargs)}, then exits the
Context.  Returns `callable'’s return value, or propagates an exception if
one occurred.

Example:

@example
import contextvars

var = contextvars.ContextVar('var')
var.set('spam')
print(var.get())  # 'spam'

ctx = contextvars.copy_context()

def main():
    # 'var' was set to 'spam' before
    # calling 'copy_context()' and 'ctx.run(main)', so:
    print(var.get())  # 'spam'
    print(ctx[var])  # 'spam'

    var.set('ham')

    # Now, after setting 'var' to 'ham':
    print(var.get())  # 'ham'
    print(ctx[var])  # 'ham'

# Any changes that the 'main' function makes to 'var'
# will be contained in 'ctx'.
ctx.run(main)

# The 'main()' function was run in the 'ctx' context,
# so changes to 'var' are contained in it:
print(ctx[var])  # 'ham'

# However, outside of 'ctx', 'var' is still set to 'spam':
print(var.get())  # 'spam'
@end example

@c spam
@c spam
@c spam
@c ham
@c ham
@c ham
@c spam
@end deffn

@geindex copy() (contextvars.Context method)
@anchor{library/contextvars contextvars Context copy}@anchor{3816}
@deffn {Method} copy ()

Return a shallow copy of the context object.
@end deffn


@deffn {Describe} var in context

Return @code{True} if the `context' has a value for `var' set;
return @code{False} otherwise.
@end deffn


@deffn {Describe} context[var]

Return the value of the `var' @ref{18be,,ContextVar} variable.
If the variable is not set in the context object, a
@ref{5e7,,KeyError} is raised.
@end deffn

@geindex get() (contextvars.Context method)
@anchor{library/contextvars contextvars Context get}@anchor{3817}
@deffn {Method} get (var[, default])

Return the value for `var' if `var' has the value in the context
object.  Return `default' otherwise.  If `default' is not given,
return @code{None}.
@end deffn


@deffn {Describe} iter(context)

Return an iterator over the variables stored in the context
object.
@end deffn


@deffn {Describe} len(proxy)

Return the number of variables set in the context object.
@end deffn

@geindex keys() (contextvars.Context method)
@anchor{library/contextvars contextvars Context keys}@anchor{3818}
@deffn {Method} keys ()

Return a list of all variables in the context object.
@end deffn

@geindex values() (contextvars.Context method)
@anchor{library/contextvars contextvars Context values}@anchor{3819}
@deffn {Method} values ()

Return a list of all variables’ values in the context object.
@end deffn

@geindex items() (contextvars.Context method)
@anchor{library/contextvars contextvars Context items}@anchor{381a}
@deffn {Method} items ()

Return a list of 2-tuples containing all variables and their
values in the context object.
@end deffn
@end deffn

@node asyncio support,,Manual Context Management,contextvars — Context Variables
@anchor{library/contextvars asyncio-support}@anchor{381b}
@subsubsection asyncio support


Context variables are natively supported in @ref{b,,asyncio} and are
ready to be used without any extra configuration.  For example, here
is a simple echo server, that uses a context variable to make the
address of a remote client available in the Task that handles that
client:

@example
import asyncio
import contextvars

client_addr_var = contextvars.ContextVar('client_addr')

def render_goodbye():
    # The address of the currently handled client can be accessed
    # without passing it explicitly to this function.

    client_addr = client_addr_var.get()
    return f'Good bye, client @@ @{client_addr@}\r\n'.encode()

async def handle_request(reader, writer):
    addr = writer.transport.get_extra_info('socket').getpeername()
    client_addr_var.set(addr)

    # In any code that we call is now possible to get
    # client's address by calling 'client_addr_var.get()'.

    while True:
        line = await reader.readline()
        print(line)
        if not line.strip():
            break

    writer.write(b'HTTP/1.1 200 OK\r\n')  # status line
    writer.write(b'\r\n')  # headers
    writer.write(render_goodbye())  # body
    writer.close()

async def main():
    srv = await asyncio.start_server(
        handle_request, '127.0.0.1', 8081)

    async with srv:
        await srv.serve_forever()

asyncio.run(main())

# To test it you can use telnet or curl:
#     telnet 127.0.0.1 8081
#     curl 127.0.0.1:8081
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

The following are support modules for some of the above services:

@node _thread — Low-level threading API,,contextvars — Context Variables,Concurrent Execution
@anchor{library/_thread doc}@anchor{381c}@anchor{library/_thread module-_thread}@anchor{2}@anchor{library/_thread thread-low-level-threading-api}@anchor{381d}@anchor{library/_thread translation-repo}@anchor{381e}
@subsection @code{_thread} — Low-level threading API


@geindex module; _thread

@geindex light-weight processes
@geindex processes@comma{} light-weight
@geindex binary semaphores
@geindex semaphores@comma{} binary


__________________________________________________________________


This module provides low-level primitives for working with multiple threads
(also called `light-weight processes' or `tasks') — multiple threads of
control sharing their global data space.  For synchronization, simple locks
(also called `mutexes' or `binary semaphores') are provided.
The @ref{f3,,threading} module provides an easier to use and higher-level
threading API built on top of this module.

@geindex pthreads
@geindex threads; POSIX


Changed in version 3.7: This module used to be optional, it is now always available.


This module defines the following constants and functions:

@geindex error
@anchor{library/_thread thread error}@anchor{381f}
@deffn {Exception} _thread.error

Raised on thread-specific errors.


Changed in version 3.3: This is now a synonym of the built-in @ref{246,,RuntimeError}.

@end deffn

@geindex start_new_thread() (in module _thread)
@anchor{library/_thread thread start_new_thread}@anchor{4b5}
@deffn {Function} _thread.start_new_thread (function, args[, kwargs])

Start a new thread and return its identifier.  The thread executes the
function `function' with the argument list `args' (which must be a tuple).
The optional `kwargs' argument specifies a dictionary of keyword arguments.

When the function returns, the thread silently exits.

When the function terminates with an unhandled exception,
@ref{508,,sys.unraisablehook()} is called to handle the exception. The `object'
attribute of the hook argument is `function'. By default, a stack trace is
printed and then the thread exits (but other threads continue to run).

When the function raises a @ref{f42,,SystemExit} exception, it is silently
ignored.

Raises an @ref{1cb1,,auditing event} @code{_thread.start_new_thread} with arguments @code{function}, @code{args}, @code{kwargs}.


Changed in version 3.8: @ref{508,,sys.unraisablehook()} is now used to handle unhandled exceptions.

@end deffn

@geindex interrupt_main() (in module _thread)
@anchor{library/_thread thread interrupt_main}@anchor{a4a}
@deffn {Function} _thread.interrupt_main (signum=signal.SIGINT, /)

Simulate the effect of a signal arriving in the main thread.
A thread can use this function to interrupt the main thread, though
there is no guarantee that the interruption will happen immediately.

If given, `signum' is the number of the signal to simulate.
If `signum' is not given, @ref{255,,signal.SIGINT} is simulated.

If the given signal isn’t handled by Python (it was set to
@ref{1bf5,,signal.SIG_DFL} or @ref{1bf4,,signal.SIG_IGN}), this function does
nothing.


Changed in version 3.10: The `signum' argument is added to customize the signal number.


@cartouche
@quotation Note 
This does not emit the corresponding signal but schedules a call to
the associated handler (if it exists).
If you want to truly emit the signal, use @ref{1bd3,,signal.raise_signal()}.
@end quotation
@end cartouche
@end deffn

@geindex exit() (in module _thread)
@anchor{library/_thread thread exit}@anchor{3820}
@deffn {Function} _thread.exit ()

Raise the @ref{f42,,SystemExit} exception.  When not caught, this will cause the
thread to exit silently.
@end deffn

@c function:: exit_prog(status)
@c 
@c    Exit all threads and report the value of the integer argument
@c    *status* as the exit status of the entire program.
@c    **Caveat:** code in pending :keyword:`finally` clauses, in this thread
@c    or in other threads, is not executed.

@geindex allocate_lock() (in module _thread)
@anchor{library/_thread thread allocate_lock}@anchor{3821}
@deffn {Function} _thread.allocate_lock ()

Return a new lock object.  Methods of locks are described below.  The lock is
initially unlocked.
@end deffn

@geindex get_ident() (in module _thread)
@anchor{library/_thread thread get_ident}@anchor{3822}
@deffn {Function} _thread.get_ident ()

Return the ‘thread identifier’ of the current thread.  This is a nonzero
integer.  Its value has no direct meaning; it is intended as a magic cookie to
be used e.g. to index a dictionary of thread-specific data.  Thread identifiers
may be recycled when a thread exits and another thread is created.
@end deffn

@geindex get_native_id() (in module _thread)
@anchor{library/_thread thread get_native_id}@anchor{3823}
@deffn {Function} _thread.get_native_id ()

Return the native integral Thread ID of the current thread assigned by the kernel.
This is a non-negative integer.
Its value may be used to uniquely identify this particular thread system-wide
(until the thread terminates, after which the value may be recycled by the OS).

@ref{2181,,Availability}: Windows, FreeBSD, Linux, macOS, OpenBSD, NetBSD, AIX, DragonFlyBSD, GNU/kFreeBSD.


Added in version 3.8.



Changed in version 3.13: Added support for GNU/kFreeBSD.

@end deffn

@geindex stack_size() (in module _thread)
@anchor{library/_thread thread stack_size}@anchor{17cb}
@deffn {Function} _thread.stack_size ([size])

Return the thread stack size used when creating new threads.  The optional
`size' argument specifies the stack size to be used for subsequently created
threads, and must be 0 (use platform or configured default) or a positive
integer value of at least 32,768 (32 KiB). If `size' is not specified,
0 is used.  If changing the thread stack size is
unsupported, a @ref{246,,RuntimeError} is raised.  If the specified stack size is
invalid, a @ref{2ee,,ValueError} is raised and the stack size is unmodified.  32 KiB
is currently the minimum supported stack size value to guarantee sufficient
stack space for the interpreter itself.  Note that some platforms may have
particular restrictions on values for the stack size, such as requiring a
minimum stack size > 32 KiB or requiring allocation in multiples of the system
memory page size - platform documentation should be referred to for more
information (4 KiB pages are common; using multiples of 4096 for the stack size is
the suggested approach in the absence of more specific information).

@ref{2181,,Availability}: Windows, pthreads.

Unix platforms with POSIX threads support.
@end deffn

@geindex TIMEOUT_MAX (in module _thread)
@anchor{library/_thread thread TIMEOUT_MAX}@anchor{3824}
@deffn {Data} _thread.TIMEOUT_MAX

The maximum value allowed for the `timeout' parameter of
@ref{8a9,,Lock.acquire}. Specifying a timeout greater
than this value will raise an @ref{a87,,OverflowError}.


Added in version 3.2.

@end deffn

@geindex LockType (class in _thread)
@anchor{library/_thread thread LockType}@anchor{3825}
@deffn {Class} _thread.LockType

This is the type of lock objects.

Lock objects have the following methods:

@geindex acquire() (_thread.LockType method)
@anchor{library/_thread thread LockType acquire}@anchor{3826}
@deffn {Method} acquire (blocking=True, timeout=-1)

Without any optional argument, this method acquires the lock unconditionally, if
necessary waiting until it is released by another thread (only one thread at a
time can acquire a lock — that’s their reason for existence).

If the `blocking' argument is present, the action depends on its
value: if it is false, the lock is only acquired if it can be acquired
immediately without waiting, while if it is true, the lock is acquired
unconditionally as above.

If the floating-point `timeout' argument is present and positive, it
specifies the maximum wait time in seconds before returning.  A negative
`timeout' argument specifies an unbounded wait.  You cannot specify
a `timeout' if `blocking' is false.

The return value is @code{True} if the lock is acquired successfully,
@code{False} if not.


Changed in version 3.2: The `timeout' parameter is new.



Changed in version 3.2: Lock acquires can now be interrupted by signals on POSIX.



Changed in version 3.14: Lock acquires can now be interrupted by signals on Windows.

@end deffn

@geindex release() (_thread.LockType method)
@anchor{library/_thread thread LockType release}@anchor{3827}
@deffn {Method} release ()

Releases the lock.  The lock must have been acquired earlier, but not
necessarily by the same thread.
@end deffn

@geindex locked() (_thread.LockType method)
@anchor{library/_thread thread LockType locked}@anchor{3828}
@deffn {Method} locked ()

Return the status of the lock: @code{True} if it has been acquired by some thread,
@code{False} if not.
@end deffn

In addition to these methods, lock objects can also be used via the
@ref{187,,with} statement, e.g.:

@example
import _thread

a_lock = _thread.allocate_lock()

with a_lock:
    print("a_lock is locked while this executes")
@end example
@end deffn

`Caveats:'

@geindex module; signal


@itemize *

@item 
Interrupts always go to the main thread (the @ref{bcb,,KeyboardInterrupt}
exception will be received by that thread.)

@item 
Calling @ref{279,,sys.exit()} or raising the @ref{f42,,SystemExit} exception is
equivalent to calling @ref{3820,,_thread.exit()}.

@item 
When the main thread exits, it is system defined whether the other threads
survive.  On most systems, they are killed without executing
@ref{8fa,,try} … @ref{1b1,,finally} clauses or executing object
destructors.
@end itemize

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Networking and Interprocess Communication,Internet Data Handling,Concurrent Execution,The Python Standard Library
@anchor{library/ipc doc}@anchor{3829}@anchor{library/ipc ipc}@anchor{382a}@anchor{library/ipc networking-and-interprocess-communication}@anchor{382b}@anchor{library/ipc translation-repo}@anchor{382c}
@section Networking and Interprocess Communication


The modules described in this chapter provide mechanisms for
networking and inter-processes communication.

Some modules only work for two processes that are on the same machine, e.g.
@ref{cb,,signal} and @ref{94,,mmap}.  Other modules support networking protocols
that two or more processes can use to communicate across machines.

The list of modules described in this chapter is:

@menu
* asyncio — Asynchronous I/O:: 
* socket — Low-level networking interface:: 
* ssl — TLS/SSL wrapper for socket objects:: 
* select — Waiting for I/O completion:: 
* selectors — High-level I/O multiplexing:: 
* signal — Set handlers for asynchronous events:: 
* mmap — Memory-mapped file support:: 

@end menu

@node asyncio — Asynchronous I/O,socket — Low-level networking interface,,Networking and Interprocess Communication
@anchor{library/asyncio doc}@anchor{382d}@anchor{library/asyncio asyncio-asynchronous-i-o}@anchor{382e}@anchor{library/asyncio module-asyncio}@anchor{b}
@subsection @code{asyncio} — Asynchronous I/O


@geindex module; asyncio


__________________________________________________________________


@subsubheading Hello World!



@example
import asyncio

async def main():
    print('Hello ...')
    await asyncio.sleep(1)
    print('... World!')

asyncio.run(main())
@end example

asyncio is a library to write `concurrent' code using
the `async/await' syntax.

asyncio is used as a foundation for multiple Python asynchronous
frameworks that provide high-performance network and web-servers,
database connection libraries, distributed task queues, etc.

asyncio is often a perfect fit for IO-bound and high-level
`structured' network code.


@subsubheading See also



@table @asis

@item @ref{382f,,A Conceptual Overview of asyncio}

Explanation of the fundamentals of asyncio.
@end table


asyncio provides a set of `high-level' APIs to:


@itemize *

@item 
@ref{3830,,run Python coroutines} concurrently and
have full control over their execution;

@item 
perform @ref{3831,,network IO and IPC};

@item 
control @ref{3832,,subprocesses};

@item 
distribute tasks via @ref{3833,,queues};

@item 
@ref{3834,,synchronize} concurrent code;
@end itemize

Additionally, there are `low-level' APIs for
`library and framework developers' to:


@itemize *

@item 
create and manage @ref{f7c,,event loops}, which
provide asynchronous APIs for @ref{3835,,networking},
running @ref{3836,,subprocesses},
handling @ref{3837,,OS signals}, etc;

@item 
implement efficient protocols using
@ref{3838,,transports};

@item 
@ref{3839,,bridge} callback-based libraries and code
with async/await syntax.
@end itemize

@c include for modules that don't work on WASM

@ref{2181,,Availability}: not WASI.

This module does not work or is not available on WebAssembly. See
@ref{1bae,,WebAssembly platforms} for more information.
@anchor{library/asyncio asyncio-cli}@anchor{383a}
@subsubheading asyncio REPL


You can experiment with an @code{asyncio} concurrent context in the @ref{492,,REPL}:

@example
$ python -m asyncio
asyncio REPL ...
Use "await" directly instead of "asyncio.run()".
Type "help", "copyright", "credits" or "license" for more information.
>>> import asyncio
>>> await asyncio.sleep(10, result='hello')
'hello'
@end example

This REPL provides limited compatibility with 
@geindex PYTHON_BASIC_REPL
@geindex environment variable; PYTHON_BASIC_REPL
@ref{1b8,,PYTHON_BASIC_REPL}.
It is recommended that the default REPL is used
for full functionality and the latest features.

Raises an @ref{1cb1,,auditing event} @code{cpython.run_stdin} with no arguments.


Changed in version 3.12.5: (also 3.11.10, 3.10.15, 3.9.20, and 3.8.20)
Emits audit events.



Changed in version 3.13: Uses PyREPL if possible, in which case 
@geindex PYTHONSTARTUP
@geindex environment variable; PYTHONSTARTUP
@ref{1ba,,PYTHONSTARTUP} is
also executed. Emits audit events.


@c We use the "rubric" directive here to avoid creating
@c the "Reference" subsection in the TOC.

@subsubheading Reference


@menu
* Runners:: 
* Coroutines and tasks:: 
* Streams:: 
* Synchronization Primitives:: 
* Subprocesses:: 
* Queues:: 
* Exceptions: Exceptions<16>. 
* Call Graph Introspection:: 
* Event loop:: 
* Futures:: 
* Transports and Protocols:: 
* Policies:: 
* Platform Support:: 
* Extending:: 
* High-level API Index:: 
* Low-level API Index:: 
* Developing with asyncio:: 
* asyncio and free-threaded Python:: 

@end menu

@node Runners,Coroutines and tasks,,asyncio — Asynchronous I/O
@anchor{library/asyncio-runner doc}@anchor{383b}@anchor{library/asyncio-runner runners}@anchor{383c}
@subsubsection Runners


`Source code:' Lib/asyncio/runners.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/asyncio/runners.py}

This section outlines high-level asyncio primitives to run asyncio code.

They are built on top of an @ref{f7c,,event loop} with the aim
to simplify async code usage for common wide-spread scenarios.

@menu
* Running an asyncio Program:: 
* Runner context manager:: 
* Handling Keyboard Interruption:: 

@end menu

@node Running an asyncio Program,Runner context manager,,Runners
@anchor{library/asyncio-runner running-an-asyncio-program}@anchor{383d}
@subsubsection Running an asyncio Program


@geindex run() (in module asyncio)
@anchor{library/asyncio-runner asyncio run}@anchor{2f5}
@deffn {Function} asyncio.run (coro, *, debug=None, loop_factory=None)

Execute `coro' in an asyncio event loop and return the result.

The argument can be any awaitable object.

This function runs the awaitable, taking care of managing the
asyncio event loop, `finalizing asynchronous generators', and
closing the executor.

This function cannot be called when another asyncio event loop is
running in the same thread.

If `debug' is @code{True}, the event loop will be run in debug mode. @code{False} disables
debug mode explicitly. @code{None} is used to respect the global
@ref{217d,,Debug Mode} settings.

If `loop_factory' is not @code{None}, it is used to create a new event loop;
otherwise @ref{383e,,asyncio.new_event_loop()} is used. The loop is closed at the end.
This function should be used as a main entry point for asyncio programs,
and should ideally only be called once. It is recommended to use
`loop_factory' to configure the event loop instead of policies.
Passing @ref{1aad,,asyncio.EventLoop} allows running asyncio without the
policy system.

The executor is given a timeout duration of 5 minutes to shutdown.
If the executor hasn’t finished within that duration, a warning is
emitted and the executor is closed.

Example:

@example
async def main():
    await asyncio.sleep(1)
    print('hello')

asyncio.run(main())
@end example


Added in version 3.7.



Changed in version 3.9: Updated to use @ref{aea,,loop.shutdown_default_executor()}.



Changed in version 3.10: `debug' is @code{None} by default to respect the global debug mode settings.



Changed in version 3.12: Added `loop_factory' parameter.



Changed in version 3.14: `coro' can be any awaitable object.


@cartouche
@quotation Note 
The @code{asyncio} policy system is deprecated and will be removed
in Python 3.16; from there on, an explicit `loop_factory' is needed
to configure the event loop.
@end quotation
@end cartouche
@end deffn

@node Runner context manager,Handling Keyboard Interruption,Running an asyncio Program,Runners
@anchor{library/asyncio-runner runner-context-manager}@anchor{383f}
@subsubsection Runner context manager


@geindex Runner (class in asyncio)
@anchor{library/asyncio-runner asyncio Runner}@anchor{2f7}
@deffn {Class} asyncio.Runner (*, debug=None, loop_factory=None)

A context manager that simplifies `multiple' async function calls in the same
context.

Sometimes several top-level async functions should be called in the same @ref{f7c,,event loop} and @ref{178,,contextvars.Context}.

If `debug' is @code{True}, the event loop will be run in debug mode. @code{False} disables
debug mode explicitly. @code{None} is used to respect the global
@ref{217d,,Debug Mode} settings.

`loop_factory' could be used for overriding the loop creation.
It is the responsibility of the `loop_factory' to set the created loop as the
current one. By default @ref{383e,,asyncio.new_event_loop()} is used and set as
current event loop with @ref{1b99,,asyncio.set_event_loop()} if `loop_factory' is @code{None}.

Basically, @ref{2f5,,asyncio.run()} example can be rewritten with the runner usage:

@example
async def main():
    await asyncio.sleep(1)
    print('hello')

with asyncio.Runner() as runner:
    runner.run(main())
@end example


Added in version 3.11.


@geindex run() (asyncio.Runner method)
@anchor{library/asyncio-runner asyncio Runner run}@anchor{1991}
@deffn {Method} run (coro, *, context=None)

Execute `coro' in the embedded event loop.

The argument can be any awaitable object.

If the argument is a coroutine, it is wrapped in a Task.

An optional keyword-only `context' argument allows specifying a
custom @ref{178,,contextvars.Context} for the code to run in.
The runner’s default context is used if context is @code{None}.

Returns the awaitable’s result or raises an exception.

This function cannot be called when another asyncio event loop is
running in the same thread.


Changed in version 3.14: `coro' can be any awaitable object.

@end deffn

@geindex close() (asyncio.Runner method)
@anchor{library/asyncio-runner asyncio Runner close}@anchor{3840}
@deffn {Method} close ()

Close the runner.

Finalize asynchronous generators, shutdown default executor, close the event loop
and release embedded @ref{178,,contextvars.Context}.
@end deffn

@geindex get_loop() (asyncio.Runner method)
@anchor{library/asyncio-runner asyncio Runner get_loop}@anchor{3841}
@deffn {Method} get_loop ()

Return the event loop associated with the runner instance.
@end deffn

@cartouche
@quotation Note 
@code{Runner} uses the lazy initialization strategy, its constructor doesn’t
initialize underlying low-level structures.

Embedded `loop' and `context' are created at the @ref{187,,with} body entering
or the first call of @ref{2f5,,run()} or @ref{3841,,get_loop()}.
@end quotation
@end cartouche
@end deffn

@node Handling Keyboard Interruption,,Runner context manager,Runners
@anchor{library/asyncio-runner handling-keyboard-interruption}@anchor{3842}
@subsubsection Handling Keyboard Interruption



Added in version 3.11.


When @ref{255,,signal.SIGINT} is raised by @code{Ctrl}-@code{C}, @ref{bcb,,KeyboardInterrupt}
exception is raised in the main thread by default. However this doesn’t work with
@ref{b,,asyncio} because it can interrupt asyncio internals and can hang the program from
exiting.

To mitigate this issue, @ref{b,,asyncio} handles @ref{255,,signal.SIGINT} as follows:


@enumerate 

@item 
@ref{1991,,asyncio.Runner.run()} installs a custom @ref{255,,signal.SIGINT} handler before
any user code is executed and removes it when exiting from the function.

@item 
The @ref{2f7,,Runner} creates the main task for the passed coroutine for its
execution.

@item 
When @ref{255,,signal.SIGINT} is raised by @code{Ctrl}-@code{C}, the custom signal handler
cancels the main task by calling @ref{4d4,,asyncio.Task.cancel()} which raises
@ref{4d5,,asyncio.CancelledError} inside the main task.  This causes the Python stack
to unwind, @code{try/except} and @code{try/finally} blocks can be used for resource
cleanup.  After the main task is cancelled, @ref{1991,,asyncio.Runner.run()} raises
@ref{bcb,,KeyboardInterrupt}.

@item 
A user could write a tight loop which cannot be interrupted by
@ref{4d4,,asyncio.Task.cancel()}, in which case the second following @code{Ctrl}-@code{C}
immediately raises the @ref{bcb,,KeyboardInterrupt} without cancelling the main task.
@end enumerate

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Coroutines and tasks,Streams,Runners,asyncio — Asynchronous I/O
@anchor{library/asyncio-task doc}@anchor{3843}@anchor{library/asyncio-task coroutines-and-tasks}@anchor{3844}@anchor{library/asyncio-task translation-repo}@anchor{3845}
@subsubsection Coroutines and tasks


This section outlines high-level asyncio APIs to work with coroutines
and Tasks.

@menu
* Coroutines: Coroutines<3>. 
* Awaitables:: 
* Creating tasks:: 
* Task cancellation:: 
* Task groups:: 
* Sleeping:: 
* Running tasks concurrently:: 
* Eager task factory:: 
* Shielding from cancellation:: 
* Timeouts:: 
* Waiting primitives:: 
* Running in threads:: 
* Scheduling from other threads:: 
* Introspection:: 
* Task object:: 

@end menu

@node Coroutines<3>,Awaitables,,Coroutines and tasks
@anchor{library/asyncio-task coroutine}@anchor{3830}@anchor{library/asyncio-task coroutines}@anchor{3846}
@subsubsection Coroutines


`Source code:' Lib/asyncio/coroutines.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/asyncio/coroutines.py}


__________________________________________________________________


@ref{6ba,,Coroutines} declared with the async/await syntax is the
preferred way of writing asyncio applications.  For example, the following
snippet of code prints “hello”, waits 1 second,
and then prints “world”:

@example
>>> import asyncio

>>> async def main():
...     print('hello')
...     await asyncio.sleep(1)
...     print('world')

>>> asyncio.run(main())
hello
world
@end example

Note that simply calling a coroutine will not schedule it to
be executed:

@example
>>> main()
<coroutine object main at 0x1053bb7c8>
@end example

To actually run a coroutine, asyncio provides the following mechanisms:


@itemize *

@item 
The @ref{2f5,,asyncio.run()} function to run the top-level
entry point “main()” function (see the above example.)

@item 
Awaiting on a coroutine.  The following snippet of code will
print “hello” after waiting for 1 second, and then print “world”
after waiting for `another' 2 seconds:

@example
import asyncio
import time

async def say_after(delay, what):
    await asyncio.sleep(delay)
    print(what)

async def main():
    print(f"started at @{time.strftime('%X')@}")

    await say_after(1, 'hello')
    await say_after(2, 'world')

    print(f"finished at @{time.strftime('%X')@}")

asyncio.run(main())
@end example

Expected output:

@example
started at 17:13:52
hello
world
finished at 17:13:55
@end example

@item 
The @ref{1cb,,asyncio.create_task()} function to run coroutines
concurrently as asyncio @ref{1c9,,Tasks}.

Let’s modify the above example and run two @code{say_after} coroutines
`concurrently':

@example
async def main():
    task1 = asyncio.create_task(
        say_after(1, 'hello'))

    task2 = asyncio.create_task(
        say_after(2, 'world'))

    print(f"started at @{time.strftime('%X')@}")

    # Wait until both tasks are completed (should take
    # around 2 seconds.)
    await task1
    await task2

    print(f"finished at @{time.strftime('%X')@}")
@end example

Note that expected output now shows that the snippet runs
1 second faster than before:

@example
started at 17:14:32
hello
world
finished at 17:14:34
@end example

@item 
The @ref{4d2,,asyncio.TaskGroup} class provides a more modern
alternative to @ref{1cb,,create_task()}.
Using this API, the last example becomes:

@example
async def main():
    async with asyncio.TaskGroup() as tg:
        task1 = tg.create_task(
            say_after(1, 'hello'))

        task2 = tg.create_task(
            say_after(2, 'world'))

        print(f"started at @{time.strftime('%X')@}")

    # The await is implicit when the context manager exits.

    print(f"finished at @{time.strftime('%X')@}")
@end example

The timing and output should be the same as for the previous version.


Added in version 3.11: @ref{4d2,,asyncio.TaskGroup}.

@end itemize

@node Awaitables,Creating tasks,Coroutines<3>,Coroutines and tasks
@anchor{library/asyncio-task asyncio-awaitables}@anchor{3847}@anchor{library/asyncio-task awaitables}@anchor{3848}
@subsubsection Awaitables


We say that an object is an `awaitable' object if it can be used
in an @ref{18e,,await} expression.  Many asyncio APIs are designed to
accept awaitables.

There are three main types of `awaitable' objects:
`coroutines', `Tasks', and `Futures'.

@subsubheading Coroutines


Python coroutines are `awaitables' and therefore can be awaited from
other coroutines:

@example
import asyncio

async def nested():
    return 42

async def main():
    # Nothing happens if we just call "nested()".
    # A coroutine object is created but not awaited,
    # so it *won't run at all*.
    nested()  # will raise a "RuntimeWarning".

    # Let's do it differently now and await it:
    print(await nested())  # will print "42".

asyncio.run(main())
@end example

@cartouche
@quotation Important 
In this documentation the term “coroutine” can be used for
two closely related concepts:


@itemize *

@item 
a `coroutine function': an @ref{7ee,,async def} function;

@item 
a `coroutine object': an object returned by calling a
`coroutine function'.
@end itemize
@end quotation
@end cartouche

@subsubheading Tasks


`Tasks' are used to schedule coroutines `concurrently'.

When a coroutine is wrapped into a `Task' with functions like
@ref{1cb,,asyncio.create_task()} the coroutine is automatically
scheduled to run soon:

@example
import asyncio

async def nested():
    return 42

async def main():
    # Schedule nested() to run soon concurrently
    # with "main()".
    task = asyncio.create_task(nested())

    # "task" can now be used to cancel "nested()", or
    # can simply be awaited to wait until it is complete:
    await task

asyncio.run(main())
@end example

@subsubheading Futures


A @ref{dcc,,Future} is a special `low-level' awaitable object that
represents an `eventual result' of an asynchronous operation.

When a Future object is `awaited' it means that the coroutine will
wait until the Future is resolved in some other place.

Future objects in asyncio are needed to allow callback-based code
to be used with async/await.

Normally `there is no need' to create Future objects at the
application level code.

Future objects, sometimes exposed by libraries and some asyncio
APIs, can be awaited:

@example
async def main():
    await function_that_returns_a_future_object()

    # this is also valid:
    await asyncio.gather(
        function_that_returns_a_future_object(),
        some_python_coroutine()
    )
@end example

A good example of a low-level function that returns a Future object
is @ref{aec,,loop.run_in_executor()}.

@node Creating tasks,Task cancellation,Awaitables,Coroutines and tasks
@anchor{library/asyncio-task creating-tasks}@anchor{3849}
@subsubsection Creating tasks


`Source code:' Lib/asyncio/tasks.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/asyncio/tasks.py}


__________________________________________________________________


@geindex create_task() (in module asyncio)
@anchor{library/asyncio-task asyncio create_task}@anchor{1cb}
@deffn {Function} asyncio.create_task (coro, *, name=None, context=None, eager_start=None, **kwargs)

Wrap the `coro' @ref{3830,,coroutine} into a @ref{1c9,,Task}
and schedule its execution.  Return the Task object.

The full function signature is largely the same as that of the
@ref{1c9,,Task} constructor (or factory) - all of the keyword arguments to
this function are passed through to that interface.

An optional keyword-only `context' argument allows specifying a
custom @ref{178,,contextvars.Context} for the `coro' to run in.
The current context copy is created when no `context' is provided.

An optional keyword-only `eager_start' argument allows specifying
if the task should execute eagerly during the call to create_task,
or be scheduled later. If `eager_start' is not passed the mode set
by @ref{1ca,,loop.set_task_factory()} will be used.

The task is executed in the loop returned by @ref{d07,,get_running_loop()},
@ref{246,,RuntimeError} is raised if there is no running loop in
current thread.

@cartouche
@quotation Note 
@ref{1cd,,asyncio.TaskGroup.create_task()} is a new alternative
leveraging structural concurrency; it allows for waiting
for a group of related tasks with strong safety guarantees.
@end quotation
@end cartouche

@cartouche
@quotation Important 
Save a reference to the result of this function, to avoid
a task disappearing mid-execution. The event loop only keeps
weak references to tasks. A task that isn’t referenced elsewhere
may get garbage collected at any time, even before it’s done.
For reliable “fire-and-forget” background tasks, gather them in
a collection:

@example
background_tasks = set()

for i in range(10):
    task = asyncio.create_task(some_coro(param=i))

    # Add task to the set. This creates a strong reference.
    background_tasks.add(task)

    # To prevent keeping references to finished tasks forever,
    # make each task remove its own reference from the set after
    # completion:
    task.add_done_callback(background_tasks.discard)
@end example
@end quotation
@end cartouche


Added in version 3.7.



Changed in version 3.8: Added the `name' parameter.



Changed in version 3.11: Added the `context' parameter.



Changed in version 3.14: Added the `eager_start' parameter by passing on all `kwargs'.

@end deffn

@node Task cancellation,Task groups,Creating tasks,Coroutines and tasks
@anchor{library/asyncio-task task-cancellation}@anchor{384a}
@subsubsection Task cancellation


Tasks can easily and safely be cancelled.
When a task is cancelled, @ref{4d5,,asyncio.CancelledError} will be raised
in the task at the next opportunity.

It is recommended that coroutines use @code{try/finally} blocks to robustly
perform clean-up logic. In case @ref{4d5,,asyncio.CancelledError}
is explicitly caught, it should generally be propagated when
clean-up is complete. @code{asyncio.CancelledError} directly subclasses
@ref{7d8,,BaseException} so most code will not need to be aware of it.

The asyncio components that enable structured concurrency, like
@ref{4d2,,asyncio.TaskGroup} and @ref{815,,asyncio.timeout()},
are implemented using cancellation internally and might misbehave if
a coroutine swallows @ref{4d5,,asyncio.CancelledError}. Similarly, user code
should not generally call @ref{4d7,,uncancel}.
However, in cases when suppressing @code{asyncio.CancelledError} is
truly desired, it is necessary to also call @code{uncancel()} to completely
remove the cancellation state.

@node Task groups,Sleeping,Task cancellation,Coroutines and tasks
@anchor{library/asyncio-task task-groups}@anchor{384b}@anchor{library/asyncio-task taskgroups}@anchor{384c}
@subsubsection Task groups


Task groups combine a task creation API with a convenient
and reliable way to wait for all tasks in the group to finish.

@geindex TaskGroup (class in asyncio)
@anchor{library/asyncio-task asyncio TaskGroup}@anchor{4d2}
@deffn {Class} asyncio.TaskGroup

An @ref{813,,asynchronous context manager}
holding a group of tasks.
Tasks can be added to the group using @ref{1cb,,create_task()}.
All tasks are awaited when the context manager exits.


Added in version 3.11.


@geindex create_task() (asyncio.TaskGroup method)
@anchor{library/asyncio-task asyncio TaskGroup create_task}@anchor{1cd}
@deffn {Method} create_task (coro, *, name=None, context=None, eager_start=None, **kwargs)

Create a task in this task group.
The signature matches that of @ref{1cb,,asyncio.create_task()}.
If the task group is inactive (e.g. not yet entered,
already finished, or in the process of shutting down),
we will close the given @code{coro}.


Changed in version 3.13: Close the given coroutine if the task group is not active.



Changed in version 3.14: Passes on all `kwargs' to @ref{1cc,,loop.create_task()}

@end deffn
@end deffn

Example:

@example
async def main():
    async with asyncio.TaskGroup() as tg:
        task1 = tg.create_task(some_coro(...))
        task2 = tg.create_task(another_coro(...))
    print(f"Both tasks have completed now: @{task1.result()@}, @{task2.result()@}")
@end example

The @code{async with} statement will wait for all tasks in the group to finish.
While waiting, new tasks may still be added to the group
(for example, by passing @code{tg} into one of the coroutines
and calling @code{tg.create_task()} in that coroutine).
Once the last task has finished and the @code{async with} block is exited,
no new tasks may be added to the group.

The first time any of the tasks belonging to the group fails
with an exception other than @ref{4d5,,asyncio.CancelledError},
the remaining tasks in the group are cancelled.
No further tasks can then be added to the group.
At this point, if the body of the @code{async with} statement is still active
(i.e., @ref{19e4,,__aexit__()} hasn’t been called yet),
the task directly containing the @code{async with} statement is also cancelled.
The resulting @code{asyncio.CancelledError} will interrupt an @code{await},
but it will not bubble out of the containing @code{async with} statement.

Once all tasks have finished, if any tasks have failed
with an exception other than @ref{4d5,,asyncio.CancelledError},
those exceptions are combined in an
@ref{4d3,,ExceptionGroup} or @ref{566,,BaseExceptionGroup}
(as appropriate; see their documentation)
which is then raised.

Two base exceptions are treated specially:
If any task fails with @ref{bcb,,KeyboardInterrupt} or @ref{f42,,SystemExit},
the task group still cancels the remaining tasks and waits for them,
but then the initial @code{KeyboardInterrupt} or @code{SystemExit}
is re-raised instead of @ref{4d3,,ExceptionGroup} or @ref{566,,BaseExceptionGroup}.

If the body of the @code{async with} statement exits with an exception
(so @ref{19e4,,__aexit__()} is called with an exception set),
this is treated the same as if one of the tasks failed:
the remaining tasks are cancelled and then waited for,
and non-cancellation exceptions are grouped into an
exception group and raised.
The exception passed into @code{__aexit__()},
unless it is @ref{4d5,,asyncio.CancelledError},
is also included in the exception group.
The same special case is made for
@ref{bcb,,KeyboardInterrupt} and @ref{f42,,SystemExit} as in the previous paragraph.

Task groups are careful not to mix up the internal cancellation used to
“wake up” their @ref{19e4,,__aexit__()} with cancellation requests
for the task in which they are running made by other parties.
In particular, when one task group is syntactically nested in another,
and both experience an exception in one of their child tasks simultaneously,
the inner task group will process its exceptions, and then the outer task group
will receive another cancellation and process its own exceptions.

In the case where a task group is cancelled externally and also must
raise an @ref{4d3,,ExceptionGroup}, it will call the parent task’s
@ref{4d4,,cancel()} method. This ensures that a
@ref{4d5,,asyncio.CancelledError} will be raised at the next
@ref{18e,,await}, so the cancellation is not lost.

Task groups preserve the cancellation count
reported by @ref{4d6,,asyncio.Task.cancelling()}.


Changed in version 3.13: Improved handling of simultaneous internal and external cancellations
and correct preservation of cancellation counts.


@menu
* Terminating a task group:: 

@end menu

@node Terminating a task group,,,Task groups
@anchor{library/asyncio-task terminating-a-task-group}@anchor{384d}
@subsubsection Terminating a task group


While terminating a task group is not natively supported by the standard
library, termination can be achieved by adding an exception-raising task
to the task group and ignoring the raised exception:

@example
import asyncio
from asyncio import TaskGroup

class TerminateTaskGroup(Exception):
    """Exception raised to terminate a task group."""

async def force_terminate_task_group():
    """Used to force termination of a task group."""
    raise TerminateTaskGroup()

async def job(task_id, sleep_time):
    print(f'Task @{task_id@}: start')
    await asyncio.sleep(sleep_time)
    print(f'Task @{task_id@}: done')

async def main():
    try:
        async with TaskGroup() as group:
            # spawn some tasks
            group.create_task(job(1, 0.5))
            group.create_task(job(2, 1.5))
            # sleep for 1 second
            await asyncio.sleep(1)
            # add an exception-raising task to force the group to terminate
            group.create_task(force_terminate_task_group())
    except* TerminateTaskGroup:
        pass

asyncio.run(main())
@end example

Expected output:

@example
Task 1: start
Task 2: start
Task 1: done
@end example

@node Sleeping,Running tasks concurrently,Task groups,Coroutines and tasks
@anchor{library/asyncio-task sleeping}@anchor{384e}
@subsubsection Sleeping


@geindex sleep() (in module asyncio)
@anchor{library/asyncio-task asyncio sleep}@anchor{c6a}
@deffn {Function} async asyncio.sleep (delay, result=None)

Block for `delay' seconds.

If `result' is provided, it is returned to the caller
when the coroutine completes.

@code{sleep()} always suspends the current task, allowing other tasks
to run.

Setting the delay to 0 provides an optimized path to allow other
tasks to run. This can be used by long-running functions to avoid
blocking the event loop for the full duration of the function call.
@anchor{library/asyncio-task asyncio-example-sleep}@anchor{384f}
Example of coroutine displaying the current date every second
for 5 seconds:

@example
import asyncio
import datetime as dt

async def display_date():
    loop = asyncio.get_running_loop()
    end_time = loop.time() + 5.0
    while True:
        print(dt.datetime.now())
        if (loop.time() + 1.0) >= end_time:
            break
        await asyncio.sleep(1)

asyncio.run(display_date())
@end example


Changed in version 3.10: Removed the `loop' parameter.



Changed in version 3.13: Raises @ref{2ee,,ValueError} if `delay' is @ref{875,,nan}.

@end deffn

@node Running tasks concurrently,Eager task factory,Sleeping,Coroutines and tasks
@anchor{library/asyncio-task running-tasks-concurrently}@anchor{3850}
@subsubsection Running tasks concurrently


@geindex gather() (in module asyncio)
@anchor{library/asyncio-task asyncio gather}@anchor{814}
@deffn {Function} awaitable asyncio.gather (*aws, return_exceptions=False)

Run @ref{3847,,awaitable objects} in the `aws'
sequence `concurrently'.

If any awaitable in `aws' is a coroutine, it is automatically
scheduled as a Task.

If all awaitables are completed successfully, the result is an
aggregate list of returned values.  The order of result values
corresponds to the order of awaitables in `aws'.

If `return_exceptions' is @code{False} (default), the first
raised exception is immediately propagated to the task that
awaits on @code{gather()}.  Other awaitables in the `aws' sequence
`won’t be cancelled' and will continue to run.

If `return_exceptions' is @code{True}, exceptions are treated the
same as successful results, and aggregated in the result list.

If @code{gather()} is `cancelled', all submitted awaitables
(that have not completed yet) are also `cancelled'.

If any Task or Future from the `aws' sequence is `cancelled', it is
treated as if it raised @ref{4d5,,CancelledError} – the @code{gather()}
call is `not' cancelled in this case.  This is to prevent the
cancellation of one submitted Task/Future to cause other
Tasks/Futures to be cancelled.

@cartouche
@quotation Note 
A new alternative to create and run tasks concurrently and
wait for their completion is @ref{4d2,,asyncio.TaskGroup}. `TaskGroup'
provides stronger safety guarantees than `gather' for scheduling a nesting of subtasks:
if a task (or a subtask, a task scheduled by a task)
raises an exception, `TaskGroup' will, while `gather' will not,
cancel the remaining scheduled tasks.
@end quotation
@end cartouche
@anchor{library/asyncio-task asyncio-example-gather}@anchor{3851}
Example:

@example
import asyncio

async def factorial(name, number):
    f = 1
    for i in range(2, number + 1):
        print(f"Task @{name@}: Compute factorial(@{number@}), currently i=@{i@}...")
        await asyncio.sleep(1)
        f *= i
    print(f"Task @{name@}: factorial(@{number@}) = @{f@}")
    return f

async def main():
    # Schedule three calls *concurrently*:
    L = await asyncio.gather(
        factorial("A", 2),
        factorial("B", 3),
        factorial("C", 4),
    )
    print(L)

asyncio.run(main())

# Expected output:
#
#     Task A: Compute factorial(2), currently i=2...
#     Task B: Compute factorial(3), currently i=2...
#     Task C: Compute factorial(4), currently i=2...
#     Task A: factorial(2) = 2
#     Task B: Compute factorial(3), currently i=3...
#     Task C: Compute factorial(4), currently i=3...
#     Task B: factorial(3) = 6
#     Task C: Compute factorial(4), currently i=4...
#     Task C: factorial(4) = 24
#     [2, 6, 24]
@end example

@cartouche
@quotation Note 
If `return_exceptions' is false, cancelling gather() after it
has been marked done won’t cancel any submitted awaitables.
For instance, gather can be marked done after propagating an
exception to the caller, therefore, calling @code{gather.cancel()}
after catching an exception (raised by one of the awaitables) from
gather won’t cancel any other awaitables.
@end quotation
@end cartouche


Changed in version 3.7: If the `gather' itself is cancelled, the cancellation is
propagated regardless of `return_exceptions'.



Changed in version 3.10: Removed the `loop' parameter.



Deprecated since version 3.10: Deprecation warning is emitted if no positional arguments are provided
or not all positional arguments are Future-like objects
and there is no running event loop.

@end deffn

@node Eager task factory,Shielding from cancellation,Running tasks concurrently,Coroutines and tasks
@anchor{library/asyncio-task eager-task-factory}@anchor{3852}@anchor{library/asyncio-task id1}@anchor{3853}
@subsubsection Eager task factory


@geindex eager_task_factory() (in module asyncio)
@anchor{library/asyncio-task asyncio eager_task_factory}@anchor{6a3}
@deffn {Function} asyncio.eager_task_factory (loop, coro, *, name=None, context=None)

A task factory for eager task execution.

When using this factory (via @ref{1ca,,loop.set_task_factory(asyncio.eager_task_factory)}),
coroutines begin execution synchronously during @ref{1c9,,Task} construction.
Tasks are only scheduled on the event loop if they block.
This can be a performance improvement as the overhead of loop scheduling
is avoided for coroutines that complete synchronously.

A common example where this is beneficial is coroutines which employ
caching or memoization to avoid actual I/O when possible.

@cartouche
@quotation Note 
Immediate execution of the coroutine is a semantic change.
If the coroutine returns or raises, the task is never scheduled
to the event loop. If the coroutine execution blocks, the task is
scheduled to the event loop. This change may introduce behavior
changes to existing applications. For example,
the application’s task execution order is likely to change.
@end quotation
@end cartouche


Added in version 3.12.

@end deffn

@geindex create_eager_task_factory() (in module asyncio)
@anchor{library/asyncio-task asyncio create_eager_task_factory}@anchor{6a4}
@deffn {Function} asyncio.create_eager_task_factory (custom_task_constructor)

Create an eager task factory, similar to @ref{6a3,,eager_task_factory()},
using the provided `custom_task_constructor' when creating a new task instead
of the default @ref{1c9,,Task}.

`custom_task_constructor' must be a `callable' with the signature matching
the signature of @ref{1c9,,Task.__init__}.
The callable must return a @ref{1c9,,asyncio.Task}-compatible object.

This function returns a `callable' intended to be used as a task factory of an
event loop via @ref{1ca,,loop.set_task_factory(factory)}).


Added in version 3.12.

@end deffn

@node Shielding from cancellation,Timeouts,Eager task factory,Coroutines and tasks
@anchor{library/asyncio-task shielding-from-cancellation}@anchor{3854}
@subsubsection Shielding from cancellation


@geindex shield() (in module asyncio)
@anchor{library/asyncio-task asyncio shield}@anchor{c6b}
@deffn {Function} awaitable asyncio.shield (aw)

Protect an @ref{3847,,awaitable object}
from being @ref{4d4,,cancelled}.

If `aw' is a coroutine it is automatically scheduled as a Task.

The statement:

@example
task = asyncio.create_task(something())
res = await shield(task)
@end example

is equivalent to:

@example
res = await something()
@end example

`except' that if the coroutine containing it is cancelled, the
Task running in @code{something()} is not cancelled.  From the point
of view of @code{something()}, the cancellation did not happen.
Although its caller is still cancelled, so the “await” expression
still raises a @ref{4d5,,CancelledError}.

If @code{something()} is cancelled by other means (i.e. from within
itself) that would also cancel @code{shield()}.

If it is desired to completely ignore cancellation (not recommended)
the @code{shield()} function should be combined with a try/except
clause, as follows:

@example
task = asyncio.create_task(something())
try:
    res = await shield(task)
except CancelledError:
    res = None
@end example

@cartouche
@quotation Important 
Save a reference to tasks passed to this function, to avoid
a task disappearing mid-execution. The event loop only keeps
weak references to tasks. A task that isn’t referenced elsewhere
may get garbage collected at any time, even before it’s done.
@end quotation
@end cartouche


Changed in version 3.10: Removed the `loop' parameter.



Deprecated since version 3.10: Deprecation warning is emitted if `aw' is not Future-like object
and there is no running event loop.

@end deffn

@node Timeouts,Waiting primitives,Shielding from cancellation,Coroutines and tasks
@anchor{library/asyncio-task timeouts}@anchor{3855}
@subsubsection Timeouts


@geindex timeout() (in module asyncio)
@anchor{library/asyncio-task asyncio timeout}@anchor{815}
@deffn {Function} asyncio.timeout (delay)

Return an @ref{813,,asynchronous context manager}
that can be used to limit the amount of time spent waiting on
something.

`delay' can either be @code{None}, or a float/int number of
seconds to wait. If `delay' is @code{None}, no time limit will
be applied; this can be useful if the delay is unknown when
the context manager is created.

In either case, the context manager can be rescheduled after
creation using @ref{3856,,Timeout.reschedule()}.

Example:

@example
async def main():
    async with asyncio.timeout(10):
        await long_running_task()
@end example

If @code{long_running_task} takes more than 10 seconds to complete,
the context manager will cancel the current task and handle
the resulting @ref{4d5,,asyncio.CancelledError} internally, transforming it
into a @ref{a3c,,TimeoutError} which can be caught and handled.

@cartouche
@quotation Note 
The @ref{815,,asyncio.timeout()} context manager is what transforms
the @ref{4d5,,asyncio.CancelledError} into a @ref{a3c,,TimeoutError},
which means the @code{TimeoutError} can only be caught
`outside' of the context manager.
@end quotation
@end cartouche

Example of catching @ref{a3c,,TimeoutError}:

@example
async def main():
    try:
        async with asyncio.timeout(10):
            await long_running_task()
    except TimeoutError:
        print("The long operation timed out, but we've handled it.")

    print("This statement will run regardless.")
@end example

The context manager produced by @ref{815,,asyncio.timeout()} can be
rescheduled to a different deadline and inspected.

@geindex Timeout (class in asyncio)
@anchor{library/asyncio-task asyncio Timeout}@anchor{1a86}
@deffn {Class} asyncio.Timeout (when)

An @ref{813,,asynchronous context manager}
for cancelling overdue coroutines.

Prefer using @ref{815,,asyncio.timeout()} or @ref{1bf6,,asyncio.timeout_at()}
rather than instantiating @code{Timeout} directly.

@code{when} should be an absolute time at which the context should time out,
as measured by the event loop’s clock:


@itemize -

@item 
If @code{when} is @code{None}, the timeout will never trigger.

@item 
If @code{when < loop.time()}, the timeout will trigger on the next
iteration of the event loop.
@end itemize

@quotation

@geindex when() (asyncio.Timeout method)
@anchor{library/asyncio-task asyncio Timeout when}@anchor{3857}
@deffn {Method} when () -> float | None

Return the current deadline, or @code{None} if the current
deadline is not set.
@end deffn

@geindex reschedule() (asyncio.Timeout method)
@anchor{library/asyncio-task asyncio Timeout reschedule}@anchor{3856}
@deffn {Method} reschedule (when: float | None)

Reschedule the timeout.
@end deffn

@geindex expired() (asyncio.Timeout method)
@anchor{library/asyncio-task asyncio Timeout expired}@anchor{3858}
@deffn {Method} expired () -> bool

Return whether the context manager has exceeded its deadline
(expired).
@end deffn
@end quotation
@end deffn

Example:

@example
async def main():
    try:
        # We do not know the timeout when starting, so we pass `@w{`}None`@w{`}.
        async with asyncio.timeout(None) as cm:
            # We know the timeout now, so we reschedule it.
            new_deadline = get_running_loop().time() + 10
            cm.reschedule(new_deadline)

            await long_running_task()
    except TimeoutError:
        pass

    if cm.expired():
        print("Looks like we haven't finished on time.")
@end example

Timeout context managers can be safely nested.


Added in version 3.11.

@end deffn

@geindex timeout_at() (in module asyncio)
@anchor{library/asyncio-task asyncio timeout_at}@anchor{1bf6}
@deffn {Function} asyncio.timeout_at (when)

Similar to @ref{815,,asyncio.timeout()}, except `when' is the absolute time
to stop waiting, or @code{None}.

Example:

@example
async def main():
    loop = get_running_loop()
    deadline = loop.time() + 20
    try:
        async with asyncio.timeout_at(deadline):
            await long_running_task()
    except TimeoutError:
        print("The long operation timed out, but we've handled it.")

    print("This statement will run regardless.")
@end example


Added in version 3.11.

@end deffn

@geindex wait_for() (in module asyncio)
@anchor{library/asyncio-task asyncio wait_for}@anchor{816}
@deffn {Function} async asyncio.wait_for (aw, timeout)

Wait for the `aw' @ref{3847,,awaitable}
to complete with a timeout.

If `aw' is a coroutine it is automatically scheduled as a Task.

`timeout' can either be @code{None} or a float or int number of seconds
to wait for.  If `timeout' is @code{None}, block until the future
completes.

If a timeout occurs, it cancels the task and raises
@ref{a3c,,TimeoutError}.

To avoid the task @ref{4d4,,cancellation},
wrap it in @ref{c6b,,shield()}.

The function will wait until the future is actually cancelled,
so the total wait time may exceed the `timeout'. If an exception
happens during cancellation, it is propagated.

If the wait is cancelled, the future `aw' is also cancelled.
@anchor{library/asyncio-task asyncio-example-waitfor}@anchor{3859}
Example:

@example
async def eternity():
    # Sleep for one hour
    await asyncio.sleep(3600)
    print('yay!')

async def main():
    # Wait for at most 1 second
    try:
        await asyncio.wait_for(eternity(), timeout=1.0)
    except TimeoutError:
        print('timeout!')

asyncio.run(main())

# Expected output:
#
#     timeout!
@end example


Changed in version 3.7: When `aw' is cancelled due to a timeout, @code{wait_for} waits
for `aw' to be cancelled.  Previously, it raised
@ref{a3c,,TimeoutError} immediately.



Changed in version 3.10: Removed the `loop' parameter.



Changed in version 3.11: Raises @ref{a3c,,TimeoutError} instead of @ref{1afc,,asyncio.TimeoutError}.

@end deffn

@node Waiting primitives,Running in threads,Timeouts,Coroutines and tasks
@anchor{library/asyncio-task waiting-primitives}@anchor{385a}
@subsubsection Waiting primitives


@geindex wait() (in module asyncio)
@anchor{library/asyncio-task asyncio wait}@anchor{6a8}
@deffn {Function} async asyncio.wait (aws, *, timeout=None, return_when=ALL_COMPLETED)

Run @ref{dcc,,Future} and @ref{1c9,,Task} instances in the `aws'
iterable concurrently and block until the condition specified
by `return_when'.

The `aws' iterable must not be empty.

Returns two sets of Tasks/Futures: @code{(done, pending)}.

Usage:

@example
done, pending = await asyncio.wait(aws)
@end example

`timeout' (a float or int), if specified, can be used to control
the maximum number of seconds to wait before returning.

Note that this function does not raise @ref{a3c,,TimeoutError}.
Futures or Tasks that aren’t done when the timeout occurs are simply
returned in the second set.

`return_when' indicates when this function should return.  It must
be one of the following constants:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Constant

@tab

Description

@item

@geindex FIRST_COMPLETED (in module asyncio)
@anchor{library/asyncio-task asyncio FIRST_COMPLETED}@anchor{385b}
@deffn {Data} asyncio.FIRST_COMPLETED
@end deffn

@tab

The function will return when any future finishes or is cancelled.

@item

@geindex FIRST_EXCEPTION (in module asyncio)
@anchor{library/asyncio-task asyncio FIRST_EXCEPTION}@anchor{385c}
@deffn {Data} asyncio.FIRST_EXCEPTION
@end deffn

@tab

The function will return when any future finishes by raising an
exception. If no future raises an exception
then it is equivalent to @ref{385d,,ALL_COMPLETED}.

@item

@geindex ALL_COMPLETED (in module asyncio)
@anchor{library/asyncio-task asyncio ALL_COMPLETED}@anchor{385d}
@deffn {Data} asyncio.ALL_COMPLETED
@end deffn

@tab

The function will return when all futures finish or are cancelled.

@end multitable


Unlike @ref{816,,wait_for()}, @code{wait()} does not cancel the
futures when a timeout occurs.


Changed in version 3.10: Removed the `loop' parameter.



Changed in version 3.11: Passing coroutine objects to @code{wait()} directly is forbidden.



Changed in version 3.12: Added support for generators yielding tasks.

@end deffn

@geindex as_completed() (in module asyncio)
@anchor{library/asyncio-task asyncio as_completed}@anchor{4c7}
@deffn {Function} asyncio.as_completed (aws, *, timeout=None)

Run @ref{3847,,awaitable objects} in the `aws' iterable
concurrently. The returned object can be iterated to obtain the results
of the awaitables as they finish.

The object returned by @code{as_completed()} can be iterated as an
@ref{4c8,,asynchronous iterator} or a plain @ref{4c9,,iterator}. When asynchronous
iteration is used, the originally-supplied awaitables are yielded if they
are tasks or futures. This makes it easy to correlate previously-scheduled
tasks with their results. Example:

@example
ipv4_connect = create_task(open_connection("127.0.0.1", 80))
ipv6_connect = create_task(open_connection("::1", 80))
tasks = [ipv4_connect, ipv6_connect]

async for earliest_connect in as_completed(tasks):
    # earliest_connect is done. The result can be obtained by
    # awaiting it or calling earliest_connect.result()
    reader, writer = await earliest_connect

    if earliest_connect is ipv6_connect:
        print("IPv6 connection established.")
    else:
        print("IPv4 connection established.")
@end example

During asynchronous iteration, implicitly-created tasks will be yielded for
supplied awaitables that aren’t tasks or futures.

When used as a plain iterator, each iteration yields a new coroutine that
returns the result or raises the exception of the next completed awaitable.
This pattern is compatible with Python versions older than 3.13:

@example
ipv4_connect = create_task(open_connection("127.0.0.1", 80))
ipv6_connect = create_task(open_connection("::1", 80))
tasks = [ipv4_connect, ipv6_connect]

for next_connect in as_completed(tasks):
    # next_connect is not one of the original task objects. It must be
    # awaited to obtain the result value or raise the exception of the
    # awaitable that finishes next.
    reader, writer = await next_connect
@end example

A @ref{a3c,,TimeoutError} is raised if the timeout occurs before all awaitables
are done. This is raised by the @code{async for} loop during asynchronous
iteration or by the coroutines yielded during plain iteration.


Changed in version 3.10: Removed the `loop' parameter.



Deprecated since version 3.10: Deprecation warning is emitted if not all awaitable objects in the `aws'
iterable are Future-like objects and there is no running event loop.



Changed in version 3.12: Added support for generators yielding tasks.



Changed in version 3.13: The result can now be used as either an @ref{4c8,,asynchronous iterator}
or as a plain @ref{4c9,,iterator} (previously it was only a plain iterator).

@end deffn

@node Running in threads,Scheduling from other threads,Waiting primitives,Coroutines and tasks
@anchor{library/asyncio-task running-in-threads}@anchor{385e}
@subsubsection Running in threads


@geindex to_thread() (in module asyncio)
@anchor{library/asyncio-task asyncio to_thread}@anchor{aeb}
@deffn {Function} async asyncio.to_thread (func, /, *args, **kwargs)

Asynchronously run function `func' in a separate thread.

Any *args and **kwargs supplied for this function are directly passed
to `func'. Also, the current @ref{178,,contextvars.Context} is propagated,
allowing context variables from the event loop thread to be accessed in the
separate thread.

Return a coroutine that can be awaited to get the eventual result of `func'.

This coroutine function is primarily intended to be used for executing
IO-bound functions/methods that would otherwise block the event loop if
they were run in the main thread. For example:

@example
def blocking_io():
    print(f"start blocking_io at @{time.strftime('%X')@}")
    # Note that time.sleep() can be replaced with any blocking
    # IO-bound operation, such as file operations.
    time.sleep(1)
    print(f"blocking_io complete at @{time.strftime('%X')@}")

async def main():
    print(f"started main at @{time.strftime('%X')@}")

    await asyncio.gather(
        asyncio.to_thread(blocking_io),
        asyncio.sleep(1))

    print(f"finished main at @{time.strftime('%X')@}")


asyncio.run(main())

# Expected output:
#
# started main at 19:50:53
# start blocking_io at 19:50:53
# blocking_io complete at 19:50:54
# finished main at 19:50:54
@end example

Directly calling @code{blocking_io()} in any coroutine would block the event loop
for its duration, resulting in an additional 1 second of run time. Instead,
by using @code{asyncio.to_thread()}, we can run it in a separate thread without
blocking the event loop.

@cartouche
@quotation Note 
Due to the @ref{165,,GIL}, @code{asyncio.to_thread()} can typically only be used
to make IO-bound functions non-blocking. However, for extension modules
that release the GIL or alternative Python implementations that don’t
have one, @code{asyncio.to_thread()} can also be used for CPU-bound functions.
@end quotation
@end cartouche


Added in version 3.9.

@end deffn

@node Scheduling from other threads,Introspection,Running in threads,Coroutines and tasks
@anchor{library/asyncio-task scheduling-from-other-threads}@anchor{385f}
@subsubsection Scheduling from other threads


@geindex run_coroutine_threadsafe() (in module asyncio)
@anchor{library/asyncio-task asyncio run_coroutine_threadsafe}@anchor{a88}
@deffn {Function} asyncio.run_coroutine_threadsafe (coro, loop)

Submit a coroutine to the given event loop.  Thread-safe.

Return a @ref{13be,,concurrent.futures.Future} to wait for the result
from another OS thread.

This function is meant to be called from a different OS thread
than the one where the event loop is running.  Example:

@example
def in_thread(loop: asyncio.AbstractEventLoop) -> None:
    # Run some blocking IO
    pathlib.Path("example.txt").write_text("hello world", encoding="utf8")

    # Create a coroutine
    coro = asyncio.sleep(1, result=3)

    # Submit the coroutine to a given loop
    future = asyncio.run_coroutine_threadsafe(coro, loop)

    # Wait for the result with an optional timeout argument
    assert future.result(timeout=2) == 3

async def amain() -> None:
    # Get the running loop
    loop = asyncio.get_running_loop()

    # Run something in a thread
    await asyncio.to_thread(in_thread, loop)
@end example

It’s also possible to run the other way around.  Example:

@example
@@contextlib.contextmanager
def loop_in_thread() -> Generator[asyncio.AbstractEventLoop]:
    loop_fut = concurrent.futures.Future[asyncio.AbstractEventLoop]()
    stop_event = asyncio.Event()

    async def main() -> None:
        loop_fut.set_result(asyncio.get_running_loop())
        await stop_event.wait()

    with concurrent.futures.ThreadPoolExecutor(1) as tpe:
        complete_fut = tpe.submit(asyncio.run, main())
        for fut in concurrent.futures.as_completed((loop_fut, complete_fut)):
            if fut is loop_fut:
                loop = loop_fut.result()
                try:
                    yield loop
                finally:
                    loop.call_soon_threadsafe(stop_event.set)
            else:
                fut.result()

# Create a loop in another thread
with loop_in_thread() as loop:
    # Create a coroutine
    coro = asyncio.sleep(1, result=3)

    # Submit the coroutine to a given loop
    future = asyncio.run_coroutine_threadsafe(coro, loop)

    # Wait for the result with an optional timeout argument
    assert future.result(timeout=2) == 3
@end example

If an exception is raised in the coroutine, the returned Future
will be notified.  It can also be used to cancel the task in
the event loop:

@example
try:
    result = future.result(timeout)
except TimeoutError:
    print('The coroutine took too long, cancelling the task...')
    future.cancel()
except Exception as exc:
    print(f'The coroutine raised an exception: @{exc!r@}')
else:
    print(f'The coroutine returned: @{result!r@}')
@end example

See the @ref{3860,,concurrency and multithreading}
section of the documentation.

Unlike other asyncio functions this function requires the `loop'
argument to be passed explicitly.


Added in version 3.5.1.

@end deffn

@node Introspection,Task object,Scheduling from other threads,Coroutines and tasks
@anchor{library/asyncio-task introspection}@anchor{3861}
@subsubsection Introspection


@geindex current_task() (in module asyncio)
@anchor{library/asyncio-task asyncio current_task}@anchor{6a6}
@deffn {Function} asyncio.current_task (loop=None)

Return the currently running @ref{1c9,,Task} instance, or @code{None} if
no task is running.

If `loop' is @code{None} @ref{d07,,get_running_loop()} is used to get
the current loop.


Added in version 3.7.

@end deffn

@geindex all_tasks() (in module asyncio)
@anchor{library/asyncio-task asyncio all_tasks}@anchor{b55}
@deffn {Function} asyncio.all_tasks (loop=None)

Return a set of not yet finished @ref{1c9,,Task} objects run by
the loop.

If `loop' is @code{None}, @ref{d07,,get_running_loop()} is used for getting
current loop.


Added in version 3.7.

@end deffn

@geindex iscoroutine() (in module asyncio)
@anchor{library/asyncio-task asyncio iscoroutine}@anchor{6a7}
@deffn {Function} asyncio.iscoroutine (obj)

Return @code{True} if `obj' is a coroutine object.


Added in version 3.4.

@end deffn

@node Task object,,Introspection,Coroutines and tasks
@anchor{library/asyncio-task asyncio-task-obj}@anchor{3862}@anchor{library/asyncio-task task-object}@anchor{3863}
@subsubsection Task object


@geindex Task (class in asyncio)
@anchor{library/asyncio-task asyncio Task}@anchor{1c9}
@deffn {Class} asyncio.Task (coro, *, loop=None, name=None, context=None, eager_start=False)

A @ref{dcc,,Future-like} object that runs a Python
@ref{3830,,coroutine}.  Not thread-safe.

Tasks are used to run coroutines in event loops.
If a coroutine awaits on a Future, the Task suspends
the execution of the coroutine and waits for the completion
of the Future.  When the Future is `done', the execution of
the wrapped coroutine resumes.

Event loops use cooperative scheduling: an event loop runs
one Task at a time.  While a Task awaits for the completion of a
Future, the event loop runs other Tasks, callbacks, or performs
IO operations.

Use the high-level @ref{1cb,,asyncio.create_task()} function to create
Tasks, or the low-level @ref{1cc,,loop.create_task()} or
@ref{e77,,ensure_future()} functions.  Manual instantiation of Tasks
is discouraged.

To cancel a running Task use the @ref{4d4,,cancel()} method.  Calling it
will cause the Task to throw a @ref{4d5,,CancelledError} exception into
the wrapped coroutine.  If a coroutine is awaiting on a Future
object during cancellation, the Future object will be cancelled.

@ref{3864,,cancelled()} can be used to check if the Task was cancelled.
The method returns @code{True} if the wrapped coroutine did not
suppress the @ref{4d5,,CancelledError} exception and was actually
cancelled.

@ref{1c9,,asyncio.Task} inherits from @ref{dcc,,Future} all of its
APIs except @ref{3865,,Future.set_result()} and
@ref{e7e,,Future.set_exception()}.

An optional keyword-only `context' argument allows specifying a
custom @ref{178,,contextvars.Context} for the `coro' to run in.
If no `context' is provided, the Task copies the current context
and later runs its coroutine in the copied context.

An optional keyword-only `eager_start' argument allows eagerly starting
the execution of the @ref{1c9,,asyncio.Task} at task creation time.
If set to @code{True} and the event loop is running, the task will start
executing the coroutine immediately, until the first time the coroutine
blocks. If the coroutine returns or raises without blocking, the task
will be finished eagerly and will skip scheduling to the event loop.

Tasks are @ref{2410,,generic} over the return type of their wrapped
coroutines.


Changed in version 3.7: Added support for the @ref{28,,contextvars} module.



Changed in version 3.8: Added the `name' parameter.



Deprecated since version 3.10: Deprecation warning is emitted if `loop' is not specified
and there is no running event loop.



Changed in version 3.11: Added the `context' parameter.



Changed in version 3.12: Added the `eager_start' parameter.


@geindex done() (asyncio.Task method)
@anchor{library/asyncio-task asyncio Task done}@anchor{3866}
@deffn {Method} done ()

Return @code{True} if the Task is `done'.

A Task is `done' when the wrapped coroutine either returned
a value, raised an exception, or the Task was cancelled.
@end deffn

@geindex result() (asyncio.Task method)
@anchor{library/asyncio-task asyncio Task result}@anchor{3867}
@deffn {Method} result ()

Return the result of the Task.

If the Task is `done', the result of the wrapped coroutine
is returned (or if the coroutine raised an exception, that
exception is re-raised.)

If the Task has been `cancelled', this method raises
a @ref{4d5,,CancelledError} exception.

If the Task’s result isn’t yet available, this method raises
an @ref{3868,,InvalidStateError} exception.
@end deffn

@geindex exception() (asyncio.Task method)
@anchor{library/asyncio-task asyncio Task exception}@anchor{3869}
@deffn {Method} exception ()

Return the exception of the Task.

If the wrapped coroutine raised an exception that exception
is returned.  If the wrapped coroutine returned normally
this method returns @code{None}.

If the Task has been `cancelled', this method raises a
@ref{4d5,,CancelledError} exception.

If the Task isn’t `done' yet, this method raises an
@ref{3868,,InvalidStateError} exception.
@end deffn

@geindex add_done_callback() (asyncio.Task method)
@anchor{library/asyncio-task asyncio Task add_done_callback}@anchor{386a}
@deffn {Method} add_done_callback (callback, *, context=None)

Add a callback to be run when the Task is `done'.

This method should only be used in low-level callback-based code.

See the documentation of @ref{d04,,Future.add_done_callback()}
for more details.
@end deffn

@geindex remove_done_callback() (asyncio.Task method)
@anchor{library/asyncio-task asyncio Task remove_done_callback}@anchor{386b}
@deffn {Method} remove_done_callback (callback)

Remove `callback' from the callbacks list.

This method should only be used in low-level callback-based code.

See the documentation of @ref{1955,,Future.remove_done_callback()}
for more details.
@end deffn

@geindex get_stack() (asyncio.Task method)
@anchor{library/asyncio-task asyncio Task get_stack}@anchor{386c}
@deffn {Method} get_stack (*, limit=None)

Return the list of stack frames for this Task.

If the wrapped coroutine is not done, this returns the stack
where it is suspended.  If the coroutine has completed
successfully or was cancelled, this returns an empty list.
If the coroutine was terminated by an exception, this returns
the list of traceback frames.

The frames are always ordered from oldest to newest.

Only one stack frame is returned for a suspended coroutine.

The optional `limit' argument sets the maximum number of frames
to return; by default all available frames are returned.
The ordering of the returned list differs depending on whether
a stack or a traceback is returned: the newest frames of a
stack are returned, but the oldest frames of a traceback are
returned.  (This matches the behavior of the traceback module.)
@end deffn

@geindex print_stack() (asyncio.Task method)
@anchor{library/asyncio-task asyncio Task print_stack}@anchor{1b14}
@deffn {Method} print_stack (*, limit=None, file=None)

Print the stack or traceback for this Task.

This produces output similar to that of the traceback module
for the frames retrieved by @ref{386c,,get_stack()}.

The `limit' argument is passed to @ref{386c,,get_stack()} directly.

The `file' argument is an I/O stream to which the output
is written; by default output is written to @ref{cd3,,sys.stdout}.
@end deffn

@geindex get_coro() (asyncio.Task method)
@anchor{library/asyncio-task asyncio Task get_coro}@anchor{bd5}
@deffn {Method} get_coro ()

Return the coroutine object wrapped by the @code{Task}.

@cartouche
@quotation Note 
This will return @code{None} for Tasks which have already
completed eagerly. See the @ref{3852,,Eager Task Factory}.
@end quotation
@end cartouche


Added in version 3.8.



Changed in version 3.12: Newly added eager task execution means result may be @code{None}.

@end deffn

@geindex get_context() (asyncio.Task method)
@anchor{library/asyncio-task asyncio Task get_context}@anchor{386d}
@deffn {Method} get_context ()

Return the @ref{178,,contextvars.Context} object
associated with the task.


Added in version 3.12.

@end deffn

@geindex get_name() (asyncio.Task method)
@anchor{library/asyncio-task asyncio Task get_name}@anchor{bd7}
@deffn {Method} get_name ()

Return the name of the Task.

If no name has been explicitly assigned to the Task, the default
asyncio Task implementation generates a default name during
instantiation.


Added in version 3.8.

@end deffn

@geindex set_name() (asyncio.Task method)
@anchor{library/asyncio-task asyncio Task set_name}@anchor{bd6}
@deffn {Method} set_name (value)

Set the name of the Task.

The `value' argument can be any object, which is then
converted to a string.

In the default Task implementation, the name will be visible
in the @ref{1c3,,repr()} output of a task object.


Added in version 3.8.

@end deffn

@geindex cancel() (asyncio.Task method)
@anchor{library/asyncio-task asyncio Task cancel}@anchor{4d4}
@deffn {Method} cancel (msg=None)

Request the Task to be cancelled.

If the Task is already `done' or `cancelled', return @code{False},
otherwise, return @code{True}.

The method arranges for a @ref{4d5,,CancelledError} exception to be thrown
into the wrapped coroutine on the next cycle of the event loop.

The coroutine then has a chance to clean up or even deny the
request by suppressing the exception with a @ref{8fa,,try} …
… @code{except CancelledError} … @ref{1b1,,finally} block.
Therefore, unlike @ref{1bec,,Future.cancel()}, @code{Task.cancel()} does
not guarantee that the Task will be cancelled, although
suppressing cancellation completely is not common and is actively
discouraged.  Should the coroutine nevertheless decide to suppress
the cancellation, it needs to call @ref{4d7,,Task.uncancel()} in addition
to catching the exception.


Changed in version 3.9: Added the `msg' parameter.



Changed in version 3.11: The @code{msg} parameter is propagated from cancelled task to its awaiter.

@anchor{library/asyncio-task asyncio-example-task-cancel}@anchor{386e}
The following example illustrates how coroutines can intercept
the cancellation request:

@example
async def cancel_me():
    print('cancel_me(): before sleep')

    try:
        # Wait for 1 hour
        await asyncio.sleep(3600)
    except asyncio.CancelledError:
        print('cancel_me(): cancel sleep')
        raise
    finally:
        print('cancel_me(): after sleep')

async def main():
    # Create a "cancel_me" Task
    task = asyncio.create_task(cancel_me())

    # Wait for 1 second
    await asyncio.sleep(1)

    task.cancel()
    try:
        await task
    except asyncio.CancelledError:
        print("main(): cancel_me is cancelled now")

asyncio.run(main())

# Expected output:
#
#     cancel_me(): before sleep
#     cancel_me(): cancel sleep
#     cancel_me(): after sleep
#     main(): cancel_me is cancelled now
@end example
@end deffn

@geindex cancelled() (asyncio.Task method)
@anchor{library/asyncio-task asyncio Task cancelled}@anchor{3864}
@deffn {Method} cancelled ()

Return @code{True} if the Task is `cancelled'.

The Task is `cancelled' when the cancellation was requested with
@ref{4d4,,cancel()} and the wrapped coroutine propagated the
@ref{4d5,,CancelledError} exception thrown into it.
@end deffn

@geindex uncancel() (asyncio.Task method)
@anchor{library/asyncio-task asyncio Task uncancel}@anchor{4d7}
@deffn {Method} uncancel ()

Decrement the count of cancellation requests to this Task.

Returns the remaining number of cancellation requests.

Note that once execution of a cancelled task completed, further
calls to @code{uncancel()} are ineffective.


Added in version 3.11.


This method is used by asyncio’s internals and isn’t expected to be
used by end-user code.  In particular, if a Task gets successfully
uncancelled, this allows for elements of structured concurrency like
@ref{384c,,Task groups} and @ref{815,,asyncio.timeout()} to continue running,
isolating cancellation to the respective structured block.
For example:

@example
async def make_request_with_timeout():
    try:
        async with asyncio.timeout(1):
            # Structured block affected by the timeout:
            await make_request()
            await make_another_request()
    except TimeoutError:
        log("There was a timeout")
    # Outer code not affected by the timeout:
    await unrelated_code()
@end example

While the block with @code{make_request()} and @code{make_another_request()}
might get cancelled due to the timeout, @code{unrelated_code()} should
continue running even in case of the timeout.  This is implemented
with @code{uncancel()}.  @ref{4d2,,TaskGroup} context managers use
@ref{4d7,,uncancel()} in a similar fashion.

If end-user code is, for some reason, suppressing cancellation by
catching @ref{4d5,,CancelledError}, it needs to call this method to remove
the cancellation state.

When this method decrements the cancellation count to zero,
the method checks if a previous @ref{4d4,,cancel()} call had arranged
for @ref{4d5,,CancelledError} to be thrown into the task.
If it hasn’t been thrown yet, that arrangement will be
rescinded (by resetting the internal @code{_must_cancel} flag).
@end deffn


Changed in version 3.13: Changed to rescind pending cancellation requests upon reaching zero.


@geindex cancelling() (asyncio.Task method)
@anchor{library/asyncio-task asyncio Task cancelling}@anchor{4d6}
@deffn {Method} cancelling ()

Return the number of pending cancellation requests to this Task, i.e.,
the number of calls to @ref{4d4,,cancel()} less the number of
@ref{4d7,,uncancel()} calls.

Note that if this number is greater than zero but the Task is
still executing, @ref{3864,,cancelled()} will still return @code{False}.
This is because this number can be lowered by calling @ref{4d7,,uncancel()},
which can lead to the task not being cancelled after all if the
cancellation requests go down to zero.

This method is used by asyncio’s internals and isn’t expected to be
used by end-user code.  See @ref{4d7,,uncancel()} for more details.


Added in version 3.11.

@end deffn
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Streams,Synchronization Primitives,Coroutines and tasks,asyncio — Asynchronous I/O
@anchor{library/asyncio-stream doc}@anchor{386f}@anchor{library/asyncio-stream asyncio-streams}@anchor{3831}@anchor{library/asyncio-stream streams}@anchor{3870}@anchor{library/asyncio-stream translation-repo}@anchor{3871}
@subsubsection Streams


`Source code:' Lib/asyncio/streams.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/asyncio/streams.py}


__________________________________________________________________


Streams are high-level async/await-ready primitives to work with
network connections.  Streams allow sending and receiving data without
using callbacks or low-level protocols and transports.
@anchor{library/asyncio-stream asyncio-example-stream}@anchor{3872}
Here is an example of a TCP echo client written using asyncio
streams:

@example
import asyncio

async def tcp_echo_client(message):
    reader, writer = await asyncio.open_connection(
        '127.0.0.1', 8888)

    print(f'Send: @{message!r@}')
    writer.write(message.encode())
    await writer.drain()

    data = await reader.read(100)
    print(f'Received: @{data.decode()!r@}')

    print('Close the connection')
    writer.close()
    await writer.wait_closed()

asyncio.run(tcp_echo_client('Hello World!'))
@end example

See also the @ref{3873,,Examples} section below.

@subsubheading Stream Functions


The following top-level asyncio functions can be used to create
and work with streams:

@geindex open_connection() (in module asyncio)
@anchor{library/asyncio-stream asyncio open_connection}@anchor{d14}
@deffn {Function} async asyncio.open_connection (host=None, port=None, *, limit=None, ssl=None, family=0, proto=0, flags=0, sock=None, local_addr=None, server_hostname=None, ssl_handshake_timeout=None, ssl_shutdown_timeout=None, happy_eyeballs_delay=None, interleave=None)

Establish a network connection and return a pair of
@code{(reader, writer)} objects.

The returned `reader' and `writer' objects are instances of
@ref{17b8,,StreamReader} and @ref{1ab6,,StreamWriter} classes.

`limit' determines the buffer size limit used by the
returned @ref{17b8,,StreamReader} instance.  By default the `limit'
is set to 64 KiB.

The rest of the arguments are passed directly to
@ref{819,,loop.create_connection()}.

@cartouche
@quotation Note 
The `sock' argument transfers ownership of the socket to the
@ref{1ab6,,StreamWriter} created. To close the socket, call its
@ref{3874,,close()} method.
@end quotation
@end cartouche


Changed in version 3.7: Added the `ssl_handshake_timeout' parameter.



Changed in version 3.8: Added the `happy_eyeballs_delay' and `interleave' parameters.



Changed in version 3.10: Removed the `loop' parameter.



Changed in version 3.11: Added the `ssl_shutdown_timeout' parameter.

@end deffn

@geindex start_server() (in module asyncio)
@anchor{library/asyncio-stream asyncio start_server}@anchor{d15}
@deffn {Function} async asyncio.start_server (client_connected_cb, host=None, port=None, *, limit=None, family=socket.AF_UNSPEC, flags=socket.AI_PASSIVE, sock=None, backlog=100, ssl=None, reuse_address=None, reuse_port=None, keep_alive=None, ssl_handshake_timeout=None, ssl_shutdown_timeout=None, start_serving=True)

Start a socket server.

The `client_connected_cb' callback is called whenever a new client
connection is established.  It receives a @code{(reader, writer)} pair
as two arguments, instances of the @ref{17b8,,StreamReader} and
@ref{1ab6,,StreamWriter} classes.

`client_connected_cb' can be a plain callable or a
@ref{3830,,coroutine function}; if it is a coroutine function,
it will be automatically scheduled as a @ref{1c9,,Task}.

`limit' determines the buffer size limit used by the
returned @ref{17b8,,StreamReader} instance.  By default the `limit'
is set to 64 KiB.

The rest of the arguments are passed directly to
@ref{d0f,,loop.create_server()}.

@cartouche
@quotation Note 
The `sock' argument transfers ownership of the socket to the
server created. To close the socket, call the server’s
@ref{3875,,close()} method.
@end quotation
@end cartouche


Changed in version 3.7: Added the `ssl_handshake_timeout' and `start_serving' parameters.



Changed in version 3.10: Removed the `loop' parameter.



Changed in version 3.11: Added the `ssl_shutdown_timeout' parameter.



Changed in version 3.13: Added the `keep_alive' parameter.

@end deffn

@subsubheading Unix Sockets


@geindex open_unix_connection() (in module asyncio)
@anchor{library/asyncio-stream asyncio open_unix_connection}@anchor{3876}
@deffn {Function} async asyncio.open_unix_connection (path=None, *, limit=None, ssl=None, sock=None, server_hostname=None, ssl_handshake_timeout=None, ssl_shutdown_timeout=None)

Establish a Unix socket connection and return a pair of
@code{(reader, writer)}.

Similar to @ref{d14,,open_connection()} but operates on Unix sockets.

See also the documentation of @ref{3877,,loop.create_unix_connection()}.

@cartouche
@quotation Note 
The `sock' argument transfers ownership of the socket to the
@ref{1ab6,,StreamWriter} created. To close the socket, call its
@ref{3874,,close()} method.
@end quotation
@end cartouche

@ref{2181,,Availability}: Unix.


Changed in version 3.7: Added the `ssl_handshake_timeout' parameter.
The `path' parameter can now be a @ref{5a1,,path-like object}



Changed in version 3.10: Removed the `loop' parameter.



Changed in version 3.11: Added the `ssl_shutdown_timeout' parameter.

@end deffn

@geindex start_unix_server() (in module asyncio)
@anchor{library/asyncio-stream asyncio start_unix_server}@anchor{3878}
@deffn {Function} async asyncio.start_unix_server (client_connected_cb, path=None, *, limit=None, sock=None, backlog=100, ssl=None, ssl_handshake_timeout=None, ssl_shutdown_timeout=None, start_serving=True, cleanup_socket=True)

Start a Unix socket server.

Similar to @ref{d15,,start_server()} but works with Unix sockets.

If `cleanup_socket' is true then the Unix socket will automatically
be removed from the filesystem when the server is closed, unless the
socket has been replaced after the server has been created.

See also the documentation of @ref{4cb,,loop.create_unix_server()}.

@cartouche
@quotation Note 
The `sock' argument transfers ownership of the socket to the
server created. To close the socket, call the server’s
@ref{3875,,close()} method.
@end quotation
@end cartouche

@ref{2181,,Availability}: Unix.


Changed in version 3.7: Added the `ssl_handshake_timeout' and `start_serving' parameters.
The `path' parameter can now be a @ref{5a1,,path-like object}.



Changed in version 3.10: Removed the `loop' parameter.



Changed in version 3.11: Added the `ssl_shutdown_timeout' parameter.



Changed in version 3.13: Added the `cleanup_socket' parameter.

@end deffn

@menu
* StreamReader:: 
* StreamWriter:: 
* Examples: Examples<16>. 

@end menu

@node StreamReader,StreamWriter,,Streams
@anchor{library/asyncio-stream streamreader}@anchor{3879}
@subsubsection StreamReader


@geindex StreamReader (class in asyncio)
@anchor{library/asyncio-stream asyncio StreamReader}@anchor{17b8}
@deffn {Class} asyncio.StreamReader

Represents a reader object that provides APIs to read data
from the IO stream. As an @ref{f7a,,asynchronous iterable}, the
object supports the @ref{ca7,,async for} statement.

It is not recommended to instantiate `StreamReader' objects
directly; use @ref{d14,,open_connection()} and @ref{d15,,start_server()}
instead.

@geindex feed_eof() (asyncio.StreamReader method)
@anchor{library/asyncio-stream asyncio StreamReader feed_eof}@anchor{387a}
@deffn {Method} feed_eof ()

Acknowledge the EOF.
@end deffn

@geindex read() (asyncio.StreamReader method)
@anchor{library/asyncio-stream asyncio StreamReader read}@anchor{387b}
@deffn {Method} async read (n=-1)

Read up to `n' bytes from the stream.

If `n' is not provided or set to @code{-1},
read until EOF, then return all read @ref{193,,bytes}.
If EOF was received and the internal buffer is empty,
return an empty @code{bytes} object.

If `n' is @code{0}, return an empty @code{bytes} object immediately.

If `n' is positive, return at most `n' available @code{bytes}
as soon as at least 1 byte is available in the internal buffer.
If EOF is received before any byte is read, return an empty
@code{bytes} object.
@end deffn

@geindex readline() (asyncio.StreamReader method)
@anchor{library/asyncio-stream asyncio StreamReader readline}@anchor{387c}
@deffn {Method} async readline ()

Read one line, where “line” is a sequence of bytes
ending with @code{\n}.

If EOF is received and @code{\n} was not found, the method
returns partially read data.

If EOF is received and the internal buffer is empty,
return an empty @code{bytes} object.
@end deffn

@geindex readexactly() (asyncio.StreamReader method)
@anchor{library/asyncio-stream asyncio StreamReader readexactly}@anchor{e7c}
@deffn {Method} async readexactly (n)

Read exactly `n' bytes.

Raise an @ref{1d2c,,IncompleteReadError} if EOF is reached before `n'
can be read.  Use the @ref{387d,,IncompleteReadError.partial}
attribute to get the partially read data.
@end deffn

@geindex readuntil() (asyncio.StreamReader method)
@anchor{library/asyncio-stream asyncio StreamReader readuntil}@anchor{4d1}
@deffn {Method} async readuntil (separator=b'\n')

Read data from the stream until `separator' is found.

On success, the data and separator will be removed from the
internal buffer (consumed). Returned data will include the
separator at the end.

If the amount of data read exceeds the configured stream limit, a
@ref{387e,,LimitOverrunError} exception is raised, and the data
is left in the internal buffer and can be read again.

If EOF is reached before the complete separator is found,
an @ref{1d2c,,IncompleteReadError} exception is raised, and the internal
buffer is reset.  The @ref{387d,,IncompleteReadError.partial} attribute
may contain a portion of the separator.

The `separator' may also be a tuple of separators. In this
case the return value will be the shortest possible that has any
separator as the suffix. For the purposes of @ref{387e,,LimitOverrunError},
the shortest possible separator is considered to be the one that
matched.


Added in version 3.5.2.



Changed in version 3.13: The `separator' parameter may now be a @ref{614,,tuple} of
separators.

@end deffn

@geindex at_eof() (asyncio.StreamReader method)
@anchor{library/asyncio-stream asyncio StreamReader at_eof}@anchor{387f}
@deffn {Method} at_eof ()

Return @code{True} if the buffer is empty and @ref{387a,,feed_eof()}
was called.
@end deffn
@end deffn

@node StreamWriter,Examples<16>,StreamReader,Streams
@anchor{library/asyncio-stream streamwriter}@anchor{3880}
@subsubsection StreamWriter


@geindex StreamWriter (class in asyncio)
@anchor{library/asyncio-stream asyncio StreamWriter}@anchor{1ab6}
@deffn {Class} asyncio.StreamWriter

Represents a writer object that provides APIs to write data
to the IO stream.

It is not recommended to instantiate `StreamWriter' objects
directly; use @ref{d14,,open_connection()} and @ref{d15,,start_server()}
instead.

@geindex write() (asyncio.StreamWriter method)
@anchor{library/asyncio-stream asyncio StreamWriter write}@anchor{3881}
@deffn {Method} write (data)

The method attempts to write the `data' to the underlying socket immediately.
If that fails, the data is queued in an internal write buffer until it can be
sent.

The `data' buffer should be a bytes, bytearray, or C-contiguous one-dimensional
memoryview object.

The method should be used along with the @code{drain()} method:

@example
stream.write(data)
await stream.drain()
@end example
@end deffn

@geindex writelines() (asyncio.StreamWriter method)
@anchor{library/asyncio-stream asyncio StreamWriter writelines}@anchor{3882}
@deffn {Method} writelines (data)

The method writes a list (or any iterable) of bytes to the underlying socket
immediately.
If that fails, the data is queued in an internal write buffer until it can be
sent.

The method should be used along with the @code{drain()} method:

@example
stream.writelines(lines)
await stream.drain()
@end example
@end deffn

@geindex close() (asyncio.StreamWriter method)
@anchor{library/asyncio-stream asyncio StreamWriter close}@anchor{3874}
@deffn {Method} close ()

The method closes the stream and the underlying socket.

The method should be used, though not mandatory,
along with the @code{wait_closed()} method:

@example
stream.close()
await stream.wait_closed()
@end example
@end deffn

@geindex can_write_eof() (asyncio.StreamWriter method)
@anchor{library/asyncio-stream asyncio StreamWriter can_write_eof}@anchor{3883}
@deffn {Method} can_write_eof ()

Return @code{True} if the underlying transport supports
the @ref{3884,,write_eof()} method, @code{False} otherwise.
@end deffn

@geindex write_eof() (asyncio.StreamWriter method)
@anchor{library/asyncio-stream asyncio StreamWriter write_eof}@anchor{3884}
@deffn {Method} write_eof ()

Close the write end of the stream after the buffered write
data is flushed.
@end deffn

@geindex transport (asyncio.StreamWriter attribute)
@anchor{library/asyncio-stream asyncio StreamWriter transport}@anchor{3885}
@deffn {Attribute} transport

Return the underlying asyncio transport.
@end deffn

@geindex get_extra_info() (asyncio.StreamWriter method)
@anchor{library/asyncio-stream asyncio StreamWriter get_extra_info}@anchor{3886}
@deffn {Method} get_extra_info (name, default=None)

Access optional transport information; see
@ref{c99,,BaseTransport.get_extra_info()} for details.
@end deffn

@geindex drain() (asyncio.StreamWriter method)
@anchor{library/asyncio-stream asyncio StreamWriter drain}@anchor{1b6d}
@deffn {Method} async drain ()

Wait until it is appropriate to resume writing to the stream.
Example:

@example
writer.write(data)
await writer.drain()
@end example

This is a flow control method that interacts with the underlying
IO write buffer.  When the size of the buffer reaches
the high watermark, `drain()' blocks until the size of the
buffer is drained down to the low watermark and writing can
be resumed.  When there is nothing to wait for, the @code{drain()}
returns immediately.
@end deffn

@geindex start_tls() (asyncio.StreamWriter method)
@anchor{library/asyncio-stream asyncio StreamWriter start_tls}@anchor{81a}
@deffn {Method} async start_tls (sslcontext, *, server_hostname=None, ssl_handshake_timeout=None, ssl_shutdown_timeout=None)

Upgrade an existing stream-based connection to TLS.

Parameters:


@itemize *

@item 
`sslcontext': a configured instance of @ref{355,,SSLContext}.

@item 
`server_hostname': sets or overrides the host name that the target
server’s certificate will be matched against.

@item 
`ssl_handshake_timeout' is the time in seconds to wait for the TLS
handshake to complete before aborting the connection.  @code{60.0} seconds
if @code{None} (default).

@item 
`ssl_shutdown_timeout' is the time in seconds to wait for the SSL shutdown
to complete before aborting the connection. @code{30.0} seconds if @code{None}
(default).
@end itemize


Added in version 3.11.



Changed in version 3.12: Added the `ssl_shutdown_timeout' parameter.

@end deffn

@geindex is_closing() (asyncio.StreamWriter method)
@anchor{library/asyncio-stream asyncio StreamWriter is_closing}@anchor{d09}
@deffn {Method} is_closing ()

Return @code{True} if the stream is closed or in the process of
being closed.


Added in version 3.7.

@end deffn

@geindex wait_closed() (asyncio.StreamWriter method)
@anchor{library/asyncio-stream asyncio StreamWriter wait_closed}@anchor{d08}
@deffn {Method} async wait_closed ()

Wait until the stream is closed.

Should be called after @ref{3874,,close()} to wait until the underlying
connection is closed, ensuring that all data has been flushed
before e.g. exiting the program.


Added in version 3.7.

@end deffn
@end deffn

@node Examples<16>,,StreamWriter,Streams
@anchor{library/asyncio-stream examples}@anchor{3873}
@subsubsection Examples


@menu
* TCP echo client using streams:: 
* TCP echo server using streams:: 
* Get HTTP headers:: 
* Register an open socket to wait for data using streams:: 

@end menu

@node TCP echo client using streams,TCP echo server using streams,,Examples<16>
@anchor{library/asyncio-stream asyncio-tcp-echo-client-streams}@anchor{3887}@anchor{library/asyncio-stream tcp-echo-client-using-streams}@anchor{3888}
@subsubsection TCP echo client using streams


TCP echo client using the @ref{d14,,asyncio.open_connection()} function:

@example
import asyncio

async def tcp_echo_client(message):
    reader, writer = await asyncio.open_connection(
        '127.0.0.1', 8888)

    print(f'Send: @{message!r@}')
    writer.write(message.encode())
    await writer.drain()

    data = await reader.read(100)
    print(f'Received: @{data.decode()!r@}')

    print('Close the connection')
    writer.close()
    await writer.wait_closed()

asyncio.run(tcp_echo_client('Hello World!'))
@end example


@subsubheading See also


The @ref{3889,,TCP echo client protocol}
example uses the low-level @ref{819,,loop.create_connection()} method.


@node TCP echo server using streams,Get HTTP headers,TCP echo client using streams,Examples<16>
@anchor{library/asyncio-stream asyncio-tcp-echo-server-streams}@anchor{388a}@anchor{library/asyncio-stream tcp-echo-server-using-streams}@anchor{388b}
@subsubsection TCP echo server using streams


TCP echo server using the @ref{d15,,asyncio.start_server()} function:

@example
import asyncio

async def handle_echo(reader, writer):
    data = await reader.read(100)
    message = data.decode()
    addr = writer.get_extra_info('peername')

    print(f"Received @{message!r@} from @{addr!r@}")

    print(f"Send: @{message!r@}")
    writer.write(data)
    await writer.drain()

    print("Close the connection")
    writer.close()
    await writer.wait_closed()

async def main():
    server = await asyncio.start_server(
        handle_echo, '127.0.0.1', 8888)

    addrs = ', '.join(str(sock.getsockname()) for sock in server.sockets)
    print(f'Serving on @{addrs@}')

    async with server:
        await server.serve_forever()

asyncio.run(main())
@end example


@subsubheading See also


The @ref{388c,,TCP echo server protocol}
example uses the @ref{d0f,,loop.create_server()} method.


@node Get HTTP headers,Register an open socket to wait for data using streams,TCP echo server using streams,Examples<16>
@anchor{library/asyncio-stream get-http-headers}@anchor{388d}
@subsubsection Get HTTP headers


Simple example querying HTTP headers of the URL passed on the command line:

@example
import asyncio
import urllib.parse
import sys

async def print_http_headers(url):
    url = urllib.parse.urlsplit(url)
    if url.scheme == 'https':
        reader, writer = await asyncio.open_connection(
            url.hostname, 443, ssl=True)
    else:
        reader, writer = await asyncio.open_connection(
            url.hostname, 80)

    query = (
        f"HEAD @{url.path or '/'@} HTTP/1.0\r\n"
        f"Host: @{url.hostname@}\r\n"
        f"\r\n"
    )

    writer.write(query.encode('latin-1'))
    while True:
        line = await reader.readline()
        if not line:
            break

        line = line.decode('latin1').rstrip()
        if line:
            print(f'HTTP header> @{line@}')

    # Ignore the body, close the socket
    writer.close()
    await writer.wait_closed()

url = sys.argv[1]
asyncio.run(print_http_headers(url))
@end example

Usage:

@example
python example.py http://example.com/path/page.html
@end example

or with HTTPS:

@example
python example.py https://example.com/path/page.html
@end example

@node Register an open socket to wait for data using streams,,Get HTTP headers,Examples<16>
@anchor{library/asyncio-stream asyncio-example-create-connection-streams}@anchor{388e}@anchor{library/asyncio-stream register-an-open-socket-to-wait-for-data-using-streams}@anchor{388f}
@subsubsection Register an open socket to wait for data using streams


Coroutine waiting until a socket receives data using the
@ref{d14,,open_connection()} function:

@example
import asyncio
import socket

async def wait_for_data():
    # Get a reference to the current event loop because
    # we want to access low-level APIs.
    loop = asyncio.get_running_loop()

    # Create a pair of connected sockets.
    rsock, wsock = socket.socketpair()

    # Register the open socket to wait for data.
    reader, writer = await asyncio.open_connection(sock=rsock)

    # Simulate the reception of data from the network
    loop.call_soon(wsock.send, 'abc'.encode())

    # Wait for data
    data = await reader.read(100)

    # Got data, we are done: close the socket
    print("Received:", data.decode())
    writer.close()
    await writer.wait_closed()

    # Close the second socket
    wsock.close()

asyncio.run(wait_for_data())
@end example


@subsubheading See also


The @ref{3890,,register an open socket to wait for data using a protocol} example uses a low-level protocol and
the @ref{819,,loop.create_connection()} method.

The @ref{3891,,watch a file descriptor for read events} example uses the low-level
@ref{3892,,loop.add_reader()} method to watch a file descriptor.


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Synchronization Primitives,Subprocesses,Streams,asyncio — Asynchronous I/O
@anchor{library/asyncio-sync doc}@anchor{3893}@anchor{library/asyncio-sync asyncio-sync}@anchor{3834}@anchor{library/asyncio-sync synchronization-primitives}@anchor{3894}@anchor{library/asyncio-sync translation-repo}@anchor{3895}
@subsubsection Synchronization Primitives


`Source code:' Lib/asyncio/locks.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/asyncio/locks.py}


__________________________________________________________________


asyncio synchronization primitives are designed to be similar to
those of the @ref{f3,,threading} module with two important caveats:


@itemize *

@item 
asyncio primitives are not thread-safe, therefore they should not
be used for OS thread synchronization (use @ref{f3,,threading} for
that);

@item 
methods of these synchronization primitives do not accept the `timeout'
argument; use the @ref{816,,asyncio.wait_for()} function to perform
operations with timeouts.
@end itemize

asyncio has the following basic synchronization primitives:


@itemize *

@item 
@ref{c6c,,Lock}

@item 
@ref{2f6,,Event}

@item 
@ref{c6d,,Condition}

@item 
@ref{c6e,,Semaphore}

@item 
@ref{c6f,,BoundedSemaphore}

@item 
@ref{817,,Barrier}
@end itemize


__________________________________________________________________


@menu
* Lock:: 
* Event:: 
* Condition:: 
* Semaphore:: 
* BoundedSemaphore:: 
* Barrier:: 

@end menu

@node Lock,Event,,Synchronization Primitives
@anchor{library/asyncio-sync lock}@anchor{3896}
@subsubsection Lock


@geindex Lock (class in asyncio)
@anchor{library/asyncio-sync asyncio Lock}@anchor{c6c}
@deffn {Class} asyncio.Lock

Implements a mutex lock for asyncio tasks.  Not thread-safe.

An asyncio lock can be used to guarantee exclusive access to a
shared resource.

The preferred way to use a Lock is an @ref{186,,async with}
statement:

@example
lock = asyncio.Lock()

# ... later
async with lock:
    # access shared state
@end example

which is equivalent to:

@example
lock = asyncio.Lock()

# ... later
await lock.acquire()
try:
    # access shared state
finally:
    lock.release()
@end example


Changed in version 3.10: Removed the `loop' parameter.


@geindex acquire() (asyncio.Lock method)
@anchor{library/asyncio-sync asyncio Lock acquire}@anchor{3897}
@deffn {Method} async acquire ()

Acquire the lock.

This method waits until the lock is `unlocked', sets it to
`locked' and returns @code{True}.

When more than one coroutine is blocked in @code{acquire()}
waiting for the lock to be unlocked, only one coroutine
eventually proceeds.

Acquiring a lock is `fair': the coroutine that proceeds will be
the first coroutine that started waiting on the lock.
@end deffn

@geindex release() (asyncio.Lock method)
@anchor{library/asyncio-sync asyncio Lock release}@anchor{3898}
@deffn {Method} release ()

Release the lock.

When the lock is `locked', reset it to `unlocked' and return.

If the lock is `unlocked', a @ref{246,,RuntimeError} is raised.
@end deffn

@geindex locked() (asyncio.Lock method)
@anchor{library/asyncio-sync asyncio Lock locked}@anchor{3899}
@deffn {Method} locked ()

Return @code{True} if the lock is `locked'.
@end deffn
@end deffn

@node Event,Condition,Lock,Synchronization Primitives
@anchor{library/asyncio-sync event}@anchor{389a}
@subsubsection Event


@geindex Event (class in asyncio)
@anchor{library/asyncio-sync asyncio Event}@anchor{2f6}
@deffn {Class} asyncio.Event

An event object.  Not thread-safe.

An asyncio event can be used to notify multiple asyncio tasks
that some event has happened.

An Event object manages an internal flag that can be set to `true'
with the @ref{389b,,set()} method and reset to `false' with the
@ref{389c,,clear()} method.  The @ref{389d,,wait()} method blocks until the
flag is set to `true'.  The flag is set to `false' initially.


Changed in version 3.10: Removed the `loop' parameter.

@anchor{library/asyncio-sync asyncio-example-sync-event}@anchor{389e}
Example:

@example
async def waiter(event):
    print('waiting for it ...')
    await event.wait()
    print('... got it!')

async def main():
    # Create an Event object.
    event = asyncio.Event()

    # Spawn a Task to wait until 'event' is set.
    waiter_task = asyncio.create_task(waiter(event))

    # Sleep for 1 second and set the event.
    await asyncio.sleep(1)
    event.set()

    # Wait until the waiter task is finished.
    await waiter_task

asyncio.run(main())
@end example

@geindex wait() (asyncio.Event method)
@anchor{library/asyncio-sync asyncio Event wait}@anchor{389d}
@deffn {Method} async wait ()

Wait until the event is set.

If the event is set, return @code{True} immediately.
Otherwise block until another task calls @ref{389b,,set()}.
@end deffn

@geindex set() (asyncio.Event method)
@anchor{library/asyncio-sync asyncio Event set}@anchor{389b}
@deffn {Method} set ()

Set the event.

All tasks waiting for event to be set will be immediately
awakened.
@end deffn

@geindex clear() (asyncio.Event method)
@anchor{library/asyncio-sync asyncio Event clear}@anchor{389c}
@deffn {Method} clear ()

Clear (unset) the event.

Subsequent tasks awaiting on @ref{389d,,wait()} will now block until the
@ref{389b,,set()} method is called again.
@end deffn

@geindex is_set() (asyncio.Event method)
@anchor{library/asyncio-sync asyncio Event is_set}@anchor{389f}
@deffn {Method} is_set ()

Return @code{True} if the event is set.
@end deffn
@end deffn

@node Condition,Semaphore,Event,Synchronization Primitives
@anchor{library/asyncio-sync condition}@anchor{38a0}
@subsubsection Condition


@geindex Condition (class in asyncio)
@anchor{library/asyncio-sync asyncio Condition}@anchor{c6d}
@deffn {Class} asyncio.Condition (lock=None)

A Condition object.  Not thread-safe.

An asyncio condition primitive can be used by a task to wait for
some event to happen and then get exclusive access to a shared
resource.

In essence, a Condition object combines the functionality
of an @ref{2f6,,Event} and a @ref{c6c,,Lock}.  It is possible to have
multiple Condition objects share one Lock, which allows coordinating
exclusive access to a shared resource between different tasks
interested in particular states of that shared resource.

The optional `lock' argument must be a @ref{c6c,,Lock} object or
@code{None}.  In the latter case a new Lock object is created
automatically.


Changed in version 3.10: Removed the `loop' parameter.


The preferred way to use a Condition is an @ref{186,,async with}
statement:

@example
cond = asyncio.Condition()

# ... later
async with cond:
    await cond.wait()
@end example

which is equivalent to:

@example
cond = asyncio.Condition()

# ... later
await cond.acquire()
try:
    await cond.wait()
finally:
    cond.release()
@end example

@geindex acquire() (asyncio.Condition method)
@anchor{library/asyncio-sync asyncio Condition acquire}@anchor{38a1}
@deffn {Method} async acquire ()

Acquire the underlying lock.

This method waits until the underlying lock is `unlocked',
sets it to `locked' and returns @code{True}.
@end deffn

@geindex notify() (asyncio.Condition method)
@anchor{library/asyncio-sync asyncio Condition notify}@anchor{1a3c}
@deffn {Method} notify (n=1)

Wake up `n' tasks (1 by default) waiting on this
condition.  If fewer than `n' tasks are waiting they are all awakened.

The lock must be acquired before this method is called and
released shortly after.  If called with an `unlocked' lock
a @ref{246,,RuntimeError} error is raised.
@end deffn

@geindex locked() (asyncio.Condition method)
@anchor{library/asyncio-sync asyncio Condition locked}@anchor{38a2}
@deffn {Method} locked ()

Return @code{True} if the underlying lock is acquired.
@end deffn

@geindex notify_all() (asyncio.Condition method)
@anchor{library/asyncio-sync asyncio Condition notify_all}@anchor{38a3}
@deffn {Method} notify_all ()

Wake up all tasks waiting on this condition.

This method acts like @ref{1a3c,,notify()}, but wakes up all waiting
tasks.

The lock must be acquired before this method is called and
released shortly after.  If called with an `unlocked' lock
a @ref{246,,RuntimeError} error is raised.
@end deffn

@geindex release() (asyncio.Condition method)
@anchor{library/asyncio-sync asyncio Condition release}@anchor{38a4}
@deffn {Method} release ()

Release the underlying lock.

When invoked on an unlocked lock, a @ref{246,,RuntimeError} is
raised.
@end deffn

@geindex wait() (asyncio.Condition method)
@anchor{library/asyncio-sync asyncio Condition wait}@anchor{1a67}
@deffn {Method} async wait ()

Wait until notified.

If the calling task has not acquired the lock when this method is
called, a @ref{246,,RuntimeError} is raised.

This method releases the underlying lock, and then blocks until
it is awakened by a @ref{1a3c,,notify()} or @ref{38a3,,notify_all()} call.
Once awakened, the Condition re-acquires its lock and this method
returns @code{True}.

Note that a task `may' return from this call spuriously,
which is why the caller should always re-check the state
and be prepared to @code{wait()} again. For this reason, you may
prefer to use @ref{38a5,,wait_for()} instead.
@end deffn

@geindex wait_for() (asyncio.Condition method)
@anchor{library/asyncio-sync asyncio Condition wait_for}@anchor{38a5}
@deffn {Method} async wait_for (predicate)

Wait until a predicate becomes `true'.

The predicate must be a callable which result will be
interpreted as a boolean value.  The method will repeatedly
@ref{1a67,,wait()} until the predicate evaluates to `true'. The final value is the
return value.
@end deffn
@end deffn

@node Semaphore,BoundedSemaphore,Condition,Synchronization Primitives
@anchor{library/asyncio-sync semaphore}@anchor{38a6}
@subsubsection Semaphore


@geindex Semaphore (class in asyncio)
@anchor{library/asyncio-sync asyncio Semaphore}@anchor{c6e}
@deffn {Class} asyncio.Semaphore (value=1)

A Semaphore object.  Not thread-safe.

A semaphore manages an internal counter which is decremented by each
@ref{1a68,,acquire()} call and incremented by each @ref{38a7,,release()} call.
The counter can never go below zero; when @code{acquire()} finds
that it is zero, it blocks, waiting until some task calls
@code{release()}.

The optional `value' argument gives the initial value for the
internal counter (@code{1} by default). If the given value is
less than @code{0} a @ref{2ee,,ValueError} is raised.


Changed in version 3.10: Removed the `loop' parameter.


The preferred way to use a Semaphore is an @ref{186,,async with}
statement:

@example
sem = asyncio.Semaphore(10)

# ... later
async with sem:
    # work with shared resource
@end example

which is equivalent to:

@example
sem = asyncio.Semaphore(10)

# ... later
await sem.acquire()
try:
    # work with shared resource
finally:
    sem.release()
@end example

@geindex acquire() (asyncio.Semaphore method)
@anchor{library/asyncio-sync asyncio Semaphore acquire}@anchor{1a68}
@deffn {Method} async acquire ()

Acquire a semaphore.

If the internal counter is greater than zero, decrement
it by one and return @code{True} immediately.  If it is zero, wait
until a @ref{38a7,,release()} is called and return @code{True}.
@end deffn

@geindex locked() (asyncio.Semaphore method)
@anchor{library/asyncio-sync asyncio Semaphore locked}@anchor{38a8}
@deffn {Method} locked ()

Returns @code{True} if semaphore can not be acquired immediately.
@end deffn

@geindex release() (asyncio.Semaphore method)
@anchor{library/asyncio-sync asyncio Semaphore release}@anchor{38a7}
@deffn {Method} release ()

Release a semaphore, incrementing the internal counter by one.
Can wake up a task waiting to acquire the semaphore.

Unlike @ref{c6f,,BoundedSemaphore}, @code{Semaphore} allows
making more @code{release()} calls than @code{acquire()} calls.
@end deffn
@end deffn

@node BoundedSemaphore,Barrier,Semaphore,Synchronization Primitives
@anchor{library/asyncio-sync boundedsemaphore}@anchor{38a9}
@subsubsection BoundedSemaphore


@geindex BoundedSemaphore (class in asyncio)
@anchor{library/asyncio-sync asyncio BoundedSemaphore}@anchor{c6f}
@deffn {Class} asyncio.BoundedSemaphore (value=1)

A bounded semaphore object.  Not thread-safe.

Bounded Semaphore is a version of @ref{c6e,,Semaphore} that raises
a @ref{2ee,,ValueError} in @ref{38a7,,release()} if it
increases the internal counter above the initial `value'.


Changed in version 3.10: Removed the `loop' parameter.

@end deffn

@node Barrier,,BoundedSemaphore,Synchronization Primitives
@anchor{library/asyncio-sync barrier}@anchor{38aa}
@subsubsection Barrier


@geindex Barrier (class in asyncio)
@anchor{library/asyncio-sync asyncio Barrier}@anchor{817}
@deffn {Class} asyncio.Barrier (parties)

A barrier object.  Not thread-safe.

A barrier is a simple synchronization primitive that allows to block until
`parties' number of tasks are waiting on it.
Tasks can wait on the @ref{38ab,,wait()} method and would be blocked until
the specified number of tasks end up waiting on @code{wait()}.
At that point all of the waiting tasks would unblock simultaneously.

@ref{186,,async with} can be used as an alternative to awaiting on
@ref{38ab,,wait()}.

The barrier can be reused any number of times.
@anchor{library/asyncio-sync asyncio-example-barrier}@anchor{38ac}
Example:

@example
async def example_barrier():
   # barrier with 3 parties
   b = asyncio.Barrier(3)

   # create 2 new waiting tasks
   asyncio.create_task(b.wait())
   asyncio.create_task(b.wait())

   await asyncio.sleep(0)
   print(b)

   # The third .wait() call passes the barrier
   await b.wait()
   print(b)
   print("barrier passed")

   await asyncio.sleep(0)
   print(b)

asyncio.run(example_barrier())
@end example

Result of this example is:

@example
<asyncio.locks.Barrier object at 0x... [filling, waiters:2/3]>
<asyncio.locks.Barrier object at 0x... [draining, waiters:0/3]>
barrier passed
<asyncio.locks.Barrier object at 0x... [filling, waiters:0/3]>
@end example


Added in version 3.11.


@geindex wait() (asyncio.Barrier method)
@anchor{library/asyncio-sync asyncio Barrier wait}@anchor{38ab}
@deffn {Method} async wait ()

Pass the barrier. When all the tasks party to the barrier have called
this function, they are all unblocked simultaneously.

When a waiting or blocked task in the barrier is cancelled,
this task exits the barrier which stays in the same state.
If the state of the barrier is “filling”, the number of waiting task
decreases by 1.

The return value is an integer in the range of 0 to @code{parties-1}, different
for each task. This can be used to select a task to do some special
housekeeping, e.g.:

@example
...
async with barrier as position:
   if position == 0:
      # Only one task prints this
      print('End of *draining phase*')
@end example

This method may raise a @ref{818,,BrokenBarrierError} exception if the
barrier is broken or reset while a task is waiting.
It could raise a @ref{4d5,,CancelledError} if a task is cancelled.
@end deffn

@geindex reset() (asyncio.Barrier method)
@anchor{library/asyncio-sync asyncio Barrier reset}@anchor{38ad}
@deffn {Method} async reset ()

Return the barrier to the default, empty state.  Any tasks waiting on it
will receive the @ref{818,,BrokenBarrierError} exception.

If a barrier is broken it may be better to just leave it and create a new one.
@end deffn

@geindex abort() (asyncio.Barrier method)
@anchor{library/asyncio-sync asyncio Barrier abort}@anchor{38ae}
@deffn {Method} async abort ()

Put the barrier into a broken state.  This causes any active or future
calls to @ref{38ab,,wait()} to fail with the @ref{818,,BrokenBarrierError}.
Use this for example if one of the tasks needs to abort, to avoid infinite
waiting tasks.
@end deffn

@geindex parties (asyncio.Barrier attribute)
@anchor{library/asyncio-sync asyncio Barrier parties}@anchor{38af}
@deffn {Attribute} parties

The number of tasks required to pass the barrier.
@end deffn

@geindex n_waiting (asyncio.Barrier attribute)
@anchor{library/asyncio-sync asyncio Barrier n_waiting}@anchor{38b0}
@deffn {Attribute} n_waiting

The number of tasks currently waiting in the barrier while filling.
@end deffn

@geindex broken (asyncio.Barrier attribute)
@anchor{library/asyncio-sync asyncio Barrier broken}@anchor{38b1}
@deffn {Attribute} broken

A boolean that is @code{True} if the barrier is in the broken state.
@end deffn
@end deffn

@geindex BrokenBarrierError
@anchor{library/asyncio-sync asyncio BrokenBarrierError}@anchor{818}
@deffn {Exception} asyncio.BrokenBarrierError

This exception, a subclass of @ref{246,,RuntimeError}, is raised when the
@ref{817,,Barrier} object is reset or broken.
@end deffn


__________________________________________________________________



Changed in version 3.9: Acquiring a lock using @code{await lock} or @code{yield from lock} and/or
@ref{187,,with} statement (@code{with await lock}, @code{with (yield from
lock)}) was removed.  Use @code{async with lock} instead.


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Subprocesses,Queues,Synchronization Primitives,asyncio — Asynchronous I/O
@anchor{library/asyncio-subprocess doc}@anchor{38b2}@anchor{library/asyncio-subprocess asyncio-subprocess}@anchor{3832}@anchor{library/asyncio-subprocess subprocesses}@anchor{38b3}@anchor{library/asyncio-subprocess translation-repo}@anchor{38b4}
@subsubsection Subprocesses


`Source code:' Lib/asyncio/subprocess.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/asyncio/subprocess.py},
Lib/asyncio/base_subprocess.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/asyncio/base_subprocess.py}


__________________________________________________________________


This section describes high-level async/await asyncio APIs to
create and manage subprocesses.
@anchor{library/asyncio-subprocess asyncio-example-subprocess-shell}@anchor{38b5}
Here’s an example of how asyncio can run a shell command and
obtain its result:

@example
import asyncio

async def run(cmd):
    proc = await asyncio.create_subprocess_shell(
        cmd,
        stdout=asyncio.subprocess.PIPE,
        stderr=asyncio.subprocess.PIPE)

    stdout, stderr = await proc.communicate()

    print(f'[@{cmd!r@} exited with @{proc.returncode@}]')
    if stdout:
        print(f'[stdout]\n@{stdout.decode()@}')
    if stderr:
        print(f'[stderr]\n@{stderr.decode()@}')

asyncio.run(run('ls /zzz'))
@end example

will print:

@example
['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
@end example

Because all asyncio subprocess functions are asynchronous and asyncio
provides many tools to work with such functions, it is easy to execute
and monitor multiple subprocesses in parallel.  It is indeed trivial
to modify the above example to run several commands simultaneously:

@example
async def main():
    await asyncio.gather(
        run('ls /zzz'),
        run('sleep 1; echo "hello"'))

asyncio.run(main())
@end example

See also the @ref{38b6,,Examples} subsection.

@menu
* Creating Subprocesses:: 
* Constants: Constants<7>. 
* Interacting with Subprocesses:: 

@end menu

@node Creating Subprocesses,Constants<7>,,Subprocesses
@anchor{library/asyncio-subprocess creating-subprocesses}@anchor{38b7}
@subsubsection Creating Subprocesses


@geindex create_subprocess_exec() (in module asyncio)
@anchor{library/asyncio-subprocess asyncio create_subprocess_exec}@anchor{c71}
@deffn {Function} async asyncio.create_subprocess_exec (program, *args, stdin=None, stdout=None, stderr=None, limit=None, **kwds)

Create a subprocess.

The `limit' argument sets the buffer limit for @ref{17b8,,StreamReader}
wrappers for @ref{38b8,,stdout} and @ref{38b9,,stderr}
(if @ref{d86,,subprocess.PIPE} is passed to `stdout' and `stderr' arguments).

Return a @ref{38ba,,Process} instance.

See the documentation of @ref{38bb,,loop.subprocess_exec()} for other
parameters.

If the process object is garbage collected while the process is still
running, the child process will be killed.


Changed in version 3.10: Removed the `loop' parameter.

@end deffn

@geindex create_subprocess_shell() (in module asyncio)
@anchor{library/asyncio-subprocess asyncio create_subprocess_shell}@anchor{c72}
@deffn {Function} async asyncio.create_subprocess_shell (cmd, stdin=None, stdout=None, stderr=None, limit=None, **kwds)

Run the `cmd' shell command.

The `limit' argument sets the buffer limit for @ref{17b8,,StreamReader}
wrappers for @ref{38b8,,stdout} and @ref{38b9,,stderr}
(if @ref{d86,,subprocess.PIPE} is passed to `stdout' and `stderr' arguments).

Return a @ref{38ba,,Process} instance.

See the documentation of @ref{38bc,,loop.subprocess_shell()} for other
parameters.

If the process object is garbage collected while the process is still
running, the child process will be killed.

@cartouche
@quotation Important 
It is the application’s responsibility to ensure that all whitespace and
special characters are quoted appropriately to avoid shell injection@footnote{https://en.wikipedia.org/wiki/Shell_injection#Shell_injection}
vulnerabilities. The @ref{582,,shlex.quote()} function can be used to properly
escape whitespace and special shell characters in strings that are going
to be used to construct shell commands.
@end quotation
@end cartouche


Changed in version 3.10: Removed the `loop' parameter.

@end deffn

@cartouche
@quotation Note 
Subprocesses are available for Windows if a @ref{81e,,ProactorEventLoop} is
used. See @ref{38bd,,Subprocess Support on Windows}
for details.
@end quotation
@end cartouche


@subsubheading See also


asyncio also has the following `low-level' APIs to work with subprocesses:
@ref{38bb,,loop.subprocess_exec()}, @ref{38bc,,loop.subprocess_shell()},
@ref{38be,,loop.connect_read_pipe()}, @ref{38bf,,loop.connect_write_pipe()},
as well as the @ref{38c0,,Subprocess Transports}
and @ref{38c1,,Subprocess Protocols}.


@node Constants<7>,Interacting with Subprocesses,Creating Subprocesses,Subprocesses
@anchor{library/asyncio-subprocess constants}@anchor{38c2}
@subsubsection Constants


@geindex asyncio.subprocess.PIPE (built-in variable)
@anchor{library/asyncio-subprocess asyncio subprocess PIPE}@anchor{38c3}
@deffn {Data} asyncio.subprocess.PIPE

Can be passed to the `stdin', `stdout' or `stderr' parameters.

If `PIPE' is passed to `stdin' argument, the
@ref{38c4,,Process.stdin} attribute
will point to a @ref{1ab6,,StreamWriter} instance.

If `PIPE' is passed to `stdout' or `stderr' arguments, the
@ref{38b8,,Process.stdout} and
@ref{38b9,,Process.stderr}
attributes will point to @ref{17b8,,StreamReader} instances.
@end deffn

@geindex asyncio.subprocess.STDOUT (built-in variable)
@anchor{library/asyncio-subprocess asyncio subprocess STDOUT}@anchor{38c5}
@deffn {Data} asyncio.subprocess.STDOUT

Special value that can be used as the `stderr' argument and indicates
that standard error should be redirected into standard output.
@end deffn

@geindex asyncio.subprocess.DEVNULL (built-in variable)
@anchor{library/asyncio-subprocess asyncio subprocess DEVNULL}@anchor{38c6}
@deffn {Data} asyncio.subprocess.DEVNULL

Special value that can be used as the `stdin', `stdout' or `stderr' argument
to process creation functions.  It indicates that the special file
@ref{1e56,,os.devnull} will be used for the corresponding subprocess stream.
@end deffn

@node Interacting with Subprocesses,,Constants<7>,Subprocesses
@anchor{library/asyncio-subprocess interacting-with-subprocesses}@anchor{38c7}
@subsubsection Interacting with Subprocesses


Both @ref{c71,,create_subprocess_exec()} and @ref{c72,,create_subprocess_shell()}
functions return instances of the `Process' class.  `Process' is a high-level
wrapper that allows communicating with subprocesses and watching for
their completion.

@geindex asyncio.subprocess.Process (built-in class)
@anchor{library/asyncio-subprocess asyncio subprocess Process}@anchor{38ba}
@deffn {Class} asyncio.subprocess.Process

An object that wraps OS processes created by the
@ref{c71,,create_subprocess_exec()} and @ref{c72,,create_subprocess_shell()}
functions.

This class is designed to have a similar API to the
@ref{4b8,,subprocess.Popen} class, but there are some
notable differences:


@itemize *

@item 
unlike Popen, Process instances do not have an equivalent to
the @ref{37d1,,poll()} method;

@item 
the @ref{1ae6,,communicate()} and
@ref{38c8,,wait()} methods don’t have a
`timeout' parameter: use the @ref{816,,wait_for()} function;

@item 
the @ref{38c8,,Process.wait()} method
is asynchronous, whereas @ref{ee6,,subprocess.Popen.wait()} method
is implemented as a blocking busy loop;

@item 
the `universal_newlines' parameter is not supported.
@end itemize

This class is @ref{3860,,not thread safe}.

See also the @ref{38c9,,Subprocess and Threads}
section.

@geindex wait() (asyncio.subprocess.Process method)
@anchor{library/asyncio-subprocess asyncio subprocess Process wait}@anchor{38c8}
@deffn {Method} async wait ()

Wait for the child process to terminate.

Set and return the @ref{38ca,,returncode} attribute.

@cartouche
@quotation Note 
This method can deadlock when using @code{stdout=PIPE} or
@code{stderr=PIPE} and the child process generates so much output
that it blocks waiting for the OS pipe buffer to accept
more data. Use the @ref{1ae6,,communicate()} method when using pipes
to avoid this condition.
@end quotation
@end cartouche
@end deffn

@geindex communicate() (asyncio.subprocess.Process method)
@anchor{library/asyncio-subprocess asyncio subprocess Process communicate}@anchor{1ae6}
@deffn {Method} async communicate (input=None)

Interact with process:


@enumerate 

@item 
send data to `stdin' (if `input' is not @code{None});

@item 
closes `stdin';

@item 
read data from `stdout' and `stderr', until EOF is reached;

@item 
wait for process to terminate.
@end enumerate

The optional `input' argument is the data (@ref{193,,bytes} object)
that will be sent to the child process.

Return a tuple @code{(stdout_data, stderr_data)}.

If either @ref{1262,,BrokenPipeError} or @ref{1265,,ConnectionResetError}
exception is raised when writing `input' into `stdin', the
exception is ignored.  This condition occurs when the process
exits before all data are written into `stdin'.

If it is desired to send data to the process’ `stdin',
the process needs to be created with @code{stdin=PIPE}.  Similarly,
to get anything other than @code{None} in the result tuple, the
process has to be created with @code{stdout=PIPE} and/or
@code{stderr=PIPE} arguments.

Note, that the data read is buffered in memory, so do not use
this method if the data size is large or unlimited.


Changed in version 3.12: `stdin' gets closed when @code{input=None} too.

@end deffn

@geindex send_signal() (asyncio.subprocess.Process method)
@anchor{library/asyncio-subprocess asyncio subprocess Process send_signal}@anchor{198e}
@deffn {Method} send_signal (signal)

Sends the signal `signal' to the child process.

@cartouche
@quotation Note 
On Windows, @ref{15eb,,SIGTERM} is an alias for @ref{38cb,,terminate()}.
@code{CTRL_C_EVENT} and @code{CTRL_BREAK_EVENT} can be sent to processes
started with a `creationflags' parameter which includes
@code{CREATE_NEW_PROCESS_GROUP}.
@end quotation
@end cartouche
@end deffn

@geindex terminate() (asyncio.subprocess.Process method)
@anchor{library/asyncio-subprocess asyncio subprocess Process terminate}@anchor{38cb}
@deffn {Method} terminate ()

Stop the child process.

On POSIX systems this method sends @ref{15eb,,SIGTERM} to the
child process.

On Windows the Win32 API function @code{TerminateProcess()} is
called to stop the child process.
@end deffn

@geindex kill() (asyncio.subprocess.Process method)
@anchor{library/asyncio-subprocess asyncio subprocess Process kill}@anchor{38cc}
@deffn {Method} kill ()

Kill the child process.

On POSIX systems this method sends @ref{d56,,SIGKILL} to the child
process.

On Windows this method is an alias for @ref{38cb,,terminate()}.
@end deffn

@geindex stdin (asyncio.subprocess.Process attribute)
@anchor{library/asyncio-subprocess asyncio subprocess Process stdin}@anchor{38c4}
@deffn {Attribute} stdin

Standard input stream (@ref{1ab6,,StreamWriter}) or @code{None}
if the process was created with @code{stdin=None}.
@end deffn

@geindex stdout (asyncio.subprocess.Process attribute)
@anchor{library/asyncio-subprocess asyncio subprocess Process stdout}@anchor{38b8}
@deffn {Attribute} stdout

Standard output stream (@ref{17b8,,StreamReader}) or @code{None}
if the process was created with @code{stdout=None}.
@end deffn

@geindex stderr (asyncio.subprocess.Process attribute)
@anchor{library/asyncio-subprocess asyncio subprocess Process stderr}@anchor{38b9}
@deffn {Attribute} stderr

Standard error stream (@ref{17b8,,StreamReader}) or @code{None}
if the process was created with @code{stderr=None}.
@end deffn

@cartouche
@quotation Warning 
Use the @ref{1ae6,,communicate()} method rather than
@ref{38c4,,process.stdin.write()},
@ref{38b8,,await process.stdout.read()} or
@ref{38b9,,await process.stderr.read()}.
This avoids deadlocks due to streams pausing reading or writing
and blocking the child process.
@end quotation
@end cartouche

@geindex pid (asyncio.subprocess.Process attribute)
@anchor{library/asyncio-subprocess asyncio subprocess Process pid}@anchor{38cd}
@deffn {Attribute} pid

Process identification number (PID).

Note that for processes created by the @ref{c72,,create_subprocess_shell()}
function, this attribute is the PID of the spawned shell.
@end deffn

@geindex returncode (asyncio.subprocess.Process attribute)
@anchor{library/asyncio-subprocess asyncio subprocess Process returncode}@anchor{38ca}
@deffn {Attribute} returncode

Return code of the process when it exits.

A @code{None} value indicates that the process has not terminated yet.

For processes created with @ref{c71,,create_subprocess_exec()}, a negative
value @code{-N} indicates that the child was terminated by signal @code{N}
(POSIX only).

For processes created with @ref{c72,,create_subprocess_shell()}, the
return code reflects the exit status of the shell itself (e.g. @code{/bin/sh}),
which may map signals to codes such as @code{128+N}. See the
documentation of the shell (for example, the Bash manual’s Exit Status)
for details.
@end deffn
@end deffn

@menu
* Subprocess and Threads:: 
* Examples: Examples<17>. 

@end menu

@node Subprocess and Threads,Examples<17>,,Interacting with Subprocesses
@anchor{library/asyncio-subprocess asyncio-subprocess-threads}@anchor{38c9}@anchor{library/asyncio-subprocess subprocess-and-threads}@anchor{38ce}
@subsubsection Subprocess and Threads


Standard asyncio event loop supports running subprocesses from different threads by
default.

On Windows subprocesses are provided by @ref{81e,,ProactorEventLoop} only (default),
@ref{316,,SelectorEventLoop} has no subprocess support.

Note that alternative event loop implementations might have own limitations;
please refer to their documentation.


@subsubheading See also


The @ref{3860,,Concurrency and multithreading in asyncio} section.


@node Examples<17>,,Subprocess and Threads,Interacting with Subprocesses
@anchor{library/asyncio-subprocess examples}@anchor{38b6}
@subsubsection Examples


An example using the @ref{38ba,,Process} class to
control a subprocess and the @ref{17b8,,StreamReader} class to read from
its standard output.
@anchor{library/asyncio-subprocess asyncio-example-create-subprocess-exec}@anchor{38cf}
The subprocess is created by the @ref{c71,,create_subprocess_exec()}
function:

@example
import asyncio
import sys

async def get_date():
    code = 'import datetime as dt; print(dt.datetime.now())'

    # Create the subprocess; redirect the standard output
    # into a pipe.
    proc = await asyncio.create_subprocess_exec(
        sys.executable, '-c', code,
        stdout=asyncio.subprocess.PIPE)

    # Read one line of output.
    data = await proc.stdout.readline()
    line = data.decode('ascii').rstrip()

    # Wait for the subprocess exit.
    await proc.wait()
    return line

date = asyncio.run(get_date())
print(f"Current date: @{date@}")
@end example

See also the @ref{38d0,,same example}
written using low-level APIs.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Queues,Exceptions<16>,Subprocesses,asyncio — Asynchronous I/O
@anchor{library/asyncio-queue doc}@anchor{38d1}@anchor{library/asyncio-queue asyncio-queues}@anchor{3833}@anchor{library/asyncio-queue queues}@anchor{38d2}@anchor{library/asyncio-queue translation-repo}@anchor{38d3}
@subsubsection Queues


`Source code:' Lib/asyncio/queues.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/asyncio/queues.py}


__________________________________________________________________


asyncio queues are designed to be similar to classes of the
@ref{bb,,queue} module.  Although asyncio queues are not thread-safe,
they are designed to be used specifically in async/await code.

Note that methods of asyncio queues don’t have a `timeout' parameter;
use @ref{816,,asyncio.wait_for()} function to do queue operations with a
timeout.

See also the @ref{38d4,,Examples} section below.

@menu
* Queue:: 
* Priority Queue:: 
* LIFO Queue:: 
* Exceptions: Exceptions<15>. 
* Examples: Examples<18>. 

@end menu

@node Queue,Priority Queue,,Queues
@anchor{library/asyncio-queue queue}@anchor{38d5}
@subsubsection Queue


@geindex Queue (class in asyncio)
@anchor{library/asyncio-queue asyncio Queue}@anchor{c70}
@deffn {Class} asyncio.Queue (maxsize=0)

A first in, first out (FIFO) queue.

If `maxsize' is less than or equal to zero, the queue size is
infinite.  If it is an integer greater than @code{0}, then
@code{await put()} blocks when the queue reaches `maxsize'
until an item is removed by @ref{38d6,,get()}.

Unlike the standard library threading @ref{bb,,queue}, the size of
the queue is always known and can be returned by calling the
@ref{38d7,,qsize()} method.


Changed in version 3.10: Removed the `loop' parameter.


This class is @ref{3860,,not thread safe}.

@geindex maxsize (asyncio.Queue attribute)
@anchor{library/asyncio-queue asyncio Queue maxsize}@anchor{38d8}
@deffn {Attribute} maxsize

Number of items allowed in the queue.
@end deffn

@geindex empty() (asyncio.Queue method)
@anchor{library/asyncio-queue asyncio Queue empty}@anchor{38d9}
@deffn {Method} empty ()

Return @code{True} if the queue is empty, @code{False} otherwise.
@end deffn

@geindex full() (asyncio.Queue method)
@anchor{library/asyncio-queue asyncio Queue full}@anchor{38da}
@deffn {Method} full ()

Return @code{True} if there are @ref{38d8,,maxsize} items in the queue.

If the queue was initialized with @code{maxsize=0} (the default),
then @code{full()} never returns @code{True}.
@end deffn

@geindex get() (asyncio.Queue method)
@anchor{library/asyncio-queue asyncio Queue get}@anchor{38d6}
@deffn {Method} async get ()

Remove and return an item from the queue. If queue is empty,
wait until an item is available.

Raises @ref{4ce,,QueueShutDown} if the queue has been shut down and
is empty, or if the queue has been shut down immediately.
@end deffn

@geindex get_nowait() (asyncio.Queue method)
@anchor{library/asyncio-queue asyncio Queue get_nowait}@anchor{38db}
@deffn {Method} get_nowait ()

Return an item if one is immediately available, else raise
@ref{38dc,,QueueEmpty}.
@end deffn

@geindex join() (asyncio.Queue method)
@anchor{library/asyncio-queue asyncio Queue join}@anchor{fcc}
@deffn {Method} async join ()

Block until all items in the queue have been received and processed.

The count of unfinished tasks goes up whenever an item is added
to the queue. The count goes down whenever a consumer coroutine calls
@ref{fcd,,task_done()} to indicate that the item was retrieved and all
work on it is complete.  When the count of unfinished tasks drops
to zero, @code{join()} unblocks.
@end deffn

@geindex put() (asyncio.Queue method)
@anchor{library/asyncio-queue asyncio Queue put}@anchor{38dd}
@deffn {Method} async put (item)

Put an item into the queue. If the queue is full, wait until a
free slot is available before adding the item.

Raises @ref{4ce,,QueueShutDown} if the queue has been shut down.
@end deffn

@geindex put_nowait() (asyncio.Queue method)
@anchor{library/asyncio-queue asyncio Queue put_nowait}@anchor{38de}
@deffn {Method} put_nowait (item)

Put an item into the queue without blocking.

If no free slot is immediately available, raise @ref{38df,,QueueFull}.
@end deffn

@geindex qsize() (asyncio.Queue method)
@anchor{library/asyncio-queue asyncio Queue qsize}@anchor{38d7}
@deffn {Method} qsize ()

Return the number of items in the queue.
@end deffn

@geindex shutdown() (asyncio.Queue method)
@anchor{library/asyncio-queue asyncio Queue shutdown}@anchor{4cd}
@deffn {Method} shutdown (immediate=False)

Put a @code{Queue} instance into a shutdown mode.

The queue can no longer grow.
Future calls to @ref{38dd,,put()} raise @ref{4ce,,QueueShutDown}.
Currently blocked callers of @code{put()} will be unblocked
and will raise @code{QueueShutDown} in the formerly awaiting task.

If `immediate' is false (the default), the queue can be wound
down normally with @ref{38d6,,get()} calls to extract tasks
that have already been loaded.

And if @ref{fcd,,task_done()} is called for each remaining task, a
pending @ref{fcc,,join()} will be unblocked normally.

Once the queue is empty, future calls to @ref{38d6,,get()} will
raise @ref{4ce,,QueueShutDown}.

If `immediate' is true, the queue is terminated immediately.
The queue is drained to be completely empty and the count
of unfinished tasks is reduced by the number of tasks drained.
If unfinished tasks is zero, callers of @ref{fcc,,join()}
are unblocked.  Also, blocked callers of @ref{38d6,,get()}
are unblocked and will raise @ref{4ce,,QueueShutDown} because the
queue is empty.

Use caution when using @ref{fcc,,join()} with `immediate' set
to true. This unblocks the join even when no work has been done
on the tasks, violating the usual invariant for joining a queue.


Added in version 3.13.

@end deffn

@geindex task_done() (asyncio.Queue method)
@anchor{library/asyncio-queue asyncio Queue task_done}@anchor{fcd}
@deffn {Method} task_done ()

Indicate that a formerly enqueued work item is complete.

Used by queue consumers. For each @ref{38d6,,get()} used to
fetch a work item, a subsequent call to @code{task_done()} tells the
queue that the processing on the work item is complete.

If a @ref{fcc,,join()} is currently blocking, it will resume when all
items have been processed (meaning that a @code{task_done()}
call was received for every item that had been @ref{38dd,,put()}
into the queue).

Raises @ref{2ee,,ValueError} if called more times than there were
items placed in the queue.
@end deffn
@end deffn

@node Priority Queue,LIFO Queue,Queue,Queues
@anchor{library/asyncio-queue priority-queue}@anchor{38e0}
@subsubsection Priority Queue


@geindex PriorityQueue (class in asyncio)
@anchor{library/asyncio-queue asyncio PriorityQueue}@anchor{38e1}
@deffn {Class} asyncio.PriorityQueue

A variant of @ref{c70,,Queue}; retrieves entries in priority order
(lowest first).

Entries are typically tuples of the form
@code{(priority_number, data)}.
@end deffn

@node LIFO Queue,Exceptions<15>,Priority Queue,Queues
@anchor{library/asyncio-queue lifo-queue}@anchor{38e2}
@subsubsection LIFO Queue


@geindex LifoQueue (class in asyncio)
@anchor{library/asyncio-queue asyncio LifoQueue}@anchor{38e3}
@deffn {Class} asyncio.LifoQueue

A variant of @ref{c70,,Queue} that retrieves most recently added
entries first (last in, first out).
@end deffn

@node Exceptions<15>,Examples<18>,LIFO Queue,Queues
@anchor{library/asyncio-queue exceptions}@anchor{38e4}
@subsubsection Exceptions


@geindex QueueEmpty
@anchor{library/asyncio-queue asyncio QueueEmpty}@anchor{38dc}
@deffn {Exception} asyncio.QueueEmpty

This exception is raised when the @ref{38db,,get_nowait()} method
is called on an empty queue.
@end deffn

@geindex QueueFull
@anchor{library/asyncio-queue asyncio QueueFull}@anchor{38df}
@deffn {Exception} asyncio.QueueFull

Exception raised when the @ref{38de,,put_nowait()} method is called
on a queue that has reached its `maxsize'.
@end deffn

@geindex QueueShutDown
@anchor{library/asyncio-queue asyncio QueueShutDown}@anchor{4ce}
@deffn {Exception} asyncio.QueueShutDown

Exception raised when @ref{38dd,,put()} or @ref{38d6,,get()} is
called on a queue which has been shut down.


Added in version 3.13.

@end deffn

@node Examples<18>,,Exceptions<15>,Queues
@anchor{library/asyncio-queue examples}@anchor{38d4}
@subsubsection Examples

@anchor{library/asyncio-queue asyncio-example-queue-dist}@anchor{38e5}
Queues can be used to distribute workload between several
concurrent tasks:

@example
import asyncio
import random
import time


async def worker(name, queue):
    while True:
        # Get a "work item" out of the queue.
        sleep_for = await queue.get()

        # Sleep for the "sleep_for" seconds.
        await asyncio.sleep(sleep_for)

        # Notify the queue that the "work item" has been processed.
        queue.task_done()

        print(f'@{name@} has slept for @{sleep_for:.2f@} seconds')


async def main():
    # Create a queue that we will use to store our "workload".
    queue = asyncio.Queue()

    # Generate random timings and put them into the queue.
    total_sleep_time = 0
    for _ in range(20):
        sleep_for = random.uniform(0.05, 1.0)
        total_sleep_time += sleep_for
        queue.put_nowait(sleep_for)

    # Create three worker tasks to process the queue concurrently.
    tasks = []
    for i in range(3):
        task = asyncio.create_task(worker(f'worker-@{i@}', queue))
        tasks.append(task)

    # Wait until the queue is fully processed.
    started_at = time.monotonic()
    await queue.join()
    total_slept_for = time.monotonic() - started_at

    # Cancel our worker tasks.
    for task in tasks:
        task.cancel()
    # Wait until all worker tasks are cancelled.
    await asyncio.gather(*tasks, return_exceptions=True)

    print('====')
    print(f'3 workers slept in parallel for @{total_slept_for:.2f@} seconds')
    print(f'total expected sleep time: @{total_sleep_time:.2f@} seconds')


asyncio.run(main())
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Exceptions<16>,Call Graph Introspection,Queues,asyncio — Asynchronous I/O
@anchor{library/asyncio-exceptions doc}@anchor{38e6}@anchor{library/asyncio-exceptions asyncio-exceptions}@anchor{38e7}@anchor{library/asyncio-exceptions exceptions}@anchor{38e8}@anchor{library/asyncio-exceptions translation-repo}@anchor{38e9}
@subsubsection Exceptions


`Source code:' Lib/asyncio/exceptions.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/asyncio/exceptions.py}


__________________________________________________________________


@geindex TimeoutError
@anchor{library/asyncio-exceptions asyncio TimeoutError}@anchor{1afc}
@deffn {Exception} asyncio.TimeoutError

A deprecated alias of @code{TimeoutError},
raised when the operation has exceeded the given deadline.


Changed in version 3.11: This class was made an alias of @code{TimeoutError}.

@end deffn

@geindex CancelledError
@anchor{library/asyncio-exceptions asyncio CancelledError}@anchor{4d5}
@deffn {Exception} asyncio.CancelledError

The operation has been cancelled.

This exception can be caught to perform custom operations
when asyncio Tasks are cancelled.  In almost all situations the
exception must be re-raised.


Changed in version 3.8: @code{CancelledError} is now a subclass of @ref{7d8,,BaseException} rather than @ref{bd3,,Exception}.

@end deffn

@geindex InvalidStateError
@anchor{library/asyncio-exceptions asyncio InvalidStateError}@anchor{3868}
@deffn {Exception} asyncio.InvalidStateError

Invalid internal state of @ref{1c9,,Task} or @ref{dcc,,Future}.

Can be raised in situations like setting a result value for a
`Future' object that already has a result value set.
@end deffn

@geindex SendfileNotAvailableError
@anchor{library/asyncio-exceptions asyncio SendfileNotAvailableError}@anchor{38ea}
@deffn {Exception} asyncio.SendfileNotAvailableError

The “sendfile” syscall is not available for the given
socket or file type.

A subclass of @ref{246,,RuntimeError}.
@end deffn

@geindex IncompleteReadError
@anchor{library/asyncio-exceptions asyncio IncompleteReadError}@anchor{1d2c}
@deffn {Exception} asyncio.IncompleteReadError

The requested read operation did not complete fully.

Raised by the @ref{3831,,asyncio stream APIs}.

This exception is a subclass of @ref{14e5,,EOFError}.

@geindex expected (asyncio.IncompleteReadError attribute)
@anchor{library/asyncio-exceptions asyncio IncompleteReadError expected}@anchor{38eb}
@deffn {Attribute} expected

The total number (@ref{19c,,int}) of expected bytes.
@end deffn

@geindex partial (asyncio.IncompleteReadError attribute)
@anchor{library/asyncio-exceptions asyncio IncompleteReadError partial}@anchor{387d}
@deffn {Attribute} partial

A string of @ref{193,,bytes} read before the end of stream was reached.
@end deffn
@end deffn

@geindex LimitOverrunError
@anchor{library/asyncio-exceptions asyncio LimitOverrunError}@anchor{387e}
@deffn {Exception} asyncio.LimitOverrunError

Reached the buffer size limit while looking for a separator.

Raised by the @ref{3831,,asyncio stream APIs}.

@geindex consumed (asyncio.LimitOverrunError attribute)
@anchor{library/asyncio-exceptions asyncio LimitOverrunError consumed}@anchor{38ec}
@deffn {Attribute} consumed

The total number of to be consumed bytes.
@end deffn
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Call Graph Introspection,Event loop,Exceptions<16>,asyncio — Asynchronous I/O
@anchor{library/asyncio-graph doc}@anchor{38ed}@anchor{library/asyncio-graph asyncio-graph}@anchor{38ee}@anchor{library/asyncio-graph call-graph-introspection}@anchor{38ef}@anchor{library/asyncio-graph translation-repo}@anchor{38f0}
@subsubsection Call Graph Introspection


`Source code:' Lib/asyncio/graph.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/asyncio/graph.py}


__________________________________________________________________


asyncio has powerful runtime call graph introspection utilities
to trace the entire call graph of a running `coroutine' or `task', or
a suspended `future'.  These utilities and the underlying machinery
can be used from within a Python program or by external profilers
and debuggers.


Added in version 3.14.


@geindex print_call_graph() (in module asyncio)
@anchor{library/asyncio-graph asyncio print_call_graph}@anchor{1cf}
@deffn {Function} asyncio.print_call_graph (future=None, /, *, file=None, depth=1, limit=None)

Print the async call graph for the current task or the provided
@ref{1c9,,Task} or @ref{dcc,,Future}.

This function prints entries starting from the top frame and going
down towards the invocation point.

The function receives an optional `future' argument.
If not passed, the current running task will be used.

If the function is called on `the current task', the optional
keyword-only `depth' argument can be used to skip the specified
number of frames from top of the stack.

If the optional keyword-only `limit' argument is provided, each call stack
in the resulting graph is truncated to include at most @code{abs(limit)}
entries. If `limit' is positive, the entries left are the closest to
the invocation point. If `limit' is negative, the topmost entries are
left. If `limit' is omitted or @code{None}, all entries are present.
If `limit' is @code{0}, the call stack is not printed at all, only
“awaited by” information is printed.

If `file' is omitted or @code{None}, the function will print
to @ref{cd3,,sys.stdout}.

`Example:'

The following Python code:

@example
import asyncio

async def test():
    asyncio.print_call_graph()

async def main():
    async with asyncio.TaskGroup() as g:
        g.create_task(test(), name='test')

asyncio.run(main())
@end example

will print:

@example
* Task(name='test', id=0x1039f0fe0)
+ Call stack:
|   File 't2.py', line 4, in async test()
+ Awaited by:
   * Task(name='Task-1', id=0x103a5e060)
      + Call stack:
      |   File 'taskgroups.py', line 107, in async TaskGroup.__aexit__()
      |   File 't2.py', line 7, in async main()
@end example
@end deffn

@geindex format_call_graph() (in module asyncio)
@anchor{library/asyncio-graph asyncio format_call_graph}@anchor{38f1}
@deffn {Function} asyncio.format_call_graph (future=None, /, *, depth=1, limit=None)

Like @ref{1cf,,print_call_graph()}, but returns a string.
If `future' is @code{None} and there’s no current task,
the function returns an empty string.
@end deffn

@geindex capture_call_graph() (in module asyncio)
@anchor{library/asyncio-graph asyncio capture_call_graph}@anchor{1ce}
@deffn {Function} asyncio.capture_call_graph (future=None, /, *, depth=1, limit=None)

Capture the async call graph for the current task or the provided
@ref{1c9,,Task} or @ref{dcc,,Future}.

The function receives an optional `future' argument.
If not passed, the current running task will be used. If there’s no
current task, the function returns @code{None}.

If the function is called on `the current task', the optional
keyword-only `depth' argument can be used to skip the specified
number of frames from top of the stack.

Returns a @code{FutureCallGraph} data class object:


@itemize *

@item 
@code{FutureCallGraph(future, call_stack, awaited_by)}

@quotation

Where `future' is a reference to a @ref{dcc,,Future} or
a @ref{1c9,,Task} (or their subclasses.)

@code{call_stack} is a tuple of @code{FrameCallGraphEntry} objects.

@code{awaited_by} is a tuple of @code{FutureCallGraph} objects.
@end quotation

@item 
@code{FrameCallGraphEntry(frame)}

@quotation

Where `frame' is a frame object of a regular Python function
in the call stack.
@end quotation
@end itemize
@end deffn

@menu
* Low level utility functions:: 

@end menu

@node Low level utility functions,,,Call Graph Introspection
@anchor{library/asyncio-graph low-level-utility-functions}@anchor{38f2}
@subsubsection Low level utility functions


To introspect an async call graph asyncio requires cooperation from
control flow structures, such as @ref{c6b,,shield()} or @ref{4d2,,TaskGroup}.
Any time an intermediate @ref{dcc,,Future} object with low-level APIs like
@ref{d04,,Future.add_done_callback()} is
involved, the following two functions should be used to inform asyncio
about how exactly such intermediate future objects are connected with
the tasks they wrap or control.

@geindex future_add_to_awaited_by() (in module asyncio)
@anchor{library/asyncio-graph asyncio future_add_to_awaited_by}@anchor{38f3}
@deffn {Function} asyncio.future_add_to_awaited_by (future, waiter, /)

Record that `future' is awaited on by `waiter'.

Both `future' and `waiter' must be instances of
@ref{dcc,,Future} or @ref{1c9,,Task} or their subclasses,
otherwise the call would have no effect.

A call to @code{future_add_to_awaited_by()} must be followed by an
eventual call to the @ref{38f4,,future_discard_from_awaited_by()} function
with the same arguments.
@end deffn

@geindex future_discard_from_awaited_by() (in module asyncio)
@anchor{library/asyncio-graph asyncio future_discard_from_awaited_by}@anchor{38f4}
@deffn {Function} asyncio.future_discard_from_awaited_by (future, waiter, /)

Record that `future' is no longer awaited on by `waiter'.

Both `future' and `waiter' must be instances of
@ref{dcc,,Future} or @ref{1c9,,Task} or their subclasses, otherwise
the call would have no effect.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Event loop,Futures,Call Graph Introspection,asyncio — Asynchronous I/O
@anchor{library/asyncio-eventloop doc}@anchor{38f5}@anchor{library/asyncio-eventloop asyncio-event-loop}@anchor{f7c}@anchor{library/asyncio-eventloop event-loop}@anchor{38f6}@anchor{library/asyncio-eventloop translation-repo}@anchor{38f7}
@subsubsection Event loop


`Source code:' Lib/asyncio/events.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/asyncio/events.py},
Lib/asyncio/base_events.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/asyncio/base_events.py}


__________________________________________________________________


@subsubheading Preface


The event loop is the core of every asyncio application.
Event loops run asynchronous tasks and callbacks, perform network
IO operations, and run subprocesses.

Application developers should typically use the high-level asyncio functions,
such as @ref{2f5,,asyncio.run()}, and should rarely need to reference the loop
object or call its methods.  This section is intended mostly for authors
of lower-level code, libraries, and frameworks, who need finer control over
the event loop behavior.

@subsubheading Obtaining the Event Loop


The following low-level functions can be used to get, set, or create
an event loop:

@geindex get_running_loop() (in module asyncio)
@anchor{library/asyncio-eventloop asyncio get_running_loop}@anchor{d07}
@deffn {Function} asyncio.get_running_loop ()

Return the running event loop in the current OS thread.

Raise a @ref{246,,RuntimeError} if there is no running event loop.

This function can only be called from a coroutine or a callback.


Added in version 3.7.

@end deffn

@geindex get_event_loop() (in module asyncio)
@anchor{library/asyncio-eventloop asyncio get_event_loop}@anchor{2f4}
@deffn {Function} asyncio.get_event_loop ()

Get the current event loop.

When called from a coroutine or a callback (e.g. scheduled with
call_soon or similar API), this function will always return the
running event loop.

If there is no running event loop set, the function will return
the result of the @code{get_event_loop_policy().get_event_loop()} call.

Because this function has rather complex behavior (especially
when custom event loop policies are in use), using the
@ref{d07,,get_running_loop()} function is preferred to @code{get_event_loop()}
in coroutines and callbacks.

As noted above, consider using the higher-level @ref{2f5,,asyncio.run()} function,
instead of using these lower level functions to manually create and close an
event loop.


Changed in version 3.14: Raises a @ref{246,,RuntimeError} if there is no current event loop.


@cartouche
@quotation Note 
The @code{asyncio} policy system is deprecated and will be removed
in Python 3.16; from there on, this function will return the current
running event loop if present else it will return the
loop set by @ref{1b99,,set_event_loop()}.
@end quotation
@end cartouche
@end deffn

@geindex set_event_loop() (in module asyncio)
@anchor{library/asyncio-eventloop asyncio set_event_loop}@anchor{1b99}
@deffn {Function} asyncio.set_event_loop (loop)

Set `loop' as the current event loop for the current OS thread.
@end deffn

@geindex new_event_loop() (in module asyncio)
@anchor{library/asyncio-eventloop asyncio new_event_loop}@anchor{383e}
@deffn {Function} asyncio.new_event_loop ()

Create and return a new event loop object.
@end deffn

Note that the behaviour of @ref{2f4,,get_event_loop()}, @ref{1b99,,set_event_loop()},
and @ref{383e,,new_event_loop()} functions can be altered by
@ref{38f8,,setting a custom event loop policy}.

@subsubheading Contents


This documentation page contains the following sections:


@itemize *

@item 
The @ref{38f9,,Event Loop Methods} section is the reference documentation of
the event loop APIs;

@item 
The @ref{38fa,,Callback Handles} section documents the @ref{1ec6,,Handle} and
@ref{1b21,,TimerHandle} instances which are returned from scheduling
methods such as @ref{d00,,loop.call_soon()} and @ref{d02,,loop.call_later()};

@item 
The @ref{38fb,,Server Objects} section documents types returned from
event loop methods like @ref{d0f,,loop.create_server()};

@item 
The @ref{38fc,,Event Loop Implementations} section documents the
@ref{316,,SelectorEventLoop} and @ref{81e,,ProactorEventLoop} classes;

@item 
The @ref{38fd,,Examples} section showcases how to work with some event
loop APIs.
@end itemize

@menu
* Event loop methods:: 
* Callback handles:: 
* Server objects:: 
* Event loop implementations:: 
* Examples: Examples<19>. 

@end menu

@node Event loop methods,Callback handles,,Event loop
@anchor{library/asyncio-eventloop asyncio-event-loop-methods}@anchor{38fe}@anchor{library/asyncio-eventloop event-loop-methods}@anchor{38f9}
@subsubsection Event loop methods


Event loops have `low-level' APIs for the following:

@menu
* Running and stopping the loop:: 
* Scheduling callbacks:: 
* Scheduling delayed callbacks:: 
* Creating futures and tasks:: 
* Opening network connections:: 
* Creating network servers:: 
* Transferring files:: 
* TLS upgrade:: 
* Watching file descriptors:: 
* Working with socket objects directly:: 
* DNS:: 
* Working with pipes:: 
* Unix signals:: 
* Executing code in thread or process pools:: 
* Error handling API:: 
* Enabling debug mode:: 
* Running subprocesses:: 

@end menu

@node Running and stopping the loop,Scheduling callbacks,,Event loop methods
@anchor{library/asyncio-eventloop running-and-stopping-the-loop}@anchor{38ff}
@subsubsection Running and stopping the loop


@geindex run_until_complete() (asyncio.loop method)
@anchor{library/asyncio-eventloop asyncio loop run_until_complete}@anchor{e78}
@deffn {Method} loop.run_until_complete (future)

Run until the `future' (an instance of @ref{dcc,,Future}) has
completed.

If the argument is a @ref{3830,,coroutine object} it
is implicitly scheduled to run as a @ref{1c9,,asyncio.Task}.

Return the Future’s result or raise its exception.
@end deffn

@geindex run_forever() (asyncio.loop method)
@anchor{library/asyncio-eventloop asyncio loop run_forever}@anchor{3900}
@deffn {Method} loop.run_forever ()

Run the event loop until @ref{e7d,,stop()} is called.

If @ref{e7d,,stop()} is called before @code{run_forever()} is called,
the loop will poll the I/O selector once with a timeout of zero,
run all callbacks scheduled in response to I/O events (and
those that were already scheduled), and then exit.

If @ref{e7d,,stop()} is called while @code{run_forever()} is running,
the loop will run the current batch of callbacks and then exit.
Note that new callbacks scheduled by callbacks will not run in this
case; instead, they will run the next time @code{run_forever()} or
@ref{e78,,run_until_complete()} is called.
@end deffn

@geindex stop() (asyncio.loop method)
@anchor{library/asyncio-eventloop asyncio loop stop}@anchor{e7d}
@deffn {Method} loop.stop ()

Stop the event loop.
@end deffn

@geindex is_running() (asyncio.loop method)
@anchor{library/asyncio-eventloop asyncio loop is_running}@anchor{3901}
@deffn {Method} loop.is_running ()

Return @code{True} if the event loop is currently running.
@end deffn

@geindex is_closed() (asyncio.loop method)
@anchor{library/asyncio-eventloop asyncio loop is_closed}@anchor{fc9}
@deffn {Method} loop.is_closed ()

Return @code{True} if the event loop was closed.
@end deffn

@geindex close() (asyncio.loop method)
@anchor{library/asyncio-eventloop asyncio loop close}@anchor{3902}
@deffn {Method} loop.close ()

Close the event loop.

The loop must not be running when this function is called.
Any pending callbacks will be discarded.

This method clears all queues and shuts down the executor, but does
not wait for the executor to finish.

This method is idempotent and irreversible.  No other methods
should be called after the event loop is closed.
@end deffn

@geindex shutdown_asyncgens() (asyncio.loop method)
@anchor{library/asyncio-eventloop asyncio loop shutdown_asyncgens}@anchor{e7f}
@deffn {Method} async loop.shutdown_asyncgens ()

Schedule all currently open @ref{24e2,,asynchronous generator} objects to
close with an @ref{adb,,aclose()} call.  After calling this method,
the event loop will issue a warning if a new asynchronous generator
is iterated. This should be used to reliably finalize all scheduled
asynchronous generators.

Note that there is no need to call this function when
@ref{2f5,,asyncio.run()} is used.

Example:

@example
try:
    loop.run_forever()
finally:
    loop.run_until_complete(loop.shutdown_asyncgens())
    loop.close()
@end example


Added in version 3.6.

@end deffn

@geindex shutdown_default_executor() (asyncio.loop method)
@anchor{library/asyncio-eventloop asyncio loop shutdown_default_executor}@anchor{aea}
@deffn {Method} async loop.shutdown_default_executor (timeout=None)

Schedule the closure of the default executor and wait for it to join all of
the threads in the @ref{94e,,ThreadPoolExecutor}.
Once this method has been called,
using the default executor with @ref{aec,,loop.run_in_executor()}
will raise a @ref{246,,RuntimeError}.

The `timeout' parameter specifies the amount of time
(in @ref{197,,float} seconds) the executor will be given to finish joining.
With the default, @code{None},
the executor is allowed an unlimited amount of time.

If the `timeout' is reached, a @ref{4d8,,RuntimeWarning} is emitted
and the default executor is terminated
without waiting for its threads to finish joining.

@cartouche
@quotation Note 
Do not call this method when using @ref{2f5,,asyncio.run()},
as the latter handles default executor shutdown automatically.
@end quotation
@end cartouche


Added in version 3.9.



Changed in version 3.12: Added the `timeout' parameter.

@end deffn

@node Scheduling callbacks,Scheduling delayed callbacks,Running and stopping the loop,Event loop methods
@anchor{library/asyncio-eventloop scheduling-callbacks}@anchor{3903}
@subsubsection Scheduling callbacks


@geindex call_soon() (asyncio.loop method)
@anchor{library/asyncio-eventloop asyncio loop call_soon}@anchor{d00}
@deffn {Method} loop.call_soon (callback, *args, context=None)

Schedule the `callback' @ref{2e0d,,callback} to be called with
`args' arguments at the next iteration of the event loop.

Return an instance of @ref{1ec6,,asyncio.Handle},
which can be used later to cancel the callback.

Callbacks are called in the order in which they are registered.
Each callback will be called exactly once.

The optional keyword-only `context' argument specifies a
custom @ref{178,,contextvars.Context} for the `callback' to run in.
Callbacks use the current context when no `context' is provided.

Unlike @ref{d01,,call_soon_threadsafe()}, this method is not thread-safe.
@end deffn

@geindex call_soon_threadsafe() (asyncio.loop method)
@anchor{library/asyncio-eventloop asyncio loop call_soon_threadsafe}@anchor{d01}
@deffn {Method} loop.call_soon_threadsafe (callback, *args, context=None)

A thread-safe variant of @ref{d00,,call_soon()}. When scheduling callbacks from
another thread, this function `must' be used, since @code{call_soon()} is not
thread-safe.

This function is safe to be called from a reentrant context or signal handler,
however, it is not safe or fruitful to use the returned handle in such contexts.

Raises @ref{246,,RuntimeError} if called on a loop that’s been closed.
This can happen on a secondary thread when the main application is
shutting down.

See the @ref{3860,,concurrency and multithreading}
section of the documentation.


Changed in version 3.7: The `context' keyword-only parameter was added. See 
@geindex Python Enhancement Proposals; PEP 567
PEP 567@footnote{https://peps.python.org/pep-0567/}
for more details.

@end deffn
@anchor{library/asyncio-eventloop asyncio-pass-keywords}@anchor{3904}
@cartouche
@quotation Note 
Most @ref{b,,asyncio} scheduling functions don’t allow passing
keyword arguments.  To do that, use @ref{219,,functools.partial()}:

@example
# will schedule "print("Hello", flush=True)"
loop.call_soon(
    functools.partial(print, "Hello", flush=True))
@end example

Using partial objects is usually more convenient than using lambdas,
as asyncio can render partial objects better in debug and error
messages.
@end quotation
@end cartouche

@node Scheduling delayed callbacks,Creating futures and tasks,Scheduling callbacks,Event loop methods
@anchor{library/asyncio-eventloop asyncio-delayed-calls}@anchor{3905}@anchor{library/asyncio-eventloop scheduling-delayed-callbacks}@anchor{3906}
@subsubsection Scheduling delayed callbacks


Event loop provides mechanisms to schedule callback functions
to be called at some point in the future.  Event loop uses monotonic
clocks to track time.

@geindex call_later() (asyncio.loop method)
@anchor{library/asyncio-eventloop asyncio loop call_later}@anchor{d02}
@deffn {Method} loop.call_later (delay, callback, *args, context=None)

Schedule `callback' to be called after the given `delay'
number of seconds (can be either an int or a float).

An instance of @ref{1b21,,asyncio.TimerHandle} is returned which can
be used to cancel the callback.

`callback' will be called exactly once.  If two callbacks are
scheduled for exactly the same time, the order in which they
are called is undefined.

The optional positional `args' will be passed to the callback when
it is called. Use @ref{219,,functools.partial()}
@ref{3904,,to pass keyword arguments} to
`callback'.

An optional keyword-only `context' argument allows specifying a
custom @ref{178,,contextvars.Context} for the `callback' to run in.
The current context is used when no `context' is provided.

@cartouche
@quotation Note 
For performance, callbacks scheduled with @code{loop.call_later()}
may run up to one clock-resolution early (see
@code{time.get_clock_info('monotonic').resolution}).
@end quotation
@end cartouche


Changed in version 3.7: The `context' keyword-only parameter was added. See 
@geindex Python Enhancement Proposals; PEP 567
PEP 567@footnote{https://peps.python.org/pep-0567/}
for more details.



Changed in version 3.8: In Python 3.7 and earlier with the default event loop implementation,
the `delay' could not exceed one day.
This has been fixed in Python 3.8.

@end deffn

@geindex call_at() (asyncio.loop method)
@anchor{library/asyncio-eventloop asyncio loop call_at}@anchor{d03}
@deffn {Method} loop.call_at (when, callback, *args, context=None)

Schedule `callback' to be called at the given absolute timestamp
`when' (an int or a float), using the same time reference as
@ref{3907,,loop.time()}.

This method’s behavior is the same as @ref{d02,,call_later()}.

An instance of @ref{1b21,,asyncio.TimerHandle} is returned which can
be used to cancel the callback.

@cartouche
@quotation Note 
For performance, callbacks scheduled with @code{loop.call_at()}
may run up to one clock-resolution early (see
@code{time.get_clock_info('monotonic').resolution}).
@end quotation
@end cartouche


Changed in version 3.7: The `context' keyword-only parameter was added. See 
@geindex Python Enhancement Proposals; PEP 567
PEP 567@footnote{https://peps.python.org/pep-0567/}
for more details.



Changed in version 3.8: In Python 3.7 and earlier with the default event loop implementation,
the difference between `when' and the current time could not exceed
one day.  This has been fixed in Python 3.8.

@end deffn

@geindex time() (asyncio.loop method)
@anchor{library/asyncio-eventloop asyncio loop time}@anchor{3907}
@deffn {Method} loop.time ()

Return the current time, as a @ref{197,,float} value, according to
the event loop’s internal monotonic clock.
@end deffn

@cartouche
@quotation Note 

Changed in version 3.8: In Python 3.7 and earlier timeouts (relative `delay' or absolute `when')
should not exceed one day.  This has been fixed in Python 3.8.

@end quotation
@end cartouche


@subsubheading See also


The @ref{c6a,,asyncio.sleep()} function.


@node Creating futures and tasks,Opening network connections,Scheduling delayed callbacks,Event loop methods
@anchor{library/asyncio-eventloop creating-futures-and-tasks}@anchor{3908}
@subsubsection Creating futures and tasks


@geindex create_future() (asyncio.loop method)
@anchor{library/asyncio-eventloop asyncio loop create_future}@anchor{e7a}
@deffn {Method} loop.create_future ()

Create an @ref{dcc,,asyncio.Future} object attached to the event loop.

This is the preferred way to create Futures in asyncio. This lets
third-party event loops provide alternative implementations of
the Future object (with better performance or instrumentation).


Added in version 3.5.2.

@end deffn

@geindex create_task() (asyncio.loop method)
@anchor{library/asyncio-eventloop asyncio loop create_task}@anchor{1cc}
@deffn {Method} loop.create_task (coro, *, name=None, context=None, eager_start=None, **kwargs)

Schedule the execution of @ref{3830,,coroutine} `coro'.
Return a @ref{1c9,,Task} object.

Third-party event loops can use their own subclass of @ref{1c9,,Task}
for interoperability. In this case, the result type is a subclass
of @code{Task}.

The full function signature is largely the same as that of the
@ref{1c9,,Task} constructor (or factory) - all of the keyword arguments to
this function are passed through to that interface.

If the `name' argument is provided and not @code{None}, it is set as
the name of the task using @ref{bd6,,Task.set_name()}.

An optional keyword-only `context' argument allows specifying a
custom @ref{178,,contextvars.Context} for the `coro' to run in.
The current context copy is created when no `context' is provided.

An optional keyword-only `eager_start' argument allows specifying
if the task should execute eagerly during the call to create_task,
or be scheduled later. If `eager_start' is not passed the mode set
by @ref{1ca,,loop.set_task_factory()} will be used.


Changed in version 3.8: Added the `name' parameter.



Changed in version 3.11: Added the `context' parameter.



Changed in version 3.13.3: Added @code{kwargs} which passes on arbitrary extra parameters, including  @code{name} and @code{context}.



Changed in version 3.13.4: Rolled back the change that passes on `name' and `context' (if it is None),
while still passing on other arbitrary keyword arguments (to avoid breaking backwards compatibility with 3.13.3).



Changed in version 3.14: All `kwargs' are now passed on. The `eager_start' parameter works with eager task factories.

@end deffn

@geindex set_task_factory() (asyncio.loop method)
@anchor{library/asyncio-eventloop asyncio loop set_task_factory}@anchor{1ca}
@deffn {Method} loop.set_task_factory (factory)

Set a task factory that will be used by
@ref{1cc,,loop.create_task()}.

If `factory' is @code{None} the default task factory will be set.
Otherwise, `factory' must be a `callable' with the signature matching
@code{(loop, coro, **kwargs)}, where `loop' is a reference to the active
event loop, and `coro' is a coroutine object.  The callable
must pass on all `kwargs', and return a @ref{1c9,,asyncio.Task}-compatible object.


Changed in version 3.13.3: Required that all `kwargs' are passed on to @ref{1c9,,asyncio.Task}.



Changed in version 3.13.4: `name' is no longer passed to task factories. `context' is no longer passed
to task factories if it is @code{None}.


Changed in version 3.14: `name' and `context' are now unconditionally passed on to task factories again.


@end deffn

@geindex get_task_factory() (asyncio.loop method)
@anchor{library/asyncio-eventloop asyncio loop get_task_factory}@anchor{fcb}
@deffn {Method} loop.get_task_factory ()

Return a task factory or @code{None} if the default one is in use.
@end deffn

@node Opening network connections,Creating network servers,Creating futures and tasks,Event loop methods
@anchor{library/asyncio-eventloop opening-network-connections}@anchor{3909}
@subsubsection Opening network connections


@geindex create_connection() (asyncio.loop method)
@anchor{library/asyncio-eventloop asyncio loop create_connection}@anchor{819}
@deffn {Method} async loop.create_connection (protocol_factory, host=None, port=None, *, ssl=None, family=0, proto=0, flags=0, sock=None, local_addr=None, server_hostname=None, ssl_handshake_timeout=None, ssl_shutdown_timeout=None, happy_eyeballs_delay=None, interleave=None, all_errors=False)

Open a streaming transport connection to a given
address specified by `host' and `port'.

The socket family can be either @ref{1bf0,,AF_INET} or
@ref{1bf1,,AF_INET6} depending on `host' (or the `family'
argument, if provided).

The socket type will be @ref{14ff,,SOCK_STREAM}.

`protocol_factory' must be a callable returning an
@ref{390a,,asyncio protocol} implementation.

This method will try to establish the connection in the background.
When successful, it returns a @code{(transport, protocol)} pair.

The chronological synopsis of the underlying operation is as follows:


@enumerate 

@item 
The connection is established and a @ref{390b,,transport}
is created for it.

@item 
`protocol_factory' is called without arguments and is expected to
return a @ref{390a,,protocol} instance.

@item 
The protocol instance is coupled with the transport by calling its
@ref{390c,,connection_made()} method.

@item 
A @code{(transport, protocol)} tuple is returned on success.
@end enumerate

The created transport is an implementation-dependent bidirectional
stream.

Other arguments:


@itemize *

@item 
`ssl': if given and not false, a SSL/TLS transport is created
(by default a plain TCP transport is created).  If `ssl' is
a @ref{355,,ssl.SSLContext} object, this context is used to create
the transport; if `ssl' is @ref{e0d,,True}, a default context returned
from @ref{480,,ssl.create_default_context()} is used.


@subsubheading See also


@ref{390d,,SSL/TLS security considerations}


@item 
`server_hostname' sets or overrides the hostname that the target
server’s certificate will be matched against.  Should only be passed
if `ssl' is not @code{None}.  By default the value of the `host' argument
is used.  If `host' is empty, there is no default and you must pass a
value for `server_hostname'.  If `server_hostname' is an empty
string, hostname matching is disabled (which is a serious security
risk, allowing for potential man-in-the-middle attacks).

@item 
`family', `proto', `flags' are the optional address family, protocol
and flags to be passed through to getaddrinfo() for `host' resolution.
If given, these should all be integers from the corresponding
@ref{d1,,socket} module constants.

@item 
`happy_eyeballs_delay', if given, enables Happy Eyeballs for this
connection. It should
be a floating-point number representing the amount of time in seconds
to wait for a connection attempt to complete, before starting the next
attempt in parallel. This is the “Connection Attempt Delay” as defined
in 
@geindex RFC; RFC 8305
RFC 8305@footnote{https://datatracker.ietf.org/doc/html/rfc8305.html}. A sensible default value recommended by the RFC is @code{0.25}
(250 milliseconds).

@item 
`interleave' controls address reordering when a host name resolves to
multiple IP addresses.
If @code{0} or unspecified, no reordering is done, and addresses are
tried in the order returned by @ref{e14,,getaddrinfo()}. If a positive integer
is specified, the addresses are interleaved by address family, and the
given integer is interpreted as “First Address Family Count” as defined
in 
@geindex RFC; RFC 8305
RFC 8305@footnote{https://datatracker.ietf.org/doc/html/rfc8305.html}. The default is @code{0} if `happy_eyeballs_delay' is not
specified, and @code{1} if it is.

@item 
`sock', if given, should be an existing, already connected
@ref{fa7,,socket.socket} object to be used by the transport.
If `sock' is given, none of `host', `port', `family', `proto', `flags',
`happy_eyeballs_delay', `interleave'
and `local_addr' should be specified.

@cartouche
@quotation Note 
The `sock' argument transfers ownership of the socket to the
transport created. To close the socket, call the transport’s
@ref{390e,,close()} method.
@end quotation
@end cartouche

@item 
`local_addr', if given, is a @code{(local_host, local_port)} tuple used
to bind the socket locally.  The `local_host' and `local_port'
are looked up using @code{getaddrinfo()}, similarly to `host' and `port'.

@item 
`ssl_handshake_timeout' is (for a TLS connection) the time in seconds
to wait for the TLS handshake to complete before aborting the connection.
@code{60.0} seconds if @code{None} (default).

@item 
`ssl_shutdown_timeout' is the time in seconds to wait for the SSL shutdown
to complete before aborting the connection. @code{30.0} seconds if @code{None}
(default).

@item 
`all_errors' determines what exceptions are raised when a connection cannot
be created. By default, only a single @code{Exception} is raised: the first
exception if there is only one or all errors have same message, or a single
@code{OSError} with the error messages combined. When @code{all_errors} is @code{True},
an @code{ExceptionGroup} will be raised containing all exceptions (even if there
is only one).
@end itemize


Changed in version 3.5: Added support for SSL/TLS in @ref{81e,,ProactorEventLoop}.



Changed in version 3.6: The socket option @ref{d72,,socket.TCP_NODELAY} is set by default
for all TCP connections.



Changed in version 3.7: Added the `ssl_handshake_timeout' parameter.



Changed in version 3.8: Added the `happy_eyeballs_delay' and `interleave' parameters.

Happy Eyeballs Algorithm: Success with Dual-Stack Hosts.
When a server’s IPv4 path and protocol are working, but the server’s
IPv6 path and protocol are not working, a dual-stack client
application experiences significant connection delay compared to an
IPv4-only client.  This is undesirable because it causes the
dual-stack client to have a worse user experience.  This document
specifies requirements for algorithms that reduce this user-visible
delay and provides an algorithm.

For more information: @indicateurl{https://datatracker.ietf.org/doc/html/rfc6555}



Changed in version 3.11: Added the `ssl_shutdown_timeout' parameter.



Changed in version 3.12: `all_errors' was added.



@subsubheading See also


The @ref{d14,,open_connection()} function is a high-level alternative
API.  It returns a pair of (@ref{17b8,,StreamReader}, @ref{1ab6,,StreamWriter})
that can be used directly in async/await code.

@end deffn

@geindex create_datagram_endpoint() (asyncio.loop method)
@anchor{library/asyncio-eventloop asyncio loop create_datagram_endpoint}@anchor{941}
@deffn {Method} async loop.create_datagram_endpoint (protocol_factory, local_addr=None, remote_addr=None, *, family=0, proto=0, flags=0, reuse_port=None, allow_broadcast=None, sock=None)

Create a datagram connection.

The socket family can be either @ref{1bf0,,AF_INET},
@ref{1bf1,,AF_INET6}, or @ref{1bf3,,AF_UNIX},
depending on `host' (or the `family' argument, if provided).

The socket type will be @ref{14fe,,SOCK_DGRAM}.

`protocol_factory' must be a callable returning a
@ref{390a,,protocol} implementation.

A tuple of @code{(transport, protocol)} is returned on success.

Other arguments:


@itemize *

@item 
`local_addr', if given, is a @code{(local_host, local_port)} tuple used
to bind the socket locally.  The `local_host' and `local_port'
are looked up using @ref{e14,,getaddrinfo()}.

@cartouche
@quotation Note 
On Windows, when using the proactor event loop with @code{local_addr=None},
an @ref{2c2,,OSError} with @code{errno.WSAEINVAL} will be raised
when running it.
@end quotation
@end cartouche

@item 
`remote_addr', if given, is a @code{(remote_host, remote_port)} tuple used
to connect the socket to a remote address.  The `remote_host' and
`remote_port' are looked up using @ref{e14,,getaddrinfo()}.

@item 
`family', `proto', `flags' are the optional address family, protocol
and flags to be passed through to @ref{e14,,getaddrinfo()} for `host'
resolution. If given, these should all be integers from the
corresponding @ref{d1,,socket} module constants.

@item 
`reuse_port' tells the kernel to allow this endpoint to be bound to the
same port as other existing endpoints are bound to, so long as they all
set this flag when being created. This option is not supported on Windows
and some Unixes. If the @ref{d72,,socket.SO_REUSEPORT} constant is not
defined then this capability is unsupported.

@item 
`allow_broadcast' tells the kernel to allow this endpoint to send
messages to the broadcast address.

@item 
`sock' can optionally be specified in order to use a preexisting,
already connected, @ref{fa7,,socket.socket} object to be used by the
transport. If specified, `local_addr' and `remote_addr' should be omitted
(must be @ref{887,,None}).

@cartouche
@quotation Note 
The `sock' argument transfers ownership of the socket to the
transport created. To close the socket, call the transport’s
@ref{390e,,close()} method.
@end quotation
@end cartouche
@end itemize

See @ref{390f,,UDP echo client protocol} and
@ref{3910,,UDP echo server protocol} examples.


Changed in version 3.4.4: The `family', `proto', `flags', `reuse_address', `reuse_port',
`allow_broadcast', and `sock' parameters were added.



Changed in version 3.8: Added support for Windows.



Changed in version 3.8.1: The `reuse_address' parameter is no longer supported, as using
@ref{d72,,socket.SO_REUSEADDR}
poses a significant security concern for
UDP. Explicitly passing @code{reuse_address=True} will raise an exception.

When multiple processes with differing UIDs assign sockets to an
identical UDP socket address with @code{SO_REUSEADDR}, incoming packets can
become randomly distributed among the sockets.

For supported platforms, `reuse_port' can be used as a replacement for
similar functionality. With `reuse_port',
@ref{d72,,socket.SO_REUSEPORT}
is used instead, which specifically
prevents processes with differing UIDs from assigning sockets to the same
socket address.



Changed in version 3.11: The `reuse_address' parameter, disabled since Python 3.8.1,
3.7.6 and 3.6.10, has been entirely removed.

@end deffn

@geindex create_unix_connection() (asyncio.loop method)
@anchor{library/asyncio-eventloop asyncio loop create_unix_connection}@anchor{3877}
@deffn {Method} async loop.create_unix_connection (protocol_factory, path=None, *, ssl=None, sock=None, server_hostname=None, ssl_handshake_timeout=None, ssl_shutdown_timeout=None)

Create a Unix connection.

The socket family will be @ref{1bf3,,AF_UNIX}; socket
type will be @ref{14ff,,SOCK_STREAM}.

A tuple of @code{(transport, protocol)} is returned on success.

`path' is the name of a Unix domain socket and is required,
unless a `sock' parameter is specified.  Abstract Unix sockets,
@ref{16a,,str}, @ref{193,,bytes}, and @ref{268,,Path} paths are
supported.

See the documentation of the @ref{819,,loop.create_connection()} method
for information about arguments to this method.

@ref{2181,,Availability}: Unix.


Changed in version 3.7: Added the `ssl_handshake_timeout' parameter.
The `path' parameter can now be a @ref{5a1,,path-like object}.



Changed in version 3.11: Added the `ssl_shutdown_timeout' parameter.

@end deffn

@node Creating network servers,Transferring files,Opening network connections,Event loop methods
@anchor{library/asyncio-eventloop creating-network-servers}@anchor{3911}
@subsubsection Creating network servers


@geindex create_server() (asyncio.loop method)
@anchor{library/asyncio-eventloop loop-create-server}@anchor{3835}@anchor{library/asyncio-eventloop asyncio loop create_server}@anchor{d0f}
@deffn {Method} async loop.create_server (protocol_factory, host=None, port=None, *, family=socket.AF_UNSPEC, flags=socket.AI_PASSIVE, sock=None, backlog=100, ssl=None, reuse_address=None, reuse_port=None, keep_alive=None, ssl_handshake_timeout=None, ssl_shutdown_timeout=None, start_serving=True)

Create a TCP server (socket type @ref{14ff,,SOCK_STREAM}) listening
on `port' of the `host' address.

Returns a @ref{d0e,,Server} object.

Arguments:


@itemize *

@item 
`protocol_factory' must be a callable returning a
@ref{390a,,protocol} implementation.

@item 
The `host' parameter can be set to several types which determine where
the server would be listening:


@itemize -

@item 
If `host' is a string, the TCP server is bound to a single network
interface specified by `host'.

@item 
If `host' is a sequence of strings, the TCP server is bound to all
network interfaces specified by the sequence.

@item 
If `host' is an empty string or @code{None}, all interfaces are
assumed and a list of multiple sockets will be returned (most likely
one for IPv4 and another one for IPv6).
@end itemize

@item 
The `port' parameter can be set to specify which port the server should
listen on. If @code{0} or @code{None} (the default), a random unused port will
be selected (note that if `host' resolves to multiple network interfaces,
a different random port will be selected for each interface).

@item 
`family' can be set to either @ref{1bf0,,socket.AF_INET} or
@ref{1bf1,,AF_INET6} to force the socket to use IPv4 or IPv6.
If not set, the `family' will be determined from host name
(defaults to @ref{3912,,AF_UNSPEC}).

@item 
`flags' is a bitmask for @ref{e14,,getaddrinfo()}.

@item 
`sock' can optionally be specified in order to use a preexisting
socket object. If specified, `host' and `port' must not be specified.

@cartouche
@quotation Note 
The `sock' argument transfers ownership of the socket to the
server created. To close the socket, call the server’s
@ref{3875,,close()} method.
@end quotation
@end cartouche

@item 
`backlog' is the maximum number of queued connections passed to
@ref{1064,,listen()} (defaults to 100).

@item 
`ssl' can be set to an @ref{355,,SSLContext} instance to enable
TLS over the accepted connections.

@item 
`reuse_address' tells the kernel to reuse a local socket in
@code{TIME_WAIT} state, without waiting for its natural timeout to
expire. If not specified will automatically be set to @code{True} on
Unix.

@item 
`reuse_port' tells the kernel to allow this endpoint to be bound to the
same port as other existing endpoints are bound to, so long as they all
set this flag when being created. This option is not supported on
Windows.

@item 
`keep_alive' set to @code{True} keeps connections active by enabling the
periodic transmission of messages.
@end itemize


Changed in version 3.13: Added the `keep_alive' parameter.



@itemize *

@item 
`ssl_handshake_timeout' is (for a TLS server) the time in seconds to wait
for the TLS handshake to complete before aborting the connection.
@code{60.0} seconds if @code{None} (default).

@item 
`ssl_shutdown_timeout' is the time in seconds to wait for the SSL shutdown
to complete before aborting the connection. @code{30.0} seconds if @code{None}
(default).

@item 
`start_serving' set to @code{True} (the default) causes the created server
to start accepting connections immediately.  When set to @code{False},
the user should await on @ref{d10,,Server.start_serving()} or
@ref{d11,,Server.serve_forever()} to make the server to start accepting
connections.
@end itemize


Changed in version 3.5: Added support for SSL/TLS in @ref{81e,,ProactorEventLoop}.



Changed in version 3.5.1: The `host' parameter can be a sequence of strings.



Changed in version 3.6: Added `ssl_handshake_timeout' and `start_serving' parameters.
The socket option @ref{d72,,socket.TCP_NODELAY} is set by default
for all TCP connections.



Changed in version 3.11: Added the `ssl_shutdown_timeout' parameter.



@subsubheading See also


The @ref{d15,,start_server()} function is a higher-level alternative API
that returns a pair of @ref{17b8,,StreamReader} and @ref{1ab6,,StreamWriter}
that can be used in an async/await code.

@end deffn

@geindex create_unix_server() (asyncio.loop method)
@anchor{library/asyncio-eventloop asyncio loop create_unix_server}@anchor{4cb}
@deffn {Method} async loop.create_unix_server (protocol_factory, path=None, *, sock=None, backlog=100, ssl=None, ssl_handshake_timeout=None, ssl_shutdown_timeout=None, start_serving=True, cleanup_socket=True)

Similar to @ref{d0f,,loop.create_server()} but works with the
@ref{1bf3,,AF_UNIX} socket family.

`path' is the name of a Unix domain socket, and is required,
unless a `sock' argument is provided.  Abstract Unix sockets,
@ref{16a,,str}, @ref{193,,bytes}, and @ref{268,,Path} paths
are supported.

If `cleanup_socket' is true then the Unix socket will automatically
be removed from the filesystem when the server is closed, unless the
socket has been replaced after the server has been created.

See the documentation of the @ref{d0f,,loop.create_server()} method
for information about arguments to this method.

@ref{2181,,Availability}: Unix.


Changed in version 3.7: Added the `ssl_handshake_timeout' and `start_serving' parameters.
The `path' parameter can now be a @ref{268,,Path} object.



Changed in version 3.11: Added the `ssl_shutdown_timeout' parameter.



Changed in version 3.13: Added the `cleanup_socket' parameter.

@end deffn

@geindex connect_accepted_socket() (asyncio.loop method)
@anchor{library/asyncio-eventloop asyncio loop connect_accepted_socket}@anchor{9e4}
@deffn {Method} async loop.connect_accepted_socket (protocol_factory, sock, *, ssl=None, ssl_handshake_timeout=None, ssl_shutdown_timeout=None)

Wrap an already accepted connection into a transport/protocol pair.

This method can be used by servers that accept connections outside
of asyncio but that use asyncio to handle them.

Parameters:


@itemize *

@item 
`protocol_factory' must be a callable returning a
@ref{390a,,protocol} implementation.

@item 
`sock' is a preexisting socket object returned from
@ref{fa8,,socket.accept}.

@cartouche
@quotation Note 
The `sock' argument transfers ownership of the socket to the
transport created. To close the socket, call the transport’s
@ref{390e,,close()} method.
@end quotation
@end cartouche

@item 
`ssl' can be set to an @ref{355,,SSLContext} to enable SSL over
the accepted connections.

@item 
`ssl_handshake_timeout' is (for an SSL connection) the time in seconds to
wait for the SSL handshake to complete before aborting the connection.
@code{60.0} seconds if @code{None} (default).

@item 
`ssl_shutdown_timeout' is the time in seconds to wait for the SSL shutdown
to complete before aborting the connection. @code{30.0} seconds if @code{None}
(default).
@end itemize

Returns a @code{(transport, protocol)} pair.


Added in version 3.5.3.



Changed in version 3.7: Added the `ssl_handshake_timeout' parameter.



Changed in version 3.11: Added the `ssl_shutdown_timeout' parameter.

@end deffn

@node Transferring files,TLS upgrade,Creating network servers,Event loop methods
@anchor{library/asyncio-eventloop transferring-files}@anchor{3913}
@subsubsection Transferring files


@geindex sendfile() (asyncio.loop method)
@anchor{library/asyncio-eventloop asyncio loop sendfile}@anchor{3914}
@deffn {Method} async loop.sendfile (transport, file, offset=0, count=None, *, fallback=True)

Send a `file' over a `transport'.  Return the total number of bytes
sent.

The method uses high-performance @ref{d0b,,os.sendfile()} if available.

`file' must be a regular file object opened in binary mode.

`offset' tells from where to start reading the file. If specified,
`count' is the total number of bytes to transmit as opposed to
sending the file until EOF is reached. File position is always updated,
even when this method raises an error, and
@ref{15b8,,file.tell()} can be used to obtain the actual
number of bytes sent.

`fallback' set to @code{True} makes asyncio to manually read and send
the file when the platform does not support the sendfile system call
(e.g. Windows or SSL socket on Unix).

Raise @ref{38ea,,SendfileNotAvailableError} if the system does not support
the `sendfile' syscall and `fallback' is @code{False}.


Added in version 3.7.

@end deffn

@node TLS upgrade,Watching file descriptors,Transferring files,Event loop methods
@anchor{library/asyncio-eventloop tls-upgrade}@anchor{3915}
@subsubsection TLS upgrade


@geindex start_tls() (asyncio.loop method)
@anchor{library/asyncio-eventloop asyncio loop start_tls}@anchor{d05}
@deffn {Method} async loop.start_tls (transport, protocol, sslcontext, *, server_side=False, server_hostname=None, ssl_handshake_timeout=None, ssl_shutdown_timeout=None)

Upgrade an existing transport-based connection to TLS.

Create a TLS coder/decoder instance and insert it between the `transport'
and the `protocol'. The coder/decoder implements both `transport'-facing
protocol and `protocol'-facing transport.

Return the created two-interface instance. After `await', the `protocol'
must stop using the original `transport' and communicate with the returned
object only because the coder caches `protocol'-side data and sporadically
exchanges extra TLS session packets with `transport'.

In some situations (e.g. when the passed transport is already closing) this
may return @code{None}.

Parameters:


@itemize *

@item 
`transport' and `protocol' instances that methods like
@ref{d0f,,create_server()} and
@ref{819,,create_connection()} return.

@item 
`sslcontext': a configured instance of @ref{355,,SSLContext}.

@item 
`server_side' pass @code{True} when a server-side connection is being
upgraded (like the one created by @ref{d0f,,create_server()}).

@item 
`server_hostname': sets or overrides the host name that the target
server’s certificate will be matched against.

@item 
`ssl_handshake_timeout' is (for a TLS connection) the time in seconds to
wait for the TLS handshake to complete before aborting the connection.
@code{60.0} seconds if @code{None} (default).

@item 
`ssl_shutdown_timeout' is the time in seconds to wait for the SSL shutdown
to complete before aborting the connection. @code{30.0} seconds if @code{None}
(default).
@end itemize


Added in version 3.7.



Changed in version 3.11: Added the `ssl_shutdown_timeout' parameter.

@end deffn

@node Watching file descriptors,Working with socket objects directly,TLS upgrade,Event loop methods
@anchor{library/asyncio-eventloop watching-file-descriptors}@anchor{3916}
@subsubsection Watching file descriptors


@geindex add_reader() (asyncio.loop method)
@anchor{library/asyncio-eventloop asyncio loop add_reader}@anchor{3892}
@deffn {Method} loop.add_reader (fd, callback, *args)

Start monitoring the `fd' file descriptor for read availability and
invoke `callback' with the specified arguments once `fd' is available for
reading.

Any preexisting callback registered for `fd' is cancelled and replaced by
`callback'.
@end deffn

@geindex remove_reader() (asyncio.loop method)
@anchor{library/asyncio-eventloop asyncio loop remove_reader}@anchor{3917}
@deffn {Method} loop.remove_reader (fd)

Stop monitoring the `fd' file descriptor for read availability. Returns
@code{True} if `fd' was previously being monitored for reads.
@end deffn

@geindex add_writer() (asyncio.loop method)
@anchor{library/asyncio-eventloop asyncio loop add_writer}@anchor{3918}
@deffn {Method} loop.add_writer (fd, callback, *args)

Start monitoring the `fd' file descriptor for write availability and
invoke `callback' with the specified arguments `args' once `fd' is
available for writing.

Any preexisting callback registered for `fd' is cancelled and replaced by
`callback'.

Use @ref{219,,functools.partial()} @ref{3904,,to pass keyword arguments} to `callback'.
@end deffn

@geindex remove_writer() (asyncio.loop method)
@anchor{library/asyncio-eventloop asyncio loop remove_writer}@anchor{3919}
@deffn {Method} loop.remove_writer (fd)

Stop monitoring the `fd' file descriptor for write availability. Returns
@code{True} if `fd' was previously being monitored for writes.
@end deffn

See also @ref{391a,,Platform Support} section
for some limitations of these methods.

@node Working with socket objects directly,DNS,Watching file descriptors,Event loop methods
@anchor{library/asyncio-eventloop working-with-socket-objects-directly}@anchor{391b}
@subsubsection Working with socket objects directly


In general, protocol implementations that use transport-based APIs
such as @ref{819,,loop.create_connection()} and @ref{d0f,,loop.create_server()}
are faster than implementations that work with sockets directly.
However, there are some use cases when performance is not critical, and
working with @ref{fa7,,socket} objects directly is more
convenient.

@geindex sock_recv() (asyncio.loop method)
@anchor{library/asyncio-eventloop asyncio loop sock_recv}@anchor{e11}
@deffn {Method} async loop.sock_recv (sock, nbytes)

Receive up to `nbytes' from `sock'.  Asynchronous version of
@ref{faa,,socket.recv()}.

Return the received data as a bytes object.

`sock' must be a non-blocking socket.


Changed in version 3.7: Even though this method was always documented as a coroutine
method, releases before Python 3.7 returned a @ref{dcc,,Future}.
Since Python 3.7 this is an @code{async def} method.

@end deffn

@geindex sock_recv_into() (asyncio.loop method)
@anchor{library/asyncio-eventloop asyncio loop sock_recv_into}@anchor{d06}
@deffn {Method} async loop.sock_recv_into (sock, buf)

Receive data from `sock' into the `buf' buffer.  Modeled after the blocking
@ref{1529,,socket.recv_into()} method.

Return the number of bytes written to the buffer.

`sock' must be a non-blocking socket.


Added in version 3.7.

@end deffn

@geindex sock_recvfrom() (asyncio.loop method)
@anchor{library/asyncio-eventloop asyncio loop sock_recvfrom}@anchor{81c}
@deffn {Method} async loop.sock_recvfrom (sock, bufsize)

Receive a datagram of up to `bufsize' from `sock'.  Asynchronous version of
@ref{fab,,socket.recvfrom()}.

Return a tuple of (received data, remote address).

`sock' must be a non-blocking socket.


Added in version 3.11.

@end deffn

@geindex sock_recvfrom_into() (asyncio.loop method)
@anchor{library/asyncio-eventloop asyncio loop sock_recvfrom_into}@anchor{81d}
@deffn {Method} async loop.sock_recvfrom_into (sock, buf, nbytes=0)

Receive a datagram of up to `nbytes' from `sock' into `buf'.
Asynchronous version of
@ref{152a,,socket.recvfrom_into()}.

Return a tuple of (number of bytes received, remote address).

`sock' must be a non-blocking socket.


Added in version 3.11.

@end deffn

@geindex sock_sendall() (asyncio.loop method)
@anchor{library/asyncio-eventloop asyncio loop sock_sendall}@anchor{e12}
@deffn {Method} async loop.sock_sendall (sock, data)

Send `data' to the `sock' socket. Asynchronous version of
@ref{fae,,socket.sendall()}.

This method continues to send to the socket until either all data
in `data' has been sent or an error occurs.  @code{None} is returned
on success.  On error, an exception is raised. Additionally, there is no way
to determine how much data, if any, was successfully processed by the
receiving end of the connection.

`sock' must be a non-blocking socket.


Changed in version 3.7: Even though the method was always documented as a coroutine
method, before Python 3.7 it returned a @ref{dcc,,Future}.
Since Python 3.7, this is an @code{async def} method.

@end deffn

@geindex sock_sendto() (asyncio.loop method)
@anchor{library/asyncio-eventloop asyncio loop sock_sendto}@anchor{81b}
@deffn {Method} async loop.sock_sendto (sock, data, address)

Send a datagram from `sock' to `address'.
Asynchronous version of
@ref{faf,,socket.sendto()}.

Return the number of bytes sent.

`sock' must be a non-blocking socket.


Added in version 3.11.

@end deffn

@geindex sock_connect() (asyncio.loop method)
@anchor{library/asyncio-eventloop asyncio loop sock_connect}@anchor{fce}
@deffn {Method} async loop.sock_connect (sock, address)

Connect `sock' to a remote socket at `address'.

Asynchronous version of @ref{fa9,,socket.connect()}.

`sock' must be a non-blocking socket.


Changed in version 3.5.2: @code{address} no longer needs to be resolved.  @code{sock_connect}
will try to check if the `address' is already resolved by calling
@ref{b61,,socket.inet_pton()}.  If not,
@ref{e14,,loop.getaddrinfo()} will be used to resolve the
`address'.



@subsubheading See also


@ref{819,,loop.create_connection()}
and  @ref{d14,,asyncio.open_connection()}.

@end deffn

@geindex sock_accept() (asyncio.loop method)
@anchor{library/asyncio-eventloop asyncio loop sock_accept}@anchor{e13}
@deffn {Method} async loop.sock_accept (sock)

Accept a connection.  Modeled after the blocking
@ref{fa8,,socket.accept()} method.

The socket must be bound to an address and listening
for connections. The return value is a pair @code{(conn, address)} where `conn'
is a `new' socket object usable to send and receive data on the connection,
and `address' is the address bound to the socket on the other end of the
connection.

`sock' must be a non-blocking socket.


Changed in version 3.7: Even though the method was always documented as a coroutine
method, before Python 3.7 it returned a @ref{dcc,,Future}.
Since Python 3.7, this is an @code{async def} method.



@subsubheading See also


@ref{d0f,,loop.create_server()} and @ref{d15,,start_server()}.

@end deffn

@geindex sock_sendfile() (asyncio.loop method)
@anchor{library/asyncio-eventloop asyncio loop sock_sendfile}@anchor{d0a}
@deffn {Method} async loop.sock_sendfile (sock, file, offset=0, count=None, *, fallback=True)

Send a file using high-performance @ref{d0b,,os.sendfile} if possible.
Return the total number of bytes sent.

Asynchronous version of @ref{1063,,socket.sendfile()}.

`sock' must be a non-blocking @ref{14ff,,socket.SOCK_STREAM}
@ref{fa7,,socket}.

`file' must be a regular file object open in binary mode.

`offset' tells from where to start reading the file. If specified,
`count' is the total number of bytes to transmit as opposed to
sending the file until EOF is reached. File position is always updated,
even when this method raises an error, and
@ref{15b8,,file.tell()} can be used to obtain the actual
number of bytes sent.

`fallback', when set to @code{True}, makes asyncio manually read and send
the file when the platform does not support the sendfile syscall
(e.g. Windows or SSL socket on Unix).

Raise @ref{38ea,,SendfileNotAvailableError} if the system does not support
`sendfile' syscall and `fallback' is @code{False}.

`sock' must be a non-blocking socket.


Added in version 3.7.

@end deffn

@node DNS,Working with pipes,Working with socket objects directly,Event loop methods
@anchor{library/asyncio-eventloop dns}@anchor{391c}
@subsubsection DNS


@geindex getaddrinfo() (asyncio.loop method)
@anchor{library/asyncio-eventloop asyncio loop getaddrinfo}@anchor{e14}
@deffn {Method} async loop.getaddrinfo (host, port, *, family=0, type=0, proto=0, flags=0)

Asynchronous version of @ref{17a8,,socket.getaddrinfo()}.
@end deffn

@geindex getnameinfo() (asyncio.loop method)
@anchor{library/asyncio-eventloop asyncio loop getnameinfo}@anchor{e15}
@deffn {Method} async loop.getnameinfo (sockaddr, flags=0)

Asynchronous version of @ref{1a81,,socket.getnameinfo()}.
@end deffn

@cartouche
@quotation Note 
Both `getaddrinfo' and `getnameinfo' internally utilize their synchronous
versions through the loop’s default thread pool executor.
When this executor is saturated, these methods may experience delays,
which higher-level networking libraries may report as increased timeouts.
To mitigate this, consider using a custom executor for other user tasks,
or setting a default executor with a larger number of workers.
@end quotation
@end cartouche


Changed in version 3.7: Both `getaddrinfo' and `getnameinfo' methods were always documented
to return a coroutine, but prior to Python 3.7 they were, in fact,
returning @ref{dcc,,asyncio.Future} objects.  Starting with Python 3.7
both methods are coroutines.


@node Working with pipes,Unix signals,DNS,Event loop methods
@anchor{library/asyncio-eventloop working-with-pipes}@anchor{391d}
@subsubsection Working with pipes


@geindex connect_read_pipe() (asyncio.loop method)
@anchor{library/asyncio-eventloop asyncio loop connect_read_pipe}@anchor{38be}
@deffn {Method} async loop.connect_read_pipe (protocol_factory, pipe)

Register the read end of `pipe' in the event loop.

`protocol_factory' must be a callable returning an
@ref{390a,,asyncio protocol} implementation.

`pipe' is a @ref{13cf,,file-like object}.

Return pair @code{(transport, protocol)}, where `transport' supports
the @ref{391e,,ReadTransport} interface and `protocol' is an object
instantiated by the `protocol_factory'.

With @ref{316,,SelectorEventLoop} event loop, the `pipe' is set to
non-blocking mode.
@end deffn

@geindex connect_write_pipe() (asyncio.loop method)
@anchor{library/asyncio-eventloop asyncio loop connect_write_pipe}@anchor{38bf}
@deffn {Method} async loop.connect_write_pipe (protocol_factory, pipe)

Register the write end of `pipe' in the event loop.

`protocol_factory' must be a callable returning an
@ref{390a,,asyncio protocol} implementation.

`pipe' is @ref{13cf,,file-like object}.

Return pair @code{(transport, protocol)}, where `transport' supports
@ref{391f,,WriteTransport} interface and `protocol' is an object
instantiated by the `protocol_factory'.

With @ref{316,,SelectorEventLoop} event loop, the `pipe' is set to
non-blocking mode.
@end deffn

@cartouche
@quotation Note 
@ref{316,,SelectorEventLoop} does not support the above methods on
Windows.  Use @ref{81e,,ProactorEventLoop} instead for Windows.
@end quotation
@end cartouche


@subsubheading See also


The @ref{38bb,,loop.subprocess_exec()} and
@ref{38bc,,loop.subprocess_shell()} methods.


@node Unix signals,Executing code in thread or process pools,Working with pipes,Event loop methods
@anchor{library/asyncio-eventloop unix-signals}@anchor{3920}
@subsubsection Unix signals


@geindex add_signal_handler() (asyncio.loop method)
@anchor{library/asyncio-eventloop loop-add-signal-handler}@anchor{3837}@anchor{library/asyncio-eventloop asyncio loop add_signal_handler}@anchor{3921}
@deffn {Method} loop.add_signal_handler (signum, callback, *args)

Set `callback' as the handler for the `signum' signal,
passing `args' as positional arguments.

The callback will be invoked by `loop', along with other queued callbacks
and runnable coroutines of that event loop. Unlike signal handlers
registered using @ref{1340,,signal.signal()}, a callback registered with this
function is allowed to interact with the event loop.

Raise @ref{2ee,,ValueError} if the signal number is invalid or uncatchable.
Raise @ref{246,,RuntimeError} if there is a problem setting up the handler.

Use @ref{219,,functools.partial()} @ref{3904,,to pass keyword arguments} to `callback'.

Like @ref{1340,,signal.signal()}, this function must be invoked in the main
thread.
@end deffn

@geindex remove_signal_handler() (asyncio.loop method)
@anchor{library/asyncio-eventloop asyncio loop remove_signal_handler}@anchor{3922}
@deffn {Method} loop.remove_signal_handler (sig)

Remove the handler for the `sig' signal.

Return @code{True} if the signal handler was removed, or @code{False} if
no handler was set for the given signal.

@ref{2181,,Availability}: Unix.
@end deffn


@subsubheading See also


The @ref{cb,,signal} module.


@node Executing code in thread or process pools,Error handling API,Unix signals,Event loop methods
@anchor{library/asyncio-eventloop executing-code-in-thread-or-process-pools}@anchor{3923}
@subsubsection Executing code in thread or process pools


@geindex run_in_executor() (asyncio.loop method)
@anchor{library/asyncio-eventloop asyncio loop run_in_executor}@anchor{aec}
@deffn {Method} awaitable loop.run_in_executor (executor, func, *args)

Arrange for `func' to be called in the specified executor
passing `args' as positional arguments.

The `executor' argument should be an @ref{375c,,concurrent.futures.Executor}
instance. The default executor is used if `executor' is @code{None}.
The default executor can be set by @ref{94f,,loop.set_default_executor()},
otherwise, a @ref{94e,,concurrent.futures.ThreadPoolExecutor} will be
lazy-initialized and used by @ref{aec,,run_in_executor()} if needed.

Example:

@example
import asyncio
import concurrent.futures

def blocking_io():
    # File operations (such as logging) can block the
    # event loop: run them in a thread pool.
    with open('/dev/urandom', 'rb') as f:
        return f.read(100)

def cpu_bound():
    # CPU-bound operations will block the event loop:
    # in general it is preferable to run them in a
    # process pool.
    return sum(i * i for i in range(10 ** 7))

async def main():
    loop = asyncio.get_running_loop()

    ## Options:

    # 1. Run in the default loop's executor:
    result = await loop.run_in_executor(
        None, blocking_io)
    print('default thread pool', result)

    # 2. Run in a custom thread pool:
    with concurrent.futures.ThreadPoolExecutor() as pool:
        result = await loop.run_in_executor(
            pool, blocking_io)
        print('custom thread pool', result)

    # 3. Run in a custom process pool:
    with concurrent.futures.ProcessPoolExecutor() as pool:
        result = await loop.run_in_executor(
            pool, cpu_bound)
        print('custom process pool', result)

    # 4. Run in a custom interpreter pool:
    with concurrent.futures.InterpreterPoolExecutor() as pool:
        result = await loop.run_in_executor(
            pool, cpu_bound)
        print('custom interpreter pool', result)

if __name__ == '__main__':
    asyncio.run(main())
@end example

Note that the entry point guard (@code{if __name__ == '__main__'})
is required for option 3 due to the peculiarities of @ref{98,,multiprocessing},
which is used by @ref{1d8,,ProcessPoolExecutor}.
See @ref{3745,,Safe importing of main module}.

This method returns a @ref{dcc,,asyncio.Future} object.

Use @ref{219,,functools.partial()} @ref{3904,,to pass keyword arguments} to `func'.


Changed in version 3.5.3: @code{loop.run_in_executor()} no longer configures the
@code{max_workers} of the thread pool executor it creates, instead
leaving it up to the thread pool executor
(@ref{94e,,ThreadPoolExecutor}) to set the
default.

@end deffn

@geindex set_default_executor() (asyncio.loop method)
@anchor{library/asyncio-eventloop asyncio loop set_default_executor}@anchor{94f}
@deffn {Method} loop.set_default_executor (executor)

Set `executor' as the default executor used by @ref{aec,,run_in_executor()}.
`executor' must be an instance of
@ref{94e,,ThreadPoolExecutor}, which includes
@ref{1d4,,InterpreterPoolExecutor}.


Changed in version 3.11: `executor' must be an instance of
@ref{94e,,ThreadPoolExecutor}.

@end deffn

@node Error handling API,Enabling debug mode,Executing code in thread or process pools,Event loop methods
@anchor{library/asyncio-eventloop error-handling-api}@anchor{3924}
@subsubsection Error handling API


Allows customizing how exceptions are handled in the event loop.

@geindex set_exception_handler() (asyncio.loop method)
@anchor{library/asyncio-eventloop asyncio loop set_exception_handler}@anchor{3925}
@deffn {Method} loop.set_exception_handler (handler)

Set `handler' as the new event loop exception handler.

If `handler' is @code{None}, the default exception handler will
be set.  Otherwise, `handler' must be a callable with the signature
matching @code{(loop, context)}, where @code{loop}
is a reference to the active event loop, and @code{context}
is a @code{dict} object containing the details of the exception
(see @ref{3926,,call_exception_handler()} documentation for details
about context).

If the handler is called on behalf of a @ref{1c9,,Task} or
@ref{1ec6,,Handle}, it is run in the
@ref{178,,contextvars.Context} of that task or callback handle.


Changed in version 3.12: The handler may be called in the @ref{178,,Context}
of the task or handle where the exception originated.

@end deffn

@geindex get_exception_handler() (asyncio.loop method)
@anchor{library/asyncio-eventloop asyncio loop get_exception_handler}@anchor{e7b}
@deffn {Method} loop.get_exception_handler ()

Return the current exception handler, or @code{None} if no custom
exception handler was set.


Added in version 3.5.2.

@end deffn

@geindex default_exception_handler() (asyncio.loop method)
@anchor{library/asyncio-eventloop asyncio loop default_exception_handler}@anchor{3927}
@deffn {Method} loop.default_exception_handler (context)

Default exception handler.

This is called when an exception occurs and no exception
handler is set. This can be called by a custom exception
handler that wants to defer to the default handler behavior.

`context' parameter has the same meaning as in
@ref{3926,,call_exception_handler()}.
@end deffn

@geindex call_exception_handler() (asyncio.loop method)
@anchor{library/asyncio-eventloop asyncio loop call_exception_handler}@anchor{3926}
@deffn {Method} loop.call_exception_handler (context)

Call the current event loop exception handler.

`context' is a @code{dict} object containing the following keys
(new keys may be introduced in future Python versions):


@itemize *

@item 
‘message’: Error message;

@item 
‘exception’ (optional): Exception object;

@item 
‘future’ (optional): @ref{dcc,,asyncio.Future} instance;

@item 
‘task’ (optional): @ref{1c9,,asyncio.Task} instance;

@item 
‘handle’ (optional): @ref{1ec6,,asyncio.Handle} instance;

@item 
‘protocol’ (optional): @ref{390a,,Protocol} instance;

@item 
‘transport’ (optional): @ref{390b,,Transport} instance;

@item 
‘socket’ (optional): @ref{fa7,,socket.socket} instance;

@item 
‘source_traceback’ (optional): Traceback of the source;

@item 
‘handle_traceback’ (optional): Traceback of the handle;

@item 

@table @asis

@item ‘asyncgen’ (optional): Asynchronous generator that caused

the exception.
@end table
@end itemize

@cartouche
@quotation Note 
This method should not be overloaded in subclassed
event loops.  For custom exception handling, use
the @ref{3925,,set_exception_handler()} method.
@end quotation
@end cartouche
@end deffn

@node Enabling debug mode,Running subprocesses,Error handling API,Event loop methods
@anchor{library/asyncio-eventloop enabling-debug-mode}@anchor{3928}
@subsubsection Enabling debug mode


@geindex get_debug() (asyncio.loop method)
@anchor{library/asyncio-eventloop asyncio loop get_debug}@anchor{fc8}
@deffn {Method} loop.get_debug ()

Get the debug mode (@ref{3c1,,bool}) of the event loop.

The default value is @code{True} if the environment variable
@geindex PYTHONASYNCIODEBUG
@geindex environment variable; PYTHONASYNCIODEBUG
@ref{217c,,PYTHONASYNCIODEBUG} is set to a non-empty string, @code{False}
otherwise.
@end deffn

@geindex set_debug() (asyncio.loop method)
@anchor{library/asyncio-eventloop asyncio loop set_debug}@anchor{fc7}
@deffn {Method} loop.set_debug (enabled: bool)

Set the debug mode of the event loop.


Changed in version 3.7: The new @ref{509,,Python Development Mode} can now also be used
to enable the debug mode.

@end deffn

@geindex slow_callback_duration (asyncio.loop attribute)
@anchor{library/asyncio-eventloop asyncio loop slow_callback_duration}@anchor{3929}
@deffn {Attribute} loop.slow_callback_duration

This attribute can be used to set the
minimum execution duration in seconds that is considered “slow”.
When debug mode is enabled, “slow” callbacks are logged.

Default value is 100 milliseconds.
@end deffn


@subsubheading See also


The @ref{217d,,debug mode of asyncio}.


@node Running subprocesses,,Enabling debug mode,Event loop methods
@anchor{library/asyncio-eventloop running-subprocesses}@anchor{392a}
@subsubsection Running subprocesses


Methods described in this subsections are low-level.  In regular
async/await code consider using the high-level
@ref{c72,,asyncio.create_subprocess_shell()} and
@ref{c71,,asyncio.create_subprocess_exec()} convenience functions instead.

@cartouche
@quotation Note 
On Windows, the default event loop @ref{81e,,ProactorEventLoop} supports
subprocesses, whereas @ref{316,,SelectorEventLoop} does not. See
@ref{38bd,,Subprocess Support on Windows} for
details.
@end quotation
@end cartouche

@geindex subprocess_exec() (asyncio.loop method)
@anchor{library/asyncio-eventloop loop-subprocess-exec}@anchor{3836}@anchor{library/asyncio-eventloop asyncio loop subprocess_exec}@anchor{38bb}
@deffn {Method} async loop.subprocess_exec (protocol_factory, *args, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, **kwargs)

Create a subprocess from one or more string arguments specified by
`args'.

`args' must be a list of strings represented by:


@itemize *

@item 
@ref{16a,,str};

@item 
or @ref{193,,bytes}, encoded to the
@ref{2ca6,,filesystem encoding}.
@end itemize

The first string specifies the program executable,
and the remaining strings specify the arguments.  Together, string
arguments form the @code{argv} of the program.

This is similar to the standard library @ref{4b8,,subprocess.Popen}
class called with @code{shell=False} and the list of strings passed as
the first argument; however, where @code{Popen} takes
a single argument which is list of strings, `subprocess_exec'
takes multiple string arguments.

The `protocol_factory' must be a callable returning a subclass of the
@ref{392b,,asyncio.SubprocessProtocol} class.

Other parameters:


@itemize *

@item 
`stdin' can be any of these:


@itemize *

@item 
a file-like object

@item 
an existing file descriptor (a positive integer), for example those created with @ref{1ba8,,os.pipe()}

@item 
the @ref{d86,,subprocess.PIPE} constant (default) which will create a new
pipe and connect it,

@item 
the value @code{None} which will make the subprocess inherit the file
descriptor from this process

@item 
the @ref{135a,,subprocess.DEVNULL} constant which indicates that the
special @ref{1e56,,os.devnull} file will be used
@end itemize

@item 
`stdout' can be any of these:


@itemize *

@item 
a file-like object

@item 
the @ref{d86,,subprocess.PIPE} constant (default) which will create a new
pipe and connect it,

@item 
the value @code{None} which will make the subprocess inherit the file
descriptor from this process

@item 
the @ref{135a,,subprocess.DEVNULL} constant which indicates that the
special @ref{1e56,,os.devnull} file will be used
@end itemize

@item 
`stderr' can be any of these:


@itemize *

@item 
a file-like object

@item 
the @ref{d86,,subprocess.PIPE} constant (default) which will create a new
pipe and connect it,

@item 
the value @code{None} which will make the subprocess inherit the file
descriptor from this process

@item 
the @ref{135a,,subprocess.DEVNULL} constant which indicates that the
special @ref{1e56,,os.devnull} file will be used

@item 
the @ref{37a5,,subprocess.STDOUT} constant which will connect the standard
error stream to the process’ standard output stream
@end itemize

@item 
All other keyword arguments are passed to @ref{4b8,,subprocess.Popen}
without interpretation, except for `bufsize', `universal_newlines',
`shell', `text', `encoding' and `errors', which should not be specified
at all.

The @code{asyncio} subprocess API does not support decoding the streams
as text. @ref{ad9,,bytes.decode()} can be used to convert the bytes returned
from the stream to text.
@end itemize

If a file-like object passed as `stdin', `stdout' or `stderr' represents a
pipe, then the other side of this pipe should be registered with
@ref{38bf,,connect_write_pipe()} or @ref{38be,,connect_read_pipe()} for use
with the event loop.

See the constructor of the @ref{4b8,,subprocess.Popen} class
for documentation on other arguments.

Returns a pair of @code{(transport, protocol)}, where `transport'
conforms to the @ref{392c,,asyncio.SubprocessTransport} base class and
`protocol' is an object instantiated by the `protocol_factory'.

If the transport is closed or is garbage collected, the child process
is killed if it is still running.
@end deffn

@geindex subprocess_shell() (asyncio.loop method)
@anchor{library/asyncio-eventloop asyncio loop subprocess_shell}@anchor{38bc}
@deffn {Method} async loop.subprocess_shell (protocol_factory, cmd, *, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, **kwargs)

Create a subprocess from `cmd', which can be a @ref{16a,,str} or a
@ref{193,,bytes} string encoded to the
@ref{2ca6,,filesystem encoding},
using the platform’s “shell” syntax.

This is similar to the standard library @ref{4b8,,subprocess.Popen}
class called with @code{shell=True}.

The `protocol_factory' must be a callable returning a subclass of the
@ref{392b,,SubprocessProtocol} class.

See @ref{38bb,,subprocess_exec()} for more details about
the remaining arguments.

Returns a pair of @code{(transport, protocol)}, where `transport'
conforms to the @ref{392c,,SubprocessTransport} base class and
`protocol' is an object instantiated by the `protocol_factory'.

If the transport is closed or is garbage collected, the child process
is killed if it is still running.
@end deffn

@cartouche
@quotation Note 
It is the application’s responsibility to ensure that all whitespace
and special characters are quoted appropriately to avoid shell injection@footnote{https://en.wikipedia.org/wiki/Shell_injection#Shell_injection}
vulnerabilities. The @ref{582,,shlex.quote()} function can be used to
properly escape whitespace and special characters in strings that
are going to be used to construct shell commands.
@end quotation
@end cartouche

@node Callback handles,Server objects,Event loop methods,Event loop
@anchor{library/asyncio-eventloop callback-handles}@anchor{38fa}
@subsubsection Callback handles


@geindex Handle (class in asyncio)
@anchor{library/asyncio-eventloop asyncio Handle}@anchor{1ec6}
@deffn {Class} asyncio.Handle

A callback wrapper object returned by @ref{d00,,loop.call_soon()},
@ref{d01,,loop.call_soon_threadsafe()}.

@geindex get_context() (asyncio.Handle method)
@anchor{library/asyncio-eventloop asyncio Handle get_context}@anchor{392d}
@deffn {Method} get_context ()

Return the @ref{178,,contextvars.Context} object
associated with the handle.


Added in version 3.12.

@end deffn

@geindex cancel() (asyncio.Handle method)
@anchor{library/asyncio-eventloop asyncio Handle cancel}@anchor{392e}
@deffn {Method} cancel ()

Cancel the callback.  If the callback has already been canceled
or executed, this method has no effect.
@end deffn

@geindex cancelled() (asyncio.Handle method)
@anchor{library/asyncio-eventloop asyncio Handle cancelled}@anchor{d16}
@deffn {Method} cancelled ()

Return @code{True} if the callback was cancelled.


Added in version 3.7.

@end deffn
@end deffn

@geindex TimerHandle (class in asyncio)
@anchor{library/asyncio-eventloop asyncio TimerHandle}@anchor{1b21}
@deffn {Class} asyncio.TimerHandle

A callback wrapper object returned by @ref{d02,,loop.call_later()},
and @ref{d03,,loop.call_at()}.

This class is a subclass of @ref{1ec6,,Handle}.

@geindex when() (asyncio.TimerHandle method)
@anchor{library/asyncio-eventloop asyncio TimerHandle when}@anchor{d13}
@deffn {Method} when ()

Return a scheduled callback time as @ref{197,,float} seconds.

The time is an absolute timestamp, using the same time
reference as @ref{3907,,loop.time()}.


Added in version 3.7.

@end deffn
@end deffn

@node Server objects,Event loop implementations,Callback handles,Event loop
@anchor{library/asyncio-eventloop server-objects}@anchor{38fb}
@subsubsection Server objects


Server objects are created by @ref{d0f,,loop.create_server()},
@ref{4cb,,loop.create_unix_server()}, @ref{d15,,start_server()},
and @ref{3878,,start_unix_server()} functions.

Do not instantiate the @ref{d0e,,Server} class directly.

@geindex Server (class in asyncio)
@anchor{library/asyncio-eventloop asyncio Server}@anchor{d0e}
@deffn {Class} asyncio.Server

`Server' objects are asynchronous context managers.  When used in an
@code{async with} statement, it’s guaranteed that the Server object is
closed and not accepting new connections when the @code{async with}
statement is completed:

@example
srv = await loop.create_server(...)

async with srv:
    # some code

# At this point, srv is closed and no longer accepts new connections.
@end example


Changed in version 3.7: Server object is an asynchronous context manager since Python 3.7.



Changed in version 3.11: This class was exposed publicly as @code{asyncio.Server} in Python 3.9.11, 3.10.3 and 3.11.


@geindex close() (asyncio.Server method)
@anchor{library/asyncio-eventloop asyncio Server close}@anchor{3875}
@deffn {Method} close ()

Stop serving: close listening sockets and set the @ref{e16,,sockets}
attribute to @code{None}.

The sockets that represent existing incoming client connections
are left open.

The server is closed asynchronously; use the @ref{1a85,,wait_closed()}
coroutine to wait until the server is closed (and no more
connections are active).
@end deffn

@geindex close_clients() (asyncio.Server method)
@anchor{library/asyncio-eventloop asyncio Server close_clients}@anchor{4cf}
@deffn {Method} close_clients ()

Close all existing incoming client connections.

Calls @ref{390e,,close()} on all associated
transports.

@ref{3875,,close()} should be called before @code{close_clients()} when
closing the server to avoid races with new clients connecting.


Added in version 3.13.

@end deffn

@geindex abort_clients() (asyncio.Server method)
@anchor{library/asyncio-eventloop asyncio Server abort_clients}@anchor{4d0}
@deffn {Method} abort_clients ()

Close all existing incoming client connections immediately,
without waiting for pending operations to complete.

Calls @ref{392f,,abort()} on all associated
transports.

@ref{3875,,close()} should be called before @code{abort_clients()} when
closing the server to avoid races with new clients connecting.


Added in version 3.13.

@end deffn

@geindex get_loop() (asyncio.Server method)
@anchor{library/asyncio-eventloop asyncio Server get_loop}@anchor{d0d}
@deffn {Method} get_loop ()

Return the event loop associated with the server object.


Added in version 3.7.

@end deffn

@geindex start_serving() (asyncio.Server method)
@anchor{library/asyncio-eventloop asyncio Server start_serving}@anchor{d10}
@deffn {Method} async start_serving ()

Start accepting connections.

This method is idempotent, so it can be called when
the server is already serving.

The `start_serving' keyword-only parameter to
@ref{d0f,,loop.create_server()} and
@ref{d15,,asyncio.start_server()} allows creating a Server object
that is not accepting connections initially.  In this case
@code{Server.start_serving()}, or @ref{d11,,Server.serve_forever()} can be used
to make the Server start accepting connections.


Added in version 3.7.

@end deffn

@geindex serve_forever() (asyncio.Server method)
@anchor{library/asyncio-eventloop asyncio Server serve_forever}@anchor{d11}
@deffn {Method} async serve_forever ()

Start accepting connections until the coroutine is cancelled.
Cancellation of @code{serve_forever} task causes the server
to be closed.

This method can be called if the server is already accepting
connections.  Only one @code{serve_forever} task can exist per
one `Server' object.

Example:

@example
async def client_connected(reader, writer):
    # Communicate with the client with
    # reader/writer streams.  For example:
    await reader.readline()

async def main(host, port):
    srv = await asyncio.start_server(
        client_connected, host, port)
    await srv.serve_forever()

asyncio.run(main('127.0.0.1', 0))
@end example


Added in version 3.7.

@end deffn

@geindex is_serving() (asyncio.Server method)
@anchor{library/asyncio-eventloop asyncio Server is_serving}@anchor{d12}
@deffn {Method} is_serving ()

Return @code{True} if the server is accepting new connections.


Added in version 3.7.

@end deffn

@geindex wait_closed() (asyncio.Server method)
@anchor{library/asyncio-eventloop asyncio Server wait_closed}@anchor{1a85}
@deffn {Method} async wait_closed ()

Wait until the @ref{3875,,close()} method completes and all active
connections have finished.
@end deffn

@geindex sockets (asyncio.Server attribute)
@anchor{library/asyncio-eventloop asyncio Server sockets}@anchor{e16}
@deffn {Attribute} sockets

List of socket-like objects, @code{asyncio.trsock.TransportSocket}, which
the server is listening on.


Changed in version 3.7: Prior to Python 3.7 @code{Server.sockets} used to return an
internal list of server sockets directly.  In 3.7 a copy
of that list is returned.

@end deffn
@end deffn
@anchor{library/asyncio-eventloop asyncio-event-loops}@anchor{3930}
@node Event loop implementations,Examples<19>,Server objects,Event loop
@anchor{library/asyncio-eventloop asyncio-event-loop-implementations}@anchor{3931}@anchor{library/asyncio-eventloop event-loop-implementations}@anchor{38fc}
@subsubsection Event loop implementations


asyncio ships with two different event loop implementations:
@ref{316,,SelectorEventLoop} and @ref{81e,,ProactorEventLoop}.

By default asyncio is configured to use @ref{1aad,,EventLoop}.

@geindex SelectorEventLoop (class in asyncio)
@anchor{library/asyncio-eventloop asyncio SelectorEventLoop}@anchor{316}
@deffn {Class} asyncio.SelectorEventLoop

A subclass of @ref{b5e,,AbstractEventLoop} based on the
@ref{c7,,selectors} module.

Uses the most efficient `selector' available for the given
platform.  It is also possible to manually configure the
exact selector implementation to be used:

@example
import asyncio
import selectors

async def main():
   ...

loop_factory = lambda: asyncio.SelectorEventLoop(selectors.SelectSelector())
asyncio.run(main(), loop_factory=loop_factory)
@end example

@ref{2181,,Availability}: Unix, Windows.
@end deffn

@geindex ProactorEventLoop (class in asyncio)
@anchor{library/asyncio-eventloop asyncio ProactorEventLoop}@anchor{81e}
@deffn {Class} asyncio.ProactorEventLoop

A subclass of @ref{b5e,,AbstractEventLoop} for Windows that uses “I/O Completion Ports” (IOCP).

@ref{2181,,Availability}: Windows.


@subsubheading See also


MSDN documentation on I/O Completion Ports@footnote{https://learn.microsoft.com/windows/win32/fileio/i-o-completion-ports}.

@end deffn

@geindex EventLoop (class in asyncio)
@anchor{library/asyncio-eventloop asyncio EventLoop}@anchor{1aad}
@deffn {Class} asyncio.EventLoop

@quotation

An alias to the most efficient available subclass of @ref{b5e,,AbstractEventLoop} for the given
platform.

It is an alias to @ref{316,,SelectorEventLoop} on Unix and @ref{81e,,ProactorEventLoop} on Windows.
@end quotation


Added in version 3.13.

@end deffn

@geindex AbstractEventLoop (class in asyncio)
@anchor{library/asyncio-eventloop asyncio AbstractEventLoop}@anchor{b5e}
@deffn {Class} asyncio.AbstractEventLoop

Abstract base class for asyncio-compliant event loops.

The @ref{38fe,,Event loop methods} section lists all
methods that an alternative implementation of @code{AbstractEventLoop}
should have defined.
@end deffn

@node Examples<19>,,Event loop implementations,Event loop
@anchor{library/asyncio-eventloop examples}@anchor{38fd}
@subsubsection Examples


Note that all examples in this section `purposefully' show how
to use the low-level event loop APIs, such as @ref{3900,,loop.run_forever()}
and @ref{d00,,loop.call_soon()}.  Modern asyncio applications rarely
need to be written this way; consider using the high-level functions
like @ref{2f5,,asyncio.run()}.

@menu
* Hello World with call_soon(): Hello World with call_soon. 
* Display the current date with call_later(): Display the current date with call_later. 
* Watch a file descriptor for read events:: 
* Set signal handlers for SIGINT and SIGTERM:: 

@end menu

@node Hello World with call_soon,Display the current date with call_later,,Examples<19>
@anchor{library/asyncio-eventloop asyncio-example-lowlevel-helloworld}@anchor{3932}@anchor{library/asyncio-eventloop hello-world-with-call-soon}@anchor{3933}
@subsubsection Hello World with call_soon()


An example using the @ref{d00,,loop.call_soon()} method to schedule a
callback. The callback displays @code{"Hello World"} and then stops the
event loop:

@example
import asyncio

def hello_world(loop):
    """A callback to print 'Hello World' and stop the event loop"""
    print('Hello World')
    loop.stop()

loop = asyncio.new_event_loop()

# Schedule a call to hello_world()
loop.call_soon(hello_world, loop)

# Blocking call interrupted by loop.stop()
try:
    loop.run_forever()
finally:
    loop.close()
@end example


@subsubheading See also


A similar @ref{3830,,Hello World}
example created with a coroutine and the @ref{2f5,,run()} function.


@node Display the current date with call_later,Watch a file descriptor for read events,Hello World with call_soon,Examples<19>
@anchor{library/asyncio-eventloop asyncio-example-call-later}@anchor{3934}@anchor{library/asyncio-eventloop display-the-current-date-with-call-later}@anchor{3935}
@subsubsection Display the current date with call_later()


An example of a callback displaying the current date every second. The
callback uses the @ref{d02,,loop.call_later()} method to reschedule itself
after 5 seconds, and then stops the event loop:

@example
import asyncio
import datetime as dt

def display_date(end_time, loop):
    print(dt.datetime.now())
    if (loop.time() + 1.0) < end_time:
        loop.call_later(1, display_date, end_time, loop)
    else:
        loop.stop()

loop = asyncio.new_event_loop()

# Schedule the first call to display_date()
end_time = loop.time() + 5.0
loop.call_soon(display_date, end_time, loop)

# Blocking call interrupted by loop.stop()
try:
    loop.run_forever()
finally:
    loop.close()
@end example


@subsubheading See also


A similar @ref{384f,,current date} example
created with a coroutine and the @ref{2f5,,run()} function.


@node Watch a file descriptor for read events,Set signal handlers for SIGINT and SIGTERM,Display the current date with call_later,Examples<19>
@anchor{library/asyncio-eventloop asyncio-example-watch-fd}@anchor{3891}@anchor{library/asyncio-eventloop watch-a-file-descriptor-for-read-events}@anchor{3936}
@subsubsection Watch a file descriptor for read events


Wait until a file descriptor received some data using the
@ref{3892,,loop.add_reader()} method and then close the event loop:

@example
import asyncio
from socket import socketpair

# Create a pair of connected file descriptors
rsock, wsock = socketpair()

loop = asyncio.new_event_loop()

def reader():
    data = rsock.recv(100)
    print("Received:", data.decode())

    # We are done: unregister the file descriptor
    loop.remove_reader(rsock)

    # Stop the event loop
    loop.stop()

# Register the file descriptor for read event
loop.add_reader(rsock, reader)

# Simulate the reception of data from the network
loop.call_soon(wsock.send, 'abc'.encode())

try:
    # Run the event loop
    loop.run_forever()
finally:
    # We are done. Close sockets and the event loop.
    rsock.close()
    wsock.close()
    loop.close()
@end example


@subsubheading See also



@itemize *

@item 
A similar @ref{3890,,example}
using transports, protocols, and the
@ref{819,,loop.create_connection()} method.

@item 
Another similar @ref{388e,,example}
using the high-level @ref{d14,,asyncio.open_connection()} function
and streams.
@end itemize


@node Set signal handlers for SIGINT and SIGTERM,,Watch a file descriptor for read events,Examples<19>
@anchor{library/asyncio-eventloop asyncio-example-unix-signals}@anchor{3937}@anchor{library/asyncio-eventloop set-signal-handlers-for-sigint-and-sigterm}@anchor{3938}
@subsubsection Set signal handlers for SIGINT and SIGTERM


(This @code{signal} example only works on Unix.)

Register handlers for signals @ref{255,,SIGINT} and @ref{15eb,,SIGTERM}
using the @ref{3921,,loop.add_signal_handler()} method:

@example
import asyncio
import functools
import os
import signal

def ask_exit(signame, loop):
    print("got signal %s: exit" % signame)
    loop.stop()

async def main():
    loop = asyncio.get_running_loop()

    for signame in @{'SIGINT', 'SIGTERM'@}:
        loop.add_signal_handler(
            getattr(signal, signame),
            functools.partial(ask_exit, signame, loop))

    await asyncio.sleep(3600)

print("Event loop running for 1 hour, press Ctrl+C to interrupt.")
print(f"pid @{os.getpid()@}: send SIGINT or SIGTERM to exit.")

asyncio.run(main())
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Futures,Transports and Protocols,Event loop,asyncio — Asynchronous I/O
@anchor{library/asyncio-future doc}@anchor{375d}@anchor{library/asyncio-future asyncio-futures}@anchor{3839}@anchor{library/asyncio-future futures}@anchor{3939}@anchor{library/asyncio-future translation-repo}@anchor{393a}
@subsubsection Futures


`Source code:' Lib/asyncio/futures.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/asyncio/futures.py},
Lib/asyncio/base_futures.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/asyncio/base_futures.py}


__________________________________________________________________


`Future' objects are used to bridge `low-level callback-based code'
with high-level async/await code.

@menu
* Future Functions:: 
* Future Object:: 

@end menu

@node Future Functions,Future Object,,Futures
@anchor{library/asyncio-future future-functions}@anchor{393b}
@subsubsection Future Functions


@geindex isfuture() (in module asyncio)
@anchor{library/asyncio-future asyncio isfuture}@anchor{393c}
@deffn {Function} asyncio.isfuture (obj)

Return @code{True} if `obj' is either of:


@itemize *

@item 
an instance of @ref{dcc,,asyncio.Future},

@item 
an instance of @ref{1c9,,asyncio.Task},

@item 
a Future-like object with a @code{_asyncio_future_blocking}
attribute.
@end itemize


Added in version 3.5.

@end deffn

@geindex ensure_future() (in module asyncio)
@anchor{library/asyncio-future asyncio ensure_future}@anchor{e77}
@deffn {Function} asyncio.ensure_future (obj, *, loop=None)

Return:


@itemize *

@item 
`obj' argument as is, if `obj' is a @ref{dcc,,Future},
a @ref{1c9,,Task}, or a Future-like object (@ref{393c,,isfuture()}
is used for the test.)

@item 
a @ref{1c9,,Task} object wrapping `obj', if `obj' is a
coroutine (@ref{6a7,,iscoroutine()} is used for the test);
in this case the coroutine will be scheduled by
@code{ensure_future()}.

@item 
a @ref{1c9,,Task} object that would await on `obj', if `obj' is an
awaitable (@ref{101e,,inspect.isawaitable()} is used for the test.)
@end itemize

If `obj' is neither of the above a @ref{199,,TypeError} is raised.

@cartouche
@quotation Important 
Save a reference to the result of this function, to avoid
a task disappearing mid-execution.

See also the @ref{1cb,,create_task()} function which is the
preferred way for creating new tasks or use @ref{4d2,,asyncio.TaskGroup}
which keeps reference to the task internally.
@end quotation
@end cartouche


Changed in version 3.5.1: The function accepts any @ref{4ca,,awaitable} object.



Deprecated since version 3.10: Deprecation warning is emitted if `obj' is not a Future-like object
and `loop' is not specified and there is no running event loop.

@end deffn

@geindex wrap_future() (in module asyncio)
@anchor{library/asyncio-future asyncio wrap_future}@anchor{1cbf}
@deffn {Function} asyncio.wrap_future (future, *, loop=None)

Wrap a @ref{13be,,concurrent.futures.Future} object in a
@ref{dcc,,asyncio.Future} object.


Deprecated since version 3.10: Deprecation warning is emitted if `future' is not a Future-like object
and `loop' is not specified and there is no running event loop.

@end deffn

@node Future Object,,Future Functions,Futures
@anchor{library/asyncio-future asyncio-future-obj}@anchor{393d}@anchor{library/asyncio-future future-object}@anchor{393e}
@subsubsection Future Object


@geindex Future (class in asyncio)
@anchor{library/asyncio-future asyncio Future}@anchor{dcc}
@deffn {Class} asyncio.Future (*, loop=None)

A Future represents an eventual result of an asynchronous
operation.  Not thread-safe.

Future is an @ref{4ca,,awaitable} object.  Coroutines can await on
Future objects until they either have a result or an exception
set, or until they are cancelled. A Future can be awaited multiple
times and the result is same.

Typically Futures are used to enable low-level
callback-based code (e.g. in protocols implemented using asyncio
@ref{3838,,transports})
to interoperate with high-level async/await code.

The rule of thumb is to never expose Future objects in user-facing
APIs, and the recommended way to create a Future object is to call
@ref{e7a,,loop.create_future()}.  This way alternative event loop
implementations can inject their own optimized implementations
of a Future object.

Futures are @ref{2410,,generic} over the type of their results.


Changed in version 3.7: Added support for the @ref{28,,contextvars} module.



Deprecated since version 3.10: Deprecation warning is emitted if `loop' is not specified
and there is no running event loop.


@geindex result() (asyncio.Future method)
@anchor{library/asyncio-future asyncio Future result}@anchor{393f}
@deffn {Method} result ()

Return the result of the Future.

If the Future is `done' and has a result set by the
@ref{3865,,set_result()} method, the result value is returned.

If the Future is `done' and has an exception set by the
@ref{e7e,,set_exception()} method, this method raises the exception.

If the Future has been `cancelled', this method raises
a @ref{4d5,,CancelledError} exception.

If the Future’s result isn’t yet available, this method raises
an @ref{3868,,InvalidStateError} exception.
@end deffn

@geindex set_result() (asyncio.Future method)
@anchor{library/asyncio-future asyncio Future set_result}@anchor{3865}
@deffn {Method} set_result (result)

Mark the Future as `done' and set its result.

Raises an @ref{3868,,InvalidStateError} error if the Future is
already `done'.
@end deffn

@geindex set_exception() (asyncio.Future method)
@anchor{library/asyncio-future asyncio Future set_exception}@anchor{e7e}
@deffn {Method} set_exception (exception)

Mark the Future as `done' and set an exception.

Raises an @ref{3868,,InvalidStateError} error if the Future is
already `done'.
@end deffn

@geindex done() (asyncio.Future method)
@anchor{library/asyncio-future asyncio Future done}@anchor{3940}
@deffn {Method} done ()

Return @code{True} if the Future is `done'.

A Future is `done' if it was `cancelled' or if it has a result
or an exception set with @ref{3865,,set_result()} or
@ref{e7e,,set_exception()} calls.
@end deffn

@geindex cancelled() (asyncio.Future method)
@anchor{library/asyncio-future asyncio Future cancelled}@anchor{3941}
@deffn {Method} cancelled ()

Return @code{True} if the Future was `cancelled'.

The method is usually used to check if a Future is not
`cancelled' before setting a result or an exception for it:

@example
if not fut.cancelled():
    fut.set_result(42)
@end example
@end deffn

@geindex add_done_callback() (asyncio.Future method)
@anchor{library/asyncio-future asyncio Future add_done_callback}@anchor{d04}
@deffn {Method} add_done_callback (callback, *, context=None)

Add a callback to be run when the Future is `done'.

The `callback' is called with the Future object as its only
argument.

If the Future is already `done' when this method is called,
the callback is scheduled with @ref{d00,,loop.call_soon()}.

An optional keyword-only `context' argument allows specifying a
custom @ref{178,,contextvars.Context} for the `callback' to run in.
The current context is used when no `context' is provided.

@ref{219,,functools.partial()} can be used to pass parameters
to the callback, e.g.:

@example
# Call 'print("Future:", fut)' when "fut" is done.
fut.add_done_callback(
    functools.partial(print, "Future:"))
@end example


Changed in version 3.7: The `context' keyword-only parameter was added.
See 
@geindex Python Enhancement Proposals; PEP 567
PEP 567@footnote{https://peps.python.org/pep-0567/} for more details.

@end deffn

@geindex remove_done_callback() (asyncio.Future method)
@anchor{library/asyncio-future asyncio Future remove_done_callback}@anchor{1955}
@deffn {Method} remove_done_callback (callback)

Remove `callback' from the callbacks list.

Returns the number of callbacks removed, which is typically 1,
unless a callback was added more than once.
@end deffn

@geindex cancel() (asyncio.Future method)
@anchor{library/asyncio-future asyncio Future cancel}@anchor{1bec}
@deffn {Method} cancel (msg=None)

Cancel the Future and schedule callbacks.

If the Future is already `done' or `cancelled', return @code{False}.
Otherwise, change the Future’s state to `cancelled',
schedule the callbacks, and return @code{True}.

The optional string argument `msg' is passed as the argument to the
@ref{4d5,,CancelledError} exception raised when a cancelled Future
is awaited.


Changed in version 3.9: Added the `msg' parameter.

@end deffn

@geindex exception() (asyncio.Future method)
@anchor{library/asyncio-future asyncio Future exception}@anchor{3942}
@deffn {Method} exception ()

Return the exception that was set on this Future.

The exception (or @code{None} if no exception was set) is
returned only if the Future is `done'.

If the Future has been `cancelled', this method raises a
@ref{4d5,,CancelledError} exception.

If the Future isn’t `done' yet, this method raises an
@ref{3868,,InvalidStateError} exception.
@end deffn

@geindex get_loop() (asyncio.Future method)
@anchor{library/asyncio-future asyncio Future get_loop}@anchor{d0c}
@deffn {Method} get_loop ()

Return the event loop the Future object is bound to.


Added in version 3.7.

@end deffn
@end deffn
@anchor{library/asyncio-future asyncio-example-future}@anchor{3943}
This example creates a Future object, creates and schedules an
asynchronous Task to set result for the Future, and waits until
the Future has a result:

@example
async def set_after(fut, delay, value):
    # Sleep for *delay* seconds.
    await asyncio.sleep(delay)

    # Set *value* as a result of *fut* Future.
    fut.set_result(value)

async def main():
    # Get the current event loop.
    loop = asyncio.get_running_loop()

    # Create a new Future object.
    fut = loop.create_future()

    # Run "set_after()" coroutine in a parallel Task.
    # We are using the low-level "loop.create_task()" API here because
    # we already have a reference to the event loop at hand.
    # Otherwise we could have just used "asyncio.create_task()".
    loop.create_task(
        set_after(fut, 1, '... world'))

    print('hello ...')

    # Wait until *fut* has a result (1 second) and print it.
    print(await fut)

asyncio.run(main())
@end example

@cartouche
@quotation Important 
The Future object was designed to mimic
@ref{13be,,concurrent.futures.Future}.  Key differences include:


@itemize -

@item 
unlike asyncio Futures, @ref{13be,,concurrent.futures.Future}
instances cannot be awaited.

@item 
@ref{393f,,asyncio.Future.result()} and @ref{3942,,asyncio.Future.exception()}
do not accept the `timeout' argument.

@item 
@ref{393f,,asyncio.Future.result()} and @ref{3942,,asyncio.Future.exception()}
raise an @ref{3868,,InvalidStateError} exception when the Future is not
`done'.

@item 
Callbacks registered with @ref{d04,,asyncio.Future.add_done_callback()}
are not called immediately.  They are scheduled with
@ref{d00,,loop.call_soon()} instead.

@item 
asyncio Future is not compatible with the
@ref{1c48,,concurrent.futures.wait()} and
@ref{1a0b,,concurrent.futures.as_completed()} functions.

@item 
@ref{1bec,,asyncio.Future.cancel()} accepts an optional @code{msg} argument,
but @ref{3767,,concurrent.futures.Future.cancel()} does not.
@end itemize
@end quotation
@end cartouche

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Transports and Protocols,Policies,Futures,asyncio — Asynchronous I/O
@anchor{library/asyncio-protocol doc}@anchor{3944}@anchor{library/asyncio-protocol asyncio-transports-protocols}@anchor{3838}@anchor{library/asyncio-protocol translation-repo}@anchor{3945}@anchor{library/asyncio-protocol transports-and-protocols}@anchor{3946}
@subsubsection Transports and Protocols


@subsubheading Preface


Transports and Protocols are used by the `low-level' event loop
APIs such as @ref{819,,loop.create_connection()}.  They use
callback-based programming style and enable high-performance
implementations of network or IPC protocols (e.g. HTTP).

Essentially, transports and protocols should only be used in
libraries and frameworks and never in high-level asyncio
applications.

This documentation page covers both @ref{3947,,Transports} and @ref{3948,,Protocols}.

@subsubheading Introduction


At the highest level, the transport is concerned with `how' bytes
are transmitted, while the protocol determines `which' bytes to
transmit (and to some extent when).

A different way of saying the same thing: a transport is an
abstraction for a socket (or similar I/O endpoint) while a protocol
is an abstraction for an application, from the transport’s point
of view.

Yet another view is the transport and protocol interfaces
together define an abstract interface for using network I/O and
interprocess I/O.

There is always a 1:1 relationship between transport and protocol
objects: the protocol calls transport methods to send data,
while the transport calls protocol methods to pass it data that
has been received.

Most of connection oriented event loop methods
(such as @ref{819,,loop.create_connection()}) usually accept a
`protocol_factory' argument used to create a `Protocol' object
for an accepted connection, represented by a `Transport' object.
Such methods usually return a tuple of @code{(transport, protocol)}.

@subsubheading Contents


This documentation page contains the following sections:


@itemize *

@item 
The @ref{3947,,Transports} section documents asyncio @ref{3949,,BaseTransport},
@ref{391e,,ReadTransport}, @ref{391f,,WriteTransport}, @ref{394a,,Transport},
@ref{1b6b,,DatagramTransport}, and @ref{392c,,SubprocessTransport}
classes.

@item 
The @ref{3948,,Protocols} section documents asyncio @ref{394b,,BaseProtocol},
@ref{394c,,Protocol}, @ref{c9a,,BufferedProtocol},
@ref{8e0,,DatagramProtocol}, and @ref{392b,,SubprocessProtocol} classes.

@item 
The @ref{394d,,Examples} section showcases how to work with transports,
protocols, and low-level event loop APIs.
@end itemize

@menu
* Transports:: 
* Protocols: Protocols<2>. 
* Examples: Examples<20>. 

@end menu

@node Transports,Protocols<2>,,Transports and Protocols
@anchor{library/asyncio-protocol asyncio-transport}@anchor{390b}@anchor{library/asyncio-protocol transports}@anchor{3947}
@subsubsection Transports


`Source code:' Lib/asyncio/transports.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/asyncio/transports.py}


__________________________________________________________________


Transports are classes provided by @ref{b,,asyncio} in order to abstract
various kinds of communication channels.

Transport objects are always instantiated by an
@ref{f7c,,asyncio event loop}.

asyncio implements transports for TCP, UDP, SSL, and subprocess pipes.
The methods available on a transport depend on the transport’s kind.

The transport classes are @ref{3860,,not thread safe}.

@menu
* Transports Hierarchy:: 
* Base Transport:: 
* Read-only Transports:: 
* Write-only Transports:: 
* Datagram Transports:: 
* Subprocess Transports:: 

@end menu

@node Transports Hierarchy,Base Transport,,Transports
@anchor{library/asyncio-protocol transports-hierarchy}@anchor{394e}
@subsubsection Transports Hierarchy


@geindex BaseTransport (class in asyncio)
@anchor{library/asyncio-protocol asyncio BaseTransport}@anchor{3949}
@deffn {Class} asyncio.BaseTransport

Base class for all transports.  Contains methods that all
asyncio transports share.
@end deffn

@geindex WriteTransport (class in asyncio)
@anchor{library/asyncio-protocol asyncio WriteTransport}@anchor{391f}
@deffn {Class} asyncio.WriteTransport (BaseTransport)

A base transport for write-only connections.

Instances of the `WriteTransport' class are returned from
the @ref{38bf,,loop.connect_write_pipe()} event loop method and
are also used by subprocess-related methods like
@ref{38bb,,loop.subprocess_exec()}.
@end deffn

@geindex ReadTransport (class in asyncio)
@anchor{library/asyncio-protocol asyncio ReadTransport}@anchor{391e}
@deffn {Class} asyncio.ReadTransport (BaseTransport)

A base transport for read-only connections.

Instances of the `ReadTransport' class are returned from
the @ref{38be,,loop.connect_read_pipe()} event loop method and
are also used by subprocess-related methods like
@ref{38bb,,loop.subprocess_exec()}.
@end deffn

@geindex Transport (class in asyncio)
@anchor{library/asyncio-protocol asyncio Transport}@anchor{394a}
@deffn {Class} asyncio.Transport (WriteTransport, ReadTransport)

Interface representing a bidirectional transport, such as a
TCP connection.

The user does not instantiate a transport directly; they call a
utility function, passing it a protocol factory and other
information necessary to create the transport and protocol.

Instances of the `Transport' class are returned from or used by
event loop methods like @ref{819,,loop.create_connection()},
@ref{3877,,loop.create_unix_connection()},
@ref{d0f,,loop.create_server()}, @ref{3914,,loop.sendfile()}, etc.
@end deffn

@geindex DatagramTransport (class in asyncio)
@anchor{library/asyncio-protocol asyncio DatagramTransport}@anchor{1b6b}
@deffn {Class} asyncio.DatagramTransport (BaseTransport)

A transport for datagram (UDP) connections.

Instances of the `DatagramTransport' class are returned from
the @ref{941,,loop.create_datagram_endpoint()} event loop method.
@end deffn

@geindex SubprocessTransport (class in asyncio)
@anchor{library/asyncio-protocol asyncio SubprocessTransport}@anchor{392c}
@deffn {Class} asyncio.SubprocessTransport (BaseTransport)

An abstraction to represent a connection between a parent and its
child OS process.

Instances of the `SubprocessTransport' class are returned from
event loop methods @ref{38bc,,loop.subprocess_shell()} and
@ref{38bb,,loop.subprocess_exec()}.
@end deffn

@node Base Transport,Read-only Transports,Transports Hierarchy,Transports
@anchor{library/asyncio-protocol base-transport}@anchor{394f}
@subsubsection Base Transport


@geindex close() (asyncio.BaseTransport method)
@anchor{library/asyncio-protocol asyncio BaseTransport close}@anchor{390e}
@deffn {Method} BaseTransport.close ()

Close the transport.

If the transport has a buffer for outgoing
data, buffered data will be flushed asynchronously.  No more data
will be received.  After all buffered data is flushed, the
protocol’s @ref{3950,,protocol.connection_lost()} method will be called with
@ref{887,,None} as its argument. The transport should not be
used once it is closed.
@end deffn

@geindex is_closing() (asyncio.BaseTransport method)
@anchor{library/asyncio-protocol asyncio BaseTransport is_closing}@anchor{e79}
@deffn {Method} BaseTransport.is_closing ()

Return @code{True} if the transport is closing or is closed.
@end deffn

@geindex get_extra_info() (asyncio.BaseTransport method)
@anchor{library/asyncio-protocol asyncio BaseTransport get_extra_info}@anchor{c99}
@deffn {Method} BaseTransport.get_extra_info (name, default=None)

Return information about the transport or underlying resources
it uses.

`name' is a string representing the piece of transport-specific
information to get.

`default' is the value to return if the information is not
available, or if the transport does not support querying it
with the given third-party event loop implementation or on the
current platform.

For example, the following code attempts to get the underlying
socket object of the transport:

@example
sock = transport.get_extra_info('socket')
if sock is not None:
    print(sock.getsockopt(...))
@end example

Categories of information that can be queried on some transports:


@itemize *

@item 
socket:


@itemize -

@item 
@code{'peername'}: the remote address to which the socket is
connected, result of @ref{3951,,socket.socket.getpeername()}
(@code{None} on error)

@item 
@code{'socket'}: @ref{fa7,,socket.socket} instance

@item 
@code{'sockname'}: the socket’s own address,
result of @ref{286,,socket.socket.getsockname()}
@end itemize

@item 
SSL socket:


@itemize -

@item 
@code{'compression'}: the compression algorithm being used as a
string, or @code{None} if the connection isn’t compressed; result
of @ref{1351,,ssl.SSLSocket.compression()}

@item 
@code{'cipher'}: a three-value tuple containing the name of the
cipher being used, the version of the SSL protocol that defines
its use, and the number of secret bits being used; result of
@ref{3952,,ssl.SSLSocket.cipher()}

@item 
@code{'peercert'}: peer certificate; result of
@ref{11be,,ssl.SSLSocket.getpeercert()}

@item 
@code{'sslcontext'}: @ref{355,,ssl.SSLContext} instance

@item 
@code{'ssl_object'}: @ref{d80,,ssl.SSLObject} or
@ref{aed,,ssl.SSLSocket} instance
@end itemize

@item 
pipe:


@itemize -

@item 
@code{'pipe'}: pipe object
@end itemize

@item 
subprocess:


@itemize -

@item 
@code{'subprocess'}: @ref{4b8,,subprocess.Popen} instance
@end itemize
@end itemize
@end deffn

@geindex set_protocol() (asyncio.BaseTransport method)
@anchor{library/asyncio-protocol asyncio BaseTransport set_protocol}@anchor{3953}
@deffn {Method} BaseTransport.set_protocol (protocol)

Set a new protocol.

Switching protocol should only be done when both
protocols are documented to support the switch.
@end deffn

@geindex get_protocol() (asyncio.BaseTransport method)
@anchor{library/asyncio-protocol asyncio BaseTransport get_protocol}@anchor{3954}
@deffn {Method} BaseTransport.get_protocol ()

Return the current protocol.
@end deffn

@node Read-only Transports,Write-only Transports,Base Transport,Transports
@anchor{library/asyncio-protocol read-only-transports}@anchor{3955}
@subsubsection Read-only Transports


@geindex is_reading() (asyncio.ReadTransport method)
@anchor{library/asyncio-protocol asyncio ReadTransport is_reading}@anchor{d17}
@deffn {Method} ReadTransport.is_reading ()

Return @code{True} if the transport is receiving new data.


Added in version 3.7.

@end deffn

@geindex pause_reading() (asyncio.ReadTransport method)
@anchor{library/asyncio-protocol asyncio ReadTransport pause_reading}@anchor{d19}
@deffn {Method} ReadTransport.pause_reading ()

Pause the receiving end of the transport.  No data will be passed to
the protocol’s @ref{1b46,,protocol.data_received()}
method until @ref{d18,,resume_reading()} is called.


Changed in version 3.7: The method is idempotent, i.e. it can be called when the
transport is already paused or closed.

@end deffn

@geindex resume_reading() (asyncio.ReadTransport method)
@anchor{library/asyncio-protocol asyncio ReadTransport resume_reading}@anchor{d18}
@deffn {Method} ReadTransport.resume_reading ()

Resume the receiving end.  The protocol’s
@ref{1b46,,protocol.data_received()} method
will be called once again if some data is available for reading.


Changed in version 3.7: The method is idempotent, i.e. it can be called when the
transport is already reading.

@end deffn

@node Write-only Transports,Datagram Transports,Read-only Transports,Transports
@anchor{library/asyncio-protocol write-only-transports}@anchor{3956}
@subsubsection Write-only Transports


@geindex abort() (asyncio.WriteTransport method)
@anchor{library/asyncio-protocol asyncio WriteTransport abort}@anchor{392f}
@deffn {Method} WriteTransport.abort ()

Close the transport immediately, without waiting for pending operations
to complete.  Buffered data will be lost.  No more data will be received.
The protocol’s @ref{3950,,protocol.connection_lost()} method will eventually be
called with @ref{887,,None} as its argument.
@end deffn

@geindex can_write_eof() (asyncio.WriteTransport method)
@anchor{library/asyncio-protocol asyncio WriteTransport can_write_eof}@anchor{3957}
@deffn {Method} WriteTransport.can_write_eof ()

Return @ref{e0d,,True} if the transport supports
@ref{3958,,write_eof()}, @ref{d31,,False} if not.
@end deffn

@geindex get_write_buffer_size() (asyncio.WriteTransport method)
@anchor{library/asyncio-protocol asyncio WriteTransport get_write_buffer_size}@anchor{3959}
@deffn {Method} WriteTransport.get_write_buffer_size ()

Return the current size of the output buffer used by the transport.
@end deffn

@geindex get_write_buffer_limits() (asyncio.WriteTransport method)
@anchor{library/asyncio-protocol asyncio WriteTransport get_write_buffer_limits}@anchor{fca}
@deffn {Method} WriteTransport.get_write_buffer_limits ()

Get the `high' and `low' watermarks for write flow control. Return a
tuple @code{(low, high)} where `low' and `high' are positive number of
bytes.

Use @ref{395a,,set_write_buffer_limits()} to set the limits.


Added in version 3.4.2.

@end deffn

@geindex set_write_buffer_limits() (asyncio.WriteTransport method)
@anchor{library/asyncio-protocol asyncio WriteTransport set_write_buffer_limits}@anchor{395a}
@deffn {Method} WriteTransport.set_write_buffer_limits (high=None, low=None)

Set the `high' and `low' watermarks for write flow control.

These two values (measured in number of
bytes) control when the protocol’s
@ref{395b,,protocol.pause_writing()}
and @ref{395c,,protocol.resume_writing()}
methods are called. If specified, the low watermark must be less
than or equal to the high watermark.  Neither `high' nor `low'
can be negative.

@ref{395b,,pause_writing()} is called when the buffer size
becomes greater than or equal to the `high' value. If writing has
been paused, @ref{395c,,resume_writing()} is called when
the buffer size becomes less than or equal to the `low' value.

The defaults are implementation-specific.  If only the
high watermark is given, the low watermark defaults to an
implementation-specific value less than or equal to the
high watermark.  Setting `high' to zero forces `low' to zero as
well, and causes @ref{395b,,pause_writing()} to be called
whenever the buffer becomes non-empty.  Setting `low' to zero causes
@ref{395c,,resume_writing()} to be called only once the
buffer is empty. Use of zero for either limit is generally
sub-optimal as it reduces opportunities for doing I/O and
computation concurrently.

Use @ref{fca,,get_write_buffer_limits()}
to get the limits.
@end deffn

@geindex write() (asyncio.WriteTransport method)
@anchor{library/asyncio-protocol asyncio WriteTransport write}@anchor{1819}
@deffn {Method} WriteTransport.write (data)

Write some `data' bytes to the transport.

This method does not block; it buffers the data and arranges for it
to be sent out asynchronously.
@end deffn

@geindex writelines() (asyncio.WriteTransport method)
@anchor{library/asyncio-protocol asyncio WriteTransport writelines}@anchor{1818}
@deffn {Method} WriteTransport.writelines (list_of_data)

Write a list (or any iterable) of data bytes to the transport.
This is functionally equivalent to calling @ref{1819,,write()} on each
element yielded by the iterable, but may be implemented more
efficiently.
@end deffn

@geindex write_eof() (asyncio.WriteTransport method)
@anchor{library/asyncio-protocol asyncio WriteTransport write_eof}@anchor{3958}
@deffn {Method} WriteTransport.write_eof ()

Close the write end of the transport after flushing all buffered data.
Data may still be received.

This method can raise @ref{369,,NotImplementedError} if the transport
(e.g. SSL) doesn’t support half-closed connections.
@end deffn

@node Datagram Transports,Subprocess Transports,Write-only Transports,Transports
@anchor{library/asyncio-protocol datagram-transports}@anchor{395d}
@subsubsection Datagram Transports


@geindex sendto() (asyncio.DatagramTransport method)
@anchor{library/asyncio-protocol asyncio DatagramTransport sendto}@anchor{4cc}
@deffn {Method} DatagramTransport.sendto (data, addr=None)

Send the `data' bytes to the remote peer given by `addr' (a
transport-dependent target address).  If `addr' is @ref{887,,None},
the data is sent to the target address given on transport
creation.

This method does not block; it buffers the data and arranges
for it to be sent out asynchronously.


Changed in version 3.13: This method can be called with an empty bytes object to send a
zero-length datagram. The buffer size calculation used for flow
control is also updated to account for the datagram header.

@end deffn

@geindex abort() (asyncio.DatagramTransport method)
@anchor{library/asyncio-protocol asyncio DatagramTransport abort}@anchor{395e}
@deffn {Method} DatagramTransport.abort ()

Close the transport immediately, without waiting for pending
operations to complete.  Buffered data will be lost.
No more data will be received.  The protocol’s
@ref{3950,,protocol.connection_lost()}
method will eventually be called with @ref{887,,None} as its argument.
@end deffn

@node Subprocess Transports,,Datagram Transports,Transports
@anchor{library/asyncio-protocol asyncio-subprocess-transports}@anchor{38c0}@anchor{library/asyncio-protocol subprocess-transports}@anchor{395f}
@subsubsection Subprocess Transports


@geindex get_pid() (asyncio.SubprocessTransport method)
@anchor{library/asyncio-protocol asyncio SubprocessTransport get_pid}@anchor{3960}
@deffn {Method} SubprocessTransport.get_pid ()

Return the subprocess process id as an integer.
@end deffn

@geindex get_pipe_transport() (asyncio.SubprocessTransport method)
@anchor{library/asyncio-protocol asyncio SubprocessTransport get_pipe_transport}@anchor{3961}
@deffn {Method} SubprocessTransport.get_pipe_transport (fd)

Return the transport for the communication pipe corresponding to the
integer file descriptor `fd':


@itemize *

@item 
@code{0}: writable streaming transport of the standard input (`stdin'),
or @ref{887,,None} if the subprocess was not created with @code{stdin=PIPE}

@item 
@code{1}: readable streaming transport of the standard output (`stdout'),
or @ref{887,,None} if the subprocess was not created with @code{stdout=PIPE}

@item 
@code{2}: readable streaming transport of the standard error (`stderr'),
or @ref{887,,None} if the subprocess was not created with @code{stderr=PIPE}

@item 
other `fd': @ref{887,,None}
@end itemize
@end deffn

@geindex get_returncode() (asyncio.SubprocessTransport method)
@anchor{library/asyncio-protocol asyncio SubprocessTransport get_returncode}@anchor{3962}
@deffn {Method} SubprocessTransport.get_returncode ()

Return the subprocess return code as an integer or @ref{887,,None}
if it hasn’t returned, which is similar to the
@ref{c89,,subprocess.Popen.returncode} attribute.
@end deffn

@geindex kill() (asyncio.SubprocessTransport method)
@anchor{library/asyncio-protocol asyncio SubprocessTransport kill}@anchor{3963}
@deffn {Method} SubprocessTransport.kill ()

Kill the subprocess.

On POSIX systems, the function sends SIGKILL to the subprocess.
On Windows, this method is an alias for @ref{3964,,terminate()}.

See also @ref{15e9,,subprocess.Popen.kill()}.
@end deffn

@geindex send_signal() (asyncio.SubprocessTransport method)
@anchor{library/asyncio-protocol asyncio SubprocessTransport send_signal}@anchor{3965}
@deffn {Method} SubprocessTransport.send_signal (signal)

Send the `signal' number to the subprocess, as in
@ref{15ea,,subprocess.Popen.send_signal()}.
@end deffn

@geindex terminate() (asyncio.SubprocessTransport method)
@anchor{library/asyncio-protocol asyncio SubprocessTransport terminate}@anchor{3964}
@deffn {Method} SubprocessTransport.terminate ()

Stop the subprocess.

On POSIX systems, this method sends @ref{15eb,,SIGTERM} to the subprocess.
On Windows, the Windows API function @code{TerminateProcess()} is called to
stop the subprocess.

See also @ref{15e8,,subprocess.Popen.terminate()}.
@end deffn

@geindex close() (asyncio.SubprocessTransport method)
@anchor{library/asyncio-protocol asyncio SubprocessTransport close}@anchor{3966}
@deffn {Method} SubprocessTransport.close ()

Kill the subprocess by calling the @ref{3963,,kill()} method.

If the subprocess hasn’t returned yet, and close transports of
`stdin', `stdout', and `stderr' pipes.
@end deffn

@node Protocols<2>,Examples<20>,Transports,Transports and Protocols
@anchor{library/asyncio-protocol asyncio-protocol}@anchor{390a}@anchor{library/asyncio-protocol protocols}@anchor{3948}
@subsubsection Protocols


`Source code:' Lib/asyncio/protocols.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/asyncio/protocols.py}


__________________________________________________________________


asyncio provides a set of abstract base classes that should be used
to implement network protocols.  Those classes are meant to be used
together with @ref{390b,,transports}.

Subclasses of abstract base protocol classes may implement some or
all methods.  All these methods are callbacks: they are called by
transports on certain events, for example when some data is received.
A base protocol method should be called by the corresponding transport.

@menu
* Base Protocols:: 
* Base Protocol:: 
* Streaming Protocols:: 
* Buffered Streaming Protocols:: 
* Datagram Protocols:: 
* Subprocess Protocols:: 

@end menu

@node Base Protocols,Base Protocol,,Protocols<2>
@anchor{library/asyncio-protocol base-protocols}@anchor{3967}
@subsubsection Base Protocols


@geindex BaseProtocol (class in asyncio)
@anchor{library/asyncio-protocol asyncio BaseProtocol}@anchor{394b}
@deffn {Class} asyncio.BaseProtocol

Base protocol with methods that all protocols share.
@end deffn

@geindex Protocol (class in asyncio)
@anchor{library/asyncio-protocol asyncio Protocol}@anchor{394c}
@deffn {Class} asyncio.Protocol (BaseProtocol)

The base class for implementing streaming protocols
(TCP, Unix sockets, etc).
@end deffn

@geindex BufferedProtocol (class in asyncio)
@anchor{library/asyncio-protocol asyncio BufferedProtocol}@anchor{c9a}
@deffn {Class} asyncio.BufferedProtocol (BaseProtocol)

A base class for implementing streaming protocols with manual
control of the receive buffer.
@end deffn

@geindex DatagramProtocol (class in asyncio)
@anchor{library/asyncio-protocol asyncio DatagramProtocol}@anchor{8e0}
@deffn {Class} asyncio.DatagramProtocol (BaseProtocol)

The base class for implementing datagram (UDP) protocols.
@end deffn

@geindex SubprocessProtocol (class in asyncio)
@anchor{library/asyncio-protocol asyncio SubprocessProtocol}@anchor{392b}
@deffn {Class} asyncio.SubprocessProtocol (BaseProtocol)

The base class for implementing protocols communicating with child
processes (unidirectional pipes).
@end deffn

@node Base Protocol,Streaming Protocols,Base Protocols,Protocols<2>
@anchor{library/asyncio-protocol base-protocol}@anchor{3968}
@subsubsection Base Protocol


All asyncio protocols can implement Base Protocol callbacks.

@subsubheading Connection Callbacks


Connection callbacks are called on all protocols, exactly once per
a successful connection.  All other protocol callbacks can only be
called between those two methods.

@geindex connection_made() (asyncio.BaseProtocol method)
@anchor{library/asyncio-protocol asyncio BaseProtocol connection_made}@anchor{390c}
@deffn {Method} BaseProtocol.connection_made (transport)

Called when a connection is made.

The `transport' argument is the transport representing the
connection.  The protocol is responsible for storing the reference
to its transport.
@end deffn

@geindex connection_lost() (asyncio.BaseProtocol method)
@anchor{library/asyncio-protocol asyncio BaseProtocol connection_lost}@anchor{3950}
@deffn {Method} BaseProtocol.connection_lost (exc)

Called when the connection is lost or closed.

The argument is either an exception object or @ref{887,,None}.
The latter means a regular EOF is received, or the connection was
aborted or closed by this side of the connection.
@end deffn

@subsubheading Flow Control Callbacks


Flow control callbacks can be called by transports to pause or
resume writing performed by the protocol.

See the documentation of the @ref{395a,,set_write_buffer_limits()}
method for more details.

@geindex pause_writing() (asyncio.BaseProtocol method)
@anchor{library/asyncio-protocol asyncio BaseProtocol pause_writing}@anchor{395b}
@deffn {Method} BaseProtocol.pause_writing ()

Called when the transport’s buffer goes over the high watermark.
@end deffn

@geindex resume_writing() (asyncio.BaseProtocol method)
@anchor{library/asyncio-protocol asyncio BaseProtocol resume_writing}@anchor{395c}
@deffn {Method} BaseProtocol.resume_writing ()

Called when the transport’s buffer drains below the low watermark.
@end deffn

If the buffer size equals the high watermark,
@ref{395b,,pause_writing()} is not called: the buffer size must
go strictly over.

Conversely, @ref{395c,,resume_writing()} is called when the
buffer size is equal or lower than the low watermark.  These end
conditions are important to ensure that things go as expected when
either mark is zero.

@node Streaming Protocols,Buffered Streaming Protocols,Base Protocol,Protocols<2>
@anchor{library/asyncio-protocol streaming-protocols}@anchor{3969}
@subsubsection Streaming Protocols


Event methods, such as @ref{d0f,,loop.create_server()},
@ref{4cb,,loop.create_unix_server()}, @ref{819,,loop.create_connection()},
@ref{3877,,loop.create_unix_connection()}, @ref{9e4,,loop.connect_accepted_socket()},
@ref{38be,,loop.connect_read_pipe()}, and @ref{38bf,,loop.connect_write_pipe()}
accept factories that return streaming protocols.

@geindex data_received() (asyncio.Protocol method)
@anchor{library/asyncio-protocol asyncio Protocol data_received}@anchor{1b46}
@deffn {Method} Protocol.data_received (data)

Called when some data is received.  `data' is a non-empty bytes
object containing the incoming data.

Whether the data is buffered, chunked or reassembled depends on
the transport.  In general, you shouldn’t rely on specific semantics
and instead make your parsing generic and flexible. However,
data is always received in the correct order.

The method can be called an arbitrary number of times while
a connection is open.

However, @ref{396a,,protocol.eof_received()}
is called at most once.  Once @code{eof_received()} is called,
@code{data_received()} is not called anymore.
@end deffn

@geindex eof_received() (asyncio.Protocol method)
@anchor{library/asyncio-protocol asyncio Protocol eof_received}@anchor{396a}
@deffn {Method} Protocol.eof_received ()

Called when the other end signals it won’t send any more data
(for example by calling @ref{3958,,transport.write_eof()}, if the other end also uses
asyncio).

This method may return a false value (including @code{None}), in which case
the transport will close itself.  Conversely, if this method returns a
true value, the protocol used determines whether to close the transport.
Since the default implementation returns @code{None}, it implicitly closes the
connection.

Some transports, including SSL, don’t support half-closed connections,
in which case returning true from this method will result in the connection
being closed.
@end deffn

State machine:

@example
start -> connection_made
    [-> data_received]*
    [-> eof_received]?
-> connection_lost -> end
@end example

@node Buffered Streaming Protocols,Datagram Protocols,Streaming Protocols,Protocols<2>
@anchor{library/asyncio-protocol buffered-streaming-protocols}@anchor{396b}
@subsubsection Buffered Streaming Protocols



Added in version 3.7.


Buffered Protocols can be used with any event loop method
that supports @ref{3969,,Streaming Protocols}.

@code{BufferedProtocol} implementations allow explicit manual allocation
and control of the receive buffer.  Event loops can then use the buffer
provided by the protocol to avoid unnecessary data copies.  This
can result in noticeable performance improvement for protocols that
receive big amounts of data.  Sophisticated protocol implementations
can significantly reduce the number of buffer allocations.

The following callbacks are called on @ref{c9a,,BufferedProtocol}
instances:

@geindex get_buffer() (asyncio.BufferedProtocol method)
@anchor{library/asyncio-protocol asyncio BufferedProtocol get_buffer}@anchor{396c}
@deffn {Method} BufferedProtocol.get_buffer (sizehint)

Called to allocate a new receive buffer.

`sizehint' is the recommended minimum size for the returned
buffer.  It is acceptable to return smaller or larger buffers
than what `sizehint' suggests.  When set to -1, the buffer size
can be arbitrary. It is an error to return a buffer with a zero size.

@code{get_buffer()} must return an object implementing the
@ref{262,,buffer protocol}.
@end deffn

@geindex buffer_updated() (asyncio.BufferedProtocol method)
@anchor{library/asyncio-protocol asyncio BufferedProtocol buffer_updated}@anchor{396d}
@deffn {Method} BufferedProtocol.buffer_updated (nbytes)

Called when the buffer was updated with the received data.

`nbytes' is the total number of bytes that were written to the buffer.
@end deffn

@geindex eof_received() (asyncio.BufferedProtocol method)
@anchor{library/asyncio-protocol asyncio BufferedProtocol eof_received}@anchor{396e}
@deffn {Method} BufferedProtocol.eof_received ()

See the documentation of the @ref{396a,,protocol.eof_received()} method.
@end deffn

@ref{396c,,get_buffer()} can be called an arbitrary number
of times during a connection.  However, @ref{396a,,protocol.eof_received()} is called at most once
and, if called, @code{get_buffer()} and
@ref{396d,,buffer_updated()} won’t be called after it.

State machine:

@example
start -> connection_made
    [-> get_buffer
        [-> buffer_updated]?
    ]*
    [-> eof_received]?
-> connection_lost -> end
@end example

@node Datagram Protocols,Subprocess Protocols,Buffered Streaming Protocols,Protocols<2>
@anchor{library/asyncio-protocol datagram-protocols}@anchor{396f}
@subsubsection Datagram Protocols


Datagram Protocol instances should be constructed by protocol
factories passed to the @ref{941,,loop.create_datagram_endpoint()} method.

@geindex datagram_received() (asyncio.DatagramProtocol method)
@anchor{library/asyncio-protocol asyncio DatagramProtocol datagram_received}@anchor{3970}
@deffn {Method} DatagramProtocol.datagram_received (data, addr)

Called when a datagram is received.  `data' is a bytes object containing
the incoming data.  `addr' is the address of the peer sending the data;
the exact format depends on the transport.
@end deffn

@geindex error_received() (asyncio.DatagramProtocol method)
@anchor{library/asyncio-protocol asyncio DatagramProtocol error_received}@anchor{3971}
@deffn {Method} DatagramProtocol.error_received (exc)

Called when a previous send or receive operation raises an
@ref{2c2,,OSError}.  `exc' is the @code{OSError} instance.

This method is called in rare conditions, when the transport (e.g. UDP)
detects that a datagram could not be delivered to its recipient.
In many conditions though, undeliverable datagrams will be silently
dropped.
@end deffn

@cartouche
@quotation Note 
On BSD systems (macOS, FreeBSD, etc.) flow control is not supported
for datagram protocols, because there is no reliable way to detect send
failures caused by writing too many packets.

The socket always appears ‘ready’ and excess packets are dropped. An
@ref{2c2,,OSError} with @code{errno} set to @ref{1bb5,,errno.ENOBUFS} may
or may not be raised; if it is raised, it will be reported to
@ref{3971,,DatagramProtocol.error_received()} but otherwise ignored.
@end quotation
@end cartouche

@node Subprocess Protocols,,Datagram Protocols,Protocols<2>
@anchor{library/asyncio-protocol asyncio-subprocess-protocols}@anchor{38c1}@anchor{library/asyncio-protocol subprocess-protocols}@anchor{3972}
@subsubsection Subprocess Protocols


Subprocess Protocol instances should be constructed by protocol
factories passed to the @ref{38bb,,loop.subprocess_exec()} and
@ref{38bc,,loop.subprocess_shell()} methods.

@geindex pipe_data_received() (asyncio.SubprocessProtocol method)
@anchor{library/asyncio-protocol asyncio SubprocessProtocol pipe_data_received}@anchor{1b94}
@deffn {Method} SubprocessProtocol.pipe_data_received (fd, data)

Called when the child process writes data into its stdout or stderr
pipe.

`fd' is the integer file descriptor of the pipe.

`data' is a non-empty bytes object containing the received data.
@end deffn

@geindex pipe_connection_lost() (asyncio.SubprocessProtocol method)
@anchor{library/asyncio-protocol asyncio SubprocessProtocol pipe_connection_lost}@anchor{3973}
@deffn {Method} SubprocessProtocol.pipe_connection_lost (fd, exc)

Called when one of the pipes communicating with the child process
is closed.

`fd' is the integer file descriptor that was closed.
@end deffn

@geindex process_exited() (asyncio.SubprocessProtocol method)
@anchor{library/asyncio-protocol asyncio SubprocessProtocol process_exited}@anchor{1b93}
@deffn {Method} SubprocessProtocol.process_exited ()

Called when the child process has exited.

It can be called before @ref{1b94,,pipe_data_received()} and
@ref{3973,,pipe_connection_lost()} methods.
@end deffn

@node Examples<20>,,Protocols<2>,Transports and Protocols
@anchor{library/asyncio-protocol examples}@anchor{394d}
@subsubsection Examples


@menu
* TCP Echo Server:: 
* TCP Echo Client:: 
* UDP Echo Server:: 
* UDP Echo Client:: 
* Connecting Existing Sockets:: 
* loop.subprocess_exec() and SubprocessProtocol: loop subprocess_exec and SubprocessProtocol. 

@end menu

@node TCP Echo Server,TCP Echo Client,,Examples<20>
@anchor{library/asyncio-protocol asyncio-example-tcp-echo-server-protocol}@anchor{388c}@anchor{library/asyncio-protocol tcp-echo-server}@anchor{3974}
@subsubsection TCP Echo Server


Create a TCP echo server using the @ref{d0f,,loop.create_server()} method, send back
received data, and close the connection:

@example
import asyncio


class EchoServerProtocol(asyncio.Protocol):
    def connection_made(self, transport):
        peername = transport.get_extra_info('peername')
        print('Connection from @{@}'.format(peername))
        self.transport = transport

    def data_received(self, data):
        message = data.decode()
        print('Data received: @{!r@}'.format(message))

        print('Send: @{!r@}'.format(message))
        self.transport.write(data)

        print('Close the client socket')
        self.transport.close()


async def main():
    # Get a reference to the event loop as we plan to use
    # low-level APIs.
    loop = asyncio.get_running_loop()

    server = await loop.create_server(
        EchoServerProtocol,
        '127.0.0.1', 8888)

    async with server:
        await server.serve_forever()


asyncio.run(main())
@end example


@subsubheading See also


The @ref{388a,,TCP echo server using streams}
example uses the high-level @ref{d15,,asyncio.start_server()} function.


@node TCP Echo Client,UDP Echo Server,TCP Echo Server,Examples<20>
@anchor{library/asyncio-protocol asyncio-example-tcp-echo-client-protocol}@anchor{3889}@anchor{library/asyncio-protocol tcp-echo-client}@anchor{3975}
@subsubsection TCP Echo Client


A TCP echo client using the @ref{819,,loop.create_connection()} method, sends
data, and waits until the connection is closed:

@example
import asyncio


class EchoClientProtocol(asyncio.Protocol):
    def __init__(self, message, on_con_lost):
        self.message = message
        self.on_con_lost = on_con_lost

    def connection_made(self, transport):
        transport.write(self.message.encode())
        print('Data sent: @{!r@}'.format(self.message))

    def data_received(self, data):
        print('Data received: @{!r@}'.format(data.decode()))

    def connection_lost(self, exc):
        print('The server closed the connection')
        self.on_con_lost.set_result(True)


async def main():
    # Get a reference to the event loop as we plan to use
    # low-level APIs.
    loop = asyncio.get_running_loop()

    on_con_lost = loop.create_future()
    message = 'Hello World!'

    transport, protocol = await loop.create_connection(
        lambda: EchoClientProtocol(message, on_con_lost),
        '127.0.0.1', 8888)

    # Wait until the protocol signals that the connection
    # is lost and close the transport.
    try:
        await on_con_lost
    finally:
        transport.close()


asyncio.run(main())
@end example


@subsubheading See also


The @ref{3887,,TCP echo client using streams}
example uses the high-level @ref{d14,,asyncio.open_connection()} function.


@node UDP Echo Server,UDP Echo Client,TCP Echo Client,Examples<20>
@anchor{library/asyncio-protocol asyncio-udp-echo-server-protocol}@anchor{3910}@anchor{library/asyncio-protocol udp-echo-server}@anchor{3976}
@subsubsection UDP Echo Server


A UDP echo server, using the @ref{941,,loop.create_datagram_endpoint()}
method, sends back received data:

@example
import asyncio


class EchoServerProtocol:
    def connection_made(self, transport):
        self.transport = transport

    def datagram_received(self, data, addr):
        message = data.decode()
        print('Received %r from %s' % (message, addr))
        print('Send %r to %s' % (message, addr))
        self.transport.sendto(data, addr)


async def main():
    print("Starting UDP server")

    # Get a reference to the event loop as we plan to use
    # low-level APIs.
    loop = asyncio.get_running_loop()

    # One protocol instance will be created to serve all
    # client requests.
    transport, protocol = await loop.create_datagram_endpoint(
        EchoServerProtocol,
        local_addr=('127.0.0.1', 9999))

    try:
        await asyncio.sleep(3600)  # Serve for 1 hour.
    finally:
        transport.close()


asyncio.run(main())
@end example

@node UDP Echo Client,Connecting Existing Sockets,UDP Echo Server,Examples<20>
@anchor{library/asyncio-protocol asyncio-udp-echo-client-protocol}@anchor{390f}@anchor{library/asyncio-protocol udp-echo-client}@anchor{3977}
@subsubsection UDP Echo Client


A UDP echo client, using the @ref{941,,loop.create_datagram_endpoint()}
method, sends data and closes the transport when it receives the answer:

@example
import asyncio


class EchoClientProtocol:
    def __init__(self, message, on_con_lost):
        self.message = message
        self.on_con_lost = on_con_lost
        self.transport = None

    def connection_made(self, transport):
        self.transport = transport
        print('Send:', self.message)
        self.transport.sendto(self.message.encode())

    def datagram_received(self, data, addr):
        print("Received:", data.decode())

        print("Close the socket")
        self.transport.close()

    def error_received(self, exc):
        print('Error received:', exc)

    def connection_lost(self, exc):
        print("Connection closed")
        self.on_con_lost.set_result(True)


async def main():
    # Get a reference to the event loop as we plan to use
    # low-level APIs.
    loop = asyncio.get_running_loop()

    on_con_lost = loop.create_future()
    message = "Hello World!"

    transport, protocol = await loop.create_datagram_endpoint(
        lambda: EchoClientProtocol(message, on_con_lost),
        remote_addr=('127.0.0.1', 9999))

    try:
        await on_con_lost
    finally:
        transport.close()


asyncio.run(main())
@end example

@node Connecting Existing Sockets,loop subprocess_exec and SubprocessProtocol,UDP Echo Client,Examples<20>
@anchor{library/asyncio-protocol asyncio-example-create-connection}@anchor{3890}@anchor{library/asyncio-protocol connecting-existing-sockets}@anchor{3978}
@subsubsection Connecting Existing Sockets


Wait until a socket receives data using the
@ref{819,,loop.create_connection()} method with a protocol:

@example
import asyncio
import socket


class MyProtocol(asyncio.Protocol):

    def __init__(self, on_con_lost):
        self.transport = None
        self.on_con_lost = on_con_lost

    def connection_made(self, transport):
        self.transport = transport

    def data_received(self, data):
        print("Received:", data.decode())

        # We are done: close the transport;
        # connection_lost() will be called automatically.
        self.transport.close()

    def connection_lost(self, exc):
        # The socket has been closed
        self.on_con_lost.set_result(True)


async def main():
    # Get a reference to the event loop as we plan to use
    # low-level APIs.
    loop = asyncio.get_running_loop()
    on_con_lost = loop.create_future()

    # Create a pair of connected sockets
    rsock, wsock = socket.socketpair()

    # Register the socket to wait for data.
    transport, protocol = await loop.create_connection(
        lambda: MyProtocol(on_con_lost), sock=rsock)

    # Simulate the reception of data from the network.
    loop.call_soon(wsock.send, 'abc'.encode())

    try:
        await protocol.on_con_lost
    finally:
        transport.close()
        wsock.close()

asyncio.run(main())
@end example


@subsubheading See also


The @ref{3891,,watch a file descriptor for read events} example uses the low-level
@ref{3892,,loop.add_reader()} method to register an FD.

The @ref{388e,,register an open socket to wait for data using streams} example uses high-level streams
created by the @ref{d14,,open_connection()} function in a coroutine.


@node loop subprocess_exec and SubprocessProtocol,,Connecting Existing Sockets,Examples<20>
@anchor{library/asyncio-protocol asyncio-example-subprocess-proto}@anchor{38d0}@anchor{library/asyncio-protocol loop-subprocess-exec-and-subprocessprotocol}@anchor{3979}
@subsubsection loop.subprocess_exec() and SubprocessProtocol


An example of a subprocess protocol used to get the output of a
subprocess and to wait for the subprocess exit.

The subprocess is created by the @ref{38bb,,loop.subprocess_exec()} method:

@example
import asyncio
import sys

class DateProtocol(asyncio.SubprocessProtocol):
    def __init__(self, exit_future):
        self.exit_future = exit_future
        self.output = bytearray()
        self.pipe_closed = False
        self.exited = False

    def pipe_connection_lost(self, fd, exc):
        self.pipe_closed = True
        self.check_for_exit()

    def pipe_data_received(self, fd, data):
        self.output.extend(data)

    def process_exited(self):
        self.exited = True
        # process_exited() method can be called before
        # pipe_connection_lost() method: wait until both methods are
        # called.
        self.check_for_exit()

    def check_for_exit(self):
        if self.pipe_closed and self.exited:
            self.exit_future.set_result(True)

async def get_date():
    # Get a reference to the event loop as we plan to use
    # low-level APIs.
    loop = asyncio.get_running_loop()

    code = 'import datetime as dt; print(dt.datetime.now())'
    exit_future = asyncio.Future(loop=loop)

    # Create the subprocess controlled by DateProtocol;
    # redirect the standard output into a pipe.
    transport, protocol = await loop.subprocess_exec(
        lambda: DateProtocol(exit_future),
        sys.executable, '-c', code,
        stdin=None, stderr=None)

    # Wait for the subprocess exit using the process_exited()
    # method of the protocol.
    await exit_future

    # Close the stdout pipe.
    transport.close()

    # Read the output which was collected by the
    # pipe_data_received() method of the protocol.
    data = bytes(protocol.output)
    return data.decode('ascii').rstrip()

date = asyncio.run(get_date())
print(f"Current date: @{date@}")
@end example

See also the @ref{38cf,,same example}
written using high-level APIs.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Policies,Platform Support,Transports and Protocols,asyncio — Asynchronous I/O
@anchor{library/asyncio-policy doc}@anchor{397a}@anchor{library/asyncio-policy asyncio-policies}@anchor{38f8}@anchor{library/asyncio-policy policies}@anchor{397b}@anchor{library/asyncio-policy translation-repo}@anchor{397c}
@subsubsection Policies


@cartouche
@quotation Warning 
Policies are deprecated and will be removed in Python 3.16.
Users are encouraged to use the @ref{2f5,,asyncio.run()} function
or the @ref{2f7,,asyncio.Runner} with `loop_factory' to use
the desired loop implementation.
@end quotation
@end cartouche

An event loop policy is a global object
used to get and set the current @ref{f7c,,event loop},
as well as create new event loops.
The default policy can be @ref{397d,,replaced} with
@ref{397e,,built-in alternatives}
to use different event loop implementations,
or substituted by a @ref{397f,,custom policy}
that can override these behaviors.

The @ref{3980,,policy object}
gets and sets a separate event loop per `context'.
This is per-thread by default,
though custom policies could define `context' differently.

Custom event loop policies can control the behavior of
@ref{2f4,,get_event_loop()}, @ref{1b99,,set_event_loop()}, and @ref{383e,,new_event_loop()}.

Policy objects should implement the APIs defined
in the @ref{310,,AbstractEventLoopPolicy} abstract base class.

@menu
* Getting and Setting the Policy:: 
* Policy Objects:: 
* Custom Policies:: 

@end menu

@node Getting and Setting the Policy,Policy Objects,,Policies
@anchor{library/asyncio-policy asyncio-policy-get-set}@anchor{397d}@anchor{library/asyncio-policy getting-and-setting-the-policy}@anchor{3981}
@subsubsection Getting and Setting the Policy


The following functions can be used to get and set the policy
for the current process:

@geindex get_event_loop_policy() (in module asyncio)
@anchor{library/asyncio-policy asyncio get_event_loop_policy}@anchor{314}
@deffn {Function} asyncio.get_event_loop_policy ()

Return the current process-wide policy.


Deprecated since version 3.14: The @code{get_event_loop_policy()} function is deprecated and
will be removed in Python 3.16.

@end deffn

@geindex set_event_loop_policy() (in module asyncio)
@anchor{library/asyncio-policy asyncio set_event_loop_policy}@anchor{315}
@deffn {Function} asyncio.set_event_loop_policy (policy)

Set the current process-wide policy to `policy'.

If `policy' is set to @code{None}, the default policy is restored.


Deprecated since version 3.14: The @code{set_event_loop_policy()} function is deprecated and
will be removed in Python 3.16.

@end deffn

@node Policy Objects,Custom Policies,Getting and Setting the Policy,Policies
@anchor{library/asyncio-policy asyncio-policy-objects}@anchor{3980}@anchor{library/asyncio-policy policy-objects}@anchor{3982}
@subsubsection Policy Objects


The abstract event loop policy base class is defined as follows:

@geindex AbstractEventLoopPolicy (class in asyncio)
@anchor{library/asyncio-policy asyncio AbstractEventLoopPolicy}@anchor{310}
@deffn {Class} asyncio.AbstractEventLoopPolicy

An abstract base class for asyncio policies.

@geindex get_event_loop() (asyncio.AbstractEventLoopPolicy method)
@anchor{library/asyncio-policy asyncio AbstractEventLoopPolicy get_event_loop}@anchor{3983}
@deffn {Method} get_event_loop ()

Get the event loop for the current context.

Return an event loop object implementing the
@ref{b5e,,AbstractEventLoop} interface.

This method should never return @code{None}.


Changed in version 3.6.

@end deffn

@geindex set_event_loop() (asyncio.AbstractEventLoopPolicy method)
@anchor{library/asyncio-policy asyncio AbstractEventLoopPolicy set_event_loop}@anchor{3984}
@deffn {Method} set_event_loop (loop)

Set the event loop for the current context to `loop'.
@end deffn

@geindex new_event_loop() (asyncio.AbstractEventLoopPolicy method)
@anchor{library/asyncio-policy asyncio AbstractEventLoopPolicy new_event_loop}@anchor{3985}
@deffn {Method} new_event_loop ()

Create and return a new event loop object.

This method should never return @code{None}.
@end deffn


Deprecated since version 3.14: The @code{AbstractEventLoopPolicy} class is deprecated and
will be removed in Python 3.16.

@end deffn
@anchor{library/asyncio-policy asyncio-policy-builtin}@anchor{397e}
asyncio ships with the following built-in policies:

@geindex DefaultEventLoopPolicy (class in asyncio)
@anchor{library/asyncio-policy asyncio DefaultEventLoopPolicy}@anchor{311}
@deffn {Class} asyncio.DefaultEventLoopPolicy

The default asyncio policy.  Uses @ref{316,,SelectorEventLoop}
on Unix and @ref{81e,,ProactorEventLoop} on Windows.

There is no need to install the default policy manually. asyncio
is configured to use the default policy automatically.


Changed in version 3.8: On Windows, @ref{81e,,ProactorEventLoop} is now used by default.



Changed in version 3.14: The @ref{2f4,,get_event_loop()} method of the default asyncio policy now
raises a @ref{246,,RuntimeError} if there is no set event loop.



Deprecated since version 3.14: The @code{DefaultEventLoopPolicy} class is deprecated and
will be removed in Python 3.16.

@end deffn

@geindex WindowsSelectorEventLoopPolicy (class in asyncio)
@anchor{library/asyncio-policy asyncio WindowsSelectorEventLoopPolicy}@anchor{312}
@deffn {Class} asyncio.WindowsSelectorEventLoopPolicy

An alternative event loop policy that uses the
@ref{316,,SelectorEventLoop} event loop implementation.

@ref{2181,,Availability}: Windows.


Deprecated since version 3.14: The @code{WindowsSelectorEventLoopPolicy} class is deprecated and
will be removed in Python 3.16.

@end deffn

@geindex WindowsProactorEventLoopPolicy (class in asyncio)
@anchor{library/asyncio-policy asyncio WindowsProactorEventLoopPolicy}@anchor{313}
@deffn {Class} asyncio.WindowsProactorEventLoopPolicy

An alternative event loop policy that uses the
@ref{81e,,ProactorEventLoop} event loop implementation.

@ref{2181,,Availability}: Windows.


Deprecated since version 3.14: The @code{WindowsProactorEventLoopPolicy} class is deprecated and
will be removed in Python 3.16.

@end deffn

@node Custom Policies,,Policy Objects,Policies
@anchor{library/asyncio-policy asyncio-custom-policies}@anchor{397f}@anchor{library/asyncio-policy custom-policies}@anchor{3986}
@subsubsection Custom Policies


To implement a new event loop policy, it is recommended to subclass
@ref{311,,DefaultEventLoopPolicy} and override the methods for which
custom behavior is wanted, e.g.:

@example
class MyEventLoopPolicy(asyncio.DefaultEventLoopPolicy):

    def get_event_loop(self):
        """Get the event loop.

        This may be None or an instance of EventLoop.
        """
        loop = super().get_event_loop()
        # Do something with loop ...
        return loop

asyncio.set_event_loop_policy(MyEventLoopPolicy())
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Platform Support,Extending,Policies,asyncio — Asynchronous I/O
@anchor{library/asyncio-platforms doc}@anchor{3987}@anchor{library/asyncio-platforms asyncio-platform-support}@anchor{391a}@anchor{library/asyncio-platforms platform-support}@anchor{3988}@anchor{library/asyncio-platforms translation-repo}@anchor{3989}
@subsubsection Platform Support


The @ref{b,,asyncio} module is designed to be portable,
but some platforms have subtle differences and limitations
due to the platforms’ underlying architecture and capabilities.

@menu
* All Platforms:: 
* Windows: Windows<86>. 
* macOS: macOS<55>. 

@end menu

@node All Platforms,Windows<86>,,Platform Support
@anchor{library/asyncio-platforms all-platforms}@anchor{398a}
@subsubsection All Platforms



@itemize *

@item 
@ref{3892,,loop.add_reader()} and @ref{3918,,loop.add_writer()}
cannot be used to monitor file I/O.
@end itemize

@node Windows<86>,macOS<55>,All Platforms,Platform Support
@anchor{library/asyncio-platforms windows}@anchor{398b}
@subsubsection Windows


`Source code:' Lib/asyncio/proactor_events.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/asyncio/proactor_events.py},
Lib/asyncio/windows_events.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/asyncio/windows_events.py},
Lib/asyncio/windows_utils.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/asyncio/windows_utils.py}


__________________________________________________________________



Changed in version 3.8: On Windows, @ref{81e,,ProactorEventLoop} is now the default event loop.


All event loops on Windows do not support the following methods:


@itemize *

@item 
@ref{3877,,loop.create_unix_connection()} and
@ref{4cb,,loop.create_unix_server()} are not supported.
The @ref{1bf3,,socket.AF_UNIX} socket family is specific to Unix.

@item 
@ref{3921,,loop.add_signal_handler()} and
@ref{3922,,loop.remove_signal_handler()} are not supported.
@end itemize

@ref{316,,SelectorEventLoop} has the following limitations:


@itemize *

@item 
@ref{398c,,SelectSelector} is used to wait on socket events:
it supports sockets and is limited to 512 sockets.

@item 
@ref{3892,,loop.add_reader()} and @ref{3918,,loop.add_writer()} only accept
socket handles (e.g. pipe file descriptors are not supported).

@item 
Pipes are not supported, so the @ref{38be,,loop.connect_read_pipe()}
and @ref{38bf,,loop.connect_write_pipe()} methods are not implemented.

@item 
@ref{3832,,Subprocesses} are not supported, i.e.
@ref{38bb,,loop.subprocess_exec()} and @ref{38bc,,loop.subprocess_shell()}
methods are not implemented.
@end itemize

@ref{81e,,ProactorEventLoop} has the following limitations:


@itemize *

@item 
The @ref{3892,,loop.add_reader()} and @ref{3918,,loop.add_writer()}
methods are not supported.
@end itemize

The resolution of the monotonic clock on Windows is usually around 15.6
milliseconds.  The best resolution is 0.5 milliseconds. The resolution depends on the
hardware (availability of HPET@footnote{https://en.wikipedia.org/wiki/High_Precision_Event_Timer}) and on the
Windows configuration.

@menu
* Subprocess Support on Windows:: 

@end menu

@node Subprocess Support on Windows,,,Windows<86>
@anchor{library/asyncio-platforms asyncio-windows-subprocess}@anchor{38bd}@anchor{library/asyncio-platforms subprocess-support-on-windows}@anchor{398d}
@subsubsection Subprocess Support on Windows


On Windows, the default event loop @ref{81e,,ProactorEventLoop} supports
subprocesses, whereas @ref{316,,SelectorEventLoop} does not.

@node macOS<55>,,Windows<86>,Platform Support
@anchor{library/asyncio-platforms macos}@anchor{398e}
@subsubsection macOS


Modern macOS versions are fully supported.

@subsubheading macOS <= 10.8


On macOS 10.6, 10.7 and 10.8, the default event loop
uses @ref{398f,,selectors.KqueueSelector}, which does not support
character devices on these versions.  The @ref{316,,SelectorEventLoop}
can be manually configured to use @ref{398c,,SelectSelector}
or @ref{dd7,,PollSelector} to support character devices on
these older versions of macOS.  Example:

@example
import asyncio
import selectors

selector = selectors.SelectSelector()
loop = asyncio.SelectorEventLoop(selector)
asyncio.set_event_loop(loop)
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Extending,High-level API Index,Platform Support,asyncio — Asynchronous I/O
@anchor{library/asyncio-extending doc}@anchor{3990}@anchor{library/asyncio-extending extending}@anchor{3991}@anchor{library/asyncio-extending translation-repo}@anchor{3992}
@subsubsection Extending


The main direction for @ref{b,,asyncio} extending is writing custom `event loop'
classes. Asyncio has helpers that could be used to simplify this task.

@cartouche
@quotation Note 
Third-parties should reuse existing asyncio code with caution,
a new Python version is free to break backward compatibility
in `internal' part of API.
@end quotation
@end cartouche

@menu
* Writing a Custom Event Loop:: 
* Future and Task private constructors:: 
* Task lifetime support:: 

@end menu

@node Writing a Custom Event Loop,Future and Task private constructors,,Extending
@anchor{library/asyncio-extending writing-a-custom-event-loop}@anchor{3993}
@subsubsection Writing a Custom Event Loop


@ref{b5e,,asyncio.AbstractEventLoop} declares very many methods.  Implementing all them
from scratch is a tedious job.

A loop can get many common methods implementation for free by inheriting from
@code{asyncio.BaseEventLoop}.

In turn, the successor should implement a bunch of `private' methods declared but not
implemented in @code{asyncio.BaseEventLoop}.

For example, @code{loop.create_connection()} checks arguments, resolves DNS addresses, and
calls @code{loop._make_socket_transport()} that should be implemented by inherited class.
The @code{_make_socket_transport()} method is not documented and is considered as an
`internal' API.

@node Future and Task private constructors,Task lifetime support,Writing a Custom Event Loop,Extending
@anchor{library/asyncio-extending future-and-task-private-constructors}@anchor{3994}
@subsubsection Future and Task private constructors


@ref{dcc,,asyncio.Future} and @ref{1c9,,asyncio.Task} should be never created directly,
please use corresponding @ref{e7a,,loop.create_future()} and @ref{1cc,,loop.create_task()},
or @ref{1cb,,asyncio.create_task()} factories instead.

However, third-party `event loops' may `reuse' built-in future and task implementations
for the sake of getting a complex and highly optimized code for free.

For this purpose the following, `private' constructors are listed:

@geindex __init__() (asyncio.Future method)
@anchor{library/asyncio-extending asyncio Future __init__}@anchor{3995}
@deffn {Method} Future.__init__ (*, loop=None)

Create a built-in future instance.

`loop' is an optional event loop instance.
@end deffn

@geindex __init__() (asyncio.Task method)
@anchor{library/asyncio-extending asyncio Task __init__}@anchor{3996}
@deffn {Method} Task.__init__ (coro, *, loop=None, name=None, context=None)

Create a built-in task instance.

`loop' is an optional event loop instance. The rest of arguments are described in
@ref{1cc,,loop.create_task()} description.


Changed in version 3.11: `context' argument is added.

@end deffn

@node Task lifetime support,,Future and Task private constructors,Extending
@anchor{library/asyncio-extending task-lifetime-support}@anchor{3997}
@subsubsection Task lifetime support


A third party task implementation should call the following functions to keep a task
visible by @ref{b55,,asyncio.all_tasks()} and @ref{6a6,,asyncio.current_task()}:

@geindex _register_task() (in module asyncio)
@anchor{library/asyncio-extending asyncio _register_task}@anchor{3998}
@deffn {Function} asyncio._register_task (task)

Register a new `task' as managed by `asyncio'.

Call the function from a task constructor.
@end deffn

@geindex _unregister_task() (in module asyncio)
@anchor{library/asyncio-extending asyncio _unregister_task}@anchor{3999}
@deffn {Function} asyncio._unregister_task (task)

Unregister a `task' from `asyncio' internal structures.

The function should be called when a task is about to finish.
@end deffn

@geindex _enter_task() (in module asyncio)
@anchor{library/asyncio-extending asyncio _enter_task}@anchor{399a}
@deffn {Function} asyncio._enter_task (loop, task)

Switch the current task to the `task' argument.

Call the function just before executing a portion of embedded `coroutine'
(@ref{2460,,coroutine.send()} or @ref{71c,,coroutine.throw()}).
@end deffn

@geindex _leave_task() (in module asyncio)
@anchor{library/asyncio-extending asyncio _leave_task}@anchor{399b}
@deffn {Function} asyncio._leave_task (loop, task)

Switch the current task back from `task' to @code{None}.

Call the function just after @ref{2460,,coroutine.send()} or @ref{71c,,coroutine.throw()}
execution.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node High-level API Index,Low-level API Index,Extending,asyncio — Asynchronous I/O
@anchor{library/asyncio-api-index doc}@anchor{a7f}@anchor{library/asyncio-api-index high-level-api-index}@anchor{399c}@anchor{library/asyncio-api-index translation-repo}@anchor{399d}
@subsubsection High-level API Index


This page lists all high-level async/await enabled asyncio APIs.

@menu
* Tasks:: 
* Queues: Queues<2>. 
* Subprocesses: Subprocesses<2>. 
* Streams: Streams<2>. 
* Synchronization:: 
* Exceptions: Exceptions<17>. 

@end menu

@node Tasks,Queues<2>,,High-level API Index
@anchor{library/asyncio-api-index tasks}@anchor{399e}
@subsubsection Tasks


Utilities to run asyncio programs, create Tasks, and
await on multiple things with timeouts.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@ref{2f5,,run()}

@tab

Create event loop, run a coroutine, close the loop.

@item

@ref{2f7,,Runner}

@tab

A context manager that simplifies multiple async function calls.

@item

@ref{1c9,,Task}

@tab

Task object.

@item

@ref{4d2,,TaskGroup}

@tab

A context manager that holds a group of tasks. Provides
a convenient and reliable way to wait for all tasks in the group to
finish.

@item

@ref{1cb,,create_task()}

@tab

Start an asyncio Task, then returns it.

@item

@ref{6a6,,current_task()}

@tab

Return the current Task.

@item

@ref{b55,,all_tasks()}

@tab

Return all tasks that are not yet finished for an event loop.

@item

@code{await} @ref{c6a,,sleep()}

@tab

Sleep for a number of seconds.

@item

@code{await} @ref{814,,gather()}

@tab

Schedule and wait for things concurrently.

@item

@code{await} @ref{816,,wait_for()}

@tab

Run with a timeout.

@item

@code{await} @ref{c6b,,shield()}

@tab

Shield from cancellation.

@item

@code{await} @ref{6a8,,wait()}

@tab

Monitor for completion.

@item

@ref{815,,timeout()}

@tab

Run with a timeout. Useful in cases when @code{wait_for} is not suitable.

@item

@ref{aeb,,to_thread()}

@tab

Asynchronously run a function in a separate OS thread.

@item

@ref{a88,,run_coroutine_threadsafe()}

@tab

Schedule a coroutine from another OS thread.

@item

@code{for in} @ref{4c7,,as_completed()}

@tab

Monitor for completion with a @code{for} loop.

@end multitable


@subsubheading Examples



@itemize *

@item 
@ref{3851,,Using asyncio.gather() to run things in parallel}.

@item 
@ref{3859,,Using asyncio.wait_for() to enforce a timeout}.

@item 
@ref{386e,,Cancellation}.

@item 
@ref{384f,,Using asyncio.sleep()}.

@item 
See also the main @ref{3830,,Tasks documentation page}.
@end itemize

@node Queues<2>,Subprocesses<2>,Tasks,High-level API Index
@anchor{library/asyncio-api-index queues}@anchor{399f}
@subsubsection Queues


Queues should be used to distribute work amongst multiple asyncio Tasks,
implement connection pools, and pub/sub patterns.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@ref{c70,,Queue}

@tab

A FIFO queue.

@item

@ref{38e1,,PriorityQueue}

@tab

A priority queue.

@item

@ref{38e3,,LifoQueue}

@tab

A LIFO queue.

@end multitable


@subsubheading Examples



@itemize *

@item 
@ref{38e5,,Using asyncio.Queue to distribute workload between several Tasks}.

@item 
See also the @ref{3833,,Queues documentation page}.
@end itemize

@node Subprocesses<2>,Streams<2>,Queues<2>,High-level API Index
@anchor{library/asyncio-api-index subprocesses}@anchor{39a0}
@subsubsection Subprocesses


Utilities to spawn subprocesses and run shell commands.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@code{await} @ref{c71,,create_subprocess_exec()}

@tab

Create a subprocess.

@item

@code{await} @ref{c72,,create_subprocess_shell()}

@tab

Run a shell command.

@end multitable


@subsubheading Examples



@itemize *

@item 
@ref{38b5,,Executing a shell command}.

@item 
See also the @ref{3832,,subprocess APIs}
documentation.
@end itemize

@node Streams<2>,Synchronization,Subprocesses<2>,High-level API Index
@anchor{library/asyncio-api-index streams}@anchor{39a1}
@subsubsection Streams


High-level APIs to work with network IO.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@code{await} @ref{d14,,open_connection()}

@tab

Establish a TCP connection.

@item

@code{await} @ref{3876,,open_unix_connection()}

@tab

Establish a Unix socket connection.

@item

@code{await} @ref{d15,,start_server()}

@tab

Start a TCP server.

@item

@code{await} @ref{3878,,start_unix_server()}

@tab

Start a Unix socket server.

@item

@ref{17b8,,StreamReader}

@tab

High-level async/await object to receive network data.

@item

@ref{1ab6,,StreamWriter}

@tab

High-level async/await object to send network data.

@end multitable


@subsubheading Examples



@itemize *

@item 
@ref{3872,,Example TCP client}.

@item 
See also the @ref{3831,,streams APIs}
documentation.
@end itemize

@node Synchronization,Exceptions<17>,Streams<2>,High-level API Index
@anchor{library/asyncio-api-index synchronization}@anchor{39a2}
@subsubsection Synchronization


Threading-like synchronization primitives that can be used in Tasks.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@ref{c6c,,Lock}

@tab

A mutex lock.

@item

@ref{2f6,,Event}

@tab

An event object.

@item

@ref{c6d,,Condition}

@tab

A condition object.

@item

@ref{c6e,,Semaphore}

@tab

A semaphore.

@item

@ref{c6f,,BoundedSemaphore}

@tab

A bounded semaphore.

@item

@ref{817,,Barrier}

@tab

A barrier object.

@end multitable


@subsubheading Examples



@itemize *

@item 
@ref{389e,,Using asyncio.Event}.

@item 
@ref{38ac,,Using asyncio.Barrier}.

@item 
See also the documentation of asyncio
@ref{3834,,synchronization primitives}.
@end itemize

@node Exceptions<17>,,Synchronization,High-level API Index
@anchor{library/asyncio-api-index exceptions}@anchor{39a3}
@subsubsection Exceptions



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@ref{4d5,,asyncio.CancelledError}

@tab

Raised when a Task is cancelled. See also @ref{4d4,,Task.cancel()}.

@item

@ref{818,,asyncio.BrokenBarrierError}

@tab

Raised when a Barrier is broken. See also @ref{38ab,,Barrier.wait()}.

@end multitable


@subsubheading Examples



@itemize *

@item 
@ref{386e,,Handling CancelledError to run code on cancellation request}.

@item 
See also the full list of
@ref{38e7,,asyncio-specific exceptions}.
@end itemize

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Low-level API Index,Developing with asyncio,High-level API Index,asyncio — Asynchronous I/O
@anchor{library/asyncio-llapi-index doc}@anchor{39a4}@anchor{library/asyncio-llapi-index low-level-api-index}@anchor{39a5}@anchor{library/asyncio-llapi-index translation-repo}@anchor{39a6}
@subsubsection Low-level API Index


This page lists all low-level asyncio APIs.

@menu
* Obtaining the Event Loop:: 
* Event Loop Methods:: 
* Transports: Transports<2>. 
* Protocols: Protocols<3>. 
* Event Loop Policies:: 

@end menu

@node Obtaining the Event Loop,Event Loop Methods,,Low-level API Index
@anchor{library/asyncio-llapi-index obtaining-the-event-loop}@anchor{39a7}
@subsubsection Obtaining the Event Loop



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@ref{d07,,asyncio.get_running_loop()}

@tab

The `preferred' function to get the running event loop.

@item

@ref{2f4,,asyncio.get_event_loop()}

@tab

Get an event loop instance (running or current via the current policy).

@item

@ref{1b99,,asyncio.set_event_loop()}

@tab

Set the event loop as current via the current policy.

@item

@ref{383e,,asyncio.new_event_loop()}

@tab

Create a new event loop.

@end multitable


@subsubheading Examples



@itemize *

@item 
@ref{3943,,Using asyncio.get_running_loop()}.
@end itemize

@node Event Loop Methods,Transports<2>,Obtaining the Event Loop,Low-level API Index
@anchor{library/asyncio-llapi-index event-loop-methods}@anchor{39a8}
@subsubsection Event Loop Methods


See also the main documentation section about the
@ref{38fe,,Event loop methods}.

@subsubheading Lifecycle



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@ref{e78,,loop.run_until_complete()}

@tab

Run a Future/Task/awaitable until complete.

@item

@ref{3900,,loop.run_forever()}

@tab

Run the event loop forever.

@item

@ref{e7d,,loop.stop()}

@tab

Stop the event loop.

@item

@ref{3902,,loop.close()}

@tab

Close the event loop.

@item

@ref{3901,,loop.is_running()}

@tab

Return @code{True} if the event loop is running.

@item

@ref{fc9,,loop.is_closed()}

@tab

Return @code{True} if the event loop is closed.

@item

@code{await} @ref{e7f,,loop.shutdown_asyncgens()}

@tab

Close asynchronous generators.

@end multitable


@subsubheading Debugging



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@ref{fc7,,loop.set_debug()}

@tab

Enable or disable the debug mode.

@item

@ref{fc8,,loop.get_debug()}

@tab

Get the current debug mode.

@end multitable


@subsubheading Scheduling Callbacks



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@ref{d00,,loop.call_soon()}

@tab

Invoke a callback soon.

@item

@ref{d01,,loop.call_soon_threadsafe()}

@tab

A thread-safe variant of @ref{d00,,loop.call_soon()}.

@item

@ref{d02,,loop.call_later()}

@tab

Invoke a callback `after' the given time.

@item

@ref{d03,,loop.call_at()}

@tab

Invoke a callback `at' the given time.

@end multitable


@subsubheading Thread/Interpreter/Process Pool



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@code{await} @ref{aec,,loop.run_in_executor()}

@tab

Run a CPU-bound or other blocking function in
a @ref{24,,concurrent.futures} executor.

@item

@ref{94f,,loop.set_default_executor()}

@tab

Set the default executor for @ref{aec,,loop.run_in_executor()}.

@end multitable


@subsubheading Tasks and Futures



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@ref{e7a,,loop.create_future()}

@tab

Create a @ref{dcc,,Future} object.

@item

@ref{1cc,,loop.create_task()}

@tab

Schedule coroutine as a @ref{1c9,,Task}.

@item

@ref{1ca,,loop.set_task_factory()}

@tab

Set a factory used by @ref{1cc,,loop.create_task()} to
create @ref{1c9,,Tasks}.

@item

@ref{fcb,,loop.get_task_factory()}

@tab

Get the factory @ref{1cc,,loop.create_task()} uses
to create @ref{1c9,,Tasks}.

@end multitable


@subsubheading DNS



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@code{await} @ref{e14,,loop.getaddrinfo()}

@tab

Asynchronous version of @ref{17a8,,socket.getaddrinfo()}.

@item

@code{await} @ref{e15,,loop.getnameinfo()}

@tab

Asynchronous version of @ref{1a81,,socket.getnameinfo()}.

@end multitable


@subsubheading Networking and IPC



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@code{await} @ref{819,,loop.create_connection()}

@tab

Open a TCP connection.

@item

@code{await} @ref{d0f,,loop.create_server()}

@tab

Create a TCP server.

@item

@code{await} @ref{3877,,loop.create_unix_connection()}

@tab

Open a Unix socket connection.

@item

@code{await} @ref{4cb,,loop.create_unix_server()}

@tab

Create a Unix socket server.

@item

@code{await} @ref{9e4,,loop.connect_accepted_socket()}

@tab

Wrap a @ref{fa7,,socket} into a @code{(transport, protocol)}
pair.

@item

@code{await} @ref{941,,loop.create_datagram_endpoint()}

@tab

Open a datagram (UDP) connection.

@item

@code{await} @ref{3914,,loop.sendfile()}

@tab

Send a file over a transport.

@item

@code{await} @ref{d05,,loop.start_tls()}

@tab

Upgrade an existing connection to TLS.

@item

@code{await} @ref{38be,,loop.connect_read_pipe()}

@tab

Wrap a read end of a pipe into a @code{(transport, protocol)} pair.

@item

@code{await} @ref{38bf,,loop.connect_write_pipe()}

@tab

Wrap a write end of a pipe into a @code{(transport, protocol)} pair.

@end multitable


@subsubheading Sockets



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@code{await} @ref{e11,,loop.sock_recv()}

@tab

Receive data from the @ref{fa7,,socket}.

@item

@code{await} @ref{d06,,loop.sock_recv_into()}

@tab

Receive data from the @ref{fa7,,socket} into a buffer.

@item

@code{await} @ref{81c,,loop.sock_recvfrom()}

@tab

Receive a datagram from the @ref{fa7,,socket}.

@item

@code{await} @ref{81d,,loop.sock_recvfrom_into()}

@tab

Receive a datagram from the @ref{fa7,,socket} into a buffer.

@item

@code{await} @ref{e12,,loop.sock_sendall()}

@tab

Send data to the @ref{fa7,,socket}.

@item

@code{await} @ref{81b,,loop.sock_sendto()}

@tab

Send a datagram via the @ref{fa7,,socket} to the given address.

@item

@code{await} @ref{fce,,loop.sock_connect()}

@tab

Connect the @ref{fa7,,socket}.

@item

@code{await} @ref{e13,,loop.sock_accept()}

@tab

Accept a @ref{fa7,,socket} connection.

@item

@code{await} @ref{d0a,,loop.sock_sendfile()}

@tab

Send a file over the @ref{fa7,,socket}.

@item

@ref{3892,,loop.add_reader()}

@tab

Start watching a file descriptor for read availability.

@item

@ref{3917,,loop.remove_reader()}

@tab

Stop watching a file descriptor for read availability.

@item

@ref{3918,,loop.add_writer()}

@tab

Start watching a file descriptor for write availability.

@item

@ref{3919,,loop.remove_writer()}

@tab

Stop watching a file descriptor for write availability.

@end multitable


@subsubheading Unix Signals



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@ref{3921,,loop.add_signal_handler()}

@tab

Add a handler for a @ref{cb,,signal}.

@item

@ref{3922,,loop.remove_signal_handler()}

@tab

Remove a handler for a @ref{cb,,signal}.

@end multitable


@subsubheading Subprocesses



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@ref{38bb,,loop.subprocess_exec()}

@tab

Spawn a subprocess.

@item

@ref{38bc,,loop.subprocess_shell()}

@tab

Spawn a subprocess from a shell command.

@end multitable


@subsubheading Error Handling



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@ref{3926,,loop.call_exception_handler()}

@tab

Call the exception handler.

@item

@ref{3925,,loop.set_exception_handler()}

@tab

Set a new exception handler.

@item

@ref{e7b,,loop.get_exception_handler()}

@tab

Get the current exception handler.

@item

@ref{3927,,loop.default_exception_handler()}

@tab

The default exception handler implementation.

@end multitable


@subsubheading Examples



@itemize *

@item 
@ref{3932,,Using asyncio.new_event_loop() and loop.run_forever()}.

@item 
@ref{3934,,Using loop.call_later()}.

@item 
Using @code{loop.create_connection()} to implement
@ref{3889,,an echo-client}.

@item 
Using @code{loop.create_connection()} to
@ref{3890,,connect a socket}.

@item 
@ref{3891,,Using add_reader() to watch an FD for read events}.

@item 
@ref{3937,,Using loop.add_signal_handler()}.

@item 
@ref{38d0,,Using loop.subprocess_exec()}.
@end itemize

@node Transports<2>,Protocols<3>,Event Loop Methods,Low-level API Index
@anchor{library/asyncio-llapi-index transports}@anchor{39a9}
@subsubsection Transports


All transports implement the following methods:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@ref{390e,,transport.close()}

@tab

Close the transport.

@item

@ref{e79,,transport.is_closing()}

@tab

Return @code{True} if the transport is closing or is closed.

@item

@ref{c99,,transport.get_extra_info()}

@tab

Request for information about the transport.

@item

@ref{3953,,transport.set_protocol()}

@tab

Set a new protocol.

@item

@ref{3954,,transport.get_protocol()}

@tab

Return the current protocol.

@end multitable


Transports that can receive data (TCP and Unix connections,
pipes, etc).  Returned from methods like
@ref{819,,loop.create_connection()}, @ref{3877,,loop.create_unix_connection()},
@ref{38be,,loop.connect_read_pipe()}, etc:

@subsubheading Read Transports



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@ref{d17,,transport.is_reading()}

@tab

Return @code{True} if the transport is receiving.

@item

@ref{d19,,transport.pause_reading()}

@tab

Pause receiving.

@item

@ref{d18,,transport.resume_reading()}

@tab

Resume receiving.

@end multitable


Transports that can Send data (TCP and Unix connections,
pipes, etc).  Returned from methods like
@ref{819,,loop.create_connection()}, @ref{3877,,loop.create_unix_connection()},
@ref{38bf,,loop.connect_write_pipe()}, etc:

@subsubheading Write Transports



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@ref{1819,,transport.write()}

@tab

Write data to the transport.

@item

@ref{1818,,transport.writelines()}

@tab

Write buffers to the transport.

@item

@ref{3957,,transport.can_write_eof()}

@tab

Return @ref{e0d,,True} if the transport supports sending EOF.

@item

@ref{3958,,transport.write_eof()}

@tab

Close and send EOF after flushing buffered data.

@item

@ref{392f,,transport.abort()}

@tab

Close the transport immediately.

@item

@ref{3959,,transport.get_write_buffer_size()}

@tab

Return the current size of the output buffer.

@item

@ref{fca,,transport.get_write_buffer_limits()}

@tab

Return high and low water marks for write flow control.

@item

@ref{395a,,transport.set_write_buffer_limits()}

@tab

Set new high and low water marks for write flow control.

@end multitable


Transports returned by @ref{941,,loop.create_datagram_endpoint()}:

@subsubheading Datagram Transports



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@ref{4cc,,transport.sendto()}

@tab

Send data to the remote peer.

@item

@ref{395e,,transport.abort()}

@tab

Close the transport immediately.

@end multitable


Low-level transport abstraction over subprocesses.
Returned by @ref{38bb,,loop.subprocess_exec()} and
@ref{38bc,,loop.subprocess_shell()}:

@subsubheading Subprocess Transports



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@ref{3960,,transport.get_pid()}

@tab

Return the subprocess process id.

@item

@ref{3961,,transport.get_pipe_transport()}

@tab

Return the transport for the requested communication pipe
(`stdin', `stdout', or `stderr').

@item

@ref{3962,,transport.get_returncode()}

@tab

Return the subprocess return code.

@item

@ref{3963,,transport.kill()}

@tab

Kill the subprocess.

@item

@ref{3965,,transport.send_signal()}

@tab

Send a signal to the subprocess.

@item

@ref{3964,,transport.terminate()}

@tab

Stop the subprocess.

@item

@ref{3966,,transport.close()}

@tab

Kill the subprocess and close all pipes.

@end multitable


@node Protocols<3>,Event Loop Policies,Transports<2>,Low-level API Index
@anchor{library/asyncio-llapi-index protocols}@anchor{39aa}
@subsubsection Protocols


Protocol classes can implement the following `callback methods':


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@code{callback} @ref{390c,,connection_made()}

@tab

Called when a connection is made.

@item

@code{callback} @ref{3950,,connection_lost()}

@tab

Called when the connection is lost or closed.

@item

@code{callback} @ref{395b,,pause_writing()}

@tab

Called when the transport’s buffer goes over the high water mark.

@item

@code{callback} @ref{395c,,resume_writing()}

@tab

Called when the transport’s buffer drains below the low water mark.

@end multitable


@subsubheading Streaming Protocols (TCP, Unix Sockets, Pipes)



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@code{callback} @ref{1b46,,data_received()}

@tab

Called when some data is received.

@item

@code{callback} @ref{396a,,eof_received()}

@tab

Called when an EOF is received.

@end multitable


@subsubheading Buffered Streaming Protocols



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@code{callback} @ref{396c,,get_buffer()}

@tab

Called to allocate a new receive buffer.

@item

@code{callback} @ref{396d,,buffer_updated()}

@tab

Called when the buffer was updated with the received data.

@item

@code{callback} @ref{396e,,eof_received()}

@tab

Called when an EOF is received.

@end multitable


@subsubheading Datagram Protocols



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@code{callback} @ref{3970,,datagram_received()}

@tab

Called when a datagram is received.

@item

@code{callback} @ref{3971,,error_received()}

@tab

Called when a previous send or receive operation raises an
@ref{2c2,,OSError}.

@end multitable


@subsubheading Subprocess Protocols



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@code{callback} @ref{1b94,,pipe_data_received()}

@tab

Called when the child process writes data into its
`stdout' or `stderr' pipe.

@item

@code{callback} @ref{3973,,pipe_connection_lost()}

@tab

Called when one of the pipes communicating with
the child process is closed.

@item

@code{callback} @ref{1b93,,process_exited()}

@tab

Called when the child process has exited. It can be called before
@ref{1b94,,pipe_data_received()} and
@ref{3973,,pipe_connection_lost()} methods.

@end multitable


@node Event Loop Policies,,Protocols<3>,Low-level API Index
@anchor{library/asyncio-llapi-index event-loop-policies}@anchor{39ab}
@subsubsection Event Loop Policies


Policies is a low-level mechanism to alter the behavior of
functions like @ref{2f4,,asyncio.get_event_loop()}.  See also
the main @ref{38f8,,policies section} for more
details.

@subsubheading Accessing Policies



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@ref{314,,asyncio.get_event_loop_policy()}

@tab

Return the current process-wide policy.

@item

@ref{315,,asyncio.set_event_loop_policy()}

@tab

Set a new process-wide policy.

@item

@ref{310,,AbstractEventLoopPolicy}

@tab

Base class for policy objects.

@end multitable


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Developing with asyncio,asyncio and free-threaded Python,Low-level API Index,asyncio — Asynchronous I/O
@anchor{library/asyncio-dev doc}@anchor{39ac}@anchor{library/asyncio-dev asyncio-dev}@anchor{39ad}@anchor{library/asyncio-dev developing-with-asyncio}@anchor{39ae}@anchor{library/asyncio-dev translation-repo}@anchor{39af}
@subsubsection Developing with asyncio


Asynchronous programming is different from classic “sequential”
programming.

This page lists common mistakes and traps and explains how
to avoid them.

@menu
* Debug Mode:: 
* Concurrency and Multithreading:: 
* Running Blocking Code:: 
* Logging: Logging<3>. 
* Detect never-awaited coroutines:: 
* Detect never-retrieved exceptions:: 
* Asynchronous generators best practices:: 

@end menu

@node Debug Mode,Concurrency and Multithreading,,Developing with asyncio
@anchor{library/asyncio-dev asyncio-debug-mode}@anchor{217d}@anchor{library/asyncio-dev debug-mode}@anchor{39b0}
@subsubsection Debug Mode


By default asyncio runs in production mode.  In order to ease
the development asyncio has a `debug mode'.

There are several ways to enable asyncio debug mode:


@itemize *

@item 
Setting the 
@geindex PYTHONASYNCIODEBUG
@geindex environment variable; PYTHONASYNCIODEBUG
@ref{217c,,PYTHONASYNCIODEBUG} environment variable to @code{1}.

@item 
Using the @ref{509,,Python Development Mode}.

@item 
Passing @code{debug=True} to @ref{2f5,,asyncio.run()}.

@item 
Calling @ref{fc7,,loop.set_debug()}.
@end itemize

In addition to enabling the debug mode, consider also:


@itemize *

@item 
setting the log level of the @ref{39b1,,asyncio logger} to
@ref{2121,,logging.DEBUG}, for example the following snippet of code
can be run at startup of the application:

@example
logging.basicConfig(level=logging.DEBUG)
@end example

@item 
configuring the @ref{119,,warnings} module to display
@ref{54d,,ResourceWarning} warnings.  One way of doing that is by
using the @ref{acb,,-W} @code{default} command line option.
@end itemize

When the debug mode is enabled:


@itemize *

@item 
Many non-threadsafe asyncio APIs (such as @ref{d00,,loop.call_soon()} and
@ref{d03,,loop.call_at()} methods) raise an exception if they are called
from a wrong thread.

@item 
The execution time of the I/O selector is logged if it takes too long to
perform an I/O operation.

@item 
Callbacks taking longer than 100 milliseconds are logged.  The
@ref{3929,,loop.slow_callback_duration} attribute can be used to set the
minimum execution duration in seconds that is considered “slow”.
@end itemize

@node Concurrency and Multithreading,Running Blocking Code,Debug Mode,Developing with asyncio
@anchor{library/asyncio-dev asyncio-multithreading}@anchor{3860}@anchor{library/asyncio-dev concurrency-and-multithreading}@anchor{39b2}
@subsubsection Concurrency and Multithreading


An event loop runs in a thread (typically the main thread) and executes
all callbacks and Tasks in its thread.  While a Task is running in the
event loop, no other Tasks can run in the same thread.  When a Task
executes an @code{await} expression, the running Task gets suspended, and
the event loop executes the next Task.

To schedule a @ref{2e0d,,callback} from another OS thread, the
@ref{d01,,loop.call_soon_threadsafe()} method should be used. Example:

@example
loop.call_soon_threadsafe(callback, *args)
@end example

Almost all asyncio objects are not thread safe, which is typically
not a problem unless there is code that works with them from outside
of a Task or a callback.  If there’s a need for such code to call a
low-level asyncio API, the @ref{d01,,loop.call_soon_threadsafe()} method
should be used, e.g.:

@example
loop.call_soon_threadsafe(fut.cancel)
@end example

To schedule a coroutine object from a different OS thread, the
@ref{a88,,run_coroutine_threadsafe()} function should be used. It returns a
@ref{13be,,concurrent.futures.Future} to access the result:

@example
async def coro_func():
     return await asyncio.sleep(1, 42)

# Later in another OS thread:

future = asyncio.run_coroutine_threadsafe(coro_func(), loop)
# Wait for the result:
result = future.result()
@end example

To handle signals the event loop must be
run in the main thread.

The @ref{aec,,loop.run_in_executor()} method can be used with a
@ref{94e,,concurrent.futures.ThreadPoolExecutor} or
@ref{1d4,,InterpreterPoolExecutor} to execute
blocking code in a different OS thread without blocking the OS thread
that the event loop runs in.

There is currently no way to schedule coroutines or callbacks directly
from a different process (such as one started with
@ref{98,,multiprocessing}). The @ref{38fe,,Event loop methods}
section lists APIs that can read from pipes and watch file descriptors
without blocking the event loop. In addition, asyncio’s
@ref{3832,,Subprocess} APIs provide a way to start a
process and communicate with it from the event loop. Lastly, the
aforementioned @ref{aec,,loop.run_in_executor()} method can also be used
with a @ref{1d8,,concurrent.futures.ProcessPoolExecutor} to execute
code in a different process.

@node Running Blocking Code,Logging<3>,Concurrency and Multithreading,Developing with asyncio
@anchor{library/asyncio-dev asyncio-handle-blocking}@anchor{39b3}@anchor{library/asyncio-dev running-blocking-code}@anchor{39b4}
@subsubsection Running Blocking Code


Blocking (CPU-bound) code should not be called directly.  For example,
if a function performs a CPU-intensive calculation for 1 second,
all concurrent asyncio Tasks and IO operations would be delayed
by 1 second.

An executor can be used to run a task in a different thread,
including in a different interpreter, or even in
a different process to avoid blocking the OS thread with the
event loop.  See the @ref{aec,,loop.run_in_executor()} method for more
details.

@node Logging<3>,Detect never-awaited coroutines,Running Blocking Code,Developing with asyncio
@anchor{library/asyncio-dev asyncio-logger}@anchor{39b1}@anchor{library/asyncio-dev logging}@anchor{39b5}
@subsubsection Logging


asyncio uses the @ref{8b,,logging} module and all logging is performed
via the @code{"asyncio"} logger.

The default log level is @ref{2122,,logging.INFO}, which can be easily
adjusted:

@example
logging.getLogger("asyncio").setLevel(logging.WARNING)
@end example

Network logging can block the event loop. It is recommended to use
a separate thread for handling logs or use non-blocking IO. For example,
see @ref{39b6,,Dealing with handlers that block}.

@node Detect never-awaited coroutines,Detect never-retrieved exceptions,Logging<3>,Developing with asyncio
@anchor{library/asyncio-dev asyncio-coroutine-not-scheduled}@anchor{39b7}@anchor{library/asyncio-dev detect-never-awaited-coroutines}@anchor{39b8}
@subsubsection Detect never-awaited coroutines


When a coroutine function is called, but not awaited
(e.g. @code{coro()} instead of @code{await coro()})
or the coroutine is not scheduled with @ref{1cb,,asyncio.create_task()}, asyncio
will emit a @ref{4d8,,RuntimeWarning}:

@example
import asyncio

async def test():
    print("never scheduled")

async def main():
    test()

asyncio.run(main())
@end example

Output:

@example
test.py:7: RuntimeWarning: coroutine 'test' was never awaited
  test()
@end example

Output in debug mode:

@example
test.py:7: RuntimeWarning: coroutine 'test' was never awaited
Coroutine created at (most recent call last)
  File "../t.py", line 9, in <module>
    asyncio.run(main(), debug=True)

  < .. >

  File "../t.py", line 7, in main
    test()
  test()
@end example

The usual fix is to either await the coroutine or call the
@ref{1cb,,asyncio.create_task()} function:

@example
async def main():
    await test()
@end example

@node Detect never-retrieved exceptions,Asynchronous generators best practices,Detect never-awaited coroutines,Developing with asyncio
@anchor{library/asyncio-dev detect-never-retrieved-exceptions}@anchor{39b9}
@subsubsection Detect never-retrieved exceptions


If a @ref{e7e,,Future.set_exception()} is called but the Future object is
never awaited on, the exception would never be propagated to the
user code.  In this case, asyncio would emit a log message when the
Future object is garbage collected.

Example of an unhandled exception:

@example
import asyncio

async def bug():
    raise Exception("not consumed")

async def main():
    asyncio.create_task(bug())

asyncio.run(main())
@end example

Output:

@example
Task exception was never retrieved
future: <Task finished coro=<bug() done, defined at test.py:3>
  exception=Exception('not consumed')>

Traceback (most recent call last):
  File "test.py", line 4, in bug
    raise Exception("not consumed")
Exception: not consumed
@end example

@ref{217d,,Enable the debug mode} to get the
traceback where the task was created:

@example
asyncio.run(main(), debug=True)
@end example

Output in debug mode:

@example
Task exception was never retrieved
future: <Task finished coro=<bug() done, defined at test.py:3>
    exception=Exception('not consumed') created at asyncio/tasks.py:321>

source_traceback: Object created at (most recent call last):
  File "../t.py", line 9, in <module>
    asyncio.run(main(), debug=True)

< .. >

Traceback (most recent call last):
  File "../t.py", line 4, in bug
    raise Exception("not consumed")
Exception: not consumed
@end example

@node Asynchronous generators best practices,,Detect never-retrieved exceptions,Developing with asyncio
@anchor{library/asyncio-dev asynchronous-generators-best-practices}@anchor{39ba}
@subsubsection Asynchronous generators best practices


Writing correct and efficient asyncio code requires awareness of certain pitfalls.
This section outlines essential best practices that can save you hours of debugging.

@menu
* Close asynchronous generators explicitly:: 
* Create asynchronous generators only when the event loop is running:: 
* Avoid concurrent iteration and closure of the same generator:: 

@end menu

@node Close asynchronous generators explicitly,Create asynchronous generators only when the event loop is running,,Asynchronous generators best practices
@anchor{library/asyncio-dev close-asynchronous-generators-explicitly}@anchor{39bb}
@subsubsection Close asynchronous generators explicitly


It is recommended to manually close the
@ref{39bc,,asynchronous generator}. If a generator
exits early - for example, due to an exception raised in the body of
an @code{async for} loop - its asynchronous cleanup code may run in an
unexpected context. This can occur after the tasks it depends on have completed,
or during the event loop shutdown when the async-generator’s garbage collection
hook is called.

To avoid this, explicitly close the generator by calling its
@ref{adb,,aclose()} method, or use the @ref{9f4,,contextlib.aclosing()}
context manager:

@example
import asyncio
import contextlib

async def gen():
  yield 1
  yield 2

async def func():
  async with contextlib.aclosing(gen()) as g:
    async for x in g:
      break  # Don't iterate until the end

asyncio.run(func())
@end example

As noted above, the cleanup code for these asynchronous generators is deferred.
The following example demonstrates that the finalization of an asynchronous
generator can occur in an unexpected order:

@example
import asyncio
work_done = False

async def cursor():
    try:
        yield 1
    finally:
        assert work_done

async def rows():
    global work_done
    try:
        yield 2
    finally:
        await asyncio.sleep(0.1) # immitate some async work
        work_done = True


async def main():
    async for c in cursor():
        async for r in rows():
            break
        break

asyncio.run(main())
@end example

For this example, we get the following output:

@example
unhandled exception during asyncio.run() shutdown
task: <Task finished name='Task-3' coro=<<async_generator_athrow without __name__>()> exception=AssertionError()>
Traceback (most recent call last):
  File "example.py", line 6, in cursor
    yield 1
asyncio.exceptions.CancelledError

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "example.py", line 8, in cursor
    assert work_done
           ^^^^^^^^^
AssertionError
@end example

The @code{cursor()} asynchronous generator was finalized before the @code{rows}
generator - an unexpected behavior.

The example can be fixed by explicitly closing the
@code{cursor} and @code{rows} async-generators:

@example
async def main():
    async with contextlib.aclosing(cursor()) as cursor_gen:
        async for c in cursor_gen:
            async with contextlib.aclosing(rows()) as rows_gen:
                async for r in rows_gen:
                    break
            break
@end example

@node Create asynchronous generators only when the event loop is running,Avoid concurrent iteration and closure of the same generator,Close asynchronous generators explicitly,Asynchronous generators best practices
@anchor{library/asyncio-dev create-asynchronous-generators-only-when-the-event-loop-is-running}@anchor{39bd}
@subsubsection Create asynchronous generators only when the event loop is running


It is recommended to create
@ref{39bc,,asynchronous generators} only after
the event loop has been created.

To ensure that asynchronous generators close reliably, the event loop uses the
@ref{19e0,,sys.set_asyncgen_hooks()} function to register callback functions. These
callbacks update the list of running asynchronous generators to keep it in a
consistent state.

When the @ref{e7f,,loop.shutdown_asyncgens()}
function is called, the running generators are stopped gracefully and the
list is cleared.

The asynchronous generator invokes the corresponding system hook during its
first iteration. At the same time, the generator records that the hook has
been called and does not call it again.

Therefore, if iteration begins before the event loop is created,
the event loop will not be able to add the generator to its list of active
generators because the hooks are set after the generator attempts to call them.
Consequently, the event loop will not be able to terminate the generator
if necessary.

Consider the following example:

@example
import asyncio

async def agenfn():
    try:
        yield 10
    finally:
        await asyncio.sleep(0)


with asyncio.Runner() as runner:
    agen = agenfn()
    print(runner.run(anext(agen)))
    del agen
@end example

Output:

@example
10
Exception ignored while closing generator <async_generator object agenfn at 0x000002F71CD10D70>:
Traceback (most recent call last):
  File "example.py", line 13, in <module>
    del agen
        ^^^^
RuntimeError: async generator ignored GeneratorExit
@end example

This example can be fixed as follows:

@example
import asyncio

async def agenfn():
    try:
        yield 10
    finally:
        await asyncio.sleep(0)

async def main():
    agen = agenfn()
    print(await anext(agen))
    del agen

asyncio.run(main())
@end example

@node Avoid concurrent iteration and closure of the same generator,,Create asynchronous generators only when the event loop is running,Asynchronous generators best practices
@anchor{library/asyncio-dev avoid-concurrent-iteration-and-closure-of-the-same-generator}@anchor{39be}
@subsubsection Avoid concurrent iteration and closure of the same generator


Async generators may be reentered while another
@ref{24e7,,__anext__()} / @ref{71e,,athrow()} / @ref{adb,,aclose()} call is in
progress. This may lead to an inconsistent state of the async generator and can
cause errors.

Let’s consider the following example:

@example
import asyncio

async def consumer():
    for idx in range(100):
        await asyncio.sleep(0)
        message = yield idx
        print('received', message)

async def amain():
    agenerator = consumer()
    await agenerator.asend(None)

    fa = asyncio.create_task(agenerator.asend('A'))
    fb = asyncio.create_task(agenerator.asend('B'))
    await fa
    await fb

asyncio.run(amain())
@end example

Output:

@example
received A
Traceback (most recent call last):
  File "test.py", line 38, in <module>
    asyncio.run(amain())
    ~~~~~~~~~~~^^^^^^^^^
  File "Lib/asyncio/runners.py", line 204, in run
    return runner.run(main)
           ~~~~~~~~~~^^^^^^
  File "Lib/asyncio/runners.py", line 127, in run
    return self._loop.run_until_complete(task)
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^
  File "Lib/asyncio/base_events.py", line 719, in run_until_complete
    return future.result()
           ~~~~~~~~~~~~~^^
  File "test.py", line 36, in amain
    await fb
RuntimeError: anext(): asynchronous generator is already running
@end example

Therefore, it is recommended to avoid using asynchronous generators in parallel
tasks or across multiple event loops.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node asyncio and free-threaded Python,,Developing with asyncio,asyncio — Asynchronous I/O
@anchor{library/asyncio-threading doc}@anchor{39bf}@anchor{library/asyncio-threading asyncio-and-free-threaded-python}@anchor{39c0}@anchor{library/asyncio-threading asyncio-threading}@anchor{39c1}@anchor{library/asyncio-threading translation-repo}@anchor{39c2}
@subsubsection asyncio and free-threaded Python


asyncio uses an event loop as a scheduler to enable highly efficient
concurrency by switching between tasks to allow non-blocking I/O
operations. This results in better performance for I/O-bound use
cases. It also allows off-loading CPU-bound work to a thread or
process pool, but that is still limited by the @ref{474,,global interpreter lock} in CPython.

However, in @ref{2766,,free-threaded Python},
the GIL is disabled and Python can run true multi-threaded code. This
means that asyncio can now take advantage of multiple CPU cores without
the limitations imposed by the GIL.

Since Python 3.14, asyncio has first-class support for free-threaded
Python, and the implementation of asyncio is safe to use in a
multi-threaded environment.

A single event loop on one core can handle many connections
concurrently, but the Python code that runs to handle each one still
executes serially. Once requests involve a non-trivial amount of
per-request computation, that handling becomes the bottleneck, and a
single core can no longer keep up. Combining asyncio with threads is
most useful here: by running an event loop per thread, the handling of
different requests can run in parallel across multiple CPU cores. It is
also useful when you need to run blocking or CPU-bound code from an
asyncio application.


@subsubheading See also


Scaling asyncio on Free-Threaded Python@footnote{https://labs.quansight.org/blog/scaling-asyncio-on-free-threaded-python},
a blog post by Kumar Aditya which explains the internal changes
that make asyncio safe and efficient under free-threaded Python,
together with benchmarks of the resulting improvements.


@menu
* Thread safety considerations:: 
* Using asyncio with threads:: 
* Producer/consumer across threads:: 

@end menu

@node Thread safety considerations,Using asyncio with threads,,asyncio and free-threaded Python
@anchor{library/asyncio-threading thread-safety-considerations}@anchor{39c3}
@subsubsection Thread safety considerations


While asyncio is designed to be thread-safe in a free-threaded Python
environment, there are still some considerations to keep in mind when
using asyncio with threads:


@enumerate 

@item 
`Event loop': Each thread should have its own event loop which
should not be shared across threads. This ensures that the event loop
can manage its own tasks and callbacks without interference from
other threads.

@item 
`Task management': Tasks and futures created in one thread should
not be awaited or manipulated from another thread.

@item 
`Thread-safe APIs': When interacting with asyncio from multiple
threads, it’s important to use thread-safe APIs provided by asyncio,
such as @ref{a88,,asyncio.run_coroutine_threadsafe()} for submitting
coroutines to an event loop from another thread. If you need to
call a callback from a different thread, you can use
@ref{d01,,loop.call_soon_threadsafe()} to schedule it safely.

@item 
`Synchronization': The synchronization primitives provided by
asyncio (like @ref{c6c,,asyncio.Lock} and @ref{2f6,,asyncio.Event})
are not designed to be used across threads. If you need to
synchronize between threads, you should use the synchronization
primitives from the @ref{f3,,threading} module instead.
@end enumerate

@node Using asyncio with threads,Producer/consumer across threads,Thread safety considerations,asyncio and free-threaded Python
@anchor{library/asyncio-threading using-asyncio-with-threads}@anchor{39c4}
@subsubsection Using asyncio with threads


asyncio supports running one event loop per thread, which allows you to
take advantage of multiple CPU cores in a free-threaded Python
environment. Each thread can run its own event loop, and tasks can be
scheduled on those loops independently.

Here’s an example of how to use asyncio with threads:

@example
import asyncio
import threading

async def worker(name: str) -> None:
    print(f"Worker @{name@} starting")
    await asyncio.sleep(1)
    print(f"Worker @{name@} done")

def run_loop(name: str) -> None:
    asyncio.run(worker(name))

threads = [
    threading.Thread(target=run_loop, args=(f"T@{i@}",))
    for i in range(4)
]
for t in threads:
    t.start()
for t in threads:
    t.join()
@end example

In this example, each thread creates its own event loop with
@ref{2f5,,asyncio.run()} and runs a coroutine on it. The threads execute
concurrently, and in a free-threaded build they can run on separate
CPU cores in parallel.

@node Producer/consumer across threads,,Using asyncio with threads,asyncio and free-threaded Python
@anchor{library/asyncio-threading producer-consumer-across-threads}@anchor{39c5}
@subsubsection Producer/consumer across threads


When a regular (non-asyncio) thread needs to hand work to an asyncio
event loop running in another thread, use a thread-safe primitive such
as @ref{15a0,,queue.Queue} rather than @ref{c70,,asyncio.Queue}, which is
only safe within a single event loop.:

@example
import asyncio
import queue
import threading

def producer(q: queue.Queue[int]) -> None:
    for i in range(5):
        print(f"Producing @{i@}")
        q.put(i)
    q.shutdown()

async def consumer(q: queue.Queue[int]) -> None:
    while True:
        try:
            item = q.get_nowait()
        except queue.Empty:
            await asyncio.sleep(0.1)
            continue
        except queue.ShutDown:
            break
        print(f"Consumed @{item@}")
        await asyncio.sleep(item)

q: queue.Queue[int] = queue.Queue()
consumer_thread = threading.Thread(
    target=lambda: asyncio.run(consumer(q))
)
consumer_thread.start()
producer(q)
consumer_thread.join()
@end example

The producer runs on the main thread while the consumer runs inside an
event loop on its own thread, yet they communicate safely through
@code{queue.Queue}. When the queue is empty the consumer sleeps briefly
and tries again. When the producer is done it calls
@ref{543,,shutdown()}, which causes subsequent
@ref{37fc,,get_nowait()} calls to raise @ref{544,,queue.ShutDown}
so the consumer can exit cleanly.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@cartouche
@quotation Note 
The source code for asyncio can be found in Lib/asyncio/@footnote{https://github.com/python/cpython/tree/3.14/Lib/asyncio/}.
@end quotation
@end cartouche

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node socket — Low-level networking interface,ssl — TLS/SSL wrapper for socket objects,asyncio — Asynchronous I/O,Networking and Interprocess Communication
@anchor{library/socket doc}@anchor{39c6}@anchor{library/socket module-socket}@anchor{d1}@anchor{library/socket socket-low-level-networking-interface}@anchor{39c7}@anchor{library/socket translation-repo}@anchor{39c8}
@subsection @code{socket} — Low-level networking interface


@geindex module; socket

`Source code:' Lib/socket.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/socket.py}


__________________________________________________________________


This module provides access to the BSD `socket' interface. It is available on
all modern Unix systems, Windows, MacOS, and probably additional platforms.

@cartouche
@quotation Note 
Some behavior may be platform dependent, since calls are made to the operating
system socket APIs.
@end quotation
@end cartouche

@c include for modules that don't work on WASM

@ref{2181,,Availability}: not WASI.

This module does not work or is not available on WebAssembly. See
@ref{1bae,,WebAssembly platforms} for more information.

@geindex object; socket

The Python interface is a straightforward transliteration of the Unix system
call and library interface for sockets to Python’s object-oriented style: the
@ref{fa7,,socket()} function returns a `socket object' whose methods implement
the various socket system calls.  Parameter types are somewhat higher-level than
in the C interface: as with @code{read()} and @code{write()} operations on Python
files, buffer allocation on receive operations is automatic, and buffer length
is implicit on send operations.


@subsubheading See also



@table @asis

@item Module @ref{d2,,socketserver}

Classes that simplify writing network servers.

@item Module @ref{d5,,ssl}

A TLS/SSL wrapper for socket objects.
@end table


@menu
* Socket families:: 
* Module contents: Module contents<2>. 
* Socket Objects:: 
* Notes on socket timeouts:: 
* Example: Example<7>. 

@end menu

@node Socket families,Module contents<2>,,socket — Low-level networking interface
@anchor{library/socket socket-addresses}@anchor{39c9}@anchor{library/socket socket-families}@anchor{39ca}
@subsubsection Socket families


Depending on the system and the build options, various socket families
are supported by this module.

The address format required by a particular socket object is automatically
selected based on the address family specified when the socket object was
created.  Socket addresses are represented as follows:


@itemize -

@item 
The address of an @ref{1bf3,,AF_UNIX} socket bound to a file system node
is represented as a string, using the file system encoding and the
@code{'surrogateescape'} error handler (see 
@geindex Python Enhancement Proposals; PEP 383
PEP 383@footnote{https://peps.python.org/pep-0383/}).  An address in
Linux’s abstract namespace is returned as a @ref{194,,bytes-like object} with
an initial null byte; note that sockets in this namespace can
communicate with normal file system sockets, so programs intended to
run on Linux may need to deal with both types of address.  A string or
bytes-like object can be used for either type of address when
passing it as an argument.


Changed in version 3.3: Previously, @ref{1bf3,,AF_UNIX} socket paths were assumed to use UTF-8
encoding.



Changed in version 3.5: Writable @ref{194,,bytes-like object} is now accepted.

@end itemize
@anchor{library/socket host-port}@anchor{39cb}

@itemize -

@item 
A pair @code{(host, port)} is used for the @ref{1bf0,,AF_INET} address family,
where `host' is a string representing either a hostname in internet domain
notation like @code{'daring.cwi.nl'} or an IPv4 address like @code{'100.50.200.5'},
and `port' is an integer.


@itemize -

@item 
For IPv4 addresses, two special forms are accepted instead of a host
address: @code{'@w{'}} represents @code{INADDR_ANY}, which is used to bind to all
interfaces, and the string @code{'<broadcast>'} represents
@code{INADDR_BROADCAST}.  This behavior is not compatible with IPv6,
therefore, you may want to avoid these if you intend to support IPv6 with your
Python programs.
@end itemize

@item 
For @ref{1bf1,,AF_INET6} address family, a four-tuple @code{(host, port, flowinfo,
scope_id)} is used, where `flowinfo' and `scope_id' represent the @code{sin6_flowinfo}
and @code{sin6_scope_id} members in @code{struct sockaddr_in6} in C.  For
@code{socket} module methods, `flowinfo' and `scope_id' can be omitted just for
backward compatibility.  Note, however, omission of `scope_id' can cause problems
in manipulating scoped IPv6 addresses.


Changed in version 3.7: For multicast addresses (with `scope_id' meaningful) `address' may not contain
@code{%scope_id} (or @code{zone id}) part. This information is superfluous and may
be safely omitted (recommended).


@item 
@code{AF_NETLINK} sockets are represented as pairs @code{(pid, groups)}.

@item 
Linux-only support for TIPC is available using the @code{AF_TIPC}
address family.  TIPC is an open, non-IP based networked protocol designed
for use in clustered computer environments.  Addresses are represented by a
tuple, and the fields depend on the address type. The general tuple form is
@code{(addr_type, v1, v2, v3 [, scope])}, where:


@itemize -

@item 
`addr_type' is one of @code{TIPC_ADDR_NAMESEQ}, @code{TIPC_ADDR_NAME},
or @code{TIPC_ADDR_ID}.

@item 
`scope' is one of @code{TIPC_ZONE_SCOPE}, @code{TIPC_CLUSTER_SCOPE}, and
@code{TIPC_NODE_SCOPE}.

@item 
If `addr_type' is @code{TIPC_ADDR_NAME}, then `v1' is the server type, `v2' is
the port identifier, and `v3' should be 0.

If `addr_type' is @code{TIPC_ADDR_NAMESEQ}, then `v1' is the server type, `v2'
is the lower port number, and `v3' is the upper port number.

If `addr_type' is @code{TIPC_ADDR_ID}, then `v1' is the node, `v2' is the
reference, and `v3' should be set to 0.
@end itemize

@item 
A tuple @code{(interface, )} is used for the @ref{39cc,,AF_CAN} address family,
where `interface' is a string representing a network interface name like
@code{'can0'}. The network interface name @code{'@w{'}} can be used to receive packets
from all network interfaces of this family.


@itemize -

@item 
@ref{39cd,,CAN_ISOTP} protocol requires a tuple @code{(interface, rx_addr, tx_addr)}
where both additional parameters are unsigned long integer that represent a
CAN identifier (standard or extended).

@item 
@ref{b32,,CAN_J1939} protocol requires a tuple @code{(interface, name, pgn, addr)}
where additional parameters are 64-bit unsigned integer representing the
ECU name, a 32-bit unsigned integer representing the Parameter Group Number
(PGN), and an 8-bit integer representing the address.
@end itemize

@item 
A string or a tuple @code{(id, unit)} is used for the @code{SYSPROTO_CONTROL}
protocol of the @code{PF_SYSTEM} family. The string is the name of a
kernel control using a dynamically assigned ID. The tuple can be used if ID
and unit number of the kernel control are known or if a registered ID is
used.


Added in version 3.3.


@item 
@ref{1bf2,,AF_BLUETOOTH} supports the following protocols and address
formats:


@itemize -

@item 
@ref{285,,BTPROTO_L2CAP} accepts a tuple
@code{(bdaddr, psm[, cid[, bdaddr_type]])} where:


@itemize -

@item 
@code{bdaddr} is a string specifying the Bluetooth address.

@item 
@code{psm} is an integer specifying the Protocol/Service Multiplexer.

@item 
@code{cid} is an optional integer specifying the Channel Identifier.
If not given, defaults to zero.

@item 
@code{bdaddr_type} is an optional integer specifying the address type;
one of @ref{39ce,,BDADDR_BREDR} (default), @ref{39cf,,BDADDR_LE_PUBLIC},
@ref{39d0,,BDADDR_LE_RANDOM}.
@end itemize


Changed in version 3.14: Added @code{cid} and @code{bdaddr_type} fields.


@item 
@ref{39d1,,BTPROTO_RFCOMM} accepts @code{(bdaddr, channel)} where @code{bdaddr}
is the Bluetooth address as a string and @code{channel} is an integer.

@item 
@ref{283,,BTPROTO_HCI} accepts a format that depends on your OS.


@itemize -

@item 
On Linux it accepts an integer @code{device_id} or a tuple
@code{(device_id, [channel])} where @code{device_id}
specifies the number of the Bluetooth device,
and @code{channel} is an optional integer specifying the HCI channel
(@ref{39d2,,HCI_CHANNEL_RAW} by default).

@item 
On FreeBSD, NetBSD and DragonFly BSD it accepts @code{bdaddr}
where @code{bdaddr} is the Bluetooth address as a string.
@end itemize


Changed in version 3.2: NetBSD and DragonFlyBSD support added.



Changed in version 3.13.3: FreeBSD support added.



Changed in version 3.14: Added @code{channel} field.
@code{device_id} not packed in a tuple is now accepted.


@item 
@ref{284,,BTPROTO_SCO} accepts @code{bdaddr} where @code{bdaddr} is
the Bluetooth address as a string or a @ref{193,,bytes} object.
(ex. @code{'12:23:34:45:56:67'} or @code{b'12:23:34:45:56:67'})


Changed in version 3.14: FreeBSD support added.

@end itemize

@item 
@ref{ed8,,AF_ALG} is a Linux-only socket based interface to Kernel
cryptography. An algorithm socket is configured with a tuple of two to four
elements @code{(type, name [, feat [, mask]])}, where:


@itemize -

@item 
`type' is the algorithm type as string, e.g. @code{aead}, @code{hash},
@code{skcipher} or @code{rng}.

@item 
`name' is the algorithm name and operation mode as string, e.g.
@code{sha256}, @code{hmac(sha256)}, @code{cbc(aes)} or @code{drbg_nopr_ctr_aes256}.

@item 
`feat' and `mask' are unsigned 32bit integers.
@end itemize

@ref{2181,,Availability}: Linux >= 2.6.38.

Some algorithm types require more recent Kernels.


Added in version 3.6.


@item 
@ref{d73,,AF_VSOCK} allows communication between virtual machines and
their hosts. The sockets are represented as a @code{(CID, port)} tuple
where the context ID or CID and port are integers.

@ref{2181,,Availability}: Linux >= 3.9

See @code{vsock(7)@footnote{https://manpages.debian.org/vsock(7)}}


Added in version 3.7.


@item 
@ref{39d3,,AF_PACKET} is a low-level interface directly to network devices.
The addresses are represented by the tuple
@code{(ifname, proto[, pkttype[, hatype[, addr]]])} where:


@itemize -

@item 
`ifname' - String specifying the device name.

@item 
`proto' - The Ethernet protocol number.
May be @ref{1b67,,ETH_P_ALL} to capture all protocols,
one of the @ref{1b68,,ETHERTYPE_* constants}
or any other Ethernet protocol number.

@item 
`pkttype' - Optional integer specifying the packet type:


@itemize -

@item 
@code{PACKET_HOST} (the default) - Packet addressed to the local host.

@item 
@code{PACKET_BROADCAST} - Physical-layer broadcast packet.

@item 
@code{PACKET_MULTICAST} - Packet sent to a physical-layer multicast address.

@item 
@code{PACKET_OTHERHOST} - Packet to some other host that has been caught by
a device driver in promiscuous mode.

@item 
@code{PACKET_OUTGOING} - Packet originating from the local host that is
looped back to a packet socket.
@end itemize

@item 
`hatype' - Optional integer specifying the ARP hardware address type.

@item 
`addr' - Optional bytes-like object specifying the hardware physical
address, whose interpretation depends on the device.
@end itemize

@ref{2181,,Availability}: Linux >= 2.2.

@item 
@ref{39d4,,AF_QIPCRTR} is a Linux-only socket based interface for communicating
with services running on co-processors in Qualcomm platforms. The address
family is represented as a @code{(node, port)} tuple where the `node' and `port'
are non-negative integers.

@ref{2181,,Availability}: Linux >= 4.7.


Added in version 3.8.


@item 
@code{IPPROTO_UDPLITE} is a variant of UDP which allows you to specify
what portion of a packet is covered with the checksum. It adds two socket
options that you can change.
@code{self.setsockopt(IPPROTO_UDPLITE, UDPLITE_SEND_CSCOV, length)} will
change what portion of outgoing packets are covered by the checksum and
@code{self.setsockopt(IPPROTO_UDPLITE, UDPLITE_RECV_CSCOV, length)} will
filter out packets which cover too little of their data. In both cases
@code{length} should be in @code{range(8, 2**16, 8)}.

Such a socket should be constructed with
@code{socket(AF_INET, SOCK_DGRAM, IPPROTO_UDPLITE)} for IPv4 or
@code{socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDPLITE)} for IPv6.

@ref{2181,,Availability}: Linux >= 2.6.20, FreeBSD >= 10.1


Added in version 3.9.


@item 
@ref{39d5,,AF_HYPERV} is a Windows-only socket based interface for communicating
with Hyper-V hosts and guests. The address family is represented as a
@code{(vm_id, service_id)} tuple where the @code{vm_id} and @code{service_id} are
UUID strings.

The @code{vm_id} is the virtual machine identifier or a set of known VMID values
if the target is not a specific virtual machine. Known VMID constants
defined on @code{socket} are:


@itemize -

@item 
@code{HV_GUID_ZERO}

@item 
@code{HV_GUID_BROADCAST}

@item 
@code{HV_GUID_WILDCARD} - Used to bind on itself and accept connections from
all partitions.

@item 
@code{HV_GUID_CHILDREN} - Used to bind on itself and accept connection from
child partitions.

@item 
@code{HV_GUID_LOOPBACK} - Used as a target to itself.

@item 
@code{HV_GUID_PARENT} - When used as a bind accepts connection from the parent
partition. When used as an address target it will connect to the parent partition.
@end itemize

The @code{service_id} is the service identifier of the registered service.


Added in version 3.12.

@end itemize

If you use a hostname in the `host' portion of IPv4/v6 socket address, the
program may show a nondeterministic behavior, as Python uses the first address
returned from the DNS resolution.  The socket address will be resolved
differently into an actual IPv4/v6 address, depending on the results from DNS
resolution and/or the host configuration.  For deterministic behavior use a
numeric address in `host' portion.

All errors raise exceptions.  The normal exceptions for invalid argument types
and out-of-memory conditions can be raised. Errors
related to socket or address semantics raise @ref{2c2,,OSError} or one of its
subclasses.

Non-blocking mode is supported through @ref{30ac,,setblocking()}.  A
generalization of this based on timeouts is supported through
@ref{39d6,,settimeout()}.

@node Module contents<2>,Socket Objects,Socket families,socket — Low-level networking interface
@anchor{library/socket module-contents}@anchor{39d7}
@subsubsection Module contents


The module @code{socket} exports the following elements.

@menu
* Exceptions: Exceptions<18>. 
* Constants: Constants<8>. 
* Functions: Functions<8>. 

@end menu

@node Exceptions<18>,Constants<8>,,Module contents<2>
@anchor{library/socket exceptions}@anchor{39d8}
@subsubsection Exceptions


@geindex error
@anchor{library/socket socket error}@anchor{125c}
@deffn {Exception} socket.error

A deprecated alias of @ref{2c2,,OSError}.


Changed in version 3.3: Following 
@geindex Python Enhancement Proposals; PEP 3151
PEP 3151@footnote{https://peps.python.org/pep-3151/}, this class was made an alias of @ref{2c2,,OSError}.

@end deffn

@geindex herror
@anchor{library/socket socket herror}@anchor{39d9}
@deffn {Exception} socket.herror

A subclass of @ref{2c2,,OSError}, this exception is raised for
address-related errors, i.e. for functions that use `h_errno' in the POSIX
C API, including @ref{1cc7,,gethostbyname_ex()} and @ref{1cc6,,gethostbyaddr()}.
The accompanying value is a pair @code{(h_errno, string)} representing an
error returned by a library call.  `h_errno' is a numeric value, while
`string' represents the description of `h_errno', as returned by the
@code{hstrerror()} C function.


Changed in version 3.3: This class was made a subclass of @ref{2c2,,OSError}.

@end deffn

@geindex gaierror
@anchor{library/socket socket gaierror}@anchor{1b0a}
@deffn {Exception} socket.gaierror

A subclass of @ref{2c2,,OSError}, this exception is raised for
address-related errors by @ref{17a8,,getaddrinfo()} and @ref{1a81,,getnameinfo()}.
The accompanying value is a pair @code{(error, string)} representing an error
returned by a library call.  `string' represents the description of
`error', as returned by the @code{gai_strerror()} C function.  The
numeric `error' value will match one of the @code{EAI_*} constants
defined in this module.


Changed in version 3.3: This class was made a subclass of @ref{2c2,,OSError}.

@end deffn

@geindex timeout
@anchor{library/socket socket timeout}@anchor{a3b}
@deffn {Exception} socket.timeout

A deprecated alias of @ref{a3c,,TimeoutError}.

A subclass of @ref{2c2,,OSError}, this exception is raised when a timeout
occurs on a socket which has had timeouts enabled via a prior call to
@ref{39d6,,settimeout()} (or implicitly through
@ref{39da,,setdefaulttimeout()}).  The accompanying value is a string
whose value is currently always “timed out”.


Changed in version 3.3: This class was made a subclass of @ref{2c2,,OSError}.



Changed in version 3.10: This class was made an alias of @ref{a3c,,TimeoutError}.

@end deffn

@node Constants<8>,Functions<8>,Exceptions<18>,Module contents<2>
@anchor{library/socket constants}@anchor{39db}
@subsubsection Constants


The AF_* and SOCK_* constants are now @code{AddressFamily} and
@code{SocketKind} @ref{ee1,,IntEnum} collections.


Added in version 3.4.


@geindex AF_UNIX (in module socket)
@geindex AF_INET (in module socket)
@geindex AF_INET6 (in module socket)
@anchor{library/socket socket AF_UNIX}@anchor{1bf3}
@deffn {Data} socket.AF_UNIX
@anchor{library/socket socket AF_INET}@anchor{1bf0}
@deffnx {Data} socket.AF_INET
@anchor{library/socket socket AF_INET6}@anchor{1bf1}
@deffnx {Data} socket.AF_INET6

These constants represent the address (and protocol) families, used for the
first argument to @ref{fa7,,socket()}.  If the @ref{1bf3,,AF_UNIX} constant is not
defined then this protocol is unsupported.  More constants may be available
depending on the system.
@end deffn

@geindex AF_UNSPEC (in module socket)
@anchor{library/socket socket AF_UNSPEC}@anchor{3912}
@deffn {Data} socket.AF_UNSPEC

@ref{3912,,AF_UNSPEC} means that
@ref{17a8,,getaddrinfo()} should return socket addresses for any
address family (either IPv4, IPv6, or any other) that can be used.
@end deffn

@geindex SOCK_STREAM (in module socket)
@geindex SOCK_DGRAM (in module socket)
@geindex SOCK_RAW (in module socket)
@geindex SOCK_RDM (in module socket)
@geindex SOCK_SEQPACKET (in module socket)
@anchor{library/socket socket SOCK_STREAM}@anchor{14ff}
@deffn {Data} socket.SOCK_STREAM
@anchor{library/socket socket SOCK_DGRAM}@anchor{14fe}
@deffnx {Data} socket.SOCK_DGRAM
@anchor{library/socket socket SOCK_RAW}@anchor{39dc}
@deffnx {Data} socket.SOCK_RAW
@anchor{library/socket socket SOCK_RDM}@anchor{39dd}
@deffnx {Data} socket.SOCK_RDM
@anchor{library/socket socket SOCK_SEQPACKET}@anchor{39de}
@deffnx {Data} socket.SOCK_SEQPACKET

These constants represent the socket types, used for the second argument to
@ref{fa7,,socket()}.  More constants may be available depending on the system.
(Only @ref{14ff,,SOCK_STREAM} and @ref{14fe,,SOCK_DGRAM} appear to be generally
useful.)
@end deffn

@geindex SOCK_CLOEXEC (in module socket)
@geindex SOCK_NONBLOCK (in module socket)
@anchor{library/socket socket SOCK_CLOEXEC}@anchor{e0b}
@deffn {Data} socket.SOCK_CLOEXEC
@anchor{library/socket socket SOCK_NONBLOCK}@anchor{e0a}
@deffnx {Data} socket.SOCK_NONBLOCK

These two constants, if defined, can be combined with the socket types and
allow you to set some flags atomically (thus avoiding possible race
conditions and the need for separate calls).


@subsubheading See also


Secure File Descriptor Handling@footnote{https://udrepper.livejournal.com/20407.html}
for a more thorough explanation.


@ref{2181,,Availability}: Linux >= 2.6.27.


Added in version 3.2.

@end deffn

@geindex SOMAXCONN (in module socket)
@anchor{library/socket socket-unix-constants}@anchor{d72}
@deffn {Data} SO_*
@anchor{library/socket socket SOMAXCONN}@anchor{1065}
@deffnx {Data} socket.SOMAXCONN

@deffnx {Data} MSG_*

@deffnx {Data} SOL_*

@deffnx {Data} SCM_*

@deffnx {Data} IPPROTO_*

@deffnx {Data} IPPORT_*

@deffnx {Data} INADDR_*

@deffnx {Data} IP_*

@deffnx {Data} IPV6_*

@deffnx {Data} EAI_*

@deffnx {Data} AI_*

@deffnx {Data} NI_*

@deffnx {Data} TCP_*

Many constants of these forms, documented in the Unix documentation on sockets
and/or the IP protocol, are also defined in the socket module. They are
generally used in arguments to the @ref{ed7,,setsockopt()} and @ref{ed6,,getsockopt()}
methods of socket objects.  In most cases, only those symbols that are defined
in the Unix header files are defined; for a few symbols, default values are
provided.


Changed in version 3.6: @code{SO_DOMAIN}, @code{SO_PROTOCOL}, @code{SO_PEERSEC}, @code{SO_PASSSEC},
@code{TCP_USER_TIMEOUT}, @code{TCP_CONGESTION} were added.



Changed in version 3.6.5: Added support for @code{TCP_FASTOPEN}, @code{TCP_KEEPCNT} on Windows platforms
when available.



Changed in version 3.7: @code{TCP_NOTSENT_LOWAT} was added.

Added support for @code{TCP_KEEPIDLE}, @code{TCP_KEEPINTVL} on Windows platforms
when available.



Changed in version 3.10: @code{IP_RECVTOS} was added.
 Added @code{TCP_KEEPALIVE}. On MacOS this constant can be used in the same
 way that @code{TCP_KEEPIDLE} is used on Linux.



Changed in version 3.11: Added @code{TCP_CONNECTION_INFO}. On MacOS this constant can be used in the
same way that @code{TCP_INFO} is used on Linux and BSD.



Changed in version 3.12: Added @code{SO_RTABLE} and @code{SO_USER_COOKIE}. On OpenBSD
and FreeBSD respectively those constants can be used in the same way that
@code{SO_MARK} is used on Linux. Also added missing TCP socket options from
Linux: @code{TCP_MD5SIG}, @code{TCP_THIN_LINEAR_TIMEOUTS}, @code{TCP_THIN_DUPACK},
@code{TCP_REPAIR}, @code{TCP_REPAIR_QUEUE}, @code{TCP_QUEUE_SEQ},
@code{TCP_REPAIR_OPTIONS}, @code{TCP_TIMESTAMP}, @code{TCP_CC_INFO},
@code{TCP_SAVE_SYN}, @code{TCP_SAVED_SYN}, @code{TCP_REPAIR_WINDOW},
@code{TCP_FASTOPEN_CONNECT}, @code{TCP_ULP}, @code{TCP_MD5SIG_EXT},
@code{TCP_FASTOPEN_KEY}, @code{TCP_FASTOPEN_NO_COOKIE},
@code{TCP_ZEROCOPY_RECEIVE}, @code{TCP_INQ}, @code{TCP_TX_DELAY}.
Added @code{IP_PKTINFO}, @code{IP_UNBLOCK_SOURCE}, @code{IP_BLOCK_SOURCE},
@code{IP_ADD_SOURCE_MEMBERSHIP}, @code{IP_DROP_SOURCE_MEMBERSHIP}.



Changed in version 3.13: Added @code{SO_BINDTOIFINDEX}. On Linux this constant can be used in the
same way that @code{SO_BINDTODEVICE} is used, but with the index of a
network interface instead of its name.



Changed in version 3.14: Added missing @code{IP_FREEBIND}, @code{IP_RECVERR}, @code{IPV6_RECVERR},
@code{IP_RECVTTL}, and @code{IP_RECVORIGDSTADDR} on Linux.



Changed in version 3.14: Added support for @code{TCP_QUICKACK} on Windows platforms when available.

@end deffn

@geindex AF_CAN (in module socket)
@geindex PF_CAN (in module socket)
@anchor{library/socket socket AF_CAN}@anchor{39cc}
@deffn {Data} socket.AF_CAN
@anchor{library/socket socket PF_CAN}@anchor{39df}
@deffnx {Data} socket.PF_CAN

@deffnx {Data} SOL_CAN_*

@deffnx {Data} CAN_*

Many constants of these forms, documented in the Linux documentation, are
also defined in the socket module.

@ref{2181,,Availability}: Linux >= 2.6.25, NetBSD >= 8.


Added in version 3.3.



Changed in version 3.11: NetBSD support was added.



Changed in version 3.14: Restored missing @code{CAN_RAW_ERR_FILTER} on Linux.

@end deffn

@geindex CAN_BCM (in module socket)
@anchor{library/socket socket CAN_BCM}@anchor{11a9}
@deffn {Data} socket.CAN_BCM

@deffnx {Data} CAN_BCM_*

CAN_BCM, in the CAN protocol family, is the broadcast manager (BCM) protocol.
Broadcast manager constants, documented in the Linux documentation, are also
defined in the socket module.

@ref{2181,,Availability}: Linux >= 2.6.25.

@cartouche
@quotation Note 
The @code{CAN_BCM_CAN_FD_FRAME} flag is only available on Linux >= 4.8.
@end quotation
@end cartouche


Added in version 3.4.

@end deffn

@geindex CAN_RAW_FD_FRAMES (in module socket)
@anchor{library/socket socket CAN_RAW_FD_FRAMES}@anchor{10d0}
@deffn {Data} socket.CAN_RAW_FD_FRAMES

Enables CAN FD support in a CAN_RAW socket. This is disabled by default.
This allows your application to send both CAN and CAN FD frames; however,
you must accept both CAN and CAN FD frames when reading from the socket.

This constant is documented in the Linux documentation.

@ref{2181,,Availability}: Linux >= 3.6.


Added in version 3.5.

@end deffn

@geindex CAN_RAW_JOIN_FILTERS (in module socket)
@anchor{library/socket socket CAN_RAW_JOIN_FILTERS}@anchor{b31}
@deffn {Data} socket.CAN_RAW_JOIN_FILTERS

Joins the applied CAN filters such that only CAN frames that match all
given CAN filters are passed to user space.

This constant is documented in the Linux documentation.

@ref{2181,,Availability}: Linux >= 4.1.


Added in version 3.9.

@end deffn

@geindex CAN_ISOTP (in module socket)
@anchor{library/socket socket CAN_ISOTP}@anchor{39cd}
@deffn {Data} socket.CAN_ISOTP

CAN_ISOTP, in the CAN protocol family, is the ISO-TP (ISO 15765-2) protocol.
ISO-TP constants, documented in the Linux documentation.

@ref{2181,,Availability}: Linux >= 2.6.25.


Added in version 3.7.

@end deffn

@geindex CAN_J1939 (in module socket)
@anchor{library/socket socket CAN_J1939}@anchor{b32}
@deffn {Data} socket.CAN_J1939

CAN_J1939, in the CAN protocol family, is the SAE J1939 protocol.
J1939 constants, documented in the Linux documentation.

@ref{2181,,Availability}: Linux >= 5.4.


Added in version 3.9.

@end deffn

@geindex AF_DIVERT (in module socket)
@geindex PF_DIVERT (in module socket)
@anchor{library/socket socket AF_DIVERT}@anchor{39e0}
@deffn {Data} socket.AF_DIVERT
@anchor{library/socket socket PF_DIVERT}@anchor{39e1}
@deffnx {Data} socket.PF_DIVERT

These two constants, documented in the FreeBSD divert(4) manual page, are
also defined in the socket module.

@ref{2181,,Availability}: FreeBSD >= 14.0.


Added in version 3.12.

@end deffn

@geindex AF_PACKET (in module socket)
@geindex PF_PACKET (in module socket)
@anchor{library/socket socket AF_PACKET}@anchor{39d3}
@deffn {Data} socket.AF_PACKET
@anchor{library/socket socket PF_PACKET}@anchor{39e2}
@deffnx {Data} socket.PF_PACKET

@deffnx {Data} PACKET_*

Many constants of these forms, documented in the Linux documentation, are
also defined in the socket module.

@ref{2181,,Availability}: Linux >= 2.2.
@end deffn

@geindex ETH_P_ALL (in module socket)
@anchor{library/socket socket ETH_P_ALL}@anchor{1b67}
@deffn {Data} socket.ETH_P_ALL

@code{ETH_P_ALL} can be used in the @ref{fa7,,socket}
constructor as `proto' for the @ref{39d3,,AF_PACKET} family in order to
capture every packet, regardless of protocol.

For more information, see the @code{packet(7)@footnote{https://manpages.debian.org/packet(7)}} manpage.

@ref{2181,,Availability}: Linux.


Added in version 3.12.

@end deffn

@geindex AF_RDS (in module socket)
@geindex PF_RDS (in module socket)
@geindex SOL_RDS (in module socket)
@anchor{library/socket socket AF_RDS}@anchor{39e3}
@deffn {Data} socket.AF_RDS
@anchor{library/socket socket PF_RDS}@anchor{39e4}
@deffnx {Data} socket.PF_RDS
@anchor{library/socket socket SOL_RDS}@anchor{39e5}
@deffnx {Data} socket.SOL_RDS

@deffnx {Data} RDS_*

Many constants of these forms, documented in the Linux documentation, are
also defined in the socket module.

@ref{2181,,Availability}: Linux >= 2.6.30.


Added in version 3.3.

@end deffn

@geindex SIO_RCVALL (in module socket)
@geindex SIO_KEEPALIVE_VALS (in module socket)
@geindex SIO_LOOPBACK_FAST_PATH (in module socket)
@anchor{library/socket socket SIO_RCVALL}@anchor{39e6}
@deffn {Data} socket.SIO_RCVALL
@anchor{library/socket socket SIO_KEEPALIVE_VALS}@anchor{39e7}
@deffnx {Data} socket.SIO_KEEPALIVE_VALS
@anchor{library/socket socket SIO_LOOPBACK_FAST_PATH}@anchor{ed5}
@deffnx {Data} socket.SIO_LOOPBACK_FAST_PATH

@deffnx {Data} RCVALL_*

Constants for Windows’ WSAIoctl(). The constants are used as arguments to the
@ref{ed4,,ioctl()} method of socket objects.


Changed in version 3.6: @code{SIO_LOOPBACK_FAST_PATH} was added.

@end deffn


@deffn {Data} TIPC_*

TIPC related constants, matching the ones exported by the C socket API. See
the TIPC documentation for more information.
@end deffn

@geindex AF_ALG (in module socket)
@geindex SOL_ALG (in module socket)
@anchor{library/socket socket AF_ALG}@anchor{ed8}
@deffn {Data} socket.AF_ALG
@anchor{library/socket socket SOL_ALG}@anchor{39e8}
@deffnx {Data} socket.SOL_ALG

@deffnx {Data} ALG_*

Constants for Linux Kernel cryptography.

@ref{2181,,Availability}: Linux >= 2.6.38.


Added in version 3.6.

@end deffn

@geindex AF_VSOCK (in module socket)
@geindex IOCTL_VM_SOCKETS_GET_LOCAL_CID (in module socket)
@anchor{library/socket socket AF_VSOCK}@anchor{d73}
@deffn {Data} socket.AF_VSOCK
@anchor{library/socket socket IOCTL_VM_SOCKETS_GET_LOCAL_CID}@anchor{39e9}
@deffnx {Data} socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID

@deffnx {Data} VMADDR*

@deffnx {Data} SO_VM*

Constants for Linux host/guest communication.

@ref{2181,,Availability}: Linux >= 4.8.


Added in version 3.7.

@end deffn

@geindex AF_LINK (in module socket)
@anchor{library/socket socket AF_LINK}@anchor{11aa}
@deffn {Data} socket.AF_LINK

@ref{2181,,Availability}: BSD, macOS.


Added in version 3.4.

@end deffn

@geindex has_ipv6 (in module socket)
@anchor{library/socket socket has_ipv6}@anchor{39ea}
@deffn {Data} socket.has_ipv6

This constant contains a boolean value which indicates if IPv6 is supported on
this platform.
@end deffn

@geindex AF_BLUETOOTH (in module socket)
@geindex BTPROTO_L2CAP (in module socket)
@geindex BTPROTO_RFCOMM (in module socket)
@geindex BTPROTO_HCI (in module socket)
@geindex BTPROTO_SCO (in module socket)
@anchor{library/socket socket AF_BLUETOOTH}@anchor{1bf2}
@deffn {Data} socket.AF_BLUETOOTH
@anchor{library/socket socket BTPROTO_L2CAP}@anchor{285}
@deffnx {Data} socket.BTPROTO_L2CAP
@anchor{library/socket socket BTPROTO_RFCOMM}@anchor{39d1}
@deffnx {Data} socket.BTPROTO_RFCOMM
@anchor{library/socket socket BTPROTO_HCI}@anchor{283}
@deffnx {Data} socket.BTPROTO_HCI
@anchor{library/socket socket BTPROTO_SCO}@anchor{284}
@deffnx {Data} socket.BTPROTO_SCO

Integer constants for use with Bluetooth addresses.
@end deffn

@geindex BDADDR_ANY (in module socket)
@geindex BDADDR_LOCAL (in module socket)
@anchor{library/socket socket BDADDR_ANY}@anchor{39eb}
@deffn {Data} socket.BDADDR_ANY
@anchor{library/socket socket BDADDR_LOCAL}@anchor{39ec}
@deffnx {Data} socket.BDADDR_LOCAL

These are string constants containing Bluetooth addresses with special
meanings. For example, @ref{39eb,,BDADDR_ANY} can be used to indicate
any address when specifying the binding socket with
@ref{39d1,,BTPROTO_RFCOMM}.
@end deffn

@geindex BDADDR_BREDR (in module socket)
@geindex BDADDR_LE_PUBLIC (in module socket)
@geindex BDADDR_LE_RANDOM (in module socket)
@anchor{library/socket socket BDADDR_BREDR}@anchor{39ce}
@deffn {Data} socket.BDADDR_BREDR
@anchor{library/socket socket BDADDR_LE_PUBLIC}@anchor{39cf}
@deffnx {Data} socket.BDADDR_LE_PUBLIC
@anchor{library/socket socket BDADDR_LE_RANDOM}@anchor{39d0}
@deffnx {Data} socket.BDADDR_LE_RANDOM

These constants describe the Bluetooth address type when binding or
connecting a @ref{285,,BTPROTO_L2CAP} socket.

@ref{2181,,Availability}: Linux, FreeBSD


Added in version 3.14.

@end deffn

@geindex SOL_RFCOMM (in module socket)
@geindex SOL_L2CAP (in module socket)
@geindex SOL_HCI (in module socket)
@geindex SOL_SCO (in module socket)
@geindex SOL_BLUETOOTH (in module socket)
@anchor{library/socket socket SOL_RFCOMM}@anchor{39ed}
@deffn {Data} socket.SOL_RFCOMM
@anchor{library/socket socket SOL_L2CAP}@anchor{39ee}
@deffnx {Data} socket.SOL_L2CAP
@anchor{library/socket socket SOL_HCI}@anchor{39ef}
@deffnx {Data} socket.SOL_HCI
@anchor{library/socket socket SOL_SCO}@anchor{39f0}
@deffnx {Data} socket.SOL_SCO
@anchor{library/socket socket SOL_BLUETOOTH}@anchor{39f1}
@deffnx {Data} socket.SOL_BLUETOOTH

Used in the level argument to the @ref{ed7,,setsockopt()} and
@ref{ed6,,getsockopt()} methods of Bluetooth socket objects.

@ref{39f1,,SOL_BLUETOOTH} is only available on Linux. Other constants
are available if the corresponding protocol is supported.
@end deffn

@geindex L2CAP_LM (in module socket)

@deffn {Data} SO_L2CAP_*
@anchor{library/socket socket L2CAP_LM}@anchor{39f2}
@deffnx {Data} socket.L2CAP_LM

@deffnx {Data} L2CAP_LM_*

@deffnx {Data} SO_RFCOMM_*

@deffnx {Data} RFCOMM_LM_*

@deffnx {Data} SO_SCO_*

@deffnx {Data} SO_BTH_*

@deffnx {Data} BT_*

Used in the option name and value argument to the @ref{ed7,,setsockopt()}
and @ref{ed6,,getsockopt()} methods of Bluetooth socket objects.

@code{BT_*} and @ref{39f2,,L2CAP_LM} are only available on Linux.
@code{SO_BTH_*} are only available on Windows.
Other constants may be available on Linux and various BSD platforms.


Added in version 3.14.

@end deffn

@geindex HCI_FILTER (in module socket)
@geindex HCI_TIME_STAMP (in module socket)
@geindex HCI_DATA_DIR (in module socket)
@geindex SO_HCI_EVT_FILTER (in module socket)
@geindex SO_HCI_PKT_FILTER (in module socket)
@anchor{library/socket socket HCI_FILTER}@anchor{39f3}
@deffn {Data} socket.HCI_FILTER
@anchor{library/socket socket HCI_TIME_STAMP}@anchor{39f4}
@deffnx {Data} socket.HCI_TIME_STAMP
@anchor{library/socket socket HCI_DATA_DIR}@anchor{39f5}
@deffnx {Data} socket.HCI_DATA_DIR
@anchor{library/socket socket SO_HCI_EVT_FILTER}@anchor{39f6}
@deffnx {Data} socket.SO_HCI_EVT_FILTER
@anchor{library/socket socket SO_HCI_PKT_FILTER}@anchor{39f7}
@deffnx {Data} socket.SO_HCI_PKT_FILTER

Option names for use with @ref{283,,BTPROTO_HCI}.
Availability and format of the option values depend on platform.


Changed in version 3.14: Added @code{SO_HCI_EVT_FILTER} and @code{SO_HCI_PKT_FILTER}
on NetBSD and DragonFly BSD.
Added @code{HCI_DATA_DIR} on FreeBSD, NetBSD and DragonFly BSD.

@end deffn

@geindex HCI_DEV_NONE (in module socket)
@anchor{library/socket socket HCI_DEV_NONE}@anchor{39f8}
@deffn {Data} socket.HCI_DEV_NONE

The @code{device_id} value used to create an HCI socket that isn’t specific
to a single Bluetooth adapter.

@ref{2181,,Availability}: Linux


Added in version 3.14.

@end deffn

@geindex HCI_CHANNEL_RAW (in module socket)
@geindex HCI_CHANNEL_USER (in module socket)
@geindex HCI_CHANNEL_MONITOR (in module socket)
@geindex HCI_CHANNEL_CONTROL (in module socket)
@geindex HCI_CHANNEL_LOGGING (in module socket)
@anchor{library/socket socket HCI_CHANNEL_RAW}@anchor{39d2}
@deffn {Data} socket.HCI_CHANNEL_RAW
@anchor{library/socket socket HCI_CHANNEL_USER}@anchor{39f9}
@deffnx {Data} socket.HCI_CHANNEL_USER
@anchor{library/socket socket HCI_CHANNEL_MONITOR}@anchor{39fa}
@deffnx {Data} socket.HCI_CHANNEL_MONITOR
@anchor{library/socket socket HCI_CHANNEL_CONTROL}@anchor{39fb}
@deffnx {Data} socket.HCI_CHANNEL_CONTROL
@anchor{library/socket socket HCI_CHANNEL_LOGGING}@anchor{39fc}
@deffnx {Data} socket.HCI_CHANNEL_LOGGING

Possible values for @code{channel} field in the @ref{283,,BTPROTO_HCI} address.

@ref{2181,,Availability}: Linux


Added in version 3.14.

@end deffn

@geindex AF_QIPCRTR (in module socket)
@anchor{library/socket socket AF_QIPCRTR}@anchor{39d4}
@deffn {Data} socket.AF_QIPCRTR

Constant for Qualcomm’s IPC router protocol, used to communicate with
service providing remote processors.

@ref{2181,,Availability}: Linux >= 4.7.
@end deffn

@geindex SCM_CREDS2 (in module socket)
@geindex LOCAL_CREDS (in module socket)
@geindex LOCAL_CREDS_PERSISTENT (in module socket)
@anchor{library/socket socket SCM_CREDS2}@anchor{39fd}
@deffn {Data} socket.SCM_CREDS2
@anchor{library/socket socket LOCAL_CREDS}@anchor{39fe}
@deffnx {Data} socket.LOCAL_CREDS
@anchor{library/socket socket LOCAL_CREDS_PERSISTENT}@anchor{39ff}
@deffnx {Data} socket.LOCAL_CREDS_PERSISTENT

LOCAL_CREDS and LOCAL_CREDS_PERSISTENT can be used
with SOCK_DGRAM, SOCK_STREAM sockets, equivalent to
Linux/DragonFlyBSD SO_PASSCRED, while LOCAL_CREDS
sends the credentials at first read, LOCAL_CREDS_PERSISTENT
sends for each read, SCM_CREDS2 must be then used for
the latter for the message type.


Added in version 3.11.


@ref{2181,,Availability}: FreeBSD.
@end deffn

@geindex SO_INCOMING_CPU (in module socket)
@anchor{library/socket socket SO_INCOMING_CPU}@anchor{3a00}
@deffn {Data} socket.SO_INCOMING_CPU

Constant to optimize CPU locality, to be used in conjunction with
@code{SO_REUSEPORT}.


Added in version 3.11.


@ref{2181,,Availability}: Linux >= 3.9
@end deffn

@geindex SO_REUSEPORT_LB (in module socket)
@anchor{library/socket socket SO_REUSEPORT_LB}@anchor{191a}
@deffn {Data} socket.SO_REUSEPORT_LB

@quotation

Constant to enable duplicate address and port bindings with load balancing.
@end quotation


Added in version 3.14.


@ref{2181,,Availability}: FreeBSD >= 12.0
@end deffn

@geindex AF_HYPERV (in module socket)
@geindex HV_PROTOCOL_RAW (in module socket)
@geindex HVSOCKET_CONNECT_TIMEOUT (in module socket)
@geindex HVSOCKET_CONNECT_TIMEOUT_MAX (in module socket)
@geindex HVSOCKET_CONNECTED_SUSPEND (in module socket)
@geindex HVSOCKET_ADDRESS_FLAG_PASSTHRU (in module socket)
@geindex HV_GUID_ZERO (in module socket)
@geindex HV_GUID_WILDCARD (in module socket)
@geindex HV_GUID_BROADCAST (in module socket)
@geindex HV_GUID_CHILDREN (in module socket)
@geindex HV_GUID_LOOPBACK (in module socket)
@geindex HV_GUID_PARENT (in module socket)
@anchor{library/socket socket AF_HYPERV}@anchor{39d5}
@deffn {Data} socket.AF_HYPERV
@anchor{library/socket socket HV_PROTOCOL_RAW}@anchor{3a01}
@deffnx {Data} socket.HV_PROTOCOL_RAW
@anchor{library/socket socket HVSOCKET_CONNECT_TIMEOUT}@anchor{3a02}
@deffnx {Data} socket.HVSOCKET_CONNECT_TIMEOUT
@anchor{library/socket socket HVSOCKET_CONNECT_TIMEOUT_MAX}@anchor{3a03}
@deffnx {Data} socket.HVSOCKET_CONNECT_TIMEOUT_MAX
@anchor{library/socket socket HVSOCKET_CONNECTED_SUSPEND}@anchor{3a04}
@deffnx {Data} socket.HVSOCKET_CONNECTED_SUSPEND
@anchor{library/socket socket HVSOCKET_ADDRESS_FLAG_PASSTHRU}@anchor{3a05}
@deffnx {Data} socket.HVSOCKET_ADDRESS_FLAG_PASSTHRU
@anchor{library/socket socket HV_GUID_ZERO}@anchor{3a06}
@deffnx {Data} socket.HV_GUID_ZERO
@anchor{library/socket socket HV_GUID_WILDCARD}@anchor{3a07}
@deffnx {Data} socket.HV_GUID_WILDCARD
@anchor{library/socket socket HV_GUID_BROADCAST}@anchor{3a08}
@deffnx {Data} socket.HV_GUID_BROADCAST
@anchor{library/socket socket HV_GUID_CHILDREN}@anchor{3a09}
@deffnx {Data} socket.HV_GUID_CHILDREN
@anchor{library/socket socket HV_GUID_LOOPBACK}@anchor{3a0a}
@deffnx {Data} socket.HV_GUID_LOOPBACK
@anchor{library/socket socket HV_GUID_PARENT}@anchor{3a0b}
@deffnx {Data} socket.HV_GUID_PARENT

Constants for Windows Hyper-V sockets for host/guest communications.

@ref{2181,,Availability}: Windows.


Added in version 3.12.

@end deffn

@geindex ETHERTYPE_ARP (in module socket)
@geindex ETHERTYPE_IP (in module socket)
@geindex ETHERTYPE_IPV6 (in module socket)
@geindex ETHERTYPE_VLAN (in module socket)
@anchor{library/socket socket-ethernet-types}@anchor{1b68}@anchor{library/socket socket ETHERTYPE_ARP}@anchor{3a0c}
@deffn {Data} socket.ETHERTYPE_ARP
@anchor{library/socket socket ETHERTYPE_IP}@anchor{3a0d}
@deffnx {Data} socket.ETHERTYPE_IP
@anchor{library/socket socket ETHERTYPE_IPV6}@anchor{3a0e}
@deffnx {Data} socket.ETHERTYPE_IPV6
@anchor{library/socket socket ETHERTYPE_VLAN}@anchor{3a0f}
@deffnx {Data} socket.ETHERTYPE_VLAN

IEEE 802.3 protocol number@footnote{https://www.iana.org/assignments/ieee-802-numbers/ieee-802-numbers.txt}.
constants.

@ref{2181,,Availability}: Linux, FreeBSD, macOS.


Added in version 3.12.

@end deffn

@geindex SHUT_RD (in module socket)
@geindex SHUT_WR (in module socket)
@geindex SHUT_RDWR (in module socket)
@anchor{library/socket socket SHUT_RD}@anchor{3a10}
@deffn {Data} socket.SHUT_RD
@anchor{library/socket socket SHUT_WR}@anchor{3a11}
@deffnx {Data} socket.SHUT_WR
@anchor{library/socket socket SHUT_RDWR}@anchor{3a12}
@deffnx {Data} socket.SHUT_RDWR

These constants are used by the @ref{3a13,,shutdown()} method of socket objects.

@ref{2181,,Availability}: not WASI.
@end deffn

@node Functions<8>,,Constants<8>,Module contents<2>
@anchor{library/socket functions}@anchor{3a14}
@subsubsection Functions


@menu
* Creating sockets:: 
* Other functions: Other functions<2>. 

@end menu

@node Creating sockets,Other functions<2>,,Functions<8>
@anchor{library/socket creating-sockets}@anchor{3a15}
@subsubsection Creating sockets


The following functions all create @ref{3a16,,socket objects}.

The @ref{fa7,,socket} class constructor creates a new socket
directly; see @ref{3a16,,Socket Objects} for its parameters and full description.

@geindex socketpair() (in module socket)
@anchor{library/socket socket socketpair}@anchor{df6}
@deffn {Function} socket.socketpair ([family[, type[, proto]]])

Build a pair of connected socket objects using the given address family, socket
type, and protocol number.  Address family, socket type, and protocol number are
as for the @ref{fa7,,socket()} function. The default family is @ref{1bf3,,AF_UNIX}
if defined on the platform; otherwise, the default is @ref{1bf0,,AF_INET}.

The newly created sockets are @ref{1102,,non-inheritable}.


Changed in version 3.2: The returned socket objects now support the whole socket API, rather
than a subset.



Changed in version 3.4: The returned sockets are now non-inheritable.



Changed in version 3.5: Windows support added.

@end deffn

@geindex create_connection() (in module socket)
@anchor{library/socket socket create_connection}@anchor{884}
@deffn {Function} socket.create_connection (address, timeout=GLOBAL_DEFAULT, source_address=None, *, all_errors=False)

Connect to a TCP service listening on the internet `address' (a 2-tuple
@code{(host, port)}), and return the socket object.  This is a higher-level
function than @ref{fa9,,socket.connect()}: if `host' is a non-numeric hostname,
it will try to resolve it for both @ref{1bf0,,AF_INET} and @ref{1bf1,,AF_INET6},
and then try to connect to all possible addresses in turn until a
connection succeeds.  This makes it easy to write clients that are
compatible to both IPv4 and IPv6.

Passing the optional `timeout' parameter will set the timeout on the
socket instance before attempting to connect.  If no `timeout' is
supplied, the global default timeout setting returned by
@ref{3a17,,getdefaulttimeout()} is used.

If supplied, `source_address' must be a 2-tuple @code{(host, port)} for the
socket to bind to as its source address before connecting.  If host or port
are ‘’ or 0 respectively the OS default behavior will be used.

When a connection cannot be created, an exception is raised. By default,
it is the exception from the last address in the list. If `all_errors'
is @code{True}, it is an @ref{4d3,,ExceptionGroup} containing the errors of all
attempts.


Changed in version 3.2: `source_address' was added.



Changed in version 3.11: `all_errors' was added.

@end deffn

@geindex create_server() (in module socket)
@anchor{library/socket socket create_server}@anchor{c26}
@deffn {Function} socket.create_server (address, *, family=AF_INET, backlog=None, reuse_port=False, dualstack_ipv6=False)

Convenience function which creates a TCP socket bound to `address' (a 2-tuple
@code{(host, port)}) and returns the socket object.

`family' should be either @ref{1bf0,,AF_INET} or @ref{1bf1,,AF_INET6}.
`backlog' is the queue size passed to @ref{1064,,socket.listen()}; if not specified
, a default reasonable value is chosen.
`reuse_port' dictates whether to set the @code{SO_REUSEPORT} socket option.

If `dualstack_ipv6' is true, `family' is @ref{1bf1,,AF_INET6} and the platform
supports it the socket will be able to accept both IPv4 and IPv6 connections,
else it will raise @ref{2ee,,ValueError}. Most POSIX platforms and Windows are
supposed to support this functionality.
When this functionality is enabled the address returned by
@ref{3951,,socket.getpeername()} when an IPv4 connection occurs will be an IPv6
address represented as an IPv4-mapped IPv6 address.
If `dualstack_ipv6' is false it will explicitly disable this functionality
on platforms that enable it by default (e.g. Linux).
This parameter can be used in conjunction with @ref{c27,,has_dualstack_ipv6()}:

@example
import socket

addr = ("", 8080)  # all interfaces, port 8080
if socket.has_dualstack_ipv6():
    s = socket.create_server(addr, family=socket.AF_INET6, dualstack_ipv6=True)
else:
    s = socket.create_server(addr)
@end example

@cartouche
@quotation Note 
On POSIX platforms the @code{SO_REUSEADDR} socket option is set in order to
immediately reuse previous sockets which were bound on the same `address'
and remained in TIME_WAIT state.
@end quotation
@end cartouche


Added in version 3.8.

@end deffn

@geindex has_dualstack_ipv6() (in module socket)
@anchor{library/socket socket has_dualstack_ipv6}@anchor{c27}
@deffn {Function} socket.has_dualstack_ipv6 ()

Return @code{True} if the platform supports creating a TCP socket which can
handle both IPv4 and IPv6 connections.


Added in version 3.8.

@end deffn

@geindex fromfd() (in module socket)
@anchor{library/socket socket fromfd}@anchor{3a18}
@deffn {Function} socket.fromfd (fd, family, type, proto=0)

Duplicate the file descriptor `fd' (an integer as returned by a file object’s
@ref{17fe,,fileno()} method) and build a socket object from the result.  Address
family, socket type and protocol number are as for the @ref{fa7,,socket()} function.
The file descriptor should refer to a socket, but this is not checked —
subsequent operations on the object may fail if the file descriptor is invalid.
This function is rarely needed, but can be used to get or set socket options on
a socket passed to a program as standard input or output (such as a server
started by the Unix inet daemon).  The socket is assumed to be in blocking mode.

The newly created socket is @ref{1102,,non-inheritable}.


Changed in version 3.4: The returned socket is now non-inheritable.

@end deffn

@geindex fromshare() (in module socket)
@anchor{library/socket socket fromshare}@anchor{e07}
@deffn {Function} socket.fromshare (data)

Instantiate a socket from data obtained from the @ref{e08,,socket.share()}
method.  The socket is assumed to be in blocking mode.

@ref{2181,,Availability}: Windows.


Added in version 3.3.

@end deffn

@node Other functions<2>,,Creating sockets,Functions<8>
@anchor{library/socket other-functions}@anchor{3a19}
@subsubsection Other functions


The @code{socket} module also offers various network-related services:

@geindex close() (in module socket)
@anchor{library/socket socket close}@anchor{d70}
@deffn {Function} socket.close (fd)

Close a socket file descriptor. This is like @ref{d71,,os.close()}, but for
sockets. On some platforms (most notably Windows) @code{os.close()}
does not work for socket file descriptors.


Added in version 3.7.

@end deffn

@geindex getaddrinfo() (in module socket)
@anchor{library/socket socket getaddrinfo}@anchor{17a8}
@deffn {Function} socket.getaddrinfo (host, port, family=AF_UNSPEC, type=0, proto=0, flags=0)

This function wraps the C function @code{getaddrinfo} of the underlying system.

Translate the `host'/`port' argument into a sequence of 5-tuples that contain
all the necessary arguments for creating a socket connected to that service.
`host' is a domain name, a string representation of an IPv4/v6 address
or @code{None}. `port' is a string service name such as @code{'http'}, a numeric
port number or @code{None}.  By passing @code{None} as the value of `host'
and `port', you can pass @code{NULL} to the underlying C API.

The `family', `type' and `proto' arguments can be optionally specified
in order to provide options and limit the list of addresses returned.
Pass their default values (@ref{3912,,AF_UNSPEC}, 0, and 0, respectively)
to not limit the results. See the note below for details.

The `flags' argument can be one or several of the @code{AI_*} constants,
and will influence how results are computed and returned.
For example, @code{AI_NUMERICHOST} will disable domain name resolution
and will raise an error if `host' is a domain name.

The function returns a list of 5-tuples with the following structure:

@code{(family, type, proto, canonname, sockaddr)}

In these tuples, `family', `type', `proto' are all integers and are
meant to be passed to the @ref{fa7,,socket()} function.  `canonname' will be
a string representing the canonical name of the `host' if
@code{AI_CANONNAME} is part of the `flags' argument; else `canonname'
will be empty.  `sockaddr' is a tuple describing a socket address, whose
format depends on the returned `family' (a @code{(address, port)} 2-tuple for
@ref{1bf0,,AF_INET}, a @code{(address, port, flowinfo, scope_id)} 4-tuple for
@ref{1bf1,,AF_INET6}), and is meant to be passed to the @ref{fa9,,socket.connect()}
method.

@cartouche
@quotation Note 
If you intend to use results from @code{getaddrinfo()} to create a socket
(rather than, for example, retrieve `canonname'),
consider limiting the results by `type' (e.g. @ref{14ff,,SOCK_STREAM} or
@ref{14fe,,SOCK_DGRAM}) and/or `proto' (e.g. @code{IPPROTO_TCP} or
@code{IPPROTO_UDP}) that your application can handle.

The behavior with default values of `family', `type', `proto'
and `flags' is system-specific.

Many systems (for example, most Linux configurations) will return a sorted
list of all matching addresses.
These addresses should generally be tried in order until a connection succeeds
(possibly tried in parallel, for example, using a Happy Eyeballs@footnote{https://en.wikipedia.org/wiki/Happy_Eyeballs} algorithm).
In these cases, limiting the `type' and/or `proto' can help eliminate
unsuccessful or unusable connection attempts.

Some systems will, however, only return a single address.
(For example, this was reported on Solaris and AIX configurations.)
On these systems, limiting the `type' and/or `proto' helps ensure that
this address is usable.
@end quotation
@end cartouche

Raises an @ref{1cb1,,auditing event} @code{socket.getaddrinfo} with arguments @code{host}, @code{port}, @code{family}, @code{type}, @code{protocol}.

The following example fetches address information for a hypothetical TCP
connection to @code{example.org} on port 80 (results may differ on your
system if IPv6 isn’t enabled):

@example
>>> socket.getaddrinfo("example.org", 80, proto=socket.IPPROTO_TCP)
[(socket.AF_INET6, socket.SOCK_STREAM,
 6, '@w{'}, ('2606:2800:220:1:248:1893:25c8:1946', 80, 0, 0)),
 (socket.AF_INET, socket.SOCK_STREAM,
 6, '@w{'}, ('93.184.216.34', 80))]
@end example


Changed in version 3.2: parameters can now be passed using keyword arguments.



Changed in version 3.7: for IPv6 multicast addresses, string representing an address will not
contain @code{%scope_id} part.

@end deffn

@geindex getfqdn() (in module socket)
@anchor{library/socket socket getfqdn}@anchor{1b31}
@deffn {Function} socket.getfqdn ([name])

Return a fully qualified domain name for `name'. If `name' is omitted or empty,
it is interpreted as the local host.  To find the fully qualified name, the
hostname returned by @ref{1cc6,,gethostbyaddr()} is checked, followed by aliases for the
host, if available.  The first name which includes a period is selected.  In
case no fully qualified domain name is available and `name' was provided,
it is returned unchanged.  If `name' was empty or equal to @code{'0.0.0.0'},
the hostname from @ref{3096,,gethostname()} is returned.
@end deffn

@geindex gethostbyname() (in module socket)
@anchor{library/socket socket gethostbyname}@anchor{3a1a}
@deffn {Function} socket.gethostbyname (hostname)

Translate a host name to IPv4 address format.  The IPv4 address is returned as a
string, such as  @code{'100.50.200.5'}.  If the host name is an IPv4 address itself
it is returned unchanged.  See @ref{1cc7,,gethostbyname_ex()} for a more complete
interface. @code{gethostbyname()} does not support IPv6 name resolution, and
@ref{17a8,,getaddrinfo()} should be used instead for IPv4/v6 dual stack support.

Raises an @ref{1cb1,,auditing event} @code{socket.gethostbyname} with argument @code{hostname}.

@ref{2181,,Availability}: not WASI.
@end deffn

@geindex gethostbyname_ex() (in module socket)
@anchor{library/socket socket gethostbyname_ex}@anchor{1cc7}
@deffn {Function} socket.gethostbyname_ex (hostname)

Translate a host name to IPv4 address format, extended interface. Return a
3-tuple @code{(hostname, aliaslist, ipaddrlist)} where `hostname' is the host’s
primary host name, `aliaslist' is a (possibly
empty) list of alternative host names for the same address, and `ipaddrlist' is
a list of IPv4 addresses for the same interface on the same host (often but not
always a single address). @code{gethostbyname_ex()} does not support IPv6 name
resolution, and @ref{17a8,,getaddrinfo()} should be used instead for IPv4/v6 dual
stack support.

Raises an @ref{1cb1,,auditing event} @code{socket.gethostbyname} with argument @code{hostname}.

@ref{2181,,Availability}: not WASI.
@end deffn

@geindex gethostname() (in module socket)
@anchor{library/socket socket gethostname}@anchor{3096}
@deffn {Function} socket.gethostname ()

Return a string containing the hostname of the machine where  the Python
interpreter is currently executing.

Raises an @ref{1cb1,,auditing event} @code{socket.gethostname} with no arguments.

Note: @code{gethostname()} doesn’t always return the fully qualified domain
name; use @ref{1b31,,getfqdn()} for that.

@ref{2181,,Availability}: not WASI.
@end deffn

@geindex gethostbyaddr() (in module socket)
@anchor{library/socket socket gethostbyaddr}@anchor{1cc6}
@deffn {Function} socket.gethostbyaddr (ip_address)

Return a 3-tuple @code{(hostname, aliaslist, ipaddrlist)} where `hostname' is the
primary host name responding to the given `ip_address', `aliaslist' is a
(possibly empty) list of alternative host names for the same address, and
`ipaddrlist' is a list of IPv4/v6 addresses for the same interface on the same
host (most likely containing only a single address). To find the fully qualified
domain name, use the function @ref{1b31,,getfqdn()}. @code{gethostbyaddr()} supports
both IPv4 and IPv6.

Raises an @ref{1cb1,,auditing event} @code{socket.gethostbyaddr} with argument @code{ip_address}.

@ref{2181,,Availability}: not WASI.
@end deffn

@geindex getnameinfo() (in module socket)
@anchor{library/socket socket getnameinfo}@anchor{1a81}
@deffn {Function} socket.getnameinfo (sockaddr, flags)

Translate a socket address `sockaddr' into a 2-tuple @code{(host, port)}. Depending
on the settings of `flags', the result can contain a fully qualified domain name
or numeric address representation in `host'.  Similarly, `port' can contain a
string port name or a numeric port number.

For IPv6 addresses, @code{%scope_id} is appended to the host part if `sockaddr'
contains meaningful `scope_id'. Usually this happens for multicast addresses.

For more information about `flags' you can consult @code{getnameinfo(3)@footnote{https://manpages.debian.org/getnameinfo(3)}}.

Raises an @ref{1cb1,,auditing event} @code{socket.getnameinfo} with argument @code{sockaddr}.

@ref{2181,,Availability}: not WASI.
@end deffn

@geindex getprotobyname() (in module socket)
@anchor{library/socket socket getprotobyname}@anchor{3a1b}
@deffn {Function} socket.getprotobyname (protocolname)

Translate an internet protocol name (for example, @code{'icmp'}) to a constant
suitable for passing as the (optional) third argument to the @ref{fa7,,socket()}
function.  This is usually only needed for sockets opened in “raw” mode
(@ref{39dc,,SOCK_RAW}); for the normal socket modes, the correct protocol is chosen
automatically if the protocol is omitted or zero.

@ref{2181,,Availability}: not WASI.
@end deffn

@geindex getservbyname() (in module socket)
@anchor{library/socket socket getservbyname}@anchor{3a1c}
@deffn {Function} socket.getservbyname (servicename[, protocolname])

Translate an internet service name and protocol name to a port number for that
service.  The optional protocol name, if given, should be @code{'tcp'} or
@code{'udp'}, otherwise any protocol will match.

Raises an @ref{1cb1,,auditing event} @code{socket.getservbyname} with arguments @code{servicename}, @code{protocolname}.

@ref{2181,,Availability}: not WASI.
@end deffn

@geindex getservbyport() (in module socket)
@anchor{library/socket socket getservbyport}@anchor{3a1d}
@deffn {Function} socket.getservbyport (port[, protocolname])

Translate an internet port number and protocol name to a service name for that
service.  The optional protocol name, if given, should be @code{'tcp'} or
@code{'udp'}, otherwise any protocol will match.

Raises an @ref{1cb1,,auditing event} @code{socket.getservbyport} with arguments @code{port}, @code{protocolname}.

@ref{2181,,Availability}: not WASI.
@end deffn

@geindex ntohl() (in module socket)
@anchor{library/socket socket ntohl}@anchor{3a1e}
@deffn {Function} socket.ntohl (x)

Convert 32-bit positive integers from network to host byte order.  On machines
where the host byte order is the same as network byte order, this is a no-op;
otherwise, it performs a 4-byte swap operation.
@end deffn

@geindex ntohs() (in module socket)
@anchor{library/socket socket ntohs}@anchor{a86}
@deffn {Function} socket.ntohs (x)

Convert 16-bit positive integers from network to host byte order.  On machines
where the host byte order is the same as network byte order, this is a no-op;
otherwise, it performs a 2-byte swap operation.


Changed in version 3.10: Raises @ref{a87,,OverflowError} if `x' does not fit in a 16-bit unsigned
integer.

@end deffn

@geindex htonl() (in module socket)
@anchor{library/socket socket htonl}@anchor{3a1f}
@deffn {Function} socket.htonl (x)

Convert 32-bit positive integers from host to network byte order.  On machines
where the host byte order is the same as network byte order, this is a no-op;
otherwise, it performs a 4-byte swap operation.
@end deffn

@geindex htons() (in module socket)
@anchor{library/socket socket htons}@anchor{a85}
@deffn {Function} socket.htons (x)

Convert 16-bit positive integers from host to network byte order.  On machines
where the host byte order is the same as network byte order, this is a no-op;
otherwise, it performs a 2-byte swap operation.


Changed in version 3.10: Raises @ref{a87,,OverflowError} if `x' does not fit in a 16-bit unsigned
integer.

@end deffn

@geindex inet_aton() (in module socket)
@anchor{library/socket socket inet_aton}@anchor{b60}
@deffn {Function} socket.inet_aton (ip_string)

Convert an IPv4 address from dotted-quad string format (for example,
‘123.45.67.89’) to 32-bit packed binary format, as a bytes object four characters in
length.  This is useful when conversing with a program that uses the standard C
library and needs objects of type @code{in_addr}, which is the C type
for the 32-bit packed binary this function returns.

@code{inet_aton()} also accepts strings with less than three dots; see the
Unix manual page @code{inet(3)@footnote{https://manpages.debian.org/inet(3)}} for details.

If the IPv4 address string passed to this function is invalid,
@ref{2c2,,OSError} will be raised. Note that exactly what is valid depends on
the underlying C implementation of @code{inet_aton()}.

@code{inet_aton()} does not support IPv6, and @ref{b61,,inet_pton()} should be used
instead for IPv4/v6 dual stack support.
@end deffn

@geindex inet_ntoa() (in module socket)
@anchor{library/socket socket inet_ntoa}@anchor{3a20}
@deffn {Function} socket.inet_ntoa (packed_ip)

Convert a 32-bit packed IPv4 address (a @ref{194,,bytes-like object} four
bytes in length) to its standard dotted-quad string representation (for example,
‘123.45.67.89’).  This is useful when conversing with a program that uses the
standard C library and needs objects of type @code{in_addr}, which
is the C type for the 32-bit packed binary data this function takes as an
argument.

If the byte sequence passed to this function is not exactly 4 bytes in
length, @ref{2c2,,OSError} will be raised. @code{inet_ntoa()} does not
support IPv6, and @ref{11ab,,inet_ntop()} should be used instead for IPv4/v6 dual
stack support.


Changed in version 3.5: Writable @ref{194,,bytes-like object} is now accepted.

@end deffn

@geindex inet_pton() (in module socket)
@anchor{library/socket socket inet_pton}@anchor{b61}
@deffn {Function} socket.inet_pton (address_family, ip_string)

Convert an IP address from its family-specific string format to a packed,
binary format. @code{inet_pton()} is useful when a library or network protocol
calls for an object of type @code{in_addr} (similar to
@ref{b60,,inet_aton()}) or @code{in6_addr}.

Supported values for `address_family' are currently @ref{1bf0,,AF_INET} and
@ref{1bf1,,AF_INET6}. If the IP address string `ip_string' is invalid,
@ref{2c2,,OSError} will be raised. Note that exactly what is valid depends on
both the value of `address_family' and the underlying implementation of
@code{inet_pton()}.

@ref{2181,,Availability}: Unix, Windows.


Changed in version 3.4: Windows support added

@end deffn

@geindex inet_ntop() (in module socket)
@anchor{library/socket socket inet_ntop}@anchor{11ab}
@deffn {Function} socket.inet_ntop (address_family, packed_ip)

Convert a packed IP address (a @ref{194,,bytes-like object} of some number of
bytes) to its standard, family-specific string representation (for
example, @code{'7.10.0.5'} or @code{'5aef:2b::8'}).
@code{inet_ntop()} is useful when a library or network protocol returns an
object of type @code{in_addr} (similar to @ref{3a20,,inet_ntoa()}) or
@code{in6_addr}.

Supported values for `address_family' are currently @ref{1bf0,,AF_INET} and
@ref{1bf1,,AF_INET6}. If the bytes object `packed_ip' is not the correct
length for the specified address family, @ref{2ee,,ValueError} will be raised.
@ref{2c2,,OSError} is raised for errors from the call to @code{inet_ntop()}.

@ref{2181,,Availability}: Unix, Windows.


Changed in version 3.4: Windows support added



Changed in version 3.5: Writable @ref{194,,bytes-like object} is now accepted.

@end deffn

@c XXX: Are sendmsg(), recvmsg() and CMSG_*() available on any
@c non-Unix platforms?  The old (obsolete?) 4.2BSD form of the
@c interface, in which struct msghdr has no msg_control or
@c msg_controllen members, is not currently supported.

@geindex CMSG_LEN() (in module socket)
@anchor{library/socket socket CMSG_LEN}@anchor{1e5a}
@deffn {Function} socket.CMSG_LEN (length)

Return the total length, without trailing padding, of an ancillary
data item with associated data of the given `length'.  This value
can often be used as the buffer size for @ref{fac,,recvmsg()} to
receive a single item of ancillary data, but 
@geindex RFC; RFC 3542
RFC 3542@footnote{https://datatracker.ietf.org/doc/html/rfc3542.html} requires
portable applications to use @ref{1e59,,CMSG_SPACE()} and thus include
space for padding, even when the item will be the last in the
buffer.  Raises @ref{a87,,OverflowError} if `length' is outside the
permissible range of values.

@ref{2181,,Availability}: Unix, not WASI.

Most Unix platforms.


Added in version 3.3.

@end deffn

@geindex CMSG_SPACE() (in module socket)
@anchor{library/socket socket CMSG_SPACE}@anchor{1e59}
@deffn {Function} socket.CMSG_SPACE (length)

Return the buffer size needed for @ref{fac,,recvmsg()} to
receive an ancillary data item with associated data of the given
`length', along with any trailing padding.  The buffer space needed
to receive multiple items is the sum of the @code{CMSG_SPACE()}
values for their associated data lengths.  Raises
@ref{a87,,OverflowError} if `length' is outside the permissible range
of values.

Note that some systems might support ancillary data without
providing this function.  Also note that setting the buffer size
using the results of this function may not precisely limit the
amount of ancillary data that can be received, since additional
data may be able to fit into the padding area.

@ref{2181,,Availability}: Unix, not WASI.

most Unix platforms.


Added in version 3.3.

@end deffn

@geindex getdefaulttimeout() (in module socket)
@anchor{library/socket socket getdefaulttimeout}@anchor{3a17}
@deffn {Function} socket.getdefaulttimeout ()

Return the default timeout in seconds (float) for new socket objects. A value
of @code{None} indicates that new socket objects have no timeout. When the socket
module is first imported, the default is @code{None}.
@end deffn

@geindex setdefaulttimeout() (in module socket)
@anchor{library/socket socket setdefaulttimeout}@anchor{39da}
@deffn {Function} socket.setdefaulttimeout (timeout)

Set the default timeout in seconds (float) for new socket objects.  When
the socket module is first imported, the default is @code{None}.  See
@ref{39d6,,settimeout()} for possible values and their respective
meanings.
@end deffn

@geindex sethostname() (in module socket)
@anchor{library/socket socket sethostname}@anchor{1347}
@deffn {Function} socket.sethostname (name)

Set the machine’s hostname to `name'.  This will raise an
@ref{2c2,,OSError} if you don’t have enough rights.

Raises an @ref{1cb1,,auditing event} @code{socket.sethostname} with argument @code{name}.

@ref{2181,,Availability}: Unix, not Android.


Added in version 3.3.

@end deffn

@geindex if_nameindex() (in module socket)
@anchor{library/socket socket if_nameindex}@anchor{c28}
@deffn {Function} socket.if_nameindex ()

Return a list of network interface information
(index int, name string) tuples.
@ref{2c2,,OSError} if the system call fails.

@ref{2181,,Availability}: Unix, Windows, not WASI.


Added in version 3.3.



Changed in version 3.8: Windows support was added.


@cartouche
@quotation Note 
On Windows network interfaces have different names in different contexts
(all names are examples):


@itemize *

@item 
UUID: @code{@{FB605B73-AAC2-49A6-9A2F-25416AEA0573@}}

@item 
name: @code{ethernet_32770}

@item 
friendly name: @code{vEthernet (nat)}

@item 
description: @code{Hyper-V Virtual Ethernet Adapter}
@end itemize

This function returns names of the second form from the list, @code{ethernet_32770}
in this example case.
@end quotation
@end cartouche
@end deffn

@geindex if_nametoindex() (in module socket)
@anchor{library/socket socket if_nametoindex}@anchor{c29}
@deffn {Function} socket.if_nametoindex (if_name)

Return a network interface index number corresponding to an
interface name.
@ref{2c2,,OSError} if no interface with the given name exists.

@ref{2181,,Availability}: Unix, Windows, not WASI.


Added in version 3.3.



Changed in version 3.8: Windows support was added.



@subsubheading See also


“Interface name” is a name as documented in @ref{c28,,if_nameindex()}.

@end deffn

@geindex if_indextoname() (in module socket)
@anchor{library/socket socket if_indextoname}@anchor{c2a}
@deffn {Function} socket.if_indextoname (if_index)

Return a network interface name corresponding to an
interface index number.
@ref{2c2,,OSError} if no interface with the given index exists.

@ref{2181,,Availability}: Unix, Windows, not WASI.


Added in version 3.3.



Changed in version 3.8: Windows support was added.



@subsubheading See also


“Interface name” is a name as documented in @ref{c28,,if_nameindex()}.

@end deffn

@geindex send_fds() (in module socket)
@anchor{library/socket socket send_fds}@anchor{b33}
@deffn {Function} socket.send_fds (sock, buffers, fds[, flags[, address]])

Send the list of file descriptors `fds' over an @ref{1bf3,,AF_UNIX} socket `sock'.
The `fds' parameter is a sequence of file descriptors.
Consult @ref{6a2,,sendmsg()} for the documentation of these parameters.

@ref{2181,,Availability}: Unix, not WASI.

Unix platforms supporting @ref{6a2,,sendmsg()}
and @code{SCM_RIGHTS} mechanism.


Added in version 3.9.

@end deffn

@geindex recv_fds() (in module socket)
@anchor{library/socket socket recv_fds}@anchor{b34}
@deffn {Function} socket.recv_fds (sock, bufsize, maxfds[, flags])

Receive up to `maxfds' file descriptors from an @ref{1bf3,,AF_UNIX} socket `sock'.
Return @code{(msg, list(fds), flags, addr)}.
Consult @ref{fac,,recvmsg()} for the documentation of these parameters.

@ref{2181,,Availability}: Unix, not WASI.

Unix platforms supporting @ref{fac,,recvmsg()}
and @code{SCM_RIGHTS} mechanism.


Added in version 3.9.


@cartouche
@quotation Note 
Any truncated integers at the end of the list of file descriptors.
@end quotation
@end cartouche
@end deffn

@node Socket Objects,Notes on socket timeouts,Module contents<2>,socket — Low-level networking interface
@anchor{library/socket id1}@anchor{3a21}@anchor{library/socket socket-objects}@anchor{3a16}
@subsubsection Socket Objects


@geindex socket (class in socket)
@anchor{library/socket socket socket}@anchor{fa7}
@deffn {Class} socket.socket (family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None)

Create a new socket using the given address family, socket type and protocol
number.  The address family should be @ref{1bf0,,AF_INET} (the default),
@ref{1bf1,,AF_INET6}, @ref{1bf3,,AF_UNIX}, @ref{39cc,,AF_CAN}, @ref{39d3,,AF_PACKET},
or @ref{39e3,,AF_RDS}. The socket type should be @ref{14ff,,SOCK_STREAM} (the
default), @ref{14fe,,SOCK_DGRAM}, @ref{39dc,,SOCK_RAW} or perhaps one of the other
@code{SOCK_} constants. The protocol number is usually zero and may be omitted
or in the case where the address family is @code{AF_CAN} the protocol
should be one of @code{CAN_RAW}, @ref{11a9,,CAN_BCM}, @ref{39cd,,CAN_ISOTP} or
@ref{b32,,CAN_J1939}.

If `fileno' is specified, the values for `family', `type', and `proto' are
auto-detected from the specified file descriptor.  Auto-detection can be
overruled by calling the function with explicit `family', `type', or `proto'
arguments.  This only affects how Python represents e.g. the return value
of @ref{3951,,socket.getpeername()} but not the actual OS resource.  Unlike
@ref{3a18,,socket.fromfd()}, `fileno' will return the same socket and not a
duplicate. This may help close a detached socket using
@ref{d70,,socket.close()}.

The newly created socket is @ref{1102,,non-inheritable}.

Raises an @ref{1cb1,,auditing event} @code{socket.__new__} with arguments @code{self}, @code{family}, @code{type}, @code{protocol}.


Changed in version 3.3: The AF_CAN family was added.
The AF_RDS family was added.



Changed in version 3.4: The CAN_BCM protocol was added.



Changed in version 3.4: The returned socket is now non-inheritable.



Changed in version 3.7: The CAN_ISOTP protocol was added.



Changed in version 3.7: When @ref{e0a,,SOCK_NONBLOCK} or @ref{e0b,,SOCK_CLOEXEC}
bit flags are applied to `type' they are cleared, and
@ref{e0c,,socket.type} will not reflect them.  They are still passed
to the underlying system @code{socket()} call.  Therefore,

@example
sock = socket.socket(
    socket.AF_INET,
    socket.SOCK_STREAM | socket.SOCK_NONBLOCK)
@end example

will still create a non-blocking socket on OSes that support
@code{SOCK_NONBLOCK}, but @code{sock.type} will be set to
@code{socket.SOCK_STREAM}.



Changed in version 3.9: The CAN_J1939 protocol was added.



Changed in version 3.10: The IPPROTO_MPTCP protocol was added.


Socket objects have the following methods.  Except for
@ref{13ab,,makefile()}, these correspond to Unix system calls applicable
to sockets.


Changed in version 3.2: Support for the @ref{1e3,,context manager} protocol was added.  Exiting the
context manager is equivalent to calling @ref{d70,,close()}.


@geindex accept() (socket.socket method)
@anchor{library/socket socket socket accept}@anchor{fa8}
@deffn {Method} accept ()

Accept a connection. The socket must be bound to an address and listening for
connections. The return value is a pair @code{(conn, address)} where `conn' is a
`new' socket object usable to send and receive data on the connection, and
`address' is the address bound to the socket on the other end of the connection.

The newly created socket is @ref{1102,,non-inheritable}.


Changed in version 3.4: The socket is now non-inheritable.



Changed in version 3.5: If the system call is interrupted and the signal handler does not raise
an exception, the method now retries the system call instead of raising
an @ref{f8e,,InterruptedError} exception (see 
@geindex Python Enhancement Proposals; PEP 475
PEP 475@footnote{https://peps.python.org/pep-0475/} for the rationale).

@end deffn

@geindex bind() (socket.socket method)
@anchor{library/socket socket socket bind}@anchor{1746}
@deffn {Method} bind (address)

Bind the socket to `address'.  The socket must not already be bound. The format
of `address' depends on the address family — see @ref{39c9,,Socket families}.

Raises an @ref{1cb1,,auditing event} @code{socket.bind} with arguments @code{self}, @code{address}.

@ref{2181,,Availability}: not WASI.
@end deffn

@geindex close() (socket.socket method)
@anchor{library/socket socket socket close}@anchor{f45}
@deffn {Method} close ()

Mark the socket closed.  The underlying system resource (e.g. a file
descriptor) is also closed when all file objects from @ref{13ab,,makefile()}
are closed.  Once that happens, all future operations on the socket
object will fail. The remote end will receive no more data (after
queued data is flushed).

Sockets are automatically closed when they are garbage-collected, but
it is recommended to @code{close()} them explicitly, or to use a
@ref{187,,with} statement around them.


Changed in version 3.6: @ref{2c2,,OSError} is now raised if an error occurs when the underlying
@code{close()} call is made.


@cartouche
@quotation Note 
@code{close()} releases the resource associated with a connection but
does not necessarily close the connection immediately.  If you want
to close the connection in a timely fashion, call @ref{3a13,,shutdown()}
before @code{close()}.
@end quotation
@end cartouche
@end deffn

@geindex connect() (socket.socket method)
@anchor{library/socket socket socket connect}@anchor{fa9}
@deffn {Method} connect (address)

Connect to a remote socket at `address'. The format of `address' depends on the
address family — see @ref{39c9,,Socket families}.

If the connection is interrupted by a signal, the method waits until the
connection completes, or raises a @ref{a3c,,TimeoutError} on timeout, if the
signal handler doesn’t raise an exception and the socket is blocking or has
a timeout. For non-blocking sockets, the method raises an
@ref{f8e,,InterruptedError} exception if the connection is interrupted by a
signal (or the exception raised by the signal handler).

Raises an @ref{1cb1,,auditing event} @code{socket.connect} with arguments @code{self}, @code{address}.


Changed in version 3.5: The method now waits until the connection completes instead of raising an
@ref{f8e,,InterruptedError} exception if the connection is interrupted by a
signal, the signal handler doesn’t raise an exception and the socket is
blocking or has a timeout (see the 
@geindex Python Enhancement Proposals; PEP 475
PEP 475@footnote{https://peps.python.org/pep-0475/} for the rationale).


@ref{2181,,Availability}: not WASI.
@end deffn

@geindex connect_ex() (socket.socket method)
@anchor{library/socket socket socket connect_ex}@anchor{1745}
@deffn {Method} connect_ex (address)

Like @code{connect(address)}, but return an error indicator instead of raising an
exception for errors returned by the C-level @code{connect()} call (other
problems, such as “host not found,” can still raise exceptions).  The error
indicator is @code{0} if the operation succeeded, otherwise the value of the
@code{errno} variable.  This is useful to support, for example, asynchronous
connects.

Raises an @ref{1cb1,,auditing event} @code{socket.connect} with arguments @code{self}, @code{address}.

@ref{2181,,Availability}: not WASI.
@end deffn

@geindex detach() (socket.socket method)
@anchor{library/socket socket socket detach}@anchor{1428}
@deffn {Method} detach ()

Put the socket object into closed state without actually closing the
underlying file descriptor.  The file descriptor is returned, and can
be reused for other purposes.


Added in version 3.2.

@end deffn

@geindex dup() (socket.socket method)
@anchor{library/socket socket socket dup}@anchor{3a22}
@deffn {Method} dup ()

Duplicate the socket.

The newly created socket is @ref{1102,,non-inheritable}.


Changed in version 3.4: The socket is now non-inheritable.


@ref{2181,,Availability}: not WASI.
@end deffn

@geindex fileno() (socket.socket method)
@anchor{library/socket socket socket fileno}@anchor{3a23}
@deffn {Method} fileno ()

Return the socket’s file descriptor (a small integer), or -1 on failure. This
is useful with @ref{fa6,,select.select()}.

Under Windows the small integer returned by this method cannot be used where a
file descriptor can be used (such as @ref{23c4,,os.fdopen()}).  Unix does not have
this limitation.
@end deffn

@geindex get_inheritable() (socket.socket method)
@anchor{library/socket socket socket get_inheritable}@anchor{1107}
@deffn {Method} get_inheritable ()

Get the @ref{1102,,inheritable flag} of the socket’s file
descriptor or socket’s handle: @code{True} if the socket can be inherited in
child processes, @code{False} if it cannot.


Added in version 3.4.

@end deffn

@geindex getpeername() (socket.socket method)
@anchor{library/socket socket socket getpeername}@anchor{3951}
@deffn {Method} getpeername ()

Return the remote address to which the socket is connected.  This is useful to
find out the port number of a remote IPv4/v6 socket, for instance. The format
of the address returned depends on the address family — see @ref{39c9,,Socket families}.
On some systems this function is not supported.
@end deffn

@geindex getsockname() (socket.socket method)
@anchor{library/socket socket socket getsockname}@anchor{286}
@deffn {Method} getsockname ()

Return the socket’s own address.  This is useful to find out the port number of
an IPv4/v6 socket, for instance. The format of the address returned depends on
the address family — see @ref{39c9,,Socket families}.
@end deffn

@geindex getsockopt() (socket.socket method)
@anchor{library/socket socket socket getsockopt}@anchor{ed6}
@deffn {Method} getsockopt (level, optname[, buflen])

Return the value of the given socket option (see the Unix man page
@code{getsockopt(2)@footnote{https://manpages.debian.org/getsockopt(2)}}).  The needed symbolic constants (@ref{d72,,SO_* etc.})
are defined in this module.  If `buflen' is absent, an integer option is assumed
and its integer value is returned by the function.  If `buflen' is present, it
specifies the maximum length of the buffer used to receive the option in, and
this buffer is returned as a bytes object.  It is up to the caller to decode the
contents of the buffer (see the optional built-in module @ref{db,,struct} for a way
to decode C structures encoded as byte strings).

@ref{2181,,Availability}: not WASI.
@end deffn

@geindex getblocking() (socket.socket method)
@anchor{library/socket socket socket getblocking}@anchor{d6f}
@deffn {Method} getblocking ()

Return @code{True} if socket is in blocking mode, @code{False} if in
non-blocking.

This is equivalent to checking @code{socket.gettimeout() != 0}.


Added in version 3.7.

@end deffn

@geindex gettimeout() (socket.socket method)
@anchor{library/socket socket socket gettimeout}@anchor{3a24}
@deffn {Method} gettimeout ()

Return the timeout in seconds (float) associated with socket operations,
or @code{None} if no timeout is set.  This reflects the last call to
@ref{30ac,,setblocking()} or @ref{39d6,,settimeout()}.
@end deffn

@geindex ioctl() (socket.socket method)
@anchor{library/socket socket socket ioctl}@anchor{ed4}
@deffn {Method} ioctl (control, option)

The @code{ioctl()} method is a limited interface to the WSAIoctl system
interface.  Please refer to the Win32 documentation@footnote{https://msdn.microsoft.com/en-us/library/ms741621%28VS.85%29.aspx} for more
information.

On other platforms, the generic @ref{189a,,fcntl.fcntl()} and @ref{1687,,fcntl.ioctl()}
functions may be used; they accept a socket object as their first argument.

Currently only the following control codes are supported:
@code{SIO_RCVALL}, @code{SIO_KEEPALIVE_VALS}, and @code{SIO_LOOPBACK_FAST_PATH}.

@ref{2181,,Availability}: Windows


Changed in version 3.6: @code{SIO_LOOPBACK_FAST_PATH} was added.

@end deffn

@geindex listen() (socket.socket method)
@anchor{library/socket socket socket listen}@anchor{1064}
@deffn {Method} listen ([backlog])

Enable a server to accept connections.  If `backlog' is specified, it must
be at least 0 (if it is lower, it is set to 0); it specifies the number of
unaccepted connections that the system will allow before refusing new
connections. If not specified, a default reasonable value is chosen.

@ref{2181,,Availability}: not WASI.


Changed in version 3.5: The `backlog' parameter is now optional.

@end deffn

@geindex makefile() (socket.socket method)
@anchor{library/socket socket socket makefile}@anchor{13ab}
@deffn {Method} makefile (mode='r', buffering=None, *, encoding=None, errors=None, newline=None)

@geindex I/O control; buffering

Return a @ref{13cf,,file object} associated with the socket.  The exact returned
type depends on the arguments given to @code{makefile()}.  These arguments are
interpreted the same way as by the built-in @ref{318,,open()} function, except
the only supported `mode' values are @code{'r'} (default), @code{'w'}, @code{'b'}, or
a combination of those.

The socket must be in blocking mode; it can have a timeout, but the file
object’s internal buffer may end up in an inconsistent state if a timeout
occurs.

Closing the file object returned by @code{makefile()} won’t close the
original socket unless all other file objects have been closed and
@ref{d70,,socket.close()} has been called on the socket object.

@cartouche
@quotation Note 
On Windows, the file-like object created by @code{makefile()} cannot be
used where a file object with a file descriptor is expected, such as the
stream arguments of @ref{4b8,,subprocess.Popen()}.
@end quotation
@end cartouche
@end deffn

@geindex recv() (socket.socket method)
@anchor{library/socket socket socket recv}@anchor{faa}
@deffn {Method} recv (bufsize[, flags])

Receive data from the socket.  The return value is a bytes object representing the
data received.  The maximum amount of data to be received at once is specified
by `bufsize'. A returned empty bytes object indicates that the client has disconnected.
See the Unix manual page @code{recv(2)@footnote{https://manpages.debian.org/recv(2)}} for the meaning of the optional argument
`flags'; it defaults to zero.


Changed in version 3.5: If the system call is interrupted and the signal handler does not raise
an exception, the method now retries the system call instead of raising
an @ref{f8e,,InterruptedError} exception (see 
@geindex Python Enhancement Proposals; PEP 475
PEP 475@footnote{https://peps.python.org/pep-0475/} for the rationale).

@end deffn

@geindex recvfrom() (socket.socket method)
@anchor{library/socket socket socket recvfrom}@anchor{fab}
@deffn {Method} recvfrom (bufsize[, flags])

Receive data from the socket.  The return value is a pair @code{(bytes, address)}
where `bytes' is a bytes object representing the data received and `address' is the
address of the socket sending the data.  See the Unix manual page
@code{recv(2)@footnote{https://manpages.debian.org/recv(2)}} for the meaning of the optional argument `flags'; it defaults
to zero. The format of `address' depends on the address family — see
@ref{39c9,,Socket families}.


Changed in version 3.5: If the system call is interrupted and the signal handler does not raise
an exception, the method now retries the system call instead of raising
an @ref{f8e,,InterruptedError} exception (see 
@geindex Python Enhancement Proposals; PEP 475
PEP 475@footnote{https://peps.python.org/pep-0475/} for the rationale).



Changed in version 3.7: For multicast IPv6 address, first item of `address' does not contain
@code{%scope_id} part anymore. In order to get full IPv6 address use
@ref{1a81,,getnameinfo()}.

@end deffn

@geindex recvmsg() (socket.socket method)
@anchor{library/socket socket socket recvmsg}@anchor{fac}
@deffn {Method} recvmsg (bufsize[, ancbufsize[, flags]])

Receive normal data (up to `bufsize' bytes) and ancillary data from
the socket.  The `ancbufsize' argument sets the size in bytes of
the internal buffer used to receive the ancillary data; it defaults
to 0, meaning that no ancillary data will be received.  Appropriate
buffer sizes for ancillary data can be calculated using
@ref{1e59,,CMSG_SPACE()} or @ref{1e5a,,CMSG_LEN()}, and items which do not fit
into the buffer might be truncated or discarded.  The `flags'
argument defaults to 0 and has the same meaning as for
@ref{faa,,recv()}.

The return value is a 4-tuple: @code{(data, ancdata, msg_flags,
address)}.  The `data' item is a @ref{193,,bytes} object holding the
non-ancillary data received.  The `ancdata' item is a list of zero
or more tuples @code{(cmsg_level, cmsg_type, cmsg_data)} representing
the ancillary data (control messages) received: `cmsg_level' and
`cmsg_type' are integers specifying the protocol level and
protocol-specific type respectively, and `cmsg_data' is a
@code{bytes} object holding the associated data.  The `msg_flags'
item is the bitwise OR of various flags indicating conditions on
the received message; see your system documentation for details.
If the receiving socket is unconnected, `address' is the address of
the sending socket, if available; otherwise, its value is
unspecified.

On some systems, @ref{6a2,,sendmsg()} and @code{recvmsg()} can be used to
pass file descriptors between processes over an @ref{1bf3,,AF_UNIX}
socket.  When this facility is used (it is often restricted to
@ref{14ff,,SOCK_STREAM} sockets), @code{recvmsg()} will return, in its
ancillary data, items of the form @code{(socket.SOL_SOCKET,
socket.SCM_RIGHTS, fds)}, where `fds' is a @ref{193,,bytes} object
representing the new file descriptors as a binary array of the
native C int type.  If @code{recvmsg()} raises an
exception after the system call returns, it will first attempt to
close any file descriptors received via this mechanism.

Some systems do not indicate the truncated length of ancillary data
items which have been only partially received.  If an item appears
to extend beyond the end of the buffer, @code{recvmsg()} will issue
a @ref{4d8,,RuntimeWarning}, and will return the part of it which is
inside the buffer provided it has not been truncated before the
start of its associated data.

On systems which support the @code{SCM_RIGHTS} mechanism, the
following function will receive up to `maxfds' file descriptors,
returning the message data and a list containing the descriptors
(while ignoring unexpected conditions such as unrelated control
messages being received).  See also @ref{6a2,,sendmsg()}.

@example
import socket, array

def recv_fds(sock, msglen, maxfds):
    fds = array.array("i")   # Array of ints
    msg, ancdata, flags, addr = sock.recvmsg(msglen, socket.CMSG_LEN(maxfds * fds.itemsize))
    for cmsg_level, cmsg_type, cmsg_data in ancdata:
        if cmsg_level == socket.SOL_SOCKET and cmsg_type == socket.SCM_RIGHTS:
            # Append data, ignoring any truncated integers at the end.
            fds.frombytes(cmsg_data[:len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
    return msg, list(fds)
@end example

@ref{2181,,Availability}: Unix.

Most Unix platforms.


Added in version 3.3.



Changed in version 3.5: If the system call is interrupted and the signal handler does not raise
an exception, the method now retries the system call instead of raising
an @ref{f8e,,InterruptedError} exception (see 
@geindex Python Enhancement Proposals; PEP 475
PEP 475@footnote{https://peps.python.org/pep-0475/} for the rationale).

@end deffn

@geindex recvmsg_into() (socket.socket method)
@anchor{library/socket socket socket recvmsg_into}@anchor{1346}
@deffn {Method} recvmsg_into (buffers[, ancbufsize[, flags]])

Receive normal data and ancillary data from the socket, behaving as
@ref{fac,,recvmsg()} would, but scatter the non-ancillary data into a
series of buffers instead of returning a new bytes object.  The
`buffers' argument must be an iterable of objects that export
writable buffers (e.g. @ref{342,,bytearray} objects); these will be
filled with successive chunks of the non-ancillary data until it
has all been written or there are no more buffers.  The operating
system may set a limit (@ref{1933,,sysconf()} value @code{SC_IOV_MAX})
on the number of buffers that can be used.  The `ancbufsize' and
`flags' arguments have the same meaning as for @code{recvmsg()}.

The return value is a 4-tuple: @code{(nbytes, ancdata, msg_flags,
address)}, where `nbytes' is the total number of bytes of
non-ancillary data written into the buffers, and `ancdata',
`msg_flags' and `address' are the same as for @ref{fac,,recvmsg()}.

Example:

@example
>>> import socket
>>> s1, s2 = socket.socketpair()
>>> b1 = bytearray(b'----')
>>> b2 = bytearray(b'0123456789')
>>> b3 = bytearray(b'--------------')
>>> s1.send(b'Mary had a little lamb')
22
>>> s2.recvmsg_into([b1, memoryview(b2)[2:9], b3])
(22, [], 0, None)
>>> [b1, b2, b3]
[bytearray(b'Mary'), bytearray(b'01 had a 9'), bytearray(b'little lamb---')]
@end example

@ref{2181,,Availability}: Unix.

Most Unix platforms.


Added in version 3.3.

@end deffn

@geindex recvfrom_into() (socket.socket method)
@anchor{library/socket socket socket recvfrom_into}@anchor{152a}
@deffn {Method} recvfrom_into (buffer[, nbytes[, flags]])

Receive data from the socket, writing it into `buffer' instead of creating a
new bytestring.  The return value is a pair @code{(nbytes, address)} where `nbytes' is
the number of bytes received and `address' is the address of the socket sending
the data.  See the Unix manual page @code{recv(2)@footnote{https://manpages.debian.org/recv(2)}} for the meaning of the
optional argument `flags'; it defaults to zero. The format of `address'
depends on the address family — see @ref{39c9,,Socket families}.
@end deffn

@geindex recv_into() (socket.socket method)
@anchor{library/socket socket socket recv_into}@anchor{1529}
@deffn {Method} recv_into (buffer[, nbytes[, flags]])

Receive up to `nbytes' bytes from the socket, storing the data into a buffer
rather than creating a new bytestring.  If `nbytes' is not specified (or 0),
receive up to the size available in the given buffer.  Returns the number of
bytes received.  See the Unix manual page @code{recv(2)@footnote{https://manpages.debian.org/recv(2)}} for the meaning
of the optional argument `flags'; it defaults to zero.
@end deffn

@geindex send() (socket.socket method)
@anchor{library/socket socket socket send}@anchor{fad}
@deffn {Method} send (bytes[, flags])

Send data to the socket.  The socket must be connected to a remote socket.  The
optional `flags' argument has the same meaning as for @ref{faa,,recv()}.
Returns the number of bytes sent. Applications are responsible for checking that
all data has been sent; if only some of the data was transmitted, the
application needs to attempt delivery of the remaining data. For further
information on this topic, consult the @ref{3a25,,Socket Programming HOWTO}.


Changed in version 3.5: If the system call is interrupted and the signal handler does not raise
an exception, the method now retries the system call instead of raising
an @ref{f8e,,InterruptedError} exception (see 
@geindex Python Enhancement Proposals; PEP 475
PEP 475@footnote{https://peps.python.org/pep-0475/} for the rationale).

@end deffn

@geindex sendall() (socket.socket method)
@anchor{library/socket socket socket sendall}@anchor{fae}
@deffn {Method} sendall (bytes[, flags])

Send data to the socket.  The socket must be connected to a remote socket.  The
optional `flags' argument has the same meaning as for @ref{faa,,recv()}.
Unlike @ref{fad,,send()}, this method continues to send data from `bytes' until
either all data has been sent or an error occurs.  @code{None} is returned on
success.  On error, an exception is raised, and there is no way to determine how
much data, if any, was successfully sent.


Changed in version 3.5: The socket timeout is no longer reset each time data is sent successfully.
The socket timeout is now the maximum total duration to send all data.



Changed in version 3.5: If the system call is interrupted and the signal handler does not raise
an exception, the method now retries the system call instead of raising
an @ref{f8e,,InterruptedError} exception (see 
@geindex Python Enhancement Proposals; PEP 475
PEP 475@footnote{https://peps.python.org/pep-0475/} for the rationale).

@end deffn

@geindex sendto() (socket.socket method)
@anchor{library/socket socket socket sendto}@anchor{faf}
@deffn {Method} sendto (bytes, address)

@deffnx {Method} sendto (bytes, flags, address)

Send data to the socket.  The socket should not be connected to a remote socket,
since the destination socket is specified by `address'.  The optional `flags'
argument has the same meaning as for @ref{faa,,recv()}.  Return the number of
bytes sent. The format of `address' depends on the address family — see
@ref{39c9,,Socket families}.

Raises an @ref{1cb1,,auditing event} @code{socket.sendto} with arguments @code{self}, @code{address}.


Changed in version 3.5: If the system call is interrupted and the signal handler does not raise
an exception, the method now retries the system call instead of raising
an @ref{f8e,,InterruptedError} exception (see 
@geindex Python Enhancement Proposals; PEP 475
PEP 475@footnote{https://peps.python.org/pep-0475/} for the rationale).

@end deffn

@geindex sendmsg() (socket.socket method)
@anchor{library/socket socket socket sendmsg}@anchor{6a2}
@deffn {Method} sendmsg (buffers[, ancdata[, flags[, address]]])

Send normal and ancillary data to the socket, gathering the
non-ancillary data from a series of buffers and concatenating it
into a single message.  The `buffers' argument specifies the
non-ancillary data as an iterable of
@ref{194,,bytes-like objects}
(e.g. @ref{193,,bytes} objects); the operating system may set a limit
(@ref{1933,,sysconf()} value @code{SC_IOV_MAX}) on the number of buffers
that can be used.  The `ancdata' argument specifies the ancillary
data (control messages) as an iterable of zero or more tuples
@code{(cmsg_level, cmsg_type, cmsg_data)}, where `cmsg_level' and
`cmsg_type' are integers specifying the protocol level and
protocol-specific type respectively, and `cmsg_data' is a
bytes-like object holding the associated data.  Note that
some systems (in particular, systems without @ref{1e59,,CMSG_SPACE()})
might support sending only one control message per call.  The
`flags' argument defaults to 0 and has the same meaning as for
@ref{fad,,send()}.  If `address' is supplied and not @code{None}, it sets a
destination address for the message.  The return value is the
number of bytes of non-ancillary data sent.

The following function sends the list of file descriptors `fds'
over an @ref{1bf3,,AF_UNIX} socket, on systems which support the
@code{SCM_RIGHTS} mechanism.  See also @ref{fac,,recvmsg()}.

@example
import socket, array

def send_fds(sock, msg, fds):
    return sock.sendmsg([msg], [(socket.SOL_SOCKET, socket.SCM_RIGHTS, array.array("i", fds))])
@end example

@ref{2181,,Availability}: Unix, not WASI.

Most Unix platforms.

Raises an @ref{1cb1,,auditing event} @code{socket.sendmsg} with arguments @code{self}, @code{address}.


Added in version 3.3.



Changed in version 3.5: If the system call is interrupted and the signal handler does not raise
an exception, the method now retries the system call instead of raising
an @ref{f8e,,InterruptedError} exception (see 
@geindex Python Enhancement Proposals; PEP 475
PEP 475@footnote{https://peps.python.org/pep-0475/} for the rationale).

@end deffn

@geindex sendmsg_afalg() (socket.socket method)
@anchor{library/socket socket socket sendmsg_afalg}@anchor{ed9}
@deffn {Method} sendmsg_afalg ([msg], *, op[, iv[, assoclen[, flags]]])

Specialized version of @ref{6a2,,sendmsg()} for @ref{ed8,,AF_ALG} socket.
Set mode, IV, AEAD associated data length and flags for @code{AF_ALG} socket.

@ref{2181,,Availability}: Linux >= 2.6.38.


Added in version 3.6.

@end deffn

@geindex sendfile() (socket.socket method)
@anchor{library/socket socket socket sendfile}@anchor{1063}
@deffn {Method} sendfile (file, offset=0, count=None)

Send a file until EOF is reached by using high-performance
@ref{d0b,,os.sendfile} and return the total number of bytes which were sent.
`file' must be a regular file object opened in binary mode. If
@code{os.sendfile} is not available (e.g. Windows) or `file' is not a
regular file @ref{fad,,send()} will be used instead. `offset' tells from where to
start reading the file. If specified, `count' is the total number of bytes
to transmit as opposed to sending the file until EOF is reached. File
position is updated on return or also in case of error in which case
@ref{15b8,,file.tell()} can be used to figure out the number of
bytes which were sent. The socket must be of @ref{14ff,,SOCK_STREAM} type.
Non-blocking sockets are not supported.


Added in version 3.5.

@end deffn

@geindex set_inheritable() (socket.socket method)
@anchor{library/socket socket socket set_inheritable}@anchor{1108}
@deffn {Method} set_inheritable (inheritable)

Set the @ref{1102,,inheritable flag} of the socket’s file
descriptor or socket’s handle.


Added in version 3.4.

@end deffn

@geindex setblocking() (socket.socket method)
@anchor{library/socket socket socket setblocking}@anchor{30ac}
@deffn {Method} setblocking (flag)

Set blocking or non-blocking mode of the socket: if `flag' is false, the
socket is set to non-blocking, else to blocking mode.

This method is a shorthand for certain @ref{39d6,,settimeout()} calls:


@itemize *

@item 
@code{sock.setblocking(True)} is equivalent to @code{sock.settimeout(None)}

@item 
@code{sock.setblocking(False)} is equivalent to @code{sock.settimeout(0.0)}
@end itemize


Changed in version 3.7: The method no longer applies @ref{e0a,,SOCK_NONBLOCK} flag on
@ref{e0c,,socket.type}.

@end deffn

@geindex settimeout() (socket.socket method)
@anchor{library/socket socket socket settimeout}@anchor{39d6}
@deffn {Method} settimeout (value)

Set a timeout on blocking socket operations.  The `value' argument can be a
nonnegative real number expressing seconds, or @code{None}.
If a non-zero value is given, subsequent socket operations will raise a
@ref{a3b,,timeout} exception if the timeout period `value' has elapsed before
the operation has completed.  If zero is given, the socket is put in
non-blocking mode. If @code{None} is given, the socket is put in blocking mode.

For further information, please consult the @ref{3a26,,notes on socket timeouts}.


Changed in version 3.7: The method no longer toggles @ref{e0a,,SOCK_NONBLOCK} flag on
@ref{e0c,,socket.type}.

@end deffn

@geindex setsockopt() (socket.socket method)
@anchor{library/socket socket socket setsockopt}@anchor{ed7}
@deffn {Method} setsockopt (level, optname, value: int | Buffer)

@deffnx {Method} setsockopt (level, optname, None, optlen: int)

@geindex module; struct

Set the value of the given socket option (see the Unix manual page
@code{setsockopt(2)@footnote{https://manpages.debian.org/setsockopt(2)}}).  The needed symbolic constants are defined in this
module (SO_* etc. <socket-unix-constants>).  The value can be an integer,
@code{None} or a @ref{194,,bytes-like object} representing a buffer. In the latter
case it is up to the caller to ensure that the bytestring contains the
proper bits (see the optional built-in module @ref{db,,struct} for a way to
encode C structures as bytestrings). When `value' is set to @code{None},
`optlen' argument is required. It’s equivalent to calling @code{setsockopt()} C
function with @code{optval=NULL} and @code{optlen=optlen}.


Changed in version 3.5: Writable @ref{194,,bytes-like object} is now accepted.



Changed in version 3.6: setsockopt(level, optname, None, optlen: int) form added.


@ref{2181,,Availability}: not WASI.
@end deffn

@geindex shutdown() (socket.socket method)
@anchor{library/socket socket socket shutdown}@anchor{3a13}
@deffn {Method} shutdown (how)

Shut down one or both halves of the connection.  If `how' is @ref{3a10,,SHUT_RD},
further receives are disallowed.  If `how' is @ref{3a11,,SHUT_WR}, further sends
are disallowed.  If `how' is @ref{3a12,,SHUT_RDWR}, further sends and receives are
disallowed.

@ref{2181,,Availability}: not WASI.
@end deffn

@geindex share() (socket.socket method)
@anchor{library/socket socket socket share}@anchor{e08}
@deffn {Method} share (process_id)

Duplicate a socket and prepare it for sharing with a target process.  The
target process must be provided with `process_id'.  The resulting bytes object
can then be passed to the target process using some form of interprocess
communication and the socket can be recreated there using @ref{e07,,fromshare()}.
Once this method has been called, it is safe to close the socket since
the operating system has already duplicated it for the target process.

@ref{2181,,Availability}: Windows.


Added in version 3.3.

@end deffn

Note that there are no methods @code{read()} or @code{write()}; use
@ref{faa,,recv()} and @ref{fad,,send()} without `flags' argument instead.

Socket objects also have these (read-only) attributes that correspond to the
values given to the @code{socket} constructor.

@geindex family (socket.socket attribute)
@anchor{library/socket socket socket family}@anchor{3a27}
@deffn {Attribute} family

The socket family.
@end deffn

@geindex type (socket.socket attribute)
@anchor{library/socket socket socket type}@anchor{e0c}
@deffn {Attribute} type

The socket type.
@end deffn

@geindex proto (socket.socket attribute)
@anchor{library/socket socket socket proto}@anchor{3a28}
@deffn {Attribute} proto

The socket protocol.
@end deffn
@end deffn

@geindex SocketType (class in socket)
@anchor{library/socket socket SocketType}@anchor{3a29}
@deffn {Class} socket.SocketType

The base class of the @ref{fa7,,socket} type, re-exported from
@code{_socket}.  An instance check such as
@code{isinstance(socket(...), SocketType)} is true, but @code{SocketType} is not
the same as @code{type(socket(...))}, which is @code{socket} itself.
@end deffn

@node Notes on socket timeouts,Example<7>,Socket Objects,socket — Low-level networking interface
@anchor{library/socket notes-on-socket-timeouts}@anchor{3a2a}@anchor{library/socket socket-timeouts}@anchor{3a26}
@subsubsection Notes on socket timeouts


A socket object can be in one of three modes: blocking, non-blocking, or
timeout.  Sockets are by default always created in blocking mode, but this
can be changed by calling @ref{39da,,setdefaulttimeout()}.


@itemize *

@item 
In `blocking mode', operations block until complete or the system returns
an error (such as connection timed out).

@item 
In `non-blocking mode', operations fail (with an error that is unfortunately
system-dependent) if they cannot be completed immediately: functions from the
@ref{c6,,select} module can be used to know when and whether a socket is available
for reading or writing.

@item 
In `timeout mode', operations fail if they cannot be completed within the
timeout specified for the socket (they raise a @ref{a3b,,timeout} exception)
or if the system returns an error.
@end itemize

@cartouche
@quotation Note 
At the operating system level, sockets in `timeout mode' are internally set
in non-blocking mode.  Also, the blocking and timeout modes are shared between
file descriptors and socket objects that refer to the same network endpoint.
This implementation detail can have visible consequences if e.g. you decide
to use the @ref{3a23,,fileno()} of a socket.
@end quotation
@end cartouche

@menu
* Timeouts and the connect method:: 
* Timeouts and the accept method:: 

@end menu

@node Timeouts and the connect method,Timeouts and the accept method,,Notes on socket timeouts
@anchor{library/socket timeouts-and-the-connect-method}@anchor{3a2b}
@subsubsection Timeouts and the @code{connect} method


The @ref{fa9,,connect()} operation is also subject to the timeout
setting, and in general it is recommended to call @ref{39d6,,settimeout()}
before calling @code{connect()} or pass a timeout parameter to
@ref{884,,create_connection()}.  However, the system network stack may also
return a connection timeout error of its own regardless of any Python socket
timeout setting.

@node Timeouts and the accept method,,Timeouts and the connect method,Notes on socket timeouts
@anchor{library/socket timeouts-and-the-accept-method}@anchor{3a2c}
@subsubsection Timeouts and the @code{accept} method


If @ref{3a17,,getdefaulttimeout()} is not @ref{887,,None}, sockets returned by
the @ref{fa8,,accept()} method inherit that timeout.  Otherwise, the
behaviour depends on settings of the listening socket:


@itemize *

@item 
if the listening socket is in `blocking mode' or in `timeout mode',
the socket returned by @ref{fa8,,accept()} is in `blocking mode';

@item 
if the listening socket is in `non-blocking mode', whether the socket
returned by @ref{fa8,,accept()} is in blocking or non-blocking mode
is operating system-dependent.  If you want to ensure cross-platform
behaviour, it is recommended you manually override this setting.
@end itemize

@node Example<7>,,Notes on socket timeouts,socket — Low-level networking interface
@anchor{library/socket example}@anchor{3a2d}@anchor{library/socket socket-example}@anchor{3a2e}
@subsubsection Example


Here are four minimal example programs using the TCP/IP protocol: a server that
echoes all data that it receives back (servicing only one client), and a client
using it.  Note that a server must perform the sequence @ref{fa7,,socket()},
@ref{1746,,bind()}, @ref{1064,,listen()}, @ref{fa8,,accept()} (possibly
repeating the @code{accept()} to service more than one client), while a
client only needs the sequence @code{socket()}, @ref{fa9,,connect()}.  Also
note that the server does not @ref{fae,,sendall()}/@ref{faa,,recv()} on
the socket it is listening on but on the new socket returned by
@code{accept()}.

The first two examples support IPv4 only.

@example
# Echo server program
import socket

HOST = '@w{'}                 # Symbolic name meaning all available interfaces
PORT = 50007              # Arbitrary non-privileged port
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen(1)
    conn, addr = s.accept()
    with conn:
        print('Connected by', addr)
        while True:
            data = conn.recv(1024)
            if not data: break
            conn.sendall(data)
@end example

@example
# Echo client program
import socket

HOST = 'daring.cwi.nl'    # The remote host
PORT = 50007              # The same port as used by the server
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect((HOST, PORT))
    s.sendall(b'Hello, world')
    data = s.recv(1024)
print('Received', repr(data))
@end example

The next two examples are identical to the above two, but support both IPv4 and
IPv6. The server side will listen to the first address family available (it
should listen to both instead). On most of IPv6-ready systems, IPv6 will take
precedence and the server may not accept IPv4 traffic. The client side will try
to connect to all the addresses returned as a result of the name resolution, and
sends traffic to the first one connected successfully.

@example
# Echo server program
import socket
import sys

HOST = None               # Symbolic name meaning all available interfaces
PORT = 50007              # Arbitrary non-privileged port
s = None
for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC,
                              socket.SOCK_STREAM, 0, socket.AI_PASSIVE):
    af, socktype, proto, canonname, sa = res
    try:
        s = socket.socket(af, socktype, proto)
    except OSError as msg:
        s = None
        continue
    try:
        s.bind(sa)
        s.listen(1)
    except OSError as msg:
        s.close()
        s = None
        continue
    break
if s is None:
    print('could not open socket')
    sys.exit(1)
conn, addr = s.accept()
with conn:
    print('Connected by', addr)
    while True:
        data = conn.recv(1024)
        if not data: break
        conn.send(data)
@end example

@example
# Echo client program
import socket
import sys

HOST = 'daring.cwi.nl'    # The remote host
PORT = 50007              # The same port as used by the server
s = None
for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC, socket.SOCK_STREAM):
    af, socktype, proto, canonname, sa = res
    try:
        s = socket.socket(af, socktype, proto)
    except OSError as msg:
        s = None
        continue
    try:
        s.connect(sa)
    except OSError as msg:
        s.close()
        s = None
        continue
    break
if s is None:
    print('could not open socket')
    sys.exit(1)
with s:
    s.sendall(b'Hello, world')
    data = s.recv(1024)
print('Received', repr(data))
@end example

The next example shows how to write a very simple network sniffer with raw
sockets on Windows. The example requires administrator privileges to modify
the interface:

@example
import socket

# the public network interface
HOST = socket.gethostbyname(socket.gethostname())

# create a raw socket and bind it to the public interface
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)
s.bind((HOST, 0))

# Include IP headers
s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)

# receive all packets
s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)

# receive a packet
print(s.recvfrom(65565))

# disabled promiscuous mode
s.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)
@end example

The next example shows how to use the socket interface to communicate to a CAN
network using the raw socket protocol. To use CAN with the broadcast
manager protocol instead, open a socket with:

@example
socket.socket(socket.AF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
@end example

After binding (@code{CAN_RAW}) or connecting (@ref{11a9,,CAN_BCM}) the socket, you
can use the @ref{fad,,socket.send()} and @ref{faa,,socket.recv()} operations (and
their counterparts) on the socket object as usual.

This last example might require special privileges:

@example
import socket
import struct


# CAN frame packing/unpacking (see 'struct can_frame' in <linux/can.h>)

can_frame_fmt = "=IB3x8s"
can_frame_size = struct.calcsize(can_frame_fmt)

def build_can_frame(can_id, data):
    can_dlc = len(data)
    data = data.ljust(8, b'\x00')
    return struct.pack(can_frame_fmt, can_id, can_dlc, data)

def dissect_can_frame(frame):
    can_id, can_dlc, data = struct.unpack(can_frame_fmt, frame)
    return (can_id, can_dlc, data[:can_dlc])


# create a raw socket and bind it to the 'vcan0' interface
s = socket.socket(socket.AF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
s.bind(('vcan0',))

while True:
    cf, addr = s.recvfrom(can_frame_size)

    print('Received: can_id=%x, can_dlc=%x, data=%s' % dissect_can_frame(cf))

    try:
        s.send(cf)
    except OSError:
        print('Error sending CAN frame')

    try:
        s.send(build_can_frame(0x01, b'\x01\x02\x03'))
    except OSError:
        print('Error sending CAN frame')
@end example

Running an example several times with too small delay between executions, could
lead to this error:

@example
OSError: [Errno 98] Address already in use
@end example

This is because the previous execution has left the socket in a @code{TIME_WAIT}
state, and can’t be immediately reused.

There is a @code{socket} flag to set, in order to prevent this,
@code{socket.SO_REUSEADDR}:

@example
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((HOST, PORT))
@end example

the @code{SO_REUSEADDR} flag tells the kernel to reuse a local socket in
@code{TIME_WAIT} state, without waiting for its natural timeout to expire.


@subsubheading See also


For an introduction to socket programming (in C), see the following papers:


@itemize -

@item 
`An Introductory 4.3BSD Interprocess Communication Tutorial', by Stuart Sechrest

@item 
`An Advanced 4.3BSD Interprocess Communication Tutorial', by Samuel J.  Leffler et
al,
@end itemize

both in the UNIX Programmer’s Manual, Supplementary Documents 1 (sections
PS1:7 and PS1:8).  The platform-specific reference material for the various
socket-related system calls are also a valuable source of information on the
details of socket semantics.  For Unix, refer to the manual pages; for Windows,
see the WinSock (or Winsock 2) specification.  For IPv6-ready APIs, readers may
want to refer to 
@geindex RFC; RFC 3493
RFC 3493@footnote{https://datatracker.ietf.org/doc/html/rfc3493.html} titled Basic Socket Interface Extensions for IPv6.


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node ssl — TLS/SSL wrapper for socket objects,select — Waiting for I/O completion,socket — Low-level networking interface,Networking and Interprocess Communication
@anchor{library/ssl doc}@anchor{3a2f}@anchor{library/ssl module-ssl}@anchor{d5}@anchor{library/ssl ssl-tls-ssl-wrapper-for-socket-objects}@anchor{3a30}@anchor{library/ssl translation-repo}@anchor{3a31}
@subsection @code{ssl} — TLS/SSL wrapper for socket objects


@geindex module; ssl

`Source code:' Lib/ssl.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/ssl.py}

@geindex OpenSSL; (use in module ssl)

@geindex TLS
@geindex SSL
@geindex Transport Layer Security
@geindex Secure Sockets Layer


__________________________________________________________________


This module provides access to Transport Layer Security (often known as “Secure
Sockets Layer”) encryption and peer authentication facilities for network
sockets, both client-side and server-side.  This module uses the OpenSSL
library.

This is an @ref{219c,,optional module}.
If it is missing from your copy of CPython,
look for documentation from your distributor (that is,
whoever provided Python to you).
If you are the distributor, see @ref{219a,,Requirements for optional modules}.

@c Similar notes appear in the docs of the modules:
@c - zipfile
@c - tarfile

@cartouche
@quotation Note 
Some behavior may be platform dependent, since calls are made to the
operating system socket APIs.  The installed version of OpenSSL may also
cause variations in behavior. For example, TLSv1.3 comes with OpenSSL version
1.1.1.
@end quotation
@end cartouche

@cartouche
@quotation Warning 
Don’t use this module without reading the @ref{390d,,Security considerations}.  Doing so
may lead to a false sense of security, as the default settings of the
ssl module are not necessarily appropriate for your application.
@end quotation
@end cartouche

@c include for modules that don't work on WASM

@ref{2181,,Availability}: not WASI.

This module does not work or is not available on WebAssembly. See
@ref{1bae,,WebAssembly platforms} for more information.

This section documents the objects and functions in the @code{ssl} module; for more
general information about TLS, SSL, and certificates, the reader is referred to
the documents in the “See Also” section at the bottom.

This module provides a class, @ref{aed,,ssl.SSLSocket}, which is derived from the
@ref{fa7,,socket.socket} type, and provides a socket-like wrapper that also
encrypts and decrypts the data going over the socket with SSL.  It supports
additional methods such as @code{getpeercert()}, which retrieves the
certificate of the other side of the connection, @code{cipher()}, which
retrieves the cipher being used for the secure connection or
@code{get_verified_chain()}, @code{get_unverified_chain()} which retrieves
certificate chain.

For more sophisticated applications, the @ref{355,,ssl.SSLContext} class
helps manage settings and certificates, which can then be inherited
by SSL sockets created through the @ref{749,,SSLContext.wrap_socket()} method.


Changed in version 3.5.3: Updated to support linking with OpenSSL 1.1.0



Changed in version 3.6: OpenSSL 0.9.8, 1.0.0 and 1.0.1 are deprecated and no longer supported.
In the future the ssl module will require at least OpenSSL 1.0.2 or
1.1.0.



Changed in version 3.10: 
@geindex Python Enhancement Proposals; PEP 644
PEP 644@footnote{https://peps.python.org/pep-0644/} has been implemented. The ssl module requires OpenSSL 1.1.1
or newer.

Use of deprecated constants and functions result in deprecation warnings.


@menu
* Functions@comma{} constants@comma{} and exceptions: Functions constants and exceptions. 
* SSL sockets:: 
* SSL contexts:: 
* Certificates:: 
* Examples: Examples<21>. 
* Notes on non-blocking sockets:: 
* Memory BIO support:: 
* SSL session:: 
* Security considerations: Security considerations<2>. 
* TLS 1.3: TLS 1 3. 

@end menu

@node Functions constants and exceptions,SSL sockets,,ssl — TLS/SSL wrapper for socket objects
@anchor{library/ssl functions-constants-and-exceptions}@anchor{3a32}
@subsubsection Functions, constants, and exceptions


@menu
* Socket creation:: 
* Context creation:: 
* Exceptions: Exceptions<19>. 
* Random generation:: 
* Certificate handling:: 
* Constants: Constants<9>. 

@end menu

@node Socket creation,Context creation,,Functions constants and exceptions
@anchor{library/ssl socket-creation}@anchor{3a33}
@subsubsection Socket creation


Instances of @ref{aed,,SSLSocket} must be created using the
@ref{749,,SSLContext.wrap_socket()} method. The helper function
@ref{480,,create_default_context()} returns a new context with secure default
settings.

Client socket example with default context and IPv4/IPv6 dual stack:

@example
import socket
import ssl

hostname = 'www.python.org'
context = ssl.create_default_context()

with socket.create_connection((hostname, 443)) as sock:
    with context.wrap_socket(sock, server_hostname=hostname) as ssock:
        print(ssock.version())
@end example

Client socket example with custom context and IPv4:

@example
hostname = 'www.python.org'
# PROTOCOL_TLS_CLIENT requires valid cert chain and hostname
context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
context.load_verify_locations('path/to/cabundle.pem')

with socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) as sock:
    with context.wrap_socket(sock, server_hostname=hostname) as ssock:
        print(ssock.version())
@end example

Server socket example listening on localhost IPv4:

@example
context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
context.load_cert_chain('/path/to/certchain.pem', '/path/to/private.key')

with socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) as sock:
    sock.bind(('127.0.0.1', 8443))
    sock.listen(5)
    with context.wrap_socket(sock, server_side=True) as ssock:
        conn, addr = ssock.accept()
        ...
@end example

@node Context creation,Exceptions<19>,Socket creation,Functions constants and exceptions
@anchor{library/ssl context-creation}@anchor{3a34}
@subsubsection Context creation


A convenience function helps create @ref{355,,SSLContext} objects for common
purposes.

@geindex create_default_context() (in module ssl)
@anchor{library/ssl ssl create_default_context}@anchor{480}
@deffn {Function} ssl.create_default_context (purpose=Purpose.SERVER_AUTH, *, cafile=None, capath=None, cadata=None)

Return a new @ref{355,,SSLContext} object with default settings for
the given `purpose'.  The settings are chosen by the @code{ssl} module,
and usually represent a higher security level than when calling the
@code{SSLContext} constructor directly.

`cafile', `capath', `cadata' represent optional CA certificates to
trust for certificate verification, as in
@ref{10f4,,SSLContext.load_verify_locations()}.  If all three are
@ref{887,,None}, this function can choose to trust the system’s default
CA certificates instead.

The settings are: @ref{a78,,PROTOCOL_TLS_CLIENT} or
@ref{a79,,PROTOCOL_TLS_SERVER}, @ref{a40,,OP_NO_SSLv2}, and @ref{a41,,OP_NO_SSLv3}
with high encryption cipher suites without RC4 and
without unauthenticated cipher suites. Passing @ref{11b9,,SERVER_AUTH}
as `purpose' sets @ref{3a35,,verify_mode} to @ref{3a36,,CERT_REQUIRED}
and either loads CA certificates (when at least one of `cafile', `capath' or
`cadata' is given) or uses @ref{11b8,,SSLContext.load_default_certs()} to load
default CA certificates.

When @ref{3a37,,keylog_filename} is supported and the environment
variable 
@geindex SSLKEYLOGFILE
@geindex environment variable; SSLKEYLOGFILE
@code{SSLKEYLOGFILE} is set, @code{create_default_context()}
enables key logging.

The default settings for this context include
@ref{481,,VERIFY_X509_PARTIAL_CHAIN} and @ref{482,,VERIFY_X509_STRICT}.
These make the underlying OpenSSL implementation behave more like
a conforming implementation of 
@geindex RFC; RFC 5280
RFC 5280@footnote{https://datatracker.ietf.org/doc/html/rfc5280.html}, in exchange for a small
amount of incompatibility with older X.509 certificates.

@cartouche
@quotation Note 
The protocol, options, cipher and other settings may change to more
restrictive values anytime without prior deprecation.  The values
represent a fair balance between compatibility and security.

If your application needs specific settings, you should create a
@ref{355,,SSLContext} and apply the settings yourself.
@end quotation
@end cartouche

@cartouche
@quotation Note 
If you find that when certain older clients or servers attempt to connect
with a @ref{355,,SSLContext} created by this function that they get an error
stating “Protocol or cipher suite mismatch”, it may be that they only
support SSL3.0 which this function excludes using the
@ref{a41,,OP_NO_SSLv3}. SSL3.0 is widely considered to be completely broken@footnote{https://en.wikipedia.org/wiki/POODLE}. If you still wish to continue to
use this function but still allow SSL 3.0 connections you can re-enable
them using:

@example
ctx = ssl.create_default_context(Purpose.CLIENT_AUTH)
ctx.options &= ~ssl.OP_NO_SSLv3
@end example
@end quotation
@end cartouche

@cartouche
@quotation Note 
This context enables @ref{482,,VERIFY_X509_STRICT} by default, which
may reject pre-
@geindex RFC; RFC 5280
RFC 5280@footnote{https://datatracker.ietf.org/doc/html/rfc5280.html} or malformed certificates that the
underlying OpenSSL implementation otherwise would accept. While disabling
this is not recommended, you can do so using:

@example
ctx = ssl.create_default_context()
ctx.verify_flags &= ~ssl.VERIFY_X509_STRICT
@end example
@end quotation
@end cartouche


Added in version 3.4.



Changed in version 3.4.4: RC4 was dropped from the default cipher string.



Changed in version 3.6: ChaCha20/Poly1305 was added to the default cipher string.

3DES was dropped from the default cipher string.



Changed in version 3.8: Support for key logging to 
@geindex SSLKEYLOGFILE
@geindex environment variable; SSLKEYLOGFILE
@code{SSLKEYLOGFILE} was added.



Changed in version 3.10: The context now uses @ref{a78,,PROTOCOL_TLS_CLIENT} or
@ref{a79,,PROTOCOL_TLS_SERVER} protocol instead of generic
@ref{3a38,,PROTOCOL_TLS}.



Changed in version 3.13: The context now uses @ref{481,,VERIFY_X509_PARTIAL_CHAIN} and
@ref{482,,VERIFY_X509_STRICT} in its default verify flags.

@end deffn

@node Exceptions<19>,Random generation,Context creation,Functions constants and exceptions
@anchor{library/ssl exceptions}@anchor{3a39}
@subsubsection Exceptions


@geindex SSLError
@anchor{library/ssl ssl SSLError}@anchor{1485}
@deffn {Exception} ssl.SSLError

Raised to signal an error from the underlying SSL implementation
(currently provided by the OpenSSL library).  This signifies some
problem in the higher-level encryption and authentication layer that’s
superimposed on the underlying network connection.  This error
is a subtype of @ref{2c2,,OSError}.  The error code and message of
@code{SSLError} instances are provided by the OpenSSL library.


Changed in version 3.3: @code{SSLError} used to be a subtype of @ref{125c,,socket.error}.


@geindex library (ssl.SSLError attribute)
@anchor{library/ssl ssl SSLError library}@anchor{1353}
@deffn {Attribute} library

A string mnemonic designating the OpenSSL submodule in which the error
occurred, such as @code{SSL}, @code{PEM} or @code{X509}.  The range of possible
values depends on the OpenSSL version.


Added in version 3.3.

@end deffn

@geindex reason (ssl.SSLError attribute)
@anchor{library/ssl ssl SSLError reason}@anchor{1354}
@deffn {Attribute} reason

A string mnemonic designating the reason this error occurred, for
example @code{CERTIFICATE_VERIFY_FAILED}.  The range of possible
values depends on the OpenSSL version.


Added in version 3.3.

@end deffn
@end deffn

@geindex SSLZeroReturnError
@anchor{library/ssl ssl SSLZeroReturnError}@anchor{3a3a}
@deffn {Exception} ssl.SSLZeroReturnError

A subclass of @ref{1485,,SSLError} raised when trying to read or write and
the SSL connection has been closed cleanly.  Note that this doesn’t
mean that the underlying transport (read TCP) has been closed.


Added in version 3.3.

@end deffn

@geindex SSLWantReadError
@anchor{library/ssl ssl SSLWantReadError}@anchor{106f}
@deffn {Exception} ssl.SSLWantReadError

A subclass of @ref{1485,,SSLError} raised by a @ref{3a3b,,non-blocking SSL socket} when trying to read or write data, but more data needs
to be received on the underlying TCP transport before the request can be
fulfilled.


Added in version 3.3.

@end deffn

@geindex SSLWantWriteError
@anchor{library/ssl ssl SSLWantWriteError}@anchor{1070}
@deffn {Exception} ssl.SSLWantWriteError

A subclass of @ref{1485,,SSLError} raised by a @ref{3a3b,,non-blocking SSL socket} when trying to read or write data, but more data needs
to be sent on the underlying TCP transport before the request can be
fulfilled.


Added in version 3.3.

@end deffn

@geindex SSLSyscallError
@anchor{library/ssl ssl SSLSyscallError}@anchor{3a3c}
@deffn {Exception} ssl.SSLSyscallError

A subclass of @ref{1485,,SSLError} raised when a system error was encountered
while trying to fulfill an operation on a SSL socket.  Unfortunately,
there is no easy way to inspect the original errno number.


Added in version 3.3.

@end deffn

@geindex SSLEOFError
@anchor{library/ssl ssl SSLEOFError}@anchor{1aff}
@deffn {Exception} ssl.SSLEOFError

A subclass of @ref{1485,,SSLError} raised when the SSL connection has been
terminated abruptly.  Generally, you shouldn’t try to reuse the underlying
transport when this error is encountered.


Added in version 3.3.

@end deffn

@geindex SSLCertVerificationError
@anchor{library/ssl ssl SSLCertVerificationError}@anchor{d7b}
@deffn {Exception} ssl.SSLCertVerificationError

A subclass of @ref{1485,,SSLError} raised when certificate validation has
failed.


Added in version 3.7.


@geindex verify_code (ssl.SSLCertVerificationError attribute)
@anchor{library/ssl ssl SSLCertVerificationError verify_code}@anchor{3a3d}
@deffn {Attribute} verify_code

A numeric error number that denotes the verification error.
@end deffn

@geindex verify_message (ssl.SSLCertVerificationError attribute)
@anchor{library/ssl ssl SSLCertVerificationError verify_message}@anchor{3a3e}
@deffn {Attribute} verify_message

A human readable string of the verification error.
@end deffn
@end deffn

@geindex CertificateError
@anchor{library/ssl ssl CertificateError}@anchor{3a3f}
@deffn {Exception} ssl.CertificateError

An alias for @ref{d7b,,SSLCertVerificationError}.


Changed in version 3.7: The exception is now an alias for @ref{d7b,,SSLCertVerificationError}.

@end deffn

@node Random generation,Certificate handling,Exceptions<19>,Functions constants and exceptions
@anchor{library/ssl random-generation}@anchor{3a40}
@subsubsection Random generation


@geindex RAND_bytes() (in module ssl)
@anchor{library/ssl ssl RAND_bytes}@anchor{748}
@deffn {Function} ssl.RAND_bytes (num, /)

Return `num' cryptographically strong pseudo-random bytes. Raises an
@ref{1485,,SSLError} if the PRNG has not been seeded with enough data or if the
operation is not supported by the current RAND method. @ref{1cc0,,RAND_status()}
can be used to check the status of the PRNG and @ref{3a41,,RAND_add()} can be used
to seed the PRNG.

For almost all applications @ref{747,,os.urandom()} is preferable.

Read the Wikipedia article, Cryptographically secure pseudorandom number generator (CSPRNG)@footnote{https://en.wikipedia.org/wiki/Cryptographically_secure_pseudorandom_number_generator},
to get the requirements of a cryptographically strong generator.


Added in version 3.3.

@end deffn

@geindex RAND_status() (in module ssl)
@anchor{library/ssl ssl RAND_status}@anchor{1cc0}
@deffn {Function} ssl.RAND_status ()

Return @code{True} if the SSL pseudo-random number generator has been seeded
with ‘enough’ randomness, and @code{False} otherwise.  You can use
@code{ssl.RAND_egd()} and @ref{3a41,,ssl.RAND_add()} to increase the randomness of
the pseudo-random number generator.
@end deffn

@geindex RAND_add() (in module ssl)
@anchor{library/ssl ssl RAND_add}@anchor{3a41}
@deffn {Function} ssl.RAND_add (bytes, entropy, /)

Mix the given `bytes' into the SSL pseudo-random number generator.  The
parameter `entropy' (a float) is a lower bound on the entropy contained in
string (so you can always use @code{0.0}).  See 
@geindex RFC; RFC 1750
RFC 1750@footnote{https://datatracker.ietf.org/doc/html/rfc1750.html} for more
information on sources of entropy.


Changed in version 3.5: Writable @ref{194,,bytes-like object} is now accepted.

@end deffn

@node Certificate handling,Constants<9>,Random generation,Functions constants and exceptions
@anchor{library/ssl certificate-handling}@anchor{3a42}
@subsubsection Certificate handling


@c import ssl

@geindex cert_time_to_seconds() (in module ssl)
@anchor{library/ssl ssl cert_time_to_seconds}@anchor{1071}
@deffn {Function} ssl.cert_time_to_seconds (cert_time)

Return the time in seconds since the epoch, given the @code{cert_time}
string representing the “notBefore” or “notAfter” date from a
certificate in @code{"%b %d %H:%M:%S %Y %Z"} strptime format (C
locale).

Here’s an example:

@example
>>> import ssl
>>> import datetime as dt
>>> timestamp = ssl.cert_time_to_seconds("Jan  5 09:34:43 2018 GMT")
>>> timestamp
1515144883
>>> print(dt.datetime.fromtimestamp(timestamp, dt.UTC))
2018-01-05 09:34:43+00:00
@end example

“notBefore” or “notAfter” dates must use GMT (
@geindex RFC; RFC 5280
RFC 5280@footnote{https://datatracker.ietf.org/doc/html/rfc5280.html}).


Changed in version 3.5: Interpret the input time as a time in UTC as specified by ‘GMT’
timezone in the input string. Local timezone was used
previously. Return an integer (no fractions of a second in the
input format)

@end deffn

@geindex get_server_certificate() (in module ssl)
@anchor{library/ssl ssl get_server_certificate}@anchor{a43}
@deffn {Function} ssl.get_server_certificate (addr, ssl_version=PROTOCOL_TLS_CLIENT, ca_certs=None[, timeout])

Given the address @code{addr} of an SSL-protected server, as a (`hostname',
`port-number') pair, fetches the server’s certificate, and returns it as a
PEM-encoded string.  If @code{ssl_version} is specified, uses that version of
the SSL protocol to attempt to connect to the server.  If `ca_certs' is
specified, it should be a file containing a list of root certificates, the
same format as used for the `cafile' parameter in
@ref{10f4,,SSLContext.load_verify_locations()}.  The call will attempt to validate the
server certificate against that set of root certificates, and will fail
if the validation attempt fails.  A timeout can be specified with the
@code{timeout} parameter.


Changed in version 3.3: This function is now IPv6-compatible.



Changed in version 3.5: The default `ssl_version' is changed from @ref{3a43,,PROTOCOL_SSLv3} to
@ref{3a38,,PROTOCOL_TLS} for maximum compatibility with modern servers.



Changed in version 3.10: The `timeout' parameter was added.

@end deffn

@geindex DER_cert_to_PEM_cert() (in module ssl)
@anchor{library/ssl ssl DER_cert_to_PEM_cert}@anchor{3a44}
@deffn {Function} ssl.DER_cert_to_PEM_cert (der_cert_bytes)

Given a certificate as a DER-encoded blob of bytes, returns a PEM-encoded
string version of the same certificate.
@end deffn

@geindex PEM_cert_to_DER_cert() (in module ssl)
@anchor{library/ssl ssl PEM_cert_to_DER_cert}@anchor{3a45}
@deffn {Function} ssl.PEM_cert_to_DER_cert (pem_cert_string)

Given a certificate as an ASCII PEM string, returns a DER-encoded sequence of
bytes for that same certificate.
@end deffn

@geindex get_default_verify_paths() (in module ssl)
@anchor{library/ssl ssl get_default_verify_paths}@anchor{11b0}
@deffn {Function} ssl.get_default_verify_paths ()

Returns a named tuple with paths to OpenSSL’s default cafile and capath.
The paths are the same as used by
@ref{11b1,,SSLContext.set_default_verify_paths()}. The return value is a
@ref{85f,,named tuple} @code{DefaultVerifyPaths}:


@itemize *

@item 
@code{cafile} - resolved path to cafile or @code{None} if the file doesn’t exist,

@item 
@code{capath} - resolved path to capath or @code{None} if the directory doesn’t exist,

@item 
@code{openssl_cafile_env} - OpenSSL’s environment key that points to a cafile,

@item 
@code{openssl_cafile} - hard coded path to a cafile,

@item 
@code{openssl_capath_env} - OpenSSL’s environment key that points to a capath,

@item 
@code{openssl_capath} - hard coded path to a capath directory
@end itemize


Added in version 3.4.

@end deffn

@geindex enum_certificates() (in module ssl)
@anchor{library/ssl ssl enum_certificates}@anchor{11bb}
@deffn {Function} ssl.enum_certificates (store_name)

Retrieve certificates from Windows’ system cert store. `store_name' may be
one of @code{CA}, @code{ROOT} or @code{MY}. Windows may provide additional cert
stores, too.

The function returns a list of (cert_bytes, encoding_type, trust) tuples.
The encoding_type specifies the encoding of cert_bytes. It is either
@code{x509_asn} for X.509 ASN.1 data or @code{pkcs_7_asn} for
PKCS#7 ASN.1 data. Trust specifies the purpose of the certificate as a set
of OIDS or exactly @code{True} if the certificate is trustworthy for all
purposes.

Example:

@example
>>> ssl.enum_certificates("CA")
[(b'data...', 'x509_asn', @{'1.3.6.1.5.5.7.3.1', '1.3.6.1.5.5.7.3.2'@}),
 (b'data...', 'x509_asn', True)]
@end example

@ref{2181,,Availability}: Windows.


Added in version 3.4.

@end deffn

@geindex enum_crls() (in module ssl)
@anchor{library/ssl ssl enum_crls}@anchor{11bc}
@deffn {Function} ssl.enum_crls (store_name)

Retrieve CRLs from Windows’ system cert store. `store_name' may be
one of @code{CA}, @code{ROOT} or @code{MY}. Windows may provide additional cert
stores, too.

The function returns a list of (cert_bytes, encoding_type, trust) tuples.
The encoding_type specifies the encoding of cert_bytes. It is either
@code{x509_asn} for X.509 ASN.1 data or @code{pkcs_7_asn} for
PKCS#7 ASN.1 data.

@ref{2181,,Availability}: Windows.


Added in version 3.4.

@end deffn

@node Constants<9>,,Certificate handling,Functions constants and exceptions
@anchor{library/ssl constants}@anchor{3a46}
@subsubsection Constants


@quotation

All constants are now @ref{ee1,,enum.IntEnum} or @ref{ea0,,enum.IntFlag} collections.


Added in version 3.6.

@end quotation

@geindex CERT_NONE (in module ssl)
@anchor{library/ssl ssl CERT_NONE}@anchor{3a47}
@deffn {Data} ssl.CERT_NONE

Possible value for @ref{3a35,,SSLContext.verify_mode}.
Except for @ref{a78,,PROTOCOL_TLS_CLIENT},
it is the default mode.  With client-side sockets, just about any
cert is accepted.  Validation errors, such as untrusted or expired cert,
are ignored and do not abort the TLS/SSL handshake.

In server mode, no certificate is requested from the client, so the client
does not send any for client cert authentication.

See the discussion of @ref{390d,,Security considerations} below.
@end deffn

@geindex CERT_OPTIONAL (in module ssl)
@anchor{library/ssl ssl CERT_OPTIONAL}@anchor{3a48}
@deffn {Data} ssl.CERT_OPTIONAL

Possible value for @ref{3a35,,SSLContext.verify_mode}.
In client mode, @ref{3a48,,CERT_OPTIONAL}
has the same meaning as @ref{3a36,,CERT_REQUIRED}. It is recommended to
use @code{CERT_REQUIRED} for client-side sockets instead.

In server mode, a client certificate request is sent to the client.  The
client may either ignore the request or send a certificate in order
perform TLS client cert authentication.  If the client chooses to send
a certificate, it is verified.  Any verification error immediately aborts
the TLS handshake.

Use of this setting requires a valid set of CA certificates to
be passed to @ref{10f4,,SSLContext.load_verify_locations()}.
@end deffn

@geindex CERT_REQUIRED (in module ssl)
@anchor{library/ssl ssl CERT_REQUIRED}@anchor{3a36}
@deffn {Data} ssl.CERT_REQUIRED

Possible value for @ref{3a35,,SSLContext.verify_mode}.
In this mode, certificates are
required from the other side of the socket connection; an @ref{1485,,SSLError}
will be raised if no certificate is provided, or if its validation fails.
This mode is `not' sufficient to verify a certificate in client mode as
it does not match hostnames.  @ref{3a49,,check_hostname} must be
enabled as well to verify the authenticity of a cert.
@ref{a78,,PROTOCOL_TLS_CLIENT} uses @ref{3a36,,CERT_REQUIRED} and
enables @code{check_hostname} by default.

With server socket, this mode provides mandatory TLS client cert
authentication.  A client certificate request is sent to the client and
the client must provide a valid and trusted certificate.

Use of this setting requires a valid set of CA certificates to
be passed to @ref{10f4,,SSLContext.load_verify_locations()}.
@end deffn

@geindex VerifyMode (class in ssl)
@anchor{library/ssl ssl VerifyMode}@anchor{3a4a}
@deffn {Class} ssl.VerifyMode

@ref{ee1,,enum.IntEnum} collection of CERT_* constants.


Added in version 3.6.

@end deffn

@geindex VERIFY_DEFAULT (in module ssl)
@anchor{library/ssl ssl VERIFY_DEFAULT}@anchor{11b5}
@deffn {Data} ssl.VERIFY_DEFAULT

Possible value for @ref{11b4,,SSLContext.verify_flags}. In this mode, certificate
revocation lists (CRLs) are not checked. By default OpenSSL does neither
require nor verify CRLs.


Added in version 3.4.

@end deffn

@geindex VERIFY_CRL_CHECK_LEAF (in module ssl)
@anchor{library/ssl ssl VERIFY_CRL_CHECK_LEAF}@anchor{11b6}
@deffn {Data} ssl.VERIFY_CRL_CHECK_LEAF

Possible value for @ref{11b4,,SSLContext.verify_flags}. In this mode, only the
peer cert is checked but none of the intermediate CA certificates. The mode
requires a valid CRL that is signed by the peer cert’s issuer (its direct
ancestor CA). If no proper CRL has been loaded with
@ref{10f4,,SSLContext.load_verify_locations}, validation will fail.


Added in version 3.4.

@end deffn

@geindex VERIFY_CRL_CHECK_CHAIN (in module ssl)
@anchor{library/ssl ssl VERIFY_CRL_CHECK_CHAIN}@anchor{11b7}
@deffn {Data} ssl.VERIFY_CRL_CHECK_CHAIN

Possible value for @ref{11b4,,SSLContext.verify_flags}. In this mode, CRLs of
all certificates in the peer cert chain are checked.


Added in version 3.4.

@end deffn

@geindex VERIFY_X509_STRICT (in module ssl)
@anchor{library/ssl ssl VERIFY_X509_STRICT}@anchor{482}
@deffn {Data} ssl.VERIFY_X509_STRICT

Possible value for @ref{11b4,,SSLContext.verify_flags} to disable workarounds
for broken X.509 certificates.


Added in version 3.4.

@end deffn

@geindex VERIFY_ALLOW_PROXY_CERTS (in module ssl)
@anchor{library/ssl ssl VERIFY_ALLOW_PROXY_CERTS}@anchor{1cd6}
@deffn {Data} ssl.VERIFY_ALLOW_PROXY_CERTS

Possible value for @ref{11b4,,SSLContext.verify_flags} to enables proxy
certificate verification.


Added in version 3.10.

@end deffn

@geindex VERIFY_X509_TRUSTED_FIRST (in module ssl)
@anchor{library/ssl ssl VERIFY_X509_TRUSTED_FIRST}@anchor{3a4b}
@deffn {Data} ssl.VERIFY_X509_TRUSTED_FIRST

Possible value for @ref{11b4,,SSLContext.verify_flags}. It instructs OpenSSL to
prefer trusted certificates when building the trust chain to validate a
certificate. This flag is enabled by default.


Added in version 3.4.4.

@end deffn

@geindex VERIFY_X509_PARTIAL_CHAIN (in module ssl)
@anchor{library/ssl ssl VERIFY_X509_PARTIAL_CHAIN}@anchor{481}
@deffn {Data} ssl.VERIFY_X509_PARTIAL_CHAIN

Possible value for @ref{11b4,,SSLContext.verify_flags}. It instructs OpenSSL to
accept intermediate CAs in the trust store to be treated as trust-anchors,
in the same way as the self-signed root CA certificates. This makes it
possible to trust certificates issued by an intermediate CA without having
to trust its ancestor root CA.


Added in version 3.10.

@end deffn

@geindex VerifyFlags (class in ssl)
@anchor{library/ssl ssl VerifyFlags}@anchor{3a4c}
@deffn {Class} ssl.VerifyFlags

@ref{ea0,,enum.IntFlag} collection of VERIFY_* constants.


Added in version 3.6.

@end deffn

@geindex PROTOCOL_TLS (in module ssl)
@anchor{library/ssl ssl PROTOCOL_TLS}@anchor{3a38}
@deffn {Data} ssl.PROTOCOL_TLS

Selects the highest protocol version that both the client and server support.
Despite the name, this option can select both “SSL” and “TLS” protocols.


Added in version 3.6.



Deprecated since version 3.10: TLS clients and servers require different default settings for secure
communication. The generic TLS protocol constant is deprecated in
favor of @ref{a78,,PROTOCOL_TLS_CLIENT} and @ref{a79,,PROTOCOL_TLS_SERVER}.

@end deffn

@geindex PROTOCOL_TLS_CLIENT (in module ssl)
@anchor{library/ssl ssl PROTOCOL_TLS_CLIENT}@anchor{a78}
@deffn {Data} ssl.PROTOCOL_TLS_CLIENT

Auto-negotiate the highest protocol version that both the client and
server support, and configure the context client-side connections. The
protocol enables @ref{3a36,,CERT_REQUIRED} and
@ref{3a49,,check_hostname} by default.


Added in version 3.6.

@end deffn

@geindex PROTOCOL_TLS_SERVER (in module ssl)
@anchor{library/ssl ssl PROTOCOL_TLS_SERVER}@anchor{a79}
@deffn {Data} ssl.PROTOCOL_TLS_SERVER

Auto-negotiate the highest protocol version that both the client and
server support, and configure the context server-side connections.


Added in version 3.6.

@end deffn

@geindex PROTOCOL_SSLv23 (in module ssl)
@anchor{library/ssl ssl PROTOCOL_SSLv23}@anchor{3a4d}
@deffn {Data} ssl.PROTOCOL_SSLv23

Alias for @ref{3a38,,PROTOCOL_TLS}.


Deprecated since version 3.6: Use @ref{3a38,,PROTOCOL_TLS} instead.

@end deffn

@geindex PROTOCOL_SSLv3 (in module ssl)
@anchor{library/ssl ssl PROTOCOL_SSLv3}@anchor{3a43}
@deffn {Data} ssl.PROTOCOL_SSLv3

Selects SSL version 3 as the channel encryption protocol.

This protocol is not available if OpenSSL is compiled with the
@code{no-ssl3} option.

@cartouche
@quotation Warning 
SSL version 3 is insecure.  Its use is highly discouraged.
@end quotation
@end cartouche


Deprecated since version 3.6: OpenSSL has deprecated all version specific protocols. Use the default
protocol @ref{a79,,PROTOCOL_TLS_SERVER} or @ref{a78,,PROTOCOL_TLS_CLIENT}
with @ref{a76,,SSLContext.minimum_version} and
@ref{a77,,SSLContext.maximum_version} instead.

@end deffn

@geindex PROTOCOL_TLSv1 (in module ssl)
@anchor{library/ssl ssl PROTOCOL_TLSv1}@anchor{3a4e}
@deffn {Data} ssl.PROTOCOL_TLSv1

Selects TLS version 1.0 as the channel encryption protocol.


Deprecated since version 3.6: OpenSSL has deprecated all version specific protocols.

@end deffn

@geindex PROTOCOL_TLSv1_1 (in module ssl)
@anchor{library/ssl ssl PROTOCOL_TLSv1_1}@anchor{11ae}
@deffn {Data} ssl.PROTOCOL_TLSv1_1

Selects TLS version 1.1 as the channel encryption protocol.
Available only with openssl version 1.0.1+.


Added in version 3.4.



Deprecated since version 3.6: OpenSSL has deprecated all version specific protocols.

@end deffn

@geindex PROTOCOL_TLSv1_2 (in module ssl)
@anchor{library/ssl ssl PROTOCOL_TLSv1_2}@anchor{11af}
@deffn {Data} ssl.PROTOCOL_TLSv1_2

Selects TLS version 1.2 as the channel encryption protocol.
Available only with openssl version 1.0.1+.


Added in version 3.4.



Deprecated since version 3.6: OpenSSL has deprecated all version specific protocols.

@end deffn

@geindex OP_ALL (in module ssl)
@anchor{library/ssl ssl OP_ALL}@anchor{3a4f}
@deffn {Data} ssl.OP_ALL

Enables workarounds for various bugs present in other SSL implementations.
This option is set by default.  It does not necessarily set the same
flags as OpenSSL’s @code{SSL_OP_ALL} constant.


Added in version 3.2.

@end deffn

@geindex OP_NO_SSLv2 (in module ssl)
@anchor{library/ssl ssl OP_NO_SSLv2}@anchor{a40}
@deffn {Data} ssl.OP_NO_SSLv2

Prevents an SSLv2 connection.  This option is only applicable in
conjunction with @ref{3a38,,PROTOCOL_TLS}.  It prevents the peers from
choosing SSLv2 as the protocol version.


Added in version 3.2.



Deprecated since version 3.6: SSLv2 is deprecated

@end deffn

@geindex OP_NO_SSLv3 (in module ssl)
@anchor{library/ssl ssl OP_NO_SSLv3}@anchor{a41}
@deffn {Data} ssl.OP_NO_SSLv3

Prevents an SSLv3 connection.  This option is only applicable in
conjunction with @ref{3a38,,PROTOCOL_TLS}.  It prevents the peers from
choosing SSLv3 as the protocol version.


Added in version 3.2.



Deprecated since version 3.6: SSLv3 is deprecated

@end deffn

@geindex OP_NO_TLSv1 (in module ssl)
@anchor{library/ssl ssl OP_NO_TLSv1}@anchor{3a50}
@deffn {Data} ssl.OP_NO_TLSv1

Prevents a TLSv1 connection.  This option is only applicable in
conjunction with @ref{3a38,,PROTOCOL_TLS}.  It prevents the peers from
choosing TLSv1 as the protocol version.


Added in version 3.2.



Deprecated since version 3.7: The option is deprecated since OpenSSL 1.1.0, use the new
@ref{a76,,SSLContext.minimum_version} and
@ref{a77,,SSLContext.maximum_version} instead.

@end deffn

@geindex OP_NO_TLSv1_1 (in module ssl)
@anchor{library/ssl ssl OP_NO_TLSv1_1}@anchor{3a51}
@deffn {Data} ssl.OP_NO_TLSv1_1

Prevents a TLSv1.1 connection. This option is only applicable in conjunction
with @ref{3a38,,PROTOCOL_TLS}. It prevents the peers from choosing TLSv1.1 as
the protocol version. Available only with openssl version 1.0.1+.


Added in version 3.4.



Deprecated since version 3.7: The option is deprecated since OpenSSL 1.1.0.

@end deffn

@geindex OP_NO_TLSv1_2 (in module ssl)
@anchor{library/ssl ssl OP_NO_TLSv1_2}@anchor{3a52}
@deffn {Data} ssl.OP_NO_TLSv1_2

Prevents a TLSv1.2 connection. This option is only applicable in conjunction
with @ref{3a38,,PROTOCOL_TLS}. It prevents the peers from choosing TLSv1.2 as
the protocol version. Available only with openssl version 1.0.1+.


Added in version 3.4.



Deprecated since version 3.7: The option is deprecated since OpenSSL 1.1.0.

@end deffn

@geindex OP_NO_TLSv1_3 (in module ssl)
@anchor{library/ssl ssl OP_NO_TLSv1_3}@anchor{1c9e}
@deffn {Data} ssl.OP_NO_TLSv1_3

Prevents a TLSv1.3 connection. This option is only applicable in conjunction
with @ref{3a38,,PROTOCOL_TLS}. It prevents the peers from choosing TLSv1.3 as
the protocol version. TLS 1.3 is available with OpenSSL 1.1.1 or later.
When Python has been compiled against an older version of OpenSSL, the
flag defaults to `0'.


Added in version 3.6.3.



Deprecated since version 3.7: The option is deprecated since OpenSSL 1.1.0. It was added to 2.7.15 and
3.6.3 for backwards compatibility with OpenSSL 1.0.2.

@end deffn

@geindex OP_NO_RENEGOTIATION (in module ssl)
@anchor{library/ssl ssl OP_NO_RENEGOTIATION}@anchor{3a53}
@deffn {Data} ssl.OP_NO_RENEGOTIATION

Disable all renegotiation in TLSv1.2 and earlier. Do not send
HelloRequest messages, and ignore renegotiation requests via ClientHello.

This option is only available with OpenSSL 1.1.0h and later.


Added in version 3.7.

@end deffn

@geindex OP_CIPHER_SERVER_PREFERENCE (in module ssl)
@anchor{library/ssl ssl OP_CIPHER_SERVER_PREFERENCE}@anchor{1355}
@deffn {Data} ssl.OP_CIPHER_SERVER_PREFERENCE

Use the server’s cipher ordering preference, rather than the client’s.
This option has no effect on client sockets and SSLv2 server sockets.


Added in version 3.3.

@end deffn

@geindex OP_SINGLE_DH_USE (in module ssl)
@anchor{library/ssl ssl OP_SINGLE_DH_USE}@anchor{3a54}
@deffn {Data} ssl.OP_SINGLE_DH_USE

Prevents reuse of the same DH key for distinct SSL sessions.  This
improves forward secrecy but requires more computational resources.
This option only applies to server sockets.


Added in version 3.3.

@end deffn

@geindex OP_SINGLE_ECDH_USE (in module ssl)
@anchor{library/ssl ssl OP_SINGLE_ECDH_USE}@anchor{3a55}
@deffn {Data} ssl.OP_SINGLE_ECDH_USE

Prevents reuse of the same ECDH key for distinct SSL sessions.  This
improves forward secrecy but requires more computational resources.
This option only applies to server sockets.


Added in version 3.3.

@end deffn

@geindex OP_ENABLE_MIDDLEBOX_COMPAT (in module ssl)
@anchor{library/ssl ssl OP_ENABLE_MIDDLEBOX_COMPAT}@anchor{3a56}
@deffn {Data} ssl.OP_ENABLE_MIDDLEBOX_COMPAT

Send dummy Change Cipher Spec (CCS) messages in TLS 1.3 handshake to make
a TLS 1.3 connection look more like a TLS 1.2 connection.

This option is only available with OpenSSL 1.1.1 and later.


Added in version 3.8.

@end deffn

@geindex OP_NO_COMPRESSION (in module ssl)
@anchor{library/ssl ssl OP_NO_COMPRESSION}@anchor{1352}
@deffn {Data} ssl.OP_NO_COMPRESSION

Disable compression on the SSL channel.  This is useful if the application
protocol supports its own compression scheme.


Added in version 3.3.

@end deffn

@geindex Options (class in ssl)
@anchor{library/ssl ssl Options}@anchor{3a57}
@deffn {Class} ssl.Options

@ref{ea0,,enum.IntFlag} collection of OP_* constants.
@end deffn

@geindex OP_NO_TICKET (in module ssl)
@anchor{library/ssl ssl OP_NO_TICKET}@anchor{3a58}
@deffn {Data} ssl.OP_NO_TICKET

Prevent client side from requesting a session ticket.


Added in version 3.6.

@end deffn

@geindex OP_IGNORE_UNEXPECTED_EOF (in module ssl)
@anchor{library/ssl ssl OP_IGNORE_UNEXPECTED_EOF}@anchor{a3e}
@deffn {Data} ssl.OP_IGNORE_UNEXPECTED_EOF

Ignore unexpected shutdown of TLS connections.

This option is only available with OpenSSL 3.0.0 and later.


Added in version 3.10.

@end deffn

@geindex OP_ENABLE_KTLS (in module ssl)
@anchor{library/ssl ssl OP_ENABLE_KTLS}@anchor{1b53}
@deffn {Data} ssl.OP_ENABLE_KTLS

Enable the use of the kernel TLS. To benefit from the feature, OpenSSL must
have been compiled with support for it, and the negotiated cipher suites and
extensions must be supported by it (a list of supported ones may vary by
platform and kernel version).

Note that with enabled kernel TLS some cryptographic operations are
performed by the kernel directly and not via any available OpenSSL
Providers. This might be undesirable if, for example, the application
requires all cryptographic operations to be performed by the FIPS provider.

This option is only available with OpenSSL 3.0.0 and later.


Added in version 3.12.

@end deffn

@geindex OP_LEGACY_SERVER_CONNECT (in module ssl)
@anchor{library/ssl ssl OP_LEGACY_SERVER_CONNECT}@anchor{1b35}
@deffn {Data} ssl.OP_LEGACY_SERVER_CONNECT

Allow legacy insecure renegotiation between OpenSSL and unpatched servers
only.


Added in version 3.12.

@end deffn

@geindex HAS_ALPN (in module ssl)
@anchor{library/ssl ssl HAS_ALPN}@anchor{106c}
@deffn {Data} ssl.HAS_ALPN

Whether the OpenSSL library has built-in support for the `Application-Layer
Protocol Negotiation' TLS extension as described in 
@geindex RFC; RFC 7301
RFC 7301@footnote{https://datatracker.ietf.org/doc/html/rfc7301.html}.


Added in version 3.5.

@end deffn

@geindex HAS_NEVER_CHECK_COMMON_NAME (in module ssl)
@anchor{library/ssl ssl HAS_NEVER_CHECK_COMMON_NAME}@anchor{3a59}
@deffn {Data} ssl.HAS_NEVER_CHECK_COMMON_NAME

Whether the OpenSSL library has built-in support not checking subject
common name and @ref{d7c,,SSLContext.hostname_checks_common_name} is
writeable.


Added in version 3.7.

@end deffn

@geindex HAS_ECDH (in module ssl)
@anchor{library/ssl ssl HAS_ECDH}@anchor{3a5a}
@deffn {Data} ssl.HAS_ECDH

Whether the OpenSSL library has built-in support for the Elliptic Curve-based
Diffie-Hellman key exchange.  This should be true unless the feature was
explicitly disabled by the distributor.


Added in version 3.3.

@end deffn

@geindex HAS_SNI (in module ssl)
@anchor{library/ssl ssl HAS_SNI}@anchor{3a5b}
@deffn {Data} ssl.HAS_SNI

Whether the OpenSSL library has built-in support for the `Server Name
Indication' extension (as defined in 
@geindex RFC; RFC 6066
RFC 6066@footnote{https://datatracker.ietf.org/doc/html/rfc6066.html}).


Added in version 3.2.

@end deffn

@geindex HAS_NPN (in module ssl)
@anchor{library/ssl ssl HAS_NPN}@anchor{3a5c}
@deffn {Data} ssl.HAS_NPN

Whether the OpenSSL library has built-in support for the `Next Protocol
Negotiation' as described in the Application Layer Protocol Negotiation@footnote{https://en.wikipedia.org/wiki/Application-Layer_Protocol_Negotiation}.
When true, you can use the @ref{356,,SSLContext.set_npn_protocols()} method to advertise
which protocols you want to support.


Added in version 3.3.

@end deffn

@geindex HAS_SSLv2 (in module ssl)
@anchor{library/ssl ssl HAS_SSLv2}@anchor{3a5d}
@deffn {Data} ssl.HAS_SSLv2

Whether the OpenSSL library has built-in support for the SSL 2.0 protocol.


Added in version 3.7.

@end deffn

@geindex HAS_SSLv3 (in module ssl)
@anchor{library/ssl ssl HAS_SSLv3}@anchor{3a5e}
@deffn {Data} ssl.HAS_SSLv3

Whether the OpenSSL library has built-in support for the SSL 3.0 protocol.


Added in version 3.7.

@end deffn

@geindex HAS_TLSv1 (in module ssl)
@anchor{library/ssl ssl HAS_TLSv1}@anchor{3a5f}
@deffn {Data} ssl.HAS_TLSv1

Whether the OpenSSL library has built-in support for the TLS 1.0 protocol.


Added in version 3.7.

@end deffn

@geindex HAS_TLSv1_1 (in module ssl)
@anchor{library/ssl ssl HAS_TLSv1_1}@anchor{d82}
@deffn {Data} ssl.HAS_TLSv1_1

Whether the OpenSSL library has built-in support for the TLS 1.1 protocol.


Added in version 3.7.

@end deffn

@geindex HAS_TLSv1_2 (in module ssl)
@anchor{library/ssl ssl HAS_TLSv1_2}@anchor{3a60}
@deffn {Data} ssl.HAS_TLSv1_2

Whether the OpenSSL library has built-in support for the TLS 1.2 protocol.


Added in version 3.7.

@end deffn

@geindex HAS_TLSv1_3 (in module ssl)
@anchor{library/ssl ssl HAS_TLSv1_3}@anchor{3a61}
@deffn {Data} ssl.HAS_TLSv1_3

Whether the OpenSSL library has built-in support for the TLS 1.3 protocol.


Added in version 3.7.

@end deffn

@geindex HAS_PSK (in module ssl)
@anchor{library/ssl ssl HAS_PSK}@anchor{3a62}
@deffn {Data} ssl.HAS_PSK

Whether the OpenSSL library has built-in support for TLS-PSK.


Added in version 3.13.

@end deffn

@geindex HAS_PHA (in module ssl)
@anchor{library/ssl ssl HAS_PHA}@anchor{288}
@deffn {Data} ssl.HAS_PHA

Whether the OpenSSL library has built-in support for TLS-PHA.


Added in version 3.14.

@end deffn

@geindex CHANNEL_BINDING_TYPES (in module ssl)
@anchor{library/ssl ssl CHANNEL_BINDING_TYPES}@anchor{3a63}
@deffn {Data} ssl.CHANNEL_BINDING_TYPES

List of supported TLS channel binding types.  Strings in this list
can be used as arguments to @ref{1350,,SSLSocket.get_channel_binding()}.


Added in version 3.3.

@end deffn

@geindex OPENSSL_VERSION (in module ssl)
@anchor{library/ssl ssl OPENSSL_VERSION}@anchor{142a}
@deffn {Data} ssl.OPENSSL_VERSION

The version string of the OpenSSL library loaded by the interpreter:

@example
>>> ssl.OPENSSL_VERSION
'OpenSSL 1.0.2k  26 Jan 2017'
@end example


Added in version 3.2.

@end deffn

@geindex OPENSSL_VERSION_INFO (in module ssl)
@anchor{library/ssl ssl OPENSSL_VERSION_INFO}@anchor{142b}
@deffn {Data} ssl.OPENSSL_VERSION_INFO

A tuple of five integers representing version information about the
OpenSSL library:

@example
>>> ssl.OPENSSL_VERSION_INFO
(1, 0, 2, 11, 15)
@end example


Added in version 3.2.

@end deffn

@geindex OPENSSL_VERSION_NUMBER (in module ssl)
@anchor{library/ssl ssl OPENSSL_VERSION_NUMBER}@anchor{142c}
@deffn {Data} ssl.OPENSSL_VERSION_NUMBER

The raw version number of the OpenSSL library, as a single integer:

@example
>>> ssl.OPENSSL_VERSION_NUMBER
268443839
>>> hex(ssl.OPENSSL_VERSION_NUMBER)
'0x100020bf'
@end example


Added in version 3.2.

@end deffn

@geindex ALERT_DESCRIPTION_HANDSHAKE_FAILURE (in module ssl)
@geindex ALERT_DESCRIPTION_INTERNAL_ERROR (in module ssl)
@anchor{library/ssl ssl ALERT_DESCRIPTION_HANDSHAKE_FAILURE}@anchor{3a64}
@deffn {Data} ssl.ALERT_DESCRIPTION_HANDSHAKE_FAILURE
@anchor{library/ssl ssl ALERT_DESCRIPTION_INTERNAL_ERROR}@anchor{3a65}
@deffnx {Data} ssl.ALERT_DESCRIPTION_INTERNAL_ERROR

@deffnx {Data} ALERT_DESCRIPTION_*

Alert Descriptions from 
@geindex RFC; RFC 5246
RFC 5246@footnote{https://datatracker.ietf.org/doc/html/rfc5246.html} and others. The IANA TLS Alert Registry@footnote{https://www.iana.org/assignments/tls-parameters/tls-parameters.xml#tls-parameters-6}
contains this list and references to the RFCs where their meaning is defined.

Used as the return value of the callback function in
@ref{11bd,,SSLContext.set_servername_callback()}.


Added in version 3.4.

@end deffn

@geindex AlertDescription (class in ssl)
@anchor{library/ssl ssl AlertDescription}@anchor{3a66}
@deffn {Class} ssl.AlertDescription

@ref{ee1,,enum.IntEnum} collection of ALERT_DESCRIPTION_* constants.


Added in version 3.6.

@end deffn

@geindex Purpose.SERVER_AUTH (in module ssl)
@anchor{library/ssl ssl Purpose SERVER_AUTH}@anchor{11b9}
@deffn {Data} Purpose.SERVER_AUTH

Option for @ref{480,,create_default_context()} and
@ref{11b8,,SSLContext.load_default_certs()}.  This value indicates that the
context may be used to authenticate web servers (therefore, it will
be used to create client-side sockets).


Added in version 3.4.

@end deffn

@geindex Purpose.CLIENT_AUTH (in module ssl)
@anchor{library/ssl ssl Purpose CLIENT_AUTH}@anchor{11ba}
@deffn {Data} Purpose.CLIENT_AUTH

Option for @ref{480,,create_default_context()} and
@ref{11b8,,SSLContext.load_default_certs()}.  This value indicates that the
context may be used to authenticate web clients (therefore, it will
be used to create server-side sockets).


Added in version 3.4.

@end deffn

@geindex SSLErrorNumber (class in ssl)
@anchor{library/ssl ssl SSLErrorNumber}@anchor{3a67}
@deffn {Class} ssl.SSLErrorNumber

@ref{ee1,,enum.IntEnum} collection of SSL_ERROR_* constants.


Added in version 3.6.

@end deffn

@geindex TLSVersion (class in ssl)
@anchor{library/ssl ssl TLSVersion}@anchor{3a68}
@deffn {Class} ssl.TLSVersion

@ref{ee1,,enum.IntEnum} collection of SSL and TLS versions for
@ref{a77,,SSLContext.maximum_version} and @ref{a76,,SSLContext.minimum_version}.


Added in version 3.7.

@end deffn

@geindex MINIMUM_SUPPORTED (ssl.TLSVersion attribute)
@anchor{library/ssl ssl TLSVersion MINIMUM_SUPPORTED}@anchor{3a69}
@deffn {Attribute} TLSVersion.MINIMUM_SUPPORTED
@end deffn

@geindex MAXIMUM_SUPPORTED (ssl.TLSVersion attribute)
@anchor{library/ssl ssl TLSVersion MAXIMUM_SUPPORTED}@anchor{3a6a}
@deffn {Attribute} TLSVersion.MAXIMUM_SUPPORTED

The minimum or maximum supported SSL or TLS version. These are magic
constants. Their values don’t reflect the lowest and highest available
TLS/SSL versions.
@end deffn

@geindex SSLv3 (ssl.TLSVersion attribute)
@anchor{library/ssl ssl TLSVersion SSLv3}@anchor{3a6b}
@deffn {Attribute} TLSVersion.SSLv3
@end deffn

@geindex TLSv1 (ssl.TLSVersion attribute)
@anchor{library/ssl ssl TLSVersion TLSv1}@anchor{3a6c}
@deffn {Attribute} TLSVersion.TLSv1
@end deffn

@geindex TLSv1_1 (ssl.TLSVersion attribute)
@anchor{library/ssl ssl TLSVersion TLSv1_1}@anchor{3a6d}
@deffn {Attribute} TLSVersion.TLSv1_1
@end deffn

@geindex TLSv1_2 (ssl.TLSVersion attribute)
@anchor{library/ssl ssl TLSVersion TLSv1_2}@anchor{3a6e}
@deffn {Attribute} TLSVersion.TLSv1_2
@end deffn

@geindex TLSv1_3 (ssl.TLSVersion attribute)
@anchor{library/ssl ssl TLSVersion TLSv1_3}@anchor{3a6f}
@deffn {Attribute} TLSVersion.TLSv1_3

SSL 3.0 to TLS 1.3.


Deprecated since version 3.10: All @ref{3a68,,TLSVersion} members except @ref{3a6e,,TLSVersion.TLSv1_2} and
@code{TLSVersion.TLSv1_3} are deprecated.

@end deffn

@node SSL sockets,SSL contexts,Functions constants and exceptions,ssl — TLS/SSL wrapper for socket objects
@anchor{library/ssl ssl-sockets}@anchor{3a70}
@subsubsection SSL sockets


@geindex SSLSocket (class in ssl)
@anchor{library/ssl ssl SSLSocket}@anchor{aed}
@deffn {Class} ssl.SSLSocket (socket.socket)

SSL sockets provide the following methods of @ref{3a16,,Socket Objects}:


@itemize -

@item 
@ref{fa8,,accept()}

@item 
@ref{1746,,bind()}

@item 
@ref{f45,,close()}

@item 
@ref{fa9,,connect()}

@item 
@ref{1428,,detach()}

@item 
@ref{3a23,,fileno()}

@item 
@ref{3951,,getpeername()}, @ref{286,,getsockname()}

@item 
@ref{ed6,,getsockopt()}, @ref{ed7,,setsockopt()}

@item 
@ref{3a24,,gettimeout()}, @ref{39d6,,settimeout()},
@ref{30ac,,setblocking()}

@item 
@ref{1064,,listen()}

@item 
@ref{13ab,,makefile()}

@item 
@ref{faa,,recv()}, @ref{1529,,recv_into()}
(but passing a non-zero @code{flags} argument is not allowed)

@item 
@ref{fad,,send()}, @ref{fae,,sendall()} (with
the same limitation)

@item 
@ref{1063,,sendfile()} (but @ref{d0b,,os.sendfile} will be used
for plain-text sockets only, else @ref{fad,,send()} will be used)

@item 
@ref{3a13,,shutdown()}
@end itemize

However, since the SSL (and TLS) protocol has its own framing atop
of TCP, the SSL sockets abstraction can, in certain respects, diverge from
the specification of normal, OS-level sockets.  See especially the
@ref{3a3b,,notes on non-blocking sockets}.

Instances of @code{SSLSocket} must be created using the
@ref{749,,SSLContext.wrap_socket()} method.


Changed in version 3.5: The @code{sendfile()} method was added.



Changed in version 3.5: The @code{shutdown()} does not reset the socket timeout each time bytes
are received or sent. The socket timeout is now the maximum total duration
of the shutdown.



Deprecated since version 3.6: It is deprecated to create a @code{SSLSocket} instance directly, use
@ref{749,,SSLContext.wrap_socket()} to wrap a socket.



Changed in version 3.7: @code{SSLSocket} instances must be created with
@ref{749,,wrap_socket()}. In earlier versions, it was possible
to create instances directly. This was never documented or officially
supported.



Changed in version 3.10: Python now uses @code{SSL_read_ex} and @code{SSL_write_ex} internally. The
functions support reading and writing of data larger than 2 GB. Writing
zero-length data no longer fails with a protocol violation error.

@end deffn

SSL sockets also have the following additional methods and attributes:

@geindex read() (ssl.SSLSocket method)
@anchor{library/ssl ssl SSLSocket read}@anchor{1074}
@deffn {Method} SSLSocket.read (len=1024, buffer=None)

Read up to `len' bytes of data from the SSL socket and return the result as
a @code{bytes} instance. If `buffer' is specified, then read into the buffer
instead, and return the number of bytes read.

Raise @ref{106f,,SSLWantReadError} or @ref{1070,,SSLWantWriteError} if the socket is
@ref{3a3b,,non-blocking} and the read would block.

As at any time a re-negotiation is possible, a call to @code{read()} can also
cause write operations.


Changed in version 3.5: The socket timeout is no longer reset each time bytes are received or sent.
The socket timeout is now the maximum total duration to read up to `len'
bytes.



Deprecated since version 3.6: Use @code{recv()} instead of @code{read()}.

@end deffn

@geindex write() (ssl.SSLSocket method)
@anchor{library/ssl ssl SSLSocket write}@anchor{1075}
@deffn {Method} SSLSocket.write (data)

Write `data' to the SSL socket and return the number of bytes written. The
`data' argument must be an object supporting the buffer interface.

Raise @ref{106f,,SSLWantReadError} or @ref{1070,,SSLWantWriteError} if the socket is
@ref{3a3b,,non-blocking} and the write would block.

As at any time a re-negotiation is possible, a call to @code{write()} can
also cause read operations.


Changed in version 3.5: The socket timeout is no longer reset each time bytes are received or sent.
The socket timeout is now the maximum total duration to write `data'.



Deprecated since version 3.6: Use @code{send()} instead of @code{write()}.

@end deffn

@cartouche
@quotation Note 
The @ref{1074,,read()} and @ref{1075,,write()} methods are the
low-level methods that read and write unencrypted, application-level data
and decrypt/encrypt it to encrypted, wire-level data. These methods
require an active SSL connection, i.e. the handshake was completed and
@ref{3a71,,SSLSocket.unwrap()} was not called.

Normally you should use the socket API methods like
@ref{faa,,recv()} and @ref{fad,,send()} instead of these
methods.
@end quotation
@end cartouche

@geindex do_handshake() (ssl.SSLSocket method)
@anchor{library/ssl ssl SSLSocket do_handshake}@anchor{1073}
@deffn {Method} SSLSocket.do_handshake (block=False)

Perform the SSL setup handshake.

If `block' is true and the timeout obtained by @ref{3a24,,gettimeout()}
is zero, the socket is set in blocking mode until the handshake is performed.


Changed in version 3.4: The handshake method also performs @code{match_hostname()} when the
@ref{3a49,,check_hostname} attribute of the socket’s
@ref{3a72,,context} is true.



Changed in version 3.5: The socket timeout is no longer reset each time bytes are received or sent.
The socket timeout is now the maximum total duration of the handshake.



Changed in version 3.7: Hostname or IP address is matched by OpenSSL during handshake. The
function @code{match_hostname()} is no longer used. In case OpenSSL
refuses a hostname or IP address, the handshake is aborted early and
a TLS alert message is sent to the peer.

@end deffn

@geindex getpeercert() (ssl.SSLSocket method)
@anchor{library/ssl ssl SSLSocket getpeercert}@anchor{11be}
@deffn {Method} SSLSocket.getpeercert (binary_form=False)

If there is no certificate for the peer on the other end of the connection,
return @code{None}.  If the SSL handshake hasn’t been done yet, raise
@ref{2ee,,ValueError}.

If the @code{binary_form} parameter is @ref{d31,,False}, and a certificate was
received from the peer, this method returns a @ref{184,,dict} instance.  If the
certificate was not validated, the dict is empty.  If the certificate was
validated, it returns a dict with several keys, amongst them @code{subject}
(the principal for which the certificate was issued) and @code{issuer}
(the principal issuing the certificate).  If a certificate contains an
instance of the `Subject Alternative Name' extension (see 
@geindex RFC; RFC 3280
RFC 3280@footnote{https://datatracker.ietf.org/doc/html/rfc3280.html}),
there will also be a @code{subjectAltName} key in the dictionary.

The @code{subject} and @code{issuer} fields are tuples containing the sequence
of relative distinguished names (RDNs) given in the certificate’s data
structure for the respective fields, and each RDN is a sequence of
name-value pairs.  Here is a real-world example:

@example
@{'issuer': ((('countryName', 'IL'),),
            (('organizationName', 'StartCom Ltd.'),),
            (('organizationalUnitName',
              'Secure Digital Certificate Signing'),),
            (('commonName',
              'StartCom Class 2 Primary Intermediate Server CA'),)),
 'notAfter': 'Nov 22 08:15:19 2013 GMT',
 'notBefore': 'Nov 21 03:09:52 2011 GMT',
 'serialNumber': '95F0',
 'subject': ((('description', '571208-SLe257oHY9fVQ07Z'),),
             (('countryName', 'US'),),
             (('stateOrProvinceName', 'California'),),
             (('localityName', 'San Francisco'),),
             (('organizationName', 'Electronic Frontier Foundation, Inc.'),),
             (('commonName', '*.eff.org'),),
             (('emailAddress', 'hostmaster@@eff.org'),)),
 'subjectAltName': (('DNS', '*.eff.org'), ('DNS', 'eff.org')),
 'version': 3@}
@end example

If the @code{binary_form} parameter is @ref{e0d,,True}, and a certificate was
provided, this method returns the DER-encoded form of the entire certificate
as a sequence of bytes, or @ref{887,,None} if the peer did not provide a
certificate.  Whether the peer provides a certificate depends on the SSL
socket’s role:


@itemize *

@item 
for a client SSL socket, the server will always provide a certificate,
regardless of whether validation was required;

@item 
for a server SSL socket, the client will only provide a certificate
when requested by the server; therefore @code{getpeercert()} will return
@ref{887,,None} if you used @ref{3a47,,CERT_NONE} (rather than
@ref{3a48,,CERT_OPTIONAL} or @ref{3a36,,CERT_REQUIRED}).
@end itemize

See also @ref{3a49,,SSLContext.check_hostname}.


Changed in version 3.2: The returned dictionary includes additional items such as @code{issuer}
and @code{notBefore}.



Changed in version 3.4: @ref{2ee,,ValueError} is raised when the handshake isn’t done.
The returned dictionary includes additional X509v3 extension items
  such as @code{crlDistributionPoints}, @code{caIssuers} and @code{OCSP} URIs.



Changed in version 3.9: IPv6 address strings no longer have a trailing new line.

@end deffn

@geindex get_verified_chain() (ssl.SSLSocket method)
@anchor{library/ssl ssl SSLSocket get_verified_chain}@anchor{19a0}
@deffn {Method} SSLSocket.get_verified_chain ()

Returns verified certificate chain provided by the other
end of the SSL channel as a list of DER-encoded bytes.
If certificate verification was disabled method acts the same as
@ref{19a1,,get_unverified_chain()}.


Added in version 3.13.

@end deffn

@geindex get_unverified_chain() (ssl.SSLSocket method)
@anchor{library/ssl ssl SSLSocket get_unverified_chain}@anchor{19a1}
@deffn {Method} SSLSocket.get_unverified_chain ()

Returns raw certificate chain provided by the other
end of the SSL channel as a list of DER-encoded bytes.


Added in version 3.13.

@end deffn

@geindex cipher() (ssl.SSLSocket method)
@anchor{library/ssl ssl SSLSocket cipher}@anchor{3952}
@deffn {Method} SSLSocket.cipher ()

Returns a three-value tuple containing the name of the cipher being used, the
version of the SSL protocol that defines its use, and the number of secret
bits being used.  If no connection has been established, returns @code{None}.
@end deffn

@geindex shared_ciphers() (ssl.SSLSocket method)
@anchor{library/ssl ssl SSLSocket shared_ciphers}@anchor{1072}
@deffn {Method} SSLSocket.shared_ciphers ()

Return the list of ciphers available in both the client and server.  Each
entry of the returned list is a three-value tuple containing the name of the
cipher, the version of the SSL protocol that defines its use, and the number
of secret bits the cipher uses.  @code{shared_ciphers()} returns
@code{None} if no connection has been established or the socket is a client
socket.


Added in version 3.5.

@end deffn

@geindex compression() (ssl.SSLSocket method)
@anchor{library/ssl ssl SSLSocket compression}@anchor{1351}
@deffn {Method} SSLSocket.compression ()

Return the compression algorithm being used as a string, or @code{None}
if the connection isn’t compressed.

If the higher-level protocol supports its own compression mechanism,
you can use @ref{1352,,OP_NO_COMPRESSION} to disable SSL-level compression.


Added in version 3.3.

@end deffn

@geindex get_channel_binding() (ssl.SSLSocket method)
@anchor{library/ssl ssl SSLSocket get_channel_binding}@anchor{1350}
@deffn {Method} SSLSocket.get_channel_binding (cb_type='tls-unique')

Get channel binding data for current connection, as a bytes object.  Returns
@code{None} if not connected or the handshake has not been completed.

The `cb_type' parameter allow selection of the desired channel binding
type. Valid channel binding types are listed in the
@ref{3a63,,CHANNEL_BINDING_TYPES} list.  Currently only the ‘tls-unique’ channel
binding, defined by 
@geindex RFC; RFC 5929
RFC 5929@footnote{https://datatracker.ietf.org/doc/html/rfc5929.html}, is supported.  @ref{2ee,,ValueError} will be
raised if an unsupported channel binding type is requested.


Added in version 3.3.

@end deffn

@geindex selected_alpn_protocol() (ssl.SSLSocket method)
@anchor{library/ssl ssl SSLSocket selected_alpn_protocol}@anchor{106b}
@deffn {Method} SSLSocket.selected_alpn_protocol ()

Return the protocol that was selected during the TLS handshake.  If
@ref{106a,,SSLContext.set_alpn_protocols()} was not called, if the other party does
not support ALPN, if this socket does not support any of the client’s
proposed protocols, or if the handshake has not happened yet, @code{None} is
returned.


Added in version 3.5.

@end deffn

@geindex selected_npn_protocol() (ssl.SSLSocket method)
@anchor{library/ssl ssl SSLSocket selected_npn_protocol}@anchor{a7a}
@deffn {Method} SSLSocket.selected_npn_protocol ()

Return the higher-level protocol that was selected during the TLS/SSL
handshake. If @ref{356,,SSLContext.set_npn_protocols()} was not called, or
if the other party does not support NPN, or if the handshake has not yet
happened, this will return @code{None}.


Added in version 3.3.



Deprecated since version 3.10: NPN has been superseded by ALPN

@end deffn

@geindex unwrap() (ssl.SSLSocket method)
@anchor{library/ssl ssl SSLSocket unwrap}@anchor{3a71}
@deffn {Method} SSLSocket.unwrap ()

Performs the SSL shutdown handshake, which removes the TLS layer from the
underlying socket, and returns the underlying socket object.  This can be
used to go from encrypted operation over a connection to unencrypted.  The
returned socket should always be used for further communication with the
other side of the connection, rather than the original socket.
@end deffn

@geindex verify_client_post_handshake() (ssl.SSLSocket method)
@anchor{library/ssl ssl SSLSocket verify_client_post_handshake}@anchor{c2d}
@deffn {Method} SSLSocket.verify_client_post_handshake ()

Requests post-handshake authentication (PHA) from a TLS 1.3 client. PHA
can only be initiated for a TLS 1.3 connection from a server-side socket,
after the initial TLS handshake and with PHA enabled on both sides, see
@ref{c2c,,SSLContext.post_handshake_auth}.

The method does not perform a cert exchange immediately. The server-side
sends a CertificateRequest during the next write event and expects the
client to respond with a certificate on the next read event.

If any precondition isn’t met (e.g. not TLS 1.3, PHA not enabled), an
@ref{1485,,SSLError} is raised.

@cartouche
@quotation Note 
Only available with OpenSSL 1.1.1 and TLS 1.3 enabled. Without TLS 1.3
support, the method raises @ref{369,,NotImplementedError}.
@end quotation
@end cartouche


Added in version 3.8.

@end deffn

@geindex version() (ssl.SSLSocket method)
@anchor{library/ssl ssl SSLSocket version}@anchor{106e}
@deffn {Method} SSLSocket.version ()

Return the actual SSL protocol version negotiated by the connection
as a string, or @code{None} if no secure connection is established.
As of this writing, possible return values include @code{"SSLv2"},
@code{"SSLv3"}, @code{"TLSv1"}, @code{"TLSv1.1"} and @code{"TLSv1.2"}.
Recent OpenSSL versions may define more return values.


Added in version 3.5.

@end deffn

@geindex pending() (ssl.SSLSocket method)
@anchor{library/ssl ssl SSLSocket pending}@anchor{3a73}
@deffn {Method} SSLSocket.pending ()

Returns the number of already decrypted bytes available for read, pending on
the connection.
@end deffn

@geindex context (ssl.SSLSocket attribute)
@anchor{library/ssl ssl SSLSocket context}@anchor{3a72}
@deffn {Attribute} SSLSocket.context

The @ref{355,,SSLContext} object this SSL socket is tied to.


Added in version 3.2.

@end deffn

@geindex server_side (ssl.SSLSocket attribute)
@anchor{library/ssl ssl SSLSocket server_side}@anchor{3a74}
@deffn {Attribute} SSLSocket.server_side

A boolean which is @code{True} for server-side sockets and @code{False} for
client-side sockets.


Added in version 3.2.

@end deffn

@geindex server_hostname (ssl.SSLSocket attribute)
@anchor{library/ssl ssl SSLSocket server_hostname}@anchor{d7e}
@deffn {Attribute} SSLSocket.server_hostname

Hostname of the server: @ref{16a,,str} type, or @code{None} for server-side
socket or if the hostname was not specified in the constructor.


Added in version 3.2.



Changed in version 3.7: The attribute is now always ASCII text. When @code{server_hostname} is
an internationalized domain name (IDN), this attribute now stores the
A-label form (@code{"xn--pythn-mua.org"}), rather than the U-label form
(@code{"pythön.org"}).

@end deffn

@geindex session (ssl.SSLSocket attribute)
@anchor{library/ssl ssl SSLSocket session}@anchor{1981}
@deffn {Attribute} SSLSocket.session

The @ref{edf,,SSLSession} for this SSL connection. The session is available
for client and server side sockets after the TLS handshake has been
performed. For client sockets the session can be set before
@ref{1073,,do_handshake()} has been called to reuse a session.


Added in version 3.6.

@end deffn

@geindex session_reused (ssl.SSLSocket attribute)
@anchor{library/ssl ssl SSLSocket session_reused}@anchor{3a75}
@deffn {Attribute} SSLSocket.session_reused


Added in version 3.6.

@end deffn

@node SSL contexts,Certificates,SSL sockets,ssl — TLS/SSL wrapper for socket objects
@anchor{library/ssl ssl-contexts}@anchor{3a76}
@subsubsection SSL contexts



Added in version 3.2.


An SSL context holds various data longer-lived than single SSL connections,
such as SSL configuration options, certificate(s) and private key(s).
It also manages a cache of SSL sessions for server-side sockets, in order
to speed up repeated connections from the same clients.

@geindex SSLContext (class in ssl)
@anchor{library/ssl ssl SSLContext}@anchor{355}
@deffn {Class} ssl.SSLContext (protocol=None)

Create a new SSL context.  You may pass `protocol' which must be one
of the @code{PROTOCOL_*} constants defined in this module.  The parameter
specifies which version of the SSL protocol to use.  Typically, the
server chooses a particular protocol version, and the client must adapt
to the server’s choice.  Most of the versions are not interoperable
with the other versions.  If not specified, the default is
@ref{3a38,,PROTOCOL_TLS}; it provides the most compatibility with other
versions.

Here’s a table showing which versions in a client (down the side) can connect
to which versions in a server (along the top):


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxx} {xxxxxxxxxxxxxx} {xxxxxxxxxxxxxxx} {xxxxxxxxxxx} {xxxxxxxxxxxxx} {xxxxxxxxxxxxx} 
@item

`client' / `server'

@tab

`SSLv2'

@tab

`SSLv3'

@tab

`TLS' @footnote{
TLS 1.3 protocol will be available with @ref{3a38,,PROTOCOL_TLS} in
OpenSSL >= 1.1.1. There is no dedicated PROTOCOL constant for just
TLS 1.3.
}

@tab

`TLSv1'

@tab

`TLSv1.1'

@tab

`TLSv1.2'

@item

`SSLv2'

@tab

yes

@tab

no

@tab

no @footnote{
@code{SSLContext} disables SSLv2 with @ref{a40,,OP_NO_SSLv2} by default.
}

@tab

no

@tab

no

@tab

no

@item

`SSLv3'

@tab

no

@tab

yes

@tab

no @footnote{
@code{SSLContext} disables SSLv3 with @ref{a41,,OP_NO_SSLv3} by default.
}

@tab

no

@tab

no

@tab

no

@item

`TLS' (`SSLv23') @footnote{
TLS 1.3 protocol will be available with @ref{3a38,,PROTOCOL_TLS} in
OpenSSL >= 1.1.1. There is no dedicated PROTOCOL constant for just
TLS 1.3.
}

@tab

no @footnote{
@code{SSLContext} disables SSLv2 with @ref{a40,,OP_NO_SSLv2} by default.
}

@tab

no @footnote{
@code{SSLContext} disables SSLv3 with @ref{a41,,OP_NO_SSLv3} by default.
}

@tab

yes

@tab

yes

@tab

yes

@tab

yes

@item

`TLSv1'

@tab

no

@tab

no

@tab

yes

@tab

yes

@tab

no

@tab

no

@item

`TLSv1.1'

@tab

no

@tab

no

@tab

yes

@tab

no

@tab

yes

@tab

no

@item

`TLSv1.2'

@tab

no

@tab

no

@tab

yes

@tab

no

@tab

no

@tab

yes

@end multitable



@subsubheading See also


@ref{480,,create_default_context()} lets the @code{ssl} module choose
security settings for a given purpose.



Changed in version 3.6: The context is created with secure default values. The options
@ref{1352,,OP_NO_COMPRESSION}, @ref{1355,,OP_CIPHER_SERVER_PREFERENCE},
@ref{3a54,,OP_SINGLE_DH_USE}, @ref{3a55,,OP_SINGLE_ECDH_USE},
@ref{a40,,OP_NO_SSLv2},
and @ref{a41,,OP_NO_SSLv3} (except for @ref{3a43,,PROTOCOL_SSLv3}) are
set by default. The initial cipher suite list contains only @code{HIGH}
ciphers, no @code{NULL} ciphers and no @code{MD5} ciphers.



Deprecated since version 3.10: @code{SSLContext} without protocol argument is deprecated. The
context class will either require @ref{a78,,PROTOCOL_TLS_CLIENT} or
@ref{a79,,PROTOCOL_TLS_SERVER} protocol in the future.



Changed in version 3.10: The default cipher suites now include only secure AES and ChaCha20
ciphers with forward secrecy and security level 2. RSA and DH keys with
less than 2048 bits and ECC keys with less than 224 bits are prohibited.
@ref{3a38,,PROTOCOL_TLS}, @ref{a78,,PROTOCOL_TLS_CLIENT}, and
@ref{a79,,PROTOCOL_TLS_SERVER} use TLS 1.2 as minimum TLS version.


@cartouche
@quotation Note 
@code{SSLContext} only supports limited mutation once it has been used
by a connection. Adding new certificates to the internal trust store is
allowed, but changing ciphers, verification settings, or mTLS
certificates may result in surprising behavior.
@end quotation
@end cartouche

@cartouche
@quotation Note 
@code{SSLContext} is designed to be shared and used by multiple
connections.
Thus, it is thread-safe as long as it is not reconfigured after being
used by a connection.
@end quotation
@end cartouche
@end deffn

@ref{355,,SSLContext} objects have the following methods and attributes:

@geindex cert_store_stats() (ssl.SSLContext method)
@anchor{library/ssl ssl SSLContext cert_store_stats}@anchor{11b2}
@deffn {Method} SSLContext.cert_store_stats ()

Get statistics about quantities of loaded X.509 certificates, count of
X.509 certificates flagged as CA certificates and certificate revocation
lists as dictionary.

Example for a context with one CA cert and one other cert:

@example
>>> context.cert_store_stats()
@{'crl': 0, 'x509_ca': 1, 'x509': 2@}
@end example


Added in version 3.4.

@end deffn

@geindex load_cert_chain() (ssl.SSLContext method)
@anchor{library/ssl ssl SSLContext load_cert_chain}@anchor{598}
@deffn {Method} SSLContext.load_cert_chain (certfile, keyfile=None, password=None)

Load a private key and the corresponding certificate.  The `certfile'
string must be the path to a single file in PEM format containing the
certificate as well as any number of CA certificates needed to establish
the certificate’s authenticity.  The `keyfile' string, if present, must
point to a file containing the private key.  Otherwise the private
key will be taken from `certfile' as well.  See the discussion of
@ref{3a77,,Certificates} for more information on how the certificate
is stored in the `certfile'.

The `password' argument may be a function to call to get the password for
decrypting the private key.  It will only be called if the private key is
encrypted and a password is necessary.  It will be called with no arguments,
and it should return a string, bytes, or bytearray.  If the return value is
a string it will be encoded as UTF-8 before using it to decrypt the key.
Alternatively a string, bytes, or bytearray value may be supplied directly
as the `password' argument.  It will be ignored if the private key is not
encrypted and no password is needed.

If the `password' argument is not specified and a password is required,
OpenSSL’s built-in password prompting mechanism will be used to
interactively prompt the user for a password.

An @ref{1485,,SSLError} is raised if the private key doesn’t
match with the certificate.


Changed in version 3.3: New optional argument `password'.

@end deffn

@geindex load_default_certs() (ssl.SSLContext method)
@anchor{library/ssl ssl SSLContext load_default_certs}@anchor{11b8}
@deffn {Method} SSLContext.load_default_certs (purpose=Purpose.SERVER_AUTH)

Load a set of default “certification authority” (CA) certificates from
default locations. On Windows it loads CA certs from the @code{CA} and
@code{ROOT} system stores. On all systems it calls
@ref{11b1,,SSLContext.set_default_verify_paths()}. In the future the method may
load CA certificates from other locations, too.

The `purpose' flag specifies what kind of CA certificates are loaded. The
default settings @ref{11b9,,Purpose.SERVER_AUTH} loads certificates, that are
flagged and trusted for TLS web server authentication (client side
sockets). @ref{11ba,,Purpose.CLIENT_AUTH} loads CA certificates for client
certificate verification on the server side.


Added in version 3.4.

@end deffn

@geindex load_verify_locations() (ssl.SSLContext method)
@anchor{library/ssl ssl SSLContext load_verify_locations}@anchor{10f4}
@deffn {Method} SSLContext.load_verify_locations (cafile=None, capath=None, cadata=None)

Load a set of “certification authority” (CA) certificates used to validate
other peers’ certificates when @ref{3a35,,verify_mode} is other than
@ref{3a47,,CERT_NONE}.  At least one of `cafile' or `capath' must be specified.

This method can also load certification revocation lists (CRLs) in PEM or
DER format. In order to make use of CRLs, @ref{11b4,,SSLContext.verify_flags}
must be configured properly.

The `cafile' string, if present, is the path to a file of concatenated
CA certificates in PEM format. See the discussion of
@ref{3a77,,Certificates} for more information about how to arrange the
certificates in this file.

The `capath' string, if present, is
the path to a directory containing several CA certificates in PEM format,
following an OpenSSL specific layout@footnote{https://docs.openssl.org/master/man3/SSL_CTX_load_verify_locations/}.

The `cadata' object, if present, is either an ASCII string of one or more
PEM-encoded certificates or a @ref{194,,bytes-like object} of DER-encoded
certificates. Like with `capath' extra lines around PEM-encoded
certificates are ignored but at least one certificate must be present.


Changed in version 3.4: New optional argument `cadata'

@end deffn

@geindex get_ca_certs() (ssl.SSLContext method)
@anchor{library/ssl ssl SSLContext get_ca_certs}@anchor{11b3}
@deffn {Method} SSLContext.get_ca_certs (binary_form=False)

Get a list of loaded “certification authority” (CA) certificates. If the
@code{binary_form} parameter is @ref{d31,,False} each list
entry is a dict like the output of @ref{11be,,SSLSocket.getpeercert()}. Otherwise
the method returns a list of DER-encoded certificates. The returned list
does not contain certificates from `capath' unless a certificate was
requested and loaded by a SSL connection.

@cartouche
@quotation Note 
Certificates in a capath directory aren’t loaded unless they have
been used at least once.
@end quotation
@end cartouche


Added in version 3.4.

@end deffn

@geindex get_ciphers() (ssl.SSLContext method)
@anchor{library/ssl ssl SSLContext get_ciphers}@anchor{ee0}
@deffn {Method} SSLContext.get_ciphers ()

Get a list of enabled ciphers. The list is in order of cipher priority.
See @ref{3a78,,SSLContext.set_ciphers()}.

Example:

@example
>>> ctx = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
>>> ctx.set_ciphers('ECDHE+AESGCM:!ECDSA')
>>> ctx.get_ciphers()
[@{'aead': True,
  'alg_bits': 256,
  'auth': 'auth-rsa',
  'description': 'ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH     Au=RSA  '
                 'Enc=AESGCM(256) Mac=AEAD',
  'digest': None,
  'id': 50380848,
  'kea': 'kx-ecdhe',
  'name': 'ECDHE-RSA-AES256-GCM-SHA384',
  'protocol': 'TLSv1.2',
  'strength_bits': 256,
  'symmetric': 'aes-256-gcm'@},
 @{'aead': True,
  'alg_bits': 128,
  'auth': 'auth-rsa',
  'description': 'ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH     Au=RSA  '
                 'Enc=AESGCM(128) Mac=AEAD',
  'digest': None,
  'id': 50380847,
  'kea': 'kx-ecdhe',
  'name': 'ECDHE-RSA-AES128-GCM-SHA256',
  'protocol': 'TLSv1.2',
  'strength_bits': 128,
  'symmetric': 'aes-128-gcm'@}]
@end example


Added in version 3.6.

@end deffn

@geindex set_default_verify_paths() (ssl.SSLContext method)
@anchor{library/ssl ssl SSLContext set_default_verify_paths}@anchor{11b1}
@deffn {Method} SSLContext.set_default_verify_paths ()

Load a set of default “certification authority” (CA) certificates from
a filesystem path defined when building the OpenSSL library.  Unfortunately,
there’s no easy way to know whether this method succeeds: no error is
returned if no certificates are to be found.  When the OpenSSL library is
provided as part of the operating system, though, it is likely to be
configured properly.
@end deffn

@geindex set_ciphers() (ssl.SSLContext method)
@anchor{library/ssl ssl SSLContext set_ciphers}@anchor{3a78}
@deffn {Method} SSLContext.set_ciphers (ciphers, /)

Set the available ciphers for sockets created with this context.
It should be a string in the OpenSSL cipher list format@footnote{https://docs.openssl.org/master/man1/ciphers/}.
If no cipher can be selected (because compile-time options or other
configuration forbids use of all the specified ciphers), an
@ref{1485,,SSLError} will be raised.

@cartouche
@quotation Note 
when connected, the @ref{3952,,SSLSocket.cipher()} method of SSL sockets will
give the currently selected cipher.

TLS 1.3 cipher suites cannot be disabled with
@code{set_ciphers()}.
@end quotation
@end cartouche
@end deffn

@geindex set_alpn_protocols() (ssl.SSLContext method)
@anchor{library/ssl ssl SSLContext set_alpn_protocols}@anchor{106a}
@deffn {Method} SSLContext.set_alpn_protocols (alpn_protocols)

Specify which protocols the socket should advertise during the SSL/TLS
handshake. It should be a list of ASCII strings, like @code{['http/1.1',
'spdy/2']}, ordered by preference. The selection of a protocol will happen
during the handshake, and will play out according to 
@geindex RFC; RFC 7301
RFC 7301@footnote{https://datatracker.ietf.org/doc/html/rfc7301.html}. After a
successful handshake, the @ref{106b,,SSLSocket.selected_alpn_protocol()} method will
return the agreed-upon protocol.

This method will raise @ref{369,,NotImplementedError} if @ref{106c,,HAS_ALPN} is
@code{False}.


Added in version 3.5.

@end deffn

@geindex set_npn_protocols() (ssl.SSLContext method)
@anchor{library/ssl ssl SSLContext set_npn_protocols}@anchor{356}
@deffn {Method} SSLContext.set_npn_protocols (npn_protocols)

Specify which protocols the socket should advertise during the SSL/TLS
handshake. It should be a list of strings, like @code{['http/1.1', 'spdy/2']},
ordered by preference. The selection of a protocol will happen during the
handshake, and will play out according to the Application Layer Protocol Negotiation@footnote{https://en.wikipedia.org/wiki/Application-Layer_Protocol_Negotiation}. After a
successful handshake, the @ref{a7a,,SSLSocket.selected_npn_protocol()} method will
return the agreed-upon protocol.

This method will raise @ref{369,,NotImplementedError} if @ref{3a5c,,HAS_NPN} is
@code{False}.


Added in version 3.3.



Deprecated since version 3.10: NPN has been superseded by ALPN

@end deffn

@geindex sni_callback (ssl.SSLContext attribute)
@anchor{library/ssl ssl SSLContext sni_callback}@anchor{1774}
@deffn {Attribute} SSLContext.sni_callback

Register a callback function that will be called after the TLS Client Hello
handshake message has been received by the SSL/TLS server when the TLS client
specifies a server name indication. The server name indication mechanism
is specified in 
@geindex RFC; RFC 6066
RFC 6066@footnote{https://datatracker.ietf.org/doc/html/rfc6066.html} section 3 - Server Name Indication.

Only one callback can be set per @code{SSLContext}.  If `sni_callback'
is set to @code{None} then the callback is disabled. Calling this function a
subsequent time will disable the previously registered callback.

The callback function will be called with three
arguments; the first being the @ref{aed,,ssl.SSLSocket}, the second is a string
that represents the server name that the client is intending to communicate
(or @ref{887,,None} if the TLS Client Hello does not contain a server name)
and the third argument is the original @ref{355,,SSLContext}. The server name
argument is text. For internationalized domain name, the server
name is an IDN A-label (@code{"xn--pythn-mua.org"}).

A typical use of this callback is to change the @ref{aed,,ssl.SSLSocket}’s
@ref{3a72,,SSLSocket.context} attribute to a new object of type
@ref{355,,SSLContext} representing a certificate chain that matches the server
name.

Due to the early negotiation phase of the TLS connection, only limited
methods and attributes are usable like
@ref{106b,,SSLSocket.selected_alpn_protocol()} and @ref{3a72,,SSLSocket.context}.
The @ref{11be,,SSLSocket.getpeercert()}, @ref{19a0,,SSLSocket.get_verified_chain()},
@ref{19a1,,SSLSocket.get_unverified_chain()} @ref{3952,,SSLSocket.cipher()}
and @ref{1351,,SSLSocket.compression()} methods require that
the TLS connection has progressed beyond the TLS Client Hello and therefore
will not return meaningful values nor can they be called safely.

The `sni_callback' function must return @code{None} to allow the
TLS negotiation to continue.  If a TLS failure is required, a constant
@ref{3a65,,ALERT_DESCRIPTION_*} can be
returned.  Other return values will result in a TLS fatal error with
@code{ALERT_DESCRIPTION_INTERNAL_ERROR}.

If an exception is raised from the `sni_callback' function the TLS
connection will terminate with a fatal TLS alert message
@ref{3a64,,ALERT_DESCRIPTION_HANDSHAKE_FAILURE}.

This method will raise @ref{369,,NotImplementedError} if the OpenSSL library
had OPENSSL_NO_TLSEXT defined when it was built.


Added in version 3.7.

@end deffn

@geindex set_servername_callback() (ssl.SSLContext method)
@anchor{library/ssl ssl SSLContext set_servername_callback}@anchor{11bd}
@deffn {Method} SSLContext.set_servername_callback (server_name_callback)

This is a legacy API retained for backwards compatibility. When possible,
you should use @ref{1774,,sni_callback} instead. The given `server_name_callback'
is similar to `sni_callback', except that when the server hostname is an
IDN-encoded internationalized domain name, the `server_name_callback'
receives a decoded U-label (@code{"pythön.org"}).

If there is a decoding error on the server name, the TLS connection will
terminate with an @ref{3a65,,ALERT_DESCRIPTION_INTERNAL_ERROR} fatal TLS
alert message to the client.


Added in version 3.4.

@end deffn

@geindex load_dh_params() (ssl.SSLContext method)
@anchor{library/ssl ssl SSLContext load_dh_params}@anchor{134e}
@deffn {Method} SSLContext.load_dh_params (dhfile, /)

Load the key generation parameters for Diffie-Hellman (DH) key exchange.
Using DH key exchange improves forward secrecy at the expense of
computational resources (both on the server and on the client).
The `dhfile' parameter should be the path to a file containing DH
parameters in PEM format.

This setting doesn’t apply to client sockets.  You can also use the
@ref{3a54,,OP_SINGLE_DH_USE} option to further improve security.


Added in version 3.3.

@end deffn

@geindex set_ecdh_curve() (ssl.SSLContext method)
@anchor{library/ssl ssl SSLContext set_ecdh_curve}@anchor{134f}
@deffn {Method} SSLContext.set_ecdh_curve (curve_name, /)

Set the curve name for Elliptic Curve-based Diffie-Hellman (ECDH) key
exchange.  ECDH is significantly faster than regular DH while arguably
as secure.  The `curve_name' parameter should be a string describing
a well-known elliptic curve, for example @code{prime256v1} for a widely
supported curve.

This setting doesn’t apply to client sockets.  You can also use the
@ref{3a55,,OP_SINGLE_ECDH_USE} option to further improve security.

This method is not available if @ref{3a5a,,HAS_ECDH} is @code{False}.


Added in version 3.3.



@subsubheading See also



@table @asis

@item SSL/TLS & Perfect Forward Secrecy@footnote{https://vincent.bernat.ch/en/blog/2011-ssl-perfect-forward-secrecy}

Vincent Bernat.
@end table

@end deffn

@geindex wrap_socket() (ssl.SSLContext method)
@anchor{library/ssl ssl SSLContext wrap_socket}@anchor{749}
@deffn {Method} SSLContext.wrap_socket (sock, server_side=False, do_handshake_on_connect=True, suppress_ragged_eofs=True, server_hostname=None, session=None)

Wrap an existing Python socket `sock' and return an instance of
@ref{3a79,,SSLContext.sslsocket_class} (default @ref{aed,,SSLSocket}). The
returned SSL socket is tied to the context, its settings and certificates.
`sock' must be a @ref{14ff,,SOCK_STREAM} socket; other
socket types are unsupported.

The parameter @code{server_side} is a boolean which identifies whether
server-side or client-side behavior is desired from this socket.

For client-side sockets, the context construction is lazy; if the
underlying socket isn’t connected yet, the context construction will be
performed after @code{connect()} is called on the socket.  For
server-side sockets, if the socket has no remote peer, it is assumed
to be a listening socket, and the server-side SSL wrapping is
automatically performed on client connections accepted via the
@code{accept()} method. The method may raise @ref{1485,,SSLError}.

On client connections, the optional parameter `server_hostname' specifies
the hostname of the service which we are connecting to.  This allows a
single server to host multiple SSL-based services with distinct certificates,
quite similarly to HTTP virtual hosts. Specifying `server_hostname' will
raise a @ref{2ee,,ValueError} if `server_side' is true.

The parameter @code{do_handshake_on_connect} specifies whether to do the SSL
handshake automatically after doing a @code{socket.connect()}, or whether the
application program will call it explicitly, by invoking the
@ref{1073,,SSLSocket.do_handshake()} method.  Calling
@code{SSLSocket.do_handshake()} explicitly gives the program control over the
blocking behavior of the socket I/O involved in the handshake.

The parameter @code{suppress_ragged_eofs} specifies how the
@code{SSLSocket.recv()} method should signal unexpected EOF from the other end
of the connection.  If specified as @ref{e0d,,True} (the default), it returns a
normal EOF (an empty bytes object) in response to unexpected EOF errors
raised from the underlying socket; if @ref{d31,,False}, it will raise the
exceptions back to the caller.

`session', see @ref{1981,,session}.

To wrap an @ref{aed,,SSLSocket} in another @code{SSLSocket}, use
@ref{d81,,SSLContext.wrap_bio()}.


Changed in version 3.5: Always allow a server_hostname to be passed, even if OpenSSL does not
have SNI.



Changed in version 3.6: `session' argument was added.



Changed in version 3.7: The method returns an instance of @ref{3a79,,SSLContext.sslsocket_class}
instead of hard-coded @ref{aed,,SSLSocket}.

@end deffn

@geindex sslsocket_class (ssl.SSLContext attribute)
@anchor{library/ssl ssl SSLContext sslsocket_class}@anchor{3a79}
@deffn {Attribute} SSLContext.sslsocket_class

The return type of @ref{749,,SSLContext.wrap_socket()}, defaults to
@ref{aed,,SSLSocket}. The attribute can be assigned to on instances of
@ref{355,,SSLContext} in order to return a custom subclass of
@code{SSLSocket}.


Added in version 3.7.

@end deffn

@geindex wrap_bio() (ssl.SSLContext method)
@anchor{library/ssl ssl SSLContext wrap_bio}@anchor{d81}
@deffn {Method} SSLContext.wrap_bio (incoming, outgoing, server_side=False, server_hostname=None, session=None)

Wrap the BIO objects `incoming' and `outgoing' and return an instance of
@ref{3a7a,,SSLContext.sslobject_class} (default @ref{d80,,SSLObject}). The SSL
routines will read input data from the incoming BIO and write data to the
outgoing BIO.

The `server_side', `server_hostname' and `session' parameters have the
same meaning as in @ref{749,,SSLContext.wrap_socket()}.


Changed in version 3.6: `session' argument was added.



Changed in version 3.7: The method returns an instance of @ref{3a7a,,SSLContext.sslobject_class}
instead of hard-coded @ref{d80,,SSLObject}.

@end deffn

@geindex sslobject_class (ssl.SSLContext attribute)
@anchor{library/ssl ssl SSLContext sslobject_class}@anchor{3a7a}
@deffn {Attribute} SSLContext.sslobject_class

The return type of @ref{d81,,SSLContext.wrap_bio()}, defaults to
@ref{d80,,SSLObject}. The attribute can be overridden on instance of class
in order to return a custom subclass of @code{SSLObject}.


Added in version 3.7.

@end deffn

@geindex session_stats() (ssl.SSLContext method)
@anchor{library/ssl ssl SSLContext session_stats}@anchor{3a7b}
@deffn {Method} SSLContext.session_stats ()

Get statistics about the SSL sessions created or managed by this context.
A dictionary is returned which maps the names of each piece of information@footnote{https://docs.openssl.org/1.1.1/man3/SSL_CTX_sess_number/} to their
numeric values.  For example, here is the total number of hits and misses
in the session cache since the context was created:

@example
>>> stats = context.session_stats()
>>> stats['hits'], stats['misses']
(0, 0)
@end example
@end deffn

@geindex check_hostname (ssl.SSLContext attribute)
@anchor{library/ssl ssl SSLContext check_hostname}@anchor{3a49}
@deffn {Attribute} SSLContext.check_hostname

Whether to match the peer cert’s hostname in
@ref{1073,,SSLSocket.do_handshake()}. The context’s
@ref{3a35,,verify_mode} must be set to @ref{3a48,,CERT_OPTIONAL} or
@ref{3a36,,CERT_REQUIRED}, and you must pass `server_hostname' to
@ref{749,,wrap_socket()} in order to match the hostname.  Enabling
hostname checking automatically sets @code{verify_mode} from
@ref{3a47,,CERT_NONE} to @code{CERT_REQUIRED}.  It cannot be set back to
@code{CERT_NONE} as long as hostname checking is enabled. The
@ref{a78,,PROTOCOL_TLS_CLIENT} protocol enables hostname checking by default.
With other protocols, hostname checking must be enabled explicitly.

Example:

@example
import socket, ssl

context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
context.verify_mode = ssl.CERT_REQUIRED
context.check_hostname = True
context.load_default_certs()

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ssl_sock = context.wrap_socket(s, server_hostname='www.verisign.com')
ssl_sock.connect(('www.verisign.com', 443))
@end example


Added in version 3.4.



Changed in version 3.7: @ref{3a35,,verify_mode} is now automatically changed
to @ref{3a36,,CERT_REQUIRED}  when hostname checking is enabled and
@code{verify_mode} is @ref{3a47,,CERT_NONE}. Previously
the same operation would have failed with a @ref{2ee,,ValueError}.

@end deffn

@geindex keylog_filename (ssl.SSLContext attribute)
@anchor{library/ssl ssl SSLContext keylog_filename}@anchor{3a37}
@deffn {Attribute} SSLContext.keylog_filename

Write TLS keys to a keylog file, whenever key material is generated or
received. The keylog file is designed for debugging purposes only. The
file format is specified by NSS and used by many traffic analyzers such
as Wireshark. The log file is opened in append-only mode. Writes are
synchronized between threads, but not between processes.


Added in version 3.8.

@end deffn

@geindex maximum_version (ssl.SSLContext attribute)
@anchor{library/ssl ssl SSLContext maximum_version}@anchor{a77}
@deffn {Attribute} SSLContext.maximum_version

A @ref{3a68,,TLSVersion} enum member representing the highest supported
TLS version. The value defaults to @ref{3a6a,,TLSVersion.MAXIMUM_SUPPORTED}.
The attribute is read-only for protocols other than @ref{3a38,,PROTOCOL_TLS},
@ref{a78,,PROTOCOL_TLS_CLIENT}, and @ref{a79,,PROTOCOL_TLS_SERVER}.

The attributes @code{maximum_version},
@ref{a76,,minimum_version} and
@ref{a3f,,SSLContext.options} all affect the supported SSL
and TLS versions of the context. The implementation does not prevent
invalid combinations. For example a context with
@ref{3a52,,OP_NO_TLSv1_2} in @code{options} and
@code{maximum_version} set to @ref{3a6e,,TLSVersion.TLSv1_2}
will not be able to establish a TLS 1.2 connection.


Added in version 3.7.

@end deffn

@geindex minimum_version (ssl.SSLContext attribute)
@anchor{library/ssl ssl SSLContext minimum_version}@anchor{a76}
@deffn {Attribute} SSLContext.minimum_version

Like @ref{a77,,SSLContext.maximum_version} except it is the lowest
supported version or @ref{3a69,,TLSVersion.MINIMUM_SUPPORTED}.


Added in version 3.7.

@end deffn

@geindex num_tickets (ssl.SSLContext attribute)
@anchor{library/ssl ssl SSLContext num_tickets}@anchor{3a7c}
@deffn {Attribute} SSLContext.num_tickets

Control the number of TLS 1.3 session tickets of a
@ref{a79,,PROTOCOL_TLS_SERVER} context. The setting has no impact on TLS
1.0 to 1.2 connections.


Added in version 3.8.

@end deffn

@geindex options (ssl.SSLContext attribute)
@anchor{library/ssl ssl SSLContext options}@anchor{a3f}
@deffn {Attribute} SSLContext.options

An integer representing the set of SSL options enabled on this context.
The default value is @ref{3a4f,,OP_ALL}, but you can specify other options
such as @ref{a40,,OP_NO_SSLv2} by ORing them together.


Changed in version 3.6: @code{SSLContext.options} returns @ref{3a57,,Options} flags:

@example
>>> ssl.create_default_context().options
<Options.OP_ALL|OP_NO_SSLv3|OP_NO_SSLv2|OP_NO_COMPRESSION: 2197947391>
@end example



Deprecated since version 3.7: All @code{OP_NO_SSL*} and @code{OP_NO_TLS*} options have been deprecated since
Python 3.7. Use @ref{a76,,SSLContext.minimum_version} and
@ref{a77,,SSLContext.maximum_version} instead.

@end deffn

@geindex post_handshake_auth (ssl.SSLContext attribute)
@anchor{library/ssl ssl SSLContext post_handshake_auth}@anchor{c2c}
@deffn {Attribute} SSLContext.post_handshake_auth

Enable TLS 1.3 post-handshake client authentication. Post-handshake auth
is disabled by default and a server can only request a TLS client
certificate during the initial handshake. When enabled, a server may
request a TLS client certificate at any time after the handshake.

When enabled on client-side sockets, the client signals the server that
it supports post-handshake authentication.

When enabled on server-side sockets, @ref{3a35,,SSLContext.verify_mode} must
be set to @ref{3a48,,CERT_OPTIONAL} or @ref{3a36,,CERT_REQUIRED}, too. The
actual client cert exchange is delayed until
@ref{c2d,,SSLSocket.verify_client_post_handshake()} is called and some I/O is
performed.


Added in version 3.8.

@end deffn

@geindex protocol (ssl.SSLContext attribute)
@anchor{library/ssl ssl SSLContext protocol}@anchor{3a7d}
@deffn {Attribute} SSLContext.protocol

The protocol version chosen when constructing the context.  This attribute
is read-only.
@end deffn

@geindex hostname_checks_common_name (ssl.SSLContext attribute)
@anchor{library/ssl ssl SSLContext hostname_checks_common_name}@anchor{d7c}
@deffn {Attribute} SSLContext.hostname_checks_common_name

Whether @ref{3a49,,check_hostname} falls back to verify the cert’s
subject common name in the absence of a subject alternative name
extension (default: true).


Added in version 3.7.



Changed in version 3.10: The flag had no effect with OpenSSL before version 1.1.1l. Python 3.8.9,
3.9.3, and 3.10 include workarounds for previous versions.

@end deffn

@geindex security_level (ssl.SSLContext attribute)
@anchor{library/ssl ssl SSLContext security_level}@anchor{3a7e}
@deffn {Attribute} SSLContext.security_level

An integer representing the security level@footnote{https://docs.openssl.org/master/man3/SSL_CTX_get_security_level/}
for the context. This attribute is read-only.


Added in version 3.10.

@end deffn

@geindex verify_flags (ssl.SSLContext attribute)
@anchor{library/ssl ssl SSLContext verify_flags}@anchor{11b4}
@deffn {Attribute} SSLContext.verify_flags

The flags for certificate verification operations. You can set flags like
@ref{11b6,,VERIFY_CRL_CHECK_LEAF} by ORing them together. By default OpenSSL
does neither require nor verify certificate revocation lists (CRLs).


Added in version 3.4.



Changed in version 3.6: @code{SSLContext.verify_flags} returns @ref{3a4c,,VerifyFlags} flags:

@example
>>> ssl.create_default_context().verify_flags
<VerifyFlags.VERIFY_X509_TRUSTED_FIRST: 32768>
@end example

@end deffn

@geindex verify_mode (ssl.SSLContext attribute)
@anchor{library/ssl ssl SSLContext verify_mode}@anchor{3a35}
@deffn {Attribute} SSLContext.verify_mode

Whether to try to verify other peers’ certificates and how to behave
if verification fails.  This attribute must be one of
@ref{3a47,,CERT_NONE}, @ref{3a48,,CERT_OPTIONAL} or @ref{3a36,,CERT_REQUIRED}.


Changed in version 3.6: @code{SSLContext.verify_mode} returns @ref{3a4a,,VerifyMode} enum:

@example
>>> ssl.create_default_context().verify_mode
<VerifyMode.CERT_REQUIRED: 2>
@end example

@end deffn

@geindex set_psk_client_callback() (ssl.SSLContext method)
@anchor{library/ssl ssl SSLContext set_psk_client_callback}@anchor{3a7f}
@deffn {Method} SSLContext.set_psk_client_callback (callback)

Enables TLS-PSK (pre-shared key) authentication on a client-side connection.

In general, certificate based authentication should be preferred over this method.

The parameter @code{callback} is a callable object with the signature:
@code{def callback(hint: str | None) -> tuple[str | None, bytes]}.
The @code{hint} parameter is an optional identity hint sent by the server.
The return value is a tuple in the form (client-identity, psk).
Client-identity is an optional string which may be used by the server to
select a corresponding PSK for the client. The string must be less than or
equal to @code{256} octets when UTF-8 encoded. PSK is a
@ref{194,,bytes-like object} representing the pre-shared key. Return a zero
length PSK to reject the connection.

Setting @code{callback} to @ref{887,,None} removes any existing callback.

@cartouche
@quotation Note 
When using TLS 1.3:


@itemize -

@item 
the @code{hint} parameter is always @ref{887,,None}.

@item 
client-identity must be a non-empty string.
@end itemize
@end quotation
@end cartouche

Example usage:

@example
context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
context.check_hostname = False
context.verify_mode = ssl.CERT_NONE
context.maximum_version = ssl.TLSVersion.TLSv1_2
context.set_ciphers('PSK')

# A simple lambda:
psk = bytes.fromhex('c0ffee')
context.set_psk_client_callback(lambda hint: (None, psk))

# A table using the hint from the server:
psk_table = @{ 'ServerId_1': bytes.fromhex('c0ffee'),
              'ServerId_2': bytes.fromhex('facade')
@}
def callback(hint):
    return 'ClientId_1', psk_table.get(hint, b'@w{'})
context.set_psk_client_callback(callback)
@end example

This method will raise @ref{369,,NotImplementedError} if @ref{3a62,,HAS_PSK} is
@code{False}.


Added in version 3.13.

@end deffn

@geindex set_psk_server_callback() (ssl.SSLContext method)
@anchor{library/ssl ssl SSLContext set_psk_server_callback}@anchor{3a80}
@deffn {Method} SSLContext.set_psk_server_callback (callback, identity_hint=None)

Enables TLS-PSK (pre-shared key) authentication on a server-side connection.

In general, certificate based authentication should be preferred over this method.

The parameter @code{callback} is a callable object with the signature:
@code{def callback(identity: str | None) -> bytes}.
The @code{identity} parameter is an optional identity sent by the client which can
be used to select a corresponding PSK.
The return value is a @ref{194,,bytes-like object} representing the pre-shared key.
Return a zero length PSK to reject the connection.

Setting @code{callback} to @ref{887,,None} removes any existing callback.

The parameter @code{identity_hint} is an optional identity hint string sent to
the client. The string must be less than or equal to @code{256} octets when
UTF-8 encoded.

@cartouche
@quotation Note 
When using TLS 1.3 the @code{identity_hint} parameter is not sent to the client.
@end quotation
@end cartouche

Example usage:

@example
context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
context.maximum_version = ssl.TLSVersion.TLSv1_2
context.set_ciphers('PSK')

# A simple lambda:
psk = bytes.fromhex('c0ffee')
context.set_psk_server_callback(lambda identity: psk)

# A table using the identity of the client:
psk_table = @{ 'ClientId_1': bytes.fromhex('c0ffee'),
              'ClientId_2': bytes.fromhex('facade')
@}
def callback(identity):
    return psk_table.get(identity, b'@w{'})
context.set_psk_server_callback(callback, 'ServerId_1')
@end example

This method will raise @ref{369,,NotImplementedError} if @ref{3a62,,HAS_PSK} is
@code{False}.


Added in version 3.13.

@end deffn

@geindex certificates

@geindex X509 certificate

@node Certificates,Examples<21>,SSL contexts,ssl — TLS/SSL wrapper for socket objects
@anchor{library/ssl certificates}@anchor{3a81}@anchor{library/ssl ssl-certificates}@anchor{3a77}
@subsubsection Certificates


Certificates in general are part of a public-key / private-key system.  In this
system, each `principal', (which may be a machine, or a person, or an
organization) is assigned a unique two-part encryption key.  One part of the key
is public, and is called the `public key'; the other part is kept secret, and is
called the `private key'.  The two parts are related, in that if you encrypt a
message with one of the parts, you can decrypt it with the other part, and
`only' with the other part.

A certificate contains information about two principals.  It contains the name
of a `subject', and the subject’s public key.  It also contains a statement by a
second principal, the `issuer', that the subject is who they claim to be, and
that this is indeed the subject’s public key.  The issuer’s statement is signed
with the issuer’s private key, which only the issuer knows.  However, anyone can
verify the issuer’s statement by finding the issuer’s public key, decrypting the
statement with it, and comparing it to the other information in the certificate.
The certificate also contains information about the time period over which it is
valid.  This is expressed as two fields, called “notBefore” and “notAfter”.

In the Python use of certificates, a client or server can use a certificate to
prove who they are.  The other side of a network connection can also be required
to produce a certificate, and that certificate can be validated to the
satisfaction of the client or server that requires such validation.  The
connection attempt can be set to raise an exception if the validation fails.
Validation is done automatically, by the underlying OpenSSL framework; the
application need not concern itself with its mechanics.  But the application
does usually need to provide sets of certificates to allow this process to take
place.

Python uses files to contain certificates.  They should be formatted as “PEM”
(see 
@geindex RFC; RFC 1422
RFC 1422@footnote{https://datatracker.ietf.org/doc/html/rfc1422.html}), which is a base-64 encoded form wrapped with a header line
and a footer line:

@example
-----BEGIN CERTIFICATE-----
... (certificate in base64 PEM encoding) ...
-----END CERTIFICATE-----
@end example

@menu
* Certificate chains:: 
* CA certificates:: 
* Combined key and certificate:: 
* Self-signed certificates:: 

@end menu

@node Certificate chains,CA certificates,,Certificates
@anchor{library/ssl certificate-chains}@anchor{3a82}
@subsubsection Certificate chains


The Python files which contain certificates can contain a sequence of
certificates, sometimes called a `certificate chain'.  This chain should start
with the specific certificate for the principal who “is” the client or server,
and then the certificate for the issuer of that certificate, and then the
certificate for the issuer of `that' certificate, and so on up the chain till
you get to a certificate which is `self-signed', that is, a certificate which
has the same subject and issuer, sometimes called a `root certificate'.  The
certificates should just be concatenated together in the certificate file.  For
example, suppose we had a three certificate chain, from our server certificate
to the certificate of the certification authority that signed our server
certificate, to the root certificate of the agency which issued the
certification authority’s certificate:

@example
-----BEGIN CERTIFICATE-----
... (certificate for your server)...
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
... (the certificate for the CA)...
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
... (the root certificate for the CA's issuer)...
-----END CERTIFICATE-----
@end example

@node CA certificates,Combined key and certificate,Certificate chains,Certificates
@anchor{library/ssl ca-certificates}@anchor{3a83}
@subsubsection CA certificates


If you are going to require validation of the other side of the connection’s
certificate, you need to provide a “CA certs” file, filled with the certificate
chains for each issuer you are willing to trust.  Again, this file just contains
these chains concatenated together.  For validation, Python will use the first
chain it finds in the file which matches.  The platform’s certificates file can
be used by calling @ref{11b8,,SSLContext.load_default_certs()}, this is done
automatically with @ref{480,,create_default_context()}.

@node Combined key and certificate,Self-signed certificates,CA certificates,Certificates
@anchor{library/ssl combined-key-and-certificate}@anchor{3a84}
@subsubsection Combined key and certificate


Often the private key is stored in the same file as the certificate; in this
case, only the @code{certfile} parameter to @ref{598,,SSLContext.load_cert_chain()}
needs to be passed.  If the private key is stored
with the certificate, it should come before the first certificate in
the certificate chain:

@example
-----BEGIN RSA PRIVATE KEY-----
... (private key in base64 encoding) ...
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
... (certificate in base64 PEM encoding) ...
-----END CERTIFICATE-----
@end example

@node Self-signed certificates,,Combined key and certificate,Certificates
@anchor{library/ssl self-signed-certificates}@anchor{3a85}
@subsubsection Self-signed certificates


If you are going to create a server that provides SSL-encrypted connection
services, you will need to acquire a certificate for that service.  There are
many ways of acquiring appropriate certificates, such as buying one from a
certification authority.  Another common practice is to generate a self-signed
certificate.  The simplest way to do this is with the OpenSSL package, using
something like the following:

@example
% openssl req -new -x509 -days 365 -nodes -out cert.pem -keyout cert.pem
Generating a 1024 bit RSA private key
.......++++++
.............................++++++
writing new private key to 'cert.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:MyState
Locality Name (eg, city) []:Some City
Organization Name (eg, company) [Internet Widgits Pty Ltd]:My Organization, Inc.
Organizational Unit Name (eg, section) []:My Group
Common Name (eg, YOUR name) []:myserver.mygroup.myorganization.com
Email Address []:ops@@myserver.mygroup.myorganization.com
%
@end example

The disadvantage of a self-signed certificate is that it is its own root
certificate, and no one else will have it in their cache of known (and trusted)
root certificates.

@node Examples<21>,Notes on non-blocking sockets,Certificates,ssl — TLS/SSL wrapper for socket objects
@anchor{library/ssl examples}@anchor{3a86}
@subsubsection Examples


@menu
* Testing for SSL support:: 
* Client-side operation:: 
* Server-side operation:: 

@end menu

@node Testing for SSL support,Client-side operation,,Examples<21>
@anchor{library/ssl testing-for-ssl-support}@anchor{3a87}
@subsubsection Testing for SSL support


To test for the presence of SSL support in a Python installation, user code
should use the following idiom:

@example
try:
    import ssl
except ImportError:
    pass
else:
    ...  # do something that requires SSL support
@end example

@node Client-side operation,Server-side operation,Testing for SSL support,Examples<21>
@anchor{library/ssl client-side-operation}@anchor{3a88}
@subsubsection Client-side operation


This example creates a SSL context with the recommended security settings
for client sockets, including automatic certificate verification:

@example
>>> context = ssl.create_default_context()
@end example

If you prefer to tune security settings yourself, you might create
a context from scratch (but beware that you might not get the settings
right):

@example
>>> context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
>>> context.load_verify_locations("/etc/ssl/certs/ca-bundle.crt")
@end example

(this snippet assumes your operating system places a bundle of all CA
certificates in @code{/etc/ssl/certs/ca-bundle.crt}; if not, you’ll get an
error and have to adjust the location)

The @ref{a78,,PROTOCOL_TLS_CLIENT} protocol configures the context for cert
validation and hostname verification. @ref{3a35,,verify_mode} is
set to @ref{3a36,,CERT_REQUIRED} and @ref{3a49,,check_hostname} is set
to @code{True}. All other protocols create SSL contexts with insecure defaults.

When you use the context to connect to a server, @ref{3a36,,CERT_REQUIRED}
and @ref{3a49,,check_hostname} validate the server certificate: it
ensures that the server certificate was signed with one of the CA
certificates, checks the signature for correctness, and verifies other
properties like validity and identity of the hostname:

@example
>>> conn = context.wrap_socket(socket.socket(socket.AF_INET),
...                            server_hostname="www.python.org")
>>> conn.connect(("www.python.org", 443))
@end example

You may then fetch the certificate:

@example
>>> cert = conn.getpeercert()
@end example

Visual inspection shows that the certificate does identify the desired service
(that is, the HTTPS host @code{www.python.org}):

@example
>>> pprint.pprint(cert)
@{'OCSP': ('http://ocsp.digicert.com',),
 'caIssuers': ('http://cacerts.digicert.com/DigiCertSHA2ExtendedValidationServerCA.crt',),
 'crlDistributionPoints': ('http://crl3.digicert.com/sha2-ev-server-g1.crl',
                           'http://crl4.digicert.com/sha2-ev-server-g1.crl'),
 'issuer': ((('countryName', 'US'),),
            (('organizationName', 'DigiCert Inc'),),
            (('organizationalUnitName', 'www.digicert.com'),),
            (('commonName', 'DigiCert SHA2 Extended Validation Server CA'),)),
 'notAfter': 'Sep  9 12:00:00 2016 GMT',
 'notBefore': 'Sep  5 00:00:00 2014 GMT',
 'serialNumber': '01BB6F00122B177F36CAB49CEA8B6B26',
 'subject': ((('businessCategory', 'Private Organization'),),
             (('1.3.6.1.4.1.311.60.2.1.3', 'US'),),
             (('1.3.6.1.4.1.311.60.2.1.2', 'Delaware'),),
             (('serialNumber', '3359300'),),
             (('streetAddress', '16 Allen Rd'),),
             (('postalCode', '03894-4801'),),
             (('countryName', 'US'),),
             (('stateOrProvinceName', 'NH'),),
             (('localityName', 'Wolfeboro'),),
             (('organizationName', 'Python Software Foundation'),),
             (('commonName', 'www.python.org'),)),
 'subjectAltName': (('DNS', 'www.python.org'),
                    ('DNS', 'python.org'),
                    ('DNS', 'pypi.org'),
                    ('DNS', 'docs.python.org'),
                    ('DNS', 'testpypi.org'),
                    ('DNS', 'bugs.python.org'),
                    ('DNS', 'wiki.python.org'),
                    ('DNS', 'hg.python.org'),
                    ('DNS', 'mail.python.org'),
                    ('DNS', 'packaging.python.org'),
                    ('DNS', 'pythonhosted.org'),
                    ('DNS', 'www.pythonhosted.org'),
                    ('DNS', 'test.pythonhosted.org'),
                    ('DNS', 'us.pycon.org'),
                    ('DNS', 'id.python.org')),
 'version': 3@}
@end example

Now the SSL channel is established and the certificate verified, you can
proceed to talk with the server:

@example
>>> conn.sendall(b"HEAD / HTTP/1.0\r\nHost: linuxfr.org\r\n\r\n")
>>> pprint.pprint(conn.recv(1024).split(b"\r\n"))
[b'HTTP/1.1 200 OK',
 b'Date: Sat, 18 Oct 2014 18:27:20 GMT',
 b'Server: nginx',
 b'Content-Type: text/html; charset=utf-8',
 b'X-Frame-Options: SAMEORIGIN',
 b'Content-Length: 45679',
 b'Accept-Ranges: bytes',
 b'Via: 1.1 varnish',
 b'Age: 2188',
 b'X-Served-By: cache-lcy1134-LCY',
 b'X-Cache: HIT',
 b'X-Cache-Hits: 11',
 b'Vary: Cookie',
 b'Strict-Transport-Security: max-age=63072000; includeSubDomains',
 b'Connection: close',
 b'@w{'},
 b'@w{'}]
@end example

See the discussion of @ref{390d,,Security considerations} below.

@node Server-side operation,,Client-side operation,Examples<21>
@anchor{library/ssl server-side-operation}@anchor{3a89}
@subsubsection Server-side operation


For server operation, typically you’ll need to have a server certificate, and
private key, each in a file.  You’ll first create a context holding the key
and the certificate, so that clients can check your authenticity.  Then
you’ll open a socket, bind it to a port, call @code{listen()} on it, and start
waiting for clients to connect:

@example
import socket, ssl

context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
context.load_cert_chain(certfile="mycertfile", keyfile="mykeyfile")

bindsocket = socket.socket()
bindsocket.bind(('myaddr.example.com', 10023))
bindsocket.listen(5)
@end example

When a client connects, you’ll call @code{accept()} on the socket to get the
new socket from the other end, and use the context’s @ref{749,,SSLContext.wrap_socket()}
method to create a server-side SSL socket for the connection:

@example
while True:
    newsocket, fromaddr = bindsocket.accept()
    connstream = context.wrap_socket(newsocket, server_side=True)
    try:
        deal_with_client(connstream)
    finally:
        connstream.shutdown(socket.SHUT_RDWR)
        connstream.close()
@end example

Then you’ll read data from the @code{connstream} and do something with it till you
are finished with the client (or the client is finished with you):

@example
def deal_with_client(connstream):
    data = connstream.recv(1024)
    # empty data means the client is finished with us
    while data:
        if not do_something(connstream, data):
            # we'll assume do_something returns False
            # when we're finished with client
            break
        data = connstream.recv(1024)
    # finished with client
@end example

And go back to listening for new client connections (of course, a real server
would probably handle each client connection in a separate thread, or put
the sockets in @ref{3a3b,,non-blocking mode} and use an event loop).

@node Notes on non-blocking sockets,Memory BIO support,Examples<21>,ssl — TLS/SSL wrapper for socket objects
@anchor{library/ssl notes-on-non-blocking-sockets}@anchor{3a8a}@anchor{library/ssl ssl-nonblocking}@anchor{3a3b}
@subsubsection Notes on non-blocking sockets


SSL sockets behave slightly different than regular sockets in
non-blocking mode. When working with non-blocking sockets, there are
thus several things you need to be aware of:


@itemize -

@item 
Most @ref{aed,,SSLSocket} methods will raise either
@ref{1070,,SSLWantWriteError} or @ref{106f,,SSLWantReadError} instead of
@ref{237,,BlockingIOError} if an I/O operation would
block. @code{SSLWantReadError} will be raised if a read operation on
the underlying socket is necessary, and @code{SSLWantWriteError} for
a write operation on the underlying socket. Note that attempts to
`write' to an SSL socket may require `reading' from the underlying
socket first, and attempts to `read' from the SSL socket may require
a prior `write' to the underlying socket.


Changed in version 3.5: In earlier Python versions, the @code{SSLSocket.send()} method
returned zero instead of raising @ref{1070,,SSLWantWriteError} or
@ref{106f,,SSLWantReadError}.


@item 
Calling @ref{fa6,,select()} tells you that the OS-level socket can be
read from (or written to), but it does not imply that there is sufficient
data at the upper SSL layer.  For example, only part of an SSL frame might
have arrived.  Therefore, you must be ready to handle @code{SSLSocket.recv()}
and @code{SSLSocket.send()} failures, and retry after another call to
@code{select()}.

@item 
Conversely, since the SSL layer has its own framing, a SSL socket may
still have data available for reading without @ref{fa6,,select()}
being aware of it.  Therefore, you should first call
@code{SSLSocket.recv()} to drain any potentially available data, and then
only block on a @code{select()} call if still necessary.

(of course, similar provisions apply when using other primitives such as
@ref{3119,,poll()}, or those in the @ref{c7,,selectors} module)

@item 
The SSL handshake itself will be non-blocking: the
@ref{1073,,SSLSocket.do_handshake()} method has to be retried until it returns
successfully.  Here is a synopsis using @ref{fa6,,select()} to wait for
the socket’s readiness:

@example
while True:
    try:
        sock.do_handshake()
        break
    except ssl.SSLWantReadError:
        select.select([sock], [], [])
    except ssl.SSLWantWriteError:
        select.select([], [sock], [])
@end example
@end itemize


@subsubheading See also


The @ref{b,,asyncio} module supports @ref{3a3b,,non-blocking SSL sockets} and provides a higher level @ref{3831,,Streams API}.
It polls for events using the @ref{c7,,selectors} module and
handles @ref{1070,,SSLWantWriteError}, @ref{106f,,SSLWantReadError} and
@ref{237,,BlockingIOError} exceptions. It runs the SSL handshake asynchronously
as well.


@node Memory BIO support,SSL session,Notes on non-blocking sockets,ssl — TLS/SSL wrapper for socket objects
@anchor{library/ssl memory-bio-support}@anchor{3a8b}
@subsubsection Memory BIO support



Added in version 3.5.


Ever since the SSL module was introduced in Python 2.6, the @ref{aed,,SSLSocket}
class has provided two related but distinct areas of functionality:


@itemize -

@item 
SSL protocol handling

@item 
Network IO
@end itemize

The network IO API is identical to that provided by @ref{fa7,,socket.socket},
from which @ref{aed,,SSLSocket} also inherits. This allows an SSL socket to be
used as a drop-in replacement for a regular socket, making it very easy to add
SSL support to an existing application.

Combining SSL protocol handling and network IO usually works well, but there
are some cases where it doesn’t. An example is async IO frameworks that want to
use a different IO multiplexing model than the “select/poll on a file
descriptor” (readiness based) model that is assumed by @ref{fa7,,socket.socket}
and by the internal OpenSSL socket IO routines. This is mostly relevant for
platforms like Windows where this model is not efficient. For this purpose, a
reduced scope variant of @ref{aed,,SSLSocket} called @ref{d80,,SSLObject} is
provided.

@geindex SSLObject (class in ssl)
@anchor{library/ssl ssl SSLObject}@anchor{d80}
@deffn {Class} ssl.SSLObject

A reduced-scope variant of @ref{aed,,SSLSocket} representing an SSL protocol
instance that does not contain any network IO methods. This class is
typically used by framework authors that want to implement asynchronous IO
for SSL through memory buffers.

This class implements an interface on top of a low-level SSL object as
implemented by OpenSSL. This object captures the state of an SSL connection
but does not provide any network IO itself. IO needs to be performed through
separate “BIO” objects which are OpenSSL’s IO abstraction layer.

This class has no public constructor.  An @code{SSLObject} instance
must be created using the @ref{d81,,wrap_bio()} method. This
method will create the @code{SSLObject} instance and bind it to a
pair of BIOs. The `incoming' BIO is used to pass data from Python to the
SSL protocol instance, while the `outgoing' BIO is used to pass data the
other way around.

The following methods are available:


@itemize -

@item 
@ref{3a72,,context}

@item 
@ref{3a74,,server_side}

@item 
@ref{d7e,,server_hostname}

@item 
@ref{1981,,session}

@item 
@ref{3a75,,session_reused}

@item 
@ref{1074,,read()}

@item 
@ref{1075,,write()}

@item 
@ref{11be,,getpeercert()}

@item 
@ref{19a0,,get_verified_chain()}

@item 
@ref{19a1,,get_unverified_chain()}

@item 
@ref{106b,,selected_alpn_protocol()}

@item 
@ref{a7a,,selected_npn_protocol()}

@item 
@ref{3952,,cipher()}

@item 
@ref{1072,,shared_ciphers()}

@item 
@ref{1351,,compression()}

@item 
@ref{3a73,,pending()}

@item 
@ref{1073,,do_handshake()}

@item 
@ref{c2d,,verify_client_post_handshake()}

@item 
@ref{3a71,,unwrap()}

@item 
@ref{1350,,get_channel_binding()}

@item 
@ref{106e,,version()}
@end itemize

When compared to @ref{aed,,SSLSocket}, this object lacks the following
features:


@itemize -

@item 
Any form of network IO; @code{recv()} and @code{send()} read and write only to
the underlying @ref{1068,,MemoryBIO} buffers.

@item 
There is no `do_handshake_on_connect' machinery. You must always manually
call @ref{1073,,do_handshake()} to start the handshake.

@item 
There is no handling of `suppress_ragged_eofs'. All end-of-file conditions
that are in violation of the protocol are reported via the
@ref{1aff,,SSLEOFError} exception.

@item 
The method @ref{3a71,,unwrap()} call does not return anything,
unlike for an SSL socket where it returns the underlying socket.

@item 
The `server_name_callback' callback passed to
@ref{11bd,,SSLContext.set_servername_callback()} will get an @code{SSLObject}
instance instead of a @ref{aed,,SSLSocket} instance as its first parameter.
@end itemize

Some notes related to the use of @code{SSLObject}:


@itemize -

@item 
All IO on an @code{SSLObject} is @ref{3a3b,,non-blocking}.
This means that for example @ref{1074,,read()} will raise an
@ref{106f,,SSLWantReadError} if it needs more data than the incoming BIO has
available.
@end itemize


Changed in version 3.7: @code{SSLObject} instances must be created with
@ref{d81,,wrap_bio()}. In earlier versions, it was possible to
create instances directly. This was never documented or officially
supported.

@end deffn

An SSLObject communicates with the outside world using memory buffers. The
class @ref{1068,,MemoryBIO} provides a memory buffer that can be used for this
purpose.  It wraps an OpenSSL memory BIO (Basic IO) object:

@geindex MemoryBIO (class in ssl)
@anchor{library/ssl ssl MemoryBIO}@anchor{1068}
@deffn {Class} ssl.MemoryBIO

A memory buffer that can be used to pass data between Python and an SSL
protocol instance.

@geindex pending (ssl.MemoryBIO attribute)
@anchor{library/ssl ssl MemoryBIO pending}@anchor{3a8c}
@deffn {Attribute} pending

Return the number of bytes currently in the memory buffer.
@end deffn

@geindex eof (ssl.MemoryBIO attribute)
@anchor{library/ssl ssl MemoryBIO eof}@anchor{3a8d}
@deffn {Attribute} eof

A boolean indicating whether the memory BIO is current at the end-of-file
position.
@end deffn

@geindex read() (ssl.MemoryBIO method)
@anchor{library/ssl ssl MemoryBIO read}@anchor{3a8e}
@deffn {Method} read (n=-1, /)

Read up to `n' bytes from the memory buffer. If `n' is not specified or
negative, all bytes are returned.
@end deffn

@geindex write() (ssl.MemoryBIO method)
@anchor{library/ssl ssl MemoryBIO write}@anchor{3a8f}
@deffn {Method} write (buf, /)

Write the bytes from `buf' to the memory BIO. The `buf' argument must be an
object supporting the buffer protocol.

The return value is the number of bytes written, which is always equal to
the length of `buf'.
@end deffn

@geindex write_eof() (ssl.MemoryBIO method)
@anchor{library/ssl ssl MemoryBIO write_eof}@anchor{3a90}
@deffn {Method} write_eof ()

Write an EOF marker to the memory BIO. After this method has been called, it
is illegal to call @ref{3a8f,,write()}. The attribute @ref{3a8d,,eof} will
become true after all data currently in the buffer has been read.
@end deffn
@end deffn

@node SSL session,Security considerations<2>,Memory BIO support,ssl — TLS/SSL wrapper for socket objects
@anchor{library/ssl ssl-session}@anchor{3a91}
@subsubsection SSL session



Added in version 3.6.


@geindex SSLSession (class in ssl)
@anchor{library/ssl ssl SSLSession}@anchor{edf}
@deffn {Class} ssl.SSLSession

Session object used by @ref{1981,,session}.

@geindex id (ssl.SSLSession attribute)
@anchor{library/ssl ssl SSLSession id}@anchor{3a92}
@deffn {Attribute} id
@end deffn

@geindex time (ssl.SSLSession attribute)
@anchor{library/ssl ssl SSLSession time}@anchor{3a93}
@deffn {Attribute} time
@end deffn

@geindex timeout (ssl.SSLSession attribute)
@anchor{library/ssl ssl SSLSession timeout}@anchor{3a94}
@deffn {Attribute} timeout
@end deffn

@geindex ticket_lifetime_hint (ssl.SSLSession attribute)
@anchor{library/ssl ssl SSLSession ticket_lifetime_hint}@anchor{3a95}
@deffn {Attribute} ticket_lifetime_hint
@end deffn

@geindex has_ticket (ssl.SSLSession attribute)
@anchor{library/ssl ssl SSLSession has_ticket}@anchor{3a96}
@deffn {Attribute} has_ticket
@end deffn
@end deffn

@node Security considerations<2>,TLS 1 3,SSL session,ssl — TLS/SSL wrapper for socket objects
@anchor{library/ssl security-considerations}@anchor{3a97}@anchor{library/ssl ssl-security}@anchor{390d}
@subsubsection Security considerations


@menu
* Best defaults:: 
* Manual settings:: 
* Multi-processing:: 

@end menu

@node Best defaults,Manual settings,,Security considerations<2>
@anchor{library/ssl best-defaults}@anchor{3a98}
@subsubsection Best defaults


For `client use', if you don’t have any special requirements for your
security policy, it is highly recommended that you use the
@ref{480,,create_default_context()} function to create your SSL context.
It will load the system’s trusted CA certificates, enable certificate
validation and hostname checking, and try to choose reasonably secure
protocol and cipher settings.

For example, here is how you would use the @ref{b2d,,smtplib.SMTP} class to
create a trusted, secure connection to a SMTP server:

@example
>>> import ssl, smtplib
>>> smtp = smtplib.SMTP("mail.python.org", port=587)
>>> context = ssl.create_default_context()
>>> smtp.starttls(context=context)
(220, b'2.0.0 Ready to start TLS')
@end example

If a client certificate is needed for the connection, it can be added with
@ref{598,,SSLContext.load_cert_chain()}.

By contrast, if you create the SSL context by calling the @ref{355,,SSLContext}
constructor yourself, it will not have certificate validation nor hostname
checking enabled by default.  If you do so, please read the paragraphs below
to achieve a good security level.

@node Manual settings,Multi-processing,Best defaults,Security considerations<2>
@anchor{library/ssl manual-settings}@anchor{3a99}
@subsubsection Manual settings


@menu
* Verifying certificates:: 
* Protocol versions:: 
* Cipher selection:: 

@end menu

@node Verifying certificates,Protocol versions,,Manual settings
@anchor{library/ssl verifying-certificates}@anchor{3a9a}
@subsubsection Verifying certificates


When calling the @ref{355,,SSLContext} constructor directly,
@ref{3a47,,CERT_NONE} is the default.  Since it does not authenticate the other
peer, it can be insecure, especially in client mode where most of the time you
would like to ensure the authenticity of the server you’re talking to.
Therefore, when in client mode, it is highly recommended to use
@ref{3a36,,CERT_REQUIRED}.  However, it is in itself not sufficient; you also
have to check that the server certificate, which can be obtained by calling
@ref{11be,,SSLSocket.getpeercert()}, matches the desired service.  For many
protocols and applications, the service can be identified by the hostname.
This common check is automatically performed when
@ref{3a49,,SSLContext.check_hostname} is enabled.


Changed in version 3.7: Hostname matchings is now performed by OpenSSL. Python no longer uses
@code{match_hostname()}.


In server mode, if you want to authenticate your clients using the SSL layer
(rather than using a higher-level authentication mechanism), you’ll also have
to specify @ref{3a36,,CERT_REQUIRED} and similarly check the client certificate.

@node Protocol versions,Cipher selection,Verifying certificates,Manual settings
@anchor{library/ssl protocol-versions}@anchor{3a9b}
@subsubsection Protocol versions


SSL versions 2 and 3 are considered insecure and are therefore dangerous to
use.  If you want maximum compatibility between clients and servers, it is
recommended to use @ref{a78,,PROTOCOL_TLS_CLIENT} or
@ref{a79,,PROTOCOL_TLS_SERVER} as the protocol version. SSLv2 and SSLv3 are
disabled by default.

@example
>>> client_context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
>>> client_context.minimum_version = ssl.TLSVersion.TLSv1_2
>>> client_context.maximum_version = ssl.TLSVersion.TLSv1_3
@end example

The SSL client context created above will only allow TLSv1.2 and TLSv1.3 (if
supported by your system) connections to a server. @ref{a78,,PROTOCOL_TLS_CLIENT}
implies certificate validation and hostname checks by default. You have to
load certificates into the context.

@node Cipher selection,,Protocol versions,Manual settings
@anchor{library/ssl cipher-selection}@anchor{3a9c}
@subsubsection Cipher selection


If you have advanced security requirements, fine-tuning of the ciphers
enabled when negotiating a SSL session is possible through the
@ref{3a78,,SSLContext.set_ciphers()} method.  Starting from Python 3.2.3, the
ssl module disables certain weak ciphers by default, but you may want
to further restrict the cipher choice. Be sure to read OpenSSL’s documentation
about the cipher list format@footnote{https://docs.openssl.org/1.1.1/man1/ciphers/#cipher-list-format}.
If you want to check which ciphers are enabled by a given cipher list, use
@ref{ee0,,SSLContext.get_ciphers()} or the @code{openssl ciphers} command on your
system.

@node Multi-processing,,Manual settings,Security considerations<2>
@anchor{library/ssl multi-processing}@anchor{3a9d}
@subsubsection Multi-processing


If using this module as part of a multi-processed application (using,
for example the @ref{98,,multiprocessing} or @ref{24,,concurrent.futures} modules),
be aware that OpenSSL’s internal random number generator does not properly
handle forked processes.  Applications must change the PRNG state of the
parent process if they use any SSL feature with @ref{4b6,,os.fork()}.  Any
successful call of @ref{3a41,,RAND_add()} or @ref{748,,RAND_bytes()} is
sufficient.

@node TLS 1 3,,Security considerations<2>,ssl — TLS/SSL wrapper for socket objects
@anchor{library/ssl ssl-tlsv1-3}@anchor{d7f}@anchor{library/ssl tls-1-3}@anchor{3a9e}
@subsubsection TLS 1.3



Added in version 3.7.


The TLS 1.3 protocol behaves slightly differently than previous version
of TLS/SSL. Some new TLS 1.3 features are not yet available.


@itemize -

@item 
TLS 1.3 uses a disjunct set of cipher suites. All AES-GCM and
ChaCha20 cipher suites are enabled by default.  The method
@ref{3a78,,SSLContext.set_ciphers()} cannot enable or disable any TLS 1.3
ciphers yet, but @ref{ee0,,SSLContext.get_ciphers()} returns them.

@item 
Session tickets are no longer sent as part of the initial handshake and
are handled differently.  @ref{1981,,SSLSocket.session} and @ref{edf,,SSLSession}
are not compatible with TLS 1.3.

@item 
Client-side certificates are also no longer verified during the initial
handshake.  A server can request a certificate at any time.  Clients
process certificate requests while they send or receive application data
from the server.

@item 
TLS 1.3 features like early data, deferred TLS client cert request,
signature algorithm configuration, and rekeying are not supported yet.
@end itemize


@subsubheading See also



@table @asis

@item Class @ref{fa7,,socket.socket}

Documentation of underlying @ref{d1,,socket} class

@item SSL/TLS Strong Encryption: An Introduction@footnote{https://httpd.apache.org/docs/trunk/en/ssl/ssl_intro.html}

Intro from the Apache HTTP Server documentation

@geindex RFC; RFC 1422

@item RFC 1422: Privacy Enhancement for Internet Electronic Mail: Part II: Certificate-Based Key Management@footnote{https://datatracker.ietf.org/doc/html/rfc1422.html}

Steve Kent

@geindex RFC; RFC 4086

@item RFC 4086: Randomness Requirements for Security@footnote{https://datatracker.ietf.org/doc/html/rfc4086.html}

Donald E. Eastlake, Jeffrey I. Schiller, Steve Crocker

@geindex RFC; RFC 5280

@item RFC 5280: Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile@footnote{https://datatracker.ietf.org/doc/html/rfc5280.html}

David Cooper et al.

@geindex RFC; RFC 5246

@item RFC 5246: The Transport Layer Security (TLS) Protocol Version 1.2@footnote{https://datatracker.ietf.org/doc/html/rfc5246.html}

Tim Dierks and Eric Rescorla.

@geindex RFC; RFC 6066

@item RFC 6066: Transport Layer Security (TLS) Extensions@footnote{https://datatracker.ietf.org/doc/html/rfc6066.html}

Donald E. Eastlake

@item IANA TLS: Transport Layer Security (TLS) Parameters@footnote{https://www.iana.org/assignments/tls-parameters/tls-parameters.xml}

IANA

@geindex RFC; RFC 7525

@item RFC 7525: Recommendations for Secure Use of Transport Layer Security (TLS) and Datagram Transport Layer Security (DTLS)@footnote{https://datatracker.ietf.org/doc/html/rfc7525.html}

IETF

@item Mozilla's Server Side TLS recommendations@footnote{https://wiki.mozilla.org/Security/Server_Side_TLS}

Mozilla
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node select — Waiting for I/O completion,selectors — High-level I/O multiplexing,ssl — TLS/SSL wrapper for socket objects,Networking and Interprocess Communication
@anchor{library/select doc}@anchor{3a9f}@anchor{library/select module-select}@anchor{c6}@anchor{library/select select-waiting-for-i-o-completion}@anchor{3aa0}@anchor{library/select translation-repo}@anchor{3aa1}
@subsection @code{select} — Waiting for I/O completion


@geindex module; select


__________________________________________________________________


This module provides access to the @code{select()} and @code{poll()} functions
available in most operating systems, @code{devpoll()} available on
Solaris and derivatives, @code{epoll()} available on Linux 2.5+ and
@code{kqueue()} available on most BSD.
Note that on Windows, it only works for sockets; on other operating systems,
it also works for other file types (in particular, on Unix, it works on pipes).
It cannot be used on regular files to determine whether a file has grown since
it was last read.

@cartouche
@quotation Note 
The @ref{c7,,selectors} module allows high-level and efficient I/O
multiplexing, built upon the @code{select} module primitives. Users are
encouraged to use the @code{selectors} module instead, unless they want
precise control over the OS-level primitives used.
@end quotation
@end cartouche

@c include for modules that don't work on WASM

@ref{2181,,Availability}: not WASI.

This module does not work or is not available on WebAssembly. See
@ref{1bae,,WebAssembly platforms} for more information.

The module defines the following:

@geindex error
@anchor{library/select select error}@anchor{125d}
@deffn {Exception} select.error

A deprecated alias of @ref{2c2,,OSError}.


Changed in version 3.3: Following 
@geindex Python Enhancement Proposals; PEP 3151
PEP 3151@footnote{https://peps.python.org/pep-3151/}, this class was made an alias of @ref{2c2,,OSError}.

@end deffn

@geindex devpoll() (in module select)
@anchor{library/select select devpoll}@anchor{119c}
@deffn {Function} select.devpoll ()

Returns a @code{/dev/poll}
polling object; see section @ref{3aa2,,/dev/poll polling objects} below for the
methods supported by devpoll objects.

@code{devpoll()} objects are linked to the number of file
descriptors allowed at the time of instantiation. If your program
reduces this value, @code{devpoll()} will fail. If your program
increases this value, @code{devpoll()} may return an
incomplete list of active file descriptors.

The new file descriptor is @ref{1102,,non-inheritable}.


Added in version 3.3.



Changed in version 3.4: The new file descriptor is now non-inheritable.


@ref{2181,,Availability}: Solaris.
@end deffn

@geindex epoll() (in module select)
@anchor{library/select select epoll}@anchor{119a}
@deffn {Function} select.epoll (sizehint=-1, flags=0)

Return an edge polling object,
which can be used as Edge or Level Triggered interface for I/O
events.

`sizehint' informs epoll about the expected number of events to be
registered.  It must be positive, or @code{-1} to use the default. It is only
used on older systems where @code{epoll_create1()} is not available;
otherwise it has no effect (though its value is still checked).

`flags' is deprecated and completely ignored.  However, when supplied, its
value must be @code{0} or @code{select.EPOLL_CLOEXEC}, otherwise @code{OSError} is
raised.

See the @ref{3aa3,,Edge and level trigger polling (epoll) objects} section below for the methods supported by
epolling objects.

@code{epoll} objects support the context management protocol: when used in a
@ref{187,,with} statement, the new file descriptor is automatically closed
at the end of the block.

The new file descriptor is @ref{1102,,non-inheritable}.


Changed in version 3.3: Added the `flags' parameter.



Changed in version 3.4: Support for the @ref{187,,with} statement was added.
The new file descriptor is now non-inheritable.



Deprecated since version 3.4: The `flags' parameter.  @code{select.EPOLL_CLOEXEC} is used by default now.
Use @ref{1104,,os.set_inheritable()} to make the file descriptor inheritable.


@ref{2181,,Availability}: Linux >= 2.5.44.
@end deffn

@geindex poll() (in module select)
@anchor{library/select select poll}@anchor{3119}
@deffn {Function} select.poll ()

Returns a polling object, which
supports registering and unregistering file descriptors, and then polling them
for I/O events; see section @ref{3aa4,,Polling objects} below for the methods supported
by polling objects.

@ref{2181,,Availability}: Unix.
@end deffn

@geindex kqueue() (in module select)
@anchor{library/select select kqueue}@anchor{1a89}
@deffn {Function} select.kqueue ()

Returns a kernel queue object; see section
@ref{3aa5,,Kqueue objects} below for the methods supported by kqueue objects.

The new file descriptor is @ref{1102,,non-inheritable}.


Changed in version 3.4: The new file descriptor is now non-inheritable.


@ref{2181,,Availability}: BSD, macOS.
@end deffn

@geindex kevent() (in module select)
@anchor{library/select select kevent}@anchor{3aa6}
@deffn {Function} select.kevent (ident, filter=KQ_FILTER_READ, flags=KQ_EV_ADD, fflags=0, data=0, udata=0)

Returns a kernel event object; see section
@ref{3aa7,,Kevent objects} below for the methods supported by kevent objects.

@ref{2181,,Availability}: BSD, macOS.
@end deffn

@geindex select() (in module select)
@anchor{library/select select select}@anchor{fa6}
@deffn {Function} select.select (rlist, wlist, xlist, timeout=None)

This is a straightforward interface to the Unix @code{select()} system call.
The first three arguments are iterables of ‘waitable objects’: either
integers representing file descriptors or objects with a parameterless method
named @ref{17fe,,fileno()} returning such an integer:


@itemize *

@item 
`rlist': wait until ready for reading

@item 
`wlist': wait until ready for writing

@item 
`xlist': wait for an “exceptional condition” (see the manual page for what
your system considers such a condition)
@end itemize

Empty iterables are allowed, but acceptance of three empty iterables is
platform-dependent. (It is known to work on Unix but not on Windows.)  The
optional `timeout' argument specifies a time-out as a floating-point number
in seconds.
When the `timeout' argument is omitted or @code{None}, the function blocks until
at least one file descriptor is ready.  A time-out value of zero specifies a
poll and never blocks.

The return value is a triple of lists of objects that are ready: subsets of the
first three arguments.  When the time-out is reached without a file descriptor
becoming ready, three empty lists are returned.

@geindex socket() (in module socket)
@geindex popen() (in module os)

Among the acceptable object types in the iterables are Python @ref{13cf,,file objects} (e.g. @code{sys.stdin}, or objects returned by
@ref{318,,open()} or @ref{31c,,os.popen()}), socket objects returned by
@ref{fa7,,socket.socket()}.  You may also define a `wrapper' class yourself,
as long as it has an appropriate @ref{17fe,,fileno()} method (that
really returns a file descriptor, not just a random integer).

@cartouche
@quotation Note 
@geindex WinSock

File objects on Windows are not acceptable, but sockets are.  On Windows,
the underlying @code{select()} function is provided by the WinSock
library, and does not handle file descriptors that don’t originate from
WinSock.
@end quotation
@end cartouche


Changed in version 3.5: The function is now retried with a recomputed timeout when interrupted by
a signal, except if the signal handler raises an exception (see
@geindex Python Enhancement Proposals; PEP 475
PEP 475@footnote{https://peps.python.org/pep-0475/} for the rationale), instead of raising
@ref{f8e,,InterruptedError}.

@end deffn

@geindex PIPE_BUF (in module select)
@anchor{library/select select PIPE_BUF}@anchor{1416}
@deffn {Data} select.PIPE_BUF

The minimum number of bytes which can be written without blocking to a pipe
when the pipe has been reported as ready for writing by @ref{fa6,,select()},
@code{poll()} or another interface in this module.  This doesn’t apply
to other kinds of file-like objects such as sockets.

This value is guaranteed by POSIX to be at least 512.

@ref{2181,,Availability}: Unix


Added in version 3.2.

@end deffn

@menu
* /dev/poll polling objects:: 
* Edge and level trigger polling (epoll) objects: Edge and level trigger polling epoll objects. 
* Polling objects:: 
* Kqueue objects:: 
* Kevent objects:: 

@end menu

@node /dev/poll polling objects,Edge and level trigger polling epoll objects,,select — Waiting for I/O completion
@anchor{library/select dev-poll-polling-objects}@anchor{3aa8}@anchor{library/select devpoll-objects}@anchor{3aa2}
@subsubsection @code{/dev/poll} polling objects


Solaris and derivatives have @code{/dev/poll}. While @code{select()} is
`O'(`highest file descriptor') and @code{poll()} is `O'(`number of file
descriptors'), @code{/dev/poll} is `O'(`active file descriptors').

@code{/dev/poll} behaviour is very close to the standard @code{poll()}
object.

@geindex close() (select.devpoll method)
@anchor{library/select select devpoll close}@anchor{119e}
@deffn {Method} devpoll.close ()

Close the file descriptor of the polling object.


Added in version 3.4.

@end deffn

@geindex closed (select.devpoll attribute)
@anchor{library/select select devpoll closed}@anchor{119f}
@deffn {Attribute} devpoll.closed

@code{True} if the polling object is closed.


Added in version 3.4.

@end deffn

@geindex fileno() (select.devpoll method)
@anchor{library/select select devpoll fileno}@anchor{119d}
@deffn {Method} devpoll.fileno ()

Return the file descriptor number of the polling object.


Added in version 3.4.

@end deffn

@geindex register() (select.devpoll method)
@anchor{library/select select devpoll register}@anchor{3aa9}
@deffn {Method} devpoll.register (fd[, eventmask])

Register a file descriptor with the polling object.  Future calls to the
@ref{3119,,poll()} method will then check whether the file descriptor has any
pending I/O events.  `fd' can be either an integer, or an object with a
@ref{17fe,,fileno()} method that returns an integer.  File objects
implement @code{fileno()}, so they can also be used as the argument.

`eventmask' is an optional bitmask describing the type of events you want to
check for. The constants are the same as with @code{poll()}
object. The default value is a combination of the constants @code{POLLIN},
@code{POLLPRI}, and @code{POLLOUT}.

@cartouche
@quotation Warning 
Registering a file descriptor that’s already registered is not an
error, but the result is undefined. The appropriate action is to
unregister or modify it first. This is an important difference
compared with @code{poll()}.
@end quotation
@end cartouche
@end deffn

@geindex modify() (select.devpoll method)
@anchor{library/select select devpoll modify}@anchor{3aaa}
@deffn {Method} devpoll.modify (fd[, eventmask])

This method does an @ref{3aab,,unregister()} followed by a
@ref{3aa9,,register()}. It is (a bit) more efficient than doing the same
explicitly.
@end deffn

@geindex unregister() (select.devpoll method)
@anchor{library/select select devpoll unregister}@anchor{3aab}
@deffn {Method} devpoll.unregister (fd)

Remove a file descriptor being tracked by a polling object.  Just like the
@ref{3aa9,,register()} method, `fd' can be an integer or an object with a
@ref{17fe,,fileno()} method that returns an integer.

Attempting to remove a file descriptor that was never registered is
safely ignored.
@end deffn

@geindex poll() (select.devpoll method)
@anchor{library/select select devpoll poll}@anchor{fa2}
@deffn {Method} devpoll.poll ([timeout])

Polls the set of registered file descriptors, and returns a possibly empty list
containing @code{(fd, event)} 2-tuples for the descriptors that have events or
errors to report. `fd' is the file descriptor, and `event' is a bitmask with
bits set for the reported events for that descriptor — @code{POLLIN} for
waiting input, @code{POLLOUT} to indicate that the descriptor can be written
to, and so forth. An empty list indicates that the call timed out and no file
descriptors had any events to report. If `timeout' is given, it specifies the
length of time in milliseconds which the system will wait for events before
returning. If `timeout' is omitted, -1, or @ref{887,,None}, the call will
block until there is an event for this poll object.


Changed in version 3.5: The function is now retried with a recomputed timeout when interrupted by
a signal, except if the signal handler raises an exception (see
@geindex Python Enhancement Proposals; PEP 475
PEP 475@footnote{https://peps.python.org/pep-0475/} for the rationale), instead of raising
@ref{f8e,,InterruptedError}.

@end deffn

@node Edge and level trigger polling epoll objects,Polling objects,/dev/poll polling objects,select — Waiting for I/O completion
@anchor{library/select edge-and-level-trigger-polling-epoll-objects}@anchor{3aac}@anchor{library/select epoll-objects}@anchor{3aa3}
@subsubsection Edge and level trigger polling (epoll) objects


@quotation

@indicateurl{https://linux.die.net/man/4/epoll}

The `eventmask' is a bit mask using the following constants:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Constant

@tab

Meaning

@item

@code{EPOLLIN}

@tab

Available for read.

@item

@code{EPOLLOUT}

@tab

Available for write.

@item

@code{EPOLLPRI}

@tab

Urgent data for read.

@item

@code{EPOLLERR}

@tab

Error condition happened on the associated fd.

@item

@code{EPOLLHUP}

@tab

Hang up happened on the associated fd.

@item

@code{EPOLLET}

@tab

Set Edge Trigger behavior, the default is
Level Trigger behavior.

@item

@code{EPOLLONESHOT}

@tab

Set one-shot behavior. After one event is
pulled out, the fd is internally disabled.

@item

@code{EPOLLEXCLUSIVE}

@tab

Wake only one epoll object when the
associated fd has an event. The default (if
this flag is not set) is to wake all epoll
objects polling on an fd.

@item

@code{EPOLLRDHUP}

@tab

Stream socket peer closed connection or shut
down writing half of connection.

@item

@code{EPOLLRDNORM}

@tab

Equivalent to @code{EPOLLIN}

@item

@code{EPOLLRDBAND}

@tab

Priority data band can be read.

@item

@code{EPOLLWRNORM}

@tab

Equivalent to @code{EPOLLOUT}.

@item

@code{EPOLLWRBAND}

@tab

Priority data may be written.

@item

@code{EPOLLMSG}

@tab

Ignored.

@item

@code{EPOLLWAKEUP}

@tab

Prevents sleep during event waiting.

@end multitable



Added in version 3.6: @code{EPOLLEXCLUSIVE} was added.  It’s only supported by Linux Kernel 4.5
or later.



Added in version 3.14: @code{EPOLLWAKEUP} was added. It’s only supported by Linux Kernel 3.5
or later.

@end quotation

@geindex close() (select.epoll method)
@anchor{library/select select epoll close}@anchor{119b}
@deffn {Method} epoll.close ()

Close the control file descriptor of the epoll object.
@end deffn

@geindex closed (select.epoll attribute)
@anchor{library/select select epoll closed}@anchor{3aad}
@deffn {Attribute} epoll.closed

@code{True} if the epoll object is closed.
@end deffn

@geindex fileno() (select.epoll method)
@anchor{library/select select epoll fileno}@anchor{3aae}
@deffn {Method} epoll.fileno ()

Return the file descriptor number of the control fd.
@end deffn

@geindex fromfd() (select.epoll method)
@anchor{library/select select epoll fromfd}@anchor{3aaf}
@deffn {Method} epoll.fromfd (fd)

Create an epoll object from a given file descriptor.
@end deffn

@geindex register() (select.epoll method)
@anchor{library/select select epoll register}@anchor{3ab0}
@deffn {Method} epoll.register (fd[, eventmask])

Register a file descriptor `fd' with the epoll object.
@end deffn

@geindex modify() (select.epoll method)
@anchor{library/select select epoll modify}@anchor{3ab1}
@deffn {Method} epoll.modify (fd, eventmask)

Modify a registered file descriptor `fd'.
@end deffn

@geindex unregister() (select.epoll method)
@anchor{library/select select epoll unregister}@anchor{b59}
@deffn {Method} epoll.unregister (fd)

Remove a registered file descriptor from the epoll object.


Changed in version 3.9: The method no longer ignores the @ref{b5a,,EBADF} error.

@end deffn

@geindex poll() (select.epoll method)
@anchor{library/select select epoll poll}@anchor{fa3}
@deffn {Method} epoll.poll (timeout=None, maxevents=-1)

Wait for events. timeout in seconds (float)


Changed in version 3.5: The function is now retried with a recomputed timeout when interrupted by
a signal, except if the signal handler raises an exception (see
@geindex Python Enhancement Proposals; PEP 475
PEP 475@footnote{https://peps.python.org/pep-0475/} for the rationale), instead of raising
@ref{f8e,,InterruptedError}.

@end deffn

@node Polling objects,Kqueue objects,Edge and level trigger polling epoll objects,select — Waiting for I/O completion
@anchor{library/select poll-objects}@anchor{3aa4}@anchor{library/select polling-objects}@anchor{3ab2}
@subsubsection Polling objects


The @code{poll()} system call, supported on most Unix systems, provides better
scalability for network servers that service many, many clients at the same
time. @code{poll()} scales better because the system call only requires listing
the file descriptors of interest, while @code{select()} builds a bitmap, turns
on bits for the fds of interest, and then afterward the whole bitmap has to be
linearly scanned again. @code{select()} is `O'(`highest file descriptor'), while
@code{poll()} is `O'(`number of file descriptors').

@geindex register() (select.poll method)
@anchor{library/select select poll register}@anchor{3ab3}
@deffn {Method} poll.register (fd[, eventmask])

Register a file descriptor with the polling object.  Future calls to the
@ref{3119,,poll()} method will then check whether the file descriptor has any
pending I/O events.  `fd' can be either an integer, or an object with a
@ref{17fe,,fileno()} method that returns an integer.  File objects
implement @code{fileno()}, so they can also be used as the argument.

`eventmask' is an optional bitmask describing the type of events you want to
check for, and can be a combination of the constants @code{POLLIN},
@code{POLLPRI}, and @code{POLLOUT}, described in the table below.  If not
specified, the default value used will check for all 3 types of events.


@multitable {xxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Constant

@tab

Meaning

@item

@code{POLLIN}

@tab

There is data to read.

@item

@code{POLLPRI}

@tab

There is urgent data to read.

@item

@code{POLLOUT}

@tab

Ready for output: writing will not block.

@item

@code{POLLERR}

@tab

Error condition of some sort.

@item

@code{POLLHUP}

@tab

Hung up.

@item

@code{POLLRDHUP}

@tab

Stream socket peer closed connection, or
shut down writing half of connection.

@item

@code{POLLNVAL}

@tab

Invalid request: descriptor not open.

@end multitable


Registering a file descriptor that’s already registered is not an error, and has
the same effect as registering the descriptor exactly once.
@end deffn

@geindex modify() (select.poll method)
@anchor{library/select select poll modify}@anchor{3ab4}
@deffn {Method} poll.modify (fd, eventmask)

Modifies an already registered fd. This has the same effect as
@code{register(fd, eventmask)}.  Attempting to modify a file descriptor
that was never registered causes an @ref{2c2,,OSError} exception with errno
@code{ENOENT} to be raised.
@end deffn

@geindex unregister() (select.poll method)
@anchor{library/select select poll unregister}@anchor{3ab5}
@deffn {Method} poll.unregister (fd)

Remove a file descriptor being tracked by a polling object.  Just like the
@ref{3ab3,,register()} method, `fd' can be an integer or an object with a
@ref{17fe,,fileno()} method that returns an integer.

Attempting to remove a file descriptor that was never registered causes a
@ref{5e7,,KeyError} exception to be raised.
@end deffn

@geindex poll() (select.poll method)
@anchor{library/select select poll poll}@anchor{fa5}
@deffn {Method} poll.poll ([timeout])

Polls the set of registered file descriptors, and returns a possibly empty list
containing @code{(fd, event)} 2-tuples for the descriptors that have events or
errors to report. `fd' is the file descriptor, and `event' is a bitmask with
bits set for the reported events for that descriptor — @code{POLLIN} for
waiting input, @code{POLLOUT} to indicate that the descriptor can be written
to, and so forth. An empty list indicates that the call timed out and no file
descriptors had any events to report. If `timeout' is given, it specifies the
length of time in milliseconds which the system will wait for events before
returning. If `timeout' is omitted, negative, or @ref{887,,None}, the call will
block until there is an event for this poll object.


Changed in version 3.5: The function is now retried with a recomputed timeout when interrupted by
a signal, except if the signal handler raises an exception (see
@geindex Python Enhancement Proposals; PEP 475
PEP 475@footnote{https://peps.python.org/pep-0475/} for the rationale), instead of raising
@ref{f8e,,InterruptedError}.

@end deffn

@node Kqueue objects,Kevent objects,Polling objects,select — Waiting for I/O completion
@anchor{library/select id1}@anchor{3ab6}@anchor{library/select kqueue-objects}@anchor{3aa5}
@subsubsection Kqueue objects


@geindex close() (select.kqueue method)
@anchor{library/select select kqueue close}@anchor{3ab7}
@deffn {Method} kqueue.close ()

Close the control file descriptor of the kqueue object.
@end deffn

@geindex closed (select.kqueue attribute)
@anchor{library/select select kqueue closed}@anchor{3ab8}
@deffn {Attribute} kqueue.closed

@code{True} if the kqueue object is closed.
@end deffn

@geindex fileno() (select.kqueue method)
@anchor{library/select select kqueue fileno}@anchor{3ab9}
@deffn {Method} kqueue.fileno ()

Return the file descriptor number of the control fd.
@end deffn

@geindex fromfd() (select.kqueue method)
@anchor{library/select select kqueue fromfd}@anchor{3aba}
@deffn {Method} kqueue.fromfd (fd)

Create a kqueue object from a given file descriptor.
@end deffn

@geindex control() (select.kqueue method)
@anchor{library/select select kqueue control}@anchor{fa4}
@deffn {Method} kqueue.control (changelist, max_events[, timeout]) -> eventlist

Low level interface to kevent


@itemize -

@item 
changelist must be an iterable of kevent objects or @code{None}

@item 
max_events must be 0 or a positive integer

@item 
timeout in seconds (floats possible); the default is @code{None},
to wait forever
@end itemize


Changed in version 3.5: The function is now retried with a recomputed timeout when interrupted by
a signal, except if the signal handler raises an exception (see
@geindex Python Enhancement Proposals; PEP 475
PEP 475@footnote{https://peps.python.org/pep-0475/} for the rationale), instead of raising
@ref{f8e,,InterruptedError}.

@end deffn

@node Kevent objects,,Kqueue objects,select — Waiting for I/O completion
@anchor{library/select id2}@anchor{3abb}@anchor{library/select kevent-objects}@anchor{3aa7}
@subsubsection Kevent objects


@indicateurl{https://man.freebsd.org/cgi/man.cgi?query=kqueue&sektion=2}

@geindex ident (select.kevent attribute)
@anchor{library/select select kevent ident}@anchor{3abc}
@deffn {Attribute} kevent.ident

Value used to identify the event. The interpretation depends on the filter
but it’s usually the file descriptor. In the constructor ident can either
be an int or an object with a @ref{17fe,,fileno()} method. kevent
stores the integer internally.
@end deffn

@geindex filter (select.kevent attribute)
@anchor{library/select select kevent filter}@anchor{3abd}
@deffn {Attribute} kevent.filter

Name of the kernel filter.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Constant

@tab

Meaning

@item

@code{KQ_FILTER_READ}

@tab

Takes a descriptor and returns whenever
there is data available to read.

@item

@code{KQ_FILTER_WRITE}

@tab

Takes a descriptor and returns whenever
there is data available to write.

@item

@code{KQ_FILTER_AIO}

@tab

AIO requests.

@item

@code{KQ_FILTER_VNODE}

@tab

Returns when one or more of the requested
events watched in `fflag' occurs.

@item

@code{KQ_FILTER_PROC}

@tab

Watch for events on a process ID.

@item

@code{KQ_FILTER_NETDEV}

@tab

Watch for events on a network device
(not available on macOS).

@item

@code{KQ_FILTER_SIGNAL}

@tab

Returns whenever the watched signal is
delivered to the process.

@item

@code{KQ_FILTER_TIMER}

@tab

Establishes an arbitrary timer.

@end multitable

@end deffn

@geindex flags (select.kevent attribute)
@anchor{library/select select kevent flags}@anchor{3abe}
@deffn {Attribute} kevent.flags

Filter action.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Constant

@tab

Meaning

@item

@code{KQ_EV_ADD}

@tab

Adds or modifies an event.

@item

@code{KQ_EV_DELETE}

@tab

Removes an event from the queue.

@item

@code{KQ_EV_ENABLE}

@tab

Permits control() to return the event.

@item

@code{KQ_EV_DISABLE}

@tab

Disables event.

@item

@code{KQ_EV_ONESHOT}

@tab

Removes event after first occurrence.

@item

@code{KQ_EV_CLEAR}

@tab

Reset the state after an event is retrieved.

@item

@code{KQ_EV_SYSFLAGS}

@tab

Internal event.

@item

@code{KQ_EV_FLAG1}

@tab

Internal event.

@item

@code{KQ_EV_EOF}

@tab

Filter-specific EOF condition.

@item

@code{KQ_EV_ERROR}

@tab

See return values.

@end multitable

@end deffn

@geindex fflags (select.kevent attribute)
@anchor{library/select select kevent fflags}@anchor{3abf}
@deffn {Attribute} kevent.fflags

Filter-specific flags.

@code{KQ_FILTER_READ} and  @code{KQ_FILTER_WRITE} filter flags:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Constant

@tab

Meaning

@item

@code{KQ_NOTE_LOWAT}

@tab

Low water mark of a socket buffer.

@end multitable


@code{KQ_FILTER_VNODE} filter flags:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Constant

@tab

Meaning

@item

@code{KQ_NOTE_DELETE}

@tab

`unlink()' was called.

@item

@code{KQ_NOTE_WRITE}

@tab

A write occurred.

@item

@code{KQ_NOTE_EXTEND}

@tab

The file was extended.

@item

@code{KQ_NOTE_ATTRIB}

@tab

An attribute was changed.

@item

@code{KQ_NOTE_LINK}

@tab

The link count has changed.

@item

@code{KQ_NOTE_RENAME}

@tab

The file was renamed.

@item

@code{KQ_NOTE_REVOKE}

@tab

Access to the file was revoked.

@end multitable


@code{KQ_FILTER_PROC} filter flags:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Constant

@tab

Meaning

@item

@code{KQ_NOTE_EXIT}

@tab

The process has exited.

@item

@code{KQ_NOTE_FORK}

@tab

The process has called `fork()'.

@item

@code{KQ_NOTE_EXEC}

@tab

The process has executed a new process.

@item

@code{KQ_NOTE_PCTRLMASK}

@tab

Internal filter flag.

@item

@code{KQ_NOTE_PDATAMASK}

@tab

Internal filter flag.

@item

@code{KQ_NOTE_TRACK}

@tab

Follow a process across `fork()'.

@item

@code{KQ_NOTE_CHILD}

@tab

Returned on the child process for
`NOTE_TRACK'.

@item

@code{KQ_NOTE_TRACKERR}

@tab

Unable to attach to a child.

@end multitable


@code{KQ_FILTER_NETDEV} filter flags (not available on macOS):


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Constant

@tab

Meaning

@item

@code{KQ_NOTE_LINKUP}

@tab

Link is up.

@item

@code{KQ_NOTE_LINKDOWN}

@tab

Link is down.

@item

@code{KQ_NOTE_LINKINV}

@tab

Link state is invalid.

@end multitable

@end deffn

@geindex data (select.kevent attribute)
@anchor{library/select select kevent data}@anchor{3ac0}
@deffn {Attribute} kevent.data

Filter-specific data.
@end deffn

@geindex udata (select.kevent attribute)
@anchor{library/select select kevent udata}@anchor{3ac1}
@deffn {Attribute} kevent.udata

User-defined value.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node selectors — High-level I/O multiplexing,signal — Set handlers for asynchronous events,select — Waiting for I/O completion,Networking and Interprocess Communication
@anchor{library/selectors doc}@anchor{3ac2}@anchor{library/selectors module-selectors}@anchor{c7}@anchor{library/selectors selectors-high-level-i-o-multiplexing}@anchor{3ac3}@anchor{library/selectors translation-repo}@anchor{3ac4}
@subsection @code{selectors} — High-level I/O multiplexing


@geindex module; selectors


Added in version 3.4.


`Source code:' Lib/selectors.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/selectors.py}


__________________________________________________________________


@menu
* Introduction: Introduction<11>. 
* Classes: Classes<4>. 
* Examples: Examples<22>. 

@end menu

@node Introduction<11>,Classes<4>,,selectors — High-level I/O multiplexing
@anchor{library/selectors introduction}@anchor{3ac5}
@subsubsection Introduction


This module allows high-level and efficient I/O multiplexing, built upon the
@ref{c6,,select} module primitives. Users are encouraged to use this module
instead, unless they want precise control over the OS-level primitives used.

It defines a @ref{3ac6,,BaseSelector} abstract base class, along with several
concrete implementations (@ref{398f,,KqueueSelector}, @ref{dd6,,EpollSelector}…),
that can be used to wait for I/O readiness notification on multiple file
objects. In the following, “file object” refers to any object with a
@ref{17fe,,fileno()} method, or a raw file descriptor. See @ref{13cf,,file object}.

@ref{3ac7,,DefaultSelector} is an alias to the most efficient implementation
available on the current platform: this should be the default choice for most
users.

@cartouche
@quotation Note 
The type of file objects supported depends on the platform: on Windows,
sockets are supported, but not pipes, whereas on Unix, both are supported
(some other types may be supported as well, such as fifos or special file
devices).
@end quotation
@end cartouche


@subsubheading See also



@table @asis

@item @ref{c6,,select}

Low-level I/O multiplexing module.
@end table


@c include for modules that don't work on WASM

@ref{2181,,Availability}: not WASI.

This module does not work or is not available on WebAssembly. See
@ref{1bae,,WebAssembly platforms} for more information.

@node Classes<4>,Examples<22>,Introduction<11>,selectors — High-level I/O multiplexing
@anchor{library/selectors classes}@anchor{3ac8}
@subsubsection Classes


Classes hierarchy:

@example
BaseSelector
+-- SelectSelector
+-- PollSelector
+-- EpollSelector
+-- DevpollSelector
+-- KqueueSelector
@end example

In the following, `events' is a bitwise mask indicating which I/O events should
be waited for on a given file object. It can be a combination of the module’s
constants below:

@quotation


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Constant

@tab

Meaning

@item

@geindex EVENT_READ (in module selectors)
@anchor{library/selectors selectors EVENT_READ}@anchor{3ac9}
@deffn {Data} selectors.EVENT_READ
@end deffn

@tab

Available for read

@item

@geindex EVENT_WRITE (in module selectors)
@anchor{library/selectors selectors EVENT_WRITE}@anchor{3aca}
@deffn {Data} selectors.EVENT_WRITE
@end deffn

@tab

Available for write

@end multitable

@end quotation

@geindex SelectorKey (class in selectors)
@anchor{library/selectors selectors SelectorKey}@anchor{3acb}
@deffn {Class} selectors.SelectorKey

A @code{SelectorKey} is a @ref{4e1,,namedtuple} used to
associate a file object to its underlying file descriptor, selected event
mask and attached data. It is returned by several @ref{3ac6,,BaseSelector}
methods.

@geindex fileobj (selectors.SelectorKey attribute)
@anchor{library/selectors selectors SelectorKey fileobj}@anchor{3acc}
@deffn {Attribute} fileobj

File object registered.
@end deffn

@geindex fd (selectors.SelectorKey attribute)
@anchor{library/selectors selectors SelectorKey fd}@anchor{3acd}
@deffn {Attribute} fd

Underlying file descriptor.
@end deffn

@geindex events (selectors.SelectorKey attribute)
@anchor{library/selectors selectors SelectorKey events}@anchor{3ace}
@deffn {Attribute} events

Events that must be waited for on this file object.
@end deffn

@geindex data (selectors.SelectorKey attribute)
@anchor{library/selectors selectors SelectorKey data}@anchor{3acf}
@deffn {Attribute} data

Optional opaque data associated to this file object: for example, this
could be used to store a per-client session ID.
@end deffn
@end deffn

@geindex BaseSelector (class in selectors)
@anchor{library/selectors selectors BaseSelector}@anchor{3ac6}
@deffn {Class} selectors.BaseSelector

A @code{BaseSelector} is used to wait for I/O event readiness on multiple
file objects. It supports file stream registration, unregistration, and a
method to wait for I/O events on those streams, with an optional timeout.
It’s an abstract base class, so cannot be instantiated. Use
@ref{3ac7,,DefaultSelector} instead, or one of @ref{398c,,SelectSelector},
@ref{398f,,KqueueSelector} etc. if you want to specifically use an
implementation, and your platform supports it.
@code{BaseSelector} and its concrete implementations support the
@ref{1e3,,context manager} protocol.

@geindex register() (selectors.BaseSelector method)
@anchor{library/selectors selectors BaseSelector register}@anchor{3ad0}
@deffn {Method} abstractmethod register (fileobj, events, data=None)

Register a file object for selection, monitoring it for I/O events.

`fileobj' is the file object to monitor.  It may either be an integer
file descriptor or an object with a @code{fileno()} method.
`events' is a bitwise mask of events to monitor.
`data' is an opaque object.

This returns a new @ref{3acb,,SelectorKey} instance, or raises a
@ref{2ee,,ValueError} in case of invalid event mask or file descriptor, or
@ref{5e7,,KeyError} if the file object is already registered.
@end deffn

@geindex unregister() (selectors.BaseSelector method)
@anchor{library/selectors selectors BaseSelector unregister}@anchor{3ad1}
@deffn {Method} abstractmethod unregister (fileobj)

Unregister a file object from selection, removing it from monitoring. A
file object shall be unregistered prior to being closed.

`fileobj' must be a file object previously registered.

This returns the associated @ref{3acb,,SelectorKey} instance, or raises a
@ref{5e7,,KeyError} if `fileobj' is not registered.  It will raise
@ref{2ee,,ValueError} if `fileobj' is invalid (e.g. it has no @code{fileno()}
method or its @code{fileno()} method has an invalid return value).
@end deffn

@geindex modify() (selectors.BaseSelector method)
@anchor{library/selectors selectors BaseSelector modify}@anchor{dd5}
@deffn {Method} modify (fileobj, events, data=None)

Change a registered file object’s monitored events or attached data.

This is equivalent to @code{BaseSelector.unregister(fileobj)} followed
by @code{BaseSelector.register(fileobj, events, data)}, except that it
can be implemented more efficiently.

This returns a new @ref{3acb,,SelectorKey} instance, or raises a
@ref{2ee,,ValueError} in case of invalid event mask or file descriptor, or
@ref{5e7,,KeyError} if the file object is not registered.
@end deffn

@geindex select() (selectors.BaseSelector method)
@anchor{library/selectors selectors BaseSelector select}@anchor{3ad2}
@deffn {Method} abstractmethod select (timeout=None)

Wait until some registered file objects become ready, or the timeout
expires.

If @code{timeout > 0}, this specifies the maximum wait time, in seconds.
If @code{timeout <= 0}, the call won’t block, and will report the currently
ready file objects.
If `timeout' is @code{None}, the call will block until a monitored file object
becomes ready.

This returns a list of @code{(key, events)} tuples, one for each ready file
object.

`key' is the @ref{3acb,,SelectorKey} instance corresponding to a ready file
object.
`events' is a bitmask of events ready on this file object.

@cartouche
@quotation Note 
This method can return before any file object becomes ready or the
timeout has elapsed if the current process receives a signal: in this
case, an empty list will be returned.
@end quotation
@end cartouche


Changed in version 3.5: The selector is now retried with a recomputed timeout when interrupted
by a signal if the signal handler did not raise an exception (see
@geindex Python Enhancement Proposals; PEP 475
PEP 475@footnote{https://peps.python.org/pep-0475/} for the rationale), instead of returning an empty list
of events before the timeout.

@end deffn

@geindex close() (selectors.BaseSelector method)
@anchor{library/selectors selectors BaseSelector close}@anchor{3ad3}
@deffn {Method} close ()

Close the selector.

This must be called to make sure that any underlying resource is freed.
The selector shall not be used once it has been closed.
@end deffn

@geindex get_key() (selectors.BaseSelector method)
@anchor{library/selectors selectors BaseSelector get_key}@anchor{3ad4}
@deffn {Method} get_key (fileobj)

Return the key associated with a registered file object.

This returns the @ref{3acb,,SelectorKey} instance associated to this file
object, or raises @ref{5e7,,KeyError} if the file object is not registered.
@end deffn

@geindex get_map() (selectors.BaseSelector method)
@anchor{library/selectors selectors BaseSelector get_map}@anchor{3ad5}
@deffn {Method} abstractmethod get_map ()

Return a mapping of file objects to selector keys.

This returns a @ref{acd,,Mapping} instance mapping
registered file objects to their associated @ref{3acb,,SelectorKey}
instance.
@end deffn
@end deffn

@geindex DefaultSelector (class in selectors)
@anchor{library/selectors selectors DefaultSelector}@anchor{3ac7}
@deffn {Class} selectors.DefaultSelector

The default selector class, using the most efficient implementation
available on the current platform. This should be the default choice for
most users.
@end deffn

@geindex SelectSelector (class in selectors)
@anchor{library/selectors selectors SelectSelector}@anchor{398c}
@deffn {Class} selectors.SelectSelector

@ref{fa6,,select.select()}-based selector.
@end deffn

@geindex PollSelector (class in selectors)
@anchor{library/selectors selectors PollSelector}@anchor{dd7}
@deffn {Class} selectors.PollSelector

@ref{3119,,select.poll()}-based selector.
@end deffn

@geindex EpollSelector (class in selectors)
@anchor{library/selectors selectors EpollSelector}@anchor{dd6}
@deffn {Class} selectors.EpollSelector

@ref{119a,,select.epoll()}-based selector.

@geindex fileno() (selectors.EpollSelector method)
@anchor{library/selectors selectors EpollSelector fileno}@anchor{3ad6}
@deffn {Method} fileno ()

This returns the file descriptor used by the underlying
@ref{119a,,select.epoll()} object.
@end deffn
@end deffn

@geindex DevpollSelector (class in selectors)
@anchor{library/selectors selectors DevpollSelector}@anchor{dd8}
@deffn {Class} selectors.DevpollSelector

@ref{119c,,select.devpoll()}-based selector.

@geindex fileno() (selectors.DevpollSelector method)
@anchor{library/selectors selectors DevpollSelector fileno}@anchor{3ad7}
@deffn {Method} fileno ()

This returns the file descriptor used by the underlying
@ref{119c,,select.devpoll()} object.
@end deffn


Added in version 3.5.

@end deffn

@geindex KqueueSelector (class in selectors)
@anchor{library/selectors selectors KqueueSelector}@anchor{398f}
@deffn {Class} selectors.KqueueSelector

@ref{1a89,,select.kqueue()}-based selector.

@geindex fileno() (selectors.KqueueSelector method)
@anchor{library/selectors selectors KqueueSelector fileno}@anchor{3ad8}
@deffn {Method} fileno ()

This returns the file descriptor used by the underlying
@ref{1a89,,select.kqueue()} object.
@end deffn
@end deffn

@node Examples<22>,,Classes<4>,selectors — High-level I/O multiplexing
@anchor{library/selectors examples}@anchor{3ad9}
@subsubsection Examples


Here is a simple echo server implementation:

@example
import selectors
import socket

sel = selectors.DefaultSelector()

def accept(sock, mask):
    conn, addr = sock.accept()  # Should be ready
    print('accepted', conn, 'from', addr)
    conn.setblocking(False)
    sel.register(conn, selectors.EVENT_READ, read)

def read(conn, mask):
    data = conn.recv(1000)  # Should be ready
    if data:
        print('echoing', repr(data), 'to', conn)
        conn.send(data)  # Hope it won't block
    else:
        print('closing', conn)
        sel.unregister(conn)
        conn.close()

sock = socket.socket()
sock.bind(('localhost', 1234))
sock.listen(100)
sock.setblocking(False)
sel.register(sock, selectors.EVENT_READ, accept)

while True:
    events = sel.select()
    for key, mask in events:
        callback = key.data
        callback(key.fileobj, mask)
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node signal — Set handlers for asynchronous events,mmap — Memory-mapped file support,selectors — High-level I/O multiplexing,Networking and Interprocess Communication
@anchor{library/signal doc}@anchor{3ada}@anchor{library/signal module-signal}@anchor{cb}@anchor{library/signal signal-set-handlers-for-asynchronous-events}@anchor{3adb}@anchor{library/signal translation-repo}@anchor{3adc}
@subsection @code{signal} — Set handlers for asynchronous events


@geindex module; signal

`Source code:' Lib/signal.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/signal.py}


__________________________________________________________________


This module provides mechanisms to use signal handlers in Python.

@menu
* General rules:: 
* Module contents: Module contents<3>. 
* Examples: Examples<23>. 
* Note on SIGPIPE:: 
* Note on Signal Handlers and Exceptions:: 

@end menu

@node General rules,Module contents<3>,,signal — Set handlers for asynchronous events
@anchor{library/signal general-rules}@anchor{3add}
@subsubsection General rules


The @ref{1340,,signal.signal()} function allows defining custom handlers to be
executed when a signal is received.  A small number of default handlers are
installed: @ref{3ade,,SIGPIPE} is ignored (so write errors on pipes and sockets
can be reported as ordinary Python exceptions) and @ref{255,,SIGINT} is
translated into a @ref{bcb,,KeyboardInterrupt} exception if the parent process
has not changed it.

A handler for a particular signal, once set, remains installed until it is
explicitly reset (Python emulates the BSD style interface regardless of the
underlying implementation), with the exception of the handler for
@ref{3154,,SIGCHLD}, which follows the underlying implementation.

On WebAssembly platforms, signals are emulated and therefore behave
differently. Several functions and signals are not available on these
platforms.

@menu
* Execution of Python signal handlers:: 
* Signals and threads:: 

@end menu

@node Execution of Python signal handlers,Signals and threads,,General rules
@anchor{library/signal execution-of-python-signal-handlers}@anchor{3adf}
@subsubsection Execution of Python signal handlers


A Python signal handler does not get executed inside the low-level (C) signal
handler.  Instead, the low-level signal handler sets a flag which tells the
@ref{3ae0,,virtual machine} to execute the corresponding Python signal handler
at a later point (for example, at the next @ref{4ab,,bytecode} instruction).
This has consequences:


@itemize *

@item 
It makes little sense to catch synchronous errors like @ref{1287,,SIGFPE} or
@ref{1286,,SIGSEGV} that are caused by an invalid operation in C code.  Python
will return from the signal handler to the C code, which is likely to raise
the same signal again, causing Python to apparently hang.  From Python 3.3
onwards, you can use the @ref{5c,,faulthandler} module to report on synchronous
errors.

@item 
A long-running calculation implemented purely in C (such as regular
expression matching on a large body of text) may run uninterrupted for an
arbitrary amount of time, regardless of any signals received.  The Python
signal handlers will be called when the calculation finishes.

@item 
If the handler raises an exception, it will be raised “out of thin air” in
the main thread. See the @ref{2735,,note below} for a
discussion.
@end itemize

@node Signals and threads,,Execution of Python signal handlers,General rules
@anchor{library/signal id1}@anchor{3ae1}@anchor{library/signal signals-and-threads}@anchor{3ae2}
@subsubsection Signals and threads


Python signal handlers are always executed in the main Python thread of the main interpreter,
even if the signal was received in another thread.  This means that signals
can’t be used as a means of inter-thread communication.  You can use
the synchronization primitives from the @ref{f3,,threading} module instead.

Besides, only the main thread of the main interpreter is allowed to set a new signal handler.

@cartouche
@quotation Warning 
Synchronization primitives such as @ref{1a39,,threading.Lock} should not be used
within signal handlers.  Doing so can lead to unexpected deadlocks.
@end quotation
@end cartouche

@node Module contents<3>,Examples<23>,General rules,signal — Set handlers for asynchronous events
@anchor{library/signal module-contents}@anchor{3ae3}
@subsubsection Module contents



Changed in version 3.5: signal (SIG*), handler (@ref{1bf5,,SIG_DFL}, @ref{1bf4,,SIG_IGN}) and sigmask
(@ref{3ae4,,SIG_BLOCK}, @ref{3ae5,,SIG_UNBLOCK}, @ref{3ae6,,SIG_SETMASK})
related constants listed below were turned into
@ref{ee1,,enums} (@ref{3ae7,,Signals}, @ref{3ae8,,Handlers} and @ref{3ae9,,Sigmasks} respectively).
@ref{1a6c,,getsignal()}, @ref{133c,,pthread_sigmask()}, @ref{133e,,sigpending()} and
@ref{133f,,sigwait()} functions return human-readable
@code{enums} as @code{Signals} objects.


The signal module defines three enums:

@geindex Signals (class in signal)
@anchor{library/signal signal Signals}@anchor{3ae7}
@deffn {Class} signal.Signals

@ref{ee1,,enum.IntEnum} collection of SIG* constants and the CTRL_* constants.


Added in version 3.5.

@end deffn

@geindex Handlers (class in signal)
@anchor{library/signal signal Handlers}@anchor{3ae8}
@deffn {Class} signal.Handlers

@ref{ee1,,enum.IntEnum} collection of the constants @ref{1bf5,,SIG_DFL} and @ref{1bf4,,SIG_IGN}.


Added in version 3.5.

@end deffn

@geindex Sigmasks (class in signal)
@anchor{library/signal signal Sigmasks}@anchor{3ae9}
@deffn {Class} signal.Sigmasks

@ref{ee1,,enum.IntEnum} collection of the constants @ref{3ae4,,SIG_BLOCK}, @ref{3ae5,,SIG_UNBLOCK} and @ref{3ae6,,SIG_SETMASK}.

@ref{2181,,Availability}: Unix.

See the man page @code{sigprocmask(2)@footnote{https://manpages.debian.org/sigprocmask(2)}} and
@code{pthread_sigmask(3)@footnote{https://manpages.debian.org/pthread_sigmask(3)}} for further information.


Added in version 3.5.

@end deffn

The variables defined in the @code{signal} module are:

@geindex SIG_DFL (in module signal)
@anchor{library/signal signal SIG_DFL}@anchor{1bf5}
@deffn {Data} signal.SIG_DFL

This is one of two standard signal handling options; it will simply perform
the default function for the signal.  For example, on most systems the
default action for @ref{3aea,,SIGQUIT} is to dump core and exit, while the
default action for @ref{3154,,SIGCHLD} is to simply ignore it.
@end deffn

@geindex SIG_IGN (in module signal)
@anchor{library/signal signal SIG_IGN}@anchor{1bf4}
@deffn {Data} signal.SIG_IGN

This is another standard signal handler, which will simply ignore the given
signal.
@end deffn

@geindex SIGABRT (in module signal)
@anchor{library/signal signal SIGABRT}@anchor{1288}
@deffn {Data} signal.SIGABRT

Abort signal from @code{abort(3)@footnote{https://manpages.debian.org/abort(3)}}.
@end deffn

@geindex SIGALRM (in module signal)
@anchor{library/signal signal SIGALRM}@anchor{3aeb}
@deffn {Data} signal.SIGALRM

Timer signal from @code{alarm(2)@footnote{https://manpages.debian.org/alarm(2)}}.

@ref{2181,,Availability}: Unix.
@end deffn

@geindex SIGBREAK (in module signal)
@anchor{library/signal signal SIGBREAK}@anchor{3aec}
@deffn {Data} signal.SIGBREAK

Interrupt from keyboard (CTRL + BREAK).

@ref{2181,,Availability}: Windows.
@end deffn

@geindex SIGBUS (in module signal)
@anchor{library/signal signal SIGBUS}@anchor{1289}
@deffn {Data} signal.SIGBUS

Bus error (bad memory access).

@ref{2181,,Availability}: Unix.
@end deffn

@geindex SIGCHLD (in module signal)
@anchor{library/signal signal SIGCHLD}@anchor{3154}
@deffn {Data} signal.SIGCHLD

Child process stopped or terminated.

@ref{2181,,Availability}: Unix.
@end deffn

@geindex SIGCLD (in module signal)
@anchor{library/signal signal SIGCLD}@anchor{3aed}
@deffn {Data} signal.SIGCLD

Alias to @ref{3154,,SIGCHLD}.

@ref{2181,,Availability}: not macOS.
@end deffn

@geindex SIGCONT (in module signal)
@anchor{library/signal signal SIGCONT}@anchor{3162}
@deffn {Data} signal.SIGCONT

Continue the process if it is currently stopped

@ref{2181,,Availability}: Unix.
@end deffn

@geindex SIGFPE (in module signal)
@anchor{library/signal signal SIGFPE}@anchor{1287}
@deffn {Data} signal.SIGFPE

Floating-point exception. For example, division by zero.


@subsubheading See also


@ref{b45,,ZeroDivisionError} is raised when the second argument of a division
or modulo operation is zero.

@end deffn

@geindex SIGHUP (in module signal)
@anchor{library/signal signal SIGHUP}@anchor{3aee}
@deffn {Data} signal.SIGHUP

Hangup detected on controlling terminal or death of controlling process.

@ref{2181,,Availability}: Unix.
@end deffn

@geindex SIGILL (in module signal)
@anchor{library/signal signal SIGILL}@anchor{128a}
@deffn {Data} signal.SIGILL

Illegal instruction.
@end deffn

@geindex SIGINT (in module signal)
@anchor{library/signal signal SIGINT}@anchor{255}
@deffn {Data} signal.SIGINT

Interrupt from keyboard (CTRL + C).

Default action is to raise @ref{bcb,,KeyboardInterrupt}.
@end deffn

@geindex SIGKILL (in module signal)
@anchor{library/signal signal SIGKILL}@anchor{d56}
@deffn {Data} signal.SIGKILL

Kill signal.

It cannot be caught, blocked, or ignored.

@ref{2181,,Availability}: Unix.
@end deffn

@geindex SIGPIPE (in module signal)
@anchor{library/signal signal SIGPIPE}@anchor{3ade}
@deffn {Data} signal.SIGPIPE

Broken pipe: write to pipe with no readers.

Default action is to ignore the signal.

@ref{2181,,Availability}: Unix.
@end deffn

@geindex SIGPROF (in module signal)
@anchor{library/signal signal SIGPROF}@anchor{3aef}
@deffn {Data} signal.SIGPROF

Profiling timer expired.

@ref{2181,,Availability}: Unix.
@end deffn

@geindex SIGQUIT (in module signal)
@anchor{library/signal signal SIGQUIT}@anchor{3aea}
@deffn {Data} signal.SIGQUIT

Terminal quit signal.

@ref{2181,,Availability}: Unix.
@end deffn

@geindex SIGSEGV (in module signal)
@anchor{library/signal signal SIGSEGV}@anchor{1286}
@deffn {Data} signal.SIGSEGV

Segmentation fault: invalid memory reference.
@end deffn

@geindex SIGSTOP (in module signal)
@anchor{library/signal signal SIGSTOP}@anchor{3af0}
@deffn {Data} signal.SIGSTOP

Stop executing (cannot be caught or ignored).

@ref{2181,,Availability}: Unix.
@end deffn

@geindex SIGSTKFLT (in module signal)
@anchor{library/signal signal SIGSTKFLT}@anchor{1c4a}
@deffn {Data} signal.SIGSTKFLT

Stack fault on coprocessor. The Linux kernel does not raise this signal: it
can only be raised in user space.

@ref{2181,,Availability}: Linux.

On architectures where the signal is available. See
the man page @code{signal(7)@footnote{https://manpages.debian.org/signal(7)}} for further information.


Added in version 3.11.

@end deffn

@geindex SIGTERM (in module signal)
@anchor{library/signal signal SIGTERM}@anchor{15eb}
@deffn {Data} signal.SIGTERM

Termination signal.
@end deffn

@geindex SIGUSR1 (in module signal)
@anchor{library/signal signal SIGUSR1}@anchor{3af1}
@deffn {Data} signal.SIGUSR1

User-defined signal 1.

@ref{2181,,Availability}: Unix.
@end deffn

@geindex SIGUSR2 (in module signal)
@anchor{library/signal signal SIGUSR2}@anchor{3af2}
@deffn {Data} signal.SIGUSR2

User-defined signal 2.

@ref{2181,,Availability}: Unix.
@end deffn

@geindex SIGVTALRM (in module signal)
@anchor{library/signal signal SIGVTALRM}@anchor{3af3}
@deffn {Data} signal.SIGVTALRM

Virtual timer expired.

@ref{2181,,Availability}: Unix.
@end deffn

@geindex SIGWINCH (in module signal)
@anchor{library/signal signal SIGWINCH}@anchor{3af4}
@deffn {Data} signal.SIGWINCH

Window resize signal.

@ref{2181,,Availability}: Unix.
@end deffn

@geindex SIGXCPU (in module signal)
@anchor{library/signal signal SIGXCPU}@anchor{3af5}
@deffn {Data} signal.SIGXCPU

CPU time limit exceeded.

@ref{2181,,Availability}: Unix.
@end deffn


@deffn {Data} SIG*

All the signal numbers are defined symbolically.  For example, the hangup signal
is defined as @ref{3aee,,signal.SIGHUP}; the variable names are identical to the
names used in C programs, as found in @code{<signal.h>}.  The Unix man page for
‘@code{signal}’ lists the existing signals (on some systems this is
@code{signal(2)@footnote{https://manpages.debian.org/signal(2)}}, on others the list is in @code{signal(7)@footnote{https://manpages.debian.org/signal(7)}}). Note that
not all systems define the same set of signal names; only those names defined by
the system are defined by this module.
@end deffn

@geindex CTRL_C_EVENT (in module signal)
@anchor{library/signal signal CTRL_C_EVENT}@anchor{1574}
@deffn {Data} signal.CTRL_C_EVENT

The signal corresponding to the @code{Ctrl}+@code{C} keystroke event. This signal can
only be used with @ref{1573,,os.kill()}.

@ref{2181,,Availability}: Windows.


Added in version 3.2.

@end deffn

@geindex CTRL_BREAK_EVENT (in module signal)
@anchor{library/signal signal CTRL_BREAK_EVENT}@anchor{1575}
@deffn {Data} signal.CTRL_BREAK_EVENT

The signal corresponding to the @code{Ctrl}+@code{Break} keystroke event. This signal can
only be used with @ref{1573,,os.kill()}.

@ref{2181,,Availability}: Windows.


Added in version 3.2.

@end deffn

@geindex NSIG (in module signal)
@anchor{library/signal signal NSIG}@anchor{1bcf}
@deffn {Data} signal.NSIG

One more than the number of the highest signal number.
Use @ref{3af6,,valid_signals()} to get valid signal numbers.
@end deffn

@geindex ITIMER_REAL (in module signal)
@anchor{library/signal signal ITIMER_REAL}@anchor{3af7}
@deffn {Data} signal.ITIMER_REAL

Decrements interval timer in real time, and delivers @ref{3aeb,,SIGALRM} upon
expiration.
@end deffn

@geindex ITIMER_VIRTUAL (in module signal)
@anchor{library/signal signal ITIMER_VIRTUAL}@anchor{3af8}
@deffn {Data} signal.ITIMER_VIRTUAL

Decrements interval timer only when the process is executing, and delivers
SIGVTALRM upon expiration.
@end deffn

@geindex ITIMER_PROF (in module signal)
@anchor{library/signal signal ITIMER_PROF}@anchor{3af9}
@deffn {Data} signal.ITIMER_PROF

Decrements interval timer both when the process executes and when the
system is executing on behalf of the process. Coupled with ITIMER_VIRTUAL,
this timer is usually used to profile the time spent by the application
in user and kernel space. SIGPROF is delivered upon expiration.
@end deffn

@geindex SIG_BLOCK (in module signal)
@anchor{library/signal signal SIG_BLOCK}@anchor{3ae4}
@deffn {Data} signal.SIG_BLOCK

A possible value for the `how' parameter to @ref{133c,,pthread_sigmask()}
indicating that signals are to be blocked.


Added in version 3.3.

@end deffn

@geindex SIG_UNBLOCK (in module signal)
@anchor{library/signal signal SIG_UNBLOCK}@anchor{3ae5}
@deffn {Data} signal.SIG_UNBLOCK

A possible value for the `how' parameter to @ref{133c,,pthread_sigmask()}
indicating that signals are to be unblocked.


Added in version 3.3.

@end deffn

@geindex SIG_SETMASK (in module signal)
@anchor{library/signal signal SIG_SETMASK}@anchor{3ae6}
@deffn {Data} signal.SIG_SETMASK

A possible value for the `how' parameter to @ref{133c,,pthread_sigmask()}
indicating that the signal mask is to be replaced.


Added in version 3.3.

@end deffn

The @code{signal} module defines one exception:

@geindex ItimerError
@anchor{library/signal signal ItimerError}@anchor{3afa}
@deffn {Exception} signal.ItimerError

Raised to signal an error from the underlying @ref{3afb,,setitimer()} or
@ref{3afc,,getitimer()} implementation. Expect this error if an invalid
interval timer or a negative time is passed to @code{setitimer()}.
This error is a subtype of @ref{2c2,,OSError}.


Added in version 3.3: This error used to be a subtype of @ref{1259,,IOError}, which is now an
alias of @ref{2c2,,OSError}.

@end deffn

The @code{signal} module defines the following functions:

@geindex alarm() (in module signal)
@anchor{library/signal signal alarm}@anchor{3afd}
@deffn {Function} signal.alarm (time)

If `time' is non-zero, this function requests that a @ref{3aeb,,SIGALRM} signal be
sent to the process in `time' seconds. Any previously scheduled alarm is
canceled (only one alarm can be scheduled at any time).  The returned value is
then the number of seconds before any previously set alarm was to have been
delivered. If `time' is zero, no alarm is scheduled, and any scheduled alarm is
canceled.  If the return value is zero, no alarm is currently scheduled.

@ref{2181,,Availability}: Unix.

See the man page @code{alarm(2)@footnote{https://manpages.debian.org/alarm(2)}} for further information.
@end deffn

@geindex getsignal() (in module signal)
@anchor{library/signal signal getsignal}@anchor{1a6c}
@deffn {Function} signal.getsignal (signalnum)

Return the current signal handler for the signal `signalnum'. The returned value
may be a callable Python object, or one of the special values
@ref{1bf4,,signal.SIG_IGN}, @ref{1bf5,,signal.SIG_DFL} or @ref{887,,None}.  Here,
@code{signal.SIG_IGN} means that the signal was previously ignored,
@code{signal.SIG_DFL} means that the default way of handling the signal was
previously in use, and @code{None} means that the previous signal handler was not
installed from Python.
@end deffn

@geindex strsignal() (in module signal)
@anchor{library/signal signal strsignal}@anchor{1e61}
@deffn {Function} signal.strsignal (signalnum)

Returns the description of signal `signalnum', such as “Interrupt”
for @ref{255,,SIGINT}. Returns @ref{887,,None} if `signalnum' has no
description. Raises @ref{2ee,,ValueError} if `signalnum' is invalid.


Added in version 3.8.

@end deffn

@geindex valid_signals() (in module signal)
@anchor{library/signal signal valid_signals}@anchor{3af6}
@deffn {Function} signal.valid_signals ()

Return the set of valid signal numbers on this platform.  This can be
less than @code{range(1, NSIG)} if some signals are reserved by the system
for internal use.


Added in version 3.8.

@end deffn

@geindex pause() (in module signal)
@anchor{library/signal signal pause}@anchor{3afe}
@deffn {Function} signal.pause ()

Cause the process to sleep until a signal is received; the appropriate handler
will then be called.  Returns nothing.

@ref{2181,,Availability}: Unix.

See the man page @code{signal(2)@footnote{https://manpages.debian.org/signal(2)}} for further information.

See also @ref{133f,,sigwait()}, @ref{fb1,,sigwaitinfo()}, @ref{fb0,,sigtimedwait()} and
@ref{133e,,sigpending()}.
@end deffn

@geindex raise_signal() (in module signal)
@anchor{library/signal signal raise_signal}@anchor{1bd3}
@deffn {Function} signal.raise_signal (signum)

Sends a signal to the calling process. Returns nothing.


Added in version 3.8.

@end deffn

@geindex pidfd_send_signal() (in module signal)
@anchor{library/signal signal pidfd_send_signal}@anchor{b2b}
@deffn {Function} signal.pidfd_send_signal (pidfd, sig, siginfo=None, flags=0)

Send signal `sig' to the process referred to by file descriptor `pidfd'.
Python does not currently support the `siginfo' parameter; it must be
@code{None}.  The `flags' argument is provided for future extensions; no flag
values are currently defined.

See the @code{pidfd_send_signal(2)@footnote{https://manpages.debian.org/pidfd_send_signal(2)}} man page for more information.

@ref{2181,,Availability}: Linux >= 5.1, Android >= @ref{d89,,build-time} API level 31


Added in version 3.9.

@end deffn

@geindex pthread_kill() (in module signal)
@anchor{library/signal signal pthread_kill}@anchor{133d}
@deffn {Function} signal.pthread_kill (thread_id, signalnum)

Send the signal `signalnum' to the thread `thread_id', another thread in the
same process as the caller.  The target thread can be executing any code
(Python or not).  However, if the target thread is executing the Python
interpreter, the Python signal handlers will be @ref{3ae2,,executed by the main thread of the main interpreter}.  Therefore, the only point of sending a
signal to a particular Python thread would be to force a running system call
to fail with @ref{f8e,,InterruptedError}.

Use @ref{1366,,threading.get_ident()} or the @ref{31a9,,ident}
attribute of @ref{177,,threading.Thread} objects to get a suitable value
for `thread_id'.

If `signalnum' is 0, then no signal is sent, but error checking is still
performed; this can be used to check if the target thread is still running.

Raises an @ref{1cb1,,auditing event} @code{signal.pthread_kill} with arguments @code{thread_id}, @code{signalnum}.

@ref{2181,,Availability}: Unix.

See the man page @code{pthread_kill(3)@footnote{https://manpages.debian.org/pthread_kill(3)}} for further  information.

See also @ref{1573,,os.kill()}.


Added in version 3.3.

@end deffn

@geindex pthread_sigmask() (in module signal)
@anchor{library/signal signal pthread_sigmask}@anchor{133c}
@deffn {Function} signal.pthread_sigmask (how, mask)

Fetch and/or change the signal mask of the calling thread.  The signal mask
is the set of signals whose delivery is currently blocked for the caller.
Return the old signal mask as a set of signals.

The behavior of the call is dependent on the value of `how', as follows.


@itemize *

@item 
@ref{3ae4,,SIG_BLOCK}: The set of blocked signals is the union of the current
set and the `mask' argument.

@item 
@ref{3ae5,,SIG_UNBLOCK}: The signals in `mask' are removed from the current
set of blocked signals.  It is permissible to attempt to unblock a
signal which is not blocked.

@item 
@ref{3ae6,,SIG_SETMASK}: The set of blocked signals is set to the `mask'
argument.
@end itemize

`mask' is a set of signal numbers (e.g. @{@ref{255,,signal.SIGINT},
@ref{15eb,,signal.SIGTERM}@}). Use @ref{3af6,,valid_signals()} for a full
mask including all signals.

For example, @code{signal.pthread_sigmask(signal.SIG_BLOCK, [])} reads the
signal mask of the calling thread.

@ref{d56,,SIGKILL} and @ref{3af0,,SIGSTOP} cannot be blocked.

@ref{2181,,Availability}: Unix.

See the man page @code{sigprocmask(2)@footnote{https://manpages.debian.org/sigprocmask(2)}} and
@code{pthread_sigmask(3)@footnote{https://manpages.debian.org/pthread_sigmask(3)}} for further information.

See also @ref{3afe,,pause()}, @ref{133e,,sigpending()} and @ref{133f,,sigwait()}.


Added in version 3.3.

@end deffn

@geindex setitimer() (in module signal)
@anchor{library/signal signal setitimer}@anchor{3afb}
@deffn {Function} signal.setitimer (which, seconds, interval=0.0)

Sets given interval timer (one of @ref{3af7,,signal.ITIMER_REAL},
@ref{3af8,,signal.ITIMER_VIRTUAL} or @ref{3af9,,signal.ITIMER_PROF}) specified
by `which' to fire after `seconds' (float is accepted, different from
@ref{3afd,,alarm()}) and after that every `interval' seconds (if `interval'
is non-zero). The interval timer specified by `which' can be cleared by
setting `seconds' to zero.

When an interval timer fires, a signal is sent to the process.
The signal sent is dependent on the timer being used;
@ref{3af7,,signal.ITIMER_REAL} will deliver @ref{3aeb,,SIGALRM},
@ref{3af8,,signal.ITIMER_VIRTUAL} sends @ref{3af3,,SIGVTALRM},
and @ref{3af9,,signal.ITIMER_PROF} will deliver @ref{3aef,,SIGPROF}.

The old values are returned as a tuple: (delay, interval).

Attempting to pass an invalid interval timer will cause an
@ref{3afa,,ItimerError}.

@ref{2181,,Availability}: Unix.
@end deffn

@geindex getitimer() (in module signal)
@anchor{library/signal signal getitimer}@anchor{3afc}
@deffn {Function} signal.getitimer (which)

Returns current value of a given interval timer specified by `which'.

@ref{2181,,Availability}: Unix.
@end deffn

@geindex set_wakeup_fd() (in module signal)
@anchor{library/signal signal set_wakeup_fd}@anchor{d6d}
@deffn {Function} signal.set_wakeup_fd (fd, *, warn_on_full_buffer=True)

Set the wakeup file descriptor to `fd'.  When a signal your program has
registered a signal handler for is received, the signal number is written as
a single byte into the fd.  If you haven’t registered a signal handler for
the signals you care about, then nothing will be written to the wakeup fd.
This can be used by a library to wakeup a poll or select call, allowing the
signal to be fully processed.

The old wakeup fd is returned (or -1 if file descriptor wakeup was not
enabled).  If `fd' is -1, file descriptor wakeup is disabled.
If not -1, `fd' must be non-blocking.  It is up to the library to remove
any bytes from `fd' before calling poll or select again.

When threads are enabled, this function can only be called
from @ref{3ae2,,the main thread of the main interpreter};
attempting to call it from other threads will cause a @ref{2ee,,ValueError}
exception to be raised.

There are two common ways to use this function. In both approaches,
you use the fd to wake up when a signal arrives, but then they
differ in how they determine `which' signal or signals have
arrived.

In the first approach, we read the data out of the fd’s buffer, and
the byte values give you the signal numbers. This is simple, but in
rare cases it can run into a problem: generally the fd will have a
limited amount of buffer space, and if too many signals arrive too
quickly, then the buffer may become full, and some signals may be
lost. If you use this approach, then you should set
@code{warn_on_full_buffer=True}, which will at least cause a warning
to be printed to stderr when signals are lost.

In the second approach, we use the wakeup fd `only' for wakeups,
and ignore the actual byte values. In this case, all we care about
is whether the fd’s buffer is empty or non-empty; a full buffer
doesn’t indicate a problem at all. If you use this approach, then
you should set @code{warn_on_full_buffer=False}, so that your users
are not confused by spurious warning messages.


Changed in version 3.5: On Windows, the function now also supports socket handles.



Changed in version 3.7: Added @code{warn_on_full_buffer} parameter.

@end deffn

@geindex siginterrupt() (in module signal)
@anchor{library/signal signal siginterrupt}@anchor{1341}
@deffn {Function} signal.siginterrupt (signalnum, flag)

Change system call restart behaviour: if `flag' is @ref{d31,,False}, system
calls will be restarted when interrupted by signal `signalnum', otherwise
system calls will be interrupted.  Returns nothing.

@ref{2181,,Availability}: Unix.

See the man page @code{siginterrupt(3)@footnote{https://manpages.debian.org/siginterrupt(3)}} for further information.

Note that installing a signal handler with @ref{cb,,signal()} will reset the
restart behaviour to interruptible by implicitly calling
@code{siginterrupt()} with a true `flag' value for the given signal.
@end deffn

@geindex signal() (in module signal)
@anchor{library/signal signal signal}@anchor{1340}
@deffn {Function} signal.signal (signalnum, handler)

Set the handler for signal `signalnum' to the function `handler'.  `handler' can
be a callable Python object taking two arguments (see below), or one of the
special values @ref{1bf4,,signal.SIG_IGN} or @ref{1bf5,,signal.SIG_DFL}.  The previous
signal handler will be returned (see the description of @ref{1a6c,,getsignal()}
above).  (See the Unix man page @code{signal(2)@footnote{https://manpages.debian.org/signal(2)}} for further information.)

When threads are enabled, this function can only be called
from @ref{3ae2,,the main thread of the main interpreter};
attempting to call it from other threads will cause a @ref{2ee,,ValueError}
exception to be raised.

The `handler' is called with two arguments: the signal number and the current
stack frame (@code{None} or a frame object; for a description of frame objects,
see the @ref{8f1,,description in the type hierarchy} or see the
attribute descriptions in the @ref{82,,inspect} module).

On Windows, @code{signal()} can only be called with @ref{1288,,SIGABRT},
@ref{1287,,SIGFPE}, @ref{128a,,SIGILL}, @ref{255,,SIGINT}, @ref{1286,,SIGSEGV},
@ref{15eb,,SIGTERM}, or @ref{3aec,,SIGBREAK}.
A @ref{2ee,,ValueError} will be raised in any other case.
Note that not all systems define the same set of signal names; an
@ref{5f0,,AttributeError} will be raised if a signal name is not defined as
@code{SIG*} module level constant.
@end deffn

@geindex sigpending() (in module signal)
@anchor{library/signal signal sigpending}@anchor{133e}
@deffn {Function} signal.sigpending ()

Examine the set of signals that are pending for delivery to the calling
thread (i.e., the signals which have been raised while blocked).  Return the
set of the pending signals.

@ref{2181,,Availability}: Unix.

See the man page @code{sigpending(2)@footnote{https://manpages.debian.org/sigpending(2)}} for further information.

See also @ref{3afe,,pause()}, @ref{133c,,pthread_sigmask()} and @ref{133f,,sigwait()}.


Added in version 3.3.

@end deffn

@geindex sigwait() (in module signal)
@anchor{library/signal signal sigwait}@anchor{133f}
@deffn {Function} signal.sigwait (sigset)

Suspend execution of the calling thread until the delivery of one of the
signals specified in the signal set `sigset'.  The function accepts the signal
(removes it from the pending list of signals), and returns the signal number.

@ref{2181,,Availability}: Unix.

See the man page @code{sigwait(3)@footnote{https://manpages.debian.org/sigwait(3)}} for further information.

See also @ref{3afe,,pause()}, @ref{133c,,pthread_sigmask()}, @ref{133e,,sigpending()},
@ref{fb1,,sigwaitinfo()} and @ref{fb0,,sigtimedwait()}.


Added in version 3.3.

@end deffn

@geindex sigwaitinfo() (in module signal)
@anchor{library/signal signal sigwaitinfo}@anchor{fb1}
@deffn {Function} signal.sigwaitinfo (sigset)

Suspend execution of the calling thread until the delivery of one of the
signals specified in the signal set `sigset'.  The function accepts the
signal and removes it from the pending list of signals. If one of the
signals in `sigset' is already pending for the calling thread, the function
will return immediately with information about that signal. The signal
handler is not called for the delivered signal. The function raises an
@ref{f8e,,InterruptedError} if it is interrupted by a signal that is not in
`sigset'.

The return value is an object representing the data contained in the
@code{siginfo_t} structure, namely: @code{si_signo}, @code{si_code},
@code{si_errno}, @code{si_pid}, @code{si_uid}, @code{si_status}, @code{si_band}.

@ref{2181,,Availability}: Unix.

See the man page @code{sigwaitinfo(2)@footnote{https://manpages.debian.org/sigwaitinfo(2)}} for further information.

See also @ref{3afe,,pause()}, @ref{133f,,sigwait()} and @ref{fb0,,sigtimedwait()}.


Added in version 3.3.



Changed in version 3.5: The function is now retried if interrupted by a signal not in `sigset'
and the signal handler does not raise an exception (see 
@geindex Python Enhancement Proposals; PEP 475
PEP 475@footnote{https://peps.python.org/pep-0475/} for
the rationale).

@end deffn

@geindex sigtimedwait() (in module signal)
@anchor{library/signal signal sigtimedwait}@anchor{fb0}
@deffn {Function} signal.sigtimedwait (sigset, timeout)

Like @ref{fb1,,sigwaitinfo()}, but takes an additional `timeout' argument
specifying a timeout. If `timeout' is specified as @code{0}, a poll is
performed. Returns @ref{887,,None} if a timeout occurs.

@ref{2181,,Availability}: Unix.

See the man page @code{sigtimedwait(2)@footnote{https://manpages.debian.org/sigtimedwait(2)}} for further information.

See also @ref{3afe,,pause()}, @ref{133f,,sigwait()} and @ref{fb1,,sigwaitinfo()}.


Added in version 3.3.



Changed in version 3.5: The function is now retried with the recomputed `timeout' if interrupted
by a signal not in `sigset' and the signal handler does not raise an
exception (see 
@geindex Python Enhancement Proposals; PEP 475
PEP 475@footnote{https://peps.python.org/pep-0475/} for the rationale).

@end deffn

@node Examples<23>,Note on SIGPIPE,Module contents<3>,signal — Set handlers for asynchronous events
@anchor{library/signal examples}@anchor{3aff}@anchor{library/signal signal-example}@anchor{3b00}
@subsubsection Examples


Here is a minimal example program. It uses the @ref{3afd,,alarm()} function to limit
the time spent waiting to open a file; this is useful if the file is for a
serial device that may not be turned on, which would normally cause the
@ref{f98,,os.open()} to hang indefinitely.  The solution is to set a 5-second alarm
before opening the file; if the operation takes too long, the alarm signal will
be sent, and the handler raises an exception.

@example
import signal, os

def handler(signum, frame):
    signame = signal.Signals(signum).name
    print(f'Signal handler called with signal @{signame@} (@{signum@})')
    raise OSError("Couldn't open device!")

# Set the signal handler and a 5-second alarm
signal.signal(signal.SIGALRM, handler)
signal.alarm(5)

# This open() may hang indefinitely
fd = os.open('/dev/ttyS0', os.O_RDWR)

signal.alarm(0)          # Disable the alarm
@end example

@node Note on SIGPIPE,Note on Signal Handlers and Exceptions,Examples<23>,signal — Set handlers for asynchronous events
@anchor{library/signal note-on-sigpipe}@anchor{3b01}
@subsubsection Note on SIGPIPE


Piping output of your program to tools like @code{head(1)@footnote{https://manpages.debian.org/head(1)}} will
cause a @ref{3ade,,SIGPIPE} signal to be sent to your process when the receiver
of its standard output closes early.  This results in an exception
like @code{BrokenPipeError: [Errno 32] Broken pipe}.  To handle this
case, wrap your entry point to catch this exception as follows:

@example
import os
import sys

def main():
    try:
        # simulate large output (your code replaces this loop)
        for x in range(10000):
            print("y")
        # flush output here to force SIGPIPE to be triggered
        # while inside this try block.
        sys.stdout.flush()
    except BrokenPipeError:
        # Python flushes standard streams on exit; redirect remaining output
        # to devnull to avoid another BrokenPipeError at shutdown
        devnull = os.open(os.devnull, os.O_WRONLY)
        os.dup2(devnull, sys.stdout.fileno())
        sys.exit(1)  # Python exits with error code 1 on EPIPE

if __name__ == '__main__':
    main()
@end example

Do not set @ref{3ade,,SIGPIPE}’s disposition to @ref{1bf5,,SIG_DFL} in
order to avoid @ref{1262,,BrokenPipeError}.  Doing that would cause
your program to exit unexpectedly whenever any socket
connection is interrupted while your program is still writing to
it.

@node Note on Signal Handlers and Exceptions,,Note on SIGPIPE,signal — Set handlers for asynchronous events
@anchor{library/signal handlers-and-exceptions}@anchor{2735}@anchor{library/signal note-on-signal-handlers-and-exceptions}@anchor{3b02}
@subsubsection Note on Signal Handlers and Exceptions


If a signal handler raises an exception, the exception will be propagated to
the main thread and may be raised after any @ref{4ab,,bytecode} instruction. Most
notably, a @ref{bcb,,KeyboardInterrupt} may appear at any point during execution.
Most Python code, including the standard library, cannot be made robust against
this, and so a @code{KeyboardInterrupt} (or any other exception resulting from
a signal handler) may on rare occasions put the program in an unexpected state.

To illustrate this issue, consider the following code:

@example
class SpamContext:
    def __init__(self):
        self.lock = threading.Lock()

    def __enter__(self):
        # If KeyboardInterrupt occurs here, everything is fine
        self.lock.acquire()
        # If KeyboardInterrupt occurs here, __exit__ will not be called
        ...
        # KeyboardInterrupt could occur just before the function returns

    def __exit__(self, exc_type, exc_val, exc_tb):
        ...
        self.lock.release()
@end example

For many programs, especially those that merely want to exit on
@ref{bcb,,KeyboardInterrupt}, this is not a problem, but applications that are
complex or require high reliability should avoid raising exceptions from signal
handlers. They should also avoid catching @code{KeyboardInterrupt} as a means
of gracefully shutting down.  Instead, they should install their own
@ref{255,,SIGINT} handler. Below is an example of an HTTP server that avoids
@code{KeyboardInterrupt}:

@example
import signal
import socket
from selectors import DefaultSelector, EVENT_READ
from http.server import HTTPServer, SimpleHTTPRequestHandler

interrupt_read, interrupt_write = socket.socketpair()

def handler(signum, frame):
    print('Signal handler called with signal', signum)
    interrupt_write.send(b'\0')
signal.signal(signal.SIGINT, handler)

def serve_forever(httpd):
    sel = DefaultSelector()
    sel.register(interrupt_read, EVENT_READ)
    sel.register(httpd, EVENT_READ)

    while True:
        for key, _ in sel.select():
            if key.fileobj == interrupt_read:
                interrupt_read.recv(1)
                return
            if key.fileobj == httpd:
                httpd.handle_request()

print("Serving on port 8000")
httpd = HTTPServer(('@w{'}, 8000), SimpleHTTPRequestHandler)
serve_forever(httpd)
print("Shutdown...")
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node mmap — Memory-mapped file support,,signal — Set handlers for asynchronous events,Networking and Interprocess Communication
@anchor{library/mmap doc}@anchor{3b03}@anchor{library/mmap mmap-memory-mapped-file-support}@anchor{3b04}@anchor{library/mmap module-mmap}@anchor{94}@anchor{library/mmap translation-repo}@anchor{3b05}
@subsection @code{mmap} — Memory-mapped file support


@geindex module; mmap


__________________________________________________________________


@c include for modules that don't work on WASM

@ref{2181,,Availability}: not WASI.

This module does not work or is not available on WebAssembly. See
@ref{1bae,,WebAssembly platforms} for more information.

Memory-mapped file objects behave like both @ref{342,,bytearray} and like
@ref{13cf,,file objects}.  You can use mmap objects in most places
where @code{bytearray} are expected; for example, you can use the @ref{be,,re}
module to search through a memory-mapped file.  You can also change a single
byte by doing @code{obj[index] = 97}, or change a subsequence by assigning to a
slice: @code{obj[i1:i2] = b'...'}.  You can also read and write data starting at
the current file position, and @code{seek()} through the file to different positions.

A memory-mapped file is created by the @ref{51a,,mmap} constructor, which is
different on Unix and on Windows.  In either case you must provide a file
descriptor for a file opened for update. If you wish to map an existing Python
file object, use its @ref{17fe,,fileno()} method to obtain the correct value for the
`fileno' parameter.  Otherwise, you can open the file using the
@ref{f98,,os.open()} function, which returns a file descriptor directly (the file
still needs to be closed when done).

@cartouche
@quotation Note 
If you want to create a memory-mapping for a writable, buffered file, you
should @ref{2d57,,flush()} the file first.  This is necessary to ensure
that local modifications to the buffers are actually available to the
mapping.
@end quotation
@end cartouche

For both the Unix and Windows versions of the constructor, `access' may be
specified as an optional keyword parameter. `access' accepts one of four
values: @code{ACCESS_READ}, @code{ACCESS_WRITE}, or @code{ACCESS_COPY} to
specify read-only, write-through or copy-on-write memory respectively, or
@code{ACCESS_DEFAULT} to defer to `prot'.  `access' can be used on both Unix
and Windows.  If `access' is not specified, Windows mmap returns a
write-through mapping.  The initial memory values for all three access types
are taken from the specified file.  Assignment to an @code{ACCESS_READ}
memory map raises a @ref{199,,TypeError} exception.  Assignment to an
@code{ACCESS_WRITE} memory map affects both memory and the underlying file.
Assignment to an @code{ACCESS_COPY} memory map affects memory but does not
update the underlying file.


Changed in version 3.7: Added @code{ACCESS_DEFAULT} constant.


To map anonymous memory, -1 should be passed as the fileno along with the length.

@geindex mmap (class in mmap)
@anchor{library/mmap mmap mmap}@anchor{51a}
@deffn {Class} mmap.mmap (fileno, length, tagname=None, access=ACCESS_DEFAULT, offset=0)

`(Windows version)' Maps `length' bytes from the file specified by the
file handle `fileno', and creates a mmap object.  If `length' is larger
than the current size of the file, the file is extended to contain `length'
bytes.  If `length' is @code{0}, the maximum length of the map is the current
size of the file, except that if the file is empty Windows raises an
exception (you cannot create an empty mapping on Windows).

`tagname', if specified and not @code{None}, is a string giving a tag name for
the mapping.  Windows allows you to have many different mappings against
the same file.  If you specify the name of an existing tag, that tag is
opened, otherwise a new tag of this name is created.  If this parameter is
omitted or @code{None}, the mapping is created without a name.  Avoiding the
use of the `tagname' parameter will assist in keeping your code portable
between Unix and Windows.

`offset' may be specified as a non-negative integer offset. mmap references
will be relative to the offset from the beginning of the file. `offset'
defaults to 0.  `offset' must be a multiple of the @code{ALLOCATIONGRANULARITY}.

Raises an @ref{1cb1,,auditing event} @code{mmap.__new__} with arguments @code{fileno}, @code{length}, @code{access}, @code{offset}.
@end deffn


@deffn {Class} mmap.mmap (fileno, length, flags=MAP_SHARED, prot=PROT_WRITE | PROT_READ, access=ACCESS_DEFAULT, offset=0, *, trackfd=True)

`(Unix version)' Maps `length' bytes from the file specified by the file
descriptor `fileno', and returns a mmap object.  If `length' is @code{0}, the
maximum length of the map will be the current size of the file when
@ref{51a,,mmap} is called.

`flags' specifies the nature of the mapping. @ref{3b06,,MAP_PRIVATE} creates a
private copy-on-write mapping, so changes to the contents of the mmap
object will be private to this process, and @ref{3b07,,MAP_SHARED} creates a
mapping that’s shared with all other processes mapping the same areas of
the file.  The default value is @code{MAP_SHARED}. Some systems have
additional possible flags with the full list specified in
@ref{3b08,,MAP_* constants}.

`prot', if specified, gives the desired memory protection; the two most
useful values are @code{PROT_READ} and @code{PROT_WRITE}, to specify
that the pages may be read or written.  `prot' defaults to
@code{PROT_READ | PROT_WRITE}.

`access' may be specified in lieu of `flags' and `prot' as an optional
keyword parameter.  It is an error to specify both `flags', `prot' and
`access'.  See the description of `access' above for information on how to
use this parameter.

`offset' may be specified as a non-negative integer offset. mmap references
will be relative to the offset from the beginning of the file. `offset'
defaults to 0. `offset' must be a multiple of @code{ALLOCATIONGRANULARITY}
which is equal to @code{PAGESIZE} on Unix systems.

If `trackfd' is @code{False}, the file descriptor specified by `fileno' will
not be duplicated, and the resulting @code{mmap} object will not
be associated with the map’s underlying file.
This means that the @ref{3b09,,size()} and @ref{3b0a,,resize()}
methods will fail.
This mode is useful to limit the number of open file descriptors.

To ensure validity of the created memory mapping the file specified
by the descriptor `fileno' is internally automatically synchronized
with the physical backing store on macOS.


Changed in version 3.13: The `trackfd' parameter was added.


This example shows a simple way of using @ref{51a,,mmap}:

@example
import mmap

# write a simple example file
with open("hello.txt", "wb") as f:
    f.write(b"Hello Python!\n")

with open("hello.txt", "r+b") as f:
    # memory-map the file, size 0 means whole file
    mm = mmap.mmap(f.fileno(), 0)
    # read content via standard file methods
    print(mm.readline())  # prints b"Hello Python!\n"
    # read content via slice notation
    print(mm[:5])  # prints b"Hello"
    # update content using slice notation;
    # note that new content must have same size
    mm[6:] = b" world!\n"
    # ... and read again using standard file methods
    mm.seek(0)
    print(mm.readline())  # prints b"Hello  world!\n"
    # close the map
    mm.close()
@end example

@ref{51a,,mmap} can also be used as a context manager in a @ref{187,,with}
statement:

@example
import mmap

with mmap.mmap(-1, 13) as mm:
    mm.write(b"Hello world!")
@end example


Added in version 3.2: Context manager support.


The next example demonstrates how to create an anonymous map and exchange
data between the parent and child processes:

@example
import mmap
import os

mm = mmap.mmap(-1, 13)
mm.write(b"Hello world!")

pid = os.fork()

if pid == 0:  # In a child process
    mm.seek(0)
    print(mm.readline())

    mm.close()
@end example

Raises an @ref{1cb1,,auditing event} @code{mmap.__new__} with arguments @code{fileno}, @code{length}, @code{access}, @code{offset}.

Memory-mapped file objects support the following methods:

@geindex close() (mmap.mmap method)
@anchor{library/mmap mmap mmap close}@anchor{3b0b}
@deffn {Method} close ()

Closes the mmap. Subsequent calls to other methods of the object will
result in a ValueError exception being raised. This will not close
the open file.
@end deffn

@geindex closed (mmap.mmap attribute)
@anchor{library/mmap mmap mmap closed}@anchor{3b0c}
@deffn {Attribute} closed

@code{True} if the file is closed.


Added in version 3.2.

@end deffn

@geindex find() (mmap.mmap method)
@anchor{library/mmap mmap mmap find}@anchor{3b0d}
@deffn {Method} find (sub[, start[, end]])

Returns the lowest index in the object where the subsequence `sub' is
found, such that `sub' is contained in the range [`start', `end'].
Optional arguments `start' and `end' are interpreted as in slice notation.
Returns @code{-1} on failure.


Changed in version 3.5: Writable @ref{194,,bytes-like object} is now accepted.

@end deffn

@geindex flush() (mmap.mmap method)
@anchor{library/mmap mmap mmap flush}@anchor{c95}
@deffn {Method} flush ()

@deffnx {Method} flush (offset, size, /)

Flushes changes made to the in-memory copy of a file back to disk. Without
use of this call there is no guarantee that changes are written back before
the object is destroyed.  If `offset' and `size' are specified, only
changes to the given range of bytes will be flushed to disk; otherwise, the
whole extent of the mapping is flushed.  `offset' must be a multiple of the
@code{PAGESIZE} or @code{ALLOCATIONGRANULARITY}.

@code{None} is returned to indicate success.  An exception is raised when the
call failed.


Changed in version 3.8: Previously, a nonzero value was returned on success; zero was returned
on error under Windows.  A zero value was returned on success; an
exception was raised on error under Unix.

@end deffn

@geindex madvise() (mmap.mmap method)
@anchor{library/mmap mmap mmap madvise}@anchor{c01}
@deffn {Method} madvise (option[, start[, length]])

Send advice `option' to the kernel about the memory region beginning at
`start' and extending `length' bytes.  `option' must be one of the
@ref{3b0e,,MADV_* constants} available on the system.  If
`start' and `length' are omitted, the entire mapping is spanned.  On
some systems (including Linux), `start' must be a multiple of the
@code{PAGESIZE}.

Availability: Systems with the @code{madvise()} system call.


Added in version 3.8.

@end deffn

@geindex move() (mmap.mmap method)
@anchor{library/mmap mmap mmap move}@anchor{3b0f}
@deffn {Method} move (dest, src, count)

Copy the `count' bytes starting at offset `src' to the destination index
`dest'.  If the mmap was created with @code{ACCESS_READ}, then calls to
move will raise a @ref{199,,TypeError} exception.
@end deffn

@geindex read() (mmap.mmap method)
@anchor{library/mmap mmap mmap read}@anchor{12e9}
@deffn {Method} read ([n])

Return a @ref{193,,bytes} containing up to `n' bytes starting from the
current file position. If the argument is omitted, @code{None} or negative,
return all bytes from the current file position to the end of the
mapping. The file position is updated to point after the bytes that were
returned.


Changed in version 3.3: Argument can be omitted or @code{None}.

@end deffn

@geindex read_byte() (mmap.mmap method)
@anchor{library/mmap mmap mmap read_byte}@anchor{3b10}
@deffn {Method} read_byte ()

Returns a byte at the current file position as an integer, and advances
the file position by 1.
@end deffn

@geindex readline() (mmap.mmap method)
@anchor{library/mmap mmap mmap readline}@anchor{3b11}
@deffn {Method} readline ()

Returns a single line, starting at the current file position and up to the
next newline. The file position is updated to point after the bytes that were
returned.
@end deffn

@geindex resize() (mmap.mmap method)
@anchor{library/mmap mmap mmap resize}@anchor{3b0a}
@deffn {Method} resize (newsize)

Resizes the map and the underlying file, if any.

Resizing a map created with `access' of @code{ACCESS_READ} or
@code{ACCESS_COPY}, will raise a @ref{199,,TypeError} exception.
Resizing a map created with `trackfd' set to @code{False},
will raise a @ref{2ee,,ValueError} exception.

`On Windows': Resizing the map will raise an @ref{2c2,,OSError} if there are other
maps against the same named file. Resizing an anonymous map (ie against the
pagefile) will silently create a new map with the original data copied over
up to the length of the new size.


Changed in version 3.11: Correctly fails if attempting to resize when another map is held
Allows resize against an anonymous map on Windows

@end deffn

@geindex rfind() (mmap.mmap method)
@anchor{library/mmap mmap mmap rfind}@anchor{3b12}
@deffn {Method} rfind (sub[, start[, end]])

Returns the highest index in the object where the subsequence `sub' is
found, such that `sub' is contained in the range [`start', `end'].
Optional arguments `start' and `end' are interpreted as in slice notation.
Returns @code{-1} on failure.


Changed in version 3.5: Writable @ref{194,,bytes-like object} is now accepted.

@end deffn

@geindex seek() (mmap.mmap method)
@anchor{library/mmap mmap mmap seek}@anchor{51c}
@deffn {Method} seek (pos[, whence])

Set the file’s current position.  `whence' argument is optional and
defaults to @code{os.SEEK_SET} or @code{0} (absolute file positioning); other
values are @code{os.SEEK_CUR} or @code{1} (seek relative to the current
position) and @code{os.SEEK_END} or @code{2} (seek relative to the file’s end).


Changed in version 3.13: Return the new absolute position instead of @code{None}.

@end deffn

@geindex seekable() (mmap.mmap method)
@anchor{library/mmap mmap mmap seekable}@anchor{51b}
@deffn {Method} seekable ()

Return whether the file supports seeking, and the return value is always @code{True}.


Added in version 3.13.

@end deffn

@geindex size() (mmap.mmap method)
@anchor{library/mmap mmap mmap size}@anchor{3b09}
@deffn {Method} size ()

Return the length of the file, which can be larger than the size of the
memory-mapped area.
@end deffn

@geindex tell() (mmap.mmap method)
@anchor{library/mmap mmap mmap tell}@anchor{3b13}
@deffn {Method} tell ()

Returns the current position of the file pointer.
@end deffn

@geindex write() (mmap.mmap method)
@anchor{library/mmap mmap mmap write}@anchor{f4c}
@deffn {Method} write (bytes)

Write the bytes in `bytes' into memory at the current position of the
file pointer and return the number of bytes written (never less than
@code{len(bytes)}, since if the write fails, a @ref{2ee,,ValueError} will be
raised).  The file position is updated to point after the bytes that
were written.  If the mmap was created with @code{ACCESS_READ}, then
writing to it will raise a @ref{199,,TypeError} exception.


Changed in version 3.5: Writable @ref{194,,bytes-like object} is now accepted.



Changed in version 3.6: The number of bytes written is now returned.

@end deffn

@geindex write_byte() (mmap.mmap method)
@anchor{library/mmap mmap mmap write_byte}@anchor{3b14}
@deffn {Method} write_byte (byte)

Write the integer `byte' into memory at the current
position of the file pointer; the file position is advanced by @code{1}. If
the mmap was created with @code{ACCESS_READ}, then writing to it will
raise a @ref{199,,TypeError} exception.
@end deffn
@end deffn

@menu
* MADV_* Constants:: 
* MAP_* Constants:: 

@end menu

@node MADV_* Constants,MAP_* Constants,,mmap — Memory-mapped file support
@anchor{library/mmap madv-constants}@anchor{3b15}@anchor{library/mmap madvise-constants}@anchor{3b0e}
@subsubsection MADV_* Constants


@geindex MADV_NORMAL (in module mmap)
@geindex MADV_RANDOM (in module mmap)
@geindex MADV_SEQUENTIAL (in module mmap)
@geindex MADV_WILLNEED (in module mmap)
@geindex MADV_DONTNEED (in module mmap)
@geindex MADV_REMOVE (in module mmap)
@geindex MADV_DONTFORK (in module mmap)
@geindex MADV_DOFORK (in module mmap)
@geindex MADV_HWPOISON (in module mmap)
@geindex MADV_MERGEABLE (in module mmap)
@geindex MADV_UNMERGEABLE (in module mmap)
@geindex MADV_SOFT_OFFLINE (in module mmap)
@geindex MADV_HUGEPAGE (in module mmap)
@geindex MADV_NOHUGEPAGE (in module mmap)
@geindex MADV_DONTDUMP (in module mmap)
@geindex MADV_DODUMP (in module mmap)
@geindex MADV_FREE (in module mmap)
@geindex MADV_NOSYNC (in module mmap)
@geindex MADV_AUTOSYNC (in module mmap)
@geindex MADV_NOCORE (in module mmap)
@geindex MADV_CORE (in module mmap)
@geindex MADV_PROTECT (in module mmap)
@geindex MADV_FREE_REUSABLE (in module mmap)
@geindex MADV_FREE_REUSE (in module mmap)
@anchor{library/mmap mmap MADV_NORMAL}@anchor{3b16}
@deffn {Data} mmap.MADV_NORMAL
@anchor{library/mmap mmap MADV_RANDOM}@anchor{3b17}
@deffnx {Data} mmap.MADV_RANDOM
@anchor{library/mmap mmap MADV_SEQUENTIAL}@anchor{3b18}
@deffnx {Data} mmap.MADV_SEQUENTIAL
@anchor{library/mmap mmap MADV_WILLNEED}@anchor{3b19}
@deffnx {Data} mmap.MADV_WILLNEED
@anchor{library/mmap mmap MADV_DONTNEED}@anchor{3b1a}
@deffnx {Data} mmap.MADV_DONTNEED
@anchor{library/mmap mmap MADV_REMOVE}@anchor{3b1b}
@deffnx {Data} mmap.MADV_REMOVE
@anchor{library/mmap mmap MADV_DONTFORK}@anchor{3b1c}
@deffnx {Data} mmap.MADV_DONTFORK
@anchor{library/mmap mmap MADV_DOFORK}@anchor{3b1d}
@deffnx {Data} mmap.MADV_DOFORK
@anchor{library/mmap mmap MADV_HWPOISON}@anchor{3b1e}
@deffnx {Data} mmap.MADV_HWPOISON
@anchor{library/mmap mmap MADV_MERGEABLE}@anchor{3b1f}
@deffnx {Data} mmap.MADV_MERGEABLE
@anchor{library/mmap mmap MADV_UNMERGEABLE}@anchor{3b20}
@deffnx {Data} mmap.MADV_UNMERGEABLE
@anchor{library/mmap mmap MADV_SOFT_OFFLINE}@anchor{3b21}
@deffnx {Data} mmap.MADV_SOFT_OFFLINE
@anchor{library/mmap mmap MADV_HUGEPAGE}@anchor{3b22}
@deffnx {Data} mmap.MADV_HUGEPAGE
@anchor{library/mmap mmap MADV_NOHUGEPAGE}@anchor{3b23}
@deffnx {Data} mmap.MADV_NOHUGEPAGE
@anchor{library/mmap mmap MADV_DONTDUMP}@anchor{3b24}
@deffnx {Data} mmap.MADV_DONTDUMP
@anchor{library/mmap mmap MADV_DODUMP}@anchor{3b25}
@deffnx {Data} mmap.MADV_DODUMP
@anchor{library/mmap mmap MADV_FREE}@anchor{3b26}
@deffnx {Data} mmap.MADV_FREE
@anchor{library/mmap mmap MADV_NOSYNC}@anchor{3b27}
@deffnx {Data} mmap.MADV_NOSYNC
@anchor{library/mmap mmap MADV_AUTOSYNC}@anchor{3b28}
@deffnx {Data} mmap.MADV_AUTOSYNC
@anchor{library/mmap mmap MADV_NOCORE}@anchor{3b29}
@deffnx {Data} mmap.MADV_NOCORE
@anchor{library/mmap mmap MADV_CORE}@anchor{3b2a}
@deffnx {Data} mmap.MADV_CORE
@anchor{library/mmap mmap MADV_PROTECT}@anchor{3b2b}
@deffnx {Data} mmap.MADV_PROTECT
@anchor{library/mmap mmap MADV_FREE_REUSABLE}@anchor{3b2c}
@deffnx {Data} mmap.MADV_FREE_REUSABLE
@anchor{library/mmap mmap MADV_FREE_REUSE}@anchor{3b2d}
@deffnx {Data} mmap.MADV_FREE_REUSE

These options can be passed to @ref{c01,,mmap.madvise()}.  Not every option will
be present on every system.

Availability: Systems with the madvise() system call.


Added in version 3.8.

@end deffn

@node MAP_* Constants,,MADV_* Constants,mmap — Memory-mapped file support
@anchor{library/mmap id1}@anchor{3b2e}@anchor{library/mmap map-constants}@anchor{3b08}
@subsubsection MAP_* Constants


@geindex MAP_SHARED (in module mmap)
@geindex MAP_PRIVATE (in module mmap)
@geindex MAP_32BIT (in module mmap)
@geindex MAP_ALIGNED_SUPER (in module mmap)
@geindex MAP_ANON (in module mmap)
@geindex MAP_ANONYMOUS (in module mmap)
@geindex MAP_CONCEAL (in module mmap)
@geindex MAP_DENYWRITE (in module mmap)
@geindex MAP_EXECUTABLE (in module mmap)
@geindex MAP_HASSEMAPHORE (in module mmap)
@geindex MAP_JIT (in module mmap)
@geindex MAP_NOCACHE (in module mmap)
@geindex MAP_NOEXTEND (in module mmap)
@geindex MAP_NORESERVE (in module mmap)
@geindex MAP_POPULATE (in module mmap)
@geindex MAP_RESILIENT_CODESIGN (in module mmap)
@geindex MAP_RESILIENT_MEDIA (in module mmap)
@geindex MAP_STACK (in module mmap)
@geindex MAP_TPRO (in module mmap)
@geindex MAP_TRANSLATED_ALLOW_EXECUTE (in module mmap)
@geindex MAP_UNIX03 (in module mmap)
@anchor{library/mmap mmap MAP_SHARED}@anchor{3b07}
@deffn {Data} mmap.MAP_SHARED
@anchor{library/mmap mmap MAP_PRIVATE}@anchor{3b06}
@deffnx {Data} mmap.MAP_PRIVATE
@anchor{library/mmap mmap MAP_32BIT}@anchor{1a63}
@deffnx {Data} mmap.MAP_32BIT
@anchor{library/mmap mmap MAP_ALIGNED_SUPER}@anchor{1b0d}
@deffnx {Data} mmap.MAP_ALIGNED_SUPER
@anchor{library/mmap mmap MAP_ANON}@anchor{3b2f}
@deffnx {Data} mmap.MAP_ANON
@anchor{library/mmap mmap MAP_ANONYMOUS}@anchor{3b30}
@deffnx {Data} mmap.MAP_ANONYMOUS
@anchor{library/mmap mmap MAP_CONCEAL}@anchor{1b0e}
@deffnx {Data} mmap.MAP_CONCEAL
@anchor{library/mmap mmap MAP_DENYWRITE}@anchor{3b31}
@deffnx {Data} mmap.MAP_DENYWRITE
@anchor{library/mmap mmap MAP_EXECUTABLE}@anchor{3b32}
@deffnx {Data} mmap.MAP_EXECUTABLE
@anchor{library/mmap mmap MAP_HASSEMAPHORE}@anchor{1a5e}
@deffnx {Data} mmap.MAP_HASSEMAPHORE
@anchor{library/mmap mmap MAP_JIT}@anchor{1a60}
@deffnx {Data} mmap.MAP_JIT
@anchor{library/mmap mmap MAP_NOCACHE}@anchor{1a5f}
@deffnx {Data} mmap.MAP_NOCACHE
@anchor{library/mmap mmap MAP_NOEXTEND}@anchor{1a5d}
@deffnx {Data} mmap.MAP_NOEXTEND
@anchor{library/mmap mmap MAP_NORESERVE}@anchor{1a5c}
@deffnx {Data} mmap.MAP_NORESERVE
@anchor{library/mmap mmap MAP_POPULATE}@anchor{1d73}
@deffnx {Data} mmap.MAP_POPULATE
@anchor{library/mmap mmap MAP_RESILIENT_CODESIGN}@anchor{1a61}
@deffnx {Data} mmap.MAP_RESILIENT_CODESIGN
@anchor{library/mmap mmap MAP_RESILIENT_MEDIA}@anchor{1a62}
@deffnx {Data} mmap.MAP_RESILIENT_MEDIA
@anchor{library/mmap mmap MAP_STACK}@anchor{3b33}
@deffnx {Data} mmap.MAP_STACK
@anchor{library/mmap mmap MAP_TPRO}@anchor{1a66}
@deffnx {Data} mmap.MAP_TPRO
@anchor{library/mmap mmap MAP_TRANSLATED_ALLOW_EXECUTE}@anchor{1a64}
@deffnx {Data} mmap.MAP_TRANSLATED_ALLOW_EXECUTE
@anchor{library/mmap mmap MAP_UNIX03}@anchor{1a65}
@deffnx {Data} mmap.MAP_UNIX03

These are the various flags that can be passed to @ref{51a,,mmap.mmap()}.  @code{MAP_ALIGNED_SUPER}
is only available at FreeBSD and @code{MAP_CONCEAL} is only available at OpenBSD.  Note
that some options might not be present on some systems.


Changed in version 3.10: Added @code{MAP_POPULATE} constant.



Added in version 3.11: Added @code{MAP_STACK} constant.



Added in version 3.12: Added @code{MAP_ALIGNED_SUPER} and @code{MAP_CONCEAL} constants.



Added in version 3.13: Added @code{MAP_32BIT}, @code{MAP_HASSEMAPHORE}, @code{MAP_JIT},
@code{MAP_NOCACHE}, @code{MAP_NOEXTEND}, @code{MAP_NORESERVE},
@code{MAP_RESILIENT_CODESIGN}, @code{MAP_RESILIENT_MEDIA},
@code{MAP_TPRO}, @code{MAP_TRANSLATED_ALLOW_EXECUTE}, and
@code{MAP_UNIX03} constants.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Internet Data Handling,Structured Markup Processing Tools,Networking and Interprocess Communication,The Python Standard Library
@anchor{library/netdata doc}@anchor{3b34}@anchor{library/netdata internet-data-handling}@anchor{3b35}@anchor{library/netdata netdata}@anchor{3b36}@anchor{library/netdata translation-repo}@anchor{3b37}
@section Internet Data Handling


This chapter describes modules which support handling data formats commonly used
on the internet.

@menu
* email — An email and MIME handling package:: 
* json — JSON encoder and decoder:: 
* mailbox — Manipulate mailboxes in various formats:: 
* mimetypes — Map filenames to MIME types:: 
* base64 — Base16@comma{} Base32@comma{} Base64@comma{} Base85 Data Encodings: base64 — Base16 Base32 Base64 Base85 Data Encodings. 
* binascii — Convert between binary and ASCII:: 
* quopri — Encode and decode MIME quoted-printable data:: 

@end menu

@node email — An email and MIME handling package,json — JSON encoder and decoder,,Internet Data Handling
@anchor{library/email doc}@anchor{3b38}@anchor{library/email email-an-email-and-mime-handling-package}@anchor{3b39}@anchor{library/email module-email}@anchor{3f}
@subsection @code{email} — An email and MIME handling package


@geindex module; email

`Source code:' Lib/email/__init__.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/email/__init__.py}


__________________________________________________________________


The @code{email} package is a library for managing email messages.  It is
specifically `not' designed to do any sending of email messages to SMTP
(
@geindex RFC; RFC 2821
RFC 2821@footnote{https://datatracker.ietf.org/doc/html/rfc2821.html}), NNTP, or other servers; those are functions of modules such as
@ref{cf,,smtplib}.  The @code{email} package attempts to be as
RFC-compliant as possible, supporting 
@geindex RFC; RFC 5322
RFC 5322@footnote{https://datatracker.ietf.org/doc/html/rfc5322.html} and 
@geindex RFC; RFC 6532
RFC 6532@footnote{https://datatracker.ietf.org/doc/html/rfc6532.html}, as well as
such MIME-related RFCs as 
@geindex RFC; RFC 2045
RFC 2045@footnote{https://datatracker.ietf.org/doc/html/rfc2045.html}, 
@geindex RFC; RFC 2046
RFC 2046@footnote{https://datatracker.ietf.org/doc/html/rfc2046.html}, 
@geindex RFC; RFC 2047
RFC 2047@footnote{https://datatracker.ietf.org/doc/html/rfc2047.html}, 
@geindex RFC; RFC 2183
RFC 2183@footnote{https://datatracker.ietf.org/doc/html/rfc2183.html},
and 
@geindex RFC; RFC 2231
RFC 2231@footnote{https://datatracker.ietf.org/doc/html/rfc2231.html}.

The overall structure of the email package can be divided into three major
components, plus a fourth component that controls the behavior of the other
components.

The central component of the package is an “object model” that represents email
messages.  An application interacts with the package primarily through the
object model interface defined in the @ref{48,,message} sub-module.  The
application can use this API to ask questions about an existing email, to
construct a new email, or to add or remove email subcomponents that themselves
use the same object model interface.  That is, following the nature of email
messages and their MIME subcomponents, the email object model is a tree
structure of objects that all provide the @ref{580,,EmailMessage}
API.

The other two major components of the package are the @ref{52,,parser} and
the @ref{44,,generator}.  The parser takes the serialized version of an
email message (a stream of bytes) and converts it into a tree of
@ref{580,,EmailMessage} objects.  The generator takes an
@code{EmailMessage} and turns it back into a serialized byte
stream.  (The parser and generator also handle streams of text characters, but
this usage is discouraged as it is too easy to end up with messages that are
not valid in one way or another.)

The control component is the @ref{53,,policy} module.  Every
@ref{580,,EmailMessage}, every @ref{44,,generator}, and every
@ref{52,,parser} has an associated @code{policy} object that
controls its behavior.  Usually an application only needs to specify the policy
when an @code{EmailMessage} is created, either by directly
instantiating an @code{EmailMessage}  to create a new email,
or by parsing an input stream using a @code{parser}.  But the policy can
be changed when the message is serialized using a @code{generator}.
This allows, for example, a generic email message to be parsed from disk, but
to serialize it using standard SMTP settings when sending it to an email
server.

The email package does its best to hide the details of the various governing
RFCs from the application.  Conceptually the application should be able to
treat the email message as a structured tree of unicode text and binary
attachments, without having to worry about how these are represented when
serialized.  In practice, however, it is often necessary to be aware of at
least some of the rules governing MIME messages and their structure,
specifically the names and nature of the MIME “content types” and how they
identify multipart documents.  For the most part this knowledge should only be
required for more complex applications, and even then it should only be the
high level structure in question, and not the details of how those structures
are represented.  Since MIME content types are used widely in modern internet
software (not just email), this will be a familiar concept to many programmers.

The following sections describe the functionality of the @code{email} package.
We start with the @ref{48,,message} object model, which is the primary
interface an application will use, and follow that with the
@ref{52,,parser} and @ref{44,,generator} components.  Then we cover the
@ref{53,,policy} controls, which completes the treatment of the main
components of the library.

The next three sections cover the exceptions the package may raise and the
defects (non-compliance with the RFCs) that the @ref{52,,parser} may
detect.  Then we cover the @ref{46,,headerregistry} and the
@ref{41,,contentmanager} sub-components, which provide tools for doing more
detailed manipulation of headers and payloads, respectively.  Both of these
components contain features relevant to consuming and producing non-trivial
messages, but also document their extensibility APIs, which will be of interest
to advanced applications.

Following those is a set of examples of using the fundamental parts of the APIs
covered in the preceding sections.

The foregoing represent the modern (unicode friendly) API of the email package.
The remaining sections, starting with the @ref{581,,Message}
class, cover the legacy @ref{e9d,,compat32} API that deals much more
directly with the details of how email messages are represented.  The
@code{compat32} API does `not' hide the details of the RFCs from
the application, but for applications that need to operate at that level, they
can be useful tools.  This documentation is also relevant for applications that
are still using the @ref{e9d,,compat32} API for backward
compatibility reasons.


Changed in version 3.6: Docs reorganized and rewritten to promote the new
@ref{580,,EmailMessage}/@ref{12c3,,EmailPolicy}
API.


Contents of the @code{email} package documentation:

@menu
* email.message; Representing an email message: email message Representing an email message. 
* email.parser; Parsing email messages: email parser Parsing email messages. 
* email.generator; Generating MIME documents: email generator Generating MIME documents. 
* email.policy; Policy Objects: email policy Policy Objects. 
* email.errors; Exception and Defect classes: email errors Exception and Defect classes. 
* email.headerregistry; Custom Header Objects: email headerregistry Custom Header Objects. 
* email.contentmanager; Managing MIME Content: email contentmanager Managing MIME Content. 
* email; Examples: email Examples. 
* email.message.Message; Representing an email message using the compat32 API: email message Message Representing an email message using the compat32 API. 
* email.mime; Creating email and MIME objects from scratch: email mime Creating email and MIME objects from scratch. 
* email.header; Internationalized headers: email header Internationalized headers. 
* email.charset; Representing character sets: email charset Representing character sets. 
* email.encoders; Encoders: email encoders Encoders. 
* email.utils; Miscellaneous utilities: email utils Miscellaneous utilities. 
* email.iterators; Iterators: email iterators Iterators. 

@end menu

@node email message Representing an email message,email parser Parsing email messages,,email — An email and MIME handling package
@anchor{library/email message doc}@anchor{3b3a}@anchor{library/email message email-message-representing-an-email-message}@anchor{3b3b}@anchor{library/email message module-email message}@anchor{48}
@subsubsection @code{email.message}: Representing an email message


@geindex module; email.message

`Source code:' Lib/email/message.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/email/message.py}


__________________________________________________________________



Added in version 3.6: @footnote{
Originally added in 3.4 as a @ref{1248,,provisional module}.  Docs for legacy message class moved to
@ref{3b3c,,email.message.Message; Representing an email message using the compat32 API}.
}


The central class in the @ref{3f,,email} package is the @ref{580,,EmailMessage}
class, imported from the @code{email.message} module.  It is the base class for
the @code{email} object model.  @code{EmailMessage} provides the core
functionality for setting and querying header fields, for accessing message
bodies, and for creating or modifying structured messages.

An email message consists of `headers' and a `payload' (which is also referred
to as the `content').  Headers are 
@geindex RFC; RFC 5322
RFC 5322@footnote{https://datatracker.ietf.org/doc/html/rfc5322.html} or 
@geindex RFC; RFC 6532
RFC 6532@footnote{https://datatracker.ietf.org/doc/html/rfc6532.html} style field names
and values, where the field name and value are separated by a colon.  The colon
is not part of either the field name or the field value.  The payload may be a
simple text message, or a binary object, or a structured sequence of
sub-messages each with their own set of headers and their own payload.  The
latter type of payload is indicated by the message having a MIME type such as
@code{multipart/*} or @code{message/rfc822}.

The conceptual model provided by an @ref{580,,EmailMessage} object is that of an
ordered dictionary of headers coupled with a `payload' that represents the
@geindex RFC; RFC 5322
RFC 5322@footnote{https://datatracker.ietf.org/doc/html/rfc5322.html} body of the message, which might be a list of sub-@code{EmailMessage}
objects.  In addition to the normal dictionary methods for accessing the header
names and values, there are methods for accessing specialized information from
the headers (for example the MIME content type), for operating on the payload,
for generating a serialized version of the message, and for recursively walking
over the object tree.

The @ref{580,,EmailMessage} dictionary-like interface is indexed by the header
names, which must be ASCII values.  The values of the dictionary are strings
with some extra methods.  Headers are stored and returned in case-preserving
form, but field names are matched case-insensitively.  The keys are ordered,
but unlike a real dict, there can be duplicates.  Additional methods are
provided for working with headers that have duplicate keys.

The `payload' is either a string or bytes object, in the case of simple message
objects, or a list of @ref{580,,EmailMessage} objects, for MIME container
documents such as @code{multipart/*} and @code{message/rfc822}
message objects.

@geindex EmailMessage (class in email.message)
@anchor{library/email message email message EmailMessage}@anchor{580}
@deffn {Class} email.message.EmailMessage (policy=default)

If `policy' is specified use the rules it specifies to update and serialize
the representation of the message.  If `policy' is not set, use the
@ref{17d7,,default} policy, which follows the rules of the email
RFCs except for line endings (instead of the RFC mandated @code{\r\n}, it uses
the Python standard @code{\n} line endings).  For more information see the
@ref{53,,policy} documentation. @footnote{
The @ref{580,,EmailMessage} class requires a policy that provides a
@code{content_manager} attribute for content management methods like
@code{set_content()} and @code{get_content()} to work. The legacy
@ref{e9d,,compat32} policy does not support these methods
and should not be used with @code{EmailMessage}.
}

@geindex as_string() (email.message.EmailMessage method)
@anchor{library/email message email message EmailMessage as_string}@anchor{3b3d}
@deffn {Method} as_string (unixfrom=False, maxheaderlen=None, policy=None)

Return the entire message flattened as a string.  When optional
`unixfrom' is true, the envelope header is included in the returned
string.  `unixfrom' defaults to @code{False}.  For backward compatibility
with the base @ref{581,,Message} class `maxheaderlen' is
accepted, but defaults to @code{None}, which means that by default the line
length is controlled by the
@ref{3b3e,,max_line_length} of the policy.  The
`policy' argument may be used to override the default policy obtained
from the message instance.  This can be used to control some of the
formatting produced by the method, since the specified `policy' will be
passed to the @ref{13da,,Generator}.

Flattening the message may trigger changes to the @code{EmailMessage}
if defaults need to be filled in to complete the transformation to a
string (for example, MIME boundaries may be generated or modified).

Note that this method is provided as a convenience and may not be the
most useful way to serialize messages in your application, especially if
you are dealing with multiple messages.  See
@ref{13da,,email.generator.Generator} for a more flexible API for
serializing messages.  Note also that this method is restricted to
producing messages serialized as “7 bit clean” when
@ref{fff,,utf8} is @code{False}, which is the default.


Changed in version 3.6: the default behavior when `maxheaderlen'
is not specified was changed from defaulting to 0 to defaulting
to the value of `max_line_length' from the policy.

@end deffn

@geindex __str__() (email.message.EmailMessage method)
@anchor{library/email message email message EmailMessage __str__}@anchor{3b3f}
@deffn {Method} __str__ ()

Equivalent to @code{as_string(policy=self.policy.clone(utf8=True))}.  Allows
@code{str(msg)} to produce a string containing the serialized message in a
readable format.


Changed in version 3.4: the method was changed to use @code{utf8=True},
thus producing an 
@geindex RFC; RFC 6531
RFC 6531@footnote{https://datatracker.ietf.org/doc/html/rfc6531.html}-like message representation, instead of
being a direct alias for @ref{3b3d,,as_string()}.

@end deffn

@geindex as_bytes() (email.message.EmailMessage method)
@anchor{library/email message email message EmailMessage as_bytes}@anchor{3b40}
@deffn {Method} as_bytes (unixfrom=False, policy=None)

Return the entire message flattened as a bytes object.  When optional
`unixfrom' is true, the envelope header is included in the returned
string.  `unixfrom' defaults to @code{False}.  The `policy' argument may be
used to override the default policy obtained from the message instance.
This can be used to control some of the formatting produced by the
method, since the specified `policy' will be passed to the
@ref{13db,,BytesGenerator}.

Flattening the message may trigger changes to the @code{EmailMessage}
if defaults need to be filled in to complete the transformation to a
string (for example, MIME boundaries may be generated or modified).

Note that this method is provided as a convenience and may not be the
most useful way to serialize messages in your application, especially if
you are dealing with multiple messages.  See
@ref{13db,,email.generator.BytesGenerator} for a more flexible API for
serializing messages.
@end deffn

@geindex __bytes__() (email.message.EmailMessage method)
@anchor{library/email message email message EmailMessage __bytes__}@anchor{3b41}
@deffn {Method} __bytes__ ()

Equivalent to @ref{3b40,,as_bytes()}.  Allows @code{bytes(msg)} to produce a
bytes object containing the serialized message.
@end deffn

@geindex is_multipart() (email.message.EmailMessage method)
@anchor{library/email message email message EmailMessage is_multipart}@anchor{3b42}
@deffn {Method} is_multipart ()

Return @code{True} if the message’s payload is a list of
sub-@code{EmailMessage} objects, otherwise return @code{False}.  When
@code{is_multipart()} returns @code{False}, the payload should be a string
object (which might be a CTE encoded binary payload).  Note that
@code{is_multipart()} returning @code{True} does not necessarily mean that
“msg.get_content_maintype() == ‘multipart’” will return the @code{True}.
For example, @code{is_multipart} will return @code{True} when the
@code{EmailMessage} is of type @code{message/rfc822}.
@end deffn

@geindex set_unixfrom() (email.message.EmailMessage method)
@anchor{library/email message email message EmailMessage set_unixfrom}@anchor{3b43}
@deffn {Method} set_unixfrom (unixfrom)

Set the message’s envelope header to `unixfrom', which should be a
string.  (See @ref{3b44,,mboxMessage} for a brief description of
this header.)
@end deffn

@geindex get_unixfrom() (email.message.EmailMessage method)
@anchor{library/email message email message EmailMessage get_unixfrom}@anchor{3b45}
@deffn {Method} get_unixfrom ()

Return the message’s envelope header.  Defaults to @code{None} if the
envelope header was never set.
@end deffn

The following methods implement the mapping-like interface for accessing the
message’s headers.  Note that there are some semantic differences
between these methods and a normal mapping (i.e. dictionary) interface.  For
example, in a dictionary there are no duplicate keys, but here there may be
duplicate message headers.  Also, in dictionaries there is no guaranteed
order to the keys returned by @ref{3b46,,keys()}, but in an @code{EmailMessage}
object, headers are always returned in the order they appeared in the
original message, or in which they were added to the message later.  Any
header deleted and then re-added is always appended to the end of the
header list.

These semantic differences are intentional and are biased toward
convenience in the most common use cases.

Note that in all cases, any envelope header present in the message is not
included in the mapping interface.

@geindex __len__() (email.message.EmailMessage method)
@anchor{library/email message email message EmailMessage __len__}@anchor{3b47}
@deffn {Method} __len__ ()

Return the total number of headers, including duplicates.
@end deffn

@geindex __contains__() (email.message.EmailMessage method)
@anchor{library/email message email message EmailMessage __contains__}@anchor{3b48}
@deffn {Method} __contains__ (name)

Return @code{True} if the message object has a field named `name'. Matching is
done without regard to case and `name' does not include the trailing
colon.  Used for the @code{in} operator.  For example:

@example
if 'message-id' in myMessage:
   print('Message-ID:', myMessage['message-id'])
@end example
@end deffn

@geindex __getitem__() (email.message.EmailMessage method)
@anchor{library/email message email message EmailMessage __getitem__}@anchor{3b49}
@deffn {Method} __getitem__ (name)

Return the value of the named header field.  `name' does not include the
colon field separator.  If the header is missing, @code{None} is returned; a
@ref{5e7,,KeyError} is never raised.

Note that if the named field appears more than once in the message’s
headers, exactly which of those field values will be returned is
undefined.  Use the @ref{3b4a,,get_all()} method to get the values of all the
extant headers named `name'.

Using the standard (non-@code{compat32}) policies, the returned value is an
instance of a subclass of @ref{3b4b,,email.headerregistry.BaseHeader}.
@end deffn

@geindex __setitem__() (email.message.EmailMessage method)
@anchor{library/email message email message EmailMessage __setitem__}@anchor{3b4c}
@deffn {Method} __setitem__ (name, val)

Add a header to the message with field name `name' and value `val'.  The
field is appended to the end of the message’s existing headers.

Note that this does `not' overwrite or delete any existing header with the same
name.  If you want to ensure that the new header is the only one present in the
message with field name `name', delete the field first, e.g.:

@example
del msg['subject']
msg['subject'] = 'Python roolz!'
@end example

If the @ref{53,,policy} defines certain headers to be unique (as the standard
policies do), this method may raise a @ref{2ee,,ValueError} when an attempt
is made to assign a value to such a header when one already exists.  This
behavior is intentional for consistency’s sake, but do not depend on it
as we may choose to make such assignments do an automatic deletion of the
existing header in the future.
@end deffn

@geindex __delitem__() (email.message.EmailMessage method)
@anchor{library/email message email message EmailMessage __delitem__}@anchor{3b4d}
@deffn {Method} __delitem__ (name)

Delete all occurrences of the field with name `name' from the message’s
headers.  No exception is raised if the named field isn’t present in the
headers.
@end deffn

@geindex keys() (email.message.EmailMessage method)
@anchor{library/email message email message EmailMessage keys}@anchor{3b46}
@deffn {Method} keys ()

Return a list of all the message’s header field names.
@end deffn

@geindex values() (email.message.EmailMessage method)
@anchor{library/email message email message EmailMessage values}@anchor{3b4e}
@deffn {Method} values ()

Return a list of all the message’s field values.
@end deffn

@geindex items() (email.message.EmailMessage method)
@anchor{library/email message email message EmailMessage items}@anchor{3b4f}
@deffn {Method} items ()

Return a list of 2-tuples containing all the message’s field headers and
values.
@end deffn

@geindex get() (email.message.EmailMessage method)
@anchor{library/email message email message EmailMessage get}@anchor{3b50}
@deffn {Method} get (name, failobj=None)

Return the value of the named header field.  This is identical to
@ref{588,,__getitem__()} except that optional `failobj' is returned if the
named header is missing (`failobj' defaults to @code{None}).
@end deffn

Here are some additional useful header related methods:

@geindex get_all() (email.message.EmailMessage method)
@anchor{library/email message email message EmailMessage get_all}@anchor{3b4a}
@deffn {Method} get_all (name, failobj=None)

Return a list of all the values for the field named `name'. If there are
no such named headers in the message, `failobj' is returned (defaults to
@code{None}).
@end deffn

@geindex add_header() (email.message.EmailMessage method)
@anchor{library/email message email message EmailMessage add_header}@anchor{3b51}
@deffn {Method} add_header (_name, _value, **_params)

Extended header setting.  This method is similar to @ref{3b4c,,__setitem__()}
except that additional header parameters can be provided as keyword
arguments.  `_name' is the header field to add and `_value' is the
`primary' value for the header.

For each item in the keyword argument dictionary `_params', the key is
taken as the parameter name, with underscores converted to dashes (since
dashes are illegal in Python identifiers).  Normally, the parameter will
be added as @code{key="value"} unless the value is @code{None}, in which case
only the key will be added.

If the value contains non-ASCII characters, the charset and language may
be explicitly controlled by specifying the value as a three tuple in the
format @code{(CHARSET, LANGUAGE, VALUE)}, where @code{CHARSET} is a string
naming the charset to be used to encode the value, @code{LANGUAGE} can
usually be set to @code{None} or the empty string (see 
@geindex RFC; RFC 2231
RFC 2231@footnote{https://datatracker.ietf.org/doc/html/rfc2231.html} for other
possibilities), and @code{VALUE} is the string value containing non-ASCII
code points.  If a three tuple is not passed and the value contains
non-ASCII characters, it is automatically encoded in 
@geindex RFC; RFC 2231
RFC 2231@footnote{https://datatracker.ietf.org/doc/html/rfc2231.html} format
using a @code{CHARSET} of @code{utf-8} and a @code{LANGUAGE} of @code{None}.

Here is an example:

@example
msg.add_header('Content-Disposition', 'attachment', filename='bud.gif')
@end example

This will add a header that looks like

@example
Content-Disposition: attachment; filename="bud.gif"
@end example

An example of the extended interface with non-ASCII characters:

@example
msg.add_header('Content-Disposition', 'attachment',
               filename=('iso-8859-1', '@w{'}, 'Fußballer.ppt'))
@end example
@end deffn

@geindex replace_header() (email.message.EmailMessage method)
@anchor{library/email message email message EmailMessage replace_header}@anchor{3b52}
@deffn {Method} replace_header (_name, _value)

Replace a header.  Replace the first header found in the message that
matches `_name', retaining header order and field name case of the
original header.  If no matching header is found, raise a
@ref{5e7,,KeyError}.
@end deffn

@geindex get_content_type() (email.message.EmailMessage method)
@anchor{library/email message email message EmailMessage get_content_type}@anchor{3b53}
@deffn {Method} get_content_type ()

Return the message’s content type, coerced to lower case of the form
@code{maintype/subtype}.  If there is no @code{Content-Type}
header in the message return the value returned by
@ref{3b54,,get_default_type()}.  If the @code{Content-Type} header is
invalid, return @code{text/plain}.

(According to 
@geindex RFC; RFC 2045
RFC 2045@footnote{https://datatracker.ietf.org/doc/html/rfc2045.html}, messages always have a default type,
@code{get_content_type()} will always return a value.  
@geindex RFC; RFC 2045
RFC 2045@footnote{https://datatracker.ietf.org/doc/html/rfc2045.html} defines
a message’s default type to be @code{text/plain} unless it appears
inside a @code{multipart/digest} container, in which case it would
be @code{message/rfc822}.  If the @code{Content-Type} header
has an invalid type specification, 
@geindex RFC; RFC 2045
RFC 2045@footnote{https://datatracker.ietf.org/doc/html/rfc2045.html} mandates that the default
type be @code{text/plain}.)
@end deffn

@geindex get_content_maintype() (email.message.EmailMessage method)
@anchor{library/email message email message EmailMessage get_content_maintype}@anchor{3b55}
@deffn {Method} get_content_maintype ()

Return the message’s main content type.  This is the @code{maintype}
part of the string returned by @ref{3b53,,get_content_type()}.
@end deffn

@geindex get_content_subtype() (email.message.EmailMessage method)
@anchor{library/email message email message EmailMessage get_content_subtype}@anchor{3b56}
@deffn {Method} get_content_subtype ()

Return the message’s sub-content type.  This is the @code{subtype}
part of the string returned by @ref{3b53,,get_content_type()}.
@end deffn

@geindex get_default_type() (email.message.EmailMessage method)
@anchor{library/email message email message EmailMessage get_default_type}@anchor{3b54}
@deffn {Method} get_default_type ()

Return the default content type.  Most messages have a default content
type of @code{text/plain}, except for messages that are subparts of
@code{multipart/digest} containers.  Such subparts have a default
content type of @code{message/rfc822}.
@end deffn

@geindex set_default_type() (email.message.EmailMessage method)
@anchor{library/email message email message EmailMessage set_default_type}@anchor{3b57}
@deffn {Method} set_default_type (ctype)

Set the default content type.  `ctype' should either be
@code{text/plain} or @code{message/rfc822}, although this is
not enforced.  The default content type is not stored in the
@code{Content-Type} header, so it only affects the return value of
the @code{get_content_type} methods when no @code{Content-Type}
header is present in the message.
@end deffn

@geindex set_param() (email.message.EmailMessage method)
@anchor{library/email message email message EmailMessage set_param}@anchor{3b58}
@deffn {Method} set_param (param, value, header='Content-Type', requote=True, charset=None, language='@w{'}, replace=False)

Set a parameter in the @code{Content-Type} header.  If the
parameter already exists in the header, replace its value with `value'.
When `header' is @code{Content-Type} (the default) and the header does not
yet exist in the message, add it, set its value to
@code{text/plain}, and append the new parameter value.  Optional
`header' specifies an alternative header to @code{Content-Type}.

If the value contains non-ASCII characters, the charset and language may
be explicitly specified using the optional `charset' and `language'
parameters.  Optional `language' specifies the 
@geindex RFC; RFC 2231
RFC 2231@footnote{https://datatracker.ietf.org/doc/html/rfc2231.html} language,
defaulting to the empty string.  Both `charset' and `language' should be
strings.  The default is to use the @code{utf8} `charset' and @code{None} for
the `language'.

If `replace' is @code{False} (the default) the header is moved to the
end of the list of headers.  If `replace' is @code{True}, the header
will be updated in place.

Use of the `requote' parameter with @code{EmailMessage} objects is
deprecated.

Note that existing parameter values of headers may be accessed through
the @ref{3b59,,params} attribute of the
header value (for example, @code{msg['Content-Type'].params['charset']}).


Changed in version 3.4: @code{replace} keyword was added.

@end deffn

@geindex del_param() (email.message.EmailMessage method)
@anchor{library/email message email message EmailMessage del_param}@anchor{3b5a}
@deffn {Method} del_param (param, header='content-type', requote=True)

Remove the given parameter completely from the @code{Content-Type}
header.  The header will be re-written in place without the parameter or
its value.  Optional `header' specifies an alternative to
@code{Content-Type}.

Use of the `requote' parameter with @code{EmailMessage} objects is
deprecated.
@end deffn

@geindex get_filename() (email.message.EmailMessage method)
@anchor{library/email message email message EmailMessage get_filename}@anchor{3b5b}
@deffn {Method} get_filename (failobj=None)

Return the value of the @code{filename} parameter of the
@code{Content-Disposition} header of the message.  If the header
does not have a @code{filename} parameter, this method falls back to looking
for the @code{name} parameter on the @code{Content-Type} header.  If
neither is found, or the header is missing, then `failobj' is returned.
The returned string will always be unquoted as per
@ref{3b5c,,email.utils.unquote()}.
@end deffn

@geindex get_boundary() (email.message.EmailMessage method)
@anchor{library/email message email message EmailMessage get_boundary}@anchor{3b5d}
@deffn {Method} get_boundary (failobj=None)

Return the value of the @code{boundary} parameter of the
@code{Content-Type} header of the message, or `failobj' if either
the header is missing, or has no @code{boundary} parameter.  The returned
string will always be unquoted as per @ref{3b5c,,email.utils.unquote()}.
@end deffn

@geindex set_boundary() (email.message.EmailMessage method)
@anchor{library/email message email message EmailMessage set_boundary}@anchor{3b5e}
@deffn {Method} set_boundary (boundary)

Set the @code{boundary} parameter of the @code{Content-Type} header to
`boundary'.  @code{set_boundary()} will always quote `boundary' if
necessary.  A @ref{3b5f,,HeaderParseError} is raised if the
message object has no @code{Content-Type} header.

Note that using this method is subtly different from deleting the old
@code{Content-Type} header and adding a new one with the new
boundary via @ref{3b51,,add_header()}, because @code{set_boundary()} preserves
the order of the @code{Content-Type} header in the list of
headers.
@end deffn

@geindex get_content_charset() (email.message.EmailMessage method)
@anchor{library/email message email message EmailMessage get_content_charset}@anchor{3b60}
@deffn {Method} get_content_charset (failobj=None)

Return the @code{charset} parameter of the @code{Content-Type} header,
coerced to lower case.  If there is no @code{Content-Type} header, or if
that header has no @code{charset} parameter, `failobj' is returned.
@end deffn

@geindex get_charsets() (email.message.EmailMessage method)
@anchor{library/email message email message EmailMessage get_charsets}@anchor{3b61}
@deffn {Method} get_charsets (failobj=None)

Return a list containing the character set names in the message.  If the
message is a @code{multipart}, then the list will contain one element
for each subpart in the payload, otherwise, it will be a list of length 1.

Each item in the list will be a string which is the value of the
@code{charset} parameter in the @code{Content-Type} header for the
represented subpart.  If the subpart has no @code{Content-Type}
header, no @code{charset} parameter, or is not of the @code{text} main
MIME type, then that item in the returned list will be `failobj'.
@end deffn

@geindex is_attachment() (email.message.EmailMessage method)
@anchor{library/email message email message EmailMessage is_attachment}@anchor{3b62}
@deffn {Method} is_attachment ()

Return @code{True} if there is a @code{Content-Disposition} header
and its (case insensitive) value is @code{attachment}, @code{False} otherwise.


Changed in version 3.4.2: is_attachment is now a method instead of a property, for consistency
with @ref{3b63,,is_multipart()}.

@end deffn

@geindex get_content_disposition() (email.message.EmailMessage method)
@anchor{library/email message email message EmailMessage get_content_disposition}@anchor{3b64}
@deffn {Method} get_content_disposition ()

Return the lowercased value (without parameters) of the message’s
@code{Content-Disposition} header if it has one, or @code{None}.  The
possible values for this method are `inline', `attachment' or @code{None}
if the message follows 
@geindex RFC; RFC 2183
RFC 2183@footnote{https://datatracker.ietf.org/doc/html/rfc2183.html}.


Added in version 3.5.

@end deffn

The following methods relate to interrogating and manipulating the content
(payload) of the message.

@geindex walk() (email.message.EmailMessage method)
@anchor{library/email message email message EmailMessage walk}@anchor{3b65}
@deffn {Method} walk ()

The @code{walk()} method is an all-purpose generator which can be used to
iterate over all the parts and subparts of a message object tree, in
depth-first traversal order.  You will typically use @code{walk()} as the
iterator in a @code{for} loop; each iteration returns the next subpart.

Here’s an example that prints the MIME type of every part of a multipart
message structure:

@c from email import message_from_binary_file
@c with open('../Lib/test/test_email/data/msg_16.txt', 'rb') as f:
@c     msg = message_from_binary_file(f)

@example
>>> for part in msg.walk():
...     print(part.get_content_type())
multipart/report
text/plain
message/delivery-status
text/plain
text/plain
message/rfc822
text/plain
@end example

@code{walk} iterates over the subparts of any part where
@ref{3b42,,is_multipart()} returns @code{True}, even though
@code{msg.get_content_maintype() == 'multipart'} may return @code{False}.  We
can see this in our example by making use of the @code{_structure} debug
helper function:

@example
>>> from email.iterators import _structure
>>> for part in msg.walk():
...     print(part.get_content_maintype() == 'multipart',
...           part.is_multipart())
True True
False False
False True
False False
False False
False True
False False
>>> _structure(msg)
multipart/report
    text/plain
    message/delivery-status
        text/plain
        text/plain
    message/rfc822
        text/plain
@end example

Here the @code{message} parts are not @code{multiparts}, but they do contain
subparts. @code{is_multipart()} returns @code{True} and @code{walk} descends
into the subparts.
@end deffn

@geindex get_body() (email.message.EmailMessage method)
@anchor{library/email message email message EmailMessage get_body}@anchor{3b66}
@deffn {Method} get_body (preferencelist=('related', 'html', 'plain'))

Return the MIME part that is the best candidate to be the “body” of the
message.

`preferencelist' must be a sequence of strings from the set @code{related},
@code{html}, and @code{plain}, and indicates the order of preference for the
content type of the part returned.

Start looking for candidate matches with the object on which the
@code{get_body} method is called.

If @code{related} is not included in `preferencelist', consider the root
part (or subpart of the root part) of any related encountered as a
candidate if the (sub-)part matches a preference.

When encountering a @code{multipart/related}, check the @code{start} parameter
and if a part with a matching @code{Content-ID} is found, consider
only it when looking for candidate matches.  Otherwise consider only the
first (default root) part of the @code{multipart/related}.

If a part has a @code{Content-Disposition} header, only consider
the part a candidate match if the value of the header is @code{inline}.

If none of the candidates matches any of the preferences in
`preferencelist', return @code{None}.

Notes: (1) For most applications the only `preferencelist' combinations
that really make sense are @code{('plain',)}, @code{('html', 'plain')}, and the
default @code{('related', 'html', 'plain')}.  (2) Because matching starts
with the object on which @code{get_body} is called, calling @code{get_body} on
a @code{multipart/related} will return the object itself unless
`preferencelist' has a non-default value. (3) Messages (or message parts)
that do not specify a @code{Content-Type} or whose
@code{Content-Type} header is invalid will be treated as if they
are of type @code{text/plain}, which may occasionally cause @code{get_body} to
return unexpected results.
@end deffn

@geindex iter_attachments() (email.message.EmailMessage method)
@anchor{library/email message email message EmailMessage iter_attachments}@anchor{3b67}
@deffn {Method} iter_attachments ()

Return an iterator over all of the immediate sub-parts of the message
that are not candidate “body” parts.  That is, skip the first occurrence
of each of @code{text/plain}, @code{text/html}, @code{multipart/related}, or
@code{multipart/alternative} (unless they are explicitly marked as
attachments via @code{Content-Disposition: attachment}), and
return all remaining parts.  When applied directly to a
@code{multipart/related}, return an iterator over the all the related parts
except the root part (ie: the part pointed to by the @code{start} parameter,
or the first part if there is no @code{start} parameter or the @code{start}
parameter doesn’t match the @code{Content-ID} of any of the
parts).  When applied directly to a @code{multipart/alternative} or a
non-@code{multipart}, return an empty iterator.
@end deffn

@geindex iter_parts() (email.message.EmailMessage method)
@anchor{library/email message email message EmailMessage iter_parts}@anchor{3b68}
@deffn {Method} iter_parts ()

Return an iterator over all of the immediate sub-parts of the message,
which will be empty for a non-@code{multipart}.  (See also
@ref{3b65,,walk()}.)
@end deffn

@geindex get_content() (email.message.EmailMessage method)
@anchor{library/email message email message EmailMessage get_content}@anchor{3b69}
@deffn {Method} get_content (*args, content_manager=None, **kw)

Call the @ref{3b6a,,get_content()} method
of the `content_manager', passing self as the message object, and passing
along any other arguments or keywords as additional arguments.  If
`content_manager' is not specified, use the @code{content_manager} specified
by the current @ref{53,,policy}.
@end deffn

@geindex set_content() (email.message.EmailMessage method)
@anchor{library/email message email message EmailMessage set_content}@anchor{1ca0}
@deffn {Method} set_content (*args, content_manager=None, **kw)

Call the @ref{3b6b,,set_content()} method
of the `content_manager', passing self as the message object, and passing
along any other arguments or keywords as additional arguments.  If
`content_manager' is not specified, use the @code{content_manager} specified
by the current @ref{53,,policy}.
@end deffn

@geindex make_related() (email.message.EmailMessage method)
@anchor{library/email message email message EmailMessage make_related}@anchor{3b6c}
@deffn {Method} make_related (boundary=None)

Convert a non-@code{multipart} message into a @code{multipart/related} message,
moving any existing @code{Content-} headers and payload into a
(new) first part of the @code{multipart}.  If `boundary' is specified, use
it as the boundary string in the multipart, otherwise leave the boundary
to be automatically created when it is needed (for example, when the
message is serialized).
@end deffn

@geindex make_alternative() (email.message.EmailMessage method)
@anchor{library/email message email message EmailMessage make_alternative}@anchor{3b6d}
@deffn {Method} make_alternative (boundary=None)

Convert a non-@code{multipart} or a @code{multipart/related} into a
@code{multipart/alternative}, moving any existing @code{Content-}
headers and payload into a (new) first part of the @code{multipart}.  If
`boundary' is specified, use it as the boundary string in the multipart,
otherwise leave the boundary to be automatically created when it is
needed (for example, when the message is serialized).
@end deffn

@geindex make_mixed() (email.message.EmailMessage method)
@anchor{library/email message email message EmailMessage make_mixed}@anchor{3b6e}
@deffn {Method} make_mixed (boundary=None)

Convert a non-@code{multipart}, a @code{multipart/related}, or a
@code{multipart-alternative} into a @code{multipart/mixed}, moving any existing
@code{Content-} headers and payload into a (new) first part of the
@code{multipart}.  If `boundary' is specified, use it as the boundary string
in the multipart, otherwise leave the boundary to be automatically
created when it is needed (for example, when the message is serialized).
@end deffn

@geindex add_related() (email.message.EmailMessage method)
@anchor{library/email message email message EmailMessage add_related}@anchor{3b6f}
@deffn {Method} add_related (*args, content_manager=None, **kw)

If the message is a @code{multipart/related}, create a new message
object, pass all of the arguments to its @ref{1ca0,,set_content()} method,
and @ref{3b70,,attach()} it to the @code{multipart}.  If
the message is a non-@code{multipart}, call @ref{3b6c,,make_related()} and then
proceed as above.  If the message is any other type of @code{multipart},
raise a @ref{199,,TypeError}. If `content_manager' is not specified, use
the @code{content_manager} specified by the current @ref{53,,policy}.
If the added part has no @code{Content-Disposition} header,
add one with the value @code{inline}.
@end deffn

@geindex add_alternative() (email.message.EmailMessage method)
@anchor{library/email message email message EmailMessage add_alternative}@anchor{3b71}
@deffn {Method} add_alternative (*args, content_manager=None, **kw)

If the message is a @code{multipart/alternative}, create a new message
object, pass all of the arguments to its @ref{1ca0,,set_content()} method, and
@ref{3b70,,attach()} it to the @code{multipart}.  If the
message is a non-@code{multipart} or @code{multipart/related}, call
@ref{3b6d,,make_alternative()} and then proceed as above.  If the message is
any other type of @code{multipart}, raise a @ref{199,,TypeError}. If
`content_manager' is not specified, use the @code{content_manager} specified
by the current @ref{53,,policy}.
@end deffn

@geindex add_attachment() (email.message.EmailMessage method)
@anchor{library/email message email message EmailMessage add_attachment}@anchor{3b72}
@deffn {Method} add_attachment (*args, content_manager=None, **kw)

If the message is a @code{multipart/mixed}, create a new message object,
pass all of the arguments to its @ref{1ca0,,set_content()} method, and
@ref{3b70,,attach()} it to the @code{multipart}.  If the
message is a non-@code{multipart}, @code{multipart/related}, or
@code{multipart/alternative}, call @ref{3b6e,,make_mixed()} and then proceed as
above. If `content_manager' is not specified, use the @code{content_manager}
specified by the current @ref{53,,policy}.  If the added part
has no @code{Content-Disposition} header, add one with the value
@code{attachment}.  This method can be used both for explicit attachments
(@code{Content-Disposition: attachment}) and @code{inline} attachments
(@code{Content-Disposition: inline}), by passing appropriate
options to the @code{content_manager}.
@end deffn

@geindex clear() (email.message.EmailMessage method)
@anchor{library/email message email message EmailMessage clear}@anchor{3b73}
@deffn {Method} clear ()

Remove the payload and all of the headers.
@end deffn

@geindex clear_content() (email.message.EmailMessage method)
@anchor{library/email message email message EmailMessage clear_content}@anchor{3b74}
@deffn {Method} clear_content ()

Remove the payload and all of the @code{!Content-} headers, leaving
all other headers intact and in their original order.
@end deffn

@code{EmailMessage} objects have the following instance attributes:

@geindex preamble (email.message.EmailMessage attribute)
@anchor{library/email message email message EmailMessage preamble}@anchor{3b75}
@deffn {Attribute} preamble

The format of a MIME document allows for some text between the blank line
following the headers, and the first multipart boundary string. Normally,
this text is never visible in a MIME-aware mail reader because it falls
outside the standard MIME armor.  However, when viewing the raw text of
the message, or when viewing the message in a non-MIME aware reader, this
text can become visible.

The `preamble' attribute contains this leading extra-armor text for MIME
documents.  When the @ref{13a9,,Parser} discovers some text
after the headers but before the first boundary string, it assigns this
text to the message’s `preamble' attribute.  When the
@ref{13da,,Generator} is writing out the plain text
representation of a MIME message, and it finds the
message has a `preamble' attribute, it will write this text in the area
between the headers and the first boundary.  See @ref{52,,email.parser} and
@ref{44,,email.generator} for details.

Note that if the message object has no preamble, the `preamble' attribute
will be @code{None}.
@end deffn

@geindex epilogue (email.message.EmailMessage attribute)
@anchor{library/email message email message EmailMessage epilogue}@anchor{3b76}
@deffn {Attribute} epilogue

The `epilogue' attribute acts the same way as the `preamble' attribute,
except that it contains text that appears between the last boundary and
the end of the message.  As with the @ref{3b75,,preamble},
if there is no epilog text this attribute will be @code{None}.
@end deffn

@geindex defects (email.message.EmailMessage attribute)
@anchor{library/email message email message EmailMessage defects}@anchor{3b77}
@deffn {Attribute} defects

The `defects' attribute contains a list of all the problems found when
parsing this message.  See @ref{43,,email.errors} for a detailed description
of the possible parsing defects.
@end deffn
@end deffn

@geindex MIMEPart (class in email.message)
@anchor{library/email message email message MIMEPart}@anchor{1140}
@deffn {Class} email.message.MIMEPart (policy=default)

This class represents a subpart of a MIME message.  It is identical to
@ref{580,,EmailMessage}, except that no @code{MIME-Version} headers are
added when @ref{1ca0,,set_content()} is called, since sub-parts do
not need their own @code{MIME-Version} headers.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node email parser Parsing email messages,email generator Generating MIME documents,email message Representing an email message,email — An email and MIME handling package
@anchor{library/email parser doc}@anchor{3b78}@anchor{library/email parser email-parser-parsing-email-messages}@anchor{3b79}@anchor{library/email parser module-email parser}@anchor{52}@anchor{library/email parser translation-repo}@anchor{3b7a}
@subsubsection @code{email.parser}: Parsing email messages


@geindex module; email.parser

`Source code:' Lib/email/parser.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/email/parser.py}


__________________________________________________________________


Message object structures can be created in one of two ways: they can be
created from whole cloth by creating an @ref{580,,EmailMessage}
object, adding headers using the dictionary interface, and adding payload(s)
using @ref{1ca0,,set_content()} and related methods, or
they can be created by parsing a serialized representation of the email
message.

The @ref{3f,,email} package provides a standard parser that understands most email
document structures, including MIME documents.  You can pass the parser a
bytes, string or file object, and the parser will return to you the root
@ref{580,,EmailMessage} instance of the object structure.  For
simple, non-MIME messages the payload of this root object will likely be a
string containing the text of the message.  For MIME messages, the root object
will return @code{True} from its @ref{3b42,,is_multipart()}
method, and the subparts can be accessed via the payload manipulation methods,
such as @ref{3b66,,get_body()},
@ref{3b68,,iter_parts()}, and
@ref{3b65,,walk()}.

There are actually two parser interfaces available for use, the @ref{13a9,,Parser}
API and the incremental @ref{17d6,,FeedParser} API.  The @code{Parser} API is
most useful if you have the entire text of the message in memory, or if the
entire message lives in a file on the file system.  @code{FeedParser} is more
appropriate when you are reading the message from a stream which might block
waiting for more input (such as reading an email message from a socket).  The
@code{FeedParser} can consume and parse the message incrementally, and only
returns the root object when you close the parser.

Note that the parser can be extended in limited ways, and of course you can
implement your own parser completely from scratch.  All of the logic that
connects the @ref{3f,,email} package’s bundled parser and the
@ref{580,,EmailMessage} class is embodied in the @ref{12bf,,Policy}
class, so a custom parser can create message object trees any way it finds
necessary by implementing custom versions of the appropriate @code{Policy}
methods.

@menu
* FeedParser API:: 
* Parser API:: 
* Additional notes:: 

@end menu

@node FeedParser API,Parser API,,email parser Parsing email messages
@anchor{library/email parser feedparser-api}@anchor{3b7b}
@subsubsection FeedParser API


The @ref{13d7,,BytesFeedParser}, imported from the @code{email.feedparser} module,
provides an API that is conducive to incremental parsing of email messages,
such as would be necessary when reading the text of an email message from a
source that can block (such as a socket).  The @code{BytesFeedParser} can of
course be used to parse an email message fully contained in a @ref{194,,bytes-like object}, string, or file, but the @ref{13d8,,BytesParser} API may be more
convenient for such use cases.  The semantics and results of the two parser
APIs are identical.

The @ref{13d7,,BytesFeedParser}’s API is simple; you create an instance, feed it a
bunch of bytes until there’s no more to feed it, then close the parser to
retrieve the root message object.  The @code{BytesFeedParser} is extremely
accurate when parsing standards-compliant messages, and it does a very good job
of parsing non-compliant messages, providing information about how a message
was deemed broken.  It will populate a message object’s
@ref{3b77,,defects} attribute with a list of any
problems it found in a message.  See the @ref{43,,email.errors} module for the
list of defects that it can find.

Here is the API for the @ref{13d7,,BytesFeedParser}:

@geindex BytesFeedParser (class in email.parser)
@anchor{library/email parser email parser BytesFeedParser}@anchor{13d7}
@deffn {Class} email.parser.BytesFeedParser (_factory=None, *, policy=policy.compat32)

Create a @code{BytesFeedParser} instance.  Optional `_factory' is a
no-argument callable; if not specified use the
@ref{e9c,,message_factory} from the `policy'.  Call
`_factory' whenever a new message object is needed.

If `policy' is specified use the rules it specifies to update the
representation of the message.  If `policy' is not set, use the
@ref{12c0,,compat32} policy, which maintains backward
compatibility with the Python 3.2 version of the email package and provides
@ref{581,,Message} as the default factory.  All other policies
provide @ref{580,,EmailMessage} as the default `_factory'. For
more information on what else `policy' controls, see the
@ref{53,,policy} documentation.

Note: `The policy keyword should always be specified'; The default will
change to @ref{17d7,,email.policy.default} in a future version of Python.


Added in version 3.2.



Changed in version 3.3: Added the `policy' keyword.



Changed in version 3.6: `_factory' defaults to the policy @code{message_factory}.


@geindex feed() (email.parser.BytesFeedParser method)
@anchor{library/email parser email parser BytesFeedParser feed}@anchor{3b7c}
@deffn {Method} feed (data)

Feed the parser some more data.  `data' should be a @ref{194,,bytes-like object} containing one or more lines.  The lines can be partial and the
parser will stitch such partial lines together properly.  The lines can
have any of the three common line endings: carriage return, newline, or
carriage return and newline (they can even be mixed).
@end deffn

@geindex close() (email.parser.BytesFeedParser method)
@anchor{library/email parser email parser BytesFeedParser close}@anchor{3b7d}
@deffn {Method} close ()

Complete the parsing of all previously fed data and return the root
message object.  It is undefined what happens if @ref{3b7c,,feed()} is called
after this method has been called.
@end deffn
@end deffn

@geindex FeedParser (class in email.parser)
@anchor{library/email parser email parser FeedParser}@anchor{17d6}
@deffn {Class} email.parser.FeedParser (_factory=None, *, policy=policy.compat32)

Works like @ref{13d7,,BytesFeedParser} except that the input to the
@ref{3b7c,,feed()} method must be a string.  This is of limited
utility, since the only way for such a message to be valid is for it to
contain only ASCII text or, if @ref{fff,,utf8} is
@code{True}, no binary attachments.


Changed in version 3.3: Added the `policy' keyword.

@end deffn

@node Parser API,Additional notes,FeedParser API,email parser Parsing email messages
@anchor{library/email parser parser-api}@anchor{3b7e}
@subsubsection Parser API


The @ref{13d8,,BytesParser} class, imported from the @code{email.parser} module,
provides an API that can be used to parse a message when the complete contents
of the message are available in a @ref{194,,bytes-like object} or file.  The
@code{email.parser} module also provides @ref{13a9,,Parser} for parsing strings,
and header-only parsers, @ref{12c7,,BytesHeaderParser} and
@ref{12c8,,HeaderParser}, which can be used if you’re only interested in the
headers of the message.  @code{BytesHeaderParser} and @code{HeaderParser}
can be much faster in these situations, since they do not attempt to parse the
message body, instead setting the payload to the raw body.

@geindex BytesParser (class in email.parser)
@anchor{library/email parser email parser BytesParser}@anchor{13d8}
@deffn {Class} email.parser.BytesParser (_class=None, *, policy=policy.compat32)

Create a @code{BytesParser} instance.  The `_class' and `policy'
arguments have the same meaning and semantics as the `_factory'
and `policy' arguments of @ref{13d7,,BytesFeedParser}.

Note: `The policy keyword should always be specified'; The default will
change to @ref{17d7,,email.policy.default} in a future version of Python.


Changed in version 3.3: Removed the `strict' argument that was deprecated in 2.4.  Added the
`policy' keyword.



Changed in version 3.6: `_class' defaults to the policy @code{message_factory}.


@geindex parse() (email.parser.BytesParser method)
@anchor{library/email parser email parser BytesParser parse}@anchor{3b7f}
@deffn {Method} parse (fp, headersonly=False)

Read all the data from the binary file-like object `fp', parse the
resulting bytes, and return the message object.  `fp' must support
both the @ref{1535,,readline()} and the @ref{1534,,read()}
methods.

The bytes contained in `fp' must be formatted as a block of 
@geindex RFC; RFC 5322
RFC 5322@footnote{https://datatracker.ietf.org/doc/html/rfc5322.html}
(or, if @ref{fff,,utf8} is @code{True}, 
@geindex RFC; RFC 6532
RFC 6532@footnote{https://datatracker.ietf.org/doc/html/rfc6532.html})
style headers and header continuation lines, optionally preceded by an
envelope header.  The header block is terminated either by the end of the
data or by a blank line.  Following the header block is the body of the
message (which may contain MIME-encoded subparts, including subparts
with a @code{Content-Transfer-Encoding} of @code{8bit}).

Optional `headersonly' is a flag specifying whether to stop parsing after
reading the headers or not.  The default is @code{False}, meaning it parses
the entire contents of the file.
@end deffn

@geindex parsebytes() (email.parser.BytesParser method)
@anchor{library/email parser email parser BytesParser parsebytes}@anchor{3b80}
@deffn {Method} parsebytes (bytes, headersonly=False)

Similar to the @ref{3b7f,,parse()} method, except it takes a @ref{194,,bytes-like object} instead of a file-like object.  Calling this method on a
bytes-like object is equivalent to wrapping `bytes' in a
@ref{10aa,,BytesIO} instance first and calling @code{parse()}.

Optional `headersonly' is as with the @ref{3b7f,,parse()} method.
@end deffn


Added in version 3.2.

@end deffn

@geindex BytesHeaderParser (class in email.parser)
@anchor{library/email parser email parser BytesHeaderParser}@anchor{12c7}
@deffn {Class} email.parser.BytesHeaderParser (_class=None, *, policy=policy.compat32)

Exactly like @ref{13d8,,BytesParser}, except that `headersonly'
defaults to @code{True}.


Added in version 3.3.

@end deffn

@geindex Parser (class in email.parser)
@anchor{library/email parser email parser Parser}@anchor{13a9}
@deffn {Class} email.parser.Parser (_class=None, *, policy=policy.compat32)

This class is parallel to @ref{13d8,,BytesParser}, but handles string input.


Changed in version 3.3: Removed the `strict' argument.  Added the `policy' keyword.



Changed in version 3.6: `_class' defaults to the policy @code{message_factory}.


@geindex parse() (email.parser.Parser method)
@anchor{library/email parser email parser Parser parse}@anchor{3b81}
@deffn {Method} parse (fp, headersonly=False)

Read all the data from the text-mode file-like object `fp', parse the
resulting text, and return the root message object.  `fp' must support
both the @ref{20ea,,readline()} and the
@ref{20b0,,read()} methods on file-like objects.

Other than the text mode requirement, this method operates like
@ref{3b7f,,BytesParser.parse()}.
@end deffn

@geindex parsestr() (email.parser.Parser method)
@anchor{library/email parser email parser Parser parsestr}@anchor{3b82}
@deffn {Method} parsestr (text, headersonly=False)

Similar to the @ref{3b81,,parse()} method, except it takes a string object
instead of a file-like object.  Calling this method on a string is
equivalent to wrapping `text' in a @ref{112f,,StringIO} instance first
and calling @code{parse()}.

Optional `headersonly' is as with the @ref{3b81,,parse()} method.
@end deffn
@end deffn

@geindex HeaderParser (class in email.parser)
@anchor{library/email parser email parser HeaderParser}@anchor{12c8}
@deffn {Class} email.parser.HeaderParser (_class=None, *, policy=policy.compat32)

Exactly like @ref{13a9,,Parser}, except that `headersonly'
defaults to @code{True}.
@end deffn

Since creating a message object structure from a string or a file object is such
a common task, four functions are provided as a convenience.  They are available
in the top-level @ref{3f,,email} package namespace.

@geindex message_from_bytes() (in module email)
@anchor{library/email parser email message_from_bytes}@anchor{13d5}
@deffn {Function} email.message_from_bytes (s, _class=None, *, policy=policy.compat32)

Return a message object structure from a @ref{194,,bytes-like object}.  This is
equivalent to @code{BytesParser().parsebytes(s)}.  Optional `_class' and
`policy' are interpreted as with the @ref{13d8,,BytesParser} class
constructor.


Added in version 3.2.



Changed in version 3.3: Removed the `strict' argument.  Added the `policy' keyword.

@end deffn

@geindex message_from_binary_file() (in module email)
@anchor{library/email parser email message_from_binary_file}@anchor{13d6}
@deffn {Function} email.message_from_binary_file (fp, _class=None, *, policy=policy.compat32)

Return a message object structure tree from an open binary @ref{13cf,,file object}.  This is equivalent to @code{BytesParser().parse(fp)}.  `_class' and
`policy' are interpreted as with the @ref{13d8,,BytesParser} class
constructor.


Added in version 3.2.



Changed in version 3.3: Removed the `strict' argument.  Added the `policy' keyword.

@end deffn

@geindex message_from_string() (in module email)
@anchor{library/email parser email message_from_string}@anchor{3b83}
@deffn {Function} email.message_from_string (s, _class=None, *, policy=policy.compat32)

Return a message object structure from a string.  This is equivalent to
@code{Parser().parsestr(s)}.  `_class' and `policy' are interpreted as
with the @ref{13a9,,Parser} class constructor.


Changed in version 3.3: Removed the `strict' argument.  Added the `policy' keyword.

@end deffn

@geindex message_from_file() (in module email)
@anchor{library/email parser email message_from_file}@anchor{3b84}
@deffn {Function} email.message_from_file (fp, _class=None, *, policy=policy.compat32)

Return a message object structure tree from an open @ref{13cf,,file object}.
This is equivalent to @code{Parser().parse(fp)}.  `_class' and `policy' are
interpreted as with the @ref{13a9,,Parser} class constructor.


Changed in version 3.3: Removed the `strict' argument.  Added the `policy' keyword.



Changed in version 3.6: `_class' defaults to the policy @code{message_factory}.

@end deffn

Here’s an example of how you might use @ref{13d5,,message_from_bytes()} at an
interactive Python prompt:

@example
>>> import email
>>> msg = email.message_from_bytes(myBytes)
@end example

@node Additional notes,,Parser API,email parser Parsing email messages
@anchor{library/email parser additional-notes}@anchor{3b85}
@subsubsection Additional notes


Here are some notes on the parsing semantics:


@itemize *

@item 
Most non-@code{multipart} type messages are parsed as a single message
object with a string payload.  These objects will return @code{False} for
@ref{3b42,,is_multipart()}, and
@ref{3b68,,iter_parts()} will yield an empty list.

@item 
All @code{multipart} type messages will be parsed as a container message
object with a list of sub-message objects for their payload.  The outer
container message will return @code{True} for
@ref{3b42,,is_multipart()}, and
@ref{3b68,,iter_parts()} will yield a list of subparts.

@item 
Most messages with a content type of @code{message/*} (such as
@code{message/delivery-status} and @code{message/rfc822}) will also
be parsed as container object containing a list payload of length 1.  Their
@ref{3b42,,is_multipart()} method will return @code{True}.
The single element yielded by @ref{3b68,,iter_parts()}
will be a sub-message object.

@item 
Some non-standards-compliant messages may not be internally consistent about
their @code{multipart}-edness.  Such messages may have a
@code{Content-Type} header of type @code{multipart}, but their
@ref{3b42,,is_multipart()} method may return @code{False}.
If such messages were parsed with the @ref{17d6,,FeedParser},
they will have an instance of the
@ref{3b86,,MultipartInvariantViolationDefect} class in their
`defects' attribute list.  See @ref{43,,email.errors} for details.
@end itemize

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node email generator Generating MIME documents,email policy Policy Objects,email parser Parsing email messages,email — An email and MIME handling package
@anchor{library/email generator doc}@anchor{3b87}@anchor{library/email generator email-generator-generating-mime-documents}@anchor{3b88}@anchor{library/email generator module-email generator}@anchor{44}@anchor{library/email generator translation-repo}@anchor{3b89}
@subsubsection @code{email.generator}: Generating MIME documents


@geindex module; email.generator

`Source code:' Lib/email/generator.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/email/generator.py}


__________________________________________________________________


One of the most common tasks is to generate the flat (serialized) version of
the email message represented by a message object structure.  You will need to
do this if you want to send your message via @ref{105f,,smtplib.SMTP.sendmail()},
or print the message on the console.  Taking a
message object structure and producing a serialized representation is the job
of the generator classes.

As with the @ref{52,,email.parser} module, you aren’t limited to the functionality
of the bundled generator; you could write one from scratch yourself.  However
the bundled generator knows how to generate most email in a standards-compliant
way, should handle MIME and non-MIME email messages just fine, and is designed
so that the bytes-oriented parsing and generation operations are inverses,
assuming the same non-transforming @ref{53,,policy} is used for both.  That
is, parsing the serialized byte stream via the
@ref{13d8,,BytesParser} class and then regenerating the serialized
byte stream using @ref{13db,,BytesGenerator} should produce output identical to
the input @footnote{
This statement assumes that you use the appropriate setting for
@code{unixfrom}, and that there are no @ref{53,,email.policy} settings calling for
automatic adjustments (for example,
@ref{3b8a,,refold_source} must be @code{none}, which is
`not' the default).  It is also not 100% true, since if the message
does not conform to the RFC standards occasionally information about the
exact original text is lost during parsing error recovery.  It is a goal
to fix these latter edge cases when possible.
}.  (On the other hand, using the generator on an
@ref{580,,EmailMessage} constructed by program may result in
changes to the @code{EmailMessage} object as defaults are
filled in.)

The @ref{13da,,Generator} class can be used to flatten a message into a text (as
opposed to binary) serialized representation, but since Unicode cannot
represent binary data directly, the message is of necessity transformed into
something that contains only ASCII characters, using the standard email RFC
Content Transfer Encoding techniques for encoding email messages for transport
over channels that are not “8 bit clean”.

To accommodate reproducible processing of SMIME-signed messages
@ref{13da,,Generator} disables header folding for message parts of type
@code{multipart/signed} and all subparts.

@geindex BytesGenerator (class in email.generator)
@anchor{library/email generator email generator BytesGenerator}@anchor{13db}
@deffn {Class} email.generator.BytesGenerator (outfp, mangle_from_=None, maxheaderlen=None, *, policy=None)

Return a @code{BytesGenerator} object that will write any message provided
to the @ref{3b8b,,flatten()} method, or any surrogateescape encoded text provided
to the @ref{3b8c,,write()} method, to the @ref{17fd,,file-like object} `outfp'.
`outfp' must support a @code{write} method that accepts binary data.

If optional `mangle_from_' is @code{True}, put a @code{>} character in front of
any line in the body that starts with the exact string @code{"From "}, that is
@code{From} followed by a space at the beginning of a line.  `mangle_from_'
defaults to the value of the @ref{ffd,,mangle_from_}
setting of the `policy' (which is @code{True} for the
@ref{e9d,,compat32} policy and @code{False} for all others).
`mangle_from_' is intended for use when messages are stored in Unix mbox
format (see @ref{8f,,mailbox} and WHY THE CONTENT-LENGTH FORMAT IS BAD@footnote{https://www.jwz.org/doc/content-length.html}).

If `maxheaderlen' is not @code{None}, refold any header lines that are longer
than `maxheaderlen', or if @code{0}, do not rewrap any headers.  If
`manheaderlen' is @code{None} (the default), wrap headers and other message
lines according to the `policy' settings.

If `policy' is specified, use that policy to control message generation.  If
`policy' is @code{None} (the default), use the policy associated with the
@ref{581,,Message} or @ref{580,,EmailMessage}
object passed to @code{flatten} to control the message generation.  See
@ref{53,,email.policy} for details on what `policy' controls.


Added in version 3.2.



Changed in version 3.3: Added the `policy' keyword.



Changed in version 3.6: The default behavior of the `mangle_from_'
and `maxheaderlen' parameters is to follow the policy.


@geindex flatten() (email.generator.BytesGenerator method)
@anchor{library/email generator email generator BytesGenerator flatten}@anchor{3b8b}
@deffn {Method} flatten (msg, unixfrom=False, linesep=None)

Print the textual representation of the message object structure rooted
at `msg' to the output file specified when the @code{BytesGenerator}
instance was created.

If the @ref{53,,policy} option @ref{3b8d,,cte_type}
is @code{8bit} (the default), copy any headers in the original parsed
message that have not been modified to the output with any bytes with the
high bit set reproduced as in the original, and preserve the non-ASCII
@code{Content-Transfer-Encoding} of any body parts that have them.
If @code{cte_type} is @code{7bit}, convert the bytes with the high bit set as
needed using an ASCII-compatible @code{Content-Transfer-Encoding}.
That is, transform parts with non-ASCII
@code{Content-Transfer-Encoding}
(@code{Content-Transfer-Encoding: 8bit}) to an ASCII compatible
@code{Content-Transfer-Encoding}, and encode RFC-invalid non-ASCII
bytes in headers using the MIME @code{unknown-8bit} character set, thus
rendering them RFC-compliant.

@c XXX: There should be an option that just does the RFC
@c compliance transformation on headers but leaves CTE 8bit parts alone.

If `unixfrom' is @code{True}, print the envelope header delimiter used by
the Unix mailbox format (see @ref{8f,,mailbox}) before the first of the
@geindex RFC; RFC 5322
RFC 5322@footnote{https://datatracker.ietf.org/doc/html/rfc5322.html} headers of the root message object.  If the root object has
no envelope header, craft a standard one.  The default is @code{False}.
Note that for subparts, no envelope header is ever printed.

If `linesep' is not @code{None}, use it as the separator character between
all the lines of the flattened message.  If `linesep' is @code{None} (the
default), use the value specified in the `policy'.

@c XXX: flatten should take a *policy* keyword.
@end deffn

@geindex clone() (email.generator.BytesGenerator method)
@anchor{library/email generator email generator BytesGenerator clone}@anchor{3b8e}
@deffn {Method} clone (fp)

Return an independent clone of this @code{BytesGenerator} instance with
the exact same option settings, and `fp' as the new `outfp'.
@end deffn

@geindex write() (email.generator.BytesGenerator method)
@anchor{library/email generator email generator BytesGenerator write}@anchor{3b8c}
@deffn {Method} write (s)

Encode `s' using the @code{ASCII} codec and the @code{surrogateescape} error
handler, and pass it to the `write' method of the `outfp' passed to the
@code{BytesGenerator}’s constructor.
@end deffn
@end deffn

As a convenience, @ref{580,,EmailMessage} provides the methods
@ref{3b40,,as_bytes()} and @code{bytes(aMessage)} (a.k.a.
@ref{3b41,,__bytes__()}), which simplify the generation of
a serialized binary representation of a message object.  For more detail, see
@ref{48,,email.message}.

Because strings cannot represent binary data, the @ref{13da,,Generator} class must
convert any binary data in any message it flattens to an ASCII compatible
format, by converting them to an ASCII compatible
@code{Content-Transfer_Encoding}.  Using the terminology of the email
RFCs, you can think of this as @code{Generator} serializing to an I/O stream
that is not “8 bit clean”.  In other words, most applications will want
to be using @ref{13db,,BytesGenerator}, and not @code{Generator}.

@geindex Generator (class in email.generator)
@anchor{library/email generator email generator Generator}@anchor{13da}
@deffn {Class} email.generator.Generator (outfp, mangle_from_=None, maxheaderlen=None, *, policy=None)

Return a @code{Generator} object that will write any message provided
to the @ref{3b8f,,flatten()} method, or any text provided to the @ref{3b90,,write()}
method, to the @ref{17fd,,file-like object} `outfp'.  `outfp' must support a
@code{write} method that accepts string data.

If optional `mangle_from_' is @code{True}, put a @code{>} character in front of
any line in the body that starts with the exact string @code{"From "}, that is
@code{From} followed by a space at the beginning of a line.  `mangle_from_'
defaults to the value of the @ref{ffd,,mangle_from_}
setting of the `policy' (which is @code{True} for the
@ref{e9d,,compat32} policy and @code{False} for all others).
`mangle_from_' is intended for use when messages are stored in Unix mbox
format (see @ref{8f,,mailbox} and WHY THE CONTENT-LENGTH FORMAT IS BAD@footnote{https://www.jwz.org/doc/content-length.html}).

If `maxheaderlen' is not @code{None}, refold any header lines that are longer
than `maxheaderlen', or if @code{0}, do not rewrap any headers.  If
`manheaderlen' is @code{None} (the default), wrap headers and other message
lines according to the `policy' settings.

If `policy' is specified, use that policy to control message generation.  If
`policy' is @code{None} (the default), use the policy associated with the
@ref{581,,Message} or @ref{580,,EmailMessage}
object passed to @code{flatten} to control the message generation.  See
@ref{53,,email.policy} for details on what `policy' controls.


Changed in version 3.3: Added the `policy' keyword.



Changed in version 3.6: The default behavior of the `mangle_from_'
and `maxheaderlen' parameters is to follow the policy.


@geindex flatten() (email.generator.Generator method)
@anchor{library/email generator email generator Generator flatten}@anchor{3b8f}
@deffn {Method} flatten (msg, unixfrom=False, linesep=None)

Print the textual representation of the message object structure rooted
at `msg' to the output file specified when the @code{Generator}
instance was created.

If the @ref{53,,policy} option @ref{3b8d,,cte_type}
is @code{8bit}, generate the message as if the option were set to @code{7bit}.
(This is required because strings cannot represent non-ASCII bytes.)
Convert any bytes with the high bit set as needed using an
ASCII-compatible @code{Content-Transfer-Encoding}.  That is,
transform parts with non-ASCII @code{Content-Transfer-Encoding}
(@code{Content-Transfer-Encoding: 8bit}) to an ASCII compatible
@code{Content-Transfer-Encoding}, and encode RFC-invalid non-ASCII
bytes in headers using the MIME @code{unknown-8bit} character set, thus
rendering them RFC-compliant.

If `unixfrom' is @code{True}, print the envelope header delimiter used by
the Unix mailbox format (see @ref{8f,,mailbox}) before the first of the
@geindex RFC; RFC 5322
RFC 5322@footnote{https://datatracker.ietf.org/doc/html/rfc5322.html} headers of the root message object.  If the root object has
no envelope header, craft a standard one.  The default is @code{False}.
Note that for subparts, no envelope header is ever printed.

If `linesep' is not @code{None}, use it as the separator character between
all the lines of the flattened message.  If `linesep' is @code{None} (the
default), use the value specified in the `policy'.

@c XXX: flatten should take a *policy* keyword.


Changed in version 3.2: Added support for re-encoding @code{8bit} message bodies, and the
`linesep' argument.

@end deffn

@geindex clone() (email.generator.Generator method)
@anchor{library/email generator email generator Generator clone}@anchor{3b91}
@deffn {Method} clone (fp)

Return an independent clone of this @code{Generator} instance with the
exact same options, and `fp' as the new `outfp'.
@end deffn

@geindex write() (email.generator.Generator method)
@anchor{library/email generator email generator Generator write}@anchor{3b90}
@deffn {Method} write (s)

Write `s' to the `write' method of the `outfp' passed to the
@code{Generator}’s constructor.  This provides just enough file-like
API for @code{Generator} instances to be used in the @ref{117b,,print()}
function.
@end deffn
@end deffn

As a convenience, @ref{580,,EmailMessage} provides the methods
@ref{3b3d,,as_string()} and @code{str(aMessage)} (a.k.a.
@ref{3b3f,,__str__()}), which simplify the generation of
a formatted string representation of a message object.  For more detail, see
@ref{48,,email.message}.

The @code{email.generator} module also provides a derived class,
@ref{e9b,,DecodedGenerator}, which is like the @ref{13da,,Generator} base class,
except that non-@code{text} parts are not serialized, but are instead
represented in the output stream by a string derived from a template filled
in with information about the part.

@geindex DecodedGenerator (class in email.generator)
@anchor{library/email generator email generator DecodedGenerator}@anchor{e9b}
@deffn {Class} email.generator.DecodedGenerator (outfp, mangle_from_=None, maxheaderlen=None, fmt=None, *, policy=None)

Act like @ref{13da,,Generator}, except that for any subpart of the message
passed to @ref{3b8f,,Generator.flatten()}, if the subpart is of main type
@code{text}, print the decoded payload of the subpart, and if the main
type is not @code{text}, instead of printing it fill in the string
`fmt' using information from the part and print the resulting
filled-in string.

To fill in `fmt', execute @code{fmt % part_info}, where @code{part_info}
is a dictionary composed of the following keys and values:


@itemize *

@item 
@code{type} – Full MIME type of the non-@code{text} part

@item 
@code{maintype} – Main MIME type of the non-@code{text} part

@item 
@code{subtype} – Sub-MIME type of the non-@code{text} part

@item 
@code{filename} – Filename of the non-@code{text} part

@item 
@code{description} – Description associated with the non-@code{text} part

@item 
@code{encoding} – Content transfer encoding of the non-@code{text} part
@end itemize

If `fmt' is @code{None}, use the following default `fmt':

@quotation

“[Non-text (%(type)s) part of message omitted, filename %(filename)s]”
@end quotation

Optional `_mangle_from_' and `maxheaderlen' are as with the
@ref{13da,,Generator} base class.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node email policy Policy Objects,email errors Exception and Defect classes,email generator Generating MIME documents,email — An email and MIME handling package
@anchor{library/email policy doc}@anchor{3b92}@anchor{library/email policy email-policy-policy-objects}@anchor{3b93}@anchor{library/email policy module-email policy}@anchor{53}@anchor{library/email policy translation-repo}@anchor{3b94}
@subsubsection @code{email.policy}: Policy Objects


@geindex module; email.policy


Added in version 3.3.


`Source code:' Lib/email/policy.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/email/policy.py}


__________________________________________________________________


The @ref{3f,,email} package’s prime focus is the handling of email messages as
described by the various email and MIME RFCs.  However, the general format of
email messages (a block of header fields each consisting of a name followed by
a colon followed by a value, the whole block followed by a blank line and an
arbitrary ‘body’), is a format that has found utility outside of the realm of
email.  Some of these uses conform fairly closely to the main email RFCs, some
do not.  Even when working with email, there are times when it is desirable to
break strict compliance with the RFCs, such as generating emails that
interoperate with email servers that do not themselves follow the standards, or
that implement extensions you want to use in ways that violate the
standards.

Policy objects give the email package the flexibility to handle all these
disparate use cases.

A @ref{12bf,,Policy} object encapsulates a set of attributes and methods that
control the behavior of various components of the email package during use.
@code{Policy} instances can be passed to various classes and methods in the
email package to alter the default behavior.  The settable values and their
defaults are described below.

There is a default policy used by all classes in the email package.  For all of
the @ref{52,,parser} classes and the related convenience functions, and for
the @ref{581,,Message} class, this is the @ref{12c0,,Compat32}
policy, via its corresponding pre-defined instance @ref{e9d,,compat32}.  This
policy provides for complete backward compatibility (in some cases, including
bug compatibility) with the pre-Python3.3 version of the email package.

This default value for the `policy' keyword to
@ref{580,,EmailMessage} is the @ref{12c3,,EmailPolicy} policy, via
its pre-defined instance @ref{17d7,,default}.

When a @ref{581,,Message} or @ref{580,,EmailMessage}
object is created, it acquires a policy.  If the message is created by a
@ref{52,,parser}, a policy passed to the parser will be the policy used by
the message it creates.  If the message is created by the program, then the
policy can be specified when it is created.  When a message is passed to a
@ref{44,,generator}, the generator uses the policy from the message by
default, but you can also pass a specific policy to the generator that will
override the one stored on the message object.

The default value for the `policy' keyword for the @ref{52,,email.parser} classes
and the parser convenience functions `will be changing' in a future version of
Python.  Therefore you should `always specify explicitly which policy you want
to use' when calling any of the classes and functions described in the
@code{parser} module.

The first part of this documentation covers the features of @ref{12bf,,Policy}, an
@ref{13c2,,abstract base class} that defines the features that are common to all
policy objects, including @ref{e9d,,compat32}.  This includes certain hook
methods that are called internally by the email package, which a custom policy
could override to obtain different behavior.  The second part describes the
concrete classes @ref{12c3,,EmailPolicy} and @ref{12c0,,Compat32}, which implement
the hooks that provide the standard behavior and the backward compatible
behavior and features, respectively.

@ref{12bf,,Policy} instances are immutable, but they can be cloned, accepting the
same keyword arguments as the class constructor and returning a new
@code{Policy} instance that is a copy of the original but with the specified
attributes values changed.

As an example, the following code could be used to read an email message from a
file on disk and pass it to the system @code{sendmail} program on a Unix system:

@c from unittest import mock
@c mocker = mock.patch('subprocess.Popen')
@c m = mocker.start()
@c proc = mock.MagicMock()
@c m.return_value = proc
@c proc.stdin.close.return_value = None
@c mymsg = open('mymsg.txt', 'w')
@c mymsg.write('To: abc@xyz.com\n\n')
@c mymsg.flush()

@example
>>> from email import message_from_binary_file
>>> from email.generator import BytesGenerator
>>> from email import policy
>>> from subprocess import Popen, PIPE
>>> with open('mymsg.txt', 'rb') as f:
...     msg = message_from_binary_file(f, policy=policy.default)
...
>>> p = Popen(['sendmail', msg['To'].addresses[0]], stdin=PIPE)
>>> g = BytesGenerator(p.stdin, policy=msg.policy.clone(linesep='\r\n'))
>>> g.flatten(msg)
>>> p.stdin.close()
>>> rc = p.wait()
@end example

@c mymsg.close()
@c mocker.stop()
@c import os
@c os.remove('mymsg.txt')

Here we are telling @ref{13db,,BytesGenerator} to use the RFC
correct line separator characters when creating the binary string to feed into
@code{sendmail's} @code{stdin}, where the default policy would use @code{\n} line
separators.

Some email package methods accept a `policy' keyword argument, allowing the
policy to be overridden for that method.  For example, the following code uses
the @ref{113d,,as_bytes()} method of the `msg' object from
the previous example and writes the message to a file using the native line
separators for the platform on which it is running:

@example
>>> import os
>>> with open('converted.txt', 'wb') as f:
...     f.write(msg.as_bytes(policy=msg.policy.clone(linesep=os.linesep)))
17
@end example

Policy objects can also be combined using the addition operator, producing a
policy object whose settings are a combination of the non-default values of the
summed objects:

@example
>>> compat_SMTP = policy.compat32.clone(linesep='\r\n')
>>> compat_strict = policy.compat32.clone(raise_on_defect=True)
>>> compat_strict_SMTP = compat_SMTP + compat_strict
@end example

This operation is not commutative; that is, the order in which the objects are
added matters.  To illustrate:

@example
>>> policy100 = policy.compat32.clone(max_line_length=100)
>>> policy80 = policy.compat32.clone(max_line_length=80)
>>> apolicy = policy100 + policy80
>>> apolicy.max_line_length
80
>>> apolicy = policy80 + policy100
>>> apolicy.max_line_length
100
@end example

@geindex Policy (class in email.policy)
@anchor{library/email policy email policy Policy}@anchor{12bf}
@deffn {Class} email.policy.Policy (**kw)

This is the @ref{13c2,,abstract base class} for all policy classes.  It provides
default implementations for a couple of trivial methods, as well as the
implementation of the immutability property, the @ref{12c1,,clone()} method, and
the constructor semantics.

The constructor of a policy class can be passed various keyword arguments.
The arguments that may be specified are any non-method properties on this
class, plus any additional non-method properties on the concrete class.  A
value specified in the constructor will override the default value for the
corresponding attribute.

This class defines the following properties, and thus values for the
following may be passed in the constructor of any policy class:

@geindex max_line_length (email.policy.Policy attribute)
@anchor{library/email policy email policy Policy max_line_length}@anchor{3b3e}
@deffn {Attribute} max_line_length

The maximum length of any line in the serialized output, not counting the
end of line character(s).  Default is 78, per 
@geindex RFC; RFC 5322
RFC 5322@footnote{https://datatracker.ietf.org/doc/html/rfc5322.html}.  A value of
@code{0} or @ref{887,,None} indicates that no line wrapping should be
done at all.
@end deffn

@geindex linesep (email.policy.Policy attribute)
@anchor{library/email policy email policy Policy linesep}@anchor{3b95}
@deffn {Attribute} linesep

The string to be used to terminate lines in serialized output.  The
default is @code{\n} because that’s the internal end-of-line discipline used
by Python, though @code{\r\n} is required by the RFCs.
@end deffn

@geindex cte_type (email.policy.Policy attribute)
@anchor{library/email policy email policy Policy cte_type}@anchor{3b8d}
@deffn {Attribute} cte_type

Controls the type of Content Transfer Encodings that may be or are
required to be used.  The possible values are:


@multitable {xxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@code{7bit}

@tab

all data must be “7 bit clean” (ASCII-only).  This means that
where necessary data will be encoded using either
quoted-printable or base64 encoding.

@item

@code{8bit}

@tab

data is not constrained to be 7 bit clean.  Data in headers is
still required to be ASCII-only and so will be encoded (see
@ref{3b96,,fold_binary()} and @ref{fff,,utf8} below for
exceptions), but body parts may use the @code{8bit} CTE.

@end multitable


A @code{cte_type} value of @code{8bit} only works with @code{BytesGenerator}, not
@code{Generator}, because strings cannot contain binary data.  If a
@code{Generator} is operating under a policy that specifies
@code{cte_type=8bit}, it will act as if @code{cte_type} is @code{7bit}.
@end deffn

@geindex raise_on_defect (email.policy.Policy attribute)
@anchor{library/email policy email policy Policy raise_on_defect}@anchor{3b97}
@deffn {Attribute} raise_on_defect

If @ref{e0d,,True}, any defects encountered will be raised as errors.  If
@ref{d31,,False} (the default), defects will be passed to the
@ref{3b98,,register_defect()} method.
@end deffn

@geindex mangle_from_ (email.policy.Policy attribute)
@anchor{library/email policy email policy Policy mangle_from_}@anchor{ffd}
@deffn {Attribute} mangle_from_

If @ref{e0d,,True}, lines starting with `“From “' in the body are
escaped by putting a @code{>} in front of them. This parameter is used when
the message is being serialized by a generator.
Default: @ref{d31,,False}.


Added in version 3.5.

@end deffn

@geindex message_factory (email.policy.Policy attribute)
@anchor{library/email policy email policy Policy message_factory}@anchor{e9c}
@deffn {Attribute} message_factory

A factory function for constructing a new empty message object.  Used
by the parser when building messages.  Defaults to @code{None}, in
which case @ref{581,,Message} is used.


Added in version 3.6.

@end deffn

@geindex verify_generated_headers (email.policy.Policy attribute)
@anchor{library/email policy email policy Policy verify_generated_headers}@anchor{4f3}
@deffn {Attribute} verify_generated_headers

If @code{True} (the default), the generator will raise
@ref{3b99,,HeaderWriteError} instead of writing a header
that is improperly folded or delimited, such that it would
be parsed as multiple headers or joined with adjacent data.
Such headers can be generated by custom header classes or bugs
in the @code{email} module.

As it’s a security feature, this defaults to @code{True} even in the
@ref{12c0,,Compat32} policy.
For backwards compatible, but unsafe, behavior, it must be set to
@code{False} explicitly.


Added in version 3.13.

@end deffn

The following @code{Policy} method is intended to be called by code using
the email library to create policy instances with custom settings:

@geindex clone() (email.policy.Policy method)
@anchor{library/email policy email policy Policy clone}@anchor{12c1}
@deffn {Method} clone (**kw)

Return a new @code{Policy} instance whose attributes have the same
values as the current instance, except where those attributes are
given new values by the keyword arguments.
@end deffn

The remaining @code{Policy} methods are called by the email package code,
and are not intended to be called by an application using the email package.
A custom policy must implement all of these methods.

@geindex handle_defect() (email.policy.Policy method)
@anchor{library/email policy email policy Policy handle_defect}@anchor{3b9a}
@deffn {Method} handle_defect (obj, defect)

Handle a `defect' found on `obj'.  When the email package calls this
method, `defect' will always be a subclass of
@ref{3b9b,,MessageDefect}.

The default implementation checks the @ref{3b97,,raise_on_defect} flag.  If
it is @code{True}, `defect' is raised as an exception.  If it is @code{False}
(the default), `obj' and `defect' are passed to @ref{3b98,,register_defect()}.
@end deffn

@geindex register_defect() (email.policy.Policy method)
@anchor{library/email policy email policy Policy register_defect}@anchor{3b98}
@deffn {Method} register_defect (obj, defect)

Register a `defect' on `obj'.  In the email package, `defect' will always
be a subclass of @ref{3b9b,,MessageDefect}.

The default implementation calls the @code{append} method of the @code{defects}
attribute of `obj'.  When the email package calls @ref{3b9a,,handle_defect},
`obj' will normally have a @code{defects} attribute that has an @code{append}
method.  Custom object types used with the email package (for example,
custom @code{Message} objects) should also provide such an attribute,
otherwise defects in parsed messages will raise unexpected errors.
@end deffn

@geindex header_max_count() (email.policy.Policy method)
@anchor{library/email policy email policy Policy header_max_count}@anchor{3b9c}
@deffn {Method} header_max_count (name)

Return the maximum allowed number of headers named `name'.

Called when a header is added to an @ref{580,,EmailMessage}
or @ref{581,,Message} object.  If the returned value is not
@code{0} or @code{None}, and there are already a number of headers with the
name `name' greater than or equal to the value returned, a
@ref{2ee,,ValueError} is raised.

Because the default behavior of @code{Message.__setitem__} is to append the
value to the list of headers, it is easy to create duplicate headers
without realizing it.  This method allows certain headers to be limited
in the number of instances of that header that may be added to a
@code{Message} programmatically.  (The limit is not observed by the parser,
which will faithfully produce as many headers as exist in the message
being parsed.)

The default implementation returns @code{None} for all header names.
@end deffn

@geindex header_source_parse() (email.policy.Policy method)
@anchor{library/email policy email policy Policy header_source_parse}@anchor{3b9d}
@deffn {Method} header_source_parse (sourcelines)

The email package calls this method with a list of strings, each string
ending with the line separation characters found in the source being
parsed.  The first line includes the field header name and separator.
All whitespace in the source is preserved.  The method should return the
@code{(name, value)} tuple that is to be stored in the @code{Message} to
represent the parsed header.

If an implementation wishes to retain compatibility with the existing
email package policies, `name' should be the case preserved name (all
characters up to the ‘@code{:}’ separator), while `value' should be the
unfolded value (all line separator characters removed, but whitespace
kept intact), stripped of leading whitespace.

`sourcelines' may contain surrogateescaped binary data.

There is no default implementation
@end deffn

@geindex header_store_parse() (email.policy.Policy method)
@anchor{library/email policy email policy Policy header_store_parse}@anchor{3b9e}
@deffn {Method} header_store_parse (name, value)

The email package calls this method with the name and value provided by
the application program when the application program is modifying a
@code{Message} programmatically (as opposed to a @code{Message} created by a
parser).  The method should return the @code{(name, value)} tuple that is to
be stored in the @code{Message} to represent the header.

If an implementation wishes to retain compatibility with the existing
email package policies, the `name' and `value' should be strings or
string subclasses that do not change the content of the passed in
arguments.

There is no default implementation
@end deffn

@geindex header_fetch_parse() (email.policy.Policy method)
@anchor{library/email policy email policy Policy header_fetch_parse}@anchor{3b9f}
@deffn {Method} header_fetch_parse (name, value)

The email package calls this method with the `name' and `value' currently
stored in the @code{Message} when that header is requested by the
application program, and whatever the method returns is what is passed
back to the application as the value of the header being retrieved.
Note that there may be more than one header with the same name stored in
the @code{Message}; the method is passed the specific name and value of the
header destined to be returned to the application.

`value' may contain surrogateescaped binary data.  There should be no
surrogateescaped binary data in the value returned by the method.

There is no default implementation
@end deffn

@geindex fold() (email.policy.Policy method)
@anchor{library/email policy email policy Policy fold}@anchor{3ba0}
@deffn {Method} fold (name, value)

The email package calls this method with the `name' and `value' currently
stored in the @code{Message} for a given header.  The method should return a
string that represents that header “folded” correctly (according to the
policy settings) by composing the `name' with the `value' and inserting
@ref{3b95,,linesep} characters at the appropriate places.  See 
@geindex RFC; RFC 5322
RFC 5322@footnote{https://datatracker.ietf.org/doc/html/rfc5322.html}
for a discussion of the rules for folding email headers.

`value' may contain surrogateescaped binary data.  There should be no
surrogateescaped binary data in the string returned by the method.
@end deffn

@geindex fold_binary() (email.policy.Policy method)
@anchor{library/email policy email policy Policy fold_binary}@anchor{3b96}
@deffn {Method} fold_binary (name, value)

The same as @ref{3ba0,,fold()}, except that the returned value should be a
bytes object rather than a string.

`value' may contain surrogateescaped binary data.  These could be
converted back into binary data in the returned bytes object.
@end deffn
@end deffn

@geindex EmailPolicy (class in email.policy)
@anchor{library/email policy email policy EmailPolicy}@anchor{12c3}
@deffn {Class} email.policy.EmailPolicy (**kw)

This concrete @ref{12bf,,Policy} provides behavior that is intended to be fully
compliant with the current email RFCs.  These include (but are not limited
to) 
@geindex RFC; RFC 5322
RFC 5322@footnote{https://datatracker.ietf.org/doc/html/rfc5322.html}, 
@geindex RFC; RFC 2047
RFC 2047@footnote{https://datatracker.ietf.org/doc/html/rfc2047.html}, and the current MIME RFCs.

This policy adds new header parsing and folding algorithms.  Instead of
simple strings, headers are @code{str} subclasses with attributes that depend
on the type of the field.  The parsing and folding algorithm fully implement
@geindex RFC; RFC 2047
RFC 2047@footnote{https://datatracker.ietf.org/doc/html/rfc2047.html} and 
@geindex RFC; RFC 5322
RFC 5322@footnote{https://datatracker.ietf.org/doc/html/rfc5322.html}.

The default value for the @ref{e9c,,message_factory}
attribute is @ref{580,,EmailMessage}.

In addition to the settable attributes listed above that apply to all
policies, this policy adds the following additional attributes:


Added in version 3.6: @footnote{
Originally added in 3.3 as a @ref{1248,,provisional feature}.
}


@geindex utf8 (email.policy.EmailPolicy attribute)
@anchor{library/email policy email policy EmailPolicy utf8}@anchor{fff}
@deffn {Attribute} utf8

If @code{False}, follow 
@geindex RFC; RFC 5322
RFC 5322@footnote{https://datatracker.ietf.org/doc/html/rfc5322.html}, supporting non-ASCII characters in
headers by encoding them as “encoded words”.  If @code{True}, follow
@geindex RFC; RFC 6532
RFC 6532@footnote{https://datatracker.ietf.org/doc/html/rfc6532.html} and use @code{utf-8} encoding for headers.  Messages
formatted in this way may be passed to SMTP servers that support
the @code{SMTPUTF8} extension (
@geindex RFC; RFC 6531
RFC 6531@footnote{https://datatracker.ietf.org/doc/html/rfc6531.html}).
@end deffn

@geindex refold_source (email.policy.EmailPolicy attribute)
@anchor{library/email policy email policy EmailPolicy refold_source}@anchor{3b8a}
@deffn {Attribute} refold_source

If the value for a header in the @code{Message} object originated from a
@ref{52,,parser} (as opposed to being set by a program), this
attribute indicates whether or not a generator should refold that value
when transforming the message back into serialized form.  The possible
values are:


@multitable {xxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@code{none}

@tab

all source values use original folding

@item

@code{long}

@tab

source values that have any line that is longer than
@code{max_line_length} will be refolded

@item

@code{all}

@tab

all values are refolded.

@end multitable


The default is @code{long}.
@end deffn

@geindex header_factory (email.policy.EmailPolicy attribute)
@anchor{library/email policy email policy EmailPolicy header_factory}@anchor{3ba1}
@deffn {Attribute} header_factory

A callable that takes two arguments, @code{name} and @code{value}, where
@code{name} is a header field name and @code{value} is an unfolded header field
value, and returns a string subclass that represents that header.  A
default @code{header_factory} (see @ref{46,,headerregistry}) is provided
that supports custom parsing for the various address and date 
@geindex RFC; RFC 5322
RFC 5322@footnote{https://datatracker.ietf.org/doc/html/rfc5322.html}
header field types, and the major MIME header field stypes.  Support for
additional custom parsing will be added in the future.
@end deffn

@geindex content_manager (email.policy.EmailPolicy attribute)
@anchor{library/email policy email policy EmailPolicy content_manager}@anchor{1141}
@deffn {Attribute} content_manager

An object with at least two methods: get_content and set_content.  When
the @ref{3b69,,get_content()} or
@ref{1ca0,,set_content()} method of an
@ref{580,,EmailMessage} object is called, it calls the
corresponding method of this object, passing it the message object as its
first argument, and any arguments or keywords that were passed to it as
additional arguments.  By default @code{content_manager} is set to
@ref{3ba2,,raw_data_manager}.


Added in version 3.4.

@end deffn

The class provides the following concrete implementations of the abstract
methods of @ref{12bf,,Policy}:

@geindex header_max_count() (email.policy.EmailPolicy method)
@anchor{library/email policy email policy EmailPolicy header_max_count}@anchor{3ba3}
@deffn {Method} header_max_count (name)

Returns the value of the
@ref{3ba4,,max_count} attribute of the
specialized class used to represent the header with the given name.
@end deffn

@geindex header_source_parse() (email.policy.EmailPolicy method)
@anchor{library/email policy email policy EmailPolicy header_source_parse}@anchor{1956}
@deffn {Method} header_source_parse (sourcelines)

The name is parsed as everything up to the ‘@code{:}’ and returned
unmodified.  The value is determined by stripping leading whitespace off
the remainder of the first line, joining all subsequent lines together,
and stripping any trailing carriage return or linefeed characters.
@end deffn

@geindex header_store_parse() (email.policy.EmailPolicy method)
@anchor{library/email policy email policy EmailPolicy header_store_parse}@anchor{3ba5}
@deffn {Method} header_store_parse (name, value)

The name is returned unchanged.  If the input value has a @code{name}
attribute and it matches `name' ignoring case, the value is returned
unchanged.  Otherwise the `name' and `value' are passed to
@code{header_factory}, and the resulting header object is returned as
the value.  In this case a @code{ValueError} is raised if the input value
contains CR or LF characters.
@end deffn

@geindex header_fetch_parse() (email.policy.EmailPolicy method)
@anchor{library/email policy email policy EmailPolicy header_fetch_parse}@anchor{3ba6}
@deffn {Method} header_fetch_parse (name, value)

If the value has a @code{name} attribute, it is returned to unmodified.
Otherwise the `name', and the `value' with any CR or LF characters
removed, are passed to the @code{header_factory}, and the resulting
header object is returned.  Any surrogateescaped bytes get turned into
the unicode unknown-character glyph.
@end deffn

@geindex fold() (email.policy.EmailPolicy method)
@anchor{library/email policy email policy EmailPolicy fold}@anchor{1a37}
@deffn {Method} fold (name, value)

Header folding is controlled by the @ref{3b8a,,refold_source} policy setting.
A value is considered to be a ‘source value’ if and only if it does not
have a @code{name} attribute (having a @code{name} attribute means it is a
header object of some sort).  If a source value needs to be refolded
according to the policy, it is converted into a header object by
passing the `name' and the `value' with any CR and LF characters removed
to the @code{header_factory}.  Folding of a header object is done by
calling its @code{fold} method with the current policy.

Source values are split into lines using @ref{1462,,splitlines()}.  If
the value is not to be refolded, the lines are rejoined using the
@code{linesep} from the policy and returned.  The exception is lines
containing non-ascii binary data.  In that case the value is refolded
regardless of the @code{refold_source} setting, which causes the binary data
to be CTE encoded using the @code{unknown-8bit} charset.
@end deffn

@geindex fold_binary() (email.policy.EmailPolicy method)
@anchor{library/email policy email policy EmailPolicy fold_binary}@anchor{3ba7}
@deffn {Method} fold_binary (name, value)

The same as @ref{1a37,,fold()} if @ref{3b8d,,cte_type} is @code{7bit}, except
that the returned value is bytes.

If @ref{3b8d,,cte_type} is @code{8bit}, non-ASCII binary data is
converted back
into bytes.  Headers with binary data are not refolded, regardless of the
@code{refold_header} setting, since there is no way to know whether the
binary data consists of single byte characters or multibyte characters.
@end deffn
@end deffn

The following instances of @ref{12c3,,EmailPolicy} provide defaults suitable for
specific application domains.  Note that in the future the behavior of these
instances (in particular the @code{HTTP} instance) may be adjusted to conform even
more closely to the RFCs relevant to their domains.

@geindex default (in module email.policy)
@anchor{library/email policy email policy default}@anchor{17d7}
@deffn {Data} email.policy.default

An instance of @code{EmailPolicy} with all defaults unchanged.  This policy
uses the standard Python @code{\n} line endings rather than the RFC-correct
@code{\r\n}.
@end deffn

@geindex SMTP (in module email.policy)
@anchor{library/email policy email policy SMTP}@anchor{3ba8}
@deffn {Data} email.policy.SMTP

Suitable for serializing messages in conformance with the email RFCs.
Like @code{default}, but with @code{linesep} set to @code{\r\n}, which is RFC
compliant.
@end deffn

@geindex SMTPUTF8 (in module email.policy)
@anchor{library/email policy email policy SMTPUTF8}@anchor{3ba9}
@deffn {Data} email.policy.SMTPUTF8

The same as @code{SMTP} except that @ref{fff,,utf8} is @code{True}.
Useful for serializing messages to a message store without using encoded
words in the headers.  Should only be used for SMTP transmission if the
sender or recipient addresses have non-ASCII characters (the
@ref{1060,,smtplib.SMTP.send_message()} method handles this automatically).
@end deffn

@geindex HTTP (in module email.policy)
@anchor{library/email policy email policy HTTP}@anchor{3baa}
@deffn {Data} email.policy.HTTP

Suitable for serializing headers with for use in HTTP traffic.  Like
@code{SMTP} except that @code{max_line_length} is set to @code{None} (unlimited).
@end deffn

@geindex strict (in module email.policy)
@anchor{library/email policy email policy strict}@anchor{3bab}
@deffn {Data} email.policy.strict

Convenience instance.  The same as @code{default} except that
@code{raise_on_defect} is set to @code{True}.  This allows any policy to be made
strict by writing:

@example
somepolicy + policy.strict
@end example
@end deffn

With all of these @ref{12c3,,EmailPolicies}, the effective API of
the email package is changed from the Python 3.2 API in the following ways:


@itemize *

@item 
Setting a header on a @ref{581,,Message} results in that
header being parsed and a header object created.

@item 
Fetching a header value from a @ref{581,,Message} results
in that header being parsed and a header object created and
returned.

@item 
Any header object, or any header that is refolded due to the
policy settings, is folded using an algorithm that fully implements the
RFC folding algorithms, including knowing where encoded words are required
and allowed.
@end itemize

From the application view, this means that any header obtained through the
@ref{580,,EmailMessage} is a header object with extra
attributes, whose string value is the fully decoded unicode value of the
header.  Likewise, a header may be assigned a new value, or a new header
created, using a unicode string, and the policy will take care of converting
the unicode string into the correct RFC encoded form.

The header objects and their attributes are described in
@ref{46,,headerregistry}.

@geindex Compat32 (class in email.policy)
@anchor{library/email policy email policy Compat32}@anchor{12c0}
@deffn {Class} email.policy.Compat32 (**kw)

This concrete @ref{12bf,,Policy} is the backward compatibility policy.  It
replicates the behavior of the email package in Python 3.2.  The
@code{policy} module also defines an instance of this class,
@ref{e9d,,compat32}, that is used as the default policy.  Thus the default
behavior of the email package is to maintain compatibility with Python 3.2.

The following attributes have values that are different from the
@ref{12bf,,Policy} default:

@geindex mangle_from_ (email.policy.Compat32 attribute)
@anchor{library/email policy email policy Compat32 mangle_from_}@anchor{3bac}
@deffn {Attribute} mangle_from_

The default is @code{True}.
@end deffn

The class provides the following concrete implementations of the
abstract methods of @ref{12bf,,Policy}:

@geindex header_source_parse() (email.policy.Compat32 method)
@anchor{library/email policy email policy Compat32 header_source_parse}@anchor{1957}
@deffn {Method} header_source_parse (sourcelines)

The name is parsed as everything up to the ‘@code{:}’ and returned
unmodified.  The value is determined by stripping leading whitespace off
the remainder of the first line, joining all subsequent lines together,
and stripping any trailing carriage return or linefeed characters.
@end deffn

@geindex header_store_parse() (email.policy.Compat32 method)
@anchor{library/email policy email policy Compat32 header_store_parse}@anchor{3bad}
@deffn {Method} header_store_parse (name, value)

The name and value are returned unmodified.
@end deffn

@geindex header_fetch_parse() (email.policy.Compat32 method)
@anchor{library/email policy email policy Compat32 header_fetch_parse}@anchor{3bae}
@deffn {Method} header_fetch_parse (name, value)

If the value contains binary data, it is converted into a
@ref{1ca1,,Header} object using the @code{unknown-8bit} charset.
Otherwise it is returned unmodified.
@end deffn

@geindex fold() (email.policy.Compat32 method)
@anchor{library/email policy email policy Compat32 fold}@anchor{3baf}
@deffn {Method} fold (name, value)

Headers are folded using the @ref{1ca1,,Header} folding
algorithm, which preserves existing line breaks in the value, and wraps
each resulting line to the @code{max_line_length}.  Non-ASCII binary data are
CTE encoded using the @code{unknown-8bit} charset.
@end deffn

@geindex fold_binary() (email.policy.Compat32 method)
@anchor{library/email policy email policy Compat32 fold_binary}@anchor{3bb0}
@deffn {Method} fold_binary (name, value)

Headers are folded using the @ref{1ca1,,Header} folding
algorithm, which preserves existing line breaks in the value, and wraps
each resulting line to the @code{max_line_length}.  If @code{cte_type} is
@code{7bit}, non-ascii binary data is CTE encoded using the @code{unknown-8bit}
charset.  Otherwise the original source header is used, with its existing
line breaks and any (RFC invalid) binary data it may contain.
@end deffn
@end deffn

@geindex compat32 (in module email.policy)
@anchor{library/email policy email policy compat32}@anchor{e9d}
@deffn {Data} email.policy.compat32

An instance of @ref{12c0,,Compat32}, providing  backward compatibility with the
behavior of the email package in Python 3.2.

@cartouche
@quotation Note 
The @ref{e9d,,compat32} policy should not be used as a policy for
@ref{580,,EmailMessage} objects, and should only be used
to serialize messages that were created using the @code{compat32}
policy.
@end quotation
@end cartouche
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node email errors Exception and Defect classes,email headerregistry Custom Header Objects,email policy Policy Objects,email — An email and MIME handling package
@anchor{library/email errors doc}@anchor{3bb1}@anchor{library/email errors email-errors-exception-and-defect-classes}@anchor{3bb2}@anchor{library/email errors module-email errors}@anchor{43}@anchor{library/email errors translation-repo}@anchor{3bb3}
@subsubsection @code{email.errors}: Exception and Defect classes


@geindex module; email.errors

`Source code:' Lib/email/errors.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/email/errors.py}


__________________________________________________________________


The following exception classes are defined in the @code{email.errors} module:

@geindex MessageError
@anchor{library/email errors email errors MessageError}@anchor{3bb4}
@deffn {Exception} email.errors.MessageError

This is the base class for all exceptions that the @ref{3f,,email} package can
raise.  It is derived from the standard @ref{bd3,,Exception} class and defines no
additional methods.
@end deffn

@geindex MessageParseError
@anchor{library/email errors email errors MessageParseError}@anchor{3bb5}
@deffn {Exception} email.errors.MessageParseError

This is the base class for exceptions raised by the
@ref{13a9,,Parser} class.  It is derived from
@ref{3bb4,,MessageError}.  This class is also used internally by the parser used
by @ref{46,,headerregistry}.
@end deffn

@geindex HeaderParseError
@anchor{library/email errors email errors HeaderParseError}@anchor{3b5f}
@deffn {Exception} email.errors.HeaderParseError

Raised under some error conditions when parsing the 
@geindex RFC; RFC 5322
RFC 5322@footnote{https://datatracker.ietf.org/doc/html/rfc5322.html} headers of a
message, this class is derived from @ref{3bb5,,MessageParseError}.  The
@ref{3b5e,,set_boundary()} method will raise this
error if the content type is unknown when the method is called.
@ref{1ca1,,Header} may raise this error for certain base64
decoding errors, and when an attempt is made to create a header that appears
to contain an embedded header (that is, there is what is supposed to be a
continuation line that has no leading whitespace and looks like a header).
@end deffn

@geindex BoundaryError
@anchor{library/email errors email errors BoundaryError}@anchor{3bb6}
@deffn {Exception} email.errors.BoundaryError

Deprecated and no longer used.
@end deffn

@geindex MultipartConversionError
@anchor{library/email errors email errors MultipartConversionError}@anchor{3bb7}
@deffn {Exception} email.errors.MultipartConversionError

Raised if the @ref{3b70,,attach()} method is called
on an instance of a class derived from
@ref{3bb8,,MIMENonMultipart} (e.g.
@ref{3bb9,,MIMEImage}).
@code{MultipartConversionError} multiply
inherits from @ref{3bb4,,MessageError} and the built-in @ref{199,,TypeError}.
@end deffn

@geindex HeaderWriteError
@anchor{library/email errors email errors HeaderWriteError}@anchor{3b99}
@deffn {Exception} email.errors.HeaderWriteError

Raised when an error occurs when the @ref{44,,generator} outputs
headers.
@end deffn

@geindex MessageDefect
@anchor{library/email errors email errors MessageDefect}@anchor{3b9b}
@deffn {Exception} email.errors.MessageDefect

This is the base class for all defects found when parsing email messages.
It is derived from @ref{2ee,,ValueError}.
@end deffn

@geindex HeaderDefect
@anchor{library/email errors email errors HeaderDefect}@anchor{3bba}
@deffn {Exception} email.errors.HeaderDefect

This is the base class for all defects found when parsing email headers.
It is derived from @ref{3b9b,,MessageDefect}.
@end deffn

Here is the list of the defects that the @ref{17d6,,FeedParser}
can find while parsing messages.  Note that the defects are added to the message
where the problem was found, so for example, if a message nested inside a
@code{multipart/alternative} had a malformed header, that nested message
object would have a defect, but the containing messages would not.

All defect classes are subclassed from @ref{3b9b,,email.errors.MessageDefect}.

@geindex NoBoundaryInMultipartDefect
@anchor{library/email errors email errors NoBoundaryInMultipartDefect}@anchor{3bbb}
@deffn {Exception} email.errors.NoBoundaryInMultipartDefect

A message claimed to be a multipart, but had no @code{boundary}
parameter.
@end deffn

@geindex StartBoundaryNotFoundDefect
@anchor{library/email errors email errors StartBoundaryNotFoundDefect}@anchor{3bbc}
@deffn {Exception} email.errors.StartBoundaryNotFoundDefect

The start boundary claimed in the @code{Content-Type} header was
never found.
@end deffn

@geindex CloseBoundaryNotFoundDefect
@anchor{library/email errors email errors CloseBoundaryNotFoundDefect}@anchor{3bbd}
@deffn {Exception} email.errors.CloseBoundaryNotFoundDefect

A start boundary was found, but no corresponding close boundary was ever
found.


Added in version 3.3.

@end deffn

@geindex FirstHeaderLineIsContinuationDefect
@anchor{library/email errors email errors FirstHeaderLineIsContinuationDefect}@anchor{3bbe}
@deffn {Exception} email.errors.FirstHeaderLineIsContinuationDefect

The message had a continuation line as its first header line.
@end deffn

@geindex MisplacedEnvelopeHeaderDefect
@anchor{library/email errors email errors MisplacedEnvelopeHeaderDefect}@anchor{3bbf}
@deffn {Exception} email.errors.MisplacedEnvelopeHeaderDefect

A “Unix From” header was found in the middle of a header block.
@end deffn

@geindex MissingHeaderBodySeparatorDefect
@anchor{library/email errors email errors MissingHeaderBodySeparatorDefect}@anchor{3bc0}
@deffn {Exception} email.errors.MissingHeaderBodySeparatorDefect

A line was found while parsing headers that had no leading white space but
contained no ‘:’.  Parsing continues assuming that the line represents the
first line of the body.


Added in version 3.3.

@end deffn

@geindex MalformedHeaderDefect
@anchor{library/email errors email errors MalformedHeaderDefect}@anchor{3bc1}
@deffn {Exception} email.errors.MalformedHeaderDefect

A header was found that was missing a colon, or was otherwise malformed.


Deprecated since version 3.3: This defect has not been used for several Python versions.

@end deffn

@geindex MultipartInvariantViolationDefect
@anchor{library/email errors email errors MultipartInvariantViolationDefect}@anchor{3b86}
@deffn {Exception} email.errors.MultipartInvariantViolationDefect

A message claimed to be a @code{multipart}, but no subparts were found.
Note that when a message has this defect, its
@ref{3b63,,is_multipart()} method may return @code{False}
even though its content type claims to be @code{multipart}.
@end deffn

@geindex InvalidBase64PaddingDefect
@anchor{library/email errors email errors InvalidBase64PaddingDefect}@anchor{3bc2}
@deffn {Exception} email.errors.InvalidBase64PaddingDefect

When decoding a block of base64 encoded bytes, the padding was not correct.
Enough padding is added to perform the decode, but the resulting decoded
bytes may be invalid.
@end deffn

@geindex InvalidBase64CharactersDefect
@anchor{library/email errors email errors InvalidBase64CharactersDefect}@anchor{3bc3}
@deffn {Exception} email.errors.InvalidBase64CharactersDefect

When decoding a block of base64 encoded bytes, characters outside the base64
alphabet were encountered.  The characters are ignored, but the resulting
decoded bytes may be invalid.
@end deffn

@geindex InvalidBase64LengthDefect
@anchor{library/email errors email errors InvalidBase64LengthDefect}@anchor{3bc4}
@deffn {Exception} email.errors.InvalidBase64LengthDefect

When decoding a block of base64 encoded bytes, the number of non-padding
base64 characters was invalid (1 more than a multiple of 4).  The encoded
block was kept as-is.
@end deffn

@geindex InvalidDateDefect
@anchor{library/email errors email errors InvalidDateDefect}@anchor{3bc5}
@deffn {Exception} email.errors.InvalidDateDefect

When decoding an invalid or unparsable date field.  The original value is
kept as-is.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node email headerregistry Custom Header Objects,email contentmanager Managing MIME Content,email errors Exception and Defect classes,email — An email and MIME handling package
@anchor{library/email headerregistry doc}@anchor{3bc6}@anchor{library/email headerregistry email-headerregistry-custom-header-objects}@anchor{3bc7}@anchor{library/email headerregistry module-email headerregistry}@anchor{46}@anchor{library/email headerregistry translation-repo}@anchor{3bc8}
@subsubsection @code{email.headerregistry}: Custom Header Objects


@geindex module; email.headerregistry

`Source code:' Lib/email/headerregistry.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/email/headerregistry.py}


__________________________________________________________________



Added in version 3.6: @footnote{
Originally added in 3.3 as a @ref{1248,,provisional module}
}


Headers are represented by customized subclasses of @ref{16a,,str}.  The
particular class used to represent a given header is determined by the
@ref{3ba1,,header_factory} of the @ref{53,,policy} in
effect when the headers are created.  This section documents the particular
@code{header_factory} implemented by the email package for handling 
@geindex RFC; RFC 5322
RFC 5322@footnote{https://datatracker.ietf.org/doc/html/rfc5322.html}
compliant email messages, which not only provides customized header objects for
various header types, but also provides an extension mechanism for applications
to add their own custom header types.

When using any of the policy objects derived from
@ref{12c3,,EmailPolicy}, all headers are produced by
@ref{3bc9,,HeaderRegistry} and have @ref{3b4b,,BaseHeader} as their last base
class.  Each header class has an additional base class that is determined by
the type of the header.  For example, many headers have the class
@ref{3bca,,UnstructuredHeader} as their other base class.  The specialized second
class for a header is determined by the name of the header, using a lookup
table stored in the @code{HeaderRegistry}.  All of this is managed
transparently for the typical application program, but interfaces are provided
for modifying the default behavior for use by more complex applications.

The sections below first document the header base classes and their attributes,
followed by the API for modifying the behavior of @ref{3bc9,,HeaderRegistry}, and
finally the support classes used to represent the data parsed from structured
headers.

@geindex BaseHeader (class in email.headerregistry)
@anchor{library/email headerregistry email headerregistry BaseHeader}@anchor{3b4b}
@deffn {Class} email.headerregistry.BaseHeader (name, value)

`name' and `value' are passed to @code{BaseHeader} from the
@ref{3ba1,,header_factory} call.  The string value of
any header object is the `value' fully decoded to unicode.

This base class defines the following read-only properties:

@geindex name (email.headerregistry.BaseHeader attribute)
@anchor{library/email headerregistry email headerregistry BaseHeader name}@anchor{3bcb}
@deffn {Attribute} name

The name of the header (the portion of the field before the ‘:’).  This
is exactly the value passed in the
@ref{3ba1,,header_factory} call for `name'; that
is, case is preserved.
@end deffn

@geindex defects (email.headerregistry.BaseHeader attribute)
@anchor{library/email headerregistry email headerregistry BaseHeader defects}@anchor{3bcc}
@deffn {Attribute} defects

A tuple of @ref{3bba,,HeaderDefect} instances reporting any
RFC compliance problems found during parsing.  The email package tries to
be complete about detecting compliance issues.  See the @ref{43,,errors}
module for a discussion of the types of defects that may be reported.
@end deffn

@geindex max_count (email.headerregistry.BaseHeader attribute)
@anchor{library/email headerregistry email headerregistry BaseHeader max_count}@anchor{3ba4}
@deffn {Attribute} max_count

The maximum number of headers of this type that can have the same
@code{name}.  A value of @code{None} means unlimited.  The @code{BaseHeader} value
for this attribute is @code{None}; it is expected that specialized header
classes will override this value as needed.
@end deffn

@code{BaseHeader} also provides the following method, which is called by the
email library code and should not in general be called by application
programs:

@geindex fold() (email.headerregistry.BaseHeader method)
@anchor{library/email headerregistry email headerregistry BaseHeader fold}@anchor{3bcd}
@deffn {Method} fold (*, policy)

Return a string containing @ref{3b95,,linesep}
characters as required to correctly fold the header according to
`policy'.  A @ref{3b8d,,cte_type} of @code{8bit} will be
treated as if it were @code{7bit}, since headers may not contain arbitrary
binary data.  If @ref{fff,,utf8} is @code{False},
non-ASCII data will be 
@geindex RFC; RFC 2047
RFC 2047@footnote{https://datatracker.ietf.org/doc/html/rfc2047.html} encoded.
@end deffn

@code{BaseHeader} by itself cannot be used to create a header object.  It
defines a protocol that each specialized header cooperates with in order to
produce the header object.  Specifically, @code{BaseHeader} requires that
the specialized class provide a @ref{48f,,classmethod()} named @code{parse}.  This
method is called as follows:

@example
parse(string, kwds)
@end example

@code{kwds} is a dictionary containing one pre-initialized key, @code{defects}.
@code{defects} is an empty list.  The parse method should append any detected
defects to this list.  On return, the @code{kwds} dictionary `must' contain
values for at least the keys @code{decoded}, @code{defects} and @code{parse_tree}.
@code{decoded} should be the string value for the header (that is, the header
value fully decoded to unicode). @code{parse_tree} is set to the parse tree obtained
from parsing the header. The parse method should assume that `string' may
contain content-transfer-encoded parts, but should correctly handle all valid
unicode characters as well so that it can parse un-encoded header values.

@code{BaseHeader}’s @code{__new__} then creates the header instance, and calls its
@code{init} method.  The specialized class only needs to provide an @code{init}
method if it wishes to set additional attributes beyond those provided by
@code{BaseHeader} itself.  Such an @code{init} method should look like this:

@example
def init(self, /, *args, **kw):
    self._myattr = kw.pop('myattr')
    super().init(*args, **kw)
@end example

That is, anything extra that the specialized class puts in to the @code{kwds}
dictionary should be removed and handled, and the remaining contents of
@code{kw} (and @code{args}) passed to the @code{BaseHeader} @code{init} method.
@end deffn

@geindex UnstructuredHeader (class in email.headerregistry)
@anchor{library/email headerregistry email headerregistry UnstructuredHeader}@anchor{3bca}
@deffn {Class} email.headerregistry.UnstructuredHeader

An “unstructured” header is the default type of header in 
@geindex RFC; RFC 5322
RFC 5322@footnote{https://datatracker.ietf.org/doc/html/rfc5322.html}.
Any header that does not have a specified syntax is treated as
unstructured.  The classic example of an unstructured header is the
@code{Subject} header.

In 
@geindex RFC; RFC 5322
RFC 5322@footnote{https://datatracker.ietf.org/doc/html/rfc5322.html}, an unstructured header is a run of arbitrary text in the
ASCII character set.  
@geindex RFC; RFC 2047
RFC 2047@footnote{https://datatracker.ietf.org/doc/html/rfc2047.html}, however, has an 
@geindex RFC; RFC 5322
RFC 5322@footnote{https://datatracker.ietf.org/doc/html/rfc5322.html} compatible
mechanism for encoding non-ASCII text as ASCII characters within a header
value.  When a `value' containing encoded words is passed to the
constructor, the @code{UnstructuredHeader} parser converts such encoded words
into unicode, following the 
@geindex RFC; RFC 2047
RFC 2047@footnote{https://datatracker.ietf.org/doc/html/rfc2047.html} rules for unstructured text.  The
parser uses heuristics to attempt to decode certain non-compliant encoded
words.  Defects are registered in such cases, as well as defects for issues
such as invalid characters within the encoded words or the non-encoded text.

This header type provides no additional attributes.
@end deffn

@geindex DateHeader (class in email.headerregistry)
@anchor{library/email headerregistry email headerregistry DateHeader}@anchor{3bce}
@deffn {Class} email.headerregistry.DateHeader

@geindex RFC; RFC 5322
RFC 5322@footnote{https://datatracker.ietf.org/doc/html/rfc5322.html} specifies a very specific format for dates within email headers.
The @code{DateHeader} parser recognizes that date format, as well as
recognizing a number of variant forms that are sometimes found “in the
wild”.

This header type provides the following additional attributes:

@geindex datetime (email.headerregistry.DateHeader attribute)
@anchor{library/email headerregistry email headerregistry DateHeader datetime}@anchor{3bcf}
@deffn {Attribute} datetime

If the header value can be recognized as a valid date of one form or
another, this attribute will contain a @ref{4e3,,datetime}
instance representing that date.  If the timezone of the input date is
specified as @code{-0000} (indicating it is in UTC but contains no
information about the source timezone), then @ref{3bcf,,datetime} will be a
naive @code{datetime}.  If a specific timezone offset is
found (including @code{+0000}), then @code{datetime} will contain an aware
@code{datetime} that uses @ref{12cb,,datetime.timezone} to record the timezone
offset.
@end deffn

The @code{decoded} value of the header is determined by formatting the
@code{datetime} according to the 
@geindex RFC; RFC 5322
RFC 5322@footnote{https://datatracker.ietf.org/doc/html/rfc5322.html} rules; that is, it is set to:

@example
email.utils.format_datetime(self.datetime)
@end example

When creating a @code{DateHeader}, `value' may be
@ref{4e3,,datetime} instance.  This means, for example, that
the following code is valid and does what one would expect:

@example
msg['Date'] = datetime(2011, 7, 15, 21)
@end example

Because this is a naive @code{datetime} it will be interpreted as a UTC
timestamp, and the resulting value will have a timezone of @code{-0000}.  Much
more useful is to use the @ref{2f9,,localtime()} function from the
@ref{54,,utils} module:

@example
msg['Date'] = utils.localtime()
@end example

This example sets the date header to the current time and date using
the current timezone offset.
@end deffn

@geindex AddressHeader (class in email.headerregistry)
@anchor{library/email headerregistry email headerregistry AddressHeader}@anchor{3bd0}
@deffn {Class} email.headerregistry.AddressHeader

Address headers are one of the most complex structured header types.
The @code{AddressHeader} class provides a generic interface to any address
header.

This header type provides the following additional attributes:

@geindex groups (email.headerregistry.AddressHeader attribute)
@anchor{library/email headerregistry email headerregistry AddressHeader groups}@anchor{3bd1}
@deffn {Attribute} groups

A tuple of @ref{3bd2,,Group} objects encoding the
addresses and groups found in the header value.  Addresses that are
not part of a group are represented in this list as single-address
@code{Groups} whose @ref{3bd3,,display_name} is @code{None}.
@end deffn

@geindex addresses (email.headerregistry.AddressHeader attribute)
@anchor{library/email headerregistry email headerregistry AddressHeader addresses}@anchor{3bd4}
@deffn {Attribute} addresses

A tuple of @ref{3bd5,,Address} objects encoding all
of the individual addresses from the header value.  If the header value
contains any groups, the individual addresses from the group are included
in the list at the point where the group occurs in the value (that is,
the list of addresses is “flattened” into a one dimensional list).
@end deffn

The @code{decoded} value of the header will have all encoded words decoded to
unicode.  @ref{56,,idna} encoded domain names are also decoded to
unicode.  The @code{decoded} value is set by @ref{2698,,joining} the
@ref{16a,,str} value of the elements of the @code{groups} attribute with @code{',
'}.

A list of @ref{3bd5,,Address} and @ref{3bd2,,Group} objects in any combination
may be used to set the value of an address header.  @code{Group} objects whose
@code{display_name} is @code{None} will be interpreted as single addresses, which
allows an address list to be copied with groups intact by using the list
obtained from the @code{groups} attribute of the source header.
@end deffn

@geindex SingleAddressHeader (class in email.headerregistry)
@anchor{library/email headerregistry email headerregistry SingleAddressHeader}@anchor{3bd6}
@deffn {Class} email.headerregistry.SingleAddressHeader

A subclass of @ref{3bd0,,AddressHeader} that adds one
additional attribute:

@geindex address (email.headerregistry.SingleAddressHeader attribute)
@anchor{library/email headerregistry email headerregistry SingleAddressHeader address}@anchor{3bd7}
@deffn {Attribute} address

The single address encoded by the header value.  If the header value
actually contains more than one address (which would be a violation of
the RFC under the default @ref{53,,policy}), accessing this attribute
will result in a @ref{2ee,,ValueError}.
@end deffn
@end deffn

Many of the above classes also have a @code{Unique} variant (for example,
@code{UniqueUnstructuredHeader}).  The only difference is that in the @code{Unique}
variant, @ref{3ba4,,max_count} is set to 1.

@geindex MIMEVersionHeader (class in email.headerregistry)
@anchor{library/email headerregistry email headerregistry MIMEVersionHeader}@anchor{3bd8}
@deffn {Class} email.headerregistry.MIMEVersionHeader

There is really only one valid value for the @code{MIME-Version}
header, and that is @code{1.0}.  For future proofing, this header class
supports other valid version numbers.  If a version number has a valid value
per 
@geindex RFC; RFC 2045
RFC 2045@footnote{https://datatracker.ietf.org/doc/html/rfc2045.html}, then the header object will have non-@code{None} values for
the following attributes:

@geindex version (email.headerregistry.MIMEVersionHeader attribute)
@anchor{library/email headerregistry email headerregistry MIMEVersionHeader version}@anchor{3bd9}
@deffn {Attribute} version

The version number as a string, with any whitespace and/or comments
removed.
@end deffn

@geindex major (email.headerregistry.MIMEVersionHeader attribute)
@anchor{library/email headerregistry email headerregistry MIMEVersionHeader major}@anchor{3bda}
@deffn {Attribute} major

The major version number as an integer
@end deffn

@geindex minor (email.headerregistry.MIMEVersionHeader attribute)
@anchor{library/email headerregistry email headerregistry MIMEVersionHeader minor}@anchor{3bdb}
@deffn {Attribute} minor

The minor version number as an integer
@end deffn
@end deffn

@geindex ParameterizedMIMEHeader (class in email.headerregistry)
@anchor{library/email headerregistry email headerregistry ParameterizedMIMEHeader}@anchor{3bdc}
@deffn {Class} email.headerregistry.ParameterizedMIMEHeader

MIME headers all start with the prefix ‘Content-’.  Each specific header has
a certain value, described under the class for that header.  Some can
also take a list of supplemental parameters, which have a common format.
This class serves as a base for all the MIME headers that take parameters.

@geindex params (email.headerregistry.ParameterizedMIMEHeader attribute)
@anchor{library/email headerregistry email headerregistry ParameterizedMIMEHeader params}@anchor{3b59}
@deffn {Attribute} params

A dictionary mapping parameter names to parameter values.
@end deffn
@end deffn

@geindex ContentTypeHeader (class in email.headerregistry)
@anchor{library/email headerregistry email headerregistry ContentTypeHeader}@anchor{3bdd}
@deffn {Class} email.headerregistry.ContentTypeHeader

A @ref{3bdc,,ParameterizedMIMEHeader} class that handles the
@code{Content-Type} header.

@geindex content_type (email.headerregistry.ContentTypeHeader attribute)
@anchor{library/email headerregistry email headerregistry ContentTypeHeader content_type}@anchor{3bde}
@deffn {Attribute} content_type

The content type string, in the form @code{maintype/subtype}.
@end deffn

@geindex maintype (email.headerregistry.ContentTypeHeader attribute)
@anchor{library/email headerregistry email headerregistry ContentTypeHeader maintype}@anchor{3bdf}
@deffn {Attribute} maintype
@end deffn

@geindex subtype (email.headerregistry.ContentTypeHeader attribute)
@anchor{library/email headerregistry email headerregistry ContentTypeHeader subtype}@anchor{3be0}
@deffn {Attribute} subtype
@end deffn
@end deffn

@geindex ContentDispositionHeader (class in email.headerregistry)
@anchor{library/email headerregistry email headerregistry ContentDispositionHeader}@anchor{3be1}
@deffn {Class} email.headerregistry.ContentDispositionHeader

A @ref{3bdc,,ParameterizedMIMEHeader} class that handles the
@code{Content-Disposition} header.

@geindex content_disposition (email.headerregistry.ContentDispositionHeader attribute)
@anchor{library/email headerregistry email headerregistry ContentDispositionHeader content_disposition}@anchor{3be2}
@deffn {Attribute} content_disposition

@code{inline} and @code{attachment} are the only valid values in common use.
@end deffn
@end deffn

@geindex ContentTransferEncodingHeader (class in email.headerregistry)
@anchor{library/email headerregistry email headerregistry ContentTransferEncodingHeader}@anchor{3be3}
@deffn {Class} email.headerregistry.ContentTransferEncodingHeader

Handles the @code{Content-Transfer-Encoding} header.

@geindex cte (email.headerregistry.ContentTransferEncodingHeader attribute)
@anchor{library/email headerregistry email headerregistry ContentTransferEncodingHeader cte}@anchor{3be4}
@deffn {Attribute} cte

Valid values are @code{7bit}, @code{8bit}, @code{base64}, and
@code{quoted-printable}.  See 
@geindex RFC; RFC 2045
RFC 2045@footnote{https://datatracker.ietf.org/doc/html/rfc2045.html} for more information.
@end deffn
@end deffn

@geindex HeaderRegistry (class in email.headerregistry)
@anchor{library/email headerregistry email headerregistry HeaderRegistry}@anchor{3bc9}
@deffn {Class} email.headerregistry.HeaderRegistry (base_class=BaseHeader, default_class=UnstructuredHeader, use_default_map=True)

This is the factory used by @ref{12c3,,EmailPolicy} by default.
@code{HeaderRegistry} builds the class used to create a header instance
dynamically, using `base_class' and a specialized class retrieved from a
registry that it holds.  When a given header name does not appear in the
registry, the class specified by `default_class' is used as the specialized
class.  When `use_default_map' is @code{True} (the default), the standard
mapping of header names to classes is copied in to the registry during
initialization.  `base_class' is always the last class in the generated
class’s @ref{16b8,,__bases__} list.

The default mappings are:

@quotation

@*subject: 
UniqueUnstructuredHeader


@*date: 
UniqueDateHeader


@*resent-date: 
DateHeader


@*orig-date: 
UniqueDateHeader


@*sender: 
UniqueSingleAddressHeader


@*resent-sender: 
SingleAddressHeader


@*to: 
UniqueAddressHeader


@*resent-to: 
AddressHeader


@*cc: 
UniqueAddressHeader


@*resent-cc: 
AddressHeader


@*bcc: 
UniqueAddressHeader


@*resent-bcc: 
AddressHeader


@*from: 
UniqueAddressHeader


@*resent-from: 
AddressHeader


@*reply-to: 
UniqueAddressHeader


@*mime-version: 
MIMEVersionHeader


@*content-type: 
ContentTypeHeader


@*content-disposition: 
ContentDispositionHeader


@*content-transfer-encoding: 
ContentTransferEncodingHeader


@*message-id: 
MessageIDHeader

@end quotation

@code{HeaderRegistry} has the following methods:

@geindex map_to_type() (email.headerregistry.HeaderRegistry method)
@anchor{library/email headerregistry email headerregistry HeaderRegistry map_to_type}@anchor{3be5}
@deffn {Method} map_to_type (self, name, cls)

`name' is the name of the header to be mapped.  It will be converted to
lower case in the registry.  `cls' is the specialized class to be used,
along with `base_class', to create the class used to instantiate headers
that match `name'.
@end deffn

@geindex __getitem__() (email.headerregistry.HeaderRegistry method)
@anchor{library/email headerregistry email headerregistry HeaderRegistry __getitem__}@anchor{3be6}
@deffn {Method} __getitem__ (name)

Construct and return a class to handle creating a `name' header.
@end deffn

@geindex __call__() (email.headerregistry.HeaderRegistry method)
@anchor{library/email headerregistry email headerregistry HeaderRegistry __call__}@anchor{3be7}
@deffn {Method} __call__ (name, value)

Retrieves the specialized header associated with `name' from the
registry (using `default_class' if `name' does not appear in the
registry) and composes it with `base_class' to produce a class,
calls the constructed class’s constructor, passing it the same
argument list, and finally returns the class instance created thereby.
@end deffn
@end deffn

The following classes are the classes used to represent data parsed from
structured headers and can, in general, be used by an application program to
construct structured values to assign to specific headers.

@geindex Address (class in email.headerregistry)
@anchor{library/email headerregistry email headerregistry Address}@anchor{3bd5}
@deffn {Class} email.headerregistry.Address (display_name='@w{'}, username='@w{'}, domain='@w{'}, addr_spec=None)

The class used to represent an email address.  The general form of an
address is:

@example
[display_name] <username@@domain>
@end example

or:

@example
username@@domain
@end example

where each part must conform to specific syntax rules spelled out in
@geindex RFC; RFC 5322
RFC 5322@footnote{https://datatracker.ietf.org/doc/html/rfc5322.html}.

As a convenience `addr_spec' can be specified instead of `username' and
`domain', in which case `username' and `domain' will be parsed from the
`addr_spec'.  An `addr_spec' must be a properly RFC quoted string; if it is
not @code{Address} will raise an error.  Unicode characters are allowed and
will be property encoded when serialized.  However, per the RFCs, unicode is
`not' allowed in the username portion of the address.

@geindex display_name (email.headerregistry.Address attribute)
@anchor{library/email headerregistry email headerregistry Address display_name}@anchor{3be8}
@deffn {Attribute} display_name

The display name portion of the address, if any, with all quoting
removed.  If the address does not have a display name, this attribute
will be an empty string.
@end deffn

@geindex username (email.headerregistry.Address attribute)
@anchor{library/email headerregistry email headerregistry Address username}@anchor{3be9}
@deffn {Attribute} username

The @code{username} portion of the address, with all quoting removed.
@end deffn

@geindex domain (email.headerregistry.Address attribute)
@anchor{library/email headerregistry email headerregistry Address domain}@anchor{3bea}
@deffn {Attribute} domain

The @code{domain} portion of the address.
@end deffn

@geindex addr_spec (email.headerregistry.Address attribute)
@anchor{library/email headerregistry email headerregistry Address addr_spec}@anchor{3beb}
@deffn {Attribute} addr_spec

The @code{username@@domain} portion of the address, correctly quoted
for use as a bare address (the second form shown above).  This
attribute is not mutable.
@end deffn

@geindex __str__() (email.headerregistry.Address method)
@anchor{library/email headerregistry email headerregistry Address __str__}@anchor{3bec}
@deffn {Method} __str__ ()

The @code{str} value of the object is the address quoted according to
@geindex RFC; RFC 5322
RFC 5322@footnote{https://datatracker.ietf.org/doc/html/rfc5322.html} rules, but with no Content Transfer Encoding of any non-ASCII
characters.
@end deffn

To support SMTP (
@geindex RFC; RFC 5321
RFC 5321@footnote{https://datatracker.ietf.org/doc/html/rfc5321.html}), @code{Address} handles one special case: if
@code{username} and @code{domain} are both the empty string (or @code{None}), then
the string value of the @code{Address} is @code{<>}.
@end deffn

@geindex Group (class in email.headerregistry)
@anchor{library/email headerregistry email headerregistry Group}@anchor{3bd2}
@deffn {Class} email.headerregistry.Group (display_name=None, addresses=None)

The class used to represent an address group.  The general form of an
address group is:

@example
display_name: [address-list];
@end example

As a convenience for processing lists of addresses that consist of a mixture
of groups and single addresses, a @code{Group} may also be used to represent
single addresses that are not part of a group by setting `display_name' to
@code{None} and providing a list of the single address as `addresses'.

@geindex display_name (email.headerregistry.Group attribute)
@anchor{library/email headerregistry email headerregistry Group display_name}@anchor{3bd3}
@deffn {Attribute} display_name

The @code{display_name} of the group.  If it is @code{None} and there is
exactly one @code{Address} in @code{addresses}, then the @code{Group} represents a
single address that is not in a group.
@end deffn

@geindex addresses (email.headerregistry.Group attribute)
@anchor{library/email headerregistry email headerregistry Group addresses}@anchor{3bed}
@deffn {Attribute} addresses

A possibly empty tuple of @ref{3bd5,,Address} objects representing the
addresses in the group.
@end deffn

@geindex __str__() (email.headerregistry.Group method)
@anchor{library/email headerregistry email headerregistry Group __str__}@anchor{3bee}
@deffn {Method} __str__ ()

The @code{str} value of a @code{Group} is formatted according to 
@geindex RFC; RFC 5322
RFC 5322@footnote{https://datatracker.ietf.org/doc/html/rfc5322.html},
but with no Content Transfer Encoding of any non-ASCII characters.  If
@code{display_name} is none and there is a single @code{Address} in the
@code{addresses} list, the @code{str} value will be the same as the @code{str} of
that single @code{Address}.
@end deffn
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node email contentmanager Managing MIME Content,email Examples,email headerregistry Custom Header Objects,email — An email and MIME handling package
@anchor{library/email contentmanager doc}@anchor{3bef}@anchor{library/email contentmanager email-contentmanager-managing-mime-content}@anchor{3bf0}@anchor{library/email contentmanager module-email contentmanager}@anchor{41}@anchor{library/email contentmanager translation-repo}@anchor{3bf1}
@subsubsection @code{email.contentmanager}: Managing MIME Content


@geindex module; email.contentmanager

`Source code:' Lib/email/contentmanager.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/email/contentmanager.py}


__________________________________________________________________



Added in version 3.6: @footnote{
Originally added in 3.4 as a @ref{1248,,provisional module}
}


@geindex ContentManager (class in email.contentmanager)
@anchor{library/email contentmanager email contentmanager ContentManager}@anchor{3bf2}
@deffn {Class} email.contentmanager.ContentManager

Base class for content managers.  Provides the standard registry mechanisms
to register converters between MIME content and other representations, as
well as the @code{get_content} and @code{set_content} dispatch methods.

@geindex get_content() (email.contentmanager.ContentManager method)
@anchor{library/email contentmanager email contentmanager ContentManager get_content}@anchor{3b6a}
@deffn {Method} get_content (msg, *args, **kw)

Look up a handler function based on the @code{mimetype} of `msg' (see next
paragraph), call it, passing through all arguments, and return the result
of the call.  The expectation is that the handler will extract the
payload from `msg' and return an object that encodes information about
the extracted data.

To find the handler, look for the following keys in the registry,
stopping with the first one found:


@itemize *

@item 
the string representing the full MIME type (@code{maintype/subtype})

@item 
the string representing the @code{maintype}

@item 
the empty string
@end itemize

If none of these keys produce a handler, raise a @ref{5e7,,KeyError} for the
full MIME type.
@end deffn

@geindex set_content() (email.contentmanager.ContentManager method)
@anchor{library/email contentmanager email contentmanager ContentManager set_content}@anchor{3b6b}
@deffn {Method} set_content (msg, obj, *args, **kw)

If the @code{maintype} is @code{multipart}, raise a @ref{199,,TypeError}; otherwise
look up a handler function based on the type of `obj' (see next
paragraph), call @ref{3b74,,clear_content()} on the
`msg', and call the handler function, passing through all arguments.  The
expectation is that the handler will transform and store `obj' into
`msg', possibly making other changes to `msg' as well, such as adding
various MIME headers to encode information needed to interpret the stored
data.

To find the handler, obtain the type of `obj' (@code{typ = type(obj)}), and
look for the following keys in the registry, stopping with the first one
found:


@itemize *

@item 
the type itself (@code{typ})

@item 
the type’s fully qualified name (@code{typ.__module__ + '.' +
typ.__qualname__}).

@item 
the type’s @ref{23b7,,qualname} (@code{typ.__qualname__})

@item 
the type’s @ref{16b7,,name} (@code{typ.__name__}).
@end itemize

If none of the above match, repeat all of the checks above for each of
the types in the @ref{1923,,MRO} (@ref{23bb,,typ.__mro__}).
Finally, if no other key
yields a handler, check for a handler for the key @code{None}.  If there is
no handler for @code{None}, raise a @ref{5e7,,KeyError} for the fully
qualified name of the type.

Also add a @code{MIME-Version} header if one is not present (see
also @ref{1140,,MIMEPart}).
@end deffn

@geindex add_get_handler() (email.contentmanager.ContentManager method)
@anchor{library/email contentmanager email contentmanager ContentManager add_get_handler}@anchor{3bf3}
@deffn {Method} add_get_handler (key, handler)

Record the function `handler' as the handler for `key'.  For the possible
values of `key', see @ref{3bf4,,get_content()}.
@end deffn

@geindex add_set_handler() (email.contentmanager.ContentManager method)
@anchor{library/email contentmanager email contentmanager ContentManager add_set_handler}@anchor{3bf5}
@deffn {Method} add_set_handler (typekey, handler)

Record `handler' as the function to call when an object of a type
matching `typekey' is passed to @ref{3bf6,,set_content()}.  For the possible
values of `typekey', see @code{set_content()}.
@end deffn
@end deffn

@menu
* Content Manager Instances:: 

@end menu

@node Content Manager Instances,,,email contentmanager Managing MIME Content
@anchor{library/email contentmanager content-manager-instances}@anchor{3bf7}
@subsubsection Content Manager Instances


Currently the email package provides only one concrete content manager,
@ref{3ba2,,raw_data_manager}, although more may be added in the future.
@code{raw_data_manager} is the
@ref{1141,,content_manager} provided by
@ref{12c3,,EmailPolicy} and its derivatives.

@geindex raw_data_manager (in module email.contentmanager)
@anchor{library/email contentmanager email contentmanager raw_data_manager}@anchor{3ba2}
@deffn {Data} email.contentmanager.raw_data_manager

This content manager provides only a minimum interface beyond that provided
by @ref{581,,Message} itself:  it deals only with text, raw
byte strings, and @code{Message} objects.  Nevertheless, it
provides significant advantages compared to the base API: @code{get_content} on
a text part will return a unicode string without the application needing to
manually decode it, @code{set_content} provides a rich set of options for
controlling the headers added to a part and controlling the content transfer
encoding, and it enables the use of the various @code{add_} methods, thereby
simplifying the creation of multipart messages.

@geindex get_content() (in module email.contentmanager)
@anchor{library/email contentmanager email contentmanager get_content}@anchor{3bf4}
@deffn {Method} email.contentmanager.get_content (msg, errors='replace')

Return the payload of the part as either a string (for @code{text} parts), an
@ref{580,,EmailMessage} object (for @code{message/rfc822}
parts), or a @code{bytes} object (for all other non-multipart types).  Raise
a @ref{5e7,,KeyError} if called on a @code{multipart}.  If the part is a
@code{text} part and `errors' is specified, use it as the error handler when
decoding the payload to unicode.  The default error handler is
@code{replace}.
@end deffn

@geindex set_content() (in module email.contentmanager)
@anchor{library/email contentmanager email contentmanager set_content}@anchor{3bf6}
@deffn {Method} email.contentmanager.set_content (msg, <'str'>, subtype="plain", charset='utf-8', cte=None, disposition=None, filename=None, cid=None, params=None, headers=None)

@deffnx {Method} email.contentmanager.set_content (msg, <'bytes'>, maintype, subtype, cte="base64", disposition=None, filename=None, cid=None, params=None, headers=None)

@deffnx {Method} email.contentmanager.set_content (msg, <'EmailMessage'>, cte=None, disposition=None, filename=None, cid=None, params=None, headers=None)

Add headers and payload to `msg':

Add a @code{Content-Type} header with a @code{maintype/subtype}
value.


@itemize *

@item 
For @code{str}, set the MIME @code{maintype} to @code{text}, and set the
subtype to `subtype' if it is specified, or @code{plain} if it is not.

@item 
For @code{bytes}, use the specified `maintype' and `subtype', or
raise a @ref{199,,TypeError} if they are not specified.

@item 
For @ref{580,,EmailMessage} objects, set the maintype
to @code{message}, and set the subtype to `subtype' if it is
specified or @code{rfc822} if it is not.  If `subtype' is
@code{partial}, raise an error (@code{bytes} objects must be used to
construct @code{message/partial} parts).
@end itemize

If `charset' is provided (which is valid only for @code{str}), encode the
string to bytes using the specified character set.  The default is
@code{utf-8}.  If the specified `charset' is a known alias for a standard
MIME charset name, use the standard charset instead.

If `cte' is set, encode the payload using the specified content transfer
encoding, and set the @code{Content-Transfer-Encoding} header to
that value.  Possible values for `cte' are @code{quoted-printable},
@code{base64}, @code{7bit}, @code{8bit}, and @code{binary}.  If the input cannot be
encoded in the specified encoding (for example, specifying a `cte' of
@code{7bit} for an input that contains non-ASCII values), raise a
@ref{2ee,,ValueError}.


@itemize *

@item 
For @code{str} objects, if `cte' is not set use heuristics to
determine the most compact encoding.  Prior to encoding,
@ref{1462,,str.splitlines()} is used to normalize all line boundaries,
ensuring that each line of the payload is terminated by the
current policy’s @ref{3b95,,linesep} property
(even if the original string did not end with one).

@item 
For @code{bytes} objects, `cte' is taken to be base64 if not set,
and the aforementioned newline translation is not performed.

@item 
For @ref{580,,EmailMessage}, per 
@geindex RFC; RFC 2046
RFC 2046@footnote{https://datatracker.ietf.org/doc/html/rfc2046.html}, raise
an error if a `cte' of @code{quoted-printable} or @code{base64} is
requested for `subtype' @code{rfc822}, and for any `cte' other than
@code{7bit} for `subtype' @code{external-body}.  For
@code{message/rfc822}, use @code{8bit} if `cte' is not specified.  For
all other values of `subtype', use @code{7bit}.
@end itemize

@cartouche
@quotation Note 
A `cte' of @code{binary} does not actually work correctly yet.
The @code{EmailMessage} object as modified by @code{set_content} is
correct, but @ref{13db,,BytesGenerator} does not
serialize it correctly.
@end quotation
@end cartouche

If `disposition' is set, use it as the value of the
@code{Content-Disposition} header.  If not specified, and
`filename' is specified, add the header with the value @code{attachment}.
If `disposition' is not specified and `filename' is also not specified,
do not add the header.  The only valid values for `disposition' are
@code{attachment} and @code{inline}.

If `filename' is specified, use it as the value of the @code{filename}
parameter of the @code{Content-Disposition} header.

If `cid' is specified, add a @code{Content-ID} header with
`cid' as its value.

If `params' is specified, iterate its @code{items} method and use the
resulting @code{(key, value)} pairs to set additional parameters on the
@code{Content-Type} header.

If `headers' is specified and is a list of strings of the form
@code{headername: headervalue} or a list of @code{header} objects
(distinguished from strings by having a @code{name} attribute), add the
headers to `msg'.
@end deffn
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node email Examples,email message Message Representing an email message using the compat32 API,email contentmanager Managing MIME Content,email — An email and MIME handling package
@anchor{library/email examples doc}@anchor{3bf8}@anchor{library/email examples email-examples}@anchor{1142}@anchor{library/email examples id1}@anchor{3bf9}@anchor{library/email examples translation-repo}@anchor{3bfa}
@subsubsection @code{email}: Examples


Here are a few examples of how to use the @ref{3f,,email} package to read, write,
and send simple email messages, as well as more complex MIME messages.

First, let’s see how to create and send a simple text message (both the
text content and the addresses may contain unicode characters):

@example
# Import smtplib for the actual sending function
import smtplib

# Import the email modules we'll need
from email.message import EmailMessage

# Open the plain text file whose name is in textfile for reading.
with open(textfile) as fp:
    # Create a text/plain message
    msg = EmailMessage()
    msg.set_content(fp.read())

# me == the sender's email address
# you == the recipient's email address
msg['Subject'] = f'The contents of @{textfile@}'
msg['From'] = me
msg['To'] = you

# Send the message via our own SMTP server.
s = smtplib.SMTP('localhost')
s.send_message(msg)
s.quit()
@end example

Parsing 
@geindex RFC; RFC 822
RFC 822@footnote{https://datatracker.ietf.org/doc/html/rfc822.html} headers can easily be done by the using the classes
from the @ref{52,,parser} module:

@example
# Import the email modules we'll need
#from email.parser import BytesParser
from email.parser import Parser
from email.policy import default

# If the e-mail headers are in a file, uncomment these two lines:
# with open(messagefile, 'rb') as fp:
#     headers = BytesParser(policy=default).parse(fp)

#  Or for parsing headers in a string (this is an uncommon operation), use:
headers = Parser(policy=default).parsestr(
        'From: Foo Bar <user@@example.com>\n'
        'To: <someone_else@@example.com>\n'
        'Subject: Test message\n'
        '\n'
        'Body would go here\n')

#  Now the header items can be accessed as a dictionary:
print('To: @{@}'.format(headers['to']))
print('From: @{@}'.format(headers['from']))
print('Subject: @{@}'.format(headers['subject']))

# You can also access the parts of the addresses:
print('Recipient username: @{@}'.format(headers['to'].addresses[0].username))
print('Sender name: @{@}'.format(headers['from'].addresses[0].display_name))
@end example

Here’s an example of how to send a MIME message containing a bunch of family
pictures that may be residing in a directory:

@example
# Import smtplib for the actual sending function.
import smtplib

# Here are the email package modules we'll need.
from email.message import EmailMessage

# Create the container email message.
msg = EmailMessage()
msg['Subject'] = 'Our family reunion'
# me == the sender's email address
# family = the list of all recipients' email addresses
msg['From'] = me
msg['To'] = ', '.join(family)
msg.preamble = 'You will not see this in a MIME-aware mail reader.\n'

# Open the files in binary mode.  You can also omit the subtype
# if you want MIMEImage to guess it.
for file in pngfiles:
    with open(file, 'rb') as fp:
        img_data = fp.read()
    msg.add_attachment(img_data, maintype='image',
                                 subtype='png')

# Send the email via our own SMTP server.
with smtplib.SMTP('localhost') as s:
    s.send_message(msg)
@end example

Here’s an example of how to send the entire contents of a directory as an email
message: @footnote{
Thanks to Matthew Dixon Cowles for the original inspiration and examples.
}

@example
#!/usr/bin/env python3

"""Send the contents of a directory as a MIME message."""

import os
import smtplib
# For guessing MIME type based on file name extension
import mimetypes

from argparse import ArgumentParser

from email.message import EmailMessage
from email.policy import SMTP


def main():
    parser = ArgumentParser(description="""\
Send the contents of a directory as a MIME message.
Unless the -o option is given, the email is sent by forwarding to your local
SMTP server, which then does the normal delivery process.  Your local machine
must be running an SMTP server.
""")
    parser.add_argument('-d', '--directory',
                        help="""Mail the contents of the specified directory,
                        otherwise use the current directory.  Only the regular
                        files in the directory are sent, and we don't recurse to
                        subdirectories.""")
    parser.add_argument('-o', '--output',
                        metavar='FILE',
                        help="""Print the composed message to FILE instead of
                        sending the message to the SMTP server.""")
    parser.add_argument('-s', '--sender', required=True,
                        help='The value of the From: header (required)')
    parser.add_argument('-r', '--recipient', required=True,
                        action='append', metavar='RECIPIENT',
                        default=[], dest='recipients',
                        help='A To: header value (at least one required)')
    args = parser.parse_args()
    directory = args.directory
    if not directory:
        directory = '.'
    # Create the message
    msg = EmailMessage()
    msg['Subject'] = f'Contents of directory @{os.path.abspath(directory)@}'
    msg['To'] = ', '.join(args.recipients)
    msg['From'] = args.sender
    msg.preamble = 'You will not see this in a MIME-aware mail reader.\n'

    for filename in os.listdir(directory):
        path = os.path.join(directory, filename)
        if not os.path.isfile(path):
            continue
        # Guess the content type based on the file's extension.  Encoding
        # will be ignored, although we should check for simple things like
        # gzip'd or compressed files.
        ctype, encoding = mimetypes.guess_file_type(path)
        if ctype is None or encoding is not None:
            # No guess could be made, or the file is encoded (compressed), so
            # use a generic bag-of-bits type.
            ctype = 'application/octet-stream'
        maintype, subtype = ctype.split('/', 1)
        with open(path, 'rb') as fp:
            msg.add_attachment(fp.read(),
                               maintype=maintype,
                               subtype=subtype,
                               filename=filename)
    # Now send or store the message
    if args.output:
        with open(args.output, 'wb') as fp:
            fp.write(msg.as_bytes(policy=SMTP))
    else:
        with smtplib.SMTP('localhost') as s:
            s.send_message(msg)


if __name__ == '__main__':
    main()
@end example

Here’s an example of how to unpack a MIME message like the one
above, into a directory of files:

@example
#!/usr/bin/env python3

"""Unpack a MIME message into a directory of files."""

import os
import email
import mimetypes

from email.policy import default

from argparse import ArgumentParser


def main():
    parser = ArgumentParser(description="""\
Unpack a MIME message into a directory of files.
""")
    parser.add_argument('-d', '--directory', required=True,
                        help="""Unpack the MIME message into the named
                        directory, which will be created if it doesn't already
                        exist.""")
    parser.add_argument('msgfile')
    args = parser.parse_args()

    with open(args.msgfile, 'rb') as fp:
        msg = email.message_from_binary_file(fp, policy=default)

    try:
        os.mkdir(args.directory)
    except FileExistsError:
        pass

    counter = 1
    for part in msg.walk():
        # multipart/* are just containers
        if part.get_content_maintype() == 'multipart':
            continue
        # Applications should really sanitize the given filename so that an
        # email message can't be used to overwrite important files
        filename = part.get_filename()
        if not filename:
            ext = mimetypes.guess_extension(part.get_content_type())
            if not ext:
                # Use a generic bag-of-bits extension
                ext = '.bin'
            filename = f'part-@{counter:03d@}@{ext@}'
        counter += 1
        with open(os.path.join(args.directory, filename), 'wb') as fp:
            fp.write(part.get_payload(decode=True))


if __name__ == '__main__':
    main()
@end example

Here’s an example of how to create an HTML message with an alternative plain
text version.  To make things a bit more interesting, we include a related
image in the html part, and we save a copy of what we are going to send to
disk, as well as sending it.

@example
#!/usr/bin/env python3

import smtplib

from email.message import EmailMessage
from email.headerregistry import Address
from email.utils import make_msgid

# Create the base text message.
msg = EmailMessage()
msg['Subject'] = "Pourquoi pas des asperges pour ce midi ?"
msg['From'] = Address("Pepé Le Pew", "pepe", "example.com")
msg['To'] = (Address("Penelope Pussycat", "penelope", "example.com"),
             Address("Fabrette Pussycat", "fabrette", "example.com"))
msg.set_content("""\
Salut!

Cette recette [1] sera sûrement un très bon repas.

[1] http://www.yummly.com/recipe/Roasted-Asparagus-Epicurious-203718

--Pepé
""")

# Add the html version.  This converts the message into a multipart/alternative
# container, with the original text message as the first part and the new html
# message as the second part.
asparagus_cid = make_msgid()
msg.add_alternative("""\
<html>
  <head></head>
  <body>
    <p>Salut!</p>
    <p>Cette
        <a href="http://www.yummly.com/recipe/Roasted-Asparagus-Epicurious-203718">
            recette
        </a> sera sûrement un très bon repas.
    </p>
    <img src="cid:@{asparagus_cid@}">
  </body>
</html>
""".format(asparagus_cid=asparagus_cid[1:-1]), subtype='html')
# note that we needed to peel the <> off the msgid for use in the html.

# Now add the related image to the html part.
with open("roasted-asparagus.jpg", 'rb') as img:
    msg.get_payload()[1].add_related(img.read(), 'image', 'jpeg',
                                     cid=asparagus_cid)

# Make a local copy of what we are going to send.
with open('outgoing.msg', 'wb') as f:
    f.write(bytes(msg))

# Send the message via local SMTP server.
with smtplib.SMTP('localhost') as s:
    s.send_message(msg)
@end example

If we were sent the message from the last example, here is one way we could
process it:

@example
import os
import sys
import tempfile
import mimetypes
import webbrowser

# Import the email modules we'll need
from email import policy
from email.parser import BytesParser


def magic_html_parser(html_text, partfiles):
    """Return safety-sanitized html linked to partfiles.

    Rewrite the href="cid:...." attributes to point to the filenames in partfiles.
    Though not trivial, this should be possible using html.parser.
    """
    raise NotImplementedError("Add the magic needed")


# In a real program you'd get the filename from the arguments.
with open('outgoing.msg', 'rb') as fp:
    msg = BytesParser(policy=policy.default).parse(fp)

# Now the header items can be accessed as a dictionary, and any non-ASCII will
# be converted to unicode:
print('To:', msg['to'])
print('From:', msg['from'])
print('Subject:', msg['subject'])

# If we want to print a preview of the message content, we can extract whatever
# the least formatted payload is and print the first three lines.  Of course,
# if the message has no plain text part printing the first three lines of html
# is probably useless, but this is just a conceptual example.
simplest = msg.get_body(preferencelist=('plain', 'html'))
print()
print('@w{'}.join(simplest.get_content().splitlines(keepends=True)[:3]))

ans = input("View full message?")
if ans.lower()[0] == 'n':
    sys.exit()

# We can extract the richest alternative in order to display it:
richest = msg.get_body()
partfiles = @{@}
if richest['content-type'].maintype == 'text':
    if richest['content-type'].subtype == 'plain':
        for line in richest.get_content().splitlines():
            print(line)
        sys.exit()
    elif richest['content-type'].subtype == 'html':
        body = richest
    else:
        print("Don't know how to display @{@}".format(richest.get_content_type()))
        sys.exit()
elif richest['content-type'].content_type == 'multipart/related':
    body = richest.get_body(preferencelist=('html'))
    for part in richest.iter_attachments():
        fn = part.get_filename()
        if fn:
            extension = os.path.splitext(part.get_filename())[1]
        else:
            extension = mimetypes.guess_extension(part.get_content_type())
        with tempfile.NamedTemporaryFile(suffix=extension, delete=False) as f:
            f.write(part.get_content())
            # again strip the <> to go from email form of cid to html form.
            partfiles[part['content-id'][1:-1]] = f.name
else:
    print("Don't know how to display @{@}".format(richest.get_content_type()))
    sys.exit()
with tempfile.NamedTemporaryFile(mode='w', delete=False) as f:
    f.write(magic_html_parser(body.get_content(), partfiles))
webbrowser.open(f.name)
os.remove(f.name)
for fn in partfiles.values():
    os.remove(fn)

# Of course, there are lots of email messages that could break this simple
# minded program, but it will handle the most common ones.
@end example

Up to the prompt, the output from the above is:

@example
To: Penelope Pussycat <penelope@@example.com>, Fabrette Pussycat <fabrette@@example.com>
From: Pepé Le Pew <pepe@@example.com>
Subject: Pourquoi pas des asperges pour ce midi ?

Salut!

Cette recette [1] sera sûrement un très bon repas.
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

Legacy API:

@node email message Message Representing an email message using the compat32 API,email mime Creating email and MIME objects from scratch,email Examples,email — An email and MIME handling package
@anchor{library/email compat32-message doc}@anchor{3bfb}@anchor{library/email compat32-message compat32-message}@anchor{3b3c}@anchor{library/email compat32-message email-message-message-representing-an-email-message-using-the-compat32-api}@anchor{3bfc}@anchor{library/email compat32-message translation-repo}@anchor{3bfd}
@subsubsection @code{email.message.Message}: Representing an email message using the @code{compat32} API


The @ref{581,,Message} class is very similar to the
@ref{580,,EmailMessage} class, without the methods added by that
class, and with the default behavior of certain other methods being slightly
different.  We also document here some methods that, while supported by the
@code{EmailMessage} class, are not recommended unless you are
dealing with legacy code.

The philosophy and structure of the two classes is otherwise the same.

This document describes the behavior under the default (for @ref{581,,Message})
policy @ref{12c0,,Compat32}.  If you are going to use another policy,
you should be using the @ref{580,,EmailMessage} class instead.

An email message consists of `headers' and a `payload'.  Headers must be
@geindex RFC; RFC 5322
RFC 5322@footnote{https://datatracker.ietf.org/doc/html/rfc5322.html} style names and values, where the field name and value are
separated by a colon.  The colon is not part of either the field name or the
field value.  The payload may be a simple text message, or a binary object, or
a structured sequence of sub-messages each with their own set of headers and
their own payload.  The latter type of payload is indicated by the message
having a MIME type such as @code{multipart/*} or
@code{message/rfc822}.

The conceptual model provided by a @ref{581,,Message} object is that of an
ordered dictionary of headers with additional methods for accessing both
specialized information from the headers, for accessing the payload, for
generating a serialized version of the message, and for recursively walking
over the object tree.  Note that duplicate headers are supported but special
methods must be used to access them.

The @ref{581,,Message} pseudo-dictionary is indexed by the header names, which
must be ASCII values.  The values of the dictionary are strings that are
supposed to contain only ASCII characters; there is some special handling for
non-ASCII input, but it doesn’t always produce the correct results.  Headers
are stored and returned in case-preserving form, but field names are matched
case-insensitively.  There may also be a single envelope header, also known as
the `Unix-From' header or the @code{From_} header.  The `payload' is either a
string or bytes, in the case of simple message objects, or a list of
@code{Message} objects, for MIME container documents (e.g.
@code{multipart/*} and @code{message/rfc822}).

Here are the methods of the @ref{581,,Message} class:

@geindex Message (class in email.message)
@anchor{library/email compat32-message email message Message}@anchor{581}
@deffn {Class} email.message.Message (policy=compat32)

If `policy' is specified (it must be an instance of a @ref{53,,policy}
class) use the rules it specifies to update and serialize the representation
of the message.  If `policy' is not set, use the @ref{12c0,,compat32} policy, which maintains backward compatibility with
the Python 3.2 version of the email package.  For more information see the
@code{policy} documentation.


Changed in version 3.3: The `policy' keyword argument was added.


@geindex as_string() (email.message.Message method)
@anchor{library/email compat32-message email message Message as_string}@anchor{113c}
@deffn {Method} as_string (unixfrom=False, maxheaderlen=0, policy=None)

Return the entire message flattened as a string.  When optional `unixfrom'
is true, the envelope header is included in the returned string.
`unixfrom' defaults to @code{False}.  For backward compatibility reasons,
`maxheaderlen' defaults to @code{0}, so if you want a different value you
must override it explicitly (the value specified for `max_line_length' in
the policy will be ignored by this method).  The `policy' argument may be
used to override the default policy obtained from the message instance.
This can be used to control some of the formatting produced by the
method, since the specified `policy' will be passed to the @code{Generator}.

Flattening the message may trigger changes to the @code{Message} if
defaults need to be filled in to complete the transformation to a string
(for example, MIME boundaries may be generated or modified).

Note that this method is provided as a convenience and may not always
format the message the way you want.  For example, by default it does
not do the mangling of lines that begin with @code{From} that is
required by the Unix mbox format.  For more flexibility, instantiate a
@ref{13da,,Generator} instance and use its
@ref{3b8f,,flatten()} method directly.  For example:

@example
from io import StringIO
from email.generator import Generator
fp = StringIO()
g = Generator(fp, mangle_from_=True, maxheaderlen=60)
g.flatten(msg)
text = fp.getvalue()
@end example

If the message object contains binary data that is not encoded according
to RFC standards, the non-compliant data will be replaced by unicode
“unknown character” code points.  (See also @ref{113d,,as_bytes()} and
@ref{13db,,BytesGenerator}.)


Changed in version 3.4: the `policy' keyword argument was added.

@end deffn

@geindex __str__() (email.message.Message method)
@anchor{library/email compat32-message email message Message __str__}@anchor{3bfe}
@deffn {Method} __str__ ()

Equivalent to @ref{113c,,as_string()}.  Allows @code{str(msg)} to produce a
string containing the formatted message.
@end deffn

@geindex as_bytes() (email.message.Message method)
@anchor{library/email compat32-message email message Message as_bytes}@anchor{113d}
@deffn {Method} as_bytes (unixfrom=False, policy=None)

Return the entire message flattened as a bytes object.  When optional
`unixfrom' is true, the envelope header is included in the returned
string.  `unixfrom' defaults to @code{False}.  The `policy' argument may be
used to override the default policy obtained from the message instance.
This can be used to control some of the formatting produced by the
method, since the specified `policy' will be passed to the
@code{BytesGenerator}.

Flattening the message may trigger changes to the @code{Message} if
defaults need to be filled in to complete the transformation to a string
(for example, MIME boundaries may be generated or modified).

Note that this method is provided as a convenience and may not always
format the message the way you want.  For example, by default it does
not do the mangling of lines that begin with @code{From} that is
required by the Unix mbox format.  For more flexibility, instantiate a
@ref{13db,,BytesGenerator} instance and use its
@ref{3b8b,,flatten()} method directly.
For example:

@example
from io import BytesIO
from email.generator import BytesGenerator
fp = BytesIO()
g = BytesGenerator(fp, mangle_from_=True, maxheaderlen=60)
g.flatten(msg)
text = fp.getvalue()
@end example


Added in version 3.4.

@end deffn

@geindex __bytes__() (email.message.Message method)
@anchor{library/email compat32-message email message Message __bytes__}@anchor{113e}
@deffn {Method} __bytes__ ()

Equivalent to @ref{113d,,as_bytes()}.  Allows @code{bytes(msg)} to produce a
bytes object containing the formatted message.


Added in version 3.4.

@end deffn

@geindex is_multipart() (email.message.Message method)
@anchor{library/email compat32-message email message Message is_multipart}@anchor{3b63}
@deffn {Method} is_multipart ()

Return @code{True} if the message’s payload is a list of
sub-@code{Message} objects, otherwise return @code{False}.  When
@code{is_multipart()} returns @code{False}, the payload should be a string
object (which might be a CTE encoded binary payload).  (Note that
@code{is_multipart()} returning @code{True} does not necessarily mean that
“msg.get_content_maintype() == ‘multipart’” will return the @code{True}.
For example, @code{is_multipart} will return @code{True} when the
@code{Message} is of type @code{message/rfc822}.)
@end deffn

@geindex set_unixfrom() (email.message.Message method)
@anchor{library/email compat32-message email message Message set_unixfrom}@anchor{3bff}
@deffn {Method} set_unixfrom (unixfrom)

Set the message’s envelope header to `unixfrom', which should be a string.
@end deffn

@geindex get_unixfrom() (email.message.Message method)
@anchor{library/email compat32-message email message Message get_unixfrom}@anchor{3c00}
@deffn {Method} get_unixfrom ()

Return the message’s envelope header.  Defaults to @code{None} if the
envelope header was never set.
@end deffn

@geindex attach() (email.message.Message method)
@anchor{library/email compat32-message email message Message attach}@anchor{3b70}
@deffn {Method} attach (payload)

Add the given `payload' to the current payload, which must be @code{None} or
a list of @code{Message} objects before the call. After the call, the
payload will always be a list of @code{Message} objects.  If you want to
set the payload to a scalar object (e.g. a string), use
@ref{3c01,,set_payload()} instead.

This is a legacy method.  On the
@ref{580,,EmailMessage} class its functionality is
replaced by @ref{1ca0,,set_content()} and the
related @code{make} and @code{add} methods.
@end deffn

@geindex get_payload() (email.message.Message method)
@anchor{library/email compat32-message email message Message get_payload}@anchor{13d9}
@deffn {Method} get_payload (i=None, decode=False)

Return the current payload, which will be a list of
@code{Message} objects when @ref{3b63,,is_multipart()} is @code{True}, or a
string when @code{is_multipart()} is @code{False}.  If the payload is a list
and you mutate the list object, you modify the message’s payload in place.

With optional argument `i', @code{get_payload()} will return the `i'-th
element of the payload, counting from zero, if @ref{3b63,,is_multipart()} is
@code{True}.  An @ref{1741,,IndexError} will be raised if `i' is less than 0 or
greater than or equal to the number of items in the payload.  If the
payload is a string (i.e.  @code{is_multipart()} is @code{False}) and `i' is
given, a @ref{199,,TypeError} is raised.

Optional `decode' is a flag indicating whether the payload should be
decoded or not, according to the @code{Content-Transfer-Encoding}
header. When @code{True} and the message is not a multipart, the payload will
be decoded if this header’s value is @code{quoted-printable} or @code{base64}.
If some other encoding is used, or @code{Content-Transfer-Encoding}
header is missing, the payload is
returned as-is (undecoded).  In all cases the returned value is binary
data.  If the message is a multipart and the `decode' flag is @code{True},
then @code{None} is returned.  If the payload is base64 and it was not
perfectly formed (missing padding, characters outside the base64
alphabet), then an appropriate defect will be added to the message’s
defect property (@ref{3bc2,,InvalidBase64PaddingDefect} or
@ref{3bc3,,InvalidBase64CharactersDefect}, respectively).

When `decode' is @code{False} (the default) the body is returned as a string
without decoding the @code{Content-Transfer-Encoding}.  However,
for a @code{Content-Transfer-Encoding} of 8bit, an attempt is made
to decode the original bytes using the @code{charset} specified by the
@code{Content-Type} header, using the @code{replace} error handler.
If no @code{charset} is specified, or if the @code{charset} given is not
recognized by the email package, the body is decoded using the default
ASCII charset.

This is a legacy method.  On the
@ref{580,,EmailMessage} class its functionality is
replaced by @ref{3b69,,get_content()} and
@ref{3b68,,iter_parts()}.
@end deffn

@geindex set_payload() (email.message.Message method)
@anchor{library/email compat32-message email message Message set_payload}@anchor{3c01}
@deffn {Method} set_payload (payload, charset=None)

Set the entire message object’s payload to `payload'.  It is the client’s
responsibility to ensure the payload invariants.  Optional `charset' sets
the message’s default character set; see @ref{3c02,,set_charset()} for details.

This is a legacy method.  On the
@ref{580,,EmailMessage} class its functionality is
replaced by @ref{1ca0,,set_content()}.
@end deffn

@geindex set_charset() (email.message.Message method)
@anchor{library/email compat32-message email message Message set_charset}@anchor{3c02}
@deffn {Method} set_charset (charset)

Set the character set of the payload to `charset', which can either be a
@ref{1001,,Charset} instance (see @ref{40,,email.charset}), a
string naming a character set, or @code{None}.  If it is a string, it will
be converted to a @code{Charset} instance.  If `charset'
is @code{None}, the @code{charset} parameter will be removed from the
@code{Content-Type} header (the message will not be otherwise
modified).  Anything else will generate a @ref{199,,TypeError}.

If there is no existing @code{MIME-Version} header one will be
added.  If there is no existing @code{Content-Type} header, one
will be added with a value of @code{text/plain}.  Whether the
@code{Content-Type} header already exists or not, its @code{charset}
parameter will be set to `charset.output_charset'.   If
`charset.input_charset' and `charset.output_charset' differ, the payload
will be re-encoded to the `output_charset'.  If there is no existing
@code{Content-Transfer-Encoding} header, then the payload will be
transfer-encoded, if needed, using the specified
@ref{1001,,Charset}, and a header with the appropriate value
will be added.  If a @code{Content-Transfer-Encoding} header
already exists, the payload is assumed to already be correctly encoded
using that @code{Content-Transfer-Encoding} and is not modified.

This is a legacy method.  On the
@ref{580,,EmailMessage} class its functionality is
replaced by the `charset' parameter of the
@ref{1ca0,,email.message.EmailMessage.set_content()} method.
@end deffn

@geindex get_charset() (email.message.Message method)
@anchor{library/email compat32-message email message Message get_charset}@anchor{3c03}
@deffn {Method} get_charset ()

Return the @ref{1001,,Charset} instance associated with the
message’s payload.

This is a legacy method.  On the
@ref{580,,EmailMessage} class it always returns
@code{None}.
@end deffn

The following methods implement a mapping-like interface for accessing the
message’s 
@geindex RFC; RFC 2822
RFC 2822@footnote{https://datatracker.ietf.org/doc/html/rfc2822.html} headers.  Note that there are some semantic differences
between these methods and a normal mapping (i.e. dictionary) interface.  For
example, in a dictionary there are no duplicate keys, but here there may be
duplicate message headers.  Also, in dictionaries there is no guaranteed
order to the keys returned by @ref{3c04,,keys()}, but in a @code{Message} object,
headers are always returned in the order they appeared in the original
message, or were added to the message later.  Any header deleted and then
re-added are always appended to the end of the header list.

These semantic differences are intentional and are biased toward maximal
convenience.

Note that in all cases, any envelope header present in the message is not
included in the mapping interface.

In a model generated from bytes, any header values that (in contravention of
the RFCs) contain non-ASCII bytes will, when retrieved through this
interface, be represented as @ref{1ca1,,Header} objects with
a charset of @code{unknown-8bit}.

@geindex __len__() (email.message.Message method)
@anchor{library/email compat32-message email message Message __len__}@anchor{3c05}
@deffn {Method} __len__ ()

Return the total number of headers, including duplicates.
@end deffn

@geindex __contains__() (email.message.Message method)
@anchor{library/email compat32-message email message Message __contains__}@anchor{1b38}
@deffn {Method} __contains__ (name)

Return @code{True} if the message object has a field named `name'. Matching is
done case-insensitively and `name' should not include the trailing colon.
Used for the @code{in} operator, e.g.:

@example
if 'message-id' in myMessage:
   print('Message-ID:', myMessage['message-id'])
@end example
@end deffn

@geindex __getitem__() (email.message.Message method)
@anchor{library/email compat32-message email message Message __getitem__}@anchor{3c06}
@deffn {Method} __getitem__ (name)

Return the value of the named header field.  `name' should not include the
colon field separator.  If the header is missing, @code{None} is returned; a
@ref{5e7,,KeyError} is never raised.

Note that if the named field appears more than once in the message’s
headers, exactly which of those field values will be returned is
undefined.  Use the @ref{3c07,,get_all()} method to get the values of all the
extant named headers.
@end deffn

@geindex __setitem__() (email.message.Message method)
@anchor{library/email compat32-message email message Message __setitem__}@anchor{18c5}
@deffn {Method} __setitem__ (name, val)

Add a header to the message with field name `name' and value `val'.  The
field is appended to the end of the message’s existing fields.

Note that this does `not' overwrite or delete any existing header with the same
name.  If you want to ensure that the new header is the only one present in the
message with field name `name', delete the field first, e.g.:

@example
del msg['subject']
msg['subject'] = 'Python roolz!'
@end example
@end deffn

@geindex __delitem__() (email.message.Message method)
@anchor{library/email compat32-message email message Message __delitem__}@anchor{3c08}
@deffn {Method} __delitem__ (name)

Delete all occurrences of the field with name `name' from the message’s
headers.  No exception is raised if the named field isn’t present in the
headers.
@end deffn

@geindex keys() (email.message.Message method)
@anchor{library/email compat32-message email message Message keys}@anchor{3c04}
@deffn {Method} keys ()

Return a list of all the message’s header field names.
@end deffn

@geindex values() (email.message.Message method)
@anchor{library/email compat32-message email message Message values}@anchor{3c09}
@deffn {Method} values ()

Return a list of all the message’s field values.
@end deffn

@geindex items() (email.message.Message method)
@anchor{library/email compat32-message email message Message items}@anchor{3c0a}
@deffn {Method} items ()

Return a list of 2-tuples containing all the message’s field headers and
values.
@end deffn

@geindex get() (email.message.Message method)
@anchor{library/email compat32-message email message Message get}@anchor{3c0b}
@deffn {Method} get (name, failobj=None)

Return the value of the named header field.  This is identical to
@ref{588,,__getitem__()} except that optional `failobj' is returned if the
named header is missing (defaults to @code{None}).
@end deffn

Here are some additional useful methods:

@geindex get_all() (email.message.Message method)
@anchor{library/email compat32-message email message Message get_all}@anchor{3c07}
@deffn {Method} get_all (name, failobj=None)

Return a list of all the values for the field named `name'. If there are
no such named headers in the message, `failobj' is returned (defaults to
@code{None}).
@end deffn

@geindex add_header() (email.message.Message method)
@anchor{library/email compat32-message email message Message add_header}@anchor{18c6}
@deffn {Method} add_header (_name, _value, **_params)

Extended header setting.  This method is similar to @ref{18c5,,__setitem__()}
except that additional header parameters can be provided as keyword
arguments.  `_name' is the header field to add and `_value' is the
`primary' value for the header.

For each item in the keyword argument dictionary `_params', the key is
taken as the parameter name, with underscores converted to dashes (since
dashes are illegal in Python identifiers).  Normally, the parameter will
be added as @code{key="value"} unless the value is @code{None}, in which case
only the key will be added.  If the value contains non-ASCII characters,
it can be specified as a three tuple in the format
@code{(CHARSET, LANGUAGE, VALUE)}, where @code{CHARSET} is a string naming the
charset to be used to encode the value, @code{LANGUAGE} can usually be set
to @code{None} or the empty string (see 
@geindex RFC; RFC 2231
RFC 2231@footnote{https://datatracker.ietf.org/doc/html/rfc2231.html} for other possibilities),
and @code{VALUE} is the string value containing non-ASCII code points.  If
a three tuple is not passed and the value contains non-ASCII characters,
it is automatically encoded in 
@geindex RFC; RFC 2231
RFC 2231@footnote{https://datatracker.ietf.org/doc/html/rfc2231.html} format using a @code{CHARSET}
of @code{utf-8} and a @code{LANGUAGE} of @code{None}.

Here’s an example:

@example
msg.add_header('Content-Disposition', 'attachment', filename='bud.gif')
@end example

This will add a header that looks like

@example
Content-Disposition: attachment; filename="bud.gif"
@end example

An example with non-ASCII characters:

@example
msg.add_header('Content-Disposition', 'attachment',
               filename=('iso-8859-1', '@w{'}, 'Fußballer.ppt'))
@end example

Which produces

@example
Content-Disposition: attachment; filename*="iso-8859-1'@w{'}Fu%DFballer.ppt"
@end example
@end deffn

@geindex replace_header() (email.message.Message method)
@anchor{library/email compat32-message email message Message replace_header}@anchor{3c0c}
@deffn {Method} replace_header (_name, _value)

Replace a header.  Replace the first header found in the message that
matches `_name', retaining header order and field name case.  If no
matching header was found, a @ref{5e7,,KeyError} is raised.
@end deffn

@geindex get_content_type() (email.message.Message method)
@anchor{library/email compat32-message email message Message get_content_type}@anchor{3c0d}
@deffn {Method} get_content_type ()

Return the message’s content type.  The returned string is coerced to
lower case of the form @code{maintype/subtype}.  If there was no
@code{Content-Type} header in the message the default type as given
by @ref{3c0e,,get_default_type()} will be returned.  Since according to
@geindex RFC; RFC 2045
RFC 2045@footnote{https://datatracker.ietf.org/doc/html/rfc2045.html}, messages always have a default type, @code{get_content_type()}
will always return a value.

@geindex RFC; RFC 2045
RFC 2045@footnote{https://datatracker.ietf.org/doc/html/rfc2045.html} defines a message’s default type to be @code{text/plain}
unless it appears inside a @code{multipart/digest} container, in
which case it would be @code{message/rfc822}.  If the
@code{Content-Type} header has an invalid type specification,
@geindex RFC; RFC 2045
RFC 2045@footnote{https://datatracker.ietf.org/doc/html/rfc2045.html} mandates that the default type be @code{text/plain}.
@end deffn

@geindex get_content_maintype() (email.message.Message method)
@anchor{library/email compat32-message email message Message get_content_maintype}@anchor{3c0f}
@deffn {Method} get_content_maintype ()

Return the message’s main content type.  This is the @code{maintype}
part of the string returned by @ref{3c0d,,get_content_type()}.
@end deffn

@geindex get_content_subtype() (email.message.Message method)
@anchor{library/email compat32-message email message Message get_content_subtype}@anchor{3c10}
@deffn {Method} get_content_subtype ()

Return the message’s sub-content type.  This is the @code{subtype}
part of the string returned by @ref{3c0d,,get_content_type()}.
@end deffn

@geindex get_default_type() (email.message.Message method)
@anchor{library/email compat32-message email message Message get_default_type}@anchor{3c0e}
@deffn {Method} get_default_type ()

Return the default content type.  Most messages have a default content
type of @code{text/plain}, except for messages that are subparts of
@code{multipart/digest} containers.  Such subparts have a default
content type of @code{message/rfc822}.
@end deffn

@geindex set_default_type() (email.message.Message method)
@anchor{library/email compat32-message email message Message set_default_type}@anchor{3c11}
@deffn {Method} set_default_type (ctype)

Set the default content type.  `ctype' should either be
@code{text/plain} or @code{message/rfc822}, although this is not
enforced.  The default content type is not stored in the
@code{Content-Type} header.
@end deffn

@geindex get_params() (email.message.Message method)
@anchor{library/email compat32-message email message Message get_params}@anchor{3c12}
@deffn {Method} get_params (failobj=None, header='content-type', unquote=True)

Return the message’s @code{Content-Type} parameters, as a list.
The elements of the returned list are 2-tuples of key/value pairs, as
split on the @code{'='} sign.  The left hand side of the @code{'='} is the key,
while the right hand side is the value.  If there is no @code{'='} sign in
the parameter the value is the empty string, otherwise the value is as
described in @ref{3c13,,get_param()} and is unquoted if optional `unquote' is
@code{True} (the default).

Optional `failobj' is the object to return if there is no
@code{Content-Type} header.  Optional `header' is the header to
search instead of @code{Content-Type}.

This is a legacy method.  On the
@ref{580,,EmailMessage} class its functionality is
replaced by the `params' property of the individual header objects
returned by the header access methods.
@end deffn

@geindex get_param() (email.message.Message method)
@anchor{library/email compat32-message email message Message get_param}@anchor{3c13}
@deffn {Method} get_param (param, failobj=None, header='content-type', unquote=True)

Return the value of the @code{Content-Type} header’s parameter
`param' as a string.  If the message has no @code{Content-Type}
header or if there is no such parameter, then `failobj' is returned
(defaults to @code{None}).

Optional `header' if given, specifies the message header to use instead of
@code{Content-Type}.

Parameter keys are always compared case insensitively.  The return value
can either be a string, or a 3-tuple if the parameter was 
@geindex RFC; RFC 2231
RFC 2231@footnote{https://datatracker.ietf.org/doc/html/rfc2231.html}
encoded.  When it’s a 3-tuple, the elements of the value are of the form
@code{(CHARSET, LANGUAGE, VALUE)}.  Note that both @code{CHARSET} and
@code{LANGUAGE} can be @code{None}, in which case you should consider @code{VALUE}
to be encoded in the @code{us-ascii} charset.  You can usually ignore
@code{LANGUAGE}.

If your application doesn’t care whether the parameter was encoded as in
@geindex RFC; RFC 2231
RFC 2231@footnote{https://datatracker.ietf.org/doc/html/rfc2231.html}, you can collapse the parameter value by calling
@ref{3c14,,email.utils.collapse_rfc2231_value()}, passing in the return value
from @code{get_param()}.  This will return a suitably decoded Unicode
string when the value is a tuple, or the original string unquoted if it
isn’t.  For example:

@example
rawparam = msg.get_param('foo')
param = email.utils.collapse_rfc2231_value(rawparam)
@end example

In any case, the parameter value (either the returned string, or the
@code{VALUE} item in the 3-tuple) is always unquoted, unless `unquote' is set
to @code{False}.

This is a legacy method.  On the
@ref{580,,EmailMessage} class its functionality is
replaced by the `params' property of the individual header objects
returned by the header access methods.
@end deffn

@geindex set_param() (email.message.Message method)
@anchor{library/email compat32-message email message Message set_param}@anchor{113f}
@deffn {Method} set_param (param, value, header='Content-Type', requote=True, charset=None, language='@w{'}, replace=False)

Set a parameter in the @code{Content-Type} header.  If the
parameter already exists in the header, its value will be replaced with
`value'.  If the @code{Content-Type} header as not yet been defined
for this message, it will be set to @code{text/plain} and the new
parameter value will be appended as per 
@geindex RFC; RFC 2045
RFC 2045@footnote{https://datatracker.ietf.org/doc/html/rfc2045.html}.

Optional `header' specifies an alternative header to
@code{Content-Type}, and all parameters will be quoted as necessary
unless optional `requote' is @code{False} (the default is @code{True}).

If optional `charset' is specified, the parameter will be encoded
according to 
@geindex RFC; RFC 2231
RFC 2231@footnote{https://datatracker.ietf.org/doc/html/rfc2231.html}. Optional `language' specifies the RFC 2231
language, defaulting to the empty string.  Both `charset' and `language'
should be strings.

If `replace' is @code{False} (the default) the header is moved to the
end of the list of headers.  If `replace' is @code{True}, the header
will be updated in place.


Changed in version 3.4: @code{replace} keyword was added.

@end deffn

@geindex del_param() (email.message.Message method)
@anchor{library/email compat32-message email message Message del_param}@anchor{3c15}
@deffn {Method} del_param (param, header='content-type', requote=True)

Remove the given parameter completely from the @code{Content-Type}
header.  The header will be re-written in place without the parameter or
its value.  All values will be quoted as necessary unless `requote' is
@code{False} (the default is @code{True}).  Optional `header' specifies an
alternative to @code{Content-Type}.
@end deffn

@geindex set_type() (email.message.Message method)
@anchor{library/email compat32-message email message Message set_type}@anchor{3c16}
@deffn {Method} set_type (type, header='Content-Type', requote=True)

Set the main type and subtype for the @code{Content-Type}
header. `type' must be a string in the form @code{maintype/subtype},
otherwise a @ref{2ee,,ValueError} is raised.

This method replaces the @code{Content-Type} header, keeping all
the parameters in place.  If `requote' is @code{False}, this leaves the
existing header’s quoting as is, otherwise the parameters will be quoted
(the default).

An alternative header can be specified in the `header' argument. When the
@code{Content-Type} header is set a @code{MIME-Version}
header is also added.

This is a legacy method.  On the
@ref{580,,EmailMessage} class its functionality is
replaced by the @code{make_} and @code{add_} methods.
@end deffn

@geindex get_filename() (email.message.Message method)
@anchor{library/email compat32-message email message Message get_filename}@anchor{3c17}
@deffn {Method} get_filename (failobj=None)

Return the value of the @code{filename} parameter of the
@code{Content-Disposition} header of the message.  If the header
does not have a @code{filename} parameter, this method falls back to looking
for the @code{name} parameter on the @code{Content-Type} header.  If
neither is found, or the header is missing, then `failobj' is returned.
The returned string will always be unquoted as per
@ref{3b5c,,email.utils.unquote()}.
@end deffn

@geindex get_boundary() (email.message.Message method)
@anchor{library/email compat32-message email message Message get_boundary}@anchor{3c18}
@deffn {Method} get_boundary (failobj=None)

Return the value of the @code{boundary} parameter of the
@code{Content-Type} header of the message, or `failobj' if either
the header is missing, or has no @code{boundary} parameter.  The returned
string will always be unquoted as per @ref{3b5c,,email.utils.unquote()}.
@end deffn

@geindex set_boundary() (email.message.Message method)
@anchor{library/email compat32-message email message Message set_boundary}@anchor{3c19}
@deffn {Method} set_boundary (boundary)

Set the @code{boundary} parameter of the @code{Content-Type} header to
`boundary'.  @code{set_boundary()} will always quote `boundary' if
necessary.  A @ref{3b5f,,HeaderParseError} is raised if the
message object has no @code{Content-Type} header.

Note that using this method is subtly different than deleting the old
@code{Content-Type} header and adding a new one with the new
boundary via @ref{18c6,,add_header()}, because @code{set_boundary()} preserves
the order of the @code{Content-Type} header in the list of
headers. However, it does `not' preserve any continuation lines which may
have been present in the original @code{Content-Type} header.
@end deffn

@geindex get_content_charset() (email.message.Message method)
@anchor{library/email compat32-message email message Message get_content_charset}@anchor{3c1a}
@deffn {Method} get_content_charset (failobj=None)

Return the @code{charset} parameter of the @code{Content-Type} header,
coerced to lower case.  If there is no @code{Content-Type} header, or if
that header has no @code{charset} parameter, `failobj' is returned.

Note that this method differs from @ref{3c03,,get_charset()} which returns the
@ref{1001,,Charset} instance for the default encoding of the message body.
@end deffn

@geindex get_charsets() (email.message.Message method)
@anchor{library/email compat32-message email message Message get_charsets}@anchor{3c1b}
@deffn {Method} get_charsets (failobj=None)

Return a list containing the character set names in the message.  If the
message is a @code{multipart}, then the list will contain one element
for each subpart in the payload, otherwise, it will be a list of length 1.

Each item in the list will be a string which is the value of the
@code{charset} parameter in the @code{Content-Type} header for the
represented subpart.  However, if the subpart has no
@code{Content-Type} header, no @code{charset} parameter, or is not of
the @code{text} main MIME type, then that item in the returned list
will be `failobj'.
@end deffn

@geindex get_content_disposition() (email.message.Message method)
@anchor{library/email compat32-message email message Message get_content_disposition}@anchor{ffe}
@deffn {Method} get_content_disposition ()

Return the lowercased value (without parameters) of the message’s
@code{Content-Disposition} header if it has one, or @code{None}.  The
possible values for this method are `inline', `attachment' or @code{None}
if the message follows 
@geindex RFC; RFC 2183
RFC 2183@footnote{https://datatracker.ietf.org/doc/html/rfc2183.html}.


Added in version 3.5.

@end deffn

@geindex walk() (email.message.Message method)
@anchor{library/email compat32-message email message Message walk}@anchor{3c1c}
@deffn {Method} walk ()

The @code{walk()} method is an all-purpose generator which can be used to
iterate over all the parts and subparts of a message object tree, in
depth-first traversal order.  You will typically use @code{walk()} as the
iterator in a @code{for} loop; each iteration returns the next subpart.

Here’s an example that prints the MIME type of every part of a multipart
message structure:

@c import email
@c from email import message_from_binary_file
@c from os.path import join, dirname
@c lib_dir = dirname(dirname(email.__file__))
@c file_path = join(lib_dir, 'test/test_email/data/msg_16.txt')
@c with open(file_path, 'rb') as f:
@c     msg = message_from_binary_file(f)
@c from email.iterators import _structure

@example
>>> for part in msg.walk():
...     print(part.get_content_type())
multipart/report
text/plain
message/delivery-status
text/plain
text/plain
message/rfc822
text/plain
@end example

@code{walk} iterates over the subparts of any part where
@ref{3b63,,is_multipart()} returns @code{True}, even though
@code{msg.get_content_maintype() == 'multipart'} may return @code{False}.  We
can see this in our example by making use of the @code{_structure} debug
helper function:

@example
>>> for part in msg.walk():
...     print(part.get_content_maintype() == 'multipart',
...           part.is_multipart())
True True
False False
False True
False False
False False
False True
False False
>>> _structure(msg)
multipart/report
    text/plain
    message/delivery-status
        text/plain
        text/plain
    message/rfc822
        text/plain
@end example

Here the @code{message} parts are not @code{multiparts}, but they do contain
subparts. @code{is_multipart()} returns @code{True} and @code{walk} descends
into the subparts.
@end deffn

@code{Message} objects can also optionally contain two instance attributes,
which can be used when generating the plain text of a MIME message.

@geindex preamble (email.message.Message attribute)
@anchor{library/email compat32-message email message Message preamble}@anchor{3c1d}
@deffn {Attribute} preamble

The format of a MIME document allows for some text between the blank line
following the headers, and the first multipart boundary string. Normally,
this text is never visible in a MIME-aware mail reader because it falls
outside the standard MIME armor.  However, when viewing the raw text of
the message, or when viewing the message in a non-MIME aware reader, this
text can become visible.

The `preamble' attribute contains this leading extra-armor text for MIME
documents.  When the @ref{13a9,,Parser} discovers some text
after the headers but before the first boundary string, it assigns this
text to the message’s `preamble' attribute.  When the
@ref{13da,,Generator} is writing out the plain text
representation of a MIME message, and it finds the
message has a `preamble' attribute, it will write this text in the area
between the headers and the first boundary.  See @ref{52,,email.parser} and
@ref{44,,email.generator} for details.

Note that if the message object has no preamble, the `preamble' attribute
will be @code{None}.
@end deffn

@geindex epilogue (email.message.Message attribute)
@anchor{library/email compat32-message email message Message epilogue}@anchor{3c1e}
@deffn {Attribute} epilogue

The `epilogue' attribute acts the same way as the `preamble' attribute,
except that it contains text that appears between the last boundary and
the end of the message.

You do not need to set the epilogue to the empty string in order for the
@ref{13da,,Generator} to print a newline at the end of the
file.
@end deffn

@geindex defects (email.message.Message attribute)
@anchor{library/email compat32-message email message Message defects}@anchor{3c1f}
@deffn {Attribute} defects

The `defects' attribute contains a list of all the problems found when
parsing this message.  See @ref{43,,email.errors} for a detailed description
of the possible parsing defects.
@end deffn
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node email mime Creating email and MIME objects from scratch,email header Internationalized headers,email message Message Representing an email message using the compat32 API,email — An email and MIME handling package
@anchor{library/email mime doc}@anchor{3c20}@anchor{library/email mime email-mime-creating-email-and-mime-objects-from-scratch}@anchor{3c21}@anchor{library/email mime module-email mime}@anchor{49}@anchor{library/email mime translation-repo}@anchor{3c22}
@subsubsection @code{email.mime}: Creating email and MIME objects from scratch


@geindex module; email.mime

`Source code:' Lib/email/mime/@footnote{https://github.com/python/cpython/tree/3.14/Lib/email/mime/}


__________________________________________________________________


This module is part of the legacy (@code{Compat32}) email API.  Its functionality
is partially replaced by the @ref{41,,contentmanager} in the new API, but
in certain applications these classes may still be useful, even in non-legacy
code.

Ordinarily, you get a message object structure by passing a file or some text to
a parser, which parses the text and returns the root message object.  However
you can also build a complete message structure from scratch, or even individual
@ref{581,,Message} objects by hand.  In fact, you can also take an
existing structure and add new @code{Message} objects, move them
around, etc.  This makes a very convenient interface for slicing-and-dicing MIME
messages.

You can create a new object structure by creating @ref{581,,Message}
instances, adding attachments and all the appropriate headers manually.  For MIME
messages though, the @ref{3f,,email} package provides some convenient subclasses to
make things easier.

Here are the classes:

@geindex module; email.mime.base

@geindex MIMEBase (class in email.mime.base)
@anchor{library/email mime module-email mime base}@anchor{4c}@anchor{library/email mime email mime base MIMEBase}@anchor{3c23}
@deffn {Class} email.mime.base.MIMEBase (_maintype, _subtype, *, policy=compat32, **_params)

Module: @ref{4c,,email.mime.base}

This is the base class for all the MIME-specific subclasses of
@ref{581,,Message}.  Ordinarily you won’t create instances
specifically of @code{MIMEBase}, although you could.  @code{MIMEBase}
is provided primarily as a convenient base class for more specific
MIME-aware subclasses.

`_maintype' is the @code{Content-Type} major type (e.g. @code{text}
or @code{image}), and `_subtype' is the @code{Content-Type} minor
type  (e.g. @code{plain} or @code{gif}).  `_params' is a parameter
key/value dictionary and is passed directly to @ref{18c6,,Message.add_header}.

If `policy' is specified, (defaults to the
@ref{12c0,,compat32} policy) it will be passed to
@ref{581,,Message}.

The @code{MIMEBase} class always adds a @code{Content-Type} header
(based on `_maintype', `_subtype', and `_params'), and a
@code{MIME-Version} header (always set to @code{1.0}).


Changed in version 3.6: Added `policy' keyword-only parameter.

@end deffn

@geindex module; email.mime.nonmultipart

@geindex MIMENonMultipart (class in email.mime.nonmultipart)
@anchor{library/email mime module-email mime nonmultipart}@anchor{50}@anchor{library/email mime email mime nonmultipart MIMENonMultipart}@anchor{3bb8}
@deffn {Class} email.mime.nonmultipart.MIMENonMultipart

Module: @ref{50,,email.mime.nonmultipart}

A subclass of @ref{3c23,,MIMEBase}, this is an intermediate base
class for MIME messages that are not @code{multipart}.  The primary
purpose of this class is to prevent the use of the
@ref{3b70,,attach()} method, which only makes sense for
@code{multipart} messages.  If @code{attach()}
is called, a @ref{3bb7,,MultipartConversionError} exception is raised.
@end deffn

@geindex module; email.mime.multipart

@geindex MIMEMultipart (class in email.mime.multipart)
@anchor{library/email mime module-email mime multipart}@anchor{4f}@anchor{library/email mime email mime multipart MIMEMultipart}@anchor{3c24}
@deffn {Class} email.mime.multipart.MIMEMultipart (_subtype='mixed', boundary=None, _subparts=None, *, policy=compat32, **_params)

Module: @ref{4f,,email.mime.multipart}

A subclass of @ref{3c23,,MIMEBase}, this is an intermediate base
class for MIME messages that are @code{multipart}.  Optional `_subtype'
defaults to @code{mixed}, but can be used to specify the subtype of the
message.  A @code{Content-Type} header of @code{multipart/_subtype}
will be added to the message object.  A @code{MIME-Version} header will
also be added.

Optional `boundary' is the multipart boundary string.  When @code{None} (the
default), the boundary is calculated when needed (for example, when the
message is serialized).

`_subparts' is a sequence of initial subparts for the payload.  It must be
possible to convert this sequence to a list.  You can always attach new subparts
to the message by using the @ref{3b70,,Message.attach} method.

Optional `policy' argument defaults to @ref{12c0,,compat32}.

Additional parameters for the @code{Content-Type} header are taken from
the keyword arguments, or passed into the `_params' argument, which is a keyword
dictionary.


Changed in version 3.6: Added `policy' keyword-only parameter.

@end deffn

@geindex module; email.mime.application

@geindex MIMEApplication (class in email.mime.application)
@anchor{library/email mime module-email mime application}@anchor{4a}@anchor{library/email mime email mime application MIMEApplication}@anchor{3c25}
@deffn {Class} email.mime.application.MIMEApplication (_data, _subtype='octet-stream', _encoder=email.encoders.encode_base64, *, policy=compat32, **_params)

Module: @ref{4a,,email.mime.application}

A subclass of @ref{3bb8,,MIMENonMultipart}, the
@code{MIMEApplication} class is used to represent MIME message objects of
major type @code{application}.  `_data' contains the bytes for the raw
application data.  Optional `_subtype' specifies the MIME subtype and defaults
to @code{octet-stream}.

Optional `_encoder' is a callable (i.e. function) which will perform the actual
encoding of the data for transport.  This callable takes one argument, which is
the @code{MIMEApplication} instance. It should use
@ref{13d9,,get_payload()} and
@ref{3c01,,set_payload()} to change the payload to encoded
form.  It should also add
any @code{Content-Transfer-Encoding} or other headers to the message
object as necessary.  The default encoding is base64.  See the
@ref{42,,email.encoders} module for a list of the built-in encoders.

Optional `policy' argument defaults to @ref{12c0,,compat32}.

`_params' are passed straight through to the base class constructor.


Changed in version 3.6: Added `policy' keyword-only parameter.

@end deffn

@geindex module; email.mime.audio

@geindex MIMEAudio (class in email.mime.audio)
@anchor{library/email mime module-email mime audio}@anchor{4b}@anchor{library/email mime email mime audio MIMEAudio}@anchor{3c26}
@deffn {Class} email.mime.audio.MIMEAudio (_audiodata, _subtype=None, _encoder=email.encoders.encode_base64, *, policy=compat32, **_params)

Module: @ref{4b,,email.mime.audio}

A subclass of @ref{3bb8,,MIMENonMultipart}, the
@code{MIMEAudio} class is used to create MIME message objects of major type
@code{audio}. `_audiodata' contains the bytes for the raw audio data.  If
this data can be decoded as au, wav, aiff, or aifc, then the
subtype will be automatically included in the @code{Content-Type} header.
Otherwise you can explicitly specify the audio subtype via the `_subtype'
argument.  If the minor type could not be guessed and `_subtype' was not given,
then @ref{199,,TypeError} is raised.

Optional `_encoder' is a callable (i.e. function) which will perform the actual
encoding of the audio data for transport.  This callable takes one argument,
which is the @code{MIMEAudio} instance. It should use
@ref{13d9,,get_payload()} and
@ref{3c01,,set_payload()} to change the payload to encoded
form.  It should also add
any @code{Content-Transfer-Encoding} or other headers to the message
object as necessary.  The default encoding is base64.  See the
@ref{42,,email.encoders} module for a list of the built-in encoders.

Optional `policy' argument defaults to @ref{12c0,,compat32}.

`_params' are passed straight through to the base class constructor.


Changed in version 3.6: Added `policy' keyword-only parameter.

@end deffn

@geindex module; email.mime.image

@geindex MIMEImage (class in email.mime.image)
@anchor{library/email mime module-email mime image}@anchor{4d}@anchor{library/email mime email mime image MIMEImage}@anchor{3bb9}
@deffn {Class} email.mime.image.MIMEImage (_imagedata, _subtype=None, _encoder=email.encoders.encode_base64, *, policy=compat32, **_params)

Module: @ref{4d,,email.mime.image}

A subclass of @ref{3bb8,,MIMENonMultipart}, the
@code{MIMEImage} class is used to create MIME message objects of major type
@code{image}. `_imagedata' contains the bytes for the raw image data.  If
this data type can be detected (jpeg, png, gif, tiff, rgb, pbm, pgm, ppm,
rast, xbm, bmp, webp, and exr attempted), then the subtype will be
automatically included in the @code{Content-Type} header. Otherwise
you can explicitly specify the image subtype via the `_subtype' argument.
If the minor type could not be guessed and `_subtype' was not given, then
@ref{199,,TypeError} is raised.

Optional `_encoder' is a callable (i.e. function) which will perform the actual
encoding of the image data for transport.  This callable takes one argument,
which is the @code{MIMEImage} instance. It should use
@ref{13d9,,get_payload()} and
@ref{3c01,,set_payload()} to change the payload to encoded
form.  It should also add
any @code{Content-Transfer-Encoding} or other headers to the message
object as necessary.  The default encoding is base64.  See the
@ref{42,,email.encoders} module for a list of the built-in encoders.

Optional `policy' argument defaults to @ref{12c0,,compat32}.

`_params' are passed straight through to the @ref{3c23,,MIMEBase}
constructor.


Changed in version 3.6: Added `policy' keyword-only parameter.

@end deffn

@geindex module; email.mime.message

@geindex MIMEMessage (class in email.mime.message)
@anchor{library/email mime module-email mime message}@anchor{4e}@anchor{library/email mime email mime message MIMEMessage}@anchor{3c27}
@deffn {Class} email.mime.message.MIMEMessage (_msg, _subtype='rfc822', *, policy=compat32)

Module: @ref{4e,,email.mime.message}

A subclass of @ref{3bb8,,MIMENonMultipart}, the
@code{MIMEMessage} class is used to create MIME objects of main type
@code{message}. `_msg' is used as the payload, and must be an instance
of class @ref{581,,Message} (or a subclass thereof), otherwise
a @ref{199,,TypeError} is raised.

Optional `_subtype' sets the subtype of the message; it defaults to
@code{rfc822}.

Optional `policy' argument defaults to @ref{12c0,,compat32}.


Changed in version 3.6: Added `policy' keyword-only parameter.

@end deffn

@geindex module; email.mime.text

@geindex MIMEText (class in email.mime.text)
@anchor{library/email mime module-email mime text}@anchor{51}@anchor{library/email mime email mime text MIMEText}@anchor{1000}
@deffn {Class} email.mime.text.MIMEText (_text, _subtype='plain', _charset=None, *, policy=compat32)

Module: @ref{51,,email.mime.text}

A subclass of @ref{3bb8,,MIMENonMultipart}, the
@code{MIMEText} class is used to create MIME objects of major type
@code{text}. `_text' is the string for the payload.  `_subtype' is the
minor type and defaults to @code{plain}.  `_charset' is the character
set of the text and is passed as an argument to the
@code{MIMENonMultipart} constructor; it defaults
to @code{us-ascii} if the string contains only @code{ascii} code points, and
@code{utf-8} otherwise.  The `_charset' parameter accepts either a string or a
@ref{1001,,Charset} instance.

Unless the `_charset' argument is explicitly set to @code{None}, the
MIMEText object created will have both a @code{Content-Type} header
with a @code{charset} parameter, and a @code{Content-Transfer-Encoding}
header.  This means that a subsequent @code{set_payload} call will not result
in an encoded payload, even if a charset is passed in the @code{set_payload}
command.  You can “reset” this behavior by deleting the
@code{Content-Transfer-Encoding} header, after which a @code{set_payload} call
will automatically encode the new payload (and add a new
@code{Content-Transfer-Encoding} header).

Optional `policy' argument defaults to @ref{12c0,,compat32}.


Changed in version 3.5: `_charset' also accepts @ref{1001,,Charset} instances.



Changed in version 3.6: Added `policy' keyword-only parameter.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node email header Internationalized headers,email charset Representing character sets,email mime Creating email and MIME objects from scratch,email — An email and MIME handling package
@anchor{library/email header doc}@anchor{3c28}@anchor{library/email header email-header-internationalized-headers}@anchor{3c29}@anchor{library/email header module-email header}@anchor{45}@anchor{library/email header translation-repo}@anchor{3c2a}
@subsubsection @code{email.header}: Internationalized headers


@geindex module; email.header

`Source code:' Lib/email/header.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/email/header.py}


__________________________________________________________________


This module is part of the legacy (@code{Compat32}) email API.  In the current API
encoding and decoding of headers is handled transparently by the
dictionary-like API of the @ref{580,,EmailMessage} class.  In
addition to uses in legacy code, this module can be useful in applications that
need to completely control the character sets used when encoding headers.

The remaining text in this section is the original documentation of the module.

@geindex RFC; RFC 2822
RFC 2822@footnote{https://datatracker.ietf.org/doc/html/rfc2822.html} is the base standard that describes the format of email messages.
It derives from the older 
@geindex RFC; RFC 822
RFC 822@footnote{https://datatracker.ietf.org/doc/html/rfc822.html} standard which came into widespread use at
a time when most email was composed of ASCII characters only.  
@geindex RFC; RFC 2822
RFC 2822@footnote{https://datatracker.ietf.org/doc/html/rfc2822.html} is a
specification written assuming email contains only 7-bit ASCII characters.

Of course, as email has been deployed worldwide, it has become
internationalized, such that language specific character sets can now be used in
email messages.  The base standard still requires email messages to be
transferred using only 7-bit ASCII characters, so a slew of RFCs have been
written describing how to encode email containing non-ASCII characters into
@geindex RFC; RFC 2822
RFC 2822@footnote{https://datatracker.ietf.org/doc/html/rfc2822.html}-compliant format. These RFCs include 
@geindex RFC; RFC 2045
RFC 2045@footnote{https://datatracker.ietf.org/doc/html/rfc2045.html}, 
@geindex RFC; RFC 2046
RFC 2046@footnote{https://datatracker.ietf.org/doc/html/rfc2046.html},
@geindex RFC; RFC 2047
RFC 2047@footnote{https://datatracker.ietf.org/doc/html/rfc2047.html}, and 
@geindex RFC; RFC 2231
RFC 2231@footnote{https://datatracker.ietf.org/doc/html/rfc2231.html}. The @ref{3f,,email} package supports these standards
in its @code{email.header} and @ref{40,,email.charset} modules.

If you want to include non-ASCII characters in your email headers, say in the
@code{Subject} or @code{To} fields, you should use the
@ref{1ca1,,Header} class and assign the field in the @ref{581,,Message}
object to an instance of @code{Header} instead of using a string for the header
value.  Import the @code{Header} class from the @code{email.header} module.
For example:

@example
>>> from email.message import Message
>>> from email.header import Header
>>> msg = Message()
>>> h = Header('p\xf6stal', 'iso-8859-1')
>>> msg['Subject'] = h
>>> msg.as_string()
'Subject: =?iso-8859-1?q?p=F6stal?=\n\n'
@end example

Notice here how we wanted the @code{Subject} field to contain a non-ASCII
character?  We did this by creating a @ref{1ca1,,Header} instance and passing in
the character set that the byte string was encoded in.  When the subsequent
@ref{581,,Message} instance was flattened, the @code{Subject}
field was properly 
@geindex RFC; RFC 2047
RFC 2047@footnote{https://datatracker.ietf.org/doc/html/rfc2047.html} encoded.  MIME-aware mail readers would show this
header using the embedded ISO-8859-1 character.

Here is the @ref{1ca1,,Header} class description:

@geindex Header (class in email.header)
@anchor{library/email header email header Header}@anchor{1ca1}
@deffn {Class} email.header.Header (s=None, charset=None, maxlinelen=None, header_name=None, continuation_ws=' ', errors='strict')

Create a MIME-compliant header that can contain strings in different character
sets.

Optional `s' is the initial header value.  If @code{None} (the default), the
initial header value is not set.  You can later append to the header with
@ref{3c2b,,append()} method calls.  `s' may be an instance of @ref{193,,bytes} or
@ref{16a,,str}, but see the @code{append()} documentation for semantics.

Optional `charset' serves two purposes: it has the same meaning as the `charset'
argument to the @ref{3c2b,,append()} method.  It also sets the default character set
for all subsequent @code{append()} calls that omit the `charset' argument.  If
`charset' is not provided in the constructor (the default), the @code{us-ascii}
character set is used both as `s'’s initial charset and as the default for
subsequent @code{append()} calls.

The maximum line length can be specified explicitly via `maxlinelen'.  For
splitting the first line to a shorter value (to account for the field header
which isn’t included in `s', e.g. @code{Subject}) pass in the name of the
field in `header_name'.  The default `maxlinelen' is 78, and the default value
for `header_name' is @code{None}, meaning it is not taken into account for the
first line of a long, split header.

Optional `continuation_ws' must be 
@geindex RFC; RFC 2822
RFC 2822@footnote{https://datatracker.ietf.org/doc/html/rfc2822.html}-compliant folding
whitespace, and is usually either a space or a hard tab character.  This
character will be prepended to continuation lines.  `continuation_ws'
defaults to a single space character.

Optional `errors' is passed straight through to the @ref{3c2b,,append()} method.

@geindex append() (email.header.Header method)
@anchor{library/email header email header Header append}@anchor{3c2b}
@deffn {Method} append (s, charset=None, errors='strict')

Append the string `s' to the MIME header.

Optional `charset', if given, should be a @ref{1001,,Charset}
instance (see @ref{40,,email.charset}) or the name of a character set, which
will be converted to a @code{Charset} instance.  A value
of @code{None} (the default) means that the `charset' given in the constructor
is used.

`s' may be an instance of @ref{193,,bytes} or @ref{16a,,str}.  If it is an
instance of @code{bytes}, then `charset' is the encoding of that byte
string, and a @ref{460,,UnicodeError} will be raised if the string cannot be
decoded with that character set.

If `s' is an instance of @ref{16a,,str}, then `charset' is a hint specifying
the character set of the characters in the string.

In either case, when producing an 
@geindex RFC; RFC 2822
RFC 2822@footnote{https://datatracker.ietf.org/doc/html/rfc2822.html}-compliant header using
@geindex RFC; RFC 2047
RFC 2047@footnote{https://datatracker.ietf.org/doc/html/rfc2047.html} rules, the string will be encoded using the output codec of
the charset.  If the string cannot be encoded using the output codec, a
UnicodeError will be raised.

Optional `errors' is passed as the errors argument to the decode call
if `s' is a byte string.
@end deffn

@geindex encode() (email.header.Header method)
@anchor{library/email header email header Header encode}@anchor{3c2c}
@deffn {Method} encode (splitchars=';, \t', maxlinelen=None, linesep='\n')

Encode a message header into an RFC-compliant format, possibly wrapping
long lines and encapsulating non-ASCII parts in base64 or quoted-printable
encodings.

Optional `splitchars' is a string containing characters which should be
given extra weight by the splitting algorithm during normal header
wrapping.  This is in very rough support of 
@geindex RFC; RFC 2822
RFC 2822@footnote{https://datatracker.ietf.org/doc/html/rfc2822.html}'s ‘higher level
syntactic breaks’:  split points preceded by a splitchar are preferred
during line splitting, with the characters preferred in the order in
which they appear in the string.  Space and tab may be included in the
string to indicate whether preference should be given to one over the
other as a split point when other split chars do not appear in the line
being split.  Splitchars does not affect 
@geindex RFC; RFC 2047
RFC 2047@footnote{https://datatracker.ietf.org/doc/html/rfc2047.html} encoded lines.

`maxlinelen', if given, overrides the instance’s value for the maximum
line length.

`linesep' specifies the characters used to separate the lines of the
folded header.  It defaults to the most useful value for Python
application code (@code{\n}), but @code{\r\n} can be specified in order
to produce headers with RFC-compliant line separators.


Changed in version 3.2: Added the `linesep' argument.

@end deffn

The @code{Header} class also provides a number of methods to support
standard operators and built-in functions.

@geindex __str__() (email.header.Header method)
@anchor{library/email header email header Header __str__}@anchor{3c2d}
@deffn {Method} __str__ ()

Returns an approximation of the @code{Header} as a string, using an
unlimited line length.  All pieces are converted to unicode using the
specified encoding and joined together appropriately.  Any pieces with a
charset of @code{'unknown-8bit'} are decoded as ASCII using the @code{'replace'}
error handler.


Changed in version 3.2: Added handling for the @code{'unknown-8bit'} charset.

@end deffn

@geindex __eq__() (email.header.Header method)
@anchor{library/email header email header Header __eq__}@anchor{3c2e}
@deffn {Method} __eq__ (other)

This method allows you to compare two @code{Header} instances for
equality.
@end deffn

@geindex __ne__() (email.header.Header method)
@anchor{library/email header email header Header __ne__}@anchor{3c2f}
@deffn {Method} __ne__ (other)

This method allows you to compare two @code{Header} instances for
inequality.
@end deffn
@end deffn

The @code{email.header} module also provides the following convenient functions.

@geindex decode_header() (in module email.header)
@anchor{library/email header email header decode_header}@anchor{12c4}
@deffn {Function} email.header.decode_header (header)

Decode a message header value without converting the character set. The header
value is in `header'.

For historical reasons, this function may return either:


@enumerate 

@item 
A list of pairs containing each of the decoded parts of the header,
@code{(decoded_bytes, charset)}, where `decoded_bytes' is always an instance of
@ref{193,,bytes}, and `charset' is either:

@quotation


@itemize -

@item 
A lower case string containing the name of the character set specified.

@item 
@code{None} for non-encoded parts of the header.
@end itemize
@end quotation

@item 
A list of length 1 containing a pair @code{(string, None)}, where
`string' is always an instance of @ref{16a,,str}.
@end enumerate

An @ref{3b5f,,email.errors.HeaderParseError} may be raised when certain decoding
errors occur (e.g. a base64 decoding exception).

Here are examples:

@example
>>> from email.header import decode_header
>>> decode_header('=?iso-8859-1?q?p=F6stal?=')
[(b'p\xf6stal', 'iso-8859-1')]
>>> decode_header('unencoded_string')
[('unencoded_string', None)]
>>> decode_header('bar =?utf-8?B?ZsOzbw==?=')
[(b'bar ', None), (b'f\xc3\xb3o', 'utf-8')]
@end example

@cartouche
@quotation Note 
This function exists for backwards compatibility only. For
new code, we recommend using @ref{3bc9,,email.headerregistry.HeaderRegistry}.
@end quotation
@end cartouche
@end deffn

@geindex make_header() (in module email.header)
@anchor{library/email header email header make_header}@anchor{12c5}
@deffn {Function} email.header.make_header (decoded_seq, maxlinelen=None, header_name=None, continuation_ws=' ')

Create a @ref{1ca1,,Header} instance from a sequence of pairs as returned by
@ref{12c4,,decode_header()}.

@ref{12c4,,decode_header()} takes a header value string and returns a sequence of
pairs of the format @code{(decoded_string, charset)} where `charset' is the name of
the character set.

This function takes one of those sequence of pairs and returns a
@ref{1ca1,,Header} instance.  Optional `maxlinelen', `header_name', and
`continuation_ws' are as in the @code{Header} constructor.

@cartouche
@quotation Note 
This function exists for backwards compatibility only, and is
not recommended for use in new code.
@end quotation
@end cartouche
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node email charset Representing character sets,email encoders Encoders,email header Internationalized headers,email — An email and MIME handling package
@anchor{library/email charset doc}@anchor{3c30}@anchor{library/email charset email-charset-representing-character-sets}@anchor{3c31}@anchor{library/email charset module-email charset}@anchor{40}@anchor{library/email charset translation-repo}@anchor{3c32}
@subsubsection @code{email.charset}: Representing character sets


@geindex module; email.charset

`Source code:' Lib/email/charset.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/email/charset.py}


__________________________________________________________________


This module is part of the legacy (@code{Compat32}) email API.  In the new
API only the aliases table is used.

The remaining text in this section is the original documentation of the module.

This module provides a class @ref{1001,,Charset} for representing character sets
and character set conversions in email messages, as well as a character set
registry and several convenience methods for manipulating this registry.
Instances of @code{Charset} are used in several other modules within the
@ref{3f,,email} package.

Import this class from the @code{email.charset} module.

@geindex Charset (class in email.charset)
@anchor{library/email charset email charset Charset}@anchor{1001}
@deffn {Class} email.charset.Charset (input_charset=DEFAULT_CHARSET)

Map character sets to their email properties.

This class provides information about the requirements imposed on email for a
specific character set.  It also provides convenience routines for converting
between character sets, given the availability of the applicable codecs.  Given
a character set, it will do its best to provide information on how to use that
character set in an email message in an RFC-compliant way.

Certain character sets must be encoded with quoted-printable or base64 when used
in email headers or bodies.  Certain character sets must be converted outright,
and are not allowed in email.

Optional `input_charset' is as described below; it is always coerced to lower
case.  After being alias normalized it is also used as a lookup into the
registry of character sets to find out the header encoding, body encoding, and
output conversion codec to be used for the character set.  For example, if
`input_charset' is @code{iso-8859-1}, then headers and bodies will be encoded using
quoted-printable and no output conversion codec is necessary.  If
`input_charset' is @code{euc-jp}, then headers will be encoded with base64, bodies
will not be encoded, but output text will be converted from the @code{euc-jp}
character set to the @code{iso-2022-jp} character set.

@code{Charset} instances have the following data attributes:

@geindex input_charset (email.charset.Charset attribute)
@anchor{library/email charset email charset Charset input_charset}@anchor{3c33}
@deffn {Attribute} input_charset

The initial character set specified.  Common aliases are converted to
their `official' email names (e.g. @code{latin_1} is converted to
@code{iso-8859-1}).  Defaults to 7-bit @code{us-ascii}.
@end deffn

@geindex header_encoding (email.charset.Charset attribute)
@anchor{library/email charset email charset Charset header_encoding}@anchor{3c34}
@deffn {Attribute} header_encoding

If the character set must be encoded before it can be used in an email
header, this attribute will be set to @code{charset.QP} (for
quoted-printable), @code{charset.BASE64} (for base64 encoding), or
@code{charset.SHORTEST} for the shortest of QP or BASE64 encoding. Otherwise,
it will be @code{None}.
@end deffn

@geindex body_encoding (email.charset.Charset attribute)
@anchor{library/email charset email charset Charset body_encoding}@anchor{3c35}
@deffn {Attribute} body_encoding

Same as `header_encoding', but describes the encoding for the mail
message’s body, which indeed may be different than the header encoding.
@code{charset.SHORTEST} is not allowed for `body_encoding'.
@end deffn

@geindex output_charset (email.charset.Charset attribute)
@anchor{library/email charset email charset Charset output_charset}@anchor{3c36}
@deffn {Attribute} output_charset

Some character sets must be converted before they can be used in email
headers or bodies.  If the `input_charset' is one of them, this attribute
will contain the name of the character set output will be converted to.
Otherwise, it will be @code{None}.
@end deffn

@geindex input_codec (email.charset.Charset attribute)
@anchor{library/email charset email charset Charset input_codec}@anchor{3c37}
@deffn {Attribute} input_codec

The name of the Python codec used to convert the `input_charset' to
Unicode.  If no conversion codec is necessary, this attribute will be
@code{None}.
@end deffn

@geindex output_codec (email.charset.Charset attribute)
@anchor{library/email charset email charset Charset output_codec}@anchor{3c38}
@deffn {Attribute} output_codec

The name of the Python codec used to convert Unicode to the
`output_charset'.  If no conversion codec is necessary, this attribute
will have the same value as the `input_codec'.
@end deffn

@code{Charset} instances also have the following methods:

@geindex get_body_encoding() (email.charset.Charset method)
@anchor{library/email charset email charset Charset get_body_encoding}@anchor{3c39}
@deffn {Method} get_body_encoding ()

Return the content transfer encoding used for body encoding.

This is either the string @code{quoted-printable} or @code{base64} depending on
the encoding used, or it is a function, in which case you should call the
function with a single argument, the Message object being encoded.  The
function should then set the @code{Content-Transfer-Encoding}
header itself to whatever is appropriate.

Returns the string @code{quoted-printable} if `body_encoding' is @code{QP},
returns the string @code{base64} if `body_encoding' is @code{BASE64}, and
returns the string @code{7bit} otherwise.
@end deffn

@geindex get_output_charset() (email.charset.Charset method)
@anchor{library/email charset email charset Charset get_output_charset}@anchor{3c3a}
@deffn {Method} get_output_charset ()

Return the output character set.

This is the `output_charset' attribute if that is not @code{None}, otherwise
it is `input_charset'.
@end deffn

@geindex header_encode() (email.charset.Charset method)
@anchor{library/email charset email charset Charset header_encode}@anchor{3c3b}
@deffn {Method} header_encode (string)

Header-encode the string `string'.

The type of encoding (base64 or quoted-printable) will be based on the
`header_encoding' attribute.
@end deffn

@geindex header_encode_lines() (email.charset.Charset method)
@anchor{library/email charset email charset Charset header_encode_lines}@anchor{3c3c}
@deffn {Method} header_encode_lines (string, maxlengths)

Header-encode a `string' by converting it first to bytes.

This is similar to @ref{3c3b,,header_encode()} except that the string is fit
into maximum line lengths as given by the argument `maxlengths', which
must be an iterator: each element returned from this iterator will provide
the next maximum line length.
@end deffn

@geindex body_encode() (email.charset.Charset method)
@anchor{library/email charset email charset Charset body_encode}@anchor{3c3d}
@deffn {Method} body_encode (string)

Body-encode the string `string'.

The type of encoding (base64 or quoted-printable) will be based on the
`body_encoding' attribute.
@end deffn

The @code{Charset} class also provides a number of methods to support
standard operations and built-in functions.

@geindex __str__() (email.charset.Charset method)
@anchor{library/email charset email charset Charset __str__}@anchor{3c3e}
@deffn {Method} __str__ ()

Returns `input_charset' as a string coerced to lower
case. @code{__repr__()} is an alias for @code{__str__()}.
@end deffn

@geindex __eq__() (email.charset.Charset method)
@anchor{library/email charset email charset Charset __eq__}@anchor{3c3f}
@deffn {Method} __eq__ (other)

This method allows you to compare two @code{Charset} instances for
equality.
@end deffn

@geindex __ne__() (email.charset.Charset method)
@anchor{library/email charset email charset Charset __ne__}@anchor{3c40}
@deffn {Method} __ne__ (other)

This method allows you to compare two @code{Charset} instances for
inequality.
@end deffn
@end deffn

The @code{email.charset} module also provides the following functions for adding
new entries to the global character set, alias, and codec registries:

@geindex add_charset() (in module email.charset)
@anchor{library/email charset email charset add_charset}@anchor{3c41}
@deffn {Function} email.charset.add_charset (charset, header_enc=None, body_enc=None, output_charset=None)

Add character properties to the global registry.

`charset' is the input character set, and must be the canonical name of a
character set.

Optional `header_enc' and `body_enc' is either @code{charset.QP} for
quoted-printable, @code{charset.BASE64} for base64 encoding,
@code{charset.SHORTEST} for the shortest of quoted-printable or base64 encoding,
or @code{None} for no encoding.  @code{SHORTEST} is only valid for
`header_enc'. The default is @code{None} for no encoding.

Optional `output_charset' is the character set that the output should be in.
Conversions will proceed from input charset, to Unicode, to the output charset
when the method @code{Charset.convert()} is called.  The default is to output in
the same character set as the input.

Both `input_charset' and `output_charset' must have Unicode codec entries in the
module’s character set-to-codec mapping; use @ref{3c42,,add_codec()} to add codecs the
module does not know about.  See the @ref{1c,,codecs} module’s documentation for
more information.

The global character set registry is kept in the module global dictionary
@code{CHARSETS}.
@end deffn

@geindex add_alias() (in module email.charset)
@anchor{library/email charset email charset add_alias}@anchor{3c43}
@deffn {Function} email.charset.add_alias (alias, canonical)

Add a character set alias.  `alias' is the alias name, e.g. @code{latin-1}.
`canonical' is the character set’s canonical name, e.g. @code{iso-8859-1}.

The global charset alias registry is kept in the module global dictionary
@code{ALIASES}.
@end deffn

@geindex add_codec() (in module email.charset)
@anchor{library/email charset email charset add_codec}@anchor{3c42}
@deffn {Function} email.charset.add_codec (charset, codecname)

Add a codec that map characters in the given character set to and from Unicode.

`charset' is the canonical name of a character set. `codecname' is the name of a
Python codec, as appropriate for the second argument to the @ref{16a,,str}’s
@ref{ad8,,encode()} method.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node email encoders Encoders,email utils Miscellaneous utilities,email charset Representing character sets,email — An email and MIME handling package
@anchor{library/email encoders doc}@anchor{3c44}@anchor{library/email encoders email-encoders-encoders}@anchor{3c45}@anchor{library/email encoders module-email encoders}@anchor{42}@anchor{library/email encoders translation-repo}@anchor{3c46}
@subsubsection @code{email.encoders}: Encoders


@geindex module; email.encoders

`Source code:' Lib/email/encoders.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/email/encoders.py}


__________________________________________________________________


This module is part of the legacy (@code{Compat32}) email API.  In the
new API the functionality is provided by the `cte' parameter of
the @ref{1ca0,,set_content()} method.

This module is deprecated in Python 3.  The functions provided here
should not be called explicitly since the @ref{1000,,MIMEText}
class sets the content type and CTE header using the `_subtype' and `_charset'
values passed during the instantiation of that class.

The remaining text in this section is the original documentation of the module.

When creating @ref{581,,Message} objects from scratch, you often
need to encode the payloads for transport through compliant mail servers. This
is especially true for @code{image/*} and @code{text/*} type messages
containing binary data.

The @ref{3f,,email} package provides some convenient encoders in its
@code{encoders} module.  These encoders are actually used by the
@ref{3c26,,MIMEAudio} and @ref{3bb9,,MIMEImage}
class constructors to provide default encodings.  All encoder functions take
exactly one argument, the message object to encode.  They usually extract the
payload, encode it, and reset the payload to this newly encoded value.  They
should also set the @code{Content-Transfer-Encoding} header as appropriate.

Note that these functions are not meaningful for a multipart message.  They
must be applied to individual subparts instead, and will raise a
@ref{199,,TypeError} if passed a message whose type is multipart.

Here are the encoding functions provided:

@geindex encode_quopri() (in module email.encoders)
@anchor{library/email encoders email encoders encode_quopri}@anchor{3c47}
@deffn {Function} email.encoders.encode_quopri (msg)

Encodes the payload into quoted-printable form and sets the
@code{Content-Transfer-Encoding} header to @code{quoted-printable} @footnote{
Note that encoding with @ref{3c47,,encode_quopri()} also encodes all tabs and space
characters in the data.
}.
This is a good encoding to use when most of your payload is normal printable
data, but contains a few unprintable characters.
@end deffn

@geindex encode_base64() (in module email.encoders)
@anchor{library/email encoders email encoders encode_base64}@anchor{3c48}
@deffn {Function} email.encoders.encode_base64 (msg)

Encodes the payload into base64 form and sets the
@code{Content-Transfer-Encoding} header to @code{base64}.  This is a good
encoding to use when most of your payload is unprintable data since it is a more
compact form than quoted-printable.  The drawback of base64 encoding is that it
renders the text non-human readable.
@end deffn

@geindex encode_7or8bit() (in module email.encoders)
@anchor{library/email encoders email encoders encode_7or8bit}@anchor{3c49}
@deffn {Function} email.encoders.encode_7or8bit (msg)

This doesn’t actually modify the message’s payload, but it does set the
@code{Content-Transfer-Encoding} header to either @code{7bit} or @code{8bit} as
appropriate, based on the payload data.
@end deffn

@geindex encode_noop() (in module email.encoders)
@anchor{library/email encoders email encoders encode_noop}@anchor{3c4a}
@deffn {Function} email.encoders.encode_noop (msg)

This does nothing; it doesn’t even set the
@code{Content-Transfer-Encoding} header.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node email utils Miscellaneous utilities,email iterators Iterators,email encoders Encoders,email — An email and MIME handling package
@anchor{library/email utils doc}@anchor{3c4b}@anchor{library/email utils email-utils-miscellaneous-utilities}@anchor{3c4c}@anchor{library/email utils module-email utils}@anchor{54}@anchor{library/email utils translation-repo}@anchor{3c4d}
@subsubsection @code{email.utils}: Miscellaneous utilities


@geindex module; email.utils

`Source code:' Lib/email/utils.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/email/utils.py}


__________________________________________________________________


There are a couple of useful utilities provided in the @code{email.utils}
module:

@geindex localtime() (in module email.utils)
@anchor{library/email utils email utils localtime}@anchor{2f9}
@deffn {Function} email.utils.localtime (dt=None)

Return local time as an aware datetime object.  If called without
arguments, return current time.  Otherwise `dt' argument should be a
@ref{4e3,,datetime} instance, and it is converted to the local time
zone according to the system time zone database.  If `dt' is naive (that
is, @code{dt.tzinfo} is @code{None}), it is assumed to be in local time.


Added in version 3.3.



Deprecated since version 3.12, removed in version 3.14: The `isdst' parameter.

@end deffn

@geindex make_msgid() (in module email.utils)
@anchor{library/email utils email utils make_msgid}@anchor{3c4e}
@deffn {Function} email.utils.make_msgid (idstring=None, domain=None)

Returns a string suitable for an 
@geindex RFC; RFC 2822
RFC 2822@footnote{https://datatracker.ietf.org/doc/html/rfc2822.html}-compliant
@code{Message-ID} header.  Optional `idstring' if given, is a string
used to strengthen the uniqueness of the message id.  Optional `domain' if
given provides the portion of the msgid after the ‘@@’.  The default is the
local hostname.  It is not normally necessary to override this default, but
may be useful certain cases, such as a constructing distributed system that
uses a consistent domain name across multiple hosts.


Changed in version 3.2: Added the `domain' keyword.

@end deffn

The remaining functions are part of the legacy (@code{Compat32}) email API.  There
is no need to directly use these with the new API, since the parsing and
formatting they provide is done automatically by the header parsing machinery
of the new API.

@geindex quote() (in module email.utils)
@anchor{library/email utils email utils quote}@anchor{3c4f}
@deffn {Function} email.utils.quote (str)

Return a new string with backslashes in `str' replaced by two backslashes, and
double quotes replaced by backslash-double quote.
@end deffn

@geindex unquote() (in module email.utils)
@anchor{library/email utils email utils unquote}@anchor{3b5c}
@deffn {Function} email.utils.unquote (str)

Return a new string which is an `unquoted' version of `str'. If `str' ends and
begins with double quotes, they are stripped off.  Likewise if `str' ends and
begins with angle brackets, they are stripped off.
@end deffn

@geindex parseaddr() (in module email.utils)
@anchor{library/email utils email utils parseaddr}@anchor{4f5}
@deffn {Function} email.utils.parseaddr (address, *, strict=True)

Parse address – which should be the value of some address-containing field such
as @code{To} or @code{Cc} – into its constituent `realname' and
`email address' parts.  Returns a tuple of that information, unless the parse
fails, in which case a 2-tuple of @code{('@w{'}, '@w{'})} is returned.

If `strict' is true, use a strict parser which rejects malformed inputs.


Changed in version 3.13: Add `strict' optional parameter and reject malformed inputs by default.

@end deffn

@geindex formataddr() (in module email.utils)
@anchor{library/email utils email utils formataddr}@anchor{13a6}
@deffn {Function} email.utils.formataddr (pair, charset='utf-8')

The inverse of @ref{4f5,,parseaddr()}, this takes a 2-tuple of the form @code{(realname,
email_address)} and returns the string value suitable for a @code{To} or
@code{Cc} header.  If the first element of `pair' is false, then the
second element is returned unmodified.

Optional `charset' is the character set that will be used in the 
@geindex RFC; RFC 2047
RFC 2047@footnote{https://datatracker.ietf.org/doc/html/rfc2047.html}
encoding of the @code{realname} if the @code{realname} contains non-ASCII
characters.  Can be an instance of @ref{16a,,str} or a
@ref{1001,,Charset}.  Defaults to @code{utf-8}.


Changed in version 3.3: Added the `charset' option.

@end deffn

@geindex getaddresses() (in module email.utils)
@anchor{library/email utils email utils getaddresses}@anchor{4f4}
@deffn {Function} email.utils.getaddresses (fieldvalues, *, strict=True)

This method returns a list of 2-tuples of the form returned by @code{parseaddr()}.
`fieldvalues' is a sequence of header field values as might be returned by
@ref{3c07,,Message.get_all}.

If `strict' is true, use a strict parser which rejects malformed inputs.

Here’s a simple example that gets all the recipients of a message:

@example
from email.utils import getaddresses

tos = msg.get_all('to', [])
ccs = msg.get_all('cc', [])
resent_tos = msg.get_all('resent-to', [])
resent_ccs = msg.get_all('resent-cc', [])
all_recipients = getaddresses(tos + ccs + resent_tos + resent_ccs)
@end example


Changed in version 3.13: Add `strict' optional parameter and reject malformed inputs by default.

@end deffn

@geindex parsedate() (in module email.utils)
@anchor{library/email utils email utils parsedate}@anchor{3c50}
@deffn {Function} email.utils.parsedate (date)

Attempts to parse a date according to the rules in 
@geindex RFC; RFC 2822
RFC 2822@footnote{https://datatracker.ietf.org/doc/html/rfc2822.html}. however, some
mailers don’t follow that format as specified, so @code{parsedate()} tries to
guess correctly in such cases.  `date' is a string containing an 
@geindex RFC; RFC 2822
RFC 2822@footnote{https://datatracker.ietf.org/doc/html/rfc2822.html}
date, such as  @code{"Mon, 20 Nov 1995 19:12:08 -0500"}.  If it succeeds in parsing
the date, @code{parsedate()} returns a 9-tuple that can be passed directly to
@ref{13f4,,time.mktime()}; otherwise @code{None} will be returned.  Note that indexes 6,
7, and 8 of the result tuple are not usable.
@end deffn

@geindex parsedate_tz() (in module email.utils)
@anchor{library/email utils email utils parsedate_tz}@anchor{1c66}
@deffn {Function} email.utils.parsedate_tz (date)

Performs the same function as @ref{3c50,,parsedate()}, but returns either @code{None} or
a 10-tuple; the first 9 elements make up a tuple that can be passed directly to
@ref{13f4,,time.mktime()}, and the tenth is the offset of the date’s timezone from UTC
(which is the official term for Greenwich Mean Time) @footnote{
Note that the sign of the timezone offset is the opposite of the sign of the
@code{time.timezone} variable for the same timezone; the latter variable follows
the POSIX standard while this module follows 
@geindex RFC; RFC 2822
@uref{https://datatracker.ietf.org/doc/html/rfc2822.html,RFC 2822}.
}.  If the input string
has no timezone, the last element of the tuple returned is @code{0}, which represents
UTC. Note that indexes 6, 7, and 8 of the result tuple are not usable.
@end deffn

@geindex parsedate_to_datetime() (in module email.utils)
@anchor{library/email utils email utils parsedate_to_datetime}@anchor{12ca}
@deffn {Function} email.utils.parsedate_to_datetime (date)

The inverse of @ref{12c9,,format_datetime()}.  Performs the same function as
@ref{3c50,,parsedate()}, but on success returns a @ref{4e3,,datetime};
otherwise @code{ValueError} is raised if `date' contains an invalid value such
as an hour greater than 23 or a timezone offset not between -24 and 24 hours.
If the input date has a timezone of @code{-0000}, the @code{datetime} will be a naive
@code{datetime}, and if the date is conforming to the RFCs it will represent a
time in UTC but with no indication of the actual source timezone of the
message the date comes from.  If the input date has any other valid timezone
offset, the @code{datetime} will be an aware @code{datetime} with the
corresponding a @ref{12cb,,timezone} @ref{7f7,,tzinfo}.


Added in version 3.3.

@end deffn

@geindex mktime_tz() (in module email.utils)
@anchor{library/email utils email utils mktime_tz}@anchor{3c51}
@deffn {Function} email.utils.mktime_tz (tuple)

Turn a 10-tuple as returned by @ref{1c66,,parsedate_tz()} into a UTC
timestamp (seconds since the Epoch).  If the timezone item in the
tuple is @code{None}, assume local time.
@end deffn

@geindex formatdate() (in module email.utils)
@anchor{library/email utils email utils formatdate}@anchor{1676}
@deffn {Function} email.utils.formatdate (timeval=None, localtime=False, usegmt=False)

Returns a date string as per 
@geindex RFC; RFC 2822
RFC 2822@footnote{https://datatracker.ietf.org/doc/html/rfc2822.html}, e.g.:

@example
Fri, 09 Nov 2001 01:08:47 -0000
@end example

Optional `timeval' if given is a floating-point time value as accepted by
@ref{13cc,,time.gmtime()} and @ref{1705,,time.localtime()}, otherwise the current time is
used.

Optional `localtime' is a flag that when @code{True}, interprets `timeval', and
returns a date relative to the local timezone instead of UTC, properly taking
daylight savings time into account. The default is @code{False} meaning UTC is
used.

Optional `usegmt' is a flag that when @code{True}, outputs a  date string with the
timezone as an ascii string @code{GMT}, rather than a numeric @code{-0000}. This is
needed for some protocols (such as HTTP). This only applies when `localtime' is
@code{False}.  The default is @code{False}.
@end deffn

@geindex format_datetime() (in module email.utils)
@anchor{library/email utils email utils format_datetime}@anchor{12c9}
@deffn {Function} email.utils.format_datetime (dt, usegmt=False)

Like @code{formatdate}, but the input is a @ref{34,,datetime} instance.  If it is
a naive datetime, it is assumed to be “UTC with no information about the
source timezone”, and the conventional @code{-0000} is used for the timezone.
If it is an aware @code{datetime}, then the numeric timezone offset is used.
If it is an aware timezone with offset zero, then `usegmt' may be set to
@code{True}, in which case the string @code{GMT} is used instead of the numeric
timezone offset.  This provides a way to generate standards conformant HTTP
date headers.


Added in version 3.3.

@end deffn

@geindex decode_rfc2231() (in module email.utils)
@anchor{library/email utils email utils decode_rfc2231}@anchor{3c52}
@deffn {Function} email.utils.decode_rfc2231 (s)

Decode the string `s' according to 
@geindex RFC; RFC 2231
RFC 2231@footnote{https://datatracker.ietf.org/doc/html/rfc2231.html}.
@end deffn

@geindex encode_rfc2231() (in module email.utils)
@anchor{library/email utils email utils encode_rfc2231}@anchor{3c53}
@deffn {Function} email.utils.encode_rfc2231 (s, charset=None, language=None)

Encode the string `s' according to 
@geindex RFC; RFC 2231
RFC 2231@footnote{https://datatracker.ietf.org/doc/html/rfc2231.html}.  Optional `charset' and
`language', if given is the character set name and language name to use.  If
neither is given, `s' is returned as-is.  If `charset' is given but `language'
is not, the string is encoded using the empty string for `language'.
@end deffn

@geindex collapse_rfc2231_value() (in module email.utils)
@anchor{library/email utils email utils collapse_rfc2231_value}@anchor{3c14}
@deffn {Function} email.utils.collapse_rfc2231_value (value, errors='replace', fallback_charset='us-ascii')

When a header parameter is encoded in 
@geindex RFC; RFC 2231
RFC 2231@footnote{https://datatracker.ietf.org/doc/html/rfc2231.html} format,
@ref{3c13,,Message.get_param} may return a
3-tuple containing the character set,
language, and value.  @code{collapse_rfc2231_value()} turns this into a unicode
string.  Optional `errors' is passed to the `errors' argument of @ref{16a,,str}’s
@ref{ad8,,encode()} method; it defaults to @code{'replace'}.  Optional
`fallback_charset' specifies the character set to use if the one in the
@geindex RFC; RFC 2231
RFC 2231@footnote{https://datatracker.ietf.org/doc/html/rfc2231.html} header is not known by Python; it defaults to @code{'us-ascii'}.

For convenience, if the `value' passed to @code{collapse_rfc2231_value()} is not
a tuple, it should be a string and it is returned unquoted.
@end deffn

@geindex decode_params() (in module email.utils)
@anchor{library/email utils email utils decode_params}@anchor{186e}
@deffn {Function} email.utils.decode_params (params)

Decode parameters list according to 
@geindex RFC; RFC 2231
RFC 2231@footnote{https://datatracker.ietf.org/doc/html/rfc2231.html}.  `params' is a sequence of
2-tuples containing elements of the form @code{(content-type, string-value)}.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node email iterators Iterators,,email utils Miscellaneous utilities,email — An email and MIME handling package
@anchor{library/email iterators doc}@anchor{3c54}@anchor{library/email iterators email-iterators-iterators}@anchor{3c55}@anchor{library/email iterators module-email iterators}@anchor{47}@anchor{library/email iterators translation-repo}@anchor{3c56}
@subsubsection @code{email.iterators}: Iterators


@geindex module; email.iterators

`Source code:' Lib/email/iterators.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/email/iterators.py}


__________________________________________________________________


Iterating over a message object tree is fairly easy with the
@ref{3c1c,,Message.walk} method.  The
@code{email.iterators} module provides some useful higher level iterations over
message object trees.

@geindex body_line_iterator() (in module email.iterators)
@anchor{library/email iterators email iterators body_line_iterator}@anchor{3c57}
@deffn {Function} email.iterators.body_line_iterator (msg, decode=False)

This iterates over all the payloads in all the subparts of `msg', returning the
string payloads line-by-line.  It skips over all the subpart headers, and it
skips over any subpart with a payload that isn’t a Python string.  This is
somewhat equivalent to reading the flat text representation of the message from
a file using @ref{20ea,,readline()}, skipping over all the
intervening headers.

Optional `decode' is passed through to @ref{13d9,,Message.get_payload}.
@end deffn

@geindex typed_subpart_iterator() (in module email.iterators)
@anchor{library/email iterators email iterators typed_subpart_iterator}@anchor{3c58}
@deffn {Function} email.iterators.typed_subpart_iterator (msg, maintype='text', subtype=None)

This iterates over all the subparts of `msg', returning only those subparts that
match the MIME type specified by `maintype' and `subtype'.

Note that `subtype' is optional; if omitted, then subpart MIME type matching is
done only with the main type.  `maintype' is optional too; it defaults to
@code{text}.

Thus, by default @code{typed_subpart_iterator()} returns each subpart that has a
MIME type of @code{text/*}.
@end deffn

The following function has been added as a useful debugging tool.  It should
`not' be considered part of the supported public interface for the package.

@geindex _structure() (in module email.iterators)
@anchor{library/email iterators email iterators _structure}@anchor{3c59}
@deffn {Function} email.iterators._structure (msg, fp=None, level=0, include_default=False)

Prints an indented representation of the content types of the message object
structure.  For example:

@c import email
@c from email.iterators import _structure
@c somefile = open('../Lib/test/test_email/data/msg_02.txt')

@example
>>> msg = email.message_from_file(somefile)
>>> _structure(msg)
multipart/mixed
    text/plain
    text/plain
    multipart/digest
        message/rfc822
            text/plain
        message/rfc822
            text/plain
        message/rfc822
            text/plain
        message/rfc822
            text/plain
        message/rfc822
            text/plain
    text/plain
@end example

@c somefile.close()

Optional `fp' is a file-like object to print the output to.  It must be
suitable for Python’s @ref{117b,,print()} function.  `level' is used internally.
`include_default', if true, prints the default type as well.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)


@subsubheading See also



@table @asis

@item Module @ref{cf,,smtplib}

SMTP (Simple Mail Transport Protocol) client

@item Module @ref{b1,,poplib}

POP (Post Office Protocol) client

@item Module @ref{78,,imaplib}

IMAP (Internet Message Access Protocol) client

@item Module @ref{8f,,mailbox}

Tools for creating, reading, and managing collections of messages on disk
using a variety standard formats.
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node json — JSON encoder and decoder,mailbox — Manipulate mailboxes in various formats,email — An email and MIME handling package,Internet Data Handling
@anchor{library/json doc}@anchor{3c5a}@anchor{library/json json-json-encoder-and-decoder}@anchor{3c5b}@anchor{library/json module-json}@anchor{86}@anchor{library/json translation-repo}@anchor{3c5c}
@subsection @code{json} — JSON encoder and decoder


@geindex module; json

`Source code:' Lib/json/__init__.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/json/__init__.py}


__________________________________________________________________


JSON (JavaScript Object Notation)@footnote{https://json.org}, specified by
@geindex RFC; RFC 7159
RFC 7159@footnote{https://datatracker.ietf.org/doc/html/rfc7159.html} (which obsoletes 
@geindex RFC; RFC 4627
RFC 4627@footnote{https://datatracker.ietf.org/doc/html/rfc4627.html}) and by
ECMA-404@footnote{https://ecma-international.org/publications-and-standards/standards/ecma-404/},
is a lightweight data interchange format inspired by
JavaScript@footnote{https://en.wikipedia.org/wiki/JavaScript} object literal syntax
(although it is not a strict subset of JavaScript @footnote{
As noted in @uref{https://www.rfc-editor.org/errata_search.php?rfc=7159,the errata for RFC 7159},
JSON permits literal U+2028 (LINE SEPARATOR) and
U+2029 (PARAGRAPH SEPARATOR) characters in strings, whereas JavaScript
(as of ECMAScript Edition 5.1) does not.
} ).

@cartouche
@quotation Note 
The term “object” in the context of JSON processing in Python can be
ambiguous. All values in Python are objects. In JSON, an object refers to
any data wrapped in curly braces, similar to a Python dictionary.
@end quotation
@end cartouche

@cartouche
@quotation Warning 
Be cautious when parsing JSON data from untrusted sources. A malicious
JSON string may cause the decoder to consume considerable CPU and memory
resources. Limiting the size of data to be parsed is recommended.
@end quotation
@end cartouche

This module exposes an API familiar to users of the standard library
@ref{91,,marshal} and @ref{ab,,pickle} modules.

Encoding basic Python object hierarchies:

@example
>>> import json
>>> json.dumps(['foo', @{'bar': ('baz', None, 1.0, 2)@}])
'["foo", @{"bar": ["baz", null, 1.0, 2]@}]'
>>> print(json.dumps("\"foo\bar"))
"\"foo\bar"
>>> print(json.dumps('\u1234'))
"\u1234"
>>> print(json.dumps('\\'))
"\\"
>>> print(json.dumps(@{"c": 0, "b": 0, "a": 0@}, sort_keys=True))
@{"a": 0, "b": 0, "c": 0@}
>>> from io import StringIO
>>> io = StringIO()
>>> json.dump(['streaming API'], io)
>>> io.getvalue()
'["streaming API"]'
@end example

Compact encoding:

@example
>>> import json
>>> json.dumps([1, 2, 3, @{'4': 5, '6': 7@}], separators=(',', ':'))
'[1,2,3,@{"4":5,"6":7@}]'
@end example

Pretty printing:

@example
>>> import json
>>> print(json.dumps(@{'6': 7, '4': 5@}, sort_keys=True, indent=4))
@{
    "4": 5,
    "6": 7
@}
@end example

Customizing JSON object encoding:

@example
>>> import json
>>> def custom_json(obj):
...     if isinstance(obj, complex):
...         return @{'__complex__': True, 'real': obj.real, 'imag': obj.imag@}
...     raise TypeError(f'Cannot serialize object of @{type(obj)@}')
...
>>> json.dumps(1 + 2j, default=custom_json)
'@{"__complex__": true, "real": 1.0, "imag": 2.0@}'
@end example

Decoding JSON:

@example
>>> import json
>>> json.loads('["foo", @{"bar":["baz", null, 1.0, 2]@}]')
['foo', @{'bar': ['baz', None, 1.0, 2]@}]
>>> json.loads('"\\"foo\\bar"')
'"foo\x08ar'
>>> from io import StringIO
>>> io = StringIO('["streaming API"]')
>>> json.load(io)
['streaming API']
@end example

Customizing JSON object decoding:

@example
>>> import json
>>> def as_complex(dct):
...     if '__complex__' in dct:
...         return complex(dct['real'], dct['imag'])
...     return dct
...
>>> json.loads('@{"__complex__": true, "real": 1, "imag": 2@}',
...     object_hook=as_complex)
(1+2j)
>>> import decimal
>>> json.loads('1.1', parse_float=decimal.Decimal)
Decimal('1.1')
@end example

Extending @ref{f48,,JSONEncoder}:

@example
>>> import json
>>> class ComplexEncoder(json.JSONEncoder):
...     def default(self, obj):
...         if isinstance(obj, complex):
...             return [obj.real, obj.imag]
...         # Let the base class default method raise the TypeError
...         return super().default(obj)
...
>>> json.dumps(2 + 1j, cls=ComplexEncoder)
'[2.0, 1.0]'
>>> ComplexEncoder().encode(2 + 1j)
'[2.0, 1.0]'
>>> list(ComplexEncoder().iterencode(2 + 1j))
['[2.0', ', 1.0', ']']
@end example

Using @code{json} from the shell to validate and pretty-print:

@example
$ echo '@{"json":"obj"@}' | python -m json
@{
    "json": "obj"
@}
$ echo '@{1.2:3.4@}' | python -m json
Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
@end example

See @ref{240,,Command-line interface} for detailed documentation.

@cartouche
@quotation Note 
JSON is a subset of YAML@footnote{https://yaml.org/} 1.2.  The JSON produced by
this module’s default settings (in particular, the default `separators'
value) is also a subset of YAML 1.0 and 1.1.  This module can thus also be
used as a YAML serializer.
@end quotation
@end cartouche

@cartouche
@quotation Note 
This module’s encoders and decoders preserve input and output order by
default.  Order is only lost if the underlying containers are unordered.
@end quotation
@end cartouche

@menu
* Basic Usage:: 
* Encoders and Decoders:: 
* Exceptions: Exceptions<20>. 
* Standard Compliance and Interoperability:: 
* Command-line interface: Command-line interface<5>. 

@end menu

@node Basic Usage,Encoders and Decoders,,json — JSON encoder and decoder
@anchor{library/json basic-usage}@anchor{3c5d}
@subsubsection Basic Usage


@geindex dump() (in module json)
@anchor{library/json json dump}@anchor{f46}
@deffn {Function} json.dump (obj, fp, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)

Serialize `obj' as a JSON formatted stream to `fp' (a @code{.write()}-supporting
@ref{17fd,,file-like object}) using this @ref{3c5e,,Python-to-JSON conversion table}.

@cartouche
@quotation Note 
Unlike @ref{ab,,pickle} and @ref{91,,marshal}, JSON is not a framed protocol,
so trying to serialize multiple objects with repeated calls to
@code{dump()} using the same `fp' will result in an invalid JSON file.
@end quotation
@end cartouche

@*Parameters: 

@itemize *

@item 
@code{obj} (@ref{c84,,object}) – The Python object to be serialized.

@item 
@code{fp} (@ref{17fd,,file-like object}) – The file-like object `obj' will be serialized to.
The @code{json} module always produces @ref{16a,,str} objects,
not @ref{193,,bytes} objects,
therefore @code{fp.write()} must support @code{str} input.

@item 
@code{skipkeys} (@ref{3c1,,bool}) – If @code{True}, keys that are not of a basic type
(@ref{16a,,str}, @ref{19c,,int}, @ref{197,,float}, @code{bool}, @code{None})
will be skipped instead of raising a @ref{199,,TypeError}.
Default @code{False}.

@item 
@code{ensure_ascii} (@ref{3c1,,bool}) – If @code{True} (the default), the output is guaranteed to
have all incoming non-ASCII and non-printable characters escaped.
If @code{False}, all characters will be outputted as-is, except for
the characters that must be escaped: quotation mark, reverse solidus,
and the control characters U+0000 through U+001F.

@item 
@code{check_circular} (@ref{3c1,,bool}) – If @code{False}, the circular reference check for container types is skipped
and a circular reference will result in a @ref{f6e,,RecursionError} (or worse).
Default @code{True}.

@item 
@code{allow_nan} (@ref{3c1,,bool}) – If @code{False}, serialization of out-of-range @ref{197,,float} values
(@code{nan}, @code{inf}, @code{-inf}) will result in a @ref{2ee,,ValueError},
in strict compliance with the JSON specification.
If @code{True} (the default), their JavaScript equivalents
(@code{NaN}, @code{Infinity}, @code{-Infinity}) are used.

@item 
@code{cls} (a @ref{f48,,JSONEncoder} subclass) – If set, a custom JSON encoder with the
@ref{3c5f,,default()} method overridden,
for serializing into custom datatypes.
If @code{None} (the default), @code{JSONEncoder} is used.

@item 
@code{indent} (@ref{19c,,int}@code{ | }@ref{16a,,str}@code{ | }@code{None}) – If a positive integer or string, JSON array elements and
object members will be pretty-printed with that indent level.
A positive integer indents that many spaces per level;
a string (such as @code{"\t"}) is used to indent each level.
If zero, negative, or @code{""} (the empty string),
only newlines are inserted.
If @code{None} (the default), no newlines are inserted.

@item 
@code{separators} (@ref{614,,tuple}@code{ | }@code{None}) – A two-tuple: @code{(item_separator, key_separator)}.
If @code{None} (the default), `separators' defaults to
@code{(', ', ': ')} if `indent' is @code{None},
and @code{(',', ': ')} otherwise.
For the most compact JSON,
specify @code{(',', ':')} to eliminate whitespace.

@item 
@code{default} (@ref{2dec,,callable} | None) – A function that is called for objects that can’t otherwise be serialized.
It should return a JSON encodable version of the object
or raise a @ref{199,,TypeError}.
If @code{None} (the default), @code{TypeError} is raised.

@item 
@code{sort_keys} (@ref{3c1,,bool}) – If @code{True}, dictionaries will be outputted sorted by key.
Default @code{False}.
@end itemize



Changed in version 3.2: Allow strings for `indent' in addition to integers.



Changed in version 3.4: Use @code{(',', ': ')} as default if `indent' is not @code{None}.



Changed in version 3.6: All optional parameters are now @ref{5a5,,keyword-only}.

@end deffn

@geindex dumps() (in module json)
@anchor{library/json json dumps}@anchor{f47}
@deffn {Function} json.dumps (obj, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)

Serialize `obj' to a JSON formatted @ref{16a,,str} using this @ref{3c5e,,conversion table}.  The arguments have the same meaning as in
@ref{f46,,dump()}.

@cartouche
@quotation Note 
Keys in key/value pairs of JSON are always of the type @ref{16a,,str}. When
a dictionary is converted into JSON, all the keys of the dictionary are
coerced to strings. As a result of this, if a dictionary is converted
into JSON and then back into a dictionary, the dictionary may not equal
the original one. That is, @code{loads(dumps(x)) != x} if x has non-string
keys.
@end quotation
@end cartouche
@end deffn

@geindex load() (in module json)
@anchor{library/json json load}@anchor{eb8}
@deffn {Function} json.load (fp, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)

Deserialize `fp' to a Python object
using the @ref{3c60,,JSON-to-Python conversion table}.

@*Parameters: 

@itemize *

@item 
@code{fp} (@ref{17fd,,file-like object}) – A @code{.read()}-supporting @ref{20b1,,text file} or @ref{20b2,,binary file}
containing the JSON document to be deserialized.

@item 
@code{cls} (a @ref{f49,,JSONDecoder} subclass) – If set, a custom JSON decoder.
Additional keyword arguments to @code{load()}
will be passed to the constructor of `cls'.
If @code{None} (the default), @code{JSONDecoder} is used.

@item 
@code{object_hook} (@ref{2dec,,callable} | None) – If set, a function that is called with the result of
any JSON object literal decoded (a @ref{184,,dict}).
The return value of this function will be used
instead of the @code{dict}.
This feature can be used to implement custom decoders,
for example JSON-RPC@footnote{https://www.jsonrpc.org} class hinting.
Default @code{None}.

@item 
@code{object_pairs_hook} (@ref{2dec,,callable} | None) – If set, a function that is called with the result of
any JSON object literal decoded with an ordered list of pairs.
The return value of this function will be used
instead of the @ref{184,,dict}.
This feature can be used to implement custom decoders.
If `object_hook' is also set, `object_pairs_hook' takes priority.
Default @code{None}.

@item 
@code{parse_float} (@ref{2dec,,callable} | None) – If set, a function that is called with
the string of every JSON float to be decoded.
If @code{None} (the default), it is equivalent to @code{float(num_str)}.
This can be used to parse JSON floats into custom datatypes,
for example @ref{200,,decimal.Decimal}.

@item 
@code{parse_int} (@ref{2dec,,callable} | None) – If set, a function that is called with
the string of every JSON int to be decoded.
If @code{None} (the default), it is equivalent to @code{int(num_str)}.
This can be used to parse JSON integers into custom datatypes,
for example @ref{197,,float}.

@item 
@code{parse_constant} (@ref{2dec,,callable} | None) – If set, a function that is called with one of the following strings:
@code{'-Infinity'}, @code{'Infinity'}, or @code{'NaN'}.
This can be used to raise an exception
if invalid JSON numbers are encountered.
Default @code{None}.
@end itemize


@*Raises: 

@itemize *

@item 
@ref{1028,,JSONDecodeError} – When the data being deserialized is not a valid JSON document.

@item 
@ref{c0e,,UnicodeDecodeError} – When the data being deserialized does not contain
UTF-8, UTF-16 or UTF-32 encoded data.
@end itemize



Changed in version 3.1: 


@itemize *

@item 
Added the optional `object_pairs_hook' parameter.

@item 
`parse_constant' doesn’t get called on ‘null’, ‘true’, ‘false’ anymore.
@end itemize



Changed in version 3.6: 


@itemize *

@item 
All optional parameters are now @ref{5a5,,keyword-only}.

@item 
`fp' can now be a @ref{20b2,,binary file}.
The input encoding should be UTF-8, UTF-16 or UTF-32.
@end itemize



Changed in version 3.11: The default `parse_int' of @ref{19c,,int()} now limits the maximum length of
the integer string via the interpreter’s @ref{80c,,integer string conversion length limitation} to help avoid denial
of service attacks.

@end deffn

@geindex loads() (in module json)
@anchor{library/json json loads}@anchor{b54}
@deffn {Function} json.loads (s, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)

Identical to @ref{eb8,,load()}, but instead of a file-like object,
deserialize `s' (a @ref{16a,,str}, @ref{193,,bytes} or @ref{342,,bytearray}
instance containing a JSON document) to a Python object using this
@ref{3c60,,conversion table}.


Changed in version 3.6: `s' can now be of type @ref{193,,bytes} or @ref{342,,bytearray}. The
input encoding should be UTF-8, UTF-16 or UTF-32.



Changed in version 3.9: The keyword argument `encoding' has been removed.

@end deffn

@node Encoders and Decoders,Exceptions<20>,Basic Usage,json — JSON encoder and decoder
@anchor{library/json encoders-and-decoders}@anchor{3c61}
@subsubsection Encoders and Decoders


@geindex JSONDecoder (class in json)
@anchor{library/json json JSONDecoder}@anchor{f49}
@deffn {Class} json.JSONDecoder (*, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, strict=True, object_pairs_hook=None)

Simple JSON decoder.

Performs the following translations in decoding by default:
@anchor{library/json json-to-py-table}@anchor{3c60}

@multitable {xxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxx} 
@headitem

JSON

@tab

Python

@item

object

@tab

dict

@item

array

@tab

list

@item

string

@tab

str

@item

number (int)

@tab

int

@item

number (real)

@tab

float

@item

true

@tab

True

@item

false

@tab

False

@item

null

@tab

None

@end multitable


It also understands @code{NaN}, @code{Infinity}, and @code{-Infinity} as their
corresponding @code{float} values, which is outside the JSON spec.

`object_hook' is an optional function that will be called with the result of
every JSON object decoded and its return value will be used in place of the
given @ref{184,,dict}.  This can be used to provide custom deserializations
(e.g. to support JSON-RPC@footnote{https://www.jsonrpc.org} class hinting).

`object_pairs_hook' is an optional function that will be called with the
result of every JSON object decoded with an ordered list of pairs.  The
return value of `object_pairs_hook' will be used instead of the
@ref{184,,dict}.  This feature can be used to implement custom decoders.  If
`object_hook' is also defined, the `object_pairs_hook' takes priority.


Changed in version 3.1: Added support for `object_pairs_hook'.


`parse_float' is an optional function that will be called with the string of
every JSON float to be decoded.  By default, this is equivalent to
@code{float(num_str)}.  This can be used to use another datatype or parser for
JSON floats (e.g. @ref{200,,decimal.Decimal}).

`parse_int' is an optional function that will be called with the string of
every JSON int to be decoded.  By default, this is equivalent to
@code{int(num_str)}.  This can be used to use another datatype or parser for
JSON integers (e.g. @ref{197,,float}).

`parse_constant' is an optional function that will be called with one of the
following strings: @code{'-Infinity'}, @code{'Infinity'}, @code{'NaN'}.  This can be
used to raise an exception if invalid JSON numbers are encountered.

If `strict' is false (@code{True} is the default), then control characters
will be allowed inside strings.  Control characters in this context are
those with character codes in the 0–31 range, including @code{'\t'} (tab),
@code{'\n'}, @code{'\r'} and @code{'\0'}.

If the data being deserialized is not a valid JSON document, a
@ref{1028,,JSONDecodeError} will be raised.


Changed in version 3.6: All parameters are now @ref{5a5,,keyword-only}.


@geindex decode() (json.JSONDecoder method)
@anchor{library/json json JSONDecoder decode}@anchor{3c62}
@deffn {Method} decode (s)

Return the Python representation of `s' (a @ref{16a,,str} instance
containing a JSON document).

@ref{1028,,JSONDecodeError} will be raised if the given JSON document is not
valid.
@end deffn

@geindex raw_decode() (json.JSONDecoder method)
@anchor{library/json json JSONDecoder raw_decode}@anchor{3c63}
@deffn {Method} raw_decode (s)

Decode a JSON document from `s' (a @ref{16a,,str} beginning with a
JSON document) and return a 2-tuple of the Python representation
and the index in `s' where the document ended.

This can be used to decode a JSON document from a string that may have
extraneous data at the end.
@end deffn
@end deffn

@geindex JSONEncoder (class in json)
@anchor{library/json json JSONEncoder}@anchor{f48}
@deffn {Class} json.JSONEncoder (*, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, sort_keys=False, indent=None, separators=None, default=None)

Extensible JSON encoder for Python data structures.

Supports the following objects and types by default:
@anchor{library/json py-to-json-table}@anchor{3c5e}

@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxx} 
@headitem

Python

@tab

JSON

@item

dict

@tab

object

@item

list, tuple

@tab

array

@item

str

@tab

string

@item

int, float, int- & float-derived Enums

@tab

number

@item

True

@tab

true

@item

False

@tab

false

@item

None

@tab

null

@end multitable



Changed in version 3.4: Added support for int- and float-derived Enum classes.


To extend this to recognize other objects, subclass and implement a
@ref{3c5f,,default()} method with another method that returns a serializable object
for @code{o} if possible, otherwise it should call the superclass implementation
(to raise @ref{199,,TypeError}).

If `skipkeys' is false (the default), a @ref{199,,TypeError} will be raised when
trying to encode keys that are not @ref{16a,,str}, @ref{19c,,int}, @ref{197,,float},
@ref{3c1,,bool} or @code{None}.  If `skipkeys' is true, such items are simply skipped.

If `ensure_ascii' is true (the default), the output is guaranteed to
have all incoming non-ASCII and non-printable characters escaped.
If `ensure_ascii' is false, all characters will be output as-is, except for
the characters that must be escaped: quotation mark, reverse solidus,
and the control characters U+0000 through U+001F.

If `check_circular' is true (the default), then lists, dicts, and custom
encoded objects will be checked for circular references during encoding to
prevent an infinite recursion (which would cause a @ref{f6e,,RecursionError}).
Otherwise, no such check takes place.

If `allow_nan' is true (the default), then @code{NaN}, @code{Infinity}, and
@code{-Infinity} will be encoded as such.  This behavior is not JSON
specification compliant, but is consistent with most JavaScript based
encoders and decoders.  Otherwise, it will be a @ref{2ee,,ValueError} to encode
such floats.

If `sort_keys' is true (default: @code{False}), then the output of dictionaries
will be sorted by key; this is useful for regression tests to ensure that
JSON serializations can be compared on a day-to-day basis.

If `indent' is a non-negative integer or string, then JSON array elements and
object members will be pretty-printed with that indent level.  An indent level
of 0, negative, or @code{""} will only insert newlines.  @code{None} (the default)
selects the most compact representation. Using a positive integer indent
indents that many spaces per level.  If `indent' is a string (such as @code{"\t"}),
that string is used to indent each level.


Changed in version 3.2: Allow strings for `indent' in addition to integers.


If specified, `separators' should be an @code{(item_separator, key_separator)}
tuple.  The default is @code{(', ', ': ')} if `indent' is @code{None} and
@code{(',', ': ')} otherwise.  To get the most compact JSON representation,
you should specify @code{(',', ':')} to eliminate whitespace.


Changed in version 3.4: Use @code{(',', ': ')} as default if `indent' is not @code{None}.


If specified, `default' should be a function that gets called for objects that
can’t otherwise be serialized.  It should return a JSON encodable version of
the object or raise a @ref{199,,TypeError}.  If not specified, @code{TypeError}
is raised.


Changed in version 3.6: All parameters are now @ref{5a5,,keyword-only}.


@geindex default() (json.JSONEncoder method)
@anchor{library/json json JSONEncoder default}@anchor{3c5f}
@deffn {Method} default (o)

Implement this method in a subclass such that it returns a serializable
object for `o', or calls the base implementation (to raise a
@ref{199,,TypeError}).

For example, to support arbitrary iterators, you could implement
@code{default()} like this:

@example
def default(self, o):
   try:
       iterable = iter(o)
   except TypeError:
       pass
   else:
       return list(iterable)
   # Let the base class default method raise the TypeError
   return super().default(o)
@end example
@end deffn

@geindex encode() (json.JSONEncoder method)
@anchor{library/json json JSONEncoder encode}@anchor{3c64}
@deffn {Method} encode (o)

Return a JSON string representation of a Python data structure, `o'.  For
example:

@example
>>> json.JSONEncoder().encode(@{"foo": ["bar", "baz"]@})
'@{"foo": ["bar", "baz"]@}'
@end example
@end deffn

@geindex iterencode() (json.JSONEncoder method)
@anchor{library/json json JSONEncoder iterencode}@anchor{3c65}
@deffn {Method} iterencode (o)

Encode the given object, `o', and yield each string representation as
available.  For example:

@example
for chunk in json.JSONEncoder().iterencode(bigobject):
    mysocket.write(chunk)
@end example
@end deffn
@end deffn

@node Exceptions<20>,Standard Compliance and Interoperability,Encoders and Decoders,json — JSON encoder and decoder
@anchor{library/json exceptions}@anchor{3c66}
@subsubsection Exceptions


@geindex JSONDecodeError
@anchor{library/json json JSONDecodeError}@anchor{1028}
@deffn {Exception} json.JSONDecodeError (msg, doc, pos)

Subclass of @ref{2ee,,ValueError} with the following additional attributes:

@geindex msg (json.JSONDecodeError attribute)
@anchor{library/json json JSONDecodeError msg}@anchor{3c67}
@deffn {Attribute} msg

The unformatted error message.
@end deffn

@geindex doc (json.JSONDecodeError attribute)
@anchor{library/json json JSONDecodeError doc}@anchor{3c68}
@deffn {Attribute} doc

The JSON document being parsed.
@end deffn

@geindex pos (json.JSONDecodeError attribute)
@anchor{library/json json JSONDecodeError pos}@anchor{3c69}
@deffn {Attribute} pos

The start index of `doc' where parsing failed.
@end deffn

@geindex lineno (json.JSONDecodeError attribute)
@anchor{library/json json JSONDecodeError lineno}@anchor{3c6a}
@deffn {Attribute} lineno

The line corresponding to `pos'.
@end deffn

@geindex colno (json.JSONDecodeError attribute)
@anchor{library/json json JSONDecodeError colno}@anchor{3c6b}
@deffn {Attribute} colno

The column corresponding to `pos'.
@end deffn


Added in version 3.5.

@end deffn

@node Standard Compliance and Interoperability,Command-line interface<5>,Exceptions<20>,json — JSON encoder and decoder
@anchor{library/json standard-compliance-and-interoperability}@anchor{3c6c}
@subsubsection Standard Compliance and Interoperability


The JSON format is specified by 
@geindex RFC; RFC 7159
RFC 7159@footnote{https://datatracker.ietf.org/doc/html/rfc7159.html} and by
ECMA-404@footnote{https://ecma-international.org/publications-and-standards/standards/ecma-404/}.
This section details this module’s level of compliance with the RFC.
For simplicity, @ref{f48,,JSONEncoder} and @ref{f49,,JSONDecoder} subclasses, and
parameters other than those explicitly mentioned, are not considered.

This module does not comply with the RFC in a strict fashion, implementing some
extensions that are valid JavaScript but not valid JSON.  In particular:


@itemize -

@item 
Infinite and NaN number values are accepted and output;

@item 
Repeated names within an object are accepted, and only the value of the last
name-value pair is used.
@end itemize

Since the RFC permits RFC-compliant parsers to accept input texts that are not
RFC-compliant, this module’s deserializer is technically RFC-compliant under
default settings.

@menu
* Character Encodings:: 
* Infinite and NaN Number Values:: 
* Repeated Names Within an Object:: 
* Top-level Non-Object@comma{} Non-Array Values: Top-level Non-Object Non-Array Values. 
* Implementation Limitations:: 

@end menu

@node Character Encodings,Infinite and NaN Number Values,,Standard Compliance and Interoperability
@anchor{library/json character-encodings}@anchor{3c6d}
@subsubsection Character Encodings


The RFC requires that JSON be represented using either UTF-8, UTF-16, or
UTF-32, with UTF-8 being the recommended default for maximum interoperability.

As permitted, though not required, by the RFC, this module’s serializer sets
`ensure_ascii=True' by default, thus escaping the output so that the resulting
strings only contain printable ASCII characters.

Other than the `ensure_ascii' parameter, this module is defined strictly in
terms of conversion between Python objects and
@ref{16a,,Unicode strings}, and thus does not otherwise directly address
the issue of character encodings.

The RFC prohibits adding a byte order mark (BOM) to the start of a JSON text,
and this module’s serializer does not add a BOM to its output.
The RFC permits, but does not require, JSON deserializers to ignore an initial
BOM in their input.  This module’s deserializer raises a @ref{2ee,,ValueError}
when an initial BOM is present.

The RFC does not explicitly forbid JSON strings which contain byte sequences
that don’t correspond to valid Unicode characters (e.g. unpaired UTF-16
surrogates), but it does note that they may cause interoperability problems.
By default, this module accepts and outputs (when present in the original
@ref{16a,,str}) code points for such sequences.

@node Infinite and NaN Number Values,Repeated Names Within an Object,Character Encodings,Standard Compliance and Interoperability
@anchor{library/json infinite-and-nan-number-values}@anchor{3c6e}
@subsubsection Infinite and NaN Number Values


The RFC does not permit the representation of infinite or NaN number values.
Despite that, by default, this module accepts and outputs @code{Infinity},
@code{-Infinity}, and @code{NaN} as if they were valid JSON number literal values:

@example
>>> # Neither of these calls raises an exception, but the results are not valid JSON
>>> json.dumps(float('-inf'))
'-Infinity'
>>> json.dumps(float('nan'))
'NaN'
>>> # Same when deserializing
>>> json.loads('-Infinity')
-inf
>>> json.loads('NaN')
nan
@end example

In the serializer, the `allow_nan' parameter can be used to alter this
behavior.  In the deserializer, the `parse_constant' parameter can be used to
alter this behavior.

@node Repeated Names Within an Object,Top-level Non-Object Non-Array Values,Infinite and NaN Number Values,Standard Compliance and Interoperability
@anchor{library/json repeated-names-within-an-object}@anchor{3c6f}
@subsubsection Repeated Names Within an Object


The RFC specifies that the names within a JSON object should be unique, but
does not mandate how repeated names in JSON objects should be handled.  By
default, this module does not raise an exception; instead, it ignores all but
the last name-value pair for a given name:

@example
>>> weird_json = '@{"x": 1, "x": 2, "x": 3@}'
>>> json.loads(weird_json)
@{'x': 3@}
@end example

The `object_pairs_hook' parameter can be used to alter this behavior.

@node Top-level Non-Object Non-Array Values,Implementation Limitations,Repeated Names Within an Object,Standard Compliance and Interoperability
@anchor{library/json top-level-non-object-non-array-values}@anchor{3c70}
@subsubsection Top-level Non-Object, Non-Array Values


The old version of JSON specified by the obsolete 
@geindex RFC; RFC 4627
RFC 4627@footnote{https://datatracker.ietf.org/doc/html/rfc4627.html} required that
the top-level value of a JSON text must be either a JSON object or array
(Python @ref{184,,dict} or @ref{24f,,list}), and could not be a JSON null,
boolean, number, or string value.  
@geindex RFC; RFC 7159
RFC 7159@footnote{https://datatracker.ietf.org/doc/html/rfc7159.html} removed that restriction, and
this module does not and has never implemented that restriction in either its
serializer or its deserializer.

Regardless, for maximum interoperability, you may wish to voluntarily adhere
to the restriction yourself.

@node Implementation Limitations,,Top-level Non-Object Non-Array Values,Standard Compliance and Interoperability
@anchor{library/json implementation-limitations}@anchor{3c71}
@subsubsection Implementation Limitations


Some JSON deserializer implementations may set limits on:


@itemize *

@item 
the size of accepted JSON texts

@item 
the maximum level of nesting of JSON objects and arrays

@item 
the range and precision of JSON numbers

@item 
the content and maximum length of JSON strings
@end itemize

This module does not impose any such limits beyond those of the relevant
Python datatypes themselves or the Python interpreter itself.

When serializing to JSON, beware any such limitations in applications that may
consume your JSON.  In particular, it is common for JSON numbers to be
deserialized into IEEE 754 double precision numbers and thus subject to that
representation’s range and precision limitations.  This is especially relevant
when serializing Python @ref{19c,,int} values of extremely large magnitude, or
when serializing instances of “exotic” numerical types such as
@ref{200,,decimal.Decimal}.

@node Command-line interface<5>,,Standard Compliance and Interoperability,json — JSON encoder and decoder
@anchor{library/json command-line-interface}@anchor{3c72}@anchor{library/json json-commandline}@anchor{240}@anchor{library/json module-json tool}@anchor{87}
@subsubsection Command-line interface


@geindex module; json.tool

`Source code:' Lib/json/tool.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/json/tool.py}


__________________________________________________________________


The @code{json} module can be invoked as a script via @code{python -m json}
to validate and pretty-print JSON objects. The @code{json.tool} submodule
implements this interface.

If the optional @code{infile} and @code{outfile} arguments are not
specified, @ref{760,,sys.stdin} and @ref{cd3,,sys.stdout} will be used respectively:

@example
$ echo '@{"json": "obj"@}' | python -m json
@{
    "json": "obj"
@}
$ echo '@{1.2:3.4@}' | python -m json
Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
@end example


Changed in version 3.5: The output is now in the same order as the input. Use the
@ref{3c73,,--sort-keys} option to sort the output of dictionaries
alphabetically by key.



Changed in version 3.14: The @code{json} module may now be directly executed as
@code{python -m json}. For backwards compatibility, invoking
the CLI as @code{python -m json.tool} remains supported.


@menu
* Command-line options: Command-line options<4>. 

@end menu

@node Command-line options<4>,,,Command-line interface<5>
@anchor{library/json command-line-options}@anchor{3c74}
@subsubsection Command-line options


@geindex json command line option; infile
@anchor{library/json cmdoption-json-arg-infile}@anchor{3c75}
@deffn {Option} infile

The JSON file to be validated or pretty-printed:

@example
$ python -m json mp_films.json
[
    @{
        "title": "And Now for Something Completely Different",
        "year": 1971
    @},
    @{
        "title": "Monty Python and the Holy Grail",
        "year": 1975
    @}
]
@end example

If `infile' is not specified, read from @ref{760,,sys.stdin}.
@end deffn

@geindex json command line option; outfile
@anchor{library/json cmdoption-json-arg-outfile}@anchor{3c76}
@deffn {Option} outfile

Write the output of the `infile' to the given `outfile'. Otherwise, write it
to @ref{cd3,,sys.stdout}.
@end deffn

@geindex json command line option; --sort-keys
@anchor{library/json cmdoption-json-sort-keys}@anchor{3c73}
@deffn {Option} @w{-}@w{-}sort@w{-}keys

Sort the output of dictionaries alphabetically by key.


Added in version 3.5.

@end deffn

@geindex json command line option; --no-ensure-ascii
@anchor{library/json cmdoption-json-no-ensure-ascii}@anchor{3c77}
@deffn {Option} @w{-}@w{-}no@w{-}ensure@w{-}ascii

Disable escaping of non-ascii characters, see @ref{f47,,json.dumps()} for more information.


Added in version 3.9.

@end deffn

@geindex json command line option; --json-lines
@anchor{library/json cmdoption-json-json-lines}@anchor{3c78}
@deffn {Option} @w{-}@w{-}json@w{-}lines

Parse every input line as separate JSON object.


Added in version 3.8.

@end deffn

@geindex json command line option; --indent
@geindex json command line option; --tab
@geindex json command line option; --no-indent
@geindex json command line option; --compact
@anchor{library/json cmdoption-json-indent}@anchor{3c79}@anchor{library/json cmdoption-json-tab}@anchor{3c7a}@anchor{library/json cmdoption-json-no-indent}@anchor{3c7b}@anchor{library/json cmdoption-json-compact}@anchor{3c7c}
@deffn {Option} @w{-}@w{-}indent, @w{-}@w{-}tab, @w{-}@w{-}no@w{-}indent, @w{-}@w{-}compact

Mutually exclusive options for whitespace control.


Added in version 3.9.

@end deffn

@geindex json command line option; -h
@geindex json command line option; --help
@anchor{library/json cmdoption-json-h}@anchor{3c7d}@anchor{library/json cmdoption-json-help}@anchor{3c7e}
@deffn {Option} @w{-}h, @w{-}@w{-}help

Show the help message.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node mailbox — Manipulate mailboxes in various formats,mimetypes — Map filenames to MIME types,json — JSON encoder and decoder,Internet Data Handling
@anchor{library/mailbox doc}@anchor{3c7f}@anchor{library/mailbox mailbox-manipulate-mailboxes-in-various-formats}@anchor{3c80}@anchor{library/mailbox module-mailbox}@anchor{8f}@anchor{library/mailbox translation-repo}@anchor{3c81}
@subsection @code{mailbox} — Manipulate mailboxes in various formats


@geindex module; mailbox

`Source code:' Lib/mailbox.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/mailbox.py}


__________________________________________________________________


This module defines two classes, @ref{1458,,Mailbox} and @ref{145c,,Message}, for
accessing and manipulating on-disk mailboxes and the messages they contain.
@code{Mailbox} offers a dictionary-like mapping from keys to messages.
@code{Message} extends the @ref{48,,email.message} module’s
@ref{581,,Message} class with format-specific state and behavior.
Supported mailbox formats are Maildir, mbox, MH, Babyl, and MMDF.


@subsubheading See also



@table @asis

@item Module @ref{3f,,email}

Represent and manipulate messages.
@end table


@menu
* Mailbox objects:: 
* Message objects:: 
* Exceptions: Exceptions<21>. 
* Examples: Examples<24>. 

@end menu

@node Mailbox objects,Message objects,,mailbox — Manipulate mailboxes in various formats
@anchor{library/mailbox id1}@anchor{3c82}@anchor{library/mailbox mailbox-objects}@anchor{3c83}
@subsubsection @code{Mailbox} objects


@geindex Mailbox (class in mailbox)
@anchor{library/mailbox mailbox Mailbox}@anchor{1458}
@deffn {Class} mailbox.Mailbox

A mailbox, which may be inspected and modified.

The @code{Mailbox} class defines an interface and is not intended to be
instantiated.  Instead, format-specific subclasses should inherit from
@code{Mailbox} and your code should instantiate a particular subclass.

The @code{Mailbox} interface is dictionary-like, with small keys
corresponding to messages. Keys are issued by the @code{Mailbox} instance
with which they will be used and are only meaningful to that @code{Mailbox}
instance. A key continues to identify a message even if the corresponding
message is modified, such as by replacing it with another message.

Messages may be added to a @code{Mailbox} instance using the set-like
method @ref{1457,,add()} and removed using a @code{del} statement or the set-like
methods @ref{3c84,,remove()} and @ref{3c85,,discard()}.

@code{Mailbox} interface semantics differ from dictionary semantics in some
noteworthy ways. Each time a message is requested, a new representation
(typically a @ref{145c,,Message} instance) is generated based upon the current
state of the mailbox. Similarly, when a message is added to a
@code{Mailbox} instance, the provided message representation’s contents are
copied. In neither case is a reference to the message representation kept by
the @code{Mailbox} instance.

The default @code{Mailbox} @ref{4c9,,iterator} iterates over message
representations, not keys as the default @ref{184,,dictionary}
iterator does. Moreover, modification of a
mailbox during iteration is safe and well-defined. Messages added to the
mailbox after an iterator is created will not be seen by the
iterator. Messages removed from the mailbox before the iterator yields them
will be silently skipped, though using a key from an iterator may result in a
@ref{5e7,,KeyError} exception if the corresponding message is subsequently
removed.

@cartouche
@quotation Warning 
Be very cautious when modifying mailboxes that might be simultaneously
changed by some other process.  The safest mailbox format to use for such
tasks is @ref{65e,,Maildir}; try to avoid using single-file formats such as
@ref{1a42,,mbox} for
concurrent writing.  If you’re modifying a mailbox, you `must' lock it by
calling the @ref{3c86,,lock()} and @ref{3c87,,unlock()} methods `before' reading any
messages in the file or making any changes by adding or deleting a
message.  Failing to lock the mailbox runs the risk of losing messages or
corrupting the entire mailbox.
@end quotation
@end cartouche

@code{Mailbox} instances have the following methods:

@geindex add() (mailbox.Mailbox method)
@anchor{library/mailbox mailbox Mailbox add}@anchor{1457}
@deffn {Method} add (message)

Add `message' to the mailbox and return the key that has been assigned to
it.

Parameter `message' may be a @ref{145c,,Message} instance, an
@ref{581,,email.message.Message} instance, a string, a byte string, or a
file-like object (which should be open in binary mode). If `message' is
an instance of the
appropriate format-specific @code{Message} subclass (e.g., if it’s an
@ref{3b44,,mboxMessage} instance and this is an @ref{1a42,,mbox} instance), its
format-specific information is used. Otherwise, reasonable defaults for
format-specific information are used.


Changed in version 3.2: Support for binary input was added.

@end deffn

@geindex remove() (mailbox.Mailbox method)
@geindex __delitem__() (mailbox.Mailbox method)
@geindex discard() (mailbox.Mailbox method)
@anchor{library/mailbox mailbox Mailbox remove}@anchor{3c84}
@deffn {Method} remove (key)
@anchor{library/mailbox mailbox Mailbox __delitem__}@anchor{3c88}
@deffnx {Method} __delitem__ (key)
@anchor{library/mailbox mailbox Mailbox discard}@anchor{3c85}
@deffnx {Method} discard (key)

Delete the message corresponding to `key' from the mailbox.

If no such message exists, a @ref{5e7,,KeyError} exception is raised if the
method was called as @code{remove()} or @code{__delitem__()} but no
exception is raised if the method was called as @code{discard()}. The
behavior of @code{discard()} may be preferred if the underlying mailbox
format supports concurrent modification by other processes.
@end deffn

@geindex __setitem__() (mailbox.Mailbox method)
@anchor{library/mailbox mailbox Mailbox __setitem__}@anchor{3c89}
@deffn {Method} __setitem__ (key, message)

Replace the message corresponding to `key' with `message'. Raise a
@ref{5e7,,KeyError} exception if no message already corresponds to `key'.

As with @ref{1457,,add()}, parameter `message' may be a @ref{145c,,Message}
instance, an @ref{581,,email.message.Message} instance, a string, a byte
string, or a file-like object (which should be open in binary mode). If
`message' is an
instance of the appropriate format-specific @code{Message} subclass
(e.g., if it’s an @ref{3b44,,mboxMessage} instance and this is an
@ref{1a42,,mbox} instance), its format-specific information is
used. Otherwise, the format-specific information of the message that
currently corresponds to `key' is left unchanged.
@end deffn

@geindex iterkeys() (mailbox.Mailbox method)
@anchor{library/mailbox mailbox Mailbox iterkeys}@anchor{3c8a}
@deffn {Method} iterkeys ()

Return an @ref{4c9,,iterator} over all keys
@end deffn

@geindex keys() (mailbox.Mailbox method)
@anchor{library/mailbox mailbox Mailbox keys}@anchor{3c8b}
@deffn {Method} keys ()

The same as @ref{3c8a,,iterkeys()}, except that a @ref{24f,,list} is returned
rather than an @ref{4c9,,iterator}
@end deffn

@geindex itervalues() (mailbox.Mailbox method)
@geindex __iter__() (mailbox.Mailbox method)
@anchor{library/mailbox mailbox Mailbox itervalues}@anchor{3c8c}
@deffn {Method} itervalues ()
@anchor{library/mailbox mailbox Mailbox __iter__}@anchor{3c8d}
@deffnx {Method} __iter__ ()

Return an @ref{4c9,,iterator} over representations of all messages.
The messages are represented
as instances of the appropriate format-specific @ref{145c,,Message} subclass
unless a custom message factory was specified when the @code{Mailbox}
instance was initialized.

@cartouche
@quotation Note 
The behavior of @code{__iter__()} is unlike that of dictionaries, which
iterate over keys.
@end quotation
@end cartouche
@end deffn

@geindex values() (mailbox.Mailbox method)
@anchor{library/mailbox mailbox Mailbox values}@anchor{3c8e}
@deffn {Method} values ()

The same as @ref{3c8c,,itervalues()}, except that a @ref{24f,,list} is returned
rather than an @ref{4c9,,iterator}
@end deffn

@geindex iteritems() (mailbox.Mailbox method)
@anchor{library/mailbox mailbox Mailbox iteritems}@anchor{3c8f}
@deffn {Method} iteritems ()

Return an @ref{4c9,,iterator} over (`key', `message') pairs, where `key' is
a key and `message' is a message representation. The messages are
represented as instances of the appropriate format-specific
@ref{145c,,Message} subclass unless a custom message factory was specified
when the @code{Mailbox} instance was initialized.
@end deffn

@geindex items() (mailbox.Mailbox method)
@anchor{library/mailbox mailbox Mailbox items}@anchor{3c90}
@deffn {Method} items ()

The same as @ref{3c8f,,iteritems()}, except that a @ref{24f,,list} of pairs is
returned rather than an @ref{4c9,,iterator} of pairs.
@end deffn

@geindex get() (mailbox.Mailbox method)
@geindex __getitem__() (mailbox.Mailbox method)
@anchor{library/mailbox mailbox Mailbox get}@anchor{3c91}
@deffn {Method} get (key, default=None)
@anchor{library/mailbox mailbox Mailbox __getitem__}@anchor{3c92}
@deffnx {Method} __getitem__ (key)

Return a representation of the message corresponding to `key'. If no such
message exists, `default' is returned if the method was called as
@code{get()} and a @ref{5e7,,KeyError} exception is raised if the method was
called as @code{__getitem__()}. The message is represented as an instance
of the appropriate format-specific @ref{145c,,Message} subclass unless a
custom message factory was specified when the @code{Mailbox} instance
was initialized.
@end deffn

@geindex get_message() (mailbox.Mailbox method)
@anchor{library/mailbox mailbox Mailbox get_message}@anchor{3c93}
@deffn {Method} get_message (key)

Return a representation of the message corresponding to `key' as an
instance of the appropriate format-specific @ref{145c,,Message} subclass, or
raise a @ref{5e7,,KeyError} exception if no such message exists.
@end deffn

@geindex get_bytes() (mailbox.Mailbox method)
@anchor{library/mailbox mailbox Mailbox get_bytes}@anchor{145a}
@deffn {Method} get_bytes (key)

Return a byte representation of the message corresponding to `key', or
raise a @ref{5e7,,KeyError} exception if no such message exists.


Added in version 3.2.

@end deffn

@geindex get_string() (mailbox.Mailbox method)
@anchor{library/mailbox mailbox Mailbox get_string}@anchor{145b}
@deffn {Method} get_string (key)

Return a string representation of the message corresponding to `key', or
raise a @ref{5e7,,KeyError} exception if no such message exists.  The
message is processed through @ref{581,,email.message.Message} to
convert it to a 7bit clean representation.
@end deffn

@geindex get_file() (mailbox.Mailbox method)
@anchor{library/mailbox mailbox Mailbox get_file}@anchor{1459}
@deffn {Method} get_file (key)

Return a @ref{17fd,,file-like} representation of the
message corresponding to `key',
or raise a @ref{5e7,,KeyError} exception if no such message exists.  The
file-like object behaves as if open in binary mode.  This file should be
closed once it is no longer needed.


Changed in version 3.2: The file object really is a @ref{20b2,,binary file}; previously it was
incorrectly returned in text mode.  Also, the @ref{17fd,,file-like object}
now supports the @ref{1e3,,context manager} protocol: you can use a
@ref{187,,with} statement to automatically close it.


@cartouche
@quotation Note 
Unlike other representations of messages,
@ref{17fd,,file-like} representations are not
necessarily independent of the @code{Mailbox} instance that
created them or of the underlying mailbox.  More specific documentation
is provided by each subclass.
@end quotation
@end cartouche
@end deffn

@geindex __contains__() (mailbox.Mailbox method)
@anchor{library/mailbox mailbox Mailbox __contains__}@anchor{3c94}
@deffn {Method} __contains__ (key)

Return @code{True} if `key' corresponds to a message, @code{False} otherwise.
@end deffn

@geindex __len__() (mailbox.Mailbox method)
@anchor{library/mailbox mailbox Mailbox __len__}@anchor{3c95}
@deffn {Method} __len__ ()

Return a count of messages in the mailbox.
@end deffn

@geindex clear() (mailbox.Mailbox method)
@anchor{library/mailbox mailbox Mailbox clear}@anchor{3c96}
@deffn {Method} clear ()

Delete all messages from the mailbox.
@end deffn

@geindex pop() (mailbox.Mailbox method)
@anchor{library/mailbox mailbox Mailbox pop}@anchor{3c97}
@deffn {Method} pop (key, default=None)

Return a representation of the message corresponding to `key' and delete
the message. If no such message exists, return `default'. The message is
represented as an instance of the appropriate format-specific
@ref{145c,,Message} subclass unless a custom message factory was specified
when the @code{Mailbox} instance was initialized.
@end deffn

@geindex popitem() (mailbox.Mailbox method)
@anchor{library/mailbox mailbox Mailbox popitem}@anchor{3c98}
@deffn {Method} popitem ()

Return an arbitrary (`key', `message') pair, where `key' is a key and
`message' is a message representation, and delete the corresponding
message. If the mailbox is empty, raise a @ref{5e7,,KeyError} exception. The
message is represented as an instance of the appropriate format-specific
@ref{145c,,Message} subclass unless a custom message factory was specified
when the @code{Mailbox} instance was initialized.
@end deffn

@geindex update() (mailbox.Mailbox method)
@anchor{library/mailbox mailbox Mailbox update}@anchor{3c99}
@deffn {Method} update (arg)

Parameter `arg' should be a `key'-to-`message' mapping or an iterable of
(`key', `message') pairs. Updates the mailbox so that, for each given
`key' and `message', the message corresponding to `key' is set to
`message' as if by using @ref{3c89,,__setitem__()}. As with @code{__setitem__()},
each `key' must already correspond to a message in the mailbox or else a
@ref{5e7,,KeyError} exception will be raised, so in general it is incorrect
for `arg' to be a @code{Mailbox} instance.

@cartouche
@quotation Note 
Unlike with dictionaries, keyword arguments are not supported.
@end quotation
@end cartouche
@end deffn

@geindex flush() (mailbox.Mailbox method)
@anchor{library/mailbox mailbox Mailbox flush}@anchor{1a03}
@deffn {Method} flush ()

Write any pending changes to the filesystem. For some @code{Mailbox}
subclasses, changes are always written immediately and @code{flush()} does
nothing, but you should still make a habit of calling this method.
@end deffn

@geindex lock() (mailbox.Mailbox method)
@anchor{library/mailbox mailbox Mailbox lock}@anchor{3c86}
@deffn {Method} lock ()

Acquire an exclusive advisory lock on the mailbox so that other processes
know not to modify it. An @ref{3c9a,,ExternalClashError} is raised if the lock
is not available. The particular locking mechanisms used depend upon the
mailbox format.  You should `always' lock the mailbox before making any
modifications to its contents.
@end deffn

@geindex unlock() (mailbox.Mailbox method)
@anchor{library/mailbox mailbox Mailbox unlock}@anchor{3c87}
@deffn {Method} unlock ()

Release the lock on the mailbox, if any.
@end deffn

@geindex close() (mailbox.Mailbox method)
@anchor{library/mailbox mailbox Mailbox close}@anchor{3c9b}
@deffn {Method} close ()

Flush the mailbox, unlock it if necessary, and close any open files. For
some @code{Mailbox} subclasses, this method does nothing.
@end deffn
@end deffn

@menu
* Maildir objects:: 
* mbox objects:: 
* MH objects:: 
* Babyl objects:: 
* MMDF objects:: 

@end menu

@node Maildir objects,mbox objects,,Mailbox objects
@anchor{library/mailbox mailbox-maildir}@anchor{3c9c}@anchor{library/mailbox maildir-objects}@anchor{3c9d}
@subsubsection @code{Maildir} objects


@geindex Maildir (class in mailbox)
@anchor{library/mailbox mailbox Maildir}@anchor{65e}
@deffn {Class} mailbox.Maildir (dirname, factory=None, create=True)

A subclass of @ref{1458,,Mailbox} for mailboxes in Maildir format. Parameter
`factory' is a callable object that accepts a file-like message representation
(which behaves as if opened in binary mode) and returns a custom representation.
If `factory' is @code{None}, @ref{3c9e,,MaildirMessage} is used as the default message
representation. If `create' is @code{True}, the mailbox is created if it does not
exist.

If `create' is @code{True} and the `dirname' path exists, it will be treated as
an existing maildir without attempting to verify its directory layout.

It is for historical reasons that `dirname' is named as such rather than `path'.

Maildir is a directory-based mailbox format invented for the qmail mail
transfer agent and now widely supported by other programs. Messages in a
Maildir mailbox are stored in separate files within a common directory
structure. This design allows Maildir mailboxes to be accessed and modified
by multiple unrelated programs without data corruption, so file locking is
unnecessary.

Maildir mailboxes contain three subdirectories, namely: @code{tmp},
@code{new}, and @code{cur}. Messages are created momentarily in the
@code{tmp} subdirectory and then moved to the @code{new} subdirectory to
finalize delivery. A mail user agent may subsequently move the message to the
@code{cur} subdirectory and store information about the state of the message
in a special “info” section appended to its file name.

Folders of the style introduced by the Courier mail transfer agent are also
supported. Any subdirectory of the main mailbox is considered a folder if
@code{'.'} is the first character in its name. Folder names are represented by
@code{Maildir} without the leading @code{'.'}. Each folder is itself a Maildir
mailbox but should not contain other folders. Instead, a logical nesting is
indicated using @code{'.'} to delimit levels, e.g., “Archived.2005.07”.

@geindex colon (mailbox.Maildir attribute)
@anchor{library/mailbox mailbox Maildir colon}@anchor{3c9f}
@deffn {Attribute} colon

The Maildir specification requires the use of a colon (@code{':'}) in certain
message file names. However, some operating systems do not permit this
character in file names, If you wish to use a Maildir-like format on such
an operating system, you should specify another character to use
instead. The exclamation point (@code{'!'}) is a popular choice. For
example:

@example
import mailbox
mailbox.Maildir.colon = '!'
@end example

The @code{colon} attribute may also be set on a per-instance basis.
@end deffn


Changed in version 3.13: @code{Maildir} now ignores files with a leading dot.


@code{Maildir} instances have all of the methods of @ref{1458,,Mailbox} in
addition to the following:

@geindex list_folders() (mailbox.Maildir method)
@anchor{library/mailbox mailbox Maildir list_folders}@anchor{3ca0}
@deffn {Method} list_folders ()

Return a list of the names of all folders.
@end deffn

@geindex get_folder() (mailbox.Maildir method)
@anchor{library/mailbox mailbox Maildir get_folder}@anchor{3ca1}
@deffn {Method} get_folder (folder)

Return a @code{Maildir} instance representing the folder whose name is
`folder'. A @ref{3ca2,,NoSuchMailboxError} exception is raised if the folder
does not exist.
@end deffn

@geindex add_folder() (mailbox.Maildir method)
@anchor{library/mailbox mailbox Maildir add_folder}@anchor{3ca3}
@deffn {Method} add_folder (folder)

Create a folder whose name is `folder' and return a @code{Maildir}
instance representing it.
@end deffn

@geindex remove_folder() (mailbox.Maildir method)
@anchor{library/mailbox mailbox Maildir remove_folder}@anchor{3ca4}
@deffn {Method} remove_folder (folder)

Delete the folder whose name is `folder'. If the folder contains any
messages, a @ref{3ca5,,NotEmptyError} exception will be raised and the folder
will not be deleted.
@end deffn

@geindex clean() (mailbox.Maildir method)
@anchor{library/mailbox mailbox Maildir clean}@anchor{3ca6}
@deffn {Method} clean ()

Delete temporary files from the mailbox that have not been accessed in the
last 36 hours. The Maildir specification says that mail-reading programs
should do this occasionally.
@end deffn

@geindex get_flags() (mailbox.Maildir method)
@anchor{library/mailbox mailbox Maildir get_flags}@anchor{1a8c}
@deffn {Method} get_flags (key)

Return as a string the flags that are set on the message
corresponding to `key'.
This is the same as @code{get_message(key).get_flags()} but much
faster, because it does not open the message file.
Use this method when iterating over the keys to determine which
messages are interesting to get.

If you do have a @ref{3c9e,,MaildirMessage} object, use
its @ref{3ca7,,get_flags()} method instead, because
changes made by the message’s @ref{3ca8,,set_flags()},
@ref{3ca9,,add_flag()} and @ref{3caa,,remove_flag()}
methods are not reflected here until the mailbox’s
@ref{3cab,,__setitem__()} method is called.


Added in version 3.13.

@end deffn

@geindex set_flags() (mailbox.Maildir method)
@anchor{library/mailbox mailbox Maildir set_flags}@anchor{1a8d}
@deffn {Method} set_flags (key, flags)

On the message corresponding to `key', set the flags specified
by `flags' and unset all others.
Calling @code{some_mailbox.set_flags(key, flags)} is similar to

@example
one_message = some_mailbox.get_message(key)
one_message.set_flags(flags)
some_mailbox[key] = one_message
@end example

but faster, because it does not open the message file.

If you do have a @ref{3c9e,,MaildirMessage} object, use
its @ref{3ca8,,set_flags()} method instead, because
changes made with this mailbox method will not be visible to the
message object’s method, @ref{3ca7,,get_flags()}.


Added in version 3.13.

@end deffn

@geindex add_flag() (mailbox.Maildir method)
@anchor{library/mailbox mailbox Maildir add_flag}@anchor{1a8e}
@deffn {Method} add_flag (key, flag)

On the message corresponding to `key', set the flags specified
by `flag' without changing other flags. To add more than one
flag at a time, `flag' may be a string of more than one character.

Considerations for using this method versus the message object’s
@ref{3ca9,,add_flag()} method are similar to
those for @ref{1a8d,,set_flags()}; see the discussion there.


Added in version 3.13.

@end deffn

@geindex remove_flag() (mailbox.Maildir method)
@anchor{library/mailbox mailbox Maildir remove_flag}@anchor{1a8f}
@deffn {Method} remove_flag (key, flag)

On the message corresponding to `key', unset the flags specified
by `flag' without changing other flags. To remove more than one
flag at a time, `flag' may be a string of more than one character.

Considerations for using this method versus the message object’s
@ref{3caa,,remove_flag()} method are similar to
those for @ref{1a8d,,set_flags()}; see the discussion there.


Added in version 3.13.

@end deffn

@geindex get_info() (mailbox.Maildir method)
@anchor{library/mailbox mailbox Maildir get_info}@anchor{1a8a}
@deffn {Method} get_info (key)

Return a string containing the info for the message
corresponding to `key'.
This is the same as @code{get_message(key).get_info()} but much
faster, because it does not open the message file.
Use this method when iterating over the keys to determine which
messages are interesting to get.

If you do have a @ref{3c9e,,MaildirMessage} object, use
its @ref{3cac,,get_info()} method instead, because
changes made by the message’s @ref{3cad,,set_info()} method
are not reflected here until the mailbox’s @ref{3cab,,__setitem__()} method
is called.


Added in version 3.13.

@end deffn

@geindex set_info() (mailbox.Maildir method)
@anchor{library/mailbox mailbox Maildir set_info}@anchor{1a8b}
@deffn {Method} set_info (key, info)

Set the info of the message corresponding to `key' to `info'.
Calling @code{some_mailbox.set_info(key, flags)} is similar to

@example
one_message = some_mailbox.get_message(key)
one_message.set_info(info)
some_mailbox[key] = one_message
@end example

but faster, because it does not open the message file.

If you do have a @ref{3c9e,,MaildirMessage} object, use
its @ref{3cad,,set_info()} method instead, because
changes made with this mailbox method will not be visible to the
message object’s method, @ref{3cac,,get_info()}.


Added in version 3.13.

@end deffn

Some @ref{1458,,Mailbox} methods implemented by @code{Maildir} deserve special
remarks:

@geindex add() (mailbox.Maildir method)
@geindex __setitem__() (mailbox.Maildir method)
@geindex update() (mailbox.Maildir method)
@anchor{library/mailbox mailbox Maildir add}@anchor{3cae}
@deffn {Method} add (message)
@anchor{library/mailbox mailbox Maildir __setitem__}@anchor{3cab}
@deffnx {Method} __setitem__ (key, message)
@anchor{library/mailbox mailbox Maildir update}@anchor{3caf}
@deffnx {Method} update (arg)

@cartouche
@quotation Warning 
These methods generate unique file names based upon the current process
ID. When using multiple threads, undetected name clashes may occur and
cause corruption of the mailbox unless threads are coordinated to avoid
using these methods to manipulate the same mailbox simultaneously.
@end quotation
@end cartouche
@end deffn

@geindex flush() (mailbox.Maildir method)
@anchor{library/mailbox mailbox Maildir flush}@anchor{3cb0}
@deffn {Method} flush ()

All changes to Maildir mailboxes are immediately applied, so this method
does nothing.
@end deffn

@geindex lock() (mailbox.Maildir method)
@geindex unlock() (mailbox.Maildir method)
@anchor{library/mailbox mailbox Maildir lock}@anchor{3cb1}
@deffn {Method} lock ()
@anchor{library/mailbox mailbox Maildir unlock}@anchor{3cb2}
@deffnx {Method} unlock ()

Maildir mailboxes do not support (or require) locking, so these methods do
nothing.
@end deffn

@geindex close() (mailbox.Maildir method)
@anchor{library/mailbox mailbox Maildir close}@anchor{3cb3}
@deffn {Method} close ()

@code{Maildir} instances do not keep any open files and the underlying
mailboxes do not support locking, so this method does nothing.
@end deffn

@geindex get_file() (mailbox.Maildir method)
@anchor{library/mailbox mailbox Maildir get_file}@anchor{3cb4}
@deffn {Method} get_file (key)

Depending upon the host platform, it may not be possible to modify or
remove the underlying message while the returned file remains open.
@end deffn
@end deffn


@subsubheading See also



@table @asis

@item maildir man page from Courier@footnote{https://www.courier-mta.org/maildir.html}

A specification of the format. Describes a common extension for
supporting folders.

@item Using maildir format@footnote{https://cr.yp.to/proto/maildir.html}

Notes on Maildir by its inventor. Includes an updated name-creation scheme and
details on “info” semantics.
@end table


@node mbox objects,MH objects,Maildir objects,Mailbox objects
@anchor{library/mailbox mailbox-mbox}@anchor{3cb5}@anchor{library/mailbox mbox-objects}@anchor{3cb6}
@subsubsection @code{mbox} objects


@geindex mbox (class in mailbox)
@anchor{library/mailbox mailbox mbox}@anchor{1a42}
@deffn {Class} mailbox.mbox (path, factory=None, create=True)

A subclass of @ref{1458,,Mailbox} for mailboxes in mbox format. Parameter `factory'
is a callable object that accepts a file-like message representation (which
behaves as if opened in binary mode) and returns a custom representation. If
`factory' is @code{None}, @ref{3b44,,mboxMessage} is used as the default message
representation. If `create' is @code{True}, the mailbox is created if it does not
exist.

The mbox format is the classic format for storing mail on Unix systems. All
messages in an mbox mailbox are stored in a single file with the beginning of
each message indicated by a line whose first five characters are “From “.

Several variations of the mbox format exist to address perceived shortcomings in
the original. In the interest of compatibility, @code{mbox} implements the
original format, which is sometimes referred to as `mboxo'. This means that
the @code{Content-Length} header, if present, is ignored and that any
occurrences of “From “ at the beginning of a line in a message body are
transformed to “>From “ when storing the message, although occurrences of “>From
“ are not transformed to “From “ when reading the message.

Some @ref{1458,,Mailbox} methods implemented by @code{mbox} deserve special
remarks:

@geindex get_bytes() (mailbox.mbox method)
@anchor{library/mailbox mailbox mbox get_bytes}@anchor{3cb7}
@deffn {Method} get_bytes (key, from_=False)

Note: This method has an extra parameter (`from_') compared with other classes.
The first line of an mbox file entry is the Unix “From “ line.
If `from_' is False, the first line of the file is dropped.
@end deffn

@geindex get_file() (mailbox.mbox method)
@anchor{library/mailbox mailbox mbox get_file}@anchor{3cb8}
@deffn {Method} get_file (key, from_=False)

Using the file after calling @ref{1a03,,flush()} or
@ref{3c9b,,close()} on the @code{mbox} instance may yield
unpredictable results or raise an exception.

Note: This method has an extra parameter (`from_') compared with other classes.
The first line of an mbox file entry is the Unix “From “ line.
If `from_' is False, the first line of the file is dropped.
@end deffn

@geindex get_string() (mailbox.mbox method)
@anchor{library/mailbox mailbox mbox get_string}@anchor{3cb9}
@deffn {Method} get_string (key, from_=False)

Note: This method has an extra parameter (`from_') compared with other classes.
The first line of an mbox file entry is the Unix “From “ line.
If `from_' is False, the first line of the file is dropped.
@end deffn

@geindex lock() (mailbox.mbox method)
@geindex unlock() (mailbox.mbox method)
@anchor{library/mailbox mailbox mbox lock}@anchor{3cba}
@deffn {Method} lock ()
@anchor{library/mailbox mailbox mbox unlock}@anchor{3cbb}
@deffnx {Method} unlock ()

Three locking mechanisms are used—dot locking and, if available, the
@code{flock()} and @code{lockf()} system calls.
@end deffn
@end deffn


@subsubheading See also



@table @asis

@item mbox man page from tin@footnote{http://www.tin.org/bin/man.cgi?section=5&topic=mbox}

A specification of the format, with details on locking.

@item Configuring Netscape Mail on Unix: Why The Content-Length Format is Bad@footnote{https://www.jwz.org/doc/content-length.html}

An argument for using the original mbox format rather than a variation.

@item "mbox" is a family of several mutually incompatible mailbox formats@footnote{https://www.loc.gov/preservation/digital/formats/fdd/fdd000383.shtml}

A history of mbox variations.
@end table


@node MH objects,Babyl objects,mbox objects,Mailbox objects
@anchor{library/mailbox mailbox-mh}@anchor{3cbc}@anchor{library/mailbox mh-objects}@anchor{3cbd}
@subsubsection @code{MH} objects


@geindex MH (class in mailbox)
@anchor{library/mailbox mailbox MH}@anchor{1a74}
@deffn {Class} mailbox.MH (path, factory=None, create=True)

A subclass of @ref{1458,,Mailbox} for mailboxes in MH format. Parameter `factory'
is a callable object that accepts a file-like message representation (which
behaves as if opened in binary mode) and returns a custom representation. If
`factory' is @code{None}, @ref{3cbe,,MHMessage} is used as the default message
representation. If `create' is @code{True}, the mailbox is created if it does not
exist.

MH is a directory-based mailbox format invented for the MH Message Handling
System, a mail user agent. Each message in an MH mailbox resides in its own
file. An MH mailbox may contain other MH mailboxes (called `folders') in
addition to messages. Folders may be nested indefinitely. MH mailboxes also
support `sequences', which are named lists used to logically group
messages without moving them to sub-folders. Sequences are defined in a file
called @code{.mh_sequences} in each folder.

The @code{MH} class manipulates MH mailboxes, but it does not attempt to
emulate all of @code{mh}’s behaviors. In particular, it does not modify
and is not affected by the @code{context} or @code{.mh_profile} files that
are used by @code{mh} to store its state and configuration.

@code{MH} instances have all of the methods of @ref{1458,,Mailbox} in addition
to the following:


Changed in version 3.13: Supported folders that don’t contain a @code{.mh_sequences} file.


@geindex list_folders() (mailbox.MH method)
@anchor{library/mailbox mailbox MH list_folders}@anchor{3cbf}
@deffn {Method} list_folders ()

Return a list of the names of all folders.
@end deffn

@geindex get_folder() (mailbox.MH method)
@anchor{library/mailbox mailbox MH get_folder}@anchor{3cc0}
@deffn {Method} get_folder (folder)

Return an @code{MH} instance representing the folder whose name is
`folder'. A @ref{3ca2,,NoSuchMailboxError} exception is raised if the folder
does not exist.
@end deffn

@geindex add_folder() (mailbox.MH method)
@anchor{library/mailbox mailbox MH add_folder}@anchor{3cc1}
@deffn {Method} add_folder (folder)

Create a folder whose name is `folder' and return an @code{MH} instance
representing it.
@end deffn

@geindex remove_folder() (mailbox.MH method)
@anchor{library/mailbox mailbox MH remove_folder}@anchor{3cc2}
@deffn {Method} remove_folder (folder)

Delete the folder whose name is `folder'. If the folder contains any
messages, a @ref{3ca5,,NotEmptyError} exception will be raised and the folder
will not be deleted.
@end deffn

@geindex get_sequences() (mailbox.MH method)
@anchor{library/mailbox mailbox MH get_sequences}@anchor{3cc3}
@deffn {Method} get_sequences ()

Return a dictionary of sequence names mapped to key lists. If there are no
sequences, the empty dictionary is returned.
@end deffn

@geindex set_sequences() (mailbox.MH method)
@anchor{library/mailbox mailbox MH set_sequences}@anchor{3cc4}
@deffn {Method} set_sequences (sequences)

Re-define the sequences that exist in the mailbox based upon `sequences',
a dictionary of names mapped to key lists, like returned by
@ref{3cc3,,get_sequences()}.
@end deffn

@geindex pack() (mailbox.MH method)
@anchor{library/mailbox mailbox MH pack}@anchor{3cc5}
@deffn {Method} pack ()

Rename messages in the mailbox as necessary to eliminate gaps in
numbering.  Entries in the sequences list are updated correspondingly.

@cartouche
@quotation Note 
Already-issued keys are invalidated by this operation and should not be
subsequently used.
@end quotation
@end cartouche
@end deffn

Some @ref{1458,,Mailbox} methods implemented by @code{MH} deserve special
remarks:

@geindex remove() (mailbox.MH method)
@geindex __delitem__() (mailbox.MH method)
@geindex discard() (mailbox.MH method)
@anchor{library/mailbox mailbox MH remove}@anchor{3cc6}
@deffn {Method} remove (key)
@anchor{library/mailbox mailbox MH __delitem__}@anchor{3cc7}
@deffnx {Method} __delitem__ (key)
@anchor{library/mailbox mailbox MH discard}@anchor{3cc8}
@deffnx {Method} discard (key)

These methods immediately delete the message. The MH convention of marking
a message for deletion by prepending a comma to its name is not used.
@end deffn

@geindex lock() (mailbox.MH method)
@geindex unlock() (mailbox.MH method)
@anchor{library/mailbox mailbox MH lock}@anchor{3cc9}
@deffn {Method} lock ()
@anchor{library/mailbox mailbox MH unlock}@anchor{3cca}
@deffnx {Method} unlock ()

Three locking mechanisms are used—dot locking and, if available, the
@code{flock()} and @code{lockf()} system calls. For MH mailboxes, locking
the mailbox means locking the @code{.mh_sequences} file and, only for the
duration of any operations that affect them, locking individual message
files.
@end deffn

@geindex get_file() (mailbox.MH method)
@anchor{library/mailbox mailbox MH get_file}@anchor{3ccb}
@deffn {Method} get_file (key)

Depending upon the host platform, it may not be possible to remove the
underlying message while the returned file remains open.
@end deffn

@geindex flush() (mailbox.MH method)
@anchor{library/mailbox mailbox MH flush}@anchor{3ccc}
@deffn {Method} flush ()

All changes to MH mailboxes are immediately applied, so this method does
nothing.
@end deffn

@geindex close() (mailbox.MH method)
@anchor{library/mailbox mailbox MH close}@anchor{3ccd}
@deffn {Method} close ()

@code{MH} instances do not keep any open files, so this method is
equivalent to @ref{3cca,,unlock()}.
@end deffn
@end deffn


@subsubheading See also



@table @asis

@item nmh - Message Handling System@footnote{https://www.nongnu.org/nmh/}

Home page of @code{nmh}, an updated version of the original @code{mh}.

@item MH & nmh: Email for Users & Programmers@footnote{https://rand-mh.sourceforge.io/book/}

A GPL-licensed book on @code{mh} and @code{nmh}, with some information
on the mailbox format.
@end table


@node Babyl objects,MMDF objects,MH objects,Mailbox objects
@anchor{library/mailbox babyl-objects}@anchor{3cce}@anchor{library/mailbox mailbox-babyl}@anchor{3ccf}
@subsubsection @code{Babyl} objects


@geindex Babyl (class in mailbox)
@anchor{library/mailbox mailbox Babyl}@anchor{3cd0}
@deffn {Class} mailbox.Babyl (path, factory=None, create=True)

A subclass of @ref{1458,,Mailbox} for mailboxes in Babyl format. Parameter
`factory' is a callable object that accepts a file-like message representation
(which behaves as if opened in binary mode) and returns a custom representation.
If `factory' is @code{None}, @ref{3cd1,,BabylMessage} is used as the default message
representation. If `create' is @code{True}, the mailbox is created if it does not
exist.

Babyl is a single-file mailbox format used by the Rmail mail user agent
included with Emacs. The beginning of a message is indicated by a line
containing the two characters Control-Underscore (@code{'\037'}) and Control-L
(@code{'\014'}). The end of a message is indicated by the start of the next
message or, in the case of the last message, a line containing a
Control-Underscore (@code{'\037'}) character.

Messages in a Babyl mailbox have two sets of headers, original headers and
so-called visible headers. Visible headers are typically a subset of the
original headers that have been reformatted or abridged to be more
attractive. Each message in a Babyl mailbox also has an accompanying list of
`labels', or short strings that record extra information about the
message, and a list of all user-defined labels found in the mailbox is kept
in the Babyl options section.

@code{Babyl} instances have all of the methods of @ref{1458,,Mailbox} in
addition to the following:

@geindex get_labels() (mailbox.Babyl method)
@anchor{library/mailbox mailbox Babyl get_labels}@anchor{3cd2}
@deffn {Method} get_labels ()

Return a list of the names of all user-defined labels used in the mailbox.

@cartouche
@quotation Note 
The actual messages are inspected to determine which labels exist in
the mailbox rather than consulting the list of labels in the Babyl
options section, but the Babyl section is updated whenever the mailbox
is modified.
@end quotation
@end cartouche
@end deffn

Some @ref{1458,,Mailbox} methods implemented by @code{Babyl} deserve special
remarks:

@geindex get_file() (mailbox.Babyl method)
@anchor{library/mailbox mailbox Babyl get_file}@anchor{3cd3}
@deffn {Method} get_file (key)

In Babyl mailboxes, the headers of a message are not stored contiguously
with the body of the message. To generate a file-like representation, the
headers and body are copied together into an @ref{10aa,,io.BytesIO} instance,
which has an API identical to that of a
file. As a result, the file-like object is truly independent of the
underlying mailbox but does not save memory compared to a string
representation.
@end deffn

@geindex lock() (mailbox.Babyl method)
@geindex unlock() (mailbox.Babyl method)
@anchor{library/mailbox mailbox Babyl lock}@anchor{3cd4}
@deffn {Method} lock ()
@anchor{library/mailbox mailbox Babyl unlock}@anchor{3cd5}
@deffnx {Method} unlock ()

Three locking mechanisms are used—dot locking and, if available, the
@code{flock()} and @code{lockf()} system calls.
@end deffn
@end deffn


@subsubheading See also



@table @asis

@item Format of Version 5 Babyl Files@footnote{https://quimby.gnus.org/notes/BABYL}

A specification of the Babyl format.

@item Reading Mail with Rmail@footnote{https://www.gnu.org/software/emacs/manual/html_node/emacs/Rmail.html}

The Rmail manual, with some information on Babyl semantics.
@end table


@node MMDF objects,,Babyl objects,Mailbox objects
@anchor{library/mailbox mailbox-mmdf}@anchor{3cd6}@anchor{library/mailbox mmdf-objects}@anchor{3cd7}
@subsubsection @code{MMDF} objects


@geindex MMDF (class in mailbox)
@anchor{library/mailbox mailbox MMDF}@anchor{1a43}
@deffn {Class} mailbox.MMDF (path, factory=None, create=True)

A subclass of @ref{1458,,Mailbox} for mailboxes in MMDF format. Parameter `factory'
is a callable object that accepts a file-like message representation (which
behaves as if opened in binary mode) and returns a custom representation. If
`factory' is @code{None}, @ref{3cd8,,MMDFMessage} is used as the default message
representation. If `create' is @code{True}, the mailbox is created if it does not
exist.

MMDF is a single-file mailbox format invented for the Multichannel Memorandum
Distribution Facility, a mail transfer agent. Each message is in the same
form as an mbox message but is bracketed before and after by lines containing
four Control-A (@code{'\001'}) characters. As with the mbox format, the
beginning of each message is indicated by a line whose first five characters
are “From “, but additional occurrences of “From “ are not transformed to
“>From “ when storing messages because the extra message separator lines
prevent mistaking such occurrences for the starts of subsequent messages.

Some @ref{1458,,Mailbox} methods implemented by @code{MMDF} deserve special
remarks:

@geindex get_bytes() (mailbox.MMDF method)
@anchor{library/mailbox mailbox MMDF get_bytes}@anchor{3cd9}
@deffn {Method} get_bytes (key, from_=False)

Note: This method has an extra parameter (`from_') compared with other classes.
The first line of an mbox file entry is the Unix “From “ line.
If `from_' is False, the first line of the file is dropped.
@end deffn

@geindex get_file() (mailbox.MMDF method)
@anchor{library/mailbox mailbox MMDF get_file}@anchor{3cda}
@deffn {Method} get_file (key, from_=False)

Using the file after calling @ref{1a03,,flush()} or
@ref{3c9b,,close()} on the @code{MMDF} instance may yield
unpredictable results or raise an exception.

Note: This method has an extra parameter (`from_') compared with other classes.
The first line of an mbox file entry is the Unix “From “ line.
If `from_' is False, the first line of the file is dropped.
@end deffn

@geindex lock() (mailbox.MMDF method)
@geindex unlock() (mailbox.MMDF method)
@anchor{library/mailbox mailbox MMDF lock}@anchor{3cdb}
@deffn {Method} lock ()
@anchor{library/mailbox mailbox MMDF unlock}@anchor{3cdc}
@deffnx {Method} unlock ()

Three locking mechanisms are used—dot locking and, if available, the
@code{flock()} and @code{lockf()} system calls.
@end deffn
@end deffn


@subsubheading See also



@table @asis

@item mmdf man page from tin@footnote{http://www.tin.org/bin/man.cgi?section=5&topic=mmdf}

A specification of MMDF format from the documentation of tin, a newsreader.

@item MMDF@footnote{https://en.wikipedia.org/wiki/MMDF}

A Wikipedia article describing the Multichannel Memorandum Distribution
Facility.
@end table


@node Message objects,Exceptions<21>,Mailbox objects,mailbox — Manipulate mailboxes in various formats
@anchor{library/mailbox mailbox-message-objects}@anchor{3cdd}@anchor{library/mailbox message-objects}@anchor{3cde}
@subsubsection @code{Message} objects


@geindex Message (class in mailbox)
@anchor{library/mailbox mailbox Message}@anchor{145c}
@deffn {Class} mailbox.Message (message=None)

A subclass of the @ref{48,,email.message} module’s
@ref{581,,Message}. Subclasses of @code{mailbox.Message} add
mailbox-format-specific state and behavior.

If `message' is omitted, the new instance is created in a default, empty state.
If `message' is an @ref{581,,email.message.Message} instance, its contents are
copied; furthermore, any format-specific information is converted insofar as
possible if `message' is a @code{Message} instance. If `message' is a string,
a byte string,
or a file, it should contain an 
@geindex RFC; RFC 5322
RFC 5322@footnote{https://datatracker.ietf.org/doc/html/rfc5322.html}-compliant message, which is read
and parsed.  Files should be open in binary mode, but text mode files
are accepted for backward compatibility.

The format-specific state and behaviors offered by subclasses vary, but in
general it is only the properties that are not specific to a particular
mailbox that are supported (although presumably the properties are specific
to a particular mailbox format). For example, file offsets for single-file
mailbox formats and file names for directory-based mailbox formats are not
retained, because they are only applicable to the original mailbox. But state
such as whether a message has been read by the user or marked as important is
retained, because it applies to the message itself.

There is no requirement that @code{Message} instances be used to represent
messages retrieved using @ref{1458,,Mailbox} instances. In some situations, the
time and memory required to generate @code{Message} representations might
not be acceptable. For such situations, @code{Mailbox} instances also
offer string and file-like representations, and a custom message factory may
be specified when a @code{Mailbox} instance is initialized.
@end deffn

@menu
* MaildirMessage objects:: 
* mboxMessage objects:: 
* MHMessage objects:: 
* BabylMessage objects:: 
* MMDFMessage objects:: 

@end menu

@node MaildirMessage objects,mboxMessage objects,,Message objects
@anchor{library/mailbox mailbox-maildirmessage}@anchor{3cdf}@anchor{library/mailbox maildirmessage-objects}@anchor{3ce0}
@subsubsection @code{MaildirMessage} objects


@geindex MaildirMessage (class in mailbox)
@anchor{library/mailbox mailbox MaildirMessage}@anchor{3c9e}
@deffn {Class} mailbox.MaildirMessage (message=None)

A message with Maildir-specific behaviors. Parameter `message' has the same
meaning as with the @ref{145c,,Message} constructor.

Typically, a mail user agent application moves all of the messages in the
@code{new} subdirectory to the @code{cur} subdirectory after the first time
the user opens and closes the mailbox, recording that the messages are old
whether or not they’ve actually been read. Each message in @code{cur} has an
“info” section added to its file name to store information about its state.
(Some mail readers may also add an “info” section to messages in
@code{new}.)  The “info” section may take one of two forms: it may contain
“2,” followed by a list of standardized flags (e.g., “2,FR”) or it may
contain “1,” followed by so-called experimental information. Standard flags
for Maildir messages are as follows:


@multitable {xxxxxxxx} {xxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Flag

@tab

Meaning

@tab

Explanation

@item

D

@tab

Draft

@tab

Under composition

@item

F

@tab

Flagged

@tab

Marked as important

@item

P

@tab

Passed

@tab

Forwarded, resent, or bounced

@item

R

@tab

Replied

@tab

Replied to

@item

S

@tab

Seen

@tab

Read

@item

T

@tab

Trashed

@tab

Marked for subsequent deletion

@end multitable


@code{MaildirMessage} instances offer the following methods:

@geindex get_subdir() (mailbox.MaildirMessage method)
@anchor{library/mailbox mailbox MaildirMessage get_subdir}@anchor{3ce1}
@deffn {Method} get_subdir ()

Return either “new” (if the message should be stored in the @code{new}
subdirectory) or “cur” (if the message should be stored in the @code{cur}
subdirectory).

@cartouche
@quotation Note 
A message is typically moved from @code{new} to @code{cur} after its
mailbox has been accessed, whether or not the message has been
read. A message @code{msg} has been read if @code{"S" in msg.get_flags()} is
@code{True}.
@end quotation
@end cartouche
@end deffn

@geindex set_subdir() (mailbox.MaildirMessage method)
@anchor{library/mailbox mailbox MaildirMessage set_subdir}@anchor{3ce2}
@deffn {Method} set_subdir (subdir)

Set the subdirectory the message should be stored in. Parameter `subdir'
must be either “new” or “cur”.
@end deffn

@geindex get_flags() (mailbox.MaildirMessage method)
@anchor{library/mailbox mailbox MaildirMessage get_flags}@anchor{3ca7}
@deffn {Method} get_flags ()

Return a string specifying the flags that are currently set. If the
message complies with the standard Maildir format, the result is the
concatenation in alphabetical order of zero or one occurrence of each of
@code{'D'}, @code{'F'}, @code{'P'}, @code{'R'}, @code{'S'}, and @code{'T'}. The empty string
is returned if no flags are set or if “info” contains experimental
semantics.
@end deffn

@geindex set_flags() (mailbox.MaildirMessage method)
@anchor{library/mailbox mailbox MaildirMessage set_flags}@anchor{3ca8}
@deffn {Method} set_flags (flags)

Set the flags specified by `flags' and unset all others.
@end deffn

@geindex add_flag() (mailbox.MaildirMessage method)
@anchor{library/mailbox mailbox MaildirMessage add_flag}@anchor{3ca9}
@deffn {Method} add_flag (flag)

Set the flag(s) specified by `flag' without changing other flags. To add
more than one flag at a time, `flag' may be a string of more than one
character. The current “info” is overwritten whether or not it contains
experimental information rather than flags.
@end deffn

@geindex remove_flag() (mailbox.MaildirMessage method)
@anchor{library/mailbox mailbox MaildirMessage remove_flag}@anchor{3caa}
@deffn {Method} remove_flag (flag)

Unset the flag(s) specified by `flag' without changing other flags. To
remove more than one flag at a time, `flag' may be a string of more than
one character.  If “info” contains experimental information rather than
flags, the current “info” is not modified.
@end deffn

@geindex get_date() (mailbox.MaildirMessage method)
@anchor{library/mailbox mailbox MaildirMessage get_date}@anchor{3ce3}
@deffn {Method} get_date ()

Return the delivery date of the message as a floating-point number
representing seconds since the epoch.
@end deffn

@geindex set_date() (mailbox.MaildirMessage method)
@anchor{library/mailbox mailbox MaildirMessage set_date}@anchor{3ce4}
@deffn {Method} set_date (date)

Set the delivery date of the message to `date', a floating-point number
representing seconds since the epoch.
@end deffn

@geindex get_info() (mailbox.MaildirMessage method)
@anchor{library/mailbox mailbox MaildirMessage get_info}@anchor{3cac}
@deffn {Method} get_info ()

Return a string containing the “info” for a message. This is useful for
accessing and modifying “info” that is experimental (i.e., not a list of
flags).
@end deffn

@geindex set_info() (mailbox.MaildirMessage method)
@anchor{library/mailbox mailbox MaildirMessage set_info}@anchor{3cad}
@deffn {Method} set_info (info)

Set “info” to `info', which should be a string.
@end deffn
@end deffn

When a @code{MaildirMessage} instance is created based upon an
@ref{3b44,,mboxMessage} or @ref{3cd8,,MMDFMessage} instance, the @code{Status}
and @code{X-Status} headers are omitted and the following conversions
take place:


@multitable {xxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Resulting state

@tab

@ref{3b44,,mboxMessage} or @ref{3cd8,,MMDFMessage}
state

@item

“cur” subdirectory

@tab

O flag

@item

F flag

@tab

F flag

@item

R flag

@tab

A flag

@item

S flag

@tab

R flag

@item

T flag

@tab

D flag

@end multitable


When a @code{MaildirMessage} instance is created based upon an
@ref{3cbe,,MHMessage} instance, the following conversions take place:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Resulting state

@tab

@ref{3cbe,,MHMessage} state

@item

“cur” subdirectory

@tab

“unseen” sequence

@item

“cur” subdirectory and S flag

@tab

no “unseen” sequence

@item

F flag

@tab

“flagged” sequence

@item

R flag

@tab

“replied” sequence

@end multitable


When a @code{MaildirMessage} instance is created based upon a
@ref{3cd1,,BabylMessage} instance, the following conversions take place:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Resulting state

@tab

@ref{3cd1,,BabylMessage} state

@item

“cur” subdirectory

@tab

“unseen” label

@item

“cur” subdirectory and S flag

@tab

no “unseen” label

@item

P flag

@tab

“forwarded” or “resent” label

@item

R flag

@tab

“answered” label

@item

T flag

@tab

“deleted” label

@end multitable


@node mboxMessage objects,MHMessage objects,MaildirMessage objects,Message objects
@anchor{library/mailbox mailbox-mboxmessage}@anchor{3ce5}@anchor{library/mailbox mboxmessage-objects}@anchor{3ce6}
@subsubsection @code{mboxMessage} objects


@geindex mboxMessage (class in mailbox)
@anchor{library/mailbox mailbox mboxMessage}@anchor{3b44}
@deffn {Class} mailbox.mboxMessage (message=None)

A message with mbox-specific behaviors. Parameter `message' has the same meaning
as with the @ref{145c,,Message} constructor.

Messages in an mbox mailbox are stored together in a single file. The
sender’s envelope address and the time of delivery are typically stored in a
line beginning with “From “ that is used to indicate the start of a message,
though there is considerable variation in the exact format of this data among
mbox implementations. Flags that indicate the state of the message, such as
whether it has been read or marked as important, are typically stored in
@code{Status} and @code{X-Status} headers.

Conventional flags for mbox messages are as follows:


@multitable {xxxxxxxx} {xxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Flag

@tab

Meaning

@tab

Explanation

@item

R

@tab

Read

@tab

Read

@item

O

@tab

Old

@tab

Previously detected by MUA

@item

D

@tab

Deleted

@tab

Marked for subsequent deletion

@item

F

@tab

Flagged

@tab

Marked as important

@item

A

@tab

Answered

@tab

Replied to

@end multitable


The “R” and “O” flags are stored in the @code{Status} header, and the
“D”, “F”, and “A” flags are stored in the @code{X-Status} header. The
flags and headers typically appear in the order mentioned.

@code{mboxMessage} instances offer the following methods:

@geindex get_from() (mailbox.mboxMessage method)
@anchor{library/mailbox mailbox mboxMessage get_from}@anchor{3ce7}
@deffn {Method} get_from ()

Return a string representing the “From “ line that marks the start of the
message in an mbox mailbox. The leading “From “ and the trailing newline
are excluded.
@end deffn

@geindex set_from() (mailbox.mboxMessage method)
@anchor{library/mailbox mailbox mboxMessage set_from}@anchor{3ce8}
@deffn {Method} set_from (from_, time_=None)

Set the “From “ line to `from_', which should be specified without a
leading “From “ or trailing newline. For convenience, `time_' may be
specified and will be formatted appropriately and appended to `from_'. If
`time_' is specified, it should be a @ref{eec,,time.struct_time} instance, a
tuple suitable for passing to @ref{13f5,,time.strftime()}, or @code{True} (to use
@ref{13cc,,time.gmtime()}).
@end deffn

@geindex get_flags() (mailbox.mboxMessage method)
@anchor{library/mailbox mailbox mboxMessage get_flags}@anchor{3ce9}
@deffn {Method} get_flags ()

Return a string specifying the flags that are currently set. If the
message complies with the conventional format, the result is the
concatenation in the following order of zero or one occurrence of each of
@code{'R'}, @code{'O'}, @code{'D'}, @code{'F'}, and @code{'A'}.
@end deffn

@geindex set_flags() (mailbox.mboxMessage method)
@anchor{library/mailbox mailbox mboxMessage set_flags}@anchor{3cea}
@deffn {Method} set_flags (flags)

Set the flags specified by `flags' and unset all others. Parameter `flags'
should be the concatenation in any order of zero or more occurrences of
each of @code{'R'}, @code{'O'}, @code{'D'}, @code{'F'}, and @code{'A'}.
@end deffn

@geindex add_flag() (mailbox.mboxMessage method)
@anchor{library/mailbox mailbox mboxMessage add_flag}@anchor{3ceb}
@deffn {Method} add_flag (flag)

Set the flag(s) specified by `flag' without changing other flags. To add
more than one flag at a time, `flag' may be a string of more than one
character.
@end deffn

@geindex remove_flag() (mailbox.mboxMessage method)
@anchor{library/mailbox mailbox mboxMessage remove_flag}@anchor{3cec}
@deffn {Method} remove_flag (flag)

Unset the flag(s) specified by `flag' without changing other flags. To
remove more than one flag at a time, `flag' may be a string of more than
one character.
@end deffn
@end deffn

When an @code{mboxMessage} instance is created based upon a
@ref{3c9e,,MaildirMessage} instance, a “From “ line is generated based upon the
@code{MaildirMessage} instance’s delivery date, and the following conversions
take place:


@multitable {xxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Resulting state

@tab

@ref{3c9e,,MaildirMessage} state

@item

R flag

@tab

S flag

@item

O flag

@tab

“cur” subdirectory

@item

D flag

@tab

T flag

@item

F flag

@tab

F flag

@item

A flag

@tab

R flag

@end multitable


When an @code{mboxMessage} instance is created based upon an
@ref{3cbe,,MHMessage} instance, the following conversions take place:


@multitable {xxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Resulting state

@tab

@ref{3cbe,,MHMessage} state

@item

R flag and O flag

@tab

no “unseen” sequence

@item

O flag

@tab

“unseen” sequence

@item

F flag

@tab

“flagged” sequence

@item

A flag

@tab

“replied” sequence

@end multitable


When an @code{mboxMessage} instance is created based upon a
@ref{3cd1,,BabylMessage} instance, the following conversions take place:


@multitable {xxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Resulting state

@tab

@ref{3cd1,,BabylMessage} state

@item

R flag and O flag

@tab

no “unseen” label

@item

O flag

@tab

“unseen” label

@item

D flag

@tab

“deleted” label

@item

A flag

@tab

“answered” label

@end multitable


When a @code{mboxMessage} instance is created based upon an
@ref{3cd8,,MMDFMessage}
instance, the “From “ line is copied and all flags directly correspond:


@multitable {xxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Resulting state

@tab

@ref{3cd8,,MMDFMessage} state

@item

R flag

@tab

R flag

@item

O flag

@tab

O flag

@item

D flag

@tab

D flag

@item

F flag

@tab

F flag

@item

A flag

@tab

A flag

@end multitable


@node MHMessage objects,BabylMessage objects,mboxMessage objects,Message objects
@anchor{library/mailbox mailbox-mhmessage}@anchor{3ced}@anchor{library/mailbox mhmessage-objects}@anchor{3cee}
@subsubsection @code{MHMessage} objects


@geindex MHMessage (class in mailbox)
@anchor{library/mailbox mailbox MHMessage}@anchor{3cbe}
@deffn {Class} mailbox.MHMessage (message=None)

A message with MH-specific behaviors. Parameter `message' has the same meaning
as with the @ref{145c,,Message} constructor.

MH messages do not support marks or flags in the traditional sense, but they
do support sequences, which are logical groupings of arbitrary messages. Some
mail reading programs (although not the standard @code{mh} and
@code{nmh}) use sequences in much the same way flags are used with other
formats, as follows:


@multitable {xxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Sequence

@tab

Explanation

@item

unseen

@tab

Not read, but previously detected by MUA

@item

replied

@tab

Replied to

@item

flagged

@tab

Marked as important

@end multitable


@code{MHMessage} instances offer the following methods:

@geindex get_sequences() (mailbox.MHMessage method)
@anchor{library/mailbox mailbox MHMessage get_sequences}@anchor{3cef}
@deffn {Method} get_sequences ()

Return a list of the names of sequences that include this message.
@end deffn

@geindex set_sequences() (mailbox.MHMessage method)
@anchor{library/mailbox mailbox MHMessage set_sequences}@anchor{3cf0}
@deffn {Method} set_sequences (sequences)

Set the list of sequences that include this message.
@end deffn

@geindex add_sequence() (mailbox.MHMessage method)
@anchor{library/mailbox mailbox MHMessage add_sequence}@anchor{3cf1}
@deffn {Method} add_sequence (sequence)

Add `sequence' to the list of sequences that include this message.
@end deffn

@geindex remove_sequence() (mailbox.MHMessage method)
@anchor{library/mailbox mailbox MHMessage remove_sequence}@anchor{3cf2}
@deffn {Method} remove_sequence (sequence)

Remove `sequence' from the list of sequences that include this message.
@end deffn
@end deffn

When an @code{MHMessage} instance is created based upon a
@ref{3c9e,,MaildirMessage} instance, the following conversions take place:


@multitable {xxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Resulting state

@tab

@ref{3c9e,,MaildirMessage} state

@item

“unseen” sequence

@tab

no S flag

@item

“replied” sequence

@tab

R flag

@item

“flagged” sequence

@tab

F flag

@end multitable


When an @code{MHMessage} instance is created based upon an
@ref{3b44,,mboxMessage} or @ref{3cd8,,MMDFMessage} instance, the @code{Status}
and @code{X-Status} headers are omitted and the following conversions
take place:


@multitable {xxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Resulting state

@tab

@ref{3b44,,mboxMessage} or @ref{3cd8,,MMDFMessage}
state

@item

“unseen” sequence

@tab

no R flag

@item

“replied” sequence

@tab

A flag

@item

“flagged” sequence

@tab

F flag

@end multitable


When an @code{MHMessage} instance is created based upon a
@ref{3cd1,,BabylMessage} instance, the following conversions take place:


@multitable {xxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Resulting state

@tab

@ref{3cd1,,BabylMessage} state

@item

“unseen” sequence

@tab

“unseen” label

@item

“replied” sequence

@tab

“answered” label

@end multitable


@node BabylMessage objects,MMDFMessage objects,MHMessage objects,Message objects
@anchor{library/mailbox babylmessage-objects}@anchor{3cf3}@anchor{library/mailbox mailbox-babylmessage}@anchor{3cf4}
@subsubsection @code{BabylMessage} objects


@geindex BabylMessage (class in mailbox)
@anchor{library/mailbox mailbox BabylMessage}@anchor{3cd1}
@deffn {Class} mailbox.BabylMessage (message=None)

A message with Babyl-specific behaviors. Parameter `message' has the same
meaning as with the @ref{145c,,Message} constructor.

Certain message labels, called `attributes', are defined by convention
to have special meanings. The attributes are as follows:


@multitable {xxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Label

@tab

Explanation

@item

unseen

@tab

Not read, but previously detected by MUA

@item

deleted

@tab

Marked for subsequent deletion

@item

filed

@tab

Copied to another file or mailbox

@item

answered

@tab

Replied to

@item

forwarded

@tab

Forwarded

@item

edited

@tab

Modified by the user

@item

resent

@tab

Resent

@end multitable


By default, Rmail displays only visible headers. The @code{BabylMessage}
class, though, uses the original headers because they are more
complete. Visible headers may be accessed explicitly if desired.

@code{BabylMessage} instances offer the following methods:

@geindex get_labels() (mailbox.BabylMessage method)
@anchor{library/mailbox mailbox BabylMessage get_labels}@anchor{3cf5}
@deffn {Method} get_labels ()

Return a list of labels on the message.
@end deffn

@geindex set_labels() (mailbox.BabylMessage method)
@anchor{library/mailbox mailbox BabylMessage set_labels}@anchor{3cf6}
@deffn {Method} set_labels (labels)

Set the list of labels on the message to `labels'.
@end deffn

@geindex add_label() (mailbox.BabylMessage method)
@anchor{library/mailbox mailbox BabylMessage add_label}@anchor{3cf7}
@deffn {Method} add_label (label)

Add `label' to the list of labels on the message.
@end deffn

@geindex remove_label() (mailbox.BabylMessage method)
@anchor{library/mailbox mailbox BabylMessage remove_label}@anchor{3cf8}
@deffn {Method} remove_label (label)

Remove `label' from the list of labels on the message.
@end deffn

@geindex get_visible() (mailbox.BabylMessage method)
@anchor{library/mailbox mailbox BabylMessage get_visible}@anchor{3cf9}
@deffn {Method} get_visible ()

Return a @ref{145c,,Message} instance whose headers are the message’s
visible headers and whose body is empty.
@end deffn

@geindex set_visible() (mailbox.BabylMessage method)
@anchor{library/mailbox mailbox BabylMessage set_visible}@anchor{3cfa}
@deffn {Method} set_visible (visible)

Set the message’s visible headers to be the same as the headers in
`message'.  Parameter `visible' should be a @ref{145c,,Message} instance, an
@ref{581,,email.message.Message} instance, a string, or a file-like object
(which should be open in text mode).
@end deffn

@geindex update_visible() (mailbox.BabylMessage method)
@anchor{library/mailbox mailbox BabylMessage update_visible}@anchor{3cfb}
@deffn {Method} update_visible ()

When a @code{BabylMessage} instance’s original headers are modified, the
visible headers are not automatically modified to correspond. This method
updates the visible headers as follows: each visible header with a
corresponding original header is set to the value of the original header,
each visible header without a corresponding original header is removed,
and any of @code{Date}, @code{From}, @code{Reply-To},
@code{To}, @code{CC}, and @code{Subject} that are
present in the original headers but not the visible headers are added to
the visible headers.
@end deffn
@end deffn

When a @code{BabylMessage} instance is created based upon a
@ref{3c9e,,MaildirMessage} instance, the following conversions take place:


@multitable {xxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Resulting state

@tab

@ref{3c9e,,MaildirMessage} state

@item

“unseen” label

@tab

no S flag

@item

“deleted” label

@tab

T flag

@item

“answered” label

@tab

R flag

@item

“forwarded” label

@tab

P flag

@end multitable


When a @code{BabylMessage} instance is created based upon an
@ref{3b44,,mboxMessage} or @ref{3cd8,,MMDFMessage} instance, the @code{Status}
and @code{X-Status} headers are omitted and the following conversions
take place:


@multitable {xxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Resulting state

@tab

@ref{3b44,,mboxMessage} or @ref{3cd8,,MMDFMessage}
state

@item

“unseen” label

@tab

no R flag

@item

“deleted” label

@tab

D flag

@item

“answered” label

@tab

A flag

@end multitable


When a @code{BabylMessage} instance is created based upon an
@ref{3cbe,,MHMessage} instance, the following conversions take place:


@multitable {xxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Resulting state

@tab

@ref{3cbe,,MHMessage} state

@item

“unseen” label

@tab

“unseen” sequence

@item

“answered” label

@tab

“replied” sequence

@end multitable


@node MMDFMessage objects,,BabylMessage objects,Message objects
@anchor{library/mailbox mailbox-mmdfmessage}@anchor{3cfc}@anchor{library/mailbox mmdfmessage-objects}@anchor{3cfd}
@subsubsection @code{MMDFMessage} objects


@geindex MMDFMessage (class in mailbox)
@anchor{library/mailbox mailbox MMDFMessage}@anchor{3cd8}
@deffn {Class} mailbox.MMDFMessage (message=None)

A message with MMDF-specific behaviors. Parameter `message' has the same meaning
as with the @ref{145c,,Message} constructor.

As with message in an mbox mailbox, MMDF messages are stored with the
sender’s address and the delivery date in an initial line beginning with
“From “.  Likewise, flags that indicate the state of the message are
typically stored in @code{Status} and @code{X-Status} headers.

Conventional flags for MMDF messages are identical to those of mbox message
and are as follows:


@multitable {xxxxxxxx} {xxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Flag

@tab

Meaning

@tab

Explanation

@item

R

@tab

Read

@tab

Read

@item

O

@tab

Old

@tab

Previously detected by MUA

@item

D

@tab

Deleted

@tab

Marked for subsequent deletion

@item

F

@tab

Flagged

@tab

Marked as important

@item

A

@tab

Answered

@tab

Replied to

@end multitable


The “R” and “O” flags are stored in the @code{Status} header, and the
“D”, “F”, and “A” flags are stored in the @code{X-Status} header. The
flags and headers typically appear in the order mentioned.

@code{MMDFMessage} instances offer the following methods, which are
identical to those offered by @ref{3b44,,mboxMessage}:

@geindex get_from() (mailbox.MMDFMessage method)
@anchor{library/mailbox mailbox MMDFMessage get_from}@anchor{3cfe}
@deffn {Method} get_from ()

Return a string representing the “From “ line that marks the start of the
message in an mbox mailbox. The leading “From “ and the trailing newline
are excluded.
@end deffn

@geindex set_from() (mailbox.MMDFMessage method)
@anchor{library/mailbox mailbox MMDFMessage set_from}@anchor{3cff}
@deffn {Method} set_from (from_, time_=None)

Set the “From “ line to `from_', which should be specified without a
leading “From “ or trailing newline. For convenience, `time_' may be
specified and will be formatted appropriately and appended to `from_'. If
`time_' is specified, it should be a @ref{eec,,time.struct_time} instance, a
tuple suitable for passing to @ref{13f5,,time.strftime()}, or @code{True} (to use
@ref{13cc,,time.gmtime()}).
@end deffn

@geindex get_flags() (mailbox.MMDFMessage method)
@anchor{library/mailbox mailbox MMDFMessage get_flags}@anchor{3d00}
@deffn {Method} get_flags ()

Return a string specifying the flags that are currently set. If the
message complies with the conventional format, the result is the
concatenation in the following order of zero or one occurrence of each of
@code{'R'}, @code{'O'}, @code{'D'}, @code{'F'}, and @code{'A'}.
@end deffn

@geindex set_flags() (mailbox.MMDFMessage method)
@anchor{library/mailbox mailbox MMDFMessage set_flags}@anchor{3d01}
@deffn {Method} set_flags (flags)

Set the flags specified by `flags' and unset all others. Parameter `flags'
should be the concatenation in any order of zero or more occurrences of
each of @code{'R'}, @code{'O'}, @code{'D'}, @code{'F'}, and @code{'A'}.
@end deffn

@geindex add_flag() (mailbox.MMDFMessage method)
@anchor{library/mailbox mailbox MMDFMessage add_flag}@anchor{3d02}
@deffn {Method} add_flag (flag)

Set the flag(s) specified by `flag' without changing other flags. To add
more than one flag at a time, `flag' may be a string of more than one
character.
@end deffn

@geindex remove_flag() (mailbox.MMDFMessage method)
@anchor{library/mailbox mailbox MMDFMessage remove_flag}@anchor{3d03}
@deffn {Method} remove_flag (flag)

Unset the flag(s) specified by `flag' without changing other flags. To
remove more than one flag at a time, `flag' may be a string of more than
one character.
@end deffn
@end deffn

When an @code{MMDFMessage} instance is created based upon a
@ref{3c9e,,MaildirMessage} instance, a “From “ line is generated based upon the
@code{MaildirMessage} instance’s delivery date, and the following conversions
take place:


@multitable {xxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Resulting state

@tab

@ref{3c9e,,MaildirMessage} state

@item

R flag

@tab

S flag

@item

O flag

@tab

“cur” subdirectory

@item

D flag

@tab

T flag

@item

F flag

@tab

F flag

@item

A flag

@tab

R flag

@end multitable


When an @code{MMDFMessage} instance is created based upon an
@ref{3cbe,,MHMessage} instance, the following conversions take place:


@multitable {xxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Resulting state

@tab

@ref{3cbe,,MHMessage} state

@item

R flag and O flag

@tab

no “unseen” sequence

@item

O flag

@tab

“unseen” sequence

@item

F flag

@tab

“flagged” sequence

@item

A flag

@tab

“replied” sequence

@end multitable


When an @code{MMDFMessage} instance is created based upon a
@ref{3cd1,,BabylMessage} instance, the following conversions take place:


@multitable {xxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Resulting state

@tab

@ref{3cd1,,BabylMessage} state

@item

R flag and O flag

@tab

no “unseen” label

@item

O flag

@tab

“unseen” label

@item

D flag

@tab

“deleted” label

@item

A flag

@tab

“answered” label

@end multitable


When an @code{MMDFMessage} instance is created based upon an
@ref{3b44,,mboxMessage} instance, the “From “ line is copied and all flags directly
correspond:


@multitable {xxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Resulting state

@tab

@ref{3b44,,mboxMessage} state

@item

R flag

@tab

R flag

@item

O flag

@tab

O flag

@item

D flag

@tab

D flag

@item

F flag

@tab

F flag

@item

A flag

@tab

A flag

@end multitable


@node Exceptions<21>,Examples<24>,Message objects,mailbox — Manipulate mailboxes in various formats
@anchor{library/mailbox exceptions}@anchor{3d04}
@subsubsection Exceptions


The following exception classes are defined in the @code{mailbox} module:

@geindex Error
@anchor{library/mailbox mailbox Error}@anchor{3d05}
@deffn {Exception} mailbox.Error

The base class for all other module-specific exceptions.
@end deffn

@geindex NoSuchMailboxError
@anchor{library/mailbox mailbox NoSuchMailboxError}@anchor{3ca2}
@deffn {Exception} mailbox.NoSuchMailboxError

Raised when a mailbox is expected but is not found, such as when instantiating a
@ref{1458,,Mailbox} subclass with a path that does not exist (and with the `create'
parameter set to @code{False}), or when opening a folder that does not exist.
@end deffn

@geindex NotEmptyError
@anchor{library/mailbox mailbox NotEmptyError}@anchor{3ca5}
@deffn {Exception} mailbox.NotEmptyError

Raised when a mailbox is not empty but is expected to be, such as when deleting
a folder that contains messages.
@end deffn

@geindex ExternalClashError
@anchor{library/mailbox mailbox ExternalClashError}@anchor{3c9a}
@deffn {Exception} mailbox.ExternalClashError

Raised when some mailbox-related condition beyond the control of the program
causes it to be unable to proceed, such as when failing to acquire a lock that
another program already holds, or when a uniquely generated file name
already exists.
@end deffn

@geindex FormatError
@anchor{library/mailbox mailbox FormatError}@anchor{3d06}
@deffn {Exception} mailbox.FormatError

Raised when the data in a file cannot be parsed, such as when an @ref{1a74,,MH}
instance attempts to read a corrupted @code{.mh_sequences} file.
@end deffn

@node Examples<24>,,Exceptions<21>,mailbox — Manipulate mailboxes in various formats
@anchor{library/mailbox examples}@anchor{3d07}@anchor{library/mailbox mailbox-examples}@anchor{3d08}
@subsubsection Examples


A simple example of printing the subjects of all messages in a mailbox that seem
interesting:

@example
import mailbox
for message in mailbox.mbox('~/mbox'):
    subject = message['subject']       # Could possibly be None.
    if subject and 'python' in subject.lower():
        print(subject)
@end example

To copy all mail from a Babyl mailbox to an MH mailbox, converting all of the
format-specific information that can be converted:

@example
import mailbox
destination = mailbox.MH('~/Mail')
destination.lock()
for message in mailbox.Babyl('~/RMAIL'):
    destination.add(mailbox.MHMessage(message))
destination.flush()
destination.unlock()
@end example

This example sorts mail from several mailing lists into different mailboxes,
being careful to avoid mail corruption due to concurrent modification by other
programs, mail loss due to interruption of the program, or premature termination
due to malformed messages in the mailbox:

@example
import mailbox
import email.errors

list_names = ('python-list', 'python-dev', 'python-bugs')

boxes = @{name: mailbox.mbox('~/email/%s' % name) for name in list_names@}
inbox = mailbox.Maildir('~/Maildir', factory=None)

for key in inbox.iterkeys():
    try:
        message = inbox[key]
    except email.errors.MessageParseError:
        continue                # The message is malformed. Just leave it.

    for name in list_names:
        list_id = message['list-id']
        if list_id and name in list_id:
            # Get mailbox to use
            box = boxes[name]

            # Write copy to disk before removing original.
            # If there's a crash, you might duplicate a message, but
            # that's better than losing a message completely.
            box.lock()
            box.add(message)
            box.flush()
            box.unlock()

            # Remove original message
            inbox.lock()
            inbox.discard(key)
            inbox.flush()
            inbox.unlock()
            break               # Found destination, so stop looking.

for box in boxes.itervalues():
    box.close()
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node mimetypes — Map filenames to MIME types,base64 — Base16 Base32 Base64 Base85 Data Encodings,mailbox — Manipulate mailboxes in various formats,Internet Data Handling
@anchor{library/mimetypes doc}@anchor{3d09}@anchor{library/mimetypes mimetypes-map-filenames-to-mime-types}@anchor{3d0a}@anchor{library/mimetypes module-mimetypes}@anchor{93}@anchor{library/mimetypes translation-repo}@anchor{3d0b}
@subsection @code{mimetypes} — Map filenames to MIME types


@geindex module; mimetypes

`Source code:' Lib/mimetypes.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/mimetypes.py}

@geindex MIME; content type


__________________________________________________________________


The @code{mimetypes} module converts between a filename or URL and the MIME type
associated with the filename extension.  Conversions are provided from filename
to MIME type and from MIME type to filename extension; encodings are not
supported for the latter conversion.

The module provides one class and a number of convenience functions. The
functions are the normal interface to this module, but some applications may be
interested in the class as well.

The functions described below provide the primary interface for this module.  If
the module has not been initialized, they will call @ref{3d0c,,init()} if they rely on
the information @code{init()} sets up.

@geindex guess_type() (in module mimetypes)
@anchor{library/mimetypes mimetypes guess_type}@anchor{518}
@deffn {Function} mimetypes.guess_type (url, strict=True)

@geindex MIME; headers

Guess the type of a file based on its filename, path or URL, given by `url'.
URL can be a string or a @ref{5a1,,path-like object}.

The return value is a tuple @code{(type, encoding)} where `type' is @code{None} if the
type can’t be guessed (missing or unknown suffix) or a string of the form
@code{'type/subtype'}, usable for a MIME @code{content-type} header.

`encoding' is @code{None} for no encoding or the name of the program used to encode
(e.g. @code{compress} or @code{gzip}). The encoding is suitable for use
as a @code{Content-Encoding} header, `not' as a
@code{Content-Transfer-Encoding} header. The mappings are table driven.
Encoding suffixes are case sensitive; type suffixes are first tried case
sensitively, then case insensitively.

The optional `strict' argument is a flag specifying whether the list of known MIME types
is limited to only the official types registered with IANA@footnote{https://www.iana.org/assignments/media-types/media-types.xhtml}.
However, the behavior of this module also depends on the underlying operating
system. Only file types recognized by the OS or explicitly registered with
Python’s internal database can be identified. When `strict' is @code{True} (the
default), only the IANA types are supported; when `strict' is @code{False}, some
additional non-standard but commonly used MIME types are also recognized.


Changed in version 3.8: Added support for `url' being a @ref{5a1,,path-like object}.



@ref{23f,,Soft deprecated} since version 3.13: Passing a file path instead of URL is soft deprecated.
Use @ref{517,,guess_file_type()} for this.

@end deffn

@geindex guess_file_type() (in module mimetypes)
@anchor{library/mimetypes mimetypes guess_file_type}@anchor{517}
@deffn {Function} mimetypes.guess_file_type (path, *, strict=True)

@geindex MIME; headers

Guess the type of a file based on its path, given by `path'.
Similar to the @ref{518,,guess_type()} function, but accepts a path instead of URL.
Path can be a string, a bytes object or a @ref{5a1,,path-like object}.


Added in version 3.13.

@end deffn

@geindex guess_all_extensions() (in module mimetypes)
@anchor{library/mimetypes mimetypes guess_all_extensions}@anchor{1c8d}
@deffn {Function} mimetypes.guess_all_extensions (type, strict=True)

Guess the extensions for a file based on its MIME type, given by `type'. The
return value is a list of strings giving all possible filename extensions,
including the leading dot (@code{'.'}).  The extensions are not guaranteed to have
been associated with any particular data stream, but would be mapped to the MIME
type `type' by @ref{518,,guess_type()} and @ref{517,,guess_file_type()}.

The optional `strict' argument has the same meaning as with the @ref{518,,guess_type()} function.
@end deffn

@geindex guess_extension() (in module mimetypes)
@anchor{library/mimetypes mimetypes guess_extension}@anchor{3d0d}
@deffn {Function} mimetypes.guess_extension (type, strict=True)

Guess the extension for a file based on its MIME type, given by `type'. The
return value is a string giving a filename extension, including the leading dot
(@code{'.'}).  The extension is not guaranteed to have been associated with any
particular data stream, but would be mapped to the MIME type `type' by
@ref{518,,guess_type()} and @ref{517,,guess_file_type()}.
If no extension can be guessed for `type', @code{None} is returned.

The optional `strict' argument has the same meaning as with the @ref{518,,guess_type()} function.
@end deffn

Some additional functions and data items are available for controlling the
behavior of the module.

@geindex init() (in module mimetypes)
@anchor{library/mimetypes mimetypes init}@anchor{3d0c}
@deffn {Function} mimetypes.init (files=None)

Initialize the internal data structures.  If given, `files' must be a sequence
of file names which should be used to augment the default type map.  If omitted,
the file names to use are taken from @ref{3d0e,,knownfiles}; on Windows, the
current registry settings are loaded.  Each file named in `files' or
@code{knownfiles} takes precedence over those named before it.  Calling
@code{init()} repeatedly is allowed.

Specifying an empty list for `files' will prevent the system defaults from
being applied: only the well-known values will be present from a built-in list.

If `files' is @code{None} the internal data structure is completely rebuilt to its
initial default value. This is a stable operation and will produce the same results
when called multiple times.


Changed in version 3.2: Previously, Windows registry settings were ignored.

@end deffn

@geindex read_mime_types() (in module mimetypes)
@anchor{library/mimetypes mimetypes read_mime_types}@anchor{1d6e}
@deffn {Function} mimetypes.read_mime_types (filename)

Load the type map given in the file `filename', if it exists.  The type map is
returned as a dictionary mapping filename extensions, including the leading dot
(@code{'.'}), to strings of the form @code{'type/subtype'}.  If the file `filename'
does not exist or cannot be read, @code{None} is returned.
@end deffn

@geindex add_type() (in module mimetypes)
@anchor{library/mimetypes mimetypes add_type}@anchor{3d0f}
@deffn {Function} mimetypes.add_type (type, ext, strict=True)

Add a mapping from the MIME type `type' to the extension `ext'. When the
extension is already known, the new type will replace the old one. When the type
is already known the extension will be added to the list of known extensions.

When `strict' is @code{True} (the default), the mapping will be added to the
official MIME types, otherwise to the non-standard ones.
@end deffn

@geindex inited (in module mimetypes)
@anchor{library/mimetypes mimetypes inited}@anchor{3d10}
@deffn {Data} mimetypes.inited

Flag indicating whether or not the global data structures have been initialized.
This is set to @code{True} by @ref{3d0c,,init()}.
@end deffn

@geindex knownfiles (in module mimetypes)
@anchor{library/mimetypes mimetypes knownfiles}@anchor{3d0e}
@deffn {Data} mimetypes.knownfiles

@geindex file; mime.types

List of type map file names commonly installed.  These files are typically named
@code{mime.types} and are installed in different locations by different
packages.
@end deffn

@geindex suffix_map (in module mimetypes)
@anchor{library/mimetypes mimetypes suffix_map}@anchor{3d11}
@deffn {Data} mimetypes.suffix_map

Dictionary mapping suffixes to suffixes.  This is used to allow recognition of
encoded files for which the encoding and the type are indicated by the same
extension.  For example, the @code{.tgz} extension is mapped to @code{.tar.gz}
to allow the encoding and type to be recognized separately.
@end deffn

@geindex encodings_map (in module mimetypes)
@anchor{library/mimetypes mimetypes encodings_map}@anchor{3d12}
@deffn {Data} mimetypes.encodings_map

Dictionary mapping filename extensions to encoding types.
@end deffn

@geindex types_map (in module mimetypes)
@anchor{library/mimetypes mimetypes types_map}@anchor{3d13}
@deffn {Data} mimetypes.types_map

Dictionary mapping filename extensions to MIME types.
@end deffn

@geindex common_types (in module mimetypes)
@anchor{library/mimetypes mimetypes common_types}@anchor{3d14}
@deffn {Data} mimetypes.common_types

Dictionary mapping filename extensions to non-standard, but commonly found MIME
types.
@end deffn

An example usage of the module:

@example
>>> import mimetypes
>>> mimetypes.init()
>>> mimetypes.knownfiles
['/etc/mime.types', '/etc/httpd/mime.types', ... ]
>>> mimetypes.suffix_map['.tgz']
'.tar.gz'
>>> mimetypes.encodings_map['.gz']
'gzip'
>>> mimetypes.types_map['.tgz']
'application/x-tar-gz'
@end example

@menu
* MimeTypes objects:: 
* Command-line usage: Command-line usage<4>. 
* Command-line example: Command-line example<2>. 

@end menu

@node MimeTypes objects,Command-line usage<4>,,mimetypes — Map filenames to MIME types
@anchor{library/mimetypes id1}@anchor{3d15}@anchor{library/mimetypes mimetypes-objects}@anchor{3d16}
@subsubsection MimeTypes objects


The @ref{1707,,MimeTypes} class may be useful for applications which may want more
than one MIME-type database; it provides an interface similar to the one of the
@code{mimetypes} module.

@geindex MimeTypes (class in mimetypes)
@anchor{library/mimetypes mimetypes MimeTypes}@anchor{1707}
@deffn {Class} mimetypes.MimeTypes (filenames=(), strict=True)

This class represents a MIME-types database.  By default, it provides access to
the same database as the rest of this module. The initial database is a copy of
that provided by the module, and may be extended by loading additional
@code{mime.types}-style files into the database using the @ref{3d17,,read()} or
@ref{3d18,,readfp()} methods.  The mapping dictionaries may also be cleared before
loading additional data if the default data is not desired.

The optional `filenames' parameter can be used to cause additional files to be
loaded “on top” of the default database.

@geindex suffix_map (mimetypes.MimeTypes attribute)
@anchor{library/mimetypes mimetypes MimeTypes suffix_map}@anchor{3d19}
@deffn {Attribute} suffix_map

Dictionary mapping suffixes to suffixes.  This is used to allow recognition of
encoded files for which the encoding and the type are indicated by the same
extension.  For example, the @code{.tgz} extension is mapped to @code{.tar.gz}
to allow the encoding and type to be recognized separately.  This is initially a
copy of the global @ref{3d11,,suffix_map} defined in the module.
@end deffn

@geindex encodings_map (mimetypes.MimeTypes attribute)
@anchor{library/mimetypes mimetypes MimeTypes encodings_map}@anchor{3d1a}
@deffn {Attribute} encodings_map

Dictionary mapping filename extensions to encoding types.  This is initially a
copy of the global @ref{3d12,,encodings_map} defined in the module.
@end deffn

@geindex types_map (mimetypes.MimeTypes attribute)
@anchor{library/mimetypes mimetypes MimeTypes types_map}@anchor{3d1b}
@deffn {Attribute} types_map

Tuple containing two dictionaries, mapping filename extensions to MIME types:
the first dictionary is for the non-standards types and the second one is for
the standard types. They are initialized by @ref{3d14,,common_types} and
@ref{3d13,,types_map}.
@end deffn

@geindex types_map_inv (mimetypes.MimeTypes attribute)
@anchor{library/mimetypes mimetypes MimeTypes types_map_inv}@anchor{3d1c}
@deffn {Attribute} types_map_inv

Tuple containing two dictionaries, mapping MIME types to a list of filename
extensions: the first dictionary is for the non-standards types and the
second one is for the standard types. They are initialized by
@ref{3d14,,common_types} and @ref{3d13,,types_map}.
@end deffn

@geindex guess_extension() (mimetypes.MimeTypes method)
@anchor{library/mimetypes mimetypes MimeTypes guess_extension}@anchor{3d1d}
@deffn {Method} guess_extension (type, strict=True)

Similar to the @ref{3d0d,,guess_extension()} function, using the tables stored as part
of the object.
@end deffn

@geindex guess_type() (mimetypes.MimeTypes method)
@anchor{library/mimetypes mimetypes MimeTypes guess_type}@anchor{1e5b}
@deffn {Method} guess_type (url, strict=True)

Similar to the @ref{518,,guess_type()} function, using the tables stored as part of
the object.
@end deffn

@geindex guess_file_type() (mimetypes.MimeTypes method)
@anchor{library/mimetypes mimetypes MimeTypes guess_file_type}@anchor{3d1e}
@deffn {Method} guess_file_type (path, *, strict=True)

Similar to the @ref{517,,guess_file_type()} function, using the tables stored
as part of the object.


Added in version 3.13.

@end deffn

@geindex guess_all_extensions() (mimetypes.MimeTypes method)
@anchor{library/mimetypes mimetypes MimeTypes guess_all_extensions}@anchor{3d1f}
@deffn {Method} guess_all_extensions (type, strict=True)

Similar to the @ref{1c8d,,guess_all_extensions()} function, using the tables stored
as part of the object.
@end deffn

@geindex read() (mimetypes.MimeTypes method)
@anchor{library/mimetypes mimetypes MimeTypes read}@anchor{3d17}
@deffn {Method} read (filename, strict=True)

Load MIME information from a file named `filename'.  This uses @ref{3d18,,readfp()} to
parse the file.

If `strict' is @code{True}, information will be added to list of standard types,
else to the list of non-standard types.
@end deffn

@geindex readfp() (mimetypes.MimeTypes method)
@anchor{library/mimetypes mimetypes MimeTypes readfp}@anchor{3d18}
@deffn {Method} readfp (fp, strict=True)

Load MIME type information from an open file `fp'.  The file must have the format of
the standard @code{mime.types} files.

If `strict' is @code{True}, information will be added to the list of standard
types, else to the list of non-standard types.
@end deffn

@geindex read_windows_registry() (mimetypes.MimeTypes method)
@anchor{library/mimetypes mimetypes MimeTypes read_windows_registry}@anchor{3d20}
@deffn {Method} read_windows_registry (strict=True)

Load MIME type information from the Windows registry.

@ref{2181,,Availability}: Windows.

If `strict' is @code{True}, information will be added to the list of standard
types, else to the list of non-standard types.


Added in version 3.2.

@end deffn

@geindex add_type() (mimetypes.MimeTypes method)
@anchor{library/mimetypes mimetypes MimeTypes add_type}@anchor{31b}
@deffn {Method} add_type (type, ext, strict=True)

Add a mapping from the MIME type `type' to the extension `ext'.
Valid extensions start with a ‘.’ or are empty. When the
extension is already known, the new type will replace the old one. When the type
is already known the extension will be added to the list of known extensions.

When `strict' is @code{True} (the default), the mapping will be added to the
official MIME types, otherwise to the non-standard ones.


Deprecated since version 3.14, will be removed in version 3.16: Invalid, undotted extensions will raise a
@ref{2ee,,ValueError} in Python 3.16.

@end deffn
@end deffn

@node Command-line usage<4>,Command-line example<2>,MimeTypes objects,mimetypes — Map filenames to MIME types
@anchor{library/mimetypes command-line-usage}@anchor{3d21}@anchor{library/mimetypes mimetypes-cli}@anchor{249}
@subsubsection Command-line usage


The @code{mimetypes} module can be executed as a script from the command line.

@example
python -m mimetypes [-h] [-e] [-l] type [type ...]
@end example

The following options are accepted:

@geindex mimetypes command line option; -h
@geindex mimetypes command line option; --help
@anchor{library/mimetypes cmdoption-mimetypes-h}@anchor{3d22}
@deffn {Program Option} @w{-}h
@anchor{library/mimetypes cmdoption-mimetypes-help}@anchor{3d23}
@deffnx {Program Option} @w{-}@w{-}help

Show the help message and exit.
@end deffn

@geindex mimetypes command line option; -e
@geindex mimetypes command line option; --extension
@anchor{library/mimetypes cmdoption-mimetypes-e}@anchor{3d24}
@deffn {Program Option} @w{-}e
@anchor{library/mimetypes cmdoption-mimetypes-extension}@anchor{3d25}
@deffnx {Program Option} @w{-}@w{-}extension

Guess extension instead of type.
@end deffn

@geindex mimetypes command line option; -l
@geindex mimetypes command line option; --lenient
@anchor{library/mimetypes cmdoption-mimetypes-l}@anchor{3d26}
@deffn {Program Option} @w{-}l
@anchor{library/mimetypes cmdoption-mimetypes-lenient}@anchor{3d27}
@deffnx {Program Option} @w{-}@w{-}lenient

Additionally search for some common, but non-standard types.
@end deffn

By default the script converts MIME types to file extensions.
However, if @code{--extension} is specified,
it converts file extensions to MIME types.

For each @code{type} entry, the script writes a line into the standard output
stream. If an unknown type occurs, it writes an error message into the
standard output stream and exits with the return code @code{1}.

@c mimetypes-cli-example:

@node Command-line example<2>,,Command-line usage<4>,mimetypes — Map filenames to MIME types
@anchor{library/mimetypes command-line-example}@anchor{3d28}
@subsubsection Command-line example


Here are some examples of typical usage of the @code{mimetypes} command-line
interface:

@example
$ # get a MIME type by a file name
$ python -m mimetypes filename.png
type: image/png encoding: None

$ # get a MIME type by a URL
$ python -m mimetypes https://example.com/filename.txt
type: text/plain encoding: None

$ # get a complex MIME type
$ python -m mimetypes filename.tar.gz
type: application/x-tar encoding: gzip

$ # get a MIME type for a rare file extension
$ python -m mimetypes filename.pict
error: media type unknown for filename.pict

$ # now look in the extended database built into Python
$ python -m mimetypes --lenient filename.pict
type: image/pict encoding: None

$ # get a file extension by a MIME type
$ python -m mimetypes --extension text/javascript
.js

$ # get a file extension by a rare MIME type
$ python -m mimetypes --extension text/xul
error: unknown type text/xul

$ # now look in the extended database again
$ python -m mimetypes --extension --lenient text/xul
.xul

$ # try to feed an unknown file extension
$ python -m mimetypes filename.sh filename.nc filename.xxx filename.txt
type: application/x-sh encoding: None
type: application/x-netcdf encoding: None
error: media type unknown for filename.xxx
type: text/plain encoding: None

$ # try to feed an unknown MIME type
$ python -m mimetypes --extension audio/aac audio/opus audio/future audio/x-wav
.aac
.opus
error: unknown type audio/future
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node base64 — Base16 Base32 Base64 Base85 Data Encodings,binascii — Convert between binary and ASCII,mimetypes — Map filenames to MIME types,Internet Data Handling
@anchor{library/base64 doc}@anchor{3d29}@anchor{library/base64 base64-base16-base32-base64-base85-data-encodings}@anchor{3d2a}@anchor{library/base64 module-base64}@anchor{f}@anchor{library/base64 translation-repo}@anchor{3d2b}
@subsection @code{base64} — Base16, Base32, Base64, Base85 Data Encodings


@geindex module; base64

`Source code:' Lib/base64.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/base64.py}

@geindex base64; encoding
@geindex MIME; base64 encoding


__________________________________________________________________


This module provides functions for encoding binary data to printable
ASCII characters and decoding such encodings back to binary data.
This includes the @ref{3d2c,,encodings specified in}
@geindex RFC; RFC 4648
RFC 4648@footnote{https://datatracker.ietf.org/doc/html/rfc4648.html} (Base64, Base32 and Base16), the @ref{3d2d,,Base85 encoding} specified in PDF 2.0@footnote{https://pdfa.org/resource/iso-32000-2/}, and non-standard variants
of Base85 used elsewhere.

There are two interfaces provided by this module.  The modern interface
supports encoding @ref{194,,bytes-like objects} to ASCII
@ref{193,,bytes}, and decoding bytes-like objects or
strings containing ASCII to @code{bytes}.  Both base-64 alphabets
defined in 
@geindex RFC; RFC 4648
RFC 4648@footnote{https://datatracker.ietf.org/doc/html/rfc4648.html} (normal, and URL- and filesystem-safe) are supported.

The @ref{3d2e,,legacy interface} does not support decoding from strings, but it does
provide functions for encoding and decoding to and from @ref{13cf,,file objects}.  It only supports the Base64 standard alphabet, and it adds
newlines every 76 characters as per 
@geindex RFC; RFC 2045
RFC 2045@footnote{https://datatracker.ietf.org/doc/html/rfc2045.html}.  Note that if you are looking
for 
@geindex RFC; RFC 2045
RFC 2045@footnote{https://datatracker.ietf.org/doc/html/rfc2045.html} support you probably want to be looking at the @ref{3f,,email}
package instead.


Changed in version 3.3: ASCII-only Unicode strings are now accepted by the decoding functions of
the modern interface.



Changed in version 3.4: Any @ref{194,,bytes-like objects} are now accepted by all
encoding and decoding functions in this module.  Ascii85/Base85 support added.


@menu
* RFC 4648 Encodings:: 
* Base85 Encodings:: 
* Legacy Interface:: 
* Security Considerations: Security Considerations<2>. 

@end menu

@node RFC 4648 Encodings,Base85 Encodings,,base64 — Base16 Base32 Base64 Base85 Data Encodings
@anchor{library/base64 base64-rfc-4648}@anchor{3d2c}@anchor{library/base64 rfc-4648-encodings}@anchor{3d2f}
@subsubsection RFC 4648 Encodings


The 
@geindex RFC; RFC 4648
RFC 4648@footnote{https://datatracker.ietf.org/doc/html/rfc4648.html} encodings are suitable for encoding binary data so that it can be
safely sent by email, used as parts of URLs, or included as part of an HTTP
POST request.

@geindex b64encode() (in module base64)
@anchor{library/base64 base64 b64encode}@anchor{3d30}
@deffn {Function} base64.b64encode (s, altchars=None)

Encode the @ref{194,,bytes-like object} `s' using Base64 and return the encoded
@ref{193,,bytes}.

Optional `altchars' must be a @ref{194,,bytes-like object} of length 2 which
specifies an alternative alphabet for the @code{+} and @code{/} characters.
This allows an application to e.g. generate URL or filesystem safe Base64
strings.  The default is @code{None}, for which the standard Base64 alphabet is used.

May assert or raise a @ref{2ee,,ValueError} if the length of `altchars' is not 2.  Raises a
@ref{199,,TypeError} if `altchars' is not a @ref{194,,bytes-like object}.
@end deffn

@geindex b64decode() (in module base64)
@anchor{library/base64 base64 b64decode}@anchor{17b1}
@deffn {Function} base64.b64decode (s, altchars=None, validate=False)

Decode the Base64 encoded @ref{194,,bytes-like object} or ASCII string
`s' and return the decoded @ref{193,,bytes}.

Optional `altchars' must be a @ref{194,,bytes-like object} or ASCII string
of length 2 which specifies the alternative alphabet used instead of the
@code{+} and @code{/} characters.

A @ref{122c,,binascii.Error} exception is raised
if `s' is incorrectly padded.

If `validate' is @code{False} (the default), characters that are neither
in the normal base-64 alphabet nor the alternative alphabet are
discarded prior to the padding check.  If `validate' is @code{True},
these non-alphabet characters in the input result in a
@ref{122c,,binascii.Error}.

For more information about the strict base64 check, see @ref{17b0,,binascii.a2b_base64()}

May assert or raise a @ref{2ee,,ValueError} if the length of `altchars' is not 2.
@end deffn

@geindex standard_b64encode() (in module base64)
@anchor{library/base64 base64 standard_b64encode}@anchor{3d31}
@deffn {Function} base64.standard_b64encode (s)

Encode @ref{194,,bytes-like object} `s' using the standard Base64 alphabet
and return the encoded @ref{193,,bytes}.
@end deffn

@geindex standard_b64decode() (in module base64)
@anchor{library/base64 base64 standard_b64decode}@anchor{3d32}
@deffn {Function} base64.standard_b64decode (s)

Decode @ref{194,,bytes-like object} or ASCII string `s' using the standard
Base64 alphabet and return the decoded @ref{193,,bytes}.
@end deffn

@geindex urlsafe_b64encode() (in module base64)
@anchor{library/base64 base64 urlsafe_b64encode}@anchor{3d33}
@deffn {Function} base64.urlsafe_b64encode (s)

Encode @ref{194,,bytes-like object} `s' using the
URL- and filesystem-safe alphabet, which
substitutes @code{-} instead of @code{+} and @code{_} instead of @code{/} in the
standard Base64 alphabet, and return the encoded @ref{193,,bytes}.  The result
can still contain @code{=}.
@end deffn

@geindex urlsafe_b64decode() (in module base64)
@anchor{library/base64 base64 urlsafe_b64decode}@anchor{3d34}
@deffn {Function} base64.urlsafe_b64decode (s)

Decode @ref{194,,bytes-like object} or ASCII string `s'
using the URL- and filesystem-safe
alphabet, which substitutes @code{-} instead of @code{+} and @code{_} instead of
@code{/} in the standard Base64 alphabet, and return the decoded
@ref{193,,bytes}.
@end deffn

@geindex b32encode() (in module base64)
@anchor{library/base64 base64 b32encode}@anchor{3d35}
@deffn {Function} base64.b32encode (s)

Encode the @ref{194,,bytes-like object} `s' using Base32 and return the
encoded @ref{193,,bytes}.
@end deffn

@geindex b32decode() (in module base64)
@anchor{library/base64 base64 b32decode}@anchor{122b}
@deffn {Function} base64.b32decode (s, casefold=False, map01=None)

Decode the Base32 encoded @ref{194,,bytes-like object} or ASCII string `s' and
return the decoded @ref{193,,bytes}.

Optional `casefold' is a flag specifying
whether a lowercase alphabet is acceptable as input.  For security purposes,
the default is @code{False}.

@geindex RFC; RFC 4648
RFC 4648@footnote{https://datatracker.ietf.org/doc/html/rfc4648.html} allows for optional mapping of the digit 0 (zero) to the letter O
(oh), and for optional mapping of the digit 1 (one) to either the letter I (eye)
or letter L (el).  The optional argument `map01' when not @code{None}, specifies
which letter the digit 1 should be mapped to (when `map01' is not @code{None}, the
digit 0 is always mapped to the letter O).  For security purposes the default is
@code{None}, so that 0 and 1 are not allowed in the input.

A @ref{122c,,binascii.Error} is raised if `s' is
incorrectly padded or if there are non-alphabet characters present in the
input.
@end deffn

@geindex b32hexencode() (in module base64)
@anchor{library/base64 base64 b32hexencode}@anchor{9ea}
@deffn {Function} base64.b32hexencode (s)

Similar to @ref{3d35,,b32encode()} but uses the Extended Hex Alphabet, as defined in
@geindex RFC; RFC 4648
RFC 4648@footnote{https://datatracker.ietf.org/doc/html/rfc4648.html}.


Added in version 3.10.

@end deffn

@geindex b32hexdecode() (in module base64)
@anchor{library/base64 base64 b32hexdecode}@anchor{9eb}
@deffn {Function} base64.b32hexdecode (s, casefold=False)

Similar to @ref{122b,,b32decode()} but uses the Extended Hex Alphabet, as defined in
@geindex RFC; RFC 4648
RFC 4648@footnote{https://datatracker.ietf.org/doc/html/rfc4648.html}.

This version does not allow the digit 0 (zero) to the letter O (oh) and digit
1 (one) to either the letter I (eye) or letter L (el) mappings, all these
characters are included in the Extended Hex Alphabet and are not
interchangeable.


Added in version 3.10.

@end deffn

@geindex b16encode() (in module base64)
@anchor{library/base64 base64 b16encode}@anchor{3d36}
@deffn {Function} base64.b16encode (s)

Encode the @ref{194,,bytes-like object} `s' using Base16 and return the
encoded @ref{193,,bytes}.
@end deffn

@geindex b16decode() (in module base64)
@anchor{library/base64 base64 b16decode}@anchor{2d5}
@deffn {Function} base64.b16decode (s, casefold=False)

Decode the Base16 encoded @ref{194,,bytes-like object} or ASCII string `s' and
return the decoded @ref{193,,bytes}.

Optional `casefold' is a flag specifying whether a
lowercase alphabet is acceptable as input.  For security purposes, the default
is @code{False}.

A @ref{122c,,binascii.Error} is raised if `s' is
incorrectly padded or if there are non-alphabet characters present in the
input.
@end deffn

@node Base85 Encodings,Legacy Interface,RFC 4648 Encodings,base64 — Base16 Base32 Base64 Base85 Data Encodings
@anchor{library/base64 base64-base-85}@anchor{3d2d}@anchor{library/base64 base85-encodings}@anchor{3d37}
@subsubsection Base85 Encodings


Base85 encoding is a family of algorithms which represent four bytes
using five ASCII characters.  Originally implemented in the Unix
@code{btoa(1)} utility, a version of it was later adopted by Adobe in the
PostScript language and is standardized in PDF 2.0 (ISO 32000-2).
This version, in both its @code{btoa} and PDF variants, is implemented by
@ref{1126,,a85encode()}.

A separate version, using a different output character set, was
defined as an April Fool’s joke in 
@geindex RFC; RFC 1924
RFC 1924@footnote{https://datatracker.ietf.org/doc/html/rfc1924.html} but is now used by Git
and other software.  This version is implemented by @ref{1128,,b85encode()}.

Finally, a third version, using yet another output character set
designed for safe inclusion in programming language strings, is
defined by ZeroMQ and implemented here by @ref{47b,,z85encode()}.

The functions present in this module differ in how they handle the following:


@itemize *

@item 
Whether to include and expect enclosing @code{<~} and @code{~>} markers.

@item 
Whether to fold the input into multiple lines.

@item 
The set of ASCII characters used for encoding.

@item 
Compact encodings of sequences of spaces and null bytes.

@item 
The encoding of zero-padding bytes applied to the input.
@end itemize

Refer to the documentation of the individual functions for more information.

@geindex a85encode() (in module base64)
@anchor{library/base64 base64 a85encode}@anchor{1126}
@deffn {Function} base64.a85encode (b, *, foldspaces=False, wrapcol=0, pad=False, adobe=False)

Encode the @ref{194,,bytes-like object} `b' using Ascii85 and return the
encoded @ref{193,,bytes}.

`foldspaces' is an optional flag that uses the special short sequence ‘y’
instead of 4 consecutive spaces (ASCII 0x20) as supported by ‘btoa’. This
feature is not supported by the standard encoding used in PDF.

`wrapcol' controls whether the output should have newline (@code{b'\n'})
characters added to it. If this is non-zero, each output line will be
at most this many characters long, excluding the trailing newline.

`pad' controls whether zero-padding applied to the end of the input
is fully retained in the output encoding, as done by @code{btoa},
producing an exact multiple of 5 bytes of output. This is not part
of the standard encoding used in PDF, as it does not preserve the
length of the data.

`adobe' controls whether the encoded byte sequence is framed with
@code{<~} and @code{~>}, as in a PostScript base-85 string literal.  Note
that while ASCII85Decode streams in PDF documents `must' be
terminated with @code{~>}, they `must not' use a leading @code{<~}.


Added in version 3.4.

@end deffn

@geindex a85decode() (in module base64)
@anchor{library/base64 base64 a85decode}@anchor{1127}
@deffn {Function} base64.a85decode (b, *, foldspaces=False, adobe=False, ignorechars=b' \t\n\r\x0b')

Decode the Ascii85 encoded @ref{194,,bytes-like object} or ASCII string `b' and
return the decoded @ref{193,,bytes}.

`foldspaces' is a flag that specifies whether the ‘y’ short sequence
should be accepted as shorthand for 4 consecutive spaces (ASCII 0x20).
This feature is not supported by the standard Ascii85 encoding used in
PDF and PostScript.

`adobe' controls whether the @code{<~} and @code{~>} markers are
present. While the leading @code{<~} is not required, the input must
end with @code{~>}, or a @ref{2ee,,ValueError} is raised.

`ignorechars' should be a byte string containing characters to ignore
from the input. This should only contain whitespace characters, and by
default contains all whitespace characters in ASCII.


Added in version 3.4.

@end deffn

@geindex b85encode() (in module base64)
@anchor{library/base64 base64 b85encode}@anchor{1128}
@deffn {Function} base64.b85encode (b, pad=False)

Encode the @ref{194,,bytes-like object} `b' using base85 (as used in e.g.
git-style binary diffs) and return the encoded @ref{193,,bytes}.

The input is padded with @code{b'\0'} so its length is a multiple of 4
bytes before encoding.  If `pad' is true, all the resulting
characters are retained in the output, which will always be a
multiple of 5 bytes, and thus the length of the data may not be
preserved on decoding.


Added in version 3.4.

@end deffn

@geindex b85decode() (in module base64)
@anchor{library/base64 base64 b85decode}@anchor{1129}
@deffn {Function} base64.b85decode (b)

Decode the base85-encoded @ref{194,,bytes-like object} or ASCII string `b' and
return the decoded @ref{193,,bytes}.


Added in version 3.4.

@end deffn

@geindex z85encode() (in module base64)
@anchor{library/base64 base64 z85encode}@anchor{47b}
@deffn {Function} base64.z85encode (s)

Encode the @ref{194,,bytes-like object} `s' using Z85 (as used in ZeroMQ)
and return the encoded @ref{193,,bytes}.

The ZeroMQ specification@footnote{https://rfc.zeromq.org/spec/32/}
requires the length of Z85-encoded data to be a multiple of 5
bytes. To produce compliant data frames, you must pad the input
data to this function to a multiple of 4 bytes.


Added in version 3.13.

@end deffn

@geindex z85decode() (in module base64)
@anchor{library/base64 base64 z85decode}@anchor{47c}
@deffn {Function} base64.z85decode (s)

Decode the Z85-encoded @ref{194,,bytes-like object} or ASCII string `s' and
return the decoded @ref{193,,bytes}.


Added in version 3.13.

@end deffn

@node Legacy Interface,Security Considerations<2>,Base85 Encodings,base64 — Base16 Base32 Base64 Base85 Data Encodings
@anchor{library/base64 base64-legacy}@anchor{3d2e}@anchor{library/base64 legacy-interface}@anchor{3d38}
@subsubsection Legacy Interface


@geindex decode() (in module base64)
@anchor{library/base64 base64 decode}@anchor{3d39}
@deffn {Function} base64.decode (input, output)

Decode the contents of the binary `input' file and write the resulting binary
data to the `output' file. `input' and `output' must be @ref{13cf,,file objects}. `input' will be read until @code{input.readline()} returns an
empty bytes object.
@end deffn

@geindex decodebytes() (in module base64)
@anchor{library/base64 base64 decodebytes}@anchor{b53}
@deffn {Function} base64.decodebytes (s)

Decode the @ref{194,,bytes-like object} `s', which must contain one or more
lines of base64 encoded data, and return the decoded @ref{193,,bytes}.


Added in version 3.1.

@end deffn

@geindex encode() (in module base64)
@anchor{library/base64 base64 encode}@anchor{3d3a}
@deffn {Function} base64.encode (input, output)

Encode the contents of the binary `input' file and write the resulting base64
encoded data to the `output' file. `input' and `output' must be @ref{13cf,,file objects}. `input' will be read until @code{input.read()} returns
an empty bytes object. @code{encode()} inserts a newline character (@code{b'\n'})
after every 76 bytes of the output, as well as ensuring that the output
always ends with a newline, as per 
@geindex RFC; RFC 2045
RFC 2045@footnote{https://datatracker.ietf.org/doc/html/rfc2045.html} (MIME).
@end deffn

@geindex encodebytes() (in module base64)
@anchor{library/base64 base64 encodebytes}@anchor{b52}
@deffn {Function} base64.encodebytes (s)

Encode the @ref{194,,bytes-like object} `s', which can contain arbitrary binary
data, and return @ref{193,,bytes} containing the base64-encoded data, with newlines
(@code{b'\n'}) inserted after every 76 bytes of output, and ensuring that
there is a trailing newline, as per 
@geindex RFC; RFC 2045
RFC 2045@footnote{https://datatracker.ietf.org/doc/html/rfc2045.html} (MIME).


Added in version 3.1.

@end deffn

An example usage of the module:

@example
>>> import base64
>>> encoded = base64.b64encode(b'data to be encoded')
>>> encoded
b'ZGF0YSB0byBiZSBlbmNvZGVk'
>>> data = base64.b64decode(encoded)
>>> data
b'data to be encoded'
@end example

@node Security Considerations<2>,,Legacy Interface,base64 — Base16 Base32 Base64 Base85 Data Encodings
@anchor{library/base64 base64-security}@anchor{3d3b}@anchor{library/base64 security-considerations}@anchor{3d3c}
@subsubsection Security Considerations


A new security considerations section was added to 
@geindex RFC; RFC 4648
RFC 4648@footnote{https://datatracker.ietf.org/doc/html/rfc4648.html} (section 12); it’s
recommended to review the security section for any code deployed to production.


@subsubheading See also



@table @asis

@item Module @ref{11,,binascii}

Support module containing ASCII-to-binary and binary-to-ASCII conversions.

@geindex RFC; RFC 1521

@item RFC 1521@footnote{https://datatracker.ietf.org/doc/html/rfc1521.html} - MIME (Multipurpose Internet Mail Extensions) Part One: Mechanisms for Specifying and Describing the Format of Internet Message Bodies

Section 5.2, “Base64 Content-Transfer-Encoding,” provides the definition of the
base64 encoding.

@item ISO 32000-2 Portable document format - Part 2: PDF 2.0@footnote{https://pdfa.org/resource/iso-32000-2/}

Section 7.4.3, “ASCII85Decode Filter,” provides the definition
of the Ascii85 encoding used in PDF and PostScript, including
the output character set and the details of data length preservation
using zero-padding and partial output groups.

@item ZeroMQ RFC 32/Z85@footnote{https://rfc.zeromq.org/spec/32/}

The “Formal Specification” section provides the character set used in Z85.
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node binascii — Convert between binary and ASCII,quopri — Encode and decode MIME quoted-printable data,base64 — Base16 Base32 Base64 Base85 Data Encodings,Internet Data Handling
@anchor{library/binascii doc}@anchor{3d3d}@anchor{library/binascii binascii-convert-between-binary-and-ascii}@anchor{3d3e}@anchor{library/binascii module-binascii}@anchor{11}@anchor{library/binascii translation-repo}@anchor{3d3f}
@subsection @code{binascii} — Convert between binary and ASCII


@geindex module; binascii

@geindex module; base64


__________________________________________________________________


The @code{binascii} module contains a number of methods to convert between
binary and various ASCII-encoded binary representations. Normally, you will not
use these functions directly but use wrapper modules like
@ref{f,,base64} instead. The @code{binascii} module contains
low-level functions written in C for greater speed that are used by the
higher-level modules.

@cartouche
@quotation Note 
@code{a2b_*} functions accept Unicode strings containing only ASCII characters.
Other functions only accept @ref{194,,bytes-like objects} (such as
@ref{193,,bytes}, @ref{342,,bytearray} and other objects that support the buffer
protocol).


Changed in version 3.3: ASCII-only unicode strings are now accepted by the @code{a2b_*} functions.

@end quotation
@end cartouche

The @code{binascii} module defines the following functions:

@geindex a2b_uu() (in module binascii)
@anchor{library/binascii binascii a2b_uu}@anchor{1796}
@deffn {Function} binascii.a2b_uu (string)

Convert a single line of uuencoded data back to binary and return the binary
data. Lines normally contain 45 (binary) bytes, except for the last line. Line
data may be followed by whitespace.
@end deffn

@geindex b2a_uu() (in module binascii)
@anchor{library/binascii binascii b2a_uu}@anchor{d1c}
@deffn {Function} binascii.b2a_uu (data, *, backtick=False)

Convert binary data to a line of ASCII characters, the return value is the
converted line, including a newline char. The length of `data' should be at most
45. If `backtick' is true, zeros are represented by @code{'`'} instead of spaces.


Changed in version 3.7: Added the `backtick' parameter.

@end deffn

@geindex a2b_base64() (in module binascii)
@anchor{library/binascii binascii a2b_base64}@anchor{17b0}
@deffn {Function} binascii.a2b_base64 (string, /, *, strict_mode=False)

Convert a block of base64 data back to binary and return the binary data. More
than one line may be passed at a time.

If `strict_mode' is true, only valid base64 data will be converted. Invalid base64
data will raise @ref{122c,,binascii.Error}.

Valid base64:


@itemize *

@item 
Conforms to 
@geindex RFC; RFC 3548
RFC 3548@footnote{https://datatracker.ietf.org/doc/html/rfc3548.html}.

@item 
Contains only characters from the base64 alphabet.

@item 
Contains no excess data after padding (including excess padding, newlines, etc.).

@item 
Does not start with a padding.
@end itemize


Changed in version 3.11: Added the `strict_mode' parameter.

@end deffn

@geindex b2a_base64() (in module binascii)
@anchor{library/binascii binascii b2a_base64}@anchor{e81}
@deffn {Function} binascii.b2a_base64 (data, *, newline=True)

Convert binary data to a line of ASCII characters in base64 coding. The return
value is the converted line, including a newline char if `newline' is
true.  The output of this function conforms to 
@geindex RFC; RFC 3548
RFC 3548@footnote{https://datatracker.ietf.org/doc/html/rfc3548.html}.


Changed in version 3.6: Added the `newline' parameter.

@end deffn

@geindex a2b_qp() (in module binascii)
@anchor{library/binascii binascii a2b_qp}@anchor{3d40}
@deffn {Function} binascii.a2b_qp (data, header=False)

Convert a block of quoted-printable data back to binary and return the binary
data. More than one line may be passed at a time. If the optional argument
`header' is present and true, underscores will be decoded as spaces.
@end deffn

@geindex b2a_qp() (in module binascii)
@anchor{library/binascii binascii b2a_qp}@anchor{3d41}
@deffn {Function} binascii.b2a_qp (data, quotetabs=False, istext=True, header=False)

Convert binary data to a line(s) of ASCII characters in quoted-printable
encoding.  The return value is the converted line(s). If the optional argument
`quotetabs' is present and true, all tabs and spaces will be encoded.   If the
optional argument `istext' is present and true, newlines are not encoded but
trailing whitespace will be encoded. If the optional argument `header' is
present and true, spaces will be encoded as underscores per 
@geindex RFC; RFC 1522
RFC 1522@footnote{https://datatracker.ietf.org/doc/html/rfc1522.html}. If the
optional argument `header' is present and false, newline characters will be
encoded as well; otherwise linefeed conversion might corrupt the binary data
stream.
@end deffn

@geindex crc_hqx() (in module binascii)
@anchor{library/binascii binascii crc_hqx}@anchor{942}
@deffn {Function} binascii.crc_hqx (data, value)

Compute a 16-bit CRC value of `data', starting with `value' as the
initial CRC, and return the result.  This uses the CRC-CCITT polynomial
`x'@w{^16} + `x'@w{^12} + `x'@w{^5} + 1, often represented as
0x1021.  This CRC is used in the binhex4 format.
@end deffn

@geindex crc32() (in module binascii)
@anchor{library/binascii binascii crc32}@anchor{1a58}
@deffn {Function} binascii.crc32 (data[, value])

Compute CRC-32, the unsigned 32-bit checksum of `data', starting with an
initial CRC of `value'.  The default initial CRC is zero.  The algorithm
is consistent with the ZIP file checksum.  Since the algorithm is designed for
use as a checksum algorithm, it is not suitable for use as a general hash
algorithm.  Use as follows:

@example
print(binascii.crc32(b"hello world"))
# Or, in two pieces:
crc = binascii.crc32(b"hello")
crc = binascii.crc32(b" world", crc)
print('crc32 = @{:#010x@}'.format(crc))
@end example


Changed in version 3.0: The result is always unsigned.

@end deffn

@geindex b2a_hex() (in module binascii)
@geindex hexlify() (in module binascii)
@anchor{library/binascii binascii b2a_hex}@anchor{28e9}
@deffn {Function} binascii.b2a_hex (data[, sep[, bytes_per_sep=1]])
@anchor{library/binascii binascii hexlify}@anchor{3d42}
@deffnx {Function} binascii.hexlify (data[, sep[, bytes_per_sep=1]])

Return the hexadecimal representation of the binary `data'.  Every byte of
`data' is converted into the corresponding 2-digit hex representation.  The
returned bytes object is therefore twice as long as the length of `data'.

Similar functionality (but returning a text string) is also conveniently
accessible using the @ref{f6b,,bytes.hex()} method.

If `sep' is specified, it must be a single character str or bytes object.
It will be inserted in the output after every `bytes_per_sep' input bytes.
Separator placement is counted from the right end of the output by default,
if you wish to count from the left, supply a negative `bytes_per_sep' value.

@example
>>> import binascii
>>> binascii.b2a_hex(b'\xb9\x01\xef')
b'b901ef'
>>> binascii.hexlify(b'\xb9\x01\xef', '-')
b'b9-01-ef'
>>> binascii.b2a_hex(b'\xb9\x01\xef', b'_', 2)
b'b9_01ef'
>>> binascii.b2a_hex(b'\xb9\x01\xef', b' ', -2)
b'b901 ef'
@end example


Changed in version 3.8: The `sep' and `bytes_per_sep' parameters were added.

@end deffn

@geindex a2b_hex() (in module binascii)
@geindex unhexlify() (in module binascii)
@anchor{library/binascii binascii a2b_hex}@anchor{28ea}
@deffn {Function} binascii.a2b_hex (hexstr)
@anchor{library/binascii binascii unhexlify}@anchor{1e68}
@deffnx {Function} binascii.unhexlify (hexstr)

Return the binary data represented by the hexadecimal string `hexstr'.  This
function is the inverse of @ref{28e9,,b2a_hex()}. `hexstr' must contain an even number
of hexadecimal digits (which can be upper or lower case), otherwise an
@ref{122c,,Error} exception is raised.

Similar functionality (but more liberal towards whitespace) is also accessible
using the @ref{191,,bytes.fromhex()} class method.
@end deffn

@geindex Error
@anchor{library/binascii binascii Error}@anchor{122c}
@deffn {Exception} binascii.Error

Exception raised on errors. These are usually programming errors.
@end deffn

@geindex Incomplete
@anchor{library/binascii binascii Incomplete}@anchor{3d43}
@deffn {Exception} binascii.Incomplete

Exception raised on incomplete data. These are usually not programming errors,
but may be handled by reading a little more data and trying again.
@end deffn


@subsubheading See also



@table @asis

@item Module @ref{f,,base64}

Support for RFC compliant base64-style encoding in base 16, 32, 64,
and 85.

@item Module @ref{bc,,quopri}

Support for quoted-printable encoding used in MIME email messages.
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node quopri — Encode and decode MIME quoted-printable data,,binascii — Convert between binary and ASCII,Internet Data Handling
@anchor{library/quopri doc}@anchor{3d44}@anchor{library/quopri module-quopri}@anchor{bc}@anchor{library/quopri quopri-encode-and-decode-mime-quoted-printable-data}@anchor{3d45}@anchor{library/quopri translation-repo}@anchor{3d46}
@subsection @code{quopri} — Encode and decode MIME quoted-printable data


@geindex module; quopri

`Source code:' Lib/quopri.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/quopri.py}

@geindex quoted-printable; encoding
@geindex MIME; quoted-printable encoding


__________________________________________________________________


This module performs quoted-printable transport encoding and decoding, as
defined in 
@geindex RFC; RFC 1521
RFC 1521@footnote{https://datatracker.ietf.org/doc/html/rfc1521.html}: “MIME (Multipurpose Internet Mail Extensions) Part One:
Mechanisms for Specifying and Describing the Format of Internet Message Bodies”.
The quoted-printable encoding is designed for data where there are relatively
few nonprintable characters; the base64 encoding scheme available via the
@ref{f,,base64} module is more compact if there are many such characters, as when
sending a graphics file.

@geindex decode() (in module quopri)
@anchor{library/quopri quopri decode}@anchor{28ec}
@deffn {Function} quopri.decode (input, output, header=False)

Decode the contents of the `input' file and write the resulting decoded binary
data to the `output' file. `input' and `output' must be @ref{13cf,,binary file objects}.  If the optional argument `header' is present and true, underscore
will be decoded as space. This is used to decode “Q”-encoded headers as
described in 
@geindex RFC; RFC 1522
RFC 1522@footnote{https://datatracker.ietf.org/doc/html/rfc1522.html}: “MIME (Multipurpose Internet Mail Extensions)
Part Two: Message Header Extensions for Non-ASCII Text”.
@end deffn

@geindex encode() (in module quopri)
@anchor{library/quopri quopri encode}@anchor{28eb}
@deffn {Function} quopri.encode (input, output, quotetabs, header=False)

Encode the contents of the `input' file and write the resulting quoted-printable
data to the `output' file. `input' and `output' must be
@ref{13cf,,binary file objects}. `quotetabs', a
non-optional flag which controls whether to encode embedded spaces
and tabs; when true it encodes such embedded whitespace, and when
false it leaves them unencoded.
Note that spaces and tabs appearing at the end of lines are always encoded,
as per 
@geindex RFC; RFC 1521
RFC 1521@footnote{https://datatracker.ietf.org/doc/html/rfc1521.html}.  `header' is a flag which controls if spaces are encoded
as underscores as per 
@geindex RFC; RFC 1522
RFC 1522@footnote{https://datatracker.ietf.org/doc/html/rfc1522.html}.
@end deffn

@geindex decodestring() (in module quopri)
@anchor{library/quopri quopri decodestring}@anchor{3d47}
@deffn {Function} quopri.decodestring (s, header=False)

Like @ref{28ec,,decode()}, except that it accepts a source @ref{193,,bytes} and
returns the corresponding decoded @code{bytes}.
@end deffn

@geindex encodestring() (in module quopri)
@anchor{library/quopri quopri encodestring}@anchor{3d48}
@deffn {Function} quopri.encodestring (s, quotetabs=False, header=False)

Like @ref{28eb,,encode()}, except that it accepts a source @ref{193,,bytes} and
returns the corresponding encoded @code{bytes}. By default, it sends a
@code{False} value to `quotetabs' parameter of the @code{encode()} function.
@end deffn


@subsubheading See also



@table @asis

@item Module @ref{f,,base64}

Encode and decode MIME base64 data
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Structured Markup Processing Tools,Internet Protocols and Support,Internet Data Handling,The Python Standard Library
@anchor{library/markup doc}@anchor{3d49}@anchor{library/markup markup}@anchor{3d4a}@anchor{library/markup structured-markup-processing-tools}@anchor{3d4b}@anchor{library/markup translation-repo}@anchor{3d4c}
@section Structured Markup Processing Tools


Python supports a variety of modules to work with various forms of structured
data markup.  This includes modules to work with the Standard Generalized Markup
Language (SGML) and the Hypertext Markup Language (HTML), and several interfaces
for working with the Extensible Markup Language (XML).

@menu
* html — HyperText Markup Language support:: 
* html.parser — Simple HTML and XHTML parser: html parser — Simple HTML and XHTML parser. 
* html.entities — Definitions of HTML general entities: html entities — Definitions of HTML general entities. 
* XML Processing Modules:: 
* xml.etree.ElementTree — The ElementTree XML API: xml etree ElementTree — The ElementTree XML API. 
* xml.dom — The Document Object Model API: xml dom — The Document Object Model API. 
* xml.dom.minidom — Minimal DOM implementation: xml dom minidom — Minimal DOM implementation. 
* xml.dom.pulldom — Support for building partial DOM trees: xml dom pulldom — Support for building partial DOM trees. 
* xml.sax — Support for SAX2 parsers: xml sax — Support for SAX2 parsers. 
* xml.sax.handler — Base classes for SAX handlers: xml sax handler — Base classes for SAX handlers. 
* xml.sax.saxutils — SAX Utilities: xml sax saxutils — SAX Utilities. 
* xml.sax.xmlreader — Interface for XML parsers: xml sax xmlreader — Interface for XML parsers. 
* xml.parsers.expat — Fast XML parsing using Expat: xml parsers expat — Fast XML parsing using Expat. 

@end menu

@node html — HyperText Markup Language support,html parser — Simple HTML and XHTML parser,,Structured Markup Processing Tools
@anchor{library/html doc}@anchor{3d4d}@anchor{library/html html-hypertext-markup-language-support}@anchor{3d4e}@anchor{library/html module-html}@anchor{6f}
@subsection @code{html} — HyperText Markup Language support


@geindex module; html

`Source code:' Lib/html/__init__.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/html/__init__.py}


__________________________________________________________________


This module defines utilities to manipulate HTML.

@geindex escape() (in module html)
@anchor{library/html html escape}@anchor{1214}
@deffn {Function} html.escape (s, quote=True)

Convert the characters @code{&}, @code{<} and @code{>} in string `s' to HTML-safe
sequences.  Use this if you need to display text that might contain such
characters in HTML.  If the optional flag `quote' is true (the default), the
characters (@code{"}) and (@code{'}) are also translated; this helps for inclusion
in an HTML attribute value delimited by quotes, as in @code{<a href="...">}.
If `quote' is set to false, the characters (@code{"}) and (@code{'}) are not
translated.


Added in version 3.2.

@end deffn

@geindex unescape() (in module html)
@anchor{library/html html unescape}@anchor{b56}
@deffn {Function} html.unescape (s)

Convert all named and numeric character references (e.g. @code{&gt;},
@code{&#62;}, @code{&#x3e;}) in the string `s' to the corresponding Unicode
characters.  This function uses the rules defined by the HTML 5 standard
for both valid and invalid character references, and the @ref{12de,,list of HTML 5 named character references}.


Added in version 3.4.

@end deffn


__________________________________________________________________


Submodules in the @code{html} package are:


@itemize *

@item 
@ref{71,,html.parser} – HTML/XHTML parser with lenient parsing mode

@item 
@ref{70,,html.entities} – HTML entity definitions
@end itemize

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node html parser — Simple HTML and XHTML parser,html entities — Definitions of HTML general entities,html — HyperText Markup Language support,Structured Markup Processing Tools
@anchor{library/html parser doc}@anchor{3d4f}@anchor{library/html parser html-parser-simple-html-and-xhtml-parser}@anchor{3d50}@anchor{library/html parser module-html parser}@anchor{71}@anchor{library/html parser translation-repo}@anchor{3d51}
@subsection @code{html.parser} — Simple HTML and XHTML parser


@geindex module; html.parser

`Source code:' Lib/html/parser.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/html/parser.py}

@geindex HTML
@geindex XHTML


__________________________________________________________________


This module defines a class @ref{a7d,,HTMLParser} which serves as the basis for
parsing text files formatted in HTML (HyperText Mark-up Language) and XHTML.

@geindex HTMLParser (class in html.parser)
@anchor{library/html parser html parser HTMLParser}@anchor{a7d}
@deffn {Class} html.parser.HTMLParser (*, convert_charrefs=True, scripting=False)

Create a parser instance able to parse invalid markup.

If `convert_charrefs' is true (the default), all character
references (except the ones in elements like @code{script} and @code{style}) are
automatically converted to the corresponding Unicode characters.

If `scripting' is false (the default), the content of the @code{noscript}
element is parsed normally; if it’s true, it’s returned as is without
being parsed.

An @code{HTMLParser} instance is fed HTML data and calls handler methods
when start tags, end tags, text, comments, and other markup elements are
encountered.  The user should subclass @code{HTMLParser} and override its
methods to implement the desired behavior.

This parser does not check that end tags match start tags or call the end-tag
handler for elements which are closed implicitly by closing an outer element.


Changed in version 3.4: `convert_charrefs' keyword argument added.



Changed in version 3.5: The default value for argument `convert_charrefs' is now @code{True}.



Changed in version 3.14.1: Added the `scripting' parameter.

@end deffn

@menu
* Example HTML Parser Application:: 
* HTMLParser Methods:: 
* Examples: Examples<25>. 

@end menu

@node Example HTML Parser Application,HTMLParser Methods,,html parser — Simple HTML and XHTML parser
@anchor{library/html parser example-html-parser-application}@anchor{3d52}
@subsubsection Example HTML Parser Application


As a basic example, below is a simple HTML parser that uses the
@ref{a7d,,HTMLParser} class to print out start tags, end tags, and data
as they are encountered:

@example
from html.parser import HTMLParser

class MyHTMLParser(HTMLParser):
    def handle_starttag(self, tag, attrs):
        print("Encountered a start tag:", tag)

    def handle_endtag(self, tag):
        print("Encountered an end tag :", tag)

    def handle_data(self, data):
        print("Encountered some data  :", data)

parser = MyHTMLParser()
parser.feed('<html><head><title>Test</title></head>'
            '<body><h1>Parse me!</h1></body></html>')
@end example

The output will then be:

@example
Encountered a start tag: html
Encountered a start tag: head
Encountered a start tag: title
Encountered some data  : Test
Encountered an end tag : title
Encountered an end tag : head
Encountered a start tag: body
Encountered a start tag: h1
Encountered some data  : Parse me!
Encountered an end tag : h1
Encountered an end tag : body
Encountered an end tag : html
@end example

@node HTMLParser Methods,Examples<25>,Example HTML Parser Application,html parser — Simple HTML and XHTML parser
@anchor{library/html parser htmlparser-methods}@anchor{3d53}
@subsubsection @code{HTMLParser} Methods


@ref{a7d,,HTMLParser} instances have the following methods:

@geindex feed() (html.parser.HTMLParser method)
@anchor{library/html parser html parser HTMLParser feed}@anchor{3d54}
@deffn {Method} HTMLParser.feed (data)

Feed some text to the parser.  It is processed insofar as it consists of
complete elements; incomplete data is buffered until more data is fed or
@ref{188a,,close()} is called.  `data' must be @ref{16a,,str}.
@end deffn

@geindex close() (html.parser.HTMLParser method)
@anchor{library/html parser html parser HTMLParser close}@anchor{188a}
@deffn {Method} HTMLParser.close ()

Force processing of all buffered data as if it were followed by an end-of-file
mark.  This method may be redefined by a derived class to define additional
processing at the end of the input, but the redefined version should always call
the @ref{a7d,,HTMLParser} base class method @code{close()}.
@end deffn

@geindex reset() (html.parser.HTMLParser method)
@anchor{library/html parser html parser HTMLParser reset}@anchor{3d55}
@deffn {Method} HTMLParser.reset ()

Reset the instance.  Loses all unprocessed data.  This is called implicitly at
instantiation time.
@end deffn

@geindex getpos() (html.parser.HTMLParser method)
@anchor{library/html parser html parser HTMLParser getpos}@anchor{3d56}
@deffn {Method} HTMLParser.getpos ()

Return current line number and offset.
@end deffn

@geindex get_starttag_text() (html.parser.HTMLParser method)
@anchor{library/html parser html parser HTMLParser get_starttag_text}@anchor{3d57}
@deffn {Method} HTMLParser.get_starttag_text ()

Return the text of the most recently opened start tag.  This should not normally
be needed for structured processing, but may be useful in dealing with HTML “as
deployed” or for re-generating input with minimal changes (whitespace between
attributes can be preserved, etc.).
@end deffn

The following methods are called when data or markup elements are encountered
and they are meant to be overridden in a subclass.  The base class
implementations do nothing (except for @ref{3d58,,handle_startendtag()}):

@geindex handle_starttag() (html.parser.HTMLParser method)
@anchor{library/html parser html parser HTMLParser handle_starttag}@anchor{3d59}
@deffn {Method} HTMLParser.handle_starttag (tag, attrs)

This method is called to handle the start tag of an element (e.g. @code{<div id="main">}).

The `tag' argument is the name of the tag converted to lower case. The `attrs'
argument is a list of @code{(name, value)} pairs containing the attributes found
inside the tag’s @code{<>} brackets.  The `name' will be translated to lower case,
and quotes in the `value' have been removed, and character and entity references
have been replaced.  For empty attributes, `value' is @code{None}.

For instance, for the tag @code{<A HREF="https://www.cwi.nl/">}, this method
would be called as @code{handle_starttag('a', [('href', 'https://www.cwi.nl/')])}.

All entity references from @ref{70,,html.entities} are replaced in the attribute
values.
@end deffn

@geindex handle_endtag() (html.parser.HTMLParser method)
@anchor{library/html parser html parser HTMLParser handle_endtag}@anchor{3d5a}
@deffn {Method} HTMLParser.handle_endtag (tag)

This method is called to handle the end tag of an element (e.g. @code{</div>}).

The `tag' argument is the name of the tag converted to lower case.
@end deffn

@geindex handle_startendtag() (html.parser.HTMLParser method)
@anchor{library/html parser html parser HTMLParser handle_startendtag}@anchor{3d58}
@deffn {Method} HTMLParser.handle_startendtag (tag, attrs)

Similar to @ref{3d59,,handle_starttag()}, but called when the parser encounters an
XHTML-style empty tag (@code{<img ... />}).  This method may be overridden by
subclasses which require this particular lexical information; the default
implementation simply calls @code{handle_starttag()} and @ref{3d5a,,handle_endtag()}.
@end deffn

@geindex handle_data() (html.parser.HTMLParser method)
@anchor{library/html parser html parser HTMLParser handle_data}@anchor{3d5b}
@deffn {Method} HTMLParser.handle_data (data)

This method is called to process arbitrary data (e.g. text nodes and the
content of elements like @code{script} and @code{style}).
@end deffn

@geindex handle_entityref() (html.parser.HTMLParser method)
@anchor{library/html parser html parser HTMLParser handle_entityref}@anchor{3d5c}
@deffn {Method} HTMLParser.handle_entityref (name)

This method is called to process a named character reference of the form
@code{&name;} (e.g. @code{&gt;}), where `name' is a general entity reference
(e.g. @code{'gt'}).
This method is only called if `convert_charrefs' is false.
@end deffn

@geindex handle_charref() (html.parser.HTMLParser method)
@anchor{library/html parser html parser HTMLParser handle_charref}@anchor{3d5d}
@deffn {Method} HTMLParser.handle_charref (name)

This method is called to process decimal and hexadecimal numeric character
references of the form @code{&#@var{NNN};} and @code{&#x@var{NNN};}.  For example, the decimal
equivalent for @code{&gt;} is @code{&#62;}, whereas the hexadecimal is @code{&#x3E;};
in this case the method will receive @code{'62'} or @code{'x3E'}.
This method is only called if `convert_charrefs' is false.
@end deffn

@geindex handle_comment() (html.parser.HTMLParser method)
@anchor{library/html parser html parser HTMLParser handle_comment}@anchor{3d5e}
@deffn {Method} HTMLParser.handle_comment (data)

This method is called when a comment is encountered (e.g. @code{<!--comment-->}).

For example, the comment @code{<!-- comment -->} will cause this method to be
called with the argument @code{' comment '}.

The content of Internet Explorer conditional comments (condcoms) will also be
sent to this method, so, for @code{<!--[if IE 9]>IE9-specific content<![endif]-->},
this method will receive @code{'[if IE 9]>IE9-specific content<![endif]'}.
@end deffn

@geindex handle_decl() (html.parser.HTMLParser method)
@anchor{library/html parser html parser HTMLParser handle_decl}@anchor{3d5f}
@deffn {Method} HTMLParser.handle_decl (decl)

This method is called to handle an HTML doctype declaration (e.g.
@code{<!DOCTYPE html>}).

The `decl' parameter will be the entire contents of the declaration inside
the @code{<!...>} markup (e.g. @code{'DOCTYPE html'}).
@end deffn

@geindex handle_pi() (html.parser.HTMLParser method)
@anchor{library/html parser html parser HTMLParser handle_pi}@anchor{3d60}
@deffn {Method} HTMLParser.handle_pi (data)

Method called when a processing instruction is encountered.  The `data'
parameter will contain the entire processing instruction. For example, for the
processing instruction @code{<?proc color='red'>}, this method would be called as
@code{handle_pi("proc color='red'")}.  It is intended to be overridden by a derived
class; the base class implementation does nothing.

@cartouche
@quotation Note 
The @ref{a7d,,HTMLParser} class uses the SGML syntactic rules for processing
instructions.  An XHTML processing instruction using the trailing @code{'?'} will
cause the @code{'?'} to be included in `data'.
@end quotation
@end cartouche
@end deffn

@geindex unknown_decl() (html.parser.HTMLParser method)
@anchor{library/html parser html parser HTMLParser unknown_decl}@anchor{3d61}
@deffn {Method} HTMLParser.unknown_decl (data)

This method is called when an unrecognized declaration is read by the parser.

The `data' parameter will be the entire contents of the declaration inside
the @code{<![...]>} markup.  It is sometimes useful to be overridden by a
derived class.  The base class implementation does nothing.
@end deffn

@node Examples<25>,,HTMLParser Methods,html parser — Simple HTML and XHTML parser
@anchor{library/html parser examples}@anchor{3d62}@anchor{library/html parser htmlparser-examples}@anchor{3d63}
@subsubsection Examples


The following class implements a parser that will be used to illustrate more
examples:

@example
from html.parser import HTMLParser
from html.entities import name2codepoint

class MyHTMLParser(HTMLParser):
    def handle_starttag(self, tag, attrs):
        print("Start tag:", tag)
        for attr in attrs:
            print("     attr:", attr)

    def handle_endtag(self, tag):
        print("End tag  :", tag)

    def handle_data(self, data):
        print("Data     :", data)

    def handle_comment(self, data):
        print("Comment  :", data)

    def handle_entityref(self, name):
        c = chr(name2codepoint[name])
        print("Named ent:", c)

    def handle_charref(self, name):
        if name.startswith('x'):
            c = chr(int(name[1:], 16))
        else:
            c = chr(int(name))
        print("Num ent  :", c)

    def handle_decl(self, data):
        print("Decl     :", data)

parser = MyHTMLParser()
@end example

Parsing a doctype:

@example
>>> parser.feed('<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" '
...             '"http://www.w3.org/TR/html4/strict.dtd">')
Decl     : DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"
@end example

Parsing an element with a few attributes and a title:

@example
>>> parser.feed('<img src="python-logo.png" alt="The Python logo">')
Start tag: img
     attr: ('src', 'python-logo.png')
     attr: ('alt', 'The Python logo')
>>>
>>> parser.feed('<h1>Python</h1>')
Start tag: h1
Data     : Python
End tag  : h1
@end example

The content of elements like @code{script} and @code{style} is returned as is,
without further parsing:

@example
>>> parser.feed('<style type="text/css">#python @{ color: green @}</style>')
Start tag: style
     attr: ('type', 'text/css')
Data     : #python @{ color: green @}
End tag  : style

>>> parser.feed('<script type="text/javascript">'
...             'alert("<strong>hello! &#9786;</strong>");</script>')
Start tag: script
     attr: ('type', 'text/javascript')
Data     : alert("<strong>hello! &#9786;</strong>");
End tag  : script
@end example

Attribute names are converted to lowercase, quotes from attribute values removed,
and @code{None} is returned as `value' for empty attributes (such as @code{checked}):

@example
>>> parser.feed("<input TYPE='checkbox' checked required='@w{'} disabled=disabled>")
Start tag: input
     attr: ('type', 'checkbox')
     attr: ('checked', None)
     attr: ('required', '@w{'})
     attr: ('disabled', 'disabled')
@end example

Parsing comments:

@example
>>> parser.feed('<!--a comment-->'
...             '<!--[if IE 9]>IE-specific content<![endif]-->')
Comment  : a comment
Comment  : [if IE 9]>IE-specific content<![endif]
@end example

Parsing named and numeric character references and converting them to the
correct char (note: these 3 references are all equivalent to @code{'>'}):

@example
>>> parser = MyHTMLParser()
>>> parser.feed('&gt;&#62;&#x3E;')
Data     : >>>

>>> parser = MyHTMLParser(convert_charrefs=False)
>>> parser.feed('&gt;&#62;&#x3E;')
Named ent: >
Num ent  : >
Num ent  : >
@end example

Feeding incomplete chunks to @ref{3d54,,feed()} works, but
@ref{3d5b,,handle_data()} might be called more than once
if `convert_charrefs' is false:

@example
>>> for chunk in ['<sp', 'an>buff', 'ered', ' text</s', 'pan>']:
...     parser.feed(chunk)
...
Start tag: span
Data     : buff
Data     : ered
Data     :  text
End tag  : span
@end example

Parsing invalid HTML (e.g. unquoted attributes) also works:

@example
>>> parser.feed('<p><a class=link href=#main>tag soup</p ></a>')
Start tag: p
Start tag: a
     attr: ('class', 'link')
     attr: ('href', '#main')
Data     : tag soup
End tag  : p
End tag  : a
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node html entities — Definitions of HTML general entities,XML Processing Modules,html parser — Simple HTML and XHTML parser,Structured Markup Processing Tools
@anchor{library/html entities doc}@anchor{3d64}@anchor{library/html entities html-entities-definitions-of-html-general-entities}@anchor{3d65}@anchor{library/html entities module-html entities}@anchor{70}@anchor{library/html entities translation-repo}@anchor{3d66}
@subsection @code{html.entities} — Definitions of HTML general entities


@geindex module; html.entities

`Source code:' Lib/html/entities.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/html/entities.py}


__________________________________________________________________


This module defines four dictionaries, @ref{12de,,html5},
@ref{3d67,,name2codepoint}, @ref{3d68,,codepoint2name}, and @ref{3d69,,entitydefs}.

@geindex html5 (in module html.entities)
@anchor{library/html entities html entities html5}@anchor{12de}
@deffn {Data} html.entities.html5

A dictionary that maps HTML5 named character references @footnote{
See @indicateurl{https://html.spec.whatwg.org/multipage/named-characters.html#named-character-references}
} to the
equivalent Unicode character(s), e.g. @code{html5['gt;'] == '>'}.
Note that the trailing semicolon is included in the name (e.g. @code{'gt;'}),
however some of the names are accepted by the standard even without the
semicolon: in this case the name is present with and without the @code{';'}.
See also @ref{b56,,html.unescape()}.


Added in version 3.3.

@end deffn

@geindex entitydefs (in module html.entities)
@anchor{library/html entities html entities entitydefs}@anchor{3d69}
@deffn {Data} html.entities.entitydefs

A dictionary mapping XHTML 1.0 entity definitions to their replacement text in
ISO Latin-1.
@end deffn

@geindex name2codepoint (in module html.entities)
@anchor{library/html entities html entities name2codepoint}@anchor{3d67}
@deffn {Data} html.entities.name2codepoint

A dictionary that maps HTML4 entity names to the Unicode code points.
@end deffn

@geindex codepoint2name (in module html.entities)
@anchor{library/html entities html entities codepoint2name}@anchor{3d68}
@deffn {Data} html.entities.codepoint2name

A dictionary that maps Unicode code points to HTML4 entity names.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node XML Processing Modules,xml etree ElementTree — The ElementTree XML API,html entities — Definitions of HTML general entities,Structured Markup Processing Tools
@anchor{library/xml doc}@anchor{3d6a}@anchor{library/xml module-xml}@anchor{127}@anchor{library/xml translation-repo}@anchor{3d6b}@anchor{library/xml xml}@anchor{3d6c}@anchor{library/xml xml-processing-modules}@anchor{3d6d}
@subsection XML Processing Modules


@geindex module; xml

`Source code:' Lib/xml/@footnote{https://github.com/python/cpython/tree/3.14/Lib/xml/}


__________________________________________________________________


Python’s interfaces for processing XML are grouped in the @code{xml} package.

@cartouche
@quotation Note 
If you need to parse untrusted or unauthenticated data, see
@ref{3d6e,,XML security}.
@end quotation
@end cartouche

It is important to note that modules in the @code{xml} package require that
there be at least one SAX-compliant XML parser available. The Expat parser is
included with Python, so the @ref{12d,,xml.parsers.expat} module will always be
available.

The documentation for the @ref{128,,xml.dom} and @ref{130,,xml.sax} packages are the
definition of the Python bindings for the DOM and SAX interfaces.

The XML handling submodules are:


@itemize *

@item 
@ref{12c,,xml.etree.ElementTree}: the ElementTree API, a simple and lightweight
XML processor
@end itemize



@itemize *

@item 
@ref{128,,xml.dom}: the DOM API definition

@item 
@ref{129,,xml.dom.minidom}: a minimal DOM implementation

@item 
@ref{12a,,xml.dom.pulldom}: support for building partial DOM trees
@end itemize



@itemize *

@item 
@ref{130,,xml.sax}: SAX2 base classes and convenience functions

@item 
@ref{12d,,xml.parsers.expat}: the Expat parser binding
@end itemize
@anchor{library/xml xml-security}@anchor{3d6e}
@menu
* XML security:: 

@end menu

@node XML security,,,XML Processing Modules
@anchor{library/xml id1}@anchor{3d6f}@anchor{library/xml xml-vulnerabilities}@anchor{3d70}
@subsubsection XML security


An attacker can abuse XML features to carry out denial of service attacks,
access local files, generate network connections to other machines, or
circumvent firewalls when attacker-controlled XML is being parsed,
in Python or elsewhere.

The built-in XML parsers of Python rely on the library libexpat@footnote{https://github.com/libexpat/libexpat}, commonly
called Expat, for parsing XML.

By default, Expat itself does not access local files or create network
connections.

Expat versions lower than 2.7.2 may be vulnerable to the “billion laughs”,
“quadratic blowup” and “large tokens” vulnerabilities, or to disproportional
use of dynamic memory.
Python bundles a copy of Expat, and whether Python uses the bundled or a
system-wide Expat, depends on how the Python interpreter
@ref{1b71,,has been configured} in your environment.
Python may be vulnerable if it uses such older versions of Expat.
Check @code{pyexpat.EXPAT_VERSION}.

@ref{134,,xmlrpc} is `vulnerable' to the “decompression bomb” attack.


@table @asis

@item billion laughs / exponential entity expansion

The Billion Laughs@footnote{https://en.wikipedia.org/wiki/Billion_laughs} attack – also known as exponential entity expansion –
uses multiple levels of nested entities. Each entity refers to another entity
several times, and the final entity definition contains a small string.
The exponential expansion results in several gigabytes of text and
consumes lots of memory and CPU time.

@item quadratic blowup entity expansion

A quadratic blowup attack is similar to a Billion Laughs@footnote{https://en.wikipedia.org/wiki/Billion_laughs} attack; it abuses
entity expansion, too. Instead of nested entities it repeats one large entity
with a couple of thousand chars over and over again. The attack isn’t as
efficient as the exponential case but it avoids triggering parser countermeasures
that forbid deeply nested entities.

@item decompression bomb

Decompression bombs (aka ZIP bomb@footnote{https://en.wikipedia.org/wiki/Zip_bomb}) apply to all XML libraries
that can parse compressed XML streams such as gzipped HTTP streams or
LZMA-compressed
files. For an attacker it can reduce the amount of transmitted data by three
magnitudes or more.

@item large tokens

Expat needs to re-parse unfinished tokens; without the protection
introduced in Expat 2.6.0, this can lead to quadratic runtime that can
be used to cause denial of service in the application parsing XML.
The issue is known as 
@geindex Common Vulnerabilities and Exposures; CVE 2023-52425
CVE 2023-52425@footnote{https://www.cve.org/CVERecord?id=CVE-2023-52425}.
@end table

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node xml etree ElementTree — The ElementTree XML API,xml dom — The Document Object Model API,XML Processing Modules,Structured Markup Processing Tools
@anchor{library/xml etree elementtree doc}@anchor{3d71}@anchor{library/xml etree elementtree module-xml etree ElementTree}@anchor{12c}@anchor{library/xml etree elementtree translation-repo}@anchor{3d72}@anchor{library/xml etree elementtree xml-etree-elementtree-the-elementtree-xml-api}@anchor{3d73}
@subsection @code{xml.etree.ElementTree} — The ElementTree XML API


@geindex module; xml.etree.ElementTree

`Source code:' Lib/xml/etree/ElementTree.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/xml/etree/ElementTree.py}


__________________________________________________________________


The @code{xml.etree.ElementTree} module implements a simple and efficient API
for parsing and creating XML data.


Changed in version 3.3: This module will use a fast implementation whenever available.



Deprecated since version 3.3: The @code{xml.etree.cElementTree} module is deprecated.


@cartouche
@quotation Note 
If you need to parse untrusted or unauthenticated data, see
@ref{3d6e,,XML security}.
@end quotation
@end cartouche

@menu
* Tutorial: Tutorial<3>. 
* XPath support:: 
* Reference: Reference<5>. 
* XInclude support:: 
* Reference: Reference<6>. 

@end menu

@node Tutorial<3>,XPath support,,xml etree ElementTree — The ElementTree XML API
@anchor{library/xml etree elementtree tutorial}@anchor{3d74}
@subsubsection Tutorial


This is a short tutorial for using @code{xml.etree.ElementTree} (@code{ET} in
short).  The goal is to demonstrate some of the building blocks and basic
concepts of the module.

@menu
* XML tree and elements:: 
* Parsing XML:: 
* Pull API for non-blocking parsing:: 
* Finding interesting elements:: 
* Modifying an XML File:: 
* Building XML documents:: 
* Parsing XML with Namespaces:: 

@end menu

@node XML tree and elements,Parsing XML,,Tutorial<3>
@anchor{library/xml etree elementtree xml-tree-and-elements}@anchor{3d75}
@subsubsection XML tree and elements


XML is an inherently hierarchical data format, and the most natural way to
represent it is with a tree.  @code{ET} has two classes for this purpose -
@ref{b4d,,ElementTree} represents the whole XML document as a tree, and
@ref{361,,Element} represents a single node in this tree.  Interactions with
the whole document (reading and writing to/from files) are usually done
on the @code{ElementTree} level.  Interactions with a single XML element
and its sub-elements are done on the @code{Element} level.

@node Parsing XML,Pull API for non-blocking parsing,XML tree and elements,Tutorial<3>
@anchor{library/xml etree elementtree elementtree-parsing-xml}@anchor{3d76}@anchor{library/xml etree elementtree parsing-xml}@anchor{3d77}
@subsubsection Parsing XML


We’ll be using the fictive @code{country_data.xml} XML document as the sample data for this section:

@example
<?xml version="1.0"?>
<data>
    <country name="Liechtenstein">
        <rank>1</rank>
        <year>2008</year>
        <gdppc>141100</gdppc>
        <neighbor name="Austria" direction="E"/>
        <neighbor name="Switzerland" direction="W"/>
    </country>
    <country name="Singapore">
        <rank>4</rank>
        <year>2011</year>
        <gdppc>59900</gdppc>
        <neighbor name="Malaysia" direction="N"/>
    </country>
    <country name="Panama">
        <rank>68</rank>
        <year>2011</year>
        <gdppc>13600</gdppc>
        <neighbor name="Costa Rica" direction="W"/>
        <neighbor name="Colombia" direction="E"/>
    </country>
</data>
@end example

We can import this data by reading from a file:

@example
import xml.etree.ElementTree as ET
tree = ET.parse('country_data.xml')
root = tree.getroot()
@end example

Or directly from a string:

@example
root = ET.fromstring(country_data_as_string)
@end example

@ref{3d78,,fromstring()} parses XML from a string directly into an @ref{361,,Element},
which is the root element of the parsed tree.  Other parsing functions may
create an @ref{b4d,,ElementTree}.  Check the documentation to be sure.

As an @ref{361,,Element}, @code{root} has a tag and a dictionary of attributes:

@example
>>> root.tag
'data'
>>> root.attrib
@{@}
@end example

It also has children nodes over which we can iterate:

@example
>>> for child in root:
...     print(child.tag, child.attrib)
...
country @{'name': 'Liechtenstein'@}
country @{'name': 'Singapore'@}
country @{'name': 'Panama'@}
@end example

Children are nested, and we can access specific child nodes by index:

@example
>>> root[0][1].text
'2008'
@end example

@cartouche
@quotation Note 
Not all elements of the XML input will end up as elements of the
parsed tree. Currently, this module skips over any XML comments,
processing instructions, and document type declarations in the
input. Nevertheless, trees built using this module’s API rather
than parsing from XML text can have comments and processing
instructions in them; they will be included when generating XML
output. A document type declaration may be accessed by passing a
custom @ref{c50,,TreeBuilder} instance to the @ref{c4f,,XMLParser}
constructor.
@end quotation
@end cartouche

@node Pull API for non-blocking parsing,Finding interesting elements,Parsing XML,Tutorial<3>
@anchor{library/xml etree elementtree elementtree-pull-parsing}@anchor{11fa}@anchor{library/xml etree elementtree pull-api-for-non-blocking-parsing}@anchor{3d79}
@subsubsection Pull API for non-blocking parsing


Most parsing functions provided by this module require the whole document
to be read at once before returning any result.  It is possible to use an
@ref{c4f,,XMLParser} and feed data into it incrementally, but it is a push API that
calls methods on a callback target, which is too low-level and inconvenient for
most needs.  Sometimes what the user really wants is to be able to parse XML
incrementally, without blocking operations, while enjoying the convenience of
fully constructed @ref{361,,Element} objects.

The most powerful tool for doing this is @ref{11f9,,XMLPullParser}.  It does not
require a blocking read to obtain the XML data, and is instead fed with data
incrementally with @ref{3d7a,,XMLPullParser.feed()} calls.  To get the parsed XML
elements, call @ref{3d7b,,XMLPullParser.read_events()}.  Here is an example:

@example
>>> parser = ET.XMLPullParser(['start', 'end'])
>>> parser.feed('<mytag>sometext')
>>> list(parser.read_events())
[('start', <Element 'mytag' at 0x7fa66db2be58>)]
>>> parser.feed(' more text</mytag>')
>>> for event, elem in parser.read_events():
...     print(event)
...     print(elem.tag, 'text=', elem.text)
...
end
mytag text= sometext more text
@end example

The obvious use case is applications that operate in a non-blocking fashion
where the XML data is being received from a socket or read incrementally from
some storage device.  In such cases, blocking reads are unacceptable.

Because it’s so flexible, @ref{11f9,,XMLPullParser} can be inconvenient to use for
simpler use-cases.  If you don’t mind your application blocking on reading XML
data but would still like to have incremental parsing capabilities, take a look
at @ref{57a,,iterparse()}.  It can be useful when you’re reading a large XML document
and don’t want to hold it wholly in memory.

Where `immediate' feedback through events is wanted, calling method
@ref{577,,XMLPullParser.flush()} can help reduce delay;
please make sure to study the related security notes.

@node Finding interesting elements,Modifying an XML File,Pull API for non-blocking parsing,Tutorial<3>
@anchor{library/xml etree elementtree finding-interesting-elements}@anchor{3d7c}
@subsubsection Finding interesting elements


@ref{361,,Element} has some useful methods that help iterate recursively over all
the sub-tree below it (its children, their children, and so on).  For example,
@ref{155a,,Element.iter()}:

@example
>>> for neighbor in root.iter('neighbor'):
...     print(neighbor.attrib)
...
@{'name': 'Austria', 'direction': 'E'@}
@{'name': 'Switzerland', 'direction': 'W'@}
@{'name': 'Malaysia', 'direction': 'N'@}
@{'name': 'Costa Rica', 'direction': 'W'@}
@{'name': 'Colombia', 'direction': 'E'@}
@end example

@ref{18c4,,Element.findall()} finds only elements with a tag which are direct
children of the current element.  @ref{18c3,,Element.find()} finds the `first' child
with a particular tag, and @ref{3d7d,,Element.text} accesses the element’s text
content.  @ref{3d7e,,Element.get()} accesses the element’s attributes:

@example
>>> for country in root.findall('country'):
...     rank = country.find('rank').text
...     name = country.get('name')
...     print(name, rank)
...
Liechtenstein 1
Singapore 4
Panama 68
@end example

More sophisticated specification of which elements to look for is possible by
using @ref{dac,,XPath}.

@node Modifying an XML File,Building XML documents,Finding interesting elements,Tutorial<3>
@anchor{library/xml etree elementtree modifying-an-xml-file}@anchor{3d7f}
@subsubsection Modifying an XML File


@ref{b4d,,ElementTree} provides a simple way to build XML documents and write them to files.
The @ref{c92,,ElementTree.write()} method serves this purpose.

Once created, an @ref{361,,Element} object may be manipulated by directly changing
its fields (such as @ref{3d7d,,Element.text}), adding and modifying attributes
(@ref{3d80,,Element.set()} method), as well as adding new children (for example
with @ref{3d81,,Element.append()}).

Let’s say we want to add one to each country’s rank, and add an @code{updated}
attribute to the rank element:

@example
>>> for rank in root.iter('rank'):
...     new_rank = int(rank.text) + 1
...     rank.text = str(new_rank)
...     rank.set('updated', 'yes')
...
>>> tree.write('output.xml')
@end example

Our XML now looks like this:

@example
<?xml version="1.0"?>
<data>
    <country name="Liechtenstein">
        <rank updated="yes">2</rank>
        <year>2008</year>
        <gdppc>141100</gdppc>
        <neighbor name="Austria" direction="E"/>
        <neighbor name="Switzerland" direction="W"/>
    </country>
    <country name="Singapore">
        <rank updated="yes">5</rank>
        <year>2011</year>
        <gdppc>59900</gdppc>
        <neighbor name="Malaysia" direction="N"/>
    </country>
    <country name="Panama">
        <rank updated="yes">69</rank>
        <year>2011</year>
        <gdppc>13600</gdppc>
        <neighbor name="Costa Rica" direction="W"/>
        <neighbor name="Colombia" direction="E"/>
    </country>
</data>
@end example

We can remove elements using @ref{18bf,,Element.remove()}.  Let’s say we want to
remove all countries with a rank higher than 50:

@example
>>> for country in root.findall('country'):
...     # using root.findall() to avoid removal during traversal
...     rank = int(country.find('rank').text)
...     if rank > 50:
...         root.remove(country)
...
>>> tree.write('output.xml')
@end example

Note that concurrent modification while iterating can lead to problems,
just like when iterating and modifying Python lists or dicts.
Therefore, the example first collects all matching elements with
@code{root.findall()}, and only then iterates over the list of matches.

Our XML now looks like this:

@example
<?xml version="1.0"?>
<data>
    <country name="Liechtenstein">
        <rank updated="yes">2</rank>
        <year>2008</year>
        <gdppc>141100</gdppc>
        <neighbor name="Austria" direction="E"/>
        <neighbor name="Switzerland" direction="W"/>
    </country>
    <country name="Singapore">
        <rank updated="yes">5</rank>
        <year>2011</year>
        <gdppc>59900</gdppc>
        <neighbor name="Malaysia" direction="N"/>
    </country>
</data>
@end example

@node Building XML documents,Parsing XML with Namespaces,Modifying an XML File,Tutorial<3>
@anchor{library/xml etree elementtree building-xml-documents}@anchor{3d82}
@subsubsection Building XML documents


The @ref{3d83,,SubElement()} function also provides a convenient way to create new
sub-elements for a given element:

@example
>>> a = ET.Element('a')
>>> b = ET.SubElement(a, 'b')
>>> c = ET.SubElement(a, 'c')
>>> d = ET.SubElement(c, 'd')
>>> ET.dump(a)
<a><b /><c><d /></c></a>
@end example

@node Parsing XML with Namespaces,,Building XML documents,Tutorial<3>
@anchor{library/xml etree elementtree parsing-xml-with-namespaces}@anchor{3d84}
@subsubsection Parsing XML with Namespaces


If the XML input has namespaces@footnote{https://en.wikipedia.org/wiki/XML_namespace}, tags and attributes
with prefixes in the form @code{prefix:sometag} get expanded to
@code{@{uri@}sometag} where the `prefix' is replaced by the full `URI'.
Also, if there is a default namespace@footnote{https://www.w3.org/TR/xml-names/#defaulting},
that full URI gets prepended to all of the non-prefixed tags.

Here is an XML example that incorporates two namespaces, one with the
prefix “fictional” and the other serving as the default namespace:

@example
<?xml version="1.0"?>
<actors xmlns:fictional="http://characters.example.com"
        xmlns="http://people.example.com">
    <actor>
        <name>John Cleese</name>
        <fictional:character>Lancelot</fictional:character>
        <fictional:character>Archie Leach</fictional:character>
    </actor>
    <actor>
        <name>Eric Idle</name>
        <fictional:character>Sir Robin</fictional:character>
        <fictional:character>Gunther</fictional:character>
        <fictional:character>Commander Clement</fictional:character>
    </actor>
</actors>
@end example

One way to search and explore this XML example is to manually add the
URI to every tag or attribute in the xpath of a
@ref{18c3,,find()} or @ref{18c4,,findall()}:

@example
root = fromstring(xml_text)
for actor in root.findall('@{http://people.example.com@}actor'):
    name = actor.find('@{http://people.example.com@}name')
    print(name.text)
    for char in actor.findall('@{http://characters.example.com@}character'):
        print(' |-->', char.text)
@end example

A better way to search the namespaced XML example is to create a
dictionary with your own prefixes and use those in the search functions:

@example
ns = @{'real_person': 'http://people.example.com',
      'role': 'http://characters.example.com'@}

for actor in root.findall('real_person:actor', ns):
    name = actor.find('real_person:name', ns)
    print(name.text)
    for char in actor.findall('role:character', ns):
        print(' |-->', char.text)
@end example

These two approaches both output:

@example
John Cleese
 |--> Lancelot
 |--> Archie Leach
Eric Idle
 |--> Sir Robin
 |--> Gunther
 |--> Commander Clement
@end example

@node XPath support,Reference<5>,Tutorial<3>,xml etree ElementTree — The ElementTree XML API
@anchor{library/xml etree elementtree elementtree-xpath}@anchor{dac}@anchor{library/xml etree elementtree xpath-support}@anchor{3d85}
@subsubsection XPath support


This module provides limited support for
XPath expressions@footnote{https://www.w3.org/TR/xpath} for locating elements in a
tree.  The goal is to support a small subset of the abbreviated syntax; a full
XPath engine is outside the scope of the module.

@menu
* Example: Example<8>. 
* Supported XPath syntax:: 

@end menu

@node Example<8>,Supported XPath syntax,,XPath support
@anchor{library/xml etree elementtree example}@anchor{3d86}
@subsubsection Example


Here’s an example that demonstrates some of the XPath capabilities of the
module.  We’ll be using the @code{countrydata} XML document from the
@ref{3d76,,Parsing XML} section:

@example
import xml.etree.ElementTree as ET

root = ET.fromstring(countrydata)

# Top-level elements
root.findall(".")

# All 'neighbor' grand-children of 'country' children of the top-level
# elements
root.findall("./country/neighbor")

# Nodes with name='Singapore' that have a 'year' child
root.findall(".//year/..[@@name='Singapore']")

# 'year' nodes that are children of nodes with name='Singapore'
root.findall(".//*[@@name='Singapore']/year")

# All 'neighbor' nodes that are the second child of their parent
root.findall(".//neighbor[2]")
@end example

For XML with namespaces, use the usual qualified @code{@{namespace@}tag} notation:

@example
# All dublin-core "title" tags in the document
root.findall(".//@{http://purl.org/dc/elements/1.1/@}title")
@end example

@node Supported XPath syntax,,Example<8>,XPath support
@anchor{library/xml etree elementtree supported-xpath-syntax}@anchor{3d87}
@subsubsection Supported XPath syntax



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Syntax

@tab

Meaning

@item

@code{tag}

@tab

Selects all child elements with the given tag.
For example, @code{spam} selects all child elements
named @code{spam}, and @code{spam/egg} selects all
grandchildren named @code{egg} in all children named
@code{spam}.  @code{@{namespace@}*} selects all tags in the
given namespace, @code{@{*@}spam} selects tags named
@code{spam} in any (or no) namespace, and @code{@{@}*}
only selects tags that are not in a namespace.


Changed in version 3.8: Support for star-wildcards was added.


@item

@code{*}

@tab

Selects all child elements, including comments and
processing instructions.  For example, @code{*/egg}
selects all grandchildren named @code{egg}.

@item

@code{.}

@tab

Selects the current node.  This is mostly useful
at the beginning of the path, to indicate that it’s
a relative path.

@item

@code{//}

@tab

Selects all subelements, on all levels beneath the
current  element.  For example, @code{.//egg} selects
all @code{egg} elements in the entire tree.

@item

@code{..}

@tab

Selects the parent element.  Returns @code{None} if the
path attempts to reach the ancestors of the start
element (the element @code{find} was called on).

@item

@code{[@@attrib]}

@tab

Selects all elements that have the given attribute.

@item

@code{[@@attrib='value']}

@tab

Selects all elements for which the given attribute
has the given value.  The value cannot contain
quotes.

@item

@code{[@@attrib!='value']}

@tab

Selects all elements for which the given attribute
does not have the given value. The value cannot
contain quotes.


Added in version 3.10.


@item

@code{[tag]}

@tab

Selects all elements that have a child named
@code{tag}.  Only immediate children are supported.

@item

@code{[.='text']}

@tab

Selects all elements whose complete text content,
including descendants, equals the given @code{text}.


Added in version 3.7.


@item

@code{[.!='text']}

@tab

Selects all elements whose complete text content,
including descendants, does not equal the given
@code{text}.


Added in version 3.10.


@item

@code{[tag='text']}

@tab

Selects all elements that have a child named
@code{tag} whose complete text content, including
descendants, equals the given @code{text}.

@item

@code{[tag!='text']}

@tab

Selects all elements that have a child named
@code{tag} whose complete text content, including
descendants, does not equal the given @code{text}.


Added in version 3.10.


@item

@code{[position]}

@tab

Selects all elements that are located at the given
position.  The position can be either an integer
(1 is the first position), the expression @code{last()}
(for the last position), or a position relative to
the last position (e.g. @code{last()-1}).

@end multitable


Predicates (expressions within square brackets) must be preceded by a tag
name, an asterisk, or another predicate.  @code{position} predicates must be
preceded by a tag name.

@node Reference<5>,XInclude support,XPath support,xml etree ElementTree — The ElementTree XML API
@anchor{library/xml etree elementtree reference}@anchor{3d88}
@subsubsection Reference


@menu
* Functions: Functions<9>. 

@end menu

@node Functions<9>,,,Reference<5>
@anchor{library/xml etree elementtree elementtree-functions}@anchor{3d89}@anchor{library/xml etree elementtree functions}@anchor{3d8a}
@subsubsection Functions


@geindex canonicalize() (in module xml.etree.ElementTree)
@anchor{library/xml etree elementtree xml etree ElementTree canonicalize}@anchor{c4e}
@deffn {Function} xml.etree.ElementTree.canonicalize (xml_data=None, *, out=None, from_file=None, **options)

C14N 2.0@footnote{https://www.w3.org/TR/xml-c14n2/} transformation function.

Canonicalization is a way to normalise XML output in a way that allows
byte-by-byte comparisons and digital signatures.  It reduces the freedom
that XML serializers have and instead generates a more constrained XML
representation.  The main restrictions regard the placement of namespace
declarations, the ordering of attributes, and ignorable whitespace.

This function takes an XML data string (`xml_data') or a file path or
file-like object (`from_file') as input, converts it to the canonical
form, and writes it out using the `out' file(-like) object, if provided,
or returns it as a text string if not.  The output file receives text,
not bytes.  It should therefore be opened in text mode with @code{utf-8}
encoding.

Typical uses:

@example
xml_data = "<root>...</root>"
print(canonicalize(xml_data))

with open("c14n_output.xml", mode='w', encoding='utf-8') as out_file:
    canonicalize(xml_data, out=out_file)

with open("c14n_output.xml", mode='w', encoding='utf-8') as out_file:
    canonicalize(from_file="inputfile.xml", out=out_file)
@end example

The configuration `options' are as follows:


@itemize -

@item 
`with_comments': set to true to include comments (default: false)

@item 

@table @asis

@item `strip_text': set to true to strip whitespace before and after text content

(default: false)
@end table

@item 

@table @asis

@item `rewrite_prefixes': set to true to replace namespace prefixes by “n@{number@}”

(default: false)
@end table

@item 

@table @asis

@item `qname_aware_tags': a set of qname aware tag names in which prefixes

should be replaced in text content (default: empty)
@end table

@item 

@table @asis

@item `qname_aware_attrs': a set of qname aware attribute names in which prefixes

should be replaced in text content (default: empty)
@end table

@item 
`exclude_attrs': a set of attribute names that should not be serialised

@item 
`exclude_tags': a set of tag names that should not be serialised
@end itemize

In the option list above, “a set” refers to any collection or iterable of
strings, no ordering is expected.


Added in version 3.8.

@end deffn

@geindex Comment() (in module xml.etree.ElementTree)
@anchor{library/xml etree elementtree xml etree ElementTree Comment}@anchor{3d8b}
@deffn {Function} xml.etree.ElementTree.Comment (text=None)

Comment element factory.  This factory function creates a special element
that will be serialized as an XML comment by the standard serializer.  The
comment string can be either a bytestring or a Unicode string.  `text' is a
string containing the comment string.  Returns an element instance
representing a comment.

Note that @ref{c4f,,XMLParser} skips over comments in the input
instead of creating comment objects for them. An @ref{b4d,,ElementTree} will
only contain comment nodes if they have been inserted into to
the tree using one of the @ref{361,,Element} methods.
@end deffn

@geindex dump() (in module xml.etree.ElementTree)
@anchor{library/xml etree elementtree xml etree ElementTree dump}@anchor{3d8c}
@deffn {Function} xml.etree.ElementTree.dump (elem)

Writes an element tree or element structure to sys.stdout.  This function
should be used for debugging only.

The exact output format is implementation dependent.  In this version, it’s
written as an ordinary XML file.

`elem' is an element tree or an individual element.


Changed in version 3.8: The @code{dump()} function now preserves the attribute order specified
by the user.

@end deffn

@geindex fromstring() (in module xml.etree.ElementTree)
@anchor{library/xml etree elementtree xml etree ElementTree fromstring}@anchor{3d78}
@deffn {Function} xml.etree.ElementTree.fromstring (text, parser=None)

Parses an XML section from a string constant.  Same as @ref{3d8d,,XML()}.  `text'
is a string containing XML data.  `parser' is an optional parser instance.
If not given, the standard @ref{c4f,,XMLParser} parser is used.
Returns an @ref{361,,Element} instance.
@end deffn

@geindex fromstringlist() (in module xml.etree.ElementTree)
@anchor{library/xml etree elementtree xml etree ElementTree fromstringlist}@anchor{13dd}
@deffn {Function} xml.etree.ElementTree.fromstringlist (sequence, parser=None)

Parses an XML document from a sequence of string fragments.  `sequence' is a
list or other sequence containing XML data fragments.  `parser' is an
optional parser instance.  If not given, the standard @ref{c4f,,XMLParser}
parser is used.  Returns an @ref{361,,Element} instance.


Added in version 3.2.

@end deffn

@geindex indent() (in module xml.etree.ElementTree)
@anchor{library/xml etree elementtree xml etree ElementTree indent}@anchor{3d8e}
@deffn {Function} xml.etree.ElementTree.indent (tree, space='  ', level=0)

Appends whitespace to the subtree to indent the tree visually.
This can be used to generate pretty-printed XML output.
`tree' can be an Element or ElementTree.  `space' is the whitespace
string that will be inserted for each indentation level, two space
characters by default.  For indenting partial subtrees inside of an
already indented tree, pass the initial indentation level as `level'.


Added in version 3.9.

@end deffn

@geindex iselement() (in module xml.etree.ElementTree)
@anchor{library/xml etree elementtree xml etree ElementTree iselement}@anchor{3d8f}
@deffn {Function} xml.etree.ElementTree.iselement (element)

Check if an object appears to be a valid element object.  `element' is an
element instance.  Return @code{True} if this is an element object.
@end deffn

@geindex iterparse() (in module xml.etree.ElementTree)
@anchor{library/xml etree elementtree xml etree ElementTree iterparse}@anchor{57a}
@deffn {Function} xml.etree.ElementTree.iterparse (source, events=None, parser=None)

Parses an XML section into an element tree incrementally, and reports what’s
going on to the user.  `source' is a filename or @ref{13cf,,file object}
containing XML data.  `events' is a sequence of events to report back.  The
supported events are the strings @code{"start"}, @code{"end"}, @code{"comment"},
@code{"pi"}, @code{"start-ns"} and @code{"end-ns"}
(the “ns” events are used to get detailed namespace
information).  If `events' is omitted, only @code{"end"} events are reported.
`parser' is an optional parser instance.  If not given, the standard
@ref{c4f,,XMLParser} parser is used.  `parser' must be a subclass of
@code{XMLParser} and can only use the default @ref{c50,,TreeBuilder} as a
target. Returns an @ref{4c9,,iterator} providing @code{(event, elem)} pairs;
it has a @code{root} attribute that references the root element of the
resulting XML tree once `source' is fully read.
The iterator has the @code{close()} method that closes the internal
file object if `source' is a filename.

Note that while @code{iterparse()} builds the tree incrementally, it issues
blocking reads on `source' (or the file it names).  As such, it’s unsuitable
for applications where blocking reads can’t be made.  For fully non-blocking
parsing, see @ref{11f9,,XMLPullParser}.

@cartouche
@quotation Note 
@code{iterparse()} only guarantees that it has seen the “>” character of a
starting tag when it emits a “start” event, so the attributes are defined,
but the contents of the text and tail attributes are undefined at that
point.  The same applies to the element children; they may or may not be
present.

If you need a fully populated element, look for “end” events instead.
@end quotation
@end cartouche


Deprecated since version 3.4: The `parser' argument.



Changed in version 3.8: The @code{comment} and @code{pi} events were added.



Changed in version 3.13: Added the @code{close()} method.

@end deffn

@geindex parse() (in module xml.etree.ElementTree)
@anchor{library/xml etree elementtree xml etree ElementTree parse}@anchor{3d90}
@deffn {Function} xml.etree.ElementTree.parse (source, parser=None)

Parses an XML section into an element tree.  `source' is a filename or file
object containing XML data.  `parser' is an optional parser instance.  If
not given, the standard @ref{c4f,,XMLParser} parser is used.  Returns an
@ref{b4d,,ElementTree} instance.
@end deffn

@geindex ProcessingInstruction() (in module xml.etree.ElementTree)
@anchor{library/xml etree elementtree xml etree ElementTree ProcessingInstruction}@anchor{3d91}
@deffn {Function} xml.etree.ElementTree.ProcessingInstruction (target, text=None)

PI element factory.  This factory function creates a special element that
will be serialized as an XML processing instruction.  `target' is a string
containing the PI target.  `text' is a string containing the PI contents, if
given.  Returns an element instance, representing a processing instruction.

Note that @ref{c4f,,XMLParser} skips over processing instructions
in the input instead of creating PI objects for them. An
@ref{b4d,,ElementTree} will only contain processing instruction nodes if
they have been inserted into to the tree using one of the
@ref{361,,Element} methods.
@end deffn

@geindex register_namespace() (in module xml.etree.ElementTree)
@anchor{library/xml etree elementtree xml etree ElementTree register_namespace}@anchor{13de}
@deffn {Function} xml.etree.ElementTree.register_namespace (prefix, uri)

Registers a namespace prefix.  The registry is global, and any existing
mapping for either the given prefix or the namespace URI will be removed.
`prefix' is a namespace prefix.  `uri' is a namespace uri.  Tags and
attributes in this namespace will be serialized with the given prefix, if at
all possible.


Added in version 3.2.

@end deffn

@geindex SubElement() (in module xml.etree.ElementTree)
@anchor{library/xml etree elementtree xml etree ElementTree SubElement}@anchor{3d83}
@deffn {Function} xml.etree.ElementTree.SubElement (parent, tag, attrib=@{@}, **extra)

Subelement factory.  This function creates an element instance, and appends
it to an existing element.

The element name, attribute names, and attribute values can be either
bytestrings or Unicode strings.  `parent' is the parent element.  `tag' is
the subelement name.  `attrib' is an optional dictionary, containing element
attributes.  `extra' contains additional attributes, given as keyword
arguments.  Returns an element instance.
@end deffn

@geindex tostring() (in module xml.etree.ElementTree)
@anchor{library/xml etree elementtree xml etree ElementTree tostring}@anchor{11fb}
@deffn {Function} xml.etree.ElementTree.tostring (element, encoding='us-ascii', method='xml', *, xml_declaration=None, default_namespace=None, short_empty_elements=True)

Generates a string representation of an XML element, including all
subelements.  `element' is an @ref{361,,Element} instance.  `encoding' @footnote{
The encoding string included in XML output should conform to the
appropriate standards.  For example, “UTF-8” is valid, but “UTF8” is
not.  See @indicateurl{https://www.w3.org/TR/2006/REC-xml11-20060816/#NT-EncodingDecl}
and @indicateurl{https://www.iana.org/assignments/character-sets/character-sets.xhtml}.
} is
the output encoding (default is US-ASCII).  Use @code{encoding="unicode"} to
generate a Unicode string (otherwise, a bytestring is generated).  `method'
is either @code{"xml"}, @code{"html"} or @code{"text"} (default is @code{"xml"}).
`xml_declaration', `default_namespace' and `short_empty_elements' has the same
meaning as in @ref{c92,,ElementTree.write()}. Returns an (optionally) encoded string
containing the XML data.


Changed in version 3.4: Added the `short_empty_elements' parameter.



Changed in version 3.8: Added the `xml_declaration' and `default_namespace' parameters.



Changed in version 3.8: The @code{tostring()} function now preserves the attribute order
specified by the user.

@end deffn

@geindex tostringlist() (in module xml.etree.ElementTree)
@anchor{library/xml etree elementtree xml etree ElementTree tostringlist}@anchor{11fc}
@deffn {Function} xml.etree.ElementTree.tostringlist (element, encoding='us-ascii', method='xml', *, xml_declaration=None, default_namespace=None, short_empty_elements=True)

Generates a string representation of an XML element, including all
subelements.  `element' is an @ref{361,,Element} instance.  `encoding' @footnote{
The encoding string included in XML output should conform to the
appropriate standards.  For example, “UTF-8” is valid, but “UTF8” is
not.  See @indicateurl{https://www.w3.org/TR/2006/REC-xml11-20060816/#NT-EncodingDecl}
and @indicateurl{https://www.iana.org/assignments/character-sets/character-sets.xhtml}.
} is
the output encoding (default is US-ASCII).  Use @code{encoding="unicode"} to
generate a Unicode string (otherwise, a bytestring is generated).  `method'
is either @code{"xml"}, @code{"html"} or @code{"text"} (default is @code{"xml"}).
`xml_declaration', `default_namespace' and `short_empty_elements' has the same
meaning as in @ref{c92,,ElementTree.write()}. Returns a list of (optionally) encoded
strings containing the XML data. It does not guarantee any specific sequence,
except that @code{b"".join(tostringlist(element)) == tostring(element)}.


Added in version 3.2.



Changed in version 3.4: Added the `short_empty_elements' parameter.



Changed in version 3.8: Added the `xml_declaration' and `default_namespace' parameters.



Changed in version 3.8: The @code{tostringlist()} function now preserves the attribute order
specified by the user.

@end deffn

@geindex XML() (in module xml.etree.ElementTree)
@anchor{library/xml etree elementtree xml etree ElementTree XML}@anchor{3d8d}
@deffn {Function} xml.etree.ElementTree.XML (text, parser=None)

Parses an XML section from a string constant.  This function can be used to
embed “XML literals” in Python code.  `text' is a string containing XML
data.  `parser' is an optional parser instance.  If not given, the standard
@ref{c4f,,XMLParser} parser is used.  Returns an @ref{361,,Element} instance.
@end deffn

@geindex XMLID() (in module xml.etree.ElementTree)
@anchor{library/xml etree elementtree xml etree ElementTree XMLID}@anchor{3d92}
@deffn {Function} xml.etree.ElementTree.XMLID (text, parser=None)

Parses an XML section from a string constant, and also returns a dictionary
which maps from element id:s to elements.  `text' is a string containing XML
data.  `parser' is an optional parser instance.  If not given, the standard
@ref{c4f,,XMLParser} parser is used.  Returns a tuple containing an
@ref{361,,Element} instance and a dictionary.
@end deffn

@node XInclude support,Reference<6>,Reference<5>,xml etree ElementTree — The ElementTree XML API
@anchor{library/xml etree elementtree elementtree-xinclude}@anchor{3d93}@anchor{library/xml etree elementtree xinclude-support}@anchor{3d94}
@subsubsection XInclude support


This module provides limited support for
XInclude directives@footnote{https://www.w3.org/TR/xinclude/}, via the @ref{12b,,xml.etree.ElementInclude} helper module.  This module can be used to insert subtrees and text strings into element trees, based on information in the tree.

@menu
* Example: Example<9>. 

@end menu

@node Example<9>,,,XInclude support
@anchor{library/xml etree elementtree id3}@anchor{3d95}
@subsubsection Example


Here’s an example that demonstrates use of the XInclude module. To include an XML document in the current document, use the @code{@{http://www.w3.org/2001/XInclude@}include} element and set the `parse' attribute to @code{"xml"}, and use the `href' attribute to specify the document to include.

@example
<?xml version="1.0"?>
<document xmlns:xi="http://www.w3.org/2001/XInclude">
  <xi:include href="source.xml" parse="xml" />
</document>
@end example

By default, the `href' attribute is treated as a file name. You can use custom loaders to override this behaviour. Also note that the standard helper does not support XPointer syntax.

To process this file, load it as usual, and pass the root element to the @code{xml.etree.ElementTree} module:

@example
from xml.etree import ElementTree, ElementInclude

tree = ElementTree.parse("document.xml")
root = tree.getroot()

ElementInclude.include(root)
@end example

The ElementInclude module replaces the @code{@{http://www.w3.org/2001/XInclude@}include} element with the root element from the `source.xml' document. The result might look something like this:

@example
<document xmlns:xi="http://www.w3.org/2001/XInclude">
  <para>This is a paragraph.</para>
</document>
@end example

If the `parse' attribute is omitted, it defaults to “xml”. The href attribute is required.

To include a text document, use the @code{@{http://www.w3.org/2001/XInclude@}include} element, and set the `parse' attribute to “text”:

@example
<?xml version="1.0"?>
<document xmlns:xi="http://www.w3.org/2001/XInclude">
  Copyright (c) <xi:include href="year.txt" parse="text" />.
</document>
@end example

The result might look something like:

@example
<document xmlns:xi="http://www.w3.org/2001/XInclude">
  Copyright (c) 2003.
</document>
@end example

@node Reference<6>,,XInclude support,xml etree ElementTree — The ElementTree XML API
@anchor{library/xml etree elementtree id4}@anchor{3d96}
@subsubsection Reference


@menu
* Functions: Functions<10>. 
* Element Objects:: 
* ElementTree Objects:: 
* QName Objects:: 
* TreeBuilder Objects:: 
* XMLParser Objects:: 
* XMLPullParser Objects:: 
* Exceptions: Exceptions<22>. 

@end menu

@node Functions<10>,Element Objects,,Reference<6>
@anchor{library/xml etree elementtree elementinclude-functions}@anchor{3d97}@anchor{library/xml etree elementtree id5}@anchor{3d98}
@subsubsection Functions


@geindex module; xml.etree.ElementInclude

@geindex default_loader() (in module xml.etree.ElementInclude)
@anchor{library/xml etree elementtree module-xml etree ElementInclude}@anchor{12b}@anchor{library/xml etree elementtree xml etree ElementInclude default_loader}@anchor{3d99}
@deffn {Function} xml.etree.ElementInclude.default_loader (href, parse, encoding=None)

Default loader. This default loader reads an included resource from disk.
`href' is a URL.  `parse' is for parse mode either “xml” or “text”.
`encoding' is an optional text encoding.  If not given, encoding is @code{utf-8}.
Returns the expanded resource.
If the parse mode is @code{"xml"}, this is an @ref{361,,Element} instance.
If the parse mode is @code{"text"}, this is a string.
If the loader fails, it can return @code{None} or raise an exception.
@end deffn

@geindex include() (in module xml.etree.ElementInclude)
@anchor{library/xml etree elementtree xml etree ElementInclude include}@anchor{3d9a}
@deffn {Function} xml.etree.ElementInclude.include (elem, loader=None, base_url=None, max_depth=6)

This function expands XInclude directives in-place in tree pointed by `elem'.
`elem' is either the root @ref{361,,Element} or an
@ref{b4d,,ElementTree} instance to find such element.
`loader' is an optional resource loader.  If omitted, it defaults to @ref{3d99,,default_loader()}.
If given, it should be a callable that implements the same interface as
@code{default_loader()}.  `base_url' is base URL of the original file, to resolve
relative include file references.  `max_depth' is the maximum number of recursive
inclusions.  Limited to reduce the risk of malicious content explosion.
Pass @code{None} to disable the limitation.


Changed in version 3.9: Added the `base_url' and `max_depth' parameters.

@end deffn

@node Element Objects,ElementTree Objects,Functions<10>,Reference<6>
@anchor{library/xml etree elementtree element-objects}@anchor{3d9b}@anchor{library/xml etree elementtree elementtree-element-objects}@anchor{3d9c}
@subsubsection Element Objects


@geindex Element (class in xml.etree.ElementTree)
@anchor{library/xml etree elementtree xml etree ElementTree Element}@anchor{361}
@deffn {Class} xml.etree.ElementTree.Element (tag, attrib=@{@}, **extra)

Element class.  This class defines the Element interface, and provides a
reference implementation of this interface.

The element name, attribute names, and attribute values can be either
bytestrings or Unicode strings.  `tag' is the element name.  `attrib' is
an optional dictionary, containing element attributes.  `extra' contains
additional attributes, given as keyword arguments.

@geindex tag (xml.etree.ElementTree.Element attribute)
@anchor{library/xml etree elementtree xml etree ElementTree Element tag}@anchor{1559}
@deffn {Attribute} tag

A string identifying what kind of data this element represents (the
element type, in other words).
@end deffn

@geindex text (xml.etree.ElementTree.Element attribute)
@geindex tail (xml.etree.ElementTree.Element attribute)
@anchor{library/xml etree elementtree xml etree ElementTree Element text}@anchor{3d7d}
@deffn {Attribute} text
@anchor{library/xml etree elementtree xml etree ElementTree Element tail}@anchor{3d9d}
@deffnx {Attribute} tail

These attributes can be used to hold additional data associated with
the element.  Their values are usually strings but may be any
application-specific object.  If the element is created from
an XML file, the `text' attribute holds either the text between
the element’s start tag and its first child or end tag, or @code{None}, and
the `tail' attribute holds either the text between the element’s
end tag and the next tag, or @code{None}.  For the XML data

@example
<a><b>1<c>2<d/>3</c></b>4</a>
@end example

the `a' element has @code{None} for both `text' and `tail' attributes,
the `b' element has `text' @code{"1"} and `tail' @code{"4"},
the `c' element has `text' @code{"2"} and `tail' @code{None},
and the `d' element has `text' @code{None} and `tail' @code{"3"}.

To collect the inner text of an element, see @ref{13e1,,itertext()}, for
example @code{"".join(element.itertext())}.

Applications may store arbitrary objects in these attributes.
@end deffn

@geindex attrib (xml.etree.ElementTree.Element attribute)
@anchor{library/xml etree elementtree xml etree ElementTree Element attrib}@anchor{3d9e}
@deffn {Attribute} attrib

A dictionary containing the element’s attributes.  Note that while the
`attrib' value is always a real mutable Python dictionary, an ElementTree
implementation may choose to use another internal representation, and
create the dictionary only if someone asks for it.  To take advantage of
such implementations, use the dictionary methods below whenever possible.
@end deffn

The following dictionary-like methods work on the element attributes.

@geindex clear() (xml.etree.ElementTree.Element method)
@anchor{library/xml etree elementtree xml etree ElementTree Element clear}@anchor{3d9f}
@deffn {Method} clear ()

Resets an element.  This function removes all subelements, clears all
attributes, and sets the text and tail attributes to @code{None}.
@end deffn

@geindex get() (xml.etree.ElementTree.Element method)
@anchor{library/xml etree elementtree xml etree ElementTree Element get}@anchor{3d7e}
@deffn {Method} get (key, default=None)

Gets the element attribute named `key'.

Returns the attribute value, or `default' if the attribute was not found.
@end deffn

@geindex items() (xml.etree.ElementTree.Element method)
@anchor{library/xml etree elementtree xml etree ElementTree Element items}@anchor{3da0}
@deffn {Method} items ()

Returns the element attributes as a sequence of (name, value) pairs.  The
attributes are returned in an arbitrary order.
@end deffn

@geindex keys() (xml.etree.ElementTree.Element method)
@anchor{library/xml etree elementtree xml etree ElementTree Element keys}@anchor{3da1}
@deffn {Method} keys ()

Returns the elements attribute names as a list.  The names are returned
in an arbitrary order.
@end deffn

@geindex set() (xml.etree.ElementTree.Element method)
@anchor{library/xml etree elementtree xml etree ElementTree Element set}@anchor{3d80}
@deffn {Method} set (key, value)

Set the attribute `key' on the element to `value'.
@end deffn

The following methods work on the element’s children (subelements).

@geindex append() (xml.etree.ElementTree.Element method)
@anchor{library/xml etree elementtree xml etree ElementTree Element append}@anchor{3d81}
@deffn {Method} append (subelement)

Adds the element `subelement' to the end of this element’s internal list
of subelements.  Raises @ref{199,,TypeError} if `subelement' is not an
@code{Element}.
@end deffn

@geindex extend() (xml.etree.ElementTree.Element method)
@anchor{library/xml etree elementtree xml etree ElementTree Element extend}@anchor{13df}
@deffn {Method} extend (subelements)

Appends `subelements' from an iterable of elements.
Raises @ref{199,,TypeError} if a subelement is not an @code{Element}.


Added in version 3.2.

@end deffn

@geindex find() (xml.etree.ElementTree.Element method)
@anchor{library/xml etree elementtree xml etree ElementTree Element find}@anchor{18c3}
@deffn {Method} find (match, namespaces=None)

Finds the first subelement matching `match'.  `match' may be a tag name
or a @ref{dac,,path}.  Returns an element instance
or @code{None}.  `namespaces' is an optional mapping from namespace prefix
to full name.  Pass @code{'@w{'}} as prefix to move all unprefixed tag names
in the expression into the given namespace.
@end deffn

@geindex findall() (xml.etree.ElementTree.Element method)
@anchor{library/xml etree elementtree xml etree ElementTree Element findall}@anchor{18c4}
@deffn {Method} findall (match, namespaces=None)

Finds all matching subelements, by tag name or
@ref{dac,,path}.  Returns a list containing all matching
elements in document order.  `namespaces' is an optional mapping from
namespace prefix to full name.  Pass @code{'@w{'}} as prefix to move all
unprefixed tag names in the expression into the given namespace.
@end deffn

@geindex findtext() (xml.etree.ElementTree.Element method)
@anchor{library/xml etree elementtree xml etree ElementTree Element findtext}@anchor{1799}
@deffn {Method} findtext (match, default=None, namespaces=None)

Finds text for the first subelement matching `match'.  `match' may be
a tag name or a @ref{dac,,path}.  Returns the text content
of the first matching element, or `default' if no element was found.
Note that if the matching element has no text content an empty string
is returned. `namespaces' is an optional mapping from namespace prefix
to full name.  Pass @code{'@w{'}} as prefix to move all unprefixed tag names
in the expression into the given namespace.
@end deffn

@geindex insert() (xml.etree.ElementTree.Element method)
@anchor{library/xml etree elementtree xml etree ElementTree Element insert}@anchor{3da2}
@deffn {Method} insert (index, subelement)

Inserts `subelement' at the given position in this element.  Raises
@ref{199,,TypeError} if `subelement' is not an @code{Element}.
@end deffn

@geindex iter() (xml.etree.ElementTree.Element method)
@anchor{library/xml etree elementtree xml etree ElementTree Element iter}@anchor{155a}
@deffn {Method} iter (tag=None)

Creates a tree @ref{4c9,,iterator} with the current element as the root.
The iterator iterates over this element and all elements below it, in
document (depth first) order.  If `tag' is not @code{None} or @code{'*'}, only
elements whose tag equals `tag' are returned from the iterator.  If the
tree structure is modified during iteration, the result is undefined.


Added in version 3.2.

@end deffn

@geindex iterfind() (xml.etree.ElementTree.Element method)
@anchor{library/xml etree elementtree xml etree ElementTree Element iterfind}@anchor{13e0}
@deffn {Method} iterfind (match, namespaces=None)

Finds all matching subelements, by tag name or
@ref{dac,,path}.  Returns an iterable yielding all
matching elements in document order. `namespaces' is an optional mapping
from namespace prefix to full name.


Added in version 3.2.

@end deffn

@geindex itertext() (xml.etree.ElementTree.Element method)
@anchor{library/xml etree elementtree xml etree ElementTree Element itertext}@anchor{13e1}
@deffn {Method} itertext ()

Creates a text iterator.  The iterator loops over this element and all
subelements, in document order, and returns all inner text.


Added in version 3.2.

@end deffn

@geindex makeelement() (xml.etree.ElementTree.Element method)
@anchor{library/xml etree elementtree xml etree ElementTree Element makeelement}@anchor{3da3}
@deffn {Method} makeelement (tag, attrib)

Creates a new element object of the same type as this element.  Do not
call this method, use the @ref{3d83,,SubElement()} factory function instead.
@end deffn

@geindex remove() (xml.etree.ElementTree.Element method)
@anchor{library/xml etree elementtree xml etree ElementTree Element remove}@anchor{18bf}
@deffn {Method} remove (subelement)

Removes `subelement' from the element.  Unlike the find* methods this
method compares elements based on the instance identity, not on tag value
or contents.
@end deffn

@code{Element} objects also support the following sequence type methods
for working with subelements: @ref{14d8,,__delitem__()},
@ref{588,,__getitem__()}, @ref{14d7,,__setitem__()},
@ref{17e1,,__len__()}.

Caution: Elements with no subelements will test as @code{False}.  In a future
release of Python, all elements will test as @code{True} regardless of whether
subelements exist.  Instead, prefer explicit @code{len(elem)} or
@code{elem is not None} tests.:

@example
element = root.find('foo')

if not element:  # careful!
    print("element not found, or element has no subelements")

if element is None:
    print("element not found")
@end example


Changed in version 3.12: Testing the truth value of an Element emits @ref{1a4,,DeprecationWarning}.


Prior to Python 3.8, the serialisation order of the XML attributes of
elements was artificially made predictable by sorting the attributes by
their name. Based on the now guaranteed ordering of dicts, this arbitrary
reordering was removed in Python 3.8 to preserve the order in which
attributes were originally parsed or created by user code.

In general, user code should try not to depend on a specific ordering of
attributes, given that the XML Information Set@footnote{https://www.w3.org/TR/xml-infoset/} explicitly excludes the attribute
order from conveying information. Code should be prepared to deal with
any ordering on input. In cases where deterministic XML output is required,
e.g. for cryptographic signing or test data sets, canonical serialisation
is available with the @ref{c4e,,canonicalize()} function.

In cases where canonical output is not applicable but a specific attribute
order is still desirable on output, code should aim for creating the
attributes directly in the desired order, to avoid perceptual mismatches
for readers of the code. In cases where this is difficult to achieve, a
recipe like the following can be applied prior to serialisation to enforce
an order independently from the Element creation:

@example
def reorder_attributes(root):
    for el in root.iter():
        attrib = el.attrib
        if len(attrib) > 1:
            # adjust attribute order, e.g. by sorting
            attribs = sorted(attrib.items())
            attrib.clear()
            attrib.update(attribs)
@end example
@end deffn

@node ElementTree Objects,QName Objects,Element Objects,Reference<6>
@anchor{library/xml etree elementtree elementtree-elementtree-objects}@anchor{3da4}@anchor{library/xml etree elementtree elementtree-objects}@anchor{3da5}
@subsubsection ElementTree Objects


@geindex ElementTree (class in xml.etree.ElementTree)
@anchor{library/xml etree elementtree xml etree ElementTree ElementTree}@anchor{b4d}
@deffn {Class} xml.etree.ElementTree.ElementTree (element=None, file=None)

ElementTree wrapper class.  This class represents an entire element
hierarchy, and adds some extra support for serialization to and from
standard XML.

`element' is the root element.  The tree is initialized with the contents
of the XML `file' if given.

@geindex _setroot() (xml.etree.ElementTree.ElementTree method)
@anchor{library/xml etree elementtree xml etree ElementTree ElementTree _setroot}@anchor{3da6}
@deffn {Method} _setroot (element)

Replaces the root element for this tree.  This discards the current
contents of the tree, and replaces it with the given element.  Use with
care.  `element' is an element instance.
@end deffn

@geindex find() (xml.etree.ElementTree.ElementTree method)
@anchor{library/xml etree elementtree xml etree ElementTree ElementTree find}@anchor{3da7}
@deffn {Method} find (match, namespaces=None)

Same as @ref{18c3,,Element.find()}, starting at the root of the tree.
@end deffn

@geindex findall() (xml.etree.ElementTree.ElementTree method)
@anchor{library/xml etree elementtree xml etree ElementTree ElementTree findall}@anchor{3da8}
@deffn {Method} findall (match, namespaces=None)

Same as @ref{18c4,,Element.findall()}, starting at the root of the tree.
@end deffn

@geindex findtext() (xml.etree.ElementTree.ElementTree method)
@anchor{library/xml etree elementtree xml etree ElementTree ElementTree findtext}@anchor{3da9}
@deffn {Method} findtext (match, default=None, namespaces=None)

Same as @ref{1799,,Element.findtext()}, starting at the root of the tree.
@end deffn

@geindex getroot() (xml.etree.ElementTree.ElementTree method)
@anchor{library/xml etree elementtree xml etree ElementTree ElementTree getroot}@anchor{3daa}
@deffn {Method} getroot ()

Returns the root element for this tree.
@end deffn

@geindex iter() (xml.etree.ElementTree.ElementTree method)
@anchor{library/xml etree elementtree xml etree ElementTree ElementTree iter}@anchor{3dab}
@deffn {Method} iter (tag=None)

Creates and returns a tree iterator for the root element.  The iterator
loops over all elements in this tree, in section order.  `tag' is the tag
to look for (default is to return all elements).
@end deffn

@geindex iterfind() (xml.etree.ElementTree.ElementTree method)
@anchor{library/xml etree elementtree xml etree ElementTree ElementTree iterfind}@anchor{3dac}
@deffn {Method} iterfind (match, namespaces=None)

Same as @ref{13e0,,Element.iterfind()}, starting at the root of the tree.


Added in version 3.2.

@end deffn

@geindex parse() (xml.etree.ElementTree.ElementTree method)
@anchor{library/xml etree elementtree xml etree ElementTree ElementTree parse}@anchor{3dad}
@deffn {Method} parse (source, parser=None)

Loads an external XML section into this element tree.  `source' is a file
name or @ref{13cf,,file object}.  `parser' is an optional parser instance.
If not given, the standard @ref{c4f,,XMLParser} parser is used.  Returns the
section root element.
@end deffn

@geindex write() (xml.etree.ElementTree.ElementTree method)
@anchor{library/xml etree elementtree xml etree ElementTree ElementTree write}@anchor{c92}
@deffn {Method} write (file, encoding='us-ascii', xml_declaration=None, default_namespace=None, method='xml', *, short_empty_elements=True)

Writes the element tree to a file, as XML.  `file' is a file name, or a
@ref{13cf,,file object} opened for writing.  `encoding' @footnote{
The encoding string included in XML output should conform to the
appropriate standards.  For example, “UTF-8” is valid, but “UTF8” is
not.  See @indicateurl{https://www.w3.org/TR/2006/REC-xml11-20060816/#NT-EncodingDecl}
and @indicateurl{https://www.iana.org/assignments/character-sets/character-sets.xhtml}.
} is the output
encoding (default is US-ASCII).
`xml_declaration' controls if an XML declaration should be added to the
file.  Use @code{False} for never, @code{True} for always, @code{None}
for only if not US-ASCII or UTF-8 or Unicode (default is @code{None}).
`default_namespace' sets the default XML namespace (for “xmlns”).
`method' is either @code{"xml"}, @code{"html"} or @code{"text"} (default is
@code{"xml"}).
The keyword-only `short_empty_elements' parameter controls the formatting
of elements that contain no content.  If @code{True} (the default), they are
emitted as a single self-closed tag, otherwise they are emitted as a pair
of start/end tags.

The output is either a string (@ref{16a,,str}) or binary (@ref{193,,bytes}).
This is controlled by the `encoding' argument.  If `encoding' is
@code{"unicode"}, the output is a string; otherwise, it’s binary.  Note that
this may conflict with the type of `file' if it’s an open
@ref{13cf,,file object}; make sure you do not try to write a string to a
binary stream and vice versa.


Changed in version 3.4: Added the `short_empty_elements' parameter.



Changed in version 3.8: The @code{write()} method now preserves the attribute order specified
by the user.

@end deffn
@end deffn

This is the XML file that is going to be manipulated:

@example
<html>
    <head>
        <title>Example page</title>
    </head>
    <body>
        <p>Moved to <a href="http://example.org/">example.org</a>
        or <a href="http://example.com/">example.com</a>.</p>
    </body>
</html>
@end example

Example of changing the attribute “target” of every link in first paragraph:

@example
>>> from xml.etree.ElementTree import ElementTree
>>> tree = ElementTree()
>>> tree.parse("index.xhtml")
<Element 'html' at 0xb77e6fac>
>>> p = tree.find("body/p")     # Finds first occurrence of tag p in body
>>> p
<Element 'p' at 0xb77ec26c>
>>> links = list(p.iter("a"))   # Returns list of all links
>>> links
[<Element 'a' at 0xb77ec2ac>, <Element 'a' at 0xb77ec1cc>]
>>> for i in links:             # Iterates through all found links
...     i.attrib["target"] = "blank"
...
>>> tree.write("output.xhtml")
@end example

@node QName Objects,TreeBuilder Objects,ElementTree Objects,Reference<6>
@anchor{library/xml etree elementtree elementtree-qname-objects}@anchor{3dae}@anchor{library/xml etree elementtree qname-objects}@anchor{3daf}
@subsubsection QName Objects


@geindex QName (class in xml.etree.ElementTree)
@anchor{library/xml etree elementtree xml etree ElementTree QName}@anchor{3db0}
@deffn {Class} xml.etree.ElementTree.QName (text_or_uri, tag=None)

QName wrapper.  This can be used to wrap a QName attribute value, in order
to get proper namespace handling on output.  `text_or_uri' is a string
containing the QName value, in the form @{uri@}local, or, if the tag argument
is given, the URI part of a QName.  If `tag' is given, the first argument is
interpreted as a URI, and this argument is interpreted as a local name.
@code{QName} instances are opaque.
@end deffn

@node TreeBuilder Objects,XMLParser Objects,QName Objects,Reference<6>
@anchor{library/xml etree elementtree elementtree-treebuilder-objects}@anchor{3db1}@anchor{library/xml etree elementtree treebuilder-objects}@anchor{3db2}
@subsubsection TreeBuilder Objects


@geindex TreeBuilder (class in xml.etree.ElementTree)
@anchor{library/xml etree elementtree xml etree ElementTree TreeBuilder}@anchor{c50}
@deffn {Class} xml.etree.ElementTree.TreeBuilder (element_factory=None, *, comment_factory=None, pi_factory=None, insert_comments=False, insert_pis=False)

Generic element structure builder.  This builder converts a sequence of
start, data, end, comment and pi method calls to a well-formed element
structure.  You can use this class to build an element structure using
a custom XML parser, or a parser for some other XML-like format.

`element_factory', when given, must be a callable accepting two positional
arguments: a tag and a dict of attributes.  It is expected to return a new
element instance.

The `comment_factory' and `pi_factory' functions, when given, should behave
like the @ref{3d8b,,Comment()} and @ref{3d91,,ProcessingInstruction()} functions to
create comments and processing instructions.  When not given, the default
factories will be used.  When `insert_comments' and/or `insert_pis' is true,
comments/pis will be inserted into the tree if they appear within the root
element (but not outside of it).

@geindex close() (xml.etree.ElementTree.TreeBuilder method)
@anchor{library/xml etree elementtree xml etree ElementTree TreeBuilder close}@anchor{3db3}
@deffn {Method} close ()

Flushes the builder buffers, and returns the toplevel document
element.  Returns an @ref{361,,Element} instance.
@end deffn

@geindex data() (xml.etree.ElementTree.TreeBuilder method)
@anchor{library/xml etree elementtree xml etree ElementTree TreeBuilder data}@anchor{3db4}
@deffn {Method} data (data)

Adds text to the current element.  `data' is a string.  This should be
either a bytestring, or a Unicode string.
@end deffn

@geindex end() (xml.etree.ElementTree.TreeBuilder method)
@anchor{library/xml etree elementtree xml etree ElementTree TreeBuilder end}@anchor{13e2}
@deffn {Method} end (tag)

Closes the current element.  `tag' is the element name.  Returns the
closed element.
@end deffn

@geindex start() (xml.etree.ElementTree.TreeBuilder method)
@anchor{library/xml etree elementtree xml etree ElementTree TreeBuilder start}@anchor{1db0}
@deffn {Method} start (tag, attrs)

Opens a new element.  `tag' is the element name.  `attrs' is a dictionary
containing element attributes.  Returns the opened element.
@end deffn

@geindex comment() (xml.etree.ElementTree.TreeBuilder method)
@anchor{library/xml etree elementtree xml etree ElementTree TreeBuilder comment}@anchor{3db5}
@deffn {Method} comment (text)

Creates a comment with the given `text'.  If @code{insert_comments} is true,
this will also add it to the tree.


Added in version 3.8.

@end deffn

@geindex pi() (xml.etree.ElementTree.TreeBuilder method)
@anchor{library/xml etree elementtree xml etree ElementTree TreeBuilder pi}@anchor{3db6}
@deffn {Method} pi (target, text)

Creates a process instruction with the given `target' name and `text'.
If @code{insert_pis} is true, this will also add it to the tree.


Added in version 3.8.

@end deffn

In addition, a custom @code{TreeBuilder} object can provide the
following methods:

@geindex doctype() (xml.etree.ElementTree.TreeBuilder method)
@anchor{library/xml etree elementtree xml etree ElementTree TreeBuilder doctype}@anchor{c94}
@deffn {Method} doctype (name, pubid, system)

Handles a doctype declaration.  `name' is the doctype name.  `pubid' is
the public identifier.  `system' is the system identifier.  This method
does not exist on the default @code{TreeBuilder} class.


Added in version 3.2.

@end deffn

@geindex start_ns() (xml.etree.ElementTree.TreeBuilder method)
@anchor{library/xml etree elementtree xml etree ElementTree TreeBuilder start_ns}@anchor{3db7}
@deffn {Method} start_ns (prefix, uri)

Is called whenever the parser encounters a new namespace declaration,
before the @code{start()} callback for the opening element that defines it.
`prefix' is @code{'@w{'}} for the default namespace and the declared
namespace prefix name otherwise.  `uri' is the namespace URI.


Added in version 3.8.

@end deffn

@geindex end_ns() (xml.etree.ElementTree.TreeBuilder method)
@anchor{library/xml etree elementtree xml etree ElementTree TreeBuilder end_ns}@anchor{3db8}
@deffn {Method} end_ns (prefix)

Is called after the @code{end()} callback of an element that declared
a namespace prefix mapping, with the name of the `prefix' that went
out of scope.


Added in version 3.8.

@end deffn
@end deffn

@geindex C14NWriterTarget (class in xml.etree.ElementTree)
@anchor{library/xml etree elementtree xml etree ElementTree C14NWriterTarget}@anchor{3db9}
@deffn {Class} xml.etree.ElementTree.C14NWriterTarget (write, *, with_comments=False, strip_text=False, rewrite_prefixes=False, qname_aware_tags=None, qname_aware_attrs=None, exclude_attrs=None, exclude_tags=None)

A C14N 2.0@footnote{https://www.w3.org/TR/xml-c14n2/} writer.  Arguments are the
same as for the @ref{c4e,,canonicalize()} function.  This class does not build a
tree but translates the callback events directly into a serialised form
using the `write' function.


Added in version 3.8.

@end deffn

@node XMLParser Objects,XMLPullParser Objects,TreeBuilder Objects,Reference<6>
@anchor{library/xml etree elementtree elementtree-xmlparser-objects}@anchor{3dba}@anchor{library/xml etree elementtree xmlparser-objects}@anchor{3dbb}
@subsubsection XMLParser Objects


@geindex XMLParser (class in xml.etree.ElementTree)
@anchor{library/xml etree elementtree xml etree ElementTree XMLParser}@anchor{c4f}
@deffn {Class} xml.etree.ElementTree.XMLParser (*, target=None, encoding=None)

This class is the low-level building block of the module.  It uses
@ref{12d,,xml.parsers.expat} for efficient, event-based parsing of XML.  It can
be fed XML data incrementally with the @ref{3dbc,,feed()} method, and parsing
events are translated to a push API - by invoking callbacks on the `target'
object.  If `target' is omitted, the standard @ref{c50,,TreeBuilder} is used.
If `encoding' @footnote{
The encoding string included in XML output should conform to the
appropriate standards.  For example, “UTF-8” is valid, but “UTF8” is
not.  See @indicateurl{https://www.w3.org/TR/2006/REC-xml11-20060816/#NT-EncodingDecl}
and @indicateurl{https://www.iana.org/assignments/character-sets/character-sets.xhtml}.
} is given, the value overrides the
encoding specified in the XML file.


Changed in version 3.8: Parameters are now @ref{5a5,,keyword-only}.
The `html' argument is no longer supported.


@geindex close() (xml.etree.ElementTree.XMLParser method)
@anchor{library/xml etree elementtree xml etree ElementTree XMLParser close}@anchor{3dbd}
@deffn {Method} close ()

Finishes feeding data to the parser.  Returns the result of calling the
@code{close()} method of the `target' passed during construction; by default,
this is the toplevel document element.
@end deffn

@geindex feed() (xml.etree.ElementTree.XMLParser method)
@anchor{library/xml etree elementtree xml etree ElementTree XMLParser feed}@anchor{3dbc}
@deffn {Method} feed (data)

Feeds data to the parser.  `data' is encoded data.
@end deffn

@geindex flush() (xml.etree.ElementTree.XMLParser method)
@anchor{library/xml etree elementtree xml etree ElementTree XMLParser flush}@anchor{576}
@deffn {Method} flush ()

Triggers parsing of any previously fed unparsed data, which can be
used to ensure more immediate feedback, in particular with Expat >=2.6.0.
The implementation of @code{flush()} temporarily disables reparse deferral
with Expat (if currently enabled) and triggers a reparse.
Disabling reparse deferral has security consequences; please see
@ref{579,,xml.parsers.expat.xmlparser.SetReparseDeferralEnabled()} for details.

Note that @code{flush()} has been backported to some prior releases of
CPython as a security fix.  Check for availability of @code{flush()}
using @ref{6fa,,hasattr()} if used in code running across a variety of Python
versions.


Added in version 3.13.

@end deffn

@ref{3dbc,,XMLParser.feed()} calls `target''s @code{start(tag, attrs_dict)} method
for each opening tag, its @code{end(tag)} method for each closing tag, and data
is processed by method @code{data(data)}.  For further supported callback
methods, see the @ref{c50,,TreeBuilder} class.  @ref{3dbd,,XMLParser.close()} calls
`target''s method @code{close()}. @code{XMLParser} can be used not only for
building a tree structure. This is an example of counting the maximum depth
of an XML file:

@example
>>> from xml.etree.ElementTree import XMLParser
>>> class MaxDepth:                     # The target object of the parser
...     maxDepth = 0
...     depth = 0
...     def start(self, tag, attrib):   # Called for each opening tag.
...         self.depth += 1
...         if self.depth > self.maxDepth:
...             self.maxDepth = self.depth
...     def end(self, tag):             # Called for each closing tag.
...         self.depth -= 1
...     def data(self, data):
...         pass            # We do not need to do anything with data.
...     def close(self):    # Called when all data has been parsed.
...         return self.maxDepth
...
>>> target = MaxDepth()
>>> parser = XMLParser(target=target)
>>> exampleXml = """
... <a>
...   <b>
...   </b>
...   <b>
...     <c>
...       <d>
...       </d>
...     </c>
...   </b>
... </a>"""
>>> parser.feed(exampleXml)
>>> parser.close()
4
@end example
@end deffn

@node XMLPullParser Objects,Exceptions<22>,XMLParser Objects,Reference<6>
@anchor{library/xml etree elementtree elementtree-xmlpullparser-objects}@anchor{3dbe}@anchor{library/xml etree elementtree xmlpullparser-objects}@anchor{3dbf}
@subsubsection XMLPullParser Objects


@geindex XMLPullParser (class in xml.etree.ElementTree)
@anchor{library/xml etree elementtree xml etree ElementTree XMLPullParser}@anchor{11f9}
@deffn {Class} xml.etree.ElementTree.XMLPullParser (events=None)

A pull parser suitable for non-blocking applications.  Its input-side API is
similar to that of @ref{c4f,,XMLParser}, but instead of pushing calls to a
callback target, @code{XMLPullParser} collects an internal list of parsing
events and lets the user read from it. `events' is a sequence of events to
report back.  The supported events are the strings @code{"start"}, @code{"end"},
@code{"comment"}, @code{"pi"}, @code{"start-ns"} and @code{"end-ns"} (the “ns” events
are used to get detailed namespace information).  If `events' is omitted,
only @code{"end"} events are reported.

@geindex feed() (xml.etree.ElementTree.XMLPullParser method)
@anchor{library/xml etree elementtree xml etree ElementTree XMLPullParser feed}@anchor{3d7a}
@deffn {Method} feed (data)

Feed the given bytes data to the parser.
@end deffn

@geindex flush() (xml.etree.ElementTree.XMLPullParser method)
@anchor{library/xml etree elementtree xml etree ElementTree XMLPullParser flush}@anchor{577}
@deffn {Method} flush ()

Triggers parsing of any previously fed unparsed data, which can be
used to ensure more immediate feedback, in particular with Expat >=2.6.0.
The implementation of @code{flush()} temporarily disables reparse deferral
with Expat (if currently enabled) and triggers a reparse.
Disabling reparse deferral has security consequences; please see
@ref{579,,xml.parsers.expat.xmlparser.SetReparseDeferralEnabled()} for details.

Note that @code{flush()} has been backported to some prior releases of
CPython as a security fix.  Check for availability of @code{flush()}
using @ref{6fa,,hasattr()} if used in code running across a variety of Python
versions.


Added in version 3.13.

@end deffn

@geindex close() (xml.etree.ElementTree.XMLPullParser method)
@anchor{library/xml etree elementtree xml etree ElementTree XMLPullParser close}@anchor{3dc0}
@deffn {Method} close ()

Signal the parser that the data stream is terminated. Unlike
@ref{3dbd,,XMLParser.close()}, this method always returns @ref{887,,None}.
Any events not yet retrieved when the parser is closed can still be
read with @ref{3d7b,,read_events()}.
@end deffn

@geindex read_events() (xml.etree.ElementTree.XMLPullParser method)
@anchor{library/xml etree elementtree xml etree ElementTree XMLPullParser read_events}@anchor{3d7b}
@deffn {Method} read_events ()

Return an iterator over the events which have been encountered in the
data fed to the
parser.  The iterator yields @code{(event, elem)} pairs, where `event' is a
string representing the type of event (e.g. @code{"end"}) and `elem' is the
encountered @ref{361,,Element} object, or other context value as follows.


@itemize *

@item 
@code{start}, @code{end}: the current Element.

@item 
@code{comment}, @code{pi}: the current comment / processing instruction

@item 
@code{start-ns}: a tuple @code{(prefix, uri)} naming the declared namespace
mapping.

@item 
@code{end-ns}: @ref{887,,None} (this may change in a future version)
@end itemize

Events provided in a previous call to @code{read_events()} will not be
yielded again.  Events are consumed from the internal queue only when
they are retrieved from the iterator, so multiple readers iterating in
parallel over iterators obtained from @code{read_events()} will have
unpredictable results.
@end deffn

@cartouche
@quotation Note 
@code{XMLPullParser} only guarantees that it has seen the “>”
character of a starting tag when it emits a “start” event, so the
attributes are defined, but the contents of the text and tail attributes
are undefined at that point.  The same applies to the element children;
they may or may not be present.

If you need a fully populated element, look for “end” events instead.
@end quotation
@end cartouche


Added in version 3.4.



Changed in version 3.8: The @code{comment} and @code{pi} events were added.

@end deffn

@node Exceptions<22>,,XMLPullParser Objects,Reference<6>
@anchor{library/xml etree elementtree exceptions}@anchor{3dc1}
@subsubsection Exceptions


@geindex ParseError (class in xml.etree.ElementTree)
@anchor{library/xml etree elementtree xml etree ElementTree ParseError}@anchor{1483}
@deffn {Class} xml.etree.ElementTree.ParseError

XML parse error, raised by the various parsing methods in this module when
parsing fails.  The string representation of an instance of this exception
will contain a user-friendly error message.  In addition, it will have
the following attributes available:

@geindex code (xml.etree.ElementTree.ParseError attribute)
@anchor{library/xml etree elementtree xml etree ElementTree ParseError code}@anchor{3dc2}
@deffn {Attribute} code

A numeric error code from the expat parser. See the documentation of
@ref{12d,,xml.parsers.expat} for the list of error codes and their meanings.
@end deffn

@geindex position (xml.etree.ElementTree.ParseError attribute)
@anchor{library/xml etree elementtree xml etree ElementTree ParseError position}@anchor{3dc3}
@deffn {Attribute} position

A tuple of `line', `column' numbers, specifying where the error occurred.
@end deffn
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node xml dom — The Document Object Model API,xml dom minidom — Minimal DOM implementation,xml etree ElementTree — The ElementTree XML API,Structured Markup Processing Tools
@anchor{library/xml dom doc}@anchor{3dc4}@anchor{library/xml dom module-xml dom}@anchor{128}@anchor{library/xml dom translation-repo}@anchor{3dc5}@anchor{library/xml dom xml-dom-the-document-object-model-api}@anchor{3dc6}
@subsection @code{xml.dom} — The Document Object Model API


@geindex module; xml.dom

`Source code:' Lib/xml/dom/__init__.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/xml/dom/__init__.py}


__________________________________________________________________


The Document Object Model, or “DOM,” is a cross-language API from the World Wide
Web Consortium (W3C) for accessing and modifying XML documents.  A DOM
implementation presents an XML document as a tree structure, or allows client
code to build such a structure from scratch.  It then gives access to the
structure through a set of objects which provided well-known interfaces.

The DOM is extremely useful for random-access applications.  SAX only allows you
a view of one bit of the document at a time.  If you are looking at one SAX
element, you have no access to another.  If you are looking at a text node, you
have no access to a containing element. When you write a SAX application, you
need to keep track of your program’s position in the document somewhere in your
own code.  SAX does not do it for you.  Also, if you need to look ahead in the
XML document, you are just out of luck.

Some applications are simply impossible in an event driven model with no access
to a tree.  Of course you could build some sort of tree yourself in SAX events,
but the DOM allows you to avoid writing that code.  The DOM is a standard tree
representation for XML data.

The Document Object Model is being defined by the W3C in stages, or “levels” in
their terminology.  The Python mapping of the API is substantially based on the
DOM Level 2 recommendation.

@c What if your needs are somewhere between SAX and the DOM?  Perhaps
@c you cannot afford to load the entire tree in memory but you find the
@c SAX model somewhat cumbersome and low-level.  There is also a module
@c called xml.dom.pulldom that allows you to build trees of only the
@c parts of a document that you need structured access to.  It also has
@c features that allow you to find your way around the DOM.
@c See http://www.prescod.net/python/pulldom

DOM applications typically start by parsing some XML into a DOM.  How this is
accomplished is not covered at all by DOM Level 1, and Level 2 provides only
limited improvements: There is a @code{DOMImplementation} object class which
provides access to @code{Document} creation methods, but no way to access an
XML reader/parser/Document builder in an implementation-independent way. There
is also no well-defined way to access these methods without an existing
@code{Document} object.  In Python, each DOM implementation will provide a
function @ref{3dc7,,getDOMImplementation()}. DOM Level 3 adds a Load/Store
specification, which defines an interface to the reader, but this is not yet
available in the Python standard library.

Once you have a DOM document object, you can access the parts of your XML
document through its properties and methods.  These properties are defined in
the DOM specification; this portion of the reference manual describes the
interpretation of the specification in Python.

The specification provided by the W3C defines the DOM API for Java, ECMAScript,
and OMG IDL.  The Python mapping defined here is based in large part on the IDL
version of the specification, but strict compliance is not required (though
implementations are free to support the strict mapping from IDL).  See section
@ref{3dc8,,Conformance} for a detailed discussion of mapping requirements.


@subsubheading See also



@table @asis

@item Document Object Model (DOM) Level 2 Specification@footnote{https://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/}

The W3C recommendation upon which the Python DOM API is based.

@item Document Object Model (DOM) Level 1 Specification@footnote{https://www.w3.org/TR/REC-DOM-Level-1/}

The W3C recommendation for the DOM supported by @ref{129,,xml.dom.minidom}.

@item Python Language Mapping Specification@footnote{https://www.omg.org/spec/PYTH/1.2/PDF}

This specifies the mapping from OMG IDL to Python.
@end table


@menu
* Module Contents: Module Contents<3>. 
* Objects in the DOM:: 
* Conformance:: 

@end menu

@node Module Contents<3>,Objects in the DOM,,xml dom — The Document Object Model API
@anchor{library/xml dom module-contents}@anchor{3dc9}
@subsubsection Module Contents


The @code{xml.dom} contains the following functions:

@geindex registerDOMImplementation() (in module xml.dom)
@anchor{library/xml dom xml dom registerDOMImplementation}@anchor{3dca}
@deffn {Function} xml.dom.registerDOMImplementation (name, factory)

Register the `factory' function with the name `name'.  The factory function
should return an object which implements the @code{DOMImplementation}
interface.  The factory function can return the same object every time, or a new
one for each call, as appropriate for the specific implementation (e.g. if that
implementation supports some customization).
@end deffn

@geindex getDOMImplementation() (in module xml.dom)
@anchor{library/xml dom xml dom getDOMImplementation}@anchor{3dc7}
@deffn {Function} xml.dom.getDOMImplementation (name=None, features=())

Return a suitable DOM implementation. The `name' is either well-known, the
module name of a DOM implementation, or @code{None}. If it is not @code{None}, imports
the corresponding module and returns a @code{DOMImplementation} object if the
import succeeds.  If no name is given, and if the environment variable
@geindex PYTHON_DOM
@geindex environment variable; PYTHON_DOM
@code{PYTHON_DOM} is set, this variable is used to find the implementation.

If name is not given, this examines the available implementations to find one
with the required feature set.  If no implementation can be found, raise an
@ref{65b,,ImportError}.  The features list must be a sequence of @code{(feature,
version)} pairs which are passed to the @code{hasFeature()} method on available
@code{DOMImplementation} objects.
@end deffn

Some convenience constants are also provided:

@geindex EMPTY_NAMESPACE (in module xml.dom)
@anchor{library/xml dom xml dom EMPTY_NAMESPACE}@anchor{3dcb}
@deffn {Data} xml.dom.EMPTY_NAMESPACE

The value used to indicate that no namespace is associated with a node in the
DOM.  This is typically found as the @code{namespaceURI} of a node, or used as
the `namespaceURI' parameter to a namespaces-specific method.
@end deffn

@geindex XML_NAMESPACE (in module xml.dom)
@anchor{library/xml dom xml dom XML_NAMESPACE}@anchor{3dcc}
@deffn {Data} xml.dom.XML_NAMESPACE

The namespace URI associated with the reserved prefix @code{xml}, as defined by
Namespaces in XML@footnote{https://www.w3.org/TR/REC-xml-names/} (section 4).
@end deffn

@geindex XMLNS_NAMESPACE (in module xml.dom)
@anchor{library/xml dom xml dom XMLNS_NAMESPACE}@anchor{3dcd}
@deffn {Data} xml.dom.XMLNS_NAMESPACE

The namespace URI for namespace declarations, as defined by Document Object Model (DOM) Level 2 Core Specification@footnote{https://www.w3.org/TR/DOM-Level-2-Core/core.html} (section 1.1.8).
@end deffn

@geindex XHTML_NAMESPACE (in module xml.dom)
@anchor{library/xml dom xml dom XHTML_NAMESPACE}@anchor{3dce}
@deffn {Data} xml.dom.XHTML_NAMESPACE

The URI of the XHTML namespace as defined by XHTML 1.0: The Extensible HyperText Markup Language@footnote{https://www.w3.org/TR/xhtml1/} (section 3.1.1).
@end deffn

In addition, @code{xml.dom} contains a base @code{Node} class and the DOM
exception classes.  The @code{Node} class provided by this module does not
implement any of the methods or attributes defined by the DOM specification;
concrete DOM implementations must provide those.  The @code{Node} class
provided as part of this module does provide the constants used for the
@code{nodeType} attribute on concrete @code{Node} objects; they are located
within the class rather than at the module level to conform with the DOM
specifications.

@c Should the Node documentation go here?

@node Objects in the DOM,Conformance,Module Contents<3>,xml dom — The Document Object Model API
@anchor{library/xml dom dom-objects}@anchor{3dcf}@anchor{library/xml dom objects-in-the-dom}@anchor{3dd0}
@subsubsection Objects in the DOM


The definitive documentation for the DOM is the DOM specification from the W3C.

Note that DOM attributes may also be manipulated as nodes instead of as simple
strings.  It is fairly rare that you must do this, however, so this usage is not
yet documented.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Interface

@tab

Section

@tab

Purpose

@item

@code{DOMImplementation}

@tab

@ref{3dd1,,DOMImplementation Objects}

@tab

Interface to the underlying
implementation.

@item

@code{Node}

@tab

@ref{3dd2,,Node Objects}

@tab

Base interface for most objects
in a document.

@item

@code{NodeList}

@tab

@ref{23f2,,NodeList Objects}

@tab

Interface for a sequence of
nodes.

@item

@code{DocumentType}

@tab

@ref{3dd3,,DocumentType Objects}

@tab

Information about the
declarations needed to process
a document.

@item

@code{Document}

@tab

@ref{3dd4,,Document Objects}

@tab

Object which represents an
entire document.

@item

@code{Element}

@tab

@ref{3dd5,,Element Objects}

@tab

Element nodes in the document
hierarchy.

@item

@code{Attr}

@tab

@ref{3dd6,,Attr Objects}

@tab

Attribute value nodes on
element nodes.

@item

@code{Comment}

@tab

@ref{3dd7,,Comment Objects}

@tab

Representation of comments in
the source document.

@item

@code{Text}

@tab

@ref{3dd8,,Text and CDATASection Objects}

@tab

Nodes containing textual
content from the document.

@item

@code{ProcessingInstruction}

@tab

@ref{3dd9,,ProcessingInstruction Objects}

@tab

Processing instruction
representation.

@end multitable


An additional section describes the exceptions defined for working with the DOM
in Python.

@menu
* DOMImplementation Objects:: 
* Node Objects:: 
* NodeList Objects:: 
* DocumentType Objects:: 
* Document Objects:: 
* Element Objects: Element Objects<2>. 
* Attr Objects:: 
* NamedNodeMap Objects:: 
* Comment Objects:: 
* Text and CDATASection Objects:: 
* ProcessingInstruction Objects:: 
* Exceptions: Exceptions<23>. 

@end menu

@node DOMImplementation Objects,Node Objects,,Objects in the DOM
@anchor{library/xml dom dom-implementation-objects}@anchor{3dd1}@anchor{library/xml dom domimplementation-objects}@anchor{3dda}
@subsubsection DOMImplementation Objects


The @code{DOMImplementation} interface provides a way for applications to
determine the availability of particular features in the DOM they are using.
DOM Level 2 added the ability to create new @code{Document} and
@code{DocumentType} objects using the @code{DOMImplementation} as well.

@geindex hasFeature() (xml.dom.DOMImplementation method)
@anchor{library/xml dom xml dom DOMImplementation hasFeature}@anchor{3ddb}
@deffn {Method} DOMImplementation.hasFeature (feature, version)

Return @code{True} if the feature identified by the pair of strings `feature' and
`version' is implemented.
@end deffn

@geindex createDocument() (xml.dom.DOMImplementation method)
@anchor{library/xml dom xml dom DOMImplementation createDocument}@anchor{3ddc}
@deffn {Method} DOMImplementation.createDocument (namespaceUri, qualifiedName, doctype)

Return a new @code{Document} object (the root of the DOM), with a child
@code{Element} object having the given `namespaceUri' and `qualifiedName'. The
`doctype' must be a @code{DocumentType} object created by
@ref{3ddd,,createDocumentType()}, or @code{None}. In the Python DOM API, the first two
arguments can also be @code{None} in order to indicate that no @code{Element}
child is to be created.
@end deffn

@geindex createDocumentType() (xml.dom.DOMImplementation method)
@anchor{library/xml dom xml dom DOMImplementation createDocumentType}@anchor{3ddd}
@deffn {Method} DOMImplementation.createDocumentType (qualifiedName, publicId, systemId)

Return a new @code{DocumentType} object that encapsulates the given
`qualifiedName', `publicId', and `systemId' strings, representing the
information contained in an XML document type declaration.
@end deffn

@node Node Objects,NodeList Objects,DOMImplementation Objects,Objects in the DOM
@anchor{library/xml dom dom-node-objects}@anchor{3dd2}@anchor{library/xml dom node-objects}@anchor{3dde}
@subsubsection Node Objects


All of the components of an XML document are subclasses of @code{Node}.

@geindex nodeType (xml.dom.Node attribute)
@anchor{library/xml dom xml dom Node nodeType}@anchor{3ddf}
@deffn {Attribute} Node.nodeType

An integer representing the node type.  Symbolic constants for the types are on
the @code{Node} object: @code{ELEMENT_NODE}, @code{ATTRIBUTE_NODE},
@code{TEXT_NODE}, @code{CDATA_SECTION_NODE}, @code{ENTITY_NODE},
@code{PROCESSING_INSTRUCTION_NODE}, @code{COMMENT_NODE},
@code{DOCUMENT_NODE}, @code{DOCUMENT_TYPE_NODE}, @code{NOTATION_NODE}.
This is a read-only attribute.
@end deffn

@geindex parentNode (xml.dom.Node attribute)
@anchor{library/xml dom xml dom Node parentNode}@anchor{3de0}
@deffn {Attribute} Node.parentNode

The parent of the current node, or @code{None} for the document node. The value is
always a @code{Node} object or @code{None}.  For @code{Element} nodes, this
will be the parent element, except for the root element, in which case it will
be the @code{Document} object. For @code{Attr} nodes, this is always
@code{None}. This is a read-only attribute.
@end deffn

@geindex attributes (xml.dom.Node attribute)
@anchor{library/xml dom xml dom Node attributes}@anchor{3de1}
@deffn {Attribute} Node.attributes

A @code{NamedNodeMap} of attribute objects.  Only elements have actual values
for this; others provide @code{None} for this attribute. This is a read-only
attribute.
@end deffn

@geindex previousSibling (xml.dom.Node attribute)
@anchor{library/xml dom xml dom Node previousSibling}@anchor{3de2}
@deffn {Attribute} Node.previousSibling

The node that immediately precedes this one with the same parent.  For
instance the element with an end-tag that comes just before the `self'
element’s start-tag.  Of course, XML documents are made up of more than just
elements so the previous sibling could be text, a comment, or something else.
If this node is the first child of the parent, this attribute will be
@code{None}. This is a read-only attribute.
@end deffn

@geindex nextSibling (xml.dom.Node attribute)
@anchor{library/xml dom xml dom Node nextSibling}@anchor{3de3}
@deffn {Attribute} Node.nextSibling

The node that immediately follows this one with the same parent.  See also
@ref{3de2,,previousSibling}.  If this is the last child of the parent, this
attribute will be @code{None}. This is a read-only attribute.
@end deffn

@geindex childNodes (xml.dom.Node attribute)
@anchor{library/xml dom xml dom Node childNodes}@anchor{3de4}
@deffn {Attribute} Node.childNodes

A list of nodes contained within this node. This is a read-only attribute.
@end deffn

@geindex firstChild (xml.dom.Node attribute)
@anchor{library/xml dom xml dom Node firstChild}@anchor{3de5}
@deffn {Attribute} Node.firstChild

The first child of the node, if there are any, or @code{None}. This is a read-only
attribute.
@end deffn

@geindex lastChild (xml.dom.Node attribute)
@anchor{library/xml dom xml dom Node lastChild}@anchor{3de6}
@deffn {Attribute} Node.lastChild

The last child of the node, if there are any, or @code{None}. This is a read-only
attribute.
@end deffn

@geindex localName (xml.dom.Node attribute)
@anchor{library/xml dom xml dom Node localName}@anchor{3de7}
@deffn {Attribute} Node.localName

The part of the @code{tagName} following the colon if there is one, else the
entire @code{tagName}.  The value is a string.
@end deffn

@geindex prefix (xml.dom.Node attribute)
@anchor{library/xml dom xml dom Node prefix}@anchor{3de8}
@deffn {Attribute} Node.prefix

The part of the @code{tagName} preceding the colon if there is one, else the
empty string.  The value is a string, or @code{None}.
@end deffn

@geindex namespaceURI (xml.dom.Node attribute)
@anchor{library/xml dom xml dom Node namespaceURI}@anchor{3de9}
@deffn {Attribute} Node.namespaceURI

The namespace associated with the element name.  This will be a string or
@code{None}.  This is a read-only attribute.
@end deffn

@geindex nodeName (xml.dom.Node attribute)
@anchor{library/xml dom xml dom Node nodeName}@anchor{3dea}
@deffn {Attribute} Node.nodeName

This has a different meaning for each node type; see the DOM specification for
details.  You can always get the information you would get here from another
property such as the @code{tagName} property for elements or the @code{name}
property for attributes. For all node types, the value of this attribute will be
either a string or @code{None}.  This is a read-only attribute.
@end deffn

@geindex nodeValue (xml.dom.Node attribute)
@anchor{library/xml dom xml dom Node nodeValue}@anchor{3deb}
@deffn {Attribute} Node.nodeValue

This has a different meaning for each node type; see the DOM specification for
details.  The situation is similar to that with @ref{3dea,,nodeName}.  The value is
a string or @code{None}.
@end deffn

@geindex hasAttributes() (xml.dom.Node method)
@anchor{library/xml dom xml dom Node hasAttributes}@anchor{3dec}
@deffn {Method} Node.hasAttributes ()

Return @code{True} if the node has any attributes.
@end deffn

@geindex hasChildNodes() (xml.dom.Node method)
@anchor{library/xml dom xml dom Node hasChildNodes}@anchor{3ded}
@deffn {Method} Node.hasChildNodes ()

Return @code{True} if the node has any child nodes.
@end deffn

@geindex isSameNode() (xml.dom.Node method)
@anchor{library/xml dom xml dom Node isSameNode}@anchor{3dee}
@deffn {Method} Node.isSameNode (other)

Return @code{True} if `other' refers to the same node as this node. This is especially
useful for DOM implementations which use any sort of proxy architecture (because
more than one object can refer to the same node).

@cartouche
@quotation Note 
This is based on a proposed DOM Level 3 API which is still in the “working
draft” stage, but this particular interface appears uncontroversial.  Changes
from the W3C will not necessarily affect this method in the Python DOM interface
(though any new W3C API for this would also be supported).
@end quotation
@end cartouche
@end deffn

@geindex appendChild() (xml.dom.Node method)
@anchor{library/xml dom xml dom Node appendChild}@anchor{3def}
@deffn {Method} Node.appendChild (newChild)

Add a new child node to this node at the end of the list of
children, returning `newChild'. If the node was already in
the tree, it is removed first.
@end deffn

@geindex insertBefore() (xml.dom.Node method)
@anchor{library/xml dom xml dom Node insertBefore}@anchor{3df0}
@deffn {Method} Node.insertBefore (newChild, refChild)

Insert a new child node before an existing child.  It must be the case that
`refChild' is a child of this node; if not, @ref{2ee,,ValueError} is raised.
`newChild' is returned. If `refChild' is @code{None}, it inserts `newChild' at the
end of the children’s list.
@end deffn

@geindex removeChild() (xml.dom.Node method)
@anchor{library/xml dom xml dom Node removeChild}@anchor{3df1}
@deffn {Method} Node.removeChild (oldChild)

Remove a child node.  `oldChild' must be a child of this node; if not,
@ref{2ee,,ValueError} is raised.  `oldChild' is returned on success.  If `oldChild'
will not be used further, its @code{unlink()} method should be called.
@end deffn

@geindex replaceChild() (xml.dom.Node method)
@anchor{library/xml dom xml dom Node replaceChild}@anchor{3df2}
@deffn {Method} Node.replaceChild (newChild, oldChild)

Replace an existing node with a new node. It must be the case that  `oldChild'
is a child of this node; if not, @ref{2ee,,ValueError} is raised.
@end deffn

@geindex normalize() (xml.dom.Node method)
@anchor{library/xml dom xml dom Node normalize}@anchor{3df3}
@deffn {Method} Node.normalize ()

Join adjacent text nodes so that all stretches of text are stored as single
@code{Text} instances.  This simplifies processing text from a DOM tree for
many applications.
@end deffn

@geindex cloneNode() (xml.dom.Node method)
@anchor{library/xml dom xml dom Node cloneNode}@anchor{3df4}
@deffn {Method} Node.cloneNode (deep)

Clone this node.  Setting `deep' means to clone all child nodes as well.  This
returns the clone.
@end deffn

@node NodeList Objects,DocumentType Objects,Node Objects,Objects in the DOM
@anchor{library/xml dom dom-nodelist-objects}@anchor{23f2}@anchor{library/xml dom nodelist-objects}@anchor{3df5}
@subsubsection NodeList Objects


A @code{NodeList} represents a sequence of nodes.  These objects are used in
two ways in the DOM Core recommendation:  an @code{Element} object provides
one as its list of child nodes, and the @code{getElementsByTagName()} and
@code{getElementsByTagNameNS()} methods of @code{Node} return objects with this
interface to represent query results.

The DOM Level 2 recommendation defines one method and one attribute for these
objects:

@geindex item() (xml.dom.NodeList method)
@anchor{library/xml dom xml dom NodeList item}@anchor{3df6}
@deffn {Method} NodeList.item (i)

Return the `i'’th item from the sequence, if there is one, or @code{None}.  The
index `i' is not allowed to be less than zero or greater than or equal to the
length of the sequence.
@end deffn

@geindex length (xml.dom.NodeList attribute)
@anchor{library/xml dom xml dom NodeList length}@anchor{3df7}
@deffn {Attribute} NodeList.length

The number of nodes in the sequence.
@end deffn

In addition, the Python DOM interface requires that some additional support is
provided to allow @code{NodeList} objects to be used as Python sequences.  All
@code{NodeList} implementations must include support for
@ref{17e1,,__len__()} and
@ref{588,,__getitem__()}; this allows iteration over the @code{NodeList} in
@ref{348,,for} statements and proper support for the @ref{841,,len()} built-in
function.

If a DOM implementation supports modification of the document, the
@code{NodeList} implementation must also support the
@ref{14d7,,__setitem__()} and @ref{14d8,,__delitem__()} methods.

@node DocumentType Objects,Document Objects,NodeList Objects,Objects in the DOM
@anchor{library/xml dom documenttype-objects}@anchor{3df8}@anchor{library/xml dom dom-documenttype-objects}@anchor{3dd3}
@subsubsection DocumentType Objects


Information about the notations and entities declared by a document (including
the external subset if the parser uses it and can provide the information) is
available from a @code{DocumentType} object.  The @code{DocumentType} for a
document is available from the @code{Document} object’s @code{doctype}
attribute; if there is no @code{DOCTYPE} declaration for the document, the
document’s @code{doctype} attribute will be set to @code{None} instead of an
instance of this interface.

@code{DocumentType} is a specialization of @code{Node}, and adds the
following attributes:

@geindex publicId (xml.dom.DocumentType attribute)
@anchor{library/xml dom xml dom DocumentType publicId}@anchor{3df9}
@deffn {Attribute} DocumentType.publicId

The public identifier for the external subset of the document type definition.
This will be a string or @code{None}.
@end deffn

@geindex systemId (xml.dom.DocumentType attribute)
@anchor{library/xml dom xml dom DocumentType systemId}@anchor{3dfa}
@deffn {Attribute} DocumentType.systemId

The system identifier for the external subset of the document type definition.
This will be a URI as a string, or @code{None}.
@end deffn

@geindex internalSubset (xml.dom.DocumentType attribute)
@anchor{library/xml dom xml dom DocumentType internalSubset}@anchor{3dfb}
@deffn {Attribute} DocumentType.internalSubset

A string giving the complete internal subset from the document. This does not
include the brackets which enclose the subset.  If the document has no internal
subset, this should be @code{None}.
@end deffn

@geindex name (xml.dom.DocumentType attribute)
@anchor{library/xml dom xml dom DocumentType name}@anchor{3dfc}
@deffn {Attribute} DocumentType.name

The name of the root element as given in the @code{DOCTYPE} declaration, if
present.
@end deffn

@geindex entities (xml.dom.DocumentType attribute)
@anchor{library/xml dom xml dom DocumentType entities}@anchor{3dfd}
@deffn {Attribute} DocumentType.entities

This is a @code{NamedNodeMap} giving the definitions of external entities.
For entity names defined more than once, only the first definition is provided
(others are ignored as required by the XML recommendation).  This may be
@code{None} if the information is not provided by the parser, or if no entities are
defined.
@end deffn

@geindex notations (xml.dom.DocumentType attribute)
@anchor{library/xml dom xml dom DocumentType notations}@anchor{3dfe}
@deffn {Attribute} DocumentType.notations

This is a @code{NamedNodeMap} giving the definitions of notations. For
notation names defined more than once, only the first definition is provided
(others are ignored as required by the XML recommendation).  This may be
@code{None} if the information is not provided by the parser, or if no notations
are defined.
@end deffn

@node Document Objects,Element Objects<2>,DocumentType Objects,Objects in the DOM
@anchor{library/xml dom document-objects}@anchor{3dff}@anchor{library/xml dom dom-document-objects}@anchor{3dd4}
@subsubsection Document Objects


A @code{Document} represents an entire XML document, including its constituent
elements, attributes, processing instructions, comments etc.  Remember that it
inherits properties from @code{Node}.

@geindex documentElement (xml.dom.Document attribute)
@anchor{library/xml dom xml dom Document documentElement}@anchor{17d1}
@deffn {Attribute} Document.documentElement

The one and only root element of the document.
@end deffn

@geindex createElement() (xml.dom.Document method)
@anchor{library/xml dom xml dom Document createElement}@anchor{3e00}
@deffn {Method} Document.createElement (tagName)

Create and return a new element node.  The element is not inserted into the
document when it is created.  You need to explicitly insert it with one of the
other methods such as @code{insertBefore()} or @code{appendChild()}.
@end deffn

@geindex createElementNS() (xml.dom.Document method)
@anchor{library/xml dom xml dom Document createElementNS}@anchor{3e01}
@deffn {Method} Document.createElementNS (namespaceURI, tagName)

Create and return a new element with a namespace.  The `tagName' may have a
prefix.  The element is not inserted into the document when it is created.  You
need to explicitly insert it with one of the other methods such as
@code{insertBefore()} or @code{appendChild()}.
@end deffn

@geindex createTextNode() (xml.dom.Document method)
@anchor{library/xml dom xml dom Document createTextNode}@anchor{3e02}
@deffn {Method} Document.createTextNode (data)

Create and return a text node containing the data passed as a parameter.  As
with the other creation methods, this one does not insert the node into the
tree.
@end deffn

@geindex createComment() (xml.dom.Document method)
@anchor{library/xml dom xml dom Document createComment}@anchor{3e03}
@deffn {Method} Document.createComment (data)

Create and return a comment node containing the data passed as a parameter.  As
with the other creation methods, this one does not insert the node into the
tree.
@end deffn

@geindex createProcessingInstruction() (xml.dom.Document method)
@anchor{library/xml dom xml dom Document createProcessingInstruction}@anchor{3e04}
@deffn {Method} Document.createProcessingInstruction (target, data)

Create and return a processing instruction node containing the `target' and
`data' passed as parameters.  As with the other creation methods, this one does
not insert the node into the tree.
@end deffn

@geindex createAttribute() (xml.dom.Document method)
@anchor{library/xml dom xml dom Document createAttribute}@anchor{3e05}
@deffn {Method} Document.createAttribute (name)

Create and return an attribute node.  This method does not associate the
attribute node with any particular element.  You must use
@code{setAttributeNode()} on the appropriate @code{Element} object to use the
newly created attribute instance.
@end deffn

@geindex createAttributeNS() (xml.dom.Document method)
@anchor{library/xml dom xml dom Document createAttributeNS}@anchor{3e06}
@deffn {Method} Document.createAttributeNS (namespaceURI, qualifiedName)

Create and return an attribute node with a namespace.  The `tagName' may have a
prefix.  This method does not associate the attribute node with any particular
element.  You must use @code{setAttributeNode()} on the appropriate
@code{Element} object to use the newly created attribute instance.
@end deffn

@geindex getElementsByTagName() (xml.dom.Document method)
@anchor{library/xml dom xml dom Document getElementsByTagName}@anchor{3e07}
@deffn {Method} Document.getElementsByTagName (tagName)

Search for all descendants (direct children, children’s children, etc.) with a
particular element type name.
@end deffn

@geindex getElementsByTagNameNS() (xml.dom.Document method)
@anchor{library/xml dom xml dom Document getElementsByTagNameNS}@anchor{3e08}
@deffn {Method} Document.getElementsByTagNameNS (namespaceURI, localName)

Search for all descendants (direct children, children’s children, etc.) with a
particular namespace URI and localname.  The localname is the part of the
namespace after the prefix.
@end deffn

@node Element Objects<2>,Attr Objects,Document Objects,Objects in the DOM
@anchor{library/xml dom dom-element-objects}@anchor{3dd5}@anchor{library/xml dom element-objects}@anchor{3e09}
@subsubsection Element Objects


@code{Element} is a subclass of @code{Node}, so inherits all the attributes
of that class.

@geindex tagName (xml.dom.Element attribute)
@anchor{library/xml dom xml dom Element tagName}@anchor{3e0a}
@deffn {Attribute} Element.tagName

The element type name.  In a namespace-using document it may have colons in it.
The value is a string.
@end deffn

@geindex getElementsByTagName() (xml.dom.Element method)
@anchor{library/xml dom xml dom Element getElementsByTagName}@anchor{3e0b}
@deffn {Method} Element.getElementsByTagName (tagName)

Same as equivalent method in the @code{Document} class.
@end deffn

@geindex getElementsByTagNameNS() (xml.dom.Element method)
@anchor{library/xml dom xml dom Element getElementsByTagNameNS}@anchor{3e0c}
@deffn {Method} Element.getElementsByTagNameNS (namespaceURI, localName)

Same as equivalent method in the @code{Document} class.
@end deffn

@geindex hasAttribute() (xml.dom.Element method)
@anchor{library/xml dom xml dom Element hasAttribute}@anchor{3e0d}
@deffn {Method} Element.hasAttribute (name)

Return @code{True} if the element has an attribute named by `name'.
@end deffn

@geindex hasAttributeNS() (xml.dom.Element method)
@anchor{library/xml dom xml dom Element hasAttributeNS}@anchor{3e0e}
@deffn {Method} Element.hasAttributeNS (namespaceURI, localName)

Return @code{True} if the element has an attribute named by `namespaceURI' and
`localName'.
@end deffn

@geindex getAttribute() (xml.dom.Element method)
@anchor{library/xml dom xml dom Element getAttribute}@anchor{3e0f}
@deffn {Method} Element.getAttribute (name)

Return the value of the attribute named by `name' as a string. If no such
attribute exists, an empty string is returned, as if the attribute had no value.
@end deffn

@geindex getAttributeNode() (xml.dom.Element method)
@anchor{library/xml dom xml dom Element getAttributeNode}@anchor{3e10}
@deffn {Method} Element.getAttributeNode (attrname)

Return the @code{Attr} node for the attribute named by `attrname'.
@end deffn

@geindex getAttributeNS() (xml.dom.Element method)
@anchor{library/xml dom xml dom Element getAttributeNS}@anchor{3e11}
@deffn {Method} Element.getAttributeNS (namespaceURI, localName)

Return the value of the attribute named by `namespaceURI' and `localName' as a
string. If no such attribute exists, an empty string is returned, as if the
attribute had no value.
@end deffn

@geindex getAttributeNodeNS() (xml.dom.Element method)
@anchor{library/xml dom xml dom Element getAttributeNodeNS}@anchor{3e12}
@deffn {Method} Element.getAttributeNodeNS (namespaceURI, localName)

Return an attribute value as a node, given a `namespaceURI' and `localName'.
@end deffn

@geindex removeAttribute() (xml.dom.Element method)
@anchor{library/xml dom xml dom Element removeAttribute}@anchor{3e13}
@deffn {Method} Element.removeAttribute (name)

Remove an attribute by name.  If there is no matching attribute, a
@ref{3e14,,NotFoundErr} is raised.
@end deffn

@geindex removeAttributeNode() (xml.dom.Element method)
@anchor{library/xml dom xml dom Element removeAttributeNode}@anchor{3e15}
@deffn {Method} Element.removeAttributeNode (oldAttr)

Remove and return `oldAttr' from the attribute list, if present. If `oldAttr' is
not present, @ref{3e14,,NotFoundErr} is raised.
@end deffn

@geindex removeAttributeNS() (xml.dom.Element method)
@anchor{library/xml dom xml dom Element removeAttributeNS}@anchor{3e16}
@deffn {Method} Element.removeAttributeNS (namespaceURI, localName)

Remove an attribute by name.  Note that it uses a localName, not a qname.  No
exception is raised if there is no matching attribute.
@end deffn

@geindex setAttribute() (xml.dom.Element method)
@anchor{library/xml dom xml dom Element setAttribute}@anchor{3e17}
@deffn {Method} Element.setAttribute (name, value)

Set an attribute value from a string.
@end deffn

@geindex setAttributeNode() (xml.dom.Element method)
@anchor{library/xml dom xml dom Element setAttributeNode}@anchor{3e18}
@deffn {Method} Element.setAttributeNode (newAttr)

Add a new attribute node to the element, replacing an existing attribute if
necessary if the @code{name} attribute matches.  If a replacement occurs, the
old attribute node will be returned.  If `newAttr' is already in use,
@ref{3e19,,InuseAttributeErr} will be raised.
@end deffn

@geindex setAttributeNodeNS() (xml.dom.Element method)
@anchor{library/xml dom xml dom Element setAttributeNodeNS}@anchor{3e1a}
@deffn {Method} Element.setAttributeNodeNS (newAttr)

Add a new attribute node to the element, replacing an existing attribute if
necessary if the @code{namespaceURI} and @code{localName} attributes match.
If a replacement occurs, the old attribute node will be returned.  If `newAttr'
is already in use, @ref{3e19,,InuseAttributeErr} will be raised.
@end deffn

@geindex setAttributeNS() (xml.dom.Element method)
@anchor{library/xml dom xml dom Element setAttributeNS}@anchor{3e1b}
@deffn {Method} Element.setAttributeNS (namespaceURI, qname, value)

Set an attribute value from a string, given a `namespaceURI' and a `qname'.
Note that a qname is the whole attribute name.  This is different than above.
@end deffn

@node Attr Objects,NamedNodeMap Objects,Element Objects<2>,Objects in the DOM
@anchor{library/xml dom attr-objects}@anchor{3e1c}@anchor{library/xml dom dom-attr-objects}@anchor{3dd6}
@subsubsection Attr Objects


@code{Attr} inherits from @code{Node}, so inherits all its attributes.

@geindex name (xml.dom.Attr attribute)
@anchor{library/xml dom xml dom Attr name}@anchor{3e1d}
@deffn {Attribute} Attr.name

The attribute name.
In a namespace-using document it may include a colon.
@end deffn

@geindex localName (xml.dom.Attr attribute)
@anchor{library/xml dom xml dom Attr localName}@anchor{3e1e}
@deffn {Attribute} Attr.localName

The part of the name following the colon if there is one, else the
entire name.
This is a read-only attribute.
@end deffn

@geindex prefix (xml.dom.Attr attribute)
@anchor{library/xml dom xml dom Attr prefix}@anchor{3e1f}
@deffn {Attribute} Attr.prefix

The part of the name preceding the colon if there is one, else the
empty string.
@end deffn

@geindex value (xml.dom.Attr attribute)
@anchor{library/xml dom xml dom Attr value}@anchor{3e20}
@deffn {Attribute} Attr.value

The text value of the attribute.  This is a synonym for the
@code{nodeValue} attribute.
@end deffn

@node NamedNodeMap Objects,Comment Objects,Attr Objects,Objects in the DOM
@anchor{library/xml dom dom-attributelist-objects}@anchor{3e21}@anchor{library/xml dom namednodemap-objects}@anchor{3e22}
@subsubsection NamedNodeMap Objects


@code{NamedNodeMap} does `not' inherit from @code{Node}.

@geindex length (xml.dom.NamedNodeMap attribute)
@anchor{library/xml dom xml dom NamedNodeMap length}@anchor{3e23}
@deffn {Attribute} NamedNodeMap.length

The length of the attribute list.
@end deffn

@geindex item() (xml.dom.NamedNodeMap method)
@anchor{library/xml dom xml dom NamedNodeMap item}@anchor{3e24}
@deffn {Method} NamedNodeMap.item (index)

Return an attribute with a particular index.  The order you get the attributes
in is arbitrary but will be consistent for the life of a DOM.  Each item is an
attribute node.  Get its value with the @code{value} attribute.
@end deffn

There are also experimental methods that give this class more mapping behavior.
You can use them or you can use the standardized @code{getAttribute*()} family
of methods on the @code{Element} objects.

@node Comment Objects,Text and CDATASection Objects,NamedNodeMap Objects,Objects in the DOM
@anchor{library/xml dom comment-objects}@anchor{3e25}@anchor{library/xml dom dom-comment-objects}@anchor{3dd7}
@subsubsection Comment Objects


@code{Comment} represents a comment in the XML document.  It is a subclass of
@code{Node}, but cannot have child nodes.

@geindex data (xml.dom.Comment attribute)
@anchor{library/xml dom xml dom Comment data}@anchor{3e26}
@deffn {Attribute} Comment.data

The content of the comment as a string.  The attribute contains all characters
between the leading @code{<!-}@code{-} and trailing @code{-}@code{->}, but does not
include them.
@end deffn

@node Text and CDATASection Objects,ProcessingInstruction Objects,Comment Objects,Objects in the DOM
@anchor{library/xml dom dom-text-objects}@anchor{3dd8}@anchor{library/xml dom text-and-cdatasection-objects}@anchor{3e27}
@subsubsection Text and CDATASection Objects


The @code{Text} interface represents text in the XML document.  If the parser
and DOM implementation support the DOM’s XML extension, portions of the text
enclosed in CDATA marked sections are stored in @code{CDATASection} objects.
These two interfaces are identical, but provide different values for the
@code{nodeType} attribute.

These interfaces extend the @code{Node} interface.  They cannot have child
nodes.

@geindex data (xml.dom.Text attribute)
@anchor{library/xml dom xml dom Text data}@anchor{3e28}
@deffn {Attribute} Text.data

The content of the text node as a string.
@end deffn

@cartouche
@quotation Note 
The use of a @code{CDATASection} node does not indicate that the node
represents a complete CDATA marked section, only that the content of the node
was part of a CDATA section.  A single CDATA section may be represented by more
than one node in the document tree.  There is no way to determine whether two
adjacent @code{CDATASection} nodes represent different CDATA marked sections.
@end quotation
@end cartouche

@node ProcessingInstruction Objects,Exceptions<23>,Text and CDATASection Objects,Objects in the DOM
@anchor{library/xml dom dom-pi-objects}@anchor{3dd9}@anchor{library/xml dom processinginstruction-objects}@anchor{3e29}
@subsubsection ProcessingInstruction Objects


Represents a processing instruction in the XML document; this inherits from the
@code{Node} interface and cannot have child nodes.

@geindex target (xml.dom.ProcessingInstruction attribute)
@anchor{library/xml dom xml dom ProcessingInstruction target}@anchor{3e2a}
@deffn {Attribute} ProcessingInstruction.target

The content of the processing instruction up to the first whitespace character.
This is a read-only attribute.
@end deffn

@geindex data (xml.dom.ProcessingInstruction attribute)
@anchor{library/xml dom xml dom ProcessingInstruction data}@anchor{3e2b}
@deffn {Attribute} ProcessingInstruction.data

The content of the processing instruction following the first whitespace
character.
@end deffn

@node Exceptions<23>,,ProcessingInstruction Objects,Objects in the DOM
@anchor{library/xml dom dom-exceptions}@anchor{3e2c}@anchor{library/xml dom exceptions}@anchor{3e2d}
@subsubsection Exceptions


The DOM Level 2 recommendation defines a single exception, @ref{3e2e,,DOMException},
and a number of constants that allow applications to determine what sort of
error occurred. @code{DOMException} instances carry a @ref{1b,,code} attribute
that provides the appropriate value for the specific exception.

The Python DOM interface provides the constants, but also expands the set of
exceptions so that a specific exception exists for each of the exception codes
defined by the DOM.  The implementations must raise the appropriate specific
exception, each of which carries the appropriate value for the @ref{1b,,code}
attribute.

@geindex DOMException
@anchor{library/xml dom xml dom DOMException}@anchor{3e2e}
@deffn {Exception} xml.dom.DOMException

Base exception class used for all specific DOM exceptions.  This exception class
cannot be directly instantiated.
@end deffn

@geindex DomstringSizeErr
@anchor{library/xml dom xml dom DomstringSizeErr}@anchor{3e2f}
@deffn {Exception} xml.dom.DomstringSizeErr

Raised when a specified range of text does not fit into a string. This is not
known to be used in the Python DOM implementations, but may be received from DOM
implementations not written in Python.
@end deffn

@geindex HierarchyRequestErr
@anchor{library/xml dom xml dom HierarchyRequestErr}@anchor{3e30}
@deffn {Exception} xml.dom.HierarchyRequestErr

Raised when an attempt is made to insert a node where the node type is not
allowed.
@end deffn

@geindex IndexSizeErr
@anchor{library/xml dom xml dom IndexSizeErr}@anchor{3e31}
@deffn {Exception} xml.dom.IndexSizeErr

Raised when an index or size parameter to a method is negative or exceeds the
allowed values.
@end deffn

@geindex InuseAttributeErr
@anchor{library/xml dom xml dom InuseAttributeErr}@anchor{3e19}
@deffn {Exception} xml.dom.InuseAttributeErr

Raised when an attempt is made to insert an @code{Attr} node that is already
present elsewhere in the document.
@end deffn

@geindex InvalidAccessErr
@anchor{library/xml dom xml dom InvalidAccessErr}@anchor{3e32}
@deffn {Exception} xml.dom.InvalidAccessErr

Raised if a parameter or an operation is not supported on the underlying object.
@end deffn

@geindex InvalidCharacterErr
@anchor{library/xml dom xml dom InvalidCharacterErr}@anchor{3e33}
@deffn {Exception} xml.dom.InvalidCharacterErr

This exception is raised when a string parameter contains a character that is
not permitted in the context it’s being used in by the XML 1.0 recommendation.
For example, attempting to create an @code{Element} node with a space in the
element type name will cause this error to be raised.
@end deffn

@geindex InvalidModificationErr
@anchor{library/xml dom xml dom InvalidModificationErr}@anchor{3e34}
@deffn {Exception} xml.dom.InvalidModificationErr

Raised when an attempt is made to modify the type of a node.
@end deffn

@geindex InvalidStateErr
@anchor{library/xml dom xml dom InvalidStateErr}@anchor{3e35}
@deffn {Exception} xml.dom.InvalidStateErr

Raised when an attempt is made to use an object that is not defined or is no
longer usable.
@end deffn

@geindex NamespaceErr
@anchor{library/xml dom xml dom NamespaceErr}@anchor{3e36}
@deffn {Exception} xml.dom.NamespaceErr

If an attempt is made to change any object in a way that is not permitted with
regard to the Namespaces in XML@footnote{https://www.w3.org/TR/REC-xml-names/}
recommendation, this exception is raised.
@end deffn

@geindex NotFoundErr
@anchor{library/xml dom xml dom NotFoundErr}@anchor{3e14}
@deffn {Exception} xml.dom.NotFoundErr

Exception when a node does not exist in the referenced context.  For example,
@code{NamedNodeMap.removeNamedItem()} will raise this if the node passed in does
not exist in the map.
@end deffn

@geindex NotSupportedErr
@anchor{library/xml dom xml dom NotSupportedErr}@anchor{3e37}
@deffn {Exception} xml.dom.NotSupportedErr

Raised when the implementation does not support the requested type of object or
operation.
@end deffn

@geindex NoDataAllowedErr
@anchor{library/xml dom xml dom NoDataAllowedErr}@anchor{3e38}
@deffn {Exception} xml.dom.NoDataAllowedErr

This is raised if data is specified for a node which does not support data.

@c XXX  a better explanation is needed!
@end deffn

@geindex NoModificationAllowedErr
@anchor{library/xml dom xml dom NoModificationAllowedErr}@anchor{3e39}
@deffn {Exception} xml.dom.NoModificationAllowedErr

Raised on attempts to modify an object where modifications are not allowed (such
as for read-only nodes).
@end deffn

@geindex SyntaxErr
@anchor{library/xml dom xml dom SyntaxErr}@anchor{3e3a}
@deffn {Exception} xml.dom.SyntaxErr

Raised when an invalid or illegal string is specified.

@c XXX  how is this different from InvalidCharacterErr?
@end deffn

@geindex WrongDocumentErr
@anchor{library/xml dom xml dom WrongDocumentErr}@anchor{3e3b}
@deffn {Exception} xml.dom.WrongDocumentErr

Raised when a node is inserted in a different document than it currently belongs
to, and the implementation does not support migrating the node from one document
to the other.
@end deffn

The exception codes defined in the DOM recommendation map to the exceptions
described above according to this table:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Constant

@tab

Exception

@item

@code{DOMSTRING_SIZE_ERR}

@tab

@ref{3e2f,,DomstringSizeErr}

@item

@code{HIERARCHY_REQUEST_ERR}

@tab

@ref{3e30,,HierarchyRequestErr}

@item

@code{INDEX_SIZE_ERR}

@tab

@ref{3e31,,IndexSizeErr}

@item

@code{INUSE_ATTRIBUTE_ERR}

@tab

@ref{3e19,,InuseAttributeErr}

@item

@code{INVALID_ACCESS_ERR}

@tab

@ref{3e32,,InvalidAccessErr}

@item

@code{INVALID_CHARACTER_ERR}

@tab

@ref{3e33,,InvalidCharacterErr}

@item

@code{INVALID_MODIFICATION_ERR}

@tab

@ref{3e34,,InvalidModificationErr}

@item

@code{INVALID_STATE_ERR}

@tab

@ref{3e35,,InvalidStateErr}

@item

@code{NAMESPACE_ERR}

@tab

@ref{3e36,,NamespaceErr}

@item

@code{NOT_FOUND_ERR}

@tab

@ref{3e14,,NotFoundErr}

@item

@code{NOT_SUPPORTED_ERR}

@tab

@ref{3e37,,NotSupportedErr}

@item

@code{NO_DATA_ALLOWED_ERR}

@tab

@ref{3e38,,NoDataAllowedErr}

@item

@code{NO_MODIFICATION_ALLOWED_ERR}

@tab

@ref{3e39,,NoModificationAllowedErr}

@item

@code{SYNTAX_ERR}

@tab

@ref{3e3a,,SyntaxErr}

@item

@code{WRONG_DOCUMENT_ERR}

@tab

@ref{3e3b,,WrongDocumentErr}

@end multitable


@node Conformance,,Objects in the DOM,xml dom — The Document Object Model API
@anchor{library/xml dom conformance}@anchor{3e3c}@anchor{library/xml dom dom-conformance}@anchor{3dc8}
@subsubsection Conformance


This section describes the conformance requirements and relationships between
the Python DOM API, the W3C DOM recommendations, and the OMG IDL mapping for
Python.

@menu
* Type Mapping:: 
* Accessor Methods:: 

@end menu

@node Type Mapping,Accessor Methods,,Conformance
@anchor{library/xml dom dom-type-mapping}@anchor{3e3d}@anchor{library/xml dom type-mapping}@anchor{3e3e}
@subsubsection Type Mapping


The IDL types used in the DOM specification are mapped to Python types
according to the following table.


@multitable {xxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

IDL Type

@tab

Python Type

@item

@code{boolean}

@tab

@code{bool} or @code{int}

@item

@code{int}

@tab

@code{int}

@item

@code{long int}

@tab

@code{int}

@item

@code{unsigned int}

@tab

@code{int}

@item

@code{DOMString}

@tab

@code{str} or @code{bytes}

@item

@code{null}

@tab

@code{None}

@end multitable


@node Accessor Methods,,Type Mapping,Conformance
@anchor{library/xml dom accessor-methods}@anchor{3e3f}@anchor{library/xml dom dom-accessor-methods}@anchor{3e40}
@subsubsection Accessor Methods


The mapping from OMG IDL to Python defines accessor functions for IDL
@code{attribute} declarations in much the way the Java mapping does.
Mapping the IDL declarations

@example
readonly attribute string someValue;
         attribute string anotherValue;
@end example

yields three accessor functions:  a “get” method for @code{someValue}
(@code{_get_someValue()}), and “get” and “set” methods for @code{anotherValue}
(@code{_get_anotherValue()} and @code{_set_anotherValue()}).  The mapping, in
particular, does not require that the IDL attributes are accessible as normal
Python attributes:  @code{object.someValue} is `not' required to work, and may
raise an @ref{5f0,,AttributeError}.

The Python DOM API, however, `does' require that normal attribute access work.
This means that the typical surrogates generated by Python IDL compilers are not
likely to work, and wrapper objects may be needed on the client if the DOM
objects are accessed via CORBA. While this does require some additional
consideration for CORBA DOM clients, the implementers with experience using DOM
over CORBA from Python do not consider this a problem.  Attributes that are
declared @code{readonly} may not restrict write access in all DOM
implementations.

In the Python DOM API, accessor functions are not required.  If provided, they
should take the form defined by the Python IDL mapping, but these methods are
considered unnecessary since the attributes are accessible directly from Python.
“Set” accessors should never be provided for @code{readonly} attributes.

The IDL definitions do not fully embody the requirements of the W3C DOM API,
such as the notion of certain objects, such as the return value of
@code{getElementsByTagName()}, being “live”.  The Python DOM API does not require
implementations to enforce such requirements.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node xml dom minidom — Minimal DOM implementation,xml dom pulldom — Support for building partial DOM trees,xml dom — The Document Object Model API,Structured Markup Processing Tools
@anchor{library/xml dom minidom doc}@anchor{3e41}@anchor{library/xml dom minidom module-xml dom minidom}@anchor{129}@anchor{library/xml dom minidom translation-repo}@anchor{3e42}@anchor{library/xml dom minidom xml-dom-minidom-minimal-dom-implementation}@anchor{3e43}
@subsection @code{xml.dom.minidom} — Minimal DOM implementation


@geindex module; xml.dom.minidom

`Source code:' Lib/xml/dom/minidom.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/xml/dom/minidom.py}


__________________________________________________________________


@code{xml.dom.minidom} is a minimal implementation of the Document Object
Model interface, with an API similar to that in other languages.  It is intended
to be simpler than the full DOM and also significantly smaller.  Users who are
not already proficient with the DOM should consider using the
@ref{12c,,xml.etree.ElementTree} module for their XML processing instead.

@cartouche
@quotation Note 
If you need to parse untrusted or unauthenticated data, see
@ref{3d6e,,XML security}.
@end quotation
@end cartouche

DOM applications typically start by parsing some XML into a DOM.  With
@code{xml.dom.minidom}, this is done through the parse functions:

@example
from xml.dom.minidom import parse, parseString

dom1 = parse('c:\\temp\\mydata.xml')  # parse an XML file by name

datasource = open('c:\\temp\\mydata.xml')
dom2 = parse(datasource)  # parse an open file

dom3 = parseString('<myxml>Some data<empty/> some more data</myxml>')
@end example

The @ref{3e44,,parse()} function can take either a filename or an open file object.

@geindex parse() (in module xml.dom.minidom)
@anchor{library/xml dom minidom xml dom minidom parse}@anchor{3e44}
@deffn {Function} xml.dom.minidom.parse (filename_or_file, parser=None, bufsize=None)

Return a @code{Document} from the given input. `filename_or_file' may be
either a file name, or a file-like object. `parser', if given, must be a SAX2
parser object. This function will change the document handler of the parser and
activate namespace support; other parser configuration (like setting an entity
resolver) must have been done in advance.
@end deffn

If you have XML in a string, you can use the @ref{3e45,,parseString()} function
instead:

@geindex parseString() (in module xml.dom.minidom)
@anchor{library/xml dom minidom xml dom minidom parseString}@anchor{3e45}
@deffn {Function} xml.dom.minidom.parseString (string, parser=None)

Return a @code{Document} that represents the `string'. This method creates an
@ref{112f,,io.StringIO} object for the string and passes that on to @ref{3e44,,parse()}.
@end deffn

Both functions return a @code{Document} object representing the content of the
document.

What the @ref{3e44,,parse()} and @ref{3e45,,parseString()} functions do is connect an XML
parser with a “DOM builder” that can accept parse events from any SAX parser and
convert them into a DOM tree.  The names of the functions are perhaps misleading,
but are easy to grasp when learning the interfaces.  The parsing of the document
will be completed before these functions return; it’s simply that these
functions do not provide a parser implementation themselves.

You can also create a @code{Document} by calling a method on a “DOM
Implementation” object.  You can get this object either by calling the
@code{getDOMImplementation()} function in the @ref{128,,xml.dom} package or the
@code{xml.dom.minidom} module.  Once you have a @code{Document}, you
can add child nodes to it to populate the DOM:

@example
from xml.dom.minidom import getDOMImplementation

impl = getDOMImplementation()

newdoc = impl.createDocument(None, "some_tag", None)
top_element = newdoc.documentElement
text = newdoc.createTextNode('Some textual content.')
top_element.appendChild(text)
@end example

Once you have a DOM document object, you can access the parts of your XML
document through its properties and methods.  These properties are defined in
the DOM specification.  The main property of the document object is the
@code{documentElement} property.  It gives you the main element in the XML
document: the one that holds all others.  Here is an example program:

@example
dom3 = parseString("<myxml>Some data</myxml>")
assert dom3.documentElement.tagName == "myxml"
@end example

When you are finished with a DOM tree, you may optionally call the
@code{unlink()} method to encourage early cleanup of the now-unneeded
objects.  @code{unlink()} is an @code{xml.dom.minidom}-specific
extension to the DOM API that renders the node and its descendants
essentially useless.  Otherwise, Python’s garbage collector will
eventually take care of the objects in the tree.


@subsubheading See also



@table @asis

@item Document Object Model (DOM) Level 1 Specification@footnote{https://www.w3.org/TR/REC-DOM-Level-1/}

The W3C recommendation for the DOM supported by @code{xml.dom.minidom}.
@end table


@menu
* DOM Objects:: 
* DOM Example:: 
* minidom and the DOM standard:: 

@end menu

@node DOM Objects,DOM Example,,xml dom minidom — Minimal DOM implementation
@anchor{library/xml dom minidom dom-objects}@anchor{3e46}@anchor{library/xml dom minidom minidom-objects}@anchor{3e47}
@subsubsection DOM Objects


The definition of the DOM API for Python is given as part of the @ref{128,,xml.dom}
module documentation.  This section lists the differences between the API and
@code{xml.dom.minidom}.

@geindex unlink() (xml.dom.minidom.Node method)
@anchor{library/xml dom minidom xml dom minidom Node unlink}@anchor{3e48}
@deffn {Method} Node.unlink ()

Break internal references within the DOM so that it will be garbage collected on
versions of Python without cyclic GC.  Even when cyclic GC is available, using
this can make large amounts of memory available sooner, so calling this on DOM
objects as soon as they are no longer needed is good practice.  This only needs
to be called on the @code{Document} object, but may be called on child nodes
to discard children of that node.

You can avoid calling this method explicitly by using the @ref{187,,with}
statement. The following code will automatically unlink `dom' when the
@code{with} block is exited:

@example
with xml.dom.minidom.parse(datasource) as dom:
    ... # Work with dom.
@end example
@end deffn

@geindex writexml() (xml.dom.minidom.Node method)
@anchor{library/xml dom minidom xml dom minidom Node writexml}@anchor{c8f}
@deffn {Method} Node.writexml (writer, indent='@w{'}, addindent='@w{'}, newl='@w{'}, encoding=None, standalone=None)

Write XML to the writer object.  The writer receives texts but not bytes as input,
it should have a @code{write()} method which matches that of the file object
interface.  The `indent' parameter is the indentation of the current node.
The `addindent' parameter is the incremental indentation to use for subnodes
of the current one.  The `newl' parameter specifies the string to use to
terminate newlines.

For the @code{Document} node, an additional keyword argument `encoding' can
be used to specify the encoding field of the XML header.

Similarly, explicitly stating the `standalone' argument causes the
standalone document declarations to be added to the prologue of the XML
document.
If the value is set to @code{True}, @code{standalone="yes"} is added,
otherwise it is set to @code{"no"}.
Not stating the argument will omit the declaration from the document.


Changed in version 3.8: The @code{writexml()} method now preserves the attribute order specified
by the user.



Changed in version 3.9: The `standalone' parameter was added.

@end deffn

@geindex toxml() (xml.dom.minidom.Node method)
@anchor{library/xml dom minidom xml dom minidom Node toxml}@anchor{c90}
@deffn {Method} Node.toxml (encoding=None, standalone=None)

Return a string or byte string containing the XML represented by
the DOM node.

With an explicit `encoding' @footnote{
The encoding name included in the XML output should conform to
the appropriate standards. For example, “UTF-8” is valid, but
“UTF8” is not valid in an XML document’s declaration, even though
Python accepts it as an encoding name.
See @indicateurl{https://www.w3.org/TR/2006/REC-xml11-20060816/#NT-EncodingDecl}
and @indicateurl{https://www.iana.org/assignments/character-sets/character-sets.xhtml}.
} argument, the result is a byte
string in the specified encoding.
With no `encoding' argument, the result is a Unicode string, and the
XML declaration in the resulting string does not specify an
encoding. Encoding this string in an encoding other than UTF-8 is
likely incorrect, since UTF-8 is the default encoding of XML.

The `standalone' argument behaves exactly as in @ref{c8f,,writexml()}.


Changed in version 3.8: The @code{toxml()} method now preserves the attribute order specified
by the user.



Changed in version 3.9: The `standalone' parameter was added.

@end deffn

@geindex toprettyxml() (xml.dom.minidom.Node method)
@anchor{library/xml dom minidom xml dom minidom Node toprettyxml}@anchor{c91}
@deffn {Method} Node.toprettyxml (indent='\t', newl='\n', encoding=None, standalone=None)

Return a pretty-printed version of the document. `indent' specifies the
indentation string and defaults to a tabulator; `newl' specifies the string
emitted at the end of each line and defaults to @code{\n}.

The `encoding' argument behaves like the corresponding argument of
@ref{c90,,toxml()}.

The `standalone' argument behaves exactly as in @ref{c8f,,writexml()}.


Changed in version 3.8: The @code{toprettyxml()} method now preserves the attribute order specified
by the user.



Changed in version 3.9: The `standalone' parameter was added.

@end deffn

@node DOM Example,minidom and the DOM standard,DOM Objects,xml dom minidom — Minimal DOM implementation
@anchor{library/xml dom minidom dom-example}@anchor{3e49}@anchor{library/xml dom minidom id2}@anchor{3e4a}
@subsubsection DOM Example


This example program is a fairly realistic example of a simple program. In this
particular case, we do not take much advantage of the flexibility of the DOM.

@example
import xml.dom.minidom

document = """\
<slideshow>
<title>Demo slideshow</title>
<slide><title>Slide title</title>
<point>This is a demo</point>
<point>Of a program for processing slides</point>
</slide>

<slide><title>Another demo slide</title>
<point>It is important</point>
<point>To have more than</point>
<point>one slide</point>
</slide>
</slideshow>
"""

dom = xml.dom.minidom.parseString(document)

def getText(nodelist):
    rc = []
    for node in nodelist:
        if node.nodeType == node.TEXT_NODE:
            rc.append(node.data)
    return '@w{'}.join(rc)

def handleSlideshow(slideshow):
    print("<html>")
    handleSlideshowTitle(slideshow.getElementsByTagName("title")[0])
    slides = slideshow.getElementsByTagName("slide")
    handleToc(slides)
    handleSlides(slides)
    print("</html>")

def handleSlides(slides):
    for slide in slides:
        handleSlide(slide)

def handleSlide(slide):
    handleSlideTitle(slide.getElementsByTagName("title")[0])
    handlePoints(slide.getElementsByTagName("point"))

def handleSlideshowTitle(title):
    print(f"<title>@{getText(title.childNodes)@}</title>")

def handleSlideTitle(title):
    print(f"<h2>@{getText(title.childNodes)@}</h2>")

def handlePoints(points):
    print("<ul>")
    for point in points:
        handlePoint(point)
    print("</ul>")

def handlePoint(point):
    print(f"<li>@{getText(point.childNodes)@}</li>")

def handleToc(slides):
    for slide in slides:
        title = slide.getElementsByTagName("title")[0]
        print(f"<p>@{getText(title.childNodes)@}</p>")

handleSlideshow(dom)
@end example

@node minidom and the DOM standard,,DOM Example,xml dom minidom — Minimal DOM implementation
@anchor{library/xml dom minidom minidom-and-dom}@anchor{3e4b}@anchor{library/xml dom minidom minidom-and-the-dom-standard}@anchor{3e4c}
@subsubsection minidom and the DOM standard


The @code{xml.dom.minidom} module is essentially a DOM 1.0-compatible DOM with
some DOM 2 features (primarily namespace features).

Usage of the DOM interface in Python is straight-forward.  The following mapping
rules apply:


@itemize *

@item 
Interfaces are accessed through instance objects. Applications should not
instantiate the classes themselves; they should use the creator functions
available on the @code{Document} object. Derived interfaces support all
operations (and attributes) from the base interfaces, plus any new operations.

@item 
Operations are used as methods. Since the DOM uses only @ref{349,,in}
parameters, the arguments are passed in normal order (from left to right).
There are no optional arguments. @code{void} operations return @code{None}.

@item 
IDL attributes map to instance attributes. For compatibility with the OMG IDL
language mapping for Python, an attribute @code{foo} can also be accessed through
accessor methods @code{_get_foo()} and @code{_set_foo()}.  @code{readonly}
attributes must not be changed; this is not enforced at runtime.

@item 
The types @code{short int}, @code{unsigned int}, @code{unsigned long long}, and
@code{boolean} all map to Python integer objects.

@item 
The type @code{DOMString} maps to Python strings. @code{xml.dom.minidom} supports
either bytes or strings, but will normally produce strings.
Values of type @code{DOMString} may also be @code{None} where allowed to have the IDL
@code{null} value by the DOM specification from the W3C.

@item 
@code{const} declarations map to variables in their respective scope (e.g.
@code{xml.dom.minidom.Node.PROCESSING_INSTRUCTION_NODE}); they must not be changed.

@item 
@code{DOMException} is currently not supported in @code{xml.dom.minidom}.
Instead, @code{xml.dom.minidom} uses standard Python exceptions such as
@ref{199,,TypeError} and @ref{5f0,,AttributeError}.

@item 
@code{NodeList} objects are implemented using Python’s built-in list type.
These objects provide the interface defined in the DOM specification, but with
earlier versions of Python they do not support the official API.  They are,
however, much more “Pythonic” than the interface defined in the W3C
recommendations.
@end itemize

The following interfaces have no implementation in @code{xml.dom.minidom}:


@itemize *

@item 
@code{DOMTimeStamp}

@item 
@code{EntityReference}
@end itemize

Most of these reflect information in the XML document that is not of general
utility to most DOM users.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node xml dom pulldom — Support for building partial DOM trees,xml sax — Support for SAX2 parsers,xml dom minidom — Minimal DOM implementation,Structured Markup Processing Tools
@anchor{library/xml dom pulldom doc}@anchor{3e4d}@anchor{library/xml dom pulldom module-xml dom pulldom}@anchor{12a}@anchor{library/xml dom pulldom translation-repo}@anchor{3e4e}@anchor{library/xml dom pulldom xml-dom-pulldom-support-for-building-partial-dom-trees}@anchor{3e4f}
@subsection @code{xml.dom.pulldom} — Support for building partial DOM trees


@geindex module; xml.dom.pulldom

`Source code:' Lib/xml/dom/pulldom.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/xml/dom/pulldom.py}


__________________________________________________________________


The @code{xml.dom.pulldom} module provides a “pull parser” which can also be
asked to produce DOM-accessible fragments of the document where necessary. The
basic concept involves pulling “events” from a stream of incoming XML and
processing them. In contrast to SAX which also employs an event-driven
processing model together with callbacks, the user of a pull parser is
responsible for explicitly pulling events from the stream, looping over those
events until either processing is finished or an error condition occurs.

@cartouche
@quotation Note 
If you need to parse untrusted or unauthenticated data, see
@ref{3d6e,,XML security}.
@end quotation
@end cartouche


Changed in version 3.7.1: The SAX parser no longer processes general external entities by default to
increase security by default. To enable processing of external entities,
pass a custom parser instance in:

@example
from xml.dom.pulldom import parse
from xml.sax import make_parser
from xml.sax.handler import feature_external_ges

parser = make_parser()
parser.setFeature(feature_external_ges, True)
parse(filename, parser=parser)
@end example


Example:

@example
from xml.dom import pulldom

doc = pulldom.parse('sales_items.xml')
for event, node in doc:
    if event == pulldom.START_ELEMENT and node.tagName == 'item':
        if int(node.getAttribute('price')) > 50:
            doc.expandNode(node)
            print(node.toxml())
@end example

@code{event} is a constant and can be one of:


@itemize *

@item 
@code{START_ELEMENT}

@item 
@code{END_ELEMENT}

@item 
@code{COMMENT}

@item 
@code{START_DOCUMENT}

@item 
@code{END_DOCUMENT}

@item 
@code{CHARACTERS}

@item 
@code{PROCESSING_INSTRUCTION}

@item 
@code{IGNORABLE_WHITESPACE}
@end itemize

@code{node} is an object of type @code{xml.dom.minidom.Document},
@code{xml.dom.minidom.Element} or @code{xml.dom.minidom.Text}.

Since the document is treated as a “flat” stream of events, the document “tree”
is implicitly traversed and the desired elements are found regardless of their
depth in the tree. In other words, one does not need to consider hierarchical
issues such as recursive searching of the document nodes, although if the
context of elements were important, one would either need to maintain some
context-related state (i.e. remembering where one is in the document at any
given point) or to make use of the @ref{3e50,,DOMEventStream.expandNode()} method
and switch to DOM-related processing.

@geindex PullDOM (class in xml.dom.pulldom)
@anchor{library/xml dom pulldom xml dom pulldom PullDOM}@anchor{3e51}
@deffn {Class} xml.dom.pulldom.PullDOM (documentFactory=None)

Subclass of @ref{3e52,,xml.sax.handler.ContentHandler}.
@end deffn

@geindex SAX2DOM (class in xml.dom.pulldom)
@anchor{library/xml dom pulldom xml dom pulldom SAX2DOM}@anchor{3e53}
@deffn {Class} xml.dom.pulldom.SAX2DOM (documentFactory=None)

Subclass of @ref{3e52,,xml.sax.handler.ContentHandler}.
@end deffn

@geindex parse() (in module xml.dom.pulldom)
@anchor{library/xml dom pulldom xml dom pulldom parse}@anchor{3e54}
@deffn {Function} xml.dom.pulldom.parse (stream_or_string, parser=None, bufsize=None)

Return a @ref{943,,DOMEventStream} from the given input. `stream_or_string' may be
either a file name, or a file-like object. `parser', if given, must be an
@ref{3e55,,XMLReader} object. This function will change the
document handler of the
parser and activate namespace support; other parser configuration (like
setting an entity resolver) must have been done in advance.
@end deffn

If you have XML in a string, you can use the @ref{3e56,,parseString()} function instead:

@geindex parseString() (in module xml.dom.pulldom)
@anchor{library/xml dom pulldom xml dom pulldom parseString}@anchor{3e56}
@deffn {Function} xml.dom.pulldom.parseString (string, parser=None)

Return a @ref{943,,DOMEventStream} that represents the (Unicode) `string'.
@end deffn

@geindex default_bufsize (in module xml.dom.pulldom)
@anchor{library/xml dom pulldom xml dom pulldom default_bufsize}@anchor{3e57}
@deffn {Data} xml.dom.pulldom.default_bufsize

Default value for the `bufsize' parameter to @ref{3e54,,parse()}.

The value of this variable can be changed before calling @ref{3e54,,parse()} and
the new value will take effect.
@end deffn

@menu
* DOMEventStream Objects:: 

@end menu

@node DOMEventStream Objects,,,xml dom pulldom — Support for building partial DOM trees
@anchor{library/xml dom pulldom domeventstream-objects}@anchor{3e58}@anchor{library/xml dom pulldom id1}@anchor{3e59}
@subsubsection DOMEventStream Objects


@geindex DOMEventStream (class in xml.dom.pulldom)
@anchor{library/xml dom pulldom xml dom pulldom DOMEventStream}@anchor{943}
@deffn {Class} xml.dom.pulldom.DOMEventStream (stream, parser, bufsize)


Changed in version 3.11: Support for @ref{588,,__getitem__()} method has been removed.


@geindex getEvent() (xml.dom.pulldom.DOMEventStream method)
@anchor{library/xml dom pulldom xml dom pulldom DOMEventStream getEvent}@anchor{3e5a}
@deffn {Method} getEvent ()

Return a tuple containing `event' and the current `node' as
@code{xml.dom.minidom.Document} if event equals @code{START_DOCUMENT},
@code{xml.dom.minidom.Element} if event equals @code{START_ELEMENT} or
@code{END_ELEMENT} or @code{xml.dom.minidom.Text} if event equals
@code{CHARACTERS}.
The current node does not contain information about its children, unless
@ref{3e50,,expandNode()} is called.
@end deffn

@geindex expandNode() (xml.dom.pulldom.DOMEventStream method)
@anchor{library/xml dom pulldom xml dom pulldom DOMEventStream expandNode}@anchor{3e50}
@deffn {Method} expandNode (node)

Expands all children of `node' into `node'. Example:

@example
from xml.dom import pulldom

xml = '<html><title>Foo</title> <p>Some text <div>and more</div></p> </html>'
doc = pulldom.parseString(xml)
for event, node in doc:
    if event == pulldom.START_ELEMENT and node.tagName == 'p':
        # Following statement only prints '<p/>'
        print(node.toxml())
        doc.expandNode(node)
        # Following statement prints node with all its children '<p>Some text <div>and more</div></p>'
        print(node.toxml())
@end example
@end deffn

@geindex reset() (xml.dom.pulldom.DOMEventStream method)
@anchor{library/xml dom pulldom xml dom pulldom DOMEventStream reset}@anchor{3e5b}
@deffn {Method} reset ()
@end deffn
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node xml sax — Support for SAX2 parsers,xml sax handler — Base classes for SAX handlers,xml dom pulldom — Support for building partial DOM trees,Structured Markup Processing Tools
@anchor{library/xml sax doc}@anchor{3e5c}@anchor{library/xml sax module-xml sax}@anchor{130}@anchor{library/xml sax translation-repo}@anchor{3e5d}@anchor{library/xml sax xml-sax-support-for-sax2-parsers}@anchor{3e5e}
@subsection @code{xml.sax} — Support for SAX2 parsers


@geindex module; xml.sax

`Source code:' Lib/xml/sax/__init__.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/xml/sax/__init__.py}


__________________________________________________________________


The @code{xml.sax} package provides a number of modules which implement the
Simple API for XML (SAX) interface for Python.  The package itself provides the
SAX exceptions and the convenience functions which will be most used by users of
the SAX API.

@cartouche
@quotation Note 
If you need to parse untrusted or unauthenticated data, see
@ref{3d6e,,XML security}.
@end quotation
@end cartouche


Changed in version 3.7.1: The SAX parser no longer processes general external entities by default
to increase security. Before, the parser created network connections
to fetch remote files or loaded local files from the file
system for DTD and entities. The feature can be enabled again with method
@ref{3e5f,,setFeature()} on the parser object
and argument @ref{181c,,feature_external_ges}.


The convenience functions are:

@geindex make_parser() (in module xml.sax)
@anchor{library/xml sax xml sax make_parser}@anchor{1e5e}
@deffn {Function} xml.sax.make_parser (parser_list=[])

Create and return a SAX @ref{3e55,,XMLReader} object.  The
first parser found will
be used.  If `parser_list' is provided, it must be an iterable of strings which
name modules that have a function named @code{create_parser()}.  Modules listed
in `parser_list' will be used before modules in the default list of parsers.


Changed in version 3.8: The `parser_list' argument can be any iterable, not just a list.

@end deffn

@geindex parse() (in module xml.sax)
@anchor{library/xml sax xml sax parse}@anchor{1e29}
@deffn {Function} xml.sax.parse (filename_or_stream, handler, error_handler=handler.ErrorHandler())

Create a SAX parser and use it to parse a document.  The document, passed in as
`filename_or_stream', can be a filename or a file object.  The `handler'
parameter needs to be a SAX @ref{3e52,,ContentHandler} instance.  If
`error_handler' is given, it must be a SAX @ref{3e60,,ErrorHandler}
instance; if
omitted,  @ref{3e61,,SAXParseException} will be raised on all errors.  There is no
return value; all work must be done by the `handler' passed in.
@end deffn

@geindex parseString() (in module xml.sax)
@anchor{library/xml sax xml sax parseString}@anchor{10a2}
@deffn {Function} xml.sax.parseString (string, handler, error_handler=handler.ErrorHandler())

Similar to @ref{1e29,,parse()}, but parses from a buffer `string' received as a
parameter.  `string' must be a @ref{16a,,str} instance or a
@ref{194,,bytes-like object}.


Changed in version 3.5: Added support of @ref{16a,,str} instances.

@end deffn

A typical SAX application uses three kinds of objects: readers, handlers and
input sources.  “Reader” in this context is another term for parser, i.e. some
piece of code that reads the bytes or characters from the input source, and
produces a sequence of events. The events then get distributed to the handler
objects, i.e. the reader invokes a method on the handler.  A SAX application
must therefore obtain a reader object, create or open the input sources, create
the handlers, and connect these objects all together.  As the final step of
preparation, the reader is called to parse the input. During parsing, methods on
the handler objects are called based on structural and syntactic events from the
input data.

For these objects, only the interfaces are relevant; they are normally not
instantiated by the application itself.  Since Python does not have an explicit
notion of interface, they are formally introduced as classes, but applications
may use implementations which do not inherit from the provided classes.  The
@ref{10a1,,InputSource}, @ref{3e62,,Locator},
@code{Attributes}, @code{AttributesNS},
and @ref{3e55,,XMLReader} interfaces are defined in the
module @ref{133,,xml.sax.xmlreader}.  The handler interfaces are defined in
@ref{131,,xml.sax.handler}.  For convenience,
@code{InputSource} (which is often
instantiated directly) and the handler classes are also available from
@code{xml.sax}.  These interfaces are described below.

In addition to these classes, @code{xml.sax} provides the following exception
classes.

@geindex SAXException
@anchor{library/xml sax xml sax SAXException}@anchor{3e63}
@deffn {Exception} xml.sax.SAXException (msg, exception=None)

Encapsulate an XML error or warning.  This class can contain basic error or
warning information from either the XML parser or the application: it can be
subclassed to provide additional functionality or to add localization.  Note
that although the handlers defined in the
@ref{3e60,,ErrorHandler} interface
receive instances of this exception, it is not required to actually raise the
exception — it is also useful as a container for information.

When instantiated, `msg' should be a human-readable description of the error.
The optional `exception' parameter, if given, should be @code{None} or an exception
that was caught by the parsing code and is being passed along as information.

This is the base class for the other SAX exception classes.
@end deffn

@geindex SAXParseException
@anchor{library/xml sax xml sax SAXParseException}@anchor{3e61}
@deffn {Exception} xml.sax.SAXParseException (msg, exception, locator)

Subclass of @ref{3e63,,SAXException} raised on parse errors. Instances of this
class are passed to the methods of the SAX
@ref{3e60,,ErrorHandler} interface to provide information
about the parse error.  This class supports the SAX
@ref{3e62,,Locator} interface as well as the
@ref{3e63,,SAXException} interface.
@end deffn

@geindex SAXNotRecognizedException
@anchor{library/xml sax xml sax SAXNotRecognizedException}@anchor{3e64}
@deffn {Exception} xml.sax.SAXNotRecognizedException (msg, exception=None)

Subclass of @ref{3e63,,SAXException} raised when a SAX
@ref{3e55,,XMLReader} is
confronted with an unrecognized feature or property.  SAX applications and
extensions may use this class for similar purposes.
@end deffn

@geindex SAXNotSupportedException
@anchor{library/xml sax xml sax SAXNotSupportedException}@anchor{3e65}
@deffn {Exception} xml.sax.SAXNotSupportedException (msg, exception=None)

Subclass of @ref{3e63,,SAXException} raised when a SAX
@ref{3e55,,XMLReader} is asked to
enable a feature that is not supported, or to set a property to a value that the
implementation does not support.  SAX applications and extensions may use this
class for similar purposes.
@end deffn


@subsubheading See also



@table @asis

@item SAX: The Simple API for XML@footnote{http://www.saxproject.org/}

This site is the focal point for the definition of the SAX API.  It provides a
Java implementation and online documentation.  Links to implementations and
historical information are also available.

@item Module @ref{131,,xml.sax.handler}

Definitions of the interfaces for application-provided objects.

@item Module @ref{132,,xml.sax.saxutils}

Convenience functions for use in SAX applications.

@item Module @ref{133,,xml.sax.xmlreader}

Definitions of the interfaces for parser-provided objects.
@end table


@menu
* SAXException Objects:: 

@end menu

@node SAXException Objects,,,xml sax — Support for SAX2 parsers
@anchor{library/xml sax sax-exception-objects}@anchor{3e66}@anchor{library/xml sax saxexception-objects}@anchor{3e67}
@subsubsection SAXException Objects


The @ref{3e63,,SAXException} exception class supports the following methods:

@geindex getMessage() (xml.sax.SAXException method)
@anchor{library/xml sax xml sax SAXException getMessage}@anchor{3e68}
@deffn {Method} SAXException.getMessage ()

Return a human-readable message describing the error condition.
@end deffn

@geindex getException() (xml.sax.SAXException method)
@anchor{library/xml sax xml sax SAXException getException}@anchor{3e69}
@deffn {Method} SAXException.getException ()

Return an encapsulated exception object, or @code{None}.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node xml sax handler — Base classes for SAX handlers,xml sax saxutils — SAX Utilities,xml sax — Support for SAX2 parsers,Structured Markup Processing Tools
@anchor{library/xml sax handler doc}@anchor{3e6a}@anchor{library/xml sax handler module-xml sax handler}@anchor{131}@anchor{library/xml sax handler translation-repo}@anchor{3e6b}@anchor{library/xml sax handler xml-sax-handler-base-classes-for-sax-handlers}@anchor{3e6c}
@subsection @code{xml.sax.handler} — Base classes for SAX handlers


@geindex module; xml.sax.handler

`Source code:' Lib/xml/sax/handler.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/xml/sax/handler.py}


__________________________________________________________________


The SAX API defines five kinds of handlers: content handlers, DTD handlers,
error handlers, entity resolvers and lexical handlers. Applications normally
only need to implement those interfaces whose events they are interested in;
they can implement the interfaces in a single object or in multiple objects.
Handler implementations should inherit from the base classes provided in the
module @code{xml.sax.handler}, so that all methods get default implementations.

@geindex ContentHandler (class in xml.sax.handler)
@anchor{library/xml sax handler xml sax handler ContentHandler}@anchor{3e52}
@deffn {Class} xml.sax.handler.ContentHandler

This is the main callback interface in SAX, and the one most important to
applications. The order of events in this interface mirrors the order of the
information in the document.
@end deffn

@geindex DTDHandler (class in xml.sax.handler)
@anchor{library/xml sax handler xml sax handler DTDHandler}@anchor{3e6d}
@deffn {Class} xml.sax.handler.DTDHandler

Handle DTD events.

This interface specifies only those DTD events required for basic parsing
(unparsed entities and attributes).
@end deffn

@geindex EntityResolver (class in xml.sax.handler)
@anchor{library/xml sax handler xml sax handler EntityResolver}@anchor{3e6e}
@deffn {Class} xml.sax.handler.EntityResolver

Basic interface for resolving entities. If you create an object implementing
this interface, then register the object with your Parser, the parser will call
the method in your object to resolve all external entities.
@end deffn

@geindex ErrorHandler (class in xml.sax.handler)
@anchor{library/xml sax handler xml sax handler ErrorHandler}@anchor{3e60}
@deffn {Class} xml.sax.handler.ErrorHandler

Interface used by the parser to present error and warning messages to the
application.  The methods of this object control whether errors are immediately
converted to exceptions or are handled in some other way.
@end deffn

@geindex LexicalHandler (class in xml.sax.handler)
@anchor{library/xml sax handler xml sax handler LexicalHandler}@anchor{a62}
@deffn {Class} xml.sax.handler.LexicalHandler

Interface used by the parser to represent low frequency events which may not
be of interest to many applications.
@end deffn

In addition to these classes, @code{xml.sax.handler} provides symbolic constants
for the feature and property names.

@geindex feature_namespaces (in module xml.sax.handler)
@anchor{library/xml sax handler xml sax handler feature_namespaces}@anchor{3e6f}
@deffn {Data} xml.sax.handler.feature_namespaces


@display
value: @code{"http://xml.org/sax/features/namespaces"}@w{ }
true: Perform Namespace processing.@w{ }
false: Optionally do not perform Namespace processing (implies namespace-prefixes; default).@w{ }
access: (parsing) read-only; (not parsing) read/write@w{ }
@end display


@end deffn

@geindex feature_namespace_prefixes (in module xml.sax.handler)
@anchor{library/xml sax handler xml sax handler feature_namespace_prefixes}@anchor{3e70}
@deffn {Data} xml.sax.handler.feature_namespace_prefixes


@display
value: @code{"http://xml.org/sax/features/namespace-prefixes"}@w{ }
true: Report the original prefixed names and attributes used for Namespace declarations.@w{ }
false: Do not report attributes used for Namespace declarations, and optionally do not report original prefixed names (default).@w{ }
access: (parsing) read-only; (not parsing) read/write@w{ }
@end display


@end deffn

@geindex feature_string_interning (in module xml.sax.handler)
@anchor{library/xml sax handler xml sax handler feature_string_interning}@anchor{3e71}
@deffn {Data} xml.sax.handler.feature_string_interning


@display
value: @code{"http://xml.org/sax/features/string-interning"}@w{ }
true: All element names, prefixes, attribute names, Namespace URIs, and local names are interned using the built-in intern function.@w{ }
false: Names are not necessarily interned, although they may be (default).@w{ }
access: (parsing) read-only; (not parsing) read/write@w{ }
@end display


@end deffn

@geindex feature_validation (in module xml.sax.handler)
@anchor{library/xml sax handler xml sax handler feature_validation}@anchor{3e72}
@deffn {Data} xml.sax.handler.feature_validation


@display
value: @code{"http://xml.org/sax/features/validation"}@w{ }
true: Report all validation errors (implies external-general-entities and external-parameter-entities).@w{ }
false: Do not report validation errors.@w{ }
access: (parsing) read-only; (not parsing) read/write@w{ }
@end display


@end deffn

@geindex feature_external_ges (in module xml.sax.handler)
@anchor{library/xml sax handler xml sax handler feature_external_ges}@anchor{181c}
@deffn {Data} xml.sax.handler.feature_external_ges

@cartouche
@quotation Warning 
Enabling opens a vulnerability to
external entity attacks@footnote{https://en.wikipedia.org/wiki/XML_external_entity_attack}
if the parser is used with user-provided XML content.
Please reflect on your threat model@footnote{https://en.wikipedia.org/wiki/Threat_model}
before enabling this feature.
@end quotation
@end cartouche


@display
value: @code{"http://xml.org/sax/features/external-general-entities"}@w{ }
true: Include all external general (text) entities.@w{ }
false: Do not include external general entities.@w{ }
access: (parsing) read-only; (not parsing) read/write@w{ }
@end display


@end deffn

@geindex feature_external_pes (in module xml.sax.handler)
@anchor{library/xml sax handler xml sax handler feature_external_pes}@anchor{3e73}
@deffn {Data} xml.sax.handler.feature_external_pes


@display
value: @code{"http://xml.org/sax/features/external-parameter-entities"}@w{ }
true: Include all external parameter entities, including the external DTD subset.@w{ }
false: Do not include any external parameter entities, even the external DTD subset.@w{ }
access: (parsing) read-only; (not parsing) read/write@w{ }
@end display


@end deffn

@geindex all_features (in module xml.sax.handler)
@anchor{library/xml sax handler xml sax handler all_features}@anchor{3e74}
@deffn {Data} xml.sax.handler.all_features

List of all features.
@end deffn

@geindex property_lexical_handler (in module xml.sax.handler)
@anchor{library/xml sax handler xml sax handler property_lexical_handler}@anchor{3e75}
@deffn {Data} xml.sax.handler.property_lexical_handler


@display
value: @code{"http://xml.org/sax/properties/lexical-handler"}@w{ }
data type: xml.sax.handler.LexicalHandler (not supported in Python 2)@w{ }
description: An optional extension handler for lexical events like comments.@w{ }
access: read/write@w{ }
@end display


@end deffn

@geindex property_declaration_handler (in module xml.sax.handler)
@anchor{library/xml sax handler xml sax handler property_declaration_handler}@anchor{3e76}
@deffn {Data} xml.sax.handler.property_declaration_handler


@display
value: @code{"http://xml.org/sax/properties/declaration-handler"}@w{ }
data type: xml.sax.sax2lib.DeclHandler (not supported in Python 2)@w{ }
description: An optional extension handler for DTD-related events other than notations and unparsed entities.@w{ }
access: read/write@w{ }
@end display


@end deffn

@geindex property_dom_node (in module xml.sax.handler)
@anchor{library/xml sax handler xml sax handler property_dom_node}@anchor{3e77}
@deffn {Data} xml.sax.handler.property_dom_node


@display
value: @code{"http://xml.org/sax/properties/dom-node"}@w{ }
data type: org.w3c.dom.Node (not supported in Python 2)@w{ }
description: When parsing, the current DOM node being visited if this is a DOM iterator; when not parsing, the root DOM node for iteration.@w{ }
access: (parsing) read-only; (not parsing) read/write@w{ }
@end display


@end deffn

@geindex property_xml_string (in module xml.sax.handler)
@anchor{library/xml sax handler xml sax handler property_xml_string}@anchor{3e78}
@deffn {Data} xml.sax.handler.property_xml_string


@display
value: @code{"http://xml.org/sax/properties/xml-string"}@w{ }
data type: Bytes@w{ }
description: The literal string of characters that was the source for the current event.@w{ }
access: read-only@w{ }
@end display


@end deffn

@geindex all_properties (in module xml.sax.handler)
@anchor{library/xml sax handler xml sax handler all_properties}@anchor{3e79}
@deffn {Data} xml.sax.handler.all_properties

List of all known property names.
@end deffn

@menu
* ContentHandler Objects:: 
* DTDHandler Objects:: 
* EntityResolver Objects:: 
* ErrorHandler Objects:: 
* LexicalHandler Objects:: 

@end menu

@node ContentHandler Objects,DTDHandler Objects,,xml sax handler — Base classes for SAX handlers
@anchor{library/xml sax handler content-handler-objects}@anchor{3e7a}@anchor{library/xml sax handler contenthandler-objects}@anchor{3e7b}
@subsubsection ContentHandler Objects


Users are expected to subclass @ref{3e52,,ContentHandler} to support their
application.  The following methods are called by the parser on the appropriate
events in the input document:

@geindex setDocumentLocator() (xml.sax.handler.ContentHandler method)
@anchor{library/xml sax handler xml sax handler ContentHandler setDocumentLocator}@anchor{3e7c}
@deffn {Method} ContentHandler.setDocumentLocator (locator)

Called by the parser to give the application a locator for locating the origin
of document events.

SAX parsers are strongly encouraged (though not absolutely required) to supply a
locator: if it does so, it must supply the locator to the application by
invoking this method before invoking any of the other methods in the
DocumentHandler interface.

The locator allows the application to determine the end position of any
document-related event, even if the parser is not reporting an error. Typically,
the application will use this information for reporting its own errors (such as
character content that does not match an application’s business rules). The
information returned by the locator is probably not sufficient for use with a
search engine.

Note that the locator will return correct information only during the invocation
of the events in this interface. The application should not attempt to use it at
any other time.
@end deffn

@geindex startDocument() (xml.sax.handler.ContentHandler method)
@anchor{library/xml sax handler xml sax handler ContentHandler startDocument}@anchor{3e7d}
@deffn {Method} ContentHandler.startDocument ()

Receive notification of the beginning of a document.

The SAX parser will invoke this method only once, before any other methods in
this interface or in DTDHandler (except for @ref{3e7c,,setDocumentLocator()}).
@end deffn

@geindex endDocument() (xml.sax.handler.ContentHandler method)
@anchor{library/xml sax handler xml sax handler ContentHandler endDocument}@anchor{3e7e}
@deffn {Method} ContentHandler.endDocument ()

Receive notification of the end of a document.

The SAX parser will invoke this method only once, and it will be the last method
invoked during the parse. The parser shall not invoke this method until it has
either abandoned parsing (because of an unrecoverable error) or reached the end
of input.
@end deffn

@geindex startPrefixMapping() (xml.sax.handler.ContentHandler method)
@anchor{library/xml sax handler xml sax handler ContentHandler startPrefixMapping}@anchor{3e7f}
@deffn {Method} ContentHandler.startPrefixMapping (prefix, uri)

Begin the scope of a prefix-URI Namespace mapping.

The information from this event is not necessary for normal Namespace
processing: the SAX XML reader will automatically replace prefixes for element
and attribute names when the @code{feature_namespaces} feature is enabled (the
default).

There are cases, however, when applications need to use prefixes in character
data or in attribute values, where they cannot safely be expanded automatically;
the @code{startPrefixMapping()} and @ref{3e80,,endPrefixMapping()} events supply the
information to the application to expand prefixes in those contexts itself, if
necessary.

@c XXX This is not really the default, is it? MvL

Note that @code{startPrefixMapping()} and @ref{3e80,,endPrefixMapping()} events are not
guaranteed to be properly nested relative to each-other: all
@code{startPrefixMapping()} events will occur before the corresponding
@ref{174f,,startElement()} event, and all @code{endPrefixMapping()} events will occur
after the corresponding @ref{1750,,endElement()} event, but their order is not
guaranteed.
@end deffn

@geindex endPrefixMapping() (xml.sax.handler.ContentHandler method)
@anchor{library/xml sax handler xml sax handler ContentHandler endPrefixMapping}@anchor{3e80}
@deffn {Method} ContentHandler.endPrefixMapping (prefix)

End the scope of a prefix-URI mapping.

See @ref{3e7f,,startPrefixMapping()} for details. This event will always occur after
the corresponding @ref{1750,,endElement()} event, but the order of
@code{endPrefixMapping()} events is not otherwise guaranteed.
@end deffn

@geindex startElement() (xml.sax.handler.ContentHandler method)
@anchor{library/xml sax handler xml sax handler ContentHandler startElement}@anchor{174f}
@deffn {Method} ContentHandler.startElement (name, attrs)

Signals the start of an element in non-namespace mode.

The `name' parameter contains the raw XML 1.0 name of the element type as a
string and the `attrs' parameter holds an object of the
@ref{3e81,,Attributes} interface containing the attributes of
the element.  The object passed as `attrs' may be re-used by the parser; holding
on to a reference to it is not a reliable way to keep a copy of the attributes.
To keep a copy of the attributes, use the @ref{29,,copy()} method of the `attrs'
object.
@end deffn

@geindex endElement() (xml.sax.handler.ContentHandler method)
@anchor{library/xml sax handler xml sax handler ContentHandler endElement}@anchor{1750}
@deffn {Method} ContentHandler.endElement (name)

Signals the end of an element in non-namespace mode.

The `name' parameter contains the name of the element type, just as with the
@ref{174f,,startElement()} event.
@end deffn

@geindex startElementNS() (xml.sax.handler.ContentHandler method)
@anchor{library/xml sax handler xml sax handler ContentHandler startElementNS}@anchor{3e82}
@deffn {Method} ContentHandler.startElementNS (name, qname, attrs)

Signals the start of an element in namespace mode.

The `name' parameter contains the name of the element type as a @code{(uri,
localname)} tuple, the `qname' parameter contains the raw XML 1.0 name used in
the source document, and the `attrs' parameter holds an instance of the
@ref{3e83,,AttributesNS} interface
containing the attributes of the element.  If no namespace is associated with
the element, the `uri' component of `name' will be @code{None}.  The object passed
as `attrs' may be re-used by the parser; holding on to a reference to it is not
a reliable way to keep a copy of the attributes.  To keep a copy of the
attributes, use the @ref{29,,copy()} method of the `attrs' object.

Parsers may set the `qname' parameter to @code{None}, unless the
@code{feature_namespace_prefixes} feature is activated.
@end deffn

@geindex endElementNS() (xml.sax.handler.ContentHandler method)
@anchor{library/xml sax handler xml sax handler ContentHandler endElementNS}@anchor{3e84}
@deffn {Method} ContentHandler.endElementNS (name, qname)

Signals the end of an element in namespace mode.

The `name' parameter contains the name of the element type, just as with the
@ref{3e82,,startElementNS()} method, likewise the `qname' parameter.
@end deffn

@geindex characters() (xml.sax.handler.ContentHandler method)
@anchor{library/xml sax handler xml sax handler ContentHandler characters}@anchor{1751}
@deffn {Method} ContentHandler.characters (content)

Receive notification of character data.

The Parser will call this method to report each chunk of character data. SAX
parsers may return all contiguous character data in a single chunk, or they may
split it into several chunks; however, all of the characters in any single event
must come from the same external entity so that the Locator provides useful
information.

`content' may be a string or bytes instance; the @code{expat} reader module
always produces strings.

@cartouche
@quotation Note 
The earlier SAX 1 interface provided by the Python XML Special Interest Group
used a more Java-like interface for this method.  Since most parsers used from
Python did not take advantage of the older interface, the simpler signature was
chosen to replace it.  To convert old code to the new interface, use `content'
instead of slicing content with the old `offset' and `length' parameters.
@end quotation
@end cartouche
@end deffn

@geindex ignorableWhitespace() (xml.sax.handler.ContentHandler method)
@anchor{library/xml sax handler xml sax handler ContentHandler ignorableWhitespace}@anchor{3e85}
@deffn {Method} ContentHandler.ignorableWhitespace (whitespace)

Receive notification of ignorable whitespace in element content.

Validating Parsers must use this method to report each chunk of ignorable
whitespace (see the W3C XML 1.0 recommendation, section 2.10): non-validating
parsers may also use this method if they are capable of parsing and using
content models.

SAX parsers may return all contiguous whitespace in a single chunk, or they may
split it into several chunks; however, all of the characters in any single event
must come from the same external entity, so that the Locator provides useful
information.
@end deffn

@geindex processingInstruction() (xml.sax.handler.ContentHandler method)
@anchor{library/xml sax handler xml sax handler ContentHandler processingInstruction}@anchor{3e86}
@deffn {Method} ContentHandler.processingInstruction (target, data)

Receive notification of a processing instruction.

The Parser will invoke this method once for each processing instruction found:
note that processing instructions may occur before or after the main document
element.

A SAX parser should never report an XML declaration (XML 1.0, section 2.8) or a
text declaration (XML 1.0, section 4.3.1) using this method.
@end deffn

@geindex skippedEntity() (xml.sax.handler.ContentHandler method)
@anchor{library/xml sax handler xml sax handler ContentHandler skippedEntity}@anchor{3e87}
@deffn {Method} ContentHandler.skippedEntity (name)

Receive notification of a skipped entity.

The Parser will invoke this method once for each entity skipped. Non-validating
processors may skip entities if they have not seen the declarations (because,
for example, the entity was declared in an external DTD subset). All processors
may skip external entities, depending on the values of the
@code{feature_external_ges} and the @code{feature_external_pes} properties.
@end deffn

@node DTDHandler Objects,EntityResolver Objects,ContentHandler Objects,xml sax handler — Base classes for SAX handlers
@anchor{library/xml sax handler dtd-handler-objects}@anchor{3e88}@anchor{library/xml sax handler dtdhandler-objects}@anchor{3e89}
@subsubsection DTDHandler Objects


@ref{3e6d,,DTDHandler} instances provide the following methods:

@geindex notationDecl() (xml.sax.handler.DTDHandler method)
@anchor{library/xml sax handler xml sax handler DTDHandler notationDecl}@anchor{3e8a}
@deffn {Method} DTDHandler.notationDecl (name, publicId, systemId)

Handle a notation declaration event.
@end deffn

@geindex unparsedEntityDecl() (xml.sax.handler.DTDHandler method)
@anchor{library/xml sax handler xml sax handler DTDHandler unparsedEntityDecl}@anchor{3e8b}
@deffn {Method} DTDHandler.unparsedEntityDecl (name, publicId, systemId, ndata)

Handle an unparsed entity declaration event.
@end deffn

@node EntityResolver Objects,ErrorHandler Objects,DTDHandler Objects,xml sax handler — Base classes for SAX handlers
@anchor{library/xml sax handler entity-resolver-objects}@anchor{3e8c}@anchor{library/xml sax handler entityresolver-objects}@anchor{3e8d}
@subsubsection EntityResolver Objects


@geindex resolveEntity() (xml.sax.handler.EntityResolver method)
@anchor{library/xml sax handler xml sax handler EntityResolver resolveEntity}@anchor{3e8e}
@deffn {Method} EntityResolver.resolveEntity (publicId, systemId)

Resolve the system identifier of an entity and return either the system
identifier to read from as a string, or an InputSource to read from. The default
implementation returns `systemId'.
@end deffn

@node ErrorHandler Objects,LexicalHandler Objects,EntityResolver Objects,xml sax handler — Base classes for SAX handlers
@anchor{library/xml sax handler errorhandler-objects}@anchor{3e8f}@anchor{library/xml sax handler sax-error-handler}@anchor{3e90}
@subsubsection ErrorHandler Objects


Objects with this interface are used to receive error and warning information
from the @ref{3e55,,XMLReader}.  If you create an object that
implements this interface, then register the object with your
@code{XMLReader}, the parser
will call the methods in your object to report all warnings and errors. There
are three levels of errors available: warnings, (possibly) recoverable errors,
and unrecoverable errors.  All methods take a @ref{3e61,,SAXParseException} as the
only parameter.  Errors and warnings may be converted to an exception by raising
the passed-in exception object.

@geindex error() (xml.sax.handler.ErrorHandler method)
@anchor{library/xml sax handler xml sax handler ErrorHandler error}@anchor{3e91}
@deffn {Method} ErrorHandler.error (exception)

Called when the parser encounters a recoverable error.  If this method does not
raise an exception, parsing may continue, but further document information
should not be expected by the application.  Allowing the parser to continue may
allow additional errors to be discovered in the input document.
@end deffn

@geindex fatalError() (xml.sax.handler.ErrorHandler method)
@anchor{library/xml sax handler xml sax handler ErrorHandler fatalError}@anchor{3e92}
@deffn {Method} ErrorHandler.fatalError (exception)

Called when the parser encounters an error it cannot recover from; parsing is
expected to terminate when this method returns.
@end deffn

@geindex warning() (xml.sax.handler.ErrorHandler method)
@anchor{library/xml sax handler xml sax handler ErrorHandler warning}@anchor{3e93}
@deffn {Method} ErrorHandler.warning (exception)

Called when the parser presents minor warning information to the application.
Parsing is expected to continue when this method returns, and document
information will continue to be passed to the application. Raising an exception
in this method will cause parsing to end.
@end deffn

@node LexicalHandler Objects,,ErrorHandler Objects,xml sax handler — Base classes for SAX handlers
@anchor{library/xml sax handler lexical-handler-objects}@anchor{3e94}@anchor{library/xml sax handler lexicalhandler-objects}@anchor{3e95}
@subsubsection LexicalHandler Objects


Optional SAX2 handler for lexical events.

This handler is used to obtain lexical information about an XML
document. Lexical information includes information describing the
document encoding used and XML comments embedded in the document, as
well as section boundaries for the DTD and for any CDATA sections.
The lexical handlers are used in the same manner as content handlers.

Set the LexicalHandler of an XMLReader by using the setProperty method
with the property identifier
@code{'http://xml.org/sax/properties/lexical-handler'}.

@geindex comment() (xml.sax.handler.LexicalHandler method)
@anchor{library/xml sax handler xml sax handler LexicalHandler comment}@anchor{3e96}
@deffn {Method} LexicalHandler.comment (content)

Reports a comment anywhere in the document (including the DTD and
outside the document element).
@end deffn

@geindex startDTD() (xml.sax.handler.LexicalHandler method)
@anchor{library/xml sax handler xml sax handler LexicalHandler startDTD}@anchor{3e97}
@deffn {Method} LexicalHandler.startDTD (name, public_id, system_id)

Reports the start of the DTD declarations if the document has an
associated DTD.
@end deffn

@geindex endDTD() (xml.sax.handler.LexicalHandler method)
@anchor{library/xml sax handler xml sax handler LexicalHandler endDTD}@anchor{3e98}
@deffn {Method} LexicalHandler.endDTD ()

Reports the end of DTD declaration.
@end deffn

@geindex startCDATA() (xml.sax.handler.LexicalHandler method)
@anchor{library/xml sax handler xml sax handler LexicalHandler startCDATA}@anchor{3e99}
@deffn {Method} LexicalHandler.startCDATA ()

Reports the start of a CDATA marked section.

The contents of the CDATA marked section will be reported through
the characters handler.
@end deffn

@geindex endCDATA() (xml.sax.handler.LexicalHandler method)
@anchor{library/xml sax handler xml sax handler LexicalHandler endCDATA}@anchor{3e9a}
@deffn {Method} LexicalHandler.endCDATA ()

Reports the end of a CDATA marked section.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node xml sax saxutils — SAX Utilities,xml sax xmlreader — Interface for XML parsers,xml sax handler — Base classes for SAX handlers,Structured Markup Processing Tools
@anchor{library/xml sax utils doc}@anchor{3e9b}@anchor{library/xml sax utils module-xml sax saxutils}@anchor{132}@anchor{library/xml sax utils translation-repo}@anchor{3e9c}@anchor{library/xml sax utils xml-sax-saxutils-sax-utilities}@anchor{3e9d}
@subsection @code{xml.sax.saxutils} — SAX Utilities


@geindex module; xml.sax.saxutils

`Source code:' Lib/xml/sax/saxutils.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/xml/sax/saxutils.py}


__________________________________________________________________


The module @code{xml.sax.saxutils} contains a number of classes and functions
that are commonly useful when creating SAX applications, either in direct use,
or as base classes.

@geindex escape() (in module xml.sax.saxutils)
@anchor{library/xml sax utils xml sax saxutils escape}@anchor{3e9e}
@deffn {Function} xml.sax.saxutils.escape (data, entities=@{@})

Escape @code{'&'}, @code{'<'}, and @code{'>'} in a string of data.

You can escape other strings of data by passing a dictionary as the optional
`entities' parameter.  The keys and values must all be strings; each key will be
replaced with its corresponding value.  The characters @code{'&'}, @code{'<'} and
@code{'>'} are always escaped, even if `entities' is provided.

@cartouche
@quotation Note 
This function should only be used to escape characters that
can’t be used directly in XML. Do not use this function as a general
string translation function.
@end quotation
@end cartouche
@end deffn

@geindex unescape() (in module xml.sax.saxutils)
@anchor{library/xml sax utils xml sax saxutils unescape}@anchor{3e9f}
@deffn {Function} xml.sax.saxutils.unescape (data, entities=@{@})

Unescape @code{'&amp;'}, @code{'&lt;'}, and @code{'&gt;'} in a string of data.

You can unescape other strings of data by passing a dictionary as the optional
`entities' parameter.  The keys and values must all be strings; each key will be
replaced with its corresponding value.  @code{'&amp;'}, @code{'&lt;'}, and @code{'&gt;'}
are always unescaped, even if `entities' is provided.
@end deffn

@geindex quoteattr() (in module xml.sax.saxutils)
@anchor{library/xml sax utils xml sax saxutils quoteattr}@anchor{3ea0}
@deffn {Function} xml.sax.saxutils.quoteattr (data, entities=@{@})

Similar to @ref{3e9e,,escape()}, but also prepares `data' to be used as an
attribute value.  The return value is a quoted version of `data' with any
additional required replacements. @code{quoteattr()} will select a quote
character based on the content of `data', attempting to avoid encoding any
quote characters in the string.  If both single- and double-quote characters
are already in `data', the double-quote characters will be encoded and `data'
will be wrapped in double-quotes.  The resulting string can be used directly
as an attribute value:

@example
>>> print("<element attr=%s>" % quoteattr("ab ' cd \" ef"))
<element attr="ab ' cd &quot; ef">
@end example

This function is useful when generating attribute values for HTML or any SGML
using the reference concrete syntax.
@end deffn

@geindex XMLGenerator (class in xml.sax.saxutils)
@anchor{library/xml sax utils xml sax saxutils XMLGenerator}@anchor{3ea1}
@deffn {Class} xml.sax.saxutils.XMLGenerator (out=None, encoding='iso-8859-1', short_empty_elements=False)

This class implements the @ref{3e52,,ContentHandler} interface
by writing SAX
events back into an XML document. In other words, using an @code{XMLGenerator}
as the content handler will reproduce the original document being parsed. `out'
should be a file-like object which will default to `sys.stdout'. `encoding' is
the encoding of the output stream which defaults to @code{'iso-8859-1'}.
`short_empty_elements' controls the formatting of elements that contain no
content:  if @code{False} (the default) they are emitted as a pair of start/end
tags, if set to @code{True} they are emitted as a single self-closed tag.


Changed in version 3.2: Added the `short_empty_elements' parameter.

@end deffn

@geindex XMLFilterBase (class in xml.sax.saxutils)
@anchor{library/xml sax utils xml sax saxutils XMLFilterBase}@anchor{3ea2}
@deffn {Class} xml.sax.saxutils.XMLFilterBase (base)

This class is designed to sit between an
@ref{3e55,,XMLReader} and the client
application’s event handlers.  By default, it does nothing but pass requests up
to the reader and events on to the handlers unmodified, but subclasses can
override specific methods to modify the event stream or the configuration
requests as they pass through.
@end deffn

@geindex prepare_input_source() (in module xml.sax.saxutils)
@anchor{library/xml sax utils xml sax saxutils prepare_input_source}@anchor{3ea3}
@deffn {Function} xml.sax.saxutils.prepare_input_source (source, base='@w{'})

This function takes an input source and an optional base URL and returns a
fully resolved @ref{10a1,,InputSource} object ready for
reading.  The input source can be given as a string, a file-like object, or
an @code{InputSource} object; parsers will use this
function to implement the polymorphic `source' argument to their
@ref{3ea4,,parse()} method.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node xml sax xmlreader — Interface for XML parsers,xml parsers expat — Fast XML parsing using Expat,xml sax saxutils — SAX Utilities,Structured Markup Processing Tools
@anchor{library/xml sax reader doc}@anchor{3ea5}@anchor{library/xml sax reader module-xml sax xmlreader}@anchor{133}@anchor{library/xml sax reader translation-repo}@anchor{3ea6}@anchor{library/xml sax reader xml-sax-xmlreader-interface-for-xml-parsers}@anchor{3ea7}
@subsection @code{xml.sax.xmlreader} — Interface for XML parsers


@geindex module; xml.sax.xmlreader

`Source code:' Lib/xml/sax/xmlreader.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/xml/sax/xmlreader.py}


__________________________________________________________________


SAX parsers implement the @ref{3e55,,XMLReader} interface. They are implemented in
a Python module, which must provide a function @code{create_parser()}. This
function is invoked by  @ref{1e5e,,xml.sax.make_parser()} with no arguments to create
a new  parser object.

@geindex XMLReader (class in xml.sax.xmlreader)
@anchor{library/xml sax reader xml sax xmlreader XMLReader}@anchor{3e55}
@deffn {Class} xml.sax.xmlreader.XMLReader

Base class which can be inherited by SAX parsers.
@end deffn

@geindex IncrementalParser (class in xml.sax.xmlreader)
@anchor{library/xml sax reader xml sax xmlreader IncrementalParser}@anchor{3ea8}
@deffn {Class} xml.sax.xmlreader.IncrementalParser

In some cases, it is desirable not to parse an input source at once, but to feed
chunks of the document as they get available. Note that the reader will normally
not read the entire file, but read it in chunks as well; still @code{parse()}
won’t return until the entire document is processed. So these interfaces should
be used if the blocking behaviour of @code{parse()} is not desirable.

When the parser is instantiated it is ready to begin accepting data from the
feed method immediately. After parsing has been finished with a call to close
the reset method must be called to make the parser ready to accept new data,
either from feed or using the parse method.

Note that these methods must `not' be called during parsing, that is, after
parse has been called and before it returns.

By default, the class also implements the parse method of the XMLReader
interface using the feed, close and reset methods of the IncrementalParser
interface as a convenience to SAX 2.0 driver writers.
@end deffn

@geindex Locator (class in xml.sax.xmlreader)
@anchor{library/xml sax reader xml sax xmlreader Locator}@anchor{3e62}
@deffn {Class} xml.sax.xmlreader.Locator

Interface for associating a SAX event with a document location. A locator object
will return valid results only during calls to DocumentHandler methods; at any
other time, the results are unpredictable. If information is not available,
methods may return @code{None}.
@end deffn

@geindex InputSource (class in xml.sax.xmlreader)
@anchor{library/xml sax reader xml sax xmlreader InputSource}@anchor{10a1}
@deffn {Class} xml.sax.xmlreader.InputSource (system_id=None)

Encapsulation of the information needed by the @ref{3e55,,XMLReader} to read
entities.

This class may include information about the public identifier, system
identifier, byte stream (possibly with character encoding information) and/or
the character stream of an entity.

Applications will create objects of this class for use in the
@ref{3ea4,,XMLReader.parse()} method and for returning from
EntityResolver.resolveEntity.

An @code{InputSource} belongs to the application, the @ref{3e55,,XMLReader} is
not allowed to modify @code{InputSource} objects passed to it from the
application, although it may make copies and modify those.
@end deffn

@geindex AttributesImpl (class in xml.sax.xmlreader)
@anchor{library/xml sax reader xml sax xmlreader AttributesImpl}@anchor{3ea9}
@deffn {Class} xml.sax.xmlreader.AttributesImpl (attrs)

This is an implementation of the @code{Attributes} interface (see section
@ref{3e81,,The Attributes Interface}).  This is a dictionary-like object which
represents the element attributes in a @code{startElement()} call. In addition
to the most useful dictionary operations, it supports a number of other
methods as described by the interface. Objects of this class should be
instantiated by readers; `attrs' must be a dictionary-like object containing
a mapping from attribute names to attribute values.
@end deffn

@geindex AttributesNSImpl (class in xml.sax.xmlreader)
@anchor{library/xml sax reader xml sax xmlreader AttributesNSImpl}@anchor{3eaa}
@deffn {Class} xml.sax.xmlreader.AttributesNSImpl (attrs, qnames)

Namespace-aware variant of @ref{3ea9,,AttributesImpl}, which will be passed to
@code{startElementNS()}. It is derived from @code{AttributesImpl}, but
understands attribute names as two-tuples of `namespaceURI' and
`localname'. In addition, it provides a number of methods expecting qualified
names as they appear in the original document.  This class implements the
@code{AttributesNS} interface (see section @ref{3e83,,The AttributesNS Interface}).
@end deffn

@menu
* XMLReader Objects:: 
* IncrementalParser Objects:: 
* Locator Objects:: 
* InputSource Objects:: 
* The Attributes Interface:: 
* The AttributesNS Interface:: 

@end menu

@node XMLReader Objects,IncrementalParser Objects,,xml sax xmlreader — Interface for XML parsers
@anchor{library/xml sax reader id1}@anchor{3eab}@anchor{library/xml sax reader xmlreader-objects}@anchor{3eac}
@subsubsection XMLReader Objects


The @ref{3e55,,XMLReader} interface supports the following methods:

@geindex parse() (xml.sax.xmlreader.XMLReader method)
@anchor{library/xml sax reader xml sax xmlreader XMLReader parse}@anchor{3ea4}
@deffn {Method} XMLReader.parse (source)

Process an input source, producing SAX events. The `source' object can be a
system identifier (a string identifying the input source – typically a file
name or a URL), a @ref{268,,pathlib.Path} or @ref{5a1,,path-like}
object, or an @ref{10a1,,InputSource} object. When
@code{parse()} returns, the input is completely processed, and the parser object
can be discarded or reset.


Changed in version 3.5: Added support of character streams.



Changed in version 3.8: Added support of path-like objects.

@end deffn

@geindex getContentHandler() (xml.sax.xmlreader.XMLReader method)
@anchor{library/xml sax reader xml sax xmlreader XMLReader getContentHandler}@anchor{3ead}
@deffn {Method} XMLReader.getContentHandler ()

Return the current @ref{3e52,,ContentHandler}.
@end deffn

@geindex setContentHandler() (xml.sax.xmlreader.XMLReader method)
@anchor{library/xml sax reader xml sax xmlreader XMLReader setContentHandler}@anchor{3eae}
@deffn {Method} XMLReader.setContentHandler (handler)

Set the current @ref{3e52,,ContentHandler}.  If no
@code{ContentHandler} is set, content events will be
discarded.
@end deffn

@geindex getDTDHandler() (xml.sax.xmlreader.XMLReader method)
@anchor{library/xml sax reader xml sax xmlreader XMLReader getDTDHandler}@anchor{3eaf}
@deffn {Method} XMLReader.getDTDHandler ()

Return the current @ref{3e6d,,DTDHandler}.
@end deffn

@geindex setDTDHandler() (xml.sax.xmlreader.XMLReader method)
@anchor{library/xml sax reader xml sax xmlreader XMLReader setDTDHandler}@anchor{3eb0}
@deffn {Method} XMLReader.setDTDHandler (handler)

Set the current @ref{3e6d,,DTDHandler}.  If no
@code{DTDHandler} is set, DTD
events will be discarded.
@end deffn

@geindex getEntityResolver() (xml.sax.xmlreader.XMLReader method)
@anchor{library/xml sax reader xml sax xmlreader XMLReader getEntityResolver}@anchor{3eb1}
@deffn {Method} XMLReader.getEntityResolver ()

Return the current @ref{3e6e,,EntityResolver}.
@end deffn

@geindex setEntityResolver() (xml.sax.xmlreader.XMLReader method)
@anchor{library/xml sax reader xml sax xmlreader XMLReader setEntityResolver}@anchor{3eb2}
@deffn {Method} XMLReader.setEntityResolver (handler)

Set the current @ref{3e6e,,EntityResolver}.  If no
@code{EntityResolver} is set,
attempts to resolve an external entity will result in opening the system
identifier for the entity, and fail if it is not available.
@end deffn

@geindex getErrorHandler() (xml.sax.xmlreader.XMLReader method)
@anchor{library/xml sax reader xml sax xmlreader XMLReader getErrorHandler}@anchor{3eb3}
@deffn {Method} XMLReader.getErrorHandler ()

Return the current @ref{3e60,,ErrorHandler}.
@end deffn

@geindex setErrorHandler() (xml.sax.xmlreader.XMLReader method)
@anchor{library/xml sax reader xml sax xmlreader XMLReader setErrorHandler}@anchor{3eb4}
@deffn {Method} XMLReader.setErrorHandler (handler)

Set the current error handler.  If no @ref{3e60,,ErrorHandler}
is set, errors will be raised as exceptions, and warnings will be printed.
@end deffn

@geindex setLocale() (xml.sax.xmlreader.XMLReader method)
@anchor{library/xml sax reader xml sax xmlreader XMLReader setLocale}@anchor{3eb5}
@deffn {Method} XMLReader.setLocale (locale)

Allow an application to set the locale for errors and warnings.

SAX parsers are not required to provide localization for errors and warnings; if
they cannot support the requested locale, however, they must raise a SAX
exception.  Applications may request a locale change in the middle of a parse.
@end deffn

@geindex getFeature() (xml.sax.xmlreader.XMLReader method)
@anchor{library/xml sax reader xml sax xmlreader XMLReader getFeature}@anchor{3eb6}
@deffn {Method} XMLReader.getFeature (featurename)

Return the current setting for feature `featurename'.  If the feature is not
recognized, @code{SAXNotRecognizedException} is raised. The well-known
featurenames are listed in the module @ref{131,,xml.sax.handler}.
@end deffn

@geindex setFeature() (xml.sax.xmlreader.XMLReader method)
@anchor{library/xml sax reader xml sax xmlreader XMLReader setFeature}@anchor{3e5f}
@deffn {Method} XMLReader.setFeature (featurename, value)

Set the `featurename' to `value'. If the feature is not recognized,
@code{SAXNotRecognizedException} is raised. If the feature or its setting is not
supported by the parser, `SAXNotSupportedException' is raised.
@end deffn

@geindex getProperty() (xml.sax.xmlreader.XMLReader method)
@anchor{library/xml sax reader xml sax xmlreader XMLReader getProperty}@anchor{3eb7}
@deffn {Method} XMLReader.getProperty (propertyname)

Return the current setting for property `propertyname'. If the property is not
recognized, a @code{SAXNotRecognizedException} is raised. The well-known
propertynames are listed in the module @ref{131,,xml.sax.handler}.
@end deffn

@geindex setProperty() (xml.sax.xmlreader.XMLReader method)
@anchor{library/xml sax reader xml sax xmlreader XMLReader setProperty}@anchor{3eb8}
@deffn {Method} XMLReader.setProperty (propertyname, value)

Set the `propertyname' to `value'. If the property is not recognized,
@code{SAXNotRecognizedException} is raised. If the property or its setting is
not supported by the parser, `SAXNotSupportedException' is raised.
@end deffn

@node IncrementalParser Objects,Locator Objects,XMLReader Objects,xml sax xmlreader — Interface for XML parsers
@anchor{library/xml sax reader incremental-parser-objects}@anchor{3eb9}@anchor{library/xml sax reader incrementalparser-objects}@anchor{3eba}
@subsubsection IncrementalParser Objects


Instances of @ref{3ea8,,IncrementalParser} offer the following additional methods:

@geindex feed() (xml.sax.xmlreader.IncrementalParser method)
@anchor{library/xml sax reader xml sax xmlreader IncrementalParser feed}@anchor{3ebb}
@deffn {Method} IncrementalParser.feed (data)

Process a chunk of `data'.
@end deffn

@geindex close() (xml.sax.xmlreader.IncrementalParser method)
@anchor{library/xml sax reader xml sax xmlreader IncrementalParser close}@anchor{3ebc}
@deffn {Method} IncrementalParser.close ()

Assume the end of the document. That will check well-formedness conditions that
can be checked only at the end, invoke handlers, and may clean up resources
allocated during parsing.
@end deffn

@geindex reset() (xml.sax.xmlreader.IncrementalParser method)
@anchor{library/xml sax reader xml sax xmlreader IncrementalParser reset}@anchor{3ebd}
@deffn {Method} IncrementalParser.reset ()

This method is called after close has been called to reset the parser so that it
is ready to parse new documents. The results of calling parse or feed after
close without calling reset are undefined.
@end deffn

@node Locator Objects,InputSource Objects,IncrementalParser Objects,xml sax xmlreader — Interface for XML parsers
@anchor{library/xml sax reader id2}@anchor{3ebe}@anchor{library/xml sax reader locator-objects}@anchor{3ebf}
@subsubsection Locator Objects


Instances of @ref{3e62,,Locator} provide these methods:

@geindex getColumnNumber() (xml.sax.xmlreader.Locator method)
@anchor{library/xml sax reader xml sax xmlreader Locator getColumnNumber}@anchor{3ec0}
@deffn {Method} Locator.getColumnNumber ()

Return the column number where the current event begins.
@end deffn

@geindex getLineNumber() (xml.sax.xmlreader.Locator method)
@anchor{library/xml sax reader xml sax xmlreader Locator getLineNumber}@anchor{3ec1}
@deffn {Method} Locator.getLineNumber ()

Return the line number where the current event begins.
@end deffn

@geindex getPublicId() (xml.sax.xmlreader.Locator method)
@anchor{library/xml sax reader xml sax xmlreader Locator getPublicId}@anchor{3ec2}
@deffn {Method} Locator.getPublicId ()

Return the public identifier for the current event.
@end deffn

@geindex getSystemId() (xml.sax.xmlreader.Locator method)
@anchor{library/xml sax reader xml sax xmlreader Locator getSystemId}@anchor{3ec3}
@deffn {Method} Locator.getSystemId ()

Return the system identifier for the current event.
@end deffn

@node InputSource Objects,The Attributes Interface,Locator Objects,xml sax xmlreader — Interface for XML parsers
@anchor{library/xml sax reader input-source-objects}@anchor{3ec4}@anchor{library/xml sax reader inputsource-objects}@anchor{3ec5}
@subsubsection InputSource Objects


@geindex setPublicId() (xml.sax.xmlreader.InputSource method)
@anchor{library/xml sax reader xml sax xmlreader InputSource setPublicId}@anchor{3ec6}
@deffn {Method} InputSource.setPublicId (id)

Sets the public identifier of this @ref{10a1,,InputSource}.
@end deffn

@geindex getPublicId() (xml.sax.xmlreader.InputSource method)
@anchor{library/xml sax reader xml sax xmlreader InputSource getPublicId}@anchor{3ec7}
@deffn {Method} InputSource.getPublicId ()

Returns the public identifier of this @ref{10a1,,InputSource}.
@end deffn

@geindex setSystemId() (xml.sax.xmlreader.InputSource method)
@anchor{library/xml sax reader xml sax xmlreader InputSource setSystemId}@anchor{3ec8}
@deffn {Method} InputSource.setSystemId (id)

Sets the system identifier of this @ref{10a1,,InputSource}.
@end deffn

@geindex getSystemId() (xml.sax.xmlreader.InputSource method)
@anchor{library/xml sax reader xml sax xmlreader InputSource getSystemId}@anchor{3ec9}
@deffn {Method} InputSource.getSystemId ()

Returns the system identifier of this @ref{10a1,,InputSource}.
@end deffn

@geindex setEncoding() (xml.sax.xmlreader.InputSource method)
@anchor{library/xml sax reader xml sax xmlreader InputSource setEncoding}@anchor{3eca}
@deffn {Method} InputSource.setEncoding (encoding)

Sets the character encoding of this @ref{10a1,,InputSource}.

The encoding must be a string acceptable for an XML encoding declaration (see
section 4.3.3 of the XML recommendation).

The encoding attribute of the @ref{10a1,,InputSource} is ignored if the
@code{InputSource} also contains a character stream.
@end deffn

@geindex getEncoding() (xml.sax.xmlreader.InputSource method)
@anchor{library/xml sax reader xml sax xmlreader InputSource getEncoding}@anchor{3ecb}
@deffn {Method} InputSource.getEncoding ()

Get the character encoding of this InputSource.
@end deffn

@geindex setByteStream() (xml.sax.xmlreader.InputSource method)
@anchor{library/xml sax reader xml sax xmlreader InputSource setByteStream}@anchor{3ecc}
@deffn {Method} InputSource.setByteStream (bytefile)

Set the byte stream (a @ref{20b2,,binary file}) for this input source.

The SAX parser will ignore this if there is also a character stream specified,
but it will use a byte stream in preference to opening a URI connection itself.

If the application knows the character encoding of the byte stream, it should
set it with the setEncoding method.
@end deffn

@geindex getByteStream() (xml.sax.xmlreader.InputSource method)
@anchor{library/xml sax reader xml sax xmlreader InputSource getByteStream}@anchor{3ecd}
@deffn {Method} InputSource.getByteStream ()

Get the byte stream for this input source.

The getEncoding method will return the character encoding for this byte stream,
or @code{None} if unknown.
@end deffn

@geindex setCharacterStream() (xml.sax.xmlreader.InputSource method)
@anchor{library/xml sax reader xml sax xmlreader InputSource setCharacterStream}@anchor{3ece}
@deffn {Method} InputSource.setCharacterStream (charfile)

Set the character stream (a @ref{20b1,,text file}) for this input source.

If there is a character stream specified, the SAX parser will ignore any byte
stream and will not attempt to open a URI connection to the system identifier.
@end deffn

@geindex getCharacterStream() (xml.sax.xmlreader.InputSource method)
@anchor{library/xml sax reader xml sax xmlreader InputSource getCharacterStream}@anchor{3ecf}
@deffn {Method} InputSource.getCharacterStream ()

Get the character stream for this input source.
@end deffn

@node The Attributes Interface,The AttributesNS Interface,InputSource Objects,xml sax xmlreader — Interface for XML parsers
@anchor{library/xml sax reader attributes-objects}@anchor{3e81}@anchor{library/xml sax reader the-attributes-interface}@anchor{3ed0}
@subsubsection The @code{Attributes} Interface


@code{Attributes} objects implement a portion of the @ref{13c7,,mapping protocol}, including the methods @code{copy()},
@code{get()}, @ref{15c5,,__contains__()},
@code{items()}, @code{keys()},
and @code{values()}.  The following methods
are also provided:

@geindex getLength() (xml.sax.xmlreader.Attributes method)
@anchor{library/xml sax reader xml sax xmlreader Attributes getLength}@anchor{3ed1}
@deffn {Method} Attributes.getLength ()

Return the number of attributes.
@end deffn

@geindex getNames() (xml.sax.xmlreader.Attributes method)
@anchor{library/xml sax reader xml sax xmlreader Attributes getNames}@anchor{3ed2}
@deffn {Method} Attributes.getNames ()

Return the names of the attributes.
@end deffn

@geindex getType() (xml.sax.xmlreader.Attributes method)
@anchor{library/xml sax reader xml sax xmlreader Attributes getType}@anchor{3ed3}
@deffn {Method} Attributes.getType (name)

Returns the type of the attribute `name', which is normally @code{'CDATA'}.
@end deffn

@geindex getValue() (xml.sax.xmlreader.Attributes method)
@anchor{library/xml sax reader xml sax xmlreader Attributes getValue}@anchor{3ed4}
@deffn {Method} Attributes.getValue (name)

Return the value of attribute `name'.
@end deffn

@c getValueByQName, getNameByQName, getQNameByName, getQNames available

@c here already, but documented only for derived class.

@node The AttributesNS Interface,,The Attributes Interface,xml sax xmlreader — Interface for XML parsers
@anchor{library/xml sax reader attributes-ns-objects}@anchor{3e83}@anchor{library/xml sax reader the-attributesns-interface}@anchor{3ed5}
@subsubsection The @code{AttributesNS} Interface


This interface is a subtype of the @code{Attributes} interface (see section
@ref{3e81,,The Attributes Interface}).  All methods supported by that interface are also
available on @code{AttributesNS} objects.

The following methods are also available:

@geindex getValueByQName() (xml.sax.xmlreader.AttributesNS method)
@anchor{library/xml sax reader xml sax xmlreader AttributesNS getValueByQName}@anchor{3ed6}
@deffn {Method} AttributesNS.getValueByQName (name)

Return the value for a qualified name.
@end deffn

@geindex getNameByQName() (xml.sax.xmlreader.AttributesNS method)
@anchor{library/xml sax reader xml sax xmlreader AttributesNS getNameByQName}@anchor{3ed7}
@deffn {Method} AttributesNS.getNameByQName (name)

Return the @code{(namespace, localname)} pair for a qualified `name'.
@end deffn

@geindex getQNameByName() (xml.sax.xmlreader.AttributesNS method)
@anchor{library/xml sax reader xml sax xmlreader AttributesNS getQNameByName}@anchor{3ed8}
@deffn {Method} AttributesNS.getQNameByName (name)

Return the qualified name for a @code{(namespace, localname)} pair.
@end deffn

@geindex getQNames() (xml.sax.xmlreader.AttributesNS method)
@anchor{library/xml sax reader xml sax xmlreader AttributesNS getQNames}@anchor{3ed9}
@deffn {Method} AttributesNS.getQNames ()

Return the qualified names of all attributes.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node xml parsers expat — Fast XML parsing using Expat,,xml sax xmlreader — Interface for XML parsers,Structured Markup Processing Tools
@anchor{library/pyexpat doc}@anchor{3eda}@anchor{library/pyexpat module-xml parsers expat}@anchor{12d}@anchor{library/pyexpat translation-repo}@anchor{3edb}@anchor{library/pyexpat xml-parsers-expat-fast-xml-parsing-using-expat}@anchor{3edc}
@subsection @code{xml.parsers.expat} — Fast XML parsing using Expat


@geindex module; xml.parsers.expat


__________________________________________________________________


@c Markup notes:
@c 
@c Many of the attributes of the XMLParser objects are callbacks.  Since
@c signature information must be presented, these are described using the method
@c directive.  Since they are attributes which are set by client code, in-text
@c references to these attributes should be marked using the :member: role.

@cartouche
@quotation Note 
If you need to parse untrusted or unauthenticated data, see
@ref{3d6e,,XML security}.
@end quotation
@end cartouche

@geindex Expat

The @code{xml.parsers.expat} module is a Python interface to the Expat
non-validating XML parser. The module provides a single extension type,
@code{xmlparser}, that represents the current state of an XML parser.  After
an @code{xmlparser} object has been created, various attributes of the object
can be set to handler functions.  When an XML document is then fed to the
parser, the handler functions are called for the character data and markup in
the XML document.

@geindex module; pyexpat

This module uses the @code{pyexpat} module to provide access to the Expat
parser.  Direct use of the @code{pyexpat} module is deprecated.

This module provides one exception and one type object:

@geindex ExpatError
@anchor{library/pyexpat xml parsers expat ExpatError}@anchor{1484}
@deffn {Exception} xml.parsers.expat.ExpatError

The exception raised when Expat reports an error.  See section
@ref{3edd,,ExpatError Exceptions} for more information on interpreting Expat errors.
@end deffn

@geindex error
@anchor{library/pyexpat xml parsers expat error}@anchor{3ede}
@deffn {Exception} xml.parsers.expat.error

Alias for @ref{1484,,ExpatError}.
@end deffn

@geindex XMLParserType (in module xml.parsers.expat)
@anchor{library/pyexpat xml parsers expat XMLParserType}@anchor{3edf}
@deffn {Data} xml.parsers.expat.XMLParserType

The type of the return values from the @ref{3ee0,,ParserCreate()} function.
@end deffn

The @code{xml.parsers.expat} module contains two functions:

@geindex ErrorString() (in module xml.parsers.expat)
@anchor{library/pyexpat xml parsers expat ErrorString}@anchor{3ee1}
@deffn {Function} xml.parsers.expat.ErrorString (errno)

Returns an explanatory string for a given error number `errno'.
@end deffn

@geindex ParserCreate() (in module xml.parsers.expat)
@anchor{library/pyexpat xml parsers expat ParserCreate}@anchor{3ee0}
@deffn {Function} xml.parsers.expat.ParserCreate (encoding=None, namespace_separator=None)

Creates and returns a new @code{xmlparser} object.   `encoding', if specified,
must be a string naming the encoding  used by the XML data.  Expat doesn’t
support as many encodings as Python does, and its repertoire of encodings can’t
be extended; it supports UTF-8, UTF-16, ISO-8859-1 (Latin1), and ASCII.  If
`encoding' @footnote{
The encoding string included in XML output should conform to the
appropriate standards. For example, “UTF-8” is valid, but “UTF8” is
not. See @indicateurl{https://www.w3.org/TR/2006/REC-xml11-20060816/#NT-EncodingDecl}
and @indicateurl{https://www.iana.org/assignments/character-sets/character-sets.xhtml}.
} is given it will override the implicit or explicit encoding of the
document.
@anchor{library/pyexpat xmlparser-non-root}@anchor{3ee2}
Parsers created through @code{ParserCreate()} are called “root” parsers,
in the sense that they do not have any parent parser attached. Non-root
parsers are created by @ref{17b2,,parser.ExternalEntityParserCreate}.

Expat can optionally do XML namespace processing for you, enabled by providing a
value for `namespace_separator'.  The value must be a one-character string; a
@ref{2ee,,ValueError} will be raised if the string has an illegal length (@code{None}
is considered the same as omission).  When namespace processing is enabled,
element type names and attribute names that belong to a namespace will be
expanded.  The element name passed to the element handlers
@code{StartElementHandler} and @code{EndElementHandler} will be the
concatenation of the namespace URI, the namespace separator character, and the
local part of the name.  If the namespace separator is a zero byte (@code{chr(0)})
then the namespace URI and the local part will be concatenated without any
separator.

For example, if `namespace_separator' is set to a space character (@code{' '}) and
the following document is parsed:

@example
<?xml version="1.0"?>
<root xmlns    = "http://default-namespace.org/"
      xmlns:py = "http://www.python.org/ns/">
  <py:elem1 />
  <elem2 xmlns="" />
</root>
@end example

@code{StartElementHandler} will receive the following strings for each
element:

@example
http://default-namespace.org/ root
http://www.python.org/ns/ elem1
elem2
@end example

Due to limitations in the @code{Expat} library used by @code{pyexpat},
the @code{xmlparser} instance returned can only be used to parse a single
XML document.  Call @code{ParserCreate} for each document to provide unique
parser instances.
@end deffn


@subsubheading See also



@table @asis

@item The Expat XML Parser@footnote{http://www.libexpat.org/}

Home page of the Expat project.
@end table


@menu
* XMLParser Objects: XMLParser Objects<2>. 
* ExpatError Exceptions:: 
* Example: Example<10>. 
* Content Model Descriptions:: 
* Expat error constants:: 

@end menu

@node XMLParser Objects<2>,ExpatError Exceptions,,xml parsers expat — Fast XML parsing using Expat
@anchor{library/pyexpat id2}@anchor{3ee3}@anchor{library/pyexpat xmlparser-objects}@anchor{177a}
@subsubsection XMLParser Objects


@code{xmlparser} objects have the following methods:

@geindex Parse() (xml.parsers.expat.xmlparser method)
@anchor{library/pyexpat xml parsers expat xmlparser Parse}@anchor{3ee4}
@deffn {Method} xmlparser.Parse (data[, isfinal])

Parses the contents of the string `data', calling the appropriate handler
functions to process the parsed data.  `isfinal' must be true on the final call
to this method; it allows the parsing of a single file in fragments,
not the submission of multiple files.
`data' can be the empty string at any time.
@end deffn

@geindex ParseFile() (xml.parsers.expat.xmlparser method)
@anchor{library/pyexpat xml parsers expat xmlparser ParseFile}@anchor{3ee5}
@deffn {Method} xmlparser.ParseFile (file)

Parse XML data reading from the object `file'.  `file' only needs to provide
the @code{read(nbytes)} method, returning the empty string when there’s no more
data.
@end deffn

@geindex SetBase() (xml.parsers.expat.xmlparser method)
@anchor{library/pyexpat xml parsers expat xmlparser SetBase}@anchor{3ee6}
@deffn {Method} xmlparser.SetBase (base)

Sets the base to be used for resolving relative URIs in system identifiers in
declarations.  Resolving relative identifiers is left to the application: this
value will be passed through as the `base' argument to the
@ref{3ee7,,ExternalEntityRefHandler()}, @ref{3ee8,,NotationDeclHandler()}, and
@ref{3ee9,,UnparsedEntityDeclHandler()} functions.
@end deffn

@geindex GetBase() (xml.parsers.expat.xmlparser method)
@anchor{library/pyexpat xml parsers expat xmlparser GetBase}@anchor{3eea}
@deffn {Method} xmlparser.GetBase ()

Returns a string containing the base set by a previous call to @ref{3ee6,,SetBase()},
or @code{None} if  @code{SetBase()} hasn’t been called.
@end deffn

@geindex GetInputContext() (xml.parsers.expat.xmlparser method)
@anchor{library/pyexpat xml parsers expat xmlparser GetInputContext}@anchor{3eeb}
@deffn {Method} xmlparser.GetInputContext ()

Returns the input data that generated the current event as a string. The data is
in the encoding of the entity which contains the text. When called while an
event handler is not active, the return value is @code{None}.
@end deffn

@geindex ExternalEntityParserCreate() (xml.parsers.expat.xmlparser method)
@anchor{library/pyexpat xml parsers expat xmlparser ExternalEntityParserCreate}@anchor{17b2}
@deffn {Method} xmlparser.ExternalEntityParserCreate (context[, encoding])

Create a “child” parser which can be used to parse an external parsed entity
referred to by content parsed by the parent parser.  The `context' parameter
should be the string passed to the @ref{3ee7,,ExternalEntityRefHandler()} handler
function, described below. The child parser is created with the
@ref{3eec,,ordered_attributes} and @ref{3eed,,specified_attributes} set to the values of
this parser.
@end deffn

@geindex SetParamEntityParsing() (xml.parsers.expat.xmlparser method)
@anchor{library/pyexpat xml parsers expat xmlparser SetParamEntityParsing}@anchor{3eee}
@deffn {Method} xmlparser.SetParamEntityParsing (flag)

Control parsing of parameter entities (including the external DTD subset).
Possible `flag' values are @code{XML_PARAM_ENTITY_PARSING_NEVER},
@code{XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE} and
@code{XML_PARAM_ENTITY_PARSING_ALWAYS}.  Return true if setting the flag
was successful.
@end deffn

@geindex UseForeignDTD() (xml.parsers.expat.xmlparser method)
@anchor{library/pyexpat xml parsers expat xmlparser UseForeignDTD}@anchor{3eef}
@deffn {Method} xmlparser.UseForeignDTD ([flag])

Calling this with a true value for `flag' (the default) will cause Expat to call
the @ref{3ee7,,ExternalEntityRefHandler} with @ref{887,,None} for all arguments to
allow an alternate DTD to be loaded.  If the document does not contain a
document type declaration, the @code{ExternalEntityRefHandler} will still be
called, but the @ref{3ef0,,StartDoctypeDeclHandler} and
@ref{3ef1,,EndDoctypeDeclHandler} will not be called.

Passing a false value for `flag' will cancel a previous call that passed a true
value, but otherwise has no effect.

This method can only be called before the @ref{3ee4,,Parse()} or @ref{3ee5,,ParseFile()}
methods are called; calling it after either of those have been called causes
@ref{1484,,ExpatError} to be raised with the @ref{1b,,code} attribute set to
@code{errors.codes[errors.XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING]}.
@end deffn

@geindex SetReparseDeferralEnabled() (xml.parsers.expat.xmlparser method)
@anchor{library/pyexpat xml parsers expat xmlparser SetReparseDeferralEnabled}@anchor{579}
@deffn {Method} xmlparser.SetReparseDeferralEnabled (enabled)

@cartouche
@quotation Warning 
Calling @code{SetReparseDeferralEnabled(False)} has security implications,
as detailed below; please make sure to understand these consequences
prior to using the @code{SetReparseDeferralEnabled} method.
@end quotation
@end cartouche

Expat 2.6.0 introduced a security mechanism called “reparse deferral”
where instead of causing denial of service through quadratic runtime
from reparsing large tokens, reparsing of unfinished tokens is now delayed
by default until a sufficient amount of input is reached.
Due to this delay, registered handlers may — depending of the sizing of
input chunks pushed to Expat — no longer be called right after pushing new
input to the parser.  Where immediate feedback and taking over responsibility
of protecting against denial of service from large tokens are both wanted,
calling @code{SetReparseDeferralEnabled(False)} disables reparse deferral
for the current Expat parser instance, temporarily or altogether.
Calling @code{SetReparseDeferralEnabled(True)} allows re-enabling reparse
deferral.

Note that @code{SetReparseDeferralEnabled()} has been backported to some
prior releases of CPython as a security fix.  Check for availability of
@code{SetReparseDeferralEnabled()} using @ref{6fa,,hasattr()} if used in code
running across a variety of Python versions.


Added in version 3.13.

@end deffn

@geindex GetReparseDeferralEnabled() (xml.parsers.expat.xmlparser method)
@anchor{library/pyexpat xml parsers expat xmlparser GetReparseDeferralEnabled}@anchor{578}
@deffn {Method} xmlparser.GetReparseDeferralEnabled ()

Returns whether reparse deferral is currently enabled for the given
Expat parser instance.


Added in version 3.13.

@end deffn

@code{xmlparser} objects have the following methods to tune protections
against some common XML vulnerabilities.

@geindex SetBillionLaughsAttackProtectionActivationThreshold() (xml.parsers.expat.xmlparser method)
@anchor{library/pyexpat xml parsers expat xmlparser SetBillionLaughsAttackProtectionActivationThreshold}@anchor{1778}
@deffn {Method} xmlparser.SetBillionLaughsAttackProtectionActivationThreshold (threshold, /)

Sets the number of output bytes needed to activate protection against
billion laughs@footnote{https://en.wikipedia.org/wiki/Billion_laughs_attack} attacks.

The number of output bytes includes amplification from entity expansion
and reading DTD files.

Parser objects usually have a protection activation threshold of 8 MiB,
but the actual default value depends on the underlying Expat library.

An @ref{1484,,ExpatError} is raised if this method is called on a
@ref{3ee2,,non-root} parser.
The corresponding @ref{3ef2,,lineno} and @ref{3ef3,,offset}
should not be used as they may have no special meaning.

@cartouche
@quotation Note 
Activation thresholds below 4 MiB are known to break support for DITA 1.3
payload and are hence not recommended.
@end quotation
@end cartouche


Added in version 3.14.6.

@end deffn

@geindex SetBillionLaughsAttackProtectionMaximumAmplification() (xml.parsers.expat.xmlparser method)
@anchor{library/pyexpat xml parsers expat xmlparser SetBillionLaughsAttackProtectionMaximumAmplification}@anchor{1779}
@deffn {Method} xmlparser.SetBillionLaughsAttackProtectionMaximumAmplification (max_factor, /)

Sets the maximum tolerated amplification factor for protection against
billion laughs@footnote{https://en.wikipedia.org/wiki/Billion_laughs_attack} attacks.

The amplification factor is calculated as @code{(direct + indirect) / direct}
while parsing, where @code{direct} is the number of bytes read from
the primary document in parsing and @code{indirect} is the number of
bytes added by expanding entities and reading of external DTD files.

The `max_factor' value must be a non-NaN @ref{197,,float} value greater than
or equal to 1.0. Peak amplifications of factor 15,000 for the entire payload
and of factor 30,000 in the middle of parsing have been observed with small
benign files in practice. In particular, the activation threshold should be
carefully chosen to avoid false positives.

Parser objects usually have a maximum amplification factor of 100,
but the actual default value depends on the underlying Expat library.

An @ref{1484,,ExpatError} is raised if this method is called on a
@ref{3ee2,,non-root} parser or if `max_factor' is outside the valid range.
The corresponding @ref{3ef2,,lineno} and @ref{3ef3,,offset}
should not be used as they may have no special meaning.

@cartouche
@quotation Note 
The maximum amplification factor is only considered if the threshold
that can be adjusted by @ref{1778,,SetBillionLaughsAttackProtectionActivationThreshold()}
is exceeded.
@end quotation
@end cartouche


Added in version 3.14.6.

@end deffn

@geindex SetAllocTrackerActivationThreshold() (xml.parsers.expat.xmlparser method)
@anchor{library/pyexpat xml parsers expat xmlparser SetAllocTrackerActivationThreshold}@anchor{1809}
@deffn {Method} xmlparser.SetAllocTrackerActivationThreshold (threshold, /)

Sets the number of allocated bytes of dynamic memory needed to activate
protection against disproportionate use of RAM.

Parser objects usually have an allocation activation threshold of 64 MiB,
but the actual default value depends on the underlying Expat library.

An @ref{1484,,ExpatError} is raised if this method is called on a
@ref{3ee2,,non-root} parser.
The corresponding @ref{3ef2,,lineno} and @ref{3ef3,,offset}
should not be used as they may have no special meaning.


Added in version 3.14.1.

@end deffn

@geindex SetAllocTrackerMaximumAmplification() (xml.parsers.expat.xmlparser method)
@anchor{library/pyexpat xml parsers expat xmlparser SetAllocTrackerMaximumAmplification}@anchor{180a}
@deffn {Method} xmlparser.SetAllocTrackerMaximumAmplification (max_factor, /)

Sets the maximum amplification factor between direct input and bytes
of dynamic memory allocated.

The amplification factor is calculated as @code{allocated / direct}
while parsing, where @code{direct} is the number of bytes read from
the primary document in parsing and @code{allocated} is the number
of bytes of dynamic memory allocated in the parser hierarchy.

The `max_factor' value must be a non-NaN @ref{197,,float} value greater than
or equal to 1.0. Amplification factors greater than 100.0 can be observed
near the start of parsing even with benign files in practice. In particular,
the activation threshold should be carefully chosen to avoid false positives.

Parser objects usually have a maximum amplification factor of 100,
but the actual default value depends on the underlying Expat library.

An @ref{1484,,ExpatError} is raised if this method is called on a
@ref{3ee2,,non-root} parser or if `max_factor' is outside the valid range.
The corresponding @ref{3ef2,,lineno} and @ref{3ef3,,offset}
should not be used as they may have no special meaning.

@cartouche
@quotation Note 
The maximum amplification factor is only considered if the threshold
that can be adjusted by @ref{1809,,SetAllocTrackerActivationThreshold()}
is exceeded.
@end quotation
@end cartouche


Added in version 3.14.1.

@end deffn

@code{xmlparser} objects have the following attributes:

@geindex buffer_size (xml.parsers.expat.xmlparser attribute)
@anchor{library/pyexpat xml parsers expat xmlparser buffer_size}@anchor{1777}
@deffn {Attribute} xmlparser.buffer_size

The size of the buffer used when @ref{16ce,,buffer_text} is true.
A new buffer size can be set by assigning a new integer value
to this attribute.
When the size is changed, the buffer will be flushed.
@end deffn

@geindex buffer_text (xml.parsers.expat.xmlparser attribute)
@anchor{library/pyexpat xml parsers expat xmlparser buffer_text}@anchor{16ce}
@deffn {Attribute} xmlparser.buffer_text

Setting this to true causes the @code{xmlparser} object to buffer textual
content returned by Expat to avoid multiple calls to the
@ref{1776,,CharacterDataHandler()} callback whenever possible.  This can improve
performance substantially since Expat normally breaks character data into chunks
at every line ending.  This attribute is false by default, and may be changed at
any time. Note that when it is false, data that does not contain newlines
may be chunked too.
@end deffn

@geindex buffer_used (xml.parsers.expat.xmlparser attribute)
@anchor{library/pyexpat xml parsers expat xmlparser buffer_used}@anchor{3ef4}
@deffn {Attribute} xmlparser.buffer_used

If @ref{16ce,,buffer_text} is enabled, the number of bytes stored in the buffer.
These bytes represent UTF-8 encoded text.  This attribute has no meaningful
interpretation when @code{buffer_text} is false.
@end deffn

@geindex ordered_attributes (xml.parsers.expat.xmlparser attribute)
@anchor{library/pyexpat xml parsers expat xmlparser ordered_attributes}@anchor{3eec}
@deffn {Attribute} xmlparser.ordered_attributes

Setting this attribute to a non-zero integer causes the attributes to be
reported as a list rather than a dictionary.  The attributes are presented in
the order found in the document text.  For each attribute, two list entries are
presented: the attribute name and the attribute value.  (Older versions of this
module also used this format.)  By default, this attribute is false; it may be
changed at any time.
@end deffn

@geindex specified_attributes (xml.parsers.expat.xmlparser attribute)
@anchor{library/pyexpat xml parsers expat xmlparser specified_attributes}@anchor{3eed}
@deffn {Attribute} xmlparser.specified_attributes

If set to a non-zero integer, the parser will report only those attributes which
were specified in the document instance and not those which were derived from
attribute declarations.  Applications which set this need to be especially
careful to use what additional information is available from the declarations as
needed to comply with the standards for the behavior of XML processors.  By
default, this attribute is false; it may be changed at any time.
@end deffn

The following attributes contain values relating to the most recent error
encountered by an @code{xmlparser} object, and will only have correct values
once a call to @code{Parse()} or @code{ParseFile()} has raised an
@ref{1484,,xml.parsers.expat.ExpatError} exception.

@geindex ErrorByteIndex (xml.parsers.expat.xmlparser attribute)
@anchor{library/pyexpat xml parsers expat xmlparser ErrorByteIndex}@anchor{3ef5}
@deffn {Attribute} xmlparser.ErrorByteIndex

Byte index at which an error occurred.
@end deffn

@geindex ErrorCode (xml.parsers.expat.xmlparser attribute)
@anchor{library/pyexpat xml parsers expat xmlparser ErrorCode}@anchor{3ef6}
@deffn {Attribute} xmlparser.ErrorCode

Numeric code specifying the problem.  This value can be passed to the
@ref{3ee1,,ErrorString()} function, or compared to one of the constants defined in the
@code{errors} object.
@end deffn

@geindex ErrorColumnNumber (xml.parsers.expat.xmlparser attribute)
@anchor{library/pyexpat xml parsers expat xmlparser ErrorColumnNumber}@anchor{3ef7}
@deffn {Attribute} xmlparser.ErrorColumnNumber

Column number at which an error occurred.
@end deffn

@geindex ErrorLineNumber (xml.parsers.expat.xmlparser attribute)
@anchor{library/pyexpat xml parsers expat xmlparser ErrorLineNumber}@anchor{3ef8}
@deffn {Attribute} xmlparser.ErrorLineNumber

Line number at which an error occurred.
@end deffn

The following attributes contain values relating to the current parse location
in an @code{xmlparser} object.  During a callback reporting a parse event they
indicate the location of the first of the sequence of characters that generated
the event.  When called outside of a callback, the position indicated will be
just past the last parse event (regardless of whether there was an associated
callback).

@geindex CurrentByteIndex (xml.parsers.expat.xmlparser attribute)
@anchor{library/pyexpat xml parsers expat xmlparser CurrentByteIndex}@anchor{3ef9}
@deffn {Attribute} xmlparser.CurrentByteIndex

Current byte index in the parser input.
@end deffn

@geindex CurrentColumnNumber (xml.parsers.expat.xmlparser attribute)
@anchor{library/pyexpat xml parsers expat xmlparser CurrentColumnNumber}@anchor{3efa}
@deffn {Attribute} xmlparser.CurrentColumnNumber

Current column number in the parser input.
@end deffn

@geindex CurrentLineNumber (xml.parsers.expat.xmlparser attribute)
@anchor{library/pyexpat xml parsers expat xmlparser CurrentLineNumber}@anchor{3efb}
@deffn {Attribute} xmlparser.CurrentLineNumber

Current line number in the parser input.
@end deffn

Here is the list of handlers that can be set.  To set a handler on an
@code{xmlparser} object `o', use @code{o.handlername = func}.  `handlername' must
be taken from the following list, and `func' must be a callable object accepting
the correct number of arguments.  The arguments are all strings, unless
otherwise stated.

@geindex XmlDeclHandler() (xml.parsers.expat.xmlparser method)
@anchor{library/pyexpat xml parsers expat xmlparser XmlDeclHandler}@anchor{3efc}
@deffn {Method} xmlparser.XmlDeclHandler (version, encoding, standalone)

Called when the XML declaration is parsed.  The XML declaration is the
(optional) declaration of the applicable version of the XML recommendation, the
encoding of the document text, and an optional “standalone” declaration.
`version' and `encoding' will be strings, and `standalone' will be @code{1} if the
document is declared standalone, @code{0} if it is declared not to be standalone,
or @code{-1} if the standalone clause was omitted. This is only available with
Expat version 1.95.0 or newer.
@end deffn

@geindex StartDoctypeDeclHandler() (xml.parsers.expat.xmlparser method)
@anchor{library/pyexpat xml parsers expat xmlparser StartDoctypeDeclHandler}@anchor{3ef0}
@deffn {Method} xmlparser.StartDoctypeDeclHandler (doctypeName, systemId, publicId, has_internal_subset)

Called when Expat begins parsing the document type declaration (@code{<!DOCTYPE
...}).  The `doctypeName' is provided exactly as presented.  The `systemId' and
`publicId' parameters give the system and public identifiers if specified, or
@code{None} if omitted.  `has_internal_subset' will be true if the document
contains an internal document declaration subset. This requires Expat version
1.2 or newer.
@end deffn

@geindex EndDoctypeDeclHandler() (xml.parsers.expat.xmlparser method)
@anchor{library/pyexpat xml parsers expat xmlparser EndDoctypeDeclHandler}@anchor{3ef1}
@deffn {Method} xmlparser.EndDoctypeDeclHandler ()

Called when Expat is done parsing the document type declaration. This requires
Expat version 1.2 or newer.
@end deffn

@geindex ElementDeclHandler() (xml.parsers.expat.xmlparser method)
@anchor{library/pyexpat xml parsers expat xmlparser ElementDeclHandler}@anchor{17a4}
@deffn {Method} xmlparser.ElementDeclHandler (name, model)

Called once for each element type declaration.  `name' is the name of the
element type, and `model' is a representation of the content model.
@end deffn

@geindex AttlistDeclHandler() (xml.parsers.expat.xmlparser method)
@anchor{library/pyexpat xml parsers expat xmlparser AttlistDeclHandler}@anchor{3efd}
@deffn {Method} xmlparser.AttlistDeclHandler (elname, attname, type, default, required)

Called for each declared attribute for an element type.  If an attribute list
declaration declares three attributes, this handler is called three times, once
for each attribute.  `elname' is the name of the element to which the
declaration applies and `attname' is the name of the attribute declared.  The
attribute type is a string passed as `type'; the possible values are
@code{'CDATA'}, @code{'ID'}, @code{'IDREF'}, … `default' gives the default value for
the attribute used when the attribute is not specified by the document instance,
or @code{None} if there is no default value (@code{#IMPLIED} values).  If the
attribute is required to be given in the document instance, `required' will be
true. This requires Expat version 1.95.0 or newer.
@end deffn

@geindex StartElementHandler() (xml.parsers.expat.xmlparser method)
@anchor{library/pyexpat xml parsers expat xmlparser StartElementHandler}@anchor{3efe}
@deffn {Method} xmlparser.StartElementHandler (name, attributes)

Called for the start of every element.  `name' is a string containing the
element name, and `attributes' is the element attributes. If
@ref{3eec,,ordered_attributes} is true, this is a list (see
@code{ordered_attributes} for a full description). Otherwise it’s a
dictionary mapping names to values.
@end deffn

@geindex EndElementHandler() (xml.parsers.expat.xmlparser method)
@anchor{library/pyexpat xml parsers expat xmlparser EndElementHandler}@anchor{3eff}
@deffn {Method} xmlparser.EndElementHandler (name)

Called for the end of every element.
@end deffn

@geindex ProcessingInstructionHandler() (xml.parsers.expat.xmlparser method)
@anchor{library/pyexpat xml parsers expat xmlparser ProcessingInstructionHandler}@anchor{3f00}
@deffn {Method} xmlparser.ProcessingInstructionHandler (target, data)

Called for every processing instruction.
@end deffn

@geindex CharacterDataHandler() (xml.parsers.expat.xmlparser method)
@anchor{library/pyexpat xml parsers expat xmlparser CharacterDataHandler}@anchor{1776}
@deffn {Method} xmlparser.CharacterDataHandler (data)

Called for character data.  This will be called for normal character data, CDATA
marked content, and ignorable whitespace.  Applications which must distinguish
these cases can use the @ref{3f01,,StartCdataSectionHandler},
@ref{3f02,,EndCdataSectionHandler}, and @ref{17a4,,ElementDeclHandler} callbacks to
collect the required information. Note that the character data may be
chunked even if it is short and so you may receive more than one call to
@code{CharacterDataHandler()}. Set the @ref{16ce,,buffer_text} instance attribute
to @code{True} to avoid that.
@end deffn

@geindex UnparsedEntityDeclHandler() (xml.parsers.expat.xmlparser method)
@anchor{library/pyexpat xml parsers expat xmlparser UnparsedEntityDeclHandler}@anchor{3ee9}
@deffn {Method} xmlparser.UnparsedEntityDeclHandler (entityName, base, systemId, publicId, notationName)

Called for unparsed (NDATA) entity declarations.  This is only present for
version 1.2 of the Expat library; for more recent versions, use
@ref{3f03,,EntityDeclHandler} instead.  (The underlying function in the Expat
library has been declared obsolete.)
@end deffn

@geindex EntityDeclHandler() (xml.parsers.expat.xmlparser method)
@anchor{library/pyexpat xml parsers expat xmlparser EntityDeclHandler}@anchor{3f03}
@deffn {Method} xmlparser.EntityDeclHandler (entityName, is_parameter_entity, value, base, systemId, publicId, notationName)

Called for all entity declarations.  For parameter and internal entities,
`value' will be a string giving the declared contents of the entity; this will
be @code{None} for external entities.  The `notationName' parameter will be
@code{None} for parsed entities, and the name of the notation for unparsed
entities. `is_parameter_entity' will be true if the entity is a parameter entity
or false for general entities (most applications only need to be concerned with
general entities). This is only available starting with version 1.95.0 of the
Expat library.
@end deffn

@geindex NotationDeclHandler() (xml.parsers.expat.xmlparser method)
@anchor{library/pyexpat xml parsers expat xmlparser NotationDeclHandler}@anchor{3ee8}
@deffn {Method} xmlparser.NotationDeclHandler (notationName, base, systemId, publicId)

Called for notation declarations.  `notationName', `base', and `systemId', and
`publicId' are strings if given.  If the public identifier is omitted,
`publicId' will be @code{None}.
@end deffn

@geindex StartNamespaceDeclHandler() (xml.parsers.expat.xmlparser method)
@anchor{library/pyexpat xml parsers expat xmlparser StartNamespaceDeclHandler}@anchor{3f04}
@deffn {Method} xmlparser.StartNamespaceDeclHandler (prefix, uri)

Called when an element contains a namespace declaration.  Namespace declarations
are processed before the @ref{3efe,,StartElementHandler} is called for the element
on which declarations are placed.
@end deffn

@geindex EndNamespaceDeclHandler() (xml.parsers.expat.xmlparser method)
@anchor{library/pyexpat xml parsers expat xmlparser EndNamespaceDeclHandler}@anchor{3f05}
@deffn {Method} xmlparser.EndNamespaceDeclHandler (prefix)

Called when the closing tag is reached for an element  that contained a
namespace declaration.  This is called once for each namespace declaration on
the element in the reverse of the order for which the
@ref{3f04,,StartNamespaceDeclHandler} was called to indicate the start of each
namespace declaration’s scope.  Calls to this handler are made after the
corresponding @ref{3eff,,EndElementHandler} for the end of the element.
@end deffn

@geindex CommentHandler() (xml.parsers.expat.xmlparser method)
@anchor{library/pyexpat xml parsers expat xmlparser CommentHandler}@anchor{3f06}
@deffn {Method} xmlparser.CommentHandler (data)

Called for comments.  `data' is the text of the comment, excluding the leading
@code{'<!-}@code{-'} and trailing @code{'-}@code{->'}.
@end deffn

@geindex StartCdataSectionHandler() (xml.parsers.expat.xmlparser method)
@anchor{library/pyexpat xml parsers expat xmlparser StartCdataSectionHandler}@anchor{3f01}
@deffn {Method} xmlparser.StartCdataSectionHandler ()

Called at the start of a CDATA section.  This and @ref{3f02,,EndCdataSectionHandler}
are needed to be able to identify the syntactical start and end for CDATA
sections.
@end deffn

@geindex EndCdataSectionHandler() (xml.parsers.expat.xmlparser method)
@anchor{library/pyexpat xml parsers expat xmlparser EndCdataSectionHandler}@anchor{3f02}
@deffn {Method} xmlparser.EndCdataSectionHandler ()

Called at the end of a CDATA section.
@end deffn

@geindex DefaultHandler() (xml.parsers.expat.xmlparser method)
@anchor{library/pyexpat xml parsers expat xmlparser DefaultHandler}@anchor{3f07}
@deffn {Method} xmlparser.DefaultHandler (data)

Called for any characters in the XML document for which no applicable handler
has been specified.  This means characters that are part of a construct which
could be reported, but for which no handler has been supplied.
@end deffn

@geindex DefaultHandlerExpand() (xml.parsers.expat.xmlparser method)
@anchor{library/pyexpat xml parsers expat xmlparser DefaultHandlerExpand}@anchor{3f08}
@deffn {Method} xmlparser.DefaultHandlerExpand (data)

This is the same as the @ref{3f07,,DefaultHandler()},  but doesn’t inhibit expansion
of internal entities. The entity reference will not be passed to the default
handler.
@end deffn

@geindex NotStandaloneHandler() (xml.parsers.expat.xmlparser method)
@anchor{library/pyexpat xml parsers expat xmlparser NotStandaloneHandler}@anchor{3f09}
@deffn {Method} xmlparser.NotStandaloneHandler ()

Called if the XML document hasn’t been declared as being a standalone document.
This happens when there is an external subset or a reference to a parameter
entity, but the XML declaration does not set standalone to @code{yes} in an XML
declaration.  If this handler returns @code{0}, then the parser will raise an
@code{XML_ERROR_NOT_STANDALONE} error.  If this handler is not set, no
exception is raised by the parser for this condition.
@end deffn

@geindex ExternalEntityRefHandler() (xml.parsers.expat.xmlparser method)
@anchor{library/pyexpat xml parsers expat xmlparser ExternalEntityRefHandler}@anchor{3ee7}
@deffn {Method} xmlparser.ExternalEntityRefHandler (context, base, systemId, publicId)

@cartouche
@quotation Warning 
Implementing a handler that accesses local files and/or the network
may create a vulnerability to
external entity attacks@footnote{https://en.wikipedia.org/wiki/XML_external_entity_attack}
if @code{xmlparser} is used with user-provided XML content.
Please reflect on your threat model@footnote{https://en.wikipedia.org/wiki/Threat_model}
before implementing this handler.
@end quotation
@end cartouche

Called for references to external entities.  `base' is the current base, as set
by a previous call to @ref{3ee6,,SetBase()}.  The public and system identifiers,
`systemId' and `publicId', are strings if given; if the public identifier is not
given, `publicId' will be @code{None}.  The `context' value is opaque and should
only be used as described below.

For external entities to be parsed, this handler must be implemented. It is
responsible for creating the sub-parser using
@code{ExternalEntityParserCreate(context)}, initializing it with the appropriate
callbacks, and parsing the entity.  This handler should return an integer; if it
returns @code{0}, the parser will raise an
@code{XML_ERROR_EXTERNAL_ENTITY_HANDLING} error, otherwise parsing will
continue.

If this handler is not provided, external entities are reported by the
@ref{3f07,,DefaultHandler} callback, if provided.
@end deffn

@node ExpatError Exceptions,Example<10>,XMLParser Objects<2>,xml parsers expat — Fast XML parsing using Expat
@anchor{library/pyexpat expaterror-exceptions}@anchor{3f0a}@anchor{library/pyexpat expaterror-objects}@anchor{3edd}
@subsubsection ExpatError Exceptions


@ref{1484,,ExpatError} exceptions have a number of interesting attributes:

@geindex code (xml.parsers.expat.ExpatError attribute)
@anchor{library/pyexpat xml parsers expat ExpatError code}@anchor{3f0b}
@deffn {Attribute} ExpatError.code

Expat’s internal error number for the specific error.  The
@ref{3f0c,,errors.messages} dictionary maps
these error numbers to Expat’s error messages.  For example:

@example
from xml.parsers.expat import ParserCreate, ExpatError, errors

p = ParserCreate()
try:
    p.Parse(some_xml_document)
except ExpatError as err:
    print("Error:", errors.messages[err.code])
@end example

The @ref{12e,,errors} module also provides error message
constants and a dictionary @ref{3f0d,,codes} mapping
these messages back to the error codes, see below.
@end deffn

@geindex lineno (xml.parsers.expat.ExpatError attribute)
@anchor{library/pyexpat xml parsers expat ExpatError lineno}@anchor{3ef2}
@deffn {Attribute} ExpatError.lineno

Line number on which the error was detected.  The first line is numbered @code{1}.
@end deffn

@geindex offset (xml.parsers.expat.ExpatError attribute)
@anchor{library/pyexpat xml parsers expat ExpatError offset}@anchor{3ef3}
@deffn {Attribute} ExpatError.offset

Character offset into the line where the error occurred.  The first column is
numbered @code{0}.
@end deffn

@node Example<10>,Content Model Descriptions,ExpatError Exceptions,xml parsers expat — Fast XML parsing using Expat
@anchor{library/pyexpat example}@anchor{3f0e}@anchor{library/pyexpat expat-example}@anchor{3f0f}
@subsubsection Example


The following program defines three handlers that just print out their
arguments.

@example
import xml.parsers.expat

# 3 handler functions
def start_element(name, attrs):
    print('Start element:', name, attrs)
def end_element(name):
    print('End element:', name)
def char_data(data):
    print('Character data:', repr(data))

p = xml.parsers.expat.ParserCreate()

p.StartElementHandler = start_element
p.EndElementHandler = end_element
p.CharacterDataHandler = char_data

p.Parse("""<?xml version="1.0"?>
<parent id="top"><child1 name="paul">Text goes here</child1>
<child2 name="fred">More text</child2>
</parent>""", 1)
@end example

The output from this program is:

@example
Start element: parent @{'id': 'top'@}
Start element: child1 @{'name': 'paul'@}
Character data: 'Text goes here'
End element: child1
Character data: '\n'
Start element: child2 @{'name': 'fred'@}
Character data: 'More text'
End element: child2
Character data: '\n'
End element: parent
@end example

@node Content Model Descriptions,Expat error constants,Example<10>,xml parsers expat — Fast XML parsing using Expat
@anchor{library/pyexpat content-model-descriptions}@anchor{3f10}@anchor{library/pyexpat expat-content-models}@anchor{3f11}@anchor{library/pyexpat module-xml parsers expat model}@anchor{12f}
@subsubsection Content Model Descriptions


@geindex module; xml.parsers.expat.model

Content models are described using nested tuples.  Each tuple contains four
values: the type, the quantifier, the name, and a tuple of children.  Children
are simply additional content model descriptions.

The values of the first two fields are constants defined in the
@code{xml.parsers.expat.model} module.  These constants can be collected in two
groups: the model type group and the quantifier group.

The constants in the model type group are:


@deffn {Data} xml.parsers.expat.model.XML_CTYPE_ANY

The element named by the model name was declared to have a content model of
@code{ANY}.
@end deffn


@deffn {Data} xml.parsers.expat.model.XML_CTYPE_CHOICE

The named element allows a choice from a number of options; this is used for
content models such as @code{(A | B | C)}.
@end deffn


@deffn {Data} xml.parsers.expat.model.XML_CTYPE_EMPTY

Elements which are declared to be @code{EMPTY} have this model type.
@end deffn


@deffn {Data} xml.parsers.expat.model.XML_CTYPE_MIXED
@end deffn


@deffn {Data} xml.parsers.expat.model.XML_CTYPE_NAME
@end deffn


@deffn {Data} xml.parsers.expat.model.XML_CTYPE_SEQ

Models which represent a series of models which follow one after the other are
indicated with this model type.  This is used for models such as @code{(A, B, C)}.
@end deffn

The constants in the quantifier group are:


@deffn {Data} xml.parsers.expat.model.XML_CQUANT_NONE

No modifier is given, so it can appear exactly once, as for @code{A}.
@end deffn


@deffn {Data} xml.parsers.expat.model.XML_CQUANT_OPT

The model is optional: it can appear once or not at all, as for @code{A?}.
@end deffn


@deffn {Data} xml.parsers.expat.model.XML_CQUANT_PLUS

The model must occur one or more times (like @code{A+}).
@end deffn


@deffn {Data} xml.parsers.expat.model.XML_CQUANT_REP

The model must occur zero or more times, as for @code{A*}.
@end deffn

@node Expat error constants,,Content Model Descriptions,xml parsers expat — Fast XML parsing using Expat
@anchor{library/pyexpat expat-error-constants}@anchor{3f12}@anchor{library/pyexpat expat-errors}@anchor{3f13}@anchor{library/pyexpat module-xml parsers expat errors}@anchor{12e}
@subsubsection Expat error constants


@geindex module; xml.parsers.expat.errors

The following constants are provided in the @code{xml.parsers.expat.errors}
module.  These constants are useful in interpreting some of the attributes of
the @code{ExpatError} exception objects raised when an error has occurred.
Since for backwards compatibility reasons, the constants’ value is the error
`message' and not the numeric error `code', you do this by comparing its
@ref{1b,,code} attribute with
@code{errors.codes[errors.XML_ERROR_@var{CONSTANT_NAME}]}.

The @code{errors} module has the following attributes:

@geindex codes (in module xml.parsers.expat.errors)
@anchor{library/pyexpat xml parsers expat errors codes}@anchor{3f0d}
@deffn {Data} xml.parsers.expat.errors.codes

A dictionary mapping string descriptions to their error codes.


Added in version 3.2.

@end deffn

@geindex messages (in module xml.parsers.expat.errors)
@anchor{library/pyexpat xml parsers expat errors messages}@anchor{3f0c}
@deffn {Data} xml.parsers.expat.errors.messages

A dictionary mapping numeric error codes to their string descriptions.


Added in version 3.2.

@end deffn

@geindex XML_ERROR_ASYNC_ENTITY (in module xml.parsers.expat.errors)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_ASYNC_ENTITY}@anchor{3f14}
@deffn {Data} xml.parsers.expat.errors.XML_ERROR_ASYNC_ENTITY
@end deffn

@geindex XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF (in module xml.parsers.expat.errors)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF}@anchor{3f15}
@deffn {Data} xml.parsers.expat.errors.XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF

An entity reference in an attribute value referred to an external entity instead
of an internal entity.
@end deffn

@geindex XML_ERROR_BAD_CHAR_REF (in module xml.parsers.expat.errors)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_BAD_CHAR_REF}@anchor{3f16}
@deffn {Data} xml.parsers.expat.errors.XML_ERROR_BAD_CHAR_REF

A character reference referred to a character which is illegal in XML (for
example, character @code{0}, or ‘@code{&#0;}’).
@end deffn

@geindex XML_ERROR_BINARY_ENTITY_REF (in module xml.parsers.expat.errors)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_BINARY_ENTITY_REF}@anchor{3f17}
@deffn {Data} xml.parsers.expat.errors.XML_ERROR_BINARY_ENTITY_REF

An entity reference referred to an entity which was declared with a notation, so
cannot be parsed.
@end deffn

@geindex XML_ERROR_DUPLICATE_ATTRIBUTE (in module xml.parsers.expat.errors)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_DUPLICATE_ATTRIBUTE}@anchor{3f18}
@deffn {Data} xml.parsers.expat.errors.XML_ERROR_DUPLICATE_ATTRIBUTE

An attribute was used more than once in a start tag.
@end deffn

@geindex XML_ERROR_INCORRECT_ENCODING (in module xml.parsers.expat.errors)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_INCORRECT_ENCODING}@anchor{3f19}
@deffn {Data} xml.parsers.expat.errors.XML_ERROR_INCORRECT_ENCODING
@end deffn

@geindex XML_ERROR_INVALID_TOKEN (in module xml.parsers.expat.errors)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_INVALID_TOKEN}@anchor{3f1a}
@deffn {Data} xml.parsers.expat.errors.XML_ERROR_INVALID_TOKEN

Raised when an input byte could not properly be assigned to a character; for
example, a NUL byte (value @code{0}) in a UTF-8 input stream.
@end deffn

@geindex XML_ERROR_JUNK_AFTER_DOC_ELEMENT (in module xml.parsers.expat.errors)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_JUNK_AFTER_DOC_ELEMENT}@anchor{3f1b}
@deffn {Data} xml.parsers.expat.errors.XML_ERROR_JUNK_AFTER_DOC_ELEMENT

Something other than whitespace occurred after the document element.
@end deffn

@geindex XML_ERROR_MISPLACED_XML_PI (in module xml.parsers.expat.errors)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_MISPLACED_XML_PI}@anchor{3f1c}
@deffn {Data} xml.parsers.expat.errors.XML_ERROR_MISPLACED_XML_PI

An XML declaration was found somewhere other than the start of the input data.
@end deffn

@geindex XML_ERROR_NO_ELEMENTS (in module xml.parsers.expat.errors)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_NO_ELEMENTS}@anchor{3f1d}
@deffn {Data} xml.parsers.expat.errors.XML_ERROR_NO_ELEMENTS

The document contains no elements (XML requires all documents to contain exactly
one top-level element)..
@end deffn

@geindex XML_ERROR_NO_MEMORY (in module xml.parsers.expat.errors)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_NO_MEMORY}@anchor{3f1e}
@deffn {Data} xml.parsers.expat.errors.XML_ERROR_NO_MEMORY

Expat was not able to allocate memory internally.
@end deffn

@geindex XML_ERROR_PARAM_ENTITY_REF (in module xml.parsers.expat.errors)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_PARAM_ENTITY_REF}@anchor{3f1f}
@deffn {Data} xml.parsers.expat.errors.XML_ERROR_PARAM_ENTITY_REF

A parameter entity reference was found where it was not allowed.
@end deffn

@geindex XML_ERROR_PARTIAL_CHAR (in module xml.parsers.expat.errors)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_PARTIAL_CHAR}@anchor{3f20}
@deffn {Data} xml.parsers.expat.errors.XML_ERROR_PARTIAL_CHAR

An incomplete character was found in the input.
@end deffn

@geindex XML_ERROR_RECURSIVE_ENTITY_REF (in module xml.parsers.expat.errors)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_RECURSIVE_ENTITY_REF}@anchor{3f21}
@deffn {Data} xml.parsers.expat.errors.XML_ERROR_RECURSIVE_ENTITY_REF

An entity reference contained another reference to the same entity; possibly via
a different name, and possibly indirectly.
@end deffn

@geindex XML_ERROR_SYNTAX (in module xml.parsers.expat.errors)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_SYNTAX}@anchor{3f22}
@deffn {Data} xml.parsers.expat.errors.XML_ERROR_SYNTAX

Some unspecified syntax error was encountered.
@end deffn

@geindex XML_ERROR_TAG_MISMATCH (in module xml.parsers.expat.errors)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_TAG_MISMATCH}@anchor{3f23}
@deffn {Data} xml.parsers.expat.errors.XML_ERROR_TAG_MISMATCH

An end tag did not match the innermost open start tag.
@end deffn

@geindex XML_ERROR_UNCLOSED_TOKEN (in module xml.parsers.expat.errors)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_UNCLOSED_TOKEN}@anchor{3f24}
@deffn {Data} xml.parsers.expat.errors.XML_ERROR_UNCLOSED_TOKEN

Some token (such as a start tag) was not closed before the end of the stream or
the next token was encountered.
@end deffn

@geindex XML_ERROR_UNDEFINED_ENTITY (in module xml.parsers.expat.errors)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_UNDEFINED_ENTITY}@anchor{3f25}
@deffn {Data} xml.parsers.expat.errors.XML_ERROR_UNDEFINED_ENTITY

A reference was made to an entity which was not defined.
@end deffn

@geindex XML_ERROR_UNKNOWN_ENCODING (in module xml.parsers.expat.errors)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_UNKNOWN_ENCODING}@anchor{3f26}
@deffn {Data} xml.parsers.expat.errors.XML_ERROR_UNKNOWN_ENCODING

The document encoding is not supported by Expat.
@end deffn

@geindex XML_ERROR_UNCLOSED_CDATA_SECTION (in module xml.parsers.expat.errors)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_UNCLOSED_CDATA_SECTION}@anchor{3f27}
@deffn {Data} xml.parsers.expat.errors.XML_ERROR_UNCLOSED_CDATA_SECTION

A CDATA marked section was not closed.
@end deffn

@geindex XML_ERROR_EXTERNAL_ENTITY_HANDLING (in module xml.parsers.expat.errors)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_EXTERNAL_ENTITY_HANDLING}@anchor{3f28}
@deffn {Data} xml.parsers.expat.errors.XML_ERROR_EXTERNAL_ENTITY_HANDLING
@end deffn

@geindex XML_ERROR_NOT_STANDALONE (in module xml.parsers.expat.errors)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_NOT_STANDALONE}@anchor{3f29}
@deffn {Data} xml.parsers.expat.errors.XML_ERROR_NOT_STANDALONE

The parser determined that the document was not “standalone” though it declared
itself to be in the XML declaration, and the @code{NotStandaloneHandler} was
set and returned @code{0}.
@end deffn

@geindex XML_ERROR_UNEXPECTED_STATE (in module xml.parsers.expat.errors)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_UNEXPECTED_STATE}@anchor{3f2a}
@deffn {Data} xml.parsers.expat.errors.XML_ERROR_UNEXPECTED_STATE
@end deffn

@geindex XML_ERROR_ENTITY_DECLARED_IN_PE (in module xml.parsers.expat.errors)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_ENTITY_DECLARED_IN_PE}@anchor{3f2b}
@deffn {Data} xml.parsers.expat.errors.XML_ERROR_ENTITY_DECLARED_IN_PE
@end deffn

@geindex XML_ERROR_FEATURE_REQUIRES_XML_DTD (in module xml.parsers.expat.errors)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_FEATURE_REQUIRES_XML_DTD}@anchor{3f2c}
@deffn {Data} xml.parsers.expat.errors.XML_ERROR_FEATURE_REQUIRES_XML_DTD

An operation was requested that requires DTD support to be compiled in, but
Expat was configured without DTD support.  This should never be reported by a
standard build of the @code{xml.parsers.expat} module.
@end deffn

@geindex XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING (in module xml.parsers.expat.errors)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING}@anchor{3f2d}
@deffn {Data} xml.parsers.expat.errors.XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING

A behavioral change was requested after parsing started that can only be changed
before parsing has started.  This is (currently) only raised by
@code{UseForeignDTD()}.
@end deffn

@geindex XML_ERROR_UNBOUND_PREFIX (in module xml.parsers.expat.errors)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_UNBOUND_PREFIX}@anchor{3f2e}
@deffn {Data} xml.parsers.expat.errors.XML_ERROR_UNBOUND_PREFIX

An undeclared prefix was found when namespace processing was enabled.
@end deffn

@geindex XML_ERROR_UNDECLARING_PREFIX (in module xml.parsers.expat.errors)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_UNDECLARING_PREFIX}@anchor{3f2f}
@deffn {Data} xml.parsers.expat.errors.XML_ERROR_UNDECLARING_PREFIX

The document attempted to remove the namespace declaration associated with a
prefix.
@end deffn

@geindex XML_ERROR_INCOMPLETE_PE (in module xml.parsers.expat.errors)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_INCOMPLETE_PE}@anchor{3f30}
@deffn {Data} xml.parsers.expat.errors.XML_ERROR_INCOMPLETE_PE

A parameter entity contained incomplete markup.
@end deffn

@geindex XML_ERROR_XML_DECL (in module xml.parsers.expat.errors)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_XML_DECL}@anchor{3f31}
@deffn {Data} xml.parsers.expat.errors.XML_ERROR_XML_DECL

The document contained no document element at all.
@end deffn

@geindex XML_ERROR_TEXT_DECL (in module xml.parsers.expat.errors)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_TEXT_DECL}@anchor{3f32}
@deffn {Data} xml.parsers.expat.errors.XML_ERROR_TEXT_DECL

There was an error parsing a text declaration in an external entity.
@end deffn

@geindex XML_ERROR_PUBLICID (in module xml.parsers.expat.errors)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_PUBLICID}@anchor{3f33}
@deffn {Data} xml.parsers.expat.errors.XML_ERROR_PUBLICID

Characters were found in the public id that are not allowed.
@end deffn

@geindex XML_ERROR_SUSPENDED (in module xml.parsers.expat.errors)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_SUSPENDED}@anchor{3f34}
@deffn {Data} xml.parsers.expat.errors.XML_ERROR_SUSPENDED

The requested operation was made on a suspended parser, but isn’t allowed.  This
includes attempts to provide additional input or to stop the parser.
@end deffn

@geindex XML_ERROR_NOT_SUSPENDED (in module xml.parsers.expat.errors)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_NOT_SUSPENDED}@anchor{3f35}
@deffn {Data} xml.parsers.expat.errors.XML_ERROR_NOT_SUSPENDED

An attempt to resume the parser was made when the parser had not been suspended.
@end deffn

@geindex XML_ERROR_ABORTED (in module xml.parsers.expat.errors)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_ABORTED}@anchor{3f36}
@deffn {Data} xml.parsers.expat.errors.XML_ERROR_ABORTED

This should not be reported to Python applications.
@end deffn

@geindex XML_ERROR_FINISHED (in module xml.parsers.expat.errors)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_FINISHED}@anchor{3f37}
@deffn {Data} xml.parsers.expat.errors.XML_ERROR_FINISHED

The requested operation was made on a parser which was finished parsing input,
but isn’t allowed.  This includes attempts to provide additional input or to
stop the parser.
@end deffn

@geindex XML_ERROR_SUSPEND_PE (in module xml.parsers.expat.errors)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_SUSPEND_PE}@anchor{3f38}
@deffn {Data} xml.parsers.expat.errors.XML_ERROR_SUSPEND_PE
@end deffn

@geindex XML_ERROR_RESERVED_PREFIX_XML (in module xml.parsers.expat.errors)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_RESERVED_PREFIX_XML}@anchor{3f39}
@deffn {Data} xml.parsers.expat.errors.XML_ERROR_RESERVED_PREFIX_XML

An attempt was made to
undeclare reserved namespace prefix @code{xml}
or to bind it to another namespace URI.
@end deffn

@geindex XML_ERROR_RESERVED_PREFIX_XMLNS (in module xml.parsers.expat.errors)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_RESERVED_PREFIX_XMLNS}@anchor{3f3a}
@deffn {Data} xml.parsers.expat.errors.XML_ERROR_RESERVED_PREFIX_XMLNS

An attempt was made to declare or undeclare reserved namespace prefix @code{xmlns}.
@end deffn

@geindex XML_ERROR_RESERVED_NAMESPACE_URI (in module xml.parsers.expat.errors)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_RESERVED_NAMESPACE_URI}@anchor{3f3b}
@deffn {Data} xml.parsers.expat.errors.XML_ERROR_RESERVED_NAMESPACE_URI

An attempt was made to bind the URI of one the reserved namespace
prefixes @code{xml} and @code{xmlns} to another namespace prefix.
@end deffn

@geindex XML_ERROR_INVALID_ARGUMENT (in module xml.parsers.expat.errors)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_INVALID_ARGUMENT}@anchor{3f3c}
@deffn {Data} xml.parsers.expat.errors.XML_ERROR_INVALID_ARGUMENT

This should not be reported to Python applications.
@end deffn

@geindex XML_ERROR_NO_BUFFER (in module xml.parsers.expat.errors)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_NO_BUFFER}@anchor{3f3d}
@deffn {Data} xml.parsers.expat.errors.XML_ERROR_NO_BUFFER

This should not be reported to Python applications.
@end deffn

@geindex XML_ERROR_AMPLIFICATION_LIMIT_BREACH (in module xml.parsers.expat.errors)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_AMPLIFICATION_LIMIT_BREACH}@anchor{3f3e}
@deffn {Data} xml.parsers.expat.errors.XML_ERROR_AMPLIFICATION_LIMIT_BREACH

The limit on input amplification factor (from DTD and entities)
has been breached.
@end deffn

@geindex XML_ERROR_NOT_STARTED (in module xml.parsers.expat.errors)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_NOT_STARTED}@anchor{1919}
@deffn {Data} xml.parsers.expat.errors.XML_ERROR_NOT_STARTED

The parser was tried to be stopped or suspended before it started.


Added in version 3.14.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Internet Protocols and Support,Multimedia Services,Structured Markup Processing Tools,The Python Standard Library
@anchor{library/internet doc}@anchor{3f3f}@anchor{library/internet internet}@anchor{3f40}@anchor{library/internet internet-protocols-and-support}@anchor{3f41}@anchor{library/internet translation-repo}@anchor{3f42}
@section Internet Protocols and Support


@geindex WWW
@geindex Internet
@geindex World Wide Web

@geindex module; socket

The modules described in this chapter implement internet protocols and  support
for related technology.  They are all implemented in Python. Most of these
modules require the presence of the system-dependent module @ref{d1,,socket}, which
is currently supported on most popular platforms.  Here is an overview:

@menu
* webbrowser — Convenient web-browser controller:: 
* wsgiref — WSGI Utilities and Reference Implementation:: 
* urllib — URL handling modules:: 
* urllib.request — Extensible library for opening URLs: urllib request — Extensible library for opening URLs. 
* urllib.response — Response classes used by urllib: urllib response — Response classes used by urllib. 
* urllib.parse — Parse URLs into components: urllib parse — Parse URLs into components. 
* urllib.error — Exception classes raised by urllib.request: urllib error — Exception classes raised by urllib request. 
* urllib.robotparser — Parser for robots.txt: urllib robotparser — Parser for robots txt. 
* http — HTTP modules:: 
* http.client — HTTP protocol client: http client — HTTP protocol client. 
* ftplib — FTP protocol client:: 
* poplib — POP3 protocol client:: 
* imaplib — IMAP4 protocol client:: 
* smtplib — SMTP protocol client:: 
* uuid — UUID objects according to RFC 9562:: 
* socketserver — A framework for network servers:: 
* http.server — HTTP servers: http server — HTTP servers. 
* http.cookies — HTTP state management: http cookies — HTTP state management. 
* http.cookiejar — Cookie handling for HTTP clients: http cookiejar — Cookie handling for HTTP clients. 
* xmlrpc — XMLRPC server and client modules:: 
* xmlrpc.client — XML-RPC client access: xmlrpc client — XML-RPC client access. 
* xmlrpc.server — Basic XML-RPC servers: xmlrpc server — Basic XML-RPC servers. 
* ipaddress — IPv4/IPv6 manipulation library:: 

@end menu

@node webbrowser — Convenient web-browser controller,wsgiref — WSGI Utilities and Reference Implementation,,Internet Protocols and Support
@anchor{library/webbrowser doc}@anchor{3f43}@anchor{library/webbrowser module-webbrowser}@anchor{11c}@anchor{library/webbrowser webbrowser-convenient-web-browser-controller}@anchor{3f44}
@subsection @code{webbrowser} — Convenient web-browser controller


@geindex module; webbrowser

`Source code:' Lib/webbrowser.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/webbrowser.py}


__________________________________________________________________


The @code{webbrowser} module provides a high-level interface to allow displaying
web-based documents to users. Under most circumstances, simply calling the
@ref{17a6,,open()} function from this module will do the right thing.

Under Unix, graphical browsers are preferred under X11, but text-mode browsers
will be used if graphical browsers are not available or an X11 display isn’t
available.  If text-mode browsers are used, the calling process will block until
the user exits the browser.

If the environment variable 
@geindex BROWSER
@geindex environment variable; BROWSER
@code{BROWSER} exists, it is interpreted as the
@ref{2177,,os.pathsep}-separated list of browsers to try ahead of the platform
defaults.  When the value of a list part contains the string @code{%s}, then it is
interpreted as a literal browser command line to be used with the argument URL
substituted for @code{%s}; if the value is a single word that refers to one of the
already registered browsers this browser is added to the front of the search list;
if the part does not contain @code{%s}, it is simply interpreted as the name of the
browser to launch. @footnote{
Executables named here without a full path will be searched in the
directories given in the 
@geindex PATH
@geindex environment variable; PATH
@code{PATH} environment variable.
}


Changed in version 3.14: The 
@geindex BROWSER
@geindex environment variable; BROWSER
@code{BROWSER} variable can now also be used to reorder the list of
platform defaults. This is particularly useful on macOS where the platform
defaults do not refer to command-line tools on 
@geindex PATH
@geindex environment variable; PATH
@code{PATH}.


For non-Unix platforms, or when a remote browser is available on Unix, the
controlling process will not wait for the user to finish with the browser, but
allow the remote browser to maintain its own windows on the display.  If remote
browsers are not available on Unix, the controlling process will launch a new
browser and wait.

On iOS, the 
@geindex BROWSER
@geindex environment variable; BROWSER
@code{BROWSER} environment variable, as well as any arguments
controlling autoraise, browser preference, and new tab/window creation will be
ignored. Web pages will `always' be opened in the user’s preferred browser, in
a new tab, with the browser being brought to the foreground. The use of the
@code{webbrowser} module on iOS requires the @ref{2e,,ctypes} module. If
@code{ctypes} isn’t available, calls to @ref{17a6,,open()} will fail.

@menu
* Command-line interface: Command-line interface<6>. 
* Browser controller objects:: 

@end menu

@node Command-line interface<6>,Browser controller objects,,webbrowser — Convenient web-browser controller
@anchor{library/webbrowser command-line-interface}@anchor{3f45}@anchor{library/webbrowser webbrowser-cli}@anchor{3f46}
@subsubsection Command-line interface


The script @code{webbrowser} can be used as a command-line interface for the
module. It accepts a URL as the argument. It accepts the following optional
parameters:

@geindex webbrowser command line option; -n
@geindex webbrowser command line option; --new-window
@anchor{library/webbrowser cmdoption-webbrowser-n}@anchor{3f47}@anchor{library/webbrowser cmdoption-webbrowser-new-window}@anchor{3f48}
@deffn {Option} @w{-}n, @w{-}@w{-}new@w{-}window

Opens the URL in a new browser window, if possible.
@end deffn

@geindex webbrowser command line option; -t
@geindex webbrowser command line option; --new-tab
@anchor{library/webbrowser cmdoption-webbrowser-t}@anchor{3f49}@anchor{library/webbrowser cmdoption-webbrowser-new-tab}@anchor{3f4a}
@deffn {Option} @w{-}t, @w{-}@w{-}new@w{-}tab

Opens the URL in a new browser tab.
@end deffn

The options are, naturally, mutually exclusive.  Usage example:

@example
python -m webbrowser -t "https://www.python.org"
@end example

@ref{2181,,Availability}: not WASI, not Android.

The following exception is defined:

@geindex Error
@anchor{library/webbrowser webbrowser Error}@anchor{3f4b}
@deffn {Exception} webbrowser.Error

Exception raised when a browser control error occurs.
@end deffn

The following functions are defined:

@geindex open() (in module webbrowser)
@anchor{library/webbrowser webbrowser open}@anchor{17a6}
@deffn {Function} webbrowser.open (url, new=0, autoraise=True)

Display `url' using the default browser. If `new' is 0, the `url' is opened
in the same browser window if possible.  If `new' is 1, a new browser window
is opened if possible.  If `new' is 2, a new browser page (“tab”) is opened
if possible.  If `autoraise' is @code{True}, the window is raised if possible
(note that under many window managers this will occur regardless of the
setting of this variable).

Returns @code{True} if a browser was successfully launched, @code{False} otherwise.

Note that on some platforms, trying to open a filename using this function,
may work and start the operating system’s associated program.  However, this
is neither supported nor portable.

Raises an @ref{1cb1,,auditing event} @code{webbrowser.open} with argument @code{url}.
@end deffn

@geindex open_new() (in module webbrowser)
@anchor{library/webbrowser webbrowser open_new}@anchor{3f4c}
@deffn {Function} webbrowser.open_new (url)

Open `url' in a new window of the default browser, if possible, otherwise, open
`url' in the only browser window.

Returns @code{True} if a browser was successfully launched, @code{False} otherwise.
@end deffn

@geindex open_new_tab() (in module webbrowser)
@anchor{library/webbrowser webbrowser open_new_tab}@anchor{3f4d}
@deffn {Function} webbrowser.open_new_tab (url)

Open `url' in a new page (“tab”) of the default browser, if possible, otherwise
equivalent to @ref{3f4c,,open_new()}.

Returns @code{True} if a browser was successfully launched, @code{False} otherwise.
@end deffn

@geindex get() (in module webbrowser)
@anchor{library/webbrowser webbrowser get}@anchor{3f4e}
@deffn {Function} webbrowser.get (using=None)

Return a controller object for the browser type `using'.  If `using' is
@code{None}, return a controller for a default browser appropriate to the
caller’s environment.
@end deffn

@geindex register() (in module webbrowser)
@anchor{library/webbrowser webbrowser register}@anchor{3f4f}
@deffn {Function} webbrowser.register (name, constructor, instance=None, *, preferred=False)

Register the browser type `name'.  Once a browser type is registered, the
@ref{3f4e,,get()} function can return a controller for that browser type.  If
`instance' is not provided, or is @code{None}, `constructor' will be called without
parameters to create an instance when needed.  If `instance' is provided,
`constructor' will never be called, and may be @code{None}.

Setting `preferred' to @code{True} makes this browser a preferred result for
a @ref{3f4e,,get()} call with no argument.  Otherwise, this entry point is only
useful if you plan to either set the 
@geindex BROWSER
@geindex environment variable; BROWSER
@code{BROWSER} variable or call
@code{get()} with a nonempty argument matching the name of a handler you
declare.


Changed in version 3.7: `preferred' keyword-only parameter was added.

@end deffn

A number of browser types are predefined.  This table gives the type names that
may be passed to the @ref{3f4e,,get()} function and the corresponding instantiations
for the controller classes, all defined in this module.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxx} 
@headitem

Type Name

@tab

Class Name

@tab

Notes

@item

@code{'mozilla'}

@tab

@code{Mozilla('mozilla')}

@tab

@item

@code{'firefox'}

@tab

@code{Mozilla('mozilla')}

@tab

@item

@code{'epiphany'}

@tab

@code{Epiphany('epiphany')}

@tab

@item

@code{'kfmclient'}

@tab

@code{Konqueror()}

@tab

(1)

@item

@code{'konqueror'}

@tab

@code{Konqueror()}

@tab

(1)

@item

@code{'kfm'}

@tab

@code{Konqueror()}

@tab

(1)

@item

@code{'opera'}

@tab

@code{Opera()}

@tab

@item

@code{'links'}

@tab

@code{GenericBrowser('links')}

@tab

@item

@code{'elinks'}

@tab

@code{Elinks('elinks')}

@tab

@item

@code{'lynx'}

@tab

@code{GenericBrowser('lynx')}

@tab

@item

@code{'w3m'}

@tab

@code{GenericBrowser('w3m')}

@tab

@item

@code{'windows-default'}

@tab

@code{WindowsDefault}

@tab

(2)

@item

@code{'macosx'}

@tab

@code{MacOSXOSAScript('default')}

@tab

(3)

@item

@code{'safari'}

@tab

@code{MacOSXOSAScript('safari')}

@tab

(3)

@item

@code{'google-chrome'}

@tab

@code{Chrome('google-chrome')}

@tab

@item

@code{'chrome'}

@tab

@code{Chrome('chrome')}

@tab

@item

@code{'chromium'}

@tab

@code{Chromium('chromium')}

@tab

@item

@code{'chromium-browser'}

@tab

@code{Chromium('chromium-browser')}

@tab

@item

@code{'iosbrowser'}

@tab

@code{IOSBrowser}

@tab

(4)

@end multitable


Notes:


@enumerate 

@item 
“Konqueror” is the file manager for the KDE desktop environment for Unix, and
only makes sense to use if KDE is running.  Some way of reliably detecting KDE
would be nice; the @code{KDEDIR} variable is not sufficient.  Note also that
the name “kfm” is used even when using the @code{konqueror} command with KDE
2 — the implementation selects the best strategy for running Konqueror.

@item 
Only on Windows platforms.

@item 
Only on macOS.

@item 
Only on iOS.
@end enumerate


Added in version 3.2: A new @code{MacOSXOSAScript} class has been added
and is used on Mac instead of the previous @code{MacOSX} class.
This adds support for opening browsers not currently set as the OS default.



Added in version 3.3: Support for Chrome/Chromium has been added.



Changed in version 3.12: Support for several obsolete browsers has been removed.
Removed browsers include Grail, Mosaic, Netscape, Galeon,
Skipstone, Iceape, and Firefox versions 35 and below.



Changed in version 3.13: Support for iOS has been added.


Here are some simple examples:

@example
url = 'https://docs.python.org/'

# Open URL in a new tab, if a browser window is already open.
webbrowser.open_new_tab(url)

# Open URL in new window, raising the window if possible.
webbrowser.open_new(url)
@end example

@node Browser controller objects,,Command-line interface<6>,webbrowser — Convenient web-browser controller
@anchor{library/webbrowser browser-controller-objects}@anchor{3f50}@anchor{library/webbrowser browser-controllers}@anchor{3f51}
@subsubsection Browser controller objects


Browser controllers provide the @ref{59a,,name} attribute,
and the following three methods which parallel module-level convenience functions:

@geindex name (webbrowser.controller attribute)
@anchor{library/webbrowser webbrowser controller name}@anchor{59a}
@deffn {Attribute} controller.name

System-dependent name for the browser.
@end deffn

@geindex open() (webbrowser.controller method)
@anchor{library/webbrowser webbrowser controller open}@anchor{3f52}
@deffn {Method} controller.open (url, new=0, autoraise=True)

Display `url' using the browser handled by this controller. If `new' is 1, a new
browser window is opened if possible. If `new' is 2, a new browser page (“tab”)
is opened if possible.
@end deffn

@geindex open_new() (webbrowser.controller method)
@anchor{library/webbrowser webbrowser controller open_new}@anchor{3f53}
@deffn {Method} controller.open_new (url)

Open `url' in a new window of the browser handled by this controller, if
possible, otherwise, open `url' in the only browser window.  Alias
@ref{3f4c,,open_new()}.
@end deffn

@geindex open_new_tab() (webbrowser.controller method)
@anchor{library/webbrowser webbrowser controller open_new_tab}@anchor{3f54}
@deffn {Method} controller.open_new_tab (url)

Open `url' in a new page (“tab”) of the browser handled by this controller, if
possible, otherwise equivalent to @ref{3f4c,,open_new()}.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node wsgiref — WSGI Utilities and Reference Implementation,urllib — URL handling modules,webbrowser — Convenient web-browser controller,Internet Protocols and Support
@anchor{library/wsgiref doc}@anchor{3f55}@anchor{library/wsgiref module-wsgiref}@anchor{11f}@anchor{library/wsgiref translation-repo}@anchor{3f56}@anchor{library/wsgiref wsgiref-wsgi-utilities-and-reference-implementation}@anchor{3f57}
@subsection @code{wsgiref} — WSGI Utilities and Reference Implementation


@geindex module; wsgiref

`Source code:' Lib/wsgiref@footnote{https://github.com/python/cpython/tree/3.14/Lib/wsgiref}


__________________________________________________________________


@cartouche
@quotation Warning 
@code{wsgiref} is a reference implementation and is not recommended for
production. The module only implements basic security checks.
@end quotation
@end cartouche

The Web Server Gateway Interface (WSGI) is a standard interface between web
server software and web applications written in Python. Having a standard
interface makes it easy to use an application that supports WSGI with a number
of different web servers.

Only authors of web servers and programming frameworks need to know every detail
and corner case of the WSGI design.  You don’t need to understand every detail
of WSGI just to install a WSGI application or to write a web application using
an existing framework.

@code{wsgiref} is a reference implementation of the WSGI specification that can
be used to add WSGI support to a web server or framework.  It provides utilities
for manipulating WSGI environment variables and response headers, base classes
for implementing WSGI servers, a demo HTTP server that serves WSGI applications,
types for static type checking,
and a validation tool that checks WSGI servers and applications for conformance
to the WSGI specification (
@geindex Python Enhancement Proposals; PEP 3333
PEP 3333@footnote{https://peps.python.org/pep-3333/}).

See wsgi.readthedocs.io@footnote{https://wsgi.readthedocs.io/} for more information about WSGI, and links
to tutorials and other resources.

@c XXX If you're just trying to write a web application...

@menu
* wsgiref.util – WSGI environment utilities: wsgiref util – WSGI environment utilities. 
* wsgiref.headers – WSGI response header tools: wsgiref headers – WSGI response header tools. 
* wsgiref.simple_server – a simple WSGI HTTP server: wsgiref simple_server – a simple WSGI HTTP server. 
* wsgiref.validate — WSGI conformance checker: wsgiref validate — WSGI conformance checker. 
* wsgiref.handlers – server/gateway base classes: wsgiref handlers – server/gateway base classes. 
* wsgiref.types – WSGI types for static type checking: wsgiref types – WSGI types for static type checking. 
* Examples: Examples<26>. 

@end menu

@node wsgiref util – WSGI environment utilities,wsgiref headers – WSGI response header tools,,wsgiref — WSGI Utilities and Reference Implementation
@anchor{library/wsgiref module-wsgiref util}@anchor{124}@anchor{library/wsgiref wsgiref-util-wsgi-environment-utilities}@anchor{3f58}
@subsubsection @code{wsgiref.util} – WSGI environment utilities


@geindex module; wsgiref.util

This module provides a variety of utility functions for working with WSGI
environments.  A WSGI environment is a dictionary containing HTTP request
variables as described in 
@geindex Python Enhancement Proposals; PEP 3333
PEP 3333@footnote{https://peps.python.org/pep-3333/}.  All of the functions taking an `environ'
parameter expect a WSGI-compliant dictionary to be supplied; please see
@geindex Python Enhancement Proposals; PEP 3333
PEP 3333@footnote{https://peps.python.org/pep-3333/} for a detailed specification and
@ref{3f59,,WSGIEnvironment} for a type alias that can be used
in type annotations.

@geindex guess_scheme() (in module wsgiref.util)
@anchor{library/wsgiref wsgiref util guess_scheme}@anchor{3f5a}
@deffn {Function} wsgiref.util.guess_scheme (environ)

Return a guess for whether @code{wsgi.url_scheme} should be “http” or “https”, by
checking for a @code{HTTPS} environment variable in the `environ' dictionary.  The
return value is a string.

This function is useful when creating a gateway that wraps CGI or a CGI-like
protocol such as FastCGI.  Typically, servers providing such protocols will
include a @code{HTTPS} variable with a value of “1”, “yes”, or “on” when a request
is received via SSL.  So, this function returns “https” if such a value is
found, and “http” otherwise.
@end deffn

@geindex request_uri() (in module wsgiref.util)
@anchor{library/wsgiref wsgiref util request_uri}@anchor{3f5b}
@deffn {Function} wsgiref.util.request_uri (environ, include_query=True)

Return the full request URI, optionally including the query string, using the
algorithm found in the “URL Reconstruction” section of 
@geindex Python Enhancement Proposals; PEP 3333
PEP 3333@footnote{https://peps.python.org/pep-3333/}.  If
`include_query' is false, the query string is not included in the resulting URI.
@end deffn

@geindex application_uri() (in module wsgiref.util)
@anchor{library/wsgiref wsgiref util application_uri}@anchor{3f5c}
@deffn {Function} wsgiref.util.application_uri (environ)

Similar to @ref{3f5b,,request_uri()}, except that the @code{PATH_INFO} and
@code{QUERY_STRING} variables are ignored.  The result is the base URI of the
application object addressed by the request.
@end deffn

@geindex shift_path_info() (in module wsgiref.util)
@anchor{library/wsgiref wsgiref util shift_path_info}@anchor{3f5d}
@deffn {Function} wsgiref.util.shift_path_info (environ)

Shift a single name from @code{PATH_INFO} to @code{SCRIPT_NAME} and return the name.
The `environ' dictionary is `modified' in-place; use a copy if you need to keep
the original @code{PATH_INFO} or @code{SCRIPT_NAME} intact.

If there are no remaining path segments in @code{PATH_INFO}, @code{None} is returned.

Typically, this routine is used to process each portion of a request URI path,
for example to treat the path as a series of dictionary keys. This routine
modifies the passed-in environment to make it suitable for invoking another WSGI
application that is located at the target URI. For example, if there is a WSGI
application at @code{/foo}, and the request URI path is @code{/foo/bar/baz}, and the
WSGI application at @code{/foo} calls @code{shift_path_info()}, it will receive the
string “bar”, and the environment will be updated to be suitable for passing to
a WSGI application at @code{/foo/bar}.  That is, @code{SCRIPT_NAME} will change from
@code{/foo} to @code{/foo/bar}, and @code{PATH_INFO} will change from @code{/bar/baz} to
@code{/baz}.

When @code{PATH_INFO} is just a “/”, this routine returns an empty string and
appends a trailing slash to @code{SCRIPT_NAME}, even though empty path segments are
normally ignored, and @code{SCRIPT_NAME} doesn’t normally end in a slash.  This is
intentional behavior, to ensure that an application can tell the difference
between URIs ending in @code{/x} from ones ending in @code{/x/} when using this
routine to do object traversal.
@end deffn

@geindex setup_testing_defaults() (in module wsgiref.util)
@anchor{library/wsgiref wsgiref util setup_testing_defaults}@anchor{3f5e}
@deffn {Function} wsgiref.util.setup_testing_defaults (environ)

Update `environ' with trivial defaults for testing purposes.

This routine adds various parameters required for WSGI, including @code{HTTP_HOST},
@code{SERVER_NAME}, @code{SERVER_PORT}, @code{REQUEST_METHOD}, @code{SCRIPT_NAME},
@code{PATH_INFO}, and all of the 
@geindex Python Enhancement Proposals; PEP 3333
PEP 3333@footnote{https://peps.python.org/pep-3333/}-defined @code{wsgi.*} variables.  It
only supplies default values, and does not replace any existing settings for
these variables.

This routine is intended to make it easier for unit tests of WSGI servers and
applications to set up dummy environments.  It should NOT be used by actual WSGI
servers or applications, since the data is fake!

Example usage (see also @ref{3f5f,,demo_app()}
for another example):

@example
from wsgiref.util import setup_testing_defaults
from wsgiref.simple_server import make_server

# A relatively simple WSGI application. It's going to print out the
# environment dictionary after being updated by setup_testing_defaults
def simple_app(environ, start_response):
    setup_testing_defaults(environ)

    status = '200 OK'
    headers = [('Content-type', 'text/plain; charset=utf-8')]

    start_response(status, headers)

    ret = [("%s: %s\n" % (key, value)).encode("utf-8")
           for key, value in environ.items()]
    return ret

with make_server('@w{'}, 8000, simple_app) as httpd:
    print("Serving on port 8000...")
    httpd.serve_forever()
@end example
@end deffn

In addition to the environment functions above, the @code{wsgiref.util} module
also provides these miscellaneous utilities:

@geindex is_hop_by_hop() (in module wsgiref.util)
@anchor{library/wsgiref wsgiref util is_hop_by_hop}@anchor{1a82}
@deffn {Function} wsgiref.util.is_hop_by_hop (header_name)

Return @code{True} if ‘header_name’ is an HTTP/1.1 “Hop-by-Hop” header, as defined by
@geindex RFC; RFC 2616
RFC 2616@footnote{https://datatracker.ietf.org/doc/html/rfc2616.html}.
@end deffn

@geindex FileWrapper (class in wsgiref.util)
@anchor{library/wsgiref wsgiref util FileWrapper}@anchor{944}
@deffn {Class} wsgiref.util.FileWrapper (filelike, blksize=8192)

A concrete implementation of the @ref{3f60,,wsgiref.types.FileWrapper}
protocol used to convert a file-like object to an @ref{4c9,,iterator}.
The resulting objects
are @ref{1433,,iterable}s. As the object is iterated over, the
optional `blksize' parameter will be repeatedly passed to the `filelike'
object’s @code{read()} method to obtain bytestrings to yield.  When @code{read()}
returns an empty bytestring, iteration is ended and is not resumable.

If `filelike' has a @code{close()} method, the returned object will also have a
@code{close()} method, and it will invoke the `filelike' object’s @code{close()}
method when called.

Example usage:

@example
from io import StringIO
from wsgiref.util import FileWrapper

# We're using a StringIO-buffer for as the file-like object
filelike = StringIO("This is an example file-like object"*10)
wrapper = FileWrapper(filelike, blksize=5)

for chunk in wrapper:
    print(chunk)
@end example


Changed in version 3.11: Support for @ref{588,,__getitem__()} method has been removed.

@end deffn

@node wsgiref headers – WSGI response header tools,wsgiref simple_server – a simple WSGI HTTP server,wsgiref util – WSGI environment utilities,wsgiref — WSGI Utilities and Reference Implementation
@anchor{library/wsgiref module-wsgiref headers}@anchor{121}@anchor{library/wsgiref wsgiref-headers-wsgi-response-header-tools}@anchor{3f61}
@subsubsection @code{wsgiref.headers} – WSGI response header tools


@geindex module; wsgiref.headers

This module provides a single class, @ref{109e,,Headers}, for convenient
manipulation of WSGI response headers using a mapping-like interface.

@geindex Headers (class in wsgiref.headers)
@anchor{library/wsgiref wsgiref headers Headers}@anchor{109e}
@deffn {Class} wsgiref.headers.Headers ([headers])

Create a mapping-like object wrapping `headers', which must be a list of header
name/value tuples as described in 
@geindex Python Enhancement Proposals; PEP 3333
PEP 3333@footnote{https://peps.python.org/pep-3333/}. The default value of `headers' is
an empty list.

@code{Headers} objects support typical mapping operations including
@ref{588,,__getitem__()}, @ref{2078,,get()}, @ref{14d7,,__setitem__()},
@ref{127f,,setdefault()},
@ref{14d8,,__delitem__()} and @ref{15c5,,__contains__()}.  For each of
these methods, the key is the header name (treated case-insensitively), and the
value is the first value associated with that header name.  Setting a header
deletes any existing values for that header, then adds a new value at the end of
the wrapped header list.  Headers’ existing order is generally maintained, with
new headers added to the end of the wrapped list.

Unlike a dictionary, @code{Headers} objects do not raise an error when you try
to get or delete a key that isn’t in the wrapped header list. Getting a
nonexistent header just returns @code{None}, and deleting a nonexistent header does
nothing.

@code{Headers} objects also support @code{keys()}, @code{values()}, and
@code{items()} methods.  The lists returned by @code{keys()} and @code{items()} can
include the same key more than once if there is a multi-valued header.  The
@code{len()} of a @code{Headers} object is the same as the length of its
@code{items()}, which is the same as the length of the wrapped header list.  In
fact, the @code{items()} method just returns a copy of the wrapped header list.

Calling @code{bytes()} on a @code{Headers} object returns a formatted bytestring
suitable for transmission as HTTP response headers.  Each header is placed on a
line with its value, separated by a colon and a space. Each line is terminated
by a carriage return and line feed, and the bytestring is terminated with a
blank line.

In addition to their mapping interface and formatting features, @code{Headers}
objects also have the following methods for querying and adding multi-valued
headers, and for adding headers with MIME parameters:

@geindex get_all() (wsgiref.headers.Headers method)
@anchor{library/wsgiref wsgiref headers Headers get_all}@anchor{3f62}
@deffn {Method} get_all (name)

Return a list of all the values for the named header.

The returned list will be sorted in the order they appeared in the original
header list or were added to this instance, and may contain duplicates.  Any
fields deleted and re-inserted are always appended to the header list.  If no
fields exist with the given name, returns an empty list.
@end deffn

@geindex add_header() (wsgiref.headers.Headers method)
@anchor{library/wsgiref wsgiref headers Headers add_header}@anchor{3f63}
@deffn {Method} add_header (name, value, **_params)

Add a (possibly multi-valued) header, with optional MIME parameters specified
via keyword arguments.

`name' is the header field to add.  Keyword arguments can be used to set MIME
parameters for the header field.  Each parameter must be a string or @code{None}.
Underscores in parameter names are converted to dashes, since dashes are illegal
in Python identifiers, but many MIME parameter names include dashes.  If the
parameter value is a string, it is added to the header value parameters in the
form @code{name="value"}. If it is @code{None}, only the parameter name is added.
(This is used for MIME parameters without a value.)  Example usage:

@example
h.add_header('content-disposition', 'attachment', filename='bud.gif')
@end example

The above will add a header that looks like this:

@example
Content-Disposition: attachment; filename="bud.gif"
@end example
@end deffn


Changed in version 3.5: `headers' parameter is optional.

@end deffn

@node wsgiref simple_server – a simple WSGI HTTP server,wsgiref validate — WSGI conformance checker,wsgiref headers – WSGI response header tools,wsgiref — WSGI Utilities and Reference Implementation
@anchor{library/wsgiref module-wsgiref simple_server}@anchor{122}@anchor{library/wsgiref wsgiref-simple-server-a-simple-wsgi-http-server}@anchor{3f64}
@subsubsection @code{wsgiref.simple_server} – a simple WSGI HTTP server


@geindex module; wsgiref.simple_server

This module implements a simple HTTP server (based on @ref{76,,http.server})
that serves WSGI applications.  Each server instance serves a single WSGI
application on a given host and port.  If you want to serve multiple
applications on a single host and port, you should create a WSGI application
that parses @code{PATH_INFO} to select which application to invoke for each
request.  (E.g., using the @code{shift_path_info()} function from
@ref{124,,wsgiref.util}.)

@geindex make_server() (in module wsgiref.simple_server)
@anchor{library/wsgiref wsgiref simple_server make_server}@anchor{3f65}
@deffn {Function} wsgiref.simple_server.make_server (host, port, app, server_class=WSGIServer, handler_class=WSGIRequestHandler)

Create a new WSGI server listening on `host' and `port', accepting connections
for `app'.  The return value is an instance of the supplied `server_class', and
will process requests using the specified `handler_class'.  `app' must be a WSGI
application object, as defined by 
@geindex Python Enhancement Proposals; PEP 3333
PEP 3333@footnote{https://peps.python.org/pep-3333/}.

Example usage:

@example
from wsgiref.simple_server import make_server, demo_app

with make_server('@w{'}, 8000, demo_app) as httpd:
    print("Serving HTTP on port 8000...")

    # Respond to requests until process is killed
    httpd.serve_forever()

    # Alternative: serve one request, then exit
    httpd.handle_request()
@end example
@end deffn

@geindex demo_app() (in module wsgiref.simple_server)
@anchor{library/wsgiref wsgiref simple_server demo_app}@anchor{3f5f}
@deffn {Function} wsgiref.simple_server.demo_app (environ, start_response)

This function is a small but complete WSGI application that returns a text page
containing the message “Hello world!” and a list of the key/value pairs provided
in the `environ' parameter.  It’s useful for verifying that a WSGI server (such
as @code{wsgiref.simple_server}) is able to run a simple WSGI application
correctly.

The `start_response' callable should follow the @ref{3f66,,StartResponse} protocol.
@end deffn

@geindex WSGIServer (class in wsgiref.simple_server)
@anchor{library/wsgiref wsgiref simple_server WSGIServer}@anchor{3f67}
@deffn {Class} wsgiref.simple_server.WSGIServer (server_address, RequestHandlerClass)

Create a @code{WSGIServer} instance.  `server_address' should be a
@code{(host,port)} tuple, and `RequestHandlerClass' should be the subclass of
@ref{12d7,,http.server.BaseHTTPRequestHandler} that will be used to process
requests.

You do not normally need to call this constructor, as the @ref{3f65,,make_server()}
function can handle all the details for you.

@code{WSGIServer} is a subclass of @ref{3f68,,http.server.HTTPServer}, so all
of its methods (such as @code{serve_forever()} and @code{handle_request()}) are
available. @code{WSGIServer} also provides these WSGI-specific methods:

@geindex set_app() (wsgiref.simple_server.WSGIServer method)
@anchor{library/wsgiref wsgiref simple_server WSGIServer set_app}@anchor{3f69}
@deffn {Method} set_app (application)

Sets the callable `application' as the WSGI application that will receive
requests.
@end deffn

@geindex get_app() (wsgiref.simple_server.WSGIServer method)
@anchor{library/wsgiref wsgiref simple_server WSGIServer get_app}@anchor{3f6a}
@deffn {Method} get_app ()

Returns the currently set application callable.
@end deffn

Normally, however, you do not need to use these additional methods, as
@ref{3f69,,set_app()} is normally called by @ref{3f65,,make_server()}, and the
@ref{3f6a,,get_app()} exists mainly for the benefit of request handler instances.
@end deffn

@geindex WSGIRequestHandler (class in wsgiref.simple_server)
@anchor{library/wsgiref wsgiref simple_server WSGIRequestHandler}@anchor{3f6b}
@deffn {Class} wsgiref.simple_server.WSGIRequestHandler (request, client_address, server)

Create an HTTP handler for the given `request' (i.e. a socket), `client_address'
(a @code{(host,port)} tuple), and `server' (@ref{3f67,,WSGIServer} instance).

You do not need to create instances of this class directly; they are
automatically created as needed by @ref{3f67,,WSGIServer} objects.  You can,
however, subclass this class and supply it as a `handler_class' to the
@ref{3f65,,make_server()} function.  Some possibly relevant methods for overriding in
subclasses:

@geindex get_environ() (wsgiref.simple_server.WSGIRequestHandler method)
@anchor{library/wsgiref wsgiref simple_server WSGIRequestHandler get_environ}@anchor{3f6c}
@deffn {Method} get_environ ()

Return a @ref{3f59,,WSGIEnvironment} dictionary for a
request.  The default
implementation copies the contents of the @ref{3f67,,WSGIServer} object’s
@code{base_environ} dictionary attribute and then adds various headers derived
from the HTTP request.  Each call to this method should return a new dictionary
containing all of the relevant CGI environment variables as specified in
@geindex Python Enhancement Proposals; PEP 3333
PEP 3333@footnote{https://peps.python.org/pep-3333/}.
@end deffn

@geindex get_stderr() (wsgiref.simple_server.WSGIRequestHandler method)
@anchor{library/wsgiref wsgiref simple_server WSGIRequestHandler get_stderr}@anchor{3f6d}
@deffn {Method} get_stderr ()

Return the object that should be used as the @code{wsgi.errors} stream. The default
implementation just returns @code{sys.stderr}.
@end deffn

@geindex handle() (wsgiref.simple_server.WSGIRequestHandler method)
@anchor{library/wsgiref wsgiref simple_server WSGIRequestHandler handle}@anchor{3f6e}
@deffn {Method} handle ()

Process the HTTP request.  The default implementation creates a handler instance
using a @ref{120,,wsgiref.handlers} class to implement the actual WSGI application
interface.
@end deffn
@end deffn

@node wsgiref validate — WSGI conformance checker,wsgiref handlers – server/gateway base classes,wsgiref simple_server – a simple WSGI HTTP server,wsgiref — WSGI Utilities and Reference Implementation
@anchor{library/wsgiref module-wsgiref validate}@anchor{125}@anchor{library/wsgiref wsgiref-validate-wsgi-conformance-checker}@anchor{3f6f}
@subsubsection @code{wsgiref.validate} — WSGI conformance checker


@geindex module; wsgiref.validate

When creating new WSGI application objects, frameworks, servers, or middleware,
it can be useful to validate the new code’s conformance using
@code{wsgiref.validate}.  This module provides a function that creates WSGI
application objects that validate communications between a WSGI server or
gateway and a WSGI application object, to check both sides for protocol
conformance.

Note that this utility does not guarantee complete 
@geindex Python Enhancement Proposals; PEP 3333
PEP 3333@footnote{https://peps.python.org/pep-3333/} compliance; an
absence of errors from this module does not necessarily mean that errors do not
exist.  However, if this module does produce an error, then it is virtually
certain that either the server or application is not 100% compliant.

This module is based on the @code{paste.lint} module from Ian Bicking’s “Python
Paste” library.

@geindex validator() (in module wsgiref.validate)
@anchor{library/wsgiref wsgiref validate validator}@anchor{3f70}
@deffn {Function} wsgiref.validate.validator (application)

Wrap `application' and return a new WSGI application object.  The returned
application will forward all requests to the original `application', and will
check that both the `application' and the server invoking it are conforming to
the WSGI specification and to 
@geindex RFC; RFC 2616
RFC 2616@footnote{https://datatracker.ietf.org/doc/html/rfc2616.html}.

Any detected nonconformance results in an @ref{8ba,,AssertionError} being raised;
note, however, that how these errors are handled is server-dependent.  For
example, @ref{122,,wsgiref.simple_server} and other servers based on
@ref{120,,wsgiref.handlers} (that don’t override the error handling methods to do
something else) will simply output a message that an error has occurred, and
dump the traceback to @code{sys.stderr} or some other error stream.

This wrapper may also generate output using the @ref{119,,warnings} module to
indicate behaviors that are questionable but which may not actually be
prohibited by 
@geindex Python Enhancement Proposals; PEP 3333
PEP 3333@footnote{https://peps.python.org/pep-3333/}.  Unless they are suppressed using Python command-line
options or the @code{warnings} API, any such warnings will be written to
@code{sys.stderr} (`not' @code{wsgi.errors}, unless they happen to be the same
object).

Example usage:

@example
from wsgiref.validate import validator
from wsgiref.simple_server import make_server

# Our callable object which is intentionally not compliant to the
# standard, so the validator is going to break
def simple_app(environ, start_response):
    status = '200 OK'  # HTTP Status
    headers = [('Content-type', 'text/plain')]  # HTTP Headers
    start_response(status, headers)

    # This is going to break because we need to return a list, and
    # the validator is going to inform us
    return b"Hello World"

# This is the application wrapped in a validator
validator_app = validator(simple_app)

with make_server('@w{'}, 8000, validator_app) as httpd:
    print("Listening on port 8000....")
    httpd.serve_forever()
@end example
@end deffn

@node wsgiref handlers – server/gateway base classes,wsgiref types – WSGI types for static type checking,wsgiref validate — WSGI conformance checker,wsgiref — WSGI Utilities and Reference Implementation
@anchor{library/wsgiref module-wsgiref handlers}@anchor{120}@anchor{library/wsgiref wsgiref-handlers-server-gateway-base-classes}@anchor{3f71}
@subsubsection @code{wsgiref.handlers} – server/gateway base classes


@geindex module; wsgiref.handlers

This module provides base handler classes for implementing WSGI servers and
gateways.  These base classes handle most of the work of communicating with a
WSGI application, as long as they are given a CGI-like environment, along with
input, output, and error streams.

@geindex CGIHandler (class in wsgiref.handlers)
@anchor{library/wsgiref wsgiref handlers CGIHandler}@anchor{3f72}
@deffn {Class} wsgiref.handlers.CGIHandler

CGI-based invocation via @code{sys.stdin}, @code{sys.stdout}, @code{sys.stderr} and
@code{os.environ}.  This is useful when you have a WSGI application and want to run
it as a CGI script.  Simply invoke @code{CGIHandler().run(app)}, where @code{app} is
the WSGI application object you wish to invoke.

This class is a subclass of @ref{3f73,,BaseCGIHandler} that sets @code{wsgi.run_once}
to true, @code{wsgi.multithread} to false, and @code{wsgi.multiprocess} to true, and
always uses @ref{df,,sys} and @ref{a5,,os} to obtain the necessary CGI streams and
environment.
@end deffn

@geindex IISCGIHandler (class in wsgiref.handlers)
@anchor{library/wsgiref wsgiref handlers IISCGIHandler}@anchor{3f74}
@deffn {Class} wsgiref.handlers.IISCGIHandler

A specialized alternative to @ref{3f72,,CGIHandler}, for use when deploying on
Microsoft’s IIS web server, without having set the config allowPathInfo
option (IIS>=7) or metabase allowPathInfoForScriptMappings (IIS<7).

By default, IIS gives a @code{PATH_INFO} that duplicates the @code{SCRIPT_NAME} at
the front, causing problems for WSGI applications that wish to implement
routing. This handler strips any such duplicated path.

IIS can be configured to pass the correct @code{PATH_INFO}, but this causes
another bug where @code{PATH_TRANSLATED} is wrong. Luckily this variable is
rarely used and is not guaranteed by WSGI. On IIS<7, though, the
setting can only be made on a vhost level, affecting all other script
mappings, many of which break when exposed to the @code{PATH_TRANSLATED} bug.
For this reason IIS<7 is almost never deployed with the fix (Even IIS7
rarely uses it because there is still no UI for it.).

There is no way for CGI code to tell whether the option was set, so a
separate handler class is provided.  It is used in the same way as
@ref{3f72,,CGIHandler}, i.e., by calling @code{IISCGIHandler().run(app)}, where
@code{app} is the WSGI application object you wish to invoke.


Added in version 3.2.

@end deffn

@geindex BaseCGIHandler (class in wsgiref.handlers)
@anchor{library/wsgiref wsgiref handlers BaseCGIHandler}@anchor{3f73}
@deffn {Class} wsgiref.handlers.BaseCGIHandler (stdin, stdout, stderr, environ, multithread=True, multiprocess=False)

Similar to @ref{3f72,,CGIHandler}, but instead of using the @ref{df,,sys} and
@ref{a5,,os} modules, the CGI environment and I/O streams are specified explicitly.
The `multithread' and `multiprocess' values are used to set the
@code{wsgi.multithread} and @code{wsgi.multiprocess} flags for any applications run by
the handler instance.

This class is a subclass of @ref{3f75,,SimpleHandler} intended for use with
software other than HTTP “origin servers”.  If you are writing a gateway
protocol implementation (such as CGI, FastCGI, SCGI, etc.) that uses a
@code{Status:} header to send an HTTP status, you probably want to subclass this
instead of @code{SimpleHandler}.
@end deffn

@geindex SimpleHandler (class in wsgiref.handlers)
@anchor{library/wsgiref wsgiref handlers SimpleHandler}@anchor{3f75}
@deffn {Class} wsgiref.handlers.SimpleHandler (stdin, stdout, stderr, environ, multithread=True, multiprocess=False)

Similar to @ref{3f73,,BaseCGIHandler}, but designed for use with HTTP origin
servers.  If you are writing an HTTP server implementation, you will probably
want to subclass this instead of @code{BaseCGIHandler}.

This class is a subclass of @ref{1e15,,BaseHandler}.  It overrides the
@code{__init__()}, @ref{3f76,,get_stdin()},
@ref{3f77,,get_stderr()}, @ref{3f78,,add_cgi_vars()},
@ref{3f79,,_write()}, and @ref{3f7a,,_flush()} methods to
support explicitly setting the
environment and streams via the constructor.  The supplied environment and
streams are stored in the @code{stdin}, @code{stdout}, @code{stderr}, and
@code{environ} attributes.

The @ref{edd,,write()} method of `stdout' should write
each chunk in full, like @ref{8a5,,io.BufferedIOBase}.
@end deffn

@geindex BaseHandler (class in wsgiref.handlers)
@anchor{library/wsgiref wsgiref handlers BaseHandler}@anchor{1e15}
@deffn {Class} wsgiref.handlers.BaseHandler

This is an abstract base class for running WSGI applications.  Each instance
will handle a single HTTP request, although in principle you could create a
subclass that was reusable for multiple requests.

@code{BaseHandler} instances have only one method intended for external use:

@geindex run() (wsgiref.handlers.BaseHandler method)
@anchor{library/wsgiref wsgiref handlers BaseHandler run}@anchor{3f7b}
@deffn {Method} run (app)

Run the specified WSGI application, `app'.
@end deffn

All of the other @code{BaseHandler} methods are invoked by this method in the
process of running the application, and thus exist primarily to allow
customizing the process.

The following methods MUST be overridden in a subclass:

@geindex _write() (wsgiref.handlers.BaseHandler method)
@anchor{library/wsgiref wsgiref handlers BaseHandler _write}@anchor{3f79}
@deffn {Method} _write (data)

Buffer the bytes `data' for transmission to the client.  It’s okay if this
method actually transmits the data; @code{BaseHandler} just separates write
and flush operations for greater efficiency when the underlying system actually
has such a distinction.
@end deffn

@geindex _flush() (wsgiref.handlers.BaseHandler method)
@anchor{library/wsgiref wsgiref handlers BaseHandler _flush}@anchor{3f7a}
@deffn {Method} _flush ()

Force buffered data to be transmitted to the client.  It’s okay if this method
is a no-op (i.e., if @ref{3f79,,_write()} actually sends the data).
@end deffn

@geindex get_stdin() (wsgiref.handlers.BaseHandler method)
@anchor{library/wsgiref wsgiref handlers BaseHandler get_stdin}@anchor{3f76}
@deffn {Method} get_stdin ()

Return an object compatible with @ref{3f7c,,InputStream}
suitable for use as the @code{wsgi.input} of the
request currently being processed.
@end deffn

@geindex get_stderr() (wsgiref.handlers.BaseHandler method)
@anchor{library/wsgiref wsgiref handlers BaseHandler get_stderr}@anchor{3f77}
@deffn {Method} get_stderr ()

Return an object compatible with @ref{3f7d,,ErrorStream}
suitable for use as the @code{wsgi.errors} of the
request currently being processed.
@end deffn

@geindex add_cgi_vars() (wsgiref.handlers.BaseHandler method)
@anchor{library/wsgiref wsgiref handlers BaseHandler add_cgi_vars}@anchor{3f78}
@deffn {Method} add_cgi_vars ()

Insert CGI variables for the current request into the @code{environ} attribute.
@end deffn

Here are some other methods and attributes you may wish to override. This list
is only a summary, however, and does not include every method that can be
overridden.  You should consult the docstrings and source code for additional
information before attempting to create a customized @code{BaseHandler}
subclass.

Attributes and methods for customizing the WSGI environment:

@geindex wsgi_multithread (wsgiref.handlers.BaseHandler attribute)
@anchor{library/wsgiref wsgiref handlers BaseHandler wsgi_multithread}@anchor{3f7e}
@deffn {Attribute} wsgi_multithread

The value to be used for the @code{wsgi.multithread} environment variable.  It
defaults to true in @code{BaseHandler}, but may have a different default (or
be set by the constructor) in the other subclasses.
@end deffn

@geindex wsgi_multiprocess (wsgiref.handlers.BaseHandler attribute)
@anchor{library/wsgiref wsgiref handlers BaseHandler wsgi_multiprocess}@anchor{3f7f}
@deffn {Attribute} wsgi_multiprocess

The value to be used for the @code{wsgi.multiprocess} environment variable.  It
defaults to true in @code{BaseHandler}, but may have a different default (or
be set by the constructor) in the other subclasses.
@end deffn

@geindex wsgi_run_once (wsgiref.handlers.BaseHandler attribute)
@anchor{library/wsgiref wsgiref handlers BaseHandler wsgi_run_once}@anchor{3f80}
@deffn {Attribute} wsgi_run_once

The value to be used for the @code{wsgi.run_once} environment variable.  It
defaults to false in @code{BaseHandler}, but @ref{3f72,,CGIHandler} sets it to
true by default.
@end deffn

@geindex os_environ (wsgiref.handlers.BaseHandler attribute)
@anchor{library/wsgiref wsgiref handlers BaseHandler os_environ}@anchor{3f81}
@deffn {Attribute} os_environ

The default environment variables to be included in every request’s WSGI
environment.  By default, this is a copy of @code{os.environ} at the time that
@code{wsgiref.handlers} was imported, but subclasses can either create their own
at the class or instance level.  Note that the dictionary should be considered
read-only, since the default value is shared between multiple classes and
instances.
@end deffn

@geindex server_software (wsgiref.handlers.BaseHandler attribute)
@anchor{library/wsgiref wsgiref handlers BaseHandler server_software}@anchor{3f82}
@deffn {Attribute} server_software

If the @ref{3f83,,origin_server} attribute is set, this attribute’s value is used to
set the default @code{SERVER_SOFTWARE} WSGI environment variable, and also to set a
default @code{Server:} header in HTTP responses.  It is ignored for handlers (such
as @ref{3f73,,BaseCGIHandler} and @ref{3f72,,CGIHandler}) that are not HTTP origin
servers.


Changed in version 3.3: The term “Python” is replaced with implementation specific term like
“CPython”, “Jython” etc.

@end deffn

@geindex get_scheme() (wsgiref.handlers.BaseHandler method)
@anchor{library/wsgiref wsgiref handlers BaseHandler get_scheme}@anchor{3f84}
@deffn {Method} get_scheme ()

Return the URL scheme being used for the current request.  The default
implementation uses the @code{guess_scheme()} function from @ref{124,,wsgiref.util}
to guess whether the scheme should be “http” or “https”, based on the current
request’s @code{environ} variables.
@end deffn

@geindex setup_environ() (wsgiref.handlers.BaseHandler method)
@anchor{library/wsgiref wsgiref handlers BaseHandler setup_environ}@anchor{3f85}
@deffn {Method} setup_environ ()

Set the @code{environ} attribute to a fully populated WSGI environment.  The
default implementation uses all of the above methods and attributes, plus the
@ref{3f76,,get_stdin()}, @ref{3f77,,get_stderr()}, and @ref{3f78,,add_cgi_vars()} methods and the
@ref{3f86,,wsgi_file_wrapper} attribute.  It also inserts a @code{SERVER_SOFTWARE} key
if not present, as long as the @ref{3f83,,origin_server} attribute is a true value
and the @ref{3f82,,server_software} attribute is set.
@end deffn

Methods and attributes for customizing exception handling:

@geindex log_exception() (wsgiref.handlers.BaseHandler method)
@anchor{library/wsgiref wsgiref handlers BaseHandler log_exception}@anchor{3f87}
@deffn {Method} log_exception (exc_info)

Log the `exc_info' tuple in the server log.  `exc_info' is a @code{(type, value,
traceback)} tuple.  The default implementation simply writes the traceback to
the request’s @code{wsgi.errors} stream and flushes it.  Subclasses can override
this method to change the format or retarget the output, mail the traceback to
an administrator, or whatever other action may be deemed suitable.
@end deffn

@geindex traceback_limit (wsgiref.handlers.BaseHandler attribute)
@anchor{library/wsgiref wsgiref handlers BaseHandler traceback_limit}@anchor{3f88}
@deffn {Attribute} traceback_limit

The maximum number of frames to include in tracebacks output by the default
@ref{3f87,,log_exception()} method.  If @code{None}, all frames are included.
@end deffn

@geindex error_output() (wsgiref.handlers.BaseHandler method)
@anchor{library/wsgiref wsgiref handlers BaseHandler error_output}@anchor{3f89}
@deffn {Method} error_output (environ, start_response)

This method is a WSGI application to generate an error page for the user.  It is
only invoked if an error occurs before headers are sent to the client.

This method can access the current error using @code{sys.exception()},
and should pass that information to `start_response' when calling it (as
described in the “Error Handling” section of 
@geindex Python Enhancement Proposals; PEP 3333
PEP 3333@footnote{https://peps.python.org/pep-3333/}). In particular,
the `start_response' callable should follow the @ref{3f66,,StartResponse}
protocol.

The default implementation just uses the @ref{3f8a,,error_status},
@ref{3f8b,,error_headers}, and @ref{3f8c,,error_body} attributes to generate an output
page.  Subclasses can override this to produce more dynamic error output.

Note, however, that it’s not recommended from a security perspective to spit out
diagnostics to any old user; ideally, you should have to do something special to
enable diagnostic output, which is why the default implementation doesn’t
include any.
@end deffn

@geindex error_status (wsgiref.handlers.BaseHandler attribute)
@anchor{library/wsgiref wsgiref handlers BaseHandler error_status}@anchor{3f8a}
@deffn {Attribute} error_status

The HTTP status used for error responses.  This should be a status string as
defined in 
@geindex Python Enhancement Proposals; PEP 3333
PEP 3333@footnote{https://peps.python.org/pep-3333/}; it defaults to a 500 code and message.
@end deffn

@geindex error_headers (wsgiref.handlers.BaseHandler attribute)
@anchor{library/wsgiref wsgiref handlers BaseHandler error_headers}@anchor{3f8b}
@deffn {Attribute} error_headers

The HTTP headers used for error responses.  This should be a list of WSGI
response headers (@code{(name, value)} tuples), as described in 
@geindex Python Enhancement Proposals; PEP 3333
PEP 3333@footnote{https://peps.python.org/pep-3333/}.  The
default list just sets the content type to @code{text/plain}.
@end deffn

@geindex error_body (wsgiref.handlers.BaseHandler attribute)
@anchor{library/wsgiref wsgiref handlers BaseHandler error_body}@anchor{3f8c}
@deffn {Attribute} error_body

The error response body.  This should be an HTTP response body bytestring. It
defaults to the plain text, “A server error occurred.  Please contact the
administrator.”
@end deffn

Methods and attributes for 
@geindex Python Enhancement Proposals; PEP 3333
PEP 3333@footnote{https://peps.python.org/pep-3333/}’s “Optional Platform-Specific File
Handling” feature:

@geindex wsgi_file_wrapper (wsgiref.handlers.BaseHandler attribute)
@anchor{library/wsgiref wsgiref handlers BaseHandler wsgi_file_wrapper}@anchor{3f86}
@deffn {Attribute} wsgi_file_wrapper

A @code{wsgi.file_wrapper} factory, compatible with
@ref{3f60,,wsgiref.types.FileWrapper}, or @code{None}.  The default value
of this attribute is the @ref{944,,wsgiref.util.FileWrapper} class.
@end deffn

@geindex sendfile() (wsgiref.handlers.BaseHandler method)
@anchor{library/wsgiref wsgiref handlers BaseHandler sendfile}@anchor{3f8d}
@deffn {Method} sendfile ()

Override to implement platform-specific file transmission.  This method is
called only if the application’s return value is an instance of the class
specified by the @ref{3f86,,wsgi_file_wrapper} attribute.  It should return a true
value if it was able to successfully transmit the file, so that the default
transmission code will not be executed. The default implementation of this
method just returns a false value.
@end deffn

Miscellaneous methods and attributes:

@geindex origin_server (wsgiref.handlers.BaseHandler attribute)
@anchor{library/wsgiref wsgiref handlers BaseHandler origin_server}@anchor{3f83}
@deffn {Attribute} origin_server

This attribute should be set to a true value if the handler’s @ref{3f79,,_write()} and
@ref{3f7a,,_flush()} are being used to communicate directly to the client, rather than
via a CGI-like gateway protocol that wants the HTTP status in a special
@code{Status:} header.

This attribute’s default value is true in @code{BaseHandler}, but false in
@ref{3f73,,BaseCGIHandler} and @ref{3f72,,CGIHandler}.
@end deffn

@geindex http_version (wsgiref.handlers.BaseHandler attribute)
@anchor{library/wsgiref wsgiref handlers BaseHandler http_version}@anchor{3f8e}
@deffn {Attribute} http_version

If @ref{3f83,,origin_server} is true, this string attribute is used to set the HTTP
version of the response set to the client.  It defaults to @code{"1.0"}.
@end deffn
@end deffn

@geindex read_environ() (in module wsgiref.handlers)
@anchor{library/wsgiref wsgiref handlers read_environ}@anchor{13c5}
@deffn {Function} wsgiref.handlers.read_environ ()

Transcode CGI variables from @code{os.environ} to 
@geindex Python Enhancement Proposals; PEP 3333
PEP 3333@footnote{https://peps.python.org/pep-3333/} “bytes in unicode”
strings, returning a new dictionary.  This function is used by
@ref{3f72,,CGIHandler} and @ref{3f74,,IISCGIHandler} in place of directly using
@code{os.environ}, which is not necessarily WSGI-compliant on all platforms
and web servers using Python 3 – specifically, ones where the OS’s
actual environment is Unicode (i.e. Windows), or ones where the environment
is bytes, but the system encoding used by Python to decode it is anything
other than ISO-8859-1 (e.g. Unix systems using UTF-8).

If you are implementing a CGI-based handler of your own, you probably want
to use this routine instead of just copying values out of @code{os.environ}
directly.


Added in version 3.2.

@end deffn

@node wsgiref types – WSGI types for static type checking,Examples<26>,wsgiref handlers – server/gateway base classes,wsgiref — WSGI Utilities and Reference Implementation
@anchor{library/wsgiref module-wsgiref types}@anchor{123}@anchor{library/wsgiref wsgiref-types-wsgi-types-for-static-type-checking}@anchor{3f8f}
@subsubsection @code{wsgiref.types} – WSGI types for static type checking


@geindex module; wsgiref.types

This module provides various types for static type checking as described
in 
@geindex Python Enhancement Proposals; PEP 3333
PEP 3333@footnote{https://peps.python.org/pep-3333/}.


Added in version 3.11.


@geindex StartResponse (class in wsgiref.types)
@anchor{library/wsgiref wsgiref types StartResponse}@anchor{3f66}
@deffn {Class} wsgiref.types.StartResponse

A @ref{56b,,typing.Protocol} describing 
@geindex Python Enhancement Proposals; PEP 3333#the-start-response-callable
start_response()@footnote{https://peps.python.org/pep-3333/#the-start-response-callable}
callables (
@geindex Python Enhancement Proposals; PEP 3333
PEP 3333@footnote{https://peps.python.org/pep-3333/}).
@end deffn

@geindex WSGIEnvironment (in module wsgiref.types)
@anchor{library/wsgiref wsgiref types WSGIEnvironment}@anchor{3f59}
@deffn {Data} wsgiref.types.WSGIEnvironment

A type alias describing a WSGI environment dictionary.
@end deffn

@geindex WSGIApplication (in module wsgiref.types)
@anchor{library/wsgiref wsgiref types WSGIApplication}@anchor{3f90}
@deffn {Data} wsgiref.types.WSGIApplication

A type alias describing a WSGI application callable.
@end deffn

@geindex InputStream (class in wsgiref.types)
@anchor{library/wsgiref wsgiref types InputStream}@anchor{3f7c}
@deffn {Class} wsgiref.types.InputStream

A @ref{56b,,typing.Protocol} describing a 
@geindex Python Enhancement Proposals; PEP 3333#input-and-error-streams
WSGI Input Stream@footnote{https://peps.python.org/pep-3333/#input-and-error-streams}.
@end deffn

@geindex ErrorStream (class in wsgiref.types)
@anchor{library/wsgiref wsgiref types ErrorStream}@anchor{3f7d}
@deffn {Class} wsgiref.types.ErrorStream

A @ref{56b,,typing.Protocol} describing a 
@geindex Python Enhancement Proposals; PEP 3333#input-and-error-streams
WSGI Error Stream@footnote{https://peps.python.org/pep-3333/#input-and-error-streams}.
@end deffn

@geindex FileWrapper (class in wsgiref.types)
@anchor{library/wsgiref wsgiref types FileWrapper}@anchor{3f60}
@deffn {Class} wsgiref.types.FileWrapper

A @ref{56b,,typing.Protocol} describing a 
@geindex Python Enhancement Proposals; PEP 3333#optional-platform-specific-file-handling
file wrapper@footnote{https://peps.python.org/pep-3333/#optional-platform-specific-file-handling}.
See @ref{944,,wsgiref.util.FileWrapper} for a concrete implementation of this
protocol.
@end deffn

@node Examples<26>,,wsgiref types – WSGI types for static type checking,wsgiref — WSGI Utilities and Reference Implementation
@anchor{library/wsgiref examples}@anchor{3f91}
@subsubsection Examples


This is a working “Hello World” WSGI application, where the `start_response'
callable should follow the @ref{3f66,,StartResponse} protocol:

@example
"""
Every WSGI application must have an application object - a callable
object that accepts two arguments. For that purpose, we're going to
use a function (note that you're not limited to a function, you can
use a class for example). The first argument passed to the function
is a dictionary containing CGI-style environment variables and the
second variable is the callable object.
"""
from wsgiref.simple_server import make_server


def hello_world_app(environ, start_response):
    status = "200 OK"  # HTTP Status
    headers = [("Content-type", "text/plain; charset=utf-8")]  # HTTP Headers
    start_response(status, headers)

    # The returned object is going to be printed
    return [b"Hello World"]

with make_server("", 8000, hello_world_app) as httpd:
    print("Serving on port 8000...")

    # Serve until process is killed
    httpd.serve_forever()
@end example

Example of a WSGI application serving the current directory, accept optional
directory and port number (default: 8000) on the command line:

@example
"""
Small wsgiref based web server. Takes a path to serve from and an
optional port number (defaults to 8000), then tries to serve files.
MIME types are guessed from the file names, 404 errors are raised
if the file is not found.
"""
import mimetypes
import os
import sys
from wsgiref import simple_server, util


def app(environ, respond):
    # Get the file name and MIME type
    fn = os.path.join(path, environ["PATH_INFO"][1:])
    if "." not in fn.split(os.path.sep)[-1]:
        fn = os.path.join(fn, "index.html")
    mime_type = mimetypes.guess_file_type(fn)[0]

    # Return 200 OK if file exists, otherwise 404 Not Found
    if os.path.exists(fn):
        respond("200 OK", [("Content-Type", mime_type)])
        return util.FileWrapper(open(fn, "rb"))
    else:
        respond("404 Not Found", [("Content-Type", "text/plain")])
        return [b"not found"]


if __name__ == "__main__":
    # Get the path and port from command-line arguments
    path = sys.argv[1] if len(sys.argv) > 1 else os.getcwd()
    port = int(sys.argv[2]) if len(sys.argv) > 2 else 8000

    # Make and start the server until control-c
    httpd = simple_server.make_server("", port, app)
    print(f"Serving @{path@} on port @{port@}, control-C to stop")
    try:
        httpd.serve_forever()
    except KeyboardInterrupt:
        print("Shutting down.")
        httpd.server_close()
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node urllib — URL handling modules,urllib request — Extensible library for opening URLs,wsgiref — WSGI Utilities and Reference Implementation,Internet Protocols and Support
@anchor{library/urllib doc}@anchor{3f92}@anchor{library/urllib module-urllib}@anchor{10f}@anchor{library/urllib translation-repo}@anchor{3f93}@anchor{library/urllib urllib-url-handling-modules}@anchor{3f94}
@subsection @code{urllib} — URL handling modules


@geindex module; urllib

`Source code:' Lib/urllib/@footnote{https://github.com/python/cpython/tree/3.14/Lib/urllib/}


__________________________________________________________________


@code{urllib} is a package that collects several modules for working with URLs:


@itemize *

@item 
@ref{112,,urllib.request} for opening and reading URLs

@item 
@ref{110,,urllib.error} containing the exceptions raised by @ref{112,,urllib.request}

@item 
@ref{111,,urllib.parse} for parsing URLs

@item 
@ref{114,,urllib.robotparser} for parsing @code{robots.txt} files
@end itemize

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node urllib request — Extensible library for opening URLs,urllib response — Response classes used by urllib,urllib — URL handling modules,Internet Protocols and Support
@anchor{library/urllib request doc}@anchor{3f95}@anchor{library/urllib request module-urllib request}@anchor{112}@anchor{library/urllib request translation-repo}@anchor{3f96}@anchor{library/urllib request urllib-request-extensible-library-for-opening-urls}@anchor{3f97}
@subsection @code{urllib.request} — Extensible library for opening URLs


@geindex module; urllib.request

`Source code:' Lib/urllib/request.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/urllib/request.py}


__________________________________________________________________


The @code{urllib.request} module defines functions and classes which help in
opening URLs (mostly HTTP) in a complex world — basic and digest
authentication, redirections, cookies and more.


@subsubheading See also


The Requests package@footnote{https://requests.readthedocs.io/en/master/}
is recommended for a higher-level HTTP client interface.


@cartouche
@quotation Warning 
On macOS it is unsafe to use this module in programs using
@ref{4b6,,os.fork()} because the @ref{3f98,,getproxies()} implementation for
macOS uses a higher-level system API. Set the environment variable
@code{no_proxy} to @code{*} to avoid this problem
(e.g. @code{os.environ["no_proxy"] = "*"}).
@end quotation
@end cartouche

@c include for modules that don't work on WASM

@ref{2181,,Availability}: not WASI.

This module does not work or is not available on WebAssembly. See
@ref{1bae,,WebAssembly platforms} for more information.

The @code{urllib.request} module defines the following functions:

@geindex urlopen() (in module urllib.request)
@anchor{library/urllib request urllib request urlopen}@anchor{309}
@deffn {Function} urllib.request.urlopen (url, data=None[, timeout], *, context=None)

Open `url', which can be either a string containing a valid, properly
encoded URL, or a @ref{11de,,Request} object.

`data' must be an object specifying additional data to be sent to the
server, or @code{None} if no such data is needed.  See @ref{11de,,Request}
for details.

urllib.request module uses HTTP/1.1 and includes @code{Connection:close} header
in its HTTP requests.

The optional `timeout' parameter specifies a timeout in seconds for
blocking operations like the connection attempt (if not specified,
the global default timeout setting will be used).  This actually
only works for HTTP, HTTPS and FTP connections.

If `context' is specified, it must be a @ref{355,,ssl.SSLContext} instance
describing the various SSL options. See @ref{d3c,,HTTPSConnection}
for more details.

This function always returns an object which can work as a
@ref{1e3,,context manager} and has the properties `url', `headers', and `status'.
See @ref{3f99,,urllib.response.addinfourl} for more detail on these properties.

For HTTP and HTTPS URLs, this function returns a
@ref{12da,,http.client.HTTPResponse} object slightly modified. In addition
to the three new methods above, the msg attribute contains the
same information as the @ref{3f9a,,reason}
attribute — the reason phrase returned by server — instead of
the response headers as it is specified in the documentation for
@code{HTTPResponse}.

For FTP, file, and data URLs, this function
returns a @ref{3f99,,urllib.response.addinfourl} object.

Raises @ref{2c0,,URLError} on protocol errors.

Note that @code{None} may be returned if no handler handles the request (though
the default installed global @ref{3f9b,,OpenerDirector} uses
@ref{3f9c,,UnknownHandler} to ensure this never happens).

In addition, if proxy settings are detected (for example, when a @code{*_proxy}
environment variable like @code{http_proxy} is set),
@ref{1df7,,ProxyHandler} is default installed and makes sure the requests are
handled through the proxy.

The legacy @code{urllib.urlopen} function from Python 2.6 and earlier has been
discontinued; @code{urllib.request.urlopen()} corresponds to the old
@code{urllib2.urlopen}.  Proxy handling, which was done by passing a dictionary
parameter to @code{urllib.urlopen}, can be obtained by using
@ref{1df7,,ProxyHandler} objects.


The default opener raises an @ref{1cb1,,auditing event}
@code{urllib.Request} with arguments @code{fullurl}, @code{data}, @code{headers},
@code{method} taken from the request object.



Changed in version 3.2: `cafile' and `capath' were added.

HTTPS virtual hosts are now supported if possible (that is, if
@ref{3a5b,,ssl.HAS_SNI} is true).

`data' can be an iterable object.



Changed in version 3.3: `cadefault' was added.



Changed in version 3.4.3: `context' was added.



Changed in version 3.10: HTTPS connection now send an ALPN extension with protocol indicator
@code{http/1.1} when no `context' is given. Custom `context' should set
ALPN protocols with @ref{106a,,set_alpn_protocols()}.



Changed in version 3.13: Remove `cafile', `capath' and `cadefault' parameters: use the `context'
parameter instead.

@end deffn

@geindex install_opener() (in module urllib.request)
@anchor{library/urllib request urllib request install_opener}@anchor{3f9d}
@deffn {Function} urllib.request.install_opener (opener)

Install an @ref{3f9b,,OpenerDirector} instance as the default global opener.
Installing an opener is only necessary if you want urlopen to use that
opener; otherwise, simply call @ref{11e2,,OpenerDirector.open()} instead of
@ref{309,,urlopen()}.  The code does not check for a real
@code{OpenerDirector}, and any class with the appropriate interface will
work.
@end deffn

@geindex build_opener() (in module urllib.request)
@anchor{library/urllib request urllib request build_opener}@anchor{30b}
@deffn {Function} urllib.request.build_opener ([handler, ...])

Return an @ref{3f9b,,OpenerDirector} instance, which chains the handlers in the
order given. `handler's can be either instances of @ref{3f9e,,BaseHandler}, or
subclasses of @code{BaseHandler} (in which case it must be possible to call
the constructor without any parameters).  Instances of the following classes
will be in front of the `handler's, unless the `handler's contain them,
instances of them or subclasses of them: @ref{1df7,,ProxyHandler} (if proxy
settings are detected), @ref{3f9c,,UnknownHandler}, @ref{efe,,HTTPHandler},
@ref{3f9f,,HTTPDefaultErrorHandler}, @ref{3fa0,,HTTPRedirectHandler},
@ref{3fa1,,FTPHandler}, @ref{3fa2,,FileHandler}, @ref{3fa3,,HTTPErrorProcessor}.

If the Python installation has SSL support (i.e., if the @ref{d5,,ssl} module
can be imported), @ref{142f,,HTTPSHandler} will also be added.

A @ref{3f9e,,BaseHandler} subclass may also change its @code{handler_order}
attribute to modify its position in the handlers list.
@end deffn

@geindex pathname2url() (in module urllib.request)
@anchor{library/urllib request urllib request pathname2url}@anchor{2c1}
@deffn {Function} urllib.request.pathname2url (path, *, add_scheme=False)

Convert the given local path to a @code{file:} URL. This function uses
@ref{da2,,quote()} function to encode the path.

If `add_scheme' is false (the default), the return value omits the
@code{file:} scheme prefix. Set `add_scheme' to true to return a complete URL.

This example shows the function being used on Windows:

@example
>>> from urllib.request import pathname2url
>>> path = 'C:\\Program Files'
>>> pathname2url(path, add_scheme=True)
'file:///C:/Program%20Files'
@end example


Changed in version 3.14: Windows drive letters are no longer converted to uppercase, and @code{:}
characters not following a drive letter no longer cause an
@ref{2c2,,OSError} exception to be raised on Windows.



Changed in version 3.14: Paths beginning with a slash are converted to URLs with authority
sections. For example, the path @code{/etc/hosts} is converted to
the URL @code{///etc/hosts}.



Changed in version 3.14: The `add_scheme' parameter was added.

@end deffn

@geindex url2pathname() (in module urllib.request)
@anchor{library/urllib request urllib request url2pathname}@anchor{2bf}
@deffn {Function} urllib.request.url2pathname (url, *, require_scheme=False, resolve_host=False)

Convert the given @code{file:} URL to a local path. This function uses
@ref{1b3f,,unquote()} to decode the URL.

If `require_scheme' is false (the default), the given value should omit a
@code{file:} scheme prefix. If `require_scheme' is set to true, the given
value should include the prefix; a @ref{2c0,,URLError} is raised
if it doesn’t.

The URL authority is discarded if it is empty, @code{localhost}, or the local
hostname. Otherwise, if `resolve_host' is set to true, the authority is
resolved using @ref{3a1a,,socket.gethostbyname()} and discarded if it matches a
local IP address (as per 
@geindex RFC; RFC 8089 Section 3
RFC 8089 §3@footnote{https://datatracker.ietf.org/doc/html/rfc8089.html#section-3}). If the
authority is still unhandled, then on Windows a UNC path is returned, and
on other platforms a @ref{2c0,,URLError} is raised.

This example shows the function being used on Windows:

@example
>>> from urllib.request import url2pathname
>>> url = 'file:///C:/Program%20Files'
>>> url2pathname(url, require_scheme=True)
'C:\\Program Files'
@end example


Changed in version 3.14: Windows drive letters are no longer converted to uppercase, and @code{:}
characters not following a drive letter no longer cause an
@ref{2c2,,OSError} exception to be raised on Windows.



Changed in version 3.14: The URL authority is discarded if it matches the local hostname.
Otherwise, if the authority isn’t empty or @code{localhost}, then on
Windows a UNC path is returned (as before), and on other platforms a
@ref{2c0,,URLError} is raised.



Changed in version 3.14: The URL query and fragment components are discarded if present.



Changed in version 3.14: The `require_scheme' and `resolve_host' parameters were added.

@end deffn

@geindex getproxies() (in module urllib.request)
@anchor{library/urllib request urllib request getproxies}@anchor{3f98}
@deffn {Function} urllib.request.getproxies ()

This helper function returns a dictionary of scheme to proxy server URL
mappings. It scans the environment for variables named @code{<scheme>_proxy},
in a case insensitive approach, for all operating systems first, and when it
cannot find it, looks for proxy information from System
Configuration for macOS and Windows Systems Registry for Windows.
If both lowercase and uppercase environment variables exist (and disagree),
lowercase is preferred.

@cartouche
@quotation Note 
If the environment variable @code{REQUEST_METHOD} is set, which usually
indicates your script is running in a CGI environment, the environment
variable @code{HTTP_PROXY} (uppercase @code{_PROXY}) will be ignored. This is
because that variable can be injected by a client using the “Proxy:” HTTP
header. If you need to use an HTTP proxy in a CGI environment, either use
@code{ProxyHandler} explicitly, or make sure the variable name is in
lowercase (or at least the @code{_proxy} suffix).
@end quotation
@end cartouche
@end deffn

The following classes are provided:

@geindex Request (class in urllib.request)
@anchor{library/urllib request urllib request Request}@anchor{11de}
@deffn {Class} urllib.request.Request (url, data=None, headers=@{@}, origin_req_host=None, unverifiable=False, method=None)

This class is an abstraction of a URL request.

`url' should be a string containing a valid, properly encoded URL.

`data' must be an object specifying additional data to send to the
server, or @code{None} if no such data is needed.  Currently HTTP
requests are the only ones that use `data'.  The supported object
types include bytes, file-like objects, and iterables of bytes-like objects.
If no @code{Content-Length} nor @code{Transfer-Encoding} header field
has been provided, @ref{efe,,HTTPHandler} will set these headers according
to the type of `data'.  @code{Content-Length} will be used to send
bytes objects, while @code{Transfer-Encoding: chunked} as specified in
@geindex RFC; RFC 7230
RFC 7230@footnote{https://datatracker.ietf.org/doc/html/rfc7230.html}, Section 3.3.1 will be used to send files and other iterables.

For an HTTP POST request method, `data' should be a buffer in the
standard @code{application/x-www-form-urlencoded} format.  The
@ref{109b,,urllib.parse.urlencode()} function takes a mapping or sequence
of 2-tuples and returns an ASCII string in this format. It should
be encoded to bytes before being used as the `data' parameter.

`headers' should be a dictionary, and will be treated as if
@ref{3fa4,,add_header()} was called with each key and value as arguments.
This is often used to “spoof” the @code{User-Agent} header value, which is
used by a browser to identify itself – some HTTP servers only
allow requests coming from common browsers as opposed to scripts.
For example, Mozilla Firefox may identify itself as @code{"Mozilla/5.0
(X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11"}, while
@ref{10f,,urllib}’s default user agent string is
@code{"Python-urllib/2.6"} (on Python 2.6).
All header keys are sent in camel case.

An appropriate @code{Content-Type} header should be included if the `data'
argument is present.  If this header has not been provided and `data'
is not @code{None}, @code{Content-Type: application/x-www-form-urlencoded} will
be added as a default.

The next two arguments are only of interest for correct handling
of third-party HTTP cookies:

`origin_req_host' should be the request-host of the origin
transaction, as defined by 
@geindex RFC; RFC 2965
RFC 2965@footnote{https://datatracker.ietf.org/doc/html/rfc2965.html}.  It defaults to
@code{http.cookiejar.request_host(self)}.  This is the host name or IP
address of the original request that was initiated by the user.
For example, if the request is for an image in an HTML document,
this should be the request-host of the request for the page
containing the image.

`unverifiable' should indicate whether the request is unverifiable,
as defined by 
@geindex RFC; RFC 2965
RFC 2965@footnote{https://datatracker.ietf.org/doc/html/rfc2965.html}.  It defaults to @code{False}.  An unverifiable
request is one whose URL the user did not have the option to
approve.  For example, if the request is for an image in an HTML
document, and the user had no option to approve the automatic
fetching of the image, this should be true.

`method' should be a string that indicates the HTTP request method that
will be used (e.g. @code{'HEAD'}).  If provided, its value is stored in the
@ref{11df,,method} attribute and is used by @ref{1375,,get_method()}.
The default is @code{'GET'} if `data' is @code{None} or @code{'POST'} otherwise.
Subclasses may indicate a different default method by setting the
@code{method} attribute in the class itself.

@cartouche
@quotation Note 
The request will not work as expected if the data object is unable
to deliver its content more than once (e.g. a file or an iterable
that can produce the content only once) and the request is retried
for HTTP redirects or authentication.  The `data' is sent to the
HTTP server right away after the headers.  There is no support for
a 100-continue expectation in the library.
@end quotation
@end cartouche


Changed in version 3.3: @ref{11df,,Request.method} argument is added to the Request class.



Changed in version 3.4: Default @ref{11df,,Request.method} may be indicated at the class level.



Changed in version 3.6: Do not raise an error if the @code{Content-Length} has not been
provided and `data' is neither @code{None} nor a bytes object.
Fall back to use chunked transfer encoding instead.

@end deffn

@geindex OpenerDirector (class in urllib.request)
@anchor{library/urllib request urllib request OpenerDirector}@anchor{3f9b}
@deffn {Class} urllib.request.OpenerDirector

The @code{OpenerDirector} class opens URLs via @ref{3f9e,,BaseHandler}s chained
together. It manages the chaining of handlers, and recovery from errors.
@end deffn

@geindex BaseHandler (class in urllib.request)
@anchor{library/urllib request urllib request BaseHandler}@anchor{3f9e}
@deffn {Class} urllib.request.BaseHandler

This is the base class for all registered handlers — and handles only the
simple mechanics of registration.
@end deffn

@geindex HTTPDefaultErrorHandler (class in urllib.request)
@anchor{library/urllib request urllib request HTTPDefaultErrorHandler}@anchor{3f9f}
@deffn {Class} urllib.request.HTTPDefaultErrorHandler

A class which defines a default handler for HTTP error responses; all responses
are turned into @ref{11e4,,HTTPError} exceptions.
@end deffn

@geindex HTTPRedirectHandler (class in urllib.request)
@anchor{library/urllib request urllib request HTTPRedirectHandler}@anchor{3fa0}
@deffn {Class} urllib.request.HTTPRedirectHandler

A class to handle redirections.
@end deffn

@geindex HTTPCookieProcessor (class in urllib.request)
@anchor{library/urllib request urllib request HTTPCookieProcessor}@anchor{3fa5}
@deffn {Class} urllib.request.HTTPCookieProcessor (cookiejar=None)

A class to handle HTTP Cookies.
@end deffn

@geindex ProxyHandler (class in urllib.request)
@anchor{library/urllib request urllib request ProxyHandler}@anchor{1df7}
@deffn {Class} urllib.request.ProxyHandler (proxies=None)

Cause requests to go through a proxy. If `proxies' is given, it must be a
dictionary mapping protocol names to URLs of proxies. The default is to read
the list of proxies from the environment variables
@code{<protocol>_proxy}.  If no proxy environment variables are set, then
in a Windows environment proxy settings are obtained from the registry’s
Internet Settings section, and in a macOS environment proxy information
is retrieved from the System Configuration Framework.

To disable autodetected proxy pass an empty dictionary.

The 
@geindex no_proxy
@geindex environment variable; no_proxy
@code{no_proxy} environment variable can be used to specify hosts
which shouldn’t be reached via proxy; if set, it should be a comma-separated
list of hostname suffixes, optionally with @code{:port} appended, for example
@code{cern.ch,ncsa.uiuc.edu,some.host:8080}.

@cartouche
@quotation Note 
@code{HTTP_PROXY} will be ignored if a variable @code{REQUEST_METHOD} is set;
see the documentation on @ref{3f98,,getproxies()}.
@end quotation
@end cartouche
@end deffn

@geindex HTTPPasswordMgr (class in urllib.request)
@anchor{library/urllib request urllib request HTTPPasswordMgr}@anchor{3fa6}
@deffn {Class} urllib.request.HTTPPasswordMgr

Keep a database of  @code{(realm, uri) -> (user, password)} mappings.
@end deffn

@geindex HTTPPasswordMgrWithDefaultRealm (class in urllib.request)
@anchor{library/urllib request urllib request HTTPPasswordMgrWithDefaultRealm}@anchor{3fa7}
@deffn {Class} urllib.request.HTTPPasswordMgrWithDefaultRealm

Keep a database of  @code{(realm, uri) -> (user, password)} mappings. A realm of
@code{None} is considered a catch-all realm, which is searched if no other realm
fits.
@end deffn

@geindex HTTPPasswordMgrWithPriorAuth (class in urllib.request)
@anchor{library/urllib request urllib request HTTPPasswordMgrWithPriorAuth}@anchor{109a}
@deffn {Class} urllib.request.HTTPPasswordMgrWithPriorAuth

A variant of @ref{3fa7,,HTTPPasswordMgrWithDefaultRealm} that also has a
database of @code{uri -> is_authenticated} mappings.  Can be used by a
BasicAuth handler to determine when to send authentication credentials
immediately instead of waiting for a @code{401} response first.


Added in version 3.5.

@end deffn

@geindex AbstractBasicAuthHandler (class in urllib.request)
@anchor{library/urllib request urllib request AbstractBasicAuthHandler}@anchor{1cb2}
@deffn {Class} urllib.request.AbstractBasicAuthHandler (password_mgr=None)

This is a mixin class that helps with HTTP authentication, both to the remote
host and to a proxy. `password_mgr', if given, should be something that is
compatible with @ref{3fa6,,HTTPPasswordMgr}; refer to section
@ref{3fa8,,HTTPPasswordMgr Objects} for information on the interface that must be
supported.  If `passwd_mgr' also provides @code{is_authenticated} and
@code{update_authenticated} methods (see
@ref{3fa9,,HTTPPasswordMgrWithPriorAuth Objects}), then the handler will use the
@code{is_authenticated} result for a given URI to determine whether or not to
send authentication credentials with the request.  If @code{is_authenticated}
returns @code{True} for the URI, credentials are sent.  If @code{is_authenticated}
is @code{False}, credentials are not sent, and then if a @code{401} response is
received the request is re-sent with the authentication credentials.  If
authentication succeeds, @code{update_authenticated} is called to set
@code{is_authenticated} @code{True} for the URI, so that subsequent requests to
the URI or any of its super-URIs will automatically include the
authentication credentials.


Added in version 3.5: Added @code{is_authenticated} support.

@end deffn

@geindex HTTPBasicAuthHandler (class in urllib.request)
@anchor{library/urllib request urllib request HTTPBasicAuthHandler}@anchor{3faa}
@deffn {Class} urllib.request.HTTPBasicAuthHandler (password_mgr=None)

Handle authentication with the remote host. `password_mgr', if given, should
be something that is compatible with @ref{3fa6,,HTTPPasswordMgr}; refer to
section @ref{3fa8,,HTTPPasswordMgr Objects} for information on the interface that must
be supported. HTTPBasicAuthHandler will raise a @ref{2ee,,ValueError} when
presented with a wrong Authentication scheme.
@end deffn

@geindex ProxyBasicAuthHandler (class in urllib.request)
@anchor{library/urllib request urllib request ProxyBasicAuthHandler}@anchor{3fab}
@deffn {Class} urllib.request.ProxyBasicAuthHandler (password_mgr=None)

Handle authentication with the proxy. `password_mgr', if given, should be
something that is compatible with @ref{3fa6,,HTTPPasswordMgr}; refer to section
@ref{3fa8,,HTTPPasswordMgr Objects} for information on the interface that must be
supported.
@end deffn

@geindex AbstractDigestAuthHandler (class in urllib.request)
@anchor{library/urllib request urllib request AbstractDigestAuthHandler}@anchor{1daf}
@deffn {Class} urllib.request.AbstractDigestAuthHandler (password_mgr=None)

This is a mixin class that helps with HTTP authentication, both to the remote
host and to a proxy. `password_mgr', if given, should be something that is
compatible with @ref{3fa6,,HTTPPasswordMgr}; refer to section
@ref{3fa8,,HTTPPasswordMgr Objects} for information on the interface that must be
supported.


Changed in version 3.14: Added support for HTTP digest authentication algorithm @code{SHA-256}.

@end deffn

@geindex HTTPDigestAuthHandler (class in urllib.request)
@anchor{library/urllib request urllib request HTTPDigestAuthHandler}@anchor{3fac}
@deffn {Class} urllib.request.HTTPDigestAuthHandler (password_mgr=None)

Handle authentication with the remote host. `password_mgr', if given, should
be something that is compatible with @ref{3fa6,,HTTPPasswordMgr}; refer to
section @ref{3fa8,,HTTPPasswordMgr Objects} for information on the interface that must
be supported. When both Digest Authentication Handler and Basic
Authentication Handler are both added, Digest Authentication is always tried
first. If the Digest Authentication returns a 40x response again, it is sent
to Basic Authentication handler to Handle.  This Handler method will raise a
@ref{2ee,,ValueError} when presented with an authentication scheme other than
Digest or Basic.


Changed in version 3.3: Raise @ref{2ee,,ValueError} on unsupported Authentication Scheme.

@end deffn

@geindex ProxyDigestAuthHandler (class in urllib.request)
@anchor{library/urllib request urllib request ProxyDigestAuthHandler}@anchor{3fad}
@deffn {Class} urllib.request.ProxyDigestAuthHandler (password_mgr=None)

Handle authentication with the proxy. `password_mgr', if given, should be
something that is compatible with @ref{3fa6,,HTTPPasswordMgr}; refer to section
@ref{3fa8,,HTTPPasswordMgr Objects} for information on the interface that must be
supported.
@end deffn

@geindex HTTPHandler (class in urllib.request)
@anchor{library/urllib request urllib request HTTPHandler}@anchor{efe}
@deffn {Class} urllib.request.HTTPHandler

A class to handle opening of HTTP URLs.
@end deffn

@geindex HTTPSHandler (class in urllib.request)
@anchor{library/urllib request urllib request HTTPSHandler}@anchor{142f}
@deffn {Class} urllib.request.HTTPSHandler (debuglevel=0, context=None, check_hostname=None)

A class to handle opening of HTTPS URLs.  `context' and `check_hostname'
have the same meaning as in @ref{d3c,,http.client.HTTPSConnection}.


Changed in version 3.2: `context' and `check_hostname' were added.

@end deffn

@geindex FileHandler (class in urllib.request)
@anchor{library/urllib request urllib request FileHandler}@anchor{3fa2}
@deffn {Class} urllib.request.FileHandler

Open local files.
@end deffn

@geindex DataHandler (class in urllib.request)
@anchor{library/urllib request urllib request DataHandler}@anchor{11dd}
@deffn {Class} urllib.request.DataHandler

Open data URLs.


Added in version 3.4.

@end deffn

@geindex FTPHandler (class in urllib.request)
@anchor{library/urllib request urllib request FTPHandler}@anchor{3fa1}
@deffn {Class} urllib.request.FTPHandler

Open FTP URLs.
@end deffn

@geindex CacheFTPHandler (class in urllib.request)
@anchor{library/urllib request urllib request CacheFTPHandler}@anchor{1adf}
@deffn {Class} urllib.request.CacheFTPHandler

Open FTP URLs, keeping a cache of open FTP connections to minimize delays.
@end deffn

@geindex UnknownHandler (class in urllib.request)
@anchor{library/urllib request urllib request UnknownHandler}@anchor{3f9c}
@deffn {Class} urllib.request.UnknownHandler

A catch-all class to handle unknown URLs.
@end deffn

@geindex HTTPErrorProcessor (class in urllib.request)
@anchor{library/urllib request urllib request HTTPErrorProcessor}@anchor{3fa3}
@deffn {Class} urllib.request.HTTPErrorProcessor

Process HTTP error responses.
@end deffn

@menu
* Request Objects:: 
* OpenerDirector Objects:: 
* BaseHandler Objects:: 
* HTTPRedirectHandler Objects:: 
* HTTPCookieProcessor Objects:: 
* ProxyHandler Objects:: 
* HTTPPasswordMgr Objects:: 
* HTTPPasswordMgrWithPriorAuth Objects:: 
* AbstractBasicAuthHandler Objects:: 
* HTTPBasicAuthHandler Objects:: 
* ProxyBasicAuthHandler Objects:: 
* AbstractDigestAuthHandler Objects:: 
* HTTPDigestAuthHandler Objects:: 
* ProxyDigestAuthHandler Objects:: 
* HTTPHandler Objects:: 
* HTTPSHandler Objects:: 
* FileHandler Objects:: 
* DataHandler Objects:: 
* FTPHandler Objects:: 
* CacheFTPHandler Objects:: 
* UnknownHandler Objects:: 
* HTTPErrorProcessor Objects:: 
* Examples: Examples<27>. 
* Legacy interface:: 
* urllib.request Restrictions: urllib request Restrictions. 

@end menu

@node Request Objects,OpenerDirector Objects,,urllib request — Extensible library for opening URLs
@anchor{library/urllib request id1}@anchor{3fae}@anchor{library/urllib request request-objects}@anchor{3faf}
@subsubsection Request Objects


The following methods describe @ref{11de,,Request}’s public interface,
and so all may be overridden in subclasses.  It also defines several
public attributes that can be used by clients to inspect the parsed
request.

@geindex full_url (urllib.request.Request attribute)
@anchor{library/urllib request urllib request Request full_url}@anchor{11e0}
@deffn {Attribute} Request.full_url

The original URL passed to the constructor.


Changed in version 3.4.


Request.full_url is a property with setter, getter and a deleter. Getting
@code{full_url} returns the original request URL with the
fragment, if it was present.
@end deffn

@geindex type (urllib.request.Request attribute)
@anchor{library/urllib request urllib request Request type}@anchor{3fb0}
@deffn {Attribute} Request.type

The URI scheme.
@end deffn

@geindex host (urllib.request.Request attribute)
@anchor{library/urllib request urllib request Request host}@anchor{3fb1}
@deffn {Attribute} Request.host

The URI authority, typically a host, but may also contain a port
separated by a colon.
@end deffn

@geindex origin_req_host (urllib.request.Request attribute)
@anchor{library/urllib request urllib request Request origin_req_host}@anchor{3fb2}
@deffn {Attribute} Request.origin_req_host

The original host for the request, without port.
@end deffn

@geindex selector (urllib.request.Request attribute)
@anchor{library/urllib request urllib request Request selector}@anchor{3fb3}
@deffn {Attribute} Request.selector

The URI path.  If the @ref{11de,,Request} uses a proxy, then selector
will be the full URL that is passed to the proxy.
@end deffn

@geindex data (urllib.request.Request attribute)
@anchor{library/urllib request urllib request Request data}@anchor{11e1}
@deffn {Attribute} Request.data

The entity body for the request, or @code{None} if not specified.


Changed in version 3.4: Changing value of @code{Request.data} now deletes “Content-Length”
header if it was previously set or calculated.

@end deffn

@geindex unverifiable (urllib.request.Request attribute)
@anchor{library/urllib request urllib request Request unverifiable}@anchor{3fb4}
@deffn {Attribute} Request.unverifiable

boolean, indicates whether the request is unverifiable as defined
by 
@geindex RFC; RFC 2965
RFC 2965@footnote{https://datatracker.ietf.org/doc/html/rfc2965.html}.
@end deffn

@geindex method (urllib.request.Request attribute)
@anchor{library/urllib request urllib request Request method}@anchor{11df}
@deffn {Attribute} Request.method

The HTTP request method to use.  By default its value is @ref{887,,None},
which means that @ref{1375,,get_method()} will do its normal computation
of the method to be used.  Its value can be set (thus overriding the default
computation in @code{get_method()}) either by providing a default
value by setting it at the class level in a @ref{11de,,Request} subclass, or by
passing a value in to the @code{Request} constructor via the `method'
argument.


Added in version 3.3.



Changed in version 3.4: A default value can now be set in subclasses; previously it could only
be set via the constructor argument.

@end deffn

@geindex get_method() (urllib.request.Request method)
@anchor{library/urllib request urllib request Request get_method}@anchor{1375}
@deffn {Method} Request.get_method ()

Return a string indicating the HTTP request method.  If
@ref{11df,,Request.method} is not @code{None}, return its value, otherwise return
@code{'GET'} if @ref{11e1,,Request.data} is @code{None}, or @code{'POST'} if it’s not.
This is only meaningful for HTTP requests.


Changed in version 3.3: get_method now looks at the value of @ref{11df,,Request.method}.

@end deffn

@geindex add_header() (urllib.request.Request method)
@anchor{library/urllib request urllib request Request add_header}@anchor{3fa4}
@deffn {Method} Request.add_header (key, val)

Add another header to the request.  Headers are currently ignored by all
handlers except HTTP handlers, where they are added to the list of headers sent
to the server.  Note that there cannot be more than one header with the same
name, and later calls will overwrite previous calls in case the `key' collides.
Currently, this is no loss of HTTP functionality, since all headers which have
meaning when used more than once have a (header-specific) way of gaining the
same functionality using only one header.  Note that headers added using
this method are also added to redirected requests.
@end deffn

@geindex add_unredirected_header() (urllib.request.Request method)
@anchor{library/urllib request urllib request Request add_unredirected_header}@anchor{3fb5}
@deffn {Method} Request.add_unredirected_header (key, header)

Add a header that will not be added to a redirected request.
@end deffn

@geindex has_header() (urllib.request.Request method)
@anchor{library/urllib request urllib request Request has_header}@anchor{3fb6}
@deffn {Method} Request.has_header (header)

Return whether the instance has the named header (checks both regular and
unredirected).
@end deffn

@geindex remove_header() (urllib.request.Request method)
@anchor{library/urllib request urllib request Request remove_header}@anchor{11e3}
@deffn {Method} Request.remove_header (header)

Remove named header from the request instance (both from regular and
unredirected headers).


Added in version 3.4.

@end deffn

@geindex get_full_url() (urllib.request.Request method)
@anchor{library/urllib request urllib request Request get_full_url}@anchor{3fb7}
@deffn {Method} Request.get_full_url ()

Return the URL given in the constructor.


Changed in version 3.4.


Returns @ref{11e0,,Request.full_url}
@end deffn

@geindex set_proxy() (urllib.request.Request method)
@anchor{library/urllib request urllib request Request set_proxy}@anchor{3fb8}
@deffn {Method} Request.set_proxy (host, type)

Prepare the request by connecting to a proxy server. The `host' and `type' will
replace those of the instance, and the instance’s selector will be the original
URL given in the constructor.
@end deffn

@geindex get_header() (urllib.request.Request method)
@anchor{library/urllib request urllib request Request get_header}@anchor{3fb9}
@deffn {Method} Request.get_header (header_name, default=None)

Return the value of the given header. If the header is not present, return
the default value.
@end deffn

@geindex header_items() (urllib.request.Request method)
@anchor{library/urllib request urllib request Request header_items}@anchor{3fba}
@deffn {Method} Request.header_items ()

Return a list of tuples (header_name, header_value) of the Request headers.
@end deffn


Changed in version 3.4: The request methods add_data, has_data, get_data, get_type, get_host,
get_selector, get_origin_req_host and is_unverifiable that were deprecated
since 3.3 have been removed.


@node OpenerDirector Objects,BaseHandler Objects,Request Objects,urllib request — Extensible library for opening URLs
@anchor{library/urllib request opener-director-objects}@anchor{3fbb}@anchor{library/urllib request openerdirector-objects}@anchor{3fbc}
@subsubsection OpenerDirector Objects


@ref{3f9b,,OpenerDirector} instances have the following methods:

@geindex add_handler() (urllib.request.OpenerDirector method)
@anchor{library/urllib request urllib request OpenerDirector add_handler}@anchor{3fbd}
@deffn {Method} OpenerDirector.add_handler (handler)

`handler' should be an instance of @ref{3f9e,,BaseHandler}.  The following methods
are searched, and added to the possible chains (note that HTTP errors are a
special case).  Note that, in the following, `protocol' should be replaced
with the actual protocol to handle, for example @code{http_response()} would
be the HTTP protocol response handler.  Also `type' should be replaced with
the actual HTTP code, for example @code{http_error_404()} would handle HTTP
404 errors.


@itemize *

@item 
@code{<protocol>_open()} — signal that the handler knows how to open `protocol'
URLs.

See @ref{3fbe,,BaseHandler.<protocol>_open()} for more information.

@item 
@code{http_error_<type>()} — signal that the handler knows how to handle HTTP
errors with HTTP error code `type'.

See @ref{3fbf,,BaseHandler.http_error_<nnn>()} for more information.

@item 
@code{<protocol>_error()} — signal that the handler knows how to handle errors
from (non-@code{http}) `protocol'.

@item 
@code{<protocol>_request()} — signal that the handler knows how to pre-process
`protocol' requests.

See @ref{3fc0,,BaseHandler.<protocol>_request()} for more information.

@item 
@code{<protocol>_response()} — signal that the handler knows how to
post-process `protocol' responses.

See @ref{3fc1,,BaseHandler.<protocol>_response()} for more information.
@end itemize
@end deffn

@geindex open() (urllib.request.OpenerDirector method)
@anchor{library/urllib request urllib request OpenerDirector open}@anchor{11e2}
@deffn {Method} OpenerDirector.open (url, data=None[, timeout])

Open the given `url' (which can be a request object or a string), optionally
passing the given `data'. Arguments, return values and exceptions raised are
the same as those of @ref{309,,urlopen()} (which simply calls the @code{open()}
method on the currently installed global @ref{3f9b,,OpenerDirector}).  The
optional `timeout' parameter specifies a timeout in seconds for blocking
operations like the connection attempt (if not specified, the global default
timeout setting will be used). The timeout feature actually works only for
HTTP, HTTPS and FTP connections.
@end deffn

@geindex error() (urllib.request.OpenerDirector method)
@anchor{library/urllib request urllib request OpenerDirector error}@anchor{3fc2}
@deffn {Method} OpenerDirector.error (proto, *args)

Handle an error of the given protocol.  This will call the registered error
handlers for the given protocol with the given arguments (which are protocol
specific).  The HTTP protocol is a special case which uses the HTTP response
code to determine the specific error handler; refer to the @code{http_error_<type>()}
methods of the handler classes.

Return values and exceptions raised are the same as those of @ref{309,,urlopen()}.
@end deffn

OpenerDirector objects open URLs in three stages:

The order in which these methods are called within each stage is determined by
sorting the handler instances.


@enumerate 

@item 
Every handler with a method named like @code{<protocol>_request()} has that
method called to pre-process the request.

@item 
Handlers with a method named like @code{<protocol>_open()} are called to handle
the request. This stage ends when a handler either returns a non-@ref{887,,None}
value (ie. a response), or raises an exception (usually
@ref{2c0,,URLError}).  Exceptions are allowed to propagate.

In fact, the above algorithm is first tried for methods named
@ref{3fc3,,default_open()}.  If all such methods return @ref{887,,None}, the algorithm
is repeated for methods named like @code{<protocol>_open()}.  If all such methods
return @code{None}, the algorithm is repeated for methods named
@ref{3fc4,,unknown_open()}.

Note that the implementation of these methods may involve calls of the parent
@ref{3f9b,,OpenerDirector} instance’s @ref{11e2,,open()} and
@ref{3fc2,,error()} methods.

@item 
Every handler with a method named like @code{<protocol>_response()} has that
method called to post-process the response.
@end enumerate

@node BaseHandler Objects,HTTPRedirectHandler Objects,OpenerDirector Objects,urllib request — Extensible library for opening URLs
@anchor{library/urllib request base-handler-objects}@anchor{3fc5}@anchor{library/urllib request basehandler-objects}@anchor{3fc6}
@subsubsection BaseHandler Objects


@ref{3f9e,,BaseHandler} objects provide a couple of methods that are directly
useful, and others that are meant to be used by derived classes.  These are
intended for direct use:

@geindex add_parent() (urllib.request.BaseHandler method)
@anchor{library/urllib request urllib request BaseHandler add_parent}@anchor{3fc7}
@deffn {Method} BaseHandler.add_parent (director)

Add a director as parent.
@end deffn

@geindex close() (urllib.request.BaseHandler method)
@anchor{library/urllib request urllib request BaseHandler close}@anchor{3fc8}
@deffn {Method} BaseHandler.close ()

Remove any parents.
@end deffn

The following attribute and methods should only be used by classes derived from
@ref{3f9e,,BaseHandler}.

@cartouche
@quotation Note 
The convention has been adopted that subclasses defining
@code{<protocol>_request()} or @code{<protocol>_response()} methods are named
@code{*Processor}; all others are named @code{*Handler}.
@end quotation
@end cartouche

@geindex parent (urllib.request.BaseHandler attribute)
@anchor{library/urllib request urllib request BaseHandler parent}@anchor{3fc9}
@deffn {Attribute} BaseHandler.parent

A valid @ref{3f9b,,OpenerDirector}, which can be used to open using a different
protocol, or handle errors.
@end deffn

@geindex default_open() (urllib.request.BaseHandler method)
@anchor{library/urllib request urllib request BaseHandler default_open}@anchor{3fc3}
@deffn {Method} BaseHandler.default_open (req)

This method is `not' defined in @ref{3f9e,,BaseHandler}, but subclasses should
define it if they want to catch all URLs.

This method, if implemented, will be called by the parent
@ref{3f9b,,OpenerDirector}.  It should return a file-like object as described in
the return value of the @ref{11e2,,open()} method of @code{OpenerDirector}, or @code{None}.
It should raise @ref{2c0,,URLError}, unless a truly exceptional
thing happens (for example, @ref{1761,,MemoryError} should not be mapped to
@code{URLError}).

This method will be called before any protocol-specific open method.
@end deffn

@anchor{library/urllib request protocol-open}@anchor{3fbe}
@deffn {Method} BaseHandler.<protocol>_open(req)

This method is `not' defined in @ref{3f9e,,BaseHandler}, but subclasses should
define it if they want to handle URLs with the given protocol.

This method, if defined, will be called by the parent @ref{3f9b,,OpenerDirector}.
Return values should be the same as for  @ref{3fc3,,default_open()}.
@end deffn

@geindex unknown_open() (urllib.request.BaseHandler method)
@anchor{library/urllib request urllib request BaseHandler unknown_open}@anchor{3fc4}
@deffn {Method} BaseHandler.unknown_open (req)

This method is `not' defined in @ref{3f9e,,BaseHandler}, but subclasses should
define it if they want to catch all URLs with no specific registered handler to
open it.

This method, if implemented, will be called by the @ref{3fc9,,parent}
@ref{3f9b,,OpenerDirector}.  Return values should be the same as for
@ref{3fc3,,default_open()}.
@end deffn

@geindex http_error_default() (urllib.request.BaseHandler method)
@anchor{library/urllib request urllib request BaseHandler http_error_default}@anchor{3fca}
@deffn {Method} BaseHandler.http_error_default (req, fp, code, msg, hdrs)

This method is `not' defined in @ref{3f9e,,BaseHandler}, but subclasses should
override it if they intend to provide a catch-all for otherwise unhandled HTTP
errors.  It will be called automatically by the  @ref{3f9b,,OpenerDirector} getting
the error, and should not normally be called in other circumstances.

@ref{3f9b,,OpenerDirector} will call this method with five positional arguments:


@enumerate 

@item 
a @ref{11de,,Request} object,

@item 
a file-like object with the HTTP error body,

@item 
the three-digit code of the error, as a string,

@item 
the user-visible explanation of the code, as a string, and

@item 
the headers of the error, as a mapping object.
@end enumerate

Return values and exceptions raised should be the same as those of
@ref{309,,urlopen()}.
@end deffn

@anchor{library/urllib request http-error-nnn}@anchor{3fbf}
@deffn {Method} BaseHandler.http_error_<nnn>(req, fp, code, msg, hdrs)

`nnn' should be a three-digit HTTP error code.  This method is also not defined
in @ref{3f9e,,BaseHandler}, but will be called, if it exists, on an instance of a
subclass, when an HTTP error with code `nnn' occurs.

Subclasses should override this method to handle specific HTTP errors.

Arguments, return values and exceptions raised should be the same as for
@ref{3fca,,http_error_default()}.
@end deffn

@anchor{library/urllib request protocol-request}@anchor{3fc0}
@deffn {Method} BaseHandler.<protocol>_request(req)

This method is `not' defined in @ref{3f9e,,BaseHandler}, but subclasses should
define it if they want to pre-process requests of the given protocol.

This method, if defined, will be called by the parent @ref{3f9b,,OpenerDirector}.
`req' will be a @ref{11de,,Request} object. The return value should be a
@code{Request} object.
@end deffn

@anchor{library/urllib request protocol-response}@anchor{3fc1}
@deffn {Method} BaseHandler.<protocol>_response(req, response)

This method is `not' defined in @ref{3f9e,,BaseHandler}, but subclasses should
define it if they want to post-process responses of the given protocol.

This method, if defined, will be called by the parent @ref{3f9b,,OpenerDirector}.
`req' will be a @ref{11de,,Request} object. `response' will be an object
implementing the same interface as the return value of @ref{309,,urlopen()}.  The
return value should implement the same interface as the return value of
@code{urlopen()}.
@end deffn

@node HTTPRedirectHandler Objects,HTTPCookieProcessor Objects,BaseHandler Objects,urllib request — Extensible library for opening URLs
@anchor{library/urllib request http-redirect-handler}@anchor{3fcb}@anchor{library/urllib request httpredirecthandler-objects}@anchor{3fcc}
@subsubsection HTTPRedirectHandler Objects


@cartouche
@quotation Note 
Some HTTP redirections require action from this module’s client code.  If this
is the case, @ref{11e4,,HTTPError} is raised.  See 
@geindex RFC; RFC 2616
RFC 2616@footnote{https://datatracker.ietf.org/doc/html/rfc2616.html} for
details of the precise meanings of the various redirection codes.

An @ref{11e4,,HTTPError} exception raised as a security consideration if the
HTTPRedirectHandler is presented with a redirected URL which is not an HTTP,
HTTPS or FTP URL.
@end quotation
@end cartouche

@geindex redirect_request() (urllib.request.HTTPRedirectHandler method)
@anchor{library/urllib request urllib request HTTPRedirectHandler redirect_request}@anchor{3fcd}
@deffn {Method} HTTPRedirectHandler.redirect_request (req, fp, code, msg, hdrs, newurl)

Return a @ref{11de,,Request} or @code{None} in response to a redirect. This is called
by the default implementations of the @code{http_error_30*()} methods when a
redirection is received from the server.  If a redirection should take place,
return a new @code{Request} to allow @code{http_error_30*()} to perform the
redirect to `newurl'.  Otherwise, raise @ref{11e4,,HTTPError} if
no other handler should try to handle this URL, or return @code{None} if you
can’t but another handler might.

@cartouche
@quotation Note 
The default implementation of this method does not strictly follow 
@geindex RFC; RFC 2616
RFC 2616@footnote{https://datatracker.ietf.org/doc/html/rfc2616.html},
which says that 301 and 302 responses to @code{POST} requests must not be
automatically redirected without confirmation by the user.  In reality, browsers
do allow automatic redirection of these responses, changing the POST to a
@code{GET}, and the default implementation reproduces this behavior.
@end quotation
@end cartouche
@end deffn

@geindex http_error_301() (urllib.request.HTTPRedirectHandler method)
@anchor{library/urllib request urllib request HTTPRedirectHandler http_error_301}@anchor{3fce}
@deffn {Method} HTTPRedirectHandler.http_error_301 (req, fp, code, msg, hdrs)

Redirect to the @code{Location:} or @code{URI:} URL.  This method is called by the
parent @ref{3f9b,,OpenerDirector} when getting an HTTP ‘moved permanently’ response.
@end deffn

@geindex http_error_302() (urllib.request.HTTPRedirectHandler method)
@anchor{library/urllib request urllib request HTTPRedirectHandler http_error_302}@anchor{3fcf}
@deffn {Method} HTTPRedirectHandler.http_error_302 (req, fp, code, msg, hdrs)

The same as @ref{3fce,,http_error_301()}, but called for the ‘found’ response.
@end deffn

@geindex http_error_303() (urllib.request.HTTPRedirectHandler method)
@anchor{library/urllib request urllib request HTTPRedirectHandler http_error_303}@anchor{3fd0}
@deffn {Method} HTTPRedirectHandler.http_error_303 (req, fp, code, msg, hdrs)

The same as @ref{3fce,,http_error_301()}, but called for the ‘see other’ response.
@end deffn

@geindex http_error_307() (urllib.request.HTTPRedirectHandler method)
@anchor{library/urllib request urllib request HTTPRedirectHandler http_error_307}@anchor{3fd1}
@deffn {Method} HTTPRedirectHandler.http_error_307 (req, fp, code, msg, hdrs)

The same as @ref{3fce,,http_error_301()}, but called for the ‘temporary redirect’
response. It does not allow changing the request method from @code{POST}
to @code{GET}.
@end deffn

@geindex http_error_308() (urllib.request.HTTPRedirectHandler method)
@anchor{library/urllib request urllib request HTTPRedirectHandler http_error_308}@anchor{3fd2}
@deffn {Method} HTTPRedirectHandler.http_error_308 (req, fp, code, msg, hdrs)

The same as @ref{3fce,,http_error_301()}, but called for the ‘permanent redirect’
response. It does not allow changing the request method from @code{POST}
to @code{GET}.


Added in version 3.11.

@end deffn

@node HTTPCookieProcessor Objects,ProxyHandler Objects,HTTPRedirectHandler Objects,urllib request — Extensible library for opening URLs
@anchor{library/urllib request http-cookie-processor}@anchor{3fd3}@anchor{library/urllib request httpcookieprocessor-objects}@anchor{3fd4}
@subsubsection HTTPCookieProcessor Objects


@ref{3fa5,,HTTPCookieProcessor} instances have one attribute:

@geindex cookiejar (urllib.request.HTTPCookieProcessor attribute)
@anchor{library/urllib request urllib request HTTPCookieProcessor cookiejar}@anchor{3fd5}
@deffn {Attribute} HTTPCookieProcessor.cookiejar

The @ref{3fd6,,http.cookiejar.CookieJar} in which cookies are stored.
@end deffn

@node ProxyHandler Objects,HTTPPasswordMgr Objects,HTTPCookieProcessor Objects,urllib request — Extensible library for opening URLs
@anchor{library/urllib request proxy-handler}@anchor{3fd7}@anchor{library/urllib request proxyhandler-objects}@anchor{3fd8}
@subsubsection ProxyHandler Objects



@deffn {Method} ProxyHandler.<protocol>_open(request)

The @ref{1df7,,ProxyHandler} will have a method @code{<protocol>_open()} for every
`protocol' which has a proxy in the `proxies' dictionary given in the
constructor.  The method will modify requests to go through the proxy, by
calling @code{request.set_proxy()}, and call the next handler in the chain to
actually execute the protocol.
@end deffn

@node HTTPPasswordMgr Objects,HTTPPasswordMgrWithPriorAuth Objects,ProxyHandler Objects,urllib request — Extensible library for opening URLs
@anchor{library/urllib request http-password-mgr}@anchor{3fa8}@anchor{library/urllib request httppasswordmgr-objects}@anchor{3fd9}
@subsubsection HTTPPasswordMgr Objects


These methods are available on @ref{3fa6,,HTTPPasswordMgr} and
@ref{3fa7,,HTTPPasswordMgrWithDefaultRealm} objects.

@geindex add_password() (urllib.request.HTTPPasswordMgr method)
@anchor{library/urllib request urllib request HTTPPasswordMgr add_password}@anchor{3fda}
@deffn {Method} HTTPPasswordMgr.add_password (realm, uri, user, passwd)

`uri' can be either a single URI, or a sequence of URIs. `realm', `user' and
`passwd' must be strings. This causes @code{(user, passwd)} to be used as
authentication tokens when authentication for `realm' and a super-URI of any of
the given URIs is given.
@end deffn

@geindex find_user_password() (urllib.request.HTTPPasswordMgr method)
@anchor{library/urllib request urllib request HTTPPasswordMgr find_user_password}@anchor{1c19}
@deffn {Method} HTTPPasswordMgr.find_user_password (realm, authuri)

Get user/password for given realm and URI, if any.  This method will return
@code{(None, None)} if there is no matching user/password.

For @ref{3fa7,,HTTPPasswordMgrWithDefaultRealm} objects, the realm @code{None} will be
searched if the given `realm' has no matching user/password.
@end deffn

@node HTTPPasswordMgrWithPriorAuth Objects,AbstractBasicAuthHandler Objects,HTTPPasswordMgr Objects,urllib request — Extensible library for opening URLs
@anchor{library/urllib request http-password-mgr-with-prior-auth}@anchor{3fa9}@anchor{library/urllib request httppasswordmgrwithpriorauth-objects}@anchor{3fdb}
@subsubsection HTTPPasswordMgrWithPriorAuth Objects


This password manager extends @ref{3fa7,,HTTPPasswordMgrWithDefaultRealm} to support
tracking URIs for which authentication credentials should always be sent.

@geindex add_password() (urllib.request.HTTPPasswordMgrWithPriorAuth method)
@anchor{library/urllib request urllib request HTTPPasswordMgrWithPriorAuth add_password}@anchor{3fdc}
@deffn {Method} HTTPPasswordMgrWithPriorAuth.add_password (realm, uri, user, passwd, is_authenticated=False)

`realm', `uri', `user', `passwd' are as for
@ref{3fda,,HTTPPasswordMgr.add_password()}.  `is_authenticated' sets the initial
value of the @code{is_authenticated} flag for the given URI or list of URIs.
If `is_authenticated' is specified as @code{True}, `realm' is ignored.
@end deffn

@geindex find_user_password() (urllib.request.HTTPPasswordMgrWithPriorAuth method)
@anchor{library/urllib request urllib request HTTPPasswordMgrWithPriorAuth find_user_password}@anchor{3fdd}
@deffn {Method} HTTPPasswordMgrWithPriorAuth.find_user_password (realm, authuri)

Same as for @ref{3fa7,,HTTPPasswordMgrWithDefaultRealm} objects
@end deffn

@geindex update_authenticated() (urllib.request.HTTPPasswordMgrWithPriorAuth method)
@anchor{library/urllib request urllib request HTTPPasswordMgrWithPriorAuth update_authenticated}@anchor{3fde}
@deffn {Method} HTTPPasswordMgrWithPriorAuth.update_authenticated (self, uri, is_authenticated=False)

Update the @code{is_authenticated} flag for the given `uri' or list
of URIs.
@end deffn

@geindex is_authenticated() (urllib.request.HTTPPasswordMgrWithPriorAuth method)
@anchor{library/urllib request urllib request HTTPPasswordMgrWithPriorAuth is_authenticated}@anchor{1c1a}
@deffn {Method} HTTPPasswordMgrWithPriorAuth.is_authenticated (self, authuri)

Returns the current state of the @code{is_authenticated} flag for
the given URI.
@end deffn

@node AbstractBasicAuthHandler Objects,HTTPBasicAuthHandler Objects,HTTPPasswordMgrWithPriorAuth Objects,urllib request — Extensible library for opening URLs
@anchor{library/urllib request abstract-basic-auth-handler}@anchor{3fdf}@anchor{library/urllib request abstractbasicauthhandler-objects}@anchor{3fe0}
@subsubsection AbstractBasicAuthHandler Objects


@geindex http_error_auth_reqed() (urllib.request.AbstractBasicAuthHandler method)
@anchor{library/urllib request urllib request AbstractBasicAuthHandler http_error_auth_reqed}@anchor{3fe1}
@deffn {Method} AbstractBasicAuthHandler.http_error_auth_reqed (authreq, host, req, headers)

Handle an authentication request by getting a user/password pair, and re-trying
the request.  `authreq' should be the name of the header where the information
about the realm is included in the request, `host' specifies the URL and path to
authenticate for, `req' should be the (failed) @ref{11de,,Request} object, and
`headers' should be the error headers.

`host' is either an authority (e.g. @code{"python.org"}) or a URL containing an
authority component (e.g. @code{"https://python.org/"}). In either case, the
authority must not contain a userinfo component (so, @code{"python.org"} and
@code{"python.org:80"} are fine, @code{"joe:password@@python.org"} is not).
@end deffn

@node HTTPBasicAuthHandler Objects,ProxyBasicAuthHandler Objects,AbstractBasicAuthHandler Objects,urllib request — Extensible library for opening URLs
@anchor{library/urllib request http-basic-auth-handler}@anchor{3fe2}@anchor{library/urllib request httpbasicauthhandler-objects}@anchor{3fe3}
@subsubsection HTTPBasicAuthHandler Objects


@geindex http_error_401() (urllib.request.HTTPBasicAuthHandler method)
@anchor{library/urllib request urllib request HTTPBasicAuthHandler http_error_401}@anchor{3fe4}
@deffn {Method} HTTPBasicAuthHandler.http_error_401 (req, fp, code, msg, hdrs)

Retry the request with authentication information, if available.
@end deffn

@node ProxyBasicAuthHandler Objects,AbstractDigestAuthHandler Objects,HTTPBasicAuthHandler Objects,urllib request — Extensible library for opening URLs
@anchor{library/urllib request proxy-basic-auth-handler}@anchor{3fe5}@anchor{library/urllib request proxybasicauthhandler-objects}@anchor{3fe6}
@subsubsection ProxyBasicAuthHandler Objects


@geindex http_error_407() (urllib.request.ProxyBasicAuthHandler method)
@anchor{library/urllib request urllib request ProxyBasicAuthHandler http_error_407}@anchor{3fe7}
@deffn {Method} ProxyBasicAuthHandler.http_error_407 (req, fp, code, msg, hdrs)

Retry the request with authentication information, if available.
@end deffn

@node AbstractDigestAuthHandler Objects,HTTPDigestAuthHandler Objects,ProxyBasicAuthHandler Objects,urllib request — Extensible library for opening URLs
@anchor{library/urllib request abstract-digest-auth-handler}@anchor{3fe8}@anchor{library/urllib request abstractdigestauthhandler-objects}@anchor{3fe9}
@subsubsection AbstractDigestAuthHandler Objects


@geindex http_error_auth_reqed() (urllib.request.AbstractDigestAuthHandler method)
@anchor{library/urllib request urllib request AbstractDigestAuthHandler http_error_auth_reqed}@anchor{3fea}
@deffn {Method} AbstractDigestAuthHandler.http_error_auth_reqed (authreq, host, req, headers)

`authreq' should be the name of the header where the information about the realm
is included in the request, `host' should be the host to authenticate to, `req'
should be the (failed) @ref{11de,,Request} object, and `headers' should be the
error headers.
@end deffn

@node HTTPDigestAuthHandler Objects,ProxyDigestAuthHandler Objects,AbstractDigestAuthHandler Objects,urllib request — Extensible library for opening URLs
@anchor{library/urllib request http-digest-auth-handler}@anchor{3feb}@anchor{library/urllib request httpdigestauthhandler-objects}@anchor{3fec}
@subsubsection HTTPDigestAuthHandler Objects


@geindex http_error_401() (urllib.request.HTTPDigestAuthHandler method)
@anchor{library/urllib request urllib request HTTPDigestAuthHandler http_error_401}@anchor{3fed}
@deffn {Method} HTTPDigestAuthHandler.http_error_401 (req, fp, code, msg, hdrs)

Retry the request with authentication information, if available.
@end deffn

@node ProxyDigestAuthHandler Objects,HTTPHandler Objects,HTTPDigestAuthHandler Objects,urllib request — Extensible library for opening URLs
@anchor{library/urllib request proxy-digest-auth-handler}@anchor{3fee}@anchor{library/urllib request proxydigestauthhandler-objects}@anchor{3fef}
@subsubsection ProxyDigestAuthHandler Objects


@geindex http_error_407() (urllib.request.ProxyDigestAuthHandler method)
@anchor{library/urllib request urllib request ProxyDigestAuthHandler http_error_407}@anchor{3ff0}
@deffn {Method} ProxyDigestAuthHandler.http_error_407 (req, fp, code, msg, hdrs)

Retry the request with authentication information, if available.
@end deffn

@node HTTPHandler Objects,HTTPSHandler Objects,ProxyDigestAuthHandler Objects,urllib request — Extensible library for opening URLs
@anchor{library/urllib request http-handler-objects}@anchor{3ff1}@anchor{library/urllib request httphandler-objects}@anchor{3ff2}
@subsubsection HTTPHandler Objects


@geindex http_open() (urllib.request.HTTPHandler method)
@anchor{library/urllib request urllib request HTTPHandler http_open}@anchor{3ff3}
@deffn {Method} HTTPHandler.http_open (req)

Send an HTTP request, which can be either GET or POST, depending on
@code{req.data}.
@end deffn

@node HTTPSHandler Objects,FileHandler Objects,HTTPHandler Objects,urllib request — Extensible library for opening URLs
@anchor{library/urllib request https-handler-objects}@anchor{3ff4}@anchor{library/urllib request httpshandler-objects}@anchor{3ff5}
@subsubsection HTTPSHandler Objects


@geindex https_open() (urllib.request.HTTPSHandler method)
@anchor{library/urllib request urllib request HTTPSHandler https_open}@anchor{3ff6}
@deffn {Method} HTTPSHandler.https_open (req)

Send an HTTPS request, which can be either GET or POST, depending on
@code{req.data}.
@end deffn

@node FileHandler Objects,DataHandler Objects,HTTPSHandler Objects,urllib request — Extensible library for opening URLs
@anchor{library/urllib request file-handler-objects}@anchor{3ff7}@anchor{library/urllib request filehandler-objects}@anchor{3ff8}
@subsubsection FileHandler Objects


@geindex file_open() (urllib.request.FileHandler method)
@anchor{library/urllib request urllib request FileHandler file_open}@anchor{3ff9}
@deffn {Method} FileHandler.file_open (req)

Open the file locally, if there is no host name, or the host name is
@code{'localhost'}.


Changed in version 3.2: This method is applicable only for local hostnames.  When a remote
hostname is given, a @ref{2c0,,URLError} is raised.

@end deffn

@node DataHandler Objects,FTPHandler Objects,FileHandler Objects,urllib request — Extensible library for opening URLs
@anchor{library/urllib request data-handler-objects}@anchor{3ffa}@anchor{library/urllib request datahandler-objects}@anchor{3ffb}
@subsubsection DataHandler Objects


@geindex data_open() (urllib.request.DataHandler method)
@anchor{library/urllib request urllib request DataHandler data_open}@anchor{3ffc}
@deffn {Method} DataHandler.data_open (req)

Read a data URL. This kind of URL contains the content encoded in the URL
itself. The data URL syntax is specified in 
@geindex RFC; RFC 2397
RFC 2397@footnote{https://datatracker.ietf.org/doc/html/rfc2397.html}. This implementation
ignores white spaces in base64 encoded data URLs so the URL may be wrapped
in whatever source file it comes from. But even though some browsers don’t
mind about a missing padding at the end of a base64 encoded data URL, this
implementation will raise a @ref{2ee,,ValueError} in that case.
@end deffn

@node FTPHandler Objects,CacheFTPHandler Objects,DataHandler Objects,urllib request — Extensible library for opening URLs
@anchor{library/urllib request ftp-handler-objects}@anchor{3ffd}@anchor{library/urllib request ftphandler-objects}@anchor{3ffe}
@subsubsection FTPHandler Objects


@geindex ftp_open() (urllib.request.FTPHandler method)
@anchor{library/urllib request urllib request FTPHandler ftp_open}@anchor{3fff}
@deffn {Method} FTPHandler.ftp_open (req)

Open the FTP file indicated by `req'. The login is always done with empty
username and password.
@end deffn

@node CacheFTPHandler Objects,UnknownHandler Objects,FTPHandler Objects,urllib request — Extensible library for opening URLs
@anchor{library/urllib request cacheftp-handler-objects}@anchor{4000}@anchor{library/urllib request cacheftphandler-objects}@anchor{4001}
@subsubsection CacheFTPHandler Objects


@ref{1adf,,CacheFTPHandler} objects are @ref{3fa1,,FTPHandler} objects with the
following additional methods:

@geindex setTimeout() (urllib.request.CacheFTPHandler method)
@anchor{library/urllib request urllib request CacheFTPHandler setTimeout}@anchor{4002}
@deffn {Method} CacheFTPHandler.setTimeout (t)

Set timeout of connections to `t' seconds.
@end deffn

@geindex setMaxConns() (urllib.request.CacheFTPHandler method)
@anchor{library/urllib request urllib request CacheFTPHandler setMaxConns}@anchor{4003}
@deffn {Method} CacheFTPHandler.setMaxConns (m)

Set maximum number of cached connections to `m'.
@end deffn

@node UnknownHandler Objects,HTTPErrorProcessor Objects,CacheFTPHandler Objects,urllib request — Extensible library for opening URLs
@anchor{library/urllib request unknown-handler-objects}@anchor{4004}@anchor{library/urllib request unknownhandler-objects}@anchor{4005}
@subsubsection UnknownHandler Objects


@geindex unknown_open() (urllib.request.UnknownHandler method)
@anchor{library/urllib request urllib request UnknownHandler unknown_open}@anchor{4006}
@deffn {Method} UnknownHandler.unknown_open ()

Raise a @ref{2c0,,URLError} exception.
@end deffn

@node HTTPErrorProcessor Objects,Examples<27>,UnknownHandler Objects,urllib request — Extensible library for opening URLs
@anchor{library/urllib request http-error-processor-objects}@anchor{4007}@anchor{library/urllib request httperrorprocessor-objects}@anchor{4008}
@subsubsection HTTPErrorProcessor Objects


@geindex http_response() (urllib.request.HTTPErrorProcessor method)
@anchor{library/urllib request urllib request HTTPErrorProcessor http_response}@anchor{4009}
@deffn {Method} HTTPErrorProcessor.http_response (request, response)

Process HTTP error responses.

For 200 error codes, the response object is returned immediately.

For non-200 error codes, this simply passes the job on to the
@code{http_error_<type>()} handler methods, via @ref{3fc2,,OpenerDirector.error()}.
Eventually, @ref{3f9f,,HTTPDefaultErrorHandler} will raise an
@ref{11e4,,HTTPError} if no other handler handles the error.
@end deffn

@geindex https_response() (urllib.request.HTTPErrorProcessor method)
@anchor{library/urllib request urllib request HTTPErrorProcessor https_response}@anchor{400a}
@deffn {Method} HTTPErrorProcessor.https_response (request, response)

Process HTTPS error responses.

The behavior is same as @ref{4009,,http_response()}.
@end deffn

@node Examples<27>,Legacy interface,HTTPErrorProcessor Objects,urllib request — Extensible library for opening URLs
@anchor{library/urllib request examples}@anchor{400b}@anchor{library/urllib request urllib-request-examples}@anchor{400c}
@subsubsection Examples


In addition to the examples below, more examples are given in
@ref{400d,,HOWTO Fetch Internet Resources Using The urllib Package}.

This example gets the python.org main page and displays the first 300 bytes of
it:

@example
>>> import urllib.request
>>> with urllib.request.urlopen('https://www.python.org/') as f:
...     # The response may be compressed (for example, 'gzip').
...     print(f.headers.get('Content-Encoding'))
...     data = f.read()
...     if f.headers.get('Content-Encoding') == 'gzip':
...         import gzip
...         data = gzip.decompress(data)
...     print(data[:300].decode('utf-8', errors='replace'))
@end example

Note that urlopen returns a bytes object.  This is because there is no way
for urlopen to automatically determine the encoding of the byte stream
it receives from the HTTP server. In general, a program will decode
the returned bytes object to string once it determines or guesses
the appropriate encoding.

The following HTML spec document, @indicateurl{https://html.spec.whatwg.org/#charset}, lists
the various ways in which an HTML or an XML document could have specified its
encoding information.

For additional information, see the W3C document: @indicateurl{https://www.w3.org/International/questions/qa-html-encoding-declarations}.

As the python.org website uses `utf-8' encoding as specified in its meta tag, we
will use the same for decoding the bytes object:

@example
>>> with urllib.request.urlopen('https://www.python.org/') as f:
...     # Check for compression and decode appropriately.
...     enc = f.headers.get('Content-Encoding')
...     data = f.read()
...     if enc == 'gzip':
...         import gzip
...         data = gzip.decompress(data)
...     print(data[:100].decode('utf-8', errors='replace'))
...
@end example

It is also possible to achieve the same result without using the
@ref{1e3,,context manager} approach:

@example
>>> import urllib.request
>>> f = urllib.request.urlopen('https://www.python.org/')
>>> try:
...     enc = f.headers.get('Content-Encoding')
...     data = f.read()
...     if enc == 'gzip':
...         import gzip
...         data = gzip.decompress(data)
...     print(data[:100].decode('utf-8', errors='replace'))
... finally:
...     f.close()
@end example

In the following example, we are sending a data-stream to the stdin of a CGI
and reading the data it returns to us. Note that this example will only work
when the Python installation supports SSL.

@example
>>> import urllib.request
>>> req = urllib.request.Request(url='https://localhost/cgi-bin/test.cgi',
...                       data=b'This data is passed to stdin of the CGI')
>>> with urllib.request.urlopen(req) as f:
...     print(f.read().decode('utf-8'))
...
Got Data: "This data is passed to stdin of the CGI"
@end example

The code for the sample CGI used in the above example is:

@example
#!/usr/bin/env python
import sys
data = sys.stdin.read()
print('Content-type: text/plain\n\nGot Data: "%s"' % data)
@end example

Here is an example of doing a @code{PUT} request using @ref{11de,,Request}:

@example
import urllib.request
DATA = b'some data'
req = urllib.request.Request(url='http://localhost:8080', data=DATA, method='PUT')
with urllib.request.urlopen(req) as f:
    pass
print(f.status)
print(f.reason)
@end example

Use of Basic HTTP Authentication:

@example
import urllib.request
# Create an OpenerDirector with support for Basic HTTP Authentication...
auth_handler = urllib.request.HTTPBasicAuthHandler()
auth_handler.add_password(realm='PDQ Application',
                          uri='https://mahler:8092/site-updates.py',
                          user='klem',
                          passwd='kadidd!ehopper')
opener = urllib.request.build_opener(auth_handler)
# ...and install it globally so it can be used with urlopen.
urllib.request.install_opener(opener)
with urllib.request.urlopen('http://www.example.com/login.html') as f:
    print(f.read().decode('utf-8'))
@end example

@ref{30b,,build_opener()} provides many handlers by default, including a
@ref{1df7,,ProxyHandler}.  By default, @code{ProxyHandler} uses the environment
variables named @code{<scheme>_proxy}, where @code{<scheme>} is the URL scheme
involved.  For example, the @code{http_proxy} environment variable is read to
obtain the HTTP proxy’s URL.

This example replaces the default @ref{1df7,,ProxyHandler} with one that uses
programmatically supplied proxy URLs, and adds proxy authorization support with
@ref{3fab,,ProxyBasicAuthHandler}.

@example
proxy_handler = urllib.request.ProxyHandler(@{'http': 'http://www.example.com:3128/'@})
proxy_auth_handler = urllib.request.ProxyBasicAuthHandler()
proxy_auth_handler.add_password('realm', 'host', 'username', 'password')

opener = urllib.request.build_opener(proxy_handler, proxy_auth_handler)
# This time, rather than install the OpenerDirector, we use it directly:
with opener.open('http://www.example.com/login.html') as f:
   print(f.read().decode('utf-8'))
@end example

Adding HTTP headers:

Use the `headers' argument to the @ref{11de,,Request} constructor, or:

@example
import urllib.request
req = urllib.request.Request('http://www.example.com/')
req.add_header('Referer', 'https://www.python.org/')
# Customize the default User-Agent header value:
req.add_header('User-Agent', 'urllib-example/0.1 (Contact: . . .)')
with urllib.request.urlopen(req) as f:
    print(f.read().decode('utf-8'))
@end example

@ref{3f9b,,OpenerDirector} automatically adds a @code{User-Agent} header to
every @ref{11de,,Request}.  To change this:

@example
import urllib.request
opener = urllib.request.build_opener()
opener.addheaders = [('User-agent', 'Mozilla/5.0')]
with opener.open('http://www.example.com/') as f:
   print(f.read().decode('utf-8'))
@end example

Also, remember that a few standard headers (@code{Content-Length},
@code{Content-Type} and @code{Host})
are added when the @ref{11de,,Request} is passed to @ref{309,,urlopen()} (or
@ref{11e2,,OpenerDirector.open()}).
@anchor{library/urllib request urllib-examples}@anchor{400e}
Here is an example session that uses the @code{GET} method to retrieve a URL
containing parameters:

@example
>>> import urllib.request
>>> import urllib.parse
>>> params = urllib.parse.urlencode(@{'spam': 1, 'eggs': 2, 'bacon': 0@})
>>> url = "https://www.python.org/?%s" % params
>>> with urllib.request.urlopen(url) as f:
...     print(f.read().decode('utf-8'))
...
@end example

The following example uses the @code{POST} method instead. Note that params output
from urlencode is encoded to bytes before it is sent to urlopen as data:

@example
>>> import urllib.request
>>> import urllib.parse
>>> data = urllib.parse.urlencode(@{'spam': 1, 'eggs': 2, 'bacon': 0@})
>>> data = data.encode('ascii')
>>> with urllib.request.urlopen("https://httpbin.org/post", data) as f:
...     print(f.read().decode('utf-8'))
...
@end example

The following example uses an explicitly specified HTTP proxy, overriding
environment settings:

@example
>>> import urllib.request
>>> proxies = @{'http': 'http://proxy.example.com:8080/'@}
>>> opener = urllib.request.build_opener(urllib.request.ProxyHandler(proxies))
>>> with opener.open("https://www.python.org") as f:
...     f.read().decode('utf-8')
...
@end example

The following example uses no proxies at all, overriding environment settings:

@example
>>> import urllib.request
>>> opener = urllib.request.build_opener(urllib.request.ProxyHandler(@{@}))
>>> with opener.open("https://www.python.org/") as f:
...     f.read().decode('utf-8')
...
@end example

@node Legacy interface,urllib request Restrictions,Examples<27>,urllib request — Extensible library for opening URLs
@anchor{library/urllib request legacy-interface}@anchor{400f}
@subsubsection Legacy interface


The following functions and classes are ported from the Python 2 module
@code{urllib} (as opposed to @code{urllib2}).  They might become deprecated at
some point in the future.

@geindex urlretrieve() (in module urllib.request)
@anchor{library/urllib request urllib request urlretrieve}@anchor{30a}
@deffn {Function} urllib.request.urlretrieve (url, filename=None, reporthook=None, data=None)

Copy a network object denoted by a URL to a local file. If the URL
points to a local file, the object will not be copied unless filename is supplied.
Return a tuple @code{(filename, headers)} where `filename' is the
local file name under which the object can be found, and `headers' is whatever
the @code{info()} method of the object returned by @ref{309,,urlopen()} returned (for
a remote object). Exceptions are the same as for @code{urlopen()}.

The second argument, if present, specifies the file location to copy to (if
absent, the location will be a tempfile with a generated name). The third
argument, if present, is a callable that will be called once on
establishment of the network connection and once after each block read
thereafter.  The callable will be passed three arguments; a count of blocks
transferred so far, a block size in bytes, and the total size of the file.  The
third argument may be @code{-1} on older FTP servers which do not return a file
size in response to a retrieval request.

The following example illustrates the most common usage scenario:

@example
>>> import urllib.request
>>> local_filename, headers = urllib.request.urlretrieve('https://python.org/')
>>> html = open(local_filename)
>>> html.close()
@end example

If the `url' uses the @code{http:} scheme identifier, the optional `data'
argument may be given to specify a @code{POST} request (normally the request
type is @code{GET}).  The `data' argument must be a bytes object in standard
@code{application/x-www-form-urlencoded} format; see the
@ref{109b,,urllib.parse.urlencode()} function.

@code{urlretrieve()} will raise @ref{4010,,ContentTooShortError} when it detects that
the amount of data available  was less than the expected amount (which is the
size reported by a  `Content-Length' header). This can occur, for example, when
the  download is interrupted.

The `Content-Length' is treated as a lower bound: if there’s more data  to read,
urlretrieve reads more data, but if less data is available,  it raises the
exception.

You can still retrieve the downloaded data in this case, it is stored in the
@code{content} attribute of the exception instance.

If no `Content-Length' header was supplied, urlretrieve can not check the size
of the data it has downloaded, and just returns it.  In this case you just have
to assume that the download was successful.
@end deffn

@geindex urlcleanup() (in module urllib.request)
@anchor{library/urllib request urllib request urlcleanup}@anchor{1dfe}
@deffn {Function} urllib.request.urlcleanup ()

Cleans up temporary files that may have been left behind by previous
calls to @ref{30a,,urlretrieve()}.
@end deffn

@node urllib request Restrictions,,Legacy interface,urllib request — Extensible library for opening URLs
@anchor{library/urllib request urllib-request-restrictions}@anchor{4011}
@subsubsection @code{urllib.request} Restrictions


@geindex HTTP; protocol
@geindex FTP; protocol


@itemize *

@item 
Currently, only the following protocols are supported: HTTP (versions 0.9 and
1.0), FTP, local files, and data URLs.


Changed in version 3.4: Added support for data URLs.


@item 
The caching feature of @ref{30a,,urlretrieve()} has been disabled until someone
finds the time to hack proper processing of Expiration time headers.

@item 
There should be a function to query whether a particular URL is in the cache.

@item 
For backward compatibility, if a URL appears to point to a local file but the
file can’t be opened, the URL is re-interpreted using the FTP protocol.  This
can sometimes cause confusing error messages.

@item 
The @ref{309,,urlopen()} and @ref{30a,,urlretrieve()} functions can cause arbitrarily
long delays while waiting for a network connection to be set up.  This means
that it is difficult to build an interactive web client using these functions
without using threads.

@geindex HTML
@geindex HTTP; protocol

@item 
The data returned by @ref{309,,urlopen()} or @ref{30a,,urlretrieve()} is the raw data
returned by the server.  This may be binary data (such as an image), plain text
or (for example) HTML.  The HTTP protocol provides type information in the reply
header, which can be inspected by looking at the @code{Content-Type}
header.  If the returned data is HTML, you can use the module
@ref{71,,html.parser} to parse it.

@geindex FTP

@item 
The code handling the FTP protocol cannot differentiate between a file and a
directory.  This can lead to unexpected behavior when attempting to read a URL
that points to a file that is not accessible.  If the URL ends in a @code{/}, it is
assumed to refer to a directory and will be handled accordingly.  But if an
attempt to read a file leads to a 550 error (meaning the URL cannot be found or
is not accessible, often for permission reasons), then the path is treated as a
directory in order to handle the case when a directory is specified by a URL but
the trailing @code{/} has been left off.  This can cause misleading results when
you try to fetch a file whose read permissions make it inaccessible; the FTP
code will try to read it, fail with a 550 error, and then perform a directory
listing for the unreadable file. If fine-grained control is needed, consider
using the @ref{62,,ftplib} module.
@end itemize

@node urllib response — Response classes used by urllib,urllib parse — Parse URLs into components,urllib request — Extensible library for opening URLs,Internet Protocols and Support
@anchor{library/urllib request module-urllib response}@anchor{113}@anchor{library/urllib request urllib-response-response-classes-used-by-urllib}@anchor{4012}
@subsection @code{urllib.response} — Response classes used by urllib


@geindex module; urllib.response

The @code{urllib.response} module defines functions and classes which define a
minimal file-like interface, including @code{read()} and @code{readline()}.
Functions defined by this module are used internally by the @code{urllib.request} module.
The typical response object is a @ref{3f99,,urllib.response.addinfourl} instance:

@geindex addinfourl (class in urllib.response)
@anchor{library/urllib request urllib response addinfourl}@anchor{3f99}
@deffn {Class} urllib.response.addinfourl

@geindex url (urllib.response.addinfourl attribute)
@anchor{library/urllib request urllib response addinfourl url}@anchor{192e}
@deffn {Attribute} url

URL of the resource retrieved, commonly used to determine if a redirect was followed.
@end deffn

@geindex headers (urllib.response.addinfourl attribute)
@anchor{library/urllib request urllib response addinfourl headers}@anchor{4013}
@deffn {Attribute} headers

Returns the headers of the response in the form of an @ref{580,,EmailMessage} instance.
@end deffn

@geindex status (urllib.response.addinfourl attribute)
@anchor{library/urllib request urllib response addinfourl status}@anchor{4014}
@deffn {Attribute} status


Added in version 3.9.


Status code returned by server.
@end deffn

@geindex geturl() (urllib.response.addinfourl method)
@anchor{library/urllib request urllib response addinfourl geturl}@anchor{4015}
@deffn {Method} geturl ()


Deprecated since version 3.9: Deprecated in favor of @ref{192e,,url}.

@end deffn

@geindex info() (urllib.response.addinfourl method)
@anchor{library/urllib request urllib response addinfourl info}@anchor{4016}
@deffn {Method} info ()


Deprecated since version 3.9: Deprecated in favor of @ref{4013,,headers}.

@end deffn

@geindex code (urllib.response.addinfourl attribute)
@anchor{library/urllib request urllib response addinfourl code}@anchor{4017}
@deffn {Attribute} code


Deprecated since version 3.9: Deprecated in favor of @ref{4014,,status}.

@end deffn

@geindex getcode() (urllib.response.addinfourl method)
@anchor{library/urllib request urllib response addinfourl getcode}@anchor{4018}
@deffn {Method} getcode ()


Deprecated since version 3.9: Deprecated in favor of @ref{4014,,status}.

@end deffn
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node urllib parse — Parse URLs into components,urllib error — Exception classes raised by urllib request,urllib response — Response classes used by urllib,Internet Protocols and Support
@anchor{library/urllib parse doc}@anchor{4019}@anchor{library/urllib parse module-urllib parse}@anchor{111}@anchor{library/urllib parse translation-repo}@anchor{401a}@anchor{library/urllib parse urllib-parse-parse-urls-into-components}@anchor{401b}
@subsection @code{urllib.parse} — Parse URLs into components


@geindex module; urllib.parse

`Source code:' Lib/urllib/parse.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/urllib/parse.py}

@geindex WWW
@geindex World Wide Web
@geindex URL
@geindex URL; parsing
@geindex relative; URL


__________________________________________________________________


This module defines a standard interface to break Uniform Resource Locator (URL)
strings up in components (addressing scheme, network location, path etc.), to
combine the components back into a URL string, and to convert a “relative URL”
to an absolute URL given a “base URL.”

The module has been designed to match the internet RFC on Relative Uniform
Resource Locators. It supports the following URL schemes: @code{file}, @code{ftp},
@code{gopher}, @code{hdl}, @code{http}, @code{https}, @code{imap}, @code{itms-services}, @code{mailto}, @code{mms},
@code{news}, @code{nntp}, @code{prospero}, @code{rsync}, @code{rtsp}, @code{rtsps}, @code{rtspu},
@code{sftp}, @code{shttp}, @code{sip}, @code{sips}, @code{snews}, @code{svn}, @code{svn+ssh},
@code{telnet}, @code{wais}, @code{ws}, @code{wss}.

`CPython implementation detail:' The inclusion of the @code{itms-services} URL scheme can prevent an app from
passing Apple’s App Store review process for the macOS and iOS App Stores.
Handling for the @code{itms-services} scheme is always removed on iOS; on
macOS, it `may' be removed if CPython has been built with the
@ref{19da,,--with-app-store-compliance} option.

The @code{urllib.parse} module defines functions that fall into two broad
categories: URL parsing and URL quoting. These are covered in detail in
the following sections.

This module’s functions use the deprecated term @code{netloc} (or @code{net_loc}),
which was introduced in 
@geindex RFC; RFC 1808
RFC 1808@footnote{https://datatracker.ietf.org/doc/html/rfc1808.html}. However, this term has been obsoleted by
@geindex RFC; RFC 3986
RFC 3986@footnote{https://datatracker.ietf.org/doc/html/rfc3986.html}, which introduced the term @code{authority} as its replacement.
The use of @code{netloc} is continued for backward compatibility.

@menu
* URL Parsing:: 
* URL parsing security:: 
* Parsing ASCII Encoded Bytes:: 
* Structured Parse Results:: 
* URL Quoting:: 

@end menu

@node URL Parsing,URL parsing security,,urllib parse — Parse URLs into components
@anchor{library/urllib parse url-parsing}@anchor{401c}
@subsubsection URL Parsing


The URL parsing functions focus on splitting a URL string into its components,
or on combining URL components into a URL string.

@geindex urlsplit() (in module urllib.parse)
@anchor{library/urllib parse urllib parse urlsplit}@anchor{f40}
@deffn {Function} urllib.parse.urlsplit (urlstring, scheme=None, allow_fragments=True)

Parse a URL into five components, returning a 5-item @ref{85f,,named tuple}
@ref{401d,,SplitResult} or @ref{401e,,SplitResultBytes}.
This corresponds to the general structure of a URL:
@code{scheme://netloc/path?query#fragment}.
Each tuple item is a string, possibly empty. The components are not broken up
into smaller parts (for example, the network location is a single string), and %
escapes are not expanded. The delimiters as shown above are not part of the
result, except for a leading slash in the `path' component, which is retained if
present.  For example:

@example
>>> from urllib.parse import urlsplit
>>> urlsplit("scheme://netloc/path?query#fragment")
SplitResult(scheme='scheme', netloc='netloc', path='/path',
            query='query', fragment='fragment')
>>> o = urlsplit("http://docs.python.org:80/3/library/urllib.parse.html?"
...              "highlight=params#url-parsing")
>>> o
SplitResult(scheme='http', netloc='docs.python.org:80',
            path='/3/library/urllib.parse.html',
            query='highlight=params', fragment='url-parsing')
>>> o.scheme
'http'
>>> o.netloc
'docs.python.org:80'
>>> o.hostname
'docs.python.org'
>>> o.port
80
>>> o._replace(fragment="").geturl()
'http://docs.python.org:80/3/library/urllib.parse.html?highlight=params'
@end example

Following the syntax specifications in 
@geindex RFC; RFC 1808
RFC 1808@footnote{https://datatracker.ietf.org/doc/html/rfc1808.html}, @code{urlsplit()} recognizes
a netloc only if it is properly introduced by ‘//’.  Otherwise the
input is presumed to be a relative URL and thus to start with
a path component.

@example
>>> from urllib.parse import urlsplit
>>> urlsplit('//www.cwi.nl:80/%7Eguido/Python.html')
SplitResult(scheme='@w{'}, netloc='www.cwi.nl:80', path='/%7Eguido/Python.html',
            query='@w{'}, fragment='@w{'})
>>> urlsplit('www.cwi.nl/%7Eguido/Python.html')
SplitResult(scheme='@w{'}, netloc='@w{'}, path='www.cwi.nl/%7Eguido/Python.html',
            query='@w{'}, fragment='@w{'})
>>> urlsplit('help/Python.html')
SplitResult(scheme='@w{'}, netloc='@w{'}, path='help/Python.html',
            query='@w{'}, fragment='@w{'})
@end example

The `scheme' argument gives the default addressing scheme, to be
used only if the URL does not specify one.  It should be the same type
(text or bytes) as `urlstring', except that the default value @code{'@w{'}} is
always allowed, and is automatically converted to @code{b'@w{'}} if appropriate.

If the `allow_fragments' argument is false, fragment identifiers are not
recognized.  Instead, they are parsed as part of the path, parameters
or query component, and @code{fragment} is set to the empty string in
the return value.

The return value is a @ref{85f,,named tuple}, which means that its items can
be accessed by index or as named attributes, which are:


@multitable {xxxxxxxxxxxxxxxxxxxx} {xxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Attribute

@tab

Index

@tab

Value

@tab

Value if not present

@item

@code{scheme}

@tab

0

@tab

URL scheme specifier

@tab

`scheme' parameter

@item

@code{netloc}

@tab

1

@tab

Network location part

@tab

empty string

@item

@code{path}

@tab

2

@tab

Hierarchical path

@tab

empty string

@item

@code{query}

@tab

3

@tab

Query component

@tab

empty string

@item

@code{fragment}

@tab

4

@tab

Fragment identifier

@tab

empty string

@item

@code{username}

@tab

@tab

User name

@tab

@ref{887,,None}

@item

@code{password}

@tab

@tab

Password

@tab

@ref{887,,None}

@item

@code{hostname}

@tab

@tab

Host name (lower case)

@tab

@ref{887,,None}

@item

@code{port}

@tab

@tab

Port number as integer,
if present

@tab

@ref{887,,None}

@end multitable


Reading the @code{port} attribute will raise a @ref{2ee,,ValueError} if
an invalid port is specified in the URL.  See section
@ref{401f,,Structured Parse Results} for more information on the result object.

Unmatched square brackets in the @code{netloc} attribute will raise a
@ref{2ee,,ValueError}.

Characters in the @code{netloc} attribute that decompose under NFKC
normalization (as used by the IDNA encoding) into any of @code{/}, @code{?},
@code{#}, @code{@@}, or @code{:} will raise a @ref{2ee,,ValueError}. If the URL is
decomposed before parsing, no error will be raised.

Following some of the WHATWG spec@footnote{https://url.spec.whatwg.org/#concept-basic-url-parser} that updates 
@geindex RFC; RFC 3986
RFC 3986@footnote{https://datatracker.ietf.org/doc/html/rfc3986.html}, leading C0
control and space characters are stripped from the URL. @code{\n},
@code{\r} and tab @code{\t} characters are removed from the URL at any position.

As is the case with all named tuples, the subclass has a few additional methods
and attributes that are particularly useful. One such method is @code{_replace()}.
The @code{_replace()} method will return a new @ref{401d,,SplitResult} object
replacing specified fields with new values.

@example
>>> from urllib.parse import urlsplit
>>> u = urlsplit('//www.cwi.nl:80/%7Eguido/Python.html')
>>> u
SplitResult(scheme='@w{'}, netloc='www.cwi.nl:80', path='/%7Eguido/Python.html',
            query='@w{'}, fragment='@w{'})
>>> u._replace(scheme='http')
SplitResult(scheme='http', netloc='www.cwi.nl:80', path='/%7Eguido/Python.html',
            query='@w{'}, fragment='@w{'})
@end example

@cartouche
@quotation Warning 
@code{urlsplit()} does not perform validation.  See @ref{4020,,URL parsing security} for details.
@end quotation
@end cartouche


Changed in version 3.2: Added IPv6 URL parsing capabilities.



Changed in version 3.3: The fragment is now parsed for all URL schemes (unless `allow_fragments' is
false), in accordance with 
@geindex RFC; RFC 3986
RFC 3986@footnote{https://datatracker.ietf.org/doc/html/rfc3986.html}.  Previously, an allowlist of
schemes that support fragments existed.



Changed in version 3.6: Out-of-range port numbers now raise @ref{2ee,,ValueError}, instead of
returning @ref{887,,None}.



Changed in version 3.8: Characters that affect netloc parsing under NFKC normalization will
now raise @ref{2ee,,ValueError}.



Changed in version 3.10: ASCII newline and tab characters are stripped from the URL.



Changed in version 3.12: Leading WHATWG C0 control and space characters are stripped from the URL.

@end deffn

@geindex parse_qs() (in module urllib.parse)
@anchor{library/urllib parse urllib parse parse_qs}@anchor{321}
@deffn {Function} urllib.parse.parse_qs (qs, keep_blank_values=False, strict_parsing=False, encoding='utf-8', errors='replace', max_num_fields=None, separator='&')

Parse a query string given as a string argument (data of type
@code{application/x-www-form-urlencoded}).  Data are returned as a
dictionary.  The dictionary keys are the unique query variable names and the
values are lists of values for each name.

The optional argument `keep_blank_values' is a flag indicating whether blank
values in percent-encoded queries should be treated as blank strings. A true value
indicates that blanks should be retained as  blank strings.  The default false
value indicates that blank values are to be ignored and treated as if they were
not included.

The optional argument `strict_parsing' is a flag indicating what to do with
parsing errors.  If false (the default), errors are silently ignored.  If true,
errors raise a @ref{2ee,,ValueError} exception.

The optional `encoding' and `errors' parameters specify how to decode
percent-encoded sequences into Unicode characters, as accepted by the
@ref{ad9,,bytes.decode()} method.

The optional argument `max_num_fields' is the maximum number of fields to
read. If set, then throws a @ref{2ee,,ValueError} if there are more than
`max_num_fields' fields read.

The optional argument `separator' is the symbol to use for separating the
query arguments. It defaults to @code{&}.

Use the @ref{109b,,urllib.parse.urlencode()} function (with the @code{doseq}
parameter set to @code{True}) to convert such dictionaries into query
strings.


Changed in version 3.2: Add `encoding' and `errors' parameters.



Changed in version 3.8: Added `max_num_fields' parameter.



Changed in version 3.10: Added `separator' parameter with the default value of @code{&}. Python
versions earlier than Python 3.10 allowed using both @code{;} and @code{&} as
query parameter separator. This has been changed to allow only a single
separator key, with @code{&} as the default separator.



Deprecated since version 3.14: Accepting objects with false values (like @code{0} and @code{[]}) except empty
strings and byte-like objects and @code{None} is now deprecated.

@end deffn

@geindex parse_qsl() (in module urllib.parse)
@anchor{library/urllib parse urllib parse parse_qsl}@anchor{320}
@deffn {Function} urllib.parse.parse_qsl (qs, keep_blank_values=False, strict_parsing=False, encoding='utf-8', errors='replace', max_num_fields=None, separator='&')

Parse a query string given as a string argument (data of type
@code{application/x-www-form-urlencoded}).  Data are returned as a list of
name, value pairs.

The optional argument `keep_blank_values' is a flag indicating whether blank
values in percent-encoded queries should be treated as blank strings. A true value
indicates that blanks should be retained as  blank strings.  The default false
value indicates that blank values are to be ignored and treated as if they were
not included.

The optional argument `strict_parsing' is a flag indicating what to do with
parsing errors.  If false (the default), errors are silently ignored.  If true,
errors raise a @ref{2ee,,ValueError} exception.

The optional `encoding' and `errors' parameters specify how to decode
percent-encoded sequences into Unicode characters, as accepted by the
@ref{ad9,,bytes.decode()} method.

The optional argument `max_num_fields' is the maximum number of fields to
read. If set, then throws a @ref{2ee,,ValueError} if there are more than
`max_num_fields' fields read.

The optional argument `separator' is the symbol to use for separating the
query arguments. It defaults to @code{&}.

Use the @ref{109b,,urllib.parse.urlencode()} function to convert such lists of pairs into
query strings.


Changed in version 3.2: Add `encoding' and `errors' parameters.



Changed in version 3.8: Added `max_num_fields' parameter.



Changed in version 3.10: Added `separator' parameter with the default value of @code{&}. Python
versions earlier than Python 3.10 allowed using both @code{;} and @code{&} as
query parameter separator. This has been changed to allow only a single
separator key, with @code{&} as the default separator.

@end deffn

@geindex urlunsplit() (in module urllib.parse)
@anchor{library/urllib parse urllib parse urlunsplit}@anchor{1982}
@deffn {Function} urllib.parse.urlunsplit (parts)

Construct a URL from a tuple as returned by @code{urlsplit()}. The `parts'
argument can be any five-item iterable. This may result in a slightly
different, but equivalent URL, if the URL that was parsed originally had
unnecessary delimiters (for example, a @code{?} with an empty query; the RFC
states that these are equivalent).
@end deffn

@geindex urlparse() (in module urllib.parse)
@anchor{library/urllib parse urllib parse urlparse}@anchor{360}
@deffn {Function} urllib.parse.urlparse (urlstring, scheme=None, allow_fragments=True)

This is similar to @ref{f40,,urlsplit()}, but additionally splits the `path'
component on `path' and `params'.
This function returns a 6-item @ref{85f,,named tuple} @ref{4021,,ParseResult}
or @ref{4022,,ParseResultBytes}.
Its items are the same as for the @code{urlsplit()} result, except that
`params' is inserted at index 3, between `path' and `query'.

This function is based on obsoleted 
@geindex RFC; RFC 1738
RFC 1738@footnote{https://datatracker.ietf.org/doc/html/rfc1738.html} and 
@geindex RFC; RFC 1808
RFC 1808@footnote{https://datatracker.ietf.org/doc/html/rfc1808.html}, which
listed `params' as the main URL component.
The more recent URL syntax allows parameters to be applied to each segment
of the `path' portion of the URL (see 
@geindex RFC; RFC 3986
RFC 3986@footnote{https://datatracker.ietf.org/doc/html/rfc3986.html}).
@ref{f40,,urlsplit()} should generally be used instead of @code{urlparse()}.
A separate function is needed to separate the path segments and parameters.
@end deffn

@geindex urlunparse() (in module urllib.parse)
@anchor{library/urllib parse urllib parse urlunparse}@anchor{1983}
@deffn {Function} urllib.parse.urlunparse (parts)

Combine the elements of a tuple as returned by @ref{360,,urlparse()} into a
complete URL as a string. The `parts' argument can be any six-item
iterable. This may result in a slightly different, but equivalent URL, if the
URL that was parsed originally had unnecessary delimiters (for example, a ?
with an empty query; the RFC states that these are equivalent).
@end deffn

@geindex urljoin() (in module urllib.parse)
@anchor{library/urllib parse urllib parse urljoin}@anchor{109c}
@deffn {Function} urllib.parse.urljoin (base, url, allow_fragments=True)

Construct a full (“absolute”) URL by combining a “base URL” (`base') with
another URL (`url').  Informally, this uses components of the base URL, in
particular the addressing scheme, the network location and (part of) the
path, to provide missing components in the relative URL.  For example:

@example
>>> from urllib.parse import urljoin
>>> urljoin('http://www.cwi.nl/%7Eguido/Python.html', 'FAQ.html')
'http://www.cwi.nl/%7Eguido/FAQ.html'
@end example

The `allow_fragments' argument has the same meaning and default as for
@ref{f40,,urlsplit()}.

@cartouche
@quotation Note 
If `url' is an absolute URL (that is, it starts with @code{//} or @code{scheme://}),
the `url'’s hostname and/or scheme will be present in the result.  For example:

@example
>>> urljoin('http://www.cwi.nl/%7Eguido/Python.html',
...         '//www.python.org/%7Eguido')
'http://www.python.org/%7Eguido'
@end example

If you do not want that behavior, preprocess the `url' with @ref{f40,,urlsplit()} and
@ref{1982,,urlunsplit()}, removing possible `scheme' and `netloc' parts.
@end quotation
@end cartouche

@cartouche
@quotation Warning 
Because an absolute URL may be passed as the @code{url} parameter, it is
generally `not secure' to use @code{urljoin} with an attacker-controlled
@code{url}. For example in,
@code{urljoin("https://website.com/users/", username)}, if @code{username} can
contain an absolute URL, the result of @code{urljoin} will be the absolute
URL.
@end quotation
@end cartouche


Changed in version 3.5: Behavior updated to match the semantics defined in 
@geindex RFC; RFC 3986
RFC 3986@footnote{https://datatracker.ietf.org/doc/html/rfc3986.html}.

@end deffn

@geindex urldefrag() (in module urllib.parse)
@anchor{library/urllib parse urllib parse urldefrag}@anchor{1453}
@deffn {Function} urllib.parse.urldefrag (url)

If `url' contains a fragment identifier, return a modified version of `url'
with no fragment identifier, and the fragment identifier as a separate
string.  If there is no fragment identifier in `url', return `url' unmodified
and an empty string.

The return value is a @ref{85f,,named tuple}, its items can be accessed by index
or as named attributes:


@multitable {xxxxxxxxxxxxxxxxxxxx} {xxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Attribute

@tab

Index

@tab

Value

@tab

Value if not present

@item

@code{url}

@tab

0

@tab

URL with no fragment

@tab

empty string

@item

@code{fragment}

@tab

1

@tab

Fragment identifier

@tab

empty string

@end multitable


See section @ref{401f,,Structured Parse Results} for more information on the result
object.


Changed in version 3.2: Result is a structured object rather than a simple 2-tuple.

@end deffn

@geindex unwrap() (in module urllib.parse)
@anchor{library/urllib parse urllib parse unwrap}@anchor{4023}
@deffn {Function} urllib.parse.unwrap (url)

Extract the url from a wrapped URL (that is, a string formatted as
@code{<URL:scheme://host/path>}, @code{<scheme://host/path>}, @code{URL:scheme://host/path}
or @code{scheme://host/path}). If `url' is not a wrapped URL, it is returned
without changes.
@end deffn

@node URL parsing security,Parsing ASCII Encoded Bytes,URL Parsing,urllib parse — Parse URLs into components
@anchor{library/urllib parse id1}@anchor{4024}@anchor{library/urllib parse url-parsing-security}@anchor{4020}
@subsubsection URL parsing security


The @ref{f40,,urlsplit()} and @ref{360,,urlparse()} APIs do not perform `validation' of
inputs.  They may not raise errors on inputs that other applications consider
invalid.  They may also succeed on some inputs that might not be considered
URLs elsewhere.  Their purpose is for practical functionality rather than
purity.

Instead of raising an exception on unusual input, they may instead return some
component parts as empty strings. Or components may contain more than perhaps
they should.

We recommend that users of these APIs where the values may be used anywhere
with security implications code defensively. Do some verification within your
code before trusting a returned component part.  Does that @code{scheme} make
sense?  Is that a sensible @code{path}?  Is there anything strange about that
@code{hostname}?  etc.

What constitutes a URL is not universally well defined.  Different applications
have different needs and desired constraints.  For instance the living WHATWG spec@footnote{https://url.spec.whatwg.org/#concept-basic-url-parser} describes what user facing web clients such as a web browser require.
While 
@geindex RFC; RFC 3986
RFC 3986@footnote{https://datatracker.ietf.org/doc/html/rfc3986.html} is more general.  These functions incorporate some aspects of
both, but cannot be claimed compliant with either.  The APIs and existing user
code with expectations on specific behaviors predate both standards leading us
to be very cautious about making API behavior changes.

@node Parsing ASCII Encoded Bytes,Structured Parse Results,URL parsing security,urllib parse — Parse URLs into components
@anchor{library/urllib parse id2}@anchor{4025}@anchor{library/urllib parse parsing-ascii-encoded-bytes}@anchor{1455}
@subsubsection Parsing ASCII Encoded Bytes


The URL parsing functions were originally designed to operate on character
strings only. In practice, it is useful to be able to manipulate properly
quoted and encoded URLs as sequences of ASCII bytes. Accordingly, the
URL parsing functions in this module all operate on @ref{193,,bytes} and
@ref{342,,bytearray} objects in addition to @ref{16a,,str} objects.

If @ref{16a,,str} data is passed in, the result will also contain only
@code{str} data. If @ref{193,,bytes} or @ref{342,,bytearray} data is
passed in, the result will contain only @code{bytes} data.

Attempting to mix @ref{16a,,str} data with @ref{193,,bytes} or
@ref{342,,bytearray} in a single function call will result in a
@ref{199,,TypeError} being raised, while attempting to pass in non-ASCII
byte values will trigger @ref{c0e,,UnicodeDecodeError}.

To support easier conversion of result objects between @ref{16a,,str} and
@ref{193,,bytes}, all return values from URL parsing functions provide
either an @code{encode()} method (when the result contains @code{str}
data) or a @code{decode()} method (when the result contains @code{bytes}
data). The signatures of these methods match those of the corresponding
@code{str} and @code{bytes} methods (except that the default encoding
is @code{'ascii'} rather than @code{'utf-8'}). Each produces a value of a
corresponding type that contains either @code{bytes} data (for
@code{encode()} methods) or @code{str} data (for
@code{decode()} methods).

Applications that need to operate on potentially improperly quoted URLs
that may contain non-ASCII data will need to do their own decoding from
bytes to characters before invoking the URL parsing methods.

The behaviour described in this section applies only to the URL parsing
functions. The URL quoting functions use their own rules when producing
or consuming byte sequences as detailed in the documentation of the
individual URL quoting functions.


Changed in version 3.2: URL parsing functions now accept ASCII encoded byte sequences


@node Structured Parse Results,URL Quoting,Parsing ASCII Encoded Bytes,urllib parse — Parse URLs into components
@anchor{library/urllib parse structured-parse-results}@anchor{4026}@anchor{library/urllib parse urlparse-result-object}@anchor{401f}
@subsubsection Structured Parse Results


The result objects from the @ref{f40,,urlsplit()}, @ref{360,,urlparse()}  and
@ref{1453,,urldefrag()} functions are subclasses of the @ref{614,,tuple} type.
These subclasses add the attributes listed in the documentation for
those functions, the encoding and decoding support described in the
previous section, as well as an additional method:

@geindex geturl() (urllib.parse.urllib.parse.SplitResult method)
@anchor{library/urllib parse urllib parse urllib parse SplitResult geturl}@anchor{4027}
@deffn {Method} urllib.parse.SplitResult.geturl ()

Return the re-combined version of the original URL as a string. This may
differ from the original URL in that the scheme may be normalized to lower
case and empty components may be dropped. Specifically, empty parameters,
queries, and fragment identifiers will be removed.

For @ref{1453,,urldefrag()} results, only empty fragment identifiers will be removed.
For @ref{f40,,urlsplit()} and @ref{360,,urlparse()} results, all noted changes will be
made to the URL returned by this method.

The result of this method remains unchanged if passed back through the original
parsing function:

@example
>>> from urllib.parse import urlsplit
>>> url = 'HTTP://www.Python.org/doc/#'
>>> r1 = urlsplit(url)
>>> r1.geturl()
'http://www.Python.org/doc/'
>>> r2 = urlsplit(r1.geturl())
>>> r2.geturl()
'http://www.Python.org/doc/'
@end example
@end deffn

The following classes provide the implementations of the structured parse
results when operating on @ref{16a,,str} objects:

@geindex DefragResult (class in urllib.parse)
@anchor{library/urllib parse urllib parse DefragResult}@anchor{4028}
@deffn {Class} urllib.parse.DefragResult (url, fragment)

Concrete class for @ref{1453,,urldefrag()} results containing @ref{16a,,str}
data. The @code{encode()} method returns a @ref{4029,,DefragResultBytes}
instance.


Added in version 3.2.

@end deffn

@geindex ParseResult (class in urllib.parse)
@anchor{library/urllib parse urllib parse ParseResult}@anchor{4021}
@deffn {Class} urllib.parse.ParseResult (scheme, netloc, path, params, query, fragment)

Concrete class for @ref{360,,urlparse()} results containing @ref{16a,,str}
data. The @code{encode()} method returns a @ref{4022,,ParseResultBytes}
instance.
@end deffn

@geindex SplitResult (class in urllib.parse)
@anchor{library/urllib parse urllib parse SplitResult}@anchor{401d}
@deffn {Class} urllib.parse.SplitResult (scheme, netloc, path, query, fragment)

Concrete class for @ref{f40,,urlsplit()} results containing @ref{16a,,str}
data. The @code{encode()} method returns a @ref{401e,,SplitResultBytes}
instance.
@end deffn

The following classes provide the implementations of the parse results when
operating on @ref{193,,bytes} or @ref{342,,bytearray} objects:

@geindex DefragResultBytes (class in urllib.parse)
@anchor{library/urllib parse urllib parse DefragResultBytes}@anchor{4029}
@deffn {Class} urllib.parse.DefragResultBytes (url, fragment)

Concrete class for @ref{1453,,urldefrag()} results containing @ref{193,,bytes}
data. The @code{decode()} method returns a @ref{4028,,DefragResult}
instance.


Added in version 3.2.

@end deffn

@geindex ParseResultBytes (class in urllib.parse)
@anchor{library/urllib parse urllib parse ParseResultBytes}@anchor{4022}
@deffn {Class} urllib.parse.ParseResultBytes (scheme, netloc, path, params, query, fragment)

Concrete class for @ref{360,,urlparse()} results containing @ref{193,,bytes}
data. The @code{decode()} method returns a @ref{4021,,ParseResult}
instance.


Added in version 3.2.

@end deffn

@geindex SplitResultBytes (class in urllib.parse)
@anchor{library/urllib parse urllib parse SplitResultBytes}@anchor{401e}
@deffn {Class} urllib.parse.SplitResultBytes (scheme, netloc, path, query, fragment)

Concrete class for @ref{f40,,urlsplit()} results containing @ref{193,,bytes}
data. The @code{decode()} method returns a @ref{401d,,SplitResult}
instance.


Added in version 3.2.

@end deffn

@node URL Quoting,,Structured Parse Results,urllib parse — Parse URLs into components
@anchor{library/urllib parse url-quoting}@anchor{402a}
@subsubsection URL Quoting


The URL quoting functions focus on taking program data and making it safe
for use as URL components by quoting special characters and appropriately
encoding non-ASCII text. They also support reversing these operations to
recreate the original data from the contents of a URL component if that
task isn’t already covered by the URL parsing functions above.

@geindex quote() (in module urllib.parse)
@anchor{library/urllib parse urllib parse quote}@anchor{da2}
@deffn {Function} urllib.parse.quote (string, safe='/', encoding=None, errors=None)

Replace special characters in `string' using the @code{%@var{xx}} escape. Letters,
digits, and the characters @code{'_.-~'} are never quoted. By default, this
function is intended for quoting the path section of a URL. The optional
`safe' parameter specifies additional ASCII characters that should not be
quoted — its default value is @code{'/'}.

`string' may be either a @ref{16a,,str} or a @ref{193,,bytes} object.


Changed in version 3.7: Moved from 
@geindex RFC; RFC 2396
RFC 2396@footnote{https://datatracker.ietf.org/doc/html/rfc2396.html} to 
@geindex RFC; RFC 3986
RFC 3986@footnote{https://datatracker.ietf.org/doc/html/rfc3986.html} for quoting URL strings. “~” is now
included in the set of unreserved characters.


The optional `encoding' and `errors' parameters specify how to deal with
non-ASCII characters, as accepted by the @ref{ad8,,str.encode()} method.
`encoding' defaults to @code{'utf-8'}.
`errors' defaults to @code{'strict'}, meaning unsupported characters raise a
@ref{889,,UnicodeEncodeError}.
`encoding' and `errors' must not be supplied if `string' is a
@ref{193,,bytes}, or a @ref{199,,TypeError} is raised.

Note that @code{quote(string, safe, encoding, errors)} is equivalent to
@code{quote_from_bytes(string.encode(encoding, errors), safe)}.

Example: @code{quote('/El Niño/')} yields @code{'/El%20Ni%C3%B1o/'}.
@end deffn

@geindex quote_plus() (in module urllib.parse)
@anchor{library/urllib parse urllib parse quote_plus}@anchor{1454}
@deffn {Function} urllib.parse.quote_plus (string, safe='@w{'}, encoding=None, errors=None)

Like @ref{da2,,quote()}, but also replace spaces with plus signs, as required for
quoting HTML form values when building up a query string to go into a URL.
Plus signs in the original string are escaped unless they are included in
`safe'.  It also does not have `safe' default to @code{'/'}.

Example: @code{quote_plus('/El Niño/')} yields @code{'%2FEl+Ni%C3%B1o%2F'}.
@end deffn

@geindex quote_from_bytes() (in module urllib.parse)
@anchor{library/urllib parse urllib parse quote_from_bytes}@anchor{1b95}
@deffn {Function} urllib.parse.quote_from_bytes (bytes, safe='/')

Like @ref{da2,,quote()}, but accepts a @ref{193,,bytes} object rather than a
@ref{16a,,str}, and does not perform string-to-bytes encoding.

Example: @code{quote_from_bytes(b'a&\xef')} yields
@code{'a%26%EF'}.
@end deffn

@geindex unquote() (in module urllib.parse)
@anchor{library/urllib parse urllib parse unquote}@anchor{1b3f}
@deffn {Function} urllib.parse.unquote (string, encoding='utf-8', errors='replace')

Replace @code{%@var{xx}} escapes with their single-character equivalent.
The optional `encoding' and `errors' parameters specify how to decode
percent-encoded sequences into Unicode characters, as accepted by the
@ref{ad9,,bytes.decode()} method.

`string' may be either a @ref{16a,,str} or a @ref{193,,bytes} object.

`encoding' defaults to @code{'utf-8'}.
`errors' defaults to @code{'replace'}, meaning invalid sequences are replaced
by a placeholder character.

Example: @code{unquote('/El%20Ni%C3%B1o/')} yields @code{'/El Niño/'}.


Changed in version 3.9: `string' parameter supports bytes and str objects (previously only str).

@end deffn

@geindex unquote_plus() (in module urllib.parse)
@anchor{library/urllib parse urllib parse unquote_plus}@anchor{402b}
@deffn {Function} urllib.parse.unquote_plus (string, encoding='utf-8', errors='replace')

Like @ref{1b3f,,unquote()}, but also replace plus signs with spaces, as required
for unquoting HTML form values.

`string' must be a @ref{16a,,str}.

Example: @code{unquote_plus('/El+Ni%C3%B1o/')} yields @code{'/El Niño/'}.
@end deffn

@geindex unquote_to_bytes() (in module urllib.parse)
@anchor{library/urllib parse urllib parse unquote_to_bytes}@anchor{1b40}
@deffn {Function} urllib.parse.unquote_to_bytes (string)

Replace @code{%@var{xx}} escapes with their single-octet equivalent, and return a
@ref{193,,bytes} object.

`string' may be either a @ref{16a,,str} or a @ref{193,,bytes} object.

If it is a @ref{16a,,str}, unescaped non-ASCII characters in `string'
are encoded into UTF-8 bytes.

Example: @code{unquote_to_bytes('a%26%EF')} yields @code{b'a&\xef'}.
@end deffn

@geindex urlencode() (in module urllib.parse)
@anchor{library/urllib parse urllib parse urlencode}@anchor{109b}
@deffn {Function} urllib.parse.urlencode (query, doseq=False, safe='@w{'}, encoding=None, errors=None, quote_via=quote_plus)

Convert a mapping object or a sequence of two-element tuples, which may
contain @ref{16a,,str} or @ref{193,,bytes} objects, to a percent-encoded ASCII
text string.  If the resultant string is to be used as a `data' for POST
operation with the @ref{309,,urlopen()} function, then
it should be encoded to bytes, otherwise it would result in a
@ref{199,,TypeError}.

The resulting string is a series of @code{key=value} pairs separated by @code{'&'}
characters, where both `key' and `value' are quoted using the `quote_via'
function.  By default, @ref{1454,,quote_plus()} is used to quote the values, which
means spaces are quoted as a @code{'+'} character and ‘/’ characters are
encoded as @code{%2F}, which follows the standard for GET requests
(@code{application/x-www-form-urlencoded}).  An alternate function that can be
passed as `quote_via' is @ref{da2,,quote()}, which will encode spaces as @code{%20}
and not encode ‘/’ characters.  For maximum control of what is quoted, use
@code{quote} and specify a value for `safe'.

When a sequence of two-element tuples is used as the `query'
argument, the first element of each tuple is a key and the second is a
value. The value element in itself can be a sequence and in that case, if
the optional parameter `doseq' evaluates to @code{True}, individual
@code{key=value} pairs separated by @code{'&'} are generated for each element of
the value sequence for the key.  The order of parameters in the encoded
string will match the order of parameter tuples in the sequence.

The `safe', `encoding', and `errors' parameters are passed down to
`quote_via' (the `encoding' and `errors' parameters are only passed
when a query element is a @ref{16a,,str}).

To reverse this encoding process, @ref{321,,parse_qs()} and @ref{320,,parse_qsl()} are
provided in this module to parse query strings into Python data structures.

Refer to @ref{400e,,urllib examples} to find out how the
@code{urllib.parse.urlencode()} method can be used for generating the query
string of a URL or data for a POST request.


Changed in version 3.2: `query' supports bytes and string objects.



Changed in version 3.5: Added the `quote_via' parameter.



Deprecated since version 3.14: Accepting objects with false values (like @code{0} and @code{[]}) except empty
strings and byte-like objects and @code{None} is now deprecated.

@end deffn


@subsubheading See also



@table @asis

@item WHATWG@footnote{https://url.spec.whatwg.org/} -  URL Living standard

Working Group for the URL Standard that defines URLs, domains, IP addresses, the
application/x-www-form-urlencoded format, and their API.

@geindex RFC; RFC 3986

@item RFC 3986@footnote{https://datatracker.ietf.org/doc/html/rfc3986.html} - Uniform Resource Identifiers

This is the current standard (STD66). Any changes to urllib.parse module
should conform to this. Certain deviations could be observed, which are
mostly for backward compatibility purposes and for certain de-facto
parsing requirements as commonly observed in major browsers.

@geindex RFC; RFC 2732

@item RFC 2732@footnote{https://datatracker.ietf.org/doc/html/rfc2732.html} - Format for Literal IPv6 Addresses in URL’s.

This specifies the parsing requirements of IPv6 URLs.

@geindex RFC; RFC 2396

@item RFC 2396@footnote{https://datatracker.ietf.org/doc/html/rfc2396.html} - Uniform Resource Identifiers (URI): Generic Syntax

Document describing the generic syntactic requirements for both Uniform Resource
Names (URNs) and Uniform Resource Locators (URLs).

@geindex RFC; RFC 2368

@item RFC 2368@footnote{https://datatracker.ietf.org/doc/html/rfc2368.html} - The mailto URL scheme.

Parsing requirements for mailto URL schemes.

@geindex RFC; RFC 1808

@item RFC 1808@footnote{https://datatracker.ietf.org/doc/html/rfc1808.html} - Relative Uniform Resource Locators

This Request For Comments includes the rules for joining an absolute and a
relative URL, including a fair number of “Abnormal Examples” which govern the
treatment of border cases.

@geindex RFC; RFC 1738

@item RFC 1738@footnote{https://datatracker.ietf.org/doc/html/rfc1738.html} - Uniform Resource Locators (URL)

This specifies the formal syntax and semantics of absolute URLs.
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node urllib error — Exception classes raised by urllib request,urllib robotparser — Parser for robots txt,urllib parse — Parse URLs into components,Internet Protocols and Support
@anchor{library/urllib error doc}@anchor{402c}@anchor{library/urllib error module-urllib error}@anchor{110}@anchor{library/urllib error translation-repo}@anchor{402d}@anchor{library/urllib error urllib-error-exception-classes-raised-by-urllib-request}@anchor{402e}
@subsection @code{urllib.error} — Exception classes raised by urllib.request


@geindex module; urllib.error

`Source code:' Lib/urllib/error.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/urllib/error.py}


__________________________________________________________________


The @code{urllib.error} module defines the exception classes for exceptions
raised by @ref{112,,urllib.request}.  The base exception class is @ref{2c0,,URLError}.

The following exceptions are raised by @code{urllib.error} as appropriate:

@geindex URLError
@anchor{library/urllib error urllib error URLError}@anchor{2c0}
@deffn {Exception} urllib.error.URLError

The handlers raise this exception (or derived exceptions) when they run into
a problem.  It is a subclass of @ref{2c2,,OSError}.

@geindex reason (urllib.error.URLError attribute)
@anchor{library/urllib error urllib error URLError reason}@anchor{402f}
@deffn {Attribute} reason

The reason for this error.  It can be a message string or another
exception instance.
@end deffn


Changed in version 3.3: @code{URLError} used to be a subtype of @ref{1259,,IOError}, which is now an
alias of @ref{2c2,,OSError}.

@end deffn

@geindex HTTPError
@anchor{library/urllib error urllib error HTTPError}@anchor{11e4}
@deffn {Exception} urllib.error.HTTPError (url, code, msg, hdrs, fp)

Though being an exception (a subclass of @ref{2c0,,URLError}), an
@code{HTTPError} can also function as a non-exceptional file-like return
value (the same thing that @ref{309,,urlopen()} returns).  This
is useful when handling exotic HTTP errors, such as requests for
authentication.

@geindex url (urllib.error.HTTPError attribute)
@anchor{library/urllib error urllib error HTTPError url}@anchor{4030}
@deffn {Attribute} url

Contains the request URL.
An alias for `filename' attribute.
@end deffn

@geindex code (urllib.error.HTTPError attribute)
@anchor{library/urllib error urllib error HTTPError code}@anchor{4031}
@deffn {Attribute} code

An HTTP status code as defined in 
@geindex RFC; RFC 2616
RFC 2616@footnote{https://datatracker.ietf.org/doc/html/rfc2616.html}.  This numeric value corresponds
to a value found in the dictionary of codes as found in
@ref{4032,,http.server.BaseHTTPRequestHandler.responses}.
@end deffn

@geindex reason (urllib.error.HTTPError attribute)
@anchor{library/urllib error urllib error HTTPError reason}@anchor{4033}
@deffn {Attribute} reason

This is usually a string explaining the reason for this error.
An alias for `msg' attribute.
@end deffn

@geindex headers (urllib.error.HTTPError attribute)
@anchor{library/urllib error urllib error HTTPError headers}@anchor{11e5}
@deffn {Attribute} headers

The HTTP response headers for the HTTP request that caused the
@code{HTTPError}.
An alias for `hdrs' attribute.


Added in version 3.4.

@end deffn

@geindex fp (urllib.error.HTTPError attribute)
@anchor{library/urllib error urllib error HTTPError fp}@anchor{4034}
@deffn {Attribute} fp

A file-like object where the HTTP error body can be read from.
@end deffn
@end deffn

@geindex ContentTooShortError
@anchor{library/urllib error urllib error ContentTooShortError}@anchor{4010}
@deffn {Exception} urllib.error.ContentTooShortError (msg, content)

This exception is raised when the @ref{30a,,urlretrieve()}
function detects that
the amount of the downloaded data is less than the expected amount (given by
the `Content-Length' header).

@geindex content (urllib.error.ContentTooShortError attribute)
@anchor{library/urllib error urllib error ContentTooShortError content}@anchor{4035}
@deffn {Attribute} content

The downloaded (and supposedly truncated) data.
@end deffn
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node urllib robotparser — Parser for robots txt,http — HTTP modules,urllib error — Exception classes raised by urllib request,Internet Protocols and Support
@anchor{library/urllib robotparser doc}@anchor{4036}@anchor{library/urllib robotparser module-urllib robotparser}@anchor{114}@anchor{library/urllib robotparser translation-repo}@anchor{4037}@anchor{library/urllib robotparser urllib-robotparser-parser-for-robots-txt}@anchor{4038}
@subsection @code{urllib.robotparser} —  Parser for robots.txt


@geindex module; urllib.robotparser

`Source code:' Lib/urllib/robotparser.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/urllib/robotparser.py}

@geindex WWW
@geindex World Wide Web
@geindex URL
@geindex robots.txt


__________________________________________________________________


This module provides a single class, @ref{f00,,RobotFileParser}, which answers
questions about whether or not a particular user agent can fetch a URL on the
website that published the @code{robots.txt} file.  For more details on the
structure of @code{robots.txt} files, see 
@geindex RFC; RFC 9309
RFC 9309@footnote{https://datatracker.ietf.org/doc/html/rfc9309.html}.

@geindex RobotFileParser (class in urllib.robotparser)
@anchor{library/urllib robotparser urllib robotparser RobotFileParser}@anchor{f00}
@deffn {Class} urllib.robotparser.RobotFileParser (url='@w{'})

This class provides methods to read, parse and answer questions about the
@code{robots.txt} file at `url'.

@geindex set_url() (urllib.robotparser.RobotFileParser method)
@anchor{library/urllib robotparser urllib robotparser RobotFileParser set_url}@anchor{4039}
@deffn {Method} set_url (url)

Sets the URL referring to a @code{robots.txt} file.
@end deffn

@geindex read() (urllib.robotparser.RobotFileParser method)
@anchor{library/urllib robotparser urllib robotparser RobotFileParser read}@anchor{1917}
@deffn {Method} read ()

Reads the @code{robots.txt} URL and feeds it to the parser.
@end deffn

@geindex parse() (urllib.robotparser.RobotFileParser method)
@anchor{library/urllib robotparser urllib robotparser RobotFileParser parse}@anchor{1ec5}
@deffn {Method} parse (lines)

Parses the lines argument.
@end deffn

@geindex can_fetch() (urllib.robotparser.RobotFileParser method)
@anchor{library/urllib robotparser urllib robotparser RobotFileParser can_fetch}@anchor{403a}
@deffn {Method} can_fetch (useragent, url)

Returns @code{True} if the `useragent' is allowed to fetch the `url'
according to the rules contained in the parsed @code{robots.txt}
file.
@end deffn

@geindex mtime() (urllib.robotparser.RobotFileParser method)
@anchor{library/urllib robotparser urllib robotparser RobotFileParser mtime}@anchor{403b}
@deffn {Method} mtime ()

Returns the time the @code{robots.txt} file was last fetched.  This is
useful for long-running web spiders that need to check for new
@code{robots.txt} files periodically.
@end deffn

@geindex modified() (urllib.robotparser.RobotFileParser method)
@anchor{library/urllib robotparser urllib robotparser RobotFileParser modified}@anchor{403c}
@deffn {Method} modified ()

Sets the time the @code{robots.txt} file was last fetched to the current
time.
@end deffn

@geindex crawl_delay() (urllib.robotparser.RobotFileParser method)
@anchor{library/urllib robotparser urllib robotparser RobotFileParser crawl_delay}@anchor{403d}
@deffn {Method} crawl_delay (useragent)

Returns the value of the @code{Crawl-delay} parameter from @code{robots.txt}
for the `useragent' in question.  If there is no such parameter or it
doesn’t apply to the `useragent' specified or the @code{robots.txt} entry
for this parameter has invalid syntax, return @code{None}.


Added in version 3.6.

@end deffn

@geindex request_rate() (urllib.robotparser.RobotFileParser method)
@anchor{library/urllib robotparser urllib robotparser RobotFileParser request_rate}@anchor{403e}
@deffn {Method} request_rate (useragent)

Returns the contents of the @code{Request-rate} parameter from
@code{robots.txt} as a @ref{85f,,named tuple} @code{RequestRate(requests, seconds)}.
If there is no such parameter or it doesn’t apply to the `useragent'
specified or the @code{robots.txt} entry for this parameter has invalid
syntax, return @code{None}.


Added in version 3.6.

@end deffn

@geindex site_maps() (urllib.robotparser.RobotFileParser method)
@anchor{library/urllib robotparser urllib robotparser RobotFileParser site_maps}@anchor{1e64}
@deffn {Method} site_maps ()

Returns the contents of the @code{Sitemap} parameter from
@code{robots.txt} in the form of a @ref{24f,,list()}. If there is no such
parameter or the @code{robots.txt} entry for this parameter has
invalid syntax, return @code{None}.


Added in version 3.8.

@end deffn
@end deffn

The following example demonstrates basic use of the @ref{f00,,RobotFileParser}
class:

@example
>>> import urllib.robotparser
>>> rp = urllib.robotparser.RobotFileParser()
>>> rp.set_url("http://www.pythontest.net/robots.txt")
>>> rp.read()
>>> rrate = rp.request_rate("*")
>>> rrate.requests
1
>>> rrate.seconds
1
>>> rp.crawl_delay("*")
6
>>> rp.can_fetch("*", "http://www.pythontest.net/")
True
>>> rp.can_fetch("*", "http://www.pythontest.net/no-robots-here/")
False
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node http — HTTP modules,http client — HTTP protocol client,urllib robotparser — Parser for robots txt,Internet Protocols and Support
@anchor{library/http doc}@anchor{403f}@anchor{library/http http-http-modules}@anchor{4040}@anchor{library/http module-http}@anchor{72}@anchor{library/http translation-repo}@anchor{4041}
@subsection @code{http} — HTTP modules


@geindex module; http

`Source code:' Lib/http/__init__.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/http/__init__.py}

@geindex HTTP; protocol
@geindex HTTP; http (standard module)


__________________________________________________________________


@code{http} is a package that collects several modules for working with the
HyperText Transfer Protocol:


@itemize *

@item 
@ref{73,,http.client} is a low-level HTTP protocol client; for high-level URL
opening use @ref{112,,urllib.request}

@item 
@ref{76,,http.server} contains basic HTTP server classes based on @ref{d2,,socketserver}

@item 
@ref{75,,http.cookies} has utilities for implementing state management with cookies

@item 
@ref{74,,http.cookiejar} provides persistence of cookies
@end itemize

The @code{http} module also defines the following enums that help you work with http related code:

@geindex HTTPStatus (class in http)
@anchor{library/http http HTTPStatus}@anchor{b02}
@deffn {Class} http.HTTPStatus


Added in version 3.5.


A subclass of @ref{ee1,,enum.IntEnum} that defines a set of HTTP status codes,
reason phrases and long descriptions written in English.

Usage:

@example
>>> from http import HTTPStatus
>>> HTTPStatus.OK
HTTPStatus.OK
>>> HTTPStatus.OK == 200
True
>>> HTTPStatus.OK.value
200
>>> HTTPStatus.OK.phrase
'OK'
>>> HTTPStatus.OK.description
'Request fulfilled, document follows'
>>> list(HTTPStatus)
[HTTPStatus.CONTINUE, HTTPStatus.SWITCHING_PROTOCOLS, ...]
@end example
@end deffn

@menu
* HTTP status codes:: 
* HTTP status category:: 
* HTTP methods:: 

@end menu

@node HTTP status codes,HTTP status category,,http — HTTP modules
@anchor{library/http http-status-codes}@anchor{4042}@anchor{library/http id1}@anchor{4043}
@subsubsection HTTP status codes


Supported,
IANA-registered status codes@footnote{https://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml}
available in @ref{b02,,http.HTTPStatus} are:


@multitable {xxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Code

@tab

Enum Name

@tab

Details

@item

@code{100}

@tab

@code{CONTINUE}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, Section 15.2.1

@item

@code{101}

@tab

@code{SWITCHING_PROTOCOLS}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, Section 15.2.2

@item

@code{102}

@tab

@code{PROCESSING}

@tab

WebDAV 
@geindex RFC; RFC 2518
RFC 2518@footnote{https://datatracker.ietf.org/doc/html/rfc2518.html}, Section 10.1

@item

@code{103}

@tab

@code{EARLY_HINTS}

@tab

An HTTP Status Code for Indicating Hints 
@geindex RFC; RFC 8297
RFC 8297@footnote{https://datatracker.ietf.org/doc/html/rfc8297.html}

@item

@code{200}

@tab

@code{OK}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, Section 15.3.1

@item

@code{201}

@tab

@code{CREATED}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, Section 15.3.2

@item

@code{202}

@tab

@code{ACCEPTED}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, Section 15.3.3

@item

@code{203}

@tab

@code{NON_AUTHORITATIVE_INFORMATION}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, Section 15.3.4

@item

@code{204}

@tab

@code{NO_CONTENT}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, Section 15.3.5

@item

@code{205}

@tab

@code{RESET_CONTENT}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, Section 15.3.6

@item

@code{206}

@tab

@code{PARTIAL_CONTENT}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, Section 15.3.7

@item

@code{207}

@tab

@code{MULTI_STATUS}

@tab

WebDAV 
@geindex RFC; RFC 4918
RFC 4918@footnote{https://datatracker.ietf.org/doc/html/rfc4918.html}, Section 11.1

@item

@code{208}

@tab

@code{ALREADY_REPORTED}

@tab

WebDAV Binding Extensions 
@geindex RFC; RFC 5842
RFC 5842@footnote{https://datatracker.ietf.org/doc/html/rfc5842.html}, Section 7.1 (Experimental)

@item

@code{226}

@tab

@code{IM_USED}

@tab

Delta Encoding in HTTP 
@geindex RFC; RFC 3229
RFC 3229@footnote{https://datatracker.ietf.org/doc/html/rfc3229.html}, Section 10.4.1

@item

@code{300}

@tab

@code{MULTIPLE_CHOICES}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, Section 15.4.1

@item

@code{301}

@tab

@code{MOVED_PERMANENTLY}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, Section 15.4.2

@item

@code{302}

@tab

@code{FOUND}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, Section 15.4.3

@item

@code{303}

@tab

@code{SEE_OTHER}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, Section 15.4.4

@item

@code{304}

@tab

@code{NOT_MODIFIED}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, Section 15.4.5

@item

@code{305}

@tab

@code{USE_PROXY}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, Section 15.4.6

@item

@code{307}

@tab

@code{TEMPORARY_REDIRECT}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, Section 15.4.8

@item

@code{308}

@tab

@code{PERMANENT_REDIRECT}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, Section 15.4.9

@item

@code{400}

@tab

@code{BAD_REQUEST}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, Section 15.5.1

@item

@code{401}

@tab

@code{UNAUTHORIZED}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, Section 15.5.2

@item

@code{402}

@tab

@code{PAYMENT_REQUIRED}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, Section 15.5.3

@item

@code{403}

@tab

@code{FORBIDDEN}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, Section 15.5.4

@item

@code{404}

@tab

@code{NOT_FOUND}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, Section 15.5.5

@item

@code{405}

@tab

@code{METHOD_NOT_ALLOWED}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, Section 15.5.6

@item

@code{406}

@tab

@code{NOT_ACCEPTABLE}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, Section 15.5.7

@item

@code{407}

@tab

@code{PROXY_AUTHENTICATION_REQUIRED}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, Section 15.5.8

@item

@code{408}

@tab

@code{REQUEST_TIMEOUT}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, Section 15.5.9

@item

@code{409}

@tab

@code{CONFLICT}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, Section 15.5.10

@item

@code{410}

@tab

@code{GONE}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, Section 15.5.11

@item

@code{411}

@tab

@code{LENGTH_REQUIRED}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, Section 15.5.12

@item

@code{412}

@tab

@code{PRECONDITION_FAILED}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, Section 15.5.13

@item

@code{413}

@tab

@code{CONTENT_TOO_LARGE}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, Section 15.5.14

@item

@code{414}

@tab

@code{URI_TOO_LONG}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, Section 15.5.15

@item

@code{415}

@tab

@code{UNSUPPORTED_MEDIA_TYPE}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, Section 15.5.16

@item

@code{416}

@tab

@code{RANGE_NOT_SATISFIABLE}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, Section 15.5.17

@item

@code{417}

@tab

@code{EXPECTATION_FAILED}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, Section 15.5.18

@item

@code{418}

@tab

@code{IM_A_TEAPOT}

@tab

HTCPCP/1.0 
@geindex RFC; RFC 2324
RFC 2324@footnote{https://datatracker.ietf.org/doc/html/rfc2324.html}, Section 2.3.2

@item

@code{421}

@tab

@code{MISDIRECTED_REQUEST}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, Section 15.5.20

@item

@code{422}

@tab

@code{UNPROCESSABLE_CONTENT}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, Section 15.5.21

@item

@code{423}

@tab

@code{LOCKED}

@tab

WebDAV 
@geindex RFC; RFC 4918
RFC 4918@footnote{https://datatracker.ietf.org/doc/html/rfc4918.html}, Section 11.3

@item

@code{424}

@tab

@code{FAILED_DEPENDENCY}

@tab

WebDAV 
@geindex RFC; RFC 4918
RFC 4918@footnote{https://datatracker.ietf.org/doc/html/rfc4918.html}, Section 11.4

@item

@code{425}

@tab

@code{TOO_EARLY}

@tab

Using Early Data in HTTP 
@geindex RFC; RFC 8470
RFC 8470@footnote{https://datatracker.ietf.org/doc/html/rfc8470.html}

@item

@code{426}

@tab

@code{UPGRADE_REQUIRED}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, Section 15.5.22

@item

@code{428}

@tab

@code{PRECONDITION_REQUIRED}

@tab

Additional HTTP Status Codes 
@geindex RFC; RFC 6585
RFC 6585@footnote{https://datatracker.ietf.org/doc/html/rfc6585.html}

@item

@code{429}

@tab

@code{TOO_MANY_REQUESTS}

@tab

Additional HTTP Status Codes 
@geindex RFC; RFC 6585
RFC 6585@footnote{https://datatracker.ietf.org/doc/html/rfc6585.html}

@item

@code{431}

@tab

@code{REQUEST_HEADER_FIELDS_TOO_LARGE}

@tab

Additional HTTP Status Codes 
@geindex RFC; RFC 6585
RFC 6585@footnote{https://datatracker.ietf.org/doc/html/rfc6585.html}

@item

@code{451}

@tab

@code{UNAVAILABLE_FOR_LEGAL_REASONS}

@tab

An HTTP Status Code to Report Legal Obstacles 
@geindex RFC; RFC 7725
RFC 7725@footnote{https://datatracker.ietf.org/doc/html/rfc7725.html}

@item

@code{500}

@tab

@code{INTERNAL_SERVER_ERROR}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, Section 15.6.1

@item

@code{501}

@tab

@code{NOT_IMPLEMENTED}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, Section 15.6.2

@item

@code{502}

@tab

@code{BAD_GATEWAY}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, Section 15.6.3

@item

@code{503}

@tab

@code{SERVICE_UNAVAILABLE}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, Section 15.6.4

@item

@code{504}

@tab

@code{GATEWAY_TIMEOUT}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, Section 15.6.5

@item

@code{505}

@tab

@code{HTTP_VERSION_NOT_SUPPORTED}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, Section 15.6.6

@item

@code{506}

@tab

@code{VARIANT_ALSO_NEGOTIATES}

@tab

Transparent Content Negotiation in HTTP 
@geindex RFC; RFC 2295
RFC 2295@footnote{https://datatracker.ietf.org/doc/html/rfc2295.html}, Section 8.1 (Experimental)

@item

@code{507}

@tab

@code{INSUFFICIENT_STORAGE}

@tab

WebDAV 
@geindex RFC; RFC 4918
RFC 4918@footnote{https://datatracker.ietf.org/doc/html/rfc4918.html}, Section 11.5

@item

@code{508}

@tab

@code{LOOP_DETECTED}

@tab

WebDAV Binding Extensions 
@geindex RFC; RFC 5842
RFC 5842@footnote{https://datatracker.ietf.org/doc/html/rfc5842.html}, Section 7.2 (Experimental)

@item

@code{510}

@tab

@code{NOT_EXTENDED}

@tab

An HTTP Extension Framework 
@geindex RFC; RFC 2774
RFC 2774@footnote{https://datatracker.ietf.org/doc/html/rfc2774.html}, Section 7 (Experimental)

@item

@code{511}

@tab

@code{NETWORK_AUTHENTICATION_REQUIRED}

@tab

Additional HTTP Status Codes 
@geindex RFC; RFC 6585
RFC 6585@footnote{https://datatracker.ietf.org/doc/html/rfc6585.html}, Section 6

@end multitable


In order to preserve backwards compatibility, enum values are also present
in the @ref{73,,http.client} module in the form of constants. The enum name is
equal to the constant name (i.e. @code{http.HTTPStatus.OK} is also available as
@code{http.client.OK}).


Changed in version 3.7: Added @code{421 MISDIRECTED_REQUEST} status code.



Added in version 3.8: Added @code{451 UNAVAILABLE_FOR_LEGAL_REASONS} status code.



Added in version 3.9: Added @code{103 EARLY_HINTS}, @code{418 IM_A_TEAPOT} and @code{425 TOO_EARLY} status codes.



Changed in version 3.13: Implemented RFC9110 naming for status constants. Old constant names are preserved for
backwards compatibility: @code{413 REQUEST_ENTITY_TOO_LARGE}, @code{414 REQUEST_URI_TOO_LONG},
@code{416 REQUESTED_RANGE_NOT_SATISFIABLE} and @code{422 UNPROCESSABLE_ENTITY}.


@node HTTP status category,HTTP methods,HTTP status codes,http — HTTP modules
@anchor{library/http http-status-category}@anchor{4044}
@subsubsection HTTP status category



Added in version 3.12.


The enum values have several properties to indicate the HTTP status category:


@multitable {xxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Property

@tab

Indicates that

@tab

Details

@item

@code{is_informational}

@tab

@code{100 <= status <= 199}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, Section 15

@item

@code{is_success}

@tab

@code{200 <= status <= 299}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, Section 15

@item

@code{is_redirection}

@tab

@code{300 <= status <= 399}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, Section 15

@item

@code{is_client_error}

@tab

@code{400 <= status <= 499}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, Section 15

@item

@code{is_server_error}

@tab

@code{500 <= status <= 599}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, Section 15

@end multitable


@quotation

Usage:

@example
>>> from http import HTTPStatus
>>> HTTPStatus.OK.is_success
True
>>> HTTPStatus.OK.is_client_error
False
@end example
@end quotation

@geindex HTTPMethod (class in http)
@anchor{library/http http HTTPMethod}@anchor{4045}
@deffn {Class} http.HTTPMethod


Added in version 3.11.


A subclass of @ref{82e,,enum.StrEnum} that defines a set of HTTP methods and descriptions written in English.

Usage:

@example
>>> from http import HTTPMethod
>>>
>>> HTTPMethod.GET
<HTTPMethod.GET>
>>> HTTPMethod.GET == 'GET'
True
>>> HTTPMethod.GET.value
'GET'
>>> HTTPMethod.GET.description
'Retrieve the target.'
>>> list(HTTPMethod)
[<HTTPMethod.CONNECT>,
 <HTTPMethod.DELETE>,
 <HTTPMethod.GET>,
 <HTTPMethod.HEAD>,
 <HTTPMethod.OPTIONS>,
 <HTTPMethod.PATCH>,
 <HTTPMethod.POST>,
 <HTTPMethod.PUT>,
 <HTTPMethod.TRACE>]
@end example
@end deffn

@node HTTP methods,,HTTP status category,http — HTTP modules
@anchor{library/http http-methods}@anchor{4046}@anchor{library/http id2}@anchor{4047}
@subsubsection HTTP methods


Supported,
IANA-registered methods@footnote{https://www.iana.org/assignments/http-methods/http-methods.xhtml}
available in @ref{4045,,http.HTTPMethod} are:


@multitable {xxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Method

@tab

Enum Name

@tab

Details

@item

@code{GET}

@tab

@code{GET}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, Section 9.3.1

@item

@code{HEAD}

@tab

@code{HEAD}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, Section 9.3.2

@item

@code{POST}

@tab

@code{POST}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, Section 9.3.3

@item

@code{PUT}

@tab

@code{PUT}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, Section 9.3.4

@item

@code{DELETE}

@tab

@code{DELETE}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, Section 9.3.5

@item

@code{CONNECT}

@tab

@code{CONNECT}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, Section 9.3.6

@item

@code{OPTIONS}

@tab

@code{OPTIONS}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, Section 9.3.7

@item

@code{TRACE}

@tab

@code{TRACE}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, Section 9.3.8

@item

@code{PATCH}

@tab

@code{PATCH}

@tab

HTTP/1.1 
@geindex RFC; RFC 5789
RFC 5789@footnote{https://datatracker.ietf.org/doc/html/rfc5789.html}

@end multitable


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node http client — HTTP protocol client,ftplib — FTP protocol client,http — HTTP modules,Internet Protocols and Support
@anchor{library/http client doc}@anchor{4048}@anchor{library/http client http-client-http-protocol-client}@anchor{4049}@anchor{library/http client module-http client}@anchor{73}@anchor{library/http client translation-repo}@anchor{404a}
@subsection @code{http.client} — HTTP protocol client


@geindex module; http.client

`Source code:' Lib/http/client.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/http/client.py}

@geindex HTTP; protocol
@geindex HTTP; http.client (standard module)

@geindex module; urllib.request


__________________________________________________________________


This module defines classes that implement the client side of the HTTP and
HTTPS protocols.  It is normally not used directly — the module
@ref{112,,urllib.request} uses it to handle URLs that use HTTP and HTTPS.


@subsubheading See also


The Requests package@footnote{https://requests.readthedocs.io/en/latest/}
is recommended for a higher-level HTTP client interface.


@cartouche
@quotation Note 
HTTPS support is only available if Python was compiled with SSL support
(through the @ref{d5,,ssl} module).
@end quotation
@end cartouche

@c include for modules that don't work on WASM

@ref{2181,,Availability}: not WASI.

This module does not work or is not available on WebAssembly. See
@ref{1bae,,WebAssembly platforms} for more information.

The module provides the following classes:

@geindex HTTPConnection (class in http.client)
@anchor{library/http client http client HTTPConnection}@anchor{d3b}
@deffn {Class} http.client.HTTPConnection (host, port=None[, timeout], source_address=None, blocksize=8192)

An @code{HTTPConnection} instance represents one transaction with an HTTP
server.  It should be instantiated by passing it a host and optional port
number.  If no port number is passed, the port is extracted from the host
string if it has the form @code{host:port}, else the default HTTP port (80) is
used.  If the optional `timeout' parameter is given, blocking
operations (like connection attempts) will timeout after that many seconds
(if it is not given, the global default timeout setting is used).
The optional `source_address' parameter may be a tuple of a (host, port)
to use as the source address the HTTP connection is made from.
The optional `blocksize' parameter sets the buffer size in bytes for
sending a file-like message body.

For example, the following calls all create instances that connect to the server
at the same host and port:

@example
>>> h1 = http.client.HTTPConnection('www.python.org')
>>> h2 = http.client.HTTPConnection('www.python.org:80')
>>> h3 = http.client.HTTPConnection('www.python.org', 80)
>>> h4 = http.client.HTTPConnection('www.python.org', 80, timeout=10)
@end example


Changed in version 3.2: `source_address' was added.



Changed in version 3.4: The  `strict' parameter was removed. HTTP 0.9-style “Simple Responses” are
no longer supported.



Changed in version 3.7: `blocksize' parameter was added.

@end deffn

@geindex HTTPSConnection (class in http.client)
@anchor{library/http client http client HTTPSConnection}@anchor{d3c}
@deffn {Class} http.client.HTTPSConnection (host, port=None, *[, timeout], source_address=None, context=None, blocksize=8192)

A subclass of @ref{d3b,,HTTPConnection} that uses SSL for communication with
secure servers.  Default port is @code{443}.  If `context' is specified, it
must be a @ref{355,,ssl.SSLContext} instance describing the various SSL
options.

Please read @ref{390d,,Security considerations} for more information on best practices.


Changed in version 3.2: `source_address', `context' and `check_hostname' were added.



Changed in version 3.2: This class now supports HTTPS virtual hosts if possible (that is,
if @ref{3a5b,,ssl.HAS_SNI} is true).



Changed in version 3.4: The `strict' parameter was removed. HTTP 0.9-style “Simple Responses” are
no longer supported.



Changed in version 3.4.3: This class now performs all the necessary certificate and hostname checks
by default. To revert to the previous, unverified, behavior
@code{ssl._create_unverified_context()} can be passed to the `context'
parameter.



Changed in version 3.8: This class now enables TLS 1.3
@ref{c2c,,ssl.SSLContext.post_handshake_auth} for the default `context' or
when `cert_file' is passed with a custom `context'.



Changed in version 3.10: This class now sends an ALPN extension with protocol indicator
@code{http/1.1} when no `context' is given. Custom `context' should set
ALPN protocols with @ref{106a,,set_alpn_protocols()}.



Changed in version 3.12: The deprecated `key_file', `cert_file' and `check_hostname' parameters
have been removed.

@end deffn

@geindex HTTPResponse (class in http.client)
@anchor{library/http client http client HTTPResponse}@anchor{12da}
@deffn {Class} http.client.HTTPResponse (sock, debuglevel=0, method=None, url=None)

Class whose instances are returned upon successful connection.  Not
instantiated directly by user.


Changed in version 3.4: The `strict' parameter was removed. HTTP 0.9 style “Simple Responses” are
no longer supported.

@end deffn

This module provides the following function:

@geindex parse_headers() (in module http.client)
@anchor{library/http client http client parse_headers}@anchor{1e6a}
@deffn {Function} http.client.parse_headers (fp)

Parse the headers from a file pointer `fp' representing a HTTP
request/response. The file has to be a @ref{8a5,,BufferedIOBase} reader
(i.e. not text) and must provide a valid 
@geindex RFC; RFC 5322
RFC 5322@footnote{https://datatracker.ietf.org/doc/html/rfc5322.html} style header.

This function returns an instance of @ref{404b,,http.client.HTTPMessage}
that holds the header fields, but no payload
(the same as @ref{404c,,HTTPResponse.msg}
and @ref{404d,,http.server.BaseHTTPRequestHandler.headers}).
After returning, the file pointer `fp' is ready to read the HTTP body.

@cartouche
@quotation Note 
@code{parse_headers()} does not parse the start-line of a HTTP message;
it only parses the @code{Name: value} lines. The file has to be ready to
read these field lines, so the first line should already be consumed
before calling the function.
@end quotation
@end cartouche
@end deffn

The following exceptions are raised as appropriate:

@geindex HTTPException
@anchor{library/http client http client HTTPException}@anchor{404e}
@deffn {Exception} http.client.HTTPException

The base class of the other exceptions in this module.  It is a subclass of
@ref{bd3,,Exception}.
@end deffn

@geindex NotConnected
@anchor{library/http client http client NotConnected}@anchor{404f}
@deffn {Exception} http.client.NotConnected

A subclass of @ref{404e,,HTTPException}.
@end deffn

@geindex InvalidURL
@anchor{library/http client http client InvalidURL}@anchor{4050}
@deffn {Exception} http.client.InvalidURL

A subclass of @ref{404e,,HTTPException}, raised if a port is given and is either
non-numeric or empty.
@end deffn

@geindex UnknownProtocol
@anchor{library/http client http client UnknownProtocol}@anchor{4051}
@deffn {Exception} http.client.UnknownProtocol

A subclass of @ref{404e,,HTTPException}.
@end deffn

@geindex UnknownTransferEncoding
@anchor{library/http client http client UnknownTransferEncoding}@anchor{4052}
@deffn {Exception} http.client.UnknownTransferEncoding

A subclass of @ref{404e,,HTTPException}.
@end deffn

@geindex UnimplementedFileMode
@anchor{library/http client http client UnimplementedFileMode}@anchor{4053}
@deffn {Exception} http.client.UnimplementedFileMode

A subclass of @ref{404e,,HTTPException}.
@end deffn

@geindex IncompleteRead
@anchor{library/http client http client IncompleteRead}@anchor{4054}
@deffn {Exception} http.client.IncompleteRead

A subclass of @ref{404e,,HTTPException}.
@end deffn

@geindex ImproperConnectionState
@anchor{library/http client http client ImproperConnectionState}@anchor{4055}
@deffn {Exception} http.client.ImproperConnectionState

A subclass of @ref{404e,,HTTPException}.
@end deffn

@geindex CannotSendRequest
@anchor{library/http client http client CannotSendRequest}@anchor{4056}
@deffn {Exception} http.client.CannotSendRequest

A subclass of @ref{4055,,ImproperConnectionState}.
@end deffn

@geindex CannotSendHeader
@anchor{library/http client http client CannotSendHeader}@anchor{4057}
@deffn {Exception} http.client.CannotSendHeader

A subclass of @ref{4055,,ImproperConnectionState}.
@end deffn

@geindex ResponseNotReady
@anchor{library/http client http client ResponseNotReady}@anchor{4058}
@deffn {Exception} http.client.ResponseNotReady

A subclass of @ref{4055,,ImproperConnectionState}.
@end deffn

@geindex BadStatusLine
@anchor{library/http client http client BadStatusLine}@anchor{4059}
@deffn {Exception} http.client.BadStatusLine

A subclass of @ref{404e,,HTTPException}.  Raised if a server responds with a HTTP
status code that we don’t understand.
@end deffn

@geindex LineTooLong
@anchor{library/http client http client LineTooLong}@anchor{405a}
@deffn {Exception} http.client.LineTooLong

A subclass of @ref{404e,,HTTPException}.  Raised if an excessively long line
is received in the HTTP protocol from the server.
@end deffn

@geindex RemoteDisconnected
@anchor{library/http client http client RemoteDisconnected}@anchor{1010}
@deffn {Exception} http.client.RemoteDisconnected

A subclass of @ref{1265,,ConnectionResetError} and @ref{4059,,BadStatusLine}.  Raised
by @ref{100f,,HTTPConnection.getresponse()} when the attempt to read the response
results in no data read from the connection, indicating that the remote end
has closed the connection.


Added in version 3.5: Previously, @ref{4059,,BadStatusLine}@code{('@w{'})} was raised.

@end deffn

The constants defined in this module are:

@geindex HTTP_PORT (in module http.client)
@anchor{library/http client http client HTTP_PORT}@anchor{405b}
@deffn {Data} http.client.HTTP_PORT

The default port for the HTTP protocol (always @code{80}).
@end deffn

@geindex HTTPS_PORT (in module http.client)
@anchor{library/http client http client HTTPS_PORT}@anchor{405c}
@deffn {Data} http.client.HTTPS_PORT

The default port for the HTTPS protocol (always @code{443}).
@end deffn

@geindex responses (in module http.client)
@anchor{library/http client http client responses}@anchor{405d}
@deffn {Data} http.client.responses

This dictionary maps the HTTP 1.1 status codes to the W3C names.

Example: @code{http.client.responses[http.client.NOT_FOUND]} is @code{'Not Found'}.
@end deffn

See @ref{4042,,HTTP status codes} for a list of HTTP status codes that are
available in this module as constants.

@menu
* HTTPConnection Objects:: 
* HTTPResponse Objects:: 
* Examples: Examples<28>. 
* HTTPMessage Objects:: 

@end menu

@node HTTPConnection Objects,HTTPResponse Objects,,http client — HTTP protocol client
@anchor{library/http client httpconnection-objects}@anchor{405e}@anchor{library/http client id1}@anchor{405f}
@subsubsection HTTPConnection Objects


@ref{d3b,,HTTPConnection} instances have the following methods:

@geindex request() (http.client.HTTPConnection method)
@anchor{library/http client http client HTTPConnection request}@anchor{ead}
@deffn {Method} HTTPConnection.request (method, url, body=None, headers=@{@}, *, encode_chunked=False)

This will send a request to the server using the HTTP request
method `method' and the request URI `url'. The provided `url' must be
an absolute path to conform with 
@geindex RFC; RFC 2616 Section 5.1.2
RFC 2616 §5.1.2@footnote{https://datatracker.ietf.org/doc/html/rfc2616.html#section-5.1.2}
(unless connecting to an HTTP proxy server or using the @code{OPTIONS} or
@code{CONNECT} methods).

If `body' is specified, the specified data is sent after the headers are
finished.  It may be a @ref{16a,,str}, a @ref{194,,bytes-like object}, an
open @ref{13cf,,file object}, or an iterable of @ref{193,,bytes}.  If `body'
is a string, it is encoded as ISO-8859-1, the default for HTTP.  If it
is a bytes-like object, the bytes are sent as is.  If it is a file
object, the contents of the file is sent; this file object should
support at least the @code{read()} method.  If the file object is an
instance of @ref{8a6,,io.TextIOBase}, the data returned by the @code{read()}
method will be encoded as ISO-8859-1, otherwise the data returned by
@code{read()} is sent as is.  If `body' is an iterable, the elements of the
iterable are sent as is until the iterable is exhausted.

The `headers' argument should be a mapping of extra HTTP headers to send
with the request. A 
@geindex RFC; RFC 2616 Section 14.23
Host header@footnote{https://datatracker.ietf.org/doc/html/rfc2616.html#section-14.23}
must be provided to conform with 
@geindex RFC; RFC 2616 Section 5.1.2
RFC 2616 §5.1.2@footnote{https://datatracker.ietf.org/doc/html/rfc2616.html#section-5.1.2}
(unless connecting to an HTTP proxy server or using the @code{OPTIONS} or
@code{CONNECT} methods).

If `headers' contains neither Content-Length nor Transfer-Encoding,
but there is a request body, one of those
header fields will be added automatically.  If
`body' is @code{None}, the Content-Length header is set to @code{0} for
methods that expect a body (@code{PUT}, @code{POST}, and @code{PATCH}).  If
`body' is a string or a bytes-like object that is not also a
@ref{13cf,,file}, the Content-Length header is
set to its length.  Any other type of `body' (files
and iterables in general) will be chunk-encoded, and the
Transfer-Encoding header will automatically be set instead of
Content-Length.

The `encode_chunked' argument is only relevant if Transfer-Encoding is
specified in `headers'.  If `encode_chunked' is @code{False}, the
HTTPConnection object assumes that all encoding is handled by the
calling code.  If it is @code{True}, the body will be chunk-encoded.

For example, to perform a @code{GET} request to @code{https://docs.python.org/3/}:

@example
>>> import http.client
>>> host = "docs.python.org"
>>> conn = http.client.HTTPSConnection(host)
>>> conn.request("GET", "/3/", headers=@{"Host": host@})
>>> response = conn.getresponse()
>>> print(response.status, response.reason)
200 OK
@end example

@cartouche
@quotation Note 
Chunked transfer encoding has been added to the HTTP protocol
version 1.1.  Unless the HTTP server is known to handle HTTP 1.1,
the caller must either specify the Content-Length, or must pass a
@ref{16a,,str} or bytes-like object that is not also a file as the
body representation.
@end quotation
@end cartouche

@cartouche
@quotation Note 
Note that you must have read the whole response or call @ref{4060,,close()}
if @ref{100f,,getresponse()} raised an non-@ref{1011,,ConnectionError} exception
before you can send a new request to the server.
@end quotation
@end cartouche


Changed in version 3.2: `body' can now be an iterable.



Changed in version 3.6: If neither Content-Length nor Transfer-Encoding are set in
`headers', file and iterable `body' objects are now chunk-encoded.
The `encode_chunked' argument was added.
No attempt is made to determine the Content-Length for file
objects.

@end deffn

@geindex getresponse() (http.client.HTTPConnection method)
@anchor{library/http client http client HTTPConnection getresponse}@anchor{100f}
@deffn {Method} HTTPConnection.getresponse ()

Should be called after a request is sent to get the response from the server.
Returns an @ref{12da,,HTTPResponse} instance.


Changed in version 3.5: If a @ref{1011,,ConnectionError} or subclass is raised, the
@ref{d3b,,HTTPConnection} object will be ready to reconnect when
a new request is sent.

Note that this does not apply to @ref{2c2,,OSError}s raised by the underlying
socket. Instead the caller is responsible to call @ref{4060,,close()} on the
existing connection.

@end deffn

@geindex set_debuglevel() (http.client.HTTPConnection method)
@anchor{library/http client http client HTTPConnection set_debuglevel}@anchor{4061}
@deffn {Method} HTTPConnection.set_debuglevel (level)

Set the debugging level.  The default debug level is @code{0}, meaning no
debugging output is printed.  Any value greater than @code{0} will cause all
currently defined debug output to be printed to stdout.  The @code{debuglevel}
is passed to any new @ref{12da,,HTTPResponse} objects that are created.


Added in version 3.1.

@end deffn

@geindex set_tunnel() (http.client.HTTPConnection method)
@anchor{library/http client http client HTTPConnection set_tunnel}@anchor{1434}
@deffn {Method} HTTPConnection.set_tunnel (host, port=None, headers=None)

Set the host and the port for HTTP Connect Tunnelling. This allows running
the connection through a proxy server.

The `host' and `port' arguments specify the endpoint of the tunneled connection
(i.e. the address included in the CONNECT request, `not' the address of the
proxy server).

The `headers' argument should be a mapping of extra HTTP headers to send with
the CONNECT request.

As HTTP/1.1 is used for HTTP CONNECT tunnelling request, as per the RFC@footnote{https://datatracker.ietf.org/doc/html/rfc7231#section-4.3.6}, a HTTP @code{Host:}
header must be provided, matching the authority-form of the request target
provided as the destination for the CONNECT request. If a HTTP @code{Host:}
header is not provided via the headers argument, one is generated and
transmitted automatically.

For example, to tunnel through a HTTPS proxy server running locally on port
8080, we would pass the address of the proxy to the @ref{d3c,,HTTPSConnection}
constructor, and the address of the host that we eventually want to reach to
the @code{set_tunnel()} method:

@example
>>> import http.client
>>> conn = http.client.HTTPSConnection("localhost", 8080)
>>> conn.set_tunnel("www.python.org")
>>> conn.request("HEAD","/index.html")
@end example


Added in version 3.2.



Changed in version 3.12: HTTP CONNECT tunnelling requests use protocol HTTP/1.1, upgraded from
protocol HTTP/1.0. @code{Host:} HTTP headers are mandatory for HTTP/1.1, so
one will be automatically generated and transmitted if not provided in
the headers argument.

@end deffn

@geindex get_proxy_response_headers() (http.client.HTTPConnection method)
@anchor{library/http client http client HTTPConnection get_proxy_response_headers}@anchor{1ab9}
@deffn {Method} HTTPConnection.get_proxy_response_headers ()

Returns a dictionary with the headers of the response received from
the proxy server to the CONNECT request.

If the CONNECT request was not sent, the method returns @code{None}.


Added in version 3.12.

@end deffn

@geindex connect() (http.client.HTTPConnection method)
@anchor{library/http client http client HTTPConnection connect}@anchor{4062}
@deffn {Method} HTTPConnection.connect ()

Connect to the server specified when the object was created.  By default,
this is called automatically when making a request if the client does not
already have a connection.

Raises an @ref{1cb1,,auditing event} @code{http.client.connect} with arguments @code{self}, @code{host}, @code{port}.
@end deffn

@geindex close() (http.client.HTTPConnection method)
@anchor{library/http client http client HTTPConnection close}@anchor{4060}
@deffn {Method} HTTPConnection.close ()

Close the connection to the server.
@end deffn

@geindex blocksize (http.client.HTTPConnection attribute)
@anchor{library/http client http client HTTPConnection blocksize}@anchor{4063}
@deffn {Attribute} HTTPConnection.blocksize

Buffer size in bytes for sending a file-like message body.


Added in version 3.7.

@end deffn

As an alternative to using the @ref{ead,,request()} method described above, you can
also send your request step by step, by using the four functions below.

@geindex putrequest() (http.client.HTTPConnection method)
@anchor{library/http client http client HTTPConnection putrequest}@anchor{4064}
@deffn {Method} HTTPConnection.putrequest (method, url, skip_host=False, skip_accept_encoding=False)

This should be the first call after the connection to the server has been
made. It sends a line to the server consisting of the `method' string,
the `url' string, and the HTTP version (@code{HTTP/1.1}).  To disable automatic
sending of @code{Host:} or @code{Accept-Encoding:} headers (for example to accept
additional content encodings), specify `skip_host' or `skip_accept_encoding'
with non-False values.
@end deffn

@geindex putheader() (http.client.HTTPConnection method)
@anchor{library/http client http client HTTPConnection putheader}@anchor{4065}
@deffn {Method} HTTPConnection.putheader (header, argument[, ...])

Send an 
@geindex RFC; RFC 822
RFC 822@footnote{https://datatracker.ietf.org/doc/html/rfc822.html}-style header to the server.  It sends a line to the server
consisting of the header, a colon and a space, and the first argument.  If more
arguments are given, continuation lines are sent, each consisting of a tab and
an argument.
@end deffn

@geindex endheaders() (http.client.HTTPConnection method)
@anchor{library/http client http client HTTPConnection endheaders}@anchor{eae}
@deffn {Method} HTTPConnection.endheaders (message_body=None, *, encode_chunked=False)

Send a blank line to the server, signalling the end of the headers. The
optional `message_body' argument can be used to pass a message body
associated with the request.

If `encode_chunked' is @code{True}, the result of each iteration of
`message_body' will be chunk-encoded as specified in 
@geindex RFC; RFC 7230
RFC 7230@footnote{https://datatracker.ietf.org/doc/html/rfc7230.html},
Section 3.3.1.  How the data is encoded is dependent on the type of
`message_body'.  If `message_body' implements the @ref{262,,buffer interface} the encoding will result in a single chunk.
If `message_body' is a @ref{26f9,,collections.abc.Iterable}, each iteration
of `message_body' will result in a chunk.  If `message_body' is a
@ref{13cf,,file object}, each call to @code{.read()} will result in a chunk.
The method automatically signals the end of the chunk-encoded data
immediately after `message_body'.

@cartouche
@quotation Note 
Due to the chunked encoding specification, empty chunks
yielded by an iterator body will be ignored by the chunk-encoder.
This is to avoid premature termination of the read of the request by
the target server due to malformed encoding.
@end quotation
@end cartouche


Changed in version 3.6: Added chunked encoding support and the `encode_chunked' parameter.

@end deffn

@geindex send() (http.client.HTTPConnection method)
@anchor{library/http client http client HTTPConnection send}@anchor{4066}
@deffn {Method} HTTPConnection.send (data)

Send data to the server.  This should be used directly only after the
@ref{eae,,endheaders()} method has been called and before @ref{100f,,getresponse()} is
called.

Raises an @ref{1cb1,,auditing event} @code{http.client.send} with arguments @code{self}, @code{data}.
@end deffn

@node HTTPResponse Objects,Examples<28>,HTTPConnection Objects,http client — HTTP protocol client
@anchor{library/http client httpresponse-objects}@anchor{4067}@anchor{library/http client id2}@anchor{4068}
@subsubsection HTTPResponse Objects


An @ref{12da,,HTTPResponse} instance wraps the HTTP response from the
server.  It provides access to the request headers and the entity
body.  The response is an iterable object and can be used in a with
statement.


Changed in version 3.5: The @ref{8a5,,io.BufferedIOBase} interface is now implemented and
all of its reader operations are supported.


@geindex read() (http.client.HTTPResponse method)
@anchor{library/http client http client HTTPResponse read}@anchor{18f5}
@deffn {Method} HTTPResponse.read ([amt])

Reads and returns the response body, or up to the next `amt' bytes.
@end deffn

@geindex readinto() (http.client.HTTPResponse method)
@anchor{library/http client http client HTTPResponse readinto}@anchor{12db}
@deffn {Method} HTTPResponse.readinto (b)

Reads up to the next len(b) bytes of the response body into the buffer `b'.
Returns the number of bytes read.


Added in version 3.3.

@end deffn

@geindex getheader() (http.client.HTTPResponse method)
@anchor{library/http client http client HTTPResponse getheader}@anchor{4069}
@deffn {Method} HTTPResponse.getheader (name, default=None)

Return the value of the header `name', or `default' if there is no header
matching `name'.  If there is more than one  header with the name `name',
return all of the values joined by ‘, ‘.  If `default' is any iterable other
than a single string, its elements are similarly returned joined by commas.
@end deffn

@geindex getheaders() (http.client.HTTPResponse method)
@anchor{library/http client http client HTTPResponse getheaders}@anchor{406a}
@deffn {Method} HTTPResponse.getheaders ()

Return a list of (header, value) tuples.
@end deffn

@geindex fileno() (http.client.HTTPResponse method)
@anchor{library/http client http client HTTPResponse fileno}@anchor{406b}
@deffn {Method} HTTPResponse.fileno ()

Return the @code{fileno} of the underlying socket.
@end deffn

@geindex msg (http.client.HTTPResponse attribute)
@anchor{library/http client http client HTTPResponse msg}@anchor{404c}
@deffn {Attribute} HTTPResponse.msg

A @ref{404b,,http.client.HTTPMessage} instance containing the response
headers.  @code{http.client.HTTPMessage} is a subclass of
@ref{581,,email.message.Message}.
@end deffn

@geindex version (http.client.HTTPResponse attribute)
@anchor{library/http client http client HTTPResponse version}@anchor{406c}
@deffn {Attribute} HTTPResponse.version

HTTP protocol version used by server.  10 for HTTP/1.0, 11 for HTTP/1.1.
@end deffn

@geindex url (http.client.HTTPResponse attribute)
@anchor{library/http client http client HTTPResponse url}@anchor{406d}
@deffn {Attribute} HTTPResponse.url

URL of the resource retrieved, commonly used to determine if a redirect was followed.
@end deffn

@geindex headers (http.client.HTTPResponse attribute)
@anchor{library/http client http client HTTPResponse headers}@anchor{406e}
@deffn {Attribute} HTTPResponse.headers

Headers of the response in the form of an @ref{580,,email.message.EmailMessage} instance.
@end deffn

@geindex status (http.client.HTTPResponse attribute)
@anchor{library/http client http client HTTPResponse status}@anchor{406f}
@deffn {Attribute} HTTPResponse.status

Status code returned by server.
@end deffn

@geindex reason (http.client.HTTPResponse attribute)
@anchor{library/http client http client HTTPResponse reason}@anchor{3f9a}
@deffn {Attribute} HTTPResponse.reason

Reason phrase returned by server.
@end deffn

@geindex debuglevel (http.client.HTTPResponse attribute)
@anchor{library/http client http client HTTPResponse debuglevel}@anchor{4070}
@deffn {Attribute} HTTPResponse.debuglevel

A debugging hook.  If @ref{4070,,debuglevel} is greater than zero, messages
will be printed to stdout as the response is read and parsed.
@end deffn

@geindex closed (http.client.HTTPResponse attribute)
@anchor{library/http client http client HTTPResponse closed}@anchor{4071}
@deffn {Attribute} HTTPResponse.closed

Is @code{True} if the stream is closed.
@end deffn

@geindex geturl() (http.client.HTTPResponse method)
@anchor{library/http client http client HTTPResponse geturl}@anchor{4072}
@deffn {Method} HTTPResponse.geturl ()


Deprecated since version 3.9: Deprecated in favor of @ref{406d,,url}.

@end deffn

@geindex info() (http.client.HTTPResponse method)
@anchor{library/http client http client HTTPResponse info}@anchor{4073}
@deffn {Method} HTTPResponse.info ()


Deprecated since version 3.9: Deprecated in favor of @ref{406e,,headers}.

@end deffn

@geindex getcode() (http.client.HTTPResponse method)
@anchor{library/http client http client HTTPResponse getcode}@anchor{4074}
@deffn {Method} HTTPResponse.getcode ()


Deprecated since version 3.9: Deprecated in favor of @ref{406f,,status}.

@end deffn

@node Examples<28>,HTTPMessage Objects,HTTPResponse Objects,http client — HTTP protocol client
@anchor{library/http client examples}@anchor{4075}
@subsubsection Examples


Here is an example session that uses the @code{GET} method:

@example
>>> import http.client
>>> conn = http.client.HTTPSConnection("www.python.org")
>>> conn.request("GET", "/")
>>> r1 = conn.getresponse()
>>> print(r1.status, r1.reason)
200 OK
>>> data1 = r1.read()  # This will return entire content.
>>> # The following example demonstrates reading data in chunks.
>>> conn.request("GET", "/")
>>> r1 = conn.getresponse()
>>> while chunk := r1.read(200):
...     print(repr(chunk))
b'<!doctype html>\n<!--[if"...
...
>>> # Example of an invalid request
>>> conn = http.client.HTTPSConnection("docs.python.org")
>>> conn.request("GET", "/parrot.spam")
>>> r2 = conn.getresponse()
>>> print(r2.status, r2.reason)
404 Not Found
>>> data2 = r2.read()
>>> conn.close()
@end example

Here is an example session that uses the @code{HEAD} method.  Note that the
@code{HEAD} method never returns any data.

@example
>>> import http.client
>>> conn = http.client.HTTPSConnection("www.python.org")
>>> conn.request("HEAD", "/")
>>> res = conn.getresponse()
>>> print(res.status, res.reason)
200 OK
>>> data = res.read()
>>> print(len(data))
0
>>> data == b'@w{'}
True
@end example

Here is an example session that uses the @code{POST} method:

@example
>>> import http.client, urllib.parse
>>> params = urllib.parse.urlencode(@{'@@number': 12524, '@@type': 'issue', '@@action': 'show'@})
>>> headers = @{"Content-type": "application/x-www-form-urlencoded",
...            "Accept": "text/plain"@}
>>> conn = http.client.HTTPConnection("bugs.python.org")
>>> conn.request("POST", "", params, headers)
>>> response = conn.getresponse()
>>> print(response.status, response.reason)
302 Found
>>> data = response.read()
>>> data
b'Redirecting to <a href="https://bugs.python.org/issue12524">https://bugs.python.org/issue12524</a>'
>>> conn.close()
@end example

Client side HTTP @code{PUT} requests are very similar to @code{POST} requests. The
difference lies only on the server side where HTTP servers will allow resources to
be created via @code{PUT} requests. It should be noted that custom HTTP methods
are also handled in @ref{11de,,urllib.request.Request} by setting the appropriate
method attribute. Here is an example session that uses the @code{PUT} method:

@example
>>> # This creates an HTTP request
>>> # with the content of BODY as the enclosed representation
>>> # for the resource http://localhost:8080/file
...
>>> import http.client
>>> BODY = "***filecontents***"
>>> conn = http.client.HTTPConnection("localhost", 8080)
>>> conn.request("PUT", "/file", BODY)
>>> response = conn.getresponse()
>>> print(response.status, response.reason)
200, OK
@end example

@node HTTPMessage Objects,,Examples<28>,http client — HTTP protocol client
@anchor{library/http client httpmessage-objects}@anchor{4076}@anchor{library/http client id3}@anchor{4077}
@subsubsection HTTPMessage Objects


@geindex HTTPMessage (class in http.client)
@anchor{library/http client http client HTTPMessage}@anchor{404b}
@deffn {Class} http.client.HTTPMessage (email.message.Message)
@end deffn

An @ref{404b,,http.client.HTTPMessage} instance holds the headers from an HTTP
response.  It is implemented using the @ref{581,,email.message.Message} class.

@c XXX Define the methods that clients can depend upon between versions.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node ftplib — FTP protocol client,poplib — POP3 protocol client,http client — HTTP protocol client,Internet Protocols and Support
@anchor{library/ftplib doc}@anchor{4078}@anchor{library/ftplib ftplib-ftp-protocol-client}@anchor{4079}@anchor{library/ftplib module-ftplib}@anchor{62}@anchor{library/ftplib translation-repo}@anchor{407a}
@subsection @code{ftplib} — FTP protocol client


@geindex module; ftplib

`Source code:' Lib/ftplib.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/ftplib.py}

@geindex FTP; protocol
@geindex FTP; ftplib (standard module)


__________________________________________________________________


This module defines the class @ref{afc,,FTP} and a few related items. The
@code{FTP} class implements the client side of the FTP protocol.  You can use
this to write Python programs that perform a variety of automated FTP jobs, such
as mirroring other FTP servers.  It is also used by the module
@ref{112,,urllib.request} to handle URLs that use FTP.  For more information on FTP
(File Transfer Protocol), see internet 
@geindex RFC; RFC 959
RFC 959@footnote{https://datatracker.ietf.org/doc/html/rfc959.html}.

The default encoding is UTF-8, following 
@geindex RFC; RFC 2640
RFC 2640@footnote{https://datatracker.ietf.org/doc/html/rfc2640.html}.

@c include for modules that don't work on WASM

@ref{2181,,Availability}: not WASI.

This module does not work or is not available on WebAssembly. See
@ref{1bae,,WebAssembly platforms} for more information.

Here’s a sample session using the @code{ftplib} module:

@example
>>> from ftplib import FTP
>>> ftp = FTP('ftp.us.debian.org')  # connect to host, default port
>>> ftp.login()                     # user anonymous, passwd anonymous@@
'230 Login successful.'
>>> ftp.cwd('debian')               # change into "debian" directory
'250 Directory successfully changed.'
>>> ftp.retrlines('LIST')           # list directory contents
-rw-rw-r--    1 1176     1176         1063 Jun 15 10:18 README
...
drwxr-sr-x    5 1176     1176         4096 Dec 19  2000 pool
drwxr-sr-x    4 1176     1176         4096 Nov 17  2008 project
drwxr-xr-x    3 1176     1176         4096 Oct 10  2012 tools
'226 Directory send OK.'
>>> with open('README', 'wb') as fp:
>>>     ftp.retrbinary('RETR README', fp.write)
'226 Transfer complete.'
>>> ftp.quit()
'221 Goodbye.'
@end example

@menu
* Reference: Reference<7>. 

@end menu

@node Reference<7>,,,ftplib — FTP protocol client
@anchor{library/ftplib ftplib-reference}@anchor{407b}@anchor{library/ftplib reference}@anchor{407c}
@subsubsection Reference


@menu
* FTP objects:: 
* FTP_TLS objects:: 
* Module variables:: 

@end menu

@node FTP objects,FTP_TLS objects,,Reference<7>
@anchor{library/ftplib ftp-objects}@anchor{407d}@anchor{library/ftplib id1}@anchor{407e}
@subsubsection FTP objects


@c Use substitutions for some param docs so we don't need to repeat them
@c in multiple places.

@c Ideally, we'd like to use the :rfc: directive, but Sphinx will not allow it.

@geindex FTP (class in ftplib)
@anchor{library/ftplib ftplib FTP}@anchor{afc}
@deffn {Class} ftplib.FTP (host='@w{'}, user='@w{'}, passwd='@w{'}, acct='@w{'}, timeout=None, source_address=None, *, encoding='utf-8')

Return a new instance of the @code{FTP} class.

@*Parameters: 

@itemize *

@item 
@code{host} (@ref{16a,,str}) – The hostname to connect to.
If given, @code{connect(host)} is implicitly called by the constructor.

@item 
@code{user} (@ref{16a,,str}) – The username to log in with (default: @code{'anonymous'}).
If given, @code{login(host, passwd, acct)} is implicitly called
by the constructor.

@item 
@code{passwd} (@ref{16a,,str}) – The password to use when logging in.
If not given, and if `passwd' is the empty string or @code{"-"},
a password will be automatically generated.

@item 
@code{acct} (@ref{16a,,str}) – Account information to be used for the @code{ACCT} FTP command.
Few systems implement this.
See RFC-959@footnote{https://datatracker.ietf.org/doc/html/rfc959.html}
for more details.

@item 
@code{timeout} (@ref{197,,float}@code{ | }@code{None}) – A timeout in seconds for blocking operations like @ref{407f,,connect()}
(default: the global default timeout setting).

@item 
@code{source_address} (@ref{614,,tuple}@code{ | }@code{None}) – A 2-tuple @code{(host, port)} for the socket to bind to as its
source address before connecting.

@item 
@code{encoding} (@ref{16a,,str}) – The encoding for directories and filenames (default: @code{'utf-8'}).
@end itemize


The @code{FTP} class supports the @ref{187,,with} statement, e.g.:

@example
>>> from ftplib import FTP
>>> with FTP("ftp1.at.proftpd.org") as ftp:
...     ftp.login()
...     ftp.dir()
...
'230 Anonymous login ok, restrictions apply.'
dr-xr-xr-x   9 ftp      ftp           154 May  6 10:43 .
dr-xr-xr-x   9 ftp      ftp           154 May  6 10:43 ..
dr-xr-xr-x   5 ftp      ftp          4096 May  6 10:43 CentOS
dr-xr-xr-x   3 ftp      ftp            18 Jul 10  2008 Fedora
>>>
@end example


Changed in version 3.2: Support for the @ref{187,,with} statement was added.



Changed in version 3.3: `source_address' parameter was added.



Changed in version 3.9: If the `timeout' parameter is set to be zero, it will raise a
@ref{2ee,,ValueError} to prevent the creation of a non-blocking socket.
The `encoding' parameter was added, and the default was changed from
Latin-1 to UTF-8 to follow 
@geindex RFC; RFC 2640
RFC 2640@footnote{https://datatracker.ietf.org/doc/html/rfc2640.html}.


Several @code{FTP} methods are available in two flavors:
one for handling text files and another for binary files.
The methods are named for the command which is used followed by
@code{lines} for the text version or @code{binary} for the binary version.

@code{FTP} instances have the following methods:

@geindex set_debuglevel() (ftplib.FTP method)
@anchor{library/ftplib ftplib FTP set_debuglevel}@anchor{4080}
@deffn {Method} set_debuglevel (level)

Set the instance’s debugging level as an @ref{19c,,int}.
This controls the amount of debugging output printed.
The debug levels are:


@itemize *

@item 
@code{0} (default): No debug output.

@item 
@code{1}: Produce a moderate amount of debug output,
generally a single line per request.

@item 
@code{2} or higher: Produce the maximum amount of debugging output,
logging each line sent and received on the control connection.
@end itemize
@end deffn

@geindex connect() (ftplib.FTP method)
@anchor{library/ftplib ftplib FTP connect}@anchor{407f}
@deffn {Method} connect (host='@w{'}, port=0, timeout=None, source_address=None)

Connect to the given host and port.
This function should be called only once for each instance;
it should not be called if a `host' argument was given
when the @code{FTP} instance was created.
All other @code{FTP} methods can only be called
after a connection has successfully been made.

@*Parameters: 

@itemize *

@item 
@code{host} (@ref{16a,,str}) – The host to connect to.

@item 
@code{port} (@ref{19c,,int}) – The TCP port to connect to (default: @code{21},
as specified by the FTP protocol specification).
It is rarely needed to specify a different port number.

@item 
@code{timeout} (@ref{197,,float}@code{ | }@code{None}) – A timeout in seconds for the connection attempt
(default: the global default timeout setting).

@item 
@code{source_address} (@ref{614,,tuple}@code{ | }@code{None}) – A 2-tuple @code{(host, port)} for the socket to bind to as its
source address before connecting.
@end itemize


Raises an @ref{1cb1,,auditing event} @code{ftplib.connect} with arguments @code{self}, @code{host}, @code{port}.


Changed in version 3.3: `source_address' parameter was added.

@end deffn

@geindex getwelcome() (ftplib.FTP method)
@anchor{library/ftplib ftplib FTP getwelcome}@anchor{4081}
@deffn {Method} getwelcome ()

Return the welcome message sent by the server in reply to the initial
connection.  (This message sometimes contains disclaimers or help information
that may be relevant to the user.)
@end deffn

@geindex login() (ftplib.FTP method)
@anchor{library/ftplib ftplib FTP login}@anchor{4082}
@deffn {Method} login (user='anonymous', passwd='@w{'}, acct='@w{'})

Log on to the connected FTP server.
This function should be called only once for each instance,
after a connection has been established;
it should not be called if the `host' and `user' arguments were given
when the @code{FTP} instance was created.
Most FTP commands are only allowed after the client has logged in.

@*Parameters: 

@itemize *

@item 
@code{user} (@ref{16a,,str}) – The username to log in with (default: @code{'anonymous'}).

@item 
@code{passwd} (@ref{16a,,str}) – The password to use when logging in.
If not given, and if `passwd' is the empty string or @code{"-"},
a password will be automatically generated.

@item 
@code{acct} (@ref{16a,,str}) – Account information to be used for the @code{ACCT} FTP command.
Few systems implement this.
See RFC-959@footnote{https://datatracker.ietf.org/doc/html/rfc959.html}
for more details.
@end itemize

@end deffn

@geindex abort() (ftplib.FTP method)
@anchor{library/ftplib ftplib FTP abort}@anchor{4083}
@deffn {Method} abort ()

Abort a file transfer that is in progress.  Using this does not always work, but
it’s worth a try.
@end deffn

@geindex sendcmd() (ftplib.FTP method)
@anchor{library/ftplib ftplib FTP sendcmd}@anchor{4084}
@deffn {Method} sendcmd (cmd)

Send a simple command string to the server and return the response string.

Raises an @ref{1cb1,,auditing event} @code{ftplib.sendcmd} with arguments @code{self}, @code{cmd}.
@end deffn

@geindex voidcmd() (ftplib.FTP method)
@anchor{library/ftplib ftplib FTP voidcmd}@anchor{4085}
@deffn {Method} voidcmd (cmd)

Send a simple command string to the server and handle the response.  Return
the response string if the response code corresponds to success (codes in
the range 200–299).  Raise @ref{4086,,error_reply} otherwise.

Raises an @ref{1cb1,,auditing event} @code{ftplib.sendcmd} with arguments @code{self}, @code{cmd}.
@end deffn

@geindex retrbinary() (ftplib.FTP method)
@anchor{library/ftplib ftplib FTP retrbinary}@anchor{4087}
@deffn {Method} retrbinary (cmd, callback, blocksize=8192, rest=None)

Retrieve a file in binary transfer mode.

@*Parameters: 

@itemize *

@item 
@code{cmd} (@ref{16a,,str}) – An appropriate @code{RETR} command: @code{"RETR @var{filename}"}.

@item 
@code{callback} (@ref{2dec,,callable}) – A single parameter callable that is called
for each block of data received,
with its single argument being the data as @ref{193,,bytes}.

@item 
@code{blocksize} (@ref{19c,,int}) – The maximum chunk size to read on the low-level
@ref{fa7,,socket} object created to do the actual transfer.
This also corresponds to the largest size of data
that will be passed to `callback'.
Defaults to @code{8192}.

@item 
@code{rest} (@ref{19c,,int}) – A @code{REST} command to be sent to the server.
See the documentation for the `rest' parameter of the @ref{4088,,transfercmd()} method.
@end itemize

@end deffn

@geindex retrlines() (ftplib.FTP method)
@anchor{library/ftplib ftplib FTP retrlines}@anchor{4089}
@deffn {Method} retrlines (cmd, callback=None)

Retrieve a file or directory listing in the encoding specified by the
`encoding' parameter at initialization.
`cmd' should be an appropriate @code{RETR} command (see @ref{4087,,retrbinary()}) or
a command such as @code{LIST} or @code{NLST} (usually just the string @code{'LIST'}).
@code{LIST} retrieves a list of files and information about those files.
@code{NLST} retrieves a list of file names.
The `callback' function is called for each line with a string argument
containing the line with the trailing CRLF stripped.  The default `callback'
prints the line to @ref{cd3,,sys.stdout}.
@end deffn

@geindex set_pasv() (ftplib.FTP method)
@anchor{library/ftplib ftplib FTP set_pasv}@anchor{408a}
@deffn {Method} set_pasv (val)

Enable “passive” mode if `val' is true, otherwise disable passive mode.
Passive mode is on by default.
@end deffn

@geindex storbinary() (ftplib.FTP method)
@anchor{library/ftplib ftplib FTP storbinary}@anchor{1515}
@deffn {Method} storbinary (cmd, fp, blocksize=8192, callback=None, rest=None)

Store a file in binary transfer mode.

@*Parameters: 

@itemize *

@item 
@code{cmd} (@ref{16a,,str}) – An appropriate @code{STOR} command: @code{"STOR @var{filename}"}.

@item 
@code{fp} (@ref{13cf,,file object}) – A file object (opened in binary mode) which is read until EOF,
using its @ref{1023,,read()} method in blocks of size `blocksize'
to provide the data to be stored.

@item 
@code{blocksize} (@ref{19c,,int}) – The read block size.
Defaults to @code{8192}.

@item 
@code{callback} (@ref{2dec,,callable}) – A single parameter callable that is called
for each block of data sent,
with its single argument being the data as @ref{193,,bytes}.

@item 
@code{rest} (@ref{19c,,int}) – A @code{REST} command to be sent to the server.
See the documentation for the `rest' parameter of the @ref{4088,,transfercmd()} method.
@end itemize



Changed in version 3.2: The `rest' parameter was added.

@end deffn

@geindex storlines() (ftplib.FTP method)
@anchor{library/ftplib ftplib FTP storlines}@anchor{408b}
@deffn {Method} storlines (cmd, fp, callback=None)

Store a file in line mode.  `cmd' should be an appropriate
@code{STOR} command (see @ref{1515,,storbinary()}).  Lines are read until EOF from the
@ref{13cf,,file object} `fp' (opened in binary mode) using its @ref{1535,,readline()}
method to provide the data to be stored.  `callback' is an optional single
parameter callable that is called on each line after it is sent.
@end deffn

@geindex transfercmd() (ftplib.FTP method)
@anchor{library/ftplib ftplib FTP transfercmd}@anchor{4088}
@deffn {Method} transfercmd (cmd, rest=None)

Initiate a transfer over the data connection.  If the transfer is active, send an
@code{EPRT} or  @code{PORT} command and the transfer command specified by `cmd', and
accept the connection.  If the server is passive, send an @code{EPSV} or @code{PASV}
command, connect to it, and start the transfer command.  Either way, return the
socket for the connection.

If optional `rest' is given, a @code{REST} command is sent to the server, passing
`rest' as an argument.  `rest' is usually a byte offset into the requested file,
telling the server to restart sending the file’s bytes at the requested offset,
skipping over the initial bytes.  Note however that the @code{transfercmd()}
method converts `rest' to a string with the `encoding' parameter specified
at initialization, but no check is performed on the string’s contents.  If the
server does not recognize the @code{REST} command, an @ref{4086,,error_reply} exception
will be raised.  If this happens, simply call @code{transfercmd()} without a
`rest' argument.
@end deffn

@geindex ntransfercmd() (ftplib.FTP method)
@anchor{library/ftplib ftplib FTP ntransfercmd}@anchor{408c}
@deffn {Method} ntransfercmd (cmd, rest=None)

Like @ref{4088,,transfercmd()}, but returns a tuple of the data connection and the
expected size of the data.  If the expected size could not be computed, @code{None}
will be returned as the expected size.  `cmd' and `rest' means the same thing as
in @code{transfercmd()}.
@end deffn

@geindex mlsd() (ftplib.FTP method)
@anchor{library/ftplib ftplib FTP mlsd}@anchor{12ce}
@deffn {Method} mlsd (path='@w{'}, facts=[])

List a directory in a standardized format by using @code{MLSD} command
(
@geindex RFC; RFC 3659
RFC 3659@footnote{https://datatracker.ietf.org/doc/html/rfc3659.html}).  If `path' is omitted the current directory is assumed.
`facts' is a list of strings representing the type of information desired
(e.g. @code{["type", "size", "perm"]}).  Return a generator object yielding a
tuple of two elements for every file found in path.  First element is the
file name, the second one is a dictionary containing facts about the file
name.  Content of this dictionary might be limited by the `facts' argument
but server is not guaranteed to return all requested facts.


Added in version 3.3.

@end deffn

@geindex nlst() (ftplib.FTP method)
@anchor{library/ftplib ftplib FTP nlst}@anchor{12cf}
@deffn {Method} nlst (argument[, ...])

Return a list of file names as returned by the @code{NLST} command.  The
optional `argument' is a directory to list (default is the current server
directory).  Multiple arguments can be used to pass non-standard options to
the @code{NLST} command.

@cartouche
@quotation Note 
If your server supports the command, @ref{12ce,,mlsd()} offers a better API.
@end quotation
@end cartouche
@end deffn

@geindex dir() (ftplib.FTP method)
@anchor{library/ftplib ftplib FTP dir}@anchor{12d0}
@deffn {Method} dir (argument[, ...])

Produce a directory listing as returned by the @code{LIST} command, printing it to
standard output.  The optional `argument' is a directory to list (default is the
current server directory).  Multiple arguments can be used to pass non-standard
options to the @code{LIST} command.  If the last argument is a function, it is used
as a `callback' function as for @ref{4089,,retrlines()}; the default prints to
@ref{cd3,,sys.stdout}.  This method returns @code{None}.

@cartouche
@quotation Note 
If your server supports the command, @ref{12ce,,mlsd()} offers a better API.
@end quotation
@end cartouche
@end deffn

@geindex rename() (ftplib.FTP method)
@anchor{library/ftplib ftplib FTP rename}@anchor{408d}
@deffn {Method} rename (fromname, toname)

Rename file `fromname' on the server to `toname'.
@end deffn

@geindex delete() (ftplib.FTP method)
@anchor{library/ftplib ftplib FTP delete}@anchor{408e}
@deffn {Method} delete (filename)

Remove the file named `filename' from the server.  If successful, returns the
text of the response, otherwise raises @ref{408f,,error_perm} on permission errors or
@ref{4086,,error_reply} on other errors.
@end deffn

@geindex cwd() (ftplib.FTP method)
@anchor{library/ftplib ftplib FTP cwd}@anchor{4090}
@deffn {Method} cwd (pathname)

Set the current directory on the server.
@end deffn

@geindex mkd() (ftplib.FTP method)
@anchor{library/ftplib ftplib FTP mkd}@anchor{4091}
@deffn {Method} mkd (pathname)

Create a new directory on the server.
@end deffn

@geindex pwd() (ftplib.FTP method)
@anchor{library/ftplib ftplib FTP pwd}@anchor{4092}
@deffn {Method} pwd ()

Return the pathname of the current directory on the server.
@end deffn

@geindex rmd() (ftplib.FTP method)
@anchor{library/ftplib ftplib FTP rmd}@anchor{4093}
@deffn {Method} rmd (dirname)

Remove the directory named `dirname' on the server.
@end deffn

@geindex size() (ftplib.FTP method)
@anchor{library/ftplib ftplib FTP size}@anchor{4094}
@deffn {Method} size (filename)

Request the size of the file named `filename' on the server.  On success, the
size of the file is returned as an integer, otherwise @code{None} is returned.
Note that the @code{SIZE} command is not  standardized, but is supported by many
common server implementations.
@end deffn

@geindex quit() (ftplib.FTP method)
@anchor{library/ftplib ftplib FTP quit}@anchor{4095}
@deffn {Method} quit ()

Send a @code{QUIT} command to the server and close the connection. This is the
“polite” way to close a connection, but it may raise an exception if the server
responds with an error to the @code{QUIT} command.  This implies a call to the
@ref{4096,,close()} method which renders the @code{FTP} instance useless for
subsequent calls (see below).
@end deffn

@geindex close() (ftplib.FTP method)
@anchor{library/ftplib ftplib FTP close}@anchor{4096}
@deffn {Method} close ()

Close the connection unilaterally.  This should not be applied to an already
closed connection such as after a successful call to @ref{4095,,quit()}.
After this call the @code{FTP} instance should not be used any more (after
a call to @code{close()} or @code{quit()} you cannot reopen the
connection by issuing another @ref{4082,,login()} method).
@end deffn
@end deffn

@node FTP_TLS objects,Module variables,FTP objects,Reference<7>
@anchor{library/ftplib ftp-tls-objects}@anchor{4097}
@subsubsection FTP_TLS objects


@geindex FTP_TLS (class in ftplib)
@anchor{library/ftplib ftplib FTP_TLS}@anchor{afd}
@deffn {Class} ftplib.FTP_TLS (host='@w{'}, user='@w{'}, passwd='@w{'}, acct='@w{'}, *, context=None, timeout=None, source_address=None, encoding='utf-8')

An @ref{afc,,FTP} subclass which adds TLS support to FTP as described in
@geindex RFC; RFC 4217
RFC 4217@footnote{https://datatracker.ietf.org/doc/html/rfc4217.html}.
Connect to port 21 implicitly securing the FTP control connection
before authenticating.

@cartouche
@quotation Note 
The user must explicitly secure the data connection
by calling the @ref{4098,,prot_p()} method.
@end quotation
@end cartouche

@*Parameters: 

@itemize *

@item 
@code{host} (@ref{16a,,str}) – The hostname to connect to.
If given, @code{connect(host)} is implicitly called by the constructor.

@item 
@code{user} (@ref{16a,,str}) – The username to log in with (default: @code{'anonymous'}).
If given, @code{login(host, passwd, acct)} is implicitly called
by the constructor.

@item 
@code{passwd} (@ref{16a,,str}) – The password to use when logging in.
If not given, and if `passwd' is the empty string or @code{"-"},
a password will be automatically generated.

@item 
@code{acct} (@ref{16a,,str}) – Account information to be used for the @code{ACCT} FTP command.
Few systems implement this.
See RFC-959@footnote{https://datatracker.ietf.org/doc/html/rfc959.html}
for more details.

@item 
@code{context} (@ref{355,,ssl.SSLContext}) – An SSL context object which allows bundling SSL configuration options,
certificates and private keys into a single, potentially long-lived,
structure.
Please read @ref{390d,,Security considerations} for best practices.

@item 
@code{timeout} (@ref{197,,float}@code{ | }@code{None}) – A timeout in seconds for blocking operations like @ref{407f,,connect()}
(default: the global default timeout setting).

@item 
@code{source_address} (@ref{614,,tuple}@code{ | }@code{None}) – A 2-tuple @code{(host, port)} for the socket to bind to as its
source address before connecting.

@item 
@code{encoding} (@ref{16a,,str}) – The encoding for directories and filenames (default: @code{'utf-8'}).
@end itemize



Added in version 3.2.



Changed in version 3.3: Added the `source_address' parameter.



Changed in version 3.4: The class now supports hostname check with
@ref{3a49,,ssl.SSLContext.check_hostname} and `Server Name Indication' (see
@ref{3a5b,,ssl.HAS_SNI}).



Changed in version 3.9: If the `timeout' parameter is set to be zero, it will raise a
@ref{2ee,,ValueError} to prevent the creation of a non-blocking socket.
The `encoding' parameter was added, and the default was changed from
Latin-1 to UTF-8 to follow 
@geindex RFC; RFC 2640
RFC 2640@footnote{https://datatracker.ietf.org/doc/html/rfc2640.html}.



Changed in version 3.12: The deprecated `keyfile' and `certfile' parameters have been removed.


Here’s a sample session using the @code{FTP_TLS} class:

@example
>>> ftps = FTP_TLS('ftp.pureftpd.org')
>>> ftps.login()
'230 Anonymous user logged in'
>>> ftps.prot_p()
'200 Data protection level set to "private"'
>>> ftps.nlst()
['6jack', 'OpenBSD', 'antilink', 'blogbench', 'bsdcam', 'clockspeed', 'djbdns-jedi', 'docs', 'eaccelerator-jedi', 'favicon.ico', 'francotone', 'fugu', 'ignore', 'libpuzzle', 'metalog', 'minidentd', 'misc', 'mysql-udf-global-user-variables', 'php-jenkins-hash', 'php-skein-hash', 'php-webdav', 'phpaudit', 'phpbench', 'pincaster', 'ping', 'posto', 'pub', 'public', 'public_keys', 'pure-ftpd', 'qscan', 'qtc', 'sharedance', 'skycache', 'sound', 'tmp', 'ucarp']
@end example

@code{FTP_TLS} class inherits from @ref{afc,,FTP},
defining these additional methods and attributes:

@geindex ssl_version (ftplib.FTP_TLS attribute)
@anchor{library/ftplib ftplib FTP_TLS ssl_version}@anchor{4099}
@deffn {Attribute} ssl_version

The SSL version to use (defaults to @ref{3a4d,,ssl.PROTOCOL_SSLv23}).
@end deffn

@geindex auth() (ftplib.FTP_TLS method)
@anchor{library/ftplib ftplib FTP_TLS auth}@anchor{409a}
@deffn {Method} auth ()

Set up a secure control connection by using TLS or SSL, depending on what
is specified in the @ref{4099,,ssl_version} attribute.


Changed in version 3.4: The method now supports hostname check with
@ref{3a49,,ssl.SSLContext.check_hostname} and `Server Name Indication' (see
@ref{3a5b,,ssl.HAS_SNI}).

@end deffn

@geindex ccc() (ftplib.FTP_TLS method)
@anchor{library/ftplib ftplib FTP_TLS ccc}@anchor{12cd}
@deffn {Method} ccc ()

Revert control channel back to plaintext.  This can be useful to take
advantage of firewalls that know how to handle NAT with non-secure FTP
without opening fixed ports.


Added in version 3.3.

@end deffn

@geindex prot_p() (ftplib.FTP_TLS method)
@anchor{library/ftplib ftplib FTP_TLS prot_p}@anchor{4098}
@deffn {Method} prot_p ()

Set up secure data connection.
@end deffn

@geindex prot_c() (ftplib.FTP_TLS method)
@anchor{library/ftplib ftplib FTP_TLS prot_c}@anchor{409b}
@deffn {Method} prot_c ()

Set up clear text data connection.
@end deffn
@end deffn

@node Module variables,,FTP_TLS objects,Reference<7>
@anchor{library/ftplib module-variables}@anchor{409c}
@subsubsection Module variables


@geindex error_reply
@anchor{library/ftplib ftplib error_reply}@anchor{4086}
@deffn {Exception} ftplib.error_reply

Exception raised when an unexpected reply is received from the server.
@end deffn

@geindex error_temp
@anchor{library/ftplib ftplib error_temp}@anchor{409d}
@deffn {Exception} ftplib.error_temp

Exception raised when an error code signifying a temporary error (response
codes in the range 400–499) is received.
@end deffn

@geindex error_perm
@anchor{library/ftplib ftplib error_perm}@anchor{408f}
@deffn {Exception} ftplib.error_perm

Exception raised when an error code signifying a permanent error (response
codes in the range 500–599) is received.
@end deffn

@geindex error_proto
@anchor{library/ftplib ftplib error_proto}@anchor{409e}
@deffn {Exception} ftplib.error_proto

Exception raised when a reply is received from the server that does not fit
the response specifications of the File Transfer Protocol, i.e. begin with a
digit in the range 1–5.
@end deffn

@geindex all_errors (in module ftplib)
@anchor{library/ftplib ftplib all_errors}@anchor{409f}
@deffn {Data} ftplib.all_errors

The set of all exceptions (as a tuple) that methods of @ref{afc,,FTP}
instances may raise as a result of problems with the FTP connection (as
opposed to programming errors made by the caller).  This set includes the
four exceptions listed above as well as @ref{2c2,,OSError} and @ref{14e5,,EOFError}.
@end deffn


@subsubheading See also



@table @asis

@item Module @ref{9f,,netrc}

Parser for the @code{.netrc} file format.  The file @code{.netrc} is
typically used by FTP clients to load user authentication information
before prompting the user.
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node poplib — POP3 protocol client,imaplib — IMAP4 protocol client,ftplib — FTP protocol client,Internet Protocols and Support
@anchor{library/poplib doc}@anchor{40a0}@anchor{library/poplib module-poplib}@anchor{b1}@anchor{library/poplib poplib-pop3-protocol-client}@anchor{40a1}@anchor{library/poplib translation-repo}@anchor{40a2}
@subsection @code{poplib} — POP3 protocol client


@geindex module; poplib

@c revised by ESR, January 2000

`Source code:' Lib/poplib.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/poplib.py}

@geindex POP3; protocol


__________________________________________________________________


This module defines a class, @ref{b23,,POP3}, which encapsulates a connection to a
POP3 server and implements the protocol as defined in 
@geindex RFC; RFC 1939
RFC 1939@footnote{https://datatracker.ietf.org/doc/html/rfc1939.html}. The
@code{POP3} class supports both the minimal and optional command sets from
@geindex RFC; RFC 1939
RFC 1939@footnote{https://datatracker.ietf.org/doc/html/rfc1939.html}. The @code{POP3} class also supports the @code{STLS} command introduced
in 
@geindex RFC; RFC 2595
RFC 2595@footnote{https://datatracker.ietf.org/doc/html/rfc2595.html} to enable encrypted communication on an already established connection.

Additionally, this module provides a class @ref{b24,,POP3_SSL}, which provides
support for connecting to POP3 servers that use SSL as an underlying protocol
layer.

Note that POP3, though widely supported, is obsolescent.  The implementation
quality of POP3 servers varies widely, and too many are quite poor. If your
mailserver supports IMAP, you would be better off using the
@ref{b05,,imaplib.IMAP4} class, as IMAP servers tend to be better implemented.

@c include for modules that don't work on WASM

@ref{2181,,Availability}: not WASI.

This module does not work or is not available on WebAssembly. See
@ref{1bae,,WebAssembly platforms} for more information.

The @code{poplib} module provides two classes:

@geindex POP3 (class in poplib)
@anchor{library/poplib poplib POP3}@anchor{b23}
@deffn {Class} poplib.POP3 (host, port=POP3_PORT[, timeout])

This class implements the actual POP3 protocol.  The connection is created when
the instance is initialized. If `port' is omitted, the standard POP3 port (110)
is used. The optional `timeout' parameter specifies a timeout in seconds for the
connection attempt (if not specified, the global default timeout setting will
be used).

Raises an @ref{1cb1,,auditing event} @code{poplib.connect} with arguments @code{self}, @code{host}, @code{port}.


All commands will raise an @ref{1cb1,,auditing event}
@code{poplib.putline} with arguments @code{self} and @code{line},
where @code{line} is the bytes about to be sent to the remote host.



Changed in version 3.9: If the `timeout' parameter is set to be zero, it will raise a
@ref{2ee,,ValueError} to prevent the creation of a non-blocking socket.

@end deffn

@geindex POP3_SSL (class in poplib)
@anchor{library/poplib poplib POP3_SSL}@anchor{b24}
@deffn {Class} poplib.POP3_SSL (host, port=POP3_SSL_PORT, *, timeout=None, context=None)

This is a subclass of @ref{b23,,POP3} that connects to the server over an SSL
encrypted socket.  If `port' is not specified, 995, the standard POP3-over-SSL
port is used.  `timeout' works as in the @code{POP3} constructor.
`context' is an optional @ref{355,,ssl.SSLContext} object which allows
bundling SSL configuration options, certificates and private keys into a
single (potentially long-lived) structure.  Please read @ref{390d,,Security considerations}
for best practices.

Raises an @ref{1cb1,,auditing event} @code{poplib.connect} with arguments @code{self}, @code{host}, @code{port}.


All commands will raise an @ref{1cb1,,auditing event}
@code{poplib.putline} with arguments @code{self} and @code{line},
where @code{line} is the bytes about to be sent to the remote host.



Changed in version 3.2: `context' parameter added.



Changed in version 3.4: The class now supports hostname check with
@ref{3a49,,ssl.SSLContext.check_hostname} and `Server Name Indication' (see
@ref{3a5b,,ssl.HAS_SNI}).



Changed in version 3.9: If the `timeout' parameter is set to be zero, it will raise a
@ref{2ee,,ValueError} to prevent the creation of a non-blocking socket.



Changed in version 3.12: The deprecated `keyfile' and `certfile' parameters have been removed.

@end deffn

One exception is defined as an attribute of the @code{poplib} module:

@geindex error_proto
@anchor{library/poplib poplib error_proto}@anchor{13a8}
@deffn {Exception} poplib.error_proto

Exception raised on any errors from this module (errors from @ref{d1,,socket}
module are not caught). The reason for the exception is passed to the
constructor as a string.
@end deffn


@subsubheading See also



@table @asis

@item Module @ref{78,,imaplib}

The standard Python IMAP module.

@item Frequently Asked Questions About Fetchmail@footnote{http://www.catb.org/~esr/fetchmail/fetchmail-FAQ.html}

The FAQ for the @code{fetchmail} POP/IMAP client collects information on
POP3 server variations and RFC noncompliance that may be useful if you need to
write an application based on the POP protocol.
@end table


@menu
* POP3 Objects:: 
* POP3 Example:: 

@end menu

@node POP3 Objects,POP3 Example,,poplib — POP3 protocol client
@anchor{library/poplib id1}@anchor{40a3}@anchor{library/poplib pop3-objects}@anchor{40a4}
@subsubsection POP3 Objects


All POP3 commands are represented by methods of the same name, in lowercase;
most return the response text sent by the server.

A @ref{b23,,POP3} instance has the following methods:

@geindex set_debuglevel() (poplib.POP3 method)
@anchor{library/poplib poplib POP3 set_debuglevel}@anchor{40a5}
@deffn {Method} POP3.set_debuglevel (level)

Set the instance’s debugging level.  This controls the amount of debugging
output printed.  The default, @code{0}, produces no debugging output.  A value of
@code{1} produces a moderate amount of debugging output, generally a single line
per request.  A value of @code{2} or higher produces the maximum amount of
debugging output, logging each line sent and received on the control connection.
@end deffn

@geindex getwelcome() (poplib.POP3 method)
@anchor{library/poplib poplib POP3 getwelcome}@anchor{40a6}
@deffn {Method} POP3.getwelcome ()

Returns the greeting string sent by the POP3 server.
@end deffn

@geindex capa() (poplib.POP3 method)
@anchor{library/poplib poplib POP3 capa}@anchor{1182}
@deffn {Method} POP3.capa ()

Query the server’s capabilities as specified in 
@geindex RFC; RFC 2449
RFC 2449@footnote{https://datatracker.ietf.org/doc/html/rfc2449.html}.
Returns a dictionary in the form @code{@{'name': ['param'...]@}}.


Added in version 3.4.

@end deffn

@geindex user() (poplib.POP3 method)
@anchor{library/poplib poplib POP3 user}@anchor{40a7}
@deffn {Method} POP3.user (username)

Send user command, response should indicate that a password is required.
@end deffn

@geindex pass_() (poplib.POP3 method)
@anchor{library/poplib poplib POP3 pass_}@anchor{40a8}
@deffn {Method} POP3.pass_ (password)

Send password, response includes message count and mailbox size. Note: the
mailbox on the server is locked until @ref{13a7,,quit()} is called.
@end deffn

@geindex apop() (poplib.POP3 method)
@anchor{library/poplib poplib POP3 apop}@anchor{40a9}
@deffn {Method} POP3.apop (user, secret)

Use the more secure APOP authentication to log into the POP3 server.
@end deffn

@geindex rpop() (poplib.POP3 method)
@anchor{library/poplib poplib POP3 rpop}@anchor{40aa}
@deffn {Method} POP3.rpop (user)

Use RPOP authentication (similar to UNIX r-commands) to log into POP3 server.
@end deffn

@geindex stat() (poplib.POP3 method)
@anchor{library/poplib poplib POP3 stat}@anchor{40ab}
@deffn {Method} POP3.stat ()

Get mailbox status.  The result is a tuple of 2 integers: @code{(message count,
mailbox size)}.
@end deffn

@geindex list() (poplib.POP3 method)
@anchor{library/poplib poplib POP3 list}@anchor{40ac}
@deffn {Method} POP3.list ([which])

Request message list, result is in the form @code{(response, ['mesg_num octets',
...], octets)}. If `which' is set, it is the message to list.
@end deffn

@geindex retr() (poplib.POP3 method)
@anchor{library/poplib poplib POP3 retr}@anchor{40ad}
@deffn {Method} POP3.retr (which)

Retrieve whole message number `which', and set its seen flag. Result is in form
@code{(response, ['line', ...], octets)}.
@end deffn

@geindex dele() (poplib.POP3 method)
@anchor{library/poplib poplib POP3 dele}@anchor{40ae}
@deffn {Method} POP3.dele (which)

Flag message number `which' for deletion.  On most servers deletions are not
actually performed until QUIT (the major exception is Eudora QPOP, which
deliberately violates the RFCs by doing pending deletes on any disconnect).
@end deffn

@geindex rset() (poplib.POP3 method)
@anchor{library/poplib poplib POP3 rset}@anchor{40af}
@deffn {Method} POP3.rset ()

Remove any deletion marks for the mailbox.
@end deffn

@geindex noop() (poplib.POP3 method)
@anchor{library/poplib poplib POP3 noop}@anchor{40b0}
@deffn {Method} POP3.noop ()

Do nothing.  Might be used as a keep-alive.
@end deffn

@geindex quit() (poplib.POP3 method)
@anchor{library/poplib poplib POP3 quit}@anchor{13a7}
@deffn {Method} POP3.quit ()

Signoff:  commit changes, unlock mailbox, drop connection.
@end deffn

@geindex top() (poplib.POP3 method)
@anchor{library/poplib poplib POP3 top}@anchor{40b1}
@deffn {Method} POP3.top (which, howmuch)

Retrieves the message header plus `howmuch' lines of the message after the
header of message number `which'. Result is in form @code{(response, ['line', ...],
octets)}.

The POP3 TOP command this method uses, unlike the RETR command, doesn’t set the
message’s seen flag; unfortunately, TOP is poorly specified in the RFCs and is
frequently broken in off-brand servers. Test this method by hand against the
POP3 servers you will use before trusting it.
@end deffn

@geindex uidl() (poplib.POP3 method)
@anchor{library/poplib poplib POP3 uidl}@anchor{40b2}
@deffn {Method} POP3.uidl (which=None)

Return message digest (unique id) list. If `which' is specified, result contains
the unique id for that message in the form @code{'response mesgnum uid}, otherwise
result is list @code{(response, ['mesgnum uid', ...], octets)}.
@end deffn

@geindex utf8() (poplib.POP3 method)
@anchor{library/poplib poplib POP3 utf8}@anchor{104f}
@deffn {Method} POP3.utf8 ()

Try to switch to UTF-8 mode. Returns the server response if successful,
raises @ref{13a8,,error_proto} if not. Specified in 
@geindex RFC; RFC 6856
RFC 6856@footnote{https://datatracker.ietf.org/doc/html/rfc6856.html}.


Added in version 3.5.

@end deffn

@geindex stls() (poplib.POP3 method)
@anchor{library/poplib poplib POP3 stls}@anchor{1183}
@deffn {Method} POP3.stls (context=None)

Start a TLS session on the active connection as specified in 
@geindex RFC; RFC 2595
RFC 2595@footnote{https://datatracker.ietf.org/doc/html/rfc2595.html}.
This is only allowed before user authentication

`context' parameter is a @ref{355,,ssl.SSLContext} object which allows
bundling SSL configuration options, certificates and private keys into
a single (potentially long-lived) structure.  Please read @ref{390d,,Security considerations}
for best practices.

This method supports hostname checking via
@ref{3a49,,ssl.SSLContext.check_hostname} and `Server Name Indication' (see
@ref{3a5b,,ssl.HAS_SNI}).


Added in version 3.4.

@end deffn

Instances of @ref{b24,,POP3_SSL} have no additional methods. The interface of this
subclass is identical to its parent.

@node POP3 Example,,POP3 Objects,poplib — POP3 protocol client
@anchor{library/poplib id2}@anchor{40b3}@anchor{library/poplib pop3-example}@anchor{40b4}
@subsubsection POP3 Example


Here is a minimal example (without error checking) that opens a mailbox and
retrieves and prints all messages:

@example
import getpass, poplib

M = poplib.POP3('localhost')
M.user(getpass.getuser())
M.pass_(getpass.getpass())
numMessages = len(M.list()[1])
for i in range(numMessages):
    for j in M.retr(i+1)[1]:
        print(j)
@end example

At the end of the module, there is a test section that contains a more extensive
example of usage.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node imaplib — IMAP4 protocol client,smtplib — SMTP protocol client,poplib — POP3 protocol client,Internet Protocols and Support
@anchor{library/imaplib doc}@anchor{40b5}@anchor{library/imaplib imaplib-imap4-protocol-client}@anchor{40b6}@anchor{library/imaplib module-imaplib}@anchor{78}@anchor{library/imaplib translation-repo}@anchor{40b7}
@subsection @code{imaplib} — IMAP4 protocol client


@geindex module; imaplib

@c revised by ESR, January 2000

@c changes for IMAP4_SSL by Tino Lange <Tino.Lange@isg.de>, March 2002

@c changes for IMAP4_stream by Piers Lauder <piers@communitysolutions.com.au>,
@c November 2002

@c changes for IMAP4 IDLE by Forest <forestix@nom.one>, August 2024

`Source code:' Lib/imaplib.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/imaplib.py}

@geindex IMAP4; protocol
@geindex IMAP4_SSL; protocol
@geindex IMAP4_stream; protocol


__________________________________________________________________


This module defines three classes, @ref{b05,,IMAP4}, @ref{b06,,IMAP4_SSL} and
@ref{b08,,IMAP4_stream}, which encapsulate a connection to an IMAP4 server and
implement a large subset of the IMAP4rev1 client protocol as defined in
@geindex RFC; RFC 2060
RFC 2060@footnote{https://datatracker.ietf.org/doc/html/rfc2060.html}. It is backward compatible with IMAP4 (
@geindex RFC; RFC 1730
RFC 1730@footnote{https://datatracker.ietf.org/doc/html/rfc1730.html}) servers, but
note that the @code{STATUS} command is not supported in IMAP4.

@c include for modules that don't work on WASM

@ref{2181,,Availability}: not WASI.

This module does not work or is not available on WebAssembly. See
@ref{1bae,,WebAssembly platforms} for more information.

Three classes are provided by the @code{imaplib} module, @ref{b05,,IMAP4} is the
base class:

@geindex IMAP4 (class in imaplib)
@anchor{library/imaplib imaplib IMAP4}@anchor{b05}
@deffn {Class} imaplib.IMAP4 (host='@w{'}, port=IMAP4_PORT, timeout=None)

This class implements the actual IMAP4 protocol.  The connection is created and
protocol version (IMAP4 or IMAP4rev1) is determined when the instance is
initialized. If `host' is not specified, @code{'@w{'}} (the local host) is used. If
`port' is omitted, the standard IMAP4 port (143) is used. The optional `timeout'
parameter specifies a timeout in seconds for the connection attempt.
If timeout is not given or is @code{None}, the global default socket timeout is used.

The @code{IMAP4} class supports the @ref{187,,with} statement.  When used
like this, the IMAP4 @code{LOGOUT} command is issued automatically when the
@code{with} statement exits.  E.g.:

@example
>>> from imaplib import IMAP4
>>> with IMAP4("domain.org") as M:
...     M.noop()
...
('OK', [b'Nothing Accomplished. d25if65hy903weo.87'])
@end example


Changed in version 3.5: Support for the @ref{187,,with} statement was added.



Changed in version 3.9: The optional `timeout' parameter was added.

@end deffn

Three exceptions are defined as attributes of the @ref{b05,,IMAP4} class:

@geindex IMAP4.error
@anchor{library/imaplib imaplib IMAP4 error}@anchor{1841}
@deffn {Exception} IMAP4.error

Exception raised on any errors.  The reason for the exception is passed to the
constructor as a string.
@end deffn

@geindex IMAP4.abort
@anchor{library/imaplib imaplib IMAP4 abort}@anchor{40b8}
@deffn {Exception} IMAP4.abort

IMAP4 server errors cause this exception to be raised.  This is a sub-class of
@ref{1841,,IMAP4.error}.  Note that closing the instance and instantiating a new one
will usually allow recovery from this exception.
@end deffn

@geindex IMAP4.readonly
@anchor{library/imaplib imaplib IMAP4 readonly}@anchor{40b9}
@deffn {Exception} IMAP4.readonly

This exception is raised when a writable mailbox has its status changed by the
server.  This is a sub-class of @ref{1841,,IMAP4.error}.  Some other client now has
write permission, and the mailbox will need to be re-opened to re-obtain write
permission.
@end deffn

There’s also a subclass for secure connections:

@geindex IMAP4_SSL (class in imaplib)
@anchor{library/imaplib imaplib IMAP4_SSL}@anchor{b06}
@deffn {Class} imaplib.IMAP4_SSL (host='@w{'}, port=IMAP4_SSL_PORT, *, ssl_context=None, timeout=None)

This is a subclass derived from @ref{b05,,IMAP4} that connects over an SSL
encrypted socket (to use this class you need a socket module that was compiled
with SSL support).  If `host' is not specified, @code{'@w{'}} (the local host) is used.
If `port' is omitted, the standard IMAP4-over-SSL port (993) is used.
`ssl_context' is a @ref{355,,ssl.SSLContext} object which allows bundling
SSL configuration options, certificates and private keys into a single
(potentially long-lived) structure.  Please read @ref{390d,,Security considerations} for
best practices.

The optional `timeout' parameter specifies a timeout in seconds for the
connection attempt. If timeout is not given or is @code{None}, the global default
socket timeout is used.


Changed in version 3.3: `ssl_context' parameter was added.



Changed in version 3.4: The class now supports hostname check with
@ref{3a49,,ssl.SSLContext.check_hostname} and `Server Name Indication' (see
@ref{3a5b,,ssl.HAS_SNI}).



Changed in version 3.9: The optional `timeout' parameter was added.



Changed in version 3.12: The deprecated `keyfile' and `certfile' parameters have been removed.

@end deffn

The second subclass allows for connections created by a child process:

@geindex IMAP4_stream (class in imaplib)
@anchor{library/imaplib imaplib IMAP4_stream}@anchor{b08}
@deffn {Class} imaplib.IMAP4_stream (command)

This is a subclass derived from @ref{b05,,IMAP4} that connects to the
@code{stdin/stdout} file descriptors created by passing `command' to
@code{subprocess.Popen()}.
@end deffn

The following utility functions are defined:

@geindex Internaldate2tuple() (in module imaplib)
@anchor{library/imaplib imaplib Internaldate2tuple}@anchor{40ba}
@deffn {Function} imaplib.Internaldate2tuple (datestr)

Parse an IMAP4 @code{INTERNALDATE} string and return corresponding local
time.  The return value is a @ref{eec,,time.struct_time} tuple or
@code{None} if the string has wrong format.
@end deffn

@geindex Int2AP() (in module imaplib)
@anchor{library/imaplib imaplib Int2AP}@anchor{40bb}
@deffn {Function} imaplib.Int2AP (num)

Converts an integer into a bytes representation using characters from the set
[@code{A} .. @code{P}].
@end deffn

@geindex ParseFlags() (in module imaplib)
@anchor{library/imaplib imaplib ParseFlags}@anchor{40bc}
@deffn {Function} imaplib.ParseFlags (flagstr)

Converts an IMAP4 @code{FLAGS} response to a tuple of individual flags.
@end deffn

@geindex Time2Internaldate() (in module imaplib)
@anchor{library/imaplib imaplib Time2Internaldate}@anchor{40bd}
@deffn {Function} imaplib.Time2Internaldate (date_time)

Convert `date_time' to an IMAP4 @code{INTERNALDATE} representation.
The return value is a string in the form: @code{"DD-Mmm-YYYY HH:MM:SS
+HHMM"} (including double-quotes).  The `date_time' argument can
be a number (int or float) representing seconds since epoch (as
returned by @ref{55d,,time.time()}), a 9-tuple representing local time
an instance of @ref{eec,,time.struct_time} (as returned by
@ref{1705,,time.localtime()}), an aware instance of
@ref{4e3,,datetime.datetime}, or a double-quoted string.  In the last
case, it is assumed to already be in the correct format.
@end deffn

Note that IMAP4 message numbers change as the mailbox changes; in particular,
after an @code{EXPUNGE} command performs deletions the remaining messages are
renumbered. So it is highly advisable to use UIDs instead, with the UID command.

At the end of the module, there is a test section that contains a more extensive
example of usage.


@subsubheading See also


Documents describing the protocol, sources for servers
implementing it, by the University of Washington’s IMAP Information Center
can all be found at (`Source Code') @indicateurl{https://github.com/uw-imap/imap} (`Not Maintained').


@menu
* IMAP4 Objects:: 
* IMAP4 Example:: 

@end menu

@node IMAP4 Objects,IMAP4 Example,,imaplib — IMAP4 protocol client
@anchor{library/imaplib id1}@anchor{40be}@anchor{library/imaplib imap4-objects}@anchor{40bf}
@subsubsection IMAP4 Objects


All IMAP4rev1 commands are represented by methods of the same name, either
uppercase or lowercase.

All arguments to commands are converted to strings, except for @code{AUTHENTICATE},
and the last argument to @code{APPEND} which is passed as an IMAP4 literal.  If
necessary (the string contains IMAP4 protocol-sensitive characters and isn’t
enclosed with either parentheses or double quotes) each string is quoted.
However, the `password' argument to the @code{LOGIN} command is always quoted. If
you want to avoid having an argument string quoted (eg: the `flags' argument to
@code{STORE}) then enclose the string in parentheses (eg: @code{r'(\Deleted)'}).

Most commands return a tuple: @code{(type, [data, ...])} where `type' is usually
@code{'OK'} or @code{'NO'}, and `data' is either the text from the command response,
or mandated results from the command. Each `data' is either a @code{bytes}, or a
tuple. If a tuple, then the first part is the header of the response, and the
second part contains the data (ie: ‘literal’ value).

The `message_set' options to commands below is a string specifying one or more
messages to be acted upon.  It may be a simple message number (@code{'1'}), a range
of message numbers (@code{'2:4'}), or a group of non-contiguous ranges separated by
commas (@code{'1:3,6:9'}).  A range can contain an asterisk to indicate an infinite
upper bound (@code{'3:*'}).

An @ref{b05,,IMAP4} instance has the following methods:

@geindex append() (imaplib.IMAP4 method)
@anchor{library/imaplib imaplib IMAP4 append}@anchor{40c0}
@deffn {Method} IMAP4.append (mailbox, flags, date_time, message)

Append `message' to named mailbox.
@end deffn

@geindex authenticate() (imaplib.IMAP4 method)
@anchor{library/imaplib imaplib IMAP4 authenticate}@anchor{40c1}
@deffn {Method} IMAP4.authenticate (mechanism, authobject)

Authenticate command — requires response processing.

`mechanism' specifies which authentication mechanism is to be used - it should
appear in the instance variable @code{capabilities} in the form @code{AUTH=mechanism}.

`authobject' must be a callable object:

@example
data = authobject(response)
@end example

It will be called to process server continuation responses; the `response'
argument it is passed will be @code{bytes}.  It should return @code{bytes} `data'
that will be base64 encoded and sent to the server.  It should return
@code{None} if the client abort response @code{*} should be sent instead.


Changed in version 3.5: string usernames and passwords are now encoded to @code{utf-8} instead of
being limited to ASCII.

@end deffn

@geindex check() (imaplib.IMAP4 method)
@anchor{library/imaplib imaplib IMAP4 check}@anchor{40c2}
@deffn {Method} IMAP4.check ()

Checkpoint mailbox on server.
@end deffn

@geindex close() (imaplib.IMAP4 method)
@anchor{library/imaplib imaplib IMAP4 close}@anchor{b0a}
@deffn {Method} IMAP4.close ()

Close currently selected mailbox. Deleted messages are removed from writable
mailbox. This is the recommended command before @code{LOGOUT}.
@end deffn

@geindex copy() (imaplib.IMAP4 method)
@anchor{library/imaplib imaplib IMAP4 copy}@anchor{40c3}
@deffn {Method} IMAP4.copy (message_set, new_mailbox)

Copy `message_set' messages onto end of `new_mailbox'.
@end deffn

@geindex create() (imaplib.IMAP4 method)
@anchor{library/imaplib imaplib IMAP4 create}@anchor{40c4}
@deffn {Method} IMAP4.create (mailbox)

Create new mailbox named `mailbox'.
@end deffn

@geindex delete() (imaplib.IMAP4 method)
@anchor{library/imaplib imaplib IMAP4 delete}@anchor{40c5}
@deffn {Method} IMAP4.delete (mailbox)

Delete old mailbox named `mailbox'.
@end deffn

@geindex deleteacl() (imaplib.IMAP4 method)
@anchor{library/imaplib imaplib IMAP4 deleteacl}@anchor{40c6}
@deffn {Method} IMAP4.deleteacl (mailbox, who)

Delete the ACLs (remove any rights) set for who on mailbox.
@end deffn

@geindex enable() (imaplib.IMAP4 method)
@anchor{library/imaplib imaplib IMAP4 enable}@anchor{1014}
@deffn {Method} IMAP4.enable (capability)

Enable `capability' (see 
@geindex RFC; RFC 5161
RFC 5161@footnote{https://datatracker.ietf.org/doc/html/rfc5161.html}).  Most capabilities do not need to be
enabled.  Currently only the @code{UTF8=ACCEPT} capability is supported
(see 
@geindex RFC; RFC 6855
RFC 6855@footnote{https://datatracker.ietf.org/doc/html/rfc6855.html}).


Added in version 3.5: The @code{enable()} method itself, and 
@geindex RFC; RFC 6855
RFC 6855@footnote{https://datatracker.ietf.org/doc/html/rfc6855.html} support.

@end deffn

@geindex expunge() (imaplib.IMAP4 method)
@anchor{library/imaplib imaplib IMAP4 expunge}@anchor{40c7}
@deffn {Method} IMAP4.expunge ()

Permanently remove deleted items from selected mailbox. Generates an @code{EXPUNGE}
response for each deleted message. Returned data contains a list of @code{EXPUNGE}
message numbers in order received.
@end deffn

@geindex fetch() (imaplib.IMAP4 method)
@anchor{library/imaplib imaplib IMAP4 fetch}@anchor{40c8}
@deffn {Method} IMAP4.fetch (message_set, message_parts)

Fetch (parts of) messages.  `message_parts' should be a string of message part
names enclosed within parentheses, eg: @code{"(UID BODY[TEXT])"}.  Returned data
are tuples of message part envelope and data.
@end deffn

@geindex getacl() (imaplib.IMAP4 method)
@anchor{library/imaplib imaplib IMAP4 getacl}@anchor{40c9}
@deffn {Method} IMAP4.getacl (mailbox)

Get the @code{ACL}s for `mailbox'. The method is non-standard, but is supported
by the @code{Cyrus} server.
@end deffn

@geindex getannotation() (imaplib.IMAP4 method)
@anchor{library/imaplib imaplib IMAP4 getannotation}@anchor{40ca}
@deffn {Method} IMAP4.getannotation (mailbox, entry, attribute)

Retrieve the specified @code{ANNOTATION}s for `mailbox'. The method is
non-standard, but is supported by the @code{Cyrus} server.
@end deffn

@geindex getquota() (imaplib.IMAP4 method)
@anchor{library/imaplib imaplib IMAP4 getquota}@anchor{40cb}
@deffn {Method} IMAP4.getquota (root)

Get the @code{quota} `root'’s resource usage and limits. This method is part of the
IMAP4 QUOTA extension defined in rfc2087.
@end deffn

@geindex getquotaroot() (imaplib.IMAP4 method)
@anchor{library/imaplib imaplib IMAP4 getquotaroot}@anchor{40cc}
@deffn {Method} IMAP4.getquotaroot (mailbox)

Get the list of @code{quota} @code{roots} for the named `mailbox'. This method is part
of the IMAP4 QUOTA extension defined in rfc2087.
@end deffn

@geindex idle() (imaplib.IMAP4 method)
@anchor{library/imaplib imaplib IMAP4 idle}@anchor{22f}
@deffn {Method} IMAP4.idle (duration=None)

Return an @code{Idler}: an iterable context manager implementing the
IMAP4 @code{IDLE} command as defined in 
@geindex RFC; RFC 2177
RFC 2177@footnote{https://datatracker.ietf.org/doc/html/rfc2177.html}.

The returned object sends the @code{IDLE} command when activated by the
@ref{187,,with} statement, produces IMAP untagged responses via the
@ref{4c9,,iterator} protocol, and sends @code{DONE} upon context exit.

All untagged responses that arrive after sending the @code{IDLE} command
(including any that arrive before the server acknowledges the command) will
be available via iteration. Any leftover responses (those not iterated in
the @ref{187,,with} context) can be retrieved in the usual way after
@code{IDLE} ends, using @ref{40cd,,IMAP4.response()}.

Responses are represented as @code{(type, [data, ...])} tuples, as described
in @ref{40bf,,IMAP4 Objects}.

The `duration' argument sets a maximum duration (in seconds) to keep idling,
after which any ongoing iteration will stop. It can be an @ref{19c,,int} or
@ref{197,,float}, or @code{None} for no time limit.
Callers wishing to avoid inactivity timeouts on servers that impose them
should keep this at most 29 minutes (1740 seconds).
Requires a socket connection; `duration' must be @code{None} on
@ref{b08,,IMAP4_stream} connections.

@example
>>> with M.idle(duration=29 * 60) as idler:
...     for typ, data in idler:
...         print(typ, data)
...
EXISTS [b'1']
RECENT [b'1']
@end example

@geindex burst() (imaplib.IMAP4.Idler method)
@anchor{library/imaplib imaplib IMAP4 Idler burst}@anchor{40ce}
@deffn {Method} Idler.burst (interval=0.1)

Yield a burst of responses no more than `interval' seconds apart
(expressed as an @ref{19c,,int} or @ref{197,,float}).

This @ref{1267,,generator} is an alternative to iterating one response at a
time, intended to aid in efficient batch processing. It retrieves the
next response along with any immediately available subsequent responses.
(For example, a rapid series of @code{EXPUNGE} responses after a bulk
delete.)

Requires a socket connection; does not work on @ref{b08,,IMAP4_stream}
connections.

@example
>>> with M.idle() as idler:
...     # get a response and any others following by < 0.1 seconds
...     batch = list(idler.burst())
...     print(f'processing @{len(batch)@} responses...')
...     print(batch)
...
processing 3 responses...
[('EXPUNGE', [b'2']), ('EXPUNGE', [b'1']), ('RECENT', [b'0'])]
@end example

@cartouche
@quotation Tip 
The @code{IDLE} context’s maximum duration, as passed to
@code{IMAP4.idle()}, is respected when waiting for the first response
in a burst. Therefore, an expired @code{Idler} will cause this
generator to return immediately without producing anything. Callers
should consider this if using it in a loop.
@end quotation
@end cartouche
@end deffn

@cartouche
@quotation Note 
The iterator returned by @code{IMAP4.idle()} is usable only within a
@ref{187,,with} statement. Before or after that context, unsolicited
responses are collected internally whenever a command finishes, and can
be retrieved with @ref{40cd,,IMAP4.response()}.
@end quotation
@end cartouche

@cartouche
@quotation Note 
The @code{Idler} class name and structure are internal interfaces,
subject to change. Calling code can rely on its context management,
iteration, and public method to remain stable, but should not subclass,
instantiate, compare, or otherwise directly reference the class.
@end quotation
@end cartouche


Added in version 3.14.

@end deffn

@geindex list() (imaplib.IMAP4 method)
@anchor{library/imaplib imaplib IMAP4 list}@anchor{40cf}
@deffn {Method} IMAP4.list ([directory[, pattern]])

List mailbox names in `directory' matching `pattern'.  `directory' defaults to
the top-level mail folder, and `pattern' defaults to match anything.  Returned
data contains a list of @code{LIST} responses.
@end deffn

@geindex login() (imaplib.IMAP4 method)
@anchor{library/imaplib imaplib IMAP4 login}@anchor{177b}
@deffn {Method} IMAP4.login (user, password)

Identify the client using a plaintext password. The `password' will be quoted.
@end deffn

@geindex login_cram_md5() (imaplib.IMAP4 method)
@anchor{library/imaplib imaplib IMAP4 login_cram_md5}@anchor{1840}
@deffn {Method} IMAP4.login_cram_md5 (user, password)

Force use of @code{CRAM-MD5} authentication when identifying the client to protect
the password.  Will only work if the server @code{CAPABILITY} response includes the
phrase @code{AUTH=CRAM-MD5}.


Changed in version 3.14: An @ref{1841,,IMAP4.error} is raised if MD5 support is not available.

@end deffn

@geindex logout() (imaplib.IMAP4 method)
@anchor{library/imaplib imaplib IMAP4 logout}@anchor{c8a}
@deffn {Method} IMAP4.logout ()

Shutdown connection to server. Returns server @code{BYE} response.


Changed in version 3.8: The method no longer ignores silently arbitrary exceptions.

@end deffn

@geindex lsub() (imaplib.IMAP4 method)
@anchor{library/imaplib imaplib IMAP4 lsub}@anchor{40d0}
@deffn {Method} IMAP4.lsub (directory='""', pattern='*')

List subscribed mailbox names in directory matching pattern. `directory'
defaults to the top level directory and `pattern' defaults to match any mailbox.
Returned data are tuples of message part envelope and data.
@end deffn

@geindex myrights() (imaplib.IMAP4 method)
@anchor{library/imaplib imaplib IMAP4 myrights}@anchor{40d1}
@deffn {Method} IMAP4.myrights (mailbox)

Show my ACLs for a mailbox (i.e. the rights that I have on mailbox).
@end deffn

@geindex namespace() (imaplib.IMAP4 method)
@anchor{library/imaplib imaplib IMAP4 namespace}@anchor{40d2}
@deffn {Method} IMAP4.namespace ()

Returns IMAP namespaces as defined in 
@geindex RFC; RFC 2342
RFC 2342@footnote{https://datatracker.ietf.org/doc/html/rfc2342.html}.
@end deffn

@geindex noop() (imaplib.IMAP4 method)
@anchor{library/imaplib imaplib IMAP4 noop}@anchor{40d3}
@deffn {Method} IMAP4.noop ()

Send @code{NOOP} to server.
@end deffn

@geindex open() (imaplib.IMAP4 method)
@anchor{library/imaplib imaplib IMAP4 open}@anchor{b07}
@deffn {Method} IMAP4.open (host, port, timeout=None)

Opens socket to `port' at `host'. The optional `timeout' parameter
specifies a timeout in seconds for the connection attempt.
If timeout is not given or is @code{None}, the global default socket timeout
is used. Also note that if the `timeout' parameter is set to be zero,
it will raise a @ref{2ee,,ValueError} to reject creating a non-blocking socket.
This method is implicitly called by the @ref{b05,,IMAP4} constructor.
The connection objects established by this method will be used in
the @ref{40d4,,IMAP4.read()}, @ref{40d5,,IMAP4.readline()}, @ref{40d6,,IMAP4.send()},
and @ref{40d7,,IMAP4.shutdown()} methods. You may override this method.

Raises an @ref{1cb1,,auditing event} @code{imaplib.open} with arguments @code{self}, @code{host}, @code{port}.


Changed in version 3.9: The `timeout' parameter was added.

@end deffn

@geindex partial() (imaplib.IMAP4 method)
@anchor{library/imaplib imaplib IMAP4 partial}@anchor{40d8}
@deffn {Method} IMAP4.partial (message_num, message_part, start, length)

Fetch truncated part of a message. Returned data is a tuple of message part
envelope and data.
@end deffn

@geindex proxyauth() (imaplib.IMAP4 method)
@anchor{library/imaplib imaplib IMAP4 proxyauth}@anchor{40d9}
@deffn {Method} IMAP4.proxyauth (user)

Assume authentication as `user'. Allows an authorised administrator to proxy
into any user’s mailbox.
@end deffn

@geindex read() (imaplib.IMAP4 method)
@anchor{library/imaplib imaplib IMAP4 read}@anchor{40d4}
@deffn {Method} IMAP4.read (size)

Reads `size' bytes from the remote server. You may override this method.
@end deffn

@geindex readline() (imaplib.IMAP4 method)
@anchor{library/imaplib imaplib IMAP4 readline}@anchor{40d5}
@deffn {Method} IMAP4.readline ()

Reads one line from the remote server. You may override this method.
@end deffn

@geindex recent() (imaplib.IMAP4 method)
@anchor{library/imaplib imaplib IMAP4 recent}@anchor{40da}
@deffn {Method} IMAP4.recent ()

Prompt server for an update. Returned data is @code{None} if no new messages, else
value of @code{RECENT} response.
@end deffn

@geindex rename() (imaplib.IMAP4 method)
@anchor{library/imaplib imaplib IMAP4 rename}@anchor{40db}
@deffn {Method} IMAP4.rename (oldmailbox, newmailbox)

Rename mailbox named `oldmailbox' to `newmailbox'.
@end deffn

@geindex response() (imaplib.IMAP4 method)
@anchor{library/imaplib imaplib IMAP4 response}@anchor{40cd}
@deffn {Method} IMAP4.response (code)

Return data for response `code' if received, or @code{None}. Returns the given
code, instead of the usual type.
@end deffn

@geindex search() (imaplib.IMAP4 method)
@anchor{library/imaplib imaplib IMAP4 search}@anchor{40dc}
@deffn {Method} IMAP4.search (charset, criterion[, ...])

Search mailbox for matching messages.  `charset' may be @code{None}, in which case
no @code{CHARSET} will be specified in the request to the server.  The IMAP
protocol requires that at least one criterion be specified; an exception will be
raised when the server returns an error.  `charset' must be @code{None} if
the @code{UTF8=ACCEPT} capability was enabled using the @ref{1014,,enable()}
command.

Example:

@example
# M is a connected IMAP4 instance...
typ, msgnums = M.search(None, 'FROM', '"LDJ"')

# or:
typ, msgnums = M.search(None, '(FROM "LDJ")')
@end example
@end deffn

@geindex select() (imaplib.IMAP4 method)
@anchor{library/imaplib imaplib IMAP4 select}@anchor{40dd}
@deffn {Method} IMAP4.select (mailbox='INBOX', readonly=False)

Select a mailbox. Returned data is the count of messages in `mailbox'
(@code{EXISTS} response).  The default `mailbox' is @code{'INBOX'}.  If the `readonly'
flag is set, modifications to the mailbox are not allowed.
@end deffn

@geindex send() (imaplib.IMAP4 method)
@anchor{library/imaplib imaplib IMAP4 send}@anchor{40d6}
@deffn {Method} IMAP4.send (data)

Sends @code{data} to the remote server. You may override this method.

Raises an @ref{1cb1,,auditing event} @code{imaplib.send} with arguments @code{self}, @code{data}.
@end deffn

@geindex setacl() (imaplib.IMAP4 method)
@anchor{library/imaplib imaplib IMAP4 setacl}@anchor{40de}
@deffn {Method} IMAP4.setacl (mailbox, who, what)

Set an @code{ACL} for `mailbox'. The method is non-standard, but is supported by
the @code{Cyrus} server.
@end deffn

@geindex setannotation() (imaplib.IMAP4 method)
@anchor{library/imaplib imaplib IMAP4 setannotation}@anchor{40df}
@deffn {Method} IMAP4.setannotation (mailbox, entry, attribute[, ...])

Set @code{ANNOTATION}s for `mailbox'. The method is non-standard, but is
supported by the @code{Cyrus} server.
@end deffn

@geindex setquota() (imaplib.IMAP4 method)
@anchor{library/imaplib imaplib IMAP4 setquota}@anchor{40e0}
@deffn {Method} IMAP4.setquota (root, limits)

Set the @code{quota} `root'’s resource `limits'. This method is part of the IMAP4
QUOTA extension defined in rfc2087.
@end deffn

@geindex shutdown() (imaplib.IMAP4 method)
@anchor{library/imaplib imaplib IMAP4 shutdown}@anchor{40d7}
@deffn {Method} IMAP4.shutdown ()

Close connection established in @code{open}.  This method is implicitly
called by @ref{c8a,,IMAP4.logout()}.  You may override this method.
@end deffn

@geindex socket() (imaplib.IMAP4 method)
@anchor{library/imaplib imaplib IMAP4 socket}@anchor{40e1}
@deffn {Method} IMAP4.socket ()

Returns socket instance used to connect to server.
@end deffn

@geindex sort() (imaplib.IMAP4 method)
@anchor{library/imaplib imaplib IMAP4 sort}@anchor{40e2}
@deffn {Method} IMAP4.sort (sort_criteria, charset, search_criterion[, ...])

The @code{sort} command is a variant of @code{search} with sorting semantics for the
results.  Returned data contains a space separated list of matching message
numbers.

Sort has two arguments before the `search_criterion' argument(s); a
parenthesized list of `sort_criteria', and the searching `charset'.  Note that
unlike @code{search}, the searching `charset' argument is mandatory.  There is also
a @code{uid sort} command which corresponds to @code{sort} the way that @code{uid search}
corresponds to @code{search}.  The @code{sort} command first searches the mailbox for
messages that match the given searching criteria using the charset argument for
the interpretation of strings in the searching criteria.  It then returns the
numbers of matching messages.

This is an @code{IMAP4rev1} extension command.
@end deffn

@geindex starttls() (imaplib.IMAP4 method)
@anchor{library/imaplib imaplib IMAP4 starttls}@anchor{1431}
@deffn {Method} IMAP4.starttls (ssl_context=None)

Send a @code{STARTTLS} command.  The `ssl_context' argument is optional
and should be a @ref{355,,ssl.SSLContext} object.  This will enable
encryption on the IMAP connection.  Please read @ref{390d,,Security considerations} for
best practices.


Added in version 3.2.



Changed in version 3.4: The method now supports hostname check with
@ref{3a49,,ssl.SSLContext.check_hostname} and `Server Name Indication' (see
@ref{3a5b,,ssl.HAS_SNI}).

@end deffn

@geindex status() (imaplib.IMAP4 method)
@anchor{library/imaplib imaplib IMAP4 status}@anchor{40e3}
@deffn {Method} IMAP4.status (mailbox, names)

Request named status conditions for `mailbox'.
@end deffn

@geindex store() (imaplib.IMAP4 method)
@anchor{library/imaplib imaplib IMAP4 store}@anchor{40e4}
@deffn {Method} IMAP4.store (message_set, command, flag_list)

Alters flag dispositions for messages in mailbox.  `command' is specified by
section 6.4.6 of 
@geindex RFC; RFC 2060
RFC 2060@footnote{https://datatracker.ietf.org/doc/html/rfc2060.html} as being one of “FLAGS”, “+FLAGS”, or “-FLAGS”,
optionally with a suffix of “.SILENT”.

For example, to set the delete flag on all messages:

@example
typ, data = M.search(None, 'ALL')
for num in data[0].split():
   M.store(num, '+FLAGS', '\\Deleted')
M.expunge()
@end example

@cartouche
@quotation Note 
Creating flags containing ‘]’ (for example: “[test]”) violates
@geindex RFC; RFC 3501
RFC 3501@footnote{https://datatracker.ietf.org/doc/html/rfc3501.html} (the IMAP protocol).  However, imaplib has historically
allowed creation of such tags, and popular IMAP servers, such as Gmail,
accept and produce such flags.  There are non-Python programs which also
create such tags.  Although it is an RFC violation and IMAP clients and
servers are supposed to be strict, imaplib still continues to allow
such tags to be created for backward compatibility reasons, and as of
Python 3.6, handles them if they are sent from the server, since this
improves real-world compatibility.
@end quotation
@end cartouche
@end deffn

@geindex subscribe() (imaplib.IMAP4 method)
@anchor{library/imaplib imaplib IMAP4 subscribe}@anchor{40e5}
@deffn {Method} IMAP4.subscribe (mailbox)

Subscribe to new mailbox.
@end deffn

@geindex thread() (imaplib.IMAP4 method)
@anchor{library/imaplib imaplib IMAP4 thread}@anchor{40e6}
@deffn {Method} IMAP4.thread (threading_algorithm, charset, search_criterion[, ...])

The @code{thread} command is a variant of @code{search} with threading semantics for
the results.  Returned data contains a space separated list of thread members.

Thread members consist of zero or more messages numbers, delimited by spaces,
indicating successive parent and child.

Thread has two arguments before the `search_criterion' argument(s); a
`threading_algorithm', and the searching `charset'.  Note that unlike
@code{search}, the searching `charset' argument is mandatory.  There is also a
@code{uid thread} command which corresponds to @code{thread} the way that @code{uid
search} corresponds to @code{search}.  The @code{thread} command first searches the
mailbox for messages that match the given searching criteria using the `charset'
argument for the interpretation of strings in the searching criteria. It then
returns the matching messages threaded according to the specified threading
algorithm.

This is an @code{IMAP4rev1} extension command.
@end deffn

@geindex uid() (imaplib.IMAP4 method)
@anchor{library/imaplib imaplib IMAP4 uid}@anchor{40e7}
@deffn {Method} IMAP4.uid (command, arg[, ...])

Execute command args with messages identified by UID, rather than message
number.  Returns response appropriate to command.  At least one argument must be
supplied; if none are provided, the server will return an error and an exception
will be raised.
@end deffn

@geindex unsubscribe() (imaplib.IMAP4 method)
@anchor{library/imaplib imaplib IMAP4 unsubscribe}@anchor{40e8}
@deffn {Method} IMAP4.unsubscribe (mailbox)

Unsubscribe from old mailbox.
@end deffn

@geindex unselect() (imaplib.IMAP4 method)
@anchor{library/imaplib imaplib IMAP4 unselect}@anchor{b09}
@deffn {Method} IMAP4.unselect ()

@code{imaplib.IMAP4.unselect()} frees server’s resources associated with the
selected mailbox and returns the server to the authenticated
state. This command performs the same actions as @ref{b0a,,imaplib.IMAP4.close()}, except
that no messages are permanently removed from the currently
selected mailbox.


Added in version 3.9.

@end deffn

@geindex xatom() (imaplib.IMAP4 method)
@anchor{library/imaplib imaplib IMAP4 xatom}@anchor{40e9}
@deffn {Method} IMAP4.xatom (name[, ...])

Allow simple extension commands notified by server in @code{CAPABILITY} response.
@end deffn

The following attributes are defined on instances of @ref{b05,,IMAP4}:

@geindex PROTOCOL_VERSION (imaplib.IMAP4 attribute)
@anchor{library/imaplib imaplib IMAP4 PROTOCOL_VERSION}@anchor{40ea}
@deffn {Attribute} IMAP4.PROTOCOL_VERSION

The most recent supported protocol in the @code{CAPABILITY} response from the
server.
@end deffn

@geindex debug (imaplib.IMAP4 attribute)
@anchor{library/imaplib imaplib IMAP4 debug}@anchor{40eb}
@deffn {Attribute} IMAP4.debug

Integer value to control debugging output.  The initialize value is taken from
the module variable @code{Debug}.  Values greater than three trace each command.
@end deffn

@geindex utf8_enabled (imaplib.IMAP4 attribute)
@anchor{library/imaplib imaplib IMAP4 utf8_enabled}@anchor{1015}
@deffn {Attribute} IMAP4.utf8_enabled

Boolean value that is normally @code{False}, but is set to @code{True} if an
@ref{1014,,enable()} command is successfully issued for the @code{UTF8=ACCEPT}
capability.


Added in version 3.5.

@end deffn

@node IMAP4 Example,,IMAP4 Objects,imaplib — IMAP4 protocol client
@anchor{library/imaplib id2}@anchor{40ec}@anchor{library/imaplib imap4-example}@anchor{40ed}
@subsubsection IMAP4 Example


Here is a minimal example (without error checking) that opens a mailbox and
retrieves and prints all messages:

@example
import getpass, imaplib

M = imaplib.IMAP4(host='example.org')
M.login(getpass.getuser(), getpass.getpass())
M.select()
typ, data = M.search(None, 'ALL')
for num in data[0].split():
    typ, data = M.fetch(num, '(RFC822)')
    print('Message %s\n%s\n' % (num, data[0][1]))
M.close()
M.logout()
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node smtplib — SMTP protocol client,uuid — UUID objects according to RFC 9562,imaplib — IMAP4 protocol client,Internet Protocols and Support
@anchor{library/smtplib doc}@anchor{40ee}@anchor{library/smtplib module-smtplib}@anchor{cf}@anchor{library/smtplib smtplib-smtp-protocol-client}@anchor{40ef}@anchor{library/smtplib translation-repo}@anchor{40f0}
@subsection @code{smtplib} — SMTP protocol client


@geindex module; smtplib

`Source code:' Lib/smtplib.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/smtplib.py}

@geindex SMTP; protocol
@geindex Simple Mail Transfer Protocol


__________________________________________________________________


The @code{smtplib} module defines an SMTP client session object that can be used
to send mail to any internet machine with an SMTP or ESMTP listener daemon.  For
details of SMTP and ESMTP operation, consult 
@geindex RFC; RFC 821
RFC 821@footnote{https://datatracker.ietf.org/doc/html/rfc821.html} (Simple Mail Transfer
Protocol) and 
@geindex RFC; RFC 1869
RFC 1869@footnote{https://datatracker.ietf.org/doc/html/rfc1869.html} (SMTP Service Extensions).

@c include for modules that don't work on WASM

@ref{2181,,Availability}: not WASI.

This module does not work or is not available on WebAssembly. See
@ref{1bae,,WebAssembly platforms} for more information.

@geindex SMTP (class in smtplib)
@anchor{library/smtplib smtplib SMTP}@anchor{b2d}
@deffn {Class} smtplib.SMTP (host='@w{'}, port=0, local_hostname=None[, timeout], source_address=None)

An @code{SMTP} instance encapsulates an SMTP connection.  It has methods
that support a full repertoire of SMTP and ESMTP operations. If the optional
`host' and `port' parameters are given, the SMTP @ref{179c,,connect()} method is
called with those parameters during initialization.  If specified,
`local_hostname' is used as the FQDN of the local host in the HELO/EHLO
command.  Otherwise, the local hostname is found using
@ref{1b31,,socket.getfqdn()}.  If the @code{connect()} call returns anything other
than a success code, an @ref{40f1,,SMTPConnectError} is raised. The optional
`timeout' parameter specifies a timeout in seconds for blocking operations
like the connection attempt (if not specified, the global default timeout
setting will be used).  If the timeout expires, @ref{a3c,,TimeoutError} is
raised.  The optional `source_address' parameter allows binding
to some specific source address in a machine with multiple network
interfaces, and/or to some specific source TCP port. It takes a 2-tuple
@code{(host, port)}, for the socket to bind to as its source address before
connecting. If omitted (or if `host' or `port' are @code{'@w{'}} and/or @code{0}
respectively) the OS default behavior will be used.

For normal use, you should only require the initialization/connect,
@ref{105f,,sendmail()}, and @ref{40f2,,SMTP.quit()} methods.
An example is included below.

The @code{SMTP} class supports the @ref{187,,with} statement.  When used
like this, the SMTP @code{QUIT} command is issued automatically when the
@code{with} statement exits.  E.g.:

@example
>>> from smtplib import SMTP
>>> with SMTP("domain.org") as smtp:
...     smtp.noop()
...
(250, b'Ok')
>>>
@end example


All commands will raise an @ref{1cb1,,auditing event}
@code{smtplib.SMTP.send} with arguments @code{self} and @code{data},
where @code{data} is the bytes about to be sent to the remote host.



Changed in version 3.3: Support for the @ref{187,,with} statement was added.



Changed in version 3.3: `source_address' argument was added.



Added in version 3.5: The SMTPUTF8 extension (
@geindex RFC; RFC 6531
RFC 6531@footnote{https://datatracker.ietf.org/doc/html/rfc6531.html}) is now supported.



Changed in version 3.9: If the `timeout' parameter is set to be zero, it will raise a
@ref{2ee,,ValueError} to prevent the creation of a non-blocking socket.

@end deffn

@geindex SMTP_SSL (class in smtplib)
@anchor{library/smtplib smtplib SMTP_SSL}@anchor{b2e}
@deffn {Class} smtplib.SMTP_SSL (host='@w{'}, port=0, local_hostname=None, *[, timeout], context=None, source_address=None)

An @code{SMTP_SSL} instance behaves exactly the same as instances of
@ref{b2d,,SMTP}. @code{SMTP_SSL} should be used for situations where SSL is
required from the beginning of the connection and using @ref{1344,,starttls()}
is not appropriate. If `host' is not specified, the local host is used. If
`port' is zero, the standard SMTP-over-SSL port (465) is used.  The optional
arguments `local_hostname', `timeout' and `source_address' have the same
meaning as they do in the @code{SMTP} class.  `context', also optional,
can contain a @ref{355,,SSLContext} and allows configuring various
aspects of the secure connection.  Please read @ref{390d,,Security considerations} for
best practices.


Changed in version 3.3: `context' was added.



Changed in version 3.3: The `source_address' argument was added.



Changed in version 3.4: The class now supports hostname check with
@ref{3a49,,ssl.SSLContext.check_hostname} and `Server Name Indication' (see
@ref{3a5b,,ssl.HAS_SNI}).



Changed in version 3.9: If the `timeout' parameter is set to be zero, it will raise a
@ref{2ee,,ValueError} to prevent the creation of a non-blocking socket



Changed in version 3.12: The deprecated `keyfile' and `certfile' parameters have been removed.

@end deffn

@geindex LMTP (class in smtplib)
@anchor{library/smtplib smtplib LMTP}@anchor{b2f}
@deffn {Class} smtplib.LMTP (host='@w{'}, port=LMTP_PORT, local_hostname=None, source_address=None[, timeout])

The LMTP protocol, which is very similar to ESMTP, is heavily based on the
standard SMTP client. It’s common to use Unix sockets for LMTP, so our
@ref{179c,,connect()} method must support that as well as a regular host:port
server. The optional arguments `local_hostname' and `source_address' have the
same meaning as they do in the @ref{b2d,,SMTP} class. To specify a Unix
socket, you must use an absolute path for `host', starting with a ‘/’.

Authentication is supported, using the regular SMTP mechanism. When using a
Unix socket, LMTP generally don’t support or require any authentication, but
your mileage might vary.


Changed in version 3.9: The optional `timeout' parameter was added.

@end deffn

A nice selection of exceptions is defined as well:

@geindex SMTPException
@anchor{library/smtplib smtplib SMTPException}@anchor{11a7}
@deffn {Exception} smtplib.SMTPException

Subclass of @ref{2c2,,OSError} that is the base exception class for all
the other exceptions provided by this module.


Changed in version 3.4: SMTPException became subclass of @ref{2c2,,OSError}

@end deffn

@geindex SMTPServerDisconnected
@anchor{library/smtplib smtplib SMTPServerDisconnected}@anchor{40f3}
@deffn {Exception} smtplib.SMTPServerDisconnected

This exception is raised when the server unexpectedly disconnects, or when an
attempt is made to use the @ref{b2d,,SMTP} instance before connecting it to a
server.
@end deffn

@geindex SMTPResponseException
@anchor{library/smtplib smtplib SMTPResponseException}@anchor{40f4}
@deffn {Exception} smtplib.SMTPResponseException

Base class for all exceptions that include an SMTP error code. These exceptions
are generated in some instances when the SMTP server returns an error code.

@geindex smtp_code (smtplib.SMTPResponseException attribute)
@anchor{library/smtplib smtplib SMTPResponseException smtp_code}@anchor{40f5}
@deffn {Attribute} smtp_code

The error code.
@end deffn

@geindex smtp_error (smtplib.SMTPResponseException attribute)
@anchor{library/smtplib smtplib SMTPResponseException smtp_error}@anchor{40f6}
@deffn {Attribute} smtp_error

The error message.
@end deffn
@end deffn

@geindex SMTPSenderRefused
@anchor{library/smtplib smtplib SMTPSenderRefused}@anchor{40f7}
@deffn {Exception} smtplib.SMTPSenderRefused

Sender address refused.  In addition to the attributes set by on all
@ref{40f4,,SMTPResponseException} exceptions, this sets ‘sender’ to the string that
the SMTP server refused.
@end deffn

@geindex SMTPRecipientsRefused
@anchor{library/smtplib smtplib SMTPRecipientsRefused}@anchor{40f8}
@deffn {Exception} smtplib.SMTPRecipientsRefused

All recipient addresses refused.

@geindex recipients (smtplib.SMTPRecipientsRefused attribute)
@anchor{library/smtplib smtplib SMTPRecipientsRefused recipients}@anchor{40f9}
@deffn {Attribute} recipients

A dictionary of exactly the same sort as returned
by @ref{105f,,SMTP.sendmail()} containing the errors for
each recipient.
@end deffn
@end deffn

@geindex SMTPDataError
@anchor{library/smtplib smtplib SMTPDataError}@anchor{40fa}
@deffn {Exception} smtplib.SMTPDataError

The SMTP server refused to accept the message data.
@end deffn

@geindex SMTPConnectError
@anchor{library/smtplib smtplib SMTPConnectError}@anchor{40f1}
@deffn {Exception} smtplib.SMTPConnectError

Error occurred during establishment of a connection  with the server.
@end deffn

@geindex SMTPHeloError
@anchor{library/smtplib smtplib SMTPHeloError}@anchor{40fb}
@deffn {Exception} smtplib.SMTPHeloError

The server refused our @code{HELO} message.
@end deffn

@geindex SMTPNotSupportedError
@anchor{library/smtplib smtplib SMTPNotSupportedError}@anchor{1df1}
@deffn {Exception} smtplib.SMTPNotSupportedError

The command or option attempted is not supported by the server.


Added in version 3.5.

@end deffn

@geindex SMTPAuthenticationError
@anchor{library/smtplib smtplib SMTPAuthenticationError}@anchor{40fc}
@deffn {Exception} smtplib.SMTPAuthenticationError

SMTP authentication went wrong.  Most probably the server didn’t accept the
username/password combination provided.
@end deffn


@subsubheading See also



@table @asis

@geindex RFC; RFC 821

@item RFC 821@footnote{https://datatracker.ietf.org/doc/html/rfc821.html} - Simple Mail Transfer Protocol

Protocol definition for SMTP.  This document covers the model, operating
procedure, and protocol details for SMTP.

@geindex RFC; RFC 1869

@item RFC 1869@footnote{https://datatracker.ietf.org/doc/html/rfc1869.html} - SMTP Service Extensions

Definition of the ESMTP extensions for SMTP.  This describes a framework for
extending SMTP with new commands, supporting dynamic discovery of the commands
provided by the server, and defines a few additional commands.
@end table


@menu
* SMTP Objects:: 
* SMTP Example:: 

@end menu

@node SMTP Objects,SMTP Example,,smtplib — SMTP protocol client
@anchor{library/smtplib id1}@anchor{40fd}@anchor{library/smtplib smtp-objects}@anchor{40fe}
@subsubsection SMTP Objects


An @ref{b2d,,SMTP} instance has the following methods:

@geindex set_debuglevel() (smtplib.SMTP method)
@anchor{library/smtplib smtplib SMTP set_debuglevel}@anchor{105e}
@deffn {Method} SMTP.set_debuglevel (level)

Set the debug output level.  A value of 1 or @code{True} for `level' results in
debug messages for connection and for all messages sent to and received from
the server.  A value of 2 for `level' results in these messages being
timestamped.


Changed in version 3.5: Added debuglevel 2.

@end deffn

@geindex docmd() (smtplib.SMTP method)
@anchor{library/smtplib smtplib SMTP docmd}@anchor{40ff}
@deffn {Method} SMTP.docmd (cmd, args='@w{'})

Send a command `cmd' to the server.  The optional argument `args' is simply
concatenated to the command, separated by a space.

This returns a 2-tuple composed of a numeric response code and the actual
response line (multiline responses are joined into one long line.)

In normal operation it should not be necessary to call this method explicitly.
It is used to implement other methods and may be useful for testing private
extensions.

If the connection to the server is lost while waiting for the reply,
@ref{40f3,,SMTPServerDisconnected} will be raised.
@end deffn

@geindex connect() (smtplib.SMTP method)
@anchor{library/smtplib smtplib SMTP connect}@anchor{179c}
@deffn {Method} SMTP.connect (host='localhost', port=0)

Connect to a host on a given port.  The defaults are to connect to the local
host at the standard SMTP port (25). If the hostname ends with a colon (@code{':'})
followed by a number, that suffix will be stripped off and the number
interpreted as the port number to use. This method is automatically invoked by
the constructor if a host is specified during instantiation.  Returns a
2-tuple of the response code and message sent by the server in its
connection response.

Raises an @ref{1cb1,,auditing event} @code{smtplib.connect} with arguments @code{self}, @code{host}, @code{port}.
@end deffn

@geindex helo() (smtplib.SMTP method)
@anchor{library/smtplib smtplib SMTP helo}@anchor{4100}
@deffn {Method} SMTP.helo (name='@w{'})

Identify yourself to the SMTP server using @code{HELO}.  The hostname argument
defaults to the fully qualified domain name of the local host.
The message returned by the server is stored as the @ref{4101,,helo_resp} attribute
of the object.

In normal operation it should not be necessary to call this method explicitly.
It will be implicitly called by the @ref{105f,,sendmail()} when necessary.
@end deffn

@geindex ehlo() (smtplib.SMTP method)
@anchor{library/smtplib smtplib SMTP ehlo}@anchor{4102}
@deffn {Method} SMTP.ehlo (name='@w{'})

Identify yourself to an ESMTP server using @code{EHLO}.  The hostname argument
defaults to the fully qualified domain name of the local host.  Examine the
response for ESMTP option and store them for use by @ref{4103,,has_extn()}.
Also sets several informational attributes: the message returned by
the server is stored as the @ref{4104,,ehlo_resp} attribute, @ref{4105,,does_esmtp}
is set to @code{True} or @code{False} depending on whether the server supports
ESMTP, and @ref{4106,,esmtp_features} will be a dictionary containing the names
of the SMTP service extensions this server supports, and their parameters
(if any).

Unless you wish to use @ref{4103,,has_extn()} before sending mail, it should not be
necessary to call this method explicitly.  It will be implicitly called by
@ref{105f,,sendmail()} when necessary.
@end deffn

@geindex ehlo_or_helo_if_needed() (smtplib.SMTP method)
@anchor{library/smtplib smtplib SMTP ehlo_or_helo_if_needed}@anchor{4107}
@deffn {Method} SMTP.ehlo_or_helo_if_needed ()

This method calls @ref{4102,,ehlo()} and/or @ref{4100,,helo()} if there has been no
previous @code{EHLO} or @code{HELO} command this session.  It tries ESMTP @code{EHLO}
first.


@table @asis

@item @ref{40fb,,SMTPHeloError}

The server didn’t reply properly to the @code{HELO} greeting.
@end table
@end deffn

@geindex has_extn() (smtplib.SMTP method)
@anchor{library/smtplib smtplib SMTP has_extn}@anchor{4103}
@deffn {Method} SMTP.has_extn (name)

Return @ref{e0d,,True} if `name' is in the set of SMTP service extensions returned
by the server, @ref{d31,,False} otherwise. Case is ignored.
@end deffn

@geindex verify() (smtplib.SMTP method)
@anchor{library/smtplib smtplib SMTP verify}@anchor{4108}
@deffn {Method} SMTP.verify (address)

Check the validity of an address on this server using SMTP @code{VRFY}. Returns a
tuple consisting of code 250 and a full 
@geindex RFC; RFC 822
RFC 822@footnote{https://datatracker.ietf.org/doc/html/rfc822.html} address (including human
name) if the user address is valid. Otherwise returns an SMTP error code of 400
or greater and an error string.

@cartouche
@quotation Note 
Many sites disable SMTP @code{VRFY} in order to foil spammers.
@end quotation
@end cartouche
@end deffn

@geindex login() (smtplib.SMTP method)
@anchor{library/smtplib smtplib SMTP login}@anchor{4109}
@deffn {Method} SMTP.login (user, password, *, initial_response_ok=True)

Log in on an SMTP server that requires authentication. The arguments are the
username and the password to authenticate with. If there has been no previous
@code{EHLO} or @code{HELO} command this session, this method tries ESMTP @code{EHLO}
first. This method will return normally if the authentication was successful, or
may raise the following exceptions:


@table @asis

@item @ref{40fb,,SMTPHeloError}

The server didn’t reply properly to the @code{HELO} greeting.

@item @ref{40fc,,SMTPAuthenticationError}

The server didn’t accept the username/password combination.

@item @ref{1df1,,SMTPNotSupportedError}

The @code{AUTH} command is not supported by the server.

@item @ref{11a7,,SMTPException}

No suitable authentication method was found.
@end table

Each of the authentication methods supported by @code{smtplib} are tried in
turn if they are advertised as supported by the server.  See @ref{105d,,auth()}
for a list of supported authentication methods.  `initial_response_ok' is
passed through to @code{auth()}.

Optional keyword argument `initial_response_ok' specifies whether, for
authentication methods that support it, an “initial response” as specified
in 
@geindex RFC; RFC 4954
RFC 4954@footnote{https://datatracker.ietf.org/doc/html/rfc4954.html} can be sent along with the @code{AUTH} command, rather than
requiring a challenge/response.


Changed in version 3.5: @ref{1df1,,SMTPNotSupportedError} may be raised, and the
`initial_response_ok' parameter was added.

@end deffn

@geindex auth() (smtplib.SMTP method)
@anchor{library/smtplib smtplib SMTP auth}@anchor{105d}
@deffn {Method} SMTP.auth (mechanism, authobject, *, initial_response_ok=True)

Issue an @code{SMTP} @code{AUTH} command for the specified authentication
`mechanism', and handle the challenge response via `authobject'.

`mechanism' specifies which authentication mechanism is to
be used as argument to the @code{AUTH} command; the valid values are
those listed in the @code{auth} element of @ref{4106,,esmtp_features}.

`authobject' must be a callable object taking an optional single argument:

@example
data = authobject(challenge=None)
@end example

If optional keyword argument `initial_response_ok' is true,
@code{authobject()} will be called first with no argument.  It can return the
@geindex RFC; RFC 4954
RFC 4954@footnote{https://datatracker.ietf.org/doc/html/rfc4954.html} “initial response” ASCII @code{str} which will be encoded and sent with
the @code{AUTH} command as below.  If the @code{authobject()} does not support an
initial response (e.g. because it requires a challenge), it should return
@code{None} when called with @code{challenge=None}.  If `initial_response_ok' is
false, then @code{authobject()} will not be called first with @code{None}.

If the initial response check returns @code{None}, or if `initial_response_ok' is
false, @code{authobject()} will be called to process the server’s challenge
response; the `challenge' argument it is passed will be a @code{bytes}.  It
should return ASCII @code{str} `data' that will be base64 encoded and sent to the
server.

The @code{SMTP} class provides @code{authobjects} for the @code{CRAM-MD5}, @code{PLAIN},
and @code{LOGIN} mechanisms; they are named @code{SMTP.auth_cram_md5},
@code{SMTP.auth_plain}, and @code{SMTP.auth_login} respectively.  They all require
that the @code{user} and @code{password} properties of the @code{SMTP} instance are
set to appropriate values.

User code does not normally need to call @code{auth} directly, but can instead
call the @ref{4109,,login()} method, which will try each of the above mechanisms
in turn, in the order listed.  @code{auth} is exposed to facilitate the
implementation of authentication methods not (or not yet) supported
directly by @code{smtplib}.


Added in version 3.5.

@end deffn

@geindex starttls() (smtplib.SMTP method)
@anchor{library/smtplib smtplib SMTP starttls}@anchor{1344}
@deffn {Method} SMTP.starttls (*, context=None)

Put the SMTP connection in TLS (Transport Layer Security) mode.  All SMTP
commands that follow will be encrypted.  You should then call @ref{4102,,ehlo()}
again.

If `keyfile' and `certfile' are provided, they are used to create an
@ref{355,,ssl.SSLContext}.

Optional `context' parameter is an @ref{355,,ssl.SSLContext} object; This is
an alternative to using a keyfile and a certfile and if specified both
`keyfile' and `certfile' should be @code{None}.

If there has been no previous @code{EHLO} or @code{HELO} command this session,
this method tries ESMTP @code{EHLO} first.


Changed in version 3.12: The deprecated `keyfile' and `certfile' parameters have been removed.



@table @asis

@item @ref{40fb,,SMTPHeloError}

The server didn’t reply properly to the @code{HELO} greeting.

@item @ref{1df1,,SMTPNotSupportedError}

The server does not support the STARTTLS extension.

@item @ref{246,,RuntimeError}

SSL/TLS support is not available to your Python interpreter.
@end table


Changed in version 3.3: `context' was added.



Changed in version 3.4: The method now supports hostname check with
@ref{3a49,,ssl.SSLContext.check_hostname} and `Server Name Indicator' (see
@ref{3a5b,,HAS_SNI}).



Changed in version 3.5: The error raised for lack of STARTTLS support is now the
@ref{1df1,,SMTPNotSupportedError} subclass instead of the base
@ref{11a7,,SMTPException}.

@end deffn

@geindex sendmail() (smtplib.SMTP method)
@anchor{library/smtplib smtplib SMTP sendmail}@anchor{105f}
@deffn {Method} SMTP.sendmail (from_addr, to_addrs, msg, mail_options=(), rcpt_options=())

Send mail.  The required arguments are an 
@geindex RFC; RFC 822
RFC 822@footnote{https://datatracker.ietf.org/doc/html/rfc822.html} from-address string, a list
of 
@geindex RFC; RFC 822
RFC 822@footnote{https://datatracker.ietf.org/doc/html/rfc822.html} to-address strings (a bare string will be treated as a list with 1
address), and a message string.  The caller may pass a list of ESMTP options
(such as @code{"8bitmime"}) to be used in @code{MAIL FROM} commands as `mail_options'.
ESMTP options (such as @code{DSN} commands) that should be used with all @code{RCPT}
commands can be passed as `rcpt_options'. Each option should be passed as a string
containing the full text of the option, including any potential key
(for instance, @code{"NOTIFY=SUCCESS,FAILURE"}). (If you need to use different ESMTP
options to different recipients you have to use the low-level methods such as
@code{mail()}, @code{rcpt()} and @code{data()} to send the message.)

@cartouche
@quotation Note 
The `from_addr' and `to_addrs' parameters are used to construct the message
envelope used by the transport agents.  @code{sendmail} does not modify the
message headers in any way.
@end quotation
@end cartouche

`msg' may be a string containing characters in the ASCII range, or a byte
string.  A string is encoded to bytes using the ascii codec, and lone @code{\r}
and @code{\n} characters are converted to @code{\r\n} characters.  A byte string is
not modified.

If there has been no previous @code{EHLO} or @code{HELO} command this session, this
method tries ESMTP @code{EHLO} first. If the server does ESMTP, message size and
each of the specified options will be passed to it (if the option is in the
feature set the server advertises).  If @code{EHLO} fails, @code{HELO} will be tried
and ESMTP options suppressed.

This method will return normally if the mail is accepted for at least one
recipient. Otherwise it will raise an exception.  That is, if this method does
not raise an exception, then someone should get your mail. If this method does
not raise an exception, it returns a dictionary, with one entry for each
recipient that was refused.  Each entry contains a tuple of the SMTP error code
and the accompanying error message sent by the server.

If @code{SMTPUTF8} is included in `mail_options', and the server supports it,
`from_addr' and `to_addrs' may contain non-ASCII characters.

This method may raise the following exceptions:


@table @asis

@item @ref{40f8,,SMTPRecipientsRefused}

All recipients were refused.  Nobody got the mail.

@item @ref{40fb,,SMTPHeloError}

The server didn’t reply properly to the @code{HELO} greeting.

@item @ref{40f7,,SMTPSenderRefused}

The server didn’t accept the `from_addr'.

@item @ref{40fa,,SMTPDataError}

The server replied with an unexpected error code (other than a refusal of a
recipient).

@item @ref{1df1,,SMTPNotSupportedError}

@code{SMTPUTF8} was given in the `mail_options' but is not supported by the
server.
@end table

Unless otherwise noted, the connection will be open even after an exception is
raised.


Changed in version 3.2: `msg' may be a byte string.



Changed in version 3.5: @code{SMTPUTF8} support added, and @ref{1df1,,SMTPNotSupportedError} may be
raised if @code{SMTPUTF8} is specified but the server does not support it.

@end deffn

@geindex send_message() (smtplib.SMTP method)
@anchor{library/smtplib smtplib SMTP send_message}@anchor{1060}
@deffn {Method} SMTP.send_message (msg, from_addr=None, to_addrs=None, mail_options=(), rcpt_options=())

This is a convenience method for calling @ref{105f,,sendmail()} with the message
represented by an @ref{581,,email.message.Message} object.  The arguments have
the same meaning as for @code{sendmail()}, except that `msg' is a @code{Message}
object.

If `from_addr' is @code{None} or `to_addrs' is @code{None}, @code{send_message} fills
those arguments with addresses extracted from the headers of `msg' as
specified in 
@geindex RFC; RFC 5322
RFC 5322@footnote{https://datatracker.ietf.org/doc/html/rfc5322.html}: `from_addr' is set to the @code{Sender}
field if it is present, and otherwise to the @code{From} field.
`to_addrs' combines the values (if any) of the @code{To},
@code{Cc}, and @code{Bcc} fields from `msg'.  If exactly one
set of @code{Resent-*} headers appear in the message, the regular
headers are ignored and the @code{Resent-*} headers are used instead.
If the message contains more than one set of @code{Resent-*} headers,
a @ref{2ee,,ValueError} is raised, since there is no way to unambiguously detect
the most recent set of @code{Resent-} headers.

@code{send_message} serializes `msg' using
@ref{13db,,BytesGenerator} with @code{\r\n} as the `linesep', and
calls @ref{105f,,sendmail()} to transmit the resulting message.  Regardless of the
values of `from_addr' and `to_addrs', @code{send_message} does not transmit any
@code{Bcc} or @code{Resent-Bcc} headers that may appear
in `msg'.  If any of the addresses in `from_addr' and `to_addrs' contain
non-ASCII characters and the server does not advertise @code{SMTPUTF8} support,
an @ref{1df1,,SMTPNotSupportedError} is raised.  Otherwise the @code{Message} is
serialized with a clone of its @ref{53,,policy} with the
@ref{fff,,utf8} attribute set to @code{True}, and
@code{SMTPUTF8} and @code{BODY=8BITMIME} are added to `mail_options'.


Added in version 3.2.



Added in version 3.5: Support for internationalized addresses (@code{SMTPUTF8}).

@end deffn

@geindex quit() (smtplib.SMTP method)
@anchor{library/smtplib smtplib SMTP quit}@anchor{40f2}
@deffn {Method} SMTP.quit ()

Terminate the SMTP session and close the connection.  Return the result of
the SMTP @code{QUIT} command.
@end deffn

Low-level methods corresponding to the standard SMTP/ESMTP commands @code{HELP},
@code{RSET}, @code{NOOP}, @code{MAIL}, @code{RCPT}, and @code{DATA} are also supported.
Normally these do not need to be called directly, so they are not documented
here.  For details, consult the module code.

Additionally, an SMTP instance has the following attributes:

@geindex helo_resp (smtplib.SMTP attribute)
@anchor{library/smtplib smtplib SMTP helo_resp}@anchor{4101}
@deffn {Attribute} SMTP.helo_resp

The response to the @code{HELO} command, see @ref{4100,,helo()}.
@end deffn

@geindex ehlo_resp (smtplib.SMTP attribute)
@anchor{library/smtplib smtplib SMTP ehlo_resp}@anchor{4104}
@deffn {Attribute} SMTP.ehlo_resp

The response to the @code{EHLO} command, see @ref{4102,,ehlo()}.
@end deffn

@geindex does_esmtp (smtplib.SMTP attribute)
@anchor{library/smtplib smtplib SMTP does_esmtp}@anchor{4105}
@deffn {Attribute} SMTP.does_esmtp

A boolean value indicating whether the server supports ESMTP, see
@ref{4102,,ehlo()}.
@end deffn

@geindex esmtp_features (smtplib.SMTP attribute)
@anchor{library/smtplib smtplib SMTP esmtp_features}@anchor{4106}
@deffn {Attribute} SMTP.esmtp_features

A dictionary of the names of SMTP service extensions supported by the server,
see @ref{4102,,ehlo()}.
@end deffn

@node SMTP Example,,SMTP Objects,smtplib — SMTP protocol client
@anchor{library/smtplib id2}@anchor{410a}@anchor{library/smtplib smtp-example}@anchor{410b}
@subsubsection SMTP Example


This example prompts the user for addresses needed in the message envelope (‘To’
and ‘From’ addresses), and the message to be delivered.  Note that the headers
to be included with the message must be included in the message as entered; this
example doesn’t do any processing of the 
@geindex RFC; RFC 822
RFC 822@footnote{https://datatracker.ietf.org/doc/html/rfc822.html} headers.  In particular, the
‘To’ and ‘From’ addresses must be included in the message headers explicitly:

@example
import smtplib

def prompt(title):
    return input(title).strip()

from_addr = prompt("From: ")
to_addrs  = prompt("To: ").split()
print("Enter message, end with ^D (Unix) or ^Z (Windows):")

# Add the From: and To: headers at the start!
lines = [f"From: @{from_addr@}", f"To: @{', '.join(to_addrs)@}", ""]
while True:
    try:
        line = input()
    except EOFError:
        break
    else:
        lines.append(line)

msg = "\r\n".join(lines)
print("Message length is", len(msg))

server = smtplib.SMTP("localhost")
server.set_debuglevel(1)
server.sendmail(from_addr, to_addrs, msg)
server.quit()
@end example

@cartouche
@quotation Note 
In general, you will want to use the @ref{3f,,email} package’s features to
construct an email message, which you can then send
via @ref{1060,,send_message()}; see @ref{1142,,email; Examples}.
@end quotation
@end cartouche

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node uuid — UUID objects according to RFC 9562,socketserver — A framework for network servers,smtplib — SMTP protocol client,Internet Protocols and Support
@anchor{library/uuid doc}@anchor{410c}@anchor{library/uuid module-uuid}@anchor{117}@anchor{library/uuid translation-repo}@anchor{410d}@anchor{library/uuid uuid-uuid-objects-according-to-rfc-9562}@anchor{410e}
@subsection @code{uuid} — UUID objects according to 
@geindex RFC; RFC 9562
`RFC 9562'


@geindex module; uuid

`Source code:' Lib/uuid.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/uuid.py}


__________________________________________________________________


This module provides immutable @ref{c5c,,UUID} objects (the @code{UUID} class)
and @ref{410f,,functions} for generating UUIDs corresponding
to a specific UUID version as specified in 
@geindex RFC; RFC 9562
RFC 9562@footnote{https://datatracker.ietf.org/doc/html/rfc9562.html} (which supersedes 
@geindex RFC; RFC 4122
RFC 4122@footnote{https://datatracker.ietf.org/doc/html/rfc4122.html}),
for example, @ref{da7,,uuid1()} for UUID version 1, @ref{2e7,,uuid3()} for UUID version 3, and so on.
Note that UUID version 2 is deliberately omitted as it is outside the scope of the RFC.

If all you want is a unique ID, you should probably call @ref{da7,,uuid1()} or
@ref{2e9,,uuid4()}.  Note that @code{uuid1()} may compromise privacy since it creates
a UUID containing the computer’s network address.  @code{uuid4()} creates a
random UUID.

Depending on support from the underlying platform, @ref{da7,,uuid1()} may or may
not return a “safe” UUID.  A safe UUID is one which is generated using
synchronization methods that ensure no two processes can obtain the same
UUID.  All instances of @ref{c5c,,UUID} have an @ref{da5,,is_safe} attribute
which relays any information about the UUID’s safety, using this enumeration:

@geindex SafeUUID (class in uuid)
@anchor{library/uuid uuid SafeUUID}@anchor{4110}
@deffn {Class} uuid.SafeUUID


Added in version 3.7.


@geindex safe (uuid.SafeUUID attribute)
@anchor{library/uuid uuid SafeUUID safe}@anchor{4111}
@deffn {Attribute} safe

The UUID was generated by the platform in a multiprocessing-safe way.
@end deffn

@geindex unsafe (uuid.SafeUUID attribute)
@anchor{library/uuid uuid SafeUUID unsafe}@anchor{4112}
@deffn {Attribute} unsafe

The UUID was not generated in a multiprocessing-safe way.
@end deffn

@geindex unknown (uuid.SafeUUID attribute)
@anchor{library/uuid uuid SafeUUID unknown}@anchor{4113}
@deffn {Attribute} unknown

The platform does not provide information on whether the UUID was
generated safely or not.
@end deffn
@end deffn

@geindex UUID (class in uuid)
@anchor{library/uuid uuid UUID}@anchor{c5c}
@deffn {Class} uuid.UUID (hex=None, bytes=None, bytes_le=None, fields=None, int=None, version=None, *, is_safe=SafeUUID.unknown)

Create a UUID from either a string of 32 hexadecimal digits, a string of 16
bytes in big-endian order as the `bytes' argument, a string of 16 bytes in
little-endian order as the `bytes_le' argument, a tuple of six integers
(32-bit `time_low', 16-bit `time_mid', 16-bit `time_hi_version',
8-bit `clock_seq_hi_variant', 8-bit `clock_seq_low', 48-bit `node') as the
`fields' argument, or a single 128-bit integer as the `int' argument.
When a string of hex digits is given, curly braces, hyphens,
and a URN prefix are all optional.  For example, these
expressions all yield the same UUID:

@example
UUID('@{12345678-1234-5678-1234-567812345678@}')
UUID('12345678123456781234567812345678')
UUID('urn:uuid:12345678-1234-5678-1234-567812345678')
UUID(bytes=b'\x12\x34\x56\x78'*4)
UUID(bytes_le=b'\x78\x56\x34\x12\x34\x12\x78\x56' +
              b'\x12\x34\x56\x78\x12\x34\x56\x78')
UUID(fields=(0x12345678, 0x1234, 0x5678, 0x12, 0x34, 0x567812345678))
UUID(int=0x12345678123456781234567812345678)
@end example

Exactly one of `hex', `bytes', `bytes_le', `fields', or `int' must be given.
The `version' argument is optional; if given, the resulting UUID will have its
variant and version number set according to 
@geindex RFC; RFC 9562
RFC 9562@footnote{https://datatracker.ietf.org/doc/html/rfc9562.html}, overriding bits in the
given `hex', `bytes', `bytes_le', `fields', or `int'.

Comparison of UUID objects are made by way of comparing their
@ref{4114,,UUID.int} attributes.  Comparison with a non-UUID object
raises a @ref{199,,TypeError}.

@code{str(uuid)} returns a string in the form
@code{12345678-1234-5678-1234-567812345678} where the 32 hexadecimal digits
represent the UUID.
@end deffn

@ref{c5c,,UUID} instances have these read-only attributes:

@geindex bytes (uuid.UUID attribute)
@anchor{library/uuid uuid UUID bytes}@anchor{4115}
@deffn {Attribute} UUID.bytes

The UUID as a 16-byte string (containing the six integer fields in big-endian
byte order).
@end deffn

@geindex bytes_le (uuid.UUID attribute)
@anchor{library/uuid uuid UUID bytes_le}@anchor{4116}
@deffn {Attribute} UUID.bytes_le

The UUID as a 16-byte string (with `time_low', `time_mid', and `time_hi_version'
in little-endian byte order).
@end deffn

@geindex fields (uuid.UUID attribute)
@anchor{library/uuid uuid UUID fields}@anchor{4117}
@deffn {Attribute} UUID.fields

A tuple of the six integer fields of the UUID, which are also available as six
individual attributes and two derived attributes:
@end deffn


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

Field

@tab

Meaning

@item

@geindex time_low (uuid.UUID attribute)
@anchor{library/uuid uuid UUID time_low}@anchor{4118}
@deffn {Attribute} UUID.time_low
@end deffn

@tab

The first 32 bits of the UUID. Only relevant to version 1.

@item

@geindex time_mid (uuid.UUID attribute)
@anchor{library/uuid uuid UUID time_mid}@anchor{4119}
@deffn {Attribute} UUID.time_mid
@end deffn

@tab

The next 16 bits of the UUID. Only relevant to version 1.

@item

@geindex time_hi_version (uuid.UUID attribute)
@anchor{library/uuid uuid UUID time_hi_version}@anchor{411a}
@deffn {Attribute} UUID.time_hi_version
@end deffn

@tab

The next 16 bits of the UUID. Only relevant to version 1.

@item

@geindex clock_seq_hi_variant (uuid.UUID attribute)
@anchor{library/uuid uuid UUID clock_seq_hi_variant}@anchor{411b}
@deffn {Attribute} UUID.clock_seq_hi_variant
@end deffn

@tab

The next 8 bits of the UUID. Only relevant to versions 1 and 6.

@item

@geindex clock_seq_low (uuid.UUID attribute)
@anchor{library/uuid uuid UUID clock_seq_low}@anchor{411c}
@deffn {Attribute} UUID.clock_seq_low
@end deffn

@tab

The next 8 bits of the UUID. Only relevant to versions 1 and 6.

@item

@geindex node (uuid.UUID attribute)
@anchor{library/uuid uuid UUID node}@anchor{411d}
@deffn {Attribute} UUID.node
@end deffn

@tab

The last 48 bits of the UUID. Only relevant to version 1.

@item

@geindex time (uuid.UUID attribute)
@anchor{library/uuid uuid UUID time}@anchor{411e}
@deffn {Attribute} UUID.time
@end deffn

@tab

The 60-bit timestamp as a count of 100-nanosecond intervals since
Gregorian epoch (1582-10-15 00:00:00) for versions 1 and 6, or the
48-bit timestamp in milliseconds since Unix epoch (1970-01-01 00:00:00)
for version 7.

@item

@geindex clock_seq (uuid.UUID attribute)
@anchor{library/uuid uuid UUID clock_seq}@anchor{411f}
@deffn {Attribute} UUID.clock_seq
@end deffn

@tab

The 14-bit sequence number. Only relevant to versions 1 and 6.

@end multitable


@geindex hex (uuid.UUID attribute)
@anchor{library/uuid uuid UUID hex}@anchor{18d6}
@deffn {Attribute} UUID.hex

The UUID as a 32-character lowercase hexadecimal string.
@end deffn

@geindex int (uuid.UUID attribute)
@anchor{library/uuid uuid UUID int}@anchor{4114}
@deffn {Attribute} UUID.int

The UUID as a 128-bit integer.
@end deffn

@geindex urn (uuid.UUID attribute)
@anchor{library/uuid uuid UUID urn}@anchor{4120}
@deffn {Attribute} UUID.urn

The UUID as a URN as specified in 
@geindex RFC; RFC 9562
RFC 9562@footnote{https://datatracker.ietf.org/doc/html/rfc9562.html}.
@end deffn

@geindex variant (uuid.UUID attribute)
@anchor{library/uuid uuid UUID variant}@anchor{4121}
@deffn {Attribute} UUID.variant

The UUID variant, which determines the internal layout of the UUID. This will be
one of the constants @ref{4122,,RESERVED_NCS}, @ref{4123,,RFC_4122},
@ref{4124,,RESERVED_MICROSOFT}, or @ref{4125,,RESERVED_FUTURE}.
@end deffn

@geindex version (uuid.UUID attribute)
@anchor{library/uuid uuid UUID version}@anchor{4126}
@deffn {Attribute} UUID.version

The UUID version number (1 through 8, meaningful only when the variant is
@ref{4123,,RFC_4122}).


Changed in version 3.14: Added UUID versions 6, 7 and 8.

@end deffn

@geindex is_safe (uuid.UUID attribute)
@anchor{library/uuid uuid UUID is_safe}@anchor{da5}
@deffn {Attribute} UUID.is_safe

An enumeration of @ref{4110,,SafeUUID} which indicates whether the platform
generated the UUID in a multiprocessing-safe way.


Added in version 3.7.

@end deffn

The @code{uuid} module defines the following functions:

@geindex getnode() (in module uuid)
@anchor{library/uuid uuid getnode}@anchor{da6}
@deffn {Function} uuid.getnode ()

Get the hardware address as a 48-bit positive integer.  The first time this
runs, it may launch a separate program, which could be quite slow.  If all
attempts to obtain the hardware address fail, we choose a random 48-bit
number with the multicast bit (least significant bit of the first octet)
set to 1 as recommended in 
@geindex RFC; RFC 4122
RFC 4122@footnote{https://datatracker.ietf.org/doc/html/rfc4122.html}.  “Hardware address” means the MAC
address of a network interface.  On a machine with multiple network
interfaces, universally administered MAC addresses (i.e. where the second
least significant bit of the first octet is `unset') will be preferred over
locally administered MAC addresses, but with no other ordering guarantees.


Changed in version 3.7: Universally administered MAC addresses are preferred over locally
administered MAC addresses, since the former are guaranteed to be
globally unique, while the latter are not.

@end deffn

@geindex uuid1() (in module uuid)
@anchor{library/uuid uuid-factory-functions}@anchor{410f}@anchor{library/uuid uuid uuid1}@anchor{da7}
@deffn {Function} uuid.uuid1 (node=None, clock_seq=None)

Generate a UUID from a host ID, sequence number, and the current time
according to 
@geindex RFC; RFC 9562 Section 5.1
RFC 9562@comma{} §5.1@footnote{https://datatracker.ietf.org/doc/html/rfc9562.html#section-5.1}.

When `node' is not specified, @ref{da6,,getnode()} is used to obtain the hardware
address as a 48-bit positive integer. When a sequence number `clock_seq' is
not specified, a pseudo-random 14-bit positive integer is generated.

If `node' or `clock_seq' exceed their expected bit count,
only their least significant bits are kept.
@end deffn

@geindex uuid3() (in module uuid)
@anchor{library/uuid uuid uuid3}@anchor{2e7}
@deffn {Function} uuid.uuid3 (namespace, name)

Generate a UUID based on the MD5 hash of a namespace identifier (which is a
UUID) and a name (which is a @ref{193,,bytes} object or a string
that will be encoded using UTF-8)
according to 
@geindex RFC; RFC 9562 Section 5.3
RFC 9562@comma{} §5.3@footnote{https://datatracker.ietf.org/doc/html/rfc9562.html#section-5.3}.
@end deffn

@geindex uuid4() (in module uuid)
@anchor{library/uuid uuid uuid4}@anchor{2e9}
@deffn {Function} uuid.uuid4 ()

Generate a random UUID in a cryptographically-secure method
according to 
@geindex RFC; RFC 9562 Section 5.4
RFC 9562@comma{} §5.4@footnote{https://datatracker.ietf.org/doc/html/rfc9562.html#section-5.4}.
@end deffn

@geindex uuid5() (in module uuid)
@anchor{library/uuid uuid uuid5}@anchor{2e8}
@deffn {Function} uuid.uuid5 (namespace, name)

Generate a UUID based on the SHA-1 hash of a namespace identifier (which is a
UUID) and a name (which is a @ref{193,,bytes} object or a string
that will be encoded using UTF-8)
according to 
@geindex RFC; RFC 9562 Section 5.5
RFC 9562@comma{} §5.5@footnote{https://datatracker.ietf.org/doc/html/rfc9562.html#section-5.5}.
@end deffn

@geindex uuid6() (in module uuid)
@anchor{library/uuid uuid uuid6}@anchor{2c4}
@deffn {Function} uuid.uuid6 (node=None, clock_seq=None)

Generate a UUID from a sequence number and the current time according to
@geindex RFC; RFC 9562 Section 5.6
RFC 9562@comma{} §5.6@footnote{https://datatracker.ietf.org/doc/html/rfc9562.html#section-5.6}.

This is an alternative to @ref{da7,,uuid1()} to improve database locality.

When `node' is not specified, @ref{da6,,getnode()} is used to obtain the hardware
address as a 48-bit positive integer. When a sequence number `clock_seq' is
not specified, a pseudo-random 14-bit positive integer is generated.

If `node' or `clock_seq' exceed their expected bit count,
only their least significant bits are kept.


Added in version 3.14.

@end deffn

@geindex uuid7() (in module uuid)
@anchor{library/uuid uuid uuid7}@anchor{2c5}
@deffn {Function} uuid.uuid7 ()

Generate a time-based UUID according to
@geindex RFC; RFC 9562 Section 5.7
RFC 9562@comma{} §5.7@footnote{https://datatracker.ietf.org/doc/html/rfc9562.html#section-5.7}.

For portability across platforms lacking sub-millisecond precision, UUIDs
produced by this function embed a 48-bit timestamp and use a 42-bit counter
to guarantee monotonicity within a millisecond.


Added in version 3.14.

@end deffn

@geindex uuid8() (in module uuid)
@anchor{library/uuid uuid uuid8}@anchor{2c6}
@deffn {Function} uuid.uuid8 (a=None, b=None, c=None)

Generate a pseudo-random UUID according to
@geindex RFC; RFC 9562 Section 5.8
RFC 9562@comma{} §5.8@footnote{https://datatracker.ietf.org/doc/html/rfc9562.html#section-5.8}.

When specified, the parameters `a', `b' and `c' are expected to be
positive integers of 48, 12 and 62 bits respectively. If they exceed
their expected bit count, only their least significant bits are kept;
non-specified arguments are substituted for a pseudo-random integer of
appropriate size.

By default, `a', `b' and `c' are not generated by a cryptographically
secure pseudo-random number generator (CSPRNG). Use @ref{2e9,,uuid4()} when
a UUID needs to be used in a security-sensitive context.


Added in version 3.14.

@end deffn

The @code{uuid} module defines the following namespace identifiers for use with
@ref{2e7,,uuid3()} or @ref{2e8,,uuid5()}.

@geindex NAMESPACE_DNS (in module uuid)
@anchor{library/uuid uuid NAMESPACE_DNS}@anchor{4127}
@deffn {Data} uuid.NAMESPACE_DNS

When this namespace is specified, the `name' string is a fully qualified domain
name.
@end deffn

@geindex NAMESPACE_URL (in module uuid)
@anchor{library/uuid uuid NAMESPACE_URL}@anchor{4128}
@deffn {Data} uuid.NAMESPACE_URL

When this namespace is specified, the `name' string is a URL.
@end deffn

@geindex NAMESPACE_OID (in module uuid)
@anchor{library/uuid uuid NAMESPACE_OID}@anchor{4129}
@deffn {Data} uuid.NAMESPACE_OID

When this namespace is specified, the `name' string is an ISO OID.
@end deffn

@geindex NAMESPACE_X500 (in module uuid)
@anchor{library/uuid uuid NAMESPACE_X500}@anchor{412a}
@deffn {Data} uuid.NAMESPACE_X500

When this namespace is specified, the `name' string is an X.500 DN in DER or a
text output format.
@end deffn

The @code{uuid} module defines the following constants for the possible values
of the @ref{4121,,variant} attribute:

@geindex RESERVED_NCS (in module uuid)
@anchor{library/uuid uuid RESERVED_NCS}@anchor{4122}
@deffn {Data} uuid.RESERVED_NCS

Reserved for NCS compatibility.
@end deffn

@geindex RFC_4122 (in module uuid)
@anchor{library/uuid uuid RFC_4122}@anchor{4123}
@deffn {Data} uuid.RFC_4122

Specifies the UUID layout given in 
@geindex RFC; RFC 4122
RFC 4122@footnote{https://datatracker.ietf.org/doc/html/rfc4122.html}. This constant is kept
for backward compatibility even though 
@geindex RFC; RFC 4122
RFC 4122@footnote{https://datatracker.ietf.org/doc/html/rfc4122.html} has been superseded
by 
@geindex RFC; RFC 9562
RFC 9562@footnote{https://datatracker.ietf.org/doc/html/rfc9562.html}.
@end deffn

@geindex RESERVED_MICROSOFT (in module uuid)
@anchor{library/uuid uuid RESERVED_MICROSOFT}@anchor{4124}
@deffn {Data} uuid.RESERVED_MICROSOFT

Reserved for Microsoft compatibility.
@end deffn

@geindex RESERVED_FUTURE (in module uuid)
@anchor{library/uuid uuid RESERVED_FUTURE}@anchor{4125}
@deffn {Data} uuid.RESERVED_FUTURE

Reserved for future definition.
@end deffn

The @code{uuid} module defines the special Nil and Max UUID values:

@geindex NIL (in module uuid)
@anchor{library/uuid uuid NIL}@anchor{2c7}
@deffn {Data} uuid.NIL

A special form of UUID that is specified to have all 128 bits set to zero
according to 
@geindex RFC; RFC 9562 Section 5.9
RFC 9562@comma{} §5.9@footnote{https://datatracker.ietf.org/doc/html/rfc9562.html#section-5.9}.


Added in version 3.14.

@end deffn

@geindex MAX (in module uuid)
@anchor{library/uuid uuid MAX}@anchor{2c8}
@deffn {Data} uuid.MAX

A special form of UUID that is specified to have all 128 bits set to one
according to 
@geindex RFC; RFC 9562 Section 5.10
RFC 9562@comma{} §5.10@footnote{https://datatracker.ietf.org/doc/html/rfc9562.html#section-5.10}.


Added in version 3.14.

@end deffn


@subsubheading See also



@table @asis

@geindex RFC; RFC 9562

@item RFC 9562@footnote{https://datatracker.ietf.org/doc/html/rfc9562.html} - A Universally Unique IDentifier (UUID) URN Namespace

This specification defines a Uniform Resource Name namespace for UUIDs, the
internal format of UUIDs, and methods of generating UUIDs.
@end table


@menu
* Command-Line Usage:: 
* Example: Example<11>. 
* Command-Line Example:: 

@end menu

@node Command-Line Usage,Example<11>,,uuid — UUID objects according to RFC 9562
@anchor{library/uuid command-line-usage}@anchor{412b}@anchor{library/uuid uuid-cli}@anchor{676}
@subsubsection Command-Line Usage



Added in version 3.12.


The @code{uuid} module can be executed as a script from the command line.

@example
python -m uuid [-h] [-u @{uuid1,uuid3,uuid4,uuid5,uuid6,uuid7,uuid8@}] [-n NAMESPACE] [-N NAME]
@end example

The following options are accepted:

@geindex uuid command line option; -h
@geindex uuid command line option; --help
@anchor{library/uuid cmdoption-uuid-h}@anchor{412c}@anchor{library/uuid cmdoption-uuid-help}@anchor{412d}
@deffn {Option} @w{-}h, @w{-}@w{-}help

Show the help message and exit.
@end deffn

@geindex uuid command line option; -u
@geindex uuid command line option; --uuid
@anchor{library/uuid cmdoption-uuid-u}@anchor{412e}
@deffn {Option} @w{-}u <uuid>
@anchor{library/uuid cmdoption-uuid-uuid}@anchor{412f}
@deffnx {Option} @w{-}@w{-}uuid <uuid>

Specify the function name to use to generate the uuid. By default @ref{2e9,,uuid4()}
is used.


Changed in version 3.14: Allow generating UUID versions 6, 7 and 8.

@end deffn

@geindex uuid command line option; -n
@geindex uuid command line option; --namespace
@anchor{library/uuid cmdoption-uuid-n}@anchor{4130}
@deffn {Option} @w{-}n <namespace>
@anchor{library/uuid cmdoption-uuid-namespace}@anchor{4131}
@deffnx {Option} @w{-}@w{-}namespace <namespace>

The namespace is a @code{UUID}, or @code{@@ns} where @code{ns} is a well-known predefined UUID
addressed by namespace name. Such as @code{@@dns}, @code{@@url}, @code{@@oid}, and @code{@@x500}.
Only required for @ref{2e7,,uuid3()} / @ref{2e8,,uuid5()} functions.
@end deffn

@geindex uuid command line option; -N
@geindex uuid command line option; --name
@anchor{library/uuid cmdoption-uuid-N}@anchor{4132}
@deffn {Option} @w{-}N <name>
@anchor{library/uuid cmdoption-uuid-name}@anchor{4133}
@deffnx {Option} @w{-}@w{-}name <name>

The name used as part of generating the uuid. Only required for
@ref{2e7,,uuid3()} / @ref{2e8,,uuid5()} functions.
@end deffn

@geindex uuid command line option; -C
@geindex uuid command line option; --count
@anchor{library/uuid cmdoption-uuid-C}@anchor{4134}
@deffn {Option} @w{-}C <num>
@anchor{library/uuid cmdoption-uuid-count}@anchor{2c9}
@deffnx {Option} @w{-}@w{-}count <num>

Generate `num' fresh UUIDs.


Added in version 3.14.

@end deffn

@node Example<11>,Command-Line Example,Command-Line Usage,uuid — UUID objects according to RFC 9562
@anchor{library/uuid example}@anchor{4135}@anchor{library/uuid uuid-example}@anchor{4136}
@subsubsection Example


Here are some examples of typical usage of the @code{uuid} module:

@example
>>> import uuid

>>> # make a UUID based on the host ID and current time
>>> uuid.uuid1()
UUID('a8098c1a-f86e-11da-bd1a-00112444be1e')

>>> # make a UUID using an MD5 hash of a namespace UUID and a name
>>> uuid.uuid3(uuid.NAMESPACE_DNS, 'python.org')
UUID('6fa459ea-ee8a-3ca4-894e-db77e160355e')

>>> # make a random UUID
>>> uuid.uuid4()
UUID('16fd2706-8baf-433b-82eb-8c7fada847da')

>>> # make a UUID using a SHA-1 hash of a namespace UUID and a name
>>> uuid.uuid5(uuid.NAMESPACE_DNS, 'python.org')
UUID('886313e1-3b8a-5372-9b90-0c9aee199e5d')

>>> # make a UUID from a string of hex digits (braces and hyphens ignored)
>>> x = uuid.UUID('@{00010203-0405-0607-0809-0a0b0c0d0e0f@}')

>>> # convert a UUID to a string of hex digits in standard form
>>> str(x)
'00010203-0405-0607-0809-0a0b0c0d0e0f'

>>> # get the raw 16 bytes of the UUID
>>> x.bytes
b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f'

>>> # make a UUID from a 16-byte string
>>> uuid.UUID(bytes=x.bytes)
UUID('00010203-0405-0607-0809-0a0b0c0d0e0f')

>>> # get the Nil UUID
>>> uuid.NIL
UUID('00000000-0000-0000-0000-000000000000')

>>> # get the Max UUID
>>> uuid.MAX
UUID('ffffffff-ffff-ffff-ffff-ffffffffffff')

>>> # same as UUIDv1 but with fields reordered to improve DB locality
>>> uuid.uuid6()
UUID('1f0799c0-98b9-62db-92c6-a0d365b91053')

>>> # get UUIDv7 creation (local) time as a timestamp in milliseconds
>>> u = uuid.uuid7()
>>> u.time
1743936859822

>>> # get UUIDv7 creation (local) time as a datetime object
>>> import datetime as dt
>>> dt.datetime.fromtimestamp(u.time / 1000)
datetime.datetime(...)

>>> # make a UUID with custom blocks
>>> uuid.uuid8(0x12345678, 0x9abcdef0, 0x11223344)
UUID('00001234-5678-8ef0-8000-000011223344')
@end example

@node Command-Line Example,,Example<11>,uuid — UUID objects according to RFC 9562
@anchor{library/uuid command-line-example}@anchor{4137}@anchor{library/uuid uuid-cli-example}@anchor{4138}
@subsubsection Command-Line Example


Here are some examples of typical usage of the @code{uuid} command-line interface:

@example
# generate a random UUID - by default uuid4() is used
$ python -m uuid

# generate a UUID using uuid1()
$ python -m uuid -u uuid1

# generate a UUID using uuid5
$ python -m uuid -u uuid5 -n @@url -N example.com

# generate 42 random UUIDs
$ python -m uuid -C 42
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node socketserver — A framework for network servers,http server — HTTP servers,uuid — UUID objects according to RFC 9562,Internet Protocols and Support
@anchor{library/socketserver doc}@anchor{4139}@anchor{library/socketserver module-socketserver}@anchor{d2}@anchor{library/socketserver socketserver-a-framework-for-network-servers}@anchor{413a}@anchor{library/socketserver translation-repo}@anchor{413b}
@subsection @code{socketserver} — A framework for network servers


@geindex module; socketserver

`Source code:' Lib/socketserver.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/socketserver.py}


__________________________________________________________________


The @code{socketserver} module simplifies the task of writing network servers.

@c include for modules that don't work on WASM

@ref{2181,,Availability}: not WASI.

This module does not work or is not available on WebAssembly. See
@ref{1bae,,WebAssembly platforms} for more information.

There are four basic concrete server classes:

@geindex TCPServer (class in socketserver)
@anchor{library/socketserver socketserver TCPServer}@anchor{152b}
@deffn {Class} socketserver.TCPServer (server_address, RequestHandlerClass, bind_and_activate=True)

This uses the internet TCP protocol, which provides for
continuous streams of data between the client and server.
If `bind_and_activate' is true, the constructor automatically attempts to
invoke @ref{413c,,server_bind()} and
@ref{413d,,server_activate()}.  The other parameters are passed to
the @ref{1349,,BaseServer} base class.
@end deffn

@geindex UDPServer (class in socketserver)
@anchor{library/socketserver socketserver UDPServer}@anchor{413e}
@deffn {Class} socketserver.UDPServer (server_address, RequestHandlerClass, bind_and_activate=True)

This uses datagrams, which are discrete packets of information that may
arrive out of order or be lost while in transit.  The parameters are
the same as for @ref{152b,,TCPServer}.
@end deffn

@geindex UnixStreamServer (class in socketserver)
@geindex UnixDatagramServer (class in socketserver)
@anchor{library/socketserver socketserver UnixStreamServer}@anchor{413f}
@deffn {Class} socketserver.UnixStreamServer (server_address, RequestHandlerClass, bind_and_activate=True)
@anchor{library/socketserver socketserver UnixDatagramServer}@anchor{4140}
@deffnx {Class} socketserver.UnixDatagramServer (server_address, RequestHandlerClass, bind_and_activate=True)

These more infrequently used classes are similar to the TCP and
UDP classes, but use Unix domain sockets; they’re not available on
non-Unix platforms.  The parameters are the same as for
@ref{152b,,TCPServer}.
@end deffn

These four classes process requests `synchronously'; each request must be
completed before the next request can be started.  This isn’t suitable if each
request takes a long time to complete, because it requires a lot of computation,
or because it returns a lot of data which the client is slow to process.  The
solution is to create a separate process or thread to handle each request; the
@ref{d77,,ForkingMixIn} and @ref{d40,,ThreadingMixIn} mix-in classes can be used to
support asynchronous behaviour.

Creating a server requires several steps.  First, you must create a request
handler class by subclassing the @ref{4141,,BaseRequestHandler} class and
overriding its @ref{4142,,handle()} method;
this method will process incoming
requests.  Second, you must instantiate one of the server classes, passing it
the server’s address and the request handler class. It is recommended to use
the server in a @ref{187,,with} statement. Then call the
@ref{152e,,handle_request()} or
@ref{134b,,serve_forever()} method of the server object to
process one or many requests.  Finally, call @ref{d75,,server_close()}
to close the socket (unless you used a @code{with} statement).

When inheriting from @ref{d40,,ThreadingMixIn} for threaded connection behavior,
you should explicitly declare how you want your threads to behave on an abrupt
shutdown.  The @code{ThreadingMixIn} class defines an attribute
`daemon_threads', which indicates whether or not the server should wait for
thread termination.  You should set the flag explicitly if you would like
threads to behave autonomously; the default is @ref{d31,,False}, meaning that
Python will not exit until all threads created by @code{ThreadingMixIn} have
exited.

Server classes have the same external methods and attributes, no matter what
network protocol they use.

@menu
* Server Creation Notes:: 
* Server Objects:: 
* Request Handler Objects:: 
* Examples: Examples<29>. 

@end menu

@node Server Creation Notes,Server Objects,,socketserver — A framework for network servers
@anchor{library/socketserver server-creation-notes}@anchor{4143}
@subsubsection Server Creation Notes


There are five classes in an inheritance diagram, four of which represent
synchronous servers of four types:

@example
+------------+
| BaseServer |
+------------+
      |
      v
+-----------+        +------------------+
| TCPServer |------->| UnixStreamServer |
+-----------+        +------------------+
      |
      v
+-----------+        +--------------------+
| UDPServer |------->| UnixDatagramServer |
+-----------+        +--------------------+
@end example

Note that @ref{4140,,UnixDatagramServer} derives from @ref{413e,,UDPServer}, not from
@ref{413f,,UnixStreamServer} — the only difference between an IP and a Unix
server is the address family.

@geindex ForkingMixIn (class in socketserver)
@geindex ThreadingMixIn (class in socketserver)
@anchor{library/socketserver socketserver ForkingMixIn}@anchor{d77}
@deffn {Class} socketserver.ForkingMixIn
@anchor{library/socketserver socketserver ThreadingMixIn}@anchor{d40}
@deffnx {Class} socketserver.ThreadingMixIn

Forking and threading versions of each type of server can be created
using these mix-in classes.  For instance, @ref{4144,,ThreadingUDPServer}
is created as follows:

@example
class ThreadingUDPServer(ThreadingMixIn, UDPServer):
    pass
@end example

The mix-in class comes first, since it overrides a method defined in
@ref{413e,,UDPServer}.  Setting the various attributes also changes the
behavior of the underlying server mechanism.

@code{ForkingMixIn} and the Forking classes mentioned below are
only available on POSIX platforms that support @ref{4b6,,fork()}.

@geindex block_on_close (socketserver.ThreadingMixIn attribute)
@anchor{library/socketserver socketserver ThreadingMixIn block_on_close}@anchor{d76}
@deffn {Attribute} block_on_close

@ref{d75,,ForkingMixIn.server_close}
waits until all child processes complete, except if
@ref{d76,,block_on_close} attribute is @code{False}.

@ref{d75,,ThreadingMixIn.server_close}
waits until all non-daemon threads complete, except if
@ref{d76,,block_on_close} attribute is @code{False}.
@end deffn

@geindex max_children (socketserver.ThreadingMixIn attribute)
@anchor{library/socketserver socketserver ThreadingMixIn max_children}@anchor{4145}
@deffn {Attribute} max_children

Specify how many child processes will exist to handle requests at a time
for @code{ForkingMixIn}.  If the limit is reached,
new requests will wait until one child process has finished.
@end deffn

@geindex daemon_threads (socketserver.ThreadingMixIn attribute)
@anchor{library/socketserver socketserver ThreadingMixIn daemon_threads}@anchor{4146}
@deffn {Attribute} daemon_threads

For @code{ThreadingMixIn} use daemonic threads by setting
@ref{4146,,ThreadingMixIn.daemon_threads}
to @code{True} to not wait until threads complete.
@end deffn


Changed in version 3.7: @ref{d75,,ForkingMixIn.server_close} and
@code{ThreadingMixIn.server_close} now waits until all
child processes and non-daemonic threads complete.
Add a new @ref{d76,,ForkingMixIn.block_on_close} class
attribute to opt-in for the pre-3.7 behaviour.

@end deffn

@geindex ForkingTCPServer (class in socketserver)
@geindex ForkingUDPServer (class in socketserver)
@geindex ThreadingTCPServer (class in socketserver)
@geindex ThreadingUDPServer (class in socketserver)
@geindex ForkingUnixStreamServer (class in socketserver)
@geindex ForkingUnixDatagramServer (class in socketserver)
@geindex ThreadingUnixStreamServer (class in socketserver)
@geindex ThreadingUnixDatagramServer (class in socketserver)
@anchor{library/socketserver socketserver ForkingTCPServer}@anchor{4147}
@deffn {Class} socketserver.ForkingTCPServer
@anchor{library/socketserver socketserver ForkingUDPServer}@anchor{4148}
@deffnx {Class} socketserver.ForkingUDPServer
@anchor{library/socketserver socketserver ThreadingTCPServer}@anchor{4149}
@deffnx {Class} socketserver.ThreadingTCPServer
@anchor{library/socketserver socketserver ThreadingUDPServer}@anchor{4144}
@deffnx {Class} socketserver.ThreadingUDPServer
@anchor{library/socketserver socketserver ForkingUnixStreamServer}@anchor{414a}
@deffnx {Class} socketserver.ForkingUnixStreamServer
@anchor{library/socketserver socketserver ForkingUnixDatagramServer}@anchor{414b}
@deffnx {Class} socketserver.ForkingUnixDatagramServer
@anchor{library/socketserver socketserver ThreadingUnixStreamServer}@anchor{414c}
@deffnx {Class} socketserver.ThreadingUnixStreamServer
@anchor{library/socketserver socketserver ThreadingUnixDatagramServer}@anchor{414d}
@deffnx {Class} socketserver.ThreadingUnixDatagramServer

These classes are pre-defined using the mix-in classes.
@end deffn


Added in version 3.12: The @code{ForkingUnixStreamServer} and @code{ForkingUnixDatagramServer} classes
were added.


To implement a service, you must derive a class from @ref{4141,,BaseRequestHandler}
and redefine its @ref{4142,,handle()} method.
You can then run various versions of
the service by combining one of the server classes with your request handler
class.  The request handler class must be different for datagram or stream
services.  This can be hidden by using the handler subclasses
@ref{edc,,StreamRequestHandler} or @ref{414e,,DatagramRequestHandler}.

Of course, you still have to use your head!  For instance, it makes no sense to
use a forking server if the service contains state in memory that can be
modified by different requests, since the modifications in the child process
would never reach the initial state kept in the parent process and passed to
each child.  In this case, you can use a threading server, but you will probably
have to use locks to protect the integrity of the shared data.

On the other hand, if you are building an HTTP server where all data is stored
externally (for instance, in the file system), a synchronous class will
essentially render the service “deaf” while one request is being handled –
which may be for a very long time if a client is slow to receive all the data it
has requested.  Here a threading or forking server is appropriate.

In some cases, it may be appropriate to process part of a request synchronously,
but to finish processing in a forked child depending on the request data.  This
can be implemented by using a synchronous server and doing an explicit fork in
the request handler class @ref{4142,,handle()} method.

Another approach to handling multiple simultaneous requests in an environment
that supports neither threads nor @ref{4b6,,fork()} (or where these are too
expensive or inappropriate for the service) is to maintain an explicit table of
partially finished requests and to use @ref{c7,,selectors} to decide which
request to work on next (or whether to handle a new incoming request).  This is
particularly important for stream services where each client can potentially be
connected for a long time (if threads or subprocesses cannot be used).

@c XXX should data and methods be intermingled, or separate?
@c how should the distinction between class and instance variables be drawn?

@node Server Objects,Request Handler Objects,Server Creation Notes,socketserver — A framework for network servers
@anchor{library/socketserver server-objects}@anchor{414f}
@subsubsection Server Objects


@geindex BaseServer (class in socketserver)
@anchor{library/socketserver socketserver BaseServer}@anchor{1349}
@deffn {Class} socketserver.BaseServer (server_address, RequestHandlerClass)

This is the superclass of all Server objects in the module.  It defines the
interface, given below, but does not implement most of the methods, which is
done in subclasses.  The two parameters are stored in the respective
@ref{4150,,server_address} and @ref{4151,,RequestHandlerClass} attributes.

@geindex fileno() (socketserver.BaseServer method)
@anchor{library/socketserver socketserver BaseServer fileno}@anchor{4152}
@deffn {Method} fileno ()

Return an integer file descriptor for the socket on which the server is
listening.  This function is most commonly passed to @ref{c7,,selectors}, to
allow monitoring multiple servers in the same process.
@end deffn

@geindex handle_request() (socketserver.BaseServer method)
@anchor{library/socketserver socketserver BaseServer handle_request}@anchor{152e}
@deffn {Method} handle_request ()

Process a single request.  This function calls the following methods in
order: @ref{4153,,get_request()}, @ref{4154,,verify_request()}, and
@ref{4155,,process_request()}.  If the user-provided
@ref{4142,,handle()} method of the
handler class raises an exception, the server’s @ref{f43,,handle_error()} method
will be called.  If no request is received within @ref{152c,,timeout}
seconds, @ref{152d,,handle_timeout()} will be called and @code{handle_request()}
will return.
@end deffn

@geindex serve_forever() (socketserver.BaseServer method)
@anchor{library/socketserver socketserver BaseServer serve_forever}@anchor{134b}
@deffn {Method} serve_forever (poll_interval=0.5)

Handle requests until an explicit @ref{1e58,,shutdown()} request.  Poll for
shutdown every `poll_interval' seconds.
Ignores the @ref{152c,,timeout} attribute.  It
also calls @ref{134a,,service_actions()}, which may be used by a subclass or mixin
to provide actions specific to a given service.  For example, the
@ref{d77,,ForkingMixIn} class uses @code{service_actions()} to clean up zombie
child processes.


Changed in version 3.3: Added @code{service_actions} call to the @code{serve_forever} method.

@end deffn

@geindex service_actions() (socketserver.BaseServer method)
@anchor{library/socketserver socketserver BaseServer service_actions}@anchor{134a}
@deffn {Method} service_actions ()

This is called in the @ref{134b,,serve_forever()} loop. This method can be
overridden by subclasses or mixin classes to perform actions specific to
a given service, such as cleanup actions.


Added in version 3.3.

@end deffn

@geindex shutdown() (socketserver.BaseServer method)
@anchor{library/socketserver socketserver BaseServer shutdown}@anchor{1e58}
@deffn {Method} shutdown ()

Tell the @ref{134b,,serve_forever()} loop to stop and wait until it does.
@code{shutdown()} must be called while @code{serve_forever()} is running in a
different thread otherwise it will deadlock.
@end deffn

@geindex server_close() (socketserver.BaseServer method)
@anchor{library/socketserver socketserver BaseServer server_close}@anchor{d75}
@deffn {Method} server_close ()

Clean up the server. May be overridden.
@end deffn

@geindex address_family (socketserver.BaseServer attribute)
@anchor{library/socketserver socketserver BaseServer address_family}@anchor{4156}
@deffn {Attribute} address_family

The family of protocols to which the server’s socket belongs.  Common
examples are @ref{1bf0,,socket.AF_INET}, @ref{1bf1,,socket.AF_INET6}, and
@ref{1bf3,,socket.AF_UNIX}.  Subclass the TCP or UDP server classes in this
module with class attribute @code{address_family = AF_INET6} set if you
want IPv6 server classes.
@end deffn

@geindex RequestHandlerClass (socketserver.BaseServer attribute)
@anchor{library/socketserver socketserver BaseServer RequestHandlerClass}@anchor{4151}
@deffn {Attribute} RequestHandlerClass

The user-provided request handler class; an instance of this class is created
for each request.
@end deffn

@geindex server_address (socketserver.BaseServer attribute)
@anchor{library/socketserver socketserver BaseServer server_address}@anchor{4150}
@deffn {Attribute} server_address

The address on which the server is listening.  The format of addresses varies
depending on the protocol family;
see the documentation for the @ref{d1,,socket} module
for details.  For internet protocols, this is a tuple containing a string giving
the address, and an integer port number: @code{('127.0.0.1', 80)}, for example.
@end deffn

@geindex socket (socketserver.BaseServer attribute)
@anchor{library/socketserver socketserver BaseServer socket}@anchor{4157}
@deffn {Attribute} socket

The socket object on which the server will listen for incoming requests.
@end deffn

The server classes support the following class variables:

@c XXX should class variables be covered before instance variables, or vice versa?

@geindex allow_reuse_address (socketserver.BaseServer attribute)
@anchor{library/socketserver socketserver BaseServer allow_reuse_address}@anchor{4158}
@deffn {Attribute} allow_reuse_address

Whether the server will allow the reuse of an address.  This defaults to
@ref{d31,,False}, and can be set in subclasses to change the policy.
@end deffn

@geindex request_queue_size (socketserver.BaseServer attribute)
@anchor{library/socketserver socketserver BaseServer request_queue_size}@anchor{4159}
@deffn {Attribute} request_queue_size

The size of the request queue.  If it takes a long time to process a single
request, any requests that arrive while the server is busy are placed into a
queue, up to @ref{4159,,request_queue_size} requests.  Once the queue is full,
further requests from clients will get a “Connection denied” error.  The default
value is usually 5, but this can be overridden by subclasses.
@end deffn

@geindex socket_type (socketserver.BaseServer attribute)
@anchor{library/socketserver socketserver BaseServer socket_type}@anchor{415a}
@deffn {Attribute} socket_type

The type of socket used by the server; @ref{14ff,,socket.SOCK_STREAM} and
@ref{14fe,,socket.SOCK_DGRAM} are two common values.
@end deffn

@geindex timeout (socketserver.BaseServer attribute)
@anchor{library/socketserver socketserver BaseServer timeout}@anchor{152c}
@deffn {Attribute} timeout

Timeout duration, measured in seconds, or @ref{887,,None} if no timeout is
desired.  If @ref{152e,,handle_request()} receives no incoming requests within the
timeout period, the @ref{152d,,handle_timeout()} method is called.
@end deffn

There are various server methods that can be overridden by subclasses of base
server classes like @ref{152b,,TCPServer}; these methods aren’t useful to external
users of the server object.

@c XXX should the default implementations of these be documented, or should
@c it be assumed that the user will look at socketserver.py?

@geindex finish_request() (socketserver.BaseServer method)
@anchor{library/socketserver socketserver BaseServer finish_request}@anchor{415b}
@deffn {Method} finish_request (request, client_address)

Actually processes the request by instantiating @ref{4151,,RequestHandlerClass} and
calling its @ref{4142,,handle()} method.
@end deffn

@geindex get_request() (socketserver.BaseServer method)
@anchor{library/socketserver socketserver BaseServer get_request}@anchor{4153}
@deffn {Method} get_request ()

Must accept a request from the socket, and return a 2-tuple containing the `new'
socket object to be used to communicate with the client, and the client’s
address.
@end deffn

@geindex handle_error() (socketserver.BaseServer method)
@anchor{library/socketserver socketserver BaseServer handle_error}@anchor{f43}
@deffn {Method} handle_error (request, client_address)

This function is called if the @ref{4142,,handle()}
method of a @ref{4151,,RequestHandlerClass} instance raises
an exception.  The default action is to print the traceback to
standard error and continue handling further requests.


Changed in version 3.6: Now only called for exceptions derived from the @ref{bd3,,Exception}
class.

@end deffn

@geindex handle_timeout() (socketserver.BaseServer method)
@anchor{library/socketserver socketserver BaseServer handle_timeout}@anchor{152d}
@deffn {Method} handle_timeout ()

This function is called when the @ref{152c,,timeout} attribute has been set to a
value other than @ref{887,,None} and the timeout period has passed with no
requests being received.  The default action for forking servers is
to collect the status of any child processes that have exited, while
in threading servers this method does nothing.
@end deffn

@geindex process_request() (socketserver.BaseServer method)
@anchor{library/socketserver socketserver BaseServer process_request}@anchor{4155}
@deffn {Method} process_request (request, client_address)

Calls @ref{415b,,finish_request()} to create an instance of the
@ref{4151,,RequestHandlerClass}.  If desired, this function can create a new process
or thread to handle the request; the @ref{d77,,ForkingMixIn} and
@ref{d40,,ThreadingMixIn} classes do this.
@end deffn

@c Is there any point in documenting the following two functions?
@c What would the purpose of overriding them be: initializing server
@c instance variables, adding new network families?

@geindex server_activate() (socketserver.BaseServer method)
@anchor{library/socketserver socketserver BaseServer server_activate}@anchor{413d}
@deffn {Method} server_activate ()

Called by the server’s constructor to activate the server.  The default behavior
for a TCP server just invokes @ref{1064,,listen()}
on the server’s socket.  May be overridden.
@end deffn

@geindex server_bind() (socketserver.BaseServer method)
@anchor{library/socketserver socketserver BaseServer server_bind}@anchor{413c}
@deffn {Method} server_bind ()

Called by the server’s constructor to bind the socket to the desired address.
May be overridden.
@end deffn

@geindex verify_request() (socketserver.BaseServer method)
@anchor{library/socketserver socketserver BaseServer verify_request}@anchor{4154}
@deffn {Method} verify_request (request, client_address)

Must return a Boolean value; if the value is @ref{e0d,,True}, the request will
be processed, and if it’s @ref{d31,,False}, the request will be denied.  This
function can be overridden to implement access controls for a server. The
default implementation always returns @code{True}.
@end deffn


Changed in version 3.6: Support for the @ref{1e3,,context manager} protocol was added.  Exiting the
context manager is equivalent to calling @ref{d75,,server_close()}.

@end deffn

@node Request Handler Objects,Examples<29>,Server Objects,socketserver — A framework for network servers
@anchor{library/socketserver request-handler-objects}@anchor{415c}
@subsubsection Request Handler Objects


@geindex BaseRequestHandler (class in socketserver)
@anchor{library/socketserver socketserver BaseRequestHandler}@anchor{4141}
@deffn {Class} socketserver.BaseRequestHandler

This is the superclass of all request handler objects.  It defines
the interface, given below.  A concrete request handler subclass must
define a new @ref{4142,,handle()} method, and can override any of
the other methods.  A new instance of the subclass is created for each
request.

@geindex setup() (socketserver.BaseRequestHandler method)
@anchor{library/socketserver socketserver BaseRequestHandler setup}@anchor{415d}
@deffn {Method} setup ()

Called before the @ref{4142,,handle()} method to perform any initialization actions
required.  The default implementation does nothing.
@end deffn

@geindex handle() (socketserver.BaseRequestHandler method)
@anchor{library/socketserver socketserver BaseRequestHandler handle}@anchor{4142}
@deffn {Method} handle ()

This function must do all the work required to service a request.  The
default implementation does nothing.  Several instance attributes are
available to it; the request is available as @ref{415e,,request}; the client
address as @ref{415f,,client_address}; and the server instance as
@ref{4160,,server}, in case it needs access to per-server information.

The type of @ref{415e,,request} is different for datagram or stream
services.  For stream services, @code{request} is a socket object; for
datagram services, @code{request} is a pair of string and socket.
@end deffn

@geindex finish() (socketserver.BaseRequestHandler method)
@anchor{library/socketserver socketserver BaseRequestHandler finish}@anchor{4161}
@deffn {Method} finish ()

Called after the @ref{4142,,handle()} method to perform any clean-up actions
required.  The default implementation does nothing.  If @ref{415d,,setup()}
raises an exception, this function will not be called.
@end deffn

@geindex request (socketserver.BaseRequestHandler attribute)
@anchor{library/socketserver socketserver BaseRequestHandler request}@anchor{415e}
@deffn {Attribute} request

The `new' @ref{fa7,,socket.socket} object
to be used to communicate with the client.
@end deffn

@geindex client_address (socketserver.BaseRequestHandler attribute)
@anchor{library/socketserver socketserver BaseRequestHandler client_address}@anchor{415f}
@deffn {Attribute} client_address

Client address returned by @ref{4153,,BaseServer.get_request()}.
@end deffn

@geindex server (socketserver.BaseRequestHandler attribute)
@anchor{library/socketserver socketserver BaseRequestHandler server}@anchor{4160}
@deffn {Attribute} server

@ref{1349,,BaseServer} object used for handling the request.
@end deffn
@end deffn

@geindex StreamRequestHandler (class in socketserver)
@geindex DatagramRequestHandler (class in socketserver)
@anchor{library/socketserver socketserver StreamRequestHandler}@anchor{edc}
@deffn {Class} socketserver.StreamRequestHandler
@anchor{library/socketserver socketserver DatagramRequestHandler}@anchor{414e}
@deffnx {Class} socketserver.DatagramRequestHandler

These @ref{4141,,BaseRequestHandler} subclasses override the
@ref{415d,,setup()} and @ref{4161,,finish()}
methods, and provide @ref{4162,,rfile} and @ref{edb,,wfile} attributes.

@geindex rfile (socketserver.DatagramRequestHandler attribute)
@anchor{library/socketserver socketserver DatagramRequestHandler rfile}@anchor{4162}
@deffn {Attribute} rfile

A file object from which receives the request is read.
Support the @ref{8a5,,io.BufferedIOBase} readable interface.
@end deffn

@geindex wfile (socketserver.DatagramRequestHandler attribute)
@anchor{library/socketserver socketserver DatagramRequestHandler wfile}@anchor{edb}
@deffn {Attribute} wfile

A file object to which the reply is written.
Support the @ref{8a5,,io.BufferedIOBase} writable interface
@end deffn


Changed in version 3.6: @ref{edb,,wfile} also supports the
@ref{8a5,,io.BufferedIOBase} writable interface.

@end deffn

@node Examples<29>,,Request Handler Objects,socketserver — A framework for network servers
@anchor{library/socketserver examples}@anchor{4163}
@subsubsection Examples


@menu
* socketserver.TCPServer Example: socketserver TCPServer Example. 
* socketserver.UDPServer Example: socketserver UDPServer Example. 
* Asynchronous Mixins:: 

@end menu

@node socketserver TCPServer Example,socketserver UDPServer Example,,Examples<29>
@anchor{library/socketserver socketserver-tcpserver-example}@anchor{4164}
@subsubsection @code{socketserver.TCPServer} Example


This is the server side:

@example
import socketserver

class MyTCPHandler(socketserver.BaseRequestHandler):
    """
    The request handler class for our server.

    It is instantiated once per connection to the server, and must
    override the handle() method to implement communication to the
    client.
    """

    def handle(self):
        # self.request is the TCP socket connected to the client
        pieces = [b'@w{'}]
        total = 0
        while b'\n' not in pieces[-1] and total < 10_000:
            pieces.append(self.request.recv(2000))
            total += len(pieces[-1])
        self.data = b'@w{'}.join(pieces)
        print(f"Received from @{self.client_address[0]@}:")
        print(self.data.decode("utf-8"))
        # just send back the same data, but upper-cased
        self.request.sendall(self.data.upper())
        # after we return, the socket will be closed.

if __name__ == "__main__":
    HOST, PORT = "localhost", 9999

    # Create the server, binding to localhost on port 9999
    with socketserver.TCPServer((HOST, PORT), MyTCPHandler) as server:
        # Activate the server; this will keep running until you
        # interrupt the program with Ctrl-C
        server.serve_forever()
@end example

An alternative request handler class that makes use of streams (file-like
objects that simplify communication by providing the standard file interface):

@example
class MyTCPHandler(socketserver.StreamRequestHandler):

    def handle(self):
        # self.rfile is a file-like object created by the handler.
        # We can now use e.g. readline() instead of raw recv() calls.
        # We limit ourselves to 10000 bytes to avoid abuse by the sender.
        self.data = self.rfile.readline(10000).rstrip()
        print(f"@{self.client_address[0]@} wrote:")
        print(self.data.decode("utf-8"))
        # Likewise, self.wfile is a file-like object used to write back
        # to the client
        self.wfile.write(self.data.upper())
@end example

The difference is that the @code{readline()} call in the second handler will call
@code{recv()} multiple times until it encounters a newline character, while the
first handler had to use a @code{recv()} loop to accumulate data until a
newline itself.  If it had just used a single @code{recv()} without the loop it
would just have returned what has been received so far from the client.
TCP is stream based: data arrives in the order it was sent, but there is no
correlation between client @code{send()} or @code{sendall()} calls and the number
of @code{recv()} calls on the server required to receive it.

This is the client side:

@example
import socket
import sys

HOST, PORT = "localhost", 9999
data = " ".join(sys.argv[1:])

# Create a socket (SOCK_STREAM means a TCP socket)
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
    # Connect to server and send data
    sock.connect((HOST, PORT))
    sock.sendall(bytes(data, "utf-8"))
    sock.sendall(b"\n")

    # Receive data from the server and shut down
    received = str(sock.recv(1024), "utf-8")

print("Sent:    ", data)
print("Received:", received)
@end example

The output of the example should look something like this:

Server:

@example
$ python TCPServer.py
127.0.0.1 wrote:
b'hello world with TCP'
127.0.0.1 wrote:
b'python is nice'
@end example

Client:

@example
$ python TCPClient.py hello world with TCP
Sent:     hello world with TCP
Received: HELLO WORLD WITH TCP
$ python TCPClient.py python is nice
Sent:     python is nice
Received: PYTHON IS NICE
@end example

@node socketserver UDPServer Example,Asynchronous Mixins,socketserver TCPServer Example,Examples<29>
@anchor{library/socketserver socketserver-udpserver-example}@anchor{4165}
@subsubsection @code{socketserver.UDPServer} Example


This is the server side:

@example
import socketserver

class MyUDPHandler(socketserver.BaseRequestHandler):
    """
    This class works similar to the TCP handler class, except that
    self.request consists of a pair of data and client socket, and since
    there is no connection the client address must be given explicitly
    when sending data back via sendto().
    """

    def handle(self):
        data = self.request[0].strip()
        socket = self.request[1]
        print(f"@{self.client_address[0]@} wrote:")
        print(data)
        socket.sendto(data.upper(), self.client_address)

if __name__ == "__main__":
    HOST, PORT = "localhost", 9999
    with socketserver.UDPServer((HOST, PORT), MyUDPHandler) as server:
        server.serve_forever()
@end example

This is the client side:

@example
import socket
import sys

HOST, PORT = "localhost", 9999
data = " ".join(sys.argv[1:])

# SOCK_DGRAM is the socket type to use for UDP sockets
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# As you can see, there is no connect() call; UDP has no connections.
# Instead, data is directly sent to the recipient via sendto().
sock.sendto(bytes(data + "\n", "utf-8"), (HOST, PORT))
received = str(sock.recv(1024), "utf-8")

print("Sent:    ", data)
print("Received:", received)
@end example

The output of the example should look exactly like for the TCP server example.

@node Asynchronous Mixins,,socketserver UDPServer Example,Examples<29>
@anchor{library/socketserver asynchronous-mixins}@anchor{4166}
@subsubsection Asynchronous Mixins


To build asynchronous handlers, use the @ref{d40,,ThreadingMixIn} and
@ref{d77,,ForkingMixIn} classes.

An example for the @ref{d40,,ThreadingMixIn} class:

@example
import socket
import threading
import socketserver

class ThreadedTCPRequestHandler(socketserver.BaseRequestHandler):

    def handle(self):
        data = str(self.request.recv(1024), 'ascii')
        cur_thread = threading.current_thread()
        response = bytes("@{@}: @{@}".format(cur_thread.name, data), 'ascii')
        self.request.sendall(response)

class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
    pass

def client(ip, port, message):
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
        sock.connect((ip, port))
        sock.sendall(bytes(message, 'ascii'))
        response = str(sock.recv(1024), 'ascii')
        print("Received: @{@}".format(response))

if __name__ == "__main__":
    # Port 0 means to select an arbitrary unused port
    HOST, PORT = "localhost", 0

    server = ThreadedTCPServer((HOST, PORT), ThreadedTCPRequestHandler)
    with server:
        ip, port = server.server_address

        # Start a thread with the server -- that thread will then start one
        # more thread for each request
        server_thread = threading.Thread(target=server.serve_forever)
        # Exit the server thread when the main thread terminates
        server_thread.daemon = True
        server_thread.start()
        print("Server loop running in thread:", server_thread.name)

        client(ip, port, "Hello World 1")
        client(ip, port, "Hello World 2")
        client(ip, port, "Hello World 3")

        server.shutdown()
@end example

The output of the example should look something like this:

@example
$ python ThreadedTCPServer.py
Server loop running in thread: Thread-1
Received: Thread-2: Hello World 1
Received: Thread-3: Hello World 2
Received: Thread-4: Hello World 3
@end example

The @ref{d77,,ForkingMixIn} class is used in the same way, except that the server
will spawn a new process for each request.
Available only on POSIX platforms that support @ref{4b6,,fork()}.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node http server — HTTP servers,http cookies — HTTP state management,socketserver — A framework for network servers,Internet Protocols and Support
@anchor{library/http server doc}@anchor{4167}@anchor{library/http server http-server-http-servers}@anchor{4168}@anchor{library/http server module-http server}@anchor{76}@anchor{library/http server translation-repo}@anchor{4169}
@subsection @code{http.server} — HTTP servers


@geindex module; http.server

`Source code:' Lib/http/server.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/http/server.py}

@geindex WWW; server
@geindex HTTP; protocol
@geindex URL
@geindex httpd


__________________________________________________________________


This module defines classes for implementing HTTP servers.

@cartouche
@quotation Warning 
@code{http.server} is not recommended for production. It only implements
@ref{416a,,basic security checks}.
@end quotation
@end cartouche

@c include for modules that don't work on WASM

@ref{2181,,Availability}: not WASI.

This module does not work or is not available on WebAssembly. See
@ref{1bae,,WebAssembly platforms} for more information.

One class, @ref{3f68,,HTTPServer}, is a @ref{152b,,socketserver.TCPServer} subclass.
It creates and listens at the HTTP socket, dispatching the requests to a
handler.  Code to create and run the server looks like this:

@example
def run(server_class=HTTPServer, handler_class=BaseHTTPRequestHandler):
    server_address = ('@w{'}, 8000)
    httpd = server_class(server_address, handler_class)
    httpd.serve_forever()
@end example

@geindex HTTPServer (class in http.server)
@anchor{library/http server http server HTTPServer}@anchor{3f68}
@deffn {Class} http.server.HTTPServer (server_address, RequestHandlerClass)

This class builds on the @ref{152b,,TCPServer} class by storing
the server address as instance variables named @code{server_name} and
@code{server_port}. The server is accessible by the handler, typically
through the handler’s @code{server} instance variable.
@end deffn

@geindex ThreadingHTTPServer (class in http.server)
@anchor{library/http server http server ThreadingHTTPServer}@anchor{d3f}
@deffn {Class} http.server.ThreadingHTTPServer (server_address, RequestHandlerClass)

This class is identical to HTTPServer but uses threads to handle
requests by using the @ref{d40,,ThreadingMixIn}. This
is useful to handle web browsers pre-opening sockets, on which
@ref{3f68,,HTTPServer} would wait indefinitely.


Added in version 3.7.

@end deffn

@geindex HTTPSServer (class in http.server)
@anchor{library/http server http server HTTPSServer}@anchor{22a}
@deffn {Class} http.server.HTTPSServer (server_address, RequestHandlerClass, bind_and_activate=True, *, certfile, keyfile=None, password=None, alpn_protocols=None)

Subclass of @ref{3f68,,HTTPServer} with a wrapped socket using the @ref{d5,,ssl} module.
If the @code{ssl} module is not available, instantiating a @code{HTTPSServer}
object fails with a @ref{246,,RuntimeError}.

The `certfile' argument is the path to the SSL certificate chain file,
and the `keyfile' is the path to file containing the private key.

A `password' can be specified for files protected and wrapped with PKCS#8,
but beware that this could possibly expose hardcoded passwords in clear.


@subsubheading See also


See @ref{598,,ssl.SSLContext.load_cert_chain()} for additional
information on the accepted values for `certfile', `keyfile'
and `password'.


When specified, the `alpn_protocols' argument must be a sequence of strings
specifying the “Application-Layer Protocol Negotiation” (ALPN) protocols
supported by the server. ALPN allows the server and the client to negotiate
the application protocol during the TLS handshake.

By default, it is set to @code{["http/1.1"]}, meaning the server supports HTTP/1.1.


Added in version 3.14.

@end deffn

@geindex ThreadingHTTPSServer (class in http.server)
@anchor{library/http server http server ThreadingHTTPSServer}@anchor{416b}
@deffn {Class} http.server.ThreadingHTTPSServer (server_address, RequestHandlerClass, bind_and_activate=True, *, certfile, keyfile=None, password=None, alpn_protocols=None)

This class is identical to @ref{22a,,HTTPSServer} but uses threads to handle
requests by inheriting from @ref{d40,,ThreadingMixIn}. This is
analogous to @ref{d3f,,ThreadingHTTPServer} only using @code{HTTPSServer}.


Added in version 3.14.

@end deffn

The @ref{3f68,,HTTPServer}, @ref{d3f,,ThreadingHTTPServer}, @ref{22a,,HTTPSServer} and
@ref{416b,,ThreadingHTTPSServer} must be given a `RequestHandlerClass' on
instantiation, of which this module provides three different variants:

@geindex BaseHTTPRequestHandler (class in http.server)
@anchor{library/http server http server BaseHTTPRequestHandler}@anchor{12d7}
@deffn {Class} http.server.BaseHTTPRequestHandler (request, client_address, server)

This class is used to handle the HTTP requests that arrive at the server.  By
itself, it cannot respond to any actual HTTP requests; it must be subclassed
to handle each request method (for example, @code{'GET'} or @code{'POST'}).
@code{BaseHTTPRequestHandler} provides a number of class and instance
variables, and methods for use by subclasses.

The handler will parse the request and the headers, then call a method
specific to the request type. The method name is constructed from the
request. For example, for the request method @code{SPAM}, the @code{do_SPAM()}
method will be called with no arguments. All of the relevant information is
stored in instance variables of the handler.  Subclasses should not need to
override or extend the @code{__init__()} method.

@code{BaseHTTPRequestHandler} has the following instance variables:

@geindex client_address (http.server.BaseHTTPRequestHandler attribute)
@anchor{library/http server http server BaseHTTPRequestHandler client_address}@anchor{416c}
@deffn {Attribute} client_address

Contains a tuple of the form @code{(host, port)} referring to the client’s
address.
@end deffn

@geindex server (http.server.BaseHTTPRequestHandler attribute)
@anchor{library/http server http server BaseHTTPRequestHandler server}@anchor{416d}
@deffn {Attribute} server

Contains the server instance.
@end deffn

@geindex close_connection (http.server.BaseHTTPRequestHandler attribute)
@anchor{library/http server http server BaseHTTPRequestHandler close_connection}@anchor{416e}
@deffn {Attribute} close_connection

Boolean that should be set before @ref{416f,,handle_one_request()} returns,
indicating if another request may be expected, or if the connection should
be shut down.
@end deffn

@geindex requestline (http.server.BaseHTTPRequestHandler attribute)
@anchor{library/http server http server BaseHTTPRequestHandler requestline}@anchor{4170}
@deffn {Attribute} requestline

Contains the string representation of the HTTP request line. The
terminating CRLF is stripped. This attribute should be set by
@ref{416f,,handle_one_request()}. If no valid request line was processed, it
should be set to the empty string.
@end deffn

@geindex command (http.server.BaseHTTPRequestHandler attribute)
@anchor{library/http server http server BaseHTTPRequestHandler command}@anchor{4171}
@deffn {Attribute} command

Contains the command (request type). For example, @code{'GET'}.
@end deffn

@geindex path (http.server.BaseHTTPRequestHandler attribute)
@anchor{library/http server http server BaseHTTPRequestHandler path}@anchor{4172}
@deffn {Attribute} path

Contains the request path. If query component of the URL is present,
then @code{path} includes the query. Using the terminology of 
@geindex RFC; RFC 3986
RFC 3986@footnote{https://datatracker.ietf.org/doc/html/rfc3986.html},
@code{path} here includes @code{hier-part} and the @code{query}.
@end deffn

@geindex request_version (http.server.BaseHTTPRequestHandler attribute)
@anchor{library/http server http server BaseHTTPRequestHandler request_version}@anchor{4173}
@deffn {Attribute} request_version

Contains the version string from the request. For example, @code{'HTTP/1.0'}.
@end deffn

@geindex headers (http.server.BaseHTTPRequestHandler attribute)
@anchor{library/http server http server BaseHTTPRequestHandler headers}@anchor{404d}
@deffn {Attribute} headers

Holds an instance of the class specified by the @ref{4174,,MessageClass} class
variable. This instance parses and manages the headers in the HTTP
request. The @ref{1e6a,,parse_headers()} function from
@ref{73,,http.client} is used to parse the headers and it requires that the
HTTP request provide a valid 
@geindex RFC; RFC 5322
RFC 5322@footnote{https://datatracker.ietf.org/doc/html/rfc5322.html} style header.
@end deffn

@geindex rfile (http.server.BaseHTTPRequestHandler attribute)
@anchor{library/http server http server BaseHTTPRequestHandler rfile}@anchor{4175}
@deffn {Attribute} rfile

An @ref{8a5,,io.BufferedIOBase} input stream, ready to read from
the start of the optional input data.
@end deffn

@geindex wfile (http.server.BaseHTTPRequestHandler attribute)
@anchor{library/http server http server BaseHTTPRequestHandler wfile}@anchor{4176}
@deffn {Attribute} wfile

Contains the output stream for writing a response back to the
client. Proper adherence to the HTTP protocol must be used when writing to
this stream in order to achieve successful interoperation with HTTP
clients.


Changed in version 3.6: This is an @ref{8a5,,io.BufferedIOBase} stream.

@end deffn

@code{BaseHTTPRequestHandler} has the following attributes:

@geindex server_version (http.server.BaseHTTPRequestHandler attribute)
@anchor{library/http server http server BaseHTTPRequestHandler server_version}@anchor{4177}
@deffn {Attribute} server_version

Specifies the server software version.  You may want to override this. The
format is multiple whitespace-separated strings, where each string is of
the form name[/version]. For example, @code{'BaseHTTP/0.2'}.
@end deffn

@geindex sys_version (http.server.BaseHTTPRequestHandler attribute)
@anchor{library/http server http server BaseHTTPRequestHandler sys_version}@anchor{4178}
@deffn {Attribute} sys_version

Contains the Python system version, in a form usable by the
@ref{4179,,version_string} method and the @ref{4177,,server_version} class
variable. For example, @code{'Python/1.4'}.
@end deffn

@geindex error_message_format (http.server.BaseHTTPRequestHandler attribute)
@anchor{library/http server http server BaseHTTPRequestHandler error_message_format}@anchor{1156}
@deffn {Attribute} error_message_format

Specifies a format string that should be used by @ref{1155,,send_error()} method
for building an error response to the client. The string is filled by
default with variables from @ref{4032,,responses} based on the status code
that passed to @code{send_error()}.
@end deffn

@geindex error_content_type (http.server.BaseHTTPRequestHandler attribute)
@anchor{library/http server http server BaseHTTPRequestHandler error_content_type}@anchor{417a}
@deffn {Attribute} error_content_type

Specifies the Content-Type HTTP header of error responses sent to the
client.  The default value is @code{'text/html'}.
@end deffn

@geindex protocol_version (http.server.BaseHTTPRequestHandler attribute)
@anchor{library/http server http server BaseHTTPRequestHandler protocol_version}@anchor{417b}
@deffn {Attribute} protocol_version

Specifies the HTTP version to which the server is conformant. It is sent
in responses to let the client know the server’s communication
capabilities for future requests. If set to
@code{'HTTP/1.1'}, the server will permit HTTP persistent connections;
however, your server `must' then include an accurate @code{Content-Length}
header (using @ref{417c,,send_header()}) in all of its responses to clients.
For backwards compatibility, the setting defaults to @code{'HTTP/1.0'}.
@end deffn

@geindex MessageClass (http.server.BaseHTTPRequestHandler attribute)
@anchor{library/http server http server BaseHTTPRequestHandler MessageClass}@anchor{4174}
@deffn {Attribute} MessageClass

Specifies an @ref{581,,email.message.Message}-like class to parse HTTP
headers.  Typically, this is not overridden, and it defaults to
@ref{404b,,http.client.HTTPMessage}.
@end deffn

@geindex responses (http.server.BaseHTTPRequestHandler attribute)
@anchor{library/http server http server BaseHTTPRequestHandler responses}@anchor{4032}
@deffn {Attribute} responses

This attribute contains a mapping of error code integers to two-element tuples
containing a short and long message. For example, @code{@{code: (shortmessage,
longmessage)@}}. The `shortmessage' is usually used as the `message' key in an
error response, and `longmessage' as the `explain' key.  It is used by
@ref{417d,,send_response_only()} and @ref{1155,,send_error()} methods.
@end deffn

A @code{BaseHTTPRequestHandler} instance has the following methods:

@geindex handle() (http.server.BaseHTTPRequestHandler method)
@anchor{library/http server http server BaseHTTPRequestHandler handle}@anchor{417e}
@deffn {Method} handle ()

Calls @ref{416f,,handle_one_request()} once (or, if persistent connections are
enabled, multiple times) to handle incoming HTTP requests. You should
never need to override it; instead, implement appropriate @code{do_*()}
methods.
@end deffn

@geindex handle_one_request() (http.server.BaseHTTPRequestHandler method)
@anchor{library/http server http server BaseHTTPRequestHandler handle_one_request}@anchor{416f}
@deffn {Method} handle_one_request ()

This method will parse and dispatch the request to the appropriate
@code{do_*()} method.  You should never need to override it.
@end deffn

@geindex handle_expect_100() (http.server.BaseHTTPRequestHandler method)
@anchor{library/http server http server BaseHTTPRequestHandler handle_expect_100}@anchor{417f}
@deffn {Method} handle_expect_100 ()

When an HTTP/1.1 conformant server receives an @code{Expect: 100-continue}
request header it responds back with a @code{100 Continue} followed by @code{200
OK} headers.
This method can be overridden to raise an error if the server does not
want the client to continue.  For example, the server can choose to send @code{417
Expectation Failed} as a response header and @code{return False}.


Added in version 3.2.

@end deffn

@geindex send_error() (http.server.BaseHTTPRequestHandler method)
@anchor{library/http server http server BaseHTTPRequestHandler send_error}@anchor{1155}
@deffn {Method} send_error (code, message=None, explain=None)

Sends and logs a complete error reply to the client. The numeric `code'
specifies the HTTP error code, with `message' as an optional, short, human
readable description of the error.  The `explain' argument can be used to
provide more detailed information about the error; it will be formatted
using the @ref{1156,,error_message_format} attribute and emitted, after
a complete set of headers, as the response body.  The @ref{4032,,responses}
attribute holds the default values for `message' and `explain' that
will be used if no value is provided; for unknown codes the default value
for both is the string @code{???}. The body will be empty if the method is
HEAD or the response code is one of the following: @code{1@var{xx}},
@code{204 No Content}, @code{205 Reset Content}, @code{304 Not Modified}.


Changed in version 3.4: The error response includes a Content-Length header.
Added the `explain' argument.

@end deffn

@geindex send_response() (http.server.BaseHTTPRequestHandler method)
@anchor{library/http server http server BaseHTTPRequestHandler send_response}@anchor{4180}
@deffn {Method} send_response (code, message=None)

Adds a response header to the headers buffer and logs the accepted
request. The HTTP response line is written to the internal buffer,
followed by `Server' and `Date' headers. The values for these two headers
are picked up from the @ref{4179,,version_string()} and
@ref{4181,,date_time_string()} methods, respectively. If the server does not
intend to send any other headers using the @ref{417c,,send_header()} method,
then @code{send_response()} should be followed by an @ref{12d8,,end_headers()}
call.


Changed in version 3.3: Headers are stored to an internal buffer and @ref{12d8,,end_headers()}
needs to be called explicitly.

@end deffn

@geindex send_header() (http.server.BaseHTTPRequestHandler method)
@anchor{library/http server http server BaseHTTPRequestHandler send_header}@anchor{417c}
@deffn {Method} send_header (keyword, value)

Adds the HTTP header to an internal buffer which will be written to the
output stream when either @ref{12d8,,end_headers()} or @ref{12d9,,flush_headers()} is
invoked. `keyword' should specify the header keyword, with `value'
specifying its value. Note that, after the send_header calls are done,
@code{end_headers()} MUST BE called in order to complete the operation.

This method does not reject input containing CRLF sequences.


Changed in version 3.2: Headers are stored in an internal buffer.

@end deffn

@geindex send_response_only() (http.server.BaseHTTPRequestHandler method)
@anchor{library/http server http server BaseHTTPRequestHandler send_response_only}@anchor{417d}
@deffn {Method} send_response_only (code, message=None)

Sends the response header only, used for the purposes when @code{100
Continue} response is sent by the server to the client. The headers not
buffered and sent directly the output stream.If the `message' is not
specified, the HTTP message corresponding the response `code'  is sent.

This method does not reject `message' containing CRLF sequences.


Added in version 3.2.

@end deffn

@geindex end_headers() (http.server.BaseHTTPRequestHandler method)
@anchor{library/http server http server BaseHTTPRequestHandler end_headers}@anchor{12d8}
@deffn {Method} end_headers ()

Adds a blank line
(indicating the end of the HTTP headers in the response)
to the headers buffer and calls @ref{12d9,,flush_headers()}.


Changed in version 3.2: The buffered headers are written to the output stream.

@end deffn

@geindex flush_headers() (http.server.BaseHTTPRequestHandler method)
@anchor{library/http server http server BaseHTTPRequestHandler flush_headers}@anchor{12d9}
@deffn {Method} flush_headers ()

Finally send the headers to the output stream and flush the internal
headers buffer.


Added in version 3.3.

@end deffn

@geindex log_request() (http.server.BaseHTTPRequestHandler method)
@anchor{library/http server http server BaseHTTPRequestHandler log_request}@anchor{4182}
@deffn {Method} log_request (code='-', size='-')

Logs an accepted (successful) request. `code' should specify the numeric
HTTP code associated with the response. If a size of the response is
available, then it should be passed as the `size' parameter.
@end deffn

@geindex log_error() (http.server.BaseHTTPRequestHandler method)
@anchor{library/http server http server BaseHTTPRequestHandler log_error}@anchor{4183}
@deffn {Method} log_error (...)

Logs an error when a request cannot be fulfilled. By default, it passes
the message to @ref{4184,,log_message()}, so it takes the same arguments
(`format' and additional values).
@end deffn

@geindex log_message() (http.server.BaseHTTPRequestHandler method)
@anchor{library/http server http server BaseHTTPRequestHandler log_message}@anchor{4184}
@deffn {Method} log_message (format, ...)

Logs an arbitrary message to @code{sys.stderr}. This is typically overridden
to create custom error logging mechanisms. The `format' argument is a
standard printf-style format string, where the additional arguments to
@code{log_message()} are applied as inputs to the formatting. The client
ip address and current date and time are prefixed to every message logged.
@end deffn

@geindex version_string() (http.server.BaseHTTPRequestHandler method)
@anchor{library/http server http server BaseHTTPRequestHandler version_string}@anchor{4179}
@deffn {Method} version_string ()

Returns the server software’s version string. This is a combination of the
@ref{4177,,server_version} and @ref{4178,,sys_version} attributes.
@end deffn

@geindex date_time_string() (http.server.BaseHTTPRequestHandler method)
@anchor{library/http server http server BaseHTTPRequestHandler date_time_string}@anchor{4181}
@deffn {Method} date_time_string (timestamp=None)

Returns the date and time given by `timestamp' (which must be @code{None} or in
the format returned by @ref{55d,,time.time()}), formatted for a message
header. If `timestamp' is omitted, it uses the current date and time.

The result looks like @code{'Sun, 06 Nov 1994 08:49:37 GMT'}.
@end deffn

@geindex log_date_time_string() (http.server.BaseHTTPRequestHandler method)
@anchor{library/http server http server BaseHTTPRequestHandler log_date_time_string}@anchor{4185}
@deffn {Method} log_date_time_string ()

Returns the current date and time, formatted for logging.
@end deffn

@geindex address_string() (http.server.BaseHTTPRequestHandler method)
@anchor{library/http server http server BaseHTTPRequestHandler address_string}@anchor{4186}
@deffn {Method} address_string ()

Returns the client address.


Changed in version 3.3: Previously, a name lookup was performed. To avoid name resolution
delays, it now always returns the IP address.

@end deffn
@end deffn

@geindex SimpleHTTPRequestHandler (class in http.server)
@anchor{library/http server http server SimpleHTTPRequestHandler}@anchor{d3e}
@deffn {Class} http.server.SimpleHTTPRequestHandler (request, client_address, server, directory=None)

This class serves files from the directory `directory' and below,
or the current directory if `directory' is not provided, directly
mapping the directory structure to HTTP requests.


Changed in version 3.7: Added the `directory' parameter.



Changed in version 3.9: The `directory' parameter accepts a @ref{5a1,,path-like object}.


A lot of the work, such as parsing the request, is done by the base class
@ref{12d7,,BaseHTTPRequestHandler}.  This class implements the @ref{4187,,do_GET()}
and @ref{4188,,do_HEAD()} functions.

The following are defined as class-level attributes of
@code{SimpleHTTPRequestHandler}:

@geindex server_version (http.server.SimpleHTTPRequestHandler attribute)
@anchor{library/http server http server SimpleHTTPRequestHandler server_version}@anchor{4189}
@deffn {Attribute} server_version

This will be @code{"SimpleHTTP/" + __version__}, where @code{__version__} is
defined at the module level.
@end deffn

@geindex extensions_map (http.server.SimpleHTTPRequestHandler attribute)
@anchor{library/http server http server SimpleHTTPRequestHandler extensions_map}@anchor{418a}
@deffn {Attribute} extensions_map

A dictionary mapping suffixes into MIME types, contains custom overrides
for the default system mappings. The mapping is used case-insensitively,
and so should contain only lower-cased keys.


Changed in version 3.9: This dictionary is no longer filled with the default system mappings,
but only contains overrides.

@end deffn

The @code{SimpleHTTPRequestHandler} class defines the following methods:

@geindex do_HEAD() (http.server.SimpleHTTPRequestHandler method)
@anchor{library/http server http server SimpleHTTPRequestHandler do_HEAD}@anchor{4188}
@deffn {Method} do_HEAD ()

This method serves the @code{'HEAD'} request type: it sends the headers it
would send for the equivalent @code{GET} request. See the @ref{4187,,do_GET()}
method for a more complete explanation of the possible headers.
@end deffn

@geindex do_GET() (http.server.SimpleHTTPRequestHandler method)
@anchor{library/http server http server SimpleHTTPRequestHandler do_GET}@anchor{4187}
@deffn {Method} do_GET ()

The request is mapped to a local file by interpreting the request as a
path relative to the current working directory.

If the request was mapped to a directory, the directory is checked for a
file named @code{index.html} or @code{index.htm} (in that order). If found, the
file’s contents are returned; otherwise a directory listing is generated
by calling the @code{list_directory()} method. This method uses
@ref{1306,,os.listdir()} to scan the directory, and returns a @code{404} error
response if the @code{listdir()} fails.

If the request was mapped to a file, it is opened. Any @ref{2c2,,OSError}
exception in opening the requested file is mapped to a @code{404},
@code{'File not found'} error. If there was an @code{'If-Modified-Since'}
header in the request, and the file was not modified after this time,
a @code{304}, @code{'Not Modified'} response is sent. Otherwise, the content
type is guessed by calling the @code{guess_type()} method, which in turn
uses the `extensions_map' variable, and the file contents are returned.

A @code{'Content-type:'} header with the guessed content type is output,
followed by a @code{'Content-Length:'} header with the file’s size and a
@code{'Last-Modified:'} header with the file’s modification time.

Then follows a blank line signifying the end of the headers, and then the
contents of the file are output.

For example usage, see the implementation of the @code{test} function
in Lib/http/server.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/http/server.py}.


Changed in version 3.7: Support of the @code{'If-Modified-Since'} header.

@end deffn
@end deffn

The @ref{d3e,,SimpleHTTPRequestHandler} class can be used in the following
manner in order to create a very basic webserver serving files relative to
the current directory:

@example
import http.server
import socketserver

PORT = 8000

Handler = http.server.SimpleHTTPRequestHandler

with socketserver.TCPServer(("", PORT), Handler) as httpd:
    print("serving at port", PORT)
    httpd.serve_forever()
@end example

@ref{d3e,,SimpleHTTPRequestHandler} can also be subclassed to enhance behavior,
such as using different index file names by overriding the class attribute
@code{index_pages}.

@geindex CGIHTTPRequestHandler (class in http.server)
@anchor{library/http server http server CGIHTTPRequestHandler}@anchor{327}
@deffn {Class} http.server.CGIHTTPRequestHandler (request, client_address, server)

This class is used to serve either files or output of CGI scripts from the
current directory and below. Note that mapping HTTP hierarchic structure to
local directory structure is exactly as in @ref{d3e,,SimpleHTTPRequestHandler}.

@cartouche
@quotation Note 
CGI scripts run by the @code{CGIHTTPRequestHandler} class cannot execute
redirects (HTTP code 302), because code 200 (script output follows) is
sent prior to execution of the CGI script.  This pre-empts the status
code.
@end quotation
@end cartouche

The class will however, run the CGI script, instead of serving it as a file,
if it guesses it to be a CGI script.  Only directory-based CGI are used —
the other common server configuration is to treat special extensions as
denoting CGI scripts.

The @code{do_GET()} and @code{do_HEAD()} functions are modified to run CGI scripts
and serve the output, instead of serving files, if the request leads to
somewhere below the @code{cgi_directories} path.

The @code{CGIHTTPRequestHandler} defines the following data member:

@geindex cgi_directories (http.server.CGIHTTPRequestHandler attribute)
@anchor{library/http server http server CGIHTTPRequestHandler cgi_directories}@anchor{418b}
@deffn {Attribute} cgi_directories

This defaults to @code{['/cgi-bin', '/htbin']} and describes directories to
treat as containing CGI scripts.
@end deffn

The @code{CGIHTTPRequestHandler} defines the following method:

@geindex do_POST() (http.server.CGIHTTPRequestHandler method)
@anchor{library/http server http server CGIHTTPRequestHandler do_POST}@anchor{418c}
@deffn {Method} do_POST ()

This method serves the @code{'POST'} request type, only allowed for CGI
scripts.  Error 501, “Can only POST to CGI scripts”, is output when trying
to POST to a non-CGI url.
@end deffn

Note that CGI scripts will be run with UID of user nobody, for security
reasons.  Problems with the CGI script will be translated to error 403.


Deprecated since version 3.13, will be removed in version 3.15: @code{CGIHTTPRequestHandler} is being removed in 3.15.  CGI has not
been considered a good way to do things for well over a decade. This code
has been unmaintained for a while now and sees very little practical use.
Retaining it could lead to further @ref{416a,,security considerations}.

@end deffn

@menu
* Command-line interface: Command-line interface<7>. 
* Security considerations: Security considerations<3>. 

@end menu

@node Command-line interface<7>,Security considerations<3>,,http server — HTTP servers
@anchor{library/http server command-line-interface}@anchor{418d}@anchor{library/http server http-server-cli}@anchor{1157}
@subsubsection Command-line interface


@code{http.server} can also be invoked directly using the @ref{23e,,-m}
switch of the interpreter.  The following example illustrates how to serve
files relative to the current directory:

@example
python -m http.server [OPTIONS] [port]
@end example

The following options are accepted:

@geindex http.server command line option; port
@anchor{library/http server cmdoption-http server-arg-port}@anchor{418e}
@deffn {Option} port

The server listens to port 8000 by default. The default can be overridden
by passing the desired port number as an argument:

@example
python -m http.server 9000
@end example
@end deffn

@geindex http.server command line option; -b
@geindex http.server command line option; --bind
@anchor{library/http server cmdoption-http server-b}@anchor{418f}@anchor{library/http server cmdoption-http server-bind}@anchor{4190}
@deffn {Option} @w{-}b, @w{-}@w{-}bind <address>

Specifies a specific address to which it should bind. Both IPv4 and IPv6
addresses are supported. By default, the server binds itself to all
interfaces. For example, the following command causes the server to bind
to localhost only:

@example
python -m http.server --bind 127.0.0.1
@end example


Added in version 3.4.



Changed in version 3.8: Support IPv6 in the @code{--bind} option.

@end deffn

@geindex http.server command line option; -d
@geindex http.server command line option; --directory
@anchor{library/http server cmdoption-http server-d}@anchor{1888}@anchor{library/http server cmdoption-http server-directory}@anchor{4191}
@deffn {Option} @w{-}d, @w{-}@w{-}directory <dir>

Specifies a directory to which it should serve the files. By default,
the server uses the current directory. For example, the following command
uses a specific directory:

@example
python -m http.server --directory /tmp/
@end example


Added in version 3.7.

@end deffn

@geindex http.server command line option; -p
@geindex http.server command line option; --protocol
@anchor{library/http server cmdoption-http server-p}@anchor{4192}@anchor{library/http server cmdoption-http server-protocol}@anchor{4193}
@deffn {Option} @w{-}p, @w{-}@w{-}protocol <version>

Specifies the HTTP version to which the server is conformant. By default,
the server is conformant to HTTP/1.0. For example, the following command
runs an HTTP/1.1 conformant server:

@example
python -m http.server --protocol HTTP/1.1
@end example


Added in version 3.11.

@end deffn

@geindex http.server command line option; --cgi
@anchor{library/http server cmdoption-http server-cgi}@anchor{4194}
@deffn {Option} @w{-}@w{-}cgi

@ref{327,,CGIHTTPRequestHandler} can be enabled in the command line by passing
the @code{--cgi} option:

@example
python -m http.server --cgi
@end example


Deprecated since version 3.13, will be removed in version 3.15: @code{http.server} command line @code{--cgi} support is being removed
because @ref{327,,CGIHTTPRequestHandler} is being removed.

@end deffn

@cartouche
@quotation Warning 
@ref{327,,CGIHTTPRequestHandler} and the @code{--cgi} command-line option
are not intended for use by untrusted clients and may be vulnerable
to exploitation. Always use within a secure environment.
@end quotation
@end cartouche

@geindex http.server command line option; --tls-cert
@anchor{library/http server cmdoption-http server-tls-cert}@anchor{22b}
@deffn {Option} @w{-}@w{-}tls@w{-}cert

Specifies a TLS certificate chain for HTTPS connections:

@example
python -m http.server --tls-cert fullchain.pem
@end example


Added in version 3.14.

@end deffn

@geindex http.server command line option; --tls-key
@anchor{library/http server cmdoption-http server-tls-key}@anchor{22c}
@deffn {Option} @w{-}@w{-}tls@w{-}key

Specifies a private key file for HTTPS connections.

This option requires @code{--tls-cert} to be specified.


Added in version 3.14.

@end deffn

@geindex http.server command line option; --tls-password-file
@anchor{library/http server cmdoption-http server-tls-password-file}@anchor{22d}
@deffn {Option} @w{-}@w{-}tls@w{-}password@w{-}file

Specifies the password file for password-protected private keys:

@example
python -m http.server \
       --tls-cert cert.pem \
       --tls-key key.pem \
       --tls-password-file password.txt
@end example

This option requires @code{--tls-cert} to be specified.


Added in version 3.14.

@end deffn

@node Security considerations<3>,,Command-line interface<7>,http server — HTTP servers
@anchor{library/http server http-server-security}@anchor{416a}@anchor{library/http server security-considerations}@anchor{4195}
@subsubsection Security considerations


@geindex http.server; security

@ref{d3e,,SimpleHTTPRequestHandler} will follow symbolic links when handling
requests, this makes it possible for files outside of the specified directory
to be served.

Methods @ref{417c,,BaseHTTPRequestHandler.send_header()} and
@ref{417d,,BaseHTTPRequestHandler.send_response_only()} assume sanitized input
and do not perform input validation such as checking for the presence of CRLF
sequences. Untrusted input may result in HTTP Header injection attacks.

Earlier versions of Python did not scrub control characters from the
log messages emitted to stderr from @code{python -m http.server} or the
default @ref{12d7,,BaseHTTPRequestHandler} @code{.log_message}
implementation. This could allow remote clients connecting to your
server to send nefarious control codes to your terminal.


Changed in version 3.12: Control characters are scrubbed in stderr logs.


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node http cookies — HTTP state management,http cookiejar — Cookie handling for HTTP clients,http server — HTTP servers,Internet Protocols and Support
@anchor{library/http cookies doc}@anchor{4196}@anchor{library/http cookies http-cookies-http-state-management}@anchor{4197}@anchor{library/http cookies module-http cookies}@anchor{75}@anchor{library/http cookies translation-repo}@anchor{4198}
@subsection @code{http.cookies} — HTTP state management


@geindex module; http.cookies

`Source code:' Lib/http/cookies.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/http/cookies.py}


__________________________________________________________________


The @code{http.cookies} module defines classes for abstracting the concept of
cookies, an HTTP state management mechanism. It supports both simple string-only
cookies, and provides an abstraction for having any serializable data-type as
cookie value.

The module formerly strictly applied the parsing rules described in the
@geindex RFC; RFC 2109
RFC 2109@footnote{https://datatracker.ietf.org/doc/html/rfc2109.html} and 
@geindex RFC; RFC 2068
RFC 2068@footnote{https://datatracker.ietf.org/doc/html/rfc2068.html} specifications.  It has since been discovered that
MSIE 3.0x didn’t follow the character rules outlined in those specs; many
current-day browsers and servers have also relaxed parsing rules when it comes
to cookie handling.  As a result, this module now uses parsing rules that are a
bit less strict than they once were.

The character set, @ref{14cf,,string.ascii_letters}, @ref{2789,,string.digits} and
@code{!#$%&'*+-.^_`|~:} denote the set of valid characters allowed by this module
in a cookie name (as @ref{e01,,key}).


Changed in version 3.3: Allowed ‘:’ as a valid cookie name character.


@cartouche
@quotation Note 
On encountering an invalid cookie, @ref{4199,,CookieError} is raised, so if your
cookie data comes from a browser you should always prepare for invalid data
and catch @code{CookieError} on parsing.
@end quotation
@end cartouche

@geindex CookieError
@anchor{library/http cookies http cookies CookieError}@anchor{4199}
@deffn {Exception} http.cookies.CookieError

Exception failing because of 
@geindex RFC; RFC 2109
RFC 2109@footnote{https://datatracker.ietf.org/doc/html/rfc2109.html} invalidity: incorrect attributes,
incorrect @code{Set-Cookie} header, etc.
@end deffn

@geindex BaseCookie (class in http.cookies)
@anchor{library/http cookies http cookies BaseCookie}@anchor{419a}
@deffn {Class} http.cookies.BaseCookie ([input])

This class is a dictionary-like object whose keys are strings and whose values
are @ref{e04,,Morsel} instances. Note that upon setting a key to a value, the
value is first converted to a @code{Morsel} containing the key and the value.

If `input' is given, it is passed to the @ref{419b,,load()} method.
@end deffn

@geindex SimpleCookie (class in http.cookies)
@anchor{library/http cookies http cookies SimpleCookie}@anchor{1e66}
@deffn {Class} http.cookies.SimpleCookie ([input])

This class derives from @ref{419a,,BaseCookie} and overrides @ref{419c,,value_decode()}
and @ref{419d,,value_encode()}. @code{SimpleCookie} supports
strings as cookie values. When setting the value, @code{SimpleCookie}
calls the builtin @ref{16a,,str()} to convert
the value to a string. Values received from HTTP are kept as strings.
@end deffn


@subsubheading See also



@table @asis

@item Module @ref{74,,http.cookiejar}

HTTP cookie handling for web `clients'.  The @ref{74,,http.cookiejar} and
@code{http.cookies} modules do not depend on each other.

@geindex RFC; RFC 2109

@item RFC 2109@footnote{https://datatracker.ietf.org/doc/html/rfc2109.html} - HTTP State Management Mechanism

This is the state management specification implemented by this module.
@end table


@menu
* Cookie Objects:: 
* Morsel Objects:: 
* Example: Example<12>. 

@end menu

@node Cookie Objects,Morsel Objects,,http cookies — HTTP state management
@anchor{library/http cookies cookie-objects}@anchor{419e}@anchor{library/http cookies id1}@anchor{419f}
@subsubsection Cookie Objects


@geindex value_decode() (http.cookies.BaseCookie method)
@anchor{library/http cookies http cookies BaseCookie value_decode}@anchor{419c}
@deffn {Method} BaseCookie.value_decode (val)

Return a tuple @code{(real_value, coded_value)} from a string representation.
@code{real_value} can be any type. This method does no decoding in
@ref{419a,,BaseCookie} — it exists so it can be overridden.
@end deffn

@geindex value_encode() (http.cookies.BaseCookie method)
@anchor{library/http cookies http cookies BaseCookie value_encode}@anchor{419d}
@deffn {Method} BaseCookie.value_encode (val)

Return a tuple @code{(real_value, coded_value)}. `val' can be any type, but
@code{coded_value} will always be converted to a string.
This method does no encoding in @ref{419a,,BaseCookie} — it exists so it can
be overridden.

In general, it should be the case that @code{value_encode()} and
@ref{419c,,value_decode()} are inverses on the range of `value_decode'.
@end deffn

@geindex output() (http.cookies.BaseCookie method)
@anchor{library/http cookies http cookies BaseCookie output}@anchor{41a0}
@deffn {Method} BaseCookie.output (attrs=None, header='Set-Cookie:', sep='\r\n')

Return a string representation suitable to be sent as HTTP headers. `attrs' and
`header' are sent to each @ref{e04,,Morsel}’s @ref{41a1,,output()} method. `sep' is used
to join the headers together, and is by default the combination @code{'\r\n'}
(CRLF).
@end deffn

@geindex js_output() (http.cookies.BaseCookie method)
@anchor{library/http cookies http cookies BaseCookie js_output}@anchor{178d}
@deffn {Method} BaseCookie.js_output (attrs=None)

Return an embeddable JavaScript snippet, which, if run on a browser which
supports JavaScript, will act the same as if the HTTP headers was sent.

The meaning for `attrs' is the same as in @ref{41a0,,output()}.
@end deffn

@geindex load() (http.cookies.BaseCookie method)
@anchor{library/http cookies http cookies BaseCookie load}@anchor{419b}
@deffn {Method} BaseCookie.load (rawdata)

If `rawdata' is a string, parse it as an @code{HTTP_COOKIE} and add the values
found there as @ref{e04,,Morsel}s. If it is a dictionary, it is equivalent to:

@example
for k, v in rawdata.items():
    cookie[k] = v
@end example
@end deffn

@node Morsel Objects,Example<12>,Cookie Objects,http cookies — HTTP state management
@anchor{library/http cookies id2}@anchor{41a2}@anchor{library/http cookies morsel-objects}@anchor{41a3}
@subsubsection Morsel Objects


@geindex Morsel (class in http.cookies)
@anchor{library/http cookies http cookies Morsel}@anchor{e04}
@deffn {Class} http.cookies.Morsel

Abstract a key/value pair, which has some 
@geindex RFC; RFC 2109
RFC 2109@footnote{https://datatracker.ietf.org/doc/html/rfc2109.html} attributes.

Morsels are dictionary-like objects, whose set of keys is constant — the valid
@geindex RFC; RFC 2109
RFC 2109@footnote{https://datatracker.ietf.org/doc/html/rfc2109.html} attributes, which are:

@quotation

@geindex expires (http.cookies.Morsel attribute)
@geindex path (http.cookies.Morsel attribute)
@geindex comment (http.cookies.Morsel attribute)
@geindex domain (http.cookies.Morsel attribute)
@geindex secure (http.cookies.Morsel attribute)
@geindex version (http.cookies.Morsel attribute)
@geindex httponly (http.cookies.Morsel attribute)
@geindex samesite (http.cookies.Morsel attribute)
@geindex partitioned (http.cookies.Morsel attribute)
@anchor{library/http cookies http cookies Morsel expires}@anchor{41a4}
@deffn {Attribute} expires
@anchor{library/http cookies http cookies Morsel path}@anchor{41a5}
@deffnx {Attribute} path
@anchor{library/http cookies http cookies Morsel comment}@anchor{41a6}
@deffnx {Attribute} comment
@anchor{library/http cookies http cookies Morsel domain}@anchor{41a7}
@deffnx {Attribute} domain

@deffnx {Attribute} max@w{-}age
@anchor{library/http cookies http cookies Morsel secure}@anchor{41a8}
@deffnx {Attribute} secure
@anchor{library/http cookies http cookies Morsel version}@anchor{41a9}
@deffnx {Attribute} version
@anchor{library/http cookies http cookies Morsel httponly}@anchor{15dc}
@deffnx {Attribute} httponly
@anchor{library/http cookies http cookies Morsel samesite}@anchor{41aa}
@deffnx {Attribute} samesite
@anchor{library/http cookies http cookies Morsel partitioned}@anchor{41ab}
@deffnx {Attribute} partitioned
@end deffn
@end quotation

The attribute @ref{15dc,,httponly} specifies that the cookie is only transferred
in HTTP requests, and is not accessible through JavaScript. This is intended
to mitigate some forms of cross-site scripting.

The attribute @ref{41aa,,samesite} controls when the browser sends the cookie with
cross-site requests. This helps to mitigate CSRF attacks. Valid values are
“Strict” (only sent with same-site requests), “Lax” (sent with same-site
requests and top-level navigations), and “None” (sent with same-site and
cross-site requests). When using “None”, the “secure” attribute must also
be set, as required by modern browsers.

The attribute @ref{41ab,,partitioned} indicates to user agents that these
cross-site cookies `should' only be available in the same top-level context
that the cookie was first set in. For this to be accepted by the user agent,
you `must' also set @code{Secure}.

In addition, it is recommended to use the @code{__Host} prefix when setting
partitioned cookies to make them bound to the hostname and not the
registrable domain. Read
CHIPS (Cookies Having Independent Partitioned State)@footnote{https://github.com/privacycg/CHIPS/blob/main/README.md}
for full details and examples.

The keys are case-insensitive and their default value is @code{'@w{'}}.


Changed in version 3.5: @code{__eq__()} now takes @ref{e01,,key} and @ref{e02,,value}
into account.



Changed in version 3.7: Attributes @ref{e01,,key}, @ref{e02,,value} and
@ref{e03,,coded_value} are read-only.  Use @ref{e05,,set()} for
setting them.



Changed in version 3.8: Added support for the @ref{41aa,,samesite} attribute.



Changed in version 3.14: Added support for the @ref{41ab,,partitioned} attribute.

@end deffn

@geindex value (http.cookies.Morsel attribute)
@anchor{library/http cookies http cookies Morsel value}@anchor{e02}
@deffn {Attribute} Morsel.value

The value of the cookie.
@end deffn

@geindex coded_value (http.cookies.Morsel attribute)
@anchor{library/http cookies http cookies Morsel coded_value}@anchor{e03}
@deffn {Attribute} Morsel.coded_value

The encoded value of the cookie — this is what should be sent.
@end deffn

@geindex key (http.cookies.Morsel attribute)
@anchor{library/http cookies http cookies Morsel key}@anchor{e01}
@deffn {Attribute} Morsel.key

The name of the cookie.
@end deffn

@geindex set() (http.cookies.Morsel method)
@anchor{library/http cookies http cookies Morsel set}@anchor{e05}
@deffn {Method} Morsel.set (key, value, coded_value)

Set the `key', `value' and `coded_value' attributes.
@end deffn

@geindex isReservedKey() (http.cookies.Morsel method)
@anchor{library/http cookies http cookies Morsel isReservedKey}@anchor{41ac}
@deffn {Method} Morsel.isReservedKey (K)

Whether `K' is a member of the set of keys of a @ref{e04,,Morsel}.
@end deffn

@geindex output() (http.cookies.Morsel method)
@anchor{library/http cookies http cookies Morsel output}@anchor{41a1}
@deffn {Method} Morsel.output (attrs=None, header='Set-Cookie:')

Return a string representation of the Morsel, suitable to be sent as an HTTP
header. By default, all the attributes are included, unless `attrs' is given, in
which case it should be a list of attributes to use. `header' is by default
@code{"Set-Cookie:"}.
@end deffn

@geindex js_output() (http.cookies.Morsel method)
@anchor{library/http cookies http cookies Morsel js_output}@anchor{41ad}
@deffn {Method} Morsel.js_output (attrs=None)

Return an embeddable JavaScript snippet, which, if run on a browser which
supports JavaScript, will act the same as if the HTTP header was sent.

The meaning for `attrs' is the same as in @ref{41a1,,output()}.
@end deffn

@geindex OutputString() (http.cookies.Morsel method)
@anchor{library/http cookies http cookies Morsel OutputString}@anchor{41ae}
@deffn {Method} Morsel.OutputString (attrs=None)

Return a string representing the Morsel, without any surrounding HTTP or
JavaScript.

The meaning for `attrs' is the same as in @ref{41a1,,output()}.
@end deffn

@geindex update() (http.cookies.Morsel method)
@anchor{library/http cookies http cookies Morsel update}@anchor{10cf}
@deffn {Method} Morsel.update (values)

Update the values in the Morsel dictionary with the values in the dictionary
`values'.  Raise an error if any of the keys in the `values' dict is not a
valid 
@geindex RFC; RFC 2109
RFC 2109@footnote{https://datatracker.ietf.org/doc/html/rfc2109.html} attribute.


Changed in version 3.5: an error is raised for invalid keys.

@end deffn

@geindex copy() (http.cookies.Morsel method)
@anchor{library/http cookies http cookies Morsel copy}@anchor{10ce}
@deffn {Method} Morsel.copy (value)

Return a shallow copy of the Morsel object.


Changed in version 3.5: return a Morsel object instead of a dict.

@end deffn

@geindex setdefault() (http.cookies.Morsel method)
@anchor{library/http cookies http cookies Morsel setdefault}@anchor{41af}
@deffn {Method} Morsel.setdefault (key, value=None)

Raise an error if key is not a valid 
@geindex RFC; RFC 2109
RFC 2109@footnote{https://datatracker.ietf.org/doc/html/rfc2109.html} attribute, otherwise
behave the same as @ref{127f,,dict.setdefault()}.
@end deffn

@node Example<12>,,Morsel Objects,http cookies — HTTP state management
@anchor{library/http cookies cookie-example}@anchor{41b0}@anchor{library/http cookies example}@anchor{41b1}
@subsubsection Example


The following example demonstrates how to use the @code{http.cookies} module.

@example
>>> from http import cookies
>>> C = cookies.SimpleCookie()
>>> C["fig"] = "newton"
>>> C["sugar"] = "wafer"
>>> print(C) # generate HTTP headers
Set-Cookie: fig=newton
Set-Cookie: sugar=wafer
>>> print(C.output()) # same thing
Set-Cookie: fig=newton
Set-Cookie: sugar=wafer
>>> C = cookies.SimpleCookie()
>>> C["rocky"] = "road"
>>> C["rocky"]["path"] = "/cookie"
>>> print(C.output(header="Cookie:"))
Cookie: rocky=road; Path=/cookie
>>> print(C.output(attrs=[], header="Cookie:"))
Cookie: rocky=road
>>> C = cookies.SimpleCookie()
>>> C.load("chips=ahoy; vienna=finger") # load from a string (HTTP header)
>>> print(C)
Set-Cookie: chips=ahoy
Set-Cookie: vienna=finger
>>> C = cookies.SimpleCookie()
>>> C.load('keebler="E=everybody; L=\\"Loves\\"; fudge=;";')
>>> print(C)
Set-Cookie: keebler="E=everybody; L=\"Loves\"; fudge=;"
>>> C = cookies.SimpleCookie()
>>> C["oreo"] = "doublestuff"
>>> C["oreo"]["path"] = "/"
>>> print(C)
Set-Cookie: oreo=doublestuff; Path=/
>>> C = cookies.SimpleCookie()
>>> C["twix"] = "none for you"
>>> C["twix"].value
'none for you'
>>> C = cookies.SimpleCookie()
>>> C["number"] = 7 # equivalent to C["number"] = str(7)
>>> C["string"] = "seven"
>>> C["number"].value
'7'
>>> C["string"].value
'seven'
>>> print(C)
Set-Cookie: number=7
Set-Cookie: string=seven
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node http cookiejar — Cookie handling for HTTP clients,xmlrpc — XMLRPC server and client modules,http cookies — HTTP state management,Internet Protocols and Support
@anchor{library/http cookiejar doc}@anchor{41b2}@anchor{library/http cookiejar http-cookiejar-cookie-handling-for-http-clients}@anchor{41b3}@anchor{library/http cookiejar module-http cookiejar}@anchor{74}@anchor{library/http cookiejar translation-repo}@anchor{41b4}
@subsection @code{http.cookiejar} — Cookie handling for HTTP clients


@geindex module; http.cookiejar

`Source code:' Lib/http/cookiejar.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/http/cookiejar.py}


__________________________________________________________________


The @code{http.cookiejar} module defines classes for automatic handling of HTTP
cookies.  It is useful for accessing websites that require small pieces of data
– `cookies' – to be set on the client machine by an HTTP response from a
web server, and then returned to the server in later HTTP requests.

Both the regular Netscape cookie protocol and the protocol defined by
@geindex RFC; RFC 2965
RFC 2965@footnote{https://datatracker.ietf.org/doc/html/rfc2965.html} are handled.  RFC 2965 handling is switched off by default.
@geindex RFC; RFC 2109
RFC 2109@footnote{https://datatracker.ietf.org/doc/html/rfc2109.html} cookies are parsed as Netscape cookies and subsequently treated
either as Netscape or RFC 2965 cookies according to the ‘policy’ in effect.
Note that the great majority of cookies on the internet are Netscape cookies.
@code{http.cookiejar} attempts to follow the de-facto Netscape cookie protocol (which
differs substantially from that set out in the original Netscape specification),
including taking note of the @code{max-age} and @code{port} cookie-attributes
introduced with RFC 2965.

@cartouche
@quotation Note 
The various named parameters found in @code{Set-Cookie} and
@code{Set-Cookie2} headers (eg. @code{domain} and @code{expires}) are
conventionally referred to as `attributes'.  To distinguish them from
Python attributes, the documentation for this module uses the term
`cookie-attribute' instead.
@end quotation
@end cartouche

The module defines the following exception:

@geindex LoadError
@anchor{library/http cookiejar http cookiejar LoadError}@anchor{41b5}
@deffn {Exception} http.cookiejar.LoadError

Instances of @ref{41b6,,FileCookieJar} raise this exception on failure to load
cookies from a file.  @code{LoadError} is a subclass of @ref{2c2,,OSError}.


Changed in version 3.3: @code{LoadError} used to be a subtype of @ref{1259,,IOError}, which is now an
alias of @ref{2c2,,OSError}.

@end deffn

The following classes are provided:

@geindex CookieJar (class in http.cookiejar)
@anchor{library/http cookiejar http cookiejar CookieJar}@anchor{3fd6}
@deffn {Class} http.cookiejar.CookieJar (policy=None)

`policy' is an object implementing the @ref{41b7,,CookiePolicy} interface.

The @code{CookieJar} class stores HTTP cookies.  It extracts cookies from HTTP
requests, and returns them in HTTP responses. @code{CookieJar} instances
automatically expire contained cookies when necessary.  Subclasses are also
responsible for storing and retrieving cookies from a file or database.
@end deffn

@geindex FileCookieJar (class in http.cookiejar)
@anchor{library/http cookiejar http cookiejar FileCookieJar}@anchor{41b6}
@deffn {Class} http.cookiejar.FileCookieJar (filename=None, delayload=None, policy=None)

`policy' is an object implementing the @ref{41b7,,CookiePolicy} interface.  For the
other arguments, see the documentation for the corresponding attributes.

A @ref{3fd6,,CookieJar} which can load cookies from, and perhaps save cookies to, a
file on disk.  Cookies are `NOT' loaded from the named file until either the
@ref{41b8,,load()} or @ref{41b9,,revert()} method is called.  Subclasses of this class are
documented in section @ref{41ba,,FileCookieJar subclasses and co-operation with web browsers}.

This should not be initialized directly – use its subclasses below instead.


Changed in version 3.8: The filename parameter supports a @ref{5a1,,path-like object}.

@end deffn

@geindex CookiePolicy (class in http.cookiejar)
@anchor{library/http cookiejar http cookiejar CookiePolicy}@anchor{41b7}
@deffn {Class} http.cookiejar.CookiePolicy

This class is responsible for deciding whether each cookie should be accepted
from / returned to the server.
@end deffn

@geindex DefaultCookiePolicy (class in http.cookiejar)
@anchor{library/http cookiejar http cookiejar DefaultCookiePolicy}@anchor{1e37}
@deffn {Class} http.cookiejar.DefaultCookiePolicy (blocked_domains=None, allowed_domains=None, netscape=True, rfc2965=False, rfc2109_as_netscape=None, hide_cookie2=False, strict_domain=False, strict_rfc2965_unverifiable=True, strict_ns_unverifiable=False, strict_ns_domain=DefaultCookiePolicy.DomainLiberal, strict_ns_set_initial_dollar=False, strict_ns_set_path=False, secure_protocols=('https', 'wss'))

Constructor arguments should be passed as keyword arguments only.
`blocked_domains' is a sequence of domain names that we never accept cookies
from, nor return cookies to. `allowed_domains' if not @ref{887,,None}, this is a
sequence of the only domains for which we accept and return cookies.
`secure_protocols' is a sequence of protocols for which secure cookies can be
added to. By default `https' and `wss' (secure websocket) are considered
secure protocols. For all other arguments, see the documentation for
@ref{41b7,,CookiePolicy} and @code{DefaultCookiePolicy} objects.

@code{DefaultCookiePolicy} implements the standard accept / reject rules for
Netscape and 
@geindex RFC; RFC 2965
RFC 2965@footnote{https://datatracker.ietf.org/doc/html/rfc2965.html} cookies.  By default, 
@geindex RFC; RFC 2109
RFC 2109@footnote{https://datatracker.ietf.org/doc/html/rfc2109.html} cookies (ie. cookies
received in a @code{Set-Cookie} header with a version cookie-attribute of
1) are treated according to the RFC 2965 rules.  However, if RFC 2965 handling
is turned off or @ref{41bb,,rfc2109_as_netscape} is @code{True}, RFC 2109 cookies are
‘downgraded’ by the @ref{3fd6,,CookieJar} instance to Netscape cookies, by
setting the @code{version} attribute of the @ref{41bc,,Cookie} instance to 0.
@code{DefaultCookiePolicy} also provides some parameters to allow some
fine-tuning of policy.
@end deffn

@geindex Cookie (class in http.cookiejar)
@anchor{library/http cookiejar http cookiejar Cookie}@anchor{41bc}
@deffn {Class} http.cookiejar.Cookie

This class represents Netscape, 
@geindex RFC; RFC 2109
RFC 2109@footnote{https://datatracker.ietf.org/doc/html/rfc2109.html} and 
@geindex RFC; RFC 2965
RFC 2965@footnote{https://datatracker.ietf.org/doc/html/rfc2965.html} cookies.  It is not
expected that users of @code{http.cookiejar} construct their own @code{Cookie}
instances.  Instead, if necessary, call @code{make_cookies()} on a
@ref{3fd6,,CookieJar} instance.
@end deffn


@subsubheading See also



@table @asis

@item Module @ref{112,,urllib.request}

URL opening with automatic cookie handling.

@item Module @ref{75,,http.cookies}

HTTP cookie classes, principally useful for server-side code.  The
@code{http.cookiejar} and @ref{75,,http.cookies} modules do not depend on each
other.

@item @indicateurl{https://curl.se/rfc/cookie_spec.html}

The specification of the original Netscape cookie protocol.  Though this is
still the dominant protocol, the ‘Netscape cookie protocol’ implemented by all
the major browsers (and @code{http.cookiejar}) only bears a passing resemblance to
the one sketched out in @code{cookie_spec.html}.

@geindex RFC; RFC 2109

@item RFC 2109@footnote{https://datatracker.ietf.org/doc/html/rfc2109.html} - HTTP State Management Mechanism

Obsoleted by 
@geindex RFC; RFC 2965
RFC 2965@footnote{https://datatracker.ietf.org/doc/html/rfc2965.html}. Uses @code{Set-Cookie} with version=1.

@geindex RFC; RFC 2965

@item RFC 2965@footnote{https://datatracker.ietf.org/doc/html/rfc2965.html} - HTTP State Management Mechanism

The Netscape protocol with the bugs fixed.  Uses @code{Set-Cookie2} in
place of @code{Set-Cookie}.  Not widely used.

@item @indicateurl{https://kristol.org/cookie/errata.html}

Unfinished errata to 
@geindex RFC; RFC 2965
RFC 2965@footnote{https://datatracker.ietf.org/doc/html/rfc2965.html}.
@end table

@geindex RFC; RFC 2964
RFC 2964@footnote{https://datatracker.ietf.org/doc/html/rfc2964.html} - Use of HTTP State Management


@menu
* CookieJar and FileCookieJar Objects:: 
* FileCookieJar subclasses and co-operation with web browsers:: 
* CookiePolicy Objects:: 
* DefaultCookiePolicy Objects:: 
* Cookie Objects: Cookie Objects<2>. 
* Examples: Examples<30>. 

@end menu

@node CookieJar and FileCookieJar Objects,FileCookieJar subclasses and co-operation with web browsers,,http cookiejar — Cookie handling for HTTP clients
@anchor{library/http cookiejar cookie-jar-objects}@anchor{41bd}@anchor{library/http cookiejar cookiejar-and-filecookiejar-objects}@anchor{41be}
@subsubsection CookieJar and FileCookieJar Objects


@ref{3fd6,,CookieJar} objects support the @ref{4c9,,iterator} protocol for iterating over
contained @ref{41bc,,Cookie} objects.

@ref{3fd6,,CookieJar} has the following methods:

@geindex add_cookie_header() (http.cookiejar.CookieJar method)
@anchor{library/http cookiejar http cookiejar CookieJar add_cookie_header}@anchor{41bf}
@deffn {Method} CookieJar.add_cookie_header (request)

Add correct @code{Cookie} header to `request'.

If policy allows (ie. the @code{rfc2965} and @code{hide_cookie2} attributes of
the @ref{3fd6,,CookieJar}’s @ref{41b7,,CookiePolicy} instance are true and false
respectively), the @code{Cookie2} header is also added when appropriate.

The `request' object (usually a @ref{11de,,urllib.request.Request} instance)
must support the methods @code{get_full_url()}, @code{has_header()},
@code{get_header()}, @code{header_items()}, @code{add_unredirected_header()}
and the attributes @code{host}, @code{type}, @code{unverifiable}
and @code{origin_req_host} as documented by @ref{112,,urllib.request}.


Changed in version 3.3: `request' object needs @code{origin_req_host} attribute. Dependency on a
deprecated method @code{get_origin_req_host()} has been removed.

@end deffn

@geindex extract_cookies() (http.cookiejar.CookieJar method)
@anchor{library/http cookiejar http cookiejar CookieJar extract_cookies}@anchor{41c0}
@deffn {Method} CookieJar.extract_cookies (response, request)

Extract cookies from HTTP `response' and store them in the @ref{3fd6,,CookieJar},
where allowed by policy.

The @ref{3fd6,,CookieJar} will look for allowable @code{Set-Cookie} and
@code{Set-Cookie2} headers in the `response' argument, and store cookies
as appropriate (subject to the @ref{41c1,,CookiePolicy.set_ok()} method’s approval).

The `response' object (usually the result of a call to
@ref{309,,urllib.request.urlopen()}, or similar) should support an @code{info()}
method, which returns an @ref{581,,email.message.Message} instance.

The `request' object (usually a @ref{11de,,urllib.request.Request} instance)
must support the method @code{get_full_url()} and the attributes
@code{host}, @code{unverifiable} and @code{origin_req_host},
as documented by @ref{112,,urllib.request}.  The request is used to set
default values for cookie-attributes as well as for checking that the
cookie is allowed to be set.


Changed in version 3.3: `request' object needs @code{origin_req_host} attribute. Dependency on a
deprecated method @code{get_origin_req_host()} has been removed.

@end deffn

@geindex set_policy() (http.cookiejar.CookieJar method)
@anchor{library/http cookiejar http cookiejar CookieJar set_policy}@anchor{41c2}
@deffn {Method} CookieJar.set_policy (policy)

Set the @ref{41b7,,CookiePolicy} instance to be used.
@end deffn

@geindex make_cookies() (http.cookiejar.CookieJar method)
@anchor{library/http cookiejar http cookiejar CookieJar make_cookies}@anchor{41c3}
@deffn {Method} CookieJar.make_cookies (response, request)

Return sequence of @ref{41bc,,Cookie} objects extracted from `response' object.

See the documentation for @ref{41c0,,extract_cookies()} for the interfaces required of
the `response' and `request' arguments.
@end deffn

@geindex set_cookie_if_ok() (http.cookiejar.CookieJar method)
@anchor{library/http cookiejar http cookiejar CookieJar set_cookie_if_ok}@anchor{41c4}
@deffn {Method} CookieJar.set_cookie_if_ok (cookie, request)

Set a @ref{41bc,,Cookie} if policy says it’s OK to do so.
@end deffn

@geindex set_cookie() (http.cookiejar.CookieJar method)
@anchor{library/http cookiejar http cookiejar CookieJar set_cookie}@anchor{41c5}
@deffn {Method} CookieJar.set_cookie (cookie)

Set a @ref{41bc,,Cookie}, without checking with policy to see whether or not it
should be set.
@end deffn

@geindex clear() (http.cookiejar.CookieJar method)
@anchor{library/http cookiejar http cookiejar CookieJar clear}@anchor{41c6}
@deffn {Method} CookieJar.clear ([domain[, path[, name]]])

Clear some cookies.

If invoked without arguments, clear all cookies.  If given a single argument,
only cookies belonging to that `domain' will be removed. If given two arguments,
cookies belonging to the specified `domain' and URL `path' are removed.  If
given three arguments, then the cookie with the specified `domain', `path' and
`name' is removed.

Raises @ref{5e7,,KeyError} if no matching cookie exists.
@end deffn

@geindex clear_session_cookies() (http.cookiejar.CookieJar method)
@anchor{library/http cookiejar http cookiejar CookieJar clear_session_cookies}@anchor{41c7}
@deffn {Method} CookieJar.clear_session_cookies ()

Discard all session cookies.

Discards all contained cookies that have a true @code{discard} attribute
(usually because they had either no @code{max-age} or @code{expires} cookie-attribute,
or an explicit @code{discard} cookie-attribute).  For interactive browsers, the end
of a session usually corresponds to closing the browser window.

Note that the @code{save()} method won’t save session cookies anyway, unless you
ask otherwise by passing a true `ignore_discard' argument.
@end deffn

@ref{41b6,,FileCookieJar} implements the following additional methods:

@geindex save() (http.cookiejar.FileCookieJar method)
@anchor{library/http cookiejar http cookiejar FileCookieJar save}@anchor{41c8}
@deffn {Method} FileCookieJar.save (filename=None, ignore_discard=False, ignore_expires=False)

Save cookies to a file.

This base class raises @ref{369,,NotImplementedError}.  Subclasses may leave this
method unimplemented.

`filename' is the name of file in which to save cookies.  If `filename' is not
specified, @code{self.filename} is used (whose default is the value passed to
the constructor, if any); if @code{self.filename} is @ref{887,,None},
@ref{2ee,,ValueError} is raised.

`ignore_discard': save even cookies set to be discarded. `ignore_expires': save
even cookies that have expired

The file is overwritten if it already exists, thus wiping all the cookies it
contains.  Saved cookies can be restored later using the @ref{41b8,,load()} or
@ref{41b9,,revert()} methods.
@end deffn

@geindex load() (http.cookiejar.FileCookieJar method)
@anchor{library/http cookiejar http cookiejar FileCookieJar load}@anchor{41b8}
@deffn {Method} FileCookieJar.load (filename=None, ignore_discard=False, ignore_expires=False)

Load cookies from a file.

Old cookies are kept unless overwritten by newly loaded ones.

Arguments are as for @ref{41c8,,save()}.

The named file must be in the format understood by the class, or
@ref{41b5,,LoadError} will be raised.  Also, @ref{2c2,,OSError} may be raised, for
example if the file does not exist.


Changed in version 3.3: @ref{1259,,IOError} used to be raised, it is now an alias of @ref{2c2,,OSError}.

@end deffn

@geindex revert() (http.cookiejar.FileCookieJar method)
@anchor{library/http cookiejar http cookiejar FileCookieJar revert}@anchor{41b9}
@deffn {Method} FileCookieJar.revert (filename=None, ignore_discard=False, ignore_expires=False)

Clear all cookies and reload cookies from a saved file.

@code{revert()} can raise the same exceptions as @ref{41b8,,load()}. If there is a
failure, the object’s state will not be altered.
@end deffn

@ref{41b6,,FileCookieJar} instances have the following public attributes:

@geindex filename (http.cookiejar.FileCookieJar attribute)
@anchor{library/http cookiejar http cookiejar FileCookieJar filename}@anchor{41c9}
@deffn {Attribute} FileCookieJar.filename

Filename of default file in which to keep cookies.  This attribute may be
assigned to.
@end deffn

@geindex delayload (http.cookiejar.FileCookieJar attribute)
@anchor{library/http cookiejar http cookiejar FileCookieJar delayload}@anchor{41ca}
@deffn {Attribute} FileCookieJar.delayload

If true, load cookies lazily from disk.  This attribute should not be assigned
to.  This is only a hint, since this only affects performance, not behaviour
(unless the cookies on disk are changing). A @ref{3fd6,,CookieJar} object may
ignore it.  None of the @ref{41b6,,FileCookieJar} classes included in the standard
library lazily loads cookies.
@end deffn

@node FileCookieJar subclasses and co-operation with web browsers,CookiePolicy Objects,CookieJar and FileCookieJar Objects,http cookiejar — Cookie handling for HTTP clients
@anchor{library/http cookiejar file-cookie-jar-classes}@anchor{41ba}@anchor{library/http cookiejar filecookiejar-subclasses-and-co-operation-with-web-browsers}@anchor{41cb}
@subsubsection FileCookieJar subclasses and co-operation with web browsers


The following @ref{3fd6,,CookieJar} subclasses are provided for reading and
writing.

@geindex MozillaCookieJar (class in http.cookiejar)
@anchor{library/http cookiejar http cookiejar MozillaCookieJar}@anchor{41cc}
@deffn {Class} http.cookiejar.MozillaCookieJar (filename=None, delayload=None, policy=None)

A @ref{41b6,,FileCookieJar} that can load from and save cookies to disk in the
Mozilla @code{cookies.txt} file format (which is also used by curl and the Lynx
and Netscape browsers).

@cartouche
@quotation Note 
This loses information about 
@geindex RFC; RFC 2965
RFC 2965@footnote{https://datatracker.ietf.org/doc/html/rfc2965.html} cookies, and also about newer or
non-standard cookie-attributes such as @code{port}.
@end quotation
@end cartouche

@cartouche
@quotation Warning 
Back up your cookies before saving if you have cookies whose loss / corruption
would be inconvenient (there are some subtleties which may lead to slight
changes in the file over a load / save round-trip).
@end quotation
@end cartouche

Also note that cookies saved while Mozilla is running will get clobbered by
Mozilla.
@end deffn

@geindex LWPCookieJar (class in http.cookiejar)
@anchor{library/http cookiejar http cookiejar LWPCookieJar}@anchor{41cd}
@deffn {Class} http.cookiejar.LWPCookieJar (filename=None, delayload=None, policy=None)

A @ref{41b6,,FileCookieJar} that can load from and save cookies to disk in format
compatible with the libwww-perl library’s @code{Set-Cookie3} file format.  This is
convenient if you want to store cookies in a human-readable file.


Changed in version 3.8: The filename parameter supports a @ref{5a1,,path-like object}.

@end deffn

@node CookiePolicy Objects,DefaultCookiePolicy Objects,FileCookieJar subclasses and co-operation with web browsers,http cookiejar — Cookie handling for HTTP clients
@anchor{library/http cookiejar cookie-policy-objects}@anchor{41ce}@anchor{library/http cookiejar cookiepolicy-objects}@anchor{41cf}
@subsubsection CookiePolicy Objects


Objects implementing the @ref{41b7,,CookiePolicy} interface have the following
methods:

@geindex set_ok() (http.cookiejar.CookiePolicy method)
@anchor{library/http cookiejar http cookiejar CookiePolicy set_ok}@anchor{41c1}
@deffn {Method} CookiePolicy.set_ok (cookie, request)

Return boolean value indicating whether cookie should be accepted from server.

`cookie' is a @ref{41bc,,Cookie} instance.  `request' is an object
implementing the interface defined by the documentation for
@ref{41c0,,CookieJar.extract_cookies()}.
@end deffn

@geindex return_ok() (http.cookiejar.CookiePolicy method)
@anchor{library/http cookiejar http cookiejar CookiePolicy return_ok}@anchor{41d0}
@deffn {Method} CookiePolicy.return_ok (cookie, request)

Return boolean value indicating whether cookie should be returned to server.

`cookie' is a @ref{41bc,,Cookie} instance.  `request' is an object
implementing the interface defined by the documentation for
@ref{41bf,,CookieJar.add_cookie_header()}.
@end deffn

@geindex domain_return_ok() (http.cookiejar.CookiePolicy method)
@anchor{library/http cookiejar http cookiejar CookiePolicy domain_return_ok}@anchor{41d1}
@deffn {Method} CookiePolicy.domain_return_ok (domain, request)

Return @code{False} if cookies should not be returned, given cookie domain.

This method is an optimization.  It removes the need for checking every cookie
with a particular domain (which might involve reading many files).  Returning
true from @code{domain_return_ok()} and @ref{41d2,,path_return_ok()} leaves all the
work to @ref{41d0,,return_ok()}.

If @code{domain_return_ok()} returns true for the cookie domain,
@ref{41d2,,path_return_ok()} is called for the cookie path.  Otherwise,
@code{path_return_ok()} and @ref{41d0,,return_ok()} are never called for that cookie
domain.  If @code{path_return_ok()} returns true, @code{return_ok()} is called
with the @ref{41bc,,Cookie} object itself for a full check.  Otherwise,
@code{return_ok()} is never called for that cookie path.

Note that @code{domain_return_ok()} is called for every `cookie' domain, not just
for the `request' domain.  For example, the function might be called with both
@code{".example.com"} and @code{"www.example.com"} if the request domain is
@code{"www.example.com"}.  The same goes for @ref{41d2,,path_return_ok()}.

The `request' argument is as documented for @ref{41d0,,return_ok()}.
@end deffn

@geindex path_return_ok() (http.cookiejar.CookiePolicy method)
@anchor{library/http cookiejar http cookiejar CookiePolicy path_return_ok}@anchor{41d2}
@deffn {Method} CookiePolicy.path_return_ok (path, request)

Return @code{False} if cookies should not be returned, given cookie path.

See the documentation for @ref{41d1,,domain_return_ok()}.
@end deffn

In addition to implementing the methods above, implementations of the
@ref{41b7,,CookiePolicy} interface must also supply the following attributes,
indicating which protocols should be used, and how.  All of these attributes may
be assigned to.

@geindex netscape (http.cookiejar.CookiePolicy attribute)
@anchor{library/http cookiejar http cookiejar CookiePolicy netscape}@anchor{41d3}
@deffn {Attribute} CookiePolicy.netscape

Implement Netscape protocol.
@end deffn

@geindex rfc2965 (http.cookiejar.CookiePolicy attribute)
@anchor{library/http cookiejar http cookiejar CookiePolicy rfc2965}@anchor{41d4}
@deffn {Attribute} CookiePolicy.rfc2965

Implement 
@geindex RFC; RFC 2965
RFC 2965@footnote{https://datatracker.ietf.org/doc/html/rfc2965.html} protocol.
@end deffn

@geindex hide_cookie2 (http.cookiejar.CookiePolicy attribute)
@anchor{library/http cookiejar http cookiejar CookiePolicy hide_cookie2}@anchor{41d5}
@deffn {Attribute} CookiePolicy.hide_cookie2

Don’t add @code{Cookie2} header to requests (the presence of this header
indicates to the server that we understand 
@geindex RFC; RFC 2965
RFC 2965@footnote{https://datatracker.ietf.org/doc/html/rfc2965.html} cookies).
@end deffn

The most useful way to define a @ref{41b7,,CookiePolicy} class is by subclassing
from @ref{1e37,,DefaultCookiePolicy} and overriding some or all of the methods
above.  @code{CookiePolicy} itself may be used as a ‘null policy’ to allow
setting and receiving any and all cookies (this is unlikely to be useful).

@node DefaultCookiePolicy Objects,Cookie Objects<2>,CookiePolicy Objects,http cookiejar — Cookie handling for HTTP clients
@anchor{library/http cookiejar default-cookie-policy-objects}@anchor{41d6}@anchor{library/http cookiejar defaultcookiepolicy-objects}@anchor{41d7}
@subsubsection DefaultCookiePolicy Objects


Implements the standard rules for accepting and returning cookies.

Both 
@geindex RFC; RFC 2965
RFC 2965@footnote{https://datatracker.ietf.org/doc/html/rfc2965.html} and Netscape cookies are covered.  RFC 2965 handling is switched
off by default.

The easiest way to provide your own policy is to override this class and call
its methods in your overridden implementations before adding your own additional
checks:

@example
import http.cookiejar
class MyCookiePolicy(http.cookiejar.DefaultCookiePolicy):
    def set_ok(self, cookie, request):
        if not http.cookiejar.DefaultCookiePolicy.set_ok(self, cookie, request):
            return False
        if i_dont_want_to_store_this_cookie(cookie):
            return False
        return True
@end example

In addition to the features required to implement the @ref{41b7,,CookiePolicy}
interface, this class allows you to block and allow domains from setting and
receiving cookies.  There are also some strictness switches that allow you to
tighten up the rather loose Netscape protocol rules a little bit (at the cost of
blocking some benign cookies).

A domain blocklist and allowlist is provided (both off by default). Only domains
not in the blocklist and present in the allowlist (if the allowlist is active)
participate in cookie setting and returning.  Use the `blocked_domains'
constructor argument, and @code{blocked_domains()} and
@code{set_blocked_domains()} methods (and the corresponding argument and methods
for `allowed_domains').  If you set an allowlist, you can turn it off again by
setting it to @ref{887,,None}.

Domains in block or allow lists that do not start with a dot must equal the
cookie domain to be matched.  For example, @code{"example.com"} matches a blocklist
entry of @code{"example.com"}, but @code{"www.example.com"} does not.  Domains that do
start with a dot are matched by more specific domains too. For example, both
@code{"www.example.com"} and @code{"www.coyote.example.com"} match @code{".example.com"}
(but @code{"example.com"} itself does not).  IP addresses are an exception, and
must match exactly.  For example, if blocked_domains contains @code{"192.168.1.2"}
and @code{".168.1.2"}, 192.168.1.2 is blocked, but 193.168.1.2 is not.

@ref{1e37,,DefaultCookiePolicy} implements the following additional methods:

@geindex blocked_domains() (http.cookiejar.DefaultCookiePolicy method)
@anchor{library/http cookiejar http cookiejar DefaultCookiePolicy blocked_domains}@anchor{41d8}
@deffn {Method} DefaultCookiePolicy.blocked_domains ()

Return the sequence of blocked domains (as a tuple).
@end deffn

@geindex set_blocked_domains() (http.cookiejar.DefaultCookiePolicy method)
@anchor{library/http cookiejar http cookiejar DefaultCookiePolicy set_blocked_domains}@anchor{41d9}
@deffn {Method} DefaultCookiePolicy.set_blocked_domains (blocked_domains)

Set the sequence of blocked domains.
@end deffn

@geindex is_blocked() (http.cookiejar.DefaultCookiePolicy method)
@anchor{library/http cookiejar http cookiejar DefaultCookiePolicy is_blocked}@anchor{41da}
@deffn {Method} DefaultCookiePolicy.is_blocked (domain)

Return @code{True} if `domain' is on the blocklist for setting or receiving
cookies.
@end deffn

@geindex allowed_domains() (http.cookiejar.DefaultCookiePolicy method)
@anchor{library/http cookiejar http cookiejar DefaultCookiePolicy allowed_domains}@anchor{41db}
@deffn {Method} DefaultCookiePolicy.allowed_domains ()

Return @ref{887,,None}, or the sequence of allowed domains (as a tuple).
@end deffn

@geindex set_allowed_domains() (http.cookiejar.DefaultCookiePolicy method)
@anchor{library/http cookiejar http cookiejar DefaultCookiePolicy set_allowed_domains}@anchor{41dc}
@deffn {Method} DefaultCookiePolicy.set_allowed_domains (allowed_domains)

Set the sequence of allowed domains, or @ref{887,,None}.
@end deffn

@geindex is_not_allowed() (http.cookiejar.DefaultCookiePolicy method)
@anchor{library/http cookiejar http cookiejar DefaultCookiePolicy is_not_allowed}@anchor{41dd}
@deffn {Method} DefaultCookiePolicy.is_not_allowed (domain)

Return @code{True} if `domain' is not on the allowlist for setting or receiving
cookies.
@end deffn

@ref{1e37,,DefaultCookiePolicy} instances have the following attributes, which are
all initialised from the constructor arguments of the same name, and which may
all be assigned to.

@geindex rfc2109_as_netscape (http.cookiejar.DefaultCookiePolicy attribute)
@anchor{library/http cookiejar http cookiejar DefaultCookiePolicy rfc2109_as_netscape}@anchor{41bb}
@deffn {Attribute} DefaultCookiePolicy.rfc2109_as_netscape

If true, request that the @ref{3fd6,,CookieJar} instance downgrade 
@geindex RFC; RFC 2109
RFC 2109@footnote{https://datatracker.ietf.org/doc/html/rfc2109.html} cookies
(ie. cookies received in a @code{Set-Cookie} header with a version
cookie-attribute of 1) to Netscape cookies by setting the version attribute of
the @ref{41bc,,Cookie} instance to 0.  The default value is @ref{887,,None}, in which
case RFC 2109 cookies are downgraded if and only if 
@geindex RFC; RFC 2965
RFC 2965@footnote{https://datatracker.ietf.org/doc/html/rfc2965.html} handling is turned
off.  Therefore, RFC 2109 cookies are downgraded by default.
@end deffn

General strictness switches:

@geindex strict_domain (http.cookiejar.DefaultCookiePolicy attribute)
@anchor{library/http cookiejar http cookiejar DefaultCookiePolicy strict_domain}@anchor{41de}
@deffn {Attribute} DefaultCookiePolicy.strict_domain

Don’t allow sites to set two-component domains with country-code top-level
domains like @code{.co.uk}, @code{.gov.uk}, @code{.co.nz}.etc.  This is far from perfect
and isn’t guaranteed to work!
@end deffn

@geindex RFC; RFC 2965
RFC 2965@footnote{https://datatracker.ietf.org/doc/html/rfc2965.html} protocol strictness switches:

@geindex strict_rfc2965_unverifiable (http.cookiejar.DefaultCookiePolicy attribute)
@anchor{library/http cookiejar http cookiejar DefaultCookiePolicy strict_rfc2965_unverifiable}@anchor{41df}
@deffn {Attribute} DefaultCookiePolicy.strict_rfc2965_unverifiable

Follow 
@geindex RFC; RFC 2965
RFC 2965@footnote{https://datatracker.ietf.org/doc/html/rfc2965.html} rules on unverifiable transactions (usually, an unverifiable
transaction is one resulting from a redirect or a request for an image hosted on
another site).  If this is false, cookies are `never' blocked on the basis of
verifiability
@end deffn

Netscape protocol strictness switches:

@geindex strict_ns_unverifiable (http.cookiejar.DefaultCookiePolicy attribute)
@anchor{library/http cookiejar http cookiejar DefaultCookiePolicy strict_ns_unverifiable}@anchor{41e0}
@deffn {Attribute} DefaultCookiePolicy.strict_ns_unverifiable

Apply 
@geindex RFC; RFC 2965
RFC 2965@footnote{https://datatracker.ietf.org/doc/html/rfc2965.html} rules on unverifiable transactions even to Netscape cookies.
@end deffn

@geindex strict_ns_domain (http.cookiejar.DefaultCookiePolicy attribute)
@anchor{library/http cookiejar http cookiejar DefaultCookiePolicy strict_ns_domain}@anchor{41e1}
@deffn {Attribute} DefaultCookiePolicy.strict_ns_domain

Flags indicating how strict to be with domain-matching rules for Netscape
cookies.  See below for acceptable values.
@end deffn

@geindex strict_ns_set_initial_dollar (http.cookiejar.DefaultCookiePolicy attribute)
@anchor{library/http cookiejar http cookiejar DefaultCookiePolicy strict_ns_set_initial_dollar}@anchor{41e2}
@deffn {Attribute} DefaultCookiePolicy.strict_ns_set_initial_dollar

Ignore cookies in Set-Cookie: headers that have names starting with @code{'$'}.
@end deffn

@geindex strict_ns_set_path (http.cookiejar.DefaultCookiePolicy attribute)
@anchor{library/http cookiejar http cookiejar DefaultCookiePolicy strict_ns_set_path}@anchor{41e3}
@deffn {Attribute} DefaultCookiePolicy.strict_ns_set_path

Don’t allow setting cookies whose path doesn’t path-match request URI.
@end deffn

@ref{41e1,,strict_ns_domain} is a collection of flags.  Its value is constructed by
or-ing together (for example, @code{DomainStrictNoDots|DomainStrictNonDomain} means
both flags are set).

@geindex DomainStrictNoDots (http.cookiejar.DefaultCookiePolicy attribute)
@anchor{library/http cookiejar http cookiejar DefaultCookiePolicy DomainStrictNoDots}@anchor{41e4}
@deffn {Attribute} DefaultCookiePolicy.DomainStrictNoDots

When setting cookies, the ‘host prefix’ must not contain a dot (eg.
@code{www.foo.bar.com} can’t set a cookie for @code{.bar.com}, because @code{www.foo}
contains a dot).
@end deffn

@geindex DomainStrictNonDomain (http.cookiejar.DefaultCookiePolicy attribute)
@anchor{library/http cookiejar http cookiejar DefaultCookiePolicy DomainStrictNonDomain}@anchor{41e5}
@deffn {Attribute} DefaultCookiePolicy.DomainStrictNonDomain

Cookies that did not explicitly specify a @code{domain} cookie-attribute can only
be returned to a domain equal to the domain that set the cookie (eg.
@code{spam.example.com} won’t be returned cookies from @code{example.com} that had no
@code{domain} cookie-attribute).
@end deffn

@geindex DomainRFC2965Match (http.cookiejar.DefaultCookiePolicy attribute)
@anchor{library/http cookiejar http cookiejar DefaultCookiePolicy DomainRFC2965Match}@anchor{41e6}
@deffn {Attribute} DefaultCookiePolicy.DomainRFC2965Match

When setting cookies, require a full 
@geindex RFC; RFC 2965
RFC 2965@footnote{https://datatracker.ietf.org/doc/html/rfc2965.html} domain-match.
@end deffn

The following attributes are provided for convenience, and are the most useful
combinations of the above flags:

@geindex DomainLiberal (http.cookiejar.DefaultCookiePolicy attribute)
@anchor{library/http cookiejar http cookiejar DefaultCookiePolicy DomainLiberal}@anchor{41e7}
@deffn {Attribute} DefaultCookiePolicy.DomainLiberal

Equivalent to 0 (ie. all of the above Netscape domain strictness flags switched
off).
@end deffn

@geindex DomainStrict (http.cookiejar.DefaultCookiePolicy attribute)
@anchor{library/http cookiejar http cookiejar DefaultCookiePolicy DomainStrict}@anchor{41e8}
@deffn {Attribute} DefaultCookiePolicy.DomainStrict

Equivalent to @code{DomainStrictNoDots|DomainStrictNonDomain}.
@end deffn

@node Cookie Objects<2>,Examples<30>,DefaultCookiePolicy Objects,http cookiejar — Cookie handling for HTTP clients
@anchor{library/http cookiejar cookie-objects}@anchor{41e9}
@subsubsection Cookie Objects


@ref{41bc,,Cookie} instances have Python attributes roughly corresponding to the
standard cookie-attributes specified in the various cookie standards.  The
correspondence is not one-to-one, because there are complicated rules for
assigning default values, because the @code{max-age} and @code{expires}
cookie-attributes contain equivalent information, and because 
@geindex RFC; RFC 2109
RFC 2109@footnote{https://datatracker.ietf.org/doc/html/rfc2109.html} cookies
may be ‘downgraded’ by @code{http.cookiejar} from version 1 to version 0 (Netscape)
cookies.

Assignment to these attributes should not be necessary other than in rare
circumstances in a @ref{41b7,,CookiePolicy} method.  The class does not enforce
internal consistency, so you should know what you’re doing if you do that.

@geindex version (http.cookiejar.Cookie attribute)
@anchor{library/http cookiejar http cookiejar Cookie version}@anchor{41ea}
@deffn {Attribute} Cookie.version

Integer or @ref{887,,None}.  Netscape cookies have @ref{41ea,,version} 0. 
@geindex RFC; RFC 2965
RFC 2965@footnote{https://datatracker.ietf.org/doc/html/rfc2965.html} and
@geindex RFC; RFC 2109
RFC 2109@footnote{https://datatracker.ietf.org/doc/html/rfc2109.html} cookies have a @code{version} cookie-attribute of 1.  However, note that
@code{http.cookiejar} may ‘downgrade’ RFC 2109 cookies to Netscape cookies, in which
case @code{version} is 0.
@end deffn

@geindex name (http.cookiejar.Cookie attribute)
@anchor{library/http cookiejar http cookiejar Cookie name}@anchor{41eb}
@deffn {Attribute} Cookie.name

Cookie name (a string).
@end deffn

@geindex value (http.cookiejar.Cookie attribute)
@anchor{library/http cookiejar http cookiejar Cookie value}@anchor{41ec}
@deffn {Attribute} Cookie.value

Cookie value (a string), or @ref{887,,None}.
@end deffn

@geindex port (http.cookiejar.Cookie attribute)
@anchor{library/http cookiejar http cookiejar Cookie port}@anchor{41ed}
@deffn {Attribute} Cookie.port

String representing a port or a set of ports (eg. ‘80’, or ‘80,8080’), or
@ref{887,,None}.
@end deffn

@geindex domain (http.cookiejar.Cookie attribute)
@anchor{library/http cookiejar http cookiejar Cookie domain}@anchor{41ee}
@deffn {Attribute} Cookie.domain

Cookie domain (a string).
@end deffn

@geindex path (http.cookiejar.Cookie attribute)
@anchor{library/http cookiejar http cookiejar Cookie path}@anchor{41ef}
@deffn {Attribute} Cookie.path

Cookie path (a string, eg. @code{'/acme/rocket_launchers'}).
@end deffn

@geindex secure (http.cookiejar.Cookie attribute)
@anchor{library/http cookiejar http cookiejar Cookie secure}@anchor{41f0}
@deffn {Attribute} Cookie.secure

@code{True} if cookie should only be returned over a secure connection.
@end deffn

@geindex expires (http.cookiejar.Cookie attribute)
@anchor{library/http cookiejar http cookiejar Cookie expires}@anchor{41f1}
@deffn {Attribute} Cookie.expires

Integer expiry date in seconds since epoch, or @ref{887,,None}.  See also the
@ref{41f2,,is_expired()} method.
@end deffn

@geindex discard (http.cookiejar.Cookie attribute)
@anchor{library/http cookiejar http cookiejar Cookie discard}@anchor{41f3}
@deffn {Attribute} Cookie.discard

@code{True} if this is a session cookie.
@end deffn

@geindex comment (http.cookiejar.Cookie attribute)
@anchor{library/http cookiejar http cookiejar Cookie comment}@anchor{41f4}
@deffn {Attribute} Cookie.comment

String comment from the server explaining the function of this cookie, or
@ref{887,,None}.
@end deffn

@geindex comment_url (http.cookiejar.Cookie attribute)
@anchor{library/http cookiejar http cookiejar Cookie comment_url}@anchor{41f5}
@deffn {Attribute} Cookie.comment_url

URL linking to a comment from the server explaining the function of this cookie,
or @ref{887,,None}.
@end deffn

@geindex rfc2109 (http.cookiejar.Cookie attribute)
@anchor{library/http cookiejar http cookiejar Cookie rfc2109}@anchor{41f6}
@deffn {Attribute} Cookie.rfc2109

@code{True} if this cookie was received as an 
@geindex RFC; RFC 2109
RFC 2109@footnote{https://datatracker.ietf.org/doc/html/rfc2109.html} cookie (ie. the cookie
arrived in a @code{Set-Cookie} header, and the value of the Version
cookie-attribute in that header was 1).  This attribute is provided because
@code{http.cookiejar} may ‘downgrade’ RFC 2109 cookies to Netscape cookies, in
which case @ref{41ea,,version} is 0.
@end deffn

@geindex port_specified (http.cookiejar.Cookie attribute)
@anchor{library/http cookiejar http cookiejar Cookie port_specified}@anchor{41f7}
@deffn {Attribute} Cookie.port_specified

@code{True} if a port or set of ports was explicitly specified by the server (in the
@code{Set-Cookie} / @code{Set-Cookie2} header).
@end deffn

@geindex domain_specified (http.cookiejar.Cookie attribute)
@anchor{library/http cookiejar http cookiejar Cookie domain_specified}@anchor{41f8}
@deffn {Attribute} Cookie.domain_specified

@code{True} if a domain was explicitly specified by the server.
@end deffn

@geindex domain_initial_dot (http.cookiejar.Cookie attribute)
@anchor{library/http cookiejar http cookiejar Cookie domain_initial_dot}@anchor{41f9}
@deffn {Attribute} Cookie.domain_initial_dot

@code{True} if the domain explicitly specified by the server began with a dot
(@code{'.'}).
@end deffn

Cookies may have additional non-standard cookie-attributes.  These may be
accessed using the following methods:

@geindex has_nonstandard_attr() (http.cookiejar.Cookie method)
@anchor{library/http cookiejar http cookiejar Cookie has_nonstandard_attr}@anchor{41fa}
@deffn {Method} Cookie.has_nonstandard_attr (name)

Return @code{True} if cookie has the named cookie-attribute.
@end deffn

@geindex get_nonstandard_attr() (http.cookiejar.Cookie method)
@anchor{library/http cookiejar http cookiejar Cookie get_nonstandard_attr}@anchor{41fb}
@deffn {Method} Cookie.get_nonstandard_attr (name, default=None)

If cookie has the named cookie-attribute, return its value. Otherwise, return
`default'.
@end deffn

@geindex set_nonstandard_attr() (http.cookiejar.Cookie method)
@anchor{library/http cookiejar http cookiejar Cookie set_nonstandard_attr}@anchor{41fc}
@deffn {Method} Cookie.set_nonstandard_attr (name, value)

Set the value of the named cookie-attribute.
@end deffn

The @ref{41bc,,Cookie} class also defines the following method:

@geindex is_expired() (http.cookiejar.Cookie method)
@anchor{library/http cookiejar http cookiejar Cookie is_expired}@anchor{41f2}
@deffn {Method} Cookie.is_expired (now=None)

@code{True} if cookie has passed the time at which the server requested it should
expire.  If `now' is given (in seconds since the epoch), return whether the
cookie has expired at the specified time.
@end deffn

@node Examples<30>,,Cookie Objects<2>,http cookiejar — Cookie handling for HTTP clients
@anchor{library/http cookiejar examples}@anchor{41fd}
@subsubsection Examples


The first example shows the most common usage of @code{http.cookiejar}:

@example
import http.cookiejar, urllib.request
cj = http.cookiejar.CookieJar()
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
r = opener.open("http://example.com/")
@end example

This example illustrates how to open a URL using your Netscape, Mozilla, or Lynx
cookies (assumes Unix/Netscape convention for location of the cookies file):

@example
import os, http.cookiejar, urllib.request
cj = http.cookiejar.MozillaCookieJar()
cj.load(os.path.join(os.path.expanduser("~"), ".netscape", "cookies.txt"))
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
r = opener.open("http://example.com/")
@end example

The next example illustrates the use of @ref{1e37,,DefaultCookiePolicy}. Turn on
@geindex RFC; RFC 2965
RFC 2965@footnote{https://datatracker.ietf.org/doc/html/rfc2965.html} cookies, be more strict about domains when setting and returning
Netscape cookies, and block some domains from setting cookies or having them
returned:

@example
import urllib.request
from http.cookiejar import CookieJar, DefaultCookiePolicy
policy = DefaultCookiePolicy(
    rfc2965=True, strict_ns_domain=Policy.DomainStrict,
    blocked_domains=["ads.net", ".ads.net"])
cj = CookieJar(policy)
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
r = opener.open("http://example.com/")
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node xmlrpc — XMLRPC server and client modules,xmlrpc client — XML-RPC client access,http cookiejar — Cookie handling for HTTP clients,Internet Protocols and Support
@anchor{library/xmlrpc doc}@anchor{41fe}@anchor{library/xmlrpc module-xmlrpc}@anchor{134}@anchor{library/xmlrpc translation-repo}@anchor{41ff}@anchor{library/xmlrpc xmlrpc-xmlrpc-server-and-client-modules}@anchor{4200}
@subsection @code{xmlrpc} — XMLRPC server and client modules


@geindex module; xmlrpc

XML-RPC is a Remote Procedure Call method that uses XML passed via HTTP as a
transport.  With it, a client can call methods with parameters on a remote
server (the server is named by a URI) and get back structured data.

@code{xmlrpc} is a package that collects server and client modules implementing
XML-RPC.  The modules are:


@itemize *

@item 
@ref{135,,xmlrpc.client}

@item 
@ref{136,,xmlrpc.server}
@end itemize

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node xmlrpc client — XML-RPC client access,xmlrpc server — Basic XML-RPC servers,xmlrpc — XMLRPC server and client modules,Internet Protocols and Support
@anchor{library/xmlrpc client doc}@anchor{4201}@anchor{library/xmlrpc client module-xmlrpc client}@anchor{135}@anchor{library/xmlrpc client translation-repo}@anchor{4202}@anchor{library/xmlrpc client xmlrpc-client-xml-rpc-client-access}@anchor{4203}
@subsection @code{xmlrpc.client} — XML-RPC client access


@geindex module; xmlrpc.client

`Source code:' Lib/xmlrpc/client.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/xmlrpc/client.py}

@c XXX Not everything is documented yet.  It might be good to describe
@c Marshaller, Unmarshaller, getparser and Transport.


__________________________________________________________________


XML-RPC is a Remote Procedure Call method that uses XML passed via HTTP(S) as a
transport.  With it, a client can call methods with parameters on a remote
server (the server is named by a URI) and get back structured data.  This module
supports writing XML-RPC client code; it handles all the details of translating
between conformable Python objects and XML on the wire.

@cartouche
@quotation Warning 
The @code{xmlrpc.client} module is not secure against maliciously
constructed data.  If you need to parse untrusted or unauthenticated data,
see @ref{3d6e,,XML security}.
@end quotation
@end cartouche


Changed in version 3.5: For HTTPS URIs, @code{xmlrpc.client} now performs all the necessary
certificate and hostname checks by default.


@c include for modules that don't work on WASM

@ref{2181,,Availability}: not WASI.

This module does not work or is not available on WebAssembly. See
@ref{1bae,,WebAssembly platforms} for more information.

@geindex ServerProxy (class in xmlrpc.client)
@anchor{library/xmlrpc client xmlrpc client ServerProxy}@anchor{c52}
@deffn {Class} xmlrpc.client.ServerProxy (uri, transport=None, encoding=None, verbose=False, allow_none=False, use_datetime=False, use_builtin_types=False, *, headers=(), context=None)

A @code{ServerProxy} instance is an object that manages communication with a
remote XML-RPC server.  The required first argument is a URI (Uniform Resource
Indicator), and will normally be the URL of the server.  The optional second
argument is a transport factory instance; by default it is an internal
@code{SafeTransport} instance for https: URLs and an internal HTTP
@code{Transport} instance otherwise.  The optional third argument is an
encoding, by default UTF-8. The optional fourth argument is a debugging flag.

The following parameters govern the use of the returned proxy instance.
If `allow_none' is true,  the Python constant @code{None} will be translated into
XML; the default behaviour is for @code{None} to raise a @ref{199,,TypeError}. This is
a commonly used extension to the XML-RPC specification, but isn’t supported by
all clients and servers; see http://ontosys.com/xml-rpc/extensions.php@footnote{https://web.archive.org/web/20130120074804/http://ontosys.com/xml-rpc/extensions.php}
for a description.
The `use_builtin_types' flag can be used to cause date/time values
to be presented as @ref{4e3,,datetime.datetime} objects and binary data to be
presented as @ref{193,,bytes} objects; this flag is false by default.
@code{datetime.datetime}, @code{bytes} and @ref{342,,bytearray} objects
may be passed to calls.
The `headers' parameter is an optional sequence of HTTP headers to send with
each request, expressed as a sequence of 2-tuples representing the header
name and value. (e.g. @code{[('Header-Name', 'value')]}).
If an HTTPS URL is provided, `context' may be @ref{355,,ssl.SSLContext}
and configures the SSL settings of the underlying HTTPS connection.
The obsolete `use_datetime' flag is similar to `use_builtin_types' but it
applies only to date/time values.


Changed in version 3.3: The `use_builtin_types' flag was added.



Changed in version 3.8: The `headers' parameter was added.


Both the HTTP and HTTPS transports support the URL syntax extension for HTTP
Basic Authentication: @code{http://user:pass@@host:port/path}.  The  @code{user:pass}
portion will be base64-encoded as an HTTP ‘Authorization’ header, and sent to
the remote server as part of the connection process when invoking an XML-RPC
method.  You only need to use this if the remote server requires a Basic
Authentication user and password.

The returned instance is a proxy object with methods that can be used to invoke
corresponding RPC calls on the remote server.  If the remote server supports the
introspection API, the proxy can also be used to query the remote server for the
methods it supports (service discovery) and fetch other server-associated
metadata.

Types that are conformable (e.g. that can be marshalled through XML),
include the following (and except where noted, they are unmarshalled
as the same Python type):


@multitable {xxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

XML-RPC type

@tab

Python type

@item

@code{boolean}

@tab

@ref{3c1,,bool}

@item

@code{int}, @code{i1},
@code{i2},  @code{i4},
@code{i8} or
@code{biginteger}

@tab

@ref{19c,,int} in range from -2147483648 to 2147483647.
Values get the @code{<int>} tag.

@item

@code{double} or
@code{float}

@tab

@ref{197,,float}.  Values get the @code{<double>} tag.

@item

@code{string}

@tab

@ref{16a,,str}

@item

@code{array}

@tab

@ref{24f,,list} or @ref{614,,tuple} containing
conformable elements.  Arrays are returned as
@code{lists}.

@item

@code{struct}

@tab

@ref{184,,dict}.  Keys must be strings, values may be
any conformable type.  Objects of user-defined
classes can be passed in; only their
@ref{77e,,__dict__} attribute is transmitted.

@item

@code{dateTime.iso8601}

@tab

@ref{15ef,,DateTime} or @ref{4e3,,datetime.datetime}.
Returned type depends on values of
`use_builtin_types' and `use_datetime' flags.

@item

@code{base64}

@tab

@ref{4204,,Binary}, @ref{193,,bytes} or
@ref{342,,bytearray}.  Returned type depends on the
value of the `use_builtin_types' flag.

@item

@code{nil}

@tab

The @code{None} constant.  Passing is allowed only if
`allow_none' is true.

@item

@code{bigdecimal}

@tab

@ref{200,,decimal.Decimal}.  Returned type only.

@end multitable


This is the full set of data types supported by XML-RPC.  Method calls may also
raise a special @ref{4205,,Fault} instance, used to signal XML-RPC server errors, or
@ref{4206,,ProtocolError} used to signal an error in the HTTP/HTTPS transport layer.
Both @code{Fault} and @code{ProtocolError} derive from a base class called
@code{Error}.  Note that the xmlrpc client module currently does not marshal
instances of subclasses of built-in types.

When passing strings, characters special to XML such as @code{<}, @code{>}, and @code{&}
will be automatically escaped.  However, it’s the caller’s responsibility to
ensure that the string is free of characters that aren’t allowed in XML, such as
the control characters with ASCII values between 0 and 31 (except, of course,
tab, newline and carriage return); failing to do this will result in an XML-RPC
request that isn’t well-formed XML.  If you have to pass arbitrary bytes
via XML-RPC, use @ref{193,,bytes} or @ref{342,,bytearray} classes or the
@ref{4204,,Binary} wrapper class described below.

@code{Server} is retained as an alias for @code{ServerProxy} for backwards
compatibility.  New code should use @code{ServerProxy}.


Changed in version 3.5: Added the `context' argument.



Changed in version 3.6: Added support of type tags with prefixes (e.g. @code{ex:nil}).
Added support of unmarshalling additional types used by Apache XML-RPC
implementation for numerics: @code{i1}, @code{i2}, @code{i8}, @code{biginteger},
@code{float} and @code{bigdecimal}.
See @indicateurl{https://ws.apache.org/xmlrpc/types.html} for a description.

@end deffn


@subsubheading See also



@table @asis

@item XML-RPC HOWTO@footnote{https://tldp.org/HOWTO/XML-RPC-HOWTO/index.html}

A good description of XML-RPC operation and client software in several languages.
Contains pretty much everything an XML-RPC client developer needs to know.

@item XML-RPC Introspection@footnote{https://xmlrpc-c.sourceforge.io/introspection.html}

Describes the XML-RPC protocol extension for introspection.

@item XML-RPC Specification@footnote{http://xmlrpc.scripting.com/spec.html}

The official specification.
@end table


@menu
* ServerProxy Objects:: 
* DateTime Objects:: 
* Binary Objects:: 
* Fault Objects:: 
* ProtocolError Objects:: 
* MultiCall Objects:: 
* Convenience Functions:: 
* Example of Client Usage:: 
* Example of Client and Server Usage:: 

@end menu

@node ServerProxy Objects,DateTime Objects,,xmlrpc client — XML-RPC client access
@anchor{library/xmlrpc client id1}@anchor{4207}@anchor{library/xmlrpc client serverproxy-objects}@anchor{4208}
@subsubsection ServerProxy Objects


A @ref{c52,,ServerProxy} instance has a method corresponding to each remote
procedure call accepted by the XML-RPC server.  Calling the method performs an
RPC, dispatched by both name and argument signature (e.g. the same method name
can be overloaded with multiple argument signatures).  The RPC finishes by
returning a value, which may be either returned data in a conformant type or a
@ref{4205,,Fault} or @ref{4206,,ProtocolError} object indicating an error.

Servers that support the XML introspection API support some common methods
grouped under the reserved @code{system} attribute:

@geindex listMethods() (xmlrpc.client.ServerProxy.system method)
@anchor{library/xmlrpc client xmlrpc client ServerProxy system listMethods}@anchor{4209}
@deffn {Method} ServerProxy.system.listMethods ()

This method returns a list of strings, one for each (non-system) method
supported by the XML-RPC server.
@end deffn

@geindex methodSignature() (xmlrpc.client.ServerProxy.system method)
@anchor{library/xmlrpc client xmlrpc client ServerProxy system methodSignature}@anchor{420a}
@deffn {Method} ServerProxy.system.methodSignature (name)

This method takes one parameter, the name of a method implemented by the XML-RPC
server. It returns an array of possible signatures for this method. A signature
is an array of types. The first of these types is the return type of the method,
the rest are parameters.

Because multiple signatures (ie. overloading) is permitted, this method returns
a list of signatures rather than a singleton.

Signatures themselves are restricted to the top level parameters expected by a
method. For instance if a method expects one array of structs as a parameter,
and it returns a string, its signature is simply “string, array”. If it expects
three integers and returns a string, its signature is “string, int, int, int”.

If no signature is defined for the method, a non-array value is returned. In
Python this means that the type of the returned  value will be something other
than list.
@end deffn

@geindex methodHelp() (xmlrpc.client.ServerProxy.system method)
@anchor{library/xmlrpc client xmlrpc client ServerProxy system methodHelp}@anchor{420b}
@deffn {Method} ServerProxy.system.methodHelp (name)

This method takes one parameter, the name of a method implemented by the XML-RPC
server.  It returns a documentation string describing the use of that method. If
no such string is available, an empty string is returned. The documentation
string may contain HTML markup.
@end deffn


Changed in version 3.5: Instances of @ref{c52,,ServerProxy} support the @ref{1e3,,context manager} protocol
for closing the underlying transport.


A working example follows. The server code:

@example
from xmlrpc.server import SimpleXMLRPCServer

def is_even(n):
    return n % 2 == 0

server = SimpleXMLRPCServer(("localhost", 8000))
print("Listening on port 8000...")
server.register_function(is_even, "is_even")
server.serve_forever()
@end example

The client code for the preceding server:

@example
import xmlrpc.client

with xmlrpc.client.ServerProxy("http://localhost:8000/") as proxy:
    print("3 is even: %s" % str(proxy.is_even(3)))
    print("100 is even: %s" % str(proxy.is_even(100)))
@end example

@node DateTime Objects,Binary Objects,ServerProxy Objects,xmlrpc client — XML-RPC client access
@anchor{library/xmlrpc client datetime-objects}@anchor{420c}@anchor{library/xmlrpc client id2}@anchor{420d}
@subsubsection DateTime Objects


@geindex DateTime (class in xmlrpc.client)
@anchor{library/xmlrpc client xmlrpc client DateTime}@anchor{15ef}
@deffn {Class} xmlrpc.client.DateTime

This class may be initialized with seconds since the epoch, a time
tuple, an ISO 8601 time/date string, or a @ref{4e3,,datetime.datetime}
instance.  It has the following methods, supported mainly for internal
use by the marshalling/unmarshalling code:

@geindex decode() (xmlrpc.client.DateTime method)
@anchor{library/xmlrpc client xmlrpc client DateTime decode}@anchor{420e}
@deffn {Method} decode (string)

Accept a string as the instance’s new time value.
@end deffn

@geindex encode() (xmlrpc.client.DateTime method)
@anchor{library/xmlrpc client xmlrpc client DateTime encode}@anchor{420f}
@deffn {Method} encode (out)

Write the XML-RPC encoding of this @code{DateTime} item to the `out' stream
object.
@end deffn

It also supports certain of Python’s built-in operators through
@ref{14ac,,rich comparison} and @ref{830,,__repr__()}
methods.
@end deffn

A working example follows. The server code:

@example
import datetime as dt
from xmlrpc.server import SimpleXMLRPCServer
import xmlrpc.client

def today():
    today = dt.datetime.today()
    return xmlrpc.client.DateTime(today)

server = SimpleXMLRPCServer(("localhost", 8000))
print("Listening on port 8000...")
server.register_function(today, "today")
server.serve_forever()
@end example

The client code for the preceding server:

@example
import xmlrpc.client
import datetime as dt

proxy = xmlrpc.client.ServerProxy("http://localhost:8000/")

today = proxy.today()
# convert the ISO 8601 string to a datetime object
converted = dt.datetime.strptime(today.value, "%Y%m%dT%H:%M:%S")
print(f"Today: @{converted.strftime('%d.%m.%Y, %H:%M')@}")
@end example

@node Binary Objects,Fault Objects,DateTime Objects,xmlrpc client — XML-RPC client access
@anchor{library/xmlrpc client binary-objects}@anchor{4210}@anchor{library/xmlrpc client id3}@anchor{4211}
@subsubsection Binary Objects


@geindex Binary (class in xmlrpc.client)
@anchor{library/xmlrpc client xmlrpc client Binary}@anchor{4204}
@deffn {Class} xmlrpc.client.Binary

This class may be initialized from bytes data (which may include NULs). The
primary access to the content of a @code{Binary} object is provided by an
attribute:

@geindex data (xmlrpc.client.Binary attribute)
@anchor{library/xmlrpc client xmlrpc client Binary data}@anchor{4212}
@deffn {Attribute} data

The binary data encapsulated by the @code{Binary} instance.  The data is
provided as a @ref{193,,bytes} object.
@end deffn

@code{Binary} objects have the following methods, supported mainly for
internal use by the marshalling/unmarshalling code:

@geindex decode() (xmlrpc.client.Binary method)
@anchor{library/xmlrpc client xmlrpc client Binary decode}@anchor{4213}
@deffn {Method} decode (bytes)

Accept a base64 @ref{193,,bytes} object and decode it as the instance’s new data.
@end deffn

@geindex encode() (xmlrpc.client.Binary method)
@anchor{library/xmlrpc client xmlrpc client Binary encode}@anchor{4214}
@deffn {Method} encode (out)

Write the XML-RPC base 64 encoding of this binary item to the `out' stream object.

The encoded data will have newlines every 76 characters as per
@geindex RFC; RFC 2045 Section 6.8
RFC 2045 section 6.8@footnote{https://datatracker.ietf.org/doc/html/rfc2045.html#section-6.8},
which was the de facto standard base64 specification when the
XML-RPC spec was written.
@end deffn

It also supports certain of Python’s built-in operators through
@ref{cf8,,__eq__()} and @ref{1723,,__ne__()} methods.
@end deffn

Example usage of the binary objects.  We’re going to transfer an image over
XMLRPC:

@example
from xmlrpc.server import SimpleXMLRPCServer
import xmlrpc.client

def python_logo():
    with open("python_logo.jpg", "rb") as handle:
        return xmlrpc.client.Binary(handle.read())

server = SimpleXMLRPCServer(("localhost", 8000))
print("Listening on port 8000...")
server.register_function(python_logo, 'python_logo')

server.serve_forever()
@end example

The client gets the image and saves it to a file:

@example
import xmlrpc.client

proxy = xmlrpc.client.ServerProxy("http://localhost:8000/")
with open("fetched_python_logo.jpg", "wb") as handle:
    handle.write(proxy.python_logo().data)
@end example

@node Fault Objects,ProtocolError Objects,Binary Objects,xmlrpc client — XML-RPC client access
@anchor{library/xmlrpc client fault-objects}@anchor{4215}@anchor{library/xmlrpc client id4}@anchor{4216}
@subsubsection Fault Objects


@geindex Fault (class in xmlrpc.client)
@anchor{library/xmlrpc client xmlrpc client Fault}@anchor{4205}
@deffn {Class} xmlrpc.client.Fault

A @code{Fault} object encapsulates the content of an XML-RPC fault tag. Fault
objects have the following attributes:

@geindex faultCode (xmlrpc.client.Fault attribute)
@anchor{library/xmlrpc client xmlrpc client Fault faultCode}@anchor{4217}
@deffn {Attribute} faultCode

An int indicating the fault type.
@end deffn

@geindex faultString (xmlrpc.client.Fault attribute)
@anchor{library/xmlrpc client xmlrpc client Fault faultString}@anchor{4218}
@deffn {Attribute} faultString

A string containing a diagnostic message associated with the fault.
@end deffn
@end deffn

In the following example we’re going to intentionally cause a @ref{4205,,Fault} by
returning a complex type object.  The server code:

@example
from xmlrpc.server import SimpleXMLRPCServer

# A marshalling error is going to occur because we're returning a
# complex number
def add(x, y):
    return x+y+0j

server = SimpleXMLRPCServer(("localhost", 8000))
print("Listening on port 8000...")
server.register_function(add, 'add')

server.serve_forever()
@end example

The client code for the preceding server:

@example
import xmlrpc.client

proxy = xmlrpc.client.ServerProxy("http://localhost:8000/")
try:
    proxy.add(2, 5)
except xmlrpc.client.Fault as err:
    print("A fault occurred")
    print("Fault code: %d" % err.faultCode)
    print("Fault string: %s" % err.faultString)
@end example

@node ProtocolError Objects,MultiCall Objects,Fault Objects,xmlrpc client — XML-RPC client access
@anchor{library/xmlrpc client protocol-error-objects}@anchor{4219}@anchor{library/xmlrpc client protocolerror-objects}@anchor{421a}
@subsubsection ProtocolError Objects


@geindex ProtocolError (class in xmlrpc.client)
@anchor{library/xmlrpc client xmlrpc client ProtocolError}@anchor{4206}
@deffn {Class} xmlrpc.client.ProtocolError

A @code{ProtocolError} object describes a protocol error in the underlying
transport layer (such as a 404 ‘not found’ error if the server named by the URI
does not exist).  It has the following attributes:

@geindex url (xmlrpc.client.ProtocolError attribute)
@anchor{library/xmlrpc client xmlrpc client ProtocolError url}@anchor{421b}
@deffn {Attribute} url

The URI or URL that triggered the error.
@end deffn

@geindex errcode (xmlrpc.client.ProtocolError attribute)
@anchor{library/xmlrpc client xmlrpc client ProtocolError errcode}@anchor{421c}
@deffn {Attribute} errcode

The error code.
@end deffn

@geindex errmsg (xmlrpc.client.ProtocolError attribute)
@anchor{library/xmlrpc client xmlrpc client ProtocolError errmsg}@anchor{421d}
@deffn {Attribute} errmsg

The error message or diagnostic string.
@end deffn

@geindex headers (xmlrpc.client.ProtocolError attribute)
@anchor{library/xmlrpc client xmlrpc client ProtocolError headers}@anchor{421e}
@deffn {Attribute} headers

A dict containing the headers of the HTTP/HTTPS request that triggered the
error.
@end deffn
@end deffn

In the following example we’re going to intentionally cause a @ref{4206,,ProtocolError}
by providing an invalid URI:

@example
import xmlrpc.client

# create a ServerProxy with a URI that doesn't respond to XMLRPC requests
proxy = xmlrpc.client.ServerProxy("http://google.com/")

try:
    proxy.some_method()
except xmlrpc.client.ProtocolError as err:
    print("A protocol error occurred")
    print("URL: %s" % err.url)
    print("HTTP/HTTPS headers: %s" % err.headers)
    print("Error code: %d" % err.errcode)
    print("Error message: %s" % err.errmsg)
@end example

@node MultiCall Objects,Convenience Functions,ProtocolError Objects,xmlrpc client — XML-RPC client access
@anchor{library/xmlrpc client multicall-objects}@anchor{421f}
@subsubsection MultiCall Objects


The @ref{4220,,MultiCall} object provides a way to encapsulate multiple calls to a
remote server into a single request @footnote{
This approach has been first presented in @uref{https://web.archive.org/web/20060624230303/http://www.xmlrpc.com/discuss/msgReader$1208?mode=topic,a discussion on xmlrpc.com}.
}.

@geindex MultiCall (class in xmlrpc.client)
@anchor{library/xmlrpc client xmlrpc client MultiCall}@anchor{4220}
@deffn {Class} xmlrpc.client.MultiCall (server)

Create an object used to boxcar method calls. `server' is the eventual target of
the call. Calls can be made to the result object, but they will immediately
return @code{None}, and only store the call name and parameters in the
@code{MultiCall} object. Calling the object itself causes all stored calls to
be transmitted as a single @code{system.multicall} request. The result of this call
is a @ref{1267,,generator}; iterating over this generator yields the individual
results.
@end deffn

A usage example of this class follows.  The server code:

@example
from xmlrpc.server import SimpleXMLRPCServer

def add(x, y):
    return x + y

def subtract(x, y):
    return x - y

def multiply(x, y):
    return x * y

def divide(x, y):
    return x // y

# A simple server with simple arithmetic functions
server = SimpleXMLRPCServer(("localhost", 8000))
print("Listening on port 8000...")
server.register_multicall_functions()
server.register_function(add, 'add')
server.register_function(subtract, 'subtract')
server.register_function(multiply, 'multiply')
server.register_function(divide, 'divide')
server.serve_forever()
@end example

The client code for the preceding server:

@example
import xmlrpc.client

proxy = xmlrpc.client.ServerProxy("http://localhost:8000/")
multicall = xmlrpc.client.MultiCall(proxy)
multicall.add(7, 3)
multicall.subtract(7, 3)
multicall.multiply(7, 3)
multicall.divide(7, 3)
result = multicall()

print("7+3=%d, 7-3=%d, 7*3=%d, 7//3=%d" % tuple(result))
@end example

@node Convenience Functions,Example of Client Usage,MultiCall Objects,xmlrpc client — XML-RPC client access
@anchor{library/xmlrpc client convenience-functions}@anchor{4221}
@subsubsection Convenience Functions


@geindex dumps() (in module xmlrpc.client)
@anchor{library/xmlrpc client xmlrpc client dumps}@anchor{1775}
@deffn {Function} xmlrpc.client.dumps (params, methodname=None, methodresponse=None, encoding=None, allow_none=False)

Convert `params' into an XML-RPC request, or into a response if `methodresponse'
is true. `params' can be either a tuple of arguments or an instance of the
@ref{4205,,Fault} exception class.  If `methodresponse' is true, only a single value
can be returned, meaning that `params' must be of length 1. `encoding', if
supplied, is the encoding to use in the generated XML; the default is UTF-8.
Python’s @ref{887,,None} value cannot be used in standard XML-RPC; to allow using
it via an extension,  provide a true value for `allow_none'.
@end deffn

@geindex loads() (in module xmlrpc.client)
@anchor{library/xmlrpc client xmlrpc client loads}@anchor{1641}
@deffn {Function} xmlrpc.client.loads (data, use_datetime=False, use_builtin_types=False)

Convert an XML-RPC request or response into Python objects, a @code{(params,
methodname)}.  `params' is a tuple of argument; `methodname' is a string, or
@code{None} if no method name is present in the packet. If the XML-RPC packet
represents a fault condition, this function will raise a @ref{4205,,Fault} exception.
The `use_builtin_types' flag can be used to cause date/time values to be
presented as @ref{4e3,,datetime.datetime} objects and binary data to be
presented as @ref{193,,bytes} objects; this flag is false by default.

The obsolete `use_datetime' flag is similar to `use_builtin_types' but it
applies only to date/time values.


Changed in version 3.3: The `use_builtin_types' flag was added.

@end deffn

@node Example of Client Usage,Example of Client and Server Usage,Convenience Functions,xmlrpc client — XML-RPC client access
@anchor{library/xmlrpc client example-of-client-usage}@anchor{4222}@anchor{library/xmlrpc client xmlrpc-client-example}@anchor{4223}
@subsubsection Example of Client Usage


@example
# simple test program (from the XML-RPC specification)
from xmlrpc.client import ServerProxy, Error

# server = ServerProxy("http://localhost:8000") # local server
with ServerProxy("http://betty.userland.com") as proxy:

    print(proxy)

    try:
        print(proxy.examples.getStateName(41))
    except Error as v:
        print("ERROR", v)
@end example

To access an XML-RPC server through a HTTP proxy, you need to define a custom
transport.  The following example shows how:

@example
import http.client
import xmlrpc.client

class ProxiedTransport(xmlrpc.client.Transport):

    def set_proxy(self, host, port=None, headers=None):
        self.proxy = host, port
        self.proxy_headers = headers

    def make_connection(self, host):
        connection = http.client.HTTPConnection(*self.proxy)
        connection.set_tunnel(host, headers=self.proxy_headers)
        self._connection = host, connection
        return connection

transport = ProxiedTransport()
transport.set_proxy('proxy-server', 8080)
server = xmlrpc.client.ServerProxy('http://betty.userland.com', transport=transport)
print(server.examples.getStateName(41))
@end example

@node Example of Client and Server Usage,,Example of Client Usage,xmlrpc client — XML-RPC client access
@anchor{library/xmlrpc client example-of-client-and-server-usage}@anchor{4224}
@subsubsection Example of Client and Server Usage


See @ref{4225,,SimpleXMLRPCServer example}.

@c the link now points to webarchive since the one at

@c http://www.xmlrpc.com/discuss/msgReader%241208 is broken (and webadmin

@c doesn't reply)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node xmlrpc server — Basic XML-RPC servers,ipaddress — IPv4/IPv6 manipulation library,xmlrpc client — XML-RPC client access,Internet Protocols and Support
@anchor{library/xmlrpc server doc}@anchor{4226}@anchor{library/xmlrpc server module-xmlrpc server}@anchor{136}@anchor{library/xmlrpc server translation-repo}@anchor{4227}@anchor{library/xmlrpc server xmlrpc-server-basic-xml-rpc-servers}@anchor{4228}
@subsection @code{xmlrpc.server} — Basic XML-RPC servers


@geindex module; xmlrpc.server

`Source code:' Lib/xmlrpc/server.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/xmlrpc/server.py}


__________________________________________________________________


The @code{xmlrpc.server} module provides a basic server framework for XML-RPC
servers written in Python.  Servers can either be free standing, using
@ref{4229,,SimpleXMLRPCServer}, or embedded in a CGI environment, using
@ref{422a,,CGIXMLRPCRequestHandler}.

@cartouche
@quotation Warning 
The @code{xmlrpc.server} module is not secure against maliciously
constructed data.  If you need to parse untrusted or unauthenticated data,
see @ref{3d6e,,XML security}.
@end quotation
@end cartouche

@c include for modules that don't work on WASM

@ref{2181,,Availability}: not WASI.

This module does not work or is not available on WebAssembly. See
@ref{1bae,,WebAssembly platforms} for more information.

@geindex SimpleXMLRPCServer (class in xmlrpc.server)
@anchor{library/xmlrpc server xmlrpc server SimpleXMLRPCServer}@anchor{4229}
@deffn {Class} xmlrpc.server.SimpleXMLRPCServer (addr, requestHandler=SimpleXMLRPCRequestHandler, logRequests=True, allow_none=False, encoding=None, bind_and_activate=True, use_builtin_types=False)

Create a new server instance.  This class provides methods for registration of
functions that can be called by the XML-RPC protocol.  The `requestHandler'
parameter should be a factory for request handler instances; it defaults to
@ref{1533,,SimpleXMLRPCRequestHandler}.  The `addr' and `requestHandler' parameters
are passed to the @ref{152b,,socketserver.TCPServer} constructor.  If `logRequests'
is true (the default), requests will be logged; setting this parameter to false
will turn off logging.   The `allow_none' and `encoding' parameters are passed
on to @ref{135,,xmlrpc.client} and control the XML-RPC responses that will be returned
from the server. The `bind_and_activate' parameter controls whether
@code{server_bind()} and @code{server_activate()} are called immediately by the
constructor; it defaults to true. Setting it to false allows code to manipulate
the `allow_reuse_address' class variable before the address is bound.
The `use_builtin_types' parameter is passed to the
@ref{1641,,loads()} function and controls which types are processed
when date/times values or binary data are received; it defaults to false.


Changed in version 3.3: The `use_builtin_types' flag was added.

@end deffn

@geindex CGIXMLRPCRequestHandler (class in xmlrpc.server)
@anchor{library/xmlrpc server xmlrpc server CGIXMLRPCRequestHandler}@anchor{422a}
@deffn {Class} xmlrpc.server.CGIXMLRPCRequestHandler (allow_none=False, encoding=None, use_builtin_types=False)

Create a new instance to handle XML-RPC requests in a CGI environment.  The
`allow_none' and `encoding' parameters are passed on to @ref{135,,xmlrpc.client}
and control the XML-RPC responses that will be returned from the server.
The `use_builtin_types' parameter is passed to the
@ref{1641,,loads()} function and controls which types are processed
when date/times values or binary data are received; it defaults to false.


Changed in version 3.3: The `use_builtin_types' flag was added.

@end deffn

@geindex SimpleXMLRPCRequestHandler (class in xmlrpc.server)
@anchor{library/xmlrpc server xmlrpc server SimpleXMLRPCRequestHandler}@anchor{1533}
@deffn {Class} xmlrpc.server.SimpleXMLRPCRequestHandler

Create a new request handler instance.  This request handler supports @code{POST}
requests and modifies logging so that the `logRequests' parameter to the
@ref{4229,,SimpleXMLRPCServer} constructor parameter is honored.
@end deffn

@menu
* SimpleXMLRPCServer objects:: 
* CGIXMLRPCRequestHandler:: 
* Documenting XMLRPC server:: 
* DocXMLRPCServer objects:: 
* DocCGIXMLRPCRequestHandler:: 

@end menu

@node SimpleXMLRPCServer objects,CGIXMLRPCRequestHandler,,xmlrpc server — Basic XML-RPC servers
@anchor{library/xmlrpc server simple-xmlrpc-servers}@anchor{422b}@anchor{library/xmlrpc server simplexmlrpcserver-objects}@anchor{422c}
@subsubsection SimpleXMLRPCServer objects


The @ref{4229,,SimpleXMLRPCServer} class is based on
@ref{152b,,socketserver.TCPServer} and provides a means of creating simple, stand
alone XML-RPC servers.

@geindex register_function() (xmlrpc.server.SimpleXMLRPCServer method)
@anchor{library/xmlrpc server xmlrpc server SimpleXMLRPCServer register_function}@anchor{422d}
@deffn {Method} SimpleXMLRPCServer.register_function (function=None, name=None)

Register a function that can respond to XML-RPC requests.  If `name' is given,
it will be the method name associated with `function', otherwise
@ref{14e0,,function.__name__} will be used.  `name' is a string, and may contain
characters not legal in Python identifiers, including the period character.

This method can also be used as a decorator.  When used as a decorator,
`name' can only be given as a keyword argument to register `function' under
`name'.  If no `name' is given, @ref{14e0,,function.__name__} will be used.


Changed in version 3.7: @code{register_function()} can be used as a decorator.

@end deffn

@geindex register_instance() (xmlrpc.server.SimpleXMLRPCServer method)
@anchor{library/xmlrpc server xmlrpc server SimpleXMLRPCServer register_instance}@anchor{422e}
@deffn {Method} SimpleXMLRPCServer.register_instance (instance, allow_dotted_names=False)

Register an object which is used to expose method names which have not been
registered using @ref{422d,,register_function()}.  If `instance' contains a
@code{_dispatch()} method, it is called with the requested method name and the
parameters from the request.  Its API is @code{def _dispatch(self, method, params)}
(note that `params' does not represent a variable argument list).  If it calls
an underlying function to perform its task, that function is called as
@code{func(*params)}, expanding the parameter list. The return value from
@code{_dispatch()} is returned to the client as the result.  If `instance' does
not have a @code{_dispatch()} method, it is searched for an attribute matching
the name of the requested method.

If the optional `allow_dotted_names' argument is true and the instance does not
have a @code{_dispatch()} method, then if the requested method name contains
periods, each component of the method name is searched for individually, with
the effect that a simple hierarchical search is performed.  The value found from
this search is then called with the parameters from the request, and the return
value is passed back to the client.

@cartouche
@quotation Warning 
Enabling the `allow_dotted_names' option allows intruders to access your
module’s global variables and may allow intruders to execute arbitrary code on
your machine.  Only use this option on a secure, closed network.
@end quotation
@end cartouche
@end deffn

@geindex register_introspection_functions() (xmlrpc.server.SimpleXMLRPCServer method)
@anchor{library/xmlrpc server xmlrpc server SimpleXMLRPCServer register_introspection_functions}@anchor{422f}
@deffn {Method} SimpleXMLRPCServer.register_introspection_functions ()

Registers the XML-RPC introspection functions @code{system.listMethods},
@code{system.methodHelp} and @code{system.methodSignature}.
@end deffn

@geindex register_multicall_functions() (xmlrpc.server.SimpleXMLRPCServer method)
@anchor{library/xmlrpc server xmlrpc server SimpleXMLRPCServer register_multicall_functions}@anchor{4230}
@deffn {Method} SimpleXMLRPCServer.register_multicall_functions ()

Registers the XML-RPC multicall function system.multicall.
@end deffn

@geindex rpc_paths (xmlrpc.server.SimpleXMLRPCRequestHandler attribute)
@anchor{library/xmlrpc server xmlrpc server SimpleXMLRPCRequestHandler rpc_paths}@anchor{4231}
@deffn {Attribute} SimpleXMLRPCRequestHandler.rpc_paths

An attribute value that must be a tuple listing valid path portions of the URL
for receiving XML-RPC requests.  Requests posted to other paths will result in a
404 “no such page” HTTP error.  If this tuple is empty, all paths will be
considered valid. The default value is @code{('/', '/RPC2')}.
@end deffn

@menu
* SimpleXMLRPCServer example:: 

@end menu

@node SimpleXMLRPCServer example,,,SimpleXMLRPCServer objects
@anchor{library/xmlrpc server id1}@anchor{4232}@anchor{library/xmlrpc server simplexmlrpcserver-example}@anchor{4225}
@subsubsection SimpleXMLRPCServer example


Server code:

@example
from xmlrpc.server import SimpleXMLRPCServer
from xmlrpc.server import SimpleXMLRPCRequestHandler

# Restrict to a particular path.
class RequestHandler(SimpleXMLRPCRequestHandler):
    rpc_paths = ('/RPC2',)

# Create server
with SimpleXMLRPCServer(('localhost', 8000),
                        requestHandler=RequestHandler) as server:
    server.register_introspection_functions()

    # Register pow() function; this will use the value of
    # pow.__name__ as the name, which is just 'pow'.
    server.register_function(pow)

    # Register a function under a different name
    def adder_function(x, y):
        return x + y
    server.register_function(adder_function, 'add')

    # Register an instance; all the methods of the instance are
    # published as XML-RPC methods (in this case, just 'mul').
    class MyFuncs:
        def mul(self, x, y):
            return x * y

    server.register_instance(MyFuncs())

    # Run the server's main loop
    server.serve_forever()
@end example

The following client code will call the methods made available by the preceding
server:

@example
import xmlrpc.client

s = xmlrpc.client.ServerProxy('http://localhost:8000')
print(s.pow(2,3))  # Returns 2**3 = 8
print(s.add(2,3))  # Returns 5
print(s.mul(5,2))  # Returns 5*2 = 10

# Print list of available methods
print(s.system.listMethods())
@end example

@code{register_function()} can also be used as a decorator. The previous server
example can register functions in a decorator way:

@example
from xmlrpc.server import SimpleXMLRPCServer
from xmlrpc.server import SimpleXMLRPCRequestHandler

class RequestHandler(SimpleXMLRPCRequestHandler):
    rpc_paths = ('/RPC2',)

with SimpleXMLRPCServer(('localhost', 8000),
                        requestHandler=RequestHandler) as server:
    server.register_introspection_functions()

    # Register pow() function; this will use the value of
    # pow.__name__ as the name, which is just 'pow'.
    server.register_function(pow)

    # Register a function under a different name, using
    # register_function as a decorator. *name* can only be given
    # as a keyword argument.
    @@server.register_function(name='add')
    def adder_function(x, y):
        return x + y

    # Register a function under function.__name__.
    @@server.register_function
    def mul(x, y):
        return x * y

    server.serve_forever()
@end example

The following example included in the @code{Lib/xmlrpc/server.py} module shows
a server allowing dotted names and registering a multicall function.

@cartouche
@quotation Warning 
Enabling the `allow_dotted_names' option allows intruders to access your
module’s global variables and may allow intruders to execute arbitrary code on
your machine.  Only use this example within a secure, closed network.
@end quotation
@end cartouche

@example
import datetime as dt

class ExampleService:
    def getData(self):
        return '42'

    class currentTime:
        @@staticmethod
        def getCurrentTime():
            return dt.datetime.now()

with SimpleXMLRPCServer(("localhost", 8000)) as server:
    server.register_function(pow)
    server.register_function(lambda x,y: x+y, 'add')
    server.register_instance(ExampleService(), allow_dotted_names=True)
    server.register_multicall_functions()
    print('Serving XML-RPC on localhost port 8000')
    try:
        server.serve_forever()
    except KeyboardInterrupt:
        print("\nKeyboard interrupt received, exiting.")
        sys.exit(0)
@end example

This ExampleService demo can be invoked from the command line:

@example
python -m xmlrpc.server
@end example

The client that interacts with the above server is included in
@code{Lib/xmlrpc/client.py}:

@example
server = ServerProxy("http://localhost:8000")

try:
    print(server.currentTime.getCurrentTime())
except Error as v:
    print("ERROR", v)

multi = MultiCall(server)
multi.getData()
multi.pow(2,9)
multi.add(1,2)
try:
    for response in multi():
        print(response)
except Error as v:
    print("ERROR", v)
@end example

This client which interacts with the demo XMLRPC server can be invoked as:

@example
python -m xmlrpc.client
@end example

@node CGIXMLRPCRequestHandler,Documenting XMLRPC server,SimpleXMLRPCServer objects,xmlrpc server — Basic XML-RPC servers
@anchor{library/xmlrpc server cgixmlrpcrequesthandler}@anchor{4233}
@subsubsection CGIXMLRPCRequestHandler


The @ref{422a,,CGIXMLRPCRequestHandler} class can be used to handle XML-RPC
requests sent to Python CGI scripts.

@geindex register_function() (xmlrpc.server.CGIXMLRPCRequestHandler method)
@anchor{library/xmlrpc server xmlrpc server CGIXMLRPCRequestHandler register_function}@anchor{4234}
@deffn {Method} CGIXMLRPCRequestHandler.register_function (function=None, name=None)

Register a function that can respond to XML-RPC requests.  If `name' is given,
it will be the method name associated with `function', otherwise
@ref{14e0,,function.__name__} will be used.  `name' is a string, and may contain
characters not legal in Python identifiers, including the period character.

This method can also be used as a decorator.  When used as a decorator,
`name' can only be given as a keyword argument to register `function' under
`name'.  If no `name' is given, @ref{14e0,,function.__name__} will be used.


Changed in version 3.7: @code{register_function()} can be used as a decorator.

@end deffn

@geindex register_instance() (xmlrpc.server.CGIXMLRPCRequestHandler method)
@anchor{library/xmlrpc server xmlrpc server CGIXMLRPCRequestHandler register_instance}@anchor{4235}
@deffn {Method} CGIXMLRPCRequestHandler.register_instance (instance)

Register an object which is used to expose method names  which have not been
registered using @ref{4234,,register_function()}. If  instance contains a
@code{_dispatch()} method, it is called with the  requested method name and the
parameters from the  request; the return value is returned to the client as the
result. If instance does not have a @code{_dispatch()} method, it is searched
for an attribute matching the name of the requested method; if  the requested
method name contains periods, each  component of the method name is searched for
individually,  with the effect that a simple hierarchical search is performed.
The value found from this search is then called with the  parameters from the
request, and the return value is passed  back to the client.
@end deffn

@geindex register_introspection_functions() (xmlrpc.server.CGIXMLRPCRequestHandler method)
@anchor{library/xmlrpc server xmlrpc server CGIXMLRPCRequestHandler register_introspection_functions}@anchor{4236}
@deffn {Method} CGIXMLRPCRequestHandler.register_introspection_functions ()

Register the XML-RPC introspection functions  @code{system.listMethods},
@code{system.methodHelp} and  @code{system.methodSignature}.
@end deffn

@geindex register_multicall_functions() (xmlrpc.server.CGIXMLRPCRequestHandler method)
@anchor{library/xmlrpc server xmlrpc server CGIXMLRPCRequestHandler register_multicall_functions}@anchor{4237}
@deffn {Method} CGIXMLRPCRequestHandler.register_multicall_functions ()

Register the XML-RPC multicall function @code{system.multicall}.
@end deffn

@geindex handle_request() (xmlrpc.server.CGIXMLRPCRequestHandler method)
@anchor{library/xmlrpc server xmlrpc server CGIXMLRPCRequestHandler handle_request}@anchor{4238}
@deffn {Method} CGIXMLRPCRequestHandler.handle_request (request_text=None)

Handle an XML-RPC request. If `request_text' is given, it should be the POST
data provided by the HTTP server,  otherwise the contents of stdin will be used.
@end deffn

Example:

@example
class MyFuncs:
    def mul(self, x, y):
        return x * y


handler = CGIXMLRPCRequestHandler()
handler.register_function(pow)
handler.register_function(lambda x,y: x+y, 'add')
handler.register_introspection_functions()
handler.register_instance(MyFuncs())
handler.handle_request()
@end example

@node Documenting XMLRPC server,DocXMLRPCServer objects,CGIXMLRPCRequestHandler,xmlrpc server — Basic XML-RPC servers
@anchor{library/xmlrpc server documenting-xmlrpc-server}@anchor{4239}
@subsubsection Documenting XMLRPC server


These classes extend the above classes to serve HTML documentation in response
to HTTP GET requests.  Servers can either be free standing, using
@ref{1de9,,DocXMLRPCServer}, or embedded in a CGI environment, using
@ref{423a,,DocCGIXMLRPCRequestHandler}.

@geindex DocXMLRPCServer (class in xmlrpc.server)
@anchor{library/xmlrpc server xmlrpc server DocXMLRPCServer}@anchor{1de9}
@deffn {Class} xmlrpc.server.DocXMLRPCServer (addr, requestHandler=DocXMLRPCRequestHandler, logRequests=True, allow_none=False, encoding=None, bind_and_activate=True, use_builtin_types=True)

Create a new server instance. All parameters have the same meaning as for
@ref{4229,,SimpleXMLRPCServer}; `requestHandler' defaults to
@ref{423b,,DocXMLRPCRequestHandler}.


Changed in version 3.3: The `use_builtin_types' flag was added.

@end deffn

@geindex DocCGIXMLRPCRequestHandler (class in xmlrpc.server)
@anchor{library/xmlrpc server xmlrpc server DocCGIXMLRPCRequestHandler}@anchor{423a}
@deffn {Class} xmlrpc.server.DocCGIXMLRPCRequestHandler

Create a new instance to handle XML-RPC requests in a CGI environment.
@end deffn

@geindex DocXMLRPCRequestHandler (class in xmlrpc.server)
@anchor{library/xmlrpc server xmlrpc server DocXMLRPCRequestHandler}@anchor{423b}
@deffn {Class} xmlrpc.server.DocXMLRPCRequestHandler

Create a new request handler instance. This request handler supports XML-RPC
POST requests, documentation GET requests, and modifies logging so that the
`logRequests' parameter to the @ref{1de9,,DocXMLRPCServer} constructor parameter is
honored.
@end deffn

@node DocXMLRPCServer objects,DocCGIXMLRPCRequestHandler,Documenting XMLRPC server,xmlrpc server — Basic XML-RPC servers
@anchor{library/xmlrpc server doc-xmlrpc-servers}@anchor{423c}@anchor{library/xmlrpc server docxmlrpcserver-objects}@anchor{423d}
@subsubsection DocXMLRPCServer objects


The @ref{1de9,,DocXMLRPCServer} class is derived from @ref{4229,,SimpleXMLRPCServer}
and provides a means of creating self-documenting, stand alone XML-RPC
servers. HTTP POST requests are handled as XML-RPC method calls. HTTP GET
requests are handled by generating pydoc-style HTML documentation. This allows a
server to provide its own web-based documentation.

@geindex set_server_title() (xmlrpc.server.DocXMLRPCServer method)
@anchor{library/xmlrpc server xmlrpc server DocXMLRPCServer set_server_title}@anchor{423e}
@deffn {Method} DocXMLRPCServer.set_server_title (server_title)

Set the title used in the generated HTML documentation. This title will be used
inside the HTML “title” element.
@end deffn

@geindex set_server_name() (xmlrpc.server.DocXMLRPCServer method)
@anchor{library/xmlrpc server xmlrpc server DocXMLRPCServer set_server_name}@anchor{423f}
@deffn {Method} DocXMLRPCServer.set_server_name (server_name)

Set the name used in the generated HTML documentation. This name will appear at
the top of the generated documentation inside a “h1” element.
@end deffn

@geindex set_server_documentation() (xmlrpc.server.DocXMLRPCServer method)
@anchor{library/xmlrpc server xmlrpc server DocXMLRPCServer set_server_documentation}@anchor{4240}
@deffn {Method} DocXMLRPCServer.set_server_documentation (server_documentation)

Set the description used in the generated HTML documentation. This description
will appear as a paragraph, below the server name, in the documentation.
@end deffn

@node DocCGIXMLRPCRequestHandler,,DocXMLRPCServer objects,xmlrpc server — Basic XML-RPC servers
@anchor{library/xmlrpc server doccgixmlrpcrequesthandler}@anchor{4241}
@subsubsection DocCGIXMLRPCRequestHandler


The @ref{423a,,DocCGIXMLRPCRequestHandler} class is derived from
@ref{422a,,CGIXMLRPCRequestHandler} and provides a means of creating
self-documenting, XML-RPC CGI scripts. HTTP POST requests are handled as XML-RPC
method calls. HTTP GET requests are handled by generating pydoc-style HTML
documentation. This allows a server to provide its own web-based documentation.

@geindex set_server_title() (xmlrpc.server.DocCGIXMLRPCRequestHandler method)
@anchor{library/xmlrpc server xmlrpc server DocCGIXMLRPCRequestHandler set_server_title}@anchor{4242}
@deffn {Method} DocCGIXMLRPCRequestHandler.set_server_title (server_title)

Set the title used in the generated HTML documentation. This title will be used
inside the HTML “title” element.
@end deffn

@geindex set_server_name() (xmlrpc.server.DocCGIXMLRPCRequestHandler method)
@anchor{library/xmlrpc server xmlrpc server DocCGIXMLRPCRequestHandler set_server_name}@anchor{4243}
@deffn {Method} DocCGIXMLRPCRequestHandler.set_server_name (server_name)

Set the name used in the generated HTML documentation. This name will appear at
the top of the generated documentation inside a “h1” element.
@end deffn

@geindex set_server_documentation() (xmlrpc.server.DocCGIXMLRPCRequestHandler method)
@anchor{library/xmlrpc server xmlrpc server DocCGIXMLRPCRequestHandler set_server_documentation}@anchor{4244}
@deffn {Method} DocCGIXMLRPCRequestHandler.set_server_documentation (server_documentation)

Set the description used in the generated HTML documentation. This description
will appear as a paragraph, below the server name, in the documentation.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node ipaddress — IPv4/IPv6 manipulation library,,xmlrpc server — Basic XML-RPC servers,Internet Protocols and Support
@anchor{library/ipaddress doc}@anchor{4245}@anchor{library/ipaddress ipaddress-ipv4-ipv6-manipulation-library}@anchor{4246}@anchor{library/ipaddress module-ipaddress}@anchor{84}@anchor{library/ipaddress translation-repo}@anchor{4247}
@subsection @code{ipaddress} — IPv4/IPv6 manipulation library


@geindex module; ipaddress

`Source code:' Lib/ipaddress.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/ipaddress.py}


__________________________________________________________________


@code{ipaddress} provides the capabilities to create, manipulate and
operate on IPv4 and IPv6 addresses and networks.

The functions and classes in this module make it straightforward to handle
various tasks related to IP addresses, including checking whether or not two
hosts are on the same subnet, iterating over all hosts in a particular
subnet, checking whether or not a string represents a valid IP address or
network definition, and so on.

This is the full module API reference—for an overview and introduction, see
@ref{4248,,An introduction to the ipaddress module}.


Added in version 3.3.


@c import ipaddress
@c from ipaddress import (
@c     ip_network, IPv4Address, IPv4Interface, IPv4Network,
@c )

@menu
* Convenience factory functions:: 
* IP Addresses:: 
* IP Network definitions:: 
* Interface objects:: 
* Other Module Level Functions:: 
* Custom Exceptions:: 

@end menu

@node Convenience factory functions,IP Addresses,,ipaddress — IPv4/IPv6 manipulation library
@anchor{library/ipaddress convenience-factory-functions}@anchor{4249}
@subsubsection Convenience factory functions


The @code{ipaddress} module provides factory functions to conveniently create
IP addresses, networks and interfaces:

@geindex ip_address() (in module ipaddress)
@anchor{library/ipaddress ipaddress ip_address}@anchor{424a}
@deffn {Function} ipaddress.ip_address (address)

Return an @ref{50d,,IPv4Address} or @ref{50e,,IPv6Address} object depending on
the IP address passed as argument.  Either IPv4 or IPv6 addresses may be
supplied; integers less than @code{2**32} will be considered to be IPv4 by default.
A @ref{2ee,,ValueError} is raised if `address' does not represent a valid IPv4
or IPv6 address.

@example
>>> ipaddress.ip_address('192.168.0.1')
IPv4Address('192.168.0.1')
>>> ipaddress.ip_address('2001:db8::')
IPv6Address('2001:db8::')
@end example
@end deffn

@geindex ip_network() (in module ipaddress)
@anchor{library/ipaddress ipaddress ip_network}@anchor{424b}
@deffn {Function} ipaddress.ip_network (address, strict=True)

Return an @ref{50f,,IPv4Network} or @ref{510,,IPv6Network} object depending on
the IP address passed as argument.  `address' is a string or integer
representing the IP network.  Either IPv4 or IPv6 networks may be supplied;
integers less than @code{2**32} will be considered to be IPv4 by default.  `strict'
is passed to @code{IPv4Network} or @code{IPv6Network} constructor.  A
@ref{2ee,,ValueError} is raised if `address' does not represent a valid IPv4 or
IPv6 address, or if the network has host bits set.

@example
>>> ipaddress.ip_network('192.168.0.0/28')
IPv4Network('192.168.0.0/28')
@end example
@end deffn

@geindex ip_interface() (in module ipaddress)
@anchor{library/ipaddress ipaddress ip_interface}@anchor{424c}
@deffn {Function} ipaddress.ip_interface (address)

Return an @ref{1bdc,,IPv4Interface} or @ref{1bdd,,IPv6Interface} object depending
on the IP address passed as argument.  `address' is a string or integer
representing the IP address.  Either IPv4 or IPv6 addresses may be supplied;
integers less than @code{2**32} will be considered to be IPv4 by default.  A
@ref{2ee,,ValueError} is raised if `address' does not represent a valid IPv4 or
IPv6 address.
@end deffn

One downside of these convenience functions is that the need to handle both
IPv4 and IPv6 formats means that error messages provide minimal
information on the precise error, as the functions don’t know whether the
IPv4 or IPv6 format was intended. More detailed error reporting can be
obtained by calling the appropriate version specific class constructors
directly.

@node IP Addresses,IP Network definitions,Convenience factory functions,ipaddress — IPv4/IPv6 manipulation library
@anchor{library/ipaddress ip-addresses}@anchor{424d}
@subsubsection IP Addresses


@menu
* Address objects:: 
* Conversion to Strings and Integers:: 
* Operators: Operators<2>. 

@end menu

@node Address objects,Conversion to Strings and Integers,,IP Addresses
@anchor{library/ipaddress address-objects}@anchor{424e}
@subsubsection Address objects


The @ref{50d,,IPv4Address} and @ref{50e,,IPv6Address} objects share a lot of common
attributes.  Some attributes that are only meaningful for IPv6 addresses are
also implemented by @code{IPv4Address} objects, in order to make it easier to
write code that handles both IP versions correctly.  Address objects are
@ref{825,,hashable}, so they can be used as keys in dictionaries.

@geindex IPv4Address (class in ipaddress)
@anchor{library/ipaddress ipaddress IPv4Address}@anchor{50d}
@deffn {Class} ipaddress.IPv4Address (address)

Construct an IPv4 address.  An @ref{424f,,AddressValueError} is raised if
`address' is not a valid IPv4 address.

The following constitutes a valid IPv4 address:


@enumerate 

@item 
A string in decimal-dot notation, consisting of four decimal integers in
the inclusive range 0–255, separated by dots (e.g. @code{192.168.0.1}). Each
integer represents an octet (byte) in the address. Leading zeroes are
not tolerated to prevent confusion with octal notation.

@item 
An integer that fits into 32 bits.

@item 
An integer packed into a @ref{193,,bytes} object of length 4 (most
significant octet first).
@end enumerate

@example
>>> ipaddress.IPv4Address('192.168.0.1')
IPv4Address('192.168.0.1')
>>> ipaddress.IPv4Address(3232235521)
IPv4Address('192.168.0.1')
>>> ipaddress.IPv4Address(b'\xC0\xA8\x00\x01')
IPv4Address('192.168.0.1')
@end example


Changed in version 3.8: Leading zeros are tolerated, even in ambiguous cases that look like
octal notation.



Changed in version 3.9.5: Leading zeros are no longer tolerated and are treated as an error.
IPv4 address strings are now parsed as strict as glibc
@ref{b61,,inet_pton()}.


@geindex version (ipaddress.IPv4Address attribute)
@anchor{library/ipaddress ipaddress IPv4Address version}@anchor{4250}
@deffn {Attribute} version

The appropriate version number: @code{4} for IPv4, @code{6} for IPv6.


Changed in version 3.14: Made available on the class.

@end deffn

@geindex max_prefixlen (ipaddress.IPv4Address attribute)
@anchor{library/ipaddress ipaddress IPv4Address max_prefixlen}@anchor{4251}
@deffn {Attribute} max_prefixlen

The total number of bits in the address representation for this
version: @code{32} for IPv4, @code{128} for IPv6.

The prefix defines the number of leading bits in an  address that
are compared to determine whether or not an address is part of a
network.


Changed in version 3.14: Made available on the class.

@end deffn

@geindex compressed (ipaddress.IPv4Address attribute)
@anchor{library/ipaddress ipaddress IPv4Address compressed}@anchor{4252}
@deffn {Attribute} compressed
@end deffn

@geindex exploded (ipaddress.IPv4Address attribute)
@anchor{library/ipaddress ipaddress IPv4Address exploded}@anchor{4253}
@deffn {Attribute} exploded

The string representation in dotted decimal notation. Leading zeroes
are never included in the representation.

As IPv4 does not define a shorthand notation for addresses with octets
set to zero, these two attributes are always the same as @code{str(addr)}
for IPv4 addresses. Exposing these attributes makes it easier to
write display code that can handle both IPv4 and IPv6 addresses.
@end deffn

@geindex packed (ipaddress.IPv4Address attribute)
@anchor{library/ipaddress ipaddress IPv4Address packed}@anchor{4254}
@deffn {Attribute} packed

The binary representation of this address - a @ref{193,,bytes} object of
the appropriate length (most significant octet first). This is 4 bytes
for IPv4 and 16 bytes for IPv6.
@end deffn

@geindex reverse_pointer (ipaddress.IPv4Address attribute)
@anchor{library/ipaddress ipaddress IPv4Address reverse_pointer}@anchor{1026}
@deffn {Attribute} reverse_pointer

The name of the reverse DNS PTR record for the IP address, e.g.:

@example
>>> ipaddress.ip_address("127.0.0.1").reverse_pointer
'1.0.0.127.in-addr.arpa'
>>> ipaddress.ip_address("2001:db8::1").reverse_pointer
'1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa'
@end example

This is the name that could be used for performing a PTR lookup, not the
resolved hostname itself.


Added in version 3.5.

@end deffn

@geindex is_multicast (ipaddress.IPv4Address attribute)
@anchor{library/ipaddress ipaddress IPv4Address is_multicast}@anchor{4255}
@deffn {Attribute} is_multicast

@code{True} if the address is reserved for multicast use.  See
@geindex RFC; RFC 3171
RFC 3171@footnote{https://datatracker.ietf.org/doc/html/rfc3171.html} (for IPv4) or 
@geindex RFC; RFC 2373
RFC 2373@footnote{https://datatracker.ietf.org/doc/html/rfc2373.html} (for IPv6).
@end deffn

@geindex is_private (ipaddress.IPv4Address attribute)
@anchor{library/ipaddress ipaddress IPv4Address is_private}@anchor{1a05}
@deffn {Attribute} is_private

@code{True} if the address is defined as not globally reachable by
iana-ipv4-special-registry@footnote{https://www.iana.org/assignments/iana-ipv4-special-registry/iana-ipv4-special-registry.xhtml} (for IPv4) or iana-ipv6-special-registry@footnote{https://www.iana.org/assignments/iana-ipv6-special-registry/iana-ipv6-special-registry.xhtml}
(for IPv6) with the following exceptions:


@itemize *

@item 
@code{is_private} is @code{False} for the shared address space (@code{100.64.0.0/10})

@item 
For IPv4-mapped IPv6-addresses the @code{is_private} value is determined by the
semantics of the underlying IPv4 addresses and the following condition holds
(see @ref{4256,,IPv6Address.ipv4_mapped}):

@example
address.is_private == address.ipv4_mapped.is_private
@end example
@end itemize

@code{is_private} has value opposite to @ref{1165,,is_global}, except for the shared address space
(@code{100.64.0.0/10} range) where they are both @code{False}.


Changed in version 3.13: Fixed some false positives and false negatives.


@itemize *

@item 
@code{192.0.0.0/24} is considered private with the exception of @code{192.0.0.9/32} and
@code{192.0.0.10/32} (previously: only the @code{192.0.0.0/29} sub-range was considered private).

@item 
@code{64:ff9b:1::/48} is considered private.

@item 
@code{2002::/16} is considered private.

@item 
There are exceptions within @code{2001::/23} (otherwise considered private): @code{2001:1::1/128},
@code{2001:1::2/128}, @code{2001:3::/32}, @code{2001:4:112::/48}, @code{2001:20::/28}, @code{2001:30::/28}.
The exceptions are not considered private.
@end itemize

@end deffn

@geindex is_global (ipaddress.IPv4Address attribute)
@anchor{library/ipaddress ipaddress IPv4Address is_global}@anchor{1165}
@deffn {Attribute} is_global

@code{True} if the address is defined as globally reachable by
iana-ipv4-special-registry@footnote{https://www.iana.org/assignments/iana-ipv4-special-registry/iana-ipv4-special-registry.xhtml} (for IPv4) or iana-ipv6-special-registry@footnote{https://www.iana.org/assignments/iana-ipv6-special-registry/iana-ipv6-special-registry.xhtml}
(for IPv6) with the following exception:

For IPv4-mapped IPv6-addresses the @code{is_private} value is determined by the
semantics of the underlying IPv4 addresses and the following condition holds
(see @ref{4256,,IPv6Address.ipv4_mapped}):

@example
address.is_global == address.ipv4_mapped.is_global
@end example

@code{is_global} has value opposite to @ref{1a05,,is_private}, except for the shared address space
(@code{100.64.0.0/10} range) where they are both @code{False}.


Added in version 3.4.



Changed in version 3.13: Fixed some false positives and false negatives, see @ref{1a05,,is_private} for details.

@end deffn

@geindex is_unspecified (ipaddress.IPv4Address attribute)
@anchor{library/ipaddress ipaddress IPv4Address is_unspecified}@anchor{4257}
@deffn {Attribute} is_unspecified

@code{True} if the address is unspecified.  See 
@geindex RFC; RFC 5735
RFC 5735@footnote{https://datatracker.ietf.org/doc/html/rfc5735.html} (for IPv4)
or 
@geindex RFC; RFC 2373
RFC 2373@footnote{https://datatracker.ietf.org/doc/html/rfc2373.html} (for IPv6).
@end deffn

@geindex is_reserved (ipaddress.IPv4Address attribute)
@anchor{library/ipaddress ipaddress IPv4Address is_reserved}@anchor{4258}
@deffn {Attribute} is_reserved

@code{True} if the address is noted as reserved by the IETF.
For IPv4, this is only @code{240.0.0.0/4}, the @code{Reserved} address block.
For IPv6, this is all addresses allocated@footnote{https://www.iana.org/assignments/ipv6-address-space/ipv6-address-space.xhtml} as
@code{Reserved by IETF} for future use.

@cartouche
@quotation Note 
For IPv4, @code{is_reserved} is not related to the address block value of the
@code{Reserved-by-Protocol} column in iana-ipv4-special-registry@footnote{https://www.iana.org/assignments/iana-ipv4-special-registry/iana-ipv4-special-registry.xhtml}.
@end quotation
@end cartouche

@cartouche
@quotation Caution 
For IPv6, @code{fec0::/10} a former Site-Local scoped address prefix is
currently excluded from that list (see @ref{4259,,is_site_local} & 
@geindex RFC; RFC 3879
RFC 3879@footnote{https://datatracker.ietf.org/doc/html/rfc3879.html}).
@end quotation
@end cartouche
@end deffn

@geindex is_loopback (ipaddress.IPv4Address attribute)
@anchor{library/ipaddress ipaddress IPv4Address is_loopback}@anchor{425a}
@deffn {Attribute} is_loopback

@code{True} if this is a loopback address.  See 
@geindex RFC; RFC 3330
RFC 3330@footnote{https://datatracker.ietf.org/doc/html/rfc3330.html} (for IPv4)
or 
@geindex RFC; RFC 2373
RFC 2373@footnote{https://datatracker.ietf.org/doc/html/rfc2373.html} (for IPv6).
@end deffn

@geindex is_link_local (ipaddress.IPv4Address attribute)
@anchor{library/ipaddress ipaddress IPv4Address is_link_local}@anchor{425b}
@deffn {Attribute} is_link_local

@code{True} if the address is reserved for link-local usage.  See
@geindex RFC; RFC 3927
RFC 3927@footnote{https://datatracker.ietf.org/doc/html/rfc3927.html}.
@end deffn

@geindex ipv6_mapped (ipaddress.IPv4Address attribute)
@anchor{library/ipaddress ipaddress IPv4Address ipv6_mapped}@anchor{50c}
@deffn {Attribute} ipv6_mapped

@code{IPv4Address} object representing the IPv4-mapped IPv6 address. See 
@geindex RFC; RFC 4291
RFC 4291@footnote{https://datatracker.ietf.org/doc/html/rfc4291.html}.


Added in version 3.13.

@end deffn
@end deffn

@geindex __format__() (ipaddress.IPv4Address method)
@anchor{library/ipaddress ipaddress IPv4Address __format__}@anchor{425c}
@deffn {Method} IPv4Address.__format__ (fmt)

Returns a string representation of the IP address, controlled by
an explicit format string.
`fmt' can be one of the following: @code{'s'}, the default option,
equivalent to @ref{16a,,str()}, @code{'b'} for a zero-padded binary string,
@code{'X'} or @code{'x'} for an uppercase or lowercase hexadecimal
representation, or @code{'n'}, which is equivalent to @code{'b'} for IPv4
addresses and @code{'x'} for IPv6. For binary and hexadecimal
representations, the form specifier @code{'#'} and the grouping option
@code{'_'} are available. @code{__format__} is used by @code{format}, @code{str.format}
and f-strings.

@example
>>> format(ipaddress.IPv4Address('192.168.0.1'))
'192.168.0.1'
>>> '@{:#b@}'.format(ipaddress.IPv4Address('192.168.0.1'))
'0b11000000101010000000000000000001'
>>> f'@{ipaddress.IPv6Address("2001:db8::1000"):s@}'
'2001:db8::1000'
>>> format(ipaddress.IPv6Address('2001:db8::1000'), '_X')
'2001_0DB8_0000_0000_0000_0000_0000_1000'
>>> '@{:#_n@}'.format(ipaddress.IPv6Address('2001:db8::1000'))
'0x2001_0db8_0000_0000_0000_0000_0000_1000'
@end example


Added in version 3.9.

@end deffn

@geindex IPv6Address (class in ipaddress)
@anchor{library/ipaddress ipaddress IPv6Address}@anchor{50e}
@deffn {Class} ipaddress.IPv6Address (address)

Construct an IPv6 address.  An @ref{424f,,AddressValueError} is raised if
`address' is not a valid IPv6 address.

The following constitutes a valid IPv6 address:


@enumerate 

@item 
A string consisting of eight groups of four hexadecimal digits, each
group representing 16 bits.  The groups are separated by colons.
This describes an `exploded' (longhand) notation.  The string can
also be `compressed' (shorthand notation) by various means.  See
@geindex RFC; RFC 4291
RFC 4291@footnote{https://datatracker.ietf.org/doc/html/rfc4291.html} for details.  For example,
@code{"0000:0000:0000:0000:0000:0abc:0007:0def"} can be compressed to
@code{"::abc:7:def"}.

Optionally, the string may also have a scope zone ID, expressed
with a suffix @code{%scope_id}. If present, the scope ID must be non-empty,
and may not contain @code{%}.
See 
@geindex RFC; RFC 4007
RFC 4007@footnote{https://datatracker.ietf.org/doc/html/rfc4007.html} for details.
For example, @code{fe80::1234%1} might identify address @code{fe80::1234} on the first link of the node.

@item 
An integer that fits into 128 bits.

@item 
An integer packed into a @ref{193,,bytes} object of length 16, big-endian.
@end enumerate

@example
>>> ipaddress.IPv6Address('2001:db8::1000')
IPv6Address('2001:db8::1000')
>>> ipaddress.IPv6Address('ff02::5678%1')
IPv6Address('ff02::5678%1')
@end example

@geindex compressed (ipaddress.IPv6Address attribute)
@anchor{library/ipaddress ipaddress IPv6Address compressed}@anchor{425d}
@deffn {Attribute} compressed
@end deffn

The short form of the address representation, with leading zeroes in
groups omitted and the longest sequence of groups consisting entirely of
zeroes collapsed to a single empty group.

This is also the value returned by @code{str(addr)} for IPv6 addresses.

@geindex exploded (ipaddress.IPv6Address attribute)
@anchor{library/ipaddress ipaddress IPv6Address exploded}@anchor{425e}
@deffn {Attribute} exploded
@end deffn

The long form of the address representation, with all leading zeroes and
groups consisting entirely of zeroes included.

For the following attributes and methods, see the corresponding
documentation of the @ref{50d,,IPv4Address} class:

@geindex packed (ipaddress.IPv6Address attribute)
@anchor{library/ipaddress ipaddress IPv6Address packed}@anchor{425f}
@deffn {Attribute} packed
@end deffn

@geindex reverse_pointer (ipaddress.IPv6Address attribute)
@anchor{library/ipaddress ipaddress IPv6Address reverse_pointer}@anchor{197e}
@deffn {Attribute} reverse_pointer
@end deffn

@geindex version (ipaddress.IPv6Address attribute)
@anchor{library/ipaddress ipaddress IPv6Address version}@anchor{4260}
@deffn {Attribute} version
@end deffn

@geindex max_prefixlen (ipaddress.IPv6Address attribute)
@anchor{library/ipaddress ipaddress IPv6Address max_prefixlen}@anchor{4261}
@deffn {Attribute} max_prefixlen
@end deffn

@geindex is_multicast (ipaddress.IPv6Address attribute)
@anchor{library/ipaddress ipaddress IPv6Address is_multicast}@anchor{4262}
@deffn {Attribute} is_multicast
@end deffn

@geindex is_private (ipaddress.IPv6Address attribute)
@anchor{library/ipaddress ipaddress IPv6Address is_private}@anchor{1a06}
@deffn {Attribute} is_private
@end deffn

@geindex is_global (ipaddress.IPv6Address attribute)
@anchor{library/ipaddress ipaddress IPv6Address is_global}@anchor{1a07}
@deffn {Attribute} is_global


Added in version 3.4.

@end deffn

@geindex is_unspecified (ipaddress.IPv6Address attribute)
@anchor{library/ipaddress ipaddress IPv6Address is_unspecified}@anchor{4263}
@deffn {Attribute} is_unspecified
@end deffn

@geindex is_reserved (ipaddress.IPv6Address attribute)
@anchor{library/ipaddress ipaddress IPv6Address is_reserved}@anchor{4264}
@deffn {Attribute} is_reserved
@end deffn

@geindex is_loopback (ipaddress.IPv6Address attribute)
@anchor{library/ipaddress ipaddress IPv6Address is_loopback}@anchor{19ec}
@deffn {Attribute} is_loopback
@end deffn

@geindex is_link_local (ipaddress.IPv6Address attribute)
@anchor{library/ipaddress ipaddress IPv6Address is_link_local}@anchor{4265}
@deffn {Attribute} is_link_local
@end deffn

@geindex is_site_local (ipaddress.IPv6Address attribute)
@anchor{library/ipaddress ipaddress IPv6Address is_site_local}@anchor{4259}
@deffn {Attribute} is_site_local

@code{True} if the address is reserved for site-local usage.  Note that
the site-local address space has been deprecated by 
@geindex RFC; RFC 3879
RFC 3879@footnote{https://datatracker.ietf.org/doc/html/rfc3879.html}. Use
@ref{1a05,,is_private} to test if this address is in the
space of unique local addresses as defined by 
@geindex RFC; RFC 4193
RFC 4193@footnote{https://datatracker.ietf.org/doc/html/rfc4193.html}.
@end deffn

@geindex ipv4_mapped (ipaddress.IPv6Address attribute)
@anchor{library/ipaddress ipaddress IPv6Address ipv4_mapped}@anchor{4256}
@deffn {Attribute} ipv4_mapped

For addresses that appear to be IPv4 mapped addresses in the range
@code{::FFFF:0:0/96} as defined by 
@geindex RFC; RFC 4291
RFC 4291@footnote{https://datatracker.ietf.org/doc/html/rfc4291.html}, this property reports the
embedded IPv4 address. For any other address, this property will be @code{None}.
@end deffn

@geindex scope_id (ipaddress.IPv6Address attribute)
@anchor{library/ipaddress ipaddress IPv6Address scope_id}@anchor{b10}
@deffn {Attribute} scope_id

For scoped addresses as defined by 
@geindex RFC; RFC 4007
RFC 4007@footnote{https://datatracker.ietf.org/doc/html/rfc4007.html}, this property identifies
the particular zone of the address’s scope that the address belongs to,
as a string. When no scope zone is specified, this property will be @code{None}.
@end deffn

@geindex sixtofour (ipaddress.IPv6Address attribute)
@anchor{library/ipaddress ipaddress IPv6Address sixtofour}@anchor{4266}
@deffn {Attribute} sixtofour

For addresses that appear to be 6to4 addresses  (starting with
@code{2002::/16}) as defined by 
@geindex RFC; RFC 3056
RFC 3056@footnote{https://datatracker.ietf.org/doc/html/rfc3056.html}, this property will report
the embedded IPv4 address.  For any other address, this property will
be @code{None}.
@end deffn

@geindex teredo (ipaddress.IPv6Address attribute)
@anchor{library/ipaddress ipaddress IPv6Address teredo}@anchor{4267}
@deffn {Attribute} teredo

For addresses that appear to be Teredo addresses (starting with
@code{2001::/32}) as defined by 
@geindex RFC; RFC 4380
RFC 4380@footnote{https://datatracker.ietf.org/doc/html/rfc4380.html}, this property will report
the embedded @code{(server, client)} IP address pair.  For any other
address, this property will be @code{None}.
@end deffn
@end deffn

@geindex __format__() (ipaddress.IPv6Address method)
@anchor{library/ipaddress ipaddress IPv6Address __format__}@anchor{4268}
@deffn {Method} IPv6Address.__format__ (fmt)

Refer to the corresponding method documentation in
@ref{50d,,IPv4Address}.


Added in version 3.9.

@end deffn

@node Conversion to Strings and Integers,Operators<2>,Address objects,IP Addresses
@anchor{library/ipaddress conversion-to-strings-and-integers}@anchor{4269}
@subsubsection Conversion to Strings and Integers


To interoperate with networking interfaces such as the socket module,
addresses must be converted to strings or integers. This is handled using
the @ref{16a,,str()} and @ref{19c,,int()} builtin functions:

@example
>>> str(ipaddress.IPv4Address('192.168.0.1'))
'192.168.0.1'
>>> int(ipaddress.IPv4Address('192.168.0.1'))
3232235521
>>> str(ipaddress.IPv6Address('::1'))
'::1'
>>> int(ipaddress.IPv6Address('::1'))
1
@end example

Note that IPv6 scoped addresses are converted to integers without scope zone ID.

@node Operators<2>,,Conversion to Strings and Integers,IP Addresses
@anchor{library/ipaddress operators}@anchor{426a}
@subsubsection Operators


Address objects support some operators.  Unless stated otherwise, operators can
only be applied between compatible objects (i.e. IPv4 with IPv4, IPv6 with
IPv6).

@menu
* Comparison operators:: 
* Arithmetic operators:: 

@end menu

@node Comparison operators,Arithmetic operators,,Operators<2>
@anchor{library/ipaddress comparison-operators}@anchor{426b}
@subsubsection Comparison operators


Address objects can be compared with the usual set of comparison operators.
Same IPv6 addresses with different scope zone IDs are not equal.
Some examples:

@example
>>> IPv4Address('127.0.0.2') > IPv4Address('127.0.0.1')
True
>>> IPv4Address('127.0.0.2') == IPv4Address('127.0.0.1')
False
>>> IPv4Address('127.0.0.2') != IPv4Address('127.0.0.1')
True
>>> IPv6Address('fe80::1234') == IPv6Address('fe80::1234%1')
False
>>> IPv6Address('fe80::1234%1') != IPv6Address('fe80::1234%2')
True
@end example

@node Arithmetic operators,,Comparison operators,Operators<2>
@anchor{library/ipaddress arithmetic-operators}@anchor{426c}
@subsubsection Arithmetic operators


Integers can be added to or subtracted from address objects.  Some examples:

@example
>>> IPv4Address('127.0.0.2') + 3
IPv4Address('127.0.0.5')
>>> IPv4Address('127.0.0.2') - 3
IPv4Address('126.255.255.255')
>>> IPv4Address('255.255.255.255') + 1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ipaddress.AddressValueError: 4294967296 (>= 2**32) is not permitted as an IPv4 address
@end example

@node IP Network definitions,Interface objects,IP Addresses,ipaddress — IPv4/IPv6 manipulation library
@anchor{library/ipaddress ip-network-definitions}@anchor{426d}
@subsubsection IP Network definitions


The @ref{50f,,IPv4Network} and @ref{510,,IPv6Network} objects provide a mechanism
for defining and inspecting IP network definitions.  A network definition
consists of a `mask' and a `network address', and as such defines a range of
IP addresses that equal the network address when masked (binary AND) with the
mask.  For example, a network definition with the mask @code{255.255.255.0} and
the network address @code{192.168.1.0} consists of IP addresses in the inclusive
range @code{192.168.1.0} to @code{192.168.1.255}.

@menu
* Prefix@comma{} net mask and host mask: Prefix net mask and host mask. 
* Network objects:: 
* Operators: Operators<3>. 

@end menu

@node Prefix net mask and host mask,Network objects,,IP Network definitions
@anchor{library/ipaddress prefix-net-mask-and-host-mask}@anchor{426e}
@subsubsection Prefix, net mask and host mask


There are several equivalent ways to specify IP network masks.  A `prefix'
@code{/<nbits>} is a notation that denotes how many high-order bits are set in
the network mask.  A `net mask' is an IP address with some number of
high-order bits set.  Thus the prefix @code{/24} is equivalent to the net mask
@code{255.255.255.0} in IPv4, or @code{ffff:ff00::} in IPv6.  In addition, a
`host mask' is the logical inverse of a `net mask', and is sometimes used
(for example in Cisco access control lists) to denote a network mask.  The
host mask equivalent to @code{/24} in IPv4 is @code{0.0.0.255}.

@node Network objects,Operators<3>,Prefix net mask and host mask,IP Network definitions
@anchor{library/ipaddress network-objects}@anchor{426f}
@subsubsection Network objects


All attributes implemented by address objects are implemented by network
objects as well.  In addition, network objects implement additional attributes.
All of these are common between @ref{50f,,IPv4Network} and @ref{510,,IPv6Network},
so to avoid duplication they are only documented for @code{IPv4Network}.
Network objects are @ref{825,,hashable}, so they can be used as keys in
dictionaries.

@geindex IPv4Network (class in ipaddress)
@anchor{library/ipaddress ipaddress IPv4Network}@anchor{50f}
@deffn {Class} ipaddress.IPv4Network (address, strict=True)

Construct an IPv4 network definition.  `address' can be one of the following:


@enumerate 

@item 
A string consisting of an IP address and an optional mask, separated by
a slash (@code{/}).  The IP address is the network address, and the mask
can be either a single number, which means it’s a `prefix', or a string
representation of an IPv4 address.  If it’s the latter, the mask is
interpreted as a `net mask' if it starts with a non-zero field, or as a
`host mask' if it starts with a zero field, with the single exception of
an all-zero mask which is treated as a `net mask'.  If no mask is provided,
it’s considered to be @code{/32}.

For example, the following `address' specifications are equivalent:
@code{192.168.1.0/24}, @code{192.168.1.0/255.255.255.0} and
@code{192.168.1.0/0.0.0.255}.

@item 
An integer that fits into 32 bits.  This is equivalent to a
single-address network, with the network address being `address' and
the mask being @code{/32}.

@item 
An integer packed into a @ref{193,,bytes} object of length 4, big-endian.
The interpretation is similar to an integer `address'.

@item 
A two-tuple of an address description and a netmask, where the address
description is either a string, a 32-bits integer, a 4-bytes packed
integer, or an existing @ref{50d,,IPv4Address} object; and the netmask is either
an integer representing the prefix length (e.g. @code{24}) or a string
representing the prefix mask (e.g. @code{255.255.255.0}).
@end enumerate

An @ref{424f,,AddressValueError} is raised if `address' is not a valid IPv4
address.  A @ref{4270,,NetmaskValueError} is raised if the mask is not valid for
an IPv4 address.

If `strict' is @code{True} and host bits are set in the supplied address,
then @ref{2ee,,ValueError} is raised.  Otherwise, the host bits are masked out
to determine the appropriate network address.

Unless stated otherwise, all network methods accepting other network/address
objects will raise @ref{199,,TypeError} if the argument’s IP version is
incompatible to @code{self}.


Changed in version 3.5: Added the two-tuple form for the `address' constructor parameter.


@geindex version (ipaddress.IPv4Network attribute)
@anchor{library/ipaddress ipaddress IPv4Network version}@anchor{4271}
@deffn {Attribute} version
@end deffn

@geindex max_prefixlen (ipaddress.IPv4Network attribute)
@anchor{library/ipaddress ipaddress IPv4Network max_prefixlen}@anchor{4272}
@deffn {Attribute} max_prefixlen

Refer to the corresponding attribute documentation in
@ref{50d,,IPv4Address}.
@end deffn

@geindex is_multicast (ipaddress.IPv4Network attribute)
@anchor{library/ipaddress ipaddress IPv4Network is_multicast}@anchor{4273}
@deffn {Attribute} is_multicast
@end deffn

@geindex is_private (ipaddress.IPv4Network attribute)
@anchor{library/ipaddress ipaddress IPv4Network is_private}@anchor{4274}
@deffn {Attribute} is_private
@end deffn

@geindex is_unspecified (ipaddress.IPv4Network attribute)
@anchor{library/ipaddress ipaddress IPv4Network is_unspecified}@anchor{4275}
@deffn {Attribute} is_unspecified
@end deffn

@geindex is_reserved (ipaddress.IPv4Network attribute)
@anchor{library/ipaddress ipaddress IPv4Network is_reserved}@anchor{4276}
@deffn {Attribute} is_reserved
@end deffn

@geindex is_loopback (ipaddress.IPv4Network attribute)
@anchor{library/ipaddress ipaddress IPv4Network is_loopback}@anchor{4277}
@deffn {Attribute} is_loopback
@end deffn

@geindex is_link_local (ipaddress.IPv4Network attribute)
@anchor{library/ipaddress ipaddress IPv4Network is_link_local}@anchor{4278}
@deffn {Attribute} is_link_local

These attributes are true for the network as a whole if they are true
for both the network address and the broadcast address.
@end deffn

@geindex network_address (ipaddress.IPv4Network attribute)
@anchor{library/ipaddress ipaddress IPv4Network network_address}@anchor{4279}
@deffn {Attribute} network_address

The network address for the network. The network address and the
prefix length together uniquely define a network.
@end deffn

@geindex broadcast_address (ipaddress.IPv4Network attribute)
@anchor{library/ipaddress ipaddress IPv4Network broadcast_address}@anchor{427a}
@deffn {Attribute} broadcast_address

The broadcast address for the network. Packets sent to the broadcast
address should be received by every host on the network.
@end deffn

@geindex hostmask (ipaddress.IPv4Network attribute)
@anchor{library/ipaddress ipaddress IPv4Network hostmask}@anchor{427b}
@deffn {Attribute} hostmask

The host mask, as an @ref{50d,,IPv4Address} object.
@end deffn

@geindex netmask (ipaddress.IPv4Network attribute)
@anchor{library/ipaddress ipaddress IPv4Network netmask}@anchor{427c}
@deffn {Attribute} netmask

The net mask, as an @ref{50d,,IPv4Address} object.
@end deffn

@geindex with_prefixlen (ipaddress.IPv4Network attribute)
@anchor{library/ipaddress ipaddress IPv4Network with_prefixlen}@anchor{427d}
@deffn {Attribute} with_prefixlen
@end deffn

@geindex compressed (ipaddress.IPv4Network attribute)
@anchor{library/ipaddress ipaddress IPv4Network compressed}@anchor{427e}
@deffn {Attribute} compressed
@end deffn

@geindex exploded (ipaddress.IPv4Network attribute)
@anchor{library/ipaddress ipaddress IPv4Network exploded}@anchor{427f}
@deffn {Attribute} exploded

A string representation of the network, with the mask in prefix
notation.

@code{with_prefixlen} and @code{compressed} are always the same as
@code{str(network)}.
@code{exploded} uses the exploded form the network address.
@end deffn

@geindex with_netmask (ipaddress.IPv4Network attribute)
@anchor{library/ipaddress ipaddress IPv4Network with_netmask}@anchor{4280}
@deffn {Attribute} with_netmask

A string representation of the network, with the mask in net mask
notation.
@end deffn

@geindex with_hostmask (ipaddress.IPv4Network attribute)
@anchor{library/ipaddress ipaddress IPv4Network with_hostmask}@anchor{4281}
@deffn {Attribute} with_hostmask

A string representation of the network, with the mask in host mask
notation.
@end deffn

@geindex num_addresses (ipaddress.IPv4Network attribute)
@anchor{library/ipaddress ipaddress IPv4Network num_addresses}@anchor{4282}
@deffn {Attribute} num_addresses

The total number of addresses in the network.
@end deffn

@geindex prefixlen (ipaddress.IPv4Network attribute)
@anchor{library/ipaddress ipaddress IPv4Network prefixlen}@anchor{4283}
@deffn {Attribute} prefixlen

Length of the network prefix, in bits.
@end deffn

@geindex hosts() (ipaddress.IPv4Network method)
@anchor{library/ipaddress ipaddress IPv4Network hosts}@anchor{17ff}
@deffn {Method} hosts ()

Returns an iterator over the usable hosts in the network.  The usable
hosts are all the IP addresses that belong to the network, except the
network address itself and the network broadcast address.  For networks
with a mask length of 31, the network address and network broadcast
address are also included in the result. Networks with a mask of 32
will return a list containing the single host address.

@example
>>> list(ip_network('192.0.2.0/29').hosts())
[IPv4Address('192.0.2.1'), IPv4Address('192.0.2.2'),
 IPv4Address('192.0.2.3'), IPv4Address('192.0.2.4'),
 IPv4Address('192.0.2.5'), IPv4Address('192.0.2.6')]
>>> list(ip_network('192.0.2.0/31').hosts())
[IPv4Address('192.0.2.0'), IPv4Address('192.0.2.1')]
>>> list(ip_network('192.0.2.1/32').hosts())
[IPv4Address('192.0.2.1')]
@end example
@end deffn

@geindex overlaps() (ipaddress.IPv4Network method)
@anchor{library/ipaddress ipaddress IPv4Network overlaps}@anchor{4284}
@deffn {Method} overlaps (other)

@code{True} if this network is partly or wholly contained in `other' or
`other' is wholly contained in this network.
@end deffn

@geindex address_exclude() (ipaddress.IPv4Network method)
@anchor{library/ipaddress ipaddress IPv4Network address_exclude}@anchor{4285}
@deffn {Method} address_exclude (network)

Computes the network definitions resulting from removing the given
`network' from this one.  Returns an iterator of network objects.
Raises @ref{2ee,,ValueError} if `network' is not completely contained in
this network.

@example
>>> n1 = ip_network('192.0.2.0/28')
>>> n2 = ip_network('192.0.2.1/32')
>>> list(n1.address_exclude(n2))
[IPv4Network('192.0.2.8/29'), IPv4Network('192.0.2.4/30'),
 IPv4Network('192.0.2.2/31'), IPv4Network('192.0.2.0/32')]
@end example
@end deffn

@geindex subnets() (ipaddress.IPv4Network method)
@anchor{library/ipaddress ipaddress IPv4Network subnets}@anchor{10a6}
@deffn {Method} subnets (prefixlen_diff=1, new_prefix=None)

The subnets that join to make the current network definition, depending
on the argument values.  `prefixlen_diff' is the amount our prefix
length should be increased by.  `new_prefix' is the desired new
prefix of the subnets; it must be larger than our prefix.  One and
only one of `prefixlen_diff' and `new_prefix' must be set.  Returns an
iterator of network objects.

@example
>>> list(ip_network('192.0.2.0/24').subnets())
[IPv4Network('192.0.2.0/25'), IPv4Network('192.0.2.128/25')]
>>> list(ip_network('192.0.2.0/24').subnets(prefixlen_diff=2))
[IPv4Network('192.0.2.0/26'), IPv4Network('192.0.2.64/26'),
 IPv4Network('192.0.2.128/26'), IPv4Network('192.0.2.192/26')]
>>> list(ip_network('192.0.2.0/24').subnets(new_prefix=26))
[IPv4Network('192.0.2.0/26'), IPv4Network('192.0.2.64/26'),
 IPv4Network('192.0.2.128/26'), IPv4Network('192.0.2.192/26')]
>>> list(ip_network('192.0.2.0/24').subnets(new_prefix=23))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
    raise ValueError('new prefix must be longer')
ValueError: new prefix must be longer
>>> list(ip_network('192.0.2.0/24').subnets(new_prefix=25))
[IPv4Network('192.0.2.0/25'), IPv4Network('192.0.2.128/25')]
@end example
@end deffn

@geindex supernet() (ipaddress.IPv4Network method)
@anchor{library/ipaddress ipaddress IPv4Network supernet}@anchor{10a7}
@deffn {Method} supernet (prefixlen_diff=1, new_prefix=None)

The supernet containing this network definition, depending on the
argument values.  `prefixlen_diff' is the amount our prefix length
should be decreased by.  `new_prefix' is the desired new prefix of
the supernet; it must be smaller than our prefix.  One and only one
of `prefixlen_diff' and `new_prefix' must be set.  Returns a single
network object.

@example
>>> ip_network('192.0.2.0/24').supernet()
IPv4Network('192.0.2.0/23')
>>> ip_network('192.0.2.0/24').supernet(prefixlen_diff=2)
IPv4Network('192.0.0.0/22')
>>> ip_network('192.0.2.0/24').supernet(new_prefix=20)
IPv4Network('192.0.0.0/20')
@end example
@end deffn

@geindex subnet_of() (ipaddress.IPv4Network method)
@anchor{library/ipaddress ipaddress IPv4Network subnet_of}@anchor{4286}
@deffn {Method} subnet_of (other)

Return @code{True} if this network is a subnet of `other'.

@example
>>> a = ip_network('192.168.1.0/24')
>>> b = ip_network('192.168.1.128/30')
>>> b.subnet_of(a)
True
@end example


Added in version 3.7.

@end deffn

@geindex supernet_of() (ipaddress.IPv4Network method)
@anchor{library/ipaddress ipaddress IPv4Network supernet_of}@anchor{4287}
@deffn {Method} supernet_of (other)

Return @code{True} if this network is a supernet of `other'.

@example
>>> a = ip_network('192.168.1.0/24')
>>> b = ip_network('192.168.1.128/30')
>>> a.supernet_of(b)
True
@end example


Added in version 3.7.

@end deffn

@geindex compare_networks() (ipaddress.IPv4Network method)
@anchor{library/ipaddress ipaddress IPv4Network compare_networks}@anchor{4288}
@deffn {Method} compare_networks (other)

Compare this network to `other'.  In this comparison only the network
addresses are considered; host bits aren’t.  Returns either @code{-1},
@code{0} or @code{1}.

@example
>>> ip_network('192.0.2.1/32').compare_networks(ip_network('192.0.2.2/32'))
-1
>>> ip_network('192.0.2.1/32').compare_networks(ip_network('192.0.2.0/32'))
1
>>> ip_network('192.0.2.1/32').compare_networks(ip_network('192.0.2.1/32'))
0
@end example


Deprecated since version 3.7: It uses the same ordering and comparison algorithm as “<”, “==”, and “>”

@end deffn
@end deffn

@geindex IPv6Network (class in ipaddress)
@anchor{library/ipaddress ipaddress IPv6Network}@anchor{510}
@deffn {Class} ipaddress.IPv6Network (address, strict=True)

Construct an IPv6 network definition.  `address' can be one of the following:


@enumerate 

@item 
A string consisting of an IP address and an optional prefix length,
separated by a slash (@code{/}).  The IP address is the network address,
and the prefix length must be a single number, the `prefix'.  If no
prefix length is provided, it’s considered to be @code{/128}.

Note that currently expanded netmasks are not supported.  That means
@code{2001:db00::0/24} is a valid argument while @code{2001:db00::0/ffff:ff00::}
is not.

@item 
An integer that fits into 128 bits.  This is equivalent to a
single-address network, with the network address being `address' and
the mask being @code{/128}.

@item 
An integer packed into a @ref{193,,bytes} object of length 16, big-endian.
The interpretation is similar to an integer `address'.

@item 
A two-tuple of an address description and a netmask, where the address
description is either a string, a 128-bits integer, a 16-bytes packed
integer, or an existing @ref{50e,,IPv6Address} object; and the netmask is an
integer representing the prefix length.
@end enumerate

An @ref{424f,,AddressValueError} is raised if `address' is not a valid IPv6
address.  A @ref{4270,,NetmaskValueError} is raised if the mask is not valid for
an IPv6 address.

If `strict' is @code{True} and host bits are set in the supplied address,
then @ref{2ee,,ValueError} is raised.  Otherwise, the host bits are masked out
to determine the appropriate network address.


Changed in version 3.5: Added the two-tuple form for the `address' constructor parameter.


@geindex version (ipaddress.IPv6Network attribute)
@anchor{library/ipaddress ipaddress IPv6Network version}@anchor{4289}
@deffn {Attribute} version
@end deffn

@geindex max_prefixlen (ipaddress.IPv6Network attribute)
@anchor{library/ipaddress ipaddress IPv6Network max_prefixlen}@anchor{428a}
@deffn {Attribute} max_prefixlen
@end deffn

@geindex is_multicast (ipaddress.IPv6Network attribute)
@anchor{library/ipaddress ipaddress IPv6Network is_multicast}@anchor{428b}
@deffn {Attribute} is_multicast
@end deffn

@geindex is_private (ipaddress.IPv6Network attribute)
@anchor{library/ipaddress ipaddress IPv6Network is_private}@anchor{428c}
@deffn {Attribute} is_private
@end deffn

@geindex is_unspecified (ipaddress.IPv6Network attribute)
@anchor{library/ipaddress ipaddress IPv6Network is_unspecified}@anchor{428d}
@deffn {Attribute} is_unspecified
@end deffn

@geindex is_reserved (ipaddress.IPv6Network attribute)
@anchor{library/ipaddress ipaddress IPv6Network is_reserved}@anchor{428e}
@deffn {Attribute} is_reserved
@end deffn

@geindex is_loopback (ipaddress.IPv6Network attribute)
@anchor{library/ipaddress ipaddress IPv6Network is_loopback}@anchor{428f}
@deffn {Attribute} is_loopback
@end deffn

@geindex is_link_local (ipaddress.IPv6Network attribute)
@anchor{library/ipaddress ipaddress IPv6Network is_link_local}@anchor{4290}
@deffn {Attribute} is_link_local
@end deffn

@geindex network_address (ipaddress.IPv6Network attribute)
@anchor{library/ipaddress ipaddress IPv6Network network_address}@anchor{4291}
@deffn {Attribute} network_address
@end deffn

@geindex broadcast_address (ipaddress.IPv6Network attribute)
@anchor{library/ipaddress ipaddress IPv6Network broadcast_address}@anchor{4292}
@deffn {Attribute} broadcast_address
@end deffn

@geindex hostmask (ipaddress.IPv6Network attribute)
@anchor{library/ipaddress ipaddress IPv6Network hostmask}@anchor{4293}
@deffn {Attribute} hostmask
@end deffn

@geindex netmask (ipaddress.IPv6Network attribute)
@anchor{library/ipaddress ipaddress IPv6Network netmask}@anchor{4294}
@deffn {Attribute} netmask
@end deffn

@geindex with_prefixlen (ipaddress.IPv6Network attribute)
@anchor{library/ipaddress ipaddress IPv6Network with_prefixlen}@anchor{4295}
@deffn {Attribute} with_prefixlen
@end deffn

@geindex compressed (ipaddress.IPv6Network attribute)
@anchor{library/ipaddress ipaddress IPv6Network compressed}@anchor{4296}
@deffn {Attribute} compressed
@end deffn

@geindex exploded (ipaddress.IPv6Network attribute)
@anchor{library/ipaddress ipaddress IPv6Network exploded}@anchor{4297}
@deffn {Attribute} exploded
@end deffn

@geindex with_netmask (ipaddress.IPv6Network attribute)
@anchor{library/ipaddress ipaddress IPv6Network with_netmask}@anchor{4298}
@deffn {Attribute} with_netmask
@end deffn

@geindex with_hostmask (ipaddress.IPv6Network attribute)
@anchor{library/ipaddress ipaddress IPv6Network with_hostmask}@anchor{4299}
@deffn {Attribute} with_hostmask
@end deffn

@geindex num_addresses (ipaddress.IPv6Network attribute)
@anchor{library/ipaddress ipaddress IPv6Network num_addresses}@anchor{429a}
@deffn {Attribute} num_addresses
@end deffn

@geindex prefixlen (ipaddress.IPv6Network attribute)
@anchor{library/ipaddress ipaddress IPv6Network prefixlen}@anchor{429b}
@deffn {Attribute} prefixlen
@end deffn

@geindex hosts() (ipaddress.IPv6Network method)
@anchor{library/ipaddress ipaddress IPv6Network hosts}@anchor{1800}
@deffn {Method} hosts ()

Returns an iterator over the usable hosts in the network.  The usable
hosts are all the IP addresses that belong to the network, except the
Subnet-Router anycast address.  For networks with a mask length of 127,
the Subnet-Router anycast address is also included in the result.
Networks with a mask of 128 will return a list containing the
single host address.
@end deffn

@geindex overlaps() (ipaddress.IPv6Network method)
@anchor{library/ipaddress ipaddress IPv6Network overlaps}@anchor{429c}
@deffn {Method} overlaps (other)
@end deffn

@geindex address_exclude() (ipaddress.IPv6Network method)
@anchor{library/ipaddress ipaddress IPv6Network address_exclude}@anchor{429d}
@deffn {Method} address_exclude (network)
@end deffn

@geindex subnets() (ipaddress.IPv6Network method)
@anchor{library/ipaddress ipaddress IPv6Network subnets}@anchor{429e}
@deffn {Method} subnets (prefixlen_diff=1, new_prefix=None)
@end deffn

@geindex supernet() (ipaddress.IPv6Network method)
@anchor{library/ipaddress ipaddress IPv6Network supernet}@anchor{429f}
@deffn {Method} supernet (prefixlen_diff=1, new_prefix=None)
@end deffn

@geindex subnet_of() (ipaddress.IPv6Network method)
@anchor{library/ipaddress ipaddress IPv6Network subnet_of}@anchor{42a0}
@deffn {Method} subnet_of (other)
@end deffn

@geindex supernet_of() (ipaddress.IPv6Network method)
@anchor{library/ipaddress ipaddress IPv6Network supernet_of}@anchor{42a1}
@deffn {Method} supernet_of (other)
@end deffn

@geindex compare_networks() (ipaddress.IPv6Network method)
@anchor{library/ipaddress ipaddress IPv6Network compare_networks}@anchor{42a2}
@deffn {Method} compare_networks (other)

Refer to the corresponding attribute documentation in
@ref{50f,,IPv4Network}.
@end deffn

@geindex is_site_local (ipaddress.IPv6Network attribute)
@anchor{library/ipaddress ipaddress IPv6Network is_site_local}@anchor{42a3}
@deffn {Attribute} is_site_local

This attribute is true for the network as a whole if it is true
for both the network address and the broadcast address.
@end deffn
@end deffn

@node Operators<3>,,Network objects,IP Network definitions
@anchor{library/ipaddress id1}@anchor{42a4}
@subsubsection Operators


Network objects support some operators.  Unless stated otherwise, operators can
only be applied between compatible objects (i.e. IPv4 with IPv4, IPv6 with
IPv6).

@menu
* Logical operators:: 
* Iteration:: 
* Networks as containers of addresses:: 

@end menu

@node Logical operators,Iteration,,Operators<3>
@anchor{library/ipaddress logical-operators}@anchor{42a5}
@subsubsection Logical operators


Network objects can be compared with the usual set of logical operators.
Network objects are ordered first by network address, then by net mask.

@node Iteration,Networks as containers of addresses,Logical operators,Operators<3>
@anchor{library/ipaddress iteration}@anchor{42a6}
@subsubsection Iteration


Network objects can be iterated to list all the addresses belonging to the
network.  For iteration, `all' hosts are returned, including unusable hosts
(for usable hosts, use the @ref{17ff,,hosts()} method).  An
example:

@example
>>> for addr in IPv4Network('192.0.2.0/28'):
...     addr
...
IPv4Address('192.0.2.0')
IPv4Address('192.0.2.1')
IPv4Address('192.0.2.2')
IPv4Address('192.0.2.3')
IPv4Address('192.0.2.4')
IPv4Address('192.0.2.5')
IPv4Address('192.0.2.6')
IPv4Address('192.0.2.7')
IPv4Address('192.0.2.8')
IPv4Address('192.0.2.9')
IPv4Address('192.0.2.10')
IPv4Address('192.0.2.11')
IPv4Address('192.0.2.12')
IPv4Address('192.0.2.13')
IPv4Address('192.0.2.14')
IPv4Address('192.0.2.15')
@end example

@node Networks as containers of addresses,,Iteration,Operators<3>
@anchor{library/ipaddress networks-as-containers-of-addresses}@anchor{42a7}
@subsubsection Networks as containers of addresses


Network objects can act as containers of addresses.  Some examples:

@example
>>> IPv4Network('192.0.2.0/28')[0]
IPv4Address('192.0.2.0')
>>> IPv4Network('192.0.2.0/28')[15]
IPv4Address('192.0.2.15')
>>> IPv4Address('192.0.2.6') in IPv4Network('192.0.2.0/28')
True
>>> IPv4Address('192.0.3.6') in IPv4Network('192.0.2.0/28')
False
@end example

@node Interface objects,Other Module Level Functions,IP Network definitions,ipaddress — IPv4/IPv6 manipulation library
@anchor{library/ipaddress interface-objects}@anchor{42a8}
@subsubsection Interface objects


Interface objects are @ref{825,,hashable}, so they can be used as keys in
dictionaries.

@geindex IPv4Interface (class in ipaddress)
@anchor{library/ipaddress ipaddress IPv4Interface}@anchor{1bdc}
@deffn {Class} ipaddress.IPv4Interface (address)

Construct an IPv4 interface.  The meaning of `address' is as in the
constructor of @ref{50f,,IPv4Network}, except that arbitrary host addresses
are always accepted.

@code{IPv4Interface} is a subclass of @ref{50d,,IPv4Address}, so it inherits
all the attributes from that class.  In addition, the following attributes
are available:

@geindex ip (ipaddress.IPv4Interface attribute)
@anchor{library/ipaddress ipaddress IPv4Interface ip}@anchor{42a9}
@deffn {Attribute} ip

The address (@ref{50d,,IPv4Address}) without network information.

@example
>>> interface = IPv4Interface('192.0.2.5/24')
>>> interface.ip
IPv4Address('192.0.2.5')
@end example
@end deffn

@geindex network (ipaddress.IPv4Interface attribute)
@anchor{library/ipaddress ipaddress IPv4Interface network}@anchor{42aa}
@deffn {Attribute} network

The network (@ref{50f,,IPv4Network}) this interface belongs to.

@example
>>> interface = IPv4Interface('192.0.2.5/24')
>>> interface.network
IPv4Network('192.0.2.0/24')
@end example
@end deffn

@geindex with_prefixlen (ipaddress.IPv4Interface attribute)
@anchor{library/ipaddress ipaddress IPv4Interface with_prefixlen}@anchor{42ab}
@deffn {Attribute} with_prefixlen

A string representation of the interface with the mask in prefix notation.

@example
>>> interface = IPv4Interface('192.0.2.5/24')
>>> interface.with_prefixlen
'192.0.2.5/24'
@end example
@end deffn

@geindex with_netmask (ipaddress.IPv4Interface attribute)
@anchor{library/ipaddress ipaddress IPv4Interface with_netmask}@anchor{42ac}
@deffn {Attribute} with_netmask

A string representation of the interface with the network as a net mask.

@example
>>> interface = IPv4Interface('192.0.2.5/24')
>>> interface.with_netmask
'192.0.2.5/255.255.255.0'
@end example
@end deffn

@geindex with_hostmask (ipaddress.IPv4Interface attribute)
@anchor{library/ipaddress ipaddress IPv4Interface with_hostmask}@anchor{42ad}
@deffn {Attribute} with_hostmask

A string representation of the interface with the network as a host mask.

@example
>>> interface = IPv4Interface('192.0.2.5/24')
>>> interface.with_hostmask
'192.0.2.5/0.0.0.255'
@end example
@end deffn
@end deffn

@geindex IPv6Interface (class in ipaddress)
@anchor{library/ipaddress ipaddress IPv6Interface}@anchor{1bdd}
@deffn {Class} ipaddress.IPv6Interface (address)

Construct an IPv6 interface.  The meaning of `address' is as in the
constructor of @ref{510,,IPv6Network}, except that arbitrary host addresses
are always accepted.

@code{IPv6Interface} is a subclass of @ref{50e,,IPv6Address}, so it inherits
all the attributes from that class.  In addition, the following attributes
are available:

@geindex ip (ipaddress.IPv6Interface attribute)
@anchor{library/ipaddress ipaddress IPv6Interface ip}@anchor{42ae}
@deffn {Attribute} ip
@end deffn

@geindex network (ipaddress.IPv6Interface attribute)
@anchor{library/ipaddress ipaddress IPv6Interface network}@anchor{42af}
@deffn {Attribute} network
@end deffn

@geindex with_prefixlen (ipaddress.IPv6Interface attribute)
@anchor{library/ipaddress ipaddress IPv6Interface with_prefixlen}@anchor{42b0}
@deffn {Attribute} with_prefixlen
@end deffn

@geindex with_netmask (ipaddress.IPv6Interface attribute)
@anchor{library/ipaddress ipaddress IPv6Interface with_netmask}@anchor{42b1}
@deffn {Attribute} with_netmask
@end deffn

@geindex with_hostmask (ipaddress.IPv6Interface attribute)
@anchor{library/ipaddress ipaddress IPv6Interface with_hostmask}@anchor{42b2}
@deffn {Attribute} with_hostmask

Refer to the corresponding attribute documentation in
@ref{1bdc,,IPv4Interface}.
@end deffn
@end deffn

@menu
* Operators: Operators<4>. 

@end menu

@node Operators<4>,,,Interface objects
@anchor{library/ipaddress id2}@anchor{42b3}
@subsubsection Operators


Interface objects support some operators.  Unless stated otherwise, operators
can only be applied between compatible objects (i.e. IPv4 with IPv4, IPv6 with
IPv6).

@menu
* Logical operators: Logical operators<2>. 

@end menu

@node Logical operators<2>,,,Operators<4>
@anchor{library/ipaddress id3}@anchor{42b4}
@subsubsection Logical operators


Interface objects can be compared with the usual set of logical operators.

For equality comparison (@code{==} and @code{!=}), both the IP address and network
must be the same for the objects to be equal.  An interface will not compare
equal to any address or network object.

For ordering (@code{<}, @code{>}, etc) the rules are different.  Interface and
address objects with the same IP version can be compared, and the address
objects will always sort before the interface objects.  Two interface objects
are first compared by their networks and, if those are the same, then by their
IP addresses.

@node Other Module Level Functions,Custom Exceptions,Interface objects,ipaddress — IPv4/IPv6 manipulation library
@anchor{library/ipaddress other-module-level-functions}@anchor{42b5}
@subsubsection Other Module Level Functions


The module also provides the following module level functions:

@geindex v4_int_to_packed() (in module ipaddress)
@anchor{library/ipaddress ipaddress v4_int_to_packed}@anchor{42b6}
@deffn {Function} ipaddress.v4_int_to_packed (address)

Represent an address as 4 packed bytes in network (big-endian) order.
`address' is an integer representation of an IPv4 IP address.  A
@ref{2ee,,ValueError} is raised if the integer is negative or too large to be an
IPv4 IP address.

@example
>>> ipaddress.ip_address(3221225985)
IPv4Address('192.0.2.1')
>>> ipaddress.v4_int_to_packed(3221225985)
b'\xc0\x00\x02\x01'
@end example
@end deffn

@geindex v6_int_to_packed() (in module ipaddress)
@anchor{library/ipaddress ipaddress v6_int_to_packed}@anchor{42b7}
@deffn {Function} ipaddress.v6_int_to_packed (address)

Represent an address as 16 packed bytes in network (big-endian) order.
`address' is an integer representation of an IPv6 IP address.  A
@ref{2ee,,ValueError} is raised if the integer is negative or too large to be an
IPv6 IP address.
@end deffn

@geindex summarize_address_range() (in module ipaddress)
@anchor{library/ipaddress ipaddress summarize_address_range}@anchor{10a8}
@deffn {Function} ipaddress.summarize_address_range (first, last)

Return an iterator of the summarized network range given the first and last
IP addresses.  `first' is the first @ref{50d,,IPv4Address} or
@ref{50e,,IPv6Address} in the range and `last' is the last @code{IPv4Address}
or @code{IPv6Address} in the range.  A @ref{199,,TypeError} is raised if
`first' or `last' are not IP addresses or are not of the same version.  A
@ref{2ee,,ValueError} is raised if `last' is not greater than `first' or if
`first' address version is not 4 or 6.

@example
>>> [ipaddr for ipaddr in ipaddress.summarize_address_range(
...    ipaddress.IPv4Address('192.0.2.0'),
...    ipaddress.IPv4Address('192.0.2.130'))]
[IPv4Network('192.0.2.0/25'), IPv4Network('192.0.2.128/31'), IPv4Network('192.0.2.130/32')]
@end example
@end deffn

@geindex collapse_addresses() (in module ipaddress)
@anchor{library/ipaddress ipaddress collapse_addresses}@anchor{10a9}
@deffn {Function} ipaddress.collapse_addresses (addresses)

Return an iterator of the collapsed @ref{50f,,IPv4Network} or
@ref{510,,IPv6Network} objects.  `addresses' is an @ref{1433,,iterable} of
@code{IPv4Network} or @code{IPv6Network} objects.  A @ref{199,,TypeError} is
raised if `addresses' contains mixed version objects.

@example
>>> [ipaddr for ipaddr in
... ipaddress.collapse_addresses([ipaddress.IPv4Network('192.0.2.0/25'),
... ipaddress.IPv4Network('192.0.2.128/25')])]
[IPv4Network('192.0.2.0/24')]
@end example
@end deffn

@geindex get_mixed_type_key() (in module ipaddress)
@anchor{library/ipaddress ipaddress get_mixed_type_key}@anchor{42b8}
@deffn {Function} ipaddress.get_mixed_type_key (obj)

Return a key suitable for sorting between networks and addresses.  Address
and Network objects are not sortable by default; they’re fundamentally
different, so the expression:

@example
IPv4Address('192.0.2.0') <= IPv4Network('192.0.2.0/24')
@end example

doesn’t make sense.  There are some times however, where you may wish to
have @code{ipaddress} sort these anyway.  If you need to do this, you can use
this function as the `key' argument to @ref{dcd,,sorted()}.

`obj' is either a network or address object.
@end deffn

@node Custom Exceptions,,Other Module Level Functions,ipaddress — IPv4/IPv6 manipulation library
@anchor{library/ipaddress custom-exceptions}@anchor{42b9}
@subsubsection Custom Exceptions


To support more specific error reporting from class constructors, the
module defines the following exceptions:

@geindex AddressValueError
@anchor{library/ipaddress ipaddress AddressValueError}@anchor{424f}
@deffn {Exception} ipaddress.AddressValueError (ValueError)

Any value error related to the address.
@end deffn

@geindex NetmaskValueError
@anchor{library/ipaddress ipaddress NetmaskValueError}@anchor{4270}
@deffn {Exception} ipaddress.NetmaskValueError (ValueError)

Any value error related to the net mask.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Multimedia Services,Internationalization,Internet Protocols and Support,The Python Standard Library
@anchor{library/mm doc}@anchor{42ba}@anchor{library/mm mmedia}@anchor{42bb}@anchor{library/mm multimedia-services}@anchor{42bc}@anchor{library/mm translation-repo}@anchor{42bd}
@section Multimedia Services


The modules described in this chapter implement various algorithms or interfaces
that are mainly useful for multimedia applications.  They are available at the
discretion of the installation.  Here’s an overview:

@menu
* wave — Read and write WAV files:: 
* colorsys — Conversions between color systems:: 

@end menu

@node wave — Read and write WAV files,colorsys — Conversions between color systems,,Multimedia Services
@anchor{library/wave doc}@anchor{42be}@anchor{library/wave module-wave}@anchor{11a}@anchor{library/wave wave-read-and-write-wav-files}@anchor{42bf}
@subsection @code{wave} — Read and write WAV files


@geindex module; wave

@c Documentations stolen from comments in file.

`Source code:' Lib/wave.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/wave.py}


__________________________________________________________________


The @code{wave} module provides a convenient interface to the Waveform Audio
“WAVE” (or “WAV”) file format. Only uncompressed PCM encoded wave files are
supported.


Changed in version 3.12: Support for @code{WAVE_FORMAT_EXTENSIBLE} headers was added, provided that the
extended format is @code{KSDATAFORMAT_SUBTYPE_PCM}.


The @code{wave} module defines the following function and exception:

@geindex open() (in module wave)
@anchor{library/wave wave open}@anchor{b4b}
@deffn {Function} wave.open (file, mode=None)

If `file' is a string, open the file by that name, otherwise treat it as a
file-like object.  `mode' can be:


@table @asis

@item @code{'rb'}

Read only mode.

@item @code{'wb'}

Write only mode.
@end table

Note that it does not allow read/write WAV files.

A `mode' of @code{'rb'} returns a @ref{334,,Wave_read} object, while a `mode' of
@code{'wb'} returns a @ref{335,,Wave_write} object.  If `mode' is omitted and a
file-like object is passed as `file', @code{file.mode} is used as the default
value for `mode'.

If you pass in a file-like object, the wave object will not close it when its
@code{close()} method is called; it is the caller’s responsibility to close
the file object.

The @code{open()} function may be used in a @ref{187,,with} statement.  When
the @code{with} block completes, the @ref{42c0,,Wave_read.close()} or
@ref{42c1,,Wave_write.close()} method is called.


Changed in version 3.4: Added support for unseekable files.

@end deffn

@geindex Error
@anchor{library/wave wave Error}@anchor{42c2}
@deffn {Exception} wave.Error

An error raised when something is impossible because it violates the WAV
specification or hits an implementation deficiency.
@end deffn

@menu
* Wave_read Objects:: 
* Wave_write Objects:: 

@end menu

@node Wave_read Objects,Wave_write Objects,,wave — Read and write WAV files
@anchor{library/wave id1}@anchor{42c3}@anchor{library/wave wave-read-objects}@anchor{42c4}
@subsubsection Wave_read Objects


@geindex Wave_read (class in wave)
@anchor{library/wave wave Wave_read}@anchor{334}
@deffn {Class} wave.Wave_read

Read a WAV file.

Wave_read objects, as returned by @ref{b4b,,open()}, have the following methods:

@geindex close() (wave.Wave_read method)
@anchor{library/wave wave Wave_read close}@anchor{42c0}
@deffn {Method} close ()

Close the stream if it was opened by @code{wave}, and make the instance
unusable.  This is called automatically on object collection.
@end deffn

@geindex getnchannels() (wave.Wave_read method)
@anchor{library/wave wave Wave_read getnchannels}@anchor{42c5}
@deffn {Method} getnchannels ()

Returns number of audio channels (@code{1} for mono, @code{2} for stereo).
@end deffn

@geindex getsampwidth() (wave.Wave_read method)
@anchor{library/wave wave Wave_read getsampwidth}@anchor{42c6}
@deffn {Method} getsampwidth ()

Returns sample width in bytes.
@end deffn

@geindex getframerate() (wave.Wave_read method)
@anchor{library/wave wave Wave_read getframerate}@anchor{42c7}
@deffn {Method} getframerate ()

Returns sampling frequency.
@end deffn

@geindex getnframes() (wave.Wave_read method)
@anchor{library/wave wave Wave_read getnframes}@anchor{42c8}
@deffn {Method} getnframes ()

Returns number of audio frames.
@end deffn

@geindex getcomptype() (wave.Wave_read method)
@anchor{library/wave wave Wave_read getcomptype}@anchor{42c9}
@deffn {Method} getcomptype ()

Returns compression type (@code{'NONE'} is the only supported type).
@end deffn

@geindex getcompname() (wave.Wave_read method)
@anchor{library/wave wave Wave_read getcompname}@anchor{42ca}
@deffn {Method} getcompname ()

Human-readable version of @ref{42c9,,getcomptype()}. Usually @code{'not compressed'}
parallels @code{'NONE'}.
@end deffn

@geindex getparams() (wave.Wave_read method)
@anchor{library/wave wave Wave_read getparams}@anchor{11f0}
@deffn {Method} getparams ()

Returns a @ref{4e1,,namedtuple()} @code{(nchannels, sampwidth,
framerate, nframes, comptype, compname)}, equivalent to output of the
@code{get*()} methods.
@end deffn

@geindex readframes() (wave.Wave_read method)
@anchor{library/wave wave Wave_read readframes}@anchor{42cb}
@deffn {Method} readframes (n)

Reads and returns at most `n' frames of audio, as a @ref{193,,bytes} object.
@end deffn

@geindex rewind() (wave.Wave_read method)
@anchor{library/wave wave Wave_read rewind}@anchor{42cc}
@deffn {Method} rewind ()

Rewind the file pointer to the beginning of the audio stream.
@end deffn

The following two methods are defined for compatibility with the old @code{aifc}
module, and don’t do anything interesting.

@geindex getmarkers() (wave.Wave_read method)
@anchor{library/wave wave Wave_read getmarkers}@anchor{333}
@deffn {Method} getmarkers ()

Returns @code{None}.


Deprecated since version 3.13, will be removed in version 3.15: The method only existed for compatibility with the @code{aifc} module
which has been removed in Python 3.13.

@end deffn

@geindex getmark() (wave.Wave_read method)
@anchor{library/wave wave Wave_read getmark}@anchor{332}
@deffn {Method} getmark (id)

Raise an error.


Deprecated since version 3.13, will be removed in version 3.15: The method only existed for compatibility with the @code{aifc} module
which has been removed in Python 3.13.

@end deffn

The following two methods define a term “position” which is compatible between
them, and is otherwise implementation dependent.

@geindex setpos() (wave.Wave_read method)
@anchor{library/wave wave Wave_read setpos}@anchor{42cd}
@deffn {Method} setpos (pos)

Set the file pointer to the specified position.
@end deffn

@geindex tell() (wave.Wave_read method)
@anchor{library/wave wave Wave_read tell}@anchor{42ce}
@deffn {Method} tell ()

Return current file pointer position.
@end deffn
@end deffn

@node Wave_write Objects,,Wave_read Objects,wave — Read and write WAV files
@anchor{library/wave id2}@anchor{42cf}@anchor{library/wave wave-write-objects}@anchor{11f1}
@subsubsection Wave_write Objects


@geindex Wave_write (class in wave)
@anchor{library/wave wave Wave_write}@anchor{335}
@deffn {Class} wave.Wave_write

Write a WAV file.

Wave_write objects, as returned by @ref{b4b,,open()}.

For seekable output streams, the @code{wave} header will automatically be updated
to reflect the number of frames actually written.  For unseekable streams, the
`nframes' value must be accurate when the first frame data is written.  An
accurate `nframes' value can be achieved either by calling
@ref{42d0,,setnframes()} or @ref{42d1,,setparams()} with the number
of frames that will be written before @ref{42c1,,close()} is called and
then using @ref{11f2,,writeframesraw()} to write the frame data, or by
calling @ref{11f3,,writeframes()} with all of the frame data to be
written.  In the latter case @code{writeframes()} will calculate
the number of frames in the data and set `nframes' accordingly before writing
the frame data.


Changed in version 3.4: Added support for unseekable files.


Wave_write objects have the following methods:

@geindex close() (wave.Wave_write method)
@anchor{library/wave wave Wave_write close}@anchor{42c1}
@deffn {Method} close ()

Make sure `nframes' is correct, and close the file if it was opened by
@code{wave}.  This method is called upon object collection.  It will raise
an exception if the output stream is not seekable and `nframes' does not
match the number of frames actually written.
@end deffn

@geindex setnchannels() (wave.Wave_write method)
@anchor{library/wave wave Wave_write setnchannels}@anchor{42d2}
@deffn {Method} setnchannels (n)

Set the number of channels.
@end deffn

@geindex getnchannels() (wave.Wave_write method)
@anchor{library/wave wave Wave_write getnchannels}@anchor{42d3}
@deffn {Method} getnchannels ()

Return the number of channels.
@end deffn

@geindex setsampwidth() (wave.Wave_write method)
@anchor{library/wave wave Wave_write setsampwidth}@anchor{42d4}
@deffn {Method} setsampwidth (n)

Set the sample width to `n' bytes.
@end deffn

@geindex getsampwidth() (wave.Wave_write method)
@anchor{library/wave wave Wave_write getsampwidth}@anchor{42d5}
@deffn {Method} getsampwidth ()

Return the sample width in bytes.
@end deffn

@geindex setframerate() (wave.Wave_write method)
@anchor{library/wave wave Wave_write setframerate}@anchor{42d6}
@deffn {Method} setframerate (n)

Set the frame rate to `n'.


Changed in version 3.2: A non-integral input to this method is rounded to the nearest
integer.

@end deffn

@geindex getframerate() (wave.Wave_write method)
@anchor{library/wave wave Wave_write getframerate}@anchor{42d7}
@deffn {Method} getframerate ()

Return the frame rate.
@end deffn

@geindex setnframes() (wave.Wave_write method)
@anchor{library/wave wave Wave_write setnframes}@anchor{42d0}
@deffn {Method} setnframes (n)

Set the number of frames to `n'.  This will be changed later if the number
of frames actually written is different (this update attempt will
raise an error if the output stream is not seekable).
@end deffn

@geindex getnframes() (wave.Wave_write method)
@anchor{library/wave wave Wave_write getnframes}@anchor{42d8}
@deffn {Method} getnframes ()

Return the number of audio frames written so far.
@end deffn

@geindex setcomptype() (wave.Wave_write method)
@anchor{library/wave wave Wave_write setcomptype}@anchor{42d9}
@deffn {Method} setcomptype (type, name)

Set the compression type and description. At the moment, only compression type
@code{NONE} is supported, meaning no compression.
@end deffn

@geindex getcomptype() (wave.Wave_write method)
@anchor{library/wave wave Wave_write getcomptype}@anchor{42da}
@deffn {Method} getcomptype ()

Return the compression type (@code{'NONE'}).
@end deffn

@geindex getcompname() (wave.Wave_write method)
@anchor{library/wave wave Wave_write getcompname}@anchor{42db}
@deffn {Method} getcompname ()

Return the human-readable compression type name.
@end deffn

@geindex setparams() (wave.Wave_write method)
@anchor{library/wave wave Wave_write setparams}@anchor{42d1}
@deffn {Method} setparams (tuple)

The `tuple' should be @code{(nchannels, sampwidth, framerate, nframes, comptype,
compname)}, with values valid for the @code{set*()} methods.  Sets all
parameters.
@end deffn

@geindex getparams() (wave.Wave_write method)
@anchor{library/wave wave Wave_write getparams}@anchor{42dc}
@deffn {Method} getparams ()

Return a @ref{4e1,,namedtuple()}
@code{(nchannels, sampwidth, framerate, nframes, comptype, compname)}
containing the current output parameters.
@end deffn

@geindex tell() (wave.Wave_write method)
@anchor{library/wave wave Wave_write tell}@anchor{42dd}
@deffn {Method} tell ()

Return current position in the file, with the same disclaimer for the
@ref{42ce,,Wave_read.tell()} and @ref{42cd,,Wave_read.setpos()} methods.
@end deffn

@geindex writeframesraw() (wave.Wave_write method)
@anchor{library/wave wave Wave_write writeframesraw}@anchor{11f2}
@deffn {Method} writeframesraw (data)

Write audio frames, without correcting `nframes'.


Changed in version 3.4: Any @ref{194,,bytes-like object} is now accepted.

@end deffn

@geindex writeframes() (wave.Wave_write method)
@anchor{library/wave wave Wave_write writeframes}@anchor{11f3}
@deffn {Method} writeframes (data)

Write audio frames and make sure `nframes' is correct.  It will raise an
error if the output stream is not seekable and the total number of frames
that have been written after `data' has been written does not match the
previously set value for `nframes'.


Changed in version 3.4: Any @ref{194,,bytes-like object} is now accepted.


Note that it is invalid to set any parameters after calling @code{writeframes()}
or @ref{11f2,,writeframesraw()}, and any attempt to do so will raise
@ref{42c2,,wave.Error}.
@end deffn
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node colorsys — Conversions between color systems,,wave — Read and write WAV files,Multimedia Services
@anchor{library/colorsys doc}@anchor{42de}@anchor{library/colorsys colorsys-conversions-between-color-systems}@anchor{42df}@anchor{library/colorsys module-colorsys}@anchor{20}@anchor{library/colorsys translation-repo}@anchor{42e0}
@subsection @code{colorsys} — Conversions between color systems


@geindex module; colorsys

`Source code:' Lib/colorsys.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/colorsys.py}


__________________________________________________________________


The @code{colorsys} module defines bidirectional conversions of color values
between colors expressed in the RGB (Red Green Blue) color space used in
computer monitors and three other coordinate systems: YIQ, HLS (Hue Lightness
Saturation) and HSV (Hue Saturation Value).  Coordinates in all of these color
spaces are floating-point values.  In the YIQ space, the Y coordinate is between
0 and 1, but the I and Q coordinates can be positive or negative.  In all other
spaces, the coordinates are all between 0 and 1.


@subsubheading See also


More information about color spaces can be found at
@indicateurl{https://poynton.ca/ColorFAQ.html} and
@indicateurl{https://www.cambridgeincolour.com/tutorials/color-spaces.htm}.


The @code{colorsys} module defines the following functions:

@geindex rgb_to_yiq() (in module colorsys)
@anchor{library/colorsys colorsys rgb_to_yiq}@anchor{42e1}
@deffn {Function} colorsys.rgb_to_yiq (r, g, b)

Convert the color from RGB coordinates to YIQ coordinates.
@end deffn

@geindex yiq_to_rgb() (in module colorsys)
@anchor{library/colorsys colorsys yiq_to_rgb}@anchor{42e2}
@deffn {Function} colorsys.yiq_to_rgb (y, i, q)

Convert the color from YIQ coordinates to RGB coordinates.
@end deffn

@geindex rgb_to_hls() (in module colorsys)
@anchor{library/colorsys colorsys rgb_to_hls}@anchor{1ab8}
@deffn {Function} colorsys.rgb_to_hls (r, g, b)

Convert the color from RGB coordinates to HLS coordinates.
@end deffn

@geindex hls_to_rgb() (in module colorsys)
@anchor{library/colorsys colorsys hls_to_rgb}@anchor{42e3}
@deffn {Function} colorsys.hls_to_rgb (h, l, s)

Convert the color from HLS coordinates to RGB coordinates.
@end deffn

@geindex rgb_to_hsv() (in module colorsys)
@anchor{library/colorsys colorsys rgb_to_hsv}@anchor{42e4}
@deffn {Function} colorsys.rgb_to_hsv (r, g, b)

Convert the color from RGB coordinates to HSV coordinates.
@end deffn

@geindex hsv_to_rgb() (in module colorsys)
@anchor{library/colorsys colorsys hsv_to_rgb}@anchor{42e5}
@deffn {Function} colorsys.hsv_to_rgb (h, s, v)

Convert the color from HSV coordinates to RGB coordinates.
@end deffn

Example:

@example
>>> import colorsys
>>> colorsys.rgb_to_hsv(0.2, 0.4, 0.4)
(0.5, 0.5, 0.4)
>>> colorsys.hsv_to_rgb(0.5, 0.5, 0.4)
(0.2, 0.4, 0.4)
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Internationalization,Graphical user interfaces with Tk,Multimedia Services,The Python Standard Library
@anchor{library/i18n doc}@anchor{42e6}@anchor{library/i18n i18n}@anchor{42e7}@anchor{library/i18n internationalization}@anchor{42e8}@anchor{library/i18n translation-repo}@anchor{42e9}
@section Internationalization


The modules described in this chapter help you write software that is
independent of language and locale by providing mechanisms for selecting a
language to be used in  program messages or by tailoring output to match local
conventions.

The list of modules described in this chapter is:

@menu
* gettext — Multilingual internationalization services:: 
* locale — Internationalization services:: 

@end menu

@node gettext — Multilingual internationalization services,locale — Internationalization services,,Internationalization
@anchor{library/gettext doc}@anchor{42ea}@anchor{library/gettext gettext-multilingual-internationalization-services}@anchor{42eb}@anchor{library/gettext module-gettext}@anchor{67}
@subsection @code{gettext} — Multilingual internationalization services


@geindex module; gettext

`Source code:' Lib/gettext.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/gettext.py}


__________________________________________________________________


The @code{gettext} module provides internationalization (I18N) and localization
(L10N) services for your Python modules and applications. It supports both the
GNU @code{gettext} message catalog API and a higher level, class-based API that may
be more appropriate for Python files.  The interface described below allows you
to write your module and application messages in one natural language, and
provide a catalog of translated messages for running under different natural
languages.

Some hints on localizing your Python modules and applications are also given.

@menu
* GNU gettext API:: 
* Class-based API:: 
* Internationalizing your programs and modules:: 
* Acknowledgements: Acknowledgements<9>. 

@end menu

@node GNU gettext API,Class-based API,,gettext — Multilingual internationalization services
@anchor{library/gettext gnu-gettext-api}@anchor{42ec}
@subsubsection GNU @code{gettext} API


The @code{gettext} module defines the following API, which is very similar to
the GNU @code{gettext} API.  If you use this API you will affect the
translation of your entire application globally.  Often this is what you want if
your application is monolingual, with the choice of language dependent on the
locale of your user.  If you are localizing a Python module, or if your
application needs to switch languages on the fly, you probably want to use the
class-based API instead.

@geindex bindtextdomain() (in module gettext)
@anchor{library/gettext gettext bindtextdomain}@anchor{42ed}
@deffn {Function} gettext.bindtextdomain (domain, localedir=None)

Bind the `domain' to the locale directory `localedir'.  More concretely,
@code{gettext} will look for binary @code{.mo} files for the given domain using
the path (on Unix): @code{`localedir'/`language'/LC_MESSAGES/`domain'.mo}, where
`language' is searched for in the environment variables 
@geindex LANGUAGE
@geindex environment variable; LANGUAGE
@code{LANGUAGE},
@geindex LC_ALL
@geindex environment variable; LC_ALL
@code{LC_ALL}, 
@geindex LC_MESSAGES
@geindex environment variable; LC_MESSAGES
@code{LC_MESSAGES}, and 
@geindex LANG
@geindex environment variable; LANG
@code{LANG} respectively.

If `localedir' is omitted or @code{None}, then the current binding for `domain' is
returned. @footnote{
The default locale directory is system dependent; for example, on Red Hat Linux
it is @code{/usr/share/locale}, but on Solaris it is @code{/usr/lib/locale}.
The @code{gettext} module does not try to support these system dependent
defaults; instead its default is @code{`sys.base_prefix'/share/locale} (see
@ref{3e4,,sys.base_prefix}). For this reason, it is always best to call
@ref{42ed,,bindtextdomain()} with an explicit absolute path at the start of your
application.
}
@end deffn

@geindex textdomain() (in module gettext)
@anchor{library/gettext gettext textdomain}@anchor{42ee}
@deffn {Function} gettext.textdomain (domain=None)

Change or query the current global domain.  If `domain' is @code{None}, then the
current global domain is returned, otherwise the global domain is set to
`domain', which is returned.
@end deffn

@geindex _ (underscore); gettext

@geindex gettext() (in module gettext)
@anchor{library/gettext gettext gettext}@anchor{1675}
@deffn {Function} gettext.gettext (message, /)

Return the localized translation of `message', based on the current global
domain, language, and locale directory.  This function is usually aliased as
@code{_()} in the local namespace (see examples below).
@end deffn

@geindex dgettext() (in module gettext)
@anchor{library/gettext gettext dgettext}@anchor{42ef}
@deffn {Function} gettext.dgettext (domain, message, /)

Like @ref{1675,,gettext()}, but look the message up in the specified `domain'.
@end deffn

@geindex ngettext() (in module gettext)
@anchor{library/gettext gettext ngettext}@anchor{42f0}
@deffn {Function} gettext.ngettext (singular, plural, n, /)

Like @ref{1675,,gettext()}, but consider plural forms. If a translation is found,
apply the plural formula to `n', and return the resulting message (some
languages have more than two plural forms). If no translation is found, return
`singular' if `n' is 1; return `plural' otherwise.

The Plural formula is taken from the catalog header. It is a C or Python
expression that has a free variable `n'; the expression evaluates to the index
of the plural in the catalog. See
the GNU gettext documentation@footnote{https://www.gnu.org/software/gettext/manual/gettext.html}
for the precise syntax to be used in @code{.po} files and the
formulas for a variety of languages.
@end deffn

@geindex dngettext() (in module gettext)
@anchor{library/gettext gettext dngettext}@anchor{42f1}
@deffn {Function} gettext.dngettext (domain, singular, plural, n, /)

Like @ref{42f0,,ngettext()}, but look the message up in the specified `domain'.
@end deffn

@geindex pgettext() (in module gettext)
@anchor{library/gettext gettext pgettext}@anchor{bee}
@deffn {Function} gettext.pgettext (context, message, /)
@end deffn

@geindex dpgettext() (in module gettext)
@anchor{library/gettext gettext dpgettext}@anchor{42f2}
@deffn {Function} gettext.dpgettext (domain, context, message, /)
@end deffn

@geindex npgettext() (in module gettext)
@anchor{library/gettext gettext npgettext}@anchor{42f3}
@deffn {Function} gettext.npgettext (context, singular, plural, n, /)
@end deffn

@geindex dnpgettext() (in module gettext)
@anchor{library/gettext gettext dnpgettext}@anchor{42f4}
@deffn {Function} gettext.dnpgettext (domain, context, singular, plural, n, /)

Similar to the corresponding functions without the @code{p} in the prefix (that
is, @ref{67,,gettext()}, @ref{42ef,,dgettext()}, @ref{42f0,,ngettext()}, @ref{42f1,,dngettext()}),
but the translation is restricted to the given message `context'.


Added in version 3.8.

@end deffn

Note that GNU @code{gettext} also defines a @code{dcgettext()} method, but
this was deemed not useful and so it is currently unimplemented.

Here’s an example of typical usage for this API:

@example
import gettext
gettext.bindtextdomain('myapplication', '/path/to/my/language/directory')
gettext.textdomain('myapplication')
_ = gettext.gettext
# ...
print(_('This is a translatable string.'))
@end example

@node Class-based API,Internationalizing your programs and modules,GNU gettext API,gettext — Multilingual internationalization services
@anchor{library/gettext class-based-api}@anchor{42f5}
@subsubsection Class-based API


The class-based API of the @code{gettext} module gives you more flexibility and
greater convenience than the GNU @code{gettext} API.  It is the recommended
way of localizing your Python applications and modules.  @code{gettext} defines
a @ref{42f6,,GNUTranslations} class which implements the parsing of GNU @code{.mo} format
files, and has methods for returning strings. Instances of this class can also
install themselves in the built-in namespace as the function @code{_()}.

@geindex find() (in module gettext)
@anchor{library/gettext gettext find}@anchor{42f7}
@deffn {Function} gettext.find (domain, localedir=None, languages=None, all=False)

This function implements the standard @code{.mo} file search algorithm.  It
takes a `domain', identical to what @ref{42ee,,textdomain()} takes.  Optional
`localedir' is as in @ref{42ed,,bindtextdomain()}. Optional `languages' is a list of
strings, where each string is a language code.

If `localedir' is not given, then the default system locale directory is used.
@footnote{
See the footnote for @ref{42ed,,bindtextdomain()} above.
}  If `languages' is not given, then the following environment variables are
searched: 
@geindex LANGUAGE
@geindex environment variable; LANGUAGE
@code{LANGUAGE}, 
@geindex LC_ALL
@geindex environment variable; LC_ALL
@code{LC_ALL}, 
@geindex LC_MESSAGES
@geindex environment variable; LC_MESSAGES
@code{LC_MESSAGES}, and
@geindex LANG
@geindex environment variable; LANG
@code{LANG}.  The first one returning a non-empty value is used for the
`languages' variable. The environment variables should contain a colon separated
list of languages, which will be split on the colon to produce the expected list
of language code strings.

@code{find()} then expands and normalizes the languages, and then iterates
through them, searching for an existing file built of these components:

@code{`localedir'/`language'/LC_MESSAGES/`domain'.mo}

The first such file name that exists is returned by @code{find()}. If no such
file is found, then @code{None} is returned. If `all' is given, it returns a list
of all file names, in the order in which they appear in the languages list or
the environment variables.
@end deffn

@geindex translation() (in module gettext)
@anchor{library/gettext gettext translation}@anchor{c73}
@deffn {Function} gettext.translation (domain, localedir=None, languages=None, class_=None, fallback=False)

Return a @code{*Translations} instance based on the `domain', `localedir',
and `languages', which are first passed to @ref{42f7,,find()} to get a list of the
associated @code{.mo} file paths.  Instances with identical @code{.mo} file
names are cached.  The actual class instantiated is `class_' if
provided, otherwise @ref{42f6,,GNUTranslations}.  The class’s constructor must
take a single @ref{13cf,,file object} argument.

If multiple files are found, later files are used as fallbacks for earlier ones.
To allow setting the fallback, @ref{758,,copy.copy()} is used to clone each
translation object from the cache; the actual instance data is still shared with
the cache.

If no @code{.mo} file is found, this function raises @ref{2c2,,OSError} if
`fallback' is false (which is the default), and returns a
@ref{42f8,,NullTranslations} instance if `fallback' is true.


Changed in version 3.3: @ref{1259,,IOError} used to be raised, it is now an alias of @ref{2c2,,OSError}.



Changed in version 3.11: `codeset' parameter is removed.

@end deffn

@geindex install() (in module gettext)
@anchor{library/gettext gettext install}@anchor{c74}
@deffn {Function} gettext.install (domain, localedir=None, *, names=None)

This installs the function @code{_()} in Python’s builtins namespace, based on
`domain' and `localedir' which are passed to the function @ref{c73,,translation()}.

For the `names' parameter, please see the description of the translation
object’s @ref{42f9,,install()} method.

As seen below, you usually mark the strings in your application that are
candidates for translation, by wrapping them in a call to the @code{_()}
function, like this:

@example
print(_('This string will be translated.'))
@end example

For convenience, you want the @code{_()} function to be installed in Python’s
builtins namespace, so it is easily accessible in all modules of your
application.


Changed in version 3.11: `names' is now a keyword-only parameter.

@end deffn

@menu
* The NullTranslations class:: 
* The GNUTranslations class:: 
* Solaris message catalog support:: 
* The Catalog constructor:: 

@end menu

@node The NullTranslations class,The GNUTranslations class,,Class-based API
@anchor{library/gettext the-nulltranslations-class}@anchor{42fa}
@subsubsection The @code{NullTranslations} class


Translation classes are what actually implement the translation of original
source file message strings to translated message strings. The base class used
by all translation classes is @ref{42f8,,NullTranslations}; this provides the basic
interface you can use to write your own specialized translation classes.  Here
are the methods of @code{NullTranslations}:

@geindex NullTranslations (class in gettext)
@anchor{library/gettext gettext NullTranslations}@anchor{42f8}
@deffn {Class} gettext.NullTranslations (fp=None)

Takes an optional @ref{13cf,,file object} `fp', which is ignored by the base class.
Initializes “protected” instance variables `_info' and `_charset' which are set
by derived classes, as well as `_fallback', which is set through
@ref{42fb,,add_fallback()}.  It then calls @code{self._parse(fp)} if `fp' is not
@code{None}.

@geindex _parse() (gettext.NullTranslations method)
@anchor{library/gettext gettext NullTranslations _parse}@anchor{42fc}
@deffn {Method} _parse (fp)

No-op in the base class, this method takes file object `fp', and reads
the data from the file, initializing its message catalog.  If you have an
unsupported message catalog file format, you should override this method
to parse your format.
@end deffn

@geindex add_fallback() (gettext.NullTranslations method)
@anchor{library/gettext gettext NullTranslations add_fallback}@anchor{42fb}
@deffn {Method} add_fallback (fallback)

Add `fallback' as the fallback object for the current translation object.
A translation object should consult the fallback if it cannot provide a
translation for a given message.
@end deffn

@geindex gettext() (gettext.NullTranslations method)
@anchor{library/gettext gettext NullTranslations gettext}@anchor{42fd}
@deffn {Method} gettext (message, /)

If a fallback has been set, forward @code{gettext()} to the fallback.
Otherwise, return `message'.  Overridden in derived classes.
@end deffn

@geindex ngettext() (gettext.NullTranslations method)
@anchor{library/gettext gettext NullTranslations ngettext}@anchor{42fe}
@deffn {Method} ngettext (singular, plural, n, /)

If a fallback has been set, forward @code{ngettext()} to the fallback.
Otherwise, return `singular' if `n' is 1; return `plural' otherwise.
Overridden in derived classes.
@end deffn

@geindex pgettext() (gettext.NullTranslations method)
@anchor{library/gettext gettext NullTranslations pgettext}@anchor{42ff}
@deffn {Method} pgettext (context, message, /)

If a fallback has been set, forward @code{pgettext()} to the fallback.
Otherwise, return the translated message.  Overridden in derived classes.


Added in version 3.8.

@end deffn

@geindex npgettext() (gettext.NullTranslations method)
@anchor{library/gettext gettext NullTranslations npgettext}@anchor{4300}
@deffn {Method} npgettext (context, singular, plural, n, /)

If a fallback has been set, forward @code{npgettext()} to the fallback.
Otherwise, return the translated message.  Overridden in derived classes.


Added in version 3.8.

@end deffn

@geindex info() (gettext.NullTranslations method)
@anchor{library/gettext gettext NullTranslations info}@anchor{4301}
@deffn {Method} info ()

Return a dictionary containing
the metadata found in the message catalog file.
@end deffn

@geindex charset() (gettext.NullTranslations method)
@anchor{library/gettext gettext NullTranslations charset}@anchor{4302}
@deffn {Method} charset ()

Return the encoding of the message catalog file.
@end deffn

@geindex install() (gettext.NullTranslations method)
@anchor{library/gettext gettext NullTranslations install}@anchor{42f9}
@deffn {Method} install (names=None)

This method installs @ref{42fd,,gettext()} into the built-in namespace,
binding it to @code{_}.

If the `names' parameter is given, it must be a sequence containing the
names of functions you want to install in the builtins namespace in
addition to @code{_()}.  Supported names are @code{'gettext'}, @code{'ngettext'},
@code{'pgettext'}, and @code{'npgettext'}.

Note that this is only one way, albeit the most convenient way, to make
the @code{_()} function available to your application.  Because it affects
the entire application globally, and specifically the built-in namespace,
localized modules should never install @code{_()}. Instead, they should use
this code to make @code{_()} available to their module:

@example
import gettext
t = gettext.translation('mymodule', ...)
_ = t.gettext
@end example

This puts @code{_()} only in the module’s global namespace and so only
affects calls within this module.


Changed in version 3.8: Added @code{'pgettext'} and @code{'npgettext'}.

@end deffn
@end deffn

@node The GNUTranslations class,Solaris message catalog support,The NullTranslations class,Class-based API
@anchor{library/gettext the-gnutranslations-class}@anchor{4303}
@subsubsection The @code{GNUTranslations} class


The @code{gettext} module provides one additional class derived from
@ref{42f8,,NullTranslations}: @ref{42f6,,GNUTranslations}.  This class overrides
@code{_parse()} to enable reading GNU @code{gettext} format @code{.mo} files
in both big-endian and little-endian format.

@ref{42f6,,GNUTranslations} parses optional metadata out of the translation
catalog. It is convention with GNU @code{gettext} to include metadata as
the translation for the empty string. This metadata is in 
@geindex RFC; RFC 822
RFC 822@footnote{https://datatracker.ietf.org/doc/html/rfc822.html}-style
@code{key: value} pairs, and should contain the @code{Project-Id-Version} key.  If the
key @code{Content-Type} is found, then the @code{charset} property is used to
initialize the “protected” @code{_charset} instance variable, defaulting to
@code{None} if not found.  If the charset encoding is specified, then all message
ids and message strings read from the catalog are converted to Unicode using
this encoding, else ASCII is assumed.

Since message ids are read as Unicode strings too, all @code{*gettext()} methods
will assume message ids as Unicode strings, not byte strings.

The entire set of key/value pairs are placed into a dictionary and set as the
“protected” @code{_info} instance variable.

If the @code{.mo} file’s magic number is invalid, the major version number is
unexpected, or if other problems occur while reading the file, instantiating a
@ref{42f6,,GNUTranslations} class can raise @ref{2c2,,OSError}.

@geindex GNUTranslations (class in gettext)
@anchor{library/gettext gettext GNUTranslations}@anchor{42f6}
@deffn {Class} gettext.GNUTranslations

The following methods are overridden from the base class implementation:

@geindex gettext() (gettext.GNUTranslations method)
@anchor{library/gettext gettext GNUTranslations gettext}@anchor{4304}
@deffn {Method} gettext (message, /)

Look up the `message' id in the catalog and return the corresponding message
string, as a Unicode string.  If there is no entry in the catalog for the
`message' id, and a fallback has been set, the look up is forwarded to the
fallback’s @ref{42fd,,gettext()} method.  Otherwise, the
`message' id is returned.
@end deffn

@geindex ngettext() (gettext.GNUTranslations method)
@anchor{library/gettext gettext GNUTranslations ngettext}@anchor{4305}
@deffn {Method} ngettext (singular, plural, n, /)

Do a plural-forms lookup of a message id.  `singular' is used as the message id
for purposes of lookup in the catalog, while `n' is used to determine which
plural form to use.  The returned message string is a Unicode string.

If the message id is not found in the catalog, and a fallback is specified,
the request is forwarded to the fallback’s @ref{42fe,,ngettext()}
method.  Otherwise, when `n' is 1 `singular' is returned, and `plural' is
returned in all other cases.

Here is an example:

@example
n = len(os.listdir('.'))
cat = GNUTranslations(somefile)
message = cat.ngettext(
    'There is %(num)d file in this directory',
    'There are %(num)d files in this directory',
    n) % @{'num': n@}
@end example
@end deffn

@geindex pgettext() (gettext.GNUTranslations method)
@anchor{library/gettext gettext GNUTranslations pgettext}@anchor{4306}
@deffn {Method} pgettext (context, message, /)

Look up the `context' and `message' id in the catalog and return the
corresponding message string, as a Unicode string.  If there is no
entry in the catalog for the `message' id and `context', and a fallback
has been set, the look up is forwarded to the fallback’s
@code{pgettext()} method.  Otherwise, the `message' id is returned.


Added in version 3.8.

@end deffn

@geindex npgettext() (gettext.GNUTranslations method)
@anchor{library/gettext gettext GNUTranslations npgettext}@anchor{4307}
@deffn {Method} npgettext (context, singular, plural, n, /)

Do a plural-forms lookup of a message id.  `singular' is used as the
message id for purposes of lookup in the catalog, while `n' is used to
determine which plural form to use.

If the message id for `context' is not found in the catalog, and a
fallback is specified, the request is forwarded to the fallback’s
@code{npgettext()} method.  Otherwise, when `n' is 1 `singular' is
returned, and `plural' is returned in all other cases.


Added in version 3.8.

@end deffn
@end deffn

@node Solaris message catalog support,The Catalog constructor,The GNUTranslations class,Class-based API
@anchor{library/gettext solaris-message-catalog-support}@anchor{4308}
@subsubsection Solaris message catalog support


The Solaris operating system defines its own binary @code{.mo} file format, but
since no documentation can be found on this format, it is not supported at this
time.

@node The Catalog constructor,,Solaris message catalog support,Class-based API
@anchor{library/gettext the-catalog-constructor}@anchor{4309}
@subsubsection The Catalog constructor


@geindex GNOME

GNOME uses a version of the @code{gettext} module by James Henstridge, but this
version has a slightly different API.  Its documented usage was:

@example
import gettext
cat = gettext.Catalog(domain, localedir)
_ = cat.gettext
print(_('hello world'))
@end example

For compatibility with this older module, the function @code{Catalog()} is an
alias for the @ref{c73,,translation()} function described above.

One difference between this module and Henstridge’s: his catalog objects
supported access through a mapping API, but this appears to be unused and so is
not currently supported.

@node Internationalizing your programs and modules,Acknowledgements<9>,Class-based API,gettext — Multilingual internationalization services
@anchor{library/gettext i18n-howto}@anchor{3446}@anchor{library/gettext internationalizing-your-programs-and-modules}@anchor{430a}
@subsubsection Internationalizing your programs and modules


Internationalization (I18N) refers to the operation by which a program is made
aware of multiple languages.  Localization (L10N) refers to the adaptation of
your program, once internationalized, to the local language and cultural habits.
In order to provide multilingual messages for your Python programs, you need to
take the following steps:


@enumerate 

@item 
prepare your program or module by specially marking translatable strings

@item 
run a suite of tools over your marked files to generate raw messages catalogs

@item 
create language-specific translations of the message catalogs

@item 
use the @code{gettext} module so that message strings are properly translated
@end enumerate

In order to prepare your code for I18N, you need to look at all the strings in
your files.  Any string that needs to be translated should be marked by wrapping
it in @code{_('...')} — that is, a call to the function @ref{67,,_}.  For example:

@example
filename = 'mylog.txt'
message = _('writing a log message')
with open(filename, 'w') as fp:
    fp.write(message)
@end example

In this example, the string @code{'writing a log message'} is marked as a candidate
for translation, while the strings @code{'mylog.txt'} and @code{'w'} are not.

There are a few tools to extract the strings meant for translation.
The original GNU @code{gettext} only supported C or C++ source
code but its extended version @code{xgettext} scans code written
in a number of languages, including Python, to find strings marked as
translatable.  Babel@footnote{https://babel.pocoo.org/} is a Python
internationalization library that includes a @code{pybabel} script to
extract and compile message catalogs.  François Pinard’s program
called @code{xpot} does a similar job and is available as part of
his po-utils package@footnote{https://github.com/pinard/po-utils}.

(Python also includes pure-Python versions of these programs, called
@code{pygettext.py} and @code{msgfmt.py}; some Python distributions
will install them for you.  @code{pygettext.py} is similar to
@code{xgettext}, but only understands Python source code and
cannot handle other programming languages such as C or C++.
@code{pygettext.py} supports a command-line interface similar to
@code{xgettext}; for details on its use, run @code{pygettext.py
--help}.  @code{msgfmt.py} is binary compatible with GNU
@code{msgfmt}.  With these two programs, you may not need the GNU
@code{gettext} package to internationalize your Python
applications.)

@code{xgettext}, @code{pygettext}, and similar tools generate
@code{.po} files that are message catalogs.  They are structured
human-readable files that contain every marked string in the source
code, along with a placeholder for the translated versions of these
strings.

Copies of these @code{.po} files are then handed over to the
individual human translators who write translations for every
supported natural language.  They send back the completed
language-specific versions as a @code{<language-name>.po} file that’s
compiled into a machine-readable @code{.mo} binary catalog file using
the @code{msgfmt} program.  The @code{.mo} files are used by the
@code{gettext} module for the actual translation processing at
run-time.

How you use the @code{gettext} module in your code depends on whether you are
internationalizing a single module or your entire application. The next two
sections will discuss each case.

@menu
* Localizing your module:: 
* Localizing your application:: 
* Changing languages on the fly:: 
* Deferred translations:: 

@end menu

@node Localizing your module,Localizing your application,,Internationalizing your programs and modules
@anchor{library/gettext localizing-your-module}@anchor{430b}
@subsubsection Localizing your module


If you are localizing your module, you must take care not to make global
changes, e.g. to the built-in namespace. You should not use the GNU @code{gettext}
API but instead the class-based API.

Let’s say your module is called “spam” and the module’s various natural language
translation @code{.mo} files reside in @code{/usr/share/locale} in GNU
@code{gettext} format.  Here’s what you would put at the top of your
module:

@example
import gettext
t = gettext.translation('spam', '/usr/share/locale')
_ = t.gettext
@end example

@node Localizing your application,Changing languages on the fly,Localizing your module,Internationalizing your programs and modules
@anchor{library/gettext localizing-your-application}@anchor{430c}
@subsubsection Localizing your application


If you are localizing your application, you can install the @code{_()} function
globally into the built-in namespace, usually in the main driver file of your
application.  This will let all your application-specific files just use
@code{_('...')} without having to explicitly install it in each file.

In the simple case then, you need only add the following bit of code to the main
driver file of your application:

@example
import gettext
gettext.install('myapplication')
@end example

If you need to set the locale directory, you can pass it into the
@ref{c74,,install()} function:

@example
import gettext
gettext.install('myapplication', '/usr/share/locale')
@end example

@node Changing languages on the fly,Deferred translations,Localizing your application,Internationalizing your programs and modules
@anchor{library/gettext changing-languages-on-the-fly}@anchor{430d}
@subsubsection Changing languages on the fly


If your program needs to support many languages at the same time, you may want
to create multiple translation instances and then switch between them
explicitly, like so:

@example
import gettext

lang1 = gettext.translation('myapplication', languages=['en'])
lang2 = gettext.translation('myapplication', languages=['fr'])
lang3 = gettext.translation('myapplication', languages=['de'])

# start by using language1
lang1.install()

# ... time goes by, user selects language 2
lang2.install()

# ... more time goes by, user selects language 3
lang3.install()
@end example

@node Deferred translations,,Changing languages on the fly,Internationalizing your programs and modules
@anchor{library/gettext deferred-translations}@anchor{430e}
@subsubsection Deferred translations


In most coding situations, strings are translated where they are coded.
Occasionally however, you need to mark strings for translation, but defer actual
translation until later.  A classic example is:

@example
animals = ['mollusk',
           'albatross',
           'rat',
           'penguin',
           'python', ]
# ...
for a in animals:
    print(a)
@end example

Here, you want to mark the strings in the @code{animals} list as being
translatable, but you don’t actually want to translate them until they are
printed.

Here is one way you can handle this situation:

@example
def _(message): return message

animals = [_('mollusk'),
           _('albatross'),
           _('rat'),
           _('penguin'),
           _('python'), ]

del _

# ...
for a in animals:
    print(_(a))
@end example

This works because the dummy definition of @code{_()} simply returns the string
unchanged.  And this dummy definition will temporarily override any definition
of @code{_()} in the built-in namespace (until the @ref{1b63,,del} command). Take
care, though if you have a previous definition of @code{_()} in the local
namespace.

Note that the second use of @code{_()} will not identify “a” as being
translatable to the @code{gettext} program, because the parameter
is not a string literal.

Another way to handle this is with the following example:

@example
def N_(message): return message

animals = [N_('mollusk'),
           N_('albatross'),
           N_('rat'),
           N_('penguin'),
           N_('python'), ]

# ...
for a in animals:
    print(_(a))
@end example

In this case, you are marking translatable strings with the function
@code{N_()}, which won’t conflict with any definition of @code{_()}.
However, you will need to teach your message extraction program to
look for translatable strings marked with @code{N_()}. @code{xgettext},
@code{pygettext}, @code{pybabel extract}, and @code{xpot} all
support this through the use of the @code{-k} command-line switch.
The choice of @code{N_()} here is totally arbitrary; it could have just
as easily been @code{MarkThisStringForTranslation()}.

@node Acknowledgements<9>,,Internationalizing your programs and modules,gettext — Multilingual internationalization services
@anchor{library/gettext acknowledgements}@anchor{430f}
@subsubsection Acknowledgements


The following people contributed code, feedback, design suggestions, previous
implementations, and valuable experience to the creation of this module:


@itemize *

@item 
Peter Funk

@item 
James Henstridge

@item 
Juan David Ibáñez Palomar

@item 
Marc-André Lemburg

@item 
Martin von Löwis

@item 
François Pinard

@item 
Barry Warsaw

@item 
Gustavo Niemeyer
@end itemize

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node locale — Internationalization services,,gettext — Multilingual internationalization services,Internationalization
@anchor{library/locale doc}@anchor{4310}@anchor{library/locale locale-internationalization-services}@anchor{4311}@anchor{library/locale module-locale}@anchor{8a}@anchor{library/locale translation-repo}@anchor{4312}
@subsection @code{locale} — Internationalization services


@geindex module; locale

`Source code:' Lib/locale.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/locale.py}


__________________________________________________________________


The @code{locale} module opens access to the POSIX locale database and
functionality. The POSIX locale mechanism allows programmers to deal with
certain cultural issues in an application, without requiring the programmer to
know all the specifics of each country where the software is executed.

@geindex module; _locale

The @code{locale} module is implemented on top of the @code{_locale} module,
which in turn uses an ANSI C locale implementation if available.

The @code{locale} module defines the following exception and functions:

@geindex Error
@anchor{library/locale locale Error}@anchor{4313}
@deffn {Exception} locale.Error

Exception raised when the locale passed to @ref{931,,setlocale()} is not
recognized.
@end deffn

@geindex setlocale() (in module locale)
@anchor{library/locale locale setlocale}@anchor{931}
@deffn {Function} locale.setlocale (category, locale=None)

If `locale' is given and not @code{None}, @code{setlocale()} modifies the locale
setting for the `category'. The available categories are listed in the data
description below. `locale' may be a @ref{4314,,string}, or a pair,
language code and encoding. An empty string specifies the user’s
default settings. If the modification of the locale fails, the exception
@ref{4313,,Error} is raised. If successful, the new locale setting is returned.

If `locale' is a pair, it is converted to a locale name using
the locale aliasing engine.
The language code has the same format as a @ref{4314,,locale name},
but without encoding and @code{@@}-modifier.
The language code and encoding can be @code{None}.

If `locale' is omitted or @code{None}, the current setting for `category' is
returned.

Example:

@example
>>> import locale
>>> loc = locale.setlocale(locale.LC_ALL)  # get current locale
# use German locale; name and availability varies with platform
>>> locale.setlocale(locale.LC_ALL, 'de_DE.UTF-8')
>>> locale.strcoll('f\xe4n', 'foo')  # compare a string containing an umlaut
>>> locale.setlocale(locale.LC_ALL, '@w{'})   # use user's preferred locale
>>> locale.setlocale(locale.LC_ALL, 'C')  # use default (C) locale
>>> locale.setlocale(locale.LC_ALL, loc)  # restore saved locale
@end example

@code{setlocale()} is not thread-safe on most systems. Applications typically
start with a call of:

@example
import locale
locale.setlocale(locale.LC_ALL, '@w{'})
@end example

This sets the locale for all categories to the user’s default setting (typically
specified in the 
@geindex LANG
@geindex environment variable; LANG
@code{LANG} environment variable).  If the locale is not
changed thereafter, using multithreading should not cause problems.
@end deffn

@geindex localeconv() (in module locale)
@anchor{library/locale locale localeconv}@anchor{dfe}
@deffn {Function} locale.localeconv ()

Returns the database of the local conventions as a dictionary. This dictionary
has the following strings as keys:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Category

@tab

Key

@tab

Meaning

@item

@ref{27b0,,LC_NUMERIC}

@tab

@code{'decimal_point'}

@tab

Decimal point character.

@item

@tab

@code{'grouping'}

@tab

Sequence of numbers specifying
which relative positions the
@code{'thousands_sep'} is
expected.  If the sequence is
terminated with
@ref{4315,,CHAR_MAX}, no further
grouping is performed. If the
sequence terminates with a
@code{0},  the last group size is
repeatedly used.

@item

@tab

@code{'thousands_sep'}

@tab

Character used between groups.

@item

@ref{4316,,LC_MONETARY}

@tab

@code{'int_curr_symbol'}

@tab

International currency symbol.

@item

@tab

@code{'currency_symbol'}

@tab

Local currency symbol.

@item

@tab

@code{'p_cs_precedes/n_cs_precedes'}

@tab

Whether the currency symbol
precedes the value (for
positive resp. negative
values).

@item

@tab

@code{'p_sep_by_space/n_sep_by_space'}

@tab

Whether the currency symbol is
separated from the value  by a
space (for positive resp.
negative values).

@item

@tab

@code{'mon_decimal_point'}

@tab

Decimal point used for
monetary values.

@item

@tab

@code{'frac_digits'}

@tab

Number of fractional digits
used in local formatting of
monetary values.

@item

@tab

@code{'int_frac_digits'}

@tab

Number of fractional digits
used in international
formatting of monetary values.

@item

@tab

@code{'mon_thousands_sep'}

@tab

Group separator used for
monetary values.

@item

@tab

@code{'mon_grouping'}

@tab

Equivalent to @code{'grouping'},
used for monetary values.

@item

@tab

@code{'positive_sign'}

@tab

Symbol used to annotate a
positive monetary value.

@item

@tab

@code{'negative_sign'}

@tab

Symbol used to annotate a
negative monetary value.

@item

@tab

@code{'p_sign_posn/n_sign_posn'}

@tab

The position of the sign (for
positive resp. negative
values), see below.

@end multitable


All numeric values can be set to @ref{4315,,CHAR_MAX} to indicate that there is no
value specified in this locale.

The possible values for @code{'p_sign_posn'} and @code{'n_sign_posn'} are given below.


@multitable {xxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Value

@tab

Explanation

@item

@code{0}

@tab

Currency and value are surrounded by
parentheses.

@item

@code{1}

@tab

The sign should precede the value and
currency symbol.

@item

@code{2}

@tab

The sign should follow the value and
currency symbol.

@item

@code{3}

@tab

The sign should immediately precede the
value.

@item

@code{4}

@tab

The sign should immediately follow the
value.

@item

@code{CHAR_MAX}

@tab

Nothing is specified in this locale.

@end multitable


The function temporarily sets the @code{LC_CTYPE} locale to the @code{LC_NUMERIC}
locale or the @code{LC_MONETARY} locale if locales are different and numeric or
monetary strings are non-ASCII. This temporary change affects other threads.


Changed in version 3.7: The function now temporarily sets the @code{LC_CTYPE} locale to the
@code{LC_NUMERIC} locale in some cases.

@end deffn

@geindex nl_langinfo() (in module locale)
@anchor{library/locale locale nl_langinfo}@anchor{452}
@deffn {Function} locale.nl_langinfo (option)

Return some locale-specific information as a string.  This function is not
available on all systems, and the set of possible options might also vary
across platforms.  The possible argument values are numbers, for which
symbolic constants are available in the locale module.

The @code{nl_langinfo()} function accepts one of the following keys.  Most
descriptions are taken from the corresponding description in the GNU C
library.

@geindex CODESET (in module locale)
@anchor{library/locale locale CODESET}@anchor{4317}
@deffn {Data} locale.CODESET

Get a string with the name of the character encoding used in the
selected locale.
@end deffn

@geindex D_T_FMT (in module locale)
@anchor{library/locale locale D_T_FMT}@anchor{4318}
@deffn {Data} locale.D_T_FMT

Get a string that can be used as a format string for @ref{13f5,,time.strftime()} to
represent date and time in a locale-specific way.
@end deffn

@geindex D_FMT (in module locale)
@anchor{library/locale locale D_FMT}@anchor{4319}
@deffn {Data} locale.D_FMT

Get a string that can be used as a format string for @ref{13f5,,time.strftime()} to
represent a date in a locale-specific way.
@end deffn

@geindex T_FMT (in module locale)
@anchor{library/locale locale T_FMT}@anchor{431a}
@deffn {Data} locale.T_FMT

Get a string that can be used as a format string for @ref{13f5,,time.strftime()} to
represent a time in a locale-specific way.
@end deffn

@geindex T_FMT_AMPM (in module locale)
@anchor{library/locale locale T_FMT_AMPM}@anchor{431b}
@deffn {Data} locale.T_FMT_AMPM

Get a format string for @ref{13f5,,time.strftime()} to represent time in the am/pm
format.
@end deffn

@geindex DAY_1 (in module locale)
@geindex DAY_2 (in module locale)
@geindex DAY_3 (in module locale)
@geindex DAY_4 (in module locale)
@geindex DAY_5 (in module locale)
@geindex DAY_6 (in module locale)
@geindex DAY_7 (in module locale)
@anchor{library/locale locale DAY_1}@anchor{431c}
@deffn {Data} locale.DAY_1
@anchor{library/locale locale DAY_2}@anchor{431d}
@deffnx {Data} locale.DAY_2
@anchor{library/locale locale DAY_3}@anchor{431e}
@deffnx {Data} locale.DAY_3
@anchor{library/locale locale DAY_4}@anchor{431f}
@deffnx {Data} locale.DAY_4
@anchor{library/locale locale DAY_5}@anchor{4320}
@deffnx {Data} locale.DAY_5
@anchor{library/locale locale DAY_6}@anchor{4321}
@deffnx {Data} locale.DAY_6
@anchor{library/locale locale DAY_7}@anchor{4322}
@deffnx {Data} locale.DAY_7

Get the name of the n-th day of the week.

@cartouche
@quotation Note 
This follows the US convention of @ref{431c,,DAY_1} being Sunday, not the
international convention (ISO 8601) that Monday is the first day of the
week.
@end quotation
@end cartouche
@end deffn

@geindex ABDAY_1 (in module locale)
@geindex ABDAY_2 (in module locale)
@geindex ABDAY_3 (in module locale)
@geindex ABDAY_4 (in module locale)
@geindex ABDAY_5 (in module locale)
@geindex ABDAY_6 (in module locale)
@geindex ABDAY_7 (in module locale)
@anchor{library/locale locale ABDAY_1}@anchor{4323}
@deffn {Data} locale.ABDAY_1
@anchor{library/locale locale ABDAY_2}@anchor{4324}
@deffnx {Data} locale.ABDAY_2
@anchor{library/locale locale ABDAY_3}@anchor{4325}
@deffnx {Data} locale.ABDAY_3
@anchor{library/locale locale ABDAY_4}@anchor{4326}
@deffnx {Data} locale.ABDAY_4
@anchor{library/locale locale ABDAY_5}@anchor{4327}
@deffnx {Data} locale.ABDAY_5
@anchor{library/locale locale ABDAY_6}@anchor{4328}
@deffnx {Data} locale.ABDAY_6
@anchor{library/locale locale ABDAY_7}@anchor{4329}
@deffnx {Data} locale.ABDAY_7

Get the abbreviated name of the n-th day of the week.
@end deffn

@geindex MON_1 (in module locale)
@geindex MON_2 (in module locale)
@geindex MON_3 (in module locale)
@geindex MON_4 (in module locale)
@geindex MON_5 (in module locale)
@geindex MON_6 (in module locale)
@geindex MON_7 (in module locale)
@geindex MON_8 (in module locale)
@geindex MON_9 (in module locale)
@geindex MON_10 (in module locale)
@geindex MON_11 (in module locale)
@geindex MON_12 (in module locale)
@anchor{library/locale locale MON_1}@anchor{432a}
@deffn {Data} locale.MON_1
@anchor{library/locale locale MON_2}@anchor{432b}
@deffnx {Data} locale.MON_2
@anchor{library/locale locale MON_3}@anchor{432c}
@deffnx {Data} locale.MON_3
@anchor{library/locale locale MON_4}@anchor{432d}
@deffnx {Data} locale.MON_4
@anchor{library/locale locale MON_5}@anchor{432e}
@deffnx {Data} locale.MON_5
@anchor{library/locale locale MON_6}@anchor{432f}
@deffnx {Data} locale.MON_6
@anchor{library/locale locale MON_7}@anchor{4330}
@deffnx {Data} locale.MON_7
@anchor{library/locale locale MON_8}@anchor{4331}
@deffnx {Data} locale.MON_8
@anchor{library/locale locale MON_9}@anchor{4332}
@deffnx {Data} locale.MON_9
@anchor{library/locale locale MON_10}@anchor{4333}
@deffnx {Data} locale.MON_10
@anchor{library/locale locale MON_11}@anchor{4334}
@deffnx {Data} locale.MON_11
@anchor{library/locale locale MON_12}@anchor{4335}
@deffnx {Data} locale.MON_12

Get the name of the n-th month.
@end deffn

@geindex ABMON_1 (in module locale)
@geindex ABMON_2 (in module locale)
@geindex ABMON_3 (in module locale)
@geindex ABMON_4 (in module locale)
@geindex ABMON_5 (in module locale)
@geindex ABMON_6 (in module locale)
@geindex ABMON_7 (in module locale)
@geindex ABMON_8 (in module locale)
@geindex ABMON_9 (in module locale)
@geindex ABMON_10 (in module locale)
@geindex ABMON_11 (in module locale)
@geindex ABMON_12 (in module locale)
@anchor{library/locale locale ABMON_1}@anchor{4336}
@deffn {Data} locale.ABMON_1
@anchor{library/locale locale ABMON_2}@anchor{4337}
@deffnx {Data} locale.ABMON_2
@anchor{library/locale locale ABMON_3}@anchor{4338}
@deffnx {Data} locale.ABMON_3
@anchor{library/locale locale ABMON_4}@anchor{4339}
@deffnx {Data} locale.ABMON_4
@anchor{library/locale locale ABMON_5}@anchor{433a}
@deffnx {Data} locale.ABMON_5
@anchor{library/locale locale ABMON_6}@anchor{433b}
@deffnx {Data} locale.ABMON_6
@anchor{library/locale locale ABMON_7}@anchor{433c}
@deffnx {Data} locale.ABMON_7
@anchor{library/locale locale ABMON_8}@anchor{433d}
@deffnx {Data} locale.ABMON_8
@anchor{library/locale locale ABMON_9}@anchor{433e}
@deffnx {Data} locale.ABMON_9
@anchor{library/locale locale ABMON_10}@anchor{433f}
@deffnx {Data} locale.ABMON_10
@anchor{library/locale locale ABMON_11}@anchor{4340}
@deffnx {Data} locale.ABMON_11
@anchor{library/locale locale ABMON_12}@anchor{4341}
@deffnx {Data} locale.ABMON_12

Get the abbreviated name of the n-th month.
@end deffn

@geindex RADIXCHAR (in module locale)
@anchor{library/locale locale RADIXCHAR}@anchor{4342}
@deffn {Data} locale.RADIXCHAR

Get the radix character (decimal dot, decimal comma, etc.).
@end deffn

@geindex THOUSEP (in module locale)
@anchor{library/locale locale THOUSEP}@anchor{4343}
@deffn {Data} locale.THOUSEP

Get the separator character for thousands (groups of three digits).
@end deffn

@geindex YESEXPR (in module locale)
@anchor{library/locale locale YESEXPR}@anchor{4344}
@deffn {Data} locale.YESEXPR

Get a regular expression that can be used with the regex function to
recognize a positive response to a yes/no question.
@end deffn

@geindex NOEXPR (in module locale)
@anchor{library/locale locale NOEXPR}@anchor{4345}
@deffn {Data} locale.NOEXPR

Get a regular expression that can be used with the @code{regex(3)} function to
recognize a negative response to a yes/no question.

@cartouche
@quotation Note 
The regular expressions for @ref{4344,,YESEXPR} and
@ref{4345,,NOEXPR} use syntax suitable for the
@code{regex} function from the C library, which might
differ from the syntax used in @ref{be,,re}.
@end quotation
@end cartouche
@end deffn

@geindex CRNCYSTR (in module locale)
@anchor{library/locale locale CRNCYSTR}@anchor{4346}
@deffn {Data} locale.CRNCYSTR

Get the currency symbol, preceded by “-” if the symbol should appear before
the value, “+” if the symbol should appear after the value, or “.” if the
symbol should replace the radix character.
@end deffn

@geindex ERA (in module locale)
@anchor{library/locale locale ERA}@anchor{4347}
@deffn {Data} locale.ERA

Get a string which describes how years are counted and displayed for
each era in a locale.

Most locales do not define this value.  An example of a locale which does
define this value is the Japanese one.  In Japan, the traditional
representation of dates includes the name of the era corresponding to the
then-emperor’s reign.

Normally it should not be necessary to use this value directly. Specifying
the @code{E} modifier in their format strings causes the @ref{13f5,,time.strftime()}
function to use this information.
The format of the returned string is specified in `The Open Group Base
Specifications Issue 8', paragraph 7.3.5.2 LC_TIME C-Language Access@footnote{https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/V1_chap07.html#tag_07_03_05_02}.
@end deffn

@geindex ERA_D_T_FMT (in module locale)
@anchor{library/locale locale ERA_D_T_FMT}@anchor{4348}
@deffn {Data} locale.ERA_D_T_FMT

Get a format string for @ref{13f5,,time.strftime()} to represent date and time in a
locale-specific era-based way.
@end deffn

@geindex ERA_D_FMT (in module locale)
@anchor{library/locale locale ERA_D_FMT}@anchor{4349}
@deffn {Data} locale.ERA_D_FMT

Get a format string for @ref{13f5,,time.strftime()} to represent a date in a
locale-specific era-based way.
@end deffn

@geindex ERA_T_FMT (in module locale)
@anchor{library/locale locale ERA_T_FMT}@anchor{434a}
@deffn {Data} locale.ERA_T_FMT

Get a format string for @ref{13f5,,time.strftime()} to represent a time in a
locale-specific era-based way.
@end deffn

@geindex ALT_DIGITS (in module locale)
@anchor{library/locale locale ALT_DIGITS}@anchor{434b}
@deffn {Data} locale.ALT_DIGITS

Get a string consisting of up to 100 semicolon-separated symbols used
to represent the values 0 to 99 in a locale-specific way.
In most locales this is an empty string.
@end deffn

The function temporarily sets the @code{LC_CTYPE} locale to the locale
of the category that determines the requested value (@code{LC_TIME},
@code{LC_NUMERIC}, @code{LC_MONETARY} or @code{LC_MESSAGES}) if locales are
different and the resulting string is non-ASCII.
This temporary change affects other threads.


Changed in version 3.14: The function now temporarily sets the @code{LC_CTYPE} locale in some cases.

@end deffn

@geindex getdefaultlocale() (in module locale)
@anchor{library/locale locale getdefaultlocale}@anchor{930}
@deffn {Function} locale.getdefaultlocale ([envvars])

Tries to determine the default locale settings and returns them as a tuple of
the form @code{(language code, encoding)}.

According to POSIX, a program which has not called @code{setlocale(LC_ALL, '@w{'})}
runs using the portable @code{'C'} locale.  Calling @code{setlocale(LC_ALL, '@w{'})} lets
it use the default locale as defined by the 
@geindex LANG
@geindex environment variable; LANG
@code{LANG} variable.  Since we
do not want to interfere with the current locale setting we thus emulate the
behavior in the way described above.

To maintain compatibility with other platforms, not only the 
@geindex LANG
@geindex environment variable; LANG
@code{LANG}
variable is tested, but a list of variables given as envvars parameter.  The
first found to be defined will be used.  `envvars' defaults to the search
path used in GNU gettext; it must always contain the variable name
@code{'LANG'}.  The GNU gettext search path contains @code{'LC_ALL'},
@code{'LC_CTYPE'}, @code{'LANG'} and @code{'LANGUAGE'}, in that order.

The language code has the same format as a @ref{4314,,locale name},
but without encoding and @code{@@}-modifier.
The language code and encoding may be @code{None} if their values cannot be
determined.
The “C” locale is represented as @code{(None, None)}.
@end deffn

@geindex getlocale() (in module locale)
@anchor{library/locale locale getlocale}@anchor{932}
@deffn {Function} locale.getlocale (category=LC_CTYPE)

Returns the current setting for the given locale category as a tuple containing
the language code and encoding. `category' may be one of the @code{LC_*}
values except @ref{434c,,LC_ALL}.  It defaults to @ref{434d,,LC_CTYPE}.

The language code has the same format as a @ref{4314,,locale name},
but without encoding and @code{@@}-modifier.
The language code and encoding may be @code{None} if their values cannot be
determined.
The “C” locale is represented as @code{(None, None)}.
@end deffn

@geindex getpreferredencoding() (in module locale)
@anchor{library/locale locale getpreferredencoding}@anchor{75d}
@deffn {Function} locale.getpreferredencoding (do_setlocale=True)

Return the @ref{54b,,locale encoding} used for text data, according to user
preferences.  User preferences are expressed differently on different
systems, and might not be available programmatically on some systems, so
this function only returns a guess.

On some systems, it is necessary to invoke @ref{931,,setlocale()} to obtain the
user preferences, so this function is not thread-safe. If invoking setlocale
is not necessary or desired, `do_setlocale' should be set to @code{False}.

On Android or if the @ref{868,,Python UTF-8 Mode} is enabled, always
return @code{'utf-8'}, the @ref{54b,,locale encoding} and the `do_setlocale'
argument are ignored.

The @ref{434e,,Python preinitialization} configures the LC_CTYPE
locale. See also the @ref{75e,,filesystem encoding and error handler}.


Changed in version 3.7: The function now always returns @code{"utf-8"} on Android or if the
@ref{868,,Python UTF-8 Mode} is enabled.

@end deffn

@geindex getencoding() (in module locale)
@anchor{library/locale locale getencoding}@anchor{867}
@deffn {Function} locale.getencoding ()

Get the current @ref{54b,,locale encoding}:


@itemize *

@item 
On Android and VxWorks, return @code{"utf-8"}.

@item 
On Unix, return the encoding of the current @ref{434d,,LC_CTYPE} locale.
Return @code{"utf-8"} if @code{nl_langinfo(CODESET)} returns an empty string:
for example, if the current LC_CTYPE locale is not supported.

@item 
On Windows, return the ANSI code page.
@end itemize

The @ref{434e,,Python preinitialization} configures the LC_CTYPE
locale. See also the @ref{75e,,filesystem encoding and error handler}.

This function is similar to
@ref{75d,,getpreferredencoding(False)} except this
function ignores the @ref{868,,Python UTF-8 Mode}.


Added in version 3.11.

@end deffn

@geindex normalize() (in module locale)
@anchor{library/locale locale normalize}@anchor{434f}
@deffn {Function} locale.normalize (localename)

Returns a normalized locale code for the given locale name.  The returned locale
code is formatted for use with @ref{931,,setlocale()}.  If normalization fails, the
original name is returned unchanged.

If the given encoding is not known, the function defaults to the default
encoding for the locale code just like @ref{931,,setlocale()}.
@end deffn

@geindex strcoll() (in module locale)
@anchor{library/locale locale strcoll}@anchor{4350}
@deffn {Function} locale.strcoll (string1, string2)

Compares two strings according to the current @ref{4351,,LC_COLLATE} setting. As
any other compare function, returns a negative, or a positive value, or @code{0},
depending on whether `string1' collates before or after `string2' or is equal to
it.
@end deffn

@geindex strxfrm() (in module locale)
@anchor{library/locale locale strxfrm}@anchor{180c}
@deffn {Function} locale.strxfrm (string)

Transforms a string to one that can be used in locale-aware
comparisons.  For example, @code{strxfrm(s1) < strxfrm(s2)} is
equivalent to @code{strcoll(s1, s2) < 0}.  This function can be used
when the same string is compared repeatedly, e.g. when collating a
sequence of strings.
@end deffn

@geindex format_string() (in module locale)
@anchor{library/locale locale format_string}@anchor{743}
@deffn {Function} locale.format_string (format, val, grouping=False, monetary=False)

Formats a number `val' according to the current @ref{27b0,,LC_NUMERIC} setting.
The format follows the conventions of the @code{%} operator.  For floating-point
values, the decimal point is modified if appropriate.  If `grouping' is @code{True},
also takes the grouping into account.

If `monetary' is true, the conversion uses monetary thousands separator and
grouping strings.

Processes formatting specifiers as in @code{format % val}, but takes the current
locale settings into account.


Changed in version 3.7: The `monetary' keyword parameter was added.

@end deffn

@geindex currency() (in module locale)
@anchor{library/locale locale currency}@anchor{4352}
@deffn {Function} locale.currency (val, symbol=True, grouping=False, international=False)

Formats a number `val' according to the current @ref{4316,,LC_MONETARY} settings.

The returned string includes the currency symbol if `symbol' is true, which is
the default. If `grouping' is @code{True} (which is not the default), grouping is done
with the value. If `international' is @code{True} (which is not the default), the
international currency symbol is used.

@cartouche
@quotation Note 
This function will not work with the ‘C’ locale, so you have to set a
locale via @ref{931,,setlocale()} first.
@end quotation
@end cartouche
@end deffn

@geindex str() (in module locale)
@anchor{library/locale locale str}@anchor{4353}
@deffn {Function} locale.str (float)

Formats a floating-point number using the same format as the built-in function
@code{str(float)}, but takes the decimal point into account.
@end deffn

@geindex delocalize() (in module locale)
@anchor{library/locale locale delocalize}@anchor{102c}
@deffn {Function} locale.delocalize (string)

Converts a string into a normalized number string, following the
@ref{27b0,,LC_NUMERIC} settings.


Added in version 3.5.

@end deffn

@geindex localize() (in module locale)
@anchor{library/locale locale localize}@anchor{4354}
@deffn {Function} locale.localize (string, grouping=False, monetary=False)

Converts a normalized number string into a formatted string following the
@ref{27b0,,LC_NUMERIC} settings.


Added in version 3.10.

@end deffn

@geindex atof() (in module locale)
@anchor{library/locale locale atof}@anchor{4355}
@deffn {Function} locale.atof (string, func=float)

Converts a string to a number, following the @ref{27b0,,LC_NUMERIC} settings,
by calling `func' on the result of calling @ref{102c,,delocalize()} on `string'.
@end deffn

@geindex atoi() (in module locale)
@anchor{library/locale locale atoi}@anchor{4356}
@deffn {Function} locale.atoi (string)

Converts a string to an integer, following the @ref{27b0,,LC_NUMERIC} conventions.
@end deffn

@geindex LC_CTYPE (in module locale)
@anchor{library/locale locale LC_CTYPE}@anchor{434d}
@deffn {Data} locale.LC_CTYPE

Locale category for the character type functions.  Most importantly, this
category defines the text encoding, i.e. how bytes are interpreted as
Unicode codepoints.  See 
@geindex Python Enhancement Proposals; PEP 538
PEP 538@footnote{https://peps.python.org/pep-0538/} and 
@geindex Python Enhancement Proposals; PEP 540
PEP 540@footnote{https://peps.python.org/pep-0540/} for how this variable
might be automatically coerced to @code{C.UTF-8} to avoid issues created by
invalid settings in containers or incompatible settings passed over remote
SSH connections.

Python doesn’t internally use locale-dependent character transformation functions
from @code{ctype.h}. Instead, @code{pyctype.h} provides locale-independent
equivalents like @ref{1564,,Py_TOLOWER}.
@end deffn

@geindex LC_COLLATE (in module locale)
@anchor{library/locale locale LC_COLLATE}@anchor{4351}
@deffn {Data} locale.LC_COLLATE

Locale category for sorting strings.  The functions @ref{4350,,strcoll()} and
@ref{180c,,strxfrm()} of the @code{locale} module are affected.
@end deffn

@geindex LC_TIME (in module locale)
@anchor{library/locale locale LC_TIME}@anchor{4357}
@deffn {Data} locale.LC_TIME

Locale category for the formatting of time.  The function @ref{13f5,,time.strftime()}
follows these conventions.
@end deffn

@geindex LC_MONETARY (in module locale)
@anchor{library/locale locale LC_MONETARY}@anchor{4316}
@deffn {Data} locale.LC_MONETARY

Locale category for formatting of monetary values.  The available options are
available from the @ref{dfe,,localeconv()} function.
@end deffn

@geindex LC_MESSAGES (in module locale)
@anchor{library/locale locale LC_MESSAGES}@anchor{4358}
@deffn {Data} locale.LC_MESSAGES

Locale category for message display. Python currently does not support
application specific locale-aware messages.  Messages displayed by the operating
system, like those returned by @ref{3094,,os.strerror()} might be affected by this
category.

This value may not be available on operating systems not conforming to the
POSIX standard, most notably Windows.
@end deffn

@geindex LC_NUMERIC (in module locale)
@anchor{library/locale locale LC_NUMERIC}@anchor{27b0}
@deffn {Data} locale.LC_NUMERIC

Locale category for formatting numbers.  The functions @ref{743,,format_string()},
@ref{4356,,atoi()}, @ref{4355,,atof()} and @ref{4353,,str()} of the @code{locale} module are
affected by that category.  All other numeric formatting operations are not
affected.
@end deffn

@geindex LC_ALL (in module locale)
@anchor{library/locale locale LC_ALL}@anchor{434c}
@deffn {Data} locale.LC_ALL

Combination of all locale settings.  If this flag is used when the locale is
changed, setting the locale for all categories is attempted. If that fails for
any category, no category is changed at all.  When the locale is retrieved using
this flag, a string indicating the setting for all categories is returned. This
string can be later used to restore the settings.
@end deffn

@geindex CHAR_MAX (in module locale)
@anchor{library/locale locale CHAR_MAX}@anchor{4315}
@deffn {Data} locale.CHAR_MAX

This is a symbolic constant used for different values returned by
@ref{dfe,,localeconv()}.
@end deffn

@menu
* Background@comma{} details@comma{} hints@comma{} tips and caveats: Background details hints tips and caveats. 
* Locale names:: 
* For extension writers and programs that embed Python:: 
* Access to message catalogs:: 

@end menu

@node Background details hints tips and caveats,Locale names,,locale — Internationalization services
@anchor{library/locale background-details-hints-tips-and-caveats}@anchor{4359}
@subsubsection Background, details, hints, tips and caveats


The C standard defines the locale as a program-wide property that may be
relatively expensive to change.  On top of that, some implementations are broken
in such a way that frequent locale changes may cause core dumps.  This makes the
locale somewhat painful to use correctly.

Initially, when a program is started, the locale is the @code{C} locale, no matter
what the user’s preferred locale is.  There is one exception: the
@ref{434d,,LC_CTYPE} category is changed at startup to set the current locale
encoding to the user’s preferred locale encoding. The program must explicitly
say that it wants the user’s preferred locale settings for other categories by
calling @code{setlocale(LC_ALL, '@w{'})}.

It is generally a bad idea to call @ref{931,,setlocale()} in some library routine,
since as a side effect it affects the entire program.  Saving and restoring it
is almost as bad: it is expensive and affects other threads that happen to run
before the settings have been restored.

If, when coding a module for general use, you need a locale independent version
of an operation that is affected by the locale (such as
certain formats used with @ref{13f5,,time.strftime()}), you will have to find a way to
do it without using the standard library routine.  Even better is convincing
yourself that using locale settings is okay.  Only as a last resort should you
document that your module is not compatible with non-@code{C} locale settings.

The only way to perform numeric operations according to the locale is to use the
special functions defined by this module: @ref{4355,,atof()}, @ref{4356,,atoi()},
@ref{743,,format_string()}, @ref{4353,,str()}.

There is no way to perform case conversions and character classifications
according to the locale.  For (Unicode) text strings these are done according
to the character value only, while for byte strings, the conversions and
classifications are done according to the ASCII value of the byte, and bytes
whose high bit is set (i.e., non-ASCII bytes) are never converted or considered
part of a character class such as letter or whitespace.

@node Locale names,For extension writers and programs that embed Python,Background details hints tips and caveats,locale — Internationalization services
@anchor{library/locale locale-name}@anchor{4314}@anchor{library/locale locale-names}@anchor{435a}
@subsubsection Locale names


The format of the locale name is platform dependent, and the set of supported
locales can depend on the system configuration.

On Posix platforms, it usually has the format @footnote{
@uref{https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/V1_chap08.html#tag_08_02,IEEE Std 1003.1-2024; 8.2 Internationalization Variables}
}:

@example
  language ["_" territory] ["." charset] ["@@" modifier]
@end example

where `language' is a two- or three-letter language code from ISO 639@footnote{https://www.iso.org/iso-639-language-code},
`territory' is a two-letter country or region code from ISO 3166@footnote{https://www.iso.org/iso-3166-country-codes.html},
`charset' is a locale encoding, and `modifier' is a script name,
a language subtag, a sort order identifier, or other locale modifier
(for example, “latin”, “valencia”, “stroke” and “euro”).

On Windows, several formats are supported. @footnote{
@uref{https://learn.microsoft.com/en-us/cpp/c-runtime-library/locale-names-languages-and-country-region-strings,UCRT Locale names@comma{} Languages@comma{} and Country/Region strings}
} @footnote{
@uref{https://learn.microsoft.com/en-us/windows/win32/intl/locale-names,Locale Names}
}
A subset of IETF BCP 47@footnote{https://www.rfc-editor.org/info/bcp47} tags:

@example
  language ["-" script] ["-" territory] ["." charset]
  language ["-" script] "-" territory "-" modifier
@end example

where `language' and `territory' have the same meaning as in Posix,
`script' is a four-letter script code from ISO 15924@footnote{https://www.unicode.org/iso15924/},
and `modifier' is a language subtag, a sort order identifier
or custom modifier (for example, “valencia”, “stroke” or “x-python”).
Both hyphen (@code{'-'}) and underscore (@code{'_'}) separators are supported.
Only UTF-8 encoding is allowed for BCP 47 tags.

Windows also supports locale names in the format:

@example
  language ["_" territory] ["." charset]
@end example

where `language' and `territory' are full names, such as “English” and
“United States”, and `charset' is either a code page number (for example, “1252”)
or UTF-8.
Only the underscore separator is supported in this format.

The “C” locale is supported on all platforms.

@node For extension writers and programs that embed Python,Access to message catalogs,Locale names,locale — Internationalization services
@anchor{library/locale embedding-locale}@anchor{435b}@anchor{library/locale for-extension-writers-and-programs-that-embed-python}@anchor{435c}
@subsubsection For extension writers and programs that embed Python


Extension modules should never call @ref{931,,setlocale()}, except to find out what
the current locale is.  But since the return value can only be used portably to
restore it, that is not very useful (except perhaps to find out whether or not
the locale is @code{C}).

When Python code uses the @code{locale} module to change the locale, this also
affects the embedding application.  If the embedding application doesn’t want
this to happen, it should remove the @code{_locale} extension module (which does
all the work) from the table of built-in modules in the @code{config.c} file,
and make sure that the @code{_locale} module is not accessible as a shared
library.

@node Access to message catalogs,,For extension writers and programs that embed Python,locale — Internationalization services
@anchor{library/locale access-to-message-catalogs}@anchor{435d}@anchor{library/locale locale-gettext}@anchor{435e}
@subsubsection Access to message catalogs


@geindex gettext() (in module locale)
@anchor{library/locale locale gettext}@anchor{435f}
@deffn {Function} locale.gettext (msg)
@end deffn

@geindex dgettext() (in module locale)
@anchor{library/locale locale dgettext}@anchor{4360}
@deffn {Function} locale.dgettext (domain, msg)
@end deffn

@geindex dcgettext() (in module locale)
@anchor{library/locale locale dcgettext}@anchor{4361}
@deffn {Function} locale.dcgettext (domain, msg, category)
@end deffn

@geindex textdomain() (in module locale)
@anchor{library/locale locale textdomain}@anchor{4362}
@deffn {Function} locale.textdomain (domain)
@end deffn

@geindex bindtextdomain() (in module locale)
@anchor{library/locale locale bindtextdomain}@anchor{4363}
@deffn {Function} locale.bindtextdomain (domain, dir)
@end deffn

@geindex bind_textdomain_codeset() (in module locale)
@anchor{library/locale locale bind_textdomain_codeset}@anchor{4364}
@deffn {Function} locale.bind_textdomain_codeset (domain, codeset)
@end deffn

The locale module exposes the C library’s gettext interface on systems that
provide this interface.  It consists of the functions @ref{67,,gettext()},
@ref{4360,,dgettext()}, @ref{4361,,dcgettext()}, @ref{4362,,textdomain()}, @ref{4363,,bindtextdomain()},
and @ref{4364,,bind_textdomain_codeset()}.  These are similar to the same functions in
the @ref{67,,gettext} module, but use the C library’s binary format for message
catalogs, and the C library’s search algorithms for locating message catalogs.

Python applications should normally find no need to invoke these functions, and
should use @ref{67,,gettext} instead.  A known exception to this rule are
applications that link with additional C libraries which internally invoke
C functions @code{gettext} or @code{dcgettext}.  For these applications, it may be
necessary to bind the text domain, so that the libraries can properly locate
their message catalogs.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Graphical user interfaces with Tk,Development Tools,Internationalization,The Python Standard Library
@anchor{library/tk doc}@anchor{4365}@anchor{library/tk graphical-user-interfaces-with-tk}@anchor{4366}@anchor{library/tk tkinter}@anchor{4367}@anchor{library/tk translation-repo}@anchor{4368}
@section Graphical user interfaces with Tk


@geindex GUI
@geindex Graphical User Interface
@geindex Tkinter
@geindex Tk

Tk/Tcl has long been an integral part of Python.  It provides a robust and
platform independent windowing toolkit, that is available to Python programmers
using the @ref{f6,,tkinter} package, and its extension, the @ref{100,,tkinter.ttk} module.

The @ref{f6,,tkinter} package is a thin object-oriented layer on top of Tcl/Tk. To
use @code{tkinter}, you don’t need to write Tcl code, but you will need to
consult the Tk documentation, and occasionally the Tcl documentation.
@code{tkinter} is a set of wrappers that implement the Tk widgets as Python
classes.

@ref{f6,,tkinter}’s chief virtues are that it is fast, and that it usually comes
bundled with Python. Although its standard documentation is weak, good
material is available, which includes: references, tutorials, a book and
others. @code{tkinter} is also famous for having an outdated look and feel,
which has been vastly improved in Tk 8.5. Nevertheless, there are many other
GUI libraries that you could be interested in. The Python wiki lists several
alternative GUI frameworks and tools@footnote{https://wiki.python.org/moin/GuiProgramming}.

@menu
* tkinter — Python interface to Tcl/Tk:: 
* tkinter.colorchooser — Color choosing dialog: tkinter colorchooser — Color choosing dialog. 
* tkinter.font — Tkinter font wrapper: tkinter font — Tkinter font wrapper. 
* Tkinter dialogs:: 
* tkinter.messagebox — Tkinter message prompts: tkinter messagebox — Tkinter message prompts. 
* tkinter.scrolledtext — Scrolled text widget: tkinter scrolledtext — Scrolled text widget. 
* tkinter.dnd — Drag and drop support: tkinter dnd — Drag and drop support. 
* tkinter.ttk — Tk themed widgets: tkinter ttk — Tk themed widgets. 
* IDLE — Python editor and shell: IDLE — Python editor and shell<2>. 
* turtle — Turtle graphics:: 

@end menu

@node tkinter — Python interface to Tcl/Tk,tkinter colorchooser — Color choosing dialog,,Graphical user interfaces with Tk
@anchor{library/tkinter doc}@anchor{4369}@anchor{library/tkinter module-tkinter}@anchor{f6}@anchor{library/tkinter tkinter-python-interface-to-tcl-tk}@anchor{436a}
@subsection @code{tkinter} — Python interface to Tcl/Tk


@geindex module; tkinter

`Source code:' Lib/tkinter/__init__.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/tkinter/__init__.py}


__________________________________________________________________


The @code{tkinter} package (“Tk interface”) is the standard Python interface to
the Tcl/Tk GUI toolkit.  Both Tk and @code{tkinter} are available on most Unix
platforms, including macOS, as well as on Windows systems.

Running @code{python -m tkinter} from the command line should open a window
demonstrating a simple Tk interface, letting you know that @code{tkinter} is
properly installed on your system, and also showing what version of Tcl/Tk is
installed, so you can read the Tcl/Tk documentation specific to that version.

Tkinter supports a range of Tcl/Tk versions, built either with or without
thread support.
Tcl/Tk 8.5.12 is the minimum supported version; the official Python binary
release bundles Tcl/Tk 8.6.
See the source code for the @ref{3,,_tkinter} module for more information about
supported versions.


Changed in version 3.11: Support for Tcl/Tk versions older than 8.5.12 was removed.


Tkinter is not a thin wrapper, but adds a fair amount of its own logic to
make the experience more pythonic. This documentation will concentrate on these
additions and changes, and refer to the official Tcl/Tk documentation for
details that are unchanged.

@cartouche
@quotation Note 
Tcl/Tk 8.5 (2007) introduced a modern set of themed user interface components
along with a new API to use them. Both old and new APIs are still available.
Most documentation you will find online still uses the old API and
can be woefully outdated.
@end quotation
@end cartouche

This is an @ref{219c,,optional module}.
If it is missing from your copy of CPython,
look for documentation from your distributor (that is,
whoever provided Python to you).
If you are the distributor, see @ref{219a,,Requirements for optional modules}.

@c Similar notes appear in the docs of the modules:
@c - zipfile
@c - tarfile


@subsubheading See also



@itemize *

@item 

@table @asis

@item TkDocs@footnote{https://tkdocs.com/}

Extensive tutorial on creating user interfaces with Tkinter.  Explains key concepts,
and illustrates recommended approaches using the modern API.
@end table

@item 

@table @asis

@item Tkinter 8.5 reference: a GUI for Python@footnote{https://www.tkdocs.com/shipman/}

Reference documentation for Tkinter 8.5 detailing available classes, methods, and options.
@end table
@end itemize

Tcl/Tk Resources:


@itemize *

@item 

@table @asis

@item Tk commands@footnote{https://www.tcl-lang.org/man/tcl9.0/TkCmd/index.html}

Comprehensive reference to each of the underlying Tcl/Tk commands used by Tkinter.
@end table

@item 

@table @asis

@item Tcl/Tk Home Page@footnote{https://www.tcl.tk}

Additional documentation, and links to Tcl/Tk core development.
@end table
@end itemize

Books:


@itemize *

@item 

@table @asis

@item Modern Tkinter for Busy Python Developers@footnote{https://tkdocs.com/book.html}

By Mark Roseman. (ISBN 978-1999149567)
@end table

@item 

@table @asis

@item Python GUI programming with Tkinter@footnote{https://www.packtpub.com/en-us/product/python-gui-programming-with-tkinter-9781788835886}

By Alan D. Moore. (ISBN 978-1788835886)
@end table

@item 

@table @asis

@item Programming Python@footnote{https://learning-python.com/about-pp4e.html}

By Mark Lutz; has excellent coverage of Tkinter. (ISBN 978-0596158101)
@end table

@item 

@table @asis

@item Tcl and the Tk Toolkit (2nd edition)@footnote{https://www.amazon.com/exec/obidos/ASIN/032133633X}

By John Ousterhout, inventor of Tcl/Tk, and Ken Jones; does not cover Tkinter. (ISBN 978-0321336330)
@end table
@end itemize


@menu
* Architecture:: 
* Tkinter modules:: 
* Tkinter life preserver:: 
* Threading model:: 
* Handy reference:: 
* File handlers:: 
* Reference: Reference<8>. 

@end menu

@node Architecture,Tkinter modules,,tkinter — Python interface to Tcl/Tk
@anchor{library/tkinter architecture}@anchor{436b}
@subsubsection Architecture


Tcl/Tk is not a single library but rather consists of a few distinct
modules, each with separate functionality and its own official
documentation. Python’s binary releases also ship an add-on module
together with it.


@table @asis

@item Tcl

Tcl is a dynamic interpreted programming language, just like Python. Though
it can be used on its own as a general-purpose programming language, it is
most commonly embedded into C applications as a scripting engine or an
interface to the Tk toolkit. The Tcl library has a C interface to
create and manage one or more instances of a Tcl interpreter, run Tcl
commands and scripts in those instances, and add custom commands
implemented in either Tcl or C. Each interpreter has an event queue,
and there are facilities to send events to it and process them.
Unlike Python, Tcl’s execution model is designed around cooperative
multitasking, and Tkinter bridges this difference
(see @ref{436c,,Threading model} for details).

@item Tk

Tk is a Tcl package@footnote{https://wiki.tcl-lang.org/37432} implemented in C
that adds custom commands to create and manipulate GUI widgets. Each
@ref{19ee,,Tk} object embeds its own Tcl interpreter instance with Tk loaded into
it. Tk’s widgets are very customizable, though at the cost of a dated appearance.
Tk uses Tcl’s event queue to generate and process GUI events.

@item Ttk

Themed Tk (Ttk) is a newer family of Tk widgets that provide a much better
appearance on different platforms than many of the classic Tk widgets.
Ttk is distributed as part of Tk, starting with Tk version 8.5. Python
bindings are provided in a separate module, @ref{100,,tkinter.ttk}.
@end table

Internally, Tk and Ttk use facilities of the underlying operating system,
that is, Xlib on Unix/X11, Cocoa on macOS, GDI on Windows.

When your Python application uses a class in Tkinter, for example, to create a widget,
the @code{tkinter} module first assembles a Tcl/Tk command string. It passes that
Tcl command string to an internal @ref{3,,_tkinter} binary module, which then
calls the Tcl interpreter to evaluate it. The Tcl interpreter will then call into the
Tk and/or Ttk packages, which will in turn make calls to Xlib, Cocoa, or GDI.

@node Tkinter modules,Tkinter life preserver,Architecture,tkinter — Python interface to Tcl/Tk
@anchor{library/tkinter tkinter-modules}@anchor{436d}
@subsubsection Tkinter modules


Support for Tkinter is spread across several modules. Most applications will need the
main @code{tkinter} module, as well as the @ref{100,,tkinter.ttk} module, which provides
the modern themed widget set and API:

@example
from tkinter import *
from tkinter import ttk
@end example

@geindex Tk (class in tkinter)
@anchor{library/tkinter tkinter Tk}@anchor{19ee}
@deffn {Class} tkinter.Tk (screenName=None, baseName=None, className='Tk', useTk=True, sync=False, use=None)

Construct a toplevel Tk widget, which is usually the main window of an
application, and initialize a Tcl interpreter for this widget.  Each
instance has its own associated Tcl interpreter.

The @code{Tk} class is typically instantiated using all default values.
However, the following keyword arguments are currently recognized:


@table @asis

@item `screenName'

When given (as a string), sets the 
@geindex DISPLAY
@geindex environment variable; DISPLAY
@code{DISPLAY} environment
variable. (X11 only)

@item `baseName'

Name of the profile file.  By default, `baseName' is derived from the
program name (@code{sys.argv[0]}).

@item `className'

Name of the widget class.  Used as a profile file and also as the name
with which Tcl is invoked (`argv0' in `interp').

@item `useTk'

If @code{True}, initialize the Tk subsystem.  The @ref{436e,,tkinter.Tcl()}
function sets this to @code{False}.

@item `sync'

If @code{True}, execute all X server commands synchronously, so that errors
are reported immediately.  Can be used for debugging. (X11 only)

@item `use'

Specifies the `id' of the window in which to embed the application,
instead of it being created as an independent toplevel window. `id' must
be specified in the same way as the value for the -use option for
toplevel widgets (that is, it has a form like that returned by
@ref{436f,,winfo_id()}).

Note that on some platforms this will only work correctly if `id' refers
to a Tk frame or toplevel that has its -container option enabled.
@end table

@code{Tk} reads and interprets profile files, named
@code{.`className'.tcl} and @code{.`baseName'.tcl}, into the Tcl
interpreter and calls @ref{4a3,,exec()} on the contents of
@code{.`className'.py} and @code{.`baseName'.py}.  The path for the
profile files is the 
@geindex HOME
@geindex environment variable; HOME
@code{HOME} environment variable or, if that
isn’t defined, then @ref{2cc8,,os.curdir}.

@geindex tk (tkinter.Tk attribute)
@anchor{library/tkinter tkinter Tk tk}@anchor{4370}
@deffn {Attribute} tk

The Tk application object created by instantiating @code{Tk}.  This
provides access to the Tcl interpreter.  Each widget that is attached
the same instance of @code{Tk} has the same value for its @ref{4370,,tk}
attribute.
@end deffn

@geindex master (tkinter.Tk attribute)
@anchor{library/tkinter tkinter Tk master}@anchor{4371}
@deffn {Attribute} master

The widget object that contains this widget.
For @code{Tk}, the @code{master} is @ref{887,,None} because it is the
main window.
The terms `master' and `parent' are similar and sometimes used
interchangeably as argument names; however, calling
@ref{4372,,winfo_parent()} returns a string of the widget name whereas
@code{master} returns the object.
`parent'/`child' reflects the tree-like relationship while `master' (or
`container')/`content' reflects the container structure.
@end deffn

@geindex children (tkinter.Tk attribute)
@anchor{library/tkinter tkinter Tk children}@anchor{4373}
@deffn {Attribute} children

The immediate descendants of this widget as a @ref{184,,dict} with the
child widget names as the keys and the child instance objects as the
values.
@end deffn

@geindex destroy() (tkinter.Tk method)
@anchor{library/tkinter tkinter Tk destroy}@anchor{4374}
@deffn {Method} destroy ()

Destroy this and all descendant widgets and, for the main window, end the
connection to the underlying Tcl interpreter.
@end deffn

@geindex loadtk() (tkinter.Tk method)
@anchor{library/tkinter tkinter Tk loadtk}@anchor{4375}
@deffn {Method} loadtk ()

Finish loading and initializing the Tk subsystem.
This is needed only when the interpreter was created without Tk (for
example through @ref{436e,,Tcl()}); it is called automatically when `useTk' is
true.
@end deffn

@geindex readprofile() (tkinter.Tk method)
@anchor{library/tkinter tkinter Tk readprofile}@anchor{4376}
@deffn {Method} readprofile (baseName, className)

Read and source the user’s profile files @code{.`className'.tcl} and
@code{.`baseName'.tcl} into the Tcl interpreter, and execute the
corresponding @code{.`className'.py} and @code{.`baseName'.py} files.
This is called during initialization; see the description of the
constructor above.
@end deffn

@geindex report_callback_exception() (tkinter.Tk method)
@anchor{library/tkinter tkinter Tk report_callback_exception}@anchor{4377}
@deffn {Method} report_callback_exception (exc, val, tb)

Report a callback exception.
This is called when an exception propagates out of a Tkinter callback;
`exc', `val' and `tb' are the exception type, value and traceback as
returned by @ref{89c,,sys.exc_info()}.
The default implementation prints a traceback to @ref{b39,,sys.stderr}.
It can be overridden to customize error handling, for example to display
the traceback in a dialog.
@end deffn
@end deffn

@geindex Tcl() (in module tkinter)
@anchor{library/tkinter tkinter Tcl}@anchor{436e}
@deffn {Function} tkinter.Tcl (screenName=None, baseName=None, className='Tk', useTk=False)

The @code{Tcl()} function is a factory function which creates an object much
like that created by the @ref{19ee,,Tk} class, except that it does not
initialize the Tk subsystem.
This is most often useful when driving the Tcl interpreter in an environment
where one doesn’t want to create extraneous toplevel windows, or where one
cannot (such as Unix/Linux systems without an X server).
An object created by the @code{Tcl()} object can have a Toplevel window
created (and the Tk subsystem initialized) by calling its @ref{4375,,loadtk()}
method.
@end deffn

The modules that provide Tk support include:


@table @asis

@item @code{tkinter}

Main Tkinter module.

@item @ref{f7,,tkinter.colorchooser}

Dialog to let the user choose a color.

@item @ref{f8,,tkinter.commondialog}

Base class for the dialogs defined in the other modules listed here.

@item @ref{fb,,tkinter.filedialog}

Common dialogs to allow the user to specify a file to open or save.

@item @ref{fc,,tkinter.font}

Utilities to help work with fonts.

@item @ref{fd,,tkinter.messagebox}

Access to standard Tk dialog boxes.

@item @ref{fe,,tkinter.scrolledtext}

Text widget with a vertical scroll bar built in.

@item @ref{ff,,tkinter.simpledialog}

Basic dialogs and convenience functions.

@item @ref{100,,tkinter.ttk}

Themed widget set introduced in Tk 8.5, providing modern alternatives
for many of the classic widgets in the main @code{tkinter} module.
@end table

Additional modules:

@geindex module; _tkinter
@anchor{library/tkinter module-_tkinter}@anchor{3}

@table @asis

@item @ref{3,,_tkinter}

A binary module that contains the low-level interface to Tcl/Tk.
It is automatically imported by the main @code{tkinter} module,
and should never be used directly by application programmers.
It is usually a shared library (or DLL), but might in some cases be
statically linked with the Python interpreter.

@item @ref{77,,idlelib}

Python’s Integrated Development and Learning Environment (IDLE). Based
on @code{tkinter}.

@item @code{tkinter.constants}

Symbolic constants that can be used in place of strings when passing
various parameters to Tkinter calls. Automatically imported by the
main @code{tkinter} module.

@item @ref{fa,,tkinter.dnd}

(experimental) Drag-and-drop support for @code{tkinter}. This will
become deprecated when it is replaced with the Tk DND.

@item @ref{108,,turtle}

Turtle graphics in a Tk window.
@end table

@node Tkinter life preserver,Threading model,Tkinter modules,tkinter — Python interface to Tcl/Tk
@anchor{library/tkinter tkinter-life-preserver}@anchor{4378}
@subsubsection Tkinter life preserver


This section is not designed to be an exhaustive tutorial on either Tk or
Tkinter.  For that, refer to one of the external resources noted earlier.
Instead, this section provides a very quick orientation to what a Tkinter
application looks like, identifies foundational Tk concepts, and
explains how the Tkinter wrapper is structured.

The remainder of this section will help you to identify the classes,
methods, and options you’ll need in your Tkinter application, and where to
find more detailed documentation on them, including in the official Tcl/Tk
reference manual.

@menu
* A Hello World program:: 
* Important Tk concepts:: 
* Understanding how Tkinter wraps Tcl/Tk:: 
* How do I…? What option does…?:: 
* Navigating the Tcl/Tk reference manual:: 

@end menu

@node A Hello World program,Important Tk concepts,,Tkinter life preserver
@anchor{library/tkinter a-hello-world-program}@anchor{4379}
@subsubsection A Hello World program


We’ll start by walking through a “Hello World” application in Tkinter. This
isn’t the smallest one we could write, but has enough to illustrate some
key concepts you’ll need to know.

@example
from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
@end example

After the imports, the next line creates an instance of the @ref{19ee,,Tk} class,
which initializes Tk and creates its associated Tcl interpreter. It also
creates a toplevel window, known as the root window, which serves as the main
window of the application.

The following line creates a frame widget, which in this case will contain
a label and a button we’ll create next. The frame is fit inside the root
window.

The next line creates a label widget holding a static text string.
The @ref{437a,,grid()} method is used to specify the relative layout (position)
of the label within its containing frame widget, similar to how tables in HTML
work.

A button widget is then created, and placed to the right of the label.
When pressed, it will call the @ref{437b,,destroy()} method of the root window.

Finally, the @ref{437c,,mainloop()} method puts everything on the display, and
responds to user input until the program terminates.

@node Important Tk concepts,Understanding how Tkinter wraps Tcl/Tk,A Hello World program,Tkinter life preserver
@anchor{library/tkinter important-tk-concepts}@anchor{437d}
@subsubsection Important Tk concepts


Even this simple program illustrates the following key Tk concepts:


@table @asis

@item widgets

A Tkinter user interface is made up of individual `widgets'. Each widget is
represented as a Python object, instantiated from classes like
@ref{437e,,ttk.Frame}, @ref{437f,,ttk.Label}, and @ref{4380,,ttk.Button}.

@item widget hierarchy

Widgets are arranged in a `hierarchy'. The label and button were contained
within a frame, which in turn was contained within the root window. When
creating each `child' widget, its `parent' widget is passed as the first
argument to the widget constructor.

@item configuration options

Widgets have `configuration options', which modify their appearance and
behavior, such as the text to display in a label or button. Different
classes of widgets will have different sets of options.

@item geometry management

Widgets aren’t automatically added to the user interface when they are
created. A `geometry manager' like @code{grid} controls where in the
user interface they are placed.

@item event loop

Tkinter reacts to user input, changes from your program, and even refreshes
the display only when actively running an `event loop'. If your program
isn’t running the event loop, your user interface won’t update.
@end table

@node Understanding how Tkinter wraps Tcl/Tk,How do I…? What option does…?,Important Tk concepts,Tkinter life preserver
@anchor{library/tkinter understanding-how-tkinter-wraps-tcl-tk}@anchor{4381}
@subsubsection Understanding how Tkinter wraps Tcl/Tk


When your application uses Tkinter’s classes and methods, internally Tkinter
is assembling strings representing Tcl/Tk commands, and executing those
commands in the Tcl interpreter attached to your application’s @ref{19ee,,Tk}
instance.

Whether it’s trying to navigate reference documentation, trying to find
the right method or option, adapting some existing code, or debugging your
Tkinter application, there are times that it will be useful to understand
what those underlying Tcl/Tk commands look like.

To illustrate, here is the Tcl/Tk equivalent of the main part of the Tkinter
script above.

@example
ttk::frame .frm -padding 10
grid .frm
grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
@end example

Tcl’s syntax is similar to many shell languages, where the first word is the
command to be executed, with arguments to that command following it, separated
by spaces. Without getting into too many details, notice the following:


@itemize *

@item 
The commands used to create widgets (like @code{ttk::frame}) correspond to
widget classes in Tkinter.

@item 
Tcl widget options (like @code{-text}) correspond to keyword arguments in
Tkinter.

@item 
Widgets are referred to by a `pathname' in Tcl (like @code{.frm.btn}),
whereas Tkinter doesn’t use names but object references.

@item 
A widget’s place in the widget hierarchy is encoded in its (hierarchical)
pathname, which uses a @code{.} (dot) as a path separator. The pathname for
the root window is just @code{.} (dot). In Tkinter, the hierarchy is defined
not by pathname but by specifying the parent widget when creating each
child widget.

@item 
Operations which are implemented as separate `commands' in Tcl (like
@code{grid} or @code{destroy}) are represented as `methods' on Tkinter widget
objects. As you’ll see shortly, at other times Tcl uses what appear to be
method calls on widget objects, which more closely mirror what is
used in Tkinter.
@end itemize

@node How do I…? What option does…?,Navigating the Tcl/Tk reference manual,Understanding how Tkinter wraps Tcl/Tk,Tkinter life preserver
@anchor{library/tkinter how-do-i-what-option-does}@anchor{4382}
@subsubsection How do I…? What option does…?


If you’re not sure how to do something in Tkinter, and you can’t immediately
find it in the tutorial or reference documentation you’re using, there are a
few strategies that can be helpful.

First, remember that the details of how individual widgets work may vary
across different versions of both Tkinter and Tcl/Tk. If you’re searching
documentation, make sure it corresponds to the Python and Tcl/Tk versions
installed on your system.

When searching for how to use an API, it helps to know the exact name of the
class, option, or method that you’re using. Introspection, either in an
interactive Python shell or with @ref{117b,,print()}, can help you identify what
you need.

To find out what configuration options are available on any widget, call its
@ref{4383,,configure()} method, which returns a dictionary containing a variety
of information about each object, including its default and current values.
Use @ref{4384,,keys()} to get just the names of each option.

@example
btn = ttk.Button(frm, ...)
print(btn.configure().keys())
@end example

As most widgets have many configuration options in common, it can be useful
to find out which are specific to a particular widget class. Comparing the
list of options to that of a simpler widget, like a frame, is one way to
do that.

@example
print(set(btn.configure().keys()) - set(frm.configure().keys()))
@end example

Similarly, you can find the available methods for a widget object using the
standard @ref{845,,dir()} function. If you try it, you’ll see there are over 200
common widget methods, so again identifying those specific to a widget class
is helpful.

@example
print(dir(btn))
print(set(dir(btn)) - set(dir(frm)))
@end example

@node Navigating the Tcl/Tk reference manual,,How do I…? What option does…?,Tkinter life preserver
@anchor{library/tkinter navigating-the-tcl-tk-reference-manual}@anchor{4385}
@subsubsection Navigating the Tcl/Tk reference manual


As noted, the official
Tk commands@footnote{https://www.tcl-lang.org/man/tcl9.0/TkCmd/index.html} reference
manual (man pages) is often the most accurate description of what specific
operations on widgets do.
Even when you know the name of the option or method that you need, you may
still have a few places to look.

While all operations in Tkinter are implemented as method calls on widget
objects, you’ve seen that many Tcl/Tk operations appear as commands that
take a widget pathname as its first parameter, followed by optional
parameters, for example

@example
destroy .
grid .frm.btn -column 0 -row 0
@end example

Others, however, look more like methods called on a widget object (in fact,
when you create a widget in Tcl/Tk, it creates a Tcl command with the name
of the widget pathname, with the first parameter to that command being the
name of a method to call).

@example
.frm.btn invoke
.frm.lbl configure -text "Goodbye"
@end example

In the official Tcl/Tk reference documentation, you’ll find most operations
that look like method calls on the man page for a specific widget (for example,
you’ll find the @ref{4386,,invoke()} method on the
ttk::button@footnote{https://www.tcl-lang.org/man/tcl9.0/TkCmd/ttk_button.html}
man page), while functions that take a widget as a parameter often have
their own man page (for example,
grid@footnote{https://www.tcl-lang.org/man/tcl9.0/TkCmd/grid.html}).

You’ll find many common options and methods in the
options@footnote{https://www.tcl-lang.org/man/tcl9.0/TkCmd/options.html} or
ttk::widget@footnote{https://www.tcl-lang.org/man/tcl9.0/TkCmd/ttk_widget.html} man
pages, while others are found in the man page for a specific widget class.

You’ll also find that many Tkinter methods have compound names, for example,
@ref{4387,,winfo_x()}, @ref{4388,,winfo_height()},
@ref{4389,,winfo_viewable()}.
You’d find documentation for all of these in the
winfo@footnote{https://www.tcl-lang.org/man/tcl9.0/TkCmd/winfo.html} man page.

@cartouche
@quotation Note 
Somewhat confusingly, there are also methods on all Tkinter widgets
that don’t actually operate on the widget, but operate at a global
scope, independent of any widget. Examples are methods for accessing
the clipboard or the system bell. (They happen to be implemented as
methods in the base @ref{438a,,Widget} class that all Tkinter widgets
inherit from).
@end quotation
@end cartouche

@node Threading model,Handy reference,Tkinter life preserver,tkinter — Python interface to Tcl/Tk
@anchor{library/tkinter threading-model}@anchor{436c}
@subsubsection Threading model


Python and Tcl/Tk have very different threading models, which @code{tkinter}
tries to bridge. If you use threads, you may need to be aware of this.

A Python interpreter may have many threads associated with it. In Tcl, multiple
threads can be created, but each thread has a separate Tcl interpreter instance
associated with it. Threads can also create more than one interpreter instance,
though each interpreter instance can be used only by the one thread that created it.

Each @ref{19ee,,Tk} object created by @code{tkinter} contains a Tcl interpreter.
It also keeps track of which thread created that interpreter. Calls to
@code{tkinter} can be made from any Python thread. Internally, if a call comes
from a thread other than the one that created the @code{Tk} object, an event
is posted to the interpreter’s event queue, and when executed, the result is
returned to the calling Python thread.

Tcl/Tk applications are normally event-driven, meaning that after
initialization, the interpreter runs an event loop (that is,
@ref{438b,,Tk.mainloop}) and responds to events.
Because it is single-threaded, event handlers must respond quickly, otherwise
they will block other events from being processed.
To avoid this, any long-running computations should not run in an event
handler, but are either broken into smaller pieces using timers, or run in
another thread.
This is different from many GUI toolkits where the GUI runs in a completely
separate thread from all application code including event handlers.

If the Tcl interpreter is not running the event loop and processing events, any
@code{tkinter} calls made from threads other than the one running the Tcl
interpreter will fail.

A number of special cases exist:


@itemize *

@item 
Tcl/Tk libraries built without thread support are now rare: the bundled
Tcl/Tk 8.6 is built with thread support, so this case only arises with some
older non-threaded builds. When the library is not thread-aware,
@code{tkinter} calls the library from the originating Python thread, even
if this is different than the thread that created the Tcl interpreter. A global
lock ensures only one call occurs at a time.

@item 
While @code{tkinter} allows you to create more than one instance of a @ref{19ee,,Tk}
object (with its own interpreter), all interpreters that are part of the same
thread share a common event queue, which gets ugly fast. In practice, don’t create
more than one instance of @code{Tk} at a time. Otherwise, it’s best to create
them in separate threads and ensure you’re running a thread-aware Tcl/Tk build.

@item 
Blocking event handlers are not the only way to prevent the Tcl interpreter from
reentering the event loop. It is even possible to run multiple nested event loops
or abandon the event loop entirely. If you’re doing anything tricky when it comes
to events or threads, be aware of these possibilities.

@item 
There are a few select @code{tkinter} functions that presently work only when
called from the thread that created the Tcl interpreter.
@end itemize

@node Handy reference,File handlers,Threading model,tkinter — Python interface to Tcl/Tk
@anchor{library/tkinter handy-reference}@anchor{438c}
@subsubsection Handy reference


@menu
* Setting options:: 
* The packer:: 
* Packer options:: 
* Coupling widget variables:: 
* The window manager:: 
* Tk option data types:: 
* Bindings and events:: 
* The index parameter:: 
* Images:: 

@end menu

@node Setting options,The packer,,Handy reference
@anchor{library/tkinter setting-options}@anchor{438d}@anchor{library/tkinter tkinter-setting-options}@anchor{438e}
@subsubsection Setting options


Options control things like the color and border width of a widget. Options can
be set in three ways:


@table @asis

@item At object creation time, using keyword arguments

@example
fred = Button(self, fg="red", bg="blue")
@end example

@item After object creation, treating the option name like a dictionary index

@example
fred["fg"] = "red"
fred["bg"] = "blue"
@end example

@item Use the config() method to update multiple attrs subsequent to object creation

@example
fred.config(fg="red", bg="blue")
@end example
@end table

For a complete explanation of a given option and its behavior, see the Tk man
pages for the widget in question.

Note that the man pages list “STANDARD OPTIONS” and “WIDGET SPECIFIC OPTIONS”
for each widget.  The former is a list of options that are common to many
widgets, the latter are the options that are idiosyncratic to that particular
widget.  The Standard Options are documented on the @code{options(3)@footnote{https://manpages.debian.org/options(3)}} man
page.

No distinction between standard and widget-specific options is made in this
document.  Some options don’t apply to some kinds of widgets. Whether a given
widget responds to a particular option depends on the class of the widget;
buttons have a @code{command} option, labels do not.

The options supported by a given widget are listed in that widget’s man page,
or can be queried at runtime by calling the @ref{438f,,config()} method without
arguments, or by calling the @ref{4384,,keys()} method on that widget.
The return value of these calls is a dictionary whose key is the name of the
option as a string (for example, @code{'relief'}) and whose values are 5-tuples.

Some options, like @code{bg} are synonyms for common options with long names
(@code{bg} is shorthand for “background”). Passing the @code{config()} method the name
of a shorthand option will return a 2-tuple, not 5-tuple. The 2-tuple passed
back will contain the name of the synonym and the “real” option (such as
@code{('bg', 'background')}).


@multitable {xxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxx} 
@headitem

Index

@tab

Meaning

@tab

Example

@item

0

@tab

option name

@tab

@code{'relief'}

@item

1

@tab

option name for database lookup

@tab

@code{'relief'}

@item

2

@tab

option class for database
lookup

@tab

@code{'Relief'}

@item

3

@tab

default value

@tab

@code{'raised'}

@item

4

@tab

current value

@tab

@code{'groove'}

@end multitable


Example:

@example
>>> print(fred.config())
@{'relief': ('relief', 'relief', 'Relief', 'raised', 'groove')@}
@end example

Of course, the dictionary printed will include all the options available and
their values.  This is meant only as an example.

@node The packer,Packer options,Setting options,Handy reference
@anchor{library/tkinter pack-the-packer}@anchor{4390}@anchor{library/tkinter the-packer}@anchor{4391}
@subsubsection The packer


@geindex packing (widgets)

The packer is one of Tk’s geometry-management mechanisms.    Geometry managers
are used to specify the relative positioning of widgets within their container.
In contrast to the more cumbersome `placer' (which is
used less commonly, and we do not cover here), the packer takes qualitative
relationship specification - `above', `to the left of', `filling', etc - and
works everything out to determine the exact placement coordinates for you.

The size of any container widget is determined by the size of the “content widgets”
inside.  The packer is used to control where content widgets appear inside the
container into which they are packed.  You can pack widgets into frames, and frames
into other frames, in order to achieve the kind of layout you desire.
Additionally, the arrangement is dynamically adjusted to accommodate incremental
changes to the configuration, once it is packed.

Note that widgets do not appear until they have had their geometry specified
with a geometry manager.
It’s a common early mistake to leave out the geometry specification, and then
be surprised when the widget is created but nothing appears.
A widget will appear only after it has had, for example, the packer’s
@ref{4392,,pack()} method applied to it.

The pack() method can be called with keyword-option/value pairs that control
where the widget is to appear within its container, and how it is to behave when
the main application window is resized.  Here are some examples:

@example
fred.pack()                     # defaults to side = "top"
fred.pack(side="left")
fred.pack(expand=1)
@end example

@node Packer options,Coupling widget variables,The packer,Handy reference
@anchor{library/tkinter packer-options}@anchor{4393}
@subsubsection Packer options


For more extensive information on the packer and the options that it can take,
see the man pages and page 183 of John Ousterhout’s book.


@table @asis

@item anchor

Anchor type.  Denotes where the packer is to place each content in its parcel.

@item expand

boolean, @code{0} or @code{1}.

@item fill

Legal values: @code{'x'}, @code{'y'}, @code{'both'}, @code{'none'}.

@item ipadx and ipady

A distance - designating internal padding on each side of the content.

@item padx and pady

A distance - designating external padding on each side of the content.

@item side

Legal values are: @code{'left'}, @code{'right'}, @code{'top'}, @code{'bottom'}.
@end table

@node Coupling widget variables,The window manager,Packer options,Handy reference
@anchor{library/tkinter coupling-widget-variables}@anchor{4394}@anchor{library/tkinter id2}@anchor{4395}
@subsubsection Coupling widget variables


The current-value setting of some widgets (like text entry widgets) can be
connected directly to application variables by using special options.  These
options are @code{variable}, @code{textvariable}, @code{onvalue}, @code{offvalue}, and
@code{value}.  This connection works both ways: if the variable changes for any
reason, the widget it’s connected to will be updated to reflect the new value.

Unfortunately, in the current implementation of @code{tkinter} it is not
possible to hand over an arbitrary Python variable to a widget through a
@code{variable} or @code{textvariable} option.  The only kinds of variables for which
this works are variables that are subclassed from a class called Variable,
defined in @code{tkinter}.

There are many useful subclasses of Variable already defined:
@ref{4396,,StringVar}, @ref{4397,,IntVar}, @ref{4398,,DoubleVar}, and
@ref{4399,,BooleanVar}.
To read the current value of such a variable, call the @ref{439a,,get()}
method on it, and to change its value you call the @code{set()} method.
If you follow this protocol, the widget will always track the value of the
variable, with no further intervention on your part.

For example:

@example
import tkinter as tk

class App(tk.Frame):
    def __init__(self, master):
        super().__init__(master)
        self.pack()

        self.entrythingy = tk.Entry()
        self.entrythingy.pack()

        # Create the application variable.
        self.contents = tk.StringVar()
        # Set it to some value.
        self.contents.set("this is a variable")
        # Tell the entry widget to watch this variable.
        self.entrythingy["textvariable"] = self.contents

        # Define a callback for when the user hits return.
        # It prints the current value of the variable.
        self.entrythingy.bind('<Key-Return>',
                             self.print_contents)

    def print_contents(self, event):
        print("Hi. The current entry content is:",
              self.contents.get())

root = tk.Tk()
myapp = App(root)
myapp.mainloop()
@end example

@node The window manager,Tk option data types,Coupling widget variables,Handy reference
@anchor{library/tkinter the-window-manager}@anchor{439b}
@subsubsection The window manager


@geindex window manager (widgets)

In Tk, there is a utility command, @code{wm}, for interacting with the window
manager.  Options to the @code{wm} command allow you to control things like titles,
placement, icon bitmaps, and the like.  In @code{tkinter}, these commands have
been implemented as methods on the @ref{439c,,Wm} class.  Toplevel widgets are
subclassed from the @code{Wm} class, and so can call the @code{Wm} methods
directly.

To get at the toplevel window that contains a given widget, you can often just
refer to the widget’s @ref{4371,,master}.
Of course if the widget has been packed inside of a frame, the @code{master}
won’t represent a toplevel window.
To get at the toplevel window that contains an arbitrary widget, you can call
the @ref{439d,,winfo_toplevel()} method.
There is also a @code{_root()} method; it begins with an underscore to denote
the fact that this function is part of the implementation, and not an interface
to Tk functionality.
It returns the application’s root window rather than the nearest enclosing
toplevel.

Here are some examples of typical usage:

@example
import tkinter as tk

class App(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.pack()

# create the application
myapp = App()

#
# here are method calls to the window manager class
#
myapp.master.title("My Do-Nothing Application")
myapp.master.maxsize(1000, 400)

# start the program
myapp.mainloop()
@end example

@node Tk option data types,Bindings and events,The window manager,Handy reference
@anchor{library/tkinter tk-option-data-types}@anchor{439e}
@subsubsection Tk option data types


@geindex Tk Option Data Types


@table @asis

@item anchor

Legal values are points of the compass: @code{"n"}, @code{"ne"}, @code{"e"}, @code{"se"},
@code{"s"}, @code{"sw"}, @code{"w"}, @code{"nw"}, and also @code{"center"}.

@item bitmap

There are ten built-in, named bitmaps: @code{'error'}, @code{'gray12'},
@code{'gray25'}, @code{'gray50'}, @code{'gray75'}, @code{'hourglass'}, @code{'info'},
@code{'questhead'}, @code{'question'}, @code{'warning'}.  To specify an X bitmap
filename, give the full path to the file, preceded with an @code{@@}, as in
@code{"@@/usr/contrib/bitmap/gumby.bit"}.

@item boolean

You can pass integers 0 or 1 or the strings @code{"yes"} or @code{"no"}.

@item callback

This is any Python function that takes no arguments.  For example:

@example
def print_it():
    print("hi there")
fred["command"] = print_it
@end example

@item color

Colors can be given as the names of X colors in the rgb.txt file, or as strings
representing RGB values in 4 bit: @code{"#RGB"}, 8 bit: @code{"#RRGGBB"}, 12 bit:
@code{"#RRRGGGBBB"}, or 16 bit: @code{"#RRRRGGGGBBBB"} ranges, where R,G,B here
represent any legal hex digit.  See page 160 of Ousterhout’s book for details.

@item cursor

The standard X cursor names from @code{cursorfont.h} can be used, without the
@code{XC_} prefix.  For example to get a hand cursor (@code{XC_hand2}), use the
string @code{"hand2"}.  You can also specify a bitmap and mask file of your own.
See page 179 of Ousterhout’s book.

@item distance

Screen distances can be specified in either pixels or absolute distances.
Pixels are given as numbers and absolute distances as strings, with the trailing
character denoting units: @code{c} for centimetres, @code{i} for inches, @code{m} for
millimetres, @code{p} for printer’s points.  For example, 3.5 inches is expressed
as @code{"3.5i"}.

@item font

Tk uses a font description such as @code{@{courier 10 bold@}}; in
@code{tkinter} this is most naturally passed as a tuple of
@code{(family, size, *styles)} (or as the equivalent string
@code{"Courier 10 bold"}).  Font sizes with positive numbers are measured in
points; sizes with negative numbers are measured in pixels.

@item geometry

This is a string of the form @code{widthxheight}, where width and height are
measured in pixels for most widgets (in characters for widgets displaying text).
For example: @code{fred["geometry"] = "200x100"}.

@item justify

Legal values are the strings: @code{"left"}, @code{"center"}, and @code{"right"}.

@item region

This is a string with four space-delimited elements, each of which is a legal
distance (see above).  For example: @code{"2 3 4 5"} and @code{"3i 2i 4.5i 2i"} and
@code{"3c 2c 4c 10.43c"}  are all legal regions.

@item relief

Determines what the border style of a widget will be.  Legal values are:
@code{"raised"}, @code{"sunken"}, @code{"flat"}, @code{"groove"}, @code{"ridge"}, and
@code{"solid"}.

@item scrollcommand

This is almost always the @code{set()} method of some scrollbar widget, but can
be any widget method that takes a single argument.

@item wrap

Must be one of: @code{"none"}, @code{"char"}, or @code{"word"}.
@end table

@node Bindings and events,The index parameter,Tk option data types,Handy reference
@anchor{library/tkinter bindings-and-events}@anchor{439f}@anchor{library/tkinter id3}@anchor{43a0}
@subsubsection Bindings and events


@geindex bind (widgets)
@geindex events (widgets)

The bind method from the widget command allows you to watch for certain events
and to have a callback function trigger when that event type occurs.  The form
of the bind method is:

@example
def bind(self, sequence, func, add='@w{'}):
@end example

where:


@table @asis

@item sequence

is a string that denotes the target kind of event.  Physical events use the
@code{<modifier-modifier-type-detail>} form (for example @code{"<Enter>"} or
@code{"<Control-Button-1>"}); application-defined virtual events use double angle
brackets, as in @code{"<<Paste>>"}.  (See the
@code{bind(3tk)@footnote{https://manpages.debian.org/bind(3tk)}} man page, and page 201 of John Ousterhout’s book,
@cite{Tcl and the Tk Toolkit (2nd edition)}, for details).

@item func

is a Python function, taking one argument, to be invoked when the event occurs.
An Event instance will be passed as the argument. (Functions deployed this way
are commonly known as `callbacks'.)

@item add

is optional, either @code{'@w{'}} or @code{'+'}.  Passing an empty string denotes that
this binding is to replace any other bindings that this event is associated
with.  Passing a @code{'+'} means that this function is to be added to the list
of functions bound to this event type.
@end table

For example:

@example
def turn_red(self, event):
    event.widget["activeforeground"] = "red"

self.button.bind("<Enter>", self.turn_red)
@end example

Notice how the widget field of the event is being accessed in the
@code{turn_red()} callback.  This field contains the widget that caught the X
event.  The following table lists the other event fields you can access, and how
they are denoted in Tk, which can be useful when referring to the Tk man pages.


@multitable {xxxxxx} {xxxxxxxxxxxxxxxxxxxxxxx} {xxxxxx} {xxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Tk

@tab

Tkinter Event Field

@tab

Tk

@tab

Tkinter Event Field

@item

%f

@tab

focus

@tab

%A

@tab

char

@item

%h

@tab

height

@tab

%E

@tab

send_event

@item

%k

@tab

keycode

@tab

%K

@tab

keysym

@item

%s

@tab

state

@tab

%N

@tab

keysym_num

@item

%t

@tab

time

@tab

%T

@tab

type

@item

%w

@tab

width

@tab

%W

@tab

widget

@item

%x

@tab

x

@tab

%X

@tab

x_root

@item

%y

@tab

y

@tab

%Y

@tab

y_root

@item

%#

@tab

serial

@tab

%b

@tab

num

@item

%d

@tab

detail

@tab

%D

@tab

delta

@end multitable


@node The index parameter,Images,Bindings and events,Handy reference
@anchor{library/tkinter the-index-parameter}@anchor{43a1}
@subsubsection The index parameter


A number of widgets require “index” parameters to be passed.  These are used to
point at a specific place in a Text widget, or to particular characters in an
Entry widget, or to particular menu items in a Menu widget.


@table @asis

@item Entry widget indexes (index, view index, etc.)

Entry widgets have options that refer to character positions in the text being
displayed.  You can use these @code{tkinter} functions to access these special
points in text widgets:

@item Text widget indexes

The index notation for Text widgets is very rich and is best described in the Tk
man pages.

@item Menu indexes (menu.invoke(), menu.entryconfig(), etc.)

Some options and methods for menus manipulate specific menu entries. Anytime a
menu index is needed for an option or a parameter, you may pass in:


@itemize *

@item 
an integer which refers to the numeric position of the entry in the widget,
counted from the top, starting with 0;

@item 
the string @code{"active"}, which refers to the menu position that is currently
under the cursor;

@item 
the string @code{"last"} which refers to the last menu item;

@item 
An integer preceded by @code{@@}, as in @code{@@6}, where the integer is interpreted
as a y pixel coordinate in the menu’s coordinate system;

@item 
the string @code{"none"}, which indicates no menu entry at all, most often used
with menu.activate() to deactivate all entries, and finally,

@item 
a text string that is pattern matched against the label of the menu entry, as
scanned from the top of the menu to the bottom.  Note that this index type is
considered after all the others, which means that matches for menu items
labelled @code{last}, @code{active}, or @code{none} may be interpreted as the above
literals, instead.
@end itemize
@end table

@node Images,,The index parameter,Handy reference
@anchor{library/tkinter images}@anchor{43a2}
@subsubsection Images


Images of different formats can be created through the corresponding subclass
of @ref{43a3,,tkinter.Image}:


@itemize *

@item 
@ref{43a4,,BitmapImage} for images in XBM format.

@item 
@ref{1e28,,PhotoImage} for images in PGM, PPM, GIF and PNG formats. The latter
is supported starting with Tk 8.6.
@end itemize

Either type of image is created through either the @code{file} or the @code{data}
option (other options are available as well).


Changed in version 3.13: Added the @code{PhotoImage} method @code{copy_replace()} to copy a region
from one image to other image, possibly with pixel zooming and/or
subsampling.
Add `from_coords' parameter to @code{PhotoImage} methods @code{copy()},
@code{zoom()} and @code{subsample()}.
Add `zoom' and `subsample' parameters to @code{PhotoImage} method
@code{copy()}.


The image object can then be used wherever an @code{image} option is supported by
some widget (for example, labels, buttons, menus). In these cases, Tk will not keep a
reference to the image. When the last Python reference to the image object is
deleted, the image data is deleted as well, and Tk will display an empty box
wherever the image was used.


@subsubheading See also


The Pillow@footnote{https://python-pillow.org/} package adds support for
formats such as BMP, JPEG, TIFF, and WebP, among others.


@node File handlers,Reference<8>,Handy reference,tkinter — Python interface to Tcl/Tk
@anchor{library/tkinter file-handlers}@anchor{43a5}@anchor{library/tkinter tkinter-file-handlers}@anchor{43a6}
@subsubsection File handlers


Tk allows you to register and unregister a callback function which will be
called from the Tk mainloop when I/O is possible on a file descriptor.
Only one handler may be registered per file descriptor. Example code:

@example
import tkinter
widget = tkinter.Tk()
mask = tkinter.READABLE | tkinter.WRITABLE
widget.tk.createfilehandler(file, mask, callback)
...
widget.tk.deletefilehandler(file)
@end example

This feature is not available on Windows.

Since you don’t know how many bytes are available for reading, you may not
want to use the @ref{8a5,,BufferedIOBase} or @ref{8a6,,TextIOBase}
@ref{1534,,read()} or @ref{1535,,readline()} methods,
since these will insist on reading a predefined number of bytes.
For sockets, the @ref{faa,,recv()} or
@ref{fab,,recvfrom()} methods will work fine; for other files,
use raw reads or @code{os.read(file.fileno(), maxbytecount)}.

@geindex createfilehandler() (tkinter.Widget.tk method)
@anchor{library/tkinter tkinter Widget tk createfilehandler}@anchor{43a7}
@deffn {Method} Widget.tk.createfilehandler (file, mask, func)

Registers the file handler callback function `func'. The `file' argument
may either be an object with a @ref{17fe,,fileno()} method (such as
a file or socket object), or an integer file descriptor. The `mask'
argument is an ORed combination of any of the three constants below.
The callback is called as follows:

@example
callback(file, mask)
@end example
@end deffn

@geindex deletefilehandler() (tkinter.Widget.tk method)
@anchor{library/tkinter tkinter Widget tk deletefilehandler}@anchor{43a8}
@deffn {Method} Widget.tk.deletefilehandler (file)

Unregisters a file handler.
@end deffn

@geindex READABLE (in module tkinter)
@geindex WRITABLE (in module tkinter)
@geindex EXCEPTION (in module tkinter)
@anchor{library/tkinter tkinter READABLE}@anchor{43a9}
@deffn {Data} tkinter.READABLE
@anchor{library/tkinter tkinter WRITABLE}@anchor{43aa}
@deffnx {Data} tkinter.WRITABLE
@anchor{library/tkinter tkinter EXCEPTION}@anchor{43ab}
@deffnx {Data} tkinter.EXCEPTION

Constants used in the `mask' arguments.
@end deffn

@node Reference<8>,,File handlers,tkinter — Python interface to Tcl/Tk
@anchor{library/tkinter reference}@anchor{43ac}
@subsubsection Reference


This section documents the classes, methods, functions and constants of the
@code{tkinter} module.
Most of them wrap Tcl/Tk commands; consult the official Tcl/Tk manual pages for
the full list of widget options and further details.

@geindex TclError
@anchor{library/tkinter tkinter TclError}@anchor{43ad}
@deffn {Exception} tkinter.TclError

The exception raised when a call into the Tcl interpreter fails, for example
when a widget is given an unknown option or an invalid value.
@end deffn

@menu
* Base and mixin classes:: 
* Widget classes:: 
* Variable classes:: 
* Image classes:: 
* Other classes:: 
* Module-level functions:: 
* Constants: Constants<10>. 

@end menu

@node Base and mixin classes,Widget classes,,Reference<8>
@anchor{library/tkinter base-and-mixin-classes}@anchor{43ae}
@subsubsection Base and mixin classes


@geindex Misc (class in tkinter)
@anchor{library/tkinter tkinter Misc}@anchor{43af}
@deffn {Class} tkinter.Misc

The @code{Misc} class is a mix-in inherited by @ref{19ee,,Tk} and, through
@ref{43b0,,BaseWidget}, by every widget.
It provides the large set of methods common to all Tk objects: querying
window information, managing event bindings and the event loop, controlling
the keyboard focus and pointer grabs, accessing the selection, clipboard and
option database, and assorted utility and introspection services.
Because they are inherited, these methods are available on every widget and
on the @code{Tk} application object, and are documented here once rather
than repeated for each widget.

@geindex cget() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc cget}@anchor{43b1}
@deffn {Method} cget (key)

Return the current value of the configuration option named `key' for this
widget, as a string.
The expression @code{widget[key]} is equivalent and may be used instead.
@end deffn

@geindex config() (tkinter.Misc method)

@geindex configure() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc config}@anchor{438f}@anchor{library/tkinter tkinter Misc configure}@anchor{4383}
@deffn {Method} configure (cnf=None, **kw)

Query or modify the configuration options of the widget.
With no arguments, return a dictionary mapping every available option
name to a tuple describing it (its name, X resource name, X resource
class, default value and current value).
If a single option name is given as a string, return the tuple for just
that option.
If one or more keyword arguments are given, or a dictionary is passed as
`cnf', set each named option to the corresponding value; the expression
@code{widget[key] = value} sets a single option in the same way.

@ref{438f,,config()} is an alias of @code{configure()}.
@end deffn

@geindex keys() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc keys}@anchor{4384}
@deffn {Method} keys ()

Return a list of the names of all configuration options of this widget.
@end deffn

@geindex getboolean() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc getboolean}@anchor{43b2}
@deffn {Method} getboolean (s)

Interpret the string `s' as a Tcl boolean and return the corresponding
@ref{3c1,,bool}.
Tcl accepts values such as @code{'1'}, @code{'0'}, @code{'yes'}, @code{'no'},
@code{'true'} and @code{'false'}.
Raise @ref{2ee,,ValueError} if `s' is not a valid boolean.
@end deffn

@geindex getdouble() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc getdouble}@anchor{43b3}
@deffn {Method} getdouble (s)

Interpret the string `s' as a Tcl floating-point number and return it as
a @ref{197,,float}.
Raise @ref{2ee,,ValueError} if `s' is not a valid number.


Added in version 3.5.

@end deffn

@geindex getint() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc getint}@anchor{43b4}
@deffn {Method} getint (s)

Interpret the string `s' as a Tcl integer and return it as an
@ref{19c,,int}.
Raise @ref{2ee,,ValueError} if `s' is not a valid integer.
@end deffn

@geindex getvar() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc getvar}@anchor{43b5}
@deffn {Method} getvar (name='PY_VAR')

Return the value of the Tcl global variable named `name'.
@end deffn

@geindex setvar() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc setvar}@anchor{43b6}
@deffn {Method} setvar (name='PY_VAR', value='1')

Set the Tcl global variable named `name' to `value'.

The @code{getvar()} and @code{setvar()} methods give direct access to Tcl
variables.
In most code you will instead use a @ref{1d0f,,Variable} subclass such as
@ref{4396,,StringVar} or @ref{4397,,IntVar}, which wraps a Tcl variable and
converts its value to and from a Python type.
@end deffn

@geindex register() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc register}@anchor{43b7}
@deffn {Method} register (func, subst=None, needcleanup=1)

Register the Python callable `func' as a Tcl command and return the name
of the new command as a string.
Whenever Tcl invokes that command, `func' is called; if `subst' is given,
it is applied to the command’s arguments first.
This is the mechanism used internally to turn Python callbacks into the
command names passed to Tk options such as `command'.
Unless `needcleanup' is false, the command is deleted automatically when
the widget is destroyed.


Changed in version 3.13: The arguments passed to `func' are no longer converted to strings.

@end deffn

@geindex deletecommand() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc deletecommand}@anchor{43b8}
@deffn {Method} deletecommand (name)

Delete the Tcl command named `name', such as one previously returned by
@ref{43b7,,register()}.
@end deffn

@geindex nametowidget() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc nametowidget}@anchor{43b9}
@deffn {Method} nametowidget (name)

Return the widget instance corresponding to the Tk pathname `name'.
@end deffn

@geindex send() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc send}@anchor{43ba}
@deffn {Method} send (interp, cmd, *args)

Send the Tcl command `cmd', with the given `args', to the Tcl interpreter
registered under the name `interp', and return its result.
This is not available on all platforms.
@end deffn

@geindex destroy() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc destroy}@anchor{437b}
@deffn {Method} destroy ()

Destroy this widget and all of its descendant widgets, and delete the Tcl
commands associated with them.
@end deffn

@geindex lift() (tkinter.Misc method)

@geindex tkraise() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc lift}@anchor{43bb}@anchor{library/tkinter tkinter Misc tkraise}@anchor{43bc}
@deffn {Method} tkraise (aboveThis=None)

Raise this widget in the stacking order so that it is drawn on top of its
siblings.
If `aboveThis' is given, the widget is moved to be just above it in the
stacking order instead.

@ref{43bb,,lift()} is an alias of @code{tkraise()}.
@end deffn

@geindex lower() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc lower}@anchor{43bd}
@deffn {Method} lower (belowThis=None)

Lower this widget in the stacking order so that it is drawn beneath its
siblings.
If `belowThis' is given, the widget is moved to be just below it in the
stacking order instead.
@end deffn

@geindex image_names() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc image_names}@anchor{43be}
@deffn {Method} image_names ()

Return the names of all images that currently exist in the Tcl
interpreter.
@end deffn

@geindex image_types() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc image_types}@anchor{43bf}
@deffn {Method} image_types ()

Return the available image types, such as @code{'photo'} and @code{'bitmap'}.
@end deffn

@geindex anchor() (tkinter.Misc method)

@geindex grid_anchor() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc anchor}@anchor{43c0}@anchor{library/tkinter tkinter Misc grid_anchor}@anchor{43c1}
@deffn {Method} grid_anchor (anchor=None)

Set the anchor that controls where the grid is placed inside this
container when the container is larger than the grid and no row or column
has a non-zero weight.
`anchor' is one of the usual anchor strings, such as @code{'nw'} (the
default) or @code{'center'}.
Called with no argument, this method has no effect.

@ref{43c0,,anchor()} is an alias of @code{grid_anchor()}.


Added in version 3.3.

@end deffn

@geindex bbox() (tkinter.Misc method)

@geindex grid_bbox() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc bbox}@anchor{43c2}@anchor{library/tkinter tkinter Misc grid_bbox}@anchor{43c3}
@deffn {Method} grid_bbox (column=None, row=None, col2=None, row2=None)

Return the bounding box, in pixels, of a region of the grid laid out in
this container, as a 4-tuple @code{(xoffset, yoffset, width, height)}.
With no arguments the bounding box of the whole grid is returned.
If `column' and `row' are given, the box spans from the cell at row and
column 0 to that cell; if `col2' and `row2' are also given, it spans from
the cell (`column', `row') to the cell (`col2', `row2').

@ref{43c2,,bbox()} is an alias of @code{grid_bbox()}.
@end deffn

@geindex columnconfigure() (tkinter.Misc method)

@geindex grid_columnconfigure() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc columnconfigure}@anchor{43c4}@anchor{library/tkinter tkinter Misc grid_columnconfigure}@anchor{43c5}
@deffn {Method} grid_columnconfigure (index, cnf=@{@}, **kw)

Query or set the properties of the column (or columns) `index' of the
grid managed by this container.
`index' may be a column number; when setting options it may also be a
list of column numbers, the string @code{'all'} to affect every column, or
a child widget whose occupied columns are affected.
The supported options are:


@table @asis

@item `minsize'

The column’s minimum size, in pixels.

@item `weight'

An integer setting how much of any extra space is apportioned to the
column.
A weight of @code{0} keeps the column at its requested size, and a column
of weight two grows twice as fast as a column of weight one.

@item `uniform'

The name of a uniform group.
Columns sharing a non-empty group name are kept in sizes that are
strictly proportional to their weights.

@item `pad'

Extra space, in pixels, added to the largest widget in the column when
computing the column’s size.
@end table

With a single option name, return that option’s value; with no options,
return a dictionary of all of them.

@ref{43c4,,columnconfigure()} is an alias of @code{grid_columnconfigure()}.
@end deffn

@geindex rowconfigure() (tkinter.Misc method)

@geindex grid_rowconfigure() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc rowconfigure}@anchor{43c6}@anchor{library/tkinter tkinter Misc grid_rowconfigure}@anchor{43c7}
@deffn {Method} grid_rowconfigure (index, cnf=@{@}, **kw)

Query or set the properties of the row (or rows) `index' of the grid
managed by this container.
`index' is interpreted as for @ref{43c5,,grid_columnconfigure()}, and the
supported options (`minsize', `weight', `uniform' and `pad') are the
same, applied to a row instead of a column.

@ref{43c6,,rowconfigure()} is an alias of @code{grid_rowconfigure()}.
@end deffn

@geindex grid_location() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc grid_location}@anchor{43c8}
@deffn {Method} grid_location (x, y)

Return the @code{(column, row)} of the grid cell that contains the pixel at
position (`x', `y'), given in pixels relative to this container.
For locations above or to the left of the grid, @code{-1} is returned for
the corresponding coordinate.
@end deffn

@geindex grid_propagate() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc grid_propagate}@anchor{43c9}
@deffn {Method} grid_propagate ()

@deffnx {Method} grid_propagate (flag)

Enable or disable geometry propagation for this container when it manages
its children with the grid geometry manager.
When `flag' is true, the container resizes itself to fit the requested
sizes of its children; when it is false, its size is left under your
control.
Called with no argument, return the current setting as a boolean.
@end deffn

@geindex size() (tkinter.Misc method)

@geindex grid_size() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc size}@anchor{43ca}@anchor{library/tkinter tkinter Misc grid_size}@anchor{43cb}
@deffn {Method} grid_size ()

Return the size of the grid managed by this container as a
@code{(columns, rows)} tuple.

@ref{43ca,,size()} is an alias of @code{grid_size()}.
@end deffn

@geindex grid_slaves() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc grid_slaves}@anchor{43cc}
@deffn {Method} grid_slaves (row=None, column=None)

Return a list of the child widgets managed in this container’s grid, most
recently managed first.
If `row' or `column' is given, only the children in that row or column
are returned.
@end deffn

@geindex propagate() (tkinter.Misc method)

@geindex pack_propagate() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc propagate}@anchor{43cd}@anchor{library/tkinter tkinter Misc pack_propagate}@anchor{43ce}
@deffn {Method} pack_propagate ()

@deffnx {Method} pack_propagate (flag)

Enable or disable geometry propagation for this container when it manages
its children with the pack geometry manager.
When `flag' is true, the container resizes itself to fit the requested
sizes of its children; when it is false, its size is left under your
control.
Called with no argument, return the current setting as a boolean.

@ref{43cd,,propagate()} is an alias of @code{pack_propagate()}.
@end deffn

@geindex slaves() (tkinter.Misc method)

@geindex pack_slaves() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc slaves}@anchor{43cf}@anchor{library/tkinter tkinter Misc pack_slaves}@anchor{43d0}
@deffn {Method} pack_slaves ()

Return a list of the child widgets managed by this container with the
pack geometry manager, in packing order.

@ref{43cf,,slaves()} is an alias of @code{pack_slaves()}.
@end deffn

@geindex place_slaves() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc place_slaves}@anchor{43d1}
@deffn {Method} place_slaves ()

Return a list of the child widgets managed by this container with the
place geometry manager.
@end deffn

@geindex bind() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc bind}@anchor{43d2}
@deffn {Method} bind (sequence=None, func=None, add=None)

Bind the event pattern `sequence' on this widget to the callable `func'.

`sequence' is an event pattern, such as @code{'<Button-1>'} (a mouse click)
or @code{'<KeyPress-a>'}, optionally a concatenation of several such
patterns that must occur shortly after one another.
When the event occurs, `func' is called with an @ref{43d3,,Event} instance
describing it as its only argument; if `func' returns the string
@code{'break'}, no further bindings for the event are invoked.

If `add' is true, `func' is added to any functions already bound to
`sequence'; otherwise it replaces them.
The binding applies only to this widget.

@code{bind()} returns a string identifier (a `funcid') that can later be
passed to @ref{43d4,,unbind()} to remove the binding without leaking the
associated Tcl command.

If `func' is omitted, return the binding currently associated with
`sequence'; if `sequence' is also omitted, return a list of all the
sequences for which bindings exist on this widget.
@end deffn

@geindex bind_class() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc bind_class}@anchor{43d5}
@deffn {Method} bind_class (className, sequence=None, func=None, add=None)

Like @ref{43d2,,bind()}, but bind `func' to the binding tag `className' rather
than to a single widget, so that the binding applies to every widget
having that tag.
`className' is usually the name of a widget class, such as @code{'Button'},
in which case the binding affects all widgets of that class.
The set of binding tags for a widget can be inspected and changed with
@ref{43d6,,bindtags()}.

The remaining arguments and the return value are as for @ref{43d2,,bind()}.
@end deffn

@geindex bind_all() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc bind_all}@anchor{43d7}
@deffn {Method} bind_all (sequence=None, func=None, add=None)

Like @ref{43d2,,bind()}, but bind `func' to the special binding tag @code{'all'},
so that the binding applies to every widget in the application.

The remaining arguments and the return value are as for @ref{43d2,,bind()}.
@end deffn

@geindex unbind() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc unbind}@anchor{43d4}
@deffn {Method} unbind (sequence, funcid=None)

Remove bindings for the event pattern `sequence' on this widget.

If `funcid' is given, only the function identified by it (a value
returned from a previous call to @ref{43d2,,bind()}) is removed, and its
associated Tcl command is deleted.
Otherwise all bindings for `sequence' are destroyed, leaving it unbound.


Changed in version 3.13: If `funcid' is given, only that callback is unbound; other callbacks
bound to `sequence' are kept.

@end deffn

@geindex unbind_class() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc unbind_class}@anchor{43d8}
@deffn {Method} unbind_class (className, sequence)

Remove all bindings for the event pattern `sequence' from the binding tag
`className'.
See @ref{43d5,,bind_class()}.
@end deffn

@geindex unbind_all() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc unbind_all}@anchor{43d9}
@deffn {Method} unbind_all (sequence)

Remove all bindings for the event pattern `sequence' from the special
binding tag @code{'all'}.
See @ref{43d7,,bind_all()}.
@end deffn

@geindex bindtags() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc bindtags}@anchor{43d6}
@deffn {Method} bindtags (tagList=None)

If `tagList' is omitted, return a tuple of the binding tags associated
with this widget.
When an event occurs in a widget, it is applied to each of the widget’s
binding tags in order, and for each tag the most specific matching
binding is executed.
By default a widget has four binding tags: its own pathname, its widget
class, the pathname of its nearest toplevel ancestor, and @code{'all'}, in
that order.

If `tagList' is given, it must be a sequence of strings; the widget’s
binding tags are set to its elements, which determines the order in which
bindings are evaluated.
@end deffn

@geindex event_add() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc event_add}@anchor{43da}
@deffn {Method} event_add (virtual, *sequences)

Associate the virtual event `virtual', whose name has the form
@code{'<<Paste>>'}, with each of the physical event patterns given by
`sequences', so that the virtual event triggers whenever any of them
occurs.
If `virtual' is already defined, the new sequences are added to its
existing ones.
@end deffn

@geindex event_delete() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc event_delete}@anchor{43db}
@deffn {Method} event_delete (virtual, *sequences)

Remove each of `sequences' from those associated with the virtual event
`virtual'.
Sequences that are not currently associated with `virtual' are ignored.
If no `sequences' are given, all physical event sequences are removed, so
that `virtual' no longer triggers.
@end deffn

@geindex event_generate() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc event_generate}@anchor{43dc}
@deffn {Method} event_generate (sequence, **kw)

Generate the event `sequence' on this widget and arrange for it to be
processed just as if it had come from the window system.
`sequence' must be a single event pattern, such as @code{'<Button-1>'} or
@code{'<<Paste>>'}, not a concatenation of several.
Keyword arguments specify additional fields of the event, for example `x'
and `y' for the pointer position, or `when' to control when the event is
processed; refer to the Tk @code{event} manual page for the full list.
@end deffn

@geindex event_info() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc event_info}@anchor{43dd}
@deffn {Method} event_info (virtual=None)

If `virtual' is omitted, return a tuple of all the virtual events that
are currently defined.
If `virtual' is given, return a tuple of the physical event sequences
currently associated with it, or an empty tuple if it is not defined.
@end deffn

@geindex after() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc after}@anchor{43de}
@deffn {Method} after (ms, func=None, *args, **kw)

Schedule the callable `func' to be called after `ms' milliseconds, with
`args' and `kw' passed to it as positional and keyword arguments.
Return an identifier that can be passed to @ref{43df,,after_cancel()} to cancel
the call.

If `func' is omitted, sleep for `ms' milliseconds instead, processing no
events during that time, and return @code{None}.


Changed in version 3.10: `func' can now be any callable object, not only a function.



Changed in version 3.14: Keyword arguments are now passed to `func'.

@end deffn

@geindex after_cancel() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc after_cancel}@anchor{43df}
@deffn {Method} after_cancel (id)

Cancel a callback previously scheduled with @ref{43de,,after()} or
@ref{43e0,,after_idle()}.
`id' must be an identifier returned by one of those methods; passing a
value that is not such an identifier raises @ref{2ee,,ValueError}.
If the callback has already run or been cancelled, this has no effect.


Changed in version 3.7: Passing @code{None} (or any false value) as `id' now raises
@ref{2ee,,ValueError}.

@end deffn

@geindex after_idle() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc after_idle}@anchor{43e0}
@deffn {Method} after_idle (func, *args, **kw)

Schedule the callable `func' to be called, with `args' and `kw' passed to
it, when the Tk main loop next becomes idle, that is, when it has no
other events to process.
Return an identifier that can be passed to @ref{43df,,after_cancel()} to cancel
the call.


Changed in version 3.14: Keyword arguments are now passed to `func'.

@end deffn

@geindex after_info() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc after_info}@anchor{43e1}
@deffn {Method} after_info (id=None)

If `id' is omitted, return a tuple of the identifiers of all callbacks
currently scheduled with @ref{43de,,after()} and @ref{43e0,,after_idle()} for this
interpreter.

If `id' is given, it must identify a callback that has not yet run or
been cancelled, and the return value is a tuple @code{(script, type)}, where
`script' refers to the function to be called and `type' is either
@code{'idle'} or @code{'timer'}.
A @ref{43ad,,TclError} is raised if `id' does not exist.


Added in version 3.13.

@end deffn

@geindex mainloop() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc mainloop}@anchor{438b}
@deffn {Method} mainloop (n=0)

Enter the Tk event loop, which processes events until all windows are
destroyed.
This is normally called once, on the root window, to run the application.
@end deffn

@geindex quit() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc quit}@anchor{43e2}
@deffn {Method} quit ()

Quit the Tcl interpreter, causing @ref{437c,,mainloop()} to return.
@end deffn

@geindex update() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc update}@anchor{43e3}
@deffn {Method} update ()

Enter the event loop until all pending events, including idle callbacks,
have been processed.
This brings the display up to date and handles any events that are
already queued, then returns.
@end deffn

@geindex update_idletasks() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc update_idletasks}@anchor{43e4}
@deffn {Method} update_idletasks ()

Enter the event loop until all pending idle callbacks have been called.
This updates the display of windows, for example after geometry changes,
but does not process events caused by the user.
@end deffn

@geindex waitvar() (tkinter.Misc method)

@geindex wait_variable() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc waitvar}@anchor{43e5}@anchor{library/tkinter tkinter Misc wait_variable}@anchor{43e6}
@deffn {Method} wait_variable (name='PY_VAR')

Wait until the Tcl variable `name' is modified, continuing to process
events in the meantime so that the application stays responsive.
`name' is usually a @ref{1d0f,,Variable} instance, such as an
@ref{4397,,IntVar} or @ref{4396,,StringVar}.

@ref{43e5,,waitvar()} is an alias of @code{wait_variable()}.
@end deffn

@geindex wait_window() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc wait_window}@anchor{43e7}
@deffn {Method} wait_window (window=None)

Wait until `window' is destroyed, continuing to process events in the
meantime.
If `window' is omitted, this widget is used.
This is typically used to wait for the user to finish interacting with a
dialog box.
@end deffn

@geindex wait_visibility() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc wait_visibility}@anchor{43e8}
@deffn {Method} wait_visibility (window=None)

Wait until the visibility state of `window' changes, for example when it
first appears on the screen, continuing to process events in the
meantime.
If `window' is omitted, this widget is used.
This is typically used to wait for a newly created window to become
visible before acting on it.
@end deffn

@geindex focus_set() (tkinter.Misc method)

@geindex focus() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc focus_set}@anchor{43e9}@anchor{library/tkinter tkinter Misc focus}@anchor{43ea}
@deffn {Method} focus ()

Direct the keyboard input focus for this widget’s display to this widget.
If the application does not currently have the input focus on this
widget’s display, the widget is remembered as the focus window for its
top level, and the focus will be redirected to it the next time the
window manager gives the focus to the top level.
@code{focus()} is an alias of @code{focus_set()}.
@end deffn

@geindex focus_force() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc focus_force}@anchor{43eb}
@deffn {Method} focus_force ()

Direct the keyboard input focus to this widget even if the application
does not currently have the input focus for the widget’s display.
This method should be used sparingly, if at all; normally an application
should wait for the window manager to give it the focus rather than
claiming it.
@end deffn

@geindex focus_get() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc focus_get}@anchor{43ec}
@deffn {Method} focus_get ()

Return the widget that currently has the keyboard focus in the
application, or @code{None} if no widget in the application has the focus.
Use @ref{43ed,,focus_displayof()} to work correctly with several displays.
@end deffn

@geindex focus_displayof() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc focus_displayof}@anchor{43ed}
@deffn {Method} focus_displayof ()

Return the widget that currently has the keyboard focus on the display
where this widget is located, or @code{None} if no widget in the application
has the focus on that display.
@end deffn

@geindex focus_lastfor() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc focus_lastfor}@anchor{43ee}
@deffn {Method} focus_lastfor ()

Return the most recent widget to have had the keyboard focus among all
the widgets in the same top level as this widget; this is the widget that
will receive the focus the next time the window manager gives the focus
to the top level.
If no widget in that top level has ever had the focus, or if the most
recent focus widget has been deleted, the top level itself is returned.
@end deffn

@geindex tk_focusFollowsMouse() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc tk_focusFollowsMouse}@anchor{43ef}
@deffn {Method} tk_focusFollowsMouse ()

Reconfigure Tk to use an implicit focus model in which the focus is set
to a widget whenever the mouse pointer enters it.
This cannot easily be disabled once enabled.
@end deffn

@geindex tk_focusNext() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc tk_focusNext}@anchor{43f0}
@deffn {Method} tk_focusNext ()

Return the next widget after this one in the keyboard traversal order, or
@code{None} if there is none.
The traversal order goes first to the next child, then recursively to the
children of that child, and then to the next sibling higher in the
stacking order.
A widget is skipped if its @code{takefocus} option is set to @code{0}.
This method is used in the default bindings for the @code{Tab} key.
@end deffn

@geindex tk_focusPrev() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc tk_focusPrev}@anchor{43f1}
@deffn {Method} tk_focusPrev ()

Return the previous widget before this one in the keyboard traversal
order, or @code{None} if there is none.
See @ref{43f0,,tk_focusNext()} for how the order is defined.
This method is used in the default bindings for the @code{Shift}-@code{Tab} key.
@end deffn

@geindex grab_set() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc grab_set}@anchor{43f2}
@deffn {Method} grab_set ()

Set a local grab on this widget.
A grab confines pointer events to this widget and its descendants: while
the pointer is outside the widget’s subtree, button presses and releases
and pointer motion are reported to the grab widget, and windows outside
the subtree become insensitive until the grab is released.
A local grab affects only the grabbing application.
Any grab previously set by this application on the widget’s display is
automatically released.
Setting a grab is the usual way to make a dialog modal: while the grab is
in effect the user cannot interact with the other windows of the
application.
@end deffn

@geindex grab_set_global() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc grab_set_global}@anchor{43f3}
@deffn {Method} grab_set_global ()

Set a global grab on this widget.
A global grab is like the local grab set by @ref{43f2,,grab_set()}, but it
locks out all other applications on the screen, so that only this
widget’s subtree is sensitive to pointer events, and it also grabs the
keyboard.
Use with caution: it is easy to render a display unusable with a global
grab, since other applications stop receiving events until it is
released.
@end deffn

@geindex grab_release() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc grab_release}@anchor{43f4}
@deffn {Method} grab_release ()

Release the grab on this widget if there is one; otherwise do nothing.
@end deffn

@geindex grab_current() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc grab_current}@anchor{43f5}
@deffn {Method} grab_current ()

Return the widget that currently holds the grab in this application for
this widget’s display, or @code{None} if there is no such widget.
@end deffn

@geindex grab_status() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc grab_status}@anchor{43f6}
@deffn {Method} grab_status ()

Return @code{None} if no grab is currently set on this widget, @code{"local"}
if a local grab is set, or @code{"global"} if a global grab is set.
@end deffn

@geindex selection_clear() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc selection_clear}@anchor{43f7}
@deffn {Method} selection_clear (**kw)

Clear the X selection, so that no window owns it anymore.
The selection to clear is given by the keyword argument `selection', an
atom name such as @code{'PRIMARY'} or @code{'CLIPBOARD'}; it defaults to
@code{PRIMARY}.
The `displayof' keyword argument names a widget that determines the
display on which to operate, and defaults to this widget.
@end deffn

@geindex selection_get() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc selection_get}@anchor{43f8}
@deffn {Method} selection_get (**kw)

Return the contents of the current X selection.
The keyword argument `selection' names the selection and defaults to
@code{PRIMARY}.
The keyword argument `type' specifies the form in which the data is to be
returned (the desired conversion target), an atom name such as
@code{'STRING'} or @code{'FILE_NAME'}; it defaults to @code{STRING}, except on
X11, where @code{UTF8_STRING} is tried first and @code{STRING} is used as a
fallback.
The `displayof' keyword argument names a widget that determines the
display from which to retrieve the selection, and defaults to this
widget.
@end deffn

@geindex selection_handle() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc selection_handle}@anchor{43f9}
@deffn {Method} selection_handle (command, **kw)

Register `command' as a handler to supply the X selection owned by this
widget when another application requests it.
When the selection is retrieved, `command' is called with two arguments,
the starting character offset and the maximum number of characters to
return, and must return at most that many characters of the selection
starting at that offset; for very long selections it is called repeatedly
with increasing offsets.
The keyword argument `selection' names the selection (default
@code{PRIMARY}) and the keyword argument `type' gives the form of the
selection that the handler supplies (such as @code{'STRING'} or
@code{'FILE_NAME'}, default @code{STRING}).
@end deffn

@geindex selection_own() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc selection_own}@anchor{43fa}
@deffn {Method} selection_own (**kw)

Make this widget the owner of the X selection on its display.
The previous owner, if any, is notified that it has lost the selection.
The keyword argument `selection' names the selection and defaults to
@code{PRIMARY}.
@end deffn

@geindex selection_own_get() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc selection_own_get}@anchor{43fb}
@deffn {Method} selection_own_get (**kw)

Return the widget in this application that owns the X selection on the
display containing this widget, or @code{None} if no widget in this
application owns the selection.
The keyword argument `selection' names the selection and defaults to
@code{PRIMARY}.
The `displayof' keyword argument names a widget that determines the
display to query, and defaults to this widget.
@end deffn

@geindex clipboard_append() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc clipboard_append}@anchor{43fc}
@deffn {Method} clipboard_append (string, **kw)

Append `string' to the Tk clipboard and claim ownership of the clipboard
on this widget’s display.
Before appending, the clipboard should be emptied with
@ref{43fd,,clipboard_clear()}; all appends should be completed before returning
to the event loop so that the clipboard is updated atomically.
The keyword argument `type' specifies the form of the data, an atom name
such as @code{'STRING'} or @code{'FILE_NAME'} (default @code{STRING}), and the
keyword argument `format' specifies the representation used to transmit
it (default @code{STRING}).
The `displayof' keyword argument names a widget that determines the
target display, and defaults to this widget.
The contents can be retrieved with @ref{43fe,,clipboard_get()} or
@ref{43f8,,selection_get()}.
@end deffn

@geindex clipboard_clear() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc clipboard_clear}@anchor{43fd}
@deffn {Method} clipboard_clear (**kw)

Claim ownership of the clipboard on this widget’s display and remove any
previous contents.
The `displayof' keyword argument names a widget that determines the
target display, and defaults to this widget.
@end deffn

@geindex clipboard_get() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc clipboard_get}@anchor{43fe}
@deffn {Method} clipboard_get (**kw)

Retrieve data from the clipboard on this widget’s display.
The keyword argument `type' specifies the form in which the data is to be
returned, an atom name such as @code{'STRING'} or @code{'FILE_NAME'}; it
defaults to @code{STRING}, except on X11, where @code{UTF8_STRING} is tried
first and @code{STRING} is used as a fallback.
The `displayof' keyword argument names a widget that determines the
display, and defaults to the root window of the application.
This is equivalent to @code{selection_get(selection= 'CLIPBOARD')}.
@end deffn

@geindex option_add() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc option_add}@anchor{43ff}
@deffn {Method} option_add (pattern, value, priority=None)

Add an option to the Tk option database that associates `value' with
`pattern'.
`pattern' consists of names and/or classes separated by asterisks or
dots, in the usual X format.
`priority' is an integer between 0 and 100, or one of the symbolic names
@code{'widgetDefault'} (20), @code{'startupFile'} (40), @code{'userDefault'} (60),
or @code{'interactive'} (80); it defaults to @code{interactive}.
@end deffn

@geindex option_clear() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc option_clear}@anchor{4400}
@deffn {Method} option_clear ()

Clear the Tk option database.
Default options from the @code{RESOURCE_MANAGER} property or the
@code{.Xdefaults} file are reloaded automatically the next time an
option is added to or removed from the database.
@end deffn

@geindex option_get() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc option_get}@anchor{4401}
@deffn {Method} option_get (name, className)

Return the value of the option matching this widget under `name' and
`className' from the Tk option database, or an empty string if there is
no matching entry.
When several entries match, the one with the highest priority is
returned, and among entries of equal priority the most recently added
one.
@end deffn

@geindex option_readfile() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc option_readfile}@anchor{4402}
@deffn {Method} option_readfile (fileName, priority=None)

Read the file named `fileName', which should have the standard format for
an X resource database such as @code{.Xdefaults}, and add all the
options it specifies to the Tk option database.
`priority' is interpreted as for @ref{43ff,,option_add()} and defaults to
@code{interactive}.
@end deffn

@geindex bell() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc bell}@anchor{4403}
@deffn {Method} bell (displayof=0)

Ring the bell on the display for this widget, using the display’s current
bell-related settings, and reset the screen saver for the screen.
If `displayof' is given as a widget, the bell is rung on that widget’s
display instead.
@end deffn

@geindex tk_setPalette() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc tk_setPalette}@anchor{4404}
@deffn {Method} tk_setPalette (background, /)

@deffnx {Method} tk_setPalette (*args, **kw)

Set a new color scheme for all Tk widget elements.
Existing widgets are updated and the option database is changed so that
future widgets use the new colors.
A single color argument is taken as the normal background color, from
which a complete palette is computed.
Alternatively, the arguments may be given as keyword `name'/`value' pairs
naming individual options in the option database.
The recognized option names are @code{activeBackground},
@code{activeForeground}, @code{background}, @code{disabledForeground},
@code{foreground}, @code{highlightBackground}, @code{highlightColor},
@code{insertBackground}, @code{selectColor}, @code{selectBackground},
@code{selectForeground}, and @code{troughColor}; reasonable defaults are
computed for any that are not specified.
@end deffn

@geindex tk_bisque() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc tk_bisque}@anchor{4405}
@deffn {Method} tk_bisque ()

Restore the application’s colors to the light brown (bisque) color scheme
used in Tk 3.6 and earlier versions.
Provided for backward compatibility.
@end deffn

@geindex tk_strictMotif() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc tk_strictMotif}@anchor{4406}
@deffn {Method} tk_strictMotif (boolean=None)

Query or set whether Tk’s look and feel should strictly adhere to Motif.
A true `boolean' value enables strict Motif compliance (for example, no
color change when the mouse passes over a slider).
Return the resulting setting.
@end deffn

@geindex busy() (tkinter.Misc method)

@geindex busy_hold() (tkinter.Misc method)

@geindex tk_busy() (tkinter.Misc method)

@geindex tk_busy_hold() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc busy}@anchor{4407}@anchor{library/tkinter tkinter Misc busy_hold}@anchor{4408}@anchor{library/tkinter tkinter Misc tk_busy}@anchor{4409}@anchor{library/tkinter tkinter Misc tk_busy_hold}@anchor{440a}
@deffn {Method} tk_busy_hold (**kw)

Make this widget appear busy.
A transparent window is placed in front of the widget, so that it and all
of its descendants in the widget hierarchy are blocked from pointer
events and display a busy cursor.
Normally @ref{43e3,,update()} should be called immediately afterwards to ensure
that the hold operation is in effect before the application starts its
processing.

The only supported configuration option is `cursor', the cursor to be
displayed while the widget is busy; it may have any of the values
accepted by @code{configure()}.

@ref{4408,,busy_hold()}, @ref{4407,,busy()} and @ref{4409,,tk_busy()} are aliases of
@code{tk_busy_hold()}.


Added in version 3.13.

@end deffn

@geindex busy_configure() (tkinter.Misc method)

@geindex busy_config() (tkinter.Misc method)

@geindex tk_busy_config() (tkinter.Misc method)

@geindex tk_busy_configure() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc busy_configure}@anchor{440b}@anchor{library/tkinter tkinter Misc busy_config}@anchor{440c}@anchor{library/tkinter tkinter Misc tk_busy_config}@anchor{440d}@anchor{library/tkinter tkinter Misc tk_busy_configure}@anchor{440e}
@deffn {Method} tk_busy_configure (cnf=None, **kw)

Query or modify the configuration options of the busy window.
The widget must have been previously made busy by @ref{440a,,tk_busy_hold()}.
With no arguments, return a dictionary describing all of the available
options; if `cnf' is the name of an option, return a tuple describing
that one option.
Otherwise set the given options to the given values.
Options may have any of the values accepted by @code{tk_busy_hold()}.

The option database is referenced through the widget name or class.
For example, if a @ref{440f,,Frame} widget named @code{frame} is to be made
busy, the busy cursor can be specified for it by either of the calls:

@example
w.option_add('*frame.busyCursor', 'gumby')
w.option_add('*Frame.BusyCursor', 'gumby')
@end example

@ref{440b,,busy_configure()}, @ref{440c,,busy_config()} and @ref{440d,,tk_busy_config()}
are aliases of @code{tk_busy_configure()}.


Added in version 3.13.

@end deffn

@geindex busy_cget() (tkinter.Misc method)

@geindex tk_busy_cget() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc busy_cget}@anchor{4410}@anchor{library/tkinter tkinter Misc tk_busy_cget}@anchor{4411}
@deffn {Method} tk_busy_cget (option)

Return the current value of the busy configuration `option'.
The widget must have been previously made busy by @ref{440a,,tk_busy_hold()},
and `option' may have any of the values accepted by that method.

@ref{4410,,busy_cget()} is an alias of @code{tk_busy_cget()}.


Added in version 3.13.

@end deffn

@geindex busy_forget() (tkinter.Misc method)

@geindex tk_busy_forget() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc busy_forget}@anchor{4412}@anchor{library/tkinter tkinter Misc tk_busy_forget}@anchor{4413}
@deffn {Method} tk_busy_forget ()

Make this widget no longer busy, releasing the resources (including the
transparent window) allocated when it was made busy.
User events will again be received by the widget.
These resources are also released when the widget is destroyed.

@ref{4412,,busy_forget()} is an alias of @code{tk_busy_forget()}.


Added in version 3.13.

@end deffn

@geindex busy_status() (tkinter.Misc method)

@geindex tk_busy_status() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc busy_status}@anchor{4414}@anchor{library/tkinter tkinter Misc tk_busy_status}@anchor{4415}
@deffn {Method} tk_busy_status ()

Return @code{True} if the widget is currently busy, @code{False} otherwise.

@ref{4414,,busy_status()} is an alias of @code{tk_busy_status()}.


Added in version 3.13.

@end deffn

@geindex busy_current() (tkinter.Misc method)

@geindex tk_busy_current() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc busy_current}@anchor{4416}@anchor{library/tkinter tkinter Misc tk_busy_current}@anchor{4417}
@deffn {Method} tk_busy_current (pattern=None)

Return a list of widgets that are currently busy.
If `pattern' is given, only busy widgets whose path names match the
pattern are returned.

@ref{4416,,busy_current()} is an alias of @code{tk_busy_current()}.


Added in version 3.13.

@end deffn

@geindex winfo_atom() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc winfo_atom}@anchor{4418}
@deffn {Method} winfo_atom (name, displayof=0)

Return the integer identifier for the atom whose name is `name', creating
a new atom if none exists.
If `displayof' is given, the atom is looked up on the display of that
window; otherwise it is looked up on the display of the application’s
main window.
@end deffn

@geindex winfo_atomname() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc winfo_atomname}@anchor{4419}
@deffn {Method} winfo_atomname (id, displayof=0)

Return the textual name for the atom whose integer identifier is `id'.
This is the inverse of @ref{4418,,winfo_atom()}.
If `displayof' is given, the identifier is looked up on the display of
that window; otherwise it is looked up on the display of the
application’s main window.
@end deffn

@geindex winfo_cells() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc winfo_cells}@anchor{441a}
@deffn {Method} winfo_cells ()

Return the number of cells in the colormap for the widget.
@end deffn

@geindex winfo_children() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc winfo_children}@anchor{441b}
@deffn {Method} winfo_children ()

Return a list containing the widgets that are children of the widget, in
stacking order from lowest to highest.
Toplevel windows are returned as children of their logical parents.
@end deffn

@geindex winfo_class() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc winfo_class}@anchor{441c}
@deffn {Method} winfo_class ()

Return the class name of the widget.
@end deffn

@geindex winfo_colormapfull() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc winfo_colormapfull}@anchor{441d}
@deffn {Method} winfo_colormapfull ()

Return @code{True} if the colormap for the widget is known to be full,
@code{False} otherwise.
@end deffn

@geindex winfo_containing() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc winfo_containing}@anchor{441e}
@deffn {Method} winfo_containing (rootX, rootY, displayof=0)

Return the widget containing the point given by `rootX' and `rootY', or
@code{None} if no window in this application contains the point.
The coordinates are in screen units in the coordinate system of the root
window.
If `displayof' is given, the coordinates refer to the screen containing
that window; otherwise they refer to the screen of the application’s main
window.
@end deffn

@geindex winfo_depth() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc winfo_depth}@anchor{441f}
@deffn {Method} winfo_depth ()

Return the depth of the widget, that is, the number of bits per pixel.
@end deffn

@geindex winfo_exists() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc winfo_exists}@anchor{4420}
@deffn {Method} winfo_exists ()

Return @code{1} if the widget exists, @code{0} otherwise.
@end deffn

@geindex winfo_fpixels() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc winfo_fpixels}@anchor{4421}
@deffn {Method} winfo_fpixels (number)

Return a floating-point value giving the number of pixels in the widget
corresponding to the screen distance `number' (for example,
@code{"2.0c"} or @code{"1i"}).
The result may be fractional; for a rounded integer value use
@ref{4422,,winfo_pixels()}.
@end deffn

@geindex winfo_geometry() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc winfo_geometry}@anchor{4423}
@deffn {Method} winfo_geometry ()

Return the geometry of the widget, in the form @code{widthxheight+x+y}.
All dimensions are in pixels.
@end deffn

@geindex winfo_height() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc winfo_height}@anchor{4388}
@deffn {Method} winfo_height ()

Return the height of the widget in pixels.
When a window is first created its height is 1 pixel; it is eventually
changed by a geometry manager.
See also @ref{4424,,winfo_reqheight()}.
@end deffn

@geindex winfo_id() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc winfo_id}@anchor{436f}
@deffn {Method} winfo_id ()

Return a low-level platform-specific identifier for the widget.
On Unix this is the X window identifier, and on Windows it is the window
handle.
@end deffn

@geindex winfo_interps() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc winfo_interps}@anchor{4425}
@deffn {Method} winfo_interps (displayof=0)

Return a tuple of the names of all Tcl interpreters currently registered
for a particular display.
If `displayof' is given, the return value refers to the display of that
window; otherwise it refers to the display of the application’s main
window.
@end deffn

@geindex winfo_ismapped() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc winfo_ismapped}@anchor{4426}
@deffn {Method} winfo_ismapped ()

Return @code{1} if the widget is currently mapped, @code{0} otherwise.
@end deffn

@geindex winfo_manager() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc winfo_manager}@anchor{4427}
@deffn {Method} winfo_manager ()

Return the name of the geometry manager currently responsible for the
widget, or an empty string if it is not managed by any geometry manager.
@end deffn

@geindex winfo_name() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc winfo_name}@anchor{4428}
@deffn {Method} winfo_name ()

Return the widget’s name within its parent, as opposed to its full path
name.
@end deffn

@geindex winfo_parent() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc winfo_parent}@anchor{4372}
@deffn {Method} winfo_parent ()

Return the path name of the widget’s parent, or an empty string if the
widget is the main window of the application.
@end deffn

@geindex winfo_pathname() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc winfo_pathname}@anchor{4429}
@deffn {Method} winfo_pathname (id, displayof=0)

Return the path name of the window whose identifier is `id'.
If `displayof' is given, the identifier is looked up on the display of
that window; otherwise it is looked up on the display of the
application’s main window.
@end deffn

@geindex winfo_pixels() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc winfo_pixels}@anchor{4422}
@deffn {Method} winfo_pixels (number)

Return the number of pixels in the widget corresponding to the screen
distance `number' (for example, @code{"2.0c"} or @code{"1i"}).
The result is rounded to the nearest integer; for a fractional result use
@ref{4421,,winfo_fpixels()}.
@end deffn

@geindex winfo_pointerx() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc winfo_pointerx}@anchor{442a}
@deffn {Method} winfo_pointerx ()

Return the pointer’s `x' coordinate, in pixels, relative to the screen’s
root window (or virtual root, if one is in use).
Return @code{-1} if the pointer is not on the same screen as the widget.
@end deffn

@geindex winfo_pointerxy() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc winfo_pointerxy}@anchor{442b}
@deffn {Method} winfo_pointerxy ()

Return the pointer’s coordinates as an @code{(x, y)} tuple, in pixels,
relative to the screen’s root window (or virtual root, if one is in use).
Both coordinates are @code{-1} if the pointer is not on the same screen as
the widget.
@end deffn

@geindex winfo_pointery() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc winfo_pointery}@anchor{442c}
@deffn {Method} winfo_pointery ()

Return the pointer’s `y' coordinate, in pixels, relative to the screen’s
root window (or virtual root, if one is in use).
Return @code{-1} if the pointer is not on the same screen as the widget.
@end deffn

@geindex winfo_reqheight() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc winfo_reqheight}@anchor{4424}
@deffn {Method} winfo_reqheight ()

Return the widget’s requested height in pixels.
This is the value used by the widget’s geometry manager to compute its
geometry.
@end deffn

@geindex winfo_reqwidth() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc winfo_reqwidth}@anchor{442d}
@deffn {Method} winfo_reqwidth ()

Return the widget’s requested width in pixels.
This is the value used by the widget’s geometry manager to compute its
geometry.
@end deffn

@geindex winfo_rgb() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc winfo_rgb}@anchor{442e}
@deffn {Method} winfo_rgb (color)

Return an @code{(r, g, b)} tuple of the red, green, and blue intensities, in
the range 0 to 65535, that correspond to `color' in the widget.
`color' may be specified in any of the forms acceptable for a color
option.
@end deffn

@geindex winfo_rootx() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc winfo_rootx}@anchor{442f}
@deffn {Method} winfo_rootx ()

Return the `x' coordinate, in the root window of the screen, of the
upper-left corner of the widget’s border (or of the widget itself if it
has no border).
@end deffn

@geindex winfo_rooty() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc winfo_rooty}@anchor{4430}
@deffn {Method} winfo_rooty ()

Return the `y' coordinate, in the root window of the screen, of the
upper-left corner of the widget’s border (or of the widget itself if it
has no border).
@end deffn

@geindex winfo_screen() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc winfo_screen}@anchor{4431}
@deffn {Method} winfo_screen ()

Return the name of the screen associated with the widget, in the form
@code{displayName.screenIndex}.
@end deffn

@geindex winfo_screencells() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc winfo_screencells}@anchor{4432}
@deffn {Method} winfo_screencells ()

Return the number of cells in the default colormap for the widget’s
screen.
@end deffn

@geindex winfo_screendepth() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc winfo_screendepth}@anchor{4433}
@deffn {Method} winfo_screendepth ()

Return the depth of the root window of the widget’s screen, that is, the
number of bits per pixel.
@end deffn

@geindex winfo_screenheight() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc winfo_screenheight}@anchor{4434}
@deffn {Method} winfo_screenheight ()

Return the height of the widget’s screen in pixels.
@end deffn

@geindex winfo_screenmmheight() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc winfo_screenmmheight}@anchor{4435}
@deffn {Method} winfo_screenmmheight ()

Return the height of the widget’s screen in millimeters.
@end deffn

@geindex winfo_screenmmwidth() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc winfo_screenmmwidth}@anchor{4436}
@deffn {Method} winfo_screenmmwidth ()

Return the width of the widget’s screen in millimeters.
@end deffn

@geindex winfo_screenvisual() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc winfo_screenvisual}@anchor{4437}
@deffn {Method} winfo_screenvisual ()

Return the default visual class for the widget’s screen, one of
@code{"directcolor"}, @code{"grayscale"}, @code{"pseudocolor"}, @code{"staticcolor"},
@code{"staticgray"}, or @code{"truecolor"}.
@end deffn

@geindex winfo_screenwidth() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc winfo_screenwidth}@anchor{4438}
@deffn {Method} winfo_screenwidth ()

Return the width of the widget’s screen in pixels.
@end deffn

@geindex winfo_server() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc winfo_server}@anchor{4439}
@deffn {Method} winfo_server ()

Return a string containing information about the server for the widget’s
display.
The exact format of this string may vary from platform to platform.
@end deffn

@geindex winfo_toplevel() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc winfo_toplevel}@anchor{439d}
@deffn {Method} winfo_toplevel ()

Return the top-of-hierarchy window containing the widget.
In standard Tk this is always a @ref{443a,,Toplevel} widget.
@end deffn

@geindex winfo_viewable() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc winfo_viewable}@anchor{4389}
@deffn {Method} winfo_viewable ()

Return @code{1} if the widget and all of its ancestors up through the
nearest toplevel window are mapped, @code{0} otherwise.
@end deffn

@geindex winfo_visual() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc winfo_visual}@anchor{443b}
@deffn {Method} winfo_visual ()

Return the visual class for the widget, one of @code{"directcolor"},
@code{"grayscale"}, @code{"pseudocolor"}, @code{"staticcolor"}, @code{"staticgray"},
or @code{"truecolor"}.
@end deffn

@geindex winfo_visualid() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc winfo_visualid}@anchor{443c}
@deffn {Method} winfo_visualid ()

Return the X identifier for the visual for the widget.
@end deffn

@geindex winfo_visualsavailable() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc winfo_visualsavailable}@anchor{443d}
@deffn {Method} winfo_visualsavailable (includeids=False)

Return a list describing the visuals available for the widget’s screen.
Each item consists of a visual class (see @ref{443b,,winfo_visual()}) followed
by an integer depth.
If `includeids' is true, the X identifier for the visual is also
included.
@end deffn

@geindex winfo_vrootheight() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc winfo_vrootheight}@anchor{443e}
@deffn {Method} winfo_vrootheight ()

Return the height of the virtual root window associated with the widget
if there is one; otherwise return the height of the widget’s screen.
@end deffn

@geindex winfo_vrootwidth() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc winfo_vrootwidth}@anchor{443f}
@deffn {Method} winfo_vrootwidth ()

Return the width of the virtual root window associated with the widget if
there is one; otherwise return the width of the widget’s screen.
@end deffn

@geindex winfo_vrootx() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc winfo_vrootx}@anchor{4440}
@deffn {Method} winfo_vrootx ()

Return the `x' offset of the virtual root window associated with the
widget, relative to the root window of its screen.
This is normally zero or negative, and is @code{0} if there is no virtual
root window.
@end deffn

@geindex winfo_vrooty() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc winfo_vrooty}@anchor{4441}
@deffn {Method} winfo_vrooty ()

Return the `y' offset of the virtual root window associated with the
widget, relative to the root window of its screen.
This is normally zero or negative, and is @code{0} if there is no virtual
root window.
@end deffn

@geindex winfo_width() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc winfo_width}@anchor{4442}
@deffn {Method} winfo_width ()

Return the width of the widget in pixels.
When a window is first created its width is 1 pixel; it is eventually
changed by a geometry manager.
See also @ref{442d,,winfo_reqwidth()}.
@end deffn

@geindex winfo_x() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc winfo_x}@anchor{4387}
@deffn {Method} winfo_x ()

Return the `x' coordinate, in the widget’s parent, of the upper-left
corner of the widget’s border (or of the widget itself if it has no
border).
@end deffn

@geindex winfo_y() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc winfo_y}@anchor{4443}
@deffn {Method} winfo_y ()

Return the `y' coordinate, in the widget’s parent, of the upper-left
corner of the widget’s border (or of the widget itself if it has no
border).
@end deffn

@geindex info_patchlevel() (tkinter.Misc method)
@anchor{library/tkinter tkinter Misc info_patchlevel}@anchor{4444}
@deffn {Method} info_patchlevel ()

Return the Tcl/Tk patch level as a named tuple with the same five fields
as @ref{8b1,,sys.version_info}: `major', `minor', `micro', `releaselevel'
and `serial'.
`releaselevel' is @code{'alpha'}, @code{'beta'} or @code{'final'}.
Converting it to a string gives the version in the usual Tcl/Tk notation,
for example @code{'9.0.3'} for a final release or @code{'9.1b2'} for a
pre-release.


Added in version 3.11.

@end deffn
@end deffn

@geindex Wm (class in tkinter)
@anchor{library/tkinter tkinter Wm}@anchor{439c}
@deffn {Class} tkinter.Wm

The @code{Wm} mixin provides access to the window manager, allowing an
application to control such things as the title, geometry and icon of a
top-level window, the way it is resized, and how it responds to window
manager protocols.
It is mixed into @ref{19ee,,Tk} and @ref{443a,,Toplevel}, so its methods are
available on every top-level window.
Each method has two equivalent spellings: a short name and a
@code{wm_}-prefixed name (for example, @ref{4445,,title()} and @ref{4446,,wm_title()}).

@geindex wm_aspect() (tkinter.Wm method)

@geindex aspect() (tkinter.Wm method)
@anchor{library/tkinter tkinter Wm wm_aspect}@anchor{4447}@anchor{library/tkinter tkinter Wm aspect}@anchor{4448}
@deffn {Method} aspect (minNumer=None, minDenom=None, maxNumer=None, maxDenom=None)

Constrain the aspect ratio (the ratio of width to height) of the window.
If all four arguments are given, the window manager keeps the ratio
between @code{minNumer/minDenom} and @code{maxNumer/maxDenom}; passing empty
strings removes any existing restriction.
With no arguments, return a tuple of the four current values, or an empty
string if no aspect restriction is in effect.
@ref{4447,,wm_aspect()} is an alias of @code{aspect()}.
@end deffn

@geindex wm_attributes() (tkinter.Wm method)

@geindex attributes() (tkinter.Wm method)
@anchor{library/tkinter tkinter Wm wm_attributes}@anchor{4449}@anchor{library/tkinter tkinter Wm attributes}@anchor{444a}
@deffn {Method} attributes (*args, return_python_dict=False, **kwargs)

Query or set platform-specific attributes of the window.
With no arguments, return the platform-specific flags and their values;
pass `return_python_dict' as true to get them as a dictionary.
A single option name such as @code{'alpha'} returns the value of that
option, and options are set using keyword arguments (@code{alpha=0.5}).

The available attributes differ by platform.
All platforms support:


@table @asis

@item `alpha'

The window’s opacity, from @code{0.0} (fully transparent) to @code{1.0}
(opaque).
Where transparency is unsupported the value stays at @code{1.0}.

@item `appearance'

Whether the window is rendered in dark mode on Windows and macOS:
@code{'auto'}, @code{'light'} or @code{'dark'} (this has no effect on X11).

@item `fullscreen'

Whether the window takes up the entire screen and has no borders.

@item `topmost'

Whether the window is displayed above all other windows.
@end table

Windows additionally supports:


@table @asis

@item `disabled'

Whether the window is in a disabled state.

@item `toolwindow'

Whether the window uses the tool window style.

@item `transparentcolor'

The color that is made fully transparent, or an empty string for none.
@end table

macOS additionally supports:


@table @asis

@item `class'

Whether the underlying Aqua window is an @code{nswindow} or an
@code{nspanel}; this can only be set before the window is created.

@item `modified'

The modification state shown by the window’s close button and proxy
icon.

@item `notify'

Whether the application’s dock icon bounces to request attention.

@item `stylemask'

The style mask of the underlying Aqua window, given as a list of bit
names such as @code{titled} or @code{resizable}.

@item `tabbingid'

The identifier of the tab group that the window belongs to.

@item `tabbingmode'

Whether the window may be opened as a tab: @code{'auto'}, @code{'preferred'}
or @code{'disallowed'}.

@item `titlepath'

The path of the file represented by the window’s proxy icon.

@item `transparent'

Whether the content area is transparent and the window shadow is
turned off.
@end table

X11 additionally supports:


@table @asis

@item `type'

The window type, or a list of types in order of preference, that the
window manager should use to interpret the window, such as
@code{'dialog'} or @code{'splash'}.

@item `zoomed'

Whether the window is maximized.
@end table

@cartouche
@quotation Note 
Tk 8.6 added the `type' attribute, and Tk 9.0 added the `appearance',
`class', `stylemask', `tabbingid' and `tabbingmode' attributes.
@end quotation
@end cartouche

On X11 changes are applied asynchronously, so a queried value may not yet
reflect the most recent request.
@ref{4449,,wm_attributes()} is an alias of @code{attributes()}.


Changed in version 3.13: A single attribute may now be queried by name without the leading
@code{-}, and attributes may be set using keyword arguments.
The `return_python_dict' parameter was added.



Deprecated since version 3.13: Setting an attribute by passing the option name (with a leading
@code{-}) and its value as two positional arguments, as in
@code{w.attributes('-alpha', 0.5)}, is deprecated; use keyword arguments
instead.

@end deffn

@geindex wm_client() (tkinter.Wm method)

@geindex client() (tkinter.Wm method)
@anchor{library/tkinter tkinter Wm wm_client}@anchor{444b}@anchor{library/tkinter tkinter Wm client}@anchor{444c}
@deffn {Method} client (name=None)

Store `name', which should be the name of the host on which the
application is running, in the window’s @code{WM_CLIENT_MACHINE} property
for use by the window or session manager.
An empty string deletes the property.
With no argument, return the last name set, or an empty string.
@ref{444b,,wm_client()} is an alias of @code{client()}.
@end deffn

@geindex wm_colormapwindows() (tkinter.Wm method)

@geindex colormapwindows() (tkinter.Wm method)
@anchor{library/tkinter tkinter Wm wm_colormapwindows}@anchor{444d}@anchor{library/tkinter tkinter Wm colormapwindows}@anchor{444e}
@deffn {Method} colormapwindows (*wlist)

Manipulate the @code{WM_COLORMAP_WINDOWS} property, which tells the window
manager about windows that have private colormaps.
If `wlist' is given, overwrite the property with those windows (their
order is a priority order for installing colormaps).
With no arguments, return the list of windows currently named in the
property.
@ref{444d,,wm_colormapwindows()} is an alias of @code{colormapwindows()}.
@end deffn

@geindex wm_command() (tkinter.Wm method)

@geindex command() (tkinter.Wm method)
@anchor{library/tkinter tkinter Wm wm_command}@anchor{444f}@anchor{library/tkinter tkinter Wm command}@anchor{4450}
@deffn {Method} command (value=None)

Store `value' in the window’s @code{WM_COMMAND} property for use by the
window or session manager; it should be a list giving the words of the
command used to invoke the application.
An empty string deletes the property.
With no argument, return the last value set, or an empty string.
@ref{444f,,wm_command()} is an alias of @code{command()}.
@end deffn

@geindex wm_deiconify() (tkinter.Wm method)

@geindex deiconify() (tkinter.Wm method)
@anchor{library/tkinter tkinter Wm wm_deiconify}@anchor{4451}@anchor{library/tkinter tkinter Wm deiconify}@anchor{4452}
@deffn {Method} deiconify ()

Display the window in normal (non-iconified) form by mapping it.
If the window has never been mapped, this ensures it appears de-iconified
when it is first mapped.
On Windows the window is also raised and given the focus.
@ref{4451,,wm_deiconify()} is an alias of @code{deiconify()}.
@end deffn

@geindex wm_focusmodel() (tkinter.Wm method)

@geindex focusmodel() (tkinter.Wm method)
@anchor{library/tkinter tkinter Wm wm_focusmodel}@anchor{4453}@anchor{library/tkinter tkinter Wm focusmodel}@anchor{4454}
@deffn {Method} focusmodel (model=None)

Set or query the focus model for the window.
`model' is either @code{'active'} (the window claims the input focus for
itself or its descendants, even when the focus is in another application)
or @code{'passive'} (the window relies on the window manager to give it the
focus).
With no argument, return the current model.
The default is @code{'passive'}, which is what the @code{focus()} command
assumes.
@ref{4453,,wm_focusmodel()} is an alias of @code{focusmodel()}.
@end deffn

@geindex wm_forget() (tkinter.Wm method)

@geindex forget() (tkinter.Wm method)
@anchor{library/tkinter tkinter Wm wm_forget}@anchor{4455}@anchor{library/tkinter tkinter Wm forget}@anchor{4456}
@deffn {Method} forget (window)

Unmap `window' from the screen so that it is no longer managed by the
window manager.
A @ref{443a,,Toplevel} is then treated like a @ref{440f,,Frame}, although its
@code{-menu} configuration is remembered and the menu reappears if the
widget is managed again.
@ref{4455,,wm_forget()} is an alias of @code{forget()}.


Added in version 3.3.

@end deffn

@geindex wm_frame() (tkinter.Wm method)

@geindex frame() (tkinter.Wm method)
@anchor{library/tkinter tkinter Wm wm_frame}@anchor{4457}@anchor{library/tkinter tkinter Wm frame}@anchor{4458}
@deffn {Method} frame ()

Return the platform-specific window identifier for the outermost
decorative frame containing the window, if the window manager has
reparented it into such a frame; otherwise return the identifier of the
window itself.
@ref{4457,,wm_frame()} is an alias of @code{frame()}.
@end deffn

@geindex wm_geometry() (tkinter.Wm method)

@geindex geometry() (tkinter.Wm method)
@anchor{library/tkinter tkinter Wm wm_geometry}@anchor{4459}@anchor{library/tkinter tkinter Wm geometry}@anchor{445a}
@deffn {Method} geometry (newGeometry=None)

Set or query the geometry of the window.
`newGeometry' has the form @code{=widthxheight+x+y}, where any of @code{=},
@code{widthxheight} and the @code{+x+y} position may be omitted.
`width' and `height' are in pixels (or grid units for a gridded window);
a position preceded by @code{+} is measured from the left or top edge of the
screen and one preceded by @code{-} from the right or bottom edge.
An empty string cancels any user-specified geometry, letting the window
revert to its natural size.
With no argument, return the current geometry as a string of the form
@code{'200x200+10+10'}.
@ref{4459,,wm_geometry()} is an alias of @code{geometry()}.
@end deffn

@geindex wm_grid() (tkinter.Wm method)

@geindex grid() (tkinter.Wm method)
@anchor{library/tkinter tkinter Wm wm_grid}@anchor{445b}@anchor{library/tkinter tkinter Wm grid}@anchor{445c}
@deffn {Method} grid (baseWidth=None, baseHeight=None, widthInc=None, heightInc=None)

Manage the window as a gridded window and define the relationship between
grid units and pixels.
`baseWidth' and `baseHeight' are the numbers of grid units for the
window’s internally requested size, and `widthInc' and `heightInc' are
the pixel sizes of a horizontal and vertical grid unit.
Empty strings turn off gridded management.
With no arguments, return a tuple of the four current values, or an empty
string if the window is not gridded.
@ref{445b,,wm_grid()} is an alias of @code{grid()}.
@end deffn

@geindex wm_group() (tkinter.Wm method)

@geindex group() (tkinter.Wm method)
@anchor{library/tkinter tkinter Wm wm_group}@anchor{445d}@anchor{library/tkinter tkinter Wm group}@anchor{445e}
@deffn {Method} group (pathName=None)

Set or query the leader of a group of related windows.
`pathName' gives the path name of the group leader; the window manager
may, for example, unmap all windows in the group when the leader is
iconified.
An empty string removes the window from any group.
With no argument, return the path name of the current group leader, or an
empty string.
@ref{445d,,wm_group()} is an alias of @code{group()}.
@end deffn

@geindex wm_iconbitmap() (tkinter.Wm method)

@geindex iconbitmap() (tkinter.Wm method)
@anchor{library/tkinter tkinter Wm wm_iconbitmap}@anchor{445f}@anchor{library/tkinter tkinter Wm iconbitmap}@anchor{4460}
@deffn {Method} iconbitmap (bitmap=None, default=None)

Set or query the bitmap used by the window manager for the window’s icon.
`bitmap' names a bitmap in one of the standard forms accepted by Tk; an
empty string cancels the current icon bitmap.
With no argument, return the name of the current icon bitmap, or an empty
string.
On Windows the `default' argument names an icon (for example an @code{.ico}
file) applied to all top-level windows that have no icon of their own.
@ref{445f,,wm_iconbitmap()} is an alias of @code{iconbitmap()}.
@end deffn

@geindex wm_iconify() (tkinter.Wm method)

@geindex iconify() (tkinter.Wm method)
@anchor{library/tkinter tkinter Wm wm_iconify}@anchor{4461}@anchor{library/tkinter tkinter Wm iconify}@anchor{4462}
@deffn {Method} iconify ()

Iconify the window.
If the window has not yet been mapped for the first time, arrange for it
to appear in the iconified state when it is eventually mapped.
@ref{4461,,wm_iconify()} is an alias of @code{iconify()}.
@end deffn

@geindex wm_iconmask() (tkinter.Wm method)

@geindex iconmask() (tkinter.Wm method)
@anchor{library/tkinter tkinter Wm wm_iconmask}@anchor{4463}@anchor{library/tkinter tkinter Wm iconmask}@anchor{4464}
@deffn {Method} iconmask (bitmap=None)

Set or query the bitmap used as a mask for the icon (see
@ref{4460,,iconbitmap()}).
Where the mask is zero no icon is displayed; where it is one, the
corresponding bits of the icon bitmap are shown.
An empty string cancels the current mask.
With no argument, return the name of the current icon mask, or an empty
string.
@ref{4463,,wm_iconmask()} is an alias of @code{iconmask()}.
@end deffn

@geindex wm_iconname() (tkinter.Wm method)

@geindex iconname() (tkinter.Wm method)
@anchor{library/tkinter tkinter Wm wm_iconname}@anchor{4465}@anchor{library/tkinter tkinter Wm iconname}@anchor{4466}
@deffn {Method} iconname (newName=None)

Set or query the name displayed by the window manager inside the window’s
icon.
With no argument, return the current icon name, or an empty string if
none has been set (in which case the window manager normally displays the
window’s title).
@ref{4465,,wm_iconname()} is an alias of @code{iconname()}.
@end deffn

@geindex wm_iconphoto() (tkinter.Wm method)

@geindex iconphoto() (tkinter.Wm method)
@anchor{library/tkinter tkinter Wm wm_iconphoto}@anchor{4467}@anchor{library/tkinter tkinter Wm iconphoto}@anchor{4468}
@deffn {Method} iconphoto (default=False, *images)

Set the titlebar icon for the window from one or more @ref{1e28,,PhotoImage}
objects given in `images'.
Several images of different sizes (for example 16x16 and 32x32) may be
supplied so that the window manager can choose an appropriate one.
The image data is taken as a snapshot at the time of the call; later
changes to the images are not reflected.
If `default' is true, the icon is also applied to all top-level windows
created in the future.
On macOS only the first image is used.
@ref{4467,,wm_iconphoto()} is an alias of @code{iconphoto()}.


Added in version 3.3.

@end deffn

@geindex wm_iconposition() (tkinter.Wm method)

@geindex iconposition() (tkinter.Wm method)
@anchor{library/tkinter tkinter Wm wm_iconposition}@anchor{4469}@anchor{library/tkinter tkinter Wm iconposition}@anchor{446a}
@deffn {Method} iconposition (x=None, y=None)

Set or query a hint to the window manager about where the window’s icon
should be positioned.
Empty strings cancel an existing hint.
With no arguments, return a tuple of the two current values, or an empty
string if no hint is in effect.
@ref{4469,,wm_iconposition()} is an alias of @code{iconposition()}.
@end deffn

@geindex wm_iconwindow() (tkinter.Wm method)

@geindex iconwindow() (tkinter.Wm method)
@anchor{library/tkinter tkinter Wm wm_iconwindow}@anchor{446b}@anchor{library/tkinter tkinter Wm iconwindow}@anchor{446c}
@deffn {Method} iconwindow (pathName=None)

Set or query the window used as the icon for the window.
When the window is iconified, `pathName' is mapped to serve as its icon
and unmapped again when it is de-iconified.
An empty string cancels the association.
With no argument, return the path name of the current icon window, or an
empty string.
Not all window managers support icon windows, and the concept is
meaningless on non-X11 platforms.
@ref{446b,,wm_iconwindow()} is an alias of @code{iconwindow()}.
@end deffn

@geindex wm_manage() (tkinter.Wm method)

@geindex manage() (tkinter.Wm method)
@anchor{library/tkinter tkinter Wm wm_manage}@anchor{446d}@anchor{library/tkinter tkinter Wm manage}@anchor{446e}
@deffn {Method} manage (widget)

Make `widget' a stand-alone top-level window, decorated by the window
manager with a title bar and so on.
Only @ref{440f,,Frame}, @ref{446f,,LabelFrame} and @ref{443a,,Toplevel} widgets
may be used; passing any other widget type raises an error.
@ref{446d,,wm_manage()} is an alias of @code{manage()}.


Added in version 3.3.

@end deffn

@geindex wm_maxsize() (tkinter.Wm method)

@geindex maxsize() (tkinter.Wm method)
@anchor{library/tkinter tkinter Wm wm_maxsize}@anchor{4470}@anchor{library/tkinter tkinter Wm maxsize}@anchor{4471}
@deffn {Method} maxsize (width=None, height=None)

Set or query the maximum permissible dimensions of the window, in pixels
(or grid units for a gridded window).
The window manager restricts the window to be no larger than `width' and
`height'.
With no arguments, return a tuple of the current maximum width and
height.
The maximum size defaults to the size of the screen.
@ref{4470,,wm_maxsize()} is an alias of @code{maxsize()}.
@end deffn

@geindex wm_minsize() (tkinter.Wm method)

@geindex minsize() (tkinter.Wm method)
@anchor{library/tkinter tkinter Wm wm_minsize}@anchor{4472}@anchor{library/tkinter tkinter Wm minsize}@anchor{4473}
@deffn {Method} minsize (width=None, height=None)

Set or query the minimum permissible dimensions of the window, in pixels
(or grid units for a gridded window).
The window manager restricts the window to be no smaller than `width' and
`height'.
With no arguments, return a tuple of the current minimum width and
height.
The minimum size defaults to one pixel in each dimension.
@ref{4472,,wm_minsize()} is an alias of @code{minsize()}.
@end deffn

@geindex wm_overrideredirect() (tkinter.Wm method)

@geindex overrideredirect() (tkinter.Wm method)
@anchor{library/tkinter tkinter Wm wm_overrideredirect}@anchor{4474}@anchor{library/tkinter tkinter Wm overrideredirect}@anchor{4475}
@deffn {Method} overrideredirect (boolean=None)

Set or query the override-redirect flag for the window.
When this flag is set, the window is ignored by the window manager: it is
not reparented into a decorative frame and the user cannot manipulate it
through the usual window manager controls.
With no argument, return a boolean indicating whether the flag is set.
The flag is reliably honored only when the window is first mapped or
remapped from the withdrawn state.
@ref{4474,,wm_overrideredirect()} is an alias of @code{overrideredirect()}.
@end deffn

@geindex wm_positionfrom() (tkinter.Wm method)

@geindex positionfrom() (tkinter.Wm method)
@anchor{library/tkinter tkinter Wm wm_positionfrom}@anchor{4476}@anchor{library/tkinter tkinter Wm positionfrom}@anchor{4477}
@deffn {Method} positionfrom (who=None)

Set or query the source of the window’s current position.
`who' is either @code{'program'} or @code{'user'} and indicates whether the
position was requested by the program or by the user; an empty string
cancels the current source.
With no argument, return the current source, or an empty string if none
has been set.
Tk automatically sets the source to @code{'user'} when @ref{445a,,geometry()} is
called, unless it has been set explicitly to @code{'program'}.
@ref{4476,,wm_positionfrom()} is an alias of @code{positionfrom()}.
@end deffn

@geindex wm_protocol() (tkinter.Wm method)

@geindex protocol() (tkinter.Wm method)
@anchor{library/tkinter tkinter Wm wm_protocol}@anchor{4478}@anchor{library/tkinter tkinter Wm protocol}@anchor{4479}
@deffn {Method} protocol (name=None, func=None)

Register `func' as the handler for the window manager protocol `name', an
atom such as @code{'WM_DELETE_WINDOW'}, @code{'WM_SAVE_YOURSELF'} or
@code{'WM_TAKE_FOCUS'}; `func' is then called whenever the window manager
sends a message of that protocol.
Tk installs a default @code{WM_DELETE_WINDOW} handler that destroys the
window, which this method can replace.
If `func' is an empty string, the handler is removed.
With only `name', return the name of its registered handler command, or
an empty string if none is set (the default @code{WM_DELETE_WINDOW} handler
is not reported); with no arguments, return a tuple of the protocols that
currently have handlers.
@ref{4478,,wm_protocol()} is an alias of @code{protocol()}.
@end deffn

@geindex wm_resizable() (tkinter.Wm method)

@geindex resizable() (tkinter.Wm method)
@anchor{library/tkinter tkinter Wm wm_resizable}@anchor{447a}@anchor{library/tkinter tkinter Wm resizable}@anchor{447b}
@deffn {Method} resizable (width=None, height=None)

Control whether the user may interactively resize the window.
`width' and `height' are boolean values that determine whether the
window’s width and height may be changed.
With no arguments, return a tuple of two @code{0}/@code{1} values indicating
whether each dimension is currently resizable.
By default a window is resizable in both dimensions.
@ref{447a,,wm_resizable()} is an alias of @code{resizable()}.
@end deffn

@geindex wm_sizefrom() (tkinter.Wm method)

@geindex sizefrom() (tkinter.Wm method)
@anchor{library/tkinter tkinter Wm wm_sizefrom}@anchor{447c}@anchor{library/tkinter tkinter Wm sizefrom}@anchor{447d}
@deffn {Method} sizefrom (who=None)

Set or query the source of the window’s current size.
`who' is either @code{'program'} or @code{'user'} and indicates whether the
size was requested by the program or by the user; an empty string cancels
the current source.
With no argument, return the current source, or an empty string if none
has been set.
@ref{447c,,wm_sizefrom()} is an alias of @code{sizefrom()}.
@end deffn

@geindex wm_state() (tkinter.Wm method)

@geindex state() (tkinter.Wm method)
@anchor{library/tkinter tkinter Wm wm_state}@anchor{447e}@anchor{library/tkinter tkinter Wm state}@anchor{447f}
@deffn {Method} state (newstate=None)

Set or query the state of the window.
With no argument, return the current state: one of @code{'normal'},
@code{'iconic'}, @code{'withdrawn'}, @code{'icon'} or, on Windows and macOS only,
@code{'zoomed'}.
@code{'iconic'} refers to a window that has been iconified, while @code{'icon'}
refers to a window serving as the icon for another window (see
@ref{446c,,iconwindow()}); the @code{'icon'} state cannot be set.
@ref{447e,,wm_state()} is an alias of @code{state()}.
@end deffn

@geindex wm_title() (tkinter.Wm method)

@geindex title() (tkinter.Wm method)
@anchor{library/tkinter tkinter Wm wm_title}@anchor{4446}@anchor{library/tkinter tkinter Wm title}@anchor{4445}
@deffn {Method} title (string=None)

Set or query the title for the window, which the window manager should
display in the window’s title bar.
With no argument, return the current title.
The title defaults to the window’s name.
@ref{4446,,wm_title()} is an alias of @code{title()}.
@end deffn

@geindex wm_transient() (tkinter.Wm method)

@geindex transient() (tkinter.Wm method)
@anchor{library/tkinter tkinter Wm wm_transient}@anchor{4480}@anchor{library/tkinter tkinter Wm transient}@anchor{4481}
@deffn {Method} transient (master=None)

Mark the window as a transient window (such as a pull-down menu or
dialog) working on behalf of `master', the path name of another top-level
window.
An empty string clears the transient status.
With no argument, return the path name of the current master, or an empty
string.
A transient window mirrors state changes in its master and may be
decorated differently by the window manager; it is an error to make a
window a transient of itself.
@ref{4480,,wm_transient()} is an alias of @code{transient()}.
@end deffn

@geindex wm_withdraw() (tkinter.Wm method)

@geindex withdraw() (tkinter.Wm method)
@anchor{library/tkinter tkinter Wm wm_withdraw}@anchor{4482}@anchor{library/tkinter tkinter Wm withdraw}@anchor{4483}
@deffn {Method} withdraw ()

Withdraw the window from the screen, unmapping it and causing the window
manager to forget about it.
If the window has never been mapped, it is instead mapped in the
withdrawn state.
It is sometimes necessary to withdraw a window and then re-map it (for
example with @ref{4452,,deiconify()}) to make some window managers notice
changes to window attributes.
@ref{4482,,wm_withdraw()} is an alias of @code{withdraw()}.
@end deffn
@end deffn

@geindex Pack (class in tkinter)
@anchor{library/tkinter tkinter Pack}@anchor{4484}
@deffn {Class} tkinter.Pack

Geometry manager that arranges widgets by packing them against the sides of
their container.
The @code{Pack} mix-in is inherited by all widgets (through
@ref{438a,,Widget}) and provides the methods for managing a widget with the
`pack' geometry manager.
See also @ref{4390,,The packer}.

@geindex configure() (tkinter.Pack method)

@geindex config() (tkinter.Pack method)

@geindex pack_configure() (tkinter.Pack method)
@geindex pack() (tkinter.Pack method)
@anchor{library/tkinter tkinter Pack configure}@anchor{4485}@anchor{library/tkinter tkinter Pack config}@anchor{4486}@anchor{library/tkinter tkinter Pack pack_configure}@anchor{4487}
@deffn {Method} pack_configure (cnf=@{@}, **kw)
@anchor{library/tkinter tkinter Pack pack}@anchor{4392}
@deffnx {Method} pack (cnf=@{@}, **kw)

Pack the widget inside its container, positioning it relative to the
siblings already packed there.
The supported options are:


@table @asis

@item `side'

Which side of the container to pack the widget against: @code{'top'} (the
default), @code{'bottom'}, @code{'left'} or @code{'right'}.

@item `fill'

Whether to stretch the widget to fill its parcel: @code{'none'} (the
default), @code{'x'}, @code{'y'} or @code{'both'}.

@item `expand'

Whether the widget should expand to consume any extra space in its
container (a boolean, default false).

@item `anchor'

Where to position the widget in its parcel when the parcel is larger
than the widget: an anchor such as @code{'n'} or @code{'sw'} (default
@code{'center'}).

@item `ipadx', `ipady'

Internal padding added on the left and right (`ipadx') or top and
bottom (`ipady') of the widget, as a screen distance (default @code{0}).

@item `padx', `pady'

External padding left on the left and right (`padx') or top and bottom
(`pady') of the widget, as a screen distance or a pair of two
distances for the two sides (default @code{0}).

@item `after'

Pack the widget after the given widget in the packing order, using the
same container.

@item `before'

Pack the widget before the given widget in the packing order, using
the same container.

@item `in_'

The container in which to pack the widget; it defaults to the parent
widget.
@end table

@code{pack()}, @ref{4485,,configure()} and @ref{4486,,config()} are aliases of
@code{pack_configure()}.
@end deffn

@geindex forget() (tkinter.Pack method)

@geindex pack_forget() (tkinter.Pack method)
@anchor{library/tkinter tkinter Pack forget}@anchor{4488}@anchor{library/tkinter tkinter Pack pack_forget}@anchor{4489}
@deffn {Method} pack_forget ()

Unmap the widget and remove it from the packing order, forgetting its
packing options.
It can be packed again later with @ref{4487,,pack_configure()}.
@ref{4488,,forget()} is an alias of @code{pack_forget()}.
@end deffn

@geindex info() (tkinter.Pack method)

@geindex pack_info() (tkinter.Pack method)
@anchor{library/tkinter tkinter Pack info}@anchor{448a}@anchor{library/tkinter tkinter Pack pack_info}@anchor{448b}
@deffn {Method} pack_info ()

Return a dictionary of the widget’s current packing options.
@ref{448a,,info()} is an alias of @code{pack_info()}.
@end deffn

@geindex propagate() (tkinter.Pack method)

@geindex pack_propagate() (tkinter.Pack method)
@anchor{library/tkinter tkinter Pack propagate}@anchor{448c}@anchor{library/tkinter tkinter Pack pack_propagate}@anchor{448d}
@deffn {Method} pack_propagate ()

@deffnx {Method} pack_propagate (flag)

Same as @ref{43ce,,Misc.pack_propagate()}, treating this widget as a container:
enable or disable geometry propagation.
@ref{448c,,propagate()} is an alias of @code{pack_propagate()}.
@end deffn

@geindex slaves() (tkinter.Pack method)

@geindex pack_slaves() (tkinter.Pack method)
@anchor{library/tkinter tkinter Pack slaves}@anchor{448e}@anchor{library/tkinter tkinter Pack pack_slaves}@anchor{448f}
@deffn {Method} pack_slaves ()

Same as @ref{43d0,,Misc.pack_slaves()}: return the list of widgets packed in
this widget.
@ref{448e,,slaves()} is an alias of @code{pack_slaves()}.
@end deffn
@end deffn

@geindex Place (class in tkinter)
@anchor{library/tkinter tkinter Place}@anchor{4490}
@deffn {Class} tkinter.Place

Geometry manager that places widgets at explicit positions and sizes within
their container.
The @code{Place} mix-in is inherited by all widgets (through
@ref{438a,,Widget}).

@geindex configure() (tkinter.Place method)

@geindex config() (tkinter.Place method)

@geindex place_configure() (tkinter.Place method)
@geindex place() (tkinter.Place method)
@anchor{library/tkinter tkinter Place configure}@anchor{4491}@anchor{library/tkinter tkinter Place config}@anchor{4492}@anchor{library/tkinter tkinter Place place_configure}@anchor{4493}
@deffn {Method} place_configure (cnf=@{@}, **kw)
@anchor{library/tkinter tkinter Place place}@anchor{4494}
@deffnx {Method} place (cnf=@{@}, **kw)

Place the widget inside its container at an absolute or relative
position.
The supported options are:


@table @asis

@item `x', `y'

The absolute horizontal and vertical position of the widget’s anchor
point, as a screen distance (default @code{0}).

@item `relx', `rely'

The horizontal and vertical position of the widget’s anchor point as a
fraction of the container’s width and height, where @code{0.0} is the
left or top edge and @code{1.0} is the right or bottom edge.
If both the absolute and the relative option are given, their values
are summed.

@item `anchor'

Which point of the widget is placed at the given position: an anchor
such as @code{'n'} or @code{'se'} (default @code{'nw'}).

@item `width', `height'

The absolute width and height of the widget, as a screen distance.
By default the widget’s requested size is used.

@item `relwidth', `relheight'

The width and height of the widget as a fraction of the container’s
width and height.
If both the absolute and the relative option are given, their values
are summed.

@item `bordermode'

How the container’s border affects placement: @code{'inside'} (the
default) measures the area inside the border, @code{'outside'} measures
the area including the border, and @code{'ignore'} uses the official X
area.

@item `in_'

The container relative to which the widget is placed; it must be the
widget’s parent or a descendant of the parent, and defaults to the
parent.
@end table

@code{place()}, @ref{4491,,configure()} and @ref{4492,,config()} are aliases of
@code{place_configure()}.
@end deffn

@geindex forget() (tkinter.Place method)

@geindex place_forget() (tkinter.Place method)
@anchor{library/tkinter tkinter Place forget}@anchor{4495}@anchor{library/tkinter tkinter Place place_forget}@anchor{4496}
@deffn {Method} place_forget ()

Unmap the widget and remove it from the placement, forgetting its place
options.
@ref{4495,,forget()} is an alias of @code{place_forget()}.
@end deffn

@geindex info() (tkinter.Place method)

@geindex place_info() (tkinter.Place method)
@anchor{library/tkinter tkinter Place info}@anchor{4497}@anchor{library/tkinter tkinter Place place_info}@anchor{4498}
@deffn {Method} place_info ()

Return a dictionary of the widget’s current place options.
@ref{4497,,info()} is an alias of @code{place_info()}.
@end deffn

@geindex slaves() (tkinter.Place method)

@geindex place_slaves() (tkinter.Place method)
@anchor{library/tkinter tkinter Place slaves}@anchor{4499}@anchor{library/tkinter tkinter Place place_slaves}@anchor{449a}
@deffn {Method} place_slaves ()

Same as @ref{43d1,,Misc.place_slaves()}: return the list of widgets placed in
this widget.
@ref{4499,,slaves()} is an alias of @code{place_slaves()}.
@end deffn
@end deffn

@geindex Grid (class in tkinter)
@anchor{library/tkinter tkinter Grid}@anchor{449b}
@deffn {Class} tkinter.Grid

Geometry manager that arranges widgets in a two-dimensional grid of rows and
columns within their container.
The @code{Grid} mix-in is inherited by all widgets (through
@ref{438a,,Widget}).

@geindex configure() (tkinter.Grid method)

@geindex config() (tkinter.Grid method)

@geindex grid_configure() (tkinter.Grid method)
@geindex grid() (tkinter.Grid method)
@anchor{library/tkinter tkinter Grid configure}@anchor{449c}@anchor{library/tkinter tkinter Grid config}@anchor{449d}@anchor{library/tkinter tkinter Grid grid_configure}@anchor{449e}
@deffn {Method} grid_configure (cnf=@{@}, **kw)
@anchor{library/tkinter tkinter Grid grid}@anchor{437a}
@deffnx {Method} grid (cnf=@{@}, **kw)

Position the widget in a cell of its container’s grid.
The supported options are:


@table @asis

@item `row', `column'

The row and column of the cell to place the widget in, counting from
@code{0}.
`column' defaults to the column after the previous widget placed in
the same @code{grid_configure()} call (or @code{0}), and `row' defaults
to the next empty row.

@item `rowspan', `columnspan'

The number of rows and columns the widget should span (default @code{1}).

@item `sticky'

How to position or stretch the widget when its cell is larger than the
widget: a string containing zero or more of the characters @code{'n'},
@code{'s'}, @code{'e'} and @code{'w'}, naming the cell sides the widget sticks
to.
Specifying both @code{'n'} and @code{'s'} (or @code{'e'} and @code{'w'}) stretches
the widget to fill the height (or width) of the cell.
The default is @code{'@w{'}}, which centers the widget at its requested size.

@item `ipadx', `ipady'

Internal padding added on the left and right (`ipadx') or top and
bottom (`ipady') of the widget, as a screen distance (default @code{0}).

@item `padx', `pady'

External padding left on the left and right (`padx') or top and bottom
(`pady') of the widget, as a screen distance or a pair of two
distances for the two sides (default @code{0}).

@item `in_'

The container in whose grid to place the widget; it defaults to the
parent widget.
@end table

@code{grid()}, @ref{449c,,configure()} and @ref{449d,,config()} are aliases of
@code{grid_configure()}.
@end deffn

@geindex forget() (tkinter.Grid method)

@geindex grid_forget() (tkinter.Grid method)
@anchor{library/tkinter tkinter Grid forget}@anchor{449f}@anchor{library/tkinter tkinter Grid grid_forget}@anchor{44a0}
@deffn {Method} grid_forget ()

Unmap the widget and remove it from the grid, forgetting its grid
options.
@ref{449f,,forget()} is an alias of @code{grid_forget()}.
@end deffn

@geindex grid_remove() (tkinter.Grid method)
@anchor{library/tkinter tkinter Grid grid_remove}@anchor{44a1}
@deffn {Method} grid_remove ()

Unmap the widget and remove it from the grid, but remember its grid
options so that it is restored to the same cell if it is gridded again.
@end deffn

@geindex info() (tkinter.Grid method)

@geindex grid_info() (tkinter.Grid method)
@anchor{library/tkinter tkinter Grid info}@anchor{44a2}@anchor{library/tkinter tkinter Grid grid_info}@anchor{44a3}
@deffn {Method} grid_info ()

Return a dictionary of the widget’s current grid options.
@ref{44a2,,info()} is an alias of @code{grid_info()}.
@end deffn

@geindex bbox() (tkinter.Grid method)

@geindex grid_bbox() (tkinter.Grid method)
@anchor{library/tkinter tkinter Grid bbox}@anchor{44a4}@anchor{library/tkinter tkinter Grid grid_bbox}@anchor{44a5}
@deffn {Method} grid_bbox (column=None, row=None, col2=None, row2=None)

Same as @ref{43c3,,Misc.grid_bbox()}.
@ref{44a4,,bbox()} is an alias of @code{grid_bbox()}.
@end deffn

@geindex columnconfigure() (tkinter.Grid method)

@geindex grid_columnconfigure() (tkinter.Grid method)
@anchor{library/tkinter tkinter Grid columnconfigure}@anchor{44a6}@anchor{library/tkinter tkinter Grid grid_columnconfigure}@anchor{44a7}
@deffn {Method} grid_columnconfigure (index, cnf=@{@}, **kw)

Same as @ref{43c5,,Misc.grid_columnconfigure()}: query or set the options (such
as `weight', `minsize', `pad' and `uniform') of a grid column.
@ref{44a6,,columnconfigure()} is an alias of @code{grid_columnconfigure()}.
@end deffn

@geindex rowconfigure() (tkinter.Grid method)

@geindex grid_rowconfigure() (tkinter.Grid method)
@anchor{library/tkinter tkinter Grid rowconfigure}@anchor{44a8}@anchor{library/tkinter tkinter Grid grid_rowconfigure}@anchor{44a9}
@deffn {Method} grid_rowconfigure (index, cnf=@{@}, **kw)

Same as @ref{43c7,,Misc.grid_rowconfigure()}: query or set the options of a
grid row.
@ref{44a8,,rowconfigure()} is an alias of @code{grid_rowconfigure()}.
@end deffn

@geindex location() (tkinter.Grid method)

@geindex grid_location() (tkinter.Grid method)
@anchor{library/tkinter tkinter Grid location}@anchor{44aa}@anchor{library/tkinter tkinter Grid grid_location}@anchor{44ab}
@deffn {Method} grid_location (x, y)

Same as @ref{43c8,,Misc.grid_location()}: return the @code{(column, row)} of the
cell that covers the pixel at `x', `y'.
@ref{44aa,,location()} is an alias of @code{grid_location()}.
@end deffn

@geindex size() (tkinter.Grid method)

@geindex grid_size() (tkinter.Grid method)
@anchor{library/tkinter tkinter Grid size}@anchor{44ac}@anchor{library/tkinter tkinter Grid grid_size}@anchor{44ad}
@deffn {Method} grid_size ()

Same as @ref{43cb,,Misc.grid_size()}: return a @code{(columns, rows)} tuple giving
the size of the grid.
@ref{44ac,,size()} is an alias of @code{grid_size()}.
@end deffn

@geindex propagate() (tkinter.Grid method)

@geindex grid_propagate() (tkinter.Grid method)
@anchor{library/tkinter tkinter Grid propagate}@anchor{44ae}@anchor{library/tkinter tkinter Grid grid_propagate}@anchor{44af}
@deffn {Method} grid_propagate ()

@deffnx {Method} grid_propagate (flag)

Same as @ref{43c9,,Misc.grid_propagate()}.
@ref{44ae,,propagate()} is an alias of @code{grid_propagate()}.
@end deffn

@geindex slaves() (tkinter.Grid method)

@geindex grid_slaves() (tkinter.Grid method)
@anchor{library/tkinter tkinter Grid slaves}@anchor{44b0}@anchor{library/tkinter tkinter Grid grid_slaves}@anchor{44b1}
@deffn {Method} grid_slaves (row=None, column=None)

Same as @ref{43cc,,Misc.grid_slaves()}: return the widgets managed in the grid,
optionally restricted to a `row' and/or `column'.
@ref{44b0,,slaves()} is an alias of @code{grid_slaves()}.
@end deffn
@end deffn

@geindex XView (class in tkinter)
@anchor{library/tkinter tkinter XView}@anchor{44b2}
@deffn {Class} tkinter.XView

Mix-in providing the horizontal-scrolling interface shared by widgets such
as @ref{44b3,,Entry}, @ref{1a3e,,Canvas}, @ref{44b4,,Listbox}, @ref{1a3d,,Text} and
@ref{44b5,,Spinbox}.
A widget’s @ref{44b6,,xview()} method is registered as the `command' of a
horizontal @ref{44b7,,Scrollbar}.

@geindex xview() (tkinter.XView method)
@anchor{library/tkinter tkinter XView xview}@anchor{44b6}
@deffn {Method} xview (*args)

Query or change the horizontal position of the view.
With no arguments, return a tuple @code{(first, last)} of two fractions
between 0 and 1 giving the portion of the document that is currently
visible.
Otherwise the arguments are passed to the Tk @code{xview} widget command and
are usually generated by a scrollbar; @ref{44b8,,xview_moveto()} and
@ref{44b9,,xview_scroll()} provide a more convenient interface.
@end deffn

@geindex xview_moveto() (tkinter.XView method)
@anchor{library/tkinter tkinter XView xview_moveto}@anchor{44b8}
@deffn {Method} xview_moveto (fraction)

Adjust the view so that `fraction' of the total width of the document is
off-screen to the left.
`fraction' is a number between 0 and 1.
@end deffn

@geindex xview_scroll() (tkinter.XView method)
@anchor{library/tkinter tkinter XView xview_scroll}@anchor{44b9}
@deffn {Method} xview_scroll (number, what)

Shift the view left or right by `number' units.
`what' is either @code{'units'} or @code{'pages'}; a negative `number' scrolls
left and a positive one scrolls right.
@end deffn
@end deffn

@geindex YView (class in tkinter)
@anchor{library/tkinter tkinter YView}@anchor{44ba}
@deffn {Class} tkinter.YView

Mix-in providing the vertical-scrolling interface shared by widgets such as
@ref{1a3e,,Canvas}, @ref{44b4,,Listbox} and @ref{1a3d,,Text}.
A widget’s @ref{44bb,,yview()} method is registered as the `command' of a vertical
@ref{44b7,,Scrollbar}.

@geindex yview() (tkinter.YView method)
@anchor{library/tkinter tkinter YView yview}@anchor{44bb}
@deffn {Method} yview (*args)

Query or change the vertical position of the view.
With no arguments, return a tuple @code{(first, last)} of two fractions
between 0 and 1 giving the portion of the document that is currently
visible.
Otherwise the arguments are passed to the Tk @code{yview} widget command,
usually generated by a scrollbar; @ref{44bc,,yview_moveto()} and
@ref{44bd,,yview_scroll()} provide a more convenient interface.
@end deffn

@geindex yview_moveto() (tkinter.YView method)
@anchor{library/tkinter tkinter YView yview_moveto}@anchor{44bc}
@deffn {Method} yview_moveto (fraction)

Adjust the view so that `fraction' of the total height of the document is
off-screen above the top.
`fraction' is a number between 0 and 1.
@end deffn

@geindex yview_scroll() (tkinter.YView method)
@anchor{library/tkinter tkinter YView yview_scroll}@anchor{44bd}
@deffn {Method} yview_scroll (number, what)

Shift the view up or down by `number' units.
`what' is either @code{'units'} or @code{'pages'}; a negative `number' scrolls
up and a positive one scrolls down.
@end deffn
@end deffn

@geindex BaseWidget (class in tkinter)
@anchor{library/tkinter tkinter BaseWidget}@anchor{43b0}
@deffn {Class} tkinter.BaseWidget (master, widgetName, cnf=@{@}, kw=@{@}, extra=())

Internal base class for all widgets.
It inherits from @ref{43af,,Misc} and adds the machinery that creates the
underlying Tk widget; application code normally uses @ref{438a,,Widget} or a
concrete widget class rather than instantiating @code{BaseWidget}
directly.

@geindex destroy() (tkinter.BaseWidget method)
@anchor{library/tkinter tkinter BaseWidget destroy}@anchor{44be}
@deffn {Method} destroy ()

Destroy this widget and all of its children, removing the corresponding
Tk widgets and deleting the associated Tcl commands.
@end deffn
@end deffn

@geindex Widget (class in tkinter)
@anchor{library/tkinter tkinter Widget}@anchor{438a}
@deffn {Class} tkinter.Widget (master, widgetName, cnf=@{@}, kw=@{@}, extra=())

Internal base class for the standard widgets.
It combines @ref{43b0,,BaseWidget} with the geometry-manager mix-ins
@ref{4484,,Pack}, @ref{4490,,Place} and @ref{449b,,Grid}, so that every widget can be
managed by any of the three geometry managers.
The concrete widget classes (@ref{44bf,,Button}, @ref{44c0,,Label}, and so on)
derive from @code{Widget}.
@end deffn

@geindex Toplevel (class in tkinter)
@anchor{library/tkinter tkinter Toplevel}@anchor{443a}
@deffn {Class} tkinter.Toplevel (master=None, cnf=@{@}, **kw)

A @code{Toplevel} widget is a top-level window, similar to a
@ref{440f,,Frame} except that its X parent is the root window of a screen
rather than its logical parent.
Its primary purpose is to serve as a container for dialog boxes and other
collections of widgets; its only visible features are its background and an
optional 3-D border.
Notable options include `menu', which installs a @ref{44c1,,Menu} as the
window’s menubar.
Inherits from @ref{43b0,,BaseWidget} and @ref{439c,,Wm}, so a toplevel is managed
by the window manager.
Refer to the Tk @code{toplevel} manual page for the full list of options.
@end deffn

@node Widget classes,Variable classes,Base and mixin classes,Reference<8>
@anchor{library/tkinter widget-classes}@anchor{44c2}
@subsubsection Widget classes


@geindex Button (class in tkinter)
@anchor{library/tkinter tkinter Button}@anchor{44bf}
@deffn {Class} tkinter.Button (master=None, cnf=@{@}, **kw)

A @code{Button} widget displays a textual string, bitmap or image and
invokes a command when the user presses it (by clicking mouse button 1 over
the button or, when the button has focus, by pressing the space key).
Inherits from @ref{438a,,Widget}.
In addition to the standard widget options, a button accepts the options
documented in the Tk @code{button} manual page, such as `command' (the callback
invoked when the button is pressed), `textvariable', `state' and `default'.

@geindex invoke() (tkinter.Button method)
@anchor{library/tkinter tkinter Button invoke}@anchor{44c3}
@deffn {Method} invoke ()

Invoke the command associated with the button, if there is one, and
return its result, or an empty string if no command is associated with
the button.
This is ignored if the button’s state is @code{disabled}.
@end deffn

@geindex flash() (tkinter.Button method)
@anchor{library/tkinter tkinter Button flash}@anchor{44c4}
@deffn {Method} flash ()

Flash the button by redisplaying it several times, alternating between
the active and normal colors.
At the end of the flash the button is left in the same normal or active
state as when the method was called.
This is ignored if the button’s state is @code{disabled}.
@end deffn
@end deffn

@geindex Canvas (class in tkinter)
@anchor{library/tkinter tkinter Canvas}@anchor{1a3e}
@deffn {Class} tkinter.Canvas (master=None, cnf=@{@}, **kw)

A @code{Canvas} widget implements structured graphics.
It displays any number of `items', such as arcs, lines, ovals, polygons,
rectangles, text, bitmaps, images and embedded windows, which may be drawn,
moved, re-colored and bound to events.
Inherits from @ref{438a,,Widget}, @ref{44b2,,XView} and @ref{44ba,,YView}, so the
view can be scrolled horizontally and vertically with @ref{44b6,,xview()}
and @ref{44bb,,yview()}.
Refer to the Tk @code{canvas} manual page for the full list of widget and item
options.

Each item has a unique integer `id', assigned when it is created, and zero
or more string `tags'.
A tag is an arbitrary string that does not have the form of an integer; the
same tag may be shared by many items, which makes tags convenient for
grouping items.
The special tag @code{'all'} matches every item in the canvas, and
@code{'current'} matches the topmost item under the mouse pointer.
Most methods take a `tagOrId' argument that may be an integer id naming a
single item, or a tag naming zero or more items; as described in the Tk
@code{canvas} manual page, a tag may also be a logical expression of tags
combined with the operators @code{&&}, @code{||}, @code{^}, @code{!} and parentheses.
When a method that operates on a single item is given a `tagOrId' matching
several items, it normally uses the lowest matching item in the display
list.

The items are kept in a `display list' that determines drawing order: items
later in the list are drawn on top of earlier ones.
A newly created item is placed at the top of the list; the order can be
changed with @ref{44c5,,tag_raise()} and @ref{44c6,,tag_lower()}.

@geindex create_arc() (tkinter.Canvas method)
@geindex create_bitmap() (tkinter.Canvas method)
@geindex create_image() (tkinter.Canvas method)
@geindex create_line() (tkinter.Canvas method)
@geindex create_oval() (tkinter.Canvas method)
@geindex create_polygon() (tkinter.Canvas method)
@geindex create_rectangle() (tkinter.Canvas method)
@geindex create_text() (tkinter.Canvas method)
@geindex create_window() (tkinter.Canvas method)
@anchor{library/tkinter tkinter Canvas create_arc}@anchor{44c7}
@deffn {Method} create_arc (*args, **kw)
@anchor{library/tkinter tkinter Canvas create_bitmap}@anchor{44c8}
@deffnx {Method} create_bitmap (*args, **kw)
@anchor{library/tkinter tkinter Canvas create_image}@anchor{44c9}
@deffnx {Method} create_image (*args, **kw)
@anchor{library/tkinter tkinter Canvas create_line}@anchor{44ca}
@deffnx {Method} create_line (*args, **kw)
@anchor{library/tkinter tkinter Canvas create_oval}@anchor{44cb}
@deffnx {Method} create_oval (*args, **kw)
@anchor{library/tkinter tkinter Canvas create_polygon}@anchor{44cc}
@deffnx {Method} create_polygon (*args, **kw)
@anchor{library/tkinter tkinter Canvas create_rectangle}@anchor{44cd}
@deffnx {Method} create_rectangle (*args, **kw)
@anchor{library/tkinter tkinter Canvas create_text}@anchor{44ce}
@deffnx {Method} create_text (*args, **kw)
@anchor{library/tkinter tkinter Canvas create_window}@anchor{44cf}
@deffnx {Method} create_window (*args, **kw)

Create a new item of the corresponding type and return its integer id.
Each method is called as @code{create_TYPE(coord..., **options)}: the
leading positional arguments give the coordinates that define the item
(as separate numbers, as a single sequence of numbers, or as coordinate
pairs), and the keyword arguments set item-specific options.
Coordinates and screen distances may be given as numbers (interpreted as
pixels) or as strings with a unit suffix (@code{'m'}, @code{'c'}, @code{'i'} or
@code{'p'} for millimetres, centimetres, inches or printer’s points), but
are always stored and returned in pixels.

The item types are: @code{arc} (an arc-shaped region that is a section of an
oval, defined by two diagonally opposite corners @code{x1, y1, x2, y2} of
the enclosing rectangle); @code{bitmap} (a two-color bitmap positioned at a
point @code{x, y}); @code{image} (a Tk image positioned at a point @code{x, y});
@code{line} (a line or curve through the points @code{x1, y1, ..., xn, yn});
@code{oval} (a circle or ellipse inscribed in the rectangle
@code{x1, y1, x2, y2}); @code{polygon} (a closed polygon through the points
@code{x1, y1, ..., xn, yn}); @code{rectangle} (a rectangle with corners
@code{x1, y1, x2, y2}); @code{text} (a string of text positioned at a point
@code{x, y}); and @code{window} (a child widget embedded in the canvas at a
point @code{x, y}, specified with the `window' option).

Most item types accept a common set of `standard item options', plus a
few options specific to each type.
Option names are passed as keyword arguments, without the leading
hyphen.

The standard item options are:


@table @asis

@item `fill'

The color used to fill the item’s interior, or to draw a `line'
item or the characters of a `text' item.
An empty string (the default for all types except `line' and `text')
leaves the item unfilled.

@item `outline'

The color used to draw the item’s outline.
An empty string draws no outline.

@item `width'

The width of the outline, defaulting to @code{1.0}.
Has no effect if `outline' is empty.

@item `dash'

A dash pattern for the outline, given either as a sequence of
segment lengths in pixels or as a string of the characters
@code{'.'}, @code{','}, @code{'-'}, @code{'_'} and space.
An empty pattern (the default) draws a solid outline.

@item `dashoffset'

The starting offset in pixels into the `dash' pattern.
Ignored if there is no `dash' pattern.

@item `stipple'

A bitmap used as a stipple pattern when filling the item.
Only well supported on X11.

@item `outlinestipple'

A bitmap used as a stipple pattern when drawing the outline.
Has no effect if `outline' is empty.

@item `offset', `outlineoffset'

The offset of the fill and outline stipple patterns, given as
@code{'x,y'} or as a side such as @code{'n'}, @code{'se'} or @code{'center'}.
Stipple offsets are only supported on X11.

@item `state'

Overrides the canvas state for this item; one of @code{'normal'},
@code{'disabled'} or @code{'hidden'}.

@item `tags'

A single tag or a sequence of tags to associate with the item,
replacing any existing tags.
@end table

Many of these options have `active…' and `disabled…' variants
(such as `activefill', `disabledfill', `activewidth', `disableddash',
`activeoutline', `disabledstipple') that override the base option when
the item is the active item (under the mouse pointer) or is in the
disabled state.

The following item types support additional options.

For @code{arc} items:


@table @asis

@item `start'

The start of the arc’s angular range, in degrees measured
counter-clockwise from the 3-o’clock position.

@item `extent'

The size of the angular range, in degrees counter-clockwise from
`start'.

@item `style'

How the arc is drawn: @code{'pieslice'} (the default), @code{'chord'} or
@code{'arc'}.
@end table

For @code{line} items:


@table @asis

@item `arrow'

Where to draw arrowheads: @code{'none'} (the default), @code{'first'},
@code{'last'} or @code{'both'}.

@item `arrowshape'

A sequence of three distances describing the shape of the
arrowheads.

@item `capstyle'

How line ends are drawn: @code{'butt'} (the default), @code{'projecting'}
or @code{'round'}.

@item `joinstyle'

How line vertices are drawn: @code{'round'} (the default), @code{'bevel'}
or @code{'miter'}.

@item `smooth'

The smoothing method: a false value (the default) for no smoothing,
or @code{'true'}/@code{'bezier'} or @code{'raw'} to draw the line as a curve.

@item `splinesteps'

The number of line segments approximating each spline when
`smooth' is enabled.
@end table

For @code{polygon} items:


@table @asis

@item `joinstyle', `smooth', `splinesteps'

As for @code{line} items, applied to the polygon’s outline.
@end table

For @code{text} items:


@table @asis

@item `text'

The string to display; newline characters start new lines.

@item `font'

The font used for the text.

@item `justify'

How lines are justified: @code{'left'} (the default), @code{'right'} or
@code{'center'}.

@item `anchor'

How the text is positioned relative to its point, defaulting to
@code{'center'}.

@item `width'

The maximum line length; if non-zero, lines are wrapped at spaces.

@item `angle'

How many degrees to rotate the text counter-clockwise about its
positioning point, from @code{0.0} to @code{360.0} (default @code{0.0}).

@item `underline'

The index of a character to underline, or @code{-1} for none.
@end table

For @code{bitmap} items:


@table @asis

@item `bitmap'

The bitmap to display.

@item `anchor'

How the bitmap is positioned relative to its point.

@item `background', `foreground'

The colors used for the bitmap’s @code{0} and @code{1} pixels; an empty
`background' makes the @code{0} pixels transparent.
Both have `active…' and `disabled…' variants, and `bitmap' has
`activebitmap' and `disabledbitmap' variants.
@end table

For @code{image} items:


@table @asis

@item `image'

The Tk image to display, previously created with the image
protocols.

@item `anchor'

How the image is positioned relative to its point.
@end table

Both options have `active…' and `disabled…' variants
(`activeimage', `disabledimage') used in the active and disabled
states.

For @code{window} items:


@table @asis

@item `window'

The widget to embed; it must be a child of the canvas or of one of
its ancestors, and may not be a top-level window.

@item `anchor'

How the window is positioned relative to its point.

@item `width', `height'

The size to assign to the window; if zero (the default), the window
is given its requested size.
@end table

@code{oval} and @code{rectangle} items have no type-specific options; they
use only the standard item options.

@cartouche
@quotation Note 
Tk 8.6 added the `angle' option and Tk 9.0 added the `underline'
option for @code{text} items.
@end quotation
@end cartouche
@end deffn

@geindex coords() (tkinter.Canvas method)
@anchor{library/tkinter tkinter Canvas coords}@anchor{1ae5}
@deffn {Method} coords (tagOrId)

@deffnx {Method} coords (tagOrId, coordList, /)

@deffnx {Method} coords (tagOrId, /, *coordList)

Query or modify the coordinates of an item.
With only `tagOrId', return a list of the floating-point coordinates of
the item given by `tagOrId' (the first matching item if it matches
several).
Given new coordinates, replace the coordinates of that item with them;
like the @code{create_*} methods, the coordinates may be given as separate
numbers, as a single sequence, or as coordinate pairs.
The returned coordinates are always in pixels, regardless of the units
used to specify them; for rectangles, ovals and arcs they are ordered
left, top, right, bottom.


Changed in version 3.12: The arguments are now flattened: the coordinates may be given as
separate arguments, as a single sequence, or grouped in pairs, like
the @code{create_*} methods.

@end deffn

@geindex move() (tkinter.Canvas method)
@anchor{library/tkinter tkinter Canvas move}@anchor{44d0}
@deffn {Method} move (tagOrId, xAmount, yAmount, /)

Move each of the items given by `tagOrId' in the canvas coordinate space
by adding `xAmount' to every x-coordinate and `yAmount' to every
y-coordinate of the item.
@end deffn

@geindex moveto() (tkinter.Canvas method)
@anchor{library/tkinter tkinter Canvas moveto}@anchor{44d1}
@deffn {Method} moveto (tagOrId, x='@w{'}, y='@w{'})

Move the items given by `tagOrId' so that the first coordinate pair (the
upper-left corner of the bounding box) of the lowest matching item is at
position (`x', `y').
`x' or `y' may be an empty string, in which case the corresponding
coordinate is unchanged.
All matching items keep their positions relative to each other.


Added in version 3.8.

@end deffn

@geindex scale() (tkinter.Canvas method)
@anchor{library/tkinter tkinter Canvas scale}@anchor{44d2}
@deffn {Method} scale (tagOrId, xOrigin, yOrigin, xScale, yScale, /)

Rescale the coordinates of all items given by `tagOrId' in canvas
coordinate space.
Each x-coordinate is adjusted so that its distance from `xOrigin' changes
by a factor of `xScale', and each y-coordinate so that its distance from
`yOrigin' changes by a factor of `yScale' (a factor of @code{1.0} leaves the
coordinate unchanged).
@end deffn

@geindex delete() (tkinter.Canvas method)
@anchor{library/tkinter tkinter Canvas delete}@anchor{44d3}
@deffn {Method} delete (*tagOrIds)

Delete each of the items given by the `tagOrIds' arguments.
@end deffn

@geindex dchars() (tkinter.Canvas method)
@anchor{library/tkinter tkinter Canvas dchars}@anchor{44d4}
@deffn {Method} dchars (tagOrId, first, /)

@deffnx {Method} dchars (tagOrId, first, last, /)

Delete from each of the items given by `tagOrId' the characters (for text
items) or coordinates (for line and polygon items) in the range from
`first' to `last' inclusive; `last' defaults to `first'.
Items that do not support indexing ignore this operation.
@end deffn

@geindex insert() (tkinter.Canvas method)
@anchor{library/tkinter tkinter Canvas insert}@anchor{44d5}
@deffn {Method} insert (tagOrId, beforeThis, string, /)

Insert `string' into each of the items given by `tagOrId' just before the
character or coordinate whose index is `beforeThis'.
For line and polygon items `string' must be a valid sequence of
coordinates.
@end deffn

@geindex itemcget() (tkinter.Canvas method)
@anchor{library/tkinter tkinter Canvas itemcget}@anchor{44d6}
@deffn {Method} itemcget (tagOrId, option)

Return the current value of the configuration option `option' for the
item given by `tagOrId' (the lowest matching item if it matches several).
This is like @ref{43b1,,cget()} but applies to an individual item.
@end deffn

@geindex itemconfig() (tkinter.Canvas method)

@geindex itemconfigure() (tkinter.Canvas method)
@anchor{library/tkinter tkinter Canvas itemconfig}@anchor{44d7}@anchor{library/tkinter tkinter Canvas itemconfigure}@anchor{44d8}
@deffn {Method} itemconfigure (tagOrId, cnf=None, **kw)

Query or modify the configuration options of the items given by
`tagOrId'.
This mirrors @ref{4383,,configure()}, except that it applies to
individual items rather than to the canvas as a whole.
With no options, it returns a dictionary describing the current options
of the first matching item; otherwise it sets the given options on every
matching item.
The legal options are those accepted by the corresponding @code{create_*}
method.
@ref{44d7,,itemconfig()} is an alias of @code{itemconfigure()}.
@end deffn

@geindex type() (tkinter.Canvas method)
@anchor{library/tkinter tkinter Canvas type}@anchor{44d9}
@deffn {Method} type (tagOrId)

Return the type of the item given by `tagOrId' (the first matching item
if it matches several), such as @code{'rectangle'} or @code{'text'}, or
@code{None} if `tagOrId' does not match any item.
@end deffn

@geindex gettags() (tkinter.Canvas method)
@anchor{library/tkinter tkinter Canvas gettags}@anchor{44da}
@deffn {Method} gettags (tagOrId, /)

Return a tuple of the tags associated with the item given by `tagOrId'
(the first matching item in display-list order if it matches several).
Return an empty tuple if no item matches or the item has no tags.
@end deffn

@geindex dtag() (tkinter.Canvas method)
@anchor{library/tkinter tkinter Canvas dtag}@anchor{44db}
@deffn {Method} dtag (tagOrId, /)

@deffnx {Method} dtag (tagOrId, tagToDelete, /)

Remove the tag `tagToDelete' (which defaults to `tagOrId') from each of
the items given by `tagOrId'.
Items that do not have that tag are unaffected.
@end deffn

@geindex addtag() (tkinter.Canvas method)
@anchor{library/tkinter tkinter Canvas addtag}@anchor{44dc}
@deffn {Method} addtag (newtag, searchSpec, /, *args)

Add the tag `newtag' to each item selected by the search specification
`searchSpec' (and any further `args').
`searchSpec' is one of @code{'above'}, @code{'all'}, @code{'below'},
@code{'closest'}, @code{'enclosed'}, @code{'overlapping'} or @code{'withtag'}; the
@code{addtag_*} methods below are convenient wrappers that supply each of
these forms.
@end deffn

@geindex addtag_above() (tkinter.Canvas method)
@anchor{library/tkinter tkinter Canvas addtag_above}@anchor{44dd}
@deffn {Method} addtag_above (newtag, tagOrId)

Add the tag `newtag' to the item just above (after) `tagOrId' in the
display list.
@end deffn

@geindex addtag_all() (tkinter.Canvas method)
@anchor{library/tkinter tkinter Canvas addtag_all}@anchor{44de}
@deffn {Method} addtag_all (newtag)

Add the tag `newtag' to all items in the canvas.
@end deffn

@geindex addtag_below() (tkinter.Canvas method)
@anchor{library/tkinter tkinter Canvas addtag_below}@anchor{44df}
@deffn {Method} addtag_below (newtag, tagOrId)

Add the tag `newtag' to the item just below (before) `tagOrId' in the
display list.
@end deffn

@geindex addtag_closest() (tkinter.Canvas method)
@anchor{library/tkinter tkinter Canvas addtag_closest}@anchor{44e0}
@deffn {Method} addtag_closest (newtag, x, y, halo=None, start=None)

Add the tag `newtag' to the item closest to the point (`x', `y').
If `halo' is given, any item within that distance of the point is treated
as overlapping it.
If `start' is given (a tag or id), select the topmost closest item that
lies below `start' in the display list, which can be used to step through
all the closest items.
@end deffn

@geindex addtag_enclosed() (tkinter.Canvas method)
@anchor{library/tkinter tkinter Canvas addtag_enclosed}@anchor{44e1}
@deffn {Method} addtag_enclosed (newtag, x1, y1, x2, y2)

Add the tag `newtag' to every item completely enclosed within the
rectangle (`x1', `y1', `x2', `y2'), where `x1' <= `x2' and `y1' <= `y2'.
@end deffn

@geindex addtag_overlapping() (tkinter.Canvas method)
@anchor{library/tkinter tkinter Canvas addtag_overlapping}@anchor{44e2}
@deffn {Method} addtag_overlapping (newtag, x1, y1, x2, y2)

Add the tag `newtag' to every item that overlaps or is enclosed within
the rectangle (`x1', `y1', `x2', `y2'), where `x1' <= `x2' and `y1' <=
`y2'.
@end deffn

@geindex addtag_withtag() (tkinter.Canvas method)
@anchor{library/tkinter tkinter Canvas addtag_withtag}@anchor{44e3}
@deffn {Method} addtag_withtag (newtag, tagOrId)

Add the tag `newtag' to every item given by `tagOrId'.
@end deffn

@geindex find() (tkinter.Canvas method)
@anchor{library/tkinter tkinter Canvas find}@anchor{44e4}
@deffn {Method} find (searchSpec, /, *args)

Return a tuple of the ids of all items selected by the search
specification `searchSpec' (and any further `args'), in stacking order
with the lowest item first.
The search specification has any of the forms accepted by @ref{44dc,,addtag()}.
The @code{find_*} methods below are more convenient wrappers around it.
@end deffn

@geindex find_above() (tkinter.Canvas method)
@anchor{library/tkinter tkinter Canvas find_above}@anchor{44e5}
@deffn {Method} find_above (tagOrId)

Return a tuple containing the id of the item just above `tagOrId' in the
display list.
@end deffn

@geindex find_all() (tkinter.Canvas method)
@anchor{library/tkinter tkinter Canvas find_all}@anchor{44e6}
@deffn {Method} find_all ()

Return a tuple of the ids of all items in the canvas, in stacking order.
@end deffn

@geindex find_below() (tkinter.Canvas method)
@anchor{library/tkinter tkinter Canvas find_below}@anchor{44e7}
@deffn {Method} find_below (tagOrId)

Return a tuple containing the id of the item just below `tagOrId' in the
display list.
@end deffn

@geindex find_closest() (tkinter.Canvas method)
@anchor{library/tkinter tkinter Canvas find_closest}@anchor{44e8}
@deffn {Method} find_closest (x, y, halo=None, start=None)

Return a tuple containing the id of the item closest to the point (`x',
`y').
`halo' and `start' are interpreted as for @ref{44e0,,addtag_closest()}.
@end deffn

@geindex find_enclosed() (tkinter.Canvas method)
@anchor{library/tkinter tkinter Canvas find_enclosed}@anchor{44e9}
@deffn {Method} find_enclosed (x1, y1, x2, y2)

Return a tuple of the ids of all items completely enclosed within the
rectangle (`x1', `y1', `x2', `y2').
@end deffn

@geindex find_overlapping() (tkinter.Canvas method)
@anchor{library/tkinter tkinter Canvas find_overlapping}@anchor{44ea}
@deffn {Method} find_overlapping (x1, y1, x2, y2)

Return a tuple of the ids of all items that overlap or are enclosed
within the rectangle (`x1', `y1', `x2', `y2').
@end deffn

@geindex find_withtag() (tkinter.Canvas method)
@anchor{library/tkinter tkinter Canvas find_withtag}@anchor{44eb}
@deffn {Method} find_withtag (tagOrId)

Return a tuple of the ids of all items given by `tagOrId'.
@end deffn

@geindex lift() (tkinter.Canvas method)

@geindex tkraise() (tkinter.Canvas method)

@geindex tag_raise() (tkinter.Canvas method)
@anchor{library/tkinter tkinter Canvas lift}@anchor{44ec}@anchor{library/tkinter tkinter Canvas tkraise}@anchor{44ed}@anchor{library/tkinter tkinter Canvas tag_raise}@anchor{44c5}
@deffn {Method} tag_raise (tagOrId, aboveThis=None, /)

Move all items given by `tagOrId' to a new position in the display list
just above the item given by `aboveThis', or to the top of the display
list if `aboveThis' is omitted.
When several items are moved their relative order is preserved.
This has no effect on embedded window items, whose stacking order is
controlled by @ref{43bc,,Misc.tkraise()} and @ref{43bd,,Misc.lower()} instead.
@ref{44ec,,lift()} and @ref{44ed,,tkraise()} are aliases of @code{tag_raise()}.
@end deffn

@geindex lower() (tkinter.Canvas method)

@geindex tag_lower() (tkinter.Canvas method)
@anchor{library/tkinter tkinter Canvas lower}@anchor{44ee}@anchor{library/tkinter tkinter Canvas tag_lower}@anchor{44c6}
@deffn {Method} tag_lower (tagOrId, belowThis=None, /)

Move all items given by `tagOrId' to a new position in the display list
just below the item given by `belowThis', or to the bottom of the display
list if `belowThis' is omitted.
When several items are moved their relative order is preserved.
This has no effect on embedded window items.
@ref{44ee,,lower()} is an alias of @code{tag_lower()}.
@end deffn

@geindex tag_bind() (tkinter.Canvas method)
@anchor{library/tkinter tkinter Canvas tag_bind}@anchor{44ef}
@deffn {Method} tag_bind (tagOrId, sequence=None, func=None, add=None)

Bind the callback `func' to the event `sequence' for all items given by
`tagOrId', so that `func' is invoked whenever that event occurs for one
of the items.
This is like @ref{43d2,,Widget.bind} but operates on canvas items
rather than on whole widgets; only mouse, keyboard and virtual events may
be bound.
Mouse events are directed to the current item and keyboard events to the
focus item (see @ref{44f0,,focus()}).
If `add' is true the new binding is added to any existing bindings for
the same sequence, rather than replacing them.
Return the identifier of the bound function, which can be passed to
@ref{44f1,,tag_unbind()}.
@end deffn

@geindex tag_unbind() (tkinter.Canvas method)
@anchor{library/tkinter tkinter Canvas tag_unbind}@anchor{44f1}
@deffn {Method} tag_unbind (tagOrId, sequence, funcid=None)

Remove for all items given by `tagOrId' the binding for the event
`sequence'.
If `funcid' is given, only that callback (as returned by
@ref{44ef,,tag_bind()}) is unbound and deregistered.


Changed in version 3.13: If `funcid' is given, only that callback is unbound.

@end deffn

@geindex bbox() (tkinter.Canvas method)
@anchor{library/tkinter tkinter Canvas bbox}@anchor{44f2}
@deffn {Method} bbox (tagOrId, /, *tagOrIds)

Return a 4-tuple @code{(x1, y1, x2, y2)} giving an approximate bounding box,
in pixels, that encloses all the items given by `tagOrId' and any further
`tagOrIds'.
The result may overestimate the true bounding box by a few pixels.
Return @code{None} if no item matches or the matching items have nothing to
display.
@end deffn

@geindex canvasx() (tkinter.Canvas method)
@anchor{library/tkinter tkinter Canvas canvasx}@anchor{44f3}
@deffn {Method} canvasx (screenx, gridspacing=None)

Given a window x-coordinate `screenx', return the canvas x-coordinate
displayed at that location.
If `gridspacing' is given, the result is rounded to the nearest multiple
of `gridspacing' units.
@end deffn

@geindex canvasy() (tkinter.Canvas method)
@anchor{library/tkinter tkinter Canvas canvasy}@anchor{44f4}
@deffn {Method} canvasy (screeny, gridspacing=None)

Given a window y-coordinate `screeny', return the canvas y-coordinate
displayed at that location.
If `gridspacing' is given, the result is rounded to the nearest multiple
of `gridspacing' units.
@end deffn

@geindex focus() (tkinter.Canvas method)
@anchor{library/tkinter tkinter Canvas focus}@anchor{44f0}
@deffn {Method} focus ()

@deffnx {Method} focus (tagOrId, /)

With `tagOrId', set the keyboard focus for the canvas to the first item
given by `tagOrId' that supports the insertion cursor; the focus is left
unchanged if no such item exists.
If `tagOrId' is an empty string, reset the focus so that no item has it.
With no argument, return the id of the item that currently has the focus,
or an empty string if none does.
An item only displays the insertion cursor when both it is the focus item
and its canvas has the input focus.
@end deffn

@geindex icursor() (tkinter.Canvas method)
@anchor{library/tkinter tkinter Canvas icursor}@anchor{44f5}
@deffn {Method} icursor (tagOrId, index, /)

Set the insertion cursor of the items given by `tagOrId' to just before
the character given by `index'.
Items that do not support an insertion cursor are unaffected.
The cursor is only displayed when the item has the focus, but its
position may be set at any time.
@end deffn

@geindex index() (tkinter.Canvas method)
@anchor{library/tkinter tkinter Canvas index}@anchor{44f6}
@deffn {Method} index (tagOrId, index, /)

Return as an integer the numerical index within `tagOrId' corresponding
to `index', which is a textual description of a position (for text items
an index into the characters, for line and polygon items an index into
the coordinates).
If `tagOrId' matches several items, the first one that supports indexing
is used.
@end deffn

@geindex select_adjust() (tkinter.Canvas method)
@anchor{library/tkinter tkinter Canvas select_adjust}@anchor{44f7}
@deffn {Method} select_adjust (tagOrId, index)

Adjust the end of the selection in `tagOrId' nearest to `index' so that
it is at `index', and make the other end the anchor point for future
@ref{44f8,,select_to()} calls.
If the selection is not currently in `tagOrId', this behaves like
@code{select_to()}.
@end deffn

@geindex select_clear() (tkinter.Canvas method)
@anchor{library/tkinter tkinter Canvas select_clear}@anchor{44f9}
@deffn {Method} select_clear ()

Clear the selection if it is in this canvas; otherwise do nothing.
@end deffn

@geindex select_from() (tkinter.Canvas method)
@anchor{library/tkinter tkinter Canvas select_from}@anchor{44fa}
@deffn {Method} select_from (tagOrId, index)

Set the selection anchor point to just before the character given by
`index' in the item given by `tagOrId'.
This does not change the selection itself; it sets the fixed end for
future @ref{44f8,,select_to()} calls.
@end deffn

@geindex select_item() (tkinter.Canvas method)
@anchor{library/tkinter tkinter Canvas select_item}@anchor{44fb}
@deffn {Method} select_item ()

Return the id of the item that holds the selection, or @code{None} if the
selection is not in this canvas.
Unlike @ref{44e4,,find()} and the @code{find_*} methods, this returns the id as a
string rather than an integer.
@end deffn

@geindex select_to() (tkinter.Canvas method)
@anchor{library/tkinter tkinter Canvas select_to}@anchor{44f8}
@deffn {Method} select_to (tagOrId, index)

Set the selection to the characters of `tagOrId' between the selection
anchor point and `index', inclusive of `index'.
The anchor point is the one set by the most recent @ref{44f7,,select_adjust()}
or @ref{44fa,,select_from()} call.
@end deffn

@geindex scan_mark() (tkinter.Canvas method)
@anchor{library/tkinter tkinter Canvas scan_mark}@anchor{44fc}
@deffn {Method} scan_mark (x, y)

Record `x', `y' and the current view, for use with later
@ref{44fd,,scan_dragto()} calls.
This is typically bound to a mouse button press in the widget.
@end deffn

@geindex scan_dragto() (tkinter.Canvas method)
@anchor{library/tkinter tkinter Canvas scan_dragto}@anchor{44fd}
@deffn {Method} scan_dragto (x, y, gain=10)

Scroll the canvas by `gain' times the difference between `x', `y' and the
coordinates passed to the last @ref{44fc,,scan_mark()} call.
This is typically bound to mouse motion events in the widget, producing
the effect of dragging the canvas at high speed through its window.
@end deffn

@geindex postscript() (tkinter.Canvas method)
@anchor{library/tkinter tkinter Canvas postscript}@anchor{44fe}
@deffn {Method} postscript (cnf=@{@}, **kw)

Generate a PostScript (Encapsulated PostScript, version 3.0)
representation of part or all of the canvas.
If the `file' or `channel' option is given, the PostScript is written
there and an empty string is returned; otherwise it is returned as a
string.
By default only the area currently visible in the window is generated, so
it is usually necessary either to call @ref{43e3,,update()} first or to
use the `width' and `height' options.
Supported options include `colormap', `colormode', `file', `fontmap',
`height', `pageanchor', `pageheight', `pagewidth', `pagex', `pagey',
`rotate', `width', `x' and `y'.
@end deffn
@end deffn

@geindex Checkbutton (class in tkinter)
@anchor{library/tkinter tkinter Checkbutton}@anchor{1a09}
@deffn {Class} tkinter.Checkbutton (master=None, cnf=@{@}, **kw)

A @code{Checkbutton} widget displays a textual string, bitmap or image
together with a square indicator, and toggles a boolean selection when
pressed.
It has all the behavior of a simple button and, in addition, can be
selected: when selected the indicator is drawn with a check mark and the
associated variable is set to the @code{onvalue}, and when deselected the
indicator is drawn empty and the variable is set to the @code{offvalue}.
Inherits from @ref{438a,,Widget}.
In addition to the standard widget options, a checkbutton accepts the
options documented in the Tk @code{checkbutton} manual page, such as
`variable', `onvalue', `offvalue' and `command'.

@geindex invoke() (tkinter.Checkbutton method)
@anchor{library/tkinter tkinter Checkbutton invoke}@anchor{44ff}
@deffn {Method} invoke ()

Do just what would happen if the user pressed the checkbutton with the
mouse: toggle the selection state of the button and invoke the associated
command, if there is one.
Return the result of the command, or an empty string if no command is
associated with the checkbutton.
This is ignored if the checkbutton’s state is @code{disabled}.
@end deffn

@geindex select() (tkinter.Checkbutton method)
@anchor{library/tkinter tkinter Checkbutton select}@anchor{4500}
@deffn {Method} select ()

Select the checkbutton and set the associated variable to its
@code{onvalue}.
@end deffn

@geindex deselect() (tkinter.Checkbutton method)
@anchor{library/tkinter tkinter Checkbutton deselect}@anchor{4501}
@deffn {Method} deselect ()

Deselect the checkbutton and set the associated variable to its
@code{offvalue}.
@end deffn

@geindex toggle() (tkinter.Checkbutton method)
@anchor{library/tkinter tkinter Checkbutton toggle}@anchor{4502}
@deffn {Method} toggle ()

Toggle the selection state of the button, redisplaying it and modifying
its associated variable to reflect the new state.
@end deffn

@geindex flash() (tkinter.Checkbutton method)
@anchor{library/tkinter tkinter Checkbutton flash}@anchor{4503}
@deffn {Method} flash ()

Flash the checkbutton by redisplaying it several times, alternating
between the active and normal colors.
At the end of the flash the checkbutton is left in the same normal or
active state as when the method was called.
This is ignored if the checkbutton’s state is @code{disabled}.
@end deffn
@end deffn

@geindex Entry (class in tkinter)
@anchor{library/tkinter tkinter Entry}@anchor{44b3}
@deffn {Class} tkinter.Entry (master=None, cnf=@{@}, **kw)

An @code{Entry} widget displays a single line of text and lets the user
edit it.
Inherits from @ref{438a,,Widget} and @ref{44b2,,XView}; since entries can hold
strings too long to fit in the window, they support horizontal scrolling
through @ref{44b6,,xview()}.

In addition to the standard widget options, an entry accepts the options
documented in the Tk @code{entry} manual page.
Notable ones are `textvariable' (the name of a variable kept in sync with
the entry’s contents), `show' (if set, each character is displayed as the
given character rather than its true value, useful for password entry),
`validate' and `validatecommand' (which together let a callback accept or
reject edits), and `state' (one of @code{'normal'}, @code{'disabled'} or
@code{'readonly'}).

Many of the methods below take an `index' argument that selects a character
in the entry’s string.
As described in the Tk @code{entry} manual page, `index' may be a number
(counting from 0), @code{'insert'} (the character just after the insertion
cursor), @code{'end'} (just after the last character), @code{'anchor'} (the
selection anchor point), @code{'sel.first'} and @code{'sel.last'} (the ends of the
selection), or @code{@@x} (the character covering pixel x-coordinate `x' in the
window).
Out-of-range indices are rounded to the nearest legal value.

@geindex delete() (tkinter.Entry method)
@anchor{library/tkinter tkinter Entry delete}@anchor{4504}
@deffn {Method} delete (first, last=None)

Delete the characters from index `first' up to but not including index
`last'.
If `last' is omitted, only the single character at `first' is deleted.
@end deffn

@geindex get() (tkinter.Entry method)
@anchor{library/tkinter tkinter Entry get}@anchor{4505}
@deffn {Method} get ()

Return the entry’s current string.
@end deffn

@geindex insert() (tkinter.Entry method)
@anchor{library/tkinter tkinter Entry insert}@anchor{4506}
@deffn {Method} insert (index, string)

Insert `string' just before the character given by `index'.
@end deffn

@geindex icursor() (tkinter.Entry method)
@anchor{library/tkinter tkinter Entry icursor}@anchor{4507}
@deffn {Method} icursor (index)

Arrange for the insertion cursor to be displayed just before the
character given by `index'.
@end deffn

@geindex index() (tkinter.Entry method)
@anchor{library/tkinter tkinter Entry index}@anchor{4508}
@deffn {Method} index (index)

Return the numerical index corresponding to `index'.
@end deffn

@geindex select_adjust() (tkinter.Entry method)

@geindex selection_adjust() (tkinter.Entry method)
@anchor{library/tkinter tkinter Entry select_adjust}@anchor{4509}@anchor{library/tkinter tkinter Entry selection_adjust}@anchor{450a}
@deffn {Method} selection_adjust (index)

Locate the end of the selection nearest to the character given by
`index', and adjust that end to be at `index' (including but not going
beyond it); the other end becomes the anchor point for future
@ref{450b,,selection_to()} calls.
If there is no selection in the entry, a new one is created between
`index' and the most recent anchor point, inclusive.
@ref{4509,,select_adjust()} is an alias of @code{selection_adjust()}.
@end deffn

@geindex select_clear() (tkinter.Entry method)

@geindex selection_clear() (tkinter.Entry method)
@anchor{library/tkinter tkinter Entry select_clear}@anchor{450c}@anchor{library/tkinter tkinter Entry selection_clear}@anchor{450d}
@deffn {Method} selection_clear ()

Clear the selection if it is currently in this widget.
If the selection is not in this widget the method has no effect.
@ref{450c,,select_clear()} is an alias of @code{selection_clear()}.
@end deffn

@geindex select_from() (tkinter.Entry method)

@geindex selection_from() (tkinter.Entry method)
@anchor{library/tkinter tkinter Entry select_from}@anchor{450e}@anchor{library/tkinter tkinter Entry selection_from}@anchor{450f}
@deffn {Method} selection_from (index)

Set the selection anchor point to just before the character given by
`index', without changing the selection.
@ref{450e,,select_from()} is an alias of @code{selection_from()}.
@end deffn

@geindex select_present() (tkinter.Entry method)

@geindex selection_present() (tkinter.Entry method)
@anchor{library/tkinter tkinter Entry select_present}@anchor{4510}@anchor{library/tkinter tkinter Entry selection_present}@anchor{4511}
@deffn {Method} selection_present ()

Return @code{True} if there are characters selected in the entry, @code{False}
otherwise.
@ref{4510,,select_present()} is an alias of @code{selection_present()}.
@end deffn

@geindex select_range() (tkinter.Entry method)

@geindex selection_range() (tkinter.Entry method)
@anchor{library/tkinter tkinter Entry select_range}@anchor{4512}@anchor{library/tkinter tkinter Entry selection_range}@anchor{4513}
@deffn {Method} selection_range (start, end)

Set the selection to include the characters starting with the one indexed
by `start' and ending with the one just before `end'.
If `end' refers to the same character as `start' or an earlier one, the
selection is cleared.
@ref{4512,,select_range()} is an alias of @code{selection_range()}.
@end deffn

@geindex select_to() (tkinter.Entry method)

@geindex selection_to() (tkinter.Entry method)
@anchor{library/tkinter tkinter Entry select_to}@anchor{4514}@anchor{library/tkinter tkinter Entry selection_to}@anchor{450b}
@deffn {Method} selection_to (index)

Set the selection between the anchor point and `index': if `index' is
before the anchor point, the selection runs from `index' up to but not
including the anchor; if `index' is after it, from the anchor up to but
not including `index'; if they coincide, nothing happens.
The anchor point is the one set by the most recent @ref{450f,,selection_from()}
or @ref{450a,,selection_adjust()} call.
If there is no selection in the entry, a new one is created using the
most recent anchor point.
@ref{4514,,select_to()} is an alias of @code{selection_to()}.
@end deffn

@geindex scan_mark() (tkinter.Entry method)
@anchor{library/tkinter tkinter Entry scan_mark}@anchor{4515}
@deffn {Method} scan_mark (x)

Record `x' and the current view in the entry window, for use with later
@ref{4516,,scan_dragto()} calls.
Typically associated with a mouse button press in the widget.
@end deffn

@geindex scan_dragto() (tkinter.Entry method)
@anchor{library/tkinter tkinter Entry scan_dragto}@anchor{4516}
@deffn {Method} scan_dragto (x)

Compute the difference between `x' and the `x' given to the last
@ref{4515,,scan_mark()} call, and adjust the view left or right by 10 times
that difference.
Typically associated with mouse motion events, to produce the effect of
dragging the entry at high speed through the window.
@end deffn
@end deffn

@geindex Frame (class in tkinter)
@anchor{library/tkinter tkinter Frame}@anchor{440f}
@deffn {Class} tkinter.Frame (master=None, cnf=@{@}, **kw)

A @code{Frame} widget is a simple container.
Its primary purpose is to act as a spacer or container for complex window
layouts; its only features are its background and an optional 3-D border to
make the frame appear raised or sunken.
Inherits from @ref{438a,,Widget}.
Refer to the Tk @code{frame} manual page for the full list of options.
@end deffn

@geindex Label (class in tkinter)
@anchor{library/tkinter tkinter Label}@anchor{44c0}
@deffn {Class} tkinter.Label (master=None, cnf=@{@}, **kw)

A @code{Label} widget displays a non-interactive textual string, bitmap
or image.
The displayed text is set with the `text' option or linked to a variable
through `textvariable', and an image can be shown using the `image' option.
Text must all be in a single font but may occupy multiple lines, and one
character may be underlined with the `underline' option.
Inherits from @ref{438a,,Widget}.
Refer to the Tk @code{label} manual page for the full list of options.
@end deffn

@geindex LabelFrame (class in tkinter)
@anchor{library/tkinter tkinter LabelFrame}@anchor{446f}
@deffn {Class} tkinter.LabelFrame (master=None, cnf=@{@}, **kw)

A @code{LabelFrame} widget is a container that has the features of a
@ref{440f,,Frame} plus the ability to display a label.
The label text is set with the `text' option and positioned with
`labelanchor', or an arbitrary widget may be used as the label by giving it
as the `labelwidget' option.
Inherits from @ref{438a,,Widget}.
Refer to the Tk @code{labelframe} manual page for the full list of options.
@end deffn

@geindex Listbox (class in tkinter)
@anchor{library/tkinter tkinter Listbox}@anchor{44b4}
@deffn {Class} tkinter.Listbox (master=None, cnf=@{@}, **kw)

A @code{Listbox} widget displays a list of single-line text items, one
per line, of which the user can select one or more.
The way the selection behaves is governed by the `selectmode' option, which
is one of @code{browse} (the default; at most one item, which may be dragged
with the mouse), @code{single} (at most one item), @code{multiple} (any number of
items, toggled individually), or @code{extended} (any number of items,
including discontiguous ranges, selected by clicking and dragging).
Inherits from @ref{438a,,Widget}, @ref{44b2,,XView} and @ref{44ba,,YView}, so the
view can be scrolled horizontally and vertically with @ref{44b6,,xview()}
and @ref{44bb,,yview()}.
Refer to the Tk @code{listbox} manual page for the full list of options.

Many of the methods take an `index' argument identifying a particular item.
As described in the Tk @code{listbox} manual page, `index' may be a numeric
index (counting from 0 at the top), @code{'active'} (the item with the location
cursor, set with @ref{4517,,activate()}), @code{'anchor'} (the selection anchor, set
with @ref{4518,,selection_anchor()}), @code{'end'} (the last item, or for
@ref{4519,,index()} and @ref{451a,,insert()} the position just after it), or @code{@@x,y}
(the item covering pixel coordinates `x', `y' in the listbox window).
Arguments named `first' and `last' are indices of the same forms.

@geindex insert() (tkinter.Listbox method)
@anchor{library/tkinter tkinter Listbox insert}@anchor{451a}
@deffn {Method} insert (index, *elements)

Insert the given `elements' as new items just before the item given by
`index'.
If `index' is @code{'end'}, the new items are appended to the end of the
list.
@end deffn

@geindex delete() (tkinter.Listbox method)
@anchor{library/tkinter tkinter Listbox delete}@anchor{451b}
@deffn {Method} delete (first, last=None)

Delete the items in the range from `first' to `last' inclusive.
If `last' is omitted, it defaults to `first', so that a single item is
deleted.
@end deffn

@geindex get() (tkinter.Listbox method)
@anchor{library/tkinter tkinter Listbox get}@anchor{451c}
@deffn {Method} get (first, last=None)

If `last' is omitted, return the contents of the item given by `first',
or an empty string if `first' refers to a non-existent item.
If `last' is given, return a tuple of all the items in the range from
`first' to `last' inclusive.
@end deffn

@geindex size() (tkinter.Listbox method)
@anchor{library/tkinter tkinter Listbox size}@anchor{451d}
@deffn {Method} size ()

Return the total number of items in the listbox.
@end deffn

@geindex index() (tkinter.Listbox method)
@anchor{library/tkinter tkinter Listbox index}@anchor{4519}
@deffn {Method} index (index)

Return the integer index value corresponding to `index', or @code{None} if
`index' is out of range.
If `index' is @code{'end'}, the result is a count of the number of items in
the listbox (not the index of the last item).
@end deffn

@geindex bbox() (tkinter.Listbox method)
@anchor{library/tkinter tkinter Listbox bbox}@anchor{451e}
@deffn {Method} bbox (index)

Return a tuple @code{(x, y, width, height)} describing the bounding box, in
pixels relative to the widget, of the text of the item given by `index'.
Return @code{None} if no part of that item is visible on the screen, or if
`index' refers to a non-existent item; if the item is only partly
visible, the result still gives the full area of the item, including the
parts that are not visible.
@end deffn

@geindex nearest() (tkinter.Listbox method)
@anchor{library/tkinter tkinter Listbox nearest}@anchor{451f}
@deffn {Method} nearest (y)

Given a y-coordinate within the listbox window, return the index of the
visible item nearest to that y-coordinate.
@end deffn

@geindex see() (tkinter.Listbox method)
@anchor{library/tkinter tkinter Listbox see}@anchor{4520}
@deffn {Method} see (index)

Adjust the view so that the item given by `index' is visible.
If the item is already visible the method has no effect; if it is near an
edge of the window the listbox scrolls just enough to bring it into view
at that edge, otherwise the listbox scrolls to center the item.
@end deffn

@geindex activate() (tkinter.Listbox method)
@anchor{library/tkinter tkinter Listbox activate}@anchor{4517}
@deffn {Method} activate (index)

Set the active item to the one given by `index'.
If `index' is outside the range of items, the closest item is activated
instead.
The active item is drawn as specified by the `activestyle' option when
the widget has the input focus, and its index may be retrieved with the
@code{'active'} index.
@end deffn

@geindex curselection() (tkinter.Listbox method)
@anchor{library/tkinter tkinter Listbox curselection}@anchor{4521}
@deffn {Method} curselection ()

Return a tuple containing the numerical indices of all of the items that
are currently selected, or an empty tuple if no items are selected.
@end deffn

@geindex select_anchor() (tkinter.Listbox method)

@geindex selection_anchor() (tkinter.Listbox method)
@anchor{library/tkinter tkinter Listbox select_anchor}@anchor{4522}@anchor{library/tkinter tkinter Listbox selection_anchor}@anchor{4518}
@deffn {Method} selection_anchor (index)

Set the selection anchor to the item given by `index'.
If `index' refers to a non-existent item, the closest item is used.
The selection anchor is the end of the selection that is fixed while
dragging out a selection with the mouse, and may afterwards be referred
to with the @code{'anchor'} index.
@ref{4522,,select_anchor()} is an alias of @code{selection_anchor()}.
@end deffn

@geindex select_clear() (tkinter.Listbox method)

@geindex selection_clear() (tkinter.Listbox method)
@anchor{library/tkinter tkinter Listbox select_clear}@anchor{4523}@anchor{library/tkinter tkinter Listbox selection_clear}@anchor{4524}
@deffn {Method} selection_clear (first, last=None)

Deselect any of the items in the range from `first' to `last' inclusive
that are selected.
The selection state of items outside this range is not changed.
@ref{4523,,select_clear()} is an alias of @code{selection_clear()}.
@end deffn

@geindex select_includes() (tkinter.Listbox method)

@geindex selection_includes() (tkinter.Listbox method)
@anchor{library/tkinter tkinter Listbox select_includes}@anchor{4525}@anchor{library/tkinter tkinter Listbox selection_includes}@anchor{4526}
@deffn {Method} selection_includes (index)

Return @code{True} if the item given by `index' is currently selected,
@code{False} otherwise.
@ref{4525,,select_includes()} is an alias of @code{selection_includes()}.
@end deffn

@geindex select_set() (tkinter.Listbox method)

@geindex selection_set() (tkinter.Listbox method)
@anchor{library/tkinter tkinter Listbox select_set}@anchor{4527}@anchor{library/tkinter tkinter Listbox selection_set}@anchor{4528}
@deffn {Method} selection_set (first, last=None)

Select all of the items in the range from `first' to `last' inclusive,
without affecting the selection state of items outside that range.
@ref{4527,,select_set()} is an alias of @code{selection_set()}.
@end deffn

@geindex itemcget() (tkinter.Listbox method)
@anchor{library/tkinter tkinter Listbox itemcget}@anchor{4529}
@deffn {Method} itemcget (index, option)

Return the current value of the configuration option `option' for the
item given by `index'.
@end deffn

@geindex itemconfig() (tkinter.Listbox method)

@geindex itemconfigure() (tkinter.Listbox method)
@anchor{library/tkinter tkinter Listbox itemconfig}@anchor{452a}@anchor{library/tkinter tkinter Listbox itemconfigure}@anchor{452b}
@deffn {Method} itemconfigure (index, cnf=None, **kw)

Query or modify the configuration options of the item given by `index'.
This mirrors @ref{4383,,configure()}, except that it applies to an
individual item rather than to the listbox as a whole.
With no options, it returns a dictionary describing the current options
of the item; otherwise it sets the given options.
The supported item options are `background', `foreground',
`selectbackground' and `selectforeground'.
@ref{452a,,itemconfig()} is an alias of @code{itemconfigure()}.
@end deffn

@geindex scan_mark() (tkinter.Listbox method)
@anchor{library/tkinter tkinter Listbox scan_mark}@anchor{452c}
@deffn {Method} scan_mark (x, y)

Record `x', `y' and the current view, for use with later
@ref{452d,,scan_dragto()} calls.
This is typically bound to a mouse button press in the widget.
@end deffn

@geindex scan_dragto() (tkinter.Listbox method)
@anchor{library/tkinter tkinter Listbox scan_dragto}@anchor{452d}
@deffn {Method} scan_dragto (x, y)

Scroll the listbox by 10 times the difference between `x', `y' and the
coordinates passed to the last @ref{452c,,scan_mark()} call.
This is typically bound to mouse motion events in the widget, producing
the effect of dragging the list at high speed through the window.
@end deffn
@end deffn

@geindex Menu (class in tkinter)
@anchor{library/tkinter tkinter Menu}@anchor{44c1}
@deffn {Class} tkinter.Menu (master=None, cnf=@{@}, **kw)

A @code{Menu} widget displays a column of entries, each of which may be a
command, a checkbutton, a radiobutton, a cascade (which posts an associated
submenu) or a separator.
Menus are used as the menubar of a toplevel window, as pulldown menus posted
from a cascade entry or menubutton, and as popup menus.
Inherits from @ref{438a,,Widget}.

Many of the entry methods take an `index' argument that selects which entry
to operate on.
As described in the Tk @code{menu} manual page, `index' may be a numeric index
(counting from 0 at the top), @code{'active'} (the currently active entry),
@code{'end'} or @code{'last'} (the bottommost entry), @code{'none'} (no entry at all,
written @code{@{@}} in Tcl), @code{@@y} (the entry covering pixel y-coordinate `y' in
the menu window), or a pattern matched against the labels of the entries
from the top down.

@geindex add() (tkinter.Menu method)
@anchor{library/tkinter tkinter Menu add}@anchor{452e}
@deffn {Method} add (itemType, cnf=@{@}, **kw)

Add a new entry to the bottom of the menu.
`itemType' is one of @code{'command'}, @code{'cascade'}, @code{'checkbutton'},
@code{'radiobutton'} or @code{'separator'} and determines the type of the new
entry; the remaining options configure it.
The @code{add_command()}, @code{add_cascade()}, @code{add_checkbutton()},
@code{add_radiobutton()} and @code{add_separator()} convenience methods
call this method with the corresponding `itemType'.

The entry is configured by the following options, although not every
option applies to every entry type (a separator accepts none of them):


@table @asis

@item `label'

The text to display in the entry.

@item `command'

The function to call when the entry is invoked (command, checkbutton
and radiobutton entries).

@item `accelerator'

A string displayed at the right of the entry to advertise an
accelerator keystroke; it does not itself create the binding.

@item `underline'

The index of a character in the label to underline for keyboard
traversal.

@item `state'

One of @code{'normal'}, @code{'active'} or @code{'disabled'}.

@item `image'

An image to display instead of, or together with, the text label.

@item `compound'

Where to show the image relative to the text: @code{'none'} (the
default), @code{'text'}, @code{'image'}, @code{'top'}, @code{'bottom'}, @code{'left'}
or @code{'right'}.

@item `bitmap'

A bitmap to display instead of the text label.

@item `font'

The font to use for the text.

@item `background', `foreground'

The entry’s background and foreground colors in its normal state
(ignored on macOS).

@item `activebackground', `activeforeground'

The background and foreground colors used when the entry is active
(ignored on macOS).

@item `columnbreak'

If true, the entry starts a new column instead of being placed below
the previous entry.

@item `hidemargin'

If true, the standard margin around the entry is omitted, which is
useful when a menu is used as a palette.

@item `menu'

The submenu posted by a cascade entry; it must be a child of this
menu.

@item `variable'

The variable associated with a checkbutton or radiobutton entry.

@item `onvalue', `offvalue'

The values stored in `variable' when a checkbutton entry is selected
or cleared.

@item `value'

The value stored in `variable' when a radiobutton entry is selected.

@item `indicatoron'

Whether to display the indicator of a checkbutton or radiobutton
entry.

@item `selectcolor'

The color of the indicator of a checkbutton or radiobutton entry when
it is selected.

@item `selectimage'

The image displayed when a checkbutton or radiobutton entry is
selected and `image' is also given.
@end table
@end deffn

@geindex add_cascade() (tkinter.Menu method)
@anchor{library/tkinter tkinter Menu add_cascade}@anchor{452f}
@deffn {Method} add_cascade (cnf=@{@}, **kw)

Add a new cascade entry to the bottom of the menu.
A cascade entry has an associated submenu, given by its `menu' option,
which must be a child of this menu; posting the entry posts the submenu
next to it.
@end deffn

@geindex add_checkbutton() (tkinter.Menu method)
@anchor{library/tkinter tkinter Menu add_checkbutton}@anchor{4530}
@deffn {Method} add_checkbutton (cnf=@{@}, **kw)

Add a new checkbutton entry to the bottom of the menu.
When invoked, a checkbutton entry toggles between its `onvalue' and
`offvalue', storing the result in its associated `variable', and displays
an indicator showing whether it is selected.
@end deffn

@geindex add_command() (tkinter.Menu method)
@anchor{library/tkinter tkinter Menu add_command}@anchor{4531}
@deffn {Method} add_command (cnf=@{@}, **kw)

Add a new command entry to the bottom of the menu.
A command entry behaves much like a button: when it is invoked, the
callback given by its `command' option is called.
@end deffn

@geindex add_radiobutton() (tkinter.Menu method)
@anchor{library/tkinter tkinter Menu add_radiobutton}@anchor{4532}
@deffn {Method} add_radiobutton (cnf=@{@}, **kw)

Add a new radiobutton entry to the bottom of the menu.
Radiobutton entries sharing the same `variable' form a group of which
only one may be selected at a time; selecting an entry stores its `value'
in the variable.
@end deffn

@geindex add_separator() (tkinter.Menu method)
@anchor{library/tkinter tkinter Menu add_separator}@anchor{4533}
@deffn {Method} add_separator (cnf=@{@}, **kw)

Add a separator to the bottom of the menu.
A separator is displayed as a horizontal dividing line and cannot be
activated or invoked.
@end deffn

@geindex insert() (tkinter.Menu method)
@anchor{library/tkinter tkinter Menu insert}@anchor{4534}
@deffn {Method} insert (index, itemType, cnf=@{@}, **kw)

Same as @ref{452e,,add()}, except that the new entry is inserted just before
the entry given by `index' instead of being appended to the end of the
menu.
`itemType' is one of @code{'command'}, @code{'cascade'}, @code{'checkbutton'},
@code{'radiobutton'} or @code{'separator'}.
The @code{insert_command()}, @code{insert_cascade()},
@code{insert_checkbutton()}, @code{insert_radiobutton()} and
@code{insert_separator()} convenience methods call this method with the
corresponding `itemType'.
@end deffn

@geindex insert_cascade() (tkinter.Menu method)
@anchor{library/tkinter tkinter Menu insert_cascade}@anchor{4535}
@deffn {Method} insert_cascade (index, cnf=@{@}, **kw)

Insert a new cascade entry before the entry given by `index' (see
@ref{452f,,add_cascade()}).
@end deffn

@geindex insert_checkbutton() (tkinter.Menu method)
@anchor{library/tkinter tkinter Menu insert_checkbutton}@anchor{4536}
@deffn {Method} insert_checkbutton (index, cnf=@{@}, **kw)

Insert a new checkbutton entry before the entry given by `index' (see
@ref{4530,,add_checkbutton()}).
@end deffn

@geindex insert_command() (tkinter.Menu method)
@anchor{library/tkinter tkinter Menu insert_command}@anchor{4537}
@deffn {Method} insert_command (index, cnf=@{@}, **kw)

Insert a new command entry before the entry given by `index' (see
@ref{4531,,add_command()}).
@end deffn

@geindex insert_radiobutton() (tkinter.Menu method)
@anchor{library/tkinter tkinter Menu insert_radiobutton}@anchor{4538}
@deffn {Method} insert_radiobutton (index, cnf=@{@}, **kw)

Insert a new radiobutton entry before the entry given by `index' (see
@ref{4532,,add_radiobutton()}).
@end deffn

@geindex insert_separator() (tkinter.Menu method)
@anchor{library/tkinter tkinter Menu insert_separator}@anchor{4539}
@deffn {Method} insert_separator (index, cnf=@{@}, **kw)

Insert a separator before the entry given by `index' (see
@ref{4533,,add_separator()}).
@end deffn

@geindex delete() (tkinter.Menu method)
@anchor{library/tkinter tkinter Menu delete}@anchor{453a}
@deffn {Method} delete (index1, index2=None)

Delete all of the menu entries between `index1' and `index2' inclusive.
If `index2' is omitted, it defaults to `index1', so that a single entry
is deleted.
Attempts to delete a tear-off entry are ignored; remove it by changing
the `tearoff' option instead.
@end deffn

@geindex entrycget() (tkinter.Menu method)
@anchor{library/tkinter tkinter Menu entrycget}@anchor{453b}
@deffn {Method} entrycget (index, option)

Return the current value of the configuration option `option' for the
entry given by `index'.
@end deffn

@geindex entryconfig() (tkinter.Menu method)

@geindex entryconfigure() (tkinter.Menu method)
@anchor{library/tkinter tkinter Menu entryconfig}@anchor{453c}@anchor{library/tkinter tkinter Menu entryconfigure}@anchor{453d}
@deffn {Method} entryconfigure (index, cnf=None, **kw)

Query or modify the configuration options of the entry given by `index'.
This mirrors @ref{4383,,configure()}, except that it applies to an
individual entry rather than to the menu as a whole.
With no options, it returns a dictionary describing the current options
of the entry; otherwise it sets the given options.
The supported options are those accepted by @ref{452e,,add()} for the entry’s
type.
@ref{453c,,entryconfig()} is an alias of @code{entryconfigure()}.
@end deffn

@geindex index() (tkinter.Menu method)
@anchor{library/tkinter tkinter Menu index}@anchor{1ade}
@deffn {Method} index (index)

Return the numerical index corresponding to `index', or @code{None} if
`index' selects no entry.
@end deffn

@geindex type() (tkinter.Menu method)
@anchor{library/tkinter tkinter Menu type}@anchor{453e}
@deffn {Method} type (index)

Return the type of the entry given by `index': one of @code{'command'},
@code{'cascade'}, @code{'checkbutton'}, @code{'radiobutton'}, @code{'separator'} or
@code{'tearoff'} (for the tear-off entry).
@end deffn

@geindex activate() (tkinter.Menu method)
@anchor{library/tkinter tkinter Menu activate}@anchor{453f}
@deffn {Method} activate (index)

Make the entry given by `index' the active entry, redisplaying it with
its active colors, and deactivate any previously active entry.
If `index' selects no entry, or the selected entry is disabled, the menu
ends up with no active entry.
@end deffn

@geindex invoke() (tkinter.Menu method)
@anchor{library/tkinter tkinter Menu invoke}@anchor{4540}
@deffn {Method} invoke (index)

Invoke the action of the entry given by `index', as if it had been
clicked.
Nothing happens if the entry is disabled.
If the entry has a `command' associated with it, the result of that
command is returned; otherwise the result is an empty string.
@end deffn

@geindex post() (tkinter.Menu method)
@anchor{library/tkinter tkinter Menu post}@anchor{4541}
@deffn {Method} post (x, y)

Display the menu on the screen at the root-window coordinates `x' and
`y', adjusting them if necessary so that the whole menu is visible.
If the `postcommand' option has been specified, it is evaluated before
the menu is posted.
@end deffn

@geindex tk_popup() (tkinter.Menu method)
@anchor{library/tkinter tkinter Menu tk_popup}@anchor{4542}
@deffn {Method} tk_popup (x, y, entry='@w{'})

Post the menu as a popup at the root-window coordinates `x' and `y'.
If `entry' is given, the menu is positioned so that this entry is
displayed under the pointer.
@end deffn

@geindex unpost() (tkinter.Menu method)
@anchor{library/tkinter tkinter Menu unpost}@anchor{4543}
@deffn {Method} unpost ()

Unmap the menu so that it is no longer displayed, also unposting any
posted lower-level cascaded submenu.
This has no effect on Windows and macOS, which manage the unposting of
menus themselves.
@end deffn

@geindex xposition() (tkinter.Menu method)
@anchor{library/tkinter tkinter Menu xposition}@anchor{4544}
@deffn {Method} xposition (index)

Return the x-coordinate, within the menu window, of the leftmost pixel of
the entry given by `index'.


Added in version 3.3.

@end deffn

@geindex yposition() (tkinter.Menu method)
@anchor{library/tkinter tkinter Menu yposition}@anchor{4545}
@deffn {Method} yposition (index)

Return the y-coordinate, within the menu window, of the topmost pixel of
the entry given by `index'.
@end deffn
@end deffn

@geindex Menubutton (class in tkinter)
@anchor{library/tkinter tkinter Menubutton}@anchor{4546}
@deffn {Class} tkinter.Menubutton (master=None, cnf=@{@}, **kw)

A @code{Menubutton} widget displays a textual string, bitmap or image and
posts an associated @ref{44c1,,Menu}, given by its `menu' option, when the user
presses it.
Like a @ref{44c0,,Label} it can show `text', a `textvariable', or an `image',
and the `direction' option controls where the menu appears relative to the
button.
Inherits from @ref{438a,,Widget}.
Refer to the Tk @code{menubutton} manual page for the full list of options.
@end deffn

@geindex Message (class in tkinter)
@anchor{library/tkinter tkinter Message}@anchor{4547}
@deffn {Class} tkinter.Message (master=None, cnf=@{@}, **kw)

A @code{Message} widget displays a non-interactive textual string, given
by the `text' option or linked to a variable through `textvariable'.
Unlike a @ref{44c0,,Label}, it breaks the string into multiple lines in order
to produce a given aspect ratio, choosing line breaks at word boundaries,
and it can justify the text left, centered or right.
Inherits from @ref{438a,,Widget}.
Refer to the Tk @code{message} manual page for the full list of options.
@end deffn

@geindex OptionMenu (class in tkinter)
@anchor{library/tkinter tkinter OptionMenu}@anchor{4548}
@deffn {Class} tkinter.OptionMenu (master, variable, value, *values, **kwargs)

A helper subclass of @ref{4546,,Menubutton} that displays a pop-up menu of
mutually exclusive choices.
`variable' is a @ref{1d0f,,Variable} kept in sync with the selection, `value'
is the initial choice, and `values' are the remaining menu entries.
The keyword argument `command' may be given a callback that is invoked with
the selected value, and the keyword argument `name' sets the Tk widget name.

@geindex destroy() (tkinter.OptionMenu method)
@anchor{library/tkinter tkinter OptionMenu destroy}@anchor{4549}
@deffn {Method} destroy ()

Destroy the widget, also cleaning up the associated pop-up menu.
@end deffn


Changed in version 3.14: Added support for the `name' keyword argument.

@end deffn

@geindex PanedWindow (class in tkinter)
@anchor{library/tkinter tkinter PanedWindow}@anchor{454a}
@deffn {Class} tkinter.PanedWindow (master=None, cnf=@{@}, **kw)

A @code{PanedWindow} is a geometry-manager widget that arranges any
number of child `panes' in a row (when `orient' is @code{'horizontal'}) or a
column (when `orient' is @code{'vertical'}).
Each pane holds one widget, and each pair of adjacent panes is separated by
a movable `sash' that the user can drag with the mouse to resize the widgets
on either side of it.
Inherits from @ref{438a,,Widget}.

The `orient' option selects the layout direction, `sashwidth' sets the width
of each sash and `sashrelief' its relief.
When `showhandle' is true a small handle is drawn on each sash that the user
can grab to drag it.
Refer to the Tk @code{panedwindow} manual page for the full list of options.

@geindex add() (tkinter.PanedWindow method)
@anchor{library/tkinter tkinter PanedWindow add}@anchor{454b}
@deffn {Method} add (child, **kw)

Add `child' to the panedwindow as a new pane, placed after any existing
panes.
The keyword arguments specify per-pane management options for `child';
they may be any of the options accepted by @ref{454c,,paneconfigure()}.
@end deffn

@geindex forget() (tkinter.PanedWindow method)

@geindex remove() (tkinter.PanedWindow method)
@anchor{library/tkinter tkinter PanedWindow forget}@anchor{454d}@anchor{library/tkinter tkinter PanedWindow remove}@anchor{454e}
@deffn {Method} remove (child)

Remove the pane containing `child' from the panedwindow.
All geometry management options for `child' are forgotten.
@ref{454d,,forget()} is an alias of @code{remove()}.
@end deffn

@geindex panes() (tkinter.PanedWindow method)
@anchor{library/tkinter tkinter PanedWindow panes}@anchor{454f}
@deffn {Method} panes ()

Return a tuple of the widgets managed by the panedwindow, one per pane,
in order.
@end deffn

@geindex panecget() (tkinter.PanedWindow method)
@anchor{library/tkinter tkinter PanedWindow panecget}@anchor{4550}
@deffn {Method} panecget (child, option)

Return the current value of the management option `option' for the pane
containing `child'.
`option' may be any value allowed by @ref{454c,,paneconfigure()}.
@end deffn

@geindex paneconfig() (tkinter.PanedWindow method)

@geindex paneconfigure() (tkinter.PanedWindow method)
@anchor{library/tkinter tkinter PanedWindow paneconfig}@anchor{4551}@anchor{library/tkinter tkinter PanedWindow paneconfigure}@anchor{454c}
@deffn {Method} paneconfigure (tagOrId, cnf=None, **kw)

Query or modify the management options of the pane containing the widget
`tagOrId'.
With no options, it returns a dictionary describing all of the available
options for the pane; given a single option name as a string, it returns
a description of that one option; otherwise it sets the given options.
The supported options include `after' and `before' (insert the pane after
or before another managed window), `height' and `width' (the outer
dimensions of the window, including any border), `minsize' (the minimum
size in the paned dimension), `padx' and `pady' (extra space to leave on
each side of the window), `sticky' (position or stretch the window within
an oversized pane, using a string of the characters @code{n}, @code{s}, @code{e}
and @code{w}), `hide' (hide the pane while keeping it in the list of panes)
and `stretch' (how extra space is allocated to the pane: one of
@code{'always'}, @code{'first'}, @code{'last'}, @code{'middle'} or @code{'never'}).
@ref{4551,,paneconfig()} is an alias of @code{paneconfigure()}.
@end deffn

@geindex identify() (tkinter.PanedWindow method)
@anchor{library/tkinter tkinter PanedWindow identify}@anchor{4552}
@deffn {Method} identify (x, y)

Identify the panedwindow component underneath the point given by `x' and
`y', in window coordinates.
If the point is over a sash or a sash handle, the result is a two-element
tuple containing the index of the sash or handle and a word indicating
whether it is over a sash or a handle, such as @code{(0, 'sash')} or
@code{(2, 'handle')}.
If the point is over any other part of the panedwindow, the result is an
empty string.
@end deffn

@geindex sash() (tkinter.PanedWindow method)
@anchor{library/tkinter tkinter PanedWindow sash}@anchor{4553}
@deffn {Method} sash (*args)

Query or change the position of the sashes in the panedwindow.
This is a thin wrapper around the Tk @code{sash} subcommand; the convenience
methods @ref{4554,,sash_coord()}, @ref{4555,,sash_mark()} and @ref{4556,,sash_place()}
should normally be used instead.
@end deffn

@geindex sash_coord() (tkinter.PanedWindow method)
@anchor{library/tkinter tkinter PanedWindow sash_coord}@anchor{4554}
@deffn {Method} sash_coord (index)

Return the current x and y coordinate pair for the sash given by `index',
which must be an integer between 0 and one less than the number of panes
in the panedwindow.
The coordinates returned are those of the top left corner of the region
containing the sash.
@end deffn

@geindex sash_mark() (tkinter.PanedWindow method)
@anchor{library/tkinter tkinter PanedWindow sash_mark}@anchor{4555}
@deffn {Method} sash_mark (index)

Record the current mouse position for the sash given by `index', for use
together with later sash-drag operations to move the sash.
@end deffn

@geindex sash_place() (tkinter.PanedWindow method)
@anchor{library/tkinter tkinter PanedWindow sash_place}@anchor{4556}
@deffn {Method} sash_place (index, x, y)

Place the sash given by `index' at the coordinates `x' and `y'.
@end deffn

@geindex proxy() (tkinter.PanedWindow method)
@anchor{library/tkinter tkinter PanedWindow proxy}@anchor{4557}
@deffn {Method} proxy (*args)

Query or change the position of the sash proxy, the “ghost” sash shown
while a sash is being dragged with non-opaque resizing.
This is a thin wrapper around the Tk @code{proxy} subcommand; the
convenience methods @ref{4558,,proxy_coord()}, @ref{4559,,proxy_forget()} and
@ref{455a,,proxy_place()} should normally be used instead.
@end deffn

@geindex proxy_coord() (tkinter.PanedWindow method)
@anchor{library/tkinter tkinter PanedWindow proxy_coord}@anchor{4558}
@deffn {Method} proxy_coord ()

Return a tuple containing the x and y coordinates of the most recent
proxy location.
@end deffn

@geindex proxy_forget() (tkinter.PanedWindow method)
@anchor{library/tkinter tkinter PanedWindow proxy_forget}@anchor{4559}
@deffn {Method} proxy_forget ()

Remove the proxy from the display.
@end deffn

@geindex proxy_place() (tkinter.PanedWindow method)
@anchor{library/tkinter tkinter PanedWindow proxy_place}@anchor{455a}
@deffn {Method} proxy_place (x, y)

Place the proxy at the coordinates `x' and `y'.
@end deffn
@end deffn

@geindex Radiobutton (class in tkinter)
@anchor{library/tkinter tkinter Radiobutton}@anchor{455b}
@deffn {Class} tkinter.Radiobutton (master=None, cnf=@{@}, **kw)

A @code{Radiobutton} widget displays a textual string, bitmap or image
together with a diamond or circular indicator, and selects one choice out of
several.
It has all the behavior of a simple button and, in addition, can be
selected: typically several radiobuttons share a single `variable', and
selecting one sets that variable to the radiobutton’s `value'; each
radiobutton also monitors the variable and automatically selects or
deselects itself when the variable changes.
Inherits from @ref{438a,,Widget}.
In addition to the standard widget options, a radiobutton accepts the
options documented in the Tk @code{radiobutton} manual page, such as
`variable', `value' and `command'.

@geindex invoke() (tkinter.Radiobutton method)
@anchor{library/tkinter tkinter Radiobutton invoke}@anchor{455c}
@deffn {Method} invoke ()

Do just what would happen if the user pressed the radiobutton with the
mouse: select the button and invoke the associated command, if there is
one.
Return the result of the command, or an empty string if no command is
associated with the radiobutton.
This is ignored if the radiobutton’s state is @code{disabled}.
@end deffn

@geindex select() (tkinter.Radiobutton method)
@anchor{library/tkinter tkinter Radiobutton select}@anchor{455d}
@deffn {Method} select ()

Select the radiobutton and set the associated variable to the value
corresponding to this widget.
@end deffn

@geindex deselect() (tkinter.Radiobutton method)
@anchor{library/tkinter tkinter Radiobutton deselect}@anchor{455e}
@deffn {Method} deselect ()

Deselect the radiobutton and set the associated variable to an empty
string.
If this radiobutton was not currently selected, this has no effect.
@end deffn

@geindex flash() (tkinter.Radiobutton method)
@anchor{library/tkinter tkinter Radiobutton flash}@anchor{455f}
@deffn {Method} flash ()

Flash the radiobutton by redisplaying it several times, alternating
between the active and normal colors.
At the end of the flash the radiobutton is left in the same normal or
active state as when the method was called.
This is ignored if the radiobutton’s state is @code{disabled}.
@end deffn
@end deffn

@geindex Scale (class in tkinter)
@anchor{library/tkinter tkinter Scale}@anchor{4560}
@deffn {Class} tkinter.Scale (master=None, cnf=@{@}, **kw)

A @code{Scale} widget lets the user select a numerical value by moving a
slider along a trough.
It can be oriented vertically or horizontally and can optionally display a
label and the current value.
Inherits from @ref{438a,,Widget}.

In addition to the standard widget options, a scale accepts the options
documented in the Tk @code{scale} manual page, such as `from_', `to',
`resolution', `orient', `tickinterval', `variable' and `command'.
As elsewhere in @code{tkinter}, the leading @code{-} of the Tk option name is
dropped; `from' is spelled @code{from_} because @ref{14b7,,from} is a Python
keyword.

@geindex get() (tkinter.Scale method)
@anchor{library/tkinter tkinter Scale get}@anchor{4561}
@deffn {Method} get ()

Return the current value of the scale.
The result is an integer if the scale’s `resolution' yields whole
numbers, and a float otherwise.
@end deffn

@geindex set() (tkinter.Scale method)
@anchor{library/tkinter tkinter Scale set}@anchor{4562}
@deffn {Method} set (value)

Set the scale to `value', moving the slider accordingly.
This has no effect if the scale is disabled.
@end deffn

@geindex coords() (tkinter.Scale method)
@anchor{library/tkinter tkinter Scale coords}@anchor{4563}
@deffn {Method} coords (value=None)

Return a tuple @code{(x, y)} giving the pixel coordinates, relative to the
widget, of the point on the centerline of the trough that corresponds to
`value'.
If `value' is omitted, the scale’s current value is used.
@end deffn

@geindex identify() (tkinter.Scale method)
@anchor{library/tkinter tkinter Scale identify}@anchor{4564}
@deffn {Method} identify (x, y)

Return a string describing the part of the scale at the pixel coordinates
`x', `y': @code{'slider'}, @code{'trough1'} (the part of the trough above or to
the left of the slider), @code{'trough2'} (below or to the right of the
slider), or an empty string if the point is not over any of these
elements.
@end deffn
@end deffn

@geindex Scrollbar (class in tkinter)
@anchor{library/tkinter tkinter Scrollbar}@anchor{44b7}
@deffn {Class} tkinter.Scrollbar (master=None, cnf=@{@}, **kw)

A @code{Scrollbar} widget displays a slider and two arrows that let the
user scroll an associated widget, such as a @ref{44b4,,Listbox}, @ref{1a3d,,Text},
@ref{1a3e,,Canvas} or @ref{44b3,,Entry}.
It is connected to the scrolled widget by setting that widget’s
`xscrollcommand' or `yscrollcommand' option to the scrollbar’s @ref{185,,set()}
method, and the scrollbar’s `command' option to the scrolled widget’s
@ref{44b6,,xview()} or @ref{44bb,,yview()} method.
Inherits from @ref{438a,,Widget}.

@geindex get() (tkinter.Scrollbar method)
@anchor{library/tkinter tkinter Scrollbar get}@anchor{4565}
@deffn {Method} get ()

Return the current scrollbar settings as a tuple @code{(first, last)} of two
fractions between 0 and 1, describing the portion of the document that is
currently visible, as last passed to @ref{185,,set()}.
@end deffn

@geindex set() (tkinter.Scrollbar method)
@anchor{library/tkinter tkinter Scrollbar set}@anchor{4566}
@deffn {Method} set (first, last)

Set the scrollbar.
`first' and `last' are fractions between 0 and 1 giving the positions of
the start and end of the visible portion of the associated document.
This method is normally registered as the scrolled widget’s
`xscrollcommand' or `yscrollcommand' and called by that widget.
@end deffn

@geindex activate() (tkinter.Scrollbar method)
@anchor{library/tkinter tkinter Scrollbar activate}@anchor{4567}
@deffn {Method} activate (index=None)

Mark the element `index' (one of @code{'arrow1'}, @code{'slider'} or
@code{'arrow2'}) as active, displaying it according to the
`activebackground' and `activerelief' options.
If `index' is omitted, return the name of the currently active element,
or @code{None} if no element is active.


Changed in version 3.5: The `index' argument is now optional.

@end deffn

@geindex delta() (tkinter.Scrollbar method)
@anchor{library/tkinter tkinter Scrollbar delta}@anchor{4568}
@deffn {Method} delta (deltax, deltay)

Return a float indicating the fractional change in the scrollbar setting
that corresponds to moving the slider by `deltax' pixels horizontally
(for horizontal scrollbars) or `deltay' pixels vertically (for vertical
scrollbars).
@end deffn

@geindex fraction() (tkinter.Scrollbar method)
@anchor{library/tkinter tkinter Scrollbar fraction}@anchor{4569}
@deffn {Method} fraction (x, y)

Return a float between 0 and 1 indicating where the point at pixel
coordinates `x', `y' lies in the trough: 0 corresponds to the top or left
of the trough and 1 to the bottom or right.
@end deffn

@geindex identify() (tkinter.Scrollbar method)
@anchor{library/tkinter tkinter Scrollbar identify}@anchor{456a}
@deffn {Method} identify (x, y)

Return the name of the element under the pixel coordinates `x', `y' (such
as @code{'arrow1'}), or an empty string if the point does not lie in any
element of the scrollbar.
@end deffn
@end deffn

@geindex Spinbox (class in tkinter)
@anchor{library/tkinter tkinter Spinbox}@anchor{44b5}
@deffn {Class} tkinter.Spinbox (master=None, cnf=@{@}, **kw)

A @code{Spinbox} widget is an @ref{44b3,,Entry}-like widget with a pair of
up/down arrow buttons that let the user step through a range of values in
addition to editing the value directly.
The set of values may be a numeric range given by the `from_', `to' and
`increment' options, or an explicit list of strings given by the `values'
option (which takes precedence over the range).
Each time an arrow is invoked the `command' callback, if any, is called; the
`wrap' option controls whether stepping past either end of the range wraps
around to the other end; the `format' option specifies how numeric values
are formatted; and the `validate' option enables validation of the entered
text.
Inherits from @ref{438a,,Widget} and @ref{44b2,,XView}.

Many of the methods take an `index' argument identifying a character in the
spinbox’s string.
As described in the Tk @code{spinbox} manual page, `index' may be a numeric
index (counting from 0), @code{'anchor'} (the selection anchor point),
@code{'end'} (just after the last character), @code{'insert'} (the character just
after the insertion cursor), @code{'sel.first'} or @code{'sel.last'} (the ends of
the selection), or @code{@@x} (the character covering pixel x-coordinate `x' in
the window).

@geindex get() (tkinter.Spinbox method)
@anchor{library/tkinter tkinter Spinbox get}@anchor{456b}
@deffn {Method} get ()

Return the spinbox’s string.
@end deffn

@geindex insert() (tkinter.Spinbox method)
@anchor{library/tkinter tkinter Spinbox insert}@anchor{456c}
@deffn {Method} insert (index, s)

Insert the characters of the string `s' just before the character given
by `index'.
@end deffn

@geindex delete() (tkinter.Spinbox method)
@anchor{library/tkinter tkinter Spinbox delete}@anchor{456d}
@deffn {Method} delete (first, last=None)

Delete one or more characters of the spinbox.
`first' is the index of the first character to delete, and `last' is the
index of the character just after the last one to delete.
If `last' is omitted, a single character at `first' is deleted.
@end deffn

@geindex icursor() (tkinter.Spinbox method)
@anchor{library/tkinter tkinter Spinbox icursor}@anchor{456e}
@deffn {Method} icursor (index)

Arrange for the insertion cursor to be displayed just before the
character given by `index'.
@end deffn

@geindex index() (tkinter.Spinbox method)
@anchor{library/tkinter tkinter Spinbox index}@anchor{456f}
@deffn {Method} index (index)

Return the numerical index corresponding to `index', as a string.
@end deffn

@geindex bbox() (tkinter.Spinbox method)
@anchor{library/tkinter tkinter Spinbox bbox}@anchor{4570}
@deffn {Method} bbox (index)

Return a tuple of four integers @code{(x, y, width, height)} describing the
bounding box of the character given by `index'.
`x' and `y' are the pixel coordinates of the upper-left corner of the
character relative to the widget, and `width' and `height' are its size
in pixels.
The bounding box may refer to a region outside the visible area of the
window.
@end deffn

@geindex identify() (tkinter.Spinbox method)
@anchor{library/tkinter tkinter Spinbox identify}@anchor{4571}
@deffn {Method} identify (x, y)

Return the name of the window element at the pixel coordinates `x', `y':
one of @code{'buttondown'}, @code{'buttonup'}, @code{'entry'} or @code{'none'}.
@end deffn

@geindex invoke() (tkinter.Spinbox method)
@anchor{library/tkinter tkinter Spinbox invoke}@anchor{4572}
@deffn {Method} invoke (element)

Invoke the spin button given by `element', either @code{'buttonup'} or
@code{'buttondown'}, triggering the action associated with it.
@end deffn

@geindex scan() (tkinter.Spinbox method)
@anchor{library/tkinter tkinter Spinbox scan}@anchor{4573}
@deffn {Method} scan (*args)

A thin wrapper around the Tk @code{scan} widget subcommand, used to
implement fast dragging of the view: @code{scan('mark', x)} records `x' and
the current view, and @code{scan('dragto', x)} adjusts the view relative to
that mark.
The @ref{4574,,scan_mark()} and @ref{4575,,scan_dragto()} methods wrap the two forms.
@end deffn

@geindex scan_mark() (tkinter.Spinbox method)
@anchor{library/tkinter tkinter Spinbox scan_mark}@anchor{4574}
@deffn {Method} scan_mark (x)

Record `x' and the current view in the spinbox window, for use with a
later @ref{4575,,scan_dragto()} call.
This is typically associated with a mouse button press in the widget.
@end deffn

@geindex scan_dragto() (tkinter.Spinbox method)
@anchor{library/tkinter tkinter Spinbox scan_dragto}@anchor{4575}
@deffn {Method} scan_dragto (x)

Adjust the view by 10 times the difference between `x' and the `x' passed
to the last @ref{4574,,scan_mark()} call.
This is typically associated with mouse motion events, producing the
effect of dragging the spinbox at high speed through the window.
@end deffn

@geindex selection() (tkinter.Spinbox method)
@anchor{library/tkinter tkinter Spinbox selection}@anchor{4576}
@deffn {Method} selection (*args)

A thin wrapper around the Tk @code{selection} widget subcommand, used to
adjust the selection within the spinbox.
It has several forms depending on the first argument, such as
@code{selection('adjust', index)}, @code{selection('clear')},
@code{selection('element', ?elem?)}, @code{selection('from', index)},
@code{selection('present')}, @code{selection('range', start, end)} and
@code{selection('to', index)}.
The @ref{4577,,selection_adjust()}, @ref{4578,,selection_clear()},
@ref{4579,,selection_element()}, @ref{457a,,selection_from()},
@ref{457b,,selection_present()}, @ref{457c,,selection_range()} and
@ref{457d,,selection_to()} methods wrap these forms.
@end deffn

@geindex selection_adjust() (tkinter.Spinbox method)
@anchor{library/tkinter tkinter Spinbox selection_adjust}@anchor{4577}
@deffn {Method} selection_adjust (index)

Locate the end of the selection nearest to the character given by `index'
and adjust that end of the selection to be at `index' (including but not
going beyond `index').
The other end becomes the anchor point for future @ref{457d,,selection_to()}
calls.
If the selection is not currently in the spinbox, a new selection is
created to include the characters between `index' and the most recent
anchor point, inclusive.
@end deffn

@geindex selection_clear() (tkinter.Spinbox method)
@anchor{library/tkinter tkinter Spinbox selection_clear}@anchor{4578}
@deffn {Method} selection_clear ()

Clear the selection if it is currently in this widget.
If the selection is not in this widget, the method has no effect.
@end deffn

@geindex selection_element() (tkinter.Spinbox method)
@anchor{library/tkinter tkinter Spinbox selection_element}@anchor{4579}
@deffn {Method} selection_element (element=None)

Set or get the currently selected element.
If `element' (one of @code{'buttonup'}, @code{'buttondown'} or @code{'none'}) is
given, that spin button is selected and displayed depressed; otherwise
the name of the currently selected element is returned.
@end deffn

@geindex selection_from() (tkinter.Spinbox method)
@anchor{library/tkinter tkinter Spinbox selection_from}@anchor{457a}
@deffn {Method} selection_from (index)

Set the selection anchor point to just before the character given by
`index', without changing the selection itself.


Added in version 3.8.

@end deffn

@geindex selection_present() (tkinter.Spinbox method)
@anchor{library/tkinter tkinter Spinbox selection_present}@anchor{457b}
@deffn {Method} selection_present ()

Return @code{True} if there are characters selected in the spinbox,
@code{False} otherwise.


Added in version 3.8.

@end deffn

@geindex selection_range() (tkinter.Spinbox method)
@anchor{library/tkinter tkinter Spinbox selection_range}@anchor{457c}
@deffn {Method} selection_range (start, end)

Set the selection to include the characters starting with the one indexed
by `start' and ending with the one just before `end'.
If `end' refers to the same character as `start' or an earlier one, the
selection is cleared.


Added in version 3.8.

@end deffn

@geindex selection_to() (tkinter.Spinbox method)
@anchor{library/tkinter tkinter Spinbox selection_to}@anchor{457d}
@deffn {Method} selection_to (index)

Set the selection between `index' and the anchor point.
If `index' is before the anchor point, the selection runs from `index' up
to but not including the anchor point; if it is after, the selection runs
from the anchor point up to but not including `index'; if it is the same,
nothing happens.
The anchor point is the one set by the most recent @ref{457a,,selection_from()}
or @ref{4577,,selection_adjust()} call.
If the selection is not in this widget, a new selection is created using
the most recent anchor point.


Added in version 3.8.

@end deffn
@end deffn

@geindex Text (class in tkinter)
@anchor{library/tkinter tkinter Text}@anchor{1a3d}
@deffn {Class} tkinter.Text (master=None, cnf=@{@}, **kw)

A @code{Text} widget displays and edits multi-line text.
Portions of the text may be styled with `tags', particular positions may
be annotated with floating `marks', and arbitrary images and other widgets
may be embedded in the text.
The widget also provides an unlimited undo/redo mechanism and supports peer
widgets that share the same underlying data.
Inherits from @ref{438a,,Widget}, @ref{44b2,,XView} and @ref{44ba,,YView}, so the
view can be scrolled horizontally and vertically with @ref{44b6,,xview()}
and @ref{44bb,,yview()}.
Refer to the Tk @code{text} manual page for the full list of options.

Most of the methods take one or more `index' arguments that identify a
position within the text.
As described in the Tk @code{text} manual page, an index is a string consisting
of a base, optionally followed by one or more modifiers.
The base may be @code{'line.char'} (line `line', character `char', where lines
are counted from 1 and characters within a line from 0; @code{'line.end'}
refers to the newline ending the line), @code{'end'} (the position just after
the last newline), the name of a mark, @code{'tag.first'} or @code{'tag.last'}
(the first character tagged with `tag', or the position just after the last
such character), the name of an embedded image or window, or @code{@@x,y} (the
character covering pixel coordinates `x', `y' in the widget).
A modifier such as @code{'+5 chars'}, @code{'-3 lines'}, @code{'linestart'},
@code{'lineend'}, @code{'wordstart'} or @code{'wordend'} adjusts the index relative
to its base; several modifiers may be combined and are applied from left to
right, for example @code{'insert wordstart - 1 c'}.

@geindex insert() (tkinter.Text method)
@anchor{library/tkinter tkinter Text insert}@anchor{457e}
@deffn {Method} insert (index, chars, *args)

Insert the string `chars' just before the character at `index' (if
`index' is @code{'end'}, just before the final newline).
By default the new text inherits any tags present on both sides of the
insertion point.
If `args' is given, it consists of alternating `tagList', `chars' values:
the preceding `chars' receives exactly the tags listed (a tag list may be
a single tag name or a sequence of names), overriding the surrounding
tags.
@end deffn

@geindex delete() (tkinter.Text method)
@anchor{library/tkinter tkinter Text delete}@anchor{457f}
@deffn {Method} delete (index1, index2=None)

Delete the range of characters from `index1' up to but not including
`index2'.
If `index2' is omitted, the single character at `index1' is deleted.
The widget always keeps a newline as its last character, so a deletion
that would remove it is adjusted accordingly.
@end deffn

@geindex replace() (tkinter.Text method)
@anchor{library/tkinter tkinter Text replace}@anchor{4580}
@deffn {Method} replace (index1, index2, chars, *args)

Replace the range of characters from `index1' up to but not including
`index2' with `chars'.
This is equivalent to a @ref{457f,,delete()} followed by an @ref{457e,,insert()} at
`index1'; `args' is interpreted as for @code{insert()}.


Added in version 3.3.

@end deffn

@geindex get() (tkinter.Text method)
@anchor{library/tkinter tkinter Text get}@anchor{4581}
@deffn {Method} get (index1, index2=None)

Return the text from `index1' up to but not including `index2' as a
string.
If `index2' is omitted, return the single character at `index1'.
Embedded images and windows are omitted from the result.
@end deffn

@geindex index() (tkinter.Text method)
@anchor{library/tkinter tkinter Text index}@anchor{4582}
@deffn {Method} index (index)

Return the position corresponding to `index' in the canonical
@code{'line.char'} form.
@end deffn

@geindex compare() (tkinter.Text method)
@anchor{library/tkinter tkinter Text compare}@anchor{4583}
@deffn {Method} compare (index1, op, index2)

Compare the positions of `index1' and `index2' using the relational
operator `op', which must be one of @code{'<'}, @code{'<='}, @code{'=='},
@code{'>='}, @code{'>'} or @code{'!='}, and return the boolean result.
@end deffn

@geindex count() (tkinter.Text method)
@anchor{library/tkinter tkinter Text count}@anchor{1a36}
@deffn {Method} count (index1, index2, *options, return_ints=False)

Count the number of items of the requested kinds between `index1' and
`index2'; the count is negative if `index1' is after `index2'.
Each of `options' names a kind of item to count: @code{'chars'},
@code{'displaychars'}, @code{'displayindices'}, @code{'displaylines'},
@code{'indices'}, @code{'lines'}, @code{'xpixels'} or @code{'ypixels'} (the default,
used when no option is given, is @code{'indices'}).
The pseudo-option @code{'update'} forces any out-of-date layout information
to be recalculated before the following options are evaluated.
When `return_ints' is true and a single counting option is given, return
a plain integer; otherwise return a tuple with one integer per counting
option (or @code{None} if the result is empty).


Added in version 3.3.



Changed in version 3.13: Added the `return_ints' parameter.

@end deffn

@geindex see() (tkinter.Text method)
@anchor{library/tkinter tkinter Text see}@anchor{4584}
@deffn {Method} see (index)

Adjust the view so that the character given by `index' is visible.
If it is already visible the method has no effect; if it is a short
distance out of view the widget scrolls just enough to bring it to the
nearest edge, otherwise it scrolls to center `index' in the window.
@end deffn

@geindex bbox() (tkinter.Text method)
@anchor{library/tkinter tkinter Text bbox}@anchor{4585}
@deffn {Method} bbox (index)

Return a tuple @code{(x, y, width, height)} giving the bounding box, in
pixels, of the visible part of the character at `index', or @code{None} if
that character is not visible on the screen.
@end deffn

@geindex dlineinfo() (tkinter.Text method)
@anchor{library/tkinter tkinter Text dlineinfo}@anchor{4586}
@deffn {Method} dlineinfo (index)

Return a tuple @code{(x, y, width, height, baseline)} describing the display
line that contains `index': the first four values give the bounding box
of the line in pixels and `baseline' gives the offset of the baseline
measured down from the top of the area.
Return @code{None} if that display line is not visible on the screen.
@end deffn

@geindex mark_set() (tkinter.Text method)
@anchor{library/tkinter tkinter Text mark_set}@anchor{4587}
@deffn {Method} mark_set (markName, index)

Set the mark named `markName' to the position just before the character
at `index', creating the mark if it does not already exist.
A mark created this way has right gravity by default.
@end deffn

@geindex mark_unset() (tkinter.Text method)
@anchor{library/tkinter tkinter Text mark_unset}@anchor{4588}
@deffn {Method} mark_unset (*markNames)

Remove each of the marks named in `markNames'.
The special @code{insert} and @code{current} marks may not be removed.
@end deffn

@geindex mark_names() (tkinter.Text method)
@anchor{library/tkinter tkinter Text mark_names}@anchor{4589}
@deffn {Method} mark_names ()

Return a tuple of the names of all marks currently set in the widget.
@end deffn

@geindex mark_gravity() (tkinter.Text method)
@anchor{library/tkinter tkinter Text mark_gravity}@anchor{458a}
@deffn {Method} mark_gravity (markName, direction=None)

If `direction' is omitted, return the gravity of mark `markName', either
@code{'left'} or @code{'right'}.
Otherwise set its gravity to `direction'.
The gravity determines on which side of the mark text inserted at the
mark’s position appears: a mark with right gravity (the default) stays to
the right of such text.
@end deffn

@geindex mark_next() (tkinter.Text method)
@anchor{library/tkinter tkinter Text mark_next}@anchor{458b}
@deffn {Method} mark_next (index)

Return the name of the first mark at or after `index', or @code{None} if
there is none.
When `index' is the name of a mark, the search starts just after that
mark.
@end deffn

@geindex mark_previous() (tkinter.Text method)
@anchor{library/tkinter tkinter Text mark_previous}@anchor{458c}
@deffn {Method} mark_previous (index)

Return the name of the last mark at or before `index', or @code{None} if
there is none.
When `index' is the name of a mark, the search starts just before that
mark.
@end deffn

@geindex tag_add() (tkinter.Text method)
@anchor{library/tkinter tkinter Text tag_add}@anchor{458d}
@deffn {Method} tag_add (tagName, index1, *args)

Add the tag `tagName' to the range of characters from `index1' up to but
not including the next index in `args'.
Further pairs of indices may follow in `args' to tag additional ranges; a
trailing single index tags just the character at that index.
@end deffn

@geindex tag_remove() (tkinter.Text method)
@anchor{library/tkinter tkinter Text tag_remove}@anchor{458e}
@deffn {Method} tag_remove (tagName, index1, index2=None)

Remove the tag `tagName' from the characters from `index1' up to but not
including `index2' (or from the single character at `index1' if `index2'
is omitted).
The tag itself continues to exist even if no characters carry it.
@end deffn

@geindex tag_delete() (tkinter.Text method)
@anchor{library/tkinter tkinter Text tag_delete}@anchor{458f}
@deffn {Method} tag_delete (*tagNames)

Delete each of the tags named in `tagNames', removing them from all
characters and discarding their options and bindings.
@end deffn

@geindex tag_config() (tkinter.Text method)

@geindex tag_configure() (tkinter.Text method)
@anchor{library/tkinter tkinter Text tag_config}@anchor{4590}@anchor{library/tkinter tkinter Text tag_configure}@anchor{4591}
@deffn {Method} tag_configure (tagName, cnf=None, **kw)

Query or modify the configuration options of the tag `tagName'.
This mirrors @ref{4383,,configure()}, except that it applies to a tag
rather than to the widget as a whole: with no options it returns a
dictionary describing the current options, otherwise it sets the given
options.
Defining a tag this way also gives it a priority higher than any existing
tag.

The supported tag options, all controlling the appearance of the tagged
text, are:


@table @asis

@item `font'

The font to use for the text.

@item `foreground'

The color to use for the text.

@item `background'

The color to use for the area behind the text.

@item `fgstipple', `bgstipple'

Bitmaps used to stipple the foreground (text) and the background;
only well supported on X11.

@item `borderwidth'

The width of the border drawn around the text according to `relief'
(default @code{0}).

@item `relief'

The 3-D appearance of the text’s border: @code{'flat'} (the default),
@code{'raised'}, @code{'sunken'}, @code{'ridge'}, @code{'groove'} or @code{'solid'}.

@item `offset'

How far the text is raised above (or, if negative, lowered below) the
baseline, for superscripts and subscripts.

@item `underline'

Whether to underline the text.

@item `underlinefg'

The color of the underline; it defaults to the text color.

@item `overstrike'

Whether to draw a line through the middle of the text.

@item `overstrikefg'

The color of the overstrike line; it defaults to the text color.

@item `elide'

Whether the text is elided (hidden).

@item `justify'

How to justify the first character of a display line: @code{'left'} (the
default), @code{'right'} or @code{'center'}.

@item `wrap'

How to wrap lines that are too long: @code{'char'}, @code{'word'} or
@code{'none'}.

@item `lmargin1', `lmargin2'

The indentation, in pixels, of the first display line of a logical
line and of the remaining display lines.

@item `lmargincolor'

The color of the left margin area.

@item `rmargin'

The right-hand margin, in pixels.

@item `rmargincolor'

The color of the right margin area.

@item `spacing1', `spacing2', `spacing3'

Extra space, in pixels, above the first display line of a logical
line, between its display lines, and below its last display line.

@item `tabs'

The set of tab stops, in the same form as the widget’s `tabs' option.

@item `tabstyle'

How tab stops are interpreted: @code{'tabular'} or @code{'wordprocessor'}.

@item `selectbackground', `selectforeground'

The background and foreground colors used for the text while it is
selected.
@end table

@cartouche
@quotation Note 
Tk 8.6 added the `lmargincolor', `overstrikefg', `rmargincolor',
`selectbackground', `selectforeground' and `underlinefg' options.
@end quotation
@end cartouche

@ref{4590,,tag_config()} is an alias of @code{tag_configure()}.
@end deffn

@geindex tag_cget() (tkinter.Text method)
@anchor{library/tkinter tkinter Text tag_cget}@anchor{4592}
@deffn {Method} tag_cget (tagName, option)

Return the current value of the configuration option `option' for the tag
`tagName'.
@end deffn

@geindex tag_names() (tkinter.Text method)
@anchor{library/tkinter tkinter Text tag_names}@anchor{4593}
@deffn {Method} tag_names (index=None)

If `index' is omitted, return a tuple of the names of all tags defined in
the widget; otherwise return only the names of the tags applied to the
character at `index'.
The names are ordered from lowest to highest priority.
@end deffn

@geindex tag_ranges() (tkinter.Text method)
@anchor{library/tkinter tkinter Text tag_ranges}@anchor{4594}
@deffn {Method} tag_ranges (tagName)

Return a tuple of indices describing all ranges of text tagged with
`tagName'.
The result alternates start and end indices, so that elements @code{2*i} and
@code{2*i+1} bound the `i'-th range.
@end deffn

@geindex tag_nextrange() (tkinter.Text method)
@anchor{library/tkinter tkinter Text tag_nextrange}@anchor{4595}
@deffn {Method} tag_nextrange (tagName, index1, index2=None)

Search forward from `index1' (up to `index2' if given) for the first
range of characters tagged with `tagName', and return a two-element tuple
of its start and end indices, or an empty tuple if there is no such
range.
@end deffn

@geindex tag_prevrange() (tkinter.Text method)
@anchor{library/tkinter tkinter Text tag_prevrange}@anchor{4596}
@deffn {Method} tag_prevrange (tagName, index1, index2=None)

Search backward from `index1' (down to `index2' if given) for the nearest
preceding range of characters tagged with `tagName', and return a
two-element tuple of its start and end indices, or an empty tuple if
there is no such range.
@end deffn

@geindex tag_raise() (tkinter.Text method)
@anchor{library/tkinter tkinter Text tag_raise}@anchor{4597}
@deffn {Method} tag_raise (tagName, aboveThis=None)

Raise the priority of tag `tagName' so that it is just above the priority
of `aboveThis', or to the highest priority of all tags if `aboveThis' is
omitted.
When the display options of overlapping tags conflict, the
higher-priority tag wins.
@end deffn

@geindex tag_lower() (tkinter.Text method)
@anchor{library/tkinter tkinter Text tag_lower}@anchor{4598}
@deffn {Method} tag_lower (tagName, belowThis=None)

Lower the priority of tag `tagName' so that it is just below the priority
of `belowThis', or to the lowest priority of all tags if `belowThis' is
omitted.
@end deffn

@geindex tag_bind() (tkinter.Text method)
@anchor{library/tkinter tkinter Text tag_bind}@anchor{4599}
@deffn {Method} tag_bind (tagName, sequence, func, add=None)

Bind the event `sequence' on characters tagged with `tagName' to the
callback `func', so that `func' is invoked when that event occurs over
such a character.
If `add' is true the binding is added alongside any existing bindings for
`sequence', otherwise it replaces them.
Works like @ref{43d2,,bind()} and returns the identifier of the new
binding.
@end deffn

@geindex tag_unbind() (tkinter.Text method)
@anchor{library/tkinter tkinter Text tag_unbind}@anchor{459a}
@deffn {Method} tag_unbind (tagName, sequence, funcid=None)

Remove the bindings of the event `sequence' on characters tagged with
`tagName'.
If `funcid' is given, only that binding (as returned by @ref{4599,,tag_bind()})
is removed and its callback is unregistered.


Changed in version 3.13: If `funcid' is given, only that callback is unbound.

@end deffn

@geindex image_create() (tkinter.Text method)
@anchor{library/tkinter tkinter Text image_create}@anchor{459b}
@deffn {Method} image_create (index, cnf=@{@}, **kw)

Embed an image at `index' and return the name assigned to this image
instance, which may then be used as an index or passed to the other
@code{image_*} methods.
The options, given in `cnf' and `kw', include `image' (the Tk image to
display), `name' (a base name for the instance), `align', `padx' and
`pady'.
@end deffn

@geindex image_cget() (tkinter.Text method)
@anchor{library/tkinter tkinter Text image_cget}@anchor{459c}
@deffn {Method} image_cget (index, option)

Return the current value of the configuration option `option' for the
embedded image at `index'.
@end deffn

@geindex image_configure() (tkinter.Text method)
@anchor{library/tkinter tkinter Text image_configure}@anchor{459d}
@deffn {Method} image_configure (index, cnf=None, **kw)

Query or modify the configuration options of the embedded image at
`index', like @ref{4383,,configure()} but applied to that image.
@end deffn

@geindex image_names() (tkinter.Text method)
@anchor{library/tkinter tkinter Text image_names}@anchor{459e}
@deffn {Method} image_names ()

Return a tuple of the names of all images embedded in the widget.
@end deffn

@geindex window_create() (tkinter.Text method)
@anchor{library/tkinter tkinter Text window_create}@anchor{459f}
@deffn {Method} window_create (index, cnf=@{@}, **kw)

Embed a window (any widget) at `index'.
The options, given in `cnf' and `kw', include `window' (the widget to
embed), `create' (a callback that creates the widget on demand), `align',
`stretch', `padx' and `pady'.
The embedded widget must be a descendant of the text widget’s parent.
@end deffn

@geindex window_cget() (tkinter.Text method)
@anchor{library/tkinter tkinter Text window_cget}@anchor{45a0}
@deffn {Method} window_cget (index, option)

Return the current value of the configuration option `option' for the
embedded window at `index'.
@end deffn

@geindex window_config() (tkinter.Text method)

@geindex window_configure() (tkinter.Text method)
@anchor{library/tkinter tkinter Text window_config}@anchor{45a1}@anchor{library/tkinter tkinter Text window_configure}@anchor{45a2}
@deffn {Method} window_configure (index, cnf=None, **kw)

Query or modify the configuration options of the embedded window at
`index', like @ref{4383,,configure()} but applied to that window.

@ref{45a1,,window_config()} is an alias of @code{window_configure()}.
@end deffn

@geindex window_names() (tkinter.Text method)
@anchor{library/tkinter tkinter Text window_names}@anchor{45a3}
@deffn {Method} window_names ()

Return a tuple of the names of all windows embedded in the widget.
@end deffn

@geindex edit() (tkinter.Text method)
@anchor{library/tkinter tkinter Text edit}@anchor{45a4}
@deffn {Method} edit (*args)

Low-level wrapper around the Tk @code{edit} widget command that controls the
undo/redo mechanism and the modified flag; `args' is the @code{edit}
subcommand and its arguments.
The @code{edit_*()} methods below are thin wrappers around it and are
usually more convenient.
@end deffn

@geindex edit_modified() (tkinter.Text method)
@anchor{library/tkinter tkinter Text edit_modified}@anchor{45a5}
@deffn {Method} edit_modified (arg=None)

If `arg' is omitted, return the current state of the modified flag as
@code{0} or @code{1}; the flag is set automatically whenever the text is
inserted or deleted.
Otherwise set the flag to the boolean `arg'.
@end deffn

@geindex edit_undo() (tkinter.Text method)
@anchor{library/tkinter tkinter Text edit_undo}@anchor{45a6}
@deffn {Method} edit_undo ()

Undo the most recent edit action, that is, all the inserts and deletes
recorded on the undo stack since the previous separator, and move it to
the redo stack.
Raises @ref{43ad,,TclError} if the undo stack is empty.
Has no effect unless the `undo' option is true.
Since Tk 9.0, returns a tuple of indices delimiting the ranges of text
that were changed.
@end deffn

@geindex edit_redo() (tkinter.Text method)
@anchor{library/tkinter tkinter Text edit_redo}@anchor{45a7}
@deffn {Method} edit_redo ()

Reapply the most recently undone edit action, provided no further edits
have been made since, and move it back to the undo stack.
Raises @ref{43ad,,TclError} if the redo stack is empty.
Has no effect unless the `undo' option is true.
Since Tk 9.0, returns a tuple of indices delimiting the ranges of text
that were changed.
@end deffn

@geindex edit_reset() (tkinter.Text method)
@anchor{library/tkinter tkinter Text edit_reset}@anchor{45a8}
@deffn {Method} edit_reset ()

Clear the undo and redo stacks.
@end deffn

@geindex edit_separator() (tkinter.Text method)
@anchor{library/tkinter tkinter Text edit_separator}@anchor{45a9}
@deffn {Method} edit_separator ()

Push a separator onto the undo stack, marking a boundary between edit
actions for undo and redo.
Has no effect unless the `undo' option is true.
Separators are inserted automatically when the `autoseparators' option is
true.
@end deffn

@geindex search() (tkinter.Text method)
@anchor{library/tkinter tkinter Text search}@anchor{45aa}
@deffn {Method} search (pattern, index, stopindex=None, forwards=None, backwards=None, exact=None, regexp=None, nocase=None, count=None, elide=None)

Search for `pattern' starting at `index' and return the index of the
first character of the first match, or an empty string if there is no
match.
Searching stops at `stopindex' if given; otherwise it wraps around the
ends of the text until the starting position is reached again.
The following boolean keyword flags control the search: `forwards' or
`backwards' select the direction (forward is the default); `exact' (the
default) or `regexp' select literal or regular-expression matching;
`nocase' makes the match case-insensitive; and `elide' causes hidden text
to be searched as well.
If `count' is a @ref{1d0f,,Variable}, the number of index positions in the
match is stored in it.
@end deffn

@geindex scan_mark() (tkinter.Text method)
@anchor{library/tkinter tkinter Text scan_mark}@anchor{45ab}
@deffn {Method} scan_mark (x, y)

Record `x', `y' and the current view, for use with later
@ref{45ac,,scan_dragto()} calls.
This is typically bound to a mouse button press in the widget.
@end deffn

@geindex scan_dragto() (tkinter.Text method)
@anchor{library/tkinter tkinter Text scan_dragto}@anchor{45ac}
@deffn {Method} scan_dragto (x, y)

Scroll the widget by 10 times the difference between `x', `y' and the
coordinates passed to the last @ref{45ab,,scan_mark()} call.
This is typically bound to mouse motion events, producing the effect of
dragging the text at high speed through the window.
@end deffn

@geindex debug() (tkinter.Text method)
@anchor{library/tkinter tkinter Text debug}@anchor{45ad}
@deffn {Method} debug (boolean=None)

If `boolean' is omitted, return whether internal consistency checks of
the B-tree data structure are enabled.
Otherwise enable or disable them.
The setting is shared by all text widgets and may noticeably slow down
widgets holding large amounts of text.
@end deffn

@geindex dump() (tkinter.Text method)
@anchor{library/tkinter tkinter Text dump}@anchor{45ae}
@deffn {Method} dump (index1, index2=None, command=None, **kw)

Return the contents of the widget from `index1' up to but not including
`index2' (or just the segment at `index1' if `index2' is omitted),
including text and information about marks, tags, images and windows.
The result is a list of @code{(key, value, index)} triples, where `key' is
one of @code{'text'}, @code{'mark'}, @code{'tagon'}, @code{'tagoff'}, @code{'image'} or
@code{'window'}.
By default all kinds are reported; passing any of the keyword arguments
`all', `text', `mark', `tag', `image' or `window' as true restricts the
dump to the selected kinds.
If `command' is given, it is called once per triple with the three values
as arguments and nothing is returned.
@end deffn

@geindex peer_create() (tkinter.Text method)
@anchor{library/tkinter tkinter Text peer_create}@anchor{45af}
@deffn {Method} peer_create (newPathName, cnf=@{@}, **kw)

Create a peer text widget with the path name `newPathName' that shares
this widget’s underlying data (text, marks, tags, images and the undo
stack).
Changes made through any peer are reflected in all of them.
By default the peer covers the same lines as this widget; standard text
options, including `startline' and `endline', may be given to override
this.


Added in version 3.3.

@end deffn

@geindex peer_names() (tkinter.Text method)
@anchor{library/tkinter tkinter Text peer_names}@anchor{45b0}
@deffn {Method} peer_names ()

Return a tuple of the path names of this widget’s peers, not including
the widget itself.


Added in version 3.3.

@end deffn

@geindex yview_pickplace() (tkinter.Text method)
@anchor{library/tkinter tkinter Text yview_pickplace}@anchor{45b1}
@deffn {Method} yview_pickplace (*what)

Adjust the view so that the location given by `what' is visible.
This is an obsolete equivalent of @ref{4584,,see()}, which should be used
instead.
@end deffn
@end deffn

@node Variable classes,Image classes,Widget classes,Reference<8>
@anchor{library/tkinter variable-classes}@anchor{45b2}
@subsubsection Variable classes


@geindex Variable (class in tkinter)
@anchor{library/tkinter tkinter Variable}@anchor{1d0f}
@deffn {Class} tkinter.Variable (master=None, value=None, name=None)

The base class for the Tk variable wrappers.
A Tk variable is a value stored in the Tcl interpreter that can be linked to
widgets through their `variable' or `textvariable' options (see
@ref{4394,,Coupling widget variables}), so that changes propagate both ways:
updating the variable updates every widget bound to it, and a user editing
such a widget updates the variable.

`master' is the widget whose Tcl interpreter owns the variable; if omitted,
the default root window is used.
`value' is the initial value; if omitted, a type-specific default is used.
`name' is the name of the variable in the Tcl interpreter; if omitted, a
unique name of the form @code{'PY_VARnum'} is generated.
If `name' matches an existing variable and `value' is omitted, the existing
value is retained.

In most cases you should use one of the typed subclasses below –
@ref{4396,,StringVar}, @ref{4397,,IntVar}, @ref{4398,,DoubleVar} or
@ref{4399,,BooleanVar} – rather than @code{Variable} directly.


Changed in version 3.10: Two variables now compare equal (@code{==}) only when they have the same
name, are of the same class, and belong to the same Tcl interpreter.


@geindex get() (tkinter.Variable method)
@anchor{library/tkinter tkinter Variable get}@anchor{439a}
@deffn {Method} get ()

Return the current value of the variable.
For the base class the value is returned as a string; the typed
subclasses convert it to the appropriate Python type.
@end deffn

@geindex initialize() (tkinter.Variable method)

@geindex set() (tkinter.Variable method)
@anchor{library/tkinter tkinter Variable initialize}@anchor{45b3}@anchor{library/tkinter tkinter Variable set}@anchor{45b4}
@deffn {Method} set (value)

Set the variable to `value'.


Added in version 3.3: The `initialize' spelling.

@end deffn

@geindex trace_add() (tkinter.Variable method)
@anchor{library/tkinter tkinter Variable trace_add}@anchor{45b5}
@deffn {Method} trace_add (mode, callback)

Register `callback' to be called when the variable is accessed according
to `mode'.
`mode' is one of the strings @code{'array'}, @code{'read'}, @code{'write'} or
@code{'unset'}, or a list or tuple of such strings.

When triggered, `callback' is called with three arguments: the name of
the Tcl variable, an index (or an empty string if the variable is not an
element of an array), and the `mode' that triggered the call.

Return the internal name of the registered callback, which can be passed
to @ref{45b6,,trace_remove()}.


Added in version 3.6.

@end deffn

@geindex trace_remove() (tkinter.Variable method)
@anchor{library/tkinter tkinter Variable trace_remove}@anchor{45b6}
@deffn {Method} trace_remove (mode, cbname)

Remove a trace callback from the variable.
`mode' must match the `mode' that was passed to @ref{45b5,,trace_add()}, and
`cbname' is the callback name returned by @code{trace_add()}.


Added in version 3.6.

@end deffn

@geindex trace_info() (tkinter.Variable method)
@anchor{library/tkinter tkinter Variable trace_info}@anchor{45b7}
@deffn {Method} trace_info ()

Return a list of @code{(modes, cbname)} pairs describing all traces
currently set on the variable, where `modes' is a tuple of mode strings
and `cbname' is the internal callback name.


Added in version 3.6.

@end deffn

@geindex trace() (tkinter.Variable method)

@geindex trace_variable() (tkinter.Variable method)
@anchor{library/tkinter tkinter Variable trace}@anchor{45b8}@anchor{library/tkinter tkinter Variable trace_variable}@anchor{45b9}
@deffn {Method} trace_variable (mode, callback)

Register `callback' to be called when the variable is accessed according
to `mode'.
`mode' is one of the strings @code{'r'}, @code{'w'} or @code{'u'}, for read, write
or unset.
Return the internal name of the registered callback.


Deprecated since version 3.6: Use @ref{45b5,,trace_add()} instead.  This method wraps a Tcl feature that
was removed in Tcl 9.0.

@end deffn

@geindex trace_vdelete() (tkinter.Variable method)
@anchor{library/tkinter tkinter Variable trace_vdelete}@anchor{45ba}
@deffn {Method} trace_vdelete (mode, cbname)

Remove the trace callback named `cbname' registered for `mode' with
@ref{45b9,,trace_variable()}.


Deprecated since version 3.6: Use @ref{45b6,,trace_remove()} instead.  This method wraps a Tcl feature
that was removed in Tcl 9.0.

@end deffn

@geindex trace_vinfo() (tkinter.Variable method)
@anchor{library/tkinter tkinter Variable trace_vinfo}@anchor{45bb}
@deffn {Method} trace_vinfo ()

Return a list of @code{(mode, cbname)} pairs for all traces set on the
variable with @ref{45b9,,trace_variable()}.


Deprecated since version 3.6: Use @ref{45b7,,trace_info()} instead.  This method wraps a Tcl feature that
was removed in Tcl 9.0.

@end deffn
@end deffn

@geindex StringVar (class in tkinter)
@anchor{library/tkinter tkinter StringVar}@anchor{4396}
@deffn {Class} tkinter.StringVar (master=None, value=None, name=None)

A @ref{1d0f,,Variable} subclass that holds a string.
The default value is @code{'@w{'}}.

@geindex get() (tkinter.StringVar method)
@anchor{library/tkinter tkinter StringVar get}@anchor{45bc}
@deffn {Method} get ()

Return the value of the variable as a @ref{16a,,str}.
@end deffn
@end deffn

@geindex IntVar (class in tkinter)
@anchor{library/tkinter tkinter IntVar}@anchor{4397}
@deffn {Class} tkinter.IntVar (master=None, value=None, name=None)

A @ref{1d0f,,Variable} subclass that holds an integer.
The default value is @code{0}.

@geindex get() (tkinter.IntVar method)
@anchor{library/tkinter tkinter IntVar get}@anchor{45bd}
@deffn {Method} get ()

Return the value of the variable as an @ref{19c,,int}.
@end deffn
@end deffn

@geindex DoubleVar (class in tkinter)
@anchor{library/tkinter tkinter DoubleVar}@anchor{4398}
@deffn {Class} tkinter.DoubleVar (master=None, value=None, name=None)

A @ref{1d0f,,Variable} subclass that holds a float.
The default value is @code{0.0}.

@geindex get() (tkinter.DoubleVar method)
@anchor{library/tkinter tkinter DoubleVar get}@anchor{45be}
@deffn {Method} get ()

Return the value of the variable as a @ref{197,,float}.
@end deffn
@end deffn

@geindex BooleanVar (class in tkinter)
@anchor{library/tkinter tkinter BooleanVar}@anchor{4399}
@deffn {Class} tkinter.BooleanVar (master=None, value=None, name=None)

A @ref{1d0f,,Variable} subclass that holds a boolean.
The default value is @code{False}.

@geindex get() (tkinter.BooleanVar method)
@anchor{library/tkinter tkinter BooleanVar get}@anchor{45bf}
@deffn {Method} get ()

Return the value of the variable as a @ref{3c1,,bool}.
Raise a @ref{2ee,,ValueError} if the value cannot be interpreted as a
boolean.
@end deffn

@geindex initialize() (tkinter.BooleanVar method)

@geindex set() (tkinter.BooleanVar method)
@anchor{library/tkinter tkinter BooleanVar initialize}@anchor{45c0}@anchor{library/tkinter tkinter BooleanVar set}@anchor{45c1}
@deffn {Method} set (value)

Set the variable to `value', converting it to a boolean.


Added in version 3.3: The `initialize' spelling.

@end deffn
@end deffn

@node Image classes,Other classes,Variable classes,Reference<8>
@anchor{library/tkinter image-classes}@anchor{45c2}
@subsubsection Image classes


@geindex Image (class in tkinter)
@anchor{library/tkinter tkinter Image}@anchor{43a3}
@deffn {Class} tkinter.Image (imgtype, name=None, cnf=@{@}, master=None, **kw)

Base class for Tk images.
`imgtype' is the Tk image type, one of @code{'photo'} or @code{'bitmap'}.
An image is a named object that can be displayed by widgets through their
`image' option; deleting all references to the @code{Image} object
deletes the underlying Tk image.
Usually you create a @ref{1e28,,PhotoImage} or @ref{43a4,,BitmapImage} rather than
an @code{Image} directly.

The image’s configuration options are given by `cnf' and `kw' and may be
queried and changed later with the mapping protocol (using @code{image[key]})
or with the @ref{45c3,,configure()} method.

@geindex config() (tkinter.Image method)

@geindex configure() (tkinter.Image method)
@anchor{library/tkinter tkinter Image config}@anchor{45c4}@anchor{library/tkinter tkinter Image configure}@anchor{45c3}
@deffn {Method} configure (**kw)

Modify one or more configuration options of the image.
The valid options depend on the image type; see @ref{1e28,,PhotoImage} and
@ref{43a4,,BitmapImage}.
@ref{45c4,,config()} is an alias of @code{configure()}.
@end deffn

@geindex height() (tkinter.Image method)
@anchor{library/tkinter tkinter Image height}@anchor{45c5}
@deffn {Method} height ()

Return the height of the image, in pixels.
@end deffn

@geindex width() (tkinter.Image method)
@anchor{library/tkinter tkinter Image width}@anchor{45c6}
@deffn {Method} width ()

Return the width of the image, in pixels.
@end deffn

@geindex type() (tkinter.Image method)
@anchor{library/tkinter tkinter Image type}@anchor{45c7}
@deffn {Method} type ()

Return the type of the image, that is the value of `imgtype' with which
it was created (for example @code{'photo'} or @code{'bitmap'}).
@end deffn
@end deffn

@geindex PhotoImage (class in tkinter)
@anchor{library/tkinter tkinter PhotoImage}@anchor{1e28}
@deffn {Class} tkinter.PhotoImage (name=None, cnf=@{@}, master=None, **kw)

A full-color image (the Tk @code{photo} image type), stored internally with a
varying degree of transparency per pixel.
It can read and write GIF, PPM/PGM and (in Tk 8.6 and later) PNG files, read
SVG files (in Tk 9.0 and later), and be drawn in widgets.
Inherits from @ref{43a3,,Image}.

The configuration options include `data' (the image contents as a string),
`file' (the name of a file to read the contents from), `format' (the name of
the file format handler), `width' and `height' (the size of the image, used
when building it up piece by piece), `gamma' and `palette'.

@geindex blank() (tkinter.PhotoImage method)
@anchor{library/tkinter tkinter PhotoImage blank}@anchor{45c8}
@deffn {Method} blank ()

Blank the image; that is, set the entire image to have no data, so that
it is displayed as transparent and the background of whatever window it
is displayed in shows through.
@end deffn

@geindex cget() (tkinter.PhotoImage method)
@anchor{library/tkinter tkinter PhotoImage cget}@anchor{45c9}
@deffn {Method} cget (option)

Return the current value of the configuration option `option'.
@end deffn

@geindex copy() (tkinter.PhotoImage method)
@anchor{library/tkinter tkinter PhotoImage copy}@anchor{45ca}
@deffn {Method} copy (*, from_coords=None, zoom=None, subsample=None)

Return a new @code{PhotoImage} with a copy of this image.

`from_coords' specifies a rectangular sub-region of the source image to
be copied.
It must be a tuple or a list of 1 to 4 integers @code{(x1, y1, x2, y2)}.
@code{(x1, y1)} and @code{(x2, y2)} specify diagonally opposite corners of the
rectangle.
If `x2' and `y2' are not specified, they default to the bottom-right
corner of the source image.
The pixels copied include the left and top edges of the rectangle but not
the bottom or right edges.
If `from_coords' is not given, the whole source image is copied.

If `zoom' or `subsample' are specified, the image is transformed as in
the @ref{45cb,,zoom()} or @ref{45cc,,subsample()} methods.
The value must be a single integer or a pair of integers.


Changed in version 3.13: Added the `from_coords', `zoom' and `subsample' parameters.

@end deffn

@geindex copy_replace() (tkinter.PhotoImage method)
@anchor{library/tkinter tkinter PhotoImage copy_replace}@anchor{45cd}
@deffn {Method} copy_replace (sourceImage, *, from_coords=None, to=None, shrink=False, zoom=None, subsample=None, compositingrule=None)

Copy a region from `sourceImage' (which must be a @code{PhotoImage})
into this image, possibly with pixel zooming and/or subsampling.
If no options are specified, the whole of `sourceImage' is copied into
this image, starting at coordinates @code{(0, 0)}.

`from_coords' specifies a rectangular sub-region of the source image to
be copied, as in the @ref{29,,copy()} method.

`to' specifies a rectangular sub-region of the destination image to be
affected.
It must be a tuple or a list of 1 to 4 integers @code{(x1, y1, x2, y2)}.
If `x2' and `y2' are not specified, they default to @code{(x1, y1)} plus the
size of the source region (after subsampling and zooming, if specified).
If `x2' and `y2' are specified, the source region is replicated if
necessary to fill the destination region in a tiled fashion.

If `shrink' is true, the size of the destination image is reduced, if
necessary, so that the region being copied into is at the bottom-right
corner of the image.

If `zoom' or `subsample' are specified, the image is transformed as in
the @ref{45cb,,zoom()} or @ref{45cc,,subsample()} methods.
The value must be a single integer or a pair of integers.

`compositingrule' specifies how transparent pixels in the source image
are combined with the destination image.
With @code{'overlay'} (the default), the old contents of the destination
image remain visible, as if the source image were printed on a piece of
transparent film and placed over the top of the destination.
With @code{'set'}, the old contents of the destination image are discarded
and the source image is used as-is.


Added in version 3.13.

@end deffn

@geindex data() (tkinter.PhotoImage method)
@anchor{library/tkinter tkinter PhotoImage data}@anchor{45ce}
@deffn {Method} data (format=None, *, from_coords=None, background=None, grayscale=False)

Return the image data.

`format' specifies the name of the image file format handler to use.
If it is not given, the data is returned as a tuple (one element per row)
of strings containing space-separated (one element per pixel/column)
colors in @code{#RRGGBB} format.

`from_coords' specifies a rectangular region of the image to be returned.
It must be a tuple or a list of 1 to 4 integers @code{(x1, y1, x2, y2)}.
If only `x1' and `y1' are specified, the region extends from @code{(x1, y1)}
to the bottom-right corner of the image.
If all four coordinates are given, they specify diagonally opposite
corners of the region, including @code{(x1, y1)} and excluding @code{(x2, y2)}.
If `from_coords' is not given, the whole image is returned.

If `background' is specified, the data does not contain any transparency
information; in all transparent pixels the color is replaced by the
specified color.

If `grayscale' is true, the data does not contain color information; all
pixel data is transformed into grayscale.


Added in version 3.13.

@end deffn

@geindex get() (tkinter.PhotoImage method)
@anchor{library/tkinter tkinter PhotoImage get}@anchor{45cf}
@deffn {Method} get (x, y)

Return the color of the pixel at coordinates (`x', `y') as an
@code{(r, g, b)} tuple of three integers between 0 and 255, representing the
red, green and blue components respectively.
@end deffn

@geindex put() (tkinter.PhotoImage method)
@anchor{library/tkinter tkinter PhotoImage put}@anchor{45d0}
@deffn {Method} put (data, to=None)

Set pixels of the image to the colors given in `data', which must be a
string or a nested sequence of horizontal rows of pixel colors (for
example @code{"@{red green@} @{blue yellow@}"}).

`to' specifies the coordinates of the region of the image into which the
data are copied.
It must be a tuple or a list of 2 or 4 integers @code{(x1, y1)} or
@code{(x1, y1, x2, y2)} giving the top-left corner, and optionally the
bottom-right corner, of the region.
The default position is @code{(0, 0)}.
@end deffn

@geindex read() (tkinter.PhotoImage method)
@anchor{library/tkinter tkinter PhotoImage read}@anchor{45d1}
@deffn {Method} read (filename, format=None, *, from_coords=None, to=None, shrink=False)

Read image data from the file named `filename' into the image.

`format' specifies the format of the image data in the file.

`from_coords' specifies a rectangular sub-region of the image file data
to be copied to the destination image.
It must be a tuple or a list of 1 to 4 integers @code{(x1, y1, x2, y2)}.
If only `x1' and `y1' are specified, the region extends from @code{(x1, y1)}
to the bottom-right corner of the image in the file.
If all four coordinates are given, they specify diagonally opposite
corners of the region.
If `from_coords' is not given, the whole of the image in the file is
read.

`to' specifies the coordinates of the top-left corner of the region of
the image into which the data are read.
The default is @code{(0, 0)}.

If `shrink' is true, the size of the image is reduced, if necessary, so
that the region into which the file data are read is at the bottom-right
corner of the image.


Added in version 3.13.

@end deffn

@geindex subsample() (tkinter.PhotoImage method)
@anchor{library/tkinter tkinter PhotoImage subsample}@anchor{45cc}
@deffn {Method} subsample (x, y='@w{'}, *, from_coords=None)

Return a new @code{PhotoImage} based on this image but using only every
`x'-th pixel in the X direction and every `y'-th pixel in the Y
direction.
If `y' is not given, it defaults to the same value as `x'.

`from_coords' specifies a rectangular sub-region of the source image to
be copied, as in the @ref{29,,copy()} method.


Changed in version 3.13: Added the `from_coords' parameter.

@end deffn

@geindex transparency_get() (tkinter.PhotoImage method)
@anchor{library/tkinter tkinter PhotoImage transparency_get}@anchor{45d2}
@deffn {Method} transparency_get (x, y)

Return @code{True} if the pixel at coordinates (`x', `y') is fully
transparent, @code{False} otherwise.


Added in version 3.8.

@end deffn

@geindex transparency_set() (tkinter.PhotoImage method)
@anchor{library/tkinter tkinter PhotoImage transparency_set}@anchor{45d3}
@deffn {Method} transparency_set (x, y, boolean)

Make the pixel at coordinates (`x', `y') fully transparent if `boolean'
is true, fully opaque otherwise.


Added in version 3.8.

@end deffn

@geindex write() (tkinter.PhotoImage method)
@anchor{library/tkinter tkinter PhotoImage write}@anchor{45d4}
@deffn {Method} write (filename, format=None, from_coords=None, *, background=None, grayscale=False)

Write image data from the image to the file named `filename'.

`format' specifies the name of the image file format handler to use.
If it is not given, the format is guessed from the file extension.

`from_coords' specifies a rectangular region of the image to be written.
It must be a tuple or a list of 1 to 4 integers @code{(x1, y1, x2, y2)}.
If only `x1' and `y1' are specified, the region extends from @code{(x1, y1)}
to the bottom-right corner of the image.
If all four coordinates are given, they specify diagonally opposite
corners of the region.
If `from_coords' is not given, the whole image is written.

If `background' is specified, the data does not contain any transparency
information; in all transparent pixels the color is replaced by the
specified color.

If `grayscale' is true, the data does not contain color information; all
pixel data is transformed into grayscale.


Changed in version 3.13: Added the `background' and `grayscale' parameters.

@end deffn

@geindex zoom() (tkinter.PhotoImage method)
@anchor{library/tkinter tkinter PhotoImage zoom}@anchor{45cb}
@deffn {Method} zoom (x, y='@w{'}, *, from_coords=None)

Return a new @code{PhotoImage} with this image magnified by a factor of
`x' in the X direction and `y' in the Y direction.
If `y' is not given, it defaults to the same value as `x'.

`from_coords' specifies a rectangular sub-region of the source image to
be copied, as in the @ref{29,,copy()} method.


Changed in version 3.13: Added the `from_coords' parameter.

@end deffn
@end deffn

@geindex BitmapImage (class in tkinter)
@anchor{library/tkinter tkinter BitmapImage}@anchor{43a4}
@deffn {Class} tkinter.BitmapImage (name=None, cnf=@{@}, master=None, **kw)

A two-color image (the Tk @code{bitmap} image type) created from an X11 bitmap.
Each pixel displays a foreground color, a background color, or nothing
(producing a transparent effect).
Inherits from @ref{43a3,,Image}.

The configuration options are `data' or `file' (the source bitmap, given as
a string in X11 bitmap format or as the name of a file in that format),
`maskdata' or `maskfile' (the mask bitmap, in the same forms), and
`foreground' and `background' (the two colors).
For pixels where the mask is zero the image displays nothing; for other
pixels it displays the foreground color where the source is one and the
background color where the source is zero.
If `background' is set to an empty string, the background pixels are
transparent.

@code{BitmapImage} has no methods of its own beyond those inherited from
@ref{43a3,,Image}.
@end deffn

@node Other classes,Module-level functions,Image classes,Reference<8>
@anchor{library/tkinter other-classes}@anchor{45d5}
@subsubsection Other classes


@geindex Event (class in tkinter)
@anchor{library/tkinter tkinter Event}@anchor{43d3}
@deffn {Class} tkinter.Event

A container for the attributes of an event passed to a callback bound with
@ref{43d2,,Misc.bind()}.
An @code{Event} instance has the following attributes, each corresponding
to a field of the underlying Tk event; depending on the event type, some
attributes may be set to the string @code{'??'} to indicate that they are not
meaningful.
See @ref{439f,,Bindings and events}.

@geindex serial (tkinter.Event attribute)
@anchor{library/tkinter tkinter Event serial}@anchor{45d6}
@deffn {Attribute} serial

The serial number of the event.
@end deffn

@geindex num (tkinter.Event attribute)
@anchor{library/tkinter tkinter Event num}@anchor{45d7}
@deffn {Attribute} num

The mouse button that was pressed or released (for button events).
@end deffn

@geindex focus (tkinter.Event attribute)
@anchor{library/tkinter tkinter Event focus}@anchor{45d8}
@deffn {Attribute} focus

Whether the window has the focus (for @code{Enter} and @code{Leave} events).
@end deffn

@geindex height (tkinter.Event attribute)
@geindex width (tkinter.Event attribute)
@anchor{library/tkinter tkinter Event height}@anchor{45d9}
@deffn {Attribute} height
@anchor{library/tkinter tkinter Event width}@anchor{45da}
@deffnx {Attribute} width

The new height and width of the window (for @code{Configure} and @code{Expose}
events).
@end deffn

@geindex keycode (tkinter.Event attribute)
@anchor{library/tkinter tkinter Event keycode}@anchor{45db}
@deffn {Attribute} keycode

The keycode of the key that was pressed or released.
@end deffn

@geindex state (tkinter.Event attribute)
@anchor{library/tkinter tkinter Event state}@anchor{45dc}
@deffn {Attribute} state

The state of the event, as a number (for most events) or a string (for
@code{Visibility} events).
@end deffn

@geindex time (tkinter.Event attribute)
@anchor{library/tkinter tkinter Event time}@anchor{45dd}
@deffn {Attribute} time

The timestamp of the event, in milliseconds.
@end deffn

@geindex x (tkinter.Event attribute)
@geindex y (tkinter.Event attribute)
@anchor{library/tkinter tkinter Event x}@anchor{45de}
@deffn {Attribute} x
@anchor{library/tkinter tkinter Event y}@anchor{45df}
@deffnx {Attribute} y

The pointer position relative to the widget, in pixels.
@end deffn

@geindex x_root (tkinter.Event attribute)
@geindex y_root (tkinter.Event attribute)
@anchor{library/tkinter tkinter Event x_root}@anchor{45e0}
@deffn {Attribute} x_root
@anchor{library/tkinter tkinter Event y_root}@anchor{45e1}
@deffnx {Attribute} y_root

The pointer position relative to the top-left corner of the screen, in
pixels.
@end deffn

@geindex char (tkinter.Event attribute)
@anchor{library/tkinter tkinter Event char}@anchor{45e2}
@deffn {Attribute} char

The character typed, as a string (for key events).
@end deffn

@geindex send_event (tkinter.Event attribute)
@anchor{library/tkinter tkinter Event send_event}@anchor{45e3}
@deffn {Attribute} send_event

@code{True} if the event was sent by another application.
@end deffn

@geindex keysym (tkinter.Event attribute)
@anchor{library/tkinter tkinter Event keysym}@anchor{45e4}
@deffn {Attribute} keysym

The symbolic name of the key that was pressed or released.
@end deffn

@geindex keysym_num (tkinter.Event attribute)
@anchor{library/tkinter tkinter Event keysym_num}@anchor{45e5}
@deffn {Attribute} keysym_num

The numeric value of @ref{45e4,,keysym}.
@end deffn

@geindex type (tkinter.Event attribute)
@anchor{library/tkinter tkinter Event type}@anchor{45e6}
@deffn {Attribute} type

The @ref{45e7,,EventType} of the event.
@end deffn

@geindex widget (tkinter.Event attribute)
@anchor{library/tkinter tkinter Event widget}@anchor{45e8}
@deffn {Attribute} widget

The widget on which the event occurred.
@end deffn

@geindex delta (tkinter.Event attribute)
@anchor{library/tkinter tkinter Event delta}@anchor{45e9}
@deffn {Attribute} delta

The amount the mouse wheel was rotated (for @code{MouseWheel} events).
@end deffn
@end deffn

@geindex EventType (class in tkinter)
@anchor{library/tkinter tkinter EventType}@anchor{45e7}
@deffn {Class} tkinter.EventType (*values)

An @ref{82e,,enum.StrEnum} enumerating the Tk event types, used as the value
of @ref{45e6,,Event.type}.
Its members include, among others, @code{KeyPress}, @code{KeyRelease},
@code{ButtonPress}, @code{ButtonRelease}, @code{Motion}, @code{Enter}, @code{Leave},
@code{FocusIn}, @code{FocusOut}, @code{Configure}, @code{Map}, @code{Unmap}, @code{Expose},
@code{Destroy} and @code{MouseWheel}.


Added in version 3.6.

@end deffn

@geindex CallWrapper (class in tkinter)
@anchor{library/tkinter tkinter CallWrapper}@anchor{45ea}
@deffn {Class} tkinter.CallWrapper (func, subst, widget)

Internal helper that wraps a Python callback so that it can be invoked from
Tcl.
`func' is the Python function, `subst' is an optional function that
pre-processes the Tcl arguments, and `widget' is the widget used for error
reporting.
Instances are created automatically by @ref{43b7,,Misc.register()}; this class is
not normally used directly.
@end deffn

@node Module-level functions,Constants<10>,Other classes,Reference<8>
@anchor{library/tkinter module-level-functions}@anchor{45eb}
@subsubsection Module-level functions


@geindex NoDefaultRoot() (in module tkinter)
@anchor{library/tkinter tkinter NoDefaultRoot}@anchor{1d11}
@deffn {Function} tkinter.NoDefaultRoot ()

Inhibit the creation of an implicit default root window.
Afterwards @code{tkinter} no longer creates a shared default root
automatically, and operations that rely on one — such as constructing a
widget without an explicit `master' — raise a @ref{246,,RuntimeError}.
Call this early in larger applications to make the root window explicit.
@end deffn

@geindex mainloop() (in module tkinter)
@anchor{library/tkinter tkinter mainloop}@anchor{437c}
@deffn {Function} tkinter.mainloop (n=0)

Run the Tk main event loop on the default root window until all windows are
destroyed.
Equivalent to calling @ref{438b,,Misc.mainloop()} on the default root.
@end deffn

@geindex getboolean() (in module tkinter)
@anchor{library/tkinter tkinter getboolean}@anchor{45ec}
@deffn {Function} tkinter.getboolean (s)

Convert the Tcl boolean string `s' (one of @code{'1'}, @code{'true'}, @code{'yes'},
@code{'on'} and similar, or their false counterparts) to a Python
@ref{3c1,,bool}.
Raise @ref{43ad,,TclError} for an invalid value.
@end deffn

@geindex getdouble() (in module tkinter)
@anchor{library/tkinter tkinter getdouble}@anchor{45ed}
@deffn {Function} tkinter.getdouble (s)

Convert `s' to a floating-point number.
This is the built-in @ref{197,,float}.
@end deffn

@geindex getint() (in module tkinter)
@anchor{library/tkinter tkinter getint}@anchor{45ee}
@deffn {Function} tkinter.getint (s)

Convert `s' to an integer.
This is the built-in @ref{19c,,int}.
@end deffn

@geindex image_names() (in module tkinter)
@anchor{library/tkinter tkinter image_names}@anchor{45ef}
@deffn {Function} tkinter.image_names ()

Return the names of all existing images in the default root’s interpreter.
@end deffn

@geindex image_types() (in module tkinter)
@anchor{library/tkinter tkinter image_types}@anchor{45f0}
@deffn {Function} tkinter.image_types ()

Return the available image types (such as @code{'photo'} and @code{'bitmap'}) in
the default root’s interpreter.
@end deffn

@node Constants<10>,,Module-level functions,Reference<8>
@anchor{library/tkinter constants}@anchor{45f1}
@subsubsection Constants


The following symbolic constants are available in both the @code{tkinter}
and @code{tkinter.constants} namespaces.

@geindex TRUE (in module tkinter)
@geindex YES (in module tkinter)
@geindex ON (in module tkinter)
@anchor{library/tkinter tkinter TRUE}@anchor{45f2}
@deffn {Data} tkinter.TRUE
@anchor{library/tkinter tkinter YES}@anchor{45f3}
@deffnx {Data} tkinter.YES
@anchor{library/tkinter tkinter ON}@anchor{45f4}
@deffnx {Data} tkinter.ON

Truthy values, all equal to the integer @code{1}.
@end deffn

@geindex FALSE (in module tkinter)
@geindex NO (in module tkinter)
@geindex OFF (in module tkinter)
@anchor{library/tkinter tkinter FALSE}@anchor{45f5}
@deffn {Data} tkinter.FALSE
@anchor{library/tkinter tkinter NO}@anchor{45f6}
@deffnx {Data} tkinter.NO
@anchor{library/tkinter tkinter OFF}@anchor{45f7}
@deffnx {Data} tkinter.OFF

Falsy values, all equal to the integer @code{0}.
@end deffn

@geindex N (in module tkinter)
@geindex S (in module tkinter)
@geindex E (in module tkinter)
@geindex W (in module tkinter)
@geindex NE (in module tkinter)
@geindex NW (in module tkinter)
@geindex SE (in module tkinter)
@geindex SW (in module tkinter)
@geindex NS (in module tkinter)
@geindex EW (in module tkinter)
@geindex NSEW (in module tkinter)
@geindex CENTER (in module tkinter)
@anchor{library/tkinter tkinter N}@anchor{45f8}
@deffn {Data} tkinter.N
@anchor{library/tkinter tkinter S}@anchor{45f9}
@deffnx {Data} tkinter.S
@anchor{library/tkinter tkinter E}@anchor{45fa}
@deffnx {Data} tkinter.E
@anchor{library/tkinter tkinter W}@anchor{45fb}
@deffnx {Data} tkinter.W
@anchor{library/tkinter tkinter NE}@anchor{45fc}
@deffnx {Data} tkinter.NE
@anchor{library/tkinter tkinter NW}@anchor{45fd}
@deffnx {Data} tkinter.NW
@anchor{library/tkinter tkinter SE}@anchor{45fe}
@deffnx {Data} tkinter.SE
@anchor{library/tkinter tkinter SW}@anchor{45ff}
@deffnx {Data} tkinter.SW
@anchor{library/tkinter tkinter NS}@anchor{4600}
@deffnx {Data} tkinter.NS
@anchor{library/tkinter tkinter EW}@anchor{4601}
@deffnx {Data} tkinter.EW
@anchor{library/tkinter tkinter NSEW}@anchor{4602}
@deffnx {Data} tkinter.NSEW
@anchor{library/tkinter tkinter CENTER}@anchor{4603}
@deffnx {Data} tkinter.CENTER

Compass directions (@code{'n'}, @code{'s'}, @code{'e'}, @code{'w'} and the diagonals and
edges) plus @code{CENTER} (@code{'center'}), used as values for the `anchor' and
`sticky' options and by methods such as @ref{43c1,,Misc.grid_anchor()}.
@end deffn

@geindex LEFT (in module tkinter)
@geindex RIGHT (in module tkinter)
@geindex TOP (in module tkinter)
@geindex BOTTOM (in module tkinter)
@anchor{library/tkinter tkinter LEFT}@anchor{4604}
@deffn {Data} tkinter.LEFT
@anchor{library/tkinter tkinter RIGHT}@anchor{4605}
@deffnx {Data} tkinter.RIGHT
@anchor{library/tkinter tkinter TOP}@anchor{4606}
@deffnx {Data} tkinter.TOP
@anchor{library/tkinter tkinter BOTTOM}@anchor{4607}
@deffnx {Data} tkinter.BOTTOM

Sides for the `side' option of the packer (see @ref{4487,,Pack.pack_configure()}).
@end deffn

@geindex X (in module tkinter)
@geindex Y (in module tkinter)
@geindex BOTH (in module tkinter)
@geindex NONE (in module tkinter)
@anchor{library/tkinter tkinter X}@anchor{4608}
@deffn {Data} tkinter.X
@anchor{library/tkinter tkinter Y}@anchor{4609}
@deffnx {Data} tkinter.Y
@anchor{library/tkinter tkinter BOTH}@anchor{460a}
@deffnx {Data} tkinter.BOTH
@anchor{library/tkinter tkinter NONE}@anchor{460b}
@deffnx {Data} tkinter.NONE

Values for the `fill' option of the packer: @code{'x'}, @code{'y'}, @code{'both'} or
@code{'none'}.
@end deffn

@geindex RAISED (in module tkinter)
@geindex SUNKEN (in module tkinter)
@geindex FLAT (in module tkinter)
@geindex RIDGE (in module tkinter)
@geindex GROOVE (in module tkinter)
@geindex SOLID (in module tkinter)
@anchor{library/tkinter tkinter RAISED}@anchor{460c}
@deffn {Data} tkinter.RAISED
@anchor{library/tkinter tkinter SUNKEN}@anchor{460d}
@deffnx {Data} tkinter.SUNKEN
@anchor{library/tkinter tkinter FLAT}@anchor{460e}
@deffnx {Data} tkinter.FLAT
@anchor{library/tkinter tkinter RIDGE}@anchor{460f}
@deffnx {Data} tkinter.RIDGE
@anchor{library/tkinter tkinter GROOVE}@anchor{4610}
@deffnx {Data} tkinter.GROOVE
@anchor{library/tkinter tkinter SOLID}@anchor{4611}
@deffnx {Data} tkinter.SOLID

Values for the `relief' option, which controls a widget’s 3-D border.
@end deffn

@geindex HORIZONTAL (in module tkinter)
@geindex VERTICAL (in module tkinter)
@anchor{library/tkinter tkinter HORIZONTAL}@anchor{4612}
@deffn {Data} tkinter.HORIZONTAL
@anchor{library/tkinter tkinter VERTICAL}@anchor{4613}
@deffnx {Data} tkinter.VERTICAL

Values for the `orient' option of widgets such as @ref{4560,,Scale},
@ref{44b7,,Scrollbar} and @ref{454a,,PanedWindow}.
@end deffn

@geindex CHAR (in module tkinter)
@geindex WORD (in module tkinter)
@anchor{library/tkinter tkinter CHAR}@anchor{4614}
@deffn {Data} tkinter.CHAR
@anchor{library/tkinter tkinter WORD}@anchor{4615}
@deffnx {Data} tkinter.WORD

Values for the `wrap' option of the @ref{1a3d,,Text} widget, selecting line
wrapping on character or word boundaries.
@end deffn

@geindex BASELINE (in module tkinter)
@anchor{library/tkinter tkinter BASELINE}@anchor{4616}
@deffn {Data} tkinter.BASELINE

The text-alignment value @code{'baseline'}.
@end deffn

@geindex INSIDE (in module tkinter)
@geindex OUTSIDE (in module tkinter)
@anchor{library/tkinter tkinter INSIDE}@anchor{4617}
@deffn {Data} tkinter.INSIDE
@anchor{library/tkinter tkinter OUTSIDE}@anchor{4618}
@deffnx {Data} tkinter.OUTSIDE

Values for the `bordermode' option of the placer (see
@ref{4493,,Place.place_configure()}).
@end deffn

@geindex INSERT (in module tkinter)
@geindex CURRENT (in module tkinter)
@geindex END (in module tkinter)
@geindex ANCHOR (in module tkinter)
@geindex SEL (in module tkinter)
@geindex SEL_FIRST (in module tkinter)
@geindex SEL_LAST (in module tkinter)
@anchor{library/tkinter tkinter INSERT}@anchor{4619}
@deffn {Data} tkinter.INSERT
@anchor{library/tkinter tkinter CURRENT}@anchor{461a}
@deffnx {Data} tkinter.CURRENT
@anchor{library/tkinter tkinter END}@anchor{461b}
@deffnx {Data} tkinter.END
@anchor{library/tkinter tkinter ANCHOR}@anchor{461c}
@deffnx {Data} tkinter.ANCHOR
@anchor{library/tkinter tkinter SEL}@anchor{461d}
@deffnx {Data} tkinter.SEL
@anchor{library/tkinter tkinter SEL_FIRST}@anchor{461e}
@deffnx {Data} tkinter.SEL_FIRST
@anchor{library/tkinter tkinter SEL_LAST}@anchor{461f}
@deffnx {Data} tkinter.SEL_LAST

Symbolic indices used by the @ref{1a3d,,Text}, @ref{44b3,,Entry}, @ref{44b4,,Listbox}
and @ref{1a3e,,Canvas} widgets, such as @code{'insert'} (the insertion cursor),
@code{'current'}, @code{'end'}, @code{'anchor'} and the bounds of the selection
(@code{'sel.first'} and @code{'sel.last'}).
@end deffn

@geindex ALL (in module tkinter)
@anchor{library/tkinter tkinter ALL}@anchor{4620}
@deffn {Data} tkinter.ALL

The special tag @code{'all'}, which matches every item of a @ref{1a3e,,Canvas} or
every character of a @ref{1a3d,,Text} (for example @code{canvas.delete(ALL)}).
@end deffn

@geindex NORMAL (in module tkinter)
@geindex DISABLED (in module tkinter)
@geindex ACTIVE (in module tkinter)
@geindex HIDDEN (in module tkinter)
@anchor{library/tkinter tkinter NORMAL}@anchor{4621}
@deffn {Data} tkinter.NORMAL
@anchor{library/tkinter tkinter DISABLED}@anchor{4622}
@deffnx {Data} tkinter.DISABLED
@anchor{library/tkinter tkinter ACTIVE}@anchor{4623}
@deffnx {Data} tkinter.ACTIVE
@anchor{library/tkinter tkinter HIDDEN}@anchor{4624}
@deffnx {Data} tkinter.HIDDEN

Values for the `state' option of various widgets and items.
@end deffn

@geindex CASCADE (in module tkinter)
@geindex CHECKBUTTON (in module tkinter)
@geindex COMMAND (in module tkinter)
@geindex RADIOBUTTON (in module tkinter)
@geindex SEPARATOR (in module tkinter)
@anchor{library/tkinter tkinter CASCADE}@anchor{4625}
@deffn {Data} tkinter.CASCADE
@anchor{library/tkinter tkinter CHECKBUTTON}@anchor{4626}
@deffnx {Data} tkinter.CHECKBUTTON
@anchor{library/tkinter tkinter COMMAND}@anchor{4627}
@deffnx {Data} tkinter.COMMAND
@anchor{library/tkinter tkinter RADIOBUTTON}@anchor{4628}
@deffnx {Data} tkinter.RADIOBUTTON
@anchor{library/tkinter tkinter SEPARATOR}@anchor{4629}
@deffnx {Data} tkinter.SEPARATOR

Menu entry types, used as the `itemType' argument of @ref{452e,,Menu.add()} and
@ref{4534,,Menu.insert()}.
@end deffn

@geindex SINGLE (in module tkinter)
@geindex BROWSE (in module tkinter)
@geindex MULTIPLE (in module tkinter)
@geindex EXTENDED (in module tkinter)
@anchor{library/tkinter tkinter SINGLE}@anchor{462a}
@deffn {Data} tkinter.SINGLE
@anchor{library/tkinter tkinter BROWSE}@anchor{462b}
@deffnx {Data} tkinter.BROWSE
@anchor{library/tkinter tkinter MULTIPLE}@anchor{462c}
@deffnx {Data} tkinter.MULTIPLE
@anchor{library/tkinter tkinter EXTENDED}@anchor{462d}
@deffnx {Data} tkinter.EXTENDED

Values for the `selectmode' option of the @ref{44b4,,Listbox} widget.
@end deffn

@geindex PIESLICE (in module tkinter)
@geindex CHORD (in module tkinter)
@geindex ARC (in module tkinter)
@anchor{library/tkinter tkinter PIESLICE}@anchor{462e}
@deffn {Data} tkinter.PIESLICE
@anchor{library/tkinter tkinter CHORD}@anchor{462f}
@deffnx {Data} tkinter.CHORD
@anchor{library/tkinter tkinter ARC}@anchor{4630}
@deffnx {Data} tkinter.ARC

Values for the `style' option of @ref{1a3e,,Canvas} arc items.
@end deffn

@geindex BUTT (in module tkinter)
@geindex PROJECTING (in module tkinter)
@geindex ROUND (in module tkinter)
@geindex BEVEL (in module tkinter)
@geindex MITER (in module tkinter)
@anchor{library/tkinter tkinter BUTT}@anchor{4631}
@deffn {Data} tkinter.BUTT
@anchor{library/tkinter tkinter PROJECTING}@anchor{4632}
@deffnx {Data} tkinter.PROJECTING
@anchor{library/tkinter tkinter ROUND}@anchor{4633}
@deffnx {Data} tkinter.ROUND
@anchor{library/tkinter tkinter BEVEL}@anchor{4634}
@deffnx {Data} tkinter.BEVEL
@anchor{library/tkinter tkinter MITER}@anchor{4635}
@deffnx {Data} tkinter.MITER

Values for the `capstyle' (@code{'butt'}, @code{'projecting'}, @code{'round'}) and
`joinstyle' (@code{'round'}, @code{'bevel'}, @code{'miter'}) options of
@ref{1a3e,,Canvas} line items.
@end deffn

@geindex FIRST (in module tkinter)
@geindex LAST (in module tkinter)
@anchor{library/tkinter tkinter FIRST}@anchor{4636}
@deffn {Data} tkinter.FIRST
@anchor{library/tkinter tkinter LAST}@anchor{4637}
@deffnx {Data} tkinter.LAST

Values for the `arrow' option of @ref{1a3e,,Canvas} line items, indicating
which ends have arrowheads.
@end deffn

@geindex MOVETO (in module tkinter)
@geindex SCROLL (in module tkinter)
@anchor{library/tkinter tkinter MOVETO}@anchor{4638}
@deffn {Data} tkinter.MOVETO
@anchor{library/tkinter tkinter SCROLL}@anchor{4639}
@deffnx {Data} tkinter.SCROLL

The first argument passed by a @ref{44b7,,Scrollbar} to the @ref{44b6,,XView.xview()}
or @ref{44bb,,YView.yview()} method of the scrolled widget.
@end deffn

@geindex UNITS (in module tkinter)
@geindex PAGES (in module tkinter)
@anchor{library/tkinter tkinter UNITS}@anchor{463a}
@deffn {Data} tkinter.UNITS
@anchor{library/tkinter tkinter PAGES}@anchor{463b}
@deffnx {Data} tkinter.PAGES

Values for the `what' argument of @ref{44b9,,XView.xview_scroll()} and
@ref{44bd,,YView.yview_scroll()}.
@end deffn

@geindex UNDERLINE (in module tkinter)
@geindex NUMERIC (in module tkinter)
@geindex DOTBOX (in module tkinter)
@anchor{library/tkinter tkinter UNDERLINE}@anchor{463c}
@deffn {Data} tkinter.UNDERLINE
@anchor{library/tkinter tkinter NUMERIC}@anchor{463d}
@deffnx {Data} tkinter.NUMERIC
@anchor{library/tkinter tkinter DOTBOX}@anchor{463e}
@deffnx {Data} tkinter.DOTBOX

Other option values: @code{'underline'}, @code{'numeric'} and @code{'dotbox'}.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node tkinter colorchooser — Color choosing dialog,tkinter font — Tkinter font wrapper,tkinter — Python interface to Tcl/Tk,Graphical user interfaces with Tk
@anchor{library/tkinter colorchooser doc}@anchor{463f}@anchor{library/tkinter colorchooser module-tkinter colorchooser}@anchor{f7}@anchor{library/tkinter colorchooser tkinter-colorchooser-color-choosing-dialog}@anchor{4640}@anchor{library/tkinter colorchooser translation-repo}@anchor{4641}
@subsection @code{tkinter.colorchooser} — Color choosing dialog


@geindex module; tkinter.colorchooser

`Source code:' Lib/tkinter/colorchooser.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/tkinter/colorchooser.py}


__________________________________________________________________


The @code{tkinter.colorchooser} module provides the @ref{4642,,Chooser} class
as an interface to the native color picker dialog. @code{Chooser} implements
a modal color choosing dialog window. The @code{Chooser} class inherits from
the @ref{4643,,Dialog} class.

@geindex Chooser (class in tkinter.colorchooser)
@anchor{library/tkinter colorchooser tkinter colorchooser Chooser}@anchor{4642}
@deffn {Class} tkinter.colorchooser.Chooser (master=None, **options)

The class implementing the modal color-choosing dialog.
Most applications use the @ref{4644,,askcolor()} convenience function rather than
instantiating this class directly.
@end deffn

@geindex askcolor() (in module tkinter.colorchooser)
@anchor{library/tkinter colorchooser tkinter colorchooser askcolor}@anchor{4644}
@deffn {Function} tkinter.colorchooser.askcolor (color=None, **options)

Show a modal color-choosing dialog and return the chosen color.
`color' is the color selected when the dialog opens.
The return value is a tuple @code{((r, g, b), hexstr)}, where @code{r}, @code{g} and
@code{b} are the red, green and blue components as integers in the range 0–255
and `hexstr' is the equivalent Tk color string, such as @code{'#ff8000'}.
If the user cancels the dialog, @code{(None, None)} is returned.


Changed in version 3.10: The RGB values in the returned color are now integers in the range 0–255
instead of floats.

@end deffn


@subsubheading See also



@table @asis

@item Module @ref{f8,,tkinter.commondialog}

Tkinter standard dialog module
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node tkinter font — Tkinter font wrapper,Tkinter dialogs,tkinter colorchooser — Color choosing dialog,Graphical user interfaces with Tk
@anchor{library/tkinter font doc}@anchor{4645}@anchor{library/tkinter font module-tkinter font}@anchor{fc}@anchor{library/tkinter font tkinter-font-tkinter-font-wrapper}@anchor{4646}@anchor{library/tkinter font translation-repo}@anchor{4647}
@subsection @code{tkinter.font} — Tkinter font wrapper


@geindex module; tkinter.font

`Source code:' Lib/tkinter/font.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/tkinter/font.py}


__________________________________________________________________


The @code{tkinter.font} module provides the @ref{1d10,,Font} class for creating
and using named fonts.

The different font weights and slants are:

@geindex NORMAL (in module tkinter.font)
@geindex BOLD (in module tkinter.font)
@geindex ITALIC (in module tkinter.font)
@geindex ROMAN (in module tkinter.font)
@anchor{library/tkinter font tkinter font NORMAL}@anchor{4648}
@deffn {Data} tkinter.font.NORMAL
@anchor{library/tkinter font tkinter font BOLD}@anchor{4649}
@deffnx {Data} tkinter.font.BOLD
@anchor{library/tkinter font tkinter font ITALIC}@anchor{464a}
@deffnx {Data} tkinter.font.ITALIC
@anchor{library/tkinter font tkinter font ROMAN}@anchor{464b}
@deffnx {Data} tkinter.font.ROMAN
@end deffn

@geindex Font (class in tkinter.font)
@anchor{library/tkinter font tkinter font Font}@anchor{1d10}
@deffn {Class} tkinter.font.Font (root=None, font=None, name=None, exists=False, **options)

The @code{Font} class represents a named font. `Font' instances are given
unique names and can be specified by their family, size, and style
configuration. Named fonts are Tk’s method of creating and identifying
fonts as a single object, rather than specifying a font by its attributes
with each occurrence.


Changed in version 3.10: Two fonts now compare equal (@code{==}) only when both are @code{Font}
  instances with the same name belonging to the same Tcl interpreter.

arguments:

@quotation


@display
`font' - font specifier tuple (family, size, options)@w{ }
`name' - unique font name@w{ }
`exists' - self points to existing named font if true@w{ }
@end display


@end quotation

additional keyword options (ignored if `font' is specified):

@quotation


@display
`family' - font family, for example, Courier, Times@w{ }
`size' - font size@w{ }
@display
If `size' is positive it is interpreted as size in points.@w{ }
If `size' is a negative number its absolute value is treated@w{ }
as size in pixels.@w{ }
@end display
`weight' - font emphasis (NORMAL, BOLD)@w{ }
`slant' - ROMAN, ITALIC@w{ }
`underline' - font underlining (0 - none, 1 - underline)@w{ }
`overstrike' - font strikeout (0 - none, 1 - strikeout)@w{ }
@end display


@end quotation


@geindex actual() (tkinter.font.Font method)
@anchor{library/tkinter font tkinter font Font actual}@anchor{464c}
@deffn {Method} actual (option=None, displayof=None)

Return the actual attributes of the font, which may differ from the
requested ones because of platform limitations.
With no `option', return a dictionary of all the attributes; if `option'
is given, return the value of that single attribute.
@end deffn

@geindex cget() (tkinter.font.Font method)
@anchor{library/tkinter font tkinter font Font cget}@anchor{464d}
@deffn {Method} cget (option)

Retrieve an attribute of the font.
@end deffn

@geindex config() (tkinter.font.Font method)

@geindex configure() (tkinter.font.Font method)
@anchor{library/tkinter font tkinter font Font config}@anchor{464e}@anchor{library/tkinter font tkinter font Font configure}@anchor{464f}
@deffn {Method} configure (**options)

Modify one or more attributes of the font.
With no arguments, return a dictionary of the current attributes.

@ref{464e,,config()} is an alias of @code{configure()}.
@end deffn

@geindex copy() (tkinter.font.Font method)
@anchor{library/tkinter font tkinter font Font copy}@anchor{4650}
@deffn {Method} copy ()

Return new instance of the current font.
@end deffn

@geindex measure() (tkinter.font.Font method)
@anchor{library/tkinter font tkinter font Font measure}@anchor{4651}
@deffn {Method} measure (text, displayof=None)

Return amount of space the text would occupy on the specified display
when formatted in the current font, as an integer number of pixels.
If no display is specified then the main application window is assumed.
@end deffn

@geindex metrics() (tkinter.font.Font method)
@anchor{library/tkinter font tkinter font Font metrics}@anchor{4652}
@deffn {Method} metrics (*options, **kw)

Return font-specific data.
With no options, return a dictionary mapping each metric name to its
integer value; if one option name is given, return that metric’s value as
an integer.
Options include:


@table @asis

@item `ascent' - distance between baseline and highest point that a

character of the font can occupy

@item `descent' - distance between baseline and lowest point that a

character of the font can occupy

@item `linespace' - minimum vertical separation necessary between any two

characters of the font that ensures no vertical overlap between lines.
@end table

`fixed' - 1 if font is fixed-width else 0
@end deffn
@end deffn

@geindex families() (in module tkinter.font)
@anchor{library/tkinter font tkinter font families}@anchor{4653}
@deffn {Function} tkinter.font.families (root=None, displayof=None)

Return a tuple of the names of the available font families.
@end deffn

@geindex names() (in module tkinter.font)
@anchor{library/tkinter font tkinter font names}@anchor{4654}
@deffn {Function} tkinter.font.names (root=None)

Return a tuple of the names of all the defined fonts.
@end deffn

@geindex nametofont() (in module tkinter.font)
@anchor{library/tkinter font tkinter font nametofont}@anchor{1d13}
@deffn {Function} tkinter.font.nametofont (name, root=None)

Return a @ref{1d10,,Font} representation of the existing named font `name'.
`root' is the widget whose Tcl interpreter owns the font; if omitted, the
default root window is used.


Changed in version 3.10: The `root' parameter was added.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Tkinter dialogs,tkinter messagebox — Tkinter message prompts,tkinter font — Tkinter font wrapper,Graphical user interfaces with Tk
@anchor{library/dialog doc}@anchor{4655}@anchor{library/dialog tkinter-dialogs}@anchor{4656}@anchor{library/dialog translation-repo}@anchor{4657}
@subsection Tkinter dialogs


@menu
* tkinter.simpledialog — Standard Tkinter input dialogs: tkinter simpledialog — Standard Tkinter input dialogs. 
* tkinter.filedialog — File selection dialogs: tkinter filedialog — File selection dialogs. 
* tkinter.commondialog — Dialog window templates: tkinter commondialog — Dialog window templates. 
* tkinter.dialog — Classic Tk dialog boxes: tkinter dialog — Classic Tk dialog boxes. 

@end menu

@node tkinter simpledialog — Standard Tkinter input dialogs,tkinter filedialog — File selection dialogs,,Tkinter dialogs
@anchor{library/dialog module-tkinter simpledialog}@anchor{ff}@anchor{library/dialog tkinter-simpledialog-standard-tkinter-input-dialogs}@anchor{4658}
@subsubsection @code{tkinter.simpledialog} — Standard Tkinter input dialogs


@geindex module; tkinter.simpledialog

`Source code:' Lib/tkinter/simpledialog.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/tkinter/simpledialog.py}


__________________________________________________________________


The @code{tkinter.simpledialog} module contains convenience classes and
functions for creating simple modal dialogs to get a value from the user.

@geindex askfloat() (in module tkinter.simpledialog)
@geindex askinteger() (in module tkinter.simpledialog)
@geindex askstring() (in module tkinter.simpledialog)
@anchor{library/dialog tkinter simpledialog askfloat}@anchor{4659}
@deffn {Function} tkinter.simpledialog.askfloat (title, prompt, **kw)
@anchor{library/dialog tkinter simpledialog askinteger}@anchor{1d14}
@deffnx {Function} tkinter.simpledialog.askinteger (title, prompt, **kw)
@anchor{library/dialog tkinter simpledialog askstring}@anchor{465a}
@deffnx {Function} tkinter.simpledialog.askstring (title, prompt, **kw)

The above three functions provide dialogs that prompt the user to enter a value
of the desired type.
@end deffn

@geindex Dialog (class in tkinter.simpledialog)
@anchor{library/dialog tkinter simpledialog Dialog}@anchor{465b}
@deffn {Class} tkinter.simpledialog.Dialog (parent, title=None)

The base class for custom dialogs.

@geindex body() (tkinter.simpledialog.Dialog method)
@anchor{library/dialog tkinter simpledialog Dialog body}@anchor{465c}
@deffn {Method} body (master)

Override to construct the dialog’s interface and return the widget that
should have initial focus.
@end deffn

@geindex buttonbox() (tkinter.simpledialog.Dialog method)
@anchor{library/dialog tkinter simpledialog Dialog buttonbox}@anchor{465d}
@deffn {Method} buttonbox ()

Default behaviour adds OK and Cancel buttons. Override for custom button
layouts.
@end deffn

@geindex validate() (tkinter.simpledialog.Dialog method)
@anchor{library/dialog tkinter simpledialog Dialog validate}@anchor{465e}
@deffn {Method} validate ()

Validate the data entered by the user.
Return true if it is valid, in which case the dialog proceeds to
@ref{465f,,apply()}; return false to keep the dialog open.
The default implementation always returns true; override it to check the
input.
@end deffn

@geindex apply() (tkinter.simpledialog.Dialog method)
@anchor{library/dialog tkinter simpledialog Dialog apply}@anchor{465f}
@deffn {Method} apply ()

Process the data entered by the user.
Called after @ref{465e,,validate()} succeeds and just before the dialog is
destroyed.
The default implementation does nothing; override it to act on or store
the result.
@end deffn

@geindex destroy() (tkinter.simpledialog.Dialog method)
@anchor{library/dialog tkinter simpledialog Dialog destroy}@anchor{4660}
@deffn {Method} destroy ()

Destroy the dialog window, clearing the reference to the widget that had
the initial focus.
@end deffn
@end deffn

@geindex SimpleDialog (class in tkinter.simpledialog)
@anchor{library/dialog tkinter simpledialog SimpleDialog}@anchor{4661}
@deffn {Class} tkinter.simpledialog.SimpleDialog (master, text='@w{'}, buttons=[], default=None, cancel=None, title=None, class_=None)

A simple modal dialog that displays the message `text' above a row of push
buttons whose labels are given by `buttons', and returns the index of the
button the user presses.
`default' is the index of the button activated by the Return key, `cancel'
the index returned when the window is closed through the window manager,
`title' the window title, and `class_' the Tk class name of the window.

@geindex go() (tkinter.simpledialog.SimpleDialog method)
@anchor{library/dialog tkinter simpledialog SimpleDialog go}@anchor{4662}
@deffn {Method} go ()

Display the dialog, wait until the user presses a button or closes the
window, and return the index of the chosen button.
@end deffn
@end deffn

@node tkinter filedialog — File selection dialogs,tkinter commondialog — Dialog window templates,tkinter simpledialog — Standard Tkinter input dialogs,Tkinter dialogs
@anchor{library/dialog module-tkinter filedialog}@anchor{fb}@anchor{library/dialog tkinter-filedialog-file-selection-dialogs}@anchor{4663}
@subsubsection @code{tkinter.filedialog} — File selection dialogs


@geindex module; tkinter.filedialog

`Source code:' Lib/tkinter/filedialog.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/tkinter/filedialog.py}


__________________________________________________________________


The @code{tkinter.filedialog} module provides classes and factory functions for
creating file/directory selection windows.

@menu
* Native load/save dialogs:: 

@end menu

@node Native load/save dialogs,,,tkinter filedialog — File selection dialogs
@anchor{library/dialog native-load-save-dialogs}@anchor{4664}
@subsubsection Native load/save dialogs


The following classes and functions provide file dialog windows that combine a
native look-and-feel with configuration options to customize behaviour.
The following keyword arguments are applicable to the classes and functions
listed below:

@quotation


@display
`parent' - the window to place the dialog on top of@w{ }
@end display




@display
`title' - the title of the window@w{ }
@end display




@display
`initialdir' - the directory that the dialog starts in@w{ }
@end display




@display
`initialfile' - the file selected upon opening of the dialog@w{ }
@end display




@display
`filetypes' - a sequence of (label, pattern) tuples, ‘*’ wildcard is allowed@w{ }
@end display




@display
`defaultextension' - default extension to append to file (save dialogs)@w{ }
@end display




@display
`multiple' - when true, selection of multiple items is allowed@w{ }
@end display


@end quotation

`Static factory functions'

The below functions when called create a modal, native look-and-feel dialog,
wait for the user’s selection, and return it.
The exact return value depends on the function (see below); when the dialog is
cancelled it is an empty string, an empty tuple, an empty list or @code{None}.

@geindex askopenfile() (in module tkinter.filedialog)
@geindex askopenfiles() (in module tkinter.filedialog)
@anchor{library/dialog tkinter filedialog askopenfile}@anchor{4665}
@deffn {Function} tkinter.filedialog.askopenfile (mode='r', **options)
@anchor{library/dialog tkinter filedialog askopenfiles}@anchor{4666}
@deffnx {Function} tkinter.filedialog.askopenfiles (mode='r', **options)

Create an @ref{4667,,Open} dialog.
@code{askopenfile()} returns the opened file object, or @code{None} if the
dialog is cancelled.
@code{askopenfiles()} returns a list of the opened file objects, or an empty
list if cancelled.
The files are opened in mode `mode' (read-only @code{'r'} by default).
@end deffn

@geindex asksaveasfile() (in module tkinter.filedialog)
@anchor{library/dialog tkinter filedialog asksaveasfile}@anchor{4668}
@deffn {Function} tkinter.filedialog.asksaveasfile (mode='w', **options)

Create a @ref{4669,,SaveAs} dialog and return the opened file object, or
@code{None} if the dialog is cancelled.
The file is opened in mode `mode' (@code{'w'} by default).
@end deffn

@geindex askopenfilename() (in module tkinter.filedialog)
@geindex askopenfilenames() (in module tkinter.filedialog)
@anchor{library/dialog tkinter filedialog askopenfilename}@anchor{466a}
@deffn {Function} tkinter.filedialog.askopenfilename (**options)
@anchor{library/dialog tkinter filedialog askopenfilenames}@anchor{466b}
@deffnx {Function} tkinter.filedialog.askopenfilenames (**options)

Create an @ref{4667,,Open} dialog.
@code{askopenfilename()} returns the selected filename as a string, or an
empty string if the dialog is cancelled.
@code{askopenfilenames()} returns a tuple of the selected filenames, or an
empty tuple if cancelled.
@end deffn

@geindex asksaveasfilename() (in module tkinter.filedialog)
@anchor{library/dialog tkinter filedialog asksaveasfilename}@anchor{466c}
@deffn {Function} tkinter.filedialog.asksaveasfilename (**options)

Create a @ref{4669,,SaveAs} dialog and return the selected filename as a
string, or an empty string if the dialog is cancelled.
@end deffn

@geindex askdirectory() (in module tkinter.filedialog)
@anchor{library/dialog tkinter filedialog askdirectory}@anchor{466d}
@deffn {Function} tkinter.filedialog.askdirectory (**options)

Prompt the user to select a directory, and return its path as a string, or
an empty string if the dialog is cancelled.
Additional keyword option: `mustexist' - if true, the user may only select
an existing directory (false by default).
@end deffn

@geindex Open (class in tkinter.filedialog)
@geindex SaveAs (class in tkinter.filedialog)
@anchor{library/dialog tkinter filedialog Open}@anchor{4667}
@deffn {Class} tkinter.filedialog.Open (master=None, **options)
@anchor{library/dialog tkinter filedialog SaveAs}@anchor{4669}
@deffnx {Class} tkinter.filedialog.SaveAs (master=None, **options)

The above two classes provide native dialog windows for saving and loading
files.
@end deffn

`Convenience classes'

The below classes are used for creating file/directory windows from scratch.
These do not emulate the native look-and-feel of the platform.

@geindex Directory (class in tkinter.filedialog)
@anchor{library/dialog tkinter filedialog Directory}@anchor{466e}
@deffn {Class} tkinter.filedialog.Directory (master=None, **options)

Create a dialog prompting the user to select a directory.
@end deffn

@cartouche
@quotation Note 
The `FileDialog' class should be subclassed for custom event
handling and behaviour.
@end quotation
@end cartouche

@geindex FileDialog (class in tkinter.filedialog)
@anchor{library/dialog tkinter filedialog FileDialog}@anchor{466f}
@deffn {Class} tkinter.filedialog.FileDialog (master, title=None)

Create a basic file selection dialog.

@geindex cancel_command() (tkinter.filedialog.FileDialog method)
@anchor{library/dialog tkinter filedialog FileDialog cancel_command}@anchor{4670}
@deffn {Method} cancel_command (event=None)

Trigger the termination of the dialog window.
@end deffn

@geindex dirs_double_event() (tkinter.filedialog.FileDialog method)
@anchor{library/dialog tkinter filedialog FileDialog dirs_double_event}@anchor{4671}
@deffn {Method} dirs_double_event (event)

Event handler for double-click event on directory.
@end deffn

@geindex dirs_select_event() (tkinter.filedialog.FileDialog method)
@anchor{library/dialog tkinter filedialog FileDialog dirs_select_event}@anchor{4672}
@deffn {Method} dirs_select_event (event)

Event handler for click event on directory.
@end deffn

@geindex files_double_event() (tkinter.filedialog.FileDialog method)
@anchor{library/dialog tkinter filedialog FileDialog files_double_event}@anchor{4673}
@deffn {Method} files_double_event (event)

Event handler for double-click event on file.
@end deffn

@geindex files_select_event() (tkinter.filedialog.FileDialog method)
@anchor{library/dialog tkinter filedialog FileDialog files_select_event}@anchor{4674}
@deffn {Method} files_select_event (event)

Event handler for single-click event on file.
@end deffn

@geindex filter_command() (tkinter.filedialog.FileDialog method)
@anchor{library/dialog tkinter filedialog FileDialog filter_command}@anchor{4675}
@deffn {Method} filter_command (event=None)

Filter the files by directory.
@end deffn

@geindex get_filter() (tkinter.filedialog.FileDialog method)
@anchor{library/dialog tkinter filedialog FileDialog get_filter}@anchor{4676}
@deffn {Method} get_filter ()

Retrieve the file filter currently in use.
@end deffn

@geindex get_selection() (tkinter.filedialog.FileDialog method)
@anchor{library/dialog tkinter filedialog FileDialog get_selection}@anchor{4677}
@deffn {Method} get_selection ()

Retrieve the currently selected item.
@end deffn

@geindex go() (tkinter.filedialog.FileDialog method)
@anchor{library/dialog tkinter filedialog FileDialog go}@anchor{4678}
@deffn {Method} go (dir_or_file=os.curdir, pattern='*', default='@w{'}, key=None)

Render dialog and start event loop.
@end deffn

@geindex ok_event() (tkinter.filedialog.FileDialog method)
@anchor{library/dialog tkinter filedialog FileDialog ok_event}@anchor{4679}
@deffn {Method} ok_event (event)

Exit dialog returning current selection.
@end deffn

@geindex ok_command() (tkinter.filedialog.FileDialog method)
@anchor{library/dialog tkinter filedialog FileDialog ok_command}@anchor{467a}
@deffn {Method} ok_command ()

Called when the user confirms the current selection.
The base implementation accepts the selection and closes the dialog;
@ref{467b,,LoadFileDialog} and @ref{467c,,SaveFileDialog} override it to check
the selection first.
@end deffn

@geindex quit() (tkinter.filedialog.FileDialog method)
@anchor{library/dialog tkinter filedialog FileDialog quit}@anchor{467d}
@deffn {Method} quit (how=None)

Exit dialog returning filename, if any.
@end deffn

@geindex set_filter() (tkinter.filedialog.FileDialog method)
@anchor{library/dialog tkinter filedialog FileDialog set_filter}@anchor{467e}
@deffn {Method} set_filter (dir, pat)

Set the file filter.
@end deffn

@geindex set_selection() (tkinter.filedialog.FileDialog method)
@anchor{library/dialog tkinter filedialog FileDialog set_selection}@anchor{467f}
@deffn {Method} set_selection (file)

Update the current file selection to `file'.
@end deffn
@end deffn

@geindex LoadFileDialog (class in tkinter.filedialog)
@anchor{library/dialog tkinter filedialog LoadFileDialog}@anchor{467b}
@deffn {Class} tkinter.filedialog.LoadFileDialog (master, title=None)

A subclass of FileDialog that creates a dialog window for selecting an
existing file.

@geindex ok_command() (tkinter.filedialog.LoadFileDialog method)
@anchor{library/dialog tkinter filedialog LoadFileDialog ok_command}@anchor{4680}
@deffn {Method} ok_command ()

Test that a file is provided and that the selection indicates an
already existing file.
@end deffn
@end deffn

@geindex SaveFileDialog (class in tkinter.filedialog)
@anchor{library/dialog tkinter filedialog SaveFileDialog}@anchor{467c}
@deffn {Class} tkinter.filedialog.SaveFileDialog (master, title=None)

A subclass of FileDialog that creates a dialog window for selecting a
destination file.

@geindex ok_command() (tkinter.filedialog.SaveFileDialog method)
@anchor{library/dialog tkinter filedialog SaveFileDialog ok_command}@anchor{4681}
@deffn {Method} ok_command ()

Test whether or not the selection points to a valid file that is not a
directory. Confirmation is required if an already existing file is
selected.
@end deffn
@end deffn

@node tkinter commondialog — Dialog window templates,tkinter dialog — Classic Tk dialog boxes,tkinter filedialog — File selection dialogs,Tkinter dialogs
@anchor{library/dialog module-tkinter commondialog}@anchor{f8}@anchor{library/dialog tkinter-commondialog-dialog-window-templates}@anchor{4682}
@subsubsection @code{tkinter.commondialog} — Dialog window templates


@geindex module; tkinter.commondialog

`Source code:' Lib/tkinter/commondialog.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/tkinter/commondialog.py}


__________________________________________________________________


The @code{tkinter.commondialog} module provides the @ref{4643,,Dialog} class that
is the base class for dialogs defined in other supporting modules.

@geindex Dialog (class in tkinter.commondialog)
@anchor{library/dialog tkinter commondialog Dialog}@anchor{4643}
@deffn {Class} tkinter.commondialog.Dialog (master=None, **options)

@geindex show() (tkinter.commondialog.Dialog method)
@anchor{library/dialog tkinter commondialog Dialog show}@anchor{4683}
@deffn {Method} show (**options)

Render the Dialog window.
@end deffn
@end deffn

@node tkinter dialog — Classic Tk dialog boxes,,tkinter commondialog — Dialog window templates,Tkinter dialogs
@anchor{library/dialog module-tkinter dialog}@anchor{f9}@anchor{library/dialog tkinter-dialog-classic-tk-dialog-boxes}@anchor{4684}
@subsubsection @code{tkinter.dialog} — Classic Tk dialog boxes


@geindex module; tkinter.dialog

`Source code:' Lib/tkinter/dialog.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/tkinter/dialog.py}


__________________________________________________________________


The @code{tkinter.dialog} module provides a simple modal dialog box built on
the classic (non-themed) Tk widgets.

@geindex DIALOG_ICON (in module tkinter.dialog)
@anchor{library/dialog tkinter dialog DIALOG_ICON}@anchor{4685}
@deffn {Data} tkinter.dialog.DIALOG_ICON

The name of the default bitmap (@code{'questhead'}) displayed by a
@ref{4686,,Dialog}.
@end deffn

@geindex Dialog (class in tkinter.dialog)
@anchor{library/dialog tkinter dialog Dialog}@anchor{4686}
@deffn {Class} tkinter.dialog.Dialog (master=None, cnf=@{@}, **kw)

Display a modal dialog box built from the classic (non-themed) Tk widgets
and wait for the user to press one of its buttons.
The options, given through `cnf' or as keyword arguments, include `title'
(the window title), `text' (the message), `bitmap' (an icon,
@ref{4685,,DIALOG_ICON} by default), `default' (the index of the default button)
and `strings' (the sequence of button labels).
After construction, the @code{num} attribute holds the index of the button
the user pressed.

@geindex destroy() (tkinter.dialog.Dialog method)
@anchor{library/dialog tkinter dialog Dialog destroy}@anchor{4687}
@deffn {Method} destroy ()

Destroy the dialog window.
@end deffn
@end deffn


@subsubheading See also


Modules @ref{fd,,tkinter.messagebox}, @ref{20aa,,Reading and Writing Files}


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node tkinter messagebox — Tkinter message prompts,tkinter scrolledtext — Scrolled text widget,Tkinter dialogs,Graphical user interfaces with Tk
@anchor{library/tkinter messagebox doc}@anchor{4688}@anchor{library/tkinter messagebox module-tkinter messagebox}@anchor{fd}@anchor{library/tkinter messagebox tkinter-messagebox-tkinter-message-prompts}@anchor{4689}@anchor{library/tkinter messagebox translation-repo}@anchor{468a}
@subsection @code{tkinter.messagebox} — Tkinter message prompts


@geindex module; tkinter.messagebox

`Source code:' Lib/tkinter/messagebox.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/tkinter/messagebox.py}


__________________________________________________________________


The @code{tkinter.messagebox} module provides a template base class as well as
a variety of convenience methods for commonly used configurations.
The message boxes are modal: each blocks until the user responds, then returns
a value that depends on the function.
The @code{show*} functions and @ref{468b,,Message.show()} return the symbolic name of
the button the user pressed, as a string (such as @ref{468c,,OK} or @ref{468d,,YES}),
while the @code{ask*} functions return a @ref{3c1,,bool} or @code{None} (see each
function below).
Common message box styles and layouts include but are not limited to:


@float Figure

@image{python-figures/tk_msg,,,,png}

@end float


@geindex Message (class in tkinter.messagebox)
@anchor{library/tkinter messagebox tkinter messagebox Message}@anchor{468e}
@deffn {Class} tkinter.messagebox.Message (master=None, **options)

Create a message window with an application-specified message, an icon
and a set of buttons.
Each of the buttons in the message window is identified by a unique symbolic name (see the `type' options).

The following options are supported:

@quotation


@table @asis

@item `command'

Specifies the function to invoke when the user closes the dialog.
The name of the button clicked by the user to close the dialog is
passed as argument.
This is only available on macOS.

@item `default'

Gives the @ref{468f,,symbolic name} of the default button
for this message window (@ref{468c,,OK}, @ref{4690,,CANCEL}, and so on).
If this option is not specified, the first button in the dialog will
be made the default.

@item `detail'

Specifies an auxiliary message to the main message given by the
`message' option.
The message detail will be presented beneath the main message and,
where supported by the OS, in a less emphasized font than the main
message.

@item `icon'

Specifies an @ref{4691,,icon} to display.
If this option is not specified, then the @ref{4692,,INFO} icon will be
displayed.

@item `message'

Specifies the message to display in this message box.
The default value is an empty string.

@item `parent'

Makes the specified window the logical parent of the message box.
The message box is displayed on top of its parent window.

@item `title'

Specifies a string to display as the title of the message box.
This option is ignored on macOS, where platform guidelines forbid
the use of a title on this kind of dialog.

@item `type'

Arranges for a @ref{4693,,predefined set of buttons}
to be displayed.
@end table
@end quotation

@cartouche
@quotation Note 
Tk 8.6 added the `command' option.
@end quotation
@end cartouche

@geindex show() (tkinter.messagebox.Message method)
@anchor{library/tkinter messagebox tkinter messagebox Message show}@anchor{468b}
@deffn {Method} show (**options)

Display a message window and wait for the user to select one of the buttons. Then return the symbolic name of the selected button.
Keyword arguments can override options specified in the constructor.
@end deffn
@end deffn

`Information message box'

@geindex showinfo() (in module tkinter.messagebox)
@anchor{library/tkinter messagebox tkinter messagebox showinfo}@anchor{4694}
@deffn {Function} tkinter.messagebox.showinfo (title=None, message=None, **options)

Creates and displays an information message box with the specified title
and message.
@end deffn

`Warning message boxes'

@geindex showwarning() (in module tkinter.messagebox)
@anchor{library/tkinter messagebox tkinter messagebox showwarning}@anchor{4695}
@deffn {Function} tkinter.messagebox.showwarning (title=None, message=None, **options)

Creates and displays a warning message box with the specified title
and message.
@end deffn

@geindex showerror() (in module tkinter.messagebox)
@anchor{library/tkinter messagebox tkinter messagebox showerror}@anchor{4696}
@deffn {Function} tkinter.messagebox.showerror (title=None, message=None, **options)

Creates and displays an error message box with the specified title
and message.
@end deffn

`Question message boxes'

@geindex askquestion() (in module tkinter.messagebox)
@anchor{library/tkinter messagebox tkinter messagebox askquestion}@anchor{4697}
@deffn {Function} tkinter.messagebox.askquestion (title=None, message=None, *, type=YESNO, **options)

Ask a question. By default shows buttons @ref{468d,,YES} and @ref{4698,,NO}.
Returns the symbolic name of the selected button.
@end deffn

@geindex askokcancel() (in module tkinter.messagebox)
@anchor{library/tkinter messagebox tkinter messagebox askokcancel}@anchor{4699}
@deffn {Function} tkinter.messagebox.askokcancel (title=None, message=None, **options)

Ask if operation should proceed. Shows buttons @ref{468c,,OK} and @ref{4690,,CANCEL}.
Returns @code{True} if the answer is ok and @code{False} otherwise.
@end deffn

@geindex askretrycancel() (in module tkinter.messagebox)
@anchor{library/tkinter messagebox tkinter messagebox askretrycancel}@anchor{469a}
@deffn {Function} tkinter.messagebox.askretrycancel (title=None, message=None, **options)

Ask if operation should be retried. Shows buttons @ref{469b,,RETRY} and @ref{4690,,CANCEL}.
Return @code{True} if the answer is yes and @code{False} otherwise.
@end deffn

@geindex askyesno() (in module tkinter.messagebox)
@anchor{library/tkinter messagebox tkinter messagebox askyesno}@anchor{469c}
@deffn {Function} tkinter.messagebox.askyesno (title=None, message=None, **options)

Ask a question. Shows buttons @ref{468d,,YES} and @ref{4698,,NO}.
Returns @code{True} if the answer is yes and @code{False} otherwise.
@end deffn

@geindex askyesnocancel() (in module tkinter.messagebox)
@anchor{library/tkinter messagebox tkinter messagebox askyesnocancel}@anchor{469d}
@deffn {Function} tkinter.messagebox.askyesnocancel (title=None, message=None, **options)

Ask a question. Shows buttons @ref{468d,,YES}, @ref{4698,,NO} and @ref{4690,,CANCEL}.
Return @code{True} if the answer is yes, @code{None} if cancelled, and @code{False}
otherwise.
@end deffn
@anchor{library/tkinter messagebox messagebox-buttons}@anchor{468f}
Symbolic names of buttons:

@geindex ABORT (in module tkinter.messagebox)
@anchor{library/tkinter messagebox tkinter messagebox ABORT}@anchor{469e}
@deffn {Data} tkinter.messagebox.ABORT = 'abort'
@end deffn

@geindex RETRY (in module tkinter.messagebox)
@anchor{library/tkinter messagebox tkinter messagebox RETRY}@anchor{469b}
@deffn {Data} tkinter.messagebox.RETRY = 'retry'
@end deffn

@geindex IGNORE (in module tkinter.messagebox)
@anchor{library/tkinter messagebox tkinter messagebox IGNORE}@anchor{469f}
@deffn {Data} tkinter.messagebox.IGNORE = 'ignore'
@end deffn

@geindex OK (in module tkinter.messagebox)
@anchor{library/tkinter messagebox tkinter messagebox OK}@anchor{468c}
@deffn {Data} tkinter.messagebox.OK = 'ok'
@end deffn

@geindex CANCEL (in module tkinter.messagebox)
@anchor{library/tkinter messagebox tkinter messagebox CANCEL}@anchor{4690}
@deffn {Data} tkinter.messagebox.CANCEL = 'cancel'
@end deffn

@geindex YES (in module tkinter.messagebox)
@anchor{library/tkinter messagebox tkinter messagebox YES}@anchor{468d}
@deffn {Data} tkinter.messagebox.YES = 'yes'
@end deffn

@geindex NO (in module tkinter.messagebox)
@anchor{library/tkinter messagebox tkinter messagebox NO}@anchor{4698}
@deffn {Data} tkinter.messagebox.NO = 'no'
@end deffn
@anchor{library/tkinter messagebox messagebox-types}@anchor{4693}
Predefined sets of buttons:

@geindex ABORTRETRYIGNORE (in module tkinter.messagebox)
@anchor{library/tkinter messagebox tkinter messagebox ABORTRETRYIGNORE}@anchor{46a0}
@deffn {Data} tkinter.messagebox.ABORTRETRYIGNORE = 'abortretryignore'

Displays three buttons whose symbolic names are @ref{469e,,ABORT},
@ref{469b,,RETRY} and @ref{469f,,IGNORE}.
@end deffn


@deffn {Data} tkinter.messagebox.OK = 'ok'

Displays one button whose symbolic name is @ref{468c,,OK}.
@end deffn

@geindex OKCANCEL (in module tkinter.messagebox)
@anchor{library/tkinter messagebox tkinter messagebox OKCANCEL}@anchor{46a1}
@deffn {Data} tkinter.messagebox.OKCANCEL = 'okcancel'

Displays two buttons whose symbolic names are @ref{468c,,OK} and
@ref{4690,,CANCEL}.
@end deffn

@geindex RETRYCANCEL (in module tkinter.messagebox)
@anchor{library/tkinter messagebox tkinter messagebox RETRYCANCEL}@anchor{46a2}
@deffn {Data} tkinter.messagebox.RETRYCANCEL = 'retrycancel'

Displays two buttons whose symbolic names are @ref{469b,,RETRY} and
@ref{4690,,CANCEL}.
@end deffn

@geindex YESNO (in module tkinter.messagebox)
@anchor{library/tkinter messagebox tkinter messagebox YESNO}@anchor{46a3}
@deffn {Data} tkinter.messagebox.YESNO = 'yesno'

Displays two buttons whose symbolic names are @ref{468d,,YES} and
@ref{4698,,NO}.
@end deffn

@geindex YESNOCANCEL (in module tkinter.messagebox)
@anchor{library/tkinter messagebox tkinter messagebox YESNOCANCEL}@anchor{46a4}
@deffn {Data} tkinter.messagebox.YESNOCANCEL = 'yesnocancel'

Displays three buttons whose symbolic names are @ref{468d,,YES},
@ref{4698,,NO} and @ref{4690,,CANCEL}.
@end deffn
@anchor{library/tkinter messagebox messagebox-icons}@anchor{4691}
Icon images:

@geindex ERROR (in module tkinter.messagebox)
@anchor{library/tkinter messagebox tkinter messagebox ERROR}@anchor{46a5}
@deffn {Data} tkinter.messagebox.ERROR = 'error'
@end deffn

@geindex INFO (in module tkinter.messagebox)
@anchor{library/tkinter messagebox tkinter messagebox INFO}@anchor{4692}
@deffn {Data} tkinter.messagebox.INFO = 'info'
@end deffn

@geindex QUESTION (in module tkinter.messagebox)
@anchor{library/tkinter messagebox tkinter messagebox QUESTION}@anchor{46a6}
@deffn {Data} tkinter.messagebox.QUESTION = 'question'
@end deffn

@geindex WARNING (in module tkinter.messagebox)
@anchor{library/tkinter messagebox tkinter messagebox WARNING}@anchor{46a7}
@deffn {Data} tkinter.messagebox.WARNING = 'warning'
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node tkinter scrolledtext — Scrolled text widget,tkinter dnd — Drag and drop support,tkinter messagebox — Tkinter message prompts,Graphical user interfaces with Tk
@anchor{library/tkinter scrolledtext doc}@anchor{46a8}@anchor{library/tkinter scrolledtext module-tkinter scrolledtext}@anchor{fe}@anchor{library/tkinter scrolledtext tkinter-scrolledtext-scrolled-text-widget}@anchor{46a9}@anchor{library/tkinter scrolledtext translation-repo}@anchor{46aa}
@subsection @code{tkinter.scrolledtext} — Scrolled text widget


@geindex module; tkinter.scrolledtext

`Source code:' Lib/tkinter/scrolledtext.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/tkinter/scrolledtext.py}


__________________________________________________________________


The @code{tkinter.scrolledtext} module provides a class of the same name which
implements a basic text widget which has a vertical scroll bar configured to do
the “right thing.”  Using the @ref{46ab,,ScrolledText} class is a lot easier than
setting up a text widget and scroll bar directly.

The text widget and scrollbar are packed together in a @ref{440f,,Frame},
and the methods of the @ref{4484,,Pack}, @ref{449b,,Grid} and
@ref{4490,,Place} geometry managers are acquired from the
@code{Frame} object.
This allows the @ref{46ab,,ScrolledText} widget to be used directly to achieve
most normal geometry management behavior.

Should more specific control be necessary, the following attributes are
available:

@geindex ScrolledText (class in tkinter.scrolledtext)
@anchor{library/tkinter scrolledtext tkinter scrolledtext ScrolledText}@anchor{46ab}
@deffn {Class} tkinter.scrolledtext.ScrolledText (master=None, **kw)

@geindex frame (tkinter.scrolledtext.ScrolledText attribute)
@anchor{library/tkinter scrolledtext tkinter scrolledtext ScrolledText frame}@anchor{46ac}
@deffn {Attribute} frame

The frame which surrounds the text and scroll bar widgets.
@end deffn

@geindex vbar (tkinter.scrolledtext.ScrolledText attribute)
@anchor{library/tkinter scrolledtext tkinter scrolledtext ScrolledText vbar}@anchor{46ad}
@deffn {Attribute} vbar

The scroll bar widget.
@end deffn
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node tkinter dnd — Drag and drop support,tkinter ttk — Tk themed widgets,tkinter scrolledtext — Scrolled text widget,Graphical user interfaces with Tk
@anchor{library/tkinter dnd doc}@anchor{46ae}@anchor{library/tkinter dnd module-tkinter dnd}@anchor{fa}@anchor{library/tkinter dnd tkinter-dnd-drag-and-drop-support}@anchor{46af}@anchor{library/tkinter dnd translation-repo}@anchor{46b0}
@subsection @code{tkinter.dnd} — Drag and drop support


@geindex module; tkinter.dnd

`Source code:' Lib/tkinter/dnd.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/tkinter/dnd.py}


__________________________________________________________________


@cartouche
@quotation Note 
This is experimental and due to be deprecated when it is replaced
with the Tk DND.
@end quotation
@end cartouche

The @code{tkinter.dnd} module provides drag-and-drop support for objects within
a single application, within the same window or between windows. To enable an
object to be dragged, you must create an event binding for it that starts the
drag-and-drop process. Typically, you bind a ButtonPress event to a callback
function that you write (see @ref{439f,,Bindings and events}). The function should
call @ref{46b1,,dnd_start()}, where ‘source’ is the object to be dragged, and ‘event’
is the event that invoked the call (the argument to your callback function).

Selection of a target object occurs as follows:


@enumerate 

@item 
Top-down search of area under mouse for target widget
@end enumerate

@quotation


@itemize *

@item 
Target widget should have a callable `dnd_accept' attribute

@item 
If `dnd_accept' is not present or returns @code{None}, search moves to parent widget

@item 
If no target widget is found, then the target object is @code{None}
@end itemize
@end quotation


@enumerate 2

@item 
Call to `<old_target>.dnd_leave(source, event)'

@item 
Call to `<new_target>.dnd_enter(source, event)'

@item 
Call to `<target>.dnd_commit(source, event)' to notify of drop

@item 
Call to `<source>.dnd_end(target, event)' to signal end of drag-and-drop
@end enumerate

@geindex DndHandler (class in tkinter.dnd)
@anchor{library/tkinter dnd tkinter dnd DndHandler}@anchor{46b2}
@deffn {Class} tkinter.dnd.DndHandler (source, event)

The `DndHandler' class handles drag-and-drop events tracking Motion and
ButtonRelease events on the root of the event widget.

@geindex cancel() (tkinter.dnd.DndHandler method)
@anchor{library/tkinter dnd tkinter dnd DndHandler cancel}@anchor{46b3}
@deffn {Method} cancel (event=None)

Cancel the drag-and-drop process.
@end deffn

@geindex finish() (tkinter.dnd.DndHandler method)
@anchor{library/tkinter dnd tkinter dnd DndHandler finish}@anchor{46b4}
@deffn {Method} finish (event, commit=0)

Execute end of drag-and-drop functions.
@end deffn

@geindex on_motion() (tkinter.dnd.DndHandler method)
@anchor{library/tkinter dnd tkinter dnd DndHandler on_motion}@anchor{46b5}
@deffn {Method} on_motion (event)

Inspect area below mouse for target objects while a drag
is performed.
@end deffn

@geindex on_release() (tkinter.dnd.DndHandler method)
@anchor{library/tkinter dnd tkinter dnd DndHandler on_release}@anchor{46b6}
@deffn {Method} on_release (event)

Signal end of drag when the release pattern is triggered.
@end deffn
@end deffn

@geindex dnd_start() (in module tkinter.dnd)
@anchor{library/tkinter dnd tkinter dnd dnd_start}@anchor{46b1}
@deffn {Function} tkinter.dnd.dnd_start (source, event)

Factory function for the drag-and-drop process.
Return the @ref{46b2,,DndHandler} instance managing the drag, or @code{None} if a
drag could not be started.
@end deffn


@subsubheading See also


@ref{439f,,Bindings and events}


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node tkinter ttk — Tk themed widgets,IDLE — Python editor and shell<2>,tkinter dnd — Drag and drop support,Graphical user interfaces with Tk
@anchor{library/tkinter ttk doc}@anchor{46b7}@anchor{library/tkinter ttk module-tkinter ttk}@anchor{100}@anchor{library/tkinter ttk tkinter-ttk-tk-themed-widgets}@anchor{46b8}@anchor{library/tkinter ttk translation-repo}@anchor{46b9}
@subsection @code{tkinter.ttk} — Tk themed widgets


@geindex module; tkinter.ttk

`Source code:' Lib/tkinter/ttk.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/tkinter/ttk.py}

@geindex ttk


__________________________________________________________________


The @code{tkinter.ttk} module provides access to the Tk themed widget set,
introduced in Tk 8.5. It provides additional benefits including anti-aliased font
rendering under X11 and window transparency (requiring a composition
window manager on X11).

The basic idea for @code{tkinter.ttk} is to separate, to the extent possible,
the code implementing a widget’s behavior from the code implementing its
appearance.


Added in version 3.1.



@subsubheading See also



@table @asis

@item Tk Widget Styling Support@footnote{https://core.tcl.tk/tips/doc/trunk/tip/48.md}

A document introducing theming support for Tk
@end table


@menu
* Using Ttk:: 
* Ttk widgets:: 
* Widget:: 
* Combobox:: 
* Spinbox:: 
* Notebook:: 
* Progressbar:: 
* Separator:: 
* Sizegrip:: 
* Treeview:: 
* Ttk styling:: 
* Additional widgets:: 

@end menu

@node Using Ttk,Ttk widgets,,tkinter ttk — Tk themed widgets
@anchor{library/tkinter ttk using-ttk}@anchor{46ba}
@subsubsection Using Ttk


To start using Ttk, import its module:

@example
from tkinter import ttk
@end example

To override the basic Tk widgets, the import should follow the Tk import:

@example
from tkinter import *
from tkinter.ttk import *
@end example

That code causes several @code{tkinter.ttk} widgets (@ref{4380,,Button},
@ref{1a0a,,Checkbutton}, @ref{46bb,,Entry}, @ref{437e,,Frame}, @ref{437f,,Label},
@ref{46bc,,LabelFrame}, @ref{46bd,,Menubutton}, @ref{46be,,PanedWindow},
@ref{46bf,,Radiobutton}, @ref{46c0,,Scale} and @ref{46c1,,Scrollbar}) to
automatically replace the Tk widgets.

This has the direct benefit of using the new widgets which gives a better look
and feel across platforms; however, the replacement widgets are not completely
compatible.
The main difference is that widget options such as “fg”, “bg” and others
related to widget styling are no longer present in Ttk widgets.
Instead, use the @ref{560,,ttk.Style} class for improved styling effects.


@subsubheading See also



@table @asis

@item Converting existing applications to use Tile widgets@footnote{https://tktable.sourceforge.net/tile/doc/converting.txt}

A monograph (using Tcl terminology) about differences typically
encountered when moving applications to use the new widgets.
@end table


@node Ttk widgets,Widget,Using Ttk,tkinter ttk — Tk themed widgets
@anchor{library/tkinter ttk ttk-widgets}@anchor{46c2}
@subsubsection Ttk widgets


Ttk comes with 18 widgets, twelve of which already existed in tkinter:
@ref{4380,,Button}, @ref{1a0a,,Checkbutton}, @ref{46bb,,Entry}, @ref{437e,,Frame},
@ref{437f,,Label}, @ref{46bc,,LabelFrame}, @ref{46bd,,Menubutton}, @ref{46be,,PanedWindow},
@ref{46bf,,Radiobutton}, @ref{46c0,,Scale}, @ref{46c1,,Scrollbar}, and @ref{d93,,Spinbox}.
The other six are new: @ref{46c3,,Combobox}, @ref{46c4,,Notebook},
@ref{46c5,,Progressbar}, @ref{46c6,,Separator}, @ref{46c7,,Sizegrip} and
@ref{c8d,,Treeview}. And all them are subclasses of @ref{46c8,,Widget}.

Using the Ttk widgets gives the application an improved look and feel.
As discussed above, there are differences in how the styling is coded.

Tk code:

@example
l1 = tkinter.Label(text="Test", fg="black", bg="white")
l2 = tkinter.Label(text="Test", fg="black", bg="white")
@end example

Ttk code:

@example
style = ttk.Style()
style.configure("BW.TLabel", foreground="black", background="white")

l1 = ttk.Label(text="Test", style="BW.TLabel")
l2 = ttk.Label(text="Test", style="BW.TLabel")
@end example

For more information about @ref{46c9,,TtkStyling}, see the @ref{560,,Style} class
documentation.

@node Widget,Combobox,Ttk widgets,tkinter ttk — Tk themed widgets
@anchor{library/tkinter ttk widget}@anchor{46ca}
@subsubsection Widget


@ref{46c8,,ttk.Widget} defines standard options and methods supported by
Tk themed widgets and is not supposed to be directly instantiated.

@menu
* Standard options:: 
* Scrollable widget options:: 
* Label options:: 
* Compatibility options:: 
* Widget states:: 
* ttk.Widget: ttk Widget. 

@end menu

@node Standard options,Scrollable widget options,,Widget
@anchor{library/tkinter ttk standard-options}@anchor{46cb}
@subsubsection Standard options


All the @code{ttk} Widgets accept the following options:


@multitable {xxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Option

@tab

Description

@item

class

@tab

Specifies the window class. The class is used when querying
the option database for the window’s other options, to
determine the default bindtags for the window, and to select
the widget’s default layout and style. This option is
read-only, and may only be specified when the window is
created.

@item

cursor

@tab

Specifies the mouse cursor to be used for the widget. If set
to the empty string (the default), the cursor is inherited
from the parent widget.

@item

takefocus

@tab

Determines whether the window accepts the focus during
keyboard traversal. 0, 1 or an empty string is returned.
If 0 is returned, it means that the window should be skipped
entirely during keyboard traversal. If 1, it means that the
window should receive the input focus as long as it is
viewable. And an empty string means that the traversal
scripts make the decision about whether or not to focus
on the window.

@item

style

@tab

May be used to specify a custom widget style.

@end multitable


@node Scrollable widget options,Label options,Standard options,Widget
@anchor{library/tkinter ttk scrollable-widget-options}@anchor{46cc}
@subsubsection Scrollable widget options


The following options are supported by widgets that are controlled by a
scrollbar.


@multitable {xxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Option

@tab

Description

@item

xscrollcommand

@tab

Used to communicate with horizontal scrollbars.

When the view in the widget’s window changes, the widget
calls the `xscrollcommand' callback.

Usually this option consists of the method
@ref{4566,,Scrollbar.set} of some
scrollbar. This will cause the scrollbar to be updated
whenever the view in the window changes.

@item

yscrollcommand

@tab

Used to communicate with vertical scrollbars.
For some more information, see above.

@end multitable


@node Label options,Compatibility options,Scrollable widget options,Widget
@anchor{library/tkinter ttk label-options}@anchor{46cd}
@subsubsection Label options


The following options are supported by labels, buttons and other button-like
widgets.


@multitable {xxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Option

@tab

Description

@item

text

@tab

Specifies a text string to be displayed inside the widget.

@item

textvariable

@tab

Specifies a name whose value will be used in place of the
text option resource.

@item

underline

@tab

If set, specifies the index (0-based) of a character to
underline in the text string. The underline character is
used for mnemonic activation.

@item

image

@tab

Specifies an image to display. This is a list of 1 or more
elements. The first element is the default image name. The
rest of the list if a sequence of statespec/value pairs as
defined by @ref{1d2a,,Style.map()}, specifying different images
to use when the widget is in a particular state or a
combination of states. All images in the list should have
the same size.

@item

compound

@tab

Specifies how to display the image relative to the text,
in the case both text and images options are present.
Valid values are:


@itemize *

@item 
text: display text only

@item 
image: display image only

@item 
top, bottom, left, right: display image above, below,
left of, or right of the text, respectively.

@item 
none: the default. display the image if present,
otherwise the text.
@end itemize

@item

width

@tab

If greater than zero, specifies how much space, in
character widths, to allocate for the text label, if less
than zero, specifies a minimum width. If zero or
unspecified, the natural width of the text label is used.

@end multitable


@node Compatibility options,Widget states,Label options,Widget
@anchor{library/tkinter ttk compatibility-options}@anchor{46ce}
@subsubsection Compatibility options



@multitable {xxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Option

@tab

Description

@item

state

@tab

May be set to “normal” or “disabled” to control the “disabled”
state bit. This is a write-only option: setting it changes the
widget state, but the @ref{46cf,,Widget.state()} method does not
affect this option.

@end multitable


@node Widget states,ttk Widget,Compatibility options,Widget
@anchor{library/tkinter ttk widget-states}@anchor{46d0}
@subsubsection Widget states


The widget state is a bitmap of independent state flags.


@multitable {xxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Flag

@tab

Description

@item

active

@tab

The mouse cursor is over the widget and pressing a mouse
button will cause some action to occur

@item

disabled

@tab

Widget is disabled under program control

@item

focus

@tab

Widget has keyboard focus

@item

pressed

@tab

Widget is being pressed

@item

selected

@tab

“On”, “true”, or “current” for things like Checkbuttons and
radiobuttons

@item

background

@tab

Windows and Mac have a notion of an “active” or foreground
window. The `background' state is set for widgets in a
background window, and cleared for those in the foreground
window

@item

readonly

@tab

Widget should not allow user modification

@item

alternate

@tab

A widget-specific alternate display format

@item

invalid

@tab

The widget’s value is invalid

@end multitable


A state specification is a sequence of state names, optionally prefixed with
an exclamation point indicating that the bit is off.

@node ttk Widget,,Widget states,Widget
@anchor{library/tkinter ttk ttk-widget}@anchor{46d1}
@subsubsection ttk.Widget


Besides the methods described below, the @ref{46c8,,ttk.Widget} supports
the methods @ref{43b1,,tkinter.Widget.cget} and
@ref{4383,,tkinter.Widget.configure}.

@geindex Widget (class in tkinter.ttk)
@anchor{library/tkinter ttk tkinter ttk Widget}@anchor{46c8}
@deffn {Class} tkinter.ttk.Widget

@geindex identify() (tkinter.ttk.Widget method)
@anchor{library/tkinter ttk tkinter ttk Widget identify}@anchor{46d2}
@deffn {Method} identify (x, y)

Returns the name of the element at position `x' `y', or the empty string
if the point does not lie within any element.

`x' and `y' are pixel coordinates relative to the widget.
@end deffn

@geindex instate() (tkinter.ttk.Widget method)
@anchor{library/tkinter ttk tkinter ttk Widget instate}@anchor{46d3}
@deffn {Method} instate (statespec, callback=None, *args, **kw)

Test the widget’s state. If a callback is not specified, returns @code{True}
if the widget state matches `statespec' and @code{False} otherwise. If callback
is specified then it is called with args if widget state matches
`statespec'.
@end deffn

@geindex state() (tkinter.ttk.Widget method)
@anchor{library/tkinter ttk tkinter ttk Widget state}@anchor{46cf}
@deffn {Method} state (statespec=None)

Modify or inquire widget state. If `statespec' is specified, sets the
widget state according to it and return a new `statespec' indicating
which flags were changed. If `statespec' is not specified, returns
the currently enabled state flags.
@end deffn

`statespec' will usually be a list or a tuple.
@end deffn

@node Combobox,Spinbox,Widget,tkinter ttk — Tk themed widgets
@anchor{library/tkinter ttk combobox}@anchor{46d4}
@subsubsection Combobox


The @ref{46c3,,ttk.Combobox} widget combines a text field with a
pop-down list of values.
This widget is a subclass of @ref{46bb,,Entry}.

Besides the methods inherited from @ref{46c8,,Widget}: @ref{43b1,,cget()},
@ref{4383,,configure()}, @ref{46d2,,identify()},
@ref{46d3,,instate()} and @ref{46cf,,state()}, and the following inherited
from @ref{46bb,,Entry}: @ref{46d5,,bbox()}, @ref{4504,,delete()},
@ref{4507,,icursor()}, @ref{4508,,index()},
@ref{4506,,insert()},
@ref{450a,,selection*},
@ref{44b6,,xview*}, it has some other methods, described at
@ref{46c3,,ttk.Combobox}.

@menu
* Options:: 
* Virtual events:: 
* ttk.Combobox: ttk Combobox. 

@end menu

@node Options,Virtual events,,Combobox
@anchor{library/tkinter ttk options}@anchor{46d6}
@subsubsection Options


This widget accepts the following specific options:


@multitable {xxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Option

@tab

Description

@item

exportselection

@tab

Boolean value. If set, the widget selection is linked
to the X selection (which can be returned
by invoking Misc.selection_get, for example).

@item

justify

@tab

Specifies how the text is aligned within the widget.
One of “left”, “center”, or “right”.

@item

height

@tab

Specifies the height of the pop-down listbox, in rows.

@item

postcommand

@tab

A script (possibly registered with Misc.register) that
is called immediately before displaying the values. It
may specify which values to display.

@item

state

@tab

One of “normal”, “readonly”, or “disabled”. In the
“readonly” state, the value may not be edited directly,
and the user can only select one of the values from the
dropdown list. In the “normal” state, the text field is
directly editable. In the “disabled” state, no
interaction is possible.

@item

textvariable

@tab

Specifies a name whose value is linked to the widget
value. Whenever the value associated with that name
changes, the widget value is updated, and vice versa.
See @ref{4396,,tkinter.StringVar}.

@item

values

@tab

Specifies the list of values to display in the
drop-down listbox.

@item

width

@tab

Specifies an integer value indicating the desired width
of the entry window, in average-size characters of the
widget’s font.

@end multitable


@cartouche
@quotation Note 
Tk 9.1 added the `locale' option, which selects the locale used to determine
word and character boundaries within the text (@code{"C"} by default).
@end quotation
@end cartouche

@node Virtual events,ttk Combobox,Options,Combobox
@anchor{library/tkinter ttk virtual-events}@anchor{46d7}
@subsubsection Virtual events


The combobox widgets generates a `<<ComboboxSelected>>' virtual event
when the user selects an element from the list of values.

@node ttk Combobox,,Virtual events,Combobox
@anchor{library/tkinter ttk ttk-combobox}@anchor{46d8}
@subsubsection ttk.Combobox


@geindex Combobox (class in tkinter.ttk)
@anchor{library/tkinter ttk tkinter ttk Combobox}@anchor{46c3}
@deffn {Class} tkinter.ttk.Combobox

@geindex current() (tkinter.ttk.Combobox method)
@anchor{library/tkinter ttk tkinter ttk Combobox current}@anchor{46d9}
@deffn {Method} current (newindex=None)

If `newindex' is specified, sets the combobox value to the element
position `newindex'. Otherwise, returns the index of the current value or
-1 if the current value is not in the values list.
@end deffn

@geindex get() (tkinter.ttk.Combobox method)
@anchor{library/tkinter ttk tkinter ttk Combobox get}@anchor{46da}
@deffn {Method} get ()

Returns the current value of the combobox.
@end deffn

@geindex set() (tkinter.ttk.Combobox method)
@anchor{library/tkinter ttk tkinter ttk Combobox set}@anchor{46db}
@deffn {Method} set (value)

Sets the value of the combobox to `value'.
@end deffn
@end deffn

@node Spinbox,Notebook,Combobox,tkinter ttk — Tk themed widgets
@anchor{library/tkinter ttk spinbox}@anchor{46dc}
@subsubsection Spinbox


The @ref{d93,,ttk.Spinbox} widget is a @ref{46bb,,ttk.Entry}
enhanced with increment and decrement arrows.
It can be used for numbers or lists of string values.
This widget is a subclass of @code{Entry}.
Besides the methods inherited from @ref{46c8,,Widget}: @ref{43b1,,cget()},
@ref{4383,,configure()}, @ref{46d2,,identify()},
@ref{46d3,,instate()} and @ref{46cf,,state()}, and the following inherited
from @code{Entry}: @ref{46d5,,bbox()}, @ref{4504,,delete()},
@ref{4507,,icursor()}, @ref{4508,,index()},
@ref{4506,,insert()}, @ref{44b6,,xview*}, it has
some other methods, described at @code{ttk.Spinbox}.

@menu
* Options: Options<2>. 
* Virtual events: Virtual events<2>. 
* ttk.Spinbox: ttk Spinbox. 

@end menu

@node Options<2>,Virtual events<2>,,Spinbox
@anchor{library/tkinter ttk id1}@anchor{46dd}
@subsubsection Options


This widget accepts the following specific options:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Option

@tab

Description

@item

from

@tab

Float value.  If set, this is the minimum value to
which the decrement button will decrement.  Must be
spelled as @code{from_} when used as an argument, since
@code{from} is a Python keyword.

@item

to

@tab

Float value.  If set, this is the maximum value to
which the increment button will increment.

@item

increment

@tab

Float value.  Specifies the amount which the
increment/decrement buttons change the
value. Defaults to 1.0.

@item

values

@tab

Sequence of string or float values.  If specified,
the increment/decrement buttons will cycle through
the items in this sequence rather than incrementing
or decrementing numbers.

@item

wrap

@tab

Boolean value.  If @code{True}, increment and decrement
buttons will cycle from the @code{to} value to the
@code{from} value or the @code{from} value to the @code{to}
value, respectively.

@item

format

@tab

String value.  This specifies the format of numbers
set by the increment/decrement buttons.  It must be
in the form “%W.Pf”, where W is the padded width of
the value, P is the precision, and ‘%’ and ‘f’ are
literal.

@item

command

@tab

Python callable.  Will be called with no arguments
whenever either of the increment or decrement buttons
are pressed.

@end multitable


@node Virtual events<2>,ttk Spinbox,Options<2>,Spinbox
@anchor{library/tkinter ttk id2}@anchor{46de}
@subsubsection Virtual events


The spinbox widget generates an `<<Increment>>' virtual event when the
user presses <Up>, and a `<<Decrement>>' virtual event when the user
presses <Down>.

@node ttk Spinbox,,Virtual events<2>,Spinbox
@anchor{library/tkinter ttk ttk-spinbox}@anchor{46df}
@subsubsection ttk.Spinbox


@geindex Spinbox (class in tkinter.ttk)
@anchor{library/tkinter ttk tkinter ttk Spinbox}@anchor{d93}
@deffn {Class} tkinter.ttk.Spinbox


Added in version 3.8.


@geindex get() (tkinter.ttk.Spinbox method)
@anchor{library/tkinter ttk tkinter ttk Spinbox get}@anchor{46e0}
@deffn {Method} get ()

Returns the current value of the spinbox.
@end deffn

@geindex set() (tkinter.ttk.Spinbox method)
@anchor{library/tkinter ttk tkinter ttk Spinbox set}@anchor{46e1}
@deffn {Method} set (value)

Sets the value of the spinbox to `value'.
@end deffn
@end deffn

@node Notebook,Progressbar,Spinbox,tkinter ttk — Tk themed widgets
@anchor{library/tkinter ttk notebook}@anchor{46e2}
@subsubsection Notebook


Ttk Notebook widget manages a collection of windows and displays a single
one at a time. Each child window is associated with a tab, which the user
may select to change the currently displayed window.

@menu
* Options: Options<3>. 
* Tab options:: 
* Tab identifiers:: 
* Virtual events: Virtual events<3>. 
* ttk.Notebook: ttk Notebook. 

@end menu

@node Options<3>,Tab options,,Notebook
@anchor{library/tkinter ttk id3}@anchor{46e3}
@subsubsection Options


This widget accepts the following specific options:


@multitable {xxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Option

@tab

Description

@item

height

@tab

If present and greater than zero, specifies the desired height
of the pane area (not including internal padding or tabs).
Otherwise, the maximum height of all panes is used.

@item

padding

@tab

Specifies the amount of extra space to add around the outside
of the notebook. The padding is a list up to four length
specifications left top right bottom. If fewer than four
elements are specified, bottom defaults to top, right defaults
to left, and top defaults to left.

@item

width

@tab

If present and greater than zero, specified the desired width
of the pane area (not including internal padding). Otherwise,
the maximum width of all panes is used.

@end multitable


@node Tab options,Tab identifiers,Options<3>,Notebook
@anchor{library/tkinter ttk tab-options}@anchor{46e4}
@subsubsection Tab options


There are also specific options for tabs:


@multitable {xxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Option

@tab

Description

@item

state

@tab

Either “normal”, “disabled” or “hidden”. If “disabled”, then
the tab is not selectable. If “hidden”, then the tab is not
shown.

@item

sticky

@tab

Specifies how the child window is positioned within the pane
area. Value is a string containing zero or more of the
characters “n”, “s”, “e” or “w”. Each letter refers to a
side (north, south, east or west) that the child window will
stick to, as per the @ref{437a,,grid}
geometry manager.

@item

padding

@tab

Specifies the amount of extra space to add between the
notebook and this pane. Syntax is the same as for the option
padding used by this widget.

@item

text

@tab

Specifies a text to be displayed in the tab.

@item

image

@tab

Specifies an image to display in the tab. See the option
image described in @ref{46c8,,Widget}.

@item

compound

@tab

Specifies how to display the image relative to the text, in
the case both options text and image are present. See
@ref{46cd,,Label Options} for legal values.

@item

underline

@tab

Specifies the index (0-based) of a character to underline in
the text string. The underlined character is used for
mnemonic activation if @ref{46e5,,Notebook.enable_traversal()} is
called.

@end multitable


@node Tab identifiers,Virtual events<3>,Tab options,Notebook
@anchor{library/tkinter ttk tab-identifiers}@anchor{46e6}
@subsubsection Tab identifiers


The tab_id present in several methods of @ref{46c4,,ttk.Notebook} may
take any of the following forms:


@itemize *

@item 
An integer between zero and the number of tabs

@item 
The name of a child window

@item 
A positional specification of the form “@@x,y”, which identifies the tab

@item 
The literal string “current”, which identifies the currently selected tab

@item 
The literal string “end”, which returns the number of tabs (only valid for
@ref{46e7,,Notebook.index()})
@end itemize

@node Virtual events<3>,ttk Notebook,Tab identifiers,Notebook
@anchor{library/tkinter ttk id4}@anchor{46e8}
@subsubsection Virtual events


This widget generates a `<<NotebookTabChanged>>' virtual event after a new
tab is selected.

@node ttk Notebook,,Virtual events<3>,Notebook
@anchor{library/tkinter ttk ttk-notebook}@anchor{46e9}
@subsubsection ttk.Notebook


@geindex Notebook (class in tkinter.ttk)
@anchor{library/tkinter ttk tkinter ttk Notebook}@anchor{46c4}
@deffn {Class} tkinter.ttk.Notebook

@geindex add() (tkinter.ttk.Notebook method)
@anchor{library/tkinter ttk tkinter ttk Notebook add}@anchor{46ea}
@deffn {Method} add (child, **kw)

Adds a new tab to the notebook.

If window is currently managed by the notebook but hidden, it is
restored to its previous position.

See @ref{46e4,,Tab Options} for the list of available options.
@end deffn

@geindex forget() (tkinter.ttk.Notebook method)
@anchor{library/tkinter ttk tkinter ttk Notebook forget}@anchor{46eb}
@deffn {Method} forget (tab_id)

Removes the tab specified by `tab_id', unmaps and unmanages the
associated window.
@end deffn

@geindex hide() (tkinter.ttk.Notebook method)
@anchor{library/tkinter ttk tkinter ttk Notebook hide}@anchor{46ec}
@deffn {Method} hide (tab_id)

Hides the tab specified by `tab_id'.

The tab will not be displayed, but the associated window remains
managed by the notebook and its configuration remembered. Hidden tabs
may be restored with the @ref{46ea,,add()} command.
@end deffn

@geindex identify() (tkinter.ttk.Notebook method)
@anchor{library/tkinter ttk tkinter ttk Notebook identify}@anchor{46ed}
@deffn {Method} identify (x, y)

Returns the name of the tab element at position `x', `y', or the empty
string if none.
@end deffn

@geindex index() (tkinter.ttk.Notebook method)
@anchor{library/tkinter ttk tkinter ttk Notebook index}@anchor{46e7}
@deffn {Method} index (tab_id)

Returns the numeric index of the tab specified by `tab_id', or the total
number of tabs if `tab_id' is the string “end”.
@end deffn

@geindex insert() (tkinter.ttk.Notebook method)
@anchor{library/tkinter ttk tkinter ttk Notebook insert}@anchor{46ee}
@deffn {Method} insert (pos, child, **kw)

Inserts a pane at the specified position.

`pos' is either the string “end”, an integer index, or the name of a
managed child. If `child' is already managed by the notebook, moves it to
the specified position.

See @ref{46e4,,Tab Options} for the list of available options.
@end deffn

@geindex select() (tkinter.ttk.Notebook method)
@anchor{library/tkinter ttk tkinter ttk Notebook select}@anchor{46ef}
@deffn {Method} select (tab_id=None)

Selects the specified `tab_id'.

The associated child window will be displayed, and the
previously selected window (if different) is unmapped. If `tab_id' is
omitted, returns the widget name of the currently selected pane.
@end deffn

@geindex tab() (tkinter.ttk.Notebook method)
@anchor{library/tkinter ttk tkinter ttk Notebook tab}@anchor{46f0}
@deffn {Method} tab (tab_id, option=None, **kw)

Query or modify the options of the specific `tab_id'.

If `kw' is not given, returns a dictionary of the tab option values. If
`option' is specified, returns the value of that `option'. Otherwise,
sets the options to the corresponding values.
@end deffn

@geindex tabs() (tkinter.ttk.Notebook method)
@anchor{library/tkinter ttk tkinter ttk Notebook tabs}@anchor{46f1}
@deffn {Method} tabs ()

Returns a tuple of windows managed by the notebook.
@end deffn

@geindex enable_traversal() (tkinter.ttk.Notebook method)
@anchor{library/tkinter ttk tkinter ttk Notebook enable_traversal}@anchor{46e5}
@deffn {Method} enable_traversal ()

Enable keyboard traversal for a toplevel window containing this notebook.

This will extend the bindings for the toplevel window containing the
notebook as follows:


@itemize *

@item 
@code{Control}-@code{Tab}: selects the tab following the currently selected one.

@item 
@code{Shift}-@code{Control}-@code{Tab}: selects the tab preceding the currently selected one.

@item 
@code{Alt}-@code{K}: where `K' is the mnemonic (underlined) character of any tab, will
select that tab.
@end itemize

Multiple notebooks in a single toplevel may be enabled for traversal,
including nested notebooks.
However, notebook traversal only works properly if all panes are direct
children of the notebook.
@end deffn
@end deffn

@node Progressbar,Separator,Notebook,tkinter ttk — Tk themed widgets
@anchor{library/tkinter ttk progressbar}@anchor{46f2}
@subsubsection Progressbar


The @ref{46c5,,ttk.Progressbar} widget shows the status of a
long-running operation.
It can operate in two modes: 1) the determinate mode which shows the amount
completed relative to the total amount of work to be done and 2) the
indeterminate mode which provides an animated display to let the user know that
work is progressing.

@menu
* Options: Options<4>. 
* ttk.Progressbar: ttk Progressbar. 

@end menu

@node Options<4>,ttk Progressbar,,Progressbar
@anchor{library/tkinter ttk id5}@anchor{46f3}
@subsubsection Options


This widget accepts the following specific options:


@multitable {xxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Option

@tab

Description

@item

orient

@tab

One of “horizontal” or “vertical”. Specifies the orientation
of the progress bar.

@item

length

@tab

Specifies the length of the long axis of the progress bar
(width if horizontal, height if vertical).

@item

mode

@tab

One of “determinate” or “indeterminate”.

@item

maximum

@tab

A number specifying the maximum value. Defaults to 100.

@item

value

@tab

The current value of the progress bar. In “determinate” mode,
this represents the amount of work completed. In
“indeterminate” mode, it is interpreted as modulo `maximum';
that is, the progress bar completes one “cycle” when its value
increases by `maximum'.

@item

variable

@tab

A name which is linked to the option value. If specified, the
value of the progress bar is automatically set to the value of
this name whenever the latter is modified.

@item

phase

@tab

Read-only option. The widget periodically increments the value
of this option whenever its value is greater than 0 and, in
determinate mode, less than maximum. This option may be used
by the current theme to provide additional animation effects.

@end multitable


@node ttk Progressbar,,Options<4>,Progressbar
@anchor{library/tkinter ttk ttk-progressbar}@anchor{46f4}
@subsubsection ttk.Progressbar


@geindex Progressbar (class in tkinter.ttk)
@anchor{library/tkinter ttk tkinter ttk Progressbar}@anchor{46c5}
@deffn {Class} tkinter.ttk.Progressbar

@geindex start() (tkinter.ttk.Progressbar method)
@anchor{library/tkinter ttk tkinter ttk Progressbar start}@anchor{46f5}
@deffn {Method} start (interval=None)

Begin autoincrement mode: schedules a recurring timer event that calls
@ref{46f6,,Progressbar.step()} every `interval' milliseconds. If omitted,
`interval' defaults to 50 milliseconds.
@end deffn

@geindex step() (tkinter.ttk.Progressbar method)
@anchor{library/tkinter ttk tkinter ttk Progressbar step}@anchor{46f6}
@deffn {Method} step (amount=None)

Increments the progress bar’s value by `amount'.

`amount' defaults to 1.0 if omitted.
@end deffn

@geindex stop() (tkinter.ttk.Progressbar method)
@anchor{library/tkinter ttk tkinter ttk Progressbar stop}@anchor{46f7}
@deffn {Method} stop ()

Stop autoincrement mode: cancels any recurring timer event initiated by
@ref{46f5,,Progressbar.start()} for this progress bar.
@end deffn
@end deffn

@node Separator,Sizegrip,Progressbar,tkinter ttk — Tk themed widgets
@anchor{library/tkinter ttk separator}@anchor{46f8}
@subsubsection Separator


The @ref{46c6,,ttk.Separator} widget displays a horizontal or vertical
separator bar.

It has no other methods besides the ones inherited from
@ref{46c8,,ttk.Widget}.

@menu
* Options: Options<5>. 

@end menu

@node Options<5>,,,Separator
@anchor{library/tkinter ttk id6}@anchor{46f9}
@subsubsection Options


This widget accepts the following specific option:


@multitable {xxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Option

@tab

Description

@item

orient

@tab

One of “horizontal” or “vertical”. Specifies the orientation of
the separator.

@end multitable


@node Sizegrip,Treeview,Separator,tkinter ttk — Tk themed widgets
@anchor{library/tkinter ttk sizegrip}@anchor{46fa}
@subsubsection Sizegrip


The @ref{46c7,,ttk.Sizegrip} widget (also known as a grow box) allows
the user to resize the containing toplevel window by pressing and dragging the
grip.

This widget has neither specific options nor specific methods, besides the
ones inherited from @ref{46c8,,ttk.Widget}.

@menu
* Platform-specific notes:: 
* Bugs:: 

@end menu

@node Platform-specific notes,Bugs,,Sizegrip
@anchor{library/tkinter ttk platform-specific-notes}@anchor{46fb}
@subsubsection Platform-specific notes



@itemize *

@item 
On macOS, toplevel windows automatically include a built-in size grip
by default. Adding a @ref{46c7,,Sizegrip} is harmless, since the built-in
grip will just mask the widget.
@end itemize

@node Bugs,,Platform-specific notes,Sizegrip
@anchor{library/tkinter ttk bugs}@anchor{46fc}
@subsubsection Bugs



@itemize *

@item 
If the containing toplevel’s position was specified relative to the right
or bottom of the screen (for example, ….), the @ref{46c7,,Sizegrip} widget
will not resize the window.

@item 
This widget supports only “southeast” resizing.
@end itemize

@node Treeview,Ttk styling,Sizegrip,tkinter ttk — Tk themed widgets
@anchor{library/tkinter ttk treeview}@anchor{46fd}
@subsubsection Treeview


The @ref{c8d,,ttk.Treeview} widget displays a hierarchical collection
of items.
Each item has a textual label, an optional image, and an optional list of data
values.
The data values are displayed in successive columns after the tree label.

The order in which data values are displayed may be controlled by setting
the widget option @code{displaycolumns}. The tree widget can also display column
headings. Columns may be accessed by number or symbolic names listed in the
widget option columns. See @ref{46fe,,Column Identifiers}.

Each item is identified by a unique name. The widget will generate item IDs
if they are not supplied by the caller. There is a distinguished root item,
named @code{@{@}}. The root item itself is not displayed; its children appear at the
top level of the hierarchy.

Each item also has a list of tags, which can be used to associate event bindings
with individual items and control the appearance of the item.

The Treeview widget supports horizontal and vertical scrolling, according to
the options described in @ref{46cc,,Scrollable Widget Options} and the methods
@ref{46ff,,Treeview.xview()} and @ref{4700,,Treeview.yview()}.

@menu
* Options: Options<6>. 
* Item options:: 
* Tag options:: 
* Column identifiers:: 
* Virtual events: Virtual events<4>. 
* ttk.Treeview: ttk Treeview. 

@end menu

@node Options<6>,Item options,,Treeview
@anchor{library/tkinter ttk id7}@anchor{4701}
@subsubsection Options


This widget accepts the following specific options:


@multitable {xxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Option

@tab

Description

@item

columns

@tab

A list of column identifiers, specifying the number of
columns and their names.

@item

displaycolumns

@tab

A list of column identifiers (either symbolic or
integer indices) specifying which data columns are
displayed and the order in which they appear, or the
string “#all”.

@item

height

@tab

Specifies the number of rows which should be visible.
Note: the requested width is determined from the sum
of the column widths.

@item

padding

@tab

Specifies the internal padding for the widget. The
padding is a list of up to four length specifications.

@item

selectmode

@tab

Controls how the built-in class bindings manage the
selection. One of “extended”, “browse” or “none”.
If set to “extended” (the default), multiple items may
be selected. If “browse”, only a single item will be
selected at a time. If “none”, the selection will not
be changed.

Note that the application code and tag bindings can set
the selection however they wish, regardless of the
value  of this option.

@item

show

@tab

A list containing zero or more of the following values,
specifying which elements of the tree to display.


@itemize *

@item 
tree: display tree labels in column #0.

@item 
headings: display the heading row.
@end itemize

The default is “tree headings”, that is, show all
elements.

`Note': Column #0 always refers to the tree column,
even if show=”tree” is not specified.

@end multitable


@cartouche
@quotation Note 
Tk 9.0 added several @ref{c8d,,Treeview} features.
The `selectmode' option gained the values @code{"single"} and @code{"multiple"};
the new widget options `selecttype' (@code{"item"} or @code{"cell"} selection),
`striped' (zebra-striped rows), and `titlecolumns' / `titleitems' (columns
or rows frozen against scrolling) were introduced; and items gained a
`hidden' option.
Tk 9.1 added the `rowheight' and `headingheight' options.
@end quotation
@end cartouche

@node Item options,Tag options,Options<6>,Treeview
@anchor{library/tkinter ttk item-options}@anchor{4702}
@subsubsection Item options


The following item options may be specified for items in the insert and item
widget commands.


@multitable {xxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Option

@tab

Description

@item

text

@tab

The textual label to display for the item.

@item

image

@tab

A Tk Image, displayed to the left of the label.

@item

values

@tab

The list of values associated with the item.

Each item should have the same number of values as the widget
option columns. If there are fewer values than columns, the
remaining values are assumed empty. If there are more values
than columns, the extra values are ignored.

@item

open

@tab

@code{True}/@code{False} value indicating whether the item’s
children should be displayed or hidden.

@item

tags

@tab

A list of tags associated with this item.

@end multitable


@node Tag options,Column identifiers,Item options,Treeview
@anchor{library/tkinter ttk tag-options}@anchor{4703}
@subsubsection Tag options


The following options may be specified on tags:


@multitable {xxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Option

@tab

Description

@item

foreground

@tab

Specifies the text foreground color.

@item

background

@tab

Specifies the cell or item background color.

@item

font

@tab

Specifies the font to use when drawing text.

@item

image

@tab

Specifies the item image, in case the item’s image option
is empty.

@end multitable


@node Column identifiers,Virtual events<4>,Tag options,Treeview
@anchor{library/tkinter ttk column-identifiers}@anchor{46fe}
@subsubsection Column identifiers


Column identifiers take any of the following forms:


@itemize *

@item 
A symbolic name from the list of columns option.

@item 
An integer n, specifying the nth data column.

@item 
A string of the form #n, where n is an integer, specifying the nth display
column.
@end itemize

Notes:


@itemize *

@item 
Item’s option values may be displayed in a different order than the order
in which they are stored.

@item 
Column #0 always refers to the tree column, even if show=”tree” is not
specified.
@end itemize

A data column number is an index into an item’s option values list; a display
column number is the column number in the tree where the values are displayed.
Tree labels are displayed in column #0. If option displaycolumns is not set,
then data column n is displayed in column #n+1. Again, `column #0 always
refers to the tree column'.

@node Virtual events<4>,ttk Treeview,Column identifiers,Treeview
@anchor{library/tkinter ttk id8}@anchor{4704}
@subsubsection Virtual events


The Treeview widget generates the following virtual events.


@multitable {xxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Event

@tab

Description

@item

<<TreeviewSelect>>

@tab

Generated whenever the selection changes.

@item

<<TreeviewOpen>>

@tab

Generated just before settings the focus item to
open=True.

@item

<<TreeviewClose>>

@tab

Generated just after setting the focus item to
open=False.

@end multitable


The @ref{4705,,Treeview.focus()} and @ref{c8c,,Treeview.selection()} methods can be used
to determine the affected item or items.

@node ttk Treeview,,Virtual events<4>,Treeview
@anchor{library/tkinter ttk ttk-treeview}@anchor{4706}
@subsubsection ttk.Treeview


@geindex Treeview (class in tkinter.ttk)
@anchor{library/tkinter ttk tkinter ttk Treeview}@anchor{c8d}
@deffn {Class} tkinter.ttk.Treeview

@geindex bbox() (tkinter.ttk.Treeview method)
@anchor{library/tkinter ttk tkinter ttk Treeview bbox}@anchor{4707}
@deffn {Method} bbox (item, column=None)

Returns the bounding box (relative to the treeview widget’s window) of
the specified `item' in the form (x, y, width, height).

If `column' is specified, returns the bounding box of that cell. If the
`item' is not visible (that is, if it is a descendant of a closed item
or is scrolled offscreen), returns an empty string.
@end deffn

@geindex get_children() (tkinter.ttk.Treeview method)
@anchor{library/tkinter ttk tkinter ttk Treeview get_children}@anchor{4708}
@deffn {Method} get_children (item=None)

Returns a tuple of children belonging to `item'.

If `item' is not specified, returns root children.
@end deffn

@geindex set_children() (tkinter.ttk.Treeview method)
@anchor{library/tkinter ttk tkinter ttk Treeview set_children}@anchor{4709}
@deffn {Method} set_children (item, *newchildren)

Replaces `item'’s children with `newchildren'.

Children present in `item' that are not present in `newchildren' are
detached from the tree. No items in `newchildren' may be an ancestor of
`item'. Note that not specifying `newchildren' results in detaching
`item'’s children.
@end deffn

@geindex column() (tkinter.ttk.Treeview method)
@anchor{library/tkinter ttk tkinter ttk Treeview column}@anchor{470a}
@deffn {Method} column (column, option=None, **kw)

Query or modify the options for the specified `column'.

If `kw' is not given, returns a dict of the column option values. If
`option' is specified then the value for that `option' is returned.
Otherwise, sets the options to the corresponding values.

The valid options/values are:


@table @asis

@item `id'

Returns the column name. This is a read-only option.

@item `anchor': One of the standard Tk anchor values.

Specifies how the text in this column should be aligned with respect
to the cell.

@item `minwidth': width

The minimum width of the column in pixels. The treeview widget will
not make the column any smaller than specified by this option when
the widget is resized or the user drags a column.

@item `stretch': @code{True}/@code{False}

Specifies whether the column’s width should be adjusted when
the widget is resized.

@item `width': width

The width of the column in pixels.
@end table

To configure the tree column, call this with column = “#0”
@end deffn

@geindex delete() (tkinter.ttk.Treeview method)
@anchor{library/tkinter ttk tkinter ttk Treeview delete}@anchor{470b}
@deffn {Method} delete (*items)

Delete all specified `items' and all their descendants.

The root item may not be deleted.
@end deffn

@geindex detach() (tkinter.ttk.Treeview method)
@anchor{library/tkinter ttk tkinter ttk Treeview detach}@anchor{470c}
@deffn {Method} detach (*items)

Unlinks all of the specified `items' from the tree.

The items and all of their descendants are still present, and may be
reinserted at another point in the tree, but will not be displayed.

The root item may not be detached.
@end deffn

@geindex exists() (tkinter.ttk.Treeview method)
@anchor{library/tkinter ttk tkinter ttk Treeview exists}@anchor{470d}
@deffn {Method} exists (item)

Returns @code{True} if the specified `item' is present in the tree,
@code{False} otherwise.
@end deffn

@geindex focus() (tkinter.ttk.Treeview method)
@anchor{library/tkinter ttk tkinter ttk Treeview focus}@anchor{4705}
@deffn {Method} focus (item=None)

If `item' is specified, sets the focus item to `item'. Otherwise, returns
the current focus item, or ‘’ if there is none.
@end deffn

@geindex heading() (tkinter.ttk.Treeview method)
@anchor{library/tkinter ttk tkinter ttk Treeview heading}@anchor{470e}
@deffn {Method} heading (column, option=None, **kw)

Query or modify the heading options for the specified `column'.

If `kw' is not given, returns a dict of the heading option values. If
`option' is specified then the value for that `option' is returned.
Otherwise, sets the options to the corresponding values.

The valid options/values are:


@table @asis

@item `text': text

The text to display in the column heading.

@item `image': imageName

Specifies an image to display to the right of the column heading.

@item `anchor': anchor

Specifies how the heading text should be aligned. One of the standard
Tk anchor values.

@item `command': callback

A callback to be invoked when the heading label is pressed.
@end table

To configure the tree column heading, call this with column = “#0”.
@end deffn

@geindex identify() (tkinter.ttk.Treeview method)
@anchor{library/tkinter ttk tkinter ttk Treeview identify}@anchor{470f}
@deffn {Method} identify (component, x, y)

Returns a description of the specified `component' under the point given
by `x' and `y', or the empty string if no such `component' is present at
that position.
@end deffn

@geindex identify_row() (tkinter.ttk.Treeview method)
@anchor{library/tkinter ttk tkinter ttk Treeview identify_row}@anchor{4710}
@deffn {Method} identify_row (y)

Returns the item ID of the item at position `y'.
@end deffn

@geindex identify_column() (tkinter.ttk.Treeview method)
@anchor{library/tkinter ttk tkinter ttk Treeview identify_column}@anchor{4711}
@deffn {Method} identify_column (x)

Returns the display column identifier of the cell at position `x'.

The tree column has ID #0.
@end deffn

@geindex identify_region() (tkinter.ttk.Treeview method)
@anchor{library/tkinter ttk tkinter ttk Treeview identify_region}@anchor{4712}
@deffn {Method} identify_region (x, y)

Returns one of:


@multitable {xxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

region

@tab

meaning

@item

heading

@tab

Tree heading area.

@item

separator

@tab

Space between two columns headings.

@item

tree

@tab

The tree area.

@item

cell

@tab

A data cell.

@end multitable


Availability: Tk 8.6.
@end deffn

@geindex identify_element() (tkinter.ttk.Treeview method)
@anchor{library/tkinter ttk tkinter ttk Treeview identify_element}@anchor{4713}
@deffn {Method} identify_element (x, y)

Returns the element at position `x', `y'.

Availability: Tk 8.6.
@end deffn

@geindex index() (tkinter.ttk.Treeview method)
@anchor{library/tkinter ttk tkinter ttk Treeview index}@anchor{4714}
@deffn {Method} index (item)

Returns the integer index of `item' within its parent’s list of children.
@end deffn

@geindex insert() (tkinter.ttk.Treeview method)
@anchor{library/tkinter ttk tkinter ttk Treeview insert}@anchor{4715}
@deffn {Method} insert (parent, index, iid=None, **kw)

Creates a new item and returns the item identifier of the newly created
item.

`parent' is the item ID of the parent item, or the empty string to create
a new top-level item. `index' is an integer, or the value “end”,
specifying where in the list of parent’s children to insert the new item.
If `index' is less than or equal to zero, the new node is inserted at
the beginning; if `index' is greater than or equal to the current number
of children, it is inserted at the end. If `iid' is specified, it is used
as the item identifier; `iid' must not already exist in the tree.
Otherwise, a new unique identifier is generated.

See @ref{4702,,Item Options} for the list of available options.
@end deffn

@geindex item() (tkinter.ttk.Treeview method)
@anchor{library/tkinter ttk tkinter ttk Treeview item}@anchor{4716}
@deffn {Method} item (item, option=None, **kw)

Query or modify the options for the specified `item'.

If no options are given, a dict with options/values for the item is
returned.
If `option' is specified then the value for that option is returned.
Otherwise, sets the options to the corresponding values as given by `kw'.
@end deffn

@geindex reattach() (tkinter.ttk.Treeview method)

@geindex move() (tkinter.ttk.Treeview method)
@anchor{library/tkinter ttk tkinter ttk Treeview reattach}@anchor{4717}@anchor{library/tkinter ttk tkinter ttk Treeview move}@anchor{4718}
@deffn {Method} move (item, parent, index)

Moves `item' to position `index' in `parent'’s list of children.

It is illegal to move an item under one of its descendants. If `index' is
less than or equal to zero, `item' is moved to the beginning; if greater
than or equal to the number of children, it is moved to the end. If `item'
was detached it is reattached.

@ref{4717,,reattach()} is an alias of @code{move()}.
@end deffn

@geindex next() (tkinter.ttk.Treeview method)
@anchor{library/tkinter ttk tkinter ttk Treeview next}@anchor{4719}
@deffn {Method} next (item)

Returns the identifier of `item'’s next sibling, or ‘’ if `item' is the
last child of its parent.
@end deffn

@geindex parent() (tkinter.ttk.Treeview method)
@anchor{library/tkinter ttk tkinter ttk Treeview parent}@anchor{471a}
@deffn {Method} parent (item)

Returns the ID of the parent of `item', or ‘’ if `item' is at the top
level of the hierarchy.
@end deffn

@geindex prev() (tkinter.ttk.Treeview method)
@anchor{library/tkinter ttk tkinter ttk Treeview prev}@anchor{471b}
@deffn {Method} prev (item)

Returns the identifier of `item'’s previous sibling, or ‘’ if `item' is
the first child of its parent.
@end deffn

@geindex see() (tkinter.ttk.Treeview method)
@anchor{library/tkinter ttk tkinter ttk Treeview see}@anchor{471c}
@deffn {Method} see (item)

Ensure that `item' is visible.

Sets all of `item'’s ancestors open option to @code{True}, and scrolls the
widget if necessary so that `item' is within the visible portion of
the tree.
@end deffn

@geindex selection() (tkinter.ttk.Treeview method)
@anchor{library/tkinter ttk tkinter ttk Treeview selection}@anchor{c8c}
@deffn {Method} selection ()

Returns a tuple of selected items.


Changed in version 3.8: @code{selection()} no longer takes arguments.  For changing the selection
state use the following selection methods.

@end deffn

@geindex selection_set() (tkinter.ttk.Treeview method)
@anchor{library/tkinter ttk tkinter ttk Treeview selection_set}@anchor{c8e}
@deffn {Method} selection_set (*items)

`items' becomes the new selection.


Changed in version 3.6: `items' can be passed as separate arguments, not just as a single tuple.

@end deffn

@geindex selection_add() (tkinter.ttk.Treeview method)
@anchor{library/tkinter ttk tkinter ttk Treeview selection_add}@anchor{471d}
@deffn {Method} selection_add (*items)

Add `items' to the selection.


Changed in version 3.6: `items' can be passed as separate arguments, not just as a single tuple.

@end deffn

@geindex selection_remove() (tkinter.ttk.Treeview method)
@anchor{library/tkinter ttk tkinter ttk Treeview selection_remove}@anchor{471e}
@deffn {Method} selection_remove (*items)

Remove `items' from the selection.


Changed in version 3.6: `items' can be passed as separate arguments, not just as a single tuple.

@end deffn

@geindex selection_toggle() (tkinter.ttk.Treeview method)
@anchor{library/tkinter ttk tkinter ttk Treeview selection_toggle}@anchor{471f}
@deffn {Method} selection_toggle (*items)

Toggle the selection state of each item in `items'.


Changed in version 3.6: `items' can be passed as separate arguments, not just as a single tuple.

@end deffn

@geindex set() (tkinter.ttk.Treeview method)
@anchor{library/tkinter ttk tkinter ttk Treeview set}@anchor{4720}
@deffn {Method} set (item, column=None, value=None)

With one argument, returns a dictionary of column/value pairs for the
specified `item'. With two arguments, returns the current value of the
specified `column'. With three arguments, sets the value of given
`column' in given `item' to the specified `value'.
@end deffn

@geindex tag_bind() (tkinter.ttk.Treeview method)
@anchor{library/tkinter ttk tkinter ttk Treeview tag_bind}@anchor{4721}
@deffn {Method} tag_bind (tagname, sequence=None, callback=None)

Bind a callback for the given event `sequence' to the tag `tagname'.
When an event is delivered to an item, the callbacks for each of the
item’s tags option are called.
@end deffn

@geindex tag_configure() (tkinter.ttk.Treeview method)
@anchor{library/tkinter ttk tkinter ttk Treeview tag_configure}@anchor{4722}
@deffn {Method} tag_configure (tagname, option=None, **kw)

Query or modify the options for the specified `tagname'.

If `kw' is not given, returns a dict of the option settings for
`tagname'. If `option' is specified, returns the value for that `option'
for the specified `tagname'. Otherwise, sets the options to the
corresponding values for the given `tagname'.
@end deffn

@geindex tag_has() (tkinter.ttk.Treeview method)
@anchor{library/tkinter ttk tkinter ttk Treeview tag_has}@anchor{4723}
@deffn {Method} tag_has (tagname, item=None)

If `item' is specified, returns @code{True} if the specified `item' has the
given `tagname' and @code{False} otherwise.
Otherwise, returns a tuple of all items that have the specified tag.

Availability: Tk 8.6
@end deffn

@geindex xview() (tkinter.ttk.Treeview method)
@anchor{library/tkinter ttk tkinter ttk Treeview xview}@anchor{46ff}
@deffn {Method} xview (*args)

Query or modify horizontal position of the treeview.
@end deffn

@geindex yview() (tkinter.ttk.Treeview method)
@anchor{library/tkinter ttk tkinter ttk Treeview yview}@anchor{4700}
@deffn {Method} yview (*args)

Query or modify vertical position of the treeview.
@end deffn
@end deffn

@node Ttk styling,Additional widgets,Treeview,tkinter ttk — Tk themed widgets
@anchor{library/tkinter ttk ttk-styling}@anchor{4724}@anchor{library/tkinter ttk ttkstyling}@anchor{46c9}
@subsubsection Ttk styling


Each widget in @code{ttk} is assigned a style, which specifies the set of
elements making up the widget and how they are arranged, along with dynamic and
default settings for element options.
By default the style name is the same as the widget’s class name, but it may be
overridden by the widget’s style option.
If you don’t know the class name of a widget, use the method
@ref{441c,,Misc.winfo_class} (somewidget.winfo_class()).


@subsubheading See also



@table @asis

@item Tcl'2004 conference presentation@footnote{https://tktable.sourceforge.net/tile/tile-tcl2004.pdf}

This document explains how the theme engine works
@end table


@geindex Style (class in tkinter.ttk)
@anchor{library/tkinter ttk tkinter ttk Style}@anchor{560}
@deffn {Class} tkinter.ttk.Style

This class is used to manipulate the style database.

@geindex configure() (tkinter.ttk.Style method)
@anchor{library/tkinter ttk tkinter ttk Style configure}@anchor{4725}
@deffn {Method} configure (style, query_opt=None, **kw)

Query or set the default value of the specified option(s) in `style'.

Each key in `kw' is an option and each value is a string identifying
the value for that option.

For example, to change every default button to be a flat button with
some padding and a different background color:

@example
from tkinter import ttk
import tkinter

root = tkinter.Tk()

ttk.Style().configure("TButton", padding=6, relief="flat",
   background="#ccc")

btn = ttk.Button(text="Sample")
btn.pack()

root.mainloop()
@end example
@end deffn

@geindex map() (tkinter.ttk.Style method)
@anchor{library/tkinter ttk tkinter ttk Style map}@anchor{1d2a}
@deffn {Method} map (style, query_opt=None, **kw)

Query or sets dynamic values of the specified option(s) in `style'.

Each key in `kw' is an option and each value should be a list or a
tuple (usually) containing statespecs grouped in tuples, lists, or
some other preference. A statespec is a compound of one
or more states and then a value.

An example may make it more understandable:

@example
import tkinter
from tkinter import ttk

root = tkinter.Tk()

style = ttk.Style()
style.map("C.TButton",
    foreground=[('pressed', 'red'), ('active', 'blue')],
    background=[('pressed', '!disabled', 'black'), ('active', 'white')]
    )

colored_btn = ttk.Button(text="Test", style="C.TButton").pack()

root.mainloop()
@end example

Note that the order of the (states, value) sequences for an option does
matter, if the order is changed to @code{[('active', 'blue'), ('pressed',
'red')]} in the foreground option, for example, the result would be a
blue foreground when the widget were in active or pressed states.

When called to query the map (without specifying values to set), it
returns a dictionary mapping each option to its list of statespecs.


Changed in version 3.10: The value returned when querying the map was corrected.

@end deffn

@geindex lookup() (tkinter.ttk.Style method)
@anchor{library/tkinter ttk tkinter ttk Style lookup}@anchor{4726}
@deffn {Method} lookup (style, option, state=None, default=None)

Returns the value specified for `option' in `style'.

If `state' is specified, it is expected to be a sequence of one or more
states. If the `default' argument is set, it is used as a fallback value
in case no specification for option is found.

To check what font a Button uses by default:

@example
from tkinter import ttk

print(ttk.Style().lookup("TButton", "font"))
@end example
@end deffn

@geindex layout() (tkinter.ttk.Style method)
@anchor{library/tkinter ttk tkinter ttk Style layout}@anchor{4727}
@deffn {Method} layout (style, layoutspec=None)

Define the widget layout for given `style'. If `layoutspec' is omitted,
return the layout specification for given style.

`layoutspec', if specified, is expected to be a list or some other
sequence type (excluding strings), where each item should be a tuple and
the first item is the layout name and the second item should have the
format described in @ref{4728,,Layouts}.

To understand the format, see the following example (it is not
intended to do anything useful):

@example
from tkinter import ttk
import tkinter

root = tkinter.Tk()

style = ttk.Style()
style.layout("TMenubutton", [
   ("Menubutton.background", None),
   ("Menubutton.button", @{"children":
       [("Menubutton.focus", @{"children":
           [("Menubutton.padding", @{"children":
               [("Menubutton.label", @{"side": "left", "expand": 1@})]
           @})]
       @})]
   @}),
])

mbtn = ttk.Menubutton(text='Text')
mbtn.pack()
root.mainloop()
@end example
@end deffn

@geindex element_create() (tkinter.ttk.Style method)
@anchor{library/tkinter ttk tkinter ttk Style element_create}@anchor{55f}
@deffn {Method} element_create (elementname, etype, *args, **kw)

Create a new element in the current theme, of the given `etype' which is
expected to be either “image”, “from” or “vsapi”.
The latter is only available in Tk 8.6 on Windows.

If “image” is used, `args' should contain the default image name followed
by statespec/value pairs (this is the imagespec), and `kw' may have the
following options:


@table @asis

@item border=padding

padding is a list of up to four integers, specifying the left, top,
right, and bottom borders, respectively.

@item height=height

Specifies a minimum height for the element. If less than zero, the
base image’s height is used as a default.

@item padding=padding

Specifies the element’s interior padding. Defaults to border’s value
if not specified.

@item sticky=spec

Specifies how the image is placed within the final parcel. spec
contains zero or more characters “n”, “s”, “w”, or “e”.

@item width=width

Specifies a minimum width for the element. If less than zero, the
base image’s width is used as a default.
@end table

Example:

@example
img1 = tkinter.PhotoImage(master=root, file='button.png')
img1 = tkinter.PhotoImage(master=root, file='button-pressed.png')
img1 = tkinter.PhotoImage(master=root, file='button-active.png')
style = ttk.Style(root)
style.element_create('Button.button', 'image',
                     img1, ('pressed', img2), ('active', img3),
                     border=(2, 4), sticky='we')
@end example

If “from” is used as the value of `etype',
@code{element_create()} will clone an existing
element. `args' is expected to contain a themename, from which
the element will be cloned, and optionally an element to clone from.
If this element to clone from is not specified, an empty element will
be used. `kw' is discarded.

Example:

@example
style = ttk.Style(root)
style.element_create('plain.background', 'from', 'default')
@end example

If “vsapi” is used as the value of `etype', @code{element_create()}
will create a new element in the current theme whose visual appearance
is drawn using the Microsoft Visual Styles API which is responsible
for the themed styles on Windows XP and Vista.
`args' is expected to contain the Visual Styles class and part as
given in the Microsoft documentation followed by an optional sequence
of tuples of ttk states and the corresponding Visual Styles API state
value.
`kw' may have the following options:


@table @asis

@item padding=padding

Specify the element’s interior padding.
`padding' is a list of up to four integers specifying the left,
top, right and bottom padding quantities respectively.
If fewer than four elements are specified, bottom defaults to top,
right defaults to left, and top defaults to left.
In other words, a list of three numbers specify the left, vertical,
and right padding; a list of two numbers specify the horizontal
and the vertical padding; a single number specifies the same
padding all the way around the widget.
This option may not be mixed with any other options.

@item margins=padding

Specifies the elements exterior padding.
`padding' is a list of up to four integers specifying the left, top,
right and bottom padding quantities respectively.
This option may not be mixed with any other options.

@item width=width

Specifies the width for the element.
If this option is set then the Visual Styles API will not be queried
for the recommended size or the part.
If this option is set then `height' should also be set.
The `width' and `height' options cannot be mixed with the `padding'
or `margins' options.

@item height=height

Specifies the height of the element.
See the comments for `width'.
@end table

Example:

@example
style = ttk.Style(root)
style.element_create('pin', 'vsapi', 'EXPLORERBAR', 3, [
                     ('pressed', '!selected', 3),
                     ('active', '!selected', 2),
                     ('pressed', 'selected', 6),
                     ('active', 'selected', 5),
                     ('selected', 4),
                     ('@w{'}, 1)])
style.layout('Explorer.Pin',
             [('Explorer.Pin.pin', @{'sticky': 'news'@})])
pin = ttk.Checkbutton(style='Explorer.Pin')
pin.pack(expand=True, fill='both')
@end example


Changed in version 3.13: Added support of the “vsapi” element factory.

@end deffn

@geindex element_names() (tkinter.ttk.Style method)
@anchor{library/tkinter ttk tkinter ttk Style element_names}@anchor{4729}
@deffn {Method} element_names ()

Returns a tuple of elements defined in the current theme.
@end deffn

@geindex element_options() (tkinter.ttk.Style method)
@anchor{library/tkinter ttk tkinter ttk Style element_options}@anchor{472a}
@deffn {Method} element_options (elementname)

Returns a tuple of `elementname'’s options.
@end deffn

@geindex theme_create() (tkinter.ttk.Style method)
@anchor{library/tkinter ttk tkinter ttk Style theme_create}@anchor{472b}
@deffn {Method} theme_create (themename, parent=None, settings=None)

Create a new theme.

It is an error if `themename' already exists. If `parent' is specified,
the new theme will inherit styles, elements and layouts from the parent
theme. If `settings' are present they are expected to have the same
syntax used for @ref{472c,,theme_settings()}.
@end deffn

@geindex theme_settings() (tkinter.ttk.Style method)
@anchor{library/tkinter ttk tkinter ttk Style theme_settings}@anchor{472c}
@deffn {Method} theme_settings (themename, settings)

Temporarily sets the current theme to `themename', apply specified
`settings' and then restore the previous theme.

Each key in `settings' is a style and each value may contain the keys
‘configure’, ‘map’, ‘layout’ and ‘element create’ and they are expected
to have the same format as specified by the methods
@ref{4725,,Style.configure()}, @ref{1d2a,,Style.map()}, @ref{4727,,Style.layout()} and
@ref{55f,,Style.element_create()} respectively.

As an example, let’s change the Combobox for the default theme a bit:

@example
from tkinter import ttk
import tkinter

root = tkinter.Tk()

style = ttk.Style()
style.theme_settings("default", @{
   "TCombobox": @{
       "configure": @{"padding": 5@},
       "map": @{
           "background": [("active", "green2"),
                          ("!disabled", "green4")],
           "fieldbackground": [("!disabled", "green3")],
           "foreground": [("focus", "OliveDrab1"),
                          ("!disabled", "OliveDrab2")]
       @}
   @}
@})

combo = ttk.Combobox().pack()

root.mainloop()
@end example
@end deffn

@geindex theme_names() (tkinter.ttk.Style method)
@anchor{library/tkinter ttk tkinter ttk Style theme_names}@anchor{472d}
@deffn {Method} theme_names ()

Returns a tuple of all known themes.
@end deffn

@geindex theme_use() (tkinter.ttk.Style method)
@anchor{library/tkinter ttk tkinter ttk Style theme_use}@anchor{472e}
@deffn {Method} theme_use (themename=None)

If `themename' is not given, returns the theme in use.  Otherwise, sets
the current theme to `themename', refreshes all widgets and emits a
<<ThemeChanged>> event.
@end deffn
@end deffn

@menu
* Layouts:: 

@end menu

@node Layouts,,,Ttk styling
@anchor{library/tkinter ttk layouts}@anchor{4728}
@subsubsection Layouts


A layout can be just @code{None}, if it takes no options, or a dict of
options specifying how to arrange the element. The layout mechanism
uses a simplified version of the pack geometry manager: given an
initial cavity, each element is allocated a parcel.

The valid options/values are:


@table @asis

@item `side': whichside

Specifies which side of the cavity to place the element; one of
top, right, bottom or left. If omitted, the element occupies the
entire cavity.

@item `sticky': nswe

Specifies where the element is placed inside its allocated parcel.

@item `unit': 0 or 1

If set to 1, causes the element and all of its descendants to be treated as
a single element for the purposes of @ref{46d2,,Widget.identify()} et al. It’s
used for things like scrollbar thumbs with grips.

@item `children': [sublayout… ]

Specifies a list of elements to place inside the element. Each
element is a tuple (or other sequence type) where the first item is
the layout name, and the other is a @ref{4728,,Layout}.
@end table

@node Additional widgets,,Ttk styling,tkinter ttk — Tk themed widgets
@anchor{library/tkinter ttk additional-widgets}@anchor{472f}@anchor{library/tkinter ttk layout}@anchor{4730}
@subsubsection Additional widgets


The following themed widgets complete the @code{tkinter.ttk} widget set.
Each is the themed counterpart of the like-named classic @ref{f6,,tkinter} widget
and inherits the common methods of @ref{46c8,,Widget}.

@geindex Button (class in tkinter.ttk)
@anchor{library/tkinter ttk tkinter ttk Button}@anchor{4380}
@deffn {Class} tkinter.ttk.Button (master=None, **kw)

Ttk @code{Button} widget, displays a textual label and/or image, and
evaluates a command when pressed.
It is the themed counterpart of @ref{44bf,,tkinter.Button} and inherits the
common widget methods from @ref{46c8,,Widget}.

@geindex invoke() (tkinter.ttk.Button method)
@anchor{library/tkinter ttk tkinter ttk Button invoke}@anchor{4386}
@deffn {Method} invoke ()

Invoke the command associated with the button and return its result.
@end deffn
@end deffn

@geindex Checkbutton (class in tkinter.ttk)
@anchor{library/tkinter ttk tkinter ttk Checkbutton}@anchor{1a0a}
@deffn {Class} tkinter.ttk.Checkbutton (master=None, **kw)

Ttk @code{Checkbutton} widget, used to control a boolean variable that is
toggled on and off.
It is the themed counterpart of @ref{1a09,,tkinter.Checkbutton} and inherits
the common widget methods from @ref{46c8,,Widget}.

@geindex invoke() (tkinter.ttk.Checkbutton method)
@anchor{library/tkinter ttk tkinter ttk Checkbutton invoke}@anchor{4731}
@deffn {Method} invoke ()

Toggle the button between its selected and deselected states, invoke the
command associated with the button, and return its result.
@end deffn
@end deffn

@geindex Entry (class in tkinter.ttk)
@anchor{library/tkinter ttk tkinter ttk Entry}@anchor{46bb}
@deffn {Class} tkinter.ttk.Entry (master=None, widget=None, **kw)

Ttk @code{Entry} widget, displays a one-line text string and allows the
user to edit it.
It is the themed counterpart of @ref{44b3,,tkinter.Entry} and inherits the
common widget methods from @ref{46c8,,Widget} as well as the editing methods
from @code{tkinter.Entry}.

@geindex bbox() (tkinter.ttk.Entry method)
@anchor{library/tkinter ttk tkinter ttk Entry bbox}@anchor{46d5}
@deffn {Method} bbox (index)

Return a tuple @code{(x, y, width, height)} giving the bounding box of the
character at the given `index'.
@end deffn

@geindex identify() (tkinter.ttk.Entry method)
@anchor{library/tkinter ttk tkinter ttk Entry identify}@anchor{4732}
@deffn {Method} identify (x, y)

Return the name of the element under the point given by `x' and `y', or
the empty string if no element is present at that location.
@end deffn

@geindex validate() (tkinter.ttk.Entry method)
@anchor{library/tkinter ttk tkinter ttk Entry validate}@anchor{4733}
@deffn {Method} validate ()

Force validation of the entry and return @code{True} if validation
succeeded, and @code{False} otherwise.
@end deffn
@end deffn

@geindex Frame (class in tkinter.ttk)
@anchor{library/tkinter ttk tkinter ttk Frame}@anchor{437e}
@deffn {Class} tkinter.ttk.Frame (master=None, **kw)

Ttk @code{Frame} widget, a container used to group and lay out other
widgets.
It is the themed counterpart of @ref{440f,,tkinter.Frame} and inherits the
common widget methods from @ref{46c8,,Widget}.
@end deffn

@geindex Label (class in tkinter.ttk)
@anchor{library/tkinter ttk tkinter ttk Label}@anchor{437f}
@deffn {Class} tkinter.ttk.Label (master=None, **kw)

Ttk @code{Label} widget, displays a textual label and/or image.
It is the themed counterpart of @ref{44c0,,tkinter.Label} and inherits the
common widget methods from @ref{46c8,,Widget}.
@end deffn

@geindex Labelframe (class in tkinter.ttk)
@anchor{library/tkinter ttk tkinter ttk Labelframe}@anchor{4734}
@deffn {Class} tkinter.ttk.Labelframe (master=None, **kw)

Ttk @code{Labelframe} widget, a container that draws a border and a title
label around its contents.
It is the themed counterpart of @ref{446f,,tkinter.LabelFrame} and inherits the
common widget methods from @ref{46c8,,Widget}.
@end deffn

@geindex Menubutton (class in tkinter.ttk)
@anchor{library/tkinter ttk tkinter ttk Menubutton}@anchor{46bd}
@deffn {Class} tkinter.ttk.Menubutton (master=None, **kw)

Ttk @code{Menubutton} widget, displays a textual label and/or image, and
pops up a menu when pressed.
It is the themed counterpart of @ref{4546,,tkinter.Menubutton} and inherits the
common widget methods from @ref{46c8,,Widget}.
@end deffn

@geindex OptionMenu (class in tkinter.ttk)
@anchor{library/tkinter ttk tkinter ttk OptionMenu}@anchor{4735}
@deffn {Class} tkinter.ttk.OptionMenu (master, variable, default=None, *values, **kwargs)

Ttk @code{OptionMenu} widget, a @ref{46bd,,Menubutton} that pops up a menu of
mutually exclusive choices.
`variable' is the variable that tracks the currently selected value,
`default' is the value to set initially, and `values' are the entries to
display in the menu.
A `command' keyword argument may be given to specify a callable that is
invoked with the selected value whenever the selection changes; the `style'
keyword argument sets the style used by the underlying menubutton; and the
`name' keyword argument sets the Tk widget name.

@geindex set_menu() (tkinter.ttk.OptionMenu method)
@anchor{library/tkinter ttk tkinter ttk OptionMenu set_menu}@anchor{4736}
@deffn {Method} set_menu (default=None, *values)

Replace the entries of the menu with `values'.
If `default' is given, also set it as the current value of the
`variable'.
@end deffn

@geindex destroy() (tkinter.ttk.OptionMenu method)
@anchor{library/tkinter ttk tkinter ttk OptionMenu destroy}@anchor{4737}
@deffn {Method} destroy ()

Destroy this widget and its associated menu.
@end deffn


Changed in version 3.14: Added support for the `name' keyword argument.

@end deffn

@geindex Panedwindow (class in tkinter.ttk)
@anchor{library/tkinter ttk tkinter ttk Panedwindow}@anchor{4738}
@deffn {Class} tkinter.ttk.Panedwindow (master=None, **kw)

Ttk @code{Panedwindow} widget, displays a number of subwindows stacked
either vertically or horizontally.
The user may adjust the relative sizes of the subwindows by dragging the
sash between panes.
It is the themed counterpart of @ref{454a,,tkinter.PanedWindow} and inherits
the common widget methods from @ref{46c8,,Widget}, as well as the @code{add()}
and @code{panes()} methods from @code{tkinter.PanedWindow}.

@geindex insert() (tkinter.ttk.Panedwindow method)
@anchor{library/tkinter ttk tkinter ttk Panedwindow insert}@anchor{4739}
@deffn {Method} insert (pos, child, **kw)

Insert a pane containing `child' at the position `pos'.
`pos' is either the string @code{'end'}, an integer index, or the name of a
managed subwindow.
If `child' is already managed by the paned window, move it to the
specified position.
Any keyword arguments set pane options.
@end deffn

@geindex forget() (tkinter.ttk.Panedwindow method)
@anchor{library/tkinter ttk tkinter ttk Panedwindow forget}@anchor{473a}
@deffn {Method} forget (child)

Remove `child', which may be either an integer index or the name of a
managed subwindow, from the panes.
@end deffn

@geindex pane() (tkinter.ttk.Panedwindow method)
@anchor{library/tkinter ttk tkinter ttk Panedwindow pane}@anchor{473b}
@deffn {Method} pane (pane, option=None, **kw)

Query or modify the options of the specified `pane', where `pane' is
either an integer index or the name of a managed subwindow.
If no arguments are given, return a dictionary of the pane option values.
If `option' is specified, return the value of that option.
Otherwise, set the options given as keyword arguments to their
corresponding values.
@end deffn

@geindex sashpos() (tkinter.ttk.Panedwindow method)
@anchor{library/tkinter ttk tkinter ttk Panedwindow sashpos}@anchor{473c}
@deffn {Method} sashpos (index, newpos=None)

If `newpos' is specified, set the position of sash number `index' and
return its new position.
This may adjust the positions of adjacent sashes to ensure that positions
are monotonically increasing; positions are also constrained to be
between 0 and the total size of the widget.
If `newpos' is omitted, return the current position of the sash.
@end deffn
@end deffn

@geindex Radiobutton (class in tkinter.ttk)
@anchor{library/tkinter ttk tkinter ttk Radiobutton}@anchor{46bf}
@deffn {Class} tkinter.ttk.Radiobutton (master=None, **kw)

Ttk @code{Radiobutton} widget, used as part of a group to control a single
shared variable by selecting one of several mutually exclusive values.
It is the themed counterpart of @ref{455b,,tkinter.Radiobutton} and inherits
the common widget methods from @ref{46c8,,Widget}.

@geindex invoke() (tkinter.ttk.Radiobutton method)
@anchor{library/tkinter ttk tkinter ttk Radiobutton invoke}@anchor{473d}
@deffn {Method} invoke ()

Set the option variable to the button’s value, select the button, invoke
the command associated with the button, and return its result.
@end deffn
@end deffn

@geindex Scale (class in tkinter.ttk)
@anchor{library/tkinter ttk tkinter ttk Scale}@anchor{46c0}
@deffn {Class} tkinter.ttk.Scale (master=None, **kw)

Ttk @code{Scale} widget, displays a slider that lets the user select a
numeric value from a range by moving the slider along a trough.
It is the themed counterpart of @ref{4560,,tkinter.Scale} and inherits the
common widget methods from @ref{46c8,,Widget}.

@geindex configure() (tkinter.ttk.Scale method)
@anchor{library/tkinter ttk tkinter ttk Scale configure}@anchor{473e}
@deffn {Method} configure (cnf=None, **kw)

Modify or query the widget options, like
@ref{4383,,Widget.configure}.
In addition, this method clips the @code{from} and @code{to} values so that the
current value stays within the range defined by them.


Changed in version 3.9: Now returns the configuration value, like
@ref{4383,,Widget.configure}.

@end deffn

@geindex get() (tkinter.ttk.Scale method)
@anchor{library/tkinter ttk tkinter ttk Scale get}@anchor{473f}
@deffn {Method} get (x=None, y=None)

Return the current value of the scale.
If `x' and `y' are given, return the value corresponding to the pixel
coordinate `x', `y' instead.
@end deffn
@end deffn

@geindex Scrollbar (class in tkinter.ttk)
@anchor{library/tkinter ttk tkinter ttk Scrollbar}@anchor{46c1}
@deffn {Class} tkinter.ttk.Scrollbar (master=None, **kw)

Ttk @code{Scrollbar} widget, controls the viewport of an associated
scrollable widget such as a @ref{c8d,,Treeview}, @ref{46bb,,Entry} or
@ref{1a3d,,tkinter.Text}.
It is the themed counterpart of @ref{44b7,,tkinter.Scrollbar} and inherits the
common widget methods from @ref{46c8,,Widget}, as well as the @code{set()} and
@code{get()} methods from @code{tkinter.Scrollbar}.
@end deffn

@geindex Separator (class in tkinter.ttk)
@anchor{library/tkinter ttk tkinter ttk Separator}@anchor{46c6}
@deffn {Class} tkinter.ttk.Separator (master=None, **kw)

Ttk @code{Separator} widget, displays a horizontal or vertical separator
line.
It has no direct counterpart in @ref{f6,,tkinter} and inherits the common
widget methods from @ref{46c8,,Widget}.
@end deffn

@geindex Sizegrip (class in tkinter.ttk)
@anchor{library/tkinter ttk tkinter ttk Sizegrip}@anchor{46c7}
@deffn {Class} tkinter.ttk.Sizegrip (master=None, **kw)

Ttk @code{Sizegrip} widget, displays a grip that allows the user to resize
the containing toplevel window by pressing and dragging the grip, typically
placed in the bottom-right corner.
It has no direct counterpart in @ref{f6,,tkinter} and inherits the common
widget methods from @ref{46c8,,Widget}.
@end deffn

@geindex LabeledScale (class in tkinter.ttk)
@anchor{library/tkinter ttk tkinter ttk LabeledScale}@anchor{1d16}
@deffn {Class} tkinter.ttk.LabeledScale (master=None, variable=None, from_=0, to=10, **kw)

A @ref{437e,,Frame} containing a @ref{46c0,,Scale} and a @ref{437f,,Label} that shows
the scale’s current value.
`variable' is the @ref{4397,,IntVar} tracked by the scale (one is
created if it is not given), and `from_' and `to' define the range of the
scale.

@geindex destroy() (tkinter.ttk.LabeledScale method)
@anchor{library/tkinter ttk tkinter ttk LabeledScale destroy}@anchor{4740}
@deffn {Method} destroy ()

Destroy this widget and remove the trace callback registered on the
associated variable.
@end deffn
@end deffn

@geindex LabelFrame (class in tkinter.ttk)
@anchor{library/tkinter ttk tkinter ttk LabelFrame}@anchor{46bc}
@deffn {Class} tkinter.ttk.LabelFrame (master=None, **kw)

Alias of @ref{4734,,Labelframe}, kept for naming compatibility with
@ref{446f,,tkinter.LabelFrame}.
@end deffn

@geindex PanedWindow (class in tkinter.ttk)
@anchor{library/tkinter ttk tkinter ttk PanedWindow}@anchor{46be}
@deffn {Class} tkinter.ttk.PanedWindow (master=None, **kw)

Alias of @ref{4738,,Panedwindow}, kept for naming compatibility with
@ref{454a,,tkinter.PanedWindow}.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node IDLE — Python editor and shell<2>,turtle — Turtle graphics,tkinter ttk — Tk themed widgets,Graphical user interfaces with Tk
@anchor{library/idle doc}@anchor{4741}@anchor{library/idle idle}@anchor{121b}@anchor{library/idle idle-python-editor-and-shell}@anchor{4742}@anchor{library/idle translation-repo}@anchor{4743}
@subsection IDLE — Python editor and shell


`Source code:' Lib/idlelib/@footnote{https://github.com/python/cpython/tree/3.14/Lib/idlelib/}

@geindex IDLE
@geindex Python Editor
@geindex Integrated Development Environment

@c Remember to update Lib/idlelib/help.html with idlelib.help.copy_strip() when modifying this file.


__________________________________________________________________


IDLE is Python’s Integrated Development and Learning Environment.

IDLE has the following features:


@itemize *

@item 
cross-platform: works mostly the same on Windows, Unix, and macOS

@item 
Python shell window (interactive interpreter) with colorizing
of code input, output, and error messages

@item 
multi-window text editor with multiple undo, Python colorizing,
smart indent, call tips, auto completion, and other features

@item 
search within any window, replace within editor windows, and search
through multiple files (grep)

@item 
debugger with persistent breakpoints, stepping, and viewing
of global and local namespaces

@item 
configuration, browsers, and other dialogs
@end itemize

The IDLE application is implemented in the @ref{77,,idlelib} package.

This is an @ref{219c,,optional module}.
If it is missing from your copy of CPython,
look for documentation from your distributor (that is,
whoever provided Python to you).
If you are the distributor, see @ref{219a,,Requirements for optional modules}.

@c Similar notes appear in the docs of the modules:
@c - zipfile
@c - tarfile

@menu
* Menus:: 
* Editing and Navigation:: 
* Startup and Code Execution:: 
* Help and Preferences:: 
* idlelib — implementation of IDLE application:: 

@end menu

@node Menus,Editing and Navigation,,IDLE — Python editor and shell<2>
@anchor{library/idle menus}@anchor{4744}
@subsubsection Menus


IDLE has two main window types, the Shell window and the Editor window.  It is
possible to have multiple editor windows simultaneously.  On Windows and
Linux, each has its own top menu.  Each menu documented below indicates
which window type it is associated with.

Output windows, such as used for Edit => Find in Files, are a subtype of editor
window.  They currently have the same top menu but a different
default title and context menu.

On macOS, there is one application menu.  It dynamically changes according
to the window currently selected.  It has an IDLE menu, and some entries
described below are moved around to conform to Apple guidelines.

@menu
* File menu (Shell and Editor): File menu Shell and Editor. 
* Edit menu (Shell and Editor): Edit menu Shell and Editor. 
* Format menu (Editor window only): Format menu Editor window only. 
* Run menu (Editor window only): Run menu Editor window only. 
* Shell menu (Shell window only): Shell menu Shell window only. 
* Debug menu (Shell window only): Debug menu Shell window only. 
* Options menu (Shell and Editor): Options menu Shell and Editor. 
* Window menu (Shell and Editor): Window menu Shell and Editor. 
* Help menu (Shell and Editor): Help menu Shell and Editor. 
* Context menus:: 

@end menu

@node File menu Shell and Editor,Edit menu Shell and Editor,,Menus
@anchor{library/idle file-menu-shell-and-editor}@anchor{4745}
@subsubsection File menu (Shell and Editor)



@table @asis

@item New File

Create a new file editing window.

@item Open…

Open an existing file with an Open dialog.

@item Open Module…

Open an existing module (searches sys.path).

@item Recent Files

Open a list of recent files.  Click one to open it.
@end table

@geindex Module browser
@geindex Path browser


@table @asis

@item Module Browser

Show functions, classes, and methods in the current Editor file in a
tree structure.  In the shell, open a module first.

@item Path Browser

Show sys.path directories, modules, functions, classes and methods in a
tree structure.

@item Save

Save the current window to the associated file, if there is one.  Windows
that have been changed since being opened or last saved have a * before
and after the window title.  If there is no associated file,
do Save As instead.

@item Save As…

Save the current window with a Save As dialog.  The file saved becomes the
new associated file for the window. (If your file manager is set to hide
extensions, the current extension will be omitted in the file name box.
If the new filename has no ‘.’, ‘.py’ and ‘.txt’ will be added for Python
and text files, except that on macOS Aqua,’.py’ is added for all files.)

@item Save Copy As…

Save the current window to different file without changing the associated
file.  (See Save As note above about filename extensions.)

@item Print Window

Print the current window to the default printer.

@item Close Window

Close the current window (if an unsaved editor, ask to save; if an unsaved
Shell, ask to quit execution).  Calling @code{exit()} or @code{close()} in the Shell
window also closes Shell.  If this is the only window, also exit IDLE.

@item Exit IDLE

Close all windows and quit IDLE (ask to save unsaved edit windows).
@end table

@node Edit menu Shell and Editor,Format menu Editor window only,File menu Shell and Editor,Menus
@anchor{library/idle edit-menu-shell-and-editor}@anchor{4746}
@subsubsection Edit menu (Shell and Editor)



@table @asis

@item Undo

Undo the last change to the current window.  A maximum of 1000 changes may
be undone.

@item Redo

Redo the last undone change to the current window.

@item Select All

Select the entire contents of the current window.

@item Cut

Copy selection into the system-wide clipboard; then delete the selection.

@item Copy

Copy selection into the system-wide clipboard.

@item Paste

Insert contents of the system-wide clipboard into the current window.
@end table

The clipboard functions are also available in context menus.


@table @asis

@item Find…

Open a search dialog with many options

@item Find Again

Repeat the last search, if there is one.

@item Find Selection

Search for the currently selected string, if there is one.

@item Find in Files…

Open a file search dialog.  Put results in a new output window.

@item Replace…

Open a search-and-replace dialog.

@item Go to Line

Move the cursor to the beginning of the line requested and make that
line visible.  A request past the end of the file goes to the end.
Clear any selection and update the line and column status.

@item Show Completions

Open a scrollable list allowing selection of existing names. See
@ref{4747,,Completions} in the Editing and Navigation section below.

@item Expand Word

Expand a prefix you have typed to match a full word in the same window;
repeat to get a different expansion.

@item Show Call Tip

After an unclosed parenthesis for a function, open a small window with
function parameter hints.  See @ref{4748,,Calltips} in the
Editing and Navigation section below.

@item Show Surrounding Parens

Highlight the surrounding parenthesis.
@end table

@node Format menu Editor window only,Run menu Editor window only,Edit menu Shell and Editor,Menus
@anchor{library/idle format-menu}@anchor{4749}@anchor{library/idle format-menu-editor-window-only}@anchor{474a}
@subsubsection Format menu (Editor window only)



@table @asis

@item Format Paragraph

Rewrap the text block containing the text insert cursor.
Avoid code lines.  See @ref{474b,,Format block} in the
Editing and Navigation section below.

@item Indent Region

Shift selected lines right by the indent width (default 4 spaces).

@item Dedent Region

Shift selected lines left by the indent width (default 4 spaces).

@item Comment Out Region

Insert ## in front of selected lines.

@item Uncomment Region

Remove leading # or ## from selected lines.

@item Tabify Region

Turn `leading' stretches of spaces into tabs. (Note: We recommend using
4 space blocks to indent Python code.)

@item Untabify Region

Turn `all' tabs into the correct number of spaces.

@item Toggle Tabs

Open a dialog to switch between indenting with spaces and tabs.

@item New Indent Width

Open a dialog to change indent width. The accepted default by the Python
community is 4 spaces.

@item Strip Trailing Whitespace

Remove trailing space and other whitespace characters after the last
non-whitespace character of a line by applying @ref{16bd,,str.rstrip()} to each line,
including lines within multiline strings.  Except for Shell windows,
remove extra newlines at the end of the file.
@end table

@geindex Run script

@node Run menu Editor window only,Shell menu Shell window only,Format menu Editor window only,Menus
@anchor{library/idle run-menu-editor-window-only}@anchor{474c}
@subsubsection Run menu (Editor window only)

@anchor{library/idle run-module}@anchor{474d}

@table @asis

@item Run Module

Do @ref{474e,,Check Module}.  If no error, restart the shell to clean the
environment, then execute the module.  Output is displayed in the Shell
window.  Note that output requires use of @code{print} or @code{write}.
When execution is complete, the Shell retains focus and displays a prompt.
At this point, one may interactively explore the result of execution.
This is similar to executing a file with @code{python -i file} at a command
line.
@end table
@anchor{library/idle run-custom}@anchor{474f}

@table @asis

@item Run… Customized

Same as @ref{474d,,Run Module}, but run the module with customized
settings.  `Command Line Arguments' extend @ref{1470,,sys.argv} as if passed
on a command line. The module can be run in the Shell without restarting.
@end table
@anchor{library/idle check-module}@anchor{474e}

@table @asis

@item Check Module

Check the syntax of the module currently open in the Editor window. If the
module has not been saved IDLE will either prompt the user to save or
autosave, as selected in the General tab of the Idle Settings dialog.  If
there is a syntax error, the approximate location is indicated in the
Editor window.
@end table
@anchor{library/idle python-shell}@anchor{4750}

@table @asis

@item Python Shell

Open or wake up the Python Shell window.
@end table

@node Shell menu Shell window only,Debug menu Shell window only,Run menu Editor window only,Menus
@anchor{library/idle shell-menu-shell-window-only}@anchor{4751}
@subsubsection Shell menu (Shell window only)



@table @asis

@item View Last Restart

Scroll the shell window to the last Shell restart.

@item Restart Shell

Restart the shell to clean the environment and reset display and exception handling.

@item Previous History

Cycle through earlier commands in history which match the current entry.

@item Next History

Cycle through later commands in history which match the current entry.

@item Interrupt Execution

Stop a running program.
@end table

@node Debug menu Shell window only,Options menu Shell and Editor,Shell menu Shell window only,Menus
@anchor{library/idle debug-menu-shell-window-only}@anchor{4752}
@subsubsection Debug menu (Shell window only)



@table @asis

@item Go to File/Line

Look on the current line. with the cursor, and the line above for a filename
and line number.  If found, open the file if not already open, and show the
line.  Use this to view source lines referenced in an exception traceback
and lines found by Find in Files. Also available in the context menu of
the Shell window and Output windows.
@end table

@geindex debugger
@geindex stack viewer


@table @asis

@item Debugger (toggle)

When activated, code entered in the Shell or run from an Editor will run
under the debugger.  In the Editor, breakpoints can be set with the context
menu.  This feature is still incomplete and somewhat experimental.

@item Stack Viewer

Show the stack traceback of the last exception in a tree widget, with
access to locals and globals.

@item Auto-open Stack Viewer

Toggle automatically opening the stack viewer on an unhandled exception.
@end table

@node Options menu Shell and Editor,Window menu Shell and Editor,Debug menu Shell window only,Menus
@anchor{library/idle options-menu-shell-and-editor}@anchor{4753}
@subsubsection Options menu (Shell and Editor)



@table @asis

@item Configure IDLE

Open a configuration dialog and change preferences for the following:
fonts, indentation, keybindings, text color themes, startup windows and
size, additional help sources, and extensions.  On macOS, open the
configuration dialog by selecting Preferences in the application
menu. For more details, see
@ref{4754,,Setting preferences} under Help and preferences.
@end table

Most configuration options apply to all windows or all future windows.
The option items below only apply to the active window.


@table @asis

@item Show/Hide Code Context (Editor Window only)

Open a pane at the top of the edit window which shows the block context
of the code which has scrolled above the top of the window.  See
@ref{4755,,Code Context} in the Editing and Navigation section
below.

@item Show/Hide Line Numbers (Editor Window only)

Open a column to the left of the edit window which shows the number
of each line of text.  The default is off, which may be changed in the
preferences (see @ref{4754,,Setting preferences}).

@item Zoom/Restore Height

Toggles the window between normal size and maximum height. The initial size
defaults to 40 lines by 80 chars unless changed on the General tab of the
Configure IDLE dialog.  The maximum height for a screen is determined by
momentarily maximizing a window the first time one is zoomed on the screen.
Changing screen settings may invalidate the saved height.  This toggle has
no effect when a window is maximized.
@end table

@node Window menu Shell and Editor,Help menu Shell and Editor,Options menu Shell and Editor,Menus
@anchor{library/idle window-menu-shell-and-editor}@anchor{4756}
@subsubsection Window menu (Shell and Editor)


Lists the names of all open windows; select one to bring it to the foreground
(deiconifying it if necessary).

@node Help menu Shell and Editor,Context menus,Window menu Shell and Editor,Menus
@anchor{library/idle help-menu-shell-and-editor}@anchor{4757}
@subsubsection Help menu (Shell and Editor)



@table @asis

@item About IDLE

Display version, copyright, license, credits, and more.

@item IDLE Help

Display this IDLE document, detailing the menu options, basic editing and
navigation, and other tips.

@item Python Docs

Access local Python documentation, if installed, or start a web browser
and open docs.python.org showing the latest Python documentation.

@item Turtle Demo

Run the turtledemo module with example Python code and turtle drawings.
@end table

Additional help sources may be added here with the Configure IDLE dialog under
the General tab. See the @ref{4758,,Help sources} subsection below
for more on Help menu choices.

@geindex Cut
@geindex Copy
@geindex Paste
@geindex Set Breakpoint
@geindex Clear Breakpoint
@geindex breakpoints

@node Context menus,,Help menu Shell and Editor,Menus
@anchor{library/idle context-menus}@anchor{4759}
@subsubsection Context menus


Open a context menu by right-clicking in a window (Control-click on macOS).
Context menus have the standard clipboard functions also on the Edit menu.


@table @asis

@item Cut

Copy selection into the system-wide clipboard; then delete the selection.

@item Copy

Copy selection into the system-wide clipboard.

@item Paste

Insert contents of the system-wide clipboard into the current window.
@end table

Editor windows also have breakpoint functions.  Lines with a breakpoint set are
specially marked.  Breakpoints only have an effect when running under the
debugger.  Breakpoints for a file are saved in the user’s @code{.idlerc}
directory.


@table @asis

@item Set Breakpoint

Set a breakpoint on the current line.

@item Clear Breakpoint

Clear the breakpoint on that line.
@end table

Shell and Output windows also have the following.


@table @asis

@item Go to file/line

Same as in Debug menu.
@end table

The Shell window also has an output squeezing facility explained in the `Python
Shell window' subsection below.


@table @asis

@item Squeeze

If the cursor is over an output line, squeeze all the output between
the code above and the prompt below down to a ‘Squeezed text’ label.
@end table

@node Editing and Navigation,Startup and Code Execution,Menus,IDLE — Python editor and shell<2>
@anchor{library/idle editing-and-navigation}@anchor{475a}@anchor{library/idle id1}@anchor{475b}
@subsubsection Editing and Navigation


@menu
* Editor windows:: 
* Key bindings:: 
* Automatic indentation:: 
* Search and Replace:: 
* Completions:: 
* Calltips:: 
* Format block:: 
* Code Context:: 
* Shell window:: 
* Text colors:: 

@end menu

@node Editor windows,Key bindings,,Editing and Navigation
@anchor{library/idle editor-windows}@anchor{475c}
@subsubsection Editor windows


IDLE may open editor windows when it starts, depending on settings
and how you start IDLE.  Thereafter, use the File menu.  There can be only
one open editor window for a given file.

The title bar contains the name of the file, the full path, and the version
of Python and IDLE running the window.  The status bar contains the line
number (‘Ln’) and column number (‘Col’).  Line numbers start with 1;
column numbers with 0.

IDLE assumes that files with a known .py* extension contain Python code
and that other files do not.  Run Python code with the Run menu.

@node Key bindings,Automatic indentation,Editor windows,Editing and Navigation
@anchor{library/idle key-bindings}@anchor{475d}
@subsubsection Key bindings


The IDLE insertion cursor is a thin vertical bar between character
positions.  When characters are entered, the insertion cursor and
everything to its right moves right one character and
the new character is entered in the new space.

Several non-character keys move the cursor and possibly
delete characters.  Deletion does not puts text on the clipboard,
but IDLE has an undo list.  Wherever this doc discusses keys,
‘C’ refers to the @code{Control} key on Windows and
Unix and the @code{Command} key on macOS.  (And all such discussions
assume that the keys have not been re-bound to something else.)


@itemize *

@item 
Arrow keys move the cursor one character or line.

@item 
@code{C}-@code{LeftArrow} and @code{C}-@code{RightArrow} moves left or right one word.

@item 
@code{Home} and @code{End} go to the beginning or end of the line.

@item 
@code{Page Up} and @code{Page Down} go up or down one screen.

@item 
@code{C}-@code{Home} and @code{C}-@code{End} go to beginning or end of the file.

@item 
@code{Backspace} and @code{Del} (or @code{C}-@code{d}) delete the previous
or next character.

@item 
@code{C}-@code{Backspace} and @code{C}-@code{Del} delete one word left or right.

@item 
@code{C}-@code{k} deletes (‘kills’) everything to the right.
@end itemize

Standard keybindings (like @code{C}-@code{c} to copy and @code{C}-@code{v} to paste)
may work.  Keybindings are selected in the Configure IDLE dialog.

@node Automatic indentation,Search and Replace,Key bindings,Editing and Navigation
@anchor{library/idle automatic-indentation}@anchor{475e}
@subsubsection Automatic indentation


After a block-opening statement, the next line is indented by 4 spaces (in the
Python Shell window by one tab).  After certain keywords (break, return etc.)
the next line is dedented.  In leading indentation, @code{Backspace} deletes up
to 4 spaces if they are there. @code{Tab} inserts spaces (in the Python
Shell window one tab), number depends on Indent width. Currently, tabs
are restricted to four spaces due to Tcl/Tk limitations.

See also the indent/dedent region commands on the
@ref{4749,,Format menu}.

@node Search and Replace,Completions,Automatic indentation,Editing and Navigation
@anchor{library/idle search-and-replace}@anchor{475f}
@subsubsection Search and Replace


Any selection becomes a search target.  However, only selections within
a line work because searches are only performed within lines with the
terminal newline removed.  If @code{[x] Regular expression} is checked, the
target is interpreted according to the Python re module.

@node Completions,Calltips,Search and Replace,Editing and Navigation
@anchor{library/idle completions}@anchor{4747}@anchor{library/idle id2}@anchor{4760}
@subsubsection Completions


Completions are supplied, when requested and available, for module
names, attributes of classes or functions, or filenames.  Each request
method displays a completion box with existing names.  (See tab
completions below for an exception.) For any box, change the name
being completed and the item highlighted in the box by
typing and deleting characters; by hitting @code{Up}, @code{Down},
@code{PageUp}, @code{PageDown}, @code{Home}, and @code{End} keys;
and by a single click within the box.  Close the box with @code{Escape},
@code{Enter}, and double @code{Tab} keys or clicks outside the box.
A double click within the box selects and closes.

One way to open a box is to type a key character and wait for a
predefined interval.  This defaults to 2 seconds; customize it
in the settings dialog.  (To prevent auto popups, set the delay to a
large number of milliseconds, such as 100000000.) For imported module
names or class or function attributes, type ‘.’.
For filenames in the root directory, type @ref{87c,,os.sep} or
@ref{87d,,os.altsep} immediately after an opening quote.  (On Windows,
one can specify a drive first.)  Move into subdirectories by typing a
directory name and a separator.

Instead of waiting, or after a box is closed, open a completion box
immediately with Show Completions on the Edit menu.  The default hot
key is @code{C}-@code{space}.  If one types a prefix for the desired name
before opening the box, the first match or near miss is made visible.
The result is the same as if one enters a prefix
after the box is displayed.  Show Completions after a quote completes
filenames in the current directory instead of a root directory.

Hitting @code{Tab} after a prefix usually has the same effect as Show
Completions.  (With no prefix, it indents.)  However, if there is only
one match to the prefix, that match is immediately added to the editor
text without opening a box.

Invoking ‘Show Completions’, or hitting @code{Tab} after a prefix,
outside of a string and without a preceding ‘.’ opens a box with
keywords, builtin names, and available module-level names.

When editing code in an editor (as oppose to Shell), increase the
available module-level names by running your code
and not restarting the Shell thereafter.  This is especially useful
after adding imports at the top of a file.  This also increases
possible attribute completions.

Completion boxes initially exclude names beginning with ‘_’ or, for
modules, not included in ‘__all__’.  The hidden names can be accessed
by typing ‘_’ after ‘.’, either before or after the box is opened.

@node Calltips,Format block,Completions,Editing and Navigation
@anchor{library/idle calltips}@anchor{4748}@anchor{library/idle id3}@anchor{4761}
@subsubsection Calltips


A calltip is shown automatically when one types @code{(} after the name
of an `accessible' function.  A function name expression may include
dots and subscripts.  A calltip remains until it is clicked, the cursor
is moved out of the argument area, or @code{)} is typed.  Whenever the
cursor is in the argument part of a definition, select Edit and “Show
Call Tip” on the menu or enter its shortcut to display a calltip.

The calltip consists of the function’s signature and docstring up to
the latter’s first blank line or the fifth non-blank line.  (Some builtin
functions lack an accessible signature.)  A ‘/’ or ‘*’ in the signature
indicates that the preceding or following arguments are passed by
position or name (keyword) only.  Details are subject to change.

In Shell, the accessible functions depends on what modules have been
imported into the user process, including those imported by Idle itself,
and which definitions have been run, all since the last restart.

For example, restart the Shell and enter @code{itertools.count(}.  A calltip
appears because Idle imports itertools into the user process for its own
use.  (This could change.)  Enter @code{turtle.write(} and nothing appears.
Idle does not itself import turtle.  The menu entry and shortcut also do
nothing.  Enter @code{import turtle}.  Thereafter, @code{turtle.write(}
will display a calltip.

In an editor, import statements have no effect until one runs the file.
One might want to run a file after writing import statements, after
adding function definitions, or after opening an existing file.

@node Format block,Code Context,Calltips,Editing and Navigation
@anchor{library/idle format-block}@anchor{474b}@anchor{library/idle id4}@anchor{4762}
@subsubsection Format block


Reformat Paragraph rewraps a block (‘paragraph’) of contiguous equally
indented non-blank comments, a similar block of text within a multiline
string, or a selected subset of either.
If needed, add a blank line to separate string from code.
Partial lines in a selection expand to complete lines.
The resulting lines have the same indent as before
but have maximum total length of N columns (characters).
Change the default N of 72 on the Window tab of IDLE Settings.

@node Code Context,Shell window,Format block,Editing and Navigation
@anchor{library/idle code-context}@anchor{4755}@anchor{library/idle id5}@anchor{4763}
@subsubsection Code Context


Within an editor window containing Python code, code context can be toggled
in order to show or hide a pane at the top of the window.  When shown, this
pane freezes the opening lines for block code, such as those beginning with
@code{class}, @code{def}, or @code{if} keywords, that would have otherwise scrolled
out of view.  The size of the pane will be expanded and contracted as needed
to show the all current levels of context, up to the maximum number of
lines defined in the Configure IDLE dialog (which defaults to 15).  If there
are no current context lines and the feature is toggled on, a single blank
line will display.  Clicking on a line in the context pane will move that
line to the top of the editor.

The text and background colors for the context pane can be configured under
the Highlights tab in the Configure IDLE dialog.

@node Shell window,Text colors,Code Context,Editing and Navigation
@anchor{library/idle shell-window}@anchor{4764}
@subsubsection Shell window


In IDLE’s Shell, enter, edit, and recall complete statements. (Most
consoles and terminals only work with a single physical line at a time).

Submit a single-line statement for execution by hitting @code{Return}
with the cursor anywhere on the line.  If a line is extended with
Backslash (@code{\}), the cursor must be on the last physical line.
Submit a multi-line compound statement by entering a blank line after
the statement.

When one pastes code into Shell, it is not compiled and possibly executed
until one hits @code{Return}, as specified above.
One may edit pasted code first.
If one pastes more than one statement into Shell, the result will be a
@ref{18f,,SyntaxError} when multiple statements are compiled as if they were one.

Lines containing @code{RESTART} mean that the user execution process has been
re-started.  This occurs when the user execution process has crashed,
when one requests a restart on the Shell menu, or when one runs code
in an editor window.

The editing features described in previous subsections work when entering
code interactively.  IDLE’s Shell window also responds to the following:


@itemize *

@item 
@code{C}-@code{c} attempts to interrupt statement execution (but may fail).

@item 
@code{C}-@code{d} closes Shell if typed at a @code{>>>} prompt.

@item 
@code{Alt}-@code{p} and @code{Alt}-@code{n} (@code{C}-@code{p} and @code{C}-@code{n} on macOS)
retrieve to the current prompt the previous or next previously
entered statement that matches anything already typed.

@item 
@code{Return} while the cursor is on any previous statement
appends the latter to anything already typed at the prompt.
@end itemize

@node Text colors,,Shell window,Editing and Navigation
@anchor{library/idle text-colors}@anchor{4765}
@subsubsection Text colors


Idle defaults to black on white text, but colors text with special meanings.
For the shell, these are shell output, shell error, user output, and
user error.  For Python code, at the shell prompt or in an editor, these are
keywords, builtin class and function names, names following @code{class} and
@code{def}, strings, and comments. For any text window, these are the cursor (when
present), found text (when possible), and selected text.

IDLE also highlights the @ref{a13,,soft keywords} @ref{a14,,match},
@code{case}, and @ref{a15,,_} in
pattern-matching statements. However, this highlighting is not perfect and
will be incorrect in some rare cases, including some @code{_}-s in @code{case}
patterns.

Text coloring is done in the background, so uncolorized text is occasionally
visible.  To change the color scheme, use the Configure IDLE dialog
Highlighting tab.  The marking of debugger breakpoint lines in the editor and
text in popups and dialogs is not user-configurable.

@node Startup and Code Execution,Help and Preferences,Editing and Navigation,IDLE — Python editor and shell<2>
@anchor{library/idle startup-and-code-execution}@anchor{4766}
@subsubsection Startup and Code Execution


Upon startup with the @code{-s} option, IDLE will execute the file referenced by
the environment variables 
@geindex IDLESTARTUP
@geindex environment variable; IDLESTARTUP
@code{IDLESTARTUP} or 
@geindex PYTHONSTARTUP
@geindex environment variable; PYTHONSTARTUP
@ref{1ba,,PYTHONSTARTUP}.
IDLE first checks for @code{IDLESTARTUP}; if @code{IDLESTARTUP} is present the file
referenced is run.  If @code{IDLESTARTUP} is not present, IDLE checks for
@code{PYTHONSTARTUP}.  Files referenced by these environment variables are
convenient places to store functions that are used frequently from the IDLE
shell, or for executing import statements to import common modules.

In addition, @code{Tk} also loads a startup file if it is present.  Note that the
Tk file is loaded unconditionally.  This additional file is @code{.Idle.py} and is
looked for in the user’s home directory.  Statements in this file will be
executed in the Tk namespace, so this file is not useful for importing
functions to be used from IDLE’s Python shell.

@menu
* Command-line usage: Command-line usage<5>. 
* Startup failure:: 
* Running user code:: 
* User output in Shell:: 
* Developing tkinter applications:: 
* Running without a subprocess:: 

@end menu

@node Command-line usage<5>,Startup failure,,Startup and Code Execution
@anchor{library/idle command-line-usage}@anchor{4767}@anchor{library/idle idlelib-cli}@anchor{4768}
@subsubsection Command-line usage


IDLE can be invoked from the command line with various options. The general syntax is:

@example
python -m idlelib [options] [file ...]
@end example

The following options are available:

@geindex idle command line option; -c
@anchor{library/idle cmdoption-idle-c}@anchor{4769}
@deffn {Option} @w{-}c <command>

Run the specified Python command in the shell window.
For example, pass @code{-c "print('Hello, World!')"}.
On Windows, the outer quotes must be double quotes as shown.
@end deffn

@geindex idle command line option; -d
@anchor{library/idle cmdoption-idle-d}@anchor{476a}
@deffn {Option} @w{-}d

Enable the debugger and open the shell window.
@end deffn

@geindex idle command line option; -e
@anchor{library/idle cmdoption-idle-e}@anchor{476b}
@deffn {Option} @w{-}e

Open an editor window.
@end deffn

@geindex idle command line option; -h
@anchor{library/idle cmdoption-idle-h}@anchor{476c}
@deffn {Option} @w{-}h

Print a help message with legal combinations of options and exit.
@end deffn

@geindex idle command line option; -i
@anchor{library/idle cmdoption-idle-i}@anchor{476d}
@deffn {Option} @w{-}i

Open a shell window.
@end deffn

@geindex idle command line option; -r
@anchor{library/idle cmdoption-idle-r}@anchor{476e}
@deffn {Option} @w{-}r <file>

Run the specified file in the shell window.
@end deffn

@geindex idle command line option; -s
@anchor{library/idle cmdoption-idle-s}@anchor{476f}
@deffn {Option} @w{-}s

Run the startup file (as defined by the environment variables 
@geindex IDLESTARTUP
@geindex environment variable; IDLESTARTUP
@code{IDLESTARTUP} or 
@geindex PYTHONSTARTUP
@geindex environment variable; PYTHONSTARTUP
@ref{1ba,,PYTHONSTARTUP}) before opening the shell window.
@end deffn

@geindex idle command line option; -t
@anchor{library/idle cmdoption-idle-t}@anchor{4770}
@deffn {Option} @w{-}t <title>

Set the title of the shell window.
@end deffn

@geindex idle command line option; -
@anchor{library/idle cmdoption-idle-0}@anchor{4771}
@deffn {Option} @w{-}

Read and execute standard input in the shell window. This option must be the last one before any arguments.
@end deffn

If arguments are provided:


@itemize -

@item 
If @code{-}, @code{-c}, or @code{-r} is used, all arguments are placed in @code{sys.argv[1:]},
and @code{sys.argv[0]} is set to @code{'@w{'}}, @code{'-c'}, or @code{'-r'} respectively.
No editor window is opened, even if that is the default set in the `Options' dialog.

@item 
Otherwise, arguments are treated as files to be opened for editing, and @code{sys.argv} reflects the arguments passed to IDLE itself.
@end itemize

@node Startup failure,Running user code,Command-line usage<5>,Startup and Code Execution
@anchor{library/idle startup-failure}@anchor{4772}
@subsubsection Startup failure


IDLE uses a socket to communicate between the IDLE GUI process and the user
code execution process.  A connection must be established whenever the Shell
starts or restarts.  (The latter is indicated by a divider line that says
‘RESTART’). If the user process fails to connect to the GUI process, it
usually displays a @code{Tk} error box with a ‘cannot connect’ message
that directs the user here.  It then exits.

One specific connection failure on Unix systems results from
misconfigured masquerading rules somewhere in a system’s network setup.
When IDLE is started from a terminal, one will see a message starting
with @code{** Invalid host:}.
The valid value is @code{127.0.0.1 (idlelib.rpc.LOCALHOST)}.
One can diagnose with @code{tcpconnect -irv 127.0.0.1 6543} in one
terminal window and @code{tcplisten <same args>} in another.

A common cause of failure is a user-written file with the same name as a
standard library module, such as `random.py' and `tkinter.py'. When such a
file is located in the same directory as a file that is about to be run,
IDLE cannot import the stdlib file.  The current fix is to rename the
user file.

Though less common than in the past, an antivirus or firewall program may
stop the connection.  If the program cannot be taught to allow the
connection, then it must be turned off for IDLE to work.  It is safe to
allow this internal connection because no data is visible on external
ports.  A similar problem is a network mis-configuration that blocks
connections.

Python installation issues occasionally stop IDLE: multiple versions can
clash, or a single installation might need admin access.  If one undo the
clash, or cannot or does not want to run as admin, it might be easiest to
completely remove Python and start over.

A zombie pythonw.exe process could be a problem.  On Windows, use Task
Manager to check for one and stop it if there is.  Sometimes a restart
initiated by a program crash or Keyboard Interrupt (control-C) may fail
to connect.  Dismissing the error box or using Restart Shell on the Shell
menu may fix a temporary problem.

When IDLE first starts, it attempts to read user configuration files in
@code{~/.idlerc/} (~ is one’s home directory).  If there is a problem, an error
message should be displayed.  Leaving aside random disk glitches, this can
be prevented by never editing the files by hand.  Instead, use the
configuration dialog, under Options.  Once there is an error in a user
configuration file, the best solution may be to delete it and start over
with the settings dialog.

If IDLE quits with no message, and it was not started from a console, try
starting it from a console or terminal (@code{python -m idlelib}) and see if
this results in an error message.

On Unix-based systems with tcl/tk older than @code{8.6.11} (see
@code{About IDLE}) certain characters of certain fonts can cause
a tk failure with a message to the terminal.  This can happen either
if one starts IDLE to edit a file with such a character or later
when entering such a character.  If one cannot upgrade tcl/tk,
then re-configure IDLE to use a font that works better.

@node Running user code,User output in Shell,Startup failure,Startup and Code Execution
@anchor{library/idle running-user-code}@anchor{4773}
@subsubsection Running user code


With rare exceptions, the result of executing Python code with IDLE is
intended to be the same as executing the same code by the default method,
directly with Python in a text-mode system console or terminal window.
However, the different interface and operation occasionally affect
visible results.  For instance, @code{sys.modules} starts with more entries,
and @code{threading.active_count()} returns 2 instead of 1.

By default, IDLE runs user code in a separate OS process rather than in
the user interface process that runs the shell and editor.  In the execution
process, it replaces @code{sys.stdin}, @code{sys.stdout}, and @code{sys.stderr}
with objects that get input from and send output to the Shell window.
The original values stored in @code{sys.__stdin__}, @code{sys.__stdout__}, and
@code{sys.__stderr__} are not touched, but may be @code{None}.

Sending print output from one process to a text widget in another is
slower than printing to a system terminal in the same process.
This has the most effect when printing multiple arguments, as the string
for each argument, each separator, the newline are sent separately.
For development, this is usually not a problem, but if one wants to
print faster in IDLE, format and join together everything one wants
displayed together and then print a single string.  Both format strings
and @ref{2651,,str.join()} can help combine fields and lines.

IDLE’s standard stream replacements are not inherited by subprocesses
created in the execution process, whether directly by user code or by
modules such as multiprocessing.  If such subprocess use @code{input} from
sys.stdin or @code{print} or @code{write} to sys.stdout or sys.stderr,
IDLE should be started in a command line window.  (On Windows,
use @code{python} or @code{py} rather than @code{pythonw} or @code{pyw}.)
The secondary subprocess
will then be attached to that window for input and output.

If @code{sys} is reset by user code, such as with @code{importlib.reload(sys)},
IDLE’s changes are lost and input from the keyboard and output to the screen
will not work correctly.

When Shell has the focus, it controls the keyboard and screen.  This is
normally transparent, but functions that directly access the keyboard
and screen will not work.  These include system-specific functions that
determine whether a key has been pressed and if so, which.

The IDLE code running in the execution process adds frames to the call stack
that would not be there otherwise.  IDLE wraps @code{sys.getrecursionlimit} and
@code{sys.setrecursionlimit} to reduce the effect of the additional stack
frames.

When user code raises SystemExit either directly or by calling sys.exit,
IDLE returns to a Shell prompt instead of exiting.

@node User output in Shell,Developing tkinter applications,Running user code,Startup and Code Execution
@anchor{library/idle user-output-in-shell}@anchor{4774}
@subsubsection User output in Shell


When a program outputs text, the result is determined by the
corresponding output device.  When IDLE executes user code, @code{sys.stdout}
and @code{sys.stderr} are connected to the display area of IDLE’s Shell.  Some of
its features are inherited from the underlying Tk Text widget.  Others
are programmed additions.  Where it matters, Shell is designed for development
rather than production runs.

For instance, Shell never throws away output.  A program that sends unlimited
output to Shell will eventually fill memory, resulting in a memory error.
In contrast, some system text windows only keep the last n lines of output.
A Windows console, for instance, keeps a user-settable 1 to 9999 lines,
with 300 the default.

A Tk Text widget, and hence IDLE’s Shell, displays characters (codepoints) in
the BMP (Basic Multilingual Plane) subset of Unicode.  Which characters are
displayed with a proper glyph and which with a replacement box depends on the
operating system and installed fonts.  Tab characters cause the following text
to begin after the next tab stop. (They occur every 8 ‘characters’).  Newline
characters cause following text to appear on a new line.  Other control
characters are ignored or displayed as a space, box, or something else,
depending on the operating system and font.  (Moving the text cursor through
such output with arrow keys may exhibit some surprising spacing behavior.)

@example
>>> s = 'a\tb\a<\x02><\r>\bc\nd'  # Enter 22 chars.
>>> len(s)
14
>>> s  # Display repr(s)
'a\tb\x07<\x02><\r>\x08c\nd'
>>> print(s, end='@w{'})  # Display s as is.
# Result varies by OS and font.  Try it.
@end example

The @code{repr} function is used for interactive echo of expression
values.  It returns an altered version of the input string in which
control codes, some BMP codepoints, and all non-BMP codepoints are
replaced with escape codes. As demonstrated above, it allows one to
identify the characters in a string, regardless of how they are displayed.

Normal and error output are generally kept separate (on separate lines)
from code input and each other.  They each get different highlight colors.

For SyntaxError tracebacks, the normal ‘^’ marking where the error was
detected is replaced by coloring the text with an error highlight.
When code run from a file causes other exceptions, one may right click
on a traceback line to jump to the corresponding line in an IDLE editor.
The file will be opened if necessary.

Shell has a special facility for squeezing output lines down to a
‘Squeezed text’ label.  This is done automatically
for output over N lines (N = 50 by default).
N can be changed in the PyShell section of the General
page of the Settings dialog.  Output with fewer lines can be squeezed by
right clicking on the output.  This can be useful lines long enough to slow
down scrolling.

Squeezed output is expanded in place by double-clicking the label.
It can also be sent to the clipboard or a separate view window by
right-clicking the label.

@node Developing tkinter applications,Running without a subprocess,User output in Shell,Startup and Code Execution
@anchor{library/idle developing-tkinter-applications}@anchor{4775}
@subsubsection Developing tkinter applications


IDLE is intentionally different from standard Python in order to
facilitate development of tkinter programs.  Enter @code{import tkinter as tk;
root = tk.Tk()} in standard Python and nothing appears.  Enter the same
in IDLE and a tk window appears.  In standard Python, one must also enter
@code{root.update()} to see the window.  IDLE does the equivalent in the
background, about 20 times a second, which is about every 50 milliseconds.
Next enter @code{b = tk.Button(root, text='button'); b.pack()}.  Again,
nothing visibly changes in standard Python until one enters @code{root.update()}.

Most tkinter programs run @code{root.mainloop()}, which usually does not
return until the tk app is destroyed.  If the program is run with
@code{python -i} or from an IDLE editor, a @code{>>>} shell prompt does not
appear until @code{mainloop()} returns, at which time there is nothing left
to interact with.

When running a tkinter program from an IDLE editor, one can comment out
the mainloop call.  One then gets a shell prompt immediately and can
interact with the live application.  One just has to remember to
re-enable the mainloop call when running in standard Python.

@node Running without a subprocess,,Developing tkinter applications,Startup and Code Execution
@anchor{library/idle running-without-a-subprocess}@anchor{4776}
@subsubsection Running without a subprocess


By default, IDLE executes user code in a separate subprocess via a socket,
which uses the internal loopback interface.  This connection is not
externally visible and no data is sent to or received from the internet.
If firewall software complains anyway, you can ignore it.

If the attempt to make the socket connection fails, Idle will notify you.
Such failures are sometimes transient, but if persistent, the problem
may be either a firewall blocking the connection or misconfiguration of
a particular system.  Until the problem is fixed, one can run Idle with
the -n command line switch.

If IDLE is started with the -n command line switch it will run in a
single process and will not create the subprocess which runs the RPC
Python execution server.  This can be useful if Python cannot create
the subprocess or the RPC socket interface on your platform.  However,
in this mode user code is not isolated from IDLE itself.  Also, the
environment is not restarted when Run/Run Module (F5) is selected.  If
your code has been modified, you must reload() the affected modules and
re-import any specific items (e.g. from foo import baz) if the changes
are to take effect.  For these reasons, it is preferable to run IDLE
with the default subprocess if at all possible.


Deprecated since version 3.4.


@node Help and Preferences,idlelib — implementation of IDLE application,Startup and Code Execution,IDLE — Python editor and shell<2>
@anchor{library/idle help-and-preferences}@anchor{4777}
@subsubsection Help and Preferences


@menu
* Help sources:: 
* Setting preferences:: 
* IDLE on macOS:: 
* Extensions:: 

@end menu

@node Help sources,Setting preferences,,Help and Preferences
@anchor{library/idle help-sources}@anchor{4758}@anchor{library/idle id6}@anchor{4778}
@subsubsection Help sources


Help menu entry “IDLE Help” displays a formatted html version of the
IDLE chapter of the Library Reference.  The result, in a read-only
tkinter text window, is close to what one sees in a web browser.
Navigate through the text with a mousewheel,
the scrollbar, or up and down arrow keys held down.
Or click the TOC (Table of Contents) button and select a section
header in the opened box.

Help menu entry “Python Docs” opens the extensive sources of help,
including tutorials, available at @code{docs.python.org/x.y}, where ‘x.y’
is the currently running Python version.  If your system
has an off-line copy of the docs (this may be an installation option),
that will be opened instead.

Selected URLs can be added or removed from the help menu at any time using the
General tab of the Configure IDLE dialog.

@node Setting preferences,IDLE on macOS,Help sources,Help and Preferences
@anchor{library/idle preferences}@anchor{4754}@anchor{library/idle setting-preferences}@anchor{4779}
@subsubsection Setting preferences


The font preferences, highlighting, keys, and general preferences can be
changed via Configure IDLE on the Option menu.
Non-default user settings are saved in a @code{.idlerc} directory in the user’s
home directory.  Problems caused by bad user configuration files are solved
by editing or deleting one or more of the files in @code{.idlerc}.

On the Font tab, see the text sample for the effect of font face and size
on multiple characters in multiple languages.  Edit the sample to add
other characters of personal interest.  Use the sample to select
monospaced fonts.  If particular characters have problems in Shell or an
editor, add them to the top of the sample and try changing first size
and then font.

On the Highlights and Keys tab, select a built-in or custom color theme
and key set.  To use a newer built-in color theme or key set with older
IDLEs, save it as a new custom theme or key set and it well be accessible
to older IDLEs.

@node IDLE on macOS,Extensions,Setting preferences,Help and Preferences
@anchor{library/idle idle-on-macos}@anchor{477a}
@subsubsection IDLE on macOS


Under System Preferences: Dock, one can set “Prefer tabs when opening
documents” to “Always”.  This setting is not compatible with the tk/tkinter
GUI framework used by IDLE, and it breaks a few IDLE features.

@node Extensions,,IDLE on macOS,Help and Preferences
@anchor{library/idle extensions}@anchor{477b}
@subsubsection Extensions


IDLE contains an extension facility.  Preferences for extensions can be
changed with the Extensions tab of the preferences dialog. See the
beginning of config-extensions.def in the idlelib directory for further
information.  The only current default extension is zzdummy, an example
also used for testing.

@node idlelib — implementation of IDLE application,,Help and Preferences,IDLE — Python editor and shell<2>
@anchor{library/idle idlelib-implementation-of-idle-application}@anchor{477c}@anchor{library/idle module-idlelib}@anchor{77}
@subsubsection idlelib — implementation of IDLE application


@geindex module; idlelib

`Source code:' Lib/idlelib@footnote{https://github.com/python/cpython/tree/3.14/Lib/idlelib}


__________________________________________________________________


The Lib/idlelib package implements the IDLE application.  See the rest
of this page for how to use IDLE.

The files in idlelib are described in idlelib/README.txt.  Access it
either in idlelib or click Help => About IDLE on the IDLE menu.  This
file also maps IDLE menu items to the code that implements the item.
Except for files listed under ‘Startup’, the idlelib code is ‘private’ in
sense that feature changes can be backported (see 
@geindex Python Enhancement Proposals; PEP 434
PEP 434@footnote{https://peps.python.org/pep-0434/}).

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node turtle — Turtle graphics,,IDLE — Python editor and shell<2>,Graphical user interfaces with Tk
@anchor{library/turtle doc}@anchor{477d}@anchor{library/turtle module-turtle}@anchor{108}@anchor{library/turtle translation-repo}@anchor{477e}@anchor{library/turtle turtle-turtle-graphics}@anchor{477f}
@subsection @code{turtle} — Turtle graphics


@geindex module; turtle

`Source code:' Lib/turtle.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/turtle.py}

@c from turtle import *
@c turtle = Turtle()

@c import os
@c os.remove("my_drawing.ps")


__________________________________________________________________


@menu
* Introduction: Introduction<12>. 
* Get started:: 
* Tutorial: Tutorial<4>. 
* How to…:: 
* Turtle graphics reference:: 
* Methods of RawTurtle/Turtle and corresponding functions:: 
* Methods of TurtleScreen/Screen and corresponding functions:: 
* Public classes:: 
* Explanation: Explanation<2>. 
* Help and configuration:: 
* turtledemo — Demo scripts:: 
* Changes since Python 2.6: Changes since Python 2 6. 
* Changes since Python 3.0: Changes since Python 3 0. 

@end menu

@node Introduction<12>,Get started,,turtle — Turtle graphics
@anchor{library/turtle introduction}@anchor{4780}
@subsubsection Introduction


Turtle graphics is an implementation of the popular geometric drawing tools introduced in Logo@footnote{https://en.wikipedia.org/wiki/Turtle_(robot)}, developed by Wally Feurzeig, Seymour Papert and Cynthia Solomon
in 1967.

This is an @ref{219c,,optional module}.
If it is missing from your copy of CPython,
look for documentation from your distributor (that is,
whoever provided Python to you).
If you are the distributor, see @ref{219a,,Requirements for optional modules}.

@c Similar notes appear in the docs of the modules:
@c - zipfile
@c - tarfile

@node Get started,Tutorial<4>,Introduction<12>,turtle — Turtle graphics
@anchor{library/turtle get-started}@anchor{4781}
@subsubsection Get started


Imagine a robotic turtle starting at (0, 0) in the x-y plane.  After an @code{import turtle}, give it the
command @code{turtle.forward(15)}, and it moves (on-screen!) 15 pixels in the
direction it is facing, drawing a line as it moves.  Give it the command
@code{turtle.right(25)}, and it rotates in-place 25 degrees clockwise.

@subsubheading Turtle star



Turtle can draw intricate shapes using programs that repeat simple
moves.

@image{python-figures/turtle-star,,,,png}

In Python, turtle graphics provides a representation of a physical “turtle”
(a little robot with a pen) that draws on a sheet of paper on the floor.

It’s an effective and well-proven way for learners to encounter
programming concepts and interaction with software, as it provides instant,
visible feedback. It also provides convenient access to graphical output
in general.

Turtle drawing was originally created as an educational tool, to be used by
teachers in the classroom. For the programmer who needs to produce some
graphical output it can be a way to do that without the overhead of
introducing more complex or external libraries into their work.

@node Tutorial<4>,How to…,Get started,turtle — Turtle graphics
@anchor{library/turtle turtle-tutorial}@anchor{4782}@anchor{library/turtle tutorial}@anchor{4783}
@subsubsection Tutorial


New users should start here. In this tutorial we’ll explore some of the
basics of turtle drawing.

@menu
* Starting a turtle environment:: 
* Basic drawing:: 
* Making algorithmic patterns:: 

@end menu

@node Starting a turtle environment,Basic drawing,,Tutorial<4>
@anchor{library/turtle starting-a-turtle-environment}@anchor{4784}
@subsubsection Starting a turtle environment


In a Python shell, import all the objects of the @code{turtle} module:

@example
from turtle import *
@end example

If you run into a @code{No module named '_tkinter'} error, you’ll have to
install the @ref{f6,,Tk interface package} on your system.

@node Basic drawing,Making algorithmic patterns,Starting a turtle environment,Tutorial<4>
@anchor{library/turtle basic-drawing}@anchor{4785}
@subsubsection Basic drawing


Send the turtle forward 100 steps:

@example
forward(100)
@end example

You should see (most likely, in a new window on your display) a line
drawn by the turtle, heading East. Change the direction of the turtle,
so that it turns 120 degrees left (anti-clockwise):

@example
left(120)
@end example

Let’s continue by drawing a triangle:

@example
forward(100)
left(120)
forward(100)
@end example

Notice how the turtle, represented by an arrow, points in different
directions as you steer it.

Experiment with those commands, and also with @code{backward()} and
@code{right()}.

@menu
* Pen control:: 
* The turtle’s position:: 

@end menu

@node Pen control,The turtle’s position,,Basic drawing
@anchor{library/turtle pen-control}@anchor{4786}
@subsubsection Pen control


Try changing the color - for example, @code{color('blue')} - and
width of the line - for example, @code{width(3)} - and then drawing again.

You can also move the turtle around without drawing, by lifting up the pen:
@code{up()} before moving. To start drawing again, use @code{down()}.

@node The turtle’s position,,Pen control,Basic drawing
@anchor{library/turtle the-turtle-s-position}@anchor{4787}
@subsubsection The turtle’s position


Send your turtle back to its starting-point (useful if it has disappeared
off-screen):

@example
home()
@end example

The home position is at the center of the turtle’s screen. If you ever need to
know them, get the turtle’s x-y coordinates with:

@example
pos()
@end example

Home is at @code{(0, 0)}.

And after a while, it will probably help to clear the window so we can start
anew:

@example
clearscreen()
@end example

@node Making algorithmic patterns,,Basic drawing,Tutorial<4>
@anchor{library/turtle making-algorithmic-patterns}@anchor{4788}
@subsubsection Making algorithmic patterns


Using loops, it’s possible to build up geometric patterns:

@example
for steps in range(100):
    for c in ('blue', 'red', 'green'):
        color(c)
        forward(steps)
        right(30)
@end example

- which of course, are limited only by the imagination!

Let’s draw the star shape at the top of this page. We want red lines,
filled in with yellow:

@example
color('red')
fillcolor('yellow')
@end example

Just as @code{up()} and @code{down()} determine whether lines will be drawn,
filling can be turned on and off:

@example
begin_fill()
@end example

Next we’ll create a loop:

@example
while True:
    forward(200)
    left(170)
    if abs(pos()) < 1:
        break
@end example

@code{abs(pos()) < 1} is a good way to know when the turtle is back at its
home position.

Finally, complete the filling:

@example
end_fill()
@end example

(Note that filling only actually takes place when you give the
@code{end_fill()} command.)

@node How to…,Turtle graphics reference,Tutorial<4>,turtle — Turtle graphics
@anchor{library/turtle how-to}@anchor{4789}@anchor{library/turtle turtle-how-to}@anchor{478a}
@subsubsection How to…


This section covers some typical turtle use-cases and approaches.

@menu
* Get started as quickly as possible:: 
* Automatically begin and end filling:: 
* Use the turtle module namespace:: 
* Use turtle graphics in a script:: 
* Use object-oriented turtle graphics:: 

@end menu

@node Get started as quickly as possible,Automatically begin and end filling,,How to…
@anchor{library/turtle get-started-as-quickly-as-possible}@anchor{478b}
@subsubsection Get started as quickly as possible


One of the joys of turtle graphics is the immediate, visual feedback that’s
available from simple commands - it’s an excellent way to introduce children
to programming ideas, with a minimum of overhead (not just children, of
course).

The turtle module makes this possible by exposing all its basic functionality
as functions, available with @code{from turtle import *}. The @ref{4782,,turtle graphics tutorial} covers this approach.

It’s worth noting that many of the turtle commands also have even more terse
equivalents, such as @code{fd()} for @ref{3689,,forward()}. These are especially
useful when working with learners for whom typing is not a skill.
@anchor{library/turtle note}@anchor{478c}
@quotation

You’ll need to have the @ref{f6,,Tk interface package} installed on
your system for turtle graphics to work. Be warned that this is not
always straightforward, so check this in advance if you’re planning to
use turtle graphics with a learner.
@end quotation

@node Automatically begin and end filling,Use the turtle module namespace,Get started as quickly as possible,How to…
@anchor{library/turtle automatically-begin-and-end-filling}@anchor{478d}
@subsubsection Automatically begin and end filling


Starting with Python 3.14, you can use the @ref{2a5,,fill()} @ref{1e3,,context manager}
instead of @ref{478e,,begin_fill()} and @ref{478f,,end_fill()} to automatically begin and
end fill. Here is an example:

@example
with fill():
    for i in range(4):
        forward(100)
        right(90)

forward(200)
@end example

The code above is equivalent to:

@example
begin_fill()
for i in range(4):
    forward(100)
    right(90)
end_fill()

forward(200)
@end example

@node Use the turtle module namespace,Use turtle graphics in a script,Automatically begin and end filling,How to…
@anchor{library/turtle use-the-turtle-module-namespace}@anchor{4790}
@subsubsection Use the @code{turtle} module namespace


Using @code{from turtle import *} is convenient - but be warned that it imports a
rather large collection of objects, and if you’re doing anything but turtle
graphics you run the risk of a name conflict (this becomes even more an issue
if you’re using turtle graphics in a script where other modules might be
imported).

The solution is to use @code{import turtle} - @code{fd()} becomes
@code{turtle.fd()}, @code{width()} becomes @code{turtle.width()} and so on. (If typing
“turtle” over and over again becomes tedious, use for example @code{import turtle
as t} instead.)

@node Use turtle graphics in a script,Use object-oriented turtle graphics,Use the turtle module namespace,How to…
@anchor{library/turtle use-turtle-graphics-in-a-script}@anchor{4791}
@subsubsection Use turtle graphics in a script


It’s recommended to use the @code{turtle} module namespace as described
immediately above, for example:

@example
import turtle as t
from random import random

for i in range(100):
    steps = int(random() * 100)
    angle = int(random() * 360)
    t.right(angle)
    t.fd(steps)
@end example

Another step is also required though - as soon as the script ends, Python
will also close the turtle’s window. Add:

@example
t.mainloop()
@end example

to the end of the script. The script will now wait to be dismissed and
will not exit until it is terminated, for example by closing the turtle
graphics window.

@node Use object-oriented turtle graphics,,Use turtle graphics in a script,How to…
@anchor{library/turtle use-object-oriented-turtle-graphics}@anchor{4792}
@subsubsection Use object-oriented turtle graphics



@subsubheading See also


@ref{4793,,Explanation of the object-oriented interface}


Other than for very basic introductory purposes, or for trying things out
as quickly as possible, it’s more usual and much more powerful to use the
object-oriented approach to turtle graphics. For example, this allows
multiple turtles on screen at once.

In this approach, the various turtle commands are methods of objects (mostly of
@code{Turtle} objects). You `can' use the object-oriented approach in the shell,
but it would be more typical in a Python script.

The example above then becomes:

@example
from turtle import Turtle
from random import random

t = Turtle()
for i in range(100):
    steps = int(random() * 100)
    angle = int(random() * 360)
    t.right(angle)
    t.fd(steps)

t.screen.mainloop()
@end example

Note the last line. @code{t.screen} is an instance of the @ref{4794,,Screen}
that a Turtle instance exists on; it’s created automatically along with
the turtle.

The turtle’s screen can be customised, for example:

@example
t.screen.title('Object-oriented turtle demo')
t.screen.bgcolor("orange")
@end example

@node Turtle graphics reference,Methods of RawTurtle/Turtle and corresponding functions,How to…,turtle — Turtle graphics
@anchor{library/turtle turtle-graphics-reference}@anchor{4795}
@subsubsection Turtle graphics reference


@cartouche
@quotation Note 
In the following documentation the argument list for functions is given.
Methods, of course, have the additional first argument `self' which is
omitted here.
@end quotation
@end cartouche

@menu
* Turtle methods:: 
* Methods of TurtleScreen/Screen:: 

@end menu

@node Turtle methods,Methods of TurtleScreen/Screen,,Turtle graphics reference
@anchor{library/turtle turtle-methods}@anchor{4796}
@subsubsection Turtle methods



@table @asis

@item Turtle motion


@table @asis

@item Move and draw


@display
@ref{3689,,forward()} | @ref{4797,,fd()}@w{ }
@ref{4798,,backward()} | @ref{4799,,bk()} | @ref{479a,,back()}@w{ }
@ref{479b,,right()} | @ref{479c,,rt()}@w{ }
@ref{479d,,left()} | @ref{479e,,lt()}@w{ }
@ref{479f,,goto()} | @ref{47a0,,setpos()} | @ref{47a1,,setposition()}@w{ }
@ref{1add,,teleport()}@w{ }
@ref{47a2,,setx()}@w{ }
@ref{47a3,,sety()}@w{ }
@ref{47a4,,setheading()} | @ref{47a5,,seth()}@w{ }
@ref{47a6,,home()}@w{ }
@ref{47a7,,circle()}@w{ }
@ref{47a8,,dot()}@w{ }
@ref{47a9,,stamp()}@w{ }
@ref{47aa,,clearstamp()}@w{ }
@ref{47ab,,clearstamps()}@w{ }
@ref{47ac,,undo()}@w{ }
@ref{47ad,,speed()}@w{ }
@end display



@item Tell Turtle’s state


@display
@ref{47ae,,position()} | @ref{47af,,pos()}@w{ }
@ref{47b0,,towards()}@w{ }
@ref{47b1,,xcor()}@w{ }
@ref{47b2,,ycor()}@w{ }
@ref{47b3,,heading()}@w{ }
@ref{47b4,,distance()}@w{ }
@end display



@item Setting and measurement


@display
@ref{47b5,,degrees()}@w{ }
@ref{47b6,,radians()}@w{ }
@end display


@end table

@item Pen control


@table @asis

@item Drawing state


@display
@ref{47b7,,pendown()} | @ref{47b8,,pd()} | @ref{47b9,,down()}@w{ }
@ref{47ba,,penup()} | @ref{47bb,,pu()} | @ref{47bc,,up()}@w{ }
@ref{47bd,,pensize()} | @ref{47be,,width()}@w{ }
@ref{47bf,,pen()}@w{ }
@ref{47c0,,isdown()}@w{ }
@end display



@item Color control


@display
@ref{47c1,,color()}@w{ }
@ref{47c2,,pencolor()}@w{ }
@ref{47c3,,fillcolor()}@w{ }
@end display



@item Filling


@display
@ref{47c4,,filling()}@w{ }
@ref{2a5,,fill()}@w{ }
@ref{478e,,begin_fill()}@w{ }
@ref{478f,,end_fill()}@w{ }
@end display



@item More drawing control


@display
@ref{47c5,,reset()}@w{ }
@ref{47c6,,clear()}@w{ }
@ref{47c7,,write()}@w{ }
@end display


@end table

@item Turtle state


@table @asis

@item Visibility


@display
@ref{47c8,,showturtle()} | @ref{47c9,,st()}@w{ }
@ref{47ca,,hideturtle()} | @ref{47cb,,ht()}@w{ }
@ref{47cc,,isvisible()}@w{ }
@end display



@item Appearance


@display
@ref{47cd,,shape()}@w{ }
@ref{47ce,,resizemode()}@w{ }
@ref{47cf,,shapesize()} | @ref{47d0,,turtlesize()}@w{ }
@ref{47d1,,shearfactor()}@w{ }
@ref{934,,tiltangle()}@w{ }
@ref{47d2,,tilt()}@w{ }
@ref{47d3,,shapetransform()}@w{ }
@ref{47d4,,get_shapepoly()}@w{ }
@end display


@end table

@item Using events


@display
@ref{47d5,,onclick()}@w{ }
@ref{47d6,,onrelease()}@w{ }
@ref{47d7,,ondrag()}@w{ }
@end display



@item Special Turtle methods


@display
@ref{2a6,,poly()}@w{ }
@ref{47d8,,begin_poly()}@w{ }
@ref{47d9,,end_poly()}@w{ }
@ref{47da,,get_poly()}@w{ }
@ref{47db,,clone()}@w{ }
@ref{47dc,,getturtle()} | @ref{47dd,,getpen()}@w{ }
@ref{47de,,getscreen()}@w{ }
@ref{47df,,setundobuffer()}@w{ }
@ref{47e0,,undobufferentries()}@w{ }
@end display


@end table

@node Methods of TurtleScreen/Screen,,Turtle methods,Turtle graphics reference
@anchor{library/turtle methods-of-turtlescreen-screen}@anchor{47e1}
@subsubsection Methods of TurtleScreen/Screen



@table @asis

@item Window control


@display
@ref{47e2,,bgcolor()}@w{ }
@ref{47e3,,bgpic()}@w{ }
@ref{47e4,,clearscreen()}@w{ }
@ref{47e5,,resetscreen()}@w{ }
@ref{47e6,,screensize()}@w{ }
@ref{47e7,,setworldcoordinates()}@w{ }
@end display



@item Animation control


@display
@ref{2a7,,no_animation()}@w{ }
@ref{47e8,,delay()}@w{ }
@ref{47e9,,tracer()}@w{ }
@ref{47ea,,update()}@w{ }
@end display



@item Using screen events


@display
@ref{47eb,,listen()}@w{ }
@ref{47ec,,onkey()} | @ref{47ed,,onkeyrelease()}@w{ }
@ref{47ee,,onkeypress()}@w{ }
@ref{47d5,,onclick()} | @ref{47ef,,onscreenclick()}@w{ }
@ref{47f0,,ontimer()}@w{ }
@ref{47f1,,mainloop()} | @ref{47f2,,done()}@w{ }
@end display



@item Settings and special methods


@display
@ref{47f3,,mode()}@w{ }
@ref{47f4,,colormode()}@w{ }
@ref{47f5,,getcanvas()}@w{ }
@ref{47f6,,getshapes()}@w{ }
@ref{47f7,,register_shape()} | @ref{47f8,,addshape()}@w{ }
@ref{47f9,,turtles()}@w{ }
@ref{47fa,,window_height()}@w{ }
@ref{47fb,,window_width()}@w{ }
@end display



@item Input methods


@display
@ref{1cbd,,textinput()}@w{ }
@ref{1cbe,,numinput()}@w{ }
@end display



@item Methods specific to Screen


@display
@ref{47fc,,bye()}@w{ }
@ref{47fd,,exitonclick()}@w{ }
@ref{19b4,,save()}@w{ }
@ref{47fe,,setup()}@w{ }
@ref{47ff,,title()}@w{ }
@end display


@end table

@node Methods of RawTurtle/Turtle and corresponding functions,Methods of TurtleScreen/Screen and corresponding functions,Turtle graphics reference,turtle — Turtle graphics
@anchor{library/turtle methods-of-rawturtle-turtle-and-corresponding-functions}@anchor{4800}
@subsubsection Methods of RawTurtle/Turtle and corresponding functions


Most of the examples in this section refer to a Turtle instance called
@code{turtle}.

@menu
* Turtle motion:: 
* Tell Turtle’s state:: 
* Settings for measurement:: 
* Pen control: Pen control<2>. 
* Turtle state:: 
* Using events:: 
* Special Turtle methods:: 
* Compound shapes:: 

@end menu

@node Turtle motion,Tell Turtle’s state,,Methods of RawTurtle/Turtle and corresponding functions
@anchor{library/turtle turtle-motion}@anchor{4801}
@subsubsection Turtle motion


@geindex forward() (in module turtle)
@geindex fd() (in module turtle)
@anchor{library/turtle turtle forward}@anchor{3689}
@deffn {Function} turtle.forward (distance)
@anchor{library/turtle turtle fd}@anchor{4797}
@deffnx {Function} turtle.fd (distance)

@*Parameters: 
@code{distance} – a number (integer or float)


Move the turtle forward by the specified `distance', in the direction the
turtle is headed.

@example
>>> turtle.position()
(0.00,0.00)
>>> turtle.forward(25)
>>> turtle.position()
(25.00,0.00)
>>> turtle.forward(-75)
>>> turtle.position()
(-50.00,0.00)
@end example
@end deffn

@geindex back() (in module turtle)
@geindex bk() (in module turtle)
@geindex backward() (in module turtle)
@anchor{library/turtle turtle back}@anchor{479a}
@deffn {Function} turtle.back (distance)
@anchor{library/turtle turtle bk}@anchor{4799}
@deffnx {Function} turtle.bk (distance)
@anchor{library/turtle turtle backward}@anchor{4798}
@deffnx {Function} turtle.backward (distance)

@*Parameters: 
@code{distance} – a number


Move the turtle backward by `distance', opposite to the direction the
turtle is headed.  Do not change the turtle’s heading.

@c >>> turtle.goto(0, 0)

@example
>>> turtle.position()
(0.00,0.00)
>>> turtle.backward(30)
>>> turtle.position()
(-30.00,0.00)
@end example
@end deffn

@geindex right() (in module turtle)
@geindex rt() (in module turtle)
@anchor{library/turtle turtle right}@anchor{479b}
@deffn {Function} turtle.right (angle)
@anchor{library/turtle turtle rt}@anchor{479c}
@deffnx {Function} turtle.rt (angle)

@*Parameters: 
@code{angle} – a number (integer or float)


Turn turtle right by `angle' units.  (Units are by default degrees, but
can be set via the @ref{47b5,,degrees()} and @ref{47b6,,radians()} functions.)  Angle
orientation depends on the turtle mode, see @ref{47f3,,mode()}.

@c >>> turtle.setheading(22)

@example
>>> turtle.heading()
22.0
>>> turtle.right(45)
>>> turtle.heading()
337.0
@end example
@end deffn

@geindex left() (in module turtle)
@geindex lt() (in module turtle)
@anchor{library/turtle turtle left}@anchor{479d}
@deffn {Function} turtle.left (angle)
@anchor{library/turtle turtle lt}@anchor{479e}
@deffnx {Function} turtle.lt (angle)

@*Parameters: 
@code{angle} – a number (integer or float)


Turn turtle left by `angle' units.  (Units are by default degrees, but
can be set via the @ref{47b5,,degrees()} and @ref{47b6,,radians()} functions.)  Angle
orientation depends on the turtle mode, see @ref{47f3,,mode()}.

@c >>> turtle.setheading(22)

@example
>>> turtle.heading()
22.0
>>> turtle.left(45)
>>> turtle.heading()
67.0
@end example
@end deffn

@geindex goto() (in module turtle)
@geindex setpos() (in module turtle)
@geindex setposition() (in module turtle)
@anchor{library/turtle turtle goto}@anchor{479f}
@deffn {Function} turtle.goto (x, y=None)
@anchor{library/turtle turtle setpos}@anchor{47a0}
@deffnx {Function} turtle.setpos (x, y=None)
@anchor{library/turtle turtle setposition}@anchor{47a1}
@deffnx {Function} turtle.setposition (x, y=None)

@*Parameters: 

@itemize *

@item 
@code{x} – a number or a pair/vector of numbers

@item 
@code{y} – a number or @code{None}
@end itemize


If `y' is @code{None}, `x' must be a pair of coordinates or a @ref{4802,,Vec2D}
(e.g. as returned by @ref{47af,,pos()}).

Move turtle to an absolute position.  If the pen is down, draw line.  Do
not change the turtle’s orientation.

@c >>> turtle.goto(0, 0)

@example
>>> tp = turtle.pos()
>>> tp
(0.00,0.00)
>>> turtle.setpos(60,30)
>>> turtle.pos()
(60.00,30.00)
>>> turtle.setpos((20,80))
>>> turtle.pos()
(20.00,80.00)
>>> turtle.setpos(tp)
>>> turtle.pos()
(0.00,0.00)
@end example
@end deffn

@geindex teleport() (in module turtle)
@anchor{library/turtle turtle teleport}@anchor{1add}
@deffn {Function} turtle.teleport (x, y=None, *, fill_gap=False)

@*Parameters: 

@itemize *

@item 
@code{x} – a number or @code{None}

@item 
@code{y} – a number or @code{None}

@item 
@code{fill_gap} – a boolean
@end itemize


Move turtle to an absolute position. Unlike goto(x, y), a line will not
be drawn. The turtle’s orientation does not change. If currently
filling, the polygon(s) teleported from will be filled after leaving,
and filling will begin again after teleporting. This can be disabled
with fill_gap=True, which makes the imaginary line traveled during
teleporting act as a fill barrier like in goto(x, y).

@c >>> turtle.goto(0, 0)

@example
>>> tp = turtle.pos()
>>> tp
(0.00,0.00)
>>> turtle.teleport(60)
>>> turtle.pos()
(60.00,0.00)
>>> turtle.teleport(y=10)
>>> turtle.pos()
(60.00,10.00)
>>> turtle.teleport(20, 30)
>>> turtle.pos()
(20.00,30.00)
@end example


Added in version 3.12.

@end deffn

@geindex setx() (in module turtle)
@anchor{library/turtle turtle setx}@anchor{47a2}
@deffn {Function} turtle.setx (x)

@*Parameters: 
@code{x} – a number (integer or float)


Set the turtle’s first coordinate to `x', leave second coordinate
unchanged.

@c >>> turtle.goto(0, 240)

@example
>>> turtle.position()
(0.00,240.00)
>>> turtle.setx(10)
>>> turtle.position()
(10.00,240.00)
@end example
@end deffn

@geindex sety() (in module turtle)
@anchor{library/turtle turtle sety}@anchor{47a3}
@deffn {Function} turtle.sety (y)

@*Parameters: 
@code{y} – a number (integer or float)


Set the turtle’s second coordinate to `y', leave first coordinate unchanged.

@c >>> turtle.goto(0, 40)

@example
>>> turtle.position()
(0.00,40.00)
>>> turtle.sety(-10)
>>> turtle.position()
(0.00,-10.00)
@end example
@end deffn

@geindex setheading() (in module turtle)
@geindex seth() (in module turtle)
@anchor{library/turtle turtle setheading}@anchor{47a4}
@deffn {Function} turtle.setheading (to_angle)
@anchor{library/turtle turtle seth}@anchor{47a5}
@deffnx {Function} turtle.seth (to_angle)

@*Parameters: 
@code{to_angle} – a number (integer or float)


Set the orientation of the turtle to `to_angle'.  Here are some common
directions in degrees:


@multitable {xxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxx} 
@headitem

standard mode

@tab

logo mode

@item

0 - east

@tab

0 - north

@item

90 - north

@tab

90 - east

@item

180 - west

@tab

180 - south

@item

270 - south

@tab

270 - west

@end multitable


@example
>>> turtle.setheading(90)
>>> turtle.heading()
90.0
@end example
@end deffn

@geindex home() (in module turtle)
@anchor{library/turtle turtle home}@anchor{47a6}
@deffn {Function} turtle.home ()

Move turtle to the origin – coordinates (0,0) – and set its heading to
its start-orientation (which depends on the mode, see @ref{47f3,,mode()}).

@c >>> turtle.setheading(90)
@c >>> turtle.goto(0, -10)

@example
>>> turtle.heading()
90.0
>>> turtle.position()
(0.00,-10.00)
>>> turtle.home()
>>> turtle.position()
(0.00,0.00)
>>> turtle.heading()
0.0
@end example
@end deffn

@geindex circle() (in module turtle)
@anchor{library/turtle turtle circle}@anchor{47a7}
@deffn {Function} turtle.circle (radius, extent=None, steps=None)

@*Parameters: 

@itemize *

@item 
@code{radius} – a number

@item 
@code{extent} – a number (or @code{None})

@item 
@code{steps} – an integer (or @code{None})
@end itemize


Draw a circle with given `radius'.  The center is `radius' units left of
the turtle; `extent' – an angle – determines which part of the circle
is drawn.  If `extent' is not given, draw the entire circle.  If `extent'
is not a full circle, one endpoint of the arc is the current pen
position.  Draw the arc in counterclockwise direction if `radius' is
positive, otherwise in clockwise direction.  Finally the direction of the
turtle is changed by the amount of `extent'.

As the circle is approximated by an inscribed regular polygon, `steps'
determines the number of steps to use.  If not given, it will be
calculated automatically.  May be used to draw regular polygons.

@example
>>> turtle.home()
>>> turtle.position()
(0.00,0.00)
>>> turtle.heading()
0.0
>>> turtle.circle(50)
>>> turtle.position()
(-0.00,0.00)
>>> turtle.heading()
0.0
>>> turtle.circle(120, 180)  # draw a semicircle
>>> turtle.position()
(0.00,240.00)
>>> turtle.heading()
180.0
@end example
@end deffn

@geindex dot() (in module turtle)
@anchor{library/turtle turtle dot}@anchor{47a8}
@deffn {Function} turtle.dot ()

@deffnx {Function} turtle.dot (size)

@deffnx {Function} turtle.dot (color, /)

@deffnx {Function} turtle.dot (size, color, /)

@deffnx {Function} turtle.dot (size, r, g, b, /)

@*Parameters: 

@itemize *

@item 
@code{size} – an integer >= 1 (if given)

@item 
@code{color} – a colorstring or a numeric color tuple
@end itemize


Draw a circular dot with diameter `size', using `color'.  If `size' is
not given, the maximum of @code{pensize+4} and @code{2*pensize} is used.

@example
>>> turtle.home()
>>> turtle.dot()
>>> turtle.fd(50); turtle.dot(20, "blue"); turtle.fd(50)
>>> turtle.position()
(100.00,-0.00)
>>> turtle.heading()
0.0
@end example
@end deffn

@geindex stamp() (in module turtle)
@anchor{library/turtle turtle stamp}@anchor{47a9}
@deffn {Function} turtle.stamp ()

Stamp a copy of the turtle shape onto the canvas at the current turtle
position.  Return a stamp_id for that stamp, which can be used to delete
it by calling @code{clearstamp(stamp_id)}.

@example
>>> turtle.color("blue")
>>> stamp_id = turtle.stamp()
>>> turtle.fd(50)
@end example
@end deffn

@geindex clearstamp() (in module turtle)
@anchor{library/turtle turtle clearstamp}@anchor{47aa}
@deffn {Function} turtle.clearstamp (stampid)

@*Parameters: 
@code{stampid} – an integer, must be return value of previous
@ref{47a9,,stamp()} call


Delete stamp with given `stampid'.

@example
>>> turtle.position()
(150.00,-0.00)
>>> turtle.color("blue")
>>> astamp = turtle.stamp()
>>> turtle.fd(50)
>>> turtle.position()
(200.00,-0.00)
>>> turtle.clearstamp(astamp)
>>> turtle.position()
(200.00,-0.00)
@end example
@end deffn

@geindex clearstamps() (in module turtle)
@anchor{library/turtle turtle clearstamps}@anchor{47ab}
@deffn {Function} turtle.clearstamps (n=None)

@*Parameters: 
@code{n} – an integer (or @code{None})


Delete all or first/last `n' of turtle’s stamps.  If `n' is @code{None}, delete
all stamps, if `n' > 0 delete first `n' stamps, else if `n' < 0 delete
last `n' stamps.

@example
>>> for i in range(8):
...     unused_stamp_id = turtle.stamp()
...     turtle.fd(30)
>>> turtle.clearstamps(2)
>>> turtle.clearstamps(-2)
>>> turtle.clearstamps()
@end example
@end deffn

@geindex undo() (in module turtle)
@anchor{library/turtle turtle undo}@anchor{47ac}
@deffn {Function} turtle.undo ()

Undo (repeatedly) the last turtle action(s).  Number of available
undo actions is determined by the size of the undobuffer.

@example
>>> for i in range(4):
...     turtle.fd(50); turtle.lt(80)
...
>>> for i in range(8):
...     turtle.undo()
@end example
@end deffn

@geindex speed() (in module turtle)
@anchor{library/turtle turtle speed}@anchor{47ad}
@deffn {Function} turtle.speed (speed=None)

@*Parameters: 
@code{speed} – an integer in the range 0..10 or a speedstring (see below)


Set the turtle’s speed to an integer value in the range 0..10.  If no
argument is given, return current speed.

If input is a number greater than 10 or smaller than 0.5, speed is set
to 0.  Speedstrings are mapped to speedvalues as follows:


@itemize *

@item 
“fastest”:  0

@item 
“fast”:  10

@item 
“normal”:  6

@item 
“slow”:  3

@item 
“slowest”:  1
@end itemize

Speeds from 1 to 10 enforce increasingly faster animation of line drawing
and turtle turning.

Attention: `speed' = 0 means that `no' animation takes
place. forward/back makes turtle jump and likewise left/right make the
turtle turn instantly.

@example
>>> turtle.speed()
3
>>> turtle.speed('normal')
>>> turtle.speed()
6
>>> turtle.speed(9)
>>> turtle.speed()
9
@end example
@end deffn

@node Tell Turtle’s state,Settings for measurement,Turtle motion,Methods of RawTurtle/Turtle and corresponding functions
@anchor{library/turtle tell-turtle-s-state}@anchor{4803}
@subsubsection Tell Turtle’s state


@geindex position() (in module turtle)
@geindex pos() (in module turtle)
@anchor{library/turtle turtle position}@anchor{47ae}
@deffn {Function} turtle.position ()
@anchor{library/turtle turtle pos}@anchor{47af}
@deffnx {Function} turtle.pos ()

Return the turtle’s current location (x,y) (as a @ref{4802,,Vec2D} vector).

@example
>>> turtle.pos()
(440.00,-0.00)
@end example
@end deffn

@geindex towards() (in module turtle)
@anchor{library/turtle turtle towards}@anchor{47b0}
@deffn {Function} turtle.towards (x, y=None)

@*Parameters: 

@itemize *

@item 
@code{x} – a number or a pair/vector of numbers or a turtle instance

@item 
@code{y} – a number if `x' is a number, else @code{None}
@end itemize


Return the angle between the line from turtle position to position specified
by (x,y), the vector or the other turtle.  This depends on the turtle’s start
orientation which depends on the mode - “standard”/”world” or “logo”.

@example
>>> turtle.goto(10, 10)
>>> turtle.towards(0,0)
225.0
@end example
@end deffn

@geindex xcor() (in module turtle)
@anchor{library/turtle turtle xcor}@anchor{47b1}
@deffn {Function} turtle.xcor ()

Return the turtle’s x coordinate.

@example
>>> turtle.home()
>>> turtle.left(50)
>>> turtle.forward(100)
>>> turtle.pos()
(64.28,76.60)
>>> print(round(turtle.xcor(), 5))
64.27876
@end example
@end deffn

@geindex ycor() (in module turtle)
@anchor{library/turtle turtle ycor}@anchor{47b2}
@deffn {Function} turtle.ycor ()

Return the turtle’s y coordinate.

@example
>>> turtle.home()
>>> turtle.left(60)
>>> turtle.forward(100)
>>> print(turtle.pos())
(50.00,86.60)
>>> print(round(turtle.ycor(), 5))
86.60254
@end example
@end deffn

@geindex heading() (in module turtle)
@anchor{library/turtle turtle heading}@anchor{47b3}
@deffn {Function} turtle.heading ()

Return the turtle’s current heading (value depends on the turtle mode, see
@ref{47f3,,mode()}).

@example
>>> turtle.home()
>>> turtle.left(67)
>>> turtle.heading()
67.0
@end example
@end deffn

@geindex distance() (in module turtle)
@anchor{library/turtle turtle distance}@anchor{47b4}
@deffn {Function} turtle.distance (x, y=None)

@*Parameters: 

@itemize *

@item 
@code{x} – a number or a pair/vector of numbers or a turtle instance

@item 
@code{y} – a number if `x' is a number, else @code{None}
@end itemize


Return the distance from the turtle to (x,y), the given vector, or the given
other turtle, in turtle step units.

@example
>>> turtle.home()
>>> turtle.distance(30,40)
50.0
>>> turtle.distance((30,40))
50.0
>>> joe = Turtle()
>>> joe.forward(77)
>>> turtle.distance(joe)
77.0
@end example
@end deffn

@node Settings for measurement,Pen control<2>,Tell Turtle’s state,Methods of RawTurtle/Turtle and corresponding functions
@anchor{library/turtle settings-for-measurement}@anchor{4804}
@subsubsection Settings for measurement


@geindex degrees() (in module turtle)
@anchor{library/turtle turtle degrees}@anchor{47b5}
@deffn {Function} turtle.degrees (fullcircle=360.0)

@*Parameters: 
@code{fullcircle} – a number


Set angle measurement units, i.e. set number of “degrees” for a full circle.
Default value is 360 degrees.

@example
>>> turtle.home()
>>> turtle.left(90)
>>> turtle.heading()
90.0

>>> # Change angle measurement unit to grad (also known as gon,
>>> # grade, or gradian and equals 1/100-th of the right angle.)
>>> turtle.degrees(400.0)
>>> turtle.heading()
100.0
>>> turtle.degrees(360)
>>> turtle.heading()
90.0
@end example
@end deffn

@geindex radians() (in module turtle)
@anchor{library/turtle turtle radians}@anchor{47b6}
@deffn {Function} turtle.radians ()

Set the angle measurement units to radians.  Equivalent to
@code{degrees(2*math.pi)}.

@example
>>> turtle.home()
>>> turtle.left(90)
>>> turtle.heading()
90.0
>>> turtle.radians()
>>> turtle.heading()
1.5707963267948966
@end example

@c >>> turtle.degrees(360)
@end deffn

@node Pen control<2>,Turtle state,Settings for measurement,Methods of RawTurtle/Turtle and corresponding functions
@anchor{library/turtle id1}@anchor{4805}
@subsubsection Pen control


@menu
* Drawing state:: 
* Color control:: 
* Filling:: 
* More drawing control:: 

@end menu

@node Drawing state,Color control,,Pen control<2>
@anchor{library/turtle drawing-state}@anchor{4806}
@subsubsection Drawing state


@geindex pendown() (in module turtle)
@geindex pd() (in module turtle)
@geindex down() (in module turtle)
@anchor{library/turtle turtle pendown}@anchor{47b7}
@deffn {Function} turtle.pendown ()
@anchor{library/turtle turtle pd}@anchor{47b8}
@deffnx {Function} turtle.pd ()
@anchor{library/turtle turtle down}@anchor{47b9}
@deffnx {Function} turtle.down ()

Pull the pen down – drawing when moving.
@end deffn

@geindex penup() (in module turtle)
@geindex pu() (in module turtle)
@geindex up() (in module turtle)
@anchor{library/turtle turtle penup}@anchor{47ba}
@deffn {Function} turtle.penup ()
@anchor{library/turtle turtle pu}@anchor{47bb}
@deffnx {Function} turtle.pu ()
@anchor{library/turtle turtle up}@anchor{47bc}
@deffnx {Function} turtle.up ()

Pull the pen up – no drawing when moving.
@end deffn

@geindex pensize() (in module turtle)
@geindex width() (in module turtle)
@anchor{library/turtle turtle pensize}@anchor{47bd}
@deffn {Function} turtle.pensize (width=None)
@anchor{library/turtle turtle width}@anchor{47be}
@deffnx {Function} turtle.width (width=None)

@*Parameters: 
@code{width} – a positive number


Set the line thickness to `width' or return it.  If resizemode is set to
“auto” and turtleshape is a polygon, that polygon is drawn with the same line
thickness.  If no argument is given, the current pensize is returned.

@example
>>> turtle.pensize()
1
>>> turtle.pensize(10)   # from here on lines of width 10 are drawn
@end example
@end deffn

@geindex pen() (in module turtle)
@anchor{library/turtle turtle pen}@anchor{47bf}
@deffn {Function} turtle.pen (pen=None, **pendict)

@*Parameters: 

@itemize *

@item 
@code{pen} – a dictionary with some or all of the below listed keys

@item 
@code{pendict} – one or more keyword-arguments with the below listed keys as keywords
@end itemize


Return or set the pen’s attributes in a “pen-dictionary” with the following
key/value pairs:


@itemize *

@item 
“shown”: True/False

@item 
“pendown”: True/False

@item 
“pencolor”: color-string or color-tuple

@item 
“fillcolor”: color-string or color-tuple

@item 
“pensize”: positive number

@item 
“speed”: number in range 0..10

@item 
“resizemode”: “auto” or “user” or “noresize”

@item 
“stretchfactor”: (positive number, positive number)

@item 
“outline”: positive number

@item 
“tilt”: number
@end itemize

This dictionary can be used as argument for a subsequent call to @code{pen()}
to restore the former pen-state.  Moreover one or more of these attributes
can be provided as keyword-arguments.  This can be used to set several pen
attributes in one statement.

@example
>>> turtle.pen(fillcolor="black", pencolor="red", pensize=10)
>>> sorted(turtle.pen().items())
[('fillcolor', 'black'), ('outline', 1), ('pencolor', 'red'),
 ('pendown', True), ('pensize', 10), ('resizemode', 'noresize'),
 ('shearfactor', 0.0), ('shown', True), ('speed', 9),
 ('stretchfactor', (1.0, 1.0)), ('tilt', 0.0)]
>>> penstate=turtle.pen()
>>> turtle.color("yellow", "")
>>> turtle.penup()
>>> sorted(turtle.pen().items())[:3]
[('fillcolor', '@w{'}), ('outline', 1), ('pencolor', 'yellow')]
>>> turtle.pen(penstate, fillcolor="green")
>>> sorted(turtle.pen().items())[:3]
[('fillcolor', 'green'), ('outline', 1), ('pencolor', 'red')]
@end example
@end deffn

@geindex isdown() (in module turtle)
@anchor{library/turtle turtle isdown}@anchor{47c0}
@deffn {Function} turtle.isdown ()

Return @code{True} if pen is down, @code{False} if it’s up.

@example
>>> turtle.penup()
>>> turtle.isdown()
False
>>> turtle.pendown()
>>> turtle.isdown()
True
@end example
@end deffn

@node Color control,Filling,Drawing state,Pen control<2>
@anchor{library/turtle color-control}@anchor{4807}
@subsubsection Color control


@geindex pencolor() (in module turtle)
@anchor{library/turtle turtle pencolor}@anchor{47c2}
@deffn {Function} turtle.pencolor ()

@deffnx {Function} turtle.pencolor (color, /)

@deffnx {Function} turtle.pencolor (r, g, b, /)

Return or set the pencolor.

Four input formats are allowed:


@table @asis

@item @code{pencolor()}

Return the current pencolor as color specification string or
as a tuple (see example).  May be used as input to another
color/pencolor/fillcolor/bgcolor call.

@item @code{pencolor(colorstring)}

Set pencolor to `colorstring', which is a Tk color specification string,
such as @code{"red"}, @code{"yellow"}, or @code{"#33cc8c"}.

@item @code{pencolor((r, g, b))}

Set pencolor to the RGB color represented by the tuple of `r', `g', and
`b'.  Each of `r', `g', and `b' must be in the range 0..colormode, where
colormode is either 1.0 or 255 (see @ref{47f4,,colormode()}).

@item @code{pencolor(r, g, b)}

Set pencolor to the RGB color represented by `r', `g', and `b'.  Each of
`r', `g', and `b' must be in the range 0..colormode.
@end table

If turtleshape is a polygon, the outline of that polygon is drawn with the
newly set pencolor.

@example
>>> colormode()
1.0
>>> turtle.pencolor()
'red'
>>> turtle.pencolor("brown")
>>> turtle.pencolor()
'brown'
>>> tup = (0.2, 0.8, 0.55)
>>> turtle.pencolor(tup)
>>> turtle.pencolor()
(0.2, 0.8, 0.5490196078431373)
>>> colormode(255)
>>> turtle.pencolor()
(51.0, 204.0, 140.0)
>>> turtle.pencolor('#32c18f')
>>> turtle.pencolor()
(50.0, 193.0, 143.0)
@end example
@end deffn

@geindex fillcolor() (in module turtle)
@anchor{library/turtle turtle fillcolor}@anchor{47c3}
@deffn {Function} turtle.fillcolor ()

@deffnx {Function} turtle.fillcolor (color, /)

@deffnx {Function} turtle.fillcolor (r, g, b, /)

Return or set the fillcolor.

Four input formats are allowed:


@table @asis

@item @code{fillcolor()}

Return the current fillcolor as color specification string, possibly
in tuple format (see example).  May be used as input to another
color/pencolor/fillcolor/bgcolor call.

@item @code{fillcolor(colorstring)}

Set fillcolor to `colorstring', which is a Tk color specification string,
such as @code{"red"}, @code{"yellow"}, or @code{"#33cc8c"}.

@item @code{fillcolor((r, g, b))}

Set fillcolor to the RGB color represented by the tuple of `r', `g', and
`b'.  Each of `r', `g', and `b' must be in the range 0..colormode, where
colormode is either 1.0 or 255 (see @ref{47f4,,colormode()}).

@item @code{fillcolor(r, g, b)}

Set fillcolor to the RGB color represented by `r', `g', and `b'.  Each of
`r', `g', and `b' must be in the range 0..colormode.
@end table

If turtleshape is a polygon, the interior of that polygon is drawn
with the newly set fillcolor.

@example
>>> turtle.fillcolor("violet")
>>> turtle.fillcolor()
'violet'
>>> turtle.pencolor()
(50.0, 193.0, 143.0)
>>> turtle.fillcolor((50, 193, 143))  # Integers, not floats
>>> turtle.fillcolor()
(50.0, 193.0, 143.0)
>>> turtle.fillcolor('#ffffff')
>>> turtle.fillcolor()
(255.0, 255.0, 255.0)
@end example
@end deffn

@geindex color() (in module turtle)
@anchor{library/turtle turtle color}@anchor{47c1}
@deffn {Function} turtle.color ()

@deffnx {Function} turtle.color (color, /)

@deffnx {Function} turtle.color (r, g, b, /)

@deffnx {Function} turtle.color (pencolor, fillcolor, /)

Return or set pencolor and fillcolor.

Several input formats are allowed.  They use 0 to 3 arguments as
follows:


@table @asis

@item @code{color()}

Return the current pencolor and the current fillcolor as a pair of color
specification strings or tuples as returned by @ref{47c2,,pencolor()} and
@ref{47c3,,fillcolor()}.

@item @code{color(colorstring)}, @code{color((r,g,b))}, @code{color(r,g,b)}

Inputs as in @ref{47c2,,pencolor()}, set both, fillcolor and pencolor, to the
given value.

@item @code{color(colorstring1, colorstring2)}, @code{color((r1,g1,b1), (r2,g2,b2))}

Equivalent to @code{pencolor(colorstring1)} and @code{fillcolor(colorstring2)}
and analogously if the other input format is used.
@end table

If turtleshape is a polygon, outline and interior of that polygon is drawn
with the newly set colors.

@example
>>> turtle.color("red", "green")
>>> turtle.color()
('red', 'green')
>>> color("#285078", "#a0c8f0")
>>> color()
((40.0, 80.0, 120.0), (160.0, 200.0, 240.0))
@end example
@end deffn

See also: Screen method @ref{47f4,,colormode()}.

@node Filling,More drawing control,Color control,Pen control<2>
@anchor{library/turtle filling}@anchor{4808}
@subsubsection Filling


@c >>> turtle.home()

@geindex filling() (in module turtle)
@anchor{library/turtle turtle filling}@anchor{47c4}
@deffn {Function} turtle.filling ()

Return fillstate (@code{True} if filling, @code{False} else).

@example
>>> turtle.begin_fill()
>>> if turtle.filling():
...    turtle.pensize(5)
... else:
...    turtle.pensize(3)
@end example
@end deffn

@geindex fill() (in module turtle)
@anchor{library/turtle turtle fill}@anchor{2a5}
@deffn {Function} turtle.fill ()

Fill the shape drawn in the @code{with turtle.fill():} block.

@example
>>> turtle.color("black", "red")
>>> with turtle.fill():
...     turtle.circle(80)
@end example

Using @code{fill()} is equivalent to adding the @ref{478e,,begin_fill()} before the
fill-block and @ref{478f,,end_fill()} after the fill-block:

@example
>>> turtle.color("black", "red")
>>> turtle.begin_fill()
>>> turtle.circle(80)
>>> turtle.end_fill()
@end example


Added in version 3.14.

@end deffn

@geindex begin_fill() (in module turtle)
@anchor{library/turtle turtle begin_fill}@anchor{478e}
@deffn {Function} turtle.begin_fill ()

To be called just before drawing a shape to be filled.
@end deffn

@geindex end_fill() (in module turtle)
@anchor{library/turtle turtle end_fill}@anchor{478f}
@deffn {Function} turtle.end_fill ()

Fill the shape drawn after the last call to @ref{478e,,begin_fill()}.

Whether or not overlap regions for self-intersecting polygons
or multiple shapes are filled depends on the operating system graphics,
type of overlap, and number of overlaps.  For example, the Turtle star
above may be either all yellow or have some white regions.

@example
>>> turtle.color("black", "red")
>>> turtle.begin_fill()
>>> turtle.circle(80)
>>> turtle.end_fill()
@end example
@end deffn

@node More drawing control,,Filling,Pen control<2>
@anchor{library/turtle more-drawing-control}@anchor{4809}
@subsubsection More drawing control


@geindex reset() (in module turtle)
@anchor{library/turtle turtle reset}@anchor{47c5}
@deffn {Function} turtle.reset ()

Delete the turtle’s drawings from the screen, re-center the turtle and set
variables to the default values.

@example
>>> turtle.goto(0,-22)
>>> turtle.left(100)
>>> turtle.position()
(0.00,-22.00)
>>> turtle.heading()
100.0
>>> turtle.reset()
>>> turtle.position()
(0.00,0.00)
>>> turtle.heading()
0.0
@end example
@end deffn

@geindex clear() (in module turtle)
@anchor{library/turtle turtle clear}@anchor{47c6}
@deffn {Function} turtle.clear ()

Delete the turtle’s drawings from the screen.  Do not move turtle.  State and
position of the turtle as well as drawings of other turtles are not affected.
@end deffn

@geindex write() (in module turtle)
@anchor{library/turtle turtle write}@anchor{47c7}
@deffn {Function} turtle.write (arg, move=False, align='left', font=('Arial', 8, 'normal'))

@*Parameters: 

@itemize *

@item 
@code{arg} – object to be written to the TurtleScreen

@item 
@code{move} – True/False

@item 
@code{align} – one of the strings “left”, “center” or right”

@item 
@code{font} – a triple (fontname, fontsize, fonttype)
@end itemize


Write text - the string representation of `arg' - at the current turtle
position according to `align' (“left”, “center” or “right”) and with the given
font.  If `move' is true, the pen is moved to the bottom-right corner of the
text.  By default, `move' is @code{False}.

@example
>>> turtle.write("Home = ", True, align="center")
>>> turtle.write((0,0), True)
@end example
@end deffn

@node Turtle state,Using events,Pen control<2>,Methods of RawTurtle/Turtle and corresponding functions
@anchor{library/turtle turtle-state}@anchor{480a}
@subsubsection Turtle state


@menu
* Visibility:: 
* Appearance:: 

@end menu

@node Visibility,Appearance,,Turtle state
@anchor{library/turtle visibility}@anchor{480b}
@subsubsection Visibility


@geindex hideturtle() (in module turtle)
@geindex ht() (in module turtle)
@anchor{library/turtle turtle hideturtle}@anchor{47ca}
@deffn {Function} turtle.hideturtle ()
@anchor{library/turtle turtle ht}@anchor{47cb}
@deffnx {Function} turtle.ht ()

Make the turtle invisible.  It’s a good idea to do this while you’re in the
middle of doing some complex drawing, because hiding the turtle speeds up the
drawing observably.

@example
>>> turtle.hideturtle()
@end example
@end deffn

@geindex showturtle() (in module turtle)
@geindex st() (in module turtle)
@anchor{library/turtle turtle showturtle}@anchor{47c8}
@deffn {Function} turtle.showturtle ()
@anchor{library/turtle turtle st}@anchor{47c9}
@deffnx {Function} turtle.st ()

Make the turtle visible.

@example
>>> turtle.showturtle()
@end example
@end deffn

@geindex isvisible() (in module turtle)
@anchor{library/turtle turtle isvisible}@anchor{47cc}
@deffn {Function} turtle.isvisible ()

Return @code{True} if the Turtle is shown, @code{False} if it’s hidden.

@example
>>> turtle.hideturtle()
>>> turtle.isvisible()
False
>>> turtle.showturtle()
>>> turtle.isvisible()
True
@end example
@end deffn

@node Appearance,,Visibility,Turtle state
@anchor{library/turtle appearance}@anchor{480c}
@subsubsection Appearance


@geindex shape() (in module turtle)
@anchor{library/turtle turtle shape}@anchor{47cd}
@deffn {Function} turtle.shape (name=None)

@*Parameters: 
@code{name} – a string which is a valid shapename


Set turtle shape to shape with given `name' or, if name is not given, return
name of current shape.  Shape with `name' must exist in the TurtleScreen’s
shape dictionary.  Initially there are the following polygon shapes: “arrow”,
“turtle”, “circle”, “square”, “triangle”, “classic”.  To learn about how to
deal with shapes see Screen method @ref{47f7,,register_shape()}.

@example
>>> turtle.shape()
'classic'
>>> turtle.shape("turtle")
>>> turtle.shape()
'turtle'
@end example
@end deffn

@geindex resizemode() (in module turtle)
@anchor{library/turtle turtle resizemode}@anchor{47ce}
@deffn {Function} turtle.resizemode (rmode=None)

@*Parameters: 
@code{rmode} – one of the strings “auto”, “user”, “noresize”


Set resizemode to one of the values: “auto”, “user”, “noresize”.  If `rmode'
is not given, return current resizemode.  Different resizemodes have the
following effects:


@itemize -

@item 
“auto”: adapts the appearance of the turtle corresponding to the value of pensize.

@item 
“user”: adapts the appearance of the turtle according to the values of
stretchfactor and outlinewidth (outline), which are set by
@ref{47cf,,shapesize()}.

@item 
“noresize”: no adaption of the turtle’s appearance takes place.
@end itemize

@code{resizemode("user")} is called by @ref{47cf,,shapesize()} when used with arguments.

@example
>>> turtle.resizemode()
'noresize'
>>> turtle.resizemode("auto")
>>> turtle.resizemode()
'auto'
@end example
@end deffn

@geindex shapesize() (in module turtle)
@geindex turtlesize() (in module turtle)
@anchor{library/turtle turtle shapesize}@anchor{47cf}
@deffn {Function} turtle.shapesize (stretch_wid=None, stretch_len=None, outline=None)
@anchor{library/turtle turtle turtlesize}@anchor{47d0}
@deffnx {Function} turtle.turtlesize (stretch_wid=None, stretch_len=None, outline=None)

@*Parameters: 

@itemize *

@item 
@code{stretch_wid} – positive number

@item 
@code{stretch_len} – positive number

@item 
@code{outline} – positive number
@end itemize


Return or set the pen’s attributes x/y-stretchfactors and/or outline.  Set
resizemode to “user”.  If and only if resizemode is set to “user”, the turtle
will be displayed stretched according to its stretchfactors: `stretch_wid' is
stretchfactor perpendicular to its orientation, `stretch_len' is
stretchfactor in direction of its orientation, `outline' determines the width
of the shape’s outline.

@example
>>> turtle.shapesize()
(1.0, 1.0, 1)
>>> turtle.resizemode("user")
>>> turtle.shapesize(5, 5, 12)
>>> turtle.shapesize()
(5, 5, 12)
>>> turtle.shapesize(outline=8)
>>> turtle.shapesize()
(5, 5, 8)
@end example
@end deffn

@geindex shearfactor() (in module turtle)
@anchor{library/turtle turtle shearfactor}@anchor{47d1}
@deffn {Function} turtle.shearfactor (shear=None)

@*Parameters: 
@code{shear} – number (optional)


Set or return the current shearfactor. Shear the turtleshape according to
the given shearfactor shear, which is the tangent of the shear angle.
Do `not' change the turtle’s heading (direction of movement).
If shear is not given: return the current shearfactor, i. e. the
tangent of the shear angle, by which lines parallel to the
heading of the turtle are sheared.

@example
>>> turtle.shape("circle")
>>> turtle.shapesize(5,2)
>>> turtle.shearfactor(0.5)
>>> turtle.shearfactor()
0.5
@end example
@end deffn

@geindex tilt() (in module turtle)
@anchor{library/turtle turtle tilt}@anchor{47d2}
@deffn {Function} turtle.tilt (angle)

@*Parameters: 
@code{angle} – a number


Rotate the turtleshape by `angle' from its current tilt-angle, but do `not'
change the turtle’s heading (direction of movement).

@example
>>> turtle.reset()
>>> turtle.shape("circle")
>>> turtle.shapesize(5,2)
>>> turtle.tilt(30)
>>> turtle.fd(50)
>>> turtle.tilt(30)
>>> turtle.fd(50)
@end example
@end deffn

@geindex tiltangle() (in module turtle)
@anchor{library/turtle turtle tiltangle}@anchor{934}
@deffn {Function} turtle.tiltangle (angle=None)

@*Parameters: 
@code{angle} – a number (optional)


Set or return the current tilt-angle. If angle is given, rotate the
turtleshape to point in the direction specified by angle,
regardless of its current tilt-angle. Do `not' change the turtle’s
heading (direction of movement).
If angle is not given: return the current tilt-angle, i. e. the angle
between the orientation of the turtleshape and the heading of the
turtle (its direction of movement).

@example
>>> turtle.reset()
>>> turtle.shape("circle")
>>> turtle.shapesize(5,2)
>>> turtle.tilt(45)
>>> turtle.tiltangle()
45.0
@end example
@end deffn

@geindex shapetransform() (in module turtle)
@anchor{library/turtle turtle shapetransform}@anchor{47d3}
@deffn {Function} turtle.shapetransform (t11=None, t12=None, t21=None, t22=None)

@*Parameters: 

@itemize *

@item 
@code{t11} – a number (optional)

@item 
@code{t12} – a number (optional)

@item 
@code{t21} – a number (optional)

@item 
@code{t12} – a number (optional)
@end itemize


Set or return the current transformation matrix of the turtle shape.

If none of the matrix elements are given, return the transformation
matrix as a tuple of 4 elements.
Otherwise set the given elements and transform the turtleshape
according to the matrix consisting of first row t11, t12 and
second row t21, t22. The determinant t11 * t22 - t12 * t21 must not be
zero, otherwise an error is raised.
Modify stretchfactor, shearfactor and tiltangle according to the
given matrix.

@example
>>> turtle = Turtle()
>>> turtle.shape("square")
>>> turtle.shapesize(4,2)
>>> turtle.shearfactor(-0.5)
>>> turtle.shapetransform()
(4.0, -1.0, -0.0, 2.0)
@end example
@end deffn

@geindex get_shapepoly() (in module turtle)
@anchor{library/turtle turtle get_shapepoly}@anchor{47d4}
@deffn {Function} turtle.get_shapepoly ()

Return the current shape polygon as tuple of coordinate pairs. This
can be used to define a new shape or components of a compound shape.

@example
>>> turtle.shape("square")
>>> turtle.shapetransform(4, -1, 0, 2)
>>> turtle.get_shapepoly()
((50, -20), (30, 20), (-50, 20), (-30, -20))
@end example
@end deffn

@node Using events,Special Turtle methods,Turtle state,Methods of RawTurtle/Turtle and corresponding functions
@anchor{library/turtle using-events}@anchor{480d}
@subsubsection Using events



@deffn {Function} turtle.onclick (fun, btn=1, add=None)

@*Parameters: 

@itemize *

@item 
@code{fun} – a function with two arguments which will be called with the
coordinates of the clicked point on the canvas

@item 
@code{btn} – number of the mouse-button, defaults to 1 (left mouse button)

@item 
@code{add} – @code{True} or @code{False} – if @code{True}, a new binding will be
added, otherwise it will replace a former binding
@end itemize


Bind `fun' to mouse-click events on this turtle.  If `fun' is @code{None},
existing bindings are removed.  Example for the anonymous turtle, i.e. the
procedural way:

@example
>>> def turn(x, y):
...     left(180)
...
>>> onclick(turn)  # Now clicking into the turtle will turn it.
>>> onclick(None)  # event-binding will be removed
@end example
@end deffn

@geindex onrelease() (in module turtle)
@anchor{library/turtle turtle onrelease}@anchor{47d6}
@deffn {Function} turtle.onrelease (fun, btn=1, add=None)

@*Parameters: 

@itemize *

@item 
@code{fun} – a function with two arguments which will be called with the
coordinates of the clicked point on the canvas

@item 
@code{btn} – number of the mouse-button, defaults to 1 (left mouse button)

@item 
@code{add} – @code{True} or @code{False} – if @code{True}, a new binding will be
added, otherwise it will replace a former binding
@end itemize


Bind `fun' to mouse-button-release events on this turtle.  If `fun' is
@code{None}, existing bindings are removed.

@example
>>> class MyTurtle(Turtle):
...     def glow(self,x,y):
...         self.fillcolor("red")
...     def unglow(self,x,y):
...         self.fillcolor("")
...
>>> turtle = MyTurtle()
>>> turtle.onclick(turtle.glow)     # clicking on turtle turns fillcolor red,
>>> turtle.onrelease(turtle.unglow) # releasing turns it to transparent.
@end example
@end deffn

@geindex ondrag() (in module turtle)
@anchor{library/turtle turtle ondrag}@anchor{47d7}
@deffn {Function} turtle.ondrag (fun, btn=1, add=None)

@*Parameters: 

@itemize *

@item 
@code{fun} – a function with two arguments which will be called with the
coordinates of the clicked point on the canvas

@item 
@code{btn} – number of the mouse-button, defaults to 1 (left mouse button)

@item 
@code{add} – @code{True} or @code{False} – if @code{True}, a new binding will be
added, otherwise it will replace a former binding
@end itemize


Bind `fun' to mouse-move events on this turtle.  If `fun' is @code{None},
existing bindings are removed.

Remark: Every sequence of mouse-move-events on a turtle is preceded by a
mouse-click event on that turtle.

@example
>>> turtle.ondrag(turtle.goto)
@end example

Subsequently, clicking and dragging the Turtle will move it across
the screen thereby producing handdrawings (if pen is down).
@end deffn

@node Special Turtle methods,Compound shapes,Using events,Methods of RawTurtle/Turtle and corresponding functions
@anchor{library/turtle special-turtle-methods}@anchor{480e}
@subsubsection Special Turtle methods


@geindex poly() (in module turtle)
@anchor{library/turtle turtle poly}@anchor{2a6}
@deffn {Function} turtle.poly ()

Record the vertices of a polygon drawn in the @code{with turtle.poly():} block.
The first and last vertices will be connected.

@example
>>> with turtle.poly():
...     turtle.forward(100)
...     turtle.right(60)
...     turtle.forward(100)
@end example


Added in version 3.14.

@end deffn

@geindex begin_poly() (in module turtle)
@anchor{library/turtle turtle begin_poly}@anchor{47d8}
@deffn {Function} turtle.begin_poly ()

Start recording the vertices of a polygon.  Current turtle position is first
vertex of polygon.
@end deffn

@geindex end_poly() (in module turtle)
@anchor{library/turtle turtle end_poly}@anchor{47d9}
@deffn {Function} turtle.end_poly ()

Stop recording the vertices of a polygon.  Current turtle position is last
vertex of polygon.  This will be connected with the first vertex.
@end deffn

@geindex get_poly() (in module turtle)
@anchor{library/turtle turtle get_poly}@anchor{47da}
@deffn {Function} turtle.get_poly ()

Return the last recorded polygon.

@example
>>> turtle.home()
>>> turtle.begin_poly()
>>> turtle.fd(100)
>>> turtle.left(20)
>>> turtle.fd(30)
>>> turtle.left(60)
>>> turtle.fd(50)
>>> turtle.end_poly()
>>> p = turtle.get_poly()
>>> register_shape("myFavouriteShape", p)
@end example
@end deffn

@geindex clone() (in module turtle)
@anchor{library/turtle turtle clone}@anchor{47db}
@deffn {Function} turtle.clone ()

Create and return a clone of the turtle with same position, heading and
turtle properties.

@example
>>> mick = Turtle()
>>> joe = mick.clone()
@end example
@end deffn

@geindex getturtle() (in module turtle)
@geindex getpen() (in module turtle)
@anchor{library/turtle turtle getturtle}@anchor{47dc}
@deffn {Function} turtle.getturtle ()
@anchor{library/turtle turtle getpen}@anchor{47dd}
@deffnx {Function} turtle.getpen ()

Return the Turtle object itself.  Only reasonable use: as a function to
return the “anonymous turtle”:

@example
>>> pet = getturtle()
>>> pet.fd(50)
>>> pet
<turtle.Turtle object at 0x...>
@end example
@end deffn

@geindex getscreen() (in module turtle)
@anchor{library/turtle turtle getscreen}@anchor{47de}
@deffn {Function} turtle.getscreen ()

Return the @ref{480f,,TurtleScreen} object the turtle is drawing on.
TurtleScreen methods can then be called for that object.

@example
>>> ts = turtle.getscreen()
>>> ts
<turtle._Screen object at 0x...>
>>> ts.bgcolor("pink")
@end example
@end deffn

@geindex setundobuffer() (in module turtle)
@anchor{library/turtle turtle setundobuffer}@anchor{47df}
@deffn {Function} turtle.setundobuffer (size)

@*Parameters: 
@code{size} – an integer or @code{None}


Set or disable undobuffer.  If `size' is an integer, an empty undobuffer of
given size is installed.  `size' gives the maximum number of turtle actions
that can be undone by the @ref{47ac,,undo()} method/function.  If `size' is
@code{None}, the undobuffer is disabled.

@example
>>> turtle.setundobuffer(42)
@end example
@end deffn

@geindex undobufferentries() (in module turtle)
@anchor{library/turtle turtle undobufferentries}@anchor{47e0}
@deffn {Function} turtle.undobufferentries ()

Return number of entries in the undobuffer.

@example
>>> while undobufferentries():
...     undo()
@end example
@end deffn

@node Compound shapes,,Special Turtle methods,Methods of RawTurtle/Turtle and corresponding functions
@anchor{library/turtle compound-shapes}@anchor{4810}@anchor{library/turtle compoundshapes}@anchor{4811}
@subsubsection Compound shapes


To use compound turtle shapes, which consist of several polygons of different
color, you must use the helper class @ref{4812,,Shape} explicitly as described
below:


@enumerate 

@item 
Create an empty Shape object of type “compound”.

@item 
Add as many components to this object as desired, using the
@ref{4813,,addcomponent()} method.

For example:

@example
>>> s = Shape("compound")
>>> poly1 = ((0,0),(10,-5),(0,10),(-10,-5))
>>> s.addcomponent(poly1, "red", "blue")
>>> poly2 = ((0,0),(10,-5),(-10,-5))
>>> s.addcomponent(poly2, "blue", "red")
@end example

@item 
Now add the Shape to the Screen’s shapelist and use it:

@example
>>> register_shape("myshape", s)
>>> shape("myshape")
@end example
@end enumerate

@cartouche
@quotation Note 
The @ref{4812,,Shape} class is used internally by the @ref{47f7,,register_shape()}
method in different ways.  The application programmer has to deal with the
Shape class `only' when using compound shapes like shown above!
@end quotation
@end cartouche

@node Methods of TurtleScreen/Screen and corresponding functions,Public classes,Methods of RawTurtle/Turtle and corresponding functions,turtle — Turtle graphics
@anchor{library/turtle methods-of-turtlescreen-screen-and-corresponding-functions}@anchor{4814}
@subsubsection Methods of TurtleScreen/Screen and corresponding functions


Most of the examples in this section refer to a TurtleScreen instance called
@code{screen}.

@c >>> screen = Screen()

@menu
* Window control:: 
* Animation control:: 
* Using screen events:: 
* Input methods:: 
* Settings and special methods:: 
* Methods specific to Screen@comma{} not inherited from TurtleScreen: Methods specific to Screen not inherited from TurtleScreen. 

@end menu

@node Window control,Animation control,,Methods of TurtleScreen/Screen and corresponding functions
@anchor{library/turtle window-control}@anchor{4815}
@subsubsection Window control


@geindex bgcolor() (in module turtle)
@anchor{library/turtle turtle bgcolor}@anchor{47e2}
@deffn {Function} turtle.bgcolor ()

@deffnx {Function} turtle.bgcolor (color, /)

@deffnx {Function} turtle.bgcolor (r, g, b, /)

Return or set the background color of the TurtleScreen.

Four input formats are allowed:


@table @asis

@item @code{bgcolor()}

Return the current background color as color specification string or
as a tuple (see example).  May be used as input to another
color/pencolor/fillcolor/bgcolor call.

@item @code{bgcolor(colorstring)}

Set the background color to `colorstring', which is a Tk color
specification string, such as @code{"red"}, @code{"yellow"}, or @code{"#33cc8c"}.

@item @code{bgcolor((r, g, b))}

Set the background color to the RGB color represented by the tuple of
`r', `g', and `b'.
Each of `r', `g', and `b' must be in the range 0..colormode, where
colormode is either 1.0 or 255 (see @ref{47f4,,colormode()}).

@item @code{bgcolor(r, g, b)}

Set the background color to the RGB color represented by `r', `g', and `b'.  Each of
`r', `g', and `b' must be in the range 0..colormode.
@end table

@example
>>> screen.bgcolor("orange")
>>> screen.bgcolor()
'orange'
>>> screen.bgcolor("#800080")
>>> screen.bgcolor()
(128.0, 0.0, 128.0)
@end example
@end deffn

@geindex bgpic() (in module turtle)
@anchor{library/turtle turtle bgpic}@anchor{47e3}
@deffn {Function} turtle.bgpic (picname=None)

@*Parameters: 
@code{picname} – a string, name of an image file (PNG, GIF, PGM, and PPM)
or @code{"nopic"}, or @code{None}


Set background image or return name of current backgroundimage.  If `picname'
is a filename, set the corresponding image as background.  If `picname' is
@code{"nopic"}, delete background image, if present.  If `picname' is @code{None},
return the filename of the current backgroundimage.

@example
>>> screen.bgpic()
'nopic'
>>> screen.bgpic("landscape.gif")
>>> screen.bgpic()
"landscape.gif"
@end example
@end deffn


@deffn {Function} turtle.clear ()

@cartouche
@quotation Note 
This TurtleScreen method is available as a global function only under the
name @code{clearscreen}.  The global function @code{clear} is a different one
derived from the Turtle method @code{clear}.
@end quotation
@end cartouche
@end deffn

@geindex clearscreen() (in module turtle)
@anchor{library/turtle turtle clearscreen}@anchor{47e4}
@deffn {Function} turtle.clearscreen ()

Delete all drawings and all turtles from the TurtleScreen.  Reset the now
empty TurtleScreen to its initial state: white background, no background
image, no event bindings and tracing on.
@end deffn


@deffn {Function} turtle.reset ()

@cartouche
@quotation Note 
This TurtleScreen method is available as a global function only under the
name @code{resetscreen}.  The global function @code{reset} is another one
derived from the Turtle method @code{reset}.
@end quotation
@end cartouche
@end deffn

@geindex resetscreen() (in module turtle)
@anchor{library/turtle turtle resetscreen}@anchor{47e5}
@deffn {Function} turtle.resetscreen ()

Reset all Turtles on the Screen to their initial state.
@end deffn

@geindex screensize() (in module turtle)
@anchor{library/turtle turtle screensize}@anchor{47e6}
@deffn {Function} turtle.screensize (canvwidth=None, canvheight=None, bg=None)

@*Parameters: 

@itemize *

@item 
@code{canvwidth} – positive integer, new width of canvas in pixels

@item 
@code{canvheight} – positive integer, new height of canvas in pixels

@item 
@code{bg} – colorstring or color-tuple, new background color
@end itemize


If no arguments are given, return current (canvaswidth, canvasheight).  Else
resize the canvas the turtles are drawing on.  Do not alter the drawing
window.  To observe hidden parts of the canvas, use the scrollbars. With this
method, one can make visible those parts of a drawing which were outside the
canvas before.

@example
>>> screen.screensize()
(400, 300)
>>> screen.screensize(2000,1500)
>>> screen.screensize()
(2000, 1500)
@end example

e.g. to search for an erroneously escaped turtle ;-)
@end deffn

@geindex setworldcoordinates() (in module turtle)
@anchor{library/turtle turtle setworldcoordinates}@anchor{47e7}
@deffn {Function} turtle.setworldcoordinates (llx, lly, urx, ury)

@*Parameters: 

@itemize *

@item 
@code{llx} – a number, x-coordinate of lower left corner of canvas

@item 
@code{lly} – a number, y-coordinate of lower left corner of canvas

@item 
@code{urx} – a number, x-coordinate of upper right corner of canvas

@item 
@code{ury} – a number, y-coordinate of upper right corner of canvas
@end itemize


Set up user-defined coordinate system and switch to mode “world” if
necessary.  This performs a @code{screen.reset()}.  If mode “world” is already
active, all drawings are redrawn according to the new coordinates.

`ATTENTION': in user-defined coordinate systems angles may appear
distorted.

@example
>>> screen.reset()
>>> screen.setworldcoordinates(-50,-7.5,50,7.5)
>>> for _ in range(72):
...     left(10)
...
>>> for _ in range(8):
...     left(45); fd(2)   # a regular octagon
@end example

@c >>> screen.reset()
@c >>> for t in turtles():
@c ...      t.reset()
@end deffn

@node Animation control,Using screen events,Window control,Methods of TurtleScreen/Screen and corresponding functions
@anchor{library/turtle animation-control}@anchor{4816}
@subsubsection Animation control


@geindex no_animation() (in module turtle)
@anchor{library/turtle turtle no_animation}@anchor{2a7}
@deffn {Function} turtle.no_animation ()

Temporarily disable turtle animation. The code written inside the
@code{no_animation} block will not be animated;
once the code block is exited, the drawing will appear.

@example
>>> with screen.no_animation():
...     for dist in range(2, 400, 2):
...         fd(dist)
...         rt(90)
@end example


Added in version 3.14.

@end deffn

@geindex delay() (in module turtle)
@anchor{library/turtle turtle delay}@anchor{47e8}
@deffn {Function} turtle.delay (delay=None)

@*Parameters: 
@code{delay} – positive integer


Set or return the drawing `delay' in milliseconds.  (This is approximately
the time interval between two consecutive canvas updates.)  The longer the
drawing delay, the slower the animation.

Optional argument:

@example
>>> screen.delay()
10
>>> screen.delay(5)
>>> screen.delay()
5
@end example
@end deffn

@geindex tracer() (in module turtle)
@anchor{library/turtle turtle tracer}@anchor{47e9}
@deffn {Function} turtle.tracer (n=None, delay=None)

@*Parameters: 

@itemize *

@item 
@code{n} – nonnegative integer

@item 
@code{delay} – nonnegative integer
@end itemize


Turn turtle animation on/off and set delay for update drawings.  If
`n' is given, only each n-th regular screen update is really
performed.  (Can be used to accelerate the drawing of complex
graphics.)  When called without arguments, returns the currently
stored value of n. Second argument sets delay value (see
@ref{47e8,,delay()}).

@example
>>> screen.tracer(8, 25)
>>> dist = 2
>>> for i in range(200):
...     fd(dist)
...     rt(90)
...     dist += 2
@end example
@end deffn

@geindex update() (in module turtle)
@anchor{library/turtle turtle update}@anchor{47ea}
@deffn {Function} turtle.update ()

Perform a TurtleScreen update. To be used when tracer is turned off.
@end deffn

See also the RawTurtle/Turtle method @ref{47ad,,speed()}.

@node Using screen events,Input methods,Animation control,Methods of TurtleScreen/Screen and corresponding functions
@anchor{library/turtle using-screen-events}@anchor{4817}
@subsubsection Using screen events


@geindex listen() (in module turtle)
@anchor{library/turtle turtle listen}@anchor{47eb}
@deffn {Function} turtle.listen (xdummy=None, ydummy=None)

Set focus on TurtleScreen (in order to collect key-events).  Dummy arguments
are provided in order to be able to pass @code{listen()} to the onclick method.
@end deffn

@geindex onkey() (in module turtle)
@geindex onkeyrelease() (in module turtle)
@anchor{library/turtle turtle onkey}@anchor{47ec}
@deffn {Function} turtle.onkey (fun, key)
@anchor{library/turtle turtle onkeyrelease}@anchor{47ed}
@deffnx {Function} turtle.onkeyrelease (fun, key)

@*Parameters: 

@itemize *

@item 
@code{fun} – a function with no arguments or @code{None}

@item 
@code{key} – a string: key (e.g. “a”) or key-symbol (e.g. “space”)
@end itemize


Bind `fun' to key-release event of key.  If `fun' is @code{None}, event bindings
are removed. Remark: in order to be able to register key-events, TurtleScreen
must have the focus. (See method @ref{47eb,,listen()}.)

@example
>>> def f():
...     fd(50)
...     lt(60)
...
>>> screen.onkey(f, "Up")
>>> screen.listen()
@end example
@end deffn

@geindex onkeypress() (in module turtle)
@anchor{library/turtle turtle onkeypress}@anchor{47ee}
@deffn {Function} turtle.onkeypress (fun, key=None)

@*Parameters: 

@itemize *

@item 
@code{fun} – a function with no arguments or @code{None}

@item 
@code{key} – a string: key (e.g. “a”) or key-symbol (e.g. “space”)
@end itemize


Bind `fun' to key-press event of key if key is given,
or to any key-press-event if no key is given.
Remark: in order to be able to register key-events, TurtleScreen
must have focus. (See method @ref{47eb,,listen()}.)

@example
>>> def f():
...     fd(50)
...
>>> screen.onkey(f, "Up")
>>> screen.listen()
@end example
@end deffn

@geindex onclick() (in module turtle)
@geindex onscreenclick() (in module turtle)
@anchor{library/turtle turtle onclick}@anchor{47d5}
@deffn {Function} turtle.onclick (fun, btn=1, add=None)
@anchor{library/turtle turtle onscreenclick}@anchor{47ef}
@deffnx {Function} turtle.onscreenclick (fun, btn=1, add=None)

@*Parameters: 

@itemize *

@item 
@code{fun} – a function with two arguments which will be called with the
coordinates of the clicked point on the canvas

@item 
@code{btn} – number of the mouse-button, defaults to 1 (left mouse button)

@item 
@code{add} – @code{True} or @code{False} – if @code{True}, a new binding will be
added, otherwise it will replace a former binding
@end itemize


Bind `fun' to mouse-click events on this screen.  If `fun' is @code{None},
existing bindings are removed.

Example for a TurtleScreen instance named @code{screen} and a Turtle instance
named @code{turtle}:

@example
>>> screen.onclick(turtle.goto) # Subsequently clicking into the TurtleScreen will
>>>                             # make the turtle move to the clicked point.
>>> screen.onclick(None)        # remove event binding again
@end example

@cartouche
@quotation Note 
This TurtleScreen method is available as a global function only under the
name @code{onscreenclick}.  The global function @code{onclick} is another one
derived from the Turtle method @code{onclick}.
@end quotation
@end cartouche
@end deffn

@geindex ontimer() (in module turtle)
@anchor{library/turtle turtle ontimer}@anchor{47f0}
@deffn {Function} turtle.ontimer (fun, t=0)

@*Parameters: 

@itemize *

@item 
@code{fun} – a function with no arguments

@item 
@code{t} – a number >= 0
@end itemize


Install a timer that calls `fun' after `t' milliseconds.

@example
>>> running = True
>>> def f():
...     if running:
...         fd(50)
...         lt(60)
...         screen.ontimer(f, 250)
>>> f()   ### makes the turtle march around
>>> running = False
@end example
@end deffn

@geindex mainloop() (in module turtle)
@geindex done() (in module turtle)
@anchor{library/turtle turtle mainloop}@anchor{47f1}
@deffn {Function} turtle.mainloop ()
@anchor{library/turtle turtle done}@anchor{47f2}
@deffnx {Function} turtle.done ()

Starts event loop - calling Tkinter’s mainloop function.
Must be the last statement in a turtle graphics program.
Must `not' be used if a script is run from within IDLE in -n mode
(No subprocess) - for interactive use of turtle graphics.

@example
>>> screen.mainloop()
@end example
@end deffn

@node Input methods,Settings and special methods,Using screen events,Methods of TurtleScreen/Screen and corresponding functions
@anchor{library/turtle input-methods}@anchor{4818}
@subsubsection Input methods


@geindex textinput() (in module turtle)
@anchor{library/turtle turtle textinput}@anchor{1cbd}
@deffn {Function} turtle.textinput (title, prompt)

@*Parameters: 

@itemize *

@item 
@code{title} – string

@item 
@code{prompt} – string
@end itemize


Pop up a dialog window for input of a string. Parameter title is
the title of the dialog window, prompt is a text mostly describing
what information to input.
Return the string input. If the dialog is canceled, return @code{None}.

@example
>>> screen.textinput("NIM", "Name of first player:")
@end example
@end deffn

@geindex numinput() (in module turtle)
@anchor{library/turtle turtle numinput}@anchor{1cbe}
@deffn {Function} turtle.numinput (title, prompt, default=None, minval=None, maxval=None)

@*Parameters: 

@itemize *

@item 
@code{title} – string

@item 
@code{prompt} – string

@item 
@code{default} – number (optional)

@item 
@code{minval} – number (optional)

@item 
@code{maxval} – number (optional)
@end itemize


Pop up a dialog window for input of a number. title is the title of the
dialog window, prompt is a text mostly describing what numerical information
to input. default: default value, minval: minimum value for input,
maxval: maximum value for input.
The number input must be in the range minval .. maxval if these are
given. If not, a hint is issued and the dialog remains open for
correction.
Return the number input. If the dialog is canceled,  return @code{None}.

@example
>>> screen.numinput("Poker", "Your stakes:", 1000, minval=10, maxval=10000)
@end example
@end deffn

@node Settings and special methods,Methods specific to Screen not inherited from TurtleScreen,Input methods,Methods of TurtleScreen/Screen and corresponding functions
@anchor{library/turtle settings-and-special-methods}@anchor{4819}
@subsubsection Settings and special methods


@geindex mode() (in module turtle)
@anchor{library/turtle turtle mode}@anchor{47f3}
@deffn {Function} turtle.mode (mode=None)

@*Parameters: 
@code{mode} – one of the strings “standard”, “logo” or “world”


Set turtle mode (“standard”, “logo” or “world”) and perform reset.  If mode
is not given, current mode is returned.

Mode “standard” is compatible with old @code{turtle}.  Mode “logo” is
compatible with most Logo turtle graphics.  Mode “world” uses user-defined
“world coordinates”. `Attention': in this mode angles appear distorted if
@code{x/y} unit-ratio doesn’t equal 1.


@multitable {xxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxx} 
@headitem

Mode

@tab

Initial turtle heading

@tab

positive angles

@item

“standard”

@tab

to the right (east)

@tab

counterclockwise

@item

“logo”

@tab

upward    (north)

@tab

clockwise

@end multitable


@example
>>> mode("logo")   # resets turtle heading to north
>>> mode()
'logo'
@end example
@end deffn

@geindex colormode() (in module turtle)
@anchor{library/turtle turtle colormode}@anchor{47f4}
@deffn {Function} turtle.colormode (cmode=None)

@*Parameters: 
@code{cmode} – one of the values 1.0 or 255


Return the colormode or set it to 1.0 or 255.  Subsequently `r', `g', `b'
values of color triples have to be in the range 0..*cmode*.

@example
>>> screen.colormode(1)
>>> turtle.pencolor(240, 160, 80)
Traceback (most recent call last):
     ...
TurtleGraphicsError: bad color sequence: (240, 160, 80)
>>> screen.colormode()
1.0
>>> screen.colormode(255)
>>> screen.colormode()
255
>>> turtle.pencolor(240,160,80)
@end example
@end deffn

@geindex getcanvas() (in module turtle)
@anchor{library/turtle turtle getcanvas}@anchor{47f5}
@deffn {Function} turtle.getcanvas ()

Return the Canvas of this TurtleScreen.  Useful for insiders who know what to
do with a Tkinter Canvas.

@example
>>> cv = screen.getcanvas()
>>> cv
<turtle.ScrolledCanvas object ...>
@end example
@end deffn

@geindex getshapes() (in module turtle)
@anchor{library/turtle turtle getshapes}@anchor{47f6}
@deffn {Function} turtle.getshapes ()

Return a list of names of all currently available turtle shapes.

@example
>>> screen.getshapes()
['arrow', 'blank', 'circle', ..., 'turtle']
@end example
@end deffn

@geindex register_shape() (in module turtle)
@geindex addshape() (in module turtle)
@anchor{library/turtle turtle register_shape}@anchor{47f7}
@deffn {Function} turtle.register_shape (name, shape=None)
@anchor{library/turtle turtle addshape}@anchor{47f8}
@deffnx {Function} turtle.addshape (name, shape=None)

There are four different ways to call this function:


@enumerate 

@item 
`name' is the name of an image file (PNG, GIF, PGM, and PPM) and `shape' is @code{None}: Install the
corresponding image shape.

@example
>>> screen.register_shape("turtle.gif")
@end example

@cartouche
@quotation Note 
Image shapes `do not' rotate when turning the turtle, so they do not
display the heading of the turtle!
@end quotation
@end cartouche

@item 
`name' is an arbitrary string and `shape' is the name of an image file (PNG, GIF, PGM, and PPM): Install the
corresponding image shape.

@example
>>> screen.register_shape("turtle", "turtle.gif")
@end example

@cartouche
@quotation Note 
Image shapes `do not' rotate when turning the turtle, so they do not
display the heading of the turtle!
@end quotation
@end cartouche

@item 
`name' is an arbitrary string and `shape' is a tuple of pairs of
coordinates: Install the corresponding polygon shape.

@example
>>> screen.register_shape("triangle", ((5,-3), (0,5), (-5,-3)))
@end example

@item 
`name' is an arbitrary string and `shape' is a (compound) @ref{4812,,Shape}
object: Install the corresponding compound shape.
@end enumerate

Add a turtle shape to TurtleScreen’s shapelist.  Only thusly registered
shapes can be used by issuing the command @code{shape(shapename)}.


Changed in version 3.14: Added support for PNG, PGM, and PPM image formats.
Both a shape name and an image file name can be specified.

@end deffn

@geindex turtles() (in module turtle)
@anchor{library/turtle turtle turtles}@anchor{47f9}
@deffn {Function} turtle.turtles ()

Return the list of turtles on the screen.

@example
>>> for turtle in screen.turtles():
...     turtle.color("red")
@end example
@end deffn

@geindex window_height() (in module turtle)
@anchor{library/turtle turtle window_height}@anchor{47fa}
@deffn {Function} turtle.window_height ()

Return the height of the turtle window.

@example
>>> screen.window_height()
480
@end example
@end deffn

@geindex window_width() (in module turtle)
@anchor{library/turtle turtle window_width}@anchor{47fb}
@deffn {Function} turtle.window_width ()

Return the width of the turtle window.

@example
>>> screen.window_width()
640
@end example
@end deffn

@node Methods specific to Screen not inherited from TurtleScreen,,Settings and special methods,Methods of TurtleScreen/Screen and corresponding functions
@anchor{library/turtle methods-specific-to-screen-not-inherited-from-turtlescreen}@anchor{481a}@anchor{library/turtle screenspecific}@anchor{481b}
@subsubsection Methods specific to Screen, not inherited from TurtleScreen


@geindex bye() (in module turtle)
@anchor{library/turtle turtle bye}@anchor{47fc}
@deffn {Function} turtle.bye ()

Shut the turtlegraphics window.
@end deffn

@geindex exitonclick() (in module turtle)
@anchor{library/turtle turtle exitonclick}@anchor{47fd}
@deffn {Function} turtle.exitonclick ()

Bind @code{bye()} method to mouse clicks on the Screen.

If the value “using_IDLE” in the configuration dictionary is @code{False}
(default value), also enter mainloop.  Remark: If IDLE with the @code{-n} switch
(no subprocess) is used, this value should be set to @code{True} in
@code{turtle.cfg}.  In this case IDLE’s own mainloop is active also for the
client script.
@end deffn

@geindex save() (in module turtle)
@anchor{library/turtle turtle save}@anchor{19b4}
@deffn {Function} turtle.save (filename, overwrite=False)

Save the current turtle drawing (and turtles) as a PostScript file.

@*Parameters: 

@itemize *

@item 
@code{filename} – the path of the saved PostScript file

@item 
@code{overwrite} – if @code{False} and there already exists a file with the given
filename, then the function will raise a
@code{FileExistsError}. If it is @code{True}, the file will be
overwritten.
@end itemize


@example
>>> screen.save("my_drawing.ps")
>>> screen.save("my_drawing.ps", overwrite=True)
@end example


Added in version 3.14.

@end deffn

@geindex setup() (in module turtle)
@anchor{library/turtle turtle setup}@anchor{47fe}
@deffn {Function} turtle.setup (width=_CFG['width'], height=_CFG['height'], startx=_CFG['leftright'], starty=_CFG['topbottom'])

Set the size and position of the main window.  Default values of arguments
are stored in the configuration dictionary and can be changed via a
@code{turtle.cfg} file.

@*Parameters: 

@itemize *

@item 
@code{width} – if an integer, a size in pixels, if a float, a fraction of the
screen; default is 50% of screen

@item 
@code{height} – if an integer, the height in pixels, if a float, a fraction of
the screen; default is 75% of screen

@item 
@code{startx} – if positive, starting position in pixels from the left
edge of the screen, if negative from the right edge, if @code{None},
center window horizontally

@item 
@code{starty} – if positive, starting position in pixels from the top
edge of the screen, if negative from the bottom edge, if @code{None},
center window vertically
@end itemize


@example
>>> screen.setup (width=200, height=200, startx=0, starty=0)
>>>              # sets window to 200x200 pixels, in upper left of screen
>>> screen.setup(width=.75, height=0.5, startx=None, starty=None)
>>>              # sets window to 75% of screen by 50% of screen and centers
@end example
@end deffn

@geindex title() (in module turtle)
@anchor{library/turtle turtle title}@anchor{47ff}
@deffn {Function} turtle.title (titlestring)

@*Parameters: 
@code{titlestring} – a string that is shown in the titlebar of the turtle
graphics window


Set title of turtle window to `titlestring'.

@example
>>> screen.title("Welcome to the turtle zoo!")
@end example
@end deffn

@node Public classes,Explanation<2>,Methods of TurtleScreen/Screen and corresponding functions,turtle — Turtle graphics
@anchor{library/turtle public-classes}@anchor{481c}
@subsubsection Public classes


@geindex RawTurtle (class in turtle)
@geindex RawPen (class in turtle)
@anchor{library/turtle turtle RawTurtle}@anchor{481d}
@deffn {Class} turtle.RawTurtle (canvas)
@anchor{library/turtle turtle RawPen}@anchor{481e}
@deffnx {Class} turtle.RawPen (canvas)

@*Parameters: 
@code{canvas} – a @code{tkinter.Canvas}, a @ref{481f,,ScrolledCanvas} or a
@ref{480f,,TurtleScreen}


Create a turtle.  The turtle has all methods described above as “methods of
Turtle/RawTurtle”.
@end deffn

@geindex Turtle (class in turtle)
@anchor{library/turtle turtle Turtle}@anchor{4820}
@deffn {Class} turtle.Turtle

Subclass of RawTurtle, has the same interface but draws on a default
@ref{4794,,Screen} object created automatically when needed for the first time.
@end deffn

@geindex TurtleScreen (class in turtle)
@anchor{library/turtle turtle TurtleScreen}@anchor{480f}
@deffn {Class} turtle.TurtleScreen (cv)

@*Parameters: 
@code{cv} – a @code{tkinter.Canvas}


Provides screen oriented methods like @ref{47e2,,bgcolor()} etc. that are described
above.
@end deffn

@geindex Screen (class in turtle)
@anchor{library/turtle turtle Screen}@anchor{4794}
@deffn {Class} turtle.Screen

Subclass of TurtleScreen, with @ref{481b,,four methods added}.
@end deffn

@geindex ScrolledCanvas (class in turtle)
@anchor{library/turtle turtle ScrolledCanvas}@anchor{481f}
@deffn {Class} turtle.ScrolledCanvas (master)

@*Parameters: 
@code{master} – some Tkinter widget to contain the ScrolledCanvas, i.e.
a Tkinter-canvas with scrollbars added


Used by class Screen, which thus automatically provides a ScrolledCanvas as
playground for the turtles.
@end deffn

@geindex Shape (class in turtle)
@anchor{library/turtle turtle Shape}@anchor{4812}
@deffn {Class} turtle.Shape (type_, data)

@*Parameters: 
@code{type_} – one of the strings “polygon”, “image”, “compound”


Data structure modeling shapes.  The pair @code{(type_, data)} must follow this
specification:


@multitable {xxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

`type_'

@tab

`data'

@item

“polygon”

@tab

a polygon-tuple, i.e. a tuple of pairs of coordinates

@item

“image”

@tab

an image  (in this form only used internally!)

@item

“compound”

@tab

@code{None} (a compound shape has to be constructed using the
@ref{4813,,addcomponent()} method)

@end multitable


@geindex addcomponent() (turtle.Shape method)
@anchor{library/turtle turtle Shape addcomponent}@anchor{4813}
@deffn {Method} addcomponent (poly, fill, outline=None)

@*Parameters: 

@itemize *

@item 
@code{poly} – a polygon, i.e. a tuple of pairs of numbers

@item 
@code{fill} – a color the `poly' will be filled with

@item 
@code{outline} – a color for the poly’s outline (if given)
@end itemize


Example:

@example
>>> poly = ((0,0),(10,-5),(0,10),(-10,-5))
>>> s = Shape("compound")
>>> s.addcomponent(poly, "red", "blue")
>>> # ... add more components and then use register_shape()
@end example

See @ref{4811,,Compound shapes}.
@end deffn
@end deffn

@geindex Vec2D (class in turtle)
@anchor{library/turtle turtle Vec2D}@anchor{4802}
@deffn {Class} turtle.Vec2D (x, y)

A two-dimensional vector class, used as a helper class for implementing
turtle graphics.  May be useful for turtle graphics programs too.  Derived
from tuple, so a vector is a tuple!

Provides (for `a', `b' vectors, `k' number):


@itemize *

@item 
@code{a + b} vector addition

@item 
@code{a - b} vector subtraction

@item 
@code{a * b} inner product

@item 
@code{k * a} and @code{a * k} multiplication with scalar

@item 
@code{abs(a)} absolute value of a

@item 
@code{a.rotate(angle)} rotation
@end itemize
@end deffn

@node Explanation<2>,Help and configuration,Public classes,turtle — Turtle graphics
@anchor{library/turtle explanation}@anchor{4821}@anchor{library/turtle turtle-explanation}@anchor{4793}
@subsubsection Explanation


A turtle object draws on a screen object, and there a number of key classes in
the turtle object-oriented interface that can be used to create them and relate
them to each other.

A @ref{4820,,Turtle} instance will automatically create a @ref{4794,,Screen}
instance if one is not already present.

@code{Turtle} is a subclass of @ref{481d,,RawTurtle}, which `doesn’t' automatically
create a drawing surface - a `canvas' will need to be provided or created for
it. The `canvas' can be a @code{tkinter.Canvas}, @ref{481f,,ScrolledCanvas}
or @ref{480f,,TurtleScreen}.

@ref{480f,,TurtleScreen} is the basic drawing surface for a
turtle. @ref{4794,,Screen} is a subclass of @code{TurtleScreen}, and
includes @ref{481b,,some additional methods} for managing its
appearance (including size and title) and behaviour. @code{TurtleScreen}’s
constructor needs a @code{tkinter.Canvas} or a
@ref{481f,,ScrolledCanvas} as an argument.

The functional interface for turtle graphics uses the various methods of
@code{Turtle} and @code{TurtleScreen}/@code{Screen}. Behind the scenes, a screen
object is automatically created whenever a function derived from a @code{Screen}
method is called. Similarly, a turtle object is automatically created
whenever any of the functions derived from a Turtle method is called.

To use multiple turtles on a screen, the object-oriented interface must be
used.

@node Help and configuration,turtledemo — Demo scripts,Explanation<2>,turtle — Turtle graphics
@anchor{library/turtle help-and-configuration}@anchor{4822}
@subsubsection Help and configuration


@menu
* How to use help:: 
* Translation of docstrings into different languages:: 
* How to configure Screen and Turtles:: 

@end menu

@node How to use help,Translation of docstrings into different languages,,Help and configuration
@anchor{library/turtle how-to-use-help}@anchor{4823}
@subsubsection How to use help


The public methods of the Screen and Turtle classes are documented extensively
via docstrings.  So these can be used as online-help via the Python help
facilities:


@itemize -

@item 
When using IDLE, tooltips show the signatures and first lines of the
docstrings of typed in function-/method calls.

@item 
Calling @ref{ada,,help()} on methods or functions displays the docstrings:

@example
>>> help(Screen.bgcolor)
Help on method bgcolor in module turtle:

bgcolor(self, *args) unbound turtle.Screen method
    Set or return backgroundcolor of the TurtleScreen.

    Arguments (if given): a color string or three numbers
    in the range 0..colormode or a 3-tuple of such numbers.


    >>> screen.bgcolor("orange")
    >>> screen.bgcolor()
    "orange"
    >>> screen.bgcolor(0.5,0,0.5)
    >>> screen.bgcolor()
    "#800080"

>>> help(Turtle.penup)
Help on method penup in module turtle:

penup(self) unbound turtle.Turtle method
    Pull the pen up -- no drawing when moving.

    Aliases: penup | pu | up

    No argument

    >>> turtle.penup()
@end example

@item 
The docstrings of the functions which are derived from methods have a modified
form:

@example
>>> help(bgcolor)
Help on function bgcolor in module turtle:

bgcolor(*args)
    Set or return backgroundcolor of the TurtleScreen.

    Arguments (if given): a color string or three numbers
    in the range 0..colormode or a 3-tuple of such numbers.

    Example::

      >>> bgcolor("orange")
      >>> bgcolor()
      "orange"
      >>> bgcolor(0.5,0,0.5)
      >>> bgcolor()
      "#800080"

>>> help(penup)
Help on function penup in module turtle:

penup()
    Pull the pen up -- no drawing when moving.

    Aliases: penup | pu | up

    No argument

    Example:
    >>> penup()
@end example
@end itemize

These modified docstrings are created automatically together with the function
definitions that are derived from the methods at import time.

@node Translation of docstrings into different languages,How to configure Screen and Turtles,How to use help,Help and configuration
@anchor{library/turtle translation-of-docstrings-into-different-languages}@anchor{4824}
@subsubsection Translation of docstrings into different languages


There is a utility to create a dictionary the keys of which are the method names
and the values of which are the docstrings of the public methods of the classes
Screen and Turtle.

@geindex write_docstringdict() (in module turtle)
@anchor{library/turtle turtle write_docstringdict}@anchor{4825}
@deffn {Function} turtle.write_docstringdict (filename='turtle_docstringdict')

@*Parameters: 
@code{filename} – a string, used as filename


Create and write docstring-dictionary to a Python script with the given
filename.  This function has to be called explicitly (it is not used by the
turtle graphics classes).  The docstring dictionary will be written to the
Python script @code{`filename'.py}.  It is intended to serve as a template
for translation of the docstrings into different languages.
@end deffn

If you (or your students) want to use @code{turtle} with online help in your
native language, you have to translate the docstrings and save the resulting
file as e.g. @code{turtle_docstringdict_german.py}.

If you have an appropriate entry in your @code{turtle.cfg} file this dictionary
will be read in at import time and will replace the original English docstrings.

At the time of this writing there are docstring dictionaries in German and in
Italian.  (Requests please to @email{glingl@@aon.at}.)

@node How to configure Screen and Turtles,,Translation of docstrings into different languages,Help and configuration
@anchor{library/turtle how-to-configure-screen-and-turtles}@anchor{4826}
@subsubsection How to configure Screen and Turtles


The built-in default configuration mimics the appearance and behaviour of the
old turtle module in order to retain best possible compatibility with it.

If you want to use a different configuration which better reflects the features
of this module or which better fits to your needs, e.g. for use in a classroom,
you can prepare a configuration file @code{turtle.cfg} which will be read at import
time and modify the configuration according to its settings.

The built in configuration would correspond to the following @code{turtle.cfg}:

@example
width = 0.5
height = 0.75
leftright = None
topbottom = None
canvwidth = 400
canvheight = 300
mode = standard
colormode = 1.0
delay = 10
undobuffersize = 1000
shape = classic
pencolor = black
fillcolor = black
resizemode = noresize
visible = True
language = english
exampleturtle = turtle
examplescreen = screen
title = Python Turtle Graphics
using_IDLE = False
@end example

Short explanation of selected entries:


@itemize -

@item 
The first four lines correspond to the arguments of the @ref{47fe,,Screen.setup}
method.

@item 
Line 5 and 6 correspond to the arguments of the method
@ref{47e6,,Screen.screensize}.

@item 
`shape' can be any of the built-in shapes, e.g: arrow, turtle, etc.  For more
info try @code{help(shape)}.

@item 
If you want to use no fill color (i.e. make the turtle transparent), you have
to write @code{fillcolor = ""} (but all nonempty strings must not have quotes in
the cfg file).

@item 
If you want to reflect the turtle its state, you have to use @code{resizemode =
auto}.

@item 
If you set e.g. @code{language = italian} the docstringdict
@code{turtle_docstringdict_italian.py} will be loaded at import time (if
present on the import path, e.g. in the same directory as @code{turtle}).

@item 
The entries `exampleturtle' and `examplescreen' define the names of these
objects as they occur in the docstrings.  The transformation of
method-docstrings to function-docstrings will delete these names from the
docstrings.

@item 
`using_IDLE': Set this to @code{True} if you regularly work with IDLE and its @code{-n}
switch (“no subprocess”).  This will prevent @ref{47fd,,exitonclick()} to enter the
mainloop.
@end itemize

There can be a @code{turtle.cfg} file in the directory where @code{turtle} is
stored and an additional one in the current working directory.  The latter will
override the settings of the first one.

The @code{Lib/turtledemo} directory contains a @code{turtle.cfg} file.  You can
study it as an example and see its effects when running the demos (preferably
not from within the demo-viewer).

@node turtledemo — Demo scripts,Changes since Python 2 6,Help and configuration,turtle — Turtle graphics
@anchor{library/turtle module-turtledemo}@anchor{109}@anchor{library/turtle turtledemo-demo-scripts}@anchor{4827}
@subsubsection @code{turtledemo} — Demo scripts


@geindex module; turtledemo

The @code{turtledemo} package includes a set of demo scripts.  These
scripts can be run and viewed using the supplied demo viewer as follows:

@example
python -m turtledemo
@end example

Alternatively, you can run the demo scripts individually.  For example,

@example
python -m turtledemo.bytedesign
@end example

The @code{turtledemo} package directory contains:


@itemize -

@item 
A demo viewer @code{__main__.py} which can be used to view the sourcecode
of the scripts and run them at the same time.

@item 
Multiple scripts demonstrating different features of the @code{turtle}
module.  Examples can be accessed via the Examples menu.  They can also
be run standalone.

@item 
A @code{turtle.cfg} file which serves as an example of how to write
and use such files.
@end itemize

The demo scripts are:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Name

@tab

Description

@tab

Features

@item

@code{bytedesign}

@tab

complex classical
turtle graphics pattern

@tab

@ref{47e9,,tracer()}, @ref{47e8,,delay()},
@ref{47ea,,update()}

@item

@code{chaos}

@tab

graphs Verhulst dynamics,
shows that computer’s
computations can generate
results sometimes against the
common sense expectations

@tab

world coordinates

@item

@code{clock}

@tab

analog clock showing time
of your computer

@tab

turtles as clock’s
hands, @ref{47f0,,ontimer()}

@item

@code{colormixer}

@tab

experiment with r, g, b

@tab

@ref{47d7,,ondrag()}

@item

@code{forest}

@tab

3 breadth-first trees

@tab

randomization

@item

@code{fractalcurves}

@tab

Hilbert & Koch curves

@tab

recursion

@item

@code{lindenmayer}

@tab

ethnomathematics
(indian kolams)

@tab

L-System

@item

@code{minimal_hanoi}

@tab

Towers of Hanoi

@tab

Rectangular Turtles
as Hanoi discs
(@ref{47cd,,shape()}, @ref{47cf,,shapesize()})

@item

@code{nim}

@tab

play the classical nim game
with three heaps of sticks
against the computer.

@tab

turtles as nimsticks,
event driven (mouse,
keyboard)

@item

@code{paint}

@tab

super minimalistic
drawing program

@tab

@ref{47d5,,onclick()}

@item

@code{peace}

@tab

elementary

@tab

turtle: appearance
and animation

@item

@code{penrose}

@tab

aperiodic tiling with
kites and darts

@tab

@ref{47a9,,stamp()}

@item

@code{planet_and_moon}

@tab

simulation of
gravitational system

@tab

compound shapes,
@ref{4802,,Vec2D}

@item

@code{rosette}

@tab

a pattern from the wikipedia
article on turtle graphics

@tab

@ref{47db,,clone()},
@ref{47ac,,undo()}

@item

@code{round_dance}

@tab

dancing turtles rotating
pairwise in opposite
direction

@tab

compound shapes, @ref{47db,,clone()}
@ref{47cf,,shapesize()}, @ref{47d2,,tilt()},
@ref{47d4,,get_shapepoly()}, @ref{47ea,,update()}

@item

@code{sorting_animate}

@tab

visual demonstration of
different sorting methods

@tab

simple alignment,
randomization

@item

@code{tree}

@tab

a (graphical) breadth
first tree (using generators)

@tab

@ref{47db,,clone()}

@item

@code{two_canvases}

@tab

simple design

@tab

turtles on two
canvases

@item

@code{yinyang}

@tab

another elementary example

@tab

@ref{47a7,,circle()}

@end multitable


Have fun!

@node Changes since Python 2 6,Changes since Python 3 0,turtledemo — Demo scripts,turtle — Turtle graphics
@anchor{library/turtle changes-since-python-2-6}@anchor{4828}
@subsubsection Changes since Python 2.6



@itemize -

@item 
The methods @ref{47e9,,Turtle.tracer}, @ref{47fb,,Turtle.window_width} and
@ref{47fa,,Turtle.window_height} have been eliminated.
Methods with these names and functionality are now available only
as methods of @ref{4794,,Screen}. The functions derived from these remain
available. (In fact already in Python 2.6 these methods were merely
duplications of the corresponding
@ref{480f,,TurtleScreen}/@code{Screen} methods.)

@item 
The method @code{Turtle.fill()} has been eliminated.
The behaviour of @ref{478e,,begin_fill()} and @ref{478f,,end_fill()}
have changed slightly: now every filling process must be completed with an
@code{end_fill()} call.

@item 
A method @ref{47c4,,Turtle.filling} has been added. It returns a boolean
value: @code{True} if a filling process is under way, @code{False} otherwise.
This behaviour corresponds to a @code{fill()} call without arguments in
Python 2.6.
@end itemize

@node Changes since Python 3 0,,Changes since Python 2 6,turtle — Turtle graphics
@anchor{library/turtle changes-since-python-3-0}@anchor{4829}
@subsubsection Changes since Python 3.0



@itemize -

@item 
The @ref{4820,,Turtle} methods @ref{47d1,,shearfactor()}, @ref{47d3,,shapetransform()} and
@ref{47d4,,get_shapepoly()} have been added. Thus the full range of
regular linear transforms is now available for transforming turtle shapes.
@ref{934,,tiltangle()} has been enhanced in functionality: it now can
be used to get or set the tilt angle.

@item 
The @ref{4794,,Screen} method @ref{47ee,,onkeypress()} has been added as a complement to
@ref{47ec,,onkey()}. As the latter binds actions to the key release event,
an alias: @ref{47ed,,onkeyrelease()} was also added for it.

@item 
The method @ref{47f1,,Screen.mainloop} has been added,
so there is no longer a need to use the standalone @code{mainloop()} function
when working with @ref{4794,,Screen} and @ref{4820,,Turtle} objects.

@item 
Two input methods have been added: @ref{1cbd,,Screen.textinput} and
@ref{1cbe,,Screen.numinput}. These pop up input dialogs and return
strings and numbers respectively.
@end itemize

@c >>> for turtle in turtles():
@c ...      turtle.reset()
@c >>> turtle.penup()
@c >>> turtle.goto(-200,25)
@c >>> turtle.pendown()
@c >>> turtle.write("No one expects the Spanish Inquisition!",
@c ...      font=("Arial", 20, "normal"))
@c >>> turtle.penup()
@c >>> turtle.goto(-100,-50)
@c >>> turtle.pendown()
@c >>> turtle.write("Our two chief Turtles are...",
@c ...      font=("Arial", 16, "normal"))
@c >>> turtle.penup()
@c >>> turtle.goto(-450,-75)
@c >>> turtle.write(str(turtles()))

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Other sections I have in mind are
@c Tkinter internals
@c Freezing Tkinter applications

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Development Tools,Debugging and Profiling,Graphical user interfaces with Tk,The Python Standard Library
@anchor{library/development doc}@anchor{482a}@anchor{library/development development}@anchor{482b}@anchor{library/development development-tools}@anchor{482c}@anchor{library/development translation-repo}@anchor{482d}
@section Development Tools


The modules described in this chapter help you write software.  For example, the
@ref{ba,,pydoc} module takes a module and generates documentation based on the
module’s contents.  The @ref{3e,,doctest} and @ref{10d,,unittest} modules contains
frameworks for writing unit tests that automatically exercise code and verify
that the expected output is produced.

The list of modules described in this chapter is:

@menu
* typing — Support for type hints:: 
* pydoc — Documentation generator and online help system:: 
* Python Development Mode:: 
* doctest — Test interactive Python examples:: 
* unittest — Unit testing framework:: 
* unittest.mock — mock object library: unittest mock — mock object library. 
* unittest.mock — getting started: unittest mock — getting started. 
* test — Regression tests package for Python:: 
* test.support — Utilities for the Python test suite: test support — Utilities for the Python test suite. 
* test.support.socket_helper — Utilities for socket tests: test support socket_helper — Utilities for socket tests. 
* test.support.script_helper — Utilities for the Python execution tests: test support script_helper — Utilities for the Python execution tests. 
* test.support.bytecode_helper — Support tools for testing correct bytecode generation: test support bytecode_helper — Support tools for testing correct bytecode generation. 
* test.support.threading_helper — Utilities for threading tests: test support threading_helper — Utilities for threading tests. 
* test.support.os_helper — Utilities for os tests: test support os_helper — Utilities for os tests. 
* test.support.import_helper — Utilities for import tests: test support import_helper — Utilities for import tests. 
* test.support.warnings_helper — Utilities for warnings tests: test support warnings_helper — Utilities for warnings tests. 

@end menu

@node typing — Support for type hints,pydoc — Documentation generator and online help system,,Development Tools
@anchor{library/typing doc}@anchor{482e}@anchor{library/typing typing-support-for-type-hints}@anchor{482f}
@subsection @code{typing} — Support for type hints


@c import typing
@c from dataclasses import dataclass
@c from typing import *

@geindex module; typing
@anchor{library/typing module-typing}@anchor{10b}

Added in version 3.5.


`Source code:' Lib/typing.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/typing.py}

@cartouche
@quotation Note 
The Python runtime does not enforce function and variable type annotations.
They can be used by third party tools such as @ref{574,,type checkers},
IDEs, linters, etc.
@end quotation
@end cartouche


__________________________________________________________________


This module provides runtime support for type hints.

Consider the function below:

@example
def surface_area_of_cube(edge_length: float) -> str:
    return f"The surface area of the cube is @{6 * edge_length ** 2@}."
@end example

The function @code{surface_area_of_cube} takes an argument expected to
be an instance of @ref{197,,float}, as indicated by the @ref{2412,,type hint}
@code{edge_length: float}. The function is expected to return an instance
of @ref{16a,,str}, as indicated by the @code{-> str} hint.

While type hints can be simple classes like @ref{197,,float} or @ref{16a,,str},
they can also be more complex. The @ref{10b,,typing} module provides a vocabulary of
more advanced type hints.

New features are frequently added to the @code{typing} module.
The typing_extensions@footnote{https://pypi.org/project/typing_extensions/} package
provides backports of these new features to older versions of Python.


@subsubheading See also



@table @asis

@item Typing cheat sheet@footnote{https://mypy.readthedocs.io/en/stable/cheat_sheet_py3.html}

A quick overview of type hints (hosted at the mypy docs)

@item Type System Reference section of the mypy docs@footnote{https://mypy.readthedocs.io/en/stable/index.html}

The Python typing system is standardised via PEPs, so this reference
should broadly apply to most Python type checkers. (Some parts may still
be specific to mypy.)

@item Static Typing with Python@footnote{https://typing.python.org/en/latest/}

Type-checker-agnostic documentation written by the community detailing
type system features, useful typing related tools and typing best
practices.
@end table


@menu
* Specification for the Python Type System:: 
* Type aliases:: 
* NewType:: 
* Annotating callable objects:: 
* Generics:: 
* Annotating tuples:: 
* The type of class objects:: 
* Annotating generators and coroutines:: 
* User-defined generic types:: 
* The Any type:: 
* Nominal vs structural subtyping:: 
* Module contents: Module contents<4>. 
* Deprecation Timeline of Major Features:: 

@end menu

@node Specification for the Python Type System,Type aliases,,typing — Support for type hints
@anchor{library/typing relevant-peps}@anchor{4830}@anchor{library/typing specification-for-the-python-type-system}@anchor{4831}
@subsubsection Specification for the Python Type System


The canonical, up-to-date specification of the Python type system can be
found at Specification for the Python type system@footnote{https://typing.python.org/en/latest/spec/index.html}.

@node Type aliases,NewType,Specification for the Python Type System,typing — Support for type hints
@anchor{library/typing id2}@anchor{4832}@anchor{library/typing type-aliases}@anchor{684}
@subsubsection Type aliases


A type alias is defined using the @ref{66d,,type} statement, which creates
an instance of @ref{2b0,,TypeAliasType}. In this example,
@code{Vector} and @code{list[float]} will be treated equivalently by static type
checkers:

@example
type Vector = list[float]

def scale(scalar: float, vector: Vector) -> Vector:
    return [scalar * num for num in vector]

# passes type checking; a list of floats qualifies as a Vector.
new_vector = scale(2.0, [1.0, -4.2, 5.4])
@end example

Type aliases are useful for simplifying complex type signatures. For example:

@example
from collections.abc import Sequence

type ConnectionOptions = dict[str, str]
type Address = tuple[str, int]
type Server = tuple[Address, ConnectionOptions]

def broadcast_message(message: str, servers: Sequence[Server]) -> None:
    ...

# The static type checker will treat the previous type signature as
# being exactly equivalent to this one.
def broadcast_message(
    message: str,
    servers: Sequence[tuple[tuple[str, int], dict[str, str]]]
) -> None:
    ...
@end example

The @ref{66d,,type} statement is new in Python 3.12. For backwards
compatibility, type aliases can also be created through simple assignment:

@example
Vector = list[float]
@end example

Or marked with @ref{9d2,,TypeAlias} to make it explicit that this is a type alias,
not a normal variable assignment:

@example
from typing import TypeAlias

Vector: TypeAlias = list[float]
@end example

@node NewType,Annotating callable objects,Type aliases,typing — Support for type hints
@anchor{library/typing distinct}@anchor{4833}@anchor{library/typing newtype}@anchor{4834}
@subsubsection NewType


Use the @ref{ef7,,NewType} helper to create distinct types:

@example
from typing import NewType

UserId = NewType('UserId', int)
some_id = UserId(524313)
@end example

The static type checker will treat the new type as if it were a subclass
of the original type. This is useful in helping catch logical errors:

@example
def get_user_name(user_id: UserId) -> str:
    ...

# passes type checking
user_a = get_user_name(UserId(42351))

# fails type checking; an int is not a UserId
user_b = get_user_name(-1)
@end example

You may still perform all @code{int} operations on a variable of type @code{UserId},
but the result will always be of type @code{int}. This lets you pass in a
@code{UserId} wherever an @code{int} might be expected, but will prevent you from
accidentally creating a @code{UserId} in an invalid way:

@example
# 'output' is of type 'int', not 'UserId'
output = UserId(23413) + UserId(54341)
@end example

Note that these checks are enforced only by the static type checker. At runtime,
the statement @code{Derived = NewType('Derived', Base)} will make @code{Derived} a
callable that immediately returns whatever parameter you pass it. That means
the expression @code{Derived(some_value)} does not create a new class or introduce
much overhead beyond that of a regular function call.

More precisely, the expression @code{some_value is Derived(some_value)} is always
true at runtime.

It is invalid to create a subtype of @code{Derived}:

@example
from typing import NewType

UserId = NewType('UserId', int)

# Fails at runtime and does not pass type checking
class AdminUserId(UserId): pass
@end example

However, it is possible to create a @ref{ef7,,NewType} based on a ‘derived’ @code{NewType}:

@example
from typing import NewType

UserId = NewType('UserId', int)

ProUserId = NewType('ProUserId', UserId)
@end example

and typechecking for @code{ProUserId} will work as expected.

See 
@geindex Python Enhancement Proposals; PEP 484
PEP 484@footnote{https://peps.python.org/pep-0484/} for more details.

@cartouche
@quotation Note 
Recall that the use of a type alias declares two types to be `equivalent' to
one another. Doing @code{type Alias = Original} will make the static type checker
treat @code{Alias} as being `exactly equivalent' to @code{Original} in all cases.
This is useful when you want to simplify complex type signatures.

In contrast, @code{NewType} declares one type to be a `subtype' of another.
Doing @code{Derived = NewType('Derived', Original)} will make the static type
checker treat @code{Derived} as a `subclass' of @code{Original}, which means a
value of type @code{Original} cannot be used in places where a value of type
@code{Derived} is expected. This is useful when you want to prevent logic
errors with minimal runtime cost.
@end quotation
@end cartouche


Added in version 3.5.2.



Changed in version 3.10: @code{NewType} is now a class rather than a function.  As a result, there is
some additional runtime cost when calling @code{NewType} over a regular
function.



Changed in version 3.11: The performance of calling @code{NewType} has been restored to its level in
Python 3.9.


@node Annotating callable objects,Generics,NewType,typing — Support for type hints
@anchor{library/typing annotating-callable-objects}@anchor{4835}@anchor{library/typing annotating-callables}@anchor{271a}
@subsubsection Annotating callable objects


Functions – or other @ref{2dec,,callable} objects – can be annotated using
@ref{9f1,,collections.abc.Callable} or deprecated @ref{9ce,,typing.Callable}.
@code{Callable[[int], str]} signifies a function that takes a single parameter
of type @ref{19c,,int} and returns a @ref{16a,,str}.

For example:

@example
from collections.abc import Callable, Awaitable

def feeder(get_next_item: Callable[[], str]) -> None:
    ...  # Body

def async_query(on_success: Callable[[int], None],
                on_error: Callable[[int, Exception], None]) -> None:
    ...  # Body

async def on_update(value: str) -> None:
    ...  # Body

callback: Callable[[str], Awaitable[None]] = on_update
@end example

@geindex ...; ellipsis literal

The subscription syntax must always be used with exactly two values: the
argument list and the return type.  The argument list must be a list of types,
a @ref{488,,ParamSpec}, @ref{9cd,,Concatenate}, or an ellipsis (@code{...}). The return type must
be a single type.

If a literal ellipsis @code{...} is given as the argument list, it indicates that
a callable with any arbitrary parameter list would be acceptable:

@example
def concat(x: str, y: str) -> str:
    return x + y

x: Callable[..., str]
x = str     # OK
x = concat  # Also OK
@end example

@code{Callable} cannot express complex signatures such as functions that take a
variadic number of arguments, @ref{4836,,overloaded functions}, or
functions that have keyword-only parameters. However, these signatures can be
expressed by defining a @ref{56b,,Protocol} class with a
@ref{77b,,__call__()} method:

@example
from collections.abc import Iterable
from typing import Protocol

class Combiner(Protocol):
    def __call__(self, *vals: bytes, maxlen: int | None = None) -> list[bytes]: ...

def batch_proc(data: Iterable[bytes], cb_results: Combiner) -> bytes:
    for item in data:
        ...

def good_cb(*vals: bytes, maxlen: int | None = None) -> list[bytes]:
    ...
def bad_cb(*vals: bytes, maxitems: int | None) -> list[bytes]:
    ...

batch_proc([], good_cb)  # OK
batch_proc([], bad_cb)   # Error! Argument 2 has incompatible type because of
                         # different name and kind in the callback
@end example

Callables which take other callables as arguments may indicate that their
parameter types are dependent on each other using @ref{488,,ParamSpec}.
Additionally, if that callable adds or removes arguments from other
callables, the @ref{9cd,,Concatenate} operator may be used.  They
take the form @code{Callable[ParamSpecVariable, ReturnType]} and
@code{Callable[Concatenate[Arg1Type, Arg2Type, ..., ParamSpecVariable], ReturnType]}
respectively.


Changed in version 3.10: @code{Callable} now supports @ref{488,,ParamSpec} and @ref{9cd,,Concatenate}.
See 
@geindex Python Enhancement Proposals; PEP 612
PEP 612@footnote{https://peps.python.org/pep-0612/} for more details.



@subsubheading See also


The documentation for @ref{488,,ParamSpec} and @ref{9cd,,Concatenate} provides
examples of usage in @code{Callable}.


@node Generics,Annotating tuples,Annotating callable objects,typing — Support for type hints
@anchor{library/typing generics}@anchor{2410}@anchor{library/typing id3}@anchor{4837}
@subsubsection Generics


Since type information about objects kept in containers cannot be statically
inferred in a generic way, many container classes in the standard library support
subscription to denote the expected types of container elements.

@example
from collections.abc import Mapping, Sequence

class Employee: ...

# Sequence[Employee] indicates that all elements in the sequence
# must be instances of "Employee".
# Mapping[str, str] indicates that all keys and all values in the mapping
# must be strings.
def notify_by_email(employees: Sequence[Employee],
                    overrides: Mapping[str, str]) -> None: ...
@end example

Generic functions and classes can be parameterized by using
@ref{5ad,,type parameter syntax}:

@example
from collections.abc import Sequence

def first[T](l: Sequence[T]) -> T:  # Function is generic over the TypeVar "T"
    return l[0]
@end example

Or by using the @ref{487,,TypeVar} factory directly:

@example
from collections.abc import Sequence
from typing import TypeVar

U = TypeVar('U')                  # Declare type variable "U"

def second(l: Sequence[U]) -> U:  # Function is generic over the TypeVar "U"
    return l[1]
@end example


Changed in version 3.12: Syntactic support for generics is new in Python 3.12.


@node Annotating tuples,The type of class objects,Generics,typing — Support for type hints
@anchor{library/typing annotating-tuples}@anchor{265d}@anchor{library/typing id4}@anchor{4838}
@subsubsection Annotating tuples


For most containers in Python, the typing system assumes that all elements in
the container will be of the same type. For example:

@example
from collections.abc import Mapping

# Type checker will infer that all elements in `@w{`}x`@w{`} are meant to be ints
x: list[int] = []

# Type checker error: `@w{`}list`@w{`} only accepts a single type argument:
y: list[int, str] = [1, 'foo']

# Type checker will infer that all keys in `@w{`}z`@w{`} are meant to be strings,
# and that all values in `@w{`}z`@w{`} are meant to be either strings or ints
z: Mapping[str, str | int] = @{@}
@end example

@ref{24f,,list} only accepts one type argument, so a type checker would emit an
error on the @code{y} assignment above. Similarly,
@ref{acd,,Mapping} only accepts two type arguments: the first
indicates the type of the keys, and the second indicates the type of the
values.

Unlike most other Python containers, however, it is common in idiomatic Python
code for tuples to have elements which are not all of the same type. For this
reason, tuples are special-cased in Python’s typing system. @ref{614,,tuple}
accepts `any number' of type arguments:

@example
# OK: `@w{`}x`@w{`} is assigned to a tuple of length 1 where the sole element is an int
x: tuple[int] = (5,)

# OK: `@w{`}y`@w{`} is assigned to a tuple of length 2;
# element 1 is an int, element 2 is a str
y: tuple[int, str] = (5, "foo")

# Error: the type annotation indicates a tuple of length 1,
# but `@w{`}z`@w{`} has been assigned to a tuple of length 3
z: tuple[int] = (1, 2, 3)
@end example

@geindex ...; ellipsis literal

To denote a tuple which could be of `any' length, and in which all elements are
of the same type @code{T}, use the literal ellipsis @code{...}: @code{tuple[T, ...]}.
To denote an empty tuple, use
@code{tuple[()]}. Using plain @code{tuple} as an annotation is equivalent to using
@code{tuple[Any, ...]}:

@example
x: tuple[int, ...] = (1, 2)
# These reassignments are OK: `@w{`}tuple[int, ...]`@w{`} indicates x can be of any length
x = (1, 2, 3)
x = ()
# This reassignment is an error: all elements in `@w{`}x`@w{`} must be ints
x = ("foo", "bar")

# `@w{`}y`@w{`} can only ever be assigned to an empty tuple
y: tuple[()] = ()

z: tuple = ("foo", "bar")
# These reassignments are OK: plain `@w{`}tuple`@w{`} is equivalent to `@w{`}tuple[Any, ...]`@w{`}
z = (1, 2, 3)
z = ()
@end example

@node The type of class objects,Annotating generators and coroutines,Annotating tuples,typing — Support for type hints
@anchor{library/typing the-type-of-class-objects}@anchor{4839}@anchor{library/typing type-of-class-objects}@anchor{483a}
@subsubsection The type of class objects


A variable annotated with @code{C} may accept a value of type @code{C}. In
contrast, a variable annotated with @code{type[C]} (or deprecated
@ref{483b,,typing.Type[C]}) may accept values that are classes
themselves – specifically, it will accept the `class object' of @code{C}. For
example:

@example
a = 3         # Has type `@w{`}int`@w{`}
b = int       # Has type `@w{`}type[int]`@w{`}
c = type(a)   # Also has type `@w{`}type[int]`@w{`}
@end example

Note that @code{type[C]} is covariant:

@example
class User: ...
class ProUser(User): ...
class TeamUser(User): ...

def make_new_user(user_class: type[User]) -> User:
    # ...
    return user_class()

make_new_user(User)      # OK
make_new_user(ProUser)   # Also OK: `@w{`}type[ProUser]`@w{`} is a subtype of `@w{`}type[User]`@w{`}
make_new_user(TeamUser)  # Still fine
make_new_user(User())    # Error: expected `@w{`}type[User]`@w{`} but got `@w{`}User`@w{`}
make_new_user(int)       # Error: `@w{`}type[int]`@w{`} is not a subtype of `@w{`}type[User]`@w{`}
@end example

The only legal parameters for @ref{f4a,,type} are classes, @ref{8bd,,Any},
@ref{2410,,type variables}, and unions of any of these types.
For example:

@example
def new_non_team_user(user_class: type[BasicUser | ProUser]): ...

new_non_team_user(BasicUser)  # OK
new_non_team_user(ProUser)    # OK
new_non_team_user(TeamUser)   # Error: `@w{`}type[TeamUser]`@w{`} is not a subtype
                              # of `@w{`}type[BasicUser | ProUser]`@w{`}
new_non_team_user(User)       # Also an error
@end example

@code{type[Any]} is equivalent to @ref{f4a,,type}, which is the root of Python’s
@ref{2405,,metaclass hierarchy}.

@node Annotating generators and coroutines,User-defined generic types,The type of class objects,typing — Support for type hints
@anchor{library/typing annotating-generators-and-coroutines}@anchor{2a05}@anchor{library/typing id5}@anchor{483c}
@subsubsection Annotating generators and coroutines


A generator can be annotated using the generic type
@ref{fe1,,Generator[YieldType@comma{} SendType@comma{} ReturnType]}.
For example:

@example
def echo_round() -> Generator[int, float, str]:
    sent = yield 0
    while sent >= 0:
        sent = yield round(sent)
    return 'Done'
@end example

Note that unlike many other generic classes in the standard library,
the @code{SendType} of @ref{fe1,,Generator} behaves
contravariantly, not covariantly or invariantly.

The @code{SendType} and @code{ReturnType} parameters default to @code{None}:

@example
def infinite_stream(start: int) -> Generator[int]:
    while True:
        yield start
        start += 1
@end example

It is also possible to set these types explicitly:

@example
def infinite_stream(start: int) -> Generator[int, None, None]:
    while True:
        yield start
        start += 1
@end example

Simple generators that only ever yield values can also be annotated
as having a return type of either
@ref{26f9,,Iterable[YieldType]}
or @ref{26fa,,Iterator[YieldType]}:

@example
def infinite_stream(start: int) -> Iterator[int]:
    while True:
        yield start
        start += 1
@end example

Async generators are handled in a similar fashion, but don’t
expect a @code{ReturnType} type argument
(@ref{e8d,,AsyncGenerator[YieldType@comma{} SendType]}).
The @code{SendType} argument defaults to @code{None}, so the following definitions
are equivalent:

@example
async def infinite_stream(start: int) -> AsyncGenerator[int]:
    while True:
        yield start
        start = await increment(start)

async def infinite_stream(start: int) -> AsyncGenerator[int, None]:
    while True:
        yield start
        start = await increment(start)
@end example

As in the synchronous case,
@ref{fe5,,AsyncIterable[YieldType]}
and @ref{fe4,,AsyncIterator[YieldType]} are
available as well:

@example
async def infinite_stream(start: int) -> AsyncIterator[int]:
    while True:
        yield start
        start = await increment(start)
@end example

Coroutines can be annotated using
@ref{fe3,,Coroutine[YieldType@comma{} SendType@comma{} ReturnType]}.
Generic arguments correspond to those of @ref{fe1,,Generator},
for example:

@example
from collections.abc import Coroutine
c: Coroutine[list[str], str, int]  # Some coroutine defined elsewhere
x = c.send('hi')                   # Inferred type of 'x' is list[str]
async def bar() -> None:
    y = await c                    # Inferred type of 'y' is int
@end example

@node User-defined generic types,The Any type,Annotating generators and coroutines,typing — Support for type hints
@anchor{library/typing user-defined-generic-types}@anchor{483d}@anchor{library/typing user-defined-generics}@anchor{6f7}
@subsubsection User-defined generic types


A user-defined class can be defined as a generic class.

@example
from logging import Logger

class LoggedVar[T]:
    def __init__(self, value: T, name: str, logger: Logger) -> None:
        self.name = name
        self.logger = logger
        self.value = value

    def set(self, new: T) -> None:
        self.log('Set ' + repr(self.value))
        self.value = new

    def get(self) -> T:
        self.log('Get ' + repr(self.value))
        return self.value

    def log(self, message: str) -> None:
        self.logger.info('%s: %s', self.name, message)
@end example

This syntax indicates that the class @code{LoggedVar} is parameterised around a
single @ref{483e,,type variable} @code{T} . This also makes @code{T} valid as
a type within the class body.

Generic classes implicitly inherit from @ref{1806,,Generic}. For compatibility
with Python 3.11 and lower, it is also possible to inherit explicitly from
@code{Generic} to indicate a generic class:

@example
from typing import TypeVar, Generic

T = TypeVar('T')

class LoggedVar(Generic[T]):
    ...
@end example

Generic classes have @ref{948,,__class_getitem__()} methods, meaning they
can be parameterised at runtime (e.g. @code{LoggedVar[int]} below):

@example
from collections.abc import Iterable

def zero_all_vars(vars: Iterable[LoggedVar[int]]) -> None:
    for var in vars:
        var.set(0)
@end example

A generic type can have any number of type variables. All varieties of
@ref{487,,TypeVar} are permissible as parameters for a generic type:

@example
from typing import TypeVar, Generic, Sequence

class WeirdTrio[T, B: Sequence[bytes], S: (int, str)]:
    ...

OldT = TypeVar('OldT', contravariant=True)
OldB = TypeVar('OldB', bound=Sequence[bytes], covariant=True)
OldS = TypeVar('OldS', int, str)

class OldWeirdTrio(Generic[OldT, OldB, OldS]):
    ...
@end example

Each type variable argument to @ref{1806,,Generic} must be distinct.
This is thus invalid:

@example
from typing import TypeVar, Generic
...

class Pair[M, M]:  # SyntaxError
    ...

T = TypeVar('T')

class Pair(Generic[T, T]):   # INVALID
    ...
@end example

Generic classes can also inherit from other classes:

@example
from collections.abc import Sized

class LinkedList[T](Sized):
    ...
@end example

When inheriting from generic classes, some type parameters could be fixed:

@example
from collections.abc import Mapping

class MyDict[T](Mapping[str, T]):
    ...
@end example

In this case @code{MyDict} has a single parameter, @code{T}.

Using a generic class without specifying type parameters assumes
@ref{8bd,,Any} for each position. In the following example, @code{MyIterable} is
not generic but implicitly inherits from @code{Iterable[Any]}:

@example
from collections.abc import Iterable

class MyIterable(Iterable): # Same as Iterable[Any]
    ...
@end example

User-defined generic type aliases are also supported. Examples:

@example
from collections.abc import Iterable

type Response[S] = Iterable[S] | int

# Return type here is same as Iterable[str] | int
def response(query: str) -> Response[str]:
    ...

type Vec[T] = Iterable[tuple[T, T]]

def inproduct[T: (int, float, complex)](v: Vec[T]) -> T: # Same as Iterable[tuple[T, T]]
    return sum(x*y for x, y in v)
@end example

For backward compatibility, generic type aliases can also be created
through a simple assignment:

@example
from collections.abc import Iterable
from typing import TypeVar

S = TypeVar("S")
Response = Iterable[S] | int
@end example


Changed in version 3.7: @ref{1806,,Generic} no longer has a custom metaclass.



Changed in version 3.12: Syntactic support for generics and type aliases is new in version 3.12.
Previously, generic classes had to explicitly inherit from @ref{1806,,Generic}
or contain a type variable in one of their bases.


User-defined generics for parameter expressions are also supported via parameter
specification variables in the form @code{[**P]}.  The behavior is consistent
with type variables’ described above as parameter specification variables are
treated by the @code{typing} module as a specialized type variable.  The one exception
to this is that a list of types can be used to substitute a @ref{488,,ParamSpec}:

@example
>>> class Z[T, **P]: ...  # T is a TypeVar; P is a ParamSpec
...
>>> Z[int, [dict, float]]
__main__.Z[int, [dict, float]]
@end example

Classes generic over a @ref{488,,ParamSpec} can also be created using explicit
inheritance from @ref{1806,,Generic}. In this case, @code{**} is not used:

@example
from typing import ParamSpec, Generic

P = ParamSpec('P')

class Z(Generic[P]):
    ...
@end example

Another difference between @ref{487,,TypeVar} and @ref{488,,ParamSpec} is that a
generic with only one parameter specification variable will accept
parameter lists in the forms @code{X[[Type1, Type2, ...]]} and also
@code{X[Type1, Type2, ...]} for aesthetic reasons.  Internally, the latter is converted
to the former, so the following are equivalent:

@example
>>> class X[**P]: ...
...
>>> X[int, str]
__main__.X[[int, str]]
>>> X[[int, str]]
__main__.X[[int, str]]
@end example

Note that generics with @ref{488,,ParamSpec} may not have correct
@code{__parameters__} after substitution in some cases because they
are intended primarily for static type checking.


Changed in version 3.10: @ref{1806,,Generic} can now be parameterized over parameter expressions.
See @ref{488,,ParamSpec} and 
@geindex Python Enhancement Proposals; PEP 612
PEP 612@footnote{https://peps.python.org/pep-0612/} for more details.


A user-defined generic class can have ABCs as base classes without a metaclass
conflict. Generic metaclasses are not supported. The outcome of parameterizing
generics is cached, and most types in the @code{typing} module are @ref{825,,hashable} and
comparable for equality.

@node The Any type,Nominal vs structural subtyping,User-defined generic types,typing — Support for type hints
@anchor{library/typing the-any-type}@anchor{483f}
@subsubsection The @code{Any} type


A special kind of type is @ref{8bd,,Any}. A static type checker will treat
every type as assignable to @code{Any} and @code{Any} as assignable to
every type.

This means that it is possible to perform any operation or method call on a
value of type @ref{8bd,,Any} and assign it to any variable:

@example
from typing import Any

a: Any = None
a = []          # OK
a = 2           # OK

s: str = '@w{'}
s = a           # OK

def foo(item: Any) -> int:
    # Passes type checking; 'item' could be any type,
    # and that type might have a 'bar' method
    item.bar()
    ...
@end example

Notice that no type checking is performed when assigning a value of type
@ref{8bd,,Any} to a more precise type. For example, the static type checker did
not report an error when assigning @code{a} to @code{s} even though @code{s} was
declared to be of type @ref{16a,,str} and receives an @ref{19c,,int} value at
runtime!

Furthermore, all functions without a return type or parameter types will
implicitly default to using @ref{8bd,,Any}:

@example
def legacy_parser(text):
    ...
    return data

# A static type checker will treat the above
# as having the same signature as:
def legacy_parser(text: Any) -> Any:
    ...
    return data
@end example

This behavior allows @ref{8bd,,Any} to be used as an `escape hatch' when you
need to mix dynamically and statically typed code.

Contrast the behavior of @ref{8bd,,Any} with the behavior of @ref{c84,,object}.
Similar to @code{Any}, every type is a subtype of @code{object}. However,
unlike @code{Any}, the reverse is not true: @code{object} is `not' a
subtype of every other type.

That means when the type of a value is @ref{c84,,object}, a type checker will
reject almost all operations on it, and assigning it to a variable (or using
it as a return value) of a more specialized type is a type error. For example:

@example
def hash_a(item: object) -> int:
    # Fails type checking; an object does not have a 'magic' method.
    item.magic()
    ...

def hash_b(item: Any) -> int:
    # Passes type checking
    item.magic()
    ...

# Passes type checking, since ints and strs are subclasses of object
hash_a(42)
hash_a("foo")

# Passes type checking, since Any is assignable to all types
hash_b(42)
hash_b("foo")
@end example

Use @ref{c84,,object} to indicate that a value could be any type in a typesafe
manner. Use @ref{8bd,,Any} to indicate that a value is dynamically typed.

@node Nominal vs structural subtyping,Module contents<4>,The Any type,typing — Support for type hints
@anchor{library/typing nominal-vs-structural-subtyping}@anchor{4840}
@subsubsection Nominal vs structural subtyping


Initially 
@geindex Python Enhancement Proposals; PEP 484
PEP 484@footnote{https://peps.python.org/pep-0484/} defined the Python static type system as using
`nominal subtyping'. This means that a class @code{A} is allowed where
a class @code{B} is expected if and only if @code{A} is a subclass of @code{B}.

This requirement previously also applied to abstract base classes, such as
@ref{26f9,,Iterable}. The problem with this approach is that a class had
to be explicitly marked to support them, which is unpythonic and unlike
what one would normally do in idiomatic dynamically typed Python code.
For example, this conforms to 
@geindex Python Enhancement Proposals; PEP 484
PEP 484@footnote{https://peps.python.org/pep-0484/}:

@example
from collections.abc import Sized, Iterable, Iterator

class Bucket(Sized, Iterable[int]):
    ...
    def __len__(self) -> int: ...
    def __iter__(self) -> Iterator[int]: ...
@end example

@geindex Python Enhancement Proposals; PEP 544
PEP 544@footnote{https://peps.python.org/pep-0544/} solves this problem by allowing users to write
the above code without explicit base classes in the class definition,
allowing @code{Bucket} to be implicitly considered a subtype of both @code{Sized}
and @code{Iterable[int]} by static type checkers. This is known as
`structural subtyping' (or static duck-typing):

@example
from collections.abc import Iterator, Iterable

class Bucket:  # Note: no base classes
    ...
    def __len__(self) -> int: ...
    def __iter__(self) -> Iterator[int]: ...

def collect(items: Iterable[int]) -> int: ...
result = collect(Bucket())  # Passes type check
@end example

Moreover, by subclassing a special class @ref{56b,,Protocol}, a user
can define new custom protocols to fully enjoy structural subtyping
(see examples below).

@node Module contents<4>,Deprecation Timeline of Major Features,Nominal vs structural subtyping,typing — Support for type hints
@anchor{library/typing module-contents}@anchor{4841}
@subsubsection Module contents


The @code{typing} module defines the following classes, functions and decorators.

@menu
* Special typing primitives:: 
* Protocols: Protocols<4>. 
* ABCs and Protocols for working with I/O:: 
* Functions and decorators:: 
* Introspection helpers:: 
* Constant:: 
* Deprecated aliases:: 

@end menu

@node Special typing primitives,Protocols<4>,,Module contents<4>
@anchor{library/typing special-typing-primitives}@anchor{4842}
@subsubsection Special typing primitives


@menu
* Special types:: 
* Special forms:: 
* Building generic types and type aliases:: 
* Other special directives:: 

@end menu

@node Special types,Special forms,,Special typing primitives
@anchor{library/typing special-types}@anchor{4843}
@subsubsection Special types


These can be used as types in annotations. They do not support subscription
using @code{[]}.

@geindex Any (in module typing)
@anchor{library/typing typing Any}@anchor{8bd}
@deffn {Data} typing.Any

Special type indicating an unconstrained type.


@itemize *

@item 
Every type is assignable to @code{Any}.

@item 
@code{Any} is assignable to every type.
@end itemize


Changed in version 3.11: @code{Any} can now be used as a base class. This can be useful for
avoiding type checker errors with classes that can duck type anywhere or
are highly dynamic.

@end deffn

@geindex AnyStr (in module typing)
@anchor{library/typing typing AnyStr}@anchor{5ac}
@deffn {Data} typing.AnyStr

A @ref{4844,,constrained type variable}.

Definition:

@example
AnyStr = TypeVar('AnyStr', str, bytes)
@end example

@code{AnyStr} is meant to be used for functions that may accept @ref{16a,,str} or
@ref{193,,bytes} arguments but cannot allow the two to mix.

For example:

@example
def concat(a: AnyStr, b: AnyStr) -> AnyStr:
    return a + b

concat("foo", "bar")    # OK, output has type 'str'
concat(b"foo", b"bar")  # OK, output has type 'bytes'
concat("foo", b"bar")   # Error, cannot mix str and bytes
@end example

Note that, despite its name, @code{AnyStr} has nothing to do with the
@ref{8bd,,Any} type, nor does it mean “any string”. In particular, @code{AnyStr}
and @code{str | bytes} are different from each other and have different use
cases:

@example
# Invalid use of AnyStr:
# The type variable is used only once in the function signature,
# so cannot be "solved" by the type checker
def greet_bad(cond: bool) -> AnyStr:
    return "hi there!" if cond else b"greetings!"

# The better way of annotating this function:
def greet_proper(cond: bool) -> str | bytes:
    return "hi there!" if cond else b"greetings!"
@end example


Deprecated since version 3.13, will be removed in version 3.18: Deprecated in favor of the new @ref{5ad,,type parameter syntax}.
Use @code{class A[T: (str, bytes)]: ...} instead of importing @code{AnyStr}. See
@geindex Python Enhancement Proposals; PEP 695
PEP 695@footnote{https://peps.python.org/pep-0695/} for more details.

In Python 3.16, @code{AnyStr} will be removed from @code{typing.__all__}, and
deprecation warnings will be emitted at runtime when it is accessed or
imported from @code{typing}. @code{AnyStr} will be removed from @code{typing}
in Python 3.18.

@end deffn

@geindex LiteralString (in module typing)
@anchor{library/typing typing LiteralString}@anchor{7e7}
@deffn {Data} typing.LiteralString

Special type that includes only literal strings.

Any string
literal is compatible with @code{LiteralString}, as is another
@code{LiteralString}. However, an object typed as just @code{str} is not.
A string created by composing @code{LiteralString}-typed objects
is also acceptable as a @code{LiteralString}.

Example:

@example
def run_query(sql: LiteralString) -> None:
    ...

def caller(arbitrary_string: str, literal_string: LiteralString) -> None:
    run_query("SELECT * FROM students")  # OK
    run_query(literal_string)  # OK
    run_query("SELECT * FROM " + literal_string)  # OK
    run_query(arbitrary_string)  # type checker error
    run_query(  # type checker error
        f"SELECT * FROM students WHERE name = @{arbitrary_string@}"
    )
@end example

@code{LiteralString} is useful for sensitive APIs where arbitrary user-generated
strings could generate problems. For example, the two cases above
that generate type checker errors could be vulnerable to an SQL
injection attack.

See 
@geindex Python Enhancement Proposals; PEP 675
PEP 675@footnote{https://peps.python.org/pep-0675/} for more details.


Added in version 3.11.

@end deffn

@geindex Never (in module typing)
@geindex NoReturn (in module typing)
@anchor{library/typing typing Never}@anchor{8b9}
@deffn {Data} typing.Never
@anchor{library/typing typing NoReturn}@anchor{4845}
@deffnx {Data} typing.NoReturn

@code{Never} and @code{NoReturn} represent the
bottom type@footnote{https://en.wikipedia.org/wiki/Bottom_type},
a type that has no members.

They can be used to indicate that a function never returns,
such as @ref{279,,sys.exit()}:

@example
from typing import Never  # or NoReturn

def stop() -> Never:
    raise RuntimeError('no way')
@end example

Or to define a function that should never be
called, as there are no valid arguments, such as
@ref{8b8,,assert_never()}:

@example
from typing import Never  # or NoReturn

def never_call_me(arg: Never) -> None:
    pass

def int_or_str(arg: int | str) -> None:
    never_call_me(arg)  # type checker error
    match arg:
        case int():
            print("It's an int")
        case str():
            print("It's a str")
        case _:
            never_call_me(arg)  # OK, arg is of type Never (or NoReturn)
@end example

@code{Never} and @code{NoReturn} have the same meaning in the type system
and static type checkers treat both equivalently.


Added in version 3.6.2: Added @code{NoReturn}.



Added in version 3.11: Added @code{Never}.

@end deffn

@geindex Self (in module typing)
@anchor{library/typing typing Self}@anchor{7e4}
@deffn {Data} typing.Self

Special type to represent the current enclosed class.

For example:

@example
from typing import Self, reveal_type

class Foo:
    def return_self(self) -> Self:
        ...
        return self

class SubclassOfFoo(Foo): pass

reveal_type(Foo().return_self())  # Revealed type is "Foo"
reveal_type(SubclassOfFoo().return_self())  # Revealed type is "SubclassOfFoo"
@end example

This annotation is semantically equivalent to the following,
albeit in a more succinct fashion:

@example
from typing import TypeVar

Self = TypeVar("Self", bound="Foo")

class Foo:
    def return_self(self: Self) -> Self:
        ...
        return self
@end example

In general, if something returns @code{self}, as in the above examples, you
should use @code{Self} as the return annotation. If @code{Foo.return_self} was
annotated as returning @code{"Foo"}, then the type checker would infer the
object returned from @code{SubclassOfFoo.return_self} as being of type @code{Foo}
rather than @code{SubclassOfFoo}.

Other common use cases include:


@itemize -

@item 
@ref{48f,,classmethod}s that are used as alternative constructors and return instances
of the @code{cls} parameter.

@item 
Annotating an @ref{7e5,,__enter__()} method which returns self.
@end itemize

You should not use @code{Self} as the return annotation if the method is not
guaranteed to return an instance of a subclass when the class is
subclassed:

@example
class Eggs:
    # Self would be an incorrect return annotation here,
    # as the object returned is always an instance of Eggs,
    # even in subclasses
    def returns_eggs(self) -> "Eggs":
        return Eggs()
@end example

See 
@geindex Python Enhancement Proposals; PEP 673
PEP 673@footnote{https://peps.python.org/pep-0673/} for more details.


Added in version 3.11.

@end deffn

@geindex TypeAlias (in module typing)
@anchor{library/typing typing TypeAlias}@anchor{9d2}
@deffn {Data} typing.TypeAlias

Special annotation for explicitly declaring a @ref{684,,type alias}.

For example:

@example
from typing import TypeAlias

Factors: TypeAlias = list[int]
@end example

@code{TypeAlias} is particularly useful on older Python versions for annotating
aliases that make use of forward references, as it can be hard for type
checkers to distinguish these from normal variable assignments:

@example
from typing import Generic, TypeAlias, TypeVar

T = TypeVar("T")

# "Box" does not exist yet,
# so we have to use quotes for the forward reference on Python <3.12.
# Using `@w{`}TypeAlias`@w{`} tells the type checker that this is a type alias declaration,
# not a variable assignment to a string.
BoxOfStrings: TypeAlias = "Box[str]"

class Box(Generic[T]):
    @@classmethod
    def make_box_of_strings(cls) -> BoxOfStrings: ...
@end example

See 
@geindex Python Enhancement Proposals; PEP 613
PEP 613@footnote{https://peps.python.org/pep-0613/} for more details.


Added in version 3.10.



Deprecated since version 3.12: @code{TypeAlias} is deprecated in favor of the @ref{66d,,type} statement,
which creates instances of @ref{2b0,,TypeAliasType}
and which natively supports forward references.
Note that while @code{TypeAlias} and @code{TypeAliasType} serve
similar purposes and have similar names, they are distinct and the
latter is not the type of the former.
Removal of @code{TypeAlias} is not currently planned, but users
are encouraged to migrate to @code{type} statements.

@end deffn

@node Special forms,Building generic types and type aliases,Special types,Special typing primitives
@anchor{library/typing special-forms}@anchor{4846}
@subsubsection Special forms


These can be used as types in annotations. They all support subscription using
@code{[]}, but each has a unique syntax.

@geindex Union (class in typing)
@anchor{library/typing typing Union}@anchor{2aa}
@deffn {Class} typing.Union

Union type; @code{Union[X, Y]} is equivalent to @code{X | Y} and means either X or Y.

To define a union, use e.g. @code{Union[int, str]} or the shorthand @code{int | str}. Using that shorthand is recommended. Details:


@itemize *

@item 
The arguments must be types and there must be at least one.

@item 
Unions of unions are flattened, e.g.:

@example
Union[Union[int, str], float] == Union[int, str, float]
@end example

However, this does not apply to unions referenced through a type
alias, to avoid forcing evaluation of the underlying @ref{2b0,,TypeAliasType}:

@example
type A = Union[int, str]
Union[A, float] != Union[int, str, float]
@end example

@item 
Unions of a single argument vanish, e.g.:

@example
Union[int] == int  # The constructor actually returns int
@end example

@item 
Redundant arguments are skipped, e.g.:

@example
Union[int, str, int] == Union[int, str] == int | str
@end example

@item 
When comparing unions, the argument order is ignored, e.g.:

@example
Union[int, str] == Union[str, int]
@end example

@item 
You cannot subclass or instantiate a @code{Union}.

@item 
You cannot write @code{Union[X][Y]}.
@end itemize


Changed in version 3.7: Don’t remove explicit subclasses from unions at runtime.



Changed in version 3.10: Unions can now be written as @code{X | Y}. See
@ref{9cb,,union type expressions}.



Changed in version 3.14: @ref{2a9,,types.UnionType} is now an alias for @code{Union}, and both
@code{Union[int, str]} and @code{int | str} create instances of the same class.
To check whether an object is a @code{Union} at runtime, use
@code{isinstance(obj, Union)}. For compatibility with earlier versions of
Python, use
@code{get_origin(obj) is typing.Union or get_origin(obj) is types.UnionType}.

@end deffn

@geindex Optional (in module typing)
@anchor{library/typing typing Optional}@anchor{8c4}
@deffn {Data} typing.Optional

@code{Optional[X]} is equivalent to @code{X | None} (or @code{Union[X, None]}).

Note that this is not the same concept as an optional argument,
which is one that has a default.  An optional argument with a
default does not require the @code{Optional} qualifier on its type
annotation just because it is optional. For example:

@example
def foo(arg: int = 0) -> None:
    ...
@end example

On the other hand, if an explicit value of @code{None} is allowed, the
use of @code{Optional} is appropriate, whether the argument is optional
or not. For example:

@example
def foo(arg: Optional[int] = None) -> None:
    ...
@end example


Changed in version 3.10: Optional can now be written as @code{X | None}. See
@ref{9cb,,union type expressions}.

@end deffn

@geindex Concatenate (in module typing)
@anchor{library/typing typing Concatenate}@anchor{9cd}
@deffn {Data} typing.Concatenate

Special form for annotating higher-order functions.

@geindex ...; ellipsis literal

@code{Concatenate} can be used in conjunction with @ref{271a,,Callable} and
@ref{488,,ParamSpec} to annotate a higher-order callable which adds, removes,
or transforms parameters of another
callable.  Usage is in the form
@code{Concatenate[Arg1Type, Arg2Type, ..., ParamSpecVariable]}. @code{Concatenate}
is valid when used in @ref{271a,,Callable} type hints
and when instantiating user-defined generic classes with @code{ParamSpec} parameters.
The last parameter to @code{Concatenate} must be a @code{ParamSpec} or
ellipsis (@code{...}).

For example, to annotate a decorator @code{with_lock} which provides a
@ref{1a39,,threading.Lock} to the decorated function,  @code{Concatenate} can be
used to indicate that @code{with_lock} expects a callable which takes in a
@code{Lock} as the first argument, and returns a callable with a different type
signature.  In this case, the @ref{488,,ParamSpec} indicates that the returned
callable’s parameter types are dependent on the parameter types of the
callable being passed in:

@example
from collections.abc import Callable
from threading import Lock
from typing import Concatenate

# Use this lock to ensure that only one thread is executing a function
# at any time.
my_lock = Lock()

def with_lock[**P, R](f: Callable[Concatenate[Lock, P], R]) -> Callable[P, R]:
    '@w{'}'A type-safe decorator which provides a lock.'@w{'}'
    def inner(*args: P.args, **kwargs: P.kwargs) -> R:
        # Provide the lock as the first argument.
        return f(my_lock, *args, **kwargs)
    return inner

@@with_lock
def sum_threadsafe(lock: Lock, numbers: list[float]) -> float:
    '@w{'}'Add a list of numbers together in a thread-safe manner.'@w{'}'
    with lock:
        return sum(numbers)

# We don't need to pass in the lock ourselves thanks to the decorator.
sum_threadsafe([1.1, 2.2, 3.3])
@end example


Added in version 3.10.



@subsubheading See also



@itemize *

@item 
@geindex Python Enhancement Proposals; PEP 612
PEP 612@footnote{https://peps.python.org/pep-0612/} – Parameter Specification Variables (the PEP which introduced
@code{ParamSpec} and @code{Concatenate})

@item 
@ref{488,,ParamSpec}

@item 
@ref{271a,,Annotating callable objects}
@end itemize

@end deffn

@geindex Literal (in module typing)
@anchor{library/typing typing Literal}@anchor{a5b}
@deffn {Data} typing.Literal

Special typing form to define “literal types”.

@code{Literal} can be used to indicate to type checkers that the
annotated object has a value equivalent to one of the
provided literals.

For example:

@example
def validate_simple(data: Any) -> Literal[True]:  # always returns True
    ...

type Mode = Literal['r', 'rb', 'w', 'wb']
def open_helper(file: str, mode: Mode) -> str:
    ...

open_helper('/some/path', 'r')      # Passes type check
open_helper('/other/path', 'typo')  # Error in type checker
@end example

@code{Literal[...]} cannot be subclassed. At runtime, an arbitrary value
is allowed as type argument to @code{Literal[...]}, but type checkers may
impose restrictions. See 
@geindex Python Enhancement Proposals; PEP 586
PEP 586@footnote{https://peps.python.org/pep-0586/} for more details about literal types.

Additional details:


@itemize *

@item 
The arguments must be literal values and there must be at least one.

@item 
Nested @code{Literal} types are flattened, e.g.:

@example
assert Literal[Literal[1, 2], 3] == Literal[1, 2, 3]
@end example

However, this does not apply to @code{Literal} types referenced through a type
alias, to avoid forcing evaluation of the underlying @ref{2b0,,TypeAliasType}:

@example
type A = Literal[1, 2]
assert Literal[A, 3] != Literal[1, 2, 3]
@end example

@item 
Redundant arguments are skipped, e.g.:

@example
assert Literal[1, 2, 1] == Literal[1, 2]
@end example

@item 
When comparing literals, the argument order is ignored, e.g.:

@example
assert Literal[1, 2] == Literal[2, 1]
@end example

@item 
You cannot subclass or instantiate a @code{Literal}.

@item 
You cannot write @code{Literal[X][Y]}.
@end itemize


Added in version 3.8.



Changed in version 3.9.1: @code{Literal} now de-duplicates parameters.  Equality comparisons of
@code{Literal} objects are no longer order dependent. @code{Literal} objects
will now raise a @ref{199,,TypeError} exception during equality comparisons
if one of their parameters are not @ref{825,,hashable}.

@end deffn

@geindex ClassVar (in module typing)
@anchor{library/typing typing ClassVar}@anchor{56d}
@deffn {Data} typing.ClassVar

Special type construct to mark class variables.

As introduced in 
@geindex Python Enhancement Proposals; PEP 526
PEP 526@footnote{https://peps.python.org/pep-0526/}, a variable annotation wrapped in ClassVar
indicates that a given attribute is intended to be used as a class variable
and should not be set on instances of that class. Usage:

@example
class Starship:
    stats: ClassVar[dict[str, int]] = @{@} # class variable
    damage: int = 10                     # instance variable
@end example

@code{ClassVar} accepts only types and cannot be further subscribed.

@code{ClassVar} is not a class itself, and cannot
be used with @ref{2af,,isinstance()} or @ref{9ca,,issubclass()}.
@code{ClassVar} does not change Python runtime behavior, but
it can be used by static type checkers. For example, a type checker
might flag the following code as an error:

@example
enterprise_d = Starship(3000)
enterprise_d.stats = @{@} # Error, setting class variable on instance
Starship.stats = @{@}     # This is OK
@end example


Added in version 3.5.3.



Changed in version 3.13: @code{ClassVar} can now be nested in @ref{56e,,Final} and vice versa.

@end deffn

@geindex Final (in module typing)
@anchor{library/typing typing Final}@anchor{56e}
@deffn {Data} typing.Final

Special typing construct to indicate final names to type checkers.

Final names cannot be reassigned in any scope. Final names declared in class
scopes cannot be overridden in subclasses.

For example:

@example
MAX_SIZE: Final = 9000
MAX_SIZE += 1  # Error reported by type checker

class Connection:
    TIMEOUT: Final[int] = 10

class FastConnector(Connection):
    TIMEOUT = 1  # Error reported by type checker
@end example

There is no runtime checking of these properties. See 
@geindex Python Enhancement Proposals; PEP 591
PEP 591@footnote{https://peps.python.org/pep-0591/} for
more details.


Added in version 3.8.



Changed in version 3.13: @code{Final} can now be nested in @ref{56d,,ClassVar} and vice versa.

@end deffn

@geindex Required (in module typing)
@anchor{library/typing typing Required}@anchor{7e1}
@deffn {Data} typing.Required

Special typing construct to mark a @ref{330,,TypedDict} key as required.

This is mainly useful for @code{total=False} TypedDicts. See @ref{330,,TypedDict}
and 
@geindex Python Enhancement Proposals; PEP 655
PEP 655@footnote{https://peps.python.org/pep-0655/} for more details.


Added in version 3.11.

@end deffn

@geindex NotRequired (in module typing)
@anchor{library/typing typing NotRequired}@anchor{7e2}
@deffn {Data} typing.NotRequired

Special typing construct to mark a @ref{330,,TypedDict} key as potentially
missing.

See @ref{330,,TypedDict} and 
@geindex Python Enhancement Proposals; PEP 655
PEP 655@footnote{https://peps.python.org/pep-0655/} for more details.


Added in version 3.11.

@end deffn

@geindex ReadOnly (in module typing)
@anchor{library/typing typing ReadOnly}@anchor{48b}
@deffn {Data} typing.ReadOnly

A special typing construct to mark an item of a @ref{330,,TypedDict} as read-only.

For example:

@example
class Movie(TypedDict):
   title: ReadOnly[str]
   year: int

def mutate_movie(m: Movie) -> None:
   m["year"] = 1999  # allowed
   m["title"] = "The Matrix"  # type checker error
@end example

There is no runtime checking for this property.

See @ref{330,,TypedDict} and 
@geindex Python Enhancement Proposals; PEP 705
PEP 705@footnote{https://peps.python.org/pep-0705/} for more details.


Added in version 3.13.

@end deffn

@geindex Annotated (in module typing)
@anchor{library/typing typing Annotated}@anchor{b3d}
@deffn {Data} typing.Annotated

Special typing form to add context-specific metadata to an annotation.

Add metadata @code{x} to a given type @code{T} by using the annotation
@code{Annotated[T, x]}. Metadata added using @code{Annotated} can be used by
static analysis tools or at runtime. At runtime, the metadata is stored
in a @code{__metadata__} attribute.

If a library or tool encounters an annotation @code{Annotated[T, x]} and has
no special logic for the metadata, it should ignore the metadata and simply
treat the annotation as @code{T}. As such, @code{Annotated} can be useful for code
that wants to use annotations for purposes outside Python’s static typing
system.

Using @code{Annotated[T, x]} as an annotation still allows for static
typechecking of @code{T}, as type checkers will simply ignore the metadata @code{x}.
In this way, @code{Annotated} differs from the
@ref{8c5,,@@no_type_check} decorator, which can also be used for
adding annotations outside the scope of the typing system, but
completely disables typechecking for a function or class.

The responsibility of how to interpret the metadata
lies with the tool or library encountering an
@code{Annotated} annotation. A tool or library encountering an @code{Annotated} type
can scan through the metadata elements to determine if they are of interest
(e.g., using @ref{2af,,isinstance()}).


@deffn {Describe} Annotated[<type>, <metadata>]
@end deffn

Here is an example of how you might use @code{Annotated} to add metadata to
type annotations if you were doing range analysis:

@example
@@dataclass
class ValueRange:
    lo: int
    hi: int

T1 = Annotated[int, ValueRange(-10, 5)]
T2 = Annotated[T1, ValueRange(-20, 3)]
@end example

The first argument to @code{Annotated} must be a valid type. Multiple metadata
elements can be supplied as @code{Annotated} supports variadic arguments. The
order of the metadata elements is preserved and matters for equality checks:

@example
@@dataclass
class ctype:
     kind: str

a1 = Annotated[int, ValueRange(3, 10), ctype("char")]
a2 = Annotated[int, ctype("char"), ValueRange(3, 10)]

assert a1 != a2  # Order matters
@end example

It is up to the tool consuming the annotations to decide whether the
client is allowed to add multiple metadata elements to one annotation and how to
merge those annotations.

Nested @code{Annotated} types are flattened. The order of the metadata elements
starts with the innermost annotation:

@example
assert Annotated[Annotated[int, ValueRange(3, 10)], ctype("char")] == Annotated[
    int, ValueRange(3, 10), ctype("char")
]
@end example

However, this does not apply to @code{Annotated} types referenced through a type
alias, to avoid forcing evaluation of the underlying @ref{2b0,,TypeAliasType}:

@example
type From3To10[T] = Annotated[T, ValueRange(3, 10)]
assert Annotated[From3To10[int], ctype("char")] != Annotated[
   int, ValueRange(3, 10), ctype("char")
]
@end example

Duplicated metadata elements are not removed:

@example
assert Annotated[int, ValueRange(3, 10)] != Annotated[
    int, ValueRange(3, 10), ValueRange(3, 10)
]
@end example

@code{Annotated} can be used with nested and generic aliases:

@quotation

@example
@@dataclass
class MaxLen:
    value: int

type Vec[T] = Annotated[list[tuple[T, T]], MaxLen(10)]

# When used in a type annotation, a type checker will treat "V" the same as
# `@w{`}Annotated[list[tuple[int, int]], MaxLen(10)]`@w{`}:
type V = Vec[int]
@end example
@end quotation

@code{Annotated} cannot be used with an unpacked @ref{489,,TypeVarTuple}:

@example
type Variadic[*Ts] = Annotated[*Ts, Ann1] = Annotated[T1, T2, T3, ..., Ann1]  # NOT valid
@end example

where @code{T1}, @code{T2}, … are @ref{487,,TypeVars}. This is invalid as
only one type should be passed to Annotated.

By default, @ref{8c2,,get_type_hints()} strips the metadata from annotations.
Pass @code{include_extras=True} to have the metadata preserved:

@quotation

@example
>>> from typing import Annotated, get_type_hints
>>> def func(x: Annotated[int, "metadata"]) -> None: pass
...
>>> get_type_hints(func)
@{'x': <class 'int'>, 'return': <class 'NoneType'>@}
>>> get_type_hints(func, include_extras=True)
@{'x': typing.Annotated[int, 'metadata'], 'return': <class 'NoneType'>@}
@end example
@end quotation

At runtime, the metadata associated with an @code{Annotated} type can be
retrieved via the @code{__metadata__} attribute:

@quotation

@example
>>> from typing import Annotated
>>> X = Annotated[int, "very", "important", "metadata"]
>>> X
typing.Annotated[int, 'very', 'important', 'metadata']
>>> X.__metadata__
('very', 'important', 'metadata')
@end example
@end quotation

If you want to retrieve the original type wrapped by @code{Annotated}, use the
@code{__origin__} attribute:

@quotation

@example
>>> from typing import Annotated, get_origin
>>> Password = Annotated[str, "secret"]
>>> Password.__origin__
<class 'str'>
@end example
@end quotation

Note that using @ref{2ad,,get_origin()} will return @code{Annotated} itself:

@quotation

@example
>>> get_origin(Password)
typing.Annotated
@end example
@end quotation


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 593

@item PEP 593@footnote{https://peps.python.org/pep-0593/} - Flexible function and variable annotations

The PEP introducing @code{Annotated} to the standard library.
@end table



Added in version 3.9.

@end deffn

@geindex TypeIs (in module typing)
@anchor{library/typing typing TypeIs}@anchor{48c}
@deffn {Data} typing.TypeIs

Special typing construct for marking user-defined type predicate functions.

@code{TypeIs} can be used to annotate the return type of a user-defined
type predicate function.  @code{TypeIs} only accepts a single type argument.
At runtime, functions marked this way should return a boolean and take at
least one positional argument.

@code{TypeIs} aims to benefit `type narrowing' – a technique used by static
type checkers to determine a more precise type of an expression within a
program’s code flow.  Usually type narrowing is done by analyzing
conditional code flow and applying the narrowing to a block of code.  The
conditional expression here is sometimes referred to as a “type predicate”:

@example
def is_str(val: str | float):
    # "isinstance" type predicate
    if isinstance(val, str):
        # Type of `@w{`}val`@w{`} is narrowed to `@w{`}str`@w{`}
        ...
    else:
        # Else, type of `@w{`}val`@w{`} is narrowed to `@w{`}float`@w{`}.
        ...
@end example

Sometimes it would be convenient to use a user-defined boolean function
as a type predicate.  Such a function should use @code{TypeIs[...]} or
@ref{48d,,TypeGuard} as its return type to alert static type checkers to
this intention.  @code{TypeIs} usually has more intuitive behavior than
@code{TypeGuard}, but it cannot be used when the input and output types
are incompatible (e.g., @code{list[object]} to @code{list[int]}) or when the
function does not return @code{True} for all instances of the narrowed type.

Using  @code{-> TypeIs[NarrowedType]} tells the static type checker that for a given
function:


@enumerate 

@item 
The return value is a boolean.

@item 
If the return value is @code{True}, the type of its argument
is the intersection of the argument’s original type and @code{NarrowedType}.

@item 
If the return value is @code{False}, the type of its argument
is narrowed to exclude @code{NarrowedType}.
@end enumerate

For example:

@example
from typing import assert_type, final, TypeIs

class Parent: pass
class Child(Parent): pass
@@final
class Unrelated: pass

def is_parent(val: object) -> TypeIs[Parent]:
    return isinstance(val, Parent)

def run(arg: Child | Unrelated):
    if is_parent(arg):
        # Type of `@w{`}arg`@w{`} is narrowed to the intersection
        # of `@w{`}Parent`@w{`} and `@w{`}Child`@w{`}, which is equivalent to
        # `@w{`}Child`@w{`}.
        assert_type(arg, Child)
    else:
        # Type of `@w{`}arg`@w{`} is narrowed to exclude `@w{`}Parent`@w{`},
        # so only `@w{`}Unrelated`@w{`} is left.
        assert_type(arg, Unrelated)
@end example

The type inside @code{TypeIs} must be consistent with the type of the
function’s argument; if it is not, static type checkers will raise
an error.  An incorrectly written @code{TypeIs} function can lead to
unsound behavior in the type system; it is the user’s responsibility
to write such functions in a type-safe manner.

If a @code{TypeIs} function is a class or instance method, then the type in
@code{TypeIs} maps to the type of the second parameter (after @code{cls} or
@code{self}).

In short, the form @code{def foo(arg: TypeA) -> TypeIs[TypeB]: ...},
means that if @code{foo(arg)} returns @code{True}, then @code{arg} is an instance
of @code{TypeB}, and if it returns @code{False}, it is not an instance of @code{TypeB}.

@code{TypeIs} also works with type variables.  For more information, see
@geindex Python Enhancement Proposals; PEP 742
PEP 742@footnote{https://peps.python.org/pep-0742/} (Narrowing types with @code{TypeIs}).


Added in version 3.13.

@end deffn

@geindex TypeGuard (in module typing)
@anchor{library/typing typing TypeGuard}@anchor{48d}
@deffn {Data} typing.TypeGuard

Special typing construct for marking user-defined type predicate functions.

Type predicate functions are user-defined functions that return whether their
argument is an instance of a particular type.
@code{TypeGuard} works similarly to @ref{48c,,TypeIs}, but has subtly different
effects on type checking behavior (see below).

Using  @code{-> TypeGuard} tells the static type checker that for a given
function:


@enumerate 

@item 
The return value is a boolean.

@item 
If the return value is @code{True}, the type of its argument
is the type inside @code{TypeGuard}.
@end enumerate

@code{TypeGuard} also works with type variables.  See 
@geindex Python Enhancement Proposals; PEP 647
PEP 647@footnote{https://peps.python.org/pep-0647/} for more details.

For example:

@example
def is_str_list(val: list[object]) -> TypeGuard[list[str]]:
    '@w{'}'Determines whether all objects in the list are strings'@w{'}'
    return all(isinstance(x, str) for x in val)

def func1(val: list[object]):
    if is_str_list(val):
        # Type of `@w{`}val`@w{`} is narrowed to `@w{`}list[str]`@w{`}.
        print(" ".join(val))
    else:
        # Type of `@w{`}val`@w{`} remains as `@w{`}list[object]`@w{`}.
        print("Not a list of strings!")
@end example

@code{TypeIs} and @code{TypeGuard} differ in the following ways:


@itemize *

@item 
@code{TypeIs} requires the narrowed type to be a subtype of the input type, while
@code{TypeGuard} does not.  The main reason is to allow for things like
narrowing @code{list[object]} to @code{list[str]} even though the latter
is not a subtype of the former, since @code{list} is invariant.

@item 
When a @code{TypeGuard} function returns @code{True}, type checkers narrow the type of the
variable to exactly the @code{TypeGuard} type. When a @code{TypeIs} function returns @code{True},
type checkers can infer a more precise type combining the previously known type of the
variable with the @code{TypeIs} type. (Technically, this is known as an intersection type.)

@item 
When a @code{TypeGuard} function returns @code{False}, type checkers cannot narrow the type of
the variable at all. When a @code{TypeIs} function returns @code{False}, type checkers can narrow
the type of the variable to exclude the @code{TypeIs} type.
@end itemize


Added in version 3.10.

@end deffn

@geindex Unpack (in module typing)
@anchor{library/typing typing Unpack}@anchor{19e8}
@deffn {Data} typing.Unpack

Typing operator to conceptually mark an object as having been unpacked.

For example, using the unpack operator @code{*} on a
@ref{4847,,type variable tuple} is equivalent to using @code{Unpack}
to mark the type variable tuple as having been unpacked:

@example
Ts = TypeVarTuple('Ts')
tup: tuple[*Ts]
# Effectively does:
tup: tuple[Unpack[Ts]]
@end example

In fact, @code{Unpack} can be used interchangeably with @code{*} in the context
of @ref{489,,typing.TypeVarTuple} and
@ref{614,,builtins.tuple} types. You might see @code{Unpack} being used
explicitly in older versions of Python, where @code{*} couldn’t be used in
certain places:

@example
# In older versions of Python, TypeVarTuple and Unpack
# are located in the `typing_extensions` backports package.
from typing_extensions import TypeVarTuple, Unpack

Ts = TypeVarTuple('Ts')
tup: tuple[*Ts]         # Syntax error on Python <= 3.10!
tup: tuple[Unpack[Ts]]  # Semantically equivalent, and backwards-compatible
@end example

@code{Unpack} can also be used along with @ref{330,,typing.TypedDict} for typing
@code{**kwargs} in a function signature:

@example
from typing import TypedDict, Unpack

class Movie(TypedDict):
    name: str
    year: int

# This function expects two keyword arguments - `name` of type `str`
# and `year` of type `int`.
def foo(**kwargs: Unpack[Movie]): ...
@end example

See 
@geindex Python Enhancement Proposals; PEP 692
PEP 692@footnote{https://peps.python.org/pep-0692/} for more details on using @code{Unpack} for @code{**kwargs} typing.


Added in version 3.11.

@end deffn

@node Building generic types and type aliases,Other special directives,Special forms,Special typing primitives
@anchor{library/typing building-generic-types-and-type-aliases}@anchor{4848}
@subsubsection Building generic types and type aliases


The following classes should not be used directly as annotations.
Their intended purpose is to be building blocks
for creating generic types and type aliases.

These objects can be created through special syntax
(@ref{5ad,,type parameter lists} and the @ref{66d,,type} statement).
For compatibility with Python 3.11 and earlier, they can also be created
without the dedicated syntax, as documented below.

@geindex Generic (class in typing)
@anchor{library/typing typing Generic}@anchor{1806}
@deffn {Class} typing.Generic

Abstract base class for generic types.

A generic type is typically declared by adding a list of type parameters
after the class name:

@example
class Mapping[KT, VT]:
    def __getitem__(self, key: KT) -> VT:
        ...
        # Etc.
@end example

Such a class implicitly inherits from @code{Generic}.
The runtime semantics of this syntax are discussed in the
@ref{682,,Language Reference}.

This class can then be used as follows:

@example
def lookup_name[X, Y](mapping: Mapping[X, Y], key: X, default: Y) -> Y:
    try:
        return mapping[key]
    except KeyError:
        return default
@end example

Here the brackets after the function name indicate a
@ref{683,,generic function}.

For backwards compatibility, generic classes can also be
declared by explicitly inheriting from
@code{Generic}. In this case, the type parameters must be declared
separately:

@example
KT = TypeVar('KT')
VT = TypeVar('VT')

class Mapping(Generic[KT, VT]):
    def __getitem__(self, key: KT) -> VT:
        ...
        # Etc.
@end example
@end deffn

@geindex TypeVar (class in typing)
@anchor{library/typing typevar}@anchor{483e}@anchor{library/typing typing TypeVar}@anchor{487}
@deffn {Class} typing.TypeVar (name, *constraints, bound=None, covariant=False, contravariant=False, infer_variance=False, default=typing.NoDefault)

Type variable.

The preferred way to construct a type variable is via the dedicated syntax
for @ref{683,,generic functions},
@ref{682,,generic classes}, and
@ref{685,,generic type aliases}:

@example
class Sequence[T]:  # T is a TypeVar
    ...
@end example

This syntax can also be used to create bounded and constrained type
variables:

@example
class StrSequence[S: str]:  # S is a TypeVar with a `str` upper bound;
    ...                     # we can say that S is "bounded by `str`"


class StrOrBytesSequence[A: (str, bytes)]:  # A is a TypeVar constrained to str or bytes
    ...
@end example

However, if desired, reusable type variables can also be constructed manually, like so:

@example
T = TypeVar('T')  # Can be anything
S = TypeVar('S', bound=str)  # Can be any subtype of str
A = TypeVar('A', str, bytes)  # Must be exactly str or bytes
@end example

Type variables exist primarily for the benefit of static type
checkers.  They serve as the parameters for generic types as well
as for generic function and type alias definitions.
See @ref{1806,,Generic} for more
information on generic types.  Generic functions work as follows:

@example
def repeat[T](x: T, n: int) -> Sequence[T]:
    """Return a list containing n references to x."""
    return [x]*n


def print_capitalized[S: str](x: S) -> S:
    """Print x capitalized, and return x."""
    print(x.capitalize())
    return x


def concatenate[A: (str, bytes)](x: A, y: A) -> A:
    """Add two strings or bytes objects together."""
    return x + y
@end example

Note that type variables can be `bounded', `constrained', or neither, but
cannot be both bounded `and' constrained.

The variance of type variables is inferred by type checkers when they are created
through the @ref{5ad,,type parameter syntax} or when
@code{infer_variance=True} is passed.
Manually created type variables may be explicitly marked covariant or contravariant by passing
@code{covariant=True} or @code{contravariant=True}.
By default, manually created type variables are invariant.
See 
@geindex Python Enhancement Proposals; PEP 484
PEP 484@footnote{https://peps.python.org/pep-0484/} and 
@geindex Python Enhancement Proposals; PEP 695
PEP 695@footnote{https://peps.python.org/pep-0695/} for more details.

Bounded type variables and constrained type variables have different
semantics in several important ways. Using a `bounded' type variable means
that the @code{TypeVar} will be solved using the most specific type possible:

@example
x = print_capitalized('a string')
reveal_type(x)  # revealed type is str

class StringSubclass(str):
    pass

y = print_capitalized(StringSubclass('another string'))
reveal_type(y)  # revealed type is StringSubclass

z = print_capitalized(45)  # error: int is not a subtype of str
@end example

The upper bound of a type variable can be a concrete type, abstract type
(ABC or Protocol), or even a union of types:

@example
# Can be anything with an __abs__ method
def print_abs[T: SupportsAbs](arg: T) -> None:
    print("Absolute value:", abs(arg))

U = TypeVar('U', bound=str|bytes)  # Can be any subtype of the union str|bytes
V = TypeVar('V', bound=SupportsAbs)  # Can be anything with an __abs__ method
@end example
@anchor{library/typing typing-constrained-typevar}@anchor{4844}
Using a `constrained' type variable, however, means that the @code{TypeVar}
can only ever be solved as being exactly one of the constraints given:

@example
a = concatenate('one', 'two')
reveal_type(a)  # revealed type is str

b = concatenate(StringSubclass('one'), StringSubclass('two'))
reveal_type(b)  # revealed type is str, despite StringSubclass being passed in

c = concatenate('one', b'two')  # error: type variable 'A' can be either str or bytes in a function call, but not both
@end example

At runtime, @code{isinstance(x, T)} will raise @ref{199,,TypeError}.

@geindex __name__ (typing.TypeVar attribute)
@anchor{library/typing typing TypeVar __name__}@anchor{4849}
@deffn {Attribute} __name__

The name of the type variable.
@end deffn

@geindex __covariant__ (typing.TypeVar attribute)
@anchor{library/typing typing TypeVar __covariant__}@anchor{484a}
@deffn {Attribute} __covariant__

Whether the type var has been explicitly marked as covariant.
@end deffn

@geindex __contravariant__ (typing.TypeVar attribute)
@anchor{library/typing typing TypeVar __contravariant__}@anchor{484b}
@deffn {Attribute} __contravariant__

Whether the type var has been explicitly marked as contravariant.
@end deffn

@geindex __infer_variance__ (typing.TypeVar attribute)
@anchor{library/typing typing TypeVar __infer_variance__}@anchor{484c}
@deffn {Attribute} __infer_variance__

Whether the type variable’s variance should be inferred by type checkers.


Added in version 3.12.

@end deffn

@geindex __bound__ (typing.TypeVar attribute)
@anchor{library/typing typing TypeVar __bound__}@anchor{484d}
@deffn {Attribute} __bound__

The upper bound of the type variable, if any.


Changed in version 3.12: For type variables created through @ref{5ad,,type parameter syntax},
the bound is evaluated only when the attribute is accessed, not when
the type variable is created (see @ref{686,,Lazy evaluation}).

@end deffn

@geindex evaluate_bound() (typing.TypeVar method)
@anchor{library/typing typing TypeVar evaluate_bound}@anchor{484e}
@deffn {Method} evaluate_bound ()

An @ref{484f,,evaluate function} corresponding to the @ref{484d,,__bound__} attribute.
When called directly, this method supports only the @ref{15f,,VALUE}
format, which is equivalent to accessing the @code{__bound__} attribute directly,
but the method object can be passed to @ref{4850,,annotationlib.call_evaluate_function()}
to evaluate the value in a different format.


Added in version 3.14.

@end deffn

@geindex __constraints__ (typing.TypeVar attribute)
@anchor{library/typing typing TypeVar __constraints__}@anchor{4851}
@deffn {Attribute} __constraints__

A tuple containing the constraints of the type variable, if any.


Changed in version 3.12: For type variables created through @ref{5ad,,type parameter syntax},
the constraints are evaluated only when the attribute is accessed, not when
the type variable is created (see @ref{686,,Lazy evaluation}).

@end deffn

@geindex evaluate_constraints() (typing.TypeVar method)
@anchor{library/typing typing TypeVar evaluate_constraints}@anchor{4852}
@deffn {Method} evaluate_constraints ()

An @ref{484f,,evaluate function} corresponding to the @ref{4851,,__constraints__} attribute.
When called directly, this method supports only the @ref{15f,,VALUE}
format, which is equivalent to accessing the @code{__constraints__} attribute directly,
but the method object can be passed to @ref{4850,,annotationlib.call_evaluate_function()}
to evaluate the value in a different format.


Added in version 3.14.

@end deffn

@geindex __default__ (typing.TypeVar attribute)
@anchor{library/typing typing TypeVar __default__}@anchor{4853}
@deffn {Attribute} __default__

The default value of the type variable, or @ref{569,,typing.NoDefault} if it
has no default.


Added in version 3.13.

@end deffn

@geindex evaluate_default() (typing.TypeVar method)
@anchor{library/typing typing TypeVar evaluate_default}@anchor{4854}
@deffn {Method} evaluate_default ()

An @ref{484f,,evaluate function} corresponding to the @ref{4853,,__default__} attribute.
When called directly, this method supports only the @ref{15f,,VALUE}
format, which is equivalent to accessing the @code{__default__} attribute directly,
but the method object can be passed to @ref{4850,,annotationlib.call_evaluate_function()}
to evaluate the value in a different format.


Added in version 3.14.

@end deffn

@geindex has_default() (typing.TypeVar method)
@anchor{library/typing typing TypeVar has_default}@anchor{4855}
@deffn {Method} has_default ()

Return whether or not the type variable has a default value. This is equivalent
to checking whether @ref{4853,,__default__} is not the @ref{569,,typing.NoDefault}
singleton, except that it does not force evaluation of the
@ref{686,,lazily evaluated} default value.


Added in version 3.13.

@end deffn


Changed in version 3.12: Type variables can now be declared using the
@ref{5ad,,type parameter} syntax introduced by 
@geindex Python Enhancement Proposals; PEP 695
PEP 695@footnote{https://peps.python.org/pep-0695/}.
The @code{infer_variance} parameter was added.



Changed in version 3.13: Support for default values was added.

@end deffn

@geindex TypeVarTuple (class in typing)
@anchor{library/typing typevartuple}@anchor{4847}@anchor{library/typing typing TypeVarTuple}@anchor{489}
@deffn {Class} typing.TypeVarTuple (name, *, default=typing.NoDefault)

Type variable tuple. A specialized form of @ref{483e,,type variable}
that enables `variadic' generics.

Type variable tuples can be declared in @ref{5ad,,type parameter lists}
using a single asterisk (@code{*}) before the name:

@example
def move_first_element_to_last[T, *Ts](tup: tuple[T, *Ts]) -> tuple[*Ts, T]:
    return (*tup[1:], tup[0])
@end example

Or by explicitly invoking the @code{TypeVarTuple} constructor:

@example
T = TypeVar("T")
Ts = TypeVarTuple("Ts")

def move_first_element_to_last(tup: tuple[T, *Ts]) -> tuple[*Ts, T]:
    return (*tup[1:], tup[0])
@end example

A normal type variable enables parameterization with a single type. A type
variable tuple, in contrast, allows parameterization with an
`arbitrary' number of types by acting like an `arbitrary' number of type
variables wrapped in a tuple. For example:

@example
# T is bound to int, Ts is bound to ()
# Return value is (1,), which has type tuple[int]
move_first_element_to_last(tup=(1,))

# T is bound to int, Ts is bound to (str,)
# Return value is ('spam', 1), which has type tuple[str, int]
move_first_element_to_last(tup=(1, 'spam'))

# T is bound to int, Ts is bound to (str, float)
# Return value is ('spam', 3.0, 1), which has type tuple[str, float, int]
move_first_element_to_last(tup=(1, 'spam', 3.0))

# This fails to type check (and fails at runtime)
# because tuple[()] is not compatible with tuple[T, *Ts]
# (at least one element is required)
move_first_element_to_last(tup=())
@end example

Note the use of the unpacking operator @code{*} in @code{tuple[T, *Ts]}.
Conceptually, you can think of @code{Ts} as a tuple of type variables
@code{(T1, T2, ...)}. @code{tuple[T, *Ts]} would then become
@code{tuple[T, *(T1, T2, ...)]}, which is equivalent to
@code{tuple[T, T1, T2, ...]}. (Note that in older versions of Python, you might
see this written using @ref{19e8,,Unpack} instead, as
@code{Unpack[Ts]}.)

Type variable tuples must `always' be unpacked. This helps distinguish type
variable tuples from normal type variables:

@example
x: Ts          # Not valid
x: tuple[Ts]   # Not valid
x: tuple[*Ts]  # The correct way to do it
@end example

Type variable tuples can be used in the same contexts as normal type
variables. For example, in class definitions, arguments, and return types:

@example
class Array[*Shape]:
    def __getitem__(self, key: tuple[*Shape]) -> float: ...
    def __abs__(self) -> "Array[*Shape]": ...
    def get_shape(self) -> tuple[*Shape]: ...
@end example

Type variable tuples can be happily combined with normal type variables:

@example
class Array[DType, *Shape]:  # This is fine
    pass

class Array2[*Shape, DType]:  # This would also be fine
    pass

class Height: ...
class Width: ...

float_array_1d: Array[float, Height] = Array()     # Totally fine
int_array_2d: Array[int, Height, Width] = Array()  # Yup, fine too
@end example

However, note that at most one type variable tuple may appear in a single
list of type arguments or type parameters:

@example
x: tuple[*Ts, *Ts]            # Not valid
class Array[*Shape, *Shape]:  # Not valid
    pass
@end example

Finally, an unpacked type variable tuple can be used as the type annotation
of @code{*args}:

@example
def call_soon[*Ts](
    callback: Callable[[*Ts], None],
    *args: *Ts
) -> None:
    ...
    callback(*args)
@end example

In contrast to non-unpacked annotations of @code{*args} - e.g. @code{*args: int},
which would specify that `all' arguments are @code{int} - @code{*args: *Ts}
enables reference to the types of the `individual' arguments in @code{*args}.
Here, this allows us to ensure the types of the @code{*args} passed
to @code{call_soon} match the types of the (positional) arguments of
@code{callback}.

See 
@geindex Python Enhancement Proposals; PEP 646
PEP 646@footnote{https://peps.python.org/pep-0646/} for more details on type variable tuples.

@geindex __name__ (typing.TypeVarTuple attribute)
@anchor{library/typing typing TypeVarTuple __name__}@anchor{4856}
@deffn {Attribute} __name__

The name of the type variable tuple.
@end deffn

@geindex __default__ (typing.TypeVarTuple attribute)
@anchor{library/typing typing TypeVarTuple __default__}@anchor{4857}
@deffn {Attribute} __default__

The default value of the type variable tuple, or @ref{569,,typing.NoDefault} if it
has no default.


Added in version 3.13.

@end deffn

@geindex evaluate_default() (typing.TypeVarTuple method)
@anchor{library/typing typing TypeVarTuple evaluate_default}@anchor{4858}
@deffn {Method} evaluate_default ()

An @ref{484f,,evaluate function} corresponding to the @ref{4857,,__default__} attribute.
When called directly, this method supports only the @ref{15f,,VALUE}
format, which is equivalent to accessing the @code{__default__} attribute directly,
but the method object can be passed to @ref{4850,,annotationlib.call_evaluate_function()}
to evaluate the value in a different format.


Added in version 3.14.

@end deffn

@geindex has_default() (typing.TypeVarTuple method)
@anchor{library/typing typing TypeVarTuple has_default}@anchor{4859}
@deffn {Method} has_default ()

Return whether or not the type variable tuple has a default value. This is equivalent
to checking whether @ref{4857,,__default__} is not the @ref{569,,typing.NoDefault}
singleton, except that it does not force evaluation of the
@ref{686,,lazily evaluated} default value.


Added in version 3.13.

@end deffn


Added in version 3.11.



Changed in version 3.12: Type variable tuples can now be declared using the
@ref{5ad,,type parameter} syntax introduced by 
@geindex Python Enhancement Proposals; PEP 695
PEP 695@footnote{https://peps.python.org/pep-0695/}.



Changed in version 3.13: Support for default values was added.

@end deffn

@geindex ParamSpec (class in typing)
@anchor{library/typing typing ParamSpec}@anchor{488}
@deffn {Class} typing.ParamSpec (name, *, bound=None, covariant=False, contravariant=False, default=typing.NoDefault)

Parameter specification variable.  A specialized version of
@ref{483e,,type variables}.

In @ref{5ad,,type parameter lists}, parameter specifications
can be declared with two asterisks (@code{**}):

@example
type IntFunc[**P] = Callable[P, int]
@end example

For compatibility with Python 3.11 and earlier, @code{ParamSpec} objects
can also be created as follows:

@example
P = ParamSpec('P')
@end example

Parameter specification variables exist primarily for the benefit of static
type checkers.  They are used to forward the parameter types of one
callable to another callable – a pattern commonly found in higher order
functions and decorators.  They are only valid when used in @code{Concatenate},
or as the first argument to @code{Callable}, or as parameters for user-defined
Generics.  See @ref{1806,,Generic} for more information on generic types.

For example, to add basic logging to a function, one can create a decorator
@code{add_logging} to log function calls.  The parameter specification variable
tells the type checker that the callable passed into the decorator and the
new callable returned by it have inter-dependent type parameters:

@example
from collections.abc import Callable
import logging

def add_logging[T, **P](f: Callable[P, T]) -> Callable[P, T]:
    '@w{'}'A type-safe decorator to add logging to a function.'@w{'}'
    def inner(*args: P.args, **kwargs: P.kwargs) -> T:
        logging.info(f'@{f.__name__@} was called')
        return f(*args, **kwargs)
    return inner

@@add_logging
def add_two(x: float, y: float) -> float:
    '@w{'}'Add two numbers together.'@w{'}'
    return x + y
@end example

Without @code{ParamSpec}, the simplest way to annotate this previously was to
use a @ref{487,,TypeVar} with upper bound @code{Callable[..., Any]}.  However this
causes two problems:


@enumerate 

@item 
The type checker can’t type check the @code{inner} function because
@code{*args} and @code{**kwargs} have to be typed @ref{8bd,,Any}.

@item 
@ref{485a,,cast()} may be required in the body of the @code{add_logging}
decorator when returning the @code{inner} function, or the static type
checker must be told to ignore the @code{return inner}.
@end enumerate

@geindex args (typing.ParamSpec attribute)
@anchor{library/typing typing ParamSpec args}@anchor{485b}
@deffn {Attribute} args
@end deffn

@geindex kwargs (typing.ParamSpec attribute)
@anchor{library/typing typing ParamSpec kwargs}@anchor{485c}
@deffn {Attribute} kwargs

Since @code{ParamSpec} captures both positional and keyword parameters,
@code{P.args} and @code{P.kwargs} can be used to split a @code{ParamSpec} into its
components.  @code{P.args} represents the tuple of positional parameters in a
given call and should only be used to annotate @code{*args}.  @code{P.kwargs}
represents the mapping of keyword parameters to their values in a given call,
and should be only be used to annotate @code{**kwargs}.  Both
attributes require the annotated parameter to be in scope. At runtime,
@code{P.args} and @code{P.kwargs} are instances respectively of
@ref{9cf,,ParamSpecArgs} and @ref{9d0,,ParamSpecKwargs}.
@end deffn

@geindex __name__ (typing.ParamSpec attribute)
@anchor{library/typing typing ParamSpec __name__}@anchor{485d}
@deffn {Attribute} __name__

The name of the parameter specification.
@end deffn

@geindex __default__ (typing.ParamSpec attribute)
@anchor{library/typing typing ParamSpec __default__}@anchor{485e}
@deffn {Attribute} __default__

The default value of the parameter specification, or @ref{569,,typing.NoDefault} if it
has no default.


Added in version 3.13.

@end deffn

@geindex evaluate_default() (typing.ParamSpec method)
@anchor{library/typing typing ParamSpec evaluate_default}@anchor{485f}
@deffn {Method} evaluate_default ()

An @ref{484f,,evaluate function} corresponding to the @ref{485e,,__default__} attribute.
When called directly, this method supports only the @ref{15f,,VALUE}
format, which is equivalent to accessing the @code{__default__} attribute directly,
but the method object can be passed to @ref{4850,,annotationlib.call_evaluate_function()}
to evaluate the value in a different format.


Added in version 3.14.

@end deffn

@geindex has_default() (typing.ParamSpec method)
@anchor{library/typing typing ParamSpec has_default}@anchor{4860}
@deffn {Method} has_default ()

Return whether or not the parameter specification has a default value. This is equivalent
to checking whether @ref{485e,,__default__} is not the @ref{569,,typing.NoDefault}
singleton, except that it does not force evaluation of the
@ref{686,,lazily evaluated} default value.


Added in version 3.13.

@end deffn

Parameter specification variables created with @code{covariant=True} or
@code{contravariant=True} can be used to declare covariant or contravariant
generic types.  The @code{bound} argument is also accepted, similar to
@ref{487,,TypeVar}.  However the actual semantics of these keywords are yet to
be decided.


Added in version 3.10.



Changed in version 3.12: Parameter specifications can now be declared using the
@ref{5ad,,type parameter} syntax introduced by 
@geindex Python Enhancement Proposals; PEP 695
PEP 695@footnote{https://peps.python.org/pep-0695/}.



Changed in version 3.13: Support for default values was added.


@cartouche
@quotation Note 
Only parameter specification variables defined in global scope can
be pickled.
@end quotation
@end cartouche


@subsubheading See also



@itemize *

@item 
@geindex Python Enhancement Proposals; PEP 612
PEP 612@footnote{https://peps.python.org/pep-0612/} – Parameter Specification Variables (the PEP which introduced
@code{ParamSpec} and @code{Concatenate})

@item 
@ref{9cd,,Concatenate}

@item 
@ref{271a,,Annotating callable objects}
@end itemize

@end deffn

@geindex ParamSpecArgs (class in typing)
@geindex ParamSpecKwargs (class in typing)
@anchor{library/typing typing ParamSpecArgs}@anchor{9cf}
@deffn {Class} typing.ParamSpecArgs
@anchor{library/typing typing ParamSpecKwargs}@anchor{9d0}
@deffnx {Class} typing.ParamSpecKwargs

Arguments and keyword arguments attributes of a @ref{488,,ParamSpec}. The
@code{P.args} attribute of a @code{ParamSpec} is an instance of @code{ParamSpecArgs},
and @code{P.kwargs} is an instance of @code{ParamSpecKwargs}. They are intended
for runtime introspection and have no special meaning to static type checkers.

Calling @ref{2ad,,get_origin()} on either of these objects will return the
original @code{ParamSpec}:

@example
>>> from typing import ParamSpec, get_origin
>>> P = ParamSpec("P")
>>> get_origin(P.args) is P
True
>>> get_origin(P.kwargs) is P
True
@end example


Added in version 3.10.

@end deffn

@geindex TypeAliasType (class in typing)
@anchor{library/typing typing TypeAliasType}@anchor{2b0}
@deffn {Class} typing.TypeAliasType (name, value, *, type_params=())

The type of type aliases created through the @ref{66d,,type} statement.

Example:

@example
>>> type Alias = int
>>> type(Alias)
<class 'typing.TypeAliasType'>
@end example


Added in version 3.12.


@geindex __name__ (typing.TypeAliasType attribute)
@anchor{library/typing typing TypeAliasType __name__}@anchor{4861}
@deffn {Attribute} __name__

The name of the type alias:

@example
>>> type Alias = int
>>> Alias.__name__
'Alias'
@end example
@end deffn

@geindex __module__ (typing.TypeAliasType attribute)
@anchor{library/typing typing TypeAliasType __module__}@anchor{4862}
@deffn {Attribute} __module__

The name of the module in which the type alias was defined:

@example
>>> type Alias = int
>>> Alias.__module__
'__main__'
@end example
@end deffn

@geindex __type_params__ (typing.TypeAliasType attribute)
@anchor{library/typing typing TypeAliasType __type_params__}@anchor{4863}
@deffn {Attribute} __type_params__

The type parameters of the type alias, or an empty tuple if the alias is
not generic:

@example
>>> type ListOrSet[T] = list[T] | set[T]
>>> ListOrSet.__type_params__
(T,)
>>> type NotGeneric = int
>>> NotGeneric.__type_params__
()
@end example
@end deffn

@geindex __value__ (typing.TypeAliasType attribute)
@anchor{library/typing typing TypeAliasType __value__}@anchor{4864}
@deffn {Attribute} __value__

The type alias’s value. This is @ref{686,,lazily evaluated},
so names used in the definition of the alias are not resolved until the
@code{__value__} attribute is accessed:

@example
>>> type Mutually = Recursive
>>> type Recursive = Mutually
>>> Mutually
Mutually
>>> Recursive
Recursive
>>> Mutually.__value__
Recursive
>>> Recursive.__value__
Mutually
@end example
@end deffn

@geindex evaluate_value() (typing.TypeAliasType method)
@anchor{library/typing typing TypeAliasType evaluate_value}@anchor{4865}
@deffn {Method} evaluate_value ()

An @ref{484f,,evaluate function} corresponding to the @ref{4864,,__value__} attribute.
When called directly, this method supports only the @ref{15f,,VALUE}
format, which is equivalent to accessing the @code{__value__} attribute directly,
but the method object can be passed to @ref{4850,,annotationlib.call_evaluate_function()}
to evaluate the value in a different format:

@example
>>> type Alias = undefined
>>> Alias.__value__
Traceback (most recent call last):
...
NameError: name 'undefined' is not defined
>>> from annotationlib import Format, call_evaluate_function
>>> Alias.evaluate_value(Format.VALUE)
Traceback (most recent call last):
...
NameError: name 'undefined' is not defined
>>> call_evaluate_function(Alias.evaluate_value, Format.FORWARDREF)
ForwardRef('undefined')
@end example


Added in version 3.14.

@end deffn

@subsubheading Unpacking


Type aliases support star unpacking using the @code{*Alias} syntax.
This is equivalent to using @code{Unpack[Alias]} directly:

@example
>>> type Alias = tuple[int, str]
>>> type Unpacked = tuple[bool, *Alias]
>>> Unpacked.__value__
tuple[bool, typing.Unpack[Alias]]
@end example


Added in version 3.14.

@end deffn

@node Other special directives,,Building generic types and type aliases,Special typing primitives
@anchor{library/typing other-special-directives}@anchor{4866}
@subsubsection Other special directives


These functions and classes should not be used directly as annotations.
Their intended purpose is to be building blocks for creating and declaring
types.

@geindex NamedTuple (class in typing)
@anchor{library/typing typing NamedTuple}@anchor{32f}
@deffn {Class} typing.NamedTuple

Typed version of @ref{4e1,,collections.namedtuple()}.

Usage:

@example
class Employee(NamedTuple):
    name: str
    id: int
@end example

This is equivalent to:

@example
Employee = collections.namedtuple('Employee', ['name', 'id'])
@end example

To give a field a default value, you can assign to it in the class body:

@example
class Employee(NamedTuple):
    name: str
    id: int = 3

employee = Employee('Guido')
assert employee.id == 3
@end example

Fields with a default value must come after any fields without a default.

The types for each field name can be retrieved by calling
@ref{457,,annotationlib.get_annotations()} on the resulting class. (The field
names are in the @code{_fields} attribute and the default values are in the
@code{_field_defaults} attribute, both of which are part of the @ref{4e1,,namedtuple()}
API.)

@code{NamedTuple} subclasses can also have docstrings and methods:

@example
class Employee(NamedTuple):
    """Represents an employee."""
    name: str
    id: int = 3

    def __repr__(self) -> str:
        return f'<Employee @{self.name@}, id=@{self.id@}>'
@end example

@code{NamedTuple} subclasses can be generic:

@example
class Group[T](NamedTuple):
    key: T
    group: list[T]
@end example

Backward-compatible usage:

@example
# For creating a generic NamedTuple on Python 3.11
T = TypeVar("T")

class Group(NamedTuple, Generic[T]):
    key: T
    group: list[T]

# A functional syntax is also supported
Employee = NamedTuple('Employee', [('name', str), ('id', int)])
@end example


Changed in version 3.6: Added support for 
@geindex Python Enhancement Proposals; PEP 526
PEP 526@footnote{https://peps.python.org/pep-0526/} variable annotation syntax.



Changed in version 3.6.1: Added support for default values, methods, and docstrings.



Changed in version 3.8: The @code{_field_types} and @code{__annotations__} attributes are
now regular dictionaries instead of instances of @code{OrderedDict}.



Changed in version 3.9: Removed the @code{_field_types} attribute in favor of the more
standard @code{__annotations__} attribute which has the same information.



Changed in version 3.9: @code{NamedTuple} is now a function rather than a class.
It can still be used as a class base, as described above.



Changed in version 3.11: Added support for generic namedtuples.



Changed in version 3.14: Using @ref{1a7,,super()} (and the @code{__class__} @ref{18da,,closure variable}) in methods of @code{NamedTuple} subclasses
is unsupported and causes a @ref{199,,TypeError}.



Deprecated since version 3.13, will be removed in version 3.15: The undocumented keyword argument syntax for creating NamedTuple classes
(@code{NT = NamedTuple("NT", x=int)}) is deprecated, and will be disallowed
in 3.15. Use the class-based syntax or the functional syntax instead.



Deprecated since version 3.13, will be removed in version 3.15: When using the functional syntax to create a NamedTuple class, failing to
pass a value to the ‘fields’ parameter (@code{NT = NamedTuple("NT")}) is
deprecated. Passing @code{None} to the ‘fields’ parameter
(@code{NT = NamedTuple("NT", None)}) is also deprecated. Both will be
disallowed in Python 3.15. To create a NamedTuple class with 0 fields,
use @code{class NT(NamedTuple): pass} or @code{NT = NamedTuple("NT", [])}.

@end deffn

@geindex NewType (class in typing)
@anchor{library/typing typing NewType}@anchor{ef7}
@deffn {Class} typing.NewType (name, tp)

Helper class to create low-overhead @ref{4833,,distinct types}.

A @code{NewType} is considered a distinct type by a type checker. At runtime,
however, calling a @code{NewType} returns its argument unchanged.

Usage:

@example
UserId = NewType('UserId', int)  # Declare the NewType "UserId"
first_user = UserId(1)  # "UserId" returns the argument unchanged at runtime
@end example

@geindex __module__ (typing.NewType attribute)
@anchor{library/typing typing NewType __module__}@anchor{4867}
@deffn {Attribute} __module__

The name of the module in which the new type is defined.
@end deffn

@geindex __name__ (typing.NewType attribute)
@anchor{library/typing typing NewType __name__}@anchor{4868}
@deffn {Attribute} __name__

The name of the new type.
@end deffn

@geindex __supertype__ (typing.NewType attribute)
@anchor{library/typing typing NewType __supertype__}@anchor{4869}
@deffn {Attribute} __supertype__

The type that the new type is based on.
@end deffn


Added in version 3.5.2.



Changed in version 3.10: @code{NewType} is now a class rather than a function.

@end deffn

@geindex Protocol (class in typing)
@anchor{library/typing typing Protocol}@anchor{56b}
@deffn {Class} typing.Protocol (Generic)

Base class for protocol classes.

Protocol classes are defined like this:

@example
class Proto(Protocol):
    def meth(self) -> int:
        ...
@end example

Such classes are primarily used with static type checkers that recognize
structural subtyping (static duck-typing), for example:

@example
class C:
    def meth(self) -> int:
        return 0

def func(x: Proto) -> int:
    return x.meth()

func(C())  # Passes static type check
@end example

See 
@geindex Python Enhancement Proposals; PEP 544
PEP 544@footnote{https://peps.python.org/pep-0544/} for more details. Protocol classes decorated with
@ref{675,,runtime_checkable()} (described later) act as simple-minded runtime
protocols that check only the presence of given attributes, ignoring their
type signatures. Protocol classes without this decorator cannot be used
as the second argument to @ref{2af,,isinstance()} or @ref{9ca,,issubclass()}.

Protocol classes can be generic, for example:

@example
class GenProto[T](Protocol):
    def meth(self) -> T:
        ...
@end example

In code that needs to be compatible with Python 3.11 or older, generic
Protocols can be written as follows:

@example
T = TypeVar("T")

class GenProto(Protocol[T]):
    def meth(self) -> T:
        ...
@end example


Added in version 3.8.

@end deffn

@geindex runtime_checkable() (in module typing)
@anchor{library/typing typing runtime_checkable}@anchor{675}
@deffn {Function} @@typing.runtime_checkable

Mark a protocol class as a runtime protocol.

Such a protocol can be used with @ref{2af,,isinstance()} and @ref{9ca,,issubclass()}.
This allows a simple-minded structural check, very similar to “one-trick ponies”
in @ref{1f,,collections.abc} such as @ref{26f9,,Iterable}.  For example:

@example
@@runtime_checkable
class Closable(Protocol):
    def close(self): ...

assert isinstance(open('/some/file'), Closable)

@@runtime_checkable
class Named(Protocol):
    name: str

import threading
assert isinstance(threading.Thread(name='Bob'), Named)
@end example

This decorator raises @ref{199,,TypeError} when applied to a non-protocol class.

@cartouche
@quotation Note 
@code{runtime_checkable()} will check only the presence of the required
methods or attributes, not their type signatures or types.
For example, @ref{d80,,ssl.SSLObject}
is a class, therefore it passes an @ref{9ca,,issubclass()}
check against @ref{271a,,Callable}. However, the
@code{ssl.SSLObject.__init__} method exists only to raise a
@ref{199,,TypeError} with a more informative message, therefore making
it impossible to call (instantiate) @code{ssl.SSLObject}.
@end quotation
@end cartouche

@cartouche
@quotation Note 
An @ref{2af,,isinstance()} check against a runtime-checkable protocol can be
surprisingly slow compared to an @code{isinstance()} check against
a non-protocol class. Consider using alternative idioms such as
@ref{6fa,,hasattr()} calls for structural checks in performance-sensitive
code.
@end quotation
@end cartouche


Added in version 3.8.



Changed in version 3.12: The internal implementation of @ref{2af,,isinstance()} checks against
runtime-checkable protocols now uses @ref{6bd,,inspect.getattr_static()}
to look up attributes (previously, @ref{6fa,,hasattr()} was used).
As a result, some objects which used to be considered instances
of a runtime-checkable protocol may no longer be considered instances
of that protocol on Python 3.12+, and vice versa.
Most users are unlikely to be affected by this change.



Changed in version 3.12: The members of a runtime-checkable protocol are now considered “frozen”
at runtime as soon as the class has been created. Monkey-patching
attributes onto a runtime-checkable protocol will still work, but will
have no impact on @ref{2af,,isinstance()} checks comparing objects to the
protocol. See @ref{6f9,,What’s new in Python 3.12}
for more details.

@end deffn

@geindex TypedDict (class in typing)
@anchor{library/typing typing TypedDict}@anchor{330}
@deffn {Class} typing.TypedDict (dict)

Special construct to add type hints to a dictionary.
At runtime “@code{TypedDict} instances” are simply @ref{184,,dicts}.

@code{TypedDict} declares a dictionary type that expects all of its
instances to have a certain set of keys, where each key is
associated with a value of a consistent type. This expectation
is not checked at runtime but is only enforced by type checkers.
Usage:

@example
class Point2D(TypedDict):
    x: int
    y: int
    label: str

a: Point2D = @{'x': 1, 'y': 2, 'label': 'good'@}  # OK
b: Point2D = @{'z': 3, 'label': 'bad'@}           # Fails type check

assert Point2D(x=1, y=2, label='first') == dict(x=1, y=2, label='first')
@end example

An alternative way to create a @code{TypedDict} is by using
function-call syntax. The second argument must be a literal @ref{184,,dict}:

@example
Point2D = TypedDict('Point2D', @{'x': int, 'y': int, 'label': str@})
@end example

This functional syntax allows defining keys which are not valid
@ref{22e4,,identifiers}, for example because they are
keywords or contain hyphens, or when key names must not be
@ref{20e7,,mangled} like regular private names:

@example
# raises SyntaxError
class Point2D(TypedDict):
    in: int  # 'in' is a keyword
    x-y: int  # name with hyphens

class Definition(TypedDict):
    __schema: str  # mangled to `_Definition__schema`

# OK, functional syntax
Point2D = TypedDict('Point2D', @{'in': int, 'x-y': int@})
Definition = TypedDict('Definition', @{'__schema': str@})  # not mangled
@end example

By default, all keys must be present in a @code{TypedDict}. It is possible to
mark individual keys as non-required using @ref{7e2,,NotRequired}:

@example
class Point2D(TypedDict):
    x: int
    y: int
    label: NotRequired[str]

# Alternative syntax
Point2D = TypedDict('Point2D', @{'x': int, 'y': int, 'label': NotRequired[str]@})
@end example

This means that a @code{Point2D} @code{TypedDict} can have the @code{label}
key omitted.

It is also possible to mark all keys as non-required by default
by specifying a totality of @code{False}:

@example
class Point2D(TypedDict, total=False):
    x: int
    y: int

# Alternative syntax
Point2D = TypedDict('Point2D', @{'x': int, 'y': int@}, total=False)
@end example

This means that a @code{Point2D} @code{TypedDict} can have any of the keys
omitted. A type checker is only expected to support a literal @code{False} or
@code{True} as the value of the @code{total} argument. @code{True} is the default,
and makes all items defined in the class body required.

Individual keys of a @code{total=False} @code{TypedDict} can be marked as
required using @ref{7e1,,Required}:

@example
class Point2D(TypedDict, total=False):
    x: Required[int]
    y: Required[int]
    label: str

# Alternative syntax
Point2D = TypedDict('Point2D', @{
    'x': Required[int],
    'y': Required[int],
    'label': str
@}, total=False)
@end example

It is possible for a @code{TypedDict} type to inherit from one or more other @code{TypedDict} types
using the class-based syntax.
Usage:

@example
class Point3D(Point2D):
    z: int
@end example

@code{Point3D} has three items: @code{x}, @code{y} and @code{z}. It is equivalent to this
definition:

@example
class Point3D(TypedDict):
    x: int
    y: int
    z: int
@end example

A @code{TypedDict} cannot inherit from a non-@code{TypedDict} class,
except for @ref{1806,,Generic}. For example:

@example
class X(TypedDict):
    x: int

class Y(TypedDict):
    y: int

class Z(object): pass  # A non-TypedDict class

class XY(X, Y): pass  # OK

class XZ(X, Z): pass  # raises TypeError
@end example

A @code{TypedDict} can be generic:

@example
class Group[T](TypedDict):
    key: T
    group: list[T]
@end example

To create a generic @code{TypedDict} that is compatible with Python 3.11
or lower, inherit from @ref{1806,,Generic} explicitly:

@example
T = TypeVar("T")

class Group(TypedDict, Generic[T]):
    key: T
    group: list[T]
@end example

A @code{TypedDict} can be introspected via @ref{457,,annotationlib.get_annotations()}
(see @ref{9df,,Annotations Best Practices} for more information on annotations best practices)
and the following attributes:

@geindex __total__ (typing.TypedDict attribute)
@anchor{library/typing typing TypedDict __total__}@anchor{486a}
@deffn {Attribute} __total__

@code{Point2D.__total__} gives the value of the @code{total} argument.
Example:

@example
>>> from typing import TypedDict
>>> class Point2D(TypedDict): pass
>>> Point2D.__total__
True
>>> class Point2D(TypedDict, total=False): pass
>>> Point2D.__total__
False
>>> class Point3D(Point2D): pass
>>> Point3D.__total__
True
@end example

This attribute reflects `only' the value of the @code{total} argument
to the current @code{TypedDict} class, not whether the class is semantically
total. For example, a @code{TypedDict} with @code{__total__} set to @code{True} may
have keys marked with @ref{7e2,,NotRequired}, or it may inherit from another
@code{TypedDict} with @code{total=False}. Therefore, it is generally better to use
@ref{486b,,__required_keys__} and @ref{486c,,__optional_keys__} for introspection.
@end deffn

@geindex __required_keys__ (typing.TypedDict attribute)
@anchor{library/typing typing TypedDict __required_keys__}@anchor{486b}
@deffn {Attribute} __required_keys__


Added in version 3.9.

@end deffn

@geindex __optional_keys__ (typing.TypedDict attribute)
@anchor{library/typing typing TypedDict __optional_keys__}@anchor{486c}
@deffn {Attribute} __optional_keys__

@code{Point2D.__required_keys__} and @code{Point2D.__optional_keys__} return
@ref{7f3,,frozenset} objects containing required and non-required keys, respectively.

Keys marked with @ref{7e1,,Required} will always appear in @code{__required_keys__}
and keys marked with @ref{7e2,,NotRequired} will always appear in @code{__optional_keys__}.

For backwards compatibility with Python 3.10 and below,
it is also possible to use inheritance to declare both required and
non-required keys in the same @code{TypedDict}. This is done by declaring a
@code{TypedDict} with one value for the @code{total} argument and then
inheriting from it in another @code{TypedDict} with a different value for
@code{total}:

@example
>>> class Point2D(TypedDict, total=False):
...     x: int
...     y: int
...
>>> class Point3D(Point2D):
...     z: int
...
>>> Point3D.__required_keys__ == frozenset(@{'z'@})
True
>>> Point3D.__optional_keys__ == frozenset(@{'x', 'y'@})
True
@end example


Added in version 3.9.


@cartouche
@quotation Note 
If @code{from __future__ import annotations} is used or if annotations
are given as strings, annotations are not evaluated when the
@code{TypedDict} is defined. Therefore, the runtime introspection that
@code{__required_keys__} and @code{__optional_keys__} rely on may not work
properly, and the values of the attributes may be incorrect.
@end quotation
@end cartouche
@end deffn

Support for @ref{48b,,ReadOnly} is reflected in the following attributes:

@geindex __readonly_keys__ (typing.TypedDict attribute)
@anchor{library/typing typing TypedDict __readonly_keys__}@anchor{486d}
@deffn {Attribute} __readonly_keys__

A @ref{7f3,,frozenset} containing the names of all read-only keys. Keys
are read-only if they carry the @ref{48b,,ReadOnly} qualifier.


Added in version 3.13.

@end deffn

@geindex __mutable_keys__ (typing.TypedDict attribute)
@anchor{library/typing typing TypedDict __mutable_keys__}@anchor{486e}
@deffn {Attribute} __mutable_keys__

A @ref{7f3,,frozenset} containing the names of all mutable keys. Keys
are mutable if they do not carry the @ref{48b,,ReadOnly} qualifier.


Added in version 3.13.

@end deffn

See the TypedDict@footnote{https://typing.python.org/en/latest/spec/typeddict.html#typeddict} section in the typing documentation for more examples and detailed rules.


Added in version 3.8.



Changed in version 3.9: @code{TypedDict} is now a function rather than a class.
It can still be used as a class base, as described above.



Changed in version 3.11: Added support for marking individual keys as @ref{7e1,,Required} or @ref{7e2,,NotRequired}.
See 
@geindex Python Enhancement Proposals; PEP 655
PEP 655@footnote{https://peps.python.org/pep-0655/}.



Changed in version 3.11: Added support for generic @code{TypedDict}s.



Changed in version 3.13: Removed support for the keyword-argument method of creating @code{TypedDict}s.



Changed in version 3.13: Support for the @ref{48b,,ReadOnly} qualifier was added.



Deprecated since version 3.13, will be removed in version 3.15: When using the functional syntax to create a TypedDict class, failing to
pass a value to the ‘fields’ parameter (@code{TD = TypedDict("TD")}) is
deprecated. Passing @code{None} to the ‘fields’ parameter
(@code{TD = TypedDict("TD", None)}) is also deprecated. Both will be
disallowed in Python 3.15. To create a TypedDict class with 0 fields,
use @code{class TD(TypedDict): pass} or @code{TD = TypedDict("TD", @{@})}.

@end deffn

@node Protocols<4>,ABCs and Protocols for working with I/O,Special typing primitives,Module contents<4>
@anchor{library/typing protocols}@anchor{486f}
@subsubsection Protocols


The following protocols are provided by the @code{typing} module. All are decorated
with @ref{675,,@@runtime_checkable}.

@geindex SupportsAbs (class in typing)
@anchor{library/typing typing SupportsAbs}@anchor{4870}
@deffn {Class} typing.SupportsAbs

A protocol with one abstract method @code{__abs__} that is covariant
in its return type.
@end deffn

@geindex SupportsBytes (class in typing)
@anchor{library/typing typing SupportsBytes}@anchor{801}
@deffn {Class} typing.SupportsBytes

A protocol with one abstract method @code{__bytes__}.
@end deffn

@geindex SupportsComplex (class in typing)
@anchor{library/typing typing SupportsComplex}@anchor{800}
@deffn {Class} typing.SupportsComplex

A protocol with one abstract method @code{__complex__}.
@end deffn

@geindex SupportsFloat (class in typing)
@anchor{library/typing typing SupportsFloat}@anchor{4871}
@deffn {Class} typing.SupportsFloat

A protocol with one abstract method @code{__float__}.
@end deffn

@geindex SupportsIndex (class in typing)
@anchor{library/typing typing SupportsIndex}@anchor{c40}
@deffn {Class} typing.SupportsIndex

A protocol with one abstract method @code{__index__}.


Added in version 3.8.

@end deffn

@geindex SupportsInt (class in typing)
@anchor{library/typing typing SupportsInt}@anchor{c3f}
@deffn {Class} typing.SupportsInt

A protocol with one abstract method @code{__int__}.
@end deffn

@geindex SupportsRound (class in typing)
@anchor{library/typing typing SupportsRound}@anchor{4872}
@deffn {Class} typing.SupportsRound

A protocol with one abstract method @code{__round__}
that is covariant in its return type.
@end deffn

@node ABCs and Protocols for working with I/O,Functions and decorators,Protocols<4>,Module contents<4>
@anchor{library/typing abcs-and-protocols-for-working-with-i-o}@anchor{4873}@anchor{library/typing typing-io}@anchor{319c}
@subsubsection ABCs and Protocols for working with I/O


@geindex IO (class in typing)
@geindex TextIO (class in typing)
@geindex BinaryIO (class in typing)
@anchor{library/typing typing IO}@anchor{23a}
@deffn {Class} typing.IO [AnyStr]
@anchor{library/typing typing TextIO}@anchor{23b}
@deffnx {Class} typing.TextIO
@anchor{library/typing typing BinaryIO}@anchor{23c}
@deffnx {Class} typing.BinaryIO

Generic class @code{IO[AnyStr]} and its subclasses @code{TextIO(IO[str])}
and @code{BinaryIO(IO[bytes])}
represent the types of I/O streams such as returned by
@ref{318,,open()}. Please note that these classes are not protocols, and
their interface is fairly broad.
@end deffn

The protocols @ref{238,,io.Reader} and @ref{239,,io.Writer} offer a simpler
alternative for argument types, when only the @code{read()} or @code{write()}
methods are accessed, respectively:

@example
def read_and_write(reader: Reader[str], writer: Writer[bytes]):
    data = reader.read()
    writer.write(data.encode())
@end example

Also consider using @ref{26f9,,collections.abc.Iterable} for iterating over
the lines of an input stream:

@example
def read_config(stream: Iterable[str]):
    for line in stream:
        ...
@end example

@node Functions and decorators,Introspection helpers,ABCs and Protocols for working with I/O,Module contents<4>
@anchor{library/typing functions-and-decorators}@anchor{4874}
@subsubsection Functions and decorators


@geindex cast() (in module typing)
@anchor{library/typing typing cast}@anchor{485a}
@deffn {Function} typing.cast (typ, val)

Cast a value to a type.

This returns the value unchanged.  To the type checker this
signals that the return value has the designated type, but at
runtime we intentionally don’t check anything (we want this
to be as fast as possible).
@end deffn

@geindex assert_type() (in module typing)
@anchor{library/typing typing assert_type}@anchor{8bc}
@deffn {Function} typing.assert_type (val, typ, /)

Ask a static type checker to confirm that `val' has an inferred type of `typ'.

At runtime this does nothing: it returns the first argument unchanged with no
checks or side effects, no matter the actual type of the argument.

When a static type checker encounters a call to @code{assert_type()}, it
emits an error if the value is not of the specified type:

@example
def greet(name: str) -> None:
    assert_type(name, str)  # OK, inferred type of `name` is `str`
    assert_type(name, int)  # type checker error
@end example

This function is useful for ensuring the type checker’s understanding of a
script is in line with the developer’s intentions:

@example
def complex_function(arg: object):
    # Do some complex type-narrowing logic,
    # after which we hope the inferred type will be `int`
    ...
    # Test whether the type checker correctly understands our function
    assert_type(arg, int)
@end example


Added in version 3.11.

@end deffn

@geindex assert_never() (in module typing)
@anchor{library/typing typing assert_never}@anchor{8b8}
@deffn {Function} typing.assert_never (arg, /)

Ask a static type checker to confirm that a line of code is unreachable.

Example:

@example
def int_or_str(arg: int | str) -> None:
    match arg:
        case int():
            print("It's an int")
        case str():
            print("It's a str")
        case _ as unreachable:
            assert_never(unreachable)
@end example

Here, the annotations allow the type checker to infer that the
last case can never execute, because @code{arg} is either
an @ref{19c,,int} or a @ref{16a,,str}, and both options are covered by
earlier cases.

If a type checker finds that a call to @code{assert_never()} is
reachable, it will emit an error. For example, if the type annotation
for @code{arg} was instead @code{int | str | float}, the type checker would
emit an error pointing out that @code{unreachable} is of type @ref{197,,float}.
For a call to @code{assert_never} to pass type checking, the inferred type of
the argument passed in must be the bottom type, @ref{8b9,,Never}, and nothing
else.

At runtime, this throws an exception when called.


@subsubheading See also


Unreachable Code and Exhaustiveness Checking@footnote{https://typing.python.org/en/latest/guides/unreachable.html} has more
information about exhaustiveness checking with static typing.



Added in version 3.11.

@end deffn

@geindex reveal_type() (in module typing)
@anchor{library/typing typing reveal_type}@anchor{8bb}
@deffn {Function} typing.reveal_type (obj, /)

Ask a static type checker to reveal the inferred type of an expression.

When a static type checker encounters a call to this function,
it emits a diagnostic with the inferred type of the argument. For example:

@example
x: int = 1
reveal_type(x)  # Revealed type is "builtins.int"
@end example

This can be useful when you want to debug how your type checker
handles a particular piece of code.

At runtime, this function prints the runtime type of its argument to
@ref{b39,,sys.stderr} and returns the argument unchanged (allowing the call to
be used within an expression):

@example
x = reveal_type(1)  # prints "Runtime type is int"
print(x)  # prints "1"
@end example

Note that the runtime type may be different from (more or less specific
than) the type statically inferred by a type checker.

Most type checkers support @code{reveal_type()} anywhere, even if the
name is not imported from @code{typing}. Importing the name from
@code{typing}, however, allows your code to run without runtime errors and
communicates intent more clearly.


Added in version 3.11.

@end deffn

@geindex dataclass_transform() (in module typing)
@anchor{library/typing typing dataclass_transform}@anchor{6fc}
@deffn {Function} @@typing.dataclass_transform (*, eq_default=True, order_default=False, kw_only_default=False, frozen_default=False, field_specifiers=(), **kwargs)

Decorator to mark an object as providing
@ref{4e2,,dataclass}-like behavior.

@code{dataclass_transform} may be used to
decorate a class, metaclass, or a function that is itself a decorator.
The presence of @code{@@dataclass_transform()} tells a static type checker that the
decorated object performs runtime “magic” that
transforms a class in a similar way to
@ref{4e2,,@@dataclasses.dataclass}.

Example usage with a decorator function:

@example
@@dataclass_transform()
def create_model[T](cls: type[T]) -> type[T]:
    ...
    return cls

@@create_model
class CustomerModel:
    id: int
    name: str
@end example

On a base class:

@example
@@dataclass_transform()
class ModelBase: ...

class CustomerModel(ModelBase):
    id: int
    name: str
@end example

On a metaclass:

@example
@@dataclass_transform()
class ModelMeta(type): ...

class ModelBase(metaclass=ModelMeta): ...

class CustomerModel(ModelBase):
    id: int
    name: str
@end example

The @code{CustomerModel} classes defined above will
be treated by type checkers similarly to classes created with
@ref{4e2,,@@dataclasses.dataclass}.
For example, type checkers will assume these classes have
@code{__init__} methods that accept @code{id} and @code{name}.

The decorated class, metaclass, or function may accept the following bool
arguments which type checkers will assume have the same effect as they
would have on the
@ref{4e2,,@@dataclasses.dataclass} decorator: @code{init},
@code{eq}, @code{order}, @code{unsafe_hash}, @code{frozen}, @code{match_args},
@code{kw_only}, and @code{slots}. It must be possible for the value of these
arguments (@code{True} or @code{False}) to be statically evaluated.

The arguments to the @code{dataclass_transform} decorator can be used to
customize the default behaviors of the decorated class, metaclass, or
function:

@*Parameters: 

@itemize *

@item 
@code{eq_default} (@ref{3c1,,bool}) – Indicates whether the @code{eq} parameter is assumed to be
@code{True} or @code{False} if it is omitted by the caller.
Defaults to @code{True}.

@item 
@code{order_default} (@ref{3c1,,bool}) – Indicates whether the @code{order} parameter is
assumed to be @code{True} or @code{False} if it is omitted by the caller.
Defaults to @code{False}.

@item 
@code{kw_only_default} (@ref{3c1,,bool}) – Indicates whether the @code{kw_only} parameter is
assumed to be @code{True} or @code{False} if it is omitted by the caller.
Defaults to @code{False}.

@item 
@code{frozen_default} (@ref{3c1,,bool}) – 
Indicates whether the @code{frozen} parameter is
assumed to be @code{True} or @code{False} if it is omitted by the caller.
Defaults to @code{False}.


Added in version 3.12.



@item 
@code{field_specifiers} (@ref{614,,tuple}@code{[}@ref{9f1,,Callable}@code{[}@code{...}@code{, }@code{Any}@code{]}@code{, }@code{...}@code{]}) – Specifies a static list of supported classes
or functions that describe fields, similar to @ref{199e,,dataclasses.field()}.
Defaults to @code{()}.

@item 
@code{**kwargs} (@code{Any}) – Arbitrary other keyword arguments are accepted in order to allow for
possible future extensions.
@end itemize


Type checkers recognize the following optional parameters on field
specifiers:
`Recognised parameters for field specifiers'



@multitable {xxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Parameter name

@tab

Description

@item

@code{init}

@tab

Indicates whether the field should be included in the
synthesized @code{__init__} method. If unspecified, @code{init} defaults to
@code{True}.

@item

@code{default}

@tab

Provides the default value for the field.

@item

@code{default_factory}

@tab

Provides a runtime callback that returns the
default value for the field. If neither @code{default} nor
@code{default_factory} are specified, the field is assumed to have no
default value and must be provided a value when the class is
instantiated.

@item

@code{factory}

@tab

An alias for the @code{default_factory} parameter on field specifiers.

@item

@code{kw_only}

@tab

Indicates whether the field should be marked as
keyword-only. If @code{True}, the field will be keyword-only. If
@code{False}, it will not be keyword-only. If unspecified, the value of
the @code{kw_only} parameter on the object decorated with
@code{dataclass_transform} will be used, or if that is unspecified, the
value of @code{kw_only_default} on @code{dataclass_transform} will be used.

@item

@code{alias}

@tab

Provides an alternative name for the field. This alternative
name is used in the synthesized @code{__init__} method.

@end multitable


At runtime, this decorator records its arguments in the
@code{__dataclass_transform__} attribute on the decorated object.
It has no other runtime effect.

See 
@geindex Python Enhancement Proposals; PEP 681
PEP 681@footnote{https://peps.python.org/pep-0681/} for more details.


Added in version 3.11.

@end deffn

@geindex overload() (in module typing)
@anchor{library/typing overload}@anchor{4836}@anchor{library/typing typing overload}@anchor{4875}
@deffn {Function} @@typing.overload

Decorator for creating overloaded functions and methods.

The @code{@@overload} decorator allows describing functions and methods
that support multiple different combinations of argument types. A series
of @code{@@overload}-decorated definitions must be followed by exactly one
non-@code{@@overload}-decorated definition (for the same function/method).

@code{@@overload}-decorated definitions are for the benefit of the
type checker only, since they will be overwritten by the
non-@code{@@overload}-decorated definition. The non-@code{@@overload}-decorated
definition, meanwhile, will be used at
runtime but should be ignored by a type checker.  At runtime, calling
an @code{@@overload}-decorated function directly will raise
@ref{369,,NotImplementedError}.

An example of overload that gives a more
precise type than can be expressed using a union or a type variable:

@example
@@overload
def process(response: None) -> None:
    ...
@@overload
def process(response: int) -> tuple[int, str]:
    ...
@@overload
def process(response: bytes) -> str:
    ...
def process(response):
    ...  # actual implementation goes here
@end example

See 
@geindex Python Enhancement Proposals; PEP 484
PEP 484@footnote{https://peps.python.org/pep-0484/} for more details and comparison with other typing semantics.


Changed in version 3.11: Overloaded functions can now be introspected at runtime using
@ref{8bf,,get_overloads()}.

@end deffn

@geindex get_overloads() (in module typing)
@anchor{library/typing typing get_overloads}@anchor{8bf}
@deffn {Function} typing.get_overloads (func)

Return a sequence of @ref{4875,,@@overload}-decorated definitions for
`func'.

`func' is the function object for the implementation of the
overloaded function. For example, given the definition of @code{process} in
the documentation for @ref{4875,,@@overload},
@code{get_overloads(process)} will return a sequence of three function objects
for the three defined overloads. If called on a function with no overloads,
@code{get_overloads()} returns an empty sequence.

@code{get_overloads()} can be used for introspecting an overloaded function at
runtime.


Added in version 3.11.

@end deffn

@geindex clear_overloads() (in module typing)
@anchor{library/typing typing clear_overloads}@anchor{8c0}
@deffn {Function} typing.clear_overloads ()

Clear all registered overloads in the internal registry.

This can be used to reclaim the memory used by the registry.


Added in version 3.11.

@end deffn

@geindex final() (in module typing)
@anchor{library/typing typing final}@anchor{8be}
@deffn {Function} @@typing.final

Decorator to indicate final methods and final classes.

Decorating a method with @code{@@final} indicates to a type checker that the
method cannot be overridden in a subclass. Decorating a class with @code{@@final}
indicates that it cannot be subclassed.

For example:

@example
class Base:
    @@final
    def done(self) -> None:
        ...
class Sub(Base):
    def done(self) -> None:  # Error reported by type checker
        ...

@@final
class Leaf:
    ...
class Other(Leaf):  # Error reported by type checker
    ...
@end example

There is no runtime checking of these properties. See 
@geindex Python Enhancement Proposals; PEP 591
PEP 591@footnote{https://peps.python.org/pep-0591/} for
more details.


Added in version 3.8.



Changed in version 3.11: The decorator will now attempt to set a @code{__final__} attribute to @code{True}
on the decorated object. Thus, a check like
@code{if getattr(obj, "__final__", False)} can be used at runtime
to determine whether an object @code{obj} has been marked as final.
If the decorated object does not support setting attributes,
the decorator returns the object unchanged without raising an exception.

@end deffn

@geindex no_type_check() (in module typing)
@anchor{library/typing typing no_type_check}@anchor{8c5}
@deffn {Function} @@typing.no_type_check

Decorator to indicate that annotations are not type hints.

This works as a class or function @ref{93f,,decorator}.  With a class, it
applies recursively to all methods and classes defined in that class
(but not to methods defined in its superclasses or subclasses). Type
checkers will ignore all annotations in a function or class with this
decorator.

@code{@@no_type_check} mutates the decorated object in place.
@end deffn

@geindex no_type_check_decorator() (in module typing)
@anchor{library/typing typing no_type_check_decorator}@anchor{331}
@deffn {Function} @@typing.no_type_check_decorator

Decorator to give another decorator the @ref{8c5,,no_type_check()} effect.

This wraps the decorator with something that wraps the decorated
function in @ref{8c5,,no_type_check()}.


Deprecated since version 3.13, will be removed in version 3.15: No type checker ever added support for @code{@@no_type_check_decorator}. It
is therefore deprecated, and will be removed in Python 3.15.

@end deffn

@geindex override() (in module typing)
@anchor{library/typing typing override}@anchor{67d}
@deffn {Function} @@typing.override

Decorator to indicate that a method in a subclass is intended to override a
method or attribute in a superclass.

Type checkers should emit an error if a method decorated with @code{@@override}
does not, in fact, override anything.
This helps prevent bugs that may occur when a base class is changed without
an equivalent change to a child class.

For example:

@example
class Base:
    def log_status(self) -> None:
        ...

class Sub(Base):
    @@override
    def log_status(self) -> None:  # Okay: overrides Base.log_status
        ...

    @@override
    def done(self) -> None:  # Error reported by type checker
        ...
@end example

There is no runtime checking of this property.

The decorator will attempt to set an @code{__override__} attribute to @code{True} on
the decorated object. Thus, a check like
@code{if getattr(obj, "__override__", False)} can be used at runtime to determine
whether an object @code{obj} has been marked as an override.  If the decorated object
does not support setting attributes, the decorator returns the object unchanged
without raising an exception.

See 
@geindex Python Enhancement Proposals; PEP 698
PEP 698@footnote{https://peps.python.org/pep-0698/} for more details.


Added in version 3.12.

@end deffn

@geindex type_check_only() (in module typing)
@anchor{library/typing typing type_check_only}@anchor{4876}
@deffn {Function} @@typing.type_check_only

Decorator to mark a class or function as unavailable at runtime.

This decorator is itself not available at runtime. It is mainly
intended to mark classes that are defined in type stub files if
an implementation returns an instance of a private class:

@example
@@type_check_only
class Response:  # private or not available at runtime
    code: int
    def get_header(self, name: str) -> str: ...

def fetch_response() -> Response: ...
@end example

Note that returning instances of private classes is not recommended.
It is usually preferable to make such classes public.
@end deffn

@node Introspection helpers,Constant,Functions and decorators,Module contents<4>
@anchor{library/typing introspection-helpers}@anchor{4877}
@subsubsection Introspection helpers


@geindex get_type_hints() (in module typing)
@anchor{library/typing typing get_type_hints}@anchor{8c2}
@deffn {Function} typing.get_type_hints (obj, globalns=None, localns=None, include_extras=False, *, format=Format.VALUE)

Return a dictionary containing type hints for a function, method, module,
class object, or other callable object.

This is often the same as @ref{457,,annotationlib.get_annotations()}, but this
function makes the following changes to the annotations dictionary:


@itemize *

@item 
Forward references encoded as string literals or @ref{1c1d,,ForwardRef}
objects are handled by evaluating them in `globalns', `localns', and
(where applicable) `obj'’s @ref{5ad,,type parameter} namespace.
If `globalns' or `localns' is not given, appropriate namespace
dictionaries are inferred from `obj'.

@item 
@code{None} is replaced with @ref{a58,,types.NoneType}.

@item 
If @ref{8c5,,@@no_type_check} has been applied to `obj', an
empty dictionary is returned.

@item 
If `obj' is a class @code{C}, the function returns a dictionary that merges
annotations from @code{C}’s base classes with those on @code{C} directly. This
is done by traversing @ref{23bb,,C.__mro__} and iteratively
combining
@ref{f57,,annotations} of each base class. Annotations
on classes appearing earlier in the @ref{2627,,method resolution order} always
take precedence over annotations on classes appearing later in the method
resolution order.

@item 
The function recursively replaces all occurrences of
@code{Annotated[T, ...]}, @code{Required[T]}, @code{NotRequired[T]}, and @code{ReadOnly[T]}
with @code{T}, unless `include_extras' is set to @code{True} (see
@ref{b3d,,Annotated} for more information).
@end itemize

@cartouche
@quotation Caution 
This function may execute arbitrary code contained in annotations.
See @ref{4878,,Security implications of introspecting annotations} for more information.
@end quotation
@end cartouche

@cartouche
@quotation Note 
If @ref{15f,,Format.VALUE} is used and any
forward references in the annotations of `obj' are not resolvable, a
@ref{450,,NameError} exception is raised. For example, this can happen
with names imported under @ref{ef6,,if TYPE_CHECKING}.
More generally, any kind of exception can be raised if an annotation
contains invalid Python code.
@end quotation
@end cartouche

@cartouche
@quotation Note 
Calling @code{get_type_hints()} on an instance is not supported.
To retrieve annotations for an instance, call
@code{get_type_hints()} on the instance’s class instead
(for example, @code{get_type_hints(type(obj))}).
@end quotation
@end cartouche


Changed in version 3.9: Added @code{include_extras} parameter as part of 
@geindex Python Enhancement Proposals; PEP 593
PEP 593@footnote{https://peps.python.org/pep-0593/}.
See the documentation on @ref{b3d,,Annotated} for more information.



Changed in version 3.11: Previously, @code{Optional[t]} was added for function and method annotations
if a default value equal to @code{None} was set.
Now the annotation is returned unchanged.



Changed in version 3.14: Added the @code{format} parameter. See the documentation on
@ref{457,,annotationlib.get_annotations()} for more information.



Changed in version 3.14: Calling @code{get_type_hints()} on instances is no longer supported.
Some instances were accepted in earlier versions as an undocumented
implementation detail.

@end deffn

@geindex get_origin() (in module typing)
@anchor{library/typing typing get_origin}@anchor{2ad}
@deffn {Function} typing.get_origin (tp)

Get the unsubscripted version of a type: for a typing object of the form
@code{X[Y, Z, ...]} return @code{X}.

If @code{X} is a typing-module alias for a builtin or
@ref{1e,,collections} class, it will be normalized to the original class.
If @code{X} is an instance of @ref{9cf,,ParamSpecArgs} or @ref{9d0,,ParamSpecKwargs},
return the underlying @ref{488,,ParamSpec}.
Return @code{None} for unsupported objects.

Examples:

@example
assert get_origin(str) is None
assert get_origin(Dict[str, int]) is dict
assert get_origin(Union[int, str]) is Union
assert get_origin(Annotated[str, "metadata"]) is Annotated
P = ParamSpec('P')
assert get_origin(P.args) is P
assert get_origin(P.kwargs) is P
@end example


Added in version 3.8.

@end deffn

@geindex get_args() (in module typing)
@anchor{library/typing typing get_args}@anchor{2ae}
@deffn {Function} typing.get_args (tp)

Get type arguments with all substitutions performed: for a typing object
of the form @code{X[Y, Z, ...]} return @code{(Y, Z, ...)}.

If @code{X} is a union or @ref{a5b,,Literal} contained in another
generic type, the order of @code{(Y, Z, ...)} may be different from the order
of the original arguments @code{[Y, Z, ...]} due to type caching.
Return @code{()} for unsupported objects.

Examples:

@example
assert get_args(int) == ()
assert get_args(Dict[int, str]) == (int, str)
assert get_args(Union[int, str]) == (int, str)
@end example


Added in version 3.8.

@end deffn

@geindex get_protocol_members() (in module typing)
@anchor{library/typing typing get_protocol_members}@anchor{56a}
@deffn {Function} typing.get_protocol_members (tp)

Return the set of members defined in a @ref{56b,,Protocol}.

@example
>>> from typing import Protocol, get_protocol_members
>>> class P(Protocol):
...     def a(self) -> str: ...
...     b: int
>>> get_protocol_members(P) == frozenset(@{'a', 'b'@})
True
@end example

Raise @ref{199,,TypeError} for arguments that are not Protocols.


Added in version 3.13.

@end deffn

@geindex is_protocol() (in module typing)
@anchor{library/typing typing is_protocol}@anchor{56c}
@deffn {Function} typing.is_protocol (tp)

Determine if a type is a @ref{56b,,Protocol}.

For example:

@example
class P(Protocol):
    def a(self) -> str: ...
    b: int

assert is_protocol(P)
assert not is_protocol(int)
@end example

This function only returns true for @code{Protocol} classes, not for
@ref{8c3,,generic aliases} of them:

@example
class GenericP[T](Protocol):
    def a(self) -> T: ...
    b: int

assert not is_protocol(GenericP[int])
@end example


Added in version 3.13.

@end deffn

@geindex is_typeddict() (in module typing)
@anchor{library/typing typing is_typeddict}@anchor{a5c}
@deffn {Function} typing.is_typeddict (tp)

Check if a type is a @ref{330,,TypedDict}.

For example:

@example
class Film(TypedDict):
    title: str
    year: int

assert is_typeddict(Film)
assert not is_typeddict(list | str)

# TypedDict is a factory for creating typed dicts,
# not a typed dict itself
assert not is_typeddict(TypedDict)
@end example

This function only returns true for @code{TypedDict} classes, not for
@ref{8c3,,generic aliases} of them:

@example
class GenericFilm[T](TypedDict):
    title: str
    year: T

assert not is_typeddict(GenericFilm[int])
@end example


Added in version 3.10.

@end deffn

@geindex ForwardRef (class in typing)
@anchor{library/typing typing ForwardRef}@anchor{1c1d}
@deffn {Class} typing.ForwardRef

Class used for internal typing representation of string forward references.

For example, @code{List["SomeClass"]} is implicitly transformed into
@code{List[ForwardRef("SomeClass")]}.  @code{ForwardRef} should not be instantiated by
a user, but may be used by introspection tools.

@cartouche
@quotation Note 
@geindex Python Enhancement Proposals; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} generic types such as @code{list["SomeClass"]} will not be
implicitly transformed into @code{list[ForwardRef("SomeClass")]} and thus
will not automatically resolve to @code{list[SomeClass]}.
@end quotation
@end cartouche


Added in version 3.7.4.



Changed in version 3.14: This is now an alias for @ref{17c9,,annotationlib.ForwardRef}. Several undocumented
behaviors of this class have been changed; for example, after a @code{ForwardRef} has
been evaluated, the evaluated value is no longer cached.

@end deffn

@geindex evaluate_forward_ref() (in module typing)
@anchor{library/typing typing evaluate_forward_ref}@anchor{185f}
@deffn {Function} typing.evaluate_forward_ref (forward_ref, *, owner=None, globals=None, locals=None, type_params=None, format=annotationlib.Format.VALUE)

Evaluate an @ref{17c9,,annotationlib.ForwardRef} as a @ref{2412,,type hint}.

This is similar to calling @ref{1803,,annotationlib.ForwardRef.evaluate()},
but unlike that method, @code{evaluate_forward_ref()} also
recursively evaluates forward references nested within the type hint.

See the documentation for @ref{1803,,annotationlib.ForwardRef.evaluate()} for
the meaning of the `owner', `globals', `locals', `type_params', and `format' parameters.

@cartouche
@quotation Caution 
This function may execute arbitrary code contained in annotations.
See @ref{4878,,Security implications of introspecting annotations} for more information.
@end quotation
@end cartouche


Added in version 3.14.

@end deffn

@geindex NoDefault (in module typing)
@anchor{library/typing typing NoDefault}@anchor{569}
@deffn {Data} typing.NoDefault

A sentinel object used to indicate that a type parameter has no default
value. For example:

@example
>>> T = TypeVar("T")
>>> T.__default__ is typing.NoDefault
True
>>> S = TypeVar("S", default=None)
>>> S.__default__ is None
True
@end example


Added in version 3.13.

@end deffn

@node Constant,Deprecated aliases,Introspection helpers,Module contents<4>
@anchor{library/typing constant}@anchor{4879}
@subsubsection Constant


@geindex TYPE_CHECKING (in module typing)
@anchor{library/typing typing TYPE_CHECKING}@anchor{ef6}
@deffn {Data} typing.TYPE_CHECKING

A special constant that is assumed to be @code{True} by static
type checkers. It’s @code{False} at runtime.

A module which is expensive to import, and which only contain types
used for typing annotations, can be safely imported inside an
@code{if TYPE_CHECKING:} block.  This prevents the module from actually
being imported at runtime; annotations aren’t eagerly evaluated
(see 
@geindex Python Enhancement Proposals; PEP 649
PEP 649@footnote{https://peps.python.org/pep-0649/}) so using undefined symbols in annotations is
harmless–as long as you don’t later examine them.
Your static type analysis tool will set @code{TYPE_CHECKING} to
@code{True} during static type analysis, which means the module will
be imported and the types will be checked properly during such analysis.

Usage:

@example
if TYPE_CHECKING:
    import expensive_mod

def fun(arg: expensive_mod.SomeType) -> None:
    local_var: expensive_mod.AnotherType = other_fun()
@end example

If you occasionally need to examine type annotations at runtime
which may contain undefined symbols, use
@ref{457,,annotationlib.get_annotations()} with a @code{format} parameter
of @ref{161,,annotationlib.Format.STRING} or
@ref{160,,annotationlib.Format.FORWARDREF} to safely retrieve the
annotations without raising @ref{450,,NameError}.


Added in version 3.5.2.

@end deffn
@anchor{library/typing generic-concrete-collections}@anchor{487a}
@node Deprecated aliases,,Constant,Module contents<4>
@anchor{library/typing deprecated-aliases}@anchor{487b}@anchor{library/typing id6}@anchor{487c}
@subsubsection Deprecated aliases


This module defines several deprecated aliases to pre-existing
standard library classes. These were originally included in the @code{typing}
module in order to support parameterizing these generic classes using @code{[]}.
However, the aliases became redundant in Python 3.9 when the
corresponding pre-existing classes were enhanced to support @code{[]} (see
@geindex Python Enhancement Proposals; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/}).

The redundant types are deprecated as of Python 3.9. However, while the aliases
may be removed at some point, removal of these aliases is not currently
planned. As such, no deprecation warnings are currently issued by the
interpreter for these aliases.

If at some point it is decided to remove these deprecated aliases, a
deprecation warning will be issued by the interpreter for at least two releases
prior to removal. The aliases are guaranteed to remain in the @code{typing} module
without deprecation warnings until at least Python 3.14.

Type checkers are encouraged to flag uses of the deprecated types if the
program they are checking targets a minimum Python version of 3.9 or newer.

@menu
* Aliases to built-in types:: 
* Aliases to types in collections:: 
* Aliases to other concrete types:: 
* Aliases to container ABCs in collections.abc: Aliases to container ABCs in collections abc. 
* Aliases to asynchronous ABCs in collections.abc: Aliases to asynchronous ABCs in collections abc. 
* Aliases to other ABCs in collections.abc: Aliases to other ABCs in collections abc. 
* Aliases to contextlib ABCs:: 

@end menu

@node Aliases to built-in types,Aliases to types in collections,,Deprecated aliases
@anchor{library/typing aliases-to-built-in-types}@anchor{487d}@anchor{library/typing corresponding-to-built-in-types}@anchor{487e}
@subsubsection Aliases to built-in types


@geindex Dict (class in typing)
@anchor{library/typing typing Dict}@anchor{487f}
@deffn {Class} typing.Dict (dict, MutableMapping[KT, VT])

Deprecated alias to @ref{184,,dict}.

Note that to annotate arguments, it is preferred
to use an abstract collection type such as @ref{acd,,Mapping}
rather than to use @ref{184,,dict} or @code{typing.Dict}.


Deprecated since version 3.9: @ref{184,,builtins.dict} now supports subscripting (@code{[]}).
See 
@geindex Python Enhancement Proposals; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c3,,Generic Alias Type}.

@end deffn

@geindex List (class in typing)
@anchor{library/typing typing List}@anchor{4880}
@deffn {Class} typing.List (list, MutableSequence[T])

Deprecated alias to @ref{24f,,list}.

Note that to annotate arguments, it is preferred
to use an abstract collection type such as
@ref{13d0,,Sequence} or @ref{26f9,,Iterable}
rather than to use @ref{24f,,list} or @code{typing.List}.


Deprecated since version 3.9: @ref{24f,,builtins.list} now supports subscripting (@code{[]}).
See 
@geindex Python Enhancement Proposals; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c3,,Generic Alias Type}.

@end deffn

@geindex Set (class in typing)
@anchor{library/typing typing Set}@anchor{4881}
@deffn {Class} typing.Set (set, MutableSet[T])

Deprecated alias to @ref{185,,builtins.set}.

Note that to annotate arguments, it is preferred
to use an abstract collection type such as @ref{26f1,,collections.abc.Set}
rather than to use @ref{185,,set} or @ref{4881,,typing.Set}.


Deprecated since version 3.9: @ref{185,,builtins.set} now supports subscripting (@code{[]}).
See 
@geindex Python Enhancement Proposals; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c3,,Generic Alias Type}.

@end deffn

@geindex FrozenSet (class in typing)
@anchor{library/typing typing FrozenSet}@anchor{4882}
@deffn {Class} typing.FrozenSet (frozenset, AbstractSet[T_co])

Deprecated alias to @ref{7f3,,builtins.frozenset}.


Deprecated since version 3.9: @ref{7f3,,builtins.frozenset}
now supports subscripting (@code{[]}).
See 
@geindex Python Enhancement Proposals; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c3,,Generic Alias Type}.

@end deffn

@geindex Tuple (in module typing)
@anchor{library/typing typing Tuple}@anchor{4883}
@deffn {Data} typing.Tuple

Deprecated alias for @ref{614,,tuple}.

@ref{614,,tuple} and @code{Tuple} are special-cased in the type system; see
@ref{265d,,Annotating tuples} for more details.


Deprecated since version 3.9: @ref{614,,builtins.tuple} now supports subscripting (@code{[]}).
See 
@geindex Python Enhancement Proposals; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c3,,Generic Alias Type}.

@end deffn

@geindex Type (class in typing)
@anchor{library/typing typing Type}@anchor{483b}
@deffn {Class} typing.Type (Generic[CT_co])

Deprecated alias to @ref{f4a,,type}.

See @ref{483a,,The type of class objects} for details on using @ref{f4a,,type} or
@code{typing.Type} in type annotations.


Added in version 3.5.2.



Deprecated since version 3.9: @ref{f4a,,builtins.type} now supports subscripting (@code{[]}).
See 
@geindex Python Enhancement Proposals; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c3,,Generic Alias Type}.

@end deffn

@node Aliases to types in collections,Aliases to other concrete types,Aliases to built-in types,Deprecated aliases
@anchor{library/typing aliases-to-types-in-collections}@anchor{4884}@anchor{library/typing corresponding-to-types-in-collections}@anchor{4885}
@subsubsection Aliases to types in @code{collections}


@geindex DefaultDict (class in typing)
@anchor{library/typing typing DefaultDict}@anchor{4886}
@deffn {Class} typing.DefaultDict (collections.defaultdict, MutableMapping[KT, VT])

Deprecated alias to @ref{13c8,,collections.defaultdict}.


Added in version 3.5.2.



Deprecated since version 3.9: @ref{13c8,,collections.defaultdict} now supports subscripting (@code{[]}).
See 
@geindex Python Enhancement Proposals; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c3,,Generic Alias Type}.

@end deffn

@geindex OrderedDict (class in typing)
@anchor{library/typing typing OrderedDict}@anchor{4887}
@deffn {Class} typing.OrderedDict (collections.OrderedDict, MutableMapping[KT, VT])

Deprecated alias to @ref{7f4,,collections.OrderedDict}.


Added in version 3.7.2.



Deprecated since version 3.9: @ref{7f4,,collections.OrderedDict} now supports subscripting (@code{[]}).
See 
@geindex Python Enhancement Proposals; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c3,,Generic Alias Type}.

@end deffn

@geindex ChainMap (class in typing)
@anchor{library/typing typing ChainMap}@anchor{4888}
@deffn {Class} typing.ChainMap (collections.ChainMap, MutableMapping[KT, VT])

Deprecated alias to @ref{e1c,,collections.ChainMap}.


Added in version 3.6.1.



Deprecated since version 3.9: @ref{e1c,,collections.ChainMap} now supports subscripting (@code{[]}).
See 
@geindex Python Enhancement Proposals; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c3,,Generic Alias Type}.

@end deffn

@geindex Counter (class in typing)
@anchor{library/typing typing Counter}@anchor{4889}
@deffn {Class} typing.Counter (collections.Counter, Dict[T, int])

Deprecated alias to @ref{129d,,collections.Counter}.


Added in version 3.6.1.



Deprecated since version 3.9: @ref{129d,,collections.Counter} now supports subscripting (@code{[]}).
See 
@geindex Python Enhancement Proposals; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c3,,Generic Alias Type}.

@end deffn

@geindex Deque (class in typing)
@anchor{library/typing typing Deque}@anchor{488a}
@deffn {Class} typing.Deque (deque, MutableSequence[T])

Deprecated alias to @ref{7f5,,collections.deque}.


Added in version 3.6.1.



Deprecated since version 3.9: @ref{7f5,,collections.deque} now supports subscripting (@code{[]}).
See 
@geindex Python Enhancement Proposals; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c3,,Generic Alias Type}.

@end deffn

@node Aliases to other concrete types,Aliases to container ABCs in collections abc,Aliases to types in collections,Deprecated aliases
@anchor{library/typing aliases-to-other-concrete-types}@anchor{488b}@anchor{library/typing other-concrete-types}@anchor{488c}
@subsubsection Aliases to other concrete types


@geindex Pattern (class in typing)
@geindex Match (class in typing)
@anchor{library/typing typing Pattern}@anchor{93a}
@deffn {Class} typing.Pattern
@anchor{library/typing typing Match}@anchor{488d}
@deffnx {Class} typing.Match

Deprecated aliases corresponding to the return types from
@ref{dd4,,re.compile()} and @ref{1439,,re.match()}.

These types (and the corresponding functions) are generic over
@ref{5ac,,AnyStr}. @code{Pattern} can be specialised as @code{Pattern[str]} or
@code{Pattern[bytes]}; @code{Match} can be specialised as @code{Match[str]} or
@code{Match[bytes]}.


Deprecated since version 3.9: Classes @code{Pattern} and @code{Match} from @ref{be,,re} now support @code{[]}.
See 
@geindex Python Enhancement Proposals; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c3,,Generic Alias Type}.

@end deffn

@geindex Text (class in typing)
@anchor{library/typing typing Text}@anchor{35e}
@deffn {Class} typing.Text

Deprecated alias for @ref{16a,,str}.

@code{Text} is provided to supply a forward
compatible path for Python 2 code: in Python 2, @code{Text} is an alias for
@code{unicode}.

Use @code{Text} to indicate that a value must contain a unicode string in
a manner that is compatible with both Python 2 and Python 3:

@example
def add_unicode_checkmark(text: Text) -> Text:
    return text + u' \u2713'
@end example


Added in version 3.5.2.



Deprecated since version 3.11: Python 2 is no longer supported, and most type checkers also no longer
support type checking Python 2 code. Removal of the alias is not
currently planned, but users are encouraged to use
@ref{16a,,str} instead of @code{Text}.

@end deffn
@anchor{library/typing abstract-base-classes}@anchor{488e}
@node Aliases to container ABCs in collections abc,Aliases to asynchronous ABCs in collections abc,Aliases to other concrete types,Deprecated aliases
@anchor{library/typing aliases-to-container-abcs-in-collections-abc}@anchor{488f}@anchor{library/typing corresponding-to-collections-in-collections-abc}@anchor{4890}
@subsubsection Aliases to container ABCs in @code{collections.abc}


@geindex AbstractSet (class in typing)
@anchor{library/typing typing AbstractSet}@anchor{4891}
@deffn {Class} typing.AbstractSet (Collection[T_co])

Deprecated alias to @ref{26f1,,collections.abc.Set}.


Deprecated since version 3.9: @ref{26f1,,collections.abc.Set} now supports subscripting (@code{[]}).
See 
@geindex Python Enhancement Proposals; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c3,,Generic Alias Type}.

@end deffn

@geindex ByteString (class in typing)
@anchor{library/typing typing ByteString}@anchor{343}
@deffn {Class} typing.ByteString (Sequence[int])

Deprecated alias to @ref{340,,collections.abc.ByteString}.

Use @code{isinstance(obj, collections.abc.Buffer)} to test if @code{obj}
implements the @ref{262,,buffer protocol} at runtime. For use in
type annotations, either use @ref{341,,Buffer} or a union
that explicitly specifies the types your code supports (e.g.,
@code{bytes | bytearray | memoryview}).

@code{ByteString} was originally intended to be an abstract class that
would serve as a supertype of both @ref{193,,bytes} and @ref{342,,bytearray}.
However, since the ABC never had any methods, knowing that an object was an
instance of @code{ByteString} never actually told you anything useful
about the object. Other common buffer types such as @ref{166,,memoryview} were
also never understood as subtypes of @code{ByteString} (either at runtime
or by static type checkers).

See 
@geindex Python Enhancement Proposals; PEP 688#current-options
PEP 688@footnote{https://peps.python.org/pep-0688/#current-options} for more details.


Deprecated since version 3.9, will be removed in version 3.17.

@end deffn

@geindex Collection (class in typing)
@anchor{library/typing typing Collection}@anchor{ef5}
@deffn {Class} typing.Collection (Sized, Iterable[T_co], Container[T_co])

Deprecated alias to @ref{e8a,,collections.abc.Collection}.


Added in version 3.6.



Deprecated since version 3.9: @ref{e8a,,collections.abc.Collection} now supports subscripting (@code{[]}).
See 
@geindex Python Enhancement Proposals; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c3,,Generic Alias Type}.

@end deffn

@geindex Container (class in typing)
@anchor{library/typing typing Container}@anchor{4892}
@deffn {Class} typing.Container (Generic[T_co])

Deprecated alias to @ref{26fb,,collections.abc.Container}.


Deprecated since version 3.9: @ref{26fb,,collections.abc.Container} now supports subscripting (@code{[]}).
See 
@geindex Python Enhancement Proposals; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c3,,Generic Alias Type}.

@end deffn

@geindex ItemsView (class in typing)
@anchor{library/typing typing ItemsView}@anchor{4893}
@deffn {Class} typing.ItemsView (MappingView, AbstractSet[tuple[KT_co, VT_co]])

Deprecated alias to @ref{26ff,,collections.abc.ItemsView}.


Deprecated since version 3.9: @ref{26ff,,collections.abc.ItemsView} now supports subscripting (@code{[]}).
See 
@geindex Python Enhancement Proposals; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c3,,Generic Alias Type}.

@end deffn

@geindex KeysView (class in typing)
@anchor{library/typing typing KeysView}@anchor{4894}
@deffn {Class} typing.KeysView (MappingView, AbstractSet[KT_co])

Deprecated alias to @ref{26fe,,collections.abc.KeysView}.


Deprecated since version 3.9: @ref{26fe,,collections.abc.KeysView} now supports subscripting (@code{[]}).
See 
@geindex Python Enhancement Proposals; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c3,,Generic Alias Type}.

@end deffn

@geindex Mapping (class in typing)
@anchor{library/typing typing Mapping}@anchor{4895}
@deffn {Class} typing.Mapping (Collection[KT], Generic[KT, VT_co])

Deprecated alias to @ref{acd,,collections.abc.Mapping}.


Deprecated since version 3.9: @ref{acd,,collections.abc.Mapping} now supports subscripting (@code{[]}).
See 
@geindex Python Enhancement Proposals; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c3,,Generic Alias Type}.

@end deffn

@geindex MappingView (class in typing)
@anchor{library/typing typing MappingView}@anchor{4896}
@deffn {Class} typing.MappingView (Sized)

Deprecated alias to @ref{26fd,,collections.abc.MappingView}.


Deprecated since version 3.9: @ref{26fd,,collections.abc.MappingView} now supports subscripting (@code{[]}).
See 
@geindex Python Enhancement Proposals; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c3,,Generic Alias Type}.

@end deffn

@geindex MutableMapping (class in typing)
@anchor{library/typing typing MutableMapping}@anchor{4897}
@deffn {Class} typing.MutableMapping (Mapping[KT, VT])

Deprecated alias to @ref{12b8,,collections.abc.MutableMapping}.


Deprecated since version 3.9: @ref{12b8,,collections.abc.MutableMapping}
now supports subscripting (@code{[]}).
See 
@geindex Python Enhancement Proposals; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c3,,Generic Alias Type}.

@end deffn

@geindex MutableSequence (class in typing)
@anchor{library/typing typing MutableSequence}@anchor{4898}
@deffn {Class} typing.MutableSequence (Sequence[T])

Deprecated alias to @ref{4c0,,collections.abc.MutableSequence}.


Deprecated since version 3.9: @ref{4c0,,collections.abc.MutableSequence}
now supports subscripting (@code{[]}).
See 
@geindex Python Enhancement Proposals; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c3,,Generic Alias Type}.

@end deffn

@geindex MutableSet (class in typing)
@anchor{library/typing typing MutableSet}@anchor{4899}
@deffn {Class} typing.MutableSet (AbstractSet[T])

Deprecated alias to @ref{26fc,,collections.abc.MutableSet}.


Deprecated since version 3.9: @ref{26fc,,collections.abc.MutableSet} now supports subscripting (@code{[]}).
See 
@geindex Python Enhancement Proposals; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c3,,Generic Alias Type}.

@end deffn

@geindex Sequence (class in typing)
@anchor{library/typing typing Sequence}@anchor{489a}
@deffn {Class} typing.Sequence (Reversible[T_co], Collection[T_co])

Deprecated alias to @ref{13d0,,collections.abc.Sequence}.


Deprecated since version 3.9: @ref{13d0,,collections.abc.Sequence} now supports subscripting (@code{[]}).
See 
@geindex Python Enhancement Proposals; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c3,,Generic Alias Type}.

@end deffn

@geindex ValuesView (class in typing)
@anchor{library/typing typing ValuesView}@anchor{489b}
@deffn {Class} typing.ValuesView (MappingView, Collection[_VT_co])

Deprecated alias to @ref{2700,,collections.abc.ValuesView}.


Deprecated since version 3.9: @ref{2700,,collections.abc.ValuesView} now supports subscripting (@code{[]}).
See 
@geindex Python Enhancement Proposals; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c3,,Generic Alias Type}.

@end deffn

@node Aliases to asynchronous ABCs in collections abc,Aliases to other ABCs in collections abc,Aliases to container ABCs in collections abc,Deprecated aliases
@anchor{library/typing aliases-to-asynchronous-abcs-in-collections-abc}@anchor{489c}@anchor{library/typing asynchronous-programming}@anchor{489d}
@subsubsection Aliases to asynchronous ABCs in @code{collections.abc}


@geindex Coroutine (class in typing)
@anchor{library/typing typing Coroutine}@anchor{1d75}
@deffn {Class} typing.Coroutine (Awaitable[ReturnType], Generic[YieldType, SendType, ReturnType])

Deprecated alias to @ref{fe3,,collections.abc.Coroutine}.

See @ref{2a05,,Annotating generators and coroutines}
for details on using @ref{fe3,,collections.abc.Coroutine}
and @code{typing.Coroutine} in type annotations.


Added in version 3.5.3.



Deprecated since version 3.9: @ref{fe3,,collections.abc.Coroutine} now supports subscripting (@code{[]}).
See 
@geindex Python Enhancement Proposals; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c3,,Generic Alias Type}.

@end deffn

@geindex AsyncGenerator (class in typing)
@anchor{library/typing typing AsyncGenerator}@anchor{19e6}
@deffn {Class} typing.AsyncGenerator (AsyncIterator[YieldType], Generic[YieldType, SendType])

Deprecated alias to @ref{e8d,,collections.abc.AsyncGenerator}.

See @ref{2a05,,Annotating generators and coroutines}
for details on using @ref{e8d,,collections.abc.AsyncGenerator}
and @code{typing.AsyncGenerator} in type annotations.


Added in version 3.6.1.



Deprecated since version 3.9: @ref{e8d,,collections.abc.AsyncGenerator}
now supports subscripting (@code{[]}).
See 
@geindex Python Enhancement Proposals; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c3,,Generic Alias Type}.



Changed in version 3.13: The @code{SendType} parameter now has a default.

@end deffn

@geindex AsyncIterable (class in typing)
@anchor{library/typing typing AsyncIterable}@anchor{489e}
@deffn {Class} typing.AsyncIterable (Generic[T_co])

Deprecated alias to @ref{fe5,,collections.abc.AsyncIterable}.


Added in version 3.5.2.



Deprecated since version 3.9: @ref{fe5,,collections.abc.AsyncIterable} now supports subscripting (@code{[]}).
See 
@geindex Python Enhancement Proposals; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c3,,Generic Alias Type}.

@end deffn

@geindex AsyncIterator (class in typing)
@anchor{library/typing typing AsyncIterator}@anchor{489f}
@deffn {Class} typing.AsyncIterator (AsyncIterable[T_co])

Deprecated alias to @ref{fe4,,collections.abc.AsyncIterator}.


Added in version 3.5.2.



Deprecated since version 3.9: @ref{fe4,,collections.abc.AsyncIterator} now supports subscripting (@code{[]}).
See 
@geindex Python Enhancement Proposals; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c3,,Generic Alias Type}.

@end deffn

@geindex Awaitable (class in typing)
@anchor{library/typing typing Awaitable}@anchor{48a0}
@deffn {Class} typing.Awaitable (Generic[T_co])

Deprecated alias to @ref{fe2,,collections.abc.Awaitable}.


Added in version 3.5.2.



Deprecated since version 3.9: @ref{fe2,,collections.abc.Awaitable} now supports subscripting (@code{[]}).
See 
@geindex Python Enhancement Proposals; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c3,,Generic Alias Type}.

@end deffn

@node Aliases to other ABCs in collections abc,Aliases to contextlib ABCs,Aliases to asynchronous ABCs in collections abc,Deprecated aliases
@anchor{library/typing aliases-to-other-abcs-in-collections-abc}@anchor{48a1}@anchor{library/typing corresponding-to-other-types-in-collections-abc}@anchor{48a2}
@subsubsection Aliases to other ABCs in @code{collections.abc}


@geindex Iterable (class in typing)
@anchor{library/typing typing Iterable}@anchor{48a3}
@deffn {Class} typing.Iterable (Generic[T_co])

Deprecated alias to @ref{26f9,,collections.abc.Iterable}.


Deprecated since version 3.9: @ref{26f9,,collections.abc.Iterable} now supports subscripting (@code{[]}).
See 
@geindex Python Enhancement Proposals; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c3,,Generic Alias Type}.

@end deffn

@geindex Iterator (class in typing)
@anchor{library/typing typing Iterator}@anchor{48a4}
@deffn {Class} typing.Iterator (Iterable[T_co])

Deprecated alias to @ref{26fa,,collections.abc.Iterator}.


Deprecated since version 3.9: @ref{26fa,,collections.abc.Iterator} now supports subscripting (@code{[]}).
See 
@geindex Python Enhancement Proposals; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c3,,Generic Alias Type}.

@end deffn

@geindex Callable (in module typing)
@anchor{library/typing typing Callable}@anchor{9ce}
@deffn {Data} typing.Callable

Deprecated alias to @ref{9f1,,collections.abc.Callable}.

See @ref{271a,,Annotating callable objects} for details on how to use
@ref{9f1,,collections.abc.Callable} and @code{typing.Callable} in type annotations.


Deprecated since version 3.9: @ref{9f1,,collections.abc.Callable} now supports subscripting (@code{[]}).
See 
@geindex Python Enhancement Proposals; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c3,,Generic Alias Type}.



Changed in version 3.10: @code{Callable} now supports @ref{488,,ParamSpec} and @ref{9cd,,Concatenate}.
See 
@geindex Python Enhancement Proposals; PEP 612
PEP 612@footnote{https://peps.python.org/pep-0612/} for more details.

@end deffn

@geindex Generator (class in typing)
@anchor{library/typing typing Generator}@anchor{19e5}
@deffn {Class} typing.Generator (Iterator[YieldType], Generic[YieldType, SendType, ReturnType])

Deprecated alias to @ref{fe1,,collections.abc.Generator}.

See @ref{2a05,,Annotating generators and coroutines}
for details on using @ref{fe1,,collections.abc.Generator}
and @code{typing.Generator} in type annotations.


Deprecated since version 3.9: @ref{fe1,,collections.abc.Generator} now supports subscripting (@code{[]}).
See 
@geindex Python Enhancement Proposals; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c3,,Generic Alias Type}.



Changed in version 3.13: Default values for the send and return types were added.

@end deffn

@geindex Hashable (class in typing)
@anchor{library/typing typing Hashable}@anchor{718}
@deffn {Class} typing.Hashable

Deprecated alias to @ref{71a,,collections.abc.Hashable}.


Deprecated since version 3.12: Use @ref{71a,,collections.abc.Hashable} directly instead.

@end deffn

@geindex Reversible (class in typing)
@anchor{library/typing typing Reversible}@anchor{48a5}
@deffn {Class} typing.Reversible (Iterable[T_co])

Deprecated alias to @ref{e8b,,collections.abc.Reversible}.


Deprecated since version 3.9: @ref{e8b,,collections.abc.Reversible} now supports subscripting (@code{[]}).
See 
@geindex Python Enhancement Proposals; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c3,,Generic Alias Type}.

@end deffn

@geindex Sized (class in typing)
@anchor{library/typing typing Sized}@anchor{719}
@deffn {Class} typing.Sized

Deprecated alias to @ref{71b,,collections.abc.Sized}.


Deprecated since version 3.12: Use @ref{71b,,collections.abc.Sized} directly instead.

@end deffn

@node Aliases to contextlib ABCs,,Aliases to other ABCs in collections abc,Deprecated aliases
@anchor{library/typing aliases-to-contextlib-abcs}@anchor{48a6}@anchor{library/typing context-manager-types}@anchor{48a7}
@subsubsection Aliases to @code{contextlib} ABCs


@geindex ContextManager (class in typing)
@anchor{library/typing typing ContextManager}@anchor{e91}
@deffn {Class} typing.ContextManager (Generic[T_co, ExitT_co])

Deprecated alias to @ref{e90,,contextlib.AbstractContextManager}.

The first type parameter, @code{T_co}, represents the type returned by
the @ref{7e5,,__enter__()} method. The optional second type parameter, @code{ExitT_co},
which defaults to @code{bool | None}, represents the type returned by the
@ref{150c,,__exit__()} method.


Added in version 3.5.4.



Deprecated since version 3.9: @ref{e90,,contextlib.AbstractContextManager}
now supports subscripting (@code{[]}).
See 
@geindex Python Enhancement Proposals; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c3,,Generic Alias Type}.



Changed in version 3.13: Added the optional second type parameter, @code{ExitT_co}.

@end deffn

@geindex AsyncContextManager (class in typing)
@anchor{library/typing typing AsyncContextManager}@anchor{19e3}
@deffn {Class} typing.AsyncContextManager (Generic[T_co, AExitT_co])

Deprecated alias to @ref{d26,,contextlib.AbstractAsyncContextManager}.

The first type parameter, @code{T_co}, represents the type returned by
the @ref{2465,,__aenter__()} method. The optional second type parameter, @code{AExitT_co},
which defaults to @code{bool | None}, represents the type returned by the
@ref{19e4,,__aexit__()} method.


Added in version 3.6.2.



Deprecated since version 3.9: @ref{d26,,contextlib.AbstractAsyncContextManager}
now supports subscripting (@code{[]}).
See 
@geindex Python Enhancement Proposals; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c3,,Generic Alias Type}.



Changed in version 3.13: Added the optional second type parameter, @code{AExitT_co}.

@end deffn

@node Deprecation Timeline of Major Features,,Module contents<4>,typing — Support for type hints
@anchor{library/typing deprecation-timeline-of-major-features}@anchor{48a8}
@subsubsection Deprecation Timeline of Major Features


Certain features in @code{typing} are deprecated and may be removed in a future
version of Python. The following table summarizes major deprecations for your
convenience. This is subject to change, and not all deprecations are listed.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Feature

@tab

Deprecated in

@tab

Projected removal

@tab

PEP/issue

@item

@code{typing} versions of standard collections

@tab

3.9

@tab

Undecided (see @ref{487b,,Deprecated aliases} for more information)

@tab

@geindex Python Enhancement Proposals; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/}

@item

@ref{343,,typing.ByteString}

@tab

3.9

@tab

3.17

@tab

gh-91896@footnote{https://github.com/python/cpython/issues/91896}

@item

@ref{35e,,typing.Text}

@tab

3.11

@tab

Undecided

@tab

gh-92332@footnote{https://github.com/python/cpython/issues/92332}

@item

@ref{718,,typing.Hashable} and @ref{719,,typing.Sized}

@tab

3.12

@tab

Undecided

@tab

gh-94309@footnote{https://github.com/python/cpython/issues/94309}

@item

@ref{9d2,,typing.TypeAlias}

@tab

3.12

@tab

Undecided

@tab

@geindex Python Enhancement Proposals; PEP 695
PEP 695@footnote{https://peps.python.org/pep-0695/}

@item

@ref{331,,@@typing.no_type_check_decorator}

@tab

3.13

@tab

3.15

@tab

gh-106309@footnote{https://github.com/python/cpython/issues/106309}

@item

@ref{5ac,,typing.AnyStr}

@tab

3.13

@tab

3.18

@tab

gh-105578@footnote{https://github.com/python/cpython/issues/105578}

@end multitable


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node pydoc — Documentation generator and online help system,Python Development Mode,typing — Support for type hints,Development Tools
@anchor{library/pydoc doc}@anchor{48a9}@anchor{library/pydoc module-pydoc}@anchor{ba}@anchor{library/pydoc pydoc-documentation-generator-and-online-help-system}@anchor{48aa}@anchor{library/pydoc translation-repo}@anchor{48ab}
@subsection @code{pydoc} — Documentation generator and online help system


@geindex module; pydoc

`Source code:' Lib/pydoc.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/pydoc.py}

@geindex documentation; generation
@geindex documentation; online
@geindex help; online


__________________________________________________________________


The @code{pydoc} module automatically generates documentation from Python
modules.  The documentation can be presented as pages of text on the console,
served to a web browser, or saved to HTML files.

For modules, classes, functions and methods, the displayed documentation is
derived from the docstring (i.e. the @ref{b27,,__doc__} attribute) of the object,
and recursively of its documentable members.  If there is no docstring,
@code{pydoc} tries to obtain a description from the block of comment lines just
above the definition of the class, function or method in the source file, or at
the top of the module (see @ref{197c,,inspect.getcomments()}).

The built-in function @ref{ada,,help()} invokes the online help system in the
interactive interpreter, which uses @code{pydoc} to generate its documentation
as text on the console.  The same text documentation can also be viewed from
outside the Python interpreter by running @code{pydoc} as a script at the
operating system’s command prompt. For example, running

@example
python -m pydoc sys
@end example

at a shell prompt will display documentation on the @ref{df,,sys} module, in a
style similar to the manual pages shown by the Unix @code{man} command.  The
argument to @code{pydoc} can be the name of a function, module, or package,
or a dotted reference to a class, method, or function within a module or module
in a package.  If the argument to @code{pydoc} looks like a path (that is,
it contains the path separator for your operating system, such as a slash in
Unix), and refers to an existing Python source file, then documentation is
produced for that file.

@cartouche
@quotation Note 
In order to find objects and their documentation, @code{pydoc} imports the
module(s) to be documented.  Therefore, any code on module level will be
executed on that occasion.  Use an @code{if __name__ == '__main__':} guard to
only execute code when a file is invoked as a script and not just imported.
@end quotation
@end cartouche

When printing output to the console, @code{pydoc} attempts to paginate the
output for easier reading.  If either the 
@geindex MANPAGER
@geindex environment variable; MANPAGER
@code{MANPAGER} or the
@geindex PAGER
@geindex environment variable; PAGER
@code{PAGER} environment variable is set, @code{pydoc} will use its
value as a pagination program. When both are set, 
@geindex MANPAGER
@geindex environment variable; MANPAGER
@code{MANPAGER} is used.

Specifying a @code{-w} flag before the argument will cause HTML documentation
to be written out to a file in the current directory, instead of displaying text
on the console.

Specifying a @code{-k} flag before the argument will search the synopsis
lines of all available modules for the keyword given as the argument, again in a
manner similar to the Unix @code{man} command.  The synopsis line of a
module is the first line of its documentation string.

You can also use @code{pydoc} to start an HTTP server on the local machine
that will serve documentation to visiting web browsers.  @code{python -m pydoc -p 1234}
will start a HTTP server on port 1234, allowing you to browse the
documentation at @code{http://localhost:1234/} in your preferred web browser.
Specifying @code{0} as the port number will select an arbitrary unused port.

@cartouche
@quotation Warning 
The @code{pydoc} HTTP server is intended for local use during
development and is not suitable for production use.
@end quotation
@end cartouche

@code{python -m pydoc -n <hostname>} will start the server listening at the given
hostname.  By default the hostname is ‘localhost’ but if you want the server to
be reached from other machines, you may want to change the host name that the
server responds to.  During development this is especially useful if you want
to run pydoc from within a container.

@code{python -m pydoc -b} will start the server and additionally open a web
browser to a module index page.  Each served page has a navigation bar at the
top where you can `Get' help on an individual item, `Search' all modules with a
keyword in their synopsis line, and go to the `Module index', `Topics' and
`Keywords' pages.

When @code{pydoc} generates documentation, it uses the current environment
and path to locate modules.  Thus, invoking @code{pydoc spam}
documents precisely the version of the module you would get if you started the
Python interpreter and typed @code{import spam}.

Module docs for core modules are assumed to reside in
@code{https://docs.python.org/X.Y/library/} where @code{X} and @code{Y} are the
major and minor version numbers of the Python interpreter.  This can
be overridden by setting the @code{PYTHONDOCS} environment variable
to a different URL or to a local directory containing the Library
Reference Manual pages.


Changed in version 3.2: Added the @code{-b} option.



Changed in version 3.3: The @code{-g} command line option was removed.



Changed in version 3.4: @code{pydoc} now uses @ref{231,,inspect.signature()} rather than
@ref{946,,inspect.getfullargspec()} to extract signature information from
callables.



Changed in version 3.7: Added the @code{-n} option.


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Python Development Mode,doctest — Test interactive Python examples,pydoc — Documentation generator and online help system,Development Tools
@anchor{library/devmode doc}@anchor{48ac}@anchor{library/devmode devmode}@anchor{509}@anchor{library/devmode python-development-mode}@anchor{48ad}@anchor{library/devmode translation-repo}@anchor{48ae}
@subsection Python Development Mode



Added in version 3.7.


The Python Development Mode introduces additional runtime checks that are too
expensive to be enabled by default. It should not be more verbose than the
default if the code is correct; new warnings are only emitted when an issue is
detected.

It can be enabled using the @ref{170,,-X dev} command line option or by
setting the 
@geindex PYTHONDEVMODE
@geindex environment variable; PYTHONDEVMODE
@ref{ced,,PYTHONDEVMODE} environment variable to @code{1}.

See also @ref{50a,,Python debug build}.

@menu
* Effects of the Python Development Mode:: 
* ResourceWarning Example:: 
* Bad file descriptor error example:: 

@end menu

@node Effects of the Python Development Mode,ResourceWarning Example,,Python Development Mode
@anchor{library/devmode effects-of-the-python-development-mode}@anchor{48af}
@subsubsection Effects of the Python Development Mode


Enabling the Python Development Mode is similar to the following command, but
with additional effects described below:

@example
PYTHONMALLOC=debug PYTHONASYNCIODEBUG=1 python -W default -X faulthandler
@end example

Effects of the Python Development Mode:


@itemize *

@item 
Add @code{default} @ref{216d,,warning filter}. The
following warnings are shown:


@itemize *

@item 
@ref{1a4,,DeprecationWarning}

@item 
@ref{71f,,ImportWarning}

@item 
@ref{acc,,PendingDeprecationWarning}

@item 
@ref{54d,,ResourceWarning}
@end itemize

Normally, the above warnings are filtered by the default @ref{216d,,warning filters}.

It behaves as if the @ref{acb,,-W default} command line option is used.

Use the @ref{acb,,-W error} command line option or set the
@geindex PYTHONWARNINGS
@geindex environment variable; PYTHONWARNINGS
@ref{da9,,PYTHONWARNINGS} environment variable to @code{error} to treat warnings
as errors.

@item 
Install debug hooks on memory allocators to check for:


@itemize *

@item 
Buffer underflow

@item 
Buffer overflow

@item 
Memory allocator API violation

@item 
Unsafe usage of the GIL
@end itemize

See the @ref{e6a,,PyMem_SetupDebugHooks()} C function.

It behaves as if the 
@geindex PYTHONMALLOC
@geindex environment variable; PYTHONMALLOC
@ref{e64,,PYTHONMALLOC} environment variable is set to
@code{debug}.

To enable the Python Development Mode without installing debug hooks on
memory allocators, set the 
@geindex PYTHONMALLOC
@geindex environment variable; PYTHONMALLOC
@ref{e64,,PYTHONMALLOC} environment variable to
@code{default}.

@item 
Call @ref{211,,faulthandler.enable()} at Python startup to install handlers for
the @ref{1286,,SIGSEGV}, @ref{1287,,SIGFPE},
@ref{1288,,SIGABRT}, @ref{1289,,SIGBUS} and
@ref{128a,,SIGILL} signals to dump the Python traceback on a crash.

It behaves as if the @ref{170,,-X faulthandler} command line option is
used or if the 
@geindex PYTHONFAULTHANDLER
@geindex environment variable; PYTHONFAULTHANDLER
@ref{128b,,PYTHONFAULTHANDLER} environment variable is set to
@code{1}.

@item 
Enable @ref{217d,,asyncio debug mode}. For example,
@ref{b,,asyncio} checks for coroutines that were not awaited and logs them.

It behaves as if the 
@geindex PYTHONASYNCIODEBUG
@geindex environment variable; PYTHONASYNCIODEBUG
@ref{217c,,PYTHONASYNCIODEBUG} environment variable is set
to @code{1}.

@item 
Check the `encoding' and `errors' arguments for string encoding and decoding
operations. Examples: @ref{318,,open()}, @ref{ad8,,str.encode()} and
@ref{ad9,,bytes.decode()}.

By default, for best performance, the `errors' argument is only checked at
the first encoding/decoding error and the `encoding' argument is sometimes
ignored for empty strings.

@item 
The @ref{506,,io.IOBase} destructor logs @code{close()} exceptions.

@item 
Set the @ref{1ec4,,dev_mode} attribute of @ref{89e,,sys.flags} to
@code{True}.
@end itemize

The Python Development Mode does not enable the @ref{106,,tracemalloc} module by
default, because the overhead cost (to performance and memory) would be too
large. Enabling the @code{tracemalloc} module provides additional information
on the origin of some errors. For example, @ref{54d,,ResourceWarning} logs the
traceback where the resource was allocated, and a buffer overflow error logs
the traceback where the memory block was allocated.

The Python Development Mode does not prevent the @ref{18d,,-O} command line
option from removing @ref{b66,,assert} statements nor from setting
@ref{9e0,,__debug__} to @code{False}.

The Python Development Mode can only be enabled at the Python startup. Its
value can be read from @ref{89e,,sys.flags.dev_mode}.


Changed in version 3.8: The @ref{506,,io.IOBase} destructor now logs @code{close()} exceptions.



Changed in version 3.9: The `encoding' and `errors' arguments are now checked for string encoding
and decoding operations.


@node ResourceWarning Example,Bad file descriptor error example,Effects of the Python Development Mode,Python Development Mode
@anchor{library/devmode resourcewarning-example}@anchor{48b0}
@subsubsection ResourceWarning Example


Example of a script counting the number of lines of the text file specified in
the command line:

@example
import sys

def main():
    fp = open(sys.argv[1])
    nlines = len(fp.readlines())
    print(nlines)
    # The file is closed implicitly

if __name__ == "__main__":
    main()
@end example

The script does not close the file explicitly. By default, Python does not emit
any warning. Example using README.txt, which has 269 lines:

@example
$ python script.py README.txt
269
@end example

Enabling the Python Development Mode displays a @ref{54d,,ResourceWarning} warning:

@example
$ python -X dev script.py README.txt
269
script.py:10: ResourceWarning: unclosed file <_io.TextIOWrapper name='README.rst' mode='r' encoding='UTF-8'>
  main()
ResourceWarning: Enable tracemalloc to get the object allocation traceback
@end example

In addition, enabling @ref{106,,tracemalloc} shows the line where the file was
opened:

@example
$ python -X dev -X tracemalloc=5 script.py README.rst
269
script.py:10: ResourceWarning: unclosed file <_io.TextIOWrapper name='README.rst' mode='r' encoding='UTF-8'>
  main()
Object allocated at (most recent call last):
  File "script.py", lineno 10
    main()
  File "script.py", lineno 4
    fp = open(sys.argv[1])
@end example

The fix is to close explicitly the file. Example using a context manager:

@example
def main():
    # Close the file explicitly when exiting the with block
    with open(sys.argv[1]) as fp:
        nlines = len(fp.readlines())
    print(nlines)
@end example

Not closing a resource explicitly can leave a resource open for way longer than
expected; it can cause severe issues upon exiting Python. It is bad in
CPython, but it is even worse in PyPy. Closing resources explicitly makes an
application more deterministic and more reliable.

@node Bad file descriptor error example,,ResourceWarning Example,Python Development Mode
@anchor{library/devmode bad-file-descriptor-error-example}@anchor{48b1}
@subsubsection Bad file descriptor error example


Script displaying the first line of itself:

@example
import os

def main():
    fp = open(__file__)
    firstline = fp.readline()
    print(firstline.rstrip())
    os.close(fp.fileno())
    # The file is closed implicitly

main()
@end example

By default, Python does not emit any warning:

@example
$ python script.py
import os
@end example

The Python Development Mode shows a @ref{54d,,ResourceWarning} and logs a “Bad file
descriptor” error when finalizing the file object:

@example
$ python -X dev script.py
import os
script.py:10: ResourceWarning: unclosed file <_io.TextIOWrapper name='script.py' mode='r' encoding='UTF-8'>
  main()
ResourceWarning: Enable tracemalloc to get the object allocation traceback
Exception ignored in: <_io.TextIOWrapper name='script.py' mode='r' encoding='UTF-8'>
Traceback (most recent call last):
  File "script.py", line 10, in <module>
    main()
OSError: [Errno 9] Bad file descriptor
@end example

@code{os.close(fp.fileno())} closes the file descriptor. When the file object
finalizer tries to close the file descriptor again, it fails with the @code{Bad
file descriptor} error. A file descriptor must be closed only once. In the
worst case scenario, closing it twice can lead to a crash (see bpo-18748@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18748}
for an example).

The fix is to remove the @code{os.close(fp.fileno())} line, or open the file with
@code{closefd=False}.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node doctest — Test interactive Python examples,unittest — Unit testing framework,Python Development Mode,Development Tools
@anchor{library/doctest doc}@anchor{48b2}@anchor{library/doctest doctest-test-interactive-python-examples}@anchor{48b3}@anchor{library/doctest module-doctest}@anchor{3e}@anchor{library/doctest translation-repo}@anchor{48b4}
@subsection @code{doctest} — Test interactive Python examples


@geindex module; doctest

`Source code:' Lib/doctest.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/doctest.py}


__________________________________________________________________


The @code{doctest} module searches for pieces of text that look like interactive
Python sessions, and then executes those sessions to verify that they work
exactly as shown.  There are several common ways to use doctest:


@itemize *

@item 
To check that a module’s docstrings are up-to-date by verifying that all
interactive examples still work as documented.

@item 
To perform regression testing by verifying that interactive examples from a
test file or a test object work as expected.

@item 
To write tutorial documentation for a package, liberally illustrated with
input-output examples.  Depending on whether the examples or the expository text
are emphasized, this has the flavor of “literate testing” or “executable
documentation”.
@end itemize

Here’s a complete but small example module:

@example
"""
This is the "example" module.

The example module supplies one function, factorial().  For example,

>>> factorial(5)
120
"""

def factorial(n):
    """Return the factorial of n, an exact integer >= 0.

    >>> [factorial(n) for n in range(6)]
    [1, 1, 2, 6, 24, 120]
    >>> factorial(30)
    265252859812191058636308480000000
    >>> factorial(-1)
    Traceback (most recent call last):
        ...
    ValueError: n must be >= 0

    Factorials of floats are OK, but the float must be an exact integer:
    >>> factorial(30.1)
    Traceback (most recent call last):
        ...
    ValueError: n must be exact integer
    >>> factorial(30.0)
    265252859812191058636308480000000

    It must also not be ridiculously large:
    >>> factorial(1e100)
    Traceback (most recent call last):
        ...
    OverflowError: n too large
    """

    import math
    if not n >= 0:
        raise ValueError("n must be >= 0")
    if math.floor(n) != n:
        raise ValueError("n must be exact integer")
    if n+1 == n:  # catch a value like 1e300
        raise OverflowError("n too large")
    result = 1
    factor = 2
    while factor <= n:
        result *= factor
        factor += 1
    return result


if __name__ == "__main__":
    import doctest
    doctest.testmod()
@end example

If you run @code{example.py} directly from the command line, @code{doctest}
works its magic:

@example
$ python example.py
$
@end example

There’s no output!  That’s normal, and it means all the examples worked.  Pass
@code{-v} to the script, and @code{doctest} prints a detailed log of what
it’s trying, and prints a summary at the end:

@example
$ python example.py -v
Trying:
    factorial(5)
Expecting:
    120
ok
Trying:
    [factorial(n) for n in range(6)]
Expecting:
    [1, 1, 2, 6, 24, 120]
ok
@end example

And so on, eventually ending with:

@example
Trying:
    factorial(1e100)
Expecting:
    Traceback (most recent call last):
        ...
    OverflowError: n too large
ok
2 items passed all tests:
   1 test in __main__
   6 tests in __main__.factorial
7 tests in 2 items.
7 passed.
Test passed.
$
@end example

That’s all you need to know to start making productive use of @code{doctest}!
Jump in.  The following sections provide full details.  Note that there are many
examples of doctests in the standard Python test suite and libraries.
Especially useful examples can be found in the standard test file
@code{Lib/test/test_doctest/test_doctest.py}.


Added in version 3.13: Output is colorized by default and can be
@ref{1b9,,controlled using environment variables}.


@menu
* Simple Usage; Checking Examples in Docstrings: Simple Usage Checking Examples in Docstrings. 
* Simple Usage; Checking Examples in a Text File: Simple Usage Checking Examples in a Text File. 
* Command-line Usage:: 
* How It Works:: 
* Basic API:: 
* Unittest API:: 
* Advanced API:: 
* Debugging:: 
* Soapbox:: 

@end menu

@node Simple Usage Checking Examples in Docstrings,Simple Usage Checking Examples in a Text File,,doctest — Test interactive Python examples
@anchor{library/doctest doctest-simple-testmod}@anchor{48b5}@anchor{library/doctest simple-usage-checking-examples-in-docstrings}@anchor{48b6}
@subsubsection Simple Usage: Checking Examples in Docstrings


The simplest way to start using doctest (but not necessarily the way you’ll
continue to do it) is to end each module @code{M} with:

@example
if __name__ == "__main__":
    import doctest
    doctest.testmod()
@end example

@code{doctest} then examines docstrings in module @code{M}.

Running the module as a script causes the examples in the docstrings to get
executed and verified:

@example
python M.py
@end example

This won’t display anything unless an example fails, in which case the failing
example(s) and the cause(s) of the failure(s) are printed to stdout, and the
final line of output is @code{***Test Failed*** N failures.}, where `N' is the
number of examples that failed.

Run it with the @code{-v} switch instead:

@example
python M.py -v
@end example

and a detailed report of all examples tried is printed to standard output, along
with assorted summaries at the end.

You can force verbose mode by passing @code{verbose=True} to @ref{1679,,testmod()}, or
prohibit it by passing @code{verbose=False}.  In either of those cases,
@ref{1470,,sys.argv} is not examined by @code{testmod()} (so passing @code{-v} or not
has no effect).

There is also a command line shortcut for running @ref{1679,,testmod()}, see section
@ref{48b7,,Command-line Usage}.

For more information on @ref{1679,,testmod()}, see section @ref{48b8,,Basic API}.

@node Simple Usage Checking Examples in a Text File,Command-line Usage,Simple Usage Checking Examples in Docstrings,doctest — Test interactive Python examples
@anchor{library/doctest doctest-simple-testfile}@anchor{48b9}@anchor{library/doctest simple-usage-checking-examples-in-a-text-file}@anchor{48ba}
@subsubsection Simple Usage: Checking Examples in a Text File


Another simple application of doctest is testing interactive examples in a text
file.  This can be done with the @ref{48bb,,testfile()} function:

@example
import doctest
doctest.testfile("example.txt")
@end example

That short script executes and verifies any interactive Python examples
contained in the file @code{example.txt}.  The file content is treated as if it
were a single giant docstring; the file doesn’t need to contain a Python
program!   For example, perhaps @code{example.txt} contains this:

@example
The `@w{`}example`@w{`} module
======================

Using `@w{`}factorial`@w{`}
-------------------

This is an example text file in reStructuredText format.  First import
`@w{`}factorial`@w{`} from the `@w{`}example`@w{`} module:

    >>> from example import factorial

Now use it:

    >>> factorial(6)
    120
@end example

Running @code{doctest.testfile("example.txt")} then finds the error in this
documentation:

@example
File "./example.txt", line 14, in example.txt
Failed example:
    factorial(6)
Expected:
    120
Got:
    720
@end example

As with @ref{1679,,testmod()}, @ref{48bb,,testfile()} won’t display anything unless an
example fails.  If an example does fail, then the failing example(s) and the
cause(s) of the failure(s) are printed to stdout, using the same format as
@code{testmod()}.

By default, @ref{48bb,,testfile()} looks for files in the calling module’s directory.
See section @ref{48b8,,Basic API} for a description of the optional arguments
that can be used to tell it to look for files in other locations.

Like @ref{1679,,testmod()}, @ref{48bb,,testfile()}’s verbosity can be set with the
@code{-v} command-line switch or with the optional keyword argument
`verbose'.

There is also a command line shortcut for running @ref{48bb,,testfile()}, see section
@ref{48b7,,Command-line Usage}.

For more information on @ref{48bb,,testfile()}, see section @ref{48b8,,Basic API}.

@node Command-line Usage,How It Works,Simple Usage Checking Examples in a Text File,doctest — Test interactive Python examples
@anchor{library/doctest command-line-usage}@anchor{48bc}@anchor{library/doctest doctest-cli}@anchor{48b7}
@subsubsection Command-line Usage


The @code{doctest} module can be invoked as a script from the command line:

@example
python -m doctest [-v] [-o OPTION] [-f] file [file ...]
@end example

@geindex doctest command line option; -v
@geindex doctest command line option; --verbose
@anchor{library/doctest cmdoption-doctest-v}@anchor{48bd}@anchor{library/doctest cmdoption-doctest-verbose}@anchor{48be}
@deffn {Option} @w{-}v, @w{-}@w{-}verbose

Detailed report of all examples tried is printed to standard output,
along with assorted summaries at the end:

@example
python -m doctest -v example.py
@end example

This will import @code{example.py} as a standalone module and run
@ref{1679,,testmod()} on it. Note that this may not work correctly if the
file is part of a package and imports other submodules from that package.

If the file name does not end with @code{.py}, @code{doctest} infers
that it must be run with @ref{48bb,,testfile()} instead:

@example
python -m doctest -v example.txt
@end example
@end deffn

@geindex doctest command line option; -o
@geindex doctest command line option; --option
@anchor{library/doctest cmdoption-doctest-o}@anchor{48bf}@anchor{library/doctest cmdoption-doctest-option}@anchor{48c0}
@deffn {Option} @w{-}o, @w{-}@w{-}option <option>

Option flags control various aspects of doctest’s behavior, see section
@ref{1139,,Option Flags}.


Added in version 3.4.

@end deffn

@geindex doctest command line option; -f
@geindex doctest command line option; --fail-fast
@anchor{library/doctest cmdoption-doctest-f}@anchor{48c1}@anchor{library/doctest cmdoption-doctest-fail-fast}@anchor{48c2}
@deffn {Option} @w{-}f, @w{-}@w{-}fail@w{-}fast

This is shorthand for @code{-o FAIL_FAST}.


Added in version 3.4.

@end deffn

@node How It Works,Basic API,Command-line Usage,doctest — Test interactive Python examples
@anchor{library/doctest doctest-how-it-works}@anchor{48c3}@anchor{library/doctest how-it-works}@anchor{48c4}
@subsubsection How It Works


This section examines in detail how doctest works: which docstrings it looks at,
how it finds interactive examples, what execution context it uses, how it
handles exceptions, and how option flags can be used to control its behavior.
This is the information that you need to know to write doctest examples; for
information about actually running doctest on these examples, see the following
sections.

@menu
* Which Docstrings Are Examined?:: 
* How are Docstring Examples Recognized?:: 
* What’s the Execution Context?:: 
* What About Exceptions?:: 
* Option Flags:: 
* Directives:: 
* Warnings: Warnings<2>. 

@end menu

@node Which Docstrings Are Examined?,How are Docstring Examples Recognized?,,How It Works
@anchor{library/doctest doctest-which-docstrings}@anchor{48c5}@anchor{library/doctest which-docstrings-are-examined}@anchor{48c6}
@subsubsection Which Docstrings Are Examined?


The module docstring, and all function, class and method docstrings are
searched.  Objects imported into the module are not searched.

@geindex __test__ (module attribute)
@anchor{library/doctest module __test__}@anchor{48c7}
In addition, there are cases when you want tests to be part of a module but not part
of the help text, which requires that the tests not be included in the docstring.
Doctest looks for a module-level variable called @code{__test__} and uses it to locate other
tests. If @code{M.__test__} exists, it must be a dict, and each
entry maps a (string) name to a function object, class object, or string.
Function and class object docstrings found from @code{M.__test__} are searched, and
strings are treated as if they were docstrings.  In output, a key @code{K} in
@code{M.__test__} appears with name @code{M.__test__.K}.

For example, place this block of code at the top of @code{example.py}:

@example
__test__ = @{
    'numbers': """
>>> factorial(6)
720

>>> [factorial(n) for n in range(6)]
[1, 1, 2, 6, 24, 120]
"""
@}
@end example

The value of @code{example.__test__["numbers"]} will be treated as a
docstring and all the tests inside it will be run. It is
important to note that the value can be mapped to a function,
class object, or module; if so, @code{doctest}
searches them recursively for docstrings, which are then scanned for tests.

Any classes found are recursively searched similarly, to test docstrings in
their contained methods and nested classes.

@cartouche
@quotation Note 
@code{doctest} can only automatically discover classes and functions that are
defined at the module level or inside other classes.

Since nested classes and functions only exist when an outer function
is called, they cannot be discovered. Define them outside to make them visible.
@end quotation
@end cartouche

@node How are Docstring Examples Recognized?,What’s the Execution Context?,Which Docstrings Are Examined?,How It Works
@anchor{library/doctest doctest-finding-examples}@anchor{48c8}@anchor{library/doctest how-are-docstring-examples-recognized}@anchor{48c9}
@subsubsection How are Docstring Examples Recognized?


In most cases a copy-and-paste of an interactive console session works fine,
but doctest isn’t trying to do an exact emulation of any specific Python shell.

@example
>>> # comments are ignored
>>> x = 12
>>> x
12
>>> if x == 13:
...     print("yes")
... else:
...     print("no")
...     print("NO")
...     print("NO!!!")
...
no
NO
NO!!!
>>>
@end example

@geindex >>>; interpreter prompt
@geindex ...; interpreter prompt

Any expected output must immediately follow the final @code{'>>> '} or @code{'... '}
line containing the code, and the expected output (if any) extends to the next
@code{'>>> '} or all-whitespace line.

The fine print:


@itemize *

@item 
Expected output cannot contain an all-whitespace line, since such a line is
taken to signal the end of expected output.  If expected output does contain a
blank line, put @code{<BLANKLINE>} in your doctest example each place a blank line
is expected.

@item 
All hard tab characters are expanded to spaces, using 8-column tab stops.
Tabs in output generated by the tested code are not modified.  Because any
hard tabs in the sample output `are' expanded, this means that if the code
output includes hard tabs, the only way the doctest can pass is if the
@ref{48ca,,NORMALIZE_WHITESPACE} option or @ref{48cb,,directive}
is in effect.
Alternatively, the test can be rewritten to capture the output and compare it
to an expected value as part of the test.  This handling of tabs in the
source was arrived at through trial and error, and has proven to be the least
error prone way of handling them.  It is possible to use a different
algorithm for handling tabs by writing a custom @ref{48cc,,DocTestParser} class.

@item 
Output to stdout is captured, but not output to stderr (exception tracebacks
are captured via a different means).

@item 
If you continue a line via backslashing in an interactive session, or for any
other reason use a backslash, you should use a raw docstring, which will
preserve your backslashes exactly as you type them:

@example
>>> def f(x):
...     r'@w{'}'Backslashes in a raw docstring: m\n'@w{'}'
...
>>> print(f.__doc__)
Backslashes in a raw docstring: m\n
@end example

Otherwise, the backslash will be interpreted as part of the string. For example,
the @code{\n} above would be interpreted as a newline character.  Alternatively, you
can double each backslash in the doctest version (and not use a raw string):

@example
>>> def f(x):
...     '@w{'}'Backslashes in a raw docstring: m\\n'@w{'}'
...
>>> print(f.__doc__)
Backslashes in a raw docstring: m\n
@end example

@item 
The starting column doesn’t matter:

@example
>>> assert "Easy!"
      >>> import math
          >>> math.floor(1.9)
          1
@end example

and as many leading whitespace characters are stripped from the expected output
as appeared in the initial @code{'>>> '} line that started the example.
@end itemize

@node What’s the Execution Context?,What About Exceptions?,How are Docstring Examples Recognized?,How It Works
@anchor{library/doctest doctest-execution-context}@anchor{48cd}@anchor{library/doctest what-s-the-execution-context}@anchor{48ce}
@subsubsection What’s the Execution Context?


By default, each time @code{doctest} finds a docstring to test, it uses a
`shallow copy' of @code{M}’s globals, so that running tests doesn’t change the
module’s real globals, and so that one test in @code{M} can’t leave behind
crumbs that accidentally allow another test to work.  This means examples can
freely use any names defined at top-level in @code{M}, and names defined earlier
in the docstring being run. Examples cannot see names defined in other
docstrings.

You can force use of your own dict as the execution context by passing
@code{globs=your_dict} to @ref{1679,,testmod()} or @ref{48bb,,testfile()} instead.

@node What About Exceptions?,Option Flags,What’s the Execution Context?,How It Works
@anchor{library/doctest doctest-exceptions}@anchor{48cf}@anchor{library/doctest what-about-exceptions}@anchor{48d0}
@subsubsection What About Exceptions?


No problem, provided that the traceback is the only output produced by the
example:  just paste in the traceback. @footnote{
Examples containing both expected output and an exception are not supported.
Trying to guess where one ends and the other begins is too error-prone, and that
also makes for a confusing test.
} Since tracebacks contain details
that are likely to change rapidly (for example, exact file paths and line
numbers), this is one case where doctest works hard to be flexible in what it
accepts.

Simple example:

@example
>>> [1, 2, 3].remove(42)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: list.remove(x): x not in list
@end example

That doctest succeeds if @ref{2ee,,ValueError} is raised, with the @code{list.remove(x):
x not in list} detail as shown.

The expected output for an exception must start with a traceback header, which
may be either of the following two lines, indented the same as the first line of
the example:

@example
Traceback (most recent call last):
Traceback (innermost last):
@end example

The traceback header is followed by an optional traceback stack, whose contents
are ignored by doctest.  The traceback stack is typically omitted, or copied
verbatim from an interactive session.

The traceback stack is followed by the most interesting part: the line(s)
containing the exception type and detail.  This is usually the last line of a
traceback, but can extend across multiple lines if the exception has a
multi-line detail:

@example
>>> raise ValueError('multi\n    line\ndetail')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: multi
    line
detail
@end example

The last three lines (starting with @ref{2ee,,ValueError}) are compared against the
exception’s type and detail, and the rest are ignored.

Best practice is to omit the traceback stack, unless it adds significant
documentation value to the example.  So the last example is probably better as:

@example
>>> raise ValueError('multi\n    line\ndetail')
Traceback (most recent call last):
    ...
ValueError: multi
    line
detail
@end example

Note that tracebacks are treated very specially.  In particular, in the
rewritten example, the use of @code{...} is independent of doctest’s
@ref{167a,,ELLIPSIS} option.  The ellipsis in that example could be left out, or
could just as well be three (or three hundred) commas or digits, or an indented
transcript of a Monty Python skit.

Some details you should read once, but won’t need to remember:


@itemize *

@item 
Doctest can’t guess whether your expected output came from an exception
traceback or from ordinary printing.  So, e.g., an example that expects
@code{ValueError: 42 is prime} will pass whether @ref{2ee,,ValueError} is actually
raised or if the example merely prints that traceback text.  In practice,
ordinary output rarely begins with a traceback header line, so this doesn’t
create real problems.

@item 
Each line of the traceback stack (if present) must be indented further than
the first line of the example, `or' start with a non-alphanumeric character.
The first line following the traceback header indented the same and starting
with an alphanumeric is taken to be the start of the exception detail.  Of
course this does the right thing for genuine tracebacks.

@item 
When the @ref{1514,,IGNORE_EXCEPTION_DETAIL} doctest option is specified,
everything following the leftmost colon and any module information in the
exception name is ignored.

@item 
The interactive shell omits the traceback header line for some
@ref{18f,,SyntaxError}s.  But doctest uses the traceback header line to
distinguish exceptions from non-exceptions.  So in the rare case where you need
to test a @code{SyntaxError} that omits the traceback header, you will need to
manually add the traceback header line to your test example.
@end itemize

@geindex ^ (caret); marker


@itemize *

@item 
For some exceptions, Python displays the position of the error using @code{^}
markers and tildes:

@example
>>> 1 + None
  File "<stdin>", line 1
    1 + None
    ~~^~~~~~
TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'
@end example

Since the lines showing the position of the error come before the exception type
and detail, they are not checked by doctest.  For example, the following test
would pass, even though it puts the @code{^} marker in the wrong location:

@example
>>> 1 + None
  File "<stdin>", line 1
    1 + None
    ^~~~~~~~
TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'
@end example
@end itemize
@anchor{library/doctest option-flags-and-directives}@anchor{48d1}
@node Option Flags,Directives,What About Exceptions?,How It Works
@anchor{library/doctest doctest-options}@anchor{1139}@anchor{library/doctest option-flags}@anchor{48d2}
@subsubsection Option Flags


A number of option flags control various aspects of doctest’s behavior.
Symbolic names for the flags are supplied as module constants, which can be
@ref{2514,,bitwise ORed} together and passed to various functions.
The names can also be used in @ref{48cb,,doctest directives},
and may be passed to the doctest command line interface via the @code{-o} option.

The first group of options define test semantics, controlling aspects of how
doctest decides whether actual output matches an example’s expected output:

@geindex DONT_ACCEPT_TRUE_FOR_1 (in module doctest)
@anchor{library/doctest doctest DONT_ACCEPT_TRUE_FOR_1}@anchor{48d3}
@deffn {Data} doctest.DONT_ACCEPT_TRUE_FOR_1

By default, if an expected output block contains just @code{1}, an actual output
block containing just @code{1} or just @code{True} is considered to be a match, and
similarly for @code{0} versus @code{False}.  When @ref{48d3,,DONT_ACCEPT_TRUE_FOR_1} is
specified, neither substitution is allowed.  The default behavior caters to that
Python changed the return type of many functions from integer to boolean;
doctests expecting “little integer” output still work in these cases.  This
option will probably go away, but not for several years.
@end deffn

@geindex <BLANKLINE>

@geindex DONT_ACCEPT_BLANKLINE (in module doctest)
@anchor{library/doctest doctest DONT_ACCEPT_BLANKLINE}@anchor{48d4}
@deffn {Data} doctest.DONT_ACCEPT_BLANKLINE

By default, if an expected output block contains a line containing only the
string @code{<BLANKLINE>}, then that line will match a blank line in the actual
output.  Because a genuinely blank line delimits the expected output, this is
the only way to communicate that a blank line is expected.  When
@ref{48d4,,DONT_ACCEPT_BLANKLINE} is specified, this substitution is not allowed.
@end deffn

@geindex NORMALIZE_WHITESPACE (in module doctest)
@anchor{library/doctest doctest NORMALIZE_WHITESPACE}@anchor{48ca}
@deffn {Data} doctest.NORMALIZE_WHITESPACE

When specified, all sequences of whitespace (blanks and newlines) are treated as
equal.  Any sequence of whitespace within the expected output will match any
sequence of whitespace within the actual output. By default, whitespace must
match exactly. @ref{48ca,,NORMALIZE_WHITESPACE} is especially useful when a line of
expected output is very long, and you want to wrap it across multiple lines in
your source.
@end deffn

@geindex ...; in doctests

@geindex ELLIPSIS (in module doctest)
@anchor{library/doctest doctest ELLIPSIS}@anchor{167a}
@deffn {Data} doctest.ELLIPSIS

When specified, an ellipsis marker (@code{...}) in the expected output can match
any substring in the actual output.  This includes substrings that span line
boundaries, and empty substrings, so it’s best to keep usage of this simple.
Complicated uses can lead to the same kinds of “oops, it matched too much!”
surprises that @code{.*} is prone to in regular expressions.
@end deffn

@geindex IGNORE_EXCEPTION_DETAIL (in module doctest)
@anchor{library/doctest doctest IGNORE_EXCEPTION_DETAIL}@anchor{1514}
@deffn {Data} doctest.IGNORE_EXCEPTION_DETAIL

When specified, doctests expecting exceptions pass so long as an exception
of the expected type is raised, even if the details
(message and fully qualified exception name) don’t match.

For example, an example expecting @code{ValueError: 42} will pass if the actual
exception raised is @code{ValueError: 3*14}, but will fail if, say, a
@ref{199,,TypeError} is raised instead.
It will also ignore any fully qualified name included before the
exception class, which can vary between implementations and versions
of Python and the code/libraries in use.
Hence, all three of these variations will work with the flag specified:

@example
>>> raise Exception('message')
Traceback (most recent call last):
Exception: message

>>> raise Exception('message')
Traceback (most recent call last):
builtins.Exception: message

>>> raise Exception('message')
Traceback (most recent call last):
__main__.Exception: message
@end example

Note that @ref{167a,,ELLIPSIS} can also be used to ignore the
details of the exception message, but such a test may still fail based
on whether the module name is present or matches exactly.


Changed in version 3.2: @ref{1514,,IGNORE_EXCEPTION_DETAIL} now also ignores any information relating
to the module containing the exception under test.

@end deffn

@geindex SKIP (in module doctest)
@anchor{library/doctest doctest SKIP}@anchor{48d5}
@deffn {Data} doctest.SKIP

When specified, do not run the example at all.  This can be useful in contexts
where doctest examples serve as both documentation and test cases, and an
example should be included for documentation purposes, but should not be
checked.  E.g., the example’s output might be random; or the example might
depend on resources which would be unavailable to the test driver.

The SKIP flag can also be used for temporarily “commenting out” examples.
@end deffn

@geindex COMPARISON_FLAGS (in module doctest)
@anchor{library/doctest doctest COMPARISON_FLAGS}@anchor{48d6}
@deffn {Data} doctest.COMPARISON_FLAGS

A bitmask or’ing together all the comparison flags above.
@end deffn

The second group of options controls how test failures are reported:

@geindex REPORT_UDIFF (in module doctest)
@anchor{library/doctest doctest REPORT_UDIFF}@anchor{167b}
@deffn {Data} doctest.REPORT_UDIFF

When specified, failures that involve multi-line expected and actual outputs are
displayed using a unified diff.
@end deffn

@geindex REPORT_CDIFF (in module doctest)
@anchor{library/doctest doctest REPORT_CDIFF}@anchor{167c}
@deffn {Data} doctest.REPORT_CDIFF

When specified, failures that involve multi-line expected and actual outputs
will be displayed using a context diff.
@end deffn

@geindex REPORT_NDIFF (in module doctest)
@anchor{library/doctest doctest REPORT_NDIFF}@anchor{167d}
@deffn {Data} doctest.REPORT_NDIFF

When specified, differences are computed by @code{difflib.Differ}, using the same
algorithm as the popular @code{ndiff.py} utility. This is the only method that
marks differences within lines as well as across lines.  For example, if a line
of expected output contains digit @code{1} where actual output contains letter
@code{l}, a line is inserted with a caret marking the mismatching column positions.
@end deffn

@geindex REPORT_ONLY_FIRST_FAILURE (in module doctest)
@anchor{library/doctest doctest REPORT_ONLY_FIRST_FAILURE}@anchor{48d7}
@deffn {Data} doctest.REPORT_ONLY_FIRST_FAILURE

When specified, display the first failing example in each doctest, but suppress
output for all remaining examples.  This will prevent doctest from reporting
correct examples that break because of earlier failures; but it might also hide
incorrect examples that fail independently of the first failure.  When
@ref{48d7,,REPORT_ONLY_FIRST_FAILURE} is specified, the remaining examples are
still run, and still count towards the total number of failures reported; only
the output is suppressed.
@end deffn

@geindex FAIL_FAST (in module doctest)
@anchor{library/doctest doctest FAIL_FAST}@anchor{113a}
@deffn {Data} doctest.FAIL_FAST

When specified, exit after the first failing example and don’t attempt to run
the remaining examples. Thus, the number of failures reported will be at most
1.  This flag may be useful during debugging, since examples after the first
failure won’t even produce debugging output.
@end deffn

@geindex REPORTING_FLAGS (in module doctest)
@anchor{library/doctest doctest REPORTING_FLAGS}@anchor{48d8}
@deffn {Data} doctest.REPORTING_FLAGS

A bitmask or’ing together all the reporting flags above.
@end deffn

There is also a way to register new option flag names, though this isn’t
useful unless you intend to extend @code{doctest} internals via subclassing:

@geindex register_optionflag() (in module doctest)
@anchor{library/doctest doctest register_optionflag}@anchor{48d9}
@deffn {Function} doctest.register_optionflag (name)

Create a new option flag with a given name, and return the new flag’s integer
value.  @code{register_optionflag()} can be used when subclassing
@ref{48da,,OutputChecker} or @ref{48db,,DocTestRunner} to create new options that are
supported by your subclasses.  @code{register_optionflag()} should always be
called using the following idiom:

@example
MY_FLAG = register_optionflag('MY_FLAG')
@end example
@end deffn

@geindex # (hash); in doctests
@geindex + (plus); in doctests
@geindex - (minus); in doctests

@node Directives,Warnings<2>,Option Flags,How It Works
@anchor{library/doctest directives}@anchor{48dc}@anchor{library/doctest doctest-directives}@anchor{48cb}
@subsubsection Directives


Doctest directives may be used to modify the @ref{1139,,option flags} for an individual example.  Doctest directives are
special Python comments following an example’s source code:

@example
@anchor{library/doctest grammar-token-doctest-directive}@anchor{48dd}directive:             "#" "doctest:" @ref{48de,,directive_options}
@anchor{library/doctest grammar-token-doctest-directive_options}@anchor{48de}directive_options:     @ref{48df,,directive_option} ("," @ref{48df,,directive_option})*
@anchor{library/doctest grammar-token-doctest-directive_option}@anchor{48df}directive_option:      @ref{48e0,,on_or_off} @ref{48e1,,directive_option_name}
@anchor{library/doctest grammar-token-doctest-on_or_off}@anchor{48e0}on_or_off:             "+" | "-"
@anchor{library/doctest grammar-token-doctest-directive_option_name}@anchor{48e1}directive_option_name: "DONT_ACCEPT_BLANKLINE" | "NORMALIZE_WHITESPACE" | ...
@end example

Whitespace is not allowed between the @code{+} or @code{-} and the directive option
name.  The directive option name can be any of the option flag names explained
above.

An example’s doctest directives modify doctest’s behavior for that single
example.  Use @code{+} to enable the named behavior, or @code{-} to disable it.

For example, this test passes:

@example
>>> print(list(range(20)))  # doctest: +NORMALIZE_WHITESPACE
[0,   1,  2,  3,  4,  5,  6,  7,  8,  9,
10,  11, 12, 13, 14, 15, 16, 17, 18, 19]
@end example

Without the directive it would fail, both because the actual output doesn’t have
two blanks before the single-digit list elements, and because the actual output
is on a single line.  This test also passes, and also requires a directive to do
so:

@example
>>> print(list(range(20)))  # doctest: +ELLIPSIS
[0, 1, ..., 18, 19]
@end example

Multiple directives can be used on a single physical line, separated by
commas:

@example
>>> print(list(range(20)))  # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE
[0,    1, ...,   18,    19]
@end example

If multiple directive comments are used for a single example, then they are
combined:

@example
>>> print(list(range(20)))  # doctest: +ELLIPSIS
...                         # doctest: +NORMALIZE_WHITESPACE
[0,    1, ...,   18,    19]
@end example

As the previous example shows, you can add @code{...} lines to your example
containing only directives.  This can be useful when an example is too long for
a directive to comfortably fit on the same line:

@example
>>> print(list(range(5)) + list(range(10, 20)) + list(range(30, 40)))
... # doctest: +ELLIPSIS
[0, ..., 4, 10, ..., 19, 30, ..., 39]
@end example

Note that since all options are disabled by default, and directives apply only
to the example they appear in, enabling options (via @code{+} in a directive) is
usually the only meaningful choice.  However, option flags can also be passed to
functions that run doctests, establishing different defaults.  In such cases,
disabling an option via @code{-} in a directive can be useful.

@node Warnings<2>,,Directives,How It Works
@anchor{library/doctest doctest-warnings}@anchor{48e2}@anchor{library/doctest warnings}@anchor{48e3}
@subsubsection Warnings


@code{doctest} is serious about requiring exact matches in expected output.  If
even a single character doesn’t match, the test fails.  This will probably
surprise you a few times, as you learn exactly what Python does and doesn’t
guarantee about output.  For example, when printing a set, Python doesn’t
guarantee that the element is printed in any particular order, so a test like

@example
>>> foo()
@{"spam", "eggs"@}
@end example

is vulnerable!  One workaround is to do

@example
>>> foo() == @{"spam", "eggs"@}
True
@end example

instead.  Another is to do

@example
>>> d = sorted(foo())
>>> d
['eggs', 'spam']
@end example

There are others, but you get the idea.

Another bad idea is to print things that embed an object address, like

@example
>>> id(1.0)  # certain to fail some of the time
7948648
>>> class C: pass
>>> C()  # the default repr() for instances embeds an address
<C object at 0x00AC18F0>
@end example

The @ref{167a,,ELLIPSIS} directive gives a nice approach for the last example:

@example
>>> C()  # doctest: +ELLIPSIS
<C object at 0x...>
@end example

Floating-point numbers are also subject to small output variations across
platforms, because Python defers to the platform C library for some
floating-point calculations, and C libraries vary widely in quality here.

@example
>>> 1000**0.1  # risky
1.9952623149688797
>>> round(1000**0.1, 9) # safer
1.995262315
>>> print(f'@{1000**0.1:.4f@}') # much safer
1.9953
@end example

Numbers of the form @code{I/2.**J} are safe across all platforms, and I often
contrive doctest examples to produce numbers of that form:

@example
>>> 3./4  # utterly safe
0.75
@end example

Simple fractions are also easier for people to understand, and that makes for
better documentation.

@node Basic API,Unittest API,How It Works,doctest — Test interactive Python examples
@anchor{library/doctest basic-api}@anchor{48e4}@anchor{library/doctest doctest-basic-api}@anchor{48b8}
@subsubsection Basic API


The functions @ref{1679,,testmod()} and @ref{48bb,,testfile()} provide a simple interface to
doctest that should be sufficient for most basic uses.  For a less formal
introduction to these two functions, see sections @ref{48b5,,Simple Usage; Checking Examples in Docstrings}
and @ref{48b9,,Simple Usage; Checking Examples in a Text File}.

@geindex testfile() (in module doctest)
@anchor{library/doctest doctest testfile}@anchor{48bb}
@deffn {Function} doctest.testfile (filename, module_relative=True, name=None, package=None, globs=None, verbose=None, report=True, optionflags=0, extraglobs=None, raise_on_error=False, parser=DocTestParser(), encoding=None)

All arguments except `filename' are optional, and should be specified in keyword
form.

Test examples in the file named `filename'.  Return @code{(failure_count,
test_count)}.

Optional argument `module_relative' specifies how the filename should be
interpreted:


@itemize *

@item 
If `module_relative' is @code{True} (the default), then `filename' specifies an
OS-independent module-relative path.  By default, this path is relative to the
calling module’s directory; but if the `package' argument is specified, then it
is relative to that package.  To ensure OS-independence, `filename' should use
@code{/} characters to separate path segments, and may not be an absolute path
(i.e., it may not begin with @code{/}).

@item 
If `module_relative' is @code{False}, then `filename' specifies an OS-specific
path.  The path may be absolute or relative; relative paths are resolved with
respect to the current working directory.
@end itemize

Optional argument `name' gives the name of the test; by default, or if @code{None},
@code{os.path.basename(filename)} is used.

Optional argument `package' is a Python package or the name of a Python package
whose directory should be used as the base directory for a module-relative
filename.  If no package is specified, then the calling module’s directory is
used as the base directory for module-relative filenames.  It is an error to
specify `package' if `module_relative' is @code{False}.

Optional argument `globs' gives a dict to be used as the globals when executing
examples.  A new shallow copy of this dict is created for the doctest, so its
examples start with a clean slate. By default, or if @code{None}, a new empty dict
is used.

Optional argument `extraglobs' gives a dict merged into the globals used to
execute examples.  This works like @ref{1671,,dict.update()}:  if `globs' and
`extraglobs' have a common key, the associated value in `extraglobs' appears in
the combined dict.  By default, or if @code{None}, no extra globals are used.  This
is an advanced feature that allows parameterization of doctests.  For example, a
doctest can be written for a base class, using a generic name for the class,
then reused to test any number of subclasses by passing an `extraglobs' dict
mapping the generic name to the subclass to be tested.

Optional argument `verbose' prints lots of stuff if true, and prints only
failures if false; by default, or if @code{None}, it’s true if and only if @code{'-v'}
is in @ref{1470,,sys.argv}.

Optional argument `report' prints a summary at the end when true, else prints
nothing at the end.  In verbose mode, the summary is detailed, else the summary
is very brief (in fact, empty if all tests passed).

Optional argument `optionflags' (default value @code{0}) takes the
@ref{2514,,bitwise OR} of option flags.
See section @ref{1139,,Option Flags}.

Optional argument `raise_on_error' defaults to false.  If true, an exception is
raised upon the first failure or unexpected exception in an example.  This
allows failures to be post-mortem debugged. Default behavior is to continue
running examples.

Optional argument `parser' specifies a @ref{48cc,,DocTestParser} (or subclass) that
should be used to extract tests from the files.  It defaults to a normal parser
(i.e., @code{DocTestParser()}).

Optional argument `encoding' specifies an encoding that should be used to
convert the file to unicode.
@end deffn

@geindex testmod() (in module doctest)
@anchor{library/doctest doctest testmod}@anchor{1679}
@deffn {Function} doctest.testmod (m=None, name=None, globs=None, verbose=None, report=True, optionflags=0, extraglobs=None, raise_on_error=False, exclude_empty=False)

All arguments are optional, and all except for `m' should be specified in
keyword form.

Test examples in docstrings in functions and classes reachable from module `m'
(or module @ref{1,,__main__} if `m' is not supplied or is @code{None}), starting with
@code{m.__doc__}.

Also test examples reachable from dict @code{m.__test__}, if it exists.
@code{m.__test__} maps names (strings) to functions, classes and
strings; function and class docstrings are searched for examples; strings are
searched directly, as if they were docstrings.

Only docstrings attached to objects belonging to module `m' are searched.

Return @code{(failure_count, test_count)}.

Optional argument `name' gives the name of the module; by default, or if
@code{None}, @code{m.__name__} is used.

Optional argument `exclude_empty' defaults to false.  If true, objects for which
no doctests are found are excluded from consideration. The default is a backward
compatibility hack, so that code still using
@ref{48e5,,doctest.master.summarize} in
conjunction with @code{testmod()} continues to get output for objects with no
tests. The `exclude_empty' argument to the newer @ref{19ea,,DocTestFinder}
constructor defaults to true.

Optional arguments `extraglobs', `verbose', `report', `optionflags',
`raise_on_error', and `globs' are the same as for function @ref{48bb,,testfile()}
above, except that `globs' defaults to @code{m.__dict__}.
@end deffn

@geindex run_docstring_examples() (in module doctest)
@anchor{library/doctest doctest run_docstring_examples}@anchor{48e6}
@deffn {Function} doctest.run_docstring_examples (f, globs, verbose=False, name='NoName', compileflags=None, optionflags=0)

Test examples associated with object `f'; for example, `f' may be a string,
a module, a function, or a class object.

A shallow copy of dictionary argument `globs' is used for the execution context.

Optional argument `name' is used in failure messages, and defaults to
@code{"NoName"}.

If optional argument `verbose' is true, output is generated even if there are no
failures.  By default, output is generated only in case of an example failure.

Optional argument `compileflags' gives the set of flags that should be used by
the Python compiler when running the examples.  By default, or if @code{None},
flags are deduced corresponding to the set of future features found in `globs'.

Optional argument `optionflags' works as for function @ref{48bb,,testfile()} above.
@end deffn

@node Unittest API,Advanced API,Basic API,doctest — Test interactive Python examples
@anchor{library/doctest doctest-unittest-api}@anchor{48e7}@anchor{library/doctest unittest-api}@anchor{48e8}
@subsubsection Unittest API


As your collection of doctest’ed modules grows, you’ll want a way to run all
their doctests systematically.  @code{doctest} provides two functions that can
be used to create @ref{10d,,unittest} test suites from modules and text files
containing doctests.  To integrate with @code{unittest} test discovery, include
a @ref{48e9,,load_tests} function in your test module:

@example
import unittest
import doctest
import my_module_with_doctests

def load_tests(loader, tests, ignore):
    tests.addTests(doctest.DocTestSuite(my_module_with_doctests))
    return tests
@end example

There are two main functions for creating @ref{ffb,,unittest.TestSuite} instances
from text files and modules with doctests:

@geindex DocFileSuite() (in module doctest)
@anchor{library/doctest doctest DocFileSuite}@anchor{48ea}
@deffn {Function} doctest.DocFileSuite (*paths, module_relative=True, package=None, setUp=None, tearDown=None, globs=None, optionflags=0, parser=DocTestParser(), encoding=None)

Convert doctest tests from one or more text files to a
@ref{ffb,,unittest.TestSuite}.

The returned @ref{ffb,,unittest.TestSuite} is to be run by the unittest framework
and runs the interactive examples in each file.  If an example in any file
fails, then the synthesized unit test fails, and a @ref{48eb,,failureException}
exception is raised showing the name of the file containing the test and a
(sometimes approximate) line number.  If all the examples in a file are
skipped, then the synthesized unit test is also marked as skipped.

Pass one or more paths (as strings) to text files to be examined.

Options may be provided as keyword arguments:

Optional argument `module_relative' specifies how the filenames in `paths'
should be interpreted:


@itemize *

@item 
If `module_relative' is @code{True} (the default), then each filename in
`paths' specifies an OS-independent module-relative path.  By default, this
path is relative to the calling module’s directory; but if the `package'
argument is specified, then it is relative to that package.  To ensure
OS-independence, each filename should use @code{/} characters to separate path
segments, and may not be an absolute path (i.e., it may not begin with
@code{/}).

@item 
If `module_relative' is @code{False}, then each filename in `paths' specifies
an OS-specific path.  The path may be absolute or relative; relative paths
are resolved with respect to the current working directory.
@end itemize

Optional argument `package' is a Python package or the name of a Python
package whose directory should be used as the base directory for
module-relative filenames in `paths'.  If no package is specified, then the
calling module’s directory is used as the base directory for module-relative
filenames.  It is an error to specify `package' if `module_relative' is
@code{False}.

Optional argument `setUp' specifies a set-up function for the test suite.
This is called before running the tests in each file.  The `setUp' function
will be passed a @ref{1a70,,DocTest} object.  The `setUp' function can access the
test globals as the @ref{48ec,,globs} attribute of the test passed.

Optional argument `tearDown' specifies a tear-down function for the test
suite.  This is called after running the tests in each file.  The `tearDown'
function will be passed a @ref{1a70,,DocTest} object.  The `tearDown' function can
access the test globals as the @ref{48ec,,globs} attribute of the test
passed.

Optional argument `globs' is a dictionary containing the initial global
variables for the tests.  A new copy of this dictionary is created for each
test.  By default, `globs' is a new empty dictionary.

Optional argument `optionflags' specifies the default doctest options for the
tests, created by or-ing together individual option flags.  See section
@ref{1139,,Option Flags}. See function @ref{48ed,,set_unittest_reportflags()} below
for a better way to set reporting options.

Optional argument `parser' specifies a @ref{48cc,,DocTestParser} (or subclass)
that should be used to extract tests from the files.  It defaults to a normal
parser (i.e., @code{DocTestParser()}).

Optional argument `encoding' specifies an encoding that should be used to
convert the file to unicode.

The global @code{__file__} is added to the globals provided to doctests loaded
from a text file using @code{DocFileSuite()}.
@end deffn

@geindex DocTestSuite() (in module doctest)
@anchor{library/doctest doctest DocTestSuite}@anchor{ffa}
@deffn {Function} doctest.DocTestSuite (module=None, globs=None, extraglobs=None, test_finder=None, setUp=None, tearDown=None, optionflags=0, checker=None)

Convert doctest tests for a module to a @ref{ffb,,unittest.TestSuite}.

The returned @ref{ffb,,unittest.TestSuite} is to be run by the unittest framework
and runs each doctest in the module.
Each docstring is run as a separate unit test.
If any of the doctests fail, then the synthesized unit test fails,
and a @ref{48eb,,unittest.TestCase.failureException} exception is raised
showing the name of the file containing the test and a (sometimes approximate)
line number.  If all the examples in a docstring are skipped, then the

Optional argument `module' provides the module to be tested.  It can be a module
object or a (possibly dotted) module name.  If not specified, the module calling
this function is used.

Optional argument `globs' is a dictionary containing the initial global
variables for the tests.  A new copy of this dictionary is created for each
test.  By default, `globs' is the module’s @ref{23b3,,__dict__}.

Optional argument `extraglobs' specifies an extra set of global variables, which
is merged into `globs'.  By default, no extra globals are used.

Optional argument `test_finder' is the @ref{19ea,,DocTestFinder} object (or a
drop-in replacement) that is used to extract doctests from the module.

Optional arguments `setUp', `tearDown', and `optionflags' are the same as for
function @ref{48ea,,DocFileSuite()} above, but they are called for each docstring.

This function uses the same search technique as @ref{1679,,testmod()}.


Changed in version 3.5: @code{DocTestSuite()} returns an empty @ref{ffb,,unittest.TestSuite} if `module'
contains no docstrings instead of raising @ref{2ee,,ValueError}.

@end deffn

Under the covers, @ref{ffa,,DocTestSuite()} creates a @ref{ffb,,unittest.TestSuite} out
of @code{doctest.DocTestCase} instances, and @code{DocTestCase} is a
subclass of @ref{2b5,,unittest.TestCase}. @code{DocTestCase} isn’t documented
here (it’s an internal detail), but studying its code can answer questions about
the exact details of @ref{10d,,unittest} integration.

Similarly, @ref{48ea,,DocFileSuite()} creates a @ref{ffb,,unittest.TestSuite} out of
@code{doctest.DocFileCase} instances, and @code{DocFileCase} is a subclass
of @code{DocTestCase}.

So both ways of creating a @ref{ffb,,unittest.TestSuite} run instances of
@code{DocTestCase}.  This is important for a subtle reason: when you run
@code{doctest} functions yourself, you can control the @code{doctest} options in
use directly, by passing option flags to @code{doctest} functions.  However, if
you’re writing a @ref{10d,,unittest} framework, @code{unittest} ultimately controls
when and how tests get run.  The framework author typically wants to control
@code{doctest} reporting options (perhaps, e.g., specified by command line
options), but there’s no way to pass options through @code{unittest} to
@code{doctest} test runners.

For this reason, @code{doctest} also supports a notion of @code{doctest}
reporting flags specific to @ref{10d,,unittest} support, via this function:

@geindex set_unittest_reportflags() (in module doctest)
@anchor{library/doctest doctest set_unittest_reportflags}@anchor{48ed}
@deffn {Function} doctest.set_unittest_reportflags (flags)

Set the @code{doctest} reporting flags to use.

Argument `flags' takes the @ref{2514,,bitwise OR} of option flags.  See
section @ref{1139,,Option Flags}.  Only “reporting flags” can be used.

This is a module-global setting, and affects all future doctests run by module
@ref{10d,,unittest}:  the @code{runTest()} method of @code{DocTestCase} looks at
the option flags specified for the test case when the @code{DocTestCase}
instance was constructed.  If no reporting flags were specified (which is the
typical and expected case), @code{doctest}’s @code{unittest} reporting flags are
@ref{2514,,bitwise ORed} into the option flags, and the option flags
so augmented are passed to the @ref{48db,,DocTestRunner} instance created to
run the doctest.  If any reporting flags were specified when the
@code{DocTestCase} instance was constructed, @code{doctest}’s
@code{unittest} reporting flags are ignored.

The value of the @ref{10d,,unittest} reporting flags in effect before the function
was called is returned by the function.
@end deffn

@node Advanced API,Debugging,Unittest API,doctest — Test interactive Python examples
@anchor{library/doctest advanced-api}@anchor{48ee}@anchor{library/doctest doctest-advanced-api}@anchor{48ef}
@subsubsection Advanced API


The basic API is a simple wrapper that’s intended to make doctest easy to use.
It is fairly flexible, and should meet most users’ needs; however, if you
require more fine-grained control over testing, or wish to extend doctest’s
capabilities, then you should use the advanced API.

The advanced API revolves around two container classes, which are used to store
the interactive examples extracted from doctest cases:


@itemize *

@item 
@ref{48f0,,Example}: A single Python @ref{2c6d,,statement}, paired with its expected
output.

@item 
@ref{1a70,,DocTest}: A collection of @ref{48f0,,Example}s, typically extracted
from a single docstring or text file.
@end itemize

Additional processing classes are defined to find, parse, and run, and check
doctest examples:


@itemize *

@item 
@ref{19ea,,DocTestFinder}: Finds all docstrings in a given module, and uses a
@ref{48cc,,DocTestParser} to create a @ref{1a70,,DocTest} from every docstring that
contains interactive examples.

@item 
@ref{48cc,,DocTestParser}: Creates a @ref{1a70,,DocTest} object from a string (such
as an object’s docstring).

@item 
@ref{48db,,DocTestRunner}: Executes the examples in a @ref{1a70,,DocTest}, and uses
an @ref{48da,,OutputChecker} to verify their output.

@item 
@ref{48da,,OutputChecker}: Compares the actual output from a doctest example with
the expected output, and decides whether they match.
@end itemize

The relationships among these processing classes are summarized in the following
diagram:

@example
                            list of:
+------+                   +---------+
|module| --DocTestFinder-> | DocTest | --DocTestRunner-> results
+------+    |        ^     +---------+     |       ^    (printed)
            |        |     | Example |     |       |
            v        |     |   ...   |     v       |
           DocTestParser   | Example |   OutputChecker
                           +---------+
@end example

@menu
* DocTest Objects:: 
* Example Objects:: 
* DocTestFinder objects:: 
* DocTestParser objects:: 
* TestResults objects:: 
* DocTestRunner objects:: 
* OutputChecker objects:: 

@end menu

@node DocTest Objects,Example Objects,,Advanced API
@anchor{library/doctest doctest-doctest}@anchor{48f1}@anchor{library/doctest doctest-objects}@anchor{48f2}
@subsubsection DocTest Objects


@geindex DocTest (class in doctest)
@anchor{library/doctest doctest DocTest}@anchor{1a70}
@deffn {Class} doctest.DocTest (examples, globs, name, filename, lineno, docstring)

A collection of doctest examples that should be run in a single namespace.  The
constructor arguments are used to initialize the attributes of the same names.

@code{DocTest} defines the following attributes.  They are initialized by
the constructor, and should not be modified directly.

@geindex examples (doctest.DocTest attribute)
@anchor{library/doctest doctest DocTest examples}@anchor{48f3}
@deffn {Attribute} examples

A list of @ref{48f0,,Example} objects encoding the individual interactive Python
examples that should be run by this test.
@end deffn

@geindex globs (doctest.DocTest attribute)
@anchor{library/doctest doctest DocTest globs}@anchor{48ec}
@deffn {Attribute} globs

The namespace (aka globals) that the examples should be run in. This is a
dictionary mapping names to values.  Any changes to the namespace made by the
examples (such as binding new variables) will be reflected in @ref{48ec,,globs}
after the test is run.
@end deffn

@geindex name (doctest.DocTest attribute)
@anchor{library/doctest doctest DocTest name}@anchor{48f4}
@deffn {Attribute} name

A string name identifying the @code{DocTest}.  Typically, this is the name
of the object or file that the test was extracted from.
@end deffn

@geindex filename (doctest.DocTest attribute)
@anchor{library/doctest doctest DocTest filename}@anchor{48f5}
@deffn {Attribute} filename

The name of the file that this @code{DocTest} was extracted from; or
@code{None} if the filename is unknown, or if the @code{DocTest} was not
extracted from a file.
@end deffn

@geindex lineno (doctest.DocTest attribute)
@anchor{library/doctest doctest DocTest lineno}@anchor{1816}
@deffn {Attribute} lineno

The line number within @ref{48f5,,filename} where this @code{DocTest} begins, or
@code{None} if the line number is unavailable.  This line number is zero-based
with respect to the beginning of the file.
@end deffn

@geindex docstring (doctest.DocTest attribute)
@anchor{library/doctest doctest DocTest docstring}@anchor{48f6}
@deffn {Attribute} docstring

The string that the test was extracted from, or @code{None} if the string is
unavailable, or if the test was not extracted from a string.
@end deffn
@end deffn

@node Example Objects,DocTestFinder objects,DocTest Objects,Advanced API
@anchor{library/doctest doctest-example}@anchor{48f7}@anchor{library/doctest example-objects}@anchor{48f8}
@subsubsection Example Objects


@geindex Example (class in doctest)
@anchor{library/doctest doctest Example}@anchor{48f0}
@deffn {Class} doctest.Example (source, want, exc_msg=None, lineno=0, indent=0, options=None)

A single interactive example, consisting of a Python statement and its expected
output.  The constructor arguments are used to initialize the attributes of
the same names.

@code{Example} defines the following attributes.  They are initialized by
the constructor, and should not be modified directly.

@geindex source (doctest.Example attribute)
@anchor{library/doctest doctest Example source}@anchor{48f9}
@deffn {Attribute} source

A string containing the example’s source code.  This source code consists of a
single Python statement, and always ends with a newline; the constructor adds
a newline when necessary.
@end deffn

@geindex want (doctest.Example attribute)
@anchor{library/doctest doctest Example want}@anchor{48fa}
@deffn {Attribute} want

The expected output from running the example’s source code (either from
stdout, or a traceback in case of exception).  @ref{48fa,,want} ends with a
newline unless no output is expected, in which case it’s an empty string.  The
constructor adds a newline when necessary.
@end deffn

@geindex exc_msg (doctest.Example attribute)
@anchor{library/doctest doctest Example exc_msg}@anchor{48fb}
@deffn {Attribute} exc_msg

The exception message generated by the example, if the example is expected to
generate an exception; or @code{None} if it is not expected to generate an
exception.  This exception message is compared against the return value of
@ref{a54,,traceback.format_exception_only()}.  @ref{48fb,,exc_msg} ends with a newline
unless it’s @code{None}.  The constructor adds a newline if needed.
@end deffn

@geindex lineno (doctest.Example attribute)
@anchor{library/doctest doctest Example lineno}@anchor{48fc}
@deffn {Attribute} lineno

The line number within the string containing this example where the example
begins.  This line number is zero-based with respect to the beginning of the
containing string.
@end deffn

@geindex indent (doctest.Example attribute)
@anchor{library/doctest doctest Example indent}@anchor{48fd}
@deffn {Attribute} indent

The example’s indentation in the containing string, i.e., the number of space
characters that precede the example’s first prompt.
@end deffn

@geindex options (doctest.Example attribute)
@anchor{library/doctest doctest Example options}@anchor{48fe}
@deffn {Attribute} options

A dictionary mapping from option flags to @code{True} or @code{False}, which is used
to override default options for this example.  Any option flags not contained
in this dictionary are left at their default value (as specified by the
@ref{48db,,DocTestRunner}’s @ref{1139,,optionflags}).
By default, no options are set.
@end deffn
@end deffn

@node DocTestFinder objects,DocTestParser objects,Example Objects,Advanced API
@anchor{library/doctest doctest-doctestfinder}@anchor{48ff}@anchor{library/doctest doctestfinder-objects}@anchor{4900}
@subsubsection DocTestFinder objects


@geindex DocTestFinder (class in doctest)
@anchor{library/doctest doctest DocTestFinder}@anchor{19ea}
@deffn {Class} doctest.DocTestFinder (verbose=False, parser=DocTestParser(), recurse=True, exclude_empty=True)

A processing class used to extract the @ref{1a70,,DocTest}s that are relevant to
a given object, from its docstring and the docstrings of its contained objects.
@code{DocTest}s can be extracted from modules, classes, functions,
methods, staticmethods, classmethods, and properties.

The optional argument `verbose' can be used to display the objects searched by
the finder.  It defaults to @code{False} (no output).

The optional argument `parser' specifies the @ref{48cc,,DocTestParser} object (or a
drop-in replacement) that is used to extract doctests from docstrings.

If the optional argument `recurse' is false, then @ref{1ab5,,DocTestFinder.find()}
will only examine the given object, and not any contained objects.

If the optional argument `exclude_empty' is false, then
@ref{1ab5,,DocTestFinder.find()} will include tests for objects with empty docstrings.

@code{DocTestFinder} defines the following method:

@geindex find() (doctest.DocTestFinder method)
@anchor{library/doctest doctest DocTestFinder find}@anchor{1ab5}
@deffn {Method} find (obj[, name][, module][, globs][, extraglobs])

Return a list of the @ref{1a70,,DocTest}s that are defined by `obj'’s
docstring, or by any of its contained objects’ docstrings.

The optional argument `name' specifies the object’s name; this name will be
used to construct names for the returned @ref{1a70,,DocTest}s.  If `name' is
not specified, then @code{obj.__name__} is used.

The optional parameter `module' is the module that contains the given object.
If the module is not specified or is @code{None}, then the test finder will attempt
to automatically determine the correct module.  The object’s module is used:


@itemize *

@item 
As a default namespace, if `globs' is not specified.

@item 
To prevent the DocTestFinder from extracting DocTests from objects that are
imported from other modules.  (Contained objects with modules other than
`module' are ignored.)

@item 
To find the name of the file containing the object.

@item 
To help find the line number of the object within its file.
@end itemize

If `module' is @code{False}, no attempt to find the module will be made.  This is
obscure, of use mostly in testing doctest itself: if `module' is @code{False}, or
is @code{None} but cannot be found automatically, then all objects are considered
to belong to the (non-existent) module, so all contained objects will
(recursively) be searched for doctests.

The globals for each @ref{1a70,,DocTest} is formed by combining `globs' and
`extraglobs' (bindings in `extraglobs' override bindings in `globs').  A new
shallow copy of the globals dictionary is created for each @code{DocTest}.
If `globs' is not specified, then it defaults to the module’s
@ref{23b3,,__dict__}, if specified, or @code{@{@}} otherwise.
If `extraglobs' is not specified, then it defaults to @code{@{@}}.
@end deffn
@end deffn

@node DocTestParser objects,TestResults objects,DocTestFinder objects,Advanced API
@anchor{library/doctest doctest-doctestparser}@anchor{4901}@anchor{library/doctest doctestparser-objects}@anchor{4902}
@subsubsection DocTestParser objects


@geindex DocTestParser (class in doctest)
@anchor{library/doctest doctest DocTestParser}@anchor{48cc}
@deffn {Class} doctest.DocTestParser

A processing class used to extract interactive examples from a string, and use
them to create a @ref{1a70,,DocTest} object.

@code{DocTestParser} defines the following methods:

@geindex get_doctest() (doctest.DocTestParser method)
@anchor{library/doctest doctest DocTestParser get_doctest}@anchor{4903}
@deffn {Method} get_doctest (string, globs, name, filename, lineno)

Extract all doctest examples from the given string, and collect them into a
@ref{1a70,,DocTest} object.

`globs', `name', `filename', and `lineno' are attributes for the new
@code{DocTest} object.  See the documentation for @ref{1a70,,DocTest} for more
information.
@end deffn

@geindex get_examples() (doctest.DocTestParser method)
@anchor{library/doctest doctest DocTestParser get_examples}@anchor{4904}
@deffn {Method} get_examples (string, name='<string>')

Extract all doctest examples from the given string, and return them as a list
of @ref{48f0,,Example} objects.  Line numbers are 0-based.  The optional argument
`name' is a name identifying this string, and is only used for error messages.
@end deffn

@geindex parse() (doctest.DocTestParser method)
@anchor{library/doctest doctest DocTestParser parse}@anchor{4905}
@deffn {Method} parse (string, name='<string>')

Divide the given string into examples and intervening text, and return them as
a list of alternating @ref{48f0,,Example}s and strings. Line numbers for the
@code{Example}s are 0-based.  The optional argument `name' is a name
identifying this string, and is only used for error messages.
@end deffn
@end deffn

@node TestResults objects,DocTestRunner objects,DocTestParser objects,Advanced API
@anchor{library/doctest testresults-objects}@anchor{4906}
@subsubsection TestResults objects


@geindex TestResults (class in doctest)
@anchor{library/doctest doctest TestResults}@anchor{4907}
@deffn {Class} doctest.TestResults (failed, attempted)

@geindex failed (doctest.TestResults attribute)
@anchor{library/doctest doctest TestResults failed}@anchor{4908}
@deffn {Attribute} failed

Number of failed tests.
@end deffn

@geindex attempted (doctest.TestResults attribute)
@anchor{library/doctest doctest TestResults attempted}@anchor{4909}
@deffn {Attribute} attempted

Number of attempted tests.
@end deffn

@geindex skipped (doctest.TestResults attribute)
@anchor{library/doctest doctest TestResults skipped}@anchor{4f1}
@deffn {Attribute} skipped

Number of skipped tests.


Added in version 3.13.

@end deffn
@end deffn

@node DocTestRunner objects,OutputChecker objects,TestResults objects,Advanced API
@anchor{library/doctest doctest-doctestrunner}@anchor{490a}@anchor{library/doctest doctestrunner-objects}@anchor{490b}
@subsubsection DocTestRunner objects


@geindex DocTestRunner (class in doctest)
@anchor{library/doctest doctest DocTestRunner}@anchor{48db}
@deffn {Class} doctest.DocTestRunner (checker=None, verbose=None, optionflags=0)

A processing class used to execute and verify the interactive examples in a
@ref{1a70,,DocTest}.

The comparison between expected outputs and actual outputs is done by an
@ref{48da,,OutputChecker}.  This comparison may be customized with a number of
option flags; see section @ref{1139,,Option Flags} for more information.  If the
option flags are insufficient, then the comparison may also be customized by
passing a subclass of @code{OutputChecker} to the constructor.

The test runner’s display output can be controlled in two ways. First, an output
function can be passed to @ref{4ef,,run()}; this function will be called
with strings that should be displayed.  It defaults to @code{sys.stdout.write}.  If
capturing the output is not sufficient, then the display output can be also
customized by subclassing DocTestRunner, and overriding the methods
@ref{490c,,report_start()}, @ref{490d,,report_success()},
@ref{490e,,report_unexpected_exception()}, and @ref{490f,,report_failure()}.

The optional keyword argument `checker' specifies the @ref{48da,,OutputChecker}
object (or drop-in replacement) that should be used to compare the expected
outputs to the actual outputs of doctest examples.

The optional keyword argument `verbose' controls the @code{DocTestRunner}’s
verbosity.  If `verbose' is @code{True}, then information is printed about each
example, as it is run.  If `verbose' is @code{False}, then only failures are
printed.  If `verbose' is unspecified, or @code{None}, then verbose output is used
iff the command-line switch @code{-v} is used.

The optional keyword argument `optionflags' can be used to control how the test
runner compares expected output to actual output, and how it displays failures.
For more information, see section @ref{1139,,Option Flags}.

The test runner accumulates statistics. The aggregated number of attempted,
failed and skipped examples is also available via the @ref{4910,,tries},
@ref{4911,,failures} and @ref{4f0,,skips} attributes. The @ref{4ef,,run()} and
@ref{48e5,,summarize()} methods return a @ref{4907,,TestResults} instance.

@code{DocTestRunner} defines the following methods:

@geindex report_start() (doctest.DocTestRunner method)
@anchor{library/doctest doctest DocTestRunner report_start}@anchor{490c}
@deffn {Method} report_start (out, test, example)

Report that the test runner is about to process the given example. This method
is provided to allow subclasses of @code{DocTestRunner} to customize their
output; it should not be called directly.

`example' is the example about to be processed.  `test' is the test
containing `example'.  `out' is the output function that was passed to
@ref{4ef,,DocTestRunner.run()}.
@end deffn

@geindex report_success() (doctest.DocTestRunner method)
@anchor{library/doctest doctest DocTestRunner report_success}@anchor{490d}
@deffn {Method} report_success (out, test, example, got)

Report that the given example ran successfully.  This method is provided to
allow subclasses of @code{DocTestRunner} to customize their output; it
should not be called directly.

`example' is the example about to be processed.  `got' is the actual output
from the example.  `test' is the test containing `example'.  `out' is the
output function that was passed to @ref{4ef,,DocTestRunner.run()}.
@end deffn

@geindex report_failure() (doctest.DocTestRunner method)
@anchor{library/doctest doctest DocTestRunner report_failure}@anchor{490f}
@deffn {Method} report_failure (out, test, example, got)

Report that the given example failed.  This method is provided to allow
subclasses of @code{DocTestRunner} to customize their output; it should not
be called directly.

`example' is the example about to be processed.  `got' is the actual output
from the example.  `test' is the test containing `example'.  `out' is the
output function that was passed to @ref{4ef,,DocTestRunner.run()}.
@end deffn

@geindex report_unexpected_exception() (doctest.DocTestRunner method)
@anchor{library/doctest doctest DocTestRunner report_unexpected_exception}@anchor{490e}
@deffn {Method} report_unexpected_exception (out, test, example, exc_info)

Report that the given example raised an unexpected exception. This method is
provided to allow subclasses of @code{DocTestRunner} to customize their
output; it should not be called directly.

`example' is the example about to be processed. `exc_info' is a tuple
containing information about the unexpected exception (as returned by
@ref{89c,,sys.exc_info()}). `test' is the test containing `example'.  `out' is the
output function that was passed to @ref{4ef,,DocTestRunner.run()}.
@end deffn

@geindex run() (doctest.DocTestRunner method)
@anchor{library/doctest doctest DocTestRunner run}@anchor{4ef}
@deffn {Method} run (test, compileflags=None, out=None, clear_globs=True)

Run the examples in `test' (a @ref{1a70,,DocTest} object), and display the
results using the writer function `out'. Return a @ref{4907,,TestResults}
instance.

The examples are run in the namespace @code{test.globs}.  If `clear_globs' is
true (the default), then this namespace will be cleared after the test runs,
to help with garbage collection. If you would like to examine the namespace
after the test completes, then use `clear_globs=False'.

`compileflags' gives the set of flags that should be used by the Python
compiler when running the examples.  If not specified, then it will default to
the set of future-import flags that apply to `globs'.

The output of each example is checked using the @code{DocTestRunner}’s
output checker, and the results are formatted by the
@code{DocTestRunner.report_*()} methods.
@end deffn

@geindex summarize() (doctest.DocTestRunner method)
@anchor{library/doctest doctest DocTestRunner summarize}@anchor{48e5}
@deffn {Method} summarize (verbose=None)

Print a summary of all the test cases that have been run by this DocTestRunner,
and return a @ref{4907,,TestResults} instance.

The optional `verbose' argument controls how detailed the summary is.  If the
verbosity is not specified, then the @code{DocTestRunner}’s verbosity is
used.
@end deffn

@ref{48cc,,DocTestParser} has the following attributes:

@geindex tries (doctest.DocTestRunner attribute)
@anchor{library/doctest doctest DocTestRunner tries}@anchor{4910}
@deffn {Attribute} tries

Number of attempted examples.
@end deffn

@geindex failures (doctest.DocTestRunner attribute)
@anchor{library/doctest doctest DocTestRunner failures}@anchor{4911}
@deffn {Attribute} failures

Number of failed examples.
@end deffn

@geindex skips (doctest.DocTestRunner attribute)
@anchor{library/doctest doctest DocTestRunner skips}@anchor{4f0}
@deffn {Attribute} skips

Number of skipped examples.


Added in version 3.13.

@end deffn
@end deffn

@node OutputChecker objects,,DocTestRunner objects,Advanced API
@anchor{library/doctest doctest-outputchecker}@anchor{4912}@anchor{library/doctest outputchecker-objects}@anchor{4913}
@subsubsection OutputChecker objects


@geindex OutputChecker (class in doctest)
@anchor{library/doctest doctest OutputChecker}@anchor{48da}
@deffn {Class} doctest.OutputChecker

A class used to check the whether the actual output from a doctest example
matches the expected output.  @code{OutputChecker} defines two methods:
@ref{4914,,check_output()}, which compares a given pair of outputs, and returns @code{True}
if they match; and @ref{4915,,output_difference()}, which returns a string describing
the differences between two outputs.

@code{OutputChecker} defines the following methods:

@geindex check_output() (doctest.OutputChecker method)
@anchor{library/doctest doctest OutputChecker check_output}@anchor{4914}
@deffn {Method} check_output (want, got, optionflags)

Return @code{True} iff the actual output from an example (`got') matches the
expected output (`want').  These strings are always considered to match if
they are identical; but depending on what option flags the test runner is
using, several non-exact match types are also possible.  See section
@ref{1139,,Option Flags} for more information about option flags.
@end deffn

@geindex output_difference() (doctest.OutputChecker method)
@anchor{library/doctest doctest OutputChecker output_difference}@anchor{4915}
@deffn {Method} output_difference (example, got, optionflags)

Return a string describing the differences between the expected output for a
given example (`example') and the actual output (`got').  `optionflags' is the
set of option flags used to compare `want' and `got'.
@end deffn
@end deffn

@node Debugging,Soapbox,Advanced API,doctest — Test interactive Python examples
@anchor{library/doctest debugging}@anchor{4916}@anchor{library/doctest doctest-debugging}@anchor{4917}
@subsubsection Debugging


Doctest provides several mechanisms for debugging doctest examples:


@itemize *

@item 
Several functions convert doctests to executable Python programs, which can be
run under the Python debugger, @ref{aa,,pdb}.

@item 
The @ref{4918,,DebugRunner} class is a subclass of @ref{48db,,DocTestRunner} that
raises an exception for the first failing example, containing information about
that example. This information can be used to perform post-mortem debugging on
the example.

@item 
The @ref{10d,,unittest} cases generated by @ref{ffa,,DocTestSuite()} support the
@ref{4919,,debug()} method defined by @ref{2b5,,unittest.TestCase}.

@item 
You can add a call to @ref{274,,pdb.set_trace()} in a doctest example, and you’ll
drop into the Python debugger when that line is executed.  Then you can inspect
current values of variables, and so on.  For example, suppose @code{a.py}
contains just this module docstring:

@example
"""
>>> def f(x):
...     g(x*2)
>>> def g(x):
...     print(x+3)
...     import pdb; pdb.set_trace()
>>> f(3)
9
"""
@end example

Then an interactive Python session may look like this:

@example
>>> import a, doctest
>>> doctest.testmod(a)
--Return--
> <doctest a[1]>(3)g()->None
-> import pdb; pdb.set_trace()
(Pdb) list
  1     def g(x):
  2         print(x+3)
  3  ->     import pdb; pdb.set_trace()
[EOF]
(Pdb) p x
6
(Pdb) step
--Return--
> <doctest a[0]>(2)f()->None
-> g(x*2)
(Pdb) list
  1     def f(x):
  2  ->     g(x*2)
[EOF]
(Pdb) p x
3
(Pdb) step
--Return--
> <doctest a[2]>(1)?()->None
-> f(3)
(Pdb) cont
(0, 3)
>>>
@end example
@end itemize

Functions that convert doctests to Python code, and possibly run the synthesized
code under the debugger:

@geindex script_from_examples() (in module doctest)
@anchor{library/doctest doctest script_from_examples}@anchor{491a}
@deffn {Function} doctest.script_from_examples (s)

Convert text with examples to a script.

Argument `s' is a string containing doctest examples.  The string is converted
to a Python script, where doctest examples in `s' are converted to regular code,
and everything else is converted to Python comments.  The generated script is
returned as a string. For example,

@example
import doctest
print(doctest.script_from_examples(r"""
    Set x and y to 1 and 2.
    >>> x, y = 1, 2

    Print their sum:
    >>> print(x+y)
    3
"""))
@end example

displays:

@example
# Set x and y to 1 and 2.
x, y = 1, 2
#
# Print their sum:
print(x+y)
# Expected:
## 3
@end example

This function is used internally by other functions (see below), but can also be
useful when you want to transform an interactive Python session into a Python
script.
@end deffn

@geindex testsource() (in module doctest)
@anchor{library/doctest doctest testsource}@anchor{491b}
@deffn {Function} doctest.testsource (module, name)

Convert the doctest for an object to a script.

Argument `module' is a module object, or dotted name of a module, containing the
object whose doctests are of interest.  Argument `name' is the name (within the
module) of the object with the doctests of interest.  The result is a string,
containing the object’s docstring converted to a Python script, as described for
@ref{491a,,script_from_examples()} above.  For example, if module @code{a.py}
contains a top-level function @code{f()}, then

@example
import a, doctest
print(doctest.testsource(a, "a.f"))
@end example

prints a script version of function @code{f()}’s docstring, with doctests
converted to code, and the rest placed in comments.
@end deffn

@geindex debug() (in module doctest)
@anchor{library/doctest doctest debug}@anchor{4919}
@deffn {Function} doctest.debug (module, name, pm=False)

Debug the doctests for an object.

The `module' and `name' arguments are the same as for function
@ref{491b,,testsource()} above.  The synthesized Python script for the named object’s
docstring is written to a temporary file, and then that file is run under the
control of the Python debugger, @ref{aa,,pdb}.

A shallow copy of @code{module.__dict__} is used for both local and global
execution context.

Optional argument `pm' controls whether post-mortem debugging is used.  If `pm'
has a true value, the script file is run directly, and the debugger gets
involved only if the script terminates via raising an unhandled exception.  If
it does, then post-mortem debugging is invoked, via @ref{15e6,,pdb.post_mortem()},
passing the traceback object from the unhandled exception.  If `pm' is not
specified, or is false, the script is run under the debugger from the start, via
passing an appropriate @ref{4a3,,exec()} call to @ref{491c,,pdb.run()}.
@end deffn

@geindex debug_src() (in module doctest)
@anchor{library/doctest doctest debug_src}@anchor{491d}
@deffn {Function} doctest.debug_src (src, pm=False, globs=None)

Debug the doctests in a string.

This is like function @ref{4919,,debug()} above, except that a string containing
doctest examples is specified directly, via the `src' argument.

Optional argument `pm' has the same meaning as in function @ref{4919,,debug()} above.

Optional argument `globs' gives a dictionary to use as both local and global
execution context.  If not specified, or @code{None}, an empty dictionary is used.
If specified, a shallow copy of the dictionary is used.
@end deffn

The @ref{4918,,DebugRunner} class, and the special exceptions it may raise, are of
most interest to testing framework authors, and will only be sketched here.  See
the source code, and especially @code{DebugRunner}’s docstring (which is a
doctest!) for more details:

@geindex DebugRunner (class in doctest)
@anchor{library/doctest doctest DebugRunner}@anchor{4918}
@deffn {Class} doctest.DebugRunner (checker=None, verbose=None, optionflags=0)

A subclass of @ref{48db,,DocTestRunner} that raises an exception as soon as a
failure is encountered.  If an unexpected exception occurs, an
@ref{491e,,UnexpectedException} exception is raised, containing the test, the
example, and the original exception.  If the output doesn’t match, then a
@ref{491f,,DocTestFailure} exception is raised, containing the test, the example, and
the actual output.

For information about the constructor parameters and methods, see the
documentation for @ref{48db,,DocTestRunner} in section @ref{48ef,,Advanced API}.
@end deffn

There are two exceptions that may be raised by @ref{4918,,DebugRunner} instances:

@geindex DocTestFailure
@anchor{library/doctest doctest DocTestFailure}@anchor{491f}
@deffn {Exception} doctest.DocTestFailure (test, example, got)

An exception raised by @ref{48db,,DocTestRunner} to signal that a doctest example’s
actual output did not match its expected output. The constructor arguments are
used to initialize the attributes of the same names.
@end deffn

@ref{491f,,DocTestFailure} defines the following attributes:

@geindex test (doctest.DocTestFailure attribute)
@anchor{library/doctest doctest DocTestFailure test}@anchor{4920}
@deffn {Attribute} DocTestFailure.test

The @ref{1a70,,DocTest} object that was being run when the example failed.
@end deffn

@geindex example (doctest.DocTestFailure attribute)
@anchor{library/doctest doctest DocTestFailure example}@anchor{4921}
@deffn {Attribute} DocTestFailure.example

The @ref{48f0,,Example} that failed.
@end deffn

@geindex got (doctest.DocTestFailure attribute)
@anchor{library/doctest doctest DocTestFailure got}@anchor{4922}
@deffn {Attribute} DocTestFailure.got

The example’s actual output.
@end deffn

@geindex UnexpectedException
@anchor{library/doctest doctest UnexpectedException}@anchor{491e}
@deffn {Exception} doctest.UnexpectedException (test, example, exc_info)

An exception raised by @ref{48db,,DocTestRunner} to signal that a doctest
example raised an unexpected exception.  The constructor arguments are used
to initialize the attributes of the same names.
@end deffn

@ref{491e,,UnexpectedException} defines the following attributes:

@geindex test (doctest.UnexpectedException attribute)
@anchor{library/doctest doctest UnexpectedException test}@anchor{4923}
@deffn {Attribute} UnexpectedException.test

The @ref{1a70,,DocTest} object that was being run when the example failed.
@end deffn

@geindex example (doctest.UnexpectedException attribute)
@anchor{library/doctest doctest UnexpectedException example}@anchor{4924}
@deffn {Attribute} UnexpectedException.example

The @ref{48f0,,Example} that failed.
@end deffn

@geindex exc_info (doctest.UnexpectedException attribute)
@anchor{library/doctest doctest UnexpectedException exc_info}@anchor{4925}
@deffn {Attribute} UnexpectedException.exc_info

A tuple containing information about the unexpected exception, as returned by
@ref{89c,,sys.exc_info()}.
@end deffn

@node Soapbox,,Debugging,doctest — Test interactive Python examples
@anchor{library/doctest doctest-soapbox}@anchor{4926}@anchor{library/doctest soapbox}@anchor{4927}
@subsubsection Soapbox


As mentioned in the introduction, @code{doctest} has grown to have three primary
uses:


@enumerate 

@item 
Checking examples in docstrings.

@item 
Regression testing.

@item 
Executable documentation / literate testing.
@end enumerate

These uses have different requirements, and it is important to distinguish them.
In particular, filling your docstrings with obscure test cases makes for bad
documentation.

When writing a docstring, choose docstring examples with care. There’s an art to
this that needs to be learned—it may not be natural at first.  Examples should
add genuine value to the documentation.  A good example can often be worth many
words. If done with care, the examples will be invaluable for your users, and
will pay back the time it takes to collect them many times over as the years go
by and things change.  I’m still amazed at how often one of my @code{doctest}
examples stops working after a “harmless” change.

Doctest also makes an excellent tool for regression testing, especially if you
don’t skimp on explanatory text.  By interleaving prose and examples, it becomes
much easier to keep track of what’s actually being tested, and why.  When a test
fails, good prose can make it much easier to figure out what the problem is, and
how it should be fixed.  It’s true that you could write extensive comments in
code-based testing, but few programmers do. Many have found that using doctest
approaches instead leads to much clearer tests.  Perhaps this is simply because
doctest makes writing prose a little easier than writing code, while writing
comments in code is a little harder.  I think it goes deeper than just that:
the natural attitude when writing a doctest-based test is that you want to
explain the fine points of your software, and illustrate them with examples.
This in turn naturally leads to test files that start with the simplest
features, and logically progress to complications and edge cases.  A coherent
narrative is the result, instead of a collection of isolated functions that test
isolated bits of functionality seemingly at random.  It’s a different attitude,
and produces different results, blurring the distinction between testing and
explaining.

Regression testing is best confined to dedicated objects or files.  There are
several options for organizing tests:


@itemize *

@item 
Write text files containing test cases as interactive examples, and test the
files using @ref{48bb,,testfile()} or @ref{48ea,,DocFileSuite()}.  This is recommended,
although is easiest to do for new projects, designed from the start to use
doctest.

@item 
Define functions named @code{_regrtest_topic} that consist of single docstrings,
containing test cases for the named topics.  These functions can be included in
the same file as the module, or separated out into a separate test file.

@item 
Define a @ref{48c7,,__test__} dictionary mapping from regression test topics to
docstrings containing test cases.
@end itemize

When you have placed your tests in a module, the module can itself be the test
runner.  When a test fails, you can arrange for your test runner to re-run only
the failing doctest while you debug the problem.  Here is a minimal example of
such a test runner:

@example
if __name__ == '__main__':
    import doctest
    flags = doctest.REPORT_NDIFF|doctest.FAIL_FAST
    if len(sys.argv) > 1:
        name = sys.argv[1]
        if name in globals():
            obj = globals()[name]
        else:
            obj = __test__[name]
        doctest.run_docstring_examples(obj, globals(), name=name,
                                       optionflags=flags)
    else:
        fail, total = doctest.testmod(optionflags=flags)
        print(f"@{fail@} failures out of @{total@} tests")
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node unittest — Unit testing framework,unittest mock — mock object library,doctest — Test interactive Python examples,Development Tools
@anchor{library/unittest doc}@anchor{4928}@anchor{library/unittest module-unittest}@anchor{10d}@anchor{library/unittest translation-repo}@anchor{4929}@anchor{library/unittest unittest-unit-testing-framework}@anchor{492a}
@subsection @code{unittest} — Unit testing framework


@geindex module; unittest

`Source code:' Lib/unittest/__init__.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/unittest/__init__.py}


__________________________________________________________________


(If you are already familiar with the basic concepts of testing, you might want
to skip to @ref{492b,,the list of assert methods}.)

The @code{unittest} unit testing framework was originally inspired by JUnit
and has a similar flavor as major unit testing frameworks in other
languages.  It supports test automation, sharing of setup and shutdown code
for tests, aggregation of tests into collections, and independence of the
tests from the reporting framework.

To achieve this, @code{unittest} supports some important concepts in an
object-oriented way:


@table @asis

@item test fixture

A `test fixture' represents the preparation needed to perform one or more
tests, and any associated cleanup actions.  This may involve, for example,
creating temporary or proxy databases, directories, or starting a server
process.

@item test case

A `test case' is the individual unit of testing.  It checks for a specific
response to a particular set of inputs.  @code{unittest} provides a base class,
@ref{2b5,,TestCase}, which may be used to create new test cases.

@item test suite

A `test suite' is a collection of test cases, test suites, or both.  It is
used to aggregate tests that should be executed together.

@item test runner

A `test runner' is a component which orchestrates the execution of tests
and provides the outcome to the user.  The runner may use a graphical interface,
a textual interface, or return a special value to indicate the results of
executing the tests.
@end table


@subsubheading See also



@table @asis

@item Module @ref{3e,,doctest}

Another test-support module with a very different flavor.

@item Simple Smalltalk Testing: With Patterns@footnote{https://web.archive.org/web/20150315073817/http://www.xprogramming.com/testfram.htm}

Kent Beck’s original paper on testing frameworks using the pattern shared
by @code{unittest}.

@item pytest@footnote{https://docs.pytest.org/}

Third-party unittest framework with a lighter-weight syntax for writing
tests.  For example, @code{assert func(10) == 42}.

@item The Python Testing Tools Taxonomy@footnote{https://wiki.python.org/moin/PythonTestingToolsTaxonomy}

An extensive list of Python testing tools including functional testing
frameworks and mock object libraries.

@item Testing in Python Mailing List@footnote{http://lists.idyll.org/listinfo/testing-in-python}

A special-interest-group for discussion of testing, and testing tools,
in Python.
@end table

The script @code{Tools/unittestgui/unittestgui.py} in the Python source distribution is
a GUI tool for test discovery and execution.  This is intended largely for ease of use
for those new to unit testing.  For production environments it is
recommended that tests be driven by a continuous integration system such as
Buildbot@footnote{https://buildbot.net/}, Jenkins@footnote{https://www.jenkins.io/},
GitHub Actions@footnote{https://github.com/features/actions}, or
AppVeyor@footnote{https://www.appveyor.com/}.


@menu
* Basic example:: 
* Command-Line Interface: Command-Line Interface<2>. 
* Test Discovery:: 
* Organizing test code:: 
* Re-using old test code:: 
* Skipping tests and expected failures:: 
* Distinguishing test iterations using subtests:: 
* Classes and functions:: 
* Class and Module Fixtures:: 
* Signal Handling:: 

@end menu

@node Basic example,Command-Line Interface<2>,,unittest — Unit testing framework
@anchor{library/unittest basic-example}@anchor{492c}@anchor{library/unittest unittest-minimal-example}@anchor{492d}
@subsubsection Basic example


The @code{unittest} module provides a rich set of tools for constructing and
running tests.  This section demonstrates that a small subset of the tools
suffice to meet the needs of most users.

Here is a short script to test three string methods:

@example
import unittest

class TestStringMethods(unittest.TestCase):

    def test_upper(self):
        self.assertEqual('foo'.upper(), 'FOO')

    def test_isupper(self):
        self.assertTrue('FOO'.isupper())
        self.assertFalse('Foo'.isupper())

    def test_split(self):
        s = 'hello world'
        self.assertEqual(s.split(), ['hello', 'world'])
        # check that s.split fails when the separator is not a string
        with self.assertRaises(TypeError):
            s.split(2)

if __name__ == '__main__':
    unittest.main()
@end example

A test case is created by subclassing @ref{2b5,,unittest.TestCase}.  The three
individual tests are defined with methods whose names start with the letters
@code{test}.  This naming convention informs the test runner about which methods
represent tests.

The crux of each test is a call to @ref{74d,,assertEqual()} to check for an
expected result; @ref{74b,,assertTrue()} or @ref{74c,,assertFalse()}
to verify a condition; or @ref{751,,assertRaises()} to verify that a
specific exception gets raised.  These methods are used instead of the
@ref{b66,,assert} statement so the test runner can accumulate all test results
and produce a report.

The @ref{1545,,setUp()} and @ref{1546,,tearDown()} methods allow you
to define instructions that will be executed before and after each test method.
They are covered in more detail in the section @ref{492e,,Organizing test code}.

The final block shows a simple way to run the tests. @ref{11e9,,unittest.main()}
provides a command-line interface to the test script.  When run from the command
line, the above script produces an output that looks like this:

@example
...
----------------------------------------------------------------------
Ran 3 tests in 0.000s

OK
@end example

Passing the @code{-v} option to your test script will instruct @ref{11e9,,unittest.main()}
to enable a higher level of verbosity, and produce the following output:

@example
test_isupper (__main__.TestStringMethods.test_isupper) ... ok
test_split (__main__.TestStringMethods.test_split) ... ok
test_upper (__main__.TestStringMethods.test_upper) ... ok

----------------------------------------------------------------------
Ran 3 tests in 0.001s

OK
@end example

The above examples show the most commonly used @code{unittest} features which
are sufficient to meet many everyday testing needs.  The remainder of the
documentation explores the full feature set from first principles.


Changed in version 3.11: The behavior of returning a value from a test method (other than the default
@code{None} value), is now deprecated.


@node Command-Line Interface<2>,Test Discovery,Basic example,unittest — Unit testing framework
@anchor{library/unittest command-line-interface}@anchor{492f}@anchor{library/unittest unittest-command-line-interface}@anchor{4930}
@subsubsection Command-Line Interface


The unittest module can be used from the command line to run tests from
modules, classes or even individual test methods:

@example
python -m unittest test_module1 test_module2
python -m unittest test_module.TestClass
python -m unittest test_module.TestClass.test_method
@end example

You can pass in a list with any combination of module names, and fully
qualified class or method names.

Test modules can be specified by file path as well:

@example
python -m unittest tests/test_something.py
@end example

This allows you to use the shell filename completion to specify the test module.
The file specified must still be importable as a module. The path is converted
to a module name by removing the ‘.py’ and converting path separators into ‘.’.
If you want to execute a test file that isn’t importable as a module you should
execute the file directly instead.

You can run tests with more detail (higher verbosity) by passing in the -v flag:

@example
python -m unittest -v test_module
@end example

When executed without arguments @ref{4931,,Test Discovery} is started:

@example
python -m unittest
@end example

For a list of all the command-line options:

@example
python -m unittest -h
@end example


Changed in version 3.2: In earlier versions it was only possible to run individual test methods and
not modules or classes.



Added in version 3.14: Output is colorized by default and can be
@ref{1b9,,controlled using environment variables}.


@menu
* Command-line options: Command-line options<5>. 

@end menu

@node Command-line options<5>,,,Command-Line Interface<2>
@anchor{library/unittest command-line-options}@anchor{4932}
@subsubsection Command-line options


@code{unittest} supports these command-line options:

@geindex unittest command line option; -b
@geindex unittest command line option; --buffer
@anchor{library/unittest cmdoption-unittest-b}@anchor{153d}@anchor{library/unittest cmdoption-unittest-buffer}@anchor{4933}
@deffn {Option} @w{-}b, @w{-}@w{-}buffer

The standard output and standard error streams are buffered during the test
run. Output during a passing test is discarded. Output is echoed normally
on test fail or error and is added to the failure messages.
@end deffn

@geindex unittest command line option; -c
@geindex unittest command line option; --catch
@anchor{library/unittest cmdoption-unittest-c}@anchor{153e}@anchor{library/unittest cmdoption-unittest-catch}@anchor{4934}
@deffn {Option} @w{-}c, @w{-}@w{-}catch

@code{Control}-@code{C} during the test run waits for the current test to end and then
reports all the results so far. A second @code{Control}-@code{C} raises the normal
@ref{bcb,,KeyboardInterrupt} exception.

See @ref{4935,,Signal Handling} for the functions that provide this functionality.
@end deffn

@geindex unittest command line option; -f
@geindex unittest command line option; --failfast
@anchor{library/unittest cmdoption-unittest-f}@anchor{1540}@anchor{library/unittest cmdoption-unittest-failfast}@anchor{4936}
@deffn {Option} @w{-}f, @w{-}@w{-}failfast

Stop the test run on the first error or failure.
@end deffn

@geindex unittest command line option; -k
@anchor{library/unittest cmdoption-unittest-k}@anchor{4937}
@deffn {Option} @w{-}k

Only run test methods and classes that match the pattern or substring.
This option may be used multiple times, in which case all test cases that
match any of the given patterns are included.

Patterns that contain a wildcard character (@code{*}) are matched against the
test name using @ref{1c98,,fnmatch.fnmatchcase()}; otherwise simple case-sensitive
substring matching is used.

Patterns are matched against the fully qualified test method name as
imported by the test loader.

For example, @code{-k foo} matches @code{foo_tests.SomeTest.test_something},
@code{bar_tests.SomeTest.test_foo}, but not @code{bar_tests.FooTest.test_something}.
@end deffn

@geindex unittest command line option; --locals
@anchor{library/unittest cmdoption-unittest-locals}@anchor{4938}
@deffn {Option} @w{-}@w{-}locals

Show local variables in tracebacks.
@end deffn

@geindex unittest command line option; --durations
@anchor{library/unittest cmdoption-unittest-durations}@anchor{4939}
@deffn {Option} @w{-}@w{-}durations N

Show the N slowest test cases (N=0 for all).
@end deffn


Added in version 3.2: The command-line options @code{-b}, @code{-c} and @code{-f} were added.



Added in version 3.5: The command-line option @code{--locals}.



Added in version 3.7: The command-line option @code{-k}.



Added in version 3.12: The command-line option @code{--durations}.


The command line can also be used for test discovery, for running all of the
tests in a project or just a subset.

@node Test Discovery,Organizing test code,Command-Line Interface<2>,unittest — Unit testing framework
@anchor{library/unittest test-discovery}@anchor{493a}@anchor{library/unittest unittest-test-discovery}@anchor{4931}
@subsubsection Test Discovery



Added in version 3.2.


Unittest supports simple test discovery. In order to be compatible with test
discovery, all of the test files must be @ref{2082,,modules} or
@ref{2092,,packages} importable from the top-level directory of
the project (this means that their filenames must be valid @ref{22e4,,identifiers}).

Test discovery is implemented in @ref{11eb,,TestLoader.discover()}, but can also be
used from the command line. The basic command-line usage is:

@example
cd project_directory
python -m unittest discover
@end example

@cartouche
@quotation Note 
As a shortcut, @code{python -m unittest} is the equivalent of
@code{python -m unittest discover}. If you want to pass arguments to test
discovery the @code{discover} sub-command must be used explicitly.
@end quotation
@end cartouche

The @code{discover} sub-command has the following options:

@geindex unittest-discover command line option; -v
@geindex unittest-discover command line option; --verbose
@anchor{library/unittest cmdoption-unittest-discover-v}@anchor{493b}@anchor{library/unittest cmdoption-unittest-discover-verbose}@anchor{493c}
@deffn {Option} @w{-}v, @w{-}@w{-}verbose

Verbose output
@end deffn

@geindex unittest-discover command line option; -s
@geindex unittest-discover command line option; --start-directory
@anchor{library/unittest cmdoption-unittest-discover-s}@anchor{493d}@anchor{library/unittest cmdoption-unittest-discover-start-directory}@anchor{493e}
@deffn {Option} @w{-}s, @w{-}@w{-}start@w{-}directory directory

Directory to start discovery (@code{.} default)
@end deffn

@geindex unittest-discover command line option; -p
@geindex unittest-discover command line option; --pattern
@anchor{library/unittest cmdoption-unittest-discover-p}@anchor{493f}@anchor{library/unittest cmdoption-unittest-discover-pattern}@anchor{4940}
@deffn {Option} @w{-}p, @w{-}@w{-}pattern pattern

Pattern to match test files (@code{test*.py} default)
@end deffn

@geindex unittest-discover command line option; -t
@geindex unittest-discover command line option; --top-level-directory
@anchor{library/unittest cmdoption-unittest-discover-t}@anchor{4941}@anchor{library/unittest cmdoption-unittest-discover-top-level-directory}@anchor{4942}
@deffn {Option} @w{-}t, @w{-}@w{-}top@w{-}level@w{-}directory directory

Top level directory of project (defaults to start directory)
@end deffn

The @ref{493d,,-s}, @ref{493f,,-p}, and @ref{4941,,-t} options can be passed in
as positional arguments in that order. The following two command lines
are equivalent:

@example
python -m unittest discover -s project_directory -p "*_test.py"
python -m unittest discover project_directory "*_test.py"
@end example

As well as being a path it is possible to pass a package name, for example
@code{myproject.subpackage.test}, as the start directory. The package name you
supply will then be imported and its location on the filesystem will be used
as the start directory.

@cartouche
@quotation Caution 
Test discovery loads tests by importing them. Once test discovery has found
all the test files from the start directory you specify it turns the paths
into package names to import. For example @code{foo/bar/baz.py} will be
imported as @code{foo.bar.baz}.

If you have a package installed globally and attempt test discovery on
a different copy of the package then the import `could' happen from the
wrong place. If this happens test discovery will warn you and exit.

If you supply the start directory as a package name rather than a
path to a directory then discover assumes that whichever location it
imports from is the location you intended, so you will not get the
warning.
@end quotation
@end cartouche

Test modules and packages can customize test loading and discovery by through
the @ref{4943,,load_tests protocol}.


Changed in version 3.4: Test discovery supports @ref{2b4,,namespace packages}.



Changed in version 3.11: Test discovery dropped the @ref{2b4,,namespace packages}
support. It has been broken since Python 3.7.
Start directory and its subdirectories containing tests must be regular
package that have @code{__init__.py} file.

If the start directory is the dotted name of the package, the ancestor packages
can be namespace packages.



Changed in version 3.14: Test discovery supports @ref{2b4,,namespace package} as start directory again.
To avoid scanning directories unrelated to Python,
tests are not searched in subdirectories that do not contain @code{__init__.py}.


@node Organizing test code,Re-using old test code,Test Discovery,unittest — Unit testing framework
@anchor{library/unittest organizing-test-code}@anchor{4944}@anchor{library/unittest organizing-tests}@anchor{492e}
@subsubsection Organizing test code


The basic building blocks of unit testing are `test cases' — single
scenarios that must be set up and checked for correctness.  In @code{unittest},
test cases are represented by @ref{2b5,,unittest.TestCase} instances.
To make your own test cases you must write subclasses of
@ref{2b5,,TestCase} or use @ref{1abf,,FunctionTestCase}.

The testing code of a @ref{2b5,,TestCase} instance should be entirely self
contained, such that it can be run either in isolation or in arbitrary
combination with any number of other test cases.

The simplest @ref{2b5,,TestCase} subclass will simply implement a test method
(i.e. a method whose name starts with @code{test}) in order to perform specific
testing code:

@example
import unittest

class DefaultWidgetSizeTestCase(unittest.TestCase):
    def test_default_widget_size(self):
        widget = Widget('The widget')
        self.assertEqual(widget.size(), (50, 50))
@end example

Note that in order to test something, we use one of the @ref{492b,,assert* methods}
provided by the @ref{2b5,,TestCase} base class.  If the test fails, an
exception will be raised with an explanatory message, and @code{unittest}
will identify the test case as a `failure'.  Any other exceptions will be
treated as `errors'.

Tests can be numerous, and their set-up can be repetitive.  Luckily, we
can factor out set-up code by implementing a method called
@ref{1545,,setUp()}, which the testing framework will automatically
call for every single test we run:

@example
import unittest

class WidgetTestCase(unittest.TestCase):
    def setUp(self):
        self.widget = Widget('The widget')

    def test_default_widget_size(self):
        self.assertEqual(self.widget.size(), (50,50),
                         'incorrect default size')

    def test_widget_resize(self):
        self.widget.resize(100,150)
        self.assertEqual(self.widget.size(), (100,150),
                         'wrong size after resize')
@end example

@cartouche
@quotation Note 
The order in which the various tests will be run is determined
by sorting the test method names with respect to the built-in
ordering for strings.
@end quotation
@end cartouche

If the @ref{1545,,setUp()} method raises an exception while the test is
running, the framework will consider the test to have suffered an error, and
the test method will not be executed.

Similarly, we can provide a @ref{1546,,tearDown()} method that tidies up
after the test method has been run:

@example
import unittest

class WidgetTestCase(unittest.TestCase):
    def setUp(self):
        self.widget = Widget('The widget')

    def tearDown(self):
        self.widget.dispose()
@end example

If @ref{1545,,setUp()} succeeded, @ref{1546,,tearDown()} will be
run whether the test method succeeded or not.

Such a working environment for the testing code is called a
`test fixture'.  A new TestCase instance is created as a unique
test fixture used to execute each individual test method.  Thus
@ref{1545,,setUp()}, @ref{1546,,tearDown()}, and @code{TestCase.__init__()}
will be called once per test.

It is recommended that you use TestCase implementations to group tests together
according to the features they test.  @code{unittest} provides a mechanism for
this: the `test suite', represented by @code{unittest}’s
@ref{ffb,,TestSuite} class.  In most cases, calling @ref{11e9,,unittest.main()} will do
the right thing and collect all the module’s test cases for you and execute
them.

However, should you want to customize the building of your test suite,
you can do it yourself:

@example
def suite():
    suite = unittest.TestSuite()
    suite.addTest(WidgetTestCase('test_default_widget_size'))
    suite.addTest(WidgetTestCase('test_widget_resize'))
    return suite

if __name__ == '__main__':
    runner = unittest.TextTestRunner()
    runner.run(suite())
@end example

You can place the definitions of test cases and test suites in the same modules
as the code they are to test (such as @code{widget.py}), but there are several
advantages to placing the test code in a separate module, such as
@code{test_widget.py}:


@itemize *

@item 
The test module can be run standalone from the command line.

@item 
The test code can more easily be separated from shipped code.

@item 
There is less temptation to change test code to fit the code it tests without
a good reason.

@item 
Test code should be modified much less frequently than the code it tests.

@item 
Tested code can be refactored more easily.

@item 
Tests for modules written in C must be in separate modules anyway, so why not
be consistent?

@item 
If the testing strategy changes, there is no need to change the source code.
@end itemize

@node Re-using old test code,Skipping tests and expected failures,Organizing test code,unittest — Unit testing framework
@anchor{library/unittest legacy-unit-tests}@anchor{4945}@anchor{library/unittest re-using-old-test-code}@anchor{4946}
@subsubsection Re-using old test code


Some users will find that they have existing test code that they would like to
run from @code{unittest}, without converting every old test function to a
@ref{2b5,,TestCase} subclass.

For this reason, @code{unittest} provides a @ref{1abf,,FunctionTestCase} class.
This subclass of @ref{2b5,,TestCase} can be used to wrap an existing test
function.  Set-up and tear-down functions can also be provided.

Given the following test function:

@example
def testSomething():
    something = makeSomething()
    assert something.name is not None
    # ...
@end example

one can create an equivalent test case instance as follows, with optional
set-up and tear-down methods:

@example
testcase = unittest.FunctionTestCase(testSomething,
                                     setUp=makeSomethingDB,
                                     tearDown=deleteSomethingDB)
@end example

@cartouche
@quotation Note 
Even though @ref{1abf,,FunctionTestCase} can be used to quickly convert an
existing test base over to a @code{unittest}-based system, this approach is
not recommended.  Taking the time to set up proper @ref{2b5,,TestCase}
subclasses will make future test refactorings infinitely easier.
@end quotation
@end cartouche

In some cases, the existing tests may have been written using the @ref{3e,,doctest}
module.  If so, @code{doctest} provides a @ref{ffa,,DocTestSuite} class that can
automatically build @ref{ffb,,unittest.TestSuite} instances from the existing
@code{doctest}-based tests.

@node Skipping tests and expected failures,Distinguishing test iterations using subtests,Re-using old test code,unittest — Unit testing framework
@anchor{library/unittest skipping-tests-and-expected-failures}@anchor{4947}@anchor{library/unittest unittest-skipping}@anchor{4948}
@subsubsection Skipping tests and expected failures



Added in version 3.1.


Unittest supports skipping individual test methods and even whole classes of
tests.  In addition, it supports marking a test as an “expected failure,” a test
that is broken and will fail, but shouldn’t be counted as a failure on a
@ref{1373,,TestResult}.

Skipping a test is simply a matter of using the @ref{1e00,,skip()} @ref{93f,,decorator}
or one of its conditional variants, calling @ref{4949,,TestCase.skipTest()} within a
@ref{1545,,setUp()} or test method, or raising @ref{11ea,,SkipTest} directly.

Basic skipping looks like this:

@example
class MyTestCase(unittest.TestCase):

    @@unittest.skip("demonstrating skipping")
    def test_nothing(self):
        self.fail("shouldn't happen")

    @@unittest.skipIf(mylib.__version__ < (1, 3),
                     "not supported in this library version")
    def test_format(self):
        # Tests that work for only a certain version of the library.
        pass

    @@unittest.skipUnless(sys.platform.startswith("win"), "requires Windows")
    def test_windows_support(self):
        # windows specific testing code
        pass

    def test_maybe_skipped(self):
        if not external_resource_available():
            self.skipTest("external resource not available")
        # test code that depends on the external resource
        pass
@end example

This is the output of running the example above in verbose mode:

@example
test_format (__main__.MyTestCase.test_format) ... skipped 'not supported in this library version'
test_nothing (__main__.MyTestCase.test_nothing) ... skipped 'demonstrating skipping'
test_maybe_skipped (__main__.MyTestCase.test_maybe_skipped) ... skipped 'external resource not available'
test_windows_support (__main__.MyTestCase.test_windows_support) ... skipped 'requires Windows'

----------------------------------------------------------------------
Ran 4 tests in 0.005s

OK (skipped=4)
@end example

Classes can be skipped just like methods:

@example
@@unittest.skip("showing class skipping")
class MySkippedTestCase(unittest.TestCase):
    def test_not_run(self):
        pass
@end example

@ref{1545,,TestCase.setUp()} can also skip the test.  This is useful when a resource
that needs to be set up is not available.

Expected failures use the @ref{494a,,expectedFailure()} decorator.

@example
class ExpectedFailureTestCase(unittest.TestCase):
    @@unittest.expectedFailure
    def test_fail(self):
        self.assertEqual(1, 0, "broken")
@end example

It’s easy to roll your own skipping decorators by making a decorator that calls
@ref{1e00,,skip()} on the test when it wants it to be skipped.  This decorator skips
the test unless the passed object has a certain attribute:

@example
def skipUnlessHasattr(obj, attr):
    if hasattr(obj, attr):
        return lambda func: func
    return unittest.skip("@{!r@} doesn't have @{!r@}".format(obj, attr))
@end example

The following decorators and exception implement test skipping and expected failures:

@geindex skip() (in module unittest)
@anchor{library/unittest unittest skip}@anchor{1e00}
@deffn {Function} @@unittest.skip (reason)

Unconditionally skip the decorated test.  `reason' should describe why the
test is being skipped.
@end deffn

@geindex skipIf() (in module unittest)
@anchor{library/unittest unittest skipIf}@anchor{494b}
@deffn {Function} @@unittest.skipIf (condition, reason)

Skip the decorated test if `condition' is true.
@end deffn

@geindex skipUnless() (in module unittest)
@anchor{library/unittest unittest skipUnless}@anchor{494c}
@deffn {Function} @@unittest.skipUnless (condition, reason)

Skip the decorated test unless `condition' is true.
@end deffn

@geindex expectedFailure() (in module unittest)
@anchor{library/unittest unittest expectedFailure}@anchor{494a}
@deffn {Function} @@unittest.expectedFailure

Mark the test as an expected failure or error.  If the test fails or errors
in the test function itself (rather than in one of the `test fixture'
methods) then it will be considered a success.  If the test passes, it will
be considered a failure.
@end deffn

@geindex SkipTest
@anchor{library/unittest unittest SkipTest}@anchor{11ea}
@deffn {Exception} unittest.SkipTest (reason)

This exception is raised to skip a test.

Usually you can use @ref{4949,,TestCase.skipTest()} or one of the skipping
decorators instead of raising this directly.
@end deffn

Skipped tests will not have @ref{1545,,setUp()} or @ref{1546,,tearDown()} run around them.
Skipped classes will not have @ref{c49,,setUpClass()} or @ref{1543,,tearDownClass()} run.
Skipped modules will not have @ref{c48,,setUpModule()} or @ref{1542,,tearDownModule()} run.

@node Distinguishing test iterations using subtests,Classes and functions,Skipping tests and expected failures,unittest — Unit testing framework
@anchor{library/unittest distinguishing-test-iterations-using-subtests}@anchor{494d}@anchor{library/unittest subtests}@anchor{11e8}
@subsubsection Distinguishing test iterations using subtests



Added in version 3.4.


When there are very small differences among your tests, for
instance some parameters, unittest allows you to distinguish them inside
the body of a test method using the @ref{11e7,,subTest()} context manager.

For example, the following test:

@example
class NumbersTest(unittest.TestCase):

    def test_even(self):
        """
        Test that numbers between 0 and 5 are all even.
        """
        for i in range(0, 6):
            with self.subTest(i=i):
                self.assertEqual(i % 2, 0)
@end example

will produce the following output:

@example
======================================================================
FAIL: test_even (__main__.NumbersTest.test_even) (i=1)
Test that numbers between 0 and 5 are all even.
----------------------------------------------------------------------
Traceback (most recent call last):
  File "subtests.py", line 11, in test_even
    self.assertEqual(i % 2, 0)
    ^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: 1 != 0

======================================================================
FAIL: test_even (__main__.NumbersTest.test_even) (i=3)
Test that numbers between 0 and 5 are all even.
----------------------------------------------------------------------
Traceback (most recent call last):
  File "subtests.py", line 11, in test_even
    self.assertEqual(i % 2, 0)
    ^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: 1 != 0

======================================================================
FAIL: test_even (__main__.NumbersTest.test_even) (i=5)
Test that numbers between 0 and 5 are all even.
----------------------------------------------------------------------
Traceback (most recent call last):
  File "subtests.py", line 11, in test_even
    self.assertEqual(i % 2, 0)
    ^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: 1 != 0
@end example

Without using a subtest, execution would stop after the first failure,
and the error would be less easy to diagnose because the value of @code{i}
wouldn’t be displayed:

@example
======================================================================
FAIL: test_even (__main__.NumbersTest.test_even)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "subtests.py", line 32, in test_even
    self.assertEqual(i % 2, 0)
AssertionError: 1 != 0
@end example

@node Classes and functions,Class and Module Fixtures,Distinguishing test iterations using subtests,unittest — Unit testing framework
@anchor{library/unittest classes-and-functions}@anchor{494e}@anchor{library/unittest unittest-contents}@anchor{494f}
@subsubsection Classes and functions


This section describes in depth the API of @code{unittest}.

@menu
* Test cases:: 
* Grouping tests:: 
* Loading and running tests:: 

@end menu

@node Test cases,Grouping tests,,Classes and functions
@anchor{library/unittest test-cases}@anchor{4950}@anchor{library/unittest testcase-objects}@anchor{4951}
@subsubsection Test cases


@geindex TestCase (class in unittest)
@anchor{library/unittest unittest TestCase}@anchor{2b5}
@deffn {Class} unittest.TestCase (methodName='runTest')

Instances of the @code{TestCase} class represent the logical test units
in the @code{unittest} universe.  This class is intended to be used as a base
class, with specific tests being implemented by concrete subclasses.  This class
implements the interface needed by the test runner to allow it to drive the
tests, and methods that the test code can use to check for and report various
kinds of failure.

Each instance of @code{TestCase} will run a single base method: the method
named `methodName'.
In most uses of @code{TestCase}, you will neither change
the `methodName' nor reimplement the default @code{runTest()} method.


Changed in version 3.2: @code{TestCase} can be instantiated successfully without providing a
`methodName'. This makes it easier to experiment with @code{TestCase}
from the interactive interpreter.


@code{TestCase} instances provide three groups of methods: one group used
to run the test, another used by the test implementation to check conditions
and report failures, and some inquiry methods allowing information about the
test itself to be gathered.

Methods in the first group (running the test) are:

@geindex setUp() (unittest.TestCase method)
@anchor{library/unittest unittest TestCase setUp}@anchor{1545}
@deffn {Method} setUp ()

Method called to prepare the test fixture.  This is called immediately
before calling the test method; other than @ref{8ba,,AssertionError} or @ref{11ea,,SkipTest},
any exception raised by this method will be considered an error rather than
a test failure. The default implementation does nothing.
@end deffn

@geindex tearDown() (unittest.TestCase method)
@anchor{library/unittest unittest TestCase tearDown}@anchor{1546}
@deffn {Method} tearDown ()

Method called immediately after the test method has been called and the
result recorded.  This is called even if the test method raised an
exception, so the implementation in subclasses may need to be particularly
careful about checking internal state.  Any exception, other than
@ref{8ba,,AssertionError} or @ref{11ea,,SkipTest}, raised by this method will be
considered an additional error rather than a test failure (thus increasing
the total number of reported errors). This method will only be called if
the @ref{1545,,setUp()} succeeds, regardless of the outcome of the test method.
The default implementation does nothing.
@end deffn

@geindex setUpClass() (unittest.TestCase method)
@anchor{library/unittest unittest TestCase setUpClass}@anchor{c49}
@deffn {Method} setUpClass ()

A class method called before tests in an individual class are run.
@code{setUpClass} is called with the class as the only argument
and must be decorated as a @ref{48f,,classmethod()}:

@example
@@classmethod
def setUpClass(cls):
    ...
@end example

See @ref{4952,,Class and Module Fixtures} for more details.


Added in version 3.2.

@end deffn

@geindex tearDownClass() (unittest.TestCase method)
@anchor{library/unittest unittest TestCase tearDownClass}@anchor{1543}
@deffn {Method} tearDownClass ()

A class method called after tests in an individual class have run.
@code{tearDownClass} is called with the class as the only argument
and must be decorated as a @ref{48f,,classmethod()}:

@example
@@classmethod
def tearDownClass(cls):
    ...
@end example

See @ref{4952,,Class and Module Fixtures} for more details.


Added in version 3.2.

@end deffn

@geindex run() (unittest.TestCase method)
@anchor{library/unittest unittest TestCase run}@anchor{1372}
@deffn {Method} run (result=None)

Run the test, collecting the result into the @ref{1373,,TestResult} object
passed as `result'.  If `result' is omitted or @code{None}, a temporary
result object is created (by calling the @ref{4953,,defaultTestResult()}
method) and used. The result object is returned to @code{run()}’s
caller.

The same effect may be had by simply calling the @code{TestCase}
instance.


Changed in version 3.3: Previous versions of @code{run} did not return the result. Neither did
calling an instance.

@end deffn

@geindex skipTest() (unittest.TestCase method)
@anchor{library/unittest unittest TestCase skipTest}@anchor{4949}
@deffn {Method} skipTest (reason)

Calling this during a test method or @ref{1545,,setUp()} skips the current
test.  See @ref{4948,,Skipping tests and expected failures} for more information.


Added in version 3.1.

@end deffn

@geindex subTest() (unittest.TestCase method)
@anchor{library/unittest unittest TestCase subTest}@anchor{11e7}
@deffn {Method} subTest (msg=None, **params)

Return a context manager which executes the enclosed code block as a
subtest.  `msg' and `params' are optional, arbitrary values which are
displayed whenever a subtest fails, allowing you to identify them
clearly.

A test case can contain any number of subtest declarations, and
they can be arbitrarily nested.

See @ref{11e8,,Distinguishing test iterations using subtests} for more information.


Added in version 3.4.

@end deffn

@geindex debug() (unittest.TestCase method)
@anchor{library/unittest unittest TestCase debug}@anchor{1c8c}
@deffn {Method} debug ()

Run the test without collecting the result.  This allows exceptions raised
by the test to be propagated to the caller, and can be used to support
running tests under a debugger.
@end deffn
@anchor{library/unittest assert-methods}@anchor{492b}
The @code{TestCase} class provides several assert methods to check for and
report failures.  The following table lists the most commonly used methods
(see the tables below for more assert methods):


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxx} 
@headitem

Method

@tab

Checks that

@tab

New in

@item

@ref{74d,,assertEqual(a@comma{} b)}

@tab

@code{a == b}

@tab

@item

@ref{74e,,assertNotEqual(a@comma{} b)}

@tab

@code{a != b}

@tab

@item

@ref{74b,,assertTrue(x)}

@tab

@code{bool(x) is True}

@tab

@item

@ref{74c,,assertFalse(x)}

@tab

@code{bool(x) is False}

@tab

@item

@ref{1547,,assertIs(a@comma{} b)}

@tab

@code{a is b}

@tab

3.1

@item

@ref{1548,,assertIsNot(a@comma{} b)}

@tab

@code{a is not b}

@tab

3.1

@item

@ref{1496,,assertIsNone(x)}

@tab

@code{x is None}

@tab

3.1

@item

@ref{1497,,assertIsNotNone(x)}

@tab

@code{x is not None}

@tab

3.1

@item

@ref{1550,,assertIn(a@comma{} b)}

@tab

@code{a in b}

@tab

3.1

@item

@ref{1551,,assertNotIn(a@comma{} b)}

@tab

@code{a not in b}

@tab

3.1

@item

@ref{1549,,assertIsInstance(a@comma{} b)}

@tab

@code{isinstance(a, b)}

@tab

3.2

@item

@ref{154a,,assertNotIsInstance(a@comma{} b)}

@tab

@code{not isinstance(a, b)}

@tab

3.2

@item

@ref{2b8,,assertIsSubclass(a@comma{} b)}

@tab

@code{issubclass(a, b)}

@tab

3.14

@item

@ref{2b9,,assertNotIsSubclass(a@comma{} b)}

@tab

@code{not issubclass(a, b)}

@tab

3.14

@end multitable


All the assert methods accept a `msg' argument that, if specified, is used
as the error message on failure (see also @ref{1541,,longMessage}).
Note that the `msg' keyword argument can be passed to @ref{751,,assertRaises()},
@ref{753,,assertRaisesRegex()}, @ref{1370,,assertWarns()}, @ref{1371,,assertWarnsRegex()}
only when they are used as a context manager.

@geindex assertEqual() (unittest.TestCase method)
@anchor{library/unittest unittest TestCase assertEqual}@anchor{74d}
@deffn {Method} assertEqual (first, second, msg=None)

Test that `first' and `second' are equal.  If the values do not
compare equal, the test will fail.

In addition, if `first' and `second' are the exact same type and one of
list, tuple, dict, set, frozenset or str or any type that a subclass
registers with @ref{1554,,addTypeEqualityFunc()} the type-specific equality
function will be called in order to generate a more useful default
error message (see also the @ref{4954,,list of type-specific methods}).


Changed in version 3.1: Added the automatic calling of type-specific equality function.



Changed in version 3.2: @ref{154f,,assertMultiLineEqual()} added as the default type equality
function for comparing strings.

@end deffn

@geindex assertNotEqual() (unittest.TestCase method)
@anchor{library/unittest unittest TestCase assertNotEqual}@anchor{74e}
@deffn {Method} assertNotEqual (first, second, msg=None)

Test that `first' and `second' are not equal.  If the values do
compare equal, the test will fail.
@end deffn

@geindex assertTrue() (unittest.TestCase method)
@geindex assertFalse() (unittest.TestCase method)
@anchor{library/unittest unittest TestCase assertTrue}@anchor{74b}
@deffn {Method} assertTrue (expr, msg=None)
@anchor{library/unittest unittest TestCase assertFalse}@anchor{74c}
@deffnx {Method} assertFalse (expr, msg=None)

Test that `expr' is true (or false).

Note that this is equivalent to @code{bool(expr) is True} and not to @code{expr
is True} (use @code{assertIs(expr, True)} for the latter).  This method
should also be avoided when more specific methods are available (e.g.
@code{assertEqual(a, b)} instead of @code{assertTrue(a == b)}), because they
provide a better error message in case of failure.
@end deffn

@geindex assertIs() (unittest.TestCase method)
@geindex assertIsNot() (unittest.TestCase method)
@anchor{library/unittest unittest TestCase assertIs}@anchor{1547}
@deffn {Method} assertIs (first, second, msg=None)
@anchor{library/unittest unittest TestCase assertIsNot}@anchor{1548}
@deffnx {Method} assertIsNot (first, second, msg=None)

Test that `first' and `second' are (or are not) the same object.


Added in version 3.1.

@end deffn

@geindex assertIsNone() (unittest.TestCase method)
@geindex assertIsNotNone() (unittest.TestCase method)
@anchor{library/unittest unittest TestCase assertIsNone}@anchor{1496}
@deffn {Method} assertIsNone (expr, msg=None)
@anchor{library/unittest unittest TestCase assertIsNotNone}@anchor{1497}
@deffnx {Method} assertIsNotNone (expr, msg=None)

Test that `expr' is (or is not) @code{None}.


Added in version 3.1.

@end deffn

@geindex assertIn() (unittest.TestCase method)
@geindex assertNotIn() (unittest.TestCase method)
@anchor{library/unittest unittest TestCase assertIn}@anchor{1550}
@deffn {Method} assertIn (member, container, msg=None)
@anchor{library/unittest unittest TestCase assertNotIn}@anchor{1551}
@deffnx {Method} assertNotIn (member, container, msg=None)

Test that `member' is (or is not) in `container'.


Added in version 3.1.

@end deffn

@geindex assertIsInstance() (unittest.TestCase method)
@geindex assertNotIsInstance() (unittest.TestCase method)
@anchor{library/unittest unittest TestCase assertIsInstance}@anchor{1549}
@deffn {Method} assertIsInstance (obj, cls, msg=None)
@anchor{library/unittest unittest TestCase assertNotIsInstance}@anchor{154a}
@deffnx {Method} assertNotIsInstance (obj, cls, msg=None)

Test that `obj' is (or is not) an instance of `cls' (which can be a
class or a tuple of classes, as supported by @ref{2af,,isinstance()}).
To check for the exact type, use @ref{1547,,assertIs(type(obj)@comma{} cls)}.


Added in version 3.2.

@end deffn

@geindex assertIsSubclass() (unittest.TestCase method)
@geindex assertNotIsSubclass() (unittest.TestCase method)
@anchor{library/unittest unittest TestCase assertIsSubclass}@anchor{2b8}
@deffn {Method} assertIsSubclass (cls, superclass, msg=None)
@anchor{library/unittest unittest TestCase assertNotIsSubclass}@anchor{2b9}
@deffnx {Method} assertNotIsSubclass (cls, superclass, msg=None)

Test that `cls' is (or is not) a subclass of `superclass' (which can be a
class or a tuple of classes, as supported by @ref{9ca,,issubclass()}).
To check for the exact type, use @ref{1547,,assertIs(cls@comma{} superclass)}.


Added in version 3.14.

@end deffn

It is also possible to check the production of exceptions, warnings, and
log messages using the following methods:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxx} 
@headitem

Method

@tab

Checks that

@tab

New in

@item

@ref{751,,assertRaises(exc@comma{} fun@comma{} *args@comma{} **kwds)}

@tab

@code{fun(*args, **kwds)} raises `exc'

@tab

@item

@ref{753,,assertRaisesRegex(exc@comma{} r@comma{} fun@comma{} *args@comma{} **kwds)}

@tab

@code{fun(*args, **kwds)} raises `exc'
and the message matches regex `r'

@tab

3.1

@item

@ref{1370,,assertWarns(warn@comma{} fun@comma{} *args@comma{} **kwds)}

@tab

@code{fun(*args, **kwds)} raises `warn'

@tab

3.2

@item

@ref{1371,,assertWarnsRegex(warn@comma{} r@comma{} fun@comma{} *args@comma{} **kwds)}

@tab

@code{fun(*args, **kwds)} raises `warn'
and the message matches regex `r'

@tab

3.2

@item

@ref{a5f,,assertLogs(logger@comma{} level)}

@tab

The @code{with} block logs on `logger'
with minimum `level'

@tab

3.4

@item

@ref{a5e,,assertNoLogs(logger@comma{} level)}

@tab


@table @asis

@item The @code{with} block does not log on

`logger' with minimum `level'
@end table

@tab

3.10

@end multitable


@geindex assertRaises() (unittest.TestCase method)
@anchor{library/unittest unittest TestCase assertRaises}@anchor{751}
@deffn {Method} assertRaises (exception, callable, *args, **kwds)

@deffnx {Method} assertRaises (exception, *, msg=None)

Test that an exception is raised when `callable' is called with any
positional or keyword arguments that are also passed to
@code{assertRaises()}.  The test passes if `exception' is raised, is an
error if another exception is raised, or fails if no exception is raised.
To catch any of a group of exceptions, a tuple containing the exception
classes may be passed as `exception'.

If only the `exception' and possibly the `msg' arguments are given,
return a context manager so that the code under test can be written
inline rather than as a function:

@example
with self.assertRaises(SomeException):
    do_something()
@end example

When used as a context manager, @code{assertRaises()} accepts the
additional keyword argument `msg'.

The context manager will store the caught exception object in its
@code{exception} attribute.  This can be useful if the intention
is to perform additional checks on the exception raised:

@example
with self.assertRaises(SomeException) as cm:
    do_something()

the_exception = cm.exception
self.assertEqual(the_exception.error_code, 3)
@end example


Changed in version 3.1: Added the ability to use @code{assertRaises()} as a context manager.



Changed in version 3.2: Added the @code{exception} attribute.



Changed in version 3.3: Added the `msg' keyword argument when used as a context manager.

@end deffn

@geindex assertRaisesRegex() (unittest.TestCase method)
@anchor{library/unittest unittest TestCase assertRaisesRegex}@anchor{753}
@deffn {Method} assertRaisesRegex (exception, regex, callable, *args, **kwds)

@deffnx {Method} assertRaisesRegex (exception, regex, *, msg=None)

Like @ref{751,,assertRaises()} but also tests that `regex' matches
on the string representation of the raised exception.  `regex' may be
a regular expression object or a string containing a regular expression
suitable for use by @ref{1438,,re.search()}.  Examples:

@example
self.assertRaisesRegex(ValueError, "invalid literal for.*XYZ'$",
                       int, 'XYZ')
@end example

or:

@example
with self.assertRaisesRegex(ValueError, 'literal'):
   int('XYZ')
@end example


Added in version 3.1: Added under the name @code{assertRaisesRegexp}.



Changed in version 3.2: Renamed to @code{assertRaisesRegex()}.



Changed in version 3.3: Added the `msg' keyword argument when used as a context manager.

@end deffn

@geindex assertWarns() (unittest.TestCase method)
@anchor{library/unittest unittest TestCase assertWarns}@anchor{1370}
@deffn {Method} assertWarns (warning, callable, *args, **kwds)

@deffnx {Method} assertWarns (warning, *, msg=None)

Test that a warning is triggered when `callable' is called with any
positional or keyword arguments that are also passed to
@code{assertWarns()}.  The test passes if `warning' is triggered and
fails if it isn’t.  Any exception is an error.
To catch any of a group of warnings, a tuple containing the warning
classes may be passed as `warnings'.

If only the `warning' and possibly the `msg' arguments are given,
return a context manager so that the code under test can be written
inline rather than as a function:

@example
with self.assertWarns(SomeWarning):
    do_something()
@end example

When used as a context manager, @code{assertWarns()} accepts the
additional keyword argument `msg'.

The context manager will store the caught warning object in its
@code{warning} attribute, and the source line which triggered the
warnings in the @code{filename} and @code{lineno} attributes.
This can be useful if the intention is to perform additional checks
on the warning caught:

@example
with self.assertWarns(SomeWarning) as cm:
    do_something()

self.assertIn('myfile.py', cm.filename)
self.assertEqual(320, cm.lineno)
@end example

This method works regardless of the warning filters in place when it
is called.


Added in version 3.2.



Changed in version 3.3: Added the `msg' keyword argument when used as a context manager.

@end deffn

@geindex assertWarnsRegex() (unittest.TestCase method)
@anchor{library/unittest unittest TestCase assertWarnsRegex}@anchor{1371}
@deffn {Method} assertWarnsRegex (warning, regex, callable, *args, **kwds)

@deffnx {Method} assertWarnsRegex (warning, regex, *, msg=None)

Like @ref{1370,,assertWarns()} but also tests that `regex' matches on the
message of the triggered warning.  `regex' may be a regular expression
object or a string containing a regular expression suitable for use
by @ref{1438,,re.search()}.  Example:

@example
self.assertWarnsRegex(DeprecationWarning,
                      r'legacy_function\(\) is deprecated',
                      legacy_function, 'XYZ')
@end example

or:

@example
with self.assertWarnsRegex(RuntimeWarning, 'unsafe frobnicating'):
    frobnicate('/etc/passwd')
@end example


Added in version 3.2.



Changed in version 3.3: Added the `msg' keyword argument when used as a context manager.

@end deffn

@geindex assertLogs() (unittest.TestCase method)
@anchor{library/unittest unittest TestCase assertLogs}@anchor{a5f}
@deffn {Method} assertLogs (logger=None, level=None)

A context manager to test that at least one message is logged on
the `logger' or one of its children, with at least the given
`level'.

If given, `logger' should be a @ref{d4c,,logging.Logger} object or a
@ref{16a,,str} giving the name of a logger.  The default is the root
logger, which will catch all messages that were not blocked by a
non-propagating descendent logger.

If given, `level' should be either a numeric logging level or
its string equivalent (for example either @code{"ERROR"} or
@ref{2124,,logging.ERROR}).  The default is @ref{2122,,logging.INFO}.

The test passes if at least one message emitted inside the @code{with}
block matches the `logger' and `level' conditions, otherwise it fails.

The object returned by the context manager is a recording helper
which keeps tracks of the matching log messages.  It has two
attributes:

@geindex records (unittest.TestCase attribute)
@anchor{library/unittest unittest TestCase records}@anchor{4955}
@deffn {Attribute} records

A list of @ref{11ec,,logging.LogRecord} objects of the matching
log messages.
@end deffn

@geindex output (unittest.TestCase attribute)
@anchor{library/unittest unittest TestCase output}@anchor{4956}
@deffn {Attribute} output

A list of @ref{16a,,str} objects with the formatted output of
matching messages.
@end deffn

Example:

@example
with self.assertLogs('foo', level='INFO') as cm:
    logging.getLogger('foo').info('first message')
    logging.getLogger('foo.bar').error('second message')
self.assertEqual(cm.output, ['INFO:foo:first message',
                             'ERROR:foo.bar:second message'])
@end example


Added in version 3.4.

@end deffn

@geindex assertNoLogs() (unittest.TestCase method)
@anchor{library/unittest unittest TestCase assertNoLogs}@anchor{a5e}
@deffn {Method} assertNoLogs (logger=None, level=None)

A context manager to test that no messages are logged on
the `logger' or one of its children, with at least the given
`level'.

If given, `logger' should be a @ref{d4c,,logging.Logger} object or a
@ref{16a,,str} giving the name of a logger.  The default is the root
logger, which will catch all messages.

If given, `level' should be either a numeric logging level or
its string equivalent (for example either @code{"ERROR"} or
@ref{2124,,logging.ERROR}).  The default is @ref{2122,,logging.INFO}.

Unlike @ref{a5f,,assertLogs()}, nothing will be returned by the context
manager.


Added in version 3.10.

@end deffn

There are also other methods used to perform more specific checks, such as:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxx} 
@headitem

Method

@tab

Checks that

@tab

New in

@item

@ref{74f,,assertAlmostEqual(a@comma{} b)}

@tab

@code{round(a-b, 7) == 0}

@tab

@item

@ref{750,,assertNotAlmostEqual(a@comma{} b)}

@tab

@code{round(a-b, 7) != 0}

@tab

@item

@ref{154b,,assertGreater(a@comma{} b)}

@tab

@code{a > b}

@tab

3.1

@item

@ref{154c,,assertGreaterEqual(a@comma{} b)}

@tab

@code{a >= b}

@tab

3.1

@item

@ref{154d,,assertLess(a@comma{} b)}

@tab

@code{a < b}

@tab

3.1

@item

@ref{154e,,assertLessEqual(a@comma{} b)}

@tab

@code{a <= b}

@tab

3.1

@item

@ref{752,,assertRegex(s@comma{} r)}

@tab

@code{r.search(s)}

@tab

3.1

@item

@ref{754,,assertNotRegex(s@comma{} r)}

@tab

@code{not r.search(s)}

@tab

3.2

@item

@ref{1436,,assertCountEqual(a@comma{} b)}

@tab

`a' contains the same elements
as `b', regardless of their
order.

@tab

3.2

@item

@ref{2ba,,assertStartsWith(a@comma{} b)}

@tab

@code{a.startswith(b)}

@tab

3.14

@item

@ref{2bb,,assertNotStartsWith(a@comma{} b)}

@tab

@code{not a.startswith(b)}

@tab

3.14

@item

@ref{2bc,,assertEndsWith(a@comma{} b)}

@tab

@code{a.endswith(b)}

@tab

3.14

@item

@ref{2bd,,assertNotEndsWith(a@comma{} b)}

@tab

@code{not a.endswith(b)}

@tab

3.14

@item

@ref{2b6,,assertHasAttr(a@comma{} b)}

@tab

@code{hasattr(a, b)}

@tab

3.14

@item

@ref{2b7,,assertNotHasAttr(a@comma{} b)}

@tab

@code{not hasattr(a, b)}

@tab

3.14

@end multitable


@geindex assertAlmostEqual() (unittest.TestCase method)
@geindex assertNotAlmostEqual() (unittest.TestCase method)
@anchor{library/unittest unittest TestCase assertAlmostEqual}@anchor{74f}
@deffn {Method} assertAlmostEqual (first, second, places=7, msg=None, delta=None)
@anchor{library/unittest unittest TestCase assertNotAlmostEqual}@anchor{750}
@deffnx {Method} assertNotAlmostEqual (first, second, places=7, msg=None, delta=None)

Test that `first' and `second' are approximately (or not approximately)
equal by computing the difference, rounding to the given number of
decimal `places' (default 7), and comparing to zero.  Note that these
methods round the values to the given number of `decimal places' (i.e.
like the @ref{14e6,,round()} function) and not `significant digits'.

If `delta' is supplied instead of `places' then the difference
between `first' and `second' must be less or equal to (or greater than) `delta'.

Supplying both `delta' and `places' raises a @ref{199,,TypeError}.


Changed in version 3.2: @code{assertAlmostEqual()} automatically considers almost equal objects
that compare equal.  @code{assertNotAlmostEqual()} automatically fails
if the objects compare equal.  Added the `delta' keyword argument.

@end deffn

@geindex assertGreater() (unittest.TestCase method)
@geindex assertGreaterEqual() (unittest.TestCase method)
@geindex assertLess() (unittest.TestCase method)
@geindex assertLessEqual() (unittest.TestCase method)
@anchor{library/unittest unittest TestCase assertGreater}@anchor{154b}
@deffn {Method} assertGreater (first, second, msg=None)
@anchor{library/unittest unittest TestCase assertGreaterEqual}@anchor{154c}
@deffnx {Method} assertGreaterEqual (first, second, msg=None)
@anchor{library/unittest unittest TestCase assertLess}@anchor{154d}
@deffnx {Method} assertLess (first, second, msg=None)
@anchor{library/unittest unittest TestCase assertLessEqual}@anchor{154e}
@deffnx {Method} assertLessEqual (first, second, msg=None)

Test that `first' is respectively >, >=, < or <= than `second' depending
on the method name.  If not, the test will fail:

@example
>>> self.assertGreaterEqual(3, 4)
AssertionError: "3" unexpectedly not greater than or equal to "4"
@end example


Added in version 3.1.

@end deffn

@geindex assertRegex() (unittest.TestCase method)
@geindex assertNotRegex() (unittest.TestCase method)
@anchor{library/unittest unittest TestCase assertRegex}@anchor{752}
@deffn {Method} assertRegex (text, regex, msg=None)
@anchor{library/unittest unittest TestCase assertNotRegex}@anchor{754}
@deffnx {Method} assertNotRegex (text, regex, msg=None)

Test that a `regex' search matches (or does not match) `text'.  In case
of failure, the error message will include the pattern and the `text' (or
the pattern and the part of `text' that unexpectedly matched).  `regex'
may be a regular expression object or a string containing a regular
expression suitable for use by @ref{1438,,re.search()}.


Added in version 3.1: Added under the name @code{assertRegexpMatches}.



Changed in version 3.2: The method @code{assertRegexpMatches()} has been renamed to
@code{assertRegex()}.



Added in version 3.2: @code{assertNotRegex()}.

@end deffn

@geindex assertCountEqual() (unittest.TestCase method)
@anchor{library/unittest unittest TestCase assertCountEqual}@anchor{1436}
@deffn {Method} assertCountEqual (first, second, msg=None)

Test that sequence `first' contains the same elements as `second',
regardless of their order. When they don’t, an error message listing the
differences between the sequences will be generated.

Duplicate elements are `not' ignored when comparing `first' and
`second'. It verifies whether each element has the same count in both
sequences. Equivalent to:
@code{assertEqual(Counter(list(first)), Counter(list(second)))}
but works with sequences of unhashable objects as well.


Added in version 3.2.

@end deffn

@geindex assertStartsWith() (unittest.TestCase method)
@anchor{library/unittest unittest TestCase assertStartsWith}@anchor{2ba}
@deffn {Method} assertStartsWith (s, prefix, msg=None)
@end deffn

@geindex assertNotStartsWith() (unittest.TestCase method)
@anchor{library/unittest unittest TestCase assertNotStartsWith}@anchor{2bb}
@deffn {Method} assertNotStartsWith (s, prefix, msg=None)

Test that the Unicode or byte string `s' starts (or does not start)
with a `prefix'.
`prefix' can also be a tuple of strings to try.


Added in version 3.14.

@end deffn

@geindex assertEndsWith() (unittest.TestCase method)
@anchor{library/unittest unittest TestCase assertEndsWith}@anchor{2bc}
@deffn {Method} assertEndsWith (s, suffix, msg=None)
@end deffn

@geindex assertNotEndsWith() (unittest.TestCase method)
@anchor{library/unittest unittest TestCase assertNotEndsWith}@anchor{2bd}
@deffn {Method} assertNotEndsWith (s, suffix, msg=None)

Test that the Unicode or byte string `s' ends (or does not end)
with a `suffix'.
`suffix' can also be a tuple of strings to try.


Added in version 3.14.

@end deffn

@geindex assertHasAttr() (unittest.TestCase method)
@anchor{library/unittest unittest TestCase assertHasAttr}@anchor{2b6}
@deffn {Method} assertHasAttr (obj, name, msg=None)
@end deffn

@geindex assertNotHasAttr() (unittest.TestCase method)
@anchor{library/unittest unittest TestCase assertNotHasAttr}@anchor{2b7}
@deffn {Method} assertNotHasAttr (obj, name, msg=None)

Test that the object `obj' has (or has not) an attribute `name'.


Added in version 3.14.

@end deffn
@anchor{library/unittest type-specific-methods}@anchor{4954}
The @ref{74d,,assertEqual()} method dispatches the equality check for objects of
the same type to different type-specific methods.  These methods are already
implemented for most of the built-in types, but it’s also possible to
register new methods using @ref{1554,,addTypeEqualityFunc()}:

@geindex addTypeEqualityFunc() (unittest.TestCase method)
@anchor{library/unittest unittest TestCase addTypeEqualityFunc}@anchor{1554}
@deffn {Method} addTypeEqualityFunc (typeobj, function)

Registers a type-specific method called by @ref{74d,,assertEqual()} to check
if two objects of exactly the same `typeobj' (not subclasses) compare
equal.  `function' must take two positional arguments and a third msg=None
keyword argument just as @code{assertEqual()} does.  It must raise
@ref{48eb,,self.failureException(msg)} when inequality
between the first two parameters is detected – possibly providing useful
information and explaining the inequalities in details in the error
message.


Added in version 3.1.

@end deffn

The list of type-specific methods automatically used by
@ref{74d,,assertEqual()} are summarized in the following table.  Note
that it’s usually not necessary to invoke these methods directly.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxx} 
@headitem

Method

@tab

Used to compare

@tab

New in

@item

@ref{154f,,assertMultiLineEqual(a@comma{} b)}

@tab

strings

@tab

3.1

@item

@ref{1495,,assertSequenceEqual(a@comma{} b)}

@tab

sequences

@tab

3.1

@item

@ref{1493,,assertListEqual(a@comma{} b)}

@tab

lists

@tab

3.1

@item

@ref{1494,,assertTupleEqual(a@comma{} b)}

@tab

tuples

@tab

3.1

@item

@ref{1491,,assertSetEqual(a@comma{} b)}

@tab

sets or frozensets

@tab

3.1

@item

@ref{1492,,assertDictEqual(a@comma{} b)}

@tab

dicts

@tab

3.1

@end multitable


@geindex assertMultiLineEqual() (unittest.TestCase method)
@anchor{library/unittest unittest TestCase assertMultiLineEqual}@anchor{154f}
@deffn {Method} assertMultiLineEqual (first, second, msg=None)

Test that the multiline string `first' is equal to the string `second'.
When not equal a diff of the two strings highlighting the differences
will be included in the error message. This method is used by default
when comparing strings with @ref{74d,,assertEqual()}.


Added in version 3.1.

@end deffn

@geindex assertSequenceEqual() (unittest.TestCase method)
@anchor{library/unittest unittest TestCase assertSequenceEqual}@anchor{1495}
@deffn {Method} assertSequenceEqual (first, second, msg=None, seq_type=None)

Tests that two sequences are equal.  If a `seq_type' is supplied, both
`first' and `second' must be instances of `seq_type' or a failure will
be raised.  If the sequences are different an error message is
constructed that shows the difference between the two.

This method is not called directly by @ref{74d,,assertEqual()}, but
it’s used to implement @ref{1493,,assertListEqual()} and
@ref{1494,,assertTupleEqual()}.


Added in version 3.1.

@end deffn

@geindex assertListEqual() (unittest.TestCase method)
@geindex assertTupleEqual() (unittest.TestCase method)
@anchor{library/unittest unittest TestCase assertListEqual}@anchor{1493}
@deffn {Method} assertListEqual (first, second, msg=None)
@anchor{library/unittest unittest TestCase assertTupleEqual}@anchor{1494}
@deffnx {Method} assertTupleEqual (first, second, msg=None)

Tests that two lists or tuples are equal.  If not, an error message is
constructed that shows only the differences between the two.  An error
is also raised if either of the parameters are of the wrong type.
These methods are used by default when comparing lists or tuples with
@ref{74d,,assertEqual()}.


Added in version 3.1.

@end deffn

@geindex assertSetEqual() (unittest.TestCase method)
@anchor{library/unittest unittest TestCase assertSetEqual}@anchor{1491}
@deffn {Method} assertSetEqual (first, second, msg=None)

Tests that two sets are equal.  If not, an error message is constructed
that lists the differences between the sets.  This method is used by
default when comparing sets or frozensets with @ref{74d,,assertEqual()}.

Fails if either of `first' or `second' does not have a @ref{26e1,,difference()}
method.


Added in version 3.1.

@end deffn

@geindex assertDictEqual() (unittest.TestCase method)
@anchor{library/unittest unittest TestCase assertDictEqual}@anchor{1492}
@deffn {Method} assertDictEqual (first, second, msg=None)

Test that two dictionaries are equal.  If not, an error message is
constructed that shows the differences in the dictionaries. This
method will be used by default to compare dictionaries in
calls to @ref{74d,,assertEqual()}.


Added in version 3.1.

@end deffn
@anchor{library/unittest other-methods-and-attrs}@anchor{4957}
Finally the @code{TestCase} provides the following methods and attributes:

@geindex fail() (unittest.TestCase method)
@anchor{library/unittest unittest TestCase fail}@anchor{4958}
@deffn {Method} fail (msg=None)

Signals a test failure unconditionally, with `msg' or @code{None} for
the error message.
@end deffn

@geindex failureException (unittest.TestCase attribute)
@anchor{library/unittest unittest TestCase failureException}@anchor{48eb}
@deffn {Attribute} failureException

This class attribute gives the exception raised by the test method.  If a
test framework needs to use a specialized exception, possibly to carry
additional information, it must subclass this exception in order to “play
fair” with the framework.  The initial value of this attribute is
@ref{8ba,,AssertionError}.
@end deffn

@geindex longMessage (unittest.TestCase attribute)
@anchor{library/unittest unittest TestCase longMessage}@anchor{1541}
@deffn {Attribute} longMessage

This class attribute determines what happens when a custom failure message
is passed as the msg argument to an assertXYY call that fails.
@code{True} is the default value. In this case, the custom message is appended
to the end of the standard failure message.
When set to @code{False}, the custom message replaces the standard message.

The class setting can be overridden in individual test methods by assigning
an instance attribute, self.longMessage, to @code{True} or @code{False} before
calling the assert methods.

The class setting gets reset before each test call.


Added in version 3.1.

@end deffn

@geindex maxDiff (unittest.TestCase attribute)
@anchor{library/unittest unittest TestCase maxDiff}@anchor{1437}
@deffn {Attribute} maxDiff

This attribute controls the maximum length of diffs output by assert
methods that report diffs on failure. It defaults to 80*8 characters.
Assert methods affected by this attribute are
@ref{1495,,assertSequenceEqual()} (including all the sequence comparison
methods that delegate to it), @ref{1492,,assertDictEqual()} and
@ref{154f,,assertMultiLineEqual()}.

Setting @code{maxDiff} to @code{None} means that there is no maximum length of
diffs.


Added in version 3.2.

@end deffn

Testing frameworks can use the following methods to collect information on
the test:

@geindex countTestCases() (unittest.TestCase method)
@anchor{library/unittest unittest TestCase countTestCases}@anchor{4959}
@deffn {Method} countTestCases ()

Return the number of tests represented by this test object.  For
@code{TestCase} instances, this will always be @code{1}.
@end deffn

@geindex defaultTestResult() (unittest.TestCase method)
@anchor{library/unittest unittest TestCase defaultTestResult}@anchor{4953}
@deffn {Method} defaultTestResult ()

Return an instance of the test result class that should be used for this
test case class (if no other result instance is provided to the
@ref{1372,,run()} method).

For @code{TestCase} instances, this will always be an instance of
@ref{1373,,TestResult}; subclasses of @code{TestCase} should override this
as necessary.
@end deffn

@geindex id() (unittest.TestCase method)
@anchor{library/unittest unittest TestCase id}@anchor{495a}
@deffn {Method} id ()

Return a string identifying the specific test case.  This is usually the
full name of the test method, including the module and class name.
@end deffn

@geindex shortDescription() (unittest.TestCase method)
@anchor{library/unittest unittest TestCase shortDescription}@anchor{495b}
@deffn {Method} shortDescription ()

Returns a description of the test, or @code{None} if no description
has been provided.  The default implementation of this method
returns the first line of the test method’s docstring, if available,
or @code{None}.


Changed in version 3.1: In 3.1 this was changed to add the test name to the short description
even in the presence of a docstring.  This caused compatibility issues
with unittest extensions and adding the test name was moved to the
@ref{755,,TextTestResult} in Python 3.2.

@end deffn

@geindex addCleanup() (unittest.TestCase method)
@anchor{library/unittest unittest TestCase addCleanup}@anchor{c7a}
@deffn {Method} addCleanup (function, /, *args, **kwargs)

Add a function to be called after @ref{1546,,tearDown()} to cleanup resources
used during the test. Functions will be called in reverse order to the
order they are added (@abbr{LIFO}).  They
are called with any arguments and keyword arguments passed into
@code{addCleanup()} when they are added.

If @ref{1545,,setUp()} fails, meaning that @ref{1546,,tearDown()} is not called,
then any cleanup functions added will still be called.


Added in version 3.1.

@end deffn

@geindex enterContext() (unittest.TestCase method)
@anchor{library/unittest unittest TestCase enterContext}@anchor{8ca}
@deffn {Method} enterContext (cm)

Enter the supplied @ref{1e3,,context manager}.  If successful, also
add its @ref{150c,,__exit__()} method as a cleanup function by
@ref{c7a,,addCleanup()} and return the result of the
@ref{7e5,,__enter__()} method.


Added in version 3.11.

@end deffn

@geindex doCleanups() (unittest.TestCase method)
@anchor{library/unittest unittest TestCase doCleanups}@anchor{1544}
@deffn {Method} doCleanups ()

This method is called unconditionally after @ref{1546,,tearDown()}, or
after @ref{1545,,setUp()} if @code{setUp()} raises an exception.

It is responsible for calling all the cleanup functions added by
@ref{c7a,,addCleanup()}. If you need cleanup functions to be called
`prior' to @ref{1546,,tearDown()} then you can call @code{doCleanups()}
yourself.

@code{doCleanups()} pops methods off the stack of cleanup
functions one at a time, so it can be called at any time.


Added in version 3.1.

@end deffn

@geindex addClassCleanup() (unittest.TestCase class method)
@anchor{library/unittest unittest TestCase addClassCleanup}@anchor{c47}
@deffn {Method} classmethod addClassCleanup (function, /, *args, **kwargs)

Add a function to be called after @ref{1543,,tearDownClass()} to cleanup
resources used during the test class. Functions will be called in reverse
order to the order they are added (@abbr{LIFO}).
They are called with any arguments and keyword arguments passed into
@code{addClassCleanup()} when they are added.

If @ref{c49,,setUpClass()} fails, meaning that @ref{1543,,tearDownClass()} is not
called, then any cleanup functions added will still be called.


Added in version 3.8.

@end deffn

@geindex enterClassContext() (unittest.TestCase class method)
@anchor{library/unittest unittest TestCase enterClassContext}@anchor{8cb}
@deffn {Method} classmethod enterClassContext (cm)

Enter the supplied @ref{1e3,,context manager}.  If successful, also
add its @ref{150c,,__exit__()} method as a cleanup function by
@ref{c47,,addClassCleanup()} and return the result of the
@ref{7e5,,__enter__()} method.


Added in version 3.11.

@end deffn

@geindex doClassCleanups() (unittest.TestCase class method)
@anchor{library/unittest unittest TestCase doClassCleanups}@anchor{495c}
@deffn {Method} classmethod doClassCleanups ()

This method is called unconditionally after @ref{1543,,tearDownClass()}, or
after @ref{c49,,setUpClass()} if @code{setUpClass()} raises an exception.

It is responsible for calling all the cleanup functions added by
@ref{c47,,addClassCleanup()}. If you need cleanup functions to be called
`prior' to @ref{1543,,tearDownClass()} then you can call
@code{doClassCleanups()} yourself.

@code{doClassCleanups()} pops methods off the stack of cleanup
functions one at a time, so it can be called at any time.


Added in version 3.8.

@end deffn
@end deffn

@geindex IsolatedAsyncioTestCase (class in unittest)
@anchor{library/unittest unittest IsolatedAsyncioTestCase}@anchor{35f}
@deffn {Class} unittest.IsolatedAsyncioTestCase (methodName='runTest')

This class provides an API similar to @ref{2b5,,TestCase} and also accepts
coroutines as test functions.


Added in version 3.8.


@geindex loop_factory (unittest.IsolatedAsyncioTestCase attribute)
@anchor{library/unittest unittest IsolatedAsyncioTestCase loop_factory}@anchor{495d}
@deffn {Attribute} loop_factory

The `loop_factory' passed to @ref{2f7,,asyncio.Runner}. Override
in subclasses with @ref{1aad,,asyncio.EventLoop} to avoid using the
asyncio policy system.


Added in version 3.13.

@end deffn

@geindex asyncSetUp() (unittest.IsolatedAsyncioTestCase method)
@anchor{library/unittest unittest IsolatedAsyncioTestCase asyncSetUp}@anchor{495e}
@deffn {Method} async asyncSetUp ()

Method called to prepare the test fixture. This is called after @ref{1545,,TestCase.setUp()}.
This is called immediately before calling the test method; other than
@ref{8ba,,AssertionError} or @ref{11ea,,SkipTest}, any exception raised by this method
will be considered an error rather than a test failure. The default implementation
does nothing.
@end deffn

@geindex asyncTearDown() (unittest.IsolatedAsyncioTestCase method)
@anchor{library/unittest unittest IsolatedAsyncioTestCase asyncTearDown}@anchor{495f}
@deffn {Method} async asyncTearDown ()

Method called immediately after the test method has been called and the
result recorded.  This is called before @ref{1546,,tearDown()}. This is called even if
the test method raised an exception, so the implementation in subclasses may need
to be particularly careful about checking internal state.  Any exception, other than
@ref{8ba,,AssertionError} or @ref{11ea,,SkipTest}, raised by this method will be
considered an additional error rather than a test failure (thus increasing
the total number of reported errors). This method will only be called if
the @ref{495e,,asyncSetUp()} succeeds, regardless of the outcome of the test method.
The default implementation does nothing.
@end deffn

@geindex addAsyncCleanup() (unittest.IsolatedAsyncioTestCase method)
@anchor{library/unittest unittest IsolatedAsyncioTestCase addAsyncCleanup}@anchor{4960}
@deffn {Method} addAsyncCleanup (function, /, *args, **kwargs)

This method accepts a coroutine that can be used as a cleanup function.
@end deffn

@geindex enterAsyncContext() (unittest.IsolatedAsyncioTestCase method)
@anchor{library/unittest unittest IsolatedAsyncioTestCase enterAsyncContext}@anchor{8cc}
@deffn {Method} async enterAsyncContext (cm)

Enter the supplied @ref{7f1,,asynchronous context manager}.  If successful,
also add its @ref{19e4,,__aexit__()} method as a cleanup function by
@ref{4960,,addAsyncCleanup()} and return the result of the
@ref{2465,,__aenter__()} method.


Added in version 3.11.

@end deffn

@geindex run() (unittest.IsolatedAsyncioTestCase method)
@anchor{library/unittest unittest IsolatedAsyncioTestCase run}@anchor{4961}
@deffn {Method} run (result=None)

Sets up a new event loop to run the test, collecting the result into
the @ref{1373,,TestResult} object passed as `result'.  If `result' is
omitted or @code{None}, a temporary result object is created (by calling
the @ref{4953,,defaultTestResult()} method) and used. The result object is
returned to @code{run()}’s caller. At the end of the test all the tasks
in the event loop are cancelled.
@end deffn

An example illustrating the order:

@example
from unittest import IsolatedAsyncioTestCase

events = []


class Test(IsolatedAsyncioTestCase):


    def setUp(self):
        events.append("setUp")

    async def asyncSetUp(self):
        self._async_connection = await AsyncConnection()
        events.append("asyncSetUp")

    async def test_response(self):
        events.append("test_response")
        response = await self._async_connection.get("https://example.com")
        self.assertEqual(response.status_code, 200)
        self.addAsyncCleanup(self.on_cleanup)

    def tearDown(self):
        events.append("tearDown")

    async def asyncTearDown(self):
        await self._async_connection.close()
        events.append("asyncTearDown")

    async def on_cleanup(self):
        events.append("cleanup")

if __name__ == "__main__":
    unittest.main()
@end example

After running the test, @code{events} would contain @code{["setUp", "asyncSetUp", "test_response", "asyncTearDown", "tearDown", "cleanup"]}.
@end deffn

@geindex FunctionTestCase (class in unittest)
@anchor{library/unittest unittest FunctionTestCase}@anchor{1abf}
@deffn {Class} unittest.FunctionTestCase (testFunc, setUp=None, tearDown=None, description=None)

This class implements the portion of the @ref{2b5,,TestCase} interface which
allows the test runner to drive the test, but does not provide the methods
which test code can use to check and report errors.  This is used to create
test cases using legacy test code, allowing it to be integrated into a
@code{unittest}-based test framework.
@end deffn

@node Grouping tests,Loading and running tests,Test cases,Classes and functions
@anchor{library/unittest grouping-tests}@anchor{4962}@anchor{library/unittest testsuite-objects}@anchor{4963}
@subsubsection Grouping tests


@geindex TestSuite (class in unittest)
@anchor{library/unittest unittest TestSuite}@anchor{ffb}
@deffn {Class} unittest.TestSuite (tests=())

This class represents an aggregation of individual test cases and test suites.
The class presents the interface needed by the test runner to allow it to be run
as any other test case.  Running a @code{TestSuite} instance is the same as
iterating over the suite, running each test individually.

If `tests' is given, it must be an iterable of individual test cases or other
test suites that will be used to build the suite initially. Additional methods
are provided to add test cases and suites to the collection later on.

@code{TestSuite} objects behave much like @ref{2b5,,TestCase} objects, except
they do not actually implement a test.  Instead, they are used to aggregate
tests into groups of tests that should be run together. Some additional
methods are available to add tests to @code{TestSuite} instances:

@geindex addTest() (unittest.TestSuite method)
@anchor{library/unittest unittest TestSuite addTest}@anchor{4964}
@deffn {Method} addTest (test)

Add a @ref{2b5,,TestCase} or @code{TestSuite} to the suite.
@end deffn

@geindex addTests() (unittest.TestSuite method)
@anchor{library/unittest unittest TestSuite addTests}@anchor{4965}
@deffn {Method} addTests (tests)

Add all the tests from an iterable of @ref{2b5,,TestCase} and @code{TestSuite}
instances to this test suite.

This is equivalent to iterating over `tests', calling @ref{4964,,addTest()} for
each element.
@end deffn

@code{TestSuite} shares the following methods with @ref{2b5,,TestCase}:

@geindex run() (unittest.TestSuite method)
@anchor{library/unittest unittest TestSuite run}@anchor{4966}
@deffn {Method} run (result)

Run the tests associated with this suite, collecting the result into the
test result object passed as `result'.  Note that unlike
@ref{1372,,TestCase.run()}, @code{TestSuite.run()} requires the result object to
be passed in.
@end deffn

@geindex debug() (unittest.TestSuite method)
@anchor{library/unittest unittest TestSuite debug}@anchor{4967}
@deffn {Method} debug ()

Run the tests associated with this suite without collecting the
result. This allows exceptions raised by the test to be propagated to the
caller and can be used to support running tests under a debugger.
@end deffn

@geindex countTestCases() (unittest.TestSuite method)
@anchor{library/unittest unittest TestSuite countTestCases}@anchor{4968}
@deffn {Method} countTestCases ()

Return the number of tests represented by this test object, including all
individual tests and sub-suites.
@end deffn

@geindex __iter__() (unittest.TestSuite method)
@anchor{library/unittest unittest TestSuite __iter__}@anchor{122f}
@deffn {Method} __iter__ ()

Tests grouped by a @code{TestSuite} are always accessed by iteration.
Subclasses can lazily provide tests by overriding @code{__iter__()}. Note
that this method may be called several times on a single suite (for
example when counting tests or comparing for equality) so the tests
returned by repeated iterations before @ref{4966,,TestSuite.run()} must be the
same for each call iteration. After @code{TestSuite.run()}, callers should
not rely on the tests returned by this method unless the caller uses a
subclass that overrides @code{TestSuite._removeTestAtIndex()} to preserve
test references.


Changed in version 3.2: In earlier versions the @code{TestSuite} accessed tests directly rather
than through iteration, so overriding @code{__iter__()} wasn’t sufficient
for providing tests.



Changed in version 3.4: In earlier versions the @code{TestSuite} held references to each
@ref{2b5,,TestCase} after @ref{4966,,TestSuite.run()}. Subclasses can restore
that behavior by overriding @code{TestSuite._removeTestAtIndex()}.

@end deffn

In the typical usage of a @code{TestSuite} object, the @ref{4966,,run()} method
is invoked by a @code{TestRunner} rather than by the end-user test harness.
@end deffn

@node Loading and running tests,,Grouping tests,Classes and functions
@anchor{library/unittest loading-and-running-tests}@anchor{4969}
@subsubsection Loading and running tests


@geindex TestLoader (class in unittest)
@anchor{library/unittest unittest TestLoader}@anchor{593}
@deffn {Class} unittest.TestLoader

The @code{TestLoader} class is used to create test suites from classes and
modules.  Normally, there is no need to create an instance of this class; the
@code{unittest} module provides an instance that can be shared as
@ref{496a,,unittest.defaultTestLoader}.  Using a subclass or instance, however,
allows customization of some configurable properties.

@code{TestLoader} objects have the following attributes:

@geindex errors (unittest.TestLoader attribute)
@anchor{library/unittest unittest TestLoader errors}@anchor{1092}
@deffn {Attribute} errors

A list of the non-fatal errors encountered while loading tests. Not reset
by the loader at any point. Fatal errors are signalled by the relevant
method raising an exception to the caller. Non-fatal errors are also
indicated by a synthetic test that will raise the original error when
run.


Added in version 3.5.

@end deffn

@code{TestLoader} objects have the following methods:

@geindex loadTestsFromTestCase() (unittest.TestLoader method)
@anchor{library/unittest unittest TestLoader loadTestsFromTestCase}@anchor{595}
@deffn {Method} loadTestsFromTestCase (testCaseClass)

Return a suite of all test cases contained in the @ref{2b5,,TestCase}-derived
@code{testCaseClass}.

A test case instance is created for each method named by
@ref{596,,getTestCaseNames()}. By default these are the method names
beginning with @code{test}. If @code{getTestCaseNames()} returns no
methods, but the @code{runTest()} method is implemented, a single test
case is created for that method instead.
@end deffn

@geindex loadTestsFromModule() (unittest.TestLoader method)
@anchor{library/unittest unittest TestLoader loadTestsFromModule}@anchor{594}
@deffn {Method} loadTestsFromModule (module, *, pattern=None)

Return a suite of all test cases contained in the given module. This
method searches `module' for classes derived from @ref{2b5,,TestCase} and
creates an instance of the class for each test method defined for the
class.

@cartouche
@quotation Note 
While using a hierarchy of @ref{2b5,,TestCase}-derived classes can be
convenient in sharing fixtures and helper functions, defining test
methods on base classes that are not intended to be instantiated
directly does not play well with this method.  Doing so, however, can
be useful when the fixtures are different and defined in subclasses.
@end quotation
@end cartouche

If a module provides a @code{load_tests} function it will be called to
load the tests. This allows modules to customize test loading.
This is the @ref{4943,,load_tests protocol}.  The `pattern' argument is passed as
the third argument to @code{load_tests}.


Changed in version 3.2: Support for @code{load_tests} added.



Changed in version 3.5: Support for a keyword-only argument `pattern' has been added.



Changed in version 3.12: The undocumented and unofficial `use_load_tests' parameter has been
removed.

@end deffn

@geindex loadTestsFromName() (unittest.TestLoader method)
@anchor{library/unittest unittest TestLoader loadTestsFromName}@anchor{1552}
@deffn {Method} loadTestsFromName (name, module=None)

Return a suite of all test cases given a string specifier.

The specifier `name' is a “dotted name” that may resolve either to a
module, a test case class, a test method within a test case class, a
@ref{ffb,,TestSuite} instance, or a callable object which returns a
@ref{2b5,,TestCase} or @code{TestSuite} instance.  These checks are
applied in the order listed here; that is, a method on a possible test
case class will be picked up as “a test method within a test case class”,
rather than “a callable object”.

For example, if you have a module @code{SampleTests} containing a
@ref{2b5,,TestCase}-derived class @code{SampleTestCase} with three test
methods (@code{test_one()}, @code{test_two()}, and @code{test_three()}), the
specifier @code{'SampleTests.SampleTestCase'} would cause this method to
return a suite which will run all three test methods. Using the specifier
@code{'SampleTests.SampleTestCase.test_two'} would cause it to return a test
suite which will run only the @code{test_two()} test method. The specifier
can refer to modules and packages which have not been imported; they will
be imported as a side-effect.

The method optionally resolves `name' relative to the given `module'.


Changed in version 3.5: If an @ref{65b,,ImportError} or @ref{5f0,,AttributeError} occurs while traversing
`name' then a synthetic test that raises that error when run will be
returned. These errors are included in the errors accumulated by
self.errors.

@end deffn

@geindex loadTestsFromNames() (unittest.TestLoader method)
@anchor{library/unittest unittest TestLoader loadTestsFromNames}@anchor{496b}
@deffn {Method} loadTestsFromNames (names, module=None)

Similar to @ref{1552,,loadTestsFromName()}, but takes a sequence of names rather
than a single name.  The return value is a test suite which supports all
the tests defined for each name.
@end deffn

@geindex getTestCaseNames() (unittest.TestLoader method)
@anchor{library/unittest unittest TestLoader getTestCaseNames}@anchor{596}
@deffn {Method} getTestCaseNames (testCaseClass)

Return a sorted sequence of method names found within `testCaseClass';
this should be a subclass of @ref{2b5,,TestCase}.
@end deffn

@geindex discover() (unittest.TestLoader method)
@anchor{library/unittest unittest TestLoader discover}@anchor{11eb}
@deffn {Method} discover (start_dir, pattern='test*.py', top_level_dir=None)

Find all the test modules by recursing into subdirectories from the
specified start directory, and return a TestSuite object containing them.
Only test files that match `pattern' will be loaded. (Using shell style
pattern matching.) Only module names that are importable (i.e. are valid
Python identifiers) will be loaded.

All test modules must be importable from the top level of the project. If
the start directory is not the top level directory then `top_level_dir'
must be specified separately.

If importing a module fails, for example due to a syntax error, then
this will be recorded as a single error and discovery will continue.  If
the import failure is due to @ref{11ea,,SkipTest} being raised, it will be
recorded as a skip instead of an error.

If a package (a directory containing a file named @code{__init__.py}) is
found, the package will be checked for a @code{load_tests} function. If this
exists then it will be called
@code{package.load_tests(loader, tests, pattern)}. Test discovery takes care
to ensure that a package is only checked for tests once during an
invocation, even if the load_tests function itself calls
@code{loader.discover}.

If @code{load_tests} exists then discovery does `not' recurse into the
package, @code{load_tests} is responsible for loading all tests in the
package.

The pattern is deliberately not stored as a loader attribute so that
packages can continue discovery themselves.

`top_level_dir' is stored internally, and used as a default to any
nested calls to @code{discover()}. That is, if a package’s @code{load_tests}
calls @code{loader.discover()}, it does not need to pass this argument.

`start_dir' can be a dotted module name as well as a directory.


Added in version 3.2.



Changed in version 3.4: Modules that raise @ref{11ea,,SkipTest} on import are recorded as skips,
not errors.

`start_dir' can be a @ref{2b4,,namespace packages}.

Paths are sorted before being imported so that execution order is the
same even if the underlying file system’s ordering is not dependent
on file name.



Changed in version 3.5: Found packages are now checked for @code{load_tests} regardless of
whether their path matches `pattern', because it is impossible for
a package name to match the default pattern.



Changed in version 3.11: `start_dir' can not be a @ref{2b4,,namespace packages}.
It has been broken since Python 3.7, and Python 3.11 officially removes it.



Changed in version 3.13: `top_level_dir' is only stored for the duration of `discover' call.



Changed in version 3.14: `start_dir' can once again be a @ref{2b4,,namespace package}.

@end deffn

The following attributes of a @code{TestLoader} can be configured either by
subclassing or assignment on an instance:

@geindex testMethodPrefix (unittest.TestLoader attribute)
@anchor{library/unittest unittest TestLoader testMethodPrefix}@anchor{496c}
@deffn {Attribute} testMethodPrefix

String giving the prefix of method names which will be interpreted as test
methods.  The default value is @code{'test'}.

This affects @ref{596,,getTestCaseNames()} and all the @code{loadTestsFrom*}
methods.
@end deffn

@geindex sortTestMethodsUsing (unittest.TestLoader attribute)
@anchor{library/unittest unittest TestLoader sortTestMethodsUsing}@anchor{496d}
@deffn {Attribute} sortTestMethodsUsing

Function to be used to compare method names when sorting them in
@ref{596,,getTestCaseNames()} and all the @code{loadTestsFrom*} methods.
@end deffn

@geindex suiteClass (unittest.TestLoader attribute)
@anchor{library/unittest unittest TestLoader suiteClass}@anchor{1553}
@deffn {Attribute} suiteClass

Callable object that constructs a test suite from a list of tests. No
methods on the resulting object are needed.  The default value is the
@ref{ffb,,TestSuite} class.

This affects all the @code{loadTestsFrom*} methods.
@end deffn

@geindex testNamePatterns (unittest.TestLoader attribute)
@anchor{library/unittest unittest TestLoader testNamePatterns}@anchor{496e}
@deffn {Attribute} testNamePatterns

List of Unix shell-style wildcard test name patterns that test methods
have to match to be included in test suites (see @code{-k} option).

If this attribute is not @code{None} (the default), all test methods to be
included in test suites must match one of the patterns in this list.
Note that matches are always performed using @ref{1c98,,fnmatch.fnmatchcase()},
so unlike patterns passed to the @code{-k} option, simple substring patterns
will have to be converted using @code{*} wildcards.

This affects all the @code{loadTestsFrom*} methods.


Added in version 3.7.

@end deffn
@end deffn

@geindex TestResult (class in unittest)
@anchor{library/unittest unittest TestResult}@anchor{1373}
@deffn {Class} unittest.TestResult

This class is used to compile information about which tests have succeeded
and which have failed.

A @code{TestResult} object stores the results of a set of tests.  The
@ref{2b5,,TestCase} and @ref{ffb,,TestSuite} classes ensure that results are
properly recorded; test authors do not need to worry about recording the
outcome of tests.

Testing frameworks built on top of @code{unittest} may want access to the
@code{TestResult} object generated by running a set of tests for reporting
purposes; a @code{TestResult} instance is returned by the
@code{TestRunner.run()} method for this purpose.

@code{TestResult} instances have the following attributes that will be of
interest when inspecting the results of running a set of tests:

@geindex errors (unittest.TestResult attribute)
@anchor{library/unittest unittest TestResult errors}@anchor{496f}
@deffn {Attribute} errors

A list containing 2-tuples of @ref{2b5,,TestCase} instances and strings
holding formatted tracebacks. Each tuple represents a test which raised an
unexpected exception.
@end deffn

@geindex failures (unittest.TestResult attribute)
@anchor{library/unittest unittest TestResult failures}@anchor{4970}
@deffn {Attribute} failures

A list containing 2-tuples of @ref{2b5,,TestCase} instances and strings
holding formatted tracebacks. Each tuple represents a test where a failure
was explicitly signalled using the @ref{492b,,assert* methods}.
@end deffn

@geindex skipped (unittest.TestResult attribute)
@anchor{library/unittest unittest TestResult skipped}@anchor{4971}
@deffn {Attribute} skipped

A list containing 2-tuples of @ref{2b5,,TestCase} instances and strings
holding the reason for skipping the test.


Added in version 3.1.

@end deffn

@geindex expectedFailures (unittest.TestResult attribute)
@anchor{library/unittest unittest TestResult expectedFailures}@anchor{4972}
@deffn {Attribute} expectedFailures

A list containing 2-tuples of @ref{2b5,,TestCase} instances and strings
holding formatted tracebacks.  Each tuple represents an expected failure
or error of the test case.
@end deffn

@geindex unexpectedSuccesses (unittest.TestResult attribute)
@anchor{library/unittest unittest TestResult unexpectedSuccesses}@anchor{4973}
@deffn {Attribute} unexpectedSuccesses

A list containing @ref{2b5,,TestCase} instances that were marked as expected
failures, but succeeded.
@end deffn

@geindex collectedDurations (unittest.TestResult attribute)
@anchor{library/unittest unittest TestResult collectedDurations}@anchor{1ac2}
@deffn {Attribute} collectedDurations

A list containing 2-tuples of test case names and floats
representing the elapsed time of each test which was run.


Added in version 3.12.

@end deffn

@geindex shouldStop (unittest.TestResult attribute)
@anchor{library/unittest unittest TestResult shouldStop}@anchor{4974}
@deffn {Attribute} shouldStop

Set to @code{True} when the execution of tests should stop by @ref{4975,,stop()}.
@end deffn

@geindex testsRun (unittest.TestResult attribute)
@anchor{library/unittest unittest TestResult testsRun}@anchor{4976}
@deffn {Attribute} testsRun

The total number of tests run so far.
@end deffn

@geindex buffer (unittest.TestResult attribute)
@anchor{library/unittest unittest TestResult buffer}@anchor{4977}
@deffn {Attribute} buffer

If set to true, @code{sys.stdout} and @code{sys.stderr} will be buffered in between
@ref{4978,,startTest()} and @ref{4979,,stopTest()} being called. Collected output will
only be echoed onto the real @code{sys.stdout} and @code{sys.stderr} if the test
fails or errors. Any output is also attached to the failure / error message.


Added in version 3.2.

@end deffn

@geindex failfast (unittest.TestResult attribute)
@anchor{library/unittest unittest TestResult failfast}@anchor{497a}
@deffn {Attribute} failfast

If set to true @ref{4975,,stop()} will be called on the first failure or error,
halting the test run.


Added in version 3.2.

@end deffn

@geindex tb_locals (unittest.TestResult attribute)
@anchor{library/unittest unittest TestResult tb_locals}@anchor{497b}
@deffn {Attribute} tb_locals

If set to true then local variables will be shown in tracebacks.


Added in version 3.5.

@end deffn

@geindex wasSuccessful() (unittest.TestResult method)
@anchor{library/unittest unittest TestResult wasSuccessful}@anchor{497c}
@deffn {Method} wasSuccessful ()

Return @code{True} if all tests run so far have passed, otherwise returns
@code{False}.


Changed in version 3.4: Returns @code{False} if there were any @ref{4973,,unexpectedSuccesses}
from tests marked with the @ref{494a,,expectedFailure()} decorator.

@end deffn

@geindex stop() (unittest.TestResult method)
@anchor{library/unittest unittest TestResult stop}@anchor{4975}
@deffn {Method} stop ()

This method can be called to signal that the set of tests being run should
be aborted by setting the @ref{4974,,shouldStop} attribute to @code{True}.
@code{TestRunner} objects should respect this flag and return without
running any additional tests.

For example, this feature is used by the @ref{1afd,,TextTestRunner} class to
stop the test framework when the user signals an interrupt from the
keyboard.  Interactive tools which provide @code{TestRunner}
implementations can use this in a similar manner.
@end deffn

The following methods of the @code{TestResult} class are used to maintain
the internal data structures, and may be extended in subclasses to support
additional reporting requirements.  This is particularly useful in building
tools which support interactive reporting while tests are being run.

@geindex startTest() (unittest.TestResult method)
@anchor{library/unittest unittest TestResult startTest}@anchor{4978}
@deffn {Method} startTest (test)

Called when the test case `test' is about to be run.
@end deffn

@geindex stopTest() (unittest.TestResult method)
@anchor{library/unittest unittest TestResult stopTest}@anchor{4979}
@deffn {Method} stopTest (test)

Called after the test case `test' has been executed, regardless of the
outcome.
@end deffn

@geindex startTestRun() (unittest.TestResult method)
@anchor{library/unittest unittest TestResult startTestRun}@anchor{1555}
@deffn {Method} startTestRun ()

Called once before any tests are executed.


Added in version 3.1.

@end deffn

@geindex stopTestRun() (unittest.TestResult method)
@anchor{library/unittest unittest TestResult stopTestRun}@anchor{1556}
@deffn {Method} stopTestRun ()

Called once after all tests are executed.


Added in version 3.1.

@end deffn

@geindex addError() (unittest.TestResult method)
@anchor{library/unittest unittest TestResult addError}@anchor{1c8f}
@deffn {Method} addError (test, err)

Called when the test case `test' raises an unexpected exception. `err' is a
tuple of the form returned by @ref{89c,,sys.exc_info()}: @code{(type, value,
traceback)}.

The default implementation appends a tuple @code{(test, formatted_err)} to
the instance’s @ref{496f,,errors} attribute, where `formatted_err' is a
formatted traceback derived from `err'.
@end deffn

@geindex addFailure() (unittest.TestResult method)
@anchor{library/unittest unittest TestResult addFailure}@anchor{1c8e}
@deffn {Method} addFailure (test, err)

Called when the test case `test' signals a failure. `err' is a tuple of
the form returned by @ref{89c,,sys.exc_info()}: @code{(type, value, traceback)}.

The default implementation appends a tuple @code{(test, formatted_err)} to
the instance’s @ref{4970,,failures} attribute, where `formatted_err' is a
formatted traceback derived from `err'.
@end deffn

@geindex addSuccess() (unittest.TestResult method)
@anchor{library/unittest unittest TestResult addSuccess}@anchor{497d}
@deffn {Method} addSuccess (test)

Called when the test case `test' succeeds.

The default implementation does nothing.
@end deffn

@geindex addSkip() (unittest.TestResult method)
@anchor{library/unittest unittest TestResult addSkip}@anchor{1c90}
@deffn {Method} addSkip (test, reason)

Called when the test case `test' is skipped.  `reason' is the reason the
test gave for skipping.

The default implementation appends a tuple @code{(test, reason)} to the
instance’s @ref{4971,,skipped} attribute.
@end deffn

@geindex addExpectedFailure() (unittest.TestResult method)
@anchor{library/unittest unittest TestResult addExpectedFailure}@anchor{497e}
@deffn {Method} addExpectedFailure (test, err)

Called when the test case `test' fails or errors, but was marked with
the @ref{494a,,expectedFailure()} decorator.

The default implementation appends a tuple @code{(test, formatted_err)} to
the instance’s @ref{4972,,expectedFailures} attribute, where `formatted_err'
is a formatted traceback derived from `err'.
@end deffn

@geindex addUnexpectedSuccess() (unittest.TestResult method)
@anchor{library/unittest unittest TestResult addUnexpectedSuccess}@anchor{497f}
@deffn {Method} addUnexpectedSuccess (test)

Called when the test case `test' was marked with the
@ref{494a,,expectedFailure()} decorator, but succeeded.

The default implementation appends the test to the instance’s
@ref{4973,,unexpectedSuccesses} attribute.
@end deffn

@geindex addSubTest() (unittest.TestResult method)
@anchor{library/unittest unittest TestResult addSubTest}@anchor{1c91}
@deffn {Method} addSubTest (test, subtest, outcome)

Called when a subtest finishes.  `test' is the test case
corresponding to the test method.  `subtest' is a custom
@ref{2b5,,TestCase} instance describing the subtest.

If `outcome' is @ref{887,,None}, the subtest succeeded.  Otherwise,
it failed with an exception where `outcome' is a tuple of the form
returned by @ref{89c,,sys.exc_info()}: @code{(type, value, traceback)}.

The default implementation does nothing when the outcome is a
success, and records subtest failures as normal failures.


Added in version 3.4.

@end deffn

@geindex addDuration() (unittest.TestResult method)
@anchor{library/unittest unittest TestResult addDuration}@anchor{1afe}
@deffn {Method} addDuration (test, elapsed)

Called when the test case finishes.  `elapsed' is the time represented in
seconds, and it includes the execution of cleanup functions.


Added in version 3.12.

@end deffn
@end deffn

@geindex TextTestResult (class in unittest)
@anchor{library/unittest unittest TextTestResult}@anchor{755}
@deffn {Class} unittest.TextTestResult (stream, descriptions, verbosity, *, durations=None)

A concrete implementation of @ref{1373,,TestResult} used by the
@ref{1afd,,TextTestRunner}. Subclasses should accept @code{**kwargs} to ensure
compatibility as the interface changes.


Added in version 3.2.



Changed in version 3.12: Added the `durations' keyword parameter.

@end deffn

@geindex defaultTestLoader (in module unittest)
@anchor{library/unittest unittest defaultTestLoader}@anchor{496a}
@deffn {Data} unittest.defaultTestLoader

Instance of the @ref{593,,TestLoader} class intended to be shared.  If no
customization of the @code{TestLoader} is needed, this instance can be used
instead of repeatedly creating new instances.
@end deffn

@geindex TextTestRunner (class in unittest)
@anchor{library/unittest unittest TextTestRunner}@anchor{1afd}
@deffn {Class} unittest.TextTestRunner (stream=None, descriptions=True, verbosity=1, failfast=False, buffer=False, resultclass=None, warnings=None, *, tb_locals=False, durations=None)

A basic test runner implementation that outputs results to a stream. If `stream'
is @code{None}, the default, @ref{b39,,sys.stderr} is used as the output stream. This class
has a few configurable parameters, but is essentially very simple.  Graphical
applications which run test suites should provide alternate implementations. Such
implementations should accept @code{**kwargs} as the interface to construct runners
changes when features are added to unittest.

By default this runner shows @ref{1a4,,DeprecationWarning},
@ref{acc,,PendingDeprecationWarning}, @ref{54d,,ResourceWarning} and
@ref{71f,,ImportWarning} even if they are @ref{4980,,ignored by default}.  This behavior can
be overridden using Python’s @code{-Wd} or @code{-Wa} options
(see @ref{216c,,Warning control}) and leaving
`warnings' to @code{None}.


Changed in version 3.2: Added the `warnings' parameter.



Changed in version 3.2: The default stream is set to @ref{b39,,sys.stderr} at instantiation time rather
than import time.



Changed in version 3.5: Added the `tb_locals' parameter.



Changed in version 3.12: Added the `durations' parameter.


@geindex _makeResult() (unittest.TextTestRunner method)
@anchor{library/unittest unittest TextTestRunner _makeResult}@anchor{4981}
@deffn {Method} _makeResult ()

This method returns the instance of @code{TestResult} used by @ref{4982,,run()}.
It is not intended to be called directly, but can be overridden in
subclasses to provide a custom @code{TestResult}.

@code{_makeResult()} instantiates the class or callable passed in the
@code{TextTestRunner} constructor as the @code{resultclass} argument. It
defaults to @ref{755,,TextTestResult} if no @code{resultclass} is provided.
The result class is instantiated with the following arguments:

@example
stream, descriptions, verbosity
@end example
@end deffn

@geindex run() (unittest.TextTestRunner method)
@anchor{library/unittest unittest TextTestRunner run}@anchor{4982}
@deffn {Method} run (test)

This method is the main public interface to the @code{TextTestRunner}. This
method takes a @ref{ffb,,TestSuite} or @ref{2b5,,TestCase} instance. A
@ref{1373,,TestResult} is created by calling
@ref{4981,,_makeResult()} and the test(s) are run and the
results printed to stdout.
@end deffn
@end deffn

@geindex main() (in module unittest)
@anchor{library/unittest unittest main}@anchor{11e9}
@deffn {Function} unittest.main (module='__main__', defaultTest=None, argv=None, testRunner=None, testLoader=unittest.defaultTestLoader, exit=True, verbosity=1, failfast=None, catchbreak=None, buffer=None, warnings=None)

A command-line program that loads a set of tests from `module' and runs them;
this is primarily for making test modules conveniently executable.
The simplest use for this function is to include the following line at the
end of a test script:

@example
if __name__ == '__main__':
    unittest.main()
@end example

You can run tests with more detailed information by passing in the verbosity
argument:

@example
if __name__ == '__main__':
    unittest.main(verbosity=2)
@end example

The `defaultTest' argument is either the name of a single test or an
iterable of test names to run if no test names are specified via `argv'.  If
not specified or @code{None} and no test names are provided via `argv', all
tests found in `module' are run.

The `argv' argument can be a list of options passed to the program, with the
first element being the program name.  If not specified or @code{None},
the values of @ref{1470,,sys.argv} are used.

The `testRunner' argument can either be a test runner class or an already
created instance of it. By default @code{main} calls @ref{279,,sys.exit()} with
an exit code indicating success (0) or failure (1) of the tests run.
An exit code of 5 indicates that no tests were run or skipped.

The `testLoader' argument has to be a @ref{593,,TestLoader} instance,
and defaults to @ref{496a,,defaultTestLoader}.

@code{main} supports being used from the interactive interpreter by passing in the
argument @code{exit=False}. This displays the result on standard output without
calling @ref{279,,sys.exit()}:

@example
>>> from unittest import main
>>> main(module='test_module', exit=False)
@end example

The `failfast', `catchbreak' and `buffer' parameters have the same
effect as the same-name @ref{4932,,command-line options}.

The `warnings' argument specifies the @ref{1b2,,warning filter}
that should be used while running the tests.  If it’s not specified, it will
remain @code{None} if a @code{-W} option is passed to @code{python}
(see @ref{216c,,Warning control}),
otherwise it will be set to @code{'default'}.

Calling @code{main} returns an object with the @code{result} attribute that contains
the result of the tests run as a @ref{1373,,unittest.TestResult}.


Changed in version 3.1: The `exit' parameter was added.



Changed in version 3.2: The `verbosity', `failfast', `catchbreak', `buffer'
and `warnings' parameters were added.



Changed in version 3.4: The `defaultTest' parameter was changed to also accept an iterable of
test names.

@end deffn

@menu
* load_tests Protocol:: 

@end menu

@node load_tests Protocol,,,Loading and running tests
@anchor{library/unittest id1}@anchor{4943}@anchor{library/unittest load-tests-protocol}@anchor{48e9}
@subsubsection load_tests Protocol



Added in version 3.2.


Modules or packages can customize how tests are loaded from them during normal
test runs or test discovery by implementing a function called @code{load_tests}.

If a test module defines @code{load_tests} it will be called by
@ref{594,,TestLoader.loadTestsFromModule()} with the following arguments:

@example
load_tests(loader, standard_tests, pattern)
@end example

where `pattern' is passed straight through from @code{loadTestsFromModule}.  It
defaults to @code{None}.

It should return a @ref{ffb,,TestSuite}.

`loader' is the instance of @ref{593,,TestLoader} doing the loading.
`standard_tests' are the tests that would be loaded by default from the
module. It is common for test modules to only want to add or remove tests
from the standard set of tests.
The third argument is used when loading packages as part of test discovery.

A typical @code{load_tests} function that loads tests from a specific set of
@ref{2b5,,TestCase} classes may look like:

@example
test_cases = (TestCase1, TestCase2, TestCase3)

def load_tests(loader, tests, pattern):
    suite = TestSuite()
    for test_class in test_cases:
        tests = loader.loadTestsFromTestCase(test_class)
        suite.addTests(tests)
    return suite
@end example

If discovery is started in a directory containing a package, either from the
command line or by calling @ref{11eb,,TestLoader.discover()}, then the package
@code{__init__.py} will be checked for @code{load_tests}.  If that function does
not exist, discovery will recurse into the package as though it were just
another directory.  Otherwise, discovery of the package’s tests will be left up
to @code{load_tests} which is called with the following arguments:

@example
load_tests(loader, standard_tests, pattern)
@end example

This should return a @ref{ffb,,TestSuite} representing all the tests
from the package. (@code{standard_tests} will only contain tests
collected from @code{__init__.py}.)

Because the pattern is passed into @code{load_tests} the package is free to
continue (and potentially modify) test discovery. A ‘do nothing’
@code{load_tests} function for a test package would look like:

@example
def load_tests(loader, standard_tests, pattern):
    # top level directory cached on loader instance
    this_dir = os.path.dirname(__file__)
    package_tests = loader.discover(start_dir=this_dir, pattern=pattern)
    standard_tests.addTests(package_tests)
    return standard_tests
@end example


Changed in version 3.5: Discovery no longer checks package names for matching `pattern' due to the
impossibility of package names matching the default pattern.


@node Class and Module Fixtures,Signal Handling,Classes and functions,unittest — Unit testing framework
@anchor{library/unittest class-and-module-fixtures}@anchor{4952}
@subsubsection Class and Module Fixtures


Class and module level fixtures are implemented in @ref{ffb,,TestSuite}. When
the test suite encounters a test from a new class then
@ref{1543,,tearDownClass()} from the previous class (if there is one)
is called, followed by @ref{c49,,setUpClass()} from the new class.

Similarly if a test is from a different module from the previous test then
@code{tearDownModule} from the previous module is run, followed by
@code{setUpModule} from the new module.

After all the tests have run the final @code{tearDownClass} and
@code{tearDownModule} are run.

Note that shared fixtures do not play well with [potential] features like test
parallelization and they break test isolation. They should be used with care.

The default ordering of tests created by the unittest test loaders is to group
all tests from the same modules and classes together. This will lead to
@code{setUpClass} / @code{setUpModule} (etc) being called exactly once per class and
module. If you randomize the order, so that tests from different modules and
classes are adjacent to each other, then these shared fixture functions may be
called multiple times in a single test run.

Shared fixtures are not intended to work with suites with non-standard
ordering. A @code{BaseTestSuite} still exists for frameworks that don’t want to
support shared fixtures.

If there are any exceptions raised during one of the shared fixture functions
the test is reported as an error. Because there is no corresponding test
instance an @code{_ErrorHolder} object (that has the same interface as a
@ref{2b5,,TestCase}) is created to represent the error. If you are just using
the standard unittest test runner then this detail doesn’t matter, but if you
are a framework author it may be relevant.

@menu
* setUpClass and tearDownClass:: 
* setUpModule and tearDownModule:: 

@end menu

@node setUpClass and tearDownClass,setUpModule and tearDownModule,,Class and Module Fixtures
@anchor{library/unittest setupclass-and-teardownclass}@anchor{4983}
@subsubsection setUpClass and tearDownClass


These must be implemented as class methods:

@example
import unittest

class Test(unittest.TestCase):
    @@classmethod
    def setUpClass(cls):
        cls._connection = createExpensiveConnectionObject()

    @@classmethod
    def tearDownClass(cls):
        cls._connection.destroy()
@end example

If you want the @code{setUpClass} and @code{tearDownClass} on base classes called
then you must call up to them yourself. The implementations in
@ref{2b5,,TestCase} are empty.

If an exception is raised during a @code{setUpClass} then the tests in the class
are not run and the @code{tearDownClass} is not run. Skipped classes will not
have @code{setUpClass} or @code{tearDownClass} run. If the exception is a
@ref{11ea,,SkipTest} exception then the class will be reported as having been skipped
instead of as an error.

@node setUpModule and tearDownModule,,setUpClass and tearDownClass,Class and Module Fixtures
@anchor{library/unittest setupmodule-and-teardownmodule}@anchor{4984}
@subsubsection setUpModule and tearDownModule


@geindex setUpModule() (in module unittest)
@geindex tearDownModule() (in module unittest)
@anchor{library/unittest unittest setUpModule}@anchor{c48}
These should be implemented as functions:

@example
def setUpModule():
    createConnection()

def tearDownModule():
    closeConnection()
@end example

If an exception is raised in a @code{setUpModule} then none of the tests in the
module will be run and the @code{tearDownModule} will not be run. If the exception is a
@ref{11ea,,SkipTest} exception then the module will be reported as having been skipped
instead of as an error.

To add cleanup code that must be run even in the case of an exception, use
@code{addModuleCleanup}:

@geindex addModuleCleanup() (in module unittest)
@anchor{library/unittest unittest addModuleCleanup}@anchor{c46}
@deffn {Function} unittest.addModuleCleanup (function, /, *args, **kwargs)

Add a function to be called after @ref{1542,,tearDownModule()} to cleanup
resources used during the test class. Functions will be called in reverse
order to the order they are added (@abbr{LIFO}).
They are called with any arguments and keyword arguments passed into
@code{addModuleCleanup()} when they are added.

If @ref{c48,,setUpModule()} fails, meaning that @ref{1542,,tearDownModule()} is not
called, then any cleanup functions added will still be called.


Added in version 3.8.

@end deffn

@geindex enterModuleContext() (in module unittest)
@anchor{library/unittest unittest enterModuleContext}@anchor{8cd}
@deffn {Function} unittest.enterModuleContext (cm)

Enter the supplied @ref{1e3,,context manager}.  If successful, also
add its @ref{150c,,__exit__()} method as a cleanup function by
@ref{c46,,addModuleCleanup()} and return the result of the
@ref{7e5,,__enter__()} method.


Added in version 3.11.

@end deffn

@geindex doModuleCleanups() (in module unittest)
@anchor{library/unittest unittest doModuleCleanups}@anchor{1c16}
@deffn {Function} unittest.doModuleCleanups ()

This function is called unconditionally after @ref{1542,,tearDownModule()}, or
after @ref{c48,,setUpModule()} if @code{setUpModule()} raises an exception.

It is responsible for calling all the cleanup functions added by
@ref{c46,,addModuleCleanup()}. If you need cleanup functions to be called
`prior' to @ref{1542,,tearDownModule()} then you can call
@code{doModuleCleanups()} yourself.

@code{doModuleCleanups()} pops methods off the stack of cleanup
functions one at a time, so it can be called at any time.


Added in version 3.8.

@end deffn

@node Signal Handling,,Class and Module Fixtures,unittest — Unit testing framework
@anchor{library/unittest signal-handling}@anchor{4935}
@subsubsection Signal Handling



Added in version 3.2.


The @ref{153e,,-c/--catch} command-line option to unittest,
along with the @code{catchbreak} parameter to @ref{11e9,,unittest.main()}, provide
more friendly handling of control-C during a test run. With catch break
behavior enabled control-C will allow the currently running test to complete,
and the test run will then end and report all the results so far. A second
control-c will raise a @ref{bcb,,KeyboardInterrupt} in the usual way.

The control-c handling signal handler attempts to remain compatible with code or
tests that install their own @ref{255,,signal.SIGINT} handler. If the @code{unittest}
handler is called but `isn’t' the installed @code{signal.SIGINT} handler,
i.e. it has been replaced by the system under test and delegated to, then it
calls the default handler. This will normally be the expected behavior by code
that replaces an installed handler and delegates to it. For individual tests
that need @code{unittest} control-c handling disabled the @ref{153f,,removeHandler()}
decorator can be used.

There are a few utility functions for framework authors to enable control-c
handling functionality within test frameworks.

@geindex installHandler() (in module unittest)
@anchor{library/unittest unittest installHandler}@anchor{4985}
@deffn {Function} unittest.installHandler ()

Install the control-c handler. When a @ref{255,,signal.SIGINT} is received
(usually in response to the user pressing control-c) all registered results
have @ref{4975,,stop()} called.
@end deffn

@geindex registerResult() (in module unittest)
@anchor{library/unittest unittest registerResult}@anchor{4986}
@deffn {Function} unittest.registerResult (result)

Register a @ref{1373,,TestResult} object for control-c handling. Registering a
result stores a weak reference to it, so it doesn’t prevent the result from
being garbage collected.

Registering a @ref{1373,,TestResult} object has no side-effects if control-c
handling is not enabled, so test frameworks can unconditionally register
all results they create independently of whether or not handling is enabled.
@end deffn

@geindex removeResult() (in module unittest)
@anchor{library/unittest unittest removeResult}@anchor{4987}
@deffn {Function} unittest.removeResult (result)

Remove a registered result. Once a result has been removed then
@ref{4975,,stop()} will no longer be called on that result object in
response to a control-c.
@end deffn

@geindex removeHandler() (in module unittest)
@anchor{library/unittest unittest removeHandler}@anchor{153f}
@deffn {Function} unittest.removeHandler (function=None)

When called without arguments this function removes the control-c handler
if it has been installed. This function can also be used as a test decorator
to temporarily remove the handler while the test is being executed:

@example
@@unittest.removeHandler
def test_signal_handling(self):
    ...
@end example
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node unittest mock — mock object library,unittest mock — getting started,unittest — Unit testing framework,Development Tools
@anchor{library/unittest mock doc}@anchor{4988}@anchor{library/unittest mock module-unittest mock}@anchor{10e}@anchor{library/unittest mock translation-repo}@anchor{4989}@anchor{library/unittest mock unittest-mock-mock-object-library}@anchor{498a}
@subsection @code{unittest.mock} — mock object library


@geindex module; unittest.mock


Added in version 3.3.


`Source code:' Lib/unittest/mock.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/unittest/mock.py}


__________________________________________________________________


@code{unittest.mock} is a library for testing in Python. It allows you to
replace parts of your system under test with mock objects and make assertions
about how they have been used.

@code{unittest.mock} provides a core @ref{c45,,Mock} class removing the need to
create a host of stubs throughout your test suite. After performing an
action, you can make assertions about which methods / attributes were used
and arguments they were called with. You can also specify return values and
set needed attributes in the normal way.

Additionally, mock provides a @ref{1098,,patch()} decorator that handles patching
module and class level attributes within the scope of a test, along with
@ref{d9f,,sentinel} for creating unique objects. See the @ref{498b,,quick guide} for
some examples of how to use @ref{c45,,Mock}, @ref{1095,,MagicMock} and
@code{patch()}.

Mock is designed for use with @ref{10d,,unittest} and
is based on the ‘action -> assertion’ pattern instead of ‘record -> replay’
used by many mocking frameworks.

There is a backport of @code{unittest.mock} for earlier versions of Python,
available as mock@footnote{https://pypi.org/project/mock/} on PyPI.

@menu
* Quick Guide:: 
* The Mock Class:: 
* The patchers:: 
* MagicMock and magic method support:: 
* Helpers:: 
* Order of precedence of side_effect@comma{} return_value and wraps: Order of precedence of side_effect return_value and wraps. 

@end menu

@node Quick Guide,The Mock Class,,unittest mock — mock object library
@anchor{library/unittest mock quick-guide}@anchor{498b}
@subsubsection Quick Guide


@c class ProductionClass:
@c     def method(self, a, b, c):
@c         pass
@c 
@c class SomeClass:
@c     @staticmethod
@c     def static_method(args):
@c         return args
@c 
@c     @classmethod
@c     def class_method(cls, args):
@c         return args

@ref{c45,,Mock} and @ref{1095,,MagicMock} objects create all attributes and
methods as you access them and store details of how they have been used. You
can configure them, to specify return values or limit what attributes are
available, and then make assertions about how they have been used:

@example
>>> from unittest.mock import MagicMock
>>> thing = ProductionClass()
>>> thing.method = MagicMock(return_value=3)
>>> thing.method(3, 4, 5, key='value')
3
>>> thing.method.assert_called_with(3, 4, 5, key='value')
@end example

@ref{498c,,side_effect} allows you to perform side effects, including raising an
exception when a mock is called:

@example
>>> from unittest.mock import Mock
>>> mock = Mock(side_effect=KeyError('foo'))
>>> mock()
Traceback (most recent call last):
 ...
KeyError: 'foo'
@end example

@example
>>> values = @{'a': 1, 'b': 2, 'c': 3@}
>>> def side_effect(arg):
...     return values[arg]
...
>>> mock.side_effect = side_effect
>>> mock('a'), mock('b'), mock('c')
(1, 2, 3)
>>> mock.side_effect = [5, 4, 3, 2, 1]
>>> mock(), mock(), mock()
(5, 4, 3)
@end example

Mock has many other ways you can configure it and control its behaviour. For
example the `spec' argument configures the mock to take its specification
from another object. Attempting to access attributes or methods on the mock
that don’t exist on the spec will fail with an @ref{5f0,,AttributeError}.

The @ref{1098,,patch()} decorator / context manager makes it easy to mock classes or
objects in a module under test. The object you specify will be replaced with a
mock (or other object) during the test and restored when the test ends:

@example
>>> from unittest.mock import patch
>>> @@patch('module.ClassName2')
... @@patch('module.ClassName1')
... def test(MockClass1, MockClass2):
...     module.ClassName1()
...     module.ClassName2()
...     assert MockClass1 is module.ClassName1
...     assert MockClass2 is module.ClassName2
...     assert MockClass1.called
...     assert MockClass2.called
...
>>> test()
@end example

@cartouche
@quotation Note 
When you nest patch decorators the mocks are passed in to the decorated
function in the same order they applied (the normal `Python' order that
decorators are applied). This means from the bottom up, so in the example
above the mock for @code{module.ClassName1} is passed in first.

With @ref{1098,,patch()} it matters that you patch objects in the namespace where they
are looked up. This is normally straightforward, but for a quick guide
read @ref{498d,,where to patch}.
@end quotation
@end cartouche

As well as a decorator @ref{1098,,patch()} can be used as a context manager in a with
statement:

@example
>>> with patch.object(ProductionClass, 'method', return_value=None) as mock_method:
...     thing = ProductionClass()
...     thing.method(1, 2, 3)
...
>>> mock_method.assert_called_once_with(1, 2, 3)
@end example

There is also @ref{19ab,,patch.dict()} for setting values in a dictionary just
during a scope and restoring the dictionary to its original state when the test
ends:

@example
>>> foo = @{'key': 'value'@}
>>> original = foo.copy()
>>> with patch.dict(foo, @{'newkey': 'newvalue'@}, clear=True):
...     assert foo == @{'newkey': 'newvalue'@}
...
>>> assert foo == original
@end example

Mock supports the mocking of Python @ref{498e,,magic methods}. The
easiest way of using magic methods is with the @ref{1095,,MagicMock} class. It
allows you to do things like:

@example
>>> mock = MagicMock()
>>> mock.__str__.return_value = 'foobarbaz'
>>> str(mock)
'foobarbaz'
>>> mock.__str__.assert_called_with()
@end example

Mock allows you to assign functions (or other Mock instances) to magic methods
and they will be called appropriately. The @ref{1095,,MagicMock} class is just a Mock
variant that has all of the magic methods pre-created for you (well, all the
useful ones anyway).

The following is an example of using magic methods with the ordinary Mock
class:

@example
>>> mock = Mock()
>>> mock.__str__ = Mock(return_value='wheeeeee')
>>> str(mock)
'wheeeeee'
@end example

For ensuring that the mock objects in your tests have the same api as the
objects they are replacing, you can use @ref{498f,,auto-speccing}.
Auto-speccing can be done through the `autospec' argument to patch, or the
@ref{1978,,create_autospec()} function. Auto-speccing creates mock objects that
have the same attributes and methods as the objects they are replacing, and
any functions and methods (including constructors) have the same call
signature as the real object.

This ensures that your mocks will fail in the same way as your production
code if they are used incorrectly:

@example
>>> from unittest.mock import create_autospec
>>> def function(a, b, c):
...     pass
...
>>> mock_function = create_autospec(function, return_value='fishy')
>>> mock_function(1, 2, 3)
'fishy'
>>> mock_function.assert_called_once_with(1, 2, 3)
>>> mock_function('wrong arguments')
Traceback (most recent call last):
 ...
TypeError: missing a required argument: 'b'
@end example

@ref{1978,,create_autospec()} can also be used on classes, where it copies the signature of
the @code{__init__} method, and on callable objects where it copies the signature of
the @code{__call__} method.

@node The Mock Class,The patchers,Quick Guide,unittest mock — mock object library
@anchor{library/unittest mock the-mock-class}@anchor{4990}
@subsubsection The Mock Class


@c import asyncio
@c import inspect
@c import unittest
@c import threading
@c from unittest.mock import sentinel, DEFAULT, ANY
@c from unittest.mock import patch, call, Mock, MagicMock, PropertyMock, AsyncMock
@c from unittest.mock import ThreadingMock
@c from unittest.mock import mock_open

@ref{c45,,Mock} is a flexible mock object intended to replace the use of stubs and
test doubles throughout your code. Mocks are callable and create attributes as
new mocks when you access them @footnote{
The only exceptions are magic methods and attributes (those that have
leading and trailing double underscores). Mock doesn’t create these but
instead raises an @ref{5f0,,AttributeError}. This is because the interpreter
will often implicitly request these methods, and gets `very' confused to
get a new Mock object when it expects a magic method. If you need magic
method support see @ref{498e,,magic methods}.
}. Accessing the same attribute will always
return the same mock. Mocks record how you use them, allowing you to make
assertions about what your code has done to them.

@ref{1095,,MagicMock} is a subclass of @ref{c45,,Mock} with all the magic methods
pre-created and ready to use. There are also non-callable variants, useful
when you are mocking out objects that aren’t callable:
@ref{4991,,NonCallableMock} and @ref{4992,,NonCallableMagicMock}

The @ref{1098,,patch()} decorators makes it easy to temporarily replace classes
in a particular module with a @ref{c45,,Mock} object. By default @code{patch()} will create
a @ref{1095,,MagicMock} for you. You can specify an alternative class of @code{Mock} using
the `new_callable' argument to @code{patch()}.

@geindex Mock (class in unittest.mock)
@anchor{library/unittest mock unittest mock Mock}@anchor{c45}
@deffn {Class} unittest.mock.Mock (spec=None, side_effect=None, return_value=DEFAULT, wraps=None, name=None, spec_set=None, unsafe=False, **kwargs)

Create a new @code{Mock} object. @code{Mock} takes several optional arguments
that specify the behaviour of the Mock object:


@itemize *

@item 
`spec': This can be either a list of strings or an existing object (a
class or instance) that acts as the specification for the mock object. If
you pass in an object then a list of strings is formed by calling dir on
the object (excluding unsupported magic attributes and methods).
Accessing any attribute not in this list will raise an @ref{5f0,,AttributeError}.

If `spec' is an object (rather than a list of strings) then
@ref{16b9,,__class__} returns the class of the spec object. This
allows mocks to pass @ref{2af,,isinstance()} tests.

@item 
`spec_set': A stricter variant of `spec'. If used, attempting to `set'
or get an attribute on the mock that isn’t on the object passed as
`spec_set' will raise an @ref{5f0,,AttributeError}.

@item 
`side_effect': A function to be called whenever the Mock is called. See
the @ref{498c,,side_effect} attribute. Useful for raising exceptions or
dynamically changing return values. The function is called with the same
arguments as the mock, and unless it returns @ref{4993,,DEFAULT}, the return
value of this function is used as the return value.

Alternatively `side_effect' can be an exception class or instance. In
this case the exception will be raised when the mock is called.

If `side_effect' is an iterable then each call to the mock will return
the next value from the iterable.

A `side_effect' can be cleared by setting it to @code{None}.

@item 
`return_value': The value returned when the mock is called. By default
this is a new Mock (created on first access). See the
@ref{4994,,return_value} attribute.

@item 
`unsafe': By default, accessing any attribute whose name starts with
`assert', `assret', `asert', `aseert' or `assrt' will raise an
@ref{5f0,,AttributeError}. Passing @code{unsafe=True} will allow access to
these attributes.


Added in version 3.5.


@item 
`wraps': Item for the mock object to wrap. If `wraps' is not @code{None} then
calling the Mock will pass the call through to the wrapped object
(returning the real result). Attribute access on the mock will return a
Mock object that wraps the corresponding attribute of the wrapped
object (so attempting to access an attribute that doesn’t exist will
raise an @ref{5f0,,AttributeError}).

If the mock has an explicit `return_value' set then calls are not passed
to the wrapped object and the `return_value' is returned instead.

@item 
`name': If the mock has a name then it will be used in the repr of the
mock. This can be useful for debugging. The name is propagated to child
mocks.
@end itemize

Mocks can also be called with arbitrary keyword arguments. These will be
used to set attributes on the mock after it is created. See the
@ref{4995,,configure_mock()} method for details.

@geindex assert_called() (unittest.mock.Mock method)
@anchor{library/unittest mock unittest mock Mock assert_called}@anchor{efa}
@deffn {Method} assert_called ()

Assert that the mock was called at least once.

@example
>>> mock = Mock()
>>> mock.method()
<Mock name='mock.method()' id='...'>
>>> mock.method.assert_called()
@end example


Added in version 3.6.

@end deffn

@geindex assert_called_once() (unittest.mock.Mock method)
@anchor{library/unittest mock unittest mock Mock assert_called_once}@anchor{efb}
@deffn {Method} assert_called_once ()

Assert that the mock was called exactly once.

@example
>>> mock = Mock()
>>> mock.method()
<Mock name='mock.method()' id='...'>
>>> mock.method.assert_called_once()
>>> mock.method()
<Mock name='mock.method()' id='...'>
>>> mock.method.assert_called_once()
Traceback (most recent call last):
...
AssertionError: Expected 'method' to have been called once. Called 2 times.
Calls: [call(), call()].
@end example


Added in version 3.6.

@end deffn

@geindex assert_called_with() (unittest.mock.Mock method)
@anchor{library/unittest mock unittest mock Mock assert_called_with}@anchor{1e46}
@deffn {Method} assert_called_with (*args, **kwargs)

This method is a convenient way of asserting that the last call has been
made in a particular way:

@example
>>> mock = Mock()
>>> mock.method(1, 2, 3, test='wow')
<Mock name='mock.method()' id='...'>
>>> mock.method.assert_called_with(1, 2, 3, test='wow')
@end example
@end deffn

@geindex assert_called_once_with() (unittest.mock.Mock method)
@anchor{library/unittest mock unittest mock Mock assert_called_once_with}@anchor{4996}
@deffn {Method} assert_called_once_with (*args, **kwargs)

Assert that the mock was called exactly once and that call was with the
specified arguments.

@example
>>> mock = Mock(return_value=None)
>>> mock('foo', bar='baz')
>>> mock.assert_called_once_with('foo', bar='baz')
>>> mock('other', bar='values')
>>> mock.assert_called_once_with('other', bar='values')
Traceback (most recent call last):
  ...
AssertionError: Expected 'mock' to be called once. Called 2 times.
Calls: [call('foo', bar='baz'), call('other', bar='values')].
@end example
@end deffn

@geindex assert_any_call() (unittest.mock.Mock method)
@anchor{library/unittest mock unittest mock Mock assert_any_call}@anchor{4997}
@deffn {Method} assert_any_call (*args, **kwargs)

assert the mock has been called with the specified arguments.

The assert passes if the mock has `ever' been called, unlike
@ref{1e46,,assert_called_with()} and @ref{4996,,assert_called_once_with()} that
only pass if the call is the most recent one, and in the case of
@code{assert_called_once_with()} it must also be the only call.

@example
>>> mock = Mock(return_value=None)
>>> mock(1, 2, arg='thing')
>>> mock('some', 'thing', 'else')
>>> mock.assert_any_call(1, 2, arg='thing')
@end example
@end deffn

@geindex assert_has_calls() (unittest.mock.Mock method)
@anchor{library/unittest mock unittest mock Mock assert_has_calls}@anchor{1a69}
@deffn {Method} assert_has_calls (calls, any_order=False)

assert the mock has been called with the specified calls.
The @ref{4998,,mock_calls} list is checked for the calls.

If `any_order' is false then the calls must be
sequential. There can be extra calls before or after the
specified calls.

If `any_order' is true then the calls can be in any order, but
they must all appear in @ref{4998,,mock_calls}.

@example
>>> mock = Mock(return_value=None)
>>> mock(1)
>>> mock(2)
>>> mock(3)
>>> mock(4)
>>> calls = [call(2), call(3)]
>>> mock.assert_has_calls(calls)
>>> calls = [call(4), call(2), call(3)]
>>> mock.assert_has_calls(calls, any_order=True)
@end example
@end deffn

@geindex assert_not_called() (unittest.mock.Mock method)
@anchor{library/unittest mock unittest mock Mock assert_not_called}@anchor{1094}
@deffn {Method} assert_not_called ()

Assert the mock was never called.

@example
>>> m = Mock()
>>> m.hello.assert_not_called()
>>> obj = m.hello()
>>> m.hello.assert_not_called()
Traceback (most recent call last):
  ...
AssertionError: Expected 'hello' to not have been called. Called 1 times.
Calls: [call()].
@end example


Added in version 3.5.

@end deffn

@geindex reset_mock() (unittest.mock.Mock method)
@anchor{library/unittest mock unittest mock Mock reset_mock}@anchor{efc}
@deffn {Method} reset_mock (*, return_value=False, side_effect=False)

The reset_mock method resets all the call attributes on a mock object:

@example
>>> mock = Mock(return_value=None)
>>> mock('hello')
>>> mock.called
True
>>> mock.reset_mock()
>>> mock.called
False
@end example

This can be useful where you want to make a series of assertions that
reuse the same object.

`return_value' parameter when set to @code{True} resets @ref{4994,,return_value}:

@example
>>> mock = Mock(return_value=5)
>>> mock('hello')
5
>>> mock.reset_mock(return_value=True)
>>> mock('hello')
<Mock name='mock()' id='...'>
@end example

`side_effect' parameter when set to @code{True} resets @ref{498c,,side_effect}:

@example
>>> mock = Mock(side_effect=ValueError)
>>> mock('hello')
Traceback (most recent call last):
  ...
ValueError
>>> mock.reset_mock(side_effect=True)
>>> mock('hello')
<Mock name='mock()' id='...'>
@end example

Note that @code{reset_mock()} `doesn’t' clear the
@ref{4994,,return_value}, @ref{498c,,side_effect} or any child attributes you have
set using normal assignment by default.

Child mocks are reset as well.


Changed in version 3.6: Added two keyword-only arguments to the reset_mock function.

@end deffn

@geindex mock_add_spec() (unittest.mock.Mock method)
@anchor{library/unittest mock unittest mock Mock mock_add_spec}@anchor{4999}
@deffn {Method} mock_add_spec (spec, spec_set=False)

Add a spec to a mock. `spec' can either be an object or a
list of strings. Only attributes on the `spec' can be fetched as
attributes from the mock.

If `spec_set' is true then only attributes on the spec can be set.
@end deffn

@geindex attach_mock() (unittest.mock.Mock method)
@anchor{library/unittest mock unittest mock Mock attach_mock}@anchor{1999}
@deffn {Method} attach_mock (mock, attribute)

Attach a mock as an attribute of this one, replacing its name and
parent. Calls to the attached mock will be recorded in the
@ref{499a,,method_calls} and @ref{4998,,mock_calls} attributes of this one.
@end deffn

@geindex configure_mock() (unittest.mock.Mock method)
@anchor{library/unittest mock unittest mock Mock configure_mock}@anchor{4995}
@deffn {Method} configure_mock (**kwargs)

Set attributes on the mock through keyword arguments.

Attributes plus return values and side effects can be set on child
mocks using standard dot notation and unpacking a dictionary in the
method call:

@example
>>> mock = Mock()
>>> attrs = @{'method.return_value': 3, 'other.side_effect': KeyError@}
>>> mock.configure_mock(**attrs)
>>> mock.method()
3
>>> mock.other()
Traceback (most recent call last):
  ...
KeyError
@end example

The same thing can be achieved in the constructor call to mocks:

@example
>>> attrs = @{'method.return_value': 3, 'other.side_effect': KeyError@}
>>> mock = Mock(some_attribute='eggs', **attrs)
>>> mock.some_attribute
'eggs'
>>> mock.method()
3
>>> mock.other()
Traceback (most recent call last):
  ...
KeyError
@end example

@code{configure_mock()} exists to make it easier to do configuration
after the mock has been created.
@end deffn

@geindex __dir__() (unittest.mock.Mock method)
@anchor{library/unittest mock unittest mock Mock __dir__}@anchor{499b}
@deffn {Method} __dir__ ()

@code{Mock} objects limit the results of @code{dir(some_mock)} to useful results.
For mocks with a `spec' this includes all the permitted attributes
for the mock.

See @ref{499c,,FILTER_DIR} for what this filtering does, and how to
switch it off.
@end deffn

@geindex _get_child_mock() (unittest.mock.Mock method)
@anchor{library/unittest mock unittest mock Mock _get_child_mock}@anchor{499d}
@deffn {Method} _get_child_mock (**kw)

Create the child mocks for attributes and return value.
By default child mocks will be the same type as the parent.
Subclasses of Mock may want to override this to customize the way
child mocks are made.

For non-callable mocks the callable variant will be used (rather than
any custom subclass).
@end deffn

@geindex called (unittest.mock.Mock attribute)
@anchor{library/unittest mock unittest mock Mock called}@anchor{499e}
@deffn {Attribute} called

A boolean representing whether or not the mock object has been called:

@example
>>> mock = Mock(return_value=None)
>>> mock.called
False
>>> mock()
>>> mock.called
True
@end example
@end deffn

@geindex call_count (unittest.mock.Mock attribute)
@anchor{library/unittest mock unittest mock Mock call_count}@anchor{17d4}
@deffn {Attribute} call_count

An integer telling you how many times the mock object has been called:

@example
>>> mock = Mock(return_value=None)
>>> mock.call_count
0
>>> mock()
>>> mock()
>>> mock.call_count
2
@end example
@end deffn

@geindex return_value (unittest.mock.Mock attribute)
@anchor{library/unittest mock unittest mock Mock return_value}@anchor{4994}
@deffn {Attribute} return_value

Set this to configure the value returned by calling the mock:

@example
>>> mock = Mock()
>>> mock.return_value = 'fish'
>>> mock()
'fish'
@end example

The default return value is a mock object and you can configure it in
the normal way:

@example
>>> mock = Mock()
>>> mock.return_value.attribute = sentinel.Attribute
>>> mock.return_value()
<Mock name='mock()()' id='...'>
>>> mock.return_value.assert_called_with()
@end example

@ref{4994,,return_value} can also be set in the constructor:

@example
>>> mock = Mock(return_value=3)
>>> mock.return_value
3
>>> mock()
3
@end example
@end deffn

@geindex side_effect (unittest.mock.Mock attribute)
@anchor{library/unittest mock unittest mock Mock side_effect}@anchor{498c}
@deffn {Attribute} side_effect

This can either be a function to be called when the mock is called,
an iterable or an exception (class or instance) to be raised.

If you pass in a function it will be called with same arguments as the
mock and unless the function returns the @ref{4993,,DEFAULT} singleton the
call to the mock will then return whatever the function returns. If the
function returns @code{DEFAULT} then the mock will return its normal
value (from the @ref{4994,,return_value}).

If you pass in an iterable, it is used to retrieve an iterator which
must yield a value on every call.  This value can either be an exception
instance to be raised, or a value to be returned from the call to the
mock (@ref{4993,,DEFAULT} handling is identical to the function case).

An example of a mock that raises an exception (to test exception
handling of an API):

@example
>>> mock = Mock()
>>> mock.side_effect = Exception('Boom!')
>>> mock()
Traceback (most recent call last):
  ...
Exception: Boom!
@end example

Using @ref{498c,,side_effect} to return a sequence of values:

@example
>>> mock = Mock()
>>> mock.side_effect = [3, 2, 1]
>>> mock(), mock(), mock()
(3, 2, 1)
@end example

Using a callable:

@example
>>> mock = Mock(return_value=3)
>>> def side_effect(*args, **kwargs):
...     return DEFAULT
...
>>> mock.side_effect = side_effect
>>> mock()
3
@end example

@ref{498c,,side_effect} can be set in the constructor. Here’s an example that
adds one to the value the mock is called with and returns it:

@example
>>> side_effect = lambda value: value + 1
>>> mock = Mock(side_effect=side_effect)
>>> mock(3)
4
>>> mock(-8)
-7
@end example

Setting @ref{498c,,side_effect} to @code{None} clears it:

@example
>>> m = Mock(side_effect=KeyError, return_value=3)
>>> m()
Traceback (most recent call last):
 ...
KeyError
>>> m.side_effect = None
>>> m()
3
@end example
@end deffn

@geindex call_args (unittest.mock.Mock attribute)
@anchor{library/unittest mock unittest mock Mock call_args}@anchor{1dad}
@deffn {Attribute} call_args

This is either @code{None} (if the mock hasn’t been called), or the
arguments that the mock was last called with. This will be in the
form of a tuple: the first member, which can also be accessed through
the @code{args} property, is any positional arguments the mock was
called with (or an empty tuple) and the second member, which can
also be accessed through the @code{kwargs} property, is any keyword
arguments (or an empty dictionary).

@example
>>> mock = Mock(return_value=None)
>>> print(mock.call_args)
None
>>> mock()
>>> mock.call_args
call()
>>> mock.call_args == ()
True
>>> mock(3, 4)
>>> mock.call_args
call(3, 4)
>>> mock.call_args == ((3, 4),)
True
>>> mock.call_args.args
(3, 4)
>>> mock.call_args.kwargs
@{@}
>>> mock(3, 4, 5, key='fish', next='w00t!')
>>> mock.call_args
call(3, 4, 5, key='fish', next='w00t!')
>>> mock.call_args.args
(3, 4, 5)
>>> mock.call_args.kwargs
@{'key': 'fish', 'next': 'w00t!'@}
@end example

@ref{1dad,,call_args}, along with members of the lists @ref{499f,,call_args_list},
@ref{499a,,method_calls} and @ref{4998,,mock_calls} are @ref{1df5,,call} objects.
These are tuples, so they can be unpacked to get at the individual
arguments and make more complex assertions. See
@ref{49a0,,calls as tuples}.


Changed in version 3.8: Added @code{args} and @code{kwargs} properties.

@end deffn

@geindex call_args_list (unittest.mock.Mock attribute)
@anchor{library/unittest mock unittest mock Mock call_args_list}@anchor{499f}
@deffn {Attribute} call_args_list

This is a list of all the calls made to the mock object in sequence
(so the length of the list is the number of times it has been
called). Before any calls have been made it is an empty list. The
@ref{1df5,,call} object can be used for conveniently constructing lists of
calls to compare with @ref{499f,,call_args_list}.

@example
>>> mock = Mock(return_value=None)
>>> mock()
>>> mock(3, 4)
>>> mock(key='fish', next='w00t!')
>>> mock.call_args_list
[call(), call(3, 4), call(key='fish', next='w00t!')]
>>> expected = [(), ((3, 4),), (@{'key': 'fish', 'next': 'w00t!'@},)]
>>> mock.call_args_list == expected
True
@end example

Members of @ref{499f,,call_args_list} are @ref{1df5,,call} objects. These can be
unpacked as tuples to get at the individual arguments. See
@ref{49a0,,calls as tuples}.
@end deffn

@geindex method_calls (unittest.mock.Mock attribute)
@anchor{library/unittest mock unittest mock Mock method_calls}@anchor{499a}
@deffn {Attribute} method_calls

As well as tracking calls to themselves, mocks also track calls to
methods and attributes, and `their' methods and attributes:

@example
>>> mock = Mock()
>>> mock.method()
<Mock name='mock.method()' id='...'>
>>> mock.property.method.attribute()
<Mock name='mock.property.method.attribute()' id='...'>
>>> mock.method_calls
[call.method(), call.property.method.attribute()]
@end example

Members of @ref{499a,,method_calls} are @ref{1df5,,call} objects. These can be
unpacked as tuples to get at the individual arguments. See
@ref{49a0,,calls as tuples}.
@end deffn

@geindex mock_calls (unittest.mock.Mock attribute)
@anchor{library/unittest mock unittest mock Mock mock_calls}@anchor{4998}
@deffn {Attribute} mock_calls

@ref{4998,,mock_calls} records `all' calls to the mock object, its methods,
magic methods `and' return value mocks.

@example
>>> mock = MagicMock()
>>> result = mock(1, 2, 3)
>>> mock.first(a=3)
<MagicMock name='mock.first()' id='...'>
>>> mock.second()
<MagicMock name='mock.second()' id='...'>
>>> int(mock)
1
>>> result(1)
<MagicMock name='mock()()' id='...'>
>>> expected = [call(1, 2, 3), call.first(a=3), call.second(),
... call.__int__(), call()(1)]
>>> mock.mock_calls == expected
True
@end example

Members of @ref{4998,,mock_calls} are @ref{1df5,,call} objects. These can be
unpacked as tuples to get at the individual arguments. See
@ref{49a0,,calls as tuples}.

@cartouche
@quotation Note 
The way @ref{4998,,mock_calls} are recorded means that where nested
calls are made, the parameters of ancestor calls are not recorded
and so will always compare equal:

@example
>>> mock = MagicMock()
>>> mock.top(a=3).bottom()
<MagicMock name='mock.top().bottom()' id='...'>
>>> mock.mock_calls
[call.top(a=3), call.top().bottom()]
>>> mock.mock_calls[-1] == call.top(a=-1).bottom()
True
@end example
@end quotation
@end cartouche
@end deffn

@geindex __class__ (unittest.mock.Mock attribute)
@anchor{library/unittest mock unittest mock Mock __class__}@anchor{49a1}
@deffn {Attribute} __class__

Normally the @code{__class__} attribute of an object will return its type.
For a mock object with a @code{spec}, @code{__class__} returns the spec class
instead. This allows mock objects to pass @ref{2af,,isinstance()} tests for the
object they are replacing / masquerading as:

@example
>>> mock = Mock(spec=3)
>>> isinstance(mock, int)
True
@end example

@code{__class__} is assignable to, this allows a mock to pass an
@ref{2af,,isinstance()} check without forcing you to use a spec:

@example
>>> mock = Mock()
>>> mock.__class__ = dict
>>> isinstance(mock, dict)
True
@end example
@end deffn
@end deffn

@geindex NonCallableMock (class in unittest.mock)
@anchor{library/unittest mock unittest mock NonCallableMock}@anchor{4991}
@deffn {Class} unittest.mock.NonCallableMock (spec=None, wraps=None, name=None, spec_set=None, **kwargs)

A non-callable version of @ref{c45,,Mock}. The constructor parameters have the same
meaning of @code{Mock}, with the exception of `return_value' and `side_effect'
which have no meaning on a non-callable mock.
@end deffn

Mock objects that use a class or an instance as a @code{spec} or
@code{spec_set} are able to pass @ref{2af,,isinstance()} tests:

@example
>>> mock = Mock(spec=SomeClass)
>>> isinstance(mock, SomeClass)
True
>>> mock = Mock(spec_set=SomeClass())
>>> isinstance(mock, SomeClass)
True
@end example

The @ref{c45,,Mock} classes have support for mocking magic methods. See @ref{498e,,magic methods} for the full details.

The mock classes and the @ref{1098,,patch()} decorators all take arbitrary keyword
arguments for configuration. For the @code{patch()} decorators the keywords are
passed to the constructor of the mock being created. The keyword arguments
are for configuring attributes of the mock:

@example
>>> m = MagicMock(attribute=3, other='fish')
>>> m.attribute
3
>>> m.other
'fish'
@end example

The return value and side effect of child mocks can be set in the same way,
using dotted notation. As you can’t use dotted names directly in a call you
have to create a dictionary and unpack it using @code{**}:

@example
>>> attrs = @{'method.return_value': 3, 'other.side_effect': KeyError@}
>>> mock = Mock(some_attribute='eggs', **attrs)
>>> mock.some_attribute
'eggs'
>>> mock.method()
3
>>> mock.other()
Traceback (most recent call last):
  ...
KeyError
@end example

A callable mock which was created with a `spec' (or a `spec_set') will
introspect the specification object’s signature when matching calls to
the mock.  Therefore, it can match the actual call’s arguments regardless
of whether they were passed positionally or by name:

@example
>>> def f(a, b, c): pass
...
>>> mock = Mock(spec=f)
>>> mock(1, 2, c=3)
<Mock name='mock()' id='140161580456576'>
>>> mock.assert_called_with(1, 2, 3)
>>> mock.assert_called_with(a=1, b=2, c=3)
@end example

This applies to @ref{1e46,,assert_called_with()},
@ref{4996,,assert_called_once_with()}, @ref{1a69,,assert_has_calls()} and
@ref{4997,,assert_any_call()}.  When @ref{498f,,Autospeccing}, it will also
apply to method calls on the mock object.


Changed in version 3.4: Added signature introspection on specced and autospecced mock objects.


@geindex PropertyMock (class in unittest.mock)
@anchor{library/unittest mock unittest mock PropertyMock}@anchor{49a2}
@deffn {Class} unittest.mock.PropertyMock (*args, **kwargs)

A mock intended to be used as a @ref{4b4,,property}, or other
@ref{18c9,,descriptor}, on a class. @code{PropertyMock} provides
@ref{16f4,,__get__()} and @ref{23fc,,__set__()} methods
so you can specify a return value when it is fetched.

Fetching a @code{PropertyMock} instance from an object calls the mock, with
no args. Setting it calls the mock with the value being set.

@example
>>> class Foo:
...     @@property
...     def foo(self):
...         return 'something'
...     @@foo.setter
...     def foo(self, value):
...         pass
...
>>> with patch('__main__.Foo.foo', new_callable=PropertyMock) as mock_foo:
...     mock_foo.return_value = 'mockity-mock'
...     this_foo = Foo()
...     print(this_foo.foo)
...     this_foo.foo = 6
...
mockity-mock
>>> mock_foo.mock_calls
[call(), call(6)]
@end example
@end deffn

Because of the way mock attributes are stored you can’t directly attach a
@ref{49a2,,PropertyMock} to a mock object. Instead you can attach it to the mock type
object:

@example
>>> m = MagicMock()
>>> p = PropertyMock(return_value=3)
>>> type(m).foo = p
>>> m.foo
3
>>> p.assert_called_once_with()
@end example

@cartouche
@quotation Caution 
If an @ref{5f0,,AttributeError} is raised by @ref{49a2,,PropertyMock},
it will be interpreted as a missing descriptor and
@ref{6fb,,__getattr__()} will be called on the parent mock:

@example
>>> m = MagicMock()
>>> no_attribute = PropertyMock(side_effect=AttributeError)
>>> type(m).my_property = no_attribute
>>> m.my_property
<MagicMock name='mock.my_property' id='140165240345424'>
@end example

See @ref{6fb,,__getattr__()} for details.
@end quotation
@end cartouche

@geindex AsyncMock (class in unittest.mock)
@anchor{library/unittest mock unittest mock AsyncMock}@anchor{c44}
@deffn {Class} unittest.mock.AsyncMock (spec=None, side_effect=None, return_value=DEFAULT, wraps=None, name=None, spec_set=None, unsafe=False, **kwargs)

An asynchronous version of @ref{1095,,MagicMock}. The @code{AsyncMock} object will
behave so the object is recognized as an async function, and the result of a
call is an awaitable.

@example
>>> mock = AsyncMock()
>>> inspect.iscoroutinefunction(mock)
True
>>> inspect.isawaitable(mock())
True
@end example

The result of @code{mock()} is an async function which will have the outcome
of @code{side_effect} or @code{return_value} after it has been awaited:


@itemize -

@item 
if @code{side_effect} is a function, the async function will return the
result of that function,

@item 
if @code{side_effect} is an exception, the async function will raise the
exception,

@item 
if @code{side_effect} is an iterable, the async function will return the
next value of the iterable, however, if the sequence of result is
exhausted, @code{StopAsyncIteration} is raised immediately,

@item 
if @code{side_effect} is not defined, the async function will return the
value defined by @code{return_value}, hence, by default, the async function
returns a new @code{AsyncMock} object.
@end itemize

Setting the `spec' of a @ref{c45,,Mock} or @ref{1095,,MagicMock} to an async function
will result in a coroutine object being returned after calling.

@example
>>> async def async_func(): pass
...
>>> mock = MagicMock(async_func)
>>> mock
<MagicMock spec='function' id='...'>
>>> mock()
<coroutine object AsyncMockMixin._mock_call at ...>
@end example

Setting the `spec' of a @ref{c45,,Mock}, @ref{1095,,MagicMock}, or @code{AsyncMock}
to a class with asynchronous and synchronous functions will automatically
detect the synchronous functions and set them as @code{MagicMock} (if the
parent mock is @code{AsyncMock} or @code{MagicMock}) or @code{Mock} (if
the parent mock is @code{Mock}). All asynchronous functions will be
@code{AsyncMock}.

@example
>>> class ExampleClass:
...     def sync_foo():
...         pass
...     async def async_foo():
...         pass
...
>>> a_mock = AsyncMock(ExampleClass)
>>> a_mock.sync_foo
<MagicMock name='mock.sync_foo' id='...'>
>>> a_mock.async_foo
<AsyncMock name='mock.async_foo' id='...'>
>>> mock = Mock(ExampleClass)
>>> mock.sync_foo
<Mock name='mock.sync_foo' id='...'>
>>> mock.async_foo
<AsyncMock name='mock.async_foo' id='...'>
@end example


Added in version 3.8.


@geindex assert_awaited() (unittest.mock.AsyncMock method)
@anchor{library/unittest mock unittest mock AsyncMock assert_awaited}@anchor{49a3}
@deffn {Method} assert_awaited ()

Assert that the mock was awaited at least once. Note that this is separate
from the object having been called, the @code{await} keyword must be used:

@example
>>> mock = AsyncMock()
>>> async def main(coroutine_mock):
...     await coroutine_mock
...
>>> coroutine_mock = mock()
>>> mock.called
True
>>> mock.assert_awaited()
Traceback (most recent call last):
...
AssertionError: Expected mock to have been awaited.
>>> asyncio.run(main(coroutine_mock))
>>> mock.assert_awaited()
@end example
@end deffn

@geindex assert_awaited_once() (unittest.mock.AsyncMock method)
@anchor{library/unittest mock unittest mock AsyncMock assert_awaited_once}@anchor{49a4}
@deffn {Method} assert_awaited_once ()

Assert that the mock was awaited exactly once.

@example
>>> mock = AsyncMock()
>>> async def main():
...     await mock()
...
>>> asyncio.run(main())
>>> mock.assert_awaited_once()
>>> asyncio.run(main())
>>> mock.assert_awaited_once()
Traceback (most recent call last):
...
AssertionError: Expected mock to have been awaited once. Awaited 2 times.
@end example
@end deffn

@geindex assert_awaited_with() (unittest.mock.AsyncMock method)
@anchor{library/unittest mock unittest mock AsyncMock assert_awaited_with}@anchor{49a5}
@deffn {Method} assert_awaited_with (*args, **kwargs)

Assert that the last await was with the specified arguments.

@example
>>> mock = AsyncMock()
>>> async def main(*args, **kwargs):
...     await mock(*args, **kwargs)
...
>>> asyncio.run(main('foo', bar='bar'))
>>> mock.assert_awaited_with('foo', bar='bar')
>>> mock.assert_awaited_with('other')
Traceback (most recent call last):
...
AssertionError: expected await not found.
Expected: mock('other')
Actual: mock('foo', bar='bar')
@end example
@end deffn

@geindex assert_awaited_once_with() (unittest.mock.AsyncMock method)
@anchor{library/unittest mock unittest mock AsyncMock assert_awaited_once_with}@anchor{49a6}
@deffn {Method} assert_awaited_once_with (*args, **kwargs)

Assert that the mock was awaited exactly once and with the specified
arguments.

@example
>>> mock = AsyncMock()
>>> async def main(*args, **kwargs):
...     await mock(*args, **kwargs)
...
>>> asyncio.run(main('foo', bar='bar'))
>>> mock.assert_awaited_once_with('foo', bar='bar')
>>> asyncio.run(main('foo', bar='bar'))
>>> mock.assert_awaited_once_with('foo', bar='bar')
Traceback (most recent call last):
...
AssertionError: Expected mock to have been awaited once. Awaited 2 times.
@end example
@end deffn

@geindex assert_any_await() (unittest.mock.AsyncMock method)
@anchor{library/unittest mock unittest mock AsyncMock assert_any_await}@anchor{49a7}
@deffn {Method} assert_any_await (*args, **kwargs)

Assert the mock has ever been awaited with the specified arguments.

@example
>>> mock = AsyncMock()
>>> async def main(*args, **kwargs):
...     await mock(*args, **kwargs)
...
>>> asyncio.run(main('foo', bar='bar'))
>>> asyncio.run(main('hello'))
>>> mock.assert_any_await('foo', bar='bar')
>>> mock.assert_any_await('other')
Traceback (most recent call last):
...
AssertionError: mock('other') await not found
@end example
@end deffn

@geindex assert_has_awaits() (unittest.mock.AsyncMock method)
@anchor{library/unittest mock unittest mock AsyncMock assert_has_awaits}@anchor{49a8}
@deffn {Method} assert_has_awaits (calls, any_order=False)

Assert the mock has been awaited with the specified calls.
The @ref{1dac,,await_args_list} list is checked for the awaits.

If `any_order' is false then the awaits must be
sequential. There can be extra calls before or after the
specified awaits.

If `any_order' is true then the awaits can be in any order, but
they must all appear in @ref{1dac,,await_args_list}.

@example
>>> mock = AsyncMock()
>>> async def main(*args, **kwargs):
...     await mock(*args, **kwargs)
...
>>> calls = [call("foo"), call("bar")]
>>> mock.assert_has_awaits(calls)
Traceback (most recent call last):
...
AssertionError: Awaits not found.
Expected: [call('foo'), call('bar')]
Actual: []
>>> asyncio.run(main('foo'))
>>> asyncio.run(main('bar'))
>>> mock.assert_has_awaits(calls)
@end example
@end deffn

@geindex assert_not_awaited() (unittest.mock.AsyncMock method)
@anchor{library/unittest mock unittest mock AsyncMock assert_not_awaited}@anchor{49a9}
@deffn {Method} assert_not_awaited ()

Assert that the mock was never awaited.

@example
>>> mock = AsyncMock()
>>> mock.assert_not_awaited()
@end example
@end deffn

@geindex reset_mock() (unittest.mock.AsyncMock method)
@anchor{library/unittest mock unittest mock AsyncMock reset_mock}@anchor{49aa}
@deffn {Method} reset_mock (*args, **kwargs)

See @ref{efc,,Mock.reset_mock()}. Also sets @ref{49ab,,await_count} to 0,
@ref{49ac,,await_args} to None, and clears the @ref{1dac,,await_args_list}.
@end deffn

@geindex await_count (unittest.mock.AsyncMock attribute)
@anchor{library/unittest mock unittest mock AsyncMock await_count}@anchor{49ab}
@deffn {Attribute} await_count

An integer keeping track of how many times the mock object has been awaited.

@example
>>> mock = AsyncMock()
>>> async def main():
...     await mock()
...
>>> asyncio.run(main())
>>> mock.await_count
1
>>> asyncio.run(main())
>>> mock.await_count
2
@end example
@end deffn

@geindex await_args (unittest.mock.AsyncMock attribute)
@anchor{library/unittest mock unittest mock AsyncMock await_args}@anchor{49ac}
@deffn {Attribute} await_args

This is either @code{None} (if the mock hasn’t been awaited), or the arguments that
the mock was last awaited with. Functions the same as @ref{1dad,,Mock.call_args}.

@example
>>> mock = AsyncMock()
>>> async def main(*args):
...     await mock(*args)
...
>>> mock.await_args
>>> asyncio.run(main('foo'))
>>> mock.await_args
call('foo')
>>> asyncio.run(main('bar'))
>>> mock.await_args
call('bar')
@end example
@end deffn

@geindex await_args_list (unittest.mock.AsyncMock attribute)
@anchor{library/unittest mock unittest mock AsyncMock await_args_list}@anchor{1dac}
@deffn {Attribute} await_args_list

This is a list of all the awaits made to the mock object in sequence (so the
length of the list is the number of times it has been awaited). Before any
awaits have been made it is an empty list.

@example
>>> mock = AsyncMock()
>>> async def main(*args):
...     await mock(*args)
...
>>> mock.await_args_list
[]
>>> asyncio.run(main('foo'))
>>> mock.await_args_list
[call('foo')]
>>> asyncio.run(main('bar'))
>>> mock.await_args_list
[call('foo'), call('bar')]
@end example
@end deffn
@end deffn

@geindex ThreadingMock (class in unittest.mock)
@anchor{library/unittest mock unittest mock ThreadingMock}@anchor{1773}
@deffn {Class} unittest.mock.ThreadingMock (spec=None, side_effect=None, return_value=DEFAULT, wraps=None, name=None, spec_set=None, unsafe=False, *, timeout=UNSET, **kwargs)

A version of @ref{1095,,MagicMock} for multithreading tests. The
@code{ThreadingMock} object provides extra methods to wait for a call to
be invoked, rather than assert on it immediately.

The default timeout is specified by the @code{timeout} argument, or if unset by the
@ref{49ad,,ThreadingMock.DEFAULT_TIMEOUT} attribute, which defaults to blocking (@code{None}).

You can configure the global default timeout by setting @ref{49ad,,ThreadingMock.DEFAULT_TIMEOUT}.

@geindex wait_until_called() (unittest.mock.ThreadingMock method)
@anchor{library/unittest mock unittest mock ThreadingMock wait_until_called}@anchor{49ae}
@deffn {Method} wait_until_called (*, timeout=UNSET)

Waits until the mock is called.

If a timeout was passed at the creation of the mock or if a timeout
argument is passed to this function, the function raises an
@ref{8ba,,AssertionError} if the call is not performed in time.

@example
>>> mock = ThreadingMock()
>>> thread = threading.Thread(target=mock)
>>> thread.start()
>>> mock.wait_until_called(timeout=1)
>>> thread.join()
@end example
@end deffn

@geindex wait_until_any_call_with() (unittest.mock.ThreadingMock method)
@anchor{library/unittest mock unittest mock ThreadingMock wait_until_any_call_with}@anchor{49af}
@deffn {Method} wait_until_any_call_with (*args, **kwargs)

Waits until the mock is called with the specified arguments.

If a timeout was passed at the creation of the mock
the function raises an @ref{8ba,,AssertionError} if the call is not performed in time.

@example
>>> mock = ThreadingMock()
>>> thread = threading.Thread(target=mock, args=("arg1", "arg2",), kwargs=@{"arg": "thing"@})
>>> thread.start()
>>> mock.wait_until_any_call_with("arg1", "arg2", arg="thing")
>>> thread.join()
@end example
@end deffn

@geindex DEFAULT_TIMEOUT (unittest.mock.ThreadingMock attribute)
@anchor{library/unittest mock unittest mock ThreadingMock DEFAULT_TIMEOUT}@anchor{49ad}
@deffn {Attribute} DEFAULT_TIMEOUT

Global default timeout in seconds to create instances of @code{ThreadingMock}.
@end deffn


Added in version 3.13.

@end deffn

@menu
* Calling:: 
* Deleting Attributes:: 
* Mock names and the name attribute:: 
* Attaching Mocks as Attributes:: 

@end menu

@node Calling,Deleting Attributes,,The Mock Class
@anchor{library/unittest mock calling}@anchor{49b0}
@subsubsection Calling


Mock objects are callable. The call will return the value set as the
@ref{4994,,return_value} attribute. The default return value is a new Mock
object; it is created the first time the return value is accessed (either
explicitly or by calling the Mock) - but it is stored and the same one
returned each time.

Calls made to the object will be recorded in the attributes
like @ref{1dad,,call_args} and @ref{499f,,call_args_list}.

If @ref{498c,,side_effect} is set then it will be called after the call has
been recorded, so if @code{side_effect} raises an exception the call is still
recorded.

The simplest way to make a mock raise an exception when called is to make
@ref{498c,,side_effect} an exception class or instance:

@example
>>> m = MagicMock(side_effect=IndexError)
>>> m(1, 2, 3)
Traceback (most recent call last):
  ...
IndexError
>>> m.mock_calls
[call(1, 2, 3)]
>>> m.side_effect = KeyError('Bang!')
>>> m('two', 'three', 'four')
Traceback (most recent call last):
  ...
KeyError: 'Bang!'
>>> m.mock_calls
[call(1, 2, 3), call('two', 'three', 'four')]
@end example

If @ref{498c,,side_effect} is a function then whatever that function returns is what
calls to the mock return. The @code{side_effect} function is called with the
same arguments as the mock. This allows you to vary the return value of the
call dynamically, based on the input:

@example
>>> def side_effect(value):
...     return value + 1
...
>>> m = MagicMock(side_effect=side_effect)
>>> m(1)
2
>>> m(2)
3
>>> m.mock_calls
[call(1), call(2)]
@end example

If you want the mock to still return the default return value (a new mock), or
any set return value, then there are two ways of doing this. Either return
@ref{4994,,return_value} from inside @ref{498c,,side_effect}, or return @ref{4993,,DEFAULT}:

@example
>>> m = MagicMock()
>>> def side_effect(*args, **kwargs):
...     return m.return_value
...
>>> m.side_effect = side_effect
>>> m.return_value = 3
>>> m()
3
>>> def side_effect(*args, **kwargs):
...     return DEFAULT
...
>>> m.side_effect = side_effect
>>> m()
3
@end example

To remove a @ref{498c,,side_effect}, and return to the default behaviour, set the
@code{side_effect} to @code{None}:

@example
>>> m = MagicMock(return_value=6)
>>> def side_effect(*args, **kwargs):
...     return 3
...
>>> m.side_effect = side_effect
>>> m()
3
>>> m.side_effect = None
>>> m()
6
@end example

The @ref{498c,,side_effect} can also be any iterable object. Repeated calls to the mock
will return values from the iterable (until the iterable is exhausted and
a @ref{dfb,,StopIteration} is raised):

@example
>>> m = MagicMock(side_effect=[1, 2, 3])
>>> m()
1
>>> m()
2
>>> m()
3
>>> m()
Traceback (most recent call last):
  ...
StopIteration
@end example

If any members of the iterable are exceptions they will be raised instead of
returned:

@example
>>> iterable = (33, ValueError, 66)
>>> m = MagicMock(side_effect=iterable)
>>> m()
33
>>> m()
Traceback (most recent call last):
 ...
ValueError
>>> m()
66
@end example

@node Deleting Attributes,Mock names and the name attribute,Calling,The Mock Class
@anchor{library/unittest mock deleting-attributes}@anchor{49b1}@anchor{library/unittest mock id2}@anchor{49b2}
@subsubsection Deleting Attributes


Mock objects create attributes on demand. This allows them to pretend to be
objects of any type.

You may want a mock object to return @code{False} to a @ref{6fa,,hasattr()} call, or raise an
@ref{5f0,,AttributeError} when an attribute is fetched. You can do this by providing
an object as a @code{spec} for a mock, but that isn’t always convenient.

You “block” attributes by deleting them. Once deleted, accessing an attribute
will raise an @ref{5f0,,AttributeError}.

@example
>>> mock = MagicMock()
>>> hasattr(mock, 'm')
True
>>> del mock.m
>>> hasattr(mock, 'm')
False
>>> del mock.f
>>> mock.f
Traceback (most recent call last):
    ...
AttributeError: f
@end example

@node Mock names and the name attribute,Attaching Mocks as Attributes,Deleting Attributes,The Mock Class
@anchor{library/unittest mock mock-names-and-the-name-attribute}@anchor{49b3}
@subsubsection Mock names and the name attribute


Since “name” is an argument to the @ref{c45,,Mock} constructor, if you want your
mock object to have a “name” attribute you can’t just pass it in at creation
time. There are two alternatives. One option is to use
@ref{4995,,configure_mock()}:

@example
>>> mock = MagicMock()
>>> mock.configure_mock(name='my_name')
>>> mock.name
'my_name'
@end example

A simpler option is to simply set the “name” attribute after mock creation:

@example
>>> mock = MagicMock()
>>> mock.name = "foo"
@end example

@node Attaching Mocks as Attributes,,Mock names and the name attribute,The Mock Class
@anchor{library/unittest mock attaching-mocks-as-attributes}@anchor{49b4}
@subsubsection Attaching Mocks as Attributes


When you attach a mock as an attribute of another mock (or as the return
value) it becomes a “child” of that mock. Calls to the child are recorded in
the @ref{499a,,method_calls} and @ref{4998,,mock_calls} attributes of the
parent. This is useful for configuring child mocks and then attaching them to
the parent, or for attaching mocks to a parent that records all calls to the
children and allows you to make assertions about the order of calls between
mocks:

@example
>>> parent = MagicMock()
>>> child1 = MagicMock(return_value=None)
>>> child2 = MagicMock(return_value=None)
>>> parent.child1 = child1
>>> parent.child2 = child2
>>> child1(1)
>>> child2(2)
>>> parent.mock_calls
[call.child1(1), call.child2(2)]
@end example

The exception to this is if the mock has a name. This allows you to prevent
the “parenting” if for some reason you don’t want it to happen.

@example
>>> mock = MagicMock()
>>> not_a_child = MagicMock(name='not-a-child')
>>> mock.attribute = not_a_child
>>> mock.attribute()
<MagicMock name='not-a-child()' id='...'>
>>> mock.mock_calls
[]
@end example

Mocks created for you by @ref{1098,,patch()} are automatically given names. To
attach mocks that have names to a parent you use the @ref{1999,,attach_mock()}
method:

@example
>>> thing1 = object()
>>> thing2 = object()
>>> parent = MagicMock()
>>> with patch('__main__.thing1', return_value=None) as child1:
...     with patch('__main__.thing2', return_value=None) as child2:
...         parent.attach_mock(child1, 'child1')
...         parent.attach_mock(child2, 'child2')
...         child1('one')
...         child2('two')
...
>>> parent.mock_calls
[call.child1('one'), call.child2('two')]
@end example

@node The patchers,MagicMock and magic method support,The Mock Class,unittest mock — mock object library
@anchor{library/unittest mock the-patchers}@anchor{49b5}
@subsubsection The patchers


The patch decorators are used for patching objects only within the scope of
the function they decorate. They automatically handle the unpatching for you,
even if exceptions are raised. All of these functions can also be used in with
statements or as class decorators.

@menu
* patch:: 
* patch.object: patch object. 
* patch.dict: patch dict. 
* patch.multiple: patch multiple. 
* patch methods; start and stop: patch methods start and stop. 
* patch builtins:: 
* TEST_PREFIX:: 
* Nesting Patch Decorators:: 
* Where to patch:: 
* Patching Descriptors and Proxy Objects:: 

@end menu

@node patch,patch object,,The patchers
@anchor{library/unittest mock patch}@anchor{49b6}
@subsubsection patch


@cartouche
@quotation Note 
The key is to do the patching in the right namespace. See the section @ref{49b7,,where to patch}.
@end quotation
@end cartouche

@geindex patch() (in module unittest.mock)
@anchor{library/unittest mock unittest mock patch}@anchor{1098}
@deffn {Function} unittest.mock.patch (target, new=DEFAULT, spec=None, create=False, spec_set=None, autospec=None, new_callable=None, **kwargs)

@code{patch()} acts as a function decorator, class decorator or a context
manager. Inside the body of the function or with statement, the `target'
is patched with a `new' object. When the function/with statement exits
the patch is undone.

If `new' is omitted, then the target is replaced with an
@ref{c44,,AsyncMock} if the patched object is an async function or
a @ref{1095,,MagicMock} otherwise.
If @code{patch()} is used as a decorator and `new' is
omitted, the created mock is passed in as an extra argument to the
decorated function. If @code{patch()} is used as a context manager the created
mock is returned by the context manager.

`target' should be a string in the form @code{'package.module.ClassName'}. The
`target' is imported and the specified object replaced with the `new'
object, so the `target' must be importable from the environment you are
calling @code{patch()} from. The target is imported when the decorated function
is executed, not at decoration time.

The `spec' and `spec_set' keyword arguments are passed to the @ref{1095,,MagicMock}
if patch is creating one for you.

In addition you can pass @code{spec=True} or @code{spec_set=True}, which causes
patch to pass in the object being mocked as the spec/spec_set object.

`new_callable' allows you to specify a different class, or callable object,
that will be called to create the `new' object. By default @ref{c44,,AsyncMock}
is used for async functions and @ref{1095,,MagicMock} for the rest.

A more powerful form of `spec' is `autospec'. If you set @code{autospec=True}
then the mock will be created with a spec from the object being replaced.
All attributes of the mock will also have the spec of the corresponding
attribute of the object being replaced. Methods and functions being mocked
will have their arguments checked and will raise a @ref{199,,TypeError} if they are
called with the wrong signature. For mocks
replacing a class, their return value (the ‘instance’) will have the same
spec as the class. See the @ref{1978,,create_autospec()} function and
@ref{498f,,Autospeccing}.

Instead of @code{autospec=True} you can pass @code{autospec=some_object} to use an
arbitrary object as the spec instead of the one being replaced.

By default @code{patch()} will fail to replace attributes that don’t exist.
If you pass in @code{create=True}, and the attribute doesn’t exist, patch will
create the attribute for you when the patched function is called, and delete
it again after the patched function has exited. This is useful for writing
tests against attributes that your production code creates at runtime. It is
off by default because it can be dangerous. With it switched on you can
write passing tests against APIs that don’t actually exist!

@cartouche
@quotation Note 

Changed in version 3.5: If you are patching builtins in a module then you don’t
need to pass @code{create=True}, it will be added by default.

@end quotation
@end cartouche

Patch can be used as a @ref{2b5,,TestCase} class decorator. It works by
decorating each test method in the class. This reduces the boilerplate
code when your test methods share a common patchings set. @code{patch()} finds
tests by looking for method names that start with @code{patch.TEST_PREFIX}.
By default this is @code{'test'}, which matches the way @ref{10d,,unittest} finds tests.
You can specify an alternative prefix by setting @code{patch.TEST_PREFIX}.

Patch can be used as a context manager, with the with statement. Here the
patching applies to the indented block after the with statement. If you
use “as” then the patched object will be bound to the name after the
“as”; very useful if @code{patch()} is creating a mock object for you.

@code{patch()} takes arbitrary keyword arguments. These will be passed to
@ref{c44,,AsyncMock} if the patched object is asynchronous, to
@ref{1095,,MagicMock} otherwise or to `new_callable' if specified.

@code{patch.dict(...)}, @code{patch.multiple(...)} and @code{patch.object(...)} are
available for alternate use-cases.
@end deffn

@ref{1098,,patch()} as function decorator, creating the mock for you and passing it into
the decorated function:

@example
>>> @@patch('__main__.SomeClass')
... def function(normal_argument, mock_class):
...     print(mock_class is SomeClass)
...
>>> function(None)
True
@end example

Patching a class replaces the class with a @ref{1095,,MagicMock} `instance'. If the
class is instantiated in the code under test then it will be the
@ref{4994,,return_value} of the mock that will be used.

If the class is instantiated multiple times you could use
@ref{498c,,side_effect} to return a new mock each time. Alternatively you
can set the `return_value' to be anything you want.

To configure return values on methods of `instances' on the patched class
you must do this on the @ref{4994,,return_value}. For example:

@example
>>> class Class:
...     def method(self):
...         pass
...
>>> with patch('__main__.Class') as MockClass:
...     instance = MockClass.return_value
...     instance.method.return_value = 'foo'
...     assert Class() is instance
...     assert Class().method() == 'foo'
...
@end example

If you use `spec' or `spec_set' and @ref{1098,,patch()} is replacing a `class', then the
return value of the created mock will have the same spec.

@example
>>> Original = Class
>>> patcher = patch('__main__.Class', spec=True)
>>> MockClass = patcher.start()
>>> instance = MockClass()
>>> assert isinstance(instance, Original)
>>> patcher.stop()
@end example

The `new_callable' argument is useful where you want to use an alternative
class to the default @ref{1095,,MagicMock} for the created mock. For example, if
you wanted a @ref{4991,,NonCallableMock} to be used:

@example
>>> thing = object()
>>> with patch('__main__.thing', new_callable=NonCallableMock) as mock_thing:
...     assert thing is mock_thing
...     thing()
...
Traceback (most recent call last):
  ...
TypeError: 'NonCallableMock' object is not callable
@end example

Another use case might be to replace an object with an @ref{112f,,io.StringIO} instance:

@example
>>> from io import StringIO
>>> def foo():
...     print('Something')
...
>>> @@patch('sys.stdout', new_callable=StringIO)
... def test(mock_stdout):
...     foo()
...     assert mock_stdout.getvalue() == 'Something\n'
...
>>> test()
@end example

When @ref{1098,,patch()} is creating a mock for you, it is common that the first thing
you need to do is to configure the mock. Some of that configuration can be done
in the call to patch. Any arbitrary keywords you pass into the call will be
used to set attributes on the created mock:

@example
>>> patcher = patch('__main__.thing', first='one', second='two')
>>> mock_thing = patcher.start()
>>> mock_thing.first
'one'
>>> mock_thing.second
'two'
@end example

As well as attributes on the created mock attributes, like the
@ref{4994,,return_value} and @ref{498c,,side_effect}, of child mocks can
also be configured. These aren’t syntactically valid to pass in directly as
keyword arguments, but a dictionary with these as keys can still be expanded
into a @ref{1098,,patch()} call using @code{**}:

@example
>>> config = @{'method.return_value': 3, 'other.side_effect': KeyError@}
>>> patcher = patch('__main__.thing', **config)
>>> mock_thing = patcher.start()
>>> mock_thing.method()
3
>>> mock_thing.other()
Traceback (most recent call last):
  ...
KeyError
@end example

By default, attempting to patch a function in a module (or a method or an
attribute in a class) that does not exist will fail with @ref{5f0,,AttributeError}:

@example
>>> @@patch('sys.non_existing_attribute', 42)
... def test():
...     assert sys.non_existing_attribute == 42
...
>>> test()
Traceback (most recent call last):
  ...
AttributeError: <module 'sys' (built-in)> does not have the attribute 'non_existing_attribute'
@end example

but adding @code{create=True} in the call to @ref{1098,,patch()} will make the previous example
work as expected:

@example
>>> @@patch('sys.non_existing_attribute', 42, create=True)
... def test(mock_stdout):
...     assert sys.non_existing_attribute == 42
...
>>> test()
@end example


Changed in version 3.8: @ref{1098,,patch()} now returns an @ref{c44,,AsyncMock} if the target is an async function.


@node patch object,patch dict,patch,The patchers
@anchor{library/unittest mock patch-object}@anchor{49b8}
@subsubsection patch.object


@geindex patch.object() (in module unittest.mock)
@anchor{library/unittest mock unittest mock patch object}@anchor{194b}
@deffn {Function} patch.object (target, attribute, new=DEFAULT, spec=None, create=False, spec_set=None, autospec=None, new_callable=None, **kwargs)

patch the named member (`attribute') on an object (`target') with a mock
object.

@code{patch.object()} can be used as a decorator, class decorator or a context
manager. Arguments `new', `spec', `create', `spec_set', `autospec' and
`new_callable' have the same meaning as for @ref{1098,,patch()}. Like @code{patch()},
@code{patch.object()} takes arbitrary keyword arguments for configuring the mock
object it creates.

When used as a class decorator @code{patch.object()} honours @code{patch.TEST_PREFIX}
for choosing which methods to wrap.
@end deffn

You can either call @ref{194b,,patch.object()} with three arguments or two arguments. The
three argument form takes the object to be patched, the attribute name and the
object to replace the attribute with.

When calling with the two argument form you omit the replacement object, and a
mock is created for you and passed in as an extra argument to the decorated
function:

@example
>>> @@patch.object(SomeClass, 'class_method')
... def test(mock_method):
...     SomeClass.class_method(3)
...     mock_method.assert_called_with(3)
...
>>> test()
@end example

`spec', `create' and the other arguments to @ref{194b,,patch.object()} have the same
meaning as they do for @ref{1098,,patch()}.

@node patch dict,patch multiple,patch object,The patchers
@anchor{library/unittest mock patch-dict}@anchor{49b9}
@subsubsection patch.dict


@geindex patch.dict() (in module unittest.mock)
@anchor{library/unittest mock unittest mock patch dict}@anchor{19ab}
@deffn {Function} patch.dict (in_dict, values=(), clear=False, **kwargs)

Patch a dictionary, or dictionary like object, and restore the dictionary
to its original state after the test, where the restored dictionary is a
copy of the dictionary as it was before the test.

`in_dict' can be a dictionary or a mapping like container. If it is a
mapping then it must at least support getting, setting and deleting items
plus iterating over keys.

`in_dict' can also be a string specifying the name of the dictionary, which
will then be fetched by importing it.

`values' can be a dictionary of values to set in the dictionary. `values'
can also be an iterable of @code{(key, value)} pairs.

If `clear' is true then the dictionary will be cleared before the new
values are set.

@code{patch.dict()} can also be called with arbitrary keyword arguments to set
values in the dictionary.


Changed in version 3.8: @code{patch.dict()} now returns the patched dictionary when used as a context
manager.

@end deffn

@ref{19ab,,patch.dict()} can be used as a context manager, decorator or class
decorator:

@example
>>> foo = @{@}
>>> @@patch.dict(foo, @{'newkey': 'newvalue'@})
... def test():
...     assert foo == @{'newkey': 'newvalue'@}
...
>>> test()
>>> assert foo == @{@}
@end example

When used as a class decorator @ref{19ab,,patch.dict()} honours
@code{patch.TEST_PREFIX} (default to @code{'test'}) for choosing which methods to wrap:

@example
>>> import os
>>> import unittest
>>> from unittest.mock import patch
>>> @@patch.dict('os.environ', @{'newkey': 'newvalue'@})
... class TestSample(unittest.TestCase):
...     def test_sample(self):
...         self.assertEqual(os.environ['newkey'], 'newvalue')
@end example

If you want to use a different prefix for your test, you can inform the
patchers of the different prefix by setting @code{patch.TEST_PREFIX}. For
more details about how to change the value of see @ref{49ba,,TEST_PREFIX}.

@ref{19ab,,patch.dict()} can be used to add members to a dictionary, or simply let a test
change a dictionary, and ensure the dictionary is restored when the test
ends.

@example
>>> foo = @{@}
>>> with patch.dict(foo, @{'newkey': 'newvalue'@}) as patched_foo:
...     assert foo == @{'newkey': 'newvalue'@}
...     assert patched_foo == @{'newkey': 'newvalue'@}
...     # You can add, update or delete keys of foo (or patched_foo, it's the same dict)
...     patched_foo['spam'] = 'eggs'
...
>>> assert foo == @{@}
>>> assert patched_foo == @{@}
@end example

@example
>>> import os
>>> with patch.dict('os.environ', @{'newkey': 'newvalue'@}):
...     print(os.environ['newkey'])
...
newvalue
>>> assert 'newkey' not in os.environ
@end example

Keywords can be used in the @ref{19ab,,patch.dict()} call to set values in the dictionary:

@example
>>> mymodule = MagicMock()
>>> mymodule.function.return_value = 'fish'
>>> with patch.dict('sys.modules', mymodule=mymodule):
...     import mymodule
...     mymodule.function('some', 'args')
...
'fish'
@end example

@ref{19ab,,patch.dict()} can be used with dictionary like objects that aren’t actually
dictionaries. At the very minimum they must support item getting, setting,
deleting and either iteration or membership test. This corresponds to the
magic methods @ref{588,,__getitem__()}, @ref{14d7,,__setitem__()},
@ref{14d8,,__delitem__()} and either @ref{20ee,,__iter__()} or
@ref{15c5,,__contains__()}.

@example
>>> class Container:
...     def __init__(self):
...         self.values = @{@}
...     def __getitem__(self, name):
...         return self.values[name]
...     def __setitem__(self, name, value):
...         self.values[name] = value
...     def __delitem__(self, name):
...         del self.values[name]
...     def __iter__(self):
...         return iter(self.values)
...
>>> thing = Container()
>>> thing['one'] = 1
>>> with patch.dict(thing, one=2, two=3):
...     assert thing['one'] == 2
...     assert thing['two'] == 3
...
>>> assert thing['one'] == 1
>>> assert list(thing) == ['one']
@end example

@node patch multiple,patch methods start and stop,patch dict,The patchers
@anchor{library/unittest mock patch-multiple}@anchor{49bb}
@subsubsection patch.multiple


@geindex patch.multiple() (in module unittest.mock)
@anchor{library/unittest mock unittest mock patch multiple}@anchor{49bc}
@deffn {Function} patch.multiple (target, spec=None, create=False, spec_set=None, autospec=None, new_callable=None, **kwargs)

Perform multiple patches in a single call. It takes the object to be
patched (either as an object or a string to fetch the object by importing)
and keyword arguments for the patches:

@example
with patch.multiple(settings, FIRST_PATCH='one', SECOND_PATCH='two'):
    ...
@end example

Use @ref{4993,,DEFAULT} as the value if you want @code{patch.multiple()} to create
mocks for you. In this case the created mocks are passed into a decorated
function by keyword, and a dictionary is returned when @code{patch.multiple()} is
used as a context manager.

@code{patch.multiple()} can be used as a decorator, class decorator or a context
manager. The arguments `spec', `spec_set', `create', `autospec' and
`new_callable' have the same meaning as for @ref{1098,,patch()}. These arguments will
be applied to `all' patches done by @code{patch.multiple()}.

When used as a class decorator @code{patch.multiple()} honours @code{patch.TEST_PREFIX}
for choosing which methods to wrap.
@end deffn

If you want @ref{49bc,,patch.multiple()} to create mocks for you, then you can use
@ref{4993,,DEFAULT} as the value. If you use @code{patch.multiple()} as a decorator
then the created mocks are passed into the decorated function by keyword.

@example
>>> thing = object()
>>> other = object()

>>> @@patch.multiple('__main__', thing=DEFAULT, other=DEFAULT)
... def test_function(thing, other):
...     assert isinstance(thing, MagicMock)
...     assert isinstance(other, MagicMock)
...
>>> test_function()
@end example

@ref{49bc,,patch.multiple()} can be nested with other @code{patch} decorators, but put arguments
passed by keyword `after' any of the standard arguments created by @ref{1098,,patch()}:

@example
>>> @@patch('sys.exit')
... @@patch.multiple('__main__', thing=DEFAULT, other=DEFAULT)
... def test_function(mock_exit, other, thing):
...     assert 'other' in repr(other)
...     assert 'thing' in repr(thing)
...     assert 'exit' in repr(mock_exit)
...
>>> test_function()
@end example

If @ref{49bc,,patch.multiple()} is used as a context manager, the value returned by the
context manager is a dictionary where created mocks are keyed by name:

@example
>>> with patch.multiple('__main__', thing=DEFAULT, other=DEFAULT) as values:
...     assert 'other' in repr(values['other'])
...     assert 'thing' in repr(values['thing'])
...     assert values['thing'] is thing
...     assert values['other'] is other
...
@end example

@node patch methods start and stop,patch builtins,patch multiple,The patchers
@anchor{library/unittest mock patch-methods-start-and-stop}@anchor{49bd}@anchor{library/unittest mock start-and-stop}@anchor{49be}
@subsubsection patch methods: start and stop


All the patchers have @code{start()} and @code{stop()} methods. These make it simpler to do
patching in @code{setUp} methods or where you want to do multiple patches without
nesting decorators or with statements.

To use them call @ref{1098,,patch()}, @ref{194b,,patch.object()} or @ref{19ab,,patch.dict()} as
normal and keep a reference to the returned @code{patcher} object. You can then
call @code{start()} to put the patch in place and @code{stop()} to undo it.

If you are using @ref{1098,,patch()} to create a mock for you then it will be returned by
the call to @code{patcher.start}.

@example
>>> patcher = patch('package.module.ClassName')
>>> from package import module
>>> original = module.ClassName
>>> new_mock = patcher.start()
>>> assert module.ClassName is not original
>>> assert module.ClassName is new_mock
>>> patcher.stop()
>>> assert module.ClassName is original
>>> assert module.ClassName is not new_mock
@end example

A typical use case for this might be for doing multiple patches in the @code{setUp}
method of a @ref{2b5,,TestCase}:

@example
>>> class MyTest(unittest.TestCase):
...     def setUp(self):
...         self.patcher1 = patch('package.module.Class1')
...         self.patcher2 = patch('package.module.Class2')
...         self.MockClass1 = self.patcher1.start()
...         self.MockClass2 = self.patcher2.start()
...
...     def tearDown(self):
...         self.patcher1.stop()
...         self.patcher2.stop()
...
...     def test_something(self):
...         assert package.module.Class1 is self.MockClass1
...         assert package.module.Class2 is self.MockClass2
...
>>> MyTest('test_something').run()
@end example

@cartouche
@quotation Caution 
If you use this technique you must ensure that the patching is “undone” by
calling @code{stop}. This can be fiddlier than you might think, because if an
exception is raised in the @code{setUp} then @code{tearDown} is not called.
@ref{c7a,,unittest.TestCase.addCleanup()} makes this easier:

@example
>>> class MyTest(unittest.TestCase):
...     def setUp(self):
...         patcher = patch('package.module.Class')
...         self.MockClass = patcher.start()
...         self.addCleanup(patcher.stop)
...
...     def test_something(self):
...         assert package.module.Class is self.MockClass
...
@end example

As an added bonus you no longer need to keep a reference to the @code{patcher}
object.
@end quotation
@end cartouche

It is also possible to stop all patches which have been started by using
@ref{49bf,,patch.stopall()}.

@geindex patch.stopall() (in module unittest.mock)
@anchor{library/unittest mock unittest mock patch stopall}@anchor{49bf}
@deffn {Function} patch.stopall ()

Stop all active patches. Only stops patches started with @code{start}.
@end deffn

@node patch builtins,TEST_PREFIX,patch methods start and stop,The patchers
@anchor{library/unittest mock id4}@anchor{49c0}@anchor{library/unittest mock patch-builtins}@anchor{49c1}
@subsubsection patch builtins


You can patch any builtins within a module. The following example patches
builtin @ref{237f,,ord()}:

@example
>>> @@patch('__main__.ord')
... def test(mock_ord):
...     mock_ord.return_value = 101
...     print(ord('c'))
...
>>> test()
101
@end example

@node TEST_PREFIX,Nesting Patch Decorators,patch builtins,The patchers
@anchor{library/unittest mock id5}@anchor{49c2}@anchor{library/unittest mock test-prefix}@anchor{49ba}
@subsubsection TEST_PREFIX


All of the patchers can be used as class decorators. When used in this way
they wrap every test method on the class. The patchers recognise methods that
start with @code{'test'} as being test methods. This is the same way that the
@ref{593,,unittest.TestLoader} finds test methods by default.

It is possible that you want to use a different prefix for your tests. You can
inform the patchers of the different prefix by setting @code{patch.TEST_PREFIX}:

@example
>>> patch.TEST_PREFIX = 'foo'
>>> value = 3
>>>
>>> @@patch('__main__.value', 'not three')
... class Thing:
...     def foo_one(self):
...         print(value)
...     def foo_two(self):
...         print(value)
...
>>>
>>> Thing().foo_one()
not three
>>> Thing().foo_two()
not three
>>> value
3
@end example

@node Nesting Patch Decorators,Where to patch,TEST_PREFIX,The patchers
@anchor{library/unittest mock nesting-patch-decorators}@anchor{49c3}
@subsubsection Nesting Patch Decorators


If you want to perform multiple patches then you can simply stack up the
decorators.

You can stack up multiple patch decorators using this pattern:

@example
>>> @@patch.object(SomeClass, 'class_method')
... @@patch.object(SomeClass, 'static_method')
... def test(mock1, mock2):
...     assert SomeClass.static_method is mock1
...     assert SomeClass.class_method is mock2
...     SomeClass.static_method('foo')
...     SomeClass.class_method('bar')
...     return mock1, mock2
...
>>> mock1, mock2 = test()
>>> mock1.assert_called_once_with('foo')
>>> mock2.assert_called_once_with('bar')
@end example

Note that the decorators are applied from the bottom upwards. This is the
standard way that Python applies decorators. The order of the created mocks
passed into your test function matches this order.

@node Where to patch,Patching Descriptors and Proxy Objects,Nesting Patch Decorators,The patchers
@anchor{library/unittest mock id6}@anchor{49b7}@anchor{library/unittest mock where-to-patch}@anchor{498d}
@subsubsection Where to patch


@ref{1098,,patch()} works by (temporarily) changing the object that a `name' points to with
another one. There can be many names pointing to any individual object, so
for patching to work you must ensure that you patch the name used by the system
under test.

The basic principle is that you patch where an object is `looked up', which
is not necessarily the same place as where it is defined. A couple of
examples will help to clarify this.

Imagine we have a project that we want to test with the following structure:

@example
a.py
    -> Defines SomeClass

b.py
    -> from a import SomeClass
    -> some_function instantiates SomeClass
@end example

Now we want to test @code{some_function} but we want to mock out @code{SomeClass} using
@ref{1098,,patch()}. The problem is that when we import module b, which we will have to
do when it imports @code{SomeClass} from module a. If we use @code{patch()} to mock out
@code{a.SomeClass} then it will have no effect on our test; module b already has a
reference to the `real' @code{SomeClass} and it looks like our patching had no
effect.

The key is to patch out @code{SomeClass} where it is used (or where it is looked up).
In this case @code{some_function} will actually look up @code{SomeClass} in module b,
where we have imported it. The patching should look like:

@example
@@patch('b.SomeClass')
@end example

However, consider the alternative scenario where instead of @code{from a import
SomeClass} module b does @code{import a} and @code{some_function} uses @code{a.SomeClass}. Both
of these import forms are common. In this case the class we want to patch is
being looked up in the module and so we have to patch @code{a.SomeClass} instead:

@example
@@patch('a.SomeClass')
@end example

@node Patching Descriptors and Proxy Objects,,Where to patch,The patchers
@anchor{library/unittest mock patching-descriptors-and-proxy-objects}@anchor{49c4}
@subsubsection Patching Descriptors and Proxy Objects


Both @ref{49b6,,patch} and @ref{49b8,,patch.object} correctly patch and restore descriptors: class
methods, static methods and properties. You should patch these on the `class'
rather than an instance. They also work with `some' objects
that proxy attribute access, like the django settings object@footnote{https://web.archive.org/web/20200603181648/http://www.voidspace.org.uk/python/weblog/arch_d7_2010_12_04.shtml#e1198}.

@node MagicMock and magic method support,Helpers,The patchers,unittest mock — mock object library
@anchor{library/unittest mock magicmock-and-magic-method-support}@anchor{49c5}
@subsubsection MagicMock and magic method support


@menu
* Mocking Magic Methods:: 
* Magic Mock:: 

@end menu

@node Mocking Magic Methods,Magic Mock,,MagicMock and magic method support
@anchor{library/unittest mock magic-methods}@anchor{498e}@anchor{library/unittest mock mocking-magic-methods}@anchor{49c6}
@subsubsection Mocking Magic Methods


@ref{c45,,Mock} supports mocking the Python protocol methods, also known as
@ref{49c7,,“magic methods”}. This allows mock objects to replace
containers or other objects that implement Python protocols.

Because magic methods are looked up differently from normal methods @footnote{
Magic methods `should' be looked up on the class rather than the
instance. Different versions of Python are inconsistent about applying this
rule. The supported protocol methods should work with all supported versions
of Python.
}, this
support has been specially implemented. This means that only specific magic
methods are supported. The supported list includes `almost' all of them. If
there are any missing that you need please let us know.

You mock magic methods by setting the method you are interested in to a function
or a mock instance. If you are using a function then it `must' take @code{self} as
the first argument @footnote{
The function is basically hooked up to the class, but each @code{Mock}
instance is kept isolated from the others.
}.

@example
>>> def __str__(self):
...     return 'fooble'
...
>>> mock = Mock()
>>> mock.__str__ = __str__
>>> str(mock)
'fooble'
@end example

@example
>>> mock = Mock()
>>> mock.__str__ = Mock()
>>> mock.__str__.return_value = 'fooble'
>>> str(mock)
'fooble'
@end example

@example
>>> mock = Mock()
>>> mock.__iter__ = Mock(return_value=iter([]))
>>> list(mock)
[]
@end example

One use case for this is for mocking objects used as context managers in a
@ref{187,,with} statement:

@example
>>> mock = Mock()
>>> mock.__enter__ = Mock(return_value='foo')
>>> mock.__exit__ = Mock(return_value=False)
>>> with mock as m:
...     assert m == 'foo'
...
>>> mock.__enter__.assert_called_with()
>>> mock.__exit__.assert_called_with(None, None, None)
@end example

Calls to magic methods do not appear in @ref{499a,,method_calls}, but they
are recorded in @ref{4998,,mock_calls}.

@cartouche
@quotation Note 
If you use the `spec' keyword argument to create a mock then attempting to
set a magic method that isn’t in the spec will raise an @ref{5f0,,AttributeError}.
@end quotation
@end cartouche

The full list of supported magic methods is:


@itemize *

@item 
@code{__hash__}, @code{__sizeof__}, @code{__repr__} and @code{__str__}

@item 
@code{__dir__}, @code{__format__} and @code{__subclasses__}

@item 
@code{__round__}, @code{__floor__}, @code{__trunc__} and @code{__ceil__}

@item 
Comparisons: @code{__lt__}, @code{__gt__}, @code{__le__}, @code{__ge__},
@code{__eq__} and @code{__ne__}

@item 
Container methods: @code{__getitem__}, @code{__setitem__}, @code{__delitem__},
@code{__contains__}, @code{__len__}, @code{__iter__}, @code{__reversed__}
and @code{__missing__}

@item 
Context manager: @code{__enter__}, @code{__exit__}, @code{__aenter__} and @code{__aexit__}

@item 
Unary numeric methods: @code{__neg__}, @code{__pos__} and @code{__invert__}

@item 
The numeric methods (including right hand and in-place variants):
@code{__add__}, @code{__sub__}, @code{__mul__}, @code{__matmul__}, @code{__truediv__},
@code{__floordiv__}, @code{__mod__}, @code{__divmod__}, @code{__lshift__},
@code{__rshift__}, @code{__and__}, @code{__xor__}, @code{__or__}, and @code{__pow__}

@item 
Numeric conversion methods: @code{__complex__}, @code{__int__}, @code{__float__}
and @code{__index__}

@item 
Descriptor methods: @code{__get__}, @code{__set__} and @code{__delete__}

@item 
Pickling: @code{__reduce__}, @code{__reduce_ex__}, @code{__getinitargs__},
@code{__getnewargs__}, @code{__getstate__} and @code{__setstate__}

@item 
File system path representation: @code{__fspath__}

@item 
Asynchronous iteration methods: @code{__aiter__} and @code{__anext__}
@end itemize


Changed in version 3.8: Added support for @ref{e52,,os.PathLike.__fspath__()}.



Changed in version 3.8: Added support for @code{__aenter__}, @code{__aexit__}, @code{__aiter__} and @code{__anext__}.


The following methods exist but are `not' supported as they are either in use
by mock, can’t be set dynamically, or can cause problems:


@itemize *

@item 
@code{__getattr__}, @code{__setattr__}, @code{__init__} and @code{__new__}

@item 
@code{__prepare__}, @code{__instancecheck__}, @code{__subclasscheck__}, @code{__del__}
@end itemize

@node Magic Mock,,Mocking Magic Methods,MagicMock and magic method support
@anchor{library/unittest mock magic-mock}@anchor{49c8}
@subsubsection Magic Mock


There are two @code{MagicMock} variants: @ref{1095,,MagicMock} and @ref{4992,,NonCallableMagicMock}.

@geindex MagicMock (class in unittest.mock)
@anchor{library/unittest mock unittest mock MagicMock}@anchor{1095}
@deffn {Class} unittest.mock.MagicMock (*args, **kw)

@code{MagicMock} is a subclass of @ref{c45,,Mock} with default implementations
of most of the @ref{49c7,,magic methods}. You can use
@code{MagicMock} without having to configure the magic methods yourself.

The constructor parameters have the same meaning as for @ref{c45,,Mock}.

If you use the `spec' or `spec_set' arguments then `only' magic methods
that exist in the spec will be created.
@end deffn

@geindex NonCallableMagicMock (class in unittest.mock)
@anchor{library/unittest mock unittest mock NonCallableMagicMock}@anchor{4992}
@deffn {Class} unittest.mock.NonCallableMagicMock (*args, **kw)

A non-callable version of @ref{1095,,MagicMock}.

The constructor parameters have the same meaning as for
@ref{1095,,MagicMock}, with the exception of `return_value' and
`side_effect' which have no meaning on a non-callable mock.
@end deffn

The magic methods are setup with @ref{1095,,MagicMock} objects, so you can configure them
and use them in the usual way:

@example
>>> mock = MagicMock()
>>> mock[3] = 'fish'
>>> mock.__setitem__.assert_called_with(3, 'fish')
>>> mock.__getitem__.return_value = 'result'
>>> mock[2]
'result'
@end example

By default many of the protocol methods are required to return objects of a
specific type. These methods are preconfigured with a default return value, so
that they can be used without you having to do anything if you aren’t interested
in the return value. You can still `set' the return value manually if you want
to change the default.

Methods and their defaults:


@itemize *

@item 
@code{__lt__}: @ref{1a3,,NotImplemented}

@item 
@code{__gt__}: @code{NotImplemented}

@item 
@code{__le__}: @code{NotImplemented}

@item 
@code{__ge__}: @code{NotImplemented}

@item 
@code{__int__}: @code{1}

@item 
@code{__contains__}: @code{False}

@item 
@code{__len__}: @code{0}

@item 
@code{__iter__}: @code{iter([])}

@item 
@code{__exit__}: @code{False}

@item 
@code{__aexit__}: @code{False}

@item 
@code{__complex__}: @code{1j}

@item 
@code{__float__}: @code{1.0}

@item 
@code{__bool__}: @code{True}

@item 
@code{__index__}: @code{1}

@item 
@code{__hash__}: default hash for the mock

@item 
@code{__str__}: default str for the mock

@item 
@code{__sizeof__}: default sizeof for the mock
@end itemize

For example:

@example
>>> mock = MagicMock()
>>> int(mock)
1
>>> len(mock)
0
>>> list(mock)
[]
>>> object() in mock
False
@end example

The two equality methods, @code{__eq__()} and @code{__ne__()}, are special.
They do the default equality comparison on identity, using the
@ref{498c,,side_effect} attribute, unless you change their return value to
return something else:

@example
>>> MagicMock() == 3
False
>>> MagicMock() != 3
True
>>> mock = MagicMock()
>>> mock.__eq__.return_value = True
>>> mock == 3
True
@end example

The return value of @code{__iter__()} can be any iterable object and isn’t
required to be an iterator:

@example
>>> mock = MagicMock()
>>> mock.__iter__.return_value = ['a', 'b', 'c']
>>> list(mock)
['a', 'b', 'c']
>>> list(mock)
['a', 'b', 'c']
@end example

If the return value `is' an iterator, then iterating over it once will consume
it and subsequent iterations will result in an empty list:

@example
>>> mock.__iter__.return_value = iter(['a', 'b', 'c'])
>>> list(mock)
['a', 'b', 'c']
>>> list(mock)
[]
@end example

@code{MagicMock} has all of the supported magic methods configured except for some
of the obscure and obsolete ones. You can still set these up if you want.

Magic methods that are supported but not setup by default in @code{MagicMock} are:


@itemize *

@item 
@code{__subclasses__}

@item 
@code{__dir__}

@item 
@code{__format__}

@item 
@code{__get__}, @code{__set__} and @code{__delete__}

@item 
@code{__reversed__} and @code{__missing__}

@item 
@code{__reduce__}, @code{__reduce_ex__}, @code{__getinitargs__}, @code{__getnewargs__},
@code{__getstate__} and @code{__setstate__}

@item 
@code{__getformat__}
@end itemize

@node Helpers,Order of precedence of side_effect return_value and wraps,MagicMock and magic method support,unittest mock — mock object library
@anchor{library/unittest mock helpers}@anchor{49c9}
@subsubsection Helpers


@menu
* sentinel:: 
* DEFAULT:: 
* call:: 
* create_autospec:: 
* ANY:: 
* FILTER_DIR:: 
* mock_open:: 
* Autospeccing:: 
* Sealing mocks:: 

@end menu

@node sentinel,DEFAULT,,Helpers
@anchor{library/unittest mock sentinel}@anchor{49ca}
@subsubsection sentinel


@geindex sentinel (in module unittest.mock)
@anchor{library/unittest mock unittest mock sentinel}@anchor{d9f}
@deffn {Data} unittest.mock.sentinel

The @code{sentinel} object provides a convenient way of providing unique
objects for your tests.

Attributes are created on demand when you access them by name. Accessing
the same attribute will always return the same object. The objects
returned have a sensible repr so that test failure messages are readable.


Changed in version 3.7: The @code{sentinel} attributes now preserve their identity when they are
@ref{29,,copied} or @ref{ab,,pickled}.

@end deffn

Sometimes when testing you need to test that a specific object is passed as an
argument to another method, or returned. It can be common to create named
sentinel objects to test this. @ref{d9f,,sentinel} provides a convenient way of
creating and testing the identity of objects like this.

In this example we monkey patch @code{method} to return @code{sentinel.some_object}:

@example
>>> real = ProductionClass()
>>> real.method = Mock(name="method")
>>> real.method.return_value = sentinel.some_object
>>> result = real.method()
>>> assert result is sentinel.some_object
>>> result
sentinel.some_object
@end example

@node DEFAULT,call,sentinel,Helpers
@anchor{library/unittest mock default}@anchor{49cb}
@subsubsection DEFAULT


@geindex DEFAULT (in module unittest.mock)
@anchor{library/unittest mock unittest mock DEFAULT}@anchor{4993}
@deffn {Data} unittest.mock.DEFAULT

The @code{DEFAULT} object is a pre-created sentinel (actually
@code{sentinel.DEFAULT}). It can be used by @ref{498c,,side_effect}
functions to indicate that the normal return value should be used.
@end deffn

@node call,create_autospec,DEFAULT,Helpers
@anchor{library/unittest mock call}@anchor{49cc}
@subsubsection call


@geindex call() (in module unittest.mock)
@anchor{library/unittest mock unittest mock call}@anchor{1df5}
@deffn {Function} unittest.mock.call (*args, **kwargs)

@code{call()} is a helper object for making simpler assertions, for comparing with
@ref{1dad,,call_args}, @ref{499f,,call_args_list},
@ref{4998,,mock_calls} and @ref{499a,,method_calls}. @code{call()} can also be
used with @ref{1a69,,assert_has_calls()}.

@example
>>> m = MagicMock(return_value=None)
>>> m(1, 2, a='foo', b='bar')
>>> m()
>>> m.call_args_list == [call(1, 2, a='foo', b='bar'), call()]
True
@end example
@end deffn

@geindex call_list() (unittest.mock.call method)
@anchor{library/unittest mock unittest mock call call_list}@anchor{49cd}
@deffn {Method} call.call_list ()

For a call object that represents multiple calls, @code{call_list()}
returns a list of all the intermediate calls as well as the
final call.
@end deffn

@code{call_list} is particularly useful for making assertions on “chained calls”. A
chained call is multiple calls on a single line of code. This results in
multiple entries in @ref{4998,,mock_calls} on a mock. Manually constructing
the sequence of calls can be tedious.

@ref{49cd,,call_list()} can construct the sequence of calls from the same
chained call:

@example
>>> m = MagicMock()
>>> m(1).method(arg='foo').other('bar')(2.0)
<MagicMock name='mock().method().other()()' id='...'>
>>> kall = call(1).method(arg='foo').other('bar')(2.0)
>>> kall.call_list()
[call(1),
 call().method(arg='foo'),
 call().method().other('bar'),
 call().method().other()(2.0)]
>>> m.mock_calls == kall.call_list()
True
@end example
@anchor{library/unittest mock calls-as-tuples}@anchor{49a0}
A @code{call} object is either a tuple of (positional args, keyword args) or
(name, positional args, keyword args) depending on how it was constructed. When
you construct them yourself this isn’t particularly interesting, but the @code{call}
objects that are in the @ref{1dad,,Mock.call_args}, @ref{499f,,Mock.call_args_list} and
@ref{4998,,Mock.mock_calls} attributes can be introspected to get at the individual
arguments they contain.

The @code{call} objects in @ref{1dad,,Mock.call_args} and @ref{499f,,Mock.call_args_list}
are two-tuples of (positional args, keyword args) whereas the @code{call} objects
in @ref{4998,,Mock.mock_calls}, along with ones you construct yourself, are
three-tuples of (name, positional args, keyword args).

You can use their “tupleness” to pull out the individual arguments for more
complex introspection and assertions. The positional arguments are a tuple
(an empty tuple if there are no positional arguments) and the keyword
arguments are a dictionary:

@example
>>> m = MagicMock(return_value=None)
>>> m(1, 2, 3, arg='one', arg2='two')
>>> kall = m.call_args
>>> kall.args
(1, 2, 3)
>>> kall.kwargs
@{'arg': 'one', 'arg2': 'two'@}
>>> kall.args is kall[0]
True
>>> kall.kwargs is kall[1]
True
@end example

@example
>>> m = MagicMock()
>>> m.foo(4, 5, 6, arg='two', arg2='three')
<MagicMock name='mock.foo()' id='...'>
>>> kall = m.mock_calls[0]
>>> name, args, kwargs = kall
>>> name
'foo'
>>> args
(4, 5, 6)
>>> kwargs
@{'arg': 'two', 'arg2': 'three'@}
>>> name is m.mock_calls[0][0]
True
@end example

@node create_autospec,ANY,call,Helpers
@anchor{library/unittest mock create-autospec}@anchor{49ce}
@subsubsection create_autospec


@geindex create_autospec() (in module unittest.mock)
@anchor{library/unittest mock unittest mock create_autospec}@anchor{1978}
@deffn {Function} unittest.mock.create_autospec (spec, spec_set=False, instance=False, **kwargs)

Create a mock object using another object as a spec. Attributes on the
mock will use the corresponding attribute on the `spec' object as their
spec.

Functions or methods being mocked will have their arguments checked to
ensure that they are called with the correct signature.

If `spec_set' is @code{True} then attempting to set attributes that don’t exist
on the spec object will raise an @ref{5f0,,AttributeError}.

If a class is used as a spec then the return value of the mock (the
instance of the class) will have the same spec. You can use a class as the
spec for an instance object by passing @code{instance=True}. The returned mock
will only be callable if instances of the mock are callable.

@code{create_autospec()} also takes arbitrary keyword arguments that are passed to
the constructor of the created mock.
@end deffn

See @ref{498f,,Autospeccing} for examples of how to use auto-speccing with
@ref{1978,,create_autospec()} and the `autospec' argument to @ref{1098,,patch()}.


Changed in version 3.8: @ref{1978,,create_autospec()} now returns an @ref{c44,,AsyncMock} if the target is
an async function.


@node ANY,FILTER_DIR,create_autospec,Helpers
@anchor{library/unittest mock any}@anchor{49cf}
@subsubsection ANY


@geindex ANY (in module unittest.mock)
@anchor{library/unittest mock unittest mock ANY}@anchor{1df3}
@deffn {Data} unittest.mock.ANY
@end deffn

Sometimes you may need to make assertions about `some' of the arguments in a
call to mock, but either not care about some of the arguments or want to pull
them individually out of @ref{1dad,,call_args} and make more complex
assertions on them.

To ignore certain arguments you can pass in objects that compare equal to
`everything'. Calls to @ref{1e46,,assert_called_with()} and
@ref{4996,,assert_called_once_with()} will then succeed no matter what was
passed in.

@example
>>> mock = Mock(return_value=None)
>>> mock('foo', bar=object())
>>> mock.assert_called_once_with('foo', bar=ANY)
@end example

@ref{1df3,,ANY} can also be used in comparisons with call lists like
@ref{4998,,mock_calls}:

@example
>>> m = MagicMock(return_value=None)
>>> m(1)
>>> m(1, 2)
>>> m(object())
>>> m.mock_calls == [call(1), call(1, 2), ANY]
True
@end example

@ref{1df3,,ANY} is not limited to comparisons with call objects and so
can also be used in test assertions:

@example
class TestStringMethods(unittest.TestCase):

    def test_split(self):
        s = 'hello world'
        self.assertEqual(s.split(), ['hello', ANY])
@end example

@node FILTER_DIR,mock_open,ANY,Helpers
@anchor{library/unittest mock filter-dir}@anchor{49d0}
@subsubsection FILTER_DIR


@geindex FILTER_DIR (in module unittest.mock)
@anchor{library/unittest mock unittest mock FILTER_DIR}@anchor{499c}
@deffn {Data} unittest.mock.FILTER_DIR
@end deffn

@ref{499c,,FILTER_DIR} is a module level variable that controls the way mock objects
respond to @ref{845,,dir()}. The default is @code{True},
which uses the filtering described below, to only show useful members. If you
dislike this filtering, or need to switch it off for diagnostic purposes, then
set @code{mock.FILTER_DIR = False}.

With filtering on, @code{dir(some_mock)} shows only useful attributes and will
include any dynamically created attributes that wouldn’t normally be shown.
If the mock was created with a `spec' (or `autospec' of course) then all the
attributes from the original are shown, even if they haven’t been accessed
yet:

@example
>>> dir(Mock())
['assert_any_call',
 'assert_called',
 'assert_called_once',
 'assert_called_once_with',
 'assert_called_with',
 'assert_has_calls',
 'assert_not_called',
 'attach_mock',
 ...
>>> from urllib import request
>>> dir(Mock(spec=request))
['AbstractBasicAuthHandler',
 'AbstractDigestAuthHandler',
 'AbstractHTTPHandler',
 'BaseHandler',
 ...
@end example

Many of the not-very-useful (private to @ref{c45,,Mock} rather than the thing being
mocked) underscore and double underscore prefixed attributes have been
filtered from the result of calling @ref{845,,dir()} on a @code{Mock}. If you dislike this
behaviour you can switch it off by setting the module level switch
@ref{499c,,FILTER_DIR}:

@example
>>> from unittest import mock
>>> mock.FILTER_DIR = False
>>> dir(mock.Mock())
['_NonCallableMock__get_return_value',
 '_NonCallableMock__get_side_effect',
 '_NonCallableMock__return_value_doc',
 '_NonCallableMock__set_return_value',
 '_NonCallableMock__set_side_effect',
 '__call__',
 '__class__',
 ...
@end example

Alternatively you can just use @code{vars(my_mock)} (instance members) and
@code{dir(type(my_mock))} (type members) to bypass the filtering irrespective of
@ref{499c,,FILTER_DIR}.

@node mock_open,Autospeccing,FILTER_DIR,Helpers
@anchor{library/unittest mock mock-open}@anchor{49d1}
@subsubsection mock_open


@geindex mock_open() (in module unittest.mock)
@anchor{library/unittest mock unittest mock mock_open}@anchor{11ed}
@deffn {Function} unittest.mock.mock_open (mock=None, read_data='@w{'})

A helper function to create a mock to replace the use of @ref{318,,open()}. It works
for @code{open()} called directly or used as a context manager.

The `mock' argument is the mock object to configure. If @code{None} (the
default) then a @ref{1095,,MagicMock} will be created for you, with the API limited
to methods or attributes available on standard file handles.

`read_data' is a string for the @ref{1023,,read()},
@ref{1535,,readline()}, and @ref{280b,,readlines()} methods
of the file handle to return.  Calls to those methods will take data from
`read_data' until it is depleted.  The mock of these methods is pretty
simplistic: every time the `mock' is called, the `read_data' is rewound to
the start.  If you need more control over the data that you are feeding to
the tested code you will need to customize this mock for yourself.  When that
is insufficient, one of the in-memory filesystem packages on PyPI@footnote{https://pypi.org} can offer a realistic filesystem for testing.


Changed in version 3.4: Added @ref{1535,,readline()} and @ref{280b,,readlines()} support.
The mock of @ref{1023,,read()} changed to consume `read_data' rather
than returning it on each call.



Changed in version 3.5: `read_data' is now reset on each call to the `mock'.



Changed in version 3.8: Added @ref{20ee,,__iter__()} to implementation so that iteration
(such as in for loops) correctly consumes `read_data'.

@end deffn

Using @ref{318,,open()} as a context manager is a great way to ensure your file handles
are closed properly and is becoming common:

@example
with open('/some/path', 'w') as f:
    f.write('something')
@end example

The issue is that even if you mock out the call to @ref{318,,open()} it is the
`returned object' that is used as a context manager (and has @ref{7e5,,__enter__()} and
@ref{150c,,__exit__()} called).

Mocking context managers with a @ref{1095,,MagicMock} is common enough and fiddly
enough that a helper function is useful.

@example
>>> m = mock_open()
>>> with patch('__main__.open', m):
...     with open('foo', 'w') as h:
...         h.write('some stuff')
...
>>> m.mock_calls
[call('foo', 'w'),
 call().__enter__(),
 call().write('some stuff'),
 call().__exit__(None, None, None)]
>>> m.assert_called_once_with('foo', 'w')
>>> handle = m()
>>> handle.write.assert_called_once_with('some stuff')
@end example

And for reading files:

@example
>>> with patch('__main__.open', mock_open(read_data='bibble')) as m:
...     with open('foo') as h:
...         result = h.read()
...
>>> m.assert_called_once_with('foo')
>>> assert result == 'bibble'
@end example

@node Autospeccing,Sealing mocks,mock_open,Helpers
@anchor{library/unittest mock auto-speccing}@anchor{498f}@anchor{library/unittest mock autospeccing}@anchor{49d2}
@subsubsection Autospeccing


Autospeccing is based on the existing @code{spec} feature of mock. It limits the
api of mocks to the api of an original object (the spec), but it is recursive
(implemented lazily) so that attributes of mocks only have the same api as
the attributes of the spec. In addition mocked functions / methods have the
same call signature as the original so they raise a @ref{199,,TypeError} if they are
called incorrectly.

Before I explain how auto-speccing works, here’s why it is needed.

@ref{c45,,Mock} is a very powerful and flexible object, but it suffers from a flaw which
is general to mocking. If you refactor some of your code, rename members and so on, any
tests for code that is still using the `old api' but uses mocks instead of the real
objects will still pass. This means your tests can all pass even though your code is
broken.


Changed in version 3.5: Before 3.5, tests with a typo in the word assert would silently pass when they should
raise an error. You can still achieve this behavior by passing @code{unsafe=True} to Mock.


Note that this is another reason why you need integration tests as well as
unit tests. Testing everything in isolation is all fine and dandy, but if you
don’t test how your units are “wired together” there is still lots of room
for bugs that tests might have caught.

@code{unittest.mock} already provides a feature to help with this, called speccing. If you
use a class or instance as the @code{spec} for a mock then you can only access
attributes on the mock that exist on the real class:

@example
>>> from urllib import request
>>> mock = Mock(spec=request.Request)
>>> mock.assret_called_with  # Intentional typo!
Traceback (most recent call last):
 ...
AttributeError: Mock object has no attribute 'assret_called_with'
@end example

The spec only applies to the mock itself, so we still have the same issue
with any methods on the mock:

@example
>>> mock.header_items()
<mock.Mock object at 0x...>
>>> mock.header_items.assret_called_with()  # Intentional typo!
@end example

Auto-speccing solves this problem. You can either pass @code{autospec=True} to
@ref{1098,,patch()} / @ref{194b,,patch.object()} or use the @ref{1978,,create_autospec()} function to create a
mock with a spec. If you use the @code{autospec=True} argument to @code{patch()} then the
object that is being replaced will be used as the spec object. Because the
speccing is done “lazily” (the spec is created as attributes on the mock are
accessed) you can use it with very complex or deeply nested objects (like
modules that import modules that import modules) without a big performance
hit.

Here’s an example of it in use:

@example
>>> from urllib import request
>>> patcher = patch('__main__.request', autospec=True)
>>> mock_request = patcher.start()
>>> request is mock_request
True
>>> mock_request.Request
<MagicMock name='request.Request' spec='Request' id='...'>
@end example

You can see that @code{request.Request} has a spec. @code{request.Request} takes two
arguments in the constructor (one of which is `self'). Here’s what happens if
we try to call it incorrectly:

@example
>>> req = request.Request()
Traceback (most recent call last):
 ...
TypeError: <lambda>() takes at least 2 arguments (1 given)
@end example

The spec also applies to instantiated classes (i.e. the return value of
specced mocks):

@example
>>> req = request.Request('foo')
>>> req
<NonCallableMagicMock name='request.Request()' spec='Request' id='...'>
@end example

@code{Request} objects are not callable, so the return value of instantiating our
mocked out @code{request.Request} is a non-callable mock. With the spec in place
any typos in our asserts will raise the correct error:

@example
>>> req.add_header('spam', 'eggs')
<MagicMock name='request.Request().add_header()' id='...'>
>>> req.add_header.assret_called_with  # Intentional typo!
Traceback (most recent call last):
 ...
AttributeError: Mock object has no attribute 'assret_called_with'
>>> req.add_header.assert_called_with('spam', 'eggs')
@end example

In many cases you will just be able to add @code{autospec=True} to your existing
@ref{1098,,patch()} calls and then be protected against bugs due to typos and api
changes.

As well as using `autospec' through @ref{1098,,patch()} there is a
@ref{1978,,create_autospec()} for creating autospecced mocks directly:

@example
>>> from urllib import request
>>> mock_request = create_autospec(request)
>>> mock_request.Request('foo', 'bar')
<NonCallableMagicMock name='mock.Request()' spec='Request' id='...'>
@end example

This isn’t without caveats and limitations however, which is why it is not
the default behaviour. In order to know what attributes are available on the
spec object, autospec has to introspect (access attributes) the spec. As you
traverse attributes on the mock a corresponding traversal of the original
object is happening under the hood. If any of your specced objects have
properties or descriptors that can trigger code execution then you may not be
able to use autospec. On the other hand it is much better to design your
objects so that introspection is safe @footnote{
This only applies to classes or already instantiated objects. Calling
a mocked class to create a mock instance `does not' create a real instance.
It is only attribute lookups - along with calls to @ref{845,,dir()} - that are done.
}.

A more serious problem is that it is common for instance attributes to be
created in the @ref{8c1,,__init__()} method and not to exist on the class at all.
`autospec' can’t know about any dynamically created attributes and restricts
the api to visible attributes.

@example
>>> class Something:
...   def __init__(self):
...     self.a = 33
...
>>> with patch('__main__.Something', autospec=True):
...   thing = Something()
...   thing.a
...
Traceback (most recent call last):
  ...
AttributeError: Mock object has no attribute 'a'
@end example

There are a few different ways of resolving this problem. The easiest, but
not necessarily the least annoying, way is to simply set the required
attributes on the mock after creation. Just because `autospec' doesn’t allow
you to fetch attributes that don’t exist on the spec it doesn’t prevent you
setting them:

@example
>>> with patch('__main__.Something', autospec=True):
...   thing = Something()
...   thing.a = 33
...
@end example

There is a more aggressive version of both `spec' and `autospec' that `does'
prevent you setting non-existent attributes. This is useful if you want to
ensure your code only `sets' valid attributes too, but obviously it prevents
this particular scenario:

@example
>>> with patch('__main__.Something', autospec=True, spec_set=True):
...   thing = Something()
...   thing.a = 33
...
Traceback (most recent call last):
 ...
AttributeError: Mock object has no attribute 'a'
@end example

Probably the best way of solving the problem is to add class attributes as
default values for instance members initialised in @ref{8c1,,__init__()}.
Note that if
you are only setting default attributes in @code{__init__()} then providing them via
class attributes (shared between instances of course) is faster too. e.g.

@example
class Something:
    a = 33
@end example

This brings up another issue. It is relatively common to provide a default
value of @code{None} for members that will later be an object of a different type.
@code{None} would be useless as a spec because it wouldn’t let you access `any'
attributes or methods on it. As @code{None} is `never' going to be useful as a
spec, and probably indicates a member that will normally of some other type,
autospec doesn’t use a spec for members that are set to @code{None}. These will
just be ordinary mocks (well - MagicMocks):

@example
>>> class Something:
...     member = None
...
>>> mock = create_autospec(Something)
>>> mock.member.foo.bar.baz()
<MagicMock name='mock.member.foo.bar.baz()' id='...'>
@end example

If modifying your production classes to add defaults isn’t to your liking
then there are more options. One of these is simply to use an instance as the
spec rather than the class. The other is to create a subclass of the
production class and add the defaults to the subclass without affecting the
production class. Both of these require you to use an alternative object as
the spec. Thankfully @ref{1098,,patch()} supports this - you can simply pass the
alternative object as the `autospec' argument:

@example
>>> class Something:
...   def __init__(self):
...     self.a = 33
...
>>> class SomethingForTest(Something):
...   a = 33
...
>>> p = patch('__main__.Something', autospec=SomethingForTest)
>>> mock = p.start()
>>> mock.a
<NonCallableMagicMock name='Something.a' spec='int' id='...'>
@end example

@node Sealing mocks,,Autospeccing,Helpers
@anchor{library/unittest mock sealing-mocks}@anchor{49d3}
@subsubsection Sealing mocks


@c from unittest.mock import seal

@geindex seal() (in module unittest.mock)
@anchor{library/unittest mock unittest mock seal}@anchor{da0}
@deffn {Function} unittest.mock.seal (mock)

Seal will disable the automatic creation of mocks when accessing an attribute of
the mock being sealed or any of its attributes that are already mocks recursively.

If a mock instance with a name or a spec is assigned to an attribute
it won’t be considered in the sealing chain. This allows one to prevent seal from
fixing part of the mock object.

@example
>>> mock = Mock()
>>> mock.submock.attribute1 = 2
>>> mock.not_submock = mock.Mock(name="sample_name")
>>> seal(mock)
>>> mock.new_attribute  # This will raise AttributeError.
>>> mock.submock.attribute2  # This will raise AttributeError.
>>> mock.not_submock.attribute2  # This won't raise.
@end example


Added in version 3.7.

@end deffn

@node Order of precedence of side_effect return_value and wraps,,Helpers,unittest mock — mock object library
@anchor{library/unittest mock order-of-precedence-of-side-effect-return-value-and-wraps}@anchor{49d4}
@subsubsection Order of precedence of @code{side_effect}, @code{return_value} and `wraps'


The order of their precedence is:


@enumerate 

@item 
@ref{498c,,side_effect}

@item 
@ref{4994,,return_value}

@item 
`wraps'
@end enumerate

If all three are set, mock will return the value from @ref{498c,,side_effect},
ignoring @ref{4994,,return_value} and the wrapped object altogether. If any
two are set, the one with the higher precedence will return the value.
Regardless of the order of which was set first, the order of precedence
remains unchanged.

@example
>>> from unittest.mock import Mock
>>> class Order:
...     @@staticmethod
...     def get_value():
...         return "third"
...
>>> order_mock = Mock(spec=Order, wraps=Order)
>>> order_mock.get_value.side_effect = ["first"]
>>> order_mock.get_value.return_value = "second"
>>> order_mock.get_value()
'first'
@end example

As @code{None} is the default value of @ref{498c,,side_effect}, if you reassign
its value back to @code{None}, the order of precedence will be checked between
@ref{4994,,return_value} and the wrapped object, ignoring
@code{side_effect}.

@example
>>> order_mock.get_value.side_effect = None
>>> order_mock.get_value()
'second'
@end example

If the value being returned by @ref{498c,,side_effect} is @ref{4993,,DEFAULT},
it is ignored and the order of precedence moves to the successor to obtain the
value to return.

@example
>>> from unittest.mock import DEFAULT
>>> order_mock.get_value.side_effect = [DEFAULT]
>>> order_mock.get_value()
'second'
@end example

When @ref{c45,,Mock} wraps an object, the default value of
@ref{4994,,return_value} will be @ref{4993,,DEFAULT}.

@example
>>> order_mock = Mock(spec=Order, wraps=Order)
>>> order_mock.return_value
sentinel.DEFAULT
>>> order_mock.get_value.return_value
sentinel.DEFAULT
@end example

The order of precedence will ignore this value and it will move to the last
successor which is the wrapped object.

As the real call is being made to the wrapped object, creating an instance of
this mock will return the real instance of the class. The positional arguments,
if any, required by the wrapped object must be passed.

@example
>>> order_mock_instance = order_mock()
>>> isinstance(order_mock_instance, Order)
True
>>> order_mock_instance.get_value()
'third'
@end example

@example
>>> order_mock.get_value.return_value = DEFAULT
>>> order_mock.get_value()
'third'
@end example

@example
>>> order_mock.get_value.return_value = "second"
>>> order_mock.get_value()
'second'
@end example

But if you assign @code{None} to it, this will not be ignored as it is an
explicit assignment. So, the order of precedence will not move to the wrapped
object.

@example
>>> order_mock.get_value.return_value = None
>>> order_mock.get_value() is None
True
@end example

Even if you set all three at once when initializing the mock, the order of
precedence remains the same:

@example
>>> order_mock = Mock(spec=Order, wraps=Order,
...                   **@{"get_value.side_effect": ["first"],
...                      "get_value.return_value": "second"@}
...                   )
...
>>> order_mock.get_value()
'first'
>>> order_mock.get_value.side_effect = None
>>> order_mock.get_value()
'second'
>>> order_mock.get_value.return_value = DEFAULT
>>> order_mock.get_value()
'third'
@end example

If @ref{498c,,side_effect} is exhausted, the order of precedence will not
cause a value to be obtained from the successors. Instead, @code{StopIteration}
exception is raised.

@example
>>> order_mock = Mock(spec=Order, wraps=Order)
>>> order_mock.get_value.side_effect = ["first side effect value",
...                                     "another side effect value"]
>>> order_mock.get_value.return_value = "second"
@end example

@example
>>> order_mock.get_value()
'first side effect value'
>>> order_mock.get_value()
'another side effect value'
@end example

@example
>>> order_mock.get_value()
Traceback (most recent call last):
 ...
StopIteration
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node unittest mock — getting started,test — Regression tests package for Python,unittest mock — mock object library,Development Tools
@anchor{library/unittest mock-examples doc}@anchor{49d5}@anchor{library/unittest mock-examples translation-repo}@anchor{49d6}@anchor{library/unittest mock-examples unittest-mock-getting-started}@anchor{49d7}
@subsection @code{unittest.mock} — getting started



Added in version 3.3.

@anchor{library/unittest mock-examples getting-started}@anchor{49d8}
@c import asyncio
@c import unittest
@c from unittest.mock import Mock, MagicMock, AsyncMock, patch, call, sentinel
@c 
@c class SomeClass:
@c     attribute = 'this is a doctest'
@c 
@c     @staticmethod
@c     def static_method():
@c         pass

@menu
* Using Mock:: 
* Patch decorators:: 
* Further examples:: 

@end menu

@node Using Mock,Patch decorators,,unittest mock — getting started
@anchor{library/unittest mock-examples using-mock}@anchor{49d9}
@subsubsection Using Mock


@menu
* Mock patching methods:: 
* Mock for method calls on an object:: 
* Mocking classes:: 
* Naming your mocks:: 
* Tracking all calls:: 
* Setting return values and attributes:: 
* Raising exceptions with mocks:: 
* Side effect functions and iterables:: 
* Mocking asynchronous iterators:: 
* Mocking asynchronous context manager:: 
* Creating a mock from an existing object:: 
* Using side_effect to return per file content:: 

@end menu

@node Mock patching methods,Mock for method calls on an object,,Using Mock
@anchor{library/unittest mock-examples mock-patching-methods}@anchor{49da}
@subsubsection Mock patching methods


Common uses for @ref{c45,,Mock} objects include:


@itemize *

@item 
Patching methods

@item 
Recording method calls on objects
@end itemize

You might want to replace a method on an object to check that
it is called with the correct arguments by another part of the system:

@example
>>> real = SomeClass()
>>> real.method = MagicMock(name='method')
>>> real.method(3, 4, 5, key='value')
<MagicMock name='method()' id='...'>
@end example

Once our mock has been used (@code{real.method} in this example) it has methods
and attributes that allow you to make assertions about how it has been used.

@cartouche
@quotation Note 
In most of these examples the @ref{c45,,Mock} and @ref{1095,,MagicMock} classes
are interchangeable. As the @code{MagicMock} is the more capable class it makes
a sensible one to use by default.
@end quotation
@end cartouche

Once the mock has been called its @ref{499e,,called} attribute is set to
@code{True}. More importantly we can use the @ref{1e46,,assert_called_with()} or
@ref{4996,,assert_called_once_with()} method to check that it was called with
the correct arguments.

This example tests that calling @code{ProductionClass().method} results in a call to
the @code{something} method:

@example
>>> class ProductionClass:
...     def method(self):
...         self.something(1, 2, 3)
...     def something(self, a, b, c):
...         pass
...
>>> real = ProductionClass()
>>> real.something = MagicMock()
>>> real.method()
>>> real.something.assert_called_once_with(1, 2, 3)
@end example

@node Mock for method calls on an object,Mocking classes,Mock patching methods,Using Mock
@anchor{library/unittest mock-examples mock-for-method-calls-on-an-object}@anchor{49db}
@subsubsection Mock for method calls on an object


In the last example we patched a method directly on an object to check that it
was called correctly. Another common use case is to pass an object into a
method (or some part of the system under test) and then check that it is used
in the correct way.

The simple @code{ProductionClass} below has a @code{closer} method. If it is called with
an object then it calls @code{close} on it.

@example
>>> class ProductionClass:
...     def closer(self, something):
...         something.close()
...
@end example

So to test it we need to pass in an object with a @code{close} method and check
that it was called correctly.

@example
>>> real = ProductionClass()
>>> mock = Mock()
>>> real.closer(mock)
>>> mock.close.assert_called_with()
@end example

We don’t have to do any work to provide the ‘close’ method on our mock.
Accessing close creates it. So, if ‘close’ hasn’t already been called then
accessing it in the test will create it, but @ref{1e46,,assert_called_with()}
will raise a failure exception.

@node Mocking classes,Naming your mocks,Mock for method calls on an object,Using Mock
@anchor{library/unittest mock-examples mocking-classes}@anchor{49dc}
@subsubsection Mocking classes


A common use case is to mock out classes instantiated by your code under test.
When you patch a class, then that class is replaced with a mock. Instances
are created by `calling the class'. This means you access the “mock instance”
by looking at the return value of the mocked class.

In the example below we have a function @code{some_function} that instantiates @code{Foo}
and calls a method on it. The call to @ref{1098,,patch()} replaces the class @code{Foo} with a
mock. The @code{Foo} instance is the result of calling the mock, so it is configured
by modifying the mock @ref{4994,,return_value}.

@example
>>> def some_function():
...     instance = module.Foo()
...     return instance.method()
...
>>> with patch('module.Foo') as mock:
...     instance = mock.return_value
...     instance.method.return_value = 'the result'
...     result = some_function()
...     assert result == 'the result'
@end example

@node Naming your mocks,Tracking all calls,Mocking classes,Using Mock
@anchor{library/unittest mock-examples naming-your-mocks}@anchor{49dd}
@subsubsection Naming your mocks


It can be useful to give your mocks a name. The name is shown in the repr of
the mock and can be helpful when the mock appears in test failure messages. The
name is also propagated to attributes or methods of the mock:

@example
>>> mock = MagicMock(name='foo')
>>> mock
<MagicMock name='foo' id='...'>
>>> mock.method
<MagicMock name='foo.method' id='...'>
@end example

@node Tracking all calls,Setting return values and attributes,Naming your mocks,Using Mock
@anchor{library/unittest mock-examples tracking-all-calls}@anchor{49de}
@subsubsection Tracking all calls


Often you want to track more than a single call to a method. The
@ref{4998,,mock_calls} attribute records all calls
to child attributes of the mock - and also to their children.

@example
>>> mock = MagicMock()
>>> mock.method()
<MagicMock name='mock.method()' id='...'>
>>> mock.attribute.method(10, x=53)
<MagicMock name='mock.attribute.method()' id='...'>
>>> mock.mock_calls
[call.method(), call.attribute.method(10, x=53)]
@end example

If you make an assertion about @code{mock_calls} and any unexpected methods
have been called, then the assertion will fail. This is useful because as well
as asserting that the calls you expected have been made, you are also checking
that they were made in the right order and with no additional calls:

You use the @ref{1df5,,call} object to construct lists for comparing with
@code{mock_calls}:

@example
>>> expected = [call.method(), call.attribute.method(10, x=53)]
>>> mock.mock_calls == expected
True
@end example

However, parameters to calls that return mocks are not recorded, which means it is not
possible to track nested calls where the parameters used to create ancestors are important:

@example
>>> m = Mock()
>>> m.factory(important=True).deliver()
<Mock name='mock.factory().deliver()' id='...'>
>>> m.mock_calls[-1] == call.factory(important=False).deliver()
True
@end example

@node Setting return values and attributes,Raising exceptions with mocks,Tracking all calls,Using Mock
@anchor{library/unittest mock-examples setting-return-values-and-attributes}@anchor{49df}
@subsubsection Setting return values and attributes


Setting the return values on a mock object is trivially easy:

@example
>>> mock = Mock()
>>> mock.return_value = 3
>>> mock()
3
@end example

Of course you can do the same for methods on the mock:

@example
>>> mock = Mock()
>>> mock.method.return_value = 3
>>> mock.method()
3
@end example

The return value can also be set in the constructor:

@example
>>> mock = Mock(return_value=3)
>>> mock()
3
@end example

If you need an attribute setting on your mock, just do it:

@example
>>> mock = Mock()
>>> mock.x = 3
>>> mock.x
3
@end example

Sometimes you want to mock up a more complex situation, like for example
@code{mock.connection.cursor().execute("SELECT 1")}. If we wanted this call to
return a list, then we have to configure the result of the nested call.

We can use @ref{1df5,,call} to construct the set of calls in a “chained call” like
this for easy assertion afterwards:

@example
>>> mock = Mock()
>>> cursor = mock.connection.cursor.return_value
>>> cursor.execute.return_value = ['foo']
>>> mock.connection.cursor().execute("SELECT 1")
['foo']
>>> expected = call.connection.cursor().execute("SELECT 1").call_list()
>>> mock.mock_calls
[call.connection.cursor(), call.connection.cursor().execute('SELECT 1')]
>>> mock.mock_calls == expected
True
@end example

It is the call to @code{.call_list()} that turns our call object into a list of
calls representing the chained calls.

@node Raising exceptions with mocks,Side effect functions and iterables,Setting return values and attributes,Using Mock
@anchor{library/unittest mock-examples raising-exceptions-with-mocks}@anchor{49e0}
@subsubsection Raising exceptions with mocks


A useful attribute is @ref{498c,,side_effect}. If you set this to an
exception class or instance then the exception will be raised when the mock
is called.

@example
>>> mock = Mock(side_effect=Exception('Boom!'))
>>> mock()
Traceback (most recent call last):
  ...
Exception: Boom!
@end example

@node Side effect functions and iterables,Mocking asynchronous iterators,Raising exceptions with mocks,Using Mock
@anchor{library/unittest mock-examples side-effect-functions-and-iterables}@anchor{49e1}
@subsubsection Side effect functions and iterables


@code{side_effect} can also be set to a function or an iterable. The use case for
@code{side_effect} as an iterable is where your mock is going to be called several
times, and you want each call to return a different value. When you set
@code{side_effect} to an iterable every call to the mock returns the next value
from the iterable:

@example
>>> mock = MagicMock(side_effect=[4, 5, 6])
>>> mock()
4
>>> mock()
5
>>> mock()
6
@end example

For more advanced use cases, like dynamically varying the return values
depending on what the mock is called with, @code{side_effect} can be a function.
The function will be called with the same arguments as the mock. Whatever the
function returns is what the call returns:

@example
>>> vals = @{(1, 2): 1, (2, 3): 2@}
>>> def side_effect(*args):
...     return vals[args]
...
>>> mock = MagicMock(side_effect=side_effect)
>>> mock(1, 2)
1
>>> mock(2, 3)
2
@end example

@node Mocking asynchronous iterators,Mocking asynchronous context manager,Side effect functions and iterables,Using Mock
@anchor{library/unittest mock-examples mocking-asynchronous-iterators}@anchor{49e2}
@subsubsection Mocking asynchronous iterators


Since Python 3.8, @code{AsyncMock} and @code{MagicMock} have support to mock
@ref{f7d,,Asynchronous Iterators} through @code{__aiter__}. The @ref{4994,,return_value}
attribute of @code{__aiter__} can be used to set the return values to be used for
iteration.

@example
>>> mock = MagicMock()  # AsyncMock also works here
>>> mock.__aiter__.return_value = [1, 2, 3]
>>> async def main():
...     return [i async for i in mock]
...
>>> asyncio.run(main())
[1, 2, 3]
@end example

@node Mocking asynchronous context manager,Creating a mock from an existing object,Mocking asynchronous iterators,Using Mock
@anchor{library/unittest mock-examples mocking-asynchronous-context-manager}@anchor{49e3}
@subsubsection Mocking asynchronous context manager


Since Python 3.8, @code{AsyncMock} and @code{MagicMock} have support to mock
@ref{813,,Asynchronous Context Managers} through @code{__aenter__} and @code{__aexit__}.
By default, @code{__aenter__} and @code{__aexit__} are @code{AsyncMock} instances that
return an async function.

@example
>>> class AsyncContextManager:
...     async def __aenter__(self):
...         return self
...     async def __aexit__(self, exc_type, exc, tb):
...         pass
...
>>> mock_instance = MagicMock(AsyncContextManager())  # AsyncMock also works here
>>> async def main():
...     async with mock_instance as result:
...         pass
...
>>> asyncio.run(main())
>>> mock_instance.__aenter__.assert_awaited_once()
>>> mock_instance.__aexit__.assert_awaited_once()
@end example

@node Creating a mock from an existing object,Using side_effect to return per file content,Mocking asynchronous context manager,Using Mock
@anchor{library/unittest mock-examples creating-a-mock-from-an-existing-object}@anchor{49e4}
@subsubsection Creating a mock from an existing object


One problem with over use of mocking is that it couples your tests to the
implementation of your mocks rather than your real code. Suppose you have a
class that implements @code{some_method}. In a test for another class, you
provide a mock of this object that `also' provides @code{some_method}. If later
you refactor the first class, so that it no longer has @code{some_method} - then
your tests will continue to pass even though your code is now broken!

@ref{c45,,Mock} allows you to provide an object as a specification for the mock,
using the `spec' keyword argument. Accessing methods / attributes on the
mock that don’t exist on your specification object will immediately raise an
attribute error. If you change the implementation of your specification, then
tests that use that class will start failing immediately without you having to
instantiate the class in those tests.

@example
>>> mock = Mock(spec=SomeClass)
>>> mock.old_method()
Traceback (most recent call last):
   ...
AttributeError: Mock object has no attribute 'old_method'. Did you mean: 'class_method'?
@end example

Using a specification also enables a smarter matching of calls made to the
mock, regardless of whether some parameters were passed as positional or
named arguments:

@example
>>> def f(a, b, c): pass
...
>>> mock = Mock(spec=f)
>>> mock(1, 2, 3)
<Mock name='mock()' id='140161580456576'>
>>> mock.assert_called_with(a=1, b=2, c=3)
@end example

If you want this smarter matching to also work with method calls on the mock,
you can use @ref{498f,,auto-speccing}.

If you want a stronger form of specification that prevents the setting
of arbitrary attributes as well as the getting of them then you can use
`spec_set' instead of `spec'.

@node Using side_effect to return per file content,,Creating a mock from an existing object,Using Mock
@anchor{library/unittest mock-examples using-side-effect-to-return-per-file-content}@anchor{49e5}
@subsubsection Using side_effect to return per file content


@ref{11ed,,mock_open()} is used to patch @ref{318,,open()} method. @ref{498c,,side_effect}
can be used to return a new Mock object per call. This can be used to return different
contents per file stored in a dictionary:

@example
DEFAULT = "default"
data_dict = @{"file1": "data1",
             "file2": "data2"@}

def open_side_effect(name):
    return mock_open(read_data=data_dict.get(name, DEFAULT))()

with patch("builtins.open", side_effect=open_side_effect):
    with open("file1") as file1:
        assert file1.read() == "data1"

    with open("file2") as file2:
        assert file2.read() == "data2"

    with open("file3") as file2:
        assert file2.read() == "default"
@end example

@node Patch decorators,Further examples,Using Mock,unittest mock — getting started
@anchor{library/unittest mock-examples patch-decorators}@anchor{49e6}
@subsubsection Patch decorators


@cartouche
@quotation Note 
With @ref{1098,,patch()} it matters that you patch objects in the namespace where
they are looked up. This is normally straightforward, but for a quick guide
read @ref{498d,,where to patch}.
@end quotation
@end cartouche

A common need in tests is to patch a class attribute or a module attribute,
for example patching a builtin or patching a class in a module to test that it
is instantiated. Modules and classes are effectively global, so patching on
them has to be undone after the test or the patch will persist into other
tests and cause hard to diagnose problems.

mock provides three convenient decorators for this: @ref{1098,,patch()}, @ref{194b,,patch.object()} and
@ref{19ab,,patch.dict()}. @code{patch} takes a single string, of the form
@code{package.module.Class.attribute} to specify the attribute you are patching. It
also optionally takes a value that you want the attribute (or class or
whatever) to be replaced with. ‘patch.object’ takes an object and the name of
the attribute you would like patched, plus optionally the value to patch it
with.

@code{patch.object}:

@example
>>> original = SomeClass.attribute
>>> @@patch.object(SomeClass, 'attribute', sentinel.attribute)
... def test():
...     assert SomeClass.attribute == sentinel.attribute
...
>>> test()
>>> assert SomeClass.attribute == original

>>> @@patch('package.module.attribute', sentinel.attribute)
... def test():
...     from package.module import attribute
...     assert attribute is sentinel.attribute
...
>>> test()
@end example

If you are patching a module (including @ref{13,,builtins}) then use @ref{1098,,patch()}
instead of @ref{194b,,patch.object()}:

@example
>>> mock = MagicMock(return_value=sentinel.file_handle)
>>> with patch('builtins.open', mock):
...     handle = open('filename', 'r')
...
>>> mock.assert_called_with('filename', 'r')
>>> assert handle == sentinel.file_handle, "incorrect file handle returned"
@end example

The module name can be ‘dotted’, in the form @code{package.module} if needed:

@example
>>> @@patch('package.module.ClassName.attribute', sentinel.attribute)
... def test():
...     from package.module import ClassName
...     assert ClassName.attribute == sentinel.attribute
...
>>> test()
@end example

A nice pattern is to actually decorate test methods themselves:

@example
>>> class MyTest(unittest.TestCase):
...     @@patch.object(SomeClass, 'attribute', sentinel.attribute)
...     def test_something(self):
...         self.assertEqual(SomeClass.attribute, sentinel.attribute)
...
>>> original = SomeClass.attribute
>>> MyTest('test_something').test_something()
>>> assert SomeClass.attribute == original
@end example

If you want to patch with a Mock, you can use @ref{1098,,patch()} with only one argument
(or @ref{194b,,patch.object()} with two arguments). The mock will be created for you and
passed into the test function / method:

@example
>>> class MyTest(unittest.TestCase):
...     @@patch.object(SomeClass, 'static_method')
...     def test_something(self, mock_method):
...         SomeClass.static_method()
...         mock_method.assert_called_with()
...
>>> MyTest('test_something').test_something()
@end example

You can stack up multiple patch decorators using this pattern:

@example
>>> class MyTest(unittest.TestCase):
...     @@patch('package.module.ClassName1')
...     @@patch('package.module.ClassName2')
...     def test_something(self, MockClass2, MockClass1):
...         self.assertIs(package.module.ClassName1, MockClass1)
...         self.assertIs(package.module.ClassName2, MockClass2)
...
>>> MyTest('test_something').test_something()
@end example

When you nest patch decorators the mocks are passed in to the decorated
function in the same order they applied (the normal `Python' order that
decorators are applied). This means from the bottom up, so in the example
above the mock for @code{test_module.ClassName2} is passed in first.

There is also @ref{19ab,,patch.dict()} for setting values in a dictionary just
during a scope and restoring the dictionary to its original state when the test
ends:

@example
>>> foo = @{'key': 'value'@}
>>> original = foo.copy()
>>> with patch.dict(foo, @{'newkey': 'newvalue'@}, clear=True):
...     assert foo == @{'newkey': 'newvalue'@}
...
>>> assert foo == original
@end example

@code{patch}, @code{patch.object} and @code{patch.dict} can all be used as context managers.

Where you use @ref{1098,,patch()} to create a mock for you, you can get a reference to the
mock using the “as” form of the with statement:

@example
>>> class ProductionClass:
...     def method(self):
...         pass
...
>>> with patch.object(ProductionClass, 'method') as mock_method:
...     mock_method.return_value = None
...     real = ProductionClass()
...     real.method(1, 2, 3)
...
>>> mock_method.assert_called_with(1, 2, 3)
@end example

As an alternative @code{patch}, @code{patch.object} and @code{patch.dict} can be used as
class decorators. When used in this way it is the same as applying the
decorator individually to every method whose name starts with “test”.

@node Further examples,,Patch decorators,unittest mock — getting started
@anchor{library/unittest mock-examples further-examples}@anchor{49e7}@anchor{library/unittest mock-examples id1}@anchor{49e8}
@subsubsection Further examples


Here are some more examples for some slightly more advanced scenarios.

@menu
* Mocking chained calls:: 
* Partial mocking:: 
* Mocking a generator method:: 
* Applying the same patch to every test method:: 
* Mocking unbound methods:: 
* Checking multiple calls with mock:: 
* Coping with mutable arguments:: 
* Nesting patches:: 
* Mocking a dictionary with MagicMock:: 
* Mock subclasses and their attributes:: 
* Mocking imports with patch.dict: Mocking imports with patch dict. 
* Tracking order of calls and less verbose call assertions:: 
* More complex argument matching:: 

@end menu

@node Mocking chained calls,Partial mocking,,Further examples
@anchor{library/unittest mock-examples mocking-chained-calls}@anchor{49e9}
@subsubsection Mocking chained calls


Mocking chained calls is actually straightforward with mock once you
understand the @ref{4994,,return_value} attribute. When a mock is called for
the first time, or you fetch its @code{return_value} before it has been called, a
new @ref{c45,,Mock} is created.

This means that you can see how the object returned from a call to a mocked
object has been used by interrogating the @code{return_value} mock:

@example
>>> mock = Mock()
>>> mock().foo(a=2, b=3)
<Mock name='mock().foo()' id='...'>
>>> mock.return_value.foo.assert_called_with(a=2, b=3)
@end example

From here it is a simple step to configure and then make assertions about
chained calls. Of course another alternative is writing your code in a more
testable way in the first place…

So, suppose we have some code that looks a little bit like this:

@example
>>> class Something:
...     def __init__(self):
...         self.backend = BackendProvider()
...     def method(self):
...         response = self.backend.get_endpoint('foobar').create_call('spam', 'eggs').start_call()
...         # more code
@end example

Assuming that @code{BackendProvider} is already well tested, how do we test
@code{method()}? Specifically, we want to test that the code section @code{# more
code} uses the response object in the correct way.

As this chain of calls is made from an instance attribute we can monkey patch
the @code{backend} attribute on a @code{Something} instance. In this particular case
we are only interested in the return value from the final call to
@code{start_call} so we don’t have much configuration to do. Let’s assume the
object it returns is ‘file-like’, so we’ll ensure that our response object
uses the builtin @ref{318,,open()} as its @code{spec}.

To do this we create a mock instance as our mock backend and create a mock
response object for it. To set the response as the return value for that final
@code{start_call} we could do this:

@example
mock_backend.get_endpoint.return_value.create_call.return_value.start_call.return_value = mock_response
@end example

We can do that in a slightly nicer way using the @ref{4995,,configure_mock()}
method to directly set the return value for us:

@example
>>> something = Something()
>>> mock_response = Mock(spec=open)
>>> mock_backend = Mock()
>>> config = @{'get_endpoint.return_value.create_call.return_value.start_call.return_value': mock_response@}
>>> mock_backend.configure_mock(**config)
@end example

With these we monkey patch the “mock backend” in place and can make the real
call:

@example
>>> something.backend = mock_backend
>>> something.method()
@end example

Using @ref{4998,,mock_calls} we can check the chained call with a single
assert. A chained call is several calls in one line of code, so there will be
several entries in @code{mock_calls}. We can use @ref{49cd,,call.call_list()} to create
this list of calls for us:

@example
>>> chained = call.get_endpoint('foobar').create_call('spam', 'eggs').start_call()
>>> call_list = chained.call_list()
>>> assert mock_backend.mock_calls == call_list
@end example

@node Partial mocking,Mocking a generator method,Mocking chained calls,Further examples
@anchor{library/unittest mock-examples partial-mocking}@anchor{49ea}
@subsubsection Partial mocking


For some tests, you may want to mock out a call to @ref{16d6,,datetime.date.today()}
to return a known date, but don’t want to prevent the code under test from
creating new date objects. Unfortunately @ref{1fc,,datetime.date} is written in C,
so you cannot just monkey-patch out the static @code{datetime.date.today()} method.

Instead, you can effectively wrap the date
class with a mock, while passing through calls to the constructor to the real
class (and returning real instances).

The @ref{1098,,patch decorator} is used here to
mock out the @code{date} class in the module under test. The @ref{498c,,side_effect}
attribute on the mock date class is then set to a lambda function that returns
a real date. When the mock date class is called a real date will be
constructed and returned by @code{side_effect}.

@example
>>> import datetime as dt
>>> with patch('mymodule.date') as mock_date:
...     mock_date.today.return_value = dt.date(2010, 10, 8)
...     mock_date.side_effect = lambda *args, **kw: dt.date(*args, **kw)
...
...     assert mymodule.date.today() == dt.date(2010, 10, 8)
...     assert mymodule.date(2009, 6, 8) == dt.date(2009, 6, 8)
@end example

Note that we don’t patch @ref{1fc,,datetime.date} globally, we patch @code{date} in the
module that `uses' it. See @ref{498d,,where to patch}.

When @code{date.today()} is called a known date is returned, but calls to the
@code{date(...)} constructor still return normal dates. Without this you can find
yourself having to calculate an expected result using exactly the same
algorithm as the code under test, which is a classic testing anti-pattern.

Calls to the date constructor are recorded in the @code{mock_date} attributes
(@code{call_count} and friends) which may also be useful for your tests.

An alternative way of dealing with mocking dates, or other builtin classes,
is discussed in this blog entry@footnote{https://williambert.online/2011/07/how-to-unit-testing-in-django-with-mocking-and-patching/}.

@node Mocking a generator method,Applying the same patch to every test method,Partial mocking,Further examples
@anchor{library/unittest mock-examples mocking-a-generator-method}@anchor{49eb}
@subsubsection Mocking a generator method


A Python generator is a function or method that uses the @ref{bc8,,yield} statement
to return a series of values when iterated over @footnote{
There are also generator expressions and more @uref{http://www.dabeaz.com/coroutines/index.html,advanced uses} of generators, but we aren’t
concerned about them here. A very good introduction to generators and how
powerful they are is: @uref{http://www.dabeaz.com/generators/,Generator Tricks for Systems Programmers}.
}.

A generator method / function is called to return the generator object. It is
the generator object that is then iterated over. The protocol method for
iteration is @ref{20ee,,__iter__()}, so we can
mock this using a @ref{1095,,MagicMock}.

Here’s an example class with an “iter” method implemented as a generator:

@example
>>> class Foo:
...     def iter(self):
...         for i in [1, 2, 3]:
...             yield i
...
>>> foo = Foo()
>>> list(foo.iter())
[1, 2, 3]
@end example

How would we mock this class, and in particular its “iter” method?

To configure the values returned from the iteration (implicit in the call to
@ref{24f,,list}), we need to configure the object returned by the call to @code{foo.iter()}.

@example
>>> mock_foo = MagicMock()
>>> mock_foo.iter.return_value = iter([1, 2, 3])
>>> list(mock_foo.iter())
[1, 2, 3]
@end example

@node Applying the same patch to every test method,Mocking unbound methods,Mocking a generator method,Further examples
@anchor{library/unittest mock-examples applying-the-same-patch-to-every-test-method}@anchor{49ec}
@subsubsection Applying the same patch to every test method


If you want several patches in place for multiple test methods the obvious way
is to apply the patch decorators to every method. This can feel like unnecessary
repetition. Instead, you can use @ref{1098,,patch()} (in all its
various forms) as a class decorator. This applies the patches to all test
methods on the class. A test method is identified by methods whose names start
with @code{test}:

@example
>>> @@patch('mymodule.SomeClass')
... class MyTest(unittest.TestCase):
...
...     def test_one(self, MockSomeClass):
...         self.assertIs(mymodule.SomeClass, MockSomeClass)
...
...     def test_two(self, MockSomeClass):
...         self.assertIs(mymodule.SomeClass, MockSomeClass)
...
...     def not_a_test(self):
...         return 'something'
...
>>> MyTest('test_one').test_one()
>>> MyTest('test_two').test_two()
>>> MyTest('test_two').not_a_test()
'something'
@end example

An alternative way of managing patches is to use the @ref{49be,,patch methods; start and stop}.
These allow you to move the patching into your @code{setUp} and @code{tearDown} methods.

@example
>>> class MyTest(unittest.TestCase):
...     def setUp(self):
...         self.patcher = patch('mymodule.foo')
...         self.mock_foo = self.patcher.start()
...
...     def test_foo(self):
...         self.assertIs(mymodule.foo, self.mock_foo)
...
...     def tearDown(self):
...         self.patcher.stop()
...
>>> MyTest('test_foo').run()
@end example

If you use this technique you must ensure that the patching is “undone” by
calling @code{stop}. This can be fiddlier than you might think, because if an
exception is raised in the setUp then tearDown is not called.
@ref{c7a,,unittest.TestCase.addCleanup()} makes this easier:

@example
>>> class MyTest(unittest.TestCase):
...     def setUp(self):
...         patcher = patch('mymodule.foo')
...         self.addCleanup(patcher.stop)
...         self.mock_foo = patcher.start()
...
...     def test_foo(self):
...         self.assertIs(mymodule.foo, self.mock_foo)
...
>>> MyTest('test_foo').run()
@end example

@node Mocking unbound methods,Checking multiple calls with mock,Applying the same patch to every test method,Further examples
@anchor{library/unittest mock-examples mocking-unbound-methods}@anchor{49ed}
@subsubsection Mocking unbound methods


Sometimes a test needs to patch an `unbound method', which means patching the
method on the class rather than on the instance. In order to make assertions
about which objects were calling this particular method, you need to pass
@code{self} as the first argument. The issue is that you can’t patch with a mock for
this, because if you replace an unbound method with a mock it doesn’t become
a bound method when fetched from the instance, and so it doesn’t get @code{self}
passed in. The workaround is to patch the unbound method with a real function
instead. The @ref{1098,,patch()} decorator makes it so simple to patch out methods
with a mock that having to create a real function becomes a nuisance.

If you pass @code{autospec=True} to patch then it does the patching with a
`real' function object. This function object has the same signature as the one
it is replacing, but delegates to a mock under the hood. You still get your
mock auto-created in exactly the same way as before. What it means though, is
that if you use it to patch out an unbound method on a class the mocked
function will be turned into a bound method if it is fetched from an instance.
It will have @code{self} passed in as the first argument, which is exactly what
was needed:

@example
>>> class Foo:
...   def foo(self):
...     pass
...
>>> with patch.object(Foo, 'foo', autospec=True) as mock_foo:
...   mock_foo.return_value = 'foo'
...   foo = Foo()
...   foo.foo()
...
'foo'
>>> mock_foo.assert_called_once_with(foo)
@end example

If we don’t use @code{autospec=True} then the unbound method is patched out
with a Mock instance instead, and isn’t called with @code{self}.

@node Checking multiple calls with mock,Coping with mutable arguments,Mocking unbound methods,Further examples
@anchor{library/unittest mock-examples checking-multiple-calls-with-mock}@anchor{49ee}
@subsubsection Checking multiple calls with mock


mock has a nice API for making assertions about how your mock objects are used.

@example
>>> mock = Mock()
>>> mock.foo_bar.return_value = None
>>> mock.foo_bar('baz', spam='eggs')
>>> mock.foo_bar.assert_called_with('baz', spam='eggs')
@end example

If your mock is only being called once you can use the
@ref{4996,,assert_called_once_with()} method that also asserts that the
@ref{17d4,,call_count} is one.

@example
>>> mock.foo_bar.assert_called_once_with('baz', spam='eggs')
>>> mock.foo_bar()
>>> mock.foo_bar.assert_called_once_with('baz', spam='eggs')
Traceback (most recent call last):
    ...
AssertionError: Expected 'foo_bar' to be called once. Called 2 times.
Calls: [call('baz', spam='eggs'), call()].
@end example

Both @code{assert_called_with} and @code{assert_called_once_with} make assertions about
the `most recent' call. If your mock is going to be called several times, and
you want to make assertions about `all' those calls you can use
@ref{499f,,call_args_list}:

@example
>>> mock = Mock(return_value=None)
>>> mock(1, 2, 3)
>>> mock(4, 5, 6)
>>> mock()
>>> mock.call_args_list
[call(1, 2, 3), call(4, 5, 6), call()]
@end example

The @ref{1df5,,call} helper makes it easy to make assertions about these calls. You
can build up a list of expected calls and compare it to @code{call_args_list}. This
looks remarkably similar to the repr of the @code{call_args_list}:

@example
>>> expected = [call(1, 2, 3), call(4, 5, 6), call()]
>>> mock.call_args_list == expected
True
@end example

@node Coping with mutable arguments,Nesting patches,Checking multiple calls with mock,Further examples
@anchor{library/unittest mock-examples coping-with-mutable-arguments}@anchor{49ef}
@subsubsection Coping with mutable arguments


Another situation is rare, but can bite you, is when your mock is called with
mutable arguments. @code{call_args} and @code{call_args_list} store `references' to the
arguments. If the arguments are mutated by the code under test then you can no
longer make assertions about what the values were when the mock was called.

Here’s some example code that shows the problem. Imagine the following functions
defined in ‘mymodule’:

@example
def frob(val):
    pass

def grob(val):
    "First frob and then clear val"
    frob(val)
    val.clear()
@end example

When we try to test that @code{grob} calls @code{frob} with the correct argument look
what happens:

@example
>>> with patch('mymodule.frob') as mock_frob:
...     val = @{6@}
...     mymodule.grob(val)
...
>>> val
set()
>>> mock_frob.assert_called_with(@{6@})
Traceback (most recent call last):
    ...
AssertionError: Expected: ((@{6@},), @{@})
Called with: ((set(),), @{@})
@end example

One possibility would be for mock to copy the arguments you pass in. This
could then cause problems if you do assertions that rely on object identity
for equality.

Here’s one solution that uses the @ref{498c,,side_effect}
functionality. If you provide a @code{side_effect} function for a mock then
@code{side_effect} will be called with the same args as the mock. This gives us an
opportunity to copy the arguments and store them for later assertions. In this
example I’m using `another' mock to store the arguments so that I can use the
mock methods for doing the assertion. Again a helper function sets this up for
me.

@example
>>> from copy import deepcopy
>>> from unittest.mock import Mock, patch, DEFAULT
>>> def copy_call_args(mock):
...     new_mock = Mock()
...     def side_effect(*args, **kwargs):
...         args = deepcopy(args)
...         kwargs = deepcopy(kwargs)
...         new_mock(*args, **kwargs)
...         return DEFAULT
...     mock.side_effect = side_effect
...     return new_mock
...
>>> with patch('mymodule.frob') as mock_frob:
...     new_mock = copy_call_args(mock_frob)
...     val = @{6@}
...     mymodule.grob(val)
...
>>> new_mock.assert_called_with(@{6@})
>>> new_mock.call_args
call(@{6@})
@end example

@code{copy_call_args} is called with the mock that will be called. It returns a new
mock that we do the assertion on. The @code{side_effect} function makes a copy of
the args and calls our @code{new_mock} with the copy.

@cartouche
@quotation Note 
If your mock is only going to be used once there is an easier way of
checking arguments at the point they are called. You can simply do the
checking inside a @code{side_effect} function.

@example
>>> def side_effect(arg):
...     assert arg == @{6@}
...
>>> mock = Mock(side_effect=side_effect)
>>> mock(@{6@})
>>> mock(set())
Traceback (most recent call last):
    ...
AssertionError
@end example
@end quotation
@end cartouche

An alternative approach is to create a subclass of @ref{c45,,Mock} or
@ref{1095,,MagicMock} that copies (using @ref{d6b,,copy.deepcopy()}) the arguments.
Here’s an example implementation:

@example
>>> from copy import deepcopy
>>> class CopyingMock(MagicMock):
...     def __call__(self, /, *args, **kwargs):
...         args = deepcopy(args)
...         kwargs = deepcopy(kwargs)
...         return super().__call__(*args, **kwargs)
...
>>> c = CopyingMock(return_value=None)
>>> arg = set()
>>> c(arg)
>>> arg.add(1)
>>> c.assert_called_with(set())
>>> c.assert_called_with(arg)
Traceback (most recent call last):
    ...
AssertionError: expected call not found.
Expected: mock(@{1@})
Actual: mock(set())
>>> c.foo
<CopyingMock name='mock.foo' id='...'>
@end example

When you subclass @code{Mock} or @code{MagicMock} all dynamically created attributes,
and the @code{return_value} will use your subclass automatically. That means all
children of a @code{CopyingMock} will also have the type @code{CopyingMock}.

@node Nesting patches,Mocking a dictionary with MagicMock,Coping with mutable arguments,Further examples
@anchor{library/unittest mock-examples nesting-patches}@anchor{49f0}
@subsubsection Nesting patches


Using patch as a context manager is nice, but if you do multiple patches you
can end up with nested with statements indenting further and further to the
right:

@example
>>> class MyTest(unittest.TestCase):
...
...     def test_foo(self):
...         with patch('mymodule.Foo') as mock_foo:
...             with patch('mymodule.Bar') as mock_bar:
...                 with patch('mymodule.Spam') as mock_spam:
...                     assert mymodule.Foo is mock_foo
...                     assert mymodule.Bar is mock_bar
...                     assert mymodule.Spam is mock_spam
...
>>> original = mymodule.Foo
>>> MyTest('test_foo').test_foo()
>>> assert mymodule.Foo is original
@end example

With unittest @code{cleanup} functions and the @ref{49be,,patch methods; start and stop} we can
achieve the same effect without the nested indentation. A simple helper
method, @code{create_patch}, puts the patch in place and returns the created mock
for us:

@example
>>> class MyTest(unittest.TestCase):
...
...     def create_patch(self, name):
...         patcher = patch(name)
...         thing = patcher.start()
...         self.addCleanup(patcher.stop)
...         return thing
...
...     def test_foo(self):
...         mock_foo = self.create_patch('mymodule.Foo')
...         mock_bar = self.create_patch('mymodule.Bar')
...         mock_spam = self.create_patch('mymodule.Spam')
...
...         assert mymodule.Foo is mock_foo
...         assert mymodule.Bar is mock_bar
...         assert mymodule.Spam is mock_spam
...
>>> original = mymodule.Foo
>>> MyTest('test_foo').run()
>>> assert mymodule.Foo is original
@end example

@node Mocking a dictionary with MagicMock,Mock subclasses and their attributes,Nesting patches,Further examples
@anchor{library/unittest mock-examples mocking-a-dictionary-with-magicmock}@anchor{49f1}
@subsubsection Mocking a dictionary with MagicMock


You may want to mock a dictionary, or other container object, recording all
access to it whilst having it still behave like a dictionary.

We can do this with @ref{1095,,MagicMock}, which will behave like a dictionary,
and using @ref{498c,,side_effect} to delegate dictionary access to a real
underlying dictionary that is under our control.

When the @ref{588,,__getitem__()} and @ref{14d7,,__setitem__()} methods
of our @code{MagicMock} are called
(normal dictionary access) then @code{side_effect} is called with the key (and in
the case of @code{__setitem__} the value too). We can also control what is returned.

After the @code{MagicMock} has been used we can use attributes like
@ref{499f,,call_args_list} to assert about how the dictionary was used:

@example
>>> my_dict = @{'a': 1, 'b': 2, 'c': 3@}
>>> def getitem(name):
...      return my_dict[name]
...
>>> def setitem(name, val):
...     my_dict[name] = val
...
>>> mock = MagicMock()
>>> mock.__getitem__.side_effect = getitem
>>> mock.__setitem__.side_effect = setitem
@end example

@cartouche
@quotation Note 
An alternative to using @code{MagicMock} is to use @code{Mock} and `only' provide
the magic methods you specifically want:

@example
>>> mock = Mock()
>>> mock.__getitem__ = Mock(side_effect=getitem)
>>> mock.__setitem__ = Mock(side_effect=setitem)
@end example

A `third' option is to use @code{MagicMock} but passing in @code{dict} as the `spec'
(or `spec_set') argument so that the @code{MagicMock} created only has
dictionary magic methods available:

@example
>>> mock = MagicMock(spec_set=dict)
>>> mock.__getitem__.side_effect = getitem
>>> mock.__setitem__.side_effect = setitem
@end example
@end quotation
@end cartouche

With these side effect functions in place, the @code{mock} will behave like a normal
dictionary but recording the access. It even raises a @ref{5e7,,KeyError} if you try
to access a key that doesn’t exist.

@example
>>> mock['a']
1
>>> mock['c']
3
>>> mock['d']
Traceback (most recent call last):
    ...
KeyError: 'd'
>>> mock['b'] = 'fish'
>>> mock['d'] = 'eggs'
>>> mock['b']
'fish'
>>> mock['d']
'eggs'
@end example

After it has been used you can make assertions about the access using the normal
mock methods and attributes:

@example
>>> mock.__getitem__.call_args_list
[call('a'), call('c'), call('d'), call('b'), call('d')]
>>> mock.__setitem__.call_args_list
[call('b', 'fish'), call('d', 'eggs')]
>>> my_dict
@{'a': 1, 'b': 'fish', 'c': 3, 'd': 'eggs'@}
@end example

@node Mock subclasses and their attributes,Mocking imports with patch dict,Mocking a dictionary with MagicMock,Further examples
@anchor{library/unittest mock-examples mock-subclasses-and-their-attributes}@anchor{49f2}
@subsubsection Mock subclasses and their attributes


There are various reasons why you might want to subclass @ref{c45,,Mock}. One
reason might be to add helper methods. Here’s a silly example:

@example
>>> class MyMock(MagicMock):
...     def has_been_called(self):
...         return self.called
...
>>> mymock = MyMock(return_value=None)
>>> mymock
<MyMock id='...'>
>>> mymock.has_been_called()
False
>>> mymock()
>>> mymock.has_been_called()
True
@end example

The standard behaviour for @code{Mock} instances is that attributes and the return
value mocks are of the same type as the mock they are accessed on. This ensures
that @code{Mock} attributes are @code{Mocks} and @code{MagicMock} attributes are @code{MagicMocks}
@footnote{
An exception to this rule are the non-callable mocks. Attributes use the
callable variant because otherwise non-callable mocks couldn’t have callable
methods.
}. So if you’re subclassing to add helper methods then they’ll also be
available on the attributes and return value mock of instances of your
subclass.

@example
>>> mymock.foo
<MyMock name='mock.foo' id='...'>
>>> mymock.foo.has_been_called()
False
>>> mymock.foo()
<MyMock name='mock.foo()' id='...'>
>>> mymock.foo.has_been_called()
True
@end example

Sometimes this is inconvenient. For example, one user@footnote{https://code.google.com/archive/p/mock/issues/105} is subclassing mock to
created a Twisted adaptor@footnote{https://twisted.org/documents/11.0.0/api/twisted.python.components.html}.
Having this applied to attributes too actually causes errors.

@code{Mock} (in all its flavours) uses a method called @code{_get_child_mock} to create
these “sub-mocks” for attributes and return values. You can prevent your
subclass being used for attributes by overriding this method. The signature is
that it takes arbitrary keyword arguments (@code{**kwargs}) which are then passed
onto the mock constructor:

@example
>>> class Subclass(MagicMock):
...     def _get_child_mock(self, /, **kwargs):
...         return MagicMock(**kwargs)
...
>>> mymock = Subclass()
>>> mymock.foo
<MagicMock name='mock.foo' id='...'>
>>> assert isinstance(mymock, Subclass)
>>> assert not isinstance(mymock.foo, Subclass)
>>> assert not isinstance(mymock(), Subclass)
@end example

@node Mocking imports with patch dict,Tracking order of calls and less verbose call assertions,Mock subclasses and their attributes,Further examples
@anchor{library/unittest mock-examples mocking-imports-with-patch-dict}@anchor{49f3}
@subsubsection Mocking imports with patch.dict


One situation where mocking can be hard is where you have a local import inside
a function. These are harder to mock because they aren’t using an object from
the module namespace that we can patch out.

Generally local imports are to be avoided. They are sometimes done to prevent
circular dependencies, for which there is `usually' a much better way to solve
the problem (refactor the code) or to prevent “up front costs” by delaying the
import. This can also be solved in better ways than an unconditional local
import (store the module as a class or module attribute and only do the import
on first use).

That aside there is a way to use @code{mock} to affect the results of an import.
Importing fetches an `object' from the @ref{1771,,sys.modules} dictionary. Note that it
fetches an `object', which need not be a module. Importing a module for the
first time results in a module object being put in @code{sys.modules}, so usually
when you import something you get a module back. This need not be the case
however.

This means you can use @ref{19ab,,patch.dict()} to `temporarily' put a mock in place
in @ref{1771,,sys.modules}. Any imports whilst this patch is active will fetch the mock.
When the patch is complete (the decorated function exits, the with statement
body is complete or @code{patcher.stop()} is called) then whatever was there
previously will be restored safely.

Here’s an example that mocks out the ‘fooble’ module.

@example
>>> import sys
>>> mock = Mock()
>>> with patch.dict('sys.modules', @{'fooble': mock@}):
...    import fooble
...    fooble.blob()
...
<Mock name='mock.blob()' id='...'>
>>> assert 'fooble' not in sys.modules
>>> mock.blob.assert_called_once_with()
@end example

As you can see the @code{import fooble} succeeds, but on exit there is no ‘fooble’
left in @ref{1771,,sys.modules}.

This also works for the @code{from module import name} form:

@example
>>> mock = Mock()
>>> with patch.dict('sys.modules', @{'fooble': mock@}):
...    from fooble import blob
...    blob.blip()
...
<Mock name='mock.blob.blip()' id='...'>
>>> mock.blob.blip.assert_called_once_with()
@end example

With slightly more work you can also mock package imports:

@example
>>> mock = Mock()
>>> modules = @{'package': mock, 'package.module': mock.module@}
>>> with patch.dict('sys.modules', modules):
...    from package.module import fooble
...    fooble()
...
<Mock name='mock.module.fooble()' id='...'>
>>> mock.module.fooble.assert_called_once_with()
@end example

@node Tracking order of calls and less verbose call assertions,More complex argument matching,Mocking imports with patch dict,Further examples
@anchor{library/unittest mock-examples tracking-order-of-calls-and-less-verbose-call-assertions}@anchor{49f4}
@subsubsection Tracking order of calls and less verbose call assertions


The @ref{c45,,Mock} class allows you to track the `order' of method calls on
your mock objects through the @ref{499a,,method_calls} attribute. This
doesn’t allow you to track the order of calls between separate mock objects,
however we can use @ref{4998,,mock_calls} to achieve the same effect.

Because mocks track calls to child mocks in @code{mock_calls}, and accessing an
arbitrary attribute of a mock creates a child mock, we can create our separate
mocks from a parent one. Calls to those child mock will then all be recorded,
in order, in the @code{mock_calls} of the parent:

@example
>>> manager = Mock()
>>> mock_foo = manager.foo
>>> mock_bar = manager.bar
@end example

@example
>>> mock_foo.something()
<Mock name='mock.foo.something()' id='...'>
>>> mock_bar.other.thing()
<Mock name='mock.bar.other.thing()' id='...'>
@end example

@example
>>> manager.mock_calls
[call.foo.something(), call.bar.other.thing()]
@end example

We can then assert about the calls, including the order, by comparing with
the @code{mock_calls} attribute on the manager mock:

@example
>>> expected_calls = [call.foo.something(), call.bar.other.thing()]
>>> manager.mock_calls == expected_calls
True
@end example

If @code{patch} is creating, and putting in place, your mocks then you can attach
them to a manager mock using the @ref{1999,,attach_mock()} method. After
attaching calls will be recorded in @code{mock_calls} of the manager.

@example
>>> manager = MagicMock()
>>> with patch('mymodule.Class1') as MockClass1:
...     with patch('mymodule.Class2') as MockClass2:
...         manager.attach_mock(MockClass1, 'MockClass1')
...         manager.attach_mock(MockClass2, 'MockClass2')
...         MockClass1().foo()
...         MockClass2().bar()
<MagicMock name='mock.MockClass1().foo()' id='...'>
<MagicMock name='mock.MockClass2().bar()' id='...'>
>>> manager.mock_calls
[call.MockClass1(),
call.MockClass1().foo(),
call.MockClass2(),
call.MockClass2().bar()]
@end example

If many calls have been made, but you’re only interested in a particular
sequence of them then an alternative is to use the
@ref{1a69,,assert_has_calls()} method. This takes a list of calls (constructed
with the @ref{1df5,,call} object). If that sequence of calls are in
@ref{4998,,mock_calls} then the assert succeeds.

@example
>>> m = MagicMock()
>>> m().foo().bar().baz()
<MagicMock name='mock().foo().bar().baz()' id='...'>
>>> m.one().two().three()
<MagicMock name='mock.one().two().three()' id='...'>
>>> calls = call.one().two().three().call_list()
>>> m.assert_has_calls(calls)
@end example

Even though the chained call @code{m.one().two().three()} aren’t the only calls that
have been made to the mock, the assert still succeeds.

Sometimes a mock may have several calls made to it, and you are only interested
in asserting about `some' of those calls. You may not even care about the
order. In this case you can pass @code{any_order=True} to @code{assert_has_calls}:

@example
>>> m = MagicMock()
>>> m(1), m.two(2, 3), m.seven(7), m.fifty('50')
(...)
>>> calls = [call.fifty('50'), call(1), call.seven(7)]
>>> m.assert_has_calls(calls, any_order=True)
@end example

@node More complex argument matching,,Tracking order of calls and less verbose call assertions,Further examples
@anchor{library/unittest mock-examples more-complex-argument-matching}@anchor{49f5}
@subsubsection More complex argument matching


Using the same basic concept as @ref{1df3,,ANY} we can implement matchers to do more
complex assertions on objects used as arguments to mocks.

Suppose we expect some object to be passed to a mock that by default
compares equal based on object identity (which is the Python default for user
defined classes). To use @ref{1e46,,assert_called_with()} we would need to pass
in the exact same object. If we are only interested in some of the attributes
of this object then we can create a matcher that will check these attributes
for us.

You can see in this example how a ‘standard’ call to @code{assert_called_with} isn’t
sufficient:

@example
>>> class Foo:
...     def __init__(self, a, b):
...         self.a, self.b = a, b
...
>>> mock = Mock(return_value=None)
>>> mock(Foo(1, 2))
>>> mock.assert_called_with(Foo(1, 2))
Traceback (most recent call last):
    ...
AssertionError: expected call not found.
Expected: mock(<__main__.Foo object at 0x...>)
Actual: mock(<__main__.Foo object at 0x...>)
@end example

A comparison function for our @code{Foo} class might look something like this:

@example
>>> def compare(self, other):
...     if not type(self) == type(other):
...         return False
...     if self.a != other.a:
...         return False
...     if self.b != other.b:
...         return False
...     return True
...
@end example

And a matcher object that can use comparison functions like this for its
equality operation would look something like this:

@example
>>> class Matcher:
...     def __init__(self, compare, some_obj):
...         self.compare = compare
...         self.some_obj = some_obj
...     def __eq__(self, other):
...         return self.compare(self.some_obj, other)
...
@end example

Putting all this together:

@example
>>> match_foo = Matcher(compare, Foo(1, 2))
>>> mock.assert_called_with(match_foo)
@end example

The @code{Matcher} is instantiated with our compare function and the @code{Foo} object
we want to compare against. In @code{assert_called_with} the @code{Matcher} equality
method will be called, which compares the object the mock was called with
against the one we created our matcher with. If they match then
@code{assert_called_with} passes, and if they don’t an @ref{8ba,,AssertionError} is raised:

@example
>>> match_wrong = Matcher(compare, Foo(3, 4))
>>> mock.assert_called_with(match_wrong)
Traceback (most recent call last):
    ...
AssertionError: Expected: ((<Matcher object at 0x...>,), @{@})
Called with: ((<Foo object at 0x...>,), @{@})
@end example

With a bit of tweaking you could have the comparison function raise the
@ref{8ba,,AssertionError} directly and provide a more useful failure message.

As of version 1.5, the Python testing library PyHamcrest@footnote{https://pyhamcrest.readthedocs.io/} provides similar functionality,
that may be useful here, in the form of its equality matcher
(hamcrest.library.integration.match_equality@footnote{https://pyhamcrest.readthedocs.io/en/release-1.8/integration/#module-hamcrest.library.integration.match_equality}).

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node test — Regression tests package for Python,test support — Utilities for the Python test suite,unittest mock — getting started,Development Tools
@anchor{library/test doc}@anchor{49f6}@anchor{library/test module-test}@anchor{e8}@anchor{library/test test-regression-tests-package-for-python}@anchor{49f7}@anchor{library/test translation-repo}@anchor{49f8}
@subsection @code{test} — Regression tests package for Python


@geindex module; test

@cartouche
@quotation Note 
The @code{test} package is meant for internal use by Python only. It is
documented for the benefit of the core developers of Python. Any use of
this package outside of Python’s standard library is discouraged as code
mentioned here can change or be removed without notice between releases of
Python.
@end quotation
@end cartouche


__________________________________________________________________


The @code{test} package contains all regression tests for Python as well as the
modules @ref{ea,,test.support} and @ref{e9,,test.regrtest}.
@code{test.support} is used to enhance your tests while
@code{test.regrtest} drives the testing suite.

Each module in the @code{test} package whose name starts with @code{test_} is a
testing suite for a specific module or feature. All new tests should be written
using the @ref{10d,,unittest} or @ref{3e,,doctest} module.  Some older tests are
written using a “traditional” testing style that compares output printed to
@code{sys.stdout}; this style of test is considered deprecated.


@subsubheading See also



@table @asis

@item Module @ref{10d,,unittest}

Writing PyUnit regression tests.

@item Module @ref{3e,,doctest}

Tests embedded in documentation strings.
@end table


@menu
* Writing Unit Tests for the test package:: 
* Running tests using the command-line interface:: 

@end menu

@node Writing Unit Tests for the test package,Running tests using the command-line interface,,test — Regression tests package for Python
@anchor{library/test writing-tests}@anchor{49f9}@anchor{library/test writing-unit-tests-for-the-test-package}@anchor{49fa}
@subsubsection Writing Unit Tests for the @code{test} package


It is preferred that tests that use the @ref{10d,,unittest} module follow a few
guidelines. One is to name the test module by starting it with @code{test_} and end
it with the name of the module being tested. The test methods in the test module
should start with @code{test_} and end with a description of what the method is
testing. This is needed so that the methods are recognized by the test driver as
test methods. Also, no documentation string for the method should be included. A
comment (such as @code{# Tests function returns only True or False}) should be used
to provide documentation for test methods. This is done because documentation
strings get printed out if they exist and thus what test is being run is not
stated.

A basic boilerplate is often used:

@example
import unittest
from test import support

class MyTestCase1(unittest.TestCase):

    # Only use setUp() and tearDown() if necessary

    def setUp(self):
        ... code to execute in preparation for tests ...

    def tearDown(self):
        ... code to execute to clean up after tests ...

    def test_feature_one(self):
        # Test feature one.
        ... testing code ...

    def test_feature_two(self):
        # Test feature two.
        ... testing code ...

    ... more test methods ...

class MyTestCase2(unittest.TestCase):
    ... same structure as MyTestCase1 ...

... more test classes ...

if __name__ == '__main__':
    unittest.main()
@end example

This code pattern allows the testing suite to be run by @ref{e9,,test.regrtest},
on its own as a script that supports the @ref{10d,,unittest} CLI, or via the
@code{python -m unittest} CLI.

The goal for regression testing is to try to break code. This leads to a few
guidelines to be followed:


@itemize *

@item 
The testing suite should exercise all classes, functions, and constants. This
includes not just the external API that is to be presented to the outside
world but also “private” code.

@item 
Whitebox testing (examining the code being tested when the tests are being
written) is preferred. Blackbox testing (testing only the published user
interface) is not complete enough to make sure all boundary and edge cases
are tested.

@item 
Make sure all possible values are tested including invalid ones. This makes
sure that not only all valid values are acceptable but also that improper
values are handled correctly.

@item 
Exhaust as many code paths as possible. Test where branching occurs and thus
tailor input to make sure as many different paths through the code are taken.

@item 
Add an explicit test for any bugs discovered for the tested code. This will
make sure that the error does not crop up again if the code is changed in the
future.

@item 
Make sure to clean up after your tests (such as close and remove all temporary
files).

@item 
If a test is dependent on a specific condition of the operating system then
verify the condition already exists before attempting the test.

@item 
Import as few modules as possible and do it as soon as possible. This
minimizes external dependencies of tests and also minimizes possible anomalous
behavior from side-effects of importing a module.

@item 
Try to maximize code reuse. On occasion, tests will vary by something as small
as what type of input is used. Minimize code duplication by subclassing a
basic test class with a class that specifies the input:

@example
class TestFuncAcceptsSequencesMixin:

    func = mySuperWhammyFunction

    def test_func(self):
        self.func(self.arg)

class AcceptLists(TestFuncAcceptsSequencesMixin, unittest.TestCase):
    arg = [1, 2, 3]

class AcceptStrings(TestFuncAcceptsSequencesMixin, unittest.TestCase):
    arg = 'abc'

class AcceptTuples(TestFuncAcceptsSequencesMixin, unittest.TestCase):
    arg = (1, 2, 3)
@end example

When using this pattern, remember that all classes that inherit from
@ref{2b5,,unittest.TestCase} are run as tests.  The @code{TestFuncAcceptsSequencesMixin} class in the example above
does not have any data and so can’t be run by itself, thus it does not
inherit from @code{unittest.TestCase}.
@end itemize


@subsubheading See also



@table @asis

@item Test Driven Development

A book by Kent Beck on writing tests before code.
@end table


@node Running tests using the command-line interface,,Writing Unit Tests for the test package,test — Regression tests package for Python
@anchor{library/test module-test regrtest}@anchor{e9}@anchor{library/test regrtest}@anchor{120f}@anchor{library/test running-tests-using-the-command-line-interface}@anchor{49fb}
@subsubsection Running tests using the command-line interface


@geindex module; test.regrtest

The @code{test} package can be run as a script to drive Python’s regression
test suite, thanks to the @ref{23e,,-m} option: @code{python -m test}. Under
the hood, it uses @code{test.regrtest}; the call @code{python -m
test.regrtest} used in previous Python versions still works.  Running the
script by itself automatically starts running all regression tests in the
@code{test} package. It does this by finding all modules in the package whose
name starts with @code{test_}, importing them, and executing the function
@code{test_main()} if present or loading the tests via
unittest.TestLoader.loadTestsFromModule if @code{test_main} does not exist.  The
names of tests to execute may also be passed to the script. Specifying a single
regression test (@code{python -m test test_spam}) will minimize output and
only print whether the test passed or failed.

Running @code{test} directly allows what resources are available for
tests to use to be set. You do this by using the @code{-u} command-line
option. Specifying @code{all} as the value for the @code{-u} option enables all
possible resources: @code{python -m test -uall}.
If all but one resource is desired (a more common case), a
comma-separated list of resources that are not desired may be listed after
@code{all}. The command @code{python -m test -uall,-audio,-largefile}
will run @code{test} with all resources except the @code{audio} and
@code{largefile} resources. For a list of all resources and more command-line
options, run @code{python -m test -h}.

Some other ways to execute the regression tests depend on what platform the
tests are being executed on. On Unix, you can run @code{make test} at the
top-level directory where Python was built. On Windows,
executing @code{rt.bat} from your @code{PCbuild} directory will run all
regression tests.


Added in version 3.14: Output is colorized by default and can be
@ref{1b9,,controlled using environment variables}.


@node test support — Utilities for the Python test suite,test support socket_helper — Utilities for socket tests,test — Regression tests package for Python,Development Tools
@anchor{library/test module-test support}@anchor{ea}@anchor{library/test test-support-utilities-for-the-python-test-suite}@anchor{49fc}
@subsection @code{test.support} — Utilities for the Python test suite


@geindex module; test.support

The @code{test.support} module provides support for Python’s regression
test suite.

@cartouche
@quotation Note 
@code{test.support} is not a public module.  It is documented here to help
Python developers write tests.  The API of this module is subject to change
without backwards compatibility concerns between releases.
@end quotation
@end cartouche

This module defines the following exceptions:

@geindex TestFailed
@anchor{library/test test support TestFailed}@anchor{49fd}
@deffn {Exception} test.support.TestFailed

Exception to be raised when a test fails. This is deprecated in favor of
@ref{10d,,unittest}-based tests and @ref{2b5,,unittest.TestCase}’s assertion
methods.
@end deffn

@geindex ResourceDenied
@anchor{library/test test support ResourceDenied}@anchor{49fe}
@deffn {Exception} test.support.ResourceDenied

Subclass of @ref{11ea,,unittest.SkipTest}. Raised when a resource (such as a
network connection) is not available. Raised by the @ref{49ff,,requires()}
function.
@end deffn

The @code{test.support} module defines the following constants:

@geindex verbose (in module test.support)
@anchor{library/test test support verbose}@anchor{4a00}
@deffn {Data} test.support.verbose

@code{True} when verbose output is enabled. Should be checked when more
detailed information is desired about a running test. `verbose' is set by
@ref{e9,,test.regrtest}.
@end deffn

@geindex is_jython (in module test.support)
@anchor{library/test test support is_jython}@anchor{4a01}
@deffn {Data} test.support.is_jython

@code{True} if the running interpreter is Jython.
@end deffn

@geindex is_android (in module test.support)
@anchor{library/test test support is_android}@anchor{4a02}
@deffn {Data} test.support.is_android

@code{True} if @code{sys.platform} is @code{android}.
@end deffn

@geindex is_emscripten (in module test.support)
@anchor{library/test test support is_emscripten}@anchor{4a03}
@deffn {Data} test.support.is_emscripten

@code{True} if @code{sys.platform} is @code{emscripten}.
@end deffn

@geindex is_wasi (in module test.support)
@anchor{library/test test support is_wasi}@anchor{4a04}
@deffn {Data} test.support.is_wasi

@code{True} if @code{sys.platform} is @code{wasi}.
@end deffn

@geindex is_apple_mobile (in module test.support)
@anchor{library/test test support is_apple_mobile}@anchor{4a05}
@deffn {Data} test.support.is_apple_mobile

@code{True} if @code{sys.platform} is @code{ios}, @code{tvos}, or @code{watchos}.
@end deffn

@geindex is_apple (in module test.support)
@anchor{library/test test support is_apple}@anchor{4a06}
@deffn {Data} test.support.is_apple

@code{True} if @code{sys.platform} is @code{darwin} or @code{is_apple_mobile} is @code{True}.
@end deffn

@geindex unix_shell (in module test.support)
@anchor{library/test test support unix_shell}@anchor{4a07}
@deffn {Data} test.support.unix_shell

Path for shell if not on Windows; otherwise @code{None}.
@end deffn

@geindex LOOPBACK_TIMEOUT (in module test.support)
@anchor{library/test test support LOOPBACK_TIMEOUT}@anchor{1ddf}
@deffn {Data} test.support.LOOPBACK_TIMEOUT

Timeout in seconds for tests using a network server listening on the network
local loopback interface like @code{127.0.0.1}.

The timeout is long enough to prevent test failure: it takes into account
that the client and the server can run in different threads or even
different processes.

The timeout should be long enough for @ref{fa9,,connect()},
@ref{faa,,recv()} and @ref{fad,,send()} methods of
@ref{fa7,,socket.socket}.

Its default value is 5 seconds.

See also @ref{1de0,,INTERNET_TIMEOUT}.
@end deffn

@geindex INTERNET_TIMEOUT (in module test.support)
@anchor{library/test test support INTERNET_TIMEOUT}@anchor{1de0}
@deffn {Data} test.support.INTERNET_TIMEOUT

Timeout in seconds for network requests going to the internet.

The timeout is short enough to prevent a test to wait for too long if the
internet request is blocked for whatever reason.

Usually, a timeout using @code{INTERNET_TIMEOUT} should not mark a test as
failed, but skip the test instead: see
@ref{4a08,,transient_internet()}.

Its default value is 1 minute.

See also @ref{1ddf,,LOOPBACK_TIMEOUT}.
@end deffn

@geindex SHORT_TIMEOUT (in module test.support)
@anchor{library/test test support SHORT_TIMEOUT}@anchor{1ca6}
@deffn {Data} test.support.SHORT_TIMEOUT

Timeout in seconds to mark a test as failed if the test takes “too long”.

The timeout value depends on the regrtest @code{--timeout} command line option.

If a test using @code{SHORT_TIMEOUT} starts to fail randomly on slow
buildbots, use @ref{1de1,,LONG_TIMEOUT} instead.

Its default value is 30 seconds.
@end deffn

@geindex LONG_TIMEOUT (in module test.support)
@anchor{library/test test support LONG_TIMEOUT}@anchor{1de1}
@deffn {Data} test.support.LONG_TIMEOUT

Timeout in seconds to detect when a test hangs.

It is long enough to reduce the risk of test failure on the slowest Python
buildbots. It should not be used to mark a test as failed if the test takes
“too long”.  The timeout value depends on the regrtest @code{--timeout} command
line option.

Its default value is 5 minutes.

See also @ref{1ddf,,LOOPBACK_TIMEOUT}, @ref{1de0,,INTERNET_TIMEOUT} and
@ref{1ca6,,SHORT_TIMEOUT}.
@end deffn

@geindex PGO (in module test.support)
@anchor{library/test test support PGO}@anchor{4a09}
@deffn {Data} test.support.PGO

Set when tests can be skipped when they are not useful for PGO.
@end deffn

@geindex PIPE_MAX_SIZE (in module test.support)
@anchor{library/test test support PIPE_MAX_SIZE}@anchor{4a0a}
@deffn {Data} test.support.PIPE_MAX_SIZE

A constant that is likely larger than the underlying OS pipe buffer size,
to make writes blocking.
@end deffn

@geindex Py_DEBUG (in module test.support)
@anchor{library/test test support Py_DEBUG}@anchor{4a0b}
@deffn {Data} test.support.Py_DEBUG

@code{True} if Python was built with the @ref{187e,,Py_DEBUG} macro
defined, that is, if
Python was @ref{50a,,built in debug mode}.


Added in version 3.12.

@end deffn

@geindex SOCK_MAX_SIZE (in module test.support)
@anchor{library/test test support SOCK_MAX_SIZE}@anchor{4a0c}
@deffn {Data} test.support.SOCK_MAX_SIZE

A constant that is likely larger than the underlying OS socket buffer size,
to make writes blocking.
@end deffn

@geindex TEST_SUPPORT_DIR (in module test.support)
@anchor{library/test test support TEST_SUPPORT_DIR}@anchor{4a0d}
@deffn {Data} test.support.TEST_SUPPORT_DIR

Set to the top level directory that contains @code{test.support}.
@end deffn

@geindex TEST_HOME_DIR (in module test.support)
@anchor{library/test test support TEST_HOME_DIR}@anchor{4a0e}
@deffn {Data} test.support.TEST_HOME_DIR

Set to the top level directory for the test package.
@end deffn

@geindex TEST_DATA_DIR (in module test.support)
@anchor{library/test test support TEST_DATA_DIR}@anchor{4a0f}
@deffn {Data} test.support.TEST_DATA_DIR

Set to the @code{data} directory within the test package.
@end deffn

@geindex MAX_Py_ssize_t (in module test.support)
@anchor{library/test test support MAX_Py_ssize_t}@anchor{4a10}
@deffn {Data} test.support.MAX_Py_ssize_t

Set to @ref{13d1,,sys.maxsize} for big memory tests.
@end deffn

@geindex max_memuse (in module test.support)
@anchor{library/test test support max_memuse}@anchor{4a11}
@deffn {Data} test.support.max_memuse

Set by @ref{4a12,,set_memlimit()} as the memory limit for big memory tests.
Limited by @ref{4a10,,MAX_Py_ssize_t}.
@end deffn

@geindex real_max_memuse (in module test.support)
@anchor{library/test test support real_max_memuse}@anchor{4a13}
@deffn {Data} test.support.real_max_memuse

Set by @ref{4a12,,set_memlimit()} as the memory limit for big memory tests.  Not
limited by @ref{4a10,,MAX_Py_ssize_t}.
@end deffn

@geindex MISSING_C_DOCSTRINGS (in module test.support)
@anchor{library/test test support MISSING_C_DOCSTRINGS}@anchor{4a14}
@deffn {Data} test.support.MISSING_C_DOCSTRINGS

Set to @code{True} if Python is built without docstrings (the
@code{WITH_DOC_STRINGS} macro is not defined).
See the @ref{21e4,,configure --without-doc-strings} option.

See also the @ref{4a15,,HAVE_DOCSTRINGS} variable.
@end deffn

@geindex HAVE_DOCSTRINGS (in module test.support)
@anchor{library/test test support HAVE_DOCSTRINGS}@anchor{4a15}
@deffn {Data} test.support.HAVE_DOCSTRINGS

Set to @code{True} if function docstrings are available.
See the @ref{18d,,python -OO} option, which strips docstrings of functions implemented in Python.

See also the @ref{4a14,,MISSING_C_DOCSTRINGS} variable.
@end deffn

@geindex TEST_HTTP_URL (in module test.support)
@anchor{library/test test support TEST_HTTP_URL}@anchor{4a16}
@deffn {Data} test.support.TEST_HTTP_URL

Define the URL of a dedicated HTTP server for the network tests.
@end deffn

@geindex ALWAYS_EQ (in module test.support)
@anchor{library/test test support ALWAYS_EQ}@anchor{4a17}
@deffn {Data} test.support.ALWAYS_EQ

Object that is equal to anything.  Used to test mixed type comparison.
@end deffn

@geindex NEVER_EQ (in module test.support)
@anchor{library/test test support NEVER_EQ}@anchor{4a18}
@deffn {Data} test.support.NEVER_EQ

Object that is not equal to anything (even to @ref{4a17,,ALWAYS_EQ}).
Used to test mixed type comparison.
@end deffn

@geindex LARGEST (in module test.support)
@anchor{library/test test support LARGEST}@anchor{4a19}
@deffn {Data} test.support.LARGEST

Object that is greater than anything (except itself).
Used to test mixed type comparison.
@end deffn

@geindex SMALLEST (in module test.support)
@anchor{library/test test support SMALLEST}@anchor{4a1a}
@deffn {Data} test.support.SMALLEST

Object that is less than anything (except itself).
Used to test mixed type comparison.
@end deffn

The @code{test.support} module defines the following functions:

@geindex busy_retry() (in module test.support)
@anchor{library/test test support busy_retry}@anchor{4a1b}
@deffn {Function} test.support.busy_retry (timeout, err_msg=None, /, *, error=True)

Run the loop body until @code{break} stops the loop.

After `timeout' seconds, raise an @ref{8ba,,AssertionError} if `error' is true,
or just stop the loop if `error' is false.

Example:

@example
for _ in support.busy_retry(support.SHORT_TIMEOUT):
    if check():
        break
@end example

Example of error=False usage:

@example
for _ in support.busy_retry(support.SHORT_TIMEOUT, error=False):
    if check():
        break
else:
    raise RuntimeError('my custom error')
@end example
@end deffn

@geindex sleeping_retry() (in module test.support)
@anchor{library/test test support sleeping_retry}@anchor{4a1c}
@deffn {Function} test.support.sleeping_retry (timeout, err_msg=None, /, *, init_delay=0.010, max_delay=1.0, error=True)

Wait strategy that applies exponential backoff.

Run the loop body until @code{break} stops the loop. Sleep at each loop
iteration, but not at the first iteration. The sleep delay is doubled at
each iteration (up to `max_delay' seconds).

See @ref{4a1b,,busy_retry()} documentation for the parameters usage.

Example raising an exception after SHORT_TIMEOUT seconds:

@example
for _ in support.sleeping_retry(support.SHORT_TIMEOUT):
    if check():
        break
@end example

Example of error=False usage:

@example
for _ in support.sleeping_retry(support.SHORT_TIMEOUT, error=False):
    if check():
        break
else:
    raise RuntimeError('my custom error')
@end example
@end deffn

@geindex is_resource_enabled() (in module test.support)
@anchor{library/test test support is_resource_enabled}@anchor{4a1d}
@deffn {Function} test.support.is_resource_enabled (resource)

Return @code{True} if `resource' is enabled and available. The list of
available resources is only set when @ref{e9,,test.regrtest} is executing the
tests.
@end deffn

@geindex get_resource_value() (in module test.support)
@anchor{library/test test support get_resource_value}@anchor{4a1e}
@deffn {Function} test.support.get_resource_value (resource)

Return the value specified for `resource' (as @code{-u @var{resource}=@var{value}}).
Return @code{None} if `resource' is disabled or no value is specified.
@end deffn

@geindex python_is_optimized() (in module test.support)
@anchor{library/test test support python_is_optimized}@anchor{4a1f}
@deffn {Function} test.support.python_is_optimized ()

Return @code{True} if Python was not built with @code{-O0} or @code{-Og}.
@end deffn

@geindex with_pymalloc() (in module test.support)
@anchor{library/test test support with_pymalloc}@anchor{4a20}
@deffn {Function} test.support.with_pymalloc ()

Return @code{_testcapi.WITH_PYMALLOC}.
@end deffn

@geindex requires() (in module test.support)
@anchor{library/test test support requires}@anchor{49ff}
@deffn {Function} test.support.requires (resource, msg=None)

Raise @ref{49fe,,ResourceDenied} if `resource' is not available. `msg' is the
argument to @code{ResourceDenied} if it is raised. Always returns
@code{True} if called by a function whose @code{__name__} is @code{'__main__'}.
Used when tests are executed by @ref{e9,,test.regrtest}.
@end deffn

@geindex sortdict() (in module test.support)
@anchor{library/test test support sortdict}@anchor{4a21}
@deffn {Function} test.support.sortdict (dict)

Return a repr of `dict' with keys sorted.
@end deffn

@geindex findfile() (in module test.support)
@anchor{library/test test support findfile}@anchor{4a22}
@deffn {Function} test.support.findfile (filename, subdir=None)

Return the path to the file named `filename'. If no match is found
`filename' is returned. This does not equal a failure since it could be the
path to the file.

Setting `subdir' indicates a relative path to use to find the file
rather than looking directly in the path directories.
@end deffn

@geindex get_pagesize() (in module test.support)
@anchor{library/test test support get_pagesize}@anchor{4a23}
@deffn {Function} test.support.get_pagesize ()

Get size of a page in bytes.


Added in version 3.12.

@end deffn

@geindex setswitchinterval() (in module test.support)
@anchor{library/test test support setswitchinterval}@anchor{4a24}
@deffn {Function} test.support.setswitchinterval (interval)

Set the @ref{b4a,,sys.setswitchinterval()} to the given `interval'.  Defines
a minimum interval for Android systems to prevent the system from hanging.
@end deffn

@geindex check_impl_detail() (in module test.support)
@anchor{library/test test support check_impl_detail}@anchor{4a25}
@deffn {Function} test.support.check_impl_detail (**guards)

Use this check to guard CPython’s implementation-specific tests or to
run them only on the implementations guarded by the arguments.  This
function returns @code{True} or @code{False} depending on the host platform.
Example usage:

@example
check_impl_detail()               # Only on CPython (default).
check_impl_detail(jython=True)    # Only on Jython.
check_impl_detail(cpython=False)  # Everywhere except CPython.
@end example
@end deffn

@geindex set_memlimit() (in module test.support)
@anchor{library/test test support set_memlimit}@anchor{4a12}
@deffn {Function} test.support.set_memlimit (limit)

Set the values for @ref{4a11,,max_memuse} and @ref{4a13,,real_max_memuse} for big
memory tests.
@end deffn

@geindex record_original_stdout() (in module test.support)
@anchor{library/test test support record_original_stdout}@anchor{4a26}
@deffn {Function} test.support.record_original_stdout (stdout)

Store the value from `stdout'.  It is meant to hold the stdout at the
time the regrtest began.
@end deffn

@geindex get_original_stdout() (in module test.support)
@anchor{library/test test support get_original_stdout}@anchor{4a27}
@deffn {Function} test.support.get_original_stdout ()

Return the original stdout set by @ref{4a26,,record_original_stdout()} or
@code{sys.stdout} if it’s not set.
@end deffn

@geindex args_from_interpreter_flags() (in module test.support)
@anchor{library/test test support args_from_interpreter_flags}@anchor{4a28}
@deffn {Function} test.support.args_from_interpreter_flags ()

Return a list of command line arguments reproducing the current settings
in @code{sys.flags} and @code{sys.warnoptions}.
@end deffn

@geindex optim_args_from_interpreter_flags() (in module test.support)
@anchor{library/test test support optim_args_from_interpreter_flags}@anchor{4a29}
@deffn {Function} test.support.optim_args_from_interpreter_flags ()

Return a list of command line arguments reproducing the current
optimization settings in @code{sys.flags}.
@end deffn

@geindex captured_stdin() (in module test.support)
@geindex captured_stdout() (in module test.support)
@geindex captured_stderr() (in module test.support)
@anchor{library/test test support captured_stdin}@anchor{4a2a}
@deffn {Function} test.support.captured_stdin ()
@anchor{library/test test support captured_stdout}@anchor{4a2b}
@deffnx {Function} test.support.captured_stdout ()
@anchor{library/test test support captured_stderr}@anchor{1e1a}
@deffnx {Function} test.support.captured_stderr ()

A context managers that temporarily replaces the named stream with
@ref{112f,,io.StringIO} object.

Example use with output streams:

@example
with captured_stdout() as stdout, captured_stderr() as stderr:
    print("hello")
    print("error", file=sys.stderr)
assert stdout.getvalue() == "hello\n"
assert stderr.getvalue() == "error\n"
@end example

Example use with input stream:

@example
with captured_stdin() as stdin:
    stdin.write('hello\n')
    stdin.seek(0)
    # call test code that consumes from sys.stdin
    captured = input()
self.assertEqual(captured, "hello")
@end example
@end deffn

@geindex disable_faulthandler() (in module test.support)
@anchor{library/test test support disable_faulthandler}@anchor{4a2c}
@deffn {Function} test.support.disable_faulthandler ()

A context manager that temporary disables @ref{5c,,faulthandler}.
@end deffn

@geindex gc_collect() (in module test.support)
@anchor{library/test test support gc_collect}@anchor{4a2d}
@deffn {Function} test.support.gc_collect ()

Force as many objects as possible to be collected.  This is needed because
timely deallocation is not guaranteed by the garbage collector.  This means
that @code{__del__} methods may be called later than expected and weakrefs
may remain alive for longer than expected.
@end deffn

@geindex disable_gc() (in module test.support)
@anchor{library/test test support disable_gc}@anchor{4a2e}
@deffn {Function} test.support.disable_gc ()

A context manager that disables the garbage collector on entry. On
exit, the garbage collector is restored to its prior state.
@end deffn

@geindex swap_attr() (in module test.support)
@anchor{library/test test support swap_attr}@anchor{4a2f}
@deffn {Function} test.support.swap_attr (obj, attr, new_val)

Context manager to swap out an attribute with a new object.

Usage:

@example
with swap_attr(obj, "attr", 5):
    ...
@end example

This will set @code{obj.attr} to 5 for the duration of the @code{with} block,
restoring the old value at the end of the block.  If @code{attr} doesn’t
exist on @code{obj}, it will be created and then deleted at the end of the
block.

The old value (or @code{None} if it doesn’t exist) will be assigned to the
target of the “as” clause, if there is one.
@end deffn

@geindex swap_item() (in module test.support)
@anchor{library/test test support swap_item}@anchor{4a30}
@deffn {Function} test.support.swap_item (obj, attr, new_val)

Context manager to swap out an item with a new object.

Usage:

@example
with swap_item(obj, "item", 5):
    ...
@end example

This will set @code{obj["item"]} to 5 for the duration of the @code{with} block,
restoring the old value at the end of the block. If @code{item} doesn’t
exist on @code{obj}, it will be created and then deleted at the end of the
block.

The old value (or @code{None} if it doesn’t exist) will be assigned to the
target of the “as” clause, if there is one.
@end deffn

@geindex flush_std_streams() (in module test.support)
@anchor{library/test test support flush_std_streams}@anchor{4a31}
@deffn {Function} test.support.flush_std_streams ()

Call the @code{flush()} method on @ref{cd3,,sys.stdout} and then on
@ref{b39,,sys.stderr}. It can be used to make sure that the logs order is
consistent before writing into stderr.


Added in version 3.11.

@end deffn

@geindex print_warning() (in module test.support)
@anchor{library/test test support print_warning}@anchor{4a32}
@deffn {Function} test.support.print_warning (msg)

Print a warning into @ref{4a33,,sys.__stderr__}. Format the message as:
@code{f"Warning -- @{msg@}"}. If `msg' is made of multiple lines, add
@code{"Warning -- "} prefix to each line.


Added in version 3.9.

@end deffn

@geindex wait_process() (in module test.support)
@anchor{library/test test support wait_process}@anchor{1da1}
@deffn {Function} test.support.wait_process (pid, *, exitcode, timeout=None)

Wait until process `pid' completes and check that the process exit code is
`exitcode'.

Raise an @ref{8ba,,AssertionError} if the process exit code is not equal to
`exitcode'.

If the process runs longer than `timeout' seconds (@ref{1ca6,,SHORT_TIMEOUT} by
default), kill the process and raise an @ref{8ba,,AssertionError}. The timeout
feature is not available on Windows.


Added in version 3.9.

@end deffn

@geindex calcobjsize() (in module test.support)
@anchor{library/test test support calcobjsize}@anchor{4a34}
@deffn {Function} test.support.calcobjsize (fmt)

Return the size of the @ref{5df,,PyObject} whose structure members are
defined by `fmt'. The returned value includes the size of the Python object header and alignment.
@end deffn

@geindex calcvobjsize() (in module test.support)
@anchor{library/test test support calcvobjsize}@anchor{4a35}
@deffn {Function} test.support.calcvobjsize (fmt)

Return the size of the @ref{4a36,,PyVarObject} whose structure members are
defined by `fmt'. The returned value includes the size of the Python object header and alignment.
@end deffn

@geindex checksizeof() (in module test.support)
@anchor{library/test test support checksizeof}@anchor{4a37}
@deffn {Function} test.support.checksizeof (test, o, size)

For testcase `test', assert that the @code{sys.getsizeof} for `o' plus the GC
header size equals `size'.
@end deffn

@geindex anticipate_failure() (in module test.support)
@anchor{library/test test support anticipate_failure}@anchor{4a38}
@deffn {Function} @@test.support.anticipate_failure (condition)

A decorator to conditionally mark tests with
@ref{494a,,unittest.expectedFailure()}. Any use of this decorator should
have an associated comment identifying the relevant tracker issue.
@end deffn

@geindex system_must_validate_cert() (in module test.support)
@anchor{library/test test support system_must_validate_cert}@anchor{4a39}
@deffn {Function} test.support.system_must_validate_cert (f)

A decorator that skips the decorated test on TLS certification validation failures.
@end deffn

@geindex run_with_locale() (in module test.support)
@anchor{library/test test support run_with_locale}@anchor{4a3a}
@deffn {Function} @@test.support.run_with_locale (catstr, *locales)

A decorator for running a function in a different locale, correctly
resetting it after it has finished.  `catstr' is the locale category as
a string (for example @code{"LC_ALL"}).  The `locales' passed will be tried
sequentially, and the first valid locale will be used.
@end deffn

@geindex run_with_tz() (in module test.support)
@anchor{library/test test support run_with_tz}@anchor{4a3b}
@deffn {Function} @@test.support.run_with_tz (tz)

A decorator for running a function in a specific timezone, correctly
resetting it after it has finished.
@end deffn

@geindex requires_freebsd_version() (in module test.support)
@anchor{library/test test support requires_freebsd_version}@anchor{4a3c}
@deffn {Function} @@test.support.requires_freebsd_version (*min_version)

Decorator for the minimum version when running test on FreeBSD.  If the
FreeBSD version is less than the minimum, the test is skipped.
@end deffn

@geindex requires_linux_version() (in module test.support)
@anchor{library/test test support requires_linux_version}@anchor{4a3d}
@deffn {Function} @@test.support.requires_linux_version (*min_version)

Decorator for the minimum version when running test on Linux.  If the
Linux version is less than the minimum, the test is skipped.
@end deffn

@geindex requires_mac_version() (in module test.support)
@anchor{library/test test support requires_mac_version}@anchor{4a3e}
@deffn {Function} @@test.support.requires_mac_version (*min_version)

Decorator for the minimum version when running test on macOS.  If the
macOS version is less than the minimum, the test is skipped.
@end deffn

@geindex requires_gil_enabled() (in module test.support)
@anchor{library/test test support requires_gil_enabled}@anchor{4a3f}
@deffn {Function} @@test.support.requires_gil_enabled

Decorator for skipping tests on the free-threaded build.  If the
@ref{165,,GIL} is disabled, the test is skipped.
@end deffn

@geindex requires_IEEE_754() (in module test.support)
@anchor{library/test test support requires_IEEE_754}@anchor{4a40}
@deffn {Function} @@test.support.requires_IEEE_754

Decorator for skipping tests on non-IEEE 754 platforms.
@end deffn

@geindex requires_zlib() (in module test.support)
@anchor{library/test test support requires_zlib}@anchor{4a41}
@deffn {Function} @@test.support.requires_zlib

Decorator for skipping tests if @ref{13a,,zlib} doesn’t exist.
@end deffn

@geindex requires_gzip() (in module test.support)
@anchor{library/test test support requires_gzip}@anchor{4a42}
@deffn {Function} @@test.support.requires_gzip

Decorator for skipping tests if @ref{6b,,gzip} doesn’t exist.
@end deffn

@geindex requires_bz2() (in module test.support)
@anchor{library/test test support requires_bz2}@anchor{4a43}
@deffn {Function} @@test.support.requires_bz2

Decorator for skipping tests if @ref{14,,bz2} doesn’t exist.
@end deffn

@geindex requires_lzma() (in module test.support)
@anchor{library/test test support requires_lzma}@anchor{4a44}
@deffn {Function} @@test.support.requires_lzma

Decorator for skipping tests if @ref{8e,,lzma} doesn’t exist.
@end deffn

@geindex requires_resource() (in module test.support)
@anchor{library/test test support requires_resource}@anchor{4a45}
@deffn {Function} @@test.support.requires_resource (resource)

Decorator for skipping tests if `resource' is not available.
@end deffn

@geindex requires_docstrings() (in module test.support)
@anchor{library/test test support requires_docstrings}@anchor{4a46}
@deffn {Function} @@test.support.requires_docstrings

Decorator for only running the test if @ref{4a15,,HAVE_DOCSTRINGS}.
@end deffn

@geindex requires_limited_api() (in module test.support)
@anchor{library/test test support requires_limited_api}@anchor{4a47}
@deffn {Function} @@test.support.requires_limited_api

Decorator for only running the test if @ref{637,,Limited C API}
is available.
@end deffn

@geindex cpython_only() (in module test.support)
@anchor{library/test test support cpython_only}@anchor{4a48}
@deffn {Function} @@test.support.cpython_only

Decorator for tests only applicable to CPython.
@end deffn

@geindex impl_detail() (in module test.support)
@anchor{library/test test support impl_detail}@anchor{4a49}
@deffn {Function} @@test.support.impl_detail (msg=None, **guards)

Decorator for invoking @ref{4a25,,check_impl_detail()} on `guards'.  If that
returns @code{False}, then uses `msg' as the reason for skipping the test.
@end deffn

@geindex thread_unsafe() (in module test.support)
@anchor{library/test test support thread_unsafe}@anchor{4a4a}
@deffn {Function} @@test.support.thread_unsafe (reason=None)

Decorator for marking tests as thread-unsafe.  This test always runs in one
thread even when invoked with @code{--parallel-threads}.
@end deffn

@geindex no_tracing() (in module test.support)
@anchor{library/test test support no_tracing}@anchor{4a4b}
@deffn {Function} @@test.support.no_tracing

Decorator to temporarily turn off tracing for the duration of the test.
@end deffn

@geindex refcount_test() (in module test.support)
@anchor{library/test test support refcount_test}@anchor{4a4c}
@deffn {Function} @@test.support.refcount_test

Decorator for tests which involve reference counting.  The decorator does
not run the test if it is not run by CPython.  Any trace function is unset
for the duration of the test to prevent unexpected refcounts caused by
the trace function.
@end deffn

@geindex bigmemtest() (in module test.support)
@anchor{library/test test support bigmemtest}@anchor{4a4d}
@deffn {Function} @@test.support.bigmemtest (size, memuse, dry_run=True)

Decorator for bigmem tests.

`size' is a requested size for the test (in arbitrary, test-interpreted
units.)  `memuse' is the number of bytes per unit for the test, or a good
estimate of it.  For example, a test that needs two byte buffers, of 4 GiB
each, could be decorated with @code{@@bigmemtest(size=_4G, memuse=2)}.

The `size' argument is normally passed to the decorated test method as an
extra argument.  If `dry_run' is @code{True}, the value passed to the test
method may be less than the requested value.  If `dry_run' is @code{False}, it
means the test doesn’t support dummy runs when @code{-M} is not specified.
@end deffn

@geindex bigaddrspacetest() (in module test.support)
@anchor{library/test test support bigaddrspacetest}@anchor{4a4e}
@deffn {Function} @@test.support.bigaddrspacetest

Decorator for tests that fill the address space.
@end deffn

@geindex linked_to_musl() (in module test.support)
@anchor{library/test test support linked_to_musl}@anchor{4a4f}
@deffn {Function} test.support.linked_to_musl ()

Return @code{False} if there is no evidence the interpreter was compiled with
@code{musl}, otherwise return a version triple, either @code{(0, 0, 0)} if the
version is unknown, or the actual version if it is known.  Intended for use
in @code{skip} decorators.  @code{emscripten} and @code{wasi} are assumed to be
compiled with @code{musl}; otherwise @code{platform.libc_ver} is checked.
@end deffn

@geindex check_syntax_error() (in module test.support)
@anchor{library/test test support check_syntax_error}@anchor{4a50}
@deffn {Function} test.support.check_syntax_error (testcase, statement, errtext='@w{'}, *, lineno=None, offset=None)

Test for syntax errors in `statement' by attempting to compile `statement'.
`testcase' is the @ref{10d,,unittest} instance for the test.  `errtext' is the
regular expression which should match the string representation of the
raised @ref{18f,,SyntaxError}.  If `lineno' is not @code{None}, compares to
the line of the exception.  If `offset' is not @code{None}, compares to
the offset of the exception.
@end deffn

@geindex open_urlresource() (in module test.support)
@anchor{library/test test support open_urlresource}@anchor{4a51}
@deffn {Function} test.support.open_urlresource (url, *args, **kw)

Open `url'.  If open fails, raises @ref{49fd,,TestFailed}.
@end deffn

@geindex reap_children() (in module test.support)
@anchor{library/test test support reap_children}@anchor{4a52}
@deffn {Function} test.support.reap_children ()

Use this at the end of @code{test_main} whenever sub-processes are started.
This will help ensure that no extra children (zombies) stick around to
hog resources and create problems when looking for refleaks.
@end deffn

@geindex get_attribute() (in module test.support)
@anchor{library/test test support get_attribute}@anchor{4a53}
@deffn {Function} test.support.get_attribute (obj, name)

Get an attribute, raising @ref{11ea,,unittest.SkipTest} if @ref{5f0,,AttributeError}
is raised.
@end deffn

@geindex catch_unraisable_exception() (in module test.support)
@anchor{library/test test support catch_unraisable_exception}@anchor{1dff}
@deffn {Function} test.support.catch_unraisable_exception ()

Context manager catching unraisable exception using
@ref{508,,sys.unraisablehook()}.

Storing the exception value (@code{cm.unraisable.exc_value}) creates a
reference cycle. The reference cycle is broken explicitly when the context
manager exits.

Storing the object (@code{cm.unraisable.object}) can resurrect it if it is set
to an object which is being finalized. Exiting the context manager clears
the stored object.

Usage:

@example
with support.catch_unraisable_exception() as cm:
    # code creating an "unraisable exception"
    ...

    # check the unraisable exception: use cm.unraisable
    ...

# cm.unraisable attribute no longer exists at this point
# (to break a reference cycle)
@end example


Added in version 3.8.

@end deffn

@geindex load_package_tests() (in module test.support)
@anchor{library/test test support load_package_tests}@anchor{4a54}
@deffn {Function} test.support.load_package_tests (pkg_dir, loader, standard_tests, pattern)

Generic implementation of the @ref{10d,,unittest} @code{load_tests} protocol for
use in test packages.  `pkg_dir' is the root directory of the package;
`loader', `standard_tests', and `pattern' are the arguments expected by
@code{load_tests}.  In simple cases, the test package’s @code{__init__.py}
can be the following:

@example
import os
from test.support import load_package_tests

def load_tests(*args):
    return load_package_tests(os.path.dirname(__file__), *args)
@end example
@end deffn

@geindex detect_api_mismatch() (in module test.support)
@anchor{library/test test support detect_api_mismatch}@anchor{4a55}
@deffn {Function} test.support.detect_api_mismatch (ref_api, other_api, *, ignore=())

Returns the set of attributes, functions or methods of `ref_api' not
found on `other_api', except for a defined list of items to be
ignored in this check specified in `ignore'.

By default this skips private attributes beginning with ‘_’ but
includes all magic methods, i.e. those starting and ending in ‘__’.


Added in version 3.5.

@end deffn

@geindex patch() (in module test.support)
@anchor{library/test test support patch}@anchor{4a56}
@deffn {Function} test.support.patch (test_instance, object_to_patch, attr_name, new_value)

Override `object_to_patch.attr_name' with `new_value'.  Also add
cleanup procedure to `test_instance' to restore `object_to_patch' for
`attr_name'.  The `attr_name' should be a valid attribute for
`object_to_patch'.
@end deffn

@geindex run_in_subinterp() (in module test.support)
@anchor{library/test test support run_in_subinterp}@anchor{4a57}
@deffn {Function} test.support.run_in_subinterp (code)

Run `code' in subinterpreter.  Raise @ref{11ea,,unittest.SkipTest} if
@ref{106,,tracemalloc} is enabled.
@end deffn

@geindex check_free_after_iterating() (in module test.support)
@anchor{library/test test support check_free_after_iterating}@anchor{4a58}
@deffn {Function} test.support.check_free_after_iterating (test, iter, cls, args=())

Assert instances of `cls' are deallocated after iterating.
@end deffn

@geindex missing_compiler_executable() (in module test.support)
@anchor{library/test test support missing_compiler_executable}@anchor{4a59}
@deffn {Function} test.support.missing_compiler_executable (cmd_names=[])

Check for the existence of the compiler executables whose names are listed
in `cmd_names' or all the compiler executables when `cmd_names' is empty
and return the first missing executable or @code{None} when none is found
missing.
@end deffn

@geindex check__all__() (in module test.support)
@anchor{library/test test support check__all__}@anchor{1d77}
@deffn {Function} test.support.check__all__ (test_case, module, name_of_module=None, extra=(), not_exported=())

Assert that the @code{__all__} variable of `module' contains all public names.

The module’s public names (its API) are detected automatically
based on whether they match the public name convention and were defined in
`module'.

The `name_of_module' argument can specify (as a string or tuple thereof) what
module(s) an API could be defined in order to be detected as a public
API. One case for this is when `module' imports part of its public API from
other modules, possibly a C backend (like @code{csv} and its @code{_csv}).

The `extra' argument can be a set of names that wouldn’t otherwise be automatically
detected as “public”, like objects without a proper @ref{2721,,__module__}
attribute. If provided, it will be added to the automatically detected ones.

The `not_exported' argument can be a set of names that must not be treated
as part of the public API even though their names indicate otherwise.

Example use:

@example
import bar
import foo
import unittest
from test import support

class MiscTestCase(unittest.TestCase):
    def test__all__(self):
        support.check__all__(self, foo)

class OtherTestCase(unittest.TestCase):
    def test__all__(self):
        extra = @{'BAR_CONST', 'FOO_CONST'@}
        not_exported = @{'baz'@}  # Undocumented name.
        # bar imports part of its API from _bar.
        support.check__all__(self, bar, ('bar', '_bar'),
                             extra=extra, not_exported=not_exported)
@end example


Added in version 3.6.

@end deffn

@geindex skip_if_broken_multiprocessing_synchronize() (in module test.support)
@anchor{library/test test support skip_if_broken_multiprocessing_synchronize}@anchor{1d78}
@deffn {Function} test.support.skip_if_broken_multiprocessing_synchronize ()

Skip tests if the @code{multiprocessing.synchronize} module is missing, if
there is no available semaphore implementation, or if creating a lock raises
an @ref{2c2,,OSError}.


Added in version 3.10.

@end deffn

@geindex check_disallow_instantiation() (in module test.support)
@anchor{library/test test support check_disallow_instantiation}@anchor{4a5a}
@deffn {Function} test.support.check_disallow_instantiation (test_case, tp, *args, **kwds)

Assert that type `tp' cannot be instantiated using `args' and `kwds'.


Added in version 3.10.

@end deffn

@geindex adjust_int_max_str_digits() (in module test.support)
@anchor{library/test test support adjust_int_max_str_digits}@anchor{4a5b}
@deffn {Function} test.support.adjust_int_max_str_digits (max_digits)

This function returns a context manager that will change the global
@ref{1769,,sys.set_int_max_str_digits()} setting for the duration of the
context to allow execution of test code that needs a different limit
on the number of digits when converting between an integer and string.


Added in version 3.11.

@end deffn

The @code{test.support} module defines the following classes:

@geindex SuppressCrashReport (class in test.support)
@anchor{library/test test support SuppressCrashReport}@anchor{4a5c}
@deffn {Class} test.support.SuppressCrashReport

A context manager used to try to prevent crash dialog popups on tests that
are expected to crash a subprocess.

On Windows, it disables Windows Error Reporting dialogs using
SetErrorMode@footnote{https://msdn.microsoft.com/en-us/library/windows/desktop/ms680621.aspx}.

On UNIX, @ref{1815,,resource.setrlimit()} is used to set
@ref{4a5d,,resource.RLIMIT_CORE}’s soft limit to 0 to prevent coredump file
creation.

On both platforms, the old value is restored by @ref{150c,,__exit__()}.
@end deffn

@geindex SaveSignals (class in test.support)
@anchor{library/test test support SaveSignals}@anchor{4a5e}
@deffn {Class} test.support.SaveSignals

Class to save and restore signal handlers registered by the Python signal
handler.

@geindex save() (test.support.SaveSignals method)
@anchor{library/test test support SaveSignals save}@anchor{4a5f}
@deffn {Method} save (self)

Save the signal handlers to a dictionary mapping signal numbers to the
current signal handler.
@end deffn

@geindex restore() (test.support.SaveSignals method)
@anchor{library/test test support SaveSignals restore}@anchor{4a60}
@deffn {Method} restore (self)

Set the signal numbers from the @ref{4a5f,,save()} dictionary to the saved
handler.
@end deffn
@end deffn

@geindex Matcher (class in test.support)
@anchor{library/test test support Matcher}@anchor{4a61}
@deffn {Class} test.support.Matcher

@geindex matches() (test.support.Matcher method)
@anchor{library/test test support Matcher matches}@anchor{4a62}
@deffn {Method} matches (self, d, **kwargs)

Try to match a single dict with the supplied arguments.
@end deffn

@geindex match_value() (test.support.Matcher method)
@anchor{library/test test support Matcher match_value}@anchor{4a63}
@deffn {Method} match_value (self, k, dv, v)

Try to match a single stored value (`dv') with a supplied value (`v').
@end deffn
@end deffn

@node test support socket_helper — Utilities for socket tests,test support script_helper — Utilities for the Python execution tests,test support — Utilities for the Python test suite,Development Tools
@anchor{library/test module-test support socket_helper}@anchor{ef}@anchor{library/test test-support-socket-helper-utilities-for-socket-tests}@anchor{4a64}
@subsection @code{test.support.socket_helper} — Utilities for socket tests


@geindex module; test.support.socket_helper

The @code{test.support.socket_helper} module provides support for socket tests.


Added in version 3.9.


@geindex IPV6_ENABLED (in module test.support.socket_helper)
@anchor{library/test test support socket_helper IPV6_ENABLED}@anchor{4a65}
@deffn {Data} test.support.socket_helper.IPV6_ENABLED

Set to @code{True} if IPv6 is enabled on this host, @code{False} otherwise.
@end deffn

@geindex find_unused_port() (in module test.support.socket_helper)
@anchor{library/test test support socket_helper find_unused_port}@anchor{4a66}
@deffn {Function} test.support.socket_helper.find_unused_port (family=socket.AF_INET, socktype=socket.SOCK_STREAM)

Returns an unused port that should be suitable for binding.  This is
achieved by creating a temporary socket with the same family and type as
the @code{sock} parameter (default is @ref{1bf0,,AF_INET},
@ref{14ff,,SOCK_STREAM}),
and binding it to the specified host address (defaults to @code{0.0.0.0})
with the port set to 0, eliciting an unused ephemeral port from the OS.
The temporary socket is then closed and deleted, and the ephemeral port is
returned.

Either this method or @ref{4a67,,bind_port()} should be used for any tests
where a server socket needs to be bound to a particular port for the
duration of the test.
Which one to use depends on whether the calling code is creating a Python
socket, or if an unused port needs to be provided in a constructor
or passed to an external program (i.e. the @code{-accept} argument to
openssl’s s_server mode).  Always prefer @code{bind_port()} over
@code{find_unused_port()} where possible.  Using a hard coded port is
discouraged since it can make multiple instances of the test impossible to
run simultaneously, which is a problem for buildbots.
@end deffn

@geindex bind_port() (in module test.support.socket_helper)
@anchor{library/test test support socket_helper bind_port}@anchor{4a67}
@deffn {Function} test.support.socket_helper.bind_port (sock, host=HOST)

Bind the socket to a free port and return the port number.  Relies on
ephemeral ports in order to ensure we are using an unbound port.  This is
important as many tests may be running simultaneously, especially in a
buildbot environment.  This method raises an exception if the
@code{sock.family} is @ref{1bf0,,AF_INET} and @code{sock.type} is
@ref{14ff,,SOCK_STREAM}, and the socket has
@code{SO_REUSEADDR} or @code{SO_REUSEPORT} set on it.
Tests should never set these socket options for TCP/IP sockets.
The only case for setting these options is testing multicasting via
multiple UDP sockets.

Additionally, if the @code{SO_EXCLUSIVEADDRUSE} socket option is
available (i.e. on Windows), it will be set on the socket.  This will
prevent anyone else from binding to our host/port for the duration of the
test.
@end deffn

@geindex bind_unix_socket() (in module test.support.socket_helper)
@anchor{library/test test support socket_helper bind_unix_socket}@anchor{4a68}
@deffn {Function} test.support.socket_helper.bind_unix_socket (sock, addr)

Bind a Unix socket, raising @ref{11ea,,unittest.SkipTest} if
@ref{f44,,PermissionError} is raised.
@end deffn

@geindex skip_unless_bind_unix_socket() (in module test.support.socket_helper)
@anchor{library/test test support socket_helper skip_unless_bind_unix_socket}@anchor{4a69}
@deffn {Function} @@test.support.socket_helper.skip_unless_bind_unix_socket

A decorator for running tests that require a functional @code{bind()} for Unix
sockets.
@end deffn

@geindex transient_internet() (in module test.support.socket_helper)
@anchor{library/test test support socket_helper transient_internet}@anchor{4a08}
@deffn {Function} test.support.socket_helper.transient_internet (resource_name, *, timeout=30.0, errnos=())

A context manager that raises @ref{49fe,,ResourceDenied} when
various issues with the internet connection manifest themselves as
exceptions.
@end deffn

@node test support script_helper — Utilities for the Python execution tests,test support bytecode_helper — Support tools for testing correct bytecode generation,test support socket_helper — Utilities for socket tests,Development Tools
@anchor{library/test module-test support script_helper}@anchor{ee}@anchor{library/test test-support-script-helper-utilities-for-the-python-execution-tests}@anchor{4a6a}
@subsection @code{test.support.script_helper} — Utilities for the Python execution tests


@geindex module; test.support.script_helper

The @code{test.support.script_helper} module provides support for Python’s
script execution tests.

@geindex interpreter_requires_environment() (in module test.support.script_helper)
@anchor{library/test test support script_helper interpreter_requires_environment}@anchor{4a6b}
@deffn {Function} test.support.script_helper.interpreter_requires_environment ()

Return @code{True} if @code{sys.executable interpreter} requires environment
variables in order to be able to run at all.

This is designed to be used with @code{@@unittest.skipIf()} to annotate tests
that need to use an @code{assert_python*()} function to launch an isolated
mode (@code{-I}) or no environment mode (@code{-E}) sub-interpreter process.

A normal build & test does not run into this situation but it can happen
when trying to run the standard library test suite from an interpreter that
doesn’t have an obvious home with Python’s current home finding logic.

Setting 
@geindex PYTHONHOME
@geindex environment variable; PYTHONHOME
@ref{3ee,,PYTHONHOME} is one way to get most of the testsuite to run
in that situation.  
@geindex PYTHONPATH
@geindex environment variable; PYTHONPATH
@ref{1223,,PYTHONPATH} or 
@geindex PYTHONUSERSITE
@geindex environment variable; PYTHONUSERSITE
@code{PYTHONUSERSITE} are
other common environment variables that might impact whether or not the
interpreter can start.
@end deffn

@geindex run_python_until_end() (in module test.support.script_helper)
@anchor{library/test test support script_helper run_python_until_end}@anchor{4a6c}
@deffn {Function} test.support.script_helper.run_python_until_end (*args, **env_vars)

Set up the environment based on `env_vars' for running the interpreter
in a subprocess.  The values can include @code{__isolated}, @code{__cleanenv},
@code{__cwd}, and @code{TERM}.


Changed in version 3.9: The function no longer strips whitespaces from `stderr'.

@end deffn

@geindex assert_python_ok() (in module test.support.script_helper)
@anchor{library/test test support script_helper assert_python_ok}@anchor{4a6d}
@deffn {Function} test.support.script_helper.assert_python_ok (*args, **env_vars)

Assert that running the interpreter with `args' and optional environment
variables `env_vars' succeeds (@code{rc == 0}) and return a @code{(return code,
stdout, stderr)} tuple.

If the `__cleanenv' keyword-only parameter is set, `env_vars' is used as a fresh
environment.

Python is started in isolated mode (command line option @code{-I}),
except if the `__isolated' keyword-only parameter is set to @code{False}.


Changed in version 3.9: The function no longer strips whitespaces from `stderr'.

@end deffn

@geindex assert_python_failure() (in module test.support.script_helper)
@anchor{library/test test support script_helper assert_python_failure}@anchor{4a6e}
@deffn {Function} test.support.script_helper.assert_python_failure (*args, **env_vars)

Assert that running the interpreter with `args' and optional environment
variables `env_vars' fails (@code{rc != 0}) and return a @code{(return code,
stdout, stderr)} tuple.

See @ref{4a6d,,assert_python_ok()} for more options.


Changed in version 3.9: The function no longer strips whitespaces from `stderr'.

@end deffn

@geindex spawn_python() (in module test.support.script_helper)
@anchor{library/test test support script_helper spawn_python}@anchor{4a6f}
@deffn {Function} test.support.script_helper.spawn_python (*args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, **kw)

Run a Python subprocess with the given arguments.

`kw' is extra keyword args to pass to @ref{4b8,,subprocess.Popen()}. Returns a
@ref{4b8,,subprocess.Popen} object.
@end deffn

@geindex kill_python() (in module test.support.script_helper)
@anchor{library/test test support script_helper kill_python}@anchor{4a70}
@deffn {Function} test.support.script_helper.kill_python (p)

Run the given @ref{4b8,,subprocess.Popen} process until completion and return
stdout.
@end deffn

@geindex make_script() (in module test.support.script_helper)
@anchor{library/test test support script_helper make_script}@anchor{4a71}
@deffn {Function} test.support.script_helper.make_script (script_dir, script_basename, source, omit_suffix=False)

Create script containing `source' in path `script_dir' and `script_basename'.
If `omit_suffix' is @code{False}, append @code{.py} to the name.  Return the full
script path.
@end deffn

@geindex make_zip_script() (in module test.support.script_helper)
@anchor{library/test test support script_helper make_zip_script}@anchor{4a72}
@deffn {Function} test.support.script_helper.make_zip_script (zip_dir, zip_basename, script_name, name_in_zip=None)

Create zip file at `zip_dir' and `zip_basename' with extension @code{zip} which
contains the files in `script_name'. `name_in_zip' is the archive name.
Return a tuple containing @code{(full path, full path of archive name)}.
@end deffn

@geindex make_pkg() (in module test.support.script_helper)
@anchor{library/test test support script_helper make_pkg}@anchor{4a73}
@deffn {Function} test.support.script_helper.make_pkg (pkg_dir, init_source='@w{'})

Create a directory named `pkg_dir' containing an @code{__init__} file with
`init_source' as its contents.
@end deffn

@geindex make_zip_pkg() (in module test.support.script_helper)
@anchor{library/test test support script_helper make_zip_pkg}@anchor{4a74}
@deffn {Function} test.support.script_helper.make_zip_pkg (zip_dir, zip_basename, pkg_name, script_basename, source, depth=1, compiled=False)

Create a zip package directory with a path of `zip_dir' and `zip_basename'
containing an empty @code{__init__} file and a file `script_basename'
containing the `source'.  If `compiled' is @code{True}, both source files will
be compiled and added to the zip package.  Return a tuple of the full zip
path and the archive name for the zip file.
@end deffn

@node test support bytecode_helper — Support tools for testing correct bytecode generation,test support threading_helper — Utilities for threading tests,test support script_helper — Utilities for the Python execution tests,Development Tools
@anchor{library/test module-test support bytecode_helper}@anchor{eb}@anchor{library/test test-support-bytecode-helper-support-tools-for-testing-correct-bytecode-generation}@anchor{4a75}
@subsection @code{test.support.bytecode_helper} — Support tools for testing correct bytecode generation


@geindex module; test.support.bytecode_helper

The @code{test.support.bytecode_helper} module provides support for testing
and inspecting bytecode generation.


Added in version 3.9.


The module defines the following class:

@geindex BytecodeTestCase (class in test.support.bytecode_helper)
@anchor{library/test test support bytecode_helper BytecodeTestCase}@anchor{4a76}
@deffn {Class} test.support.bytecode_helper.BytecodeTestCase (unittest.TestCase)

This class has custom assertion methods for inspecting bytecode.
@end deffn

@geindex get_disassembly_as_string() (test.support.bytecode_helper.BytecodeTestCase method)
@anchor{library/test test support bytecode_helper BytecodeTestCase get_disassembly_as_string}@anchor{4a77}
@deffn {Method} BytecodeTestCase.get_disassembly_as_string (co)

Return the disassembly of `co' as string.
@end deffn

@geindex assertInBytecode() (test.support.bytecode_helper.BytecodeTestCase method)
@anchor{library/test test support bytecode_helper BytecodeTestCase assertInBytecode}@anchor{4a78}
@deffn {Method} BytecodeTestCase.assertInBytecode (x, opname, argval=_UNSPECIFIED)

Return instr if `opname' is found, otherwise throws @ref{8ba,,AssertionError}.
@end deffn

@geindex assertNotInBytecode() (test.support.bytecode_helper.BytecodeTestCase method)
@anchor{library/test test support bytecode_helper BytecodeTestCase assertNotInBytecode}@anchor{4a79}
@deffn {Method} BytecodeTestCase.assertNotInBytecode (x, opname, argval=_UNSPECIFIED)

Throws @ref{8ba,,AssertionError} if `opname' is found.
@end deffn

@node test support threading_helper — Utilities for threading tests,test support os_helper — Utilities for os tests,test support bytecode_helper — Support tools for testing correct bytecode generation,Development Tools
@anchor{library/test module-test support threading_helper}@anchor{f0}@anchor{library/test test-support-threading-helper-utilities-for-threading-tests}@anchor{4a7a}
@subsection @code{test.support.threading_helper} — Utilities for threading tests


@geindex module; test.support.threading_helper

The @code{test.support.threading_helper} module provides support for threading tests.


Added in version 3.10.


@geindex join_thread() (in module test.support.threading_helper)
@anchor{library/test test support threading_helper join_thread}@anchor{4a7b}
@deffn {Function} test.support.threading_helper.join_thread (thread, timeout=None)

Join a `thread' within `timeout'.  Raise an @ref{8ba,,AssertionError} if thread
is still alive after `timeout' seconds.
@end deffn

@geindex reap_threads() (in module test.support.threading_helper)
@anchor{library/test test support threading_helper reap_threads}@anchor{4a7c}
@deffn {Function} @@test.support.threading_helper.reap_threads

Decorator to ensure the threads are cleaned up even if the test fails.
@end deffn

@geindex start_threads() (in module test.support.threading_helper)
@anchor{library/test test support threading_helper start_threads}@anchor{4a7d}
@deffn {Function} test.support.threading_helper.start_threads (threads, unlock=None)

Context manager to start `threads', which is a sequence of threads.
`unlock' is a function called after the threads are started, even if an
exception was raised; an example would be @ref{36b0,,threading.Event.set()}.
@code{start_threads} will attempt to join the started threads upon exit.
@end deffn

@geindex threading_cleanup() (in module test.support.threading_helper)
@anchor{library/test test support threading_helper threading_cleanup}@anchor{4a7e}
@deffn {Function} test.support.threading_helper.threading_cleanup (*original_values)

Cleanup up threads not specified in `original_values'.  Designed to emit
a warning if a test leaves running threads in the background.
@end deffn

@geindex threading_setup() (in module test.support.threading_helper)
@anchor{library/test test support threading_helper threading_setup}@anchor{4a7f}
@deffn {Function} test.support.threading_helper.threading_setup ()

Return current thread count and copy of dangling threads.
@end deffn

@geindex wait_threads_exit() (in module test.support.threading_helper)
@anchor{library/test test support threading_helper wait_threads_exit}@anchor{4a80}
@deffn {Function} test.support.threading_helper.wait_threads_exit (timeout=None)

Context manager to wait until all threads created in the @code{with} statement
exit.
@end deffn

@geindex catch_threading_exception() (in module test.support.threading_helper)
@anchor{library/test test support threading_helper catch_threading_exception}@anchor{4a81}
@deffn {Function} test.support.threading_helper.catch_threading_exception ()

Context manager catching @ref{177,,threading.Thread} exception using
@ref{a51,,threading.excepthook()}.

Attributes set when an exception is caught:


@itemize *

@item 
@code{exc_type}

@item 
@code{exc_value}

@item 
@code{exc_traceback}

@item 
@code{thread}
@end itemize

See @ref{a51,,threading.excepthook()} documentation.

These attributes are deleted at the context manager exit.

Usage:

@example
with threading_helper.catch_threading_exception() as cm:
    # code spawning a thread which raises an exception
    ...

    # check the thread exception, use cm attributes:
    # exc_type, exc_value, exc_traceback, thread
    ...

# exc_type, exc_value, exc_traceback, thread attributes of cm no longer
# exists at this point
# (to avoid reference cycles)
@end example


Added in version 3.8.

@end deffn

@geindex run_concurrently() (in module test.support.threading_helper)
@anchor{library/test test support threading_helper run_concurrently}@anchor{4a82}
@deffn {Function} test.support.threading_helper.run_concurrently (worker_func, nthreads, args=(), kwargs=@{@})

Run the worker function concurrently in multiple threads.
Re-raises an exception if any thread raises one, after all threads have
finished.
@end deffn

@node test support os_helper — Utilities for os tests,test support import_helper — Utilities for import tests,test support threading_helper — Utilities for threading tests,Development Tools
@anchor{library/test module-test support os_helper}@anchor{ed}@anchor{library/test test-support-os-helper-utilities-for-os-tests}@anchor{4a83}
@subsection @code{test.support.os_helper} — Utilities for os tests


@geindex module; test.support.os_helper

The @code{test.support.os_helper} module provides support for os tests.


Added in version 3.10.


@geindex FS_NONASCII (in module test.support.os_helper)
@anchor{library/test test support os_helper FS_NONASCII}@anchor{4a84}
@deffn {Data} test.support.os_helper.FS_NONASCII

A non-ASCII character encodable by @ref{e55,,os.fsencode()}.
@end deffn

@geindex SAVEDCWD (in module test.support.os_helper)
@anchor{library/test test support os_helper SAVEDCWD}@anchor{4a85}
@deffn {Data} test.support.os_helper.SAVEDCWD

Set to @ref{194e,,os.getcwd()}.
@end deffn

@geindex TESTFN (in module test.support.os_helper)
@anchor{library/test test support os_helper TESTFN}@anchor{4a86}
@deffn {Data} test.support.os_helper.TESTFN

Set to a name that is safe to use as the name of a temporary file.  Any
temporary file that is created should be closed and unlinked (removed).
@end deffn

@geindex TESTFN_NONASCII (in module test.support.os_helper)
@anchor{library/test test support os_helper TESTFN_NONASCII}@anchor{4a87}
@deffn {Data} test.support.os_helper.TESTFN_NONASCII

Set to a filename containing the @ref{4a84,,FS_NONASCII} character, if it exists.
This guarantees that if the filename exists, it can be encoded and decoded
with the default filesystem encoding. This allows tests that require a
non-ASCII filename to be easily skipped on platforms where they can’t work.
@end deffn

@geindex TESTFN_UNENCODABLE (in module test.support.os_helper)
@anchor{library/test test support os_helper TESTFN_UNENCODABLE}@anchor{4a88}
@deffn {Data} test.support.os_helper.TESTFN_UNENCODABLE

Set to a filename (str type) that should not be able to be encoded by file
system encoding in strict mode.  It may be @code{None} if it’s not possible to
generate such a filename.
@end deffn

@geindex TESTFN_UNDECODABLE (in module test.support.os_helper)
@anchor{library/test test support os_helper TESTFN_UNDECODABLE}@anchor{4a89}
@deffn {Data} test.support.os_helper.TESTFN_UNDECODABLE

Set to a filename (bytes type) that should not be able to be decoded by
file system encoding in strict mode.  It may be @code{None} if it’s not
possible to generate such a filename.
@end deffn

@geindex TESTFN_UNICODE (in module test.support.os_helper)
@anchor{library/test test support os_helper TESTFN_UNICODE}@anchor{4a8a}
@deffn {Data} test.support.os_helper.TESTFN_UNICODE

Set to a non-ASCII name for a temporary file.
@end deffn

@geindex EnvironmentVarGuard (class in test.support.os_helper)
@anchor{library/test test support os_helper EnvironmentVarGuard}@anchor{15ee}
@deffn {Class} test.support.os_helper.EnvironmentVarGuard

Class used to temporarily set or unset environment variables.  Instances can
be used as a context manager and have a complete dictionary interface for
querying/modifying the underlying @code{os.environ}. After exit from the
context manager all changes to environment variables done through this
instance will be rolled back.


Changed in version 3.1: Added dictionary interface.

@end deffn

@geindex FakePath (class in test.support.os_helper)
@anchor{library/test test support os_helper FakePath}@anchor{4a8b}
@deffn {Class} test.support.os_helper.FakePath (path)

Simple @ref{5a1,,path-like object}.  It implements the
@ref{e52,,__fspath__()}
method which just returns the `path' argument.  If `path' is an exception,
it will be raised in @code{__fspath__()}.
@end deffn

@geindex set() (test.support.os_helper.EnvironmentVarGuard method)
@anchor{library/test test support os_helper EnvironmentVarGuard set}@anchor{4a8c}
@deffn {Method} EnvironmentVarGuard.set (envvar, value)

Temporarily set the environment variable @code{envvar} to the value of
@code{value}.
@end deffn

@geindex unset() (test.support.os_helper.EnvironmentVarGuard method)
@anchor{library/test test support os_helper EnvironmentVarGuard unset}@anchor{18bb}
@deffn {Method} EnvironmentVarGuard.unset (envvar, *others)

Temporarily unset one or more environment variables.


Changed in version 3.14: More than one environment variable can be unset.

@end deffn

@geindex can_symlink() (in module test.support.os_helper)
@anchor{library/test test support os_helper can_symlink}@anchor{4a8d}
@deffn {Function} test.support.os_helper.can_symlink ()

Return @code{True} if the OS supports symbolic links, @code{False}
otherwise.
@end deffn

@geindex can_xattr() (in module test.support.os_helper)
@anchor{library/test test support os_helper can_xattr}@anchor{4a8e}
@deffn {Function} test.support.os_helper.can_xattr ()

Return @code{True} if the OS supports xattr, @code{False}
otherwise.
@end deffn

@geindex change_cwd() (in module test.support.os_helper)
@anchor{library/test test support os_helper change_cwd}@anchor{4a8f}
@deffn {Function} test.support.os_helper.change_cwd (path, quiet=False)

A context manager that temporarily changes the current working
directory to `path' and yields the directory.

If `quiet' is @code{False}, the context manager raises an exception
on error.  Otherwise, it issues only a warning and keeps the current
working directory the same.
@end deffn

@geindex create_empty_file() (in module test.support.os_helper)
@anchor{library/test test support os_helper create_empty_file}@anchor{4a90}
@deffn {Function} test.support.os_helper.create_empty_file (filename)

Create an empty file with `filename'.  If it already exists, truncate it.
@end deffn

@geindex fd_count() (in module test.support.os_helper)
@anchor{library/test test support os_helper fd_count}@anchor{4a91}
@deffn {Function} test.support.os_helper.fd_count ()

Count the number of open file descriptors.
@end deffn

@geindex fs_is_case_insensitive() (in module test.support.os_helper)
@anchor{library/test test support os_helper fs_is_case_insensitive}@anchor{4a92}
@deffn {Function} test.support.os_helper.fs_is_case_insensitive (directory)

Return @code{True} if the file system for `directory' is case-insensitive.
@end deffn

@geindex make_bad_fd() (in module test.support.os_helper)
@anchor{library/test test support os_helper make_bad_fd}@anchor{4a93}
@deffn {Function} test.support.os_helper.make_bad_fd ()

Create an invalid file descriptor by opening and closing a temporary file,
and returning its descriptor.
@end deffn

@geindex rmdir() (in module test.support.os_helper)
@anchor{library/test test support os_helper rmdir}@anchor{4a94}
@deffn {Function} test.support.os_helper.rmdir (filename)

Call @ref{12ff,,os.rmdir()} on `filename'.  On Windows platforms, this is
wrapped with a wait loop that checks for the existence of the file,
which is needed due to antivirus programs that can hold files open and prevent
deletion.
@end deffn

@geindex rmtree() (in module test.support.os_helper)
@anchor{library/test test support os_helper rmtree}@anchor{4a95}
@deffn {Function} test.support.os_helper.rmtree (path)

Call @ref{354,,shutil.rmtree()} on `path' or call @ref{6c9,,os.lstat()} and
@ref{12ff,,os.rmdir()} to remove a path and its contents.  As with @ref{4a94,,rmdir()},
on Windows platforms
this is wrapped with a wait loop that checks for the existence of the files.
@end deffn

@geindex skip_unless_symlink() (in module test.support.os_helper)
@anchor{library/test test support os_helper skip_unless_symlink}@anchor{4a96}
@deffn {Function} @@test.support.os_helper.skip_unless_symlink

A decorator for running tests that require support for symbolic links.
@end deffn

@geindex skip_unless_xattr() (in module test.support.os_helper)
@anchor{library/test test support os_helper skip_unless_xattr}@anchor{4a97}
@deffn {Function} @@test.support.os_helper.skip_unless_xattr

A decorator for running tests that require support for xattr.
@end deffn

@geindex temp_cwd() (in module test.support.os_helper)
@anchor{library/test test support os_helper temp_cwd}@anchor{4a98}
@deffn {Function} test.support.os_helper.temp_cwd (name='tempcwd', quiet=False)

A context manager that temporarily creates a new directory and
changes the current working directory (CWD).

The context manager creates a temporary directory in the current
directory with name `name' before temporarily changing the current
working directory.  If `name' is @code{None}, the temporary directory is
created using @ref{52e,,tempfile.mkdtemp()}.

If `quiet' is @code{False} and it is not possible to create or change
the CWD, an error is raised.  Otherwise, only a warning is raised
and the original CWD is used.
@end deffn

@geindex temp_dir() (in module test.support.os_helper)
@anchor{library/test test support os_helper temp_dir}@anchor{4a99}
@deffn {Function} test.support.os_helper.temp_dir (path=None, quiet=False)

A context manager that creates a temporary directory at `path' and
yields the directory.

If `path' is @code{None}, the temporary directory is created using
@ref{52e,,tempfile.mkdtemp()}.  If `quiet' is @code{False}, the context manager
raises an exception on error.  Otherwise, if `path' is specified and
cannot be created, only a warning is issued.
@end deffn

@geindex temp_umask() (in module test.support.os_helper)
@anchor{library/test test support os_helper temp_umask}@anchor{4a9a}
@deffn {Function} test.support.os_helper.temp_umask (umask)

A context manager that temporarily sets the process umask.
@end deffn

@geindex unlink() (in module test.support.os_helper)
@anchor{library/test test support os_helper unlink}@anchor{4a9b}
@deffn {Function} test.support.os_helper.unlink (filename)

Call @ref{1301,,os.unlink()} on `filename'.  As with @ref{4a94,,rmdir()},
on Windows platforms, this is
wrapped with a wait loop that checks for the existence of the file.
@end deffn

@node test support import_helper — Utilities for import tests,test support warnings_helper — Utilities for warnings tests,test support os_helper — Utilities for os tests,Development Tools
@anchor{library/test module-test support import_helper}@anchor{ec}@anchor{library/test test-support-import-helper-utilities-for-import-tests}@anchor{4a9c}
@subsection @code{test.support.import_helper} — Utilities for import tests


@geindex module; test.support.import_helper

The @code{test.support.import_helper} module provides support for import tests.


Added in version 3.10.


@geindex forget() (in module test.support.import_helper)
@anchor{library/test test support import_helper forget}@anchor{4a9d}
@deffn {Function} test.support.import_helper.forget (module_name)

Remove the module named `module_name' from @code{sys.modules} and delete any
byte-compiled files of the module.
@end deffn

@geindex import_fresh_module() (in module test.support.import_helper)
@anchor{library/test test support import_helper import_fresh_module}@anchor{1ca5}
@deffn {Function} test.support.import_helper.import_fresh_module (name, fresh=(), blocked=(), deprecated=False)

This function imports and returns a fresh copy of the named Python module
by removing the named module from @code{sys.modules} before doing the import.
Note that unlike @code{reload()}, the original module is not affected by
this operation.

`fresh' is an iterable of additional module names that are also removed
from the @code{sys.modules} cache before doing the import.

`blocked' is an iterable of module names that are replaced with @code{None}
in the module cache during the import to ensure that attempts to import
them raise @ref{65b,,ImportError}.

The named module and any modules named in the `fresh' and `blocked'
parameters are saved before starting the import and then reinserted into
@code{sys.modules} when the fresh import is complete.

Module and package deprecation messages are suppressed during this import
if `deprecated' is @code{True}.

This function will raise @ref{65b,,ImportError} if the named module cannot be
imported.

Example use:

@example
# Get copies of the warnings module for testing without affecting the
# version being used by the rest of the test suite. One copy uses the
# C implementation, the other is forced to use the pure Python fallback
# implementation
py_warnings = import_fresh_module('warnings', blocked=['_warnings'])
c_warnings = import_fresh_module('warnings', fresh=['_warnings'])
@end example


Added in version 3.1.

@end deffn

@geindex import_module() (in module test.support.import_helper)
@anchor{library/test test support import_helper import_module}@anchor{4a9e}
@deffn {Function} test.support.import_helper.import_module (name, deprecated=False, *, required_on=())

This function imports and returns the named module. Unlike a normal
import, this function raises @ref{11ea,,unittest.SkipTest} if the module
cannot be imported.

Module and package deprecation messages are suppressed during this import
if `deprecated' is @code{True}.  If a module is required on a platform but
optional for others, set `required_on' to an iterable of platform prefixes
which will be compared against @ref{293,,sys.platform}.


Added in version 3.1.

@end deffn

@geindex modules_setup() (in module test.support.import_helper)
@anchor{library/test test support import_helper modules_setup}@anchor{4a9f}
@deffn {Function} test.support.import_helper.modules_setup ()

Return a copy of @ref{1771,,sys.modules}.
@end deffn

@geindex modules_cleanup() (in module test.support.import_helper)
@anchor{library/test test support import_helper modules_cleanup}@anchor{4aa0}
@deffn {Function} test.support.import_helper.modules_cleanup (oldmodules)

Remove modules except for `oldmodules' and @code{encodings} in order to
preserve internal cache.
@end deffn

@geindex unload() (in module test.support.import_helper)
@anchor{library/test test support import_helper unload}@anchor{4aa1}
@deffn {Function} test.support.import_helper.unload (name)

Delete `name' from @code{sys.modules}.
@end deffn

@geindex make_legacy_pyc() (in module test.support.import_helper)
@anchor{library/test test support import_helper make_legacy_pyc}@anchor{4aa2}
@deffn {Function} test.support.import_helper.make_legacy_pyc (source)

Move a 
@geindex Python Enhancement Proposals; PEP 3147
PEP 3147@footnote{https://peps.python.org/pep-3147/}/
@geindex Python Enhancement Proposals; PEP 488
PEP 488@footnote{https://peps.python.org/pep-0488/} pyc file to its legacy pyc location and return the file
system path to the legacy pyc file.  The `source' value is the file system
path to the source file.  It does not need to exist, however the PEP
3147/488 pyc file must exist.
@end deffn

@geindex CleanImport (class in test.support.import_helper)
@anchor{library/test test support import_helper CleanImport}@anchor{4aa3}
@deffn {Class} test.support.import_helper.CleanImport (*module_names)

A context manager to force import to return a new module reference.  This
is useful for testing module-level behaviors, such as the emission of a
@ref{1a4,,DeprecationWarning} on import.  Example usage:

@example
with CleanImport('foo'):
    importlib.import_module('foo')  # New reference.
@end example
@end deffn

@geindex DirsOnSysPath (class in test.support.import_helper)
@anchor{library/test test support import_helper DirsOnSysPath}@anchor{4aa4}
@deffn {Class} test.support.import_helper.DirsOnSysPath (*paths)

A context manager to temporarily add directories to @ref{3e2,,sys.path}.

This makes a copy of @ref{3e2,,sys.path}, appends any directories given
as positional arguments, then reverts @code{sys.path} to the copied
settings when the context ends.

Note that `all' @ref{3e2,,sys.path} modifications in the body of the
context manager, including replacement of the object,
will be reverted at the end of the block.
@end deffn

@node test support warnings_helper — Utilities for warnings tests,,test support import_helper — Utilities for import tests,Development Tools
@anchor{library/test module-test support warnings_helper}@anchor{f1}@anchor{library/test test-support-warnings-helper-utilities-for-warnings-tests}@anchor{4aa5}
@subsection @code{test.support.warnings_helper} — Utilities for warnings tests


@geindex module; test.support.warnings_helper

The @code{test.support.warnings_helper} module provides support for warnings tests.


Added in version 3.10.


@geindex ignore_warnings() (in module test.support.warnings_helper)
@anchor{library/test test support warnings_helper ignore_warnings}@anchor{4aa6}
@deffn {Function} test.support.warnings_helper.ignore_warnings (*, category)

Suppress warnings that are instances of `category',
which must be @ref{275b,,Warning} or a subclass.
Roughly equivalent to @ref{17a,,warnings.catch_warnings()}
with @ref{8d2,,warnings.simplefilter('ignore'@comma{} category=category)}.
For example:

@example
@@warning_helper.ignore_warnings(category=DeprecationWarning)
def test_suppress_warning():
    # do something
@end example


Added in version 3.8.

@end deffn

@geindex check_no_resource_warning() (in module test.support.warnings_helper)
@anchor{library/test test support warnings_helper check_no_resource_warning}@anchor{4aa7}
@deffn {Function} test.support.warnings_helper.check_no_resource_warning (testcase)

Context manager to check that no @ref{54d,,ResourceWarning} was raised.  You
must remove the object which may emit @code{ResourceWarning} before the
end of the context manager.
@end deffn

@geindex check_syntax_warning() (in module test.support.warnings_helper)
@anchor{library/test test support warnings_helper check_syntax_warning}@anchor{4aa8}
@deffn {Function} test.support.warnings_helper.check_syntax_warning (testcase, statement, errtext='@w{'}, *, lineno=1, offset=None)

Test for syntax warning in `statement' by attempting to compile `statement'.
Test also that the @ref{1af,,SyntaxWarning} is emitted only once, and that it
will be converted to a @ref{18f,,SyntaxError} when turned into error.
`testcase' is the @ref{10d,,unittest} instance for the test.  `errtext' is the
regular expression which should match the string representation of the
emitted @code{SyntaxWarning} and raised @code{SyntaxError}.  If `lineno'
is not @code{None}, compares to the line of the warning and exception.
If `offset' is not @code{None}, compares to the offset of the exception.


Added in version 3.8.

@end deffn

@geindex check_warnings() (in module test.support.warnings_helper)
@anchor{library/test test support warnings_helper check_warnings}@anchor{4aa9}
@deffn {Function} test.support.warnings_helper.check_warnings (*filters, quiet=True)

A convenience wrapper for @ref{17a,,warnings.catch_warnings()} that makes it
easier to test that a warning was correctly raised.  It is approximately
equivalent to calling @code{warnings.catch_warnings(record=True)} with
@ref{8d2,,warnings.simplefilter()} set to @code{always} and with the option to
automatically validate the results that are recorded.

@code{check_warnings} accepts 2-tuples of the form @code{("message regexp",
WarningCategory)} as positional arguments. If one or more `filters' are
provided, or if the optional keyword argument `quiet' is @code{False},
it checks to make sure the warnings are as expected:  each specified filter
must match at least one of the warnings raised by the enclosed code or the
test fails, and if any warnings are raised that do not match any of the
specified filters the test fails.  To disable the first of these checks,
set `quiet' to @code{True}.

If no arguments are specified, it defaults to:

@example
check_warnings(("", Warning), quiet=True)
@end example

In this case all warnings are caught and no errors are raised.

On entry to the context manager, a @code{WarningRecorder} instance is
returned. The underlying warnings list from
@ref{17a,,catch_warnings()} is available via the recorder object’s
@ref{119,,warnings} attribute.  As a convenience, the attributes of the object
representing the most recent warning can also be accessed directly through
the recorder object (see example below).  If no warning has been raised,
then any of the attributes that would otherwise be expected on an object
representing a warning will return @code{None}.

The recorder object also has a @code{reset()} method, which clears the
warnings list.

The context manager is designed to be used like this:

@example
with check_warnings(("assertion is always true", SyntaxWarning),
                    ("", UserWarning)):
    exec('assert(False, "Hey!")')
    warnings.warn(UserWarning("Hide me!"))
@end example

In this case if either warning was not raised, or some other warning was
raised, @code{check_warnings()} would raise an error.

When a test needs to look more deeply into the warnings, rather than
just checking whether or not they occurred, code like this can be used:

@example
with check_warnings(quiet=True) as w:
    warnings.warn("foo")
    assert str(w.args[0]) == "foo"
    warnings.warn("bar")
    assert str(w.args[0]) == "bar"
    assert str(w.warnings[0].args[0]) == "foo"
    assert str(w.warnings[1].args[0]) == "bar"
    w.reset()
    assert len(w.warnings) == 0
@end example

Here all warnings will be caught, and the test code tests the captured
warnings directly.


Changed in version 3.2: New optional arguments `filters' and `quiet'.

@end deffn

@geindex WarningsRecorder (class in test.support.warnings_helper)
@anchor{library/test test support warnings_helper WarningsRecorder}@anchor{4aaa}
@deffn {Class} test.support.warnings_helper.WarningsRecorder

Class used to record warnings for unit tests. See documentation of
@ref{4aa9,,check_warnings()} above for more details.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Debugging and Profiling,Software Packaging and Distribution,Development Tools,The Python Standard Library
@anchor{library/debug doc}@anchor{4aab}@anchor{library/debug debugging-and-profiling}@anchor{4aac}@anchor{library/debug translation-repo}@anchor{4aad}
@section Debugging and Profiling


These libraries help you with Python development: the debugger enables you to
step through code, analyze stack frames and set breakpoints etc., and the
profilers run code and give you a detailed breakdown of execution times,
allowing you to identify bottlenecks in your programs. Auditing events
provide visibility into runtime behaviors that would otherwise require
intrusive debugging or patching.

@geindex audit events
@anchor{library/audit_events audit-events}@anchor{1c56}
@menu
* Audit events table:: 
* bdb — Debugger framework:: 
* faulthandler — Dump the Python traceback:: 
* pdb — The Python Debugger:: 
* The Python Profilers:: 
* timeit — Measure execution time of small code snippets:: 
* trace — Trace or track Python statement execution:: 
* tracemalloc — Trace memory allocations:: 

@end menu

@node Audit events table,bdb — Debugger framework,,Debugging and Profiling
@anchor{library/audit_events doc}@anchor{4aae}@anchor{library/audit_events audit-events-table}@anchor{4aaf}
@subsection Audit events table


This table contains all events raised by @ref{195f,,sys.audit()} or
@ref{613,,PySys_Audit()} calls throughout the CPython runtime and the
standard library.  These calls were added in 3.8 or later (see 
@geindex Python Enhancement Proposals; PEP 578
PEP 578@footnote{https://peps.python.org/pep-0578/}).

See @ref{4ab0,,sys.addaudithook()} and @ref{4ab1,,PySys_AddAuditHook()} for
information on handling these events.

`CPython implementation detail:' This table is generated from the CPython documentation, and may not
represent events raised by other implementations. See your runtime
specific documentation for actual events raised.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxx} 
@headitem

Audit event

@tab

Arguments

@tab

References

@item

_thread.start_new_thread

@tab

@code{function}, @code{args}, @code{kwargs}

@tab

@ref{4ab2,,[1]}

@item

array.__new__

@tab

@code{typecode}, @code{initializer}

@tab

@ref{4bf,,[1]}

@item

builtins.breakpoint

@tab

@code{breakpointhook}

@tab

@ref{273,,[1]}

@item

builtins.id

@tab

@code{id}

@tab

@ref{162f,,[1]}

@item

builtins.input

@tab

@code{prompt}

@tab

@ref{14e4,,[1]}

@item

builtins.input/result

@tab

@code{result}

@tab

@ref{14e4,,[1]}

@item

code.__new__

@tab

@code{code}, @code{filename}, @code{name}, @code{argcount}, @code{posonlyargcount}, @code{kwonlyargcount}, @code{nlocals}, @code{stacksize}, @code{flags}

@tab

@ref{32d,,[1]}

@item

compile

@tab

@code{source}, @code{filename}

@tab

@ref{4b2,,[1]}

@item

cpython.PyConfig_Set

@tab

@code{name}, @code{value}

@tab

@ref{37b,,[1]}

@item

cpython.PyInterpreterState_Clear

@tab



@tab

@ref{4ab3,,[1]}

@item

cpython.PyInterpreterState_New

@tab



@tab

@ref{4ab4,,[1]}

@item

cpython._PySys_ClearAuditHooks

@tab



@tab

@ref{f17,,[1]}

@item

cpython.remote_debugger_script

@tab

@code{script_path}

@tab

@ref{4ab5,,[1]}

@item

cpython.run_command

@tab

@code{command}

@tab

@ref{1a9,,[1]}

@item

cpython.run_file

@tab

@code{filename}

@tab

@ref{4ab6,,[1]}

@item

cpython.run_interactivehook

@tab

@code{hook}

@tab

@ref{11ce,,[1]}

@item

cpython.run_module

@tab

@code{module-name}

@tab

@ref{23e,,[1]}

@item

cpython.run_startup

@tab

@code{filename}

@tab

@ref{1ba,,[1]}

@item

cpython.run_stdin

@tab



@tab

@ref{4ab7,,[1]}@ref{4ab8,,[2]}@ref{4ab9,,[3]}

@item

ctypes.addressof

@tab

@code{obj}

@tab

@ref{33b0,,[1]}

@item

ctypes.call_function

@tab

@code{func_pointer}, @code{arguments}

@tab

@ref{33aa,,[1]}

@item

ctypes.cdata

@tab

@code{address}

@tab

@ref{33bb,,[1]}

@item

ctypes.cdata/buffer

@tab

@code{pointer}, @code{size}, @code{offset}

@tab

@ref{33c0,,[1]}@ref{33c1,,[2]}

@item

ctypes.create_string_buffer

@tab

@code{init}, @code{size}

@tab

@ref{3364,,[1]}

@item

ctypes.create_unicode_buffer

@tab

@code{init}, @code{size}

@tab

@ref{1df6,,[1]}

@item

ctypes.dlopen

@tab

@code{name}

@tab

@ref{33a7,,[1]}

@item

ctypes.dlsym

@tab

@code{library}, @code{name}

@tab

@ref{33a7,,[1]}

@item

ctypes.dlsym/handle

@tab

@code{handle}, @code{name}

@tab

@ref{33a7,,[1]}

@item

ctypes.get_errno

@tab



@tab

@ref{1762,,[1]}

@item

ctypes.get_last_error

@tab



@tab

@ref{33a1,,[1]}

@item

ctypes.memoryview_at

@tab

@code{address}, @code{size}, @code{readonly}

@tab

@ref{4aba,,[1]}

@item

ctypes.set_errno

@tab

@code{errno}

@tab

@ref{33a0,,[1]}

@item

ctypes.set_exception

@tab

@code{code}

@tab

@ref{33aa,,[1]}

@item

ctypes.set_last_error

@tab

@code{error}

@tab

@ref{33a2,,[1]}

@item

ctypes.string_at

@tab

@code{ptr}, @code{size}

@tab

@ref{1ee,,[1]}

@item

ctypes.wstring_at

@tab

@code{ptr}, @code{size}

@tab

@ref{33ba,,[1]}

@item

ensurepip.bootstrap

@tab

@code{root}

@tab

@ref{4abb,,[1]}

@item

exec

@tab

@code{code_object}

@tab

@ref{4a4,,[1]}@ref{4a3,,[2]}

@item

fcntl.fcntl

@tab

@code{fd}, @code{cmd}, @code{arg}

@tab

@ref{189a,,[1]}

@item

fcntl.flock

@tab

@code{fd}, @code{operation}

@tab

@ref{4abc,,[1]}

@item

fcntl.ioctl

@tab

@code{fd}, @code{request}, @code{arg}

@tab

@ref{1687,,[1]}

@item

fcntl.lockf

@tab

@code{fd}, @code{cmd}, @code{len}, @code{start}, @code{whence}

@tab

@ref{15f8,,[1]}

@item

ftplib.connect

@tab

@code{self}, @code{host}, @code{port}

@tab

@ref{407f,,[1]}

@item

ftplib.sendcmd

@tab

@code{self}, @code{cmd}

@tab

@ref{4084,,[1]}@ref{4085,,[2]}

@item

function.__new__

@tab

@code{code}

@tab

@ref{a89,,[1]}

@item

gc.get_objects

@tab

@code{generation}

@tab

@ref{a0a,,[1]}

@item

gc.get_referents

@tab

@code{objs}

@tab

@ref{a0c,,[1]}

@item

gc.get_referrers

@tab

@code{objs}

@tab

@ref{a0b,,[1]}

@item

glob.glob

@tab

@code{pathname}, @code{recursive}

@tab

@ref{5a0,,[1]}@ref{a0e,,[2]}

@item

glob.glob/2

@tab

@code{pathname}, @code{recursive}, @code{root_dir}, @code{dir_fd}

@tab

@ref{5a0,,[1]}@ref{a0e,,[2]}

@item

http.client.connect

@tab

@code{self}, @code{host}, @code{port}

@tab

@ref{4062,,[1]}

@item

http.client.send

@tab

@code{self}, @code{data}

@tab

@ref{4066,,[1]}

@item

imaplib.open

@tab

@code{self}, @code{host}, @code{port}

@tab

@ref{b07,,[1]}

@item

imaplib.send

@tab

@code{self}, @code{data}

@tab

@ref{40d6,,[1]}

@item

import

@tab

@code{module}, @code{filename}, @code{sys.path}, @code{sys.meta_path}, @code{sys.path_hooks}

@tab

@ref{7f9,,[1]}

@item

marshal.dumps

@tab

@code{value}, @code{version}

@tab

@ref{2db4,,[1]}

@item

marshal.load

@tab



@tab

@ref{1e39,,[1]}

@item

marshal.loads

@tab

@code{bytes}

@tab

@ref{1e39,,[1]}

@item

mmap.__new__

@tab

@code{fileno}, @code{length}, @code{access}, @code{offset}

@tab

@ref{51a,,[1]}

@item

msvcrt.get_osfhandle

@tab

@code{fd}

@tab

@ref{4abd,,[1]}

@item

msvcrt.locking

@tab

@code{fd}, @code{mode}, @code{nbytes}

@tab

@ref{4abe,,[1]}

@item

msvcrt.open_osfhandle

@tab

@code{handle}, @code{flags}

@tab

@ref{4abf,,[1]}

@item

object.__delattr__

@tab

@code{obj}, @code{name}

@tab

@ref{23c0,,[1]}

@item

object.__getattr__

@tab

@code{obj}, @code{name}

@tab

@ref{dd1,,[1]}

@item

object.__setattr__

@tab

@code{obj}, @code{name}, @code{value}

@tab

@ref{23bf,,[1]}

@item

open

@tab

@code{path}, @code{mode}, @code{flags}

@tab

@ref{318,,[1]}@ref{741,,[2]}@ref{f98,,[3]}

@item

os.add_dll_directory

@tab

@code{path}

@tab

@ref{be3,,[1]}

@item

os.chdir

@tab

@code{path}

@tab

@ref{822,,[1]}@ref{f8f,,[2]}

@item

os.chflags

@tab

@code{path}, @code{flags}

@tab

@ref{12f9,,[1]}@ref{30ea,,[2]}

@item

os.chmod

@tab

@code{path}, @code{mode}, @code{dir_fd}

@tab

@ref{52a,,[1]}@ref{52b,,[2]}@ref{529,,[3]}

@item

os.chown

@tab

@code{path}, @code{uid}, @code{gid}, @code{dir_fd}

@tab

@ref{12fa,,[1]}@ref{f90,,[2]}@ref{30eb,,[3]}

@item

os.exec

@tab

@code{path}, @code{args}, @code{env}

@tab

@ref{3124,,[1]}

@item

os.fork

@tab



@tab

@ref{4b6,,[1]}

@item

os.forkpty

@tab



@tab

@ref{4b7,,[1]}

@item

os.fwalk

@tab

@code{top}, @code{topdown}, @code{onerror}, @code{follow_symlinks}, @code{dir_fd}

@tab

@ref{d58,,[1]}

@item

os.getxattr

@tab

@code{path}, @code{attribute}

@tab

@ref{1310,,[1]}

@item

os.kill

@tab

@code{pid}, @code{sig}

@tab

@ref{1573,,[1]}

@item

os.killpg

@tab

@code{pgid}, @code{sig}

@tab

@ref{1dfd,,[1]}

@item

os.link

@tab

@code{src}, @code{dst}, @code{src_dir_fd}, @code{dst_dir_fd}

@tab

@ref{12fb,,[1]}

@item

os.listdir

@tab

@code{path}

@tab

@ref{1306,,[1]}

@item

os.listdrives

@tab



@tab

@ref{6c6,,[1]}

@item

os.listmounts

@tab

@code{volume}

@tab

@ref{6c8,,[1]}

@item

os.listvolumes

@tab



@tab

@ref{6c7,,[1]}

@item

os.listxattr

@tab

@code{path}

@tab

@ref{1311,,[1]}

@item

os.lockf

@tab

@code{fd}, @code{cmd}, @code{len}

@tab

@ref{131f,,[1]}

@item

os.mkdir

@tab

@code{path}, @code{mode}, @code{dir_fd}

@tab

@ref{52d,,[1]}@ref{52c,,[2]}

@item

os.posix_spawn

@tab

@code{path}, @code{argv}, @code{env}

@tab

@ref{52f,,[1]}@ref{17b6,,[2]}

@item

os.putenv

@tab

@code{key}, @code{value}

@tab

@ref{25d,,[1]}

@item

os.remove

@tab

@code{path}, @code{dir_fd}

@tab

@ref{12fc,,[1]}@ref{30ef,,[2]}@ref{1301,,[3]}

@item

os.removexattr

@tab

@code{path}, @code{attribute}

@tab

@ref{1312,,[1]}

@item

os.rename

@tab

@code{src}, @code{dst}, @code{src_dir_fd}, @code{dst_dir_fd}

@tab

@ref{12fd,,[1]}@ref{30f0,,[2]}@ref{12fe,,[3]}

@item

os.rmdir

@tab

@code{path}, @code{dir_fd}

@tab

@ref{12ff,,[1]}

@item

os.scandir

@tab

@code{path}

@tab

@ref{c5a,,[1]}

@item

os.setxattr

@tab

@code{path}, @code{attribute}, @code{value}, @code{flags}

@tab

@ref{1313,,[1]}

@item

os.spawn

@tab

@code{mode}, @code{path}, @code{args}, @code{env}

@tab

@ref{31d,,[1]}

@item

os.startfile

@tab

@code{path}, @code{operation}

@tab

@ref{1cc5,,[1]}

@item

os.startfile/2

@tab

@code{path}, @code{operation}, @code{arguments}, @code{cwd}, @code{show_cmd}

@tab

@ref{1cc5,,[1]}

@item

os.symlink

@tab

@code{src}, @code{dst}, @code{dir_fd}

@tab

@ref{1300,,[1]}

@item

os.system

@tab

@code{command}

@tab

@ref{1669,,[1]}

@item

os.truncate

@tab

@code{fd}, @code{length}

@tab

@ref{f95,,[1]}@ref{1042,,[2]}

@item

os.unsetenv

@tab

@code{key}

@tab

@ref{25e,,[1]}

@item

os.utime

@tab

@code{path}, @code{times}, @code{ns}, @code{dir_fd}

@tab

@ref{1302,,[1]}

@item

os.walk

@tab

@code{top}, @code{topdown}, @code{onerror}, @code{followlinks}

@tab

@ref{6d1,,[1]}

@item

pathlib.Path.glob

@tab

@code{self}, @code{pattern}

@tab

@ref{538,,[1]}

@item

pathlib.Path.rglob

@tab

@code{self}, @code{pattern}

@tab

@ref{539,,[1]}

@item

pdb.Pdb

@tab



@tab

@ref{275,,[1]}

@item

pickle.find_class

@tab

@code{module}, @code{name}

@tab

@ref{2d8a,,[1]}

@item

poplib.connect

@tab

@code{self}, @code{host}, @code{port}

@tab

@ref{b23,,[1]}@ref{b24,,[2]}

@item

poplib.putline

@tab

@code{self}, @code{line}

@tab

@ref{b23,,[1]}@ref{b24,,[2]}

@item

pty.spawn

@tab

@code{argv}

@tab

@ref{1188,,[1]}

@item

resource.prlimit

@tab

@code{pid}, @code{resource}, @code{limits}

@tab

@ref{1190,,[1]}

@item

resource.setrlimit

@tab

@code{resource}, @code{limits}

@tab

@ref{1815,,[1]}

@item

setopencodehook

@tab



@tab

@ref{1ae0,,[1]}

@item

shutil.chown

@tab

@code{path}, @code{user}, @code{group}

@tab

@ref{549,,[1]}

@item

shutil.copyfile

@tab

@code{src}, @code{dst}

@tab

@ref{c55,,[1]}@ref{c56,,[2]}@ref{c54,,[3]}

@item

shutil.copymode

@tab

@code{src}, @code{dst}

@tab

@ref{c55,,[1]}@ref{1a6b,,[2]}

@item

shutil.copystat

@tab

@code{src}, @code{dst}

@tab

@ref{c56,,[1]}@ref{133a,,[2]}

@item

shutil.copytree

@tab

@code{src}, @code{dst}

@tab

@ref{c24,,[1]}

@item

shutil.make_archive

@tab

@code{base_name}, @code{format}, @code{root_dir}, @code{base_dir}

@tab

@ref{6db,,[1]}

@item

shutil.move

@tab

@code{src}, @code{dst}

@tab

@ref{c57,,[1]}

@item

shutil.rmtree

@tab

@code{path}, @code{dir_fd}

@tab

@ref{354,,[1]}

@item

shutil.unpack_archive

@tab

@code{filename}, @code{extract_dir}, @code{format}

@tab

@ref{697,,[1]}

@item

signal.pthread_kill

@tab

@code{thread_id}, @code{signalnum}

@tab

@ref{133d,,[1]}

@item

smtplib.connect

@tab

@code{self}, @code{host}, @code{port}

@tab

@ref{179c,,[1]}

@item

smtplib.send

@tab

@code{self}, @code{data}

@tab

@ref{b2d,,[1]}

@item

socket.__new__

@tab

@code{self}, @code{family}, @code{type}, @code{protocol}

@tab

@ref{fa7,,[1]}

@item

socket.bind

@tab

@code{self}, @code{address}

@tab

@ref{1746,,[1]}

@item

socket.connect

@tab

@code{self}, @code{address}

@tab

@ref{fa9,,[1]}@ref{1745,,[2]}

@item

socket.getaddrinfo

@tab

@code{host}, @code{port}, @code{family}, @code{type}, @code{protocol}

@tab

@ref{17a8,,[1]}

@item

socket.gethostbyaddr

@tab

@code{ip_address}

@tab

@ref{1cc6,,[1]}

@item

socket.gethostbyname

@tab

@code{hostname}

@tab

@ref{3a1a,,[1]}@ref{1cc7,,[2]}

@item

socket.gethostname

@tab



@tab

@ref{3096,,[1]}

@item

socket.getnameinfo

@tab

@code{sockaddr}

@tab

@ref{1a81,,[1]}

@item

socket.getservbyname

@tab

@code{servicename}, @code{protocolname}

@tab

@ref{3a1c,,[1]}

@item

socket.getservbyport

@tab

@code{port}, @code{protocolname}

@tab

@ref{3a1d,,[1]}

@item

socket.sendmsg

@tab

@code{self}, @code{address}

@tab

@ref{6a2,,[1]}

@item

socket.sendto

@tab

@code{self}, @code{address}

@tab

@ref{faf,,[1]}

@item

socket.sethostname

@tab

@code{name}

@tab

@ref{1347,,[1]}

@item

sqlite3.connect

@tab

@code{database}

@tab

@ref{5a6,,[1]}

@item

sqlite3.connect/handle

@tab

@code{connection_handle}

@tab

@ref{5a6,,[1]}

@item

sqlite3.enable_load_extension

@tab

@code{connection}, @code{enabled}

@tab

@ref{a45,,[1]}

@item

sqlite3.load_extension

@tab

@code{connection}, @code{path}

@tab

@ref{6e0,,[1]}

@item

subprocess.Popen

@tab

@code{executable}, @code{args}, @code{cwd}, @code{env}

@tab

@ref{4b8,,[1]}

@item

sys._current_exceptions

@tab



@tab

@ref{6ea,,[1]}

@item

sys._current_frames

@tab



@tab

@ref{163f,,[1]}

@item

sys._getframe

@tab

@code{frame}

@tab

@ref{8f2,,[1]}

@item

sys._getframemodulename

@tab

@code{depth}

@tab

@ref{1b23,,[1]}

@item

sys.addaudithook

@tab



@tab

@ref{4ab1,,[1]}@ref{4ab0,,[2]}

@item

sys.excepthook

@tab

@code{hook}, @code{type}, @code{value}, @code{traceback}

@tab

@ref{a12,,[1]}

@item

sys.monitoring.register_callback

@tab

@code{func}

@tab

@ref{4ac0,,[1]}

@item

sys.remote_exec

@tab

@code{pid}

@tab

@ref{4ac1,,[1]}

@item

sys.set_asyncgen_hooks_finalizer

@tab



@tab

@ref{19e0,,[1]}

@item

sys.set_asyncgen_hooks_firstiter

@tab



@tab

@ref{19e0,,[1]}

@item

sys.setprofile

@tab



@tab

@ref{170a,,[1]}

@item

sys.settrace

@tab



@tab

@ref{2e3,,[1]}

@item

sys.unraisablehook

@tab

@code{hook}, @code{unraisable}

@tab

@ref{508,,[1]}

@item

syslog.closelog

@tab



@tab

@ref{762,,[1]}

@item

syslog.openlog

@tab

@code{ident}, @code{logoption}, @code{facility}

@tab

@ref{761,,[1]}

@item

syslog.setlogmask

@tab

@code{maskpri}

@tab

@ref{4ac2,,[1]}

@item

syslog.syslog

@tab

@code{priority}, @code{message}

@tab

@ref{763,,[1]}

@item

tempfile.mkdtemp

@tab

@code{fullpath}

@tab

@ref{1440,,[1]}@ref{52e,,[2]}

@item

tempfile.mkstemp

@tab

@code{fullpath}

@tab

@ref{6ee,,[1]}@ref{2d3a,,[2]}@ref{2d3b,,[3]}

@item

time.sleep

@tab

@code{secs}

@tab

@ref{4ac3,,[1]}

@item

urllib.Request

@tab

@code{fullurl}, @code{data}, @code{headers}, @code{method}

@tab

@ref{309,,[1]}

@item

webbrowser.open

@tab

@code{url}

@tab

@ref{17a6,,[1]}

@item

winreg.ConnectRegistry

@tab

@code{computer_name}, @code{key}

@tab

@ref{4ac4,,[1]}

@item

winreg.CreateKey

@tab

@code{key}, @code{sub_key}, @code{access}

@tab

@ref{4ac5,,[1]}@ref{156e,,[2]}

@item

winreg.DeleteKey

@tab

@code{key}, @code{sub_key}, @code{access}

@tab

@ref{4ac6,,[1]}@ref{156f,,[2]}

@item

winreg.DeleteValue

@tab

@code{key}, @code{value}

@tab

@ref{4ac7,,[1]}

@item

winreg.DisableReflectionKey

@tab

@code{key}

@tab

@ref{1570,,[1]}

@item

winreg.EnableReflectionKey

@tab

@code{key}

@tab

@ref{1571,,[1]}

@item

winreg.EnumKey

@tab

@code{key}, @code{index}

@tab

@ref{4ac8,,[1]}

@item

winreg.EnumValue

@tab

@code{key}, @code{index}

@tab

@ref{4ac9,,[1]}

@item

winreg.ExpandEnvironmentStrings

@tab

@code{str}

@tab

@ref{1604,,[1]}

@item

winreg.LoadKey

@tab

@code{key}, @code{sub_key}, @code{file_name}

@tab

@ref{4aca,,[1]}

@item

winreg.OpenKey

@tab

@code{key}, @code{sub_key}, @code{access}

@tab

@ref{4acb,,[1]}

@item

winreg.OpenKey/result

@tab

@code{key}

@tab

@ref{4ac5,,[1]}@ref{156e,,[2]}@ref{4acb,,[3]}

@item

winreg.PyHKEY.Detach

@tab

@code{key}

@tab

@ref{4acc,,[1]}

@item

winreg.QueryInfoKey

@tab

@code{key}

@tab

@ref{4acd,,[1]}

@item

winreg.QueryReflectionKey

@tab

@code{key}

@tab

@ref{1572,,[1]}

@item

winreg.QueryValue

@tab

@code{key}, @code{sub_key}, @code{value_name}

@tab

@ref{4ace,,[1]}@ref{17d5,,[2]}

@item

winreg.SaveKey

@tab

@code{key}, @code{file_name}

@tab

@ref{4acf,,[1]}

@item

winreg.SetValue

@tab

@code{key}, @code{sub_key}, @code{type}, @code{value}

@tab

@ref{4ad0,,[1]}@ref{1b47,,[2]}

@end multitable


The following events are raised internally and do not correspond to any
public API of CPython:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Audit event

@tab

Arguments

@item

_winapi.CreateFile

@tab

@code{file_name}, @code{desired_access},
@code{share_mode}, @code{creation_disposition},
@code{flags_and_attributes}

@item

_winapi.CreateJunction

@tab

@code{src_path}, @code{dst_path}

@item

_winapi.CreateNamedPipe

@tab

@code{name}, @code{open_mode}, @code{pipe_mode}

@item

_winapi.CreatePipe

@tab

@item

_winapi.CreateProcess

@tab

@code{application_name}, @code{command_line},
@code{current_directory}

@item

_winapi.OpenProcess

@tab

@code{process_id}, @code{desired_access}

@item

_winapi.TerminateProcess

@tab

@code{handle}, @code{exit_code}

@item

_posixsubprocess.fork_exec

@tab

@code{exec_list}, @code{args}, @code{env}

@item

ctypes.PyObj_FromPtr

@tab

@code{obj}

@end multitable



Added in version 3.14: The @code{_posixsubprocess.fork_exec} internal audit event.


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node bdb — Debugger framework,faulthandler — Dump the Python traceback,Audit events table,Debugging and Profiling
@anchor{library/bdb doc}@anchor{4ad1}@anchor{library/bdb bdb-debugger-framework}@anchor{4ad2}@anchor{library/bdb module-bdb}@anchor{10}@anchor{library/bdb translation-repo}@anchor{4ad3}
@subsection @code{bdb} — Debugger framework


@geindex module; bdb

`Source code:' Lib/bdb.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/bdb.py}


__________________________________________________________________


The @code{bdb} module handles basic debugger functions, like setting breakpoints
or managing execution via the debugger.

The following exception is defined:

@geindex BdbQuit
@anchor{library/bdb bdb BdbQuit}@anchor{27a}
@deffn {Exception} bdb.BdbQuit

Exception raised by the @ref{2d7,,Bdb} class for quitting the debugger.
@end deffn

The @code{bdb} module also defines two classes:

@geindex Breakpoint (class in bdb)
@anchor{library/bdb bdb Breakpoint}@anchor{4ad4}
@deffn {Class} bdb.Breakpoint (self, file, line, temporary=False, cond=None, funcname=None)

This class implements temporary breakpoints, ignore counts, disabling and
(re-)enabling, and conditionals.

Breakpoints are indexed by number through a list called @ref{4ad5,,bpbynumber}
and by @code{(file, line)} pairs through @ref{4ad6,,bplist}.  The former points to
a single instance of class @code{Breakpoint}.  The latter points to a list
of such instances since there may be more than one breakpoint per line.

When creating a breakpoint, its associated @ref{4ad7,,file name} should
be in canonical form.  If a @ref{4ad8,,funcname} is defined, a breakpoint
@ref{4ad9,,hit} will be counted when the first line of that function is
executed.  A @ref{4ada,,conditional} breakpoint always counts a
@code{hit}.

@code{Breakpoint} instances have the following methods:

@geindex deleteMe() (bdb.Breakpoint method)
@anchor{library/bdb bdb Breakpoint deleteMe}@anchor{4adb}
@deffn {Method} deleteMe ()

Delete the breakpoint from the list associated to a file/line.  If it is
the last breakpoint in that position, it also deletes the entry for the
file/line.
@end deffn

@geindex enable() (bdb.Breakpoint method)
@anchor{library/bdb bdb Breakpoint enable}@anchor{4adc}
@deffn {Method} enable ()

Mark the breakpoint as enabled.
@end deffn

@geindex disable() (bdb.Breakpoint method)
@anchor{library/bdb bdb Breakpoint disable}@anchor{4add}
@deffn {Method} disable ()

Mark the breakpoint as disabled.
@end deffn

@geindex bpformat() (bdb.Breakpoint method)
@anchor{library/bdb bdb Breakpoint bpformat}@anchor{4ade}
@deffn {Method} bpformat ()

Return a string with all the information about the breakpoint, nicely
formatted:


@itemize *

@item 
Breakpoint number.

@item 
Temporary status (del or keep).

@item 
File/line position.

@item 
Break condition.

@item 
Number of times to ignore.

@item 
Number of times hit.
@end itemize


Added in version 3.2.

@end deffn

@geindex bpprint() (bdb.Breakpoint method)
@anchor{library/bdb bdb Breakpoint bpprint}@anchor{4adf}
@deffn {Method} bpprint (out=None)

Print the output of @ref{4ade,,bpformat()} to the file `out', or if it is
@code{None}, to standard output.
@end deffn

@code{Breakpoint} instances have the following attributes:

@geindex file (bdb.Breakpoint attribute)
@anchor{library/bdb bdb Breakpoint file}@anchor{4ad7}
@deffn {Attribute} file

File name of the @code{Breakpoint}.
@end deffn

@geindex line (bdb.Breakpoint attribute)
@anchor{library/bdb bdb Breakpoint line}@anchor{4ae0}
@deffn {Attribute} line

Line number of the @code{Breakpoint} within @ref{4ad7,,file}.
@end deffn

@geindex temporary (bdb.Breakpoint attribute)
@anchor{library/bdb bdb Breakpoint temporary}@anchor{4ae1}
@deffn {Attribute} temporary

@code{True} if a @code{Breakpoint} at (file, line) is temporary.
@end deffn

@geindex cond (bdb.Breakpoint attribute)
@anchor{library/bdb bdb Breakpoint cond}@anchor{4ada}
@deffn {Attribute} cond

Condition for evaluating a @code{Breakpoint} at (file, line).
@end deffn

@geindex funcname (bdb.Breakpoint attribute)
@anchor{library/bdb bdb Breakpoint funcname}@anchor{4ad8}
@deffn {Attribute} funcname

Function name that defines whether a @code{Breakpoint} is hit upon
entering the function.
@end deffn

@geindex enabled (bdb.Breakpoint attribute)
@anchor{library/bdb bdb Breakpoint enabled}@anchor{4ae2}
@deffn {Attribute} enabled

@code{True} if @code{Breakpoint} is enabled.
@end deffn

@geindex bpbynumber (bdb.Breakpoint attribute)
@anchor{library/bdb bdb Breakpoint bpbynumber}@anchor{4ad5}
@deffn {Attribute} bpbynumber

Numeric index for a single instance of a @code{Breakpoint}.
@end deffn

@geindex bplist (bdb.Breakpoint attribute)
@anchor{library/bdb bdb Breakpoint bplist}@anchor{4ad6}
@deffn {Attribute} bplist

Dictionary of @code{Breakpoint} instances indexed by
(@ref{4ad7,,file}, @ref{4ae0,,line}) tuples.
@end deffn

@geindex ignore (bdb.Breakpoint attribute)
@anchor{library/bdb bdb Breakpoint ignore}@anchor{4ae3}
@deffn {Attribute} ignore

Number of times to ignore a @code{Breakpoint}.
@end deffn

@geindex hits (bdb.Breakpoint attribute)
@anchor{library/bdb bdb Breakpoint hits}@anchor{4ad9}
@deffn {Attribute} hits

Count of the number of times a @code{Breakpoint} has been hit.
@end deffn
@end deffn

@geindex Bdb (class in bdb)
@anchor{library/bdb bdb Bdb}@anchor{2d7}
@deffn {Class} bdb.Bdb (skip=None, backend='settrace')

The @code{Bdb} class acts as a generic Python debugger base class.

This class takes care of the details of the trace facility; a derived class
should implement user interaction.  The standard debugger class
(@ref{275,,pdb.Pdb}) is an example.

The `skip' argument, if given, must be an iterable of glob-style
module name patterns.  The debugger will not step into frames that
originate in a module that matches one of these patterns. Whether a
frame is considered to originate in a certain module is determined
by the @code{__name__} in the frame globals.

The `backend' argument specifies the backend to use for @code{Bdb}. It
can be either @code{'settrace'} or @code{'monitoring'}. @code{'settrace'} uses
@ref{2e3,,sys.settrace()} which has the best backward compatibility. The
@code{'monitoring'} backend uses the new @ref{e0,,sys.monitoring} that was
introduced in Python 3.12, which can be much more efficient because it
can disable unused events. We are trying to keep the exact interfaces
for both backends, but there are some differences. The debugger developers
are encouraged to use the @code{'monitoring'} backend to achieve better
performance.


Changed in version 3.1: Added the `skip' parameter.



Changed in version 3.14: Added the `backend' parameter.


The following methods of @code{Bdb} normally don’t need to be overridden.

@geindex canonic() (bdb.Bdb method)
@anchor{library/bdb bdb Bdb canonic}@anchor{4ae4}
@deffn {Method} canonic (filename)

Return canonical form of `filename'.

For real file names, the canonical form is an operating-system-dependent,
@ref{2cc7,,case-normalized} @ref{1526,,absolute path}. A `filename' with angle brackets, such as @code{"<stdin>"}
generated in interactive mode, is returned unchanged.
@end deffn

@geindex start_trace() (bdb.Bdb method)
@anchor{library/bdb bdb Bdb start_trace}@anchor{4ae5}
@deffn {Method} start_trace (self)

Start tracing. For @code{'settrace'} backend, this method is equivalent to
@code{sys.settrace(self.trace_dispatch)}


Added in version 3.14.

@end deffn

@geindex stop_trace() (bdb.Bdb method)
@anchor{library/bdb bdb Bdb stop_trace}@anchor{4ae6}
@deffn {Method} stop_trace (self)

Stop tracing. For @code{'settrace'} backend, this method is equivalent to
@code{sys.settrace(None)}


Added in version 3.14.

@end deffn

@geindex reset() (bdb.Bdb method)
@anchor{library/bdb bdb Bdb reset}@anchor{4ae7}
@deffn {Method} reset ()

Set the @code{botframe}, @code{stopframe}, @code{returnframe} and
@ref{4ae8,,quitting} attributes with values ready to start debugging.
@end deffn

@geindex trace_dispatch() (bdb.Bdb method)
@anchor{library/bdb bdb Bdb trace_dispatch}@anchor{4ae9}
@deffn {Method} trace_dispatch (frame, event, arg)

This function is installed as the trace function of debugged frames.  Its
return value is the new trace function (in most cases, that is, itself).

The default implementation decides how to dispatch a frame, depending on
the type of event (passed as a string) that is about to be executed.
`event' can be one of the following:


@itemize *

@item 
@code{"line"}: A new line of code is going to be executed.

@item 
@code{"call"}: A function is about to be called, or another code block
entered.

@item 
@code{"return"}: A function or other code block is about to return.

@item 
@code{"exception"}: An exception has occurred.

@item 
@code{"c_call"}: A C function is about to be called.

@item 
@code{"c_return"}: A C function has returned.

@item 
@code{"c_exception"}: A C function has raised an exception.
@end itemize

For the Python events, specialized functions (see below) are called.  For
the C events, no action is taken.

The `arg' parameter depends on the previous event.

See the documentation for @ref{2e3,,sys.settrace()} for more information on the
trace function.  For more information on code and frame objects, refer to
@ref{2373,,The standard type hierarchy}.
@end deffn

@geindex dispatch_line() (bdb.Bdb method)
@anchor{library/bdb bdb Bdb dispatch_line}@anchor{4aea}
@deffn {Method} dispatch_line (frame)

If the debugger should stop on the current line, invoke the
@ref{4aeb,,user_line()} method (which should be overridden in subclasses).
Raise a @ref{27a,,BdbQuit} exception if the @ref{4ae8,,quitting} flag is set
(which can be set from @code{user_line()}).  Return a reference to the
@ref{4ae9,,trace_dispatch()} method for further tracing in that scope.
@end deffn

@geindex dispatch_call() (bdb.Bdb method)
@anchor{library/bdb bdb Bdb dispatch_call}@anchor{4aec}
@deffn {Method} dispatch_call (frame, arg)

If the debugger should stop on this function call, invoke the
@ref{4aed,,user_call()} method (which should be overridden in subclasses).
Raise a @ref{27a,,BdbQuit} exception if the @ref{4ae8,,quitting} flag is set
(which can be set from @code{user_call()}).  Return a reference to the
@ref{4ae9,,trace_dispatch()} method for further tracing in that scope.
@end deffn

@geindex dispatch_return() (bdb.Bdb method)
@anchor{library/bdb bdb Bdb dispatch_return}@anchor{4aee}
@deffn {Method} dispatch_return (frame, arg)

If the debugger should stop on this function return, invoke the
@ref{4aef,,user_return()} method (which should be overridden in subclasses).
Raise a @ref{27a,,BdbQuit} exception if the @ref{4ae8,,quitting} flag is set
(which can be set from @code{user_return()}).  Return a reference to the
@ref{4ae9,,trace_dispatch()} method for further tracing in that scope.
@end deffn

@geindex dispatch_exception() (bdb.Bdb method)
@anchor{library/bdb bdb Bdb dispatch_exception}@anchor{4af0}
@deffn {Method} dispatch_exception (frame, arg)

If the debugger should stop at this exception, invokes the
@ref{4af1,,user_exception()} method (which should be overridden in subclasses).
Raise a @ref{27a,,BdbQuit} exception if the @ref{4ae8,,quitting} flag is set
(which can be set from @code{user_exception()}).  Return a reference to the
@ref{4ae9,,trace_dispatch()} method for further tracing in that scope.
@end deffn

Normally derived classes don’t override the following methods, but they may
if they want to redefine the definition of stopping and breakpoints.

@geindex is_skipped_module() (bdb.Bdb method)
@anchor{library/bdb bdb Bdb is_skipped_module}@anchor{4af2}
@deffn {Method} is_skipped_module (module_name)

Return @code{True} if `module_name' matches any skip pattern.
@end deffn

@geindex stop_here() (bdb.Bdb method)
@anchor{library/bdb bdb Bdb stop_here}@anchor{4af3}
@deffn {Method} stop_here (frame)

Return @code{True} if `frame' is below the starting frame in the stack.
@end deffn

@geindex break_here() (bdb.Bdb method)
@anchor{library/bdb bdb Bdb break_here}@anchor{4af4}
@deffn {Method} break_here (frame)

Return @code{True} if there is an effective breakpoint for this line.

Check whether a line or function breakpoint exists and is in effect.  Delete temporary
breakpoints based on information from @ref{4af5,,effective()}.
@end deffn

@geindex break_anywhere() (bdb.Bdb method)
@anchor{library/bdb bdb Bdb break_anywhere}@anchor{4af6}
@deffn {Method} break_anywhere (frame)

Return @code{True} if any breakpoint exists for `frame'’s filename.
@end deffn

Derived classes should override these methods to gain control over debugger
operation.

@geindex user_call() (bdb.Bdb method)
@anchor{library/bdb bdb Bdb user_call}@anchor{4aed}
@deffn {Method} user_call (frame, argument_list)

Called from @ref{4aec,,dispatch_call()} if a break might stop inside the
called function.

`argument_list' is not used anymore and will always be @code{None}.
The argument is kept for backwards compatibility.
@end deffn

@geindex user_line() (bdb.Bdb method)
@anchor{library/bdb bdb Bdb user_line}@anchor{4aeb}
@deffn {Method} user_line (frame)

Called from @ref{4aea,,dispatch_line()} when either @ref{4af3,,stop_here()} or
@ref{4af4,,break_here()} returns @code{True}.
@end deffn

@geindex user_return() (bdb.Bdb method)
@anchor{library/bdb bdb Bdb user_return}@anchor{4aef}
@deffn {Method} user_return (frame, return_value)

Called from @ref{4aee,,dispatch_return()} when @ref{4af3,,stop_here()} returns @code{True}.
@end deffn

@geindex user_exception() (bdb.Bdb method)
@anchor{library/bdb bdb Bdb user_exception}@anchor{4af1}
@deffn {Method} user_exception (frame, exc_info)

Called from @ref{4af0,,dispatch_exception()} when @ref{4af3,,stop_here()}
returns @code{True}.
@end deffn

@geindex do_clear() (bdb.Bdb method)
@anchor{library/bdb bdb Bdb do_clear}@anchor{4af7}
@deffn {Method} do_clear (arg)

Handle how a breakpoint must be removed when it is a temporary one.

This method must be implemented by derived classes.
@end deffn

Derived classes and clients can call the following methods to affect the
stepping state.

@geindex set_step() (bdb.Bdb method)
@anchor{library/bdb bdb Bdb set_step}@anchor{4af8}
@deffn {Method} set_step ()

Stop after one line of code.
@end deffn

@geindex set_next() (bdb.Bdb method)
@anchor{library/bdb bdb Bdb set_next}@anchor{4af9}
@deffn {Method} set_next (frame)

Stop on the next line in or below the given frame.
@end deffn

@geindex set_return() (bdb.Bdb method)
@anchor{library/bdb bdb Bdb set_return}@anchor{4afa}
@deffn {Method} set_return (frame)

Stop when returning from the given frame.
@end deffn

@geindex set_until() (bdb.Bdb method)
@anchor{library/bdb bdb Bdb set_until}@anchor{4afb}
@deffn {Method} set_until (frame, lineno=None)

Stop when the line with the `lineno' greater than the current one is
reached or when returning from current frame.
@end deffn

@geindex set_trace() (bdb.Bdb method)
@anchor{library/bdb bdb Bdb set_trace}@anchor{4afc}
@deffn {Method} set_trace ([frame])

Start debugging from `frame'.  If `frame' is not specified, debugging
starts from caller’s frame.


Changed in version 3.13: @ref{4afd,,set_trace()} will enter the debugger immediately, rather than
on the next line of code to be executed.

@end deffn

@geindex set_continue() (bdb.Bdb method)
@anchor{library/bdb bdb Bdb set_continue}@anchor{4afe}
@deffn {Method} set_continue ()

Stop only at breakpoints or when finished.  If there are no breakpoints,
set the system trace function to @code{None}.
@end deffn

@geindex set_quit() (bdb.Bdb method)
@anchor{library/bdb bdb Bdb set_quit}@anchor{4ae8}
@deffn {Method} set_quit ()

@geindex quitting (bdb.Bdb attribute)

Set the @code{quitting} attribute to @code{True}.  This raises @ref{27a,,BdbQuit} in
the next call to one of the @code{dispatch_*()} methods.
@end deffn

Derived classes and clients can call the following methods to manipulate
breakpoints.  These methods return a string containing an error message if
something went wrong, or @code{None} if all is well.

@geindex set_break() (bdb.Bdb method)
@anchor{library/bdb bdb Bdb set_break}@anchor{4aff}
@deffn {Method} set_break (filename, lineno, temporary=False, cond=None, funcname=None)

Set a new breakpoint.  If the `lineno' line doesn’t exist for the
`filename' passed as argument, return an error message.  The `filename'
should be in canonical form, as described in the @ref{4ae4,,canonic()} method.
@end deffn

@geindex clear_break() (bdb.Bdb method)
@anchor{library/bdb bdb Bdb clear_break}@anchor{4b00}
@deffn {Method} clear_break (filename, lineno)

Delete the breakpoints in `filename' and `lineno'.  If none were set,
return an error message.
@end deffn

@geindex clear_bpbynumber() (bdb.Bdb method)
@anchor{library/bdb bdb Bdb clear_bpbynumber}@anchor{4b01}
@deffn {Method} clear_bpbynumber (arg)

Delete the breakpoint which has the index `arg' in the
@ref{4ad5,,Breakpoint.bpbynumber}.  If `arg' is not numeric or out of range,
return an error message.
@end deffn

@geindex clear_all_file_breaks() (bdb.Bdb method)
@anchor{library/bdb bdb Bdb clear_all_file_breaks}@anchor{4b02}
@deffn {Method} clear_all_file_breaks (filename)

Delete all breakpoints in `filename'.  If none were set, return an error
message.
@end deffn

@geindex clear_all_breaks() (bdb.Bdb method)
@anchor{library/bdb bdb Bdb clear_all_breaks}@anchor{4b03}
@deffn {Method} clear_all_breaks ()

Delete all existing breakpoints.  If none were set, return an error
message.
@end deffn

@geindex get_bpbynumber() (bdb.Bdb method)
@anchor{library/bdb bdb Bdb get_bpbynumber}@anchor{4b04}
@deffn {Method} get_bpbynumber (arg)

Return a breakpoint specified by the given number.  If `arg' is a string,
it will be converted to a number.  If `arg' is a non-numeric string, if
the given breakpoint never existed or has been deleted, a
@ref{2ee,,ValueError} is raised.


Added in version 3.2.

@end deffn

@geindex get_break() (bdb.Bdb method)
@anchor{library/bdb bdb Bdb get_break}@anchor{4b05}
@deffn {Method} get_break (filename, lineno)

Return @code{True} if there is a breakpoint for `lineno' in `filename'.
@end deffn

@geindex get_breaks() (bdb.Bdb method)
@anchor{library/bdb bdb Bdb get_breaks}@anchor{4b06}
@deffn {Method} get_breaks (filename, lineno)

Return all breakpoints for `lineno' in `filename', or an empty list if
none are set.
@end deffn

@geindex get_file_breaks() (bdb.Bdb method)
@anchor{library/bdb bdb Bdb get_file_breaks}@anchor{4b07}
@deffn {Method} get_file_breaks (filename)

Return all breakpoints in `filename', or an empty list if none are set.
@end deffn

@geindex get_all_breaks() (bdb.Bdb method)
@anchor{library/bdb bdb Bdb get_all_breaks}@anchor{4b08}
@deffn {Method} get_all_breaks ()

Return all breakpoints that are set.
@end deffn

Derived classes and clients can call the following methods to disable and
restart events to achieve better performance. These methods only work
when using the @code{'monitoring'} backend.

@geindex disable_current_event() (bdb.Bdb method)
@anchor{library/bdb bdb Bdb disable_current_event}@anchor{4b09}
@deffn {Method} disable_current_event ()

Disable the current event until the next time @ref{4b0a,,restart_events()} is
called. This is helpful when the debugger is not interested in the current
line.


Added in version 3.14.

@end deffn

@geindex restart_events() (bdb.Bdb method)
@anchor{library/bdb bdb Bdb restart_events}@anchor{4b0a}
@deffn {Method} restart_events ()

Restart all the disabled events. This function is automatically called in
@code{dispatch_*} methods after @code{user_*} methods are called. If the
@code{dispatch_*} methods are not overridden, the disabled events will be
restarted after each user interaction.


Added in version 3.14.

@end deffn

Derived classes and clients can call the following methods to get a data
structure representing a stack trace.

@geindex get_stack() (bdb.Bdb method)
@anchor{library/bdb bdb Bdb get_stack}@anchor{4b0b}
@deffn {Method} get_stack (f, t)

Return a list of (frame, lineno) tuples in a stack trace, and a size.

The most recently called frame is last in the list. The size is the number
of frames below the frame where the debugger was invoked.
@end deffn

@geindex format_stack_entry() (bdb.Bdb method)
@anchor{library/bdb bdb Bdb format_stack_entry}@anchor{4b0c}
@deffn {Method} format_stack_entry (frame_lineno, lprefix=': ')

Return a string with information about a stack entry, which is a
@code{(frame, lineno)} tuple.  The return string contains:


@itemize *

@item 
The canonical filename which contains the frame.

@item 
The function name or @code{"<lambda>"}.

@item 
The input arguments.

@item 
The return value.

@item 
The line of code (if it exists).
@end itemize
@end deffn

The following two methods can be called by clients to use a debugger to debug
a @ref{2c6d,,statement}, given as a string.

@geindex run() (bdb.Bdb method)
@anchor{library/bdb bdb Bdb run}@anchor{4b0d}
@deffn {Method} run (cmd, globals=None, locals=None)

Debug a statement executed via the @ref{4a3,,exec()} function.  `globals'
defaults to @code{__main__.__dict__}, `locals' defaults to `globals'.
@end deffn

@geindex runeval() (bdb.Bdb method)
@anchor{library/bdb bdb Bdb runeval}@anchor{4b0e}
@deffn {Method} runeval (expr, globals=None, locals=None)

Debug an expression executed via the @ref{4a4,,eval()} function.  `globals' and
`locals' have the same meaning as in @ref{4b0d,,run()}.
@end deffn

@geindex runctx() (bdb.Bdb method)
@anchor{library/bdb bdb Bdb runctx}@anchor{4b0f}
@deffn {Method} runctx (cmd, globals, locals)

For backwards compatibility.  Calls the @ref{4b0d,,run()} method.
@end deffn

@geindex runcall() (bdb.Bdb method)
@anchor{library/bdb bdb Bdb runcall}@anchor{c77}
@deffn {Method} runcall (func, /, *args, **kwds)

Debug a single function call, and return its result.
@end deffn
@end deffn

Finally, the module defines the following functions:

@geindex checkfuncname() (in module bdb)
@anchor{library/bdb bdb checkfuncname}@anchor{4b10}
@deffn {Function} bdb.checkfuncname (b, frame)

Return @code{True} if we should break here, depending on the way the
@ref{4ad4,,Breakpoint} `b' was set.

If it was set via line number, it checks if
@ref{4ae0,,b.line} is the same as the one in `frame'.
If the breakpoint was set via
@ref{4ad8,,function name}, we have to check we are in
the right `frame' (the right function) and if we are on its first executable
line.
@end deffn

@geindex effective() (in module bdb)
@anchor{library/bdb bdb effective}@anchor{4af5}
@deffn {Function} bdb.effective (file, line, frame)

Return @code{(active breakpoint, delete temporary flag)} or @code{(None, None)} as the
breakpoint to act upon.

The `active breakpoint' is the first entry in
@ref{4ad6,,bplist} for the
(@ref{4ad7,,file}, @ref{4ae0,,line})
(which must exist) that is @ref{4ae2,,enabled}, for
which @ref{4b10,,checkfuncname()} is true, and that has neither a false
@ref{4ada,,condition} nor positive
@ref{4ae3,,ignore} count.  The `flag', meaning that a
temporary breakpoint should be deleted, is @code{False} only when the
@code{cond} cannot be evaluated (in which case,
@code{ignore} count is ignored).

If no such entry exists, then @code{(None, None)} is returned.
@end deffn

@geindex set_trace() (in module bdb)
@anchor{library/bdb bdb set_trace}@anchor{4afd}
@deffn {Function} bdb.set_trace ()

Start debugging with a @ref{2d7,,Bdb} instance from caller’s frame.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node faulthandler — Dump the Python traceback,pdb — The Python Debugger,bdb — Debugger framework,Debugging and Profiling
@anchor{library/faulthandler doc}@anchor{4b11}@anchor{library/faulthandler faulthandler-dump-the-python-traceback}@anchor{4b12}@anchor{library/faulthandler module-faulthandler}@anchor{5c}@anchor{library/faulthandler translation-repo}@anchor{4b13}
@subsection @code{faulthandler} — Dump the Python traceback


@geindex module; faulthandler


Added in version 3.3.



__________________________________________________________________


This module contains functions to dump Python tracebacks explicitly, on a fault,
after a timeout, or on a user signal. Call @ref{211,,faulthandler.enable()} to
install fault handlers for the @ref{1286,,SIGSEGV},
@ref{1287,,SIGFPE}, @ref{1288,,SIGABRT}, @ref{1289,,SIGBUS}, and
@ref{128a,,SIGILL} signals. You can also
enable them at startup by setting the 
@geindex PYTHONFAULTHANDLER
@geindex environment variable; PYTHONFAULTHANDLER
@ref{128b,,PYTHONFAULTHANDLER} environment
variable or by using the @ref{170,,-X} @code{faulthandler} command line option.

The fault handler is compatible with system fault handlers like Apport or the
Windows fault handler. The module uses an alternative stack for signal handlers
if the @code{sigaltstack()} function is available. This allows it to dump the
traceback even on a stack overflow.

The fault handler is called on catastrophic cases and therefore can only use
signal-safe functions (e.g. it cannot allocate memory on the heap). Because of
this limitation traceback dumping is minimal compared to normal Python
tracebacks:


@itemize *

@item 
Only ASCII is supported. The @code{backslashreplace} error handler is used on
encoding.

@item 
Each string is limited to 500 characters.

@item 
Only the filename, the function name and the line number are
displayed. (no source code)

@item 
It is limited to 100 frames and 100 threads.

@item 
The order is reversed: the most recent call is shown first.
@end itemize

By default, the Python traceback is written to @ref{b39,,sys.stderr}. To see
tracebacks, applications must be run in the terminal. A log file can
alternatively be passed to @ref{211,,faulthandler.enable()}.

The module is implemented in C, so tracebacks can be dumped on a crash or when
Python is deadlocked.

The @ref{509,,Python Development Mode} calls @ref{211,,faulthandler.enable()}
at Python startup.


@subsubheading See also



@table @asis

@item Module @ref{aa,,pdb}

Interactive source code debugger for Python programs.

@item Module @ref{105,,traceback}

Standard interface to extract, format and print stack traces of Python programs.
@end table


@menu
* Dumping the traceback:: 
* Dumping the C stack:: 
* Fault handler state:: 
* Dumping the tracebacks after a timeout:: 
* Dumping the traceback on a user signal:: 
* Issue with file descriptors:: 
* Example: Example<13>. 

@end menu

@node Dumping the traceback,Dumping the C stack,,faulthandler — Dump the Python traceback
@anchor{library/faulthandler dumping-the-traceback}@anchor{4b14}
@subsubsection Dumping the traceback


@geindex dump_traceback() (in module faulthandler)
@anchor{library/faulthandler faulthandler dump_traceback}@anchor{1005}
@deffn {Function} faulthandler.dump_traceback (file=sys.stderr, all_threads=True)

Dump the tracebacks of all threads into `file'. If `all_threads' is
@code{False}, dump only the current thread.


@subsubheading See also


@ref{108b,,traceback.print_tb()}, which can be used to print a traceback object.



Changed in version 3.5: Added support for passing file descriptor to this function.

@end deffn

@node Dumping the C stack,Fault handler state,Dumping the traceback,faulthandler — Dump the Python traceback
@anchor{library/faulthandler dumping-the-c-stack}@anchor{4b15}
@subsubsection Dumping the C stack



Added in version 3.14.


@geindex dump_c_stack() (in module faulthandler)
@anchor{library/faulthandler faulthandler dump_c_stack}@anchor{210}
@deffn {Function} faulthandler.dump_c_stack (file=sys.stderr)

Dump the C stack trace of the current thread into `file'.

If the Python build does not support it or the operating system
does not provide a stack trace, then this prints an error in place
of a dumped C stack.
@end deffn

@menu
* C Stack Compatibility:: 

@end menu

@node C Stack Compatibility,,,Dumping the C stack
@anchor{library/faulthandler c-stack-compatibility}@anchor{20f}@anchor{library/faulthandler id1}@anchor{4b16}
@subsubsection C Stack Compatibility


If the system does not support the C-level @code{backtrace(3)@footnote{https://manpages.debian.org/backtrace(3)}}
or @code{dladdr1(3)@footnote{https://manpages.debian.org/dladdr1(3)}}, then C stack dumps will not work.
An error will be printed instead of the stack.

Additionally, some compilers do not support @ref{907,,CPython’s}
implementation of C stack dumps. As a result, a different error may be printed
instead of the stack, even if the operating system supports dumping stacks.

@cartouche
@quotation Note 
Dumping C stacks can be arbitrarily slow, depending on the DWARF level
of the binaries in the call stack.
@end quotation
@end cartouche

@node Fault handler state,Dumping the tracebacks after a timeout,Dumping the C stack,faulthandler — Dump the Python traceback
@anchor{library/faulthandler fault-handler-state}@anchor{4b17}
@subsubsection Fault handler state


@geindex enable() (in module faulthandler)
@anchor{library/faulthandler faulthandler enable}@anchor{211}
@deffn {Function} faulthandler.enable (file=sys.stderr, all_threads=True, c_stack=True)

Enable the fault handler: install handlers for the @ref{1286,,SIGSEGV},
@ref{1287,,SIGFPE}, @ref{1288,,SIGABRT}, @ref{1289,,SIGBUS}
and @ref{128a,,SIGILL}
signals to dump the Python traceback. If `all_threads' is @code{True},
produce tracebacks for every running thread. Otherwise, dump only the current
thread.

The `file' must be kept open until the fault handler is disabled: see
@ref{4b18,,issue with file descriptors}.

If `c_stack' is @code{True}, then the C stack trace is printed after the Python
traceback, unless the system does not support it. See @ref{210,,dump_c_stack()} for
more information on compatibility.


Changed in version 3.5: Added support for passing file descriptor to this function.



Changed in version 3.6: On Windows, a handler for Windows exception is also installed.



Changed in version 3.10: The dump now mentions if a garbage collector collection is running
if `all_threads' is true.



Changed in version 3.14: Only the current thread is dumped if the @ref{165,,GIL} is disabled to
prevent the risk of data races.



Changed in version 3.14: The dump now displays the C stack trace if `c_stack' is true.

@end deffn

@geindex disable() (in module faulthandler)
@anchor{library/faulthandler faulthandler disable}@anchor{4b19}
@deffn {Function} faulthandler.disable ()

Disable the fault handler: uninstall the signal handlers installed by
@ref{211,,enable()}.
@end deffn

@geindex is_enabled() (in module faulthandler)
@anchor{library/faulthandler faulthandler is_enabled}@anchor{4b1a}
@deffn {Function} faulthandler.is_enabled ()

Check if the fault handler is enabled.
@end deffn

@node Dumping the tracebacks after a timeout,Dumping the traceback on a user signal,Fault handler state,faulthandler — Dump the Python traceback
@anchor{library/faulthandler dumping-the-tracebacks-after-a-timeout}@anchor{4b1b}
@subsubsection Dumping the tracebacks after a timeout


@geindex dump_traceback_later() (in module faulthandler)
@anchor{library/faulthandler faulthandler dump_traceback_later}@anchor{1006}
@deffn {Function} faulthandler.dump_traceback_later (timeout, repeat=False, file=sys.stderr, exit=False)

Dump the tracebacks of all threads, after a timeout of `timeout' seconds, or
every `timeout' seconds if `repeat' is @code{True}.  If `exit' is @code{True}, call
@code{_exit()} with status=1 after dumping the tracebacks.  (Note
@code{_exit()} exits the process immediately, which means it doesn’t do any
cleanup like flushing file buffers.) If the function is called twice, the new
call replaces previous parameters and resets the timeout. The timer has a
sub-second resolution.

The `file' must be kept open until the traceback is dumped or
@ref{4b1c,,cancel_dump_traceback_later()} is called: see @ref{4b18,,issue with file descriptors}.

This function is implemented using a watchdog thread.


Changed in version 3.5: Added support for passing file descriptor to this function.



Changed in version 3.7: This function is now always available.

@end deffn

@geindex cancel_dump_traceback_later() (in module faulthandler)
@anchor{library/faulthandler faulthandler cancel_dump_traceback_later}@anchor{4b1c}
@deffn {Function} faulthandler.cancel_dump_traceback_later ()

Cancel the last call to @ref{1006,,dump_traceback_later()}.
@end deffn

@node Dumping the traceback on a user signal,Issue with file descriptors,Dumping the tracebacks after a timeout,faulthandler — Dump the Python traceback
@anchor{library/faulthandler dumping-the-traceback-on-a-user-signal}@anchor{4b1d}
@subsubsection Dumping the traceback on a user signal


@geindex register() (in module faulthandler)
@anchor{library/faulthandler faulthandler register}@anchor{1004}
@deffn {Function} faulthandler.register (signum, file=sys.stderr, all_threads=True, chain=False)

Register a user signal: install a handler for the `signum' signal to dump
the traceback of all threads, or of the current thread if `all_threads' is
@code{False}, into `file'. Call the previous handler if chain is @code{True}.

The `file' must be kept open until the signal is unregistered by
@ref{4b1e,,unregister()}: see @ref{4b18,,issue with file descriptors}.

Not available on Windows.


Changed in version 3.5: Added support for passing file descriptor to this function.

@end deffn

@geindex unregister() (in module faulthandler)
@anchor{library/faulthandler faulthandler unregister}@anchor{4b1e}
@deffn {Function} faulthandler.unregister (signum)

Unregister a user signal: uninstall the handler of the `signum' signal
installed by @ref{1004,,register()}. Return @code{True} if the signal was registered,
@code{False} otherwise.

Not available on Windows.
@end deffn

@node Issue with file descriptors,Example<13>,Dumping the traceback on a user signal,faulthandler — Dump the Python traceback
@anchor{library/faulthandler faulthandler-fd}@anchor{4b18}@anchor{library/faulthandler issue-with-file-descriptors}@anchor{4b1f}
@subsubsection Issue with file descriptors


@ref{211,,enable()}, @ref{1006,,dump_traceback_later()} and @ref{1004,,register()} keep the
file descriptor of their `file' argument. If the file is closed and its file
descriptor is reused by a new file, or if @ref{d60,,os.dup2()} is used to replace
the file descriptor, the traceback will be written into a different file. Call
these functions again each time that the file is replaced.

@node Example<13>,,Issue with file descriptors,faulthandler — Dump the Python traceback
@anchor{library/faulthandler example}@anchor{4b20}
@subsubsection Example


Example of a segmentation fault on Linux with and without enabling the fault
handler:

@example
$ python -c "import ctypes; ctypes.string_at(0)"
Segmentation fault

$ python -q -X faulthandler
>>> import ctypes
>>> ctypes.string_at(0)
Fatal Python error: Segmentation fault

Current thread 0x00007fb899f39700 (most recent call first):
  File "/opt/python/Lib/ctypes/__init__.py", line 486 in string_at
  File "<stdin>", line 1 in <module>

Current thread's C stack trace (most recent call first):
  Binary file "/opt/python/python", at _Py_DumpStack+0x42 [0x5b27f7d7147e]
  Binary file "/opt/python/python", at +0x32dcbd [0x5b27f7d85cbd]
  Binary file "/opt/python/python", at +0x32df8a [0x5b27f7d85f8a]
  Binary file "/usr/lib/libc.so.6", at +0x3def0 [0x77b73226bef0]
  Binary file "/usr/lib/libc.so.6", at +0x17ef9c [0x77b7323acf9c]
  Binary file "/opt/python/build/lib.linux-x86_64-3.14/_ctypes.cpython-314d-x86_64-linux-gnu.so", at +0xcdf6 [0x77b7315dddf6]
  Binary file "/usr/lib/libffi.so.8", at +0x7976 [0x77b73158f976]
  Binary file "/usr/lib/libffi.so.8", at +0x413c [0x77b73158c13c]
  Binary file "/usr/lib/libffi.so.8", at ffi_call+0x12e [0x77b73158ef0e]
  Binary file "/opt/python/build/lib.linux-x86_64-3.14/_ctypes.cpython-314d-x86_64-linux-gnu.so", at +0x15a33 [0x77b7315e6a33]
  Binary file "/opt/python/build/lib.linux-x86_64-3.14/_ctypes.cpython-314d-x86_64-linux-gnu.so", at +0x164fa [0x77b7315e74fa]
  Binary file "/opt/python/build/lib.linux-x86_64-3.14/_ctypes.cpython-314d-x86_64-linux-gnu.so", at +0xc624 [0x77b7315dd624]
  Binary file "/opt/python/python", at _PyObject_MakeTpCall+0xce [0x5b27f7b73883]
  Binary file "/opt/python/python", at +0x11bab6 [0x5b27f7b73ab6]
  Binary file "/opt/python/python", at PyObject_Vectorcall+0x23 [0x5b27f7b73b04]
  Binary file "/opt/python/python", at _PyEval_EvalFrameDefault+0x490c [0x5b27f7cbb302]
  Binary file "/opt/python/python", at +0x2818e6 [0x5b27f7cd98e6]
  Binary file "/opt/python/python", at +0x281aab [0x5b27f7cd9aab]
  Binary file "/opt/python/python", at PyEval_EvalCode+0xc5 [0x5b27f7cd9ba3]
  Binary file "/opt/python/python", at +0x255957 [0x5b27f7cad957]
  Binary file "/opt/python/python", at +0x255ab4 [0x5b27f7cadab4]
  Binary file "/opt/python/python", at _PyEval_EvalFrameDefault+0x6c3e [0x5b27f7cbd634]
  Binary file "/opt/python/python", at +0x2818e6 [0x5b27f7cd98e6]
  Binary file "/opt/python/python", at +0x281aab [0x5b27f7cd9aab]
  Binary file "/opt/python/python", at +0x11b6e1 [0x5b27f7b736e1]
  Binary file "/opt/python/python", at +0x11d348 [0x5b27f7b75348]
  Binary file "/opt/python/python", at +0x11d626 [0x5b27f7b75626]
  Binary file "/opt/python/python", at PyObject_Call+0x20 [0x5b27f7b7565e]
  Binary file "/opt/python/python", at +0x32a67a [0x5b27f7d8267a]
  Binary file "/opt/python/python", at +0x32a7f8 [0x5b27f7d827f8]
  Binary file "/opt/python/python", at +0x32ac1b [0x5b27f7d82c1b]
  Binary file "/opt/python/python", at Py_RunMain+0x31 [0x5b27f7d82ebe]
  <truncated rest of calls>
Segmentation fault
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node pdb — The Python Debugger,The Python Profilers,faulthandler — Dump the Python traceback,Debugging and Profiling
@anchor{library/pdb doc}@anchor{4b21}@anchor{library/pdb debugger}@anchor{4b22}@anchor{library/pdb module-pdb}@anchor{aa}@anchor{library/pdb pdb-the-python-debugger}@anchor{4b23}@anchor{library/pdb translation-repo}@anchor{4b24}
@subsection @code{pdb} — The Python Debugger


@geindex module; pdb

`Source code:' Lib/pdb.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/pdb.py}

@geindex debugging


__________________________________________________________________


The module @code{pdb} defines an interactive source code debugger for Python
programs.  It supports setting (conditional) breakpoints and single stepping at
the source line level, inspection of stack frames, source code listing, and
evaluation of arbitrary Python code in the context of any stack frame.  It also
supports post-mortem debugging and can be called under program control.

@geindex Pdb (class in pdb)
@geindex module; bdb
@geindex module; cmd

The debugger is extensible – it is actually defined as the class @ref{275,,Pdb}.
This is currently undocumented but easily understood by reading the source.  The
extension interface uses the modules @ref{10,,bdb} and @ref{1a,,cmd}.


@subsubheading See also



@table @asis

@item Module @ref{5c,,faulthandler}

Used to dump Python tracebacks explicitly, on a fault, after a timeout,
or on a user signal.

@item Module @ref{105,,traceback}

Standard interface to extract, format and print stack traces of Python programs.
@end table


The typical usage to break into the debugger is to insert:

@example
import pdb; pdb.set_trace()
@end example

Or:

@example
breakpoint()
@end example

at the location you want to break into the debugger, and then run the program.
You can then step through the code following this statement, and continue
running without the debugger using the @ref{4b25,,continue} command.


Changed in version 3.7: The built-in @ref{273,,breakpoint()}, when called with defaults, can be used
instead of @code{import pdb; pdb.set_trace()}.


@example
def double(x):
   breakpoint()
   return x * 2
val = 3
print(f"@{val@} * 2 is @{double(val)@}")
@end example

The debugger’s prompt is @code{(Pdb)}, which is the indicator that you are in debug mode:

@example
> ...(2)double()
-> breakpoint()
(Pdb) p x
3
(Pdb) continue
3 * 2 is 6
@end example


Changed in version 3.3: Tab-completion via the @ref{bf,,readline} module is available for commands and
command arguments, e.g. the current global and local names are offered as
arguments of the @code{p} command.


@menu
* Command-line interface: Command-line interface<8>. 
* Debugger commands:: 

@end menu

@node Command-line interface<8>,Debugger commands,,pdb — The Python Debugger
@anchor{library/pdb command-line-interface}@anchor{4b26}@anchor{library/pdb pdb-cli}@anchor{2e4}
@subsubsection Command-line interface


You can also invoke @code{pdb} from the command line to debug other scripts.  For
example:

@example
python -m pdb [-c command] (-m module | -p pid | pyfile) [args ...]
@end example

When invoked as a module, pdb will automatically enter post-mortem debugging if
the program being debugged exits abnormally.  After post-mortem debugging (or
after normal exit of the program), pdb will restart the program.  Automatic
restarting preserves pdb’s state (such as breakpoints) and in most cases is more
useful than quitting the debugger upon program’s exit.

@geindex pdb command line option; -c
@geindex pdb command line option; --command
@anchor{library/pdb cmdoption-pdb-c}@anchor{4b27}@anchor{library/pdb cmdoption-pdb-command}@anchor{4b28}
@deffn {Option} @w{-}c, @w{-}@w{-}command <command>

To execute commands as if given in a @code{.pdbrc} file; see
@ref{4b29,,Debugger commands}.


Changed in version 3.2: Added the @code{-c} option.

@end deffn

@geindex pdb command line option; -m
@anchor{library/pdb cmdoption-pdb-m}@anchor{4b2a}
@deffn {Option} @w{-}m <module>

To execute modules similar to the way @code{python -m} does. As with a script,
the debugger will pause execution just before the first line of the module.


Changed in version 3.7: Added the @code{-m} option.

@end deffn

@geindex pdb command line option; -p
@geindex pdb command line option; --pid
@anchor{library/pdb cmdoption-pdb-p}@anchor{272}@anchor{library/pdb cmdoption-pdb-pid}@anchor{4b2b}
@deffn {Option} @w{-}p, @w{-}@w{-}pid <pid>

Attach to the process with the specified PID.


Added in version 3.14.

@end deffn

To attach to a running Python process for remote debugging, use the @code{-p} or
@code{--pid} option with the target process’s PID:

@example
python -m pdb -p 1234
@end example

@cartouche
@quotation Note 
Attaching to a process that is blocked in a system call or waiting for I/O
will only work once the next bytecode instruction is executed or when the
process receives a signal.
@end quotation
@end cartouche

Typical usage to execute a statement under control of the debugger is:

@example
>>> import pdb
>>> def f(x):
...     print(1 / x)
>>> pdb.run("f(2)")
> <string>(1)<module>()
(Pdb) continue
0.5
>>>
@end example

The typical usage to inspect a crashed program is:

@example
>>> import pdb
>>> def f(x):
...     print(1 / x)
...
>>> f(0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in f
ZeroDivisionError: division by zero
>>> pdb.pm()
> <stdin>(2)f()
(Pdb) p x
0
(Pdb)
@end example


Changed in version 3.13: The implementation of 
@geindex Python Enhancement Proposals; PEP 667
PEP 667@footnote{https://peps.python.org/pep-0667/} means that name assignments made via @code{pdb}
will immediately affect the active scope, even when running inside an
@ref{4a2,,optimized scope}.


The module defines the following functions; each enters the debugger in a
slightly different way:

@geindex run() (in module pdb)
@anchor{library/pdb pdb run}@anchor{491c}
@deffn {Function} pdb.run (statement, globals=None, locals=None)

Execute the `statement' (given as a string or a code object) under debugger
control.  The debugger prompt appears before any code is executed; you can
set breakpoints and type @ref{4b25,,continue}, or you can step through the
statement using @ref{4b2c,,step} or @ref{4b2d,,next} (all these commands are
explained below).  The optional `globals' and `locals' arguments specify the
environment in which the code is executed; by default the dictionary of the
module @ref{1,,__main__} is used.  (See the explanation of the built-in
@ref{4a3,,exec()} or @ref{4a4,,eval()} functions.)
@end deffn

@geindex runeval() (in module pdb)
@anchor{library/pdb pdb runeval}@anchor{4b2e}
@deffn {Function} pdb.runeval (expression, globals=None, locals=None)

Evaluate the `expression' (given as a string or a code object) under debugger
control.  When @code{runeval()} returns, it returns the value of the
`expression'.  Otherwise this function is similar to @ref{491c,,run()}.
@end deffn

@geindex runcall() (in module pdb)
@anchor{library/pdb pdb runcall}@anchor{4b2f}
@deffn {Function} pdb.runcall (function, *args, **kwds)

Call the `function' (a function or method object, not a string) with the
given arguments.  When @code{runcall()} returns, it returns whatever the
function call returned.  The debugger prompt appears as soon as the function
is entered.
@end deffn

@geindex set_trace() (in module pdb)
@anchor{library/pdb pdb set_trace}@anchor{274}
@deffn {Function} pdb.set_trace (*, header=None, commands=None)

Enter the debugger at the calling stack frame.  This is useful to hard-code
a breakpoint at a given point in a program, even if the code is not
otherwise being debugged (e.g. when an assertion fails).  If given,
`header' is printed to the console just before debugging begins.
The `commands' argument, if given, is a list of commands to execute
when the debugger starts.


Changed in version 3.7: The keyword-only argument `header'.



Changed in version 3.13: @code{set_trace()} will enter the debugger immediately, rather than
on the next line of code to be executed.



Added in version 3.14: The `commands' argument.

@end deffn

@geindex set_trace_async() (in module pdb)
@anchor{library/pdb pdb set_trace_async}@anchor{27b}
@deffn {Function} awaitable pdb.set_trace_async (*, header=None, commands=None)

async version of @ref{274,,set_trace()}. This function should be used inside an
async function with @ref{18e,,await}.

@example
async def f():
    await pdb.set_trace_async()
@end example

@ref{18e,,await} statements are supported if the debugger is invoked by this function.


Added in version 3.14.

@end deffn

@geindex post_mortem() (in module pdb)
@anchor{library/pdb pdb post_mortem}@anchor{15e6}
@deffn {Function} pdb.post_mortem (t=None)

Enter post-mortem debugging of the given exception or
@ref{cf2,,traceback object}. If no value is given, it uses
the exception that is currently being handled, or raises @code{ValueError} if
there isn’t one.


Changed in version 3.13: Support for exception objects was added.

@end deffn

@geindex pm() (in module pdb)
@anchor{library/pdb pdb pm}@anchor{540}
@deffn {Function} pdb.pm ()

Enter post-mortem debugging of the exception found in
@ref{6e6,,sys.last_exc}.
@end deffn

@geindex set_default_backend() (in module pdb)
@anchor{library/pdb pdb set_default_backend}@anchor{4b30}
@deffn {Function} pdb.set_default_backend (backend)

There are two supported backends for pdb: @code{'settrace'} and @code{'monitoring'}.
See @ref{2d7,,bdb.Bdb} for details. The user can set the default backend to
use if none is specified when instantiating @ref{275,,Pdb}. If no backend is
specified, the default is @code{'settrace'}.

@cartouche
@quotation Note 
@ref{273,,breakpoint()} and @ref{274,,set_trace()} will not be affected by this
function. They always use @code{'monitoring'} backend.
@end quotation
@end cartouche


Added in version 3.14.

@end deffn

@geindex get_default_backend() (in module pdb)
@anchor{library/pdb pdb get_default_backend}@anchor{4b31}
@deffn {Function} pdb.get_default_backend ()

Returns the default backend for pdb.


Added in version 3.14.

@end deffn

The @code{run*} functions and @ref{274,,set_trace()} are aliases for instantiating the
@ref{275,,Pdb} class and calling the method of the same name.  If you want to
access further features, you have to do this yourself:

@geindex Pdb (class in pdb)
@anchor{library/pdb pdb Pdb}@anchor{275}
@deffn {Class} pdb.Pdb (completekey='tab', stdin=None, stdout=None, skip=None, nosigint=False, readrc=True, mode=None, backend=None, colorize=False)

@code{Pdb} is the debugger class.

The `completekey', `stdin' and `stdout' arguments are passed to the
underlying @ref{1897,,cmd.Cmd} class; see the description there.

The `skip' argument, if given, must be an iterable of glob-style module name
patterns.  The debugger will not step into frames that originate in a module
that matches one of these patterns. @footnote{
Whether a frame is considered to originate in a certain module
is determined by the @code{__name__} in the frame globals.
}

By default, Pdb sets a handler for the SIGINT signal (which is sent when the
user presses @code{Ctrl}-@code{C} on the console) when you give a @ref{4b25,,continue} command.
This allows you to break into the debugger again by pressing @code{Ctrl}-@code{C}.  If you
want Pdb not to touch the SIGINT handler, set `nosigint' to true.

The `readrc' argument defaults to true and controls whether Pdb will load
.pdbrc files from the filesystem.

The `mode' argument specifies how the debugger was invoked.
It impacts the workings of some debugger commands.
Valid values are @code{'inline'} (used by the breakpoint() builtin),
@code{'cli'} (used by the command line invocation)
or @code{None} (for backwards compatible behaviour, as before the `mode'
argument was added).

The `backend' argument specifies the backend to use for the debugger. If @code{None}
is passed, the default backend will be used. See @ref{4b30,,set_default_backend()}.
Otherwise the supported backends are @code{'settrace'} and @code{'monitoring'}.

The `colorize' argument, if set to @code{True}, will enable colorized output in the
debugger, if color is supported. This will highlight source code displayed in pdb.

Example call to enable tracing with `skip':

@example
import pdb; pdb.Pdb(skip=['django.*']).set_trace()
@end example

Raises an @ref{1cb1,,auditing event} @code{pdb.Pdb} with no arguments.


Changed in version 3.1: Added the `skip' parameter.



Changed in version 3.2: Added the `nosigint' parameter.
Previously, a SIGINT handler was never set by Pdb.



Changed in version 3.6: The `readrc' argument.



Added in version 3.14: Added the `mode' argument.



Added in version 3.14: Added the `backend' argument.



Added in version 3.14: Added the `colorize' argument.



Changed in version 3.14: Inline breakpoints like @ref{273,,breakpoint()} or @ref{274,,pdb.set_trace()} will
always stop the program at calling frame, ignoring the `skip' pattern (if any).


@geindex run() (pdb.Pdb method)
@geindex runeval() (pdb.Pdb method)
@geindex runcall() (pdb.Pdb method)
@geindex set_trace() (pdb.Pdb method)
@anchor{library/pdb pdb Pdb run}@anchor{4b32}
@deffn {Method} run (statement, globals=None, locals=None)
@anchor{library/pdb pdb Pdb runeval}@anchor{4b33}
@deffnx {Method} runeval (expression, globals=None, locals=None)
@anchor{library/pdb pdb Pdb runcall}@anchor{4b34}
@deffnx {Method} runcall (function, *args, **kwds)
@anchor{library/pdb pdb Pdb set_trace}@anchor{276}
@deffnx {Method} set_trace ()

See the documentation for the functions explained above.
@end deffn
@end deffn

@node Debugger commands,,Command-line interface<8>,pdb — The Python Debugger
@anchor{library/pdb debugger-commands}@anchor{4b29}@anchor{library/pdb id2}@anchor{4b35}
@subsubsection Debugger commands


The commands recognized by the debugger are listed below.  Most commands can be
abbreviated to one or two letters as indicated; e.g. @code{h(elp)} means that
either @code{h} or @code{help} can be used to enter the help command (but not @code{he}
or @code{hel}, nor @code{H} or @code{Help} or @code{HELP}).  Arguments to commands must be
separated by whitespace (spaces or tabs).  Optional arguments are enclosed in
square brackets (@code{[]}) in the command syntax; the square brackets must not be
typed.  Alternatives in the command syntax are separated by a vertical bar
(@code{|}).

Entering a blank line repeats the last command entered.  Exception: if the last
command was a @ref{4b36,,list} command, the next 11 lines are listed.

Commands that the debugger doesn’t recognize are assumed to be Python statements
and are executed in the context of the program being debugged.  Python
statements can also be prefixed with an exclamation point (@code{!}).  This is a
powerful way to inspect the program being debugged; it is even possible to
change a variable or call a function.  When an exception occurs in such a
statement, the exception name is printed but the debugger’s state is not
changed.


Changed in version 3.13: Expressions/Statements whose prefix is a pdb command are now correctly
identified and executed.


The debugger supports @ref{4b37,,aliases}.  Aliases can have
parameters which allows one a certain level of adaptability to the context under
examination.

Multiple commands may be entered on a single line, separated by @code{;;}.  (A
single @code{;} is not used as it is the separator for multiple commands in a line
that is passed to the Python parser.)  No intelligence is applied to separating
the commands; the input is split at the first @code{;;} pair, even if it is in the
middle of a quoted string. A workaround for strings with double semicolons
is to use implicit string concatenation @code{';'@w{'};'} or @code{";"";"}.

To set a temporary global variable, use a `convenience variable'. A `convenience
variable' is a variable whose name starts with @code{$}.  For example, @code{$foo = 1}
sets a global variable @code{$foo} which you can use in the debugger session.  The
`convenience variables' are cleared when the program resumes execution so it’s
less likely to interfere with your program compared to using normal variables
like @code{foo = 1}.

There are four preset `convenience variables':


@itemize *

@item 
@code{$_frame}: the current frame you are debugging

@item 
@code{$_retval}: the return value if the frame is returning

@item 
@code{$_exception}: the exception if the frame is raising an exception

@item 
@code{$_asynctask}: the asyncio task if pdb stops in an async function
@end itemize


Added in version 3.12: Added the `convenience variable' feature.



Added in version 3.14: Added the @code{$_asynctask} convenience variable.


@geindex .pdbrc; file
@geindex debugger; configuration; file

If a file @code{.pdbrc} exists in the user’s home directory or in the current
directory, it is read with @code{'utf-8'} encoding and executed as if it had been
typed at the debugger prompt, with the exception that empty lines and lines
starting with @code{#} are ignored.  This is particularly useful for aliases.  If both
files exist, the one in the home directory is read first and aliases defined there
can be overridden by the local file.


Changed in version 3.2: @code{.pdbrc} can now contain commands that continue debugging, such as
@ref{4b25,,continue} or @ref{4b2d,,next}.  Previously, these commands had no
effect.



Changed in version 3.11: @code{.pdbrc} is now read with @code{'utf-8'} encoding. Previously, it was read
with the system locale encoding.


@geindex help (pdb command)
@anchor{library/pdb pdbcommand-help}@anchor{4b38}
@deffn {Pdbcommand} h(elp) [command]

Without argument, print the list of available commands.  With a `command' as
argument, print help about that command.  @code{help pdb} displays the full
documentation (the docstring of the @code{pdb} module).  Since the `command'
argument must be an identifier, @code{help exec} must be entered to get help on
the @code{!} command.
@end deffn

@geindex where (pdb command)
@anchor{library/pdb pdbcommand-where}@anchor{4b39}
@deffn {Pdbcommand} w(here) [count]

Print a stack trace, with the most recent frame at the bottom.  if `count'
is 0, print the current frame entry. If `count' is negative, print the least
recent - `count' frames. If `count' is positive, print the most recent
`count' frames.  An arrow (@code{>})
indicates the current frame, which determines the context of most commands.


Changed in version 3.14: `count' argument is added.

@end deffn

@geindex down (pdb command)
@anchor{library/pdb pdbcommand-down}@anchor{4b3a}
@deffn {Pdbcommand} d(own) [count]

Move the current frame `count' (default one) levels down in the stack trace
(to a newer frame).
@end deffn

@geindex up (pdb command)
@anchor{library/pdb pdbcommand-up}@anchor{4b3b}
@deffn {Pdbcommand} u(p) [count]

Move the current frame `count' (default one) levels up in the stack trace (to
an older frame).
@end deffn

@geindex break (pdb command)
@anchor{library/pdb pdbcommand-break}@anchor{4b3c}
@deffn {Pdbcommand} b(reak) [([filename:]lineno | function) [, condition]]

With a `lineno' argument, set a break at line `lineno' in the current file.
The line number may be prefixed with a `filename' and a colon,
to specify a breakpoint in another file (possibly one that hasn’t been loaded
yet).  The file is searched on @ref{3e2,,sys.path}.  Acceptable forms of `filename'
are @code{/abspath/to/file.py}, @code{relpath/file.py}, @code{module} and
@code{package.module}.

With a `function' argument, set a break at the first executable statement within
that function. `function' can be any expression that evaluates to a function
in the current namespace.

If a second argument is present, it is an expression which must evaluate to
true before the breakpoint is honored.

Without argument, list all breaks, including for each breakpoint, the number
of times that breakpoint has been hit, the current ignore count, and the
associated condition if any.

Each breakpoint is assigned a number to which all the other
breakpoint commands refer.
@end deffn

@geindex tbreak (pdb command)
@anchor{library/pdb pdbcommand-tbreak}@anchor{4b3d}
@deffn {Pdbcommand} tbreak [([filename:]lineno | function) [, condition]]

Temporary breakpoint, which is removed automatically when it is first hit.
The arguments are the same as for @ref{4b3c,,break}.
@end deffn

@geindex clear (pdb command)
@anchor{library/pdb pdbcommand-clear}@anchor{4b3e}
@deffn {Pdbcommand} cl(ear) [filename:lineno | bpnumber ...]

With a `filename:lineno' argument, clear all the breakpoints at this line.
With a space separated list of breakpoint numbers, clear those breakpoints.
Without argument, clear all breaks (but first ask confirmation).
@end deffn

@geindex disable (pdb command)
@anchor{library/pdb pdbcommand-disable}@anchor{4b3f}
@deffn {Pdbcommand} disable bpnumber [bpnumber ...]

Disable the breakpoints given as a space separated list of breakpoint
numbers.  Disabling a breakpoint means it cannot cause the program to stop
execution, but unlike clearing a breakpoint, it remains in the list of
breakpoints and can be (re-)enabled.
@end deffn

@geindex enable (pdb command)
@anchor{library/pdb pdbcommand-enable}@anchor{4b40}
@deffn {Pdbcommand} enable bpnumber [bpnumber ...]

Enable the breakpoints specified.
@end deffn

@geindex ignore (pdb command)
@anchor{library/pdb pdbcommand-ignore}@anchor{4b41}
@deffn {Pdbcommand} ignore bpnumber [count]

Set the ignore count for the given breakpoint number.  If `count' is omitted,
the ignore count is set to 0.  A breakpoint becomes active when the ignore
count is zero.  When non-zero, the `count' is decremented each time the
breakpoint is reached and the breakpoint is not disabled and any associated
condition evaluates to true.
@end deffn

@geindex condition (pdb command)
@anchor{library/pdb pdbcommand-condition}@anchor{4b42}
@deffn {Pdbcommand} condition bpnumber [condition]

Set a new `condition' for the breakpoint, an expression which must evaluate
to true before the breakpoint is honored.  If `condition' is absent, any
existing condition is removed; i.e., the breakpoint is made unconditional.
@end deffn

@geindex commands (pdb command)
@anchor{library/pdb pdbcommand-commands}@anchor{278}
@deffn {Pdbcommand} commands [bpnumber]

Specify a list of commands for breakpoint number `bpnumber'.  The commands
themselves appear on the following lines.  Type a line containing just
@code{end} to terminate the commands. An example:

@example
(Pdb) commands 1
(com) p some_variable
(com) end
(Pdb)
@end example

To remove all commands from a breakpoint, type @code{commands} and follow it
immediately with @code{end}; that is, give no commands.

With no `bpnumber' argument, @code{commands} refers to the last breakpoint set.

You can use breakpoint commands to start your program up again.  Simply use
the @ref{4b25,,continue} command, or @ref{4b2c,,step},
or any other command that resumes execution.

Specifying any command resuming execution
(currently @ref{4b25,,continue}, @ref{4b2c,,step}, @ref{4b2d,,next},
@ref{4b43,,return}, @ref{4b44,,until}, @ref{4b45,,jump}, @ref{4b46,,quit} and their abbreviations)
terminates the command list (as if
that command was immediately followed by end). This is because any time you
resume execution (even with a simple next or step), you may encounter another
breakpoint—which could have its own command list, leading to ambiguities about
which list to execute.

If the list of commands contains the @code{silent} command, or a command that
resumes execution, then the breakpoint message containing information about
the frame is not displayed.


Changed in version 3.14: Frame information will not be displayed if a command that resumes execution
is present in the command list.

@end deffn

@geindex step (pdb command)
@anchor{library/pdb pdbcommand-step}@anchor{4b2c}
@deffn {Pdbcommand} s(tep)

Execute the current line, stop at the first possible occasion (either in a
function that is called or on the next line in the current function).
@end deffn

@geindex next (pdb command)
@anchor{library/pdb pdbcommand-next}@anchor{4b2d}
@deffn {Pdbcommand} n(ext)

Continue execution until the next line in the current function is reached or
it returns.  (The difference between @ref{4b2d,,next} and @ref{4b2c,,step} is
that @code{step} stops inside a called function, while @code{next}
executes called functions at (nearly) full speed, only stopping at the next
line in the current function.)
@end deffn

@geindex until (pdb command)
@anchor{library/pdb pdbcommand-until}@anchor{4b44}
@deffn {Pdbcommand} unt(il) [lineno]

Without argument, continue execution until the line with a number greater
than the current one is reached.

With `lineno', continue execution until a line with a number greater or
equal to `lineno' is reached.  In both cases, also stop when the current frame
returns.


Changed in version 3.2: Allow giving an explicit line number.

@end deffn

@geindex return (pdb command)
@anchor{library/pdb pdbcommand-return}@anchor{4b43}
@deffn {Pdbcommand} r(eturn)

Continue execution until the current function returns.
@end deffn

@geindex continue (pdb command)
@anchor{library/pdb pdbcommand-continue}@anchor{4b25}
@deffn {Pdbcommand} c(ont(inue))

Continue execution, only stop when a breakpoint is encountered.
@end deffn

@geindex jump (pdb command)
@anchor{library/pdb pdbcommand-jump}@anchor{4b45}
@deffn {Pdbcommand} j(ump) lineno

Set the next line that will be executed.  Only available in the bottom-most
frame.  This lets you jump back and execute code again, or jump forward to
skip code that you don’t want to run.

It should be noted that not all jumps are allowed – for instance it is not
possible to jump into the middle of a @ref{348,,for} loop or out of a
@ref{1b1,,finally} clause.
@end deffn

@geindex list (pdb command)
@anchor{library/pdb pdbcommand-list}@anchor{4b36}
@deffn {Pdbcommand} l(ist) [first[, last]]

List source code for the current file.  Without arguments, list 11 lines
around the current line or continue the previous listing.  With @code{.} as
argument, list 11 lines around the current line.  With one argument,
list 11 lines around at that line.  With two arguments, list the given range;
if the second argument is less than the first, it is interpreted as a count.

The current line in the current frame is indicated by @code{->}.  If an
exception is being debugged, the line where the exception was originally
raised or propagated is indicated by @code{>>}, if it differs from the current
line.


Changed in version 3.2: Added the @code{>>} marker.

@end deffn

@geindex ll (pdb command)
@anchor{library/pdb pdbcommand-ll}@anchor{4b47}
@deffn {Pdbcommand} ll | longlist

List all source code for the current function or frame.  Interesting lines
are marked as for @ref{4b36,,list}.


Added in version 3.2.

@end deffn

@geindex args (pdb command)
@anchor{library/pdb pdbcommand-args}@anchor{4b48}
@deffn {Pdbcommand} a(rgs)

Print the arguments of the current function and their current values.
@end deffn

@geindex p (pdb command)
@anchor{library/pdb pdbcommand-p}@anchor{117c}
@deffn {Pdbcommand} p expression

Evaluate `expression' in the current context and print its value.

@cartouche
@quotation Note 
@code{print()} can also be used, but is not a debugger command — this executes the
Python @ref{117b,,print()} function.
@end quotation
@end cartouche
@end deffn

@geindex pp (pdb command)
@anchor{library/pdb pdbcommand-pp}@anchor{4b49}
@deffn {Pdbcommand} pp expression

Like the @ref{117c,,p} command, except the value of `expression' is
pretty-printed using the @ref{b3,,pprint} module.
@end deffn

@geindex whatis (pdb command)
@anchor{library/pdb pdbcommand-whatis}@anchor{4b4a}
@deffn {Pdbcommand} whatis expression

Print the type of `expression'.
@end deffn

@geindex source (pdb command)
@anchor{library/pdb pdbcommand-source}@anchor{4b4b}
@deffn {Pdbcommand} source expression

Try to get source code of `expression' and display it.


Added in version 3.2.

@end deffn

@geindex display (pdb command)
@anchor{library/pdb pdbcommand-display}@anchor{277}
@deffn {Pdbcommand} display [expression]

Display the value of `expression' if it changed, each time execution stops
in the current frame.

Without `expression', list all display expressions for the current frame.

@cartouche
@quotation Note 
Display evaluates `expression' and compares to the result of the previous
evaluation of `expression', so when the result is mutable, display may not
be able to pick up the changes.
@end quotation
@end cartouche

Example:

@example
lst = []
breakpoint()
pass
lst.append(1)
print(lst)
@end example

Display won’t realize @code{lst} has been changed because the result of evaluation
is modified in place by @code{lst.append(1)} before being compared:

@example
> example.py(3)<module>()
-> pass
(Pdb) display lst
display lst: []
(Pdb) n
> example.py(4)<module>()
-> lst.append(1)
(Pdb) n
> example.py(5)<module>()
-> print(lst)
(Pdb)
@end example

You can do some tricks with copy mechanism to make it work:

@example
> example.py(3)<module>()
-> pass
(Pdb) display lst[:]
display lst[:]: []
(Pdb) n
> example.py(4)<module>()
-> lst.append(1)
(Pdb) n
> example.py(5)<module>()
-> print(lst)
display lst[:]: [1]  [old: []]
(Pdb)
@end example


Added in version 3.2.

@end deffn

@geindex undisplay (pdb command)
@anchor{library/pdb pdbcommand-undisplay}@anchor{4b4c}
@deffn {Pdbcommand} undisplay [expression]

Do not display `expression' anymore in the current frame.  Without
`expression', clear all display expressions for the current frame.


Added in version 3.2.

@end deffn

@geindex interact (pdb command)
@anchor{library/pdb pdbcommand-interact}@anchor{4b4d}
@deffn {Pdbcommand} interact

Start an interactive interpreter (using the @ref{1b,,code} module) in a new
global namespace initialised from the local and global namespaces for the
current scope. Use @code{exit()} or @code{quit()} to exit the interpreter and
return to the debugger.

@cartouche
@quotation Note 
As @code{interact} creates a new dedicated namespace for code execution,
assignments to variables will not affect the original namespaces.
However, modifications to any referenced mutable objects will be reflected
in the original namespaces as usual.
@end quotation
@end cartouche


Added in version 3.2.



Changed in version 3.13: @code{exit()} and @code{quit()} can be used to exit the @ref{4b4d,,interact}
command.



Changed in version 3.13: @ref{4b4d,,interact} directs its output to the debugger’s
output channel rather than @ref{b39,,sys.stderr}.

@end deffn

@geindex alias (pdb command)
@anchor{library/pdb debugger-aliases}@anchor{4b37}@anchor{library/pdb pdbcommand-alias}@anchor{4b4e}
@deffn {Pdbcommand} alias [name [command]]

Create an alias called `name' that executes `command'.  The `command' must
`not' be enclosed in quotes.  Replaceable parameters can be indicated by
@code{%1}, @code{%2}, … and @code{%9}, while @code{%*} is replaced by all the parameters.
If `command' is omitted, the current alias for `name' is shown. If no
arguments are given, all aliases are listed.

Aliases may be nested and can contain anything that can be legally typed at
the pdb prompt.  Note that internal pdb commands `can' be overridden by
aliases.  Such a command is then hidden until the alias is removed.  Aliasing
is recursively applied to the first word of the command line; all other words
in the line are left alone.

As an example, here are two useful aliases (especially when placed in the
@code{.pdbrc} file):

@example
# Print instance variables (usage "pi classInst")
alias pi for k in %1.__dict__.keys(): print(f"%1.@{k@} = @{%1.__dict__[k]@}")
# Print instance variables in self
alias ps pi self
@end example
@end deffn

@geindex unalias (pdb command)
@anchor{library/pdb pdbcommand-unalias}@anchor{4b4f}
@deffn {Pdbcommand} unalias name

Delete the specified alias `name'.
@end deffn

@geindex ! (pdb command)
@anchor{library/pdb pdbcommand-0}@anchor{4b50}
@deffn {Pdbcommand} ! statement

Execute the (one-line) `statement' in the context of the current stack frame.
The exclamation point can be omitted unless the first word of the statement
resembles a debugger command, e.g.:

@example
(Pdb) ! n=42
(Pdb)
@end example

To set a global variable, you can prefix the assignment command with a
@ref{4ad,,global} statement on the same line, e.g.:

@example
(Pdb) global list_options; list_options = ['-l']
(Pdb)
@end example
@end deffn

@geindex run (pdb command)
@geindex restart (pdb command)
@anchor{library/pdb pdbcommand-run}@anchor{4b51}
@deffn {Pdbcommand} run [args ...]
@anchor{library/pdb pdbcommand-restart}@anchor{4b52}
@deffnx {Pdbcommand} restart [args ...]

Restart the debugged Python program.  If `args' is supplied, it is split
with @ref{c9,,shlex} and the result is used as the new @ref{1470,,sys.argv}.
History, breakpoints, actions and debugger options are preserved.
@ref{4b52,,restart} is an alias for @ref{4b51,,run}.


Changed in version 3.14: @ref{4b51,,run} and @ref{4b52,,restart} commands are disabled when the
debugger is invoked in @code{'inline'} mode.

@end deffn

@geindex quit (pdb command)
@anchor{library/pdb pdbcommand-quit}@anchor{4b46}
@deffn {Pdbcommand} q(uit)

Quit from the debugger.  The program being executed is aborted.
An end-of-file input is equivalent to @ref{4b46,,quit}.

A confirmation prompt will be shown if the debugger is invoked in
@code{'inline'} mode. Either @code{y}, @code{Y}, @code{<Enter>} or @code{EOF}
will confirm the quit.


Changed in version 3.14: A confirmation prompt will be shown if the debugger is invoked in
@code{'inline'} mode. After the confirmation, the debugger will call
@ref{279,,sys.exit()} immediately, instead of raising @ref{27a,,bdb.BdbQuit}
in the next trace event.

@end deffn

@geindex debug (pdb command)
@anchor{library/pdb pdbcommand-debug}@anchor{4b53}
@deffn {Pdbcommand} debug code

Enter a recursive debugger that steps through `code'
(which is an arbitrary expression or statement to be
executed in the current environment).
@end deffn

@geindex retval (pdb command)
@anchor{library/pdb pdbcommand-retval}@anchor{4b54}
@deffn {Pdbcommand} retval

Print the return value for the last return of the current function.
@end deffn

@geindex exceptions (pdb command)
@anchor{library/pdb pdbcommand-exceptions}@anchor{541}
@deffn {Pdbcommand} exceptions [excnumber]

List or jump between chained exceptions.

When using @code{pdb.pm()}  or @code{Pdb.post_mortem(...)} with a chained exception
instead of a traceback, it allows the user to move between the
chained exceptions using @code{exceptions} command to list exceptions, and
@code{exceptions <number>} to switch to that exception.

Example:

@example
def out():
    try:
        middle()
    except Exception as e:
        raise ValueError("reraise middle() error") from e

def middle():
    try:
        return inner(0)
    except Exception as e:
        raise ValueError("Middle fail")

def inner(x):
    1 / x

 out()
@end example

calling @code{pdb.pm()} will allow to move between exceptions:

@example
> example.py(5)out()
-> raise ValueError("reraise middle() error") from e

(Pdb) exceptions
  0 ZeroDivisionError('division by zero')
  1 ValueError('Middle fail')
> 2 ValueError('reraise middle() error')

(Pdb) exceptions 0
> example.py(16)inner()
-> 1 / x

(Pdb) up
> example.py(10)middle()
-> return inner(0)
@end example


Added in version 3.13.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node The Python Profilers,timeit — Measure execution time of small code snippets,pdb — The Python Debugger,Debugging and Profiling
@anchor{library/profile doc}@anchor{4b55}@anchor{library/profile profile}@anchor{4b56}@anchor{library/profile the-python-profilers}@anchor{4b57}@anchor{library/profile translation-repo}@anchor{4b58}
@subsection The Python Profilers


`Source code:' Lib/profile.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/profile.py} and Lib/pstats.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/pstats.py}


__________________________________________________________________


@menu
* Introduction to the profilers:: 
* Instant User’s Manual:: 
* profile and cProfile Module Reference:: 
* The Stats Class:: 
* What Is Deterministic Profiling?:: 
* Limitations:: 
* Calibration:: 
* Using a custom timer:: 

@end menu

@node Introduction to the profilers,Instant User’s Manual,,The Python Profilers
@anchor{library/profile introduction-to-the-profilers}@anchor{4b59}@anchor{library/profile profiler-introduction}@anchor{4b5a}
@subsubsection Introduction to the profilers


@geindex deterministic profiling
@geindex profiling@comma{} deterministic

@ref{2b,,cProfile} and @ref{b4,,profile} provide `deterministic profiling' of
Python programs. A `profile' is a set of statistics that describes how
often and for how long various parts of the program executed. These statistics
can be formatted into reports via the @ref{b5,,pstats} module.

The Python standard library provides two different implementations of the same
profiling interface:


@enumerate 

@item 
@ref{2b,,cProfile} is recommended for most users; it’s a C extension with
reasonable overhead that makes it suitable for profiling long-running
programs.  Based on @code{lsprof}, contributed by Brett Rosen and Ted
Czotter.

@item 
@ref{b4,,profile}, a pure Python module whose interface is imitated by
@ref{2b,,cProfile}, but which adds significant overhead to profiled programs.
If you’re trying to extend the profiler in some way, the task might be easier
with this module.  Originally designed and written by Jim Roskind.
@end enumerate

@cartouche
@quotation Note 
The profiler modules are designed to provide an execution profile for a given
program, not for benchmarking purposes (for that, there is @ref{f5,,timeit} for
reasonably accurate results).  This particularly applies to benchmarking
Python code against C code: the profilers introduce overhead for Python code,
but not for C-level functions, and so the C code would seem faster than any
Python one.
@end quotation
@end cartouche

@node Instant User’s Manual,profile and cProfile Module Reference,Introduction to the profilers,The Python Profilers
@anchor{library/profile instant-user-s-manual}@anchor{4b5b}@anchor{library/profile profile-instant}@anchor{4b5c}
@subsubsection Instant User’s Manual


This section is provided for users that “don’t want to read the manual.” It
provides a very brief overview, and allows a user to rapidly perform profiling
on an existing application.

To profile a function that takes a single argument, you can do:

@example
import cProfile
import re
cProfile.run('re.compile("foo|bar")')
@end example

(Use @ref{b4,,profile} instead of @ref{2b,,cProfile} if the latter is not available on
your system.)

The above action would run @ref{dd4,,re.compile()} and print profile results like
the following:

@example
      214 function calls (207 primitive calls) in 0.002 seconds

Ordered by: cumulative time

ncalls  tottime  percall  cumtime  percall filename:lineno(function)
     1    0.000    0.000    0.002    0.002 @{built-in method builtins.exec@}
     1    0.000    0.000    0.001    0.001 <string>:1(<module>)
     1    0.000    0.000    0.001    0.001 __init__.py:250(compile)
     1    0.000    0.000    0.001    0.001 __init__.py:289(_compile)
     1    0.000    0.000    0.000    0.000 _compiler.py:759(compile)
     1    0.000    0.000    0.000    0.000 _parser.py:937(parse)
     1    0.000    0.000    0.000    0.000 _compiler.py:598(_code)
     1    0.000    0.000    0.000    0.000 _parser.py:435(_parse_sub)
@end example

The first line indicates that 214 calls were monitored.  Of those calls, 207
were `primitive', meaning that the call was not induced via recursion. The
next line: @code{Ordered by: cumulative time} indicates the output is sorted
by the @code{cumtime} values. The column headings include:


@table @asis

@item ncalls

for the number of calls.

@item tottime

for the total time spent in the given function (and excluding time made in
calls to sub-functions)

@item percall

is the quotient of @code{tottime} divided by @code{ncalls}

@item cumtime

is the cumulative time spent in this and all subfunctions (from invocation
till exit). This figure is accurate `even' for recursive functions.

@item percall

is the quotient of @code{cumtime} divided by primitive calls

@item filename:lineno(function)

provides the respective data of each function
@end table

When there are two numbers in the first column (for example @code{3/1}), it means
that the function recursed.  The second value is the number of primitive calls
and the former is the total number of calls.  Note that when the function does
not recurse, these two values are the same, and only the single figure is
printed.

Instead of printing the output at the end of the profile run, you can save the
results to a file by specifying a filename to the @code{run()} function:

@example
import cProfile
import re
cProfile.run('re.compile("foo|bar")', 'restats')
@end example

The @ref{4b5d,,pstats.Stats} class reads profile results from a file and formats
them in various ways.
@anchor{library/profile profile-cli}@anchor{4b5e}
The files @ref{2b,,cProfile} and @ref{b4,,profile} can also be invoked as a script to
profile another script.  For example:

@example
python -m cProfile [-o output_file] [-s sort_order] (-m module | myscript.py)
@end example

@geindex cProfile command line option; -o
@anchor{library/profile cmdoption-cProfile-o}@anchor{4b5f}
@deffn {Option} @w{-}o <output_file>

Writes the profile results to a file instead of to stdout.
@end deffn

@geindex cProfile command line option; -s
@anchor{library/profile cmdoption-cProfile-s}@anchor{4b60}
@deffn {Option} @w{-}s <sort_order>

Specifies one of the @ref{4b61,,sort_stats()} sort values
to sort the output by.
This only applies when @ref{4b5f,,-o} is not supplied.
@end deffn

@geindex cProfile command line option; -m
@anchor{library/profile cmdoption-cProfile-m}@anchor{4b62}
@deffn {Option} @w{-}m <module>

Specifies that a module is being profiled instead of a script.


Added in version 3.7: Added the @code{-m} option to @ref{2b,,cProfile}.



Added in version 3.8: Added the @code{-m} option to @ref{b4,,profile}.

@end deffn

The @ref{b5,,pstats} module’s @ref{4b5d,,Stats} class has a variety of methods
for manipulating and printing the data saved into a profile results file:

@example
import pstats
from pstats import SortKey
p = pstats.Stats('restats')
p.strip_dirs().sort_stats(-1).print_stats()
@end example

The @ref{4b63,,strip_dirs()} method removed the extraneous path from all
the module names. The @ref{4b61,,sort_stats()} method sorted all the
entries according to the standard module/line/name string that is printed. The
@ref{4b64,,print_stats()} method printed out all the statistics.  You
might try the following sort calls:

@example
p.sort_stats(SortKey.NAME)
p.print_stats()
@end example

The first call will actually sort the list by function name, and the second call
will print out the statistics.  The following are some interesting calls to
experiment with:

@example
p.sort_stats(SortKey.CUMULATIVE).print_stats(10)
@end example

This sorts the profile by cumulative time in a function, and then only prints
the ten most significant lines.  If you want to understand what algorithms are
taking time, the above line is what you would use.

If you were looking to see what functions were looping a lot, and taking a lot
of time, you would do:

@example
p.sort_stats(SortKey.TIME).print_stats(10)
@end example

to sort according to time spent within each function, and then print the
statistics for the top ten functions.

You might also try:

@example
p.sort_stats(SortKey.FILENAME).print_stats('__init__')
@end example

This will sort all the statistics by file name, and then print out statistics
for only the class init methods (since they are spelled with @code{__init__} in
them).  As one final example, you could try:

@example
p.sort_stats(SortKey.TIME, SortKey.CUMULATIVE).print_stats(.5, 'init')
@end example

This line sorts statistics with a primary key of time, and a secondary key of
cumulative time, and then prints out some of the statistics. To be specific, the
list is first culled down to 50% (re: @code{.5}) of its original size, then only
lines containing @code{init} are maintained, and that sub-sub-list is printed.

If you wondered what functions called the above functions, you could now (@code{p}
is still sorted according to the last criteria) do:

@example
p.print_callers(.5, 'init')
@end example

and you would get a list of callers for each of the listed functions.

If you want more functionality, you’re going to have to read the manual, or
guess what the following functions do:

@example
p.print_callees()
p.add('restats')
@end example

Invoked as a script, the @ref{b5,,pstats} module is a statistics browser for
reading and examining profile dumps.  It has a simple line-oriented interface
(implemented using @ref{1a,,cmd}) and interactive help.

@node profile and cProfile Module Reference,The Stats Class,Instant User’s Manual,The Python Profilers
@anchor{library/profile module-cProfile}@anchor{2b}@anchor{library/profile profile-and-cprofile-module-reference}@anchor{4b65}
@subsubsection @code{profile} and @code{cProfile} Module Reference


@geindex module; cProfile

@geindex module; profile
@anchor{library/profile module-profile}@anchor{b4}
Both the @ref{b4,,profile} and @code{cProfile} modules provide the following
functions:

@geindex run() (in module profile)
@anchor{library/profile profile run}@anchor{4b66}
@deffn {Function} profile.run (command, filename=None, sort=-1)

This function takes a single argument that can be passed to the @ref{4a3,,exec()}
function, and an optional file name.  In all cases this routine executes:

@example
exec(command, __main__.__dict__, __main__.__dict__)
@end example

and gathers profiling statistics from the execution. If no file name is
present, then this function automatically creates a @ref{4b5d,,Stats}
instance and prints a simple profiling report. If the sort value is specified,
it is passed to this @code{Stats} instance to control how the
results are sorted.
@end deffn

@geindex runctx() (in module profile)
@anchor{library/profile profile runctx}@anchor{4b67}
@deffn {Function} profile.runctx (command, globals, locals, filename=None, sort=-1)

This function is similar to @ref{4b66,,run()}, with added arguments to supply the
globals and locals mappings for the `command' string. This routine
executes:

@example
exec(command, globals, locals)
@end example

and gathers profiling statistics as in the @ref{4b66,,run()} function above.
@end deffn

@geindex Profile (class in profile)
@anchor{library/profile profile Profile}@anchor{bdc}
@deffn {Class} profile.Profile (timer=None, timeunit=0.0, subcalls=True, builtins=True)

This class is normally only used if more precise control over profiling is
needed than what the @code{cProfile.run()} function provides.

A custom timer can be supplied for measuring how long code takes to run via
the `timer' argument. This must be a function that returns a single number
representing the current time. If the number is an integer, the `timeunit'
specifies a multiplier that specifies the duration of each unit of time. For
example, if the timer returns times measured in thousands of seconds, the
time unit would be @code{.001}.

Directly using the @code{Profile} class allows formatting profile results
without writing the profile data to a file:

@example
import cProfile, pstats, io
from pstats import SortKey
pr = cProfile.Profile()
pr.enable()
# ... do something ...
pr.disable()
s = io.StringIO()
sortby = SortKey.CUMULATIVE
ps = pstats.Stats(pr, stream=s).sort_stats(sortby)
ps.print_stats()
print(s.getvalue())
@end example

The @code{Profile} class can also be used as a context manager (supported
only in @code{cProfile} module. see @ref{2453,,Context Manager Types}):

@example
import cProfile

with cProfile.Profile() as pr:
    # ... do something ...

    pr.print_stats()
@end example


Changed in version 3.8: Added context manager support.


@geindex enable() (profile.Profile method)
@anchor{library/profile profile Profile enable}@anchor{4b68}
@deffn {Method} enable ()

Start collecting profiling data. Only in @code{cProfile}.
@end deffn

@geindex disable() (profile.Profile method)
@anchor{library/profile profile Profile disable}@anchor{4b69}
@deffn {Method} disable ()

Stop collecting profiling data. Only in @code{cProfile}.
@end deffn

@geindex create_stats() (profile.Profile method)
@anchor{library/profile profile Profile create_stats}@anchor{4b6a}
@deffn {Method} create_stats ()

Stop collecting profiling data and record the results internally
as the current profile.
@end deffn

@geindex print_stats() (profile.Profile method)
@anchor{library/profile profile Profile print_stats}@anchor{4b6b}
@deffn {Method} print_stats (sort=-1)

Create a @ref{4b5d,,Stats} object based on the current
profile and print the results to stdout.

The `sort' parameter specifies the sorting order of the displayed
statistics. It accepts a single key or a tuple of keys to enable
multi-level sorting, as in @ref{4b61,,Stats.sort_stats}.


Added in version 3.13: @code{print_stats()} now accepts a tuple of keys.

@end deffn

@geindex dump_stats() (profile.Profile method)
@anchor{library/profile profile Profile dump_stats}@anchor{4b6c}
@deffn {Method} dump_stats (filename)

Write the results of the current profile to `filename'.
@end deffn

@geindex run() (profile.Profile method)
@anchor{library/profile profile Profile run}@anchor{4b6d}
@deffn {Method} run (cmd)

Profile the cmd via @ref{4a3,,exec()}.
@end deffn

@geindex runctx() (profile.Profile method)
@anchor{library/profile profile Profile runctx}@anchor{4b6e}
@deffn {Method} runctx (cmd, globals, locals)

Profile the cmd via @ref{4a3,,exec()} with the specified global and
local environment.
@end deffn

@geindex runcall() (profile.Profile method)
@anchor{library/profile profile Profile runcall}@anchor{c76}
@deffn {Method} runcall (func, /, *args, **kwargs)

Profile @code{func(*args, **kwargs)}
@end deffn
@end deffn

Note that profiling will only work if the called command/function actually
returns.  If the interpreter is terminated (e.g. via a @ref{279,,sys.exit()} call
during the called command/function execution) no profiling results will be
printed.

@node The Stats Class,What Is Deterministic Profiling?,profile and cProfile Module Reference,The Python Profilers
@anchor{library/profile profile-stats}@anchor{4b6f}@anchor{library/profile the-stats-class}@anchor{4b70}
@subsubsection The @code{Stats} Class


Analysis of the profiler data is done using the @ref{4b5d,,Stats} class.

@geindex module; pstats

@geindex Stats (class in pstats)
@anchor{library/profile module-pstats}@anchor{b5}@anchor{library/profile pstats Stats}@anchor{4b5d}
@deffn {Class} pstats.Stats (*filenames or profile, stream=sys.stdout)

This class constructor creates an instance of a “statistics object” from a
`filename' (or list of filenames) or from a @code{Profile} instance. Output
will be printed to the stream specified by `stream'.

The file selected by the above constructor must have been created by the
corresponding version of @ref{b4,,profile} or @ref{2b,,cProfile}.  To be specific,
there is `no' file compatibility guaranteed with future versions of this
profiler, and there is no compatibility with files produced by other
profilers, or the same profiler run on a different operating system.  If
several files are provided, all the statistics for identical functions will
be coalesced, so that an overall view of several processes can be considered
in a single report.  If additional files need to be combined with data in an
existing @ref{4b5d,,Stats} object, the @ref{4b71,,add()} method
can be used.

Instead of reading the profile data from a file, a @code{cProfile.Profile}
or @ref{bdc,,profile.Profile} object can be used as the profile data source.

@code{Stats} objects have the following methods:

@geindex strip_dirs() (pstats.Stats method)
@anchor{library/profile pstats Stats strip_dirs}@anchor{4b63}
@deffn {Method} strip_dirs ()

This method for the @code{Stats} class removes all leading path
information from file names.  It is very useful in reducing the size of
the printout to fit within (close to) 80 columns.  This method modifies
the object, and the stripped information is lost.  After performing a
strip operation, the object is considered to have its entries in a
“random” order, as it was just after object initialization and loading.
If @ref{4b63,,strip_dirs()} causes two function names to be
indistinguishable (they are on the same line of the same filename, and
have the same function name), then the statistics for these two entries
are accumulated into a single entry.
@end deffn

@geindex add() (pstats.Stats method)
@anchor{library/profile pstats Stats add}@anchor{4b71}
@deffn {Method} add (*filenames)

This method of the @code{Stats} class accumulates additional profiling
information into the current profiling object.  Its arguments should refer
to filenames created by the corresponding version of @ref{4b66,,profile.run()}
or @code{cProfile.run()}. Statistics for identically named (re: file, line,
name) functions are automatically accumulated into single function
statistics.
@end deffn

@geindex dump_stats() (pstats.Stats method)
@anchor{library/profile pstats Stats dump_stats}@anchor{4b72}
@deffn {Method} dump_stats (filename)

Save the data loaded into the @code{Stats} object to a file named
`filename'.  The file is created if it does not exist, and is overwritten
if it already exists.  This is equivalent to the method of the same name
on the @ref{bdc,,profile.Profile} and @code{cProfile.Profile} classes.
@end deffn

@geindex sort_stats() (pstats.Stats method)
@anchor{library/profile pstats Stats sort_stats}@anchor{4b61}
@deffn {Method} sort_stats (*keys)

This method modifies the @code{Stats} object by sorting it according to
the supplied criteria.  The argument can be either a string or a SortKey
enum identifying the basis of a sort (example: @code{'time'}, @code{'name'},
@code{SortKey.TIME} or @code{SortKey.NAME}). The SortKey enums argument have
advantage over the string argument in that it is more robust and less
error prone.

When more than one key is provided, then additional keys are used as
secondary criteria when there is equality in all keys selected before
them.  For example, @code{sort_stats(SortKey.NAME, SortKey.FILE)} will sort
all the entries according to their function name, and resolve all ties
(identical function names) by sorting by file name.

For the string argument, abbreviations can be used for any key names, as
long as the abbreviation is unambiguous.

The following are the valid string and SortKey:


@multitable {xxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Valid String Arg

@tab

Valid enum Arg

@tab

Meaning

@item

@code{'calls'}

@tab

SortKey.CALLS

@tab

call count

@item

@code{'cumulative'}

@tab

SortKey.CUMULATIVE

@tab

cumulative time

@item

@code{'cumtime'}

@tab

N/A

@tab

cumulative time

@item

@code{'file'}

@tab

N/A

@tab

file name

@item

@code{'filename'}

@tab

SortKey.FILENAME

@tab

file name

@item

@code{'module'}

@tab

N/A

@tab

file name

@item

@code{'ncalls'}

@tab

N/A

@tab

call count

@item

@code{'pcalls'}

@tab

SortKey.PCALLS

@tab

primitive call count

@item

@code{'line'}

@tab

SortKey.LINE

@tab

line number

@item

@code{'name'}

@tab

SortKey.NAME

@tab

function name

@item

@code{'nfl'}

@tab

SortKey.NFL

@tab

name/file/line

@item

@code{'stdname'}

@tab

SortKey.STDNAME

@tab

standard name

@item

@code{'time'}

@tab

SortKey.TIME

@tab

internal time

@item

@code{'tottime'}

@tab

N/A

@tab

internal time

@end multitable


Note that all sorts on statistics are in descending order (placing most
time consuming items first), where as name, file, and line number searches
are in ascending order (alphabetical). The subtle distinction between
@code{SortKey.NFL} and @code{SortKey.STDNAME} is that the standard name is a
sort of the name as printed, which means that the embedded line numbers
get compared in an odd way.  For example, lines 3, 20, and 40 would (if
the file names were the same) appear in the string order 20, 3 and 40.
In contrast, @code{SortKey.NFL} does a numeric compare of the line numbers.
In fact, @code{sort_stats(SortKey.NFL)} is the same as
@code{sort_stats(SortKey.NAME, SortKey.FILENAME, SortKey.LINE)}.

For backward-compatibility reasons, the numeric arguments @code{-1}, @code{0},
@code{1}, and @code{2} are permitted.  They are interpreted as @code{'stdname'},
@code{'calls'}, @code{'time'}, and @code{'cumulative'} respectively.  If this old
style format (numeric) is used, only one sort key (the numeric key) will
be used, and additional arguments will be silently ignored.

@c For compatibility with the old profiler.


Added in version 3.7: Added the SortKey enum.

@end deffn

@geindex reverse_order() (pstats.Stats method)
@anchor{library/profile pstats Stats reverse_order}@anchor{4b73}
@deffn {Method} reverse_order ()

This method for the @code{Stats} class reverses the ordering of the
basic list within the object.  Note that by default ascending vs
descending order is properly selected based on the sort key of choice.

@c This method is provided primarily for compatibility with the old
@c profiler.
@end deffn

@geindex print_stats() (pstats.Stats method)
@anchor{library/profile pstats Stats print_stats}@anchor{4b64}
@deffn {Method} print_stats (*restrictions)

This method for the @code{Stats} class prints out a report as described
in the @ref{4b66,,profile.run()} definition.

The order of the printing is based on the last
@ref{4b61,,sort_stats()} operation done on the object (subject to
caveats in @ref{4b71,,add()} and
@ref{4b63,,strip_dirs()}).

The arguments provided (if any) can be used to limit the list down to the
significant entries.  Initially, the list is taken to be the complete set
of profiled functions.  Each restriction is either an integer (to select a
count of lines), or a decimal fraction between 0.0 and 1.0 inclusive (to
select a percentage of lines), or a string that will be interpreted as a
regular expression (to pattern match the standard name that is printed).
If several restrictions are provided, then they are applied sequentially.
For example:

@example
print_stats(.1, 'foo:')
@end example

would first limit the printing to first 10% of list, and then only print
functions that were part of filename @code{.*foo:}.  In contrast, the
command:

@example
print_stats('foo:', .1)
@end example

would limit the list to all functions having file names @code{.*foo:},
and then proceed to only print the first 10% of them.
@end deffn

@geindex print_callers() (pstats.Stats method)
@anchor{library/profile pstats Stats print_callers}@anchor{4b74}
@deffn {Method} print_callers (*restrictions)

This method for the @code{Stats} class prints a list of all functions
that called each function in the profiled database.  The ordering is
identical to that provided by @ref{4b64,,print_stats()}, and the
definition of the restricting argument is also identical.  Each caller is
reported on its own line.  The format differs slightly depending on the
profiler that produced the stats:


@itemize *

@item 
With @ref{b4,,profile}, a number is shown in parentheses after each caller
to show how many times this specific call was made.  For convenience, a
second non-parenthesized number repeats the cumulative time spent in the
function at the right.

@item 
With @ref{2b,,cProfile}, each caller is preceded by three numbers: the
number of times this specific call was made, and the total and
cumulative times spent in the current function while it was invoked by
this specific caller.
@end itemize
@end deffn

@geindex print_callees() (pstats.Stats method)
@anchor{library/profile pstats Stats print_callees}@anchor{4b75}
@deffn {Method} print_callees (*restrictions)

This method for the @code{Stats} class prints a list of all function
that were called by the indicated function.  Aside from this reversal of
direction of calls (re: called vs was called by), the arguments and
ordering are identical to the @ref{4b74,,print_callers()} method.
@end deffn

@geindex get_stats_profile() (pstats.Stats method)
@anchor{library/profile pstats Stats get_stats_profile}@anchor{4b76}
@deffn {Method} get_stats_profile ()

This method returns an instance of StatsProfile, which contains a mapping
of function names to instances of FunctionProfile. Each FunctionProfile
instance holds information related to the function’s profile such as how
long the function took to run, how many times it was called, etc…


Added in version 3.9: Added the following dataclasses: StatsProfile, FunctionProfile.
Added the following function: get_stats_profile.

@end deffn
@end deffn

@node What Is Deterministic Profiling?,Limitations,The Stats Class,The Python Profilers
@anchor{library/profile deterministic-profiling}@anchor{4b77}@anchor{library/profile what-is-deterministic-profiling}@anchor{4b78}
@subsubsection What Is Deterministic Profiling?


`Deterministic profiling' is meant to reflect the fact that all `function
call', `function return', and `exception' events are monitored, and precise
timings are made for the intervals between these events (during which time the
user’s code is executing).  In contrast, `statistical profiling' (which is
not done by this module) randomly samples the effective instruction pointer, and
deduces where time is being spent.  The latter technique traditionally involves
less overhead (as the code does not need to be instrumented), but provides only
relative indications of where time is being spent.

In Python, since there is an interpreter active during execution, the presence
of instrumented code is not required in order to do deterministic profiling.
Python automatically provides a `hook' (optional callback) for each event.
In addition, the interpreted nature of Python tends to add so much overhead to
execution, that deterministic profiling tends to only add small processing
overhead in typical applications.  The result is that deterministic profiling is
not that expensive, yet provides extensive run time statistics about the
execution of a Python program.

Call count statistics can be used to identify bugs in code (surprising counts),
and to identify possible inline-expansion points (high call counts).  Internal
time statistics can be used to identify “hot loops” that should be carefully
optimized.  Cumulative time statistics should be used to identify high level
errors in the selection of algorithms.  Note that the unusual handling of
cumulative times in this profiler allows statistics for recursive
implementations of algorithms to be directly compared to iterative
implementations.

@node Limitations,Calibration,What Is Deterministic Profiling?,The Python Profilers
@anchor{library/profile limitations}@anchor{4b79}@anchor{library/profile profile-limitations}@anchor{4b7a}
@subsubsection Limitations


One limitation has to do with accuracy of timing information. There is a
fundamental problem with deterministic profilers involving accuracy.  The most
obvious restriction is that the underlying “clock” is only ticking at a rate
(typically) of about .001 seconds.  Hence no measurements will be more accurate
than the underlying clock.  If enough measurements are taken, then the “error”
will tend to average out. Unfortunately, removing this first error induces a
second source of error.

The second problem is that it “takes a while” from when an event is dispatched
until the profiler’s call to get the time actually `gets' the state of the
clock.  Similarly, there is a certain lag when exiting the profiler event
handler from the time that the clock’s value was obtained (and then squirreled
away), until the user’s code is once again executing.  As a result, functions
that are called many times, or call many functions, will typically accumulate
this error. The error that accumulates in this fashion is typically less than
the accuracy of the clock (less than one clock tick), but it `can' accumulate
and become very significant.

The problem is more important with @ref{b4,,profile} than with the lower-overhead
@ref{2b,,cProfile}.  For this reason, @code{profile} provides a means of
calibrating itself for a given platform so that this error can be
probabilistically (on the average) removed. After the profiler is calibrated, it
will be more accurate (in a least square sense), but it will sometimes produce
negative numbers (when call counts are exceptionally low, and the gods of
probability work against you :-). )  Do `not' be alarmed by negative numbers in
the profile.  They should `only' appear if you have calibrated your profiler,
and the results are actually better than without calibration.

@node Calibration,Using a custom timer,Limitations,The Python Profilers
@anchor{library/profile calibration}@anchor{4b7b}@anchor{library/profile profile-calibration}@anchor{4b7c}
@subsubsection Calibration


The profiler of the @ref{b4,,profile} module subtracts a constant from each event
handling time to compensate for the overhead of calling the time function, and
socking away the results.  By default, the constant is 0. The following
procedure can be used to obtain a better constant for a given platform (see
@ref{4b7a,,Limitations}).

@example
import profile
pr = profile.Profile()
for i in range(5):
    print(pr.calibrate(10000))
@end example

The method executes the number of Python calls given by the argument, directly
and again under the profiler, measuring the time for both. It then computes the
hidden overhead per profiler event, and returns that as a float.  For example,
on a 1.8Ghz Intel Core i5 running macOS, and using Python’s time.process_time() as
the timer, the magical number is about 4.04e-6.

The object of this exercise is to get a fairly consistent result. If your
computer is `very' fast, or your timer function has poor resolution, you might
have to pass 100000, or even 1000000, to get consistent results.

When you have a consistent answer, there are three ways you can use it:

@example
import profile

# 1. Apply computed bias to all Profile instances created hereafter.
profile.Profile.bias = your_computed_bias

# 2. Apply computed bias to a specific Profile instance.
pr = profile.Profile()
pr.bias = your_computed_bias

# 3. Specify computed bias in instance constructor.
pr = profile.Profile(bias=your_computed_bias)
@end example

If you have a choice, you are better off choosing a smaller constant, and then
your results will “less often” show up as negative in profile statistics.

@node Using a custom timer,,Calibration,The Python Profilers
@anchor{library/profile profile-timers}@anchor{4b7d}@anchor{library/profile using-a-custom-timer}@anchor{4b7e}
@subsubsection Using a custom timer


If you want to change how current time is determined (for example, to force use
of wall-clock time or elapsed process time), pass the timing function you want
to the @code{Profile} class constructor:

@example
pr = profile.Profile(your_time_func)
@end example

The resulting profiler will then call @code{your_time_func}. Depending on whether
you are using @ref{bdc,,profile.Profile} or @code{cProfile.Profile},
@code{your_time_func}’s return value will be interpreted differently:


@table @asis

@item @ref{bdc,,profile.Profile}

@code{your_time_func} should return a single number, or a list of numbers whose
sum is the current time (like what @ref{1321,,os.times()} returns).  If the
function returns a single time number, or the list of returned numbers has
length 2, then you will get an especially fast version of the dispatch
routine.

Be warned that you should calibrate the profiler class for the timer function
that you choose (see @ref{4b7c,,Calibration}).  For most machines, a timer
that returns a lone integer value will provide the best results in terms of
low overhead during profiling.  (@ref{1321,,os.times()} is `pretty' bad, as it
returns a tuple of floating-point values).  If you want to substitute a
better timer in the cleanest fashion, derive a class and hardwire a
replacement dispatch method that best handles your timer call, along with the
appropriate calibration constant.

@item @code{cProfile.Profile}

@code{your_time_func} should return a single number.  If it returns integers,
you can also invoke the class constructor with a second argument specifying
the real duration of one unit of time.  For example, if
@code{your_integer_time_func} returns times measured in thousands of seconds,
you would construct the @code{Profile} instance as follows:

@example
pr = cProfile.Profile(your_integer_time_func, 0.001)
@end example

As the @code{cProfile.Profile} class cannot be calibrated, custom timer
functions should be used with care and should be as fast as possible.  For
the best results with a custom timer, it might be necessary to hard-code it
in the C source of the internal @code{_lsprof} module.
@end table

Python 3.3 adds several new functions in @ref{f4,,time} that can be used to make
precise measurements of process or wall-clock time. For example, see
@ref{c80,,time.perf_counter()}.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node timeit — Measure execution time of small code snippets,trace — Trace or track Python statement execution,The Python Profilers,Debugging and Profiling
@anchor{library/timeit doc}@anchor{4b7f}@anchor{library/timeit module-timeit}@anchor{f5}@anchor{library/timeit timeit-measure-execution-time-of-small-code-snippets}@anchor{4b80}@anchor{library/timeit translation-repo}@anchor{4b81}
@subsection @code{timeit} — Measure execution time of small code snippets


@geindex module; timeit

`Source code:' Lib/timeit.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/timeit.py}

@geindex Benchmarking
@geindex Performance


__________________________________________________________________


This module provides a simple way to time small bits of Python code. It has both
a @ref{4b82,,Command-Line Interface} as well as a @ref{4b83,,callable}
one.  It avoids a number of common traps for measuring execution times.
See also Tim Peters’ introduction to the “Algorithms” chapter in the second
edition of `Python Cookbook', published by O’Reilly.

@menu
* Basic Examples: Basic Examples<2>. 
* Python Interface:: 
* Command-Line Interface: Command-Line Interface<3>. 
* Examples: Examples<31>. 

@end menu

@node Basic Examples<2>,Python Interface,,timeit — Measure execution time of small code snippets
@anchor{library/timeit basic-examples}@anchor{4b84}
@subsubsection Basic Examples


The following example shows how the @ref{4b82,,Command-Line Interface}
can be used to compare three different expressions:

@example
$ python -m timeit "'-'.join(str(n) for n in range(100))"
10000 loops, best of 5: 30.2 usec per loop
$ python -m timeit "'-'.join([str(n) for n in range(100)])"
10000 loops, best of 5: 27.5 usec per loop
$ python -m timeit "'-'.join(map(str, range(100)))"
10000 loops, best of 5: 23.2 usec per loop
@end example

This can be achieved from the @ref{4b83,,Python Interface} with:

@example
>>> import timeit
>>> timeit.timeit('"-".join(str(n) for n in range(100))', number=10000)
0.3018611848820001
>>> timeit.timeit('"-".join([str(n) for n in range(100)])', number=10000)
0.2727368790656328
>>> timeit.timeit('"-".join(map(str, range(100)))', number=10000)
0.23702679807320237
@end example

A callable can also be passed from the @ref{4b83,,Python Interface}:

@example
>>> timeit.timeit(lambda: "-".join(map(str, range(100))), number=10000)
0.19665591977536678
@end example

Note however that @ref{1084,,timeit()} will automatically determine the number of
repetitions only when the command-line interface is used.  In the
@ref{4b85,,Examples} section you can find more advanced examples.

@node Python Interface,Command-Line Interface<3>,Basic Examples<2>,timeit — Measure execution time of small code snippets
@anchor{library/timeit id1}@anchor{4b86}@anchor{library/timeit python-interface}@anchor{4b83}
@subsubsection Python Interface


The module defines three convenience functions and a public class:

@geindex timeit() (in module timeit)
@anchor{library/timeit timeit timeit}@anchor{1084}
@deffn {Function} timeit.timeit (stmt='pass', setup='pass', timer=<default timer>, number=1000000, globals=None)

Create a @ref{16d4,,Timer} instance with the given statement, `setup' code and
`timer' function and run its @code{timeit()} method with `number' executions.
The optional `globals' argument specifies a namespace in which to execute the
code.


Changed in version 3.5: The optional `globals' parameter was added.

@end deffn

@geindex repeat() (in module timeit)
@anchor{library/timeit timeit repeat}@anchor{4b87}
@deffn {Function} timeit.repeat (stmt='pass', setup='pass', timer=<default timer>, repeat=5, number=1000000, globals=None)

Create a @ref{16d4,,Timer} instance with the given statement, `setup' code and
`timer' function and run its @code{repeat()} method with the given `repeat'
count and `number' executions.  The optional `globals' argument specifies a
namespace in which to execute the code.


Changed in version 3.5: The optional `globals' parameter was added.



Changed in version 3.7: Default value of `repeat' changed from 3 to 5.

@end deffn

@geindex default_timer() (in module timeit)
@anchor{library/timeit timeit default_timer}@anchor{4b88}
@deffn {Function} timeit.default_timer ()

The default timer, which is always time.perf_counter(), returns float seconds.
An alternative, time.perf_counter_ns, returns integer nanoseconds.


Changed in version 3.3: @ref{c80,,time.perf_counter()} is now the default timer.

@end deffn

@geindex Timer (class in timeit)
@anchor{library/timeit timeit Timer}@anchor{16d4}
@deffn {Class} timeit.Timer (stmt='pass', setup='pass', timer=<timer function>, globals=None)

Class for timing execution speed of small code snippets.

The constructor takes a statement to be timed, an additional statement used
for setup, and a timer function.  Both statements default to @code{'pass'};
the timer function is platform-dependent (see the module doc string).
`stmt' and `setup' may also contain multiple statements separated by @code{;}
or newlines, as long as they don’t contain multi-line string literals.  The
statement will by default be executed within timeit’s namespace; this behavior
can be controlled by passing a namespace to `globals'.

To measure the execution time of the first statement, use the @ref{eef,,timeit()}
method.  The @ref{4b89,,repeat()} and @ref{eee,,autorange()} methods are convenience
methods to call @code{timeit()} multiple times.

The execution time of `setup' is excluded from the overall timed execution run.

The `stmt' and `setup' parameters can also take objects that are callable
without arguments.  This will embed calls to them in a timer function that
will then be executed by @ref{eef,,timeit()}.  Note that the timing overhead is a
little larger in this case because of the extra function calls.


Changed in version 3.5: The optional `globals' parameter was added.


@geindex timeit() (timeit.Timer method)
@anchor{library/timeit timeit Timer timeit}@anchor{eef}
@deffn {Method} timeit (number=1000000)

Time `number' executions of the main statement.  This executes the setup
statement once, and then returns the time it takes to execute the main
statement a number of times.  The default timer returns seconds as a float.
The argument is the number of times through the loop, defaulting to one
million.  The main statement, the setup statement and the timer function
to be used are passed to the constructor.

@cartouche
@quotation Note 
By default, @code{timeit()} temporarily turns off @ref{1826,,garbage collection} during the timing.  The advantage of this approach is that
it makes independent timings more comparable.  The disadvantage is
that GC may be an important component of the performance of the
function being measured.  If so, GC can be re-enabled as the first
statement in the `setup' string.  For example:

@example
timeit.Timer('for i in range(10): oct(i)', 'gc.enable()').timeit()
@end example
@end quotation
@end cartouche
@end deffn

@geindex autorange() (timeit.Timer method)
@anchor{library/timeit timeit Timer autorange}@anchor{eee}
@deffn {Method} autorange (callback=None)

Automatically determine how many times to call @ref{eef,,timeit()}.

This is a convenience function that calls @ref{eef,,timeit()} repeatedly
so that the total time >= 0.2 second, returning the eventual
(number of loops, time taken for that number of loops). It calls
@code{timeit()} with increasing numbers from the sequence 1, 2, 5,
10, 20, 50, … until the time taken is at least 0.2 seconds.

If `callback' is given and is not @code{None}, it will be called after
each trial with two arguments: @code{callback(number, time_taken)}.


Added in version 3.6.

@end deffn

@geindex repeat() (timeit.Timer method)
@anchor{library/timeit timeit Timer repeat}@anchor{4b89}
@deffn {Method} repeat (repeat=5, number=1000000)

Call @ref{eef,,timeit()} a few times.

This is a convenience function that calls the @ref{eef,,timeit()} repeatedly,
returning a list of results.  The first argument specifies how many times
to call @code{timeit()}.  The second argument specifies the `number'
argument for @code{timeit()}.

@cartouche
@quotation Note 
It’s tempting to calculate mean and standard deviation from the result
vector and report these.  However, this is not very useful.
In a typical case, the lowest value gives a lower bound for how fast
your machine can run the given code snippet; higher values in the
result vector are typically not caused by variability in Python’s
speed, but by other processes interfering with your timing accuracy.
So the @ref{1111,,min()} of the result is probably the only number you
should be interested in.  After that, you should look at the entire
vector and apply common sense rather than statistics.
@end quotation
@end cartouche


Changed in version 3.7: Default value of `repeat' changed from 3 to 5.

@end deffn

@geindex print_exc() (timeit.Timer method)
@anchor{library/timeit timeit Timer print_exc}@anchor{4b8a}
@deffn {Method} print_exc (file=None)

Helper to print a traceback from the timed code.

Typical use:

@example
t = Timer(...)       # outside the try/except
try:
    t.timeit(...)    # or t.repeat(...)
except Exception:
    t.print_exc()
@end example

The advantage over the standard traceback is that source lines in the
compiled template will be displayed.  The optional `file' argument directs
where the traceback is sent; it defaults to @ref{b39,,sys.stderr}.
@end deffn
@end deffn

@node Command-Line Interface<3>,Examples<31>,Python Interface,timeit — Measure execution time of small code snippets
@anchor{library/timeit command-line-interface}@anchor{4b8b}@anchor{library/timeit timeit-command-line-interface}@anchor{4b82}
@subsubsection Command-Line Interface


When called as a program from the command line, the following form is used:

@example
python -m timeit [-n N] [-r N] [-u U] [-s S] [-p] [-v] [-h] [statement ...]
@end example

Where the following options are understood:

@geindex timeit command line option; -n
@geindex timeit command line option; --number
@anchor{library/timeit cmdoption-timeit-n}@anchor{4b8c}@anchor{library/timeit cmdoption-timeit-number}@anchor{4b8d}
@deffn {Option} @w{-}n N, @w{-}@w{-}number=N

how many times to execute ‘statement’
@end deffn

@geindex timeit command line option; -r
@geindex timeit command line option; --repeat
@anchor{library/timeit cmdoption-timeit-r}@anchor{4b8e}@anchor{library/timeit cmdoption-timeit-repeat}@anchor{4b8f}
@deffn {Option} @w{-}r N, @w{-}@w{-}repeat=N

how many times to repeat the timer (default 5)
@end deffn

@geindex timeit command line option; -s
@geindex timeit command line option; --setup
@anchor{library/timeit cmdoption-timeit-s}@anchor{4b90}@anchor{library/timeit cmdoption-timeit-setup}@anchor{4b91}
@deffn {Option} @w{-}s S, @w{-}@w{-}setup=S

statement to be executed once initially (default @code{pass})
@end deffn

@geindex timeit command line option; -p
@geindex timeit command line option; --process
@anchor{library/timeit cmdoption-timeit-p}@anchor{4b92}@anchor{library/timeit cmdoption-timeit-process}@anchor{4b93}
@deffn {Option} @w{-}p, @w{-}@w{-}process

measure process time, not wallclock time, using @ref{c81,,time.process_time()}
instead of @ref{c80,,time.perf_counter()}, which is the default


Added in version 3.3.

@end deffn

@geindex timeit command line option; -u
@geindex timeit command line option; --unit
@anchor{library/timeit cmdoption-timeit-u}@anchor{4b94}@anchor{library/timeit cmdoption-timeit-unit}@anchor{4b95}
@deffn {Option} @w{-}u, @w{-}@w{-}unit=U

specify a time unit for timer output; can select @code{nsec}, @code{usec}, @code{msec}, or @code{sec}


Added in version 3.5.

@end deffn

@geindex timeit command line option; -v
@geindex timeit command line option; --verbose
@anchor{library/timeit cmdoption-timeit-v}@anchor{4b96}@anchor{library/timeit cmdoption-timeit-verbose}@anchor{4b97}
@deffn {Option} @w{-}v, @w{-}@w{-}verbose

print raw timing results; repeat for more digits precision
@end deffn

@geindex timeit command line option; -h
@geindex timeit command line option; --help
@anchor{library/timeit cmdoption-timeit-h}@anchor{4b98}@anchor{library/timeit cmdoption-timeit-help}@anchor{4b99}
@deffn {Option} @w{-}h, @w{-}@w{-}help

print a short usage message and exit
@end deffn

A multi-line statement may be given by specifying each line as a separate
statement argument; indented lines are possible by enclosing an argument in
quotes and using leading spaces.  Multiple @ref{4b90,,-s} options are treated
similarly.

If @ref{4b8c,,-n} is not given, a suitable number of loops is calculated by trying
increasing numbers from the sequence 1, 2, 5, 10, 20, 50, … until the total
time is at least 0.2 seconds.

@ref{4b88,,default_timer()} measurements can be affected by other programs running on
the same machine, so the best thing to do when accurate timing is necessary is
to repeat the timing a few times and use the best time.  The @ref{4b8e,,-r}
option is good for this; the default of 5 repetitions is probably enough in
most cases.  You can use @ref{c81,,time.process_time()} to measure CPU time.

@cartouche
@quotation Note 
There is a certain baseline overhead associated with executing a pass statement.
The code here doesn’t try to hide it, but you should be aware of it.  The
baseline overhead can be measured by invoking the program without arguments,
and it might differ between Python versions.
@end quotation
@end cartouche

@node Examples<31>,,Command-Line Interface<3>,timeit — Measure execution time of small code snippets
@anchor{library/timeit examples}@anchor{4b9a}@anchor{library/timeit timeit-examples}@anchor{4b85}
@subsubsection Examples


It is possible to provide a setup statement that is executed only once at the beginning:

@example
$ python -m timeit -s "text = 'sample string'; char = 'g'" "char in text"
5000000 loops, best of 5: 0.0877 usec per loop
$ python -m timeit -s "text = 'sample string'; char = 'g'" "text.find(char)"
1000000 loops, best of 5: 0.342 usec per loop
@end example

In the output, there are three fields. The loop count, which tells you how many
times the statement body was run per timing loop repetition. The repetition
count (‘best of 5’) which tells you how many times the timing loop was
repeated, and finally the time the statement body took on average within the
best repetition of the timing loop. That is, the time the fastest repetition
took divided by the loop count.

@example
>>> import timeit
>>> timeit.timeit('char in text', setup='text = "sample string"; char = "g"')
0.41440500499993504
>>> timeit.timeit('text.find(char)', setup='text = "sample string"; char = "g"')
1.7246671520006203
@end example

The same can be done using the @ref{16d4,,Timer} class and its methods:

@example
>>> import timeit
>>> t = timeit.Timer('char in text', setup='text = "sample string"; char = "g"')
>>> t.timeit()
0.3955516149999312
>>> t.repeat()
[0.40183617287970225, 0.37027556854118704, 0.38344867356679524, 0.3712595970846668, 0.37866875250654886]
@end example

The following examples show how to time expressions that contain multiple lines.
Here we compare the cost of using @ref{6fa,,hasattr()} vs. @ref{8fa,,try}/@ref{1ac,,except}
to test for missing and present object attributes:

@example
$ python -m timeit "try:" "  str.__bool__" "except AttributeError:" "  pass"
20000 loops, best of 5: 15.7 usec per loop
$ python -m timeit "if hasattr(str, '__bool__'): pass"
50000 loops, best of 5: 4.26 usec per loop

$ python -m timeit "try:" "  int.__bool__" "except AttributeError:" "  pass"
200000 loops, best of 5: 1.43 usec per loop
$ python -m timeit "if hasattr(int, '__bool__'): pass"
100000 loops, best of 5: 2.23 usec per loop
@end example

@example
>>> import timeit
>>> # attribute is missing
>>> s = """\
... try:
...     str.__bool__
... except AttributeError:
...     pass
... """
>>> timeit.timeit(stmt=s, number=100000)
0.9138244460009446
>>> s = "if hasattr(str, '__bool__'): pass"
>>> timeit.timeit(stmt=s, number=100000)
0.5829014980008651
>>>
>>> # attribute is present
>>> s = """\
... try:
...     int.__bool__
... except AttributeError:
...     pass
... """
>>> timeit.timeit(stmt=s, number=100000)
0.04215312199994514
>>> s = "if hasattr(int, '__bool__'): pass"
>>> timeit.timeit(stmt=s, number=100000)
0.08588060699912603
@end example

To give the @code{timeit} module access to functions you define, you can pass a
`setup' parameter which contains an import statement:

@example
def test():
    """Stupid test function"""
    L = [i for i in range(100)]

if __name__ == '__main__':
    import timeit
    print(timeit.timeit("test()", setup="from __main__ import test"))
@end example

Another option is to pass @ref{1c4d,,globals()} to the  `globals' parameter, which will cause the code
to be executed within your current global namespace.  This can be more convenient
than individually specifying imports:

@example
def f(x):
    return x**2
def g(x):
    return x**4
def h(x):
    return x**8

import timeit
print(timeit.timeit('[func(42) for func in (f,g,h)]', globals=globals()))
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node trace — Trace or track Python statement execution,tracemalloc — Trace memory allocations,timeit — Measure execution time of small code snippets,Debugging and Profiling
@anchor{library/trace doc}@anchor{4b9b}@anchor{library/trace module-trace}@anchor{104}@anchor{library/trace trace-trace-or-track-python-statement-execution}@anchor{4b9c}@anchor{library/trace translation-repo}@anchor{4b9d}
@subsection @code{trace} — Trace or track Python statement execution


@geindex module; trace

`Source code:' Lib/trace.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/trace.py}


__________________________________________________________________


The @code{trace} module allows you to trace program execution, generate
annotated statement coverage listings, print caller/callee relationships and
list functions executed during a program run.  It can be used in another program
or from the command line.


@subsubheading See also



@table @asis

@item Coverage.py@footnote{https://coverage.readthedocs.io/}

A popular third-party coverage tool that provides HTML
output along with advanced features such as branch coverage.
@end table


@menu
* Command-Line Usage: Command-Line Usage<2>. 
* Programmatic Interface:: 

@end menu

@node Command-Line Usage<2>,Programmatic Interface,,trace — Trace or track Python statement execution
@anchor{library/trace command-line-usage}@anchor{4b9e}@anchor{library/trace trace-cli}@anchor{4b9f}
@subsubsection Command-Line Usage


The @code{trace} module can be invoked from the command line.  It can be as
simple as

@example
python -m trace --count -C . somefile.py ...
@end example

The above will execute @code{somefile.py} and generate annotated listings of
all Python modules imported during the execution into the current directory.

@geindex trace command line option; --help
@anchor{library/trace cmdoption-trace-help}@anchor{4ba0}
@deffn {Option} @w{-}@w{-}help

Display usage and exit.
@end deffn

@geindex trace command line option; --version
@anchor{library/trace cmdoption-trace-version}@anchor{4ba1}
@deffn {Option} @w{-}@w{-}version

Display the version of the module and exit.
@end deffn


Added in version 3.8: Added @code{--module} option that allows running an executable module.


@menu
* Main options:: 
* Modifiers:: 
* Filters:: 

@end menu

@node Main options,Modifiers,,Command-Line Usage<2>
@anchor{library/trace main-options}@anchor{4ba2}
@subsubsection Main options


At least one of the following options must be specified when invoking
@code{trace}.  The @ref{4ba3,,--listfuncs} option is mutually exclusive with
the @ref{4ba4,,--trace} and @ref{4ba5,,--count} options. When
@code{--listfuncs} is provided, neither @code{--count} nor
@code{--trace} are accepted, and vice versa.

@geindex trace command line option; -c
@geindex trace command line option; --count
@anchor{library/trace cmdoption-trace-c}@anchor{4ba5}@anchor{library/trace cmdoption-trace-count}@anchor{4ba6}
@deffn {Option} @w{-}c, @w{-}@w{-}count

Produce a set of annotated listing files upon program completion that shows
how many times each statement was executed.  See also
@ref{4ba7,,--coverdir}, @ref{4ba8,,--file} and
@ref{4ba9,,--no-report} below.
@end deffn

@geindex trace command line option; -t
@geindex trace command line option; --trace
@anchor{library/trace cmdoption-trace-t}@anchor{4ba4}@anchor{library/trace cmdoption-trace-trace}@anchor{4baa}
@deffn {Option} @w{-}t, @w{-}@w{-}trace

Display lines as they are executed.
@end deffn

@geindex trace command line option; -l
@geindex trace command line option; --listfuncs
@anchor{library/trace cmdoption-trace-l}@anchor{4ba3}@anchor{library/trace cmdoption-trace-listfuncs}@anchor{4bab}
@deffn {Option} @w{-}l, @w{-}@w{-}listfuncs

Display the functions executed by running the program.
@end deffn

@geindex trace command line option; -r
@geindex trace command line option; --report
@anchor{library/trace cmdoption-trace-r}@anchor{4bac}@anchor{library/trace cmdoption-trace-report}@anchor{4bad}
@deffn {Option} @w{-}r, @w{-}@w{-}report

Produce an annotated list from an earlier program run that used the
@ref{4ba5,,--count} and @ref{4ba8,,--file} option.  This does not
execute any code.
@end deffn

@geindex trace command line option; -T
@geindex trace command line option; --trackcalls
@anchor{library/trace cmdoption-trace-T}@anchor{4bae}@anchor{library/trace cmdoption-trace-trackcalls}@anchor{4baf}
@deffn {Option} @w{-}T, @w{-}@w{-}trackcalls

Display the calling relationships exposed by running the program.
@end deffn

@node Modifiers,Filters,Main options,Command-Line Usage<2>
@anchor{library/trace modifiers}@anchor{4bb0}
@subsubsection Modifiers


@geindex trace command line option; -f
@geindex trace command line option; --file
@anchor{library/trace cmdoption-trace-f}@anchor{4ba8}@anchor{library/trace cmdoption-trace-file}@anchor{4bb1}
@deffn {Option} @w{-}f, @w{-}@w{-}file=<file>

Name of a file to accumulate counts over several tracing runs.  Should be
used with the @ref{4ba5,,--count} option.
@end deffn

@geindex trace command line option; -C
@geindex trace command line option; --coverdir
@anchor{library/trace cmdoption-trace-C}@anchor{4ba7}@anchor{library/trace cmdoption-trace-coverdir}@anchor{4bb2}
@deffn {Option} @w{-}C, @w{-}@w{-}coverdir=<dir>

Directory where the report files go.  The coverage report for
@code{package.module} is written to file @code{`dir'/`package'/`module'.cover}.
@end deffn

@geindex trace command line option; -m
@geindex trace command line option; --missing
@anchor{library/trace cmdoption-trace-m}@anchor{4bb3}@anchor{library/trace cmdoption-trace-missing}@anchor{4bb4}
@deffn {Option} @w{-}m, @w{-}@w{-}missing

When generating annotated listings, mark lines which were not executed with
@code{>>>>>>}.
@end deffn

@geindex trace command line option; -s
@geindex trace command line option; --summary
@anchor{library/trace cmdoption-trace-s}@anchor{4bb5}@anchor{library/trace cmdoption-trace-summary}@anchor{4bb6}
@deffn {Option} @w{-}s, @w{-}@w{-}summary

When using @ref{4ba5,,--count} or @ref{4bac,,--report}, write a brief
summary to stdout for each file processed.
@end deffn

@geindex trace command line option; -R
@geindex trace command line option; --no-report
@anchor{library/trace cmdoption-trace-R}@anchor{4ba9}@anchor{library/trace cmdoption-trace-no-report}@anchor{4bb7}
@deffn {Option} @w{-}R, @w{-}@w{-}no@w{-}report

Do not generate annotated listings.  This is useful if you intend to make
several runs with @ref{4ba5,,--count}, and then produce a single set of
annotated listings at the end.
@end deffn

@geindex trace command line option; -g
@geindex trace command line option; --timing
@anchor{library/trace cmdoption-trace-g}@anchor{4bb8}@anchor{library/trace cmdoption-trace-timing}@anchor{4bb9}
@deffn {Option} @w{-}g, @w{-}@w{-}timing

Prefix each line with the time since the program started.  Only used while
tracing.
@end deffn

@node Filters,,Modifiers,Command-Line Usage<2>
@anchor{library/trace filters}@anchor{4bba}
@subsubsection Filters


These options may be repeated multiple times.

@geindex trace command line option; --ignore-module
@anchor{library/trace cmdoption-trace-ignore-module}@anchor{4bbb}
@deffn {Option} @w{-}@w{-}ignore@w{-}module=<mod>

Ignore each of the given module names and its submodules (if it is a
package).  The argument can be a list of names separated by a comma.
@end deffn

@geindex trace command line option; --ignore-dir
@anchor{library/trace cmdoption-trace-ignore-dir}@anchor{4bbc}
@deffn {Option} @w{-}@w{-}ignore@w{-}dir=<dir>

Ignore all modules and packages in the named directory and subdirectories.
The argument can be a list of directories separated by @ref{2177,,os.pathsep}.
@end deffn

@node Programmatic Interface,,Command-Line Usage<2>,trace — Trace or track Python statement execution
@anchor{library/trace programmatic-interface}@anchor{4bbd}@anchor{library/trace trace-api}@anchor{4bbe}
@subsubsection Programmatic Interface


@geindex Trace (class in trace)
@anchor{library/trace trace Trace}@anchor{4bbf}
@deffn {Class} trace.Trace (count=1, trace=1, countfuncs=0, countcallers=0, ignoremods=(), ignoredirs=(), infile=None, outfile=None, timing=False)

Create an object to trace execution of a single statement or expression.  All
parameters are optional.  `count' enables counting of line numbers.  `trace'
enables line execution tracing.  `countfuncs' enables listing of the
functions called during the run.  `countcallers' enables call relationship
tracking.  `ignoremods' is a list of modules or packages to ignore.
`ignoredirs' is a list of directories whose modules or packages should be
ignored.  `infile' is the name of the file from which to read stored count
information.  `outfile' is the name of the file in which to write updated
count information.  `timing' enables a timestamp relative to when tracing was
started to be displayed.

@geindex run() (trace.Trace method)
@anchor{library/trace trace Trace run}@anchor{4bc0}
@deffn {Method} run (cmd)

Execute the command and gather statistics from the execution with
the current tracing parameters.  `cmd' must be a string or code object,
suitable for passing into @ref{4a3,,exec()}.
@end deffn

@geindex runctx() (trace.Trace method)
@anchor{library/trace trace Trace runctx}@anchor{4bc1}
@deffn {Method} runctx (cmd, globals=None, locals=None)

Execute the command and gather statistics from the execution with the
current tracing parameters, in the defined global and local
environments.  If not defined, `globals' and `locals' default to empty
dictionaries.
@end deffn

@geindex runfunc() (trace.Trace method)
@anchor{library/trace trace Trace runfunc}@anchor{c78}
@deffn {Method} runfunc (func, /, *args, **kwds)

Call `func' with the given arguments under control of the @code{Trace}
object with the current tracing parameters.
@end deffn

@geindex results() (trace.Trace method)
@anchor{library/trace trace Trace results}@anchor{4bc2}
@deffn {Method} results ()

Return a @ref{4bc3,,CoverageResults} object that contains the cumulative
results of all previous calls to @code{run}, @code{runctx} and @code{runfunc}
for the given @code{Trace} instance.  Does not reset the accumulated
trace results.
@end deffn
@end deffn

@geindex CoverageResults (class in trace)
@anchor{library/trace trace CoverageResults}@anchor{4bc3}
@deffn {Class} trace.CoverageResults

A container for coverage results, created by @ref{4bc2,,Trace.results()}.  Should
not be created directly by the user.

@geindex update() (trace.CoverageResults method)
@anchor{library/trace trace CoverageResults update}@anchor{4bc4}
@deffn {Method} update (other)

Merge in data from another @code{CoverageResults} object.
@end deffn

@geindex write_results() (trace.CoverageResults method)
@anchor{library/trace trace CoverageResults write_results}@anchor{4bc5}
@deffn {Method} write_results (show_missing=True, summary=False, coverdir=None, *, ignore_missing_files=False)

Write coverage results.  Set `show_missing' to show lines that had no
hits.  Set `summary' to include in the output the coverage summary per
module.  `coverdir' specifies the directory into which the coverage
result files will be output.  If @code{None}, the results for each source
file are placed in its directory.

If `ignore_missing_files' is @code{True}, coverage counts for files that no
longer exist are silently ignored. Otherwise, a missing file will
raise a @ref{266,,FileNotFoundError}.


Changed in version 3.13: Added `ignore_missing_files' parameter.

@end deffn
@end deffn

A simple example demonstrating the use of the programmatic interface:

@example
import sys
import trace

# create a Trace object, telling it what to ignore, and whether to
# do tracing or line-counting or both.
tracer = trace.Trace(
    ignoredirs=[sys.prefix, sys.exec_prefix],
    trace=0,
    count=1)

# run the new command using the given tracer
tracer.run('main()')

# make a report, placing output in the current directory
r = tracer.results()
r.write_results(show_missing=True, coverdir=".")
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node tracemalloc — Trace memory allocations,,trace — Trace or track Python statement execution,Debugging and Profiling
@anchor{library/tracemalloc doc}@anchor{4bc6}@anchor{library/tracemalloc module-tracemalloc}@anchor{106}@anchor{library/tracemalloc tracemalloc-trace-memory-allocations}@anchor{4bc7}@anchor{library/tracemalloc translation-repo}@anchor{4bc8}
@subsection @code{tracemalloc} — Trace memory allocations


@geindex module; tracemalloc


Added in version 3.4.


`Source code:' Lib/tracemalloc.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/tracemalloc.py}


__________________________________________________________________


The tracemalloc module is a debug tool to trace memory blocks allocated by
Python. It provides the following information:


@itemize *

@item 
Traceback where an object was allocated

@item 
Statistics on allocated memory blocks per filename and per line number:
total size, number and average size of allocated memory blocks

@item 
Compute the differences between two snapshots to detect memory leaks
@end itemize

To trace most memory blocks allocated by Python, the module should be started
as early as possible by setting the 
@geindex PYTHONTRACEMALLOC
@geindex environment variable; PYTHONTRACEMALLOC
@ref{2170,,PYTHONTRACEMALLOC} environment
variable to @code{1}, or by using @ref{170,,-X} @code{tracemalloc} command line
option. The @ref{216f,,tracemalloc.start()} function can be called at runtime to
start tracing Python memory allocations.

By default, a trace of an allocated memory block only stores the most recent
frame (1 frame). To store 25 frames at startup: set the
@geindex PYTHONTRACEMALLOC
@geindex environment variable; PYTHONTRACEMALLOC
@ref{2170,,PYTHONTRACEMALLOC} environment variable to @code{25}, or use the
@ref{170,,-X} @code{tracemalloc=25} command line option.

@menu
* Examples: Examples<32>. 
* API:: 

@end menu

@node Examples<32>,API,,tracemalloc — Trace memory allocations
@anchor{library/tracemalloc examples}@anchor{4bc9}
@subsubsection Examples


@menu
* Display the top 10:: 
* Compute differences:: 
* Get the traceback of a memory block:: 
* Pretty top:: 

@end menu

@node Display the top 10,Compute differences,,Examples<32>
@anchor{library/tracemalloc display-the-top-10}@anchor{4bca}
@subsubsection Display the top 10


Display the 10 files allocating the most memory:

@example
import tracemalloc

tracemalloc.start()

# ... run your application ...

snapshot = tracemalloc.take_snapshot()
top_stats = snapshot.statistics('lineno')

print("[ Top 10 ]")
for stat in top_stats[:10]:
    print(stat)
@end example

Example of output of the Python test suite:

@example
[ Top 10 ]
<frozen importlib._bootstrap>:716: size=4855 KiB, count=39328, average=126 B
<frozen importlib._bootstrap>:284: size=521 KiB, count=3199, average=167 B
/usr/lib/python3.4/collections/__init__.py:368: size=244 KiB, count=2315, average=108 B
/usr/lib/python3.4/unittest/case.py:381: size=185 KiB, count=779, average=243 B
/usr/lib/python3.4/unittest/case.py:402: size=154 KiB, count=378, average=416 B
/usr/lib/python3.4/abc.py:133: size=88.7 KiB, count=347, average=262 B
<frozen importlib._bootstrap>:1446: size=70.4 KiB, count=911, average=79 B
<frozen importlib._bootstrap>:1454: size=52.0 KiB, count=25, average=2131 B
<string>:5: size=49.7 KiB, count=148, average=344 B
/usr/lib/python3.4/sysconfig.py:411: size=48.0 KiB, count=1, average=48.0 KiB
@end example

We can see that Python loaded @code{4855 KiB} data (bytecode and constants) from
modules and that the @ref{1e,,collections} module allocated @code{244 KiB} to build
@ref{4e1,,namedtuple} types.

See @ref{4bcb,,Snapshot.statistics()} for more options.

@node Compute differences,Get the traceback of a memory block,Display the top 10,Examples<32>
@anchor{library/tracemalloc compute-differences}@anchor{4bcc}
@subsubsection Compute differences


Take two snapshots and display the differences:

@example
import tracemalloc
tracemalloc.start()
# ... start your application ...

snapshot1 = tracemalloc.take_snapshot()
# ... call the function leaking memory ...
snapshot2 = tracemalloc.take_snapshot()

top_stats = snapshot2.compare_to(snapshot1, 'lineno')

print("[ Top 10 differences ]")
for stat in top_stats[:10]:
    print(stat)
@end example

Example of output before/after running some tests of the Python test suite:

@example
[ Top 10 differences ]
<frozen importlib._bootstrap>:716: size=8173 KiB (+4428 KiB), count=71332 (+39369), average=117 B
/usr/lib/python3.4/linecache.py:127: size=940 KiB (+940 KiB), count=8106 (+8106), average=119 B
/usr/lib/python3.4/unittest/case.py:571: size=298 KiB (+298 KiB), count=589 (+589), average=519 B
<frozen importlib._bootstrap>:284: size=1005 KiB (+166 KiB), count=7423 (+1526), average=139 B
/usr/lib/python3.4/mimetypes.py:217: size=112 KiB (+112 KiB), count=1334 (+1334), average=86 B
/usr/lib/python3.4/http/server.py:848: size=96.0 KiB (+96.0 KiB), count=1 (+1), average=96.0 KiB
/usr/lib/python3.4/inspect.py:1465: size=83.5 KiB (+83.5 KiB), count=109 (+109), average=784 B
/usr/lib/python3.4/unittest/mock.py:491: size=77.7 KiB (+77.7 KiB), count=143 (+143), average=557 B
/usr/lib/python3.4/urllib/parse.py:476: size=71.8 KiB (+71.8 KiB), count=969 (+969), average=76 B
/usr/lib/python3.4/contextlib.py:38: size=67.2 KiB (+67.2 KiB), count=126 (+126), average=546 B
@end example

We can see that Python has loaded @code{8173 KiB} of module data (bytecode and
constants), and that this is @code{4428 KiB} more than had been loaded before the
tests, when the previous snapshot was taken. Similarly, the @ref{89,,linecache}
module has cached @code{940 KiB} of Python source code to format tracebacks, all
of it since the previous snapshot.

If the system has little free memory, snapshots can be written on disk using
the @ref{4bcd,,Snapshot.dump()} method to analyze the snapshot offline. Then use the
@ref{4bce,,Snapshot.load()} method reload the snapshot.

@node Get the traceback of a memory block,Pretty top,Compute differences,Examples<32>
@anchor{library/tracemalloc get-the-traceback-of-a-memory-block}@anchor{4bcf}
@subsubsection Get the traceback of a memory block


Code to display the traceback of the biggest memory block:

@example
import tracemalloc

# Store 25 frames
tracemalloc.start(25)

# ... run your application ...

snapshot = tracemalloc.take_snapshot()
top_stats = snapshot.statistics('traceback')

# pick the biggest memory block
stat = top_stats[0]
print("%s memory blocks: %.1f KiB" % (stat.count, stat.size / 1024))
for line in stat.traceback.format():
    print(line)
@end example

Example of output of the Python test suite (traceback limited to 25 frames):

@example
903 memory blocks: 870.1 KiB
  File "<frozen importlib._bootstrap>", line 716
  File "<frozen importlib._bootstrap>", line 1036
  File "<frozen importlib._bootstrap>", line 934
  File "<frozen importlib._bootstrap>", line 1068
  File "<frozen importlib._bootstrap>", line 619
  File "<frozen importlib._bootstrap>", line 1581
  File "<frozen importlib._bootstrap>", line 1614
  File "/usr/lib/python3.4/doctest.py", line 101
    import pdb
  File "<frozen importlib._bootstrap>", line 284
  File "<frozen importlib._bootstrap>", line 938
  File "<frozen importlib._bootstrap>", line 1068
  File "<frozen importlib._bootstrap>", line 619
  File "<frozen importlib._bootstrap>", line 1581
  File "<frozen importlib._bootstrap>", line 1614
  File "/usr/lib/python3.4/test/support/__init__.py", line 1728
    import doctest
  File "/usr/lib/python3.4/test/test_pickletools.py", line 21
    support.run_doctest(pickletools)
  File "/usr/lib/python3.4/test/regrtest.py", line 1276
    test_runner()
  File "/usr/lib/python3.4/test/regrtest.py", line 976
    display_failure=not verbose)
  File "/usr/lib/python3.4/test/regrtest.py", line 761
    match_tests=ns.match_tests)
  File "/usr/lib/python3.4/test/regrtest.py", line 1563
    main()
  File "/usr/lib/python3.4/test/__main__.py", line 3
    regrtest.main_in_temp_cwd()
  File "/usr/lib/python3.4/runpy.py", line 73
    exec(code, run_globals)
  File "/usr/lib/python3.4/runpy.py", line 160
    "__main__", fname, loader, pkg_name)
@end example

We can see that the most memory was allocated in the @ref{7b,,importlib} module to
load data (bytecode and constants) from modules: @code{870.1 KiB}. The traceback is
where the @code{importlib} loaded data most recently: on the @code{import pdb}
line of the @ref{3e,,doctest} module. The traceback may change if a new module is
loaded.

@node Pretty top,,Get the traceback of a memory block,Examples<32>
@anchor{library/tracemalloc pretty-top}@anchor{4bd0}
@subsubsection Pretty top


Code to display the 10 lines allocating the most memory with a pretty output,
ignoring @code{<frozen importlib._bootstrap>} and @code{<unknown>} files:

@example
import linecache
import os
import tracemalloc

def display_top(snapshot, key_type='lineno', limit=10):
    snapshot = snapshot.filter_traces((
        tracemalloc.Filter(False, "<frozen importlib._bootstrap>"),
        tracemalloc.Filter(False, "<unknown>"),
    ))
    top_stats = snapshot.statistics(key_type)

    print("Top %s lines" % limit)
    for index, stat in enumerate(top_stats[:limit], 1):
        frame = stat.traceback[0]
        print("#%s: %s:%s: %.1f KiB"
              % (index, frame.filename, frame.lineno, stat.size / 1024))
        line = linecache.getline(frame.filename, frame.lineno).strip()
        if line:
            print('    %s' % line)

    other = top_stats[limit:]
    if other:
        size = sum(stat.size for stat in other)
        print("%s other: %.1f KiB" % (len(other), size / 1024))
    total = sum(stat.size for stat in top_stats)
    print("Total allocated size: %.1f KiB" % (total / 1024))

tracemalloc.start()

# ... run your application ...

snapshot = tracemalloc.take_snapshot()
display_top(snapshot)
@end example

Example of output of the Python test suite:

@example
Top 10 lines
#1: Lib/base64.py:414: 419.8 KiB
    _b85chars2 = [(a + b) for a in _b85chars for b in _b85chars]
#2: Lib/base64.py:306: 419.8 KiB
    _a85chars2 = [(a + b) for a in _a85chars for b in _a85chars]
#3: collections/__init__.py:368: 293.6 KiB
    exec(class_definition, namespace)
#4: Lib/abc.py:133: 115.2 KiB
    cls = super().__new__(mcls, name, bases, namespace)
#5: unittest/case.py:574: 103.1 KiB
    testMethod()
#6: Lib/linecache.py:127: 95.4 KiB
    lines = fp.readlines()
#7: urllib/parse.py:476: 71.8 KiB
    for a in _hexdig for b in _hexdig@}
#8: <string>:5: 62.0 KiB
#9: Lib/_weakrefset.py:37: 60.0 KiB
    self.data = set()
#10: Lib/base64.py:142: 59.8 KiB
    _b32tab2 = [a + b for a in _b32tab for b in _b32tab]
6220 other: 3602.8 KiB
Total allocated size: 5303.1 KiB
@end example

See @ref{4bcb,,Snapshot.statistics()} for more options.

@menu
* Record the current and peak size of all traced memory blocks:: 

@end menu

@node Record the current and peak size of all traced memory blocks,,,Pretty top
@anchor{library/tracemalloc record-the-current-and-peak-size-of-all-traced-memory-blocks}@anchor{4bd1}
@subsubsection Record the current and peak size of all traced memory blocks


The following code computes two sums like @code{0 + 1 + 2 + ...} inefficiently, by
creating a list of those numbers. This list consumes a lot of memory
temporarily. We can use @ref{4bd2,,get_traced_memory()} and @ref{b3b,,reset_peak()} to
observe the small memory usage after the sum is computed as well as the peak
memory usage during the computations:

@example
import tracemalloc

tracemalloc.start()

# Example code: compute a sum with a large temporary list
large_sum = sum(list(range(100000)))

first_size, first_peak = tracemalloc.get_traced_memory()

tracemalloc.reset_peak()

# Example code: compute a sum with a small temporary list
small_sum = sum(list(range(1000)))

second_size, second_peak = tracemalloc.get_traced_memory()

print(f"@{first_size=@}, @{first_peak=@}")
print(f"@{second_size=@}, @{second_peak=@}")
@end example

Output:

@example
first_size=664, first_peak=3592984
second_size=804, second_peak=29704
@end example

Using @ref{b3b,,reset_peak()} ensured we could accurately record the peak during the
computation of @code{small_sum}, even though it is much smaller than the overall
peak size of memory blocks since the @ref{216f,,start()} call. Without the call to
@code{reset_peak()}, @code{second_peak} would still be the peak from the
computation @code{large_sum} (that is, equal to @code{first_peak}). In this case,
both peaks are much higher than the final memory usage, and which suggests we
could optimise (by removing the unnecessary call to @ref{24f,,list}, and writing
@code{sum(range(...))}).

@node API,,Examples<32>,tracemalloc — Trace memory allocations
@anchor{library/tracemalloc api}@anchor{4bd3}
@subsubsection API


@menu
* Functions: Functions<11>. 
* DomainFilter:: 
* Filter:: 
* Frame:: 
* Snapshot:: 
* Statistic:: 
* StatisticDiff:: 
* Trace:: 
* Traceback:: 

@end menu

@node Functions<11>,DomainFilter,,API
@anchor{library/tracemalloc functions}@anchor{4bd4}
@subsubsection Functions


@geindex clear_traces() (in module tracemalloc)
@anchor{library/tracemalloc tracemalloc clear_traces}@anchor{4bd5}
@deffn {Function} tracemalloc.clear_traces ()

Clear traces of memory blocks allocated by Python.

See also @ref{18f3,,stop()}.
@end deffn

@geindex get_object_traceback() (in module tracemalloc)
@anchor{library/tracemalloc tracemalloc get_object_traceback}@anchor{1f7b}
@deffn {Function} tracemalloc.get_object_traceback (obj)

Get the traceback where the Python object `obj' was allocated.
Return a @ref{d95,,Traceback} instance, or @code{None} if the @code{tracemalloc}
module is not tracing memory allocations or did not trace the allocation of
the object.

See also @ref{a0b,,gc.get_referrers()} and @ref{1b1f,,sys.getsizeof()} functions.
@end deffn

@geindex get_traceback_limit() (in module tracemalloc)
@anchor{library/tracemalloc tracemalloc get_traceback_limit}@anchor{4bd6}
@deffn {Function} tracemalloc.get_traceback_limit ()

Get the maximum number of frames stored in the traceback of a trace.

The @code{tracemalloc} module must be tracing memory allocations to
get the limit, otherwise an exception is raised.

The limit is set by the @ref{216f,,start()} function.
@end deffn

@geindex get_traced_memory() (in module tracemalloc)
@anchor{library/tracemalloc tracemalloc get_traced_memory}@anchor{4bd2}
@deffn {Function} tracemalloc.get_traced_memory ()

Get the current size and peak size of memory blocks traced by the
@code{tracemalloc} module as a tuple: @code{(current: int, peak: int)}.
@end deffn

@geindex reset_peak() (in module tracemalloc)
@anchor{library/tracemalloc tracemalloc reset_peak}@anchor{b3b}
@deffn {Function} tracemalloc.reset_peak ()

Set the peak size of memory blocks traced by the @code{tracemalloc} module
to the current size.

Do nothing if the @code{tracemalloc} module is not tracing memory
allocations.

This function only modifies the recorded peak size, and does not modify or
clear any traces, unlike @ref{4bd5,,clear_traces()}. Snapshots taken with
@ref{4bd7,,take_snapshot()} before a call to @code{reset_peak()} can be
meaningfully compared to snapshots taken after the call.

See also @ref{4bd2,,get_traced_memory()}.


Added in version 3.9.

@end deffn

@geindex get_tracemalloc_memory() (in module tracemalloc)
@anchor{library/tracemalloc tracemalloc get_tracemalloc_memory}@anchor{4bd8}
@deffn {Function} tracemalloc.get_tracemalloc_memory ()

Get the memory usage in bytes of the @code{tracemalloc} module used to store
traces of memory blocks.
Return an @ref{19c,,int}.
@end deffn

@geindex is_tracing() (in module tracemalloc)
@anchor{library/tracemalloc tracemalloc is_tracing}@anchor{4bd9}
@deffn {Function} tracemalloc.is_tracing ()

@code{True} if the @code{tracemalloc} module is tracing Python memory
allocations, @code{False} otherwise.

See also @ref{216f,,start()} and @ref{18f3,,stop()} functions.
@end deffn

@geindex start() (in module tracemalloc)
@anchor{library/tracemalloc tracemalloc start}@anchor{216f}
@deffn {Function} tracemalloc.start (nframe: int = 1)

Start tracing Python memory allocations: install hooks on Python memory
allocators. Collected tracebacks of traces will be limited to `nframe'
frames. By default, a trace of a memory block only stores the most recent
frame: the limit is @code{1}. `nframe' must be greater or equal to @code{1}.

You can still read the original number of total frames that composed the
traceback by looking at the @ref{4bda,,Traceback.total_nframe} attribute.

Storing more than @code{1} frame is only useful to compute statistics grouped
by @code{'traceback'} or to compute cumulative statistics: see the
@ref{4bdb,,Snapshot.compare_to()} and @ref{4bcb,,Snapshot.statistics()} methods.

Storing more frames increases the memory and CPU overhead of the
@code{tracemalloc} module. Use the @ref{4bd8,,get_tracemalloc_memory()} function
to measure how much memory is used by the @code{tracemalloc} module.

The 
@geindex PYTHONTRACEMALLOC
@geindex environment variable; PYTHONTRACEMALLOC
@ref{2170,,PYTHONTRACEMALLOC} environment variable
(@code{PYTHONTRACEMALLOC=NFRAME}) and the @ref{170,,-X} @code{tracemalloc=NFRAME}
command line option can be used to start tracing at startup.

See also @ref{18f3,,stop()}, @ref{4bd9,,is_tracing()} and @ref{4bd6,,get_traceback_limit()}
functions.
@end deffn

@geindex stop() (in module tracemalloc)
@anchor{library/tracemalloc tracemalloc stop}@anchor{18f3}
@deffn {Function} tracemalloc.stop ()

Stop tracing Python memory allocations: uninstall hooks on Python memory
allocators. Also clears all previously collected traces of memory blocks
allocated by Python.

Call @ref{4bd7,,take_snapshot()} function to take a snapshot of traces before
clearing them.

See also @ref{216f,,start()}, @ref{4bd9,,is_tracing()} and @ref{4bd5,,clear_traces()}
functions.
@end deffn

@geindex take_snapshot() (in module tracemalloc)
@anchor{library/tracemalloc tracemalloc take_snapshot}@anchor{4bd7}
@deffn {Function} tracemalloc.take_snapshot ()

Take a snapshot of traces of memory blocks allocated by Python. Return a new
@ref{4bdc,,Snapshot} instance.

The snapshot does not include memory blocks allocated before the
@code{tracemalloc} module started to trace memory allocations.

Tracebacks of traces are limited to @ref{4bd6,,get_traceback_limit()} frames. Use
the `nframe' parameter of the @ref{216f,,start()} function to store more frames.

The @code{tracemalloc} module must be tracing memory allocations to take a
snapshot, see the @ref{216f,,start()} function.

See also the @ref{1f7b,,get_object_traceback()} function.
@end deffn

@node DomainFilter,Filter,Functions<11>,API
@anchor{library/tracemalloc domainfilter}@anchor{4bdd}
@subsubsection DomainFilter


@geindex DomainFilter (class in tracemalloc)
@anchor{library/tracemalloc tracemalloc DomainFilter}@anchor{ef3}
@deffn {Class} tracemalloc.DomainFilter (inclusive: bool, domain: int)

Filter traces of memory blocks by their address space (domain).


Added in version 3.6.


@geindex inclusive (tracemalloc.DomainFilter attribute)
@anchor{library/tracemalloc tracemalloc DomainFilter inclusive}@anchor{4bde}
@deffn {Attribute} inclusive

If `inclusive' is @code{True} (include), match memory blocks allocated
in the address space @ref{4bdf,,domain}.

If `inclusive' is @code{False} (exclude), match memory blocks not allocated
in the address space @ref{4bdf,,domain}.
@end deffn

@geindex domain (tracemalloc.DomainFilter attribute)
@anchor{library/tracemalloc tracemalloc DomainFilter domain}@anchor{4bdf}
@deffn {Attribute} domain

Address space of a memory block (@code{int}). Read-only property.
@end deffn
@end deffn

@node Filter,Frame,DomainFilter,API
@anchor{library/tracemalloc filter}@anchor{4be0}
@subsubsection Filter


@geindex Filter (class in tracemalloc)
@anchor{library/tracemalloc tracemalloc Filter}@anchor{4be1}
@deffn {Class} tracemalloc.Filter (inclusive: bool, filename_pattern: str, lineno: int = None, all_frames: bool = False, domain: int = None)

Filter on traces of memory blocks.

See the @ref{1c97,,fnmatch.fnmatch()} function for the syntax of
`filename_pattern'. The @code{'.pyc'} file extension is
replaced with @code{'.py'}.

Examples:


@itemize *

@item 
@code{Filter(True, subprocess.__file__)} only includes traces of the
@ref{dc,,subprocess} module

@item 
@code{Filter(False, tracemalloc.__file__)} excludes traces of the
@code{tracemalloc} module

@item 
@code{Filter(False, "<unknown>")} excludes empty tracebacks
@end itemize


Changed in version 3.5: The @code{'.pyo'} file extension is no longer replaced with @code{'.py'}.



Changed in version 3.6: Added the @ref{4be2,,domain} attribute.


@geindex domain (tracemalloc.Filter attribute)
@anchor{library/tracemalloc tracemalloc Filter domain}@anchor{4be2}
@deffn {Attribute} domain

Address space of a memory block (@code{int} or @code{None}).

tracemalloc uses the domain @code{0} to trace memory allocations made by
Python. C extensions can use other domains to trace other resources.
@end deffn

@geindex inclusive (tracemalloc.Filter attribute)
@anchor{library/tracemalloc tracemalloc Filter inclusive}@anchor{4be3}
@deffn {Attribute} inclusive

If `inclusive' is @code{True} (include), only match memory blocks allocated
in a file with a name matching @ref{4be4,,filename_pattern} at line number
@ref{4be5,,lineno}.

If `inclusive' is @code{False} (exclude), ignore memory blocks allocated in
a file with a name matching @ref{4be4,,filename_pattern} at line number
@ref{4be5,,lineno}.
@end deffn

@geindex lineno (tracemalloc.Filter attribute)
@anchor{library/tracemalloc tracemalloc Filter lineno}@anchor{4be5}
@deffn {Attribute} lineno

Line number (@code{int}) of the filter. If `lineno' is @code{None}, the filter
matches any line number.
@end deffn

@geindex filename_pattern (tracemalloc.Filter attribute)
@anchor{library/tracemalloc tracemalloc Filter filename_pattern}@anchor{4be4}
@deffn {Attribute} filename_pattern

Filename pattern of the filter (@code{str}). Read-only property.
@end deffn

@geindex all_frames (tracemalloc.Filter attribute)
@anchor{library/tracemalloc tracemalloc Filter all_frames}@anchor{4be6}
@deffn {Attribute} all_frames

If `all_frames' is @code{True}, all frames of the traceback are checked. If
`all_frames' is @code{False}, only the most recent frame is checked.

This attribute has no effect if the traceback limit is @code{1}.  See the
@ref{4bd6,,get_traceback_limit()} function and @ref{4be7,,Snapshot.traceback_limit}
attribute.
@end deffn
@end deffn

@node Frame,Snapshot,Filter,API
@anchor{library/tracemalloc frame}@anchor{4be8}
@subsubsection Frame


@geindex Frame (class in tracemalloc)
@anchor{library/tracemalloc tracemalloc Frame}@anchor{4be9}
@deffn {Class} tracemalloc.Frame

Frame of a traceback.

The @ref{d95,,Traceback} class is a sequence of @code{Frame} instances.

@geindex filename (tracemalloc.Frame attribute)
@anchor{library/tracemalloc tracemalloc Frame filename}@anchor{4bea}
@deffn {Attribute} filename

Filename (@code{str}).
@end deffn

@geindex lineno (tracemalloc.Frame attribute)
@anchor{library/tracemalloc tracemalloc Frame lineno}@anchor{4beb}
@deffn {Attribute} lineno

Line number (@code{int}).
@end deffn
@end deffn

@node Snapshot,Statistic,Frame,API
@anchor{library/tracemalloc snapshot}@anchor{4bec}
@subsubsection Snapshot


@geindex Snapshot (class in tracemalloc)
@anchor{library/tracemalloc tracemalloc Snapshot}@anchor{4bdc}
@deffn {Class} tracemalloc.Snapshot

Snapshot of traces of memory blocks allocated by Python.

The @ref{4bd7,,take_snapshot()} function creates a snapshot instance.

@geindex compare_to() (tracemalloc.Snapshot method)
@anchor{library/tracemalloc tracemalloc Snapshot compare_to}@anchor{4bdb}
@deffn {Method} compare_to (old_snapshot: Snapshot, key_type: str, cumulative: bool = False)

Compute the differences with an old snapshot. Get statistics as a sorted
list of @ref{4bed,,StatisticDiff} instances grouped by `key_type'.

See the @ref{4bcb,,Snapshot.statistics()} method for `key_type' and `cumulative'
parameters.

The result is sorted from the biggest to the smallest by: absolute value
of @ref{4bee,,StatisticDiff.size_diff}, @ref{4bef,,StatisticDiff.size}, absolute
value of @ref{4bf0,,StatisticDiff.count_diff}, @ref{4bf1,,Statistic.count} and
then by @ref{4bf2,,StatisticDiff.traceback}.
@end deffn

@geindex dump() (tracemalloc.Snapshot method)
@anchor{library/tracemalloc tracemalloc Snapshot dump}@anchor{4bcd}
@deffn {Method} dump (filename)

Write the snapshot into a file.

Use @ref{4bce,,load()} to reload the snapshot.
@end deffn

@geindex filter_traces() (tracemalloc.Snapshot method)
@anchor{library/tracemalloc tracemalloc Snapshot filter_traces}@anchor{4bf3}
@deffn {Method} filter_traces (filters)

Create a new @code{Snapshot} instance with a filtered @ref{4bf4,,traces}
sequence, `filters' is a list of @ref{ef3,,DomainFilter} and
@ref{4be1,,Filter} instances.  If `filters' is an empty list, return a new
@code{Snapshot} instance with a copy of the traces.

All inclusive filters are applied at once, a trace is ignored if no
inclusive filters match it. A trace is ignored if at least one exclusive
filter matches it.


Changed in version 3.6: @ref{ef3,,DomainFilter} instances are now also accepted in `filters'.

@end deffn

@geindex load() (tracemalloc.Snapshot class method)
@anchor{library/tracemalloc tracemalloc Snapshot load}@anchor{4bce}
@deffn {Method} classmethod load (filename)

Load a snapshot from a file.

See also @ref{4bcd,,dump()}.
@end deffn

@geindex statistics() (tracemalloc.Snapshot method)
@anchor{library/tracemalloc tracemalloc Snapshot statistics}@anchor{4bcb}
@deffn {Method} statistics (key_type: str, cumulative: bool = False)

Get statistics as a sorted list of @ref{4bf5,,Statistic} instances grouped
by `key_type':


@multitable {xxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

key_type

@tab

description

@item

@code{'filename'}

@tab

filename

@item

@code{'lineno'}

@tab

filename and line number

@item

@code{'traceback'}

@tab

traceback

@end multitable


If `cumulative' is @code{True}, cumulate size and count of memory blocks of
all frames of the traceback of a trace, not only the most recent frame.
The cumulative mode can only be used with `key_type' equal to
@code{'filename'} and @code{'lineno'}.

The result is sorted from the biggest to the smallest by:
@ref{4bf6,,Statistic.size}, @ref{4bf1,,Statistic.count} and then by
@ref{4bf7,,Statistic.traceback}.
@end deffn

@geindex traceback_limit (tracemalloc.Snapshot attribute)
@anchor{library/tracemalloc tracemalloc Snapshot traceback_limit}@anchor{4be7}
@deffn {Attribute} traceback_limit

Maximum number of frames stored in the traceback of @ref{4bf4,,traces}:
result of the @ref{4bd6,,get_traceback_limit()} when the snapshot was taken.
@end deffn

@geindex traces (tracemalloc.Snapshot attribute)
@anchor{library/tracemalloc tracemalloc Snapshot traces}@anchor{4bf4}
@deffn {Attribute} traces

Traces of all memory blocks allocated by Python: sequence of
@ref{4bf8,,Trace} instances.

The sequence has an undefined order. Use the @ref{4bcb,,Snapshot.statistics()}
method to get a sorted list of statistics.
@end deffn
@end deffn

@node Statistic,StatisticDiff,Snapshot,API
@anchor{library/tracemalloc statistic}@anchor{4bf9}
@subsubsection Statistic


@geindex Statistic (class in tracemalloc)
@anchor{library/tracemalloc tracemalloc Statistic}@anchor{4bf5}
@deffn {Class} tracemalloc.Statistic

Statistic on memory allocations.

@ref{4bcb,,Snapshot.statistics()} returns a list of @code{Statistic} instances.

See also the @ref{4bed,,StatisticDiff} class.

@geindex count (tracemalloc.Statistic attribute)
@anchor{library/tracemalloc tracemalloc Statistic count}@anchor{4bf1}
@deffn {Attribute} count

Number of memory blocks (@code{int}).
@end deffn

@geindex size (tracemalloc.Statistic attribute)
@anchor{library/tracemalloc tracemalloc Statistic size}@anchor{4bf6}
@deffn {Attribute} size

Total size of memory blocks in bytes (@code{int}).
@end deffn

@geindex traceback (tracemalloc.Statistic attribute)
@anchor{library/tracemalloc tracemalloc Statistic traceback}@anchor{4bf7}
@deffn {Attribute} traceback

Traceback where the memory block was allocated, @ref{d95,,Traceback}
instance.
@end deffn
@end deffn

@node StatisticDiff,Trace,Statistic,API
@anchor{library/tracemalloc statisticdiff}@anchor{4bfa}
@subsubsection StatisticDiff


@geindex StatisticDiff (class in tracemalloc)
@anchor{library/tracemalloc tracemalloc StatisticDiff}@anchor{4bed}
@deffn {Class} tracemalloc.StatisticDiff

Statistic difference on memory allocations between an old and a new
@ref{4bdc,,Snapshot} instance.

@ref{4bdb,,Snapshot.compare_to()} returns a list of @code{StatisticDiff}
instances. See also the @ref{4bf5,,Statistic} class.

@geindex count (tracemalloc.StatisticDiff attribute)
@anchor{library/tracemalloc tracemalloc StatisticDiff count}@anchor{4bfb}
@deffn {Attribute} count

Number of memory blocks in the new snapshot (@code{int}): @code{0} if
the memory blocks have been released in the new snapshot.
@end deffn

@geindex count_diff (tracemalloc.StatisticDiff attribute)
@anchor{library/tracemalloc tracemalloc StatisticDiff count_diff}@anchor{4bf0}
@deffn {Attribute} count_diff

Difference of number of memory blocks between the old and the new
snapshots (@code{int}): @code{0} if the memory blocks have been allocated in
the new snapshot.
@end deffn

@geindex size (tracemalloc.StatisticDiff attribute)
@anchor{library/tracemalloc tracemalloc StatisticDiff size}@anchor{4bef}
@deffn {Attribute} size

Total size of memory blocks in bytes in the new snapshot (@code{int}):
@code{0} if the memory blocks have been released in the new snapshot.
@end deffn

@geindex size_diff (tracemalloc.StatisticDiff attribute)
@anchor{library/tracemalloc tracemalloc StatisticDiff size_diff}@anchor{4bee}
@deffn {Attribute} size_diff

Difference of total size of memory blocks in bytes between the old and
the new snapshots (@code{int}): @code{0} if the memory blocks have been
allocated in the new snapshot.
@end deffn

@geindex traceback (tracemalloc.StatisticDiff attribute)
@anchor{library/tracemalloc tracemalloc StatisticDiff traceback}@anchor{4bf2}
@deffn {Attribute} traceback

Traceback where the memory blocks were allocated, @ref{d95,,Traceback}
instance.
@end deffn
@end deffn

@node Trace,Traceback,StatisticDiff,API
@anchor{library/tracemalloc trace}@anchor{4bfc}
@subsubsection Trace


@geindex Trace (class in tracemalloc)
@anchor{library/tracemalloc tracemalloc Trace}@anchor{4bf8}
@deffn {Class} tracemalloc.Trace

Trace of a memory block.

The @ref{4bf4,,Snapshot.traces} attribute is a sequence of @code{Trace}
instances.


Changed in version 3.6: Added the @ref{4bfd,,domain} attribute.


@geindex domain (tracemalloc.Trace attribute)
@anchor{library/tracemalloc tracemalloc Trace domain}@anchor{4bfd}
@deffn {Attribute} domain

Address space of a memory block (@code{int}). Read-only property.

tracemalloc uses the domain @code{0} to trace memory allocations made by
Python. C extensions can use other domains to trace other resources.
@end deffn

@geindex size (tracemalloc.Trace attribute)
@anchor{library/tracemalloc tracemalloc Trace size}@anchor{4bfe}
@deffn {Attribute} size

Size of the memory block in bytes (@code{int}).
@end deffn

@geindex traceback (tracemalloc.Trace attribute)
@anchor{library/tracemalloc tracemalloc Trace traceback}@anchor{4bff}
@deffn {Attribute} traceback

Traceback where the memory block was allocated, @ref{d95,,Traceback}
instance.
@end deffn
@end deffn

@node Traceback,,Trace,API
@anchor{library/tracemalloc traceback}@anchor{4c00}
@subsubsection Traceback


@geindex Traceback (class in tracemalloc)
@anchor{library/tracemalloc tracemalloc Traceback}@anchor{d95}
@deffn {Class} tracemalloc.Traceback

Sequence of @ref{4be9,,Frame} instances sorted from the oldest frame to the
most recent frame.

A traceback contains at least @code{1} frame. If the @code{tracemalloc} module
failed to get a frame, the filename @code{"<unknown>"} at line number @code{0} is
used.

When a snapshot is taken, tracebacks of traces are limited to
@ref{4bd6,,get_traceback_limit()} frames. See the @ref{4bd7,,take_snapshot()} function.
The original number of frames of the traceback is stored in the
@ref{4bda,,Traceback.total_nframe} attribute. That allows one to know if a traceback
has been truncated by the traceback limit.

The @ref{4bff,,Trace.traceback} attribute is a @code{Traceback} instance.


Changed in version 3.7: Frames are now sorted from the oldest to the most recent, instead of most recent to oldest.


@geindex total_nframe (tracemalloc.Traceback attribute)
@anchor{library/tracemalloc tracemalloc Traceback total_nframe}@anchor{4bda}
@deffn {Attribute} total_nframe

Total number of frames that composed the traceback before truncation.
This attribute can be set to @code{None} if the information is not
available.
@end deffn


Changed in version 3.9: The @ref{4bda,,Traceback.total_nframe} attribute was added.


@geindex format() (tracemalloc.Traceback method)
@anchor{library/tracemalloc tracemalloc Traceback format}@anchor{d96}
@deffn {Method} format (limit=None, most_recent_first=False)

Format the traceback as a list of lines. Use the @ref{89,,linecache} module to
retrieve lines from the source code. If `limit' is set, format the `limit'
most recent frames if `limit' is positive. Otherwise, format the
@code{abs(limit)} oldest frames. If `most_recent_first' is @code{True}, the order
of the formatted frames is reversed, returning the most recent frame first
instead of last.

Similar to the @ref{4c01,,traceback.format_tb()} function, except that
@code{format()} does not include newlines.

Example:

@example
print("Traceback (most recent call first):")
for line in traceback:
    print(line)
@end example

Output:

@example
Traceback (most recent call first):
  File "test.py", line 9
    obj = Object()
  File "test.py", line 12
    tb = tracemalloc.get_object_traceback(f())
@end example
@end deffn
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Software Packaging and Distribution,Python Runtime Services,Debugging and Profiling,The Python Standard Library
@anchor{library/distribution doc}@anchor{4c02}@anchor{library/distribution software-packaging-and-distribution}@anchor{4c03}@anchor{library/distribution translation-repo}@anchor{4c04}
@section Software Packaging and Distribution


These libraries help you with publishing and installing Python software.
While these modules are designed to work in conjunction with the
Python Package Index@footnote{https://pypi.org}, they can also be used
with a local index server, or without any index server at all.

@menu
* ensurepip — Bootstrapping the pip installer:: 
* venv — Creation of virtual environments:: 
* zipapp — Manage executable Python zip archives:: 

@end menu

@node ensurepip — Bootstrapping the pip installer,venv — Creation of virtual environments,,Software Packaging and Distribution
@anchor{library/ensurepip doc}@anchor{4c05}@anchor{library/ensurepip ensurepip-bootstrapping-the-pip-installer}@anchor{4c06}@anchor{library/ensurepip module-ensurepip}@anchor{59}
@subsection @code{ensurepip} — Bootstrapping the @code{pip} installer


@geindex module; ensurepip


Added in version 3.4.


`Source code:' Lib/ensurepip@footnote{https://github.com/python/cpython/tree/3.14/Lib/ensurepip}


__________________________________________________________________


The @code{ensurepip} package provides support for bootstrapping the @code{pip}
installer into an existing Python installation or virtual environment. This
bootstrapping approach reflects the fact that @code{pip} is an independent
project with its own release cycle, and the latest available stable version
is bundled with maintenance and feature releases of the CPython reference
interpreter.

In most cases, end users of Python shouldn’t need to invoke this module
directly (as @code{pip} should be bootstrapped by default), but it may be
needed if installing @code{pip} was skipped when installing Python (or
when creating a virtual environment) or after explicitly uninstalling
@code{pip}.

@cartouche
@quotation Note 
This module `does not' access the internet. All of the components
needed to bootstrap @code{pip} are included as internal parts of the
package.
@end quotation
@end cartouche

This is an @ref{219c,,optional module}.
If it is missing from your copy of CPython,
look for documentation from your distributor (that is,
whoever provided Python to you).
If you are the distributor, see @ref{219a,,Requirements for optional modules}.

@c Similar notes appear in the docs of the modules:
@c - zipfile
@c - tarfile


@subsubheading See also



@table @asis

@item @ref{10fe,,Installing Python modules}

The end user guide for installing Python packages

@geindex Python Enhancement Proposals; PEP 453

@item PEP 453@footnote{https://peps.python.org/pep-0453/}: Explicit bootstrapping of pip in Python installations

The original rationale and specification for this module.
@end table


@c include for modules that don't work on WASM or mobile platforms

@ref{2181,,Availability}: not Android, not iOS, not WASI.

This module is not supported on @ref{22a0,,mobile platforms}
or @ref{1bae,,WebAssembly platforms}.

@menu
* Command-line interface: Command-line interface<9>. 
* Module API:: 

@end menu

@node Command-line interface<9>,Module API,,ensurepip — Bootstrapping the pip installer
@anchor{library/ensurepip command-line-interface}@anchor{4c07}@anchor{library/ensurepip ensurepip-cli}@anchor{4c08}
@subsubsection Command-line interface


The command line interface is invoked using the interpreter’s @code{-m} switch.

The simplest possible invocation is:

@example
python -m ensurepip
@end example

This invocation will install @code{pip} if it is not already installed,
but otherwise does nothing. To ensure the installed version of @code{pip}
is at least as recent as the one available in @code{ensurepip}, pass the
@code{--upgrade} option:

@example
python -m ensurepip --upgrade
@end example

By default, @code{pip} is installed into the current virtual environment
(if one is active) or into the system site packages (if there is no
active virtual environment). The installation location can be controlled
through two additional command line options:

@geindex ensurepip command line option; --root
@anchor{library/ensurepip cmdoption-ensurepip-root}@anchor{4c09}
@deffn {Option} @w{-}@w{-}root <dir>

Installs @code{pip} relative to the given root directory rather than the root
of the currently active virtual environment (if any) or the default root
for the current Python installation.
@end deffn

@geindex ensurepip command line option; --user
@anchor{library/ensurepip cmdoption-ensurepip-user}@anchor{4c0a}
@deffn {Option} @w{-}@w{-}user

Installs @code{pip} into the user site packages directory rather than globally
for the current Python installation (this option is not permitted inside an
active virtual environment).
@end deffn

By default, the scripts @code{pipX} and @code{pipX.Y} will be installed (where
X.Y stands for the version of Python used to invoke @code{ensurepip}). The
scripts installed can be controlled through two additional command line
options:

@geindex ensurepip command line option; --altinstall
@anchor{library/ensurepip cmdoption-ensurepip-altinstall}@anchor{4c0b}
@deffn {Option} @w{-}@w{-}altinstall

If an alternate installation is requested, the @code{pipX} script will `not' be
installed.
@end deffn

@geindex ensurepip command line option; --default-pip
@anchor{library/ensurepip cmdoption-ensurepip-default-pip}@anchor{4c0c}
@deffn {Option} @w{-}@w{-}default@w{-}pip

If a “default pip” installation is requested, the @code{pip} script will be
installed in addition to the two regular scripts.
@end deffn

Providing both of the script selection options will trigger an exception.

@node Module API,,Command-line interface<9>,ensurepip — Bootstrapping the pip installer
@anchor{library/ensurepip module-api}@anchor{4c0d}
@subsubsection Module API


@code{ensurepip} exposes two functions for programmatic use:

@geindex version() (in module ensurepip)
@anchor{library/ensurepip ensurepip version}@anchor{4c0e}
@deffn {Function} ensurepip.version ()

Returns a string specifying the available version of pip that will be
installed when bootstrapping an environment.
@end deffn

@geindex bootstrap() (in module ensurepip)
@anchor{library/ensurepip ensurepip bootstrap}@anchor{4abb}
@deffn {Function} ensurepip.bootstrap (root=None, upgrade=False, user=False, altinstall=False, default_pip=False, verbosity=0)

Bootstraps @code{pip} into the current or designated environment.

`root' specifies an alternative root directory to install relative to.
If `root' is @code{None}, then installation uses the default install location
for the current environment.

`upgrade' indicates whether or not to upgrade an existing installation
of an earlier version of @code{pip} to the available version.

`user' indicates whether to use the user scheme rather than installing
globally.

By default, the scripts @code{pipX} and @code{pipX.Y} will be installed (where
X.Y stands for the current version of Python).

If `altinstall' is set, then @code{pipX} will `not' be installed.

If `default_pip' is set, then @code{pip} will be installed in addition to
the two regular scripts.

Setting both `altinstall' and `default_pip' will trigger
@ref{2ee,,ValueError}.

`verbosity' controls the level of output to @ref{cd3,,sys.stdout} from the
bootstrapping operation.

Raises an @ref{1cb1,,auditing event} @code{ensurepip.bootstrap} with argument @code{root}.

@cartouche
@quotation Note 
The bootstrapping process has side effects on both @code{sys.path} and
@code{os.environ}. Invoking the command line interface in a subprocess
instead allows these side effects to be avoided.
@end quotation
@end cartouche

@cartouche
@quotation Note 
The bootstrapping process may install additional modules required by
@code{pip}, but other software should not assume those dependencies will
always be present by default (as the dependencies may be removed in a
future version of @code{pip}).
@end quotation
@end cartouche
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node venv — Creation of virtual environments,zipapp — Manage executable Python zip archives,ensurepip — Bootstrapping the pip installer,Software Packaging and Distribution
@anchor{library/venv doc}@anchor{4c0f}@anchor{library/venv module-venv}@anchor{118}@anchor{library/venv translation-repo}@anchor{4c10}@anchor{library/venv venv-creation-of-virtual-environments}@anchor{4c11}
@subsection @code{venv} — Creation of virtual environments


@geindex module; venv


Added in version 3.3.


`Source code:' Lib/venv/@footnote{https://github.com/python/cpython/tree/3.14/Lib/venv/}

@geindex Environments; virtual


__________________________________________________________________

@anchor{library/venv venv-def}@anchor{3e6}@anchor{library/venv venv-intro}@anchor{4c12}
The @code{venv} module supports creating lightweight “virtual environments”,
each with their own independent set of Python packages installed in
their @ref{cc,,site} directories.
A virtual environment is created on top of an existing
Python installation, known as the virtual environment’s “base” Python, and by
default is isolated from the packages in the base environment,
so that only those explicitly installed in the virtual environment are
available. See @ref{4c13,,Virtual Environments} and @code{site}’s
@ref{4c14,,virtual environments documentation}
for more information.

When used from within a virtual environment, common installation tools such as
pip@footnote{https://pypi.org/project/pip/} will install Python packages into a virtual environment
without needing to be told to do so explicitly.

A virtual environment is (amongst other things):


@itemize *

@item 
Used to contain a specific Python interpreter and software libraries and
binaries which are needed to support a project (library or application). These
are by default isolated from software in other virtual environments and Python
interpreters and libraries installed in the operating system.

@item 
Contained in a directory, conventionally named @code{.venv} or @code{venv} in
the project directory, or under a container directory for lots of virtual
environments, such as @code{~/.virtualenvs}.

@item 
Not checked into source control systems such as Git.

@item 
Considered as disposable – it should be simple to delete and recreate it from
scratch. You don’t place any project code in the environment.

@item 
Not considered as movable or copyable – you just recreate the same
environment in the target location.
@end itemize

See 
@geindex Python Enhancement Proposals; PEP 405
PEP 405@footnote{https://peps.python.org/pep-0405/} for more background on Python virtual environments.


@subsubheading See also


Python Packaging User Guide: Creating and using virtual environments@footnote{https://packaging.python.org/guides/installing-using-pip-and-virtual-environments/#create-and-use-virtual-environments}


@c include for modules that don't work on WASM or mobile platforms

@ref{2181,,Availability}: not Android, not iOS, not WASI.

This module is not supported on @ref{22a0,,mobile platforms}
or @ref{1bae,,WebAssembly platforms}.

@menu
* Creating virtual environments:: 
* How venvs work:: 
* API: API<2>. 
* An example of extending EnvBuilder:: 

@end menu

@node Creating virtual environments,How venvs work,,venv — Creation of virtual environments
@anchor{library/venv creating-virtual-environments}@anchor{4c15}
@subsubsection Creating virtual environments


@ref{3e6,,Virtual environments} are created by executing the @code{venv}
module:

@example
python -m venv /path/to/new/virtual/environment
@end example

This creates the target directory (including parent directories as needed)
and places a @code{pyvenv.cfg} file in it with a @code{home} key
pointing to the Python installation from which the command was run.
It also creates a @code{bin} (or @code{Scripts} on Windows) subdirectory
containing a copy or symlink of the Python executable
(as appropriate for the platform or arguments used at environment creation time).
It also creates a @code{lib/pythonX.Y/site-packages} subdirectory
(on Windows, this is @code{Lib\site-packages}).
If an existing directory is specified, it will be re-used.


Changed in version 3.5: The use of @code{venv} is now recommended for creating virtual environments.



Deprecated since version 3.6, removed in version 3.8: @code{pyvenv} was the recommended tool for creating virtual environments
for Python 3.3 and 3.4, and replaced in 3.5 by executing @code{venv} directly.


On Windows, invoke the @code{venv} command as follows:

@example
PS> python -m venv C:\path\to\new\virtual\environment
@end example

The command, if run with @code{-h}, will show the available options:

@example
usage: venv [-h] [--system-site-packages] [--symlinks | --copies] [--clear]
            [--upgrade] [--without-pip] [--prompt PROMPT] [--upgrade-deps]
            [--without-scm-ignore-files]
            ENV_DIR [ENV_DIR ...]

Creates virtual Python environments in one or more target directories.

Once an environment has been created, you may wish to activate it, e.g. by
sourcing an activate script in its bin directory.
@end example

@geindex venv command line option; ENV_DIR
@anchor{library/venv venv-cli}@anchor{4c16}@anchor{library/venv cmdoption-venv-arg-ENV_DIR}@anchor{4c17}
@deffn {Option} ENV_DIR

A required argument specifying the directory to create the environment in.
@end deffn

@geindex venv command line option; --system-site-packages
@anchor{library/venv cmdoption-venv-system-site-packages}@anchor{4c18}
@deffn {Option} @w{-}@w{-}system@w{-}site@w{-}packages

Give the virtual environment access to the system site-packages directory.
@end deffn

@geindex venv command line option; --symlinks
@anchor{library/venv cmdoption-venv-symlinks}@anchor{4c19}
@deffn {Option} @w{-}@w{-}symlinks

Try to use symlinks rather than copies, when symlinks are not the default for the platform.
@end deffn

@geindex venv command line option; --copies
@anchor{library/venv cmdoption-venv-copies}@anchor{4c1a}
@deffn {Option} @w{-}@w{-}copies

Try to use copies rather than symlinks, even when symlinks are the default for the platform.
@end deffn

@geindex venv command line option; --clear
@anchor{library/venv cmdoption-venv-clear}@anchor{4c1b}
@deffn {Option} @w{-}@w{-}clear

Delete the contents of the environment directory if it already exists, before environment creation.
@end deffn

@geindex venv command line option; --upgrade
@anchor{library/venv cmdoption-venv-upgrade}@anchor{4c1c}
@deffn {Option} @w{-}@w{-}upgrade

Upgrade the environment directory to use this version of Python, assuming Python has been upgraded in-place.
@end deffn

@geindex venv command line option; --without-pip
@anchor{library/venv cmdoption-venv-without-pip}@anchor{4c1d}
@deffn {Option} @w{-}@w{-}without@w{-}pip

Skips installing or upgrading pip in the virtual environment (pip is bootstrapped by default).
@end deffn

@geindex venv command line option; --prompt
@anchor{library/venv cmdoption-venv-prompt}@anchor{4c1e}
@deffn {Option} @w{-}@w{-}prompt <PROMPT>

Provides an alternative prompt prefix for this environment.
@end deffn

@geindex venv command line option; --upgrade-deps
@anchor{library/venv cmdoption-venv-upgrade-deps}@anchor{4c1f}
@deffn {Option} @w{-}@w{-}upgrade@w{-}deps

Upgrade core dependencies (pip) to the latest version in PyPI.
@end deffn

@geindex venv command line option; --without-scm-ignore-files
@anchor{library/venv cmdoption-venv-without-scm-ignore-files}@anchor{4c20}
@deffn {Option} @w{-}@w{-}without@w{-}scm@w{-}ignore@w{-}files

Skips adding SCM ignore files to the environment directory (Git is supported by default).
@end deffn


Changed in version 3.4: Installs pip by default, added the @code{--without-pip}  and @code{--copies}
options.



Changed in version 3.4: In earlier versions, if the target directory already existed, an error was
raised, unless the @code{--clear} or @code{--upgrade} option was provided.



Changed in version 3.9: Add @code{--upgrade-deps} option to upgrade pip + setuptools to the latest on PyPI.



Changed in version 3.12: @code{setuptools} is no longer a core venv dependency.



Changed in version 3.13: Added the @code{--without-scm-ignore-files} option.



Changed in version 3.13: @code{venv} now creates a @code{.gitignore} file for Git by default.


@cartouche
@quotation Note 
While symlinks are supported on Windows, they are not recommended. Of
particular note is that double-clicking @code{python.exe} in File Explorer
will resolve the symlink eagerly and ignore the virtual environment.
@end quotation
@end cartouche

@cartouche
@quotation Note 
On Microsoft Windows, it may be required to enable the @code{Activate.ps1}
script by setting the execution policy for the user. You can do this by
issuing the following PowerShell command:

@example
PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
@end example

See About Execution Policies@footnote{https://go.microsoft.com/fwlink/?LinkID=135170}
for more information.
@end quotation
@end cartouche

The created @code{pyvenv.cfg} file also includes the
@code{include-system-site-packages} key, set to @code{true} if @code{venv} is
run with the @code{--system-site-packages} option, @code{false} otherwise.

Unless the @code{--without-pip} option is given, @ref{59,,ensurepip} will be
invoked to bootstrap @code{pip} into the virtual environment.

Multiple paths can be given to @code{venv}, in which case an identical virtual
environment will be created, according to the given options, at each provided
path.

@node How venvs work,API<2>,Creating virtual environments,venv — Creation of virtual environments
@anchor{library/venv how-venvs-work}@anchor{4c21}@anchor{library/venv venv-explanation}@anchor{67e}
@subsubsection How venvs work


When a Python interpreter is running from a virtual environment,
@ref{3e5,,sys.prefix} and @ref{3e9,,sys.exec_prefix}
point to the directories of the virtual environment,
whereas @ref{3e4,,sys.base_prefix} and @ref{3e8,,sys.base_exec_prefix}
point to those of the base Python used to create the environment.
It is sufficient to check
@code{sys.prefix != sys.base_prefix} to determine if the current interpreter is
running from a virtual environment.

A virtual environment may be “activated” using a script in its binary directory
(@code{bin} on POSIX; @code{Scripts} on Windows).
This will prepend that directory to your 
@geindex PATH
@geindex environment variable; PATH
@code{PATH}, so that running
@code{python} will invoke the environment’s Python interpreter
and you can run installed scripts without having to use their full path.
The invocation of the activation script is platform-specific
(@code{@var{<venv>}} must be replaced by the path to the directory
containing the virtual environment):


@multitable {xxxxxxxxxxxxxxx} {xxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Platform

@tab

Shell

@tab

Command to activate virtual environment

@item

POSIX

@tab

bash/zsh

@tab

@code{$ source @var{<venv>}/bin/activate}

@item

fish

@tab

@code{$ source @var{<venv>}/bin/activate.fish}

@item

csh/tcsh

@tab

@code{$ source @var{<venv>}/bin/activate.csh}

@item

pwsh

@tab

@code{$ @var{<venv>}/bin/Activate.ps1}

@item

Windows

@tab

cmd.exe

@tab

@code{C:\> @var{<venv>}\Scripts\activate.bat}

@item

PowerShell

@tab

@code{PS C:\> @var{<venv>}\Scripts\Activate.ps1}

@end multitable



Added in version 3.4: @code{fish} and @code{csh} activation scripts.



Added in version 3.8: PowerShell activation scripts installed under POSIX for PowerShell Core
support.


You don’t specifically `need' to activate a virtual environment,
as you can just specify the full path to that environment’s
Python interpreter when invoking Python.
Furthermore, all scripts installed in the environment
should be runnable without activating it.

In order to achieve this, scripts installed into virtual environments have
a “shebang” line which points to the environment’s Python interpreter,
@code{#!/@var{<path-to-venv>}/bin/python}.
This means that the script will run with that interpreter regardless of the
value of 
@geindex PATH
@geindex environment variable; PATH
@code{PATH}. On Windows, “shebang” line processing is supported if
you have the @ref{7db,,Python install manager} installed. Thus, double-clicking an installed
script in a Windows Explorer window should run it with the correct interpreter
without the environment needing to be activated or on the 
@geindex PATH
@geindex environment variable; PATH
@code{PATH}.

When a virtual environment has been activated, the @code{VIRTUAL_ENV}
environment variable is set to the path of the environment.
Since explicitly activating a virtual environment is not required to use it,
@code{VIRTUAL_ENV} cannot be relied upon to determine
whether a virtual environment is being used.

@cartouche
@quotation Warning 
Because scripts installed in environments should not expect the
environment to be activated, their shebang lines contain the absolute paths
to their environment’s interpreters. Because of this, environments are
inherently non-portable, in the general case. You should always have a
simple means of recreating an environment (for example, if you have a
requirements file @code{requirements.txt}, you can invoke @code{pip install -r
requirements.txt} using the environment’s @code{pip} to install all of the
packages needed by the environment). If for any reason you need to move the
environment to a new location, you should recreate it at the desired
location and delete the one at the old location. If you move an environment
because you moved a parent directory of it, you should recreate the
environment in its new location. Otherwise, software installed into the
environment may not work as expected.
@end quotation
@end cartouche

You can deactivate a virtual environment by typing @code{deactivate} in your shell.
The exact mechanism is platform-specific and is an internal implementation
detail (typically, a script or shell function will be used).

@node API<2>,An example of extending EnvBuilder,How venvs work,venv — Creation of virtual environments
@anchor{library/venv api}@anchor{4c22}@anchor{library/venv venv-api}@anchor{10fb}
@subsubsection API


The high-level method described above makes use of a simple API which provides
mechanisms for third-party virtual environment creators to customize environment
creation according to their needs, the @ref{571,,EnvBuilder} class.

@geindex EnvBuilder (class in venv)
@anchor{library/venv venv EnvBuilder}@anchor{571}
@deffn {Class} venv.EnvBuilder (system_site_packages=False, clear=False, symlinks=False, upgrade=False, with_pip=False, prompt=None, upgrade_deps=False, *, scm_ignore_files=frozenset())

The @code{EnvBuilder} class accepts the following keyword arguments on
instantiation:


@itemize *

@item 
`system_site_packages' – a boolean value indicating that the system Python
site-packages should be available to the environment (defaults to @code{False}).

@item 
`clear' – a boolean value which, if true, will delete the contents of
any existing target directory, before creating the environment.

@item 
`symlinks' – a boolean value indicating whether to attempt to symlink the
Python binary rather than copying.

@item 
`upgrade' – a boolean value which, if true, will upgrade an existing
environment with the running Python - for use when that Python has been
upgraded in-place (defaults to @code{False}).

@item 
`with_pip' – a boolean value which, if true, ensures pip is
installed in the virtual environment. This uses @ref{59,,ensurepip} with
the @code{--default-pip} option.

@item 
`prompt' – a string to be used after virtual environment is activated
(defaults to @code{None} which means directory name of the environment would
be used). If the special string @code{"."} is provided, the basename of the
current directory is used as the prompt.

@item 
`upgrade_deps' – Update the base venv modules to the latest on PyPI

@item 
`scm_ignore_files' – Create ignore files based for the specified source
control managers (SCM) in the iterable. Support is defined by having a
method named @code{create_@{scm@}_ignore_file}. The only value supported by
default is @code{"git"} via @ref{4c23,,create_git_ignore_file()}.
@end itemize


Changed in version 3.4: Added the @code{with_pip} parameter



Changed in version 3.6: Added the @code{prompt} parameter



Changed in version 3.9: Added the @code{upgrade_deps} parameter



Changed in version 3.13: Added the @code{scm_ignore_files} parameter


@code{EnvBuilder} may be used as a base class.

@geindex create() (venv.EnvBuilder method)
@anchor{library/venv venv EnvBuilder create}@anchor{4c24}
@deffn {Method} create (env_dir)

Create a virtual environment by specifying the target directory
(absolute or relative to the current directory) which is to contain the
virtual environment.  The @code{create} method will either create the
environment in the specified directory, or raise an appropriate
exception.

The @code{create} method of the @code{EnvBuilder} class illustrates the
hooks available for subclass customization:

@example
def create(self, env_dir):
    """
    Create a virtualized Python environment in a directory.
    env_dir is the target directory to create an environment in.
    """
    env_dir = os.path.abspath(env_dir)
    context = self.ensure_directories(env_dir)
    self.create_configuration(context)
    self.setup_python(context)
    self.setup_scripts(context)
    self.post_setup(context)
@end example

Each of the methods @ref{4c25,,ensure_directories()},
@ref{4c26,,create_configuration()}, @ref{4c27,,setup_python()},
@ref{4c28,,setup_scripts()} and @ref{4c29,,post_setup()} can be overridden.
@end deffn

@geindex ensure_directories() (venv.EnvBuilder method)
@anchor{library/venv venv EnvBuilder ensure_directories}@anchor{4c25}
@deffn {Method} ensure_directories (env_dir)

Creates the environment directory and all necessary subdirectories that
don’t already exist, and returns a context object.  This context object
is just a holder for attributes (such as paths) for use by the other
methods.  If the @code{EnvBuilder} is created with the arg
@code{clear=True}, contents of the environment directory will be cleared
and then all necessary subdirectories will be recreated.

The returned context object is a @ref{4e6,,types.SimpleNamespace} with the
following attributes:


@itemize *

@item 
@code{env_dir} - The location of the virtual environment. Used for
@code{__VENV_DIR__} in activation scripts (see @ref{4c2a,,install_scripts()}).

@item 
@code{env_name} - The name of the virtual environment. Used for
@code{__VENV_NAME__} in activation scripts (see @ref{4c2a,,install_scripts()}).

@item 
@code{prompt} - The prompt to be used by the activation scripts. Used for
@code{__VENV_PROMPT__} in activation scripts (see @ref{4c2a,,install_scripts()}).

@item 
@code{executable} - The underlying Python executable used by the virtual
environment. This takes into account the case where a virtual environment
is created from another virtual environment.

@item 
@code{inc_path} - The include path for the virtual environment.

@item 
@code{lib_path} - The purelib path for the virtual environment.

@item 
@code{bin_path} - The script path for the virtual environment.

@item 
@code{bin_name} - The name of the script path relative to the virtual
environment location. Used for @code{__VENV_BIN_NAME__} in activation
scripts (see @ref{4c2a,,install_scripts()}).

@item 
@code{env_exe} - The name of the Python interpreter in the virtual
environment. Used for @code{__VENV_PYTHON__} in activation scripts
(see @ref{4c2a,,install_scripts()}).

@item 
@code{env_exec_cmd} - The name of the Python interpreter, taking into
account filesystem redirections. This can be used to run Python in
the virtual environment.
@end itemize


Changed in version 3.11: The `venv'
@ref{447,,sysconfig installation scheme}
is used to construct the paths of the created directories.



Changed in version 3.12: The attribute @code{lib_path} was added to the context, and the context
object was documented.

@end deffn

@geindex create_configuration() (venv.EnvBuilder method)
@anchor{library/venv venv EnvBuilder create_configuration}@anchor{4c26}
@deffn {Method} create_configuration (context)

Creates the @code{pyvenv.cfg} configuration file in the environment.
@end deffn

@geindex setup_python() (venv.EnvBuilder method)
@anchor{library/venv venv EnvBuilder setup_python}@anchor{4c27}
@deffn {Method} setup_python (context)

Creates a copy or symlink to the Python executable in the environment.
On POSIX systems, if a specific executable @code{python3.x} was used,
symlinks to @code{python} and @code{python3} will be created pointing to that
executable, unless files with those names already exist.
@end deffn

@geindex setup_scripts() (venv.EnvBuilder method)
@anchor{library/venv venv EnvBuilder setup_scripts}@anchor{4c28}
@deffn {Method} setup_scripts (context)

Installs activation scripts appropriate to the platform into the virtual
environment.
@end deffn

@geindex upgrade_dependencies() (venv.EnvBuilder method)
@anchor{library/venv venv EnvBuilder upgrade_dependencies}@anchor{4c2b}
@deffn {Method} upgrade_dependencies (context)

Upgrades the core venv dependency packages (currently pip@footnote{https://pypi.org/project/pip/})
in the environment. This is done by shelling out to the
@code{pip} executable in the environment.


Added in version 3.9.



Changed in version 3.12: setuptools@footnote{https://pypi.org/project/setuptools/} is no longer a core venv dependency.

@end deffn

@geindex post_setup() (venv.EnvBuilder method)
@anchor{library/venv venv EnvBuilder post_setup}@anchor{4c29}
@deffn {Method} post_setup (context)

A placeholder method which can be overridden in third party
implementations to pre-install packages in the virtual environment or
perform other post-creation steps.
@end deffn

@geindex install_scripts() (venv.EnvBuilder method)
@anchor{library/venv venv EnvBuilder install_scripts}@anchor{4c2a}
@deffn {Method} install_scripts (context, path)

This method can be
called from @ref{4c28,,setup_scripts()} or @ref{4c29,,post_setup()} in subclasses to
assist in installing custom scripts into the virtual environment.

`path' is the path to a directory that should contain subdirectories
@code{common}, @code{posix}, @code{nt}; each containing scripts destined for the
@code{bin} directory in the environment.  The contents of @code{common} and the
directory corresponding to @ref{3073,,os.name} are copied after some text
replacement of placeholders:


@itemize *

@item 
@code{__VENV_DIR__} is replaced with the absolute path of the environment
directory.

@item 
@code{__VENV_NAME__} is replaced with the environment name (final path
segment of environment directory).

@item 
@code{__VENV_PROMPT__} is replaced with the prompt (the environment
name surrounded by parentheses and with a following space)

@item 
@code{__VENV_BIN_NAME__} is replaced with the name of the bin directory
(either @code{bin} or @code{Scripts}).

@item 
@code{__VENV_PYTHON__} is replaced with the absolute path of the
environment’s executable.
@end itemize

The directories are allowed to exist (for when an existing environment
is being upgraded).
@end deffn

@geindex create_git_ignore_file() (venv.EnvBuilder method)
@anchor{library/venv venv EnvBuilder create_git_ignore_file}@anchor{4c23}
@deffn {Method} create_git_ignore_file (context)

Creates a @code{.gitignore} file within the virtual environment that causes
the entire directory to be ignored by the Git source control manager.


Added in version 3.13.

@end deffn


Changed in version 3.7.2: Windows now uses redirector scripts for @code{python[w].exe} instead of
copying the actual binaries. In 3.7.2 only @ref{4c27,,setup_python()} does
nothing unless running from a build in the source tree.



Changed in version 3.7.3: Windows copies the redirector scripts as part of @ref{4c27,,setup_python()}
instead of @ref{4c28,,setup_scripts()}. This was not the case in 3.7.2.
When using symlinks, the original executables will be linked.

@end deffn

There is also a module-level convenience function:

@geindex create() (in module venv)
@anchor{library/venv venv create}@anchor{572}
@deffn {Function} venv.create (env_dir, system_site_packages=False, clear=False, symlinks=False, with_pip=False, prompt=None, upgrade_deps=False, *, scm_ignore_files=frozenset())

Create an @ref{571,,EnvBuilder} with the given keyword arguments, and call its
@ref{4c24,,create()} method with the `env_dir' argument.


Added in version 3.3.



Changed in version 3.4: Added the `with_pip' parameter



Changed in version 3.6: Added the `prompt' parameter



Changed in version 3.9: Added the `upgrade_deps' parameter



Changed in version 3.13: Added the `scm_ignore_files' parameter

@end deffn

@node An example of extending EnvBuilder,,API<2>,venv — Creation of virtual environments
@anchor{library/venv an-example-of-extending-envbuilder}@anchor{4c2c}
@subsubsection An example of extending @code{EnvBuilder}


The following script shows how to extend @ref{571,,EnvBuilder} by implementing a
subclass which installs setuptools and pip into a created virtual environment:

@example
import os
import os.path
from subprocess import Popen, PIPE
import sys
from threading import Thread
from urllib.parse import urlsplit
from urllib.request import urlretrieve
import venv

class ExtendedEnvBuilder(venv.EnvBuilder):
    """
    This builder installs setuptools and pip so that you can pip or
    easy_install other packages into the created virtual environment.

    :param nodist: If true, setuptools and pip are not installed into the
                   created virtual environment.
    :param nopip: If true, pip is not installed into the created
                  virtual environment.
    :param progress: If setuptools or pip are installed, the progress of the
                     installation can be monitored by passing a progress
                     callable. If specified, it is called with two
                     arguments: a string indicating some progress, and a
                     context indicating where the string is coming from.
                     The context argument can have one of three values:
                     'main', indicating that it is called from virtualize()
                     itself, and 'stdout' and 'stderr', which are obtained
                     by reading lines from the output streams of a subprocess
                     which is used to install the app.

                     If a callable is not specified, default progress
                     information is output to sys.stderr.
    """

    def __init__(self, *args, **kwargs):
        self.nodist = kwargs.pop('nodist', False)
        self.nopip = kwargs.pop('nopip', False)
        self.progress = kwargs.pop('progress', None)
        self.verbose = kwargs.pop('verbose', False)
        super().__init__(*args, **kwargs)

    def post_setup(self, context):
        """
        Set up any packages which need to be pre-installed into the
        virtual environment being created.

        :param context: The information for the virtual environment
                        creation request being processed.
        """
        os.environ['VIRTUAL_ENV'] = context.env_dir
        if not self.nodist:
            self.install_setuptools(context)
        # Can't install pip without setuptools
        if not self.nopip and not self.nodist:
            self.install_pip(context)

    def reader(self, stream, context):
        """
        Read lines from a subprocess' output stream and either pass to a progress
        callable (if specified) or write progress information to sys.stderr.
        """
        progress = self.progress
        while True:
            s = stream.readline()
            if not s:
                break
            if progress is not None:
                progress(s, context)
            else:
                if not self.verbose:
                    sys.stderr.write('.')
                else:
                    sys.stderr.write(s.decode('utf-8'))
                sys.stderr.flush()
        stream.close()

    def install_script(self, context, name, url):
        _, _, path, _, _ = urlsplit(url)
        fn = os.path.split(path)[-1]
        binpath = context.bin_path
        distpath = os.path.join(binpath, fn)
        # Download script into the virtual environment's binaries folder
        urlretrieve(url, distpath)
        progress = self.progress
        if self.verbose:
            term = '\n'
        else:
            term = '@w{'}
        if progress is not None:
            progress('Installing %s ...%s' % (name, term), 'main')
        else:
            sys.stderr.write('Installing %s ...%s' % (name, term))
            sys.stderr.flush()
        # Install in the virtual environment
        args = [context.env_exe, fn]
        p = Popen(args, stdout=PIPE, stderr=PIPE, cwd=binpath)
        t1 = Thread(target=self.reader, args=(p.stdout, 'stdout'))
        t1.start()
        t2 = Thread(target=self.reader, args=(p.stderr, 'stderr'))
        t2.start()
        p.wait()
        t1.join()
        t2.join()
        if progress is not None:
            progress('done.', 'main')
        else:
            sys.stderr.write('done.\n')
        # Clean up - no longer needed
        os.unlink(distpath)

    def install_setuptools(self, context):
        """
        Install setuptools in the virtual environment.

        :param context: The information for the virtual environment
                        creation request being processed.
        """
        url = "https://bootstrap.pypa.io/ez_setup.py"
        self.install_script(context, 'setuptools', url)
        # clear up the setuptools archive which gets downloaded
        pred = lambda o: o.startswith('setuptools-') and o.endswith('.tar.gz')
        files = filter(pred, os.listdir(context.bin_path))
        for f in files:
            f = os.path.join(context.bin_path, f)
            os.unlink(f)

    def install_pip(self, context):
        """
        Install pip in the virtual environment.

        :param context: The information for the virtual environment
                        creation request being processed.
        """
        url = 'https://bootstrap.pypa.io/get-pip.py'
        self.install_script(context, 'pip', url)


def main(args=None):
    import argparse

    parser = argparse.ArgumentParser(prog=__name__,
                                     description='Creates virtual Python '
                                                 'environments in one or '
                                                 'more target '
                                                 'directories.')
    parser.add_argument('dirs', metavar='ENV_DIR', nargs='+',
                        help='A directory in which to create the '
                             'virtual environment.')
    parser.add_argument('--no-setuptools', default=False,
                        action='store_true', dest='nodist',
                        help="Don't install setuptools or pip in the "
                             "virtual environment.")
    parser.add_argument('--no-pip', default=False,
                        action='store_true', dest='nopip',
                        help="Don't install pip in the virtual "
                             "environment.")
    parser.add_argument('--system-site-packages', default=False,
                        action='store_true', dest='system_site',
                        help='Give the virtual environment access to the '
                             'system site-packages dir.')
    if os.name == 'nt':
        use_symlinks = False
    else:
        use_symlinks = True
    parser.add_argument('--symlinks', default=use_symlinks,
                        action='store_true', dest='symlinks',
                        help='Try to use symlinks rather than copies, '
                             'when symlinks are not the default for '
                             'the platform.')
    parser.add_argument('--clear', default=False, action='store_true',
                        dest='clear', help='Delete the contents of the '
                                           'virtual environment '
                                           'directory if it already '
                                           'exists, before virtual '
                                           'environment creation.')
    parser.add_argument('--upgrade', default=False, action='store_true',
                        dest='upgrade', help='Upgrade the virtual '
                                             'environment directory to '
                                             'use this version of '
                                             'Python, assuming Python '
                                             'has been upgraded '
                                             'in-place.')
    parser.add_argument('--verbose', default=False, action='store_true',
                        dest='verbose', help='Display the output '
                                             'from the scripts which '
                                             'install setuptools and pip.')
    options = parser.parse_args(args)
    if options.upgrade and options.clear:
        raise ValueError('you cannot supply --upgrade and --clear together.')
    builder = ExtendedEnvBuilder(system_site_packages=options.system_site,
                                   clear=options.clear,
                                   symlinks=options.symlinks,
                                   upgrade=options.upgrade,
                                   nodist=options.nodist,
                                   nopip=options.nopip,
                                   verbose=options.verbose)
    for d in options.dirs:
        builder.create(d)

if __name__ == '__main__':
    rc = 1
    try:
        main()
        rc = 0
    except Exception as e:
        print('Error: %s' % e, file=sys.stderr)
    sys.exit(rc)
@end example

This script is also available for download online@footnote{https://gist.github.com/vsajip/4673395}.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node zipapp — Manage executable Python zip archives,,venv — Creation of virtual environments,Software Packaging and Distribution
@anchor{library/zipapp doc}@anchor{4c2d}@anchor{library/zipapp module-zipapp}@anchor{137}@anchor{library/zipapp translation-repo}@anchor{4c2e}@anchor{library/zipapp zipapp-manage-executable-python-zip-archives}@anchor{4c2f}
@subsection @code{zipapp} — Manage executable Python zip archives


@geindex module; zipapp


Added in version 3.5.


`Source code:' Lib/zipapp.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/zipapp.py}

@geindex Executable Zip Files


__________________________________________________________________


This module provides tools to manage the creation of zip files containing
Python code, which can be  @ref{215e,,executed directly by the Python interpreter}.  The module provides both a
@ref{4c30,,Command-Line Interface} and a @ref{4c31,,Python API}.

@menu
* Basic Example:: 
* Command-Line Interface: Command-Line Interface<4>. 
* Python API:: 
* Examples: Examples<33>. 
* Specifying the Interpreter:: 
* Creating Standalone Applications with zipapp:: 
* The Python Zip Application Archive Format:: 

@end menu

@node Basic Example,Command-Line Interface<4>,,zipapp — Manage executable Python zip archives
@anchor{library/zipapp basic-example}@anchor{4c32}
@subsubsection Basic Example


The following example shows how the @ref{4c30,,Command-Line Interface}
can be used to create an executable archive from a directory containing
Python code.  When run, the archive will execute the @code{main} function from
the module @code{myapp} in the archive.

@example
$ python -m zipapp myapp -m "myapp:main"
$ python myapp.pyz
<output from myapp>
@end example

@node Command-Line Interface<4>,Python API,Basic Example,zipapp — Manage executable Python zip archives
@anchor{library/zipapp command-line-interface}@anchor{4c33}@anchor{library/zipapp zipapp-command-line-interface}@anchor{4c30}
@subsubsection Command-Line Interface


When called as a program from the command line, the following form is used:

@example
$ python -m zipapp source [options]
@end example

If `source' is a directory, this will create an archive from the contents of
`source'.  If `source' is a file, it should be an archive, and it will be
copied to the target archive (or the contents of its shebang line will be
displayed if the –info option is specified).

The following options are understood:

@geindex zipapp command line option; -o
@geindex zipapp command line option; --output
@anchor{library/zipapp cmdoption-zipapp-o}@anchor{4c34}@anchor{library/zipapp cmdoption-zipapp-output}@anchor{4c35}
@deffn {Option} @w{-}o <output>, @w{-}@w{-}output=<output>

Write the output to a file named `output'.  If this option is not specified,
the output filename will be the same as the input `source', with the
extension @code{.pyz} added.  If an explicit filename is given, it is used as
is (so a @code{.pyz} extension should be included if required).

An output filename must be specified if the `source' is an archive (and in
that case, `output' must not be the same as `source').
@end deffn

@geindex zipapp command line option; -p
@geindex zipapp command line option; --python
@anchor{library/zipapp cmdoption-zipapp-p}@anchor{4c36}@anchor{library/zipapp cmdoption-zipapp-python}@anchor{4c37}
@deffn {Option} @w{-}p <interpreter>, @w{-}@w{-}python=<interpreter>

Add a @code{#!} line to the archive specifying `interpreter' as the command
to run.  Also, on POSIX, make the archive executable.  The default is to
write no @code{#!} line, and not make the file executable.
@end deffn

@geindex zipapp command line option; -m
@geindex zipapp command line option; --main
@anchor{library/zipapp cmdoption-zipapp-m}@anchor{4c38}@anchor{library/zipapp cmdoption-zipapp-main}@anchor{4c39}
@deffn {Option} @w{-}m <mainfn>, @w{-}@w{-}main=<mainfn>

Write a @code{__main__.py} file to the archive that executes `mainfn'.  The
`mainfn' argument should have the form “pkg.mod:fn”, where “pkg.mod” is a
package/module in the archive, and “fn” is a callable in the given module.
The @code{__main__.py} file will execute that callable.

@ref{4c38,,--main} cannot be specified when copying an archive.
@end deffn

@geindex zipapp command line option; -c
@geindex zipapp command line option; --compress
@anchor{library/zipapp cmdoption-zipapp-c}@anchor{4c3a}@anchor{library/zipapp cmdoption-zipapp-compress}@anchor{4c3b}
@deffn {Option} @w{-}c, @w{-}@w{-}compress

Compress files with the deflate method, reducing the size of the output
file. By default, files are stored uncompressed in the archive.

@ref{4c3a,,--compress} has no effect when copying an archive.


Added in version 3.7.

@end deffn

@geindex zipapp command line option; --info
@anchor{library/zipapp cmdoption-zipapp-info}@anchor{4c3c}
@deffn {Option} @w{-}@w{-}info

Display the interpreter embedded in the archive, for diagnostic purposes.  In
this case, any other options are ignored and SOURCE must be an archive, not a
directory.
@end deffn

@geindex zipapp command line option; -h
@geindex zipapp command line option; --help
@anchor{library/zipapp cmdoption-zipapp-h}@anchor{4c3d}@anchor{library/zipapp cmdoption-zipapp-help}@anchor{4c3e}
@deffn {Option} @w{-}h, @w{-}@w{-}help

Print a short usage message and exit.
@end deffn

@node Python API,Examples<33>,Command-Line Interface<4>,zipapp — Manage executable Python zip archives
@anchor{library/zipapp python-api}@anchor{4c3f}@anchor{library/zipapp zipapp-python-api}@anchor{4c31}
@subsubsection Python API


The module defines two convenience functions:

@geindex create_archive() (in module zipapp)
@anchor{library/zipapp zipapp create_archive}@anchor{daf}
@deffn {Function} zipapp.create_archive (source, target=None, interpreter=None, main=None, filter=None, compressed=False)

Create an application archive from `source'.  The source can be any
of the following:


@itemize *

@item 
The name of a directory, or a @ref{5a1,,path-like object} referring
to a directory, in which case a new application archive will be
created from the content of that directory.

@item 
The name of an existing application archive file, or a @ref{5a1,,path-like object}
referring to such a file, in which case the file is copied to
the target (modifying it to reflect the value given for the `interpreter'
argument).  The file name should include the @code{.pyz} extension, if required.

@item 
A file object open for reading in bytes mode.  The content of the
file should be an application archive, and the file object is
assumed to be positioned at the start of the archive.
@end itemize

The `target' argument determines where the resulting archive will be
written:


@itemize *

@item 
If it is the name of a file, or a @ref{5a1,,path-like object},
the archive will be written to that file.

@item 
If it is an open file object, the archive will be written to that
file object, which must be open for writing in bytes mode.

@item 
If the target is omitted (or @code{None}), the source must be a directory
and the target will be a file with the same name as the source, with
a @code{.pyz} extension added.
@end itemize

The `interpreter' argument specifies the name of the Python
interpreter with which the archive will be executed.  It is written as
a “shebang” line at the start of the archive.  On POSIX, this will be
interpreted by the OS, and on Windows it will be handled by the Python
launcher.  Omitting the `interpreter' results in no shebang line being
written.  If an interpreter is specified, and the target is a
filename, the executable bit of the target file will be set.

The `main' argument specifies the name of a callable which will be
used as the main program for the archive.  It can only be specified if
the source is a directory, and the source does not already contain a
@code{__main__.py} file.  The `main' argument should take the form
“pkg.module:callable” and the archive will be run by importing
“pkg.module” and executing the given callable with no arguments.  It
is an error to omit `main' if the source is a directory and does not
contain a @code{__main__.py} file, as otherwise the resulting archive
would not be executable.

The optional `filter' argument specifies a callback function that
is passed a Path object representing the path to the file being added
(relative to the source directory).  It should return @code{True} if the
file is to be added.

The optional `compressed' argument determines whether files are
compressed.  If set to @code{True}, files in the archive are compressed
with the deflate method; otherwise, files are stored uncompressed.
This argument has no effect when copying an existing archive.

If a file object is specified for `source' or `target', it is the
caller’s responsibility to close it after calling create_archive.

When copying an existing archive, file objects supplied only need
@code{read} and @code{readline}, or @code{write} methods.  When creating an
archive from a directory, if the target is a file object it will be
passed to the @code{zipfile.ZipFile} class, and must supply the methods
needed by that class.


Changed in version 3.7: Added the `filter' and `compressed' parameters.

@end deffn

@geindex get_interpreter() (in module zipapp)
@anchor{library/zipapp zipapp get_interpreter}@anchor{4c40}
@deffn {Function} zipapp.get_interpreter (archive)

Return the interpreter specified in the @code{#!} line at the start of the
archive.  If there is no @code{#!} line, return @ref{887,,None}.
The `archive' argument can be a filename or a file-like object open
for reading in bytes mode.  It is assumed to be at the start of the archive.
@end deffn

@node Examples<33>,Specifying the Interpreter,Python API,zipapp — Manage executable Python zip archives
@anchor{library/zipapp examples}@anchor{4c41}@anchor{library/zipapp zipapp-examples}@anchor{4c42}
@subsubsection Examples


Pack up a directory into an archive, and run it.

@example
$ python -m zipapp myapp
$ python myapp.pyz
<output from myapp>
@end example

The same can be done using the @ref{daf,,create_archive()} function:

@example
>>> import zipapp
>>> zipapp.create_archive('myapp', 'myapp.pyz')
@end example

To make the application directly executable on POSIX, specify an interpreter
to use.

@example
$ python -m zipapp myapp -p "/usr/bin/env python"
$ ./myapp.pyz
<output from myapp>
@end example

To replace the shebang line on an existing archive, create a modified archive
using the @ref{daf,,create_archive()} function:

@example
>>> import zipapp
>>> zipapp.create_archive('old_archive.pyz', 'new_archive.pyz', '/usr/bin/python3')
@end example

To update the file in place, do the replacement in memory using a @ref{10aa,,BytesIO}
object, and then overwrite the source afterwards.  Note that there is a risk
when overwriting a file in place that an error will result in the loss of
the original file.  This code does not protect against such errors, but
production code should do so.  Also, this method will only work if the archive
fits in memory:

@example
>>> import zipapp
>>> import io
>>> temp = io.BytesIO()
>>> zipapp.create_archive('myapp.pyz', temp, '/usr/bin/python2')
>>> with open('myapp.pyz', 'wb') as f:
>>>     f.write(temp.getvalue())
@end example

@node Specifying the Interpreter,Creating Standalone Applications with zipapp,Examples<33>,zipapp — Manage executable Python zip archives
@anchor{library/zipapp specifying-the-interpreter}@anchor{4c43}@anchor{library/zipapp zipapp-specifying-the-interpreter}@anchor{4c44}
@subsubsection Specifying the Interpreter


Note that if you specify an interpreter and then distribute your application
archive, you need to ensure that the interpreter used is portable.  The Python
launcher for Windows supports most common forms of POSIX @code{#!} line, but there
are other issues to consider:


@itemize *

@item 
If you use “/usr/bin/env python” (or other forms of the “python” command,
such as “/usr/bin/python”), you need to consider that your users may have
either Python 2 or Python 3 as their default, and write your code to work
under both versions.

@item 
If you use an explicit version, for example “/usr/bin/env python3” your
application will not work for users who do not have that version.  (This
may be what you want if you have not made your code Python 2 compatible).

@item 
There is no way to say “python X.Y or later”, so be careful of using an
exact version like “/usr/bin/env python3.4” as you will need to change your
shebang line for users of Python 3.5, for example.
@end itemize

Typically, you should use an “/usr/bin/env python2” or “/usr/bin/env python3”,
depending on whether your code is written for Python 2 or 3.

@node Creating Standalone Applications with zipapp,The Python Zip Application Archive Format,Specifying the Interpreter,zipapp — Manage executable Python zip archives
@anchor{library/zipapp creating-standalone-applications-with-zipapp}@anchor{4c45}
@subsubsection Creating Standalone Applications with zipapp


Using the @code{zipapp} module, it is possible to create self-contained Python
programs, which can be distributed to end users who only need to have a
suitable version of Python installed on their system.  The key to doing this
is to bundle all of the application’s dependencies into the archive, along
with the application code.

The steps to create a standalone archive are as follows:


@enumerate 

@item 
Create your application in a directory as normal, so you have a @code{myapp}
directory containing a @code{__main__.py} file, and any supporting application
code.

@item 
Install all of your application’s dependencies into the @code{myapp} directory,
using pip:

@example
$ python -m pip install -r requirements.txt --target myapp
@end example

(this assumes you have your project requirements in a @code{requirements.txt}
file - if not, you can just list the dependencies manually on the pip command
line).

@item 
Package the application using:

@example
$ python -m zipapp -p "interpreter" myapp
@end example
@end enumerate

This will produce a standalone executable, which can be run on any machine with
the appropriate interpreter available. See @ref{4c44,,Specifying the Interpreter}
for details. It can be shipped to users as a single file.

On Unix, the @code{myapp.pyz} file is executable as it stands.  You can rename the
file to remove the @code{.pyz} extension if you prefer a “plain” command name.  On
Windows, the @code{myapp.pyz[w]} file is executable by virtue of the fact that
the Python interpreter registers the @code{.pyz} and @code{.pyzw} file extensions
when installed.

@menu
* Caveats:: 

@end menu

@node Caveats,,,Creating Standalone Applications with zipapp
@anchor{library/zipapp caveats}@anchor{4c46}
@subsubsection Caveats


If your application depends on a package that includes a C extension, that
package cannot be run from a zip file (this is an OS limitation, as executable
code must be present in the filesystem for the OS loader to load it). In this
case, you can exclude that dependency from the zipfile, and either require
your users to have it installed, or ship it alongside your zipfile and add code
to your @code{__main__.py} to include the directory containing the unzipped
module in @code{sys.path}. In this case, you will need to make sure to ship
appropriate binaries for your target architecture(s) (and potentially pick the
correct version to add to @code{sys.path} at runtime, based on the user’s machine).

@node The Python Zip Application Archive Format,,Creating Standalone Applications with zipapp,zipapp — Manage executable Python zip archives
@anchor{library/zipapp the-python-zip-application-archive-format}@anchor{4c47}
@subsubsection The Python Zip Application Archive Format


Python has been able to execute zip files which contain a @code{__main__.py} file
since version 2.6.  In order to be executed by Python, an application archive
simply has to be a standard zip file containing a @code{__main__.py} file which
will be run as the entry point for the application.  As usual for any Python
script, the parent of the script (in this case the zip file) will be placed on
@ref{3e2,,sys.path} and thus further modules can be imported from the zip file.

The zip file format allows arbitrary data to be prepended to a zip file.  The
zip application format uses this ability to prepend a standard POSIX “shebang”
line to the file (@code{#!/path/to/interpreter}).

Formally, the Python zip application format is therefore:


@enumerate 

@item 
An optional shebang line, containing the characters @code{b'#!'} followed by an
interpreter name, and then a newline (@code{b'\n'}) character.  The interpreter
name can be anything acceptable to the OS “shebang” processing, or the Python
launcher on Windows.  The interpreter should be encoded in UTF-8 on Windows,
and in @ref{e59,,sys.getfilesystemencoding()} on POSIX.

@item 
Standard zipfile data, as generated by the @ref{138,,zipfile} module.  The
zipfile content `must' include a file called @code{__main__.py} (which must be
in the “root” of the zipfile - i.e., it cannot be in a subdirectory).  The
zipfile data can be compressed or uncompressed.
@end enumerate

If an application archive has a shebang line, it may have the executable bit set
on POSIX systems, to allow it to be executed directly.

There is no requirement that the tools in this module are used to create
application archives - the module is a convenience, but archives in the above
format created by any means are acceptable to Python.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Python Runtime Services,Custom Python Interpreters,Software Packaging and Distribution,The Python Standard Library
@anchor{library/python doc}@anchor{4c48}@anchor{library/python python}@anchor{4c49}@anchor{library/python python-runtime-services}@anchor{4c4a}@anchor{library/python translation-repo}@anchor{4c4b}
@section Python Runtime Services


The modules described in this chapter provide a wide range of services related
to the Python interpreter and its interaction with its environment.  Here’s an
overview:

@menu
* sys — System-specific parameters and functions:: 
* sys.monitoring — Execution event monitoring: sys monitoring — Execution event monitoring. 
* sysconfig — Provide access to Python’s configuration information:: 
* builtins — Built-in objects:: 
* __main__ — Top-level code environment:: 
* warnings — Warning control:: 
* dataclasses — Data Classes:: 
* contextlib — Utilities for with-statement contexts:: 
* abc — Abstract Base Classes:: 
* atexit — Exit handlers:: 
* traceback — Print or retrieve a stack traceback:: 
* __future__ — Future statement definitions:: 
* gc — Garbage Collector interface:: 
* inspect — Inspect live objects:: 
* annotationlib — Functionality for introspecting annotations:: 
* site — Site-specific configuration hook:: 

@end menu

@node sys — System-specific parameters and functions,sys monitoring — Execution event monitoring,,Python Runtime Services
@anchor{library/sys doc}@anchor{4c4c}@anchor{library/sys module-sys}@anchor{df}@anchor{library/sys sys-system-specific-parameters-and-functions}@anchor{4c4d}
@subsection @code{sys} — System-specific parameters and functions


@geindex module; sys


__________________________________________________________________


This module provides access to some variables used or maintained by the
interpreter and to functions that interact strongly with the interpreter. It is
always available. Unless explicitly noted otherwise, all variables are read-only.

@geindex abiflags (in module sys)
@anchor{library/sys sys abiflags}@anchor{c5f}
@deffn {Data} sys.abiflags

On POSIX systems where Python was built with the standard @code{configure}
script, this contains the ABI flags as specified by 
@geindex Python Enhancement Proposals; PEP 3149
PEP 3149@footnote{https://peps.python.org/pep-3149/}.


Added in version 3.2.



Changed in version 3.8: Default flags became an empty string (@code{m} flag for pymalloc has been
removed).


@ref{2181,,Availability}: Unix.
@end deffn

@geindex addaudithook() (in module sys)
@anchor{library/sys sys addaudithook}@anchor{4ab0}
@deffn {Function} sys.addaudithook (hook)

Append the callable `hook' to the list of active auditing hooks for the
current (sub)interpreter.

When an auditing event is raised through the @ref{195f,,sys.audit()} function, each
hook will be called in the order it was added with the event name and the
tuple of arguments. Native hooks added by @ref{4ab1,,PySys_AddAuditHook()} are
called first, followed by hooks added in the current (sub)interpreter.  Hooks
can then log the event, raise an exception to abort the operation,
or terminate the process entirely.

Note that audit hooks are primarily for collecting information about internal
or otherwise unobservable actions, whether by Python or libraries written in
Python. They are not suitable for implementing a “sandbox”. In particular,
malicious code can trivially disable or bypass hooks added using this
function. At a minimum, any security-sensitive hooks must be added using the
C API @ref{4ab1,,PySys_AddAuditHook()} before initialising the runtime, and any
modules allowing arbitrary memory modification (such as @ref{2e,,ctypes}) should
be completely removed or closely monitored.


Calling @code{sys.addaudithook()} will itself raise an auditing event
named @code{sys.addaudithook} with no arguments. If any
existing hooks raise an exception derived from @ref{246,,RuntimeError}, the
new hook will not be added and the exception suppressed. As a result,
callers cannot assume that their hook has been added unless they control
all existing hooks.


See the @ref{1c56,,audit events table} for all events raised by
CPython, and 
@geindex Python Enhancement Proposals; PEP 578
PEP 578@footnote{https://peps.python.org/pep-0578/} for the original design discussion.


Added in version 3.8.



Changed in version 3.8.1: Exceptions derived from @ref{bd3,,Exception} but not @ref{246,,RuntimeError}
are no longer suppressed.


`CPython implementation detail:' When tracing is enabled (see @ref{2e3,,settrace()}), Python hooks are only
traced if the callable has a @code{__cantrace__} member that is set to a
true value. Otherwise, trace functions will skip the hook.
@end deffn

@geindex argv (in module sys)
@anchor{library/sys sys argv}@anchor{1470}
@deffn {Data} sys.argv

The list of command line arguments passed to a Python script. @code{argv[0]} is the
script name (it is operating system dependent whether this is a full pathname or
not).  If the command was executed using the @ref{1a9,,-c} command line option to
the interpreter, @code{argv[0]} is set to the string @code{'-c'}.  If no script name
was passed to the Python interpreter, @code{argv[0]} is the empty string.

To loop over the standard input, or the list of files given on the
command line, see the @ref{5f,,fileinput} module.

See also @ref{a47,,sys.orig_argv}.

@cartouche
@quotation Note 
On Unix, command line arguments are passed by bytes from OS.  Python decodes
them with filesystem encoding and “surrogateescape” error handler.
When you need original bytes, you can get it by
@code{[os.fsencode(arg) for arg in sys.argv]}.
@end quotation
@end cartouche
@end deffn

@geindex audit() (in module sys)
@anchor{library/sys auditing}@anchor{1cb1}@anchor{library/sys sys audit}@anchor{195f}
@deffn {Function} sys.audit (event, *args)

@geindex auditing

Raise an auditing event and trigger any active auditing hooks.
`event' is a string identifying the event, and `args' may contain
optional arguments with more information about the event.  The
number and types of arguments for a given event are considered a
public and stable API and should not be modified between releases.

For example, one auditing event is named @code{os.chdir}. This event has
one argument called `path' that will contain the requested new
working directory.

@code{sys.audit()} will call the existing auditing hooks, passing
the event name and arguments, and will re-raise the first exception
from any hook. In general, if an exception is raised, it should not
be handled and the process should be terminated as quickly as
possible. This allows hook implementations to decide how to respond
to particular events: they can merely log the event or abort the
operation by raising an exception.

Hooks are added using the @ref{4ab0,,sys.addaudithook()} or
@ref{4ab1,,PySys_AddAuditHook()} functions.

The native equivalent of this function is @ref{613,,PySys_Audit()}. Using the
native function is preferred when possible.

See the @ref{1c56,,audit events table} for all events raised by
CPython.


Added in version 3.8.

@end deffn

@geindex base_exec_prefix (in module sys)
@anchor{library/sys sys base_exec_prefix}@anchor{3e8}
@deffn {Data} sys.base_exec_prefix

Equivalent to @ref{3e9,,exec_prefix}, but referring to the base Python installation.

When running under @ref{4c13,,Virtual Environments},
@ref{3e9,,exec_prefix} gets overwritten to the virtual environment prefix.
@code{base_exec_prefix}, conversely, does not change, and always points to
the base Python installation.
Refer to @ref{4c13,,Virtual Environments} for more information.


Added in version 3.3.

@end deffn

@geindex base_prefix (in module sys)
@anchor{library/sys sys base_prefix}@anchor{3e4}
@deffn {Data} sys.base_prefix

Equivalent to @ref{3e5,,prefix}, but referring to the base Python installation.

When running under @ref{3e6,,virtual environment},
@ref{3e5,,prefix} gets overwritten to the virtual environment prefix.
@code{base_prefix}, conversely, does not change, and always points to
the base Python installation.
Refer to @ref{4c13,,Virtual Environments} for more information.


Added in version 3.3.

@end deffn

@geindex byteorder (in module sys)
@anchor{library/sys sys byteorder}@anchor{263f}
@deffn {Data} sys.byteorder

An indicator of the native byte order.  This will have the value @code{'big'} on
big-endian (most-significant byte first) platforms, and @code{'little'} on
little-endian (least-significant byte first) platforms.
@end deffn

@geindex builtin_module_names (in module sys)
@anchor{library/sys sys builtin_module_names}@anchor{208b}
@deffn {Data} sys.builtin_module_names

A tuple of strings containing the names of all modules that are compiled into this
Python interpreter.  (This information is not available in any other way —
@code{modules.keys()} only lists the imported modules.)

See also the @ref{a48,,sys.stdlib_module_names} list.
@end deffn

@geindex call_tracing() (in module sys)
@anchor{library/sys sys call_tracing}@anchor{1c06}
@deffn {Function} sys.call_tracing (func, args)

Call @code{func(*args)}, while tracing is enabled.  The tracing state is saved,
and restored afterwards.  This is intended to be called from a debugger from
a checkpoint, to recursively debug or profile some other code.

Tracing is suspended while calling a tracing function set by
@ref{2e3,,settrace()} or @ref{170a,,setprofile()} to avoid infinite recursion.
@code{call_tracing()} enables explicit recursion of the tracing function.
@end deffn

@geindex copyright (in module sys)
@anchor{library/sys sys copyright}@anchor{4c4e}
@deffn {Data} sys.copyright

A string containing the copyright pertaining to the Python interpreter.
@end deffn

@geindex _clear_type_cache() (in module sys)
@anchor{library/sys sys _clear_type_cache}@anchor{294}
@deffn {Function} sys._clear_type_cache ()

Clear the internal type cache. The type cache is used to speed up attribute
and method lookups. Use the function `only' to drop unnecessary references
during reference leak debugging.

This function should be used for internal and specialized purposes only.


Deprecated since version 3.13: Use the more general @ref{362,,_clear_internal_caches()} function instead.

@end deffn

@geindex _clear_internal_caches() (in module sys)
@anchor{library/sys sys _clear_internal_caches}@anchor{362}
@deffn {Function} sys._clear_internal_caches ()

Clear all internal performance-related caches. Use this function `only' to
release unnecessary references and memory blocks when hunting for leaks.


Added in version 3.13.

@end deffn

@geindex _current_frames() (in module sys)
@anchor{library/sys sys _current_frames}@anchor{163f}
@deffn {Function} sys._current_frames ()

Return a dictionary mapping each thread’s identifier to the topmost stack frame
currently active in that thread at the time the function is called. Note that
functions in the @ref{105,,traceback} module can build the call stack given such a
frame.

This is most useful for debugging deadlock:  this function does not require the
deadlocked threads’ cooperation, and such threads’ call stacks are frozen for as
long as they remain deadlocked.  The frame returned for a non-deadlocked thread
may bear no relationship to that thread’s current activity by the time calling
code examines the frame.

This function should be used for internal and specialized purposes only.

Raises an @ref{1cb1,,auditing event} @code{sys._current_frames} with no arguments.
@end deffn

@geindex _current_exceptions() (in module sys)
@anchor{library/sys sys _current_exceptions}@anchor{6ea}
@deffn {Function} sys._current_exceptions ()

Return a dictionary mapping each thread’s identifier to the topmost exception
currently active in that thread at the time the function is called.
If a thread is not currently handling an exception, it is not included in
the result dictionary.

This is most useful for statistical profiling.

This function should be used for internal and specialized purposes only.

Raises an @ref{1cb1,,auditing event} @code{sys._current_exceptions} with no arguments.


Changed in version 3.12: Each value in the dictionary is now a single exception instance, rather
than a 3-tuple as returned from @code{sys.exc_info()}.

@end deffn

@geindex breakpointhook() (in module sys)
@anchor{library/sys sys breakpointhook}@anchor{cd7}
@deffn {Function} sys.breakpointhook ()

This hook function is called by built-in @ref{273,,breakpoint()}.  By default,
it drops you into the @ref{aa,,pdb} debugger, but it can be set to any other
function so that you can choose which debugger gets used.

The signature of this function is dependent on what it calls.  For example,
the default binding (e.g. @code{pdb.set_trace()}) expects no arguments, but
you might bind it to a function that expects additional arguments
(positional and/or keyword).  The built-in @code{breakpoint()} function passes
its @code{*args} and @code{**kws} straight through.  Whatever
@code{breakpointhooks()} returns is returned from @code{breakpoint()}.

The default implementation first consults the environment variable
@geindex PYTHONBREAKPOINT
@geindex environment variable; PYTHONBREAKPOINT
@ref{cd8,,PYTHONBREAKPOINT}.  If that is set to @code{"0"} then this function
returns immediately; i.e. it is a no-op.  If the environment variable is
not set, or is set to the empty string, @code{pdb.set_trace()} is called.
Otherwise this variable should name a function to run, using Python’s
dotted-import nomenclature, e.g. @code{package.subpackage.module.function}.
In this case, @code{package.subpackage.module} would be imported and the
resulting module must have a callable named @code{function()}.  This is run,
passing in @code{*args} and @code{**kws}, and whatever @code{function()} returns,
@code{sys.breakpointhook()} returns to the built-in @ref{273,,breakpoint()}
function.

Note that if anything goes wrong while importing the callable named by
@geindex PYTHONBREAKPOINT
@geindex environment variable; PYTHONBREAKPOINT
@ref{cd8,,PYTHONBREAKPOINT}, a @ref{4d8,,RuntimeWarning} is reported and the
breakpoint is ignored.

Also note that if @code{sys.breakpointhook()} is overridden programmatically,
@geindex PYTHONBREAKPOINT
@geindex environment variable; PYTHONBREAKPOINT
@ref{cd8,,PYTHONBREAKPOINT} is `not' consulted.


Added in version 3.7.

@end deffn

@geindex _debugmallocstats() (in module sys)
@anchor{library/sys sys _debugmallocstats}@anchor{4c4f}
@deffn {Function} sys._debugmallocstats ()

Print low-level information to stderr about the state of CPython’s memory
allocator.

If Python is @ref{50a,,built in debug mode} (@ref{666,,configure --with-pydebug option}), it also performs some expensive
internal consistency checks.


Added in version 3.3.


`CPython implementation detail:' This function is specific to CPython.  The exact output format is not
defined here, and may change.
@end deffn

@geindex dllhandle (in module sys)
@anchor{library/sys sys dllhandle}@anchor{4c50}
@deffn {Data} sys.dllhandle

Integer specifying the handle of the Python DLL.

@ref{2181,,Availability}: Windows.
@end deffn

@geindex displayhook() (in module sys)
@anchor{library/sys sys displayhook}@anchor{172b}
@deffn {Function} sys.displayhook (value)

If `value' is not @code{None}, this function prints @code{repr(value)} to
@code{sys.stdout}, and saves `value' in @code{builtins._}. If @code{repr(value)} is
not encodable to @code{sys.stdout.encoding} with @code{sys.stdout.errors} error
handler (which is probably @code{'strict'}), encode it to
@code{sys.stdout.encoding} with @code{'backslashreplace'} error handler.

@code{sys.displayhook} is called on the result of evaluating an @ref{2416,,expression}
entered in an interactive Python session.  The display of these values can be
customized by assigning another one-argument function to @code{sys.displayhook}.

Pseudo-code:

@example
def displayhook(value):
    if value is None:
        return
    # Set '_' to None to avoid recursion
    builtins._ = None
    text = repr(value)
    try:
        sys.stdout.write(text)
    except UnicodeEncodeError:
        bytes = text.encode(sys.stdout.encoding, 'backslashreplace')
        if hasattr(sys.stdout, 'buffer'):
            sys.stdout.buffer.write(bytes)
        else:
            text = bytes.decode(sys.stdout.encoding, 'strict')
            sys.stdout.write(text)
    sys.stdout.write("\n")
    builtins._ = value
@end example


Changed in version 3.2: Use @code{'backslashreplace'} error handler on @ref{889,,UnicodeEncodeError}.

@end deffn

@geindex dont_write_bytecode (in module sys)
@anchor{library/sys sys dont_write_bytecode}@anchor{4c51}
@deffn {Data} sys.dont_write_bytecode

If this is true, Python won’t try to write @code{.pyc} files on the
import of source modules.  This value is initially set to @code{True} or
@code{False} depending on the @ref{15d9,,-B} command line option and the
@geindex PYTHONDONTWRITEBYTECODE
@geindex environment variable; PYTHONDONTWRITEBYTECODE
@ref{15da,,PYTHONDONTWRITEBYTECODE} environment variable, but you can set it
yourself to control bytecode file generation.
@end deffn

@geindex _emscripten_info (in module sys)
@anchor{library/sys sys _emscripten_info}@anchor{1bd2}
@deffn {Data} sys._emscripten_info

A @ref{85f,,named tuple} holding information about the environment on the
`wasm32-emscripten' platform. The named tuple is provisional and may change
in the future.

@geindex emscripten_version (sys._emscripten_info attribute)
@anchor{library/sys sys _emscripten_info emscripten_version}@anchor{4c52}
@deffn {Attribute} _emscripten_info.emscripten_version

Emscripten version as tuple of ints (major, minor, micro), e.g. @code{(3, 1, 8)}.
@end deffn

@geindex runtime (sys._emscripten_info attribute)
@anchor{library/sys sys _emscripten_info runtime}@anchor{4c53}
@deffn {Attribute} _emscripten_info.runtime

Runtime string, e.g. browser user agent, @code{'Node.js v14.18.2'}, or @code{'UNKNOWN'}.
@end deffn

@geindex pthreads (sys._emscripten_info attribute)
@anchor{library/sys sys _emscripten_info pthreads}@anchor{4c54}
@deffn {Attribute} _emscripten_info.pthreads

@code{True} if Python is compiled with Emscripten pthreads support.
@end deffn

@geindex shared_memory (sys._emscripten_info attribute)
@anchor{library/sys sys _emscripten_info shared_memory}@anchor{4c55}
@deffn {Attribute} _emscripten_info.shared_memory

@code{True} if Python is compiled with shared memory support.
@end deffn

@ref{2181,,Availability}: Emscripten.


Added in version 3.11.

@end deffn

@geindex pycache_prefix (in module sys)
@anchor{library/sys sys pycache_prefix}@anchor{ba2}
@deffn {Data} sys.pycache_prefix

If this is set (not @code{None}), Python will write bytecode-cache @code{.pyc}
files to (and read them from) a parallel directory tree rooted at this
directory, rather than from @code{__pycache__} directories in the source code
tree. Any @code{__pycache__} directories in the source code tree will be ignored
and new @code{.pyc} files written within the pycache prefix. Thus if you use
@ref{21,,compileall} as a pre-build step, you must ensure you run it with the
same pycache prefix (if any) that you will use at runtime.

A relative path is interpreted relative to the current working directory.

This value is initially set based on the value of the @ref{170,,-X}
@code{pycache_prefix=PATH} command-line option or the
@geindex PYTHONPYCACHEPREFIX
@geindex environment variable; PYTHONPYCACHEPREFIX
@ref{ba1,,PYTHONPYCACHEPREFIX} environment variable (command-line takes
precedence). If neither are set, it is @code{None}.


Added in version 3.8.

@end deffn

@geindex excepthook() (in module sys)
@anchor{library/sys sys excepthook}@anchor{a12}
@deffn {Function} sys.excepthook (type, value, traceback)

This function prints out a given traceback and exception to @code{sys.stderr}.

When an exception other than @ref{f42,,SystemExit} is raised and uncaught, the interpreter calls
@code{sys.excepthook} with three arguments, the exception class, exception
instance, and a traceback object.  In an interactive session this happens just
before control is returned to the prompt; in a Python program this happens just
before the program exits.  The handling of such top-level exceptions can be
customized by assigning another three-argument function to @code{sys.excepthook}.


Raise an auditing event @code{sys.excepthook} with arguments @code{hook},
@code{type}, @code{value}, @code{traceback} when an uncaught exception occurs.
If no hook has been set, @code{hook} may be @code{None}. If any hook raises
an exception derived from @ref{246,,RuntimeError} the call to the hook will
be suppressed. Otherwise, the audit hook exception will be reported as
unraisable and @code{sys.excepthook} will be called.



@subsubheading See also


The @ref{508,,sys.unraisablehook()} function handles unraisable exceptions
and the @ref{a51,,threading.excepthook()} function handles exception raised
by @ref{c37,,threading.Thread.run()}.

@end deffn

@geindex __breakpointhook__ (in module sys)
@geindex __displayhook__ (in module sys)
@geindex __excepthook__ (in module sys)
@geindex __unraisablehook__ (in module sys)
@anchor{library/sys sys __breakpointhook__}@anchor{4c56}
@deffn {Data} sys.__breakpointhook__
@anchor{library/sys sys __displayhook__}@anchor{4c57}
@deffnx {Data} sys.__displayhook__
@anchor{library/sys sys __excepthook__}@anchor{4c58}
@deffnx {Data} sys.__excepthook__
@anchor{library/sys sys __unraisablehook__}@anchor{4c59}
@deffnx {Data} sys.__unraisablehook__

These objects contain the original values of @code{breakpointhook},
@code{displayhook}, @code{excepthook}, and @code{unraisablehook} at the start of the
program.  They are saved so that @code{breakpointhook}, @code{displayhook} and
@code{excepthook}, @code{unraisablehook} can be restored in case they happen to
get replaced with broken or alternative objects.


Added in version 3.7: __breakpointhook__



Added in version 3.8: __unraisablehook__

@end deffn

@geindex exception() (in module sys)
@anchor{library/sys sys exception}@anchor{89d}
@deffn {Function} sys.exception ()

This function, when called while an exception handler is executing (such as
an @code{except} or @code{except*} clause), returns the exception instance that
was caught by this handler. When exception handlers are nested within one
another, only the exception handled by the innermost handler is accessible.

If no exception handler is executing, this function returns @code{None}.


Added in version 3.11.

@end deffn

@geindex exc_info() (in module sys)
@anchor{library/sys sys exc_info}@anchor{89c}
@deffn {Function} sys.exc_info ()

This function returns the old-style representation of the handled
exception. If an exception @code{e} is currently handled (so
@ref{89d,,exception()} would return @code{e}), @code{exc_info()} returns the
tuple @code{(type(e), e, e.__traceback__)}.
That is, a tuple containing the type of the exception (a subclass of
@ref{7d8,,BaseException}), the exception itself, and a @ref{cf2,,traceback object} which typically encapsulates the call
stack at the point where the exception last occurred.

@geindex object; traceback

If no exception is being handled anywhere on the stack, this function
return a tuple containing three @code{None} values.


Changed in version 3.11: The @code{type} and @code{traceback} fields are now derived from the @code{value}
(the exception instance), so when an exception is modified while it is
being handled, the changes are reflected in the results of subsequent
calls to @code{exc_info()}.

@end deffn

@geindex exec_prefix (in module sys)
@anchor{library/sys sys exec_prefix}@anchor{3e9}
@deffn {Data} sys.exec_prefix

A string giving the site-specific directory prefix where the platform-dependent
Python files are installed; by default, this is also @code{'/usr/local'}.  This can
be set at build time with the @code{--exec-prefix} argument to the
@code{configure} script.  Specifically, all configuration files (e.g. the
@code{pyconfig.h} header file) are installed in the directory
@code{`exec_prefix'/lib/python`X.Y'/config}, and shared library modules are
installed in @code{`exec_prefix'/lib/python`X.Y'/lib-dynload}, where `X.Y'
is the version number of Python, for example @code{3.2}.

@cartouche
@quotation Note 
If a @ref{3e6,,virtual environment} is in effect, this @code{exec_prefix}
will point to the virtual environment. The value for the Python installation
will still be available, via @ref{3e8,,base_exec_prefix}.
Refer to @ref{4c13,,Virtual Environments} for more information.
@end quotation
@end cartouche


Changed in version 3.14: When running under a @ref{3e6,,virtual environment},
@ref{3e5,,prefix} and @code{exec_prefix} are now set to the virtual
environment prefix by the @ref{1922,,path initialization},
instead of @ref{cc,,site}. This means that @code{prefix} and
@code{exec_prefix} always point to the virtual environment, even when
@code{site} is disabled (@ref{13b4,,-S}).

@end deffn

@geindex executable (in module sys)
@anchor{library/sys sys executable}@anchor{3eb}
@deffn {Data} sys.executable

A string giving the absolute path of the executable binary for the Python
interpreter, on systems where this makes sense. If Python is unable to retrieve
the real path to its executable, @code{sys.executable} will be an empty string
or @code{None}.
@end deffn

@geindex exit() (in module sys)
@anchor{library/sys sys exit}@anchor{279}
@deffn {Function} sys.exit ([arg])

Raise a @ref{f42,,SystemExit} exception, signaling an intention to exit the interpreter.

The optional argument `arg' can be an integer giving the exit status
(defaulting to zero), or another type of object.  If it is an integer, zero
is considered “successful termination” and any nonzero value is considered
“abnormal termination” by shells and the like.  Most systems require it to be
in the range 0–127, and produce undefined results otherwise.  Some systems
have a convention for assigning specific meanings to specific exit codes, but
these are generally underdeveloped; Unix programs generally use 2 for command
line syntax errors and 1 for all other kinds of errors.  If another type of
object is passed, @code{None} is equivalent to passing zero, and any other
object is printed to @ref{b39,,stderr} and results in an exit code of 1.  In
particular, @code{sys.exit("some error message")} is a quick way to exit a
program when an error occurs.

Since @code{exit()} ultimately “only” raises an exception, it will only exit
the process when called from the main thread, and the exception is not
intercepted. Cleanup actions specified by finally clauses of @ref{8fa,,try} statements
are honored, and it is possible to intercept the exit attempt at an outer level.


Changed in version 3.6: If an error occurs in the cleanup after the Python interpreter
has caught @ref{f42,,SystemExit} (such as an error flushing buffered data
in the standard streams), the exit status is changed to 120.

@end deffn

@geindex flags (in module sys)
@anchor{library/sys sys flags}@anchor{89e}
@deffn {Data} sys.flags

The @ref{85f,,named tuple} `flags' exposes the status of command line
flags.  Flags should only be accessed only by name and not by index.  The
attributes are read only.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@geindex debug (sys.flags attribute)
@anchor{library/sys sys flags debug}@anchor{4c5a}
@deffn {Attribute} flags.debug
@end deffn

@tab

@ref{2166,,-d}

@item

@geindex inspect (sys.flags attribute)
@anchor{library/sys sys flags inspect}@anchor{17e2}
@deffn {Attribute} flags.inspect
@end deffn

@tab

@ref{16e7,,-i}

@item

@geindex interactive (sys.flags attribute)
@anchor{library/sys sys flags interactive}@anchor{4c5b}
@deffn {Attribute} flags.interactive
@end deffn

@tab

@ref{16e7,,-i}

@item

@geindex isolated (sys.flags attribute)
@anchor{library/sys sys flags isolated}@anchor{4c5c}
@deffn {Attribute} flags.isolated
@end deffn

@tab

@ref{b5d,,-I}

@item

@geindex optimize (sys.flags attribute)
@anchor{library/sys sys flags optimize}@anchor{4c5d}
@deffn {Attribute} flags.optimize
@end deffn

@tab

@ref{18d,,-O} or @ref{fbb,,-OO}

@item

@geindex dont_write_bytecode (sys.flags attribute)
@anchor{library/sys sys flags dont_write_bytecode}@anchor{4c5e}
@deffn {Attribute} flags.dont_write_bytecode
@end deffn

@tab

@ref{15d9,,-B}

@item

@geindex no_user_site (sys.flags attribute)
@anchor{library/sys sys flags no_user_site}@anchor{4c5f}
@deffn {Attribute} flags.no_user_site
@end deffn

@tab

@ref{159a,,-s}

@item

@geindex no_site (sys.flags attribute)
@anchor{library/sys sys flags no_site}@anchor{4c60}
@deffn {Attribute} flags.no_site
@end deffn

@tab

@ref{13b4,,-S}

@item

@geindex ignore_environment (sys.flags attribute)
@anchor{library/sys sys flags ignore_environment}@anchor{4c61}
@deffn {Attribute} flags.ignore_environment
@end deffn

@tab

@ref{b5c,,-E}

@item

@geindex verbose (sys.flags attribute)
@anchor{library/sys sys flags verbose}@anchor{4c62}
@deffn {Attribute} flags.verbose
@end deffn

@tab

@ref{1631,,-v}

@item

@geindex bytes_warning (sys.flags attribute)
@anchor{library/sys sys flags bytes_warning}@anchor{4c63}
@deffn {Attribute} flags.bytes_warning
@end deffn

@tab

@ref{7fa,,-b}

@item

@geindex quiet (sys.flags attribute)
@anchor{library/sys sys flags quiet}@anchor{4c64}
@deffn {Attribute} flags.quiet
@end deffn

@tab

@ref{17cf,,-q}

@item

@geindex hash_randomization (sys.flags attribute)
@anchor{library/sys sys flags hash_randomization}@anchor{4c65}
@deffn {Attribute} flags.hash_randomization
@end deffn

@tab

@ref{1eba,,-R}

@item

@geindex dev_mode (sys.flags attribute)
@anchor{library/sys sys flags dev_mode}@anchor{1ec4}
@deffn {Attribute} flags.dev_mode
@end deffn

@tab

@ref{170,,-X dev} (@ref{509,,Python Development Mode})

@item

@geindex utf8_mode (sys.flags attribute)
@anchor{library/sys sys flags utf8_mode}@anchor{4c66}
@deffn {Attribute} flags.utf8_mode
@end deffn

@tab

@ref{170,,-X utf8}

@item

@geindex safe_path (sys.flags attribute)
@anchor{library/sys sys flags safe_path}@anchor{53f}
@deffn {Attribute} flags.safe_path
@end deffn

@tab

@ref{7c2,,-P}

@item

@geindex int_max_str_digits (sys.flags attribute)
@anchor{library/sys sys flags int_max_str_digits}@anchor{2725}
@deffn {Attribute} flags.int_max_str_digits
@end deffn

@tab

@ref{170,,-X int_max_str_digits}
(@ref{80c,,integer string conversion length limitation})

@item

@geindex warn_default_encoding (sys.flags attribute)
@anchor{library/sys sys flags warn_default_encoding}@anchor{4c67}
@deffn {Attribute} flags.warn_default_encoding
@end deffn

@tab

@ref{170,,-X warn_default_encoding}

@item

@geindex gil (sys.flags attribute)
@anchor{library/sys sys flags gil}@anchor{4c68}
@deffn {Attribute} flags.gil
@end deffn

@tab

@ref{170,,-X gil} and 
@geindex PYTHON_GIL
@geindex environment variable; PYTHON_GIL
@ref{49b,,PYTHON_GIL}

@item

@geindex thread_inherit_context (sys.flags attribute)
@anchor{library/sys sys flags thread_inherit_context}@anchor{176}
@deffn {Attribute} flags.thread_inherit_context
@end deffn

@tab

@ref{170,,-X thread_inherit_context} and
@geindex PYTHON_THREAD_INHERIT_CONTEXT
@geindex environment variable; PYTHON_THREAD_INHERIT_CONTEXT
@ref{18b1,,PYTHON_THREAD_INHERIT_CONTEXT}

@item

@geindex context_aware_warnings (sys.flags attribute)
@anchor{library/sys sys flags context_aware_warnings}@anchor{18b}
@deffn {Attribute} flags.context_aware_warnings
@end deffn

@tab

@ref{170,,-X context_aware_warnings} and
@geindex PYTHON_CONTEXT_AWARE_WARNINGS
@geindex environment variable; PYTHON_CONTEXT_AWARE_WARNINGS
@ref{18a4,,PYTHON_CONTEXT_AWARE_WARNINGS}

@end multitable



Changed in version 3.2: Added @code{quiet} attribute for the new @ref{17cf,,-q} flag.



Added in version 3.2.3: The @code{hash_randomization} attribute.



Changed in version 3.3: Removed obsolete @code{division_warning} attribute.



Changed in version 3.4: Added @code{isolated} attribute for @ref{b5d,,-I} @code{isolated} flag.



Changed in version 3.7: Added the @code{dev_mode} attribute for the new @ref{509,,Python Development Mode} and the @code{utf8_mode} attribute for the new  @ref{170,,-X}
@code{utf8} flag.



Changed in version 3.10: Added @code{warn_default_encoding} attribute for @ref{170,,-X} @code{warn_default_encoding} flag.



Changed in version 3.11: Added the @code{safe_path} attribute for @ref{7c2,,-P} option.



Changed in version 3.11: Added the @code{int_max_str_digits} attribute.



Changed in version 3.13: Added the @code{gil} attribute.



Changed in version 3.14: Added the @code{thread_inherit_context} attribute.



Changed in version 3.14: Added the @code{context_aware_warnings} attribute.

@end deffn

@geindex float_info (in module sys)
@anchor{library/sys sys float_info}@anchor{1e11}
@deffn {Data} sys.float_info

A @ref{85f,,named tuple} holding information about the float type. It
contains low level information about the precision and internal
representation.  The values correspond to the various floating-point
constants defined in the standard header file @code{float.h} for the ‘C’
programming language; see section 5.2.4.2.2 of the 1999 ISO/IEC C standard
@ref{4c69,,[C99]}, ‘Characteristics of floating types’, for details.
Attributes of the @code{float_info} named tuple



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

attribute

@tab

float.h macro

@tab

explanation

@item

@geindex epsilon (sys.float_info attribute)
@anchor{library/sys sys float_info epsilon}@anchor{4c6a}
@deffn {Attribute} float_info.epsilon
@end deffn

@tab

@code{DBL_EPSILON}

@tab

difference between 1.0 and the least value greater than 1.0 that is
representable as a float.

See also @ref{b14,,math.ulp()}.

@item

@geindex dig (sys.float_info attribute)
@anchor{library/sys sys float_info dig}@anchor{4c6b}
@deffn {Attribute} float_info.dig
@end deffn

@tab

@code{DBL_DIG}

@tab

The maximum number of decimal digits that can be faithfully
represented in a float; see below.

@item

@geindex mant_dig (sys.float_info attribute)
@anchor{library/sys sys float_info mant_dig}@anchor{4c6c}
@deffn {Attribute} float_info.mant_dig
@end deffn

@tab

@code{DBL_MANT_DIG}

@tab

Float precision: the number of base-@code{radix} digits in the
significand of a float.

@item

@geindex max (sys.float_info attribute)
@anchor{library/sys sys float_info max}@anchor{4c6d}
@deffn {Attribute} float_info.max
@end deffn

@tab

@code{DBL_MAX}

@tab

The maximum representable positive finite float.

@item

@geindex max_exp (sys.float_info attribute)
@anchor{library/sys sys float_info max_exp}@anchor{4c6e}
@deffn {Attribute} float_info.max_exp
@end deffn

@tab

@code{DBL_MAX_EXP}

@tab

The maximum integer `e' such that @code{radix**(e-1)} is a representable
finite float.

@item

@geindex max_10_exp (sys.float_info attribute)
@anchor{library/sys sys float_info max_10_exp}@anchor{4c6f}
@deffn {Attribute} float_info.max_10_exp
@end deffn

@tab

@code{DBL_MAX_10_EXP}

@tab

The maximum integer `e' such that @code{10**e} is in the range of
representable finite floats.

@item

@geindex min (sys.float_info attribute)
@anchor{library/sys sys float_info min}@anchor{4c70}
@deffn {Attribute} float_info.min
@end deffn

@tab

@code{DBL_MIN}

@tab

The minimum representable positive `normalized' float.

Use @ref{b14,,math.ulp(0.0)} to get the smallest positive
`denormalized' representable float.

@item

@geindex min_exp (sys.float_info attribute)
@anchor{library/sys sys float_info min_exp}@anchor{4c71}
@deffn {Attribute} float_info.min_exp
@end deffn

@tab

@code{DBL_MIN_EXP}

@tab

The minimum integer `e' such that @code{radix**(e-1)} is a normalized
float.

@item

@geindex min_10_exp (sys.float_info attribute)
@anchor{library/sys sys float_info min_10_exp}@anchor{4c72}
@deffn {Attribute} float_info.min_10_exp
@end deffn

@tab

@code{DBL_MIN_10_EXP}

@tab

The minimum integer `e' such that @code{10**e} is a normalized float.

@item

@geindex radix (sys.float_info attribute)
@anchor{library/sys sys float_info radix}@anchor{4c73}
@deffn {Attribute} float_info.radix
@end deffn

@tab

@code{FLT_RADIX}

@tab

The radix of exponent representation.

@item

@geindex rounds (sys.float_info attribute)
@anchor{library/sys sys float_info rounds}@anchor{4c74}
@deffn {Attribute} float_info.rounds
@end deffn

@tab

@code{FLT_ROUNDS}

@tab

An integer representing the rounding mode for floating-point arithmetic.
This reflects the value of the system @code{FLT_ROUNDS} macro
at interpreter startup time:


@itemize *

@item 
@code{-1}: indeterminable

@item 
@code{0}: toward zero

@item 
@code{1}: to nearest

@item 
@code{2}: toward positive infinity

@item 
@code{3}: toward negative infinity
@end itemize

All other values for @code{FLT_ROUNDS} characterize
implementation-defined rounding behavior.

@end multitable


The attribute @ref{4c6b,,sys.float_info.dig} needs further explanation.  If
@code{s} is any string representing a decimal number with at most
@code{sys.float_info.dig} significant digits, then converting @code{s} to a
float and back again will recover a string representing the same decimal
value:

@example
>>> import sys
>>> sys.float_info.dig
15
>>> s = '3.14159265358979'    # decimal string with 15 significant digits
>>> format(float(s), '.15g')  # convert to float and back -> same value
'3.14159265358979'
@end example

But for strings with more than @ref{4c6b,,sys.float_info.dig} significant digits,
this isn’t always true:

@example
>>> s = '9876543211234567'    # 16 significant digits is too many!
>>> format(float(s), '.16g')  # conversion changes value
'9876543211234568'
@end example
@end deffn

@geindex float_repr_style (in module sys)
@anchor{library/sys sys float_repr_style}@anchor{1506}
@deffn {Data} sys.float_repr_style

A string indicating how the @ref{1c3,,repr()} function behaves for
floats.  If the string has value @code{'short'} then for a finite
float @code{x}, @code{repr(x)} aims to produce a short string with the
property that @code{float(repr(x)) == x}.  This is the usual behaviour
in Python 3.1 and later.  Otherwise, @code{float_repr_style} has value
@code{'legacy'} and @code{repr(x)} behaves in the same way as it did in
versions of Python prior to 3.1.


Added in version 3.1.

@end deffn

@geindex getallocatedblocks() (in module sys)
@anchor{library/sys sys getallocatedblocks}@anchor{11cd}
@deffn {Function} sys.getallocatedblocks ()

Return the number of memory blocks currently allocated by the interpreter,
regardless of their size.  This function is mainly useful for tracking
and debugging memory leaks.  Because of the interpreter’s internal
caches, the result can vary from call to call; you may have to call
@ref{362,,_clear_internal_caches()} and @ref{1b5,,gc.collect()} to get more
predictable results.

If a Python build or implementation cannot reasonably compute this
information, @code{getallocatedblocks()} is allowed to return 0 instead.


Added in version 3.4.

@end deffn

@geindex getunicodeinternedsize() (in module sys)
@anchor{library/sys sys getunicodeinternedsize}@anchor{4c75}
@deffn {Function} sys.getunicodeinternedsize ()

Return the number of unicode objects that have been interned.


Added in version 3.12.

@end deffn

@geindex getandroidapilevel() (in module sys)
@anchor{library/sys sys getandroidapilevel}@anchor{d89}
@deffn {Function} sys.getandroidapilevel ()

Return the build-time API level of Android as an integer. This represents the
minimum version of Android this build of Python can run on. For runtime
version information, see @ref{1a08,,platform.android_ver()}.

@ref{2181,,Availability}: Android.


Added in version 3.7.

@end deffn

@geindex getdefaultencoding() (in module sys)
@anchor{library/sys sys getdefaultencoding}@anchor{4c76}
@deffn {Function} sys.getdefaultencoding ()

Return @code{'utf-8'}. This is the name of the default string encoding, used
in methods like @ref{ad8,,str.encode()}.
@end deffn

@geindex getdlopenflags() (in module sys)
@anchor{library/sys sys getdlopenflags}@anchor{171a}
@deffn {Function} sys.getdlopenflags ()

Return the current value of the flags that are used for
@code{dlopen()} calls.  Symbolic names for the flag values can be
found in the @ref{a5,,os} module (@code{RTLD_@var{xxx}} constants, e.g.
@ref{1324,,os.RTLD_LAZY}).

@ref{2181,,Availability}: Unix.
@end deffn

@geindex getfilesystemencoding() (in module sys)
@anchor{library/sys sys getfilesystemencoding}@anchor{e59}
@deffn {Function} sys.getfilesystemencoding ()

Get the @ref{75e,,filesystem encoding}:
the encoding used with the filesystem error handler to convert between Unicode filenames and bytes
filenames. The filesystem error handler is returned from
@ref{ee8,,getfilesystemencodeerrors()}.

For best compatibility, str should be used for filenames in all cases,
although representing filenames as bytes is also supported. Functions
accepting or returning filenames should support either str or bytes and
internally convert to the system’s preferred representation.

@ref{e55,,os.fsencode()} and @ref{e54,,os.fsdecode()} should be used to ensure that
the correct encoding and errors mode are used.

The @ref{75e,,filesystem encoding and error handler} are configured at Python
startup by the @ref{998,,PyConfig_Read()} function: see
@ref{419,,filesystem_encoding} and
@ref{41a,,filesystem_errors} members of @ref{3f5,,PyConfig}.


Changed in version 3.2: @code{getfilesystemencoding()} result cannot be @code{None} anymore.



Changed in version 3.6: Windows is no longer guaranteed to return @code{'mbcs'}. See 
@geindex Python Enhancement Proposals; PEP 529
PEP 529@footnote{https://peps.python.org/pep-0529/}
and @ref{33c,,_enablelegacywindowsfsencoding()} for more information.



Changed in version 3.7: Return @code{'utf-8'} if the @ref{868,,Python UTF-8 Mode} is
enabled.

@end deffn

@geindex getfilesystemencodeerrors() (in module sys)
@anchor{library/sys sys getfilesystemencodeerrors}@anchor{ee8}
@deffn {Function} sys.getfilesystemencodeerrors ()

Get the @ref{75e,,filesystem error handler}: the error handler used with the filesystem encoding to convert between Unicode
filenames and bytes filenames. The filesystem encoding is returned from
@ref{e59,,getfilesystemencoding()}.

@ref{e55,,os.fsencode()} and @ref{e54,,os.fsdecode()} should be used to ensure that
the correct encoding and errors mode are used.

The @ref{75e,,filesystem encoding and error handler} are configured at Python
startup by the @ref{998,,PyConfig_Read()} function: see
@ref{419,,filesystem_encoding} and
@ref{41a,,filesystem_errors} members of @ref{3f5,,PyConfig}.


Added in version 3.6.

@end deffn

@geindex get_int_max_str_digits() (in module sys)
@anchor{library/sys sys get_int_max_str_digits}@anchor{1862}
@deffn {Function} sys.get_int_max_str_digits ()

Returns the current value for the @ref{80c,,integer string conversion length limitation}. See also @ref{1769,,set_int_max_str_digits()}.


Added in version 3.11.

@end deffn

@geindex getrefcount() (in module sys)
@anchor{library/sys sys getrefcount}@anchor{2d0}
@deffn {Function} sys.getrefcount (object)

Return the reference count of the `object'.  The count returned is generally one
higher than you might expect, because it includes the (temporary) reference as
an argument to @code{getrefcount()}.

Note that the returned value may not actually reflect how many
references to the object are actually held.  For example, some
objects are @ref{292,,immortal} and have a very high refcount that does not
reflect the actual number of references.  Consequently, do not rely
on the returned value to be accurate, other than a value of 0 or 1.

`CPython implementation detail:' @ref{292,,Immortal} objects with a large reference count can be
identified via @ref{291,,_is_immortal()}.


Changed in version 3.12: Immortal objects have very large refcounts that do not match
the actual number of references to the object.

@end deffn

@geindex getrecursionlimit() (in module sys)
@anchor{library/sys sys getrecursionlimit}@anchor{6ec}
@deffn {Function} sys.getrecursionlimit ()

Return the current value of the recursion limit, the maximum depth of the Python
interpreter stack.  This limit prevents infinite recursion from causing an
overflow of the C stack and crashing Python.  It can be set by
@ref{6eb,,setrecursionlimit()}.
@end deffn

@geindex getsizeof() (in module sys)
@anchor{library/sys sys getsizeof}@anchor{1b1f}
@deffn {Function} sys.getsizeof (object[, default])

Return the size of an object in bytes. The object can be any type of
object. All built-in objects will return correct results, but this
does not have to hold true for third-party extensions as it is implementation
specific.

Only the memory consumption directly attributed to the object is
accounted for, not the memory consumption of objects it refers to.

If given, `default' will be returned if the object does not provide means to
retrieve the size.  Otherwise a @ref{199,,TypeError} will be raised.

@code{getsizeof()} calls the object’s @code{__sizeof__} method and adds an
additional garbage collector overhead if the object is managed by the garbage
collector.

See recursive sizeof recipe@footnote{https://code.activestate.com/recipes/577504-compute-memory-footprint-of-an-object-and-its-cont/}
for an example of using @code{getsizeof()} recursively to find the size of
containers and all their contents.
@end deffn

@geindex getswitchinterval() (in module sys)
@anchor{library/sys sys getswitchinterval}@anchor{b49}
@deffn {Function} sys.getswitchinterval ()

Return the interpreter’s “thread switch interval” in seconds; see
@ref{b4a,,setswitchinterval()}.


Added in version 3.2.

@end deffn

@geindex _getframe() (in module sys)
@anchor{library/sys sys _getframe}@anchor{8f2}
@deffn {Function} sys._getframe ([depth])

Return a frame object from the call stack.  If optional integer `depth' is
given, return the frame object that many calls below the top of the stack.  If
that is deeper than the call stack, @ref{2ee,,ValueError} is raised.  The default
for `depth' is zero, returning the frame at the top of the call stack.

Raises an @ref{1cb1,,auditing event} @code{sys._getframe} with argument @code{frame}.

`CPython implementation detail:' This function should be used for internal and specialized purposes only.
It is not guaranteed to exist in all implementations of Python.
@end deffn

@geindex _getframemodulename() (in module sys)
@anchor{library/sys sys _getframemodulename}@anchor{1b23}
@deffn {Function} sys._getframemodulename ([depth])

Return the name of a module from the call stack.  If optional integer `depth'
is given, return the module that many calls below the top of the stack.  If
that is deeper than the call stack, or if the module is unidentifiable,
@code{None} is returned.  The default for `depth' is zero, returning the
module at the top of the call stack.

Raises an @ref{1cb1,,auditing event} @code{sys._getframemodulename} with argument @code{depth}.

`CPython implementation detail:' This function should be used for internal and specialized purposes only.
It is not guaranteed to exist in all implementations of Python.


Added in version 3.12.

@end deffn

@geindex getobjects() (in module sys)
@anchor{library/sys sys getobjects}@anchor{290}
@deffn {Function} sys.getobjects (limit[, type])

This function only exists if CPython was built using the
specialized configure option @ref{636,,--with-trace-refs}.
It is intended only for debugging garbage-collection issues.

Return a list of up to `limit' dynamically allocated Python objects.
If `type' is given, only objects of that exact type (not subtypes)
are included.

Objects from the list are not safe to use.
Specifically, the result will include objects from all interpreters that
share their object allocator state (that is, ones created with
@ref{4c77,,PyInterpreterConfig.use_main_obmalloc} set to 1
or using @ref{1b75,,Py_NewInterpreter()}, and the
@ref{164,,main interpreter}).
Mixing objects from different interpreters may lead to crashes
or other unexpected behavior.

`CPython implementation detail:' This function should be used for specialized purposes only.
It is not guaranteed to exist in all implementations of Python.


Changed in version 3.14: The result may include objects from other interpreters.

@end deffn

@geindex getprofile() (in module sys)
@anchor{library/sys sys getprofile}@anchor{15ec}
@deffn {Function} sys.getprofile ()

@geindex profile function
@geindex profiler

Get the profiler function as set by @ref{170a,,setprofile()}.
@end deffn

@geindex gettrace() (in module sys)
@anchor{library/sys sys gettrace}@anchor{15ed}
@deffn {Function} sys.gettrace ()

@geindex trace function
@geindex debugger

Get the trace function as set by @ref{2e3,,settrace()}.

`CPython implementation detail:' The @code{gettrace()} function is intended only for implementing debuggers,
profilers, coverage tools and the like.  Its behavior is part of the
implementation platform, rather than part of the language definition, and
thus may not be available in all Python implementations.
@end deffn

@geindex getwindowsversion() (in module sys)
@anchor{library/sys sys getwindowsversion}@anchor{ee9}
@deffn {Function} sys.getwindowsversion ()

Return a named tuple describing the Windows version
currently running.  The named elements are `major', `minor',
`build', `platform', `service_pack', `service_pack_minor',
`service_pack_major', `suite_mask', `product_type' and
`platform_version'. `service_pack' contains a string,
`platform_version' a 3-tuple and all other values are
integers. The components can also be accessed by name, so
@code{sys.getwindowsversion()[0]} is equivalent to
@code{sys.getwindowsversion().major}. For compatibility with prior
versions, only the first 5 elements are retrievable by indexing.

`platform' will be @code{2} (VER_PLATFORM_WIN32_NT).

`product_type' may be one of the following values:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Constant

@tab

Meaning

@item

@code{1} (VER_NT_WORKSTATION)

@tab

The system is a workstation.

@item

@code{2} (VER_NT_DOMAIN_CONTROLLER)

@tab

The system is a domain
controller.

@item

@code{3} (VER_NT_SERVER)

@tab

The system is a server, but not
a domain controller.

@end multitable


This function wraps the Win32 @code{GetVersionEx()} function; see the
Microsoft documentation on @code{OSVERSIONINFOEX()} for more information
about these fields.

`platform_version' returns the major version, minor version and
build number of the current operating system, rather than the version that
is being emulated for the process. It is intended for use in logging rather
than for feature detection.

@cartouche
@quotation Note 
`platform_version' derives the version from kernel32.dll which can be of a different
version than the OS version. Please use @ref{af,,platform} module for achieving accurate
OS version.
@end quotation
@end cartouche

@ref{2181,,Availability}: Windows.


Changed in version 3.2: Changed to a named tuple and added `service_pack_minor',
`service_pack_major', `suite_mask', and `product_type'.



Changed in version 3.6: Added `platform_version'

@end deffn

@geindex get_asyncgen_hooks() (in module sys)
@anchor{library/sys sys get_asyncgen_hooks}@anchor{1c07}
@deffn {Function} sys.get_asyncgen_hooks ()

Returns an `asyncgen_hooks' object, which is similar to a
@ref{4e1,,namedtuple} of the form @code{(firstiter, finalizer)},
where `firstiter' and `finalizer' are expected to be either @code{None} or
functions which take an @ref{39bc,,asynchronous generator iterator} as an
argument, and are used to schedule finalization of an asynchronous
generator by an event loop.


Added in version 3.6: See 
@geindex Python Enhancement Proposals; PEP 525
PEP 525@footnote{https://peps.python.org/pep-0525/} for more details.


@cartouche
@quotation Note 
This function has been added on a provisional basis (see 
@geindex Python Enhancement Proposals; PEP 411
PEP 411@footnote{https://peps.python.org/pep-0411/}
for details.)
@end quotation
@end cartouche
@end deffn

@geindex get_coroutine_origin_tracking_depth() (in module sys)
@anchor{library/sys sys get_coroutine_origin_tracking_depth}@anchor{d8a}
@deffn {Function} sys.get_coroutine_origin_tracking_depth ()

Get the current coroutine origin tracking depth, as set by
@ref{d8b,,set_coroutine_origin_tracking_depth()}.


Added in version 3.7.


@cartouche
@quotation Note 
This function has been added on a provisional basis (see 
@geindex Python Enhancement Proposals; PEP 411
PEP 411@footnote{https://peps.python.org/pep-0411/}
for details.)  Use it only for debugging purposes.
@end quotation
@end cartouche
@end deffn

@geindex hash_info (in module sys)
@anchor{library/sys sys hash_info}@anchor{1205}
@deffn {Data} sys.hash_info

A @ref{85f,,named tuple} giving parameters of the numeric hash
implementation.  For more details about hashing of numeric types, see
@ref{2646,,Hashing of numeric types}.

@geindex width (sys.hash_info attribute)
@anchor{library/sys sys hash_info width}@anchor{4c78}
@deffn {Attribute} hash_info.width

The width in bits used for hash values
@end deffn

@geindex modulus (sys.hash_info attribute)
@anchor{library/sys sys hash_info modulus}@anchor{2647}
@deffn {Attribute} hash_info.modulus

The prime modulus P used for numeric hash scheme
@end deffn

@geindex inf (sys.hash_info attribute)
@anchor{library/sys sys hash_info inf}@anchor{4c79}
@deffn {Attribute} hash_info.inf

The hash value returned for a positive infinity
@end deffn

@geindex nan (sys.hash_info attribute)
@anchor{library/sys sys hash_info nan}@anchor{4c7a}
@deffn {Attribute} hash_info.nan

(This attribute is no longer used)
@end deffn

@geindex imag (sys.hash_info attribute)
@anchor{library/sys sys hash_info imag}@anchor{4c7b}
@deffn {Attribute} hash_info.imag

The multiplier used for the imaginary part of a complex number
@end deffn

@geindex algorithm (sys.hash_info attribute)
@anchor{library/sys sys hash_info algorithm}@anchor{4c7c}
@deffn {Attribute} hash_info.algorithm

The name of the algorithm for hashing of str, bytes, and memoryview
@end deffn

@geindex hash_bits (sys.hash_info attribute)
@anchor{library/sys sys hash_info hash_bits}@anchor{4c7d}
@deffn {Attribute} hash_info.hash_bits

The internal output size of the hash algorithm
@end deffn

@geindex seed_bits (sys.hash_info attribute)
@anchor{library/sys sys hash_info seed_bits}@anchor{4c7e}
@deffn {Attribute} hash_info.seed_bits

The size of the seed key of the hash algorithm
@end deffn

@geindex cutoff (sys.hash_info attribute)
@anchor{library/sys sys hash_info cutoff}@anchor{4c7f}
@deffn {Attribute} hash_info.cutoff

Cutoff for small string DJBX33A optimization in range @code{[1, cutoff)}.
@end deffn


Added in version 3.2.



Changed in version 3.4: Added `algorithm', `hash_bits', `seed_bits', and `cutoff'.

@end deffn

@geindex hexversion (in module sys)
@anchor{library/sys sys hexversion}@anchor{4c80}
@deffn {Data} sys.hexversion

The version number encoded as a single integer.  This is guaranteed to increase
with each version, including proper support for non-production releases.  For
example, to test that the Python interpreter is at least version 1.5.2, use:

@example
if sys.hexversion >= 0x010502F0:
    # use some advanced feature
    ...
else:
    # use an alternative implementation or warn the user
    ...
@end example

This is called @code{hexversion} since it only really looks meaningful when viewed
as the result of passing it to the built-in @ref{14db,,hex()} function.  The
@ref{85f,,named tuple}  @ref{8b1,,sys.version_info} may be used for a more
human-friendly encoding of the same information.

More details of @code{hexversion} can be found at @ref{4c81,,API and ABI Versioning}.
@end deffn

@geindex implementation (in module sys)
@anchor{library/sys sys implementation}@anchor{73c}
@deffn {Data} sys.implementation

An object containing information about the implementation of the
currently running Python interpreter.  The following attributes are
required to exist in all Python implementations.

`name' is the implementation’s identifier, e.g. @code{'cpython'}.  The actual
string is defined by the Python implementation, but it is guaranteed to be
lower case.

`version' is a named tuple, in the same format as
@ref{8b1,,sys.version_info}.  It represents the version of the Python
`implementation'.  This has a distinct meaning from the specific
version of the Python `language' to which the currently running
interpreter conforms, which @code{sys.version_info} represents.  For
example, for PyPy 1.8 @code{sys.implementation.version} might be
@code{sys.version_info(1, 8, 0, 'final', 0)}, whereas @code{sys.version_info}
would be @code{sys.version_info(2, 7, 2, 'final', 0)}.  For CPython they
are the same value, since it is the reference implementation.

`hexversion' is the implementation version in hexadecimal format, like
@ref{4c80,,sys.hexversion}.

`cache_tag' is the tag used by the import machinery in the filenames of
cached modules.  By convention, it would be a composite of the
implementation’s name and version, like @code{'cpython-33'}.  However, a
Python implementation may use some other value if appropriate.  If
@code{cache_tag} is set to @code{None}, it indicates that module caching should
be disabled.

`supports_isolated_interpreters' is a boolean value, whether
this implementation supports multiple isolated interpreters.
It is @code{True} for CPython on most platforms.  Platforms with
this support implement the low-level @code{_interpreters} module.


@subsubheading See also


@geindex Python Enhancement Proposals; PEP 684
PEP 684@footnote{https://peps.python.org/pep-0684/}, 
@geindex Python Enhancement Proposals; PEP 734
PEP 734@footnote{https://peps.python.org/pep-0734/}, and @ref{25,,concurrent.interpreters}.


@code{sys.implementation} may contain additional attributes specific to
the Python implementation.  These non-standard attributes must start with
an underscore, and are not described here.  Regardless of its contents,
@code{sys.implementation} will not change during a run of the interpreter,
nor between implementation versions.  (It may change between Python
language versions, however.)  See 
@geindex Python Enhancement Proposals; PEP 421
PEP 421@footnote{https://peps.python.org/pep-0421/} for more information.


Added in version 3.3.



Changed in version 3.14: Added @code{supports_isolated_interpreters} field.


@cartouche
@quotation Note 
The addition of new required attributes must go through the normal PEP
process. See 
@geindex Python Enhancement Proposals; PEP 421
PEP 421@footnote{https://peps.python.org/pep-0421/} for more information.
@end quotation
@end cartouche
@end deffn

@geindex int_info (in module sys)
@anchor{library/sys sys int_info}@anchor{149f}
@deffn {Data} sys.int_info

A @ref{85f,,named tuple} that holds information about Python’s internal
representation of integers.  The attributes are read only.

@geindex bits_per_digit (sys.int_info attribute)
@anchor{library/sys sys int_info bits_per_digit}@anchor{4c82}
@deffn {Attribute} int_info.bits_per_digit

The number of bits held in each digit.
Python integers are stored internally in base @code{2**int_info.bits_per_digit}.
@end deffn

@geindex sizeof_digit (sys.int_info attribute)
@anchor{library/sys sys int_info sizeof_digit}@anchor{4c83}
@deffn {Attribute} int_info.sizeof_digit

The size in bytes of the C type used to represent a digit.
@end deffn

@geindex default_max_str_digits (sys.int_info attribute)
@anchor{library/sys sys int_info default_max_str_digits}@anchor{2726}
@deffn {Attribute} int_info.default_max_str_digits

The default value for @ref{1862,,sys.get_int_max_str_digits()}
when it is not otherwise explicitly configured.
@end deffn

@geindex str_digits_check_threshold (sys.int_info attribute)
@anchor{library/sys sys int_info str_digits_check_threshold}@anchor{4c84}
@deffn {Attribute} int_info.str_digits_check_threshold

The minimum non-zero value for @ref{1769,,sys.set_int_max_str_digits()},
@geindex PYTHONINTMAXSTRDIGITS
@geindex environment variable; PYTHONINTMAXSTRDIGITS
@ref{1b7e,,PYTHONINTMAXSTRDIGITS}, or @ref{170,,-X int_max_str_digits}.
@end deffn


Added in version 3.1.



Changed in version 3.11: Added @ref{2726,,default_max_str_digits} and
@ref{4c84,,str_digits_check_threshold}.

@end deffn

@geindex __interactivehook__ (in module sys)
@anchor{library/sys sys __interactivehook__}@anchor{11ce}
@deffn {Data} sys.__interactivehook__

When this attribute exists, its value is automatically called (with no
arguments) when the interpreter is launched in @ref{441,,interactive mode}.  This is done after the 
@geindex PYTHONSTARTUP
@geindex environment variable; PYTHONSTARTUP
@ref{1ba,,PYTHONSTARTUP} file is
read, so that you can set this hook there.  The @ref{cc,,site} module
@ref{11cf,,sets this}.


Raises an @ref{1cb1,,auditing event}
@code{cpython.run_interactivehook} with the hook object as the argument when
the hook is called on startup.



Added in version 3.4.

@end deffn

@geindex intern() (in module sys)
@anchor{library/sys sys intern}@anchor{14e7}
@deffn {Function} sys.intern (string)

Enter `string' in the table of “interned” strings and return the interned string
– which is `string' itself or a copy. Interning strings is useful to gain a
little performance on dictionary lookup – if the keys in a dictionary are
interned, and the lookup key is interned, the key comparisons (after hashing)
can be done by a pointer compare instead of a string compare.  Normally, the
names used in Python programs are automatically interned, and the dictionaries
used to hold module, class or instance attributes have interned keys.

Interned strings are not @ref{292,,immortal}; you must keep a reference to the
return value of @code{intern()} around to benefit from it.
@end deffn

@geindex _is_gil_enabled() (in module sys)
@anchor{library/sys sys _is_gil_enabled}@anchor{4c85}
@deffn {Function} sys._is_gil_enabled ()

Return @ref{e0d,,True} if the @ref{165,,GIL} is enabled and @ref{d31,,False} if
it is disabled.


Added in version 3.13.


`CPython implementation detail:' It is not guaranteed to exist in all implementations of Python.
@end deffn

@geindex is_finalizing() (in module sys)
@anchor{library/sys sys is_finalizing}@anchor{c86}
@deffn {Function} sys.is_finalizing ()

Return @ref{e0d,,True} if the main Python interpreter is
@ref{47a,,shutting down}. Return @ref{d31,,False} otherwise.

See also the @ref{479,,PythonFinalizationError} exception.


Added in version 3.5.

@end deffn

@geindex _jit (in module sys)
@anchor{library/sys sys _jit}@anchor{295}
@deffn {Data} sys._jit

Utilities for observing just-in-time compilation.

`CPython implementation detail:' JIT compilation is an `experimental implementation detail' of CPython.
@code{sys._jit} is not guaranteed to exist or behave the same way in all
Python implementations, versions, or build configurations.


Added in version 3.14.


@geindex _jit.is_available() (in module sys)
@anchor{library/sys sys _jit is_available}@anchor{44d}
@deffn {Function} _jit.is_available ()

Return @code{True} if the current Python executable supports JIT compilation,
and @code{False} otherwise.  This can be controlled by building CPython with
the @code{--experimental-jit} option on Windows, and the
@ref{44c,,--enable-experimental-jit} option on all other platforms.
@end deffn

@geindex _jit.is_enabled() (in module sys)
@anchor{library/sys sys _jit is_enabled}@anchor{44e}
@deffn {Function} _jit.is_enabled ()

Return @code{True} if JIT compilation is enabled for the current Python
process (implies @ref{44d,,sys._jit.is_available()}), and @code{False} otherwise.
If JIT compilation is available, this can be controlled by setting the
@geindex PYTHON_JIT
@geindex environment variable; PYTHON_JIT
@ref{44b,,PYTHON_JIT} environment variable to @code{0} (disabled) or @code{1}
(enabled) at interpreter startup.
@end deffn

@geindex _jit.is_active() (in module sys)
@anchor{library/sys sys _jit is_active}@anchor{18aa}
@deffn {Function} _jit.is_active ()

Return @code{True} if the topmost Python frame is currently executing JIT
code (implies @ref{44e,,sys._jit.is_enabled()}), and @code{False} otherwise.

@cartouche
@quotation Note 
This function is intended for testing and debugging the JIT itself.
It should be avoided for any other purpose.
@end quotation
@end cartouche

@cartouche
@quotation Note 
Due to the nature of tracing JIT compilers, repeated calls to this
function may give surprising results. For example, branching on its
return value will likely lead to unexpected behavior (if doing so
causes JIT code to be entered or exited):

@example
>>> for warmup in range(BIG_NUMBER):
...     # This line is "hot", and is eventually JIT-compiled:
...     if sys._jit.is_active():
...         # This line is "cold", and is run in the interpreter:
...         assert sys._jit.is_active()
...
Traceback (most recent call last):
  File "<stdin>", line 5, in <module>
    assert sys._jit.is_active()
           ~~~~~~~~~~~~~~~~~~^^
AssertionError
@end example
@end quotation
@end cartouche
@end deffn
@end deffn

@geindex last_exc (in module sys)
@anchor{library/sys sys last_exc}@anchor{6e6}
@deffn {Data} sys.last_exc

This variable is not always defined; it is set to the exception instance
when an exception is not handled and the interpreter prints an error message
and a stack traceback.  Its intended use is to allow an interactive user to
import a debugger module and engage in post-mortem debugging without having
to re-execute the command that caused the error.  (Typical use is
@code{import pdb; pdb.pm()} to enter the post-mortem debugger; see @ref{aa,,pdb}
module for more information.)


Added in version 3.12.

@end deffn

@geindex _is_immortal() (in module sys)
@anchor{library/sys sys _is_immortal}@anchor{291}
@deffn {Function} sys._is_immortal (op)

Return @ref{e0d,,True} if the given object is @ref{292,,immortal}, @ref{d31,,False}
otherwise.

@cartouche
@quotation Note 
Objects that are immortal (and thus return @code{True} upon being passed
to this function) are not guaranteed to be immortal in future versions,
and vice versa for mortal objects.
@end quotation
@end cartouche


Added in version 3.14.


`CPython implementation detail:' This function should be used for specialized purposes only.
It is not guaranteed to exist in all implementations of Python.
@end deffn

@geindex _is_interned() (in module sys)
@anchor{library/sys sys _is_interned}@anchor{559}
@deffn {Function} sys._is_interned (string)

Return @ref{e0d,,True} if the given string is “interned”, @ref{d31,,False}
otherwise.


Added in version 3.13.


`CPython implementation detail:' It is not guaranteed to exist in all implementations of Python.
@end deffn

@geindex last_type (in module sys)
@geindex last_value (in module sys)
@geindex last_traceback (in module sys)
@anchor{library/sys sys last_type}@anchor{6e7}
@deffn {Data} sys.last_type
@anchor{library/sys sys last_value}@anchor{6e8}
@deffnx {Data} sys.last_value
@anchor{library/sys sys last_traceback}@anchor{6e9}
@deffnx {Data} sys.last_traceback

These three variables are deprecated; use @ref{6e6,,sys.last_exc} instead.
They hold the legacy representation of @code{sys.last_exc}, as returned
from @ref{89c,,exc_info()} above.
@end deffn

@geindex maxsize (in module sys)
@anchor{library/sys sys maxsize}@anchor{13d1}
@deffn {Data} sys.maxsize

An integer giving the maximum value a variable of type @ref{c5b,,Py_ssize_t} can
take.  It’s usually @code{2**31 - 1} on a 32-bit platform and @code{2**63 - 1} on a
64-bit platform.
@end deffn

@geindex maxunicode (in module sys)
@anchor{library/sys sys maxunicode}@anchor{1253}
@deffn {Data} sys.maxunicode

An integer giving the value of the largest Unicode code point,
i.e. @code{1114111} (@code{0x10FFFF} in hexadecimal).


Changed in version 3.3: Before 
@geindex Python Enhancement Proposals; PEP 393
PEP 393@footnote{https://peps.python.org/pep-0393/}, @code{sys.maxunicode} used to be either @code{0xFFFF}
or @code{0x10FFFF}, depending on the configuration option that specified
whether Unicode characters were stored as UCS-2 or UCS-4.

@end deffn

@geindex meta_path (in module sys)
@anchor{library/sys sys meta_path}@anchor{f2d}
@deffn {Data} sys.meta_path

A list of @ref{1276,,meta path finder} objects that have their
@ref{a6e,,find_spec()} methods called to see if one
of the objects can find the module to be imported. By default, it holds entries
that implement Python’s default import semantics. The
@code{find_spec()} method is called with at
least the absolute name of the module being imported. If the module to be
imported is contained in a package, then the parent package’s
@ref{2098,,__path__}
attribute is passed in as a second argument. The method returns a
@ref{23a7,,module spec}, or @code{None} if the module cannot be found.


@subsubheading See also



@table @asis

@item @ref{a74,,importlib.abc.MetaPathFinder}

The abstract base class defining the interface of finder objects on
@code{meta_path}.

@item @ref{22b0,,importlib.machinery.ModuleSpec}

The concrete class which
@ref{a6e,,find_spec()} should return
instances of.
@end table



Changed in version 3.4: @ref{23a7,,Module specs} were introduced in Python 3.4, by
@geindex Python Enhancement Proposals; PEP 451
PEP 451@footnote{https://peps.python.org/pep-0451/}.



Changed in version 3.12: Removed the fallback that looked for a @code{find_module()} method
if a @code{meta_path} entry didn’t have a
@ref{a6e,,find_spec()} method.

@end deffn

@geindex modules (in module sys)
@anchor{library/sys sys modules}@anchor{1771}
@deffn {Data} sys.modules

This is a dictionary that maps module names to modules which have already been
loaded.  This can be manipulated to force reloading of modules and other tricks.
However, replacing the dictionary will not necessarily work as expected and
deleting essential items from the dictionary may cause Python to fail.  If
you want to iterate over this global dictionary always use
@code{sys.modules.copy()} or @code{tuple(sys.modules)} to avoid exceptions as its
size may change during iteration as a side effect of code or activity in
other threads.
@end deffn

@geindex orig_argv (in module sys)
@anchor{library/sys sys orig_argv}@anchor{a47}
@deffn {Data} sys.orig_argv

The list of the original command line arguments passed to the Python
executable.

The elements of @code{sys.orig_argv} are the arguments to the Python interpreter,
while the elements of @ref{1470,,sys.argv} are the arguments to the user’s program.
Arguments consumed by the interpreter itself will be present in @code{sys.orig_argv}
and missing from @code{sys.argv}.


Added in version 3.10.

@end deffn

@geindex path (in module sys)
@anchor{library/sys sys path}@anchor{3e2}
@deffn {Data} sys.path

@geindex module; search; path

A list of strings that specifies the search path for modules. Initialized from
the environment variable 
@geindex PYTHONPATH
@geindex environment variable; PYTHONPATH
@ref{1223,,PYTHONPATH}, plus an installation-dependent
default.

By default, as initialized upon program startup, a potentially unsafe path
is prepended to @code{sys.path} (`before' the entries inserted as a result
of 
@geindex PYTHONPATH
@geindex environment variable; PYTHONPATH
@ref{1223,,PYTHONPATH}):


@itemize *

@item 
@code{python -m module} command line: prepend the current working
directory.

@item 
@code{python script.py} command line: prepend the script’s directory.
If it’s a symbolic link, resolve symbolic links.

@item 
@code{python -c code} and @code{python} (REPL) command lines: prepend an empty
string, which means the current working directory.
@end itemize

To not prepend this potentially unsafe path, use the @ref{7c2,,-P} command
line option or the 
@geindex PYTHONSAFEPATH
@geindex environment variable; PYTHONSAFEPATH
@ref{7c3,,PYTHONSAFEPATH} environment variable.

A program is free to modify this list for its own purposes.  Only strings
should be added to @code{sys.path}; all other data types are
ignored during import.


@subsubheading See also



@itemize *

@item 
Module @ref{cc,,site} This describes how to use .pth files to
extend @code{sys.path}.
@end itemize

@end deffn

@geindex path_hooks (in module sys)
@anchor{library/sys sys path_hooks}@anchor{122a}
@deffn {Data} sys.path_hooks

A list of callables that take a path argument to try to create a
@ref{23ae,,finder} for the path. If a finder can be created, it is to be
returned by the callable, else raise @ref{65b,,ImportError}.

Originally specified in 
@geindex Python Enhancement Proposals; PEP 302
PEP 302@footnote{https://peps.python.org/pep-0302/}.
@end deffn

@geindex path_importer_cache (in module sys)
@anchor{library/sys sys path_importer_cache}@anchor{7fb}
@deffn {Data} sys.path_importer_cache

A dictionary acting as a cache for @ref{23ae,,finder} objects. The keys are
paths that have been passed to @ref{122a,,sys.path_hooks} and the values are
the finders that are found. If a path is a valid file system path but no
finder is found on @code{sys.path_hooks} then @code{None} is
stored.

Originally specified in 
@geindex Python Enhancement Proposals; PEP 302
PEP 302@footnote{https://peps.python.org/pep-0302/}.
@end deffn

@geindex platform (in module sys)
@anchor{library/sys sys platform}@anchor{293}
@deffn {Data} sys.platform

A string containing a platform identifier. Known values are:


@multitable {xxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

System

@tab

@code{platform} value

@item

AIX

@tab

@code{'aix'}

@item

Android

@tab

@code{'android'}

@item

Emscripten

@tab

@code{'emscripten'}

@item

FreeBSD

@tab

@code{'freebsd'}

@item

iOS

@tab

@code{'ios'}

@item

Linux

@tab

@code{'linux'}

@item

macOS

@tab

@code{'darwin'}

@item

Windows

@tab

@code{'win32'}

@item

Windows/Cygwin

@tab

@code{'cygwin'}

@item

WASI

@tab

@code{'wasi'}

@end multitable


On Unix systems not listed in the table, the value is the lowercased OS name
as returned by @code{uname -s}, with the first part of the version as returned by
@code{uname -r} appended, e.g. @code{'sunos5'}, `at the time when Python was built'.
Unless you want to test for a specific system version, it is therefore
recommended to use the following idiom:

@example
if sys.platform.startswith('sunos'):
    # SunOS-specific code here...
@end example


Changed in version 3.3: On Linux, @code{sys.platform} doesn’t contain the major version anymore.
It is always @code{'linux'}, instead of @code{'linux2'} or @code{'linux3'}.



Changed in version 3.8: On AIX, @code{sys.platform} doesn’t contain the major version anymore.
It is always @code{'aix'}, instead of @code{'aix5'} or @code{'aix7'}.



Changed in version 3.13: On Android, @code{sys.platform} now returns @code{'android'} rather than
@code{'linux'}.



Changed in version 3.14: On FreeBSD, @code{sys.platform} doesn’t contain the major version anymore.
It is always @code{'freebsd'}, instead of @code{'freebsd13'} or @code{'freebsd14'}.



@subsubheading See also


@ref{3073,,os.name} has a coarser granularity.  @ref{1322,,os.uname()} gives
system-dependent version information.

The @ref{af,,platform} module provides detailed checks for the
system’s identity.

@end deffn

@geindex platlibdir (in module sys)
@anchor{library/sys sys platlibdir}@anchor{b38}
@deffn {Data} sys.platlibdir

Name of the platform-specific library directory. It is used to build the
path of standard library and the paths of installed extension modules.

It is equal to @code{"lib"} on most platforms. On Fedora and SuSE, it is equal
to @code{"lib64"} on 64-bit platforms which gives the following @code{sys.path}
paths (where @code{X.Y} is the Python @code{major.minor} version):


@itemize *

@item 
@code{/usr/lib64/pythonX.Y/}:
Standard library (like @code{os.py} of the @ref{a5,,os} module)

@item 
@code{/usr/lib64/pythonX.Y/lib-dynload/}:
C extension modules of the standard library (like the @ref{5b,,errno} module,
the exact filename is platform specific)

@item 
@code{/usr/lib/pythonX.Y/site-packages/} (always use @code{lib}, not
@code{sys.platlibdir}): Third-party modules

@item 
@code{/usr/lib64/pythonX.Y/site-packages/}:
C extension modules of third-party packages
@end itemize


Added in version 3.9.

@end deffn

@geindex prefix (in module sys)
@anchor{library/sys sys prefix}@anchor{3e5}
@deffn {Data} sys.prefix

A string giving the site-specific directory prefix where the platform
independent Python files are installed; on Unix, the default is
@code{/usr/local}. This can be set at build time with the @ref{2191,,--prefix}
argument to the @code{configure} script.  See
@ref{447,,Installation paths} for derived paths.

@cartouche
@quotation Note 
If a @ref{3e6,,virtual environment} is in effect, this @code{prefix}
will point to the virtual environment. The value for the Python installation
will still be available, via @ref{3e4,,base_prefix}.
Refer to @ref{4c13,,Virtual Environments} for more information.
@end quotation
@end cartouche


Changed in version 3.14: When running under a @ref{3e6,,virtual environment},
@code{prefix} and @ref{3e9,,exec_prefix} are now set to the virtual
environment prefix by the @ref{1922,,path initialization},
instead of @ref{cc,,site}. This means that @code{prefix} and
@code{exec_prefix} always point to the virtual environment, even when
@code{site} is disabled (@ref{13b4,,-S}).

@end deffn

@geindex ps1 (in module sys)
@geindex ps2 (in module sys)
@anchor{library/sys sys ps1}@anchor{2178}
@deffn {Data} sys.ps1
@anchor{library/sys sys ps2}@anchor{2179}
@deffnx {Data} sys.ps2

@geindex interpreter prompts
@geindex prompts@comma{} interpreter
@geindex >>>; interpreter prompt
@geindex ...; interpreter prompt

Strings specifying the primary and secondary prompt of the interpreter.  These
are only defined if the interpreter is in interactive mode.  Their initial
values in this case are @code{'>>> '} and @code{'... '}.  If a non-string object is
assigned to either variable, its @ref{16a,,str()} is re-evaluated each time the
interpreter prepares to read a new interactive command; this can be used to
implement a dynamic prompt.
@end deffn

@geindex setdlopenflags() (in module sys)
@anchor{library/sys sys setdlopenflags}@anchor{132b}
@deffn {Function} sys.setdlopenflags (n)

Set the flags used by the interpreter for @code{dlopen()} calls, such as when
the interpreter loads extension modules.  Among other things, this will enable a
lazy resolving of symbols when importing a module, if called as
@code{sys.setdlopenflags(0)}.  To share symbols across extension modules, call as
@code{sys.setdlopenflags(os.RTLD_GLOBAL)}.  Symbolic names for the flag values
can be found in the @ref{a5,,os} module (@code{RTLD_@var{xxx}} constants, e.g.
@ref{1324,,os.RTLD_LAZY}).

@ref{2181,,Availability}: Unix.
@end deffn

@geindex set_int_max_str_digits() (in module sys)
@anchor{library/sys sys set_int_max_str_digits}@anchor{1769}
@deffn {Function} sys.set_int_max_str_digits (maxdigits)

Set the @ref{80c,,integer string conversion length limitation} used by this interpreter. See also
@ref{1862,,get_int_max_str_digits()}.


Added in version 3.11.

@end deffn

@geindex setprofile() (in module sys)
@anchor{library/sys sys setprofile}@anchor{170a}
@deffn {Function} sys.setprofile (profilefunc)

@geindex profile function
@geindex profiler

Set the system’s profile function, which allows you to implement a Python source
code profiler in Python.  See chapter @ref{4b56,,The Python Profilers} for more information on the
Python profiler.  The system’s profile function is called similarly to the
system’s trace function (see @ref{2e3,,settrace()}), but it is called with different events,
for example it isn’t called for each executed line of code (only on call and return,
but the return event is reported even when an exception has been set). The function is
thread-specific, but there is no way for the profiler to know about context switches between
threads, so it does not make sense to use this in the presence of multiple threads. Also,
its return value is not used, so it can simply return @code{None}.  Error in the profile
function will cause itself unset.

@cartouche
@quotation Note 
The same tracing mechanism is used for @code{setprofile()} as @ref{2e3,,settrace()}.
To trace calls with @code{setprofile()} inside a tracing function
(e.g. in a debugger breakpoint), see @ref{1c06,,call_tracing()}.
@end quotation
@end cartouche

Profile functions should have three arguments: `frame', `event', and
`arg'. `frame' is the current stack frame.  `event' is a string: @code{'call'},
@code{'return'}, @code{'c_call'}, @code{'c_return'}, or @code{'c_exception'}. `arg' depends
on the event type.

The events have the following meaning:


@table @asis

@item @code{'call'}

A function is called (or some other code block entered).  The
profile function is called; `arg' is @code{None}.

@item @code{'return'}

A function (or other code block) is about to return.  The profile
function is called; `arg' is the value that will be returned, or @code{None}
if the event is caused by an exception being raised.

@item @code{'c_call'}

A C function is about to be called.  This may be an extension function or
a built-in.  `arg' is the C function object.

@item @code{'c_return'}

A C function has returned. `arg' is the C function object.

@item @code{'c_exception'}

A C function has raised an exception.  `arg' is the C function object.
@end table

Raises an @ref{1cb1,,auditing event} @code{sys.setprofile} with no arguments.
@end deffn

@geindex setrecursionlimit() (in module sys)
@anchor{library/sys sys setrecursionlimit}@anchor{6eb}
@deffn {Function} sys.setrecursionlimit (limit)

Set the maximum depth of the Python interpreter stack to `limit'.  This limit
prevents infinite recursion from causing an overflow of the C stack and crashing
Python.

The highest possible limit is platform-dependent.  A user may need to set the
limit higher when they have a program that requires deep recursion and a platform
that supports a higher limit.  This should be done with care, because a too-high
limit can lead to a crash.

If the new limit is too low at the current recursion depth, a
@ref{f6e,,RecursionError} exception is raised.


Changed in version 3.5.1: A @ref{f6e,,RecursionError} exception is now raised if the new limit is too
low at the current recursion depth.

@end deffn

@geindex setswitchinterval() (in module sys)
@anchor{library/sys sys setswitchinterval}@anchor{b4a}
@deffn {Function} sys.setswitchinterval (interval)

Set the interpreter’s thread switch interval (in seconds).  This floating-point
value determines the ideal duration of the “timeslices” allocated to
concurrently running Python threads.  Please note that the actual value
can be higher, especially if long-running internal functions or methods
are used.  Also, which thread becomes scheduled at the end of the interval
is the operating system’s decision.  The interpreter doesn’t have its
own scheduler.


Added in version 3.2.

@end deffn

@geindex settrace() (in module sys)
@anchor{library/sys sys settrace}@anchor{2e3}
@deffn {Function} sys.settrace (tracefunc)

@geindex trace function
@geindex debugger

Set the system’s trace function, which allows you to implement a Python
source code debugger in Python.  The function is thread-specific; for a
debugger to support multiple threads, it must register a trace function using
@code{settrace()} for each thread being debugged or use @ref{a4e,,threading.settrace()}.

Trace functions should have three arguments: `frame', `event', and
`arg'. `frame' is the @ref{8f1,,current stack frame}. `event' is a string: @code{'call'},
@code{'line'}, @code{'return'}, @code{'exception'} or @code{'opcode'}.  `arg' depends on
the event type.

The trace function is invoked (with `event' set to @code{'call'}) whenever a new
local scope is entered; it should return a reference to a local trace
function to be used for the new scope, or @code{None} if the scope shouldn’t be
traced.

The local trace function should return a reference to itself, or to another
function which would then be used as the local trace function for the scope.

If there is any error occurred in the trace function, it will be unset, just
like @code{settrace(None)} is called.

@cartouche
@quotation Note 
Tracing is disabled while calling the trace function (e.g. a function set by
@code{settrace()}). For recursive tracing see @ref{1c06,,call_tracing()}.
@end quotation
@end cartouche

The events have the following meaning:


@table @asis

@item @code{'call'}

A function is called (or some other code block entered).  The
global trace function is called; `arg' is @code{None}; the return value
specifies the local trace function.

@item @code{'line'}

The interpreter is about to execute a new line of code or re-execute the
condition of a loop.  The local trace function is called; `arg' is
@code{None}; the return value specifies the new local trace function.  See
@code{Objects/lnotab_notes.txt} for a detailed explanation of how this
works.
Per-line events may be disabled for a frame by setting
@ref{ddc,,f_trace_lines} to @ref{d31,,False} on that
@ref{8f1,,frame}.

@item @code{'return'}

A function (or other code block) is about to return.  The local trace
function is called; `arg' is the value that will be returned, or @code{None}
if the event is caused by an exception being raised.  The trace function’s
return value is ignored.

@item @code{'exception'}

An exception has occurred.  The local trace function is called; `arg' is a
tuple @code{(exception, value, traceback)}; the return value specifies the
new local trace function.

@item @code{'opcode'}

The interpreter is about to execute a new opcode (see @ref{3c,,dis} for
opcode details).  The local trace function is called; `arg' is
@code{None}; the return value specifies the new local trace function.
Per-opcode events are not emitted by default: they must be explicitly
requested by setting @ref{ddd,,f_trace_opcodes} to @ref{e0d,,True} on the
@ref{8f1,,frame}.
@end table

Note that as an exception is propagated down the chain of callers, an
@code{'exception'} event is generated at each level.

For more fine-grained usage, it’s possible to set a trace function by
assigning @code{frame.f_trace = tracefunc} explicitly, rather than relying on
it being set indirectly via the return value from an already installed
trace function. This is also required for activating the trace function on
the current frame, which @code{settrace()} doesn’t do. Note that in order
for this to work, a global tracing function must have been installed
with @code{settrace()} in order to enable the runtime tracing machinery,
but it doesn’t need to be the same tracing function (e.g. it could be a
low overhead tracing function that simply returns @code{None} to disable
itself immediately on each frame).

For more information on code and frame objects, refer to @ref{2373,,The standard type hierarchy}.

Raises an @ref{1cb1,,auditing event} @code{sys.settrace} with no arguments.

`CPython implementation detail:' The @code{settrace()} function is intended only for implementing debuggers,
profilers, coverage tools and the like.  Its behavior is part of the
implementation platform, rather than part of the language definition, and
thus may not be available in all Python implementations.


Changed in version 3.7: @code{'opcode'} event type added; @ref{ddc,,f_trace_lines} and
@ref{ddd,,f_trace_opcodes} attributes added to frames

@end deffn

@geindex set_asyncgen_hooks() (in module sys)
@anchor{library/sys sys set_asyncgen_hooks}@anchor{19e0}
@deffn {Function} sys.set_asyncgen_hooks ([firstiter] [, finalizer])

Accepts two optional keyword arguments which are callables that accept an
@ref{39bc,,asynchronous generator iterator} as an argument. The `firstiter'
callable will be called when an asynchronous generator is iterated for the
first time. The `finalizer' will be called when an asynchronous generator
is about to be garbage collected.

Raises an @ref{1cb1,,auditing event} @code{sys.set_asyncgen_hooks_firstiter} with no arguments.

Raises an @ref{1cb1,,auditing event} @code{sys.set_asyncgen_hooks_finalizer} with no arguments.

Two auditing events are raised because the underlying API consists of two
calls, each of which must raise its own event.


Added in version 3.6: See 
@geindex Python Enhancement Proposals; PEP 525
PEP 525@footnote{https://peps.python.org/pep-0525/} for more details, and for a reference example of a
`finalizer' method see the implementation of
@code{asyncio.Loop.shutdown_asyncgens} in
Lib/asyncio/base_events.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/asyncio/base_events.py}


@cartouche
@quotation Note 
This function has been added on a provisional basis (see 
@geindex Python Enhancement Proposals; PEP 411
PEP 411@footnote{https://peps.python.org/pep-0411/}
for details.)
@end quotation
@end cartouche
@end deffn

@geindex set_coroutine_origin_tracking_depth() (in module sys)
@anchor{library/sys sys set_coroutine_origin_tracking_depth}@anchor{d8b}
@deffn {Function} sys.set_coroutine_origin_tracking_depth (depth)

Allows enabling or disabling coroutine origin tracking. When
enabled, the @code{cr_origin} attribute on coroutine objects will
contain a tuple of (filename, line number, function name) tuples
describing the traceback where the coroutine object was created,
with the most recent call first. When disabled, @code{cr_origin} will
be @code{None}.

To enable, pass a `depth' value greater than zero; this sets the
number of frames whose information will be captured. To disable,
set `depth' to zero.

This setting is thread-specific.


Added in version 3.7.


@cartouche
@quotation Note 
This function has been added on a provisional basis (see 
@geindex Python Enhancement Proposals; PEP 411
PEP 411@footnote{https://peps.python.org/pep-0411/}
for details.)  Use it only for debugging purposes.
@end quotation
@end cartouche
@end deffn

@geindex activate_stack_trampoline() (in module sys)
@anchor{library/sys sys activate_stack_trampoline}@anchor{69b}
@deffn {Function} sys.activate_stack_trampoline (backend, /)

Activate the stack profiler trampoline `backend'.
The only supported backend is @code{"perf"}.

Stack trampolines cannot be activated if the JIT is active.

@ref{2181,,Availability}: Linux.


Added in version 3.12.



@subsubheading See also



@itemize *

@item 
@ref{4af,,Python support for the Linux perf profiler}

@item 
@indicateurl{https://perf.wiki.kernel.org}
@end itemize

@end deffn

@geindex deactivate_stack_trampoline() (in module sys)
@anchor{library/sys sys deactivate_stack_trampoline}@anchor{69c}
@deffn {Function} sys.deactivate_stack_trampoline ()

Deactivate the current stack profiler trampoline backend.

If no stack profiler is activated, this function has no effect.

@ref{2181,,Availability}: Linux.


Added in version 3.12.

@end deffn

@geindex is_stack_trampoline_active() (in module sys)
@anchor{library/sys sys is_stack_trampoline_active}@anchor{69d}
@deffn {Function} sys.is_stack_trampoline_active ()

Return @code{True} if a stack profiler trampoline is active.

@ref{2181,,Availability}: Linux.


Added in version 3.12.

@end deffn

@geindex remote_exec() (in module sys)
@anchor{library/sys sys remote_exec}@anchor{16e}
@deffn {Function} sys.remote_exec (pid, script)

Executes `script', a file containing Python code in the remote
process with the given `pid'.

This function returns immediately, and the code will be executed by the
target process’s main thread at the next available opportunity, similarly
to how signals are handled. There is no interface to determine when the
code has been executed. The caller is responsible for making sure that
the file still exists whenever the remote process tries to read it and that
it hasn’t been overwritten.

The remote process must be running a CPython interpreter of the same major
and minor version as the local process. If either the local or remote
interpreter is pre-release (alpha, beta, or release candidate) then the
local and remote interpreters must be the same exact version.

See @ref{4c86,,Remote debugging attachment protocol} for more information about the remote debugging
mechanism.


When the code is executed in the remote process, an
@ref{1cb1,,auditing event} @code{sys.remote_exec} is raised with
the `pid' and the path to the script file.
This event is raised in the process that called @code{sys.remote_exec()}.



When the script is executed in the remote process, an
@ref{1cb1,,auditing event}
@code{cpython.remote_debugger_script} is raised
with the path in the remote process.
This event is raised in the remote process, not the one
that called @code{sys.remote_exec()}.


@ref{2181,,Availability}: Unix, Windows.


Added in version 3.14: See 
@geindex Python Enhancement Proposals; PEP 768
PEP 768@footnote{https://peps.python.org/pep-0768/} for more details.

@end deffn

@geindex _enablelegacywindowsfsencoding() (in module sys)
@anchor{library/sys sys _enablelegacywindowsfsencoding}@anchor{33c}
@deffn {Function} sys._enablelegacywindowsfsencoding ()

Changes the @ref{75e,,filesystem encoding and error handler} to ‘mbcs’ and
‘replace’ respectively, for consistency with versions of Python prior to
3.6.

This is equivalent to defining the 
@geindex PYTHONLEGACYWINDOWSFSENCODING
@geindex environment variable; PYTHONLEGACYWINDOWSFSENCODING
@ref{33d,,PYTHONLEGACYWINDOWSFSENCODING}
environment variable before launching Python.

See also @ref{e59,,sys.getfilesystemencoding()} and
@ref{ee8,,sys.getfilesystemencodeerrors()}.

@ref{2181,,Availability}: Windows.

@cartouche
@quotation Note 
Changing the filesystem encoding after Python startup is risky because
the old fsencoding or paths encoded by the old fsencoding may be cached
somewhere. Use 
@geindex PYTHONLEGACYWINDOWSFSENCODING
@geindex environment variable; PYTHONLEGACYWINDOWSFSENCODING
@ref{33d,,PYTHONLEGACYWINDOWSFSENCODING} instead.
@end quotation
@end cartouche


Added in version 3.6: See 
@geindex Python Enhancement Proposals; PEP 529
PEP 529@footnote{https://peps.python.org/pep-0529/} for more details.



Deprecated since version 3.13, will be removed in version 3.16: Use 
@geindex PYTHONLEGACYWINDOWSFSENCODING
@geindex environment variable; PYTHONLEGACYWINDOWSFSENCODING
@ref{33d,,PYTHONLEGACYWINDOWSFSENCODING} instead.

@end deffn

@geindex stdin (in module sys)
@geindex stdout (in module sys)
@geindex stderr (in module sys)
@anchor{library/sys sys stdin}@anchor{760}
@deffn {Data} sys.stdin
@anchor{library/sys sys stdout}@anchor{cd3}
@deffnx {Data} sys.stdout
@anchor{library/sys sys stderr}@anchor{b39}
@deffnx {Data} sys.stderr

@ref{13cf,,File objects} used by the interpreter for standard
input, output and errors:


@itemize *

@item 
@code{stdin} is used for all interactive input (including calls to
@ref{14e4,,input()});

@item 
@code{stdout} is used for the output of @ref{117b,,print()} and @ref{2416,,expression}
statements and for the prompts of @ref{14e4,,input()};

@item 
The interpreter’s own prompts and its error messages go to @code{stderr}.
@end itemize

These streams are regular @ref{20b1,,text files} like those
returned by the @ref{318,,open()} function.  Their parameters are chosen as
follows:


@itemize *

@item 
The encoding and error handling are is initialized from
@ref{644,,PyConfig.stdio_encoding} and @ref{4c87,,PyConfig.stdio_errors}.

On Windows, UTF-8 is used for the console device.  Non-character
devices such as disk files and pipes use the system locale
encoding (i.e. the ANSI codepage).  Non-console character
devices such as NUL (i.e. where @code{isatty()} returns @code{True}) use the
value of the console input and output codepages at startup,
respectively for stdin and stdout/stderr. This defaults to the
system @ref{54b,,locale encoding} if the process is not initially attached
to a console.

The special behaviour of the console can be overridden
by setting the environment variable PYTHONLEGACYWINDOWSSTDIO
before starting Python. In that case, the console codepages are
used as for any other character device.

Under all platforms, you can override the character encoding by
setting the 
@geindex PYTHONIOENCODING
@geindex environment variable; PYTHONIOENCODING
@ref{1210,,PYTHONIOENCODING} environment variable before
starting Python or by using the new @ref{170,,-X} @code{utf8} command
line option and 
@geindex PYTHONUTF8
@geindex environment variable; PYTHONUTF8
@ref{cd5,,PYTHONUTF8} environment variable.  However,
for the Windows console, this only applies when
@geindex PYTHONLEGACYWINDOWSSTDIO
@geindex environment variable; PYTHONLEGACYWINDOWSSTDIO
@ref{e5b,,PYTHONLEGACYWINDOWSSTDIO} is also set.

@item 
When interactive, the @code{stdout} stream is line-buffered. Otherwise,
it is block-buffered like regular text files.  The @code{stderr} stream
is line-buffered in both cases.  You can make both streams unbuffered
by passing the @ref{1dd1,,-u} command-line option or setting the
@geindex PYTHONUNBUFFERED
@geindex environment variable; PYTHONUNBUFFERED
@ref{1dd2,,PYTHONUNBUFFERED} environment variable.
@end itemize


Changed in version 3.9: Non-interactive @code{stderr} is now line-buffered instead of fully
buffered.


@cartouche
@quotation Note 
To write or read binary data from/to the standard streams, use the
underlying binary @ref{14af,,buffer} object.  For example, to
write bytes to @code{stdout}, use @code{sys.stdout.buffer.write(b'abc')}.

However, if you are writing a library (and do not control in which
context its code will be executed), be aware that the standard streams
may be replaced with file-like objects like @ref{112f,,io.StringIO} which
do not support the @code{buffer} attribute.
@end quotation
@end cartouche
@end deffn

@geindex __stdin__ (in module sys)
@geindex __stdout__ (in module sys)
@geindex __stderr__ (in module sys)
@anchor{library/sys sys __stdin__}@anchor{4c88}
@deffn {Data} sys.__stdin__
@anchor{library/sys sys __stdout__}@anchor{2d6c}
@deffnx {Data} sys.__stdout__
@anchor{library/sys sys __stderr__}@anchor{4a33}
@deffnx {Data} sys.__stderr__

These objects contain the original values of @code{stdin}, @code{stderr} and
@code{stdout} at the start of the program.  They are used during finalization,
and could be useful to print to the actual standard stream no matter if the
@code{sys.std*} object has been redirected.

It can also be used to restore the actual files to known working file objects
in case they have been overwritten with a broken object.  However, the
preferred way to do this is to explicitly save the previous stream before
replacing it, and restore the saved object.

@cartouche
@quotation Note 
Under some conditions @code{stdin}, @code{stdout} and @code{stderr} as well as the
original values @code{__stdin__}, @code{__stdout__} and @code{__stderr__} can be
@code{None}. It is usually the case for Windows GUI apps that aren’t connected
to a console and Python apps started with @code{pythonw}.
@end quotation
@end cartouche
@end deffn

@geindex stdlib_module_names (in module sys)
@anchor{library/sys sys stdlib_module_names}@anchor{a48}
@deffn {Data} sys.stdlib_module_names

A frozenset of strings containing the names of standard library modules.

It is the same on all platforms. Modules which are not available on
some platforms and modules disabled at Python build are also listed.
All module kinds are listed: pure Python, built-in, frozen and extension
modules. Test modules are excluded.

For packages, only the main package is listed: sub-packages and sub-modules
are not listed. For example, the @code{email} package is listed, but the
@code{email.mime} sub-package and the @code{email.message} sub-module are not
listed.

See also the @ref{208b,,sys.builtin_module_names} list.


Added in version 3.10.

@end deffn

@geindex thread_info (in module sys)
@anchor{library/sys sys thread_info}@anchor{135c}
@deffn {Data} sys.thread_info

A @ref{85f,,named tuple} holding information about the thread
implementation.

@geindex name (sys.thread_info attribute)
@anchor{library/sys sys thread_info name}@anchor{4c89}
@deffn {Attribute} thread_info.name

The name of the thread implementation:


@itemize *

@item 
@code{"nt"}: Windows threads

@item 
@code{"pthread"}: POSIX threads

@item 
@code{"pthread-stubs"}: stub POSIX threads
(on WebAssembly platforms without threading support)

@item 
@code{"solaris"}: Solaris threads
@end itemize
@end deffn

@geindex lock (sys.thread_info attribute)
@anchor{library/sys sys thread_info lock}@anchor{4c8a}
@deffn {Attribute} thread_info.lock

The name of the lock implementation:


@itemize *

@item 
@code{"semaphore"}: a lock uses a semaphore

@item 
@code{"mutex+cond"}: a lock uses a mutex and a condition variable

@item 
@code{None} if this information is unknown
@end itemize
@end deffn

@geindex version (sys.thread_info attribute)
@anchor{library/sys sys thread_info version}@anchor{4c8b}
@deffn {Attribute} thread_info.version

The name and version of the thread library.
It is a string, or @code{None} if this information is unknown.
@end deffn


Added in version 3.3.

@end deffn

@geindex tracebacklimit (in module sys)
@anchor{library/sys sys tracebacklimit}@anchor{1988}
@deffn {Data} sys.tracebacklimit

When this variable is set to an integer value, it determines the maximum number
of levels of traceback information printed when an unhandled exception occurs.
The default is @code{1000}.  When set to @code{0} or less, all traceback information
is suppressed and only the exception type and value are printed.
@end deffn

@geindex unraisablehook() (in module sys)
@anchor{library/sys sys unraisablehook}@anchor{508}
@deffn {Function} sys.unraisablehook (unraisable, /)

Handle an unraisable exception.

Called when an exception has occurred but there is no way for Python to
handle it. For example, when a destructor raises an exception or during
garbage collection (@ref{1b5,,gc.collect()}).

The `unraisable' argument has the following attributes:


@itemize *

@item 
@code{exc_type}: Exception type.

@item 
@code{exc_value}: Exception value, can be @code{None}.

@item 
@code{exc_traceback}: Exception traceback, can be @code{None}.

@item 
@code{err_msg}: Error message, can be @code{None}.

@item 
@code{object}: Object causing the exception, can be @code{None}.
@end itemize

The default hook formats @code{err_msg} and @code{object} as:
@code{f'@{err_msg@}: @{object!r@}'}; use “Exception ignored in” error message
if @code{err_msg} is @code{None}.

@code{sys.unraisablehook()} can be overridden to control how unraisable
exceptions are handled.


@subsubheading See also


@ref{a12,,excepthook()} which handles uncaught exceptions.


@cartouche
@quotation Warning 
Storing @code{exc_value} using a custom hook can create a reference cycle.
It should be cleared explicitly to break the reference cycle when the
exception is no longer needed.

Storing @code{object} using a custom hook can resurrect it if it is set to an
object which is being finalized. Avoid storing @code{object} after the custom
hook completes to avoid resurrecting objects.
@end quotation
@end cartouche


Raise an auditing event @code{sys.unraisablehook} with arguments
`hook', `unraisable' when an exception that cannot be handled occurs.
The `unraisable' object is the same as what will be passed to the hook.
If no hook has been set, `hook' may be @code{None}.



Added in version 3.8.

@end deffn

@geindex version (in module sys)
@anchor{library/sys sys version}@anchor{49d}
@deffn {Data} sys.version

A string containing the version number of the Python interpreter plus additional
information on the build number and compiler used.  This string is displayed
when the interactive interpreter is started.  Do not extract version information
out of it, rather, use @ref{8b1,,version_info} and the functions provided by the
@ref{af,,platform} module.
@end deffn

@geindex api_version (in module sys)
@anchor{library/sys sys api_version}@anchor{4c8c}
@deffn {Data} sys.api_version

The C API version, equivalent to the C macro @ref{4c8d,,PYTHON_API_VERSION}.
Defined for backwards compatibility.

Currently, this constant is not updated in new Python versions, and is not
useful for versioning. This may change in the future.
@end deffn

@geindex version_info (in module sys)
@anchor{library/sys sys version_info}@anchor{8b1}
@deffn {Data} sys.version_info

A tuple containing the five components of the version number: `major', `minor',
`micro', `releaselevel', and `serial'.  All values except `releaselevel' are
integers; the release level is @code{'alpha'}, @code{'beta'}, @code{'candidate'}, or
@code{'final'}.  The @code{version_info} value corresponding to the Python version 2.0
is @code{(2, 0, 0, 'final', 0)}.  The components can also be accessed by name,
so @code{sys.version_info[0]} is equivalent to @code{sys.version_info.major}
and so on.


Changed in version 3.1: Added named component attributes.

@end deffn

@geindex warnoptions (in module sys)
@anchor{library/sys sys warnoptions}@anchor{3f3}
@deffn {Data} sys.warnoptions

This is an implementation detail of the warnings framework; do not modify this
value.  Refer to the @ref{119,,warnings} module for more information on the warnings
framework.
@end deffn

@geindex winver (in module sys)
@anchor{library/sys sys winver}@anchor{4c8e}
@deffn {Data} sys.winver

The version number used to form registry keys on Windows platforms. This is
stored as string resource 1000 in the Python DLL.  The value is normally the
major and minor versions of the running Python interpreter.  It is provided in the @code{sys}
module for informational purposes; modifying this value has no effect on the
registry keys used by Python.

@ref{2181,,Availability}: Windows.
@end deffn


@deffn {Data} sys.monitoring

Namespace containing functions and constants for register callbacks
and controlling monitoring events.
See  @ref{e0,,sys.monitoring} for details.
@end deffn

@geindex _xoptions (in module sys)
@anchor{library/sys sys _xoptions}@anchor{2174}
@deffn {Data} sys._xoptions

A dictionary of the various implementation-specific flags passed through
the @ref{170,,-X} command-line option.  Option names are either mapped to
their values, if given explicitly, or to @ref{e0d,,True}.  Example:

@example
$ ./python -Xa=b -Xc
Python 3.2a3+ (py3k, Oct 16 2010, 20:14:50)
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys._xoptions
@{'a': 'b', 'c': True@}
@end example

`CPython implementation detail:' This is a CPython-specific way of accessing options passed through
@ref{170,,-X}.  Other implementations may export them through other
means, or not at all.


Added in version 3.2.

@end deffn

@subsubheading Citations


@anchor{library/sys c99}@anchor{4c69}@w{(C99)} 
ISO/IEC 9899:1999.  “Programming languages – C.”  A public draft of this standard is available at @indicateurl{https://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf}.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node sys monitoring — Execution event monitoring,sysconfig — Provide access to Python’s configuration information,sys — System-specific parameters and functions,Python Runtime Services
@anchor{library/sys monitoring doc}@anchor{4c8f}@anchor{library/sys monitoring module-sys monitoring}@anchor{e0}@anchor{library/sys monitoring sys-monitoring-execution-event-monitoring}@anchor{4c90}@anchor{library/sys monitoring translation-repo}@anchor{4c91}
@subsection @code{sys.monitoring} — Execution event monitoring


@geindex module; sys.monitoring


Added in version 3.12.



__________________________________________________________________


@cartouche
@quotation Note 
@code{sys.monitoring} is a namespace within the @ref{df,,sys} module,
not an independent module, and @code{import sys.monitoring} would fail
with a @ref{d43,,ModuleNotFoundError}. Instead, simply @code{import sys}
and then use @code{sys.monitoring}.
@end quotation
@end cartouche

This namespace provides access to the functions and constants necessary to
activate and control event monitoring.

As programs execute, events occur that might be of interest to tools that
monitor execution. The @code{sys.monitoring} namespace provides means to
receive callbacks when events of interest occur.

The monitoring API consists of three components:


@itemize *

@item 
@ref{4c92,,Tool identifiers}

@item 
@ref{4c93,,Events}

@item 
@ref{4c94,,Callbacks}
@end itemize

@menu
* Tool identifiers:: 
* Events:: 
* Turning events on and off:: 
* Registering callback functions:: 

@end menu

@node Tool identifiers,Events,,sys monitoring — Execution event monitoring
@anchor{library/sys monitoring tool-identifiers}@anchor{4c92}
@subsubsection Tool identifiers


A tool identifier is an integer and the associated name.
Tool identifiers are used to discourage tools from interfering with each
other and to allow multiple tools to operate at the same time.
Currently tools are completely independent and cannot be used to
monitor each other. This restriction may be lifted in the future.

Before registering or activating events, a tool should choose an identifier.
Identifiers are integers in the range 0 to 5 inclusive.

@menu
* Registering and using tools:: 

@end menu

@node Registering and using tools,,,Tool identifiers
@anchor{library/sys monitoring registering-and-using-tools}@anchor{4c95}
@subsubsection Registering and using tools


@geindex use_tool_id() (in module sys.monitoring)
@anchor{library/sys monitoring sys monitoring use_tool_id}@anchor{4c96}
@deffn {Function} sys.monitoring.use_tool_id (tool_id: int, name: str, /) -> None

Must be called before `tool_id' can be used.
`tool_id' must be in the range 0 to 5 inclusive.
Raises a @ref{2ee,,ValueError} if `tool_id' is in use.
@end deffn

@geindex clear_tool_id() (in module sys.monitoring)
@anchor{library/sys monitoring sys monitoring clear_tool_id}@anchor{1972}
@deffn {Function} sys.monitoring.clear_tool_id (tool_id: int, /) -> None

Unregister all events and callback functions associated with `tool_id'.
@end deffn

@geindex free_tool_id() (in module sys.monitoring)
@anchor{library/sys monitoring sys monitoring free_tool_id}@anchor{4c97}
@deffn {Function} sys.monitoring.free_tool_id (tool_id: int, /) -> None

Should be called once a tool no longer requires `tool_id'.
Will call @ref{1972,,clear_tool_id()} before releasing `tool_id'.
@end deffn

@geindex get_tool() (in module sys.monitoring)
@anchor{library/sys monitoring sys monitoring get_tool}@anchor{4c98}
@deffn {Function} sys.monitoring.get_tool (tool_id: int, /) -> str | None

Returns the name of the tool if `tool_id' is in use,
otherwise it returns @code{None}.
`tool_id' must be in the range 0 to 5 inclusive.
@end deffn

All IDs are treated the same by the VM with regard to events, but the
following IDs are pre-defined to make co-operation of tools easier:

@example
sys.monitoring.DEBUGGER_ID = 0
sys.monitoring.COVERAGE_ID = 1
sys.monitoring.PROFILER_ID = 2
sys.monitoring.OPTIMIZER_ID = 5
@end example

@node Events,Turning events on and off,Tool identifiers,sys monitoring — Execution event monitoring
@anchor{library/sys monitoring events}@anchor{4c93}
@subsubsection Events


The following events are supported:

@geindex BRANCH_LEFT (monitoring event)
@anchor{library/sys monitoring monitoring-event-BRANCH_LEFT}@anchor{297}
@deffn {monitoring-event} sys.monitoring.events.BRANCH_LEFT

A conditional branch goes left.

It is up to the tool to determine how to present “left” and “right” branches.
There is no guarantee which branch is “left” and which is “right”, except
that it will be consistent for the duration of the program.
@end deffn

@geindex BRANCH_RIGHT (monitoring event)
@anchor{library/sys monitoring monitoring-event-BRANCH_RIGHT}@anchor{298}
@deffn {monitoring-event} sys.monitoring.events.BRANCH_RIGHT

A conditional branch goes right.
@end deffn

@geindex CALL (monitoring event)
@anchor{library/sys monitoring monitoring-event-CALL}@anchor{19ff}
@deffn {monitoring-event} sys.monitoring.events.CALL

A call in Python code (event occurs before the call).
@end deffn

@geindex C_RAISE (monitoring event)
@anchor{library/sys monitoring monitoring-event-C_RAISE}@anchor{4c99}
@deffn {monitoring-event} sys.monitoring.events.C_RAISE

An exception raised from any callable, except for Python functions (event occurs after the exit).
@end deffn

@geindex C_RETURN (monitoring event)
@anchor{library/sys monitoring monitoring-event-C_RETURN}@anchor{4c9a}
@deffn {monitoring-event} sys.monitoring.events.C_RETURN

Return from any callable, except for Python functions (event occurs after the return).
@end deffn

@geindex EXCEPTION_HANDLED (monitoring event)
@anchor{library/sys monitoring monitoring-event-EXCEPTION_HANDLED}@anchor{4c9b}
@deffn {monitoring-event} sys.monitoring.events.EXCEPTION_HANDLED

An exception is handled.
@end deffn

@geindex INSTRUCTION (monitoring event)
@anchor{library/sys monitoring monitoring-event-INSTRUCTION}@anchor{4c9c}
@deffn {monitoring-event} sys.monitoring.events.INSTRUCTION

A VM instruction is about to be executed.
@end deffn

@geindex JUMP (monitoring event)
@anchor{library/sys monitoring monitoring-event-JUMP}@anchor{4c9d}
@deffn {monitoring-event} sys.monitoring.events.JUMP

An unconditional jump in the control flow graph is made.
@end deffn

@geindex LINE (monitoring event)
@anchor{library/sys monitoring monitoring-event-LINE}@anchor{4c9e}
@deffn {monitoring-event} sys.monitoring.events.LINE

An instruction is about to be executed that has a different line number from the preceding instruction.
@end deffn

@geindex PY_RESUME (monitoring event)
@anchor{library/sys monitoring monitoring-event-PY_RESUME}@anchor{4c9f}
@deffn {monitoring-event} sys.monitoring.events.PY_RESUME

Resumption of a Python function (for generator and coroutine functions), except for @code{throw()} calls.
@end deffn

@geindex PY_RETURN (monitoring event)
@anchor{library/sys monitoring monitoring-event-PY_RETURN}@anchor{4ca0}
@deffn {monitoring-event} sys.monitoring.events.PY_RETURN

Return from a Python function (occurs immediately before the return, the callee’s frame will be on the stack).
@end deffn

@geindex PY_START (monitoring event)
@anchor{library/sys monitoring monitoring-event-PY_START}@anchor{4ca1}
@deffn {monitoring-event} sys.monitoring.events.PY_START

Start of a Python function (occurs immediately after the call, the callee’s frame will be on the stack)
@end deffn

@geindex PY_THROW (monitoring event)
@anchor{library/sys monitoring monitoring-event-PY_THROW}@anchor{189e}
@deffn {monitoring-event} sys.monitoring.events.PY_THROW

A Python function is resumed by a @code{throw()} call.
@end deffn

@geindex PY_UNWIND (monitoring event)
@anchor{library/sys monitoring monitoring-event-PY_UNWIND}@anchor{4ca2}
@deffn {monitoring-event} sys.monitoring.events.PY_UNWIND

Exit from a Python function during exception unwinding. This includes exceptions raised directly within the
function and that are allowed to continue to propagate.
@end deffn

@geindex PY_YIELD (monitoring event)
@anchor{library/sys monitoring monitoring-event-PY_YIELD}@anchor{4ca3}
@deffn {monitoring-event} sys.monitoring.events.PY_YIELD

Yield from a Python function (occurs immediately before the yield, the callee’s frame will be on the stack).
@end deffn

@geindex RAISE (monitoring event)
@anchor{library/sys monitoring monitoring-event-RAISE}@anchor{19b8}
@deffn {monitoring-event} sys.monitoring.events.RAISE

An exception is raised, except those that cause a @ref{4ca4,,STOP_ITERATION} event.
@end deffn

@geindex RERAISE (monitoring event)
@anchor{library/sys monitoring monitoring-event-RERAISE}@anchor{4ca5}
@deffn {monitoring-event} sys.monitoring.events.RERAISE

An exception is re-raised, for example at the end of a @ref{1b1,,finally} block.
@end deffn

@geindex STOP_ITERATION (monitoring event)
@anchor{library/sys monitoring monitoring-event-STOP_ITERATION}@anchor{4ca4}
@deffn {monitoring-event} sys.monitoring.events.STOP_ITERATION

An artificial @ref{dfb,,StopIteration} is raised; see @ref{4ca6,,the STOP_ITERATION event}.
@end deffn

More events may be added in the future.

These events are attributes of the @code{sys.monitoring.events} namespace.
Each event is represented as a power-of-2 integer constant.
To define a set of events, simply bitwise OR the individual events together.
For example, to specify both @ref{4ca0,,PY_RETURN} and @ref{4ca1,,PY_START}
events, use the expression @code{PY_RETURN | PY_START}.

@geindex NO_EVENTS (monitoring event)
@anchor{library/sys monitoring monitoring-event-NO_EVENTS}@anchor{4ca7}
@deffn {monitoring-event} sys.monitoring.events.NO_EVENTS

An alias for @code{0} so users can do explicit comparisons like:

@example
if get_events(DEBUGGER_ID) == NO_EVENTS:
    ...
@end example

Setting this event deactivates all events.
@end deffn

@menu
* Local events:: 
* Deprecated event:: 
* Ancillary events:: 
* Other events:: 
* The STOP_ITERATION event:: 

@end menu

@node Local events,Deprecated event,,Events
@anchor{library/sys monitoring local-events}@anchor{4ca8}@anchor{library/sys monitoring monitoring-event-local}@anchor{4ca9}
@subsubsection Local events


Local events are associated with normal execution of the program and happen
at clearly defined locations. All local events can be disabled.
The local events are:


@itemize *

@item 
@ref{4ca1,,PY_START}

@item 
@ref{4c9f,,PY_RESUME}

@item 
@ref{4ca0,,PY_RETURN}

@item 
@ref{4ca3,,PY_YIELD}

@item 
@ref{19ff,,CALL}

@item 
@ref{4c9e,,LINE}

@item 
@ref{4c9c,,INSTRUCTION}

@item 
@ref{4c9d,,JUMP}

@item 
@ref{297,,BRANCH_LEFT}

@item 
@ref{298,,BRANCH_RIGHT}

@item 
@ref{4ca4,,STOP_ITERATION}
@end itemize

@node Deprecated event,Ancillary events,Local events,Events
@anchor{library/sys monitoring deprecated-event}@anchor{4caa}
@subsubsection Deprecated event



@itemize *

@item 
@code{BRANCH}
@end itemize

The @code{BRANCH} event is deprecated in 3.14.
Using @ref{297,,BRANCH_LEFT} and @ref{298,,BRANCH_RIGHT}
events will give much better performance as they can be disabled
independently.

@node Ancillary events,Other events,Deprecated event,Events
@anchor{library/sys monitoring ancillary-events}@anchor{4cab}
@subsubsection Ancillary events


Ancillary events can be monitored like other events, but are controlled
by another event:


@itemize *

@item 
@ref{4c99,,C_RAISE}

@item 
@ref{4c9a,,C_RETURN}
@end itemize

The @ref{4c9a,,C_RETURN} and @ref{4c99,,C_RAISE} events
are controlled by the @ref{19ff,,CALL} event.
@code{C_RETURN} and @code{C_RAISE} events will only be
seen if the corresponding @code{CALL} event is being monitored.

@node Other events,The STOP_ITERATION event,Ancillary events,Events
@anchor{library/sys monitoring monitoring-event-global}@anchor{4cac}@anchor{library/sys monitoring other-events}@anchor{4cad}
@subsubsection Other events


Other events are not necessarily tied to a specific location in the
program and cannot be individually disabled via @ref{4cae,,DISABLE}.

The other events that can be monitored are:


@itemize *

@item 
@ref{189e,,PY_THROW}

@item 
@ref{4ca2,,PY_UNWIND}

@item 
@ref{19b8,,RAISE}

@item 
@ref{4c9b,,EXCEPTION_HANDLED}
@end itemize

@node The STOP_ITERATION event,,Other events,Events
@anchor{library/sys monitoring the-stop-iteration-event}@anchor{4ca6}
@subsubsection The STOP_ITERATION event


@geindex Python Enhancement Proposals; PEP 380#use-of-stopiteration-to-return-values
PEP 380@footnote{https://peps.python.org/pep-0380/#use-of-stopiteration-to-return-values}
specifies that a @ref{dfb,,StopIteration} exception is raised when returning a value
from a generator or coroutine. However, this is a very inefficient way to
return a value, so some Python implementations, notably CPython 3.12+, do not
raise an exception unless it would be visible to other code.

To allow tools to monitor for real exceptions without slowing down generators
and coroutines, the @ref{4ca4,,STOP_ITERATION} event is provided.
@code{STOP_ITERATION} can be locally disabled, unlike
@ref{19b8,,RAISE}.

Note that the @ref{4ca4,,STOP_ITERATION} event and the
@ref{19b8,,RAISE} event for a @ref{dfb,,StopIteration} exception are
equivalent, and are treated as interchangeable when generating events.
Implementations will favor @code{STOP_ITERATION} for performance
reasons, but may generate a @code{RAISE} event with a
@code{StopIteration}.

@node Turning events on and off,Registering callback functions,Events,sys monitoring — Execution event monitoring
@anchor{library/sys monitoring turning-events-on-and-off}@anchor{4caf}
@subsubsection Turning events on and off


In order to monitor an event, it must be turned on and a corresponding callback
must be registered. Events can be turned on or off by setting the events either
globally and/or for a particular code object. An event will trigger only once,
even if it is turned on both globally and locally.

@menu
* Setting events globally:: 
* Per code object events:: 
* Disabling events:: 

@end menu

@node Setting events globally,Per code object events,,Turning events on and off
@anchor{library/sys monitoring setting-events-globally}@anchor{4cb0}
@subsubsection Setting events globally


Events can be controlled globally by modifying the set of events being monitored.

@geindex get_events() (in module sys.monitoring)
@anchor{library/sys monitoring sys monitoring get_events}@anchor{4cb1}
@deffn {Function} sys.monitoring.get_events (tool_id: int, /) -> int

Returns the @code{int} representing all the active events.
@end deffn

@geindex set_events() (in module sys.monitoring)
@anchor{library/sys monitoring sys monitoring set_events}@anchor{4cb2}
@deffn {Function} sys.monitoring.set_events (tool_id: int, event_set: int, /) -> None

Activates all events which are set in `event_set'.
Raises a @ref{2ee,,ValueError} if `tool_id' is not in use.
@end deffn

No events are active by default.

@node Per code object events,Disabling events,Setting events globally,Turning events on and off
@anchor{library/sys monitoring per-code-object-events}@anchor{4cb3}
@subsubsection Per code object events


Events can also be controlled on a per code object basis. The functions
defined below which accept a @ref{32d,,types.CodeType} should be prepared
to accept a look-alike object from functions which are not defined
in Python (see @ref{486,,Monitoring C API}).

@geindex get_local_events() (in module sys.monitoring)
@anchor{library/sys monitoring sys monitoring get_local_events}@anchor{4cb4}
@deffn {Function} sys.monitoring.get_local_events (tool_id: int, code: CodeType, /) -> int

Returns all the @ref{4ca9,,local events} for `code'
@end deffn

@geindex set_local_events() (in module sys.monitoring)
@anchor{library/sys monitoring sys monitoring set_local_events}@anchor{4cb5}
@deffn {Function} sys.monitoring.set_local_events (tool_id: int, code: CodeType, event_set: int, /) -> None

Activates all the @ref{4ca9,,local events} for `code'
which are set in `event_set'. Raises a @ref{2ee,,ValueError} if `tool_id' is not
in use.
@end deffn

@node Disabling events,,Per code object events,Turning events on and off
@anchor{library/sys monitoring disabling-events}@anchor{4cb6}
@subsubsection Disabling events


@geindex DISABLE (in module sys.monitoring)
@anchor{library/sys monitoring sys monitoring DISABLE}@anchor{4cae}
@deffn {Data} sys.monitoring.DISABLE

A special value that can be returned from a callback function to disable
events for the current code location.
@end deffn

@ref{4ca9,,Local events} can be disabled for a specific code
location by returning @ref{4cae,,sys.monitoring.DISABLE} from a callback function.
This does not change which events are set, or any other code locations for the
same event.

Disabling events for specific locations is very important for high
performance monitoring. For example, a program can be run under a
debugger with no overhead if the debugger disables all monitoring
except for a few breakpoints.

If @ref{4cae,,DISABLE} is returned by a callback for a
@ref{4cac,,global event}, @ref{2ee,,ValueError} will be raised
by the interpreter in a non-specific location (that is, no traceback will be
provided).

@geindex restart_events() (in module sys.monitoring)
@anchor{library/sys monitoring sys monitoring restart_events}@anchor{4cb7}
@deffn {Function} sys.monitoring.restart_events () -> None

Enable all the events that were disabled by @ref{4cae,,sys.monitoring.DISABLE}
for all tools.
@end deffn

@node Registering callback functions,,Turning events on and off,sys monitoring — Execution event monitoring
@anchor{library/sys monitoring callbacks}@anchor{4c94}@anchor{library/sys monitoring registering-callback-functions}@anchor{4cb8}
@subsubsection Registering callback functions


@geindex register_callback() (in module sys.monitoring)
@anchor{library/sys monitoring sys monitoring register_callback}@anchor{4ac0}
@deffn {Function} sys.monitoring.register_callback (tool_id: int, event: int, func: Callable | None, /) -> Callable | None

Registers the callable `func' for the `event' with the given `tool_id'

If another callback was registered for the given `tool_id' and `event',
it is unregistered and returned.
Otherwise @code{register_callback()} returns @code{None}.

Raises an @ref{1cb1,,auditing event} @code{sys.monitoring.register_callback} with argument @code{func}.
@end deffn

Functions can be unregistered by calling
@code{sys.monitoring.register_callback(tool_id, event, None)}.

Callback functions can be registered and unregistered at any time.

Callbacks are called only once regardless if the event is turned on both
globally and locally. As such, if an event could be turned on for both global
and local events by your code then the callback needs to be written to handle
either trigger.

@menu
* Callback function arguments:: 

@end menu

@node Callback function arguments,,,Registering callback functions
@anchor{library/sys monitoring callback-function-arguments}@anchor{4cb9}
@subsubsection Callback function arguments


@geindex MISSING (in module sys.monitoring)
@anchor{library/sys monitoring sys monitoring MISSING}@anchor{4cba}
@deffn {Data} sys.monitoring.MISSING

A special value that is passed to a callback function to indicate
that there are no arguments to the call.
@end deffn

When an active event occurs, the registered callback function is called.
Callback functions returning an object other than @ref{4cae,,DISABLE} will have no effect.
Different events will provide the callback function with different arguments, as follows:


@itemize *

@item 
@ref{4ca1,,PY_START} and @ref{4c9f,,PY_RESUME}:

@example
func(code: CodeType, instruction_offset: int) -> object
@end example

@item 
@ref{4ca0,,PY_RETURN} and @ref{4ca3,,PY_YIELD}:

@example
func(code: CodeType, instruction_offset: int, retval: object) -> object
@end example

@item 
@ref{19ff,,CALL}, @ref{4c99,,C_RAISE} and @ref{4c9a,,C_RETURN}
(`arg0' can be @ref{4cba,,MISSING} specifically):

@example
func(code: CodeType, instruction_offset: int, callable: object, arg0: object) -> object
@end example

`code' represents the code object where the call is being made, while
`callable' is the object that is about to be called (and thus
triggered the event).
If there are no arguments, `arg0' is set to @ref{4cba,,sys.monitoring.MISSING}.

For instance methods, `callable' will be the function object as found on the
class with `arg0' set to the instance (i.e. the @code{self} argument to the
method).

@item 
@ref{19b8,,RAISE}, @ref{4ca5,,RERAISE}, @ref{4c9b,,EXCEPTION_HANDLED},
@ref{4ca2,,PY_UNWIND}, @ref{189e,,PY_THROW} and @ref{4ca4,,STOP_ITERATION}:

@example
func(code: CodeType, instruction_offset: int, exception: BaseException) -> object
@end example

@item 
@ref{4c9e,,LINE}:

@example
func(code: CodeType, line_number: int) -> object
@end example

@item 
@ref{297,,BRANCH_LEFT}, @ref{298,,BRANCH_RIGHT} and @ref{4c9d,,JUMP}:

@example
func(code: CodeType, instruction_offset: int, destination_offset: int) -> object
@end example

Note that the `destination_offset' is where the code will next execute.

@item 
@ref{4c9c,,INSTRUCTION}:

@example
func(code: CodeType, instruction_offset: int) -> object
@end example
@end itemize

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node sysconfig — Provide access to Python’s configuration information,builtins — Built-in objects,sys monitoring — Execution event monitoring,Python Runtime Services
@anchor{library/sysconfig doc}@anchor{4cbb}@anchor{library/sysconfig module-sysconfig}@anchor{e1}@anchor{library/sysconfig sysconfig-provide-access-to-python-s-configuration-information}@anchor{4cbc}@anchor{library/sysconfig translation-repo}@anchor{4cbd}
@subsection @code{sysconfig} — Provide access to Python’s configuration information


@geindex module; sysconfig


Added in version 3.2.


`Source code:' Lib/sysconfig@footnote{https://github.com/python/cpython/tree/3.14/Lib/sysconfig}

@geindex configuration information


__________________________________________________________________


The @code{sysconfig} module provides access to Python’s configuration
information like the list of installation paths and the configuration variables
relevant for the current platform.

@menu
* Configuration variables:: 
* Installation paths:: 
* User scheme:: 
* Home scheme:: 
* Prefix scheme:: 
* Installation path functions:: 
* Other functions: Other functions<3>. 
* Command-line usage: Command-line usage<6>. 

@end menu

@node Configuration variables,Installation paths,,sysconfig — Provide access to Python’s configuration information
@anchor{library/sysconfig configuration-variables}@anchor{4cbe}
@subsubsection Configuration variables


A Python distribution contains a @code{Makefile} and a @code{pyconfig.h}
header file that are necessary to build both the Python binary itself and
third-party C extensions compiled using @code{setuptools}.

@code{sysconfig} puts all variables found in these files in a dictionary that
can be accessed using @ref{29a,,get_config_vars()} or @ref{175,,get_config_var()}.

Notice that on Windows, it’s a much smaller set.

@geindex get_config_vars() (in module sysconfig)
@anchor{library/sysconfig sysconfig get_config_vars}@anchor{29a}
@deffn {Function} sysconfig.get_config_vars (*args)

With no arguments, return a dictionary of all configuration variables
relevant for the current platform.

With arguments, return a list of values that result from looking up each
argument in the configuration variable dictionary.

For each argument, if the value is not found, return @code{None}.
@end deffn

@geindex get_config_var() (in module sysconfig)
@anchor{library/sysconfig sysconfig get_config_var}@anchor{175}
@deffn {Function} sysconfig.get_config_var (name)

Return the value of a single variable `name'. Equivalent to
@code{get_config_vars().get(name)}.

If `name' is not found, return @code{None}.
@end deffn

Example of usage:

@example
>>> import sysconfig
>>> sysconfig.get_config_var('Py_ENABLE_SHARED')
0
>>> sysconfig.get_config_var('LIBDIR')
'/usr/local/lib'
>>> sysconfig.get_config_vars('AR', 'CXX')
['ar', 'g++']
@end example

@node Installation paths,User scheme,Configuration variables,sysconfig — Provide access to Python’s configuration information
@anchor{library/sysconfig id1}@anchor{4cbf}@anchor{library/sysconfig installation-paths}@anchor{447}
@subsubsection Installation paths


Python uses an installation scheme that differs depending on the platform and on
the installation options.  These schemes are stored in @code{sysconfig} under
unique identifiers based on the value returned by @ref{3073,,os.name}.
The schemes are used by package installers to determine where to copy files to.

Python currently supports nine schemes:


@itemize -

@item 
`posix_prefix': scheme for POSIX platforms like Linux or macOS.  This is
the default scheme used when Python or a component is installed.

@item 
`posix_home': scheme for POSIX platforms, when the `home' option is used.
This scheme defines paths located under a specific home prefix.

@item 
`posix_user': scheme for POSIX platforms, when the `user' option is used.
This scheme defines paths located under the user’s home directory
(@ref{1528,,site.USER_BASE}).

@item 
`posix_venv': scheme for @ref{118,,Python virtual environments} on POSIX
platforms; by default it is the same as `posix_prefix'.

@item 
`nt': scheme for Windows.
This is the default scheme used when Python or a component is installed.

@item 
`nt_user': scheme for Windows, when the `user' option is used.

@item 
`nt_venv': scheme for @ref{118,,Python virtual environments} on Windows;
by default it is the same as `nt'.

@item 
`venv': a scheme with values from either `posix_venv' or `nt_venv' depending
on the platform Python runs on.

@item 
`osx_framework_user': scheme for macOS, when the `user' option is used.
@end itemize

Each scheme is itself composed of a series of paths and each path has a unique
identifier.  Python currently uses eight paths:


@itemize -

@item 
`stdlib': directory containing the standard Python library files that are not
platform-specific.

@item 
`platstdlib': directory containing the standard Python library files that are
platform-specific.

@item 
`platlib': directory for site-specific, platform-specific files.

@item 
`purelib': directory for site-specific, non-platform-specific files (‘pure’ Python).

@item 
`include': directory for non-platform-specific header files for
the Python C-API.

@item 
`platinclude': directory for platform-specific header files for
the Python C-API.

@item 
`scripts': directory for script files.

@item 
`data': directory for data files.
@end itemize

@node User scheme,Home scheme,Installation paths,sysconfig — Provide access to Python’s configuration information
@anchor{library/sysconfig sysconfig-user-scheme}@anchor{217a}@anchor{library/sysconfig user-scheme}@anchor{4cc0}
@subsubsection User scheme


This scheme is designed to be the most convenient solution for users that don’t
have write permission to the global site-packages directory or don’t want to
install into it.

Files will be installed into subdirectories of @ref{1528,,site.USER_BASE} (written
as @code{`userbase'} hereafter).  This scheme installs pure Python modules and
extension modules in the same location (also known as @ref{2169,,site.USER_SITE}).

@menu
* posix_user:: 
* nt_user:: 
* osx_framework_user:: 

@end menu

@node posix_user,nt_user,,User scheme
@anchor{library/sysconfig posix-user}@anchor{4cc1}
@subsubsection @code{posix_user}



@multitable {xxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Path

@tab

Installation directory

@item

`stdlib'

@tab

@code{`userbase'/lib/python`X.Y'}

@item

`platstdlib'

@tab

@code{`userbase'/lib/python`X.Y'}

@item

`platlib'

@tab

@code{`userbase'/lib/python`X.Y'/site-packages}

@item

`purelib'

@tab

@code{`userbase'/lib/python`X.Y'/site-packages}

@item

`include'

@tab

@code{`userbase'/include/python`X.Y'}

@item

`scripts'

@tab

@code{`userbase'/bin}

@item

`data'

@tab

@code{`userbase'}

@end multitable


@node nt_user,osx_framework_user,posix_user,User scheme
@anchor{library/sysconfig nt-user}@anchor{4cc2}
@subsubsection @code{nt_user}



@multitable {xxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Path

@tab

Installation directory

@item

`stdlib'

@tab

@code{`userbase'\Python`XY'}

@item

`platstdlib'

@tab

@code{`userbase'\Python`XY'}

@item

`platlib'

@tab

@code{`userbase'\Python`XY'\site-packages}

@item

`purelib'

@tab

@code{`userbase'\Python`XY'\site-packages}

@item

`include'

@tab

@code{`userbase'\Python`XY'\Include}

@item

`scripts'

@tab

@code{`userbase'\Python`XY'\Scripts}

@item

`data'

@tab

@code{`userbase'}

@end multitable


@node osx_framework_user,,nt_user,User scheme
@anchor{library/sysconfig osx-framework-user}@anchor{4cc3}
@subsubsection @code{osx_framework_user}



@multitable {xxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Path

@tab

Installation directory

@item

`stdlib'

@tab

@code{`userbase'/lib/python}

@item

`platstdlib'

@tab

@code{`userbase'/lib/python}

@item

`platlib'

@tab

@code{`userbase'/lib/python/site-packages}

@item

`purelib'

@tab

@code{`userbase'/lib/python/site-packages}

@item

`include'

@tab

@code{`userbase'/include/python`X.Y'}

@item

`scripts'

@tab

@code{`userbase'/bin}

@item

`data'

@tab

@code{`userbase'}

@end multitable


@node Home scheme,Prefix scheme,User scheme,sysconfig — Provide access to Python’s configuration information
@anchor{library/sysconfig home-scheme}@anchor{4cc4}@anchor{library/sysconfig sysconfig-home-scheme}@anchor{4cc5}
@subsubsection Home scheme


The idea behind the “home scheme” is that you build and maintain a personal
stash of Python modules.  This scheme’s name is derived from the idea of a
“home” directory on Unix, since it’s not unusual for a Unix user to make their
home directory have a layout similar to @code{/usr/} or @code{/usr/local/}.
This scheme can be used by anyone, regardless of the operating system they
are installing for.

@menu
* posix_home:: 

@end menu

@node posix_home,,,Home scheme
@anchor{library/sysconfig posix-home}@anchor{4cc6}
@subsubsection @code{posix_home}



@multitable {xxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Path

@tab

Installation directory

@item

`stdlib'

@tab

@code{`home'/lib/python}

@item

`platstdlib'

@tab

@code{`home'/lib/python}

@item

`platlib'

@tab

@code{`home'/lib/python}

@item

`purelib'

@tab

@code{`home'/lib/python}

@item

`include'

@tab

@code{`home'/include/python}

@item

`platinclude'

@tab

@code{`home'/include/python}

@item

`scripts'

@tab

@code{`home'/bin}

@item

`data'

@tab

@code{`home'}

@end multitable


@node Prefix scheme,Installation path functions,Home scheme,sysconfig — Provide access to Python’s configuration information
@anchor{library/sysconfig prefix-scheme}@anchor{4cc7}@anchor{library/sysconfig sysconfig-prefix-scheme}@anchor{4cc8}
@subsubsection Prefix scheme


The “prefix scheme” is useful when you wish to use one Python installation to
perform the build/install (i.e., to run the setup script), but install modules
into the third-party module directory of a different Python installation (or
something that looks like a different Python installation).  If this sounds a
trifle unusual, it is—that’s why the user and home schemes come before.  However,
there are at least two known cases where the prefix scheme will be useful.

First, consider that many Linux distributions put Python in @code{/usr}, rather
than the more traditional @code{/usr/local}.  This is entirely appropriate,
since in those cases Python is part of “the system” rather than a local add-on.
However, if you are installing Python modules from source, you probably want
them to go in @code{/usr/local/lib/python2.`X'} rather than
@code{/usr/lib/python2.`X'}.

Another possibility is a network filesystem where the name used to write to a
remote directory is different from the name used to read it: for example, the
Python interpreter accessed as @code{/usr/local/bin/python} might search for
modules in @code{/usr/local/lib/python2.`X'}, but those modules would have to
be installed to, say, @code{/mnt/`@@server'/export/lib/python2.`X'}.

@menu
* posix_prefix:: 
* nt:: 

@end menu

@node posix_prefix,nt,,Prefix scheme
@anchor{library/sysconfig posix-prefix}@anchor{4cc9}
@subsubsection @code{posix_prefix}



@multitable {xxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Path

@tab

Installation directory

@item

`stdlib'

@tab

@code{`prefix'/lib/python`X.Y'}

@item

`platstdlib'

@tab

@code{`prefix'/lib/python`X.Y'}

@item

`platlib'

@tab

@code{`prefix'/lib/python`X.Y'/site-packages}

@item

`purelib'

@tab

@code{`prefix'/lib/python`X.Y'/site-packages}

@item

`include'

@tab

@code{`prefix'/include/python`X.Y'}

@item

`platinclude'

@tab

@code{`prefix'/include/python`X.Y'}

@item

`scripts'

@tab

@code{`prefix'/bin}

@item

`data'

@tab

@code{`prefix'}

@end multitable


@node nt,,posix_prefix,Prefix scheme
@anchor{library/sysconfig nt}@anchor{4cca}
@subsubsection @code{nt}



@multitable {xxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Path

@tab

Installation directory

@item

`stdlib'

@tab

@code{`prefix'\Lib}

@item

`platstdlib'

@tab

@code{`prefix'\Lib}

@item

`platlib'

@tab

@code{`prefix'\Lib\site-packages}

@item

`purelib'

@tab

@code{`prefix'\Lib\site-packages}

@item

`include'

@tab

@code{`prefix'\Include}

@item

`platinclude'

@tab

@code{`prefix'\Include}

@item

`scripts'

@tab

@code{`prefix'\Scripts}

@item

`data'

@tab

@code{`prefix'}

@end multitable


@node Installation path functions,Other functions<3>,Prefix scheme,sysconfig — Provide access to Python’s configuration information
@anchor{library/sysconfig installation-path-functions}@anchor{4ccb}
@subsubsection Installation path functions


@code{sysconfig} provides some functions to determine these installation paths.

@geindex get_scheme_names() (in module sysconfig)
@anchor{library/sysconfig sysconfig get_scheme_names}@anchor{4ccc}
@deffn {Function} sysconfig.get_scheme_names ()

Return a tuple containing all schemes currently supported in
@code{sysconfig}.
@end deffn

@geindex get_default_scheme() (in module sysconfig)
@anchor{library/sysconfig sysconfig get_default_scheme}@anchor{1bf8}
@deffn {Function} sysconfig.get_default_scheme ()

Return the default scheme name for the current platform.


Added in version 3.10: This function was previously named @code{_get_default_scheme()} and
considered an implementation detail.



Changed in version 3.11: When Python runs from a virtual environment,
the `venv' scheme is returned.

@end deffn

@geindex get_preferred_scheme() (in module sysconfig)
@anchor{library/sysconfig sysconfig get_preferred_scheme}@anchor{8a1}
@deffn {Function} sysconfig.get_preferred_scheme (key)

Return a preferred scheme name for an installation layout specified by `key'.

`key' must be either @code{"prefix"}, @code{"home"}, or @code{"user"}.

The return value is a scheme name listed in @ref{4ccc,,get_scheme_names()}. It
can be passed to @code{sysconfig} functions that take a `scheme' argument,
such as @ref{33e,,get_paths()}.


Added in version 3.10.



Changed in version 3.11: When Python runs from a virtual environment and @code{key="prefix"},
the `venv' scheme is returned.

@end deffn

@geindex _get_preferred_schemes() (in module sysconfig)
@anchor{library/sysconfig sysconfig _get_preferred_schemes}@anchor{4ccd}
@deffn {Function} sysconfig._get_preferred_schemes ()

Return a dict containing preferred scheme names on the current platform.
Python implementers and redistributors may add their preferred schemes to
the @code{_INSTALL_SCHEMES} module-level global value, and modify this function
to return those scheme names, to e.g. provide different schemes for system
and language package managers to use, so packages installed by either do not
mix with those by the other.

End users should not use this function, but @ref{1bf8,,get_default_scheme()} and
@ref{8a1,,get_preferred_scheme()} instead.


Added in version 3.10.

@end deffn

@geindex get_path_names() (in module sysconfig)
@anchor{library/sysconfig sysconfig get_path_names}@anchor{4cce}
@deffn {Function} sysconfig.get_path_names ()

Return a tuple containing all path names currently supported in
@code{sysconfig}.
@end deffn

@geindex get_path() (in module sysconfig)
@anchor{library/sysconfig sysconfig get_path}@anchor{1539}
@deffn {Function} sysconfig.get_path (name[, scheme[, vars[, expand]]])

Return an installation path corresponding to the path `name', from the
install scheme named `scheme'.

`name' has to be a value from the list returned by @ref{4cce,,get_path_names()}.

@code{sysconfig} stores installation paths corresponding to each path name,
for each platform, with variables to be expanded.  For instance the `stdlib'
path for the `nt' scheme is: @code{@{base@}/Lib}.

@code{get_path()} will use the variables returned by @ref{29a,,get_config_vars()}
to expand the path.  All variables have default values for each platform so
one may call this function and get the default value.

If `scheme' is provided, it must be a value from the list returned by
@ref{4ccc,,get_scheme_names()}.  Otherwise, the default scheme for the current
platform is used.

If `vars' is provided, it must be a dictionary of variables that will update
the dictionary returned by @ref{29a,,get_config_vars()}.

If `expand' is set to @code{False}, the path will not be expanded using the
variables.

If `name' is not found, raise a @ref{5e7,,KeyError}.
@end deffn

@geindex get_paths() (in module sysconfig)
@anchor{library/sysconfig sysconfig get_paths}@anchor{33e}
@deffn {Function} sysconfig.get_paths ([scheme[, vars[, expand]]])

Return a dictionary containing all installation paths corresponding to an
installation scheme. See @ref{1539,,get_path()} for more information.

If `scheme' is not provided, will use the default scheme for the current
platform.

If `vars' is provided, it must be a dictionary of variables that will
update the dictionary used to expand the paths.

If `expand' is set to false, the paths will not be expanded.

If `scheme' is not an existing scheme, @code{get_paths()} will raise a
@ref{5e7,,KeyError}.
@end deffn

@node Other functions<3>,Command-line usage<6>,Installation path functions,sysconfig — Provide access to Python’s configuration information
@anchor{library/sysconfig other-functions}@anchor{4ccf}
@subsubsection Other functions


@geindex get_python_version() (in module sysconfig)
@anchor{library/sysconfig sysconfig get_python_version}@anchor{144f}
@deffn {Function} sysconfig.get_python_version ()

Return the @code{MAJOR.MINOR} Python version number as a string.  Similar to
@code{'%d.%d' % sys.version_info[:2]}.
@end deffn

@geindex get_platform() (in module sysconfig)
@anchor{library/sysconfig sysconfig get_platform}@anchor{144e}
@deffn {Function} sysconfig.get_platform ()

Return a string that identifies the current platform.

This is used mainly to distinguish platform-specific build directories and
platform-specific built distributions.  Typically includes the OS name and
version and the architecture (as supplied by @ref{1322,,os.uname()}), although the
exact information included depends on the OS; e.g., on Linux, the kernel
version isn’t particularly important.

Examples of returned values:

Windows:


@itemize -

@item 
win-amd64 (64-bit Windows on AMD64, aka x86_64, Intel64, and EM64T)

@item 
win-arm64 (64-bit Windows on ARM64, aka AArch64)

@item 
win32 (all others - specifically, sys.platform is returned)
@end itemize

POSIX based OS:


@itemize -

@item 
linux-x86_64

@item 
macosx-15.5-arm64

@item 
macosx-26.0-universal2 (macOS on Apple Silicon or Intel)

@item 
android-24-arm64_v8a
@end itemize

For other non-POSIX platforms, currently just returns @ref{293,,sys.platform}.
@end deffn

@geindex is_python_build() (in module sysconfig)
@anchor{library/sysconfig sysconfig is_python_build}@anchor{32b}
@deffn {Function} sysconfig.is_python_build ()

Return @code{True} if the running Python interpreter was built from source and
is being run from its built location, and not from a location resulting from
e.g. running @code{make install} or installing via a binary installer.
@end deffn

@geindex parse_config_h() (in module sysconfig)
@anchor{library/sysconfig sysconfig parse_config_h}@anchor{4cd0}
@deffn {Function} sysconfig.parse_config_h (fp[, vars])

Parse a @code{config.h}-style file.

`fp' is a file-like object pointing to the @code{config.h}-like file.

A dictionary containing name/value pairs is returned.  If an optional
dictionary is passed in as the second argument, it is used instead of a new
dictionary, and updated with the values read in the file.
@end deffn

@geindex get_config_h_filename() (in module sysconfig)
@anchor{library/sysconfig sysconfig get_config_h_filename}@anchor{4cd1}
@deffn {Function} sysconfig.get_config_h_filename ()

Return the path of @code{pyconfig.h}.
@end deffn

@geindex get_makefile_filename() (in module sysconfig)
@anchor{library/sysconfig sysconfig get_makefile_filename}@anchor{4cd2}
@deffn {Function} sysconfig.get_makefile_filename ()

Return the path of @code{Makefile}.
@end deffn
@anchor{library/sysconfig sysconfig-cli}@anchor{4cd3}
@node Command-line usage<6>,,Other functions<3>,sysconfig — Provide access to Python’s configuration information
@anchor{library/sysconfig command-line-usage}@anchor{4cd4}@anchor{library/sysconfig using-sysconfig-as-a-script}@anchor{4cd5}
@subsubsection Command-line usage


You can use @code{sysconfig} as a script with Python’s `-m' option:

@example
$ python -m sysconfig
Platform: "macosx-10.4-i386"
Python version: "3.2"
Current installation scheme: "posix_prefix"

Paths:
        data = "/usr/local"
        include = "/Users/tarek/Dev/svn.python.org/py3k/Include"
        platinclude = "."
        platlib = "/usr/local/lib/python3.2/site-packages"
        platstdlib = "/usr/local/lib/python3.2"
        purelib = "/usr/local/lib/python3.2/site-packages"
        scripts = "/usr/local/bin"
        stdlib = "/usr/local/lib/python3.2"

Variables:
        AC_APPLE_UNIVERSAL_BUILD = "0"
        AIX_GENUINE_CPLUSPLUS = "0"
        AR = "ar"
        ARFLAGS = "rc"
        ...
@end example

This call will print in the standard output the information returned by
@ref{144e,,get_platform()}, @ref{144f,,get_python_version()}, @ref{1539,,get_path()} and
@ref{29a,,get_config_vars()}.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node builtins — Built-in objects,__main__ — Top-level code environment,sysconfig — Provide access to Python’s configuration information,Python Runtime Services
@anchor{library/builtins doc}@anchor{4cd6}@anchor{library/builtins builtins-built-in-objects}@anchor{4cd7}@anchor{library/builtins module-builtins}@anchor{13}@anchor{library/builtins translation-repo}@anchor{4cd8}
@subsection @code{builtins} — Built-in objects


@geindex module; builtins


__________________________________________________________________


This module provides direct access to all ‘built-in’ identifiers of Python; for
example, @code{builtins.open} is the full name for the built-in function @ref{318,,open()}.

This module is not normally accessed explicitly by most applications, but can be
useful in modules that provide objects with the same name as a built-in value,
but in which the built-in of that name is also needed.  For example, in a module
that wants to implement an @ref{318,,open()} function that wraps the built-in
@code{open()}, this module can be used directly:

@example
import builtins

def open(path):
    f = builtins.open(path, 'r')
    return UpperCaser(f)

class UpperCaser:
    '@w{'}'Wrapper around a file that converts output to uppercase.'@w{'}'

    def __init__(self, f):
        self._f = f

    def read(self, count=-1):
        return self._f.read(count).upper()

    # ...
@end example

As an implementation detail, most modules have the name @code{__builtins__} made
available as part of their globals.  The value of @code{__builtins__} is normally
either this module or the value of this module’s @ref{77e,,__dict__} attribute.
Since this is an implementation detail, it may not be used by alternate
implementations of Python.


@subsubheading See also



@itemize *

@item 
@ref{24be,,Built-in Constants}

@item 
@ref{1c6a,,Built-in Exceptions}

@item 
@ref{1468,,Built-in Functions}

@item 
@ref{2631,,Built-in Types}
@end itemize


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node __main__ — Top-level code environment,warnings — Warning control,builtins — Built-in objects,Python Runtime Services
@anchor{library/__main__ doc}@anchor{4cd9}@anchor{library/__main__ main-top-level-code-environment}@anchor{4cda}@anchor{library/__main__ module-__main__}@anchor{1}@anchor{library/__main__ translation-repo}@anchor{4cdb}
@subsection @code{__main__} — Top-level code environment


@geindex module; __main__


__________________________________________________________________


In Python, the special name @code{__main__} is used for two important constructs:


@enumerate 

@item 
the name of the top-level environment of the program, which can be
checked using the @code{__name__ == '__main__'} expression; and

@item 
the @code{__main__.py} file in Python packages.
@end enumerate

Both of these mechanisms are related to Python modules; how users interact with
them and how they interact with each other.  They are explained in detail
below.  If you’re new to Python modules, see the tutorial section
@ref{2082,,Modules} for an introduction.

@menu
* __name__ == '__main__':: 
* __main__.py in Python Packages: __main__ py in Python Packages. 
* import __main__:: 

@end menu

@node __name__ == '__main__',__main__ py in Python Packages,,__main__ — Top-level code environment
@anchor{library/__main__ name-equals-main}@anchor{4cdc}@anchor{library/__main__ name-main}@anchor{4cdd}
@subsubsection @code{__name__ == '__main__'}


When a Python module or package is imported, @code{__name__} is set to the
module’s name.  Usually, this is the name of the Python file itself without the
@code{.py} extension:

@example
>>> import configparser
>>> configparser.__name__
'configparser'
@end example

If the file is part of a package, @code{__name__} will also include the parent
package’s path:

@example
>>> from concurrent.futures import process
>>> process.__name__
'concurrent.futures.process'
@end example

However, if the module is executed in the top-level code environment,
its @code{__name__} is set to the string @code{'__main__'}.

@menu
* What is the “top-level code environment”?:: 
* Idiomatic Usage:: 
* Packaging Considerations:: 

@end menu

@node What is the “top-level code environment”?,Idiomatic Usage,,__name__ == '__main__'
@anchor{library/__main__ what-is-the-top-level-code-environment}@anchor{4cde}
@subsubsection What is the “top-level code environment”?


@code{__main__} is the name of the environment where top-level code is run.
“Top-level code” is the first user-specified Python module that starts running.
It’s “top-level” because it imports all other modules that the program needs.
Sometimes “top-level code” is called an `entry point' to the application.

The top-level code environment can be:


@itemize *

@item 
the scope of an interactive prompt:

@example
>>> __name__
'__main__'
@end example

@item 
the Python module passed to the Python interpreter as a file argument:

@example
$ python helloworld.py
Hello, world!
@end example

@item 
the Python module or package passed to the Python interpreter with the
@ref{23e,,-m} argument:

@example
$ python -m tarfile
usage: tarfile.py [-h] [-v] (...)
@end example

@item 
Python code read by the Python interpreter from standard input:

@example
$ echo "import this" | python
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
...
@end example

@item 
Python code passed to the Python interpreter with the @ref{1a9,,-c} argument:

@example
$ python -c "import this"
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
...
@end example
@end itemize

In each of these situations, the top-level module’s @code{__name__} is set to
@code{'__main__'}.

As a result, a module can discover whether or not it is running in the
top-level environment by checking its own @code{__name__}, which allows a common
idiom for conditionally executing code when the module is not initialized from
an import statement:

@example
if __name__ == '__main__':
    # Execute when the module is not initialized from an import statement.
    ...
@end example


@subsubheading See also


For a more detailed look at how @code{__name__} is set in all situations, see
the tutorial section @ref{2082,,Modules}.


@node Idiomatic Usage,Packaging Considerations,What is the “top-level code environment”?,__name__ == '__main__'
@anchor{library/__main__ idiomatic-usage}@anchor{4cdf}
@subsubsection Idiomatic Usage


Some modules contain code that is intended for script use only, like parsing
command-line arguments or fetching data from standard input.  If a module
like this was imported from a different module, for example to unit test
it, the script code would unintentionally execute as well.

This is where using the @code{if __name__ == '__main__'} code block comes in
handy. Code within this block won’t run unless the module is executed in the
top-level environment.

Putting as few statements as possible in the block below @code{if __name__ ==
'__main__'} can improve code clarity and correctness. Most often, a function
named @code{main} encapsulates the program’s primary behavior:

@example
# echo.py

import shlex
import sys

def echo(phrase: str) -> None:
   """A dummy wrapper around print."""
   # for demonstration purposes, you can imagine that there is some
   # valuable and reusable logic inside this function
   print(phrase)

def main() -> int:
    """Echo the input arguments to standard output"""
    phrase = shlex.join(sys.argv)
    echo(phrase)
    return 0

if __name__ == '__main__':
    sys.exit(main())  # next section explains the use of sys.exit
@end example

Note that if the module didn’t encapsulate code inside the @code{main} function
but instead put it directly within the @code{if __name__ == '__main__'} block,
the @code{phrase} variable would be global to the entire module.  This is
error-prone as other functions within the module could be unintentionally using
the global variable instead of a local name.  A @code{main} function solves this
problem.

Using a @code{main} function has the added benefit of the @code{echo} function itself
being isolated and importable elsewhere. When @code{echo.py} is imported, the
@code{echo} and @code{main} functions will be defined, but neither of them will be
called, because @code{__name__ != '__main__'}.

@node Packaging Considerations,,Idiomatic Usage,__name__ == '__main__'
@anchor{library/__main__ packaging-considerations}@anchor{4ce0}
@subsubsection Packaging Considerations


@code{main} functions are often used to create command-line tools by specifying
them as entry points for console scripts.  When this is done,
pip@footnote{https://pip.pypa.io/} inserts the function call into a template script,
where the return value of @code{main} is passed into @ref{279,,sys.exit()}.
For example:

@example
sys.exit(main())
@end example

Since the call to @code{main} is wrapped in @ref{279,,sys.exit()}, the expectation is
that your function will return some value acceptable as an input to
@code{sys.exit()}; typically, an integer or @code{None} (which is implicitly
returned if your function does not have a return statement).

By proactively following this convention ourselves, our module will have the
same behavior when run directly (i.e. @code{python echo.py}) as it will have if
we later package it as a console script entry-point in a pip-installable
package.

In particular, be careful about returning strings from your @code{main} function.
@ref{279,,sys.exit()} will interpret a string argument as a failure message, so
your program will have an exit code of @code{1}, indicating failure, and the
string will be written to @ref{b39,,sys.stderr}.  The @code{echo.py} example from
earlier exemplifies using the @code{sys.exit(main())} convention.


@subsubheading See also


Python Packaging User Guide@footnote{https://packaging.python.org/}
contains a collection of tutorials and references on how to distribute and
install Python packages with modern tools.


@node __main__ py in Python Packages,import __main__,__name__ == '__main__',__main__ — Top-level code environment
@anchor{library/__main__ main-py-in-python-packages}@anchor{4ce1}
@subsubsection @code{__main__.py} in Python Packages


If you are not familiar with Python packages, see section @ref{2092,,Packages}
of the tutorial.  Most commonly, the @code{__main__.py} file is used to provide
a command-line interface for a package. Consider the following hypothetical
package, “bandclass”:

@example
bandclass
  ├── __init__.py
  ├── __main__.py
  └── student.py
@end example

@code{__main__.py} will be executed when the package itself is invoked
directly from the command line using the @ref{23e,,-m} flag. For example:

@example
$ python -m bandclass
@end example

This command will cause @code{__main__.py} to run. How you utilize this mechanism
will depend on the nature of the package you are writing, but in this
hypothetical case, it might make sense to allow the teacher to search for
students:

@example
# bandclass/__main__.py

import sys
from .student import search_students

student_name = sys.argv[1] if len(sys.argv) >= 2 else '@w{'}
print(f'Found student: @{search_students(student_name)@}')
@end example

Note that @code{from .student import search_students} is an example of a relative
import.  This import style can be used when referencing modules within a
package.  For more details, see @ref{2096,,Intra-package References} in the
@ref{2082,,Modules} section of the tutorial.

@menu
* Idiomatic Usage: Idiomatic Usage<2>. 

@end menu

@node Idiomatic Usage<2>,,,__main__ py in Python Packages
@anchor{library/__main__ id1}@anchor{4ce2}
@subsubsection Idiomatic Usage


The content of @code{__main__.py} typically isn’t fenced with an
@code{if __name__ == '__main__'} block.  Instead, those files are kept
short and import functions to execute from other modules.  Those other modules can then be
easily unit-tested and are properly reusable.

If used, an @code{if __name__ == '__main__'} block will still work as expected
for a @code{__main__.py} file within a package, because its @code{__name__}
attribute will include the package’s path if imported:

@example
>>> import asyncio.__main__
>>> asyncio.__main__.__name__
'asyncio.__main__'
@end example

This won’t work for @code{__main__.py} files in the root directory of a
@code{.zip} file though.  Hence, for consistency, a minimal @code{__main__.py}
without a @code{__name__} check is preferred.


@subsubheading See also


See @ref{118,,venv} for an example of a package with a minimal @code{__main__.py}
in the standard library. It doesn’t contain a @code{if __name__ == '__main__'}
block. You can invoke it with @code{python -m venv [directory]}.

See @ref{c3,,runpy} for more details on the @ref{23e,,-m} flag to the
interpreter executable.

See @ref{137,,zipapp} for how to run applications packaged as `.zip' files. In
this case Python looks for a @code{__main__.py} file in the root directory of
the archive.


@node import __main__,,__main__ py in Python Packages,__main__ — Top-level code environment
@anchor{library/__main__ import-main}@anchor{4ce3}
@subsubsection @code{import __main__}


Regardless of which module a Python program was started with, other modules
running within that same program can import the top-level environment’s scope
(@ref{2083,,namespace}) by importing the @code{__main__} module.  This doesn’t import
a @code{__main__.py} file but rather whichever module that received the special
name @code{'__main__'}.

Here is an example module that consumes the @code{__main__} namespace:

@example
# namely.py

import __main__

def did_user_define_their_name():
    return 'my_name' in dir(__main__)

def print_user_name():
    if not did_user_define_their_name():
        raise ValueError('Define the variable `my_name`!')

    print(__main__.my_name)
@end example

Example usage of this module could be as follows:

@example
# start.py

import sys

from namely import print_user_name

# my_name = "Dinsdale"

def main():
    try:
        print_user_name()
    except ValueError as ve:
        return str(ve)

if __name__ == "__main__":
    sys.exit(main())
@end example

Now, if we started our program, the result would look like this:

@example
$ python start.py
Define the variable `my_name`!
@end example

The exit code of the program would be 1, indicating an error. Uncommenting the
line with @code{my_name = "Dinsdale"} fixes the program and now it exits with
status code 0, indicating success:

@example
$ python start.py
Dinsdale
@end example

Note that importing @code{__main__} doesn’t cause any issues with unintentionally
running top-level code meant for script use which is put in the
@code{if __name__ == "__main__"} block of the @code{start} module. Why does this work?

Python inserts an empty @code{__main__} module in @ref{1771,,sys.modules} at
interpreter startup, and populates it by running top-level code. In our example
this is the @code{start} module which runs line by line and imports @code{namely}.
In turn, @code{namely} imports @code{__main__} (which is really @code{start}). That’s an
import cycle! Fortunately, since the partially populated @code{__main__}
module is present in @code{sys.modules}, Python passes that to @code{namely}.
See @ref{24a6,,Special considerations for __main__} in the
import system’s reference for details on how this works.

The Python REPL is another example of a “top-level environment”, so anything
defined in the REPL becomes part of the @code{__main__} scope:

@example
>>> import namely
>>> namely.did_user_define_their_name()
False
>>> namely.print_user_name()
Traceback (most recent call last):
...
ValueError: Define the variable `my_name`!
>>> my_name = 'Jabberwocky'
>>> namely.did_user_define_their_name()
True
>>> namely.print_user_name()
Jabberwocky
@end example

The @code{__main__} scope is used in the implementation of @ref{aa,,pdb} and
@ref{c2,,rlcompleter}.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node warnings — Warning control,dataclasses — Data Classes,__main__ — Top-level code environment,Python Runtime Services
@anchor{library/warnings doc}@anchor{4ce4}@anchor{library/warnings module-warnings}@anchor{119}@anchor{library/warnings translation-repo}@anchor{4ce5}@anchor{library/warnings warnings-warning-control}@anchor{4ce6}
@subsection @code{warnings} — Warning control


@geindex module; warnings

`Source code:' Lib/warnings.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/warnings.py}

@geindex warnings


__________________________________________________________________


Warning messages are typically issued in situations where it is useful to alert
the user of some condition in a program, where that condition (normally) doesn’t
warrant raising an exception and terminating the program.  For example, one
might want to issue a warning when a program uses an obsolete module.

Python programmers issue warnings by calling the @ref{1725,,warn()} function defined
in this module.  (C programmers use @ref{1658,,PyErr_WarnEx()}; see
@ref{4ce7,,Exception Handling} for details).

Warning messages are normally written to @ref{b39,,sys.stderr}, but their disposition
can be changed flexibly, from ignoring all warnings to turning them into
exceptions.  The disposition of warnings can vary based on the @ref{275a,,warning category}, the text of the warning message, and the source location where it
is issued.  Repetitions of a particular warning for the same source location are
typically suppressed.

There are two stages in warning control: first, each time a warning is issued, a
determination is made whether a message should be issued or not; next, if a
message is to be issued, it is formatted and printed using a user-settable hook.

The determination whether to issue a warning message is controlled by the
@ref{1b2,,warning filter}, which is a sequence of matching rules and actions. Rules can be
added to the filter by calling @ref{16b5,,filterwarnings()} and reset to its default
state by calling @ref{4ce8,,resetwarnings()}.

The printing of warning messages is done by calling @ref{4ce9,,showwarning()}, which
may be overridden; the default implementation of this function formats the
message by calling @ref{1e3b,,formatwarning()}, which is also available for use by
custom implementations.


@subsubheading See also


@ref{3217,,logging.captureWarnings()} allows you to handle all warnings with
the standard logging infrastructure.


@menu
* Warning Categories:: 
* The Warnings Filter:: 
* Temporarily Suppressing Warnings:: 
* Testing Warnings:: 
* Updating Code For New Versions of Dependencies:: 
* Available Functions:: 
* Available Context Managers:: 
* Concurrent safety of Context Managers:: 

@end menu

@node Warning Categories,The Warnings Filter,,warnings — Warning control
@anchor{library/warnings id1}@anchor{4cea}@anchor{library/warnings warning-categories}@anchor{275a}
@subsubsection Warning Categories


There are a number of built-in exceptions that represent warning categories.
This categorization is useful to be able to filter out groups of warnings.

While these are technically
@ref{2758,,built-in exceptions}, they are
documented here, because conceptually they belong to the warnings mechanism.

User code can define additional warning categories by subclassing one of the
standard warning categories.  A warning category must always be a subclass of
the @ref{275b,,Warning} class.

The following warnings category classes are currently defined:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Class

@tab

Description

@item

@ref{275b,,Warning}

@tab

This is the base class of all warning
category classes.  It is a subclass of
@ref{bd3,,Exception}.

@item

@ref{275c,,UserWarning}

@tab

The default category for @ref{1725,,warn()}.

@item

@ref{1a4,,DeprecationWarning}

@tab

Base category for warnings about deprecated
features when those warnings are intended for
other Python developers (ignored by default,
unless triggered by code in @code{__main__}).

@item

@ref{1af,,SyntaxWarning}

@tab

Base category for warnings about dubious
syntactic features (typically emitted when
compiling Python source code, and hence
may not be suppressed by runtime filters)

@item

@ref{4d8,,RuntimeWarning}

@tab

Base category for warnings about dubious
runtime features.

@item

@ref{659,,FutureWarning}

@tab

Base category for warnings about deprecated
features when those warnings are intended for
end users of applications that are written in
Python.

@item

@ref{acc,,PendingDeprecationWarning}

@tab

Base category for warnings about features
that will be deprecated in the future
(ignored by default).

@item

@ref{71f,,ImportWarning}

@tab

Base category for warnings triggered during
the process of importing a module (ignored by
default).

@item

@ref{1630,,UnicodeWarning}

@tab

Base category for warnings related to
Unicode.

@item

@ref{e22,,BytesWarning}

@tab

Base category for warnings related to
@ref{193,,bytes} and @ref{342,,bytearray}.

@item

@ref{54d,,ResourceWarning}

@tab

Base category for warnings related to
resource usage (ignored by default).

@end multitable



Changed in version 3.7: Previously @ref{1a4,,DeprecationWarning} and @ref{659,,FutureWarning} were
distinguished based on whether a feature was being removed entirely or
changing its behaviour. They are now distinguished based on their
intended audience and the way they’re handled by the default warnings
filters.


@node The Warnings Filter,Temporarily Suppressing Warnings,Warning Categories,warnings — Warning control
@anchor{library/warnings the-warnings-filter}@anchor{4ceb}@anchor{library/warnings warning-filter}@anchor{1b2}
@subsubsection The Warnings Filter


The warnings filter controls whether warnings are ignored, displayed, or turned
into errors (raising an exception).

Conceptually, the warnings filter maintains an ordered list of filter
specifications; any specific warning is matched against each filter
specification in the list in turn until a match is found; the filter determines
the disposition of the match.  Each entry is a tuple of the form (`action',
`message', `category', `module', `lineno'), where:


@itemize *

@item 
`action' is one of the following strings:


@multitable {xxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Value

@tab

Disposition

@item

@code{"default"}

@tab

print the first occurrence of matching
warnings for each location (module +
line number) where the warning is issued

@item

@code{"error"}

@tab

turn matching warnings into exceptions

@item

@code{"ignore"}

@tab

never print matching warnings

@item

@code{"always"}

@tab

always print matching warnings

@item

@code{"all"}

@tab

alias to “always”

@item

@code{"module"}

@tab

print the first occurrence of matching
warnings for each module where the warning
is issued (regardless of line number)

@item

@code{"once"}

@tab

print only the first occurrence of matching
warnings, regardless of location

@end multitable


@item 
`message' is a string containing a regular expression that the start of
the warning message must match, case-insensitively.  In @ref{acb,,-W} and
@geindex PYTHONWARNINGS
@geindex environment variable; PYTHONWARNINGS
@ref{da9,,PYTHONWARNINGS}, `message' is a literal string that the start of the
warning message must contain (case-insensitively), ignoring any whitespace at
the start or end of `message'.

@item 
`category' is a class (a subclass of @ref{275b,,Warning}) of which the warning
category must be a subclass in order to match.

@item 
`module' is a string containing a regular expression that the start of the
fully qualified module name must match, case-sensitively.  In @ref{acb,,-W} and
@geindex PYTHONWARNINGS
@geindex environment variable; PYTHONWARNINGS
@ref{da9,,PYTHONWARNINGS}, `module' is a literal string that the
fully qualified module name must be equal to (case-sensitively), ignoring any
whitespace at the start or end of `module'.

@item 
`lineno' is an integer that the line number where the warning occurred must
match, or @code{0} to match all line numbers.
@end itemize

Since the @ref{275b,,Warning} class is derived from the built-in @ref{bd3,,Exception}
class, to turn a warning into an error we simply raise @code{category(message)}.

If a warning is reported and doesn’t match any registered filter then the
“default” action is applied (hence its name).

@menu
* Repeated Warning Suppression Criteria:: 
* Describing Warning Filters:: 
* Default Warning Filter:: 
* Overriding the default filter:: 

@end menu

@node Repeated Warning Suppression Criteria,Describing Warning Filters,,The Warnings Filter
@anchor{library/warnings id2}@anchor{4cec}@anchor{library/warnings repeated-warning-suppression-criteria}@anchor{4ced}
@subsubsection Repeated Warning Suppression Criteria


The filters that suppress repeated warnings apply the following criteria to determine if a warning is considered a repeat:


@itemize -

@item 
@code{"default"}: A warning is considered a repeat only if the (`message', `category', `module', `lineno') are all the same.

@item 
@code{"module"}: A warning is considered a repeat if the (`message', `category', `module') are the same, ignoring the line number.

@item 
@code{"once"}: A warning is considered a repeat if the (`message', `category') are the same, ignoring the module and line number.
@end itemize

@node Describing Warning Filters,Default Warning Filter,Repeated Warning Suppression Criteria,The Warnings Filter
@anchor{library/warnings describing-warning-filters}@anchor{216d}@anchor{library/warnings id3}@anchor{4cee}
@subsubsection Describing Warning Filters


The warnings filter is initialized by @ref{acb,,-W} options passed to the Python
interpreter command line and the 
@geindex PYTHONWARNINGS
@geindex environment variable; PYTHONWARNINGS
@ref{da9,,PYTHONWARNINGS} environment variable.
The interpreter saves the arguments for all supplied entries without
interpretation in @ref{3f3,,sys.warnoptions}; the @code{warnings} module parses these
when it is first imported (invalid options are ignored, after printing a
message to @ref{b39,,sys.stderr}).

Individual warnings filters are specified as a sequence of fields separated by
colons:

@example
action:message:category:module:line
@end example

The meaning of each of these fields is as described in @ref{1b2,,The Warnings Filter}.
When listing multiple filters on a single line (as for
@geindex PYTHONWARNINGS
@geindex environment variable; PYTHONWARNINGS
@ref{da9,,PYTHONWARNINGS}), the individual filters are separated by commas and
the filters listed later take precedence over those listed before them (as
they’re applied left-to-right, and the most recently applied filters take
precedence over earlier ones).

Commonly used warning filters apply to either all warnings, warnings in a
particular category, or warnings raised by particular modules or packages.
Some examples:

@example
default                      # Show all warnings (even those ignored by default)
ignore                       # Ignore all warnings
error                        # Convert all warnings to errors
error::ResourceWarning       # Treat ResourceWarning messages as errors
default::DeprecationWarning  # Show DeprecationWarning messages
ignore,default:::mymodule    # Only report warnings triggered by "mymodule"
error:::mymodule             # Convert warnings to errors in "mymodule"
@end example

@node Default Warning Filter,Overriding the default filter,Describing Warning Filters,The Warnings Filter
@anchor{library/warnings default-warning-filter}@anchor{4cef}@anchor{library/warnings id4}@anchor{4cf0}
@subsubsection Default Warning Filter


By default, Python installs several warning filters, which can be overridden by
the @ref{acb,,-W} command-line option, the 
@geindex PYTHONWARNINGS
@geindex environment variable; PYTHONWARNINGS
@ref{da9,,PYTHONWARNINGS} environment
variable and calls to @ref{16b5,,filterwarnings()}.

In regular release builds, the default warning filter has the following entries
(in order of precedence):

@example
default::DeprecationWarning:__main__
ignore::DeprecationWarning
ignore::PendingDeprecationWarning
ignore::ImportWarning
ignore::ResourceWarning
@end example

In a @ref{50a,,debug build}, the list of default warning filters is empty.


Changed in version 3.2: @ref{1a4,,DeprecationWarning} is now ignored by default in addition to
@ref{acc,,PendingDeprecationWarning}.



Changed in version 3.7: @ref{1a4,,DeprecationWarning} is once again shown by default when triggered
directly by code in @code{__main__}.



Changed in version 3.7: @ref{e22,,BytesWarning} no longer appears in the default filter list and is
instead configured via @ref{3f3,,sys.warnoptions} when @ref{7fa,,-b} is specified
twice.


@node Overriding the default filter,,Default Warning Filter,The Warnings Filter
@anchor{library/warnings overriding-the-default-filter}@anchor{4cf1}@anchor{library/warnings warning-disable}@anchor{4cf2}
@subsubsection Overriding the default filter


Developers of applications written in Python may wish to hide `all' Python level
warnings from their users by default, and only display them when running tests
or otherwise working on the application. The @ref{3f3,,sys.warnoptions} attribute
used to pass filter configurations to the interpreter can be used as a marker to
indicate whether or not warnings should be disabled:

@example
import sys

if not sys.warnoptions:
    import warnings
    warnings.simplefilter("ignore")
@end example

Developers of test runners for Python code are advised to instead ensure that
`all' warnings are displayed by default for the code under test, using code
like:

@example
import sys

if not sys.warnoptions:
    import os, warnings
    warnings.simplefilter("default") # Change the filter in this process
    os.environ["PYTHONWARNINGS"] = "default" # Also affect subprocesses
@end example

Finally, developers of interactive shells that run user code in a namespace
other than @code{__main__} are advised to ensure that @ref{1a4,,DeprecationWarning}
messages are made visible by default, using code like the following (where
@code{user_ns} is the module used to execute code entered interactively):

@example
import warnings
warnings.filterwarnings("default", category=DeprecationWarning,
                                   module=user_ns.get("__name__"))
@end example

@node Temporarily Suppressing Warnings,Testing Warnings,The Warnings Filter,warnings — Warning control
@anchor{library/warnings temporarily-suppressing-warnings}@anchor{4cf3}@anchor{library/warnings warning-suppress}@anchor{4cf4}
@subsubsection Temporarily Suppressing Warnings


If you are using code that you know will raise a warning, such as a deprecated
function, but do not want to see the warning (even when warnings have been
explicitly configured via the command line), then it is possible to suppress
the warning using the @ref{17a,,catch_warnings} context manager:

@example
import warnings

def fxn():
    warnings.warn("deprecated", DeprecationWarning)

with warnings.catch_warnings():
    warnings.simplefilter("ignore")
    fxn()
@end example

While within the context manager all warnings will simply be ignored. This
allows you to use known-deprecated code without having to see the warning while
not suppressing the warning for other code that might not be aware of its use
of deprecated code.

@quotation

@cartouche
@quotation Note 
See @ref{4cf5,,Concurrent safety of Context Managers} for details on the
concurrency-safety of the @ref{17a,,catch_warnings} context manager when
used in programs using multiple threads or async functions.
@end quotation
@end cartouche
@end quotation

@node Testing Warnings,Updating Code For New Versions of Dependencies,Temporarily Suppressing Warnings,warnings — Warning control
@anchor{library/warnings testing-warnings}@anchor{4cf6}@anchor{library/warnings warning-testing}@anchor{4cf7}
@subsubsection Testing Warnings


To test warnings raised by code, use the @ref{17a,,catch_warnings} context
manager. With it you can temporarily mutate the warnings filter to facilitate
your testing. For instance, do the following to capture all raised warnings to
check:

@example
import warnings

def fxn():
    warnings.warn("deprecated", DeprecationWarning)

with warnings.catch_warnings(record=True) as w:
    # Cause all warnings to always be triggered.
    warnings.simplefilter("always")
    # Trigger a warning.
    fxn()
    # Verify some things
    assert len(w) == 1
    assert issubclass(w[-1].category, DeprecationWarning)
    assert "deprecated" in str(w[-1].message)
@end example

One can also cause all warnings to be exceptions by using @code{error} instead of
@code{always}. One thing to be aware of is that if a warning has already been
raised because of a @code{once}/@code{default} rule, then no matter what filters are
set the warning will not be seen again unless the warnings registry related to
the warning has been cleared.

Once the context manager exits, the warnings filter is restored to its state
when the context was entered. This prevents tests from changing the warnings
filter in unexpected ways between tests and leading to indeterminate test
results.

@quotation

@cartouche
@quotation Note 
See @ref{4cf5,,Concurrent safety of Context Managers} for details on the
concurrency-safety of the @ref{17a,,catch_warnings} context manager when
used in programs using multiple threads or async functions.
@end quotation
@end cartouche
@end quotation

When testing multiple operations that raise the same kind of warning, it
is important to test them in a manner that confirms each operation is raising
a new warning (e.g. set warnings to be raised as exceptions and check the
operations raise exceptions, check that the length of the warning list
continues to increase after each operation, or else delete the previous
entries from the warnings list before each new operation).

@node Updating Code For New Versions of Dependencies,Available Functions,Testing Warnings,warnings — Warning control
@anchor{library/warnings updating-code-for-new-versions-of-dependencies}@anchor{4cf8}@anchor{library/warnings warning-ignored}@anchor{4980}
@subsubsection Updating Code For New Versions of Dependencies


Warning categories that are primarily of interest to Python developers (rather
than end users of applications written in Python) are ignored by default.

Notably, this “ignored by default” list includes @ref{1a4,,DeprecationWarning}
(for every module except @code{__main__}), which means developers should make sure
to test their code with typically ignored warnings made visible in order to
receive timely notifications of future breaking API changes (whether in the
standard library or third party packages).

In the ideal case, the code will have a suitable test suite, and the test runner
will take care of implicitly enabling all warnings when running tests
(the test runner provided by the @ref{10d,,unittest} module does this).

In less ideal cases, applications can be checked for use of deprecated
interfaces by passing @ref{acb,,-Wd} to the Python interpreter (this is
shorthand for @code{-W default}) or setting @code{PYTHONWARNINGS=default} in
the environment. This enables default handling for all warnings, including those
that are ignored by default. To change what action is taken for encountered
warnings you can change what argument is passed to @code{-W} (e.g.
@code{-W error}). See the @code{-W} flag for more details on what is
possible.

@node Available Functions,Available Context Managers,Updating Code For New Versions of Dependencies,warnings — Warning control
@anchor{library/warnings available-functions}@anchor{4cf9}@anchor{library/warnings warning-functions}@anchor{4cfa}
@subsubsection Available Functions


@geindex warn() (in module warnings)
@anchor{library/warnings warnings warn}@anchor{1725}
@deffn {Function} warnings.warn (message, category=None, stacklevel=1, source=None, *, skip_file_prefixes=())

Issue a warning, or maybe ignore it or raise an exception.  The `category'
argument, if given, must be a @ref{275a,,warning category class}; it
defaults to @ref{275c,,UserWarning}.  Alternatively, `message' can be a @ref{275b,,Warning} instance,
in which case `category' will be ignored and @code{message.__class__} will be used.
In this case, the message text will be @code{str(message)}. This function raises an
exception if the particular warning issued is changed into an error by the
@ref{1b2,,warnings filter}.  The `stacklevel' argument can be used by wrapper
functions written in Python, like this:

@example
def deprecated_api(message):
    warnings.warn(message, DeprecationWarning, stacklevel=2)
@end example

This makes the warning refer to @code{deprecated_api}’s caller, rather than to
the source of @code{deprecated_api} itself (since the latter would defeat the
purpose of the warning message).

The `skip_file_prefixes' keyword argument can be used to indicate which
stack frames are ignored when counting stack levels. This can be useful when
you want the warning to always appear at call sites outside of a package
when a constant `stacklevel' does not fit all call paths or is otherwise
challenging to maintain. If supplied, it must be a tuple of strings. When
prefixes are supplied, stacklevel is implicitly overridden to be @code{max(2,
stacklevel)}. To cause a warning to be attributed to the caller from
outside of the current package you might write:

@example
# example/lower.py
_warn_skips = (os.path.dirname(__file__),)

def one_way(r_luxury_yacht=None, t_wobbler_mangrove=None):
    if r_luxury_yacht:
        warnings.warn("Please migrate to t_wobbler_mangrove=.",
                      skip_file_prefixes=_warn_skips)

# example/higher.py
from . import lower

def another_way(**kw):
    lower.one_way(**kw)
@end example

This makes the warning refer to both the @code{example.lower.one_way()} and
@code{example.higher.another_way()} call sites only from calling code living
outside of @code{example} package.

`source', if supplied, is the destroyed object which emitted a
@ref{54d,,ResourceWarning}.


Changed in version 3.6: Added `source' parameter.



Changed in version 3.12: Added `skip_file_prefixes'.

@end deffn

@geindex warn_explicit() (in module warnings)
@anchor{library/warnings warnings warn_explicit}@anchor{f03}
@deffn {Function} warnings.warn_explicit (message, category, filename, lineno, module=None, registry=None, module_globals=None, source=None)

This is a low-level interface to the functionality of @ref{1725,,warn()}, passing in
explicitly the message, category, filename and line number, and optionally
other arguments.
`message' must be a string and `category' a subclass of @ref{275b,,Warning} or
`message' may be a @code{Warning} instance, in which case `category' will be
ignored.

`module', if supplied, should be the module name.
If no module is passed, the filename with @code{.py} stripped is used.

`registry', if supplied, should be the @code{__warningregistry__} dictionary
of the module.
If no registry is passed, each warning is treated as the first occurrence,
that is, filter actions @code{"default"}, @code{"module"} and @code{"once"} are
handled as @code{"always"}.

`module_globals', if supplied, should be the global namespace in use by the code
for which the warning is issued.  (This argument is used to support displaying
source for modules found in zipfiles or other non-filesystem import
sources).

`source', if supplied, is the destroyed object which emitted a
@ref{54d,,ResourceWarning}.


Changed in version 3.6: Add the `source' parameter.

@end deffn

@geindex showwarning() (in module warnings)
@anchor{library/warnings warnings showwarning}@anchor{4ce9}
@deffn {Function} warnings.showwarning (message, category, filename, lineno, file=None, line=None)

Write a warning to a file.  The default implementation calls
@code{formatwarning(message, category, filename, lineno, line)} and writes the
resulting string to `file', which defaults to @ref{b39,,sys.stderr}.  You may replace
this function with any callable by assigning to @code{warnings.showwarning}.
`line' is a line of source code to be included in the warning
message; if `line' is not supplied, @code{showwarning()} will
try to read the line specified by `filename' and `lineno'.
@end deffn

@geindex formatwarning() (in module warnings)
@anchor{library/warnings warnings formatwarning}@anchor{1e3b}
@deffn {Function} warnings.formatwarning (message, category, filename, lineno, line=None)

Format a warning the standard way.  This returns a string which may contain
embedded newlines and ends in a newline.  `line' is a line of source code to
be included in the warning message; if `line' is not supplied,
@code{formatwarning()} will try to read the line specified by `filename' and
`lineno'.
@end deffn

@geindex filterwarnings() (in module warnings)
@anchor{library/warnings warnings filterwarnings}@anchor{16b5}
@deffn {Function} warnings.filterwarnings (action, message='@w{'}, category=Warning, module='@w{'}, lineno=0, append=False)

Insert an entry into the list of @ref{1b2,,warnings filter specifications}.  The entry is inserted at the front by default; if
`append' is true, it is inserted at the end.  This checks the types of the
arguments, compiles the `message' and `module' regular expressions, and
inserts them as a tuple in the list of warnings filters.  Entries closer to
the front of the list override entries later in the list, if both match a
particular warning.  Omitted arguments default to a value that matches
everything.
@end deffn

@geindex simplefilter() (in module warnings)
@anchor{library/warnings warnings simplefilter}@anchor{8d2}
@deffn {Function} warnings.simplefilter (action, category=Warning, lineno=0, append=False)

Insert a simple entry into the list of @ref{1b2,,warnings filter specifications}.  The meaning of the function parameters is as for
@ref{16b5,,filterwarnings()}, but regular expressions are not needed as the filter
inserted always matches any message in any module as long as the category and
line number match.
@end deffn

@geindex resetwarnings() (in module warnings)
@anchor{library/warnings warnings resetwarnings}@anchor{4ce8}
@deffn {Function} warnings.resetwarnings ()

Reset the warnings filter.  This discards the effect of all previous calls to
@ref{16b5,,filterwarnings()}, including that of the @ref{acb,,-W} command line options
and calls to @ref{8d2,,simplefilter()}.
@end deffn

@geindex deprecated() (in module warnings)
@anchor{library/warnings warnings deprecated}@anchor{48a}
@deffn {Function} @@warnings.deprecated (msg, *, category=DeprecationWarning, stacklevel=1)

Decorator to indicate that a class, function or overload is deprecated.

When this decorator is applied to an object,
deprecation warnings may be emitted at runtime when the object is used.
@ref{574,,static type checkers}
will also generate a diagnostic on usage of the deprecated object.

Usage:

@example
from warnings import deprecated
from typing import overload

@@deprecated("Use B instead")
class A:
    pass

@@deprecated("Use g instead")
def f():
    pass

@@overload
@@deprecated("int support is deprecated")
def g(x: int) -> int: ...
@@overload
def g(x: str) -> int: ...
@end example

The warning specified by `category' will be emitted at runtime
on use of deprecated objects. For functions, that happens on calls;
for classes, on instantiation and on creation of subclasses.
If the `category' is @code{None}, no warning is emitted at runtime.
The `stacklevel' determines where the
warning is emitted. If it is @code{1} (the default), the warning
is emitted at the direct caller of the deprecated object; if it
is higher, it is emitted further up the stack.
Static type checker behavior is not affected by the `category'
and `stacklevel' arguments.

The deprecation message passed to the decorator is saved in the
@code{__deprecated__} attribute on the decorated object.
If applied to an overload, the decorator
must be after the @ref{4875,,@@~typing.overload} decorator
for the attribute to exist on the overload as returned by
@ref{8bf,,typing.get_overloads()}.


Added in version 3.13: See 
@geindex Python Enhancement Proposals; PEP 702
PEP 702@footnote{https://peps.python.org/pep-0702/}.

@end deffn

@node Available Context Managers,Concurrent safety of Context Managers,Available Functions,warnings — Warning control
@anchor{library/warnings available-context-managers}@anchor{4cfb}
@subsubsection Available Context Managers


@geindex catch_warnings (class in warnings)
@anchor{library/warnings warnings catch_warnings}@anchor{17a}
@deffn {Class} warnings.catch_warnings (*, record=False, module=None, action=None, category=Warning, lineno=0, append=False)

A context manager that copies and, upon exit, restores the warnings filter
and the @ref{4ce9,,showwarning()} function.
If the `record' argument is @ref{d31,,False} (the default) the context manager
returns @ref{887,,None} on entry. If `record' is @ref{e0d,,True}, a list is
returned that is progressively populated with objects as seen by a custom
@code{showwarning()} function (which also suppresses output to @code{sys.stderr}).
Each object in the list is guaranteed to have the following attributes:

@quotation


@itemize -

@item 
@code{message}: the warning message (an instance of @ref{275b,,Warning})

@item 
@code{category}: the warning category (a subclass of @ref{275b,,Warning})

@item 
@code{filename}: the file name where the warning occurred (@ref{16a,,str})

@item 
@code{lineno}: the line number in the file (@ref{19c,,int})

@item 
@code{file}: the file object used for output (if any), or @code{None}

@item 
@code{line}: the line of source code (if available), or @code{None}

@item 
@code{source}: the original object that generated the warning (if
available), or @code{None}
@end itemize
@end quotation


Changed in version 3.6: The @code{source} attribute was added.


The type of these objects is not specified and may change; only the
presence of these attributes is guaranteed.

The `module' argument takes a module that will be used instead of the
module returned when you import @code{warnings} whose filter will be
protected. This argument exists primarily for testing the @code{warnings}
module itself.

If the `action' argument is not @code{None}, the remaining arguments are
passed to @ref{8d2,,simplefilter()} as if it were called immediately on
entering the context.

See @ref{1b2,,The Warnings Filter} for the meaning of the `category' and `lineno'
parameters.

@cartouche
@quotation Note 
See @ref{4cf5,,Concurrent safety of Context Managers} for details on the
concurrency-safety of the @code{catch_warnings} context manager when
used in programs using multiple threads or async functions.
@end quotation
@end cartouche


Changed in version 3.11: Added the `action', `category', `lineno', and `append' parameters.

@end deffn

@node Concurrent safety of Context Managers,,Available Context Managers,warnings — Warning control
@anchor{library/warnings concurrent-safety-of-context-managers}@anchor{4cfc}@anchor{library/warnings warning-concurrent-safe}@anchor{4cf5}
@subsubsection Concurrent safety of Context Managers


The behavior of @ref{17a,,catch_warnings} context manager depends on the
@ref{18b,,sys.flags.context_aware_warnings} flag.  If the flag is true, the
context manager behaves in a concurrent-safe fashion and otherwise not.
Concurrent-safe means that it is both thread-safe and safe to use within
@ref{3830,,asyncio coroutines} and tasks.  Being thread-safe means
that behavior is predictable in a multi-threaded program.  The flag defaults
to true for free-threaded builds and false otherwise.

If the @ref{18b,,context_aware_warnings} flag is false, then
@ref{17a,,catch_warnings} will modify the global attributes of the
@code{warnings} module.  This is not safe if used within a concurrent program
(using multiple threads or using asyncio coroutines).  For example, if two
or more threads use the @code{catch_warnings} class at the same time, the
behavior is undefined.

If the flag is true, @ref{17a,,catch_warnings} will not modify global
attributes and will instead use a @ref{18be,,ContextVar} to
store the newly established warning filtering state.  A context variable
provides thread-local storage and it makes the use of @code{catch_warnings}
thread-safe.

The `record' parameter of the context handler also behaves differently
depending on the value of the flag.  When `record' is true and the flag is
false, the context manager works by replacing and then later restoring the
module’s @ref{4ce9,,showwarning()} function.  That is not concurrent-safe.

When `record' is true and the flag is true, the @ref{4ce9,,showwarning()} function
is not replaced.  Instead, the recording status is indicated by an internal
property in the context variable.  In this case, the @code{showwarning()}
function will not be restored when exiting the context handler.

The @ref{18b,,context_aware_warnings} flag can be set the @ref{170,,-X context_aware_warnings} command-line option or by the
@geindex PYTHON_CONTEXT_AWARE_WARNINGS
@geindex environment variable; PYTHON_CONTEXT_AWARE_WARNINGS
@ref{18a4,,PYTHON_CONTEXT_AWARE_WARNINGS} environment variable.

@quotation

@cartouche
@quotation Note 
It is likely that most programs that desire thread-safe
behaviour of the warnings module will also want to set the
@ref{176,,thread_inherit_context} flag to true.  That flag
causes threads created by @ref{177,,threading.Thread} to start
with a copy of the context variables from the thread starting
it.  When true, the context established by @ref{17a,,catch_warnings}
in one thread will also apply to new threads started by it.  If false,
new threads will start with an empty warnings context variable,
meaning that any filtering that was established by a
@code{catch_warnings} context manager will no longer be active.
@end quotation
@end cartouche
@end quotation


Changed in version 3.14: Added the @ref{18b,,sys.flags.context_aware_warnings} flag and the use of a
context variable for @ref{17a,,catch_warnings} if the flag is true.  Previous
versions of Python acted as if the flag was always set to false.


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node dataclasses — Data Classes,contextlib — Utilities for with-statement contexts,warnings — Warning control,Python Runtime Services
@anchor{library/dataclasses doc}@anchor{4cfd}@anchor{library/dataclasses dataclasses-data-classes}@anchor{4cfe}@anchor{library/dataclasses module-dataclasses}@anchor{33}@anchor{library/dataclasses translation-repo}@anchor{4cff}
@subsection @code{dataclasses} — Data Classes


@geindex module; dataclasses

`Source code:' Lib/dataclasses.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/dataclasses.py}


__________________________________________________________________


This module provides a decorator and functions for automatically
adding generated @ref{1ca3,,special methods} such as @ref{8c1,,__init__()} and
@ref{830,,__repr__()} to user-defined classes.  It was originally described
in 
@geindex Python Enhancement Proposals; PEP 557
PEP 557@footnote{https://peps.python.org/pep-0557/}.

The member variables to use in these generated methods are defined
using 
@geindex Python Enhancement Proposals; PEP 526
PEP 526@footnote{https://peps.python.org/pep-0526/} type annotations.  For example, this code:

@example
from dataclasses import dataclass

@@dataclass
class InventoryItem:
    """Class for keeping track of an item in inventory."""
    name: str
    unit_price: float
    quantity_on_hand: int = 0

    def total_cost(self) -> float:
        return self.unit_price * self.quantity_on_hand
@end example

will add, among other things, a @code{__init__()} that looks like:

@example
def __init__(self, name: str, unit_price: float, quantity_on_hand: int = 0):
    self.name = name
    self.unit_price = unit_price
    self.quantity_on_hand = quantity_on_hand
@end example

Note that this method is automatically added to the class: it is not
directly specified in the @code{InventoryItem} definition shown above.


Added in version 3.7.


@menu
* Module contents: Module contents<5>. 
* Post-init processing:: 
* Class variables:: 
* Init-only variables:: 
* Frozen instances:: 
* Inheritance: Inheritance<2>. 
* Re-ordering of keyword-only parameters in __init__(): Re-ordering of keyword-only parameters in __init__. 
* Default factory functions:: 
* Mutable default values:: 
* Descriptor-typed fields:: 

@end menu

@node Module contents<5>,Post-init processing,,dataclasses — Data Classes
@anchor{library/dataclasses module-contents}@anchor{4d00}
@subsubsection Module contents


@geindex dataclass() (in module dataclasses)
@anchor{library/dataclasses dataclasses dataclass}@anchor{4e2}
@deffn {Function} @@dataclasses.dataclass (*, init=True, repr=True, eq=True, order=False, unsafe_hash=False, frozen=False, match_args=True, kw_only=False, slots=False, weakref_slot=False)

This function is a @ref{93f,,decorator} that is used to add generated
@ref{1ca3,,special methods} to classes, as described below.

The @code{@@dataclass} decorator examines the class to find
@code{field}s.  A @code{field} is defined as a class variable that has a
@ref{f57,,type annotation}.  With two
exceptions described below, nothing in @code{@@dataclass}
examines the type specified in the variable annotation.

The order of the fields in all of the generated methods is the
order in which they appear in the class definition.

The @code{@@dataclass} decorator will add various “dunder” methods to
the class, described below.  If any of the added methods already
exist in the class, the behavior depends on the parameter, as documented
below. The decorator returns the same class that it is called on; no new
class is created.

If @code{@@dataclass} is used just as a simple decorator with no parameters,
it acts as if it has the default values documented in this
signature.  That is, these three uses of @code{@@dataclass} are
equivalent:

@example
@@dataclass
class C:
    ...

@@dataclass()
class C:
    ...

@@dataclass(init=True, repr=True, eq=True, order=False, unsafe_hash=False, frozen=False,
           match_args=True, kw_only=False, slots=False, weakref_slot=False)
class C:
    ...
@end example

The parameters to @code{@@dataclass} are:


@itemize -

@item 
`init': If true (the default), a @ref{8c1,,__init__()} method will be
generated.

If the class already defines @code{__init__()}, this parameter is
ignored.

@item 
`repr': If true (the default), a @ref{830,,__repr__()} method will be
generated.  The generated repr string will have the class name and
the name and repr of each field, in the order they are defined in
the class.  Fields that are marked as being excluded from the repr
are not included.  For example:
@code{InventoryItem(name='widget', unit_price=3.0, quantity_on_hand=10)}.

If the class already defines @code{__repr__()}, this parameter is
ignored.

@item 
`eq': If true (the default), an @ref{cf8,,__eq__()} method will be
generated.

This method compares the class by comparing each field in order. Both
instances in the comparison must be of the identical type.

If the class already defines @code{__eq__()}, this parameter is ignored.


Changed in version 3.13: The generated @code{__eq__} method now compares each field individually
(for example, @code{self.a == other.a and self.b == other.b}), rather than
comparing tuples of fields as in previous versions.

This change makes the comparison faster but it may alter results in cases
where attributes compare equal by identity but not by value (such as
@code{float('nan')}).

In Python 3.12 and earlier, the comparison was performed by creating
tuples of the fields and comparing them (for example,
@code{(self.a, self.b) == (other.a, other.b)}).


@item 
`order': If true (the default is @code{False}), @ref{14ac,,__lt__()},
@ref{1516,,__le__()}, @ref{1517,,__gt__()}, and @ref{1518,,__ge__()} methods will be
generated.  These compare the class as if it were a tuple of its
fields, in order.  Both instances in the comparison must be of the
identical type.  If `order' is true and `eq' is false, a
@ref{2ee,,ValueError} is raised.

If the class already defines any of @code{__lt__()},
@code{__le__()}, @code{__gt__()}, or @code{__ge__()}, then
@ref{199,,TypeError} is raised.

@item 
`unsafe_hash': If true, force @code{dataclasses} to create a
@ref{cf9,,__hash__()} method, even though it may not be safe to do so.
Otherwise, generate a @code{__hash__()} method according to how
`eq' and `frozen' are set.
The default value is @code{False}.

@code{__hash__()} is used by built-in @ref{802,,hash()}, and when objects are
added to hashed collections such as dictionaries and sets.  Having a
@code{__hash__()} implies that instances of the class are immutable.
Mutability is a complicated property that depends on the programmer’s
intent, the existence and behavior of @code{__eq__()}, and the values of
the `eq' and `frozen' flags in the @code{@@dataclass} decorator.

By default, @code{@@dataclass} will not implicitly add a @ref{cf9,,__hash__()}
method unless it is safe to do so.  Neither will it add or change an
existing explicitly defined @code{__hash__()} method.  Setting the class
attribute @code{__hash__ = None} has a specific meaning to Python, as
described in the @code{__hash__()} documentation.

If @code{__hash__()} is not explicitly defined, or if it is set to @code{None},
then @code{@@dataclass} `may' add an implicit @code{__hash__()} method.
Although not recommended, you can force @code{@@dataclass} to create a
@code{__hash__()} method with @code{unsafe_hash=True}. This might be the case
if your class is logically immutable but can still be mutated.
This is a specialized use case and should be considered carefully.

Here are the rules governing implicit creation of a @code{__hash__()}
method.  Note that you cannot both have an explicit @code{__hash__()}
method in your dataclass and set @code{unsafe_hash=True}; this will result
in a @ref{199,,TypeError}.

If `eq' and `frozen' are both true, by default @code{@@dataclass} will
generate a @code{__hash__()} method for you.  If `eq' is true and
`frozen' is false, @code{__hash__()} will be set to @code{None}, marking it
unhashable (which it is, since it is mutable).  If `eq' is false,
@code{__hash__()} will be left untouched meaning the @code{__hash__()}
method of the superclass will be used (if the superclass is
@ref{c84,,object}, this means it will fall back to id-based hashing).

@item 
`frozen': If true (the default is @code{False}), assigning to fields will
generate an exception.  This emulates read-only frozen instances.
See the @ref{4d01,,discussion} below.

If @ref{23bf,,__setattr__()} or @ref{23c0,,__delattr__()} is defined in the class
and `frozen' is true, then @ref{199,,TypeError} is raised.

@item 
`match_args': If true (the default is @code{True}), the
@ref{1cb8,,__match_args__} tuple will be created from the list of
non keyword-only parameters to the generated @ref{8c1,,__init__()} method (even if
@code{__init__()} is not generated, see above).  If false, or if
@code{__match_args__} is already defined in the class, then
@code{__match_args__} will not be generated.
@end itemize

@quotation


Added in version 3.10.

@end quotation


@itemize -

@item 
`kw_only': If true (the default value is @code{False}), then all
fields will be marked as keyword-only.  If a field is marked as
keyword-only, then the only effect is that the @ref{8c1,,__init__()}
parameter generated from a keyword-only field must be specified
with a keyword when @code{__init__()} is called. See the @ref{238f,,parameter}
glossary entry for details.  Also see the
@ref{4d02,,KW_ONLY} section.

Keyword-only fields are not included in @code{__match_args__}.
@end itemize

@quotation


Added in version 3.10.

@end quotation


@itemize -

@item 
`slots': If true (the default is @code{False}), @ref{16f7,,__slots__} attribute
will be generated and new class will be returned instead of the original one.
If @code{__slots__} is already defined in the class, then @ref{199,,TypeError}
is raised.
@end itemize

@quotation

@cartouche
@quotation Warning 
Passing parameters to a base class @ref{844,,__init_subclass__()}
when using @code{slots=True} will result in a @ref{199,,TypeError}.
Either use @code{__init_subclass__} with no parameters
or use default values as a workaround.
See gh-91126@footnote{https://github.com/python/cpython/issues/91126} for full details.
@end quotation
@end cartouche


Added in version 3.10.



Changed in version 3.11: If a field name is already included in the @code{__slots__}
of a base class, it will not be included in the generated @code{__slots__}
to prevent @ref{2401,,overriding them}.
Therefore, do not use @code{__slots__} to retrieve the field names of a
dataclass. Use @ref{1979,,fields()} instead.
To be able to determine inherited slots,
base class @code{__slots__} may be any iterable, but `not' an iterator.

@end quotation


@itemize -

@item 
`weakref_slot': If true (the default is @code{False}), add a slot
named “__weakref__”, which is required to make an instance
@ref{11f6,,weakref-able}.
It is an error to specify @code{weakref_slot=True}
without also specifying @code{slots=True}.
@end itemize

@quotation


Added in version 3.11.

@end quotation

@code{field}s may optionally specify a default value, using normal
Python syntax:

@example
@@dataclass
class C:
    a: int       # 'a' has no default value
    b: int = 0   # assign a default value for 'b'
@end example

In this example, both @code{a} and @code{b} will be included in the added
@ref{8c1,,__init__()} method, which will be defined as:

@example
def __init__(self, a: int, b: int = 0):
@end example

@ref{199,,TypeError} will be raised if a field without a default value
follows a field with a default value.  This is true whether this
occurs in a single class, or as a result of class inheritance.
@end deffn

@geindex field() (in module dataclasses)
@anchor{library/dataclasses dataclasses field}@anchor{199e}
@deffn {Function} dataclasses.field (*, default=MISSING, default_factory=MISSING, init=True, repr=True, hash=None, compare=True, metadata=None, kw_only=MISSING, doc=None)

For common and simple use cases, no other functionality is
required.  There are, however, some dataclass features that
require additional per-field information.  To satisfy this need for
additional information, you can replace the default field value
with a call to the provided @code{field()} function.  For example:

@example
@@dataclass
class C:
    mylist: list[int] = field(default_factory=list)

c = C()
c.mylist += [1, 2, 3]
@end example

As shown above, the @ref{4d03,,MISSING} value is a sentinel object used to
detect if some parameters are provided by the user. This sentinel is
used because @code{None} is a valid value for some parameters with
a distinct meaning.  No code should directly use the @code{MISSING} value.

The parameters to @code{field()} are:


@itemize -

@item 
`default': If provided, this will be the default value for this
field.  This is needed because the @code{field()} call itself
replaces the normal position of the default value.

@item 
`default_factory': If provided, it must be a zero-argument
callable that will be called when a default value is needed for
this field.  Among other purposes, this can be used to specify
fields with mutable default values, as discussed below.  It is an
error to specify both `default' and `default_factory'.

@item 
`init': If true (the default), this field is included as a
parameter to the generated @ref{8c1,,__init__()} method.

@item 
`repr': If true (the default), this field is included in the
string returned by the generated @ref{830,,__repr__()} method.

@item 
`hash': This can be a bool or @code{None}.  If true, this field is
included in the generated @ref{cf9,,__hash__()} method.  If false,
this field is excluded from the generated @code{__hash__()}.
If @code{None} (the default), use the value of `compare': this would
normally be the expected behavior, since a field should be included
in the hash if it’s used for comparisons.  Setting this value to anything
other than @code{None} is discouraged.

One possible reason to set @code{hash=False} but @code{compare=True}
would be if a field is expensive to compute a hash value for,
that field is needed for equality testing, and there are other
fields that contribute to the type’s hash value.  Even if a field
is excluded from the hash, it will still be used for comparisons.

@item 
`compare': If true (the default), this field is included in the
generated equality and comparison methods (@ref{cf8,,__eq__()},
@ref{1517,,__gt__()}, et al.).

@item 
`metadata': This can be a mapping or @code{None}. @code{None} is treated as
an empty dict.  This value is wrapped in
@ref{699,,MappingProxyType()} to make it read-only, and exposed
on the @ref{199f,,Field} object. It is not used at all by Data
Classes, and is provided as a third-party extension mechanism.
Multiple third-parties can each have their own key, to use as a
namespace in the metadata.

@item 
`kw_only': If true, this field will be marked as keyword-only.
This is used when the generated @ref{8c1,,__init__()} method’s
parameters are computed.

Keyword-only fields are also not included in @code{__match_args__}.
@end itemize

@quotation


Added in version 3.10.

@end quotation


@itemize -

@item 
`doc': optional docstring for this field.
@end itemize

@quotation


Added in version 3.14.

@end quotation

If the default value of a field is specified by a call to
@code{field()}, then the class attribute for this field will be
replaced by the specified `default' value.  If `default' is not
provided, then the class attribute will be deleted.  The intent is
that after the @ref{4e2,,@@dataclass} decorator runs, the class
attributes will all contain the default values for the fields, just
as if the default value itself were specified.  For example,
after:

@example
@@dataclass
class C:
    x: int
    y: int = field(repr=False)
    z: int = field(repr=False, default=10)
    t: int = 20
@end example

The class attribute @code{C.z} will be @code{10}, the class attribute
@code{C.t} will be @code{20}, and the class attributes @code{C.x} and
@code{C.y} will not be set.
@end deffn

@geindex Field (class in dataclasses)
@anchor{library/dataclasses dataclasses Field}@anchor{199f}
@deffn {Class} dataclasses.Field

@code{Field} objects describe each defined field. These objects
are created internally, and are returned by the @ref{1979,,fields()}
module-level method (see below).  Users should never instantiate a
@code{Field} object directly.  Its documented attributes are:


@itemize -

@item 
@code{name}: The name of the field.

@item 
@code{type}: The type of the field.

@item 
@code{default}, @code{default_factory}, @code{init}, @code{repr}, @code{hash},
@code{compare}, @code{metadata}, and @code{kw_only} have the identical
meaning and values as they do in the @ref{199e,,field()} function.
@end itemize

Other attributes may exist, but they are private and must not be
inspected or relied on.
@end deffn

@geindex InitVar (class in dataclasses)
@anchor{library/dataclasses dataclasses InitVar}@anchor{1bf7}
@deffn {Class} dataclasses.InitVar

@code{InitVar[T]} type annotations describe variables that are @ref{4d04,,init-only}. Fields annotated with @code{InitVar}
are considered pseudo-fields, and thus are neither returned by the
@ref{1979,,fields()} function nor used in any way except adding them as
parameters to @ref{8c1,,__init__()} and an optional
@ref{4d05,,__post_init__()}.
@end deffn

@geindex fields() (in module dataclasses)
@anchor{library/dataclasses dataclasses fields}@anchor{1979}
@deffn {Function} dataclasses.fields (class_or_instance)

Returns a tuple of @ref{199f,,Field} objects that define the fields for this
dataclass.  Accepts either a dataclass, or an instance of a dataclass.
Raises @ref{199,,TypeError} if not passed a dataclass or instance of one.
Does not return pseudo-fields which are @code{ClassVar} or @code{InitVar}.
@end deffn

@geindex asdict() (in module dataclasses)
@anchor{library/dataclasses dataclasses asdict}@anchor{1adb}
@deffn {Function} dataclasses.asdict (obj, *, dict_factory=dict)

Converts the dataclass `obj' to a dict (by using the
factory function `dict_factory').  Each dataclass is converted
to a dict of its fields, as @code{name: value} pairs.  dataclasses, dicts,
lists, and tuples are recursed into.  Other objects are copied with
@ref{d6b,,copy.deepcopy()}.

Example of using @code{asdict()} on nested dataclasses:

@example
@@dataclass
class Point:
     x: int
     y: int

@@dataclass
class C:
     mylist: list[Point]

p = Point(10, 20)
assert asdict(p) == @{'x': 10, 'y': 20@}

c = C([Point(0, 0), Point(10, 4)])
assert asdict(c) == @{'mylist': [@{'x': 0, 'y': 0@}, @{'x': 10, 'y': 4@}]@}
@end example

To create a shallow copy, the following workaround may be used:

@example
@{field.name: getattr(obj, field.name) for field in fields(obj)@}
@end example

@code{asdict()} raises @ref{199,,TypeError} if `obj' is not a dataclass
instance.
@end deffn

@geindex astuple() (in module dataclasses)
@anchor{library/dataclasses dataclasses astuple}@anchor{1ae4}
@deffn {Function} dataclasses.astuple (obj, *, tuple_factory=tuple)

Converts the dataclass `obj' to a tuple (by using the
factory function `tuple_factory').  Each dataclass is converted
to a tuple of its field values.  dataclasses, dicts, lists, and
tuples are recursed into. Other objects are copied with
@ref{d6b,,copy.deepcopy()}.

Continuing from the previous example:

@example
assert astuple(p) == (10, 20)
assert astuple(c) == ([(0, 0), (10, 4)],)
@end example

To create a shallow copy, the following workaround may be used:

@example
tuple(getattr(obj, field.name) for field in dataclasses.fields(obj))
@end example

@code{astuple()} raises @ref{199,,TypeError} if `obj' is not a dataclass
instance.
@end deffn

@geindex make_dataclass() (in module dataclasses)
@anchor{library/dataclasses dataclasses make_dataclass}@anchor{18a5}
@deffn {Function} dataclasses.make_dataclass (cls_name, fields, *, bases=(), namespace=None, init=True, repr=True, eq=True, order=False, unsafe_hash=False, frozen=False, match_args=True, kw_only=False, slots=False, weakref_slot=False, module=None, decorator=dataclass)

Creates a new dataclass with name `cls_name', fields as defined
in `fields', base classes as given in `bases', and initialized
with a namespace as given in `namespace'.  `fields' is an
iterable whose elements are each either @code{name}, @code{(name, type)},
or @code{(name, type, Field)}.  If just @code{name} is supplied,
@ref{8bd,,typing.Any} is used for @code{type}.  The values of `init',
`repr', `eq', `order', `unsafe_hash', `frozen',
`match_args', `kw_only', `slots', and `weakref_slot' have
the same meaning as they do in @ref{4e2,,@@dataclass}.

If `module' is defined, the @code{__module__} attribute
of the dataclass is set to that value.
By default, it is set to the module name of the caller.

The `decorator' parameter is a callable that will be used to create the dataclass.
It should take the class object as a first argument and the same keyword arguments
as @ref{4e2,,@@dataclass}. By default, the @code{@@dataclass}
function is used.

This function is not strictly required, because any Python
mechanism for creating a new class with @ref{456,,__annotations__} can
then apply the @ref{4e2,,@@dataclass} function to convert that class to
a dataclass.  This function is provided as a convenience.  For
example:

@example
C = make_dataclass('C',
                   [('x', int),
                     'y',
                    ('z', int, field(default=5))],
                   namespace=@{'add_one': lambda self: self.x + 1@})
@end example

Is equivalent to:

@example
@@dataclass
class C:
    x: int
    y: 'typing.Any'
    z: int = 5

    def add_one(self):
        return self.x + 1
@end example


Added in version 3.14: Added the `decorator' parameter.

@end deffn

@geindex replace() (in module dataclasses)
@anchor{library/dataclasses dataclasses replace}@anchor{1ab0}
@deffn {Function} dataclasses.replace (obj, /, **changes)

Creates a new object of the same type as `obj', replacing
fields with values from `changes'.  If `obj' is not a Data
Class, raises @ref{199,,TypeError}.  If keys in `changes' are not
field names of the given dataclass, raises @code{TypeError}.

The newly returned object is created by calling the @ref{8c1,,__init__()}
method of the dataclass.  This ensures that
@ref{4d05,,__post_init__()}, if present, is also called.

Init-only variables without default values, if any exist, must be
specified on the call to @code{replace()} so that they can be passed to
@code{__init__()} and @ref{4d05,,__post_init__()}.

It is an error for `changes' to contain any fields that are
defined as having @code{init=False}.  A @ref{2ee,,ValueError} will be raised
in this case.

Be forewarned about how @code{init=False} fields work during a call to
@code{replace()}.  They are not copied from the source object, but
rather are initialized in @ref{4d05,,__post_init__()}, if they’re
initialized at all.  It is expected that @code{init=False} fields will
be rarely and judiciously used.  If they are used, it might be wise
to have alternate class constructors, or perhaps a custom
@code{replace()} (or similarly named) method which handles instance
copying.

Dataclass instances are also supported by generic function @ref{1c2,,copy.replace()}.
@end deffn

@geindex is_dataclass() (in module dataclasses)
@anchor{library/dataclasses dataclasses is_dataclass}@anchor{1c5a}
@deffn {Function} dataclasses.is_dataclass (obj)

Return @code{True} if its parameter is a dataclass (including subclasses of a
dataclass, but not including @ref{8c3,,generic aliases})
or an instance of one, otherwise return @code{False}.

If you need to know if a class is an instance of a dataclass (and
not a dataclass itself), then add a further check for @code{not
isinstance(obj, type)}:

@example
def is_dataclass_instance(obj):
    return is_dataclass(obj) and not isinstance(obj, type)
@end example
@end deffn

@geindex MISSING (in module dataclasses)
@anchor{library/dataclasses dataclasses MISSING}@anchor{4d03}
@deffn {Data} dataclasses.MISSING

A sentinel value signifying a missing default or default_factory.
@end deffn

@geindex KW_ONLY (in module dataclasses)
@anchor{library/dataclasses dataclasses KW_ONLY}@anchor{4d02}
@deffn {Data} dataclasses.KW_ONLY

A sentinel value used as a type annotation.  Any fields after a
pseudo-field with the type of @code{KW_ONLY} are marked as
keyword-only fields.  Note that a pseudo-field of type
@code{KW_ONLY} is otherwise completely ignored.  This includes the
name of such a field.  By convention, a name of @code{_} is used for a
@code{KW_ONLY} field.  Keyword-only fields signify
@ref{8c1,,__init__()} parameters that must be specified as keywords when
the class is instantiated.

In this example, the fields @code{y} and @code{z} will be marked as keyword-only fields:

@example
@@dataclass
class Point:
    x: float
    _: KW_ONLY
    y: float
    z: float

p = Point(0, y=1.5, z=2.0)
@end example

In a single dataclass, it is an error to specify more than one
field whose type is @code{KW_ONLY}.


Added in version 3.10.

@end deffn

@geindex FrozenInstanceError
@anchor{library/dataclasses dataclasses FrozenInstanceError}@anchor{179b}
@deffn {Exception} dataclasses.FrozenInstanceError

Raised when an implicitly defined @ref{23bf,,__setattr__()} or
@ref{23c0,,__delattr__()} is called on a dataclass which was defined with
@code{frozen=True}. It is a subclass of @ref{5f0,,AttributeError}.
@end deffn

@node Post-init processing,Class variables,Module contents<5>,dataclasses — Data Classes
@anchor{library/dataclasses id1}@anchor{4d06}@anchor{library/dataclasses post-init-processing}@anchor{4d07}
@subsubsection Post-init processing


@geindex __post_init__() (in module dataclasses)
@anchor{library/dataclasses dataclasses __post_init__}@anchor{4d05}
@deffn {Function} dataclasses.__post_init__ ()

When defined on the class, it will be called by the generated
@ref{8c1,,__init__()}, normally as @code{self.__post_init__()}.
However, if any @code{InitVar} fields are defined, they will also be
passed to @code{__post_init__()} in the order they were defined in the
class.  If no @code{__init__()} method is generated, then
@code{__post_init__()} will not automatically be called.

Among other uses, this allows for initializing field values that
depend on one or more other fields.  For example:

@example
@@dataclass
class C:
    a: float
    b: float
    c: float = field(init=False)

    def __post_init__(self):
        self.c = self.a + self.b
@end example
@end deffn

The @ref{8c1,,__init__()} method generated by @ref{4e2,,@@dataclass} does not call base
class @code{__init__()} methods. If the base class has an @code{__init__()} method
that has to be called, it is common to call this method in a
@ref{4d05,,__post_init__()} method:

@example
class Rectangle:
    def __init__(self, height, width):
        self.height = height
        self.width = width

@@dataclass
class Square(Rectangle):
    side: float

    def __post_init__(self):
        super().__init__(self.side, self.side)
@end example

Note, however, that in general the dataclass-generated @code{__init__()} methods
don’t need to be called, since the derived dataclass will take care of
initializing all fields of any base class that is a dataclass itself.

See the section below on init-only variables for ways to pass
parameters to @code{__post_init__()}.  Also see the warning about how
@ref{1ab0,,replace()} handles @code{init=False} fields.

@node Class variables,Init-only variables,Post-init processing,dataclasses — Data Classes
@anchor{library/dataclasses class-variables}@anchor{4d08}@anchor{library/dataclasses dataclasses-class-variables}@anchor{4d09}
@subsubsection Class variables


One of the few places where @ref{4e2,,@@dataclass} actually inspects the type
of a field is to determine if a field is a class variable as defined
in 
@geindex Python Enhancement Proposals; PEP 526
PEP 526@footnote{https://peps.python.org/pep-0526/}.  It does this by checking if the type of the field is
@ref{56d,,typing.ClassVar}.  If a field is a @code{ClassVar}, it is excluded
from consideration as a field and is ignored by the dataclass
mechanisms.  Such @code{ClassVar} pseudo-fields are not returned by the
module-level @ref{1979,,fields()} function.

@node Init-only variables,Frozen instances,Class variables,dataclasses — Data Classes
@anchor{library/dataclasses dataclasses-init-only-variables}@anchor{4d04}@anchor{library/dataclasses init-only-variables}@anchor{4d0a}
@subsubsection Init-only variables


Another place where @ref{4e2,,@@dataclass} inspects a type annotation is to
determine if a field is an init-only variable.  It does this by seeing
if the type of a field is of type @ref{1bf7,,InitVar}.  If a field
is an @code{InitVar}, it is considered a pseudo-field called an init-only
field.  As it is not a true field, it is not returned by the
module-level @ref{1979,,fields()} function.  Init-only fields are added as
parameters to the generated @ref{8c1,,__init__()} method, and are passed to
the optional @ref{4d05,,__post_init__()} method.  They are not otherwise used
by dataclasses.

For example, suppose a field will be initialized from a database, if a
value is not provided when creating the class:

@example
@@dataclass
class C:
    i: int
    j: int | None = None
    database: InitVar[DatabaseType | None] = None

    def __post_init__(self, database):
        if self.j is None and database is not None:
            self.j = database.lookup('j')

c = C(10, database=my_database)
@end example

In this case, @ref{1979,,fields()} will return @ref{199f,,Field} objects for @code{i} and
@code{j}, but not for @code{database}.

@node Frozen instances,Inheritance<2>,Init-only variables,dataclasses — Data Classes
@anchor{library/dataclasses dataclasses-frozen}@anchor{4d01}@anchor{library/dataclasses frozen-instances}@anchor{4d0b}
@subsubsection Frozen instances


It is not possible to create truly immutable Python objects.  However,
by passing @code{frozen=True} to the @ref{4e2,,@@dataclass} decorator you can
emulate immutability.  In that case, dataclasses will add
@ref{23bf,,__setattr__()} and @ref{23c0,,__delattr__()} methods to the class.  These
methods will raise a @ref{179b,,FrozenInstanceError} when invoked.

There is a tiny performance penalty when using @code{frozen=True}:
@ref{8c1,,__init__()} cannot use simple assignment to initialize fields, and
must use @code{object.__setattr__()}.

@c Make sure to not remove "object" from "object.__setattr__" in the above markup!

@node Inheritance<2>,Re-ordering of keyword-only parameters in __init__,Frozen instances,dataclasses — Data Classes
@anchor{library/dataclasses dataclasses-inheritance}@anchor{4d0c}@anchor{library/dataclasses inheritance}@anchor{4d0d}
@subsubsection Inheritance


When the dataclass is being created by the @ref{4e2,,@@dataclass} decorator,
it looks through all of the class’s base classes in reverse MRO (that
is, starting at @ref{c84,,object}) and, for each dataclass that it finds,
adds the fields from that base class to an ordered mapping of fields.
After all of the base class fields are added, it adds its own fields
to the ordered mapping.  All of the generated methods will use this
combined, calculated ordered mapping of fields.  Because the fields
are in insertion order, derived classes override base classes.  An
example:

@example
@@dataclass
class Base:
    x: Any = 15.0
    y: int = 0

@@dataclass
class C(Base):
    z: int = 10
    x: int = 15
@end example

The final list of fields is, in order, @code{x}, @code{y}, @code{z}.  The final
type of @code{x} is @ref{19c,,int}, as specified in class @code{C}.

The generated @ref{8c1,,__init__()} method for @code{C} will look like:

@example
def __init__(self, x: int = 15, y: int = 0, z: int = 10):
@end example

@node Re-ordering of keyword-only parameters in __init__,Default factory functions,Inheritance<2>,dataclasses — Data Classes
@anchor{library/dataclasses re-ordering-of-keyword-only-parameters-in-init}@anchor{4d0e}
@subsubsection Re-ordering of keyword-only parameters in @code{__init__()}


After the parameters needed for @ref{8c1,,__init__()} are computed, any
keyword-only parameters are moved to come after all regular
(non-keyword-only) parameters.  This is a requirement of how
keyword-only parameters are implemented in Python: they must come
after non-keyword-only parameters.

In this example, @code{Base.y}, @code{Base.w}, and @code{D.t} are keyword-only
fields, and @code{Base.x} and @code{D.z} are regular fields:

@example
@@dataclass
class Base:
    x: Any = 15.0
    _: KW_ONLY
    y: int = 0
    w: int = 1

@@dataclass
class D(Base):
    z: int = 10
    t: int = field(kw_only=True, default=0)
@end example

The generated @code{__init__()} method for @code{D} will look like:

@example
def __init__(self, x: Any = 15.0, z: int = 10, *, y: int = 0, w: int = 1, t: int = 0):
@end example

Note that the parameters have been re-ordered from how they appear in
the list of fields: parameters derived from regular fields are
followed by parameters derived from keyword-only fields.

The relative ordering of keyword-only parameters is maintained in the
re-ordered @code{__init__()} parameter list.

@node Default factory functions,Mutable default values,Re-ordering of keyword-only parameters in __init__,dataclasses — Data Classes
@anchor{library/dataclasses default-factory-functions}@anchor{4d0f}
@subsubsection Default factory functions


If a @ref{199e,,field()} specifies a `default_factory', it is called with
zero arguments when a default value for the field is needed.  For
example, to create a new instance of a list, use:

@example
mylist: list = field(default_factory=list)
@end example

If a field is excluded from @ref{8c1,,__init__()} (using @code{init=False})
and the field also specifies `default_factory', then the default
factory function will always be called from the generated
@code{__init__()} function.  This happens because there is no other
way to give the field an initial value.

@node Mutable default values,Descriptor-typed fields,Default factory functions,dataclasses — Data Classes
@anchor{library/dataclasses mutable-default-values}@anchor{4d10}
@subsubsection Mutable default values


Python stores default member variable values in class attributes.
Consider this example, not using dataclasses:

@example
class C:
    x = []
    def add(self, element):
        self.x.append(element)

o1 = C()
o2 = C()
o1.add(1)
o2.add(2)
assert o1.x == [1, 2]
assert o1.x is o2.x
@end example

Note that the two instances of class @code{C} share the same class
variable @code{x}, as expected.

Using dataclasses, `if' this code was valid:

@example
@@dataclass
class D:
    x: list = []      # This code raises ValueError
    def add(self, element):
        self.x.append(element)
@end example

it would generate code similar to:

@example
class D:
    x = []
    def __init__(self, x=x):
        self.x = x
    def add(self, element):
        self.x.append(element)

assert D().x is D().x
@end example

This has the same issue as the original example using class @code{C}.
That is, two instances of class @code{D} that do not specify a value
for @code{x} when creating a class instance will share the same copy
of @code{x}.  Because dataclasses just use normal Python class
creation they also share this behavior.  There is no general way
for Data Classes to detect this condition.  Instead, the
@ref{4e2,,@@dataclass} decorator will raise a @ref{2ee,,ValueError} if it
detects an unhashable default parameter.  The assumption is that if
a value is unhashable, it is mutable.  This is a partial solution,
but it does protect against many common errors.

Using default factory functions is a way to create new instances of
mutable types as default values for fields:

@example
@@dataclass
class D:
    x: list = field(default_factory=list)

assert D().x is not D().x
@end example


Changed in version 3.11: Instead of looking for and disallowing objects of type @ref{24f,,list},
@ref{184,,dict}, or @ref{185,,set}, unhashable objects are now not allowed as
default values.  Unhashability is used to approximate
mutability.


@node Descriptor-typed fields,,Mutable default values,dataclasses — Data Classes
@anchor{library/dataclasses descriptor-typed-fields}@anchor{4d11}
@subsubsection Descriptor-typed fields


Fields that are assigned @ref{e4f,,descriptor objects} as their
default value have the following special behaviors:


@itemize *

@item 
The value for the field passed to the dataclass’s @ref{8c1,,__init__()} method is
passed to the descriptor’s @ref{23fc,,__set__()} method rather than overwriting the
descriptor object.

@item 
Similarly, when getting or setting the field, the descriptor’s
@ref{16f4,,__get__()} or @code{__set__()} method is called rather than returning or
overwriting the descriptor object.

@item 
To determine whether a field contains a default value, @ref{4e2,,@@dataclass}
will call the descriptor’s @code{__get__()} method using its class access
form: @code{descriptor.__get__(obj=None, type=cls)}.  If the
descriptor returns a value in this case, it will be used as the
field’s default. On the other hand, if the descriptor raises
@ref{5f0,,AttributeError} in this situation, no default value will be
provided for the field.
@end itemize

@example
class IntConversionDescriptor:
    def __init__(self, *, default):
        self._default = default

    def __set_name__(self, owner, name):
        self._name = "_" + name

    def __get__(self, obj, type):
        if obj is None:
            return self._default

        return getattr(obj, self._name, self._default)

    def __set__(self, obj, value):
        setattr(obj, self._name, int(value))

@@dataclass
class InventoryItem:
    quantity_on_hand: IntConversionDescriptor = IntConversionDescriptor(default=100)

i = InventoryItem()
print(i.quantity_on_hand)   # 100
i.quantity_on_hand = 2.5    # calls __set__ with 2.5
print(i.quantity_on_hand)   # 2
@end example

Note that if a field is annotated with a descriptor type, but is not assigned
a descriptor object as its default value, the field will act like a normal
field.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node contextlib — Utilities for with-statement contexts,abc — Abstract Base Classes,dataclasses — Data Classes,Python Runtime Services
@anchor{library/contextlib doc}@anchor{4d12}@anchor{library/contextlib contextlib-utilities-for-with-statement-contexts}@anchor{4d13}@anchor{library/contextlib module-contextlib}@anchor{27}@anchor{library/contextlib translation-repo}@anchor{4d14}
@subsection @code{contextlib} — Utilities for @code{with}-statement contexts


@geindex module; contextlib

`Source code:' Lib/contextlib.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/contextlib.py}


__________________________________________________________________


This module provides utilities for common tasks involving the @ref{187,,with}
statement. For more information see also @ref{2453,,Context Manager Types} and
@ref{23c5,,With Statement Context Managers}.

@menu
* Utilities:: 
* Examples and Recipes: Examples and Recipes<3>. 
* Single use@comma{} reusable and reentrant context managers: Single use reusable and reentrant context managers. 

@end menu

@node Utilities,Examples and Recipes<3>,,contextlib — Utilities for with-statement contexts
@anchor{library/contextlib utilities}@anchor{4d15}
@subsubsection Utilities


Functions and classes provided:

@geindex AbstractContextManager (class in contextlib)
@anchor{library/contextlib contextlib AbstractContextManager}@anchor{e90}
@deffn {Class} contextlib.AbstractContextManager

An @ref{13c2,,abstract base class} for classes that implement
@ref{7e5,,__enter__()} and @ref{150c,,__exit__()}. A default
implementation for @code{__enter__()} is provided which returns
@code{self} while @code{__exit__()} is an abstract method which by default
returns @code{None}. See also the definition of @ref{2453,,Context Manager Types}.


Added in version 3.6.

@end deffn

@geindex AbstractAsyncContextManager (class in contextlib)
@anchor{library/contextlib contextlib AbstractAsyncContextManager}@anchor{d26}
@deffn {Class} contextlib.AbstractAsyncContextManager

An @ref{13c2,,abstract base class} for classes that implement
@ref{2465,,__aenter__()} and @ref{19e4,,__aexit__()}. A default
implementation for @code{__aenter__()} is provided which returns
@code{self} while @code{__aexit__()} is an abstract method which by default
returns @code{None}. See also the definition of
@ref{813,,Asynchronous Context Managers}.


Added in version 3.7.

@end deffn

@geindex contextmanager() (in module contextlib)
@anchor{library/contextlib contextlib contextmanager}@anchor{140e}
@deffn {Function} @@contextlib.contextmanager

This function is a @ref{93f,,decorator} that can be used to define a factory
function for @ref{187,,with} statement context managers, without needing to
create a class or separate @ref{7e5,,__enter__()} and @ref{150c,,__exit__()} methods.

While many objects natively support use in with statements, sometimes a
resource needs to be managed that isn’t a context manager in its own right,
and doesn’t implement a @code{close()} method for use with @code{contextlib.closing}.

An abstract example would be the following to ensure correct resource
management:

@example
from contextlib import contextmanager

@@contextmanager
def managed_resource(*args, **kwds):
    # Code to acquire resource, e.g.:
    resource = acquire_resource(*args, **kwds)
    try:
        yield resource
    finally:
        # Code to release resource, e.g.:
        release_resource(resource)
@end example

The function can then be used like this:

@example
>>> with managed_resource(timeout=3600) as resource:
...     # Resource is released at the end of this block,
...     # even if code in the block raises an exception
@end example

The function being decorated must return a @ref{1267,,generator}-iterator when
called. This iterator must yield exactly one value, which will be bound to
the targets in the @ref{187,,with} statement’s @code{as} clause, if any.

At the point where the generator yields, the block nested in the @ref{187,,with}
statement is executed.  The generator is then resumed after the block is exited.
If an unhandled exception occurs in the block, it is reraised inside the
generator at the point where the yield occurred.  Thus, you can use a
@ref{8fa,,try}…@ref{1ac,,except}…@ref{1b1,,finally} statement to trap
the error (if any), or ensure that some cleanup takes place. If an exception is
trapped merely in order to log it or to perform some action (rather than to
suppress it entirely), the generator must reraise that exception. Otherwise the
generator context manager will indicate to the @code{with} statement that
the exception has been handled, and execution will resume with the statement
immediately following the @code{with} statement.

@code{contextmanager()} uses @ref{140d,,ContextDecorator} so the context managers
it creates can be used as decorators as well as in @ref{187,,with} statements.
When used as a decorator, a new generator instance is implicitly created on
each function call (this allows the otherwise “one-shot” context managers
created by @code{contextmanager()} to meet the requirement that context
managers support multiple invocations in order to be used as decorators).


Changed in version 3.2: Use of @ref{140d,,ContextDecorator}.

@end deffn

@geindex asynccontextmanager() (in module contextlib)
@anchor{library/contextlib contextlib asynccontextmanager}@anchor{d25}
@deffn {Function} @@contextlib.asynccontextmanager

Similar to @ref{140e,,contextmanager()}, but creates an
@ref{813,,asynchronous context manager}.

This function is a @ref{93f,,decorator} that can be used to define a factory
function for @ref{186,,async with} statement asynchronous context managers,
without needing to create a class or separate @ref{2465,,__aenter__()} and
@ref{19e4,,__aexit__()} methods. It must be applied to an @ref{24e2,,asynchronous generator} function.

A simple example:

@example
from contextlib import asynccontextmanager

@@asynccontextmanager
async def get_connection():
    conn = await acquire_db_connection()
    try:
        yield conn
    finally:
        await release_db_connection(conn)

async def get_all_users():
    async with get_connection() as conn:
        return conn.query('SELECT ...')
@end example


Added in version 3.7.


Context managers defined with @code{asynccontextmanager()} can be used
either as decorators or with @ref{186,,async with} statements:

@example
import time
from contextlib import asynccontextmanager

@@asynccontextmanager
async def timeit():
    now = time.monotonic()
    try:
        yield
    finally:
        print(f'it took @{time.monotonic() - now@}s to run')

@@timeit()
async def main():
    # ... async code ...
@end example

When used as a decorator, a new generator instance is implicitly created on
each function call. This allows the otherwise “one-shot” context managers
created by @code{asynccontextmanager()} to meet the requirement that context
managers support multiple invocations in order to be used as decorators.


Changed in version 3.10: Async context managers created with @code{asynccontextmanager()} can
be used as decorators.

@end deffn

@geindex closing() (in module contextlib)
@anchor{library/contextlib contextlib closing}@anchor{1595}
@deffn {Function} contextlib.closing (thing)

Return a context manager that closes `thing' upon completion of the block.  This
is basically equivalent to:

@example
from contextlib import contextmanager

@@contextmanager
def closing(thing):
    try:
        yield thing
    finally:
        thing.close()
@end example

And lets you write code like this:

@example
from contextlib import closing
from urllib.request import urlopen

with closing(urlopen('https://www.python.org')) as page:
    for line in page:
        print(line)
@end example

without needing to explicitly close @code{page}.  Even if an error occurs,
@code{page.close()} will be called when the @ref{187,,with} block is exited.

@cartouche
@quotation Note 
Most types managing resources support the @ref{1e3,,context manager} protocol,
which closes `thing' on leaving the @ref{187,,with} statement.
As such, @code{closing()} is most useful for third party types that don’t
support context managers.
This example is purely for illustration purposes,
as @ref{309,,urlopen()} would normally be used in a context manager.
@end quotation
@end cartouche
@end deffn

@geindex aclosing() (in module contextlib)
@anchor{library/contextlib contextlib aclosing}@anchor{9f4}
@deffn {Function} contextlib.aclosing (thing)

Return an async context manager that calls the @code{aclose()} method of `thing'
upon completion of the block.  This is basically equivalent to:

@example
from contextlib import asynccontextmanager

@@asynccontextmanager
async def aclosing(thing):
    try:
        yield thing
    finally:
        await thing.aclose()
@end example

Significantly, @code{aclosing()} supports deterministic cleanup of async
generators when they happen to exit early by @ref{180,,break} or an
exception.  For example:

@example
from contextlib import aclosing

async with aclosing(my_generator()) as values:
    async for value in values:
        if value == 42:
            break
@end example

This pattern ensures that the generator’s async exit code is executed in
the same context as its iterations (so that exceptions and context
variables work as expected, and the exit code isn’t run after the
lifetime of some task it depends on).


Added in version 3.10.

@end deffn

@geindex nullcontext() (in module contextlib)
@anchor{library/contextlib simplifying-support-for-single-optional-context-managers}@anchor{4d16}@anchor{library/contextlib contextlib nullcontext}@anchor{9f5}
@deffn {Function} contextlib.nullcontext (enter_result=None)

Return a context manager that returns `enter_result' from @ref{7e5,,__enter__()}, but
otherwise does nothing. It is intended to be used as a stand-in for an
optional context manager, for example:

@example
def myfunction(arg, ignore_exceptions=False):
    if ignore_exceptions:
        # Use suppress to ignore all exceptions.
        cm = contextlib.suppress(Exception)
    else:
        # Do not ignore any exceptions, cm has no effect.
        cm = contextlib.nullcontext()
    with cm:
        # Do something
@end example

An example using `enter_result':

@example
def process_file(file_or_path):
    if isinstance(file_or_path, str):
        # If string, open file
        cm = open(file_or_path)
    else:
        # Caller is responsible for closing file
        cm = nullcontext(file_or_path)

    with cm as file:
        # Perform processing on the file
@end example

It can also be used as a stand-in for
@ref{813,,asynchronous context managers}:

@example
async def send_http(session=None):
    if not session:
        # If no http session, create it with aiohttp
        cm = aiohttp.ClientSession()
    else:
        # Caller is responsible for closing the session
        cm = nullcontext(session)

    async with cm as session:
        # Send http requests with session
@end example


Added in version 3.7.



Changed in version 3.10: @ref{7f1,,asynchronous context manager} support was added.

@end deffn

@geindex suppress() (in module contextlib)
@anchor{library/contextlib contextlib suppress}@anchor{112e}
@deffn {Function} contextlib.suppress (*exceptions)

Return a context manager that suppresses any of the specified exceptions
if they occur in the body of a @code{with} statement and then
resumes execution with the first statement following the end of the
@code{with} statement.

As with any other mechanism that completely suppresses exceptions, this
context manager should be used only to cover very specific errors where
silently continuing with program execution is known to be the right
thing to do.

For example:

@example
from contextlib import suppress

with suppress(FileNotFoundError):
    os.remove('somefile.tmp')

with suppress(FileNotFoundError):
    os.remove('someotherfile.tmp')
@end example

This code is equivalent to:

@example
try:
    os.remove('somefile.tmp')
except FileNotFoundError:
    pass

try:
    os.remove('someotherfile.tmp')
except FileNotFoundError:
    pass
@end example

This context manager is @ref{4d17,,reentrant}.

If the code within the @code{with} block raises a
@ref{566,,BaseExceptionGroup}, suppressed exceptions are removed from the
group.  Any exceptions of the group which are not suppressed are re-raised in
a new group which is created using the original group’s @ref{1a7e,,derive()}
method.


Added in version 3.4.



Changed in version 3.12: @code{suppress} now supports suppressing exceptions raised as
part of a @ref{566,,BaseExceptionGroup}.

@end deffn

@geindex redirect_stdout() (in module contextlib)
@anchor{library/contextlib contextlib redirect_stdout}@anchor{fed}
@deffn {Function} contextlib.redirect_stdout (new_target)

Context manager for temporarily redirecting @ref{cd3,,sys.stdout} to
another file or file-like object.

This tool adds flexibility to existing functions or classes whose output
is hardwired to stdout.

For example, the output of @ref{ada,,help()} normally is sent to `sys.stdout'.
You can capture that output in a string by redirecting the output to an
@ref{112f,,io.StringIO} object. The replacement stream is returned from the
@ref{7e5,,__enter__()} method and so is available as the target of the
@ref{187,,with} statement:

@example
with redirect_stdout(io.StringIO()) as f:
    help(pow)
s = f.getvalue()
@end example

To send the output of @ref{ada,,help()} to a file on disk, redirect the output
to a regular file:

@example
with open('help.txt', 'w') as f:
    with redirect_stdout(f):
        help(pow)
@end example

To send the output of @ref{ada,,help()} to `sys.stderr':

@example
with redirect_stdout(sys.stderr):
    help(pow)
@end example

Note that the global side effect on @ref{cd3,,sys.stdout} means that this
context manager is not suitable for use in library code and most threaded
applications. It also has no effect on the output of subprocesses.
However, it is still a useful approach for many utility scripts.

This context manager is @ref{4d17,,reentrant}.


Added in version 3.4.

@end deffn

@geindex redirect_stderr() (in module contextlib)
@anchor{library/contextlib contextlib redirect_stderr}@anchor{fec}
@deffn {Function} contextlib.redirect_stderr (new_target)

Similar to @ref{fed,,redirect_stdout()} but redirecting
@ref{b39,,sys.stderr} to another file or file-like object.

This context manager is @ref{4d17,,reentrant}.


Added in version 3.5.

@end deffn

@geindex chdir() (in module contextlib)
@anchor{library/contextlib contextlib chdir}@anchor{821}
@deffn {Function} contextlib.chdir (path)

Non parallel-safe context manager to change the current working directory.
As this changes a global state, the working directory, it is not suitable
for use in most threaded or async contexts. It is also not suitable for most
non-linear code execution, like generators, where the program execution is
temporarily relinquished – unless explicitly desired, you should not yield
when this context manager is active.

This is a simple wrapper around @ref{822,,chdir()}, it changes the current
working directory upon entering and restores the old one on exit.

This context manager is @ref{4d17,,reentrant}.


Added in version 3.11.

@end deffn

@geindex ContextDecorator (class in contextlib)
@anchor{library/contextlib contextlib ContextDecorator}@anchor{140d}
@deffn {Class} contextlib.ContextDecorator

A base class that enables a context manager to also be used as a decorator.

Context managers inheriting from @code{ContextDecorator} have to implement
@ref{7e5,,__enter__()} and @ref{150c,,__exit__()} as normal.
@code{__exit__} retains its optional
exception handling even when used as a decorator.

@code{ContextDecorator} is used by @ref{140e,,contextmanager()}, so you get this
functionality automatically.

Example of @code{ContextDecorator}:

@example
from contextlib import ContextDecorator

class mycontext(ContextDecorator):
    def __enter__(self):
        print('Starting')
        return self

    def __exit__(self, *exc):
        print('Finishing')
        return False
@end example

The class can then be used like this:

@example
>>> @@mycontext()
... def function():
...     print('The bit in the middle')
...
>>> function()
Starting
The bit in the middle
Finishing

>>> with mycontext():
...     print('The bit in the middle')
...
Starting
The bit in the middle
Finishing
@end example

This change is just syntactic sugar for any construct of the following form:

@example
def f():
    with cm():
        # Do stuff
@end example

@code{ContextDecorator} lets you instead write:

@example
@@cm()
def f():
    # Do stuff
@end example

It makes it clear that the @code{cm} applies to the whole function, rather than
just a piece of it (and saving an indentation level is nice, too).

Existing context managers that already have a base class can be extended by
using @code{ContextDecorator} as a mixin class:

@example
from contextlib import ContextDecorator

class mycontext(ContextBaseClass, ContextDecorator):
    def __enter__(self):
        return self

    def __exit__(self, *exc):
        return False
@end example

@cartouche
@quotation Note 
As the decorated function must be able to be called multiple times, the
underlying context manager must support use in multiple @ref{187,,with}
statements. If this is not the case, then the original construct with the
explicit @code{with} statement inside the function should be used.
@end quotation
@end cartouche


Added in version 3.2.

@end deffn

@geindex AsyncContextDecorator (class in contextlib)
@anchor{library/contextlib contextlib AsyncContextDecorator}@anchor{9f6}
@deffn {Class} contextlib.AsyncContextDecorator

Similar to @ref{140d,,ContextDecorator} but only for asynchronous functions.

Example of @code{AsyncContextDecorator}:

@example
from asyncio import run
from contextlib import AsyncContextDecorator

class mycontext(AsyncContextDecorator):
    async def __aenter__(self):
        print('Starting')
        return self

    async def __aexit__(self, *exc):
        print('Finishing')
        return False
@end example

The class can then be used like this:

@example
>>> @@mycontext()
... async def function():
...     print('The bit in the middle')
...
>>> run(function())
Starting
The bit in the middle
Finishing

>>> async def function():
...    async with mycontext():
...         print('The bit in the middle')
...
>>> run(function())
Starting
The bit in the middle
Finishing
@end example


Added in version 3.10.

@end deffn

@geindex ExitStack (class in contextlib)
@anchor{library/contextlib contextlib ExitStack}@anchor{d24}
@deffn {Class} contextlib.ExitStack

A context manager that is designed to make it easy to programmatically
combine other context managers and cleanup functions, especially those
that are optional or otherwise driven by input data.

For example, a set of files may easily be handled in a single with
statement as follows:

@example
with ExitStack() as stack:
    files = [stack.enter_context(open(fname)) for fname in filenames]
    # All opened files will automatically be closed at the end of
    # the with statement, even if attempts to open files later
    # in the list raise an exception
@end example

The @ref{7e5,,__enter__()} method returns the @code{ExitStack} instance, and
performs no additional operations.

Each instance maintains a stack of registered callbacks that are called in
reverse order when the instance is closed (either explicitly or implicitly
at the end of a @ref{187,,with} statement). Note that callbacks are `not'
invoked implicitly when the context stack instance is garbage collected.

This stack model is used so that context managers that acquire their
resources in their @code{__init__} method (such as file objects) can be
handled correctly.

Since registered callbacks are invoked in the reverse order of
registration, this ends up behaving as if multiple nested @ref{187,,with}
statements had been used with the registered set of callbacks. This even
extends to exception handling - if an inner callback suppresses or replaces
an exception, then outer callbacks will be passed arguments based on that
updated state.

This is a relatively low level API that takes care of the details of
correctly unwinding the stack of exit callbacks. It provides a suitable
foundation for higher level context managers that manipulate the exit
stack in application specific ways.


Added in version 3.3.


@geindex enter_context() (contextlib.ExitStack method)
@anchor{library/contextlib contextlib ExitStack enter_context}@anchor{7ef}
@deffn {Method} enter_context (cm)

Enters a new context manager and adds its @ref{150c,,__exit__()} method to
the callback stack. The return value is the result of the context
manager’s own @ref{7e5,,__enter__()} method.

These context managers may suppress exceptions just as they normally
would if used directly as part of a @ref{187,,with} statement.


Changed in version 3.11: Raises @ref{199,,TypeError} instead of @ref{5f0,,AttributeError} if `cm'
is not a context manager.

@end deffn

@geindex push() (contextlib.ExitStack method)
@anchor{library/contextlib contextlib ExitStack push}@anchor{4d18}
@deffn {Method} push (exit)

Adds a context manager’s @ref{150c,,__exit__()} method to the callback stack.

As @code{__enter__} is `not' invoked, this method can be used to cover
part of an @ref{7e5,,__enter__()} implementation with a context manager’s own
@ref{150c,,__exit__()} method.

If passed an object that is not a context manager, this method assumes
it is a callback with the same signature as a context manager’s
@ref{150c,,__exit__()} method and adds it directly to the callback stack.

By returning true values, these callbacks can suppress exceptions the
same way context manager @ref{150c,,__exit__()} methods can.

The passed in object is returned from the function, allowing this
method to be used as a function decorator.
@end deffn

@geindex callback() (contextlib.ExitStack method)
@anchor{library/contextlib contextlib ExitStack callback}@anchor{c7c}
@deffn {Method} callback (callback, /, *args, **kwds)

Accepts an arbitrary callback function and arguments and adds it to
the callback stack.

Unlike the other methods, callbacks added this way cannot suppress
exceptions (as they are never passed the exception details).

The passed in callback is returned from the function, allowing this
method to be used as a function decorator.
@end deffn

@geindex pop_all() (contextlib.ExitStack method)
@anchor{library/contextlib contextlib ExitStack pop_all}@anchor{4d19}
@deffn {Method} pop_all ()

Transfers the callback stack to a fresh @code{ExitStack} instance
and returns it. No callbacks are invoked by this operation - instead,
they will now be invoked when the new stack is closed (either
explicitly or implicitly at the end of a @ref{187,,with} statement).

For example, a group of files can be opened as an “all or nothing”
operation as follows:

@example
with ExitStack() as stack:
    files = [stack.enter_context(open(fname)) for fname in filenames]
    # Hold onto the close method, but don't call it yet.
    close_files = stack.pop_all().close
    # If opening any file fails, all previously opened files will be
    # closed automatically. If all files are opened successfully,
    # they will remain open even after the with statement ends.
    # close_files() can then be invoked explicitly to close them all.
@end example
@end deffn

@geindex close() (contextlib.ExitStack method)
@anchor{library/contextlib contextlib ExitStack close}@anchor{4d1a}
@deffn {Method} close ()

Immediately unwinds the callback stack, invoking callbacks in the
reverse order of registration. For any context managers and exit
callbacks registered, the arguments passed in will indicate that no
exception occurred.
@end deffn
@end deffn

@geindex AsyncExitStack (class in contextlib)
@anchor{library/contextlib contextlib AsyncExitStack}@anchor{d27}
@deffn {Class} contextlib.AsyncExitStack

An @ref{813,,asynchronous context manager}, similar
to @ref{d24,,ExitStack}, that supports combining both synchronous and
asynchronous context managers, as well as having coroutines for
cleanup logic.

The @ref{4d1a,,close()} method is not implemented; @ref{4d1b,,aclose()} must be used
instead.

@geindex enter_async_context() (contextlib.AsyncExitStack method)
@anchor{library/contextlib contextlib AsyncExitStack enter_async_context}@anchor{7f0}
@deffn {Method} async enter_async_context (cm)

Similar to @ref{7ef,,ExitStack.enter_context()} but expects an asynchronous context
manager.


Changed in version 3.11: Raises @ref{199,,TypeError} instead of @ref{5f0,,AttributeError} if `cm'
is not an asynchronous context manager.

@end deffn

@geindex push_async_exit() (contextlib.AsyncExitStack method)
@anchor{library/contextlib contextlib AsyncExitStack push_async_exit}@anchor{4d1c}
@deffn {Method} push_async_exit (exit)

Similar to @ref{4d18,,ExitStack.push()} but expects either an asynchronous context manager
or a coroutine function.
@end deffn

@geindex push_async_callback() (contextlib.AsyncExitStack method)
@anchor{library/contextlib contextlib AsyncExitStack push_async_callback}@anchor{c7d}
@deffn {Method} push_async_callback (callback, /, *args, **kwds)

Similar to @ref{c7c,,ExitStack.callback()} but expects a coroutine function.
@end deffn

@geindex aclose() (contextlib.AsyncExitStack method)
@anchor{library/contextlib contextlib AsyncExitStack aclose}@anchor{4d1b}
@deffn {Method} async aclose ()

Similar to @ref{4d1a,,ExitStack.close()} but properly handles awaitables.
@end deffn

Continuing the example for @ref{d25,,asynccontextmanager()}:

@example
async with AsyncExitStack() as stack:
    connections = [await stack.enter_async_context(get_connection())
        for i in range(5)]
    # All opened connections will automatically be released at the end of
    # the async with statement, even if attempts to open a connection
    # later in the list raise an exception.
@end example


Added in version 3.7.

@end deffn

@node Examples and Recipes<3>,Single use reusable and reentrant context managers,Utilities,contextlib — Utilities for with-statement contexts
@anchor{library/contextlib examples-and-recipes}@anchor{4d1d}
@subsubsection Examples and Recipes


This section describes some examples and recipes for making effective use of
the tools provided by @code{contextlib}.

@menu
* Supporting a variable number of context managers:: 
* Catching exceptions from __enter__ methods:: 
* Cleaning up in an __enter__ implementation:: 
* Replacing any use of try-finally and flag variables:: 
* Using a context manager as a function decorator:: 

@end menu

@node Supporting a variable number of context managers,Catching exceptions from __enter__ methods,,Examples and Recipes<3>
@anchor{library/contextlib supporting-a-variable-number-of-context-managers}@anchor{4d1e}
@subsubsection Supporting a variable number of context managers


The primary use case for @ref{d24,,ExitStack} is the one given in the class
documentation: supporting a variable number of context managers and other
cleanup operations in a single @ref{187,,with} statement. The variability
may come from the number of context managers needed being driven by user
input (such as opening a user specified collection of files), or from
some of the context managers being optional:

@example
with ExitStack() as stack:
    for resource in resources:
        stack.enter_context(resource)
    if need_special_resource():
        special = acquire_special_resource()
        stack.callback(release_special_resource, special)
    # Perform operations that use the acquired resources
@end example

As shown, @ref{d24,,ExitStack} also makes it quite easy to use @ref{187,,with}
statements to manage arbitrary resources that don’t natively support the
context management protocol.

@node Catching exceptions from __enter__ methods,Cleaning up in an __enter__ implementation,Supporting a variable number of context managers,Examples and Recipes<3>
@anchor{library/contextlib catching-exceptions-from-enter-methods}@anchor{4d1f}
@subsubsection Catching exceptions from @code{__enter__} methods


It is occasionally desirable to catch exceptions from an @ref{7e5,,__enter__()}
method implementation, `without' inadvertently catching exceptions from
the @ref{187,,with} statement body or the context manager’s @ref{150c,,__exit__()}
method. By using @ref{d24,,ExitStack} the steps in the context management
protocol can be separated slightly in order to allow this:

@example
stack = ExitStack()
try:
    x = stack.enter_context(cm)
except Exception:
    # handle __enter__ exception
else:
    with stack:
        # Handle normal case
@end example

Actually needing to do this is likely to indicate that the underlying API
should be providing a direct resource management interface for use with
@ref{8fa,,try}/@ref{1ac,,except}/@ref{1b1,,finally} statements, but not
all APIs are well designed in that regard. When a context manager is the
only resource management API provided, then @ref{d24,,ExitStack} can make it
easier to handle various situations that can’t be handled directly in a
@ref{187,,with} statement.

@node Cleaning up in an __enter__ implementation,Replacing any use of try-finally and flag variables,Catching exceptions from __enter__ methods,Examples and Recipes<3>
@anchor{library/contextlib cleaning-up-in-an-enter-implementation}@anchor{4d20}
@subsubsection Cleaning up in an @code{__enter__} implementation


As noted in the documentation of @ref{4d18,,ExitStack.push()}, this
method can be useful in cleaning up an already allocated resource if later
steps in the @ref{7e5,,__enter__()} implementation fail.

Here’s an example of doing this for a context manager that accepts resource
acquisition and release functions, along with an optional validation function,
and maps them to the context management protocol:

@example
from contextlib import contextmanager, AbstractContextManager, ExitStack

class ResourceManager(AbstractContextManager):

    def __init__(self, acquire_resource, release_resource, check_resource_ok=None):
        self.acquire_resource = acquire_resource
        self.release_resource = release_resource
        if check_resource_ok is None:
            def check_resource_ok(resource):
                return True
        self.check_resource_ok = check_resource_ok

    @@contextmanager
    def _cleanup_on_error(self):
        with ExitStack() as stack:
            stack.push(self)
            yield
            # The validation check passed and didn't raise an exception
            # Accordingly, we want to keep the resource, and pass it
            # back to our caller
            stack.pop_all()

    def __enter__(self):
        resource = self.acquire_resource()
        with self._cleanup_on_error():
            if not self.check_resource_ok(resource):
                msg = "Failed validation for @{!r@}"
                raise RuntimeError(msg.format(resource))
        return resource

    def __exit__(self, *exc_details):
        # We don't need to duplicate any of our resource release logic
        self.release_resource()
@end example

@node Replacing any use of try-finally and flag variables,Using a context manager as a function decorator,Cleaning up in an __enter__ implementation,Examples and Recipes<3>
@anchor{library/contextlib replacing-any-use-of-try-finally-and-flag-variables}@anchor{4d21}
@subsubsection Replacing any use of @code{try-finally} and flag variables


A pattern you will sometimes see is a @code{try-finally} statement with a flag
variable to indicate whether or not the body of the @code{finally} clause should
be executed. In its simplest form (that can’t already be handled just by
using an @code{except} clause instead), it looks something like this:

@example
cleanup_needed = True
try:
    result = perform_operation()
    if result:
        cleanup_needed = False
finally:
    if cleanup_needed:
        cleanup_resources()
@end example

As with any @code{try} statement based code, this can cause problems for
development and review, because the setup code and the cleanup code can end
up being separated by arbitrarily long sections of code.

@ref{d24,,ExitStack} makes it possible to instead register a callback for
execution at the end of a @code{with} statement, and then later decide to skip
executing that callback:

@example
from contextlib import ExitStack

with ExitStack() as stack:
    stack.callback(cleanup_resources)
    result = perform_operation()
    if result:
        stack.pop_all()
@end example

This allows the intended cleanup behaviour to be made explicit up front,
rather than requiring a separate flag variable.

If a particular application uses this pattern a lot, it can be simplified
even further by means of a small helper class:

@example
from contextlib import ExitStack

class Callback(ExitStack):
    def __init__(self, callback, /, *args, **kwds):
        super().__init__()
        self.callback(callback, *args, **kwds)

    def cancel(self):
        self.pop_all()

with Callback(cleanup_resources) as cb:
    result = perform_operation()
    if result:
        cb.cancel()
@end example

If the resource cleanup isn’t already neatly bundled into a standalone
function, then it is still possible to use the decorator form of
@ref{c7c,,ExitStack.callback()} to declare the resource cleanup in
advance:

@example
from contextlib import ExitStack

with ExitStack() as stack:
    @@stack.callback
    def cleanup_resources():
        ...
    result = perform_operation()
    if result:
        stack.pop_all()
@end example

Due to the way the decorator protocol works, a callback function
declared this way cannot take any parameters. Instead, any resources to
be released must be accessed as closure variables.

@node Using a context manager as a function decorator,,Replacing any use of try-finally and flag variables,Examples and Recipes<3>
@anchor{library/contextlib using-a-context-manager-as-a-function-decorator}@anchor{4d22}
@subsubsection Using a context manager as a function decorator


@ref{140d,,ContextDecorator} makes it possible to use a context manager in
both an ordinary @code{with} statement and also as a function decorator.

For example, it is sometimes useful to wrap functions or groups of statements
with a logger that can track the time of entry and time of exit.  Rather than
writing both a function decorator and a context manager for the task,
inheriting from @ref{140d,,ContextDecorator} provides both capabilities in a
single definition:

@example
from contextlib import ContextDecorator
import logging

logging.basicConfig(level=logging.INFO)

class track_entry_and_exit(ContextDecorator):
    def __init__(self, name):
        self.name = name

    def __enter__(self):
        logging.info('Entering: %s', self.name)

    def __exit__(self, exc_type, exc, exc_tb):
        logging.info('Exiting: %s', self.name)
@end example

Instances of this class can be used as both a context manager:

@example
with track_entry_and_exit('widget loader'):
    print('Some time consuming activity goes here')
    load_widget()
@end example

And also as a function decorator:

@example
@@track_entry_and_exit('widget loader')
def activity():
    print('Some time consuming activity goes here')
    load_widget()
@end example

Note that there is one additional limitation when using context managers
as function decorators: there’s no way to access the return value of
@ref{7e5,,__enter__()}. If that value is needed, then it is still necessary to use
an explicit @code{with} statement.


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 343

@item PEP 343@footnote{https://peps.python.org/pep-0343/} - The “with” statement

The specification, background, and examples for the Python @ref{187,,with}
statement.
@end table


@node Single use reusable and reentrant context managers,,Examples and Recipes<3>,contextlib — Utilities for with-statement contexts
@anchor{library/contextlib single-use-reusable-and-reentrant-cms}@anchor{1130}@anchor{library/contextlib single-use-reusable-and-reentrant-context-managers}@anchor{4d23}
@subsubsection Single use, reusable and reentrant context managers


Most context managers are written in a way that means they can only be
used effectively in a @ref{187,,with} statement once. These single use
context managers must be created afresh each time they’re used -
attempting to use them a second time will trigger an exception or
otherwise not work correctly.

This common limitation means that it is generally advisable to create
context managers directly in the header of the @ref{187,,with} statement
where they are used (as shown in all of the usage examples above).

Files are an example of effectively single use context managers, since
the first @ref{187,,with} statement will close the file, preventing any
further IO operations using that file object.

Context managers created using @ref{140e,,contextmanager()} are also single use
context managers, and will complain about the underlying generator failing
to yield if an attempt is made to use them a second time:

@example
>>> from contextlib import contextmanager
>>> @@contextmanager
... def singleuse():
...     print("Before")
...     yield
...     print("After")
...
>>> cm = singleuse()
>>> with cm:
...     pass
...
Before
After
>>> with cm:
...     pass
...
Traceback (most recent call last):
    ...
RuntimeError: generator didn't yield
@end example

@menu
* Reentrant context managers:: 
* Reusable context managers:: 

@end menu

@node Reentrant context managers,Reusable context managers,,Single use reusable and reentrant context managers
@anchor{library/contextlib reentrant-cms}@anchor{4d17}@anchor{library/contextlib reentrant-context-managers}@anchor{4d24}
@subsubsection Reentrant context managers


More sophisticated context managers may be “reentrant”. These context
managers can not only be used in multiple @ref{187,,with} statements,
but may also be used `inside' a @code{with} statement that is already
using the same context manager.

@ref{32c,,threading.RLock} is an example of a reentrant context manager, as are
@ref{112e,,suppress()}, @ref{fed,,redirect_stdout()}, and @ref{821,,chdir()}. Here’s a very
simple example of reentrant use:

@example
>>> from contextlib import redirect_stdout
>>> from io import StringIO
>>> stream = StringIO()
>>> write_to_stream = redirect_stdout(stream)
>>> with write_to_stream:
...     print("This is written to the stream rather than stdout")
...     with write_to_stream:
...         print("This is also written to the stream")
...
>>> print("This is written directly to stdout")
This is written directly to stdout
>>> print(stream.getvalue())
This is written to the stream rather than stdout
This is also written to the stream
@end example

Real world examples of reentrancy are more likely to involve multiple
functions calling each other and hence be far more complicated than this
example.

Note also that being reentrant is `not' the same thing as being thread safe.
@ref{fed,,redirect_stdout()}, for example, is definitely not thread safe, as it
makes a global modification to the system state by binding @ref{cd3,,sys.stdout}
to a different stream.

@node Reusable context managers,,Reentrant context managers,Single use reusable and reentrant context managers
@anchor{library/contextlib reusable-cms}@anchor{4d25}@anchor{library/contextlib reusable-context-managers}@anchor{4d26}
@subsubsection Reusable context managers


Distinct from both single use and reentrant context managers are “reusable”
context managers (or, to be completely explicit, “reusable, but not
reentrant” context managers, since reentrant context managers are also
reusable). These context managers support being used multiple times, but
will fail (or otherwise not work correctly) if the specific context manager
instance has already been used in a containing with statement.

@ref{1a39,,threading.Lock} is an example of a reusable, but not reentrant,
context manager (for a reentrant lock, it is necessary to use
@ref{32c,,threading.RLock} instead).

Another example of a reusable, but not reentrant, context manager is
@ref{d24,,ExitStack}, as it invokes `all' currently registered callbacks
when leaving any with statement, regardless of where those callbacks
were added:

@example
>>> from contextlib import ExitStack
>>> stack = ExitStack()
>>> with stack:
...     stack.callback(print, "Callback: from first context")
...     print("Leaving first context")
...
Leaving first context
Callback: from first context
>>> with stack:
...     stack.callback(print, "Callback: from second context")
...     print("Leaving second context")
...
Leaving second context
Callback: from second context
>>> with stack:
...     stack.callback(print, "Callback: from outer context")
...     with stack:
...         stack.callback(print, "Callback: from inner context")
...         print("Leaving inner context")
...     print("Leaving outer context")
...
Leaving inner context
Callback: from inner context
Callback: from outer context
Leaving outer context
@end example

As the output from the example shows, reusing a single stack object across
multiple with statements works correctly, but attempting to nest them
will cause the stack to be cleared at the end of the innermost with
statement, which is unlikely to be desirable behaviour.

Using separate @ref{d24,,ExitStack} instances instead of reusing a single
instance avoids that problem:

@example
>>> from contextlib import ExitStack
>>> with ExitStack() as outer_stack:
...     outer_stack.callback(print, "Callback: from outer context")
...     with ExitStack() as inner_stack:
...         inner_stack.callback(print, "Callback: from inner context")
...         print("Leaving inner context")
...     print("Leaving outer context")
...
Leaving inner context
Callback: from inner context
Leaving outer context
Callback: from outer context
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node abc — Abstract Base Classes,atexit — Exit handlers,contextlib — Utilities for with-statement contexts,Python Runtime Services
@anchor{library/abc doc}@anchor{4d27}@anchor{library/abc abc-abstract-base-classes}@anchor{4d28}@anchor{library/abc module-abc}@anchor{4}@anchor{library/abc translation-repo}@anchor{4d29}
@subsection @code{abc} — Abstract Base Classes


@geindex module; abc

@c much of the content adapted from docstrings

`Source code:' Lib/abc.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/abc.py}


__________________________________________________________________


This module provides the infrastructure for defining @ref{13c2,,abstract base classes} (ABCs) in Python, as outlined in 
@geindex Python Enhancement Proposals; PEP 3119
PEP 3119@footnote{https://peps.python.org/pep-3119/};
see the PEP for why this was added to Python. (See also 
@geindex Python Enhancement Proposals; PEP 3141
PEP 3141@footnote{https://peps.python.org/pep-3141/} and the
@ref{a2,,numbers} module regarding a type hierarchy for numbers based on ABCs.)

The @ref{1e,,collections} module has some concrete classes that derive from
ABCs; these can, of course, be further derived. In addition, the
@ref{1f,,collections.abc} submodule has some ABCs that can be used to test whether
a class or instance provides a particular interface, for example, if it is
@ref{825,,hashable} or if it is a @ref{13c7,,mapping}.

This module provides the metaclass @ref{1121,,ABCMeta} for defining ABCs and
a helper class @ref{1120,,ABC} to alternatively define ABCs through inheritance:

@geindex ABC (class in abc)
@anchor{library/abc abc ABC}@anchor{1120}
@deffn {Class} abc.ABC

A helper class that has @ref{1121,,ABCMeta} as its metaclass.  With this class,
an abstract base class can be created by simply deriving from @code{ABC}
avoiding sometimes confusing metaclass usage, for example:

@example
from abc import ABC

class MyABC(ABC):
    pass
@end example

Note that the type of @code{ABC} is still @ref{1121,,ABCMeta}, therefore
inheriting from @code{ABC} requires the usual precautions regarding
metaclass usage, as multiple inheritance may lead to metaclass conflicts.
One may also define an abstract base class by passing the metaclass
keyword and using @code{ABCMeta} directly, for example:

@example
from abc import ABCMeta

class MyABC(metaclass=ABCMeta):
    pass
@end example


Added in version 3.4.

@end deffn

@geindex ABCMeta (class in abc)
@anchor{library/abc abc ABCMeta}@anchor{1121}
@deffn {Class} abc.ABCMeta

Metaclass for defining Abstract Base Classes (ABCs).

Use this metaclass to create an ABC.  An ABC can be subclassed directly, and
then acts as a mix-in class.  You can also register unrelated concrete
classes (even built-in classes) and unrelated ABCs as “virtual subclasses” –
these and their descendants will be considered subclasses of the registering
ABC by the built-in @ref{9ca,,issubclass()} function, but the registering ABC
won’t show up in their MRO (Method Resolution Order) nor will method
implementations defined by the registering ABC be callable (not even via
@ref{1a7,,super()}). @footnote{
C++ programmers should note that Python’s virtual base class
concept is not the same as C++’s.
}

Classes created with a metaclass of @code{ABCMeta} have the following method:

@geindex register() (abc.ABCMeta method)
@anchor{library/abc abc ABCMeta register}@anchor{1294}
@deffn {Method} register (subclass)

Register `subclass' as a “virtual subclass” of this ABC. For
example:

@example
from abc import ABC

class MyABC(ABC):
    pass

MyABC.register(tuple)

assert issubclass(tuple, MyABC)
assert isinstance((), MyABC)
@end example


Changed in version 3.3: Returns the registered subclass, to allow usage as a class decorator.



Changed in version 3.4: To detect calls to @code{register()}, you can use the
@ref{111f,,get_cache_token()} function.

@end deffn

You can also override this method in an abstract base class:

@geindex __subclasshook__() (abc.ABCMeta method)
@anchor{library/abc abc ABCMeta __subclasshook__}@anchor{2a03}
@deffn {Method} __subclasshook__ (subclass)

(Must be defined as a class method.)

Check whether `subclass' is considered a subclass of this ABC.  This means
that you can customize the behavior of @ref{9ca,,issubclass()} further without the
need to call @ref{1294,,register()} on every class you want to consider a
subclass of the ABC.  (This class method is called from the
@ref{240e,,__subclasscheck__()} method of the ABC.)

This method should return @code{True}, @code{False} or @ref{1a3,,NotImplemented}.  If
it returns @code{True}, the `subclass' is considered a subclass of this ABC.
If it returns @code{False}, the `subclass' is not considered a subclass of
this ABC, even if it would normally be one.  If it returns
@code{NotImplemented}, the subclass check is continued with the usual
mechanism.

@c XXX explain the "usual mechanism"
@end deffn

For a demonstration of these concepts, look at this example ABC definition:

@example
class Foo:
    def __getitem__(self, index):
        ...
    def __len__(self):
        ...
    def get_iterator(self):
        return iter(self)

class MyIterable(ABC):

    @@abstractmethod
    def __iter__(self):
        while False:
            yield None

    def get_iterator(self):
        return self.__iter__()

    @@classmethod
    def __subclasshook__(cls, C):
        if cls is MyIterable:
            if any("__iter__" in B.__dict__ for B in C.__mro__):
                return True
        return NotImplemented

MyIterable.register(Foo)
@end example

The ABC @code{MyIterable} defines the standard iterable method,
@ref{e6f,,__iter__()}, as an abstract method.  The implementation given
here can still be called from subclasses.  The @code{get_iterator()} method
is also part of the @code{MyIterable} abstract base class, but it does not have
to be overridden in non-abstract derived classes.

The @ref{2a03,,__subclasshook__()} class method defined here says that any class
that has an @ref{e6f,,__iter__()} method in its
@ref{77e,,__dict__} (or in that of one of its base classes, accessed
via the @ref{23bb,,__mro__} list) is considered a @code{MyIterable} too.

Finally, the last line makes @code{Foo} a virtual subclass of @code{MyIterable},
even though it does not define an @ref{e6f,,__iter__()} method (it uses
the old-style iterable protocol, defined in terms of @ref{17e1,,__len__()} and
@ref{588,,__getitem__()}).  Note that this will not make @code{get_iterator}
available as a method of @code{Foo}, so it is provided separately.
@end deffn

The @code{abc} module also provides the following decorator:

@geindex abstractmethod() (in module abc)
@anchor{library/abc abc abstractmethod}@anchor{1291}
@deffn {Function} @@abc.abstractmethod

A decorator indicating abstract methods.

Using this decorator requires that the class’s metaclass is @ref{1121,,ABCMeta}
or is derived from it.  A class that has a metaclass derived from
@code{ABCMeta} cannot be instantiated unless all of its abstract methods
and properties are overridden.  The abstract methods can be called using any
of the normal ‘super’ call mechanisms.  @code{abstractmethod()} may be used
to declare abstract methods for properties and descriptors.

Dynamically adding abstract methods to a class, or attempting to modify the
abstraction status of a method or class once it is created, are only
supported using the @ref{4d2a,,update_abstractmethods()} function.  The
@code{abstractmethod()} only affects subclasses derived using regular
inheritance; “virtual subclasses” registered with the ABC’s
@ref{1294,,register()} method are not affected.

When @code{abstractmethod()} is applied in combination with other method
descriptors, it should be applied as the innermost decorator, as shown in
the following usage examples:

@example
class C(ABC):
    @@abstractmethod
    def my_abstract_method(self, arg1):
        ...
    @@classmethod
    @@abstractmethod
    def my_abstract_classmethod(cls, arg2):
        ...
    @@staticmethod
    @@abstractmethod
    def my_abstract_staticmethod(arg3):
        ...

    @@property
    @@abstractmethod
    def my_abstract_property(self):
        ...
    @@my_abstract_property.setter
    @@abstractmethod
    def my_abstract_property(self, val):
        ...

    @@abstractmethod
    def _get_x(self):
        ...
    @@abstractmethod
    def _set_x(self, val):
        ...
    x = property(_get_x, _set_x)
@end example

In order to correctly interoperate with the abstract base class machinery,
the descriptor must identify itself as abstract using
@code{__isabstractmethod__}. In general, this attribute should be @code{True}
if any of the methods used to compose the descriptor are abstract. For
example, Python’s built-in @ref{4b4,,property} does the equivalent of:

@example
class Descriptor:
    ...
    @@property
    def __isabstractmethod__(self):
        return any(getattr(f, '__isabstractmethod__', False) for
                   f in (self._fget, self._fset, self._fdel))
@end example

@cartouche
@quotation Note 
Unlike Java abstract methods, these abstract
methods may have an implementation. This implementation can be
called via the @ref{1a7,,super()} mechanism from the class that
overrides it.  This could be useful as an end-point for a
super-call in a framework that uses cooperative
multiple-inheritance.
@end quotation
@end cartouche
@end deffn

The @code{abc} module also supports the following legacy decorators:

@geindex abstractclassmethod() (in module abc)
@anchor{library/abc abc abstractclassmethod}@anchor{1292}
@deffn {Function} @@abc.abstractclassmethod


Added in version 3.2.



Deprecated since version 3.3: It is now possible to use @ref{48f,,classmethod} with
@ref{1291,,abstractmethod()}, making this decorator redundant.


A subclass of the built-in @ref{48f,,classmethod()}, indicating an abstract
classmethod. Otherwise it is similar to @ref{1291,,abstractmethod()}.

This special case is deprecated, as the @ref{48f,,classmethod()} decorator
is now correctly identified as abstract when applied to an abstract
method:

@example
class C(ABC):
    @@classmethod
    @@abstractmethod
    def my_abstract_classmethod(cls, arg):
        ...
@end example
@end deffn

@geindex abstractstaticmethod() (in module abc)
@anchor{library/abc abc abstractstaticmethod}@anchor{1293}
@deffn {Function} @@abc.abstractstaticmethod


Added in version 3.2.



Deprecated since version 3.3: It is now possible to use @ref{451,,staticmethod} with
@ref{1291,,abstractmethod()}, making this decorator redundant.


A subclass of the built-in @ref{451,,staticmethod()}, indicating an abstract
staticmethod. Otherwise it is similar to @ref{1291,,abstractmethod()}.

This special case is deprecated, as the @ref{451,,staticmethod()} decorator
is now correctly identified as abstract when applied to an abstract
method:

@example
class C(ABC):
    @@staticmethod
    @@abstractmethod
    def my_abstract_staticmethod(arg):
        ...
@end example
@end deffn

@geindex abstractproperty() (in module abc)
@anchor{library/abc abc abstractproperty}@anchor{1290}
@deffn {Function} @@abc.abstractproperty


Deprecated since version 3.3: It is now possible to use @ref{4b4,,property}, @ref{1a1d,,property.getter()},
@ref{1a1e,,property.setter()} and @ref{1a1f,,property.deleter()} with
@ref{1291,,abstractmethod()}, making this decorator redundant.


A subclass of the built-in @ref{4b4,,property()}, indicating an abstract
property.

This special case is deprecated, as the @ref{4b4,,property()} decorator
is now correctly identified as abstract when applied to an abstract
method:

@example
class C(ABC):
    @@property
    @@abstractmethod
    def my_abstract_property(self):
        ...
@end example

The above example defines a read-only property; you can also define a
read-write abstract property by appropriately marking one or more of the
underlying methods as abstract:

@example
class C(ABC):
    @@property
    def x(self):
        ...

    @@x.setter
    @@abstractmethod
    def x(self, val):
        ...
@end example

If only some components are abstract, only those components need to be
updated to create a concrete property in a subclass:

@example
class D(C):
    @@C.x.setter
    def x(self, val):
        ...
@end example
@end deffn

The @code{abc} module also provides the following functions:

@geindex get_cache_token() (in module abc)
@anchor{library/abc abc get_cache_token}@anchor{111f}
@deffn {Function} abc.get_cache_token ()

Returns the current abstract base class cache token.

The token is an opaque object (that supports equality testing) identifying
the current version of the abstract base class cache for virtual subclasses.
The token changes with every call to @ref{1294,,ABCMeta.register()} on any ABC.


Added in version 3.4.

@end deffn

@geindex update_abstractmethods() (in module abc)
@anchor{library/abc abc update_abstractmethods}@anchor{4d2a}
@deffn {Function} abc.update_abstractmethods (cls)

A function to recalculate an abstract class’s abstraction status. This
function should be called if a class’s abstract methods have been
implemented or changed after it was created. Usually, this function should
be called from within a class decorator.

Returns `cls', to allow usage as a class decorator.

If `cls' is not an instance of @ref{1121,,ABCMeta}, does nothing.

@cartouche
@quotation Note 
This function assumes that `cls'’s superclasses are already updated.
It does not update any subclasses.
@end quotation
@end cartouche


Added in version 3.10.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node atexit — Exit handlers,traceback — Print or retrieve a stack traceback,abc — Abstract Base Classes,Python Runtime Services
@anchor{library/atexit doc}@anchor{4d2b}@anchor{library/atexit atexit-exit-handlers}@anchor{4d2c}@anchor{library/atexit module-atexit}@anchor{d}@anchor{library/atexit translation-repo}@anchor{4d2d}
@subsection @code{atexit} — Exit handlers


@geindex module; atexit


__________________________________________________________________


The @code{atexit} module defines functions to register and unregister cleanup
functions.  Functions thus registered are automatically executed upon normal
interpreter termination.  @code{atexit} runs these functions in the `reverse'
order in which they were registered; if you register @code{A}, @code{B}, and @code{C},
at interpreter termination time they will be run in the order @code{C}, @code{B},
@code{A}.

`Note:' The functions registered via this module are not called when the
program is killed by a signal not handled by Python, when a Python fatal
internal error is detected, or when @ref{2742,,os._exit()} is called.

`Note:' The effect of registering or unregistering functions from within
a cleanup function is undefined.


Changed in version 3.7: When used with C-API subinterpreters, registered functions
are local to the interpreter they were registered in.


@geindex register() (in module atexit)
@anchor{library/atexit atexit register}@anchor{a84}
@deffn {Function} atexit.register (func, *args, **kwargs)

Register `func' as a function to be executed at termination.  Any optional
arguments that are to be passed to `func' must be passed as arguments to
@code{register()}.  It is possible to register the same function and arguments
more than once.

At normal program termination (for instance, if @ref{279,,sys.exit()} is called or
the main module’s execution completes), all functions registered are called in
last in, first out order.  The assumption is that lower level modules will
normally be imported before higher level modules and thus must be cleaned up
later.

If an exception is raised during execution of the exit handlers, a traceback is
printed (unless @ref{f42,,SystemExit} is raised) and the exception information is
saved.  After all exit handlers have had a chance to run, the last exception to
be raised is re-raised.

This function returns `func', which makes it possible to use it as a
decorator.

@cartouche
@quotation Warning 
Starting new threads or calling @ref{4b6,,os.fork()} from a registered
function can lead to race condition between the main Python
runtime thread freeing thread states while internal @ref{f3,,threading}
routines or the new process try to use that state. This can lead to
crashes rather than clean shutdown.
@end quotation
@end cartouche


Changed in version 3.12: Attempts to start a new thread or @ref{4b6,,os.fork()} a new process
in a registered function now leads to @ref{246,,RuntimeError}.

@end deffn

@geindex unregister() (in module atexit)
@anchor{library/atexit atexit unregister}@anchor{17d0}
@deffn {Function} atexit.unregister (func)

Remove `func' from the list of functions to be run at interpreter shutdown.
@code{unregister()} silently does nothing if `func' was not previously
registered.  If `func' has been registered more than once, every occurrence
of that function in the @code{atexit} call stack will be removed.  Equality
comparisons (@code{==}) are used internally during unregistration, so function
references do not need to have matching identities.
@end deffn


@subsubheading See also



@table @asis

@item Module @ref{bf,,readline}

Useful example of @code{atexit} to read and write @ref{bf,,readline} history
files.
@end table


@menu
* atexit Example:: 

@end menu

@node atexit Example,,,atexit — Exit handlers
@anchor{library/atexit atexit-example}@anchor{4d2e}@anchor{library/atexit id1}@anchor{4d2f}
@subsubsection @code{atexit} Example


The following simple example demonstrates how a module can initialize a counter
from a file when it is imported and save the counter’s updated value
automatically when the program terminates without relying on the application
making an explicit call into this module at termination.

@example
try:
    with open('counterfile') as infile:
        _count = int(infile.read())
except FileNotFoundError:
    _count = 0

def incrcounter(n):
    global _count
    _count = _count + n

def savecounter():
    with open('counterfile', 'w') as outfile:
        outfile.write('%d' % _count)

import atexit

atexit.register(savecounter)
@end example

Positional and keyword arguments may also be passed to @ref{a84,,register()} to be
passed along to the registered function when it is called:

@example
def goodbye(name, adjective):
    print('Goodbye %s, it was %s to meet you.' % (name, adjective))

import atexit

atexit.register(goodbye, 'Donny', 'nice')
# or:
atexit.register(goodbye, adjective='nice', name='Donny')
@end example

Usage as a @ref{93f,,decorator}:

@example
import atexit

@@atexit.register
def goodbye():
    print('You are now leaving the Python sector.')
@end example

This only works with functions that can be called without arguments.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node traceback — Print or retrieve a stack traceback,__future__ — Future statement definitions,atexit — Exit handlers,Python Runtime Services
@anchor{library/traceback doc}@anchor{4d30}@anchor{library/traceback module-traceback}@anchor{105}@anchor{library/traceback traceback-print-or-retrieve-a-stack-traceback}@anchor{4d31}@anchor{library/traceback translation-repo}@anchor{4d32}
@subsection @code{traceback} — Print or retrieve a stack traceback


@geindex module; traceback

`Source code:' Lib/traceback.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/traceback.py}


__________________________________________________________________


This module provides a standard interface to extract, format and print
stack traces of Python programs. It is more flexible than the
interpreter’s default traceback display, and therefore makes it
possible to configure certain aspects of the output. Finally,
it contains a utility for capturing enough information about an
exception to print it later, without the need to save a reference
to the actual exception. Since exceptions can be the roots of large
objects graph, this utility can significantly improve
memory management.

@geindex object; traceback

The module uses @ref{cf2,,traceback objects} — these are
objects of type @ref{cf0,,types.TracebackType},
which are assigned to the @ref{14d2,,__traceback__} field of
@ref{7d8,,BaseException} instances.


@subsubheading See also



@table @asis

@item Module @ref{5c,,faulthandler}

Used to dump Python tracebacks explicitly, on a fault, after a timeout, or on a user signal.

@item Module @ref{aa,,pdb}

Interactive source code debugger for Python programs.
@end table


The module’s API can be divided into two parts:


@itemize *

@item 
Module-level functions offering basic functionality, which are useful for interactive
inspection of exceptions and tracebacks.

@item 
@ref{563,,TracebackException} class and its helper classes
@ref{1089,,StackSummary} and @ref{108a,,FrameSummary}. These offer both more
flexibility in the output generated and the ability to store the information
necessary for later formatting without holding references to actual exception
and traceback objects.
@end itemize


Added in version 3.13: Output is colorized by default and can be
@ref{1b9,,controlled using environment variables}.


@menu
* Module-Level Functions: Module-Level Functions<2>. 
* TracebackException Objects:: 
* StackSummary Objects:: 
* FrameSummary Objects:: 
* Examples of Using the Module-Level Functions:: 
* Examples of Using TracebackException:: 

@end menu

@node Module-Level Functions<2>,TracebackException Objects,,traceback — Print or retrieve a stack traceback
@anchor{library/traceback module-level-functions}@anchor{4d33}
@subsubsection Module-Level Functions


@geindex print_tb() (in module traceback)
@anchor{library/traceback traceback print_tb}@anchor{108b}
@deffn {Function} traceback.print_tb (tb, limit=None, file=None)

Print up to `limit' stack trace entries from
@ref{cf2,,traceback object} `tb' (starting
from the caller’s frame) if `limit' is positive.  Otherwise, print the last
@code{abs(limit)} entries.  If `limit' is omitted or @code{None}, all entries are
printed.  If `file' is omitted or @code{None}, the output goes to
@ref{b39,,sys.stderr}; otherwise it should be an open
@ref{13cf,,file} or @ref{17fd,,file-like object} to
receive the output.

@cartouche
@quotation Note 
The meaning of the `limit' parameter is different than the meaning
of @ref{1988,,sys.tracebacklimit}. A negative `limit' value corresponds to
a positive value of @code{sys.tracebacklimit}, whereas the behaviour of
a positive `limit' value cannot be achieved with
@code{sys.tracebacklimit}.
@end quotation
@end cartouche


Changed in version 3.5: Added negative `limit' support.

@end deffn

@geindex print_exception() (in module traceback)
@anchor{library/traceback traceback print_exception}@anchor{a55}
@deffn {Function} traceback.print_exception (exc, /[, value, tb], limit=None, file=None, chain=True)

Print exception information and stack trace entries from
@ref{cf2,,traceback object}
`tb' to `file'. This differs from @ref{108b,,print_tb()} in the following
ways:


@itemize *

@item 
if `tb' is not @code{None}, it prints a header @code{Traceback (most recent
call last):}

@item 
it prints the exception type and `value' after the stack trace
@end itemize

@geindex ^ (caret); marker


@itemize *

@item 
if `type(value)' is @ref{18f,,SyntaxError} and `value' has the appropriate
format, it prints the line where the syntax error occurred with a caret
indicating the approximate position of the error.
@end itemize

Since Python 3.10, instead of passing `value' and `tb', an exception object
can be passed as the first argument. If `value' and `tb' are provided, the
first argument is ignored in order to provide backwards compatibility.

The optional `limit' argument has the same meaning as for @ref{108b,,print_tb()}.
If `chain' is true (the default), then chained exceptions (the
@ref{14d4,,__cause__} or @ref{14d3,,__context__}
attributes of the exception) will be
printed as well, like the interpreter itself does when printing an unhandled
exception.


Changed in version 3.5: The `etype' argument is ignored and inferred from the type of `value'.



Changed in version 3.10: The `etype' parameter has been renamed to `exc' and is now
positional-only.

@end deffn

@geindex print_exc() (in module traceback)
@anchor{library/traceback traceback print_exc}@anchor{1c67}
@deffn {Function} traceback.print_exc (limit=None, file=None, chain=True)

This is a shorthand for @code{print_exception(sys.exception(), limit=limit, file=file,
chain=chain)}.
@end deffn

@geindex print_last() (in module traceback)
@anchor{library/traceback traceback print_last}@anchor{4d34}
@deffn {Function} traceback.print_last (limit=None, file=None, chain=True)

This is a shorthand for @code{print_exception(sys.last_exc, limit=limit, file=file,
chain=chain)}.  In general it will work only after an exception has reached
an interactive prompt (see @ref{6e6,,sys.last_exc}).
@end deffn

@geindex print_stack() (in module traceback)
@anchor{library/traceback traceback print_stack}@anchor{108c}
@deffn {Function} traceback.print_stack (f=None, limit=None, file=None)

Print up to `limit' stack trace entries (starting from the invocation
point) if `limit' is positive.  Otherwise, print the last @code{abs(limit)}
entries.  If `limit' is omitted or @code{None}, all entries are printed.
The optional `f' argument can be used to specify an alternate
@ref{8f1,,stack frame}
to start.  The optional `file' argument has the same meaning as for
@ref{108b,,print_tb()}.


Changed in version 3.5: Added negative `limit' support.

@end deffn

@geindex extract_tb() (in module traceback)
@anchor{library/traceback traceback extract_tb}@anchor{4d35}
@deffn {Function} traceback.extract_tb (tb, limit=None)

Return a @ref{1089,,StackSummary} object representing a list of “pre-processed”
stack trace entries extracted from the
@ref{cf2,,traceback object} `tb'.  It is useful
for alternate formatting of stack traces.  The optional `limit' argument has
the same meaning as for @ref{108b,,print_tb()}.  A “pre-processed” stack trace
entry is a @ref{108a,,FrameSummary} object with attributes representing the
information that is usually printed for a stack trace.
@end deffn

@geindex extract_stack() (in module traceback)
@anchor{library/traceback traceback extract_stack}@anchor{4d36}
@deffn {Function} traceback.extract_stack (f=None, limit=None)

Extract the raw traceback from the current
@ref{8f1,,stack frame}.  The return value has
the same format as for @ref{4d35,,extract_tb()}.  The optional `f' and `limit'
arguments have the same meaning as for @ref{108c,,print_stack()}.
@end deffn

@geindex print_list() (in module traceback)
@anchor{library/traceback traceback print_list}@anchor{1935}
@deffn {Function} traceback.print_list (extracted_list, file=None)

Print the list of tuples as returned by @ref{4d35,,extract_tb()} or
@ref{4d36,,extract_stack()} as a formatted stack trace to the given file.
If `file' is @code{None}, the output is written to @ref{b39,,sys.stderr}.
@end deffn

@geindex format_list() (in module traceback)
@anchor{library/traceback traceback format_list}@anchor{4d37}
@deffn {Function} traceback.format_list (extracted_list)

Given a list of tuples or @ref{108a,,FrameSummary} objects as returned by
@ref{4d35,,extract_tb()} or @ref{4d36,,extract_stack()}, return a list of strings ready
for printing.  Each string in the resulting list corresponds to the item with
the same index in the argument list.  Each string ends in a newline; the
strings may contain internal newlines as well, for those items whose source
text line is not @code{None}.
@end deffn

@geindex format_exception_only() (in module traceback)
@anchor{library/traceback traceback format_exception_only}@anchor{a54}
@deffn {Function} traceback.format_exception_only (exc, /[, value], *, show_group=False)

Format the exception part of a traceback using an exception value such as
given by @ref{6e6,,sys.last_exc}.  The return value is a list of strings, each
ending in a newline.  The list contains the exception’s message, which is
normally a single string; however, for @ref{18f,,SyntaxError} exceptions, it
contains several lines that (when printed) display detailed information
about where the syntax error occurred. Following the message, the list
contains the exception’s @ref{272e,,notes}.

Since Python 3.10, instead of passing `value', an exception object
can be passed as the first argument.  If `value' is provided, the first
argument is ignored in order to provide backwards compatibility.

When `show_group' is @code{True}, and the exception is an instance of
@ref{566,,BaseExceptionGroup}, the nested exceptions are included as
well, recursively, with indentation relative to their nesting depth.


Changed in version 3.10: The `etype' parameter has been renamed to `exc' and is now
positional-only.



Changed in version 3.11: The returned list now includes any
@ref{272e,,notes} attached to the exception.



Changed in version 3.13: `show_group' parameter was added.

@end deffn

@geindex format_exception() (in module traceback)
@anchor{library/traceback traceback format_exception}@anchor{a53}
@deffn {Function} traceback.format_exception (exc, /[, value, tb], limit=None, chain=True)

Format a stack trace and the exception information.  The arguments  have the
same meaning as the corresponding arguments to @ref{a55,,print_exception()}.  The
return value is a list of strings, each ending in a newline and some
containing internal newlines.  When these lines are concatenated and printed,
exactly the same text is printed as does @code{print_exception()}.


Changed in version 3.5: The `etype' argument is ignored and inferred from the type of `value'.



Changed in version 3.10: This function’s behavior and signature were modified to match
@ref{a55,,print_exception()}.

@end deffn

@geindex format_exc() (in module traceback)
@anchor{library/traceback traceback format_exc}@anchor{4d38}
@deffn {Function} traceback.format_exc (limit=None, chain=True)

This is like @code{print_exc(limit)} but returns a string instead of printing to
a file.
@end deffn

@geindex format_tb() (in module traceback)
@anchor{library/traceback traceback format_tb}@anchor{4c01}
@deffn {Function} traceback.format_tb (tb, limit=None)

A shorthand for @code{format_list(extract_tb(tb, limit))}.
@end deffn

@geindex format_stack() (in module traceback)
@anchor{library/traceback traceback format_stack}@anchor{4d39}
@deffn {Function} traceback.format_stack (f=None, limit=None)

A shorthand for @code{format_list(extract_stack(f, limit))}.
@end deffn

@geindex clear_frames() (in module traceback)
@anchor{library/traceback traceback clear_frames}@anchor{11da}
@deffn {Function} traceback.clear_frames (tb)

Clears the local variables of all the stack frames in a
@ref{cf2,,traceback} `tb'
by calling the @ref{585,,clear()} method of each
@ref{8f1,,frame object}.


Added in version 3.4.

@end deffn

@geindex walk_stack() (in module traceback)
@anchor{library/traceback traceback walk_stack}@anchor{1087}
@deffn {Function} traceback.walk_stack (f)

Walk a stack following @ref{994,,f.f_back} from the given frame,
yielding the frame
and line number for each frame. If `f' is @code{None}, the current stack is
used. This helper is used with @ref{4d3a,,StackSummary.extract()}.


Added in version 3.5.



Changed in version 3.14: This function previously returned a generator that would walk the stack
when first iterated over. The generator returned now is the state of the
stack when @code{walk_stack} is called.

@end deffn

@geindex walk_tb() (in module traceback)
@anchor{library/traceback traceback walk_tb}@anchor{1088}
@deffn {Function} traceback.walk_tb (tb)

Walk a traceback following @ref{cf1,,tb_next} yielding the frame and
line number
for each frame. This helper is used with @ref{4d3a,,StackSummary.extract()}.


Added in version 3.5.

@end deffn

@node TracebackException Objects,StackSummary Objects,Module-Level Functions<2>,traceback — Print or retrieve a stack traceback
@anchor{library/traceback tracebackexception-objects}@anchor{4d3b}
@subsubsection @code{TracebackException} Objects



Added in version 3.5.


@code{TracebackException} objects are created from actual exceptions to
capture data for later printing.  They offer a more lightweight method of
storing this information by avoiding holding references to
@ref{cf2,,traceback} and @ref{8f1,,frame} objects.
In addition, they expose more options to configure the output compared to
the module-level functions described above.

@geindex TracebackException (class in traceback)
@anchor{library/traceback traceback TracebackException}@anchor{563}
@deffn {Class} traceback.TracebackException (exc_type, exc_value, exc_traceback, *, limit=None, lookup_lines=True, capture_locals=False, compact=False, max_group_width=15, max_group_depth=10)

Capture an exception for later rendering. The meaning of `limit',
`lookup_lines' and `capture_locals' are as for the @ref{1089,,StackSummary}
class.

If `compact' is true, only data that is required by
@code{TracebackException}’s @ref{19a,,format()} method
is saved in the class attributes. In particular, the
@ref{4d3c,,__context__} field is calculated only if @ref{4d3d,,__cause__} is
@code{None} and @ref{4d3e,,__suppress_context__} is false.

Note that when locals are captured, they are also shown in the traceback.

`max_group_width' and `max_group_depth' control the formatting of exception
groups (see @ref{566,,BaseExceptionGroup}). The depth refers to the nesting
level of the group, and the width refers to the size of a single exception
group’s exceptions array. The formatted output is truncated when either
limit is exceeded.


Changed in version 3.10: Added the `compact' parameter.



Changed in version 3.11: Added the `max_group_width' and `max_group_depth' parameters.


@geindex __cause__ (traceback.TracebackException attribute)
@anchor{library/traceback traceback TracebackException __cause__}@anchor{4d3d}
@deffn {Attribute} __cause__

A @code{TracebackException} of the original
@ref{14d4,,__cause__}.
@end deffn

@geindex __context__ (traceback.TracebackException attribute)
@anchor{library/traceback traceback TracebackException __context__}@anchor{4d3c}
@deffn {Attribute} __context__

A @code{TracebackException} of the original
@ref{14d3,,__context__}.
@end deffn

@geindex exceptions (traceback.TracebackException attribute)
@anchor{library/traceback traceback TracebackException exceptions}@anchor{4d3f}
@deffn {Attribute} exceptions

If @code{self} represents an @ref{4d3,,ExceptionGroup}, this field holds a list of
@code{TracebackException} instances representing the nested exceptions.
Otherwise it is @code{None}.


Added in version 3.11.

@end deffn

@geindex __suppress_context__ (traceback.TracebackException attribute)
@anchor{library/traceback traceback TracebackException __suppress_context__}@anchor{4d3e}
@deffn {Attribute} __suppress_context__

The @ref{255b,,__suppress_context__} value from the original
exception.
@end deffn

@geindex __notes__ (traceback.TracebackException attribute)
@anchor{library/traceback traceback TracebackException __notes__}@anchor{4d40}
@deffn {Attribute} __notes__

The @ref{272e,,__notes__} value from the original exception,
or @code{None}
if the exception does not have any notes. If it is not @code{None}
is it formatted in the traceback after the exception string.


Added in version 3.11.

@end deffn

@geindex stack (traceback.TracebackException attribute)
@anchor{library/traceback traceback TracebackException stack}@anchor{4d41}
@deffn {Attribute} stack

A @ref{1089,,StackSummary} representing the traceback.
@end deffn

@geindex exc_type (traceback.TracebackException attribute)
@anchor{library/traceback traceback TracebackException exc_type}@anchor{564}
@deffn {Attribute} exc_type

The class of the original exception.


Deprecated since version 3.13.

@end deffn

@geindex exc_type_str (traceback.TracebackException attribute)
@anchor{library/traceback traceback TracebackException exc_type_str}@anchor{562}
@deffn {Attribute} exc_type_str

String display of the class of the original exception.


Added in version 3.13.

@end deffn

@geindex filename (traceback.TracebackException attribute)
@anchor{library/traceback traceback TracebackException filename}@anchor{4d42}
@deffn {Attribute} filename

For syntax errors - the file name where the error occurred.
@end deffn

@geindex lineno (traceback.TracebackException attribute)
@anchor{library/traceback traceback TracebackException lineno}@anchor{4d43}
@deffn {Attribute} lineno

For syntax errors - the line number where the error occurred.
@end deffn

@geindex end_lineno (traceback.TracebackException attribute)
@anchor{library/traceback traceback TracebackException end_lineno}@anchor{4d44}
@deffn {Attribute} end_lineno

For syntax errors - the end line number where the error occurred.
Can be @code{None} if not present.


Added in version 3.10.

@end deffn

@geindex text (traceback.TracebackException attribute)
@anchor{library/traceback traceback TracebackException text}@anchor{4d45}
@deffn {Attribute} text

For syntax errors - the text where the error occurred.
@end deffn

@geindex offset (traceback.TracebackException attribute)
@anchor{library/traceback traceback TracebackException offset}@anchor{4d46}
@deffn {Attribute} offset

For syntax errors - the offset into the text where the error occurred.
@end deffn

@geindex end_offset (traceback.TracebackException attribute)
@anchor{library/traceback traceback TracebackException end_offset}@anchor{4d47}
@deffn {Attribute} end_offset

For syntax errors - the end offset into the text where the error occurred.
Can be @code{None} if not present.


Added in version 3.10.

@end deffn

@geindex msg (traceback.TracebackException attribute)
@anchor{library/traceback traceback TracebackException msg}@anchor{4d48}
@deffn {Attribute} msg

For syntax errors - the compiler error message.
@end deffn

@geindex from_exception() (traceback.TracebackException class method)
@anchor{library/traceback traceback TracebackException from_exception}@anchor{4d49}
@deffn {Method} classmethod from_exception (exc, *, limit=None, lookup_lines=True, capture_locals=False, compact=False, max_group_width=15, max_group_depth=10)

Capture an exception for later rendering. `limit', `lookup_lines' and
`capture_locals' are as for the @ref{1089,,StackSummary} class.

Note that when locals are captured, they are also shown in the traceback.
@end deffn

@geindex print() (traceback.TracebackException method)
@anchor{library/traceback traceback TracebackException print}@anchor{8b5}
@deffn {Method} print (*, file=None, chain=True)

Print to `file' (default @code{sys.stderr}) the exception information returned by
@ref{19a,,format()}.


Added in version 3.11.

@end deffn

@geindex format() (traceback.TracebackException method)
@anchor{library/traceback traceback TracebackException format}@anchor{4d4a}
@deffn {Method} format (*, chain=True)

Format the exception.

If `chain' is not @code{True}, @ref{4d3d,,__cause__} and @ref{4d3c,,__context__}
will not be formatted.

The return value is a generator of strings, each ending in a newline and
some containing internal newlines. @ref{a55,,print_exception()}
is a wrapper around this method which just prints the lines to a file.
@end deffn

@geindex format_exception_only() (traceback.TracebackException method)
@anchor{library/traceback traceback TracebackException format_exception_only}@anchor{565}
@deffn {Method} format_exception_only (*, show_group=False)

Format the exception part of the traceback.

The return value is a generator of strings, each ending in a newline.

When `show_group' is @code{False}, the generator emits the exception’s
message followed by its notes (if it has any). The exception message
is normally a single string; however, for @ref{18f,,SyntaxError} exceptions,
it consists of several lines that (when printed) display detailed
information about where the syntax error occurred.

When `show_group' is @code{True}, and the exception is an instance of
@ref{566,,BaseExceptionGroup}, the nested exceptions are included as
well, recursively, with indentation relative to their nesting depth.


Changed in version 3.11: The exception’s @ref{272e,,notes} are now
included in the output.



Changed in version 3.13: Added the `show_group' parameter.

@end deffn
@end deffn

@node StackSummary Objects,FrameSummary Objects,TracebackException Objects,traceback — Print or retrieve a stack traceback
@anchor{library/traceback stacksummary-objects}@anchor{4d4b}
@subsubsection @code{StackSummary} Objects



Added in version 3.5.


@code{StackSummary} objects represent a call stack ready for formatting.

@geindex StackSummary (class in traceback)
@anchor{library/traceback traceback StackSummary}@anchor{1089}
@deffn {Class} traceback.StackSummary

@geindex extract() (traceback.StackSummary class method)
@anchor{library/traceback traceback StackSummary extract}@anchor{4d3a}
@deffn {Method} classmethod extract (frame_gen, *, limit=None, lookup_lines=True, capture_locals=False)

Construct a @code{StackSummary} object from a frame generator (such as
is returned by @ref{1087,,walk_stack()} or
@ref{1088,,walk_tb()}).

If `limit' is supplied, only this many frames are taken from `frame_gen'.
If `lookup_lines' is @code{False}, the returned @ref{108a,,FrameSummary}
objects will not have read their lines in yet, making the cost of
creating the @code{StackSummary} cheaper (which may be valuable if it
may not actually get formatted). If `capture_locals' is @code{True} the
local variables in each @code{FrameSummary} are captured as object
representations.


Changed in version 3.12: Exceptions raised from @ref{1c3,,repr()} on a local variable (when
`capture_locals' is @code{True}) are no longer propagated to the caller.

@end deffn

@geindex from_list() (traceback.StackSummary class method)
@anchor{library/traceback traceback StackSummary from_list}@anchor{4d4c}
@deffn {Method} classmethod from_list (a_list)

Construct a @code{StackSummary} object from a supplied list of
@ref{108a,,FrameSummary} objects or old-style list of tuples.  Each tuple
should be a 4-tuple with `filename', `lineno', `name', `line' as the
elements.
@end deffn

@geindex format() (traceback.StackSummary method)
@anchor{library/traceback traceback StackSummary format}@anchor{4d4d}
@deffn {Method} format ()

Returns a list of strings ready for printing.  Each string in the
resulting list corresponds to a single @ref{8f1,,frame} from
the stack.
Each string ends in a newline; the strings may contain internal
newlines as well, for those items with source text lines.

For long sequences of the same frame and line, the first few
repetitions are shown, followed by a summary line stating the exact
number of further repetitions.


Changed in version 3.6: Long sequences of repeated frames are now abbreviated.

@end deffn

@geindex format_frame_summary() (traceback.StackSummary method)
@anchor{library/traceback traceback StackSummary format_frame_summary}@anchor{8b4}
@deffn {Method} format_frame_summary (frame_summary)

Returns a string for printing one of the @ref{8f1,,frames}
involved in the stack.
This method is called for each @ref{108a,,FrameSummary} object to be
printed by @ref{4d4d,,StackSummary.format()}. If it returns @code{None}, the
frame is omitted from the output.


Added in version 3.11.

@end deffn
@end deffn

@node FrameSummary Objects,Examples of Using the Module-Level Functions,StackSummary Objects,traceback — Print or retrieve a stack traceback
@anchor{library/traceback framesummary-objects}@anchor{4d4e}
@subsubsection @code{FrameSummary} Objects



Added in version 3.5.


A @code{FrameSummary} object represents a single @ref{8f1,,frame}
in a @ref{cf2,,traceback}.

@geindex FrameSummary (class in traceback)
@anchor{library/traceback traceback FrameSummary}@anchor{108a}
@deffn {Class} traceback.FrameSummary (filename, lineno, name, *, lookup_line=True, locals=None, line=None, end_lineno=None, colno=None, end_colno=None)

Represents a single @ref{8f1,,frame} in the
@ref{cf2,,traceback} or stack that is being formatted
or printed. It may optionally have a stringified version of the frame’s
locals included in it. If `lookup_line' is @code{False}, the source code is not
looked up until the @code{FrameSummary} has the @ref{4d4f,,line}
attribute accessed (which also happens when casting it to a @ref{614,,tuple}).
@code{line} may be directly provided, and will prevent line
lookups happening at all. `locals' is an optional local variable
mapping, and if supplied the variable representations are stored in the
summary for later display.

@code{FrameSummary} instances have the following attributes:

@geindex filename (traceback.FrameSummary attribute)
@anchor{library/traceback traceback FrameSummary filename}@anchor{4d50}
@deffn {Attribute} filename

The filename of the source code for this frame. Equivalent to accessing
@ref{1579,,f.f_code.co_filename} on a
@ref{8f1,,frame object} `f'.
@end deffn

@geindex lineno (traceback.FrameSummary attribute)
@anchor{library/traceback traceback FrameSummary lineno}@anchor{4d51}
@deffn {Attribute} lineno

The line number of the source code for this frame.
@end deffn

@geindex name (traceback.FrameSummary attribute)
@anchor{library/traceback traceback FrameSummary name}@anchor{4d52}
@deffn {Attribute} name

Equivalent to accessing @ref{23cc,,f.f_code.co_name} on
a @ref{8f1,,frame object} `f'.
@end deffn

@geindex line (traceback.FrameSummary attribute)
@anchor{library/traceback traceback FrameSummary line}@anchor{4d4f}
@deffn {Attribute} line

A string representing the source code for this frame, with leading and
trailing whitespace stripped.
If the source is not available, it is @code{None}.
@end deffn

@geindex end_lineno (traceback.FrameSummary attribute)
@anchor{library/traceback traceback FrameSummary end_lineno}@anchor{4d53}
@deffn {Attribute} end_lineno

The last line number of the source code for this frame.
By default, it is set to @code{lineno} and indexation starts from 1.


Changed in version 3.13: The default value changed from @code{None} to @code{lineno}.

@end deffn

@geindex colno (traceback.FrameSummary attribute)
@anchor{library/traceback traceback FrameSummary colno}@anchor{4d54}
@deffn {Attribute} colno

The column number of the source code for this frame.
By default, it is @code{None} and indexation starts from 0.
@end deffn

@geindex end_colno (traceback.FrameSummary attribute)
@anchor{library/traceback traceback FrameSummary end_colno}@anchor{4d55}
@deffn {Attribute} end_colno

The last column number of the source code for this frame.
By default, it is @code{None} and indexation starts from 0.
@end deffn
@end deffn

@node Examples of Using the Module-Level Functions,Examples of Using TracebackException,FrameSummary Objects,traceback — Print or retrieve a stack traceback
@anchor{library/traceback examples-of-using-the-module-level-functions}@anchor{4d56}@anchor{library/traceback traceback-example}@anchor{4d57}
@subsubsection Examples of Using the Module-Level Functions


This simple example implements a basic read-eval-print loop, similar to (but
less useful than) the standard Python interactive interpreter loop.  For a more
complete implementation of the interpreter loop, refer to the @ref{1b,,code}
module.

@example
import sys, traceback

def run_user_code(envdir):
    source = input(">>> ")
    try:
        exec(source, envdir)
    except Exception:
        print("Exception in user code:")
        print("-"*60)
        traceback.print_exc(file=sys.stdout)
        print("-"*60)

envdir = @{@}
while True:
    run_user_code(envdir)
@end example

The following example demonstrates the different ways to print and format the
exception and traceback:

@example
import sys, traceback

def lumberjack():
    bright_side_of_life()

def bright_side_of_life():
    return tuple()[0]

try:
    lumberjack()
except IndexError as exc:
    print("*** print_tb:")
    traceback.print_tb(exc.__traceback__, limit=1, file=sys.stdout)
    print("*** print_exception:")
    traceback.print_exception(exc, limit=2, file=sys.stdout)
    print("*** print_exc:")
    traceback.print_exc(limit=2, file=sys.stdout)
    print("*** format_exc, first and last line:")
    formatted_lines = traceback.format_exc().splitlines()
    print(formatted_lines[0])
    print(formatted_lines[-1])
    print("*** format_exception:")
    print(repr(traceback.format_exception(exc)))
    print("*** extract_tb:")
    print(repr(traceback.extract_tb(exc.__traceback__)))
    print("*** format_tb:")
    print(repr(traceback.format_tb(exc.__traceback__)))
    print("*** tb_lineno:", exc.__traceback__.tb_lineno)
@end example

The output for the example would look similar to this:

@example
*** print_tb:
  File "<doctest...>", line 10, in <module>
    lumberjack()
    ~~~~~~~~~~^^
*** print_exception:
Traceback (most recent call last):
  File "<doctest...>", line 10, in <module>
    lumberjack()
    ~~~~~~~~~~^^
  File "<doctest...>", line 4, in lumberjack
    bright_side_of_life()
    ~~~~~~~~~~~~~~~~~~~^^
IndexError: tuple index out of range
*** print_exc:
Traceback (most recent call last):
  File "<doctest...>", line 10, in <module>
    lumberjack()
    ~~~~~~~~~~^^
  File "<doctest...>", line 4, in lumberjack
    bright_side_of_life()
    ~~~~~~~~~~~~~~~~~~~^^
IndexError: tuple index out of range
*** format_exc, first and last line:
Traceback (most recent call last):
IndexError: tuple index out of range
*** format_exception:
['Traceback (most recent call last):\n',
 '  File "<doctest default[0]>", line 10, in <module>\n    lumberjack()\n    ~~~~~~~~~~^^\n',
 '  File "<doctest default[0]>", line 4, in lumberjack\n    bright_side_of_life()\n    ~~~~~~~~~~~~~~~~~~~^^\n',
 '  File "<doctest default[0]>", line 7, in bright_side_of_life\n    return tuple()[0]\n           ~~~~~~~^^^\n',
 'IndexError: tuple index out of range\n']
*** extract_tb:
[<FrameSummary file <doctest...>, line 10 in <module>>,
 <FrameSummary file <doctest...>, line 4 in lumberjack>,
 <FrameSummary file <doctest...>, line 7 in bright_side_of_life>]
*** format_tb:
['  File "<doctest default[0]>", line 10, in <module>\n    lumberjack()\n    ~~~~~~~~~~^^\n',
 '  File "<doctest default[0]>", line 4, in lumberjack\n    bright_side_of_life()\n    ~~~~~~~~~~~~~~~~~~~^^\n',
 '  File "<doctest default[0]>", line 7, in bright_side_of_life\n    return tuple()[0]\n           ~~~~~~~^^^\n']
*** tb_lineno: 10
@end example

The following example shows the different ways to print and format the stack:

@example
>>> import traceback
>>> def another_function():
...     lumberstack()
...
>>> def lumberstack():
...     traceback.print_stack()
...     print(repr(traceback.extract_stack()))
...     print(repr(traceback.format_stack()))
...
>>> another_function()
  File "<doctest>", line 10, in <module>
    another_function()
  File "<doctest>", line 3, in another_function
    lumberstack()
  File "<doctest>", line 6, in lumberstack
    traceback.print_stack()
[('<doctest>', 10, '<module>', 'another_function()'),
 ('<doctest>', 3, 'another_function', 'lumberstack()'),
 ('<doctest>', 7, 'lumberstack', 'print(repr(traceback.extract_stack()))')]
['  File "<doctest>", line 10, in <module>\n    another_function()\n',
 '  File "<doctest>", line 3, in another_function\n    lumberstack()\n',
 '  File "<doctest>", line 8, in lumberstack\n    print(repr(traceback.format_stack()))\n']
@end example

This last example demonstrates the final few formatting functions:

@example
>>> import traceback
>>> traceback.format_list([('spam.py', 3, '<module>', 'spam.eggs()'),
...                        ('eggs.py', 42, 'eggs', 'return "bacon"')])
['  File "spam.py", line 3, in <module>\n    spam.eggs()\n',
 '  File "eggs.py", line 42, in eggs\n    return "bacon"\n']
>>> an_error = IndexError('tuple index out of range')
>>> traceback.format_exception_only(an_error)
['IndexError: tuple index out of range\n']
@end example

@node Examples of Using TracebackException,,Examples of Using the Module-Level Functions,traceback — Print or retrieve a stack traceback
@anchor{library/traceback examples-of-using-tracebackexception}@anchor{4d58}
@subsubsection Examples of Using @code{TracebackException}


With the helper class, we have more options:

@example
>>> import sys
>>> from traceback import TracebackException
>>>
>>> def lumberjack():
...     bright_side_of_life()
...
>>> def bright_side_of_life():
...     t = "bright", "side", "of", "life"
...     return t[5]
...
>>> try:
...     lumberjack()
... except IndexError as e:
...     exc = e
...
>>> try:
...     try:
...         lumberjack()
...     except:
...         1/0
... except Exception as e:
...     chained_exc = e
...
>>> # limit works as with the module-level functions
>>> TracebackException.from_exception(exc, limit=-2).print()
Traceback (most recent call last):
  File "<python-input-1>", line 6, in lumberjack
    bright_side_of_life()
    ~~~~~~~~~~~~~~~~~~~^^
  File "<python-input-1>", line 10, in bright_side_of_life
    return t[5]
           ~^^^
IndexError: tuple index out of range

>>> # capture_locals adds local variables in frames
>>> TracebackException.from_exception(exc, limit=-2, capture_locals=True).print()
Traceback (most recent call last):
  File "<python-input-1>", line 6, in lumberjack
    bright_side_of_life()
    ~~~~~~~~~~~~~~~~~~~^^
  File "<python-input-1>", line 10, in bright_side_of_life
    return t[5]
           ~^^^
    t = ("bright", "side", "of", "life")
IndexError: tuple index out of range

>>> # The *chain* kwarg to print() controls whether chained
>>> # exceptions are displayed
>>> TracebackException.from_exception(chained_exc).print()
Traceback (most recent call last):
  File "<python-input-19>", line 4, in <module>
    lumberjack()
    ~~~~~~~~~~^^
  File "<python-input-8>", line 7, in lumberjack
    bright_side_of_life()
    ~~~~~~~~~~~~~~~~~~~^^
  File "<python-input-8>", line 11, in bright_side_of_life
    return t[5]
           ~^^^
IndexError: tuple index out of range

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<python-input-19>", line 6, in <module>
    1/0
    ~^~
ZeroDivisionError: division by zero

>>> TracebackException.from_exception(chained_exc).print(chain=False)
Traceback (most recent call last):
  File "<python-input-19>", line 6, in <module>
    1/0
    ~^~
ZeroDivisionError: division by zero
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node __future__ — Future statement definitions,gc — Garbage Collector interface,traceback — Print or retrieve a stack traceback,Python Runtime Services
@anchor{library/__future__ doc}@anchor{4d59}@anchor{library/__future__ future-future-statement-definitions}@anchor{4d5a}@anchor{library/__future__ module-__future__}@anchor{0}@anchor{library/__future__ translation-repo}@anchor{4d5b}
@subsection @code{__future__} — Future statement definitions


@geindex module; __future__

`Source code:' Lib/__future__.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/__future__.py}


__________________________________________________________________


Imports of the form @code{from __future__ import feature} are called
@ref{45b,,future statements}. These are special-cased by the Python compiler
to allow the use of new Python features in modules containing the future statement
before the release in which the feature becomes standard.

While these future statements are given additional special meaning by the
Python compiler, they are still executed like any other import statement and
the @code{__future__} exists and is handled by the import system the same way
any other Python module would be. This design serves three purposes:


@itemize *

@item 
To avoid confusing existing tools that analyze import statements and expect to
find the modules they’re importing.

@item 
To document when incompatible changes were introduced, and when they will be
— or were — made mandatory.  This is a form of executable documentation, and
can be inspected programmatically via importing @code{__future__} and examining
its contents.

@item 
To ensure that @ref{45b,,future statements} run under releases prior to
Python 2.1 at least yield runtime exceptions (the import of @code{__future__}
will fail, because there was no module of that name prior to 2.1).
@end itemize

@menu
* Module Contents: Module Contents<4>. 

@end menu

@node Module Contents<4>,,,__future__ — Future statement definitions
@anchor{library/__future__ module-contents}@anchor{4d5c}
@subsubsection Module Contents


No feature description will ever be deleted from @code{__future__}. Since its
introduction in Python 2.1 the following features have found their way into the
language using this mechanism:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

feature

@tab

optional in

@tab

mandatory in

@tab

effect

@item

@geindex nested_scopes (in module __future__)
@anchor{library/__future__ future__ nested_scopes}@anchor{4d5d}
@deffn {Data} __future__.nested_scopes
@end deffn

@tab

2.1.0b1

@tab

2.2

@tab

@geindex Python Enhancement Proposals; PEP 227
PEP 227@footnote{https://peps.python.org/pep-0227/}: `Statically Nested Scopes'

@item

@geindex generators (in module __future__)
@anchor{library/__future__ future__ generators}@anchor{4d5e}
@deffn {Data} __future__.generators
@end deffn

@tab

2.2.0a1

@tab

2.3

@tab

@geindex Python Enhancement Proposals; PEP 255
PEP 255@footnote{https://peps.python.org/pep-0255/}: `Simple Generators'

@item

@geindex division (in module __future__)
@anchor{library/__future__ future__ division}@anchor{4d5f}
@deffn {Data} __future__.division
@end deffn

@tab

2.2.0a2

@tab

3.0

@tab

@geindex Python Enhancement Proposals; PEP 238
PEP 238@footnote{https://peps.python.org/pep-0238/}: `Changing the Division Operator'

@item

@geindex absolute_import (in module __future__)
@anchor{library/__future__ future__ absolute_import}@anchor{4d60}
@deffn {Data} __future__.absolute_import
@end deffn

@tab

2.5.0a1

@tab

3.0

@tab

@geindex Python Enhancement Proposals; PEP 328
PEP 328@footnote{https://peps.python.org/pep-0328/}: `Imports: Multi-Line and Absolute/Relative'

@item

@geindex with_statement (in module __future__)
@anchor{library/__future__ future__ with_statement}@anchor{4d61}
@deffn {Data} __future__.with_statement
@end deffn

@tab

2.5.0a1

@tab

2.6

@tab

@geindex Python Enhancement Proposals; PEP 343
PEP 343@footnote{https://peps.python.org/pep-0343/}: `The “with” Statement'

@item

@geindex print_function (in module __future__)
@anchor{library/__future__ future__ print_function}@anchor{4d62}
@deffn {Data} __future__.print_function
@end deffn

@tab

2.6.0a2

@tab

3.0

@tab

@geindex Python Enhancement Proposals; PEP 3105
PEP 3105@footnote{https://peps.python.org/pep-3105/}: `Make print a function'

@item

@geindex unicode_literals (in module __future__)
@anchor{library/__future__ future__ unicode_literals}@anchor{4d63}
@deffn {Data} __future__.unicode_literals
@end deffn

@tab

2.6.0a2

@tab

3.0

@tab

@geindex Python Enhancement Proposals; PEP 3112
PEP 3112@footnote{https://peps.python.org/pep-3112/}: `Bytes literals in Python 3000'

@item

@geindex generator_stop (in module __future__)
@anchor{library/__future__ future__ generator_stop}@anchor{4d64}
@deffn {Data} __future__.generator_stop
@end deffn

@tab

3.5.0b1

@tab

3.7

@tab

@geindex Python Enhancement Proposals; PEP 479
PEP 479@footnote{https://peps.python.org/pep-0479/}: `StopIteration handling inside generators'

@item

@geindex annotations (in module __future__)
@anchor{library/__future__ future__ annotations}@anchor{4d65}
@deffn {Data} __future__.annotations
@end deffn

@tab

3.7.0b1

@tab

Never @footnote{
@code{from __future__ import annotations} was previously scheduled to
become mandatory in Python 3.10, but the change was delayed and ultimately
canceled. This feature will eventually be deprecated and removed. See
@geindex Python Enhancement Proposals; PEP 649
@uref{https://peps.python.org/pep-0649/,PEP 649} and 
@geindex Python Enhancement Proposals; PEP 749
@uref{https://peps.python.org/pep-0749/,PEP 749}.
}

@tab

@geindex Python Enhancement Proposals; PEP 563
PEP 563@footnote{https://peps.python.org/pep-0563/}: `Postponed evaluation of annotations',
@geindex Python Enhancement Proposals; PEP 649
PEP 649@footnote{https://peps.python.org/pep-0649/}: `Deferred evaluation of annotations using descriptors'

@end multitable


@c XXX Adding a new entry?  Remember to update simple_stmts.rst, too.

@geindex _Feature (class in __future__)
@anchor{library/__future__ future-classes}@anchor{4d66}@anchor{library/__future__ future__ _Feature}@anchor{260f}
@deffn {Class} __future__._Feature

Each statement in @code{__future__.py} is of the form:

@example
FeatureName = _Feature(OptionalRelease, MandatoryRelease,
                       CompilerFlag)
@end example

where, normally, `OptionalRelease' is less than `MandatoryRelease', and both are
5-tuples of the same form as @ref{8b1,,sys.version_info}:

@example
(PY_MAJOR_VERSION, # the 2 in 2.1.0a3; an int
 PY_MINOR_VERSION, # the 1; an int
 PY_MICRO_VERSION, # the 0; an int
 PY_RELEASE_LEVEL, # "alpha", "beta", "candidate" or "final"; string
 PY_RELEASE_SERIAL # the 3; an int
)
@end example
@end deffn

@geindex getOptionalRelease() (__future__._Feature method)
@anchor{library/__future__ future__ _Feature getOptionalRelease}@anchor{4d67}
@deffn {Method} _Feature.getOptionalRelease ()

`OptionalRelease' records the first release in which the feature was accepted.
@end deffn

@geindex getMandatoryRelease() (__future__._Feature method)
@anchor{library/__future__ future__ _Feature getMandatoryRelease}@anchor{4d68}
@deffn {Method} _Feature.getMandatoryRelease ()

In the case of a `MandatoryRelease' that has not yet occurred,
`MandatoryRelease' predicts the release in which the feature will become part of
the language.

Else `MandatoryRelease' records when the feature became part of the language; in
releases at or after that, modules no longer need a future statement to use the
feature in question, but may continue to use such imports.

`MandatoryRelease' may also be @code{None}, meaning that a planned feature got
dropped or that it is not yet decided.
@end deffn

@geindex compiler_flag (__future__._Feature attribute)
@anchor{library/__future__ future__ _Feature compiler_flag}@anchor{23da}
@deffn {Attribute} _Feature.compiler_flag

`CompilerFlag' is the (bitfield) flag that should be passed in the fourth
argument to the built-in function @ref{4b2,,compile()} to enable the feature in
dynamically compiled code.  This flag is stored in the @code{_Feature.compiler_flag}
attribute on @ref{260f,,_Feature} instances.
@end deffn


@subsubheading See also



@table @asis

@item @ref{45b,,Future statements}

How the compiler treats future imports.

@geindex Python Enhancement Proposals; PEP 236

@item PEP 236@footnote{https://peps.python.org/pep-0236/} - Back to the __future__

The original proposal for the __future__ mechanism.
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node gc — Garbage Collector interface,inspect — Inspect live objects,__future__ — Future statement definitions,Python Runtime Services
@anchor{library/gc doc}@anchor{4d69}@anchor{library/gc gc-garbage-collector-interface}@anchor{4d6a}@anchor{library/gc module-gc}@anchor{64}@anchor{library/gc translation-repo}@anchor{4d6b}
@subsection @code{gc} — Garbage Collector interface


@geindex module; gc


__________________________________________________________________


This module provides an interface to the optional garbage collector.  It
provides the ability to disable the collector, tune the collection frequency,
and set debugging options.  It also provides access to unreachable objects that
the collector found but cannot free.  Since the collector supplements the
reference counting already used in Python, you can disable the collector if you
are sure your program does not create reference cycles.  Automatic collection
can be disabled by calling @code{gc.disable()}.  To debug a leaking program call
@code{gc.set_debug(gc.DEBUG_LEAK)}. Notice that this includes
@code{gc.DEBUG_SAVEALL}, causing garbage-collected objects to be saved in
gc.garbage for inspection.

The @code{gc} module provides the following functions:

@geindex enable() (in module gc)
@anchor{library/gc gc enable}@anchor{4d6c}
@deffn {Function} gc.enable ()

Enable automatic garbage collection.
@end deffn

@geindex disable() (in module gc)
@anchor{library/gc gc disable}@anchor{4d6d}
@deffn {Function} gc.disable ()

Disable automatic garbage collection.
@end deffn

@geindex isenabled() (in module gc)
@anchor{library/gc gc isenabled}@anchor{4d6e}
@deffn {Function} gc.isenabled ()

Return @code{True} if automatic collection is enabled.
@end deffn

@geindex collect() (in module gc)
@anchor{library/gc gc collect}@anchor{1b5}
@deffn {Function} gc.collect (generation=2)

With no arguments, run a full collection.  The optional argument `generation'
may be an integer specifying which generation to collect (from 0 to 2).  A
@ref{2ee,,ValueError} is raised if the generation number is invalid. The sum of
collected objects and uncollectable objects is returned.

The free lists maintained for a number of built-in types are cleared
whenever a full collection or collection of the highest generation (2)
is run.  Not all items in some free lists may be freed due to the
particular implementation, in particular @ref{197,,float}.

The effect of calling @code{gc.collect()} while the interpreter is already
performing a collection is undefined.


Changed in version 3.14: @code{generation=1} performs an increment of collection.



Changed in version 3.14.5: @code{generation=1} performs collection of the middle generation.

@end deffn

@geindex set_debug() (in module gc)
@anchor{library/gc gc set_debug}@anchor{4d6f}
@deffn {Function} gc.set_debug (flags)

Set the garbage collection debugging flags. Debugging information will be
written to @code{sys.stderr}.  See below for a list of debugging flags which can be
combined using bit operations to control debugging.
@end deffn

@geindex get_debug() (in module gc)
@anchor{library/gc gc get_debug}@anchor{4d70}
@deffn {Function} gc.get_debug ()

Return the debugging flags currently set.
@end deffn

@geindex get_objects() (in module gc)
@anchor{library/gc gc get_objects}@anchor{a0a}
@deffn {Function} gc.get_objects (generation=None)

Returns a list of all objects tracked by the collector, excluding the list
returned. If `generation' is not @code{None}, return only the objects tracked by
the collector that are in that generation.


Changed in version 3.8: New `generation' parameter.



Changed in version 3.14: Generation 1 is removed



Changed in version 3.14.5: Generation 1 is reintroduced to maintain GC behavior from 3.13.


Raises an @ref{1cb1,,auditing event} @code{gc.get_objects} with argument @code{generation}.
@end deffn

@geindex get_stats() (in module gc)
@anchor{library/gc gc get_stats}@anchor{2de}
@deffn {Function} gc.get_stats ()

Return a list of three per-generation dictionaries containing collection
statistics since interpreter start.  The number of keys may change
in the future, but currently each dictionary will contain the following
items:


@itemize *

@item 
@code{collections} is the number of times this generation was collected;

@item 
@code{collected} is the total number of objects collected inside this
generation;

@item 
@code{uncollectable} is the total number of objects which were found
to be uncollectable (and were therefore moved to the @ref{13cd,,garbage}
list) inside this generation.
@end itemize


Added in version 3.4.

@end deffn

@geindex set_threshold() (in module gc)
@anchor{library/gc gc set_threshold}@anchor{2dc}
@deffn {Function} gc.set_threshold (threshold0[, threshold1[, threshold2]])

Set the garbage collection thresholds (the collection frequency). Setting
`threshold0' to zero disables collection.

The GC classifies objects into three generations depending on how many
collection sweeps they have survived.  New objects are placed in the youngest
generation (generation @code{0}).  If an object survives a collection it is moved
into the next older generation.  Since generation @code{2} is the oldest
generation, objects in that generation remain there after a collection.  In
order to decide when to run, the collector keeps track of the number object
allocations and deallocations since the last collection.  When the number of
allocations minus the number of deallocations exceeds `threshold0', collection
starts.  Initially only generation @code{0} is examined.  If generation @code{0} has
been examined more than `threshold1' times since generation @code{1} has been
examined, then generation @code{1} is examined as well.
With the third generation, things are a bit more complicated,
see Collecting the oldest generation@footnote{https://github.com/python/cpython/blob/ff0ef0a54bef26fc507fbf9b7a6009eb7d3f17f5/InternalDocs/garbage_collector.md#collecting-the-oldest-generation} for more information.

In the free-threaded build, the increase in process memory usage is also
checked before running the collector.  If the memory usage has not increased
by 10% since the last collection and the net number of object allocations
has not exceeded 40 times `threshold0', the collection is not run.

See Garbage collector design@footnote{https://github.com/python/cpython/blob/3.14/InternalDocs/garbage_collector.md} for more information.


Changed in version 3.14: `threshold2' is ignored



Changed in version 3.14.5: `threshold2' is restored to match Python 3.13 behavior.

@end deffn

@geindex get_count() (in module gc)
@anchor{library/gc gc get_count}@anchor{2dd}
@deffn {Function} gc.get_count ()

Return the current collection  counts as a tuple of @code{(count0, count1,
count2)}.
@end deffn

@geindex get_threshold() (in module gc)
@anchor{library/gc gc get_threshold}@anchor{2db}
@deffn {Function} gc.get_threshold ()

Return the current collection thresholds as a tuple of @code{(threshold0,
threshold1, threshold2)}.
@end deffn

@geindex get_referrers() (in module gc)
@anchor{library/gc gc get_referrers}@anchor{a0b}
@deffn {Function} gc.get_referrers (*objs)

Return the list of objects that directly refer to any of objs. This function
will only locate those containers which support garbage collection; extension
types which do refer to other objects but do not support garbage collection will
not be found.

Note that objects which have already been dereferenced, but which live in cycles
and have not yet been collected by the garbage collector can be listed among the
resulting referrers.  To get only currently live objects, call @ref{1b5,,collect()}
before calling @code{get_referrers()}.

@cartouche
@quotation Warning 
Care must be taken when using objects returned by @code{get_referrers()} because
some of them could still be under construction and hence in a temporarily
invalid state. Avoid using @code{get_referrers()} for any purpose other than
debugging.
@end quotation
@end cartouche

Raises an @ref{1cb1,,auditing event} @code{gc.get_referrers} with argument @code{objs}.
@end deffn

@geindex get_referents() (in module gc)
@anchor{library/gc gc get_referents}@anchor{a0c}
@deffn {Function} gc.get_referents (*objs)

Return a list of objects directly referred to by any of the arguments. The
referents returned are those objects visited by the arguments’ C-level
@ref{987,,tp_traverse} methods (if any), and may not be all objects actually
directly reachable.  @code{tp_traverse} methods are supported only by objects
that support garbage collection, and are only required to visit objects that may
be involved in a cycle.  So, for example, if an integer is directly reachable
from an argument, that integer object may or may not appear in the result list.

Raises an @ref{1cb1,,auditing event} @code{gc.get_referents} with argument @code{objs}.
@end deffn

@geindex is_tracked() (in module gc)
@anchor{library/gc gc is_tracked}@anchor{1519}
@deffn {Function} gc.is_tracked (obj)

Returns @code{True} if the object is currently tracked by the garbage collector,
@code{False} otherwise.  As a general rule, instances of atomic types aren’t
tracked and instances of non-atomic types (containers, user-defined
objects…) are.  However, some type-specific optimizations can be present
in order to suppress the garbage collector footprint of simple instances
(e.g. dicts containing only atomic keys and values):

@example
>>> gc.is_tracked(0)
False
>>> gc.is_tracked("a")
False
>>> gc.is_tracked([])
True
>>> gc.is_tracked(@{@})
False
>>> gc.is_tracked(@{"a": 1@})
True
@end example


Added in version 3.1.

@end deffn

@geindex is_finalized() (in module gc)
@anchor{library/gc gc is_finalized}@anchor{aff}
@deffn {Function} gc.is_finalized (obj)

Returns @code{True} if the given object has been finalized by the
garbage collector, @code{False} otherwise.

@example
>>> x = None
>>> class Lazarus:
...     def __del__(self):
...         global x
...         x = self
...
>>> lazarus = Lazarus()
>>> gc.is_finalized(lazarus)
False
>>> del lazarus
>>> gc.is_finalized(x)
True
@end example


Added in version 3.9.

@end deffn

@geindex freeze() (in module gc)
@anchor{library/gc gc freeze}@anchor{d34}
@deffn {Function} gc.freeze ()

Freeze all the objects tracked by the garbage collector; move them to a
permanent generation and ignore them in all the future collections.

If a process will @code{fork()} without @code{exec()}, avoiding unnecessary
copy-on-write in child processes will maximize memory sharing and reduce
overall memory usage. This requires both avoiding creation of freed “holes”
in memory pages in the parent process and ensuring that GC collections in
child processes won’t touch the @code{gc_refs} counter of long-lived objects
originating in the parent process. To accomplish both, call @code{gc.disable()}
early in the parent process, @code{gc.freeze()} right before @code{fork()}, and
@code{gc.enable()} early in child processes.


Added in version 3.7.

@end deffn

@geindex unfreeze() (in module gc)
@anchor{library/gc gc unfreeze}@anchor{d35}
@deffn {Function} gc.unfreeze ()

Unfreeze the objects in the permanent generation, put them back into the
oldest generation.


Added in version 3.7.

@end deffn

@geindex get_freeze_count() (in module gc)
@anchor{library/gc gc get_freeze_count}@anchor{d36}
@deffn {Function} gc.get_freeze_count ()

Return the number of objects in the permanent generation.


Added in version 3.7.

@end deffn

The following variables are provided for read-only access (you can mutate the
values but should not rebind them):

@geindex garbage (in module gc)
@anchor{library/gc gc garbage}@anchor{13cd}
@deffn {Data} gc.garbage

A list of objects which the collector found to be unreachable but could
not be freed (uncollectable objects).  Starting with Python 3.4, this
list should be empty most of the time, except when using instances of
C extension types with a non-@code{NULL} @code{tp_del} slot.

If @ref{4d71,,DEBUG_SAVEALL} is set, then all unreachable objects will be
added to this list rather than freed.


Changed in version 3.2: If this list is non-empty at @ref{47a,,interpreter shutdown}, a
@ref{54d,,ResourceWarning} is emitted, which is silent by default.  If
@ref{13ce,,DEBUG_UNCOLLECTABLE} is set, in addition all uncollectable objects
are printed.



Changed in version 3.4: Following 
@geindex Python Enhancement Proposals; PEP 442
PEP 442@footnote{https://peps.python.org/pep-0442/}, objects with a @ref{1203,,__del__()} method don’t end
up in @code{gc.garbage} anymore.

@end deffn

@geindex callbacks (in module gc)
@anchor{library/gc gc callbacks}@anchor{12d3}
@deffn {Data} gc.callbacks

A list of callbacks that will be invoked by the garbage collector before and
after collection.  The callbacks will be called with two arguments,
`phase' and `info'.

`phase' can be one of two values:

@quotation

“start”: The garbage collection is about to start.

“stop”: The garbage collection has finished.
@end quotation

`info' is a dict providing more information for the callback.  The following
keys are currently defined:

@quotation

“generation”: The oldest generation being collected.

“collected”: When `phase' is “stop”, the number of objects
successfully collected.

“uncollectable”: When `phase' is “stop”, the number of objects
that could not be collected and were put in @ref{13cd,,garbage}.
@end quotation

Applications can add their own callbacks to this list.  The primary
use cases are:

@quotation

Gathering statistics about garbage collection, such as how often
various generations are collected, and how long the collection
takes.

Allowing applications to identify and clear their own uncollectable
types when they appear in @ref{13cd,,garbage}.
@end quotation


Added in version 3.3.

@end deffn

The following constants are provided for use with @ref{4d6f,,set_debug()}:

@geindex DEBUG_STATS (in module gc)
@anchor{library/gc gc DEBUG_STATS}@anchor{4d72}
@deffn {Data} gc.DEBUG_STATS

Print statistics during collection.  This information can be useful when tuning
the collection frequency.
@end deffn

@geindex DEBUG_COLLECTABLE (in module gc)
@anchor{library/gc gc DEBUG_COLLECTABLE}@anchor{4d73}
@deffn {Data} gc.DEBUG_COLLECTABLE

Print information on collectable objects found.
@end deffn

@geindex DEBUG_UNCOLLECTABLE (in module gc)
@anchor{library/gc gc DEBUG_UNCOLLECTABLE}@anchor{13ce}
@deffn {Data} gc.DEBUG_UNCOLLECTABLE

Print information of uncollectable objects found (objects which are not
reachable but cannot be freed by the collector).  These objects will be added
to the @code{garbage} list.


Changed in version 3.2: Also print the contents of the @ref{13cd,,garbage} list at
@ref{47a,,interpreter shutdown}, if it isn’t empty.

@end deffn

@geindex DEBUG_SAVEALL (in module gc)
@anchor{library/gc gc DEBUG_SAVEALL}@anchor{4d71}
@deffn {Data} gc.DEBUG_SAVEALL

When set, all unreachable objects found will be appended to `garbage' rather
than being freed.  This can be useful for debugging a leaking program.
@end deffn

@geindex DEBUG_LEAK (in module gc)
@anchor{library/gc gc DEBUG_LEAK}@anchor{4d74}
@deffn {Data} gc.DEBUG_LEAK

The debugging flags necessary for the collector to print information about a
leaking program (equal to @code{DEBUG_COLLECTABLE | DEBUG_UNCOLLECTABLE |
DEBUG_SAVEALL}).
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node inspect — Inspect live objects,annotationlib — Functionality for introspecting annotations,gc — Garbage Collector interface,Python Runtime Services
@anchor{library/inspect doc}@anchor{4d75}@anchor{library/inspect inspect-inspect-live-objects}@anchor{4d76}@anchor{library/inspect translation-repo}@anchor{4d77}
@subsection @code{inspect} — Inspect live objects


@c import inspect
@c from inspect import *

@geindex module; inspect
@anchor{library/inspect module-inspect}@anchor{82}
`Source code:' Lib/inspect.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/inspect.py}


__________________________________________________________________


The @code{inspect} module provides several useful functions to help get
information about live objects such as modules, classes, methods, functions,
tracebacks, frame objects, and code objects.  For example, it can help you
examine the contents of a class, retrieve the source code of a method, extract
and format the argument list for a function, or get all the information you need
to display a detailed traceback.

There are four main kinds of services provided by this module: type checking,
getting source code, inspecting classes and functions, and examining the
interpreter stack.

@menu
* Types and members:: 
* Retrieving source code:: 
* Introspecting callables with the Signature object:: 
* Classes and functions: Classes and functions<2>. 
* The interpreter stack:: 
* Fetching attributes statically:: 
* Current State of Generators@comma{} Coroutines@comma{} and Asynchronous Generators: Current State of Generators Coroutines and Asynchronous Generators. 
* Code Objects Bit Flags:: 
* Buffer flags:: 
* Command-line interface: Command-line interface<10>. 

@end menu

@node Types and members,Retrieving source code,,inspect — Inspect live objects
@anchor{library/inspect inspect-types}@anchor{1dd5}@anchor{library/inspect types-and-members}@anchor{4d78}
@subsubsection Types and members


The @ref{1c34,,getmembers()} function retrieves the members of an object such as a
class or module. The functions whose names begin with “is” are mainly
provided as convenient choices for the second argument to @code{getmembers()}.
They also help you determine when you can expect to find the following special
attributes (see @ref{23a5,,Import-related attributes on module objects} for module attributes):

@c this function name is too big to fit in the ascii-art table below


@multitable {xxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Type

@tab

Attribute

@tab

Description

@item

class

@tab

__doc__

@tab

documentation string

@item

@tab

__name__

@tab

name with which this
class was defined

@item

@tab

__qualname__

@tab

qualified name

@item

@tab

__module__

@tab

name of module in which
this class was defined

@item

@tab

__type_params__

@tab

A tuple containing the
@ref{5ad,,type parameters} of
a generic class

@item

method

@tab

__doc__

@tab

documentation string

@item

@tab

__name__

@tab

name with which this
method was defined

@item

@tab

__qualname__

@tab

qualified name

@item

@tab

__func__

@tab

function object
containing implementation
of method

@item

@tab

__self__

@tab

instance to which this
method is bound, or
@code{None}

@item

@tab

__module__

@tab

name of module in which
this method was defined

@item

function

@tab

__doc__

@tab

documentation string

@item

@tab

__name__

@tab

name with which this
function was defined

@item

@tab

__qualname__

@tab

qualified name

@item

@tab

__code__

@tab

code object containing
compiled function
@ref{4ab,,bytecode}

@item

@tab

__defaults__

@tab

tuple of any default
values for positional or
keyword parameters

@item

@tab

__kwdefaults__

@tab

mapping of any default
values for keyword-only
parameters

@item

@tab

__globals__

@tab

global namespace in which
this function was defined

@item

@tab

__builtins__

@tab

builtins namespace

@item

@tab

__annotations__

@tab

mapping of parameters
names to annotations;
@code{"return"} key is
reserved for return
annotations.

@item

@tab

__type_params__

@tab

A tuple containing the
@ref{5ad,,type parameters} of
a generic function

@item

@tab

__module__

@tab

name of module in which
this function was defined

@item

traceback

@tab

tb_frame

@tab

frame object at this
level

@item

@tab

tb_lasti

@tab

index of last attempted
instruction in bytecode

@item

@tab

tb_lineno

@tab

current line number in
Python source code

@item

@tab

tb_next

@tab

next inner traceback
object (called by this
level)

@item

frame

@tab

f_back

@tab

next outer frame object
(this frame’s caller)

@item

@tab

f_builtins

@tab

builtins namespace seen
by this frame

@item

@tab

f_code

@tab

code object being
executed in this frame

@item

@tab

f_globals

@tab

global namespace seen by
this frame

@item

@tab

f_lasti

@tab

index of last attempted
instruction in bytecode

@item

@tab

f_lineno

@tab

current line number in
Python source code

@item

@tab

f_locals

@tab

local namespace seen by
this frame

@item

@tab

f_generator

@tab

returns the generator or
coroutine object that
owns this frame, or
@code{None} if the frame is
of a regular function

@item

@tab

f_trace

@tab

tracing function for this
frame, or @code{None}

@item

@tab

f_trace_lines

@tab

indicate whether a
tracing event is
triggered for each source
source line

@item

@tab

f_trace_opcodes

@tab

indicate whether
per-opcode events are
requested

@item

@tab

clear()

@tab

used to clear all
references to local
variables

@item

code

@tab

co_argcount

@tab

number of arguments (not
including keyword only
arguments, * or **
args)

@item

@tab

co_code

@tab

string of raw compiled
bytecode

@item

@tab

co_cellvars

@tab

tuple of names of cell
variables (referenced by
containing scopes)

@item

@tab

co_consts

@tab

tuple of constants used
in the bytecode

@item

@tab

co_filename

@tab

name of file in which
this code object was
created

@item

@tab

co_firstlineno

@tab

number of first line in
Python source code

@item

@tab

co_flags

@tab

bitmap of @code{CO_*} flags,
read more @ref{23d9,,here}

@item

@tab

co_lnotab

@tab

encoded mapping of line
numbers to bytecode
indices

@item

@tab

co_freevars

@tab

tuple of names of free
variables (referenced via
a function’s closure)

@item

@tab

co_posonlyargcount

@tab

number of positional only
arguments

@item

@tab

co_kwonlyargcount

@tab

number of keyword only
arguments (not including
** arg)

@item

@tab

co_name

@tab

name with which this code
object was defined

@item

@tab

co_qualname

@tab

fully qualified name with
which this code object
was defined

@item

@tab

co_names

@tab

tuple of names other
than arguments and
function locals

@item

@tab

co_nlocals

@tab

number of local variables

@item

@tab

co_stacksize

@tab

virtual machine stack
space required

@item

@tab

co_varnames

@tab

tuple of names of
arguments and local
variables

@item

@tab

co_lines()

@tab

returns an iterator that
yields successive
bytecode ranges

@item

@tab

co_positions()

@tab

returns an iterator of
source code positions for
each bytecode instruction

@item

@tab

replace()

@tab

returns a copy of the
code object with new
values

@item

generator

@tab

__name__

@tab

name

@item

@tab

__qualname__

@tab

qualified name

@item

@tab

gi_frame

@tab

frame

@item

@tab

gi_running

@tab

is the generator running?

@item

@tab

gi_suspended

@tab

is the generator
suspended?

@item

@tab

gi_code

@tab

code

@item

@tab

gi_yieldfrom

@tab

object being iterated by
@code{yield from}, or
@code{None}

@item

async generator

@tab

__name__

@tab

name

@item

@tab

__qualname__

@tab

qualified name

@item

@tab

ag_await

@tab

object being awaited on,
or @code{None}

@item

@tab

ag_frame

@tab

frame

@item

@tab

ag_running

@tab

is the generator running?

@item

@tab

ag_suspended

@tab

is the generator
suspended?

@item

@tab

ag_code

@tab

code

@item

coroutine

@tab

__name__

@tab

name

@item

@tab

__qualname__

@tab

qualified name

@item

@tab

cr_await

@tab

object being awaited on,
or @code{None}

@item

@tab

cr_frame

@tab

frame

@item

@tab

cr_running

@tab

is the coroutine running?

@item

@tab

cr_suspended

@tab

is the coroutine
suspended?

@item

@tab

cr_code

@tab

code

@item

@tab

cr_origin

@tab

where coroutine was
created, or @code{None}. See
@ref{d8b,,sys.set_coroutine_origin_tracking_depth()}

@item

builtin

@tab

__doc__

@tab

documentation string

@item

@tab

__name__

@tab

original name of this
function or method

@item

@tab

__qualname__

@tab

qualified name

@item

@tab

__self__

@tab

instance to which a
method is bound, or
@code{None}

@end multitable



Changed in version 3.5: Add @code{__qualname__} and @code{gi_yieldfrom} attributes to generators.

The @code{__name__} attribute of generators is now set from the function
name, instead of the code name, and it can now be modified.



Changed in version 3.7: Add @code{cr_origin} attribute to coroutines.



Changed in version 3.10: Add @code{__builtins__} attribute to functions.



Changed in version 3.11: Add @code{gi_suspended} attribute to generators.



Changed in version 3.11: Add @code{cr_suspended} attribute to coroutines.



Changed in version 3.12: Add @code{ag_suspended} attribute to async generators.



Changed in version 3.14: Add @code{f_generator} attribute to frames.


@geindex getmembers() (in module inspect)
@anchor{library/inspect inspect getmembers}@anchor{1c34}
@deffn {Function} inspect.getmembers (object[, predicate])

Return all the members of an object in a list of @code{(name, value)}
pairs sorted by name. If the optional `predicate' argument—which will be
called with the @code{value} object of each member—is supplied, only members
for which the predicate returns a true value are included.

@cartouche
@quotation Note 
@code{getmembers()} will only return class attributes defined in the
metaclass when the argument is a class and those attributes have been
listed in the metaclass’ custom @ref{17b9,,__dir__()}.
@end quotation
@end cartouche
@end deffn

@geindex getmembers_static() (in module inspect)
@anchor{library/inspect inspect getmembers_static}@anchor{85a}
@deffn {Function} inspect.getmembers_static (object[, predicate])

Return all the members of an object in a list of @code{(name, value)}
pairs sorted by name without triggering dynamic lookup via the descriptor
protocol, __getattr__ or __getattribute__. Optionally, only return members
that satisfy a given predicate.

@cartouche
@quotation Note 
@code{getmembers_static()} may not be able to retrieve all members
that getmembers can fetch (like dynamically created attributes)
and may find members that getmembers can’t (like descriptors
that raise AttributeError). It can also return descriptor objects
instead of instance members in some cases.
@end quotation
@end cartouche


Added in version 3.11.

@end deffn

@geindex getmodulename() (in module inspect)
@anchor{library/inspect inspect getmodulename}@anchor{f3a}
@deffn {Function} inspect.getmodulename (path)

Return the name of the module named by the file `path', without including the
names of enclosing packages. The file extension is checked against all of
the entries in @ref{4d79,,importlib.machinery.all_suffixes()}. If it matches,
the final path component is returned with the extension removed.
Otherwise, @code{None} is returned.

Note that this function `only' returns a meaningful name for actual
Python modules - paths that potentially refer to Python packages will
still return @code{None}.


Changed in version 3.3: The function is based directly on @ref{7b,,importlib}.

@end deffn

@geindex ismodule() (in module inspect)
@anchor{library/inspect inspect ismodule}@anchor{4d7a}
@deffn {Function} inspect.ismodule (object)

Return @code{True} if the object is a module.
@end deffn

@geindex isclass() (in module inspect)
@anchor{library/inspect inspect isclass}@anchor{4d7b}
@deffn {Function} inspect.isclass (object)

Return @code{True} if the object is a class, whether built-in or created in Python
code.

This function returns @code{False} for @ref{8c3,,generic aliases} of classes,
such as @code{list[int]}.
@end deffn

@geindex ismethod() (in module inspect)
@anchor{library/inspect inspect ismethod}@anchor{4d7c}
@deffn {Function} inspect.ismethod (object)

Return @code{True} if the object is a bound method written in Python.

@cartouche
@quotation Note 
For example, given this class:

@example
>>> class Greeter:
...     def say_hello(self):
...         print('hello!')
@end example

A bound method (also known as an `instance method') is created when
accessing @code{say_hello} (a @ref{24fe,,function} defined in the
@code{Greeter} namespace) through an instance of the @code{Greeter} class:

@example
>>> instance = Greeter()

>>> instance.say_hello
<bound method Greeter.say_hello of <__main__.Greeter object ...>>
>>> ismethod(instance.say_hello)
True
>>> isfunction(instance.say_hello)
False
@end example

Accessing @code{say_hello} through the @code{Greeter} class will return the
function itself. For this function, @code{ismethod()} will return
@code{False}, but @ref{4d7d,,isfunction()} will return @code{True}:

@example
>>> Greeter.say_hello
<function Greeter.say_hello at 0x7f7503854a90>
>>> ismethod(Greeter.say_hello)
False
>>> isfunction(Greeter.say_hello)
True
@end example

See @ref{2713,,Methods} for details.
@end quotation
@end cartouche
@end deffn

@geindex isfunction() (in module inspect)
@anchor{library/inspect inspect isfunction}@anchor{4d7d}
@deffn {Function} inspect.isfunction (object)

Return @code{True} if the object is a Python function, which includes functions
created by a @ref{2c24,,lambda} expression.

See the note for @ref{4d7c,,ismethod()} for an example.
@end deffn

@geindex ispackage() (in module inspect)
@anchor{library/inspect inspect ispackage}@anchor{234}
@deffn {Function} inspect.ispackage (object)

Return @code{True} if the object is a @ref{235,,package}.


Added in version 3.14.

@end deffn

@geindex isgeneratorfunction() (in module inspect)
@anchor{library/inspect inspect isgeneratorfunction}@anchor{1b9f}
@deffn {Function} inspect.isgeneratorfunction (object)

Return @code{True} if the object is a Python generator function.

It also returns @code{True} for bound methods created from Python generator functions
(see @ref{2713,,Methods} for more information).


Changed in version 3.8: Functions wrapped in @ref{219,,functools.partial()} now return @code{True} if the
wrapped function is a Python generator function.



Changed in version 3.13: Functions wrapped in @ref{21a,,functools.partialmethod()} now return @code{True}
if the wrapped function is a Python generator function.

@end deffn

@geindex isgenerator() (in module inspect)
@anchor{library/inspect inspect isgenerator}@anchor{4d7e}
@deffn {Function} inspect.isgenerator (object)

Return @code{True} if the object is a generator.
@end deffn

@geindex iscoroutinefunction() (in module inspect)
@anchor{library/inspect inspect iscoroutinefunction}@anchor{30f}
@deffn {Function} inspect.iscoroutinefunction (object)

Return @code{True} if the object is a @ref{f79,,coroutine function} (a function
defined with an @ref{7ee,,async def} syntax), a @ref{219,,functools.partial()}
wrapping a coroutine function, or a sync function marked with
@ref{6b9,,markcoroutinefunction()}.


Added in version 3.5.



Changed in version 3.8: Functions wrapped in @ref{219,,functools.partial()} now return @code{True} if the
wrapped function is a @ref{f79,,coroutine function}.



Changed in version 3.12: Sync functions marked with @ref{6b9,,markcoroutinefunction()} now return
@code{True}.



Changed in version 3.13: Functions wrapped in @ref{21a,,functools.partialmethod()} now return @code{True}
if the wrapped function is a @ref{f79,,coroutine function}.

@end deffn

@geindex markcoroutinefunction() (in module inspect)
@anchor{library/inspect inspect markcoroutinefunction}@anchor{6b9}
@deffn {Function} inspect.markcoroutinefunction (func)

Decorator to mark a callable as a @ref{f79,,coroutine function} if it would not
otherwise be detected by @ref{30f,,iscoroutinefunction()}.

This may be of use for sync functions that return a @ref{6ba,,coroutine}, if
the function is passed to an API that requires @ref{30f,,iscoroutinefunction()}.

When possible, using an @ref{7ee,,async def} function is preferred. Also
acceptable is calling the function and testing the return with
@ref{101d,,iscoroutine()}.


Added in version 3.12.

@end deffn

@geindex iscoroutine() (in module inspect)
@anchor{library/inspect inspect iscoroutine}@anchor{101d}
@deffn {Function} inspect.iscoroutine (object)

Return @code{True} if the object is a @ref{6ba,,coroutine} created by an
@ref{7ee,,async def} function.


Added in version 3.5.

@end deffn

@geindex isawaitable() (in module inspect)
@anchor{library/inspect inspect isawaitable}@anchor{101e}
@deffn {Function} inspect.isawaitable (object)

Return @code{True} if the object can be used in @ref{18e,,await} expression.

Can also be used to distinguish generator-based coroutines from regular
generators:

@example
import types

def gen():
    yield
@@types.coroutine
def gen_coro():
    yield

assert not isawaitable(gen())
assert isawaitable(gen_coro())
@end example


Added in version 3.5.

@end deffn

@geindex isasyncgenfunction() (in module inspect)
@anchor{library/inspect inspect isasyncgenfunction}@anchor{1ba0}
@deffn {Function} inspect.isasyncgenfunction (object)

Return @code{True} if the object is an @ref{24e2,,asynchronous generator} function,
for example:

@example
>>> async def agen():
...     yield 1
...
>>> inspect.isasyncgenfunction(agen)
True
@end example


Added in version 3.6.



Changed in version 3.8: Functions wrapped in @ref{219,,functools.partial()} now return @code{True} if the
wrapped function is an @ref{24e2,,asynchronous generator} function.



Changed in version 3.13: Functions wrapped in @ref{21a,,functools.partialmethod()} now return @code{True}
if the wrapped function is a @ref{24e2,,asynchronous generator} function.

@end deffn

@geindex isasyncgen() (in module inspect)
@anchor{library/inspect inspect isasyncgen}@anchor{4d7f}
@deffn {Function} inspect.isasyncgen (object)

Return @code{True} if the object is an @ref{39bc,,asynchronous generator iterator}
created by an @ref{24e2,,asynchronous generator} function.


Added in version 3.6.

@end deffn

@geindex istraceback() (in module inspect)
@anchor{library/inspect inspect istraceback}@anchor{4d80}
@deffn {Function} inspect.istraceback (object)

Return @code{True} if the object is a traceback.
@end deffn

@geindex isframe() (in module inspect)
@anchor{library/inspect inspect isframe}@anchor{4d81}
@deffn {Function} inspect.isframe (object)

Return @code{True} if the object is a frame.
@end deffn

@geindex iscode() (in module inspect)
@anchor{library/inspect inspect iscode}@anchor{4d82}
@deffn {Function} inspect.iscode (object)

Return @code{True} if the object is a code.
@end deffn

@geindex isbuiltin() (in module inspect)
@anchor{library/inspect inspect isbuiltin}@anchor{4d83}
@deffn {Function} inspect.isbuiltin (object)

Return @code{True} if the object is a built-in function or a bound built-in method.
@end deffn

@geindex ismethodwrapper() (in module inspect)
@anchor{library/inspect inspect ismethodwrapper}@anchor{85b}
@deffn {Function} inspect.ismethodwrapper (object)

Return @code{True} if the type of object is a @ref{85c,,MethodWrapperType}.

These are instances of @ref{85c,,MethodWrapperType}, such as @ref{831,,__str__()},
@ref{cf8,,__eq__()} and @ref{830,,__repr__()}.


Added in version 3.11.

@end deffn

@geindex isroutine() (in module inspect)
@anchor{library/inspect inspect isroutine}@anchor{1c20}
@deffn {Function} inspect.isroutine (object)

Return @code{True} if the object is a user-defined or built-in function or method.
@end deffn

@geindex isabstract() (in module inspect)
@anchor{library/inspect inspect isabstract}@anchor{4d84}
@deffn {Function} inspect.isabstract (object)

Return @code{True} if the object is an abstract base class.
@end deffn

@geindex ismethoddescriptor() (in module inspect)
@anchor{library/inspect inspect ismethoddescriptor}@anchor{1992}
@deffn {Function} inspect.ismethoddescriptor (object)

Return @code{True} if the object is a method descriptor, but not if
@ref{4d7c,,ismethod()}, @ref{4d7b,,isclass()}, @ref{4d7d,,isfunction()} or @ref{4d83,,isbuiltin()}
are true.

This, for example, is true of @code{int.__add__}.  An object passing this test
has a @ref{16f4,,__get__()} method, but not a @ref{23fc,,__set__()}
method or a @ref{1993,,__delete__()} method.  Beyond that, the set of
attributes varies.  A @ref{126c,,__name__} attribute is usually
sensible, and @ref{b27,,__doc__} often is.

Methods implemented via descriptors that also pass one of the other tests
return @code{False} from the @code{ismethoddescriptor()} test, simply because the
other tests promise more – you can, e.g., count on having the
@ref{1508,,__func__} attribute (etc) when an object passes
@ref{4d7c,,ismethod()}.


Changed in version 3.13: This function no longer incorrectly reports objects with @ref{16f4,,__get__()}
and @ref{1993,,__delete__()}, but not @ref{23fc,,__set__()}, as being method
descriptors (such objects are data descriptors, not method descriptors).

@end deffn

@geindex isdatadescriptor() (in module inspect)
@anchor{library/inspect inspect isdatadescriptor}@anchor{4d85}
@deffn {Function} inspect.isdatadescriptor (object)

Return @code{True} if the object is a data descriptor.

Data descriptors have a @ref{23fc,,__set__} or a @ref{1993,,__delete__} method.
Examples are properties (defined in Python), getsets, and members.  The
latter two are defined in C and there are more specific tests available for
those types, which is robust across Python implementations.  Typically, data
descriptors will also have @ref{126c,,__name__} and @code{__doc__} attributes
(properties, getsets, and members have both of these attributes), but this is
not guaranteed.
@end deffn

@geindex isgetsetdescriptor() (in module inspect)
@anchor{library/inspect inspect isgetsetdescriptor}@anchor{4d86}
@deffn {Function} inspect.isgetsetdescriptor (object)

Return @code{True} if the object is a getset descriptor.

`CPython implementation detail:' getsets are attributes defined in extension modules via
@ref{db8,,PyGetSetDef} structures.  For Python implementations without such
types, this method will always return @code{False}.
@end deffn

@geindex ismemberdescriptor() (in module inspect)
@anchor{library/inspect inspect ismemberdescriptor}@anchor{4d87}
@deffn {Function} inspect.ismemberdescriptor (object)

Return @code{True} if the object is a member descriptor.

`CPython implementation detail:' Member descriptors are attributes defined in extension modules via
@ref{772,,PyMemberDef} structures.  For Python implementations without such
types, this method will always return @code{False}.
@end deffn

@node Retrieving source code,Introspecting callables with the Signature object,Types and members,inspect — Inspect live objects
@anchor{library/inspect inspect-source}@anchor{4d88}@anchor{library/inspect retrieving-source-code}@anchor{4d89}
@subsubsection Retrieving source code


@geindex getdoc() (in module inspect)
@anchor{library/inspect inspect getdoc}@anchor{bf3}
@deffn {Function} inspect.getdoc (object)

Get the documentation string for an object, cleaned up with @ref{1a73,,cleandoc()}.
If the documentation string for an object is not provided and the object is
a class, a method, a property or a descriptor, retrieve the documentation
string from the inheritance hierarchy.
Return @code{None} if the documentation string is invalid or missing.


Changed in version 3.5: Documentation strings are now inherited if not overridden.

@end deffn

@geindex getcomments() (in module inspect)
@anchor{library/inspect inspect getcomments}@anchor{197c}
@deffn {Function} inspect.getcomments (object)

Return in a single string any lines of comments immediately preceding the
object’s source code (for a class, function, or method), or at the top of the
Python source file (if the object is a module).  If the object’s source code
is unavailable, return @code{None}.  This could happen if the object has been
defined in C or the interactive shell.
@end deffn

@geindex getfile() (in module inspect)
@anchor{library/inspect inspect getfile}@anchor{1ec7}
@deffn {Function} inspect.getfile (object)

Return the name of the (text or binary) file in which an object was defined.
This will fail with a @ref{199,,TypeError} if the object is a built-in module,
class, or function.
@end deffn

@geindex getmodule() (in module inspect)
@anchor{library/inspect inspect getmodule}@anchor{1bb1}
@deffn {Function} inspect.getmodule (object)

Try to guess which module an object was defined in. Return @code{None}
if the module cannot be determined.
@end deffn

@geindex getsourcefile() (in module inspect)
@anchor{library/inspect inspect getsourcefile}@anchor{1bb2}
@deffn {Function} inspect.getsourcefile (object)

Return the name of the Python source file in which an object was defined
or @code{None} if no way can be identified to get the source.  This
will fail with a @ref{199,,TypeError} if the object is a built-in module, class, or
function.
@end deffn

@geindex getsourcelines() (in module inspect)
@anchor{library/inspect inspect getsourcelines}@anchor{1807}
@deffn {Function} inspect.getsourcelines (object)

Return a list of source lines and starting line number for an object. The
argument may be a module, class, method, function, traceback, frame, or code
object.  The source code is returned as a list of the lines corresponding to the
object and the line number indicates where in the original source file the first
line of code was found.  An @ref{2c2,,OSError} is raised if the source code cannot
be retrieved.
A @ref{199,,TypeError} is raised if the object is a built-in module, class, or
function.


Changed in version 3.3: @ref{2c2,,OSError} is raised instead of @ref{1259,,IOError}, now an alias of the
former.

@end deffn

@geindex getsource() (in module inspect)
@anchor{library/inspect inspect getsource}@anchor{1812}
@deffn {Function} inspect.getsource (object)

Return the text of the source code for an object. The argument may be a module,
class, method, function, traceback, frame, or code object.  The source code is
returned as a single string.  An @ref{2c2,,OSError} is raised if the source code
cannot be retrieved.
A @ref{199,,TypeError} is raised if the object is a built-in module, class, or
function.


Changed in version 3.3: @ref{2c2,,OSError} is raised instead of @ref{1259,,IOError}, now an alias of the
former.

@end deffn

@geindex cleandoc() (in module inspect)
@anchor{library/inspect inspect cleandoc}@anchor{1a73}
@deffn {Function} inspect.cleandoc (doc)

Clean up indentation from docstrings that are indented to line up with blocks
of code.

All leading whitespace is removed from the first line.  Any leading whitespace
that can be uniformly removed from the second line onwards is removed.  Empty
lines at the beginning and end are subsequently removed.  Also, all tabs are
expanded to spaces.
@end deffn

@node Introspecting callables with the Signature object,Classes and functions<2>,Retrieving source code,inspect — Inspect live objects
@anchor{library/inspect inspect-signature-object}@anchor{4d8a}@anchor{library/inspect introspecting-callables-with-the-signature-object}@anchor{4d8b}
@subsubsection Introspecting callables with the Signature object



Added in version 3.3.


The @ref{4e4,,Signature} object represents the call signature of a callable object
and its return annotation. To retrieve a @code{Signature} object,
use the @code{signature()}
function.

@geindex signature() (in module inspect)
@anchor{library/inspect inspect signature}@anchor{231}
@deffn {Function} inspect.signature (callable, *, follow_wrapped=True, globals=None, locals=None, eval_str=False, annotation_format=Format.VALUE)

Return a @ref{4e4,,Signature} object for the given `callable':

@example
>>> from inspect import signature
>>> def foo(a, *, b:int, **kwargs):
...     pass

>>> sig = signature(foo)

>>> str(sig)
'(a, *, b: int, **kwargs)'

>>> str(sig.parameters['b'])
'b: int'

>>> sig.parameters['b'].annotation
<class 'int'>
@end example

Accepts a wide range of Python callables, from plain functions and classes to
@ref{219,,functools.partial()} objects.

If some of the annotations are strings (e.g., because
@code{from __future__ import annotations} was used), @code{signature()} will
attempt to automatically un-stringize the annotations using
@ref{457,,annotationlib.get_annotations()}.  The
`globals', `locals', and `eval_str' parameters are passed
into @code{annotationlib.get_annotations()} when resolving the
annotations; see the documentation for @code{annotationlib.get_annotations()}
for instructions on how to use these parameters. A member of the
@ref{232,,annotationlib.Format} enum can be passed to the
`annotation_format' parameter to control the format of the returned
annotations. For example, use
@code{annotation_format=annotationlib.Format.STRING} to return annotations in string
format.

Raises @ref{2ee,,ValueError} if no signature can be provided, and
@ref{199,,TypeError} if that type of object is not supported.  Also,
if the annotations are stringized, and `eval_str' is not false,
the @code{eval()} call(s) to un-stringize the annotations in @ref{457,,annotationlib.get_annotations()}
could potentially raise any kind of exception.

A slash (/) in the signature of a function denotes that the parameters prior
to it are positional-only. For more info, see
@ref{261d,,the FAQ entry on positional-only parameters}.


Changed in version 3.5: The `follow_wrapped' parameter was added.
Pass @code{False} to get a signature of
`callable' specifically (@code{callable.__wrapped__} will not be used to
unwrap decorated callables.)



Changed in version 3.10: The `globals', `locals', and `eval_str' parameters were added.



Changed in version 3.14: The `annotation_format' parameter was added.


@cartouche
@quotation Note 
Some callables may not be introspectable in certain implementations of
Python.  For example, in CPython, some built-in functions defined in
C provide no metadata about their arguments.
@end quotation
@end cartouche

`CPython implementation detail:' If the passed object has a @code{__signature__} attribute,
we may use it to create the signature.
The exact semantics are an implementation detail and are subject to
unannounced changes. Consult the source code for current semantics.
@end deffn

@geindex Signature (class in inspect)
@anchor{library/inspect inspect Signature}@anchor{4e4}
@deffn {Class} inspect.Signature (parameters=None, *, return_annotation=Signature.empty)

A @code{Signature} object represents the call signature of a function
and its return
annotation.  For each parameter accepted by the function it stores a
@ref{4e5,,Parameter} object in its @ref{4d8c,,parameters} collection.

The optional `parameters' argument is a sequence of @ref{4e5,,Parameter}
objects, which is validated to check that there are no parameters with
duplicate names, and that the parameters are in the right order, i.e.
positional-only first, then positional-or-keyword, and that parameters with
defaults follow parameters without defaults.

The optional `return_annotation' argument can be an arbitrary Python object.
It represents the “return” annotation of the callable.

@code{Signature} objects are `immutable'.  Use @ref{4d8d,,Signature.replace()} or
@ref{1c2,,copy.replace()} to make a modified copy.


Changed in version 3.5: @code{Signature} objects are now picklable and @ref{825,,hashable}.


@geindex empty (inspect.Signature attribute)
@anchor{library/inspect inspect Signature empty}@anchor{4d8e}
@deffn {Attribute} empty

A special class-level marker to specify absence of a return annotation.
@end deffn

@geindex parameters (inspect.Signature attribute)
@anchor{library/inspect inspect Signature parameters}@anchor{4d8c}
@deffn {Attribute} parameters

An ordered mapping of parameters’ names to the corresponding
@ref{4e5,,Parameter} objects.  Parameters appear in strict definition
order, including keyword-only parameters.


Changed in version 3.7: Python only explicitly guaranteed that it preserved the declaration
order of keyword-only parameters as of version 3.7, although in practice
this order had always been preserved in Python 3.

@end deffn

@geindex return_annotation (inspect.Signature attribute)
@anchor{library/inspect inspect Signature return_annotation}@anchor{4d8f}
@deffn {Attribute} return_annotation

The “return” annotation for the callable.  If the callable has no “return”
annotation, this attribute is set to @ref{4d8e,,Signature.empty}.
@end deffn

@geindex bind() (inspect.Signature method)
@anchor{library/inspect inspect Signature bind}@anchor{18d9}
@deffn {Method} bind (*args, **kwargs)

Create a mapping from positional and keyword arguments to parameters.
Returns @ref{126f,,BoundArguments} if @code{*args} and @code{**kwargs} match the
signature, or raises a @ref{199,,TypeError}.
@end deffn

@geindex bind_partial() (inspect.Signature method)
@anchor{library/inspect inspect Signature bind_partial}@anchor{4d90}
@deffn {Method} bind_partial (*args, **kwargs)

Works the same way as @ref{18d9,,Signature.bind()}, but allows the omission of
some required arguments (mimics @ref{219,,functools.partial()} behavior.)
Returns @ref{126f,,BoundArguments}, or raises a @ref{199,,TypeError} if the
passed arguments do not match the signature.
@end deffn

@geindex replace() (inspect.Signature method)
@anchor{library/inspect inspect Signature replace}@anchor{4d8d}
@deffn {Method} replace (*[, parameters][, return_annotation])

Create a new @code{Signature} instance based on the instance
@code{replace()} was invoked on.
It is possible to pass different `parameters' and/or
`return_annotation' to override the corresponding properties of the base
signature.  To remove @code{return_annotation} from the copied
@code{Signature}, pass in
@ref{4d8e,,Signature.empty}.

@example
>>> def test(a, b):
...     pass
...
>>> sig = signature(test)
>>> new_sig = sig.replace(return_annotation="new return anno")
>>> str(new_sig)
"(a, b) -> 'new return anno'"
@end example

@code{Signature} objects are also supported by the generic function
@ref{1c2,,copy.replace()}.
@end deffn

@geindex format() (inspect.Signature method)
@anchor{library/inspect inspect Signature format}@anchor{233}
@deffn {Method} format (*, max_width=None, quote_annotation_strings=True)

Create a string representation of the @code{Signature} object.

If `max_width' is passed, the method will attempt to fit
the signature into lines of at most `max_width' characters.
If the signature is longer than `max_width',
all parameters will be on separate lines.

If `quote_annotation_strings' is False, @ref{15d,,annotations}
in the signature are displayed without opening and closing quotation
marks if they are strings. This is useful if the signature was created with the
@ref{161,,STRING} format or if
@code{from __future__ import annotations} was used.


Added in version 3.13.



Changed in version 3.14: The `unquote_annotations' parameter was added.

@end deffn

@geindex from_callable() (inspect.Signature class method)
@anchor{library/inspect inspect Signature from_callable}@anchor{947}
@deffn {Method} classmethod from_callable (obj, *, follow_wrapped=True, globals=None, locals=None, eval_str=False)

Return a @code{Signature} (or its subclass) object for a given callable
`obj'.

This method simplifies subclassing of @code{Signature}:

@example
class MySignature(Signature):
    pass
sig = MySignature.from_callable(sum)
assert isinstance(sig, MySignature)
@end example

Its behavior is otherwise identical to that of @ref{231,,signature()}.


Added in version 3.5.



Changed in version 3.10: The `globals', `locals', and `eval_str' parameters were added.

@end deffn
@end deffn

@geindex Parameter (class in inspect)
@anchor{library/inspect inspect Parameter}@anchor{4e5}
@deffn {Class} inspect.Parameter (name, kind, *, default=Parameter.empty, annotation=Parameter.empty)

@code{Parameter} objects are `immutable'.
Instead of modifying a @code{Parameter} object,
you can use @ref{4d91,,Parameter.replace()} or @ref{1c2,,copy.replace()} to create a modified copy.


Changed in version 3.5: Parameter objects are now picklable and @ref{825,,hashable}.


@geindex empty (inspect.Parameter attribute)
@anchor{library/inspect inspect Parameter empty}@anchor{4d92}
@deffn {Attribute} empty

A special class-level marker to specify absence of default values and
annotations.
@end deffn

@geindex name (inspect.Parameter attribute)
@anchor{library/inspect inspect Parameter name}@anchor{4d93}
@deffn {Attribute} name

The name of the parameter as a string.  The name must be a valid
Python identifier.

`CPython implementation detail:' CPython generates implicit parameter names of the form @code{.0} on the
code objects used to implement comprehensions and generator
expressions.


Changed in version 3.6: These parameter names are now exposed by this module as names like
@code{implicit0}.

@end deffn

@geindex default (inspect.Parameter attribute)
@anchor{library/inspect inspect Parameter default}@anchor{4d94}
@deffn {Attribute} default

The default value for the parameter.  If the parameter has no default
value, this attribute is set to @ref{4d92,,Parameter.empty}.
@end deffn

@geindex annotation (inspect.Parameter attribute)
@anchor{library/inspect inspect Parameter annotation}@anchor{4d95}
@deffn {Attribute} annotation

The annotation for the parameter.  If the parameter has no annotation,
this attribute is set to @ref{4d92,,Parameter.empty}.
@end deffn

@geindex kind (inspect.Parameter attribute)
@anchor{library/inspect inspect Parameter kind}@anchor{4d96}
@deffn {Attribute} kind

Describes how argument values are bound to the parameter.  The possible
values are accessible via @code{Parameter} (like @code{Parameter.KEYWORD_ONLY}),
and support comparison and ordering, in the following order:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Name

@tab

Meaning

@item

`POSITIONAL_ONLY'

@tab

Value must be supplied as a positional
argument. Positional only parameters are
those which appear before a @code{/} entry (if
present) in a Python function definition.

@item

`POSITIONAL_OR_KEYWORD'

@tab

Value may be supplied as either a keyword or
positional argument (this is the standard
binding behaviour for functions implemented
in Python.)

@item

`VAR_POSITIONAL'

@tab

A tuple of positional arguments that aren’t
bound to any other parameter. This
corresponds to a @code{*args} parameter in a
Python function definition.

@item

`KEYWORD_ONLY'

@tab

Value must be supplied as a keyword argument.
Keyword only parameters are those which
appear after a @code{*} or @code{*args} entry in a
Python function definition.

@item

`VAR_KEYWORD'

@tab

A dict of keyword arguments that aren’t bound
to any other parameter. This corresponds to a
@code{**kwargs} parameter in a Python function
definition.

@end multitable


Example: print all keyword-only arguments without default values:

@example
>>> def foo(a, b, *, c, d=10):
...     pass

>>> sig = signature(foo)
>>> for param in sig.parameters.values():
...     if (param.kind == param.KEYWORD_ONLY and
...                        param.default is param.empty):
...         print('Parameter:', param)
Parameter: c
@end example
@end deffn

@geindex description (inspect.Parameter.kind attribute)
@anchor{library/inspect inspect Parameter kind description}@anchor{4d97}
@deffn {Attribute} kind.description

Describes an enum value of @ref{4d96,,Parameter.kind}.


Added in version 3.8.


Example: print all descriptions of arguments:

@example
>>> def foo(a, b, *, c, d=10):
...     pass

>>> sig = signature(foo)
>>> for param in sig.parameters.values():
...     print(param.kind.description)
positional or keyword
positional or keyword
keyword-only
keyword-only
@end example
@end deffn

@geindex replace() (inspect.Parameter method)
@anchor{library/inspect inspect Parameter replace}@anchor{4d91}
@deffn {Method} replace (*[, name][, kind][, default][, annotation])

Create a new @code{Parameter} instance based on the instance replaced was invoked
on.  To override a @code{Parameter} attribute, pass the corresponding
argument.  To remove a default value or/and an annotation from a
@code{Parameter}, pass @ref{4d92,,Parameter.empty}.

@example
>>> from inspect import Parameter
>>> param = Parameter('foo', Parameter.KEYWORD_ONLY, default=42)
>>> str(param)
'foo=42'

>>> str(param.replace()) # Will create a shallow copy of 'param'
'foo=42'

>>> str(param.replace(default=Parameter.empty, annotation='spam'))
"foo: 'spam'"
@end example

@code{Parameter} objects are also supported by the generic function
@ref{1c2,,copy.replace()}.
@end deffn


Changed in version 3.4: In Python 3.3 @code{Parameter} objects were allowed to have @code{name} set
to @code{None} if their @code{kind} was set to @code{POSITIONAL_ONLY}.
This is no longer permitted.

@end deffn

@geindex BoundArguments (class in inspect)
@anchor{library/inspect inspect BoundArguments}@anchor{126f}
@deffn {Class} inspect.BoundArguments

Result of a @ref{18d9,,Signature.bind()} or @ref{4d90,,Signature.bind_partial()} call.
Holds the mapping of arguments to the function’s parameters.

@geindex arguments (inspect.BoundArguments attribute)
@anchor{library/inspect inspect BoundArguments arguments}@anchor{b0e}
@deffn {Attribute} arguments

A mutable mapping of parameters’ names to arguments’ values.
Contains only explicitly bound arguments.  Changes in @ref{b0e,,arguments}
will reflect in @ref{4d98,,args} and @ref{4d99,,kwargs}.

Should be used in conjunction with @ref{4d8c,,Signature.parameters} for any
argument processing purposes.

@cartouche
@quotation Note 
Arguments for which @ref{18d9,,Signature.bind()} or
@ref{4d90,,Signature.bind_partial()} relied on a default value are skipped.
However, if needed, use @ref{101c,,BoundArguments.apply_defaults()} to add
them.
@end quotation
@end cartouche


Changed in version 3.9: @ref{b0e,,arguments} is now of type @ref{184,,dict}. Formerly, it was of
type @ref{7f4,,collections.OrderedDict}.

@end deffn

@geindex args (inspect.BoundArguments attribute)
@anchor{library/inspect inspect BoundArguments args}@anchor{4d98}
@deffn {Attribute} args

A tuple of positional arguments values.  Dynamically computed from the
@ref{b0e,,arguments} attribute.
@end deffn

@geindex kwargs (inspect.BoundArguments attribute)
@anchor{library/inspect inspect BoundArguments kwargs}@anchor{4d99}
@deffn {Attribute} kwargs

A dict of keyword arguments values.  Dynamically computed from the
@ref{b0e,,arguments} attribute.  Arguments that can be passed positionally
are included in @ref{4d98,,args} instead.
@end deffn

@geindex signature (inspect.BoundArguments attribute)
@anchor{library/inspect inspect BoundArguments signature}@anchor{4d9a}
@deffn {Attribute} signature

A reference to the parent @ref{4e4,,Signature} object.
@end deffn

@geindex apply_defaults() (inspect.BoundArguments method)
@anchor{library/inspect inspect BoundArguments apply_defaults}@anchor{101c}
@deffn {Method} apply_defaults ()

Set default values for missing arguments.

For variable-positional arguments (@code{*args}) the default is an
empty tuple.

For variable-keyword arguments (@code{**kwargs}) the default is an
empty dict.

@example
>>> def foo(a, b='ham', *args): pass
>>> ba = inspect.signature(foo).bind('spam')
>>> ba.apply_defaults()
>>> ba.arguments
@{'a': 'spam', 'b': 'ham', 'args': ()@}
@end example


Added in version 3.5.

@end deffn

The @ref{4d98,,args} and @ref{4d99,,kwargs} properties can be used to invoke
functions:

@example
def test(a, *, b):
    ...

sig = signature(test)
ba = sig.bind(10, b=20)
test(*ba.args, **ba.kwargs)
@end example
@end deffn


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 362

@item PEP 362@footnote{https://peps.python.org/pep-0362/} - Function Signature Object.

The detailed specification, implementation details and examples.
@end table


@node Classes and functions<2>,The interpreter stack,Introspecting callables with the Signature object,inspect — Inspect live objects
@anchor{library/inspect classes-and-functions}@anchor{4d9b}@anchor{library/inspect inspect-classes-functions}@anchor{4d9c}
@subsubsection Classes and functions


@geindex getclasstree() (in module inspect)
@anchor{library/inspect inspect getclasstree}@anchor{4d9d}
@deffn {Function} inspect.getclasstree (classes, unique=False)

Arrange the given list of classes into a hierarchy of nested lists. Where a
nested list appears, it contains classes derived from the class whose entry
immediately precedes the list.  Each entry is a 2-tuple containing a class and a
tuple of its base classes.  If the `unique' argument is true, exactly one entry
appears in the returned structure for each class in the given list.  Otherwise,
classes using multiple inheritance and their descendants will appear multiple
times.
@end deffn

@geindex getfullargspec() (in module inspect)
@anchor{library/inspect inspect getfullargspec}@anchor{946}
@deffn {Function} inspect.getfullargspec (func)

Get the names and default values of a Python function’s parameters.  A
@ref{85f,,named tuple} is returned:

@code{FullArgSpec(args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults,
annotations)}

`args' is a list of the positional parameter names.
`varargs' is the name of the @code{*} parameter or @code{None} if arbitrary
positional arguments are not accepted.
`varkw' is the name of the @code{**} parameter or @code{None} if arbitrary
keyword arguments are not accepted.
`defaults' is an `n'-tuple of default argument values corresponding to the
last `n' positional parameters, or @code{None} if there are no such defaults
defined.
`kwonlyargs' is a list of keyword-only parameter names in declaration order.
`kwonlydefaults' is a dictionary mapping parameter names from `kwonlyargs'
to the default values used if no argument is supplied.
`annotations' is a dictionary mapping parameter names to annotations.
The special key @code{"return"} is used to report the function return value
annotation (if any).

Note that @ref{231,,signature()} and
@ref{4d8a,,Signature Object} provide the recommended
API for callable introspection, and support additional behaviours (like
positional-only arguments) that are sometimes encountered in extension module
APIs. This function is retained primarily for use in code that needs to
maintain compatibility with the Python 2 @code{inspect} module API.


Changed in version 3.4: This function is now based on @ref{231,,signature()}, but still ignores
@code{__wrapped__} attributes and includes the already bound first
parameter in the signature output for bound methods.



Changed in version 3.6: This method was previously documented as deprecated in favour of
@ref{231,,signature()} in Python 3.5, but that decision has been reversed
in order to restore a clearly supported standard interface for
single-source Python 2/3 code migrating away from the legacy
@code{getargspec()} API.



Changed in version 3.7: Python only explicitly guaranteed that it preserved the declaration
order of keyword-only parameters as of version 3.7, although in practice
this order had always been preserved in Python 3.

@end deffn

@geindex getargvalues() (in module inspect)
@anchor{library/inspect inspect getargvalues}@anchor{10c5}
@deffn {Function} inspect.getargvalues (frame)

Get information about arguments passed into a particular frame.  A
@ref{85f,,named tuple} @code{ArgInfo(args, varargs, keywords, locals)} is
returned. `args' is a list of the argument names.  `varargs' and `keywords'
are the names of the @code{*} and @code{**} arguments or @code{None}.  `locals' is the
locals dictionary of the given frame.

@cartouche
@quotation Note 
This function was inadvertently marked as deprecated in Python 3.5.
@end quotation
@end cartouche
@end deffn

@geindex formatargvalues() (in module inspect)
@anchor{library/inspect inspect formatargvalues}@anchor{10c6}
@deffn {Function} inspect.formatargvalues (args[, varargs, varkw, locals, formatarg, formatvarargs, formatvarkw, formatvalue])

Format a pretty argument spec from the four values returned by
@ref{10c5,,getargvalues()}.  The format* arguments are the corresponding optional
formatting functions that are called to turn names and values into strings.

@cartouche
@quotation Note 
This function was inadvertently marked as deprecated in Python 3.5.
@end quotation
@end cartouche
@end deffn

@geindex getmro() (in module inspect)
@anchor{library/inspect inspect getmro}@anchor{4d9e}
@deffn {Function} inspect.getmro (cls)

Return a tuple of class cls’s base classes, including cls, in method resolution
order.  No class appears more than once in this tuple. Note that the method
resolution order depends on cls’s type.  Unless a very peculiar user-defined
metatype is in use, cls will be the first element of the tuple.
@end deffn

@geindex getcallargs() (in module inspect)
@anchor{library/inspect inspect getcallargs}@anchor{10c4}
@deffn {Function} inspect.getcallargs (func, /, *args, **kwds)

Bind the `args' and `kwds' to the argument names of the Python function or
method `func', as if it was called with them. For bound methods, bind also the
first argument (typically named @code{self}) to the associated instance. A dict
is returned, mapping the argument names (including the names of the @code{*} and
@code{**} arguments, if any) to their values from `args' and `kwds'. In case of
invoking `func' incorrectly, i.e. whenever @code{func(*args, **kwds)} would raise
an exception because of incompatible signature, an exception of the same type
and the same or similar message is raised. For example:

@example
>>> from inspect import getcallargs
>>> def f(a, b=1, *pos, **named):
...     pass
...
>>> getcallargs(f, 1, 2, 3) == @{'a': 1, 'named': @{@}, 'b': 2, 'pos': (3,)@}
True
>>> getcallargs(f, a=2, x=4) == @{'a': 2, 'named': @{'x': 4@}, 'b': 1, 'pos': ()@}
True
>>> getcallargs(f)
Traceback (most recent call last):
...
TypeError: f() missing 1 required positional argument: 'a'
@end example


Added in version 3.2.



Deprecated since version 3.5: Use @ref{18d9,,Signature.bind()} and @ref{4d90,,Signature.bind_partial()} instead.

@end deffn

@geindex getclosurevars() (in module inspect)
@anchor{library/inspect inspect getclosurevars}@anchor{12e1}
@deffn {Function} inspect.getclosurevars (func)

Get the mapping of external name references in a Python function or
method `func' to their current values. A
@ref{85f,,named tuple} @code{ClosureVars(nonlocals, globals, builtins, unbound)}
is returned. `nonlocals' maps referenced names to lexical closure
variables, `globals' to the function’s module globals and `builtins' to
the builtins visible from the function body. `unbound' is the set of names
referenced in the function that could not be resolved at all given the
current module globals and builtins.

@ref{199,,TypeError} is raised if `func' is not a Python function or method.


Added in version 3.3.

@end deffn

@geindex unwrap() (in module inspect)
@anchor{library/inspect inspect unwrap}@anchor{1162}
@deffn {Function} inspect.unwrap (func, *, stop=None)

Get the object wrapped by `func'. It follows the chain of @code{__wrapped__}
attributes returning the last object in the chain.

`stop' is an optional callback accepting an object in the wrapper chain
as its sole argument that allows the unwrapping to be terminated early if
the callback returns a true value. If the callback never returns a true
value, the last object in the chain is returned as usual. For example,
@ref{231,,signature()} uses this to stop unwrapping if any object in the
chain has a @code{__signature__} attribute defined.

@ref{2ee,,ValueError} is raised if a cycle is encountered.


Added in version 3.4.

@end deffn

@geindex get_annotations() (in module inspect)
@anchor{library/inspect inspect get_annotations}@anchor{a1a}
@deffn {Function} inspect.get_annotations (obj, *, globals=None, locals=None, eval_str=False, format=annotationlib.Format.VALUE)

Compute the annotations dict for an object.

This is an alias for @ref{457,,annotationlib.get_annotations()}; see the documentation
of that function for more information.

@cartouche
@quotation Caution 
This function may execute arbitrary code contained in annotations.
See @ref{4878,,Security implications of introspecting annotations} for more information.
@end quotation
@end cartouche


Added in version 3.10.



Changed in version 3.14: This function is now an alias for @ref{457,,annotationlib.get_annotations()}.
Calling it as @code{inspect.get_annotations} will continue to work.

@end deffn

@node The interpreter stack,Fetching attributes statically,Classes and functions<2>,inspect — Inspect live objects
@anchor{library/inspect inspect-stack}@anchor{4d9f}@anchor{library/inspect the-interpreter-stack}@anchor{4da0}
@subsubsection The interpreter stack


Some of the following functions return
@ref{85d,,FrameInfo} objects. For backwards compatibility these objects allow
tuple-like operations on all attributes except @code{positions}. This behavior
is considered deprecated and may be removed in the future.

@geindex FrameInfo (class in inspect)
@anchor{library/inspect inspect FrameInfo}@anchor{85d}
@deffn {Class} inspect.FrameInfo

@geindex frame (inspect.FrameInfo attribute)
@anchor{library/inspect inspect FrameInfo frame}@anchor{4da1}
@deffn {Attribute} frame

The @ref{8f1,,frame object} that the record corresponds to.
@end deffn

@geindex filename (inspect.FrameInfo attribute)
@anchor{library/inspect inspect FrameInfo filename}@anchor{4da2}
@deffn {Attribute} filename

The file name associated with the code being executed by the frame this record
corresponds to.
@end deffn

@geindex lineno (inspect.FrameInfo attribute)
@anchor{library/inspect inspect FrameInfo lineno}@anchor{4da3}
@deffn {Attribute} lineno

The line number of the current line associated with the code being
executed by the frame this record corresponds to.
@end deffn

@geindex function (inspect.FrameInfo attribute)
@anchor{library/inspect inspect FrameInfo function}@anchor{4da4}
@deffn {Attribute} function

The function name that is being executed by the frame this record corresponds to.
@end deffn

@geindex code_context (inspect.FrameInfo attribute)
@anchor{library/inspect inspect FrameInfo code_context}@anchor{4da5}
@deffn {Attribute} code_context

A list of lines of context from the source code that’s being executed by the frame
this record corresponds to.
@end deffn

@geindex index (inspect.FrameInfo attribute)
@anchor{library/inspect inspect FrameInfo index}@anchor{4da6}
@deffn {Attribute} index

The index of the current line being executed in the @ref{4da5,,code_context} list.
@end deffn

@geindex positions (inspect.FrameInfo attribute)
@anchor{library/inspect inspect FrameInfo positions}@anchor{4da7}
@deffn {Attribute} positions

A @ref{1984,,dis.Positions} object containing the start line number, end line
number, start column offset, and end column offset associated with the
instruction being executed by the frame this record corresponds to.
@end deffn


Changed in version 3.5: Return a @ref{85f,,named tuple} instead of a @ref{614,,tuple}.



Changed in version 3.11: @code{FrameInfo} is now a class instance
(that is backwards compatible with the previous @ref{85f,,named tuple}).

@end deffn

@geindex Traceback (class in inspect)
@anchor{library/inspect inspect Traceback}@anchor{85e}
@deffn {Class} inspect.Traceback

@geindex filename (inspect.Traceback attribute)
@anchor{library/inspect inspect Traceback filename}@anchor{4da8}
@deffn {Attribute} filename

The file name associated with the code being executed by the frame this traceback
corresponds to.
@end deffn

@geindex lineno (inspect.Traceback attribute)
@anchor{library/inspect inspect Traceback lineno}@anchor{4da9}
@deffn {Attribute} lineno

The line number of the current line associated with the code being
executed by the frame this traceback corresponds to.
@end deffn

@geindex function (inspect.Traceback attribute)
@anchor{library/inspect inspect Traceback function}@anchor{4daa}
@deffn {Attribute} function

The function name that is being executed by the frame this traceback corresponds to.
@end deffn

@geindex code_context (inspect.Traceback attribute)
@anchor{library/inspect inspect Traceback code_context}@anchor{4dab}
@deffn {Attribute} code_context

A list of lines of context from the source code that’s being executed by the frame
this traceback corresponds to.
@end deffn

@geindex index (inspect.Traceback attribute)
@anchor{library/inspect inspect Traceback index}@anchor{4dac}
@deffn {Attribute} index

The index of the current line being executed in the @ref{4dab,,code_context} list.
@end deffn

@geindex positions (inspect.Traceback attribute)
@anchor{library/inspect inspect Traceback positions}@anchor{4dad}
@deffn {Attribute} positions

A @ref{1984,,dis.Positions} object containing the start line number, end
line number, start column offset, and end column offset associated with
the instruction being executed by the frame this traceback corresponds
to.
@end deffn


Changed in version 3.11: @code{Traceback} is now a class instance
(that is backwards compatible with the previous @ref{85f,,named tuple}).

@end deffn

@cartouche
@quotation Note 
Keeping references to frame objects, as found in the first element of the frame
records these functions return, can cause your program to create reference
cycles.  Once a reference cycle has been created, the lifespan of all objects
which can be accessed from the objects which form the cycle can become much
longer even if Python’s optional cycle detector is enabled.  If such cycles must
be created, it is important to ensure they are explicitly broken to avoid the
delayed destruction of objects and increased memory consumption which occurs.

Though the cycle detector will catch these, destruction of the frames (and local
variables) can be made deterministic by removing the cycle in a
@ref{1b1,,finally} clause.  This is also important if the cycle detector was
disabled when Python was compiled or using @ref{4d6d,,gc.disable()}.  For example:

@example
def handle_stackframe_without_leak():
    frame = inspect.currentframe()
    try:
        # do something with the frame
    finally:
        del frame
@end example

If you want to keep the frame around (for example to print a traceback
later), you can also break reference cycles by using the
@ref{585,,frame.clear()} method.
@end quotation
@end cartouche

The optional `context' argument supported by most of these functions specifies
the number of lines of context to return, which are centered around the current
line.

@geindex getframeinfo() (in module inspect)
@anchor{library/inspect inspect getframeinfo}@anchor{860}
@deffn {Function} inspect.getframeinfo (frame, context=1)

Get information about a frame or traceback object.  A @ref{85e,,Traceback} object
is returned.


Changed in version 3.11: A @ref{85e,,Traceback} object is returned instead of a named tuple.

@end deffn

@geindex getouterframes() (in module inspect)
@anchor{library/inspect inspect getouterframes}@anchor{861}
@deffn {Function} inspect.getouterframes (frame, context=1)

Get a list of @ref{85d,,FrameInfo} objects for a frame and all outer frames.
These frames represent the calls that lead to the creation of `frame'. The
first entry in the returned list represents `frame'; the last entry
represents the outermost call on `frame'’s stack.


Changed in version 3.5: A list of @ref{85f,,named tuples}
@code{FrameInfo(frame, filename, lineno, function, code_context, index)}
is returned.



Changed in version 3.11: A list of @ref{85d,,FrameInfo} objects is returned.

@end deffn

@geindex getinnerframes() (in module inspect)
@anchor{library/inspect inspect getinnerframes}@anchor{862}
@deffn {Function} inspect.getinnerframes (traceback, context=1)

Get a list of @ref{85d,,FrameInfo} objects for a traceback’s frame and all
inner frames.  These frames represent calls made as a consequence of `frame'.
The first entry in the list represents `traceback'; the last entry represents
where the exception was raised.


Changed in version 3.5: A list of @ref{85f,,named tuples}
@code{FrameInfo(frame, filename, lineno, function, code_context, index)}
is returned.



Changed in version 3.11: A list of @ref{85d,,FrameInfo} objects is returned.

@end deffn

@geindex currentframe() (in module inspect)
@anchor{library/inspect inspect currentframe}@anchor{8f3}
@deffn {Function} inspect.currentframe ()

Return the frame object for the caller’s stack frame.

`CPython implementation detail:' This function relies on Python stack frame support in the interpreter,
which isn’t guaranteed to exist in all implementations of Python.  If
running in an implementation without Python stack frame support this
function returns @code{None}.
@end deffn

@geindex stack() (in module inspect)
@anchor{library/inspect inspect stack}@anchor{863}
@deffn {Function} inspect.stack (context=1)

Return a list of @ref{85d,,FrameInfo} objects for the caller’s stack.  The
first entry in the returned list represents the caller; the last entry
represents the outermost call on the stack.


Changed in version 3.5: A list of @ref{85f,,named tuples}
@code{FrameInfo(frame, filename, lineno, function, code_context, index)}
is returned.



Changed in version 3.11: A list of @ref{85d,,FrameInfo} objects is returned.

@end deffn

@geindex trace() (in module inspect)
@anchor{library/inspect inspect trace}@anchor{864}
@deffn {Function} inspect.trace (context=1)

Return a list of @ref{85d,,FrameInfo} objects for the stack between the current
frame and the frame in which an exception currently being handled was raised
in.  The first entry in the list represents the caller; the last entry
represents where the exception was raised.


Changed in version 3.5: A list of @ref{85f,,named tuples}
@code{FrameInfo(frame, filename, lineno, function, code_context, index)}
is returned.



Changed in version 3.11: A list of @ref{85d,,FrameInfo} objects is returned.

@end deffn

@node Fetching attributes statically,Current State of Generators Coroutines and Asynchronous Generators,The interpreter stack,inspect — Inspect live objects
@anchor{library/inspect fetching-attributes-statically}@anchor{4dae}
@subsubsection Fetching attributes statically


Both @ref{dd0,,getattr()} and @ref{6fa,,hasattr()} can trigger code execution when
fetching or checking for the existence of attributes. Descriptors, like
properties, will be invoked and @ref{6fb,,__getattr__()} and
@ref{dd1,,__getattribute__()}
may be called.

For cases where you want passive introspection, like documentation tools, this
can be inconvenient. @ref{6bd,,getattr_static()} has a similar signature as @ref{dd0,,getattr()}
but avoids executing code when it fetches attributes.

@geindex getattr_static() (in module inspect)
@anchor{library/inspect inspect getattr_static}@anchor{6bd}
@deffn {Function} inspect.getattr_static (obj, attr)

@deffnx {Function} inspect.getattr_static (obj, attr, default)

Retrieve attributes without triggering dynamic lookup via the
descriptor protocol, @ref{6fb,,__getattr__()}
or @ref{dd1,,__getattribute__()}.

Note: this function may not be able to retrieve all attributes
that getattr can fetch (like dynamically created attributes)
and may find attributes that getattr can’t (like descriptors
that raise AttributeError). It can also return descriptors objects
instead of instance members.

If the instance @ref{77e,,__dict__} is shadowed by another member (for
example a property) then this function will be unable to find instance
members.


Added in version 3.2.

@end deffn

@ref{6bd,,getattr_static()} does not resolve descriptors, for example slot descriptors or
getset descriptors on objects implemented in C. The descriptor object
is returned instead of the underlying attribute.

You can handle these with code like the following. Note that
for arbitrary getset descriptors invoking these may trigger
code execution:

@example
# example code for resolving the builtin descriptor types
class _foo:
    __slots__ = ['foo']

slot_descriptor = type(_foo.foo)
getset_descriptor = type(type(open(__file__)).name)
wrapper_descriptor = type(str.__dict__['__add__'])
descriptor_types = (slot_descriptor, getset_descriptor, wrapper_descriptor)

result = getattr_static(some_object, 'foo')
if type(result) in descriptor_types:
    try:
        result = result.__get__()
    except AttributeError:
        # descriptors can raise AttributeError to
        # indicate there is no underlying value
        # in which case the descriptor itself will
        # have to do
        pass
@end example

@node Current State of Generators Coroutines and Asynchronous Generators,Code Objects Bit Flags,Fetching attributes statically,inspect — Inspect live objects
@anchor{library/inspect current-state-of-generators-coroutines-and-asynchronous-generators}@anchor{4daf}
@subsubsection Current State of Generators, Coroutines, and Asynchronous Generators


When implementing coroutine schedulers and for other advanced uses of
generators, it is useful to determine whether a generator is currently
executing, is waiting to start or resume or execution, or has already
terminated. @ref{1442,,getgeneratorstate()} allows the current state of a
generator to be determined easily.

@geindex getgeneratorstate() (in module inspect)
@anchor{library/inspect inspect getgeneratorstate}@anchor{1442}
@deffn {Function} inspect.getgeneratorstate (generator)

Get current state of a generator-iterator.

Possible states are:


@itemize *

@item 
GEN_CREATED: Waiting to start execution.

@item 
GEN_RUNNING: Currently being executed by the interpreter.

@item 
GEN_SUSPENDED: Currently suspended at a yield expression.

@item 
GEN_CLOSED: Execution has completed.
@end itemize


Added in version 3.2.

@end deffn

@geindex getcoroutinestate() (in module inspect)
@anchor{library/inspect inspect getcoroutinestate}@anchor{1020}
@deffn {Function} inspect.getcoroutinestate (coroutine)

Get current state of a coroutine object.  The function is intended to be
used with coroutine objects created by @ref{7ee,,async def} functions, but
will accept any coroutine-like object that has @code{cr_running} and
@code{cr_frame} attributes.

Possible states are:


@itemize *

@item 
CORO_CREATED: Waiting to start execution.

@item 
CORO_RUNNING: Currently being executed by the interpreter.

@item 
CORO_SUSPENDED: Currently suspended at an await expression.

@item 
CORO_CLOSED: Execution has completed.
@end itemize


Added in version 3.5.

@end deffn

@geindex getasyncgenstate() (in module inspect)
@anchor{library/inspect inspect getasyncgenstate}@anchor{6bb}
@deffn {Function} inspect.getasyncgenstate (agen)

Get current state of an asynchronous generator object.  The function is
intended to be used with asynchronous iterator objects created by
@ref{7ee,,async def} functions which use the @ref{bc8,,yield} statement,
but will accept any asynchronous generator-like object that has
@code{ag_running} and @code{ag_frame} attributes.

Possible states are:


@itemize *

@item 
AGEN_CREATED: Waiting to start execution.

@item 
AGEN_RUNNING: Currently being executed by the interpreter.

@item 
AGEN_SUSPENDED: Currently suspended at a yield expression.

@item 
AGEN_CLOSED: Execution has completed.
@end itemize


Added in version 3.12.

@end deffn

The current internal state of the generator can also be queried. This is
mostly useful for testing purposes, to ensure that internal state is being
updated as expected:

@geindex getgeneratorlocals() (in module inspect)
@anchor{library/inspect inspect getgeneratorlocals}@anchor{12e2}
@deffn {Function} inspect.getgeneratorlocals (generator)

Get the mapping of live local variables in `generator' to their current
values.  A dictionary is returned that maps from variable names to values.
This is the equivalent of calling @ref{46f,,locals()} in the body of the
generator, and all the same caveats apply.

If `generator' is a @ref{1267,,generator} with no currently associated frame,
then an empty dictionary is returned.  @ref{199,,TypeError} is raised if
`generator' is not a Python generator object.

`CPython implementation detail:' This function relies on the generator exposing a Python stack frame
for introspection, which isn’t guaranteed to be the case in all
implementations of Python. In such cases, this function will always
return an empty dictionary.


Added in version 3.3.

@end deffn

@geindex getcoroutinelocals() (in module inspect)
@anchor{library/inspect inspect getcoroutinelocals}@anchor{101f}
@deffn {Function} inspect.getcoroutinelocals (coroutine)

This function is analogous to @ref{12e2,,getgeneratorlocals()}, but
works for coroutine objects created by @ref{7ee,,async def} functions.


Added in version 3.5.

@end deffn

@geindex getasyncgenlocals() (in module inspect)
@anchor{library/inspect inspect getasyncgenlocals}@anchor{6bc}
@deffn {Function} inspect.getasyncgenlocals (agen)

This function is analogous to @ref{12e2,,getgeneratorlocals()}, but
works for asynchronous generator objects created by @ref{7ee,,async def}
functions which use the @ref{bc8,,yield} statement.


Added in version 3.12.

@end deffn

@node Code Objects Bit Flags,Buffer flags,Current State of Generators Coroutines and Asynchronous Generators,inspect — Inspect live objects
@anchor{library/inspect code-objects-bit-flags}@anchor{4db0}@anchor{library/inspect inspect-module-co-flags}@anchor{23d9}
@subsubsection Code Objects Bit Flags


Python code objects have a @ref{1921,,co_flags} attribute,
which is a bitmap of the following flags:

@geindex CO_OPTIMIZED (in module inspect)
@anchor{library/inspect inspect CO_OPTIMIZED}@anchor{4db1}
@deffn {Data} inspect.CO_OPTIMIZED

The code object is optimized, using fast locals.
@end deffn

@geindex CO_NEWLOCALS (in module inspect)
@anchor{library/inspect inspect CO_NEWLOCALS}@anchor{4db2}
@deffn {Data} inspect.CO_NEWLOCALS

If set, a new dict will be created for the frame’s @ref{4a6,,f_locals}
when the code object is executed.
@end deffn

@geindex CO_VARARGS (in module inspect)
@anchor{library/inspect inspect CO_VARARGS}@anchor{4db3}
@deffn {Data} inspect.CO_VARARGS

The code object has a variable positional parameter (@code{*args}-like).
@end deffn

@geindex CO_VARKEYWORDS (in module inspect)
@anchor{library/inspect inspect CO_VARKEYWORDS}@anchor{4db4}
@deffn {Data} inspect.CO_VARKEYWORDS

The code object has a variable keyword parameter (@code{**kwargs}-like).
@end deffn

@geindex CO_NESTED (in module inspect)
@anchor{library/inspect inspect CO_NESTED}@anchor{4db5}
@deffn {Data} inspect.CO_NESTED

The flag is set when the code object is a nested function.
@end deffn

@geindex CO_GENERATOR (in module inspect)
@anchor{library/inspect inspect CO_GENERATOR}@anchor{4db6}
@deffn {Data} inspect.CO_GENERATOR

The flag is set when the code object is a generator function, i.e.
a generator object is returned when the code object is executed.
@end deffn

@geindex CO_COROUTINE (in module inspect)
@anchor{library/inspect inspect CO_COROUTINE}@anchor{4db7}
@deffn {Data} inspect.CO_COROUTINE

The flag is set when the code object is a coroutine function.
When the code object is executed it returns a coroutine object.
See 
@geindex Python Enhancement Proposals; PEP 492
PEP 492@footnote{https://peps.python.org/pep-0492/} for more details.


Added in version 3.5.

@end deffn

@geindex CO_ITERABLE_COROUTINE (in module inspect)
@anchor{library/inspect inspect CO_ITERABLE_COROUTINE}@anchor{4db8}
@deffn {Data} inspect.CO_ITERABLE_COROUTINE

The flag is used to transform generators into generator-based
coroutines.  Generator objects with this flag can be used in
@code{await} expression, and can @code{yield from} coroutine objects.
See 
@geindex Python Enhancement Proposals; PEP 492
PEP 492@footnote{https://peps.python.org/pep-0492/} for more details.


Added in version 3.5.

@end deffn

@geindex CO_ASYNC_GENERATOR (in module inspect)
@anchor{library/inspect inspect CO_ASYNC_GENERATOR}@anchor{4db9}
@deffn {Data} inspect.CO_ASYNC_GENERATOR

The flag is set when the code object is an asynchronous generator
function.  When the code object is executed it returns an
asynchronous generator object.  See 
@geindex Python Enhancement Proposals; PEP 525
PEP 525@footnote{https://peps.python.org/pep-0525/} for more details.


Added in version 3.6.

@end deffn

@geindex CO_HAS_DOCSTRING (in module inspect)
@anchor{library/inspect inspect CO_HAS_DOCSTRING}@anchor{23db}
@deffn {Data} inspect.CO_HAS_DOCSTRING

The flag is set when there is a docstring for the code object in
the source code. If set, it will be the first item in
@ref{18e2,,co_consts}.


Added in version 3.14.

@end deffn

@geindex CO_METHOD (in module inspect)
@anchor{library/inspect inspect CO_METHOD}@anchor{4dba}
@deffn {Data} inspect.CO_METHOD

The flag is set when the code object is a function defined in class
scope.


Added in version 3.14.

@end deffn

@cartouche
@quotation Note 
The flags are specific to CPython, and may not be defined in other
Python implementations.  Furthermore, the flags are an implementation
detail, and can be removed or deprecated in future Python releases.
It’s recommended to use public APIs from the @code{inspect} module
for any introspection needs.
@end quotation
@end cartouche

@node Buffer flags,Command-line interface<10>,Code Objects Bit Flags,inspect — Inspect live objects
@anchor{library/inspect buffer-flags}@anchor{4dbb}
@subsubsection Buffer flags


@geindex BufferFlags (class in inspect)
@anchor{library/inspect inspect BufferFlags}@anchor{68e}
@deffn {Class} inspect.BufferFlags

This is an @ref{ea0,,enum.IntFlag} that represents the flags that
can be passed to the @ref{68d,,__buffer__()} method of objects
implementing the @ref{262,,buffer protocol}.

The meaning of the flags is explained at @ref{4dbc,,Buffer request types}.

@geindex SIMPLE (inspect.BufferFlags attribute)
@anchor{library/inspect inspect BufferFlags SIMPLE}@anchor{4dbd}
@deffn {Attribute} SIMPLE
@end deffn

@geindex WRITABLE (inspect.BufferFlags attribute)
@anchor{library/inspect inspect BufferFlags WRITABLE}@anchor{4dbe}
@deffn {Attribute} WRITABLE
@end deffn

@geindex FORMAT (inspect.BufferFlags attribute)
@anchor{library/inspect inspect BufferFlags FORMAT}@anchor{4dbf}
@deffn {Attribute} FORMAT
@end deffn

@geindex ND (inspect.BufferFlags attribute)
@anchor{library/inspect inspect BufferFlags ND}@anchor{4dc0}
@deffn {Attribute} ND
@end deffn

@geindex STRIDES (inspect.BufferFlags attribute)
@anchor{library/inspect inspect BufferFlags STRIDES}@anchor{4dc1}
@deffn {Attribute} STRIDES
@end deffn

@geindex C_CONTIGUOUS (inspect.BufferFlags attribute)
@anchor{library/inspect inspect BufferFlags C_CONTIGUOUS}@anchor{4dc2}
@deffn {Attribute} C_CONTIGUOUS
@end deffn

@geindex F_CONTIGUOUS (inspect.BufferFlags attribute)
@anchor{library/inspect inspect BufferFlags F_CONTIGUOUS}@anchor{4dc3}
@deffn {Attribute} F_CONTIGUOUS
@end deffn

@geindex ANY_CONTIGUOUS (inspect.BufferFlags attribute)
@anchor{library/inspect inspect BufferFlags ANY_CONTIGUOUS}@anchor{4dc4}
@deffn {Attribute} ANY_CONTIGUOUS
@end deffn

@geindex INDIRECT (inspect.BufferFlags attribute)
@anchor{library/inspect inspect BufferFlags INDIRECT}@anchor{4dc5}
@deffn {Attribute} INDIRECT
@end deffn

@geindex CONTIG (inspect.BufferFlags attribute)
@anchor{library/inspect inspect BufferFlags CONTIG}@anchor{4dc6}
@deffn {Attribute} CONTIG
@end deffn

@geindex CONTIG_RO (inspect.BufferFlags attribute)
@anchor{library/inspect inspect BufferFlags CONTIG_RO}@anchor{4dc7}
@deffn {Attribute} CONTIG_RO
@end deffn

@geindex STRIDED (inspect.BufferFlags attribute)
@anchor{library/inspect inspect BufferFlags STRIDED}@anchor{4dc8}
@deffn {Attribute} STRIDED
@end deffn

@geindex STRIDED_RO (inspect.BufferFlags attribute)
@anchor{library/inspect inspect BufferFlags STRIDED_RO}@anchor{4dc9}
@deffn {Attribute} STRIDED_RO
@end deffn

@geindex RECORDS (inspect.BufferFlags attribute)
@anchor{library/inspect inspect BufferFlags RECORDS}@anchor{4dca}
@deffn {Attribute} RECORDS
@end deffn

@geindex RECORDS_RO (inspect.BufferFlags attribute)
@anchor{library/inspect inspect BufferFlags RECORDS_RO}@anchor{4dcb}
@deffn {Attribute} RECORDS_RO
@end deffn

@geindex FULL (inspect.BufferFlags attribute)
@anchor{library/inspect inspect BufferFlags FULL}@anchor{4dcc}
@deffn {Attribute} FULL
@end deffn

@geindex FULL_RO (inspect.BufferFlags attribute)
@anchor{library/inspect inspect BufferFlags FULL_RO}@anchor{4dcd}
@deffn {Attribute} FULL_RO
@end deffn

@geindex READ (inspect.BufferFlags attribute)
@anchor{library/inspect inspect BufferFlags READ}@anchor{193a}
@deffn {Attribute} READ
@end deffn

@geindex WRITE (inspect.BufferFlags attribute)
@anchor{library/inspect inspect BufferFlags WRITE}@anchor{193b}
@deffn {Attribute} WRITE
@end deffn


Added in version 3.12.

@end deffn

@node Command-line interface<10>,,Buffer flags,inspect — Inspect live objects
@anchor{library/inspect command-line-interface}@anchor{4dce}@anchor{library/inspect inspect-module-cli}@anchor{1161}
@subsubsection Command-line interface


The @code{inspect} module also provides a basic introspection capability
from the command line.

By default, accepts the name of a module and prints the source of that
module. A class or function within the module can be printed instead by
appended a colon and the qualified name of the target object.

@geindex inspect command line option; --details
@anchor{library/inspect cmdoption-inspect-details}@anchor{4dcf}
@deffn {Option} @w{-}@w{-}details

Print information about the specified object rather than the source code
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node annotationlib — Functionality for introspecting annotations,site — Site-specific configuration hook,inspect — Inspect live objects,Python Runtime Services
@anchor{library/annotationlib doc}@anchor{4dd0}@anchor{library/annotationlib annotationlib-functionality-for-introspecting-annotations}@anchor{4dd1}@anchor{library/annotationlib module-annotationlib}@anchor{6}@anchor{library/annotationlib translation-repo}@anchor{4dd2}
@subsection @code{annotationlib} — Functionality for introspecting annotations


@geindex module; annotationlib


Added in version 3.14.


`Source code:' Lib/annotationlib.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/annotationlib.py}

@c import annotationlib
@c from annotationlib import *


__________________________________________________________________


The @code{annotationlib} module provides tools for introspecting
@ref{15d,,annotations} on modules, classes, and functions.

Annotations are @ref{686,,lazily evaluated} and often contain
forward references to objects that are not yet defined when the annotation
is created. This module provides a set of low-level tools that can be used to retrieve annotations in a reliable way, even
in the presence of forward references and other edge cases.

This module supports retrieving annotations in three main formats
(see @ref{232,,Format}), each of which works best for different use cases:


@itemize *

@item 
@ref{15f,,VALUE} evaluates the annotations and returns their value.
This is most straightforward to work with, but it may raise errors,
for example if the annotations contain references to undefined names.

@item 
@ref{160,,FORWARDREF} returns @ref{17c9,,ForwardRef} objects
for annotations that cannot be resolved, allowing you to inspect the
annotations without evaluating them. This is useful when you need to
work with annotations that may contain unresolved forward references.

@item 
@ref{161,,STRING} returns the annotations as a string, similar
to how it would appear in the source file. This is useful for documentation
generators that want to display annotations in a readable way.
@end itemize

The @ref{457,,get_annotations()} function is the main entry point for
retrieving annotations. Given a function, class, or module, it returns
an annotations dictionary in the requested format. This module also provides
functionality for working directly with the @ref{15e,,annotate function}
that is used to evaluate annotations, such as @ref{459,,get_annotate_from_class_namespace()}
and @ref{180d,,call_annotate_function()}, as well as the
@ref{4850,,call_evaluate_function()} function for working with
@ref{484f,,evaluate functions}.

@cartouche
@quotation Caution 
Most functionality in this module can execute arbitrary code; see
@ref{4878,,the security section} for more information.
@end quotation
@end cartouche


@subsubheading See also


@geindex Python Enhancement Proposals; PEP 649
PEP 649@footnote{https://peps.python.org/pep-0649/} proposed the current model for how annotations work in Python.

@geindex Python Enhancement Proposals; PEP 749
PEP 749@footnote{https://peps.python.org/pep-0749/} expanded on various aspects of 
@geindex Python Enhancement Proposals; PEP 649
PEP 649@footnote{https://peps.python.org/pep-0649/} and introduced the
@code{annotationlib} module.

@ref{9df,,Annotations Best Practices} provides best practices for working with
annotations.

typing-extensions@footnote{https://pypi.org/project/typing-extensions/} provides a backport of @ref{457,,get_annotations()}
that works on earlier versions of Python.


@menu
* Annotation semantics:: 
* Classes: Classes<5>. 
* Functions: Functions<12>. 
* Recipes: Recipes<3>. 
* Limitations of the STRING format:: 
* Limitations of the FORWARDREF format:: 
* Security implications of introspecting annotations:: 

@end menu

@node Annotation semantics,Classes<5>,,annotationlib — Functionality for introspecting annotations
@anchor{library/annotationlib annotation-semantics}@anchor{4dd3}
@subsubsection Annotation semantics


The way annotations are evaluated has changed over the history of Python 3,
and currently still depends on a @ref{45b,,future import}.
There have been execution models for annotations:


@itemize *

@item 
`Stock semantics' (default in Python 3.0 through 3.13; see 
@geindex Python Enhancement Proposals; PEP 3107
PEP 3107@footnote{https://peps.python.org/pep-3107/}
and 
@geindex Python Enhancement Proposals; PEP 526
PEP 526@footnote{https://peps.python.org/pep-0526/}): Annotations are evaluated eagerly, as they are
encountered in the source code.

@item 
`Stringified annotations' (used with @code{from __future__ import annotations}
in Python 3.7 and newer; see 
@geindex Python Enhancement Proposals; PEP 563
PEP 563@footnote{https://peps.python.org/pep-0563/}): Annotations are stored as
strings only.

@item 
`Deferred evaluation' (default in Python 3.14 and newer; see 
@geindex Python Enhancement Proposals; PEP 649
PEP 649@footnote{https://peps.python.org/pep-0649/} and
@geindex Python Enhancement Proposals; PEP 749
PEP 749@footnote{https://peps.python.org/pep-0749/}): Annotations are evaluated lazily, only when they are accessed.
@end itemize

As an example, consider the following program:

@example
def func(a: Cls) -> None:
    print(a)

class Cls: pass

print(func.__annotations__)
@end example

This will behave as follows:


@itemize *

@item 
Under stock semantics (Python 3.13 and earlier), it will throw a
@ref{450,,NameError} at the line where @code{func} is defined,
because @code{Cls} is an undefined name at that point.

@item 
Under stringified annotations (if @code{from __future__ import annotations}
is used), it will print @code{@{'a': 'Cls', 'return': 'None'@}}.

@item 
Under deferred evaluation (Python 3.14 and later), it will print
@code{@{'a': <class 'Cls'>, 'return': None@}}.
@end itemize

Stock semantics were used when function annotations were first introduced
in Python 3.0 (by 
@geindex Python Enhancement Proposals; PEP 3107
PEP 3107@footnote{https://peps.python.org/pep-3107/}) because this was the simplest, most obvious
way to implement annotations. The same execution model was used when variable
annotations were introduced in Python 3.6 (by 
@geindex Python Enhancement Proposals; PEP 526
PEP 526@footnote{https://peps.python.org/pep-0526/}). However,
stock semantics caused problems when using annotations as type hints,
such as a need to refer to names that are not yet defined when the
annotation is encountered. In addition, there were performance problems
with executing annotations at module import time. Therefore, in Python 3.7,
@geindex Python Enhancement Proposals; PEP 563
PEP 563@footnote{https://peps.python.org/pep-0563/} introduced the ability to store annotations as strings using the
@code{from __future__ import annotations} syntax. The plan at the time was to
eventually make this behavior the default, but a problem appeared:
stringified annotations are more difficult to process for those who
introspect annotations at runtime. An alternative proposal, 
@geindex Python Enhancement Proposals; PEP 649
PEP 649@footnote{https://peps.python.org/pep-0649/},
introduced the third execution model, deferred evaluation, and was implemented
in Python 3.14. Stringified annotations are still used if
@code{from __future__ import annotations} is present, but this behavior will
eventually be removed.

@node Classes<5>,Functions<12>,Annotation semantics,annotationlib — Functionality for introspecting annotations
@anchor{library/annotationlib classes}@anchor{4dd4}
@subsubsection Classes


@geindex Format (class in annotationlib)
@anchor{library/annotationlib annotationlib Format}@anchor{232}
@deffn {Class} annotationlib.Format

An @ref{ee1,,IntEnum} describing the formats in which annotations
can be returned. Members of the enum, or their equivalent integer values,
can be passed to @ref{457,,get_annotations()} and other functions in this
module, as well as to @ref{19c7,,__annotate__} functions.

@geindex VALUE (annotationlib.Format attribute)
@anchor{library/annotationlib annotationlib Format VALUE}@anchor{15f}
@deffn {Attribute} VALUE = 1

Values are the result of evaluating the annotation expressions.
@end deffn

@geindex VALUE_WITH_FAKE_GLOBALS (annotationlib.Format attribute)
@anchor{library/annotationlib annotationlib Format VALUE_WITH_FAKE_GLOBALS}@anchor{4dd5}
@deffn {Attribute} VALUE_WITH_FAKE_GLOBALS = 2

Special value used to signal that an annotate function is being
evaluated in a special environment with fake globals. When passed this
value, annotate functions should either return the same value as for
the @ref{15f,,Format.VALUE} format, or raise @ref{369,,NotImplementedError}
to signal that they do not support execution in this environment.
This format is only used internally and should not be passed to
the functions in this module.
@end deffn

@geindex FORWARDREF (annotationlib.Format attribute)
@anchor{library/annotationlib annotationlib Format FORWARDREF}@anchor{160}
@deffn {Attribute} FORWARDREF = 3

Values are real annotation values (as per @ref{15f,,Format.VALUE} format)
for defined values, and @ref{17c9,,ForwardRef} proxies for undefined
values. Real objects may contain references to @code{ForwardRef}
proxy objects.
@end deffn

@geindex STRING (annotationlib.Format attribute)
@anchor{library/annotationlib annotationlib Format STRING}@anchor{161}
@deffn {Attribute} STRING = 4

Values are the text string of the annotation as it appears in the
source code, up to modifications including, but not restricted to,
whitespace normalizations and constant values optimizations.

The exact values of these strings may change in future versions of Python.
@end deffn


Added in version 3.14.

@end deffn

@geindex ForwardRef (class in annotationlib)
@anchor{library/annotationlib annotationlib ForwardRef}@anchor{17c9}
@deffn {Class} annotationlib.ForwardRef

A proxy object for forward references in annotations.

Instances of this class are returned when the @ref{160,,FORWARDREF}
format is used and annotations contain a name that cannot be resolved.
This can happen when a forward reference is used in an annotation, such as
when a class is referenced before it is defined.

@geindex __forward_arg__ (annotationlib.ForwardRef attribute)
@anchor{library/annotationlib annotationlib ForwardRef __forward_arg__}@anchor{4dd6}
@deffn {Attribute} __forward_arg__

A string containing the code that was evaluated to produce the
@code{ForwardRef}. The string may not be exactly equivalent
to the original source.
@end deffn

@geindex evaluate() (annotationlib.ForwardRef method)
@anchor{library/annotationlib annotationlib ForwardRef evaluate}@anchor{1803}
@deffn {Method} evaluate (*, owner=None, globals=None, locals=None, type_params=None, format=Format.VALUE)

Evaluate the forward reference, returning its value.

If the `format' argument is @ref{15f,,VALUE} (the default),
this method may throw an exception, such as @ref{450,,NameError}, if the forward
reference refers to a name that cannot be resolved. The arguments to this
method can be used to provide bindings for names that would otherwise
be undefined. If the `format' argument is @ref{160,,FORWARDREF},
the method will never throw an exception, but may return a @code{ForwardRef}
instance. For example, if the forward reference object contains the code
@code{list[undefined]}, where @code{undefined} is a name that is not defined,
evaluating it with the @code{FORWARDREF} format will return
@code{list[ForwardRef('undefined')]}. If the `format' argument is
@ref{161,,STRING}, the method will return @ref{4dd6,,__forward_arg__}.

The `owner' parameter provides the preferred mechanism for passing scope
information to this method. The owner of a @code{ForwardRef} is the
object that contains the annotation from which the @code{ForwardRef}
derives, such as a module object, type object, or function object.

The `globals', `locals', and `type_params' parameters provide a more precise
mechanism for influencing the names that are available when the @code{ForwardRef}
is evaluated. `globals' and `locals' are passed to @ref{4a4,,eval()}, representing
the global and local namespaces in which the name is evaluated.
The `type_params' parameter is relevant for objects created using the native
syntax for @ref{682,,generic classes} and @ref{683,,functions}.
It is a tuple of @ref{5ad,,type parameters} that are in scope
while the forward reference is being evaluated. For example, if evaluating a
@code{ForwardRef} retrieved from an annotation found in the class namespace
of a generic class @code{C}, `type_params' should be set to @code{C.__type_params__}.

@code{ForwardRef} instances returned by @ref{457,,get_annotations()}
retain references to information about the scope they originated from,
so calling this method with no further arguments may be sufficient to
evaluate such objects. @code{ForwardRef} instances created by other
means may not have any information about their scope, so passing
arguments to this method may be necessary to evaluate them successfully.

If no `owner', `globals', `locals', or `type_params' are provided and the
@code{ForwardRef} does not contain information about its origin,
empty globals and locals dictionaries are used.
@end deffn


Added in version 3.14.

@end deffn

@node Functions<12>,Recipes<3>,Classes<5>,annotationlib — Functionality for introspecting annotations
@anchor{library/annotationlib functions}@anchor{4dd7}
@subsubsection Functions


@geindex annotations_to_string() (in module annotationlib)
@anchor{library/annotationlib annotationlib annotations_to_string}@anchor{4dd8}
@deffn {Function} annotationlib.annotations_to_string (annotations)

Convert an annotations dict containing runtime values to a
dict containing only strings. If the values are not already strings,
they are converted using @ref{189f,,type_repr()}.
This is meant as a helper for user-provided
annotate functions that support the @ref{161,,STRING} format but
do not have access to the code creating the annotations.

For example, this is used to implement the @ref{161,,STRING} for
@ref{330,,typing.TypedDict} classes created through the functional syntax:

@example
>>> from typing import TypedDict
>>> Movie = TypedDict("movie", @{"name": str, "year": int@})
>>> get_annotations(Movie, format=Format.STRING)
@{'name': 'str', 'year': 'int'@}
@end example


Added in version 3.14.

@end deffn

@geindex call_annotate_function() (in module annotationlib)
@anchor{library/annotationlib annotationlib call_annotate_function}@anchor{180d}
@deffn {Function} annotationlib.call_annotate_function (annotate, format, *, owner=None)

Call the @ref{15e,,annotate function} `annotate' with the given `format',
a member of the @ref{232,,Format} enum, and return the annotations
dictionary produced by the function.

This helper function is required because annotate functions generated by
the compiler for functions, classes, and modules only support
the @ref{15f,,VALUE} format when called directly.
To support other formats, this function calls the annotate function
in a special environment that allows it to produce annotations in the
other formats. This is a useful building block when implementing
functionality that needs to partially evaluate annotations while a class
is being constructed.

`owner' is the object that owns the annotation function, usually
a function, class, or module. If provided, it is used in the
@ref{160,,FORWARDREF} format to produce a @ref{17c9,,ForwardRef}
object that carries more information.


@subsubheading See also


@geindex Python Enhancement Proposals; PEP 649#the-stringizer-and-the-fake-globals-environment
PEP 649@footnote{https://peps.python.org/pep-0649/#the-stringizer-and-the-fake-globals-environment}
contains an explanation of the implementation technique used by this
function.



Added in version 3.14.

@end deffn

@geindex call_evaluate_function() (in module annotationlib)
@anchor{library/annotationlib annotationlib call_evaluate_function}@anchor{4850}
@deffn {Function} annotationlib.call_evaluate_function (evaluate, format, *, owner=None)

Call the @ref{484f,,evaluate function} `evaluate' with the given `format',
a member of the @ref{232,,Format} enum, and return the value produced by
the function. This is similar to @ref{180d,,call_annotate_function()},
but the latter always returns a dictionary mapping strings to annotations,
while this function returns a single value.

This is intended for use with the evaluate functions generated for lazily
evaluated elements related to type aliases and type parameters:


@itemize *

@item 
@ref{4865,,typing.TypeAliasType.evaluate_value()}, the value of type aliases

@item 
@ref{484e,,typing.TypeVar.evaluate_bound()}, the bound of type variables

@item 
@ref{4852,,typing.TypeVar.evaluate_constraints()}, the constraints of
type variables

@item 
@ref{4854,,typing.TypeVar.evaluate_default()}, the default value of
type variables

@item 
@ref{485f,,typing.ParamSpec.evaluate_default()}, the default value of
parameter specifications

@item 
@ref{4858,,typing.TypeVarTuple.evaluate_default()}, the default value of
type variable tuples
@end itemize

`owner' is the object that owns the evaluate function, such as the type
alias or type variable object.

`format' can be used to control the format in which the value is returned:

@example
>>> type Alias = undefined
>>> call_evaluate_function(Alias.evaluate_value, Format.VALUE)
Traceback (most recent call last):
...
NameError: name 'undefined' is not defined
>>> call_evaluate_function(Alias.evaluate_value, Format.FORWARDREF)
ForwardRef('undefined')
>>> call_evaluate_function(Alias.evaluate_value, Format.STRING)
'undefined'
@end example


Added in version 3.14.

@end deffn

@geindex get_annotate_from_class_namespace() (in module annotationlib)
@anchor{library/annotationlib annotationlib get_annotate_from_class_namespace}@anchor{459}
@deffn {Function} annotationlib.get_annotate_from_class_namespace (namespace)

Retrieve the @ref{15e,,annotate function} from a class namespace dictionary `namespace'.
Return @code{None} if the namespace does not contain an annotate function.
This is primarily useful before the class has been fully created (e.g., in a metaclass);
after the class exists, the annotate function can be retrieved with @code{cls.__annotate__}.
See @ref{4dd9,,below} for an example using this function in a metaclass.


Added in version 3.14.

@end deffn

@geindex get_annotations() (in module annotationlib)
@anchor{library/annotationlib annotationlib get_annotations}@anchor{457}
@deffn {Function} annotationlib.get_annotations (obj, *, globals=None, locals=None, eval_str=False, format=Format.VALUE)

Compute the annotations dict for an object.

`obj' may be a callable, class, module, or other object with
@ref{19c7,,__annotate__} or @ref{456,,__annotations__} attributes.
Passing any other object raises @ref{199,,TypeError}.

The `format' parameter controls the format in which annotations are returned,
and must be a member of the @ref{232,,Format} enum or its integer equivalent.
The different formats work as follows:


@itemize *

@item 
VALUE: @code{object.__annotations__} is tried first; if that does not exist,
the @code{object.__annotate__} function is called if it exists.

@item 
FORWARDREF: If @code{object.__annotations__} exists and can be evaluated successfully,
it is used; otherwise, the @code{object.__annotate__} function is called. If it
does not exist either, @code{object.__annotations__} is tried again and any error
from accessing it is re-raised.


@itemize *

@item 
When calling @code{object.__annotate__} it is first called with @ref{160,,FORWARDREF}.
If this is not implemented, it will then check if @ref{4dd5,,VALUE_WITH_FAKE_GLOBALS}
is supported and use that in the fake globals environment.
If neither of these formats are supported, it will fall back to using @ref{15f,,VALUE}.
If @code{VALUE} fails, the error from this call will be raised.
@end itemize

@item 
STRING: If @code{object.__annotate__} exists, it is called first;
otherwise, @code{object.__annotations__} is used and stringified
using @ref{4dd8,,annotations_to_string()}.


@itemize *

@item 
When calling @code{object.__annotate__} it is first called with @ref{161,,STRING}.
If this is not implemented, it will then check if @ref{4dd5,,VALUE_WITH_FAKE_GLOBALS}
is supported and use that in the fake globals environment.
If neither of these formats are supported, it will fall back to using @ref{15f,,VALUE}
with the result converted using @ref{4dd8,,annotations_to_string()}.
If @code{VALUE} fails, the error from this call will be raised.
@end itemize
@end itemize

Returns a dict. @code{get_annotations()} returns a new dict every time
it’s called; calling it twice on the same object will return two
different but equivalent dicts.

This function handles several details for you:


@itemize *

@item 
If `eval_str' is true, values of type @code{str} will
be un-stringized using @ref{4a4,,eval()}. This is intended
for use with stringized annotations
(@code{from __future__ import annotations}). It is an error
to set `eval_str' to true with formats other than @ref{15f,,Format.VALUE}.

@item 
If `obj' doesn’t have an annotations dict, returns an
empty dict. (Functions and methods always have an
annotations dict; classes, modules, and other types of
callables may not.)

@item 
Ignores inherited annotations on classes, as well as annotations
on metaclasses. If a class
doesn’t have its own annotations dict, returns an empty dict.

@item 
All accesses to object members and dict values are done
using @code{getattr()} and @code{dict.get()} for safety.
@end itemize

`eval_str' controls whether or not values of type @code{str} are
replaced with the result of calling @ref{4a4,,eval()} on those values:


@itemize *

@item 
If eval_str is true, @ref{4a4,,eval()} is called on values of type
@code{str}. (Note that @code{get_annotations()} doesn’t catch
exceptions; if @code{eval()} raises an exception, it will unwind
the stack past the @code{get_annotations()} call.)

@item 
If `eval_str' is false (the default), values of type @code{str} are
unchanged.
@end itemize

`globals' and `locals' are passed in to @ref{4a4,,eval()}; see the documentation
for @code{eval()} for more information. If `globals' or `locals'
is @code{None}, this function may replace that value with a
context-specific default, contingent on @code{type(obj)}:


@itemize *

@item 
If `obj' is a module, `globals' defaults to @code{obj.__dict__}.

@item 
If `obj' is a class, `globals' defaults to
@code{sys.modules[obj.__module__].__dict__} and `locals' defaults
to the `obj' class namespace.

@item 
If `obj' is a callable, `globals' defaults to
@ref{14df,,obj.__globals__},
although if `obj' is a wrapped function (using
@ref{1228,,functools.update_wrapper()}) or a @ref{219,,functools.partial} object,
it is unwrapped until a non-wrapped function is found.
@end itemize

Calling @code{get_annotations()} is best practice for accessing the
annotations dict of any object. See @ref{9df,,Annotations Best Practices} for
more information on annotations best practices.

@example
>>> def f(a: int, b: str) -> float:
...     pass
>>> get_annotations(f)
@{'a': <class 'int'>, 'b': <class 'str'>, 'return': <class 'float'>@}
@end example


Added in version 3.14.

@end deffn

@geindex type_repr() (in module annotationlib)
@anchor{library/annotationlib annotationlib type_repr}@anchor{189f}
@deffn {Function} annotationlib.type_repr (value)

Convert an arbitrary Python value to a format suitable for use by the
@ref{161,,STRING} format. This calls @ref{1c3,,repr()} for most
objects, but has special handling for some objects, such as type objects.

This is meant as a helper for user-provided
annotate functions that support the @ref{161,,STRING} format but
do not have access to the code creating the annotations. It can also
be used to provide a user-friendly string representation for other
objects that contain values that are commonly encountered in annotations.


Added in version 3.14.

@end deffn

@node Recipes<3>,Limitations of the STRING format,Functions<12>,annotationlib — Functionality for introspecting annotations
@anchor{library/annotationlib recipes}@anchor{4dda}
@subsubsection Recipes


@menu
* Using annotations in a metaclass:: 
* Creating a custom callable annotate function:: 

@end menu

@node Using annotations in a metaclass,Creating a custom callable annotate function,,Recipes<3>
@anchor{library/annotationlib annotationlib-metaclass}@anchor{4dd9}@anchor{library/annotationlib using-annotations-in-a-metaclass}@anchor{4ddb}
@subsubsection Using annotations in a metaclass


A @ref{2405,,metaclass} may want to inspect or even modify the annotations
in a class body during class creation. Doing so requires retrieving annotations
from the class namespace dictionary. For classes created with
@code{from __future__ import annotations}, the annotations will be in the @code{__annotations__}
key of the dictionary. For other classes with annotations,
@ref{459,,get_annotate_from_class_namespace()} can be used to get the
annotate function, and @ref{180d,,call_annotate_function()} can be used to call it and
retrieve the annotations. Using the @ref{160,,FORWARDREF} format will usually
be best, because this allows the annotations to refer to names that cannot yet be
resolved when the class is created.

To modify the annotations, it is best to create a wrapper annotate function
that calls the original annotate function, makes any necessary adjustments, and
returns the result.

Below is an example of a metaclass that filters out all @ref{56d,,typing.ClassVar}
annotations from the class and puts them in a separate attribute:

@example
import annotationlib
import typing

class ClassVarSeparator(type):
   def __new__(mcls, name, bases, ns):
      if "__annotations__" in ns:  # from __future__ import annotations
         annotations = ns["__annotations__"]
         classvar_keys = @{
            key for key, value in annotations.items()
            # Use string comparison for simplicity; a more robust solution
            # could use annotationlib.ForwardRef.evaluate
            if value.startswith("ClassVar")
         @}
         classvars = @{key: annotations[key] for key in classvar_keys@}
         ns["__annotations__"] = @{
            key: value for key, value in annotations.items()
            if key not in classvar_keys
         @}
         wrapped_annotate = None
      elif annotate := annotationlib.get_annotate_from_class_namespace(ns):
         annotations = annotationlib.call_annotate_function(
            annotate, format=annotationlib.Format.FORWARDREF
         )
         classvar_keys = @{
            key for key, value in annotations.items()
            if typing.get_origin(value) is typing.ClassVar
         @}
         classvars = @{key: annotations[key] for key in classvar_keys@}

         def wrapped_annotate(format):
            annos = annotationlib.call_annotate_function(annotate, format, owner=typ)
            return @{key: value for key, value in annos.items() if key not in classvar_keys@}

      else:  # no annotations
         classvars = @{@}
         wrapped_annotate = None
      typ = super().__new__(mcls, name, bases, ns)

      if wrapped_annotate is not None:
         # Wrap the original __annotate__ with a wrapper that removes ClassVars
         typ.__annotate__ = wrapped_annotate
      typ.classvars = classvars  # Store the ClassVars in a separate attribute
      return typ
@end example

@node Creating a custom callable annotate function,,Using annotations in a metaclass,Recipes<3>
@anchor{library/annotationlib creating-a-custom-callable-annotate-function}@anchor{4ddc}
@subsubsection Creating a custom callable annotate function


Custom @ref{15e,,annotate functions} may be literal functions like those
automatically generated for functions, classes, and modules. Or, they may wish to utilise
the encapsulation provided by classes, in which case any @ref{2dec,,callable} can be used as
an annotate function.

To provide the @ref{15f,,VALUE}, @ref{161,,STRING}, or
@ref{160,,FORWARDREF} formats directly, an @ref{15e,,annotate function} must provide
the following attribute:


@itemize *

@item 
A callable @code{__call__} with signature @code{__call__(format, /) -> dict}, that does not
raise a @ref{369,,NotImplementedError} when called with a supported format.
@end itemize

To provide the @ref{4dd5,,VALUE_WITH_FAKE_GLOBALS} format, which is used to
automatically generate @ref{161,,STRING} or @ref{160,,FORWARDREF} if they are
not supported directly, @ref{15e,,annotate functions} must provide the
following attributes:


@itemize *

@item 
A callable @code{__call__} with signature @code{__call__(format, /) -> dict}, that does not
raise a @ref{369,,NotImplementedError} when called with
@ref{4dd5,,VALUE_WITH_FAKE_GLOBALS}.

@item 
A @ref{4e7,,code object} @code{__code__} containing the compiled code for the
annotate function.

@item 
Optional: A tuple of the function’s positional defaults @code{__kwdefaults__}, if the
function represented by @code{__code__} uses any positional defaults.

@item 
Optional: A dict of the function’s keyword defaults @code{__defaults__}, if the function
represented by @code{__code__} uses any keyword defaults.

@item 
Optional: All other @ref{1dd5,,function attributes}.
@end itemize

@example
class Annotate:
    called_formats = []

    def __call__(self, format=None, /, *, _self=None):
        # When called with fake globals, `_self` will be the
        # actual self value, and `self` will be the format.
        if _self is not None:
            self, format = _self, self

        self.called_formats.append(format)
        if format <= 2:  # VALUE or VALUE_WITH_FAKE_GLOBALS
            return @{"x": MyType@}
        raise NotImplementedError

    __code__ = __call__.__code__
    __defaults__ = (None,)
    __kwdefaults__ = property(lambda self: dict(_self=self))

    __globals__ = @{@}
    __builtins__ = @{@}
    __closure__ = None
@end example

This can then be called with:

@example
>>> from annotationlib import call_annotate_function, Format
>>> call_annotate_function(Annotate(), format=Format.STRING)
@{'x': 'MyType'@}
@end example

Or used as the annotate function for an object:

@example
>>> from annotationlib import get_annotations, Format
>>> class C:
...   pass
>>> C.__annotate__ = Annotate()
>>> get_annotations(Annotate(), format=Format.STRING)
@{'x': 'MyType'@}
@end example

@node Limitations of the STRING format,Limitations of the FORWARDREF format,Recipes<3>,annotationlib — Functionality for introspecting annotations
@anchor{library/annotationlib limitations-of-the-string-format}@anchor{4ddd}
@subsubsection Limitations of the @code{STRING} format


The @ref{161,,STRING} format is meant to approximate the source code
of the annotation, but the implementation strategy used means that it is not
always possible to recover the exact source code.

First, the stringifier of course cannot recover any information that is not present in
the compiled code, including comments, whitespace, parenthesization, and operations that
get simplified by the compiler.

Second, the stringifier can intercept almost all operations that involve names looked
up in some scope, but it cannot intercept operations that operate fully on constants.
As a corollary, this also means it is not safe to request the @code{STRING} format on
untrusted code: Python is powerful enough that it is possible to achieve arbitrary
code execution even with no access to any globals or builtins. For example:

@example
>>> def f(x: (1).__class__.__base__.__subclasses__()[-1].__init__.__builtins__["print"]("Hello world")): pass
...
>>> annotationlib.get_annotations(f, format=annotationlib.Format.STRING)
Hello world
@{'x': 'None'@}
@end example

@cartouche
@quotation Note 
This particular example works as of the time of writing, but it relies on
implementation details and is not guaranteed to work in the future.
@end quotation
@end cartouche

Among the different kinds of expressions that exist in Python,
as represented by the @ref{9,,ast} module, some expressions are supported,
meaning that the @code{STRING} format can generally recover the original source code;
others are unsupported, meaning that they may result in incorrect output or an error.

The following are supported (sometimes with caveats):


@itemize *

@item 
@ref{1df4,,ast.BinOp}

@item 
@ref{4dde,,ast.UnaryOp}


@itemize *

@item 
@ref{4ddf,,ast.Invert} (@code{~}), @ref{4de0,,ast.UAdd} (@code{+}), and @ref{4de1,,ast.USub} (@code{-}) are supported

@item 
@ref{4de2,,ast.Not} (@code{not}) is not supported
@end itemize

@item 
@ref{1d8d,,ast.Dict} (except when using @code{**} unpacking)

@item 
@ref{4de3,,ast.Set}

@item 
@ref{4de4,,ast.Compare}


@itemize *

@item 
@ref{4de5,,ast.Eq} and @ref{4de6,,ast.NotEq} are supported

@item 
@ref{4de7,,ast.Lt}, @ref{4de8,,ast.LtE}, @ref{4de9,,ast.Gt}, and @ref{4dea,,ast.GtE} are supported, but the operand may be flipped

@item 
@ref{4deb,,ast.Is}, @ref{4dec,,ast.IsNot}, @ref{4ded,,ast.In}, and @ref{4dee,,ast.NotIn} are not supported
@end itemize

@item 
@ref{4def,,ast.Call} (except when using @code{**} unpacking)

@item 
@ref{2f1,,ast.Constant} (though not the exact representation of the constant; for example, escape
sequences in strings are lost; hexadecimal numbers are converted to decimal)

@item 
@ref{4df0,,ast.Attribute} (assuming the value is not a constant)

@item 
@ref{4df1,,ast.Subscript} (assuming the value is not a constant)

@item 
@ref{4df2,,ast.Starred} (@code{*} unpacking)

@item 
@ref{1d66,,ast.Name}

@item 
@ref{4df3,,ast.List}

@item 
@ref{4df4,,ast.Tuple}

@item 
@ref{4df5,,ast.Slice}
@end itemize

The following are unsupported, but throw an informative error when encountered by the
stringifier:


@itemize *

@item 
@ref{4df6,,ast.FormattedValue} (f-strings; error is not detected if conversion specifiers like @code{!r}
are used)

@item 
@ref{1aa2,,ast.JoinedStr} (f-strings)
@end itemize

The following are unsupported and result in incorrect output:


@itemize *

@item 
@ref{4df7,,ast.BoolOp} (@code{and} and @code{or})

@item 
@ref{4df8,,ast.IfExp}

@item 
@ref{4df9,,ast.Lambda}

@item 
@ref{4dfa,,ast.ListComp}

@item 
@ref{4dfb,,ast.SetComp}

@item 
@ref{4dfc,,ast.DictComp}

@item 
@ref{4dfd,,ast.GeneratorExp}
@end itemize

The following are disallowed in annotation scopes and therefore not relevant:


@itemize *

@item 
@ref{4dfe,,ast.NamedExpr} (@code{:=})

@item 
@ref{4dff,,ast.Await}

@item 
@ref{4e00,,ast.Yield}

@item 
@ref{4e01,,ast.YieldFrom}
@end itemize

@node Limitations of the FORWARDREF format,Security implications of introspecting annotations,Limitations of the STRING format,annotationlib — Functionality for introspecting annotations
@anchor{library/annotationlib limitations-of-the-forwardref-format}@anchor{4e02}
@subsubsection Limitations of the @code{FORWARDREF} format


The @ref{160,,FORWARDREF} format aims to produce real values as much
as possible, with anything that cannot be resolved replaced with
@ref{17c9,,ForwardRef} objects. It is affected by broadly the same Limitations
as the @ref{161,,STRING} format: annotations that perform operations on
literals or that use unsupported expression types may raise exceptions when
evaluated using the @code{FORWARDREF} format.

Below are a few examples of the behavior with unsupported expressions:

@example
>>> from annotationlib import get_annotations, Format
>>> def zerodiv(x: 1 / 0): ...
>>> get_annotations(zerodiv, format=Format.STRING)
Traceback (most recent call last):
  ...
ZeroDivisionError: division by zero
>>> get_annotations(zerodiv, format=Format.FORWARDREF)
Traceback (most recent call last):
  ...
ZeroDivisionError: division by zero
>>> def ifexp(x: 1 if y else 0): ...
>>> get_annotations(ifexp, format=Format.STRING)
@{'x': '1'@}
@end example

@node Security implications of introspecting annotations,,Limitations of the FORWARDREF format,annotationlib — Functionality for introspecting annotations
@anchor{library/annotationlib annotationlib-security}@anchor{4878}@anchor{library/annotationlib security-implications-of-introspecting-annotations}@anchor{4e03}
@subsubsection Security implications of introspecting annotations


Much of the functionality in this module involves executing code related to annotations,
which can then do arbitrary things. For example,
@ref{457,,get_annotations()} may call an arbitrary @ref{15e,,annotate function}, and
@ref{1803,,ForwardRef.evaluate()} may call @ref{4a4,,eval()} on an arbitrary string. Code contained
in an annotation might make arbitrary system calls, enter an infinite loop, or perform any
other operation. This is also true for any access of the @ref{456,,__annotations__} attribute,
and for various functions in the @ref{10b,,typing} module that work with annotations, such as
@ref{8c2,,typing.get_type_hints()}.

Any security issue arising from this also applies immediately after importing
code that may contain untrusted annotations: importing code can always cause arbitrary operations
to be performed. However, it is unsafe to accept strings or other input from an untrusted source and
pass them to any of the APIs for introspecting annotations, for example by editing an
@code{__annotations__} dictionary or directly creating a @ref{17c9,,ForwardRef} object.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node site — Site-specific configuration hook,,annotationlib — Functionality for introspecting annotations,Python Runtime Services
@anchor{library/site doc}@anchor{4e04}@anchor{library/site module-site}@anchor{cc}@anchor{library/site site-site-specific-configuration-hook}@anchor{4e05}@anchor{library/site translation-repo}@anchor{4e06}
@subsection @code{site} — Site-specific configuration hook


@geindex module; site

`Source code:' Lib/site.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/site.py}


__________________________________________________________________


`This module is automatically imported during initialization.' The automatic
import can be suppressed using the interpreter’s @ref{13b4,,-S} option.

@geindex module; search; path

Importing this module normally appends site-specific paths to the module search path
and adds @ref{262d,,callables}, including @ref{ada,,help()} to the built-in
namespace. However, Python startup option @ref{13b4,,-S} blocks this and this module
can be safely imported with no automatic modifications to the module search path
or additions to the builtins.  To explicitly trigger the usual site-specific
additions, call the @ref{216a,,main()} function.


Changed in version 3.3: Importing the module used to trigger paths manipulation even when using
@ref{13b4,,-S}.


@geindex site-packages; directory

It starts by constructing up to four directories from a head and a tail part.
For the head part, it uses @code{sys.prefix} and @code{sys.exec_prefix}; empty heads
are skipped.  For the tail part, it uses the empty string and then
@code{lib/site-packages} (on Windows) or
@code{lib/python`X.Y[t]'/site-packages} (on Unix and macOS). (The
optional suffix “t” indicates the @ref{1791,,free-threaded build}, and is
appended if @code{"t"} is present in the @ref{c5f,,sys.abiflags} constant.)
For each
of the distinct head-tail combinations, it sees if it refers to an existing
directory, and if so, adds it to @code{sys.path} and also inspects the newly
added path for configuration files.


Changed in version 3.5: Support for the “site-python” directory has been removed.



Changed in version 3.13: On Unix, @ref{1f6,,Free threading} Python installations are
identified by the “t” suffix in the version-specific directory name, such as
@code{lib/python3.13t/}.



Changed in version 3.14: @code{site} is no longer responsible for updating @ref{3e5,,sys.prefix} and
@ref{3e9,,sys.exec_prefix} on @ref{4c13,,Virtual Environments}. This is
now done during the @ref{1922,,path initialization}. As a result,
under @ref{4c13,,Virtual Environments}, @code{sys.prefix} and
@code{sys.exec_prefix} no longer depend on the @code{site} initialization,
and are therefore unaffected by @ref{13b4,,-S}.

@anchor{library/site site-virtual-environments-configuration}@anchor{4c14}
When running under a @ref{4c13,,virtual environment},
the @code{pyvenv.cfg} file in @ref{3e5,,sys.prefix} is checked for site-specific
configurations. If the @code{include-system-site-packages} key exists and is set to
@code{true} (case-insensitive), the system-level prefixes will be searched for
site-packages, otherwise they won’t.

@geindex # (hash); comment
@geindex statement; import

A path configuration file is a file whose name has the form @code{`name'.pth}
and exists in one of the four directories mentioned above; its contents are
additional items (one per line) to be added to @code{sys.path}.  Non-existing items
are never added to @code{sys.path}, and no check is made that the item refers to a
directory rather than a file.  No item is added to @code{sys.path} more than
once.  Blank lines and lines beginning with @code{#} are skipped.  Lines starting
with @code{import} (followed by space or tab) are executed.

@cartouche
@quotation Note 
An executable line in a @code{.pth} file is run at every Python startup,
regardless of whether a particular module is actually going to be used.
Its impact should thus be kept to a minimum.
The primary intended purpose of executable lines is to make the
corresponding module(s) importable
(load 3rd-party import hooks, adjust 
@geindex PATH
@geindex environment variable; PATH
@code{PATH} etc).
Any other initialization is supposed to be done upon a module’s
actual import, if and when it happens.
Limiting a code chunk to a single line is a deliberate measure
to discourage putting anything more complex here.
@end quotation
@end cartouche


Changed in version 3.13: The @code{.pth} files are now decoded by UTF-8 at first and then by the
@ref{54b,,locale encoding} if it fails.


@geindex package
@geindex path; configuration; file

For example, suppose @code{sys.prefix} and @code{sys.exec_prefix} are set to
@code{/usr/local}.  The Python X.Y library is then installed in
@code{/usr/local/lib/python`X.Y'}.  Suppose this has
a subdirectory @code{/usr/local/lib/python`X.Y'/site-packages} with three
subsubdirectories, @code{foo}, @code{bar} and @code{spam}, and two path
configuration files, @code{foo.pth} and @code{bar.pth}.  Assume
@code{foo.pth} contains the following:

@example
# foo package configuration

foo
bar
bletch
@end example

and @code{bar.pth} contains:

@example
# bar package configuration

bar
@end example

Then the following version-specific directories are added to
@code{sys.path}, in this order:

@example
/usr/local/lib/pythonX.Y/site-packages/bar
/usr/local/lib/pythonX.Y/site-packages/foo
@end example

Note that @code{bletch} is omitted because it doesn’t exist; the @code{bar}
directory precedes the @code{foo} directory because @code{bar.pth} comes
alphabetically before @code{foo.pth}; and @code{spam} is omitted because it is
not mentioned in either path configuration file.

@menu
* sitecustomize:: 
* usercustomize:: 
* Readline configuration:: 
* Module contents: Module contents<6>. 
* Command-line interface: Command-line interface<11>. 

@end menu

@node sitecustomize,usercustomize,,site — Site-specific configuration hook
@anchor{library/site module-sitecustomize}@anchor{cd}@anchor{library/site sitecustomize}@anchor{4e07}
@subsubsection @code{sitecustomize}


@geindex module; sitecustomize

After these path manipulations, an attempt is made to import a module named
@code{sitecustomize}, which can perform arbitrary site-specific customizations.
It is typically created by a system administrator in the site-packages
directory.  If this import fails with an @ref{65b,,ImportError} or its subclass
exception, and the exception’s @ref{1795,,name}
attribute equals @code{'sitecustomize'},
it is silently ignored.  If Python is started without output streams available, as
with @code{pythonw.exe} on Windows (which is used by default to start IDLE),
attempted output from @code{sitecustomize} is ignored.  Any other exception
causes a silent and perhaps mysterious failure of the process.

@node usercustomize,Readline configuration,sitecustomize,site — Site-specific configuration hook
@anchor{library/site module-usercustomize}@anchor{115}@anchor{library/site usercustomize}@anchor{4e08}
@subsubsection @code{usercustomize}


@geindex module; usercustomize

After this, an attempt is made to import a module named @code{usercustomize},
which can perform arbitrary user-specific customizations, if
@ref{4e09,,ENABLE_USER_SITE} is true.  This file is intended to be created in the
user site-packages directory (see below), which is part of @code{sys.path} unless
disabled by @ref{159a,,-s}.  If this import fails with an @ref{65b,,ImportError} or
its subclass exception, and the exception’s @ref{1795,,name}
attribute equals @code{'usercustomize'}, it is silently ignored.

Note that for some non-Unix systems, @code{sys.prefix} and @code{sys.exec_prefix} are
empty, and the path manipulations are skipped; however the import of
@ref{cd,,sitecustomize} and @code{usercustomize} is still attempted.

@node Readline configuration,Module contents<6>,usercustomize,site — Site-specific configuration hook
@anchor{library/site readline-configuration}@anchor{4e0a}@anchor{library/site rlcompleter-config}@anchor{11cf}
@subsubsection Readline configuration


On systems that support @ref{bf,,readline}, this module will also import and
configure the @ref{c2,,rlcompleter} module, if Python is started in
@ref{441,,interactive mode} and without the @ref{13b4,,-S} option.
The default behavior is to enable tab completion and to use
@code{~/.python_history} as the history save file.  To disable it, delete (or
override) the @ref{11ce,,sys.__interactivehook__} attribute in your
@ref{cd,,sitecustomize} or @ref{115,,usercustomize} module or your
@geindex PYTHONSTARTUP
@geindex environment variable; PYTHONSTARTUP
@ref{1ba,,PYTHONSTARTUP} file.


Changed in version 3.4: Activation of rlcompleter and history was made automatic.


@node Module contents<6>,Command-line interface<11>,Readline configuration,site — Site-specific configuration hook
@anchor{library/site module-contents}@anchor{4e0b}
@subsubsection Module contents


@geindex PREFIXES (in module site)
@anchor{library/site site PREFIXES}@anchor{4e0c}
@deffn {Data} site.PREFIXES

A list of prefixes for site-packages directories.
@end deffn

@geindex ENABLE_USER_SITE (in module site)
@anchor{library/site site ENABLE_USER_SITE}@anchor{4e09}
@deffn {Data} site.ENABLE_USER_SITE

Flag showing the status of the user site-packages directory.  @code{True} means
that it is enabled and was added to @code{sys.path}.  @code{False} means that it
was disabled by user request (with @ref{159a,,-s} or
@geindex PYTHONNOUSERSITE
@geindex environment variable; PYTHONNOUSERSITE
@ref{159b,,PYTHONNOUSERSITE}).  @code{None} means it was disabled for security
reasons (mismatch between user or group id and effective id) or by an
administrator.
@end deffn

@geindex USER_SITE (in module site)
@anchor{library/site site USER_SITE}@anchor{2169}
@deffn {Data} site.USER_SITE

Path to the user site-packages for the running Python.  Can be @code{None} if
@ref{144c,,getusersitepackages()} hasn’t been called yet.  Default value is
@code{~/.local/lib/python`X.Y'[t]/site-packages} for UNIX and non-framework
macOS builds, @code{~/Library/Python/`X.Y'/lib/python/site-packages} for macOS
framework builds, and @code{`%APPDATA%'\Python\Python`XY'\site-packages}
on Windows.  The optional “t” indicates the free-threaded build.  This
directory is a site directory, which means that @code{.pth} files in it
will be processed.
@end deffn

@geindex USER_BASE (in module site)
@anchor{library/site site USER_BASE}@anchor{1528}
@deffn {Data} site.USER_BASE

Path to the base directory for the user site-packages.  Can be @code{None} if
@ref{144b,,getuserbase()} hasn’t been called yet.  Default value is
@code{~/.local} for UNIX and macOS non-framework builds,
@code{~/Library/Python/`X.Y'} for macOS framework builds, and
@code{`%APPDATA%'\Python} for Windows.  This value is used to
compute the installation directories for scripts, data files, Python modules,
etc. for the @ref{217a,,user installation scheme}.
See also 
@geindex PYTHONUSERBASE
@geindex environment variable; PYTHONUSERBASE
@ref{1599,,PYTHONUSERBASE}.
@end deffn

@geindex main() (in module site)
@anchor{library/site site main}@anchor{216a}
@deffn {Function} site.main ()

Adds all the standard site-specific directories to the module search
path.  This function is called automatically when this module is imported,
unless the Python interpreter was started with the @ref{13b4,,-S} flag.


Changed in version 3.3: This function used to be called unconditionally.

@end deffn

@geindex addsitedir() (in module site)
@anchor{library/site site addsitedir}@anchor{22b6}
@deffn {Function} site.addsitedir (sitedir, known_paths=None)

Add a directory to sys.path and process its @code{.pth} files.  Typically
used in @ref{cd,,sitecustomize} or @ref{115,,usercustomize} (see above).
@end deffn

@geindex getsitepackages() (in module site)
@anchor{library/site site getsitepackages}@anchor{144a}
@deffn {Function} site.getsitepackages ()

Return a list containing all global site-packages directories.


Added in version 3.2.

@end deffn

@geindex getuserbase() (in module site)
@anchor{library/site site getuserbase}@anchor{144b}
@deffn {Function} site.getuserbase ()

Return the path of the user base directory, @ref{1528,,USER_BASE}.  If it is not
initialized yet, this function will also set it, respecting
@geindex PYTHONUSERBASE
@geindex environment variable; PYTHONUSERBASE
@ref{1599,,PYTHONUSERBASE}.


Added in version 3.2.

@end deffn

@geindex getusersitepackages() (in module site)
@anchor{library/site site getusersitepackages}@anchor{144c}
@deffn {Function} site.getusersitepackages ()

Return the path of the user-specific site-packages directory,
@ref{2169,,USER_SITE}.  If it is not initialized yet, this function will also set
it, respecting @ref{1528,,USER_BASE}.  To determine if the user-specific
site-packages was added to @code{sys.path} @ref{4e09,,ENABLE_USER_SITE} should be
used.


Added in version 3.2.

@end deffn

@node Command-line interface<11>,,Module contents<6>,site — Site-specific configuration hook
@anchor{library/site command-line-interface}@anchor{4e0d}@anchor{library/site site-commandline}@anchor{4e0e}
@subsubsection Command-line interface


The @code{site} module also provides a way to get the user directories from the
command line:

@example
$ python -m site --user-site
/home/user/.local/lib/python3.11/site-packages
@end example

If it is called without arguments, it will print the contents of
@ref{3e2,,sys.path} on the standard output, followed by the value of
@ref{1528,,USER_BASE} and whether the directory exists, then the same thing for
@ref{2169,,USER_SITE}, and finally the value of @ref{4e09,,ENABLE_USER_SITE}.

@geindex site command line option; --user-base
@anchor{library/site cmdoption-site-user-base}@anchor{4e0f}
@deffn {Option} @w{-}@w{-}user@w{-}base

Print the path to the user base directory.
@end deffn

@geindex site command line option; --user-site
@anchor{library/site cmdoption-site-user-site}@anchor{4e10}
@deffn {Option} @w{-}@w{-}user@w{-}site

Print the path to the user site-packages directory.
@end deffn

If both options are given, user base and user site will be printed (always in
this order), separated by @ref{2177,,os.pathsep}.

If any option is given, the script will exit with one of these values: @code{0} if
the user site-packages directory is enabled, @code{1} if it was disabled by the
user, @code{2} if it is disabled for security reasons or by an administrator, and a
value greater than 2 if there is an error.


@subsubheading See also



@itemize *

@item 
@geindex Python Enhancement Proposals; PEP 370
PEP 370@footnote{https://peps.python.org/pep-0370/} – Per user site-packages directory

@item 
@ref{1922,,The initialization of the sys.path module search path} – The initialization of @ref{3e2,,sys.path}.
@end itemize


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)


@subsubheading See also



@itemize *

@item 
See the @ref{25,,concurrent.interpreters} module, which similarly
exposes core runtime functionality.
@end itemize


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Custom Python Interpreters,Importing Modules,Python Runtime Services,The Python Standard Library
@anchor{library/custominterp doc}@anchor{4e11}@anchor{library/custominterp custom-python-interpreters}@anchor{4e12}@anchor{library/custominterp custominterp}@anchor{4e13}@anchor{library/custominterp translation-repo}@anchor{4e14}
@section Custom Python Interpreters


The modules described in this chapter allow writing interfaces similar to
Python’s interactive interpreter.  If you want a Python interpreter that
supports some special feature in addition to the Python language, you should
look at the @ref{1b,,code} module.  (The @ref{1d,,codeop} module is lower-level, used
to support compiling a possibly incomplete chunk of Python code.)

The full list of modules described in this chapter is:

@menu
* code — Interpreter base classes:: 
* codeop — Compile Python code:: 

@end menu

@node code — Interpreter base classes,codeop — Compile Python code,,Custom Python Interpreters
@anchor{library/code doc}@anchor{4e15}@anchor{library/code code-interpreter-base-classes}@anchor{4e16}@anchor{library/code module-code}@anchor{1b}
@subsection @code{code} — Interpreter base classes


@geindex module; code

`Source code:' Lib/code.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/code.py}


__________________________________________________________________


The @code{code} module provides facilities to implement read-eval-print loops in
Python.  Two classes and convenience functions are included which can be used to
build applications which provide an interactive interpreter prompt.

@geindex InteractiveInterpreter (class in code)
@anchor{library/code code InteractiveInterpreter}@anchor{1987}
@deffn {Class} code.InteractiveInterpreter (locals=None)

This class deals with parsing and interpreter state (the user’s namespace); it
does not deal with input buffering or prompting or input file naming (the
filename is always passed in explicitly). The optional `locals' argument
specifies a mapping to use as the namespace in which code will be executed;
it defaults to a newly created dictionary with key @code{'__name__'} set to
@code{'__console__'} and key @code{'__doc__'} set to @code{None}.

Note that functions and classes objects created under an
@code{InteractiveInterpreter} instance will belong to the namespace
specified by `locals'.
They are only pickleable if `locals' is the namespace of an existing
module.
@end deffn

@geindex InteractiveConsole (class in code)
@anchor{library/code code InteractiveConsole}@anchor{2870}
@deffn {Class} code.InteractiveConsole (locals=None, filename='<console>', local_exit=False)

Closely emulate the behavior of the interactive Python interpreter. This class
builds on @ref{1987,,InteractiveInterpreter} and adds prompting using the familiar
@code{sys.ps1} and @code{sys.ps2}, and input buffering. If `local_exit' is true,
@code{exit()} and @code{quit()} in the console will not raise @ref{f42,,SystemExit}, but
instead return to the calling code.


Changed in version 3.13: Added `local_exit' parameter.

@end deffn

@geindex interact() (in module code)
@anchor{library/code code interact}@anchor{18d7}
@deffn {Function} code.interact (banner=None, readfunc=None, local=None, exitmsg=None, local_exit=False)

Convenience function to run a read-eval-print loop.  This creates a new
instance of @ref{2870,,InteractiveConsole} and sets `readfunc' to be used as
the @ref{4e17,,InteractiveConsole.raw_input()} method, if provided.  If `local' is
provided, it is passed to the @code{InteractiveConsole} constructor for
use as the default namespace for the interpreter loop.  If `local_exit' is provided,
it is passed to the @code{InteractiveConsole} constructor.  The @ref{4e18,,interact()}
method of the instance is then run with `banner' and `exitmsg' passed as the
banner and exit message to use, if provided.  The console object is discarded
after use.


Changed in version 3.6: Added `exitmsg' parameter.



Changed in version 3.13: Added `local_exit' parameter.

@end deffn

@geindex compile_command() (in module code)
@anchor{library/code code compile_command}@anchor{4e19}
@deffn {Function} code.compile_command (source, filename='<input>', symbol='single')

This function is useful for programs that want to emulate Python’s interpreter
main loop (a.k.a. the read-eval-print loop).  The tricky part is to determine
when the user has entered an incomplete command that can be completed by
entering more text (as opposed to a complete command or a syntax error).  This
function `almost' always makes the same decision as the real interpreter main
loop.

`source' is the source string; `filename' is the optional filename from which
source was read, defaulting to @code{'<input>'}; and `symbol' is the optional
grammar start symbol, which should be @code{'single'} (the default), @code{'eval'}
or @code{'exec'}.

Returns a code object (the same as @code{compile(source, filename, symbol)}) if the
command is complete and valid; @code{None} if the command is incomplete; raises
@ref{18f,,SyntaxError} if the command is complete and contains a syntax error, or
raises @ref{a87,,OverflowError} or @ref{2ee,,ValueError} if the command contains an
invalid literal.
@end deffn

@menu
* Interactive Interpreter Objects:: 
* Interactive Console Objects:: 

@end menu

@node Interactive Interpreter Objects,Interactive Console Objects,,code — Interpreter base classes
@anchor{library/code interactive-interpreter-objects}@anchor{4e1a}@anchor{library/code interpreter-objects}@anchor{4e1b}
@subsubsection Interactive Interpreter Objects


@geindex runsource() (code.InteractiveInterpreter method)
@anchor{library/code code InteractiveInterpreter runsource}@anchor{4e1c}
@deffn {Method} InteractiveInterpreter.runsource (source, filename='<input>', symbol='single')

Compile and run some source in the interpreter. Arguments are the same as for
@ref{4e19,,compile_command()}; the default for `filename' is @code{'<input>'}, and for
`symbol' is @code{'single'}.  One of several things can happen:


@itemize *

@item 
The input is incorrect; @ref{4e19,,compile_command()} raised an exception
(@ref{18f,,SyntaxError} or @ref{a87,,OverflowError}).  A syntax traceback will be
printed by calling the @ref{4e1d,,showsyntaxerror()} method.  @code{runsource()}
returns @code{False}.

@item 
The input is incomplete, and more input is required; @ref{4e19,,compile_command()}
returned @code{None}. @code{runsource()} returns @code{True}.

@item 
The input is complete; @ref{4e19,,compile_command()} returned a code object.  The
code is executed by calling the @ref{4e1e,,runcode()} (which also handles run-time
exceptions, except for @ref{f42,,SystemExit}). @code{runsource()} returns @code{False}.
@end itemize

The return value can be used to decide whether to use @code{sys.ps1} or @code{sys.ps2}
to prompt the next line.
@end deffn

@geindex runcode() (code.InteractiveInterpreter method)
@anchor{library/code code InteractiveInterpreter runcode}@anchor{4e1e}
@deffn {Method} InteractiveInterpreter.runcode (code)

Execute a code object. When an exception occurs, @ref{fd4,,showtraceback()} is called
to display a traceback.  All exceptions are caught except @ref{f42,,SystemExit},
which is allowed to propagate.

A note about @ref{bcb,,KeyboardInterrupt}: this exception may occur elsewhere in
this code, and may not always be caught.  The caller should be prepared to deal
with it.
@end deffn

@geindex showsyntaxerror() (code.InteractiveInterpreter method)
@anchor{library/code code InteractiveInterpreter showsyntaxerror}@anchor{4e1d}
@deffn {Method} InteractiveInterpreter.showsyntaxerror (filename=None)

Display the syntax error that just occurred.  This does not display a stack
trace because there isn’t one for syntax errors. If `filename' is given, it is
stuffed into the exception instead of the default filename provided by Python’s
parser, because it always uses @code{'<string>'} when reading from a string. The
output is written by the @ref{4e1f,,write()} method.
@end deffn

@geindex showtraceback() (code.InteractiveInterpreter method)
@anchor{library/code code InteractiveInterpreter showtraceback}@anchor{fd4}
@deffn {Method} InteractiveInterpreter.showtraceback ()

Display the exception that just occurred.  We remove the first stack item
because it is within the interpreter object implementation. The output is
written by the @ref{4e1f,,write()} method.


Changed in version 3.5: The full chained traceback is displayed instead
of just the primary traceback.

@end deffn

@geindex write() (code.InteractiveInterpreter method)
@anchor{library/code code InteractiveInterpreter write}@anchor{4e1f}
@deffn {Method} InteractiveInterpreter.write (data)

Write a string to the standard error stream (@code{sys.stderr}). Derived classes
should override this to provide the appropriate output handling as needed.
@end deffn

@node Interactive Console Objects,,Interactive Interpreter Objects,code — Interpreter base classes
@anchor{library/code console-objects}@anchor{4e20}@anchor{library/code interactive-console-objects}@anchor{4e21}
@subsubsection Interactive Console Objects


The @ref{2870,,InteractiveConsole} class is a subclass of
@ref{1987,,InteractiveInterpreter}, and so offers all the methods of the
interpreter objects as well as the following additions.

@geindex interact() (code.InteractiveConsole method)
@anchor{library/code code InteractiveConsole interact}@anchor{4e18}
@deffn {Method} InteractiveConsole.interact (banner=None, exitmsg=None)

Closely emulate the interactive Python console. The optional `banner' argument
specify the banner to print before the first interaction; by default it prints a
banner similar to the one printed by the standard Python interpreter, followed
by the class name of the console object in parentheses (so as not to confuse
this with the real interpreter – since it’s so close!).

The optional `exitmsg' argument specifies an exit message printed when exiting.
Pass the empty string to suppress the exit message. If `exitmsg' is not given or
@code{None}, a default message is printed.


Changed in version 3.4: To suppress printing any banner, pass an empty string.



Changed in version 3.6: Print an exit message when exiting.

@end deffn

@geindex push() (code.InteractiveConsole method)
@anchor{library/code code InteractiveConsole push}@anchor{4e22}
@deffn {Method} InteractiveConsole.push (line)

Push a line of source text to the interpreter. The line should not have a
trailing newline; it may have internal newlines.  The line is appended to a
buffer and the interpreter’s @ref{4e1c,,runsource()} method is called with the
concatenated contents of the buffer as source.  If this indicates that the
command was executed or invalid, the buffer is reset; otherwise, the command is
incomplete, and the buffer is left as it was after the line was appended.  The
return value is @code{True} if more input is required, @code{False} if the line was
dealt with in some way (this is the same as @code{runsource()}).
@end deffn

@geindex resetbuffer() (code.InteractiveConsole method)
@anchor{library/code code InteractiveConsole resetbuffer}@anchor{4e23}
@deffn {Method} InteractiveConsole.resetbuffer ()

Remove any unhandled source text from the input buffer.
@end deffn

@geindex raw_input() (code.InteractiveConsole method)
@anchor{library/code code InteractiveConsole raw_input}@anchor{4e17}
@deffn {Method} InteractiveConsole.raw_input (prompt='@w{'})

Write a prompt and read a line.  The returned line does not include the trailing
newline.  When the user enters the EOF key sequence, @ref{14e5,,EOFError} is raised.
The base implementation reads from @code{sys.stdin}; a subclass may replace this
with a different implementation.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node codeop — Compile Python code,,code — Interpreter base classes,Custom Python Interpreters
@anchor{library/codeop doc}@anchor{4e24}@anchor{library/codeop codeop-compile-python-code}@anchor{4e25}@anchor{library/codeop module-codeop}@anchor{1d}@anchor{library/codeop translation-repo}@anchor{4e26}
@subsection @code{codeop} — Compile Python code


@geindex module; codeop

`Source code:' Lib/codeop.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/codeop.py}


__________________________________________________________________


The @code{codeop} module provides utilities upon which the Python
read-eval-print loop can be emulated, as is done in the @ref{1b,,code} module.  As
a result, you probably don’t want to use the module directly; if you want to
include such a loop in your program you probably want to use the @code{code}
module instead.

There are two parts to this job:


@enumerate 

@item 
Being able to tell if a line of input completes a Python statement: in
short, telling whether to print ‘@code{>>>}’ or ‘@code{...}’ next.

@item 
Remembering which future statements the user has entered, so subsequent
input can be compiled with these in effect.
@end enumerate

The @code{codeop} module provides a way of doing each of these things, and a way
of doing them both.

To do just the former:

@geindex compile_command() (in module codeop)
@anchor{library/codeop codeop compile_command}@anchor{1b97}
@deffn {Function} codeop.compile_command (source, filename='<input>', symbol='single')

Tries to compile `source', which should be a string of Python code and return a
code object if `source' is valid Python code.  In that case, the filename
attribute of the code object will be `filename', which defaults to
@code{'<input>'}.  Returns @code{None} if `source' is `not' valid Python code, but is a
prefix of valid Python code.

If there is a problem with `source', an exception will be raised.
@ref{18f,,SyntaxError} is raised if there is invalid Python syntax, and
@ref{a87,,OverflowError} or @ref{2ee,,ValueError} if there is an invalid literal.

The `symbol' argument determines whether `source' is compiled as a statement
(@code{'single'}, the default), as a sequence of @ref{2c6d,,statement} (@code{'exec'}) or
as an @ref{2416,,expression} (@code{'eval'}).  Any other value will
cause @ref{2ee,,ValueError} to be raised.

@cartouche
@quotation Note 
It is possible (but not likely) that the parser stops parsing with a
successful outcome before reaching the end of the source; in this case,
trailing symbols may be ignored instead of causing an error.  For example,
a backslash followed by two newlines may be followed by arbitrary garbage.
This will be fixed once the API for the parser is better.
@end quotation
@end cartouche
@end deffn

@geindex Compile (class in codeop)
@anchor{library/codeop codeop Compile}@anchor{4e27}
@deffn {Class} codeop.Compile

Instances of this class have @ref{77b,,__call__()} methods identical in signature to
the built-in function @ref{4b2,,compile()}, but with the difference that if the
instance compiles program text containing a @ref{0,,__future__} statement, the
instance ‘remembers’ and compiles all subsequent program texts with the
statement in force.
@end deffn

@geindex CommandCompiler (class in codeop)
@anchor{library/codeop codeop CommandCompiler}@anchor{4e28}
@deffn {Class} codeop.CommandCompiler

Instances of this class have @ref{77b,,__call__()} methods identical in signature to
@ref{1b97,,compile_command()}; the difference is that if the instance compiles program
text containing a @ref{0,,__future__} statement, the instance ‘remembers’ and
compiles all subsequent program texts with the statement in force.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Importing Modules,Python Language Services,Custom Python Interpreters,The Python Standard Library
@anchor{library/modules doc}@anchor{4e29}@anchor{library/modules importing-modules}@anchor{4e2a}@anchor{library/modules modules}@anchor{4e2b}@anchor{library/modules translation-repo}@anchor{4e2c}
@section Importing Modules


The modules described in this chapter provide new ways to import other Python
modules and hooks for customizing the import process.

The full list of modules described in this chapter is:

@menu
* zipimport — Import modules from Zip archives:: 
* pkgutil — Package extension utility:: 
* modulefinder — Find modules used by a script:: 
* runpy — Locating and executing Python modules:: 
* importlib — The implementation of import:: 
* importlib.resources – Package resource reading@comma{} opening and access: importlib resources – Package resource reading opening and access. 
* importlib.resources.abc – Abstract base classes for resources: importlib resources abc – Abstract base classes for resources. 
* importlib.metadata – Accessing package metadata: importlib metadata – Accessing package metadata. 
* The initialization of the sys.path module search path: The initialization of the sys path module search path. 

@end menu

@node zipimport — Import modules from Zip archives,pkgutil — Package extension utility,,Importing Modules
@anchor{library/zipimport doc}@anchor{4e2d}@anchor{library/zipimport module-zipimport}@anchor{139}@anchor{library/zipimport zipimport-import-modules-from-zip-archives}@anchor{4e2e}
@subsection @code{zipimport} — Import modules from Zip archives


@geindex module; zipimport

`Source code:' Lib/zipimport.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/zipimport.py}


__________________________________________________________________


This module adds the ability to import Python modules (@code{*.py},
@code{*.pyc}) and packages from ZIP-format archives. It is usually not
needed to use the @code{zipimport} module explicitly; it is automatically used
by the built-in @ref{7f9,,import} mechanism for @ref{3e2,,sys.path} items that are paths
to ZIP archives.

Typically, @ref{3e2,,sys.path} is a list of directory names as strings.  This module
also allows an item of @code{sys.path} to be a string naming a ZIP file archive.
The ZIP archive can contain a subdirectory structure to support package imports,
and a path within the archive can be specified to only import from a
subdirectory.  For example, the path @code{example.zip/lib/} would only
import from the @code{lib/} subdirectory within the archive.

Any files may be present in the ZIP archive, but importers are only invoked for
@code{.py} and @code{.pyc} files.  ZIP import of dynamic modules
(@code{.pyd}, @code{.so}) is disallowed. Note that if an archive only contains
@code{.py} files, Python will not attempt to modify the archive by adding the
corresponding @code{.pyc} file, meaning that if a ZIP archive
doesn’t contain @code{.pyc} files, importing may be rather slow.


Changed in version 3.13: ZIP64 is supported



Changed in version 3.8: Previously, ZIP archives with an archive comment were not supported.



@subsubheading See also



@table @asis

@item PKZIP Application Note@footnote{https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT}

Documentation on the ZIP file format by Phil Katz, the creator of the format and
algorithms used.

@geindex Python Enhancement Proposals; PEP 273

@item PEP 273@footnote{https://peps.python.org/pep-0273/} - Import Modules from Zip Archives

Written by James C. Ahlstrom, who also provided an implementation. Python 2.3
follows the specification in 
@geindex Python Enhancement Proposals; PEP 273
PEP 273@footnote{https://peps.python.org/pep-0273/}, but uses an implementation written by Just
van Rossum that uses the import hooks described in 
@geindex Python Enhancement Proposals; PEP 302
PEP 302@footnote{https://peps.python.org/pep-0302/}.

@item @ref{7b,,importlib} - The implementation of the import machinery

Package providing the relevant protocols for all importers to
implement.
@end table


This module defines an exception:

@geindex ZipImportError
@anchor{library/zipimport zipimport ZipImportError}@anchor{4e2f}
@deffn {Exception} zipimport.ZipImportError

Exception raised by zipimporter objects. It’s a subclass of @ref{65b,,ImportError},
so it can be caught as @code{ImportError}, too.
@end deffn

@menu
* zipimporter Objects:: 
* Examples: Examples<34>. 

@end menu

@node zipimporter Objects,Examples<34>,,zipimport — Import modules from Zip archives
@anchor{library/zipimport id1}@anchor{4e30}@anchor{library/zipimport zipimporter-objects}@anchor{4e31}
@subsubsection zipimporter Objects


@ref{4e32,,zipimporter} is the class for importing ZIP files.

@geindex zipimporter (class in zipimport)
@anchor{library/zipimport zipimport zipimporter}@anchor{4e32}
@deffn {Class} zipimport.zipimporter (archivepath)

Create a new zipimporter instance. `archivepath' must be a path to a ZIP
file, or to a specific path within a ZIP file.  For example, an `archivepath'
of @code{foo/bar.zip/lib} will look for modules in the @code{lib} directory
inside the ZIP file @code{foo/bar.zip} (provided that it exists).

@ref{4e2f,,ZipImportError} is raised if `archivepath' doesn’t point to a valid ZIP
archive.


Changed in version 3.12: Methods @code{find_loader()} and @code{find_module()}, deprecated in 3.10 are
now removed.  Use @ref{a64,,find_spec()} instead.


@geindex create_module() (zipimport.zipimporter method)
@anchor{library/zipimport zipimport zipimporter create_module}@anchor{a65}
@deffn {Method} create_module (spec)

Implementation of @ref{eb2,,importlib.abc.Loader.create_module()} that returns
@ref{887,,None} to explicitly request the default semantics.


Added in version 3.10.

@end deffn

@geindex exec_module() (zipimport.zipimporter method)
@anchor{library/zipimport zipimport zipimporter exec_module}@anchor{337}
@deffn {Method} exec_module (module)

Implementation of @ref{a70,,importlib.abc.Loader.exec_module()}.


Added in version 3.10.

@end deffn

@geindex find_spec() (zipimport.zipimporter method)
@anchor{library/zipimport zipimport zipimporter find_spec}@anchor{a64}
@deffn {Method} find_spec (fullname, target=None)

An implementation of @ref{a72,,importlib.abc.PathEntryFinder.find_spec()}.


Added in version 3.10.

@end deffn

@geindex get_code() (zipimport.zipimporter method)
@anchor{library/zipimport zipimport zipimporter get_code}@anchor{4e33}
@deffn {Method} get_code (fullname)

Return the code object for the specified module. Raise
@ref{4e2f,,ZipImportError} if the module couldn’t be imported.
@end deffn

@geindex get_data() (zipimport.zipimporter method)
@anchor{library/zipimport zipimport zipimporter get_data}@anchor{4e34}
@deffn {Method} get_data (pathname)

Return the data associated with `pathname'. Raise @ref{2c2,,OSError} if the
file wasn’t found.


Changed in version 3.3: @ref{1259,,IOError} used to be raised, it is now an alias of @ref{2c2,,OSError}.

@end deffn

@geindex get_filename() (zipimport.zipimporter method)
@anchor{library/zipimport zipimport zipimporter get_filename}@anchor{4e35}
@deffn {Method} get_filename (fullname)

Return the value @code{__file__} would be set to if the specified module
was imported. Raise @ref{4e2f,,ZipImportError} if the module couldn’t be
imported.


Added in version 3.1.

@end deffn

@geindex get_source() (zipimport.zipimporter method)
@anchor{library/zipimport zipimport zipimporter get_source}@anchor{4e36}
@deffn {Method} get_source (fullname)

Return the source code for the specified module. Raise
@ref{4e2f,,ZipImportError} if the module couldn’t be found, return
@ref{887,,None} if the archive does contain the module, but has no source
for it.
@end deffn

@geindex is_package() (zipimport.zipimporter method)
@anchor{library/zipimport zipimport zipimporter is_package}@anchor{4e37}
@deffn {Method} is_package (fullname)

Return @code{True} if the module specified by `fullname' is a package. Raise
@ref{4e2f,,ZipImportError} if the module couldn’t be found.
@end deffn

@geindex load_module() (zipimport.zipimporter method)
@anchor{library/zipimport zipimport zipimporter load_module}@anchor{336}
@deffn {Method} load_module (fullname)

Load the module specified by `fullname'. `fullname' must be the fully
qualified (dotted) module name. Returns the imported module on success,
raises @ref{4e2f,,ZipImportError} on failure.


Deprecated since version 3.10, will be removed in version 3.15: Use @ref{337,,exec_module()} instead.

@end deffn

@geindex invalidate_caches() (zipimport.zipimporter method)
@anchor{library/zipimport zipimport zipimporter invalidate_caches}@anchor{a66}
@deffn {Method} invalidate_caches ()

Clear out the internal cache of information about files found within
the ZIP archive.


Added in version 3.10.

@end deffn

@geindex archive (zipimport.zipimporter attribute)
@anchor{library/zipimport zipimport zipimporter archive}@anchor{4e38}
@deffn {Attribute} archive

The file name of the importer’s associated ZIP file, without a possible
subpath.
@end deffn

@geindex prefix (zipimport.zipimporter attribute)
@anchor{library/zipimport zipimport zipimporter prefix}@anchor{4e39}
@deffn {Attribute} prefix

The subpath within the ZIP file where modules are searched.  This is the
empty string for zipimporter objects which point to the root of the ZIP
file.
@end deffn

The @ref{4e38,,archive} and @ref{4e39,,prefix} attributes, when combined with a
slash, equal the original `archivepath' argument given to the
@code{zipimporter} constructor.
@end deffn

@node Examples<34>,,zipimporter Objects,zipimport — Import modules from Zip archives
@anchor{library/zipimport examples}@anchor{4e3a}@anchor{library/zipimport zipimport-examples}@anchor{4e3b}
@subsubsection Examples


Here is an example that imports a module from a ZIP archive - note that the
@code{zipimport} module is not explicitly used.

@example
$ unzip -l example_archive.zip
Archive:  example_archive.zip
  Length     Date   Time    Name
 --------    ----   ----    ----
     8467  01-01-00 12:30   example.py
 --------                   -------
     8467                   1 file
@end example

@example
>>> import sys
>>> # Add the archive to the front of the module search path
>>> sys.path.insert(0, 'example_archive.zip')
>>> import example
>>> example.__file__
'example_archive.zip/example.py'
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node pkgutil — Package extension utility,modulefinder — Find modules used by a script,zipimport — Import modules from Zip archives,Importing Modules
@anchor{library/pkgutil doc}@anchor{4e3c}@anchor{library/pkgutil module-pkgutil}@anchor{ae}@anchor{library/pkgutil pkgutil-package-extension-utility}@anchor{4e3d}@anchor{library/pkgutil translation-repo}@anchor{4e3e}
@subsection @code{pkgutil} — Package extension utility


@geindex module; pkgutil

`Source code:' Lib/pkgutil.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/pkgutil.py}


__________________________________________________________________


This module provides utilities for the import system, in particular package
support.

@geindex ModuleInfo (class in pkgutil)
@anchor{library/pkgutil pkgutil ModuleInfo}@anchor{f4e}
@deffn {Class} pkgutil.ModuleInfo (module_finder, name, ispkg)

A namedtuple that holds a brief summary of a module’s info.


Added in version 3.6.

@end deffn

@geindex extend_path() (in module pkgutil)
@anchor{library/pkgutil pkgutil extend_path}@anchor{1968}
@deffn {Function} pkgutil.extend_path (path, name)

Extend the search path for the modules which comprise a package.  Intended
use is to place the following code in a package’s @code{__init__.py}:

@example
from pkgutil import extend_path
__path__ = extend_path(__path__, __name__)
@end example

For each directory on @ref{3e2,,sys.path} that has a subdirectory that matches the
package name, add the subdirectory to the package’s
@ref{2098,,__path__}. This is useful
if one wants to distribute different parts of a single logical package as multiple
directories.

It also looks for @code{*.pkg} files beginning where @code{*} matches the
`name' argument.  This feature is similar to @code{*.pth} files (see the
@ref{cc,,site} module for more information), except that it doesn’t special-case
lines starting with @code{import}.  A @code{*.pkg} file is trusted at face
value: apart from skipping blank lines and ignoring comments, all entries
found in a @code{*.pkg} file are added to the path, regardless of whether
they exist on the filesystem (this is a feature).

If the input path is not a list (as is the case for frozen packages) it is
returned unchanged.  The input path is not modified; an extended copy is
returned.  Items are only appended to the copy at the end.

It is assumed that @ref{3e2,,sys.path} is a sequence.  Items of @code{sys.path}
that are not strings referring to existing directories are ignored. Unicode
items on @code{sys.path} that cause errors when used as filenames may cause
this function to raise an exception (in line with @ref{c0b,,os.path.isdir()}
behavior).
@end deffn

@geindex get_importer() (in module pkgutil)
@anchor{library/pkgutil pkgutil get_importer}@anchor{4e3f}
@deffn {Function} pkgutil.get_importer (path_item)

Retrieve a @ref{23ae,,finder} for the given `path_item'.

The returned finder is cached in @ref{7fb,,sys.path_importer_cache} if it was
newly created by a path hook.

The cache (or part of it) can be cleared manually if a rescan of
@ref{122a,,sys.path_hooks} is necessary.


Changed in version 3.3: Updated to be based directly on @ref{7b,,importlib} rather than relying
on the package internal 
@geindex Python Enhancement Proposals; PEP 302
PEP 302@footnote{https://peps.python.org/pep-0302/} import emulation.

@end deffn

@geindex iter_importers() (in module pkgutil)
@anchor{library/pkgutil pkgutil iter_importers}@anchor{13a5}
@deffn {Function} pkgutil.iter_importers (fullname='@w{'})

Yield @ref{23ae,,finder} objects for the given module name.

If `fullname' contains a @code{'.'}, the finders will be for the package
containing `fullname', otherwise they will be all registered top level
finders (i.e. those on both @ref{f2d,,sys.meta_path} and @ref{122a,,sys.path_hooks}).

If the named module is in a package, that package is imported as a side
effect of invoking this function.

If no module name is specified, all top level finders are produced.


Changed in version 3.3: Updated to be based directly on @ref{7b,,importlib} rather than relying
on the package internal 
@geindex Python Enhancement Proposals; PEP 302
PEP 302@footnote{https://peps.python.org/pep-0302/} import emulation.

@end deffn

@geindex iter_modules() (in module pkgutil)
@anchor{library/pkgutil pkgutil iter_modules}@anchor{f4d}
@deffn {Function} pkgutil.iter_modules (path=None, prefix='@w{'})

Yields @ref{f4e,,ModuleInfo} for all submodules on `path', or, if
`path' is @code{None}, all top-level modules on @ref{3e2,,sys.path}.

`path' should be either @code{None} or a list of paths to look for modules in.

`prefix' is a string to output on the front of every module name on output.

@cartouche
@quotation Note 
Only works for a @ref{23ae,,finder} which defines an @code{iter_modules()}
method. This interface is non-standard, so the module also provides
implementations for @ref{1278,,importlib.machinery.FileFinder} and
@ref{4e32,,zipimport.zipimporter}.
@end quotation
@end cartouche


Changed in version 3.3: Updated to be based directly on @ref{7b,,importlib} rather than relying
on the package internal 
@geindex Python Enhancement Proposals; PEP 302
PEP 302@footnote{https://peps.python.org/pep-0302/} import emulation.

@end deffn

@geindex walk_packages() (in module pkgutil)
@anchor{library/pkgutil pkgutil walk_packages}@anchor{dff}
@deffn {Function} pkgutil.walk_packages (path=None, prefix='@w{'}, onerror=None)

Yields @ref{f4e,,ModuleInfo} for all modules recursively on
`path', or, if `path' is @code{None}, all accessible modules.

`path' should be either @code{None} or a list of paths to look for modules in.

`prefix' is a string to output on the front of every module name on output.

Note that this function must import all `packages' (`not' all modules!) on
the given `path', in order to access the @code{__path__} attribute to find
submodules.

`onerror' is a function which gets called with one argument (the name of the
package which was being imported) if any exception occurs while trying to
import a package.  If no `onerror' function is supplied, @ref{65b,,ImportError}s
are caught and ignored, while all other exceptions are propagated,
terminating the search.

Examples:

@example
# list all modules python can access
walk_packages()

# list all submodules of ctypes
walk_packages(ctypes.__path__, ctypes.__name__ + '.')
@end example

@cartouche
@quotation Note 
Only works for a @ref{23ae,,finder} which defines an @code{iter_modules()}
method. This interface is non-standard, so the module also provides
implementations for @ref{1278,,importlib.machinery.FileFinder} and
@ref{4e32,,zipimport.zipimporter}.
@end quotation
@end cartouche


Changed in version 3.3: Updated to be based directly on @ref{7b,,importlib} rather than relying
on the package internal 
@geindex Python Enhancement Proposals; PEP 302
PEP 302@footnote{https://peps.python.org/pep-0302/} import emulation.

@end deffn

@geindex get_data() (in module pkgutil)
@anchor{library/pkgutil pkgutil get_data}@anchor{4e40}
@deffn {Function} pkgutil.get_data (package, resource)

Get a resource from a package.

This is a wrapper for the @ref{1a6f,,loader}
@ref{4e41,,get_data} API.  The
`package' argument should be the name of a package, in standard module format
(@code{foo.bar}).  The `resource' argument should be in the form of a relative
filename, using @code{/} as the path separator.

The function returns a binary string that is the contents of the specified
resource.

This function uses the @ref{1a6f,,loader} method
@ref{4e42,,get_data()}
to support modules installed in the filesystem, but also in zip files,
databases, or elsewhere.

For packages located in the filesystem, which have already been imported,
this is the rough equivalent of:

@example
d = os.path.dirname(sys.modules[package].__file__)
data = open(os.path.join(d, resource), 'rb').read()
@end example

Like the @ref{318,,open()} function, @code{get_data()} can follow parent
directories (@code{../}) and absolute paths (starting with @code{/} or @code{C:/},
for example).
It can open compilation/installation artifacts like @code{.py} and @code{.pyc}
files or files with @ref{329,,reserved filenames}.
To be compatible with non-filesystem loaders, avoid using these features.

@cartouche
@quotation Warning 
This function is intended for trusted input.
It does not verify that `resource' “belongs” to `package'.
@end quotation
@end cartouche

If you use a user-provided `resource' path, consider verifying it.
For example, require an alphanumeric filename with a known extension, or
install and check a list of known resources.

If the package cannot be located or loaded, or it uses a @ref{1a6f,,loader}
which does not support @ref{4e41,,get_data},
then @code{None} is returned.  In particular, the loader for
@ref{2b4,,namespace packages} does not support
@code{get_data}.


@subsubheading See also


The @ref{7f,,importlib.resources} module provides structured access to
module resources.

@end deffn

@geindex resolve_name() (in module pkgutil)
@anchor{library/pkgutil pkgutil resolve_name}@anchor{4e43}
@deffn {Function} pkgutil.resolve_name (name)

Resolve a name to an object.

This functionality is used in numerous places in the standard library (see
bpo-12915@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12915}) - and equivalent functionality is also in widely used
third-party packages such as setuptools, Django and Pyramid.

It is expected that `name' will be a string in one of the following
formats, where W is shorthand for a valid Python identifier and dot stands
for a literal period in these pseudo-regexes:


@itemize *

@item 
@code{W(.W)*}

@item 
@code{W(.W)*:(W(.W)*)?}
@end itemize

The first form is intended for backward compatibility only. It assumes that
some part of the dotted name is a package, and the rest is an object
somewhere within that package, possibly nested inside other objects.
Because the place where the package stops and the object hierarchy starts
can’t be inferred by inspection, repeated attempts to import must be done
with this form.

In the second form, the caller makes the division point clear through the
provision of a single colon: the dotted name to the left of the colon is a
package to be imported, and the dotted name to the right is the object
hierarchy within that package. Only one import is needed in this form. If
it ends with the colon, then a module object is returned.

The function will return an object (which might be a module), or raise one
of the following exceptions:

@ref{2ee,,ValueError} – if `name' isn’t in a recognised format.

@ref{65b,,ImportError} – if an import failed when it shouldn’t have.

@ref{5f0,,AttributeError} – If a failure occurred when traversing the object
hierarchy within the imported package to get to the desired object.


Added in version 3.9.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node modulefinder — Find modules used by a script,runpy — Locating and executing Python modules,pkgutil — Package extension utility,Importing Modules
@anchor{library/modulefinder doc}@anchor{4e44}@anchor{library/modulefinder module-modulefinder}@anchor{95}@anchor{library/modulefinder modulefinder-find-modules-used-by-a-script}@anchor{4e45}@anchor{library/modulefinder translation-repo}@anchor{4e46}
@subsection @code{modulefinder} — Find modules used by a script


@geindex module; modulefinder

`Source code:' Lib/modulefinder.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/modulefinder.py}


__________________________________________________________________


This module provides a @ref{1e27,,ModuleFinder} class that can be used to determine
the set of modules imported by a script. @code{modulefinder.py} can also be run as
a script, giving the filename of a Python script as its argument, after which a
report of the imported modules will be printed.

@geindex AddPackagePath() (in module modulefinder)
@anchor{library/modulefinder modulefinder AddPackagePath}@anchor{4e47}
@deffn {Function} modulefinder.AddPackagePath (pkg_name, path)

Record that the package named `pkg_name' can be found in the specified `path'.
@end deffn

@geindex ReplacePackage() (in module modulefinder)
@anchor{library/modulefinder modulefinder ReplacePackage}@anchor{4e48}
@deffn {Function} modulefinder.ReplacePackage (oldname, newname)

Allows specifying that the module named `oldname' is in fact the package named
`newname'.
@end deffn

@geindex ModuleFinder (class in modulefinder)
@anchor{library/modulefinder modulefinder ModuleFinder}@anchor{1e27}
@deffn {Class} modulefinder.ModuleFinder (path=None, debug=0, excludes=[], replace_paths=[])

This class provides @ref{4e49,,run_script()} and @ref{4e4a,,report()} methods to determine
the set of modules imported by a script. `path' can be a list of directories to
search for modules; if not specified, @code{sys.path} is used.  `debug' sets the
debugging level; higher values make the class print debugging messages about
what it’s doing. `excludes' is a list of module names to exclude from the
analysis. `replace_paths' is a list of @code{(oldpath, newpath)} tuples that will
be replaced in module paths.

@geindex report() (modulefinder.ModuleFinder method)
@anchor{library/modulefinder modulefinder ModuleFinder report}@anchor{4e4a}
@deffn {Method} report ()

Print a report to standard output that lists the modules imported by the
script and their paths, as well as modules that are missing or seem to be
missing.
@end deffn

@geindex run_script() (modulefinder.ModuleFinder method)
@anchor{library/modulefinder modulefinder ModuleFinder run_script}@anchor{4e49}
@deffn {Method} run_script (pathname)

Analyze the contents of the `pathname' file, which must contain Python
code.
@end deffn

@geindex modules (modulefinder.ModuleFinder attribute)
@anchor{library/modulefinder modulefinder ModuleFinder modules}@anchor{4e4b}
@deffn {Attribute} modules

A dictionary mapping module names to modules. See
@ref{4e4c,,Example usage of ModuleFinder}.
@end deffn
@end deffn

@menu
* Example usage of ModuleFinder:: 

@end menu

@node Example usage of ModuleFinder,,,modulefinder — Find modules used by a script
@anchor{library/modulefinder example-usage-of-modulefinder}@anchor{4e4d}@anchor{library/modulefinder modulefinder-example}@anchor{4e4c}
@subsubsection Example usage of @code{ModuleFinder}


The script that is going to get analyzed later on (bacon.py):

@example
import re, itertools

try:
    import baconhameggs
except ImportError:
    pass

try:
    import guido.python.ham
except ImportError:
    pass
@end example

The script that will output the report of bacon.py:

@example
from modulefinder import ModuleFinder

finder = ModuleFinder()
finder.run_script('bacon.py')

print('Loaded modules:')
for name, mod in finder.modules.items():
    print('%s: ' % name, end='@w{'})
    print(','.join(list(mod.globalnames.keys())[:3]))

print('-'*50)
print('Modules not imported:')
print('\n'.join(finder.badmodules.keys()))
@end example

Sample output (may vary depending on the architecture):

@example
Loaded modules:
_types:
copyreg:  _inverted_registry,_slotnames,__all__
re._compiler:  isstring,_sre,_optimize_unicode
_sre:
re._constants:  REPEAT_ONE,makedict,AT_END_LINE
sys:
re:  __module__,finditer,_expand
itertools:
__main__:  re,itertools,baconhameggs
re._parser:  _PATTERNENDERS,SRE_FLAG_UNICODE
array:
types:  __module__,IntType,TypeType
---------------------------------------------------
Modules not imported:
guido.python.ham
baconhameggs
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node runpy — Locating and executing Python modules,importlib — The implementation of import,modulefinder — Find modules used by a script,Importing Modules
@anchor{library/runpy doc}@anchor{4e4e}@anchor{library/runpy module-runpy}@anchor{c3}@anchor{library/runpy runpy-locating-and-executing-python-modules}@anchor{4e4f}@anchor{library/runpy translation-repo}@anchor{4e50}
@subsection @code{runpy} — Locating and executing Python modules


@geindex module; runpy

`Source code:' Lib/runpy.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/runpy.py}


__________________________________________________________________


The @code{runpy} module is used to locate and run Python modules without
importing them first. Its main use is to implement the @ref{23e,,-m} command
line switch that allows scripts to be located using the Python module
namespace rather than the filesystem.

Note that this is `not' a sandbox module - all code is executed in the
current process, and any side effects (such as cached imports of other
modules) will remain in place after the functions have returned.

Furthermore, any functions and classes defined by the executed code are not
guaranteed to work correctly after a @code{runpy} function has returned.
If that limitation is not acceptable for a given use case, @ref{7b,,importlib}
is likely to be a more suitable choice than this module.

The @code{runpy} module provides two functions:

@geindex run_module() (in module runpy)
@anchor{library/runpy runpy run_module}@anchor{1794}
@deffn {Function} runpy.run_module (mod_name, init_globals=None, run_name=None, alter_sys=False)

@geindex module; __main__

Execute the code of the specified module and return the resulting module’s
globals dictionary. The module’s code is first located using the standard
import mechanism (refer to 
@geindex Python Enhancement Proposals; PEP 302
PEP 302@footnote{https://peps.python.org/pep-0302/} for details) and then executed in a
fresh module namespace.

The `mod_name' argument should be an absolute module name.
If the module name refers to a package rather than a normal
module, then that package is imported and the @ref{1,,__main__} submodule within
that package is then executed and the resulting module globals dictionary
returned.

The optional dictionary argument `init_globals' may be used to pre-populate
the module’s globals dictionary before the code is executed.
`init_globals' will not be modified. If any of the special global variables
below are defined in `init_globals', those definitions are
overridden by @code{run_module()}.

The special global variables @code{__name__}, @code{__spec__}, @code{__file__},
@code{__cached__}, @code{__loader__} and @code{__package__} are set in the globals
dictionary before the module code is executed. (Note that this is a
minimal set of variables - other variables may be set implicitly as an
interpreter implementation detail.)

@code{__name__} is set to `run_name' if this optional argument is not
@ref{887,,None}, to @code{mod_name + '.__main__'} if the named module is a
package and to the `mod_name' argument otherwise.

@code{__spec__} will be set appropriately for the `actually' imported
module (that is, @code{__spec__.name} will always be `mod_name' or
@code{mod_name + '.__main__'}, never `run_name').

@code{__file__}, @code{__cached__}, @code{__loader__} and @code{__package__} are
@ref{23a5,,set as normal} based on the module spec.

If the argument `alter_sys' is supplied and evaluates to @ref{e0d,,True},
then @code{sys.argv[0]} is updated with the value of @code{__file__} and
@code{sys.modules[__name__]} is updated with a temporary module object for the
module being executed. Both @code{sys.argv[0]} and @code{sys.modules[__name__]}
are restored to their original values before the function returns.

Note that this manipulation of @ref{df,,sys} is not thread-safe. Other threads
may see the partially initialised module, as well as the altered list of
arguments. It is recommended that the @code{sys} module be left alone when
invoking this function from threaded code.


@subsubheading See also


The @ref{23e,,-m} option offering equivalent functionality from the
command line.



Changed in version 3.1: Added ability to execute packages by looking for a @ref{1,,__main__} submodule.



Changed in version 3.2: Added @code{__cached__} global variable (see 
@geindex Python Enhancement Proposals; PEP 3147
PEP 3147@footnote{https://peps.python.org/pep-3147/}).



Changed in version 3.4: Updated to take advantage of the module spec feature added by
@geindex Python Enhancement Proposals; PEP 451
PEP 451@footnote{https://peps.python.org/pep-0451/}. This allows @code{__cached__} to be set correctly for modules
run this way, as well as ensuring the real module name is always
accessible as @code{__spec__.name}.



Changed in version 3.12: The setting of @code{__cached__}, @code{__loader__}, and
@code{__package__} are deprecated. See
@ref{22b0,,ModuleSpec} for alternatives.

@end deffn

@geindex run_path() (in module runpy)
@anchor{library/runpy runpy run_path}@anchor{4a5}
@deffn {Function} runpy.run_path (path_name, init_globals=None, run_name=None)

@geindex module; __main__

Execute the code at the named filesystem location and return the resulting
module’s globals dictionary. As with a script name supplied to the CPython
command line, `file_path' may refer to a Python source file, a
compiled bytecode file or a valid @ref{3e2,,sys.path} entry containing a
@ref{1,,__main__} module
(e.g. a zipfile containing a top-level @code{__main__.py} file).

For a simple script, the specified code is simply executed in a fresh
module namespace. For a valid @ref{3e2,,sys.path} entry (typically a zipfile or
directory), the entry is first added to the beginning of @code{sys.path}. The
function then looks for and executes a @ref{1,,__main__} module using the
updated path. Note that there is no special protection against invoking
an existing @code{__main__} entry located elsewhere on @code{sys.path} if
there is no such module at the specified location.

The optional dictionary argument `init_globals' may be used to pre-populate
the module’s globals dictionary before the code is executed.
`init_globals' will not be modified. If any of the special global variables
below are defined in `init_globals', those definitions are
overridden by @code{run_path()}.

The special global variables @code{__name__}, @code{__spec__}, @code{__file__},
@code{__cached__}, @code{__loader__} and @code{__package__} are set in the globals
dictionary before the module code is executed. (Note that this is a
minimal set of variables - other variables may be set implicitly as an
interpreter implementation detail.)

@code{__name__} is set to `run_name' if this optional argument is not
@ref{887,,None} and to @code{'<run_path>'} otherwise.

If `file_path' directly references a script file (whether as source
or as precompiled byte code), then @code{__file__} will be set to
`file_path', and @code{__spec__}, @code{__cached__}, @code{__loader__} and
@code{__package__} will all be set to @ref{887,,None}.

If `file_path' is a reference to a valid @ref{3e2,,sys.path} entry, then
@code{__spec__} will be set appropriately for the imported @ref{1,,__main__}
module (that is, @code{__spec__.name} will always be @code{__main__}).
@code{__file__}, @code{__cached__}, @code{__loader__} and @code{__package__} will be
@ref{23a5,,set as normal} based on the module spec.

A number of alterations are also made to the @ref{df,,sys} module. Firstly,
@ref{3e2,,sys.path} may be altered as described above. @code{sys.argv[0]} is updated
with the value of `file_path' and @code{sys.modules[__name__]} is updated
with a temporary module object for the module being executed. All
modifications to items in @code{sys} are reverted before the function
returns.

Note that, unlike @ref{1794,,run_module()}, the alterations made to @ref{df,,sys}
are not optional in this function as these adjustments are essential to
allowing the execution of @ref{3e2,,sys.path} entries. As the thread-safety
limitations still apply, use of this function in threaded code should be
either serialised with the import lock or delegated to a separate process.


@subsubheading See also


@ref{215e,,Interface options} for equivalent functionality on the
command line (@code{python path/to/script}).



Added in version 3.2.



Changed in version 3.4: Updated to take advantage of the module spec feature added by
@geindex Python Enhancement Proposals; PEP 451
PEP 451@footnote{https://peps.python.org/pep-0451/}. This allows @code{__cached__} to be set correctly in the
case where @code{__main__} is imported from a valid @ref{3e2,,sys.path} entry rather
than being executed directly.



Changed in version 3.12: The setting of @code{__cached__}, @code{__loader__}, and
@code{__package__} are deprecated.

@end deffn


@subsubheading See also



@table @asis

@geindex Python Enhancement Proposals; PEP 338

@item PEP 338@footnote{https://peps.python.org/pep-0338/} – Executing modules as scripts

PEP written and implemented by Nick Coghlan.

@geindex Python Enhancement Proposals; PEP 366

@item PEP 366@footnote{https://peps.python.org/pep-0366/} – Main module explicit relative imports

PEP written and implemented by Nick Coghlan.

@geindex Python Enhancement Proposals; PEP 451

@item PEP 451@footnote{https://peps.python.org/pep-0451/} – A ModuleSpec Type for the Import System

PEP written and implemented by Eric Snow
@end table

@ref{1dea,,Command line and environment} - CPython command line details

The @ref{73d,,importlib.import_module()} function


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node importlib — The implementation of import,importlib resources – Package resource reading opening and access,runpy — Locating and executing Python modules,Importing Modules
@anchor{library/importlib doc}@anchor{4e51}@anchor{library/importlib importlib-the-implementation-of-import}@anchor{4e52}@anchor{library/importlib module-importlib}@anchor{7b}@anchor{library/importlib translation-repo}@anchor{4e53}
@subsection @code{importlib} — The implementation of @code{import}


@geindex module; importlib


Added in version 3.1.


`Source code:' Lib/importlib/__init__.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/importlib/__init__.py}


__________________________________________________________________


@menu
* Introduction: Introduction<13>. 
* Functions: Functions<13>. 
* importlib.abc – Abstract base classes related to import: importlib abc – Abstract base classes related to import. 
* importlib.machinery – Importers and path hooks: importlib machinery – Importers and path hooks. 
* importlib.util – Utility code for importers: importlib util – Utility code for importers. 
* Examples: Examples<35>. 

@end menu

@node Introduction<13>,Functions<13>,,importlib — The implementation of import
@anchor{library/importlib introduction}@anchor{4e54}
@subsubsection Introduction


The purpose of the @code{importlib} package is three-fold.

One is to provide the
implementation of the @ref{7f9,,import} statement (and thus, by extension, the
@ref{ad7,,__import__()} function) in Python source code. This provides an
implementation of @code{import} which is portable to any Python
interpreter. This also provides an implementation which is easier to
comprehend than one implemented in a programming language other than Python.

Two, the components to implement @ref{7f9,,import} are exposed in this
package, making it easier for users to create their own custom objects (known
generically as an @ref{2490,,importer}) to participate in the import process.

Three, the package contains modules exposing additional functionality for
managing aspects of Python packages:


@itemize *

@item 
@ref{7e,,importlib.metadata} presents access to metadata from third-party
distributions.

@item 
@ref{7f,,importlib.resources} provides routines for accessing non-code
“resources” from Python packages.
@end itemize


@subsubheading See also



@table @asis

@item @ref{7f9,,The import statement}

The language reference for the @ref{7f9,,import} statement.

@item Packages specification@footnote{https://www.python.org/doc/essays/packages/}

Original specification of packages. Some semantics have changed since
the writing of this document (e.g. redirecting based on @code{None}
in @ref{1771,,sys.modules}).

@item The @ref{1273,,__import__()} function

The @ref{7f9,,import} statement is syntactic sugar for this function.

@item @ref{1922,,The initialization of the sys.path module search path}

The initialization of @ref{3e2,,sys.path}.

@geindex Python Enhancement Proposals; PEP 235

@item PEP 235@footnote{https://peps.python.org/pep-0235/}

Import on Case-Insensitive Platforms

@geindex Python Enhancement Proposals; PEP 263

@item PEP 263@footnote{https://peps.python.org/pep-0263/}

Defining Python Source Code Encodings

@geindex Python Enhancement Proposals; PEP 302

@item PEP 302@footnote{https://peps.python.org/pep-0302/}

New Import Hooks

@geindex Python Enhancement Proposals; PEP 328

@item PEP 328@footnote{https://peps.python.org/pep-0328/}

Imports: Multi-Line and Absolute/Relative

@geindex Python Enhancement Proposals; PEP 366

@item PEP 366@footnote{https://peps.python.org/pep-0366/}

Main module explicit relative imports

@geindex Python Enhancement Proposals; PEP 420

@item PEP 420@footnote{https://peps.python.org/pep-0420/}

Implicit namespace packages

@geindex Python Enhancement Proposals; PEP 451

@item PEP 451@footnote{https://peps.python.org/pep-0451/}

A ModuleSpec Type for the Import System

@geindex Python Enhancement Proposals; PEP 488

@item PEP 488@footnote{https://peps.python.org/pep-0488/}

Elimination of PYO files

@geindex Python Enhancement Proposals; PEP 489

@item PEP 489@footnote{https://peps.python.org/pep-0489/}

Multi-phase extension module initialization

@geindex Python Enhancement Proposals; PEP 552

@item PEP 552@footnote{https://peps.python.org/pep-0552/}

Deterministic pycs

@geindex Python Enhancement Proposals; PEP 3120

@item PEP 3120@footnote{https://peps.python.org/pep-3120/}

Using UTF-8 as the Default Source Encoding

@geindex Python Enhancement Proposals; PEP 3147

@item PEP 3147@footnote{https://peps.python.org/pep-3147/}

PYC Repository Directories
@end table


@node Functions<13>,importlib abc – Abstract base classes related to import,Introduction<13>,importlib — The implementation of import
@anchor{library/importlib functions}@anchor{4e55}
@subsubsection Functions


@geindex __import__() (in module importlib)
@anchor{library/importlib importlib __import__}@anchor{1273}
@deffn {Function} importlib.__import__ (name, globals=None, locals=None, fromlist=(), level=0)

An implementation of the built-in @code{__import__()} function.

@cartouche
@quotation Note 
Programmatic importing of modules should use @ref{73d,,import_module()}
instead of this function.
@end quotation
@end cartouche
@end deffn

@geindex import_module() (in module importlib)
@anchor{library/importlib importlib import_module}@anchor{73d}
@deffn {Function} importlib.import_module (name, package=None)

Import a module. The `name' argument specifies what module to
import in absolute or relative terms
(e.g. either @code{pkg.mod} or @code{..mod}). If the name is
specified in relative terms, then the `package' argument must be set to
the name of the package which is to act as the anchor for resolving the
package name (e.g. @code{import_module('..mod', 'pkg.subpkg')} will import
@code{pkg.mod}).

The @code{import_module()} function acts as a simplifying wrapper around
@ref{1273,,importlib.__import__()}. This means all semantics of the function are
derived from @code{importlib.__import__()}. The most important difference
between these two functions is that @code{import_module()} returns the
specified package or module (e.g. @code{pkg.mod}), while @ref{ad7,,__import__()}
returns the top-level package or module (e.g. @code{pkg}).

If you are dynamically importing a module that was created since the
interpreter began execution (e.g., created a Python source file), you may
need to call @ref{e10,,invalidate_caches()} in order for the new module to be
noticed by the import system.


Changed in version 3.3: Parent packages are automatically imported.

@end deffn

@geindex invalidate_caches() (in module importlib)
@anchor{library/importlib importlib invalidate_caches}@anchor{e10}
@deffn {Function} importlib.invalidate_caches ()

Invalidate the internal caches of finders stored at
@ref{f2d,,sys.meta_path}. If a finder implements @code{invalidate_caches()} then it
will be called to perform the invalidation.  This function should be called
if any modules are created/installed while your program is running to
guarantee all finders will notice the new module’s existence.


Added in version 3.3.



Changed in version 3.10: Namespace packages created/installed in a different @ref{3e2,,sys.path}
location after the same namespace was already imported are noticed.

@end deffn

@geindex reload() (in module importlib)
@anchor{library/importlib importlib reload}@anchor{73e}
@deffn {Function} importlib.reload (module)

Reload a previously imported `module'.  The argument must be a module object,
so it must have been successfully imported before.  This is useful if you
have edited the module source file using an external editor and want to try
out the new version without leaving the Python interpreter.  The return value
is the module object (which can be different if re-importing causes a
different object to be placed in @ref{1771,,sys.modules}).

When @code{reload()} is executed:


@itemize *

@item 
Python module’s code is recompiled and the module-level code re-executed,
defining a new set of objects which are bound to names in the module’s
dictionary by reusing the @ref{1a6f,,loader} which originally loaded the
module.  The @code{init} function of extension modules is not called a second
time.

@item 
As with all other objects in Python the old objects are only reclaimed
after their reference counts drop to zero.

@item 
The names in the module namespace are updated to point to any new or
changed objects.

@item 
Other references to the old objects (such as names external to the module) are
not rebound to refer to the new objects and must be updated in each namespace
where they occur if that is desired.
@end itemize

There are a number of other caveats:

When a module is reloaded, its dictionary (containing the module’s global
variables) is retained.  Redefinitions of names will override the old
definitions, so this is generally not a problem.  If the new version of a
module does not define a name that was defined by the old version, the old
definition remains.  This feature can be used to the module’s advantage if it
maintains a global table or cache of objects — with a @ref{8fa,,try}
statement it can test for the table’s presence and skip its initialization if
desired:

@example
try:
    cache
except NameError:
    cache = @{@}
@end example

It is generally not very useful to reload built-in or dynamically loaded
modules.  Reloading @ref{df,,sys}, @ref{1,,__main__}, @ref{13,,builtins} and other
key modules is not recommended.  In many cases extension modules are not
designed to be initialized more than once, and may fail in arbitrary ways
when reloaded.

If a module imports objects from another module using @ref{14b7,,from} …
@ref{7f9,,import} …, calling @code{reload()} for the other module does not
redefine the objects imported from it — one way around this is to
re-execute the @code{from} statement, another is to use @code{import}
and qualified names (`module.name') instead.

If a module instantiates instances of a class, reloading the module that
defines the class does not affect the method definitions of the instances —
they continue to use the old class definition.  The same is true for derived
classes.


Added in version 3.4.



Changed in version 3.7: @ref{d43,,ModuleNotFoundError} is raised when the module being reloaded lacks
a @ref{22b0,,ModuleSpec}.


@cartouche
@quotation Warning 
This function is not thread-safe. Calling it from multiple threads can result
in unexpected behavior. It’s recommended to use the @ref{1a39,,threading.Lock}
or other synchronization primitives for thread-safe module reloading.
@end quotation
@end cartouche
@end deffn

@node importlib abc – Abstract base classes related to import,importlib machinery – Importers and path hooks,Functions<13>,importlib — The implementation of import
@anchor{library/importlib importlib-abc-abstract-base-classes-related-to-import}@anchor{4e56}@anchor{library/importlib module-importlib abc}@anchor{7c}
@subsubsection @code{importlib.abc} – Abstract base classes related to import


@geindex module; importlib.abc

`Source code:' Lib/importlib/abc.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/importlib/abc.py}


__________________________________________________________________


The @code{importlib.abc} module contains all of the core abstract base classes
used by @ref{7f9,,import}. Some subclasses of the core abstract base classes
are also provided to help in implementing the core ABCs.

ABC hierarchy:

@example
object
 +-- MetaPathFinder
 +-- PathEntryFinder
 +-- Loader
      +-- ResourceLoader --------+
      +-- InspectLoader          |
           +-- ExecutionLoader --+
                                 +-- FileLoader
                                 +-- SourceLoader
@end example

@geindex MetaPathFinder (class in importlib.abc)
@anchor{library/importlib importlib abc MetaPathFinder}@anchor{a74}
@deffn {Class} importlib.abc.MetaPathFinder

An abstract base class representing a @ref{1276,,meta path finder}.


Added in version 3.3.



Changed in version 3.10: No longer a subclass of @code{Finder}.


@geindex find_spec() (importlib.abc.MetaPathFinder method)
@anchor{library/importlib importlib abc MetaPathFinder find_spec}@anchor{a6e}
@deffn {Method} find_spec (fullname, path, target=None)

An abstract method for finding a @ref{23a7,,spec} for
the specified module.  If this is a top-level import, `path' will
be @code{None}.  Otherwise, this is a search for a subpackage or
module and `path' will be the value of @ref{2098,,__path__} from the
parent package. If a spec cannot be found, @code{None} is returned.
When passed in, @code{target} is a module object that the finder may
use to make a more educated guess about what spec to return.
@ref{a73,,importlib.util.spec_from_loader()} may be useful for implementing
concrete @code{MetaPathFinders}.


Added in version 3.4.

@end deffn

@geindex invalidate_caches() (importlib.abc.MetaPathFinder method)
@anchor{library/importlib importlib abc MetaPathFinder invalidate_caches}@anchor{4e57}
@deffn {Method} invalidate_caches ()

An optional method which, when called, should invalidate any internal
cache used by the finder. Used by @ref{e10,,importlib.invalidate_caches()}
when invalidating the caches of all finders on @ref{f2d,,sys.meta_path}.


Changed in version 3.4: Returns @code{None} when called instead of @ref{1a3,,NotImplemented}.

@end deffn
@end deffn

@geindex PathEntryFinder (class in importlib.abc)
@anchor{library/importlib importlib abc PathEntryFinder}@anchor{a75}
@deffn {Class} importlib.abc.PathEntryFinder

An abstract base class representing a @ref{1277,,path entry finder}.  Though
it bears some similarities to @ref{a74,,MetaPathFinder}, @code{PathEntryFinder}
is meant for use only within the path-based import subsystem provided
by @ref{1229,,importlib.machinery.PathFinder}.


Added in version 3.3.



Changed in version 3.10: No longer a subclass of @code{Finder}.


@geindex find_spec() (importlib.abc.PathEntryFinder method)
@anchor{library/importlib importlib abc PathEntryFinder find_spec}@anchor{a72}
@deffn {Method} find_spec (fullname, target=None)

An abstract method for finding a @ref{23a7,,spec} for
the specified module.  The finder will search for the module only
within the @ref{249f,,path entry} to which it is assigned.  If a spec
cannot be found, @code{None} is returned.  When passed in, @code{target}
is a module object that the finder may use to make a more educated
guess about what spec to return. @ref{a73,,importlib.util.spec_from_loader()}
may be useful for implementing concrete @code{PathEntryFinders}.


Added in version 3.4.

@end deffn

@geindex invalidate_caches() (importlib.abc.PathEntryFinder method)
@anchor{library/importlib importlib abc PathEntryFinder invalidate_caches}@anchor{4e58}
@deffn {Method} invalidate_caches ()

An optional method which, when called, should invalidate any internal
cache used by the finder. Used by
@ref{e0f,,importlib.machinery.PathFinder.invalidate_caches()}
when invalidating the caches of all cached finders.
@end deffn
@end deffn

@geindex Loader (class in importlib.abc)
@anchor{library/importlib importlib abc Loader}@anchor{10cd}
@deffn {Class} importlib.abc.Loader

An abstract base class for a @ref{1a6f,,loader}.
See 
@geindex Python Enhancement Proposals; PEP 302
PEP 302@footnote{https://peps.python.org/pep-0302/} for the exact definition for a loader.

Loaders that wish to support resource reading should implement a
@code{get_resource_reader()} method as specified by
@ref{4e59,,importlib.resources.abc.ResourceReader}.


Changed in version 3.7: Introduced the optional @code{get_resource_reader()} method.


@geindex create_module() (importlib.abc.Loader method)
@anchor{library/importlib importlib abc Loader create_module}@anchor{eb2}
@deffn {Method} create_module (spec)

A method that returns the module object to use when
importing a module.  This method may return @code{None},
indicating that default module creation semantics should take place.


Added in version 3.4.



Changed in version 3.6: This method is no longer optional when
@ref{a70,,exec_module()} is defined.

@end deffn

@geindex exec_module() (importlib.abc.Loader method)
@anchor{library/importlib importlib abc Loader exec_module}@anchor{a70}
@deffn {Method} exec_module (module)

An abstract method that executes the module in its own namespace
when a module is imported or reloaded.  The module should already
be initialized when @code{exec_module()} is called.  When this method exists,
@ref{eb2,,create_module()} must be defined.


Added in version 3.4.



Changed in version 3.6: @ref{eb2,,create_module()} must also be defined.

@end deffn

@geindex load_module() (importlib.abc.Loader method)
@anchor{library/importlib importlib abc Loader load_module}@anchor{a6f}
@deffn {Method} load_module (fullname)

A legacy method for loading a module.  If the module cannot be
loaded, @ref{65b,,ImportError} is raised, otherwise the loaded module is
returned.

If the requested module already exists in @ref{1771,,sys.modules}, that
module should be used and reloaded.
Otherwise the loader should create a new module and insert it into
@code{sys.modules} before any loading begins, to prevent recursion
from the import.  If the loader inserted a module and the load fails, it
must be removed by the loader from @code{sys.modules}; modules already
in @code{sys.modules} before the loader began execution should be left
alone.

The loader should set several attributes on the module
(note that some of these attributes can change when a module is
reloaded):


@itemize -

@item 
@ref{1597,,module.__name__}

@item 
@ref{23ad,,module.__file__}

@item 
@ref{323,,module.__cached__} `(deprecated)'

@item 
@ref{2098,,module.__path__}

@item 
@ref{325,,module.__package__} `(deprecated)'

@item 
@ref{339,,module.__loader__} `(deprecated)'
@end itemize

When @ref{a70,,exec_module()} is available then backwards-compatible
functionality is provided.


Changed in version 3.4: Raise @ref{65b,,ImportError} when called instead of
@ref{369,,NotImplementedError}.  Functionality provided when
@ref{a70,,exec_module()} is available.



Deprecated since version 3.4, will be removed in version 3.15: The recommended API for loading a module is @ref{a70,,exec_module()}
(and @ref{eb2,,create_module()}).  Loaders should implement it instead of
@code{load_module()}.  The import machinery takes care of all the
other responsibilities of @code{load_module()} when
@code{exec_module()} is implemented.

@end deffn
@end deffn

@geindex ResourceLoader (class in importlib.abc)
@anchor{library/importlib importlib abc ResourceLoader}@anchor{de8}
@deffn {Class} importlib.abc.ResourceLoader

`Superseded by TraversableResources'

@quotation

An abstract base class for a @ref{1a6f,,loader} which implements the optional
@geindex Python Enhancement Proposals; PEP 302
PEP 302@footnote{https://peps.python.org/pep-0302/} protocol for loading arbitrary resources from the storage
back-end.


Deprecated since version 3.7: This ABC is deprecated in favour of supporting resource loading
through @ref{2fb,,importlib.resources.abc.TraversableResources}.
This class exists for backwards compatibility only with other ABCs in
this module.


@geindex get_data() (importlib.abc.ResourceLoader method)
@anchor{library/importlib importlib abc ResourceLoader get_data}@anchor{4e41}
@deffn {Method} abstractmethod get_data (path)

@quotation

An abstract method to return the bytes for the data located at `path'.
Loaders that have a file-like storage back-end
that allows storing arbitrary data
can implement this abstract method to give direct access
to the data stored. @ref{2c2,,OSError} is to be raised if the `path' cannot
be found. The `path' is expected to be constructed using a module’s
@ref{23ad,,__file__} attribute or an item from a package’s
@ref{2098,,__path__}.


Changed in version 3.4: Raises @ref{2c2,,OSError} instead of @ref{369,,NotImplementedError}.

@end quotation
@end deffn
@end quotation
@end deffn

@geindex InspectLoader (class in importlib.abc)
@anchor{library/importlib importlib abc InspectLoader}@anchor{115a}
@deffn {Class} importlib.abc.InspectLoader

An abstract base class for a @ref{1a6f,,loader} which implements the optional
@geindex Python Enhancement Proposals; PEP 302
PEP 302@footnote{https://peps.python.org/pep-0302/} protocol for loaders that inspect modules.

@geindex get_code() (importlib.abc.InspectLoader method)
@anchor{library/importlib importlib abc InspectLoader get_code}@anchor{115b}
@deffn {Method} get_code (fullname)

Return the code object for a module, or @code{None} if the module does not
have a code object (as would be the case, for example, for a built-in
module).  Raise an @ref{65b,,ImportError} if loader cannot find the
requested module.

@cartouche
@quotation Note 
While the method has a default implementation, it is suggested that
it be overridden if possible for performance.
@end quotation
@end cartouche

@geindex universal newlines; importlib.abc.InspectLoader.get_source method


Changed in version 3.4: No longer abstract and a concrete implementation is provided.

@end deffn

@geindex get_source() (importlib.abc.InspectLoader method)
@anchor{library/importlib importlib abc InspectLoader get_source}@anchor{115e}
@deffn {Method} abstractmethod get_source (fullname)

@quotation

An abstract method to return the source of a module. It is returned as
a text string using @ref{f3b,,universal newlines}, translating all
recognized line separators into @code{'\n'} characters.  Returns @code{None}
if no source is available (e.g. a built-in module). Raises
@ref{65b,,ImportError} if the loader cannot find the module specified.


Changed in version 3.4: Raises @ref{65b,,ImportError} instead of @ref{369,,NotImplementedError}.

@end quotation
@end deffn

@geindex is_package() (importlib.abc.InspectLoader method)
@anchor{library/importlib importlib abc InspectLoader is_package}@anchor{4e5a}
@deffn {Method} is_package (fullname)

An optional method to return a true value if the module is a package, a
false value otherwise. @ref{65b,,ImportError} is raised if the
@ref{1a6f,,loader} cannot find the module.


Changed in version 3.4: Raises @ref{65b,,ImportError} instead of @ref{369,,NotImplementedError}.

@end deffn

@geindex source_to_code() (importlib.abc.InspectLoader static method)
@anchor{library/importlib importlib abc InspectLoader source_to_code}@anchor{1018}
@deffn {Method} static source_to_code (data, path='<string>')

Create a code object from Python source.

The `data' argument can be whatever the @ref{4b2,,compile()} function
supports (i.e. string or bytes). The `path' argument should be
the “path” to where the source code originated from, which can be an
abstract concept (e.g. location in a zip file).

With the subsequent code object one can execute it in a module by
running @code{exec(code, module.__dict__)}.


Added in version 3.4.



Changed in version 3.5: Made the method static.

@end deffn

@geindex exec_module() (importlib.abc.InspectLoader method)
@anchor{library/importlib importlib abc InspectLoader exec_module}@anchor{1218}
@deffn {Method} exec_module (module)

Implementation of @ref{a70,,Loader.exec_module()}.


Added in version 3.4.

@end deffn

@geindex load_module() (importlib.abc.InspectLoader method)
@anchor{library/importlib importlib abc InspectLoader load_module}@anchor{4e5b}
@deffn {Method} load_module (fullname)

Implementation of @ref{a6f,,Loader.load_module()}.


Deprecated since version 3.4, will be removed in version 3.15: use @ref{1218,,exec_module()} instead.

@end deffn
@end deffn

@geindex ExecutionLoader (class in importlib.abc)
@anchor{library/importlib importlib abc ExecutionLoader}@anchor{4e5c}
@deffn {Class} importlib.abc.ExecutionLoader

An abstract base class which inherits from @ref{115a,,InspectLoader} that,
when implemented, helps a module to be executed as a script. The ABC
represents an optional 
@geindex Python Enhancement Proposals; PEP 302
PEP 302@footnote{https://peps.python.org/pep-0302/} protocol.

@geindex get_filename() (importlib.abc.ExecutionLoader method)
@anchor{library/importlib importlib abc ExecutionLoader get_filename}@anchor{4e5d}
@deffn {Method} abstractmethod get_filename (fullname)

@quotation

An abstract method that is to return the value of
@ref{23ad,,__file__} for the specified module. If no path is
available, @ref{65b,,ImportError} is raised.

If source code is available, then the method should return the path to
the source file, regardless of whether a bytecode was used to load the
module.


Changed in version 3.4: Raises @ref{65b,,ImportError} instead of @ref{369,,NotImplementedError}.

@end quotation
@end deffn
@end deffn

@geindex FileLoader (class in importlib.abc)
@anchor{library/importlib importlib abc FileLoader}@anchor{1279}
@deffn {Class} importlib.abc.FileLoader (fullname, path)

An abstract base class which inherits from @ref{de8,,ResourceLoader} and
@ref{4e5c,,ExecutionLoader}, providing concrete implementations of
@ref{4e41,,ResourceLoader.get_data()} and @ref{4e5d,,ExecutionLoader.get_filename()}.

The `fullname' argument is a fully resolved name of the module the loader is
to handle. The `path' argument is the path to the file for the module.


Added in version 3.3.


@geindex name (importlib.abc.FileLoader attribute)
@anchor{library/importlib importlib abc FileLoader name}@anchor{4e5e}
@deffn {Attribute} name

The name of the module the loader can handle.
@end deffn

@geindex path (importlib.abc.FileLoader attribute)
@anchor{library/importlib importlib abc FileLoader path}@anchor{4e5f}
@deffn {Attribute} path

Path to the file of the module.
@end deffn

@geindex load_module() (importlib.abc.FileLoader method)
@anchor{library/importlib importlib abc FileLoader load_module}@anchor{4e60}
@deffn {Method} load_module (fullname)

Calls super’s @code{load_module()}.


Deprecated since version 3.4, will be removed in version 3.15: Use @ref{a70,,Loader.exec_module()} instead.

@end deffn

@geindex get_filename() (importlib.abc.FileLoader method)
@anchor{library/importlib importlib abc FileLoader get_filename}@anchor{4e61}
@deffn {Method} abstractmethod get_filename (fullname)

Returns @ref{4e5f,,path}.
@end deffn

@geindex get_data() (importlib.abc.FileLoader method)
@anchor{library/importlib importlib abc FileLoader get_data}@anchor{4e42}
@deffn {Method} abstractmethod get_data (path)

Reads `path' as a binary file and returns the bytes from it.
@end deffn
@end deffn

@geindex SourceLoader (class in importlib.abc)
@anchor{library/importlib importlib abc SourceLoader}@anchor{4e62}
@deffn {Class} importlib.abc.SourceLoader

An abstract base class for implementing source (and optionally bytecode)
file loading. The class inherits from both @ref{de8,,ResourceLoader} and
@ref{4e5c,,ExecutionLoader}, requiring the implementation of:


@itemize *

@item 
@ref{4e41,,ResourceLoader.get_data()}

@item 

@table @asis

@item @ref{4e5d,,ExecutionLoader.get_filename()}

Should only return the path to the source file; sourceless
loading is not supported.
@end table
@end itemize

The abstract methods defined by this class are to add optional bytecode
file support. Not implementing these optional methods (or causing them to
raise @ref{369,,NotImplementedError}) causes the loader to
only work with source code. Implementing the methods allows the loader to
work with source `and' bytecode files; it does not allow for `sourceless'
loading where only bytecode is provided.  Bytecode files are an
optimization to speed up loading by removing the parsing step of Python’s
compiler, and so no bytecode-specific API is exposed.

@geindex path_stats() (importlib.abc.SourceLoader method)
@anchor{library/importlib importlib abc SourceLoader path_stats}@anchor{1396}
@deffn {Method} path_stats (path)

Optional abstract method which returns a @ref{184,,dict} containing
metadata about the specified path.  Supported dictionary keys are:


@itemize -

@item 
@code{'mtime'} (mandatory): an integer or floating-point number
representing the modification time of the source code;

@item 
@code{'size'} (optional): the size in bytes of the source code.
@end itemize

Any other keys in the dictionary are ignored, to allow for future
extensions. If the path cannot be handled, @ref{2c2,,OSError} is raised.


Added in version 3.3.



Changed in version 3.4: Raise @ref{2c2,,OSError} instead of @ref{369,,NotImplementedError}.

@end deffn

@geindex path_mtime() (importlib.abc.SourceLoader method)
@anchor{library/importlib importlib abc SourceLoader path_mtime}@anchor{1395}
@deffn {Method} path_mtime (path)

Optional abstract method which returns the modification time for the
specified path.


Deprecated since version 3.3: This method is deprecated in favour of @ref{1396,,path_stats()}.  You don’t
have to implement it, but it is still available for compatibility
purposes. Raise @ref{2c2,,OSError} if the path cannot be handled.



Changed in version 3.4: Raise @ref{2c2,,OSError} instead of @ref{369,,NotImplementedError}.

@end deffn

@geindex set_data() (importlib.abc.SourceLoader method)
@anchor{library/importlib importlib abc SourceLoader set_data}@anchor{4e63}
@deffn {Method} set_data (path, data)

Optional abstract method which writes the specified bytes to a file
path. Any intermediate directories which do not exist are to be created
automatically.

When writing to the path fails because the path is read-only
(@ref{2755,,errno.EACCES}/@ref{f44,,PermissionError}), do not propagate the
exception.


Changed in version 3.4: No longer raises @ref{369,,NotImplementedError} when called.

@end deffn

@geindex get_code() (importlib.abc.SourceLoader method)
@anchor{library/importlib importlib abc SourceLoader get_code}@anchor{4e64}
@deffn {Method} get_code (fullname)

Concrete implementation of @ref{115b,,InspectLoader.get_code()}.
@end deffn

@geindex exec_module() (importlib.abc.SourceLoader method)
@anchor{library/importlib importlib abc SourceLoader exec_module}@anchor{1219}
@deffn {Method} exec_module (module)

Concrete implementation of @ref{a70,,Loader.exec_module()}.


Added in version 3.4.

@end deffn

@geindex load_module() (importlib.abc.SourceLoader method)
@anchor{library/importlib importlib abc SourceLoader load_module}@anchor{4e65}
@deffn {Method} load_module (fullname)

Concrete implementation of @ref{a6f,,Loader.load_module()}.


Deprecated since version 3.4, will be removed in version 3.15: Use @ref{1219,,exec_module()} instead.

@end deffn

@geindex get_source() (importlib.abc.SourceLoader method)
@anchor{library/importlib importlib abc SourceLoader get_source}@anchor{1227}
@deffn {Method} get_source (fullname)

Concrete implementation of @ref{115e,,InspectLoader.get_source()}.
@end deffn

@geindex is_package() (importlib.abc.SourceLoader method)
@anchor{library/importlib importlib abc SourceLoader is_package}@anchor{4e66}
@deffn {Method} is_package (fullname)

Concrete implementation of @ref{4e5a,,InspectLoader.is_package()}. A module
is determined to be a package if its file path (as provided by
@ref{4e5d,,ExecutionLoader.get_filename()}) is a file named
@code{__init__} when the file extension is removed `and' the module name
itself does not end in @code{__init__}.
@end deffn
@end deffn

@node importlib machinery – Importers and path hooks,importlib util – Utility code for importers,importlib abc – Abstract base classes related to import,importlib — The implementation of import
@anchor{library/importlib importlib-machinery-importers-and-path-hooks}@anchor{4e67}@anchor{library/importlib module-importlib machinery}@anchor{7d}
@subsubsection @code{importlib.machinery} – Importers and path hooks


@geindex module; importlib.machinery

`Source code:' Lib/importlib/machinery.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/importlib/machinery.py}


__________________________________________________________________


This module contains the various objects that help @ref{7f9,,import}
find and load modules.

@geindex SOURCE_SUFFIXES (in module importlib.machinery)
@anchor{library/importlib importlib machinery SOURCE_SUFFIXES}@anchor{739}
@deffn {Data} importlib.machinery.SOURCE_SUFFIXES

A list of strings representing the recognized file suffixes for source
modules.


Added in version 3.3.

@end deffn

@geindex DEBUG_BYTECODE_SUFFIXES (in module importlib.machinery)
@anchor{library/importlib importlib machinery DEBUG_BYTECODE_SUFFIXES}@anchor{18f6}
@deffn {Data} importlib.machinery.DEBUG_BYTECODE_SUFFIXES

A list of strings representing the file suffixes for non-optimized bytecode
modules.


Added in version 3.3.



Deprecated since version 3.5: Use @ref{73b,,BYTECODE_SUFFIXES} instead.

@end deffn

@geindex OPTIMIZED_BYTECODE_SUFFIXES (in module importlib.machinery)
@anchor{library/importlib importlib machinery OPTIMIZED_BYTECODE_SUFFIXES}@anchor{18f7}
@deffn {Data} importlib.machinery.OPTIMIZED_BYTECODE_SUFFIXES

A list of strings representing the file suffixes for optimized bytecode
modules.


Added in version 3.3.



Deprecated since version 3.5: Use @ref{73b,,BYTECODE_SUFFIXES} instead.

@end deffn

@geindex BYTECODE_SUFFIXES (in module importlib.machinery)
@anchor{library/importlib importlib machinery BYTECODE_SUFFIXES}@anchor{73b}
@deffn {Data} importlib.machinery.BYTECODE_SUFFIXES

A list of strings representing the recognized file suffixes for bytecode
modules (including the leading dot).


Added in version 3.3.



Changed in version 3.5: The value is no longer dependent on @code{__debug__}.

@end deffn

@geindex EXTENSION_SUFFIXES (in module importlib.machinery)
@anchor{library/importlib importlib machinery EXTENSION_SUFFIXES}@anchor{73a}
@deffn {Data} importlib.machinery.EXTENSION_SUFFIXES

A list of strings representing the recognized file suffixes for
extension modules.


Added in version 3.3.

@end deffn

@geindex all_suffixes() (in module importlib.machinery)
@anchor{library/importlib importlib machinery all_suffixes}@anchor{4d79}
@deffn {Function} importlib.machinery.all_suffixes ()

Returns a combined list of strings representing all file suffixes for
modules recognized by the standard import machinery. This is a
helper for code which simply needs to know if a filesystem path
potentially refers to a module without needing any details on the kind
of module (for example, @ref{f3a,,inspect.getmodulename()}).


Added in version 3.3.

@end deffn

@geindex BuiltinImporter (class in importlib.machinery)
@anchor{library/importlib importlib machinery BuiltinImporter}@anchor{eb3}
@deffn {Class} importlib.machinery.BuiltinImporter

An @ref{2490,,importer} for built-in modules. All known built-in modules are
listed in @ref{208b,,sys.builtin_module_names}. This class implements the
@ref{a74,,importlib.abc.MetaPathFinder} and
@ref{115a,,importlib.abc.InspectLoader} ABCs.

Only class methods are defined by this class to alleviate the need for
instantiation.


Changed in version 3.5: As part of 
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}, the builtin importer now implements
@code{Loader.create_module()} and @code{Loader.exec_module()}

@end deffn

@geindex FrozenImporter (class in importlib.machinery)
@anchor{library/importlib importlib machinery FrozenImporter}@anchor{1225}
@deffn {Class} importlib.machinery.FrozenImporter

An @ref{2490,,importer} for frozen modules. This class implements the
@ref{a74,,importlib.abc.MetaPathFinder} and
@ref{115a,,importlib.abc.InspectLoader} ABCs.

Only class methods are defined by this class to alleviate the need for
instantiation.


Changed in version 3.4: Gained @code{create_module()} and @code{exec_module()}
methods.

@end deffn

@geindex WindowsRegistryFinder (class in importlib.machinery)
@anchor{library/importlib importlib machinery WindowsRegistryFinder}@anchor{f2c}
@deffn {Class} importlib.machinery.WindowsRegistryFinder

@ref{23ae,,Finder} for modules declared in the Windows registry.  This class
implements the @ref{a74,,importlib.abc.MetaPathFinder} ABC.

Only class methods are defined by this class to alleviate the need for
instantiation.


Added in version 3.3.



Deprecated since version 3.6: Use @ref{cc,,site} configuration instead. Future versions of Python may
not enable this finder by default.

@end deffn

@geindex PathFinder (class in importlib.machinery)
@anchor{library/importlib importlib machinery PathFinder}@anchor{1229}
@deffn {Class} importlib.machinery.PathFinder

A @ref{23ae,,Finder} for @ref{3e2,,sys.path} and package @code{__path__} attributes.
This class implements the @ref{a74,,importlib.abc.MetaPathFinder} ABC.

Only class methods are defined by this class to alleviate the need for
instantiation.

@geindex find_spec() (importlib.machinery.PathFinder class method)
@anchor{library/importlib importlib machinery PathFinder find_spec}@anchor{1217}
@deffn {Method} classmethod find_spec (fullname, path=None, target=None)

Class method that attempts to find a @ref{23a7,,spec}
for the module specified by `fullname' on @ref{3e2,,sys.path} or, if
defined, on `path'. For each path entry that is searched,
@ref{7fb,,sys.path_importer_cache} is checked. If a non-false object
is found then it is used as the @ref{1277,,path entry finder} to look
for the module being searched for. If no entry is found in
@code{sys.path_importer_cache}, then @ref{122a,,sys.path_hooks} is
searched for a finder for the path entry and, if found, is stored
in @code{sys.path_importer_cache} along with being queried about
the module. If no finder is ever found then @code{None} is both
stored in the cache and returned.


Added in version 3.4.



Changed in version 3.5: If the current working directory – represented by an empty string –
is no longer valid then @code{None} is returned but no value is cached
in @ref{7fb,,sys.path_importer_cache}.

@end deffn

@geindex invalidate_caches() (importlib.machinery.PathFinder class method)
@anchor{library/importlib importlib machinery PathFinder invalidate_caches}@anchor{e0f}
@deffn {Method} classmethod invalidate_caches ()

Calls @ref{4e58,,importlib.abc.PathEntryFinder.invalidate_caches()} on all
finders stored in @ref{7fb,,sys.path_importer_cache} that define the method.
Otherwise entries in @code{sys.path_importer_cache} set to @code{None} are
deleted.


Changed in version 3.7: Entries of @code{None} in @ref{7fb,,sys.path_importer_cache} are deleted.

@end deffn


Changed in version 3.4: Calls objects in @ref{122a,,sys.path_hooks} with the current working
directory for @code{'@w{'}} (i.e. the empty string).

@end deffn

@geindex FileFinder (class in importlib.machinery)
@anchor{library/importlib importlib machinery FileFinder}@anchor{1278}
@deffn {Class} importlib.machinery.FileFinder (path, *loader_details)

A concrete implementation of @ref{a75,,importlib.abc.PathEntryFinder} which
caches results from the file system.

The `path' argument is the directory for which the finder is in charge of
searching.

The `loader_details' argument is a variable number of 2-item tuples each
containing a loader and a sequence of file suffixes the loader recognizes.
The loaders are expected to be callables which accept two arguments of
the module’s name and the path to the file found.

The finder will cache the directory contents as necessary, making stat calls
for each module search to verify the cache is not outdated. Because cache
staleness relies upon the granularity of the operating system’s state
information of the file system, there is a potential race condition of
searching for a module, creating a new file, and then searching for the
module the new file represents. If the operations happen fast enough to fit
within the granularity of stat calls, then the module search will fail. To
prevent this from happening, when you create a module dynamically, make sure
to call @ref{e10,,importlib.invalidate_caches()}.


Added in version 3.3.


@geindex path (importlib.machinery.FileFinder attribute)
@anchor{library/importlib importlib machinery FileFinder path}@anchor{4e68}
@deffn {Attribute} path

The path the finder will search in.
@end deffn

@geindex find_spec() (importlib.machinery.FileFinder method)
@anchor{library/importlib importlib machinery FileFinder find_spec}@anchor{10cc}
@deffn {Method} find_spec (fullname, target=None)

Attempt to find the spec to handle `fullname' within @ref{4e68,,path}.


Added in version 3.4.

@end deffn

@geindex invalidate_caches() (importlib.machinery.FileFinder method)
@anchor{library/importlib importlib machinery FileFinder invalidate_caches}@anchor{4e69}
@deffn {Method} invalidate_caches ()

Clear out the internal cache.
@end deffn

@geindex path_hook() (importlib.machinery.FileFinder class method)
@anchor{library/importlib importlib machinery FileFinder path_hook}@anchor{4e6a}
@deffn {Method} classmethod path_hook (*loader_details)

A class method which returns a closure for use on @ref{122a,,sys.path_hooks}.
An instance of @code{FileFinder} is returned by the closure using the
path argument given to the closure directly and `loader_details'
indirectly.

If the argument to the closure is not an existing directory,
@ref{65b,,ImportError} is raised.
@end deffn
@end deffn

@geindex SourceFileLoader (class in importlib.machinery)
@anchor{library/importlib importlib machinery SourceFileLoader}@anchor{127a}
@deffn {Class} importlib.machinery.SourceFileLoader (fullname, path)

A concrete implementation of @ref{4e62,,importlib.abc.SourceLoader} by
subclassing @ref{1279,,importlib.abc.FileLoader} and providing some concrete
implementations of other methods.


Added in version 3.3.


@geindex name (importlib.machinery.SourceFileLoader attribute)
@anchor{library/importlib importlib machinery SourceFileLoader name}@anchor{4e6b}
@deffn {Attribute} name

The name of the module that this loader will handle.
@end deffn

@geindex path (importlib.machinery.SourceFileLoader attribute)
@anchor{library/importlib importlib machinery SourceFileLoader path}@anchor{4e6c}
@deffn {Attribute} path

The path to the source file.
@end deffn

@geindex is_package() (importlib.machinery.SourceFileLoader method)
@anchor{library/importlib importlib machinery SourceFileLoader is_package}@anchor{4e6d}
@deffn {Method} is_package (fullname)

Return @code{True} if @ref{4e6c,,path} appears to be for a package.
@end deffn

@geindex path_stats() (importlib.machinery.SourceFileLoader method)
@anchor{library/importlib importlib machinery SourceFileLoader path_stats}@anchor{4e6e}
@deffn {Method} path_stats (path)

Concrete implementation of @ref{1396,,importlib.abc.SourceLoader.path_stats()}.
@end deffn

@geindex set_data() (importlib.machinery.SourceFileLoader method)
@anchor{library/importlib importlib machinery SourceFileLoader set_data}@anchor{4e6f}
@deffn {Method} set_data (path, data)

Concrete implementation of @ref{4e63,,importlib.abc.SourceLoader.set_data()}.
@end deffn

@geindex load_module() (importlib.machinery.SourceFileLoader method)
@anchor{library/importlib importlib machinery SourceFileLoader load_module}@anchor{f2a}
@deffn {Method} load_module (name=None)

Concrete implementation of @ref{a6f,,importlib.abc.Loader.load_module()} where
specifying the name of the module to load is optional.


Deprecated since version 3.6, will be removed in version 3.15: Use @ref{a70,,importlib.abc.Loader.exec_module()} instead.

@end deffn
@end deffn

@geindex SourcelessFileLoader (class in importlib.machinery)
@anchor{library/importlib importlib machinery SourcelessFileLoader}@anchor{127b}
@deffn {Class} importlib.machinery.SourcelessFileLoader (fullname, path)

A concrete implementation of @ref{1279,,importlib.abc.FileLoader} which can
import bytecode files (i.e. no source code files exist).

Please note that direct use of bytecode files (and thus not source code
files) inhibits your modules from being usable by all Python
implementations or new versions of Python which change the bytecode
format.


Added in version 3.3.


@geindex name (importlib.machinery.SourcelessFileLoader attribute)
@anchor{library/importlib importlib machinery SourcelessFileLoader name}@anchor{4e70}
@deffn {Attribute} name

The name of the module the loader will handle.
@end deffn

@geindex path (importlib.machinery.SourcelessFileLoader attribute)
@anchor{library/importlib importlib machinery SourcelessFileLoader path}@anchor{4e71}
@deffn {Attribute} path

The path to the bytecode file.
@end deffn

@geindex is_package() (importlib.machinery.SourcelessFileLoader method)
@anchor{library/importlib importlib machinery SourcelessFileLoader is_package}@anchor{4e72}
@deffn {Method} is_package (fullname)

Determines if the module is a package based on @ref{4e71,,path}.
@end deffn

@geindex get_code() (importlib.machinery.SourcelessFileLoader method)
@anchor{library/importlib importlib machinery SourcelessFileLoader get_code}@anchor{4e73}
@deffn {Method} get_code (fullname)

Returns the code object for @ref{4e70,,name} created from @ref{4e71,,path}.
@end deffn

@geindex get_source() (importlib.machinery.SourcelessFileLoader method)
@anchor{library/importlib importlib machinery SourcelessFileLoader get_source}@anchor{4e74}
@deffn {Method} get_source (fullname)

Returns @code{None} as bytecode files have no source when this loader is
used.
@end deffn

@geindex load_module() (importlib.machinery.SourcelessFileLoader method)
@anchor{library/importlib importlib machinery SourcelessFileLoader load_module}@anchor{f2b}
@deffn {Method} load_module (name=None)
@end deffn

Concrete implementation of @ref{a6f,,importlib.abc.Loader.load_module()} where
specifying the name of the module to load is optional.


Deprecated since version 3.6, will be removed in version 3.15: Use @ref{a70,,importlib.abc.Loader.exec_module()} instead.

@end deffn

@geindex ExtensionFileLoader (class in importlib.machinery)
@anchor{library/importlib importlib machinery ExtensionFileLoader}@anchor{eb4}
@deffn {Class} importlib.machinery.ExtensionFileLoader (fullname, path)

A concrete implementation of @ref{4e5c,,importlib.abc.ExecutionLoader} for
extension modules.

The `fullname' argument specifies the name of the module the loader is to
support. The `path' argument is the path to the extension module’s file.

Note that, by default, importing an extension module will fail
in subinterpreters if it doesn’t implement multi-phase init
(see 
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}), even if it would otherwise import successfully.


Added in version 3.3.



Changed in version 3.12: Multi-phase init is now required for use in subinterpreters.


@geindex name (importlib.machinery.ExtensionFileLoader attribute)
@anchor{library/importlib importlib machinery ExtensionFileLoader name}@anchor{4e75}
@deffn {Attribute} name

Name of the module the loader supports.
@end deffn

@geindex path (importlib.machinery.ExtensionFileLoader attribute)
@anchor{library/importlib importlib machinery ExtensionFileLoader path}@anchor{4e76}
@deffn {Attribute} path

Path to the extension module.
@end deffn

@geindex create_module() (importlib.machinery.ExtensionFileLoader method)
@anchor{library/importlib importlib machinery ExtensionFileLoader create_module}@anchor{4e77}
@deffn {Method} create_module (spec)

Creates the module object from the given specification in accordance
with 
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}.


Added in version 3.5.

@end deffn

@geindex exec_module() (importlib.machinery.ExtensionFileLoader method)
@anchor{library/importlib importlib machinery ExtensionFileLoader exec_module}@anchor{4e78}
@deffn {Method} exec_module (module)

Initializes the given module object in accordance with 
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}.


Added in version 3.5.

@end deffn

@geindex is_package() (importlib.machinery.ExtensionFileLoader method)
@anchor{library/importlib importlib machinery ExtensionFileLoader is_package}@anchor{4e79}
@deffn {Method} is_package (fullname)

Returns @code{True} if the file path points to a package’s @code{__init__}
module based on @ref{73a,,EXTENSION_SUFFIXES}.
@end deffn

@geindex get_code() (importlib.machinery.ExtensionFileLoader method)
@anchor{library/importlib importlib machinery ExtensionFileLoader get_code}@anchor{4e7a}
@deffn {Method} get_code (fullname)

Returns @code{None} as extension modules lack a code object.
@end deffn

@geindex get_source() (importlib.machinery.ExtensionFileLoader method)
@anchor{library/importlib importlib machinery ExtensionFileLoader get_source}@anchor{4e7b}
@deffn {Method} get_source (fullname)

Returns @code{None} as extension modules do not have source code.
@end deffn

@geindex get_filename() (importlib.machinery.ExtensionFileLoader method)
@anchor{library/importlib importlib machinery ExtensionFileLoader get_filename}@anchor{115f}
@deffn {Method} get_filename (fullname)

Returns @ref{4e76,,path}.


Added in version 3.4.

@end deffn
@end deffn

@geindex NamespaceLoader (class in importlib.machinery)
@anchor{library/importlib importlib machinery NamespaceLoader}@anchor{115c}
@deffn {Class} importlib.machinery.NamespaceLoader (name, path, path_finder)

A concrete implementation of @ref{115a,,importlib.abc.InspectLoader} for
namespace packages.  This is an alias for a private class and is only made
public for introspecting the @code{__loader__} attribute on namespace
packages:

@example
>>> from importlib.machinery import NamespaceLoader
>>> import my_namespace
>>> isinstance(my_namespace.__loader__, NamespaceLoader)
True
>>> import importlib.abc
>>> isinstance(my_namespace.__loader__, importlib.abc.Loader)
True
@end example


Added in version 3.11.

@end deffn

@geindex ModuleSpec (class in importlib.machinery)
@anchor{library/importlib importlib machinery ModuleSpec}@anchor{22b0}
@deffn {Class} importlib.machinery.ModuleSpec (name, loader, *, origin=None, loader_state=None, is_package=None)

A specification for a module’s import-system-related state.  This is
typically exposed as the module’s @ref{23a8,,__spec__} attribute.  Many
of these attributes are also available directly on a module: for example,
@code{module.__spec__.origin == module.__file__}.  Note, however, that
while the `values' are usually equivalent, they can differ since there is
no synchronization between the two objects.  For example, it is possible to
update the module’s @ref{23ad,,__file__} at runtime and this will not be
automatically reflected in the module’s
@ref{4e7c,,__spec__.origin}, and vice versa.


Added in version 3.4.


@geindex name (importlib.machinery.ModuleSpec attribute)
@anchor{library/importlib importlib machinery ModuleSpec name}@anchor{23a9}
@deffn {Attribute} name

The module’s fully qualified name (see @ref{1597,,module.__name__}).
The @ref{23ae,,finder} should always set this attribute to a non-empty string.
@end deffn

@geindex loader (importlib.machinery.ModuleSpec attribute)
@anchor{library/importlib importlib machinery ModuleSpec loader}@anchor{33a}
@deffn {Attribute} loader

The @ref{1a6f,,loader} used to load the module (see @ref{339,,module.__loader__}).
The @ref{23ae,,finder} should always set this attribute.
@end deffn

@geindex origin (importlib.machinery.ModuleSpec attribute)
@anchor{library/importlib importlib machinery ModuleSpec origin}@anchor{4e7c}
@deffn {Attribute} origin

The location the @ref{1a6f,,loader} should use to load the module
(see @ref{23ad,,module.__file__}).
For example, for modules loaded from a @code{.py} file this is the filename.
The @ref{23ae,,finder} should always set this attribute to a meaningful value
for the loader to use.  In the uncommon case that there is not one
(like for namespace packages), it should be set to @code{None}.
@end deffn

@geindex submodule_search_locations (importlib.machinery.ModuleSpec attribute)
@anchor{library/importlib importlib machinery ModuleSpec submodule_search_locations}@anchor{23ac}
@deffn {Attribute} submodule_search_locations

A (possibly empty) @ref{717,,sequence} of strings enumerating the locations
in which a package’s submodules will be found
(see @ref{2098,,module.__path__}). Most of the time there will only be a
single directory in this list.

The @ref{23ae,,finder} should set this attribute to a sequence, even an empty
one, to indicate
to the import system that the module is a package.  It should be set to @code{None} for
non-package modules.  It is set automatically later to a special object for
namespace packages.
@end deffn

@geindex loader_state (importlib.machinery.ModuleSpec attribute)
@anchor{library/importlib importlib machinery ModuleSpec loader_state}@anchor{4e7d}
@deffn {Attribute} loader_state

The @ref{23ae,,finder} may set this attribute to an object containing additional,
module-specific data to use when loading the module.  Otherwise it should be
set to @code{None}.
@end deffn

@geindex cached (importlib.machinery.ModuleSpec attribute)
@anchor{library/importlib importlib machinery ModuleSpec cached}@anchor{324}
@deffn {Attribute} cached

The filename of a compiled version of the module’s code
(see @ref{323,,module.__cached__}).
The @ref{23ae,,finder} should always set this attribute but it may be @code{None}
for modules that do not need compiled code stored.
@end deffn

@geindex parent (importlib.machinery.ModuleSpec attribute)
@anchor{library/importlib importlib machinery ModuleSpec parent}@anchor{326}
@deffn {Attribute} parent

(Read-only) The fully qualified name of the package the module is in (or the
empty string for a top-level module).
See @ref{325,,module.__package__}.
If the module is a package then this is the same as @ref{23a9,,name}.
@end deffn

@geindex has_location (importlib.machinery.ModuleSpec attribute)
@anchor{library/importlib importlib machinery ModuleSpec has_location}@anchor{4e7e}
@deffn {Attribute} has_location

@code{True} if the spec’s @ref{4e7c,,origin} refers to a loadable location,
@code{False} otherwise.  This value impacts how @code{origin} is interpreted
and how the module’s @ref{23ad,,__file__} is populated.
@end deffn
@end deffn

@geindex AppleFrameworkLoader (class in importlib.machinery)
@anchor{library/importlib importlib machinery AppleFrameworkLoader}@anchor{22af}
@deffn {Class} importlib.machinery.AppleFrameworkLoader (name, path)

A specialization of @ref{eb4,,importlib.machinery.ExtensionFileLoader} that
is able to load extension modules in Framework format.

For compatibility with the iOS App Store, `all' binary modules in an iOS app
must be dynamic libraries, contained in a framework with appropriate
metadata, stored in the @code{Frameworks} folder of the packaged app. There can
be only a single binary per framework, and there can be no executable binary
material outside the Frameworks folder.

To accommodate this requirement, when running on iOS, extension module
binaries are `not' packaged as @code{.so} files on @code{sys.path}, but as
individual standalone frameworks. To discover those frameworks, this loader
is registered against the @code{.fwork} file extension, with a @code{.fwork}
file acting as a placeholder in the original location of the binary on
@code{sys.path}. The @code{.fwork} file contains the path of the actual binary in
the @code{Frameworks} folder, relative to the app bundle. To allow for
resolving a framework-packaged binary back to the original location, the
framework is expected to contain a @code{.origin} file that contains the
location of the @code{.fwork} file, relative to the app bundle.

For example, consider the case of an import @code{from foo.bar import _whiz},
where @code{_whiz} is implemented with the binary module
@code{sources/foo/bar/_whiz.abi3.so}, with @code{sources} being the location
registered on @code{sys.path}, relative to the application bundle. This module
`must' be distributed as
@code{Frameworks/foo.bar._whiz.framework/foo.bar._whiz} (creating the framework
name from the full import path of the module), with an @code{Info.plist} file
in the @code{.framework} directory identifying the binary as a framework. The
@code{foo.bar._whiz} module would be represented in the original location with
a @code{sources/foo/bar/_whiz.abi3.fwork} marker file, containing the path
@code{Frameworks/foo.bar._whiz/foo.bar._whiz}. The framework would also contain
@code{Frameworks/foo.bar._whiz.framework/foo.bar._whiz.origin}, containing the
path to the @code{.fwork} file.

When a module is loaded with this loader, the @code{__file__} for the module
will report as the location of the @code{.fwork} file. This allows code to use
the @code{__file__} of a  module as an anchor for file system traversal.
However, the spec origin will reference the location of the `actual' binary
in the @code{.framework} folder.

The Xcode project building the app is responsible for converting any @code{.so}
files from wherever they exist in the @code{PYTHONPATH} into frameworks in the
@code{Frameworks} folder (including stripping extensions from the module file,
the addition of framework metadata, and signing the resulting framework),
and creating the @code{.fwork} and @code{.origin} files. This will usually be done
with a build step in the Xcode project; see the iOS documentation for
details on how to construct this build step.


Added in version 3.13.


@ref{2181,,Availability}: iOS.

@geindex name (importlib.machinery.AppleFrameworkLoader attribute)
@anchor{library/importlib importlib machinery AppleFrameworkLoader name}@anchor{4e7f}
@deffn {Attribute} name

Name of the module the loader supports.
@end deffn

@geindex path (importlib.machinery.AppleFrameworkLoader attribute)
@anchor{library/importlib importlib machinery AppleFrameworkLoader path}@anchor{4e80}
@deffn {Attribute} path

Path to the @code{.fwork} file for the extension module.
@end deffn
@end deffn

@node importlib util – Utility code for importers,Examples<35>,importlib machinery – Importers and path hooks,importlib — The implementation of import
@anchor{library/importlib importlib-util-utility-code-for-importers}@anchor{4e81}@anchor{library/importlib module-importlib util}@anchor{81}
@subsubsection @code{importlib.util} – Utility code for importers


@geindex module; importlib.util

`Source code:' Lib/importlib/util.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/importlib/util.py}


__________________________________________________________________


This module contains the various objects that help in the construction of
an @ref{2490,,importer}.

@geindex MAGIC_NUMBER (in module importlib.util)
@anchor{library/importlib importlib util MAGIC_NUMBER}@anchor{738}
@deffn {Data} importlib.util.MAGIC_NUMBER

The bytes which represent the bytecode version number. If you need help with
loading/writing bytecode then consider @ref{4e62,,importlib.abc.SourceLoader}.


Added in version 3.4.

@end deffn

@geindex cache_from_source() (in module importlib.util)
@anchor{library/importlib importlib util cache_from_source}@anchor{351}
@deffn {Function} importlib.util.cache_from_source (path, debug_override=None, *, optimization=None)

Return the 
@geindex Python Enhancement Proposals; PEP 3147
PEP 3147@footnote{https://peps.python.org/pep-3147/}/
@geindex Python Enhancement Proposals; PEP 488
PEP 488@footnote{https://peps.python.org/pep-0488/} path to the byte-compiled file associated
with the source `path'.  For example, if `path' is @code{/foo/bar/baz.py} the return
value would be @code{/foo/bar/__pycache__/baz.cpython-32.pyc} for Python 3.2.
The @code{cpython-32} string comes from the current magic tag (see
@code{get_tag()}; if @code{sys.implementation.cache_tag} is not defined then
@ref{369,,NotImplementedError} will be raised).

The `optimization' parameter is used to specify the optimization level of the
bytecode file. An empty string represents no optimization, so
@code{/foo/bar/baz.py} with an `optimization' of @code{'@w{'}} will result in a
bytecode path of @code{/foo/bar/__pycache__/baz.cpython-32.pyc}. @code{None} causes
the interpreter’s optimization level to be used. Any other value’s string
representation is used, so @code{/foo/bar/baz.py} with an `optimization' of
@code{2} will lead to the bytecode path of
@code{/foo/bar/__pycache__/baz.cpython-32.opt-2.pyc}. The string representation
of `optimization' can only be alphanumeric, else @ref{2ee,,ValueError} is raised.

The `debug_override' parameter is deprecated and can be used to override
the system’s value for @code{__debug__}. A @code{True} value is the equivalent of
setting `optimization' to the empty string. A @code{False} value is the same as
setting `optimization' to @code{1}. If both `debug_override' an `optimization'
are not @code{None} then @ref{199,,TypeError} is raised.


Added in version 3.4.



Changed in version 3.5: The `optimization' parameter was added and the `debug_override' parameter
was deprecated.



Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.

@end deffn

@geindex source_from_cache() (in module importlib.util)
@anchor{library/importlib importlib util source_from_cache}@anchor{73f}
@deffn {Function} importlib.util.source_from_cache (path)

Given the `path' to a 
@geindex Python Enhancement Proposals; PEP 3147
PEP 3147@footnote{https://peps.python.org/pep-3147/} file name, return the associated source code
file path.  For example, if `path' is
@code{/foo/bar/__pycache__/baz.cpython-32.pyc} the returned path would be
@code{/foo/bar/baz.py}.  `path' need not exist, however if it does not conform
to 
@geindex Python Enhancement Proposals; PEP 3147
PEP 3147@footnote{https://peps.python.org/pep-3147/} or 
@geindex Python Enhancement Proposals; PEP 488
PEP 488@footnote{https://peps.python.org/pep-0488/} format, a @ref{2ee,,ValueError} is raised. If
@code{sys.implementation.cache_tag} is not defined,
@ref{369,,NotImplementedError} is raised.


Added in version 3.4.



Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.

@end deffn

@geindex decode_source() (in module importlib.util)
@anchor{library/importlib importlib util decode_source}@anchor{115d}
@deffn {Function} importlib.util.decode_source (source_bytes)

Decode the given bytes representing source code and return it as a string
with universal newlines (as required by
@ref{115e,,importlib.abc.InspectLoader.get_source()}).


Added in version 3.4.

@end deffn

@geindex resolve_name() (in module importlib.util)
@anchor{library/importlib importlib util resolve_name}@anchor{b0c}
@deffn {Function} importlib.util.resolve_name (name, package)

Resolve a relative module name to an absolute one.

If  `name' has no leading dots, then `name' is simply returned. This
allows for usage such as
@code{importlib.util.resolve_name('sys', __spec__.parent)} without doing a
check to see if the `package' argument is needed.

@ref{65b,,ImportError} is raised if `name' is a relative module name but
`package' is a false value (e.g. @code{None} or the empty string).
@code{ImportError} is also raised if a relative name would escape its
containing package (e.g. requesting @code{..bacon} from within the @code{spam}
package).


Added in version 3.3.



Changed in version 3.9: To improve consistency with import statements, raise
@ref{65b,,ImportError} instead of @ref{2ee,,ValueError} for invalid relative
import attempts.

@end deffn

@geindex find_spec() (in module importlib.util)
@anchor{library/importlib importlib util find_spec}@anchor{5af}
@deffn {Function} importlib.util.find_spec (name, package=None)

Find the @ref{23a7,,spec} for a module, optionally relative to
the specified `package' name. If the module is in @ref{1771,,sys.modules},
then @code{sys.modules[name].__spec__} is returned (unless the spec would be
@code{None} or is not set, in which case @ref{2ee,,ValueError} is raised).
Otherwise a search using @ref{f2d,,sys.meta_path} is done. @code{None} is
returned if no spec is found.

If `name' is for a submodule (contains a dot), the parent module is
automatically imported.

`name' and `package' work the same as for @code{import_module()}.


Added in version 3.4.



Changed in version 3.7: Raises @ref{d43,,ModuleNotFoundError} instead of @ref{5f0,,AttributeError} if
`package' is in fact not a package (i.e. lacks a
@ref{2098,,__path__} attribute).

@end deffn

@geindex module_from_spec() (in module importlib.util)
@anchor{library/importlib importlib util module_from_spec}@anchor{1019}
@deffn {Function} importlib.util.module_from_spec (spec)

Create a new module based on `spec' and
@ref{eb2,,spec.loader.create_module}.

If @ref{eb2,,spec.loader.create_module}
does not return @code{None}, then any pre-existing attributes will not be reset.
Also, no @ref{5f0,,AttributeError} will be raised if triggered while accessing
`spec' or setting an attribute on the module.

This function is preferred over using @ref{101a,,types.ModuleType} to create a
new module as `spec' is used to set as many import-controlled attributes on
the module as possible.


Added in version 3.5.

@end deffn

@geindex spec_from_loader() (in module importlib.util)
@anchor{library/importlib importlib util spec_from_loader}@anchor{a73}
@deffn {Function} importlib.util.spec_from_loader (name, loader, *, origin=None, is_package=None)

A factory function for creating a @ref{22b0,,ModuleSpec}
instance based on a loader.  The parameters have the same meaning as they do
for ModuleSpec.  The function uses available @ref{1a6f,,loader} APIs, such as
@code{InspectLoader.is_package()}, to fill in any missing
information on the spec.


Added in version 3.4.

@end deffn

@geindex spec_from_file_location() (in module importlib.util)
@anchor{library/importlib importlib util spec_from_file_location}@anchor{eb5}
@deffn {Function} importlib.util.spec_from_file_location (name, location, *, loader=None, submodule_search_locations=None)

A factory function for creating a @ref{22b0,,ModuleSpec}
instance based on the path to a file.  Missing information will be filled in
on the spec by making use of loader APIs and by the implication that the
module will be file-based.


Added in version 3.4.



Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.

@end deffn

@geindex source_hash() (in module importlib.util)
@anchor{library/importlib importlib util source_hash}@anchor{d44}
@deffn {Function} importlib.util.source_hash (source_bytes)

Return the hash of `source_bytes' as bytes. A hash-based @code{.pyc} file embeds
the @code{source_hash()} of the corresponding source file’s contents in its
header.


Added in version 3.7.

@end deffn

@geindex _incompatible_extension_module_restrictions() (in module importlib.util)
@anchor{library/importlib importlib util _incompatible_extension_module_restrictions}@anchor{4e82}
@deffn {Function} importlib.util._incompatible_extension_module_restrictions (*, disable_check)

A context manager that can temporarily skip the compatibility check
for extension modules.  By default the check is enabled and will fail
when a single-phase init module is imported in a subinterpreter.
It will also fail for a multi-phase init module that doesn’t
explicitly support a per-interpreter GIL, when imported
in an interpreter with its own GIL.

Note that this function is meant to accommodate an unusual case;
one which is likely to eventually go away.  There’s is a pretty good
chance this is not what you were looking for.

You can get the same effect as this function by implementing the
basic interface of multi-phase init (
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}) and lying about
support for multiple interpreters (or per-interpreter GIL).

@cartouche
@quotation Warning 
Using this function to disable the check can lead to
unexpected behavior and even crashes.  It should only be used during
extension module development.
@end quotation
@end cartouche


Added in version 3.12.

@end deffn

@geindex LazyLoader (class in importlib.util)
@anchor{library/importlib importlib util LazyLoader}@anchor{eb1}
@deffn {Class} importlib.util.LazyLoader (loader)

A class which postpones the execution of the loader of a module until the
module has an attribute accessed.

This class `only' works with loaders that define
@ref{a70,,exec_module()} as control over what module type
is used for the module is required. For those same reasons, the loader’s
@ref{eb2,,create_module()} method must return @code{None} or a
type for which its @code{__class__} attribute can be mutated along with not
using @ref{7f8,,slots}. Finally, modules which substitute the object
placed into @ref{1771,,sys.modules} will not work as there is no way to properly
replace the module references throughout the interpreter safely;
@ref{2ee,,ValueError} is raised if such a substitution is detected.

@cartouche
@quotation Note 
For projects where startup time is critical, this class allows for
potentially minimizing the cost of loading a module if it is never used.
For projects where startup time is not essential then use of this class is
`heavily' discouraged due to error messages created during loading being
postponed and thus occurring out of context.
@end quotation
@end cartouche


Added in version 3.5.



Changed in version 3.6: Began calling @ref{eb2,,create_module()}, removing the
compatibility warning for @ref{eb3,,importlib.machinery.BuiltinImporter} and
@ref{eb4,,importlib.machinery.ExtensionFileLoader}.


@geindex factory() (importlib.util.LazyLoader class method)
@anchor{library/importlib importlib util LazyLoader factory}@anchor{4e83}
@deffn {Method} classmethod factory (loader)

A class method which returns a callable that creates a lazy loader. This
is meant to be used in situations where the loader is passed by class
instead of by instance.

@example
suffixes = importlib.machinery.SOURCE_SUFFIXES
loader = importlib.machinery.SourceFileLoader
lazy_loader = importlib.util.LazyLoader.factory(loader)
finder = importlib.machinery.FileFinder(path, (lazy_loader, suffixes))
@end example
@end deffn
@end deffn

@node Examples<35>,,importlib util – Utility code for importers,importlib — The implementation of import
@anchor{library/importlib examples}@anchor{4e84}@anchor{library/importlib importlib-examples}@anchor{4e85}
@subsubsection Examples


@menu
* Importing programmatically:: 
* Checking if a module can be imported:: 
* Importing a source file directly:: 
* Implementing lazy imports:: 
* Setting up an importer:: 
* Approximating importlib.import_module(): Approximating importlib import_module. 

@end menu

@node Importing programmatically,Checking if a module can be imported,,Examples<35>
@anchor{library/importlib importing-programmatically}@anchor{4e86}
@subsubsection Importing programmatically


To programmatically import a module, use @ref{73d,,importlib.import_module()}.

@example
import importlib

itertools = importlib.import_module('itertools')
@end example

@node Checking if a module can be imported,Importing a source file directly,Importing programmatically,Examples<35>
@anchor{library/importlib checking-if-a-module-can-be-imported}@anchor{4e87}
@subsubsection Checking if a module can be imported


If you need to find out if a module can be imported without actually doing the
import, then you should use @ref{5af,,importlib.util.find_spec()}.

Note that if @code{name} is a submodule (contains a dot),
@ref{5af,,importlib.util.find_spec()} will import the parent module.

@example
import importlib.util
import sys

# For illustrative purposes.
name = 'itertools'

if name in sys.modules:
    print(f"@{name!r@} already in sys.modules")
elif (spec := importlib.util.find_spec(name)) is not None:
    # If you chose to perform the actual import ...
    module = importlib.util.module_from_spec(spec)
    sys.modules[name] = module
    spec.loader.exec_module(module)
    print(f"@{name!r@} has been imported")
else:
    print(f"can't find the @{name!r@} module")
@end example

@node Importing a source file directly,Implementing lazy imports,Checking if a module can be imported,Examples<35>
@anchor{library/importlib importing-a-source-file-directly}@anchor{4e88}
@subsubsection Importing a source file directly


This recipe should be used with caution: it is an approximation of an import
statement where the file path is specified directly, rather than
@ref{3e2,,sys.path} being searched. Alternatives should first be considered first,
such as modifying @code{sys.path} when a proper module is required, or using
@ref{4a5,,runpy.run_path()} when the global namespace resulting from running a Python
file is appropriate.

To import a Python source file directly from a path, use the following recipe:

@example
import importlib.util
import sys


def import_from_path(module_name, file_path):
    spec = importlib.util.spec_from_file_location(module_name, file_path)
    module = importlib.util.module_from_spec(spec)
    sys.modules[module_name] = module
    spec.loader.exec_module(module)
    return module


# For illustrative purposes only (use of `json` is arbitrary).
import json
file_path = json.__file__
module_name = json.__name__

# Similar outcome as `import json`.
json = import_from_path(module_name, file_path)
@end example

@node Implementing lazy imports,Setting up an importer,Importing a source file directly,Examples<35>
@anchor{library/importlib implementing-lazy-imports}@anchor{4e89}
@subsubsection Implementing lazy imports


The example below shows how to implement lazy imports:

@example
>>> import importlib.util
>>> import sys
>>> def lazy_import(name):
...     spec = importlib.util.find_spec(name)
...     loader = importlib.util.LazyLoader(spec.loader)
...     spec.loader = loader
...     module = importlib.util.module_from_spec(spec)
...     sys.modules[name] = module
...     loader.exec_module(module)
...     return module
...
>>> lazy_typing = lazy_import("typing")
>>> #lazy_typing is a real module object,
>>> #but it is not loaded in memory yet.
>>> lazy_typing.TYPE_CHECKING
False
@end example

@node Setting up an importer,Approximating importlib import_module,Implementing lazy imports,Examples<35>
@anchor{library/importlib setting-up-an-importer}@anchor{4e8a}
@subsubsection Setting up an importer


For deep customizations of import, you typically want to implement an
@ref{2490,,importer}. This means managing both the @ref{23ae,,finder} and @ref{1a6f,,loader}
side of things. For finders there are two flavours to choose from depending on
your needs: a @ref{1276,,meta path finder} or a @ref{1277,,path entry finder}. The
former is what you would put on @ref{f2d,,sys.meta_path} while the latter is what
you create using a @ref{24a1,,path entry hook} on @ref{122a,,sys.path_hooks} which works
with @ref{3e2,,sys.path} entries to potentially create a finder. This example will
show you how to register your own importers so that import will use them (for
creating an importer for yourself, read the documentation for the appropriate
classes defined within this package):

@example
import importlib.machinery
import sys

# For illustrative purposes only.
SpamMetaPathFinder = importlib.machinery.PathFinder
SpamPathEntryFinder = importlib.machinery.FileFinder
loader_details = (importlib.machinery.SourceFileLoader,
                  importlib.machinery.SOURCE_SUFFIXES)

# Setting up a meta path finder.
# Make sure to put the finder in the proper location in the list in terms of
# priority.
sys.meta_path.append(SpamMetaPathFinder)

# Setting up a path entry finder.
# Make sure to put the path hook in the proper location in the list in terms
# of priority.
sys.path_hooks.append(SpamPathEntryFinder.path_hook(loader_details))
@end example

@node Approximating importlib import_module,,Setting up an importer,Examples<35>
@anchor{library/importlib approximating-importlib-import-module}@anchor{4e8b}
@subsubsection Approximating @code{importlib.import_module()}


Import itself is implemented in Python code, making it possible to
expose most of the import machinery through importlib. The following
helps illustrate the various APIs that importlib exposes by providing an
approximate implementation of
@ref{73d,,importlib.import_module()}:

@example
import importlib.util
import sys

def import_module(name, package=None):
    """An approximate implementation of import."""
    absolute_name = importlib.util.resolve_name(name, package)
    try:
        return sys.modules[absolute_name]
    except KeyError:
        pass

    path = None
    if '.' in absolute_name:
        parent_name, _, child_name = absolute_name.rpartition('.')
        parent_module = import_module(parent_name)
        path = parent_module.__spec__.submodule_search_locations
    for finder in sys.meta_path:
        spec = finder.find_spec(absolute_name, path)
        if spec is not None:
            break
    else:
        msg = f'No module named @{absolute_name!r@}'
        raise ModuleNotFoundError(msg, name=absolute_name)
    module = importlib.util.module_from_spec(spec)
    sys.modules[absolute_name] = module
    spec.loader.exec_module(module)
    if path is not None:
        setattr(parent_module, child_name, module)
    return module
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node importlib resources – Package resource reading opening and access,importlib resources abc – Abstract base classes for resources,importlib — The implementation of import,Importing Modules
@anchor{library/importlib resources doc}@anchor{4e8c}@anchor{library/importlib resources importlib-resources-package-resource-reading-opening-and-access}@anchor{4e8d}@anchor{library/importlib resources module-importlib resources}@anchor{7f}@anchor{library/importlib resources translation-repo}@anchor{4e8e}
@subsection @code{importlib.resources} – Package resource reading, opening and access


@geindex module; importlib.resources

`Source code:' Lib/importlib/resources/__init__.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/importlib/resources/__init__.py}


__________________________________________________________________



Added in version 3.7.


This module leverages Python’s import system to provide access to `resources'
within `packages'.

“Resources” are file-like resources associated with a module or package in
Python. The resources may be contained directly in a package, within a
subdirectory contained in that package, or adjacent to modules outside a
package. Resources may be text or binary. As a result, a package’s Python
module sources (.py), compilation artifacts (pycache), and installation
artifacts (like @ref{329,,reserved filenames}
in directories) are technically de-facto resources of that package.
In practice, however, resources are primarily those non-Python artifacts
exposed specifically by the package author.

Resources can be opened or read in either binary or text mode.

Resources are roughly akin to files inside directories, though it’s important
to keep in mind that this is just a metaphor.  Resources and packages `do
not' have to exist as physical files and directories on the file system:
for example, a package and its resources can be imported from a zip file using
@ref{139,,zipimport}.

@cartouche
@quotation Warning 
@code{importlib.resources} follows the same security model as the built-in
@ref{318,,open()} function. Passing untrusted inputs to the functions
in this module is unsafe.
@end quotation
@end cartouche

@cartouche
@quotation Note 
The standalone backport of this module provides more information
on using importlib.resources@footnote{https://importlib-resources.readthedocs.io/en/latest/using.html} and
migrating from pkg_resources to importlib.resources@footnote{https://importlib-resources.readthedocs.io/en/latest/migration.html}.
@end quotation
@end cartouche

@ref{10cd,,Loaders} that wish to support resource reading should implement a
@code{get_resource_reader(fullname)} method as specified by
@ref{4e59,,importlib.resources.abc.ResourceReader}.

@geindex Anchor (class in importlib.resources)
@anchor{library/importlib resources importlib resources Anchor}@anchor{4e8f}
@deffn {Class} importlib.resources.Anchor

Represents an anchor for resources, either a @ref{101a,,module object} or a module name as a string. Defined as
@code{Union[str, ModuleType]}.
@end deffn

@geindex files() (in module importlib.resources)
@anchor{library/importlib resources importlib resources files}@anchor{6b7}
@deffn {Function} importlib.resources.files (anchor: Anchor | None = None)

Returns a @ref{2fc,,Traversable} object
representing the resource container (think directory) and its resources
(think files). A Traversable may contain other containers (think
subdirectories).

`anchor' is an optional @ref{4e8f,,Anchor}. If the anchor is a
package, resources are resolved from that package. If a module,
resources are resolved adjacent to that module (in the same package
or the package root). If the anchor is omitted, the caller’s module
is used.


Added in version 3.9.



Changed in version 3.12: `package' parameter was renamed to `anchor'. `anchor' can now
be a non-package module and if omitted will default to the caller’s
module. `package' is still accepted for compatibility but will raise
a @ref{1a4,,DeprecationWarning}. Consider passing the anchor positionally or
using @code{importlib_resources >= 5.10} for a compatible interface
on older Pythons.

@end deffn

@geindex as_file() (in module importlib.resources)
@anchor{library/importlib resources importlib resources as_file}@anchor{6b6}
@deffn {Function} importlib.resources.as_file (traversable)

Given a @ref{2fc,,Traversable} object representing
a file or directory, typically from @ref{6b7,,importlib.resources.files()},
return a context manager for use in a @ref{187,,with} statement.
The context manager provides a @ref{268,,pathlib.Path} object.

Exiting the context manager cleans up any temporary file or directory
created when the resource was extracted from e.g. a zip file.

Use @code{as_file} when the Traversable methods
(@code{read_text}, etc) are insufficient and an actual file or directory on
the file system is required.


Added in version 3.9.



Changed in version 3.12: Added support for `traversable' representing a directory.

@end deffn

@menu
* Functional API:: 

@end menu

@node Functional API,,,importlib resources – Package resource reading opening and access
@anchor{library/importlib resources functional-api}@anchor{4e90}@anchor{library/importlib resources importlib-resources-functional}@anchor{4e91}
@subsubsection Functional API


A set of simplified, backwards-compatible helpers is available.
These allow common operations in a single function call.

For all the following functions:


@itemize -

@item 
`anchor' is an @ref{4e8f,,Anchor},
as in @ref{6b7,,files()}.
Unlike in @code{files}, it may not be omitted.

@item 
`path_names' are components of a resource’s path name, relative to
the anchor.
For example, to get the text of resource named @code{info.txt}, use:

@example
importlib.resources.read_text(my_module, "info.txt")
@end example

Like @ref{2fc,,Traversable.joinpath},
The individual components should use forward slashes (@code{/})
as path separators.
For example, the following are equivalent:

@example
importlib.resources.read_binary(my_module, "pics/painting.png")
importlib.resources.read_binary(my_module, "pics", "painting.png")
@end example

For backward compatibility reasons, functions that read text require
an explicit `encoding' argument if multiple `path_names' are given.
For example, to get the text of @code{info/chapter1.txt}, use:

@example
importlib.resources.read_text(my_module, "info", "chapter1.txt",
                              encoding='utf-8')
@end example
@end itemize

@geindex open_binary() (in module importlib.resources)
@anchor{library/importlib resources importlib resources open_binary}@anchor{4ff}
@deffn {Function} importlib.resources.open_binary (anchor, *path_names)

Open the named resource for binary reading.

See @ref{4e91,,the introduction} for
details on `anchor' and `path_names'.

This function returns a @ref{23c,,BinaryIO} object,
that is, a binary stream open for reading.

This function is roughly equivalent to:

@example
files(anchor).joinpath(*path_names).open('rb')
@end example


Changed in version 3.13: Multiple `path_names' are accepted.

@end deffn

@geindex open_text() (in module importlib.resources)
@anchor{library/importlib resources importlib resources open_text}@anchor{500}
@deffn {Function} importlib.resources.open_text (anchor, *path_names, encoding='utf-8', errors='strict')

Open the named resource for text reading.
By default, the contents are read as strict UTF-8.

See @ref{4e91,,the introduction} for
details on `anchor' and `path_names'.
`encoding' and `errors' have the same meaning as in built-in @ref{318,,open()}.

For backward compatibility reasons, the `encoding' argument must be given
explicitly if there are multiple `path_names'.
This limitation is scheduled to be removed in Python 3.15.

This function returns a @ref{23b,,TextIO} object,
that is, a text stream open for reading.

This function is roughly equivalent to:

@example
files(anchor).joinpath(*path_names).open('r', encoding=encoding)
@end example


Changed in version 3.13: Multiple `path_names' are accepted.
`encoding' and `errors' must be given as keyword arguments.

@end deffn

@geindex read_binary() (in module importlib.resources)
@anchor{library/importlib resources importlib resources read_binary}@anchor{502}
@deffn {Function} importlib.resources.read_binary (anchor, *path_names)

Read and return the contents of the named resource as @ref{193,,bytes}.

See @ref{4e91,,the introduction} for
details on `anchor' and `path_names'.

This function is roughly equivalent to:

@example
files(anchor).joinpath(*path_names).read_bytes()
@end example


Changed in version 3.13: Multiple `path_names' are accepted.

@end deffn

@geindex read_text() (in module importlib.resources)
@anchor{library/importlib resources importlib resources read_text}@anchor{503}
@deffn {Function} importlib.resources.read_text (anchor, *path_names, encoding='utf-8', errors='strict')

Read and return the contents of the named resource as @ref{16a,,str}.
By default, the contents are read as strict UTF-8.

See @ref{4e91,,the introduction} for
details on `anchor' and `path_names'.
`encoding' and `errors' have the same meaning as in built-in @ref{318,,open()}.

For backward compatibility reasons, the `encoding' argument must be given
explicitly if there are multiple `path_names'.
This limitation is scheduled to be removed in Python 3.15.

This function is roughly equivalent to:

@example
files(anchor).joinpath(*path_names).read_text(encoding=encoding)
@end example


Changed in version 3.13: Multiple `path_names' are accepted.
`encoding' and `errors' must be given as keyword arguments.

@end deffn

@geindex path() (in module importlib.resources)
@anchor{library/importlib resources importlib resources path}@anchor{501}
@deffn {Function} importlib.resources.path (anchor, *path_names)

Provides the path to the `resource' as an actual file system path.  This
function returns a context manager for use in a @ref{187,,with} statement.
The context manager provides a @ref{268,,pathlib.Path} object.

Exiting the context manager cleans up any temporary files created, e.g.
when the resource needs to be extracted from a zip file.

For example, the @ref{a2a,,stat()} method requires
an actual file system path; it can be used like this:

@example
with importlib.resources.path(anchor, "resource.txt") as fspath:
    result = fspath.stat()
@end example

See @ref{4e91,,the introduction} for
details on `anchor' and `path_names'.

This function is roughly equivalent to:

@example
as_file(files(anchor).joinpath(*path_names))
@end example


Changed in version 3.13: Multiple `path_names' are accepted.

@end deffn

@geindex is_resource() (in module importlib.resources)
@anchor{library/importlib resources importlib resources is_resource}@anchor{4fe}
@deffn {Function} importlib.resources.is_resource (anchor, *path_names)

Return @code{True} if the named resource exists, otherwise @code{False}.
This function does not consider directories to be resources.

See @ref{4e91,,the introduction} for
details on `anchor' and `path_names'.

This function is roughly equivalent to:

@example
files(anchor).joinpath(*path_names).is_file()
@end example


Changed in version 3.13: Multiple `path_names' are accepted.

@end deffn

@geindex contents() (in module importlib.resources)
@anchor{library/importlib resources importlib resources contents}@anchor{504}
@deffn {Function} importlib.resources.contents (anchor, *path_names)

Return an iterable over the named items within the package or path.
The iterable returns names of resources (e.g. files) and non-resources
(e.g. directories) as @ref{16a,,str}.
The iterable does not recurse into subdirectories.

See @ref{4e91,,the introduction} for
details on `anchor' and `path_names'.

This function is roughly equivalent to:

@example
for resource in files(anchor).joinpath(*path_names).iterdir():
    yield resource.name
@end example


Deprecated since version 3.11: Prefer @code{iterdir()} as above, which offers more control over the
results and richer functionality.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node importlib resources abc – Abstract base classes for resources,importlib metadata – Accessing package metadata,importlib resources – Package resource reading opening and access,Importing Modules
@anchor{library/importlib resources abc doc}@anchor{4e92}@anchor{library/importlib resources abc importlib-resources-abc-abstract-base-classes-for-resources}@anchor{4e93}@anchor{library/importlib resources abc module-importlib resources abc}@anchor{80}@anchor{library/importlib resources abc translation-repo}@anchor{4e94}
@subsection @code{importlib.resources.abc} – Abstract base classes for resources


@geindex module; importlib.resources.abc

`Source code:' Lib/importlib/resources/abc.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/importlib/resources/abc.py}


__________________________________________________________________



Added in version 3.11.


@geindex ResourceReader (class in importlib.resources.abc)
@anchor{library/importlib resources abc importlib resources abc ResourceReader}@anchor{4e59}
@deffn {Class} importlib.resources.abc.ResourceReader

`Superseded by TraversableResources'

An @ref{13c2,,abstract base class} to provide the ability to read
`resources'.

From the perspective of this ABC, a `resource' is a binary
artifact that is shipped within a package. Typically this is
something like a data file that lives next to the @code{__init__.py}
file of the package. The purpose of this class is to help abstract
out the accessing of such data files so that it does not matter if
the package and its data file(s) are stored e.g. in a zip file
versus on the file system.

For any of methods of this class, a `resource' argument is
expected to be a @ref{5a1,,path-like object} which represents
conceptually just a file name. This means that no subdirectory
paths should be included in the `resource' argument. This is
because the location of the package the reader is for, acts as the
“directory”. Hence the metaphor for directories and file
names is packages and resources, respectively. This is also why
instances of this class are expected to directly correlate to
a specific package (instead of potentially representing multiple
packages or a module).

Loaders that wish to support resource reading are expected to
provide a method called @code{get_resource_reader(fullname)} which
returns an object implementing this ABC’s interface. If the module
specified by fullname is not a package, this method should return
@ref{887,,None}. An object compatible with this ABC should only be
returned when the specified module is a package.


Deprecated since version 3.12: Use @ref{2fb,,importlib.resources.abc.TraversableResources} instead.


@geindex open_resource() (importlib.resources.abc.ResourceReader method)
@anchor{library/importlib resources abc importlib resources abc ResourceReader open_resource}@anchor{4e95}
@deffn {Method} abstractmethod open_resource (resource)

Returns an opened, @ref{17fd,,file-like object} for binary reading
of the `resource'.

If the resource cannot be found, @ref{266,,FileNotFoundError} is
raised.
@end deffn

@geindex resource_path() (importlib.resources.abc.ResourceReader method)
@anchor{library/importlib resources abc importlib resources abc ResourceReader resource_path}@anchor{4e96}
@deffn {Method} abstractmethod resource_path (resource)

Returns the file system path to the `resource'.

If the resource does not concretely exist on the file system,
raise @ref{266,,FileNotFoundError}.
@end deffn

@geindex is_resource() (importlib.resources.abc.ResourceReader method)
@anchor{library/importlib resources abc importlib resources abc ResourceReader is_resource}@anchor{4e97}
@deffn {Method} abstractmethod is_resource (path)

Returns @code{True} if the named `path' is considered a resource.
@ref{266,,FileNotFoundError} is raised if `path' does not exist.


Changed in version 3.10: The argument `name' was renamed to `path'.

@end deffn

@geindex contents() (importlib.resources.abc.ResourceReader method)
@anchor{library/importlib resources abc importlib resources abc ResourceReader contents}@anchor{4e98}
@deffn {Method} abstractmethod contents ()

Returns an @ref{1433,,iterable} of strings over the contents of
the package. Do note that it is not required that all names
returned by the iterator be actual resources, e.g. it is
acceptable to return names for which @ref{4e97,,is_resource()} would
be false.

Allowing non-resource names to be returned is to allow for
situations where how a package and its resources are stored
are known a priori and the non-resource names would be useful.
For instance, returning subdirectory names is allowed so that
when it is known that the package and resources are stored on
the file system then those subdirectory names can be used
directly.

The abstract method returns an iterable of no items.
@end deffn
@end deffn

@geindex Traversable (class in importlib.resources.abc)
@anchor{library/importlib resources abc importlib resources abc Traversable}@anchor{2fc}
@deffn {Class} importlib.resources.abc.Traversable

An object with a subset of @ref{268,,pathlib.Path} methods suitable for
traversing directories and opening files.

For a representation of the object on the file-system, use
@ref{6b6,,importlib.resources.as_file()}.

@geindex name (importlib.resources.abc.Traversable attribute)
@anchor{library/importlib resources abc importlib resources abc Traversable name}@anchor{4e99}
@deffn {Attribute} name

Abstract. The base name of this object without any parent references.
@end deffn

@geindex iterdir() (importlib.resources.abc.Traversable method)
@anchor{library/importlib resources abc importlib resources abc Traversable iterdir}@anchor{4e9a}
@deffn {Method} abstractmethod iterdir ()

Yield Traversable objects in self.
@end deffn

@geindex is_dir() (importlib.resources.abc.Traversable method)
@anchor{library/importlib resources abc importlib resources abc Traversable is_dir}@anchor{4e9b}
@deffn {Method} abstractmethod is_dir ()

Return @code{True} if self is a directory.
@end deffn

@geindex is_file() (importlib.resources.abc.Traversable method)
@anchor{library/importlib resources abc importlib resources abc Traversable is_file}@anchor{4e9c}
@deffn {Method} abstractmethod is_file ()

Return @code{True} if self is a file.
@end deffn

@geindex joinpath() (importlib.resources.abc.Traversable method)
@anchor{library/importlib resources abc importlib resources abc Traversable joinpath}@anchor{4e9d}
@deffn {Method} abstractmethod joinpath (*pathsegments)

Traverse directories according to `pathsegments' and return
the result as @code{Traversable}.

Each `pathsegments' argument may contain multiple names separated by
forward slashes (@code{/}, @code{posixpath.sep} ).
For example, the following are equivalent:

@example
files.joinpath('subdir', 'subsuddir', 'file.txt')
files.joinpath('subdir/subsuddir/file.txt')
@end example

Note that some @code{Traversable} implementations
might not be updated to the latest version of the protocol.
For compatibility with such implementations, provide a single argument
without path separators to each call to @code{joinpath}. For example:

@example
files.joinpath('subdir').joinpath('subsubdir').joinpath('file.txt')
@end example


Changed in version 3.11: @code{joinpath} accepts multiple `pathsegments', and these segments
may contain forward slashes as path separators.
Previously, only a single `child' argument was accepted.

@end deffn

@geindex __truediv__() (importlib.resources.abc.Traversable method)
@anchor{library/importlib resources abc importlib resources abc Traversable __truediv__}@anchor{4e9e}
@deffn {Method} abstractmethod __truediv__ (child)

Return Traversable child in self.
Equivalent to @code{joinpath(child)}.
@end deffn

@geindex open() (importlib.resources.abc.Traversable method)
@anchor{library/importlib resources abc importlib resources abc Traversable open}@anchor{4e9f}
@deffn {Method} abstractmethod open (mode='r', *args, **kwargs)

`mode' may be ‘r’ or ‘rb’ to open as text or binary. Return a handle
suitable for reading (same as @ref{2cab,,pathlib.Path.open}).

When opening as text, accepts encoding parameters such as those
accepted by @ref{9c4,,io.TextIOWrapper}.
@end deffn

@geindex read_bytes() (importlib.resources.abc.Traversable method)
@anchor{library/importlib resources abc importlib resources abc Traversable read_bytes}@anchor{4ea0}
@deffn {Method} read_bytes ()

Read contents of self as bytes.
@end deffn

@geindex read_text() (importlib.resources.abc.Traversable method)
@anchor{library/importlib resources abc importlib resources abc Traversable read_text}@anchor{4ea1}
@deffn {Method} read_text (encoding=None)

Read contents of self as text.
@end deffn
@end deffn

@geindex TraversableResources (class in importlib.resources.abc)
@anchor{library/importlib resources abc importlib resources abc TraversableResources}@anchor{2fb}
@deffn {Class} importlib.resources.abc.TraversableResources

An abstract base class for resource readers capable of serving
the @ref{6b7,,importlib.resources.files()} interface. Subclasses
@ref{4e59,,ResourceReader} and provides
concrete implementations of the @code{ResourceReader}’s
abstract methods. Therefore, any loader supplying
@code{TraversableResources} also supplies @code{ResourceReader}.

Loaders that wish to support resource reading are expected to
implement this interface.

@geindex files() (importlib.resources.abc.TraversableResources method)
@anchor{library/importlib resources abc importlib resources abc TraversableResources files}@anchor{4ea2}
@deffn {Method} abstractmethod files ()

Returns a @ref{2fc,,importlib.resources.abc.Traversable} object for the loaded
package.
@end deffn
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node importlib metadata – Accessing package metadata,The initialization of the sys path module search path,importlib resources abc – Abstract base classes for resources,Importing Modules
@anchor{library/importlib metadata doc}@anchor{4ea3}@anchor{library/importlib metadata importlib-metadata-accessing-package-metadata}@anchor{4ea4}@anchor{library/importlib metadata module-importlib metadata}@anchor{7e}@anchor{library/importlib metadata translation-repo}@anchor{4ea5}@anchor{library/importlib metadata using}@anchor{4ea6}
@subsection @code{importlib.metadata} – Accessing package metadata


@geindex module; importlib.metadata


Added in version 3.8.



Changed in version 3.10: @code{importlib.metadata} is no longer provisional.


`Source code:' Lib/importlib/metadata/__init__.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/importlib/metadata/__init__.py}

@code{importlib.metadata} is a library that provides access to
the metadata of an installed Distribution Package@footnote{https://packaging.python.org/en/latest/glossary/#term-Distribution-Package},
such as its entry points
or its top-level names (Import Package@footnote{https://packaging.python.org/en/latest/glossary/#term-Import-Package}s, modules, if any).
Built in part on Python’s import system, this library
provides the entry point and metadata APIs that were previously
exposed by the now-removed @code{pkg_resources} package. Along with
@ref{7f,,importlib.resources}, it supersedes @code{pkg_resources}.

@code{importlib.metadata} operates on third-party `distribution packages'
installed into Python’s @code{site-packages} directory via tools such as
pip@footnote{https://pypi.org/project/pip/}.
Specifically, it works with distributions with discoverable
@code{dist-info} or @code{egg-info} directories,
and metadata defined by the Core metadata specifications@footnote{https://packaging.python.org/en/latest/specifications/core-metadata/#core-metadata}.

@cartouche
@quotation Important 
These are `not' necessarily equivalent to or correspond 1:1 with
the top-level `import package' names
that can be imported inside Python code.
One `distribution package' can contain multiple `import packages'
(and single modules),
and one top-level `import package'
may map to multiple `distribution packages'
if it is a namespace package.
You can use @ref{a17,,packages_distributions()}
to get a mapping between them.
@end quotation
@end cartouche

By default, distribution metadata can live on the file system
or in zip archives on
@ref{3e2,,sys.path}. Through an extension mechanism, the metadata can live almost
anywhere.


@subsubheading See also



@table @asis

@item @indicateurl{https://importlib-metadata.readthedocs.io/}

The documentation for @code{importlib_metadata}, which supplies a
backport of @code{importlib.metadata}.
This includes an API reference@footnote{https://importlib-metadata.readthedocs.io/en/latest/api.html}
for this module’s classes and functions,
as well as a migration guide@footnote{https://importlib-metadata.readthedocs.io/en/latest/migration.html}
for existing users of @code{pkg_resources}.
@end table


@menu
* Overview: Overview<3>. 
* Functional API: Functional API<2>. 
* Distributions:: 
* Distribution Discovery:: 
* Implementing Custom Providers:: 

@end menu

@node Overview<3>,Functional API<2>,,importlib metadata – Accessing package metadata
@anchor{library/importlib metadata overview}@anchor{4ea7}
@subsubsection Overview


Let’s say you wanted to get the version string for a
Distribution Package@footnote{https://packaging.python.org/en/latest/glossary/#term-Distribution-Package} you’ve installed
using @code{pip}. We start by creating a virtual environment and installing
something into it:

@example
$ python -m venv example
$ source example/bin/activate
(example) $ python -m pip install wheel
@end example

You can get the version string for @code{wheel} by running the following:

@example
(example) $ python
>>> from importlib.metadata import version
>>> version('wheel')
'0.32.3'
@end example

You can also get a collection of entry points selectable by properties of the EntryPoint (typically ‘group’ or ‘name’), such as
@code{console_scripts}, @code{distutils.commands} and others. Each group contains a
collection of @ref{589,,EntryPoint} objects.

You can get the @ref{4ea8,,metadata for a distribution}:

@example
>>> list(metadata('wheel'))
['Metadata-Version', 'Name', 'Version', 'Summary', 'Home-page', 'Author', 'Author-email', 'Maintainer', 'Maintainer-email', 'License', 'Project-URL', 'Project-URL', 'Project-URL', 'Keywords', 'Platform', 'Classifier', 'Classifier', 'Classifier', 'Classifier', 'Classifier', 'Classifier', 'Classifier', 'Classifier', 'Classifier', 'Classifier', 'Classifier', 'Classifier', 'Requires-Python', 'Provides-Extra', 'Requires-Dist', 'Requires-Dist']
@end example

You can also get a @ref{4ea9,,distribution’s version number}, list its
@ref{4eaa,,constituent files}, and get a list of the distribution’s
@ref{4eab,,Distribution requirements}.

@geindex PackageNotFoundError
@anchor{library/importlib metadata importlib metadata PackageNotFoundError}@anchor{4eac}
@deffn {Exception} importlib.metadata.PackageNotFoundError

Subclass of @ref{d43,,ModuleNotFoundError} raised by several functions in this
module when queried for a distribution package which is not installed in the
current Python environment.
@end deffn

@node Functional API<2>,Distributions,Overview<3>,importlib metadata – Accessing package metadata
@anchor{library/importlib metadata functional-api}@anchor{4ead}
@subsubsection Functional API


This package provides the following functionality via its public API.

@menu
* Entry points:: 
* Distribution metadata:: 
* Distribution versions:: 
* Distribution files:: 
* Distribution requirements:: 
* Mapping import to distribution packages:: 

@end menu

@node Entry points,Distribution metadata,,Functional API<2>
@anchor{library/importlib metadata entry-points}@anchor{589}@anchor{library/importlib metadata id2}@anchor{4eae}
@subsubsection Entry points


@geindex entry_points() (in module importlib.metadata)
@anchor{library/importlib metadata importlib metadata entry_points}@anchor{4eaf}
@deffn {Function} importlib.metadata.entry_points (**select_params)

Returns a @ref{4eb0,,EntryPoints} instance describing entry points for the
current environment. Any given keyword parameters are passed to the
@code{select()} method for comparison to the attributes of
the individual entry point definitions.

Note: it is not currently possible to query for entry points based on
their @code{EntryPoint.dist} attribute (as different @code{Distribution}
instances do not currently compare equal, even if they have the same attributes)
@end deffn

@geindex EntryPoints (class in importlib.metadata)
@anchor{library/importlib metadata importlib metadata EntryPoints}@anchor{4eb0}
@deffn {Class} importlib.metadata.EntryPoints

Details of a collection of installed entry points.

Also provides a @code{.groups} attribute that reports all identified entry
point groups, and a @code{.names} attribute that reports all identified entry
point names.
@end deffn

@geindex EntryPoint (class in importlib.metadata)
@anchor{library/importlib metadata importlib metadata EntryPoint}@anchor{4eb1}
@deffn {Class} importlib.metadata.EntryPoint

Details of an installed entry point.

Each @code{EntryPoint} instance has @code{.name}, @code{.group}, and @code{.value}
attributes and a @code{.load()} method to resolve the value. There are also
@code{.module}, @code{.attr}, and @code{.extras} attributes for getting the
components of the @code{.value} attribute, and @code{.dist} for obtaining
information regarding the distribution package that provides the entry point.
@end deffn

Query all entry points:

@example
>>> eps = entry_points()
@end example

The @code{entry_points()} function returns a @code{EntryPoints} object,
a collection of all @code{EntryPoint} objects with @code{names} and @code{groups}
attributes for convenience:

@example
>>> sorted(eps.groups)
['console_scripts', 'distutils.commands', 'distutils.setup_keywords', 'egg_info.writers', 'setuptools.installation']
@end example

@code{EntryPoints} has a @code{select()} method to select entry points
matching specific properties. Select entry points in the
@code{console_scripts} group:

@example
>>> scripts = eps.select(group='console_scripts')
@end example

Equivalently, since @code{entry_points()} passes keyword arguments
through to select:

@example
>>> scripts = entry_points(group='console_scripts')
@end example

Pick out a specific script named “wheel” (found in the wheel project):

@example
>>> 'wheel' in scripts.names
True
>>> wheel = scripts['wheel']
@end example

Equivalently, query for that entry point during selection:

@example
>>> (wheel,) = entry_points(group='console_scripts', name='wheel')
>>> (wheel,) = entry_points().select(group='console_scripts', name='wheel')
@end example

Inspect the resolved entry point:

@example
>>> wheel
EntryPoint(name='wheel', value='wheel.cli:main', group='console_scripts')
>>> wheel.module
'wheel.cli'
>>> wheel.attr
'main'
>>> wheel.extras
[]
>>> main = wheel.load()
>>> main
<function main at 0x103528488>
@end example

The @code{group} and @code{name} are arbitrary values defined by the package author
and usually a client will wish to resolve all entry points for a particular
group. Read the setuptools docs@footnote{https://setuptools.pypa.io/en/latest/userguide/entry_point.html}
for more information on entry points, their definition, and usage.


Changed in version 3.12: The “selectable” entry points were introduced in @code{importlib_metadata}
3.6 and Python 3.10. Prior to those changes, @code{entry_points} accepted
no parameters and always returned a dictionary of entry points, keyed
by group. With @code{importlib_metadata} 5.0 and Python 3.12,
@code{entry_points} always returns an @code{EntryPoints} object. See
backports.entry_points_selectable@footnote{https://pypi.org/project/backports.entry_points_selectable/}
for compatibility options.



Changed in version 3.13: @code{EntryPoint} objects no longer present a tuple-like interface
(@ref{588,,__getitem__()}).


@node Distribution metadata,Distribution versions,Entry points,Functional API<2>
@anchor{library/importlib metadata distribution-metadata}@anchor{4eb2}@anchor{library/importlib metadata metadata}@anchor{4ea8}
@subsubsection Distribution metadata


@geindex metadata() (in module importlib.metadata)
@anchor{library/importlib metadata importlib metadata metadata}@anchor{4eb3}
@deffn {Function} importlib.metadata.metadata (distribution_name)

Return the distribution metadata corresponding to the named
distribution package as a @ref{4eb4,,PackageMetadata} instance.

Raises @ref{4eac,,PackageNotFoundError} if the named distribution
package is not installed in the current Python environment.
@end deffn

@geindex PackageMetadata (class in importlib.metadata)
@anchor{library/importlib metadata importlib metadata PackageMetadata}@anchor{4eb4}
@deffn {Class} importlib.metadata.PackageMetadata

A concrete implementation of the
PackageMetadata protocol@footnote{https://importlib-metadata.readthedocs.io/en/latest/api.html#importlib_metadata.PackageMetadata}.

In addition to providing the defined protocol methods and attributes, subscripting
the instance is equivalent to calling the @code{get()} method.
@end deffn

Every Distribution Package@footnote{https://packaging.python.org/en/latest/glossary/#term-Distribution-Package}
includes some metadata, which you can extract using the @code{metadata()} function:

@example
>>> wheel_metadata = metadata('wheel')
@end example

The keys of the returned data structure name the metadata keywords, and
the values are returned unparsed from the distribution metadata:

@example
>>> wheel_metadata['Requires-Python']
'>=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*'
@end example

@ref{4eb4,,PackageMetadata} also presents a @code{json} attribute that returns
all the metadata in a JSON-compatible form per 
@geindex Python Enhancement Proposals; PEP 566
PEP 566@footnote{https://peps.python.org/pep-0566/}:

@example
>>> wheel_metadata.json['requires_python']
'>=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*'
@end example

The full set of available metadata is not described here.
See the PyPA Core metadata specification@footnote{https://packaging.python.org/en/latest/specifications/core-metadata/#core-metadata} for additional details.


Changed in version 3.10: The @code{Description} is now included in the metadata when presented
through the payload. Line continuation characters have been removed.

The @code{json} attribute was added.


@node Distribution versions,Distribution files,Distribution metadata,Functional API<2>
@anchor{library/importlib metadata distribution-versions}@anchor{4eb5}@anchor{library/importlib metadata version}@anchor{4ea9}
@subsubsection Distribution versions


@geindex version() (in module importlib.metadata)
@anchor{library/importlib metadata importlib metadata version}@anchor{19aa}
@deffn {Function} importlib.metadata.version (distribution_name)

Return the installed distribution package
version@footnote{https://packaging.python.org/en/latest/specifications/core-metadata/#version}
for the named distribution package.

Raises @ref{4eac,,PackageNotFoundError} if the named distribution
package is not installed in the current Python environment.
@end deffn

The @code{version()} function is the quickest way to get a
Distribution Package@footnote{https://packaging.python.org/en/latest/glossary/#term-Distribution-Package}’s version
number, as a string:

@example
>>> version('wheel')
'0.32.3'
@end example

@node Distribution files,Distribution requirements,Distribution versions,Functional API<2>
@anchor{library/importlib metadata distribution-files}@anchor{4eb6}@anchor{library/importlib metadata files}@anchor{4eaa}
@subsubsection Distribution files


@geindex files() (in module importlib.metadata)
@anchor{library/importlib metadata importlib metadata files}@anchor{4eb7}
@deffn {Function} importlib.metadata.files (distribution_name)

Return the full set of files contained within the named
distribution package.

Raises @ref{4eac,,PackageNotFoundError} if the named distribution
package is not installed in the current Python environment.

Returns @ref{887,,None} if the distribution is found but the installation
database records reporting the files associated with the distribution package
are missing.
@end deffn

@geindex PackagePath (class in importlib.metadata)
@anchor{library/importlib metadata importlib metadata PackagePath}@anchor{4eb8}
@deffn {Class} importlib.metadata.PackagePath

A @ref{6ce,,pathlib.PurePath} derived object with additional @code{dist},
@code{size}, and @code{hash} properties corresponding to the distribution
package’s installation metadata for that file.
@end deffn

The @code{files()} function takes a
Distribution Package@footnote{https://packaging.python.org/en/latest/glossary/#term-Distribution-Package}
name and returns all of the files installed by this distribution. Each file is reported
as a @ref{4eb8,,PackagePath} instance. For example:

@example
>>> util = [p for p in files('wheel') if 'util.py' in str(p)][0]
>>> util
PackagePath('wheel/util.py')
>>> util.size
859
>>> util.dist
<importlib.metadata._hooks.PathDistribution object at 0x101e0cef0>
>>> util.hash
<FileHash mode: sha256 value: bYkw5oMccfazVCoYQwKkkemoVyMAFoR34mmKBx8R1NI>
@end example

Once you have the file, you can also read its contents:

@example
>>> print(util.read_text())
import base64
import sys
...
def as_bytes(s):
    if isinstance(s, text_type):
        return s.encode('utf-8')
    return s
@end example

You can also use the @code{locate()} method to get the absolute
path to the file:

@example
>>> util.locate()
PosixPath('/home/gustav/example/lib/site-packages/wheel/util.py')
@end example

In the case where the metadata file listing files
(@code{RECORD} or @code{SOURCES.txt}) is missing, @code{files()} will
return @ref{887,,None}. The caller may wish to wrap calls to
@code{files()} in always_iterable@footnote{https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.always_iterable}
or otherwise guard against this condition if the target
distribution is not known to have the metadata present.

@node Distribution requirements,Mapping import to distribution packages,Distribution files,Functional API<2>
@anchor{library/importlib metadata distribution-requirements}@anchor{4eb9}@anchor{library/importlib metadata requirements}@anchor{4eab}
@subsubsection Distribution requirements


@geindex requires() (in module importlib.metadata)
@anchor{library/importlib metadata importlib metadata requires}@anchor{4eba}
@deffn {Function} importlib.metadata.requires (distribution_name)

Return the declared dependency specifiers for the named
distribution package.

Raises @ref{4eac,,PackageNotFoundError} if the named distribution
package is not installed in the current Python environment.
@end deffn

To get the full set of requirements for a Distribution Package@footnote{https://packaging.python.org/en/latest/glossary/#term-Distribution-Package},
use the @code{requires()}
function:

@example
>>> requires('wheel')
["pytest (>=3.0.0) ; extra == 'test'", "pytest-cov ; extra == 'test'"]
@end example
@anchor{library/importlib metadata package-distributions}@anchor{a17}
@node Mapping import to distribution packages,,Distribution requirements,Functional API<2>
@anchor{library/importlib metadata import-distribution-package-mapping}@anchor{4ebb}@anchor{library/importlib metadata mapping-import-to-distribution-packages}@anchor{4ebc}
@subsubsection Mapping import to distribution packages


@geindex packages_distributions() (in module importlib.metadata)
@anchor{library/importlib metadata importlib metadata packages_distributions}@anchor{4ebd}
@deffn {Function} importlib.metadata.packages_distributions ()

Return a mapping from the top level module and import package
names found via @ref{f2d,,sys.meta_path} to the names of the distribution
packages (if any) that provide the corresponding files.

To allow for namespace packages (which may have members provided by
multiple distribution packages), each top level import name maps to a
list of distribution names rather than mapping directly to a single name.
@end deffn

A convenience method to resolve the Distribution Package@footnote{https://packaging.python.org/en/latest/glossary/#term-Distribution-Package}
name (or names, in the case of a namespace package)
that provide each importable top-level
Python module or Import Package@footnote{https://packaging.python.org/en/latest/glossary/#term-Import-Package}:

@example
>>> packages_distributions()
@{'importlib_metadata': ['importlib-metadata'], 'yaml': ['PyYAML'], 'jaraco': ['jaraco.classes', 'jaraco.functools'], ...@}
@end example

Some editable installs, do not supply top-level names@footnote{https://github.com/pypa/packaging-problems/issues/609}, and thus this
function is not reliable with such installs.


Added in version 3.10.


@node Distributions,Distribution Discovery,Functional API<2>,importlib metadata – Accessing package metadata
@anchor{library/importlib metadata distributions}@anchor{a18}@anchor{library/importlib metadata id9}@anchor{4ebe}
@subsubsection Distributions


@geindex distribution() (in module importlib.metadata)
@anchor{library/importlib metadata importlib metadata distribution}@anchor{4ebf}
@deffn {Function} importlib.metadata.distribution (distribution_name)

Return a @ref{4ec0,,Distribution} instance describing the named
distribution package.

Raises @ref{4eac,,PackageNotFoundError} if the named distribution
package is not installed in the current Python environment.
@end deffn

@geindex Distribution (class in importlib.metadata)
@anchor{library/importlib metadata importlib metadata Distribution}@anchor{4ec0}
@deffn {Class} importlib.metadata.Distribution

Details of an installed distribution package.

Note: different @code{Distribution} instances do not currently compare
equal, even if they relate to the same installed distribution and
accordingly have the same attributes.
@end deffn

While the module level API described above is the most common and convenient usage,
you can get all of that information from the @code{Distribution} class.
@code{Distribution} is an abstract object that represents the metadata for
a Python Distribution Package@footnote{https://packaging.python.org/en/latest/glossary/#term-Distribution-Package}.
You can get the concrete @code{Distribution} subclass instance for an installed
distribution package by calling the @ref{4ebf,,distribution()} function:

@example
>>> from importlib.metadata import distribution
>>> dist = distribution('wheel')
>>> type(dist)
<class 'importlib.metadata.PathDistribution'>
@end example

Thus, an alternative way to get the version number is through the
@code{Distribution} instance:

@example
>>> dist.version
'0.32.3'
@end example

There are all kinds of additional metadata available on @code{Distribution}
instances:

@example
>>> dist.metadata['Requires-Python']
'>=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*'
>>> dist.metadata['License']
'MIT'
@end example

For editable packages, an @code{origin} property may present 
@geindex Python Enhancement Proposals; PEP 610
PEP 610@footnote{https://peps.python.org/pep-0610/}
metadata:

@example
>>> dist.origin.url
'file:///path/to/wheel-0.32.3.editable-py3-none-any.whl'
@end example

The full set of available metadata is not described here.
See the PyPA Core metadata specification@footnote{https://packaging.python.org/en/latest/specifications/core-metadata/#core-metadata} for additional details.


Added in version 3.13: The @code{.origin} property was added.


@node Distribution Discovery,Implementing Custom Providers,Distributions,importlib metadata – Accessing package metadata
@anchor{library/importlib metadata distribution-discovery}@anchor{4ec1}
@subsubsection Distribution Discovery


By default, this package provides built-in support for discovery of metadata
for file system and zip file Distribution Package@footnote{https://packaging.python.org/en/latest/glossary/#term-Distribution-Package}s.
This metadata finder search defaults to @code{sys.path}, but varies slightly in how it interprets those values from how other import machinery does. In particular:


@itemize -

@item 
@code{importlib.metadata} does not honor @ref{193,,bytes} objects on @code{sys.path}.

@item 
@code{importlib.metadata} will incidentally honor @ref{268,,pathlib.Path} objects on @code{sys.path} even though such values will be ignored for imports.
@end itemize

@node Implementing Custom Providers,,Distribution Discovery,importlib metadata – Accessing package metadata
@anchor{library/importlib metadata implementing-custom-providers}@anchor{4ec2}
@subsubsection Implementing Custom Providers


@code{importlib.metadata} address two API surfaces, one for `consumers'
and another for `providers'. Most users are consumers, consuming
metadata provided by the packages. There are other use-cases, however,
where users wish to expose metadata through some other mechanism,
such as alongside a custom importer. Such a use case calls for a
`custom provider'.

Because Distribution Package@footnote{https://packaging.python.org/en/latest/glossary/#term-Distribution-Package} metadata
is not available through @ref{3e2,,sys.path} searches, or
package loaders directly,
the metadata for a distribution is found through import
system @ref{248e,,finders}. To find a distribution package’s metadata,
@code{importlib.metadata} queries the list of @ref{1276,,meta path finders} on
@ref{f2d,,sys.meta_path}.

The implementation has hooks integrated into the @code{PathFinder},
serving metadata for distribution packages found on the file system.

The abstract class @ref{a74,,importlib.abc.MetaPathFinder} defines the
interface expected of finders by Python’s import system.
@code{importlib.metadata} extends this protocol by looking for an optional
@code{find_distributions} callable on the finders from
@ref{f2d,,sys.meta_path} and presents this extended interface as the
@code{DistributionFinder} abstract base class, which defines this abstract
method:

@example
@@abc.abstractmethod
def find_distributions(context=DistributionFinder.Context()) -> Iterable[Distribution]:
    """Return an iterable of all Distribution instances capable of
    loading the metadata for packages for the indicated `@w{`}context`@w{`}.
    """
@end example

The @code{DistributionFinder.Context} object provides @code{.path} and @code{.name}
properties indicating the path to search and name to match and may
supply other relevant context sought by the consumer.

In practice, to support finding distribution package
metadata in locations other than the file system, subclass
@code{Distribution} and implement the abstract methods. Then from
a custom finder, return instances of this derived @code{Distribution} in the
@code{find_distributions()} method.

@menu
* Example: Example<14>. 

@end menu

@node Example<14>,,,Implementing Custom Providers
@anchor{library/importlib metadata example}@anchor{4ec3}
@subsubsection Example


Imagine a custom finder that loads Python modules from a database:

@example
class DatabaseImporter(importlib.abc.MetaPathFinder):
    def __init__(self, db):
        self.db = db

    def find_spec(self, fullname, target=None) -> ModuleSpec:
        return self.db.spec_from_name(fullname)

sys.meta_path.append(DatabaseImporter(connect_db(...)))
@end example

That importer now presumably provides importable modules from a
database, but it provides no metadata or entry points. For this
custom importer to provide metadata, it would also need to implement
@code{DistributionFinder}:

@example
from importlib.metadata import DistributionFinder

class DatabaseImporter(DistributionFinder):
    ...

    def find_distributions(self, context=DistributionFinder.Context()):
        query = dict(name=context.name) if context.name else @{@}
        for dist_record in self.db.query_distributions(query):
            yield DatabaseDistribution(dist_record)
@end example

In this way, @code{query_distributions} would return records for
each distribution served by the database matching the query. For
example, if @code{requests-1.0} is in the database, @code{find_distributions}
would yield a @code{DatabaseDistribution} for @code{Context(name='requests')}
or @code{Context(name=None)}.

For the sake of simplicity, this example ignores @code{context.path}. The
@code{path} attribute defaults to @code{sys.path} and is the set of import paths to
be considered in the search. A @code{DatabaseImporter} could potentially function
without any concern for a search path. Assuming the importer does no
partitioning, the “path” would be irrelevant. In order to illustrate the
purpose of @code{path}, the example would need to illustrate a more complex
@code{DatabaseImporter} whose behavior varied depending on
@code{sys.path}/@code{PYTHONPATH}. In that case, the @code{find_distributions} should
honor the @code{context.path} and only yield @code{Distribution}s pertinent to that
path.

@code{DatabaseDistribution}, then, would look something like:

@example
class DatabaseDistribution(importlib.metadata.Distribution):
    def __init__(self, record):
        self.record = record

    def read_text(self, filename):
        """
        Read a file like "METADATA" for the current distribution.
        """
        if filename == "METADATA":
            return f"""Name: @{self.record.name@}
Version: @{self.record.version@}
"""
        if filename == "entry_points.txt":
            return "\n".join(
              f"""[@{ep.group@}]\n@{ep.name@}=@{ep.value@}"""
              for ep in self.record.entry_points)

    def locate_file(self, path):
        raise RuntimeError("This distribution has no file system")
@end example

This basic implementation should provide metadata and entry points for
packages served by the @code{DatabaseImporter}, assuming that the
@code{record} supplies suitable @code{.name}, @code{.version}, and
@code{.entry_points} attributes.

The @code{DatabaseDistribution} may also provide other metadata files, like
@code{RECORD} (required for @code{Distribution.files}) or override the
implementation of @code{Distribution.files}. See the source for more inspiration.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node The initialization of the sys path module search path,,importlib metadata – Accessing package metadata,Importing Modules
@anchor{library/sys_path_init doc}@anchor{4ec4}@anchor{library/sys_path_init sys-path-init}@anchor{1922}@anchor{library/sys_path_init the-initialization-of-the-sys-path-module-search-path}@anchor{4ec5}@anchor{library/sys_path_init translation-repo}@anchor{4ec6}
@subsection The initialization of the @code{sys.path} module search path


A module search path is initialized when Python starts. This module search path
may be accessed at @ref{3e2,,sys.path}.

The first entry in the module search path is the directory that contains the
input script, if there is one. Otherwise, the first entry is the current
directory, which is the case when executing the interactive shell, a @ref{1a9,,-c}
command, or @ref{23e,,-m} module.

The 
@geindex PYTHONPATH
@geindex environment variable; PYTHONPATH
@ref{1223,,PYTHONPATH} environment variable is often used to add directories
to the search path. If this environment variable is found then the contents are
added to the module search path.

@cartouche
@quotation Note 
@geindex PYTHONPATH
@geindex environment variable; PYTHONPATH
@ref{1223,,PYTHONPATH} will affect all installed Python versions/environments.
Be wary of setting this in your shell profile or global environment variables.
The @ref{cc,,site} module offers more nuanced techniques as mentioned below.
@end quotation
@end cartouche

The next items added are the directories containing standard Python modules as
well as any @ref{2295,,extension module}s that these modules depend on. Extension
modules are @code{.pyd} files on Windows and @code{.so} files on other platforms. The
directory with the platform-independent Python modules is called @code{prefix}.
The directory with the extension modules is called @code{exec_prefix}.

The 
@geindex PYTHONHOME
@geindex environment variable; PYTHONHOME
@ref{3ee,,PYTHONHOME} environment variable may be used to set the @code{prefix}
and @code{exec_prefix} locations. Otherwise these directories are found by using
the Python executable as a starting point and then looking for various ‘landmark’
files and directories. Note that any symbolic links are followed so the real
Python executable location is used as the search starting point. The Python
executable location is called @code{home}.

Once @code{home} is determined, the @code{prefix} directory is found by first looking
for @code{python`majorversion'`minorversion'.zip} (@code{python311.zip}). On Windows
the zip archive is searched for in @code{home} and on Unix the archive is expected
to be in @code{lib}. Note that the expected zip archive location is added to the
module search path even if the archive does not exist. If no archive was found,
Python on Windows will continue the search for @code{prefix} by looking for @code{Lib\os.py}.
Python on Unix will look for @code{lib/python`majorversion'.`minorversion'/os.py}
(@code{lib/python3.11/os.py}). On Windows @code{prefix} and @code{exec_prefix} are the same,
however on other platforms @code{lib/python`majorversion'.`minorversion'/lib-dynload}
(@code{lib/python3.11/lib-dynload}) is searched for and used as an anchor for
@code{exec_prefix}. On some platforms @code{lib} may be @code{lib64} or another value,
see @ref{b38,,sys.platlibdir} and 
@geindex PYTHONPLATLIBDIR
@geindex environment variable; PYTHONPLATLIBDIR
@ref{1d67,,PYTHONPLATLIBDIR}.

Once found, @code{prefix} and @code{exec_prefix} are available at
@ref{3e4,,sys.base_prefix} and @ref{3e8,,sys.base_exec_prefix} respectively.

If 
@geindex PYTHONHOME
@geindex environment variable; PYTHONHOME
@ref{3ee,,PYTHONHOME} is not set, and a @code{pyvenv.cfg} file is found alongside
the main executable, or in its parent directory, @ref{3e5,,sys.prefix} and
@ref{3e9,,sys.exec_prefix} get set to the directory containing @code{pyvenv.cfg},
otherwise they are set to the same value as @ref{3e4,,sys.base_prefix} and
@ref{3e8,,sys.base_exec_prefix}, respectively.
This is used by @ref{4c13,,Virtual Environments}.

Finally, the @ref{cc,,site} module is processed and @code{site-packages} directories
are added to the module search path. A common way to customize the search path is
to create @ref{cd,,sitecustomize} or @ref{115,,usercustomize} modules as described in
the @code{site} module documentation.

@cartouche
@quotation Note 
Certain command line options may further affect path calculations.
See @ref{b5c,,-E}, @ref{b5d,,-I}, @ref{159a,,-s} and @ref{13b4,,-S} for further details.
@end quotation
@end cartouche


Changed in version 3.14: @ref{3e5,,sys.prefix} and @ref{3e9,,sys.exec_prefix} are now set to the
@code{pyvenv.cfg} directory during the path initialization. This was previously
done by @ref{cc,,site}, therefore affected by @ref{13b4,,-S}.


@menu
* Virtual Environments:: 
* _pth files:: 
* Embedded Python:: 

@end menu

@node Virtual Environments,_pth files,,The initialization of the sys path module search path
@anchor{library/sys_path_init sys-path-init-virtual-environments}@anchor{4c13}@anchor{library/sys_path_init virtual-environments}@anchor{4ec7}
@subsubsection Virtual Environments


Virtual environments place a @code{pyvenv.cfg} file in their prefix, which causes
@ref{3e5,,sys.prefix} and @ref{3e9,,sys.exec_prefix} to point to them, instead of the
base installation.

The @code{prefix} and @code{exec_prefix} values of the base installation are available
at @ref{3e4,,sys.base_prefix} and @ref{3e8,,sys.base_exec_prefix}.

As well as being used as a marker to identify virtual environments,
@code{pyvenv.cfg} may also be used to configure the @ref{cc,,site} initialization.
Please refer to @code{site}’s
@ref{4c14,,virtual environments documentation}.

@cartouche
@quotation Note 
@geindex PYTHONHOME
@geindex environment variable; PYTHONHOME
@ref{3ee,,PYTHONHOME} overrides the @code{pyvenv.cfg} detection.
@end quotation
@end cartouche

@cartouche
@quotation Note 
There are other ways how “virtual environments” could be implemented, this
documentation refers implementations based on the @code{pyvenv.cfg} mechanism,
such as @ref{118,,venv}. Most virtual environment implementations follow the
model set by @code{venv}, but there may be exotic implementations that
diverge from it.
@end quotation
@end cartouche

@node _pth files,Embedded Python,Virtual Environments,The initialization of the sys path module search path
@anchor{library/sys_path_init pth-files}@anchor{4ec8}
@subsubsection _pth files


To completely override @ref{3e2,,sys.path} create a @code{._pth} file with the same
name as the shared library or executable (@code{python._pth} or @code{python311._pth}).
The shared library path is always known on Windows, however it may not be
available on other platforms. In the @code{._pth} file specify one line for each path
to add to @code{sys.path}. The file based on the shared library name overrides
the one based on the executable, which allows paths to be restricted for any
program loading the runtime if desired.

When the file exists, all registry and environment variables are ignored,
isolated mode is enabled, and @ref{cc,,site} is not imported unless one line in the
file specifies @code{import site}. Blank paths and lines starting with @code{#} are
ignored. Each path may be absolute or relative to the location of the file.
Import statements other than to @code{site} are not permitted, and arbitrary code
cannot be specified.

Note that @code{.pth} files (without leading underscore) will be processed normally
by the @ref{cc,,site} module when @code{import site} has been specified.

@node Embedded Python,,_pth files,The initialization of the sys path module search path
@anchor{library/sys_path_init embedded-python}@anchor{4ec9}
@subsubsection Embedded Python


If Python is embedded within another application @ref{3f4,,Py_InitializeFromConfig()} and
the @ref{3f5,,PyConfig} structure can be used to initialize Python. The path specific
details are described at @ref{ab0,,Python Path Configuration}.


@subsubheading See also



@itemize *

@item 
@ref{e20,,Finding modules} for detailed Windows notes.

@item 
@ref{2186,,Using Python on Unix platforms} for Unix details.
@end itemize


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Python Language Services,MS Windows Specific Services,Importing Modules,The Python Standard Library
@anchor{library/language doc}@anchor{4eca}@anchor{library/language language}@anchor{4ecb}@anchor{library/language python-language-services}@anchor{4ecc}@anchor{library/language translation-repo}@anchor{4ecd}
@section Python Language Services


Python provides a number of modules to assist in working with the Python
language.  These modules support tokenizing, parsing, syntax analysis, bytecode
disassembly, and various other facilities.

These modules include:

@menu
* ast — Abstract syntax trees:: 
* symtable — Access to the compiler’s symbol tables:: 
* token — Constants used with Python parse trees:: 
* keyword — Testing for Python keywords:: 
* tokenize — Tokenizer for Python source:: 
* tabnanny — Detection of ambiguous indentation:: 
* pyclbr — Python module browser support:: 
* py_compile — Compile Python source files:: 
* compileall — Byte-compile Python libraries:: 
* dis — Disassembler for Python bytecode:: 
* pickletools — Tools for pickle developers:: 

@end menu

@node ast — Abstract syntax trees,symtable — Access to the compiler’s symbol tables,,Python Language Services
@anchor{library/ast doc}@anchor{4ece}@anchor{library/ast ast-abstract-syntax-trees}@anchor{4ecf}@anchor{library/ast module-ast}@anchor{9}
@subsection @code{ast} — Abstract syntax trees


@geindex module; ast

@c import ast

`Source code:' Lib/ast.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/ast.py}


__________________________________________________________________


The @code{ast} module helps Python applications to process trees of the Python
abstract syntax grammar.  The abstract syntax itself might change with each
Python release; this module helps to find out programmatically what the current
grammar looks like.

An abstract syntax tree can be generated by passing @ref{4ed0,,ast.PyCF_ONLY_AST} as
a flag to the @ref{4b2,,compile()} built-in function, or using the @ref{1c4,,parse()}
helper provided in this module.  The result will be a tree of objects whose
classes all inherit from @ref{4c4,,ast.AST}.  An abstract syntax tree can be
compiled into a Python code object using the built-in @code{compile()} function.

@menu
* Abstract grammar:: 
* Node classes:: 
* ast helpers:: 
* Compiler flags: Compiler flags<2>. 
* Command-line usage: Command-line usage<7>. 

@end menu

@node Abstract grammar,Node classes,,ast — Abstract syntax trees
@anchor{library/ast abstract-grammar}@anchor{4ed1}@anchor{library/ast id1}@anchor{4ed2}
@subsubsection Abstract grammar


The abstract grammar is currently defined as follows:

@example
-- ASDL's 4 builtin types are:
-- identifier, int, string, constant

module Python
@{
    mod = Module(stmt* body, type_ignore* type_ignores)
        | Interactive(stmt* body)
        | Expression(expr body)
        | FunctionType(expr* argtypes, expr returns)

    stmt = FunctionDef(identifier name, arguments args,
                       stmt* body, expr* decorator_list, expr? returns,
                       string? type_comment, type_param* type_params)
          | AsyncFunctionDef(identifier name, arguments args,
                             stmt* body, expr* decorator_list, expr? returns,
                             string? type_comment, type_param* type_params)

          | ClassDef(identifier name,
             expr* bases,
             keyword* keywords,
             stmt* body,
             expr* decorator_list,
             type_param* type_params)
          | Return(expr? value)

          | Delete(expr* targets)
          | Assign(expr* targets, expr value, string? type_comment)
          | TypeAlias(expr name, type_param* type_params, expr value)
          | AugAssign(expr target, operator op, expr value)
          -- 'simple' indicates that we annotate simple name without parens
          | AnnAssign(expr target, expr annotation, expr? value, int simple)

          -- use 'orelse' because else is a keyword in target languages
          | For(expr target, expr iter, stmt* body, stmt* orelse, string? type_comment)
          | AsyncFor(expr target, expr iter, stmt* body, stmt* orelse, string? type_comment)
          | While(expr test, stmt* body, stmt* orelse)
          | If(expr test, stmt* body, stmt* orelse)
          | With(withitem* items, stmt* body, string? type_comment)
          | AsyncWith(withitem* items, stmt* body, string? type_comment)

          | Match(expr subject, match_case* cases)

          | Raise(expr? exc, expr? cause)
          | Try(stmt* body, excepthandler* handlers, stmt* orelse, stmt* finalbody)
          | TryStar(stmt* body, excepthandler* handlers, stmt* orelse, stmt* finalbody)
          | Assert(expr test, expr? msg)

          | Import(alias* names)
          | ImportFrom(identifier? module, alias* names, int? level)

          | Global(identifier* names)
          | Nonlocal(identifier* names)
          | Expr(expr value)
          | Pass | Break | Continue

          -- col_offset is the byte offset in the utf8 string the parser uses
          attributes (int lineno, int col_offset, int? end_lineno, int? end_col_offset)

          -- BoolOp() can use left & right?
    expr = BoolOp(boolop op, expr* values)
         | NamedExpr(expr target, expr value)
         | BinOp(expr left, operator op, expr right)
         | UnaryOp(unaryop op, expr operand)
         | Lambda(arguments args, expr body)
         | IfExp(expr test, expr body, expr orelse)
         | Dict(expr?* keys, expr* values)
         | Set(expr* elts)
         | ListComp(expr elt, comprehension* generators)
         | SetComp(expr elt, comprehension* generators)
         | DictComp(expr key, expr value, comprehension* generators)
         | GeneratorExp(expr elt, comprehension* generators)
         -- the grammar constrains where yield expressions can occur
         | Await(expr value)
         | Yield(expr? value)
         | YieldFrom(expr value)
         -- need sequences for compare to distinguish between
         -- x < 4 < 3 and (x < 4) < 3
         | Compare(expr left, cmpop* ops, expr* comparators)
         | Call(expr func, expr* args, keyword* keywords)
         | FormattedValue(expr value, int conversion, expr? format_spec)
         | Interpolation(expr value, constant str, int conversion, expr? format_spec)
         | JoinedStr(expr* values)
         | TemplateStr(expr* values)
         | Constant(constant value, string? kind)

         -- the following expression can appear in assignment context
         | Attribute(expr value, identifier attr, expr_context ctx)
         | Subscript(expr value, expr slice, expr_context ctx)
         | Starred(expr value, expr_context ctx)
         | Name(identifier id, expr_context ctx)
         | List(expr* elts, expr_context ctx)
         | Tuple(expr* elts, expr_context ctx)

         -- can appear only in Subscript
         | Slice(expr? lower, expr? upper, expr? step)

          -- col_offset is the byte offset in the utf8 string the parser uses
          attributes (int lineno, int col_offset, int? end_lineno, int? end_col_offset)

    expr_context = Load | Store | Del

    boolop = And | Or

    operator = Add | Sub | Mult | MatMult | Div | Mod | Pow | LShift
                 | RShift | BitOr | BitXor | BitAnd | FloorDiv

    unaryop = Invert | Not | UAdd | USub

    cmpop = Eq | NotEq | Lt | LtE | Gt | GtE | Is | IsNot | In | NotIn

    comprehension = (expr target, expr iter, expr* ifs, int is_async)

    excepthandler = ExceptHandler(expr? type, identifier? name, stmt* body)
                    attributes (int lineno, int col_offset, int? end_lineno, int? end_col_offset)

    arguments = (arg* posonlyargs, arg* args, arg? vararg, arg* kwonlyargs,
                 expr?* kw_defaults, arg? kwarg, expr* defaults)

    arg = (identifier arg, expr? annotation, string? type_comment)
           attributes (int lineno, int col_offset, int? end_lineno, int? end_col_offset)

    -- keyword arguments supplied to call (NULL identifier for **kwargs)
    keyword = (identifier? arg, expr value)
               attributes (int lineno, int col_offset, int? end_lineno, int? end_col_offset)

    -- import name with optional 'as' alias.
    alias = (identifier name, identifier? asname)
             attributes (int lineno, int col_offset, int? end_lineno, int? end_col_offset)

    withitem = (expr context_expr, expr? optional_vars)

    match_case = (pattern pattern, expr? guard, stmt* body)

    pattern = MatchValue(expr value)
            | MatchSingleton(constant value)
            | MatchSequence(pattern* patterns)
            | MatchMapping(expr* keys, pattern* patterns, identifier? rest)
            | MatchClass(expr cls, pattern* patterns, identifier* kwd_attrs, pattern* kwd_patterns)

            | MatchStar(identifier? name)
            -- The optional "rest" MatchMapping parameter handles capturing extra mapping keys

            | MatchAs(pattern? pattern, identifier? name)
            | MatchOr(pattern* patterns)

             attributes (int lineno, int col_offset, int end_lineno, int end_col_offset)

    type_ignore = TypeIgnore(int lineno, string tag)

    type_param = TypeVar(identifier name, expr? bound, expr? default_value)
               | ParamSpec(identifier name, expr? default_value)
               | TypeVarTuple(identifier name, expr? default_value)
               attributes (int lineno, int col_offset, int end_lineno, int end_col_offset)
@}
@end example

@node Node classes,ast helpers,Abstract grammar,ast — Abstract syntax trees
@anchor{library/ast node-classes}@anchor{4ed3}
@subsubsection Node classes


@geindex AST (class in ast)
@anchor{library/ast ast AST}@anchor{4c4}
@deffn {Class} ast.AST

This is the base of all AST node classes.  The actual node classes are
derived from the @code{Parser/Python.asdl} file, which is reproduced
@ref{4ed1,,above}.  They are defined in the @code{_ast} C
module and re-exported in @code{ast}.

There is one class defined for each left-hand side symbol in the abstract
grammar (for example, @code{ast.stmt} or @code{ast.expr}).  In addition,
there is one class defined for each constructor on the right-hand side; these
classes inherit from the classes for the left-hand side trees.  For example,
@ref{1df4,,ast.BinOp} inherits from @code{ast.expr}.  For production rules
with alternatives (aka “sums”), the left-hand side class is abstract: only
instances of specific constructor nodes are ever created.

@geindex ? (question mark); in AST grammar

@geindex * (asterisk); in AST grammar

@geindex _fields (ast.AST attribute)
@anchor{library/ast ast AST _fields}@anchor{1825}
@deffn {Attribute} _fields

Each concrete class has an attribute @code{_fields} which gives the names
of all child nodes.

Each instance of a concrete class has one attribute for each child node,
of the type as defined in the grammar.  For example, @ref{1df4,,ast.BinOp}
instances have an attribute @code{left} of type @code{ast.expr}.

If these attributes are marked as optional in the grammar (using a
question mark), the value might be @code{None}.  If the attributes can have
zero-or-more values (marked with an asterisk), the values are represented
as Python lists.  All possible attributes must be present and have valid
values when compiling an AST with @ref{4b2,,compile()}.
@end deffn

@geindex _field_types (ast.AST attribute)
@anchor{library/ast ast AST _field_types}@anchor{4c5}
@deffn {Attribute} _field_types

The @code{_field_types} attribute on each concrete class is a dictionary
mapping field names (as also listed in @ref{1825,,_fields}) to their types.

@example
>>> ast.TypeVar._field_types
@{'name': <class 'str'>, 'bound': ast.expr | None, 'default_value': ast.expr | None@}
@end example


Added in version 3.13.

@end deffn

@geindex lineno (ast.AST attribute)
@geindex col_offset (ast.AST attribute)
@geindex end_lineno (ast.AST attribute)
@geindex end_col_offset (ast.AST attribute)
@anchor{library/ast ast AST lineno}@anchor{4ed4}
@deffn {Attribute} lineno
@anchor{library/ast ast AST col_offset}@anchor{4ed5}
@deffnx {Attribute} col_offset
@anchor{library/ast ast AST end_lineno}@anchor{4ed6}
@deffnx {Attribute} end_lineno
@anchor{library/ast ast AST end_col_offset}@anchor{4ed7}
@deffnx {Attribute} end_col_offset

Instances of @code{ast.expr} and @code{ast.stmt} subclasses have
@ref{4ed4,,lineno}, @ref{4ed5,,col_offset}, @ref{4ed6,,end_lineno}, and
@ref{4ed7,,end_col_offset} attributes.  The @code{lineno} and @code{end_lineno}
are the first and last line numbers of source text span (1-indexed so the
first line is line 1) and the @code{col_offset} and @code{end_col_offset}
are the corresponding UTF-8 byte offsets of the first and last tokens that
generated the node. The UTF-8 offset is recorded because the parser uses
UTF-8 internally.

Note that the end positions are not required by the compiler and are
therefore optional. The end offset is `after' the last symbol, for example
one can get the source segment of a one-line expression node using
@code{source_line[node.col_offset : node.end_col_offset]}.
@end deffn

The constructor of a class @code{ast.T} parses its arguments as follows:


@itemize *

@item 
If there are positional arguments, there must be as many as there are items
in @code{T._fields}; they will be assigned as attributes of these names.

@item 
If there are keyword arguments, they will set the attributes of the same
names to the given values.
@end itemize

For example, to create and populate an @ref{4dde,,ast.UnaryOp} node, you could
use

@example
node = ast.UnaryOp(ast.USub(), ast.Constant(5, lineno=0, col_offset=0),
                   lineno=0, col_offset=0)
@end example

If a field that is optional in the grammar is omitted from the constructor,
it defaults to @code{None}. If a list field is omitted, it defaults to the empty
list. If a field of type @code{ast.expr_context} is omitted, it defaults to
@ref{4c3,,Load()}. If any other field is omitted, a @ref{1a4,,DeprecationWarning} is raised
and the AST node will not have this field. In Python 3.15, this condition will
raise an error.
@end deffn


Changed in version 3.8: Class @ref{2f1,,ast.Constant} is now used for all constants.



Changed in version 3.9: Simple indices are represented by their value, extended slices are
represented as tuples.



Changed in version 3.13: AST node constructors were changed to provide sensible defaults for omitted
fields: optional fields now default to @code{None}, list fields default to an
empty list, and fields of type @code{ast.expr_context} default to
@ref{4c3,,Load()}. Previously, omitted attributes would not exist on constructed
nodes (accessing them raised @ref{5f0,,AttributeError}).



Changed in version 3.14: The @ref{830,,__repr__()} output of @ref{4c4,,AST} nodes includes
the values of the node fields.



Deprecated since version 3.8, removed in version 3.14: Previous versions of Python provided the AST classes @code{ast.Num},
@code{ast.Str}, @code{ast.Bytes}, @code{ast.NameConstant} and
@code{ast.Ellipsis}, which were deprecated in Python 3.8. These classes
were removed in Python 3.14, and their functionality has been replaced with
@ref{2f1,,ast.Constant}.



Deprecated since version 3.9: Old classes @code{ast.Index} and @code{ast.ExtSlice} are still
available, but they will be removed in future Python releases.
In the meantime, instantiating them will return an instance of
a different class.



Deprecated since version 3.13, will be removed in version 3.15: Previous versions of Python allowed the creation of AST nodes that were missing
required fields. Similarly, AST node constructors allowed arbitrary keyword
arguments that were set as attributes of the AST node, even if they did not
match any of the fields of the AST node. This behavior is deprecated and will
be removed in Python 3.15.


@cartouche
@quotation Note 
The descriptions of the specific node classes displayed here
were initially adapted from the fantastic Green Tree Snakes@footnote{https://greentreesnakes.readthedocs.io/en/latest/} project and
all its contributors.
@end quotation
@end cartouche

@menu
* Root nodes:: 
* Literals: Literals<3>. 
* Variables:: 
* Expressions: Expressions<2>. 
* Statements:: 
* Control flow:: 
* Pattern matching:: 
* Type annotations:: 
* Type parameters:: 
* Function and class definitions:: 
* Async and await:: 

@end menu

@node Root nodes,Literals<3>,,Node classes
@anchor{library/ast ast-root-nodes}@anchor{4ed8}@anchor{library/ast root-nodes}@anchor{4ed9}
@subsubsection Root nodes


@geindex Module (class in ast)
@anchor{library/ast ast Module}@anchor{4eda}
@deffn {Class} ast.Module (body, type_ignores)

A Python module, as with @ref{25e5,,file input}.
Node type generated by @ref{1c4,,ast.parse()} in the default @code{"exec"} `mode'.

@code{body} is a @ref{24f,,list} of the module’s @ref{4edb,,Statements}.

@code{type_ignores} is a @ref{24f,,list} of the module’s type ignore comments;
see @ref{1c4,,ast.parse()} for more details.

@example
>>> print(ast.dump(ast.parse('x = 1'), indent=4))
Module(
    body=[
        Assign(
            targets=[
                Name(id='x', ctx=Store())],
            value=Constant(value=1))])
@end example
@end deffn

@geindex Expression (class in ast)
@anchor{library/ast ast Expression}@anchor{4edc}
@deffn {Class} ast.Expression (body)

A single Python @ref{25eb,,expression input}.
Node type generated by @ref{1c4,,ast.parse()} when `mode' is @code{"eval"}.

@code{body} is a single node,
one of the @ref{4edd,,expression types}.

@example
>>> print(ast.dump(ast.parse('123', mode='eval'), indent=4))
Expression(
    body=Constant(value=123))
@end example
@end deffn

@geindex Interactive (class in ast)
@anchor{library/ast ast Interactive}@anchor{18c2}
@deffn {Class} ast.Interactive (body)

A single @ref{25e8,,interactive input}, like in @ref{495,,Interactive Mode}.
Node type generated by @ref{1c4,,ast.parse()} when `mode' is @code{"single"}.

@code{body} is a @ref{24f,,list} of @ref{4edb,,statement nodes}.

@example
>>> print(ast.dump(ast.parse('x = 1; y = 2', mode='single'), indent=4))
Interactive(
    body=[
        Assign(
            targets=[
                Name(id='x', ctx=Store())],
            value=Constant(value=1)),
        Assign(
            targets=[
                Name(id='y', ctx=Store())],
            value=Constant(value=2))])
@end example
@end deffn

@geindex FunctionType (class in ast)
@anchor{library/ast ast FunctionType}@anchor{4ede}
@deffn {Class} ast.FunctionType (argtypes, returns)

A representation of an old-style type comments for functions,
as Python versions prior to 3.5 didn’t support 
@geindex Python Enhancement Proposals; PEP 484
PEP 484@footnote{https://peps.python.org/pep-0484/} annotations.
Node type generated by @ref{1c4,,ast.parse()} when `mode' is @code{"func_type"}.

Such type comments would look like this:

@example
def sum_two_number(a, b):
    # type: (int, int) -> int
    return a + b
@end example

@code{argtypes} is a @ref{24f,,list} of @ref{4edd,,expression nodes}.

@code{returns} is a single @ref{4edd,,expression node}.

@example
>>> print(ast.dump(ast.parse('(int, str) -> List[int]', mode='func_type'), indent=4))
FunctionType(
    argtypes=[
        Name(id='int', ctx=Load()),
        Name(id='str', ctx=Load())],
    returns=Subscript(
        value=Name(id='List', ctx=Load()),
        slice=Name(id='int', ctx=Load()),
        ctx=Load()))
@end example


Added in version 3.8.

@end deffn

@node Literals<3>,Variables,Root nodes,Node classes
@anchor{library/ast literals}@anchor{4edf}
@subsubsection Literals


@geindex Constant (class in ast)
@anchor{library/ast ast Constant}@anchor{2f1}
@deffn {Class} ast.Constant (value, kind)

A constant value. The @code{value} attribute of the @code{Constant} literal contains the
Python object it represents. The values represented can be instances of @ref{16a,,str},
@ref{193,,bytes}, @ref{19c,,int}, @ref{197,,float}, @ref{198,,complex}, and @ref{3c1,,bool},
and the constants @ref{887,,None} and @ref{236c,,Ellipsis}.

The @code{kind} attribute is an optional string. For string literals with a
@code{u} prefix, @code{kind} is set to @code{'u'}. For all other
constants, @code{kind} is @code{None}.

@example
>>> print(ast.dump(ast.parse('123', mode='eval'), indent=4))
Expression(
    body=Constant(value=123))
>>> print(ast.dump(ast.parse("u'hello'", mode='eval'), indent=4))
Expression(
    body=Constant(value='hello', kind='u'))
@end example
@end deffn

@geindex FormattedValue (class in ast)
@anchor{library/ast ast FormattedValue}@anchor{4df6}
@deffn {Class} ast.FormattedValue (value, conversion, format_spec)

Node representing a single formatting field in an f-string. If the string
contains a single formatting field and nothing else the node can be
isolated otherwise it appears in @ref{1aa2,,JoinedStr}.


@itemize *

@item 
@code{value} is any expression node (such as a literal, a variable, or a
function call).

@item 
@code{conversion} is an integer:


@itemize *

@item 
-1: no formatting

@item 
97 (@code{ord('a')}): @code{!a} @ref{15f2,,ASCII} formatting

@item 
114 (@code{ord('r')}): @code{!r} @ref{1c3,,repr()} formatting

@item 
115 (@code{ord('s')}): @code{!s} @ref{16a,,string} formatting
@end itemize

@item 
@code{format_spec} is a @ref{1aa2,,JoinedStr} node representing the formatting
of the value, or @code{None} if no format was specified. Both
@code{conversion} and @code{format_spec} can be set at the same time.
@end itemize
@end deffn

@geindex JoinedStr (class in ast)
@anchor{library/ast ast JoinedStr}@anchor{1aa2}
@deffn {Class} ast.JoinedStr (values)

An f-string, comprising a series of @ref{4df6,,FormattedValue} and @ref{2f1,,Constant}
nodes.

@example
>>> print(ast.dump(ast.parse('f"sin(@{a@}) is @{sin(a):.3@}"', mode='eval'), indent=4))
Expression(
    body=JoinedStr(
        values=[
            Constant(value='sin('),
            FormattedValue(
                value=Name(id='a', ctx=Load()),
                conversion=-1),
            Constant(value=') is '),
            FormattedValue(
                value=Call(
                    func=Name(id='sin', ctx=Load()),
                    args=[
                        Name(id='a', ctx=Load())]),
                conversion=-1,
                format_spec=JoinedStr(
                    values=[
                        Constant(value='.3')]))]))
@end example
@end deffn

@geindex TemplateStr (class in ast)
@anchor{library/ast ast TemplateStr}@anchor{4ee0}
@deffn {Class} ast.TemplateStr (values, /)


Added in version 3.14.


Node representing a template string literal, comprising a series of
@ref{1805,,Interpolation} and @ref{2f1,,Constant} nodes.
These nodes may be any order, and do not need to be interleaved.

@example
>>> expr = ast.parse('t"@{name@} finished @{place:ordinal@}"', mode='eval')
>>> print(ast.dump(expr, indent=4))
Expression(
    body=TemplateStr(
        values=[
            Interpolation(
                value=Name(id='name', ctx=Load()),
                str='name',
                conversion=-1),
            Constant(value=' finished '),
            Interpolation(
                value=Name(id='place', ctx=Load()),
                str='place',
                conversion=-1,
                format_spec=JoinedStr(
                    values=[
                        Constant(value='ordinal')]))]))
@end example
@end deffn

@geindex Interpolation (class in ast)
@anchor{library/ast ast Interpolation}@anchor{1805}
@deffn {Class} ast.Interpolation (value, str, conversion, format_spec=None)


Added in version 3.14.


Node representing a single interpolation field in a template string literal.


@itemize *

@item 
@code{value} is any expression node (such as a literal, a variable, or a
function call).
This has the same meaning as @code{FormattedValue.value}.

@item 
@code{str} is a constant containing the text of the interpolation expression.

If @code{str} is set to @code{None}, then @code{value} is used to generate code
when calling @ref{ae8,,ast.unparse()}. This no longer guarantees that the
generated code is identical to the original and is intended for code
generation.

@item 
@code{conversion} is an integer:


@itemize *

@item 
-1: no conversion

@item 
97 (@code{ord('a')}): @code{!a} @ref{15f2,,ASCII} conversion

@item 
114 (@code{ord('r')}): @code{!r} @ref{1c3,,repr()} conversion

@item 
115 (@code{ord('s')}): @code{!s} @ref{16a,,string} conversion
@end itemize

This has the same meaning as @code{FormattedValue.conversion}.

@item 
@code{format_spec} is a @ref{1aa2,,JoinedStr} node representing the formatting
of the value, or @code{None} if no format was specified. Both
@code{conversion} and @code{format_spec} can be set at the same time.
This has the same meaning as @code{FormattedValue.format_spec}.
@end itemize
@end deffn

@geindex List (class in ast)
@geindex Tuple (class in ast)
@anchor{library/ast ast List}@anchor{4df3}
@deffn {Class} ast.List (elts, ctx)
@anchor{library/ast ast Tuple}@anchor{4df4}
@deffnx {Class} ast.Tuple (elts, ctx)

A list or tuple. @code{elts} holds a list of nodes representing the elements.
@code{ctx} is @ref{4ee1,,Store} if the container is an assignment target (i.e.
@code{(x,y)=something}), and @ref{4c3,,Load} otherwise.

@example
>>> print(ast.dump(ast.parse('[1, 2, 3]', mode='eval'), indent=4))
Expression(
    body=List(
        elts=[
            Constant(value=1),
            Constant(value=2),
            Constant(value=3)],
        ctx=Load()))
>>> print(ast.dump(ast.parse('(1, 2, 3)', mode='eval'), indent=4))
Expression(
    body=Tuple(
        elts=[
            Constant(value=1),
            Constant(value=2),
            Constant(value=3)],
        ctx=Load()))
@end example
@end deffn

@geindex Set (class in ast)
@anchor{library/ast ast Set}@anchor{4de3}
@deffn {Class} ast.Set (elts)

A set. @code{elts} holds a list of nodes representing the set’s elements.

@example
>>> print(ast.dump(ast.parse('@{1, 2, 3@}', mode='eval'), indent=4))
Expression(
    body=Set(
        elts=[
            Constant(value=1),
            Constant(value=2),
            Constant(value=3)]))
@end example
@end deffn

@geindex Dict (class in ast)
@anchor{library/ast ast Dict}@anchor{1d8d}
@deffn {Class} ast.Dict (keys, values)

A dictionary. @code{keys} and @code{values} hold lists of nodes representing the
keys and the values respectively, in matching order (what would be returned
when calling @code{dictionary.keys()} and @code{dictionary.values()}).

When doing dictionary unpacking using dictionary literals the expression to be
expanded goes in the @code{values} list, with a @code{None} at the corresponding
position in @code{keys}.

@example
>>> print(ast.dump(ast.parse('@{"a":1, **d@}', mode='eval'), indent=4))
Expression(
    body=Dict(
        keys=[
            Constant(value='a'),
            None],
        values=[
            Constant(value=1),
            Name(id='d', ctx=Load())]))
@end example
@end deffn

@node Variables,Expressions<2>,Literals<3>,Node classes
@anchor{library/ast variables}@anchor{4ee2}
@subsubsection Variables


@geindex Name (class in ast)
@anchor{library/ast ast Name}@anchor{1d66}
@deffn {Class} ast.Name (id, ctx)

A variable name. @code{id} holds the name as a string, and @code{ctx} is one of
the following types.
@end deffn

@geindex Load (class in ast)
@geindex Store (class in ast)
@geindex Del (class in ast)
@anchor{library/ast ast Load}@anchor{4c3}
@deffn {Class} ast.Load
@anchor{library/ast ast Store}@anchor{4ee1}
@deffnx {Class} ast.Store
@anchor{library/ast ast Del}@anchor{4ee3}
@deffnx {Class} ast.Del

Variable references can be used to load the value of a variable, to assign
a new value to it, or to delete it. Variable references are given a context
to distinguish these cases.

@example
>>> print(ast.dump(ast.parse('a'), indent=4))
Module(
    body=[
        Expr(
            value=Name(id='a', ctx=Load()))])

>>> print(ast.dump(ast.parse('a = 1'), indent=4))
Module(
    body=[
        Assign(
            targets=[
                Name(id='a', ctx=Store())],
            value=Constant(value=1))])

>>> print(ast.dump(ast.parse('del a'), indent=4))
Module(
    body=[
        Delete(
            targets=[
                Name(id='a', ctx=Del())])])
@end example
@end deffn

@geindex Starred (class in ast)
@anchor{library/ast ast Starred}@anchor{4df2}
@deffn {Class} ast.Starred (value, ctx)

A @code{*var} variable reference. @code{value} holds the variable, typically a
@ref{1d66,,Name} node. This type must be used when building a @ref{4def,,Call}
node with @code{*args}.

@example
>>> print(ast.dump(ast.parse('a, *b = it'), indent=4))
Module(
    body=[
        Assign(
            targets=[
                Tuple(
                    elts=[
                        Name(id='a', ctx=Store()),
                        Starred(
                            value=Name(id='b', ctx=Store()),
                            ctx=Store())],
                    ctx=Store())],
            value=Name(id='it', ctx=Load()))])
@end example
@end deffn

@node Expressions<2>,Statements,Variables,Node classes
@anchor{library/ast ast-expressions}@anchor{4edd}@anchor{library/ast expressions}@anchor{4ee4}
@subsubsection Expressions


@geindex Expr (class in ast)
@anchor{library/ast ast Expr}@anchor{4ee5}
@deffn {Class} ast.Expr (value)

When an expression, such as a function call, appears as a statement by itself
with its return value not used or stored, it is wrapped in this container.
@code{value} holds one of the other nodes in this section, a @ref{2f1,,Constant}, a
@ref{1d66,,Name}, a @ref{4df9,,Lambda}, a @ref{4e00,,Yield} or @ref{4e01,,YieldFrom} node.

@example
>>> print(ast.dump(ast.parse('-a'), indent=4))
Module(
    body=[
        Expr(
            value=UnaryOp(
                op=USub(),
                operand=Name(id='a', ctx=Load())))])
@end example
@end deffn

@geindex UnaryOp (class in ast)
@anchor{library/ast ast UnaryOp}@anchor{4dde}
@deffn {Class} ast.UnaryOp (op, operand)

A unary operation. @code{op} is the operator, and @code{operand} any expression
node.
@end deffn

@geindex UAdd (class in ast)
@geindex USub (class in ast)
@geindex Not (class in ast)
@geindex Invert (class in ast)
@anchor{library/ast ast UAdd}@anchor{4de0}
@deffn {Class} ast.UAdd
@anchor{library/ast ast USub}@anchor{4de1}
@deffnx {Class} ast.USub
@anchor{library/ast ast Not}@anchor{4de2}
@deffnx {Class} ast.Not
@anchor{library/ast ast Invert}@anchor{4ddf}
@deffnx {Class} ast.Invert

Unary operator tokens. @code{Not} is the @code{not} keyword, @code{Invert}
is the @code{~} operator.

@example
>>> print(ast.dump(ast.parse('not x', mode='eval'), indent=4))
Expression(
    body=UnaryOp(
        op=Not(),
        operand=Name(id='x', ctx=Load())))
@end example
@end deffn

@geindex BinOp (class in ast)
@anchor{library/ast ast BinOp}@anchor{1df4}
@deffn {Class} ast.BinOp (left, op, right)

A binary operation (like addition or division). @code{op} is the operator, and
@code{left} and @code{right} are any expression nodes.

@example
>>> print(ast.dump(ast.parse('x + y', mode='eval'), indent=4))
Expression(
    body=BinOp(
        left=Name(id='x', ctx=Load()),
        op=Add(),
        right=Name(id='y', ctx=Load())))
@end example
@end deffn

@geindex Add (class in ast)
@geindex Sub (class in ast)
@geindex Mult (class in ast)
@geindex Div (class in ast)
@geindex FloorDiv (class in ast)
@geindex Mod (class in ast)
@geindex Pow (class in ast)
@geindex LShift (class in ast)
@geindex RShift (class in ast)
@geindex BitOr (class in ast)
@geindex BitXor (class in ast)
@geindex BitAnd (class in ast)
@geindex MatMult (class in ast)
@anchor{library/ast ast Add}@anchor{4ee6}
@deffn {Class} ast.Add
@anchor{library/ast ast Sub}@anchor{4ee7}
@deffnx {Class} ast.Sub
@anchor{library/ast ast Mult}@anchor{4ee8}
@deffnx {Class} ast.Mult
@anchor{library/ast ast Div}@anchor{4ee9}
@deffnx {Class} ast.Div
@anchor{library/ast ast FloorDiv}@anchor{4eea}
@deffnx {Class} ast.FloorDiv
@anchor{library/ast ast Mod}@anchor{4eeb}
@deffnx {Class} ast.Mod
@anchor{library/ast ast Pow}@anchor{4eec}
@deffnx {Class} ast.Pow
@anchor{library/ast ast LShift}@anchor{4eed}
@deffnx {Class} ast.LShift
@anchor{library/ast ast RShift}@anchor{4eee}
@deffnx {Class} ast.RShift
@anchor{library/ast ast BitOr}@anchor{4eef}
@deffnx {Class} ast.BitOr
@anchor{library/ast ast BitXor}@anchor{4ef0}
@deffnx {Class} ast.BitXor
@anchor{library/ast ast BitAnd}@anchor{4ef1}
@deffnx {Class} ast.BitAnd
@anchor{library/ast ast MatMult}@anchor{4ef2}
@deffnx {Class} ast.MatMult

Binary operator tokens.
@end deffn

@geindex BoolOp (class in ast)
@anchor{library/ast ast BoolOp}@anchor{4df7}
@deffn {Class} ast.BoolOp (op, values)

A boolean operation, ‘or’ or ‘and’. @code{op} is @ref{4ef3,,Or} or @ref{4ef4,,And}.
@code{values} are the values involved. Consecutive operations with the same
operator, such as @code{a or b or c}, are collapsed into one node with several
values.

This doesn’t include @code{not}, which is a @ref{4dde,,UnaryOp}.

@example
>>> print(ast.dump(ast.parse('x or y', mode='eval'), indent=4))
Expression(
    body=BoolOp(
        op=Or(),
        values=[
            Name(id='x', ctx=Load()),
            Name(id='y', ctx=Load())]))
@end example
@end deffn

@geindex And (class in ast)
@geindex Or (class in ast)
@anchor{library/ast ast And}@anchor{4ef4}
@deffn {Class} ast.And
@anchor{library/ast ast Or}@anchor{4ef3}
@deffnx {Class} ast.Or

Boolean operator tokens.
@end deffn

@geindex Compare (class in ast)
@anchor{library/ast ast Compare}@anchor{4de4}
@deffn {Class} ast.Compare (left, ops, comparators)

A comparison of two or more values. @code{left} is the first value in the
comparison, @code{ops} the list of operators, and @code{comparators} the list
of values after the first element in the comparison.

@example
>>> print(ast.dump(ast.parse('1 <= a < 10', mode='eval'), indent=4))
Expression(
    body=Compare(
        left=Constant(value=1),
        ops=[
            LtE(),
            Lt()],
        comparators=[
            Name(id='a', ctx=Load()),
            Constant(value=10)]))
@end example
@end deffn

@geindex Eq (class in ast)
@geindex NotEq (class in ast)
@geindex Lt (class in ast)
@geindex LtE (class in ast)
@geindex Gt (class in ast)
@geindex GtE (class in ast)
@geindex Is (class in ast)
@geindex IsNot (class in ast)
@geindex In (class in ast)
@geindex NotIn (class in ast)
@anchor{library/ast ast Eq}@anchor{4de5}
@deffn {Class} ast.Eq
@anchor{library/ast ast NotEq}@anchor{4de6}
@deffnx {Class} ast.NotEq
@anchor{library/ast ast Lt}@anchor{4de7}
@deffnx {Class} ast.Lt
@anchor{library/ast ast LtE}@anchor{4de8}
@deffnx {Class} ast.LtE
@anchor{library/ast ast Gt}@anchor{4de9}
@deffnx {Class} ast.Gt
@anchor{library/ast ast GtE}@anchor{4dea}
@deffnx {Class} ast.GtE
@anchor{library/ast ast Is}@anchor{4deb}
@deffnx {Class} ast.Is
@anchor{library/ast ast IsNot}@anchor{4dec}
@deffnx {Class} ast.IsNot
@anchor{library/ast ast In}@anchor{4ded}
@deffnx {Class} ast.In
@anchor{library/ast ast NotIn}@anchor{4dee}
@deffnx {Class} ast.NotIn

Comparison operator tokens.
@end deffn

@geindex Call (class in ast)
@anchor{library/ast ast Call}@anchor{4def}
@deffn {Class} ast.Call (func, args, keywords)

A function call. @code{func} is the function, which will often be a
@ref{1d66,,Name} or @ref{4df0,,Attribute} object. Of the arguments:


@itemize *

@item 
@code{args} holds a list of the arguments passed by position.

@item 
@code{keywords} holds a list of @ref{4ef5,,keyword} objects representing
arguments passed by keyword.
@end itemize

The @code{args} and @code{keywords} arguments are optional and default to empty lists.

@example
>>> print(ast.dump(ast.parse('func(a, b=c, *d, **e)', mode='eval'), indent=4))
Expression(
    body=Call(
        func=Name(id='func', ctx=Load()),
        args=[
            Name(id='a', ctx=Load()),
            Starred(
                value=Name(id='d', ctx=Load()),
                ctx=Load())],
        keywords=[
            keyword(
                arg='b',
                value=Name(id='c', ctx=Load())),
            keyword(
                value=Name(id='e', ctx=Load()))]))
@end example
@end deffn

@geindex keyword (class in ast)
@anchor{library/ast ast keyword}@anchor{4ef5}
@deffn {Class} ast.keyword (arg, value)

A keyword argument to a function call or class definition. @code{arg} is a raw
string of the parameter name, @code{value} is a node to pass in.
@end deffn

@geindex IfExp (class in ast)
@anchor{library/ast ast IfExp}@anchor{4df8}
@deffn {Class} ast.IfExp (test, body, orelse)

An expression such as @code{a if b else c}. Each field holds a single node, so
in the following example, all three are @ref{1d66,,Name} nodes.

@example
>>> print(ast.dump(ast.parse('a if b else c', mode='eval'), indent=4))
Expression(
    body=IfExp(
        test=Name(id='b', ctx=Load()),
        body=Name(id='a', ctx=Load()),
        orelse=Name(id='c', ctx=Load())))
@end example
@end deffn

@geindex Attribute (class in ast)
@anchor{library/ast ast Attribute}@anchor{4df0}
@deffn {Class} ast.Attribute (value, attr, ctx)

Attribute access, e.g. @code{d.keys}. @code{value} is a node, typically a
@ref{1d66,,Name}. @code{attr} is a bare string giving the name of the attribute,
and @code{ctx} is @ref{4c3,,Load}, @ref{4ee1,,Store} or @ref{4ee3,,Del} according to how
the attribute is acted on.

@example
>>> print(ast.dump(ast.parse('snake.colour', mode='eval'), indent=4))
Expression(
    body=Attribute(
        value=Name(id='snake', ctx=Load()),
        attr='colour',
        ctx=Load()))
@end example
@end deffn

@geindex NamedExpr (class in ast)
@anchor{library/ast ast NamedExpr}@anchor{4dfe}
@deffn {Class} ast.NamedExpr (target, value)

A named expression. This AST node is produced by the assignment expressions
operator (also known as the walrus operator). As opposed to the @ref{4ef6,,Assign}
node in which the first argument can be multiple nodes, in this case both
@code{target} and @code{value} must be single nodes.

@example
>>> print(ast.dump(ast.parse('(x := 4)', mode='eval'), indent=4))
Expression(
    body=NamedExpr(
        target=Name(id='x', ctx=Store()),
        value=Constant(value=4)))
@end example


Added in version 3.8.

@end deffn

@menu
* Subscripting:: 
* Comprehensions:: 

@end menu

@node Subscripting,Comprehensions,,Expressions<2>
@anchor{library/ast subscripting}@anchor{4ef7}
@subsubsection Subscripting


@geindex Subscript (class in ast)
@anchor{library/ast ast Subscript}@anchor{4df1}
@deffn {Class} ast.Subscript (value, slice, ctx)

A subscript, such as @code{l[1]}. @code{value} is the subscripted object
(usually sequence or mapping). @code{slice} is an index, slice or key.
It can be a @ref{4df4,,Tuple} and contain a @ref{4df5,,Slice}.
@code{ctx} is @ref{4c3,,Load}, @ref{4ee1,,Store} or @ref{4ee3,,Del}
according to the action performed with the subscript.

@example
>>> print(ast.dump(ast.parse('l[1:2, 3]', mode='eval'), indent=4))
Expression(
    body=Subscript(
        value=Name(id='l', ctx=Load()),
        slice=Tuple(
            elts=[
                Slice(
                    lower=Constant(value=1),
                    upper=Constant(value=2)),
                Constant(value=3)],
            ctx=Load()),
        ctx=Load()))
@end example
@end deffn

@geindex Slice (class in ast)
@anchor{library/ast ast Slice}@anchor{4df5}
@deffn {Class} ast.Slice (lower, upper, step)

Regular slicing (on the form @code{lower:upper} or @code{lower:upper:step}).
Can occur only inside the `slice' field of @ref{4df1,,Subscript}, either
directly or as an element of @ref{4df4,,Tuple}.

@example
>>> print(ast.dump(ast.parse('l[1:2]', mode='eval'), indent=4))
Expression(
    body=Subscript(
        value=Name(id='l', ctx=Load()),
        slice=Slice(
            lower=Constant(value=1),
            upper=Constant(value=2)),
        ctx=Load()))
@end example
@end deffn

@node Comprehensions,,Subscripting,Expressions<2>
@anchor{library/ast comprehensions}@anchor{4ef8}
@subsubsection Comprehensions


@geindex ListComp (class in ast)
@geindex SetComp (class in ast)
@geindex GeneratorExp (class in ast)
@geindex DictComp (class in ast)
@anchor{library/ast ast ListComp}@anchor{4dfa}
@deffn {Class} ast.ListComp (elt, generators)
@anchor{library/ast ast SetComp}@anchor{4dfb}
@deffnx {Class} ast.SetComp (elt, generators)
@anchor{library/ast ast GeneratorExp}@anchor{4dfd}
@deffnx {Class} ast.GeneratorExp (elt, generators)
@anchor{library/ast ast DictComp}@anchor{4dfc}
@deffnx {Class} ast.DictComp (key, value, generators)

List and set comprehensions, generator expressions, and dictionary
comprehensions. @code{elt} (or @code{key} and @code{value}) is a single node
representing the part that will be evaluated for each item.

@code{generators} is a list of @ref{4ef9,,comprehension} nodes.

@example
>>> print(ast.dump(
...     ast.parse('[x for x in numbers]', mode='eval'),
...     indent=4,
... ))
Expression(
    body=ListComp(
        elt=Name(id='x', ctx=Load()),
        generators=[
            comprehension(
                target=Name(id='x', ctx=Store()),
                iter=Name(id='numbers', ctx=Load()),
                is_async=0)]))
>>> print(ast.dump(
...     ast.parse('@{x: x**2 for x in numbers@}', mode='eval'),
...     indent=4,
... ))
Expression(
    body=DictComp(
        key=Name(id='x', ctx=Load()),
        value=BinOp(
            left=Name(id='x', ctx=Load()),
            op=Pow(),
            right=Constant(value=2)),
        generators=[
            comprehension(
                target=Name(id='x', ctx=Store()),
                iter=Name(id='numbers', ctx=Load()),
                is_async=0)]))
>>> print(ast.dump(
...     ast.parse('@{x for x in numbers@}', mode='eval'),
...     indent=4,
... ))
Expression(
    body=SetComp(
        elt=Name(id='x', ctx=Load()),
        generators=[
            comprehension(
                target=Name(id='x', ctx=Store()),
                iter=Name(id='numbers', ctx=Load()),
                is_async=0)]))
@end example
@end deffn

@geindex comprehension (class in ast)
@anchor{library/ast ast comprehension}@anchor{4ef9}
@deffn {Class} ast.comprehension (target, iter, ifs, is_async)

One @code{for} clause in a comprehension. @code{target} is the reference to use for
each element - typically a @ref{1d66,,Name} or @ref{4df4,,Tuple} node. @code{iter}
is the object to iterate over. @code{ifs} is a list of test expressions: each
@code{for} clause can have multiple @code{ifs}.

@code{is_async} indicates a comprehension is asynchronous (using an
@code{async for} instead of @code{for}). The value is an integer (0 or 1).

@example
>>> print(ast.dump(ast.parse('[ord(c) for line in file for c in line]', mode='eval'),
...                indent=4)) # Multiple comprehensions in one.
Expression(
    body=ListComp(
        elt=Call(
            func=Name(id='ord', ctx=Load()),
            args=[
                Name(id='c', ctx=Load())]),
        generators=[
            comprehension(
                target=Name(id='line', ctx=Store()),
                iter=Name(id='file', ctx=Load()),
                is_async=0),
            comprehension(
                target=Name(id='c', ctx=Store()),
                iter=Name(id='line', ctx=Load()),
                is_async=0)]))

>>> print(ast.dump(ast.parse('(n**2 for n in it if n>5 if n<10)', mode='eval'),
...                indent=4)) # generator comprehension
Expression(
    body=GeneratorExp(
        elt=BinOp(
            left=Name(id='n', ctx=Load()),
            op=Pow(),
            right=Constant(value=2)),
        generators=[
            comprehension(
                target=Name(id='n', ctx=Store()),
                iter=Name(id='it', ctx=Load()),
                ifs=[
                    Compare(
                        left=Name(id='n', ctx=Load()),
                        ops=[
                            Gt()],
                        comparators=[
                            Constant(value=5)]),
                    Compare(
                        left=Name(id='n', ctx=Load()),
                        ops=[
                            Lt()],
                        comparators=[
                            Constant(value=10)])],
                is_async=0)]))

>>> print(ast.dump(ast.parse('[i async for i in soc]', mode='eval'),
...                indent=4)) # Async comprehension
Expression(
    body=ListComp(
        elt=Name(id='i', ctx=Load()),
        generators=[
            comprehension(
                target=Name(id='i', ctx=Store()),
                iter=Name(id='soc', ctx=Load()),
                is_async=1)]))
@end example
@end deffn

@node Statements,Control flow,Expressions<2>,Node classes
@anchor{library/ast ast-statements}@anchor{4edb}@anchor{library/ast statements}@anchor{4efa}
@subsubsection Statements


@geindex Assign (class in ast)
@anchor{library/ast ast Assign}@anchor{4ef6}
@deffn {Class} ast.Assign (targets, value, type_comment)

An assignment. @code{targets} is a list of nodes, and @code{value} is a single node.

Multiple nodes in @code{targets} represents assigning the same value to each.
Unpacking is represented by putting a @ref{4df4,,Tuple} or @ref{4df3,,List}
within @code{targets}.

@geindex type_comment (ast.Assign attribute)
@anchor{library/ast ast Assign type_comment}@anchor{4efb}
@deffn {Attribute} type_comment

@code{type_comment} is an optional string with the type annotation as a comment.
@end deffn

@example
>>> print(ast.dump(ast.parse('a = b = 1'), indent=4)) # Multiple assignment
Module(
    body=[
        Assign(
            targets=[
                Name(id='a', ctx=Store()),
                Name(id='b', ctx=Store())],
            value=Constant(value=1))])

>>> print(ast.dump(ast.parse('a,b = c'), indent=4)) # Unpacking
Module(
    body=[
        Assign(
            targets=[
                Tuple(
                    elts=[
                        Name(id='a', ctx=Store()),
                        Name(id='b', ctx=Store())],
                    ctx=Store())],
            value=Name(id='c', ctx=Load()))])
@end example
@end deffn

@geindex AnnAssign (class in ast)
@anchor{library/ast ast AnnAssign}@anchor{4efc}
@deffn {Class} ast.AnnAssign (target, annotation, value, simple)

An assignment with a type annotation. @code{target} is a single node and can
be a @ref{1d66,,Name}, an @ref{4df0,,Attribute} or a @ref{4df1,,Subscript}.
@code{annotation} is the annotation, such as a @ref{2f1,,Constant} or @code{Name}
node. @code{value} is a single optional node.

@code{simple} is always either 0 (indicating a “complex” target) or 1
(indicating a “simple” target). A “simple” target consists solely of a
@ref{1d66,,Name} node that does not appear between parentheses; all other
targets are considered complex. Only simple targets appear in
the @ref{456,,__annotations__} dictionary of modules and classes.

@example
>>> print(ast.dump(ast.parse('c: int'), indent=4))
Module(
    body=[
        AnnAssign(
            target=Name(id='c', ctx=Store()),
            annotation=Name(id='int', ctx=Load()),
            simple=1)])

>>> print(ast.dump(ast.parse('(a): int = 1'), indent=4)) # Annotation with parenthesis
Module(
    body=[
        AnnAssign(
            target=Name(id='a', ctx=Store()),
            annotation=Name(id='int', ctx=Load()),
            value=Constant(value=1),
            simple=0)])

>>> print(ast.dump(ast.parse('a.b: int'), indent=4)) # Attribute annotation
Module(
    body=[
        AnnAssign(
            target=Attribute(
                value=Name(id='a', ctx=Load()),
                attr='b',
                ctx=Store()),
            annotation=Name(id='int', ctx=Load()),
            simple=0)])

>>> print(ast.dump(ast.parse('a[1]: int'), indent=4)) # Subscript annotation
Module(
    body=[
        AnnAssign(
            target=Subscript(
                value=Name(id='a', ctx=Load()),
                slice=Constant(value=1),
                ctx=Store()),
            annotation=Name(id='int', ctx=Load()),
            simple=0)])
@end example
@end deffn

@geindex AugAssign (class in ast)
@anchor{library/ast ast AugAssign}@anchor{4efd}
@deffn {Class} ast.AugAssign (target, op, value)

Augmented assignment, such as @code{a += 1}. In the following example,
@code{target} is a @ref{1d66,,Name} node for @code{x} (with the @ref{4ee1,,Store}
context), @code{op} is @ref{4ee6,,Add}, and @code{value} is a @ref{2f1,,Constant} with
value for 1.

The @code{target} attribute cannot be of class @ref{4df4,,Tuple} or @ref{4df3,,List},
unlike the targets of @ref{4ef6,,Assign}.

@example
>>> print(ast.dump(ast.parse('x += 2'), indent=4))
Module(
    body=[
        AugAssign(
            target=Name(id='x', ctx=Store()),
            op=Add(),
            value=Constant(value=2))])
@end example
@end deffn

@geindex Raise (class in ast)
@anchor{library/ast ast Raise}@anchor{4efe}
@deffn {Class} ast.Raise (exc, cause)

A @code{raise} statement. @code{exc} is the exception object to be raised, normally a
@ref{4def,,Call} or @ref{1d66,,Name}, or @code{None} for a standalone @code{raise}.
@code{cause} is the optional part for @code{y} in @code{raise x from y}.

@example
>>> print(ast.dump(ast.parse('raise x from y'), indent=4))
Module(
    body=[
        Raise(
            exc=Name(id='x', ctx=Load()),
            cause=Name(id='y', ctx=Load()))])
@end example
@end deffn

@geindex Assert (class in ast)
@anchor{library/ast ast Assert}@anchor{4eff}
@deffn {Class} ast.Assert (test, msg)

An assertion. @code{test} holds the condition, such as a @ref{4de4,,Compare} node.
@code{msg} holds the failure message.

@example
>>> print(ast.dump(ast.parse('assert x,y'), indent=4))
Module(
    body=[
        Assert(
            test=Name(id='x', ctx=Load()),
            msg=Name(id='y', ctx=Load()))])
@end example
@end deffn

@geindex Delete (class in ast)
@anchor{library/ast ast Delete}@anchor{4f00}
@deffn {Class} ast.Delete (targets)

Represents a @code{del} statement. @code{targets} is a list of nodes, such as
@ref{1d66,,Name}, @ref{4df0,,Attribute} or @ref{4df1,,Subscript} nodes.

@example
>>> print(ast.dump(ast.parse('del x,y,z'), indent=4))
Module(
    body=[
        Delete(
            targets=[
                Name(id='x', ctx=Del()),
                Name(id='y', ctx=Del()),
                Name(id='z', ctx=Del())])])
@end example
@end deffn

@geindex Pass (class in ast)
@anchor{library/ast ast Pass}@anchor{4f01}
@deffn {Class} ast.Pass

A @code{pass} statement.

@example
>>> print(ast.dump(ast.parse('pass'), indent=4))
Module(
    body=[
        Pass()])
@end example
@end deffn

@geindex TypeAlias (class in ast)
@anchor{library/ast ast TypeAlias}@anchor{1a9b}
@deffn {Class} ast.TypeAlias (name, type_params, value)

A @ref{684,,type alias} created through the @ref{66d,,type}
statement. @code{name} is the name of the alias, @code{type_params} is a list of
@ref{4f02,,type parameters}, and @code{value} is the value of the
type alias.

@example
>>> print(ast.dump(ast.parse('type Alias = int'), indent=4))
Module(
    body=[
        TypeAlias(
            name=Name(id='Alias', ctx=Store()),
            value=Name(id='int', ctx=Load()))])
@end example


Added in version 3.12.

@end deffn

Other statements which are only applicable inside functions or loops are
described in other sections.

@menu
* Imports:: 

@end menu

@node Imports,,,Statements
@anchor{library/ast imports}@anchor{4f03}
@subsubsection Imports


@geindex Import (class in ast)
@anchor{library/ast ast Import}@anchor{4f04}
@deffn {Class} ast.Import (names)

An import statement. @code{names} is a list of @ref{1cb7,,alias} nodes.

@example
>>> print(ast.dump(ast.parse('import x,y,z'), indent=4))
Module(
    body=[
        Import(
            names=[
                alias(name='x'),
                alias(name='y'),
                alias(name='z')])])
@end example
@end deffn

@geindex ImportFrom (class in ast)
@anchor{library/ast ast ImportFrom}@anchor{4f05}
@deffn {Class} ast.ImportFrom (module, names, level)

Represents @code{from x import y}. @code{module} is a raw string of the ‘from’ name,
without any leading dots, or @code{None} for statements such as @code{from . import foo}.
@code{level} is an integer holding the level of the relative import (0 means
absolute import).

@example
>>> print(ast.dump(ast.parse('from y import x,y,z'), indent=4))
Module(
    body=[
        ImportFrom(
            module='y',
            names=[
                alias(name='x'),
                alias(name='y'),
                alias(name='z')],
            level=0)])
@end example
@end deffn

@geindex alias (class in ast)
@anchor{library/ast ast alias}@anchor{1cb7}
@deffn {Class} ast.alias (name, asname)

Both parameters are raw strings of the names. @code{asname} can be @code{None} if
the regular name is to be used.

@example
>>> print(ast.dump(ast.parse('from ..foo.bar import a as b, c'), indent=4))
Module(
    body=[
        ImportFrom(
            module='foo.bar',
            names=[
                alias(name='a', asname='b'),
                alias(name='c')],
            level=2)])
@end example
@end deffn

@node Control flow,Pattern matching,Statements,Node classes
@anchor{library/ast control-flow}@anchor{4f06}
@subsubsection Control flow


@cartouche
@quotation Note 
Optional clauses such as @code{else} are stored as an empty list if they’re
not present.
@end quotation
@end cartouche

@geindex If (class in ast)
@anchor{library/ast ast If}@anchor{4f07}
@deffn {Class} ast.If (test, body, orelse)

An @code{if} statement. @code{test} holds a single node, such as a @ref{4de4,,Compare}
node. @code{body} and @code{orelse} each hold a list of nodes.

@code{elif} clauses don’t have a special representation in the AST, but rather
appear as extra @code{If} nodes within the @code{orelse} section of the
previous one.

@example
>>> print(ast.dump(ast.parse("""
... if x:
...    ...
... elif y:
...    ...
... else:
...    ...
... """), indent=4))
Module(
    body=[
        If(
            test=Name(id='x', ctx=Load()),
            body=[
                Expr(
                    value=Constant(value=Ellipsis))],
            orelse=[
                If(
                    test=Name(id='y', ctx=Load()),
                    body=[
                        Expr(
                            value=Constant(value=Ellipsis))],
                    orelse=[
                        Expr(
                            value=Constant(value=Ellipsis))])])])
@end example
@end deffn

@geindex For (class in ast)
@anchor{library/ast ast For}@anchor{4f08}
@deffn {Class} ast.For (target, iter, body, orelse, type_comment)

A @code{for} loop. @code{target} holds the variable(s) the loop assigns to, as a
single @ref{1d66,,Name}, @ref{4df4,,Tuple}, @ref{4df3,,List}, @ref{4df0,,Attribute} or
@ref{4df1,,Subscript} node. @code{iter} holds the item to be looped over, again
as a single node. @code{body} and @code{orelse} contain lists of nodes to execute.
Those in @code{orelse} are executed if the loop finishes normally, rather than
via a @code{break} statement.

@geindex type_comment (ast.For attribute)
@anchor{library/ast ast For type_comment}@anchor{4f09}
@deffn {Attribute} type_comment

@code{type_comment} is an optional string with the type annotation as a comment.
@end deffn

@example
>>> print(ast.dump(ast.parse("""
... for x in y:
...     ...
... else:
...     ...
... """), indent=4))
Module(
    body=[
        For(
            target=Name(id='x', ctx=Store()),
            iter=Name(id='y', ctx=Load()),
            body=[
                Expr(
                    value=Constant(value=Ellipsis))],
            orelse=[
                Expr(
                    value=Constant(value=Ellipsis))])])
@end example
@end deffn

@geindex While (class in ast)
@anchor{library/ast ast While}@anchor{4f0a}
@deffn {Class} ast.While (test, body, orelse)

A @code{while} loop. @code{test} holds the condition, such as a @ref{4de4,,Compare}
node.

@example
>>> print(ast.dump(ast.parse("""
... while x:
...    ...
... else:
...    ...
... """), indent=4))
Module(
    body=[
        While(
            test=Name(id='x', ctx=Load()),
            body=[
                Expr(
                    value=Constant(value=Ellipsis))],
            orelse=[
                Expr(
                    value=Constant(value=Ellipsis))])])
@end example
@end deffn

@geindex Break (class in ast)
@geindex Continue (class in ast)
@anchor{library/ast ast Break}@anchor{4f0b}
@deffn {Class} ast.Break
@anchor{library/ast ast Continue}@anchor{4f0c}
@deffnx {Class} ast.Continue

The @code{break} and @code{continue} statements.

@example
>>> print(ast.dump(ast.parse("""\
... for a in b:
...     if a > 5:
...         break
...     else:
...         continue
...
... """), indent=4))
Module(
    body=[
        For(
            target=Name(id='a', ctx=Store()),
            iter=Name(id='b', ctx=Load()),
            body=[
                If(
                    test=Compare(
                        left=Name(id='a', ctx=Load()),
                        ops=[
                            Gt()],
                        comparators=[
                            Constant(value=5)]),
                    body=[
                        Break()],
                    orelse=[
                        Continue()])])])
@end example
@end deffn

@geindex Try (class in ast)
@anchor{library/ast ast Try}@anchor{4f0d}
@deffn {Class} ast.Try (body, handlers, orelse, finalbody)

@code{try} blocks. All attributes are list of nodes to execute, except for
@code{handlers}, which is a list of @ref{4f0e,,ExceptHandler} nodes.

@example
>>> print(ast.dump(ast.parse("""
... try:
...    ...
... except Exception:
...    ...
... except OtherException as e:
...    ...
... else:
...    ...
... finally:
...    ...
... """), indent=4))
Module(
    body=[
        Try(
            body=[
                Expr(
                    value=Constant(value=Ellipsis))],
            handlers=[
                ExceptHandler(
                    type=Name(id='Exception', ctx=Load()),
                    body=[
                        Expr(
                            value=Constant(value=Ellipsis))]),
                ExceptHandler(
                    type=Name(id='OtherException', ctx=Load()),
                    name='e',
                    body=[
                        Expr(
                            value=Constant(value=Ellipsis))])],
            orelse=[
                Expr(
                    value=Constant(value=Ellipsis))],
            finalbody=[
                Expr(
                    value=Constant(value=Ellipsis))])])
@end example
@end deffn

@geindex TryStar (class in ast)
@anchor{library/ast ast TryStar}@anchor{4f0f}
@deffn {Class} ast.TryStar (body, handlers, orelse, finalbody)

@code{try} blocks which are followed by @code{except*} clauses. The attributes are the
same as for @ref{4f0d,,Try} but the @ref{4f0e,,ExceptHandler} nodes in @code{handlers}
are interpreted as @code{except*} blocks rather then @code{except}.

@example
>>> print(ast.dump(ast.parse("""
... try:
...    ...
... except* Exception:
...    ...
... """), indent=4))
Module(
    body=[
        TryStar(
            body=[
                Expr(
                    value=Constant(value=Ellipsis))],
            handlers=[
                ExceptHandler(
                    type=Name(id='Exception', ctx=Load()),
                    body=[
                        Expr(
                            value=Constant(value=Ellipsis))])])])
@end example


Added in version 3.11.

@end deffn

@geindex ExceptHandler (class in ast)
@anchor{library/ast ast ExceptHandler}@anchor{4f0e}
@deffn {Class} ast.ExceptHandler (type, name, body)

A single @code{except} clause. @code{type} is the exception type it will match,
typically a @ref{1d66,,Name} node (or @code{None} for a catch-all @code{except:} clause).
@code{name} is a raw string for the name to hold the exception, or @code{None} if
the clause doesn’t have @code{as foo}. @code{body} is a list of nodes.

@example
>>> print(ast.dump(ast.parse("""\
... try:
...     a + 1
... except TypeError:
...     pass
... """), indent=4))
Module(
    body=[
        Try(
            body=[
                Expr(
                    value=BinOp(
                        left=Name(id='a', ctx=Load()),
                        op=Add(),
                        right=Constant(value=1)))],
            handlers=[
                ExceptHandler(
                    type=Name(id='TypeError', ctx=Load()),
                    body=[
                        Pass()])])])
@end example
@end deffn

@geindex With (class in ast)
@anchor{library/ast ast With}@anchor{4f10}
@deffn {Class} ast.With (items, body, type_comment)

A @code{with} block. @code{items} is a list of @ref{4f11,,withitem} nodes representing
the context managers, and @code{body} is the indented block inside the context.

@geindex type_comment (ast.With attribute)
@anchor{library/ast ast With type_comment}@anchor{4f12}
@deffn {Attribute} type_comment

@code{type_comment} is an optional string with the type annotation as a comment.
@end deffn
@end deffn

@geindex withitem (class in ast)
@anchor{library/ast ast withitem}@anchor{4f11}
@deffn {Class} ast.withitem (context_expr, optional_vars)

A single context manager in a @code{with} block. @code{context_expr} is the context
manager, often a @ref{4def,,Call} node. @code{optional_vars} is a @ref{1d66,,Name},
@ref{4df4,,Tuple} or @ref{4df3,,List} for the @code{as foo} part, or @code{None} if that
isn’t used.

@example
>>> print(ast.dump(ast.parse("""\
... with a as b, c as d:
...    something(b, d)
... """), indent=4))
Module(
    body=[
        With(
            items=[
                withitem(
                    context_expr=Name(id='a', ctx=Load()),
                    optional_vars=Name(id='b', ctx=Store())),
                withitem(
                    context_expr=Name(id='c', ctx=Load()),
                    optional_vars=Name(id='d', ctx=Store()))],
            body=[
                Expr(
                    value=Call(
                        func=Name(id='something', ctx=Load()),
                        args=[
                            Name(id='b', ctx=Load()),
                            Name(id='d', ctx=Load())]))])])
@end example
@end deffn

@node Pattern matching,Type annotations,Control flow,Node classes
@anchor{library/ast pattern-matching}@anchor{4f13}
@subsubsection Pattern matching


@geindex Match (class in ast)
@anchor{library/ast ast Match}@anchor{4f14}
@deffn {Class} ast.Match (subject, cases)

A @code{match} statement. @code{subject} holds the subject of the match (the object
that is being matched against the cases) and @code{cases} contains an iterable of
@ref{4f15,,match_case} nodes with the different cases.


Added in version 3.10.

@end deffn

@geindex match_case (class in ast)
@anchor{library/ast ast match_case}@anchor{4f15}
@deffn {Class} ast.match_case (pattern, guard, body)

A single case pattern in a @code{match} statement. @code{pattern} contains the
match pattern that the subject will be matched against. Note that the
@ref{4c4,,AST} nodes produced for patterns differ from those produced for
expressions, even when they share the same syntax.

The @code{guard} attribute contains an expression that will be evaluated if
the pattern matches the subject.

@code{body} contains a list of nodes to execute if the pattern matches and
the result of evaluating the guard expression is true.

@example
>>> print(ast.dump(ast.parse("""
... match x:
...     case [x] if x>0:
...         ...
...     case tuple():
...         ...
... """), indent=4))
Module(
    body=[
        Match(
            subject=Name(id='x', ctx=Load()),
            cases=[
                match_case(
                    pattern=MatchSequence(
                        patterns=[
                            MatchAs(name='x')]),
                    guard=Compare(
                        left=Name(id='x', ctx=Load()),
                        ops=[
                            Gt()],
                        comparators=[
                            Constant(value=0)]),
                    body=[
                        Expr(
                            value=Constant(value=Ellipsis))]),
                match_case(
                    pattern=MatchClass(
                        cls=Name(id='tuple', ctx=Load())),
                    body=[
                        Expr(
                            value=Constant(value=Ellipsis))])])])
@end example


Added in version 3.10.

@end deffn

@geindex MatchValue (class in ast)
@anchor{library/ast ast MatchValue}@anchor{4f16}
@deffn {Class} ast.MatchValue (value)

A match literal or value pattern that compares by equality. @code{value} is
an expression node. Permitted value nodes are restricted as described in
the match statement documentation. This pattern succeeds if the match
subject is equal to the evaluated value.

@example
>>> print(ast.dump(ast.parse("""
... match x:
...     case "Relevant":
...         ...
... """), indent=4))
Module(
    body=[
        Match(
            subject=Name(id='x', ctx=Load()),
            cases=[
                match_case(
                    pattern=MatchValue(
                        value=Constant(value='Relevant')),
                    body=[
                        Expr(
                            value=Constant(value=Ellipsis))])])])
@end example


Added in version 3.10.

@end deffn

@geindex MatchSingleton (class in ast)
@anchor{library/ast ast MatchSingleton}@anchor{4f17}
@deffn {Class} ast.MatchSingleton (value)

A match literal pattern that compares by identity. @code{value} is the
singleton to be compared against: @code{None}, @code{True}, or @code{False}. This
pattern succeeds if the match subject is the given constant.

@example
>>> print(ast.dump(ast.parse("""
... match x:
...     case None:
...         ...
... """), indent=4))
Module(
    body=[
        Match(
            subject=Name(id='x', ctx=Load()),
            cases=[
                match_case(
                    pattern=MatchSingleton(value=None),
                    body=[
                        Expr(
                            value=Constant(value=Ellipsis))])])])
@end example


Added in version 3.10.

@end deffn

@geindex MatchSequence (class in ast)
@anchor{library/ast ast MatchSequence}@anchor{4f18}
@deffn {Class} ast.MatchSequence (patterns)

A match sequence pattern. @code{patterns} contains the patterns to be matched
against the subject elements if the subject is a sequence. Matches a variable
length sequence if one of the subpatterns is a @code{MatchStar} node, otherwise
matches a fixed length sequence.

@example
>>> print(ast.dump(ast.parse("""
... match x:
...     case [1, 2]:
...         ...
... """), indent=4))
Module(
    body=[
        Match(
            subject=Name(id='x', ctx=Load()),
            cases=[
                match_case(
                    pattern=MatchSequence(
                        patterns=[
                            MatchValue(
                                value=Constant(value=1)),
                            MatchValue(
                                value=Constant(value=2))]),
                    body=[
                        Expr(
                            value=Constant(value=Ellipsis))])])])
@end example


Added in version 3.10.

@end deffn

@geindex MatchStar (class in ast)
@anchor{library/ast ast MatchStar}@anchor{4f19}
@deffn {Class} ast.MatchStar (name)

Matches the rest of the sequence in a variable length match sequence pattern.
If @code{name} is not @code{None}, a list containing the remaining sequence
elements is bound to that name if the overall sequence pattern is successful.

@example
>>> print(ast.dump(ast.parse("""
... match x:
...     case [1, 2, *rest]:
...         ...
...     case [*_]:
...         ...
... """), indent=4))
Module(
    body=[
        Match(
            subject=Name(id='x', ctx=Load()),
            cases=[
                match_case(
                    pattern=MatchSequence(
                        patterns=[
                            MatchValue(
                                value=Constant(value=1)),
                            MatchValue(
                                value=Constant(value=2)),
                            MatchStar(name='rest')]),
                    body=[
                        Expr(
                            value=Constant(value=Ellipsis))]),
                match_case(
                    pattern=MatchSequence(
                        patterns=[
                            MatchStar()]),
                    body=[
                        Expr(
                            value=Constant(value=Ellipsis))])])])
@end example


Added in version 3.10.

@end deffn

@geindex MatchMapping (class in ast)
@anchor{library/ast ast MatchMapping}@anchor{4f1a}
@deffn {Class} ast.MatchMapping (keys, patterns, rest)

A match mapping pattern. @code{keys} is a sequence of expression nodes.
@code{patterns} is a corresponding sequence of pattern nodes. @code{rest} is an
optional name that can be specified to capture the remaining mapping elements.
Permitted key expressions are restricted as described in the match statement
documentation.

This pattern succeeds if the subject is a mapping, all evaluated key
expressions are present in the mapping, and the value corresponding to each
key matches the corresponding subpattern. If @code{rest} is not @code{None}, a dict
containing the remaining mapping elements is bound to that name if the overall
mapping pattern is successful.

@example
>>> print(ast.dump(ast.parse("""
... match x:
...     case @{1: _, 2: _@}:
...         ...
...     case @{**rest@}:
...         ...
... """), indent=4))
Module(
    body=[
        Match(
            subject=Name(id='x', ctx=Load()),
            cases=[
                match_case(
                    pattern=MatchMapping(
                        keys=[
                            Constant(value=1),
                            Constant(value=2)],
                        patterns=[
                            MatchAs(),
                            MatchAs()]),
                    body=[
                        Expr(
                            value=Constant(value=Ellipsis))]),
                match_case(
                    pattern=MatchMapping(rest='rest'),
                    body=[
                        Expr(
                            value=Constant(value=Ellipsis))])])])
@end example


Added in version 3.10.

@end deffn

@geindex MatchClass (class in ast)
@anchor{library/ast ast MatchClass}@anchor{4f1b}
@deffn {Class} ast.MatchClass (cls, patterns, kwd_attrs, kwd_patterns)

A match class pattern. @code{cls} is an expression giving the nominal class to
be matched. @code{patterns} is a sequence of pattern nodes to be matched against
the class defined sequence of pattern matching attributes. @code{kwd_attrs} is a
sequence of additional attributes to be matched (specified as keyword arguments
in the class pattern), @code{kwd_patterns} are the corresponding patterns
(specified as keyword values in the class pattern).

This pattern succeeds if the subject is an instance of the nominated class,
all positional patterns match the corresponding class-defined attributes, and
any specified keyword attributes match their corresponding pattern.

Note: classes may define a property that returns self in order to match a
pattern node against the instance being matched. Several builtin types are
also matched that way, as described in the match statement documentation.

@example
>>> print(ast.dump(ast.parse("""
... match x:
...     case Point2D(0, 0):
...         ...
...     case Point3D(x=0, y=0, z=0):
...         ...
... """), indent=4))
Module(
    body=[
        Match(
            subject=Name(id='x', ctx=Load()),
            cases=[
                match_case(
                    pattern=MatchClass(
                        cls=Name(id='Point2D', ctx=Load()),
                        patterns=[
                            MatchValue(
                                value=Constant(value=0)),
                            MatchValue(
                                value=Constant(value=0))]),
                    body=[
                        Expr(
                            value=Constant(value=Ellipsis))]),
                match_case(
                    pattern=MatchClass(
                        cls=Name(id='Point3D', ctx=Load()),
                        kwd_attrs=[
                            'x',
                            'y',
                            'z'],
                        kwd_patterns=[
                            MatchValue(
                                value=Constant(value=0)),
                            MatchValue(
                                value=Constant(value=0)),
                            MatchValue(
                                value=Constant(value=0))]),
                    body=[
                        Expr(
                            value=Constant(value=Ellipsis))])])])
@end example


Added in version 3.10.

@end deffn

@geindex MatchAs (class in ast)
@anchor{library/ast ast MatchAs}@anchor{4f1c}
@deffn {Class} ast.MatchAs (pattern, name)

A match “as-pattern”, capture pattern or wildcard pattern. @code{pattern}
contains the match pattern that the subject will be matched against.
If the pattern is @code{None}, the node represents a capture pattern (i.e a
bare name) and will always succeed.

The @code{name} attribute contains the name that will be bound if the pattern
is successful. If @code{name} is @code{None}, @code{pattern} must also be @code{None}
and the node represents the wildcard pattern.

@example
>>> print(ast.dump(ast.parse("""
... match x:
...     case [x] as y:
...         ...
...     case _:
...         ...
... """), indent=4))
Module(
    body=[
        Match(
            subject=Name(id='x', ctx=Load()),
            cases=[
                match_case(
                    pattern=MatchAs(
                        pattern=MatchSequence(
                            patterns=[
                                MatchAs(name='x')]),
                        name='y'),
                    body=[
                        Expr(
                            value=Constant(value=Ellipsis))]),
                match_case(
                    pattern=MatchAs(),
                    body=[
                        Expr(
                            value=Constant(value=Ellipsis))])])])
@end example


Added in version 3.10.

@end deffn

@geindex MatchOr (class in ast)
@anchor{library/ast ast MatchOr}@anchor{4f1d}
@deffn {Class} ast.MatchOr (patterns)

A match “or-pattern”. An or-pattern matches each of its subpatterns in turn
to the subject, until one succeeds. The or-pattern is then deemed to
succeed. If none of the subpatterns succeed the or-pattern fails. The
@code{patterns} attribute contains a list of match pattern nodes that will be
matched against the subject.

@example
>>> print(ast.dump(ast.parse("""
... match x:
...     case [x] | (y):
...         ...
... """), indent=4))
Module(
    body=[
        Match(
            subject=Name(id='x', ctx=Load()),
            cases=[
                match_case(
                    pattern=MatchOr(
                        patterns=[
                            MatchSequence(
                                patterns=[
                                    MatchAs(name='x')]),
                            MatchAs(name='y')]),
                    body=[
                        Expr(
                            value=Constant(value=Ellipsis))])])])
@end example


Added in version 3.10.

@end deffn

@node Type annotations,Type parameters,Pattern matching,Node classes
@anchor{library/ast type-annotations}@anchor{4f1e}
@subsubsection Type annotations


@geindex TypeIgnore (class in ast)
@anchor{library/ast ast TypeIgnore}@anchor{1b52}
@deffn {Class} ast.TypeIgnore (lineno, tag)

A @code{# type: ignore} comment located at `lineno'.
`tag' is the optional tag specified by the form @code{# type: ignore <tag>}.

@example
>>> print(ast.dump(ast.parse('x = 1 # type: ignore', type_comments=True), indent=4))
Module(
    body=[
        Assign(
            targets=[
                Name(id='x', ctx=Store())],
            value=Constant(value=1))],
    type_ignores=[
        TypeIgnore(lineno=1, tag='@w{'})])
>>> print(ast.dump(ast.parse('x: bool = 1 # type: ignore[assignment]', type_comments=True), indent=4))
Module(
    body=[
        AnnAssign(
            target=Name(id='x', ctx=Store()),
            annotation=Name(id='bool', ctx=Load()),
            value=Constant(value=1),
            simple=1)],
    type_ignores=[
        TypeIgnore(lineno=1, tag='[assignment]')])
@end example

@cartouche
@quotation Note 
@code{TypeIgnore} nodes are not generated when the `type_comments' parameter
is set to @code{False} (default).  See @ref{1c4,,ast.parse()} for more details.
@end quotation
@end cartouche


Added in version 3.8.

@end deffn

@node Type parameters,Function and class definitions,Type annotations,Node classes
@anchor{library/ast ast-type-params}@anchor{4f02}@anchor{library/ast type-parameters}@anchor{4f1f}
@subsubsection Type parameters


@ref{5ad,,Type parameters} can exist on classes, functions, and type
aliases.

@geindex TypeVar (class in ast)
@anchor{library/ast ast TypeVar}@anchor{4f20}
@deffn {Class} ast.TypeVar (name, bound, default_value)

A @ref{487,,typing.TypeVar}. @code{name} is the name of the type variable.
@code{bound} is the bound or constraints, if any. If @code{bound} is a @ref{4df4,,Tuple},
it represents constraints; otherwise it represents the bound. @code{default_value}
is the default value; if the @code{TypeVar} has no default, this
attribute will be set to @code{None}.

@example
>>> print(ast.dump(ast.parse("type Alias[T: int = bool] = list[T]"), indent=4))
Module(
    body=[
        TypeAlias(
            name=Name(id='Alias', ctx=Store()),
            type_params=[
                TypeVar(
                    name='T',
                    bound=Name(id='int', ctx=Load()),
                    default_value=Name(id='bool', ctx=Load()))],
            value=Subscript(
                value=Name(id='list', ctx=Load()),
                slice=Name(id='T', ctx=Load()),
                ctx=Load()))])
@end example


Added in version 3.12.



Changed in version 3.13: Added the `default_value' parameter.

@end deffn

@geindex ParamSpec (class in ast)
@anchor{library/ast ast ParamSpec}@anchor{4f21}
@deffn {Class} ast.ParamSpec (name, default_value)

A @ref{488,,typing.ParamSpec}. @code{name} is the name of the parameter specification.
@code{default_value} is the default value; if the @code{ParamSpec} has no default,
this attribute will be set to @code{None}.

@example
>>> print(ast.dump(ast.parse("type Alias[**P = [int, str]] = Callable[P, int]"), indent=4))
Module(
    body=[
        TypeAlias(
            name=Name(id='Alias', ctx=Store()),
            type_params=[
                ParamSpec(
                    name='P',
                    default_value=List(
                        elts=[
                            Name(id='int', ctx=Load()),
                            Name(id='str', ctx=Load())],
                        ctx=Load()))],
            value=Subscript(
                value=Name(id='Callable', ctx=Load()),
                slice=Tuple(
                    elts=[
                        Name(id='P', ctx=Load()),
                        Name(id='int', ctx=Load())],
                    ctx=Load()),
                ctx=Load()))])
@end example


Added in version 3.12.



Changed in version 3.13: Added the `default_value' parameter.

@end deffn

@geindex TypeVarTuple (class in ast)
@anchor{library/ast ast TypeVarTuple}@anchor{4f22}
@deffn {Class} ast.TypeVarTuple (name, default_value)

A @ref{489,,typing.TypeVarTuple}. @code{name} is the name of the type variable tuple.
@code{default_value} is the default value; if the @code{TypeVarTuple} has no
default, this attribute will be set to @code{None}.

@example
>>> print(ast.dump(ast.parse("type Alias[*Ts = ()] = tuple[*Ts]"), indent=4))
Module(
    body=[
        TypeAlias(
            name=Name(id='Alias', ctx=Store()),
            type_params=[
                TypeVarTuple(
                    name='Ts',
                    default_value=Tuple(ctx=Load()))],
            value=Subscript(
                value=Name(id='tuple', ctx=Load()),
                slice=Tuple(
                    elts=[
                        Starred(
                            value=Name(id='Ts', ctx=Load()),
                            ctx=Load())],
                    ctx=Load()),
                ctx=Load()))])
@end example


Added in version 3.12.



Changed in version 3.13: Added the `default_value' parameter.

@end deffn

@node Function and class definitions,Async and await,Type parameters,Node classes
@anchor{library/ast function-and-class-definitions}@anchor{4f23}
@subsubsection Function and class definitions


@geindex FunctionDef (class in ast)
@anchor{library/ast ast FunctionDef}@anchor{1abe}
@deffn {Class} ast.FunctionDef (name, args, body, decorator_list, returns, type_comment, type_params)

A function definition.


@itemize *

@item 
@code{name} is a raw string of the function name.

@item 
@code{args} is an @ref{4f24,,arguments} node.

@item 
@code{body} is the list of nodes inside the function.

@item 
@code{decorator_list} is the list of decorators to be applied, stored outermost
first (i.e. the first in the list will be applied last).

@item 
@code{returns} is the return annotation.

@item 
@code{type_params} is a list of @ref{4f02,,type parameters}.
@end itemize

@geindex type_comment (ast.FunctionDef attribute)
@anchor{library/ast ast FunctionDef type_comment}@anchor{4f25}
@deffn {Attribute} type_comment

@code{type_comment} is an optional string with the type annotation as a comment.
@end deffn


Changed in version 3.12: Added @code{type_params}.

@end deffn

@geindex Lambda (class in ast)
@anchor{library/ast ast Lambda}@anchor{4df9}
@deffn {Class} ast.Lambda (args, body)

@code{lambda} is a minimal function definition that can be used inside an
expression. Unlike @ref{1abe,,FunctionDef}, @code{body} holds a single node.

@example
>>> print(ast.dump(ast.parse('lambda x,y: ...'), indent=4))
Module(
    body=[
        Expr(
            value=Lambda(
                args=arguments(
                    args=[
                        arg(arg='x'),
                        arg(arg='y')]),
                body=Constant(value=Ellipsis)))])
@end example
@end deffn

@geindex arguments (class in ast)
@anchor{library/ast ast arguments}@anchor{4f24}
@deffn {Class} ast.arguments (posonlyargs, args, vararg, kwonlyargs, kw_defaults, kwarg, defaults)

The arguments for a function.


@itemize *

@item 
@code{posonlyargs}, @code{args} and @code{kwonlyargs} are lists of @ref{4f26,,arg} nodes.

@item 
@code{vararg} and @code{kwarg} are single @ref{4f26,,arg} nodes, referring to the
@code{*args, **kwargs} parameters.

@item 
@code{kw_defaults} is a list of default values for keyword-only arguments. If
one is @code{None}, the corresponding argument is required.

@item 
@code{defaults} is a list of default values for arguments that can be passed
positionally. If there are fewer defaults, they correspond to the last n
arguments.
@end itemize
@end deffn

@geindex arg (class in ast)
@anchor{library/ast ast arg}@anchor{4f26}
@deffn {Class} ast.arg (arg, annotation, type_comment)

A single argument in a list. @code{arg} is a raw string of the argument
name; @code{annotation} is its annotation, such as a @ref{1d66,,Name} node.

@geindex type_comment (ast.arg attribute)
@anchor{library/ast ast arg type_comment}@anchor{4f27}
@deffn {Attribute} type_comment

@code{type_comment} is an optional string with the type annotation as a comment
@end deffn

@example
>>> print(ast.dump(ast.parse("""\
... @@decorator1
... @@decorator2
... def f(a: 'annotation', b=1, c=2, *d, e, f=3, **g) -> 'return annotation':
...     pass
... """), indent=4))
Module(
    body=[
        FunctionDef(
            name='f',
            args=arguments(
                args=[
                    arg(
                        arg='a',
                        annotation=Constant(value='annotation')),
                    arg(arg='b'),
                    arg(arg='c')],
                vararg=arg(arg='d'),
                kwonlyargs=[
                    arg(arg='e'),
                    arg(arg='f')],
                kw_defaults=[
                    None,
                    Constant(value=3)],
                kwarg=arg(arg='g'),
                defaults=[
                    Constant(value=1),
                    Constant(value=2)]),
            body=[
                Pass()],
            decorator_list=[
                Name(id='decorator1', ctx=Load()),
                Name(id='decorator2', ctx=Load())],
            returns=Constant(value='return annotation'))])
@end example
@end deffn

@geindex Return (class in ast)
@anchor{library/ast ast Return}@anchor{4f28}
@deffn {Class} ast.Return (value)

A @code{return} statement.

@example
>>> print(ast.dump(ast.parse('return 4'), indent=4))
Module(
    body=[
        Return(
            value=Constant(value=4))])
@end example
@end deffn

@geindex Yield (class in ast)
@geindex YieldFrom (class in ast)
@anchor{library/ast ast Yield}@anchor{4e00}
@deffn {Class} ast.Yield (value)
@anchor{library/ast ast YieldFrom}@anchor{4e01}
@deffnx {Class} ast.YieldFrom (value)

A @code{yield} or @code{yield from} expression. Because these are expressions, they
must be wrapped in an @ref{4ee5,,Expr} node if the value sent back is not used.

@example
>>> print(ast.dump(ast.parse('yield x'), indent=4))
Module(
    body=[
        Expr(
            value=Yield(
                value=Name(id='x', ctx=Load())))])

>>> print(ast.dump(ast.parse('yield from x'), indent=4))
Module(
    body=[
        Expr(
            value=YieldFrom(
                value=Name(id='x', ctx=Load())))])
@end example
@end deffn

@geindex Global (class in ast)
@geindex Nonlocal (class in ast)
@anchor{library/ast ast Global}@anchor{4f29}
@deffn {Class} ast.Global (names)
@anchor{library/ast ast Nonlocal}@anchor{4f2a}
@deffnx {Class} ast.Nonlocal (names)

@code{global} and @code{nonlocal} statements. @code{names} is a list of raw strings.

@example
>>> print(ast.dump(ast.parse('global x,y,z'), indent=4))
Module(
    body=[
        Global(
            names=[
                'x',
                'y',
                'z'])])

>>> print(ast.dump(ast.parse('nonlocal x,y,z'), indent=4))
Module(
    body=[
        Nonlocal(
            names=[
                'x',
                'y',
                'z'])])
@end example
@end deffn

@geindex ClassDef (class in ast)
@anchor{library/ast ast ClassDef}@anchor{1abc}
@deffn {Class} ast.ClassDef (name, bases, keywords, body, decorator_list, type_params)

A class definition.


@itemize *

@item 
@code{name} is a raw string for the class name

@item 
@code{bases} is a list of nodes for explicitly specified base classes.

@item 
@code{keywords} is a list of @ref{4ef5,,keyword} nodes, principally for ‘metaclass’.
Other keywords will be passed to the metaclass, as per 
@geindex Python Enhancement Proposals; PEP 3115
PEP 3115@footnote{https://peps.python.org/pep-3115/}.

@item 
@code{body} is a list of nodes representing the code within the class
definition.

@item 
@code{decorator_list} is a list of nodes, as in @ref{1abe,,FunctionDef}.

@item 
@code{type_params} is a list of @ref{4f02,,type parameters}.
@end itemize

@example
>>> print(ast.dump(ast.parse("""\
... @@decorator1
... @@decorator2
... class Foo(base1, base2, metaclass=meta):
...     pass
... """), indent=4))
Module(
    body=[
        ClassDef(
            name='Foo',
            bases=[
                Name(id='base1', ctx=Load()),
                Name(id='base2', ctx=Load())],
            keywords=[
                keyword(
                    arg='metaclass',
                    value=Name(id='meta', ctx=Load()))],
            body=[
                Pass()],
            decorator_list=[
                Name(id='decorator1', ctx=Load()),
                Name(id='decorator2', ctx=Load())])])
@end example


Changed in version 3.12: Added @code{type_params}.

@end deffn

@node Async and await,,Function and class definitions,Node classes
@anchor{library/ast async-and-await}@anchor{4f2b}
@subsubsection Async and await


@geindex AsyncFunctionDef (class in ast)
@anchor{library/ast ast AsyncFunctionDef}@anchor{1abd}
@deffn {Class} ast.AsyncFunctionDef (name, args, body, decorator_list, returns, type_comment, type_params)

An @code{async def} function definition. Has the same fields as
@ref{1abe,,FunctionDef}.


Changed in version 3.12: Added @code{type_params}.

@end deffn

@geindex Await (class in ast)
@anchor{library/ast ast Await}@anchor{4dff}
@deffn {Class} ast.Await (value)

An @code{await} expression. @code{value} is what it waits for.
Only valid in the body of an @ref{1abd,,AsyncFunctionDef}.
@end deffn

@example
>>> print(ast.dump(ast.parse("""\
... async def f():
...     await other_func()
... """), indent=4))
Module(
    body=[
        AsyncFunctionDef(
            name='f',
            args=arguments(),
            body=[
                Expr(
                    value=Await(
                        value=Call(
                            func=Name(id='other_func', ctx=Load()))))])])
@end example

@geindex AsyncFor (class in ast)
@geindex AsyncWith (class in ast)
@anchor{library/ast ast AsyncFor}@anchor{4f2c}
@deffn {Class} ast.AsyncFor (target, iter, body, orelse, type_comment)
@anchor{library/ast ast AsyncWith}@anchor{4f2d}
@deffnx {Class} ast.AsyncWith (items, body, type_comment)

@code{async for} loops and @code{async with} context managers. They have the same
fields as @ref{4f08,,For} and @ref{4f10,,With}, respectively. Only valid in the
body of an @ref{1abd,,AsyncFunctionDef}.
@end deffn

@cartouche
@quotation Note 
When a string is parsed by @ref{1c4,,ast.parse()}, operator nodes (subclasses
of @code{ast.operator}, @code{ast.unaryop}, @code{ast.cmpop},
@code{ast.boolop} and @code{ast.expr_context}) on the returned tree
will be singletons. Changes to one will be reflected in all other
occurrences of the same value (for example, @ref{4ee6,,ast.Add}).
@end quotation
@end cartouche

@node ast helpers,Compiler flags<2>,Node classes,ast — Abstract syntax trees
@anchor{library/ast ast-helpers}@anchor{4f2e}
@subsubsection @code{ast} helpers


Apart from the node classes, the @code{ast} module defines these utility functions
and classes for traversing abstract syntax trees:

@geindex parse() (in module ast)
@anchor{library/ast ast parse}@anchor{1c4}
@deffn {Function} ast.parse (source, filename='<unknown>', mode='exec', *, type_comments=False, feature_version=None, optimize=-1)

Parse the source into an AST node.  Equivalent to @code{compile(source,
filename, mode, flags=FLAGS_VALUE, optimize=optimize)},
where @code{FLAGS_VALUE} is @code{ast.PyCF_ONLY_AST} if @code{optimize <= 0}
and @code{ast.PyCF_OPTIMIZED_AST} otherwise.

If @code{type_comments=True} is given, the parser is modified to check
and return type comments as specified by 
@geindex Python Enhancement Proposals; PEP 484
PEP 484@footnote{https://peps.python.org/pep-0484/} and 
@geindex Python Enhancement Proposals; PEP 526
PEP 526@footnote{https://peps.python.org/pep-0526/}.
This is equivalent to adding @ref{4f2f,,ast.PyCF_TYPE_COMMENTS} to the
flags passed to @ref{4b2,,compile()}.  This will report syntax errors
for misplaced type comments.  Without this flag, type comments will
be ignored, and the @code{type_comment} field on selected AST nodes
will always be @code{None}.  In addition, the locations of @code{# type:
ignore} comments will be returned as the @code{type_ignores}
attribute of @ref{4eda,,Module} (otherwise it is always an empty list).

In addition, if @code{mode} is @code{'func_type'}, the input syntax is
modified to correspond to 
@geindex Python Enhancement Proposals; PEP 484
PEP 484@footnote{https://peps.python.org/pep-0484/} “signature type comments”,
e.g. @code{(str, int) -> List[str]}.

Setting @code{feature_version} to a tuple @code{(major, minor)} will result in
a “best-effort” attempt to parse using that Python version’s grammar.
For example, setting @code{feature_version=(3, 9)} will attempt to disallow
parsing of @ref{a14,,match} statements.
Currently @code{major} must equal to @code{3}. The lowest supported version is
@code{(3, 7)} (and this may increase in future Python versions);
the highest is @code{sys.version_info[0:2]}. “Best-effort” attempt means there
is no guarantee that the parse (or success of the parse) is the same as
when run on the Python version corresponding to @code{feature_version}.

If source contains a null character (@code{\0}), @ref{2ee,,ValueError} is raised.

@cartouche
@quotation Warning 
Note that successfully parsing source code into an AST object doesn’t
guarantee that the source code provided is valid Python code that can
be executed as the compilation step can raise further @ref{18f,,SyntaxError}
exceptions. For instance, the source @code{return 42} generates a valid
AST node for a return statement, but it cannot be compiled alone (it needs
to be inside a function node).

In particular, @code{ast.parse()} won’t do any scoping checks, which the
compilation step does.
@end quotation
@end cartouche

@cartouche
@quotation Warning 
It is possible to crash the Python interpreter with a
sufficiently large/complex string due to stack depth limitations
in Python’s AST compiler.
@end quotation
@end cartouche


Changed in version 3.8: Added @code{type_comments}, @code{mode='func_type'} and @code{feature_version}.



Changed in version 3.13: The minimum supported version for @code{feature_version} is now @code{(3, 7)}.
The @code{optimize} argument was added.

@end deffn

@geindex unparse() (in module ast)
@anchor{library/ast ast unparse}@anchor{ae8}
@deffn {Function} ast.unparse (ast_obj)

Unparse an @ref{4c4,,ast.AST} object and generate a string with code
that would produce an equivalent @code{ast.AST} object if parsed
back with @ref{1c4,,ast.parse()}.

@cartouche
@quotation Warning 
The produced code string will not necessarily be equal to the original
code that generated the @ref{4c4,,ast.AST} object (without any compiler
optimizations, such as constant tuples/frozensets).
@end quotation
@end cartouche

@cartouche
@quotation Warning 
Trying to unparse a highly complex expression would result with
@ref{f6e,,RecursionError}.
@end quotation
@end cartouche


Added in version 3.9.

@end deffn

@geindex literal_eval() (in module ast)
@anchor{library/ast ast literal_eval}@anchor{e18}
@deffn {Function} ast.literal_eval (node_or_string)

Evaluate an expression node or a string containing only a Python literal or
container display.  The string or node provided may only consist of the
following Python literal structures: strings, bytes, numbers, tuples, lists,
dicts, sets, booleans, @code{None} and @code{Ellipsis}.

This can be used for evaluating strings containing Python values without the
need to parse the values oneself.  It is not capable of evaluating
arbitrarily complex expressions, for example involving operators or
indexing.

This function had been documented as “safe” in the past without defining
what that meant. That was misleading. This is specifically designed not to
execute Python code, unlike the more general @ref{4a4,,eval()}. There is no
namespace, no name lookups, or ability to call out. But it is not free from
attack: A relatively small input can lead to memory exhaustion or to C stack
exhaustion, crashing the process. There is also the possibility for
excessive CPU consumption denial of service on some inputs. Calling it on
untrusted data is thus not recommended.

@cartouche
@quotation Warning 
It is possible to crash the Python interpreter due to stack depth
limitations in Python’s AST compiler.

It can raise @ref{2ee,,ValueError}, @ref{199,,TypeError}, @ref{18f,,SyntaxError},
@ref{1761,,MemoryError} and @ref{f6e,,RecursionError} depending on the malformed
input.
@end quotation
@end cartouche


Changed in version 3.2: Now allows bytes and set literals.



Changed in version 3.9: Now supports creating empty sets with @code{'set()'}.



Changed in version 3.10: For string inputs, leading spaces and tabs are now stripped.

@end deffn

@geindex get_docstring() (in module ast)
@anchor{library/ast ast get_docstring}@anchor{1e7d}
@deffn {Function} ast.get_docstring (node, clean=True)

Return the docstring of the given `node' (which must be a
@ref{1abe,,FunctionDef}, @ref{1abd,,AsyncFunctionDef}, @ref{1abc,,ClassDef},
or @ref{4eda,,Module} node), or @code{None} if it has no docstring.
If `clean' is true, clean up the docstring’s indentation with
@ref{1a73,,inspect.cleandoc()}.


Changed in version 3.5: @ref{1abd,,AsyncFunctionDef} is now supported.

@end deffn

@geindex get_source_segment() (in module ast)
@anchor{library/ast ast get_source_segment}@anchor{bd1}
@deffn {Function} ast.get_source_segment (source, node, *, padded=False)

Get source code segment of the `source' that generated `node'.
If some location information (@ref{4ed4,,lineno}, @ref{4ed6,,end_lineno},
@ref{4ed5,,col_offset}, or @ref{4ed7,,end_col_offset}) is missing, return @code{None}.

If `padded' is @code{True}, the first line of a multi-line statement will
be padded with spaces to match its original position.


Added in version 3.8.

@end deffn

@geindex fix_missing_locations() (in module ast)
@anchor{library/ast ast fix_missing_locations}@anchor{4f30}
@deffn {Function} ast.fix_missing_locations (node)

When you compile a node tree with @ref{4b2,,compile()}, the compiler expects
@ref{4ed4,,lineno} and @ref{4ed5,,col_offset} attributes for every node that supports
them.  This is rather tedious to fill in for generated nodes, so this helper
adds these attributes recursively where not already set, by setting them to
the values of the parent node.  It works recursively starting at `node'.
@end deffn

@geindex increment_lineno() (in module ast)
@anchor{library/ast ast increment_lineno}@anchor{1b51}
@deffn {Function} ast.increment_lineno (node, n=1)

Increment the line number and end line number of each node in the tree
starting at `node' by `n'. This is useful to “move code” to a different
location in a file.
@end deffn

@geindex copy_location() (in module ast)
@anchor{library/ast ast copy_location}@anchor{4f31}
@deffn {Function} ast.copy_location (new_node, old_node)

Copy source location (@ref{4ed4,,lineno}, @ref{4ed5,,col_offset}, @ref{4ed6,,end_lineno},
and @ref{4ed7,,end_col_offset}) from `old_node' to `new_node' if possible,
and return `new_node'.
@end deffn

@geindex iter_fields() (in module ast)
@anchor{library/ast ast iter_fields}@anchor{4f32}
@deffn {Function} ast.iter_fields (node)

Yield a tuple of @code{(fieldname, value)} for each field in @code{node._fields}
that is present on `node'.
@end deffn

@geindex iter_child_nodes() (in module ast)
@anchor{library/ast ast iter_child_nodes}@anchor{4f33}
@deffn {Function} ast.iter_child_nodes (node)

Yield all direct child nodes of `node', that is, all fields that are nodes
and all items of fields that are lists of nodes.
@end deffn

@geindex walk() (in module ast)
@anchor{library/ast ast walk}@anchor{4f34}
@deffn {Function} ast.walk (node)

Recursively yield all descendant nodes in the tree starting at `node'
(including `node' itself), in no specified order.  This is useful if you only
want to modify nodes in place and don’t care about the context.
@end deffn

@geindex NodeVisitor (class in ast)
@anchor{library/ast ast NodeVisitor}@anchor{2f2}
@deffn {Class} ast.NodeVisitor

A node visitor base class that walks the abstract syntax tree and calls a
visitor function for every node found.  This function may return a value
which is forwarded by the @ref{4f35,,visit()} method.

This class is meant to be subclassed, with the subclass adding visitor
methods.

@geindex visit() (ast.NodeVisitor method)
@anchor{library/ast ast NodeVisitor visit}@anchor{4f35}
@deffn {Method} visit (node)

Visit a node.  The default implementation calls the method called
@code{self.visit_@var{classname}} where `classname' is the name of the node
class, or @ref{4f36,,generic_visit()} if that method doesn’t exist.
@end deffn

@geindex generic_visit() (ast.NodeVisitor method)
@anchor{library/ast ast NodeVisitor generic_visit}@anchor{4f36}
@deffn {Method} generic_visit (node)

This visitor calls @ref{4f35,,visit()} on all children of the node.

Note that child nodes of nodes that have a custom visitor method won’t be
visited unless the visitor calls @code{generic_visit()} or visits them
itself.
@end deffn

@geindex visit_Constant() (ast.NodeVisitor method)
@anchor{library/ast ast NodeVisitor visit_Constant}@anchor{c69}
@deffn {Method} visit_Constant (node)

Handles all constant nodes.
@end deffn

Don’t use the @code{NodeVisitor} if you want to apply changes to nodes
during traversal.  For this a special visitor exists
(@ref{4f37,,NodeTransformer}) that allows modifications.


Deprecated since version 3.8, removed in version 3.14: Methods @code{visit_Num()}, @code{visit_Str()}, @code{visit_Bytes()},
@code{visit_NameConstant()} and @code{visit_Ellipsis()} will not be called
in Python 3.14+.  Add the @ref{c69,,visit_Constant()} method instead to handle
all constant nodes.

@end deffn

@geindex NodeTransformer (class in ast)
@anchor{library/ast ast NodeTransformer}@anchor{4f37}
@deffn {Class} ast.NodeTransformer

A @ref{2f2,,NodeVisitor} subclass that walks the abstract syntax tree and
allows modification of nodes.

The @code{NodeTransformer} will walk the AST and use the return value of
the visitor methods to replace or remove the old node.  If the return value
of the visitor method is @code{None}, the node will be removed from its
location, otherwise it is replaced with the return value.  The return value
may be the original node in which case no replacement takes place.

Here is an example transformer that rewrites all occurrences of name lookups
(@code{foo}) to @code{data['foo']}:

@example
class RewriteName(NodeTransformer):

    def visit_Name(self, node):
        return Subscript(
            value=Name(id='data', ctx=Load()),
            slice=Constant(value=node.id),
            ctx=node.ctx
        )
@end example

Keep in mind that if the node you’re operating on has child nodes you must
either transform the child nodes yourself or call the @ref{4f36,,generic_visit()}
method for the node first.

For nodes that were part of a collection of statements (that applies to all
statement nodes), the visitor may also return a list of nodes rather than
just a single node.

If @code{NodeTransformer} introduces new nodes (that weren’t part of
original tree) without giving them location information (such as
@ref{4ed4,,lineno}), @ref{4f30,,fix_missing_locations()} should be called with
the new sub-tree to recalculate the location information:

@example
tree = ast.parse('foo', mode='eval')
new_tree = fix_missing_locations(RewriteName().visit(tree))
@end example

Usually you use the transformer like this:

@example
node = YourTransformer().visit(node)
@end example
@end deffn

@geindex dump() (in module ast)
@anchor{library/ast ast dump}@anchor{ae7}
@deffn {Function} ast.dump (node, annotate_fields=True, include_attributes=False, *, indent=None, show_empty=False)

Return a formatted dump of the tree in `node'.  This is mainly useful for
debugging purposes.  If `annotate_fields' is true (by default),
the returned string will show the names and the values for fields.
If `annotate_fields' is false, the result string will be more compact by
omitting unambiguous field names.  Attributes such as line
numbers and column offsets are not dumped by default.  If this is wanted,
`include_attributes' can be set to true.

If `indent' is a non-negative integer or string, then the tree will be
pretty-printed with that indent level.  An indent level
of 0, negative, or @code{""} will only insert newlines.  @code{None} (the default)
selects the single line representation. Using a positive integer indent
indents that many spaces per level.  If `indent' is a string (such as @code{"\t"}),
that string is used to indent each level.

If `show_empty' is false (the default), optional empty lists will be
omitted from the output.
Optional @code{None} values are always omitted.


Changed in version 3.9: Added the `indent' option.



Changed in version 3.13: Added the `show_empty' option.

@example
>>> print(ast.dump(ast.parse("""\
... async def f():
...     await other_func()
... """), indent=4, show_empty=True))
Module(
    body=[
        AsyncFunctionDef(
            name='f',
            args=arguments(
                posonlyargs=[],
                args=[],
                kwonlyargs=[],
                kw_defaults=[],
                defaults=[]),
            body=[
                Expr(
                    value=Await(
                        value=Call(
                            func=Name(id='other_func', ctx=Load()),
                            args=[],
                            keywords=[])))],
            decorator_list=[],
            type_params=[])],
    type_ignores=[])
@end example

@end deffn

@geindex compare() (in module ast)
@anchor{library/ast ast compare}@anchor{1c1}
@deffn {Function} ast.compare (a, b, /, *, compare_attributes=False)

Recursively compares two ASTs.

`compare_attributes' affects whether AST attributes are considered
in the comparison. If `compare_attributes' is @code{False} (default), then
attributes are ignored. Otherwise they must all be equal. This
option is useful to check whether the ASTs are structurally equal but
differ in whitespace or similar details. Attributes include line numbers
and column offsets.


Added in version 3.14.

@end deffn

@node Compiler flags<2>,Command-line usage<7>,ast helpers,ast — Abstract syntax trees
@anchor{library/ast ast-compiler-flags}@anchor{260e}@anchor{library/ast compiler-flags}@anchor{4f38}
@subsubsection Compiler flags


The following flags may be passed to @ref{4b2,,compile()} in order to change
effects on the compilation of a program:

@geindex PyCF_ALLOW_TOP_LEVEL_AWAIT (in module ast)
@anchor{library/ast ast PyCF_ALLOW_TOP_LEVEL_AWAIT}@anchor{4f39}
@deffn {Data} ast.PyCF_ALLOW_TOP_LEVEL_AWAIT

Enables support for top-level @code{await}, @code{async for}, @code{async with}
and async comprehensions.


Added in version 3.8.

@end deffn

@geindex PyCF_ONLY_AST (in module ast)
@anchor{library/ast ast PyCF_ONLY_AST}@anchor{4ed0}
@deffn {Data} ast.PyCF_ONLY_AST

Generates and returns an abstract syntax tree instead of returning a
compiled code object.
@end deffn

@geindex PyCF_OPTIMIZED_AST (in module ast)
@anchor{library/ast ast PyCF_OPTIMIZED_AST}@anchor{4f3a}
@deffn {Data} ast.PyCF_OPTIMIZED_AST

The returned AST is optimized according to the `optimize' argument
in @ref{4b2,,compile()} or @ref{1c4,,ast.parse()}.


Added in version 3.13.

@end deffn

@geindex PyCF_TYPE_COMMENTS (in module ast)
@anchor{library/ast ast PyCF_TYPE_COMMENTS}@anchor{4f2f}
@deffn {Data} ast.PyCF_TYPE_COMMENTS

Enables support for 
@geindex Python Enhancement Proposals; PEP 484
PEP 484@footnote{https://peps.python.org/pep-0484/} and 
@geindex Python Enhancement Proposals; PEP 526
PEP 526@footnote{https://peps.python.org/pep-0526/} style type comments
(@code{# type: <type>}, @code{# type: ignore <stuff>}).


Added in version 3.8.

@end deffn

@node Command-line usage<7>,,Compiler flags<2>,ast — Abstract syntax trees
@anchor{library/ast ast-cli}@anchor{4f3b}@anchor{library/ast command-line-usage}@anchor{4f3c}
@subsubsection Command-line usage



Added in version 3.9.


The @code{ast} module can be executed as a script from the command line.
It is as simple as:

@example
python -m ast [-m <mode>] [-a] [infile]
@end example

The following options are accepted:

@geindex ast command line option; -h
@geindex ast command line option; --help
@anchor{library/ast cmdoption-ast-h}@anchor{4f3d}@anchor{library/ast cmdoption-ast-help}@anchor{4f3e}
@deffn {Option} @w{-}h, @w{-}@w{-}help

Show the help message and exit.
@end deffn

@geindex ast command line option; -m
@geindex ast command line option; --mode
@anchor{library/ast cmdoption-ast-m}@anchor{4f3f}
@deffn {Option} @w{-}m <mode>
@anchor{library/ast cmdoption-ast-mode}@anchor{4f40}
@deffnx {Option} @w{-}@w{-}mode <mode>

Specify what kind of code must be compiled, like the `mode' argument
in @ref{1c4,,parse()}.
@end deffn

@geindex ast command line option; --no-type-comments
@anchor{library/ast cmdoption-ast-no-type-comments}@anchor{4f41}
@deffn {Option} @w{-}@w{-}no@w{-}type@w{-}comments

Don’t parse type comments.
@end deffn

@geindex ast command line option; -a
@geindex ast command line option; --include-attributes
@anchor{library/ast cmdoption-ast-a}@anchor{4f42}@anchor{library/ast cmdoption-ast-include-attributes}@anchor{4f43}
@deffn {Option} @w{-}a, @w{-}@w{-}include@w{-}attributes

Include attributes such as line numbers and column offsets.
@end deffn

@geindex ast command line option; -i
@geindex ast command line option; --indent
@anchor{library/ast cmdoption-ast-i}@anchor{4f44}
@deffn {Option} @w{-}i <indent>
@anchor{library/ast cmdoption-ast-indent}@anchor{4f45}
@deffnx {Option} @w{-}@w{-}indent <indent>

Indentation of nodes in AST (number of spaces).
@end deffn

@geindex ast command line option; --feature-version
@anchor{library/ast cmdoption-ast-feature-version}@anchor{1c5}
@deffn {Option} @w{-}@w{-}feature@w{-}version <version>

Python version in the format 3.x (for example, 3.10). Defaults to the
current version of the interpreter.


Added in version 3.14.

@end deffn

@geindex ast command line option; -O
@geindex ast command line option; --optimize
@anchor{library/ast cmdoption-ast-O}@anchor{4f46}
@deffn {Option} @w{-}O <level>
@anchor{library/ast cmdoption-ast-optimize}@anchor{1c6}
@deffnx {Option} @w{-}@w{-}optimize <level>

Optimization level for parser. Defaults to no optimization.


Added in version 3.14.

@end deffn

@geindex ast command line option; --show-empty
@anchor{library/ast cmdoption-ast-show-empty}@anchor{1c7}
@deffn {Option} @w{-}@w{-}show@w{-}empty

Show empty lists and fields that are @code{None}. Defaults to not showing empty
objects.


Added in version 3.14.

@end deffn

If @code{infile} is specified its contents are parsed to AST and dumped
to stdout.  Otherwise, the content is read from stdin.


@subsubheading See also


Green Tree Snakes@footnote{https://greentreesnakes.readthedocs.io/}, an external
documentation resource, has good details on working with Python ASTs.

ASTTokens@footnote{https://asttokens.readthedocs.io/en/latest/user-guide.html}
annotates Python ASTs with the positions of tokens and text in the source
code that generated them. This is helpful for tools that make source code
transformations.

leoAst.py@footnote{https://leo-editor.github.io/leo-editor/appendices.html#leoast-py}
unifies the
token-based and parse-tree-based views of python programs by inserting
two-way links between tokens and ast nodes.

LibCST@footnote{https://libcst.readthedocs.io/} parses code as a Concrete Syntax
Tree that looks like an ast tree and keeps all formatting details. It’s
useful for building automated refactoring (codemod) applications and
linters.

Parso@footnote{https://parso.readthedocs.io} is a Python parser that supports
error recovery and round-trip parsing for different Python versions (in
multiple Python versions). Parso is also able to list multiple syntax errors
in your Python file.


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node symtable — Access to the compiler’s symbol tables,token — Constants used with Python parse trees,ast — Abstract syntax trees,Python Language Services
@anchor{library/symtable doc}@anchor{4f47}@anchor{library/symtable module-symtable}@anchor{de}@anchor{library/symtable symtable-access-to-the-compiler-s-symbol-tables}@anchor{4f48}@anchor{library/symtable translation-repo}@anchor{4f49}
@subsection @code{symtable} — Access to the compiler’s symbol tables


@geindex module; symtable

`Source code:' Lib/symtable.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/symtable.py}


__________________________________________________________________


Symbol tables are generated by the compiler from AST just before bytecode is
generated.  The symbol table is responsible for calculating the scope of every
identifier in the code.  @code{symtable} provides an interface to examine these
tables.

@menu
* Generating Symbol Tables:: 
* Examining Symbol Tables:: 
* Command-Line Usage: Command-Line Usage<3>. 

@end menu

@node Generating Symbol Tables,Examining Symbol Tables,,symtable — Access to the compiler’s symbol tables
@anchor{library/symtable generating-symbol-tables}@anchor{4f4a}
@subsubsection Generating Symbol Tables


@geindex symtable() (in module symtable)
@anchor{library/symtable symtable symtable}@anchor{1e13}
@deffn {Function} symtable.symtable (code, filename, compile_type)

Return the toplevel @ref{4f4b,,SymbolTable} for the Python source `code'.
`filename' is the name of the file containing the code.  `compile_type' is
like the `mode' argument to @ref{4b2,,compile()}.
@end deffn

@node Examining Symbol Tables,Command-Line Usage<3>,Generating Symbol Tables,symtable — Access to the compiler’s symbol tables
@anchor{library/symtable examining-symbol-tables}@anchor{4f4c}
@subsubsection Examining Symbol Tables


@geindex SymbolTableType (class in symtable)
@anchor{library/symtable symtable SymbolTableType}@anchor{1996}
@deffn {Class} symtable.SymbolTableType

An enumeration indicating the type of a @ref{4f4b,,SymbolTable} object.

@geindex MODULE (symtable.SymbolTableType attribute)
@anchor{library/symtable symtable SymbolTableType MODULE}@anchor{4f4d}
@deffn {Attribute} MODULE = "module"

Used for the symbol table of a module.
@end deffn

@geindex FUNCTION (symtable.SymbolTableType attribute)
@anchor{library/symtable symtable SymbolTableType FUNCTION}@anchor{4f4e}
@deffn {Attribute} FUNCTION = "function"

Used for the symbol table of a function.
@end deffn

@geindex CLASS (symtable.SymbolTableType attribute)
@anchor{library/symtable symtable SymbolTableType CLASS}@anchor{4f4f}
@deffn {Attribute} CLASS = "class"

Used for the symbol table of a class.
@end deffn

The following members refer to different flavors of
@ref{4ac,,annotation scopes}.

@geindex ANNOTATION (symtable.SymbolTableType attribute)
@anchor{library/symtable symtable SymbolTableType ANNOTATION}@anchor{4f50}
@deffn {Attribute} ANNOTATION = "annotation"

Used for annotations if @code{from __future__ import annotations} is active.
@end deffn

@geindex TYPE_ALIAS (symtable.SymbolTableType attribute)
@anchor{library/symtable symtable SymbolTableType TYPE_ALIAS}@anchor{4f51}
@deffn {Attribute} TYPE_ALIAS = "type alias"

Used for the symbol table of @ref{66d,,type} constructions.
@end deffn

@geindex TYPE_PARAMETERS (symtable.SymbolTableType attribute)
@anchor{library/symtable symtable SymbolTableType TYPE_PARAMETERS}@anchor{4f52}
@deffn {Attribute} TYPE_PARAMETERS = "type parameters"

Used for the symbol table of @ref{683,,generic functions}
or @ref{682,,generic classes}.
@end deffn

@geindex TYPE_VARIABLE (symtable.SymbolTableType attribute)
@anchor{library/symtable symtable SymbolTableType TYPE_VARIABLE}@anchor{4f53}
@deffn {Attribute} TYPE_VARIABLE = "type variable"

Used for the symbol table of the bound, the constraint tuple or the
default value of a single type variable in the formal sense, i.e.,
a TypeVar, a TypeVarTuple or a ParamSpec object (the latter two do
not support a bound or a constraint tuple).
@end deffn


Added in version 3.13.

@end deffn

@geindex SymbolTable (class in symtable)
@anchor{library/symtable symtable SymbolTable}@anchor{4f4b}
@deffn {Class} symtable.SymbolTable

A namespace table for a block.  The constructor is not public.

@geindex get_type() (symtable.SymbolTable method)
@anchor{library/symtable symtable SymbolTable get_type}@anchor{1997}
@deffn {Method} get_type ()

Return the type of the symbol table.  Possible values are members
of the @ref{1996,,SymbolTableType} enumeration.


Changed in version 3.12: Added @code{'annotation'},  @code{'TypeVar bound'}, @code{'type alias'},
and @code{'type parameter'} as possible return values.



Changed in version 3.13: Return values are members of the @ref{1996,,SymbolTableType} enumeration.

The exact values of the returned string may change in the future,
and thus, it is recommended to use @ref{1996,,SymbolTableType} members
instead of hard-coded strings.

@end deffn

@geindex get_id() (symtable.SymbolTable method)
@anchor{library/symtable symtable SymbolTable get_id}@anchor{4f54}
@deffn {Method} get_id ()

Return the table’s identifier.
@end deffn

@geindex get_name() (symtable.SymbolTable method)
@anchor{library/symtable symtable SymbolTable get_name}@anchor{4f55}
@deffn {Method} get_name ()

Return the table’s name.  This is the name of the class if the table is
for a class, the name of the function if the table is for a function, or
@code{'top'} if the table is global (@ref{1997,,get_type()} returns @code{'module'}).
For type parameter scopes (which are used for generic classes, functions,
and type aliases), it is the name of the underlying class, function, or
type alias. For type alias scopes, it is the name of the type alias.
For @ref{487,,TypeVar} bound scopes, it is the name of the @code{TypeVar}.
@end deffn

@geindex get_lineno() (symtable.SymbolTable method)
@anchor{library/symtable symtable SymbolTable get_lineno}@anchor{4f56}
@deffn {Method} get_lineno ()

Return the number of the first line in the block this table represents.
@end deffn

@geindex is_optimized() (symtable.SymbolTable method)
@anchor{library/symtable symtable SymbolTable is_optimized}@anchor{4f57}
@deffn {Method} is_optimized ()

Return @code{True} if the locals in this table can be optimized.
@end deffn

@geindex is_nested() (symtable.SymbolTable method)
@anchor{library/symtable symtable SymbolTable is_nested}@anchor{4f58}
@deffn {Method} is_nested ()

Return @code{True} if the block is a nested class or function.
@end deffn

@geindex has_children() (symtable.SymbolTable method)
@anchor{library/symtable symtable SymbolTable has_children}@anchor{4f59}
@deffn {Method} has_children ()

Return @code{True} if the block has nested namespaces within it.  These can
be obtained with @ref{4f5a,,get_children()}.
@end deffn

@geindex get_identifiers() (symtable.SymbolTable method)
@anchor{library/symtable symtable SymbolTable get_identifiers}@anchor{4f5b}
@deffn {Method} get_identifiers ()

Return a view object containing the names of symbols in the table.
See the @ref{26ee,,documentation of view objects}.
@end deffn

@geindex lookup() (symtable.SymbolTable method)
@anchor{library/symtable symtable SymbolTable lookup}@anchor{4f5c}
@deffn {Method} lookup (name)

Lookup `name' in the table and return a @ref{28b,,Symbol} instance.
@end deffn

@geindex get_symbols() (symtable.SymbolTable method)
@anchor{library/symtable symtable SymbolTable get_symbols}@anchor{4f5d}
@deffn {Method} get_symbols ()

Return a list of @ref{28b,,Symbol} instances for names in the table.
@end deffn

@geindex get_children() (symtable.SymbolTable method)
@anchor{library/symtable symtable SymbolTable get_children}@anchor{4f5a}
@deffn {Method} get_children ()

Return a list of the nested symbol tables.
@end deffn
@end deffn

@geindex Function (class in symtable)
@anchor{library/symtable symtable Function}@anchor{4f5e}
@deffn {Class} symtable.Function

A namespace for a function or method.  This class inherits from
@ref{4f4b,,SymbolTable}.

@geindex get_parameters() (symtable.Function method)
@anchor{library/symtable symtable Function get_parameters}@anchor{4f5f}
@deffn {Method} get_parameters ()

Return a tuple containing names of parameters to this function.
@end deffn

@geindex get_locals() (symtable.Function method)
@anchor{library/symtable symtable Function get_locals}@anchor{4f60}
@deffn {Method} get_locals ()

Return a tuple containing names of locals in this function.
@end deffn

@geindex get_globals() (symtable.Function method)
@anchor{library/symtable symtable Function get_globals}@anchor{4f61}
@deffn {Method} get_globals ()

Return a tuple containing names of globals in this function.
@end deffn

@geindex get_nonlocals() (symtable.Function method)
@anchor{library/symtable symtable Function get_nonlocals}@anchor{4f62}
@deffn {Method} get_nonlocals ()

Return a tuple containing names of explicitly declared nonlocals in this function.
@end deffn

@geindex get_frees() (symtable.Function method)
@anchor{library/symtable symtable Function get_frees}@anchor{4f63}
@deffn {Method} get_frees ()

Return a tuple containing names of @ref{18da,,free (closure) variables}
in this function.
@end deffn
@end deffn

@geindex Class (class in symtable)
@anchor{library/symtable symtable Class}@anchor{4f64}
@deffn {Class} symtable.Class

A namespace of a class.  This class inherits from @ref{4f4b,,SymbolTable}.

@geindex get_methods() (symtable.Class method)
@anchor{library/symtable symtable Class get_methods}@anchor{31f}
@deffn {Method} get_methods ()

Return a tuple containing the names of method-like functions declared
in the class.

Here, the term ‘method’ designates `any' function defined in the class
body via @ref{1666,,def} or @ref{7ee,,async def}.

Functions defined in a deeper scope (e.g., in an inner class) are not
picked up by @code{get_methods()}.

For example:

@c import warnings
@c context = warnings.catch_warnings()
@c context.__enter__()
@c warnings.simplefilter("ignore", category=DeprecationWarning)

@c context.__exit__()

@example
>>> import symtable
>>> st = symtable.symtable('@w{'}'
... def outer(): pass
...
... class A:
...    def f():
...        def w(): pass
...
...    def g(self): pass
...
...    @@classmethod
...    async def h(cls): pass
...
...    global outer
...    def outer(self): pass
... '@w{'}', 'test', 'exec')
>>> class_A = st.get_children()[2]
>>> class_A.get_methods()
('f', 'g', 'h')
@end example

Although @code{A().f()} raises @ref{199,,TypeError} at runtime, @code{A.f} is still
considered as a method-like function.


Deprecated since version 3.14, will be removed in version 3.16.

@end deffn
@end deffn

@geindex Symbol (class in symtable)
@anchor{library/symtable symtable Symbol}@anchor{28b}
@deffn {Class} symtable.Symbol

An entry in a @ref{4f4b,,SymbolTable} corresponding to an identifier in the
source.  The constructor is not public.

@geindex get_name() (symtable.Symbol method)
@anchor{library/symtable symtable Symbol get_name}@anchor{4f65}
@deffn {Method} get_name ()

Return the symbol’s name.
@end deffn

@geindex is_referenced() (symtable.Symbol method)
@anchor{library/symtable symtable Symbol is_referenced}@anchor{4f66}
@deffn {Method} is_referenced ()

Return @code{True} if the symbol is used in its block.
@end deffn

@geindex is_imported() (symtable.Symbol method)
@anchor{library/symtable symtable Symbol is_imported}@anchor{4f67}
@deffn {Method} is_imported ()

Return @code{True} if the symbol is created from an import statement.
@end deffn

@geindex is_parameter() (symtable.Symbol method)
@anchor{library/symtable symtable Symbol is_parameter}@anchor{4f68}
@deffn {Method} is_parameter ()

Return @code{True} if the symbol is a parameter.
@end deffn

@geindex is_type_parameter() (symtable.Symbol method)
@anchor{library/symtable symtable Symbol is_type_parameter}@anchor{1998}
@deffn {Method} is_type_parameter ()

Return @code{True} if the symbol is a type parameter.


Added in version 3.14.

@end deffn

@geindex is_global() (symtable.Symbol method)
@anchor{library/symtable symtable Symbol is_global}@anchor{4f69}
@deffn {Method} is_global ()

Return @code{True} if the symbol is global.
@end deffn

@geindex is_nonlocal() (symtable.Symbol method)
@anchor{library/symtable symtable Symbol is_nonlocal}@anchor{1e50}
@deffn {Method} is_nonlocal ()

Return @code{True} if the symbol is nonlocal.
@end deffn

@geindex is_declared_global() (symtable.Symbol method)
@anchor{library/symtable symtable Symbol is_declared_global}@anchor{1531}
@deffn {Method} is_declared_global ()

Return @code{True} if the symbol is declared global with a global statement.
@end deffn

@geindex is_local() (symtable.Symbol method)
@anchor{library/symtable symtable Symbol is_local}@anchor{4f6a}
@deffn {Method} is_local ()

Return @code{True} if the symbol is local to its block.
@end deffn

@geindex is_annotated() (symtable.Symbol method)
@anchor{library/symtable symtable Symbol is_annotated}@anchor{4f6b}
@deffn {Method} is_annotated ()

Return @code{True} if the symbol is annotated.


Added in version 3.6.

@end deffn

@geindex is_free() (symtable.Symbol method)
@anchor{library/symtable symtable Symbol is_free}@anchor{4f6c}
@deffn {Method} is_free ()

Return @code{True} if the symbol is referenced in its block, but not assigned
to.
@end deffn

@geindex is_free_class() (symtable.Symbol method)
@anchor{library/symtable symtable Symbol is_free_class}@anchor{28e}
@deffn {Method} is_free_class ()

Return `True' if a class-scoped symbol is free from
the perspective of a method.

Consider the following example:

@example
def f():
    x = 1  # function-scoped
    class C:
        x = 2  # class-scoped
        def method(self):
            return x
@end example

In this example, the class-scoped symbol @code{x} is considered to
be free from the perspective of @code{C.method}, thereby allowing
the latter to return `1' at runtime and not `2'.


Added in version 3.14.

@end deffn

@geindex is_assigned() (symtable.Symbol method)
@anchor{library/symtable symtable Symbol is_assigned}@anchor{4f6d}
@deffn {Method} is_assigned ()

Return @code{True} if the symbol is assigned to in its block.
@end deffn

@geindex is_comp_iter() (symtable.Symbol method)
@anchor{library/symtable symtable Symbol is_comp_iter}@anchor{28d}
@deffn {Method} is_comp_iter ()

Return @code{True} if the symbol is a comprehension iteration variable.


Added in version 3.14.

@end deffn

@geindex is_comp_cell() (symtable.Symbol method)
@anchor{library/symtable symtable Symbol is_comp_cell}@anchor{28c}
@deffn {Method} is_comp_cell ()

Return @code{True} if the symbol is a cell in an inlined comprehension.


Added in version 3.14.

@end deffn

@geindex is_namespace() (symtable.Symbol method)
@anchor{library/symtable symtable Symbol is_namespace}@anchor{4f6e}
@deffn {Method} is_namespace ()

Return @code{True} if name binding introduces new namespace.

If the name is used as the target of a function or class statement, this
will be true.

For example:

@example
>>> table = symtable.symtable("def some_func(): pass", "string", "exec")
>>> table.lookup("some_func").is_namespace()
True
@end example

Note that a single name can be bound to multiple objects.  If the result
is @code{True}, the name may also be bound to other objects, like an int or
list, that does not introduce a new namespace.
@end deffn

@geindex get_namespaces() (symtable.Symbol method)
@anchor{library/symtable symtable Symbol get_namespaces}@anchor{4f6f}
@deffn {Method} get_namespaces ()

Return a list of namespaces bound to this name.
@end deffn

@geindex get_namespace() (symtable.Symbol method)
@anchor{library/symtable symtable Symbol get_namespace}@anchor{4f70}
@deffn {Method} get_namespace ()

Return the namespace bound to this name. If more than one or no namespace
is bound to this name, a @ref{2ee,,ValueError} is raised.
@end deffn
@end deffn

@node Command-Line Usage<3>,,Examining Symbol Tables,symtable — Access to the compiler’s symbol tables
@anchor{library/symtable command-line-usage}@anchor{4f71}@anchor{library/symtable symtable-cli}@anchor{4f72}
@subsubsection Command-Line Usage



Added in version 3.13.


The @code{symtable} module can be executed as a script from the command line.

@example
python -m symtable [infile...]
@end example

Symbol tables are generated for the specified Python source files and
dumped to stdout.
If no input file is specified, the content is read from stdin.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node token — Constants used with Python parse trees,keyword — Testing for Python keywords,symtable — Access to the compiler’s symbol tables,Python Language Services
@anchor{library/token doc}@anchor{4f73}@anchor{library/token module-token}@anchor{101}@anchor{library/token token-constants-used-with-python-parse-trees}@anchor{4f74}@anchor{library/token translation-repo}@anchor{4f75}
@subsection @code{token} — Constants used with Python parse trees


@geindex module; token

`Source code:' Lib/token.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/token.py}


__________________________________________________________________


This module provides constants which represent the numeric values of leaf nodes
of the parse tree (terminal tokens).  Refer to the file @code{Grammar/Tokens}
in the Python distribution for the definitions of the names in the context of
the language grammar.  The specific numeric values which the names map to may
change between Python versions.

The module also provides a mapping from numeric codes to names and some
functions.  The functions mirror definitions in the Python C header files.

Note that a token’s value may depend on tokenizer options. For example, a
@code{"+"} token may be reported as either @ref{4f76,,PLUS} or @ref{22ce,,OP}, or
a @code{"match"} token may be either @ref{22fd,,NAME} or @ref{4f77,,SOFT_KEYWORD}.

@geindex tok_name (in module token)
@anchor{library/token token tok_name}@anchor{4f78}
@deffn {Data} token.tok_name

Dictionary mapping the numeric values of the constants defined in this module
back to name strings, allowing more human-readable representation of parse trees
to be generated.
@end deffn

@geindex ISTERMINAL() (in module token)
@anchor{library/token token ISTERMINAL}@anchor{4f79}
@deffn {Function} token.ISTERMINAL (x)

Return @code{True} for terminal token values.
@end deffn

@geindex ISNONTERMINAL() (in module token)
@anchor{library/token token ISNONTERMINAL}@anchor{4f7a}
@deffn {Function} token.ISNONTERMINAL (x)

Return @code{True} for non-terminal token values.
@end deffn

@geindex ISEOF() (in module token)
@anchor{library/token token ISEOF}@anchor{4f7b}
@deffn {Function} token.ISEOF (x)

Return @code{True} if `x' is the marker indicating the end of input.
@end deffn

The token constants are:

@geindex NAME (in module token)
@anchor{library/token token NAME}@anchor{22fd}
@deffn {Data} token.NAME

Token value that indicates an @ref{22e4,,identifier or keyword}.
@end deffn

@geindex NUMBER (in module token)
@anchor{library/token token NUMBER}@anchor{22fe}
@deffn {Data} token.NUMBER

Token value that indicates a @ref{22e5,,numeric literal}
@end deffn

@geindex STRING (in module token)
@anchor{library/token token STRING}@anchor{22ff}
@deffn {Data} token.STRING

Token value that indicates a @ref{22e3,,string or byte literal},
excluding @ref{19b,,formatted string literals}.
The token string is not interpreted:
it includes the surrounding quotation marks and the prefix (if given);
backslashes are included literally, without processing escape sequences.
@end deffn

@geindex OP (in module token)
@anchor{library/token token OP}@anchor{22ce}
@deffn {Data} token.OP

A generic token value that indicates an
@ref{22d0,,operator} or @ref{22cf,,delimiter}.

`CPython implementation detail:' This value is only reported by the @ref{102,,tokenize} module.
Internally, the tokenizer uses
@ref{2362,,exact token types} instead.
@end deffn

@geindex COMMENT (in module token)
@anchor{library/token token COMMENT}@anchor{4f7c}
@deffn {Data} token.COMMENT

Token value used to indicate a comment.
The parser ignores @code{COMMENT} tokens.
@end deffn

@geindex NEWLINE (in module token)
@anchor{library/token token NEWLINE}@anchor{22d8}
@deffn {Data} token.NEWLINE

Token value that indicates the end of a @ref{22e9,,logical line}.
@end deffn

@geindex NL (in module token)
@anchor{library/token token NL}@anchor{4f7d}
@deffn {Data} token.NL

Token value used to indicate a non-terminating newline.
@code{NL} tokens are generated when a logical line of code is continued
over multiple physical lines. The parser ignores @code{NL} tokens.
@end deffn

@geindex INDENT (in module token)
@anchor{library/token token INDENT}@anchor{2140}
@deffn {Data} token.INDENT

Token value used at the beginning of a @ref{22e9,,logical line}
to indicate the start of an @ref{22e0,,indented block}.
@end deffn

@geindex DEDENT (in module token)
@anchor{library/token token DEDENT}@anchor{22f6}
@deffn {Data} token.DEDENT

Token value used at the beginning of a @ref{22e9,,logical line}
to indicate the end of an @ref{22e0,,indented block}.
@end deffn

@geindex FSTRING_START (in module token)
@anchor{library/token token FSTRING_START}@anchor{2335}
@deffn {Data} token.FSTRING_START

Token value used to indicate the beginning of an
@ref{19b,,f-string literal}.

`CPython implementation detail:' The token string includes the prefix and the opening quote(s), but none
of the contents of the literal.
@end deffn

@geindex FSTRING_MIDDLE (in module token)
@anchor{library/token token FSTRING_MIDDLE}@anchor{2336}
@deffn {Data} token.FSTRING_MIDDLE

Token value used for literal text inside an @ref{19b,,f-string literal},
including format specifications.

`CPython implementation detail:' Replacement fields (that is, the non-literal parts of f-strings) use
the same tokens as other expressions, and are delimited by
@ref{4f7e,,LBRACE}, @ref{4f7f,,RBRACE}, @ref{4f80,,EXCLAMATION} and @ref{4f81,,COLON}
tokens.
@end deffn

@geindex FSTRING_END (in module token)
@anchor{library/token token FSTRING_END}@anchor{2337}
@deffn {Data} token.FSTRING_END

Token value used to indicate the end of a @ref{19b,,f-string}.

`CPython implementation detail:' The token string contains the closing quote(s).
@end deffn

@geindex TSTRING_START (in module token)
@anchor{library/token token TSTRING_START}@anchor{4f82}
@deffn {Data} token.TSTRING_START

Token value used to indicate the beginning of a template string literal.

`CPython implementation detail:' The token string includes the prefix and the opening quote(s), but none
of the contents of the literal.


Added in version 3.14.

@end deffn

@geindex TSTRING_MIDDLE (in module token)
@anchor{library/token token TSTRING_MIDDLE}@anchor{4f83}
@deffn {Data} token.TSTRING_MIDDLE

Token value used for literal text inside a template string literal
including format specifications.

`CPython implementation detail:' Replacement fields (that is, the non-literal parts of t-strings) use
the same tokens as other expressions, and are delimited by
@ref{4f7e,,LBRACE}, @ref{4f7f,,RBRACE}, @ref{4f80,,EXCLAMATION} and @ref{4f81,,COLON}
tokens.


Added in version 3.14.

@end deffn

@geindex TSTRING_END (in module token)
@anchor{library/token token TSTRING_END}@anchor{4f84}
@deffn {Data} token.TSTRING_END

Token value used to indicate the end of a template string literal.

`CPython implementation detail:' The token string contains the closing quote(s).


Added in version 3.14.

@end deffn

@geindex ENDMARKER (in module token)
@anchor{library/token token ENDMARKER}@anchor{22fa}
@deffn {Data} token.ENDMARKER

Token value that indicates the end of input.
Used in @ref{25e1,,top-level grammar rules}.
@end deffn

@geindex ENCODING (in module token)
@anchor{library/token token ENCODING}@anchor{4f85}
@deffn {Data} token.ENCODING

Token value that indicates the encoding used to decode the source bytes
into text. The first token returned by @ref{701,,tokenize.tokenize()} will
always be an @code{ENCODING} token.

`CPython implementation detail:' This token type isn’t used by the C tokenizer but is needed for
the @ref{102,,tokenize} module.
@end deffn

The following token types are not produced by the @ref{102,,tokenize} module,
and are defined for special uses in the tokenizer or parser:

@geindex TYPE_IGNORE (in module token)
@anchor{library/token token TYPE_IGNORE}@anchor{4f86}
@deffn {Data} token.TYPE_IGNORE

Token value indicating that a @code{type: ignore} comment was recognized.
Such tokens are produced instead of regular @ref{4f7c,,COMMENT} tokens only
with the @ref{4f2f,,PyCF_TYPE_COMMENTS} flag.
@end deffn

@geindex TYPE_COMMENT (in module token)
@anchor{library/token token TYPE_COMMENT}@anchor{4f87}
@deffn {Data} token.TYPE_COMMENT

Token value indicating that a type comment was recognized.
Such tokens are produced instead of regular @ref{4f7c,,COMMENT} tokens only
with the @ref{4f2f,,PyCF_TYPE_COMMENTS} flag.
@end deffn

@geindex SOFT_KEYWORD (in module token)
@anchor{library/token token SOFT_KEYWORD}@anchor{4f77}
@deffn {Data} token.SOFT_KEYWORD

Token value indicating a @ref{a13,,soft keyword}.

The tokenizer never produces this value.
To check for a soft keyword, pass a @ref{22fd,,NAME} token’s string to
@ref{4f88,,keyword.issoftkeyword()}.
@end deffn

@geindex ERRORTOKEN (in module token)
@anchor{library/token token ERRORTOKEN}@anchor{4f89}
@deffn {Data} token.ERRORTOKEN

Token value used to indicate wrong input.

The @ref{102,,tokenize} module generally indicates errors by
raising exceptions instead of emitting this token.
It can also emit tokens such as @ref{22ce,,OP} or @ref{22fd,,NAME} with strings that
are later rejected by the parser.
@end deffn
@anchor{library/token token-operators-delimiters}@anchor{2362}
The remaining tokens represent specific @ref{22d0,,operators} and
@ref{22cf,,delimiters}.
(The @ref{102,,tokenize} module reports these as @ref{22ce,,OP}; see @code{exact_type}
in the @code{tokenize} documentation for details.)

@c Auto-generated by Tools/build/generate_token.py


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Token

@tab

Value

@item

@geindex LPAR (in module token)
@anchor{library/token token LPAR}@anchor{4f8a}
@deffn {Data} token.LPAR
@end deffn

@tab

@code{"("}

@item

@geindex RPAR (in module token)
@anchor{library/token token RPAR}@anchor{4f8b}
@deffn {Data} token.RPAR
@end deffn

@tab

@code{")"}

@item

@geindex LSQB (in module token)
@anchor{library/token token LSQB}@anchor{4f8c}
@deffn {Data} token.LSQB
@end deffn

@tab

@code{"["}

@item

@geindex RSQB (in module token)
@anchor{library/token token RSQB}@anchor{4f8d}
@deffn {Data} token.RSQB
@end deffn

@tab

@code{"]"}

@item

@geindex COLON (in module token)
@anchor{library/token token COLON}@anchor{4f81}
@deffn {Data} token.COLON
@end deffn

@tab

@code{":"}

@item

@geindex COMMA (in module token)
@anchor{library/token token COMMA}@anchor{4f8e}
@deffn {Data} token.COMMA
@end deffn

@tab

@code{","}

@item

@geindex SEMI (in module token)
@anchor{library/token token SEMI}@anchor{4f8f}
@deffn {Data} token.SEMI
@end deffn

@tab

@code{";"}

@item

@geindex PLUS (in module token)
@anchor{library/token token PLUS}@anchor{4f76}
@deffn {Data} token.PLUS
@end deffn

@tab

@code{"+"}

@item

@geindex MINUS (in module token)
@anchor{library/token token MINUS}@anchor{4f90}
@deffn {Data} token.MINUS
@end deffn

@tab

@code{"-"}

@item

@geindex STAR (in module token)
@anchor{library/token token STAR}@anchor{4f91}
@deffn {Data} token.STAR
@end deffn

@tab

@code{"*"}

@item

@geindex SLASH (in module token)
@anchor{library/token token SLASH}@anchor{4f92}
@deffn {Data} token.SLASH
@end deffn

@tab

@code{"/"}

@item

@geindex VBAR (in module token)
@anchor{library/token token VBAR}@anchor{4f93}
@deffn {Data} token.VBAR
@end deffn

@tab

@code{"|"}

@item

@geindex AMPER (in module token)
@anchor{library/token token AMPER}@anchor{4f94}
@deffn {Data} token.AMPER
@end deffn

@tab

@code{"&"}

@item

@geindex LESS (in module token)
@anchor{library/token token LESS}@anchor{4f95}
@deffn {Data} token.LESS
@end deffn

@tab

@code{"<"}

@item

@geindex GREATER (in module token)
@anchor{library/token token GREATER}@anchor{4f96}
@deffn {Data} token.GREATER
@end deffn

@tab

@code{">"}

@item

@geindex EQUAL (in module token)
@anchor{library/token token EQUAL}@anchor{4f97}
@deffn {Data} token.EQUAL
@end deffn

@tab

@code{"="}

@item

@geindex DOT (in module token)
@anchor{library/token token DOT}@anchor{4f98}
@deffn {Data} token.DOT
@end deffn

@tab

@code{"."}

@item

@geindex PERCENT (in module token)
@anchor{library/token token PERCENT}@anchor{4f99}
@deffn {Data} token.PERCENT
@end deffn

@tab

@code{"%"}

@item

@geindex LBRACE (in module token)
@anchor{library/token token LBRACE}@anchor{4f7e}
@deffn {Data} token.LBRACE
@end deffn

@tab

@code{"@{"}

@item

@geindex RBRACE (in module token)
@anchor{library/token token RBRACE}@anchor{4f7f}
@deffn {Data} token.RBRACE
@end deffn

@tab

@code{"@}"}

@item

@geindex EQEQUAL (in module token)
@anchor{library/token token EQEQUAL}@anchor{4f9a}
@deffn {Data} token.EQEQUAL
@end deffn

@tab

@code{"=="}

@item

@geindex NOTEQUAL (in module token)
@anchor{library/token token NOTEQUAL}@anchor{4f9b}
@deffn {Data} token.NOTEQUAL
@end deffn

@tab

@code{"!="}

@item

@geindex LESSEQUAL (in module token)
@anchor{library/token token LESSEQUAL}@anchor{4f9c}
@deffn {Data} token.LESSEQUAL
@end deffn

@tab

@code{"<="}

@item

@geindex GREATEREQUAL (in module token)
@anchor{library/token token GREATEREQUAL}@anchor{4f9d}
@deffn {Data} token.GREATEREQUAL
@end deffn

@tab

@code{">="}

@item

@geindex TILDE (in module token)
@anchor{library/token token TILDE}@anchor{4f9e}
@deffn {Data} token.TILDE
@end deffn

@tab

@code{"~"}

@item

@geindex CIRCUMFLEX (in module token)
@anchor{library/token token CIRCUMFLEX}@anchor{4f9f}
@deffn {Data} token.CIRCUMFLEX
@end deffn

@tab

@code{"^"}

@item

@geindex LEFTSHIFT (in module token)
@anchor{library/token token LEFTSHIFT}@anchor{4fa0}
@deffn {Data} token.LEFTSHIFT
@end deffn

@tab

@code{"<<"}

@item

@geindex RIGHTSHIFT (in module token)
@anchor{library/token token RIGHTSHIFT}@anchor{4fa1}
@deffn {Data} token.RIGHTSHIFT
@end deffn

@tab

@code{">>"}

@item

@geindex DOUBLESTAR (in module token)
@anchor{library/token token DOUBLESTAR}@anchor{4fa2}
@deffn {Data} token.DOUBLESTAR
@end deffn

@tab

@code{"**"}

@item

@geindex PLUSEQUAL (in module token)
@anchor{library/token token PLUSEQUAL}@anchor{4fa3}
@deffn {Data} token.PLUSEQUAL
@end deffn

@tab

@code{"+="}

@item

@geindex MINEQUAL (in module token)
@anchor{library/token token MINEQUAL}@anchor{4fa4}
@deffn {Data} token.MINEQUAL
@end deffn

@tab

@code{"-="}

@item

@geindex STAREQUAL (in module token)
@anchor{library/token token STAREQUAL}@anchor{4fa5}
@deffn {Data} token.STAREQUAL
@end deffn

@tab

@code{"*="}

@item

@geindex SLASHEQUAL (in module token)
@anchor{library/token token SLASHEQUAL}@anchor{4fa6}
@deffn {Data} token.SLASHEQUAL
@end deffn

@tab

@code{"/="}

@item

@geindex PERCENTEQUAL (in module token)
@anchor{library/token token PERCENTEQUAL}@anchor{4fa7}
@deffn {Data} token.PERCENTEQUAL
@end deffn

@tab

@code{"%="}

@item

@geindex AMPEREQUAL (in module token)
@anchor{library/token token AMPEREQUAL}@anchor{4fa8}
@deffn {Data} token.AMPEREQUAL
@end deffn

@tab

@code{"&="}

@item

@geindex VBAREQUAL (in module token)
@anchor{library/token token VBAREQUAL}@anchor{4fa9}
@deffn {Data} token.VBAREQUAL
@end deffn

@tab

@code{"|="}

@item

@geindex CIRCUMFLEXEQUAL (in module token)
@anchor{library/token token CIRCUMFLEXEQUAL}@anchor{4faa}
@deffn {Data} token.CIRCUMFLEXEQUAL
@end deffn

@tab

@code{"^="}

@item

@geindex LEFTSHIFTEQUAL (in module token)
@anchor{library/token token LEFTSHIFTEQUAL}@anchor{4fab}
@deffn {Data} token.LEFTSHIFTEQUAL
@end deffn

@tab

@code{"<<="}

@item

@geindex RIGHTSHIFTEQUAL (in module token)
@anchor{library/token token RIGHTSHIFTEQUAL}@anchor{4fac}
@deffn {Data} token.RIGHTSHIFTEQUAL
@end deffn

@tab

@code{">>="}

@item

@geindex DOUBLESTAREQUAL (in module token)
@anchor{library/token token DOUBLESTAREQUAL}@anchor{4fad}
@deffn {Data} token.DOUBLESTAREQUAL
@end deffn

@tab

@code{"**="}

@item

@geindex DOUBLESLASH (in module token)
@anchor{library/token token DOUBLESLASH}@anchor{4fae}
@deffn {Data} token.DOUBLESLASH
@end deffn

@tab

@code{"//"}

@item

@geindex DOUBLESLASHEQUAL (in module token)
@anchor{library/token token DOUBLESLASHEQUAL}@anchor{4faf}
@deffn {Data} token.DOUBLESLASHEQUAL
@end deffn

@tab

@code{"//="}

@item

@geindex AT (in module token)
@anchor{library/token token AT}@anchor{4fb0}
@deffn {Data} token.AT
@end deffn

@tab

@code{"@@"}

@item

@geindex ATEQUAL (in module token)
@anchor{library/token token ATEQUAL}@anchor{4fb1}
@deffn {Data} token.ATEQUAL
@end deffn

@tab

@code{"@@="}

@item

@geindex RARROW (in module token)
@anchor{library/token token RARROW}@anchor{4fb2}
@deffn {Data} token.RARROW
@end deffn

@tab

@code{"->"}

@item

@geindex ELLIPSIS (in module token)
@anchor{library/token token ELLIPSIS}@anchor{4fb3}
@deffn {Data} token.ELLIPSIS
@end deffn

@tab

@code{"..."}

@item

@geindex COLONEQUAL (in module token)
@anchor{library/token token COLONEQUAL}@anchor{4fb4}
@deffn {Data} token.COLONEQUAL
@end deffn

@tab

@code{":="}

@item

@geindex EXCLAMATION (in module token)
@anchor{library/token token EXCLAMATION}@anchor{4f80}
@deffn {Data} token.EXCLAMATION
@end deffn

@tab

@code{"!"}

@end multitable


The following non-token constants are provided:

@geindex N_TOKENS (in module token)
@anchor{library/token token N_TOKENS}@anchor{4fb5}
@deffn {Data} token.N_TOKENS

The number of token types defined in this module.
@end deffn

@c NT_OFFSET is deliberately undocumented; if you need it you should be
@c reading the source

@geindex EXACT_TOKEN_TYPES (in module token)
@anchor{library/token token EXACT_TOKEN_TYPES}@anchor{192d}
@deffn {Data} token.EXACT_TOKEN_TYPES

A dictionary mapping the string representation of a token to its numeric code.


Added in version 3.8.

@end deffn


Changed in version 3.5: Added @code{AWAIT} and @code{ASYNC} tokens.



Changed in version 3.7: Added @ref{4f7c,,COMMENT}, @ref{4f7d,,NL} and @ref{4f85,,ENCODING} tokens.



Changed in version 3.7: Removed @code{AWAIT} and @code{ASYNC} tokens. “async” and “await” are
now tokenized as @ref{22fd,,NAME} tokens.



Changed in version 3.8: Added @ref{4f87,,TYPE_COMMENT}, @ref{4f86,,TYPE_IGNORE}, @ref{4fb4,,COLONEQUAL}.
Added @code{AWAIT} and @code{ASYNC} tokens back (they’re needed
to support parsing older Python versions for @ref{1c4,,ast.parse()} with
@code{feature_version} set to 6 or lower).



Changed in version 3.12: Added @ref{4f80,,EXCLAMATION}.



Changed in version 3.13: Removed @code{AWAIT} and @code{ASYNC} tokens again.


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node keyword — Testing for Python keywords,tokenize — Tokenizer for Python source,token — Constants used with Python parse trees,Python Language Services
@anchor{library/keyword doc}@anchor{4fb6}@anchor{library/keyword keyword-testing-for-python-keywords}@anchor{4fb7}@anchor{library/keyword module-keyword}@anchor{88}@anchor{library/keyword translation-repo}@anchor{4fb8}
@subsection @code{keyword} — Testing for Python keywords


@geindex module; keyword

`Source code:' Lib/keyword.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/keyword.py}


__________________________________________________________________


This module allows a Python program to determine if a string is a
@ref{22cd,,keyword} or @ref{a13,,soft keyword}.

@geindex iskeyword() (in module keyword)
@anchor{library/keyword keyword iskeyword}@anchor{2697}
@deffn {Function} keyword.iskeyword (s)

Return @code{True} if `s' is a Python @ref{22cd,,keyword}.
@end deffn

@geindex kwlist (in module keyword)
@anchor{library/keyword keyword kwlist}@anchor{4fb9}
@deffn {Data} keyword.kwlist

Sequence containing all the @ref{22cd,,keywords} defined for the
interpreter.  If any keywords are defined to only be active when particular
@ref{0,,__future__} statements are in effect, these will be included as well.
@end deffn

@geindex issoftkeyword() (in module keyword)
@anchor{library/keyword keyword issoftkeyword}@anchor{4f88}
@deffn {Function} keyword.issoftkeyword (s)

Return @code{True} if `s' is a Python @ref{a13,,soft keyword}.


Added in version 3.9.

@end deffn

@geindex softkwlist (in module keyword)
@anchor{library/keyword keyword softkwlist}@anchor{4fba}
@deffn {Data} keyword.softkwlist

Sequence containing all the @ref{a13,,soft keywords} defined for the
interpreter.  If any soft keywords are defined to only be active when particular
@ref{0,,__future__} statements are in effect, these will be included as well.


Added in version 3.9.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node tokenize — Tokenizer for Python source,tabnanny — Detection of ambiguous indentation,keyword — Testing for Python keywords,Python Language Services
@anchor{library/tokenize doc}@anchor{4fbb}@anchor{library/tokenize module-tokenize}@anchor{102}@anchor{library/tokenize tokenize-tokenizer-for-python-source}@anchor{4fbc}@anchor{library/tokenize translation-repo}@anchor{4fbd}
@subsection @code{tokenize} — Tokenizer for Python source


@geindex module; tokenize

`Source code:' Lib/tokenize.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/tokenize.py}


__________________________________________________________________


The @code{tokenize} module provides a lexical scanner for Python source code,
implemented in Python.  The scanner in this module returns comments as tokens
as well, making it useful for implementing “pretty-printers”, including
colorizers for on-screen displays.

To simplify token stream handling, all @ref{22d0,,operator} and
@ref{22cf,,delimiter} tokens and @ref{236c,,Ellipsis} are returned using
the generic @ref{22ce,,OP} token type.  The exact
type can be determined by checking the @code{exact_type} property on the
@ref{85f,,named tuple} returned from @ref{701,,tokenize.tokenize()}.

@cartouche
@quotation Warning 
Note that the functions in this module are only designed to parse
syntactically valid Python code (code that does not raise when parsed
using @ref{1c4,,ast.parse()}).  The behavior of the functions in this module is
`undefined' when providing invalid Python code and it can change at any
point.
@end quotation
@end cartouche

@menu
* Tokenizing Input:: 
* Command-Line Usage: Command-Line Usage<4>. 
* Examples: Examples<36>. 

@end menu

@node Tokenizing Input,Command-Line Usage<4>,,tokenize — Tokenizer for Python source
@anchor{library/tokenize tokenizing-input}@anchor{4fbe}
@subsubsection Tokenizing Input


The primary entry point is a @ref{1267,,generator}:

@geindex tokenize() (in module tokenize)
@anchor{library/tokenize tokenize tokenize}@anchor{701}
@deffn {Function} tokenize.tokenize (readline)

The @code{tokenize()} generator requires one argument, `readline', which
must be a callable object which provides the same interface as the
@ref{1535,,io.IOBase.readline()} method of file objects.  Each call to the
function should return one line of input as bytes.

The generator produces 5-tuples with these members: the token type; the
token string; a 2-tuple @code{(srow, scol)} of ints specifying the row and
column where the token begins in the source; a 2-tuple @code{(erow, ecol)} of
ints specifying the row and column where the token ends in the source; and
the line on which the token was found. The line passed (the last tuple item)
is the `physical' line.  The 5 tuple is returned as a @ref{85f,,named tuple}
with the field names:
@code{type string start end line}.

The returned @ref{85f,,named tuple} has an additional property named
@code{exact_type} that contains the exact operator type for
@ref{22ce,,OP} tokens.  For all other token types @code{exact_type}
equals the named tuple @code{type} field.


Changed in version 3.1: Added support for named tuples.



Changed in version 3.3: Added support for @code{exact_type}.


@code{tokenize()} determines the source encoding of the file by looking for a
UTF-8 BOM or encoding cookie, according to 
@geindex Python Enhancement Proposals; PEP 263
PEP 263@footnote{https://peps.python.org/pep-0263/}.
@end deffn

@geindex generate_tokens() (in module tokenize)
@anchor{library/tokenize tokenize generate_tokens}@anchor{702}
@deffn {Function} tokenize.generate_tokens (readline)

Tokenize a source reading unicode strings instead of bytes.

Like @ref{701,,tokenize()}, the `readline' argument is a callable returning
a single line of input. However, @code{generate_tokens()} expects `readline'
to return a str object rather than bytes.

The result is an iterator yielding named tuples, exactly like
@ref{701,,tokenize()}. It does not yield an @ref{4f85,,ENCODING} token.
@end deffn

All constants from the @ref{101,,token} module are also exported from
@code{tokenize}.

Another function is provided to reverse the tokenization process. This is
useful for creating tools that tokenize a script, modify the token stream, and
write back the modified script.

@geindex untokenize() (in module tokenize)
@anchor{library/tokenize tokenize untokenize}@anchor{18f9}
@deffn {Function} tokenize.untokenize (iterable)

Converts tokens back into Python source code.  The `iterable' must return
sequences with at least two elements, the token type and the token string.
Any additional sequence elements are ignored.

The result is guaranteed to tokenize back to match the input so that the
conversion is lossless and round-trips are assured.  The guarantee applies
only to the token type and token string as the spacing between tokens
(column positions) may change.

It returns bytes, encoded using the @ref{4f85,,ENCODING} token, which
is the first token sequence output by @ref{701,,tokenize()}. If there is no
encoding token in the input, it returns a str instead.
@end deffn

@ref{701,,tokenize()} needs to detect the encoding of source files it tokenizes. The
function it uses to do this is available:

@geindex detect_encoding() (in module tokenize)
@anchor{library/tokenize tokenize detect_encoding}@anchor{1808}
@deffn {Function} tokenize.detect_encoding (readline)

The @code{detect_encoding()} function is used to detect the encoding that
should be used to decode a Python source file. It requires one argument,
readline, in the same way as the @ref{701,,tokenize()} generator.

It will call readline a maximum of twice, and return the encoding used
(as a string) and a list of any lines (not decoded from bytes) it has read
in.

It detects the encoding from the presence of a UTF-8 BOM or an encoding
cookie as specified in 
@geindex Python Enhancement Proposals; PEP 263
PEP 263@footnote{https://peps.python.org/pep-0263/}. If both a BOM and a cookie are present,
but disagree, a @ref{18f,,SyntaxError} will be raised. Note that if the BOM is found,
@code{'utf-8-sig'} will be returned as an encoding.

If no encoding is specified, then the default of @code{'utf-8'} will be
returned.

Use @ref{2d50,,open()} to open Python source files: it uses
@code{detect_encoding()} to detect the file encoding.
@end deffn

@geindex open() (in module tokenize)
@anchor{library/tokenize tokenize open}@anchor{2d50}
@deffn {Function} tokenize.open (filename)

Open a file in read only mode using the encoding detected by
@ref{1808,,detect_encoding()}.


Added in version 3.2.

@end deffn

@geindex TokenError
@anchor{library/tokenize tokenize TokenError}@anchor{765}
@deffn {Exception} tokenize.TokenError

Raised when either a docstring or expression that may be split over several
lines is not completed anywhere in the file, for example:

@example
"""Beginning of
docstring
@end example

or:

@example
[1,
 2,
 3
@end example
@end deffn

@node Command-Line Usage<4>,Examples<36>,Tokenizing Input,tokenize — Tokenizer for Python source
@anchor{library/tokenize command-line-usage}@anchor{4fbf}@anchor{library/tokenize tokenize-cli}@anchor{4fc0}
@subsubsection Command-Line Usage



Added in version 3.3.


The @code{tokenize} module can be executed as a script from the command line.
It is as simple as:

@example
python -m tokenize [-e] [filename.py]
@end example

The following options are accepted:

@geindex tokenize command line option; -h
@geindex tokenize command line option; --help
@anchor{library/tokenize cmdoption-tokenize-h}@anchor{4fc1}@anchor{library/tokenize cmdoption-tokenize-help}@anchor{4fc2}
@deffn {Option} @w{-}h, @w{-}@w{-}help

show this help message and exit
@end deffn

@geindex tokenize command line option; -e
@geindex tokenize command line option; --exact
@anchor{library/tokenize cmdoption-tokenize-e}@anchor{4fc3}@anchor{library/tokenize cmdoption-tokenize-exact}@anchor{4fc4}
@deffn {Option} @w{-}e, @w{-}@w{-}exact

display token names using the exact type
@end deffn

If @code{filename.py} is specified its contents are tokenized to stdout.
Otherwise, tokenization is performed on stdin.

@node Examples<36>,,Command-Line Usage<4>,tokenize — Tokenizer for Python source
@anchor{library/tokenize examples}@anchor{4fc5}
@subsubsection Examples


Example of a script rewriter that transforms float literals into Decimal
objects:

@example
from tokenize import tokenize, untokenize, NUMBER, STRING, NAME, OP
from io import BytesIO

def decistmt(s):
    """Substitute Decimals for floats in a string of statements.

    >>> from decimal import Decimal
    >>> s = 'print(+21.3e-5*-.1234/81.7)'
    >>> decistmt(s)
    "print (+Decimal ('21.3e-5')*-Decimal ('.1234')/Decimal ('81.7'))"

    The format of the exponent is inherited from the platform C library.
    Known cases are "e-007" (Windows) and "e-07" (not Windows).  Since
    we're only showing 12 digits, and the 13th isn't close to 5, the
    rest of the output should be platform-independent.

    >>> exec(s)  #doctest: +ELLIPSIS
    -3.21716034272e-0...7

    Output from calculations with Decimal should be identical across all
    platforms.

    >>> exec(decistmt(s))
    -3.217160342717258261933904529E-7
    """
    result = []
    g = tokenize(BytesIO(s.encode('utf-8')).readline)  # tokenize the string
    for toknum, tokval, _, _, _ in g:
        if toknum == NUMBER and '.' in tokval:  # replace NUMBER tokens
            result.extend([
                (NAME, 'Decimal'),
                (OP, '('),
                (STRING, repr(tokval)),
                (OP, ')')
            ])
        else:
            result.append((toknum, tokval))
    return untokenize(result).decode('utf-8')
@end example

Example of tokenizing from the command line.  The script:

@example
def say_hello():
    print("Hello, World!")

say_hello()
@end example

will be tokenized to the following output where the first column is the range
of the line/column coordinates where the token is found, the second column is
the name of the token, and the final column is the value of the token (if any)

@example
$ python -m tokenize hello.py
0,0-0,0:            ENCODING       'utf-8'
1,0-1,3:            NAME           'def'
1,4-1,13:           NAME           'say_hello'
1,13-1,14:          OP             '('
1,14-1,15:          OP             ')'
1,15-1,16:          OP             ':'
1,16-1,17:          NEWLINE        '\n'
2,0-2,4:            INDENT         '    '
2,4-2,9:            NAME           'print'
2,9-2,10:           OP             '('
2,10-2,25:          STRING         '"Hello, World!"'
2,25-2,26:          OP             ')'
2,26-2,27:          NEWLINE        '\n'
3,0-3,1:            NL             '\n'
4,0-4,0:            DEDENT         '@w{'}
4,0-4,9:            NAME           'say_hello'
4,9-4,10:           OP             '('
4,10-4,11:          OP             ')'
4,11-4,12:          NEWLINE        '\n'
5,0-5,0:            ENDMARKER      '@w{'}
@end example

The exact token type names can be displayed using the @ref{4fc3,,-e} option:

@example
$ python -m tokenize -e hello.py
0,0-0,0:            ENCODING       'utf-8'
1,0-1,3:            NAME           'def'
1,4-1,13:           NAME           'say_hello'
1,13-1,14:          LPAR           '('
1,14-1,15:          RPAR           ')'
1,15-1,16:          COLON          ':'
1,16-1,17:          NEWLINE        '\n'
2,0-2,4:            INDENT         '    '
2,4-2,9:            NAME           'print'
2,9-2,10:           LPAR           '('
2,10-2,25:          STRING         '"Hello, World!"'
2,25-2,26:          RPAR           ')'
2,26-2,27:          NEWLINE        '\n'
3,0-3,1:            NL             '\n'
4,0-4,0:            DEDENT         '@w{'}
4,0-4,9:            NAME           'say_hello'
4,9-4,10:           LPAR           '('
4,10-4,11:          RPAR           ')'
4,11-4,12:          NEWLINE        '\n'
5,0-5,0:            ENDMARKER      '@w{'}
@end example

Example of tokenizing a file programmatically, reading unicode
strings instead of bytes with @ref{702,,generate_tokens()}:

@example
import tokenize

with tokenize.open('hello.py') as f:
    tokens = tokenize.generate_tokens(f.readline)
    for token in tokens:
        print(token)
@end example

Or reading bytes directly with @ref{701,,tokenize()}:

@example
import tokenize

with open('hello.py', 'rb') as f:
    tokens = tokenize.tokenize(f.readline)
    for token in tokens:
        print(token)
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node tabnanny — Detection of ambiguous indentation,pyclbr — Python module browser support,tokenize — Tokenizer for Python source,Python Language Services
@anchor{library/tabnanny doc}@anchor{4fc6}@anchor{library/tabnanny module-tabnanny}@anchor{e3}@anchor{library/tabnanny tabnanny-detection-of-ambiguous-indentation}@anchor{4fc7}@anchor{library/tabnanny translation-repo}@anchor{4fc8}
@subsection @code{tabnanny} — Detection of ambiguous indentation


@geindex module; tabnanny

@c rudimentary documentation based on module comments

`Source code:' Lib/tabnanny.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/tabnanny.py}


__________________________________________________________________


For the time being this module is intended to be called as a script. However it
is possible to import it into an IDE and use the function @ref{4fc9,,check()}
described below.

@cartouche
@quotation Note 
The API provided by this module is likely to change in future releases; such
changes may not be backward compatible.
@end quotation
@end cartouche

@geindex check() (in module tabnanny)
@anchor{library/tabnanny tabnanny check}@anchor{4fc9}
@deffn {Function} tabnanny.check (file_or_dir)

If `file_or_dir' is a directory and not a symbolic link, then recursively
descend the directory tree named by `file_or_dir', checking all @code{.py}
files along the way.  If `file_or_dir' is an ordinary Python source file, it
is checked for whitespace related problems.  The diagnostic messages are
written to standard output using the @ref{117b,,print()} function.
@end deffn

@geindex verbose (in module tabnanny)
@anchor{library/tabnanny tabnanny verbose}@anchor{4fca}
@deffn {Data} tabnanny.verbose

Flag indicating whether to print verbose messages. This is incremented by the
@code{-v} option if called as a script.
@end deffn

@geindex filename_only (in module tabnanny)
@anchor{library/tabnanny tabnanny filename_only}@anchor{4fcb}
@deffn {Data} tabnanny.filename_only

Flag indicating whether to print only the filenames of files containing
whitespace related problems.  This is set to true by the @code{-q} option if called
as a script.
@end deffn

@geindex NannyNag
@anchor{library/tabnanny tabnanny NannyNag}@anchor{4fcc}
@deffn {Exception} tabnanny.NannyNag

Raised by @ref{4fcd,,process_tokens()} if detecting an ambiguous indent. Captured and
handled in @ref{4fc9,,check()}.
@end deffn

@geindex process_tokens() (in module tabnanny)
@anchor{library/tabnanny tabnanny process_tokens}@anchor{4fcd}
@deffn {Function} tabnanny.process_tokens (tokens)

This function is used by @ref{4fc9,,check()} to process tokens generated by the
@ref{102,,tokenize} module.
@end deffn

@c XXX document errprint, format_witnesses, Whitespace, check_equal, indents,
@c reset_globals


@subsubheading See also



@table @asis

@item Module @ref{102,,tokenize}

Lexical scanner for Python source code.
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node pyclbr — Python module browser support,py_compile — Compile Python source files,tabnanny — Detection of ambiguous indentation,Python Language Services
@anchor{library/pyclbr doc}@anchor{4fce}@anchor{library/pyclbr module-pyclbr}@anchor{b9}@anchor{library/pyclbr pyclbr-python-module-browser-support}@anchor{4fcf}@anchor{library/pyclbr translation-repo}@anchor{4fd0}
@subsection @code{pyclbr} — Python module browser support


@geindex module; pyclbr

`Source code:' Lib/pyclbr.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/pyclbr.py}


__________________________________________________________________


The @code{pyclbr} module provides limited information about the
functions, classes, and methods defined in a Python-coded module.  The
information is sufficient to implement a module browser.  The
information is extracted from the Python source code rather than by
importing the module, so this module is safe to use with untrusted code.
This restriction makes it impossible to use this module with modules not
implemented in Python, including all standard and optional extension
modules.

@geindex readmodule() (in module pyclbr)
@anchor{library/pyclbr pyclbr readmodule}@anchor{a32}
@deffn {Function} pyclbr.readmodule (module, path=None)

Return a dictionary mapping module-level class names to class
descriptors.  If possible, descriptors for imported base classes are
included.  Parameter `module' is a string with the name of the module
to read; it may be the name of a module within a package.  If given,
`path' is a sequence of directory paths prepended to @code{sys.path},
which is used to locate the module source code.

This function is the original interface and is only kept for back
compatibility.  It returns a filtered version of the following.
@end deffn

@geindex readmodule_ex() (in module pyclbr)
@anchor{library/pyclbr pyclbr readmodule_ex}@anchor{a33}
@deffn {Function} pyclbr.readmodule_ex (module, path=None)

Return a dictionary-based tree containing a function or class
descriptors for each function and class defined in the module with a
@code{def} or @code{class} statement.  The returned dictionary maps
module-level function and class names to their descriptors.  Nested
objects are entered into the children dictionary of their parent.  As
with readmodule, `module' names the module to be read and `path' is
prepended to sys.path.  If the module being read is a package, the
returned dictionary has a key @code{'__path__'} whose value is a list
containing the package search path.
@end deffn


Added in version 3.7: Descriptors for nested definitions.  They are accessed through the
new children attribute.  Each has a new parent attribute.


The descriptors returned by these functions are instances of
Function and Class classes.  Users are not expected to create instances
of these classes.

@menu
* Function Objects:: 
* Class Objects: Class Objects<2>. 

@end menu

@node Function Objects,Class Objects<2>,,pyclbr — Python module browser support
@anchor{library/pyclbr function-objects}@anchor{4fd1}@anchor{library/pyclbr pyclbr-function-objects}@anchor{4fd2}
@subsubsection Function Objects


@geindex Function (class in pyclbr)
@anchor{library/pyclbr pyclbr Function}@anchor{4fd3}
@deffn {Class} pyclbr.Function

Class @code{Function} instances describe functions defined by def
statements.  They have the following attributes:

@geindex file (pyclbr.Function attribute)
@anchor{library/pyclbr pyclbr Function file}@anchor{4fd4}
@deffn {Attribute} file

Name of the file in which the function is defined.
@end deffn

@geindex module (pyclbr.Function attribute)
@anchor{library/pyclbr pyclbr Function module}@anchor{4fd5}
@deffn {Attribute} module

The name of the module defining the function described.
@end deffn

@geindex name (pyclbr.Function attribute)
@anchor{library/pyclbr pyclbr Function name}@anchor{4fd6}
@deffn {Attribute} name

The name of the function.
@end deffn

@geindex lineno (pyclbr.Function attribute)
@anchor{library/pyclbr pyclbr Function lineno}@anchor{4fd7}
@deffn {Attribute} lineno

The line number in the file where the definition starts.
@end deffn

@geindex parent (pyclbr.Function attribute)
@anchor{library/pyclbr pyclbr Function parent}@anchor{4fd8}
@deffn {Attribute} parent

For top-level functions, @code{None}.  For nested functions, the parent.


Added in version 3.7.

@end deffn

@geindex children (pyclbr.Function attribute)
@anchor{library/pyclbr pyclbr Function children}@anchor{4fd9}
@deffn {Attribute} children

A @ref{184,,dictionary} mapping names to descriptors for nested functions and
classes.


Added in version 3.7.

@end deffn

@geindex is_async (pyclbr.Function attribute)
@anchor{library/pyclbr pyclbr Function is_async}@anchor{4fda}
@deffn {Attribute} is_async

@code{True} for functions that are defined with the
@ref{7ee,,async} prefix, @code{False} otherwise.


Added in version 3.10.

@end deffn
@end deffn

@node Class Objects<2>,,Function Objects,pyclbr — Python module browser support
@anchor{library/pyclbr class-objects}@anchor{4fdb}@anchor{library/pyclbr pyclbr-class-objects}@anchor{4fdc}
@subsubsection Class Objects


@geindex Class (class in pyclbr)
@anchor{library/pyclbr pyclbr Class}@anchor{4fdd}
@deffn {Class} pyclbr.Class

Class @code{Class} instances describe classes defined by class
statements.  They have the same attributes as @ref{4fd3,,Functions}
and two more.

@geindex file (pyclbr.Class attribute)
@anchor{library/pyclbr pyclbr Class file}@anchor{4fde}
@deffn {Attribute} file

Name of the file in which the class is defined.
@end deffn

@geindex module (pyclbr.Class attribute)
@anchor{library/pyclbr pyclbr Class module}@anchor{4fdf}
@deffn {Attribute} module

The name of the module defining the class described.
@end deffn

@geindex name (pyclbr.Class attribute)
@anchor{library/pyclbr pyclbr Class name}@anchor{4fe0}
@deffn {Attribute} name

The name of the class.
@end deffn

@geindex lineno (pyclbr.Class attribute)
@anchor{library/pyclbr pyclbr Class lineno}@anchor{4fe1}
@deffn {Attribute} lineno

The line number in the file where the definition starts.
@end deffn

@geindex parent (pyclbr.Class attribute)
@anchor{library/pyclbr pyclbr Class parent}@anchor{4fe2}
@deffn {Attribute} parent

For top-level classes, @code{None}.  For nested classes, the parent.


Added in version 3.7.

@end deffn

@geindex children (pyclbr.Class attribute)
@anchor{library/pyclbr pyclbr Class children}@anchor{4fe3}
@deffn {Attribute} children

A dictionary mapping names to descriptors for nested functions and
classes.


Added in version 3.7.

@end deffn

@geindex super (pyclbr.Class attribute)
@anchor{library/pyclbr pyclbr Class super}@anchor{4fe4}
@deffn {Attribute} super

A list of @code{Class} objects which describe the immediate base
classes of the class being described.  Classes which are named as
superclasses but which are not discoverable by @ref{a33,,readmodule_ex()}
are listed as a string with the class name instead of as
@code{Class} objects.
@end deffn

@geindex methods (pyclbr.Class attribute)
@anchor{library/pyclbr pyclbr Class methods}@anchor{4fe5}
@deffn {Attribute} methods

A @ref{184,,dictionary} mapping method names to line numbers.
This can be derived from the newer @ref{4fe3,,children} dictionary,
but remains for
back-compatibility.
@end deffn
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node py_compile — Compile Python source files,compileall — Byte-compile Python libraries,pyclbr — Python module browser support,Python Language Services
@anchor{library/py_compile doc}@anchor{4fe6}@anchor{library/py_compile module-py_compile}@anchor{b8}@anchor{library/py_compile py-compile-compile-python-source-files}@anchor{4fe7}@anchor{library/py_compile translation-repo}@anchor{4fe8}
@subsection @code{py_compile} — Compile Python source files


@geindex module; py_compile

@c documentation based on module docstrings

`Source code:' Lib/py_compile.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/py_compile.py}

@geindex file; byte-code


__________________________________________________________________


The @code{py_compile} module provides a function to generate a byte-code file
from a source file, and another function used when the module source file is
invoked as a script.

Though not often needed, this function can be useful when installing modules for
shared use, especially if some of the users may not have permission to write the
byte-code cache files in the directory containing the source code.

@geindex PyCompileError
@anchor{library/py_compile py_compile PyCompileError}@anchor{4fe9}
@deffn {Exception} py_compile.PyCompileError

Exception raised when an error occurs while attempting to compile the file.
@end deffn

@geindex compile() (in module py_compile)
@anchor{library/py_compile py_compile compile}@anchor{c20}
@deffn {Function} py_compile.compile (file, cfile=None, dfile=None, doraise=False, optimize=-1, invalidation_mode=PycInvalidationMode.TIMESTAMP, quiet=0)

Compile a source file to byte-code and write out the byte-code cache file.
The source code is loaded from the file named `file'.  The byte-code is
written to `cfile', which defaults to the 
@geindex Python Enhancement Proposals; PEP 3147
PEP 3147@footnote{https://peps.python.org/pep-3147/}/
@geindex Python Enhancement Proposals; PEP 488
PEP 488@footnote{https://peps.python.org/pep-0488/} path, ending
in @code{.pyc}.
For example, if `file' is @code{/foo/bar/baz.py} `cfile' will default to
@code{/foo/bar/__pycache__/baz.cpython-32.pyc} for Python 3.2.  If `dfile' is
specified, it is used instead of `file' as the name of the source file from
which source lines are obtained for display in exception tracebacks.
If `doraise' is true, a @ref{4fe9,,PyCompileError} is raised
when an error is encountered while compiling `file'. If `doraise' is false
(the default), an error string is written to @code{sys.stderr}, but no exception
is raised.  This function returns the path to byte-compiled file, i.e.
whatever `cfile' value was used.

The `doraise' and `quiet' arguments determine how errors are handled while
compiling file. If `quiet' is 0 or 1, and `doraise' is false, the default
behaviour is enabled: an error string is written to @code{sys.stderr}, and the
function returns @code{None} instead of a path. If `doraise' is true,
a @ref{4fe9,,PyCompileError} is raised instead. However if `quiet' is 2,
no message is written, and `doraise' has no effect.

If the path that `cfile' becomes (either explicitly specified or computed)
is a symlink or non-regular file, @ref{1226,,FileExistsError} will be raised.
This is to act as a warning that import will turn those paths into regular
files if it is allowed to write byte-compiled files to those paths. This is
a side-effect of import using file renaming to place the final byte-compiled
file into place to prevent concurrent file writing issues.

`optimize' controls the optimization level and is passed to the built-in
@code{compile()} function.  The default of @code{-1} selects the optimization
level of the current interpreter.

`invalidation_mode' should be a member of the @ref{4fea,,PycInvalidationMode}
enum and controls how the generated bytecode cache is invalidated at
runtime.  The default is @ref{4feb,,PycInvalidationMode.CHECKED_HASH} if
the 
@geindex SOURCE_DATE_EPOCH
@geindex environment variable; SOURCE_DATE_EPOCH
@code{SOURCE_DATE_EPOCH} environment variable is set, otherwise
the default is @ref{4fec,,PycInvalidationMode.TIMESTAMP}.


Changed in version 3.2: Changed default value of `cfile' to be 
@geindex Python Enhancement Proposals; PEP 3147
PEP 3147@footnote{https://peps.python.org/pep-3147/}-compliant.  Previous
default was `file' + @code{'c'} (@code{'o'} if optimization was enabled).
Also added the `optimize' parameter.



Changed in version 3.4: Changed code to use @ref{7b,,importlib} for the byte-code cache file writing.
This means file creation/writing semantics now match what @code{importlib}
does, e.g. permissions, write-and-move semantics, etc. Also added the
caveat that @ref{1226,,FileExistsError} is raised if `cfile' is a symlink or
non-regular file.



Changed in version 3.7: The `invalidation_mode' parameter was added as specified in 
@geindex Python Enhancement Proposals; PEP 552
PEP 552@footnote{https://peps.python.org/pep-0552/}.
If the 
@geindex SOURCE_DATE_EPOCH
@geindex environment variable; SOURCE_DATE_EPOCH
@code{SOURCE_DATE_EPOCH} environment variable is set,
`invalidation_mode' will be forced to
@ref{4feb,,PycInvalidationMode.CHECKED_HASH}.



Changed in version 3.7.2: The 
@geindex SOURCE_DATE_EPOCH
@geindex environment variable; SOURCE_DATE_EPOCH
@code{SOURCE_DATE_EPOCH} environment variable no longer
overrides the value of the `invalidation_mode' argument, and determines
its default value instead.



Changed in version 3.8: The `quiet' parameter was added.

@end deffn

@geindex PycInvalidationMode (class in py_compile)
@anchor{library/py_compile py_compile PycInvalidationMode}@anchor{4fea}
@deffn {Class} py_compile.PycInvalidationMode

An enumeration of possible methods the interpreter can use to determine
whether a bytecode file is up to date with a source file. The @code{.pyc} file
indicates the desired invalidation mode in its header. See
@ref{803,,Cached bytecode invalidation} for more information on how Python invalidates
@code{.pyc} files at runtime.


Added in version 3.7.


@geindex TIMESTAMP (py_compile.PycInvalidationMode attribute)
@anchor{library/py_compile py_compile PycInvalidationMode TIMESTAMP}@anchor{4fec}
@deffn {Attribute} TIMESTAMP

The @code{.pyc} file includes the timestamp and size of the source file,
which Python will compare against the metadata of the source file at
runtime to determine if the @code{.pyc} file needs to be regenerated.
@end deffn

@geindex CHECKED_HASH (py_compile.PycInvalidationMode attribute)
@anchor{library/py_compile py_compile PycInvalidationMode CHECKED_HASH}@anchor{4feb}
@deffn {Attribute} CHECKED_HASH

The @code{.pyc} file includes a hash of the source file content, which Python
will compare against the source at runtime to determine if the @code{.pyc}
file needs to be regenerated.
@end deffn

@geindex UNCHECKED_HASH (py_compile.PycInvalidationMode attribute)
@anchor{library/py_compile py_compile PycInvalidationMode UNCHECKED_HASH}@anchor{4fed}
@deffn {Attribute} UNCHECKED_HASH

Like @ref{4feb,,CHECKED_HASH}, the @code{.pyc} file includes a hash of the source
file content. However, Python will at runtime assume the @code{.pyc} file is
up to date and not validate the @code{.pyc} against the source file at all.

This option is useful when the @code{.pycs} are kept up to date by some
system external to Python like a build system.
@end deffn
@end deffn

@menu
* Command-Line Interface: Command-Line Interface<5>. 

@end menu

@node Command-Line Interface<5>,,,py_compile — Compile Python source files
@anchor{library/py_compile command-line-interface}@anchor{4fee}@anchor{library/py_compile py-compile-cli}@anchor{4fef}
@subsubsection Command-Line Interface


This module can be invoked as a script to compile several source
files.  The files named in `filenames' are compiled and the resulting
bytecode is cached in the normal manner.  This program does not search
a directory structure to locate source files; it only compiles files
named explicitly. The exit status is nonzero if one of the files could
not be compiled.

@geindex python--m-py_compile command line option; <file>
@geindex python--m-py_compile command line option; -
@anchor{library/py_compile cmdoption-python-m-py_compile-arg-file}@anchor{4ff0}
@deffn {Option} <file> ... <fileN>
@anchor{library/py_compile cmdoption-python-m-py_compile}@anchor{4ff1}
@deffnx {Option} @w{-}

Positional arguments are files to compile.  If @code{-} is the only
parameter, the list of files is taken from standard input.
@end deffn

@geindex python--m-py_compile command line option; -q
@geindex python--m-py_compile command line option; --quiet
@anchor{library/py_compile cmdoption-python-m-py_compile-q}@anchor{4ff2}@anchor{library/py_compile cmdoption-python-m-py_compile-quiet}@anchor{4ff3}
@deffn {Option} @w{-}q, @w{-}@w{-}quiet

Suppress errors output.
@end deffn


Changed in version 3.2: Added support for @code{-}.



Changed in version 3.10: Added support for @ref{4ff2,,-q}.



@subsubheading See also



@table @asis

@item Module @ref{21,,compileall}

Utilities to compile all Python source files in a directory tree.
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node compileall — Byte-compile Python libraries,dis — Disassembler for Python bytecode,py_compile — Compile Python source files,Python Language Services
@anchor{library/compileall doc}@anchor{4ff4}@anchor{library/compileall compileall-byte-compile-python-libraries}@anchor{4ff5}@anchor{library/compileall module-compileall}@anchor{21}@anchor{library/compileall translation-repo}@anchor{4ff6}
@subsection @code{compileall} — Byte-compile Python libraries


@geindex module; compileall

`Source code:' Lib/compileall.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/compileall.py}


__________________________________________________________________


This module provides some utility functions to support installing Python
libraries.  These functions compile Python source files in a directory tree.
This module can be used to create the cached byte-code files at library
installation time, which makes them available for use even by users who don’t
have write permission to the library directories.

@c include for modules that don't work on WASM

@ref{2181,,Availability}: not WASI.

This module does not work or is not available on WebAssembly. See
@ref{1bae,,WebAssembly platforms} for more information.

@menu
* Command-line use:: 
* Public functions:: 

@end menu

@node Command-line use,Public functions,,compileall — Byte-compile Python libraries
@anchor{library/compileall command-line-use}@anchor{4ff7}@anchor{library/compileall compileall-cli}@anchor{4ff8}
@subsubsection Command-line use


This module can work as a script (using @code{python -m compileall}) to
compile Python sources.

@geindex compileall command line option; directory
@geindex compileall command line option; file
@anchor{library/compileall cmdoption-compileall-arg-directory}@anchor{4ff9}
@deffn {Option} directory ...
@anchor{library/compileall cmdoption-compileall-arg-file}@anchor{4ffa}
@deffnx {Option} file ...

Positional arguments are files to compile or directories that contain
source files, traversed recursively.  If no argument is given, behave as if
the command line was @code{-l @var{<directories from sys.path>}}.
@end deffn

@geindex compileall command line option; -l
@anchor{library/compileall cmdoption-compileall-l}@anchor{4ffb}
@deffn {Option} @w{-}l

Do not recurse into subdirectories, only compile source code files directly
contained in the named or implied directories.
@end deffn

@geindex compileall command line option; -f
@anchor{library/compileall cmdoption-compileall-f}@anchor{4ffc}
@deffn {Option} @w{-}f

Force rebuild even if timestamps are up-to-date.
@end deffn

@geindex compileall command line option; -q
@anchor{library/compileall cmdoption-compileall-q}@anchor{4ffd}
@deffn {Option} @w{-}q

Do not print the list of files compiled. If passed once, error messages will
still be printed. If passed twice (@code{-qq}), all output is suppressed.
@end deffn

@geindex compileall command line option; -d
@anchor{library/compileall cmdoption-compileall-d}@anchor{4ffe}
@deffn {Option} @w{-}d destdir

Directory prepended to the path to each file being compiled.  This will
appear in compilation time tracebacks, and is also compiled in to the
byte-code file, where it will be used in tracebacks and other messages in
cases where the source file does not exist at the time the byte-code file is
executed.
@end deffn

@geindex compileall command line option; -s
@anchor{library/compileall cmdoption-compileall-s}@anchor{4fff}
@deffn {Option} @w{-}s strip_prefix

Remove the given prefix from paths recorded in the @code{.pyc} files.
Paths are made relative to the prefix.

This option can be used with @code{-p} but not with @code{-d}.
@end deffn

@geindex compileall command line option; -p
@anchor{library/compileall cmdoption-compileall-p}@anchor{5000}
@deffn {Option} @w{-}p prepend_prefix

Prepend the given prefix to paths recorded in the @code{.pyc} files.
Use @code{-p /} to make the paths absolute.

This option can be used with @code{-s} but not with @code{-d}.
@end deffn

@geindex compileall command line option; -x
@anchor{library/compileall cmdoption-compileall-x}@anchor{5001}
@deffn {Option} @w{-}x regex

regex is used to search the full path to each file considered for
compilation, and if the regex produces a match, the file is skipped.
@end deffn

@geindex compileall command line option; -i
@anchor{library/compileall cmdoption-compileall-i}@anchor{5002}
@deffn {Option} @w{-}i list

Read the file @code{list} and add each line that it contains to the list of
files and directories to compile.  If @code{list} is @code{-}, read lines from
@code{stdin}.
@end deffn

@geindex compileall command line option; -b
@anchor{library/compileall cmdoption-compileall-b}@anchor{5003}
@deffn {Option} @w{-}b

Write the byte-code files to their legacy locations and names, which may
overwrite byte-code files created by another version of Python.  The default
is to write files to their 
@geindex Python Enhancement Proposals; PEP 3147
PEP 3147@footnote{https://peps.python.org/pep-3147/} locations and names, which allows
byte-code files from multiple versions of Python to coexist.
@end deffn

@geindex compileall command line option; -r
@anchor{library/compileall cmdoption-compileall-r}@anchor{5004}
@deffn {Option} @w{-}r

Control the maximum recursion level for subdirectories.
If this is given, then @code{-l} option will not be taken into account.
@code{python -m compileall <directory> -r 0} is equivalent to
@code{python -m compileall <directory> -l}.
@end deffn

@geindex compileall command line option; -j
@anchor{library/compileall cmdoption-compileall-j}@anchor{5005}
@deffn {Option} @w{-}j N

Use `N' workers to compile the files within the given directory.
If @code{0} is used, then the result of @ref{4db,,os.process_cpu_count()}
will be used.
@end deffn

@geindex compileall command line option; --invalidation-mode
@anchor{library/compileall cmdoption-compileall-invalidation-mode}@anchor{5006}
@deffn {Option} @w{-}@w{-}invalidation@w{-}mode [timestamp|checked@w{-}hash|unchecked@w{-}hash]

Control how the generated byte-code files are invalidated at runtime.
The @code{timestamp} value, means that @code{.pyc} files with the source timestamp
and size embedded will be generated. The @code{checked-hash} and
@code{unchecked-hash} values cause hash-based pycs to be generated. Hash-based
pycs embed a hash of the source file contents rather than a timestamp. See
@ref{803,,Cached bytecode invalidation} for more information on how Python validates
bytecode cache files at runtime.
The default is @code{timestamp} if the 
@geindex SOURCE_DATE_EPOCH
@geindex environment variable; SOURCE_DATE_EPOCH
@code{SOURCE_DATE_EPOCH} environment
variable is not set, and @code{checked-hash} if the @code{SOURCE_DATE_EPOCH}
environment variable is set.
@end deffn

@geindex compileall command line option; -o
@anchor{library/compileall cmdoption-compileall-o}@anchor{5007}
@deffn {Option} @w{-}o level

Compile with the given optimization level. May be used multiple times
to compile for multiple levels at a time (for example,
@code{compileall -o 1 -o 2}).
@end deffn

@geindex compileall command line option; -e
@anchor{library/compileall cmdoption-compileall-e}@anchor{5008}
@deffn {Option} @w{-}e dir

Ignore symlinks pointing outside the given directory.
@end deffn

@geindex compileall command line option; --hardlink-dupes
@anchor{library/compileall cmdoption-compileall-hardlink-dupes}@anchor{5009}
@deffn {Option} @w{-}@w{-}hardlink@w{-}dupes

If two @code{.pyc} files with different optimization level have
the same content, use hard links to consolidate duplicate files.
@end deffn


Changed in version 3.2: Added the @code{-i}, @code{-b} and @code{-h} options.



Changed in version 3.5: Added the  @code{-j}, @code{-r}, and @code{-qq} options.  @code{-q} option
was changed to a multilevel value.  @code{-b} will always produce a
byte-code file ending in @code{.pyc}, never @code{.pyo}.



Changed in version 3.7: Added the @code{--invalidation-mode} option.



Changed in version 3.9: Added the @code{-s}, @code{-p}, @code{-e} and @code{--hardlink-dupes} options.
Raised the default recursion limit from 10 to
@ref{6ec,,sys.getrecursionlimit()}.
Added the possibility to specify the @code{-o} option multiple times.


There is no command-line option to control the optimization level used by the
@ref{4b2,,compile()} function, because the Python interpreter itself already
provides the option: @code{python -O -m compileall}.

Similarly, the @ref{4b2,,compile()} function respects the @ref{ba2,,sys.pycache_prefix}
setting. The generated bytecode cache will only be useful if @code{compile()} is
run with the same @code{sys.pycache_prefix} (if any) that will be used at
runtime.

@node Public functions,,Command-line use,compileall — Byte-compile Python libraries
@anchor{library/compileall public-functions}@anchor{500a}
@subsubsection Public functions


@geindex compile_dir() (in module compileall)
@anchor{library/compileall compileall compile_dir}@anchor{d21}
@deffn {Function} compileall.compile_dir (dir, maxlevels=sys.getrecursionlimit(), ddir=None, force=False, rx=None, quiet=0, legacy=False, optimize=-1, workers=1, invalidation_mode=None, *, stripdir=None, prependdir=None, limit_sl_dest=None, hardlink_dupes=False)

Recursively descend the directory tree named by `dir', compiling all @code{.py}
files along the way. Return a true value if all the files compiled successfully,
and a false value otherwise.

The `maxlevels' parameter is used to limit the depth of the recursion; it
defaults to @code{sys.getrecursionlimit()}.

If `ddir' is given, it is prepended to the path to each file being compiled
for use in compilation time tracebacks, and is also compiled in to the
byte-code file, where it will be used in tracebacks and other messages in
cases where the source file does not exist at the time the byte-code file is
executed.

If `force' is true, modules are re-compiled even if the timestamps are up to
date.

If `rx' is given, its @code{search} method is called on the complete path to each
file considered for compilation, and if it returns a true value, the file
is skipped. This can be used to exclude files matching a regular expression,
given as a @ref{118d,,re.Pattern} object.

If `quiet' is @code{False} or @code{0} (the default), the filenames and other
information are printed to standard out. Set to @code{1}, only errors are
printed. Set to @code{2}, all output is suppressed.

If `legacy' is true, byte-code files are written to their legacy locations
and names, which may overwrite byte-code files created by another version of
Python.  The default is to write files to their 
@geindex Python Enhancement Proposals; PEP 3147
PEP 3147@footnote{https://peps.python.org/pep-3147/} locations and
names, which allows byte-code files from multiple versions of Python to
coexist.

`optimize' specifies the optimization level for the compiler.  It is passed to
the built-in @ref{4b2,,compile()} function. Accepts also a sequence of optimization
levels which lead to multiple compilations of one @code{.py} file in one call.

The argument `workers' specifies how many workers are used to
compile files in parallel. The default is to not use multiple workers.
If the platform can’t use multiple workers and `workers' argument is given,
then sequential compilation will be used as a fallback.  If `workers'
is 0, the number of cores in the system is used.  If `workers' is
lower than @code{0}, a @ref{2ee,,ValueError} will be raised.

`invalidation_mode' should be a member of the
@ref{4fea,,py_compile.PycInvalidationMode} enum and controls how the generated
pycs are invalidated at runtime.

The `stripdir', `prependdir' and `limit_sl_dest' arguments correspond to
the @code{-s}, @code{-p} and @code{-e} options described above.
They may be specified as @code{str} or @ref{e51,,os.PathLike}.

If `hardlink_dupes' is true and two @code{.pyc} files with different optimization
level have the same content, use hard links to consolidate duplicate files.


Changed in version 3.2: Added the `legacy' and `optimize' parameter.



Changed in version 3.5: Added the `workers' parameter.



Changed in version 3.5: `quiet' parameter was changed to a multilevel value.



Changed in version 3.5: The `legacy' parameter only writes out @code{.pyc} files, not @code{.pyo} files
no matter what the value of `optimize' is.



Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.



Changed in version 3.7: The `invalidation_mode' parameter was added.



Changed in version 3.7.2: The `invalidation_mode' parameter’s default value is updated to @code{None}.



Changed in version 3.8: Setting `workers' to 0 now chooses the optimal number of cores.



Changed in version 3.9: Added `stripdir', `prependdir', `limit_sl_dest' and `hardlink_dupes' arguments.
Default value of `maxlevels' was changed from @code{10} to @code{sys.getrecursionlimit()}

@end deffn

@geindex compile_file() (in module compileall)
@anchor{library/compileall compileall compile_file}@anchor{fe7}
@deffn {Function} compileall.compile_file (fullname, ddir=None, force=False, rx=None, quiet=0, legacy=False, optimize=-1, invalidation_mode=None, *, stripdir=None, prependdir=None, limit_sl_dest=None, hardlink_dupes=False)

Compile the file with path `fullname'. Return a true value if the file
compiled successfully, and a false value otherwise.

If `ddir' is given, it is prepended to the path to the file being compiled
for use in compilation time tracebacks, and is also compiled in to the
byte-code file, where it will be used in tracebacks and other messages in
cases where the source file does not exist at the time the byte-code file is
executed.

If `rx' is given, its @code{search} method is passed the full path name to the
file being compiled, and if it returns a true value, the file is not
compiled and @code{True} is returned. This can be used to exclude files matching
a regular expression, given as a @ref{118d,,re.Pattern} object.

If `quiet' is @code{False} or @code{0} (the default), the filenames and other
information are printed to standard out. Set to @code{1}, only errors are
printed. Set to @code{2}, all output is suppressed.

If `legacy' is true, byte-code files are written to their legacy locations
and names, which may overwrite byte-code files created by another version of
Python.  The default is to write files to their 
@geindex Python Enhancement Proposals; PEP 3147
PEP 3147@footnote{https://peps.python.org/pep-3147/} locations and
names, which allows byte-code files from multiple versions of Python to
coexist.

`optimize' specifies the optimization level for the compiler.  It is passed to
the built-in @ref{4b2,,compile()} function. Accepts also a sequence of optimization
levels which lead to multiple compilations of one @code{.py} file in one call.

`invalidation_mode' should be a member of the
@ref{4fea,,py_compile.PycInvalidationMode} enum and controls how the generated
pycs are invalidated at runtime.

The `stripdir', `prependdir' and `limit_sl_dest' arguments correspond to
the @code{-s}, @code{-p} and @code{-e} options described above.
They may be specified as @code{str} or @ref{e51,,os.PathLike}.

If `hardlink_dupes' is true and two @code{.pyc} files with different optimization
level have the same content, use hard links to consolidate duplicate files.


Added in version 3.2.



Changed in version 3.5: `quiet' parameter was changed to a multilevel value.



Changed in version 3.5: The `legacy' parameter only writes out @code{.pyc} files, not @code{.pyo} files
no matter what the value of `optimize' is.



Changed in version 3.7: The `invalidation_mode' parameter was added.



Changed in version 3.7.2: The `invalidation_mode' parameter’s default value is updated to @code{None}.



Changed in version 3.9: Added `stripdir', `prependdir', `limit_sl_dest' and `hardlink_dupes' arguments.

@end deffn

@geindex compile_path() (in module compileall)
@anchor{library/compileall compileall compile_path}@anchor{fe8}
@deffn {Function} compileall.compile_path (skip_curdir=True, maxlevels=0, force=False, quiet=0, legacy=False, optimize=-1, invalidation_mode=None)

Byte-compile all the @code{.py} files found along @code{sys.path}. Return a
true value if all the files compiled successfully, and a false value otherwise.

If `skip_curdir' is true (the default), the current directory is not included
in the search.  All other parameters are passed to the @ref{d21,,compile_dir()}
function.  Note that unlike the other compile functions, @code{maxlevels}
defaults to @code{0}.


Changed in version 3.2: Added the `legacy' and `optimize' parameter.



Changed in version 3.5: `quiet' parameter was changed to a multilevel value.



Changed in version 3.5: The `legacy' parameter only writes out @code{.pyc} files, not @code{.pyo} files
no matter what the value of `optimize' is.



Changed in version 3.7: The `invalidation_mode' parameter was added.



Changed in version 3.7.2: The `invalidation_mode' parameter’s default value is updated to @code{None}.

@end deffn

To force a recompile of all the @code{.py} files in the @code{Lib/}
subdirectory and all its subdirectories:

@example
import compileall

compileall.compile_dir('Lib/', force=True)

# Perform same compilation, excluding files in .svn directories.
import re
compileall.compile_dir('Lib/', rx=re.compile(r'[/\\][.]svn'), force=True)

# pathlib.Path objects can also be used.
import pathlib
compileall.compile_dir(pathlib.Path('Lib/'), force=True)
@end example


@subsubheading See also



@table @asis

@item Module @ref{b8,,py_compile}

Byte-compile a single source file.
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node dis — Disassembler for Python bytecode,pickletools — Tools for pickle developers,compileall — Byte-compile Python libraries,Python Language Services
@anchor{library/dis doc}@anchor{500b}@anchor{library/dis dis-disassembler-for-python-bytecode}@anchor{500c}@anchor{library/dis module-dis}@anchor{3c}@anchor{library/dis translation-repo}@anchor{500d}
@subsection @code{dis} — Disassembler for Python bytecode


@geindex module; dis

`Source code:' Lib/dis.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/dis.py}

@c import dis
@c def myfunc(alist):
@c     return len(alist)


__________________________________________________________________


The @code{dis} module supports the analysis of CPython @ref{4ab,,bytecode} by
disassembling it. The CPython bytecode which this module takes as an input is
defined in the file @code{Include/opcode.h} and used by the compiler and the
interpreter.

`CPython implementation detail:' Bytecode is an implementation detail of the CPython interpreter.  No
guarantees are made that bytecode will not be added, removed, or changed
between versions of Python.  Use of this module should not be considered to
work across Python VMs or Python releases.


Changed in version 3.6: Use 2 bytes for each instruction. Previously the number of bytes varied
by instruction.



Changed in version 3.10: The argument of jump, exception handling and loop instructions is now
the instruction offset rather than the byte offset.



Changed in version 3.11: Some instructions are accompanied by one or more inline cache entries,
which take the form of @ref{90a,,CACHE} instructions. These instructions
are hidden by default, but can be shown by passing @code{show_caches=True} to
any @code{dis} utility. Furthermore, the interpreter now adapts the
bytecode to specialize it for different runtime conditions. The
adaptive bytecode can be shown by passing @code{adaptive=True}.



Changed in version 3.12: The argument of a jump is the offset of the target instruction relative
to the instruction that appears immediately after the jump instruction’s
@ref{90a,,CACHE} entries.

As a consequence, the presence of the @ref{90a,,CACHE} instructions is
transparent for forward jumps but needs to be taken into account when
reasoning about backward jumps.



Changed in version 3.13: The output shows logical labels rather than instruction offsets
for jump targets and exception handlers. The @code{-O} command line
option and the @code{show_offsets} argument were added.



Changed in version 3.14: The @ref{20a,,-P} command-line option
and the @code{show_positions} argument were added.

The @ref{20b,,-S} command-line option is added.


Example: Given the function @code{myfunc()}:

@example
def myfunc(alist):
    return len(alist)
@end example

the following command can be used to display the disassembly of
@code{myfunc()}:

@example
>>> dis.dis(myfunc)
  2           RESUME                   0

  3           LOAD_GLOBAL              1 (len + NULL)
              LOAD_FAST_BORROW         0 (alist)
              CALL                     1
              RETURN_VALUE
@end example

(The “2” is a line number).

@menu
* Command-line interface: Command-line interface<12>. 
* Bytecode analysis:: 
* Analysis functions:: 
* Python Bytecode Instructions:: 
* Opcode collections:: 

@end menu

@node Command-line interface<12>,Bytecode analysis,,dis — Disassembler for Python bytecode
@anchor{library/dis command-line-interface}@anchor{500e}@anchor{library/dis dis-cli}@anchor{500f}
@subsubsection Command-line interface


The @code{dis} module can be invoked as a script from the command line:

@example
python -m dis [-h] [-C] [-O] [-P] [-S] [infile]
@end example

The following options are accepted:

@geindex dis command line option; -h
@geindex dis command line option; --help
@anchor{library/dis cmdoption-dis-h}@anchor{5010}@anchor{library/dis cmdoption-dis-help}@anchor{5011}
@deffn {Option} @w{-}h, @w{-}@w{-}help

Display usage and exit.
@end deffn

@geindex dis command line option; -C
@geindex dis command line option; --show-caches
@anchor{library/dis cmdoption-dis-C}@anchor{5012}@anchor{library/dis cmdoption-dis-show-caches}@anchor{5013}
@deffn {Option} @w{-}C, @w{-}@w{-}show@w{-}caches

Show inline caches.


Added in version 3.13.

@end deffn

@geindex dis command line option; -O
@geindex dis command line option; --show-offsets
@anchor{library/dis cmdoption-dis-O}@anchor{4ec}@anchor{library/dis cmdoption-dis-show-offsets}@anchor{5014}
@deffn {Option} @w{-}O, @w{-}@w{-}show@w{-}offsets

Show offsets of instructions.


Added in version 3.13.

@end deffn

@geindex dis command line option; -P
@geindex dis command line option; --show-positions
@anchor{library/dis cmdoption-dis-P}@anchor{20a}@anchor{library/dis cmdoption-dis-show-positions}@anchor{5015}
@deffn {Option} @w{-}P, @w{-}@w{-}show@w{-}positions

Show positions of instructions in the source code.


Added in version 3.14.

@end deffn

@geindex dis command line option; -S
@geindex dis command line option; --specialized
@anchor{library/dis cmdoption-dis-S}@anchor{20b}@anchor{library/dis cmdoption-dis-specialized}@anchor{5016}
@deffn {Option} @w{-}S, @w{-}@w{-}specialized

Show specialized bytecode.


Added in version 3.14.

@end deffn

If @code{infile} is specified, its disassembled code will be written to stdout.
Otherwise, disassembly is performed on compiled source code received from stdin.

@node Bytecode analysis,Analysis functions,Command-line interface<12>,dis — Disassembler for Python bytecode
@anchor{library/dis bytecode-analysis}@anchor{5017}
@subsubsection Bytecode analysis



Added in version 3.4.


The bytecode analysis API allows pieces of Python code to be wrapped in a
@ref{206,,Bytecode} object that provides easy access to details of the compiled
code.

@geindex Bytecode (class in dis)
@anchor{library/dis dis Bytecode}@anchor{206}
@deffn {Class} dis.Bytecode (x, *, first_line=None, current_offset=None, show_caches=False, adaptive=False, show_offsets=False, show_positions=False)

Analyse the bytecode corresponding to a function, generator, asynchronous
generator, coroutine, method, string of source code, or a code object (as
returned by @ref{4b2,,compile()}).

This is a convenience wrapper around many of the functions listed below, most
notably @ref{4ed,,get_instructions()}, as iterating over a @code{Bytecode}
instance yields the bytecode operations as @ref{205,,Instruction} instances.

If `first_line' is not @code{None}, it indicates the line number that should be
reported for the first source line in the disassembled code.  Otherwise, the
source line information (if any) is taken directly from the disassembled code
object.

If `current_offset' is not @code{None}, it refers to an instruction offset in the
disassembled code. Setting this means @ref{1135,,dis()} will display a “current
instruction” marker against the specified opcode.

If `show_caches' is @code{True}, @ref{1135,,dis()} will display inline cache
entries used by the interpreter to specialize the bytecode.

If `adaptive' is @code{True}, @ref{1135,,dis()} will display specialized bytecode
that may be different from the original bytecode.

If `show_offsets' is @code{True}, @ref{1135,,dis()} will include instruction
offsets in the output.

If `show_positions' is @code{True}, @ref{1135,,dis()} will include instruction
source code positions in the output.

@geindex from_traceback() (dis.Bytecode class method)
@anchor{library/dis dis Bytecode from_traceback}@anchor{1136}
@deffn {Method} classmethod from_traceback (tb, *, show_caches=False)

Construct a @code{Bytecode} instance from the given traceback, setting
`current_offset' to the instruction responsible for the exception.
@end deffn

@geindex Bytecode.codeobj (in module dis)
@anchor{library/dis dis Bytecode codeobj}@anchor{5018}
@deffn {Data} codeobj

The compiled code object.
@end deffn

@geindex Bytecode.first_line (in module dis)
@anchor{library/dis dis Bytecode first_line}@anchor{5019}
@deffn {Data} first_line

The first source line of the code object (if available)
@end deffn

@geindex dis() (dis.Bytecode method)
@anchor{library/dis dis Bytecode dis}@anchor{1135}
@deffn {Method} dis ()

Return a formatted view of the bytecode operations (the same as printed by
@ref{207,,dis.dis()}, but returned as a multi-line string).
@end deffn

@geindex info() (dis.Bytecode method)
@anchor{library/dis dis Bytecode info}@anchor{501a}
@deffn {Method} info ()

Return a formatted multi-line string with detailed information about the
code object, like @ref{1445,,code_info()}.
@end deffn


Changed in version 3.7: This can now handle coroutine and asynchronous generator objects.



Changed in version 3.11: Added the `show_caches' and `adaptive' parameters.



Changed in version 3.13: Added the `show_offsets' parameter



Changed in version 3.14: Added the `show_positions' parameter.

@end deffn

Example:

@example
>>> bytecode = dis.Bytecode(myfunc)
>>> for instr in bytecode:
...     print(instr.opname)
...
RESUME
LOAD_GLOBAL
LOAD_FAST_BORROW
CALL
RETURN_VALUE
@end example

@node Analysis functions,Python Bytecode Instructions,Bytecode analysis,dis — Disassembler for Python bytecode
@anchor{library/dis analysis-functions}@anchor{501b}
@subsubsection Analysis functions


The @code{dis} module also defines the following analysis functions that convert
the input directly to the desired output. They can be useful if only a single
operation is being performed, so the intermediate analysis object isn’t useful:

@geindex code_info() (in module dis)
@anchor{library/dis dis code_info}@anchor{1445}
@deffn {Function} dis.code_info (x)

Return a formatted multi-line string with detailed code object information
for the supplied function, generator, asynchronous generator, coroutine,
method, source code string or code object.

Note that the exact contents of code info strings are highly implementation
dependent and they may change arbitrarily across Python VMs or Python
releases.


Added in version 3.2.



Changed in version 3.7: This can now handle coroutine and asynchronous generator objects.

@end deffn

@geindex show_code() (in module dis)
@anchor{library/dis dis show_code}@anchor{1134}
@deffn {Function} dis.show_code (x, *, file=None)

Print detailed code object information for the supplied function, method,
source code string or code object to `file' (or @code{sys.stdout} if `file'
is not specified).

This is a convenient shorthand for @code{print(code_info(x), file=file)},
intended for interactive exploration at the interpreter prompt.


Added in version 3.2.



Changed in version 3.4: Added `file' parameter.

@end deffn

@geindex dis() (in module dis)
@anchor{library/dis dis dis}@anchor{207}
@deffn {Function} dis.dis (x=None, *, file=None, depth=None, show_caches=False, adaptive=False, show_offsets=False, show_positions=False)

Disassemble the `x' object.  `x' can denote either a module, a class, a
method, a function, a generator, an asynchronous generator, a coroutine,
a code object, a string of source code or a byte sequence of raw bytecode.
For a module, it disassembles all functions. For a class, it disassembles
all methods (including class and static methods). For a code object or
sequence of raw bytecode, it prints one line per bytecode instruction.
It also recursively disassembles nested code objects. These can include
generator expressions, nested functions, the bodies of nested classes,
and the code objects used for @ref{4ac,,annotation scopes}.
Strings are first compiled to code objects with the @ref{4b2,,compile()}
built-in function before being disassembled.  If no object is provided, this
function disassembles the last traceback.

The disassembly is written as text to the supplied `file' argument if
provided and to @code{sys.stdout} otherwise.

The maximal depth of recursion is limited by `depth' unless it is @code{None}.
@code{depth=0} means no recursion.

If `show_caches' is @code{True}, this function will display inline cache
entries used by the interpreter to specialize the bytecode.

If `adaptive' is @code{True}, this function will display specialized bytecode
that may be different from the original bytecode.


Changed in version 3.4: Added `file' parameter.



Changed in version 3.7: Implemented recursive disassembling and added `depth' parameter.



Changed in version 3.7: This can now handle coroutine and asynchronous generator objects.



Changed in version 3.11: Added the `show_caches' and `adaptive' parameters.



Changed in version 3.13: Added the `show_offsets' parameter.



Changed in version 3.14: Added the `show_positions' parameter.

@end deffn

@geindex distb() (in module dis)
@anchor{library/dis dis distb}@anchor{208}
@deffn {Function} dis.distb (tb=None, *, file=None, show_caches=False, adaptive=False, show_offset=False, show_positions=False)

Disassemble the top-of-stack function of a traceback, using the last
traceback if none was passed.  The instruction causing the exception is
indicated.

The disassembly is written as text to the supplied `file' argument if
provided and to @code{sys.stdout} otherwise.


Changed in version 3.4: Added `file' parameter.



Changed in version 3.11: Added the `show_caches' and `adaptive' parameters.



Changed in version 3.13: Added the `show_offsets' parameter.



Changed in version 3.14: Added the `show_positions' parameter.

@end deffn

@geindex disassemble() (in module dis)
@geindex disco() (in module dis)
@anchor{library/dis dis disassemble}@anchor{209}
@deffn {Function} dis.disassemble (code, lasti=-1, *, file=None, show_caches=False, adaptive=False, show_offsets=False, show_positions=False)
@anchor{library/dis dis disco}@anchor{501c}
@deffnx {Function} dis.disco (code, lasti=-1, *, file=None, show_caches=False, adaptive=False, show_offsets=False, show_positions=False)

Disassemble a code object, indicating the last instruction if `lasti' was
provided.  The output is divided in the following columns:


@enumerate 

@item 
the source code location of the instruction. Complete location information
is shown if `show_positions' is true. Otherwise (the default) only the
line number is displayed.

@item 
the current instruction, indicated as @code{-->},

@item 
a labelled instruction, indicated with @code{>>},

@item 
the address of the instruction,

@item 
the operation code name,

@item 
operation parameters, and

@item 
interpretation of the parameters in parentheses.
@end enumerate

The parameter interpretation recognizes local and global variable names,
constant values, branch targets, and compare operators.

The disassembly is written as text to the supplied `file' argument if
provided and to @code{sys.stdout} otherwise.


Changed in version 3.4: Added `file' parameter.



Changed in version 3.11: Added the `show_caches' and `adaptive' parameters.



Changed in version 3.13: Added the `show_offsets' parameter.



Changed in version 3.14: Added the `show_positions' parameter.

@end deffn

@geindex get_instructions() (in module dis)
@anchor{library/dis dis get_instructions}@anchor{4ed}
@deffn {Function} dis.get_instructions (x, *, first_line=None, show_caches=False, adaptive=False)

Return an iterator over the instructions in the supplied function, method,
source code string or code object.

The iterator generates a series of @ref{205,,Instruction} named tuples giving
the details of each operation in the supplied code.

If `first_line' is not @code{None}, it indicates the line number that should be
reported for the first source line in the disassembled code.  Otherwise, the
source line information (if any) is taken directly from the disassembled code
object.

The `adaptive' parameter works as it does in @ref{3c,,dis()}.


Added in version 3.4.



Changed in version 3.11: Added the `show_caches' and `adaptive' parameters.



Changed in version 3.13: The `show_caches' parameter is deprecated and has no effect. The iterator
generates the @ref{205,,Instruction} instances with the `cache_info'
field populated (regardless of the value of `show_caches') and it no longer
generates separate items for the cache entries.

@end deffn

@geindex findlinestarts() (in module dis)
@anchor{library/dis dis findlinestarts}@anchor{501d}
@deffn {Function} dis.findlinestarts (code)

This generator function uses the @ref{34e,,co_lines()} method
of the @ref{4e7,,code object} `code' to find the offsets which
are starts of
lines in the source code.  They are generated as @code{(offset, lineno)} pairs.


Changed in version 3.6: Line numbers can be decreasing. Before, they were always increasing.



Changed in version 3.10: The 
@geindex Python Enhancement Proposals; PEP 626
PEP 626@footnote{https://peps.python.org/pep-0626/} @ref{34e,,co_lines()} method is used instead of the
@ref{23d7,,co_firstlineno} and @ref{32e,,co_lnotab}
attributes of the @ref{4e7,,code object}.



Changed in version 3.13: Line numbers can be @code{None} for bytecode that does not map to source lines.

@end deffn

@geindex findlabels() (in module dis)
@anchor{library/dis dis findlabels}@anchor{501e}
@deffn {Function} dis.findlabels (code)

Detect all offsets in the raw compiled bytecode string `code' which are jump targets, and
return a list of these offsets.
@end deffn

@geindex stack_effect() (in module dis)
@anchor{library/dis dis stack_effect}@anchor{1137}
@deffn {Function} dis.stack_effect (opcode, oparg=None, *, jump=None)

Compute the stack effect of `opcode' with argument `oparg'.

If the code has a jump target and `jump' is @code{True}, @code{stack_effect()}
will return the stack effect of jumping.  If `jump' is @code{False},
it will return the stack effect of not jumping. And if `jump' is
@code{None} (default), it will return the maximal stack effect of both cases.


Added in version 3.4.



Changed in version 3.8: Added `jump' parameter.



Changed in version 3.13: If @code{oparg} is omitted (or @code{None}), the stack effect is now returned
for @code{oparg=0}. Previously this was an error for opcodes that use their
arg. It is also no longer an error to pass an integer @code{oparg} when
the @code{opcode} does not use it; the @code{oparg} in this case is ignored.

@end deffn

@node Python Bytecode Instructions,Opcode collections,Analysis functions,dis — Disassembler for Python bytecode
@anchor{library/dis bytecodes}@anchor{7d0}@anchor{library/dis python-bytecode-instructions}@anchor{501f}
@subsubsection Python Bytecode Instructions


The @ref{4ed,,get_instructions()} function and @ref{206,,Bytecode} class provide
details of bytecode instructions as @ref{205,,Instruction} instances:

@geindex Instruction (class in dis)
@anchor{library/dis dis Instruction}@anchor{205}
@deffn {Class} dis.Instruction

Details for a bytecode operation

@geindex Instruction.opcode (in module dis)
@anchor{library/dis dis Instruction opcode}@anchor{5020}
@deffn {Data} opcode

numeric code for operation, corresponding to the opcode values listed
below and the bytecode values in the @ref{5021,,Opcode collections}.
@end deffn

@geindex Instruction.opname (in module dis)
@anchor{library/dis dis Instruction opname}@anchor{5022}
@deffn {Data} opname

human readable name for operation
@end deffn

@geindex Instruction.baseopcode (in module dis)
@anchor{library/dis dis Instruction baseopcode}@anchor{5023}
@deffn {Data} baseopcode

numeric code for the base operation if operation is specialized;
otherwise equal to @ref{5020,,opcode}
@end deffn

@geindex Instruction.baseopname (in module dis)
@anchor{library/dis dis Instruction baseopname}@anchor{5024}
@deffn {Data} baseopname

human readable name for the base operation if operation is specialized;
otherwise equal to @ref{5025,,opname}
@end deffn

@geindex Instruction.arg (in module dis)
@anchor{library/dis dis Instruction arg}@anchor{5026}
@deffn {Data} arg

numeric argument to operation (if any), otherwise @code{None}
@end deffn

@geindex Instruction.oparg (in module dis)
@anchor{library/dis dis Instruction oparg}@anchor{5027}
@deffn {Data} oparg

alias for @ref{5026,,arg}
@end deffn

@geindex Instruction.argval (in module dis)
@anchor{library/dis dis Instruction argval}@anchor{5028}
@deffn {Data} argval

resolved arg value (if any), otherwise @code{None}
@end deffn

@geindex Instruction.argrepr (in module dis)
@anchor{library/dis dis Instruction argrepr}@anchor{5029}
@deffn {Data} argrepr

human readable description of operation argument (if any),
otherwise an empty string.
@end deffn

@geindex Instruction.offset (in module dis)
@anchor{library/dis dis Instruction offset}@anchor{502a}
@deffn {Data} offset

start index of operation within bytecode sequence
@end deffn

@geindex Instruction.start_offset (in module dis)
@anchor{library/dis dis Instruction start_offset}@anchor{502b}
@deffn {Data} start_offset

start index of operation within bytecode sequence, including prefixed
@code{EXTENDED_ARG} operations if present; otherwise equal to @ref{502a,,offset}
@end deffn

@geindex Instruction.cache_offset (in module dis)
@anchor{library/dis dis Instruction cache_offset}@anchor{502c}
@deffn {Data} cache_offset

start index of the cache entries following the operation
@end deffn

@geindex Instruction.end_offset (in module dis)
@anchor{library/dis dis Instruction end_offset}@anchor{502d}
@deffn {Data} end_offset

end index of the cache entries following the operation
@end deffn

@geindex Instruction.starts_line (in module dis)
@anchor{library/dis dis Instruction starts_line}@anchor{502e}
@deffn {Data} starts_line

@code{True} if this opcode starts a source line, otherwise @code{False}
@end deffn

@geindex Instruction.line_number (in module dis)
@anchor{library/dis dis Instruction line_number}@anchor{502f}
@deffn {Data} line_number

source line number associated with this opcode (if any), otherwise @code{None}
@end deffn

@geindex Instruction.is_jump_target (in module dis)
@anchor{library/dis dis Instruction is_jump_target}@anchor{5030}
@deffn {Data} is_jump_target

@code{True} if other code jumps to here, otherwise @code{False}
@end deffn

@geindex Instruction.jump_target (in module dis)
@anchor{library/dis dis Instruction jump_target}@anchor{5031}
@deffn {Data} jump_target

bytecode index of the jump target if this is a jump operation,
otherwise @code{None}
@end deffn

@geindex Instruction.positions (in module dis)
@anchor{library/dis dis Instruction positions}@anchor{5032}
@deffn {Data} positions

@ref{1984,,dis.Positions} object holding the
start and end locations that are covered by this instruction.
@end deffn

@geindex Instruction.cache_info (in module dis)
@anchor{library/dis dis Instruction cache_info}@anchor{5033}
@deffn {Data} cache_info

Information about the cache entries of this instruction, as
triplets of the form @code{(name, size, data)}, where the @code{name}
and @code{size} describe the cache format and data is the contents
of the cache. @code{cache_info} is @code{None} if the instruction does not have
caches.
@end deffn


Added in version 3.4.



Changed in version 3.11: Field @code{positions} is added.



Changed in version 3.13: Changed field @code{starts_line}.

Added fields @code{start_offset}, @code{cache_offset}, @code{end_offset},
@code{baseopname}, @code{baseopcode}, @code{jump_target}, @code{oparg},
@code{line_number} and @code{cache_info}.

@end deffn

@geindex Positions (class in dis)
@anchor{library/dis dis Positions}@anchor{1984}
@deffn {Class} dis.Positions

In case the information is not available, some fields might be @code{None}.

@geindex Positions.lineno (in module dis)
@anchor{library/dis dis Positions lineno}@anchor{5034}
@deffn {Data} lineno
@end deffn

@geindex Positions.end_lineno (in module dis)
@anchor{library/dis dis Positions end_lineno}@anchor{5035}
@deffn {Data} end_lineno
@end deffn

@geindex Positions.col_offset (in module dis)
@anchor{library/dis dis Positions col_offset}@anchor{5036}
@deffn {Data} col_offset
@end deffn

@geindex Positions.end_col_offset (in module dis)
@anchor{library/dis dis Positions end_col_offset}@anchor{5037}
@deffn {Data} end_col_offset
@end deffn


Added in version 3.11.

@end deffn

The Python compiler currently generates the following bytecode instructions.

`General instructions'

In the following, We will refer to the interpreter stack as @code{STACK} and describe
operations on it as if it was a Python list. The top of the stack corresponds to
@code{STACK[-1]} in this language.

@geindex NOP (opcode)
@anchor{library/dis opcode-NOP}@anchor{5038}
@deffn {Opcode} NOP

Do nothing code.  Used as a placeholder by the bytecode optimizer, and to
generate line tracing events.
@end deffn

@geindex NOT_TAKEN (opcode)
@anchor{library/dis opcode-NOT_TAKEN}@anchor{374}
@deffn {Opcode} NOT_TAKEN

Do nothing code.
Used by the interpreter to record @ref{297,,BRANCH_LEFT}
and @ref{298,,BRANCH_RIGHT} events for @ref{e0,,sys.monitoring}.


Added in version 3.14.

@end deffn

@geindex POP_ITER (opcode)
@anchor{library/dis opcode-POP_ITER}@anchor{36e}
@deffn {Opcode} POP_ITER

Removes the iterator from the top of the stack.


Added in version 3.14.

@end deffn

@geindex POP_TOP (opcode)
@anchor{library/dis opcode-POP_TOP}@anchor{5039}
@deffn {Opcode} POP_TOP

Removes the top-of-stack item:

@example
STACK.pop()
@end example
@end deffn

@geindex END_FOR (opcode)
@anchor{library/dis opcode-END_FOR}@anchor{503a}
@deffn {Opcode} END_FOR

Removes the top-of-stack item.
Equivalent to @code{POP_TOP}.
Used to clean up at the end of loops, hence the name.


Added in version 3.12.

@end deffn

@geindex END_SEND (opcode)
@anchor{library/dis opcode-END_SEND}@anchor{503b}
@deffn {Opcode} END_SEND

Implements @code{del STACK[-2]}.
Used to clean up when a generator exits.


Added in version 3.12.

@end deffn

@geindex COPY (opcode)
@anchor{library/dis opcode-COPY}@anchor{919}
@deffn {Opcode} COPY (i)

Push the i-th item to the top of the stack without removing it from its original
location:

@example
assert i > 0
STACK.append(STACK[-i])
@end example


Added in version 3.11.

@end deffn

@geindex SWAP (opcode)
@anchor{library/dis opcode-SWAP}@anchor{91a}
@deffn {Opcode} SWAP (i)

Swap the top of the stack with the i-th element:

@example
STACK[-i], STACK[-1] = STACK[-1], STACK[-i]
@end example


Added in version 3.11.

@end deffn

@geindex CACHE (opcode)
@anchor{library/dis opcode-CACHE}@anchor{90a}
@deffn {Opcode} CACHE

Rather than being an actual instruction, this opcode is used to mark extra
space for the interpreter to cache useful data directly in the bytecode
itself. It is automatically hidden by all @code{dis} utilities, but can be
viewed with @code{show_caches=True}.

Logically, this space is part of the preceding instruction. Many opcodes
expect to be followed by an exact number of caches, and will 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 modifying raw, adaptive bytecode containing
quickened data.


Added in version 3.11.

@end deffn

`Unary operations'

Unary operations take the top of the stack, apply the operation, and push the
result back on the stack.

@geindex UNARY_NEGATIVE (opcode)
@anchor{library/dis opcode-UNARY_NEGATIVE}@anchor{503c}
@deffn {Opcode} UNARY_NEGATIVE

Implements @code{STACK[-1] = -STACK[-1]}.
@end deffn

@geindex UNARY_NOT (opcode)
@anchor{library/dis opcode-UNARY_NOT}@anchor{1aa7}
@deffn {Opcode} UNARY_NOT

Implements @code{STACK[-1] = not STACK[-1]}.


Changed in version 3.13: This instruction now requires an exact @ref{3c1,,bool} operand.

@end deffn

@geindex UNARY_INVERT (opcode)
@anchor{library/dis opcode-UNARY_INVERT}@anchor{503d}
@deffn {Opcode} UNARY_INVERT

Implements @code{STACK[-1] = ~STACK[-1]}.
@end deffn

@geindex GET_ITER (opcode)
@anchor{library/dis opcode-GET_ITER}@anchor{503e}
@deffn {Opcode} GET_ITER

Implements @code{STACK[-1] = iter(STACK[-1])}.
@end deffn

@geindex GET_YIELD_FROM_ITER (opcode)
@anchor{library/dis opcode-GET_YIELD_FROM_ITER}@anchor{503f}
@deffn {Opcode} GET_YIELD_FROM_ITER

If @code{STACK[-1]} is a @ref{ddf,,generator iterator} or @ref{6ba,,coroutine} object
it is left as is.  Otherwise, implements @code{STACK[-1] = iter(STACK[-1])}.


Added in version 3.5.

@end deffn

@geindex TO_BOOL (opcode)
@anchor{library/dis opcode-TO_BOOL}@anchor{1aa4}
@deffn {Opcode} TO_BOOL

Implements @code{STACK[-1] = bool(STACK[-1])}.


Added in version 3.13.

@end deffn

`Binary and in-place operations'

Binary operations remove the top two items from the stack (@code{STACK[-1]} and
@code{STACK[-2]}). They perform the operation, then put the result back on the stack.

In-place operations are like binary operations, but the operation is done in-place
when @code{STACK[-2]} supports it, and the resulting @code{STACK[-1]} may be (but does
not have to be) the original @code{STACK[-2]}.

@geindex BINARY_OP (opcode)
@anchor{library/dis opcode-BINARY_OP}@anchor{364}
@deffn {Opcode} BINARY_OP (op)

Implements the binary and in-place operators (depending on the value of
`op'):

@example
rhs = STACK.pop()
lhs = STACK.pop()
STACK.append(lhs op rhs)
@end example


Added in version 3.11.



Changed in version 3.14: With oparg :@code{NB_SUBSCR}, implements binary subscript (replaces opcode @code{BINARY_SUBSCR})

@end deffn

@geindex STORE_SUBSCR (opcode)
@anchor{library/dis opcode-STORE_SUBSCR}@anchor{1bee}
@deffn {Opcode} STORE_SUBSCR

Implements:

@example
key = STACK.pop()
container = STACK.pop()
value = STACK.pop()
container[key] = value
@end example
@end deffn

@geindex DELETE_SUBSCR (opcode)
@anchor{library/dis opcode-DELETE_SUBSCR}@anchor{5040}
@deffn {Opcode} DELETE_SUBSCR

Implements:

@example
key = STACK.pop()
container = STACK.pop()
del container[key]
@end example
@end deffn

@geindex BINARY_SLICE (opcode)
@anchor{library/dis opcode-BINARY_SLICE}@anchor{706}
@deffn {Opcode} BINARY_SLICE

Implements:

@example
end = STACK.pop()
start = STACK.pop()
container = STACK.pop()
STACK.append(container[start:end])
@end example


Added in version 3.12.

@end deffn

@geindex STORE_SLICE (opcode)
@anchor{library/dis opcode-STORE_SLICE}@anchor{707}
@deffn {Opcode} STORE_SLICE

Implements:

@example
end = STACK.pop()
start = STACK.pop()
container = STACK.pop()
value = STACK.pop()
container[start:end] = value
@end example


Added in version 3.12.

@end deffn

`Coroutine opcodes'

@geindex GET_AWAITABLE (opcode)
@anchor{library/dis opcode-GET_AWAITABLE}@anchor{1c0a}
@deffn {Opcode} GET_AWAITABLE (where)

Implements @code{STACK[-1] = get_awaitable(STACK[-1])}, where @code{get_awaitable(o)}
returns @code{o} if @code{o} is a coroutine object or a generator object with
the @ref{4db8,,CO_ITERABLE_COROUTINE} flag, or resolves
@code{o.__await__}.

@quotation

If the @code{where} operand is nonzero, it indicates where the instruction
occurs:


@itemize *

@item 
@code{1}: After a call to @code{__aenter__}

@item 
@code{2}: After a call to @code{__aexit__}
@end itemize
@end quotation


Added in version 3.5.



Changed in version 3.11: Previously, this instruction did not have an oparg.

@end deffn

@geindex GET_AITER (opcode)
@anchor{library/dis opcode-GET_AITER}@anchor{5041}
@deffn {Opcode} GET_AITER

Implements @code{STACK[-1] = STACK[-1].__aiter__()}.


Added in version 3.5.



Changed in version 3.7: Returning awaitable objects from @code{__aiter__} is no longer
supported.

@end deffn

@geindex GET_ANEXT (opcode)
@anchor{library/dis opcode-GET_ANEXT}@anchor{5042}
@deffn {Opcode} GET_ANEXT

Implement @code{STACK.append(get_awaitable(STACK[-1].__anext__()))} to the stack.
See @code{GET_AWAITABLE} for details about @code{get_awaitable}.


Added in version 3.5.

@end deffn

@geindex END_ASYNC_FOR (opcode)
@anchor{library/dis opcode-END_ASYNC_FOR}@anchor{ca6}
@deffn {Opcode} END_ASYNC_FOR

Terminates an @ref{ca7,,async for} loop.  Handles an exception raised
when awaiting a next item. The stack contains the async iterable in
@code{STACK[-2]} and the raised exception in @code{STACK[-1]}. Both are popped.
If the exception is not @ref{1e52,,StopAsyncIteration}, it is re-raised.


Added in version 3.8.



Changed in version 3.11: Exception representation on the stack now consist of one, not three, items.

@end deffn

@geindex CLEANUP_THROW (opcode)
@anchor{library/dis opcode-CLEANUP_THROW}@anchor{70a}
@deffn {Opcode} CLEANUP_THROW

Handles an exception raised during a @ref{71d,,throw()} or
@ref{17e5,,close()} call through the current frame.  If @code{STACK[-1]} is an
instance of @ref{dfb,,StopIteration}, pop three values from the stack and push
its @code{value} member.  Otherwise, re-raise @code{STACK[-1]}.


Added in version 3.12.

@end deffn

`Miscellaneous opcodes'

@geindex SET_ADD (opcode)
@anchor{library/dis opcode-SET_ADD}@anchor{5043}
@deffn {Opcode} SET_ADD (i)

Implements:

@example
item = STACK.pop()
set.add(STACK[-i], item)
@end example

Used to implement set comprehensions.
@end deffn

@geindex LIST_APPEND (opcode)
@anchor{library/dis opcode-LIST_APPEND}@anchor{5044}
@deffn {Opcode} LIST_APPEND (i)

Implements:

@example
item = STACK.pop()
list.append(STACK[-i], item)
@end example

Used to implement list comprehensions.
@end deffn

@geindex MAP_ADD (opcode)
@anchor{library/dis opcode-MAP_ADD}@anchor{ca8}
@deffn {Opcode} MAP_ADD (i)

Implements:

@example
value = STACK.pop()
key = STACK.pop()
dict.__setitem__(STACK[-i], key, value)
@end example

Used to implement dict comprehensions.


Added in version 3.1.



Changed in version 3.8: Map value is @code{STACK[-1]} and map key is @code{STACK[-2]}. Before, those
were reversed.

@end deffn

For all of the @ref{5043,,SET_ADD}, @ref{5044,,LIST_APPEND} and @ref{ca8,,MAP_ADD}
instructions, while the added value or key/value pair is popped off, the
container object remains on the stack so that it is available for further
iterations of the loop.

@geindex RETURN_VALUE (opcode)
@anchor{library/dis opcode-RETURN_VALUE}@anchor{1b64}
@deffn {Opcode} RETURN_VALUE

Returns with @code{STACK[-1]} to the caller of the function.
@end deffn

@geindex YIELD_VALUE (opcode)
@anchor{library/dis opcode-YIELD_VALUE}@anchor{5ba}
@deffn {Opcode} YIELD_VALUE

Yields @code{STACK.pop()} from a @ref{1267,,generator}.


Changed in version 3.11: oparg set to be the stack depth.



Changed in version 3.12: oparg set to be the exception block depth, for efficient closing of generators.



Changed in version 3.13: oparg is @code{1} if this instruction is part of a yield-from or await, and @code{0}
otherwise.

@end deffn

@geindex SETUP_ANNOTATIONS (opcode)
@anchor{library/dis opcode-SETUP_ANNOTATIONS}@anchor{f56}
@deffn {Opcode} SETUP_ANNOTATIONS

Checks whether @code{__annotations__} is defined in @code{locals()}, if not it is
set up to an empty @code{dict}. This opcode is only emitted if a class
or module body contains @ref{f57,,variable annotations}
statically.


Added in version 3.6.

@end deffn

@geindex POP_EXCEPT (opcode)
@anchor{library/dis opcode-POP_EXCEPT}@anchor{5045}
@deffn {Opcode} POP_EXCEPT

Pops a value from the stack, which is used to restore the exception state.


Changed in version 3.11: Exception representation on the stack now consist of one, not three, items.

@end deffn

@geindex RERAISE (opcode)
@anchor{library/dis opcode-RERAISE}@anchor{5046}
@deffn {Opcode} RERAISE

Re-raises the exception currently on top of the stack. If oparg is non-zero,
pops an additional value from the stack which is used to set
@ref{a8e,,f_lasti} of the current frame.


Added in version 3.9.



Changed in version 3.11: Exception representation on the stack now consist of one, not three, items.

@end deffn

@geindex PUSH_EXC_INFO (opcode)
@anchor{library/dis opcode-PUSH_EXC_INFO}@anchor{914}
@deffn {Opcode} PUSH_EXC_INFO

Pops a value from the stack. Pushes the current exception to the top of the stack.
Pushes the value originally popped back to the stack.
Used in exception handlers.


Added in version 3.11.

@end deffn

@geindex CHECK_EXC_MATCH (opcode)
@anchor{library/dis opcode-CHECK_EXC_MATCH}@anchor{91b}
@deffn {Opcode} CHECK_EXC_MATCH

Performs exception matching for @code{except}. Tests whether the @code{STACK[-2]}
is an exception matching @code{STACK[-1]}. Pops @code{STACK[-1]} and pushes the boolean
result of the test.


Added in version 3.11.

@end deffn

@geindex CHECK_EG_MATCH (opcode)
@anchor{library/dis opcode-CHECK_EG_MATCH}@anchor{913}
@deffn {Opcode} CHECK_EG_MATCH

Performs exception matching for @code{except*}. Applies @code{split(STACK[-1])} on
the exception group representing @code{STACK[-2]}.

In case of a match, pops two items from the stack and pushes the
non-matching subgroup (@code{None} in case of full match) followed by the
matching subgroup. When there is no match, pops one item (the match
type) and pushes @code{None}.


Added in version 3.11.

@end deffn

@geindex WITH_EXCEPT_START (opcode)
@anchor{library/dis opcode-WITH_EXCEPT_START}@anchor{5047}
@deffn {Opcode} WITH_EXCEPT_START

Calls the function in position 4 on the stack with arguments (type, val, tb)
representing the exception at the top of the stack.
Used to implement the call @code{context_manager.__exit__(*exc_info())} when an exception
has occurred in a @ref{187,,with} statement.


Added in version 3.9.



Changed in version 3.11: The @code{__exit__} function is in position 4 of the stack rather than 7.
Exception representation on the stack now consist of one, not three, items.

@end deffn

@geindex LOAD_COMMON_CONSTANT (opcode)
@anchor{library/dis opcode-LOAD_COMMON_CONSTANT}@anchor{368}
@deffn {Opcode} LOAD_COMMON_CONSTANT

Pushes a common constant onto the stack. The interpreter contains a hardcoded
list of constants supported by this instruction.  Used by the @ref{b66,,assert}
statement to load @ref{8ba,,AssertionError}.


Added in version 3.14.

@end deffn

@geindex LOAD_BUILD_CLASS (opcode)
@anchor{library/dis opcode-LOAD_BUILD_CLASS}@anchor{5048}
@deffn {Opcode} LOAD_BUILD_CLASS

Pushes @code{builtins.__build_class__()} onto the stack.  It is later called
to construct a class.
@end deffn

@geindex GET_LEN (opcode)
@anchor{library/dis opcode-GET_LEN}@anchor{5049}
@deffn {Opcode} GET_LEN

Perform @code{STACK.append(len(STACK[-1]))}. Used in @ref{a14,,match} statements where
comparison with structure of pattern is needed.


Added in version 3.10.

@end deffn

@geindex MATCH_MAPPING (opcode)
@anchor{library/dis opcode-MATCH_MAPPING}@anchor{504a}
@deffn {Opcode} MATCH_MAPPING

If @code{STACK[-1]} is an instance of @ref{acd,,collections.abc.Mapping} (or, more
technically: if it has the @ref{1c9b,,Py_TPFLAGS_MAPPING} flag set in its
@ref{1cb4,,tp_flags}), push @code{True} onto the stack.  Otherwise,
push @code{False}.


Added in version 3.10.

@end deffn

@geindex MATCH_SEQUENCE (opcode)
@anchor{library/dis opcode-MATCH_SEQUENCE}@anchor{504b}
@deffn {Opcode} MATCH_SEQUENCE

If @code{STACK[-1]} is an instance of @ref{13d0,,collections.abc.Sequence} and is `not' an instance
of @ref{16a,,str}/@ref{193,,bytes}/@ref{342,,bytearray} (or, more technically: if it has
the @ref{1c9c,,Py_TPFLAGS_SEQUENCE} flag set in its @ref{1cb4,,tp_flags}),
push @code{True} onto the stack.  Otherwise, push @code{False}.


Added in version 3.10.

@end deffn

@geindex MATCH_KEYS (opcode)
@anchor{library/dis opcode-MATCH_KEYS}@anchor{922}
@deffn {Opcode} MATCH_KEYS

@code{STACK[-1]} is a tuple of mapping keys, and @code{STACK[-2]} is the match subject.
If @code{STACK[-2]} contains all of the keys in @code{STACK[-1]}, push a @ref{614,,tuple}
containing the corresponding values. Otherwise, push @code{None}.


Added in version 3.10.



Changed in version 3.11: Previously, this instruction also pushed a boolean value indicating
success (@code{True}) or failure (@code{False}).

@end deffn

@geindex STORE_NAME (opcode)
@anchor{library/dis opcode-STORE_NAME}@anchor{504c}
@deffn {Opcode} STORE_NAME (namei)

Implements @code{name = STACK.pop()}. `namei' is the index of `name' in the attribute
@ref{23d6,,co_names} of the @ref{4e7,,code object}.
The compiler tries to use @ref{1aa9,,STORE_FAST} or @ref{504d,,STORE_GLOBAL} if possible.
@end deffn

@geindex DELETE_NAME (opcode)
@anchor{library/dis opcode-DELETE_NAME}@anchor{504e}
@deffn {Opcode} DELETE_NAME (namei)

Implements @code{del name}, where `namei' is the index into @ref{23d6,,co_names}
attribute of the @ref{4e7,,code object}.
@end deffn

@geindex UNPACK_SEQUENCE (opcode)
@anchor{library/dis opcode-UNPACK_SEQUENCE}@anchor{1c0c}
@deffn {Opcode} UNPACK_SEQUENCE (count)

Unpacks @code{STACK[-1]} into `count' individual values, which are put onto the stack
right-to-left. Require there to be exactly `count' values.:

@example
assert(len(STACK[-1]) == count)
STACK.extend(STACK.pop()[:-count-1:-1])
@end example
@end deffn

@geindex UNPACK_EX (opcode)
@anchor{library/dis opcode-UNPACK_EX}@anchor{504f}
@deffn {Opcode} UNPACK_EX (counts)

Implements assignment with a starred target: Unpacks an iterable in @code{STACK[-1]}
into individual values, where the total number of values can be smaller than the
number of items in the iterable: one of the new values will be a list of all
leftover items.

The number of values before and after the list value is limited to 255.

The number of values before the list value is encoded in the argument of the
opcode. The number of values after the list if any is encoded using an
@code{EXTENDED_ARG}. As a consequence, the argument can be seen as a two bytes values
where the low byte of `counts' is the number of values before the list value, the
high byte of `counts' the number of values after it.

The extracted values are put onto the stack right-to-left, i.e. @code{a, *b, c = d}
will be stored after execution as @code{STACK.extend((a, b, c))}.
@end deffn

@geindex STORE_ATTR (opcode)
@anchor{library/dis opcode-STORE_ATTR}@anchor{1c0b}
@deffn {Opcode} STORE_ATTR (namei)

Implements:

@example
obj = STACK.pop()
value = STACK.pop()
obj.name = value
@end example

where `namei' is the index of name in @ref{23d6,,co_names} of the
@ref{4e7,,code object}.
@end deffn

@geindex DELETE_ATTR (opcode)
@anchor{library/dis opcode-DELETE_ATTR}@anchor{5050}
@deffn {Opcode} DELETE_ATTR (namei)

Implements:

@example
obj = STACK.pop()
del obj.name
@end example

where `namei' is the index of name into @ref{23d6,,co_names} of the
@ref{4e7,,code object}.
@end deffn

@geindex STORE_GLOBAL (opcode)
@anchor{library/dis opcode-STORE_GLOBAL}@anchor{504d}
@deffn {Opcode} STORE_GLOBAL (namei)

Works as @ref{504c,,STORE_NAME}, but stores the name as a global.
@end deffn

@geindex DELETE_GLOBAL (opcode)
@anchor{library/dis opcode-DELETE_GLOBAL}@anchor{5051}
@deffn {Opcode} DELETE_GLOBAL (namei)

Works as @ref{504e,,DELETE_NAME}, but deletes a global name.
@end deffn

@geindex LOAD_CONST (opcode)
@anchor{library/dis opcode-LOAD_CONST}@anchor{5052}
@deffn {Opcode} LOAD_CONST (consti)

Pushes @code{co_consts[consti]} onto the stack.
@end deffn

@geindex LOAD_SMALL_INT (opcode)
@anchor{library/dis opcode-LOAD_SMALL_INT}@anchor{36c}
@deffn {Opcode} LOAD_SMALL_INT (i)

Pushes the integer @code{i} onto the stack.
@code{i} must be in @code{range(256)}


Added in version 3.14.

@end deffn

@geindex LOAD_NAME (opcode)
@anchor{library/dis opcode-LOAD_NAME}@anchor{5053}
@deffn {Opcode} LOAD_NAME (namei)

Pushes the value associated with @code{co_names[namei]} onto the stack.
The name is looked up within the locals, then the globals, then the builtins.
@end deffn

@geindex LOAD_LOCALS (opcode)
@anchor{library/dis opcode-LOAD_LOCALS}@anchor{70f}
@deffn {Opcode} LOAD_LOCALS

Pushes a reference to the locals dictionary onto the stack.  This is used
to prepare namespace dictionaries for @ref{70d,,LOAD_FROM_DICT_OR_DEREF}
and @ref{70e,,LOAD_FROM_DICT_OR_GLOBALS}.


Added in version 3.12.

@end deffn

@geindex LOAD_FROM_DICT_OR_GLOBALS (opcode)
@anchor{library/dis opcode-LOAD_FROM_DICT_OR_GLOBALS}@anchor{70e}
@deffn {Opcode} LOAD_FROM_DICT_OR_GLOBALS (i)

Pops a mapping off the stack and looks up the value for @code{co_names[namei]}.
If the name is not found there, looks it up in the globals and then the builtins,
similar to @ref{1aa0,,LOAD_GLOBAL}.
This is used for loading global variables in
@ref{4ac,,annotation scopes} within class bodies.


Added in version 3.12.

@end deffn

@geindex BUILD_TEMPLATE (opcode)
@anchor{library/dis opcode-BUILD_TEMPLATE}@anchor{366}
@deffn {Opcode} BUILD_TEMPLATE

Constructs a new @ref{16b,,Template} instance from a tuple
of strings and a tuple of interpolations and pushes the resulting object
onto the stack:

@example
interpolations = STACK.pop()
strings = STACK.pop()
STACK.append(_build_template(strings, interpolations))
@end example


Added in version 3.14.

@end deffn

@geindex BUILD_INTERPOLATION (opcode)
@anchor{library/dis opcode-BUILD_INTERPOLATION}@anchor{365}
@deffn {Opcode} BUILD_INTERPOLATION (format)

Constructs a new @ref{16c,,Interpolation} instance from a
value and its source expression and pushes the resulting object onto the
stack.

If no conversion or format specification is present, @code{format} is set to
@code{2}.

If the low bit of @code{format} is set, it indicates that the interpolation
contains a format specification.

If @code{format >> 2} is non-zero, it indicates that the interpolation
contains a conversion. The value of @code{format >> 2} is the conversion type
(@code{0} for no conversion, @code{1} for @code{!s}, @code{2} for @code{!r}, and
@code{3} for @code{!a}):

@example
conversion = format >> 2
if format & 1:
    format_spec = STACK.pop()
else:
    format_spec = None
expression = STACK.pop()
value = STACK.pop()
STACK.append(_build_interpolation(value, expression, conversion, format_spec))
@end example


Added in version 3.14.

@end deffn

@geindex BUILD_TUPLE (opcode)
@anchor{library/dis opcode-BUILD_TUPLE}@anchor{5054}
@deffn {Opcode} BUILD_TUPLE (count)

Creates a tuple consuming `count' items from the stack, and pushes the
resulting tuple onto the stack:

@example
if count == 0:
    value = ()
else:
    value = tuple(STACK[-count:])
    STACK = STACK[:-count]

STACK.append(value)
@end example
@end deffn

@geindex BUILD_LIST (opcode)
@anchor{library/dis opcode-BUILD_LIST}@anchor{5055}
@deffn {Opcode} BUILD_LIST (count)

Works as @ref{5054,,BUILD_TUPLE}, but creates a list.
@end deffn

@geindex BUILD_SET (opcode)
@anchor{library/dis opcode-BUILD_SET}@anchor{5056}
@deffn {Opcode} BUILD_SET (count)

Works as @ref{5054,,BUILD_TUPLE}, but creates a set.
@end deffn

@geindex BUILD_MAP (opcode)
@anchor{library/dis opcode-BUILD_MAP}@anchor{367}
@deffn {Opcode} BUILD_MAP (count)

Pushes a new dictionary object onto the stack.  Pops @code{2 * count} items
so that the dictionary holds `count' entries:
@code{@{..., STACK[-4]: STACK[-3], STACK[-2]: STACK[-1]@}}.


Changed in version 3.5: The dictionary is created from stack items instead of creating an
empty dictionary pre-sized to hold `count' items.

@end deffn

@geindex BUILD_STRING (opcode)
@anchor{library/dis opcode-BUILD_STRING}@anchor{f53}
@deffn {Opcode} BUILD_STRING (count)

Concatenates `count' strings from the stack and pushes the resulting string
onto the stack.


Added in version 3.6.

@end deffn

@geindex LIST_EXTEND (opcode)
@anchor{library/dis opcode-LIST_EXTEND}@anchor{5057}
@deffn {Opcode} LIST_EXTEND (i)

Implements:

@example
seq = STACK.pop()
list.extend(STACK[-i], seq)
@end example

Used to build lists.


Added in version 3.9.

@end deffn

@geindex SET_UPDATE (opcode)
@anchor{library/dis opcode-SET_UPDATE}@anchor{5058}
@deffn {Opcode} SET_UPDATE (i)

Implements:

@example
seq = STACK.pop()
set.update(STACK[-i], seq)
@end example

Used to build sets.


Added in version 3.9.

@end deffn

@geindex DICT_UPDATE (opcode)
@anchor{library/dis opcode-DICT_UPDATE}@anchor{5059}
@deffn {Opcode} DICT_UPDATE (i)

Implements:

@example
map = STACK.pop()
dict.update(STACK[-i], map)
@end example

Used to build dicts.


Added in version 3.9.

@end deffn

@geindex DICT_MERGE (opcode)
@anchor{library/dis opcode-DICT_MERGE}@anchor{505a}
@deffn {Opcode} DICT_MERGE (i)

Like @ref{5059,,DICT_UPDATE} but raises an exception for duplicate keys.


Added in version 3.9.

@end deffn

@geindex LOAD_ATTR (opcode)
@anchor{library/dis opcode-LOAD_ATTR}@anchor{705}
@deffn {Opcode} LOAD_ATTR (namei)

If the low bit of @code{namei} is not set, this replaces @code{STACK[-1]} with
@code{getattr(STACK[-1], co_names[namei>>1])}.

If the low bit of @code{namei} is set, this will attempt to load a method named
@code{co_names[namei>>1]} from the @code{STACK[-1]} object. @code{STACK[-1]} is popped.
This bytecode distinguishes two cases: if @code{STACK[-1]} has a method with the
correct name, the bytecode pushes the unbound method and @code{STACK[-1]}.
@code{STACK[-1]} will be used as the first argument (@code{self}) by @ref{917,,CALL}
or @ref{370,,CALL_KW} when calling the unbound method.
Otherwise, @code{NULL} and the object returned by
the attribute lookup are pushed.


Changed in version 3.12: If the low bit of @code{namei} is set, then a @code{NULL} or @code{self} is
pushed to the stack before the attribute or unbound method respectively.

@end deffn

@geindex LOAD_SUPER_ATTR (opcode)
@anchor{library/dis opcode-LOAD_SUPER_ATTR}@anchor{703}
@deffn {Opcode} LOAD_SUPER_ATTR (namei)

This opcode implements @ref{1a7,,super()}, both in its zero-argument and
two-argument forms (e.g. @code{super().method()}, @code{super().attr} and
@code{super(cls, self).method()}, @code{super(cls, self).attr}).

It pops three values from the stack (from top of stack down):


@itemize *

@item 
@code{self}: the first argument to the current method

@item 
@code{cls}: the class within which the current method was defined

@item 
the global @code{super}
@end itemize

With respect to its argument, it works similarly to @ref{705,,LOAD_ATTR},
except that @code{namei} is shifted left by 2 bits instead of 1.

The low bit of @code{namei} signals to attempt a method load, as with
@ref{705,,LOAD_ATTR}, which results in pushing @code{NULL} and the loaded method.
When it is unset a single value is pushed to the stack.

The second-low bit of @code{namei}, if set, means that this was a two-argument
call to @ref{1a7,,super()} (unset means zero-argument).


Added in version 3.12.

@end deffn

@geindex COMPARE_OP (opcode)
@anchor{library/dis opcode-COMPARE_OP}@anchor{b67}
@deffn {Opcode} COMPARE_OP (opname)

Performs a Boolean operation.  The operation name can be found in
@code{cmp_op[opname >> 5]}. If the fifth-lowest bit of @code{opname} is set
(@code{opname & 16}), the result should be coerced to @code{bool}.


Changed in version 3.13: The fifth-lowest bit of the oparg now indicates a forced conversion to
@ref{3c1,,bool}.

@end deffn

@geindex IS_OP (opcode)
@anchor{library/dis opcode-IS_OP}@anchor{1980}
@deffn {Opcode} IS_OP (invert)

Performs @code{is} comparison, or @code{is not} if @code{invert} is 1.


Added in version 3.9.

@end deffn

@geindex CONTAINS_OP (opcode)
@anchor{library/dis opcode-CONTAINS_OP}@anchor{197f}
@deffn {Opcode} CONTAINS_OP (invert)

Performs @code{in} comparison, or @code{not in} if @code{invert} is 1.


Added in version 3.9.

@end deffn

@geindex IMPORT_NAME (opcode)
@anchor{library/dis opcode-IMPORT_NAME}@anchor{505b}
@deffn {Opcode} IMPORT_NAME (namei)

Imports the module @code{co_names[namei]}.  @code{STACK[-1]} and @code{STACK[-2]} are
popped and provide the `fromlist' and `level' arguments of @ref{ad7,,__import__()}.
The module object is pushed onto the stack.  The current namespace is not affected: for a proper import statement, a subsequent @ref{1aa9,,STORE_FAST} instruction
modifies the namespace.
@end deffn

@geindex IMPORT_FROM (opcode)
@anchor{library/dis opcode-IMPORT_FROM}@anchor{505c}
@deffn {Opcode} IMPORT_FROM (namei)

Loads the attribute @code{co_names[namei]} from the module found in @code{STACK[-1]}.
The resulting object is pushed onto the stack, to be subsequently stored by a
@ref{1aa9,,STORE_FAST} instruction.
@end deffn

@geindex JUMP_FORWARD (opcode)
@anchor{library/dis opcode-JUMP_FORWARD}@anchor{19b6}
@deffn {Opcode} JUMP_FORWARD (delta)

Increments bytecode counter by `delta'.
@end deffn

@geindex JUMP_BACKWARD (opcode)
@anchor{library/dis opcode-JUMP_BACKWARD}@anchor{91c}
@deffn {Opcode} JUMP_BACKWARD (delta)

Decrements bytecode counter by `delta'. Checks for interrupts.


Added in version 3.11.

@end deffn

@geindex JUMP_BACKWARD_NO_INTERRUPT (opcode)
@anchor{library/dis opcode-JUMP_BACKWARD_NO_INTERRUPT}@anchor{910}
@deffn {Opcode} JUMP_BACKWARD_NO_INTERRUPT (delta)

Decrements bytecode counter by `delta'. Does not check for interrupts.


Added in version 3.11.

@end deffn

@geindex POP_JUMP_IF_TRUE (opcode)
@anchor{library/dis opcode-POP_JUMP_IF_TRUE}@anchor{1aa5}
@deffn {Opcode} POP_JUMP_IF_TRUE (delta)

If @code{STACK[-1]} is true, increments the bytecode counter by `delta'.
@code{STACK[-1]} is popped.


Changed in version 3.11: The oparg is now a relative delta rather than an absolute target.
This opcode is a pseudo-instruction, replaced in final bytecode by
the directed versions (forward/backward).



Changed in version 3.12: This is no longer a pseudo-instruction.



Changed in version 3.13: This instruction now requires an exact @ref{3c1,,bool} operand.

@end deffn

@geindex POP_JUMP_IF_FALSE (opcode)
@anchor{library/dis opcode-POP_JUMP_IF_FALSE}@anchor{1aa6}
@deffn {Opcode} POP_JUMP_IF_FALSE (delta)

If @code{STACK[-1]} is false, increments the bytecode counter by `delta'.
@code{STACK[-1]} is popped.


Changed in version 3.11: The oparg is now a relative delta rather than an absolute target.
This opcode is a pseudo-instruction, replaced in final bytecode by
the directed versions (forward/backward).



Changed in version 3.12: This is no longer a pseudo-instruction.



Changed in version 3.13: This instruction now requires an exact @ref{3c1,,bool} operand.

@end deffn

@geindex POP_JUMP_IF_NOT_NONE (opcode)
@anchor{library/dis opcode-POP_JUMP_IF_NOT_NONE}@anchor{1bc4}
@deffn {Opcode} POP_JUMP_IF_NOT_NONE (delta)

If @code{STACK[-1]} is not @code{None}, increments the bytecode counter by `delta'.
@code{STACK[-1]} is popped.


Added in version 3.11.



Changed in version 3.12: This is no longer a pseudo-instruction.

@end deffn

@geindex POP_JUMP_IF_NONE (opcode)
@anchor{library/dis opcode-POP_JUMP_IF_NONE}@anchor{1bc3}
@deffn {Opcode} POP_JUMP_IF_NONE (delta)

If @code{STACK[-1]} is @code{None}, increments the bytecode counter by `delta'.
@code{STACK[-1]} is popped.


Added in version 3.11.



Changed in version 3.12: This is no longer a pseudo-instruction.

@end deffn

@geindex FOR_ITER (opcode)
@anchor{library/dis opcode-FOR_ITER}@anchor{1b09}
@deffn {Opcode} FOR_ITER (delta)

@code{STACK[-1]} is an @ref{4c9,,iterator}.  Call its @ref{14d9,,__next__()} method.
If this yields a new value, push it on the stack (leaving the iterator below
it).  If the iterator indicates it is exhausted then the byte code counter is
incremented by `delta'.


Changed in version 3.12: Up until 3.11 the iterator was popped when it was exhausted.

@end deffn

@geindex LOAD_GLOBAL (opcode)
@anchor{library/dis opcode-LOAD_GLOBAL}@anchor{1aa0}
@deffn {Opcode} LOAD_GLOBAL (namei)

Loads the global named @code{co_names[namei>>1]} onto the stack.


Changed in version 3.11: If the low bit of @code{namei} is set, then a @code{NULL} is pushed to the
stack before the global variable.

@end deffn

@geindex LOAD_FAST (opcode)
@anchor{library/dis opcode-LOAD_FAST}@anchor{505d}
@deffn {Opcode} LOAD_FAST (var_num)

Pushes a reference to the local @code{co_varnames[var_num]} onto the stack.


Changed in version 3.12: This opcode is now only used in situations where the local variable is
guaranteed to be initialized. It cannot raise @ref{1742,,UnboundLocalError}.

@end deffn

@geindex LOAD_FAST_BORROW (opcode)
@anchor{library/dis opcode-LOAD_FAST_BORROW}@anchor{36a}
@deffn {Opcode} LOAD_FAST_BORROW (var_num)

Pushes a borrowed reference to the local @code{co_varnames[var_num]} onto the
stack.


Added in version 3.14.

@end deffn

@geindex LOAD_FAST_LOAD_FAST (opcode)
@anchor{library/dis opcode-LOAD_FAST_LOAD_FAST}@anchor{505e}
@deffn {Opcode} LOAD_FAST_LOAD_FAST (var_nums)

Pushes references to @code{co_varnames[var_nums >> 4]} and
@code{co_varnames[var_nums & 15]} onto the stack.


Added in version 3.13.

@end deffn

@geindex LOAD_FAST_BORROW_LOAD_FAST_BORROW (opcode)
@anchor{library/dis opcode-LOAD_FAST_BORROW_LOAD_FAST_BORROW}@anchor{36b}
@deffn {Opcode} LOAD_FAST_BORROW_LOAD_FAST_BORROW (var_nums)

Pushes borrowed references to @code{co_varnames[var_nums >> 4]} and
@code{co_varnames[var_nums & 15]} onto the stack.


Added in version 3.14.

@end deffn

@geindex LOAD_FAST_CHECK (opcode)
@anchor{library/dis opcode-LOAD_FAST_CHECK}@anchor{70c}
@deffn {Opcode} LOAD_FAST_CHECK (var_num)

Pushes a reference to the local @code{co_varnames[var_num]} onto the stack,
raising an @ref{1742,,UnboundLocalError} if the local variable has not been
initialized.


Added in version 3.12.

@end deffn

@geindex LOAD_FAST_AND_CLEAR (opcode)
@anchor{library/dis opcode-LOAD_FAST_AND_CLEAR}@anchor{70b}
@deffn {Opcode} LOAD_FAST_AND_CLEAR (var_num)

Pushes a reference to the local @code{co_varnames[var_num]} onto the stack (or
pushes @code{NULL} onto the stack if the local variable has not been
initialized) and sets @code{co_varnames[var_num]} to @code{NULL}.


Added in version 3.12.

@end deffn

@geindex STORE_FAST (opcode)
@anchor{library/dis opcode-STORE_FAST}@anchor{1aa9}
@deffn {Opcode} STORE_FAST (var_num)

Stores @code{STACK.pop()} into the local @code{co_varnames[var_num]}.
@end deffn

@geindex STORE_FAST_STORE_FAST (opcode)
@anchor{library/dis opcode-STORE_FAST_STORE_FAST}@anchor{505f}
@deffn {Opcode} STORE_FAST_STORE_FAST (var_nums)

Stores @code{STACK[-1]} into @code{co_varnames[var_nums >> 4]}
and @code{STACK[-2]} into @code{co_varnames[var_nums & 15]}.


Added in version 3.13.

@end deffn

@geindex STORE_FAST_LOAD_FAST (opcode)
@anchor{library/dis opcode-STORE_FAST_LOAD_FAST}@anchor{5060}
@deffn {Opcode} STORE_FAST_LOAD_FAST (var_nums)

Stores @code{STACK.pop()} into the local @code{co_varnames[var_nums >> 4]}
and pushes a reference to the local @code{co_varnames[var_nums & 15]}
onto the stack.


Added in version 3.13.

@end deffn

@geindex DELETE_FAST (opcode)
@anchor{library/dis opcode-DELETE_FAST}@anchor{5061}
@deffn {Opcode} DELETE_FAST (var_num)

Deletes local @code{co_varnames[var_num]}.
@end deffn

@geindex MAKE_CELL (opcode)
@anchor{library/dis opcode-MAKE_CELL}@anchor{911}
@deffn {Opcode} MAKE_CELL (i)

Creates a new cell in slot @code{i}.  If that slot is nonempty then
that value is stored into the new cell.


Added in version 3.11.

@end deffn

@geindex LOAD_DEREF (opcode)
@anchor{library/dis opcode-LOAD_DEREF}@anchor{5062}
@deffn {Opcode} LOAD_DEREF (i)

Loads the cell contained in slot @code{i} of the “fast locals” storage.
Pushes a reference to the object the cell contains on the stack.


Changed in version 3.11: @code{i} is no longer offset by the length of @ref{23d2,,co_varnames}.

@end deffn

@geindex LOAD_FROM_DICT_OR_DEREF (opcode)
@anchor{library/dis opcode-LOAD_FROM_DICT_OR_DEREF}@anchor{70d}
@deffn {Opcode} LOAD_FROM_DICT_OR_DEREF (i)

Pops a mapping off the stack and looks up the name associated with
slot @code{i} of the “fast locals” storage in this mapping.
If the name is not found there, loads it from the cell contained in
slot @code{i}, similar to @ref{5062,,LOAD_DEREF}. This is used for loading
@ref{18da,,closure variables} in class bodies (which previously used
@code{LOAD_CLASSDEREF}) and in
@ref{4ac,,annotation scopes} within class bodies.


Added in version 3.12.

@end deffn

@geindex STORE_DEREF (opcode)
@anchor{library/dis opcode-STORE_DEREF}@anchor{5063}
@deffn {Opcode} STORE_DEREF (i)

Stores @code{STACK.pop()} into the cell contained in slot @code{i} of the “fast locals”
storage.


Changed in version 3.11: @code{i} is no longer offset by the length of @ref{23d2,,co_varnames}.

@end deffn

@geindex DELETE_DEREF (opcode)
@anchor{library/dis opcode-DELETE_DEREF}@anchor{5064}
@deffn {Opcode} DELETE_DEREF (i)

Empties the cell contained in slot @code{i} of the “fast locals” storage.
Used by the @ref{1b63,,del} statement.


Added in version 3.2.



Changed in version 3.11: @code{i} is no longer offset by the length of @ref{23d2,,co_varnames}.

@end deffn

@geindex COPY_FREE_VARS (opcode)
@anchor{library/dis opcode-COPY_FREE_VARS}@anchor{90f}
@deffn {Opcode} COPY_FREE_VARS (n)

Copies the @code{n} @ref{18da,,free (closure) variables} from the closure
into the frame. Removes the need for special code on the caller’s side when calling
closures.


Added in version 3.11.

@end deffn

@geindex RAISE_VARARGS (opcode)
@anchor{library/dis opcode-RAISE_VARARGS}@anchor{5065}
@deffn {Opcode} RAISE_VARARGS (argc)

Raises an exception using one of the 3 forms of the @code{raise} statement,
depending on the value of `argc':


@itemize *

@item 
0: @code{raise} (re-raise previous exception)

@item 
1: @code{raise STACK[-1]} (raise exception instance or type at @code{STACK[-1]})

@item 
2: @code{raise STACK[-2] from STACK[-1]} (raise exception instance or type at
@code{STACK[-2]} with @code{__cause__} set to @code{STACK[-1]})
@end itemize
@end deffn

@geindex CALL (opcode)
@anchor{library/dis opcode-CALL}@anchor{917}
@deffn {Opcode} CALL (argc)

Calls a callable object with the number of arguments specified by @code{argc}.
On the stack are (in ascending order):


@itemize *

@item 
The callable

@item 
@code{self} or @code{NULL}

@item 
The remaining positional arguments
@end itemize

@code{argc} is the total of the positional arguments, excluding @code{self}.

@code{CALL} pops all arguments and the callable object off the stack,
calls the callable object with those arguments, and pushes the return value
returned by the callable object.


Added in version 3.11.



Changed in version 3.13: The callable now always appears at the same position on the stack.



Changed in version 3.13: Calls with keyword arguments are now handled by @ref{370,,CALL_KW}.

@end deffn

@geindex CALL_KW (opcode)
@anchor{library/dis opcode-CALL_KW}@anchor{370}
@deffn {Opcode} CALL_KW (argc)

Calls a callable object with the number of arguments specified by @code{argc},
including one or more named arguments. On the stack are (in ascending order):


@itemize *

@item 
The callable

@item 
@code{self} or @code{NULL}

@item 
The remaining positional arguments

@item 
The named arguments

@item 
A @ref{614,,tuple} of keyword argument names
@end itemize

@code{argc} is the total of the positional and named arguments, excluding @code{self}.
The length of the tuple of keyword argument names is the number of named arguments.

@code{CALL_KW} pops all arguments, the keyword names, and the callable object
off the stack, calls the callable object with those arguments, and pushes the
return value returned by the callable object.


Added in version 3.13.

@end deffn

@geindex CALL_FUNCTION_EX (opcode)
@anchor{library/dis opcode-CALL_FUNCTION_EX}@anchor{f55}
@deffn {Opcode} CALL_FUNCTION_EX (flags)

Calls a callable object with variable set of positional and keyword
arguments.  If the lowest bit of `flags' is set, the top of the stack
contains a mapping object containing additional keyword arguments.
Before the callable is called, the mapping object and iterable object
are each “unpacked” and their contents passed in as keyword and
positional arguments respectively.
@code{CALL_FUNCTION_EX} pops all arguments and the callable object off the stack,
calls the callable object with those arguments, and pushes the return value
returned by the callable object.


Added in version 3.6.

@end deffn

@geindex PUSH_NULL (opcode)
@anchor{library/dis opcode-PUSH_NULL}@anchor{918}
@deffn {Opcode} PUSH_NULL

Pushes a @code{NULL} to the stack.
Used in the call sequence to match the @code{NULL} pushed by
@code{LOAD_METHOD} for non-method calls.


Added in version 3.11.

@end deffn

@geindex MAKE_FUNCTION (opcode)
@anchor{library/dis opcode-MAKE_FUNCTION}@anchor{f54}
@deffn {Opcode} MAKE_FUNCTION

Pushes a new function object on the stack built from the code object at @code{STACK[-1]}.


Changed in version 3.10: Flag value @code{0x04} is a tuple of strings instead of dictionary



Changed in version 3.11: Qualified name at @code{STACK[-1]} was removed.



Changed in version 3.13: Extra function attributes on the stack, signaled by oparg flags, were
removed. They now use @ref{5066,,SET_FUNCTION_ATTRIBUTE}.

@end deffn

@geindex SET_FUNCTION_ATTRIBUTE (opcode)
@anchor{library/dis opcode-SET_FUNCTION_ATTRIBUTE}@anchor{5066}
@deffn {Opcode} SET_FUNCTION_ATTRIBUTE (flag)

Sets an attribute on a function object. Expects the function at @code{STACK[-1]}
and the attribute value to set at @code{STACK[-2]}; consumes both and leaves the
function at @code{STACK[-1]}. The flag determines which attribute to set:


@itemize *

@item 
@code{0x01} a tuple of default values for positional-only and
positional-or-keyword parameters in positional order

@item 
@code{0x02} a dictionary of keyword-only parameters’ default values

@item 
@code{0x04} a tuple of strings containing parameters’ annotations

@item 
@code{0x08} a tuple containing cells for free variables, making a closure

@item 
@code{0x10} the @ref{15e,,annotate function} for the function object
@end itemize


Added in version 3.13.



Changed in version 3.14: Added @code{0x10} to indicate the annotate function for the function object.

@end deffn

@geindex BUILD_SLICE (opcode)
@anchor{library/dis opcode-BUILD_SLICE}@anchor{5067}
@deffn {Opcode} BUILD_SLICE (argc)

@geindex built-in function; slice

Pushes a slice object on the stack.  `argc' must be 2 or 3.  If it is 2, implements:

@example
end = STACK.pop()
start = STACK.pop()
STACK.append(slice(start, end))
@end example

if it is 3, implements:

@example
step = STACK.pop()
end = STACK.pop()
start = STACK.pop()
STACK.append(slice(start, end, step))
@end example

See the @ref{695,,slice()} built-in function for more information.
@end deffn

@geindex EXTENDED_ARG (opcode)
@anchor{library/dis opcode-EXTENDED_ARG}@anchor{1b62}
@deffn {Opcode} EXTENDED_ARG (ext)

Prefixes any opcode which has an argument too big to fit into the default one
byte. `ext' holds an additional byte which act as higher bits in the argument.
For each opcode, at most three prefixal @code{EXTENDED_ARG} are allowed, forming
an argument from two-byte to four-byte.
@end deffn

@geindex CONVERT_VALUE (opcode)
@anchor{library/dis opcode-CONVERT_VALUE}@anchor{5068}
@deffn {Opcode} CONVERT_VALUE (oparg)

Convert value to a string, depending on @code{oparg}:

@example
value = STACK.pop()
result = func(value)
STACK.append(result)
@end example


@itemize *

@item 
@code{oparg == 1}: call @ref{16a,,str()} on `value'

@item 
@code{oparg == 2}: call @ref{1c3,,repr()} on `value'

@item 
@code{oparg == 3}: call @ref{15f2,,ascii()} on `value'
@end itemize

Used for implementing formatted string literals (f-strings).


Added in version 3.13.

@end deffn

@geindex FORMAT_SIMPLE (opcode)
@anchor{library/dis opcode-FORMAT_SIMPLE}@anchor{5069}
@deffn {Opcode} FORMAT_SIMPLE

Formats the value on top of stack:

@example
value = STACK.pop()
result = value.__format__("")
STACK.append(result)
@end example

Used for implementing formatted string literals (f-strings).


Added in version 3.13.

@end deffn

@geindex FORMAT_WITH_SPEC (opcode)
@anchor{library/dis opcode-FORMAT_WITH_SPEC}@anchor{506a}
@deffn {Opcode} FORMAT_WITH_SPEC

Formats the given value with the given format spec:

@example
spec = STACK.pop()
value = STACK.pop()
result = value.__format__(spec)
STACK.append(result)
@end example

Used for implementing formatted string literals (f-strings).


Added in version 3.13.

@end deffn

@geindex MATCH_CLASS (opcode)
@anchor{library/dis opcode-MATCH_CLASS}@anchor{921}
@deffn {Opcode} MATCH_CLASS (count)

@code{STACK[-1]} is a tuple of keyword attribute names, @code{STACK[-2]} is the class
being matched against, and @code{STACK[-3]} is the match subject.  `count' is the
number of positional sub-patterns.

Pop @code{STACK[-1]}, @code{STACK[-2]}, and @code{STACK[-3]}. If @code{STACK[-3]} is an
instance of @code{STACK[-2]} and has the positional and keyword attributes
required by `count' and @code{STACK[-1]}, push a tuple of extracted attributes.
Otherwise, push @code{None}.


Added in version 3.10.



Changed in version 3.11: Previously, this instruction also pushed a boolean value indicating
success (@code{True}) or failure (@code{False}).

@end deffn

@geindex RESUME (opcode)
@anchor{library/dis opcode-RESUME}@anchor{5bb}
@deffn {Opcode} RESUME (context)

A no-op. Performs internal tracing, debugging and optimization checks.

The @code{context} operand consists of two parts. The lowest two bits
indicate where the @code{RESUME} occurs:


@itemize *

@item 
@code{0} The start of a function, which is neither a generator, coroutine
nor an async generator

@item 
@code{1} After a @code{yield} expression

@item 
@code{2} After a @code{yield from} expression

@item 
@code{3} After an @code{await} expression
@end itemize

The next bit is @code{1} if the RESUME is at except-depth @code{1}, and @code{0}
otherwise.


Added in version 3.11.



Changed in version 3.13: The oparg value changed to include information about except-depth

@end deffn

@geindex RETURN_GENERATOR (opcode)
@anchor{library/dis opcode-RETURN_GENERATOR}@anchor{90d}
@deffn {Opcode} RETURN_GENERATOR

Create a generator, coroutine, or async generator from the current frame.
Used as first opcode of in code object for the above mentioned callables.
Clear the current frame and return the newly created generator.


Added in version 3.11.

@end deffn

@geindex SEND (opcode)
@anchor{library/dis opcode-SEND}@anchor{90e}
@deffn {Opcode} SEND (delta)

Equivalent to @code{STACK[-1] = STACK[-2].send(STACK[-1])}. Used in @code{yield from}
and @code{await} statements.

If the call raises @ref{dfb,,StopIteration}, pop the top value from the stack,
push the exception’s @code{value} attribute, and increment the bytecode counter
by `delta'.


Added in version 3.11.

@end deffn

@geindex HAVE_ARGUMENT (opcode)
@anchor{library/dis opcode-HAVE_ARGUMENT}@anchor{6b2}
@deffn {Opcode} HAVE_ARGUMENT

This is not really an opcode.  It identifies the dividing line between
opcodes in the range [0,255] which don’t use their argument and those
that do (@code{< HAVE_ARGUMENT} and @code{>= HAVE_ARGUMENT}, respectively).

If your application uses pseudo instructions or specialized instructions,
use the @ref{59f,,hasarg} collection instead.


Changed in version 3.6: Now every instruction has an argument, but opcodes @code{< HAVE_ARGUMENT}
ignore it. Before, only opcodes @code{>= HAVE_ARGUMENT} had an argument.



Changed in version 3.12: Pseudo instructions were added to the @code{dis} module, and for them
it is not true that comparison with @code{HAVE_ARGUMENT} indicates whether
they use their arg.



Deprecated since version 3.13: Use @ref{59f,,hasarg} instead.

@end deffn

@geindex CALL_INTRINSIC_1 (opcode)
@anchor{library/dis opcode-CALL_INTRINSIC_1}@anchor{708}
@deffn {Opcode} CALL_INTRINSIC_1

Calls an intrinsic function with one argument. Passes @code{STACK[-1]} as the
argument and sets @code{STACK[-1]} to the result. Used to implement
functionality that is not performance critical.

The operand determines which intrinsic function is called:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Operand

@tab

Description

@item

@code{INTRINSIC_1_INVALID}

@tab

Not valid

@item

@code{INTRINSIC_PRINT}

@tab

Prints the argument to standard
out. Used in the REPL.

@item

@code{INTRINSIC_IMPORT_STAR}

@tab

Performs @code{import *} for the
named module.

@item

@code{INTRINSIC_STOPITERATION_ERROR}

@tab

Extracts the return value from a
@code{StopIteration} exception.

@item

@code{INTRINSIC_ASYNC_GEN_WRAP}

@tab

Wraps an async generator value

@item

@code{INTRINSIC_UNARY_POSITIVE}

@tab

Performs the unary @code{+}
operation

@item

@code{INTRINSIC_LIST_TO_TUPLE}

@tab

Converts a list to a tuple

@item

@code{INTRINSIC_TYPEVAR}

@tab

Creates a @ref{487,,typing.TypeVar}

@item

@code{INTRINSIC_PARAMSPEC}

@tab

Creates a
@ref{488,,typing.ParamSpec}

@item

@code{INTRINSIC_TYPEVARTUPLE}

@tab

Creates a
@ref{489,,typing.TypeVarTuple}

@item

@code{INTRINSIC_SUBSCRIPT_GENERIC}

@tab

Returns @ref{1806,,typing.Generic}
subscripted with the argument

@item

@code{INTRINSIC_TYPEALIAS}

@tab

Creates a
@ref{2b0,,typing.TypeAliasType};
used in the @ref{66d,,type}
statement. The argument is a tuple
of the type alias’s name,
type parameters, and value.

@end multitable



Added in version 3.12.

@end deffn

@geindex CALL_INTRINSIC_2 (opcode)
@anchor{library/dis opcode-CALL_INTRINSIC_2}@anchor{709}
@deffn {Opcode} CALL_INTRINSIC_2

Calls an intrinsic function with two arguments. Used to implement functionality
that is not performance critical:

@example
arg2 = STACK.pop()
arg1 = STACK.pop()
result = intrinsic2(arg1, arg2)
STACK.append(result)
@end example

The operand determines which intrinsic function is called:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Operand

@tab

Description

@item

@code{INTRINSIC_2_INVALID}

@tab

Not valid

@item

@code{INTRINSIC_PREP_RERAISE_STAR}

@tab

Calculates the
@ref{4d3,,ExceptionGroup} to raise
from a @code{try-except*}.

@item

@code{INTRINSIC_TYPEVAR_WITH_BOUND}

@tab

Creates a @ref{487,,typing.TypeVar}
with a bound.

@item

@code{INTRINSIC_TYPEVAR_WITH_CONSTRAINTS}

@tab

Creates a
@ref{487,,typing.TypeVar} with
constraints.

@item

@code{INTRINSIC_SET_FUNCTION_TYPE_PARAMS}

@tab

Sets the @code{__type_params__}
attribute of a function.

@end multitable



Added in version 3.12.

@end deffn

@geindex LOAD_SPECIAL (opcode)
@anchor{library/dis opcode-LOAD_SPECIAL}@anchor{36d}
@deffn {Opcode} LOAD_SPECIAL

Performs special method lookup on @code{STACK[-1]}.
If @code{type(STACK[-1]).__xxx__} is a method, leave
@code{type(STACK[-1]).__xxx__; STACK[-1]} on the stack.
If @code{type(STACK[-1]).__xxx__} is not a method, leave
@code{STACK[-1].__xxx__; NULL} on the stack.


Added in version 3.14.

@end deffn

`Pseudo-instructions'

These opcodes do not appear in Python bytecode. They are used by the compiler
but are replaced by real opcodes or removed before bytecode is generated.

@geindex SETUP_FINALLY (opcode)
@anchor{library/dis opcode-SETUP_FINALLY}@anchor{506b}
@deffn {Opcode} SETUP_FINALLY (target)

Set up an exception handler for the following code block. If an exception
occurs, the value stack level is restored to its current state and control
is transferred to the exception handler at @code{target}.
@end deffn

@geindex SETUP_CLEANUP (opcode)
@anchor{library/dis opcode-SETUP_CLEANUP}@anchor{506c}
@deffn {Opcode} SETUP_CLEANUP (target)

Like @code{SETUP_FINALLY}, but in case of an exception also pushes the last
instruction (@code{lasti}) to the stack so that @code{RERAISE} can restore it.
If an exception occurs, the value stack level and the last instruction on
the frame are restored to their current state, and control is transferred
to the exception handler at @code{target}.
@end deffn

@geindex SETUP_WITH (opcode)
@anchor{library/dis opcode-SETUP_WITH}@anchor{506d}
@deffn {Opcode} SETUP_WITH (target)

Like @code{SETUP_CLEANUP}, but in case of an exception one more item is popped
from the stack before control is transferred to the exception handler at
@code{target}.

This variant is used in @ref{187,,with} and @ref{186,,async with}
constructs, which push the return value of the context manager’s
@ref{7e5,,__enter__()} or @ref{2465,,__aenter__()} to the stack.
@end deffn

@geindex POP_BLOCK (opcode)
@anchor{library/dis opcode-POP_BLOCK}@anchor{506e}
@deffn {Opcode} POP_BLOCK

Marks the end of the code block associated with the last @code{SETUP_FINALLY},
@code{SETUP_CLEANUP} or @code{SETUP_WITH}.
@end deffn

@geindex LOAD_CONST_IMMORTAL (opcode)
@anchor{library/dis opcode-LOAD_CONST_IMMORTAL}@anchor{373}
@deffn {Opcode} LOAD_CONST_IMMORTAL (consti)

Works as @ref{5052,,LOAD_CONST}, but is more efficient for immortal objects.
@end deffn

@geindex JUMP (opcode)
@geindex JUMP_NO_INTERRUPT (opcode)
@anchor{library/dis opcode-JUMP}@anchor{506f}
@deffn {Opcode} JUMP
@anchor{library/dis opcode-JUMP_NO_INTERRUPT}@anchor{1be8}
@deffnx {Opcode} JUMP_NO_INTERRUPT

Undirected relative jump instructions which are replaced by their
directed (forward/backward) counterparts by the assembler.
@end deffn

@geindex JUMP_IF_TRUE (opcode)
@geindex JUMP_IF_FALSE (opcode)
@anchor{library/dis opcode-JUMP_IF_TRUE}@anchor{371}
@deffn {Opcode} JUMP_IF_TRUE
@anchor{library/dis opcode-JUMP_IF_FALSE}@anchor{372}
@deffnx {Opcode} JUMP_IF_FALSE

Conditional jumps which do not impact the stack. Replaced by the sequence
@code{COPY 1}, @code{TO_BOOL}, @code{POP_JUMP_IF_TRUE/FALSE}.
@end deffn

@geindex LOAD_CLOSURE (opcode)
@anchor{library/dis opcode-LOAD_CLOSURE}@anchor{1aa3}
@deffn {Opcode} LOAD_CLOSURE (i)

Pushes a reference to the cell contained in slot @code{i} of the “fast locals”
storage.

Note that @code{LOAD_CLOSURE} is replaced with @code{LOAD_FAST} in the assembler.


Changed in version 3.13: This opcode is now a pseudo-instruction.

@end deffn

@node Opcode collections,,Python Bytecode Instructions,dis — Disassembler for Python bytecode
@anchor{library/dis id1}@anchor{5070}@anchor{library/dis opcode-collections}@anchor{5021}
@subsubsection Opcode collections


These collections are provided for automatic introspection of bytecode
instructions:


Changed in version 3.12: The collections now contain pseudo instructions and instrumented
instructions as well. These are opcodes with values @code{>= MIN_PSEUDO_OPCODE}
and @code{>= MIN_INSTRUMENTED_OPCODE}.


@geindex opname (in module dis)
@anchor{library/dis dis opname}@anchor{5025}
@deffn {Data} dis.opname

Sequence of operation names, indexable using the bytecode.
@end deffn

@geindex opmap (in module dis)
@anchor{library/dis dis opmap}@anchor{5071}
@deffn {Data} dis.opmap

Dictionary mapping operation names to bytecodes.
@end deffn

@geindex cmp_op (in module dis)
@anchor{library/dis dis cmp_op}@anchor{5072}
@deffn {Data} dis.cmp_op

Sequence of all compare operation names.
@end deffn

@geindex hasarg (in module dis)
@anchor{library/dis dis hasarg}@anchor{59f}
@deffn {Data} dis.hasarg

Sequence of bytecodes that use their argument.


Added in version 3.12.

@end deffn

@geindex hasconst (in module dis)
@anchor{library/dis dis hasconst}@anchor{5073}
@deffn {Data} dis.hasconst

Sequence of bytecodes that access a constant.
@end deffn

@geindex hasfree (in module dis)
@anchor{library/dis dis hasfree}@anchor{5074}
@deffn {Data} dis.hasfree

Sequence of bytecodes that access a @ref{18da,,free (closure) variable}.
‘free’ in this context refers to names in the current scope that are
referenced by inner scopes or names in outer scopes that are referenced
from this scope.  It does `not' include references to global or builtin scopes.
@end deffn

@geindex hasname (in module dis)
@anchor{library/dis dis hasname}@anchor{5075}
@deffn {Data} dis.hasname

Sequence of bytecodes that access an attribute by name.
@end deffn

@geindex hasjump (in module dis)
@anchor{library/dis dis hasjump}@anchor{5076}
@deffn {Data} dis.hasjump

Sequence of bytecodes that have a jump target. All jumps
are relative.


Added in version 3.13.

@end deffn

@geindex haslocal (in module dis)
@anchor{library/dis dis haslocal}@anchor{5077}
@deffn {Data} dis.haslocal

Sequence of bytecodes that access a local variable.
@end deffn

@geindex hascompare (in module dis)
@anchor{library/dis dis hascompare}@anchor{5078}
@deffn {Data} dis.hascompare

Sequence of bytecodes of Boolean operations.
@end deffn

@geindex hasexc (in module dis)
@anchor{library/dis dis hasexc}@anchor{6b3}
@deffn {Data} dis.hasexc

Sequence of bytecodes that set an exception handler.


Added in version 3.12.

@end deffn

@geindex hasjrel (in module dis)
@anchor{library/dis dis hasjrel}@anchor{5079}
@deffn {Data} dis.hasjrel

Sequence of bytecodes that have a relative jump target.


Deprecated since version 3.13: All jumps are now relative. Use @ref{5076,,hasjump}.

@end deffn

@geindex hasjabs (in module dis)
@anchor{library/dis dis hasjabs}@anchor{507a}
@deffn {Data} dis.hasjabs

Sequence of bytecodes that have an absolute jump target.


Deprecated since version 3.13: All jumps are now relative. This list is empty.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node pickletools — Tools for pickle developers,,dis — Disassembler for Python bytecode,Python Language Services
@anchor{library/pickletools doc}@anchor{507b}@anchor{library/pickletools module-pickletools}@anchor{ac}@anchor{library/pickletools pickletools-tools-for-pickle-developers}@anchor{507c}@anchor{library/pickletools translation-repo}@anchor{507d}
@subsection @code{pickletools} — Tools for pickle developers


@geindex module; pickletools

`Source code:' Lib/pickletools.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/pickletools.py}


__________________________________________________________________


This module contains various constants relating to the intimate details of the
@ref{ab,,pickle} module, some lengthy comments about the implementation, and a
few useful functions for analyzing pickled data.  The contents of this module
are useful for Python core developers who are working on the @code{pickle};
ordinary users of the @code{pickle} module probably won’t find the
@code{pickletools} module relevant.

@menu
* Command-line usage: Command-line usage<8>. 
* Programmatic interface:: 

@end menu

@node Command-line usage<8>,Programmatic interface,,pickletools — Tools for pickle developers
@anchor{library/pickletools command-line-usage}@anchor{507e}@anchor{library/pickletools pickletools-cli}@anchor{2da0}
@subsubsection Command-line usage



Added in version 3.2.


When invoked from the command line, @code{python -m pickletools} will
disassemble the contents of one or more pickle files.  Note that if
you want to see the Python object stored in the pickle rather than the
details of pickle format, you may want to use @code{-m pickle} instead.
However, when the pickle file that you want to examine comes from an
untrusted source, @code{-m pickletools} is a safer option because it does
not execute pickle bytecode.

For example, with a tuple @code{(1, 2)} pickled in file @code{x.pickle}:

@example
$ python -m pickle x.pickle
(1, 2)

$ python -m pickletools x.pickle
    0: \x80 PROTO      3
    2: K    BININT1    1
    4: K    BININT1    2
    6: \x86 TUPLE2
    7: q    BINPUT     0
    9: .    STOP
highest protocol among opcodes = 2
@end example

@menu
* Command-line options: Command-line options<6>. 

@end menu

@node Command-line options<6>,,,Command-line usage<8>
@anchor{library/pickletools command-line-options}@anchor{507f}
@subsubsection Command-line options


@geindex pickletools command line option; -a
@geindex pickletools command line option; --annotate
@anchor{library/pickletools cmdoption-pickletools-a}@anchor{5080}@anchor{library/pickletools cmdoption-pickletools-annotate}@anchor{5081}
@deffn {Option} @w{-}a, @w{-}@w{-}annotate

Annotate each line with a short opcode description.
@end deffn

@geindex pickletools command line option; -o
@geindex pickletools command line option; --output
@anchor{library/pickletools cmdoption-pickletools-o}@anchor{5082}@anchor{library/pickletools cmdoption-pickletools-output}@anchor{5083}
@deffn {Option} @w{-}o, @w{-}@w{-}output=<file>

Name of a file where the output should be written.
@end deffn

@geindex pickletools command line option; -l
@geindex pickletools command line option; --indentlevel
@anchor{library/pickletools cmdoption-pickletools-l}@anchor{5084}@anchor{library/pickletools cmdoption-pickletools-indentlevel}@anchor{5085}
@deffn {Option} @w{-}l, @w{-}@w{-}indentlevel=<num>

The number of blanks by which to indent a new MARK level.
@end deffn

@geindex pickletools command line option; -m
@geindex pickletools command line option; --memo
@anchor{library/pickletools cmdoption-pickletools-m}@anchor{5086}@anchor{library/pickletools cmdoption-pickletools-memo}@anchor{5087}
@deffn {Option} @w{-}m, @w{-}@w{-}memo

When multiple objects are disassembled, preserve memo between
disassemblies.
@end deffn

@geindex pickletools command line option; -p
@geindex pickletools command line option; --preamble
@anchor{library/pickletools cmdoption-pickletools-p}@anchor{5088}@anchor{library/pickletools cmdoption-pickletools-preamble}@anchor{5089}
@deffn {Option} @w{-}p, @w{-}@w{-}preamble=<preamble>

When more than one pickle file is specified, print given preamble
before each disassembly.
@end deffn

@geindex pickletools command line option; pickle_file
@anchor{library/pickletools cmdoption-pickletools-arg-pickle_file}@anchor{508a}
@deffn {Option} pickle_file

A pickle file to read, or @code{-} to indicate reading from standard input.
@end deffn

@node Programmatic interface,,Command-line usage<8>,pickletools — Tools for pickle developers
@anchor{library/pickletools programmatic-interface}@anchor{508b}
@subsubsection Programmatic interface


@geindex dis() (in module pickletools)
@anchor{library/pickletools pickletools dis}@anchor{ec4}
@deffn {Function} pickletools.dis (pickle, out=None, memo=None, indentlevel=4, annotate=0)

Outputs a symbolic disassembly of the pickle to the file-like
object `out', defaulting to @code{sys.stdout}.  `pickle' can be a
string or a file-like object.  `memo' can be a Python dictionary
that will be used as the pickle’s memo; it can be used to perform
disassemblies across multiple pickles created by the same
pickler. Successive levels, indicated by @code{MARK} opcodes in the
stream, are indented by `indentlevel' spaces.  If a nonzero value
is given to `annotate', each opcode in the output is annotated with
a short description.  The value of `annotate' is used as a hint for
the column where annotation should start.


Changed in version 3.2: Added the `annotate' parameter.

@end deffn

@geindex genops() (in module pickletools)
@anchor{library/pickletools pickletools genops}@anchor{508c}
@deffn {Function} pickletools.genops (pickle)

Provides an @ref{4c9,,iterator} over all of the opcodes in a pickle, returning a
sequence of @code{(opcode, arg, pos)} triples.  `opcode' is an instance of an
@code{OpcodeInfo} class; `arg' is the decoded value, as a Python object, of
the opcode’s argument; `pos' is the position at which this opcode is located.
`pickle' can be a string or a file-like object.
@end deffn

@geindex optimize() (in module pickletools)
@anchor{library/pickletools pickletools optimize}@anchor{2d87}
@deffn {Function} pickletools.optimize (picklestring)

Returns a new equivalent pickle string after eliminating unused @code{PUT}
opcodes. The optimized pickle is shorter, takes less transmission time,
requires less storage space, and unpickles more efficiently.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node MS Windows Specific Services,Unix-specific services,Python Language Services,The Python Standard Library
@anchor{library/windows doc}@anchor{508d}@anchor{library/windows ms-windows-specific-services}@anchor{508e}@anchor{library/windows mswin-specific-services}@anchor{2264}@anchor{library/windows translation-repo}@anchor{508f}
@section MS Windows Specific Services


This chapter describes modules that are only available on MS Windows platforms.

@menu
* msvcrt — Useful routines from the MS VC++ runtime:: 
* winreg — Windows registry access:: 
* winsound — Sound-playing interface for Windows:: 

@end menu

@node msvcrt — Useful routines from the MS VC++ runtime,winreg — Windows registry access,,MS Windows Specific Services
@anchor{library/msvcrt doc}@anchor{5090}@anchor{library/msvcrt module-msvcrt}@anchor{97}@anchor{library/msvcrt msvcrt-useful-routines-from-the-ms-vc-runtime}@anchor{5091}
@subsection @code{msvcrt} — Useful routines from the MS VC++ runtime


@geindex module; msvcrt


__________________________________________________________________


These functions provide access to some useful capabilities on Windows platforms.
Some higher-level modules use these functions to build the Windows
implementations of their services. For example, the @ref{66,,getpass} module uses
this in the implementation of the @ref{66,,getpass()} function.

Further documentation on these functions can be found in the Platform API
documentation.

The module implements both the normal and wide char variants of the console I/O
api. The normal API deals only with ASCII characters and is of limited use
for internationalized applications. The wide char API should be used where
ever possible.

@ref{2181,,Availability}: Windows.


Changed in version 3.3: Operations in this module now raise @ref{2c2,,OSError} where @ref{1259,,IOError}
was raised.


@menu
* File Operations:: 
* Console I/O:: 
* Other Functions:: 

@end menu

@node File Operations,Console I/O,,msvcrt — Useful routines from the MS VC++ runtime
@anchor{library/msvcrt file-operations}@anchor{5092}@anchor{library/msvcrt msvcrt-files}@anchor{5093}
@subsubsection File Operations


@geindex locking() (in module msvcrt)
@anchor{library/msvcrt msvcrt locking}@anchor{4abe}
@deffn {Function} msvcrt.locking (fd, mode, nbytes)

Lock part of a file based on file descriptor `fd' from the C runtime. Raises
@ref{2c2,,OSError} on failure. The locked region of the file extends from the
current file position for `nbytes' bytes, and may continue beyond the end of the
file. `mode' must be one of the @code{LK_*} constants listed below. Multiple
regions in a file may be locked at the same time, but may not overlap. Adjacent
regions are not merged; they must be unlocked individually.

Raises an @ref{1cb1,,auditing event} @code{msvcrt.locking} with arguments @code{fd}, @code{mode}, @code{nbytes}.
@end deffn

@geindex LK_LOCK (in module msvcrt)
@geindex LK_RLCK (in module msvcrt)
@anchor{library/msvcrt msvcrt LK_LOCK}@anchor{5094}
@deffn {Data} msvcrt.LK_LOCK
@anchor{library/msvcrt msvcrt LK_RLCK}@anchor{5095}
@deffnx {Data} msvcrt.LK_RLCK

Locks the specified bytes. If the bytes cannot be locked, the program
immediately tries again after 1 second. If, after 10 attempts, the bytes cannot
be locked, @ref{2c2,,OSError} is raised.
@end deffn

@geindex LK_NBLCK (in module msvcrt)
@geindex LK_NBRLCK (in module msvcrt)
@anchor{library/msvcrt msvcrt LK_NBLCK}@anchor{5096}
@deffn {Data} msvcrt.LK_NBLCK
@anchor{library/msvcrt msvcrt LK_NBRLCK}@anchor{5097}
@deffnx {Data} msvcrt.LK_NBRLCK

Locks the specified bytes. If the bytes cannot be locked, @ref{2c2,,OSError} is
raised.
@end deffn

@geindex LK_UNLCK (in module msvcrt)
@anchor{library/msvcrt msvcrt LK_UNLCK}@anchor{5098}
@deffn {Data} msvcrt.LK_UNLCK

Unlocks the specified bytes, which must have been previously locked.
@end deffn

@geindex setmode() (in module msvcrt)
@anchor{library/msvcrt msvcrt setmode}@anchor{5099}
@deffn {Function} msvcrt.setmode (fd, flags)

Set the line-end translation mode for the file descriptor `fd'. To set it to
text mode, `flags' should be @ref{30c4,,os.O_TEXT}; for binary, it should be
@ref{30b5,,os.O_BINARY}.
@end deffn

@geindex open_osfhandle() (in module msvcrt)
@anchor{library/msvcrt msvcrt open_osfhandle}@anchor{4abf}
@deffn {Function} msvcrt.open_osfhandle (handle, flags)

Create a C runtime file descriptor from the file handle `handle'. The `flags'
parameter should be a bitwise OR of @ref{30b7,,os.O_APPEND},
@ref{30b3,,os.O_RDONLY}, @ref{30c4,,os.O_TEXT} and @ref{30bf,,os.O_NOINHERIT}.
The returned file descriptor may be used as a parameter
to @ref{23c4,,os.fdopen()} to create a file object.

The file descriptor is inheritable by default. Pass @ref{30bf,,os.O_NOINHERIT}
flag to make it non inheritable.

Raises an @ref{1cb1,,auditing event} @code{msvcrt.open_osfhandle} with arguments @code{handle}, @code{flags}.
@end deffn

@geindex get_osfhandle() (in module msvcrt)
@anchor{library/msvcrt msvcrt get_osfhandle}@anchor{4abd}
@deffn {Function} msvcrt.get_osfhandle (fd)

Return the file handle for the file descriptor `fd'. Raises @ref{2c2,,OSError} if
`fd' is not recognized.

Raises an @ref{1cb1,,auditing event} @code{msvcrt.get_osfhandle} with argument @code{fd}.
@end deffn

@node Console I/O,Other Functions,File Operations,msvcrt — Useful routines from the MS VC++ runtime
@anchor{library/msvcrt console-i-o}@anchor{509a}@anchor{library/msvcrt msvcrt-console}@anchor{509b}
@subsubsection Console I/O


@geindex kbhit() (in module msvcrt)
@anchor{library/msvcrt msvcrt kbhit}@anchor{509c}
@deffn {Function} msvcrt.kbhit ()

Returns a nonzero value if a keypress is waiting to be read. Otherwise,
return 0.
@end deffn

@geindex getch() (in module msvcrt)
@anchor{library/msvcrt msvcrt getch}@anchor{509d}
@deffn {Function} msvcrt.getch ()

Read a keypress and return the resulting character as a byte string.
Nothing is echoed to the console. This call will block if a keypress
is not already available, but will not wait for @code{Enter} to be
pressed. If the pressed key was a special function key, this will
return @code{'\000'} or @code{'\xe0'}; the next call will return the keycode.
The @code{Control}-@code{C} keypress cannot be read with this function.
@end deffn

@geindex getwch() (in module msvcrt)
@anchor{library/msvcrt msvcrt getwch}@anchor{1601}
@deffn {Function} msvcrt.getwch ()

Wide char variant of @ref{509d,,getch()}, returning a Unicode value.
@end deffn

@geindex getche() (in module msvcrt)
@anchor{library/msvcrt msvcrt getche}@anchor{509e}
@deffn {Function} msvcrt.getche ()

Similar to @ref{509d,,getch()}, but the keypress will be echoed if it represents a
printable character.
@end deffn

@geindex getwche() (in module msvcrt)
@anchor{library/msvcrt msvcrt getwche}@anchor{1602}
@deffn {Function} msvcrt.getwche ()

Wide char variant of @ref{509e,,getche()}, returning a Unicode value.
@end deffn

@geindex putch() (in module msvcrt)
@anchor{library/msvcrt msvcrt putch}@anchor{509f}
@deffn {Function} msvcrt.putch (char)

Print the byte string `char' to the console without buffering.
@end deffn

@geindex putwch() (in module msvcrt)
@anchor{library/msvcrt msvcrt putwch}@anchor{1603}
@deffn {Function} msvcrt.putwch (unicode_char)

Wide char variant of @ref{509f,,putch()}, accepting a Unicode value.
@end deffn

@geindex ungetch() (in module msvcrt)
@anchor{library/msvcrt msvcrt ungetch}@anchor{50a0}
@deffn {Function} msvcrt.ungetch (char)

Cause the byte string `char' to be “pushed back” into the console buffer;
it will be the next character read by @ref{509d,,getch()} or @ref{509e,,getche()}.
@end deffn

@geindex ungetwch() (in module msvcrt)
@anchor{library/msvcrt msvcrt ungetwch}@anchor{50a1}
@deffn {Function} msvcrt.ungetwch (unicode_char)

Wide char variant of @ref{50a0,,ungetch()}, accepting a Unicode value.
@end deffn

@node Other Functions,,Console I/O,msvcrt — Useful routines from the MS VC++ runtime
@anchor{library/msvcrt msvcrt-other}@anchor{50a2}@anchor{library/msvcrt other-functions}@anchor{50a3}
@subsubsection Other Functions


@geindex heapmin() (in module msvcrt)
@anchor{library/msvcrt msvcrt heapmin}@anchor{50a4}
@deffn {Function} msvcrt.heapmin ()

Force the @code{malloc()} heap to clean itself up and return unused blocks to
the operating system. On failure, this raises @ref{2c2,,OSError}.
@end deffn

@geindex set_error_mode() (in module msvcrt)
@anchor{library/msvcrt msvcrt set_error_mode}@anchor{50a5}
@deffn {Function} msvcrt.set_error_mode (mode)

Changes the location where the C runtime writes an error message for an error
that might end the program. `mode' must be one of the @code{OUT_*}
constants listed below  or @ref{50a6,,REPORT_ERRMODE}. Returns the old setting
or -1 if an error occurs. Only available in
@ref{50a,,debug build of Python}.
@end deffn

@geindex OUT_TO_DEFAULT (in module msvcrt)
@anchor{library/msvcrt msvcrt OUT_TO_DEFAULT}@anchor{50a7}
@deffn {Data} msvcrt.OUT_TO_DEFAULT

Error sink is determined by the app’s type. Only available in
@ref{50a,,debug build of Python}.
@end deffn

@geindex OUT_TO_STDERR (in module msvcrt)
@anchor{library/msvcrt msvcrt OUT_TO_STDERR}@anchor{50a8}
@deffn {Data} msvcrt.OUT_TO_STDERR

Error sink is a standard error. Only available in
@ref{50a,,debug build of Python}.
@end deffn

@geindex OUT_TO_MSGBOX (in module msvcrt)
@anchor{library/msvcrt msvcrt OUT_TO_MSGBOX}@anchor{50a9}
@deffn {Data} msvcrt.OUT_TO_MSGBOX

Error sink is a message box. Only available in
@ref{50a,,debug build of Python}.
@end deffn

@geindex REPORT_ERRMODE (in module msvcrt)
@anchor{library/msvcrt msvcrt REPORT_ERRMODE}@anchor{50a6}
@deffn {Data} msvcrt.REPORT_ERRMODE

Report the current error mode value. Only available in
@ref{50a,,debug build of Python}.
@end deffn

@geindex CrtSetReportMode() (in module msvcrt)
@anchor{library/msvcrt msvcrt CrtSetReportMode}@anchor{50aa}
@deffn {Function} msvcrt.CrtSetReportMode (type, mode)

Specifies the destination or destinations for a specific report type
generated by @code{_CrtDbgReport()} in the MS VC++ runtime. `type' must be
one of the @code{CRT_*} constants listed below. `mode' must be one of the
@code{CRTDBG_*} constants listed below. Only available in
@ref{50a,,debug build of Python}.
@end deffn

@geindex CrtSetReportFile() (in module msvcrt)
@anchor{library/msvcrt msvcrt CrtSetReportFile}@anchor{50ab}
@deffn {Function} msvcrt.CrtSetReportFile (type, file)

After you use @ref{50aa,,CrtSetReportMode()} to specify @ref{50ac,,CRTDBG_MODE_FILE},
you can specify the file handle to receive the message text. `type' must be
one of the @code{CRT_*} constants listed below. `file' should be the file
handle your want specified. Only available in
@ref{50a,,debug build of Python}.
@end deffn

@geindex CRT_WARN (in module msvcrt)
@anchor{library/msvcrt msvcrt CRT_WARN}@anchor{50ad}
@deffn {Data} msvcrt.CRT_WARN

Warnings, messages, and information that doesn’t need immediate attention.
@end deffn

@geindex CRT_ERROR (in module msvcrt)
@anchor{library/msvcrt msvcrt CRT_ERROR}@anchor{50ae}
@deffn {Data} msvcrt.CRT_ERROR

Errors, unrecoverable problems, and issues that require immediate attention.
@end deffn

@geindex CRT_ASSERT (in module msvcrt)
@anchor{library/msvcrt msvcrt CRT_ASSERT}@anchor{50af}
@deffn {Data} msvcrt.CRT_ASSERT

Assertion failures.
@end deffn

@geindex CRTDBG_MODE_DEBUG (in module msvcrt)
@anchor{library/msvcrt msvcrt CRTDBG_MODE_DEBUG}@anchor{50b0}
@deffn {Data} msvcrt.CRTDBG_MODE_DEBUG

Writes the message to the debugger’s output window.
@end deffn

@geindex CRTDBG_MODE_FILE (in module msvcrt)
@anchor{library/msvcrt msvcrt CRTDBG_MODE_FILE}@anchor{50ac}
@deffn {Data} msvcrt.CRTDBG_MODE_FILE

Writes the message to a user-supplied file handle. @ref{50ab,,CrtSetReportFile()}
should be called to define the specific file or stream to use as
the destination.
@end deffn

@geindex CRTDBG_MODE_WNDW (in module msvcrt)
@anchor{library/msvcrt msvcrt CRTDBG_MODE_WNDW}@anchor{50b1}
@deffn {Data} msvcrt.CRTDBG_MODE_WNDW

Creates a message box to display the message along with the @code{Abort},
@code{Retry}, and @code{Ignore} buttons.
@end deffn

@geindex CRTDBG_REPORT_MODE (in module msvcrt)
@anchor{library/msvcrt msvcrt CRTDBG_REPORT_MODE}@anchor{50b2}
@deffn {Data} msvcrt.CRTDBG_REPORT_MODE

Returns current `mode' for the specified `type'.
@end deffn

@geindex CRT_ASSEMBLY_VERSION (in module msvcrt)
@anchor{library/msvcrt msvcrt CRT_ASSEMBLY_VERSION}@anchor{156b}
@deffn {Data} msvcrt.CRT_ASSEMBLY_VERSION

The CRT Assembly version, from the @code{crtassem.h} header file.
@end deffn

@geindex VC_ASSEMBLY_PUBLICKEYTOKEN (in module msvcrt)
@anchor{library/msvcrt msvcrt VC_ASSEMBLY_PUBLICKEYTOKEN}@anchor{156c}
@deffn {Data} msvcrt.VC_ASSEMBLY_PUBLICKEYTOKEN

The VC Assembly public key token, from the @code{crtassem.h} header file.
@end deffn

@geindex LIBRARIES_ASSEMBLY_NAME_PREFIX (in module msvcrt)
@anchor{library/msvcrt msvcrt LIBRARIES_ASSEMBLY_NAME_PREFIX}@anchor{156d}
@deffn {Data} msvcrt.LIBRARIES_ASSEMBLY_NAME_PREFIX

The Libraries Assembly name prefix, from the @code{crtassem.h} header file.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node winreg — Windows registry access,winsound — Sound-playing interface for Windows,msvcrt — Useful routines from the MS VC++ runtime,MS Windows Specific Services
@anchor{library/winreg doc}@anchor{50b3}@anchor{library/winreg module-winreg}@anchor{11d}@anchor{library/winreg translation-repo}@anchor{50b4}@anchor{library/winreg winreg-windows-registry-access}@anchor{50b5}
@subsection @code{winreg} — Windows registry access


@geindex module; winreg


__________________________________________________________________


These functions expose the Windows registry API to Python.  Instead of using an
integer as the registry handle, a @ref{50b6,,handle object} is used
to ensure that the handles are closed correctly, even if the programmer neglects
to explicitly close them.

@ref{2181,,Availability}: Windows.
@anchor{library/winreg exception-changed}@anchor{50b7}

Changed in version 3.3: Several functions in this module used to raise a
@ref{125b,,WindowsError}, which is now an alias of @ref{2c2,,OSError}.


@menu
* Functions: Functions<14>. 
* Constants: Constants<11>. 
* Registry Handle Objects:: 

@end menu

@node Functions<14>,Constants<11>,,winreg — Windows registry access
@anchor{library/winreg functions}@anchor{50b8}@anchor{library/winreg id1}@anchor{50b9}
@subsubsection Functions


This module offers the following functions:

@geindex CloseKey() (in module winreg)
@anchor{library/winreg winreg CloseKey}@anchor{50ba}
@deffn {Function} winreg.CloseKey (hkey)

Closes a previously opened registry key.  The `hkey' argument specifies a
previously opened key.

@cartouche
@quotation Note 
If `hkey' is not closed using this method (or via @ref{50bb,,hkey.Close()}), it is closed when the `hkey' object is destroyed by
Python.
@end quotation
@end cartouche
@end deffn

@geindex ConnectRegistry() (in module winreg)
@anchor{library/winreg winreg ConnectRegistry}@anchor{4ac4}
@deffn {Function} winreg.ConnectRegistry (computer_name, key)

Establishes a connection to a predefined registry handle on another computer,
and returns a @ref{50b6,,handle object}.

`computer_name' is the name of the remote computer, of the form
@code{r"\\computername"}.  If @code{None}, the local computer is used.

`key' is the predefined handle to connect to.

The return value is the handle of the opened key. If the function fails, an
@ref{2c2,,OSError} exception is raised.

Raises an @ref{1cb1,,auditing event} @code{winreg.ConnectRegistry} with arguments @code{computer_name}, @code{key}.


Changed in version 3.3: See @ref{50b7,,above}.

@end deffn

@geindex CreateKey() (in module winreg)
@anchor{library/winreg winreg CreateKey}@anchor{4ac5}
@deffn {Function} winreg.CreateKey (key, sub_key)

Creates or opens the specified key, returning a
@ref{50b6,,handle object}.

`key' is an already open key, or one of the predefined
@ref{50bc,,HKEY_* constants}.

`sub_key' is a string that names the key this method opens or creates.

If `key' is one of the predefined keys, `sub_key' may be @code{None}. In that
case, the handle returned is the same key handle passed in to the function.

If the key already exists, this function opens the existing key.

The return value is the handle of the opened key. If the function fails, an
@ref{2c2,,OSError} exception is raised.

Raises an @ref{1cb1,,auditing event} @code{winreg.CreateKey} with arguments @code{key}, @code{sub_key}, @code{access}.

Raises an @ref{1cb1,,auditing event} @code{winreg.OpenKey/result} with argument @code{key}.


Changed in version 3.3: See @ref{50b7,,above}.

@end deffn

@geindex CreateKeyEx() (in module winreg)
@anchor{library/winreg winreg CreateKeyEx}@anchor{156e}
@deffn {Function} winreg.CreateKeyEx (key, sub_key, reserved=0, access=KEY_WRITE)

Creates or opens the specified key, returning a
@ref{50b6,,handle object}.

`key' is an already open key, or one of the predefined
@ref{50bc,,HKEY_* constants}.

`sub_key' is a string that names the key this method opens or creates.

`reserved' is a reserved integer, and must be zero. The default is zero.

`access' is an integer that specifies an access mask that describes the desired
security access for the key.  Default is @ref{50bd,,KEY_WRITE}.  See
@ref{50be,,Access Rights} for other allowed values.

If `key' is one of the predefined keys, `sub_key' may be @code{None}. In that
case, the handle returned is the same key handle passed in to the function.

If the key already exists, this function opens the existing key.

The return value is the handle of the opened key. If the function fails, an
@ref{2c2,,OSError} exception is raised.

Raises an @ref{1cb1,,auditing event} @code{winreg.CreateKey} with arguments @code{key}, @code{sub_key}, @code{access}.

Raises an @ref{1cb1,,auditing event} @code{winreg.OpenKey/result} with argument @code{key}.


Added in version 3.2.



Changed in version 3.3: See @ref{50b7,,above}.

@end deffn

@geindex DeleteKey() (in module winreg)
@anchor{library/winreg winreg DeleteKey}@anchor{4ac6}
@deffn {Function} winreg.DeleteKey (key, sub_key)

Deletes the specified key.

`key' is an already open key, or one of the predefined
@ref{50bc,,HKEY_* constants}.

`sub_key' is a string that must be a subkey of the key identified by the `key'
parameter.  This value must not be @code{None}, and the key may not have subkeys.

`This method can not delete keys with subkeys.'

If the method succeeds, the entire key, including all of its values, is removed.
If the method fails, an @ref{2c2,,OSError} exception is raised.

Raises an @ref{1cb1,,auditing event} @code{winreg.DeleteKey} with arguments @code{key}, @code{sub_key}, @code{access}.


Changed in version 3.3: See @ref{50b7,,above}.

@end deffn

@geindex DeleteKeyEx() (in module winreg)
@anchor{library/winreg winreg DeleteKeyEx}@anchor{156f}
@deffn {Function} winreg.DeleteKeyEx (key, sub_key, access=KEY_WOW64_64KEY, reserved=0)

Deletes the specified key.

`key' is an already open key, or one of the predefined
@ref{50bc,,HKEY_* constants}.

`sub_key' is a string that must be a subkey of the key identified by the
`key' parameter. This value must not be @code{None}, and the key may not have
subkeys.

`reserved' is a reserved integer, and must be zero. The default is zero.

`access' is an integer that specifies an access mask that describes the
desired security access for the key.  Default is @ref{50bf,,KEY_WOW64_64KEY}.
On 32-bit Windows, the WOW64 constants are ignored.
See @ref{50be,,Access Rights} for other allowed values.

`This method can not delete keys with subkeys.'

If the method succeeds, the entire key, including all of its values, is
removed. If the method fails, an @ref{2c2,,OSError} exception is raised.

On unsupported Windows versions, @ref{369,,NotImplementedError} is raised.

Raises an @ref{1cb1,,auditing event} @code{winreg.DeleteKey} with arguments @code{key}, @code{sub_key}, @code{access}.


Added in version 3.2.



Changed in version 3.3: See @ref{50b7,,above}.

@end deffn

@geindex DeleteValue() (in module winreg)
@anchor{library/winreg winreg DeleteValue}@anchor{4ac7}
@deffn {Function} winreg.DeleteValue (key, value)

Removes a named value from a registry key.

`key' is an already open key, or one of the predefined
@ref{50bc,,HKEY_* constants}.

`value' is a string that identifies the value to remove.

Raises an @ref{1cb1,,auditing event} @code{winreg.DeleteValue} with arguments @code{key}, @code{value}.
@end deffn

@geindex EnumKey() (in module winreg)
@anchor{library/winreg winreg EnumKey}@anchor{4ac8}
@deffn {Function} winreg.EnumKey (key, index)

Enumerates subkeys of an open registry key, returning a string.

`key' is an already open key, or one of the predefined
@ref{50bc,,HKEY_* constants}.

`index' is an integer that identifies the index of the key to retrieve.

The function retrieves the name of one subkey each time it is called.  It is
typically called repeatedly until an @ref{2c2,,OSError} exception is
raised, indicating, no more values are available.

Raises an @ref{1cb1,,auditing event} @code{winreg.EnumKey} with arguments @code{key}, @code{index}.


Changed in version 3.3: See @ref{50b7,,above}.

@end deffn

@geindex EnumValue() (in module winreg)
@anchor{library/winreg winreg EnumValue}@anchor{4ac9}
@deffn {Function} winreg.EnumValue (key, index)

Enumerates values of an open registry key, returning a tuple.

`key' is an already open key, or one of the predefined
@ref{50bc,,HKEY_* constants}.

`index' is an integer that identifies the index of the value to retrieve.

The function retrieves the name of one subkey each time it is called. It is
typically called repeatedly, until an @ref{2c2,,OSError} exception is
raised, indicating no more values.

The result is a tuple of 3 items:


@multitable {xxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Index

@tab

Meaning

@item

@code{0}

@tab

A string that identifies the value name

@item

@code{1}

@tab

An object that holds the value data, and
whose type depends on the underlying
registry type

@item

@code{2}

@tab

An integer that identifies the type of the
value data (see table in docs for
@ref{1b47,,SetValueEx()})

@end multitable


Raises an @ref{1cb1,,auditing event} @code{winreg.EnumValue} with arguments @code{key}, @code{index}.


Changed in version 3.3: See @ref{50b7,,above}.

@end deffn

@geindex % (percent); environment variables expansion (Windows)

@geindex ExpandEnvironmentStrings() (in module winreg)
@anchor{library/winreg winreg ExpandEnvironmentStrings}@anchor{1604}
@deffn {Function} winreg.ExpandEnvironmentStrings (str)

Expands environment variable placeholders @code{%NAME%} in strings like
@ref{50c0,,REG_EXPAND_SZ}:

@example
>>> ExpandEnvironmentStrings('%windir%')
'C:\\Windows'
@end example

Raises an @ref{1cb1,,auditing event} @code{winreg.ExpandEnvironmentStrings} with argument @code{str}.
@end deffn

@geindex FlushKey() (in module winreg)
@anchor{library/winreg winreg FlushKey}@anchor{50c1}
@deffn {Function} winreg.FlushKey (key)

Writes all the attributes of a key to the registry.

`key' is an already open key, or one of the predefined
@ref{50bc,,HKEY_* constants}.

It is not necessary to call @code{FlushKey()} to change a key. Registry changes are
flushed to disk by the registry using its lazy flusher.  Registry changes are
also flushed to disk at system shutdown.  Unlike @ref{50ba,,CloseKey()}, the
@code{FlushKey()} method returns only when all the data has been written to the
registry. An application should only call @code{FlushKey()} if it requires
absolute certainty that registry changes are on disk.

@cartouche
@quotation Note 
If you don’t know whether a @code{FlushKey()} call is required, it probably
isn’t.
@end quotation
@end cartouche
@end deffn

@geindex LoadKey() (in module winreg)
@anchor{library/winreg winreg LoadKey}@anchor{4aca}
@deffn {Function} winreg.LoadKey (key, sub_key, file_name)

Creates a subkey under the specified key and stores registration information
from a specified file into that subkey.

`key' is a handle returned by @ref{4ac4,,ConnectRegistry()} or one of the constants
@ref{50c2,,HKEY_USERS} or @ref{50c3,,HKEY_LOCAL_MACHINE}.

`sub_key' is a string that identifies the subkey to load.

`file_name' is the name of the file to load registry data from. This file must
have been created with the @ref{4acf,,SaveKey()} function. Under the file allocation
table (FAT) file system, the filename may not have an extension.

A call to @code{LoadKey()} fails if the calling process does not have the
@code{SE_RESTORE_PRIVILEGE} privilege.  Note that privileges are different
from permissions – see the RegLoadKey documentation@footnote{https://msdn.microsoft.com/en-us/library/ms724889%28v=VS.85%29.aspx} for
more details.

If `key' is a handle returned by @ref{4ac4,,ConnectRegistry()}, then the path
specified in `file_name' is relative to the remote computer.

Raises an @ref{1cb1,,auditing event} @code{winreg.LoadKey} with arguments @code{key}, @code{sub_key}, @code{file_name}.
@end deffn

@geindex OpenKey() (in module winreg)
@geindex OpenKeyEx() (in module winreg)
@anchor{library/winreg winreg OpenKey}@anchor{4acb}
@deffn {Function} winreg.OpenKey (key, sub_key, reserved=0, access=KEY_READ)
@anchor{library/winreg winreg OpenKeyEx}@anchor{50c4}
@deffnx {Function} winreg.OpenKeyEx (key, sub_key, reserved=0, access=KEY_READ)

Opens the specified key, returning a @ref{50b6,,handle object}.

`key' is an already open key, or one of the predefined
@ref{50bc,,HKEY_* constants}.

`sub_key' is a string that identifies the sub_key to open.

`reserved' is a reserved integer, and must be zero.  The default is zero.

`access' is an integer that specifies an access mask that describes the desired
security access for the key.  Default is @ref{50c5,,KEY_READ}.  See @ref{50be,,Access Rights} for other allowed values.

The result is a new handle to the specified key.

If the function fails, @ref{2c2,,OSError} is raised.

Raises an @ref{1cb1,,auditing event} @code{winreg.OpenKey} with arguments @code{key}, @code{sub_key}, @code{access}.

Raises an @ref{1cb1,,auditing event} @code{winreg.OpenKey/result} with argument @code{key}.


Changed in version 3.2: Allow the use of named arguments.



Changed in version 3.3: See @ref{50b7,,above}.

@end deffn

@geindex QueryInfoKey() (in module winreg)
@anchor{library/winreg winreg QueryInfoKey}@anchor{4acd}
@deffn {Function} winreg.QueryInfoKey (key)

Returns information about a key, as a tuple.

`key' is an already open key, or one of the predefined
@ref{50bc,,HKEY_* constants}.

The result is a tuple of 3 items:


@multitable {xxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Index

@tab

Meaning

@item

@code{0}

@tab

An integer giving the number of sub keys
this key has.

@item

@code{1}

@tab

An integer giving the number of values this
key has.

@item

@code{2}

@tab

An integer giving when the key was last
modified (if available) as 100’s of
nanoseconds since Jan 1, 1601.

@end multitable


Raises an @ref{1cb1,,auditing event} @code{winreg.QueryInfoKey} with argument @code{key}.
@end deffn

@geindex QueryValue() (in module winreg)
@anchor{library/winreg winreg QueryValue}@anchor{4ace}
@deffn {Function} winreg.QueryValue (key, sub_key)

Retrieves the unnamed value for a key, as a string.

`key' is an already open key, or one of the predefined
@ref{50bc,,HKEY_* constants}.

`sub_key' is a string that holds the name of the subkey with which the value is
associated.  If this parameter is @code{None} or empty, the function retrieves the
value set by the @ref{4ad0,,SetValue()} method for the key identified by `key'.

Values in the registry have name, type, and data components. This method
retrieves the data for a key’s first value that has a @code{NULL} name. But the
underlying API call doesn’t return the type, so always use
@ref{17d5,,QueryValueEx()} if possible.

Raises an @ref{1cb1,,auditing event} @code{winreg.QueryValue} with arguments @code{key}, @code{sub_key}, @code{value_name}.
@end deffn

@geindex QueryValueEx() (in module winreg)
@anchor{library/winreg winreg QueryValueEx}@anchor{17d5}
@deffn {Function} winreg.QueryValueEx (key, value_name)

Retrieves the type and data for a specified value name associated with
an open registry key.

`key' is an already open key, or one of the predefined
@ref{50bc,,HKEY_* constants}.

`value_name' is a string indicating the value to query.

The result is a tuple of 2 items:


@multitable {xxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Index

@tab

Meaning

@item

@code{0}

@tab

The value of the registry item.

@item

@code{1}

@tab

An integer giving the registry type for
this value (see table in docs for
@ref{1b47,,SetValueEx()})

@end multitable


Raises an @ref{1cb1,,auditing event} @code{winreg.QueryValue} with arguments @code{key}, @code{sub_key}, @code{value_name}.
@end deffn

@geindex SaveKey() (in module winreg)
@anchor{library/winreg winreg SaveKey}@anchor{4acf}
@deffn {Function} winreg.SaveKey (key, file_name)

Saves the specified key, and all its subkeys to the specified file.

`key' is an already open key, or one of the predefined
@ref{50bc,,HKEY_* constants}.

`file_name' is the name of the file to save registry data to.  This file
cannot already exist. If this filename includes an extension, it cannot be
used on file allocation table (FAT) file systems by the @ref{4aca,,LoadKey()}
method.

If `key' represents a key on a remote computer, the path described by
`file_name' is relative to the remote computer. The caller of this method must
possess the `SeBackupPrivilege' security privilege.  Note that
privileges are different than permissions – see the
Conflicts Between User Rights and Permissions documentation@footnote{https://msdn.microsoft.com/en-us/library/ms724878%28v=VS.85%29.aspx}
for more details.

This function passes @code{NULL} for `security_attributes' to the API.

Raises an @ref{1cb1,,auditing event} @code{winreg.SaveKey} with arguments @code{key}, @code{file_name}.
@end deffn

@geindex SetValue() (in module winreg)
@anchor{library/winreg winreg SetValue}@anchor{4ad0}
@deffn {Function} winreg.SetValue (key, sub_key, type, value)

Associates a value with a specified key.

`key' is an already open key, or one of the predefined
@ref{50bc,,HKEY_* constants}.

`sub_key' is a string that names the subkey with which the value is associated.

`type' is an integer that specifies the type of the data. Currently this must be
@ref{50c6,,REG_SZ}, meaning only strings are supported.  Use the @ref{1b47,,SetValueEx()}
function for support for other data types.

`value' is a string that specifies the new value.

If the key specified by the `sub_key' parameter does not exist, the SetValue
function creates it.

Value lengths are limited by available memory. Long values (more than 2048
bytes) should be stored as files with the filenames stored in the configuration
registry.  This helps the registry perform efficiently.

The key identified by the `key' parameter must have been opened with
@ref{50c7,,KEY_SET_VALUE} access.

Raises an @ref{1cb1,,auditing event} @code{winreg.SetValue} with arguments @code{key}, @code{sub_key}, @code{type}, @code{value}.
@end deffn

@geindex SetValueEx() (in module winreg)
@anchor{library/winreg winreg SetValueEx}@anchor{1b47}
@deffn {Function} winreg.SetValueEx (key, value_name, reserved, type, value)

Stores data in the value field of an open registry key.

`key' is an already open key, or one of the predefined
@ref{50bc,,HKEY_* constants}.

`value_name' is a string that names the subkey with which the value is
associated.

`reserved' can be anything – zero is always passed to the API.

`type' is an integer that specifies the type of the data. See
@ref{50c8,,Value Types} for the available types.

`value' is a string that specifies the new value.

This method can also set additional value and type information for the specified
key.  The key identified by the key parameter must have been opened with
@ref{50c7,,KEY_SET_VALUE} access.

To open the key, use the @ref{4ac5,,CreateKey()} or @ref{4acb,,OpenKey()} methods.

Value lengths are limited by available memory. Long values (more than 2048
bytes) should be stored as files with the filenames stored in the configuration
registry.  This helps the registry perform efficiently.

Raises an @ref{1cb1,,auditing event} @code{winreg.SetValue} with arguments @code{key}, @code{sub_key}, @code{type}, @code{value}.
@end deffn

@geindex DisableReflectionKey() (in module winreg)
@anchor{library/winreg winreg DisableReflectionKey}@anchor{1570}
@deffn {Function} winreg.DisableReflectionKey (key)

Disables registry reflection for 32-bit processes running on a 64-bit
operating system.

`key' is an already open key, or one of the predefined @ref{50bc,,HKEY_* constants}.

Will generally raise @ref{369,,NotImplementedError} if executed on a 32-bit operating
system.

If the key is not on the reflection list, the function succeeds but has no
effect.  Disabling reflection for a key does not affect reflection of any
subkeys.

Raises an @ref{1cb1,,auditing event} @code{winreg.DisableReflectionKey} with argument @code{key}.
@end deffn

@geindex EnableReflectionKey() (in module winreg)
@anchor{library/winreg winreg EnableReflectionKey}@anchor{1571}
@deffn {Function} winreg.EnableReflectionKey (key)

Restores registry reflection for the specified disabled key.

`key' is an already open key, or one of the predefined @ref{50bc,,HKEY_* constants}.

Will generally raise @ref{369,,NotImplementedError} if executed on a 32-bit operating
system.

Restoring reflection for a key does not affect reflection of any subkeys.

Raises an @ref{1cb1,,auditing event} @code{winreg.EnableReflectionKey} with argument @code{key}.
@end deffn

@geindex QueryReflectionKey() (in module winreg)
@anchor{library/winreg winreg QueryReflectionKey}@anchor{1572}
@deffn {Function} winreg.QueryReflectionKey (key)

Determines the reflection state for the specified key.

`key' is an already open key, or one of the predefined
@ref{50bc,,HKEY_* constants}.

Returns @code{True} if reflection is disabled.

Will generally raise @ref{369,,NotImplementedError} if executed on a 32-bit
operating system.

Raises an @ref{1cb1,,auditing event} @code{winreg.QueryReflectionKey} with argument @code{key}.
@end deffn

@node Constants<11>,Registry Handle Objects,Functions<14>,winreg — Windows registry access
@anchor{library/winreg constants}@anchor{50c9}@anchor{library/winreg id2}@anchor{50ca}
@subsubsection Constants


The following constants are defined for use in many @code{winreg} functions.

@menu
* HKEY_* Constants:: 
* Access Rights:: 
* Value Types:: 

@end menu

@node HKEY_* Constants,Access Rights,,Constants<11>
@anchor{library/winreg hkey-constants}@anchor{50bc}@anchor{library/winreg id3}@anchor{50cb}
@subsubsection HKEY_* Constants


@geindex HKEY_CLASSES_ROOT (in module winreg)
@anchor{library/winreg winreg HKEY_CLASSES_ROOT}@anchor{50cc}
@deffn {Data} winreg.HKEY_CLASSES_ROOT

Registry entries subordinate to this key define types (or classes) of
documents and the properties associated with those types. Shell and
COM applications use the information stored under this key.
@end deffn

@geindex HKEY_CURRENT_USER (in module winreg)
@anchor{library/winreg winreg HKEY_CURRENT_USER}@anchor{50cd}
@deffn {Data} winreg.HKEY_CURRENT_USER

Registry entries subordinate to this key define the preferences of
the current user. These preferences include the settings of
environment variables, data about program groups, colors, printers,
network connections, and application preferences.
@end deffn

@geindex HKEY_LOCAL_MACHINE (in module winreg)
@anchor{library/winreg winreg HKEY_LOCAL_MACHINE}@anchor{50c3}
@deffn {Data} winreg.HKEY_LOCAL_MACHINE

Registry entries subordinate to this key define the physical state
of the computer, including data about the bus type, system memory,
and installed hardware and software.
@end deffn

@geindex HKEY_USERS (in module winreg)
@anchor{library/winreg winreg HKEY_USERS}@anchor{50c2}
@deffn {Data} winreg.HKEY_USERS

Registry entries subordinate to this key define the default user
configuration for new users on the local computer and the user
configuration for the current user.
@end deffn

@geindex HKEY_PERFORMANCE_DATA (in module winreg)
@anchor{library/winreg winreg HKEY_PERFORMANCE_DATA}@anchor{50ce}
@deffn {Data} winreg.HKEY_PERFORMANCE_DATA

Registry entries subordinate to this key allow you to access
performance data. The data is not actually stored in the registry;
the registry functions cause the system to collect the data from
its source.
@end deffn

@geindex HKEY_CURRENT_CONFIG (in module winreg)
@anchor{library/winreg winreg HKEY_CURRENT_CONFIG}@anchor{50cf}
@deffn {Data} winreg.HKEY_CURRENT_CONFIG

Contains information about the current hardware profile of the
local computer system.
@end deffn

@geindex HKEY_DYN_DATA (in module winreg)
@anchor{library/winreg winreg HKEY_DYN_DATA}@anchor{50d0}
@deffn {Data} winreg.HKEY_DYN_DATA

This key is not used in versions of Windows after 98.
@end deffn

@node Access Rights,Value Types,HKEY_* Constants,Constants<11>
@anchor{library/winreg access-rights}@anchor{50be}@anchor{library/winreg id4}@anchor{50d1}
@subsubsection Access Rights


For more information, see Registry Key Security and Access@footnote{https://msdn.microsoft.com/en-us/library/ms724878%28v=VS.85%29.aspx}.

@geindex KEY_ALL_ACCESS (in module winreg)
@anchor{library/winreg winreg KEY_ALL_ACCESS}@anchor{50d2}
@deffn {Data} winreg.KEY_ALL_ACCESS

Combines the STANDARD_RIGHTS_REQUIRED, @ref{50d3,,KEY_QUERY_VALUE},
@ref{50c7,,KEY_SET_VALUE}, @ref{50d4,,KEY_CREATE_SUB_KEY},
@ref{50d5,,KEY_ENUMERATE_SUB_KEYS}, @ref{50d6,,KEY_NOTIFY},
and @ref{50d7,,KEY_CREATE_LINK} access rights.
@end deffn

@geindex KEY_WRITE (in module winreg)
@anchor{library/winreg winreg KEY_WRITE}@anchor{50bd}
@deffn {Data} winreg.KEY_WRITE

Combines the STANDARD_RIGHTS_WRITE, @ref{50c7,,KEY_SET_VALUE}, and
@ref{50d4,,KEY_CREATE_SUB_KEY} access rights.
@end deffn

@geindex KEY_READ (in module winreg)
@anchor{library/winreg winreg KEY_READ}@anchor{50c5}
@deffn {Data} winreg.KEY_READ

Combines the STANDARD_RIGHTS_READ, @ref{50d3,,KEY_QUERY_VALUE},
@ref{50d5,,KEY_ENUMERATE_SUB_KEYS}, and @ref{50d6,,KEY_NOTIFY} values.
@end deffn

@geindex KEY_EXECUTE (in module winreg)
@anchor{library/winreg winreg KEY_EXECUTE}@anchor{50d8}
@deffn {Data} winreg.KEY_EXECUTE

Equivalent to @ref{50c5,,KEY_READ}.
@end deffn

@geindex KEY_QUERY_VALUE (in module winreg)
@anchor{library/winreg winreg KEY_QUERY_VALUE}@anchor{50d3}
@deffn {Data} winreg.KEY_QUERY_VALUE

Required to query the values of a registry key.
@end deffn

@geindex KEY_SET_VALUE (in module winreg)
@anchor{library/winreg winreg KEY_SET_VALUE}@anchor{50c7}
@deffn {Data} winreg.KEY_SET_VALUE

Required to create, delete, or set a registry value.
@end deffn

@geindex KEY_CREATE_SUB_KEY (in module winreg)
@anchor{library/winreg winreg KEY_CREATE_SUB_KEY}@anchor{50d4}
@deffn {Data} winreg.KEY_CREATE_SUB_KEY

Required to create a subkey of a registry key.
@end deffn

@geindex KEY_ENUMERATE_SUB_KEYS (in module winreg)
@anchor{library/winreg winreg KEY_ENUMERATE_SUB_KEYS}@anchor{50d5}
@deffn {Data} winreg.KEY_ENUMERATE_SUB_KEYS

Required to enumerate the subkeys of a registry key.
@end deffn

@geindex KEY_NOTIFY (in module winreg)
@anchor{library/winreg winreg KEY_NOTIFY}@anchor{50d6}
@deffn {Data} winreg.KEY_NOTIFY

Required to request change notifications for a registry key or for
subkeys of a registry key.
@end deffn

@geindex KEY_CREATE_LINK (in module winreg)
@anchor{library/winreg winreg KEY_CREATE_LINK}@anchor{50d7}
@deffn {Data} winreg.KEY_CREATE_LINK

Reserved for system use.
@end deffn

@menu
* 64-bit Specific:: 

@end menu

@node 64-bit Specific,,,Access Rights
@anchor{library/winreg bit-access-rights}@anchor{50d9}@anchor{library/winreg bit-specific}@anchor{50da}
@subsubsection 64-bit Specific


For more information, see Accessing an Alternate Registry View@footnote{https://msdn.microsoft.com/en-us/library/aa384129(v=VS.85).aspx}.

@geindex KEY_WOW64_64KEY (in module winreg)
@anchor{library/winreg winreg KEY_WOW64_64KEY}@anchor{50bf}
@deffn {Data} winreg.KEY_WOW64_64KEY

Indicates that an application on 64-bit Windows should operate on
the 64-bit registry view. On 32-bit Windows, this constant is ignored.
@end deffn

@geindex KEY_WOW64_32KEY (in module winreg)
@anchor{library/winreg winreg KEY_WOW64_32KEY}@anchor{50db}
@deffn {Data} winreg.KEY_WOW64_32KEY

Indicates that an application on 64-bit Windows should operate on
the 32-bit registry view. On 32-bit Windows, this constant is ignored.
@end deffn

@node Value Types,,Access Rights,Constants<11>
@anchor{library/winreg id5}@anchor{50dc}@anchor{library/winreg value-types}@anchor{50c8}
@subsubsection Value Types


For more information, see Registry Value Types@footnote{https://msdn.microsoft.com/en-us/library/ms724884%28v=VS.85%29.aspx}.

@geindex REG_BINARY (in module winreg)
@anchor{library/winreg winreg REG_BINARY}@anchor{50dd}
@deffn {Data} winreg.REG_BINARY

Binary data in any form.
@end deffn

@geindex REG_DWORD (in module winreg)
@anchor{library/winreg winreg REG_DWORD}@anchor{50de}
@deffn {Data} winreg.REG_DWORD

32-bit number.
@end deffn

@geindex REG_DWORD_LITTLE_ENDIAN (in module winreg)
@anchor{library/winreg winreg REG_DWORD_LITTLE_ENDIAN}@anchor{50df}
@deffn {Data} winreg.REG_DWORD_LITTLE_ENDIAN

A 32-bit number in little-endian format. Equivalent to @ref{50de,,REG_DWORD}.
@end deffn

@geindex REG_DWORD_BIG_ENDIAN (in module winreg)
@anchor{library/winreg winreg REG_DWORD_BIG_ENDIAN}@anchor{50e0}
@deffn {Data} winreg.REG_DWORD_BIG_ENDIAN

A 32-bit number in big-endian format.
@end deffn

@geindex REG_EXPAND_SZ (in module winreg)
@anchor{library/winreg winreg REG_EXPAND_SZ}@anchor{50c0}
@deffn {Data} winreg.REG_EXPAND_SZ

Null-terminated string containing references to environment
variables (@code{%PATH%}).
@end deffn

@geindex REG_LINK (in module winreg)
@anchor{library/winreg winreg REG_LINK}@anchor{50e1}
@deffn {Data} winreg.REG_LINK

A Unicode symbolic link.
@end deffn

@geindex REG_MULTI_SZ (in module winreg)
@anchor{library/winreg winreg REG_MULTI_SZ}@anchor{1e05}
@deffn {Data} winreg.REG_MULTI_SZ

A sequence of null-terminated strings, terminated by two null characters.
(Python handles this termination automatically.)
@end deffn

@geindex REG_NONE (in module winreg)
@anchor{library/winreg winreg REG_NONE}@anchor{50e2}
@deffn {Data} winreg.REG_NONE

No defined value type.
@end deffn

@geindex REG_QWORD (in module winreg)
@anchor{library/winreg winreg REG_QWORD}@anchor{f05}
@deffn {Data} winreg.REG_QWORD

A 64-bit number.


Added in version 3.6.

@end deffn

@geindex REG_QWORD_LITTLE_ENDIAN (in module winreg)
@anchor{library/winreg winreg REG_QWORD_LITTLE_ENDIAN}@anchor{50e3}
@deffn {Data} winreg.REG_QWORD_LITTLE_ENDIAN

A 64-bit number in little-endian format. Equivalent to @ref{f05,,REG_QWORD}.


Added in version 3.6.

@end deffn

@geindex REG_RESOURCE_LIST (in module winreg)
@anchor{library/winreg winreg REG_RESOURCE_LIST}@anchor{50e4}
@deffn {Data} winreg.REG_RESOURCE_LIST

A device-driver resource list.
@end deffn

@geindex REG_FULL_RESOURCE_DESCRIPTOR (in module winreg)
@anchor{library/winreg winreg REG_FULL_RESOURCE_DESCRIPTOR}@anchor{50e5}
@deffn {Data} winreg.REG_FULL_RESOURCE_DESCRIPTOR

A hardware setting.
@end deffn

@geindex REG_RESOURCE_REQUIREMENTS_LIST (in module winreg)
@anchor{library/winreg winreg REG_RESOURCE_REQUIREMENTS_LIST}@anchor{50e6}
@deffn {Data} winreg.REG_RESOURCE_REQUIREMENTS_LIST

A hardware resource list.
@end deffn

@geindex REG_SZ (in module winreg)
@anchor{library/winreg winreg REG_SZ}@anchor{50c6}
@deffn {Data} winreg.REG_SZ

A null-terminated string.
@end deffn

@node Registry Handle Objects,,Constants<11>,winreg — Windows registry access
@anchor{library/winreg handle-object}@anchor{50b6}@anchor{library/winreg registry-handle-objects}@anchor{50e7}
@subsubsection Registry Handle Objects


This object wraps a Windows HKEY object, automatically closing it when the
object is destroyed.  To guarantee cleanup, you can call either the
@ref{50bb,,Close()} method on the object, or the @ref{50ba,,CloseKey()} function.

All registry functions in this module return one of these objects.

All registry functions in this module which accept a handle object also accept
an integer, however, use of the handle object is encouraged.

Handle objects provide semantics for @ref{14e1,,__bool__()} – thus

@example
if handle:
    print("Yes")
@end example

will print @code{Yes} if the handle is currently valid (has not been closed or
detached).

Handle objects can be converted to an integer (e.g., using the built-in
@ref{19c,,int()} function), in which case the underlying Windows handle value is
returned.  You can also use the @ref{4acc,,Detach()} method to return the
integer handle, and also disconnect the Windows handle from the handle object.

@geindex Close() (winreg.PyHKEY method)
@anchor{library/winreg winreg PyHKEY Close}@anchor{50bb}
@deffn {Method} PyHKEY.Close ()

Closes the underlying Windows handle.

If the handle is already closed, no error is raised.
@end deffn

@geindex Detach() (winreg.PyHKEY method)
@anchor{library/winreg winreg PyHKEY Detach}@anchor{4acc}
@deffn {Method} PyHKEY.Detach ()

Detaches the Windows handle from the handle object.

The result is an integer that holds the value of the handle before it is
detached.  If the handle is already detached or closed, this will return
zero.

After calling this function, the handle is effectively invalidated, but the
handle is not closed.  You would call this function when you need the
underlying Win32 handle to exist beyond the lifetime of the handle object.

Raises an @ref{1cb1,,auditing event} @code{winreg.PyHKEY.Detach} with argument @code{key}.
@end deffn

@geindex __enter__() (winreg.PyHKEY method)
@geindex __exit__() (winreg.PyHKEY method)
@anchor{library/winreg winreg PyHKEY __enter__}@anchor{50e8}
@deffn {Method} PyHKEY.__enter__ ()
@anchor{library/winreg winreg PyHKEY __exit__}@anchor{50e9}
@deffnx {Method} PyHKEY.__exit__ (*exc_info)

The HKEY object implements @ref{7e5,,__enter__()} and
@ref{150c,,__exit__()} and thus supports the context protocol for the
@ref{187,,with} statement:

@example
with OpenKey(HKEY_LOCAL_MACHINE, "foo") as key:
    ...  # work with key
@end example

will automatically close `key' when control leaves the @ref{187,,with} block.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node winsound — Sound-playing interface for Windows,,winreg — Windows registry access,MS Windows Specific Services
@anchor{library/winsound doc}@anchor{50ea}@anchor{library/winsound module-winsound}@anchor{11e}@anchor{library/winsound translation-repo}@anchor{50eb}@anchor{library/winsound winsound-sound-playing-interface-for-windows}@anchor{50ec}
@subsection @code{winsound} — Sound-playing interface for Windows


@geindex module; winsound


__________________________________________________________________


The @code{winsound} module provides access to the basic sound-playing machinery
provided by Windows platforms.  It includes functions and several constants.

@ref{2181,,Availability}: Windows.

@geindex Beep() (in module winsound)
@anchor{library/winsound winsound Beep}@anchor{f07}
@deffn {Function} winsound.Beep (frequency, duration)

Beep the PC’s speaker. The `frequency' parameter specifies frequency, in hertz,
of the sound, and must be in the range 37 through 32,767. The `duration'
parameter specifies the number of milliseconds the sound should last.  If the
system is not able to beep the speaker, @ref{246,,RuntimeError} is raised.
@end deffn

@geindex PlaySound() (in module winsound)
@anchor{library/winsound winsound PlaySound}@anchor{f09}
@deffn {Function} winsound.PlaySound (sound, flags)

Call the underlying @code{PlaySound()} function from the Platform API.  The
`sound' parameter may be a filename, a system sound alias, audio data as a
@ref{194,,bytes-like object}, or @code{None}.  Its
interpretation depends on the value of `flags', which can be a bitwise ORed
combination of the constants described below. If the `sound' parameter is
@code{None}, any currently playing waveform sound is stopped. If the system
indicates an error, @ref{246,,RuntimeError} is raised.
@end deffn

@geindex MessageBeep() (in module winsound)
@anchor{library/winsound winsound MessageBeep}@anchor{f08}
@deffn {Function} winsound.MessageBeep (type=MB_OK)

Call the underlying @code{MessageBeep()} function from the Platform API.  This
plays a sound as specified in the registry.  The `type' argument specifies which
sound to play; possible values are @code{-1}, @code{MB_ICONASTERISK},
@code{MB_ICONEXCLAMATION}, @code{MB_ICONHAND}, @code{MB_ICONQUESTION}, and @code{MB_OK}, all
described below.  The value @code{-1} produces a “simple beep”; this is the final
fallback if a sound cannot be played otherwise.  If the system indicates an
error, @ref{246,,RuntimeError} is raised.
@end deffn

@geindex SND_FILENAME (in module winsound)
@anchor{library/winsound winsound SND_FILENAME}@anchor{50ed}
@deffn {Data} winsound.SND_FILENAME

The `sound' parameter is the name of a WAV file. Do not use with
@ref{50ee,,SND_ALIAS}.
@end deffn

@geindex SND_ALIAS (in module winsound)
@anchor{library/winsound winsound SND_ALIAS}@anchor{50ee}
@deffn {Data} winsound.SND_ALIAS

The `sound' parameter is a sound association name from the registry.  If the
registry contains no such name, play the system default sound unless
@ref{50ef,,SND_NODEFAULT} is also specified. If no default sound is registered,
raise @ref{246,,RuntimeError}. Do not use with @ref{50ed,,SND_FILENAME}.

All Win32 systems support at least the following; most systems support many
more:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

@ref{f09,,PlaySound()} `name'

@tab

Corresponding Control Panel Sound name

@item

@code{'SystemAsterisk'}

@tab

Asterisk

@item

@code{'SystemExclamation'}

@tab

Exclamation

@item

@code{'SystemExit'}

@tab

Exit Windows

@item

@code{'SystemHand'}

@tab

Critical Stop

@item

@code{'SystemQuestion'}

@tab

Question

@end multitable


For example:

@example
import winsound
# Play Windows exit sound.
winsound.PlaySound("SystemExit", winsound.SND_ALIAS)

# Probably play Windows default sound, if any is registered (because
# "*" probably isn't the registered name of any sound).
winsound.PlaySound("*", winsound.SND_ALIAS)
@end example
@end deffn

@geindex SND_LOOP (in module winsound)
@anchor{library/winsound winsound SND_LOOP}@anchor{50f0}
@deffn {Data} winsound.SND_LOOP

Play the sound repeatedly.  The @ref{50f1,,SND_ASYNC} flag must also be used to
avoid blocking.  Cannot be used with @ref{50f2,,SND_MEMORY}.
@end deffn

@geindex SND_MEMORY (in module winsound)
@anchor{library/winsound winsound SND_MEMORY}@anchor{50f2}
@deffn {Data} winsound.SND_MEMORY

The `sound' parameter to @ref{f09,,PlaySound()} is a memory image of a WAV file, as a
@ref{194,,bytes-like object}.

@cartouche
@quotation Note 
This module does not support playing from a memory image asynchronously, so a
combination of this flag and @ref{50f1,,SND_ASYNC} will raise @ref{246,,RuntimeError}.
@end quotation
@end cartouche
@end deffn

@geindex SND_PURGE (in module winsound)
@anchor{library/winsound winsound SND_PURGE}@anchor{50f3}
@deffn {Data} winsound.SND_PURGE

Stop playing all instances of the specified sound.

@cartouche
@quotation Note 
This flag is not supported on modern Windows platforms.
@end quotation
@end cartouche
@end deffn

@geindex SND_ASYNC (in module winsound)
@anchor{library/winsound winsound SND_ASYNC}@anchor{50f1}
@deffn {Data} winsound.SND_ASYNC

Return immediately, allowing sounds to play asynchronously.
@end deffn

@geindex SND_NODEFAULT (in module winsound)
@anchor{library/winsound winsound SND_NODEFAULT}@anchor{50ef}
@deffn {Data} winsound.SND_NODEFAULT

If the specified sound cannot be found, do not play the system default sound.
@end deffn

@geindex SND_NOSTOP (in module winsound)
@anchor{library/winsound winsound SND_NOSTOP}@anchor{50f4}
@deffn {Data} winsound.SND_NOSTOP

Do not interrupt sounds currently playing.
@end deffn

@geindex SND_NOWAIT (in module winsound)
@anchor{library/winsound winsound SND_NOWAIT}@anchor{50f5}
@deffn {Data} winsound.SND_NOWAIT

Return immediately if the sound driver is busy.

@cartouche
@quotation Note 
This flag is not supported on modern Windows platforms.
@end quotation
@end cartouche
@end deffn

@geindex SND_APPLICATION (in module winsound)
@anchor{library/winsound winsound SND_APPLICATION}@anchor{50f6}
@deffn {Data} winsound.SND_APPLICATION

The `sound' parameter is an application-specific alias in the registry.
This flag can be combined with the @ref{50ee,,SND_ALIAS} flag
to specify an application-defined sound alias.
@end deffn

@geindex SND_SENTRY (in module winsound)
@anchor{library/winsound winsound SND_SENTRY}@anchor{50f7}
@deffn {Data} winsound.SND_SENTRY

Triggers a SoundSentry event when the sound is played.


Added in version 3.14.

@end deffn

@geindex SND_SYNC (in module winsound)
@anchor{library/winsound winsound SND_SYNC}@anchor{50f8}
@deffn {Data} winsound.SND_SYNC

The sound is played synchronously.  This is the default behavior.


Added in version 3.14.

@end deffn

@geindex SND_SYSTEM (in module winsound)
@anchor{library/winsound winsound SND_SYSTEM}@anchor{50f9}
@deffn {Data} winsound.SND_SYSTEM

Assign the sound to the audio session for system notification sounds.


Added in version 3.14.

@end deffn

@geindex MB_ICONASTERISK (in module winsound)
@anchor{library/winsound winsound MB_ICONASTERISK}@anchor{50fa}
@deffn {Data} winsound.MB_ICONASTERISK

Play the @code{SystemDefault} sound.
@end deffn

@geindex MB_ICONEXCLAMATION (in module winsound)
@anchor{library/winsound winsound MB_ICONEXCLAMATION}@anchor{50fb}
@deffn {Data} winsound.MB_ICONEXCLAMATION

Play the @code{SystemExclamation} sound.
@end deffn

@geindex MB_ICONHAND (in module winsound)
@anchor{library/winsound winsound MB_ICONHAND}@anchor{50fc}
@deffn {Data} winsound.MB_ICONHAND

Play the @code{SystemHand} sound.
@end deffn

@geindex MB_ICONQUESTION (in module winsound)
@anchor{library/winsound winsound MB_ICONQUESTION}@anchor{50fd}
@deffn {Data} winsound.MB_ICONQUESTION

Play the @code{SystemQuestion} sound.
@end deffn

@geindex MB_OK (in module winsound)
@anchor{library/winsound winsound MB_OK}@anchor{50fe}
@deffn {Data} winsound.MB_OK

Play the @code{SystemDefault} sound.
@end deffn

@geindex MB_ICONERROR (in module winsound)
@anchor{library/winsound winsound MB_ICONERROR}@anchor{50ff}
@deffn {Data} winsound.MB_ICONERROR

Play the @code{SystemHand} sound.


Added in version 3.14.

@end deffn

@geindex MB_ICONINFORMATION (in module winsound)
@anchor{library/winsound winsound MB_ICONINFORMATION}@anchor{5100}
@deffn {Data} winsound.MB_ICONINFORMATION

Play the @code{SystemDefault} sound.


Added in version 3.14.

@end deffn

@geindex MB_ICONSTOP (in module winsound)
@anchor{library/winsound winsound MB_ICONSTOP}@anchor{5101}
@deffn {Data} winsound.MB_ICONSTOP

Play the @code{SystemHand} sound.


Added in version 3.14.

@end deffn

@geindex MB_ICONWARNING (in module winsound)
@anchor{library/winsound winsound MB_ICONWARNING}@anchor{5102}
@deffn {Data} winsound.MB_ICONWARNING

Play the @code{SystemExclamation} sound.


Added in version 3.14.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Unix-specific services,Modules command-line interface CLI,MS Windows Specific Services,The Python Standard Library
@anchor{library/unix doc}@anchor{5103}@anchor{library/unix translation-repo}@anchor{5104}@anchor{library/unix unix}@anchor{5105}@anchor{library/unix unix-specific-services}@anchor{5106}
@section Unix-specific services


The modules described in this chapter provide interfaces to features that are
unique to the Unix operating system, or in some cases to some or many variants
of it.  Here’s an overview:

@menu
* shlex — Simple lexical analysis:: 
* posix — The most common POSIX system calls:: 
* pwd — The password database:: 
* grp — The group database:: 
* termios — POSIX style tty control:: 
* tty — Terminal control functions:: 
* pty — Pseudo-terminal utilities:: 
* fcntl — The fcntl and ioctl system calls:: 
* resource — Resource usage information:: 
* syslog — Unix syslog library routines:: 

@end menu

@node shlex — Simple lexical analysis,posix — The most common POSIX system calls,,Unix-specific services
@anchor{library/shlex doc}@anchor{5107}@anchor{library/shlex module-shlex}@anchor{c9}@anchor{library/shlex shlex-simple-lexical-analysis}@anchor{5108}
@subsection @code{shlex} — Simple lexical analysis


@geindex module; shlex

`Source code:' Lib/shlex.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/shlex.py}


__________________________________________________________________


The @ref{ece,,shlex} class makes it easy to write lexical analyzers for
simple syntaxes resembling that of the Unix shell.  This will often be useful
for writing minilanguages, (for example, in run control files for Python
applications) or for parsing quoted strings.

The @code{shlex} module defines the following functions:

@geindex split() (in module shlex)
@anchor{library/shlex shlex split}@anchor{75f}
@deffn {Function} shlex.split (s, comments=False, posix=True)

Split the string `s' using shell-like syntax. If `comments' is @ref{d31,,False}
(the default), the parsing of comments in the given string will be disabled
(setting the @ref{5109,,commenters} attribute of the
@ref{ece,,shlex} instance to the empty string).  This function operates
in POSIX mode by default, but uses non-POSIX mode if the `posix' argument is
false.


Changed in version 3.12: Passing @code{None} for `s' argument now raises an exception, rather than
reading @ref{760,,sys.stdin}.

@end deffn

@geindex join() (in module shlex)
@anchor{library/shlex shlex join}@anchor{c22}
@deffn {Function} shlex.join (split_command)

Concatenate the tokens of the list `split_command' and return a string.
This function is the inverse of @ref{75f,,split()}.

@example
>>> from shlex import join
>>> print(join(['echo', '-n', 'Multiple words']))
echo -n 'Multiple words'
@end example

The returned value is shell-escaped to protect against injection
vulnerabilities (see @ref{582,,quote()}).


Added in version 3.8.

@end deffn

@geindex quote() (in module shlex)
@anchor{library/shlex shlex quote}@anchor{582}
@deffn {Function} shlex.quote (s)

Return a shell-escaped version of the string `s'.  The returned value is a
string that can safely be used as one token in a shell command line, for
cases where you cannot use a list.
@anchor{library/shlex shlex-quote-warning}@anchor{37cf}
@cartouche
@quotation Warning 
The @code{shlex} module is `only designed for Unix shells'.

The @code{quote()} function is not guaranteed to be correct on non-POSIX
compliant shells or shells from other operating systems such as Windows.
Executing commands quoted by this module on such shells can open up the
possibility of a command injection vulnerability.

Consider using functions that pass command arguments with lists such as
@ref{d85,,subprocess.run()} with @code{shell=False}.
@end quotation
@end cartouche

This idiom would be unsafe:

@example
>>> filename = 'somefile; rm -rf ~'
>>> command = 'ls -l @{@}'.format(filename)
>>> print(command)  # executed by a shell: boom!
ls -l somefile; rm -rf ~
@end example

@code{quote()} lets you plug the security hole:

@example
>>> from shlex import quote
>>> command = 'ls -l @{@}'.format(quote(filename))
>>> print(command)
ls -l 'somefile; rm -rf ~'
>>> remote_command = 'ssh home @{@}'.format(quote(command))
>>> print(remote_command)
ssh home 'ls -l '"'"'somefile; rm -rf ~'"'"'@w{'}
@end example

The quoting is compatible with UNIX shells and with @ref{75f,,split()}:

@example
>>> from shlex import split
>>> remote_command = split(remote_command)
>>> remote_command
['ssh', 'home', "ls -l 'somefile; rm -rf ~'"]
>>> command = split(remote_command[-1])
>>> command
['ls', '-l', 'somefile; rm -rf ~']
@end example


Added in version 3.3.

@end deffn

The @code{shlex} module defines the following class:

@geindex shlex (class in shlex)
@anchor{library/shlex shlex shlex}@anchor{ece}
@deffn {Class} shlex.shlex (instream=None, infile=None, posix=False, punctuation_chars=False)

A @code{shlex} instance or subclass instance is a lexical analyzer
object.  The initialization argument, if present, specifies where to read
characters from.  It must be a file-/stream-like object with
@ref{20b0,,read()} and @ref{20ea,,readline()} methods, or
a string.  If no argument is given, input will be taken from @code{sys.stdin}.
The second optional argument is a filename string, which sets the initial
value of the @ref{510a,,infile} attribute.  If the `instream'
argument is omitted or equal to @code{sys.stdin}, this second argument
defaults to “stdin”.  The `posix' argument defines the operational mode:
when `posix' is not true (default), the @code{shlex} instance will
operate in compatibility mode.  When operating in POSIX mode,
@code{shlex} will try to be as close as possible to the POSIX shell
parsing rules.  The `punctuation_chars' argument provides a way to make the
behaviour even closer to how real shells parse.  This can take a number of
values: the default value, @code{False}, preserves the behaviour seen under
Python 3.5 and earlier.  If set to @code{True}, then parsing of the characters
@code{();<>|&} is changed: any run of these characters (considered punctuation
characters) is returned as a single token.  If set to a non-empty string of
characters, those characters will be used as the punctuation characters.  Any
characters in the @ref{510b,,wordchars} attribute that appear in
`punctuation_chars' will be removed from @code{wordchars}.  See
@ref{ecf,,Improved Compatibility with Shells} for more information. `punctuation_chars'
can be set only upon @code{shlex} instance creation and can’t be
modified later.


Changed in version 3.6: The `punctuation_chars' parameter was added.

@end deffn


@subsubheading See also



@table @asis

@item Module @ref{26,,configparser}

Parser for configuration files similar to the Windows @code{.ini} files.
@end table


@menu
* shlex Objects:: 
* Parsing Rules:: 
* Improved Compatibility with Shells:: 

@end menu

@node shlex Objects,Parsing Rules,,shlex — Simple lexical analysis
@anchor{library/shlex id1}@anchor{510c}@anchor{library/shlex shlex-objects}@anchor{510d}
@subsubsection shlex Objects


A @ref{ece,,shlex} instance has the following methods:

@geindex get_token() (shlex.shlex method)
@anchor{library/shlex shlex shlex get_token}@anchor{510e}
@deffn {Method} shlex.get_token ()

Return a token.  If tokens have been stacked using @ref{510f,,push_token()}, pop a
token off the stack.  Otherwise, read one from the input stream.  If reading
encounters an immediate end-of-file, @ref{5110,,eof} is returned (the empty
string (@code{'@w{'}}) in non-POSIX mode, and @code{None} in POSIX mode).
@end deffn

@geindex push_token() (shlex.shlex method)
@anchor{library/shlex shlex shlex push_token}@anchor{510f}
@deffn {Method} shlex.push_token (str)

Push the argument onto the token stack.
@end deffn

@geindex read_token() (shlex.shlex method)
@anchor{library/shlex shlex shlex read_token}@anchor{5111}
@deffn {Method} shlex.read_token ()

Read a raw token.  Ignore the pushback stack, and do not interpret source
requests.  (This is not ordinarily a useful entry point, and is documented here
only for the sake of completeness.)
@end deffn

@geindex sourcehook() (shlex.shlex method)
@anchor{library/shlex shlex shlex sourcehook}@anchor{5112}
@deffn {Method} shlex.sourcehook (filename)

When @ref{ece,,shlex} detects a source request (see @ref{5113,,source}
below) this method is given the following token as argument, and expected
to return a tuple consisting of a filename and an open file-like object.

Normally, this method first strips any quotes off the argument.  If the result
is an absolute pathname, or there was no previous source request in effect, or
the previous source was a stream (such as @code{sys.stdin}), the result is left
alone.  Otherwise, if the result is a relative pathname, the directory part of
the name of the file immediately before it on the source inclusion stack is
prepended (this behavior is like the way the C preprocessor handles @code{#include
"file.h"}).

The result of the manipulations is treated as a filename, and returned as the
first component of the tuple, with @ref{318,,open()} called on it to yield the second
component. (Note: this is the reverse of the order of arguments in instance
initialization!)

This hook is exposed so that you can use it to implement directory search paths,
addition of file extensions, and other namespace hacks. There is no
corresponding ‘close’ hook, but a shlex instance will call the
@ref{507,,close()} method of the sourced input stream when it returns
EOF.

For more explicit control of source stacking, use the @ref{5114,,push_source()} and
@ref{5115,,pop_source()} methods.
@end deffn

@geindex push_source() (shlex.shlex method)
@anchor{library/shlex shlex shlex push_source}@anchor{5114}
@deffn {Method} shlex.push_source (newstream, newfile=None)

Push an input source stream onto the input stack.  If the filename argument is
specified it will later be available for use in error messages.  This is the
same method used internally by the @ref{5112,,sourcehook()} method.
@end deffn

@geindex pop_source() (shlex.shlex method)
@anchor{library/shlex shlex shlex pop_source}@anchor{5115}
@deffn {Method} shlex.pop_source ()

Pop the last-pushed input source from the input stack. This is the same method
used internally when the lexer reaches EOF on a stacked input stream.
@end deffn

@geindex error_leader() (shlex.shlex method)
@anchor{library/shlex shlex shlex error_leader}@anchor{5116}
@deffn {Method} shlex.error_leader (infile=None, lineno=None)

This method generates an error message leader in the format of a Unix C compiler
error label; the format is @code{'"%s", line %d: '}, where the @code{%s} is replaced
with the name of the current source file and the @code{%d} with the current input
line number (the optional arguments can be used to override these).

This convenience is provided to encourage @code{shlex} users to generate error
messages in the standard, parseable format understood by Emacs and other Unix
tools.
@end deffn

Instances of @ref{ece,,shlex} subclasses have some public instance
variables which either control lexical analysis or can be used for debugging:

@geindex commenters (shlex.shlex attribute)
@anchor{library/shlex shlex shlex commenters}@anchor{5109}
@deffn {Attribute} shlex.commenters

The string of characters that are recognized as comment beginners. All
characters from the comment beginner to end of line are ignored. Includes just
@code{'#'} by default.
@end deffn

@geindex wordchars (shlex.shlex attribute)
@anchor{library/shlex shlex shlex wordchars}@anchor{510b}
@deffn {Attribute} shlex.wordchars

The string of characters that will accumulate into multi-character tokens.  By
default, includes all ASCII alphanumerics and underscore.  In POSIX mode, the
accented characters in the Latin-1 set are also included.  If
@ref{1df8,,punctuation_chars} is not empty, the characters @code{~-./*?=}, which can
appear in filename specifications and command line parameters, will also be
included in this attribute, and any characters which appear in
@code{punctuation_chars} will be removed from @code{wordchars} if they are present
there. If @ref{5117,,whitespace_split} is set to @code{True}, this will have no
effect.
@end deffn

@geindex whitespace (shlex.shlex attribute)
@anchor{library/shlex shlex shlex whitespace}@anchor{5118}
@deffn {Attribute} shlex.whitespace

Characters that will be considered whitespace and skipped.  Whitespace bounds
tokens.  By default, includes space, tab, linefeed and carriage-return.
@end deffn

@geindex escape (shlex.shlex attribute)
@anchor{library/shlex shlex shlex escape}@anchor{5119}
@deffn {Attribute} shlex.escape

Characters that will be considered as escape. This will be only used in POSIX
mode, and includes just @code{'\'} by default.
@end deffn

@geindex quotes (shlex.shlex attribute)
@anchor{library/shlex shlex shlex quotes}@anchor{511a}
@deffn {Attribute} shlex.quotes

Characters that will be considered string quotes.  The token accumulates until
the same quote is encountered again (thus, different quote types protect each
other as in the shell.)  By default, includes ASCII single and double quotes.
@end deffn

@geindex escapedquotes (shlex.shlex attribute)
@anchor{library/shlex shlex shlex escapedquotes}@anchor{511b}
@deffn {Attribute} shlex.escapedquotes

Characters in @ref{511a,,quotes} that will interpret escape characters defined in
@ref{5119,,escape}.  This is only used in POSIX mode, and includes just @code{'"'} by
default.
@end deffn

@geindex whitespace_split (shlex.shlex attribute)
@anchor{library/shlex shlex shlex whitespace_split}@anchor{5117}
@deffn {Attribute} shlex.whitespace_split

If @code{True}, tokens will only be split in whitespaces.  This is useful, for
example, for parsing command lines with @ref{ece,,shlex}, getting
tokens in a similar way to shell arguments.  When used in combination with
@ref{1df8,,punctuation_chars}, tokens will be split on whitespace in addition to
those characters.


Changed in version 3.8: The @ref{1df8,,punctuation_chars} attribute was made compatible with the
@ref{5117,,whitespace_split} attribute.

@end deffn

@geindex infile (shlex.shlex attribute)
@anchor{library/shlex shlex shlex infile}@anchor{510a}
@deffn {Attribute} shlex.infile

The name of the current input file, as initially set at class instantiation time
or stacked by later source requests.  It may be useful to examine this when
constructing error messages.
@end deffn

@geindex instream (shlex.shlex attribute)
@anchor{library/shlex shlex shlex instream}@anchor{511c}
@deffn {Attribute} shlex.instream

The input stream from which this @ref{ece,,shlex} instance is reading
characters.
@end deffn

@geindex source (shlex.shlex attribute)
@anchor{library/shlex shlex shlex source}@anchor{5113}
@deffn {Attribute} shlex.source

This attribute is @code{None} by default.  If you assign a string to it, that
string will be recognized as a lexical-level inclusion request similar to the
@code{source} keyword in various shells.  That is, the immediately following token
will be opened as a filename and input will be taken from that stream until
EOF, at which point the @ref{507,,close()} method of that stream will be
called and the input source will again become the original input stream.  Source
requests may be stacked any number of levels deep.
@end deffn

@geindex debug (shlex.shlex attribute)
@anchor{library/shlex shlex shlex debug}@anchor{511d}
@deffn {Attribute} shlex.debug

If this attribute is numeric and @code{1} or more, a @ref{ece,,shlex}
instance will print verbose progress output on its behavior.  If you need
to use this, you can read the module source code to learn the details.
@end deffn

@geindex lineno (shlex.shlex attribute)
@anchor{library/shlex shlex shlex lineno}@anchor{511e}
@deffn {Attribute} shlex.lineno

Source line number (count of newlines seen so far plus one).
@end deffn

@geindex token (shlex.shlex attribute)
@anchor{library/shlex shlex shlex token}@anchor{511f}
@deffn {Attribute} shlex.token

The token buffer.  It may be useful to examine this when catching exceptions.
@end deffn

@geindex eof (shlex.shlex attribute)
@anchor{library/shlex shlex shlex eof}@anchor{5110}
@deffn {Attribute} shlex.eof

Token used to determine end of file. This will be set to the empty string
(@code{'@w{'}}), in non-POSIX mode, and to @code{None} in POSIX mode.
@end deffn

@geindex punctuation_chars (shlex.shlex attribute)
@anchor{library/shlex shlex shlex punctuation_chars}@anchor{1df8}
@deffn {Attribute} shlex.punctuation_chars

A read-only property. Characters that will be considered punctuation. Runs of
punctuation characters will be returned as a single token. However, note that no
semantic validity checking will be performed: for example, ‘>>>’ could be
returned as a token, even though it may not be recognised as such by shells.


Added in version 3.6.

@end deffn

@node Parsing Rules,Improved Compatibility with Shells,shlex Objects,shlex — Simple lexical analysis
@anchor{library/shlex parsing-rules}@anchor{5120}@anchor{library/shlex shlex-parsing-rules}@anchor{5121}
@subsubsection Parsing Rules


When operating in non-POSIX mode, @ref{ece,,shlex} will try to obey the
following rules.


@itemize *

@item 
Quote characters are not recognized within words (@code{Do"Not"Separate} is
parsed as the single word @code{Do"Not"Separate});

@item 
Escape characters are not recognized;

@item 
Enclosing characters in quotes preserve the literal value of all characters
within the quotes;

@item 
Closing quotes separate words (@code{"Do"Separate} is parsed as @code{"Do"} and
@code{Separate});

@item 
If @ref{5117,,whitespace_split} is @code{False}, any character not
declared to be a word character, whitespace, or a quote will be returned as
a single-character token. If it is @code{True}, @ref{ece,,shlex} will only
split words in whitespaces;

@item 
EOF is signaled with an empty string (@code{'@w{'}});

@item 
It’s not possible to parse empty strings, even if quoted.
@end itemize

When operating in POSIX mode, @ref{ece,,shlex} will try to obey the
following parsing rules.


@itemize *

@item 
Quotes are stripped out, and do not separate words (@code{"Do"Not"Separate"} is
parsed as the single word @code{DoNotSeparate});

@item 
Non-quoted escape characters (e.g. @code{'\'}) preserve the literal value of the
next character that follows;

@item 
Enclosing characters in quotes which are not part of
@ref{511b,,escapedquotes} (e.g. @code{"'"}) preserve the literal value
of all characters within the quotes;

@item 
Enclosing characters in quotes which are part of
@ref{511b,,escapedquotes} (e.g. @code{'"'}) preserves the literal value
of all characters within the quotes, with the exception of the characters
mentioned in @ref{5119,,escape}.  The escape characters retain their
special meaning only when followed by the quote in use, or the escape
character itself. Otherwise the escape character will be considered a
normal character.

@item 
EOF is signaled with a @ref{887,,None} value;

@item 
Quoted empty strings (@code{'@w{'}}) are allowed.
@end itemize

@node Improved Compatibility with Shells,,Parsing Rules,shlex — Simple lexical analysis
@anchor{library/shlex improved-compatibility-with-shells}@anchor{5122}@anchor{library/shlex improved-shell-compatibility}@anchor{ecf}
@subsubsection Improved Compatibility with Shells



Added in version 3.6.


The @ref{c9,,shlex} class provides compatibility with the parsing performed by
common Unix shells like @code{bash}, @code{dash}, and @code{sh}.  To take advantage of
this compatibility, specify the @code{punctuation_chars} argument in the
constructor.  This defaults to @code{False}, which preserves pre-3.6 behaviour.
However, if it is set to @code{True}, then parsing of the characters @code{();<>|&}
is changed: any run of these characters is returned as a single token.  While
this is short of a full parser for shells (which would be out of scope for the
standard library, given the multiplicity of shells out there), it does allow
you to perform processing of command lines more easily than you could
otherwise.  To illustrate, you can see the difference in the following snippet:

@example
>>> import shlex
>>> text = "a && b; c && d || e; f >'abc'; (def \"ghi\")"
>>> s = shlex.shlex(text, posix=True)
>>> s.whitespace_split = True
>>> list(s)
['a', '&&', 'b;', 'c', '&&', 'd', '||', 'e;', 'f', '>abc;', '(def', 'ghi)']
>>> s = shlex.shlex(text, posix=True, punctuation_chars=True)
>>> s.whitespace_split = True
>>> list(s)
['a', '&&', 'b', ';', 'c', '&&', 'd', '||', 'e', ';', 'f', '>', 'abc', ';',
'(', 'def', 'ghi', ')']
@end example

Of course, tokens will be returned which are not valid for shells, and you’ll
need to implement your own error checks on the returned tokens.

Instead of passing @code{True} as the value for the punctuation_chars parameter,
you can pass a string with specific characters, which will be used to determine
which characters constitute punctuation. For example:

@example
>>> import shlex
>>> s = shlex.shlex("a && b || c", punctuation_chars="|")
>>> list(s)
['a', '&', '&', 'b', '||', 'c']
@end example

@cartouche
@quotation Note 
When @code{punctuation_chars} is specified, the @ref{510b,,wordchars}
attribute is augmented with the characters @code{~-./*?=}.  That is because these
characters can appear in file names (including wildcards) and command-line
arguments (e.g. @code{--color=auto}). Hence:

@example
>>> import shlex
>>> s = shlex.shlex('~/a && b-c --color=auto || d *.py?',
...                 punctuation_chars=True)
>>> list(s)
['~/a', '&&', 'b-c', '--color=auto', '||', 'd', '*.py?']
@end example

However, to match the shell as closely as possible, it is recommended to
always use @code{posix} and @ref{5117,,whitespace_split} when using
@ref{1df8,,punctuation_chars}, which will negate
@ref{510b,,wordchars} entirely.
@end quotation
@end cartouche

For best effect, @code{punctuation_chars} should be set in conjunction with
@code{posix=True}. (Note that @code{posix=False} is the default for
@ref{ece,,shlex}.)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node posix — The most common POSIX system calls,pwd — The password database,shlex — Simple lexical analysis,Unix-specific services
@anchor{library/posix doc}@anchor{5123}@anchor{library/posix module-posix}@anchor{b2}@anchor{library/posix posix-the-most-common-posix-system-calls}@anchor{5124}@anchor{library/posix translation-repo}@anchor{5125}
@subsection @code{posix} — The most common POSIX system calls


@geindex module; posix


__________________________________________________________________


This module provides access to operating system functionality that is
standardized by the C Standard and the POSIX standard (a thinly disguised Unix
interface).

@ref{2181,,Availability}: Unix.

@geindex module; os

`Do not import this module directly.'  Instead, import the module @ref{a5,,os},
which provides a `portable' version of this interface.  On Unix, the @code{os}
module provides a superset of the @code{posix} interface.  On non-Unix operating
systems the @code{posix} module is not available, but a subset is always
available through the @code{os} interface.  Once @code{os} is imported, there is
`no' performance penalty in using it instead of @code{posix}.  In addition,
@code{os} provides some additional functionality, such as automatically calling
@ref{25d,,putenv()} when an entry in @code{os.environ} is changed.

Errors are reported as exceptions; the usual exceptions are given for type
errors, while errors reported by the system calls raise @ref{2c2,,OSError}.

@menu
* Large File Support:: 
* Notable Module Contents:: 

@end menu

@node Large File Support,Notable Module Contents,,posix — The most common POSIX system calls
@anchor{library/posix large-file-support}@anchor{5126}@anchor{library/posix posix-large-files}@anchor{5127}
@subsubsection Large File Support


@geindex large files
@geindex file; large files

Several operating systems (including AIX and Solaris) provide
support for files that are larger than 2 GiB from a C programming model where
int and long are 32-bit values. This is typically accomplished
by defining the relevant size and offset types as 64-bit values. Such files are
sometimes referred to as `large files'.

Large file support is enabled in Python when the size of an @code{off_t} is
larger than a long and the long long is at least as large
as an @code{off_t}.
It may be necessary to configure and compile Python with certain compiler flags
to enable this mode. For example, with Solaris 2.6 and 2.7 you need to do
something like:

@example
CFLAGS="`getconf LFS_CFLAGS`" OPT="-g -O2 $CFLAGS" \
        ./configure
@end example

On large-file-capable Linux systems, this might work:

@example
CFLAGS='-D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64' OPT="-g -O2 $CFLAGS" \
        ./configure
@end example

@node Notable Module Contents,,Large File Support,posix — The most common POSIX system calls
@anchor{library/posix notable-module-contents}@anchor{5128}@anchor{library/posix posix-contents}@anchor{5129}
@subsubsection Notable Module Contents


In addition to many functions described in the @ref{a5,,os} module documentation,
@code{posix} defines the following data item:

@geindex environ (in module posix)
@anchor{library/posix posix environ}@anchor{512a}
@deffn {Data} posix.environ

A dictionary representing the string environment at the time the interpreter
was started. Keys and values are bytes on Unix and str on Windows. For
example, @code{environ[b'HOME']} (@code{environ['HOME']} on Windows) is the
pathname of your home directory, equivalent to @code{getenv("HOME")} in C.

Modifying this dictionary does not affect the string environment passed on by
@ref{3089,,execv()}, @ref{31c,,popen()} or @ref{1669,,system()}; if you need to
change the environment, pass @code{environ} to @ref{1305,,execve()} or add
variable assignments and export statements to the command string for
@code{system()} or @code{popen()}.


Changed in version 3.2: On Unix, keys and values are bytes.


@cartouche
@quotation Note 
The @ref{a5,,os} module provides an alternate implementation of @code{environ}
which updates the environment on modification. Note also that updating
@ref{25b,,os.environ} will render this dictionary obsolete. Use of the
@code{os} module version of this is recommended over direct access to the
@code{posix} module.
@end quotation
@end cartouche
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node pwd — The password database,grp — The group database,posix — The most common POSIX system calls,Unix-specific services
@anchor{library/pwd doc}@anchor{512b}@anchor{library/pwd module-pwd}@anchor{b7}@anchor{library/pwd pwd-the-password-database}@anchor{512c}@anchor{library/pwd translation-repo}@anchor{512d}
@subsection @code{pwd} — The password database


@geindex module; pwd


__________________________________________________________________


This module provides access to the Unix user account and password database.  It
is available on all Unix versions.

@ref{2181,,Availability}: Unix, not WASI, not iOS.

Password database entries are reported as a tuple-like object, whose attributes
correspond to the members of the @code{passwd} structure (Attribute field below,
see @code{<pwd.h>}):


@multitable {xxxxxxxxx} {xxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Index

@tab

Attribute

@tab

Meaning

@item

0

@tab

@code{pw_name}

@tab

Login name

@item

1

@tab

@code{pw_passwd}

@tab

Optional encrypted password

@item

2

@tab

@code{pw_uid}

@tab

Numerical user ID

@item

3

@tab

@code{pw_gid}

@tab

Numerical group ID

@item

4

@tab

@code{pw_gecos}

@tab

User name or comment field

@item

5

@tab

@code{pw_dir}

@tab

User home directory

@item

6

@tab

@code{pw_shell}

@tab

User command interpreter

@end multitable


The uid and gid items are integers, all others are strings. @ref{5e7,,KeyError} is
raised if the entry asked for cannot be found.

@cartouche
@quotation Note 
In traditional Unix the field @code{pw_passwd} usually contains a password
encrypted with a DES derived algorithm.  However most
modern unices  use a so-called `shadow password' system.  On those unices the
`pw_passwd' field only contains an asterisk (@code{'*'}) or the  letter @code{'x'}
where the encrypted password is stored in a file @code{/etc/shadow} which is
not world readable.  Whether the `pw_passwd' field contains anything useful is
system-dependent.
@end quotation
@end cartouche

It defines the following items:

@geindex getpwuid() (in module pwd)
@anchor{library/pwd pwd getpwuid}@anchor{1e54}
@deffn {Function} pwd.getpwuid (uid)

Return the password database entry for the given numeric user ID.
@end deffn

@geindex getpwnam() (in module pwd)
@anchor{library/pwd pwd getpwnam}@anchor{37bf}
@deffn {Function} pwd.getpwnam (name)

Return the password database entry for the given user name.
@end deffn

@geindex getpwall() (in module pwd)
@anchor{library/pwd pwd getpwall}@anchor{512e}
@deffn {Function} pwd.getpwall ()

Return a list of all available password database entries, in arbitrary order.
@end deffn


@subsubheading See also



@table @asis

@item Module @ref{6a,,grp}

An interface to the group database, similar to this.
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node grp — The group database,termios — POSIX style tty control,pwd — The password database,Unix-specific services
@anchor{library/grp doc}@anchor{512f}@anchor{library/grp grp-the-group-database}@anchor{5130}@anchor{library/grp module-grp}@anchor{6a}@anchor{library/grp translation-repo}@anchor{5131}
@subsection @code{grp} — The group database


@geindex module; grp


__________________________________________________________________


This module provides access to the Unix group database. It is available on all
Unix versions.

@ref{2181,,Availability}: Unix, not WASI, not Android, not iOS.

Group database entries are reported as a tuple-like object, whose attributes
correspond to the members of the @code{group} structure (Attribute field below, see
@code{<grp.h>}):


@multitable {xxxxxxxxx} {xxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Index

@tab

Attribute

@tab

Meaning

@item

0

@tab

gr_name

@tab

the name of the group

@item

1

@tab

gr_passwd

@tab

the (encrypted) group password;
often empty

@item

2

@tab

gr_gid

@tab

the numerical group ID

@item

3

@tab

gr_mem

@tab

all the group member’s  user
names

@end multitable


The gid is an integer, name and password are strings, and the member list is a
list of strings. (Note that most users are not explicitly listed as members of
the group they are in according to the password database.  Check both databases
to get complete membership information.  Also note that a @code{gr_name} that
starts with a @code{+} or @code{-} is likely to be a YP/NIS reference and may not be
accessible via @ref{37be,,getgrnam()} or @ref{f28,,getgrgid()}.)

It defines the following items:

@geindex getgrgid() (in module grp)
@anchor{library/grp grp getgrgid}@anchor{f28}
@deffn {Function} grp.getgrgid (id)

Return the group database entry for the given numeric group ID. @ref{5e7,,KeyError}
is raised if the entry asked for cannot be found.


Changed in version 3.10: @ref{199,,TypeError} is raised for non-integer arguments like floats or strings.

@end deffn

@geindex getgrnam() (in module grp)
@anchor{library/grp grp getgrnam}@anchor{37be}
@deffn {Function} grp.getgrnam (name)

Return the group database entry for the given group name. @ref{5e7,,KeyError} is
raised if the entry asked for cannot be found.
@end deffn

@geindex getgrall() (in module grp)
@anchor{library/grp grp getgrall}@anchor{192f}
@deffn {Function} grp.getgrall ()

Return a list of all available group entries, in arbitrary order.
@end deffn


@subsubheading See also



@table @asis

@item Module @ref{b7,,pwd}

An interface to the user database, similar to this.
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node termios — POSIX style tty control,tty — Terminal control functions,grp — The group database,Unix-specific services
@anchor{library/termios doc}@anchor{5132}@anchor{library/termios module-termios}@anchor{e7}@anchor{library/termios termios-posix-style-tty-control}@anchor{5133}@anchor{library/termios translation-repo}@anchor{5134}
@subsection @code{termios} — POSIX style tty control


@geindex module; termios

@geindex POSIX; I/O control
@geindex tty; I/O control


__________________________________________________________________


This module provides an interface to the POSIX calls for tty I/O control. For a
complete description of these calls, see @code{termios(3)@footnote{https://manpages.debian.org/termios(3)}} Unix manual
page.  It is only available for those Unix versions that support POSIX
`termios' style tty I/O control configured during installation.

@ref{2181,,Availability}: Unix.

All functions in this module take a file descriptor `fd' as their first
argument.  This can be an integer file descriptor, such as returned by
@code{sys.stdin.fileno()}, or a @ref{13cf,,file object}, such as @code{sys.stdin} itself.

This module also defines all the constants needed to work with the functions
provided here; these have the same name as their counterparts in C.  Please
refer to your system documentation for more information on using these terminal
control interfaces.

The module defines the following functions:

@geindex tcgetattr() (in module termios)
@anchor{library/termios termios tcgetattr}@anchor{1a38}
@deffn {Function} termios.tcgetattr (fd)

Return a list containing the tty attributes for file descriptor `fd', as
follows: @code{[iflag, oflag, cflag, lflag, ispeed, ospeed, cc]} where `cc' is a
list of the tty special characters (each a string of length 1, except the
items with indices @code{VMIN} and @code{VTIME}, which are integers when
these fields are defined).  The interpretation of the flags and the speeds as
well as the indexing in the `cc' array must be done using the symbolic
constants defined in the @code{termios} module.
@end deffn

@geindex tcsetattr() (in module termios)
@anchor{library/termios termios tcsetattr}@anchor{1aaf}
@deffn {Function} termios.tcsetattr (fd, when, attributes)

Set the tty attributes for file descriptor `fd' from the `attributes', which is
a list like the one returned by @ref{1a38,,tcgetattr()}.  The `when' argument
determines when the attributes are changed:

@geindex TCSANOW (in module termios)
@anchor{library/termios termios TCSANOW}@anchor{5135}
@deffn {Data} termios.TCSANOW

Change attributes immediately.
@end deffn

@geindex TCSADRAIN (in module termios)
@anchor{library/termios termios TCSADRAIN}@anchor{5136}
@deffn {Data} termios.TCSADRAIN

Change attributes after transmitting all queued output.
@end deffn

@geindex TCSAFLUSH (in module termios)
@anchor{library/termios termios TCSAFLUSH}@anchor{5137}
@deffn {Data} termios.TCSAFLUSH

Change attributes after transmitting all queued output and
discarding all queued input.
@end deffn
@end deffn

@geindex tcsendbreak() (in module termios)
@anchor{library/termios termios tcsendbreak}@anchor{5138}
@deffn {Function} termios.tcsendbreak (fd, duration)

Send a break on file descriptor `fd'.  A zero `duration' sends a break for
0.25–0.5 seconds; a nonzero `duration' has a system dependent meaning.
@end deffn

@geindex tcdrain() (in module termios)
@anchor{library/termios termios tcdrain}@anchor{5139}
@deffn {Function} termios.tcdrain (fd)

Wait until all output written to file descriptor `fd' has been transmitted.
@end deffn

@geindex tcflush() (in module termios)
@anchor{library/termios termios tcflush}@anchor{513a}
@deffn {Function} termios.tcflush (fd, queue)

Discard queued data on file descriptor `fd'.  The `queue' selector specifies
which queue: @code{TCIFLUSH} for the input queue, @code{TCOFLUSH} for the
output queue, or @code{TCIOFLUSH} for both queues.
@end deffn

@geindex tcflow() (in module termios)
@anchor{library/termios termios tcflow}@anchor{513b}
@deffn {Function} termios.tcflow (fd, action)

Suspend or resume input or output on file descriptor `fd'.  The `action'
argument can be @code{TCOOFF} to suspend output, @code{TCOON} to restart
output, @code{TCIOFF} to suspend input, or @code{TCION} to restart input.
@end deffn

@geindex tcgetwinsize() (in module termios)
@anchor{library/termios termios tcgetwinsize}@anchor{513c}
@deffn {Function} termios.tcgetwinsize (fd)

Return a tuple @code{(ws_row, ws_col)} containing the tty window size for file
descriptor `fd'. Requires @code{termios.TIOCGWINSZ} or
@code{termios.TIOCGSIZE}.


Added in version 3.11.

@end deffn

@geindex tcsetwinsize() (in module termios)
@anchor{library/termios termios tcsetwinsize}@anchor{513d}
@deffn {Function} termios.tcsetwinsize (fd, winsize)

Set the tty window size for file descriptor `fd' from `winsize', which is
a two-item tuple @code{(ws_row, ws_col)} like the one returned by
@ref{513c,,tcgetwinsize()}. Requires at least one of the pairs
(@code{termios.TIOCGWINSZ}, @code{termios.TIOCSWINSZ});
(@code{termios.TIOCGSIZE}, @code{termios.TIOCSSIZE}) to be defined.


Added in version 3.11.

@end deffn


@subsubheading See also



@table @asis

@item Module @ref{107,,tty}

Convenience functions for common terminal control operations.
@end table


@menu
* Example: Example<15>. 

@end menu

@node Example<15>,,,termios — POSIX style tty control
@anchor{library/termios example}@anchor{513e}@anchor{library/termios termios-example}@anchor{513f}
@subsubsection Example


Here’s a function that prompts for a password with echoing turned off.  Note the
technique using a separate @ref{1a38,,tcgetattr()} call and a @ref{8fa,,try} …
@ref{1b1,,finally} statement to ensure that the old tty attributes are restored
exactly no matter what happens:

@example
def getpass(prompt="Password: "):
    import termios, sys
    fd = sys.stdin.fileno()
    old = termios.tcgetattr(fd)
    new = termios.tcgetattr(fd)
    new[3] = new[3] & ~termios.ECHO          # lflags
    try:
        termios.tcsetattr(fd, termios.TCSADRAIN, new)
        passwd = input(prompt)
    finally:
        termios.tcsetattr(fd, termios.TCSADRAIN, old)
    return passwd
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node tty — Terminal control functions,pty — Pseudo-terminal utilities,termios — POSIX style tty control,Unix-specific services
@anchor{library/tty doc}@anchor{5140}@anchor{library/tty module-tty}@anchor{107}@anchor{library/tty translation-repo}@anchor{5141}@anchor{library/tty tty-terminal-control-functions}@anchor{5142}
@subsection @code{tty} — Terminal control functions


@geindex module; tty

`Source code:' Lib/tty.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/tty.py}


__________________________________________________________________


The @code{tty} module defines functions for putting the tty into cbreak and raw
modes.

@ref{2181,,Availability}: Unix.

Because it requires the @ref{e7,,termios} module, it will work only on Unix.

The @code{tty} module defines the following functions:

@geindex cfmakeraw() (in module tty)
@anchor{library/tty tty cfmakeraw}@anchor{1a88}
@deffn {Function} tty.cfmakeraw (mode)

Convert the tty attribute list `mode', which is a list like the one returned
by @ref{1a38,,termios.tcgetattr()}, to that of a tty in raw mode.


Added in version 3.12.

@end deffn

@geindex cfmakecbreak() (in module tty)
@anchor{library/tty tty cfmakecbreak}@anchor{1a3b}
@deffn {Function} tty.cfmakecbreak (mode)

Convert the tty attribute list `mode', which is a list like the one returned
by @ref{1a38,,termios.tcgetattr()}, to that of a tty in cbreak mode.

This clears the @code{ECHO} and @code{ICANON} local mode flags in `mode' as well
as setting the minimum input to 1 byte with no delay.


Added in version 3.12.



Changed in version 3.12.2: The @code{ICRNL} flag is no longer cleared. This matches Linux and macOS
@code{stty cbreak} behavior and what @ref{1a3a,,setcbreak()} historically did.

@end deffn

@geindex setraw() (in module tty)
@anchor{library/tty tty setraw}@anchor{1a87}
@deffn {Function} tty.setraw (fd, when=termios.TCSAFLUSH)

Change the mode of the file descriptor `fd' to raw. If `when' is omitted, it
defaults to @ref{5137,,termios.TCSAFLUSH}, and is passed to
@ref{1aaf,,termios.tcsetattr()}. The return value of @ref{1a38,,termios.tcgetattr()}
is saved before setting `fd' to raw mode; this value is returned.


Changed in version 3.12: The return value is now the original tty attributes, instead of @code{None}.

@end deffn

@geindex setcbreak() (in module tty)
@anchor{library/tty tty setcbreak}@anchor{1a3a}
@deffn {Function} tty.setcbreak (fd, when=termios.TCSAFLUSH)

Change the mode of file descriptor `fd' to cbreak. If `when' is omitted, it
defaults to @ref{5137,,termios.TCSAFLUSH}, and is passed to
@ref{1aaf,,termios.tcsetattr()}. The return value of @ref{1a38,,termios.tcgetattr()}
is saved before setting `fd' to cbreak mode; this value is returned.

This clears the @code{ECHO} and @code{ICANON} local mode flags as well as setting
the minimum input to 1 byte with no delay.


Changed in version 3.12: The return value is now the original tty attributes, instead of @code{None}.



Changed in version 3.12.2: The @code{ICRNL} flag is no longer cleared. This restores the behavior
of Python 3.11 and earlier as well as matching what Linux, macOS, & BSDs
describe in their @code{stty(1)} man pages regarding cbreak mode.

@end deffn


@subsubheading See also



@table @asis

@item Module @ref{e7,,termios}

Low-level terminal control interface.
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node pty — Pseudo-terminal utilities,fcntl — The fcntl and ioctl system calls,tty — Terminal control functions,Unix-specific services
@anchor{library/pty doc}@anchor{5143}@anchor{library/pty module-pty}@anchor{b6}@anchor{library/pty pty-pseudo-terminal-utilities}@anchor{5144}@anchor{library/pty translation-repo}@anchor{5145}
@subsection @code{pty} — Pseudo-terminal utilities


@geindex module; pty

`Source code:' Lib/pty.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/pty.py}


__________________________________________________________________


The @code{pty} module defines operations for handling the pseudo-terminal
concept: starting another process and being able to write to and read from its
controlling terminal programmatically.

@ref{2181,,Availability}: Unix.

Pseudo-terminal handling is highly platform dependent. This code is mainly
tested on Linux, FreeBSD, and macOS (it is supposed to work on other POSIX
platforms but it’s not been thoroughly tested).

The @code{pty} module defines the following functions:

@geindex fork() (in module pty)
@anchor{library/pty pty fork}@anchor{1b0f}
@deffn {Function} pty.fork ()

Fork. Connect the child’s controlling terminal to a pseudo-terminal. Return
value is @code{(pid, fd)}. Note that the child  gets `pid' 0, and the `fd' is
`invalid'. The parent’s return value is the `pid' of the child, and `fd' is a
file descriptor connected to the child’s controlling terminal (and also to the
child’s standard input and output).

@cartouche
@quotation Warning 
On macOS the use of this function is unsafe when mixed with using
higher-level system APIs, and that includes using @ref{112,,urllib.request}.
@end quotation
@end cartouche
@end deffn

@geindex openpty() (in module pty)
@anchor{library/pty pty openpty}@anchor{303}
@deffn {Function} pty.openpty ()

Open a new pseudo-terminal pair, using @ref{30ca,,os.openpty()} if possible, or
emulation code for generic Unix systems. Return a pair of file descriptors
@code{(master, slave)}, for the master and the slave end, respectively.
@end deffn

@geindex spawn() (in module pty)
@anchor{library/pty pty spawn}@anchor{1188}
@deffn {Function} pty.spawn (argv[, master_read[, stdin_read]])

Spawn a process, and connect its controlling terminal with the current
process’s standard io. This is often used to baffle programs which insist on
reading from the controlling terminal. It is expected that the process
spawned behind the pty will eventually terminate, and when it does `spawn'
will return.

A loop copies STDIN of the current process to the child and data received
from the child to STDOUT of the current process. It is not signaled to the
child if STDIN of the current process closes down.

The functions `master_read' and `stdin_read' are passed a file descriptor
which they should read from, and they should always return a byte string. In
order to force spawn to return before the child process exits an
empty byte array should be returned to signal end of file.

The default implementation for both functions will read and return up to 1024
bytes each time the function is called. The `master_read' callback is passed
the pseudoterminal’s master file descriptor to read output from the child
process, and `stdin_read' is passed file descriptor 0, to read from the
parent process’s standard input.

Returning an empty byte string from either callback is interpreted as an
end-of-file (EOF) condition, and that callback will not be called after
that. If `stdin_read' signals EOF the controlling terminal can no longer
communicate with the parent process OR the child process. Unless the child
process will quit without any input, `spawn' will then loop forever. If
`master_read' signals EOF the same behavior results (on linux at least).

Return the exit status value from @ref{fa0,,os.waitpid()} on the child process.

@ref{b1d,,os.waitstatus_to_exitcode()} can be used to convert the exit status into
an exit code.

Raises an @ref{1cb1,,auditing event} @code{pty.spawn} with argument @code{argv}.


Changed in version 3.4: @code{spawn()} now returns the status value from @ref{fa0,,os.waitpid()}
on the child process.

@end deffn

@menu
* Example: Example<16>. 

@end menu

@node Example<16>,,,pty — Pseudo-terminal utilities
@anchor{library/pty example}@anchor{5146}
@subsubsection Example


The following program acts like the Unix command @code{script(1)@footnote{https://manpages.debian.org/script(1)}}, using a
pseudo-terminal to record all input and output of a terminal session in a
“typescript”.

@example
import argparse
import os
import pty
import sys
import time

parser = argparse.ArgumentParser()
parser.add_argument('-a', dest='append', action='store_true')
parser.add_argument('-p', dest='use_python', action='store_true')
parser.add_argument('filename', nargs='?', default='typescript')
options = parser.parse_args()

shell = sys.executable if options.use_python else os.environ.get('SHELL', 'sh')
filename = options.filename
mode = 'ab' if options.append else 'wb'

with open(filename, mode) as script:
    def read(fd):
        data = os.read(fd, 1024)
        script.write(data)
        return data

    print('Script started, file is', filename)
    script.write(('Script started on %s\n' % time.asctime()).encode())

    pty.spawn(shell, read)

    script.write(('Script done on %s\n' % time.asctime()).encode())
    print('Script done, file is', filename)
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node fcntl — The fcntl and ioctl system calls,resource — Resource usage information,pty — Pseudo-terminal utilities,Unix-specific services
@anchor{library/fcntl doc}@anchor{5147}@anchor{library/fcntl fcntl-the-fcntl-and-ioctl-system-calls}@anchor{5148}@anchor{library/fcntl module-fcntl}@anchor{5d}@anchor{library/fcntl translation-repo}@anchor{5149}
@subsection @code{fcntl} — The @code{fcntl} and @code{ioctl} system calls


@geindex module; fcntl

@geindex UNIX; file control
@geindex UNIX; I/O control


__________________________________________________________________


This module performs file and I/O control on file descriptors. It is an
interface to the @code{fcntl()} and @code{ioctl()} Unix routines.
See the @code{fcntl(2)@footnote{https://manpages.debian.org/fcntl(2)}} and @code{ioctl(2)@footnote{https://manpages.debian.org/ioctl(2)}} Unix manual pages
for full details.

@ref{2181,,Availability}: Unix, not WASI.

All functions in this module take a file descriptor `fd' as their first
argument.  This can be an integer file descriptor, such as returned by
@code{sys.stdin.fileno()}, or an @ref{506,,io.IOBase} object, such as @code{sys.stdin}
itself, which provides a @ref{17fe,,fileno()} that returns a genuine file
descriptor.


Changed in version 3.3: Operations in this module used to raise an @ref{1259,,IOError} where they now
raise an @ref{2c2,,OSError}.



Changed in version 3.8: The @code{fcntl} module now contains @code{F_ADD_SEALS}, @code{F_GET_SEALS}, and
@code{F_SEAL_*} constants for sealing of @ref{c04,,os.memfd_create()} file
descriptors.



Changed in version 3.9: On macOS, the @code{fcntl} module exposes the @code{F_GETPATH} constant,
which obtains the path of a file from a file descriptor.
On Linux(>=3.15), the @code{fcntl} module exposes the @code{F_OFD_GETLK},
@code{F_OFD_SETLK} and @code{F_OFD_SETLKW} constants, which are used when working
with open file description locks.



Changed in version 3.10: On Linux >= 2.6.11, the @code{fcntl} module exposes the @code{F_GETPIPE_SZ} and
@code{F_SETPIPE_SZ} constants, which allow to check and modify a pipe’s size
respectively.



Changed in version 3.11: On FreeBSD, the @code{fcntl} module exposes the @code{F_DUP2FD} and
@code{F_DUP2FD_CLOEXEC} constants, which allow to duplicate a file descriptor,
the latter setting @code{FD_CLOEXEC} flag in addition.



Changed in version 3.12: On Linux >= 4.5, the @code{fcntl} module exposes the @code{FICLONE} and
@code{FICLONERANGE} constants, which allow to share some data of one file with
another file by reflinking on some filesystems (e.g., btrfs, OCFS2, and
XFS). This behavior is commonly referred to as “copy-on-write”.



Changed in version 3.13: On Linux >= 2.6.32, the @code{fcntl} module exposes the
@code{F_GETOWN_EX}, @code{F_SETOWN_EX}, @code{F_OWNER_TID}, @code{F_OWNER_PID}, @code{F_OWNER_PGRP} constants, which allow to direct I/O availability signals
to a specific thread, process, or process group.
On Linux >= 4.13, the @code{fcntl} module exposes the
@code{F_GET_RW_HINT}, @code{F_SET_RW_HINT}, @code{F_GET_FILE_RW_HINT},
@code{F_SET_FILE_RW_HINT}, and @code{RWH_WRITE_LIFE_*} constants, which allow
to inform the kernel about the relative expected lifetime of writes on
a given inode or via a particular open file description.
On Linux >= 5.1 and NetBSD, the @code{fcntl} module exposes the
@code{F_SEAL_FUTURE_WRITE} constant for use with @code{F_ADD_SEALS} and
@code{F_GET_SEALS} operations.
On FreeBSD, the @code{fcntl} module exposes the @code{F_READAHEAD}, @code{F_ISUNIONSTACK}, and @code{F_KINFO} constants.
On macOS and FreeBSD, the @code{fcntl} module exposes the @code{F_RDAHEAD}
constant.
On NetBSD and AIX, the @code{fcntl} module exposes the @code{F_CLOSEM}
constant.
On NetBSD, the @code{fcntl} module exposes the @code{F_MAXFD} constant.
On macOS and NetBSD, the @code{fcntl} module exposes the @code{F_GETNOSIGPIPE}
and @code{F_SETNOSIGPIPE} constant.



Changed in version 3.14: On Linux >= 6.1, the @code{fcntl} module exposes the @code{F_DUPFD_QUERY}
to query a file descriptor pointing to the same file.


The module defines the following functions:

@geindex fcntl() (in module fcntl)
@anchor{library/fcntl fcntl fcntl}@anchor{189a}
@deffn {Function} fcntl.fcntl (fd, cmd, arg=0, /)

Perform the operation `cmd' on file descriptor `fd' (file objects providing
a @ref{17fe,,fileno()} method are accepted as well).  The values used
for `cmd' are operating system dependent, and are available as constants
in the @code{fcntl} module, using the same names as used in the relevant C
header files. The argument `arg' can either be an integer value, a
@ref{194,,bytes-like object}, or a string.
The type and size of `arg' must match the type and size of
the argument of the operation as specified in the relevant C documentation.

When `arg' is an integer, the function returns the integer
return value of the C @code{fcntl()} call.

When the argument is bytes-like object, it represents a binary structure,
for example, created by @ref{1482,,struct.pack()}.
A string value is encoded to binary using the UTF-8 encoding.
The binary data is copied to a buffer whose address is
passed to the C @code{fcntl()} call.  The return value after a successful
call is the contents of the buffer, converted to a @ref{193,,bytes} object.
The length of the returned object will be the same as the length of the
`arg' argument. This is limited to 1024 bytes.

If the @code{fcntl()} call fails, an @ref{2c2,,OSError} is raised.

@cartouche
@quotation Note 
If the type or the size of `arg' does not match the type or size
of the argument of the operation (for example, if an integer is
passed when a pointer is expected, or the information returned in
the buffer by the operating system is larger than 1024 bytes),
this is most likely to result in a segmentation violation or
a more subtle data corruption.
@end quotation
@end cartouche

Raises an @ref{1cb1,,auditing event} @code{fcntl.fcntl} with arguments @code{fd}, @code{cmd}, @code{arg}.


Changed in version 3.14: Add support of arbitrary @ref{194,,bytes-like objects},
not only @ref{193,,bytes}.

@end deffn

@geindex ioctl() (in module fcntl)
@anchor{library/fcntl fcntl ioctl}@anchor{1687}
@deffn {Function} fcntl.ioctl (fd, request, arg=0, mutate_flag=True, /)

This function is identical to the @ref{189a,,fcntl()} function, except
that the argument handling is even more complicated.

The `request' parameter is limited to values that can fit in 32-bits
or 64-bits, depending on the platform.
Additional constants of interest for use as the `request' argument can be
found in the @ref{e7,,termios} module, under the same names as used in
the relevant C header files.

The parameter `arg' can be an integer, a @ref{194,,bytes-like object},
or a string.
The type and size of `arg' must match the type and size of
the argument of the operation as specified in the relevant C documentation.

If `arg' does not support the read-write buffer interface or
the `mutate_flag' is false, behavior is as for the @ref{189a,,fcntl()}
function.

If `arg' supports the read-write buffer interface (like @ref{342,,bytearray})
and `mutate_flag' is true (the default), then the buffer is (in effect) passed
to the underlying @code{ioctl()} system call, the latter’s return code is
passed back to the calling Python, and the buffer’s new contents reflect the
action of the @code{ioctl()}.  This is a slight simplification, because if the
supplied buffer is less than 1024 bytes long it is first copied into a static
buffer 1024 bytes long which is then passed to @code{ioctl()} and copied back
into the supplied buffer.

If the @code{ioctl()} call fails, an @ref{2c2,,OSError} exception is raised.

@cartouche
@quotation Note 
If the type or size of `arg' does not match the type or size
of the operation’s argument (for example, if an integer is
passed when a pointer is expected, or the information returned in
the buffer by the operating system is larger than 1024 bytes,
or the size of the mutable bytes-like object is too small),
this is most likely to result in a segmentation violation or
a more subtle data corruption.
@end quotation
@end cartouche

An example:

@example
>>> import array, fcntl, struct, termios, os
>>> os.getpgrp()
13341
>>> struct.unpack('h', fcntl.ioctl(0, termios.TIOCGPGRP, "  "))[0]
13341
>>> buf = array.array('h', [0])
>>> fcntl.ioctl(0, termios.TIOCGPGRP, buf, 1)
0
>>> buf
array('h', [13341])
@end example

Raises an @ref{1cb1,,auditing event} @code{fcntl.ioctl} with arguments @code{fd}, @code{request}, @code{arg}.


Changed in version 3.14: The GIL is always released during a system call.
System calls failing with EINTR are automatically retried.

@end deffn

@geindex flock() (in module fcntl)
@anchor{library/fcntl fcntl flock}@anchor{4abc}
@deffn {Function} fcntl.flock (fd, operation, /)

Perform the lock operation `operation' on file descriptor `fd' (file objects providing
a @ref{17fe,,fileno()} method are accepted as well). See the Unix manual
@code{flock(2)@footnote{https://manpages.debian.org/flock(2)}} for details.  (On some systems, this function is emulated
using @code{fcntl()}.)

If the @code{flock()} call fails, an @ref{2c2,,OSError} exception is raised.

Raises an @ref{1cb1,,auditing event} @code{fcntl.flock} with arguments @code{fd}, @code{operation}.
@end deffn

@geindex lockf() (in module fcntl)
@anchor{library/fcntl fcntl lockf}@anchor{15f8}
@deffn {Function} fcntl.lockf (fd, cmd, len=0, start=0, whence=0, /)

This is essentially a wrapper around the @ref{189a,,fcntl()} locking calls.
`fd' is the file descriptor (file objects providing a @ref{17fe,,fileno()}
method are accepted as well) of the file to lock or unlock, and `cmd'
is one of the following values:

@geindex LOCK_UN (in module fcntl)
@anchor{library/fcntl fcntl LOCK_UN}@anchor{514a}
@deffn {Data} fcntl.LOCK_UN

Release an existing lock.
@end deffn

@geindex LOCK_SH (in module fcntl)
@anchor{library/fcntl fcntl LOCK_SH}@anchor{514b}
@deffn {Data} fcntl.LOCK_SH

Acquire a shared lock.
@end deffn

@geindex LOCK_EX (in module fcntl)
@anchor{library/fcntl fcntl LOCK_EX}@anchor{514c}
@deffn {Data} fcntl.LOCK_EX

Acquire an exclusive lock.
@end deffn

@geindex LOCK_NB (in module fcntl)
@anchor{library/fcntl fcntl LOCK_NB}@anchor{514d}
@deffn {Data} fcntl.LOCK_NB

Bitwise OR with any of the other three @code{LOCK_*} constants to make
the request non-blocking.
@end deffn

If @code{LOCK_NB} is used and the lock cannot be acquired, an
@ref{2c2,,OSError} will be raised and the exception will have an `errno'
attribute set to @ref{2755,,EACCES} or @ref{2746,,EAGAIN} (depending on the
operating system; for portability, check for both values).  On at least some
systems, @code{LOCK_EX} can only be used if the file descriptor refers to a
file opened for writing.

`len' is the number of bytes to lock, `start' is the byte offset at
which the lock starts, relative to `whence', and `whence' is as with
@ref{1498,,io.IOBase.seek()}, specifically:


@itemize *

@item 
@code{0} – relative to the start of the file (@ref{1499,,os.SEEK_SET})

@item 
@code{1} – relative to the current buffer position (@ref{149a,,os.SEEK_CUR})

@item 
@code{2} – relative to the end of the file (@ref{149b,,os.SEEK_END})
@end itemize

The default for `start' is 0, which means to start at the beginning of the file.
The default for `len' is 0 which means to lock to the end of the file.  The
default for `whence' is also 0.

Raises an @ref{1cb1,,auditing event} @code{fcntl.lockf} with arguments @code{fd}, @code{cmd}, @code{len}, @code{start}, @code{whence}.
@end deffn

Examples (all on a SVR4 compliant system):

@example
import struct, fcntl, os

f = open(...)
rv = fcntl.fcntl(f, fcntl.F_SETFL, os.O_NDELAY)

lockdata = struct.pack('hhllhh', fcntl.F_WRLCK, 0, 0, 0, 0, 0)
rv = fcntl.fcntl(f, fcntl.F_SETLKW, lockdata)
@end example

Note that in the first example the return value variable `rv' will hold an
integer value; in the second example it will hold a @ref{193,,bytes} object.  The
structure lay-out for the `lockdata' variable is system dependent — therefore
using the @ref{4abc,,flock()} call may be better.


@subsubheading See also



@table @asis

@item Module @ref{a5,,os}

If the locking flags @ref{163b,,O_SHLOCK} and @ref{163c,,O_EXLOCK} are
present in the @ref{a5,,os} module (on BSD only), the @ref{f98,,os.open()}
function provides an alternative to the @ref{15f8,,lockf()} and @ref{4abc,,flock()}
functions.
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node resource — Resource usage information,syslog — Unix syslog library routines,fcntl — The fcntl and ioctl system calls,Unix-specific services
@anchor{library/resource doc}@anchor{514e}@anchor{library/resource module-resource}@anchor{c1}@anchor{library/resource resource-resource-usage-information}@anchor{514f}@anchor{library/resource translation-repo}@anchor{5150}
@subsection @code{resource} — Resource usage information


@geindex module; resource


__________________________________________________________________


This module provides basic mechanisms for measuring and controlling system
resources utilized by a program.

@ref{2181,,Availability}: Unix, not WASI.

Symbolic constants are used to specify particular system resources and to
request usage information about either the current process or its children.

An @ref{2c2,,OSError} is raised on syscall failure.

@geindex error
@anchor{library/resource resource error}@anchor{5151}
@deffn {Exception} resource.error

A deprecated alias of @ref{2c2,,OSError}.


Changed in version 3.3: Following 
@geindex Python Enhancement Proposals; PEP 3151
PEP 3151@footnote{https://peps.python.org/pep-3151/}, this class was made an alias of @ref{2c2,,OSError}.

@end deffn

@menu
* Resource Limits:: 
* Resource Usage:: 

@end menu

@node Resource Limits,Resource Usage,,resource — Resource usage information
@anchor{library/resource resource-limits}@anchor{5152}
@subsubsection Resource Limits


Resources usage can be limited using the @ref{1815,,setrlimit()} function described
below. Each resource is controlled by a pair of limits: a soft limit and a hard
limit. The soft limit is the current limit, and may be lowered or raised by a
process over time. The soft limit can never exceed the hard limit. The hard
limit can be lowered to any value greater than the soft limit, but not raised.
(Only processes with the effective UID of the super-user can raise a hard
limit.)

The specific resources that can be limited are system dependent. They are
described in the @code{getrlimit(2)@footnote{https://manpages.debian.org/getrlimit(2)}} man page.  The resources listed below
are supported when the underlying operating system supports them; resources
which cannot be checked or controlled by the operating system are not defined in
this module for those platforms.

@geindex RLIM_INFINITY (in module resource)
@anchor{library/resource resource RLIM_INFINITY}@anchor{1814}
@deffn {Data} resource.RLIM_INFINITY

Constant used to represent the limit for an unlimited resource.
@end deffn

@geindex getrlimit() (in module resource)
@anchor{library/resource resource getrlimit}@anchor{1813}
@deffn {Function} resource.getrlimit (resource)

Returns a tuple @code{(soft, hard)} with the current soft and hard limits of
`resource'. Raises @ref{2ee,,ValueError} if an invalid resource is specified, or
@ref{5151,,error} if the underlying system call fails unexpectedly.
@end deffn

@geindex setrlimit() (in module resource)
@anchor{library/resource resource setrlimit}@anchor{1815}
@deffn {Function} resource.setrlimit (resource, limits)

Sets new limits of consumption of `resource'. The `limits' argument must be a
tuple @code{(soft, hard)} of two integers describing the new limits. A value of
@ref{1814,,RLIM_INFINITY} can be used to request a limit that is
unlimited.

Raises @ref{2ee,,ValueError} if an invalid resource is specified, if the new soft
limit exceeds the hard limit, or if a process tries to raise its hard limit.
Specifying a limit of @ref{1814,,RLIM_INFINITY} when the hard or
system limit for that resource is not unlimited will result in a
@code{ValueError}.  A process with the effective UID of super-user can
request any valid limit value, including unlimited, but @code{ValueError}
will still be raised if the requested limit exceeds the system imposed
limit.

@code{setrlimit} may also raise @ref{5151,,error} if the underlying system call
fails.

VxWorks only supports setting @ref{5153,,RLIMIT_NOFILE}.

Raises an @ref{1cb1,,auditing event} @code{resource.setrlimit} with arguments @code{resource}, @code{limits}.
@end deffn

@geindex prlimit() (in module resource)
@anchor{library/resource resource prlimit}@anchor{1190}
@deffn {Function} resource.prlimit (pid, resource[, limits])

Combines @ref{1815,,setrlimit()} and @ref{1813,,getrlimit()} in one function and
supports to get and set the resources limits of an arbitrary process. If
`pid' is 0, then the call applies to the current process. `resource' and
`limits' have the same meaning as in @code{setrlimit()}, except that
`limits' is optional.

When `limits' is not given the function returns the `resource' limit of the
process `pid'. When `limits' is given the `resource' limit of the process is
set and the former resource limit is returned.

Raises @ref{1261,,ProcessLookupError} when `pid' can’t be found and
@ref{f44,,PermissionError} when the user doesn’t have @code{CAP_SYS_RESOURCE} for
the process.

Raises an @ref{1cb1,,auditing event} @code{resource.prlimit} with arguments @code{pid}, @code{resource}, @code{limits}.

@ref{2181,,Availability}: Linux >= 2.6.36 with glibc >= 2.13.


Added in version 3.4.

@end deffn

These symbols define resources whose consumption can be controlled using the
@ref{1815,,setrlimit()} and @ref{1813,,getrlimit()} functions described below. The values of
these symbols are exactly the constants used by C programs.

The Unix man page for @code{getrlimit(2)@footnote{https://manpages.debian.org/getrlimit(2)}} lists the available resources.
Note that not all systems use the same symbol or same value to denote the same
resource.  This module does not attempt to mask platform differences — symbols
not defined for a platform will not be available from this module on that
platform.

@geindex RLIMIT_CORE (in module resource)
@anchor{library/resource resource RLIMIT_CORE}@anchor{4a5d}
@deffn {Data} resource.RLIMIT_CORE

The maximum size (in bytes) of a core file that the current process can create.
This may result in the creation of a partial core file if a larger core would be
required to contain the entire process image.
@end deffn

@geindex RLIMIT_CPU (in module resource)
@anchor{library/resource resource RLIMIT_CPU}@anchor{5154}
@deffn {Data} resource.RLIMIT_CPU

The maximum amount of processor time (in seconds) that a process can use. If
this limit is exceeded, a @ref{3af5,,SIGXCPU} signal is sent to the process. (See
the @ref{cb,,signal} module documentation for information about how to catch this
signal and do something useful, e.g. flush open files to disk.)
@end deffn

@geindex RLIMIT_FSIZE (in module resource)
@anchor{library/resource resource RLIMIT_FSIZE}@anchor{5155}
@deffn {Data} resource.RLIMIT_FSIZE

The maximum size of a file which the process may create.
@end deffn

@geindex RLIMIT_DATA (in module resource)
@anchor{library/resource resource RLIMIT_DATA}@anchor{5156}
@deffn {Data} resource.RLIMIT_DATA

The maximum size (in bytes) of the process’s heap.
@end deffn

@geindex RLIMIT_STACK (in module resource)
@anchor{library/resource resource RLIMIT_STACK}@anchor{5157}
@deffn {Data} resource.RLIMIT_STACK

The maximum size (in bytes) of the call stack for the current process.  This only
affects the stack of the main thread in a multi-threaded process.
@end deffn

@geindex RLIMIT_RSS (in module resource)
@anchor{library/resource resource RLIMIT_RSS}@anchor{5158}
@deffn {Data} resource.RLIMIT_RSS

The maximum resident set size that should be made available to the process.
@end deffn

@geindex RLIMIT_NPROC (in module resource)
@anchor{library/resource resource RLIMIT_NPROC}@anchor{5159}
@deffn {Data} resource.RLIMIT_NPROC

The maximum number of processes the current process may create.
@end deffn

@geindex RLIMIT_NOFILE (in module resource)
@anchor{library/resource resource RLIMIT_NOFILE}@anchor{5153}
@deffn {Data} resource.RLIMIT_NOFILE

The maximum number of open file descriptors for the current process.
@end deffn

@geindex RLIMIT_OFILE (in module resource)
@anchor{library/resource resource RLIMIT_OFILE}@anchor{515a}
@deffn {Data} resource.RLIMIT_OFILE

The BSD name for @ref{5153,,RLIMIT_NOFILE}.
@end deffn

@geindex RLIMIT_MEMLOCK (in module resource)
@anchor{library/resource resource RLIMIT_MEMLOCK}@anchor{515b}
@deffn {Data} resource.RLIMIT_MEMLOCK

The maximum address space which may be locked in memory.
@end deffn

@geindex RLIMIT_VMEM (in module resource)
@anchor{library/resource resource RLIMIT_VMEM}@anchor{515c}
@deffn {Data} resource.RLIMIT_VMEM

The largest area of mapped memory which the process may occupy.
Usually an alias of @ref{515d,,RLIMIT_AS}.

@ref{2181,,Availability}: Solaris, FreeBSD, NetBSD.
@end deffn

@geindex RLIMIT_AS (in module resource)
@anchor{library/resource resource RLIMIT_AS}@anchor{515d}
@deffn {Data} resource.RLIMIT_AS

The maximum area (in bytes) of address space which may be taken by the process.
@end deffn

@geindex RLIMIT_MSGQUEUE (in module resource)
@anchor{library/resource resource RLIMIT_MSGQUEUE}@anchor{1191}
@deffn {Data} resource.RLIMIT_MSGQUEUE

The number of bytes that can be allocated for POSIX message queues.

@ref{2181,,Availability}: Linux >= 2.6.8.


Added in version 3.4.

@end deffn

@geindex RLIMIT_NICE (in module resource)
@anchor{library/resource resource RLIMIT_NICE}@anchor{1192}
@deffn {Data} resource.RLIMIT_NICE

The ceiling for the process’s nice level (calculated as 20 - rlim_cur).

@ref{2181,,Availability}: Linux >= 2.6.12.


Added in version 3.4.

@end deffn

@geindex RLIMIT_RTPRIO (in module resource)
@anchor{library/resource resource RLIMIT_RTPRIO}@anchor{1193}
@deffn {Data} resource.RLIMIT_RTPRIO

The ceiling of the real-time priority.

@ref{2181,,Availability}: Linux >= 2.6.12.


Added in version 3.4.

@end deffn

@geindex RLIMIT_RTTIME (in module resource)
@anchor{library/resource resource RLIMIT_RTTIME}@anchor{1194}
@deffn {Data} resource.RLIMIT_RTTIME

The time limit (in microseconds) on CPU time that a process can spend
under real-time scheduling without making a blocking syscall.

@ref{2181,,Availability}: Linux >= 2.6.25.


Added in version 3.4.

@end deffn

@geindex RLIMIT_SIGPENDING (in module resource)
@anchor{library/resource resource RLIMIT_SIGPENDING}@anchor{1195}
@deffn {Data} resource.RLIMIT_SIGPENDING

The number of signals which the process may queue.

@ref{2181,,Availability}: Linux >= 2.6.8.


Added in version 3.4.

@end deffn

@geindex RLIMIT_SBSIZE (in module resource)
@anchor{library/resource resource RLIMIT_SBSIZE}@anchor{1196}
@deffn {Data} resource.RLIMIT_SBSIZE

The maximum size (in bytes) of socket buffer usage for this user.
This limits the amount of network memory, and hence the amount of mbufs,
that this user may hold at any time.

@ref{2181,,Availability}: FreeBSD, NetBSD.


Added in version 3.4.

@end deffn

@geindex RLIMIT_SWAP (in module resource)
@anchor{library/resource resource RLIMIT_SWAP}@anchor{1197}
@deffn {Data} resource.RLIMIT_SWAP

The maximum size (in bytes) of the swap space that may be reserved or
used by all of this user id’s processes.
This limit is enforced only if bit 1 of the vm.overcommit sysctl is set.
Please see
tuning(7)@footnote{https://man.freebsd.org/cgi/man.cgi?query=tuning&sektion=7}
for a complete description of this sysctl.

@ref{2181,,Availability}: FreeBSD >= 8.


Added in version 3.4.

@end deffn

@geindex RLIMIT_NPTS (in module resource)
@anchor{library/resource resource RLIMIT_NPTS}@anchor{1198}
@deffn {Data} resource.RLIMIT_NPTS

The maximum number of pseudo-terminals created by this user id.

@ref{2181,,Availability}: FreeBSD >= 8.


Added in version 3.4.

@end deffn

@geindex RLIMIT_KQUEUES (in module resource)
@anchor{library/resource resource RLIMIT_KQUEUES}@anchor{1ce7}
@deffn {Data} resource.RLIMIT_KQUEUES

The maximum number of kqueues this user id is allowed to create.

@ref{2181,,Availability}: FreeBSD >= 11.


Added in version 3.10.

@end deffn

@node Resource Usage,,Resource Limits,resource — Resource usage information
@anchor{library/resource resource-usage}@anchor{515e}
@subsubsection Resource Usage


These functions are used to retrieve resource usage information:

@geindex getrusage() (in module resource)
@anchor{library/resource resource getrusage}@anchor{163d}
@deffn {Function} resource.getrusage (who)

This function returns an object that describes the resources consumed by either
the current process or its children, as specified by the `who' parameter.  The
`who' parameter should be specified using one of the @code{RUSAGE_*}
constants described below.

A simple example:

@example
from resource import *
import time

# a non CPU-bound task
time.sleep(3)
print(getrusage(RUSAGE_SELF))

# a CPU-bound task
for i in range(10 ** 8):
   _ = 1 + 1
print(getrusage(RUSAGE_SELF))
@end example

The fields of the return value each describe how a particular system resource
has been used, e.g. amount of time spent running in user mode or number of times
the process was swapped out of main memory. Some values are dependent on the
clock tick interval, e.g. the amount of memory the process is using.

For backward compatibility, the return value is also accessible as a tuple of 16
elements.

The fields @code{ru_utime} and @code{ru_stime} of the return value are
floating-point values representing the amount of time spent executing in user
mode and the amount of time spent executing in system mode, respectively. The
remaining values are integers. Consult the @code{getrusage(2)@footnote{https://manpages.debian.org/getrusage(2)}} man page for
detailed information about these values. A brief summary is presented here:


@multitable {xxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Index

@tab

Field

@tab

Resource

@item

@code{0}

@tab

@code{ru_utime}

@tab

time in user mode (float seconds)

@item

@code{1}

@tab

@code{ru_stime}

@tab

time in system mode (float seconds)

@item

@code{2}

@tab

@code{ru_maxrss}

@tab

maximum resident set size

@item

@code{3}

@tab

@code{ru_ixrss}

@tab

shared memory size

@item

@code{4}

@tab

@code{ru_idrss}

@tab

unshared memory size

@item

@code{5}

@tab

@code{ru_isrss}

@tab

unshared stack size

@item

@code{6}

@tab

@code{ru_minflt}

@tab

page faults not requiring I/O

@item

@code{7}

@tab

@code{ru_majflt}

@tab

page faults requiring I/O

@item

@code{8}

@tab

@code{ru_nswap}

@tab

number of swap outs

@item

@code{9}

@tab

@code{ru_inblock}

@tab

block input operations

@item

@code{10}

@tab

@code{ru_oublock}

@tab

block output operations

@item

@code{11}

@tab

@code{ru_msgsnd}

@tab

messages sent

@item

@code{12}

@tab

@code{ru_msgrcv}

@tab

messages received

@item

@code{13}

@tab

@code{ru_nsignals}

@tab

signals received

@item

@code{14}

@tab

@code{ru_nvcsw}

@tab

voluntary context switches

@item

@code{15}

@tab

@code{ru_nivcsw}

@tab

involuntary context switches

@end multitable


This function will raise a @ref{2ee,,ValueError} if an invalid `who' parameter is
specified. It may also raise @ref{5151,,error} exception in unusual circumstances.
@end deffn

@geindex getpagesize() (in module resource)
@anchor{library/resource resource getpagesize}@anchor{515f}
@deffn {Function} resource.getpagesize ()

Returns the number of bytes in a system page. (This need not be the same as the
hardware page size.)
@end deffn

The following @code{RUSAGE_*} symbols are passed to the @ref{163d,,getrusage()}
function to specify which processes information should be provided for.

@geindex RUSAGE_SELF (in module resource)
@anchor{library/resource resource RUSAGE_SELF}@anchor{5160}
@deffn {Data} resource.RUSAGE_SELF

Pass to @ref{163d,,getrusage()} to request resources consumed by the calling
process, which is the sum of resources used by all threads in the process.
@end deffn

@geindex RUSAGE_CHILDREN (in module resource)
@anchor{library/resource resource RUSAGE_CHILDREN}@anchor{5161}
@deffn {Data} resource.RUSAGE_CHILDREN

Pass to @ref{163d,,getrusage()} to request resources consumed by child processes
of the calling process which have been terminated and waited for.
@end deffn

@geindex RUSAGE_BOTH (in module resource)
@anchor{library/resource resource RUSAGE_BOTH}@anchor{5162}
@deffn {Data} resource.RUSAGE_BOTH

Pass to @ref{163d,,getrusage()} to request resources consumed by both the current
process and child processes.  May not be available on all systems.
@end deffn

@geindex RUSAGE_THREAD (in module resource)
@anchor{library/resource resource RUSAGE_THREAD}@anchor{5163}
@deffn {Data} resource.RUSAGE_THREAD

Pass to @ref{163d,,getrusage()} to request resources consumed by the current
thread.  May not be available on all systems.


Added in version 3.2.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node syslog — Unix syslog library routines,,resource — Resource usage information,Unix-specific services
@anchor{library/syslog doc}@anchor{5164}@anchor{library/syslog module-syslog}@anchor{e2}@anchor{library/syslog syslog-unix-syslog-library-routines}@anchor{5165}@anchor{library/syslog translation-repo}@anchor{5166}
@subsection @code{syslog} — Unix syslog library routines


@geindex module; syslog


__________________________________________________________________


This module provides an interface to the Unix @code{syslog} library routines.
Refer to the Unix manual pages for a detailed description of the @code{syslog}
facility.

@ref{2181,,Availability}: Unix, not WASI, not iOS.

This module wraps the system @code{syslog} family of routines.  A pure Python
library that can speak to a syslog server is available in the
@ref{8d,,logging.handlers} module as @ref{86e,,SysLogHandler}.

The module defines the following functions:

@geindex syslog() (in module syslog)
@anchor{library/syslog syslog syslog}@anchor{763}
@deffn {Function} syslog.syslog (message)

@deffnx {Function} syslog.syslog (priority, message)

Send the string `message' to the system logger.  A trailing newline is added
if necessary.  Each message is tagged with a priority composed of a
`facility' and a `level'.  The optional `priority' argument, which defaults
to @ref{5167,,LOG_INFO}, determines the message priority.  If the facility is
not encoded in `priority' using logical-or (@code{LOG_INFO | LOG_USER}), the
value given in the @ref{761,,openlog()} call is used.

If @ref{761,,openlog()} has not been called prior to the call to @code{syslog()},
@code{openlog()} will be called with no arguments.

Raises an @ref{1cb1,,auditing event} @code{syslog.syslog} with arguments @code{priority}, @code{message}.


Changed in version 3.2: In previous versions, @ref{761,,openlog()} would not be called automatically if
it wasn’t called prior to the call to @code{syslog()}, deferring to the syslog
implementation to call @code{openlog()}.



Changed in version 3.12: This function is restricted in subinterpreters.
(Only code that runs in multiple interpreters is affected and
the restriction is not relevant for most users.)
@ref{761,,openlog()} must be called in the main interpreter before @code{syslog()} may be used
in a subinterpreter.  Otherwise it will raise @ref{246,,RuntimeError}.

@end deffn

@geindex openlog() (in module syslog)
@anchor{library/syslog syslog openlog}@anchor{761}
@deffn {Function} syslog.openlog ([ident[, logoption[, facility]]])

Logging options of subsequent @ref{e2,,syslog()} calls can be set by calling
@code{openlog()}.  @code{syslog()} will call @code{openlog()} with no arguments
if the log is not currently open.

The optional `ident' keyword argument is a string which is prepended to every
message, and defaults to @code{sys.argv[0]} with leading path components
stripped.  The optional `logoption' keyword argument (default is 0) is a bit
field – see below for possible values to combine.  The optional `facility'
keyword argument (default is @ref{5168,,LOG_USER}) sets the default facility for
messages which do not have a facility explicitly encoded.

Raises an @ref{1cb1,,auditing event} @code{syslog.openlog} with arguments @code{ident}, @code{logoption}, @code{facility}.


Changed in version 3.2: In previous versions, keyword arguments were not allowed, and `ident' was
required.



Changed in version 3.12: This function is restricted in subinterpreters.
(Only code that runs in multiple interpreters is affected and
the restriction is not relevant for most users.)
This may only be called in the main interpreter.
It will raise @ref{246,,RuntimeError} if called in a subinterpreter.

@end deffn

@geindex closelog() (in module syslog)
@anchor{library/syslog syslog closelog}@anchor{762}
@deffn {Function} syslog.closelog ()

Reset the syslog module values and call the system library @code{closelog()}.

This causes the module to behave as it does when initially imported.  For
example, @ref{761,,openlog()} will be called on the first @ref{e2,,syslog()} call (if
@code{openlog()} hasn’t already been called), and `ident' and other
@code{openlog()} parameters are reset to defaults.

Raises an @ref{1cb1,,auditing event} @code{syslog.closelog} with no arguments.


Changed in version 3.12: This function is restricted in subinterpreters.
(Only code that runs in multiple interpreters is affected and
the restriction is not relevant for most users.)
This may only be called in the main interpreter.
It will raise @ref{246,,RuntimeError} if called in a subinterpreter.

@end deffn

@geindex setlogmask() (in module syslog)
@anchor{library/syslog syslog setlogmask}@anchor{4ac2}
@deffn {Function} syslog.setlogmask (maskpri)

Set the priority mask to `maskpri' and return the previous mask value.  Calls
to @ref{e2,,syslog()} with a priority level not set in `maskpri' are ignored.
The default is to log all priorities.  The function @code{LOG_MASK(pri)}
calculates the mask for the individual priority `pri'.  The function
@code{LOG_UPTO(pri)} calculates the mask for all priorities up to and including
`pri'.

Raises an @ref{1cb1,,auditing event} @code{syslog.setlogmask} with argument @code{maskpri}.
@end deffn

The module defines the following constants:

@geindex LOG_EMERG (in module syslog)
@geindex LOG_ALERT (in module syslog)
@geindex LOG_CRIT (in module syslog)
@geindex LOG_ERR (in module syslog)
@geindex LOG_WARNING (in module syslog)
@geindex LOG_NOTICE (in module syslog)
@geindex LOG_INFO (in module syslog)
@geindex LOG_DEBUG (in module syslog)
@anchor{library/syslog syslog LOG_EMERG}@anchor{5169}
@deffn {Data} syslog.LOG_EMERG
@anchor{library/syslog syslog LOG_ALERT}@anchor{516a}
@deffnx {Data} syslog.LOG_ALERT
@anchor{library/syslog syslog LOG_CRIT}@anchor{516b}
@deffnx {Data} syslog.LOG_CRIT
@anchor{library/syslog syslog LOG_ERR}@anchor{516c}
@deffnx {Data} syslog.LOG_ERR
@anchor{library/syslog syslog LOG_WARNING}@anchor{516d}
@deffnx {Data} syslog.LOG_WARNING
@anchor{library/syslog syslog LOG_NOTICE}@anchor{516e}
@deffnx {Data} syslog.LOG_NOTICE
@anchor{library/syslog syslog LOG_INFO}@anchor{5167}
@deffnx {Data} syslog.LOG_INFO
@anchor{library/syslog syslog LOG_DEBUG}@anchor{516f}
@deffnx {Data} syslog.LOG_DEBUG

Priority levels (high to low).
@end deffn

@geindex LOG_AUTH (in module syslog)
@geindex LOG_AUTHPRIV (in module syslog)
@geindex LOG_CRON (in module syslog)
@geindex LOG_DAEMON (in module syslog)
@geindex LOG_FTP (in module syslog)
@geindex LOG_INSTALL (in module syslog)
@geindex LOG_KERN (in module syslog)
@geindex LOG_LAUNCHD (in module syslog)
@geindex LOG_LPR (in module syslog)
@geindex LOG_MAIL (in module syslog)
@geindex LOG_NETINFO (in module syslog)
@geindex LOG_NEWS (in module syslog)
@geindex LOG_RAS (in module syslog)
@geindex LOG_REMOTEAUTH (in module syslog)
@geindex LOG_SYSLOG (in module syslog)
@geindex LOG_USER (in module syslog)
@geindex LOG_UUCP (in module syslog)
@geindex LOG_LOCAL0 (in module syslog)
@geindex LOG_LOCAL1 (in module syslog)
@geindex LOG_LOCAL2 (in module syslog)
@geindex LOG_LOCAL3 (in module syslog)
@geindex LOG_LOCAL4 (in module syslog)
@geindex LOG_LOCAL5 (in module syslog)
@geindex LOG_LOCAL6 (in module syslog)
@geindex LOG_LOCAL7 (in module syslog)
@anchor{library/syslog syslog LOG_AUTH}@anchor{5170}
@deffn {Data} syslog.LOG_AUTH
@anchor{library/syslog syslog LOG_AUTHPRIV}@anchor{5171}
@deffnx {Data} syslog.LOG_AUTHPRIV
@anchor{library/syslog syslog LOG_CRON}@anchor{5172}
@deffnx {Data} syslog.LOG_CRON
@anchor{library/syslog syslog LOG_DAEMON}@anchor{5173}
@deffnx {Data} syslog.LOG_DAEMON
@anchor{library/syslog syslog LOG_FTP}@anchor{5174}
@deffnx {Data} syslog.LOG_FTP
@anchor{library/syslog syslog LOG_INSTALL}@anchor{5175}
@deffnx {Data} syslog.LOG_INSTALL
@anchor{library/syslog syslog LOG_KERN}@anchor{5176}
@deffnx {Data} syslog.LOG_KERN
@anchor{library/syslog syslog LOG_LAUNCHD}@anchor{5177}
@deffnx {Data} syslog.LOG_LAUNCHD
@anchor{library/syslog syslog LOG_LPR}@anchor{5178}
@deffnx {Data} syslog.LOG_LPR
@anchor{library/syslog syslog LOG_MAIL}@anchor{5179}
@deffnx {Data} syslog.LOG_MAIL
@anchor{library/syslog syslog LOG_NETINFO}@anchor{517a}
@deffnx {Data} syslog.LOG_NETINFO
@anchor{library/syslog syslog LOG_NEWS}@anchor{517b}
@deffnx {Data} syslog.LOG_NEWS
@anchor{library/syslog syslog LOG_RAS}@anchor{517c}
@deffnx {Data} syslog.LOG_RAS
@anchor{library/syslog syslog LOG_REMOTEAUTH}@anchor{517d}
@deffnx {Data} syslog.LOG_REMOTEAUTH
@anchor{library/syslog syslog LOG_SYSLOG}@anchor{517e}
@deffnx {Data} syslog.LOG_SYSLOG
@anchor{library/syslog syslog LOG_USER}@anchor{5168}
@deffnx {Data} syslog.LOG_USER
@anchor{library/syslog syslog LOG_UUCP}@anchor{517f}
@deffnx {Data} syslog.LOG_UUCP
@anchor{library/syslog syslog LOG_LOCAL0}@anchor{5180}
@deffnx {Data} syslog.LOG_LOCAL0
@anchor{library/syslog syslog LOG_LOCAL1}@anchor{5181}
@deffnx {Data} syslog.LOG_LOCAL1
@anchor{library/syslog syslog LOG_LOCAL2}@anchor{5182}
@deffnx {Data} syslog.LOG_LOCAL2
@anchor{library/syslog syslog LOG_LOCAL3}@anchor{5183}
@deffnx {Data} syslog.LOG_LOCAL3
@anchor{library/syslog syslog LOG_LOCAL4}@anchor{5184}
@deffnx {Data} syslog.LOG_LOCAL4
@anchor{library/syslog syslog LOG_LOCAL5}@anchor{5185}
@deffnx {Data} syslog.LOG_LOCAL5
@anchor{library/syslog syslog LOG_LOCAL6}@anchor{5186}
@deffnx {Data} syslog.LOG_LOCAL6
@anchor{library/syslog syslog LOG_LOCAL7}@anchor{5187}
@deffnx {Data} syslog.LOG_LOCAL7

Facilities, depending on availability in @code{<syslog.h>} for @ref{5171,,LOG_AUTHPRIV},
@ref{5174,,LOG_FTP}, @ref{517a,,LOG_NETINFO}, @ref{517d,,LOG_REMOTEAUTH},
@ref{5175,,LOG_INSTALL} and @ref{517c,,LOG_RAS}.


Changed in version 3.13: Added @ref{5174,,LOG_FTP}, @ref{517a,,LOG_NETINFO}, @ref{517d,,LOG_REMOTEAUTH},
@ref{5175,,LOG_INSTALL}, @ref{517c,,LOG_RAS}, and @ref{5177,,LOG_LAUNCHD}.

@end deffn

@geindex LOG_PID (in module syslog)
@geindex LOG_CONS (in module syslog)
@geindex LOG_NDELAY (in module syslog)
@geindex LOG_ODELAY (in module syslog)
@geindex LOG_NOWAIT (in module syslog)
@geindex LOG_PERROR (in module syslog)
@anchor{library/syslog syslog LOG_PID}@anchor{5188}
@deffn {Data} syslog.LOG_PID
@anchor{library/syslog syslog LOG_CONS}@anchor{5189}
@deffnx {Data} syslog.LOG_CONS
@anchor{library/syslog syslog LOG_NDELAY}@anchor{518a}
@deffnx {Data} syslog.LOG_NDELAY
@anchor{library/syslog syslog LOG_ODELAY}@anchor{518b}
@deffnx {Data} syslog.LOG_ODELAY
@anchor{library/syslog syslog LOG_NOWAIT}@anchor{518c}
@deffnx {Data} syslog.LOG_NOWAIT
@anchor{library/syslog syslog LOG_PERROR}@anchor{518d}
@deffnx {Data} syslog.LOG_PERROR

Log options, depending on availability in @code{<syslog.h>} for
@ref{518b,,LOG_ODELAY}, @ref{518c,,LOG_NOWAIT} and @ref{518d,,LOG_PERROR}.
@end deffn

@menu
* Examples: Examples<37>. 

@end menu

@node Examples<37>,,,syslog — Unix syslog library routines
@anchor{library/syslog examples}@anchor{518e}
@subsubsection Examples


@menu
* Simple example:: 

@end menu

@node Simple example,,,Examples<37>
@anchor{library/syslog simple-example}@anchor{518f}
@subsubsection Simple example


A simple set of examples:

@example
import syslog

syslog.syslog('Processing started')
if error:
    syslog.syslog(syslog.LOG_ERR, 'Processing started')
@end example

An example of setting some log options, these would include the process ID in
logged messages, and write the messages to the destination facility used for
mail logging:

@example
syslog.openlog(logoption=syslog.LOG_PID, facility=syslog.LOG_MAIL)
syslog.syslog('E-mail processing initiated...')
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Modules command-line interface CLI,Superseded Modules,Unix-specific services,The Python Standard Library
@anchor{library/cmdline doc}@anchor{5190}@anchor{library/cmdline library-cmdline}@anchor{5191}@anchor{library/cmdline modules-command-line-interface-cli}@anchor{5192}@anchor{library/cmdline translation-repo}@anchor{5193}
@section Modules command-line interface (CLI)


The following modules have a command-line interface.


@itemize *

@item 
@ref{4f3b,,ast}

@item 
@ref{383a,,asyncio}

@item 
@ref{f,,base64}

@item 
@ref{1d2,,calendar}

@item 
@ref{1b,,code}

@item 
@ref{4ff8,,compileall}

@item 
@ref{2b,,cProfile}: see @ref{4b5e,,profile}

@item 
@ref{500f,,dis}

@item 
@ref{48b7,,doctest}

@item 
@code{encodings.rot_13}

@item 
@ref{4c08,,ensurepip}

@item 
@ref{5e,,filecmp}

@item 
@ref{5f,,fileinput}

@item 
@ref{62,,ftplib}

@item 
@ref{2eca,,gzip}

@item 
@ref{1157,,http.server}

@item 
@ref{4768,,idlelib}

@item 
@ref{1161,,inspect}

@item 
@ref{240,,json}

@item 
@ref{249,,mimetypes}

@item 
@ref{2e4,,pdb}

@item 
@ref{2d9f,,pickle}

@item 
@ref{2da0,,pickletools}

@item 
@ref{32b7,,platform}

@item 
@ref{b1,,poplib}

@item 
@ref{4b5e,,profile}

@item 
@ref{b5,,pstats}

@item 
@ref{4fef,,py_compile}

@item 
@ref{b9,,pyclbr}

@item 
@ref{ba,,pydoc}

@item 
@ref{bc,,quopri}

@item 
@ref{47f,,random}

@item 
@ref{c3,,runpy}

@item 
@ref{4e0e,,site}

@item 
@ref{674,,sqlite3}

@item 
@ref{4f72,,symtable}

@item 
@ref{4cd3,,sysconfig}

@item 
@ref{e3,,tabnanny}

@item 
@ref{11d1,,tarfile}

@item 
@code{this}

@item 
@ref{4b82,,timeit}

@item 
@ref{4fc0,,tokenize}

@item 
@ref{4b9f,,trace}

@item 
@ref{109,,turtledemo}

@item 
@ref{4930,,unittest}

@item 
@ref{676,,uuid}

@item 
@ref{4c16,,venv}

@item 
@ref{3f46,,webbrowser}

@item 
@ref{4c30,,zipapp}

@item 
@ref{2f39,,zipfile}
@end itemize

See also the @ref{1dea,,Python command-line interface}.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Superseded Modules,Removed Modules,Modules command-line interface CLI,The Python Standard Library
@anchor{library/superseded doc}@anchor{5194}@anchor{library/superseded superseded}@anchor{5195}@anchor{library/superseded superseded-modules}@anchor{5196}@anchor{library/superseded translation-repo}@anchor{5197}
@section Superseded Modules


The modules described in this chapter have been superseded by other modules
for most use cases, and are retained primarily to preserve backwards compatibility.

Modules may appear in this chapter because they only cover a limited subset of
a problem space, and a more generally applicable solution is available elsewhere
in the standard library (for example, @ref{65,,getopt} covers the very specific
task of “mimic the C @code{getopt()} API in Python”, rather than the broader
command line option parsing and argument parsing capabilities offered by
@ref{a4,,optparse} and @ref{7,,argparse}).

Alternatively, modules may appear in this chapter because they are deprecated
outright, and awaiting removal in a future release, or they are
@ref{23f,,soft deprecated} and their use is actively discouraged in new projects.
With the removal of various obsolete modules through 
@geindex Python Enhancement Proposals; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}, there are
currently no modules in this latter category.

@menu
* getopt — C-style parser for command line options:: 

@end menu

@node getopt — C-style parser for command line options,,,Superseded Modules
@anchor{library/getopt doc}@anchor{5198}@anchor{library/getopt getopt-c-style-parser-for-command-line-options}@anchor{5199}@anchor{library/getopt module-getopt}@anchor{65}
@subsection @code{getopt} — C-style parser for command line options


@geindex module; getopt

`Source code:' Lib/getopt.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/getopt.py}

@cartouche
@quotation Note 
This module is considered feature complete. A more declarative and
extensible alternative to this API is provided in the @ref{a4,,optparse}
module. Further functional enhancements for command line parameter
processing are provided either as third party modules on PyPI,
or else as features in the @ref{7,,argparse} module.
@end quotation
@end cartouche


__________________________________________________________________


This module helps scripts to parse the command line arguments in @code{sys.argv}.
It supports the same conventions as the Unix @code{getopt()} function (including
the special meanings of arguments of the form ‘@code{-}’ and ‘@code{--}‘).  Long
options similar to those supported by GNU software may be used as well via an
optional third argument.

Users who are unfamiliar with the Unix @code{getopt()} function should consider
using the @ref{7,,argparse} module instead. Users who are familiar with the Unix
@code{getopt()} function, but would like to get equivalent behavior while
writing less code and getting better help and error messages should consider
using the @ref{a4,,optparse} module. See @ref{33e6,,Choosing an argument parsing library} for
additional details.

This module provides two functions and an
exception:

@geindex getopt() (in module getopt)
@anchor{library/getopt getopt getopt}@anchor{16c7}
@deffn {Function} getopt.getopt (args, shortopts, longopts=[])

Parses command line options and parameter list.  `args' is the argument list to
be parsed, without the leading reference to the running program. Typically, this
means @code{sys.argv[1:]}. `shortopts' is the string of option letters that the
script wants to recognize, with options that require an argument followed by a
colon (@code{':'}) and options that accept an optional argument followed by
two colons (@code{'::'}); i.e., the same format that Unix @code{getopt()} uses.

@cartouche
@quotation Note 
Unlike GNU @code{getopt()}, after a non-option argument, all further
arguments are considered also non-options. This is similar to the way
non-GNU Unix systems work.
@end quotation
@end cartouche

`longopts', if specified, must be a list of strings with the names of the
long options which should be supported.  The leading @code{'--'} characters
should not be included in the option name.  Long options which require an
argument should be followed by an equal sign (@code{'='}).
Long options which accept an optional argument should be followed by
an equal sign and question mark (@code{'=?'}).
To accept only long options, `shortopts' should be an
empty string.  Long options on the command line can be recognized so long as
they provide a prefix of the option name that matches exactly one of the
accepted options.  For example, if `longopts' is @code{['foo', 'frob']}, the
option @code{--fo} will match as @code{--foo}, but @code{--f} will
not match uniquely, so @ref{1930,,GetoptError} will be raised.

The return value consists of two elements: the first is a list of @code{(option,
value)} pairs; the second is the list of program arguments left after the
option list was stripped (this is a trailing slice of `args').  Each
option-and-value pair returned has the option as its first element, prefixed
with a hyphen for short options (e.g., @code{'-x'}) or two hyphens for long
options (e.g., @code{'--long-option'}), and the option argument as its
second element, or an empty string if the option has no argument.  The
options occur in the list in the same order in which they were found, thus
allowing multiple occurrences.  Long and short options may be mixed.


Changed in version 3.14: Optional arguments are supported.

@end deffn

@geindex gnu_getopt() (in module getopt)
@anchor{library/getopt getopt gnu_getopt}@anchor{16c6}
@deffn {Function} getopt.gnu_getopt (args, shortopts, longopts=[])

This function works like @ref{65,,getopt()}, except that GNU style scanning mode is
used by default. This means that option and non-option arguments may be
intermixed. The @code{getopt()} function stops processing options as soon as a
non-option argument is encountered.

If the first character of the option string is @code{'+'}, or if the environment
variable @code{POSIXLY_CORRECT} is set, then option processing stops as
soon as a non-option argument is encountered.

If the first character of the option string is @code{'-'}, non-option arguments
that are followed by options are added to the list of option-and-value pairs
as a pair that has @code{None} as its first element and the list of non-option
arguments as its second element.
The second element of the @code{gnu_getopt()} result is a list of
program arguments after the last option.


Changed in version 3.14: Support for returning intermixed options and non-option arguments in order.

@end deffn

@geindex GetoptError
@anchor{library/getopt getopt GetoptError}@anchor{1930}
@deffn {Exception} getopt.GetoptError

This is raised when an unrecognized option is found in the argument list or when
an option requiring an argument is given none. The argument to the exception is
a string indicating the cause of the error.  For long options, an argument given
to an option which does not require one will also cause this exception to be
raised.  The attributes @code{msg} and @code{opt} give the error message and
related option; if there is no specific option to which the exception relates,
@code{opt} is an empty string.
@end deffn

@c XXX deprecated?

@geindex error
@anchor{library/getopt getopt error}@anchor{519a}
@deffn {Exception} getopt.error

Alias for @ref{1930,,GetoptError}; for backward compatibility.
@end deffn

An example using only Unix style options:

@example
>>> import getopt
>>> args = '-a -b -cfoo -d bar a1 a2'.split()
>>> args
['-a', '-b', '-cfoo', '-d', 'bar', 'a1', 'a2']
>>> optlist, args = getopt.getopt(args, 'abc:d:')
>>> optlist
[('-a', '@w{'}), ('-b', '@w{'}), ('-c', 'foo'), ('-d', 'bar')]
>>> args
['a1', 'a2']
@end example

Using long option names is equally easy:

@example
>>> s = '--condition=foo --testing --output-file abc.def -x a1 a2'
>>> args = s.split()
>>> args
['--condition=foo', '--testing', '--output-file', 'abc.def', '-x', 'a1', 'a2']
>>> optlist, args = getopt.getopt(args, 'x', [
...     'condition=', 'output-file=', 'testing'])
>>> optlist
[('--condition', 'foo'), ('--testing', '@w{'}), ('--output-file', 'abc.def'), ('-x', '@w{'})]
>>> args
['a1', 'a2']
@end example

Optional arguments should be specified explicitly:

@example
>>> s = '-Con -C --color=off --color a1 a2'
>>> args = s.split()
>>> args
['-Con', '-C', '--color=off', '--color', 'a1', 'a2']
>>> optlist, args = getopt.getopt(args, 'C::', ['color=?'])
>>> optlist
[('-C', 'on'), ('-C', '@w{'}), ('--color', 'off'), ('--color', '@w{'})]
>>> args
['a1', 'a2']
@end example

The order of options and non-option arguments can be preserved:

@example
>>> s = 'a1 -x a2 a3 a4 --long a5 a6'
>>> args = s.split()
>>> args
['a1', '-x', 'a2', 'a3', 'a4', '--long', 'a5', 'a6']
>>> optlist, args = getopt.gnu_getopt(args, '-x:', ['long='])
>>> optlist
[(None, ['a1']), ('-x', 'a2'), (None, ['a3', 'a4']), ('--long', 'a5')]
>>> args
['a6']
@end example

In a script, typical usage is something like this:

@example
import getopt, sys

def main():
    try:
        opts, args = getopt.getopt(sys.argv[1:], "ho:v", ["help", "output="])
    except getopt.GetoptError as err:
        # print help information and exit:
        print(err)  # will print something like "option -a not recognized"
        usage()
        sys.exit(2)
    output = None
    verbose = False
    for o, a in opts:
        if o == "-v":
            verbose = True
        elif o in ("-h", "--help"):
            usage()
            sys.exit()
        elif o in ("-o", "--output"):
            output = a
        else:
            assert False, "unhandled option"
    process(args, output=output, verbose=verbose)

if __name__ == "__main__":
    main()
@end example

Note that an equivalent command line interface could be produced with less code
and more informative help and error messages by using the @ref{a4,,optparse} module:

@example
import optparse

if __name__ == '__main__':
    parser = optparse.OptionParser()
    parser.add_option('-o', '--output')
    parser.add_option('-v', dest='verbose', action='store_true')
    opts, args = parser.parse_args()
    process(args, output=opts.output, verbose=opts.verbose)
@end example

A roughly equivalent command line interface for this case can also be
produced by using the @ref{7,,argparse} module:

@example
import argparse

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('-o', '--output')
    parser.add_argument('-v', dest='verbose', action='store_true')
    parser.add_argument('rest', nargs='*')
    args = parser.parse_args()
    process(args.rest, output=args.output, verbose=args.verbose)
@end example

See @ref{33e6,,Choosing an argument parsing library} for details on how the @code{argparse}
version of this code differs in behaviour from the @code{optparse} (and
@code{getopt}) version.


@subsubheading See also



@table @asis

@item Module @ref{a4,,optparse}

Declarative command line option parsing.

@item Module @ref{7,,argparse}

More opinionated command line option and argument parsing library.
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Removed Modules,Security Considerations<3>,Superseded Modules,The Python Standard Library
@anchor{library/removed doc}@anchor{519b}@anchor{library/removed removed}@anchor{519c}@anchor{library/removed removed-modules}@anchor{519d}@anchor{library/removed translation-repo}@anchor{519e}
@section Removed Modules


The modules described in this chapter have been removed from the Python
standard library.  They are documented here to help people find replacements.

@menu
* aifc — Read and write AIFF and AIFC files:: 
* asynchat — Asynchronous socket command/response handler:: 
* asyncore — Asynchronous socket handler:: 
* audioop — Manipulate raw audio data:: 
* cgi — Common Gateway Interface support:: 
* cgitb — Traceback manager for CGI scripts:: 
* chunk — Read IFF chunked data:: 
* crypt — Function to check Unix passwords:: 
* distutils — Building and installing Python modules:: 
* imghdr — Determine the type of an image:: 
* imp — Access the import internals:: 
* mailcap — Mailcap file handling:: 
* msilib — Read and write Microsoft Installer files:: 
* nis — Interface to Sun’s NIS (Yellow Pages): nis — Interface to Sun’s NIS Yellow Pages. 
* nntplib — NNTP protocol client:: 
* ossaudiodev — Access to OSS-compatible audio devices:: 
* pipes — Interface to shell pipelines:: 
* smtpd — SMTP Server:: 
* sndhdr — Determine type of sound file:: 
* spwd — The shadow password database:: 
* sunau — Read and write Sun AU files:: 
* telnetlib — Telnet client:: 
* uu — Encode and decode uuencode files:: 
* xdrlib — Encode and decode XDR data:: 

@end menu

@node aifc — Read and write AIFF and AIFC files,asynchat — Asynchronous socket command/response handler,,Removed Modules
@anchor{library/aifc doc}@anchor{519f}@anchor{library/aifc aifc-read-and-write-aiff-and-aifc-files}@anchor{51a0}@anchor{library/aifc module-aifc}@anchor{5}
@subsection @code{aifc} — Read and write AIFF and AIFC files


@geindex module; aifc


Deprecated since version 3.11, removed in version 3.13.


This module is no longer part of the Python standard library.
It was @ref{471,,removed in Python 3.13} after
being deprecated in Python 3.11.  The removal was decided in 
@geindex Python Enhancement Proposals; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}.

The last version of Python that provided the @code{aifc} module was
Python 3.12@footnote{https://docs.python.org/3.12/library/aifc.html}.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node asynchat — Asynchronous socket command/response handler,asyncore — Asynchronous socket handler,aifc — Read and write AIFF and AIFC files,Removed Modules
@anchor{library/asynchat doc}@anchor{51a1}@anchor{library/asynchat asynchat-asynchronous-socket-command-response-handler}@anchor{51a2}@anchor{library/asynchat module-asynchat}@anchor{a}@anchor{library/asynchat translation-repo}@anchor{51a3}
@subsection @code{asynchat} — Asynchronous socket command/response handler


@geindex module; asynchat


Deprecated since version 3.6, removed in version 3.12.


This module is no longer part of the Python standard library.
It was @ref{727,,removed in Python 3.12} after
being deprecated in Python 3.6.  The removal was decided in 
@geindex Python Enhancement Proposals; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}.

Applications should use the @ref{b,,asyncio} module instead.

The last version of Python that provided the @code{asynchat} module was
Python 3.11@footnote{https://docs.python.org/3.11/library/asynchat.html}.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node asyncore — Asynchronous socket handler,audioop — Manipulate raw audio data,asynchat — Asynchronous socket command/response handler,Removed Modules
@anchor{library/asyncore doc}@anchor{51a4}@anchor{library/asyncore asyncore-asynchronous-socket-handler}@anchor{51a5}@anchor{library/asyncore module-asyncore}@anchor{c}@anchor{library/asyncore translation-repo}@anchor{51a6}
@subsection @code{asyncore} — Asynchronous socket handler


@geindex module; asyncore


Deprecated since version 3.6, removed in version 3.12.


This module is no longer part of the Python standard library.
It was @ref{727,,removed in Python 3.12} after
being deprecated in Python 3.6.  The removal was decided in 
@geindex Python Enhancement Proposals; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}.

Applications should use the @ref{b,,asyncio} module instead.

The last version of Python that provided the @code{asyncore} module was
Python 3.11@footnote{https://docs.python.org/3.11/library/asyncore.html}.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node audioop — Manipulate raw audio data,cgi — Common Gateway Interface support,asyncore — Asynchronous socket handler,Removed Modules
@anchor{library/audioop doc}@anchor{51a7}@anchor{library/audioop audioop-manipulate-raw-audio-data}@anchor{51a8}@anchor{library/audioop module-audioop}@anchor{e}@anchor{library/audioop translation-repo}@anchor{51a9}
@subsection @code{audioop} — Manipulate raw audio data


@geindex module; audioop


Deprecated since version 3.11, removed in version 3.13.


This module is no longer part of the Python standard library.
It was @ref{471,,removed in Python 3.13} after
being deprecated in Python 3.11.  The removal was decided in 
@geindex Python Enhancement Proposals; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}.

The last version of Python that provided the @code{audioop} module was
Python 3.12@footnote{https://docs.python.org/3.12/library/audioop.html}.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node cgi — Common Gateway Interface support,cgitb — Traceback manager for CGI scripts,audioop — Manipulate raw audio data,Removed Modules
@anchor{library/cgi doc}@anchor{51aa}@anchor{library/cgi cgi-common-gateway-interface-support}@anchor{51ab}@anchor{library/cgi module-cgi}@anchor{16}@anchor{library/cgi translation-repo}@anchor{51ac}
@subsection @code{cgi} — Common Gateway Interface support


@geindex module; cgi


Deprecated since version 3.11, removed in version 3.13.


This module is no longer part of the Python standard library.
It was @ref{471,,removed in Python 3.13} after
being deprecated in Python 3.11.  The removal was decided in 
@geindex Python Enhancement Proposals; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}.

A fork of the module on PyPI can be used instead: legacy-cgi@footnote{https://pypi.org/project/legacy-cgi/}.
This is a copy of the cgi module, no longer maintained or supported by the core
Python team.

The last version of Python that provided the @code{cgi} module was
Python 3.12@footnote{https://docs.python.org/3.12/library/cgi.html}.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node cgitb — Traceback manager for CGI scripts,chunk — Read IFF chunked data,cgi — Common Gateway Interface support,Removed Modules
@anchor{library/cgitb doc}@anchor{51ad}@anchor{library/cgitb cgitb-traceback-manager-for-cgi-scripts}@anchor{51ae}@anchor{library/cgitb module-cgitb}@anchor{17}@anchor{library/cgitb translation-repo}@anchor{51af}
@subsection @code{cgitb} — Traceback manager for CGI scripts


@geindex module; cgitb


Deprecated since version 3.11, removed in version 3.13.


This module is no longer part of the Python standard library.
It was @ref{471,,removed in Python 3.13} after
being deprecated in Python 3.11.  The removal was decided in 
@geindex Python Enhancement Proposals; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}.

A fork of the module on PyPI can now be used instead: legacy-cgi@footnote{https://pypi.org/project/legacy-cgi/}.
This is a copy of the cgi module, no longer maintained or supported by the core
Python team.

The last version of Python that provided the @code{cgitb} module was
Python 3.12@footnote{https://docs.python.org/3.12/library/cgitb.html}.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node chunk — Read IFF chunked data,crypt — Function to check Unix passwords,cgitb — Traceback manager for CGI scripts,Removed Modules
@anchor{library/chunk doc}@anchor{51b0}@anchor{library/chunk chunk-read-iff-chunked-data}@anchor{51b1}@anchor{library/chunk module-chunk}@anchor{18}@anchor{library/chunk translation-repo}@anchor{51b2}
@subsection @code{chunk} — Read IFF chunked data


@geindex module; chunk


Deprecated since version 3.11, removed in version 3.13.


This module is no longer part of the Python standard library.
It was @ref{471,,removed in Python 3.13} after
being deprecated in Python 3.11.  The removal was decided in 
@geindex Python Enhancement Proposals; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}.

The last version of Python that provided the @code{chunk} module was
Python 3.12@footnote{https://docs.python.org/3.12/library/chunk.html}.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node crypt — Function to check Unix passwords,distutils — Building and installing Python modules,chunk — Read IFF chunked data,Removed Modules
@anchor{library/crypt doc}@anchor{51b3}@anchor{library/crypt crypt-function-to-check-unix-passwords}@anchor{51b4}@anchor{library/crypt module-crypt}@anchor{2c}@anchor{library/crypt translation-repo}@anchor{51b5}
@subsection @code{crypt} — Function to check Unix passwords


@geindex module; crypt


Deprecated since version 3.11, removed in version 3.13.


This module is no longer part of the Python standard library.
It was @ref{471,,removed in Python 3.13} after
being deprecated in Python 3.11.  The removal was decided in 
@geindex Python Enhancement Proposals; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}.

Applications can use the @ref{6c,,hashlib} module from the standard library.
Other possible replacements are third-party libraries from PyPI:
legacycrypt@footnote{https://pypi.org/project/legacycrypt/}, bcrypt@footnote{https://pypi.org/project/bcrypt/}, or argon2-cffi@footnote{https://pypi.org/project/argon2-cffi/}.
These are not supported or maintained by the Python core team.

The last version of Python that provided the @code{crypt} module was
Python 3.12@footnote{https://docs.python.org/3.12/library/crypt.html}.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node distutils — Building and installing Python modules,imghdr — Determine the type of an image,crypt — Function to check Unix passwords,Removed Modules
@anchor{library/distutils doc}@anchor{51b6}@anchor{library/distutils distutils-building-and-installing-python-modules}@anchor{51b7}@anchor{library/distutils module-distutils}@anchor{3d}@anchor{library/distutils translation-repo}@anchor{51b8}
@subsection @code{distutils} — Building and installing Python modules


@geindex module; distutils


Deprecated since version 3.10, removed in version 3.12.


This module is no longer part of the Python standard library.
It was @ref{72d,,removed in Python 3.12} after
being deprecated in Python 3.10.  The removal was decided in 
@geindex Python Enhancement Proposals; PEP 632
PEP 632@footnote{https://peps.python.org/pep-0632/},
which has migration advice@footnote{https://peps.python.org/pep-0632/#migration-advice}.

The last version of Python that provided the @code{distutils} module was
Python 3.11@footnote{https://docs.python.org/3.11/library/distutils.html}.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node imghdr — Determine the type of an image,imp — Access the import internals,distutils — Building and installing Python modules,Removed Modules
@anchor{library/imghdr doc}@anchor{51b9}@anchor{library/imghdr imghdr-determine-the-type-of-an-image}@anchor{51ba}@anchor{library/imghdr module-imghdr}@anchor{79}@anchor{library/imghdr translation-repo}@anchor{51bb}
@subsection @code{imghdr} — Determine the type of an image


@geindex module; imghdr


Deprecated since version 3.11, removed in version 3.13.


This module is no longer part of the Python standard library.
It was @ref{471,,removed in Python 3.13} after
being deprecated in Python 3.11.  The removal was decided in 
@geindex Python Enhancement Proposals; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}.

Possible replacements are third-party libraries from PyPI:
filetype@footnote{https://pypi.org/project/filetype/}, puremagic@footnote{https://pypi.org/project/puremagic/}, or python-magic@footnote{https://pypi.org/project/python-magic/}.
These are not supported or maintained by the Python core team.

The last version of Python that provided the @code{imghdr} module was
Python 3.12@footnote{https://docs.python.org/3.12/library/imghdr.html}.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node imp — Access the import internals,mailcap — Mailcap file handling,imghdr — Determine the type of an image,Removed Modules
@anchor{library/imp doc}@anchor{51bc}@anchor{library/imp imp-access-the-import-internals}@anchor{51bd}@anchor{library/imp module-imp}@anchor{7a}@anchor{library/imp translation-repo}@anchor{51be}
@subsection @code{imp} — Access the import internals


@geindex module; imp


Deprecated since version 3.4, removed in version 3.12.


This module is no longer part of the Python standard library.
It was @ref{737,,removed in Python 3.12} after
being deprecated in Python 3.4.

The @ref{737,,removal notice} includes guidance for
migrating code from @code{imp} to @ref{7b,,importlib}.

The last version of Python that provided the @code{imp} module was
Python 3.11@footnote{https://docs.python.org/3.11/library/imp.html}.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node mailcap — Mailcap file handling,msilib — Read and write Microsoft Installer files,imp — Access the import internals,Removed Modules
@anchor{library/mailcap doc}@anchor{51bf}@anchor{library/mailcap mailcap-mailcap-file-handling}@anchor{51c0}@anchor{library/mailcap module-mailcap}@anchor{90}@anchor{library/mailcap translation-repo}@anchor{51c1}
@subsection @code{mailcap} — Mailcap file handling


@geindex module; mailcap


Deprecated since version 3.11, removed in version 3.13.


This module is no longer part of the Python standard library.
It was @ref{471,,removed in Python 3.13} after
being deprecated in Python 3.11.  The removal was decided in 
@geindex Python Enhancement Proposals; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}.

The last version of Python that provided the @code{mailcap} module was
Python 3.12@footnote{https://docs.python.org/3.12/library/mailcap.html}.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node msilib — Read and write Microsoft Installer files,nis — Interface to Sun’s NIS Yellow Pages,mailcap — Mailcap file handling,Removed Modules
@anchor{library/msilib doc}@anchor{51c2}@anchor{library/msilib module-msilib}@anchor{96}@anchor{library/msilib msilib-read-and-write-microsoft-installer-files}@anchor{51c3}@anchor{library/msilib translation-repo}@anchor{51c4}
@subsection @code{msilib} — Read and write Microsoft Installer files


@geindex module; msilib


Deprecated since version 3.11, removed in version 3.13.


This module is no longer part of the Python standard library.
It was @ref{471,,removed in Python 3.13} after
being deprecated in Python 3.11.  The removal was decided in 
@geindex Python Enhancement Proposals; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}.

The last version of Python that provided the @code{msilib} module was
Python 3.12@footnote{https://docs.python.org/3.12/library/msilib.html}.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node nis — Interface to Sun’s NIS Yellow Pages,nntplib — NNTP protocol client,msilib — Read and write Microsoft Installer files,Removed Modules
@anchor{library/nis doc}@anchor{51c5}@anchor{library/nis module-nis}@anchor{a0}@anchor{library/nis nis-interface-to-suns-nis-yellow-pages}@anchor{51c6}@anchor{library/nis translation-repo}@anchor{51c7}
@subsection @code{nis} — Interface to Sun’s NIS (Yellow Pages)


@geindex module; nis


Deprecated since version 3.11, removed in version 3.13.


This module is no longer part of the Python standard library.
It was @ref{471,,removed in Python 3.13} after
being deprecated in Python 3.11.  The removal was decided in 
@geindex Python Enhancement Proposals; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}.

The last version of Python that provided the @code{nis} module was
Python 3.12@footnote{https://docs.python.org/3.12/library/nis.html}.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node nntplib — NNTP protocol client,ossaudiodev — Access to OSS-compatible audio devices,nis — Interface to Sun’s NIS Yellow Pages,Removed Modules
@anchor{library/nntplib doc}@anchor{51c8}@anchor{library/nntplib module-nntplib}@anchor{a1}@anchor{library/nntplib nntplib-nntp-protocol-client}@anchor{51c9}@anchor{library/nntplib translation-repo}@anchor{51ca}
@subsection @code{nntplib} — NNTP protocol client


@geindex module; nntplib


Deprecated since version 3.11, removed in version 3.13.


This module is no longer part of the Python standard library.
It was @ref{471,,removed in Python 3.13} after
being deprecated in Python 3.11.  The removal was decided in 
@geindex Python Enhancement Proposals; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}.

The last version of Python that provided the @code{nntplib} module was
Python 3.12@footnote{https://docs.python.org/3.12/library/nntplib.html}.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node ossaudiodev — Access to OSS-compatible audio devices,pipes — Interface to shell pipelines,nntplib — NNTP protocol client,Removed Modules
@anchor{library/ossaudiodev doc}@anchor{51cb}@anchor{library/ossaudiodev module-ossaudiodev}@anchor{a7}@anchor{library/ossaudiodev ossaudiodev-access-to-oss-compatible-audio-devices}@anchor{51cc}@anchor{library/ossaudiodev translation-repo}@anchor{51cd}
@subsection @code{ossaudiodev} — Access to OSS-compatible audio devices


@geindex module; ossaudiodev


Deprecated since version 3.11, removed in version 3.13.


This module is no longer part of the Python standard library.
It was @ref{471,,removed in Python 3.13} after
being deprecated in Python 3.11.  The removal was decided in 
@geindex Python Enhancement Proposals; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}.

The last version of Python that provided the @code{ossaudiodev} module was
Python 3.12@footnote{https://docs.python.org/3.12/library/ossaudiodev.html}.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node pipes — Interface to shell pipelines,smtpd — SMTP Server,ossaudiodev — Access to OSS-compatible audio devices,Removed Modules
@anchor{library/pipes doc}@anchor{51ce}@anchor{library/pipes module-pipes}@anchor{ad}@anchor{library/pipes pipes-interface-to-shell-pipelines}@anchor{51cf}@anchor{library/pipes translation-repo}@anchor{51d0}
@subsection @code{pipes} — Interface to shell pipelines


@geindex module; pipes


Deprecated since version 3.11, removed in version 3.13.


This module is no longer part of the Python standard library.
It was @ref{471,,removed in Python 3.13} after
being deprecated in Python 3.11.  The removal was decided in 
@geindex Python Enhancement Proposals; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}.

Applications should use the @ref{dc,,subprocess} module instead.

The last version of Python that provided the @code{pipes} module was
Python 3.12@footnote{https://docs.python.org/3.12/library/pipes.html}.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node smtpd — SMTP Server,sndhdr — Determine type of sound file,pipes — Interface to shell pipelines,Removed Modules
@anchor{library/smtpd doc}@anchor{51d1}@anchor{library/smtpd module-smtpd}@anchor{ce}@anchor{library/smtpd smtpd-smtp-server}@anchor{51d2}@anchor{library/smtpd translation-repo}@anchor{51d3}
@subsection @code{smtpd} — SMTP Server


@geindex module; smtpd


Deprecated since version 3.6, removed in version 3.12.


This module is no longer part of the Python standard library.
It was @ref{727,,removed in Python 3.12} after
being deprecated in Python 3.6.  The removal was decided in 
@geindex Python Enhancement Proposals; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}.

A possible replacement is the third-party aiosmtpd@footnote{https://pypi.org/project/aiosmtpd/} library. This
library is not maintained or supported by the Python core team.

The last version of Python that provided the @code{smtpd} module was
Python 3.11@footnote{https://docs.python.org/3.11/library/smtpd.html}.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node sndhdr — Determine type of sound file,spwd — The shadow password database,smtpd — SMTP Server,Removed Modules
@anchor{library/sndhdr doc}@anchor{51d4}@anchor{library/sndhdr module-sndhdr}@anchor{d0}@anchor{library/sndhdr sndhdr-determine-type-of-sound-file}@anchor{51d5}@anchor{library/sndhdr translation-repo}@anchor{51d6}
@subsection @code{sndhdr} — Determine type of sound file


@geindex module; sndhdr


Deprecated since version 3.11, removed in version 3.13.


This module is no longer part of the Python standard library.
It was @ref{471,,removed in Python 3.13} after
being deprecated in Python 3.11.  The removal was decided in 
@geindex Python Enhancement Proposals; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}.

Possible replacements are third-party modules from PyPI:
filetype@footnote{https://pypi.org/project/filetype/}, puremagic@footnote{https://pypi.org/project/puremagic/}, or python-magic@footnote{https://pypi.org/project/python-magic/}.
These are not supported or maintained by the Python core team.

The last version of Python that provided the @code{sndhdr} module was
Python 3.12@footnote{https://docs.python.org/3.12/library/sndhdr.html}.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node spwd — The shadow password database,sunau — Read and write Sun AU files,sndhdr — Determine type of sound file,Removed Modules
@anchor{library/spwd doc}@anchor{51d7}@anchor{library/spwd module-spwd}@anchor{d3}@anchor{library/spwd spwd-the-shadow-password-database}@anchor{51d8}@anchor{library/spwd translation-repo}@anchor{51d9}
@subsection @code{spwd} — The shadow password database


@geindex module; spwd


Deprecated since version 3.11, removed in version 3.13.


This module is no longer part of the Python standard library.
It was @ref{471,,removed in Python 3.13} after
being deprecated in Python 3.11.  The removal was decided in 
@geindex Python Enhancement Proposals; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}.

A possible replacement is the third-party library python-pam@footnote{https://pypi.org/project/python-pam/}.
This library is not supported or maintained by the Python core team.

The last version of Python that provided the @code{spwd} module was
Python 3.12@footnote{https://docs.python.org/3.12/library/spwd.html}.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node sunau — Read and write Sun AU files,telnetlib — Telnet client,spwd — The shadow password database,Removed Modules
@anchor{library/sunau doc}@anchor{51da}@anchor{library/sunau module-sunau}@anchor{dd}@anchor{library/sunau sunau-read-and-write-sun-au-files}@anchor{51db}@anchor{library/sunau translation-repo}@anchor{51dc}
@subsection @code{sunau} — Read and write Sun AU files


@geindex module; sunau


Deprecated since version 3.11, removed in version 3.13.


This module is no longer part of the Python standard library.
It was @ref{471,,removed in Python 3.13} after
being deprecated in Python 3.11.  The removal was decided in 
@geindex Python Enhancement Proposals; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}.

The last version of Python that provided the @code{sunau} module was
Python 3.12@footnote{https://docs.python.org/3.12/library/sunau.html}.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node telnetlib — Telnet client,uu — Encode and decode uuencode files,sunau — Read and write Sun AU files,Removed Modules
@anchor{library/telnetlib doc}@anchor{51dd}@anchor{library/telnetlib module-telnetlib}@anchor{e5}@anchor{library/telnetlib telnetlib-telnet-client}@anchor{51de}@anchor{library/telnetlib translation-repo}@anchor{51df}
@subsection @code{telnetlib} — Telnet client


@geindex module; telnetlib


Deprecated since version 3.11, removed in version 3.13.


This module is no longer part of the Python standard library.
It was @ref{471,,removed in Python 3.13} after
being deprecated in Python 3.11.  The removal was decided in 
@geindex Python Enhancement Proposals; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}.

Possible replacements are third-party libraries from PyPI: telnetlib3@footnote{https://pypi.org/project/telnetlib3/}
or Exscript@footnote{https://pypi.org/project/Exscript/}.  These are not supported or maintained by the Python core
team.

The last version of Python that provided the @code{telnetlib} module was
Python 3.12@footnote{https://docs.python.org/3.12/library/telnetlib.html}.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node uu — Encode and decode uuencode files,xdrlib — Encode and decode XDR data,telnetlib — Telnet client,Removed Modules
@anchor{library/uu doc}@anchor{51e0}@anchor{library/uu module-uu}@anchor{116}@anchor{library/uu translation-repo}@anchor{51e1}@anchor{library/uu uu-encode-and-decode-uuencode-files}@anchor{51e2}
@subsection @code{uu} — Encode and decode uuencode files


@geindex module; uu


Deprecated since version 3.11, removed in version 3.13.


This module is no longer part of the Python standard library.
It was @ref{471,,removed in Python 3.13} after
being deprecated in Python 3.11.  The removal was decided in 
@geindex Python Enhancement Proposals; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}.

The last version of Python that provided the @code{uu} module was
Python 3.12@footnote{https://docs.python.org/3.12/library/uu.html}.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node xdrlib — Encode and decode XDR data,,uu — Encode and decode uuencode files,Removed Modules
@anchor{library/xdrlib doc}@anchor{51e3}@anchor{library/xdrlib module-xdrlib}@anchor{126}@anchor{library/xdrlib translation-repo}@anchor{51e4}@anchor{library/xdrlib xdrlib-encode-and-decode-xdr-data}@anchor{51e5}
@subsection @code{xdrlib} — Encode and decode XDR data


@geindex module; xdrlib


Deprecated since version 3.11, removed in version 3.13.


This module is no longer part of the Python standard library.
It was @ref{471,,removed in Python 3.13} after
being deprecated in Python 3.11.  The removal was decided in 
@geindex Python Enhancement Proposals; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}.

The last version of Python that provided the @code{xdrlib} module was
Python 3.12@footnote{https://docs.python.org/3.12/library/xdrlib.html}.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@geindex security considerations
@anchor{library/security_warnings security-warnings}@anchor{51e6}
@node Security Considerations<3>,,Removed Modules,The Python Standard Library
@anchor{library/security_warnings doc}@anchor{51e7}@anchor{library/security_warnings security-considerations}@anchor{51e8}@anchor{library/security_warnings translation-repo}@anchor{51e9}
@section Security Considerations


The following modules have specific security considerations:


@itemize *

@item 
@ref{f,,base64}: @ref{3d3b,,base64 security considerations} in
@geindex RFC; RFC 4648
RFC 4648@footnote{https://datatracker.ietf.org/doc/html/rfc4648.html}

@item 
@ref{6c,,hashlib}: @ref{3038,,all constructors take a “usedforsecurity” keyword-only argument disabling known insecure and blocked algorithms}

@item 
@ref{76,,http.server} is not suitable for production use, only implementing
basic security checks. See the @ref{416a,,security considerations}.

@item 
@ref{8b,,logging}: @ref{321f,,Logging configuration uses eval()}

@item 
@ref{98,,multiprocessing}: @ref{3700,,Connection.recv() uses pickle}

@item 
@ref{ab,,pickle}: @ref{2d8b,,Restricting globals in pickle}

@item 
@ref{bd,,random} shouldn’t be used for security purposes, use @ref{c5,,secrets}
instead

@item 
@ref{c8,,shelve}: @ref{2dad,,shelve is based on pickle and thus unsuitable for dealing with untrusted sources}

@item 
@ref{d5,,ssl}: @ref{390d,,SSL/TLS security considerations}

@item 
@ref{dc,,subprocess}: @ref{37ce,,Subprocess security considerations}

@item 
@ref{e6,,tempfile}: @ref{2d45,,mktemp is deprecated due to vulnerability to race conditions}

@item 
@ref{127,,xml}: @ref{3d6e,,XML security}

@item 
@ref{138,,zipfile}: @ref{2f48,,maliciously prepared .zip files can cause disk volume exhaustion}
@end itemize

The @ref{b5d,,-I} command line option can be used to run Python in isolated
mode. When it cannot be used, the @ref{7c2,,-P} option or the
@geindex PYTHONSAFEPATH
@geindex environment variable; PYTHONSAFEPATH
@ref{7c3,,PYTHONSAFEPATH} environment variable can be used to not prepend a
potentially unsafe path to @ref{3e2,,sys.path} such as the current directory, the
script’s directory or an empty string.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Extending and Embedding the Python Interpreter,Python/C API reference manual,The Python Standard Library,Top
@anchor{extending/index doc}@anchor{51ea}@anchor{extending/index extending-and-embedding-the-python-interpreter}@anchor{51eb}@anchor{extending/index extending-index}@anchor{1fff}@anchor{extending/index translation-repo}@anchor{51ec}
@chapter Extending and Embedding the Python Interpreter


This document describes how to write modules in C or C++ to extend the Python
interpreter with new modules.  Those modules can not only define new functions
but also new object types and their methods.  The document also describes how
to embed the Python interpreter in another application, for use as an extension
language.  Finally, it shows how to compile and link extension modules so that
they can be loaded dynamically (at run time) into the interpreter, if the
underlying operating system supports this feature.

This document assumes basic knowledge about Python.  For an informal
introduction to the language, see @ref{1ffe,,The Python Tutorial}.  @ref{14b,,The Python Language Reference}
gives a more formal definition of the language.  @ref{14a,,The Python Standard Library} documents
the existing object types, functions and modules (both built-in and written in
Python) that give the language its wide application range.

For a detailed description of the whole Python/C API, see the separate
@ref{2000,,Python/C API reference manual}.

@menu
* Recommended third party tools:: 
* Creating extensions without third party tools:: 
* Embedding the CPython runtime in a larger application:: 

@end menu

@node Recommended third party tools,Creating extensions without third party tools,,Extending and Embedding the Python Interpreter
@anchor{extending/index recommended-third-party-tools}@anchor{51ed}
@section Recommended third party tools


This guide only covers the basic tools for creating extensions provided
as part of this version of CPython. Some @ref{51ee,,third party tools} offer both simpler and more sophisticated approaches to creating
C and C++ extensions for Python.

@node Creating extensions without third party tools,Embedding the CPython runtime in a larger application,Recommended third party tools,Extending and Embedding the Python Interpreter
@anchor{extending/index creating-extensions-without-third-party-tools}@anchor{51ef}
@section Creating extensions without third party tools


This section of the guide covers creating C and C++ extensions without
assistance from third party tools. It is intended primarily for creators
of those tools, rather than being a recommended way to create your own
C extensions.


@subsubheading See also


@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/} – Multi-phase extension module initialization


@menu
* Extending Python with C or C++:: 
* Defining Extension Types; Tutorial: Defining Extension Types Tutorial. 
* Defining Extension Types; Assorted Topics: Defining Extension Types Assorted Topics. 
* Building C and C++ Extensions:: 
* Building C and C++ Extensions on Windows:: 

@end menu

@node Extending Python with C or C++,Defining Extension Types Tutorial,,Creating extensions without third party tools
@anchor{extending/extending doc}@anchor{51f0}@anchor{extending/extending extending-intro}@anchor{51f1}@anchor{extending/extending extending-python-with-c-or-c}@anchor{51f2}
@subsection Extending Python with C or C++


It is quite easy to add new built-in modules to Python, if you know how to
program in C.  Such `extension modules' can do two things that can’t be
done directly in Python: they can implement new built-in object types, and they
can call C library functions and system calls.

To support extensions, the Python API (Application Programmers Interface)
defines a set of functions, macros and variables that provide access to most
aspects of the Python run-time system.  The Python API is incorporated in a C
source file by including the header @code{"Python.h"}.

The compilation of an extension module depends on its intended use as well as on
your system setup; details are given in later chapters.

@cartouche
@quotation Note 
The C extension interface is specific to CPython, and extension modules do
not work on other Python implementations.  In many cases, it is possible to
avoid writing C extensions and preserve portability to other implementations.
For example, if your use case is calling C library functions or system calls,
you should consider using the @ref{2e,,ctypes} module or the cffi@footnote{https://cffi.readthedocs.io/} library rather than writing
custom C code.
These modules let you write Python code to interface with C code and are more
portable between implementations of Python than writing and compiling a C
extension module.
@end quotation
@end cartouche

@menu
* A Simple Example:: 
* Intermezzo; Errors and Exceptions: Intermezzo Errors and Exceptions. 
* Back to the Example:: 
* The Module’s Method Table and Initialization Function:: 
* Compilation and Linkage:: 
* Calling Python Functions from C:: 
* Extracting Parameters in Extension Functions:: 
* Keyword Parameters for Extension Functions:: 
* Building Arbitrary Values:: 
* Reference Counts:: 
* Writing Extensions in C++:: 
* Providing a C API for an Extension Module:: 

@end menu

@node A Simple Example,Intermezzo Errors and Exceptions,,Extending Python with C or C++
@anchor{extending/extending a-simple-example}@anchor{51f3}@anchor{extending/extending extending-simpleexample}@anchor{51f4}
@subsubsection A Simple Example


Let’s create an extension module called @code{spam} (the favorite food of Monty
Python fans…) and let’s say we want to create a Python interface to the C
library function @code{system()} @footnote{
An interface for this function already exists in the standard module @ref{a5,,os}
— it was chosen as a simple and straightforward example.
}. This function takes a null-terminated
character string as argument and returns an integer.  We want this function to
be callable from Python as follows:

@example
>>> import spam
>>> status = spam.system("ls -l")
@end example

Begin by creating a file @code{spammodule.c}.  (Historically, if a module is
called @code{spam}, the C file containing its implementation is called
@code{spammodule.c}; if the module name is very long, like @code{spammify}, the
module name can be just @code{spammify.c}.)

The first two lines of our file can be:

@example
#define PY_SSIZE_T_CLEAN
#include <Python.h>
@end example

which pulls in the Python API (you can add a comment describing the purpose of
the module and a copyright notice if you like).

@cartouche
@quotation Note 
Since Python may define some pre-processor definitions which affect the standard
headers on some systems, you `must' include @code{Python.h} before any standard
headers are included.

@code{#define PY_SSIZE_T_CLEAN} was used to indicate that @code{Py_ssize_t} should be
used in some APIs instead of @code{int}.
It is not necessary since Python 3.13, but we keep it here for backward compatibility.
See @ref{62c,,Strings and buffers} for a description of this macro.
@end quotation
@end cartouche

All user-visible symbols defined by @code{Python.h} have a prefix of @code{Py} or
@code{PY}, except those defined in standard header files.

@cartouche
@quotation Tip 
For backward compatibility, @code{Python.h} includes several standard header files.
C extensions should include the standard headers that they use,
and should not rely on these implicit includes.
If using the limited C API version 3.13 or newer, the implicit includes are:


@itemize *

@item 
@code{<assert.h>}

@item 
@code{<intrin.h>} (on Windows)

@item 
@code{<inttypes.h>}

@item 
@code{<limits.h>}

@item 
@code{<math.h>}

@item 
@code{<stdarg.h>}

@item 
@code{<wchar.h>}

@item 
@code{<sys/types.h>} (if present)
@end itemize

If @ref{660,,Py_LIMITED_API} is not defined, or is set to version 3.12 or older,
the headers below are also included:


@itemize *

@item 
@code{<ctype.h>}

@item 
@code{<unistd.h>} (on POSIX)
@end itemize

If @ref{660,,Py_LIMITED_API} is not defined, or is set to version 3.10 or older,
the headers below are also included:


@itemize *

@item 
@code{<errno.h>}

@item 
@code{<stdio.h>}

@item 
@code{<stdlib.h>}

@item 
@code{<string.h>}
@end itemize
@end quotation
@end cartouche

The next thing we add to our module file is the C function that will be called
when the Python expression @code{spam.system(string)} is evaluated (we’ll see
shortly how it ends up being called):

@example
static PyObject *
spam_system(PyObject *self, PyObject *args)
@{
    const char *command;
    int sts;

    if (!PyArg_ParseTuple(args, "s", &command))
        return NULL;
    sts = system(command);
    return PyLong_FromLong(sts);
@}
@end example

There is a straightforward translation from the argument list in Python (for
example, the single expression @code{"ls -l"}) to the arguments passed to the C
function.  The C function always has two arguments, conventionally named `self'
and `args'.

The `self' argument points to the module object for module-level functions;
for a method it would point to the object instance.

The `args' argument will be a pointer to a Python tuple object containing the
arguments.  Each item of the tuple corresponds to an argument in the call’s
argument list.  The arguments are Python objects — in order to do anything
with them in our C function we have to convert them to C values.  The function
@ref{3bf,,PyArg_ParseTuple()} in the Python API checks the argument types and
converts them to C values.  It uses a template string to determine the required
types of the arguments as well as the types of the C variables into which to
store the converted values.  More about this later.

@ref{3bf,,PyArg_ParseTuple()} returns true (nonzero) if all arguments have the right
type and its components have been stored in the variables whose addresses are
passed.  It returns false (zero) if an invalid argument list was passed.  In the
latter case it also raises an appropriate exception so the calling function can
return @code{NULL} immediately (as we saw in the example).

@node Intermezzo Errors and Exceptions,Back to the Example,A Simple Example,Extending Python with C or C++
@anchor{extending/extending extending-errors}@anchor{51f5}@anchor{extending/extending intermezzo-errors-and-exceptions}@anchor{51f6}
@subsubsection Intermezzo: Errors and Exceptions


An important convention throughout the Python interpreter is the following: when
a function fails, it should set an exception condition and return an error value
(usually @code{-1} or a @code{NULL} pointer).  Exception information is stored in
three members of the interpreter’s thread state.  These are @code{NULL} if
there is no exception.  Otherwise they are the C equivalents of the members
of the Python tuple returned by @ref{89c,,sys.exc_info()}.  These are the
exception type, exception instance, and a traceback object.  It is important
to know about them to understand how errors are passed around.

The Python API defines a number of functions to set various types of exceptions.

The most common one is @ref{79d,,PyErr_SetString()}.  Its arguments are an exception
object and a C string.  The exception object is usually a predefined object like
@ref{51f7,,PyExc_ZeroDivisionError}.  The C string indicates the cause of the error
and is converted to a Python string object and stored as the “associated value”
of the exception.

Another useful function is @ref{51f8,,PyErr_SetFromErrno()}, which only takes an
exception argument and constructs the associated value by inspection of the
global variable @code{errno}.  The most general function is
@ref{79c,,PyErr_SetObject()}, which takes two object arguments, the exception and
its associated value.  You don’t need to @ref{790,,Py_INCREF()} the objects passed
to any of these functions.

You can test non-destructively whether an exception has been set with
@ref{1cf0,,PyErr_Occurred()}.  This returns the current exception object, or @code{NULL}
if no exception has occurred.  You normally don’t need to call
@code{PyErr_Occurred()} to see whether an error occurred in a function call,
since you should be able to tell from the return value.

When a function `f' that calls another function `g' detects that the latter
fails, `f' should itself return an error value (usually @code{NULL} or @code{-1}).  It
should `not' call one of the @code{PyErr_*} functions — one has already
been called by `g'. `f'’s caller is then supposed to also return an error
indication to `its' caller, again `without' calling @code{PyErr_*}, and so on
— the most detailed cause of the error was already reported by the function
that first detected it.  Once the error reaches the Python interpreter’s main
loop, this aborts the currently executing Python code and tries to find an
exception handler specified by the Python programmer.

(There are situations where a module can actually give a more detailed error
message by calling another @code{PyErr_*} function, and in such cases it is
fine to do so.  As a general rule, however, this is not necessary, and can cause
information about the cause of the error to be lost: most operations can fail
for a variety of reasons.)

To ignore an exception set by a function call that failed, the exception
condition must be cleared explicitly by calling @ref{1237,,PyErr_Clear()}.  The only
time C code should call @code{PyErr_Clear()} is if it doesn’t want to pass the
error on to the interpreter but wants to handle it completely by itself
(possibly by trying something else, or pretending nothing went wrong).

Every failing @code{malloc()} call must be turned into an exception — the
direct caller of @code{malloc()} (or @code{realloc()}) must call
@ref{51f9,,PyErr_NoMemory()} and return a failure indicator itself.  All the
object-creating functions (for example, @ref{1c13,,PyLong_FromLong()}) already do
this, so this note is only relevant to those who call @code{malloc()} directly.

Also note that, with the important exception of @ref{3bf,,PyArg_ParseTuple()} and
friends, functions that return an integer status usually return a positive value
or zero for success and @code{-1} for failure, like Unix system calls.

Finally, be careful to clean up garbage (by making @ref{997,,Py_XDECREF()} or
@ref{791,,Py_DECREF()} calls for objects you have already created) when you return
an error indicator!

The choice of which exception to raise is entirely yours.  There are predeclared
C objects corresponding to all built-in Python exceptions, such as
@ref{51f7,,PyExc_ZeroDivisionError}, which you can use directly. Of course, you
should choose exceptions wisely — don’t use @ref{51fa,,PyExc_TypeError} to mean
that a file couldn’t be opened (that should probably be @ref{51fb,,PyExc_OSError}).
If something’s wrong with the argument list, the @ref{3bf,,PyArg_ParseTuple()}
function usually raises @code{PyExc_TypeError}.  If you have an argument whose
value must be in a particular range or must satisfy other conditions,
@ref{51fc,,PyExc_ValueError} is appropriate.

You can also define a new exception that is unique to your module.
The simplest way to do this is to declare a static global object variable at
the beginning of the file:

@example
static PyObject *SpamError = NULL;
@end example

and initialize it by calling @ref{1475,,PyErr_NewException()} in the module’s
@ref{b7b,,Py_mod_exec} function (@code{spam_module_exec()}):

@example
SpamError = PyErr_NewException("spam.error", NULL, NULL);
@end example

Since @code{SpamError} is a global variable, it will be overwritten every time
the module is reinitialized, when the @ref{b7b,,Py_mod_exec} function is called.

For now, let’s avoid the issue: we will block repeated initialization by raising an
@ref{65b,,ImportError}:

@example
static PyObject *SpamError = NULL;

static int
spam_module_exec(PyObject *m)
@{
    if (SpamError != NULL) @{
        PyErr_SetString(PyExc_ImportError,
                        "cannot initialize spam module more than once");
        return -1;
    @}
    SpamError = PyErr_NewException("spam.error", NULL, NULL);
    if (PyModule_AddObjectRef(m, "SpamError", SpamError) < 0) @{
        return -1;
    @}

    return 0;
@}

static PyModuleDef_Slot spam_module_slots[] = @{
    @{Py_mod_exec, spam_module_exec@},
    @{0, NULL@}
@};

static struct PyModuleDef spam_module = @{
    .m_base = PyModuleDef_HEAD_INIT,
    .m_name = "spam",
    .m_size = 0,  // non-negative
    .m_slots = spam_module_slots,
@};

PyMODINIT_FUNC
PyInit_spam(void)
@{
    return PyModuleDef_Init(&spam_module);
@}
@end example

Note that the Python name for the exception object is @code{spam.error}.  The
@ref{1475,,PyErr_NewException()} function may create a class with the base class
being @ref{bd3,,Exception} (unless another class is passed in instead of @code{NULL}),
described in @ref{1c6a,,Built-in Exceptions}.

Note also that the @code{SpamError} variable retains a reference to the newly
created exception class; this is intentional!  Since the exception could be
removed from the module by external code, an owned reference to the class is
needed to ensure that it will not be discarded, causing @code{SpamError} to
become a dangling pointer. Should it become a dangling pointer, C code which
raises the exception could cause a core dump or other unintended side effects.

For now, the @ref{791,,Py_DECREF()} call to remove this reference is missing.
Even when the Python interpreter shuts down, the global @code{SpamError}
variable will not be garbage-collected. It will “leak”.
We did, however, ensure that this will happen at most once per process.

We discuss the use of @ref{16df,,PyMODINIT_FUNC} as a function return type later in this
sample.

The @code{spam.error} exception can be raised in your extension module using a
call to @ref{79d,,PyErr_SetString()} as shown below:

@example
static PyObject *
spam_system(PyObject *self, PyObject *args)
@{
    const char *command;
    int sts;

    if (!PyArg_ParseTuple(args, "s", &command))
        return NULL;
    sts = system(command);
    if (sts < 0) @{
        PyErr_SetString(SpamError, "System command failed");
        return NULL;
    @}
    return PyLong_FromLong(sts);
@}
@end example

@node Back to the Example,The Module’s Method Table and Initialization Function,Intermezzo Errors and Exceptions,Extending Python with C or C++
@anchor{extending/extending back-to-the-example}@anchor{51fd}@anchor{extending/extending backtoexample}@anchor{51fe}
@subsubsection Back to the Example


Going back to our example function, you should now be able to understand this
statement:

@example
if (!PyArg_ParseTuple(args, "s", &command))
    return NULL;
@end example

It returns @code{NULL} (the error indicator for functions returning object pointers)
if an error is detected in the argument list, relying on the exception set by
@ref{3bf,,PyArg_ParseTuple()}.  Otherwise the string value of the argument has been
copied to the local variable @code{command}.  This is a pointer assignment and
you are not supposed to modify the string to which it points (so in Standard C,
the variable @code{command} should properly be declared as @code{const char
*command}).

The next statement is a call to the Unix function @code{system()}, passing it
the string we just got from @ref{3bf,,PyArg_ParseTuple()}:

@example
sts = system(command);
@end example

Our @code{spam.system()} function must return the value of @code{sts} as a
Python object.  This is done using the function @ref{1c13,,PyLong_FromLong()}.

@example
return PyLong_FromLong(sts);
@end example

In this case, it will return an integer object.  (Yes, even integers are objects
on the heap in Python!)

If you have a C function that returns no useful argument (a function returning
void), the corresponding Python function must return @code{None}.   You
need this idiom to do so (which is implemented by the @ref{167f,,Py_RETURN_NONE}
macro):

@example
Py_INCREF(Py_None);
return Py_None;
@end example

@ref{51ff,,Py_None} is the C name for the special Python object @code{None}.  It is a
genuine Python object rather than a @code{NULL} pointer, which means “error” in most
contexts, as we have seen.

@node The Module’s Method Table and Initialization Function,Compilation and Linkage,Back to the Example,Extending Python with C or C++
@anchor{extending/extending methodtable}@anchor{5200}@anchor{extending/extending the-module-s-method-table-and-initialization-function}@anchor{5201}
@subsubsection The Module’s Method Table and Initialization Function


I promised to show how @code{spam_system()} is called from Python programs.
First, we need to list its name and address in a “method table”:

@example
static PyMethodDef spam_methods[] = @{
    ...
    @{"system",  spam_system, METH_VARARGS,
     "Execute a shell command."@},
    ...
    @{NULL, NULL, 0, NULL@}        /* Sentinel */
@};
@end example

Note the third entry (@code{METH_VARARGS}).  This is a flag telling the interpreter
the calling convention to be used for the C function.  It should normally always
be @code{METH_VARARGS} or @code{METH_VARARGS | METH_KEYWORDS}; a value of @code{0} means
that an obsolete variant of @ref{3bf,,PyArg_ParseTuple()} is used.

When using only @code{METH_VARARGS}, the function should expect the Python-level
parameters to be passed in as a tuple acceptable for parsing via
@ref{3bf,,PyArg_ParseTuple()}; more information on this function is provided below.

The @ref{5202,,METH_KEYWORDS} bit may be set in the third field if keyword
arguments should be passed to the function.  In this case, the C function should
accept a third @code{PyObject *} parameter which will be a dictionary of keywords.
Use @ref{624,,PyArg_ParseTupleAndKeywords()} to parse the arguments to such a
function.

The method table must be referenced in the module definition structure:

@example
static struct PyModuleDef spam_module = @{
    ...
    .m_methods = spam_methods,
    ...
@};
@end example

This structure, in turn, must be passed to the interpreter in the module’s
initialization function.  The initialization function must be named
@code{PyInit_name()}, where `name' is the name of the module, and should be the
only non-@code{static} item defined in the module file:

@example
PyMODINIT_FUNC
PyInit_spam(void)
@{
    return PyModuleDef_Init(&spam_module);
@}
@end example

Note that @ref{16df,,PyMODINIT_FUNC} declares the function as @code{PyObject *} return type,
declares any special linkage declarations required by the platform, and for C++
declares the function as @code{extern "C"}.

@code{PyInit_spam()} is called when each interpreter imports its module
@code{spam} for the first time.  (See below for comments about embedding Python.)
A pointer to the module definition must be returned via @ref{5203,,PyModuleDef_Init()},
so that the import machinery can create the module and store it in @code{sys.modules}.

When embedding Python, the @code{PyInit_spam()} function is not called
automatically unless there’s an entry in the @ref{1b5f,,PyImport_Inittab} table.
To add the module to the initialization table, use @ref{1b60,,PyImport_AppendInittab()},
optionally followed by an import of the module:

@example
#define PY_SSIZE_T_CLEAN
#include <Python.h>

int
main(int argc, char *argv[])
@{
    PyStatus status;
    PyConfig config;
    PyConfig_InitPythonConfig(&config);

    /* Add a built-in module, before Py_Initialize */
    if (PyImport_AppendInittab("spam", PyInit_spam) == -1) @{
        fprintf(stderr, "Error: could not extend in-built modules table\n");
        exit(1);
    @}

    /* Pass argv[0] to the Python interpreter */
    status = PyConfig_SetBytesString(&config, &config.program_name, argv[0]);
    if (PyStatus_Exception(status)) @{
        goto exception;
    @}

    /* Initialize the Python interpreter.  Required.
       If this step fails, it will be a fatal error. */
    status = Py_InitializeFromConfig(&config);
    if (PyStatus_Exception(status)) @{
        goto exception;
    @}
    PyConfig_Clear(&config);

    /* Optionally import the module; alternatively,
       import can be deferred until the embedded script
       imports it. */
    PyObject *pmodule = PyImport_ImportModule("spam");
    if (!pmodule) @{
        PyErr_Print();
        fprintf(stderr, "Error: could not import module 'spam'\n");
    @}

    // ... use Python C API here ...

    return 0;

  exception:
     PyConfig_Clear(&config);
     Py_ExitStatusException(status);
@}
@end example

@cartouche
@quotation Note 
If you declare a global variable or a local static one, the module may
experience unintended side-effects on re-initialisation, for example when
removing entries from @code{sys.modules} or importing compiled modules into
multiple interpreters within a process
(or following a @code{fork()} without an intervening @code{exec()}).
If module state is not yet fully @ref{167,,isolated},
authors should consider marking the module as having no support for subinterpreters
(via @ref{5204,,Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED}).
@end quotation
@end cartouche

A more substantial example module is included in the Python source distribution
as @code{Modules/xxlimited.c}.  This file may be used as a template or simply
read as an example.

@node Compilation and Linkage,Calling Python Functions from C,The Module’s Method Table and Initialization Function,Extending Python with C or C++
@anchor{extending/extending compilation}@anchor{5205}@anchor{extending/extending compilation-and-linkage}@anchor{5206}
@subsubsection Compilation and Linkage


There are two more things to do before you can use your new extension: compiling
and linking it with the Python system.  If you use dynamic loading, the details
may depend on the style of dynamic loading your system uses; see the chapters
about building extension modules (chapter @ref{5207,,Building C and C++ Extensions}) and additional
information that pertains only to building on Windows (chapter
@ref{2268,,Building C and C++ Extensions on Windows}) for more information about this.

If you can’t use dynamic loading, or if you want to make your module a permanent
part of the Python interpreter, you will have to change the configuration setup
and rebuild the interpreter.  Luckily, this is very simple on Unix: just place
your file (@code{spammodule.c} for example) in the @code{Modules/} directory
of an unpacked source distribution, add a line to the file
@code{Modules/Setup.local} describing your file:

@example
spam spammodule.o
@end example

and rebuild the interpreter by running @code{make} in the toplevel
directory.  You can also run @code{make} in the @code{Modules/}
subdirectory, but then you must first rebuild @code{Makefile} there by running
‘@code{make} Makefile’.  (This is necessary each time you change the
@code{Setup} file.)

If your module requires additional libraries to link with, these can be listed
on the line in the configuration file as well, for instance:

@example
spam spammodule.o -lX11
@end example

@node Calling Python Functions from C,Extracting Parameters in Extension Functions,Compilation and Linkage,Extending Python with C or C++
@anchor{extending/extending calling-python-functions-from-c}@anchor{5208}@anchor{extending/extending callingpython}@anchor{5209}
@subsubsection Calling Python Functions from C


So far we have concentrated on making C functions callable from Python.  The
reverse is also useful: calling Python functions from C. This is especially the
case for libraries that support so-called “callback” functions.  If a C
interface makes use of callbacks, the equivalent Python often needs to provide a
callback mechanism to the Python programmer; the implementation will require
calling the Python callback functions from a C callback.  Other uses are also
imaginable.

Fortunately, the Python interpreter is easily called recursively, and there is a
standard interface to call a Python function.  (I won’t dwell on how to call the
Python parser with a particular string as input — if you’re interested, have a
look at the implementation of the @ref{1a9,,-c} command line option in
@code{Modules/main.c} from the Python source code.)

Calling a Python function is easy.  First, the Python program must somehow pass
you the Python function object.  You should provide a function (or some other
interface) to do this.  When this function is called, save a pointer to the
Python function object (be careful to @ref{790,,Py_INCREF()} it!) in a global
variable — or wherever you see fit. For example, the following function might
be part of a module definition:

@example
static PyObject *my_callback = NULL;

static PyObject *
my_set_callback(PyObject *dummy, PyObject *args)
@{
    PyObject *result = NULL;
    PyObject *temp;

    if (PyArg_ParseTuple(args, "O:set_callback", &temp)) @{
        if (!PyCallable_Check(temp)) @{
            PyErr_SetString(PyExc_TypeError, "parameter must be callable");
            return NULL;
        @}
        Py_XINCREF(temp);         /* Add a reference to new callback */
        Py_XDECREF(my_callback);  /* Dispose of previous callback */
        my_callback = temp;       /* Remember new callback */
        /* Boilerplate to return "None" */
        Py_INCREF(Py_None);
        result = Py_None;
    @}
    return result;
@}
@end example

This function must be registered with the interpreter using the
@ref{1714,,METH_VARARGS} flag; this is described in section @ref{5200,,The Module’s Method Table and Initialization Function}.  The
@ref{3bf,,PyArg_ParseTuple()} function and its arguments are documented in section
@ref{520a,,Extracting Parameters in Extension Functions}.

The macros @ref{c60,,Py_XINCREF()} and @ref{997,,Py_XDECREF()} increment/decrement the
reference count of an object and are safe in the presence of @code{NULL} pointers
(but note that `temp' will not be  @code{NULL} in this context).  More info on them
in section @ref{520b,,Reference Counts}.

@geindex PyObject_CallObject (C function)

Later, when it is time to call the function, you call the C function
@ref{520c,,PyObject_CallObject()}.  This function has two arguments, both pointers to
arbitrary Python objects: the Python function, and the argument list.  The
argument list must always be a tuple object, whose length is the number of
arguments.  To call the Python function with no arguments, pass in @code{NULL}, or
an empty tuple; to call it with one argument, pass a singleton tuple.
@ref{3c0,,Py_BuildValue()} returns a tuple when its format string consists of zero
or more format codes between parentheses.  For example:

@example
int arg;
PyObject *arglist;
PyObject *result;
...
arg = 123;
...
/* Time to call the callback */
arglist = Py_BuildValue("(i)", arg);
result = PyObject_CallObject(my_callback, arglist);
Py_DECREF(arglist);
@end example

@ref{520c,,PyObject_CallObject()} returns a Python object pointer: this is the return
value of the Python function.  @code{PyObject_CallObject()} is
“reference-count-neutral” with respect to its arguments.  In the example a new
tuple was created to serve as the argument list, which is
@ref{791,,Py_DECREF()}-ed immediately after the @code{PyObject_CallObject()}
call.

The return value of @ref{520c,,PyObject_CallObject()} is “new”: either it is a brand
new object, or it is an existing object whose reference count has been
incremented.  So, unless you want to save it in a global variable, you should
somehow @ref{791,,Py_DECREF()} the result, even (especially!) if you are not
interested in its value.

Before you do this, however, it is important to check that the return value
isn’t @code{NULL}.  If it is, the Python function terminated by raising an exception.
If the C code that called @ref{520c,,PyObject_CallObject()} is called from Python, it
should now return an error indication to its Python caller, so the interpreter
can print a stack trace, or the calling Python code can handle the exception.
If this is not possible or desirable, the exception should be cleared by calling
@ref{1237,,PyErr_Clear()}.  For example:

@example
if (result == NULL)
    return NULL; /* Pass error back */
...use result...
Py_DECREF(result);
@end example

Depending on the desired interface to the Python callback function, you may also
have to provide an argument list to @ref{520c,,PyObject_CallObject()}.  In some cases
the argument list is also provided by the Python program, through the same
interface that specified the callback function.  It can then be saved and used
in the same manner as the function object.  In other cases, you may have to
construct a new tuple to pass as the argument list.  The simplest way to do this
is to call @ref{3c0,,Py_BuildValue()}.  For example, if you want to pass an integral
event code, you might use the following code:

@example
PyObject *arglist;
...
arglist = Py_BuildValue("(l)", eventcode);
result = PyObject_CallObject(my_callback, arglist);
Py_DECREF(arglist);
if (result == NULL)
    return NULL; /* Pass error back */
/* Here maybe use the result */
Py_DECREF(result);
@end example

Note the placement of @code{Py_DECREF(arglist)} immediately after the call, before
the error check!  Also note that strictly speaking this code is not complete:
@ref{3c0,,Py_BuildValue()} may run out of memory, and this should be checked.

You may also call a function with keyword arguments by using
@ref{63d,,PyObject_Call()}, which supports arguments and keyword arguments.  As in
the above example, we use @ref{3c0,,Py_BuildValue()} to construct the dictionary.

@example
PyObject *dict;
...
dict = Py_BuildValue("@{s:i@}", "name", val);
result = PyObject_Call(my_callback, NULL, dict);
Py_DECREF(dict);
if (result == NULL)
    return NULL; /* Pass error back */
/* Here maybe use the result */
Py_DECREF(result);
@end example

@node Extracting Parameters in Extension Functions,Keyword Parameters for Extension Functions,Calling Python Functions from C,Extending Python with C or C++
@anchor{extending/extending extracting-parameters-in-extension-functions}@anchor{520d}@anchor{extending/extending parsetuple}@anchor{520a}
@subsubsection Extracting Parameters in Extension Functions


@geindex PyArg_ParseTuple (C function)

The @ref{3bf,,PyArg_ParseTuple()} function is declared as follows:

@example
int PyArg_ParseTuple(PyObject *arg, const char *format, ...);
@end example

The `arg' argument must be a tuple object containing an argument list passed
from Python to a C function.  The `format' argument must be a format string,
whose syntax is explained in @ref{3d3,,Parsing arguments and building values} in the Python/C API Reference
Manual.  The remaining arguments must be addresses of variables whose type is
determined by the format string.

Note that while @ref{3bf,,PyArg_ParseTuple()} checks that the Python arguments have
the required types, it cannot check the validity of the addresses of C variables
passed to the call: if you make mistakes there, your code will probably crash or
at least overwrite random bits in memory.  So be careful!

Note that any Python object references which are provided to the caller are
`borrowed' references; do not decrement their reference count!

Some example calls:

@example
#define PY_SSIZE_T_CLEAN
#include <Python.h>
@end example

@example
int ok;
int i, j;
long k, l;
const char *s;
Py_ssize_t size;

ok = PyArg_ParseTuple(args, ""); /* No arguments */
    /* Python call: f() */
@end example

@example
ok = PyArg_ParseTuple(args, "s", &s); /* A string */
    /* Possible Python call: f('whoops!') */
@end example

@example
ok = PyArg_ParseTuple(args, "lls", &k, &l, &s); /* Two longs and a string */
    /* Possible Python call: f(1, 2, 'three') */
@end example

@example
ok = PyArg_ParseTuple(args, "(ii)s#", &i, &j, &s, &size);
    /* A pair of ints and a string, whose size is also returned */
    /* Possible Python call: f((1, 2), 'three') */
@end example

@example
@{
    const char *file;
    const char *mode = "r";
    int bufsize = 0;
    ok = PyArg_ParseTuple(args, "s|si", &file, &mode, &bufsize);
    /* A string, and optionally another string and an integer */
    /* Possible Python calls:
       f('spam')
       f('spam', 'w')
       f('spam', 'wb', 100000) */
@}
@end example

@example
@{
    int left, top, right, bottom, h, v;
    ok = PyArg_ParseTuple(args, "((ii)(ii))(ii)",
             &left, &top, &right, &bottom, &h, &v);
    /* A rectangle and a point */
    /* Possible Python call:
       f(((0, 0), (400, 300)), (10, 10)) */
@}
@end example

@example
@{
    Py_complex c;
    ok = PyArg_ParseTuple(args, "D:myfunction", &c);
    /* a complex, also providing a function name for errors */
    /* Possible Python call: myfunction(1+2j) */
@}
@end example

@node Keyword Parameters for Extension Functions,Building Arbitrary Values,Extracting Parameters in Extension Functions,Extending Python with C or C++
@anchor{extending/extending keyword-parameters-for-extension-functions}@anchor{520e}@anchor{extending/extending parsetupleandkeywords}@anchor{520f}
@subsubsection Keyword Parameters for Extension Functions


@geindex PyArg_ParseTupleAndKeywords (C function)

The @ref{624,,PyArg_ParseTupleAndKeywords()} function is declared as follows:

@example
int PyArg_ParseTupleAndKeywords(PyObject *arg, PyObject *kwdict,
                                const char *format, char * const *kwlist, ...);
@end example

The `arg' and `format' parameters are identical to those of the
@ref{3bf,,PyArg_ParseTuple()} function.  The `kwdict' parameter is the dictionary of
keywords received as the third parameter from the Python runtime.  The `kwlist'
parameter is a @code{NULL}-terminated list of strings which identify the parameters;
the names are matched with the type information from `format' from left to
right.  On success, @ref{624,,PyArg_ParseTupleAndKeywords()} returns true, otherwise
it returns false and raises an appropriate exception.

@cartouche
@quotation Note 
Nested tuples cannot be parsed when using keyword arguments!  Keyword parameters
passed in which are not present in the `kwlist' will cause @ref{199,,TypeError} to
be raised.
@end quotation
@end cartouche

@geindex Philbrick@comma{} Geoff

Here is an example module which uses keywords, based on an example by Geoff
Philbrick (@email{philbrick@@hks.com}):

@example
#define PY_SSIZE_T_CLEAN
#include <Python.h>

static PyObject *
keywdarg_parrot(PyObject *self, PyObject *args, PyObject *keywds)
@{
    int voltage;
    const char *state = "a stiff";
    const char *action = "voom";
    const char *type = "Norwegian Blue";

    static char *kwlist[] = @{"voltage", "state", "action", "type", NULL@};

    if (!PyArg_ParseTupleAndKeywords(args, keywds, "i|sss", kwlist,
                                     &voltage, &state, &action, &type))
        return NULL;

    printf("-- This parrot wouldn't %s if you put %i Volts through it.\n",
           action, voltage);
    printf("-- Lovely plumage, the %s -- It's %s!\n", type, state);

    Py_RETURN_NONE;
@}

static PyMethodDef keywdarg_methods[] = @{
    /* The cast of the function is necessary since PyCFunction values
     * only take two PyObject* parameters, and keywdarg_parrot() takes
     * three.
     */
    @{"parrot", (PyCFunction)(void(*)(void))keywdarg_parrot, METH_VARARGS | METH_KEYWORDS,
     "Print a lovely skit to standard output."@},
    @{NULL, NULL, 0, NULL@}   /* sentinel */
@};

static struct PyModuleDef keywdarg_module = @{
    .m_base = PyModuleDef_HEAD_INIT,
    .m_name = "keywdarg",
    .m_size = 0,
    .m_methods = keywdarg_methods,
@};

PyMODINIT_FUNC
PyInit_keywdarg(void)
@{
    return PyModuleDef_Init(&keywdarg_module);
@}
@end example

@node Building Arbitrary Values,Reference Counts,Keyword Parameters for Extension Functions,Extending Python with C or C++
@anchor{extending/extending building-arbitrary-values}@anchor{5210}@anchor{extending/extending buildvalue}@anchor{5211}
@subsubsection Building Arbitrary Values


This function is the counterpart to @ref{3bf,,PyArg_ParseTuple()}.  It is declared
as follows:

@example
PyObject *Py_BuildValue(const char *format, ...);
@end example

It recognizes a set of format units similar to the ones recognized by
@ref{3bf,,PyArg_ParseTuple()}, but the arguments (which are input to the function,
not output) must not be pointers, just values.  It returns a new Python object,
suitable for returning from a C function called from Python.

One difference with @ref{3bf,,PyArg_ParseTuple()}: while the latter requires its
first argument to be a tuple (since Python argument lists are always represented
as tuples internally), @ref{3c0,,Py_BuildValue()} does not always build a tuple.  It
builds a tuple only if its format string contains two or more format units. If
the format string is empty, it returns @code{None}; if it contains exactly one
format unit, it returns whatever object is described by that format unit.  To
force it to return a tuple of size 0 or one, parenthesize the format string.

Examples (to the left the call, to the right the resulting Python value):

@example
Py_BuildValue("")                        None
Py_BuildValue("i", 123)                  123
Py_BuildValue("iii", 123, 456, 789)      (123, 456, 789)
Py_BuildValue("s", "hello")              'hello'
Py_BuildValue("y", "hello")              b'hello'
Py_BuildValue("ss", "hello", "world")    ('hello', 'world')
Py_BuildValue("s#", "hello", 4)          'hell'
Py_BuildValue("y#", "hello", 4)          b'hell'
Py_BuildValue("()")                      ()
Py_BuildValue("(i)", 123)                (123,)
Py_BuildValue("(ii)", 123, 456)          (123, 456)
Py_BuildValue("(i,i)", 123, 456)         (123, 456)
Py_BuildValue("[i,i]", 123, 456)         [123, 456]
Py_BuildValue("@{s:i,s:i@}",
              "abc", 123, "def", 456)    @{'abc': 123, 'def': 456@}
Py_BuildValue("((ii)(ii)) (ii)",
              1, 2, 3, 4, 5, 6)          (((1, 2), (3, 4)), (5, 6))
@end example

@node Reference Counts,Writing Extensions in C++,Building Arbitrary Values,Extending Python with C or C++
@anchor{extending/extending refcounts}@anchor{520b}@anchor{extending/extending reference-counts}@anchor{5212}
@subsubsection Reference Counts


In languages like C or C++, the programmer is responsible for dynamic allocation
and deallocation of memory on the heap.  In C, this is done using the functions
@code{malloc()} and @code{free()}.  In C++, the operators @code{new} and
@code{delete} are used with essentially the same meaning and we’ll restrict
the following discussion to the C case.

Every block of memory allocated with @code{malloc()} should eventually be
returned to the pool of available memory by exactly one call to @code{free()}.
It is important to call @code{free()} at the right time.  If a block’s address
is forgotten but @code{free()} is not called for it, the memory it occupies
cannot be reused until the program terminates.  This is called a `memory
leak'.  On the other hand, if a program calls @code{free()} for a block and then
continues to use the block, it creates a conflict with reuse of the block
through another @code{malloc()} call.  This is called `using freed memory'.
It has the same bad consequences as referencing uninitialized data — core
dumps, wrong results, mysterious crashes.

Common causes of memory leaks are unusual paths through the code.  For instance,
a function may allocate a block of memory, do some calculation, and then free
the block again.  Now a change in the requirements for the function may add a
test to the calculation that detects an error condition and can return
prematurely from the function.  It’s easy to forget to free the allocated memory
block when taking this premature exit, especially when it is added later to the
code.  Such leaks, once introduced, often go undetected for a long time: the
error exit is taken only in a small fraction of all calls, and most modern
machines have plenty of virtual memory, so the leak only becomes apparent in a
long-running process that uses the leaking function frequently.  Therefore, it’s
important to prevent leaks from happening by having a coding convention or
strategy that minimizes this kind of errors.

Since Python makes heavy use of @code{malloc()} and @code{free()}, it needs a
strategy to avoid memory leaks as well as the use of freed memory.  The chosen
method is called `reference counting'.  The principle is simple: every
object contains a counter, which is incremented when a reference to the object
is stored somewhere, and which is decremented when a reference to it is deleted.
When the counter reaches zero, the last reference to the object has been deleted
and the object is freed.

An alternative strategy is called `automatic garbage collection'.
(Sometimes, reference counting is also referred to as a garbage collection
strategy, hence my use of “automatic” to distinguish the two.)  The big
advantage of automatic garbage collection is that the user doesn’t need to call
@code{free()} explicitly.  (Another claimed advantage is an improvement in speed
or memory usage — this is no hard fact however.)  The disadvantage is that for
C, there is no truly portable automatic garbage collector, while reference
counting can be implemented portably (as long as the functions @code{malloc()}
and @code{free()} are available — which the C Standard guarantees). Maybe some
day a sufficiently portable automatic garbage collector will be available for C.
Until then, we’ll have to live with reference counts.

While Python uses the traditional reference counting implementation, it also
offers a cycle detector that works to detect reference cycles.  This allows
applications to not worry about creating direct or indirect circular references;
these are the weakness of garbage collection implemented using only reference
counting.  Reference cycles consist of objects which contain (possibly indirect)
references to themselves, so that each object in the cycle has a reference count
which is non-zero.  Typical reference counting implementations are not able to
reclaim the memory belonging to any objects in a reference cycle, or referenced
from the objects in the cycle, even though there are no further references to
the cycle itself.

The cycle detector is able to detect garbage cycles and can reclaim them.
The @ref{64,,gc} module exposes a way to run the detector (the
@ref{1b5,,collect()} function), as well as configuration
interfaces and the ability to disable the detector at runtime.

@menu
* Reference Counting in Python:: 
* Ownership Rules:: 
* Thin Ice:: 
* NULL Pointers:: 

@end menu

@node Reference Counting in Python,Ownership Rules,,Reference Counts
@anchor{extending/extending refcountsinpython}@anchor{5213}@anchor{extending/extending reference-counting-in-python}@anchor{5214}
@subsubsection Reference Counting in Python


There are two macros, @code{Py_INCREF(x)} and @code{Py_DECREF(x)}, which handle the
incrementing and decrementing of the reference count. @ref{791,,Py_DECREF()} also
frees the object when the count reaches zero. For flexibility, it doesn’t call
@code{free()} directly — rather, it makes a call through a function pointer in
the object’s `type object'.  For this purpose (and others), every object
also contains a pointer to its type object.

The big question now remains: when to use @code{Py_INCREF(x)} and @code{Py_DECREF(x)}?
Let’s first introduce some terms.  Nobody “owns” an object; however, you can
`own a reference' to an object.  An object’s reference count is now defined
as the number of owned references to it.  The owner of a reference is
responsible for calling @ref{791,,Py_DECREF()} when the reference is no longer
needed.  Ownership of a reference can be transferred.  There are three ways to
dispose of an owned reference: pass it on, store it, or call @code{Py_DECREF()}.
Forgetting to dispose of an owned reference creates a memory leak.

It is also possible to `borrow' @footnote{
The metaphor of “borrowing” a reference is not completely correct: the owner
still has a copy of the reference.
} a reference to an object.  The
borrower of a reference should not call @ref{791,,Py_DECREF()}.  The borrower must
not hold on to the object longer than the owner from which it was borrowed.
Using a borrowed reference after the owner has disposed of it risks using freed
memory and should be avoided completely @footnote{
Checking that the reference count is at least 1 `does not work' — the
reference count itself could be in freed memory and may thus be reused for
another object!
}.

The advantage of borrowing over owning a reference is that you don’t need to
take care of disposing of the reference on all possible paths through the code
— in other words, with a borrowed reference you don’t run the risk of leaking
when a premature exit is taken.  The disadvantage of borrowing over owning is
that there are some subtle situations where in seemingly correct code a borrowed
reference can be used after the owner from which it was borrowed has in fact
disposed of it.

A borrowed reference can be changed into an owned reference by calling
@ref{790,,Py_INCREF()}.  This does not affect the status of the owner from which the
reference was borrowed — it creates a new owned reference, and gives full
owner responsibilities (the new owner must dispose of the reference properly, as
well as the previous owner).

@node Ownership Rules,Thin Ice,Reference Counting in Python,Reference Counts
@anchor{extending/extending ownership-rules}@anchor{5215}@anchor{extending/extending ownershiprules}@anchor{5216}
@subsubsection Ownership Rules


Whenever an object reference is passed into or out of a function, it is part of
the function’s interface specification whether ownership is transferred with the
reference or not.

Most functions that return a reference to an object pass on ownership with the
reference.  In particular, all functions whose function it is to create a new
object, such as @ref{1c13,,PyLong_FromLong()} and @ref{3c0,,Py_BuildValue()}, pass
ownership to the receiver.  Even if the object is not actually new, you still
receive ownership of a new reference to that object.  For instance,
@code{PyLong_FromLong()} maintains a cache of popular values and can return a
reference to a cached item.

Many functions that extract objects from other objects also transfer ownership
with the reference, for instance @ref{5ef,,PyObject_GetAttrString()}.  The picture
is less clear, here, however, since a few common routines are exceptions:
@ref{5217,,PyTuple_GetItem()}, @ref{5ff,,PyList_GetItem()}, @ref{628,,PyDict_GetItem()}, and
@ref{629,,PyDict_GetItemString()} all return references that you borrow from the
tuple, list or dictionary.

The function @ref{5fc,,PyImport_AddModule()} also returns a borrowed reference, even
though it may actually create the object it returns: this is possible because an
owned reference to the object is stored in @code{sys.modules}.

When you pass an object reference into another function, in general, the
function borrows the reference from you — if it needs to store it, it will use
@ref{790,,Py_INCREF()} to become an independent owner.  There are exactly two
important exceptions to this rule: @ref{5218,,PyTuple_SetItem()} and
@ref{1900,,PyList_SetItem()}.  These functions take over ownership of the item passed
to them — even if they fail!  (Note that @ref{5219,,PyDict_SetItem()} and friends
don’t take over ownership — they are “normal.”)

When a C function is called from Python, it borrows references to its arguments
from the caller.  The caller owns a reference to the object, so the borrowed
reference’s lifetime is guaranteed until the function returns.  Only when such a
borrowed reference must be stored or passed on, it must be turned into an owned
reference by calling @ref{790,,Py_INCREF()}.

The object reference returned from a C function that is called from Python must
be an owned reference — ownership is transferred from the function to its
caller.

@node Thin Ice,NULL Pointers,Ownership Rules,Reference Counts
@anchor{extending/extending thin-ice}@anchor{521a}@anchor{extending/extending thinice}@anchor{521b}
@subsubsection Thin Ice


There are a few situations where seemingly harmless use of a borrowed reference
can lead to problems.  These all have to do with implicit invocations of the
interpreter, which can cause the owner of a reference to dispose of it.

The first and most important case to know about is using @ref{791,,Py_DECREF()} on
an unrelated object while borrowing a reference to a list item.  For instance:

@example
void
bug(PyObject *list)
@{
    PyObject *item = PyList_GetItem(list, 0);

    PyList_SetItem(list, 1, PyLong_FromLong(0L));
    PyObject_Print(item, stdout, 0); /* BUG! */
@}
@end example

This function first borrows a reference to @code{list[0]}, then replaces
@code{list[1]} with the value @code{0}, and finally prints the borrowed reference.
Looks harmless, right?  But it’s not!

Let’s follow the control flow into @ref{1900,,PyList_SetItem()}.  The list owns
references to all its items, so when item 1 is replaced, it has to dispose of
the original item 1.  Now let’s suppose the original item 1 was an instance of a
user-defined class, and let’s further suppose that the class defined a
@code{__del__()} method.  If this class instance has a reference count of 1,
disposing of it will call its @code{__del__()} method. Internally,
@code{PyList_SetItem()} calls @ref{791,,Py_DECREF()} on the replaced item,
which invokes replaced item’s corresponding
@ref{521c,,tp_dealloc} function. During
deallocation, @code{tp_dealloc} calls
@ref{ca3,,tp_finalize}, which is mapped to the
@code{__del__()} method for class instances (see 
@geindex Python Enhancement Proposals; PEP 442
PEP 442@footnote{https://peps.python.org/pep-0442/}). This entire
sequence happens synchronously within the @code{PyList_SetItem()} call.

Since it is written in Python, the @code{__del__()} method can execute arbitrary
Python code.  Could it perhaps do something to invalidate the reference to
@code{item} in @code{bug()}?  You bet!  Assuming that the list passed into
@code{bug()} is accessible to the @code{__del__()} method, it could execute a
statement to the effect of @code{del list[0]}, and assuming this was the last
reference to that object, it would free the memory associated with it, thereby
invalidating @code{item}.

The solution, once you know the source of the problem, is easy: temporarily
increment the reference count.  The correct version of the function reads:

@example
void
no_bug(PyObject *list)
@{
    PyObject *item = PyList_GetItem(list, 0);

    Py_INCREF(item);
    PyList_SetItem(list, 1, PyLong_FromLong(0L));
    PyObject_Print(item, stdout, 0);
    Py_DECREF(item);
@}
@end example

This is a true story.  An older version of Python contained variants of this bug
and someone spent a considerable amount of time in a C debugger to figure out
why his @code{__del__()} methods would fail…

The second case of problems with a borrowed reference is a variant involving
threads.  Normally, multiple threads in the Python interpreter can’t get in each
other’s way, because there is a @ref{474,,global lock}
protecting Python’s entire object space.
However, it is possible to temporarily release this lock using the macro
@ref{521d,,Py_BEGIN_ALLOW_THREADS}, and to re-acquire it using
@ref{c85,,Py_END_ALLOW_THREADS}.  This is common around blocking I/O calls, to
let other threads use the processor while waiting for the I/O to complete.
Obviously, the following function has the same problem as the previous one:

@example
void
bug(PyObject *list)
@{
    PyObject *item = PyList_GetItem(list, 0);
    Py_BEGIN_ALLOW_THREADS
    ...some blocking I/O call...
    Py_END_ALLOW_THREADS
    PyObject_Print(item, stdout, 0); /* BUG! */
@}
@end example

@node NULL Pointers,,Thin Ice,Reference Counts
@anchor{extending/extending null-pointers}@anchor{521e}@anchor{extending/extending nullpointers}@anchor{521f}
@subsubsection NULL Pointers


In general, functions that take object references as arguments do not expect you
to pass them @code{NULL} pointers, and will dump core (or cause later core dumps) if
you do so.  Functions that return object references generally return @code{NULL} only
to indicate that an exception occurred.  The reason for not testing for @code{NULL}
arguments is that functions often pass the objects they receive on to other
function — if each function were to test for @code{NULL}, there would be a lot of
redundant tests and the code would run more slowly.

It is better to test for @code{NULL} only at the “source:” when a pointer that may be
@code{NULL} is received, for example, from @code{malloc()} or from a function that
may raise an exception.

The macros @ref{790,,Py_INCREF()} and @ref{791,,Py_DECREF()} do not check for @code{NULL}
pointers — however, their variants @ref{c60,,Py_XINCREF()} and @ref{997,,Py_XDECREF()}
do.

The macros for checking for a particular object type (@code{Pytype_Check()}) don’t
check for @code{NULL} pointers — again, there is much code that calls several of
these in a row to test an object against various different expected types, and
this would generate redundant tests.  There are no variants with @code{NULL}
checking.

The C function calling mechanism guarantees that the argument list passed to C
functions (@code{args} in the examples) is never @code{NULL} — in fact it guarantees
that it is always a tuple @footnote{
These guarantees don’t hold when you use the “old” style calling convention —
this is still found in much existing code.
}.

It is a severe error to ever let a @code{NULL} pointer “escape” to the Python user.

@c Frank Stajano:
@c A pedagogically buggy example, along the lines of the previous listing, would
@c be helpful here -- showing in more concrete terms what sort of actions could
@c cause the problem. I can't very well imagine it from the description.

@node Writing Extensions in C++,Providing a C API for an Extension Module,Reference Counts,Extending Python with C or C++
@anchor{extending/extending cplusplus}@anchor{5220}@anchor{extending/extending writing-extensions-in-c}@anchor{5221}
@subsubsection Writing Extensions in C++


It is possible to write extension modules in C++.  Some restrictions apply.  If
the main program (the Python interpreter) is compiled and linked by the C
compiler, global or static objects with constructors cannot be used.  This is
not a problem if the main program is linked by the C++ compiler.  Functions that
will be called by the Python interpreter (in particular, module initialization
functions) have to be declared using @code{extern "C"}. It is unnecessary to
enclose the Python header files in @code{extern "C" @{...@}} — they use this form
already if the symbol @code{__cplusplus} is defined (all recent C++ compilers
define this symbol).

@node Providing a C API for an Extension Module,,Writing Extensions in C++,Extending Python with C or C++
@anchor{extending/extending providing-a-c-api-for-an-extension-module}@anchor{5222}@anchor{extending/extending using-capsules}@anchor{1569}
@subsubsection Providing a C API for an Extension Module


Many extension modules just provide new functions and types to be used from
Python, but sometimes the code in an extension module can be useful for other
extension modules. For example, an extension module could implement a type
“collection” which works like lists without order. Just like the standard Python
list type has a C API which permits extension modules to create and manipulate
lists, this new collection type should have a set of C functions for direct
manipulation from other extension modules.

At first sight this seems easy: just write the functions (without declaring them
@code{static}, of course), provide an appropriate header file, and document
the C API. And in fact this would work if all extension modules were always
linked statically with the Python interpreter. When modules are used as shared
libraries, however, the symbols defined in one module may not be visible to
another module. The details of visibility depend on the operating system; some
systems use one global namespace for the Python interpreter and all extension
modules (Windows, for example), whereas others require an explicit list of
imported symbols at module link time (AIX is one example), or offer a choice of
different strategies (most Unices). And even if symbols are globally visible,
the module whose functions one wishes to call might not have been loaded yet!

Portability therefore requires not to make any assumptions about symbol
visibility. This means that all symbols in extension modules should be declared
@code{static}, except for the module’s initialization function, in order to
avoid name clashes with other extension modules (as discussed in section
@ref{5200,,The Module’s Method Table and Initialization Function}). And it means that symbols that `should' be accessible from
other extension modules must be exported in a different way.

Python provides a special mechanism to pass C-level information (pointers) from
one extension module to another one: Capsules. A Capsule is a Python data type
which stores a pointer (void*).  Capsules can only be created and
accessed via their C API, but they can be passed around like any other Python
object. In particular,  they can be assigned to a name in an extension module’s
namespace. Other extension modules can then import this module, retrieve the
value of this name, and then retrieve the pointer from the Capsule.

There are many ways in which Capsules can be used to export the C API of an
extension module. Each function could get its own Capsule, or all C API pointers
could be stored in an array whose address is published in a Capsule. And the
various tasks of storing and retrieving the pointers can be distributed in
different ways between the module providing the code and the client modules.

Whichever method you choose, it’s important to name your Capsules properly.
The function @ref{5223,,PyCapsule_New()} takes a name parameter
(const char*); you’re permitted to pass in a @code{NULL} name, but
we strongly encourage you to specify a name.  Properly named Capsules provide
a degree of runtime type-safety; there is no feasible way to tell one unnamed
Capsule from another.

In particular, Capsules used to expose C APIs should be given a name following
this convention:

@example
modulename.attributename
@end example

The convenience function @ref{1c53,,PyCapsule_Import()} makes it easy to
load a C API provided via a Capsule, but only if the Capsule’s name
matches this convention.  This behavior gives C API users a high degree
of certainty that the Capsule they load contains the correct C API.

The following example demonstrates an approach that puts most of the burden on
the writer of the exporting module, which is appropriate for commonly used
library modules. It stores all C API pointers (just one in the example!) in an
array of void pointers which becomes the value of a Capsule. The header
file corresponding to the module provides a macro that takes care of importing
the module and retrieving its C API pointers; client modules only have to call
this macro before accessing the C API.

The exporting module is a modification of the @code{spam} module from section
@ref{51f4,,A Simple Example}. The function @code{spam.system()} does not call
the C library function @code{system()} directly, but a function
@code{PySpam_System()}, which would of course do something more complicated in
reality (such as adding “spam” to every command). This function
@code{PySpam_System()} is also exported to other extension modules.

The function @code{PySpam_System()} is a plain C function, declared
@code{static} like everything else:

@example
static int
PySpam_System(const char *command)
@{
    return system(command);
@}
@end example

The function @code{spam_system()} is modified in a trivial way:

@example
static PyObject *
spam_system(PyObject *self, PyObject *args)
@{
    const char *command;
    int sts;

    if (!PyArg_ParseTuple(args, "s", &command))
        return NULL;
    sts = PySpam_System(command);
    return PyLong_FromLong(sts);
@}
@end example

In the beginning of the module, right after the line

@example
#include <Python.h>
@end example

two more lines must be added:

@example
#define SPAM_MODULE
#include "spammodule.h"
@end example

The @code{#define} is used to tell the header file that it is being included in the
exporting module, not a client module. Finally, the module’s @ref{b7b,,mod_exec} function must take care of initializing the C API pointer array:

@example
static int
spam_module_exec(PyObject *m)
@{
    static void *PySpam_API[PySpam_API_pointers];
    PyObject *c_api_object;

    /* Initialize the C API pointer array */
    PySpam_API[PySpam_System_NUM] = (void *)PySpam_System;

    /* Create a Capsule containing the API pointer array's address */
    c_api_object = PyCapsule_New((void *)PySpam_API, "spam._C_API", NULL);

    if (PyModule_Add(m, "_C_API", c_api_object) < 0) @{
        return -1;
    @}

    return 0;
@}
@end example

Note that @code{PySpam_API} is declared @code{static}; otherwise the pointer
array would disappear when @code{PyInit_spam()} terminates!

The bulk of the work is in the header file @code{spammodule.h}, which looks
like this:

@example
#ifndef Py_SPAMMODULE_H
#define Py_SPAMMODULE_H
#ifdef __cplusplus
extern "C" @{
#endif

/* Header file for spammodule */

/* C API functions */
#define PySpam_System_NUM 0
#define PySpam_System_RETURN int
#define PySpam_System_PROTO (const char *command)

/* Total number of C API pointers */
#define PySpam_API_pointers 1


#ifdef SPAM_MODULE
/* This section is used when compiling spammodule.c */

static PySpam_System_RETURN PySpam_System PySpam_System_PROTO;

#else
/* This section is used in modules that use spammodule's API */

static void **PySpam_API;

#define PySpam_System \
 (*(PySpam_System_RETURN (*)PySpam_System_PROTO) PySpam_API[PySpam_System_NUM])

/* Return -1 on error, 0 on success.
 * PyCapsule_Import will set an exception if there's an error.
 */
static int
import_spam(void)
@{
    PySpam_API = (void **)PyCapsule_Import("spam._C_API", 0);
    return (PySpam_API != NULL) ? 0 : -1;
@}

#endif

#ifdef __cplusplus
@}
#endif

#endif /* !defined(Py_SPAMMODULE_H) */
@end example

All that a client module must do in order to have access to the function
@code{PySpam_System()} is to call the function (or rather macro)
@code{import_spam()} in its @ref{b7b,,mod_exec} function:

@example
static int
client_module_exec(PyObject *m)
@{
    if (import_spam() < 0) @{
        return -1;
    @}
    /* additional initialization can happen here */
    return 0;
@}
@end example

The main disadvantage of this approach is that the file @code{spammodule.h} is
rather complicated. However, the basic structure is the same for each function
that is exported, so it has to be learned only once.

Finally it should be mentioned that Capsules offer additional functionality,
which is especially useful for memory allocation and deallocation of the pointer
stored in a Capsule. The details are described in the Python/C API Reference
Manual in the section @ref{2a5c,,Capsules} and in the implementation of Capsules (files
@code{Include/pycapsule.h} and @code{Objects/pycapsule.c} in the Python source
code distribution).

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Defining Extension Types Tutorial,Defining Extension Types Assorted Topics,Extending Python with C or C++,Creating extensions without third party tools
@anchor{extending/newtypes_tutorial doc}@anchor{1bfe}@anchor{extending/newtypes_tutorial defining-extension-types-tutorial}@anchor{5224}@anchor{extending/newtypes_tutorial defining-new-types}@anchor{5225}@anchor{extending/newtypes_tutorial translation-repo}@anchor{5226}
@subsection Defining Extension Types: Tutorial


Python allows the writer of a C extension module to define new types that
can be manipulated from Python code, much like the built-in @ref{16a,,str}
and @ref{24f,,list} types.  The code for all extension types follows a
pattern, but there are some details that you need to understand before you
can get started.  This document is a gentle introduction to the topic.

@menu
* The Basics:: 
* Adding data and methods to the Basic example:: 
* Providing finer control over data attributes:: 
* Supporting cyclic garbage collection:: 
* Subclassing other types:: 

@end menu

@node The Basics,Adding data and methods to the Basic example,,Defining Extension Types Tutorial
@anchor{extending/newtypes_tutorial dnt-basics}@anchor{5227}@anchor{extending/newtypes_tutorial the-basics}@anchor{5228}
@subsubsection The Basics


The @ref{907,,CPython} runtime sees all Python objects as variables of type
@ref{5df,,PyObject}*, which serves as a “base type” for all Python objects.
The @ref{5df,,PyObject} structure itself only contains the object’s
@ref{5229,,reference count} and a pointer to the object’s “type object”.
This is where the action is; the type object determines which (C) functions
get called by the interpreter when, for instance, an attribute gets looked up
on an object, a method called, or it is multiplied by another object.  These
C functions are called “type methods”.

So, if you want to define a new extension type, you need to create a new type
object.

This sort of thing can only be explained by example, so here’s a minimal, but
complete, module that defines a new type named @code{Custom} inside a C
extension module @code{custom}:

@cartouche
@quotation Note 
What we’re showing here is the traditional way of defining `static'
extension types.  It should be adequate for most uses.  The C API also
allows defining heap-allocated extension types using the
@ref{79e,,PyType_FromSpec()} function, which isn’t covered in this tutorial.
@end quotation
@end cartouche

@example
#define PY_SSIZE_T_CLEAN
#include <Python.h>

typedef struct @{
    PyObject_HEAD
    /* Type-specific fields go here. */
@} CustomObject;

static PyTypeObject CustomType = @{
    .ob_base = PyVarObject_HEAD_INIT(NULL, 0)
    .tp_name = "custom.Custom",
    .tp_doc = PyDoc_STR("Custom objects"),
    .tp_basicsize = sizeof(CustomObject),
    .tp_itemsize = 0,
    .tp_flags = Py_TPFLAGS_DEFAULT,
    .tp_new = PyType_GenericNew,
@};

static int
custom_module_exec(PyObject *m)
@{
    if (PyType_Ready(&CustomType) < 0) @{
        return -1;
    @}

    if (PyModule_AddObjectRef(m, "Custom", (PyObject *) &CustomType) < 0) @{
        return -1;
    @}

    return 0;
@}

static PyModuleDef_Slot custom_module_slots[] = @{
    @{Py_mod_exec, custom_module_exec@},
    // Just use this while using static types
    @{Py_mod_multiple_interpreters, Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED@},
    @{0, NULL@}
@};

static PyModuleDef custom_module = @{
    .m_base = PyModuleDef_HEAD_INIT,
    .m_name = "custom",
    .m_doc = "Example module that creates an extension type.",
    .m_size = 0,
    .m_slots = custom_module_slots,
@};

PyMODINIT_FUNC
PyInit_custom(void)
@{
    return PyModuleDef_Init(&custom_module);
@}
@end example

Now that’s quite a bit to take in at once, but hopefully bits will seem familiar
from the previous chapter.  This file defines three things:


@enumerate 

@item 
What a @code{Custom} `object' contains: this is the @code{CustomObject}
struct, which is allocated once for each @code{Custom} instance.

@item 
How the @code{Custom} `type' behaves: this is the @code{CustomType} struct,
which defines a set of flags and function pointers that the interpreter
inspects when specific operations are requested.

@item 
How to define and execute the @code{custom} module: this is the
@code{PyInit_custom} function and the associated @code{custom_module} struct for
defining the module, and the @code{custom_module_exec} function to set up
a fresh module object.
@end enumerate

The first bit is:

@example
typedef struct @{
    PyObject_HEAD
@} CustomObject;
@end example

This is what a Custom object will contain.  @code{PyObject_HEAD} is mandatory
at the start of each object struct and defines a field called @code{ob_base}
of type @ref{5df,,PyObject}, containing a pointer to a type object and a
reference count (these can be accessed using the macros @ref{3c7,,Py_TYPE}
and @ref{2d1,,Py_REFCNT} respectively).  The reason for the macro is to
abstract away the layout and to enable additional fields in @ref{50a,,debug builds}.

@cartouche
@quotation Note 
There is no semicolon above after the @ref{14e9,,PyObject_HEAD} macro.
Be wary of adding one by accident: some compilers will complain.
@end quotation
@end cartouche

Of course, objects generally store additional data besides the standard
@code{PyObject_HEAD} boilerplate; for example, here is the definition for
standard Python floats:

@example
typedef struct @{
    PyObject_HEAD
    double ob_fval;
@} PyFloatObject;
@end example

The second bit is the definition of the type object.

@example
static PyTypeObject CustomType = @{
    .ob_base = PyVarObject_HEAD_INIT(NULL, 0)
    .tp_name = "custom.Custom",
    .tp_doc = PyDoc_STR("Custom objects"),
    .tp_basicsize = sizeof(CustomObject),
    .tp_itemsize = 0,
    .tp_flags = Py_TPFLAGS_DEFAULT,
    .tp_new = PyType_GenericNew,
@};
@end example

@cartouche
@quotation Note 
We recommend using C99-style designated initializers as above, to
avoid listing all the @ref{ca2,,PyTypeObject} fields that you don’t care
about and also to avoid caring about the fields’ declaration order.
@end quotation
@end cartouche

The actual definition of @ref{ca2,,PyTypeObject} in @code{object.h} has
many more @ref{b8a,,fields} than the definition above.  The
remaining fields will be filled with zeros by the C compiler, and it’s
common practice to not specify them explicitly unless you need them.

We’re going to pick it apart, one field at a time:

@example
.ob_base = PyVarObject_HEAD_INIT(NULL, 0)
@end example

This line is mandatory boilerplate to initialize the @code{ob_base}
field mentioned above.

@example
.tp_name = "custom.Custom",
@end example

The name of our type.  This will appear in the default textual representation of
our objects and in some error messages, for example:

@example
>>> "" + custom.Custom()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate str (not "custom.Custom") to str
@end example

Note that the name is a dotted name that includes both the module name and the
name of the type within the module. The module in this case is @code{custom} and
the type is @code{Custom}, so we set the type name to @code{custom.Custom}.
Using the real dotted import path is important to make your type compatible
with the @ref{ba,,pydoc} and @ref{ab,,pickle} modules.

@example
.tp_basicsize = sizeof(CustomObject),
.tp_itemsize = 0,
@end example

This is so that Python knows how much memory to allocate when creating
new @code{Custom} instances.  @ref{2402,,tp_itemsize} is
only used for variable-sized objects and should otherwise be zero.

@cartouche
@quotation Note 
If you want your type to be subclassable from Python, and your type has the same
@ref{b84,,tp_basicsize} as its base type, you may have problems with multiple
inheritance.  A Python subclass of your type will have to list your type first
in its @ref{16b8,,__bases__}, or else it will not be able to call your type’s
@ref{7a1,,__new__()} method without getting an error.  You can avoid this problem by
ensuring that your type has a larger value for @code{tp_basicsize} than its
base type does.  Most of the time, this will be true anyway, because either your
base type will be @ref{c84,,object}, or else you will be adding data members to
your base type, and therefore increasing its size.
@end quotation
@end cartouche

We set the class flags to @ref{522a,,Py_TPFLAGS_DEFAULT}.

@example
.tp_flags = Py_TPFLAGS_DEFAULT,
@end example

All types should include this constant in their flags.  It enables all of the
members defined until at least Python 3.3.  If you need further members,
you will need to OR the corresponding flags.

We provide a doc string for the type in @ref{522b,,tp_doc}.

@example
.tp_doc = PyDoc_STR("Custom objects"),
@end example

To enable object creation, we have to provide a @ref{7a0,,tp_new}
handler.  This is the equivalent of the Python method @ref{7a1,,__new__()}, but
has to be specified explicitly.  In this case, we can just use the default
implementation provided by the API function @ref{522c,,PyType_GenericNew()}.

@example
.tp_new = PyType_GenericNew,
@end example

Everything else in the file should be familiar, except for some code in
@code{custom_module_exec()}:

@example
if (PyType_Ready(&CustomType) < 0) @{
    return -1;
@}
@end example

This initializes the @code{Custom} type, filling in a number of members
to the appropriate default values, including @ref{522d,,ob_type} that we initially
set to @code{NULL}.

@example
if (PyModule_AddObjectRef(m, "Custom", (PyObject *) &CustomType) < 0) @{
    return -1;
@}
@end example

This adds the type to the module dictionary.  This allows us to create
@code{Custom} instances by calling the @code{Custom} class:

@example
>>> import custom
>>> mycustom = custom.Custom()
@end example

That’s it!  All that remains is to build it; put the above code in a file called
@code{custom.c},

@example
[build-system]
requires = ["setuptools"]
build-backend = "setuptools.build_meta"

[project]
name = "custom"
version = "1"
@end example

in a file called @code{pyproject.toml}, and

@example
from setuptools import Extension, setup
setup(ext_modules=[Extension("custom", ["custom.c"])])
@end example

in a file called @code{setup.py}; then typing

@example
$ python -m pip install .
@end example

in a shell should produce a file @code{custom.so} in a subdirectory
and install it; now fire up Python — you should be able to @code{import custom}
and play around with @code{Custom} objects.

That wasn’t so hard, was it?

Of course, the current Custom type is pretty uninteresting. It has no data and
doesn’t do anything. It can’t even be subclassed.

@node Adding data and methods to the Basic example,Providing finer control over data attributes,The Basics,Defining Extension Types Tutorial
@anchor{extending/newtypes_tutorial adding-data-and-methods-to-the-basic-example}@anchor{522e}
@subsubsection Adding data and methods to the Basic example


Let’s extend the basic example to add some data and methods.  Let’s also make
the type usable as a base class. We’ll create a new module, @code{custom2} that
adds these capabilities:

@example
#define PY_SSIZE_T_CLEAN
#include <Python.h>
#include <stddef.h> /* for offsetof() */

typedef struct @{
    PyObject_HEAD
    PyObject *first; /* first name */
    PyObject *last;  /* last name */
    int number;
@} CustomObject;

static void
Custom_dealloc(PyObject *op)
@{
    CustomObject *self = (CustomObject *) op;
    Py_XDECREF(self->first);
    Py_XDECREF(self->last);
    Py_TYPE(self)->tp_free(self);
@}

static PyObject *
Custom_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
@{
    CustomObject *self;
    self = (CustomObject *) type->tp_alloc(type, 0);
    if (self != NULL) @{
        self->first = Py_GetConstant(Py_CONSTANT_EMPTY_STR);
        if (self->first == NULL) @{
            Py_DECREF(self);
            return NULL;
        @}
        self->last = Py_GetConstant(Py_CONSTANT_EMPTY_STR);
        if (self->last == NULL) @{
            Py_DECREF(self);
            return NULL;
        @}
        self->number = 0;
    @}
    return (PyObject *) self;
@}

static int
Custom_init(PyObject *op, PyObject *args, PyObject *kwds)
@{
    CustomObject *self = (CustomObject *) op;
    static char *kwlist[] = @{"first", "last", "number", NULL@};
    PyObject *first = NULL, *last = NULL;

    if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OOi", kwlist,
                                     &first, &last,
                                     &self->number))
        return -1;

    if (first) @{
        Py_XSETREF(self->first, Py_NewRef(first));
    @}
    if (last) @{
        Py_XSETREF(self->last, Py_NewRef(last));
    @}
    return 0;
@}

static PyMemberDef Custom_members[] = @{
    @{"first", Py_T_OBJECT_EX, offsetof(CustomObject, first), 0,
     "first name"@},
    @{"last", Py_T_OBJECT_EX, offsetof(CustomObject, last), 0,
     "last name"@},
    @{"number", Py_T_INT, offsetof(CustomObject, number), 0,
     "custom number"@},
    @{NULL@}  /* Sentinel */
@};

static PyObject *
Custom_name(PyObject *op, PyObject *Py_UNUSED(dummy))
@{
    CustomObject *self = (CustomObject *) op;
    if (self->first == NULL) @{
        PyErr_SetString(PyExc_AttributeError, "first");
        return NULL;
    @}
    if (self->last == NULL) @{
        PyErr_SetString(PyExc_AttributeError, "last");
        return NULL;
    @}
    return PyUnicode_FromFormat("%S %S", self->first, self->last);
@}

static PyMethodDef Custom_methods[] = @{
    @{"name", Custom_name, METH_NOARGS,
     "Return the name, combining the first and last name"
    @},
    @{NULL@}  /* Sentinel */
@};

static PyTypeObject CustomType = @{
    .ob_base = PyVarObject_HEAD_INIT(NULL, 0)
    .tp_name = "custom2.Custom",
    .tp_doc = PyDoc_STR("Custom objects"),
    .tp_basicsize = sizeof(CustomObject),
    .tp_itemsize = 0,
    .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
    .tp_new = Custom_new,
    .tp_init = Custom_init,
    .tp_dealloc = Custom_dealloc,
    .tp_members = Custom_members,
    .tp_methods = Custom_methods,
@};

static int
custom_module_exec(PyObject *m)
@{
    if (PyType_Ready(&CustomType) < 0) @{
        return -1;
    @}

    if (PyModule_AddObjectRef(m, "Custom", (PyObject *) &CustomType) < 0) @{
        return -1;
    @}

    return 0;
@}

static PyModuleDef_Slot custom_module_slots[] = @{
    @{Py_mod_exec, custom_module_exec@},
    @{Py_mod_multiple_interpreters, Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED@},
    @{0, NULL@}
@};

static PyModuleDef custom_module = @{
    .m_base = PyModuleDef_HEAD_INIT,
    .m_name = "custom2",
    .m_doc = "Example module that creates an extension type.",
    .m_size = 0,
    .m_slots = custom_module_slots,
@};

PyMODINIT_FUNC
PyInit_custom2(void)
@{
    return PyModuleDef_Init(&custom_module);
@}
@end example

This version of the module has a number of changes.

The  @code{Custom} type now has three data attributes in its C struct,
`first', `last', and `number'.  The `first' and `last' variables are Python
strings containing first and last names.  The `number' attribute is a C integer.

The object structure is updated accordingly:

@example
typedef struct @{
    PyObject_HEAD
    PyObject *first; /* first name */
    PyObject *last;  /* last name */
    int number;
@} CustomObject;
@end example

Because we now have data to manage, we have to be more careful about object
allocation and deallocation.  At a minimum, we need a deallocation method:

@example
static void
Custom_dealloc(PyObject *op)
@{
    CustomObject *self = (CustomObject *) op;
    Py_XDECREF(self->first);
    Py_XDECREF(self->last);
    Py_TYPE(self)->tp_free(self);
@}
@end example

which is assigned to the @ref{521c,,tp_dealloc} member:

@example
.tp_dealloc = Custom_dealloc,
@end example

This method first clears the reference counts of the two Python attributes.
@ref{997,,Py_XDECREF()} correctly handles the case where its argument is
@code{NULL} (which might happen here if @code{tp_new} failed midway).  It then
calls the @ref{522f,,tp_free} member of the object’s type
(computed by @code{Py_TYPE(self)}) to free the object’s memory.  Note that
the object’s type might not be @code{CustomType}, because the object may
be an instance of a subclass.

@cartouche
@quotation Note 
The explicit cast to @code{CustomObject *} above is needed because we defined
@code{Custom_dealloc} to take a @code{PyObject *} argument, as the @code{tp_dealloc}
function pointer expects to receive a @code{PyObject *} argument.
By assigning to the @code{tp_dealloc} slot of a type, we declare
that it can only be called with instances of our @code{CustomObject}
class, so the cast to @code{(CustomObject *)} is safe.
This is object-oriented polymorphism, in C!

In existing code, or in previous versions of this tutorial,
you might see similar functions take a pointer to the subtype
object structure (@code{CustomObject*}) directly, like this:

@example
Custom_dealloc(CustomObject *self)
@{
    Py_XDECREF(self->first);
    Py_XDECREF(self->last);
    Py_TYPE(self)->tp_free((PyObject *) self);
@}
...
.tp_dealloc = (destructor) Custom_dealloc,
@end example

This does the same thing on all architectures that CPython
supports, but according to the C standard, it invokes
undefined behavior.
@end quotation
@end cartouche

We want to make sure that the first and last names are initialized to empty
strings, so we provide a @code{tp_new} implementation:

@example
static PyObject *
Custom_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
@{
    CustomObject *self;
    self = (CustomObject *) type->tp_alloc(type, 0);
    if (self != NULL) @{
        self->first = PyUnicode_FromString("");
        if (self->first == NULL) @{
            Py_DECREF(self);
            return NULL;
        @}
        self->last = PyUnicode_FromString("");
        if (self->last == NULL) @{
            Py_DECREF(self);
            return NULL;
        @}
        self->number = 0;
    @}
    return (PyObject *) self;
@}
@end example

and install it in the @ref{7a0,,tp_new} member:

@example
.tp_new = Custom_new,
@end example

The @code{tp_new} handler is responsible for creating (as opposed to initializing)
objects of the type.  It is exposed in Python as the @ref{7a1,,__new__()} method.
It is not required to define a @code{tp_new} member, and indeed many extension
types will simply reuse @ref{522c,,PyType_GenericNew()} as done in the first
version of the @code{Custom} type above.  In this case, we use the @code{tp_new}
handler to initialize the @code{first} and @code{last} attributes to non-@code{NULL}
default values.

@code{tp_new} is passed the type being instantiated (not necessarily @code{CustomType},
if a subclass is instantiated) and any arguments passed when the type was
called, and is expected to return the instance created.  @code{tp_new} handlers
always accept positional and keyword arguments, but they often ignore the
arguments, leaving the argument handling to initializer (a.k.a. @code{tp_init}
in C or @code{__init__} in Python) methods.

@cartouche
@quotation Note 
@code{tp_new} shouldn’t call @code{tp_init} explicitly, as the interpreter
will do it itself.
@end quotation
@end cartouche

The @code{tp_new} implementation calls the @ref{5230,,tp_alloc}
slot to allocate memory:

@example
self = (CustomObject *) type->tp_alloc(type, 0);
@end example

Since memory allocation may fail, we must check the @ref{5230,,tp_alloc}
result against @code{NULL} before proceeding.

@cartouche
@quotation Note 
We didn’t fill the @ref{5230,,tp_alloc} slot ourselves. Rather
@ref{985,,PyType_Ready()} fills it for us by inheriting it from our base class,
which is @ref{c84,,object} by default.  Most types use the default allocation
strategy.
@end quotation
@end cartouche

@cartouche
@quotation Note 
If you are creating a co-operative @ref{7a0,,tp_new} (one
that calls a base type’s @code{tp_new} or @ref{7a1,,__new__()}),
you must `not' try to determine what method to call using method resolution
order at runtime.  Always statically determine what type you are going to
call, and call its @code{tp_new} directly, or via
@code{type->tp_base->tp_new}.  If you do not do this, Python subclasses of your
type that also inherit from other Python-defined classes may not work correctly.
(Specifically, you may not be able to create instances of such subclasses
without getting a @ref{199,,TypeError}.)
@end quotation
@end cartouche

We also define an initialization function which accepts arguments to provide
initial values for our instance:

@example
static int
Custom_init(PyObject *op, PyObject *args, PyObject *kwds)
@{
    CustomObject *self = (CustomObject *) op;
    static char *kwlist[] = @{"first", "last", "number", NULL@};
    PyObject *first = NULL, *last = NULL, *tmp;

    if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OOi", kwlist,
                                     &first, &last,
                                     &self->number))
        return -1;

    if (first) @{
        tmp = self->first;
        Py_INCREF(first);
        self->first = first;
        Py_XDECREF(tmp);
    @}
    if (last) @{
        tmp = self->last;
        Py_INCREF(last);
        self->last = last;
        Py_XDECREF(tmp);
    @}
    return 0;
@}
@end example

by filling the @ref{7a2,,tp_init} slot.

@example
.tp_init = Custom_init,
@end example

The @ref{7a2,,tp_init} slot is exposed in Python as the
@ref{8c1,,__init__()} method.  It is used to initialize an object after it’s
created.  Initializers always accept positional and keyword arguments,
and they should return either @code{0} on success or @code{-1} on error.

Unlike the @code{tp_new} handler, there is no guarantee that @code{tp_init}
is called at all (for example, the @ref{ab,,pickle} module by default
doesn’t call @ref{8c1,,__init__()} on unpickled instances).  It can also be
called multiple times.  Anyone can call the @code{__init__()} method on
our objects.  For this reason, we have to be extra careful when assigning
the new attribute values.  We might be tempted, for example to assign the
@code{first} member like this:

@example
if (first) @{
    Py_XDECREF(self->first);
    Py_INCREF(first);
    self->first = first;
@}
@end example

But this would be risky.  Our type doesn’t restrict the type of the
@code{first} member, so it could be any kind of object.  It could have a
destructor that causes code to be executed that tries to access the
@code{first} member; or that destructor could detach the
@ref{5231,,thread state} and let arbitrary code run in other
threads that accesses and modifies our object.

To be paranoid and protect ourselves against this possibility, we almost
always reassign members before decrementing their reference counts.  When
don’t we have to do this?


@itemize *

@item 
when we absolutely know that the reference count is greater than 1;

@item 
when we know that deallocation of the object @footnote{
This is true when we know that the object is a basic type, like a string or a
float.
} will neither detach
the @ref{5231,,thread state} nor cause any calls back into our type’s code;

@item 
when decrementing a reference count in a @ref{521c,,tp_dealloc}
handler on a type which doesn’t support cyclic garbage collection @footnote{
We relied on this in the @ref{521c,,tp_dealloc} handler
in this example, because our type doesn’t support garbage collection.
}.
@end itemize

We want to expose our instance variables as attributes. There are a
number of ways to do that. The simplest way is to define member definitions:

@example
static PyMemberDef Custom_members[] = @{
    @{"first", Py_T_OBJECT_EX, offsetof(CustomObject, first), 0,
     "first name"@},
    @{"last", Py_T_OBJECT_EX, offsetof(CustomObject, last), 0,
     "last name"@},
    @{"number", Py_T_INT, offsetof(CustomObject, number), 0,
     "custom number"@},
    @{NULL@}  /* Sentinel */
@};
@end example

and put the definitions in the @ref{5232,,tp_members} slot:

@example
.tp_members = Custom_members,
@end example

Each member definition has a member name, type, offset, access flags and
documentation string.  See the @ref{5233,,Generic Attribute Management} section
below for details.

A disadvantage of this approach is that it doesn’t provide a way to restrict the
types of objects that can be assigned to the Python attributes.  We expect the
first and last names to be strings, but any Python objects can be assigned.
Further, the attributes can be deleted, setting the C pointers to @code{NULL}.  Even
though we can make sure the members are initialized to non-@code{NULL} values, the
members can be set to @code{NULL} if the attributes are deleted.

We define a single method, @code{Custom.name()}, that outputs the objects name as the
concatenation of the first and last names.

@example
static PyObject *
Custom_name(PyObject *op, PyObject *Py_UNUSED(dummy))
@{
    CustomObject *self = (CustomObject *) op;
    if (self->first == NULL) @{
        PyErr_SetString(PyExc_AttributeError, "first");
        return NULL;
    @}
    if (self->last == NULL) @{
        PyErr_SetString(PyExc_AttributeError, "last");
        return NULL;
    @}
    return PyUnicode_FromFormat("%S %S", self->first, self->last);
@}
@end example

The method is implemented as a C function that takes a @code{Custom} (or
@code{Custom} subclass) instance as the first argument.  Methods always take an
instance as the first argument. Methods often take positional and keyword
arguments as well, but in this case we don’t take any and don’t need to accept
a positional argument tuple or keyword argument dictionary. This method is
equivalent to the Python method:

@example
def name(self):
    return "%s %s" % (self.first, self.last)
@end example

Note that we have to check for the possibility that our @code{first} and
@code{last} members are @code{NULL}.  This is because they can be deleted, in which
case they are set to @code{NULL}.  It would be better to prevent deletion of these
attributes and to restrict the attribute values to be strings.  We’ll see how to
do that in the next section.

Now that we’ve defined the method, we need to create an array of method
definitions:

@example
static PyMethodDef Custom_methods[] = @{
    @{"name", Custom_name, METH_NOARGS,
     "Return the name, combining the first and last name"
    @},
    @{NULL@}  /* Sentinel */
@};
@end example

(note that we used the @ref{16e0,,METH_NOARGS} flag to indicate that the method
is expecting no arguments other than `self')

and assign it to the @ref{5234,,tp_methods} slot:

@example
.tp_methods = Custom_methods,
@end example

Finally, we’ll make our type usable as a base class for subclassing.  We’ve
written our methods carefully so far so that they don’t make any assumptions
about the type of the object being created or used, so all we need to do is
to add the @ref{5235,,Py_TPFLAGS_BASETYPE} to our class flag definition:

@example
.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
@end example

We rename @code{PyInit_custom()} to @code{PyInit_custom2()}, update the
module name in the @ref{b7a,,PyModuleDef} struct, and update the full class
name in the @ref{ca2,,PyTypeObject} struct.

Finally, we update our @code{setup.py} file to include the new module,

@example
from setuptools import Extension, setup
setup(ext_modules=[
    Extension("custom", ["custom.c"]),
    Extension("custom2", ["custom2.c"]),
])
@end example

and then we re-install so that we can @code{import custom2}:

@example
$ python -m pip install .
@end example

@node Providing finer control over data attributes,Supporting cyclic garbage collection,Adding data and methods to the Basic example,Defining Extension Types Tutorial
@anchor{extending/newtypes_tutorial providing-finer-control-over-data-attributes}@anchor{5236}
@subsubsection Providing finer control over data attributes


In this section, we’ll provide finer control over how the @code{first} and
@code{last} attributes are set in the @code{Custom} example. In the previous
version of our module, the instance variables @code{first} and @code{last}
could be set to non-string values or even deleted. We want to make sure that
these attributes always contain strings.

@example
#define PY_SSIZE_T_CLEAN
#include <Python.h>
#include <stddef.h> /* for offsetof() */

typedef struct @{
    PyObject_HEAD
    PyObject *first; /* first name */
    PyObject *last;  /* last name */
    int number;
@} CustomObject;

static void
Custom_dealloc(PyObject *op)
@{
    CustomObject *self = (CustomObject *) op;
    Py_XDECREF(self->first);
    Py_XDECREF(self->last);
    Py_TYPE(self)->tp_free(self);
@}

static PyObject *
Custom_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
@{
    CustomObject *self;
    self = (CustomObject *) type->tp_alloc(type, 0);
    if (self != NULL) @{
        self->first = Py_GetConstant(Py_CONSTANT_EMPTY_STR);
        if (self->first == NULL) @{
            Py_DECREF(self);
            return NULL;
        @}
        self->last = Py_GetConstant(Py_CONSTANT_EMPTY_STR);
        if (self->last == NULL) @{
            Py_DECREF(self);
            return NULL;
        @}
        self->number = 0;
    @}
    return (PyObject *) self;
@}

static int
Custom_init(PyObject *op, PyObject *args, PyObject *kwds)
@{
    CustomObject *self = (CustomObject *) op;
    static char *kwlist[] = @{"first", "last", "number", NULL@};
    PyObject *first = NULL, *last = NULL;

    if (!PyArg_ParseTupleAndKeywords(args, kwds, "|UUi", kwlist,
                                     &first, &last,
                                     &self->number))
        return -1;

    if (first) @{
        Py_SETREF(self->first, Py_NewRef(first));
    @}
    if (last) @{
        Py_SETREF(self->last, Py_NewRef(last));
    @}
    return 0;
@}

static PyMemberDef Custom_members[] = @{
    @{"number", Py_T_INT, offsetof(CustomObject, number), 0,
     "custom number"@},
    @{NULL@}  /* Sentinel */
@};

static PyObject *
Custom_getfirst(PyObject *op, void *closure)
@{
    CustomObject *self = (CustomObject *) op;
    return Py_NewRef(self->first);
@}

static int
Custom_setfirst(PyObject *op, PyObject *value, void *closure)
@{
    CustomObject *self = (CustomObject *) op;
    if (value == NULL) @{
        PyErr_SetString(PyExc_TypeError, "Cannot delete the first attribute");
        return -1;
    @}
    if (!PyUnicode_Check(value)) @{
        PyErr_SetString(PyExc_TypeError,
                        "The first attribute value must be a string");
        return -1;
    @}
    Py_SETREF(self->first, Py_NewRef(value));
    return 0;
@}

static PyObject *
Custom_getlast(PyObject *op, void *closure)
@{
    CustomObject *self = (CustomObject *) op;
    return Py_NewRef(self->last);
@}

static int
Custom_setlast(PyObject *op, PyObject *value, void *closure)
@{
    CustomObject *self = (CustomObject *) op;
    if (value == NULL) @{
        PyErr_SetString(PyExc_TypeError, "Cannot delete the last attribute");
        return -1;
    @}
    if (!PyUnicode_Check(value)) @{
        PyErr_SetString(PyExc_TypeError,
                        "The last attribute value must be a string");
        return -1;
    @}
    Py_SETREF(self->last, Py_NewRef(value));
    return 0;
@}

static PyGetSetDef Custom_getsetters[] = @{
    @{"first", Custom_getfirst, Custom_setfirst,
     "first name", NULL@},
    @{"last", Custom_getlast, Custom_setlast,
     "last name", NULL@},
    @{NULL@}  /* Sentinel */
@};

static PyObject *
Custom_name(PyObject *op, PyObject *Py_UNUSED(dummy))
@{
    CustomObject *self = (CustomObject *) op;
    return PyUnicode_FromFormat("%S %S", self->first, self->last);
@}

static PyMethodDef Custom_methods[] = @{
    @{"name", Custom_name, METH_NOARGS,
     "Return the name, combining the first and last name"
    @},
    @{NULL@}  /* Sentinel */
@};

static PyTypeObject CustomType = @{
    .ob_base = PyVarObject_HEAD_INIT(NULL, 0)
    .tp_name = "custom3.Custom",
    .tp_doc = PyDoc_STR("Custom objects"),
    .tp_basicsize = sizeof(CustomObject),
    .tp_itemsize = 0,
    .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
    .tp_new = Custom_new,
    .tp_init = Custom_init,
    .tp_dealloc = Custom_dealloc,
    .tp_members = Custom_members,
    .tp_methods = Custom_methods,
    .tp_getset = Custom_getsetters,
@};

static int
custom_module_exec(PyObject *m)
@{
    if (PyType_Ready(&CustomType) < 0) @{
        return -1;
    @}

    if (PyModule_AddObjectRef(m, "Custom", (PyObject *) &CustomType) < 0) @{
        return -1;
    @}

    return 0;
@}

static PyModuleDef_Slot custom_module_slots[] = @{
    @{Py_mod_exec, custom_module_exec@},
    @{Py_mod_multiple_interpreters, Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED@},
    @{0, NULL@}
@};

static PyModuleDef custom_module = @{
    .m_base = PyModuleDef_HEAD_INIT,
    .m_name = "custom3",
    .m_doc = "Example module that creates an extension type.",
    .m_size = 0,
    .m_slots = custom_module_slots,
@};

PyMODINIT_FUNC
PyInit_custom3(void)
@{
    return PyModuleDef_Init(&custom_module);
@}
@end example

To provide greater control, over the @code{first} and @code{last} attributes,
we’ll use custom getter and setter functions.  Here are the functions for
getting and setting the @code{first} attribute:

@example
static PyObject *
Custom_getfirst(PyObject *op, void *closure)
@{
    CustomObject *self = (CustomObject *) op;
    Py_INCREF(self->first);
    return self->first;
@}

static int
Custom_setfirst(PyObject *op, PyObject *value, void *closure)
@{
    CustomObject *self = (CustomObject *) op;
    PyObject *tmp;
    if (value == NULL) @{
        PyErr_SetString(PyExc_TypeError, "Cannot delete the first attribute");
        return -1;
    @}
    if (!PyUnicode_Check(value)) @{
        PyErr_SetString(PyExc_TypeError,
                        "The first attribute value must be a string");
        return -1;
    @}
    tmp = self->first;
    Py_INCREF(value);
    self->first = value;
    Py_DECREF(tmp);
    return 0;
@}
@end example

The getter function is passed a @code{Custom} object and a “closure”, which is
a void pointer.  In this case, the closure is ignored.  (The closure supports an
advanced usage in which definition data is passed to the getter and setter. This
could, for example, be used to allow a single set of getter and setter functions
that decide the attribute to get or set based on data in the closure.)

The setter function is passed the @code{Custom} object, the new value, and the
closure.  The new value may be @code{NULL}, in which case the attribute is being
deleted.  In our setter, we raise an error if the attribute is deleted or if its
new value is not a string.

We create an array of @ref{db8,,PyGetSetDef} structures:

@example
static PyGetSetDef Custom_getsetters[] = @{
    @{"first", Custom_getfirst, Custom_setfirst,
     "first name", NULL@},
    @{"last", Custom_getlast, Custom_setlast,
     "last name", NULL@},
    @{NULL@}  /* Sentinel */
@};
@end example

and register it in the @ref{5237,,tp_getset} slot:

@example
.tp_getset = Custom_getsetters,
@end example

The last item in a @ref{db8,,PyGetSetDef} structure is the “closure” mentioned
above.  In this case, we aren’t using a closure, so we just pass @code{NULL}.

We also remove the member definitions for these attributes:

@example
static PyMemberDef Custom_members[] = @{
    @{"number", Py_T_INT, offsetof(CustomObject, number), 0,
     "custom number"@},
    @{NULL@}  /* Sentinel */
@};
@end example

We also need to update the @ref{7a2,,tp_init} handler to only
allow strings @footnote{
We now know that the first and last members are strings, so perhaps we
could be less careful about decrementing their reference counts, however,
we accept instances of string subclasses.  Even though deallocating normal
strings won’t call back into our objects, we can’t guarantee that deallocating
an instance of a string subclass won’t call back into our objects.
} to be passed:

@example
static int
Custom_init(PyObject *op, PyObject *args, PyObject *kwds)
@{
    CustomObject *self = (CustomObject *) op;
    static char *kwlist[] = @{"first", "last", "number", NULL@};
    PyObject *first = NULL, *last = NULL, *tmp;

    if (!PyArg_ParseTupleAndKeywords(args, kwds, "|UUi", kwlist,
                                     &first, &last,
                                     &self->number))
        return -1;

    if (first) @{
        tmp = self->first;
        Py_INCREF(first);
        self->first = first;
        Py_DECREF(tmp);
    @}
    if (last) @{
        tmp = self->last;
        Py_INCREF(last);
        self->last = last;
        Py_DECREF(tmp);
    @}
    return 0;
@}
@end example

With these changes, we can assure that the @code{first} and @code{last} members are
never @code{NULL} so we can remove checks for @code{NULL} values in almost all cases.
This means that most of the @ref{997,,Py_XDECREF()} calls can be converted to
@ref{791,,Py_DECREF()} calls.  The only place we can’t change these calls is in
the @code{tp_dealloc} implementation, where there is the possibility that the
initialization of these members failed in @code{tp_new}.

We also rename the module initialization function and module name in the
initialization function, as we did before, and we add an extra definition to the
@code{setup.py} file.

@node Supporting cyclic garbage collection,Subclassing other types,Providing finer control over data attributes,Defining Extension Types Tutorial
@anchor{extending/newtypes_tutorial supporting-cyclic-garbage-collection}@anchor{5238}
@subsubsection Supporting cyclic garbage collection


Python has a @ref{1826,,cyclic garbage collector (GC)} that
can identify unneeded objects even when their reference counts are not zero.
This can happen when objects are involved in cycles.  For example, consider:

@example
>>> l = []
>>> l.append(l)
>>> del l
@end example

In this example, we create a list that contains itself. When we delete it, it
still has a reference from itself. Its reference count doesn’t drop to zero.
Fortunately, Python’s cyclic garbage collector will eventually figure out that
the list is garbage and free it.

In the second version of the @code{Custom} example, we allowed any kind of
object to be stored in the @code{first} or @code{last} attributes @footnote{
Also, even with our attributes restricted to strings instances, the user
could pass arbitrary @ref{16a,,str} subclasses and therefore still create
reference cycles.
}.
Besides, in the second and third versions, we allowed subclassing
@code{Custom}, and subclasses may add arbitrary attributes.  For any of
those two reasons, @code{Custom} objects can participate in cycles:

@example
>>> import custom3
>>> class Derived(custom3.Custom): pass
...
>>> n = Derived()
>>> n.some_attribute = n
@end example

To allow a @code{Custom} instance participating in a reference cycle to
be properly detected and collected by the cyclic GC, our @code{Custom} type
needs to fill two additional slots and to enable a flag that enables these slots:

@example
#define PY_SSIZE_T_CLEAN
#include <Python.h>
#include <stddef.h> /* for offsetof() */

typedef struct @{
    PyObject_HEAD
    PyObject *first; /* first name */
    PyObject *last;  /* last name */
    int number;
@} CustomObject;

static int
Custom_traverse(PyObject *op, visitproc visit, void *arg)
@{
    CustomObject *self = (CustomObject *) op;
    Py_VISIT(self->first);
    Py_VISIT(self->last);
    return 0;
@}

static int
Custom_clear(PyObject *op)
@{
    CustomObject *self = (CustomObject *) op;
    Py_CLEAR(self->first);
    Py_CLEAR(self->last);
    return 0;
@}

static void
Custom_dealloc(PyObject *op)
@{
    PyObject_GC_UnTrack(op);
    (void)Custom_clear(op);
    Py_TYPE(op)->tp_free(op);
@}

static PyObject *
Custom_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
@{
    CustomObject *self;
    self = (CustomObject *) type->tp_alloc(type, 0);
    if (self != NULL) @{
        self->first = Py_GetConstant(Py_CONSTANT_EMPTY_STR);
        if (self->first == NULL) @{
            Py_DECREF(self);
            return NULL;
        @}
        self->last = Py_GetConstant(Py_CONSTANT_EMPTY_STR);
        if (self->last == NULL) @{
            Py_DECREF(self);
            return NULL;
        @}
        self->number = 0;
    @}
    return (PyObject *) self;
@}

static int
Custom_init(PyObject *op, PyObject *args, PyObject *kwds)
@{
    CustomObject *self = (CustomObject *) op;
    static char *kwlist[] = @{"first", "last", "number", NULL@};
    PyObject *first = NULL, *last = NULL;

    if (!PyArg_ParseTupleAndKeywords(args, kwds, "|UUi", kwlist,
                                     &first, &last,
                                     &self->number))
        return -1;

    if (first) @{
        Py_SETREF(self->first, Py_NewRef(first));
    @}
    if (last) @{
        Py_SETREF(self->last, Py_NewRef(last));
    @}
    return 0;
@}

static PyMemberDef Custom_members[] = @{
    @{"number", Py_T_INT, offsetof(CustomObject, number), 0,
     "custom number"@},
    @{NULL@}  /* Sentinel */
@};

static PyObject *
Custom_getfirst(PyObject *op, void *closure)
@{
    CustomObject *self = (CustomObject *) op;
    return Py_NewRef(self->first);
@}

static int
Custom_setfirst(PyObject *op, PyObject *value, void *closure)
@{
    CustomObject *self = (CustomObject *) op;
    if (value == NULL) @{
        PyErr_SetString(PyExc_TypeError, "Cannot delete the first attribute");
        return -1;
    @}
    if (!PyUnicode_Check(value)) @{
        PyErr_SetString(PyExc_TypeError,
                        "The first attribute value must be a string");
        return -1;
    @}
    Py_XSETREF(self->first, Py_NewRef(value));
    return 0;
@}

static PyObject *
Custom_getlast(PyObject *op, void *closure)
@{
    CustomObject *self = (CustomObject *) op;
    return Py_NewRef(self->last);
@}

static int
Custom_setlast(PyObject *op, PyObject *value, void *closure)
@{
    CustomObject *self = (CustomObject *) op;
    if (value == NULL) @{
        PyErr_SetString(PyExc_TypeError, "Cannot delete the last attribute");
        return -1;
    @}
    if (!PyUnicode_Check(value)) @{
        PyErr_SetString(PyExc_TypeError,
                        "The last attribute value must be a string");
        return -1;
    @}
    Py_XSETREF(self->last, Py_NewRef(value));
    return 0;
@}

static PyGetSetDef Custom_getsetters[] = @{
    @{"first", Custom_getfirst, Custom_setfirst,
     "first name", NULL@},
    @{"last", Custom_getlast, Custom_setlast,
     "last name", NULL@},
    @{NULL@}  /* Sentinel */
@};

static PyObject *
Custom_name(PyObject *op, PyObject *Py_UNUSED(dummy))
@{
    CustomObject *self = (CustomObject *) op;
    return PyUnicode_FromFormat("%S %S", self->first, self->last);
@}

static PyMethodDef Custom_methods[] = @{
    @{"name", Custom_name, METH_NOARGS,
     "Return the name, combining the first and last name"
    @},
    @{NULL@}  /* Sentinel */
@};

static PyTypeObject CustomType = @{
    .ob_base = PyVarObject_HEAD_INIT(NULL, 0)
    .tp_name = "custom4.Custom",
    .tp_doc = PyDoc_STR("Custom objects"),
    .tp_basicsize = sizeof(CustomObject),
    .tp_itemsize = 0,
    .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
    .tp_new = Custom_new,
    .tp_init = Custom_init,
    .tp_dealloc = Custom_dealloc,
    .tp_traverse = Custom_traverse,
    .tp_clear = Custom_clear,
    .tp_members = Custom_members,
    .tp_methods = Custom_methods,
    .tp_getset = Custom_getsetters,
@};

static int
custom_module_exec(PyObject *m)
@{
    if (PyType_Ready(&CustomType) < 0) @{
        return -1;
    @}

    if (PyModule_AddObjectRef(m, "Custom", (PyObject *) &CustomType) < 0) @{
        return -1;
    @}

    return 0;
@}

static PyModuleDef_Slot custom_module_slots[] = @{
    @{Py_mod_exec, custom_module_exec@},
    @{Py_mod_multiple_interpreters, Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED@},
    @{0, NULL@}
@};

static PyModuleDef custom_module = @{
    .m_base = PyModuleDef_HEAD_INIT,
    .m_name = "custom4",
    .m_doc = "Example module that creates an extension type.",
    .m_size = 0,
    .m_slots = custom_module_slots,
@};

PyMODINIT_FUNC
PyInit_custom4(void)
@{
    return PyModuleDef_Init(&custom_module);
@}
@end example

First, the traversal method lets the cyclic GC know about subobjects that could
participate in cycles:

@example
static int
Custom_traverse(PyObject *op, visitproc visit, void *arg)
@{
    CustomObject *self = (CustomObject *) op;
    int vret;
    if (self->first) @{
        vret = visit(self->first, arg);
        if (vret != 0)
            return vret;
    @}
    if (self->last) @{
        vret = visit(self->last, arg);
        if (vret != 0)
            return vret;
    @}
    return 0;
@}
@end example

For each subobject that can participate in cycles, we need to call the
@code{visit()} function, which is passed to the traversal method. The
@code{visit()} function takes as arguments the subobject and the extra argument
`arg' passed to the traversal method.  It returns an integer value that must be
returned if it is non-zero.

Python provides a @ref{5239,,Py_VISIT()} macro that automates calling visit
functions.  With @code{Py_VISIT()}, we can minimize the amount of boilerplate
in @code{Custom_traverse}:

@example
static int
Custom_traverse(PyObject *op, visitproc visit, void *arg)
@{
    CustomObject *self = (CustomObject *) op;
    Py_VISIT(self->first);
    Py_VISIT(self->last);
    return 0;
@}
@end example

@cartouche
@quotation Note 
The @ref{987,,tp_traverse} implementation must name its
arguments exactly `visit' and `arg' in order to use @ref{5239,,Py_VISIT()}.
@end quotation
@end cartouche

Second, we need to provide a method for clearing any subobjects that can
participate in cycles:

@example
static int
Custom_clear(PyObject *op)
@{
    CustomObject *self = (CustomObject *) op;
    Py_CLEAR(self->first);
    Py_CLEAR(self->last);
    return 0;
@}
@end example

Notice the use of the @ref{799,,Py_CLEAR()} macro.  It is the recommended and safe
way to clear data attributes of arbitrary types while decrementing
their reference counts.  If you were to call @ref{997,,Py_XDECREF()} instead
on the attribute before setting it to @code{NULL}, there is a possibility
that the attribute’s destructor would call back into code that reads the
attribute again (`especially' if there is a reference cycle).

@cartouche
@quotation Note 
You could emulate @ref{799,,Py_CLEAR()} by writing:

@example
PyObject *tmp;
tmp = self->first;
self->first = NULL;
Py_XDECREF(tmp);
@end example

Nevertheless, it is much easier and less error-prone to always
use @ref{799,,Py_CLEAR()} when deleting an attribute.  Don’t
try to micro-optimize at the expense of robustness!
@end quotation
@end cartouche

The deallocator @code{Custom_dealloc} may call arbitrary code when clearing
attributes.  It means the circular GC can be triggered inside the function.
Since the GC assumes reference count is not zero, we need to untrack the object
from the GC by calling @ref{1711,,PyObject_GC_UnTrack()} before clearing members.
Here is our reimplemented deallocator using @code{PyObject_GC_UnTrack()}
and @code{Custom_clear}:

@example
static void
Custom_dealloc(PyObject *op)
@{
    PyObject_GC_UnTrack(op);
    (void)Custom_clear(op);
    Py_TYPE(op)->tp_free(op);
@}
@end example

Finally, we add the @ref{986,,Py_TPFLAGS_HAVE_GC} flag to the class flags:

@example
.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
@end example

That’s pretty much it.  If we had written custom @ref{5230,,tp_alloc} or
@ref{522f,,tp_free} handlers, we’d need to modify them for cyclic
garbage collection.  Most extensions will use the versions automatically provided.

@node Subclassing other types,,Supporting cyclic garbage collection,Defining Extension Types Tutorial
@anchor{extending/newtypes_tutorial subclassing-other-types}@anchor{523a}
@subsubsection Subclassing other types


It is possible to create new extension types that are derived from existing
types. It is easiest to inherit from the built in types, since an extension can
easily use the @ref{ca2,,PyTypeObject} it needs. It can be difficult to share
these @code{PyTypeObject} structures between extension modules.

In this example we will create a @code{SubList} type that inherits from the
built-in @ref{24f,,list} type. The new type will be completely compatible with
regular lists, but will have an additional @code{increment()} method that
increases an internal counter:

@example
>>> import sublist
>>> s = sublist.SubList(range(3))
>>> s.extend(s)
>>> print(len(s))
6
>>> print(s.increment())
1
>>> print(s.increment())
2
@end example

@example
#define PY_SSIZE_T_CLEAN
#include <Python.h>

typedef struct @{
    PyListObject list;
    int state;
@} SubListObject;

static PyObject *
SubList_increment(PyObject *op, PyObject *Py_UNUSED(dummy))
@{
    SubListObject *self = (SubListObject *) op;
    self->state++;
    return PyLong_FromLong(self->state);
@}

static PyMethodDef SubList_methods[] = @{
    @{"increment", SubList_increment, METH_NOARGS,
     PyDoc_STR("increment state counter")@},
    @{NULL@},
@};

static int
SubList_init(PyObject *op, PyObject *args, PyObject *kwds)
@{
    SubListObject *self = (SubListObject *) op;
    if (PyList_Type.tp_init(op, args, kwds) < 0)
        return -1;
    self->state = 0;
    return 0;
@}

static PyTypeObject SubListType = @{
    .ob_base = PyVarObject_HEAD_INIT(NULL, 0)
    .tp_name = "sublist.SubList",
    .tp_doc = PyDoc_STR("SubList objects"),
    .tp_basicsize = sizeof(SubListObject),
    .tp_itemsize = 0,
    .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
    .tp_init = SubList_init,
    .tp_methods = SubList_methods,
@};

static int
sublist_module_exec(PyObject *m)
@{
    SubListType.tp_base = &PyList_Type;
    if (PyType_Ready(&SubListType) < 0) @{
        return -1;
    @}

    if (PyModule_AddObjectRef(m, "SubList", (PyObject *) &SubListType) < 0) @{
        return -1;
    @}

    return 0;
@}

static PyModuleDef_Slot sublist_module_slots[] = @{
    @{Py_mod_exec, sublist_module_exec@},
    @{Py_mod_multiple_interpreters, Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED@},
    @{0, NULL@}
@};

static PyModuleDef sublist_module = @{
    .m_base = PyModuleDef_HEAD_INIT,
    .m_name = "sublist",
    .m_doc = "Example module that creates an extension type.",
    .m_size = 0,
    .m_slots = sublist_module_slots,
@};

PyMODINIT_FUNC
PyInit_sublist(void)
@{
    return PyModuleDef_Init(&sublist_module);
@}
@end example

As you can see, the source code closely resembles the @code{Custom} examples in
previous sections. We will break down the main differences between them.

@example
typedef struct @{
    PyListObject list;
    int state;
@} SubListObject;
@end example

The primary difference for derived type objects is that the base type’s
object structure must be the first value.  The base type will already include
the @ref{14e9,,PyObject_HEAD()} at the beginning of its structure.

When a Python object is a @code{SubList} instance, its @code{PyObject *} pointer
can be safely cast to both @code{PyListObject *} and @code{SubListObject *}:

@example
static int
SubList_init(PyObject *op, PyObject *args, PyObject *kwds)
@{
    SubListObject *self = (SubListObject *) op;
    if (PyList_Type.tp_init(op, args, kwds) < 0)
        return -1;
    self->state = 0;
    return 0;
@}
@end example

We see above how to call through to the @ref{8c1,,__init__()} method of the base
type.

This pattern is important when writing a type with custom
@ref{7a0,,tp_new} and @ref{521c,,tp_dealloc}
members.  The @code{tp_new} handler should not actually
create the memory for the object with its @ref{5230,,tp_alloc},
but let the base class handle it by calling its own @code{tp_new}.

The @ref{ca2,,PyTypeObject} struct supports a @ref{23b9,,tp_base}
specifying the type’s concrete base class.  Due to cross-platform compiler
issues, you can’t fill that field directly with a reference to
@ref{523b,,PyList_Type}; it should be done in the @ref{b7b,,Py_mod_exec}
function:

@example
static int
sublist_module_exec(PyObject *m)
@{
    SubListType.tp_base = &PyList_Type;
    if (PyType_Ready(&SubListType) < 0) @{
        return -1;
    @}

    if (PyModule_AddObjectRef(m, "SubList", (PyObject *) &SubListType) < 0) @{
        return -1;
    @}

    return 0;
@}
@end example

Before calling @ref{985,,PyType_Ready()}, the type structure must have the
@ref{23b9,,tp_base} slot filled in.  When we are deriving an
existing type, it is not necessary to fill out the @ref{5230,,tp_alloc}
slot with @ref{522c,,PyType_GenericNew()} – the allocation function from the base
type will be inherited.

After that, calling @ref{985,,PyType_Ready()} and adding the type object to the
module is the same as with the basic @code{Custom} examples.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Defining Extension Types Assorted Topics,Building C and C++ Extensions,Defining Extension Types Tutorial,Creating extensions without third party tools
@anchor{extending/newtypes doc}@anchor{523c}@anchor{extending/newtypes defining-extension-types-assorted-topics}@anchor{523d}@anchor{extending/newtypes new-types-topics}@anchor{523e}@anchor{extending/newtypes translation-repo}@anchor{523f}
@subsection Defining Extension Types: Assorted Topics

@anchor{extending/newtypes dnt-type-methods}@anchor{5240}
This section aims to give a quick fly-by on the various type methods you can
implement and what they do.

Here is the definition of @ref{ca2,,PyTypeObject}, with some fields only used in
@ref{50a,,debug builds} omitted:

@example
typedef struct _typeobject @{
    PyObject_VAR_HEAD
    const char *tp_name; /* For printing, in format "<module>.<name>" */
    Py_ssize_t tp_basicsize, tp_itemsize; /* For allocation */

    /* Methods to implement standard operations */

    destructor tp_dealloc;
    Py_ssize_t tp_vectorcall_offset;
    getattrfunc tp_getattr;
    setattrfunc tp_setattr;
    PyAsyncMethods *tp_as_async; /* formerly known as tp_compare (Python 2)
                                    or tp_reserved (Python 3) */
    reprfunc tp_repr;

    /* Method suites for standard classes */

    PyNumberMethods *tp_as_number;
    PySequenceMethods *tp_as_sequence;
    PyMappingMethods *tp_as_mapping;

    /* More standard operations (here for binary compatibility) */

    hashfunc tp_hash;
    ternaryfunc tp_call;
    reprfunc tp_str;
    getattrofunc tp_getattro;
    setattrofunc tp_setattro;

    /* Functions to access object as input/output buffer */
    PyBufferProcs *tp_as_buffer;

    /* Flags to define presence of optional/expanded features */
    unsigned long tp_flags;

    const char *tp_doc; /* Documentation string */

    /* Assigned meaning in release 2.0 */
    /* call function for all accessible objects */
    traverseproc tp_traverse;

    /* delete references to contained objects */
    inquiry tp_clear;

    /* Assigned meaning in release 2.1 */
    /* rich comparisons */
    richcmpfunc tp_richcompare;

    /* weak reference enabler */
    Py_ssize_t tp_weaklistoffset;

    /* Iterators */
    getiterfunc tp_iter;
    iternextfunc tp_iternext;

    /* Attribute descriptor and subclassing stuff */
    PyMethodDef *tp_methods;
    PyMemberDef *tp_members;
    PyGetSetDef *tp_getset;
    // Strong reference on a heap type, borrowed reference on a static type
    PyTypeObject *tp_base;
    PyObject *tp_dict;
    descrgetfunc tp_descr_get;
    descrsetfunc tp_descr_set;
    Py_ssize_t tp_dictoffset;
    initproc tp_init;
    allocfunc tp_alloc;
    newfunc tp_new;
    freefunc tp_free; /* Low-level free-memory routine */
    inquiry tp_is_gc; /* For PyObject_IS_GC */
    PyObject *tp_bases;
    PyObject *tp_mro; /* method resolution order */
    PyObject *tp_cache; /* no longer used */
    void *tp_subclasses;  /* for static builtin types this is an index */
    PyObject *tp_weaklist; /* not used for static builtin types */
    destructor tp_del;

    /* Type attribute cache version tag. Added in version 2.6.
     * If zero, the cache is invalid and must be initialized.
     */
    unsigned int tp_version_tag;

    destructor tp_finalize;
    vectorcallfunc tp_vectorcall;

    /* bitset of which type-watchers care about this type */
    unsigned char tp_watched;

    /* Number of tp_version_tag values used.
     * Set to _Py_ATTR_CACHE_UNUSED if the attribute cache is
     * disabled for this type (e.g. due to custom MRO entries).
     * Otherwise, limited to MAX_VERSIONS_PER_CLASS (defined elsewhere).
     */
    uint16_t tp_versions_used;
@} PyTypeObject;
@end example

Now that’s a `lot' of methods.  Don’t worry too much though – if you have
a type you want to define, the chances are very good that you will only
implement a handful of these.

As you probably expect by now, we’re going to go over this and give more
information about the various handlers.  We won’t go in the order they are
defined in the structure, because there is a lot of historical baggage that
impacts the ordering of the fields.  It’s often easiest to find an example
that includes the fields you need and then change the values to suit your new
type.

@example
const char *tp_name; /* For printing */
@end example

The name of the type – as mentioned in the previous chapter, this will appear in
various places, almost entirely for diagnostic purposes. Try to choose something
that will be helpful in such a situation!

@example
Py_ssize_t tp_basicsize, tp_itemsize; /* For allocation */
@end example

These fields tell the runtime how much memory to allocate when new objects of
this type are created.  Python has some built-in support for variable length
structures (think: strings, tuples) which is where the @ref{2402,,tp_itemsize} field
comes in.  This will be dealt with later.

@example
const char *tp_doc;
@end example

Here you can put a string (or its address) that you want returned when the
Python script references @code{obj.__doc__} to retrieve the doc string.

Now we come to the basic type methods – the ones most extension types will
implement.

@menu
* Finalization and De-allocation:: 
* Object Presentation:: 
* Attribute Management:: 
* Object Comparison:: 
* Abstract Protocol Support:: 
* Weak Reference Support:: 
* More Suggestions:: 

@end menu

@node Finalization and De-allocation,Object Presentation,,Defining Extension Types Assorted Topics
@anchor{extending/newtypes finalization-and-de-allocation}@anchor{5241}
@subsubsection Finalization and De-allocation


@geindex object; deallocation
@geindex deallocation@comma{} object
@geindex object; finalization
@geindex finalization@comma{} of objects

@example
destructor tp_dealloc;
@end example

This function is called when the reference count of the instance of your type is
reduced to zero and the Python interpreter wants to reclaim it.  If your type
has memory to free or other clean-up to perform, you can put it here.  The
object itself needs to be freed here as well.  Here is an example of this
function:

@example
static void
newdatatype_dealloc(PyObject *op)
@{
    newdatatypeobject *self = (newdatatypeobject *) op;
    free(self->obj_UnderlyingDatatypePtr);
    Py_TYPE(self)->tp_free(self);
@}
@end example

If your type supports garbage collection, the destructor should call
@ref{1711,,PyObject_GC_UnTrack()} before clearing any member fields:

@example
static void
newdatatype_dealloc(PyObject *op)
@{
    newdatatypeobject *self = (newdatatypeobject *) op;
    PyObject_GC_UnTrack(op);
    Py_CLEAR(self->other_obj);
    ...
    Py_TYPE(self)->tp_free(self);
@}
@end example

@geindex PyErr_Fetch (C function)
@geindex PyErr_Restore (C function)

One important requirement of the deallocator function is that it leaves any
pending exceptions alone.  This is important since deallocators are frequently
called as the interpreter unwinds the Python stack; when the stack is unwound
due to an exception (rather than normal returns), nothing is done to protect the
deallocators from seeing that an exception has already been set.  Any actions
which a deallocator performs which may cause additional Python code to be
executed may detect that an exception has been set.  This can lead to misleading
errors from the interpreter.  The proper way to protect against this is to save
a pending exception before performing the unsafe action, and restoring it when
done.  This can be done using the @ref{426,,PyErr_Fetch()} and
@ref{429,,PyErr_Restore()} functions:

@example
static void
my_dealloc(PyObject *obj)
@{
    MyObject *self = (MyObject *) obj;
    PyObject *cbresult;

    if (self->my_callback != NULL) @{
        PyObject *err_type, *err_value, *err_traceback;

        /* This saves the current exception state */
        PyErr_Fetch(&err_type, &err_value, &err_traceback);

        cbresult = PyObject_CallNoArgs(self->my_callback);
        if (cbresult == NULL) @{
           PyErr_WriteUnraisable(self->my_callback);
        @}
        else @{
            Py_DECREF(cbresult);
        @}

        /* This restores the saved exception state */
        PyErr_Restore(err_type, err_value, err_traceback);

        Py_DECREF(self->my_callback);
    @}
    Py_TYPE(self)->tp_free(self);
@}
@end example

@cartouche
@quotation Note 
There are limitations to what you can safely do in a deallocator function.
First, if your type supports garbage collection (using @ref{987,,tp_traverse}
and/or @ref{5242,,tp_clear}), some of the object’s members can have been
cleared or finalized by the time @ref{521c,,tp_dealloc} is called.  Second, in
@code{tp_dealloc}, your object is in an unstable state: its reference
count is equal to zero.  Any call to a non-trivial object or API (as in the
example above) might end up calling @code{tp_dealloc} again, causing a
double free and a crash.

Starting with Python 3.4, it is recommended not to put any complex
finalization code in @ref{521c,,tp_dealloc}, and instead use the new
@ref{ca3,,tp_finalize} type method.


@subsubheading See also


@geindex Python Enhancement Proposals; PEP 442
PEP 442@footnote{https://peps.python.org/pep-0442/} explains the new finalization scheme.

@end quotation
@end cartouche

@geindex string; object representation
@geindex built-in function; repr

@node Object Presentation,Attribute Management,Finalization and De-allocation,Defining Extension Types Assorted Topics
@anchor{extending/newtypes object-presentation}@anchor{5243}
@subsubsection Object Presentation


In Python, there are two ways to generate a textual representation of an object:
the @ref{1c3,,repr()} function, and the @ref{16a,,str()} function.  (The @ref{117b,,print()}
function just calls @code{str()}.)  These handlers are both optional.

@example
reprfunc tp_repr;
reprfunc tp_str;
@end example

The @ref{5244,,tp_repr} handler should return a string object containing a
representation of the instance for which it is called.  Here is a simple
example:

@example
static PyObject *
newdatatype_repr(PyObject *op)
@{
    newdatatypeobject *self = (newdatatypeobject *) op;
    return PyUnicode_FromFormat("Repr-ified_newdatatype@{@{size:%d@}@}",
                                self->obj_UnderlyingDatatypePtr->size);
@}
@end example

If no @ref{5244,,tp_repr} handler is specified, the interpreter will supply a
representation that uses the type’s @ref{1cf1,,tp_name} and a uniquely identifying
value for the object.

The @ref{5245,,tp_str} handler is to @ref{16a,,str()} what the @ref{5244,,tp_repr} handler
described above is to @ref{1c3,,repr()}; that is, it is called when Python code calls
@code{str()} on an instance of your object.  Its implementation is very similar
to the @code{tp_repr} function, but the resulting string is intended for human
consumption.  If @code{tp_str} is not specified, the @code{tp_repr} handler is
used instead.

Here is a simple example:

@example
static PyObject *
newdatatype_str(PyObject *op)
@{
    newdatatypeobject *self = (newdatatypeobject *) op;
    return PyUnicode_FromFormat("Stringified_newdatatype@{@{size:%d@}@}",
                                self->obj_UnderlyingDatatypePtr->size);
@}
@end example

@node Attribute Management,Object Comparison,Object Presentation,Defining Extension Types Assorted Topics
@anchor{extending/newtypes attribute-management}@anchor{5246}
@subsubsection Attribute Management


For every object which can support attributes, the corresponding type must
provide the functions that control how the attributes are resolved.  There needs
to be a function which can retrieve attributes (if any are defined), and another
to set attributes (if setting attributes is allowed).  Removing an attribute is
a special case, for which the new value passed to the handler is @code{NULL}.

Python supports two pairs of attribute handlers; a type that supports attributes
only needs to implement the functions for one pair.  The difference is that one
pair takes the name of the attribute as a char*, while the other
accepts a @ref{5df,,PyObject}*.  Each type can use whichever pair makes more
sense for the implementation’s convenience.

@example
getattrfunc  tp_getattr;        /* char * version */
setattrfunc  tp_setattr;
/* ... */
getattrofunc tp_getattro;       /* PyObject * version */
setattrofunc tp_setattro;
@end example

If accessing attributes of an object is always a simple operation (this will be
explained shortly), there are generic implementations which can be used to
provide the @ref{5df,,PyObject}* version of the attribute management functions.
The actual need for type-specific attribute handlers almost completely
disappeared starting with Python 2.2, though there are many examples which have
not been updated to use some of the new generic mechanism that is available.

@menu
* Generic Attribute Management:: 
* Type-specific Attribute Management:: 

@end menu

@node Generic Attribute Management,Type-specific Attribute Management,,Attribute Management
@anchor{extending/newtypes generic-attribute-management}@anchor{5233}@anchor{extending/newtypes id1}@anchor{5247}
@subsubsection Generic Attribute Management


Most extension types only use `simple' attributes.  So, what makes the
attributes simple?  There are only a couple of conditions that must be met:


@enumerate 

@item 
The name of the attributes must be known when @ref{985,,PyType_Ready()} is
called.

@item 
No special processing is needed to record that an attribute was looked up or
set, nor do actions need to be taken based on the value.
@end enumerate

Note that this list does not place any restrictions on the values of the
attributes, when the values are computed, or how relevant data is stored.

When @ref{985,,PyType_Ready()} is called, it uses three tables referenced by the
type object to create @ref{18c9,,descriptor}s which are placed in the dictionary of the
type object.  Each descriptor controls access to one attribute of the instance
object.  Each of the tables is optional; if all three are @code{NULL}, instances of
the type will only have attributes that are inherited from their base type, and
should leave the @ref{1aaa,,tp_getattro} and @ref{5248,,tp_setattro} fields @code{NULL} as
well, allowing the base type to handle attributes.

The tables are declared as three fields of the type object:

@example
struct PyMethodDef *tp_methods;
struct PyMemberDef *tp_members;
struct PyGetSetDef *tp_getset;
@end example

If @ref{5234,,tp_methods} is not @code{NULL}, it must refer to an array of
@ref{16e3,,PyMethodDef} structures.  Each entry in the table is an instance of this
structure:

@example
typedef struct PyMethodDef @{
    const char  *ml_name;       /* method name */
    PyCFunction  ml_meth;       /* implementation function */
    int          ml_flags;      /* flags */
    const char  *ml_doc;        /* docstring */
@} PyMethodDef;
@end example

One entry should be defined for each method provided by the type; no entries are
needed for methods inherited from a base type.  One additional entry is needed
at the end; it is a sentinel that marks the end of the array.  The
@ref{5249,,ml_name} field of the sentinel must be @code{NULL}.

The second table is used to define attributes which map directly to data stored
in the instance.  A variety of primitive C types are supported, and access may
be read-only or read-write.  The structures in the table are defined as:

@example
typedef struct PyMemberDef @{
    const char *name;
    int         type;
    int         offset;
    int         flags;
    const char *doc;
@} PyMemberDef;
@end example

For each entry in the table, a @ref{18c9,,descriptor} will be constructed and added to the
type which will be able to extract a value from the instance structure.  The
@ref{524a,,type} field should contain a type code like @ref{7ad,,Py_T_INT} or
@ref{7ae,,Py_T_DOUBLE}; the value will be used to determine how to
convert Python values to and from C values.  The @ref{524b,,flags} field is used to
store flags which control how the attribute can be accessed: you can set it to
@ref{7af,,Py_READONLY} to prevent Python code from setting it.

An interesting advantage of using the @ref{5232,,tp_members} table to build
descriptors that are used at runtime is that any attribute defined this way can
have an associated doc string simply by providing the text in the table.  An
application can use the introspection API to retrieve the descriptor from the
class object, and get the doc string using its @ref{20d9,,__doc__} attribute.

As with the @ref{5234,,tp_methods} table, a sentinel entry with a @ref{5249,,ml_name} value
of @code{NULL} is required.

@c XXX Descriptors need to be explained in more detail somewhere, but not here.
@c 
@c Descriptor objects have two handler functions which correspond to the
@c \member{tp_getattro} and \member{tp_setattro} handlers.  The
@c \method{__get__()} handler is a function which is passed the descriptor,
@c instance, and type objects, and returns the value of the attribute, or it
@c returns \NULL{} and sets an exception.  The \method{__set__()} handler is
@c passed the descriptor, instance, type, and new value;

@node Type-specific Attribute Management,,Generic Attribute Management,Attribute Management
@anchor{extending/newtypes type-specific-attribute-management}@anchor{524c}
@subsubsection Type-specific Attribute Management


For simplicity, only the char* version will be demonstrated here; the
type of the name parameter is the only difference between the char*
and @ref{5df,,PyObject}* flavors of the interface. This example effectively does
the same thing as the generic example above, but does not use the generic
support added in Python 2.2.  It explains how the handler functions are
called, so that if you do need to extend their functionality, you’ll understand
what needs to be done.

The @ref{524d,,tp_getattr} handler is called when the object requires an attribute
look-up.  It is called in the same situations where the @ref{6fb,,__getattr__()}
method of a class would be called.

Here is an example:

@example
static PyObject *
newdatatype_getattr(PyObject *op, char *name)
@{
    newdatatypeobject *self = (newdatatypeobject *) op;
    if (strcmp(name, "data") == 0) @{
        return PyLong_FromLong(self->data);
    @}

    PyErr_Format(PyExc_AttributeError,
                 "'%.100s' object has no attribute '%.400s'",
                 Py_TYPE(self)->tp_name, name);
    return NULL;
@}
@end example

The @ref{524e,,tp_setattr} handler is called when the @ref{23bf,,__setattr__()} or
@ref{23c0,,__delattr__()} method of a class instance would be called.  When an
attribute should be deleted, the third parameter will be @code{NULL}.  Here is an
example that simply raises an exception; if this were really all you wanted, the
@code{tp_setattr} handler should be set to @code{NULL}.

@example
static int
newdatatype_setattr(PyObject *op, char *name, PyObject *v)
@{
    PyErr_Format(PyExc_RuntimeError, "Read-only attribute: %s", name);
    return -1;
@}
@end example

@node Object Comparison,Abstract Protocol Support,Attribute Management,Defining Extension Types Assorted Topics
@anchor{extending/newtypes object-comparison}@anchor{524f}
@subsubsection Object Comparison


@example
richcmpfunc tp_richcompare;
@end example

The @ref{5250,,tp_richcompare} handler is called when comparisons are needed.  It is
analogous to the @ref{23f5,,rich comparison methods}, like
@code{__lt__()}, and also called by @ref{5251,,PyObject_RichCompare()} and
@ref{1dd0,,PyObject_RichCompareBool()}.

This function is called with two Python objects and the operator as arguments,
where the operator is one of @code{Py_EQ}, @code{Py_NE}, @code{Py_LE}, @code{Py_GE},
@code{Py_LT} or @code{Py_GT}.  It should compare the two objects with respect to the
specified operator and return @code{Py_True} or @code{Py_False} if the comparison is
successful, @code{Py_NotImplemented} to indicate that comparison is not
implemented and the other object’s comparison method should be tried, or @code{NULL}
if an exception was set.

Here is a sample implementation, for a datatype that is considered equal if the
size of an internal pointer is equal:

@example
static PyObject *
newdatatype_richcmp(PyObject *lhs, PyObject *rhs, int op)
@{
    newdatatypeobject *obj1 = (newdatatypeobject *) lhs;
    newdatatypeobject *obj2 = (newdatatypeobject *) rhs;
    PyObject *result;
    int c, size1, size2;

    /* code to make sure that both arguments are of type
       newdatatype omitted */

    size1 = obj1->obj_UnderlyingDatatypePtr->size;
    size2 = obj2->obj_UnderlyingDatatypePtr->size;

    switch (op) @{
    case Py_LT: c = size1 <  size2; break;
    case Py_LE: c = size1 <= size2; break;
    case Py_EQ: c = size1 == size2; break;
    case Py_NE: c = size1 != size2; break;
    case Py_GT: c = size1 >  size2; break;
    case Py_GE: c = size1 >= size2; break;
    @}
    result = c ? Py_True : Py_False;
    return Py_NewRef(result);
 @}
@end example

@node Abstract Protocol Support,Weak Reference Support,Object Comparison,Defining Extension Types Assorted Topics
@anchor{extending/newtypes abstract-protocol-support}@anchor{5252}
@subsubsection Abstract Protocol Support


Python supports a variety of `abstract' ‘protocols;’ the specific interfaces
provided to use these interfaces are documented in @ref{5253,,Abstract Objects Layer}.

A number of these abstract interfaces were defined early in the development of
the Python implementation.  In particular, the number, mapping, and sequence
protocols have been part of Python since the beginning.  Other protocols have
been added over time.  For protocols which depend on several handler routines
from the type implementation, the older protocols have been defined as optional
blocks of handlers referenced by the type object.  For newer protocols there are
additional slots in the main type object, with a flag bit being set to indicate
that the slots are present and should be checked by the interpreter.  (The flag
bit does not indicate that the slot values are non-@code{NULL}. The flag may be set
to indicate the presence of a slot, but a slot may still be unfilled.)

@example
PyNumberMethods   *tp_as_number;
PySequenceMethods *tp_as_sequence;
PyMappingMethods  *tp_as_mapping;
@end example

If you wish your object to be able to act like a number, a sequence, or a
mapping object, then you place the address of a structure that implements the C
type @ref{162a,,PyNumberMethods}, @ref{5254,,PySequenceMethods}, or
@ref{5255,,PyMappingMethods}, respectively. It is up to you to fill in this
structure with appropriate values. You can find examples of the use of each of
these in the @code{Objects} directory of the Python source distribution.

@example
hashfunc tp_hash;
@end example

This function, if you choose to provide it, should return a hash number for an
instance of your data type. Here is a simple example:

@example
static Py_hash_t
newdatatype_hash(PyObject *op)
@{
    newdatatypeobject *self = (newdatatypeobject *) op;
    Py_hash_t result;
    result = self->some_size + 32767 * self->some_number;
    if (result == -1) @{
        result = -2;
    @}
    return result;
@}
@end example

@ref{146f,,Py_hash_t} is a signed integer type with a platform-varying width.
Returning @code{-1} from @ref{5256,,tp_hash} indicates an error,
which is why you should be careful to avoid returning it when hash computation
is successful, as seen above.

@example
ternaryfunc tp_call;
@end example

This function is called when an instance of your data type is “called”, for
example, if @code{obj1} is an instance of your data type and the Python script
contains @code{obj1('hello')}, the @ref{77c,,tp_call} handler is invoked.

This function takes three arguments:


@enumerate 

@item 
`self' is the instance of the data type which is the subject of the call.
If the call is @code{obj1('hello')}, then `self' is @code{obj1}.

@item 
`args' is a tuple containing the arguments to the call.  You can use
@ref{3bf,,PyArg_ParseTuple()} to extract the arguments.

@item 
`kwds' is a dictionary of keyword arguments that were passed. If this is
non-@code{NULL} and you support keyword arguments, use
@ref{624,,PyArg_ParseTupleAndKeywords()} to extract the arguments.  If you
do not want to support keyword arguments and this is non-@code{NULL}, raise a
@ref{199,,TypeError} with a message saying that keyword arguments are not supported.
@end enumerate

Here is a toy @code{tp_call} implementation:

@example
static PyObject *
newdatatype_call(PyObject *op, PyObject *args, PyObject *kwds)
@{
    newdatatypeobject *self = (newdatatypeobject *) op;
    PyObject *result;
    const char *arg1;
    const char *arg2;
    const char *arg3;

    if (!PyArg_ParseTuple(args, "sss:call", &arg1, &arg2, &arg3)) @{
        return NULL;
    @}
    result = PyUnicode_FromFormat(
        "Returning -- value: [%d] arg1: [%s] arg2: [%s] arg3: [%s]\n",
        self->obj_UnderlyingDatatypePtr->size,
        arg1, arg2, arg3);
    return result;
@}
@end example

@example
/* Iterators */
getiterfunc tp_iter;
iternextfunc tp_iternext;
@end example

These functions provide support for the iterator protocol.  Both handlers
take exactly one parameter, the instance for which they are being called,
and return a new reference.  In the case of an error, they should set an
exception and return @code{NULL}.  @ref{16fb,,tp_iter} corresponds
to the Python @ref{e6f,,__iter__()} method, while @ref{16fc,,tp_iternext}
corresponds to the Python @ref{14d9,,__next__()} method.

Any @ref{1433,,iterable} object must implement the @ref{16fb,,tp_iter}
handler, which must return an @ref{4c9,,iterator} object.  Here the same guidelines
apply as for Python classes:


@itemize *

@item 
For collections (such as lists and tuples) which can support multiple
independent iterators, a new iterator should be created and returned by
each call to @ref{16fb,,tp_iter}.

@item 
Objects which can only be iterated over once (usually due to side effects of
iteration, such as file objects) can implement @ref{16fb,,tp_iter}
by returning a new reference to themselves – and should also therefore
implement the @ref{16fc,,tp_iternext}  handler.
@end itemize

Any @ref{4c9,,iterator} object should implement both @ref{16fb,,tp_iter}
and @ref{16fc,,tp_iternext}.  An iterator’s
@code{tp_iter} handler should return a new reference
to the iterator.  Its @code{tp_iternext} handler should
return a new reference to the next object in the iteration, if there is one.
If the iteration has reached the end, @code{tp_iternext}
may return @code{NULL} without setting an exception, or it may set
@ref{dfb,,StopIteration} `in addition' to returning @code{NULL}; avoiding
the exception can yield slightly better performance.  If an actual error
occurs, @code{tp_iternext} should always set an exception
and return @code{NULL}.

@node Weak Reference Support,More Suggestions,Abstract Protocol Support,Defining Extension Types Assorted Topics
@anchor{extending/newtypes weak-reference-support}@anchor{5257}@anchor{extending/newtypes weakref-support}@anchor{2a38}
@subsubsection Weak Reference Support


One of the goals of Python’s weak reference implementation is to allow any type
to participate in the weak reference mechanism without incurring the overhead on
performance-critical objects (such as numbers).


@subsubheading See also


Documentation for the @ref{11b,,weakref} module.


For an object to be weakly referenceable, the extension type must set the
@code{Py_TPFLAGS_MANAGED_WEAKREF} bit of the @ref{1cb4,,tp_flags}
field. The legacy @ref{b85,,tp_weaklistoffset} field should
be left as zero.

Concretely, here is how the statically declared type object would look:

@example
static PyTypeObject TrivialType = @{
    PyVarObject_HEAD_INIT(NULL, 0)
    /* ... other members omitted for brevity ... */
    .tp_flags = Py_TPFLAGS_MANAGED_WEAKREF | ...,
@};
@end example

The only further addition is that @code{tp_dealloc} needs to clear any weak
references (by calling @ref{797,,PyObject_ClearWeakRefs()}):

@example
static void
Trivial_dealloc(PyObject *op)
@{
    /* Clear weakrefs first before calling any destructors */
    PyObject_ClearWeakRefs(op);
    /* ... remainder of destruction code omitted for brevity ... */
    Py_TYPE(op)->tp_free(op);
@}
@end example

@node More Suggestions,,Weak Reference Support,Defining Extension Types Assorted Topics
@anchor{extending/newtypes more-suggestions}@anchor{5258}
@subsubsection More Suggestions


In order to learn how to implement any specific method for your new data type,
get the @ref{907,,CPython} source code.  Go to the @code{Objects} directory,
then search the C source files for @code{tp_} plus the function you want
(for example, @code{tp_richcompare}).  You will find examples of the function
you want to implement.

When you need to verify that an object is a concrete instance of the type you
are implementing, use the @ref{1cf6,,PyObject_TypeCheck()} function.  A sample of
its use might be something like the following:

@example
if (!PyObject_TypeCheck(some_object, &MyType)) @{
    PyErr_SetString(PyExc_TypeError, "arg #1 not a mything");
    return NULL;
@}
@end example


@subsubheading See also



@table @asis

@item Download CPython source releases.

@indicateurl{https://www.python.org/downloads/source/}

@item The CPython project on GitHub, where the CPython source code is developed.

@indicateurl{https://github.com/python/cpython}
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Building C and C++ Extensions,Building C and C++ Extensions on Windows,Defining Extension Types Assorted Topics,Creating extensions without third party tools
@anchor{extending/building doc}@anchor{5259}@anchor{extending/building building}@anchor{5207}@anchor{extending/building building-c-and-c-extensions}@anchor{525a}@anchor{extending/building translation-repo}@anchor{525b}
@subsection Building C and C++ Extensions


A C extension for CPython is a shared library (for example, a @code{.so} file on
Linux, @code{.pyd} on Windows), which exports an `initialization function'.

See @ref{525c,,Defining extension modules} for details.
@anchor{extending/building install-index}@anchor{10ff}
@menu
* Building C and C++ Extensions with setuptools:: 

@end menu

@node Building C and C++ Extensions with setuptools,,,Building C and C++ Extensions
@anchor{extending/building building-c-and-c-extensions-with-setuptools}@anchor{525d}@anchor{extending/building setuptools-index}@anchor{1100}
@subsubsection Building C and C++ Extensions with setuptools


Building, packaging and distributing extension modules is best done with
third-party tools, and is out of scope of this document.
One suitable tool is Setuptools, whose documentation can be found at
@indicateurl{https://setuptools.pypa.io/en/latest/setuptools.html}.

The @ref{3d,,distutils} module, which was included in the standard library
until Python 3.12, is now maintained as part of Setuptools.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Building C and C++ Extensions on Windows,,Building C and C++ Extensions,Creating extensions without third party tools
@anchor{extending/windows doc}@anchor{525e}@anchor{extending/windows building-c-and-c-extensions-on-windows}@anchor{525f}@anchor{extending/windows building-on-windows}@anchor{2268}@anchor{extending/windows translation-repo}@anchor{5260}
@subsection Building C and C++ Extensions on Windows


This chapter briefly explains how to create a Windows extension module for
Python using Microsoft Visual C++, and follows with more detailed background
information on how it works.  The explanatory material is useful for both the
Windows programmer learning to build Python extensions and the Unix programmer
interested in producing software which can be successfully built on both Unix
and Windows.

Module authors are encouraged to use the distutils approach for building
extension modules, instead of the one described in this section. You will still
need the C compiler that was used to build Python; typically Microsoft Visual
C++.

@cartouche
@quotation Note 
This chapter mentions a number of filenames that include an encoded Python
version number.  These filenames are represented with the version number shown
as @code{XY}; in practice, @code{'X'} will be the major version number and @code{'Y'}
will be the minor version number of the Python release you’re working with.  For
example, if you are using Python 2.2.1, @code{XY} will actually be @code{22}.
@end quotation
@end cartouche

@menu
* A Cookbook Approach:: 
* Differences Between Unix and Windows:: 
* Using DLLs in Practice:: 

@end menu

@node A Cookbook Approach,Differences Between Unix and Windows,,Building C and C++ Extensions on Windows
@anchor{extending/windows a-cookbook-approach}@anchor{5261}@anchor{extending/windows win-cookbook}@anchor{5262}
@subsubsection A Cookbook Approach


There are two approaches to building extension modules on Windows, just as there
are on Unix: use the @code{setuptools} package to control the build process, or
do things manually.  The setuptools approach works well for most extensions;
documentation on using @code{setuptools} to build and package extension modules
is available in @ref{1100,,Building C and C++ Extensions with setuptools}.  If you find you really need to do
things manually, it may be instructive to study the project file for the
winsound@footnote{https://github.com/python/cpython/tree/3.14/PCbuild/winsound.vcxproj} standard library module.

@node Differences Between Unix and Windows,Using DLLs in Practice,A Cookbook Approach,Building C and C++ Extensions on Windows
@anchor{extending/windows differences-between-unix-and-windows}@anchor{5263}@anchor{extending/windows dynamic-linking}@anchor{5264}
@subsubsection Differences Between Unix and Windows


Unix and Windows use completely different paradigms for run-time loading of
code.  Before you try to build a module that can be dynamically loaded, be aware
of how your system works.

In Unix, a shared object (@code{.so}) file contains code to be used by the
program, and also the names of functions and data that it expects to find in the
program.  When the file is joined to the program, all references to those
functions and data in the file’s code are changed to point to the actual
locations in the program where the functions and data are placed in memory.
This is basically a link operation.

In Windows, a dynamic-link library (@code{.dll}) file has no dangling
references.  Instead, an access to functions or data goes through a lookup
table.  So the DLL code does not have to be fixed up at runtime to refer to the
program’s memory; instead, the code already uses the DLL’s lookup table, and the
lookup table is modified at runtime to point to the functions and data.

In Unix, there is only one type of library file (@code{.a}) which contains code
from several object files (@code{.o}).  During the link step to create a shared
object file (@code{.so}), the linker may find that it doesn’t know where an
identifier is defined.  The linker will look for it in the object files in the
libraries; if it finds it, it will include all the code from that object file.

In Windows, there are two types of library, a static library and an import
library (both called @code{.lib}).  A static library is like a Unix @code{.a}
file; it contains code to be included as necessary. An import library is
basically used only to reassure the linker that a certain identifier is legal,
and will be present in the program when the DLL is loaded.  So the linker uses
the information from the import library to build the lookup table for using
identifiers that are not included in the DLL.  When an application or a DLL is
linked, an import library may be generated, which will need to be used for all
future DLLs that depend on the symbols in the application or DLL.

Suppose you are building two dynamic-load modules, B and C, which should share
another block of code A.  On Unix, you would `not' pass @code{A.a} to the
linker for @code{B.so} and @code{C.so}; that would cause it to be included
twice, so that B and C would each have their own copy.  In Windows, building
@code{A.dll} will also build @code{A.lib}.  You `do' pass @code{A.lib} to the
linker for B and C.  @code{A.lib} does not contain code; it just contains
information which will be used at runtime to access A’s code.

In Windows, using an import library is sort of like using @code{import spam}; it
gives you access to spam’s names, but does not create a separate copy.  On Unix,
linking with a library is more like @code{from spam import *}; it does create a
separate copy.

@geindex Py_NO_LINK_LIB (C macro)
@anchor{extending/windows c Py_NO_LINK_LIB}@anchor{442}
@deffn {C Macro} Py_NO_LINK_LIB

Turn off the implicit, @code{#pragma}-based linkage with the Python
library, performed inside CPython header files.


Added in version 3.14.

@end deffn

@node Using DLLs in Practice,,Differences Between Unix and Windows,Building C and C++ Extensions on Windows
@anchor{extending/windows using-dlls-in-practice}@anchor{5265}@anchor{extending/windows win-dlls}@anchor{5266}
@subsubsection Using DLLs in Practice


Windows Python is built in Microsoft Visual C++; using other compilers may or
may not work.  The rest of this section is MSVC++ specific.

When creating DLLs in Windows, you can use the CPython library in two ways:


@enumerate 

@item 
By default, inclusion of @code{PC/pyconfig.h} directly or via
@code{Python.h} triggers an implicit, configure-aware link with the
library.  The header file chooses @code{pythonXY_d.lib} for Debug,
@code{pythonXY.lib} for Release, and @code{pythonX.lib} for Release with
the @ref{5267,,Limited API} enabled.

To build two DLLs, spam and ni (which uses C functions found in spam), you
could use these commands:

@example
cl /LD /I/python/include spam.c
cl /LD /I/python/include ni.c spam.lib
@end example

The first command created three files: @code{spam.obj}, @code{spam.dll}
and @code{spam.lib}.  @code{Spam.dll} does not contain any Python
functions (such as @ref{3bf,,PyArg_ParseTuple()}), but it does know how to find
the Python code thanks to the implicitly linked @code{pythonXY.lib}.

The second command created @code{ni.dll} (and @code{.obj} and
@code{.lib}), which knows how to find the necessary functions from spam,
and also from the Python executable.

@item 
Manually by defining @ref{442,,Py_NO_LINK_LIB} macro before including
@code{Python.h}. You must pass @code{pythonXY.lib} to the linker.

To build two DLLs, spam and ni (which uses C functions found in spam), you
could use these commands:

@example
cl /LD /DPy_NO_LINK_LIB /I/python/include spam.c ../libs/pythonXY.lib
cl /LD /DPy_NO_LINK_LIB /I/python/include ni.c spam.lib ../libs/pythonXY.lib
@end example

The first command created three files: @code{spam.obj}, @code{spam.dll}
and @code{spam.lib}.  @code{Spam.dll} does not contain any Python
functions (such as @ref{3bf,,PyArg_ParseTuple()}), but it does know how to find
the Python code thanks to @code{pythonXY.lib}.

The second command created @code{ni.dll} (and @code{.obj} and
@code{.lib}), which knows how to find the necessary functions from spam,
and also from the Python executable.
@end enumerate

Not every identifier is exported to the lookup table.  If you want any other
modules (including Python) to be able to see your identifiers, you have to say
@code{_declspec(dllexport)}, as in @code{void _declspec(dllexport) initspam(void)} or
@code{PyObject _declspec(dllexport) *NiGetSpamData(void)}.

Developer Studio will throw in a lot of import libraries that you do not really
need, adding about 100K to your executable.  To get rid of them, use the Project
Settings dialog, Link tab, to specify `ignore default libraries'.  Add the
correct @code{msvcrt`xx'.lib} to the list of libraries.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Embedding the CPython runtime in a larger application,,Creating extensions without third party tools,Extending and Embedding the Python Interpreter
@anchor{extending/index embedding-the-cpython-runtime-in-a-larger-application}@anchor{5268}
@section Embedding the CPython runtime in a larger application


Sometimes, rather than creating an extension that runs inside the Python
interpreter as the main application, it is desirable to instead embed
the CPython runtime inside a larger application. This section covers
some of the details involved in doing that successfully.

@menu
* Embedding Python in Another Application:: 

@end menu

@node Embedding Python in Another Application,,,Embedding the CPython runtime in a larger application
@anchor{extending/embedding doc}@anchor{5269}@anchor{extending/embedding embedding}@anchor{229f}@anchor{extending/embedding embedding-python-in-another-application}@anchor{526a}
@subsection Embedding Python in Another Application


The previous chapters discussed how to extend Python, that is, how to extend the
functionality of Python by attaching a library of C functions to it.  It is also
possible to do it the other way around: enrich your C/C++ application by
embedding Python in it.  Embedding provides your application with the ability to
implement some of the functionality of your application in Python rather than C
or C++. This can be used for many purposes; one example would be to allow users
to tailor the application to their needs by writing some scripts in Python.  You
can also use it yourself if some of the functionality can be written in Python
more easily.

Embedding Python is similar to extending it, but not quite.  The difference is
that when you extend Python, the main program of the application is still the
Python interpreter, while if you embed Python, the main program may have nothing
to do with Python — instead, some parts of the application occasionally call
the Python interpreter to run some Python code.

So if you are embedding Python, you are providing your own main program.  One of
the things this main program has to do is initialize the Python interpreter.  At
the very least, you have to call the function @ref{45e,,Py_Initialize()}.  There are
optional calls to pass command line arguments to Python.  Then later you can
call the interpreter from any part of the application.

There are several different ways to call the interpreter: you can pass a string
containing Python statements to @ref{526b,,PyRun_SimpleString()}, or you can pass a
stdio file pointer and a file name (for identification in error messages only)
to @ref{526c,,PyRun_SimpleFile()}.  You can also call the lower-level operations
described in the previous chapters to construct and use Python objects.


@subsubheading See also



@table @asis

@item @ref{2000,,Python/C API reference manual}

The details of Python’s C interface are given in this manual. A great deal of
necessary information can be found here.
@end table


@menu
* Very High Level Embedding:: 
* Beyond Very High Level Embedding; An overview: Beyond Very High Level Embedding An overview. 
* Pure Embedding:: 
* Extending Embedded Python:: 
* Embedding Python in C++:: 
* Compiling and Linking under Unix-like systems:: 

@end menu

@node Very High Level Embedding,Beyond Very High Level Embedding An overview,,Embedding Python in Another Application
@anchor{extending/embedding high-level-embedding}@anchor{526d}@anchor{extending/embedding very-high-level-embedding}@anchor{526e}
@subsubsection Very High Level Embedding


The simplest form of embedding Python is the use of the very high level
interface. This interface is intended to execute a Python script without needing
to interact with the application directly. This can for example be used to
perform some operation on a file.

@example
#define PY_SSIZE_T_CLEAN
#include <Python.h>

int
main(int argc, char *argv[])
@{
    PyStatus status;
    PyConfig config;
    PyConfig_InitPythonConfig(&config);

    /* optional but recommended */
    status = PyConfig_SetBytesString(&config, &config.program_name, argv[0]);
    if (PyStatus_Exception(status)) @{
        goto exception;
    @}

    status = Py_InitializeFromConfig(&config);
    if (PyStatus_Exception(status)) @{
        goto exception;
    @}
    PyConfig_Clear(&config);

    PyRun_SimpleString("from time import time,ctime\n"
                       "print('Today is', ctime(time()))\n");
    if (Py_FinalizeEx() < 0) @{
        exit(120);
    @}
    return 0;

  exception:
     PyConfig_Clear(&config);
     Py_ExitStatusException(status);
@}
@end example

@cartouche
@quotation Note 
@code{#define PY_SSIZE_T_CLEAN} was used to indicate that @code{Py_ssize_t} should be
used in some APIs instead of @code{int}.
It is not necessary since Python 3.13, but we keep it here for backward compatibility.
See @ref{62c,,Strings and buffers} for a description of this macro.
@end quotation
@end cartouche

Setting @ref{3f0,,PyConfig.program_name} should be called before
@ref{3f4,,Py_InitializeFromConfig()} to inform the interpreter about paths to Python run-time
libraries.  Next, the Python interpreter is initialized with
@ref{45e,,Py_Initialize()}, followed by the execution of a hard-coded Python script
that prints the date and time.  Afterwards, the @ref{f17,,Py_FinalizeEx()} call shuts
the interpreter down, followed by the end of the program.  In a real program,
you may want to get the Python script from another source, perhaps a text-editor
routine, a file, or a database.  Getting the Python code from a file can better
be done by using the @ref{526c,,PyRun_SimpleFile()} function, which saves you the
trouble of allocating memory space and loading the file contents.

@node Beyond Very High Level Embedding An overview,Pure Embedding,Very High Level Embedding,Embedding Python in Another Application
@anchor{extending/embedding beyond-very-high-level-embedding-an-overview}@anchor{526f}@anchor{extending/embedding lower-level-embedding}@anchor{5270}
@subsubsection Beyond Very High Level Embedding: An overview


The high level interface gives you the ability to execute arbitrary pieces of
Python code from your application, but exchanging data values is quite
cumbersome to say the least. If you want that, you should use lower level calls.
At the cost of having to write more C code, you can achieve almost anything.

It should be noted that extending Python and embedding Python is quite the same
activity, despite the different intent. Most topics discussed in the previous
chapters are still valid. To show this, consider what the extension code from
Python to C really does:


@enumerate 

@item 
Convert data values from Python to C,

@item 
Perform a function call to a C routine using the converted values, and

@item 
Convert the data values from the call from C to Python.
@end enumerate

When embedding Python, the interface code does:


@enumerate 

@item 
Convert data values from C to Python,

@item 
Perform a function call to a Python interface routine using the converted
values, and

@item 
Convert the data values from the call from Python to C.
@end enumerate

As you can see, the data conversion steps are simply swapped to accommodate the
different direction of the cross-language transfer. The only difference is the
routine that you call between both data conversions. When extending, you call a
C routine, when embedding, you call a Python routine.

This chapter will not discuss how to convert data from Python to C and vice
versa.  Also, proper use of references and dealing with errors is assumed to be
understood.  Since these aspects do not differ from extending the interpreter,
you can refer to earlier chapters for the required information.

@node Pure Embedding,Extending Embedded Python,Beyond Very High Level Embedding An overview,Embedding Python in Another Application
@anchor{extending/embedding id1}@anchor{5271}@anchor{extending/embedding pure-embedding}@anchor{5272}
@subsubsection Pure Embedding


The first program aims to execute a function in a Python script. Like in the
section about the very high level interface, the Python interpreter does not
directly interact with the application (but that will change in the next
section).

The code to run a function defined in a Python script is:

@example
#define PY_SSIZE_T_CLEAN
#include <Python.h>

int
main(int argc, char *argv[])
@{
    PyObject *pName, *pModule, *pFunc;
    PyObject *pArgs, *pValue;
    int i;

    if (argc < 3) @{
        fprintf(stderr,"Usage: call pythonfile funcname [args]\n");
        return 1;
    @}

    Py_Initialize();
    pName = PyUnicode_DecodeFSDefault(argv[1]);
    /* Error checking of pName left out */

    pModule = PyImport_Import(pName);
    Py_DECREF(pName);

    if (pModule != NULL) @{
        pFunc = PyObject_GetAttrString(pModule, argv[2]);
        /* pFunc is a new reference */

        if (pFunc && PyCallable_Check(pFunc)) @{
            pArgs = PyTuple_New(argc - 3);
            for (i = 0; i < argc - 3; ++i) @{
                pValue = PyLong_FromLong(atoi(argv[i + 3]));
                if (!pValue) @{
                    Py_DECREF(pArgs);
                    Py_DECREF(pModule);
                    fprintf(stderr, "Cannot convert argument\n");
                    return 1;
                @}
                /* pValue reference stolen here: */
                PyTuple_SetItem(pArgs, i, pValue);
            @}
            pValue = PyObject_CallObject(pFunc, pArgs);
            Py_DECREF(pArgs);
            if (pValue != NULL) @{
                printf("Result of call: %ld\n", PyLong_AsLong(pValue));
                Py_DECREF(pValue);
            @}
            else @{
                Py_DECREF(pFunc);
                Py_DECREF(pModule);
                PyErr_Print();
                fprintf(stderr,"Call failed\n");
                return 1;
            @}
        @}
        else @{
            if (PyErr_Occurred())
                PyErr_Print();
            fprintf(stderr, "Cannot find function \"%s\"\n", argv[2]);
        @}
        Py_XDECREF(pFunc);
        Py_DECREF(pModule);
    @}
    else @{
        PyErr_Print();
        fprintf(stderr, "Failed to load \"%s\"\n", argv[1]);
        return 1;
    @}
    if (Py_FinalizeEx() < 0) @{
        return 120;
    @}
    return 0;
@}
@end example

This code loads a Python script using @code{argv[1]}, and calls the function named
in @code{argv[2]}.  Its integer arguments are the other values of the @code{argv}
array.  If you @ref{5273,,compile and link} this program (let’s call
the finished executable @code{call}), and use it to execute a Python
script, such as:

@example
def multiply(a,b):
    print("Will compute", a, "times", b)
    c = 0
    for i in range(0, a):
        c = c + b
    return c
@end example

then the result should be:

@example
$ call multiply multiply 3 2
Will compute 3 times 2
Result of call: 6
@end example

Although the program is quite large for its functionality, most of the code is
for data conversion between Python and C, and for error reporting.  The
interesting part with respect to embedding Python starts with

@example
Py_Initialize();
pName = PyUnicode_DecodeFSDefault(argv[1]);
/* Error checking of pName left out */
pModule = PyImport_Import(pName);
@end example

After initializing the interpreter, the script is loaded using
@ref{1608,,PyImport_Import()}.  This routine needs a Python string as its argument,
which is constructed using the @ref{1ace,,PyUnicode_DecodeFSDefault()} data
conversion routine.

@example
pFunc = PyObject_GetAttrString(pModule, argv[2]);
/* pFunc is a new reference */

if (pFunc && PyCallable_Check(pFunc)) @{
    ...
@}
Py_XDECREF(pFunc);
@end example

Once the script is loaded, the name we’re looking for is retrieved using
@ref{5ef,,PyObject_GetAttrString()}.  If the name exists, and the object returned is
callable, you can safely assume that it is a function.  The program then
proceeds by constructing a tuple of arguments as normal.  The call to the Python
function is then made with:

@example
pValue = PyObject_CallObject(pFunc, pArgs);
@end example

Upon return of the function, @code{pValue} is either @code{NULL} or it contains a
reference to the return value of the function.  Be sure to release the reference
after examining the value.

@node Extending Embedded Python,Embedding Python in C++,Pure Embedding,Embedding Python in Another Application
@anchor{extending/embedding extending-embedded-python}@anchor{5274}@anchor{extending/embedding extending-with-embedding}@anchor{5275}
@subsubsection Extending Embedded Python


Until now, the embedded Python interpreter had no access to functionality from
the application itself.  The Python API allows this by extending the embedded
interpreter.  That is, the embedded interpreter gets extended with routines
provided by the application. While it sounds complex, it is not so bad.  Simply
forget for a while that the application starts the Python interpreter.  Instead,
consider the application to be a set of subroutines, and write some glue code
that gives Python access to those routines, just like you would write a normal
Python extension.  For example:

@example
static int numargs=0;

/* Return the number of arguments of the application command line */
static PyObject*
emb_numargs(PyObject *self, PyObject *args)
@{
    if(!PyArg_ParseTuple(args, ":numargs"))
        return NULL;
    return PyLong_FromLong(numargs);
@}

static PyMethodDef emb_module_methods[] = @{
    @{"numargs", emb_numargs, METH_VARARGS,
     "Return the number of arguments received by the process."@},
    @{NULL, NULL, 0, NULL@}
@};

static struct PyModuleDef emb_module = @{
    .m_base = PyModuleDef_HEAD_INIT,
    .m_name = "emb",
    .m_size = 0,
    .m_methods = emb_module_methods,
@};

static PyObject*
PyInit_emb(void)
@{
    return PyModuleDef_Init(&emb_module);
@}
@end example

Insert the above code just above the @code{main()} function. Also, insert the
following two statements before the call to @ref{45e,,Py_Initialize()}:

@example
numargs = argc;
PyImport_AppendInittab("emb", &PyInit_emb);
@end example

These two lines initialize the @code{numargs} variable, and make the
@code{emb.numargs()} function accessible to the embedded Python interpreter.
With these extensions, the Python script can do things like

@example
import emb
print("Number of arguments", emb.numargs())
@end example

In a real application, the methods will expose an API of the application to
Python.

@c TODO: threads, code examples do not really behave well if errors happen
@c (what to watch out for)

@node Embedding Python in C++,Compiling and Linking under Unix-like systems,Extending Embedded Python,Embedding Python in Another Application
@anchor{extending/embedding embedding-python-in-c}@anchor{5276}@anchor{extending/embedding embeddingincplusplus}@anchor{5277}
@subsubsection Embedding Python in C++


It is also possible to embed Python in a C++ program; precisely how this is done
will depend on the details of the C++ system used; in general you will need to
write the main program in C++, and use the C++ compiler to compile and link your
program.  There is no need to recompile Python itself using C++.

@node Compiling and Linking under Unix-like systems,,Embedding Python in C++,Embedding Python in Another Application
@anchor{extending/embedding compiling}@anchor{5273}@anchor{extending/embedding compiling-and-linking-under-unix-like-systems}@anchor{5278}
@subsubsection Compiling and Linking under Unix-like systems


It is not necessarily trivial to find the right flags to pass to your
compiler (and linker) in order to embed the Python interpreter into your
application, particularly because Python needs to load library modules
implemented as C dynamic extensions (@code{.so} files) linked against
it.

To find out the required compiler and linker flags, you can execute the
@code{python`X.Y'-config} script which is generated as part of the
installation process (a @code{python3-config} script may also be
available).  This script has several options, of which the following will
be directly useful to you:


@itemize *

@item 
@code{pythonX.Y-config --cflags} will give you the recommended flags when
compiling:

@example
$ /opt/bin/python3.11-config --cflags
-I/opt/include/python3.11 -I/opt/include/python3.11 -Wsign-compare  -DNDEBUG -g -fwrapv -O3 -Wall
@end example

@item 
@code{pythonX.Y-config --ldflags --embed} will give you the recommended flags
when linking:

@example
$ /opt/bin/python3.11-config --ldflags --embed
-L/opt/lib/python3.11/config-3.11-x86_64-linux-gnu -L/opt/lib -lpython3.11 -lpthread -ldl  -lutil -lm
@end example
@end itemize

@cartouche
@quotation Note 
To avoid confusion between several Python installations (and especially
between the system Python and your own compiled Python), it is recommended
that you use the absolute path to @code{python`X.Y'-config}, as in the above
example.
@end quotation
@end cartouche

If this procedure doesn’t work for you (it is not guaranteed to work for
all Unix-like platforms; however, we welcome @ref{5279,,bug reports})
you will have to read your system’s documentation about dynamic linking and/or
examine Python’s @code{Makefile} (use @ref{4cd2,,sysconfig.get_makefile_filename()}
to find its location) and compilation
options.  In this case, the @ref{e1,,sysconfig} module is a useful tool to
programmatically extract the configuration values that you will want to
combine together.  For example:

@example
>>> import sysconfig
>>> sysconfig.get_config_var('LIBS')
'-lpthread -ldl  -lutil'
>>> sysconfig.get_config_var('LINKFORSHARED')
'-Xlinker -export-dynamic'
@end example

@c XXX similar documentation for Windows missing

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Python/C API reference manual,Installing Python modules,Extending and Embedding the Python Interpreter,Top
@anchor{c-api/index doc}@anchor{527a}@anchor{c-api/index c-api-index}@anchor{2000}@anchor{c-api/index python-c-api-reference-manual}@anchor{527b}@anchor{c-api/index translation-repo}@anchor{527c}
@chapter Python/C API reference manual


This manual documents the API used by C and C++ programmers who want to write
extension modules or embed Python.  It is a companion to @ref{1fff,,Extending and Embedding the Python Interpreter},
which describes the general principles of extension writing but does not
document the API functions in detail.

@menu
* Introduction: Introduction<14>. 
* C API Stability:: 
* The Very High Level Layer:: 
* Reference Counting:: 
* Exception Handling:: 
* Defining extension modules:: 
* Utilities: Utilities<2>. 
* Abstract Objects Layer:: 
* Concrete Objects Layer:: 
* Interpreter initialization and finalization:: 
* Thread states and the global interpreter lock:: 
* Asynchronous notifications:: 
* Operating system thread APIs:: 
* Synchronization primitives: Synchronization primitives<2>. 
* Thread-local storage support:: 
* Multiple interpreters in a Python process:: 
* Profiling and tracing:: 
* Reference tracing:: 
* Python Initialization Configuration:: 
* Memory Management:: 
* Object Implementation Support:: 
* API and ABI Versioning:: 
* Monitoring C API:: 
* Generating Execution Events:: 

@end menu

@node Introduction<14>,C API Stability,,Python/C API reference manual
@anchor{c-api/intro doc}@anchor{527d}@anchor{c-api/intro api-intro}@anchor{527e}@anchor{c-api/intro introduction}@anchor{527f}
@section Introduction


The Application Programmer’s Interface to Python gives C and C++ programmers
access to the Python interpreter at a variety of levels.  The API is equally
usable from C++, but for brevity it is generally referred to as the Python/C
API.  There are two fundamentally different reasons for using the Python/C API.
The first reason is to write `extension modules' for specific purposes; these
are C modules that extend the Python interpreter.  This is probably the most
common use.  The second reason is to use Python as a component in a larger
application; this technique is generally referred to as `embedding' Python
in an application.

Writing an extension module is a relatively well-understood process, where a
“cookbook” approach works well.  There are several tools that automate the
process to some extent.  While people have embedded Python in other
applications since its early existence, the process of embedding Python is
less straightforward than writing an extension.

Many API functions are useful independent of whether you’re embedding  or
extending Python; moreover, most applications that embed Python  will need to
provide a custom extension as well, so it’s probably a  good idea to become
familiar with writing an extension before  attempting to embed Python in a real
application.

@menu
* Language version compatibility:: 
* Coding standards:: 
* Include Files:: 
* Useful macros:: 
* Objects@comma{} Types and Reference Counts: Objects Types and Reference Counts. 
* Exceptions: Exceptions<24>. 
* Embedding Python: Embedding Python<2>. 
* Debugging Builds:: 
* Recommended third party tools: Recommended third party tools<2>. 

@end menu

@node Language version compatibility,Coding standards,,Introduction<14>
@anchor{c-api/intro language-version-compatibility}@anchor{5280}
@subsection Language version compatibility


Python’s C API is compatible with C11 and C++11 versions of C and C++.

This is a lower limit: the C API does not require features from later
C/C++ versions.
You do `not' need to enable your compiler’s “c11 mode”.

@node Coding standards,Include Files,Language version compatibility,Introduction<14>
@anchor{c-api/intro coding-standards}@anchor{5281}
@subsection Coding standards


If you’re writing C code for inclusion in CPython, you `must' follow the
guidelines and standards defined in 
@geindex Python Enhancement Proposals; PEP 7
PEP 7@footnote{https://peps.python.org/pep-0007/}.  These guidelines apply
regardless of the version of Python you are contributing to.  Following these
conventions is not necessary for your own third party extension modules,
unless you eventually expect to contribute them to Python.

@node Include Files,Useful macros,Coding standards,Introduction<14>
@anchor{c-api/intro api-includes}@anchor{98c}@anchor{c-api/intro include-files}@anchor{5282}
@subsection Include Files


All function, type and macro definitions needed to use the Python/C API are
included in your code by the following line:

@example
#define PY_SSIZE_T_CLEAN
#include <Python.h>
@end example

This implies inclusion of the following standard headers: @code{<stdio.h>},
@code{<string.h>}, @code{<errno.h>}, @code{<limits.h>}, @code{<assert.h>} and @code{<stdlib.h>}
(if available).

@cartouche
@quotation Note 
Since Python may define some pre-processor definitions which affect the standard
headers on some systems, you `must' include @code{Python.h} before any standard
headers are included.

It is recommended to always define @code{PY_SSIZE_T_CLEAN} before including
@code{Python.h}.  See @ref{3d3,,Parsing arguments and building values} for a description of this macro.
@end quotation
@end cartouche

All user visible names defined by Python.h (except those defined by the included
standard headers) have one of the prefixes @code{Py} or @code{_Py}.  Names beginning
with @code{_Py} are for internal use by the Python implementation and should not be
used by extension writers. Structure member names do not have a reserved prefix.

@cartouche
@quotation Note 
User code should never define names that begin with @code{Py} or @code{_Py}. This
confuses the reader, and jeopardizes the portability of the user code to
future Python versions, which may define additional names beginning with one
of these prefixes.
@end quotation
@end cartouche

The header files are typically installed with Python.  On Unix, these  are
located in the directories @code{`prefix'/include/pythonversion/} and
@code{`exec_prefix'/include/pythonversion/}, where @ref{2191,,prefix} and
@ref{2192,,exec_prefix} are defined by the corresponding parameters to Python’s
@code{configure} script and `version' is
@code{'%d.%d' % sys.version_info[:2]}.  On Windows, the headers are installed
in @code{`prefix'/include}, where @code{prefix} is the installation
directory specified to the installer.

To include the headers, place both directories (if different) on your compiler’s
search path for includes.  Do `not' place the parent directories on the search
path and then use @code{#include <pythonX.Y/Python.h>}; this will break on
multi-platform builds since the platform independent headers under
@ref{2191,,prefix} include the platform specific headers from
@ref{2192,,exec_prefix}.

C++ users should note that although the API is defined entirely using C, the
header files properly declare the entry points to be @code{extern "C"}. As a result,
there is no need to do anything special to use the API from C++.

@node Useful macros,Objects Types and Reference Counts,Include Files,Introduction<14>
@anchor{c-api/intro useful-macros}@anchor{5283}
@subsection Useful macros


Several useful macros are defined in the Python header files.  Many are
defined closer to where they are useful (for example, @ref{167f,,Py_RETURN_NONE},
@ref{16df,,PyMODINIT_FUNC}).
Others of a more general utility are defined here.  This is not necessarily a
complete listing.

@geindex Py_CAN_START_THREADS (C macro)
@anchor{c-api/intro c Py_CAN_START_THREADS}@anchor{5284}
@deffn {C Macro} Py_CAN_START_THREADS

If this macro is defined, then the current system is able to start threads.

Currently, all systems supported by CPython (per 
@geindex Python Enhancement Proposals; PEP 11
PEP 11@footnote{https://peps.python.org/pep-0011/}), with the
exception of some WebAssembly platforms, support starting threads.


Added in version 3.13.

@end deffn

@geindex Py_GETENV (C macro)
@anchor{c-api/intro c Py_GETENV}@anchor{5285}
@deffn {C Macro} Py_GETENV (s)

Like @code{getenv(@var{s})}, but returns @code{NULL} if @ref{b5c,,-E} was passed
on the command line (see @ref{409,,PyConfig.use_environment}).
@end deffn

@menu
* Docstring macros:: 
* General utility macros:: 
* Declaration utilities:: 
* Outdated macros:: 

@end menu

@node Docstring macros,General utility macros,,Useful macros
@anchor{c-api/intro docstring-macros}@anchor{5286}
@subsubsection Docstring macros


@geindex PyDoc_STRVAR (C macro)
@anchor{c-api/intro c PyDoc_STRVAR}@anchor{1d9f}
@deffn {C Macro} PyDoc_STRVAR (name, str)

Creates a variable with name `name' that can be used in docstrings.
If Python is built without docstrings (@ref{21e4,,--without-doc-strings}),
the value will be an empty string.

Example:

@example
PyDoc_STRVAR(pop_doc, "Remove and return the rightmost element.");

static PyMethodDef deque_methods[] = @{
    // ...
    @{"pop", (PyCFunction)deque_pop, METH_NOARGS, pop_doc@},
    // ...
@}
@end example

Expands to @code{PyDoc_VAR(@var{name}) = PyDoc_STR(@var{str})}.
@end deffn

@geindex PyDoc_STR (C macro)
@anchor{c-api/intro c PyDoc_STR}@anchor{1bda}
@deffn {C Macro} PyDoc_STR (str)

Expands to the given input string, or an empty string
if docstrings are disabled (@ref{21e4,,--without-doc-strings}).

Example:

@example
static PyMethodDef pysqlite_row_methods[] = @{
    @{"keys", (PyCFunction)pysqlite_row_keys, METH_NOARGS,
        PyDoc_STR("Returns the keys of the row.")@},
    @{NULL, NULL@}
@};
@end example
@end deffn

@geindex PyDoc_VAR (C macro)
@anchor{c-api/intro c PyDoc_VAR}@anchor{1e33}
@deffn {C Macro} PyDoc_VAR (name)

Declares a static character array variable with the given `name'.
Expands to @code{static const char @var{name}[]}

For example:

@example
PyDoc_VAR(python_doc) = PyDoc_STR(
   "A genus of constricting snakes in the Pythonidae family native "
   "to the tropics and subtropics of the Eastern Hemisphere.");
@end example
@end deffn

@node General utility macros,Declaration utilities,Docstring macros,Useful macros
@anchor{c-api/intro general-utility-macros}@anchor{5287}
@subsubsection General utility macros


The following macros are for common tasks not specific to Python.

@geindex Py_UNUSED (C macro)
@anchor{c-api/intro c Py_UNUSED}@anchor{1ad0}
@deffn {C Macro} Py_UNUSED (arg)

Use this for unused arguments in a function definition to silence compiler
warnings. Example: @code{int func(int a, int Py_UNUSED(b)) @{ return a; @}}.


Added in version 3.4.

@end deffn

@geindex Py_GCC_ATTRIBUTE (C macro)
@anchor{c-api/intro c Py_GCC_ATTRIBUTE}@anchor{5288}
@deffn {C Macro} Py_GCC_ATTRIBUTE (name)

Use a GCC attribute `name', hiding it from compilers that don’t support GCC
attributes (such as MSVC).

This expands to @code{__attribute__((@var{name)})} on a GCC compiler,
and expands to nothing on compilers that don’t support GCC attributes.
@end deffn

@menu
* Numeric utilities:: 
* Assertion utilities:: 
* Type size utilities:: 
* Macro definition utilities:: 

@end menu

@node Numeric utilities,Assertion utilities,,General utility macros
@anchor{c-api/intro numeric-utilities}@anchor{5289}
@subsubsection Numeric utilities


@geindex Py_ABS (C macro)
@anchor{c-api/intro c Py_ABS}@anchor{528a}
@deffn {C Macro} Py_ABS (x)

Return the absolute value of @code{x}.

The argument may be evaluated more than once.
Consequently, do not pass an expression with side-effects directly
to this macro.

If the result cannot be represented (for example, if @code{x} has
@code{INT_MIN} value for int type), the behavior is
undefined.

Corresponds roughly to @code{((@var{x}) < 0 ? -(@var{x}) : (@var{x}))}


Added in version 3.3.

@end deffn

@geindex Py_MAX (C macro)
@geindex Py_MIN (C macro)
@anchor{c-api/intro c Py_MAX}@anchor{528b}
@deffn {C Macro} Py_MAX (x, y)
@anchor{c-api/intro c Py_MIN}@anchor{528c}
@deffnx {C Macro} Py_MIN (x, y)

Return the larger or smaller of the arguments, respectively.

Any arguments may be evaluated more than once.
Consequently, do not pass an expression with side-effects directly
to this macro.

@code{Py_MAX} corresponds roughly to
@code{(((@var{x}) > (@var{y})) ? (@var{x}) : (@var{y}))}.


Added in version 3.3.

@end deffn

@geindex Py_ARITHMETIC_RIGHT_SHIFT (C macro)
@anchor{c-api/intro c Py_ARITHMETIC_RIGHT_SHIFT}@anchor{528d}
@deffn {C Macro} Py_ARITHMETIC_RIGHT_SHIFT (type, integer, positions)

Similar to @code{@var{integer} >> @var{positions}}, but forces sign extension,
as the C standard does not define whether a right-shift of a signed
integer will perform sign extension or a zero-fill.

`integer' should be any signed integer type.
`positions' is the number of positions to shift to the right.

Both `integer' and `positions' can be evaluated more than once;
consequently, avoid directly passing a function call or some other
operation with side-effects to this macro. Instead, store the result as a
variable and then pass it.

`type' is unused and only kept for backwards compatibility. Historically,
`type' was used to cast `integer'.


Changed in version 3.1: This macro is now valid for all signed integer types, not just those for
which @code{unsigned type} is legal. As a result, `type' is no longer
used.

@end deffn

@geindex Py_CHARMASK (C macro)
@anchor{c-api/intro c Py_CHARMASK}@anchor{528e}
@deffn {C Macro} Py_CHARMASK (c)

Argument must be a character or an integer in the range [-128, 127] or [0,
255].  This macro returns @code{c} cast to an @code{unsigned char}.
@end deffn

@node Assertion utilities,Type size utilities,Numeric utilities,General utility macros
@anchor{c-api/intro assertion-utilities}@anchor{528f}
@subsubsection Assertion utilities


@geindex Py_UNREACHABLE (C macro)
@anchor{c-api/intro c Py_UNREACHABLE}@anchor{db4}
@deffn {C Macro} Py_UNREACHABLE ()

Use this when you have a code path that cannot be reached by design.
For example, in the @code{default:} clause in a @code{switch} statement for which
all possible values are covered in @code{case} statements.  Use this in places
where you might be tempted to put an @code{assert(0)} or @code{abort()} call.

In release mode, the macro helps the compiler to optimize the code, and
avoids a warning about unreachable code.  For example, the macro is
implemented with @code{__builtin_unreachable()} on GCC in release mode.

In debug mode, and on unsupported compilers, the macro expands to a call to
@ref{b80,,Py_FatalError()}.

A use for @code{Py_UNREACHABLE()} is following a call to a function that
never returns but that is not declared @code{_Noreturn}.

If a code path is very unlikely code but can be reached under exceptional
case, this macro must not be used.  For example, under low memory condition
or if a system call returns a value out of the expected range.  In this
case, it’s better to report the error to the caller.  If the error cannot
be reported to caller, @ref{b80,,Py_FatalError()} can be used.


Added in version 3.7.

@end deffn

@geindex Py_SAFE_DOWNCAST (C macro)
@anchor{c-api/intro c Py_SAFE_DOWNCAST}@anchor{5290}
@deffn {C Macro} Py_SAFE_DOWNCAST (value, larger, smaller)

Cast `value' to type `smaller' from type `larger', validating that no
information was lost.

On release builds of Python, this is roughly equivalent to
@code{((@var{smaller}) @var{value})}
(in C++, @code{static_cast<@var{smaller}>(@var{value})} will be used instead).

On debug builds (implying that @ref{187e,,Py_DEBUG} is defined), this asserts
that no information was lost with the cast from `larger' to `smaller'.

`value', `larger', and `smaller' may all be evaluated more than once in the
expression; consequently, do not pass an expression with side-effects
directly to this macro.
@end deffn

@geindex Py_BUILD_ASSERT (C macro)
@anchor{c-api/intro c Py_BUILD_ASSERT}@anchor{19f5}
@deffn {C Macro} Py_BUILD_ASSERT (cond)

Asserts a compile-time condition `cond', as a statement.
The build will fail if the condition is false or cannot be evaluated at compile time.

Corresponds roughly to @code{static_assert(@var{cond})} on C23 and above.

For example:

@example
Py_BUILD_ASSERT(sizeof(PyTime_t) == sizeof(int64_t));
@end example


Added in version 3.3.

@end deffn

@geindex Py_BUILD_ASSERT_EXPR (C macro)
@anchor{c-api/intro c Py_BUILD_ASSERT_EXPR}@anchor{19f6}
@deffn {C Macro} Py_BUILD_ASSERT_EXPR (cond)

Asserts a compile-time condition `cond', as an expression that evaluates to @code{0}.
The build will fail if the condition is false or cannot be evaluated at compile time.

For example:

@example
#define foo_to_char(foo) \
    ((char *)(foo) + Py_BUILD_ASSERT_EXPR(offsetof(struct foo, string) == 0))
@end example


Added in version 3.3.

@end deffn

@node Type size utilities,Macro definition utilities,Assertion utilities,General utility macros
@anchor{c-api/intro type-size-utilities}@anchor{5291}
@subsubsection Type size utilities


@geindex Py_ARRAY_LENGTH (C macro)
@anchor{c-api/intro c Py_ARRAY_LENGTH}@anchor{5292}
@deffn {C Macro} Py_ARRAY_LENGTH (array)

Compute the length of a statically allocated C array at compile time.

The `array' argument must be a C array with a size known at compile time.
Passing an array with an unknown size, such as a heap-allocated array,
will result in a compilation error on some compilers, or otherwise produce
incorrect results.

This is roughly equivalent to:

@example
sizeof(array) / sizeof((array)[0])
@end example
@end deffn

@geindex Py_MEMBER_SIZE (C macro)
@anchor{c-api/intro c Py_MEMBER_SIZE}@anchor{5293}
@deffn {C Macro} Py_MEMBER_SIZE (type, member)

Return the size of a structure (`type') `member' in bytes.

Corresponds roughly to @code{sizeof(((@var{type} *)NULL)->@var{member})}.


Added in version 3.6.

@end deffn

@node Macro definition utilities,,Type size utilities,General utility macros
@anchor{c-api/intro macro-definition-utilities}@anchor{5294}
@subsubsection Macro definition utilities


@geindex Py_FORCE_EXPANSION (C macro)
@anchor{c-api/intro c Py_FORCE_EXPANSION}@anchor{5295}
@deffn {C Macro} Py_FORCE_EXPANSION (X)

This is equivalent to @code{@var{X}}, which is useful for token-pasting in
macros, as macro expansions in `X' are forcefully evaluated by the
preprocessor.
@end deffn

@geindex Py_STRINGIFY (C macro)
@anchor{c-api/intro c Py_STRINGIFY}@anchor{5296}
@deffn {C Macro} Py_STRINGIFY (x)

Convert @code{x} to a C string.  For example, @code{Py_STRINGIFY(123)} returns
@code{"123"}.


Added in version 3.4.

@end deffn

@node Declaration utilities,Outdated macros,General utility macros,Useful macros
@anchor{c-api/intro declaration-utilities}@anchor{5297}
@subsubsection Declaration utilities


The following macros can be used in declarations.
They are most useful for defining the C API itself, and have limited use
for extension authors.
Most of them expand to compiler-specific spellings of common extensions
to the C language.

@geindex Py_ALWAYS_INLINE (C macro)
@anchor{c-api/intro c Py_ALWAYS_INLINE}@anchor{1cae}
@deffn {C Macro} Py_ALWAYS_INLINE

Ask the compiler to always inline a static inline function. The compiler can
ignore it and decide to not inline the function.

Corresponds to @code{always_inline} attribute in GCC and @code{__forceinline}
in MSVC.

It can be used to inline performance critical static inline functions when
building Python in debug mode with function inlining disabled. For example,
MSC disables function inlining when building in debug mode.

Marking blindly a static inline function with Py_ALWAYS_INLINE can result in
worse performances (due to increased code size for example). The compiler is
usually smarter than the developer for the cost/benefit analysis.

If Python is @ref{50a,,built in debug mode} (if the @ref{187e,,Py_DEBUG}
macro is defined), the @ref{1cae,,Py_ALWAYS_INLINE} macro does nothing.

It must be specified before the function return type. Usage:

@example
static inline Py_ALWAYS_INLINE int random(void) @{ return 4; @}
@end example


Added in version 3.11.

@end deffn

@geindex Py_NO_INLINE (C macro)
@anchor{c-api/intro c Py_NO_INLINE}@anchor{184c}
@deffn {C Macro} Py_NO_INLINE

Disable inlining on a function. For example, it reduces the C stack
consumption: useful on LTO+PGO builds which heavily inline code (see
bpo-33720@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33720}).

Corresponds to the @code{noinline} attribute/specification on GCC and MSVC.

Usage:

@example
Py_NO_INLINE static int random(void) @{ return 4; @}
@end example


Added in version 3.11.

@end deffn

@geindex Py_DEPRECATED (C macro)
@anchor{c-api/intro c Py_DEPRECATED}@anchor{ca1}
@deffn {C Macro} Py_DEPRECATED (version)

Use this to declare APIs that were deprecated in a specific CPython version.
The macro must be placed before the symbol name.

Example:

@example
Py_DEPRECATED(3.8) PyAPI_FUNC(int) Py_OldFunction(void);
@end example


Changed in version 3.8: MSVC support was added.

@end deffn

@geindex Py_LOCAL (C macro)
@anchor{c-api/intro c Py_LOCAL}@anchor{1656}
@deffn {C Macro} Py_LOCAL (type)

Declare a function returning the specified `type' using a fast-calling
qualifier for functions that are local to the current file.
Semantically, this is equivalent to @code{static @var{type}}.
@end deffn

@geindex Py_LOCAL_INLINE (C macro)
@anchor{c-api/intro c Py_LOCAL_INLINE}@anchor{1657}
@deffn {C Macro} Py_LOCAL_INLINE (type)

Equivalent to @ref{1656,,Py_LOCAL} but additionally requests the function
be inlined.
@end deffn

@geindex Py_LOCAL_SYMBOL (C macro)
@anchor{c-api/intro c Py_LOCAL_SYMBOL}@anchor{5298}
@deffn {C Macro} Py_LOCAL_SYMBOL

Macro used to declare a symbol as local to the shared library (hidden).
On supported platforms, it ensures the symbol is not exported.

On compatible versions of GCC/Clang, it
expands to @code{__attribute__((visibility("hidden")))}.
@end deffn

@geindex Py_EXPORTED_SYMBOL (C macro)
@anchor{c-api/intro c Py_EXPORTED_SYMBOL}@anchor{5299}
@deffn {C Macro} Py_EXPORTED_SYMBOL

Macro used to declare a symbol (function or data) as exported.
On Windows, this expands to @code{__declspec(dllexport)}.
On compatible versions of GCC/Clang, it
expands to @code{__attribute__((visibility("default")))}.
This macro is for defining the C API itself; extension modules should not use it.
@end deffn

@geindex Py_IMPORTED_SYMBOL (C macro)
@anchor{c-api/intro c Py_IMPORTED_SYMBOL}@anchor{529a}
@deffn {C Macro} Py_IMPORTED_SYMBOL

Macro used to declare a symbol as imported.
On Windows, this expands to @code{__declspec(dllimport)}.
This macro is for defining the C API itself; extension modules should not use it.
@end deffn

@geindex PyAPI_FUNC (C macro)
@anchor{c-api/intro c PyAPI_FUNC}@anchor{529b}
@deffn {C Macro} PyAPI_FUNC (type)

Macro used by CPython to declare a function as part of the C API.
Its expansion depends on the platform and build configuration.
This macro is intended for defining CPython’s C API itself;
extension modules should not use it for their own symbols.
@end deffn

@geindex PyAPI_DATA (C macro)
@anchor{c-api/intro c PyAPI_DATA}@anchor{529c}
@deffn {C Macro} PyAPI_DATA (type)

Macro used by CPython to declare a public global variable as part of the C API.
Its expansion depends on the platform and build configuration.
This macro is intended for defining CPython’s C API itself;
extension modules should not use it for their own symbols.
@end deffn

@node Outdated macros,,Declaration utilities,Useful macros
@anchor{c-api/intro outdated-macros}@anchor{529d}
@subsubsection Outdated macros


The following macros have been used to features that have been standardized
in C11.

@geindex Py_ALIGNED (C macro)
@anchor{c-api/intro c Py_ALIGNED}@anchor{529e}
@deffn {C Macro} Py_ALIGNED (num)

Specify alignment to `num' bytes on compilers that support it.

Consider using the C11 standard @code{_Alignas} specifier over this macro.
@end deffn

@geindex Py_LL (C macro)
@geindex Py_ULL (C macro)
@anchor{c-api/intro c Py_LL}@anchor{529f}
@deffn {C Macro} Py_LL (number)
@anchor{c-api/intro c Py_ULL}@anchor{52a0}
@deffnx {C Macro} Py_ULL (number)

Use `number' as a @code{long long} or @code{unsigned long long} integer literal,
respectively.

Expands to `number' followed by @code{LL} or @code{LLU}, respectively, but will
expand to some compiler-specific suffixes on some older compilers.

Consider using the C99 standard suffixes @code{LL} and @code{LLU} directly.
@end deffn

@geindex Py_MEMCPY (C macro)
@anchor{c-api/intro c Py_MEMCPY}@anchor{19d3}
@deffn {C Macro} Py_MEMCPY (dest, src, n)

This is a @ref{23f,,soft deprecated} alias to @code{memcpy()}.
Use @code{memcpy()} directly instead.


Deprecated since version 3.14: The macro is @ref{23f,,soft deprecated}.

@end deffn

@geindex Py_VA_COPY (C macro)
@anchor{c-api/intro c Py_VA_COPY}@anchor{52a1}
@deffn {C Macro} Py_VA_COPY

This is a @ref{23f,,soft deprecated} alias to the C99-standard @code{va_copy}
function.

Historically, this would use a compiler-specific method to copy a @code{va_list}.


Changed in version 3.6: This is now an alias to @code{va_copy}.

@end deffn

@node Objects Types and Reference Counts,Exceptions<24>,Useful macros,Introduction<14>
@anchor{c-api/intro api-objects}@anchor{52a2}@anchor{c-api/intro objects-types-and-reference-counts}@anchor{52a3}
@subsection Objects, Types and Reference Counts


@geindex object; type

Most Python/C API functions have one or more arguments as well as a return value
of type @ref{5df,,PyObject}*.  This type is a pointer to an opaque data type
representing an arbitrary Python object.  Since all Python object types are
treated the same way by the Python language in most situations (e.g.,
assignments, scope rules, and argument passing), it is only fitting that they
should be represented by a single C type.  Almost all Python objects live on the
heap: you never declare an automatic or static variable of type
@ref{5df,,PyObject}, only pointer variables of type PyObject* can  be
declared.  The sole exception are the type objects; since these must never be
deallocated, they are typically static @ref{ca2,,PyTypeObject} objects.

All Python objects (even Python integers) have a `type' and a
`reference count'.  An object’s type determines what kind of object it is
(e.g., an integer, a list, or a user-defined function; there are many more as
explained in @ref{2373,,The standard type hierarchy}).  For each of the well-known types there is a macro
to check whether an object is of that type; for instance, @code{PyList_Check(a)} is
true if (and only if) the object pointed to by `a' is a Python list.

@menu
* Reference Counts: Reference Counts<2>. 
* Types: Types<2>. 

@end menu

@node Reference Counts<2>,Types<2>,,Objects Types and Reference Counts
@anchor{c-api/intro api-refcounts}@anchor{52a4}@anchor{c-api/intro reference-counts}@anchor{52a5}
@subsubsection Reference Counts


The reference count is important because today’s computers have a  finite
(and often severely limited) memory size; it counts how many different
places there are that have a @ref{5e2,,strong reference} to an object.
Such a place could be another object, or a global (or static) C variable,
or a local variable in some C function.
When the last strong reference to an object is released
(i.e. its reference count becomes zero), the object is deallocated.
If it contains references to other objects, those references are released.
Those other objects may be deallocated in turn, if there are no more
references to them, and so on.  (There’s an obvious problem  with
objects that reference each other here; for now, the solution
is “don’t do that.”)

@geindex Py_INCREF (C function)
@geindex Py_DECREF (C function)

Reference counts are always manipulated explicitly.  The normal way is
to use the macro @ref{790,,Py_INCREF()} to take a new reference to an
object (i.e. increment its reference count by one),
and @ref{791,,Py_DECREF()} to release that reference (i.e. decrement the
reference count by one).  The @code{Py_DECREF()} macro
is considerably more complex than the incref one, since it must check whether
the reference count becomes zero and then cause the object’s deallocator to be
called.  The deallocator is a function pointer contained in the object’s type
structure.  The type-specific deallocator takes care of releasing references
for other objects contained in the object if this is a compound
object type, such as a list, as well as performing any additional finalization
that’s needed.  There’s no chance that the reference count can overflow; at
least as many bits are used to hold the reference count as there are distinct
memory locations in virtual memory (assuming @code{sizeof(Py_ssize_t) >= sizeof(void*)}).
Thus, the reference count increment is a simple operation.

It is not necessary to hold a @ref{5e2,,strong reference} (i.e. increment
the reference count) for every local variable that contains a pointer
to an object.  In theory, the  object’s
reference count goes up by one when the variable is made to  point to it and it
goes down by one when the variable goes out of  scope.  However, these two
cancel each other out, so at the end the  reference count hasn’t changed.  The
only real reason to use the  reference count is to prevent the object from being
deallocated as  long as our variable is pointing to it.  If we know that there
is at  least one other reference to the object that lives at least as long as
our variable, there is no need to take a new strong reference
(i.e. increment the reference count) temporarily.
An important situation where this arises is in objects  that are passed as
arguments to C functions in an extension module  that are called from Python;
the call mechanism guarantees to hold a  reference to every argument for the
duration of the call.

However, a common pitfall is to extract an object from a list and hold on to it
for a while without taking a new reference.  Some other operation might
conceivably remove the object from the list, releasing that reference,
and possibly deallocating it. The real danger is that innocent-looking
operations may invoke arbitrary Python code which could do this; there is a code
path which allows control to flow back to the user from a @ref{791,,Py_DECREF()}, so
almost any operation is potentially dangerous.

A safe approach is to always use the generic operations (functions  whose name
begins with @code{PyObject_}, @code{PyNumber_}, @code{PySequence_} or @code{PyMapping_}).
These operations always create a new @ref{5e2,,strong reference}
(i.e. increment the reference count) of the object they return.
This leaves the caller with the responsibility to call @ref{791,,Py_DECREF()} when
they are done with the result; this soon becomes second nature.

@menu
* Reference Count Details:: 

@end menu

@node Reference Count Details,,,Reference Counts<2>
@anchor{c-api/intro api-refcountdetails}@anchor{52a6}@anchor{c-api/intro reference-count-details}@anchor{52a7}
@subsubsection Reference Count Details


The reference count behavior of functions in the Python/C API is best  explained
in terms of `ownership of references'.  Ownership pertains to references, never
to objects (objects are not owned: they are always shared).  “Owning a
reference” means being responsible for calling Py_DECREF on it when the
reference is no longer needed.  Ownership can also be transferred, meaning that
the code that receives ownership of the reference then becomes responsible for
eventually releasing it by calling @ref{791,,Py_DECREF()} or @ref{997,,Py_XDECREF()}
when it’s no longer needed—or passing on this responsibility (usually to its
caller). When a function passes ownership of a reference on to its caller, the
caller is said to receive a `new' reference.  When no ownership is transferred,
the caller is said to `borrow' the reference. Nothing needs to be done for a
@ref{3d5,,borrowed reference}.

Conversely, when a calling function passes in a reference to an  object, there
are two possibilities: the function `steals' a  reference to the object, or it
does not.  `Stealing a reference' means that when you pass a reference to a
function, that function assumes that it now owns that reference, and you are not
responsible for it any longer.

@geindex PyList_SetItem (C function)
@geindex PyTuple_SetItem (C function)

Few functions steal references; the two notable exceptions are
@ref{1900,,PyList_SetItem()} and @ref{5218,,PyTuple_SetItem()}, which  steal a reference
to the item (but not to the tuple or list into which the item is put!).  These
functions were designed to steal a reference because of a common idiom for
populating a tuple or list with newly created objects; for example, the code to
create the tuple @code{(1, 2, "three")} could look like this (forgetting about
error handling for the moment; a better way to code this is shown below):

@example
PyObject *t;

t = PyTuple_New(3);
PyTuple_SetItem(t, 0, PyLong_FromLong(1L));
PyTuple_SetItem(t, 1, PyLong_FromLong(2L));
PyTuple_SetItem(t, 2, PyUnicode_FromString("three"));
@end example

Here, @ref{1c13,,PyLong_FromLong()} returns a new reference which is immediately
stolen by @ref{5218,,PyTuple_SetItem()}.  When you want to keep using an object
although the reference to it will be stolen, use @ref{790,,Py_INCREF()} to grab
another reference before calling the reference-stealing function.

Incidentally, @ref{5218,,PyTuple_SetItem()} is the `only' way to set tuple items;
@ref{1e77,,PySequence_SetItem()} and @ref{52a8,,PyObject_SetItem()} refuse to do this
since tuples are an immutable data type.  You should only use
@code{PyTuple_SetItem()} for tuples that you are creating yourself.

Equivalent code for populating a list can be written using @ref{52a9,,PyList_New()}
and @ref{1900,,PyList_SetItem()}.

However, in practice, you will rarely use these ways of creating and populating
a tuple or list.  There’s a generic function, @ref{3c0,,Py_BuildValue()}, that can
create most common objects from C values, directed by a `format string'.
For example, the above two blocks of code could be replaced by the following
(which also takes care of the error checking):

@example
PyObject *tuple, *list;

tuple = Py_BuildValue("(iis)", 1, 2, "three");
list = Py_BuildValue("[iis]", 1, 2, "three");
@end example

It is much more common to use @ref{52a8,,PyObject_SetItem()} and friends with items
whose references you are only borrowing, like arguments that were passed in to
the function you are writing.  In that case, their behaviour regarding references
is much saner, since you don’t have to take a new reference just so you
can give that reference away (“have it be stolen”).  For example, this function
sets all items of a list (actually, any mutable sequence) to a given item:

@example
int
set_all(PyObject *target, PyObject *item)
@{
    Py_ssize_t i, n;

    n = PyObject_Length(target);
    if (n < 0)
        return -1;
    for (i = 0; i < n; i++) @{
        PyObject *index = PyLong_FromSsize_t(i);
        if (!index)
            return -1;
        if (PyObject_SetItem(target, index, item) < 0) @{
            Py_DECREF(index);
            return -1;
        @}
        Py_DECREF(index);
    @}
    return 0;
@}
@end example

@geindex set_all()

The situation is slightly different for function return values.   While passing
a reference to most functions does not change your  ownership responsibilities
for that reference, many functions that  return a reference to an object give
you ownership of the reference. The reason is simple: in many cases, the
returned object is created  on the fly, and the reference you get is the only
reference to the  object.  Therefore, the generic functions that return object
references, like @ref{5ea,,PyObject_GetItem()} and  @ref{1e76,,PySequence_GetItem()},
always return a new reference (the caller becomes the owner of the reference).

It is important to realize that whether you own a reference returned  by a
function depends on which function you call only — `the plumage' (the type of
the object passed as an argument to the function) `doesn’t enter into it!'
Thus, if you  extract an item from a list using @ref{5ff,,PyList_GetItem()}, you
don’t own the reference — but if you obtain the same item from the same list
using @ref{1e76,,PySequence_GetItem()} (which happens to take exactly the same
arguments), you do own a reference to the returned object.

@geindex PyList_GetItem (C function)
@geindex PySequence_GetItem (C function)

Here is an example of how you could write a function that computes the sum of
the items in a list of integers; once using  @ref{5ff,,PyList_GetItem()}, and once
using @ref{1e76,,PySequence_GetItem()}.

@example
long
sum_list(PyObject *list)
@{
    Py_ssize_t i, n;
    long total = 0, value;
    PyObject *item;

    n = PyList_Size(list);
    if (n < 0)
        return -1; /* Not a list */
    for (i = 0; i < n; i++) @{
        item = PyList_GetItem(list, i); /* Can't fail */
        if (!PyLong_Check(item)) continue; /* Skip non-integers */
        value = PyLong_AsLong(item);
        if (value == -1 && PyErr_Occurred())
            /* Integer too big to fit in a C long, bail out */
            return -1;
        total += value;
    @}
    return total;
@}
@end example

@geindex sum_list()

@example
long
sum_sequence(PyObject *sequence)
@{
    Py_ssize_t i, n;
    long total = 0, value;
    PyObject *item;
    n = PySequence_Length(sequence);
    if (n < 0)
        return -1; /* Has no length */
    for (i = 0; i < n; i++) @{
        item = PySequence_GetItem(sequence, i);
        if (item == NULL)
            return -1; /* Not a sequence, or other failure */
        if (PyLong_Check(item)) @{
            value = PyLong_AsLong(item);
            Py_DECREF(item);
            if (value == -1 && PyErr_Occurred())
                /* Integer too big to fit in a C long, bail out */
                return -1;
            total += value;
        @}
        else @{
            Py_DECREF(item); /* Discard reference ownership */
        @}
    @}
    return total;
@}
@end example

@geindex sum_sequence()

@node Types<2>,,Reference Counts<2>,Objects Types and Reference Counts
@anchor{c-api/intro api-types}@anchor{52aa}@anchor{c-api/intro types}@anchor{52ab}
@subsubsection Types


There are few other data types that play a significant role in  the Python/C
API; most are simple C types such as int,  long,
double and char*.  A few structure types  are used to
describe static tables used to list the functions exported  by a module or the
data attributes of a new object type, and another is used to describe the value
of a complex number.  These will  be discussed together with the functions that
use them.

@geindex Py_ssize_t (C type)
@anchor{c-api/intro c Py_ssize_t}@anchor{c5b}
@deffn {C Type} type Py_ssize_t
` Part of the @ref{776,,Stable ABI}.'
A signed integral type such that @code{sizeof(Py_ssize_t) == sizeof(size_t)}.
C99 doesn’t define such a thing directly (size_t is an unsigned integral type).
See 
@geindex Python Enhancement Proposals; PEP 353
PEP 353@footnote{https://peps.python.org/pep-0353/} for details. @code{PY_SSIZE_T_MAX} is the largest positive value
of type @ref{c5b,,Py_ssize_t}.
@end deffn

@node Exceptions<24>,Embedding Python<2>,Objects Types and Reference Counts,Introduction<14>
@anchor{c-api/intro api-exceptions}@anchor{52ac}@anchor{c-api/intro exceptions}@anchor{52ad}
@subsection Exceptions


The Python programmer only needs to deal with exceptions if specific  error
handling is required; unhandled exceptions are automatically  propagated to the
caller, then to the caller’s caller, and so on, until they reach the top-level
interpreter, where they are reported to the  user accompanied by a stack
traceback.

@geindex PyErr_Occurred (C function)

For C programmers, however, error checking always has to be explicit.  All
functions in the Python/C API can raise exceptions, unless an explicit claim is
made otherwise in a function’s documentation.  In general, when a function
encounters an error, it sets an exception, discards any object references that
it owns, and returns an error indicator.  If not documented otherwise, this
indicator is either @code{NULL} or @code{-1}, depending on the function’s return type.
A few functions return a Boolean true/false result, with false indicating an
error.  Very few functions return no explicit error indicator or have an
ambiguous return value, and require explicit testing for errors with
@ref{1cf0,,PyErr_Occurred()}.  These exceptions are always explicitly documented.

@geindex PyErr_SetString (C function)
@geindex PyErr_Clear (C function)

Exception state is maintained in per-thread storage (this is  equivalent to
using global storage in an unthreaded application).  A  thread can be in one of
two states: an exception has occurred, or not. The function
@ref{1cf0,,PyErr_Occurred()} can be used to check for this: it returns a borrowed
reference to the exception type object when an exception has occurred, and
@code{NULL} otherwise.  There are a number of functions to set the exception state:
@ref{79d,,PyErr_SetString()} is the most common (though not the most general)
function to set the exception state, and @ref{1237,,PyErr_Clear()} clears the
exception state.

The full exception state consists of three objects (all of which can  be
@code{NULL}): the exception type, the corresponding exception  value, and the
traceback.  These have the same meanings as the Python result of
@code{sys.exc_info()}; however, they are not the same: the Python objects represent
the last exception being handled by a Python  @ref{8fa,,try} …
@ref{1ac,,except} statement, while the C level exception state only exists while
an exception is being passed on between C functions until it reaches the Python
bytecode interpreter’s  main loop, which takes care of transferring it to
@code{sys.exc_info()} and friends.

@geindex exc_info (in module sys)

Note that starting with Python 1.5, the preferred, thread-safe way to access the
exception state from Python code is to call the function @ref{89c,,sys.exc_info()},
which returns the per-thread exception state for Python code.  Also, the
semantics of both ways to access the exception state have changed so that a
function which catches an exception will save and restore its thread’s exception
state so as to preserve the exception state of its caller.  This prevents common
bugs in exception handling code caused by an innocent-looking function
overwriting the exception being handled; it also reduces the often unwanted
lifetime extension for objects that are referenced by the stack frames in the
traceback.

As a general principle, a function that calls another function to  perform some
task should check whether the called function raised an  exception, and if so,
pass the exception state on to its caller.  It  should discard any object
references that it owns, and return an  error indicator, but it should `not' set
another exception — that would overwrite the exception that was just raised,
and lose important information about the exact cause of the error.

@geindex sum_sequence()

A simple example of detecting exceptions and passing them on is shown in the
@code{sum_sequence()} example above.  It so happens that this example doesn’t
need to clean up any owned references when it detects an error.  The following
example function shows some error cleanup.  First, to remind you why you like
Python, we show the equivalent Python code:

@example
def incr_item(dict, key):
    try:
        item = dict[key]
    except KeyError:
        item = 0
    dict[key] = item + 1
@end example

@geindex incr_item()

Here is the corresponding C code, in all its glory:

@example
int
incr_item(PyObject *dict, PyObject *key)
@{
    /* Objects all initialized to NULL for Py_XDECREF */
    PyObject *item = NULL, *const_one = NULL, *incremented_item = NULL;
    int rv = -1; /* Return value initialized to -1 (failure) */

    item = PyObject_GetItem(dict, key);
    if (item == NULL) @{
        /* Handle KeyError only: */
        if (!PyErr_ExceptionMatches(PyExc_KeyError))
            goto error;

        /* Clear the error and use zero: */
        PyErr_Clear();
        item = PyLong_FromLong(0L);
        if (item == NULL)
            goto error;
    @}
    const_one = PyLong_FromLong(1L);
    if (const_one == NULL)
        goto error;

    incremented_item = PyNumber_Add(item, const_one);
    if (incremented_item == NULL)
        goto error;

    if (PyObject_SetItem(dict, key, incremented_item) < 0)
        goto error;
    rv = 0; /* Success */
    /* Continue with cleanup code */

 error:
    /* Cleanup code, shared by success and failure path */

    /* Use Py_XDECREF() to ignore NULL references */
    Py_XDECREF(item);
    Py_XDECREF(const_one);
    Py_XDECREF(incremented_item);

    return rv; /* -1 for error, 0 for success */
@}
@end example

@geindex incr_item()

@geindex PyErr_ExceptionMatches (C function)
@geindex PyErr_Clear (C function)
@geindex Py_XDECREF (C function)

This example represents an endorsed use of the @code{goto} statement  in C!
It illustrates the use of @ref{52ae,,PyErr_ExceptionMatches()} and
@ref{1237,,PyErr_Clear()} to handle specific exceptions, and the use of
@ref{997,,Py_XDECREF()} to dispose of owned references that may be @code{NULL} (note the
@code{'X'} in the name; @ref{791,,Py_DECREF()} would crash when confronted with a
@code{NULL} reference).  It is important that the variables used to hold owned
references are initialized to @code{NULL} for this to work; likewise, the proposed
return value is initialized to @code{-1} (failure) and only set to success after
the final call made is successful.

@node Embedding Python<2>,Debugging Builds,Exceptions<24>,Introduction<14>
@anchor{c-api/intro api-embedding}@anchor{52af}@anchor{c-api/intro embedding-python}@anchor{52b0}
@subsection Embedding Python


The one important task that only embedders (as opposed to extension writers) of
the Python interpreter have to worry about is the initialization, and possibly
the finalization, of the Python interpreter.  Most functionality of the
interpreter can only be used after the interpreter has been initialized.

@geindex Py_Initialize (C function)
@geindex module; builtins
@geindex module; __main__
@geindex module; sys
@geindex module; search; path
@geindex path (in module sys)

The basic initialization function is @ref{45e,,Py_Initialize()}. This initializes
the table of loaded modules, and creates the fundamental modules
@ref{13,,builtins}, @ref{1,,__main__}, and @ref{df,,sys}.  It also
initializes the module search path (@code{sys.path}).

@ref{45e,,Py_Initialize()} does not set the “script argument list”  (@code{sys.argv}).
If this variable is needed by Python code that will be executed later, setting
@ref{3ef,,PyConfig.argv} and @ref{1d35,,PyConfig.parse_argv} must be set: see
@ref{646,,Python Initialization Configuration}.

On most systems (in particular, on Unix and Windows, although the details are
slightly different), @ref{45e,,Py_Initialize()} calculates the module search path
based upon its best guess for the location of the standard Python interpreter
executable, assuming that the Python library is found in a fixed location
relative to the Python interpreter executable.  In particular, it looks for a
directory named @code{lib/python`X.Y'} relative to the parent directory
where the executable named @code{python} is found on the shell command search
path (the environment variable 
@geindex PATH
@geindex environment variable; PATH
@code{PATH}).

For instance, if the Python executable is found in
@code{/usr/local/bin/python}, it will assume that the libraries are in
@code{/usr/local/lib/python`X.Y'}.  (In fact, this particular path is also
the “fallback” location, used when no executable file named @code{python} is
found along 
@geindex PATH
@geindex environment variable; PATH
@code{PATH}.)  The user can override this behavior by setting the
environment variable 
@geindex PYTHONHOME
@geindex environment variable; PYTHONHOME
@ref{3ee,,PYTHONHOME}, or insert additional directories in
front of the standard path by setting 
@geindex PYTHONPATH
@geindex environment variable; PYTHONPATH
@ref{1223,,PYTHONPATH}.

@geindex Py_GetPath (C function)
@geindex Py_GetPrefix (C function)
@geindex Py_GetExecPrefix (C function)
@geindex Py_GetProgramFullPath (C function)

The embedding application can steer the search by setting
@ref{3f0,,PyConfig.program_name} `before' calling
@ref{3f4,,Py_InitializeFromConfig()}. Note that
@geindex PYTHONHOME
@geindex environment variable; PYTHONHOME
@ref{3ee,,PYTHONHOME} still overrides this and 
@geindex PYTHONPATH
@geindex environment variable; PYTHONPATH
@ref{1223,,PYTHONPATH} is still
inserted in front of the standard path.  An application that requires total
control has to provide its own implementation of @ref{3e1,,Py_GetPath()},
@ref{3e3,,Py_GetPrefix()}, @ref{3e7,,Py_GetExecPrefix()}, and
@ref{3ea,,Py_GetProgramFullPath()} (all defined in @code{Modules/getpath.c}).

@geindex Py_IsInitialized (C function)

Sometimes, it is desirable to “uninitialize” Python.  For instance,  the
application may want to start over (make another call to
@ref{45e,,Py_Initialize()}) or the application is simply done with its  use of
Python and wants to free memory allocated by Python.  This can be accomplished
by calling @ref{f17,,Py_FinalizeEx()}.  The function @ref{52b1,,Py_IsInitialized()} returns
true if Python is currently in the initialized state.  More information about
these functions is given in a later chapter. Notice that @code{Py_FinalizeEx()}
does `not' free all memory allocated by the Python interpreter, e.g. memory
allocated by extension modules currently cannot be released.

@node Debugging Builds,Recommended third party tools<2>,Embedding Python<2>,Introduction<14>
@anchor{c-api/intro api-debugging}@anchor{52b2}@anchor{c-api/intro debugging-builds}@anchor{52b3}
@subsection Debugging Builds


Python can be built with several macros to enable extra checks of the
interpreter and extension modules.  These checks tend to add a large amount of
overhead to the runtime so they are not enabled by default.

A full list of the various types of debugging builds is in the file
@code{Misc/SpecialBuilds.txt} in the Python source distribution. Builds are
available that support tracing of reference counts, debugging the memory
allocator, or low-level profiling of the main interpreter loop.  Only the most
frequently used builds will be described in the remainder of this section.

@geindex Py_DEBUG (C macro)
@anchor{c-api/intro c Py_DEBUG}@anchor{187e}
@deffn {C Macro} Py_DEBUG
@end deffn

Compiling the interpreter with the @code{Py_DEBUG} macro defined produces
what is generally meant by @ref{50a,,a debug build of Python}.
@code{Py_DEBUG} is enabled in the Unix build by adding
@ref{666,,--with-pydebug} to the @code{./configure} command.
It is also implied by the presence of the
not-Python-specific @code{_DEBUG} macro.  When @code{Py_DEBUG} is enabled
in the Unix build, compiler optimization is disabled.

In addition to the reference count debugging described below, extra checks are
performed, see @ref{50a,,Python Debug Build}.

Defining @code{Py_TRACE_REFS} enables reference tracing
(see the @ref{636,,configure --with-trace-refs option}).
When defined, a circular doubly linked list of active objects is maintained by adding two extra
fields to every @ref{5df,,PyObject}.  Total allocations are tracked as well.  Upon
exit, all existing references are printed.  (In interactive mode this happens
after every statement run by the interpreter.)

Please refer to @code{Misc/SpecialBuilds.txt} in the Python source distribution
for more detailed information.

@node Recommended third party tools<2>,,Debugging Builds,Introduction<14>
@anchor{c-api/intro c-api-tools}@anchor{51ee}@anchor{c-api/intro recommended-third-party-tools}@anchor{52b4}
@subsection Recommended third party tools


The following third party tools offer both simpler and more sophisticated
approaches to creating C, C++ and Rust extensions for Python:


@itemize *

@item 
Cython@footnote{https://cython.org/}

@item 
cffi@footnote{https://cffi.readthedocs.io}

@item 
HPy@footnote{https://hpyproject.org/}

@item 
nanobind@footnote{https://github.com/wjakob/nanobind} (C++)

@item 
Numba@footnote{https://numba.pydata.org/}

@item 
pybind11@footnote{https://pybind11.readthedocs.io/} (C++)

@item 
PyO3@footnote{https://pyo3.rs/} (Rust)

@item 
SWIG@footnote{https://www.swig.org}
@end itemize

Using tools such as these can help avoid writing code that is tightly bound to
a particular version of CPython, avoid reference counting errors, and focus
more on your own code than on using the CPython API. In general, new versions
of Python can be supported by updating the tool, and your code will often use
newer and more efficient APIs automatically. Some tools also support compiling
for other implementations of Python from a single set of sources.

These projects are not supported by the same people who maintain Python, and
issues need to be raised with the projects directly. Remember to check that the
project is still maintained and supported, as the list above may become
outdated.


@subsubheading See also



@table @asis

@item Python Packaging User Guide: Binary Extensions@footnote{https://packaging.python.org/guides/packaging-binary-extensions/}

The Python Packaging User Guide not only covers several available
tools that simplify the creation of binary extensions, but also
discusses the various reasons why creating an extension module may be
desirable in the first place.
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node C API Stability,The Very High Level Layer,Introduction<14>,Python/C API reference manual
@anchor{c-api/stable doc}@anchor{52b5}@anchor{c-api/stable c-api-stability}@anchor{52b6}@anchor{c-api/stable stable}@anchor{776}@anchor{c-api/stable translation-repo}@anchor{52b7}
@section C API Stability


Unless documented otherwise, Python’s C API is covered by the Backwards
Compatibility Policy, 
@geindex Python Enhancement Proposals; PEP 387
PEP 387@footnote{https://peps.python.org/pep-0387/}.
Most changes to it are source-compatible (typically by only adding new API).
Changing existing API or removing API is only done after a deprecation period
or to fix serious issues.

CPython’s Application Binary Interface (ABI) is forward- and
backwards-compatible across a minor release (if these are compiled the same
way; see @ref{52b8,,Platform Considerations} below).
So, code compiled for Python 3.10.0 will work on 3.10.8 and vice versa,
but will need to be compiled separately for 3.9.x and 3.11.x.

There are two tiers of C API with different stability expectations:


@itemize -

@item 
@ref{76a,,Unstable API}, may change in minor versions without
a deprecation period. It is marked by the @code{PyUnstable} prefix in names.

@item 
@ref{637,,Limited API}, is compatible across several minor releases.
When @ref{660,,Py_LIMITED_API} is defined, only this subset is exposed
from @code{Python.h}.
@end itemize

These are discussed in more detail below.

Names prefixed by an underscore, such as @code{_Py_InternalState},
are private API that can change without notice even in patch releases.
If you need to use this API, consider reaching out to
CPython developers@footnote{https://discuss.python.org/c/core-dev/c-api/30}
to discuss adding public API for your use case.

@menu
* Unstable C API:: 
* Stable Application Binary Interface:: 
* Platform Considerations:: 
* Contents of Limited API:: 

@end menu

@node Unstable C API,Stable Application Binary Interface,,C API Stability
@anchor{c-api/stable id1}@anchor{52b9}@anchor{c-api/stable unstable-c-api}@anchor{76a}
@subsection Unstable C API


@geindex PyUnstable

Any API named with the @code{PyUnstable} prefix exposes CPython implementation
details, and may change in every minor release (e.g. from 3.9 to 3.10) without
any deprecation warnings.
However, it will not change in a bugfix release (e.g. from 3.10.0 to 3.10.1).

It is generally intended for specialized, low-level tools like debuggers.

Projects that use this API are expected to follow
CPython development and spend extra effort adjusting to changes.

@node Stable Application Binary Interface,Platform Considerations,Unstable C API,C API Stability
@anchor{c-api/stable id2}@anchor{52ba}@anchor{c-api/stable stable-application-binary-interface}@anchor{5267}
@subsection Stable Application Binary Interface


For simplicity, this document talks about `extensions', but the Limited API
and Stable ABI work the same way for all uses of the API – for example,
embedding Python.

@menu
* Limited C API:: 
* Stable ABI:: 
* Limited API Scope and Performance:: 
* Limited API Caveats:: 

@end menu

@node Limited C API,Stable ABI,,Stable Application Binary Interface
@anchor{c-api/stable id3}@anchor{52bb}@anchor{c-api/stable limited-c-api}@anchor{637}
@subsubsection Limited C API


Python 3.2 introduced the `Limited API', a subset of Python’s C API.
Extensions that only use the Limited API can be
compiled once and be loaded on multiple versions of Python.
Contents of the Limited API are @ref{9a2,,listed below}.

@geindex Py_LIMITED_API (C macro)
@anchor{c-api/stable c Py_LIMITED_API}@anchor{660}
@deffn {C Macro} Py_LIMITED_API

Define this macro before including @code{Python.h} to opt in to only use
the Limited API, and to select the Limited API version.

Define @code{Py_LIMITED_API} to the value of @ref{380,,PY_VERSION_HEX}
corresponding to the lowest Python version your extension supports.
The extension will be ABI-compatible with all Python 3 releases
from the specified one onward, and can use Limited API introduced up to that
version.

Rather than using the @code{PY_VERSION_HEX} macro directly, hardcode a minimum
minor version (e.g. @code{0x030A0000} for Python 3.10) for stability when
compiling with future Python versions.

You can also define @code{Py_LIMITED_API} to @code{3}. This works the same as
@code{0x03020000} (Python 3.2, the version that introduced Limited API).
@end deffn

@node Stable ABI,Limited API Scope and Performance,Limited C API,Stable Application Binary Interface
@anchor{c-api/stable id4}@anchor{52bc}@anchor{c-api/stable stable-abi}@anchor{52bd}
@subsubsection Stable ABI


To enable this, Python provides a `Stable ABI': a set of symbols that will
remain ABI-compatible across Python 3.x versions.

@cartouche
@quotation Note 
The Stable ABI prevents ABI issues, like linker errors due to missing
symbols or data corruption due to changes in structure layouts or function
signatures.
However, other changes in Python can change the `behavior' of extensions.
See Python’s Backwards Compatibility Policy (
@geindex Python Enhancement Proposals; PEP 387
PEP 387@footnote{https://peps.python.org/pep-0387/}) for details.
@end quotation
@end cartouche

The Stable ABI contains symbols exposed in the @ref{637,,Limited API}, but also other ones – for example, functions necessary to
support older versions of the Limited API.

On Windows, extensions that use the Stable ABI should be linked against
@code{python3.dll} rather than a version-specific library such as
@code{python39.dll}.

On some platforms, Python will look for and load shared library files named
with the @code{abi3} tag (e.g. @code{mymodule.abi3.so}).
It does not check if such extensions conform to a Stable ABI.
The user (or their packaging tools) need to ensure that, for example,
extensions built with the 3.10+ Limited API are not installed for lower
versions of Python.

All functions in the Stable ABI are present as functions in Python’s shared
library, not solely as macros. This makes them usable from languages that don’t
use the C preprocessor.

@node Limited API Scope and Performance,Limited API Caveats,Stable ABI,Stable Application Binary Interface
@anchor{c-api/stable limited-api-scope-and-performance}@anchor{52be}
@subsubsection Limited API Scope and Performance


The goal for the Limited API is to allow everything that is possible with the
full C API, but possibly with a performance penalty.

For example, while @ref{5ff,,PyList_GetItem()} is available, its “unsafe” macro
variant @ref{52bf,,PyList_GET_ITEM()} is not.
The macro can be faster because it can rely on version-specific implementation
details of the list object.

Without @code{Py_LIMITED_API} defined, some C API functions are inlined or
replaced by macros.
Defining @code{Py_LIMITED_API} disables this inlining, allowing stability as
Python’s data structures are improved, but possibly reducing performance.

By leaving out the @code{Py_LIMITED_API} definition, it is possible to compile
a Limited API extension with a version-specific ABI. This can improve
performance for that Python version, but will limit compatibility.
Compiling with @code{Py_LIMITED_API} will then yield an extension that can be
distributed where a version-specific one is not available – for example,
for prereleases of an upcoming Python version.

@node Limited API Caveats,,Limited API Scope and Performance,Stable Application Binary Interface
@anchor{c-api/stable limited-api-caveats}@anchor{52c0}
@subsubsection Limited API Caveats


Note that compiling with @code{Py_LIMITED_API} is `not' a complete guarantee that
code conforms to the @ref{637,,Limited API} or the @ref{52bd,,Stable ABI}. @code{Py_LIMITED_API} only covers definitions, but an API also
includes other issues, such as expected semantics.

One issue that @code{Py_LIMITED_API} does not guard against is calling a function
with arguments that are invalid in a lower Python version.
For example, consider a function that starts accepting @code{NULL} for an
argument. In Python 3.9, @code{NULL} now selects a default behavior, but in
Python 3.8, the argument will be used directly, causing a @code{NULL} dereference
and crash. A similar argument works for fields of structs.

Another issue is that some struct fields are currently not hidden when
@code{Py_LIMITED_API} is defined, even though they’re part of the Limited API.

For these reasons, we recommend testing an extension with `all' minor Python
versions it supports, and preferably to build with the `lowest' such version.

We also recommend reviewing documentation of all used API to check
if it is explicitly part of the Limited API. Even with @code{Py_LIMITED_API}
defined, a few private declarations are exposed for technical reasons (or
even unintentionally, as bugs).

Also note that the Limited API is not necessarily stable: compiling with
@code{Py_LIMITED_API} with Python 3.8 means that the extension will
run with Python 3.12, but it will not necessarily `compile' with Python 3.12.
In particular, parts of the Limited API may be deprecated and removed,
provided that the Stable ABI stays stable.

@node Platform Considerations,Contents of Limited API,Stable Application Binary Interface,C API Stability
@anchor{c-api/stable platform-considerations}@anchor{52c1}@anchor{c-api/stable stable-abi-platform}@anchor{52b8}
@subsection Platform Considerations


ABI stability depends not only on Python, but also on the compiler used,
lower-level libraries and compiler options. For the purposes of
the @ref{52bd,,Stable ABI}, these details define a “platform”. They
usually depend on the OS type and processor architecture

It is the responsibility of each particular distributor of Python
to ensure that all Python versions on a particular platform are built
in a way that does not break the Stable ABI.
This is the case with Windows and macOS releases from @code{python.org} and many
third-party distributors.

@node Contents of Limited API,,Platform Considerations,C API Stability
@anchor{c-api/stable contents-of-limited-api}@anchor{52c2}@anchor{c-api/stable limited-api-list}@anchor{9a2}
@subsection Contents of Limited API


Currently, the @ref{637,,Limited API} includes the following items:



@itemize *

@item 
@ref{16e1,,METH_CLASS}

@item 
@ref{1683,,METH_COEXIST}

@item 
@ref{19e1,,METH_FASTCALL}

@item 
@ref{b6e,,METH_METHOD}

@item 
@ref{16e0,,METH_NOARGS}

@item 
@ref{1713,,METH_O}

@item 
@ref{16e2,,METH_STATIC}

@item 
@ref{1714,,METH_VARARGS}

@item 
@ref{781,,PY_VECTORCALL_ARGUMENTS_OFFSET}

@item 
@ref{52c3,,PyAIter_Check()}

@item 
@ref{1858,,PyArg_Parse()}

@item 
@ref{3bf,,PyArg_ParseTuple()}

@item 
@ref{624,,PyArg_ParseTupleAndKeywords()}

@item 
@ref{1712,,PyArg_UnpackTuple()}

@item 
@ref{52c4,,PyArg_VaParse()}

@item 
@ref{625,,PyArg_VaParseTupleAndKeywords()}

@item 
@ref{52c5,,PyArg_ValidateKeywordArguments()}

@item 
@ref{52c6,,PyBUF_ANY_CONTIGUOUS}

@item 
@ref{52c7,,PyBUF_CONTIG}

@item 
@ref{52c8,,PyBUF_CONTIG_RO}

@item 
@ref{15c2,,PyBUF_C_CONTIGUOUS}

@item 
@ref{52c9,,PyBUF_FORMAT}

@item 
@ref{52ca,,PyBUF_FULL}

@item 
@ref{52cb,,PyBUF_FULL_RO}

@item 
@ref{15c3,,PyBUF_F_CONTIGUOUS}

@item 
@ref{52cc,,PyBUF_INDIRECT}

@item 
@ref{52cd,,PyBUF_MAX_NDIM}

@item 
@ref{52ce,,PyBUF_ND}

@item 
@ref{1a52,,PyBUF_READ}

@item 
@ref{52cf,,PyBUF_RECORDS}

@item 
@ref{52d0,,PyBUF_RECORDS_RO}

@item 
@ref{52d1,,PyBUF_SIMPLE}

@item 
@ref{52d2,,PyBUF_STRIDED}

@item 
@ref{52d3,,PyBUF_STRIDED_RO}

@item 
@ref{52d4,,PyBUF_STRIDES}

@item 
@ref{15c1,,PyBUF_WRITABLE}

@item 
@ref{1a53,,PyBUF_WRITE}

@item 
@ref{52d5,,PyBaseObject_Type}

@item 
@ref{52d6,,PyBool_FromLong()}

@item 
@ref{52d7,,PyBool_Type}

@item 
@ref{968,,PyBuffer_FillContiguousStrides()}

@item 
@ref{969,,PyBuffer_FillInfo()}

@item 
@ref{965,,PyBuffer_FromContiguous()}

@item 
@ref{962,,PyBuffer_GetPointer()}

@item 
@ref{967,,PyBuffer_IsContiguous()}

@item 
@ref{63b,,PyBuffer_Release()}

@item 
@ref{963,,PyBuffer_SizeFromFormat()}

@item 
@ref{964,,PyBuffer_ToContiguous()}

@item 
@ref{52d8,,PyByteArrayIter_Type}

@item 
@ref{52d9,,PyByteArray_AsString()}

@item 
@ref{52da,,PyByteArray_Concat()}

@item 
@ref{15b4,,PyByteArray_FromObject()}

@item 
@ref{15b5,,PyByteArray_FromStringAndSize()}

@item 
@ref{52db,,PyByteArray_Resize()}

@item 
@ref{52dc,,PyByteArray_Size()}

@item 
@ref{52dd,,PyByteArray_Type}

@item 
@ref{52de,,PyBytesIter_Type}

@item 
@ref{a8d,,PyBytes_AsString()}

@item 
@ref{52df,,PyBytes_AsStringAndSize()}

@item 
@ref{52e0,,PyBytes_Concat()}

@item 
@ref{52e1,,PyBytes_ConcatAndDel()}

@item 
@ref{52e2,,PyBytes_DecodeEscape()}

@item 
@ref{1e4e,,PyBytes_FromFormat()}

@item 
@ref{52e3,,PyBytes_FromFormatV()}

@item 
@ref{52e4,,PyBytes_FromObject()}

@item 
@ref{52e5,,PyBytes_FromString()}

@item 
@ref{15ac,,PyBytes_FromStringAndSize()}

@item 
@ref{52e6,,PyBytes_Repr()}

@item 
@ref{52e7,,PyBytes_Size()}

@item 
@ref{52e8,,PyBytes_Type}

@item 
@ref{1684,,PyCFunction}

@item 
@ref{52e9,,PyCFunctionFast}

@item 
@ref{52ea,,PyCFunctionFastWithKeywords}

@item 
@ref{52eb,,PyCFunctionWithKeywords}

@item 
@ref{52ec,,PyCFunction_GetFlags()}

@item 
@ref{52ed,,PyCFunction_GetFunction()}

@item 
@ref{52ee,,PyCFunction_GetSelf()}

@item 
@ref{1cf2,,PyCFunction_New()}

@item 
@ref{1dba,,PyCFunction_NewEx()}

@item 
@ref{52ef,,PyCFunction_Type}

@item 
@ref{1cec,,PyCMethod_New()}

@item 
@ref{52f0,,PyCallIter_New()}

@item 
@ref{52f1,,PyCallIter_Type}

@item 
@ref{52f2,,PyCallable_Check()}

@item 
@ref{52f3,,PyCapsule_Destructor}

@item 
@ref{52f4,,PyCapsule_GetContext()}

@item 
@ref{52f5,,PyCapsule_GetDestructor()}

@item 
@ref{52f6,,PyCapsule_GetName()}

@item 
@ref{52f7,,PyCapsule_GetPointer()}

@item 
@ref{1c53,,PyCapsule_Import()}

@item 
@ref{1568,,PyCapsule_IsValid()}

@item 
@ref{5223,,PyCapsule_New()}

@item 
@ref{52f8,,PyCapsule_SetContext()}

@item 
@ref{52f9,,PyCapsule_SetDestructor()}

@item 
@ref{52fa,,PyCapsule_SetName()}

@item 
@ref{52fb,,PyCapsule_SetPointer()}

@item 
@ref{52fc,,PyCapsule_Type}

@item 
@ref{52fd,,PyClassMethodDescr_Type}

@item 
@ref{52fe,,PyCodec_BackslashReplaceErrors()}

@item 
@ref{3df,,PyCodec_Decode()}

@item 
@ref{52ff,,PyCodec_Decoder()}

@item 
@ref{3e0,,PyCodec_Encode()}

@item 
@ref{5300,,PyCodec_Encoder()}

@item 
@ref{5301,,PyCodec_IgnoreErrors()}

@item 
@ref{5302,,PyCodec_IncrementalDecoder()}

@item 
@ref{5303,,PyCodec_IncrementalEncoder()}

@item 
@ref{5304,,PyCodec_KnownEncoding()}

@item 
@ref{5305,,PyCodec_LookupError()}

@item 
@ref{10b5,,PyCodec_NameReplaceErrors()}

@item 
@ref{5306,,PyCodec_Register()}

@item 
@ref{5307,,PyCodec_RegisterError()}

@item 
@ref{5308,,PyCodec_ReplaceErrors()}

@item 
@ref{5309,,PyCodec_StreamReader()}

@item 
@ref{530a,,PyCodec_StreamWriter()}

@item 
@ref{530b,,PyCodec_StrictErrors()}

@item 
@ref{a9d,,PyCodec_Unregister()}

@item 
@ref{530c,,PyCodec_XMLCharRefReplaceErrors()}

@item 
@ref{530d,,PyComplex_FromDoubles()}

@item 
@ref{1a5a,,PyComplex_ImagAsDouble()}

@item 
@ref{1a59,,PyComplex_RealAsDouble()}

@item 
@ref{530e,,PyComplex_Type}

@item 
@ref{530f,,PyDescr_NewClassMethod()}

@item 
@ref{5310,,PyDescr_NewGetSet()}

@item 
@ref{5311,,PyDescr_NewMember()}

@item 
@ref{1db9,,PyDescr_NewMethod()}

@item 
@ref{5312,,PyDictItems_Type}

@item 
@ref{5313,,PyDictIterItem_Type}

@item 
@ref{5314,,PyDictIterKey_Type}

@item 
@ref{5315,,PyDictIterValue_Type}

@item 
@ref{5316,,PyDictKeys_Type}

@item 
@ref{5317,,PyDictProxy_New()}

@item 
@ref{5318,,PyDictProxy_Type}

@item 
@ref{5319,,PyDictRevIterItem_Type}

@item 
@ref{531a,,PyDictRevIterKey_Type}

@item 
@ref{531b,,PyDictRevIterValue_Type}

@item 
@ref{531c,,PyDictValues_Type}

@item 
@ref{531d,,PyDict_Clear()}

@item 
@ref{5de,,PyDict_Contains()}

@item 
@ref{662,,PyDict_Copy()}

@item 
@ref{531e,,PyDict_DelItem()}

@item 
@ref{531f,,PyDict_DelItemString()}

@item 
@ref{628,,PyDict_GetItem()}

@item 
@ref{5e0,,PyDict_GetItemRef()}

@item 
@ref{629,,PyDict_GetItemString()}

@item 
@ref{41f,,PyDict_GetItemStringRef()}

@item 
@ref{5e1,,PyDict_GetItemWithError()}

@item 
@ref{5320,,PyDict_Items()}

@item 
@ref{5321,,PyDict_Keys()}

@item 
@ref{5322,,PyDict_Merge()}

@item 
@ref{5323,,PyDict_MergeFromSeq2()}

@item 
@ref{5324,,PyDict_New()}

@item 
@ref{19d2,,PyDict_Next()}

@item 
@ref{5219,,PyDict_SetItem()}

@item 
@ref{19d0,,PyDict_SetItemString()}

@item 
@ref{5325,,PyDict_Size()}

@item 
@ref{5326,,PyDict_Type}

@item 
@ref{5327,,PyDict_Update()}

@item 
@ref{5328,,PyDict_Values()}

@item 
@ref{5329,,PyEllipsis_Type}

@item 
@ref{532a,,PyEnum_Type}

@item 
@ref{532b,,PyErr_BadArgument()}

@item 
@ref{532c,,PyErr_BadInternalCall()}

@item 
@ref{694,,PyErr_CheckSignals()}

@item 
@ref{1237,,PyErr_Clear()}

@item 
@code{PyErr_Display()}

@item 
@ref{433,,PyErr_DisplayException()}

@item 
@ref{52ae,,PyErr_ExceptionMatches()}

@item 
@ref{426,,PyErr_Fetch()}

@item 
@ref{10b7,,PyErr_Format()}

@item 
@ref{10b6,,PyErr_FormatV()}

@item 
@ref{97b,,PyErr_GetExcInfo()}

@item 
@ref{978,,PyErr_GetHandledException()}

@item 
@ref{427,,PyErr_GetRaisedException()}

@item 
@ref{532d,,PyErr_GivenExceptionMatches()}

@item 
@ref{1475,,PyErr_NewException()}

@item 
@ref{1474,,PyErr_NewExceptionWithDoc()}

@item 
@ref{51f9,,PyErr_NoMemory()}

@item 
@ref{428,,PyErr_NormalizeException()}

@item 
@ref{1cf0,,PyErr_Occurred()}

@item 
@ref{1d70,,PyErr_Print()}

@item 
@ref{532e,,PyErr_PrintEx()}

@item 
@ref{532f,,PyErr_ProgramText()}

@item 
@ref{f19,,PyErr_ResourceWarning()}

@item 
@ref{429,,PyErr_Restore()}

@item 
@ref{5330,,PyErr_SetExcFromWindowsErr()}

@item 
@ref{1acc,,PyErr_SetExcFromWindowsErrWithFilename()}

@item 
@ref{5331,,PyErr_SetExcFromWindowsErrWithFilenameObject()}

@item 
@ref{5332,,PyErr_SetExcFromWindowsErrWithFilenameObjects()}

@item 
@ref{97a,,PyErr_SetExcInfo()}

@item 
@ref{51f8,,PyErr_SetFromErrno()}

@item 
@ref{1acb,,PyErr_SetFromErrnoWithFilename()}

@item 
@ref{5333,,PyErr_SetFromErrnoWithFilenameObject()}

@item 
@ref{5334,,PyErr_SetFromErrnoWithFilenameObjects()}

@item 
@ref{5335,,PyErr_SetFromWindowsErr()}

@item 
@ref{1acd,,PyErr_SetFromWindowsErrWithFilename()}

@item 
@ref{979,,PyErr_SetHandledException()}

@item 
@ref{f3f,,PyErr_SetImportError()}

@item 
@ref{f18,,PyErr_SetImportErrorSubclass()}

@item 
@ref{5336,,PyErr_SetInterrupt()}

@item 
@ref{aa4,,PyErr_SetInterruptEx()}

@item 
@ref{5337,,PyErr_SetNone()}

@item 
@ref{79c,,PyErr_SetObject()}

@item 
@ref{42a,,PyErr_SetRaisedException()}

@item 
@ref{79d,,PyErr_SetString()}

@item 
@ref{5338,,PyErr_SyntaxLocation()}

@item 
@ref{5339,,PyErr_SyntaxLocationEx()}

@item 
@ref{1658,,PyErr_WarnEx()}

@item 
@ref{1ad3,,PyErr_WarnExplicit()}

@item 
@ref{533a,,PyErr_WarnFormat()}

@item 
@ref{5f2,,PyErr_WriteUnraisable()}

@item 
@ref{649,,PyEval_AcquireThread()}

@item 
@ref{a8c,,PyEval_EvalCode()}

@item 
@ref{1b1e,,PyEval_EvalCodeEx()}

@item 
@ref{533b,,PyEval_EvalFrame()}

@item 
@ref{1234,,PyEval_EvalFrameEx()}

@item 
@ref{5f4,,PyEval_GetBuiltins()}

@item 
@ref{1b7d,,PyEval_GetFrame()}

@item 
@ref{5f3,,PyEval_GetFrameBuiltins()}

@item 
@ref{5f5,,PyEval_GetFrameGlobals()}

@item 
@ref{5f7,,PyEval_GetFrameLocals()}

@item 
@ref{533c,,PyEval_GetFuncDesc()}

@item 
@ref{533d,,PyEval_GetFuncName()}

@item 
@ref{5f6,,PyEval_GetGlobals()}

@item 
@ref{5f8,,PyEval_GetLocals()}

@item 
@ref{19fb,,PyEval_InitThreads()}

@item 
@ref{533e,,PyEval_ReleaseThread()}

@item 
@ref{648,,PyEval_RestoreThread()}

@item 
@ref{647,,PyEval_SaveThread()}

@item 
@ref{533f,,PyExc_ArithmeticError}

@item 
@ref{5340,,PyExc_AssertionError}

@item 
@ref{5341,,PyExc_AttributeError}

@item 
@ref{5342,,PyExc_BaseException}

@item 
@ref{5343,,PyExc_BaseExceptionGroup}

@item 
@ref{5344,,PyExc_BlockingIOError}

@item 
@ref{5345,,PyExc_BrokenPipeError}

@item 
@ref{5346,,PyExc_BufferError}

@item 
@ref{5347,,PyExc_BytesWarning}

@item 
@ref{5348,,PyExc_ChildProcessError}

@item 
@ref{5349,,PyExc_ConnectionAbortedError}

@item 
@ref{534a,,PyExc_ConnectionError}

@item 
@ref{534b,,PyExc_ConnectionRefusedError}

@item 
@ref{534c,,PyExc_ConnectionResetError}

@item 
@ref{534d,,PyExc_DeprecationWarning}

@item 
@ref{534e,,PyExc_EOFError}

@item 
@ref{534f,,PyExc_EncodingWarning}

@item 
@ref{5350,,PyExc_EnvironmentError}

@item 
@ref{5351,,PyExc_Exception}

@item 
@ref{5352,,PyExc_FileExistsError}

@item 
@ref{5353,,PyExc_FileNotFoundError}

@item 
@ref{5354,,PyExc_FloatingPointError}

@item 
@ref{5355,,PyExc_FutureWarning}

@item 
@ref{5356,,PyExc_GeneratorExit}

@item 
@ref{5357,,PyExc_IOError}

@item 
@ref{5358,,PyExc_ImportError}

@item 
@ref{5359,,PyExc_ImportWarning}

@item 
@ref{535a,,PyExc_IndentationError}

@item 
@ref{535b,,PyExc_IndexError}

@item 
@ref{535c,,PyExc_InterruptedError}

@item 
@ref{535d,,PyExc_IsADirectoryError}

@item 
@ref{535e,,PyExc_KeyError}

@item 
@ref{535f,,PyExc_KeyboardInterrupt}

@item 
@ref{5360,,PyExc_LookupError}

@item 
@ref{5361,,PyExc_MemoryError}

@item 
@ref{5362,,PyExc_ModuleNotFoundError}

@item 
@ref{5363,,PyExc_NameError}

@item 
@ref{5364,,PyExc_NotADirectoryError}

@item 
@ref{5365,,PyExc_NotImplementedError}

@item 
@ref{51fb,,PyExc_OSError}

@item 
@ref{5366,,PyExc_OverflowError}

@item 
@ref{5367,,PyExc_PendingDeprecationWarning}

@item 
@ref{5368,,PyExc_PermissionError}

@item 
@ref{5369,,PyExc_ProcessLookupError}

@item 
@ref{10b8,,PyExc_RecursionError}

@item 
@ref{536a,,PyExc_ReferenceError}

@item 
@ref{536b,,PyExc_ResourceWarning}

@item 
@ref{536c,,PyExc_RuntimeError}

@item 
@ref{536d,,PyExc_RuntimeWarning}

@item 
@ref{536e,,PyExc_StopAsyncIteration}

@item 
@ref{536f,,PyExc_StopIteration}

@item 
@ref{5370,,PyExc_SyntaxError}

@item 
@ref{5371,,PyExc_SyntaxWarning}

@item 
@ref{5372,,PyExc_SystemError}

@item 
@ref{5373,,PyExc_SystemExit}

@item 
@ref{5374,,PyExc_TabError}

@item 
@ref{5375,,PyExc_TimeoutError}

@item 
@ref{51fa,,PyExc_TypeError}

@item 
@ref{5376,,PyExc_UnboundLocalError}

@item 
@ref{5377,,PyExc_UnicodeDecodeError}

@item 
@ref{5378,,PyExc_UnicodeEncodeError}

@item 
@ref{5379,,PyExc_UnicodeError}

@item 
@ref{537a,,PyExc_UnicodeTranslateError}

@item 
@ref{537b,,PyExc_UnicodeWarning}

@item 
@ref{537c,,PyExc_UserWarning}

@item 
@ref{51fc,,PyExc_ValueError}

@item 
@ref{537d,,PyExc_Warning}

@item 
@ref{537e,,PyExc_WindowsError}

@item 
@ref{51f7,,PyExc_ZeroDivisionError}

@item 
@ref{c61,,PyExceptionClass_Name()}

@item 
@ref{78c,,PyException_GetArgs()}

@item 
@ref{537f,,PyException_GetCause()}

@item 
@ref{5380,,PyException_GetContext()}

@item 
@ref{5381,,PyException_GetTraceback()}

@item 
@ref{78d,,PyException_SetArgs()}

@item 
@ref{5382,,PyException_SetCause()}

@item 
@ref{5383,,PyException_SetContext()}

@item 
@ref{1e10,,PyException_SetTraceback()}

@item 
@ref{5384,,PyFile_FromFd()}

@item 
@ref{5385,,PyFile_GetLine()}

@item 
@ref{5386,,PyFile_WriteObject()}

@item 
@ref{5387,,PyFile_WriteString()}

@item 
@ref{5388,,PyFilter_Type}

@item 
@ref{c65,,PyFloat_AsDouble()}

@item 
@ref{5389,,PyFloat_FromDouble()}

@item 
@ref{538a,,PyFloat_FromString()}

@item 
@ref{15fc,,PyFloat_GetInfo()}

@item 
@ref{15fa,,PyFloat_GetMax()}

@item 
@ref{15fb,,PyFloat_GetMin()}

@item 
@ref{538b,,PyFloat_Type}

@item 
@ref{991,,PyFrameObject}

@item 
@ref{992,,PyFrame_GetCode()}

@item 
@ref{993,,PyFrame_GetLineNumber()}

@item 
@ref{1651,,PyFrozenSet_New()}

@item 
@ref{538c,,PyFrozenSet_Type}

@item 
@ref{b8b,,PyGC_Collect()}

@item 
@ref{aab,,PyGC_Disable()}

@item 
@ref{aaa,,PyGC_Enable()}

@item 
@ref{aac,,PyGC_IsEnabled()}

@item 
@ref{64a,,PyGILState_Ensure()}

@item 
@ref{538d,,PyGILState_GetThisThreadState()}

@item 
@ref{64b,,PyGILState_Release()}

@item 
@ref{538e,,PyGILState_STATE}

@item 
@ref{db8,,PyGetSetDef}

@item 
@ref{538f,,PyGetSetDescr_Type}

@item 
@ref{5fc,,PyImport_AddModule()}

@item 
@ref{5390,,PyImport_AddModuleObject()}

@item 
@ref{5fb,,PyImport_AddModuleRef()}

@item 
@ref{1b60,,PyImport_AppendInittab()}

@item 
@ref{5391,,PyImport_ExecCodeModule()}

@item 
@ref{5392,,PyImport_ExecCodeModuleEx()}

@item 
@ref{5393,,PyImport_ExecCodeModuleObject()}

@item 
@ref{5394,,PyImport_ExecCodeModuleWithPathnames()}

@item 
@ref{1aca,,PyImport_GetImporter()}

@item 
@ref{13af,,PyImport_GetMagicNumber()}

@item 
@ref{5395,,PyImport_GetMagicTag()}

@item 
@ref{db2,,PyImport_GetModule()}

@item 
@ref{5396,,PyImport_GetModuleDict()}

@item 
@ref{1608,,PyImport_Import()}

@item 
@ref{5397,,PyImport_ImportFrozenModule()}

@item 
@ref{5398,,PyImport_ImportFrozenModuleObject()}

@item 
@ref{3da,,PyImport_ImportModule()}

@item 
@ref{13b0,,PyImport_ImportModuleLevel()}

@item 
@ref{5399,,PyImport_ImportModuleLevelObject()}

@item 
@ref{3d9,,PyImport_ImportModuleNoBlock()}

@item 
@ref{539a,,PyImport_ReloadModule()}

@item 
@ref{b87,,PyIndex_Check()}

@item 
@ref{ac0,,PyInterpreterState}

@item 
@ref{4ab3,,PyInterpreterState_Clear()}

@item 
@ref{539b,,PyInterpreterState_Delete()}

@item 
@ref{64c,,PyInterpreterState_Get()}

@item 
@ref{539c,,PyInterpreterState_GetDict()}

@item 
@ref{dc5,,PyInterpreterState_GetID()}

@item 
@ref{4ab4,,PyInterpreterState_New()}

@item 
@ref{1cf3,,PyIter_Check()}

@item 
@ref{397,,PyIter_Next()}

@item 
@ref{396,,PyIter_NextItem()}

@item 
@ref{a9e,,PyIter_Send()}

@item 
@ref{539d,,PyListIter_Type}

@item 
@ref{539e,,PyListRevIter_Type}

@item 
@ref{539f,,PyList_Append()}

@item 
@ref{53a0,,PyList_AsTuple()}

@item 
@ref{5ff,,PyList_GetItem()}

@item 
@ref{5fe,,PyList_GetItemRef()}

@item 
@ref{53a1,,PyList_GetSlice()}

@item 
@ref{18ff,,PyList_Insert()}

@item 
@ref{52a9,,PyList_New()}

@item 
@ref{53a2,,PyList_Reverse()}

@item 
@ref{1900,,PyList_SetItem()}

@item 
@ref{53a3,,PyList_SetSlice()}

@item 
@ref{1626,,PyList_Size()}

@item 
@ref{53a4,,PyList_Sort()}

@item 
@ref{523b,,PyList_Type}

@item 
@ref{39c,,PyLongObject}

@item 
@ref{53a5,,PyLongRangeIter_Type}

@item 
@ref{19b9,,PyLong_AsDouble()}

@item 
@ref{604,,PyLong_AsInt()}

@item 
@ref{39d,,PyLong_AsInt32()}

@item 
@ref{39e,,PyLong_AsInt64()}

@item 
@ref{605,,PyLong_AsLong()}

@item 
@ref{1472,,PyLong_AsLongAndOverflow()}

@item 
@ref{53a6,,PyLong_AsLongLong()}

@item 
@ref{1471,,PyLong_AsLongLongAndOverflow()}

@item 
@ref{606,,PyLong_AsNativeBytes()}

@item 
@ref{53a7,,PyLong_AsSize_t()}

@item 
@ref{53a8,,PyLong_AsSsize_t()}

@item 
@ref{39f,,PyLong_AsUInt32()}

@item 
@ref{3a0,,PyLong_AsUInt64()}

@item 
@ref{53a9,,PyLong_AsUnsignedLong()}

@item 
@ref{14a0,,PyLong_AsUnsignedLongLong()}

@item 
@ref{1e0c,,PyLong_AsUnsignedLongLongMask()}

@item 
@ref{53aa,,PyLong_AsUnsignedLongMask()}

@item 
@ref{53ab,,PyLong_AsVoidPtr()}

@item 
@ref{b42,,PyLong_FromDouble()}

@item 
@ref{3a1,,PyLong_FromInt32()}

@item 
@ref{3a2,,PyLong_FromInt64()}

@item 
@ref{1c13,,PyLong_FromLong()}

@item 
@ref{1c14,,PyLong_FromLongLong()}

@item 
@ref{607,,PyLong_FromNativeBytes()}

@item 
@ref{1905,,PyLong_FromSize_t()}

@item 
@ref{18e5,,PyLong_FromSsize_t()}

@item 
@ref{53ac,,PyLong_FromString()}

@item 
@ref{3a3,,PyLong_FromUInt32()}

@item 
@ref{3a4,,PyLong_FromUInt64()}

@item 
@ref{1903,,PyLong_FromUnsignedLong()}

@item 
@ref{1904,,PyLong_FromUnsignedLongLong()}

@item 
@ref{608,,PyLong_FromUnsignedNativeBytes()}

@item 
@ref{53ad,,PyLong_FromVoidPtr()}

@item 
@ref{53ae,,PyLong_GetInfo()}

@item 
@ref{53af,,PyLong_Type}

@item 
@ref{53b0,,PyMap_Type}

@item 
@ref{53b1,,PyMapping_Check()}

@item 
@ref{5eb,,PyMapping_GetItemString()}

@item 
@ref{5e8,,PyMapping_GetOptionalItem()}

@item 
@ref{5e9,,PyMapping_GetOptionalItemString()}

@item 
@ref{620,,PyMapping_HasKey()}

@item 
@ref{622,,PyMapping_HasKeyString()}

@item 
@ref{621,,PyMapping_HasKeyStringWithError()}

@item 
@ref{61f,,PyMapping_HasKeyWithError()}

@item 
@ref{dbd,,PyMapping_Items()}

@item 
@ref{dbb,,PyMapping_Keys()}

@item 
@ref{53b2,,PyMapping_Length()}

@item 
@ref{53b3,,PyMapping_SetItemString()}

@item 
@ref{1e79,,PyMapping_Size()}

@item 
@ref{dbc,,PyMapping_Values()}

@item 
@ref{10b3,,PyMem_Calloc()}

@item 
@ref{164e,,PyMem_Free()}

@item 
@ref{e66,,PyMem_Malloc()}

@item 
@ref{632,,PyMem_RawCalloc()}

@item 
@ref{634,,PyMem_RawFree()}

@item 
@ref{631,,PyMem_RawMalloc()}

@item 
@ref{633,,PyMem_RawRealloc()}

@item 
@ref{1238,,PyMem_Realloc()}

@item 
@ref{772,,PyMemberDef}

@item 
@ref{53b4,,PyMemberDescr_Type}

@item 
@ref{7ab,,PyMember_GetOne()}

@item 
@ref{7ac,,PyMember_SetOne()}

@item 
@ref{96a,,PyMemoryView_FromBuffer()}

@item 
@ref{137c,,PyMemoryView_FromMemory()}

@item 
@ref{53b5,,PyMemoryView_FromObject()}

@item 
@ref{53b6,,PyMemoryView_GetContiguous()}

@item 
@ref{53b7,,PyMemoryView_Type}

@item 
@ref{16e3,,PyMethodDef}

@item 
@ref{53b8,,PyMethodDescr_Type}

@item 
@ref{b7a,,PyModuleDef}

@item 
@code{PyModuleDef_Base}

@item 
@ref{5203,,PyModuleDef_Init()}

@item 
@ref{53b9,,PyModuleDef_Slot}

@item 
@ref{53ba,,PyModuleDef_Type}

@item 
@ref{609,,PyModule_Add()}

@item 
@ref{53bb,,PyModule_AddFunctions()}

@item 
@ref{1748,,PyModule_AddIntConstant()}

@item 
@ref{60b,,PyModule_AddObject()}

@item 
@ref{60a,,PyModule_AddObjectRef()}

@item 
@ref{1749,,PyModule_AddStringConstant()}

@item 
@ref{b72,,PyModule_AddType()}

@item 
@ref{53bc,,PyModule_Create2()}

@item 
@ref{10bb,,PyModule_ExecDef()}

@item 
@ref{10ba,,PyModule_FromDefAndSpec2()}

@item 
@ref{53bd,,PyModule_GetDef()}

@item 
@ref{53be,,PyModule_GetDict()}

@item 
@ref{42b,,PyModule_GetFilename()}

@item 
@ref{42c,,PyModule_GetFilenameObject()}

@item 
@ref{53bf,,PyModule_GetName()}

@item 
@ref{53c0,,PyModule_GetNameObject()}

@item 
@ref{b7d,,PyModule_GetState()}

@item 
@ref{53c1,,PyModule_New()}

@item 
@ref{53c2,,PyModule_NewObject()}

@item 
@ref{53c3,,PyModule_SetDocString()}

@item 
@ref{53c4,,PyModule_Type}

@item 
@ref{53c5,,PyNumber_Absolute()}

@item 
@ref{53c6,,PyNumber_Add()}

@item 
@ref{53c7,,PyNumber_And()}

@item 
@ref{53c8,,PyNumber_AsSsize_t()}

@item 
@ref{c62,,PyNumber_Check()}

@item 
@ref{53c9,,PyNumber_Divmod()}

@item 
@ref{c64,,PyNumber_Float()}

@item 
@ref{53ca,,PyNumber_FloorDivide()}

@item 
@ref{53cb,,PyNumber_InPlaceAdd()}

@item 
@ref{53cc,,PyNumber_InPlaceAnd()}

@item 
@ref{53cd,,PyNumber_InPlaceFloorDivide()}

@item 
@ref{53ce,,PyNumber_InPlaceLshift()}

@item 
@ref{10bd,,PyNumber_InPlaceMatrixMultiply()}

@item 
@ref{53cf,,PyNumber_InPlaceMultiply()}

@item 
@ref{53d0,,PyNumber_InPlaceOr()}

@item 
@ref{53d1,,PyNumber_InPlacePower()}

@item 
@ref{53d2,,PyNumber_InPlaceRemainder()}

@item 
@ref{53d3,,PyNumber_InPlaceRshift()}

@item 
@ref{53d4,,PyNumber_InPlaceSubtract()}

@item 
@ref{53d5,,PyNumber_InPlaceTrueDivide()}

@item 
@ref{53d6,,PyNumber_InPlaceXor()}

@item 
@ref{a99,,PyNumber_Index()}

@item 
@ref{53d7,,PyNumber_Invert()}

@item 
@ref{c63,,PyNumber_Long()}

@item 
@ref{53d8,,PyNumber_Lshift()}

@item 
@ref{10bc,,PyNumber_MatrixMultiply()}

@item 
@ref{53d9,,PyNumber_Multiply()}

@item 
@ref{53da,,PyNumber_Negative()}

@item 
@ref{53db,,PyNumber_Or()}

@item 
@ref{53dc,,PyNumber_Positive()}

@item 
@ref{53dd,,PyNumber_Power()}

@item 
@ref{53de,,PyNumber_Remainder()}

@item 
@ref{53df,,PyNumber_Rshift()}

@item 
@ref{53e0,,PyNumber_Subtract()}

@item 
@ref{1bb7,,PyNumber_ToBase()}

@item 
@ref{53e1,,PyNumber_TrueDivide()}

@item 
@ref{53e2,,PyNumber_Xor()}

@item 
@ref{42d,,PyOS_AfterFork()}

@item 
@ref{42e,,PyOS_AfterFork_Child()}

@item 
@ref{dbf,,PyOS_AfterFork_Parent()}

@item 
@ref{dbe,,PyOS_BeforeFork()}

@item 
@ref{1be4,,PyOS_CheckStack()}

@item 
@ref{f1a,,PyOS_FSPath()}

@item 
@ref{7a5,,PyOS_InputHook}

@item 
@ref{1d86,,PyOS_InterruptOccurred()}

@item 
@ref{53e3,,PyOS_double_to_string()}

@item 
@ref{174a,,PyOS_getsig()}

@item 
@ref{1d7f,,PyOS_mystricmp()}

@item 
@ref{1d7e,,PyOS_mystrnicmp()}

@item 
@ref{174b,,PyOS_setsig()}

@item 
@ref{53e4,,PyOS_sighandler_t}

@item 
@ref{1715,,PyOS_snprintf()}

@item 
@ref{14a1,,PyOS_string_to_double()}

@item 
@ref{53e5,,PyOS_strtol()}

@item 
@ref{53e6,,PyOS_strtoul()}

@item 
@ref{1716,,PyOS_vsnprintf()}

@item 
@ref{5df,,PyObject}

@item 
@ref{aa5,,PyObject.ob_refcnt}

@item 
@ref{522d,,PyObject.ob_type}

@item 
@ref{53e7,,PyObject_ASCII()}

@item 
@ref{53e8,,PyObject_AsFileDescriptor()}

@item 
@ref{53e9,,PyObject_Bytes()}

@item 
@ref{63d,,PyObject_Call()}

@item 
@ref{63f,,PyObject_CallFunction()}

@item 
@ref{53ea,,PyObject_CallFunctionObjArgs()}

@item 
@ref{640,,PyObject_CallMethod()}

@item 
@ref{1e21,,PyObject_CallMethodObjArgs()}

@item 
@ref{63c,,PyObject_CallNoArgs()}

@item 
@ref{520c,,PyObject_CallObject()}

@item 
@ref{10b4,,PyObject_Calloc()}

@item 
@ref{639,,PyObject_CheckBuffer()}

@item 
@ref{797,,PyObject_ClearWeakRefs()}

@item 
@ref{966,,PyObject_CopyData()}

@item 
@ref{187b,,PyObject_DelAttr()}

@item 
@ref{187c,,PyObject_DelAttrString()}

@item 
@ref{53eb,,PyObject_DelItem()}

@item 
@ref{53ec,,PyObject_DelItemString()}

@item 
@ref{53ed,,PyObject_Dir()}

@item 
@ref{53ee,,PyObject_Format()}

@item 
@ref{e65,,PyObject_Free()}

@item 
@ref{170f,,PyObject_GC_Del()}

@item 
@ref{b74,,PyObject_GC_IsFinalized()}

@item 
@ref{b73,,PyObject_GC_IsTracked()}

@item 
@ref{1710,,PyObject_GC_Track()}

@item 
@ref{1711,,PyObject_GC_UnTrack()}

@item 
@ref{53ef,,PyObject_GenericGetAttr()}

@item 
@ref{1d49,,PyObject_GenericGetDict()}

@item 
@ref{53f0,,PyObject_GenericSetAttr()}

@item 
@ref{53f1,,PyObject_GenericSetDict()}

@item 
@ref{53f2,,PyObject_GetAIter()}

@item 
@ref{5ee,,PyObject_GetAttr()}

@item 
@ref{5ef,,PyObject_GetAttrString()}

@item 
@ref{63a,,PyObject_GetBuffer()}

@item 
@ref{5ea,,PyObject_GetItem()}

@item 
@ref{53f3,,PyObject_GetIter()}

@item 
@ref{5ec,,PyObject_GetOptionalAttr()}

@item 
@ref{5ed,,PyObject_GetOptionalAttrString()}

@item 
@ref{76c,,PyObject_GetTypeData()}

@item 
@ref{61c,,PyObject_HasAttr()}

@item 
@ref{61e,,PyObject_HasAttrString()}

@item 
@ref{61d,,PyObject_HasAttrStringWithError()}

@item 
@ref{61b,,PyObject_HasAttrWithError()}

@item 
@ref{434,,PyObject_Hash()}

@item 
@ref{15d2,,PyObject_HashNotImplemented()}

@item 
@ref{c66,,PyObject_Init()}

@item 
@ref{1d84,,PyObject_InitVar()}

@item 
@ref{10ac,,PyObject_IsInstance()}

@item 
@ref{10ad,,PyObject_IsSubclass()}

@item 
@ref{53f4,,PyObject_IsTrue()}

@item 
@ref{53f5,,PyObject_Length()}

@item 
@ref{e68,,PyObject_Malloc()}

@item 
@ref{53f6,,PyObject_Not()}

@item 
@ref{164f,,PyObject_Realloc()}

@item 
@ref{1235,,PyObject_Repr()}

@item 
@ref{5251,,PyObject_RichCompare()}

@item 
@ref{1dd0,,PyObject_RichCompareBool()}

@item 
@ref{53f7,,PyObject_SelfIter()}

@item 
@ref{17a9,,PyObject_SetAttr()}

@item 
@ref{19d1,,PyObject_SetAttrString()}

@item 
@ref{52a8,,PyObject_SetItem()}

@item 
@ref{53f8,,PyObject_Size()}

@item 
@ref{1236,,PyObject_Str()}

@item 
@ref{53f9,,PyObject_Type()}

@item 
@ref{77f,,PyObject_Vectorcall()}

@item 
@ref{780,,PyObject_VectorcallMethod()}

@item 
@ref{53fa,,PyProperty_Type}

@item 
@ref{53fb,,PyRangeIter_Type}

@item 
@ref{53fc,,PyRange_Type}

@item 
@ref{53fd,,PyReversed_Type}

@item 
@ref{53fe,,PySeqIter_New()}

@item 
@ref{53ff,,PySeqIter_Type}

@item 
@ref{5400,,PySequence_Check()}

@item 
@ref{5401,,PySequence_Concat()}

@item 
@ref{3d7,,PySequence_Contains()}

@item 
@ref{5402,,PySequence_Count()}

@item 
@ref{1e78,,PySequence_DelItem()}

@item 
@ref{5403,,PySequence_DelSlice()}

@item 
@ref{18e9,,PySequence_Fast()}

@item 
@ref{1e76,,PySequence_GetItem()}

@item 
@ref{5404,,PySequence_GetSlice()}

@item 
@ref{3d6,,PySequence_In()}

@item 
@ref{5405,,PySequence_InPlaceConcat()}

@item 
@ref{5406,,PySequence_InPlaceRepeat()}

@item 
@ref{5407,,PySequence_Index()}

@item 
@ref{5408,,PySequence_Length()}

@item 
@ref{5409,,PySequence_List()}

@item 
@ref{540a,,PySequence_Repeat()}

@item 
@ref{1e77,,PySequence_SetItem()}

@item 
@ref{540b,,PySequence_SetSlice()}

@item 
@ref{1e75,,PySequence_Size()}

@item 
@ref{540c,,PySequence_Tuple()}

@item 
@ref{540d,,PySetIter_Type}

@item 
@ref{1652,,PySet_Add()}

@item 
@ref{540e,,PySet_Clear()}

@item 
@ref{1654,,PySet_Contains()}

@item 
@ref{1653,,PySet_Discard()}

@item 
@ref{1650,,PySet_New()}

@item 
@ref{540f,,PySet_Pop()}

@item 
@ref{1655,,PySet_Size()}

@item 
@ref{5410,,PySet_Type}

@item 
@ref{431,,PySlice_AdjustIndices()}

@item 
@ref{5411,,PySlice_GetIndices()}

@item 
@ref{42f,,PySlice_GetIndicesEx()}

@item 
@ref{5412,,PySlice_New()}

@item 
@ref{5413,,PySlice_Type}

@item 
@ref{430,,PySlice_Unpack()}

@item 
@ref{5414,,PyState_AddModule()}

@item 
@ref{5415,,PyState_FindModule()}

@item 
@ref{5416,,PyState_RemoveModule()}

@item 
@ref{dba,,PyStructSequence_Desc}

@item 
@ref{db9,,PyStructSequence_Field}

@item 
@ref{5417,,PyStructSequence_GetItem()}

@item 
@ref{5418,,PyStructSequence_New()}

@item 
@ref{5419,,PyStructSequence_NewType()}

@item 
@ref{541a,,PyStructSequence_SetItem()}

@item 
@ref{b7f,,PyStructSequence_UnnamedField}

@item 
@ref{541b,,PySuper_Type}

@item 
@ref{613,,PySys_Audit()}

@item 
@ref{612,,PySys_AuditTuple()}

@item 
@ref{541c,,PySys_FormatStderr()}

@item 
@ref{541d,,PySys_FormatStdout()}

@item 
@ref{62a,,PySys_GetObject()}

@item 
@ref{541e,,PySys_GetXOptions()}

@item 
@ref{3f2,,PySys_ResetWarnOptions()}

@item 
@ref{19fa,,PySys_SetArgv()}

@item 
@ref{19f9,,PySys_SetArgvEx()}

@item 
@ref{541f,,PySys_SetObject()}

@item 
@ref{5420,,PySys_WriteStderr()}

@item 
@ref{5421,,PySys_WriteStdout()}

@item 
@ref{995,,PyThreadState}

@item 
@ref{19d4,,PyThreadState_Clear()}

@item 
@ref{1dcd,,PyThreadState_Delete()}

@item 
@ref{615,,PyThreadState_Get()}

@item 
@ref{5422,,PyThreadState_GetDict()}

@item 
@ref{996,,PyThreadState_GetFrame()}

@item 
@ref{b70,,PyThreadState_GetID()}

@item 
@ref{b6f,,PyThreadState_GetInterpreter()}

@item 
@ref{5423,,PyThreadState_New()}

@item 
@ref{dc3,,PyThreadState_SetAsyncExc()}

@item 
@ref{5424,,PyThreadState_Swap()}

@item 
@ref{5425,,PyThread_GetInfo()}

@item 
@ref{43f,,PyThread_ReInitTLS()}

@item 
@ref{5426,,PyThread_acquire_lock()}

@item 
@ref{5427,,PyThread_acquire_lock_timed()}

@item 
@ref{5428,,PyThread_allocate_lock()}

@item 
@ref{435,,PyThread_create_key()}

@item 
@ref{437,,PyThread_delete_key()}

@item 
@ref{43d,,PyThread_delete_key_value()}

@item 
@ref{5429,,PyThread_exit_thread()}

@item 
@ref{542a,,PyThread_free_lock()}

@item 
@ref{43b,,PyThread_get_key_value()}

@item 
@ref{542b,,PyThread_get_stacksize()}

@item 
@ref{542c,,PyThread_get_thread_ident()}

@item 
@ref{1be5,,PyThread_get_thread_native_id()}

@item 
@ref{542d,,PyThread_init_thread()}

@item 
@ref{542e,,PyThread_release_lock()}

@item 
@ref{439,,PyThread_set_key_value()}

@item 
@ref{542f,,PyThread_set_stacksize()}

@item 
@ref{1e6d,,PyThread_start_new_thread()}

@item 
@ref{436,,PyThread_tss_alloc()}

@item 
@ref{5430,,PyThread_tss_create()}

@item 
@ref{43e,,PyThread_tss_delete()}

@item 
@ref{438,,PyThread_tss_free()}

@item 
@ref{43c,,PyThread_tss_get()}

@item 
@ref{5431,,PyThread_tss_is_created()}

@item 
@ref{43a,,PyThread_tss_set()}

@item 
@ref{5432,,PyTraceBack_Here()}

@item 
@ref{5433,,PyTraceBack_Print()}

@item 
@ref{5434,,PyTraceBack_Type}

@item 
@ref{5435,,PyTupleIter_Type}

@item 
@ref{5217,,PyTuple_GetItem()}

@item 
@ref{5436,,PyTuple_GetSlice()}

@item 
@ref{63e,,PyTuple_New()}

@item 
@ref{5437,,PyTuple_Pack()}

@item 
@ref{5218,,PyTuple_SetItem()}

@item 
@ref{5438,,PyTuple_Size()}

@item 
@ref{5439,,PyTuple_Type}

@item 
@ref{ca2,,PyTypeObject}

@item 
@ref{543a,,PyType_ClearCache()}

@item 
@ref{3ad,,PyType_Freeze()}

@item 
@ref{773,,PyType_FromMetaclass()}

@item 
@ref{774,,PyType_FromModuleAndSpec()}

@item 
@ref{79e,,PyType_FromSpec()}

@item 
@ref{79f,,PyType_FromSpecWithBases()}

@item 
@ref{c67,,PyType_GenericAlloc()}

@item 
@ref{522c,,PyType_GenericNew()}

@item 
@ref{3ae,,PyType_GetBaseByToken()}

@item 
@ref{1d81,,PyType_GetFlags()}

@item 
@ref{616,,PyType_GetFullyQualifiedName()}

@item 
@ref{b6c,,PyType_GetModule()}

@item 
@ref{635,,PyType_GetModuleByDef()}

@item 
@ref{618,,PyType_GetModuleName()}

@item 
@ref{b6d,,PyType_GetModuleState()}

@item 
@ref{95d,,PyType_GetName()}

@item 
@ref{95e,,PyType_GetQualName()}

@item 
@ref{aa2,,PyType_GetSlot()}

@item 
@ref{76d,,PyType_GetTypeDataSize()}

@item 
@ref{543b,,PyType_IsSubtype()}

@item 
@ref{1bbf,,PyType_Modified()}

@item 
@ref{985,,PyType_Ready()}

@item 
@ref{543c,,PyType_Slot}

@item 
@ref{1acf,,PyType_Spec}

@item 
@ref{770,,PyType_Type}

@item 
@ref{543d,,PyUnicodeDecodeError_Create()}

@item 
@ref{543e,,PyUnicodeDecodeError_GetEncoding()}

@item 
@ref{543f,,PyUnicodeDecodeError_GetEnd()}

@item 
@ref{5440,,PyUnicodeDecodeError_GetObject()}

@item 
@ref{5441,,PyUnicodeDecodeError_GetReason()}

@item 
@ref{5442,,PyUnicodeDecodeError_GetStart()}

@item 
@ref{5443,,PyUnicodeDecodeError_SetEnd()}

@item 
@ref{5444,,PyUnicodeDecodeError_SetReason()}

@item 
@ref{5445,,PyUnicodeDecodeError_SetStart()}

@item 
@ref{5446,,PyUnicodeEncodeError_GetEncoding()}

@item 
@ref{1940,,PyUnicodeEncodeError_GetEnd()}

@item 
@ref{5447,,PyUnicodeEncodeError_GetObject()}

@item 
@ref{5448,,PyUnicodeEncodeError_GetReason()}

@item 
@ref{1943,,PyUnicodeEncodeError_GetStart()}

@item 
@ref{5449,,PyUnicodeEncodeError_SetEnd()}

@item 
@ref{544a,,PyUnicodeEncodeError_SetReason()}

@item 
@ref{544b,,PyUnicodeEncodeError_SetStart()}

@item 
@ref{544c,,PyUnicodeIter_Type}

@item 
@ref{544d,,PyUnicodeTranslateError_GetEnd()}

@item 
@ref{544e,,PyUnicodeTranslateError_GetObject()}

@item 
@ref{544f,,PyUnicodeTranslateError_GetReason()}

@item 
@ref{5450,,PyUnicodeTranslateError_GetStart()}

@item 
@ref{5451,,PyUnicodeTranslateError_SetEnd()}

@item 
@ref{5452,,PyUnicodeTranslateError_SetReason()}

@item 
@ref{5453,,PyUnicodeTranslateError_SetStart()}

@item 
@ref{5454,,PyUnicode_Append()}

@item 
@ref{5455,,PyUnicode_AppendAndDel()}

@item 
@ref{139e,,PyUnicode_AsASCIIString()}

@item 
@ref{5456,,PyUnicode_AsCharmapString()}

@item 
@code{PyUnicode_AsDecodedObject()}

@item 
@code{PyUnicode_AsDecodedUnicode()}

@item 
@code{PyUnicode_AsEncodedObject()}

@item 
@ref{5457,,PyUnicode_AsEncodedString()}

@item 
@code{PyUnicode_AsEncodedUnicode()}

@item 
@ref{139d,,PyUnicode_AsLatin1String()}

@item 
@ref{139f,,PyUnicode_AsMBCSString()}

@item 
@ref{139c,,PyUnicode_AsRawUnicodeEscapeString()}

@item 
@ref{1384,,PyUnicode_AsUCS4()}

@item 
@ref{abe,,PyUnicode_AsUCS4Copy()}

@item 
@ref{5458,,PyUnicode_AsUTF16String()}

@item 
@ref{5459,,PyUnicode_AsUTF32String()}

@item 
@ref{a9f,,PyUnicode_AsUTF8AndSize()}

@item 
@ref{139a,,PyUnicode_AsUTF8String()}

@item 
@ref{139b,,PyUnicode_AsUnicodeEscapeString()}

@item 
@ref{1e7a,,PyUnicode_AsWideChar()}

@item 
@ref{abf,,PyUnicode_AsWideCharString()}

@item 
@ref{1aa8,,PyUnicode_BuildEncodingMap()}

@item 
@ref{aba,,PyUnicode_Compare()}

@item 
@ref{1473,,PyUnicode_CompareWithASCIIString()}

@item 
@ref{13ad,,PyUnicode_Concat()}

@item 
@ref{545a,,PyUnicode_Contains()}

@item 
@ref{545b,,PyUnicode_Count()}

@item 
@ref{1e09,,PyUnicode_Decode()}

@item 
@ref{545c,,PyUnicode_DecodeASCII()}

@item 
@ref{545d,,PyUnicode_DecodeCharmap()}

@item 
@ref{545e,,PyUnicode_DecodeCodePageStateful()}

@item 
@ref{1ace,,PyUnicode_DecodeFSDefault()}

@item 
@ref{545f,,PyUnicode_DecodeFSDefaultAndSize()}

@item 
@ref{5460,,PyUnicode_DecodeLatin1()}

@item 
@ref{5461,,PyUnicode_DecodeLocale()}

@item 
@ref{dc8,,PyUnicode_DecodeLocaleAndSize()}

@item 
@ref{5462,,PyUnicode_DecodeMBCS()}

@item 
@ref{5463,,PyUnicode_DecodeMBCSStateful()}

@item 
@ref{5464,,PyUnicode_DecodeRawUnicodeEscape()}

@item 
@ref{5465,,PyUnicode_DecodeUTF16()}

@item 
@ref{5466,,PyUnicode_DecodeUTF16Stateful()}

@item 
@ref{5467,,PyUnicode_DecodeUTF32()}

@item 
@ref{5468,,PyUnicode_DecodeUTF32Stateful()}

@item 
@ref{5469,,PyUnicode_DecodeUTF7()}

@item 
@ref{546a,,PyUnicode_DecodeUTF7Stateful()}

@item 
@ref{546b,,PyUnicode_DecodeUTF8()}

@item 
@ref{1b5b,,PyUnicode_DecodeUTF8Stateful()}

@item 
@ref{546c,,PyUnicode_DecodeUnicodeEscape()}

@item 
@ref{13a0,,PyUnicode_EncodeCodePage()}

@item 
@ref{1e73,,PyUnicode_EncodeFSDefault()}

@item 
@ref{dc9,,PyUnicode_EncodeLocale()}

@item 
@ref{3b0,,PyUnicode_Equal()}

@item 
@ref{61a,,PyUnicode_EqualToUTF8()}

@item 
@ref{619,,PyUnicode_EqualToUTF8AndSize()}

@item 
@ref{f1b,,PyUnicode_FSConverter()}

@item 
@ref{798,,PyUnicode_FSDecoder()}

@item 
@ref{546d,,PyUnicode_Find()}

@item 
@ref{abc,,PyUnicode_FindChar()}

@item 
@ref{546e,,PyUnicode_Format()}

@item 
@ref{546f,,PyUnicode_FromEncodedObject()}

@item 
@ref{62b,,PyUnicode_FromFormat()}

@item 
@ref{795,,PyUnicode_FromFormatV()}

@item 
@ref{5470,,PyUnicode_FromObject()}

@item 
@ref{5471,,PyUnicode_FromOrdinal()}

@item 
@ref{5472,,PyUnicode_FromString()}

@item 
@ref{5473,,PyUnicode_FromStringAndSize()}

@item 
@ref{1398,,PyUnicode_FromWideChar()}

@item 
@ref{5474,,PyUnicode_GetDefaultEncoding()}

@item 
@ref{ab6,,PyUnicode_GetLength()}

@item 
@ref{19cf,,PyUnicode_InternFromString()}

@item 
@ref{ab4,,PyUnicode_InternInPlace()}

@item 
@ref{1dca,,PyUnicode_IsIdentifier()}

@item 
@ref{13ae,,PyUnicode_Join()}

@item 
@ref{18df,,PyUnicode_Partition()}

@item 
@ref{18e0,,PyUnicode_RPartition()}

@item 
@ref{18de,,PyUnicode_RSplit()}

@item 
@ref{137d,,PyUnicode_ReadChar()}

@item 
@ref{5475,,PyUnicode_Replace()}

@item 
@ref{5476,,PyUnicode_Resize()}

@item 
@ref{5477,,PyUnicode_RichCompare()}

@item 
@ref{5478,,PyUnicode_Split()}

@item 
@ref{5479,,PyUnicode_Splitlines()}

@item 
@ref{ab9,,PyUnicode_Substring()}

@item 
@ref{abb,,PyUnicode_Tailmatch()}

@item 
@ref{547a,,PyUnicode_Translate()}

@item 
@ref{547b,,PyUnicode_Type}

@item 
@ref{137e,,PyUnicode_WriteChar()}

@item 
@ref{4a36,,PyVarObject}

@item 
@code{PyVarObject.ob_base}

@item 
@ref{547c,,PyVarObject.ob_size}

@item 
@ref{779,,PyVectorcall_Call()}

@item 
@ref{778,,PyVectorcall_NARGS()}

@item 
@code{PyWeakReference}

@item 
@ref{3db,,PyWeakref_GetObject()}

@item 
@ref{3dd,,PyWeakref_GetRef()}

@item 
@ref{547d,,PyWeakref_NewProxy()}

@item 
@ref{1c29,,PyWeakref_NewRef()}

@item 
@ref{547e,,PyWrapperDescr_Type}

@item 
@ref{547f,,PyWrapper_New()}

@item 
@ref{5480,,PyZip_Type}

@item 
@ref{5481,,Py_ASNATIVEBYTES_ALLOW_INDEX}

@item 
@ref{5482,,Py_ASNATIVEBYTES_BIG_ENDIAN}

@item 
@ref{5483,,Py_ASNATIVEBYTES_DEFAULTS}

@item 
@ref{5484,,Py_ASNATIVEBYTES_LITTLE_ENDIAN}

@item 
@ref{5485,,Py_ASNATIVEBYTES_NATIVE_ENDIAN}

@item 
@ref{5486,,Py_ASNATIVEBYTES_REJECT_NEGATIVE}

@item 
@ref{5487,,Py_ASNATIVEBYTES_UNSIGNED_BUFFER}

@item 
@ref{7b0,,Py_AUDIT_READ}

@item 
@ref{b7e,,Py_AddPendingCall()}

@item 
@ref{5488,,Py_AtExit()}

@item 
@ref{521d,,Py_BEGIN_ALLOW_THREADS}

@item 
@ref{5489,,Py_BLOCK_THREADS}

@item 
@ref{3c0,,Py_BuildValue()}

@item 
@ref{bbe,,Py_BytesMain()}

@item 
@ref{a8b,,Py_CompileString()}

@item 
@ref{548a,,Py_DecRef()}

@item 
@ref{dc6,,Py_DecodeLocale()}

@item 
@ref{c85,,Py_END_ALLOW_THREADS}

@item 
@ref{dc7,,Py_EncodeLocale()}

@item 
@ref{188e,,Py_EndInterpreter()}

@item 
@ref{3d0,,Py_EnterRecursiveCall()}

@item 
@ref{f51,,Py_Exit()}

@item 
@ref{b80,,Py_FatalError()}

@item 
@code{Py_FileSystemDefaultEncodeErrors}

@item 
@code{Py_FileSystemDefaultEncoding}

@item 
@ref{45d,,Py_Finalize()}

@item 
@ref{f17,,Py_FinalizeEx()}

@item 
@ref{548b,,Py_GenericAlias()}

@item 
@ref{548c,,Py_GenericAliasType}

@item 
@ref{163e,,Py_GetBuildInfo()}

@item 
@ref{548d,,Py_GetCompiler()}

@item 
@ref{5f9,,Py_GetConstant()}

@item 
@ref{5fa,,Py_GetConstantBorrowed()}

@item 
@ref{548e,,Py_GetCopyright()}

@item 
@ref{3e7,,Py_GetExecPrefix()}

@item 
@ref{3e1,,Py_GetPath()}

@item 
@ref{548f,,Py_GetPlatform()}

@item 
@ref{3e3,,Py_GetPrefix()}

@item 
@ref{3ea,,Py_GetProgramFullPath()}

@item 
@ref{3ec,,Py_GetProgramName()}

@item 
@ref{3ed,,Py_GetPythonHome()}

@item 
@ref{5490,,Py_GetRecursionLimit()}

@item 
@ref{5491,,Py_GetVersion()}

@item 
@code{Py_HasFileSystemDefaultEncoding}

@item 
@ref{5492,,Py_IncRef()}

@item 
@ref{45e,,Py_Initialize()}

@item 
@ref{5493,,Py_InitializeEx()}

@item 
@ref{aa6,,Py_Is()}

@item 
@ref{aa9,,Py_IsFalse()}

@item 
@ref{5fd,,Py_IsFinalizing()}

@item 
@ref{52b1,,Py_IsInitialized()}

@item 
@ref{aa7,,Py_IsNone()}

@item 
@ref{aa8,,Py_IsTrue()}

@item 
@ref{b71,,Py_LeaveRecursiveCall()}

@item 
@ref{e24,,Py_Main()}

@item 
@ref{5494,,Py_MakePendingCalls()}

@item 
@ref{1b75,,Py_NewInterpreter()}

@item 
@ref{aa0,,Py_NewRef()}

@item 
@ref{37e,,Py_PACK_FULL_VERSION()}

@item 
@ref{37d,,Py_PACK_VERSION()}

@item 
@ref{7af,,Py_READONLY}

@item 
@ref{2d1,,Py_REFCNT()}

@item 
@ref{771,,Py_RELATIVE_OFFSET}

@item 
@ref{5495,,Py_ReprEnter()}

@item 
@ref{5496,,Py_ReprLeave()}

@item 
@ref{19f8,,Py_SetProgramName()}

@item 
@ref{19f7,,Py_SetPythonHome()}

@item 
@ref{5497,,Py_SetRecursionLimit()}

@item 
@ref{5235,,Py_TPFLAGS_BASETYPE}

@item 
@ref{522a,,Py_TPFLAGS_DEFAULT}

@item 
@ref{986,,Py_TPFLAGS_HAVE_GC}

@item 
@ref{777,,Py_TPFLAGS_HAVE_VECTORCALL}

@item 
@ref{76e,,Py_TPFLAGS_ITEMS_AT_END}

@item 
@ref{5498,,Py_TPFLAGS_METHOD_DESCRIPTOR}

@item 
@ref{5499,,Py_TP_USE_SPEC}

@item 
@ref{3c7,,Py_TYPE()}

@item 
@ref{549a,,Py_T_BOOL}

@item 
@ref{549b,,Py_T_BYTE}

@item 
@ref{549c,,Py_T_CHAR}

@item 
@ref{7ae,,Py_T_DOUBLE}

@item 
@ref{549d,,Py_T_FLOAT}

@item 
@ref{7ad,,Py_T_INT}

@item 
@ref{549e,,Py_T_LONG}

@item 
@ref{549f,,Py_T_LONGLONG}

@item 
@ref{7b2,,Py_T_OBJECT_EX}

@item 
@ref{54a0,,Py_T_PYSSIZET}

@item 
@ref{54a1,,Py_T_SHORT}

@item 
@ref{54a2,,Py_T_STRING}

@item 
@ref{54a3,,Py_T_STRING_INPLACE}

@item 
@ref{54a4,,Py_T_UBYTE}

@item 
@ref{54a5,,Py_T_UINT}

@item 
@ref{54a6,,Py_T_ULONG}

@item 
@ref{54a7,,Py_T_ULONGLONG}

@item 
@ref{54a8,,Py_T_USHORT}

@item 
@ref{33b,,Py_UCS4}

@item 
@ref{54a9,,Py_UNBLOCK_THREADS}

@item 
@code{Py_UTF8Mode}

@item 
@ref{54aa,,Py_VaBuildValue()}

@item 
@ref{37f,,Py_Version}

@item 
@ref{aa1,,Py_XNewRef()}

@item 
@ref{54ab,,Py_am_aiter}

@item 
@ref{54ac,,Py_am_anext}

@item 
@ref{54ad,,Py_am_await}

@item 
@ref{54ae,,Py_am_send}

@item 
@ref{54af,,Py_bf_getbuffer}

@item 
@ref{54b0,,Py_bf_releasebuffer}

@item 
@ref{961,,Py_buffer}

@item 
@code{Py_intptr_t}

@item 
@ref{54b1,,Py_mod_create}

@item 
@ref{b7b,,Py_mod_exec}

@item 
@ref{483,,Py_mod_gil}

@item 
@ref{54b2,,Py_mod_multiple_interpreters}

@item 
@ref{54b3,,Py_mp_ass_subscript}

@item 
@ref{54b4,,Py_mp_length}

@item 
@ref{54b5,,Py_mp_subscript}

@item 
@ref{54b6,,Py_nb_absolute}

@item 
@ref{54b7,,Py_nb_add}

@item 
@ref{54b8,,Py_nb_and}

@item 
@ref{54b9,,Py_nb_bool}

@item 
@ref{54ba,,Py_nb_divmod}

@item 
@ref{54bb,,Py_nb_float}

@item 
@ref{54bc,,Py_nb_floor_divide}

@item 
@ref{54bd,,Py_nb_index}

@item 
@ref{54be,,Py_nb_inplace_add}

@item 
@ref{54bf,,Py_nb_inplace_and}

@item 
@ref{54c0,,Py_nb_inplace_floor_divide}

@item 
@ref{54c1,,Py_nb_inplace_lshift}

@item 
@ref{54c2,,Py_nb_inplace_matrix_multiply}

@item 
@ref{54c3,,Py_nb_inplace_multiply}

@item 
@ref{54c4,,Py_nb_inplace_or}

@item 
@ref{54c5,,Py_nb_inplace_power}

@item 
@ref{54c6,,Py_nb_inplace_remainder}

@item 
@ref{54c7,,Py_nb_inplace_rshift}

@item 
@ref{54c8,,Py_nb_inplace_subtract}

@item 
@ref{54c9,,Py_nb_inplace_true_divide}

@item 
@ref{54ca,,Py_nb_inplace_xor}

@item 
@ref{54cb,,Py_nb_int}

@item 
@ref{54cc,,Py_nb_invert}

@item 
@ref{54cd,,Py_nb_lshift}

@item 
@ref{54ce,,Py_nb_matrix_multiply}

@item 
@ref{54cf,,Py_nb_multiply}

@item 
@ref{54d0,,Py_nb_negative}

@item 
@ref{54d1,,Py_nb_or}

@item 
@ref{54d2,,Py_nb_positive}

@item 
@ref{54d3,,Py_nb_power}

@item 
@ref{54d4,,Py_nb_remainder}

@item 
@ref{54d5,,Py_nb_rshift}

@item 
@ref{54d6,,Py_nb_subtract}

@item 
@ref{54d7,,Py_nb_true_divide}

@item 
@ref{54d8,,Py_nb_xor}

@item 
@ref{54d9,,Py_sq_ass_item}

@item 
@ref{54da,,Py_sq_concat}

@item 
@ref{54db,,Py_sq_contains}

@item 
@ref{54dc,,Py_sq_inplace_concat}

@item 
@ref{54dd,,Py_sq_inplace_repeat}

@item 
@ref{54de,,Py_sq_item}

@item 
@ref{54df,,Py_sq_length}

@item 
@ref{54e0,,Py_sq_repeat}

@item 
@ref{c5b,,Py_ssize_t}

@item 
@ref{54e1,,Py_tp_alloc}

@item 
@ref{54e2,,Py_tp_base}

@item 
@ref{54e3,,Py_tp_bases}

@item 
@ref{54e4,,Py_tp_call}

@item 
@ref{54e5,,Py_tp_clear}

@item 
@ref{54e6,,Py_tp_dealloc}

@item 
@ref{54e7,,Py_tp_del}

@item 
@ref{54e8,,Py_tp_descr_get}

@item 
@ref{54e9,,Py_tp_descr_set}

@item 
@ref{54ea,,Py_tp_doc}

@item 
@ref{54eb,,Py_tp_finalize}

@item 
@ref{54ec,,Py_tp_free}

@item 
@ref{54ed,,Py_tp_getattr}

@item 
@ref{54ee,,Py_tp_getattro}

@item 
@ref{54ef,,Py_tp_getset}

@item 
@ref{54f0,,Py_tp_hash}

@item 
@ref{54f1,,Py_tp_init}

@item 
@ref{54f2,,Py_tp_is_gc}

@item 
@ref{54f3,,Py_tp_iter}

@item 
@ref{54f4,,Py_tp_iternext}

@item 
@ref{54f5,,Py_tp_members}

@item 
@ref{54f6,,Py_tp_methods}

@item 
@ref{54f7,,Py_tp_new}

@item 
@ref{54f8,,Py_tp_repr}

@item 
@ref{54f9,,Py_tp_richcompare}

@item 
@ref{54fa,,Py_tp_setattr}

@item 
@ref{54fb,,Py_tp_setattro}

@item 
@ref{54fc,,Py_tp_str}

@item 
@ref{3af,,Py_tp_token}

@item 
@ref{54fd,,Py_tp_traverse}

@item 
@ref{54fe,,Py_tp_vectorcall}

@item 
@code{Py_uintptr_t}

@item 
@ref{54ff,,allocfunc}

@item 
@ref{5500,,binaryfunc}

@item 
@ref{5501,,descrgetfunc}

@item 
@ref{5502,,descrsetfunc}

@item 
@ref{5503,,destructor}

@item 
@ref{5504,,getattrfunc}

@item 
@ref{5505,,getattrofunc}

@item 
@ref{5506,,getbufferproc}

@item 
@ref{5507,,getiterfunc}

@item 
@ref{5508,,getter}

@item 
@ref{5509,,hashfunc}

@item 
@ref{550a,,initproc}

@item 
@ref{550b,,inquiry}

@item 
@ref{550c,,iternextfunc}

@item 
@ref{550d,,lenfunc}

@item 
@ref{550e,,newfunc}

@item 
@ref{550f,,objobjargproc}

@item 
@ref{5510,,objobjproc}

@item 
@ref{5511,,releasebufferproc}

@item 
@ref{5512,,reprfunc}

@item 
@ref{5513,,richcmpfunc}

@item 
@ref{5514,,setattrfunc}

@item 
@ref{5515,,setattrofunc}

@item 
@ref{5516,,setter}

@item 
@ref{5517,,ssizeargfunc}

@item 
@ref{5518,,ssizeobjargproc}

@item 
@code{ssizessizeargfunc}

@item 
@code{ssizessizeobjargproc}

@item 
@code{symtable}

@item 
@ref{5519,,ternaryfunc}

@item 
@ref{551a,,traverseproc}

@item 
@ref{551b,,unaryfunc}

@item 
@ref{77a,,vectorcallfunc}

@item 
@ref{551c,,visitproc}
@end itemize


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node The Very High Level Layer,Reference Counting,C API Stability,Python/C API reference manual
@anchor{c-api/veryhigh doc}@anchor{551d}@anchor{c-api/veryhigh the-very-high-level-layer}@anchor{551e}@anchor{c-api/veryhigh translation-repo}@anchor{551f}@anchor{c-api/veryhigh veryhigh}@anchor{5520}
@section The Very High Level Layer


The functions in this chapter will let you execute Python source code given in a
file or a buffer, but they will not let you interact in a more detailed way with
the interpreter.

Several of these functions accept a start symbol from the grammar as a
parameter.  The available start symbols are @ref{5521,,Py_eval_input},
@ref{5522,,Py_file_input}, @ref{5523,,Py_single_input}, and
@ref{5524,,Py_func_type_input}.  These are described following the functions
which accept them as parameters.

Note also that several of these functions take FILE* parameters.  One
particular issue which needs to be handled carefully is that the @code{FILE}
structure for different C libraries can be different and incompatible.  Under
Windows (at least), it is possible for dynamically linked extensions to actually
use different libraries, so care should be taken that FILE* parameters
are only passed to these functions if it is certain that they were created by
the same library that the Python runtime is using.

@geindex PyRun_AnyFile (C function)
@anchor{c-api/veryhigh c PyRun_AnyFile}@anchor{5525}
@deffn {C Function} int PyRun_AnyFile (FILE *fp, const char *filename)

This is a simplified interface to @ref{5526,,PyRun_AnyFileExFlags()} below, leaving
`closeit' set to @code{0} and `flags' set to @code{NULL}.
@end deffn

@geindex PyRun_AnyFileFlags (C function)
@anchor{c-api/veryhigh c PyRun_AnyFileFlags}@anchor{5527}
@deffn {C Function} int PyRun_AnyFileFlags (FILE *fp, const char *filename, PyCompilerFlags *flags)

This is a simplified interface to @ref{5526,,PyRun_AnyFileExFlags()} below, leaving
the `closeit' argument set to @code{0}.
@end deffn

@geindex PyRun_AnyFileEx (C function)
@anchor{c-api/veryhigh c PyRun_AnyFileEx}@anchor{5528}
@deffn {C Function} int PyRun_AnyFileEx (FILE *fp, const char *filename, int closeit)

This is a simplified interface to @ref{5526,,PyRun_AnyFileExFlags()} below, leaving
the `flags' argument set to @code{NULL}.
@end deffn

@geindex PyRun_AnyFileExFlags (C function)
@anchor{c-api/veryhigh c PyRun_AnyFileExFlags}@anchor{5526}
@deffn {C Function} int PyRun_AnyFileExFlags (FILE *fp, const char *filename, int closeit, PyCompilerFlags *flags)

If `fp' refers to a file associated with an interactive device (console or
terminal input or Unix pseudo-terminal), return the value of
@ref{5529,,PyRun_InteractiveLoop()}, otherwise return the result of
@ref{526c,,PyRun_SimpleFile()}.  `filename' is decoded from the filesystem
encoding (@ref{e59,,sys.getfilesystemencoding()}).  If `filename' is @code{NULL}, this
function uses @code{"???"} as the filename.
If `closeit' is true, the file is closed before
@code{PyRun_SimpleFileExFlags()} returns.
@end deffn

@geindex PyRun_SimpleString (C function)
@anchor{c-api/veryhigh c PyRun_SimpleString}@anchor{526b}
@deffn {C Function} int PyRun_SimpleString (const char *command)

This is a simplified interface to @ref{552a,,PyRun_SimpleStringFlags()} below,
leaving the @ref{c9e,,PyCompilerFlags}* argument set to @code{NULL}.
@end deffn

@geindex PyRun_SimpleStringFlags (C function)
@anchor{c-api/veryhigh c PyRun_SimpleStringFlags}@anchor{552a}
@deffn {C Function} int PyRun_SimpleStringFlags (const char *command, PyCompilerFlags *flags)

Executes the Python source code from `command' in the @ref{1,,__main__} module
according to the `flags' argument. If @code{__main__} does not already exist, it
is created.  Returns @code{0} on success or @code{-1} if an exception was raised.  If
there was an error, there is no way to get the exception information. For the
meaning of `flags', see below.

Note that if an otherwise unhandled @ref{f42,,SystemExit} is raised, this
function will not return @code{-1}, but exit the process, as long as
@ref{3ff,,PyConfig.inspect} is zero.
@end deffn

@geindex PyRun_SimpleFile (C function)
@anchor{c-api/veryhigh c PyRun_SimpleFile}@anchor{526c}
@deffn {C Function} int PyRun_SimpleFile (FILE *fp, const char *filename)

This is a simplified interface to @ref{1d0b,,PyRun_SimpleFileExFlags()} below,
leaving `closeit' set to @code{0} and `flags' set to @code{NULL}.
@end deffn

@geindex PyRun_SimpleFileEx (C function)
@anchor{c-api/veryhigh c PyRun_SimpleFileEx}@anchor{552b}
@deffn {C Function} int PyRun_SimpleFileEx (FILE *fp, const char *filename, int closeit)

This is a simplified interface to @ref{1d0b,,PyRun_SimpleFileExFlags()} below,
leaving `flags' set to @code{NULL}.
@end deffn

@geindex PyRun_SimpleFileExFlags (C function)
@anchor{c-api/veryhigh c PyRun_SimpleFileExFlags}@anchor{1d0b}
@deffn {C Function} int PyRun_SimpleFileExFlags (FILE *fp, const char *filename, int closeit, PyCompilerFlags *flags)

Similar to @ref{552a,,PyRun_SimpleStringFlags()}, but the Python source code is read
from `fp' instead of an in-memory string. `filename' should be the name of
the file, it is decoded from @ref{75e,,filesystem encoding and error handler}.
If `closeit' is true, the file is closed before
@code{PyRun_SimpleFileExFlags()} returns.

@cartouche
@quotation Note 
On Windows, `fp' should be opened as binary mode (e.g. @code{fopen(filename, "rb")}).
Otherwise, Python may not handle script file with LF line ending correctly.
@end quotation
@end cartouche
@end deffn

@geindex PyRun_InteractiveOneObject (C function)
@anchor{c-api/veryhigh c PyRun_InteractiveOneObject}@anchor{552c}
@deffn {C Function} int PyRun_InteractiveOneObject (FILE *fp, PyObject *filename, PyCompilerFlags *flags)

Read and execute a single statement from a file associated with an
interactive device according to the `flags' argument.  The user will be
prompted using @code{sys.ps1} and @code{sys.ps2}. `filename' must be a Python
@ref{16a,,str} object.

Returns @code{0} when the input was
executed successfully, @code{-1} if there was an exception, or an error code
from the @code{errcode.h} include file distributed as part of Python if
there was a parse error.  (Note that @code{errcode.h} is not included by
@code{Python.h}, so must be included specifically if needed.)
@end deffn

@geindex PyRun_InteractiveOne (C function)
@anchor{c-api/veryhigh c PyRun_InteractiveOne}@anchor{552d}
@deffn {C Function} int PyRun_InteractiveOne (FILE *fp, const char *filename)

This is a simplified interface to @ref{552e,,PyRun_InteractiveOneFlags()} below,
leaving `flags' set to @code{NULL}.
@end deffn

@geindex PyRun_InteractiveOneFlags (C function)
@anchor{c-api/veryhigh c PyRun_InteractiveOneFlags}@anchor{552e}
@deffn {C Function} int PyRun_InteractiveOneFlags (FILE *fp, const char *filename, PyCompilerFlags *flags)

Similar to @ref{552c,,PyRun_InteractiveOneObject()}, but `filename' is a
const char*, which is decoded from the
@ref{75e,,filesystem encoding and error handler}.
@end deffn

@geindex PyRun_InteractiveLoop (C function)
@anchor{c-api/veryhigh c PyRun_InteractiveLoop}@anchor{5529}
@deffn {C Function} int PyRun_InteractiveLoop (FILE *fp, const char *filename)

This is a simplified interface to @ref{552f,,PyRun_InteractiveLoopFlags()} below,
leaving `flags' set to @code{NULL}.
@end deffn

@geindex PyRun_InteractiveLoopFlags (C function)
@anchor{c-api/veryhigh c PyRun_InteractiveLoopFlags}@anchor{552f}
@deffn {C Function} int PyRun_InteractiveLoopFlags (FILE *fp, const char *filename, PyCompilerFlags *flags)

Read and execute statements from a file associated with an interactive device
until EOF is reached.  The user will be prompted using @code{sys.ps1} and
@code{sys.ps2}.  `filename' is decoded from the @ref{75e,,filesystem encoding and error handler}.  Returns @code{0} at EOF or a negative number upon failure.
@end deffn

@geindex PyOS_InputHook (C var)
@anchor{c-api/veryhigh c PyOS_InputHook}@anchor{7a5}
@deffn {C Variable} int (*PyOS_InputHook)(void)
` Part of the @ref{776,,Stable ABI}.'
Can be set to point to a function with the prototype
@code{int func(void)}.  The function will be called when Python’s
interpreter prompt is about to become idle and wait for user input
from the terminal.  The return value is ignored.  Overriding this
hook can be used to integrate the interpreter’s prompt with other
event loops, as done in @code{Modules/_tkinter.c} in the
Python source code.


Changed in version 3.12: This function is only called from the
@ref{164,,main interpreter}.

@end deffn

@geindex PyOS_ReadlineFunctionPointer (C var)
@anchor{c-api/veryhigh c PyOS_ReadlineFunctionPointer}@anchor{7a6}
@deffn {C Variable} char *(*PyOS_ReadlineFunctionPointer)(FILE*, FILE*, const char*)

Can be set to point to a function with the prototype
@code{char *func(FILE *stdin, FILE *stdout, char *prompt)},
overriding the default function used to read a single line of input
at the interpreter’s prompt.  The function is expected to output
the string `prompt' if it’s not @code{NULL}, and then read a line of
input from the provided standard input file, returning the
resulting string.  For example, The @ref{bf,,readline} module sets
this hook to provide line-editing and tab-completion features.

The result must be a string allocated by @ref{631,,PyMem_RawMalloc()} or
@ref{633,,PyMem_RawRealloc()}, or @code{NULL} if an error occurred.


Changed in version 3.4: The result must be allocated by @ref{631,,PyMem_RawMalloc()} or
@ref{633,,PyMem_RawRealloc()}, instead of being allocated by
@ref{e66,,PyMem_Malloc()} or @ref{1238,,PyMem_Realloc()}.



Changed in version 3.12: This function is only called from the
@ref{164,,main interpreter}.

@end deffn

@geindex PyRun_String (C function)
@anchor{c-api/veryhigh c PyRun_String}@anchor{1e02}
@deffn {C Function} @ref{5df,,PyObject} *PyRun_String (const char *str, int start, PyObject *globals, PyObject *locals)
`Return value: New reference.'
This is a simplified interface to @ref{5530,,PyRun_StringFlags()} below, leaving
`flags' set to @code{NULL}.
@end deffn

@geindex PyRun_StringFlags (C function)
@anchor{c-api/veryhigh c PyRun_StringFlags}@anchor{5530}
@deffn {C Function} @ref{5df,,PyObject} *PyRun_StringFlags (const char *str, int start, PyObject *globals, PyObject *locals, PyCompilerFlags *flags)
`Return value: New reference.'
Execute Python source code from `str' in the context specified by the
objects `globals' and `locals' with the compiler flags specified by
`flags'.  `globals' must be a dictionary; `locals' can be any object
that implements the mapping protocol.  The parameter `start' specifies
the start symbol and must be one of the @ref{5531,,available start symbols}.

Returns the result of executing the code as a Python object, or @code{NULL} if an
exception was raised.
@end deffn

@geindex PyRun_File (C function)
@anchor{c-api/veryhigh c PyRun_File}@anchor{5532}
@deffn {C Function} @ref{5df,,PyObject} *PyRun_File (FILE *fp, const char *filename, int start, PyObject *globals, PyObject *locals)
`Return value: New reference.'
This is a simplified interface to @ref{5533,,PyRun_FileExFlags()} below, leaving
`closeit' set to @code{0} and `flags' set to @code{NULL}.
@end deffn

@geindex PyRun_FileEx (C function)
@anchor{c-api/veryhigh c PyRun_FileEx}@anchor{5534}
@deffn {C Function} @ref{5df,,PyObject} *PyRun_FileEx (FILE *fp, const char *filename, int start, PyObject *globals, PyObject *locals, int closeit)
`Return value: New reference.'
This is a simplified interface to @ref{5533,,PyRun_FileExFlags()} below, leaving
`flags' set to @code{NULL}.
@end deffn

@geindex PyRun_FileFlags (C function)
@anchor{c-api/veryhigh c PyRun_FileFlags}@anchor{5535}
@deffn {C Function} @ref{5df,,PyObject} *PyRun_FileFlags (FILE *fp, const char *filename, int start, PyObject *globals, PyObject *locals, PyCompilerFlags *flags)
`Return value: New reference.'
This is a simplified interface to @ref{5533,,PyRun_FileExFlags()} below, leaving
`closeit' set to @code{0}.
@end deffn

@geindex PyRun_FileExFlags (C function)
@anchor{c-api/veryhigh c PyRun_FileExFlags}@anchor{5533}
@deffn {C Function} @ref{5df,,PyObject} *PyRun_FileExFlags (FILE *fp, const char *filename, int start, PyObject *globals, PyObject *locals, int closeit, PyCompilerFlags *flags)
`Return value: New reference.'
Similar to @ref{5530,,PyRun_StringFlags()}, but the Python source code is read from
`fp' instead of an in-memory string. `filename' should be the name of the file,
it is decoded from the @ref{75e,,filesystem encoding and error handler}.
If `closeit' is true, the file is closed before @ref{5533,,PyRun_FileExFlags()}
returns.
@end deffn

@geindex Py_CompileString (C function)
@anchor{c-api/veryhigh c Py_CompileString}@anchor{a8b}
@deffn {C Function} @ref{5df,,PyObject} *Py_CompileString (const char *str, const char *filename, int start)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
This is a simplified interface to @ref{5536,,Py_CompileStringFlags()} below, leaving
`flags' set to @code{NULL}.
@end deffn

@geindex Py_CompileStringFlags (C function)
@anchor{c-api/veryhigh c Py_CompileStringFlags}@anchor{5536}
@deffn {C Function} @ref{5df,,PyObject} *Py_CompileStringFlags (const char *str, const char *filename, int start, PyCompilerFlags *flags)
`Return value: New reference.'
This is a simplified interface to @ref{5537,,Py_CompileStringExFlags()} below, with
`optimize' set to @code{-1}.
@end deffn

@geindex Py_CompileStringObject (C function)
@anchor{c-api/veryhigh c Py_CompileStringObject}@anchor{5538}
@deffn {C Function} @ref{5df,,PyObject} *Py_CompileStringObject (const char *str, PyObject *filename, int start, PyCompilerFlags *flags, int optimize)
`Return value: New reference.'
Parse and compile the Python source code in `str', returning the resulting code
object.  The start symbol is given by `start'; this can be used to constrain the
code which can be compiled and should be @ref{5531,,available start symbols}.  The filename specified by
`filename' is used to construct the code object and may appear in tracebacks or
@ref{18f,,SyntaxError} exception messages.  This returns @code{NULL} if the code
cannot be parsed or compiled.

The integer `optimize' specifies the optimization level of the compiler; a
value of @code{-1} selects the optimization level of the interpreter as given by
@ref{18d,,-O} options.  Explicit levels are @code{0} (no optimization;
@code{__debug__} is true), @code{1} (asserts are removed, @code{__debug__} is false)
or @code{2} (docstrings are removed too).


Added in version 3.4.

@end deffn

@geindex Py_CompileStringExFlags (C function)
@anchor{c-api/veryhigh c Py_CompileStringExFlags}@anchor{5537}
@deffn {C Function} @ref{5df,,PyObject} *Py_CompileStringExFlags (const char *str, const char *filename, int start, PyCompilerFlags *flags, int optimize)
`Return value: New reference.'
Like @ref{5538,,Py_CompileStringObject()}, but `filename' is a byte string
decoded from the @ref{75e,,filesystem encoding and error handler}.


Added in version 3.2.

@end deffn

@geindex PyEval_EvalCode (C function)
@anchor{c-api/veryhigh c PyEval_EvalCode}@anchor{a8c}
@deffn {C Function} @ref{5df,,PyObject} *PyEval_EvalCode (PyObject *co, PyObject *globals, PyObject *locals)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
This is a simplified interface to @ref{1b1e,,PyEval_EvalCodeEx()}, with just
the code object, and global and local variables.  The other arguments are
set to @code{NULL}.
@end deffn

@geindex PyEval_EvalCodeEx (C function)
@anchor{c-api/veryhigh c PyEval_EvalCodeEx}@anchor{1b1e}
@deffn {C Function} @ref{5df,,PyObject} *PyEval_EvalCodeEx (PyObject *co, PyObject *globals, PyObject *locals, PyObject *const *args, int argcount, PyObject *const *kws, int kwcount, PyObject *const *defs, int defcount, PyObject *kwdefs, PyObject *closure)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Evaluate a precompiled code object, given a particular environment for its
evaluation.  This environment consists of a dictionary of global variables,
a mapping object of local variables, arrays of arguments, keywords and
defaults, a dictionary of default values for @ref{5a5,,keyword-only} arguments and a closure tuple of cells.
@end deffn

@geindex PyEval_EvalFrame (C function)
@anchor{c-api/veryhigh c PyEval_EvalFrame}@anchor{533b}
@deffn {C Function} @ref{5df,,PyObject} *PyEval_EvalFrame (PyFrameObject *f)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Evaluate an execution frame.  This is a simplified interface to
@ref{1234,,PyEval_EvalFrameEx()}, for backward compatibility.
@end deffn

@geindex PyEval_EvalFrameEx (C function)
@anchor{c-api/veryhigh c PyEval_EvalFrameEx}@anchor{1234}
@deffn {C Function} @ref{5df,,PyObject} *PyEval_EvalFrameEx (PyFrameObject *f, int throwflag)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
This is the main, unvarnished function of Python interpretation.  The code
object associated with the execution frame `f' is executed, interpreting
bytecode and executing calls as needed.  The additional `throwflag'
parameter can mostly be ignored - if true, then it causes an exception
to immediately be thrown; this is used for the @ref{71d,,throw()}
methods of generator objects.


Changed in version 3.4: This function now includes a debug assertion to help ensure that it
does not silently discard an active exception.

@end deffn

@geindex PyEval_MergeCompilerFlags (C function)
@anchor{c-api/veryhigh c PyEval_MergeCompilerFlags}@anchor{5539}
@deffn {C Function} int PyEval_MergeCompilerFlags (PyCompilerFlags *cf)

This function changes the flags of the current evaluation frame, and returns
true on success, false on failure.
@end deffn

@geindex PyCompilerFlags (C struct)
@anchor{c-api/veryhigh c PyCompilerFlags}@anchor{c9e}
@deffn {C Struct} struct PyCompilerFlags

This is the structure used to hold compiler flags.  In cases where code is only
being compiled, it is passed as @code{int flags}, and in cases where code is being
executed, it is passed as @code{PyCompilerFlags *flags}.  In this case, @code{from
__future__ import} can modify `flags'.

Whenever @code{PyCompilerFlags *flags} is @code{NULL}, @ref{553a,,cf_flags} is treated as
equal to @code{0}, and any modification due to @code{from __future__ import} is
discarded.

@geindex PyCompilerFlags.cf_flags (C member)
@anchor{c-api/veryhigh c PyCompilerFlags cf_flags}@anchor{553a}
@deffn {C Member} int cf_flags

Compiler flags.
@end deffn

@geindex PyCompilerFlags.cf_feature_version (C member)
@anchor{c-api/veryhigh c PyCompilerFlags cf_feature_version}@anchor{553b}
@deffn {C Member} int cf_feature_version

`cf_feature_version' is the minor Python version. It should be
initialized to @code{PY_MINOR_VERSION}.

The field is ignored by default, it is used if and only if
@code{PyCF_ONLY_AST} flag is set in @ref{553a,,cf_flags}.
@end deffn


Changed in version 3.8: Added `cf_feature_version' field.


The available compiler flags are accessible as macros:

@geindex PyCF_ALLOW_TOP_LEVEL_AWAIT (C macro)
@geindex PyCF_ONLY_AST (C macro)
@geindex PyCF_OPTIMIZED_AST (C macro)
@geindex PyCF_TYPE_COMMENTS (C macro)
@anchor{c-api/veryhigh c PyCF_ALLOW_TOP_LEVEL_AWAIT}@anchor{553c}
@deffn {C Macro} PyCF_ALLOW_TOP_LEVEL_AWAIT
@anchor{c-api/veryhigh c PyCF_ONLY_AST}@anchor{553d}
@deffnx {C Macro} PyCF_ONLY_AST
@anchor{c-api/veryhigh c PyCF_OPTIMIZED_AST}@anchor{553e}
@deffnx {C Macro} PyCF_OPTIMIZED_AST
@anchor{c-api/veryhigh c PyCF_TYPE_COMMENTS}@anchor{553f}
@deffnx {C Macro} PyCF_TYPE_COMMENTS

See @ref{260e,,compiler flags} in documentation of the
@code{ast} Python module, which exports these constants under
the same names.
@end deffn

The “@code{PyCF}” flags above can be combined with “@code{CO_FUTURE}” flags such
as @ref{5540,,CO_FUTURE_ANNOTATIONS} to enable features normally
selectable using @ref{45b,,future statements}.
See @ref{5541,,Code Object Flags} for a complete list.
@end deffn

@menu
* Available start symbols:: 
* Stack Effects:: 

@end menu

@node Available start symbols,Stack Effects,,The Very High Level Layer
@anchor{c-api/veryhigh available-start-symbols}@anchor{5542}@anchor{c-api/veryhigh start-symbols}@anchor{5531}
@subsection Available start symbols


@geindex Py_eval_input (C var)
@anchor{c-api/veryhigh c Py_eval_input}@anchor{5521}
@deffn {C Variable} int Py_eval_input

@geindex Py_CompileString (C function)

The start symbol from the Python grammar for isolated expressions; for use with
@ref{a8b,,Py_CompileString()}.
@end deffn

@geindex Py_file_input (C var)
@anchor{c-api/veryhigh c Py_file_input}@anchor{5522}
@deffn {C Variable} int Py_file_input

@geindex Py_CompileString (C function)

The start symbol from the Python grammar for sequences of statements as read
from a file or other source; for use with @ref{a8b,,Py_CompileString()}.  This is
the symbol to use when compiling arbitrarily long Python source code.
@end deffn

@geindex Py_single_input (C var)
@anchor{c-api/veryhigh c Py_single_input}@anchor{5523}
@deffn {C Variable} int Py_single_input

@geindex Py_CompileString (C function)

The start symbol from the Python grammar for a single statement; for use with
@ref{a8b,,Py_CompileString()}. This is the symbol used for the interactive
interpreter loop.
@end deffn

@geindex Py_func_type_input (C var)
@anchor{c-api/veryhigh c Py_func_type_input}@anchor{5524}
@deffn {C Variable} int Py_func_type_input

@geindex Py_CompileString (C function)

The start symbol from the Python grammar for a function type; for use with
@ref{a8b,,Py_CompileString()}. This is used to parse “signature type comments”
from 
@geindex Python Enhancement Proposals; PEP 484
PEP 484@footnote{https://peps.python.org/pep-0484/}.

This requires the @ref{553d,,PyCF_ONLY_AST} flag to be set.


@subsubheading See also



@itemize *

@item 
@ref{4ede,,ast.FunctionType}

@item 
@geindex Python Enhancement Proposals; PEP 484
PEP 484@footnote{https://peps.python.org/pep-0484/}
@end itemize



Added in version 3.8.

@end deffn

@node Stack Effects,,Available start symbols,The Very High Level Layer
@anchor{c-api/veryhigh stack-effects}@anchor{5543}
@subsection Stack Effects



@subsubheading See also


@ref{1137,,dis.stack_effect()}


@geindex PY_INVALID_STACK_EFFECT (C macro)
@anchor{c-api/veryhigh c PY_INVALID_STACK_EFFECT}@anchor{5544}
@deffn {C Macro} PY_INVALID_STACK_EFFECT

Sentinel value representing an invalid stack effect.

This is currently equivalent to @code{INT_MAX}.


Added in version 3.8.

@end deffn

@geindex PyCompile_OpcodeStackEffect (C function)
@anchor{c-api/veryhigh c PyCompile_OpcodeStackEffect}@anchor{5545}
@deffn {C Function} int PyCompile_OpcodeStackEffect (int opcode, int oparg)

Compute the stack effect of `opcode' with argument `oparg'.

On success, this function returns the stack effect; on failure, this
returns @ref{5544,,PY_INVALID_STACK_EFFECT}.


Added in version 3.4.

@end deffn

@geindex PyCompile_OpcodeStackEffectWithJump (C function)
@anchor{c-api/veryhigh c PyCompile_OpcodeStackEffectWithJump}@anchor{1e74}
@deffn {C Function} int PyCompile_OpcodeStackEffectWithJump (int opcode, int oparg, int jump)

Similar to @ref{5545,,PyCompile_OpcodeStackEffect()}, but don’t include the
stack effect of jumping if `jump' is zero.

If `jump' is @code{0}, this will not include the stack effect of jumping, but
if `jump' is @code{1} or @code{-1}, this will include it.

On success, this function returns the stack effect; on failure, this
returns @ref{5544,,PY_INVALID_STACK_EFFECT}.


Added in version 3.8.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Reference Counting,Exception Handling,The Very High Level Layer,Python/C API reference manual
@anchor{c-api/refcounting doc}@anchor{5546}@anchor{c-api/refcounting countingrefs}@anchor{5547}@anchor{c-api/refcounting reference-counting}@anchor{5548}@anchor{c-api/refcounting translation-repo}@anchor{5549}
@section Reference Counting


The functions and macros in this section are used for managing reference counts
of Python objects.

@geindex Py_REFCNT (C function)
@anchor{c-api/refcounting c Py_REFCNT}@anchor{2d1}
@deffn {C Function} @ref{c5b,,Py_ssize_t} Py_REFCNT (PyObject *o)
` Part of the @ref{776,,Stable ABI} since version 3.14.'
Get the reference count of the Python object `o'.

Note that the returned value may not actually reflect how many
references to the object are actually held.  For example, some
objects are @ref{292,,immortal} and have a very high refcount that does not
reflect the actual number of references.  Consequently, do not rely
on the returned value to be accurate, other than a value of 0 or 1.

Use the @ref{aae,,Py_SET_REFCNT()} function to set an object reference count.

@cartouche
@quotation Note 
On @ref{1791,,free-threaded builds} of Python, returning 1
isn’t sufficient to determine if it’s safe to treat `o' as having no
access by other threads. Use @ref{3c4,,PyUnstable_Object_IsUniquelyReferenced()}
for that instead.

See also the function @ref{3c5,,PyUnstable_Object_IsUniqueReferencedTemporary()}.
@end quotation
@end cartouche


Changed in version 3.10: @ref{2d1,,Py_REFCNT()} is changed to the inline static function.



Changed in version 3.11: The parameter type is no longer const @ref{5df,,PyObject}*.

@end deffn

@geindex Py_SET_REFCNT (C function)
@anchor{c-api/refcounting c Py_SET_REFCNT}@anchor{aae}
@deffn {C Function} void Py_SET_REFCNT (PyObject *o, Py_ssize_t refcnt)

Set the object `o' reference counter to `refcnt'.

On @ref{21b0,,Python build with Free Threading}, if
`refcnt' is larger than @code{UINT32_MAX}, the object is made @ref{292,,immortal}.

This function has no effect on @ref{292,,immortal} objects.


Added in version 3.9.



Changed in version 3.12: Immortal objects are not modified.

@end deffn

@geindex Py_INCREF (C function)
@anchor{c-api/refcounting c Py_INCREF}@anchor{790}
@deffn {C Function} void Py_INCREF (PyObject *o)

Indicate taking a new @ref{5e2,,strong reference} to object `o',
indicating it is in use and should not be destroyed.

This function has no effect on @ref{292,,immortal} objects.

This function is usually used to convert a @ref{3d5,,borrowed reference} to a
@ref{5e2,,strong reference} in-place. The @ref{aa0,,Py_NewRef()} function can be
used to create a new strong reference.

When done using the object, release is by calling @ref{791,,Py_DECREF()}.

The object must not be @code{NULL}; if you aren’t sure that it isn’t
@code{NULL}, use @ref{c60,,Py_XINCREF()}.

Do not expect this function to actually modify `o' in any way.
For at least 
@geindex Python Enhancement Proposals; PEP 0683
some objects@footnote{https://peps.python.org/pep-0683/},
this function has no effect.


Changed in version 3.12: Immortal objects are not modified.

@end deffn

@geindex Py_XINCREF (C function)
@anchor{c-api/refcounting c Py_XINCREF}@anchor{c60}
@deffn {C Function} void Py_XINCREF (PyObject *o)

Similar to @ref{790,,Py_INCREF()}, but the object `o' can be @code{NULL},
in which case this has no effect.

See also @ref{aa1,,Py_XNewRef()}.
@end deffn

@geindex Py_NewRef (C function)
@anchor{c-api/refcounting c Py_NewRef}@anchor{aa0}
@deffn {C Function} @ref{5df,,PyObject} *Py_NewRef (PyObject *o)
` Part of the @ref{776,,Stable ABI} since version 3.10.'
Create a new @ref{5e2,,strong reference} to an object:
call @ref{790,,Py_INCREF()} on `o' and return the object `o'.

When the @ref{5e2,,strong reference} is no longer needed, @ref{791,,Py_DECREF()}
should be called on it to release the reference.

The object `o' must not be @code{NULL}; use @ref{aa1,,Py_XNewRef()} if `o' can be
@code{NULL}.

For example:

@example
Py_INCREF(obj);
self->attr = obj;
@end example

can be written as:

@example
self->attr = Py_NewRef(obj);
@end example

See also @ref{790,,Py_INCREF()}.


Added in version 3.10.

@end deffn

@geindex Py_XNewRef (C function)
@anchor{c-api/refcounting c Py_XNewRef}@anchor{aa1}
@deffn {C Function} @ref{5df,,PyObject} *Py_XNewRef (PyObject *o)
` Part of the @ref{776,,Stable ABI} since version 3.10.'
Similar to @ref{aa0,,Py_NewRef()}, but the object `o' can be NULL.

If the object `o' is @code{NULL}, the function just returns @code{NULL}.


Added in version 3.10.

@end deffn

@geindex Py_DECREF (C function)
@anchor{c-api/refcounting c Py_DECREF}@anchor{791}
@deffn {C Function} void Py_DECREF (PyObject *o)

Release a @ref{5e2,,strong reference} to object `o', indicating the
reference is no longer used.

This function has no effect on @ref{292,,immortal} objects.

Once the last @ref{5e2,,strong reference} is released
(i.e. the object’s reference count reaches 0),
the object’s type’s deallocation
function (which must not be @code{NULL}) is invoked.

This function is usually used to delete a @ref{5e2,,strong reference} before
exiting its scope.

The object must not be @code{NULL}; if you aren’t sure that it isn’t @code{NULL},
use @ref{997,,Py_XDECREF()}.

Do not expect this function to actually modify `o' in any way.
For at least 
@geindex Python Enhancement Proposals; PEP 683
some objects@footnote{https://peps.python.org/pep-0683/},
this function has no effect.

@cartouche
@quotation Warning 
The deallocation function can cause arbitrary Python code to be invoked (e.g.
when a class instance with a @ref{1203,,__del__()} method is deallocated).  While
exceptions in such code are not propagated, the executed code has free access to
all Python global variables.  This means that any object that is reachable from
a global variable should be in a consistent state before @ref{791,,Py_DECREF()} is
invoked.  For example, code to delete an object from a list should copy a
reference to the deleted object in a temporary variable, update the list data
structure, and then call @code{Py_DECREF()} for the temporary variable.
@end quotation
@end cartouche


Changed in version 3.12: Immortal objects are not modified.

@end deffn

@geindex Py_XDECREF (C function)
@anchor{c-api/refcounting c Py_XDECREF}@anchor{997}
@deffn {C Function} void Py_XDECREF (PyObject *o)

Similar to @ref{791,,Py_DECREF()}, but the object `o' can be @code{NULL},
in which case this has no effect.
The same warning from @code{Py_DECREF()} applies here as well.
@end deffn

@geindex Py_CLEAR (C function)
@anchor{c-api/refcounting c Py_CLEAR}@anchor{799}
@deffn {C Function} void Py_CLEAR (PyObject *o)

Release a @ref{5e2,,strong reference} for object `o'.
The object may be @code{NULL}, in
which case the macro has no effect; otherwise the effect is the same as for
@ref{791,,Py_DECREF()}, except that the argument is also set to @code{NULL}.  The warning
for @code{Py_DECREF()} does not apply with respect to the object passed because
the macro carefully uses a temporary variable and sets the argument to @code{NULL}
before releasing the reference.

It is a good idea to use this macro whenever releasing a reference
to an object that might be traversed during garbage collection.


Changed in version 3.12: The macro argument is now only evaluated once. If the argument has side
effects, these are no longer duplicated.

@end deffn

@geindex Py_IncRef (C function)
@anchor{c-api/refcounting c Py_IncRef}@anchor{5492}
@deffn {C Function} void Py_IncRef (PyObject *o)
` Part of the @ref{776,,Stable ABI}.'
Indicate taking a new @ref{5e2,,strong reference} to object `o'.
A function version of @ref{c60,,Py_XINCREF()}.
It can be used for runtime dynamic embedding of Python.
@end deffn

@geindex Py_DecRef (C function)
@anchor{c-api/refcounting c Py_DecRef}@anchor{548a}
@deffn {C Function} void Py_DecRef (PyObject *o)
` Part of the @ref{776,,Stable ABI}.'
Release a @ref{5e2,,strong reference} to object `o'.
A function version of @ref{997,,Py_XDECREF()}.
It can be used for runtime dynamic embedding of Python.
@end deffn

@geindex Py_SETREF (C macro)
@anchor{c-api/refcounting c Py_SETREF}@anchor{79a}
@deffn {C Macro} Py_SETREF (dst, src)

Macro safely releasing a @ref{5e2,,strong reference} to object `dst'
and setting `dst' to `src'.

As in case of @ref{799,,Py_CLEAR()}, “the obvious” code can be deadly:

@example
Py_DECREF(dst);
dst = src;
@end example

The safe way is:

@example
Py_SETREF(dst, src);
@end example

That arranges to set `dst' to `src' `before' releasing the reference
to the old value of `dst', so that any code triggered as a side-effect
of `dst' getting torn down no longer believes `dst' points
to a valid object.


Added in version 3.6.



Changed in version 3.12: The macro arguments are now only evaluated once. If an argument has side
effects, these are no longer duplicated.

@end deffn

@geindex Py_XSETREF (C macro)
@anchor{c-api/refcounting c Py_XSETREF}@anchor{79b}
@deffn {C Macro} Py_XSETREF (dst, src)

Variant of @ref{79a,,Py_SETREF} macro that uses @ref{997,,Py_XDECREF()} instead
of @ref{791,,Py_DECREF()}.


Added in version 3.6.



Changed in version 3.12: The macro arguments are now only evaluated once. If an argument has side
effects, these are no longer duplicated.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Exception Handling,Defining extension modules,Reference Counting,Python/C API reference manual
@anchor{c-api/exceptions doc}@anchor{554a}@anchor{c-api/exceptions exception-handling}@anchor{554b}@anchor{c-api/exceptions exceptionhandling}@anchor{4ce7}@anchor{c-api/exceptions translation-repo}@anchor{554c}
@section Exception Handling


The functions described in this chapter will let you handle and raise Python
exceptions.  It is important to understand some of the basics of Python
exception handling.  It works somewhat like the POSIX @code{errno} variable:
there is a global indicator (per thread) of the last error that occurred.  Most
C API functions don’t clear this on success, but will set it to indicate the
cause of the error on failure.  Most C API functions also return an error
indicator, usually @code{NULL} if they are supposed to return a pointer, or @code{-1}
if they return an integer (exception: the @code{PyArg_*} functions
return @code{1} for success and @code{0} for failure).

Concretely, the error indicator consists of three object pointers: the
exception’s type, the exception’s value, and the traceback object.  Any
of those pointers can be @code{NULL} if non-set (although some combinations are
forbidden, for example you can’t have a non-@code{NULL} traceback if the exception
type is @code{NULL}).

When a function must fail because some function it called failed, it generally
doesn’t set the error indicator; the function it called already set it.  It is
responsible for either handling the error and clearing the exception or
returning after cleaning up any resources it holds (such as object references or
memory allocations); it should `not' continue normally if it is not prepared to
handle the error.  If returning due to an error, it is important to indicate to
the caller that an error has been set.  If the error is not handled or carefully
propagated, additional calls into the Python/C API may not behave as intended
and may fail in mysterious ways.

@cartouche
@quotation Note 
The error indicator is `not' the result of @ref{89c,,sys.exc_info()}.
The former corresponds to an exception that is not yet caught (and is
therefore still propagating), while the latter returns an exception after
it is caught (and has therefore stopped propagating).
@end quotation
@end cartouche

@menu
* Printing and clearing:: 
* Raising exceptions:: 
* Issuing warnings:: 
* Querying the error indicator:: 
* Signal Handling: Signal Handling<2>. 
* Exception Classes:: 
* Exception Objects:: 
* Unicode Exception Objects:: 
* Recursion Control:: 
* Exception and warning types:: 
* Tracebacks:: 

@end menu

@node Printing and clearing,Raising exceptions,,Exception Handling
@anchor{c-api/exceptions printing-and-clearing}@anchor{554d}
@subsection Printing and clearing


@geindex PyErr_Clear (C function)
@anchor{c-api/exceptions c PyErr_Clear}@anchor{1237}
@deffn {C Function} void PyErr_Clear ()
` Part of the @ref{776,,Stable ABI}.'
Clear the error indicator.  If the error indicator is not set, there is no
effect.
@end deffn

@geindex PyErr_PrintEx (C function)
@anchor{c-api/exceptions c PyErr_PrintEx}@anchor{532e}
@deffn {C Function} void PyErr_PrintEx (int set_sys_last_vars)
` Part of the @ref{776,,Stable ABI}.'
Print a standard traceback to @code{sys.stderr} and clear the error indicator.
`Unless' the error is a @code{SystemExit}, in that case no traceback is
printed and the Python process will exit with the error code specified by
the @code{SystemExit} instance.

Call this function `only' when the error indicator is set.  Otherwise it
will cause a fatal error!

If `set_sys_last_vars' is nonzero, the variable @ref{6e6,,sys.last_exc} is
set to the printed exception. For backwards compatibility, the
deprecated variables @ref{6e7,,sys.last_type}, @ref{6e8,,sys.last_value} and
@ref{6e9,,sys.last_traceback} are also set to the type, value and traceback
of this exception, respectively.


Changed in version 3.12: The setting of @ref{6e6,,sys.last_exc} was added.

@end deffn

@geindex PyErr_Print (C function)
@anchor{c-api/exceptions c PyErr_Print}@anchor{1d70}
@deffn {C Function} void PyErr_Print ()
` Part of the @ref{776,,Stable ABI}.'
Alias for @code{PyErr_PrintEx(1)}.
@end deffn

@geindex PyErr_WriteUnraisable (C function)
@anchor{c-api/exceptions c PyErr_WriteUnraisable}@anchor{5f2}
@deffn {C Function} void PyErr_WriteUnraisable (PyObject *obj)
` Part of the @ref{776,,Stable ABI}.'
Call @ref{508,,sys.unraisablehook()} using the current exception and `obj'
argument.

This utility function prints a warning message to @code{sys.stderr} when an
exception has been set but it is impossible for the interpreter to actually
raise the exception.  It is used, for example, when an exception occurs in an
@ref{1203,,__del__()} method.

The function is called with a single argument `obj' that identifies the context
in which the unraisable exception occurred. If possible,
the repr of `obj' will be printed in the warning message.
If `obj' is @code{NULL}, only the traceback is printed.

An exception must be set when calling this function.


Changed in version 3.4: Print a traceback. Print only traceback if `obj' is @code{NULL}.



Changed in version 3.8: Use @ref{508,,sys.unraisablehook()}.

@end deffn

@geindex PyErr_FormatUnraisable (C function)
@anchor{c-api/exceptions c PyErr_FormatUnraisable}@anchor{5f1}
@deffn {C Function} void PyErr_FormatUnraisable (const char *format, ...)

Similar to @ref{5f2,,PyErr_WriteUnraisable()}, but the `format' and subsequent
parameters help format the warning message; they have the same meaning and
values as in @ref{62b,,PyUnicode_FromFormat()}.
@code{PyErr_WriteUnraisable(obj)} is roughly equivalent to
@code{PyErr_FormatUnraisable("Exception ignored in: %R", obj)}.
If `format' is @code{NULL}, only the traceback is printed.


Added in version 3.13.

@end deffn

@geindex PyErr_DisplayException (C function)
@anchor{c-api/exceptions c PyErr_DisplayException}@anchor{433}
@deffn {C Function} void PyErr_DisplayException (PyObject *exc)
` Part of the @ref{776,,Stable ABI} since version 3.12.'
Print the standard traceback display of @code{exc} to @code{sys.stderr}, including
chained exceptions and notes.


Added in version 3.12.

@end deffn

@node Raising exceptions,Issuing warnings,Printing and clearing,Exception Handling
@anchor{c-api/exceptions raising-exceptions}@anchor{554e}
@subsection Raising exceptions


These functions help you set the current thread’s error indicator.
For convenience, some of these functions will always return a
@code{NULL} pointer for use in a @code{return} statement.

@geindex PyErr_SetString (C function)
@anchor{c-api/exceptions c PyErr_SetString}@anchor{79d}
@deffn {C Function} void PyErr_SetString (PyObject *type, const char *message)
` Part of the @ref{776,,Stable ABI}.'
This is the most common way to set the error indicator.  The first argument
specifies the exception type; it is normally one of the standard exceptions,
e.g. @ref{536c,,PyExc_RuntimeError}.  You need not create a new
@ref{5e2,,strong reference} to it (e.g. with @ref{790,,Py_INCREF()}).
The second argument is an error message; it is decoded from @code{'utf-8'}.
@end deffn

@geindex PyErr_SetObject (C function)
@anchor{c-api/exceptions c PyErr_SetObject}@anchor{79c}
@deffn {C Function} void PyErr_SetObject (PyObject *type, PyObject *value)
` Part of the @ref{776,,Stable ABI}.'
This function is similar to @ref{79d,,PyErr_SetString()} but lets you specify an
arbitrary Python object for the “value” of the exception.
@end deffn

@geindex PyErr_Format (C function)
@anchor{c-api/exceptions c PyErr_Format}@anchor{10b7}
@deffn {C Function} @ref{5df,,PyObject} *PyErr_Format (PyObject *exception, const char *format, ...)
`Return value: Always NULL.'` Part of the @ref{776,,Stable ABI}.'
This function sets the error indicator and returns @code{NULL}.  `exception'
should be a Python exception class.  The `format' and subsequent
parameters help format the error message; they have the same meaning and
values as in @ref{62b,,PyUnicode_FromFormat()}. `format' is an ASCII-encoded
string.
@end deffn

@geindex PyErr_FormatV (C function)
@anchor{c-api/exceptions c PyErr_FormatV}@anchor{10b6}
@deffn {C Function} @ref{5df,,PyObject} *PyErr_FormatV (PyObject *exception, const char *format, va_list vargs)
`Return value: Always NULL.'` Part of the @ref{776,,Stable ABI} since version 3.5.'
Same as @ref{10b7,,PyErr_Format()}, but taking a @code{va_list} argument rather
than a variable number of arguments.


Added in version 3.5.

@end deffn

@geindex PyErr_SetNone (C function)
@anchor{c-api/exceptions c PyErr_SetNone}@anchor{5337}
@deffn {C Function} void PyErr_SetNone (PyObject *type)
` Part of the @ref{776,,Stable ABI}.'
This is a shorthand for @code{PyErr_SetObject(type, Py_None)}.
@end deffn

@geindex PyErr_BadArgument (C function)
@anchor{c-api/exceptions c PyErr_BadArgument}@anchor{532b}
@deffn {C Function} int PyErr_BadArgument ()
` Part of the @ref{776,,Stable ABI}.'
This is a shorthand for @code{PyErr_SetString(PyExc_TypeError, message)}, where
`message' indicates that a built-in operation was invoked with an illegal
argument.  It is mostly for internal use.
@end deffn

@geindex PyErr_NoMemory (C function)
@anchor{c-api/exceptions c PyErr_NoMemory}@anchor{51f9}
@deffn {C Function} @ref{5df,,PyObject} *PyErr_NoMemory ()
`Return value: Always NULL.'` Part of the @ref{776,,Stable ABI}.'
This is a shorthand for @code{PyErr_SetNone(PyExc_MemoryError)}; it returns @code{NULL}
so an object allocation function can write @code{return PyErr_NoMemory();} when it
runs out of memory.
@end deffn

@geindex PyErr_SetFromErrno (C function)
@anchor{c-api/exceptions c PyErr_SetFromErrno}@anchor{51f8}
@deffn {C Function} @ref{5df,,PyObject} *PyErr_SetFromErrno (PyObject *type)
`Return value: Always NULL.'` Part of the @ref{776,,Stable ABI}.'
@geindex strerror (C function)

This is a convenience function to raise an exception when a C library function
has returned an error and set the C variable @code{errno}.  It constructs a
tuple object whose first item is the integer @code{errno} value and whose
second item is the corresponding error message (gotten from @code{strerror()}),
and then calls @code{PyErr_SetObject(type, object)}.  On Unix, when the
@code{errno} value is @code{EINTR}, indicating an interrupted system call,
this calls @ref{694,,PyErr_CheckSignals()}, and if that set the error indicator,
leaves it set to that.  The function always returns @code{NULL}, so a wrapper
function around a system call can write @code{return PyErr_SetFromErrno(type);}
when the system call returns an error.
@end deffn

@geindex PyErr_SetFromErrnoWithFilenameObject (C function)
@anchor{c-api/exceptions c PyErr_SetFromErrnoWithFilenameObject}@anchor{5333}
@deffn {C Function} @ref{5df,,PyObject} *PyErr_SetFromErrnoWithFilenameObject (PyObject *type, PyObject *filenameObject)
`Return value: Always NULL.'` Part of the @ref{776,,Stable ABI}.'
Similar to @ref{51f8,,PyErr_SetFromErrno()}, with the additional behavior that if
`filenameObject' is not @code{NULL}, it is passed to the constructor of `type' as
a third parameter.  In the case of @ref{2c2,,OSError} exception,
this is used to define the @code{filename} attribute of the
exception instance.
@end deffn

@geindex PyErr_SetFromErrnoWithFilenameObjects (C function)
@anchor{c-api/exceptions c PyErr_SetFromErrnoWithFilenameObjects}@anchor{5334}
@deffn {C Function} @ref{5df,,PyObject} *PyErr_SetFromErrnoWithFilenameObjects (PyObject *type, PyObject *filenameObject, PyObject *filenameObject2)
`Return value: Always NULL.'` Part of the @ref{776,,Stable ABI} since version 3.7.'
Similar to @ref{5333,,PyErr_SetFromErrnoWithFilenameObject()}, but takes a second
filename object, for raising errors when a function that takes two filenames
fails.


Added in version 3.4.

@end deffn

@geindex PyErr_SetFromErrnoWithFilename (C function)
@anchor{c-api/exceptions c PyErr_SetFromErrnoWithFilename}@anchor{1acb}
@deffn {C Function} @ref{5df,,PyObject} *PyErr_SetFromErrnoWithFilename (PyObject *type, const char *filename)
`Return value: Always NULL.'` Part of the @ref{776,,Stable ABI}.'
Similar to @ref{5333,,PyErr_SetFromErrnoWithFilenameObject()}, but the filename
is given as a C string.  `filename' is decoded from the @ref{75e,,filesystem encoding and error handler}.
@end deffn

@geindex PyErr_SetFromWindowsErr (C function)
@anchor{c-api/exceptions c PyErr_SetFromWindowsErr}@anchor{5335}
@deffn {C Function} @ref{5df,,PyObject} *PyErr_SetFromWindowsErr (int ierr)
`Return value: Always NULL.'` Part of the @ref{776,,Stable ABI} on Windows since version 3.7.'
This is a convenience function to raise @ref{2c2,,OSError}. If called with
`ierr' of @code{0}, the error code returned by a call to @code{GetLastError()}
is used instead.  It calls the Win32 function @code{FormatMessage()} to retrieve
the Windows description of error code given by `ierr' or @code{GetLastError()},
then it constructs a @code{OSError} object with the @ref{2738,,winerror}
attribute set to the error code, the @ref{2739,,strerror} attribute
set to the corresponding error message (gotten from
@code{FormatMessage()}), and then calls @code{PyErr_SetObject(PyExc_OSError,
object)}. This function always returns @code{NULL}.

@ref{2181,,Availability}: Windows.
@end deffn

@geindex PyErr_SetExcFromWindowsErr (C function)
@anchor{c-api/exceptions c PyErr_SetExcFromWindowsErr}@anchor{5330}
@deffn {C Function} @ref{5df,,PyObject} *PyErr_SetExcFromWindowsErr (PyObject *type, int ierr)
`Return value: Always NULL.'` Part of the @ref{776,,Stable ABI} on Windows since version 3.7.'
Similar to @ref{5335,,PyErr_SetFromWindowsErr()}, with an additional parameter
specifying the exception type to be raised.

@ref{2181,,Availability}: Windows.
@end deffn

@geindex PyErr_SetFromWindowsErrWithFilename (C function)
@anchor{c-api/exceptions c PyErr_SetFromWindowsErrWithFilename}@anchor{1acd}
@deffn {C Function} @ref{5df,,PyObject} *PyErr_SetFromWindowsErrWithFilename (int ierr, const char *filename)
`Return value: Always NULL.'` Part of the @ref{776,,Stable ABI} on Windows since version 3.7.'
Similar to @ref{5335,,PyErr_SetFromWindowsErr()}, with the additional behavior
that if `filename' is not @code{NULL}, it is decoded from the filesystem
encoding (@ref{e54,,os.fsdecode()}) and passed to the constructor of
@ref{2c2,,OSError} as a third parameter to be used to define the
@code{filename} attribute of the exception instance.

@ref{2181,,Availability}: Windows.
@end deffn

@geindex PyErr_SetExcFromWindowsErrWithFilenameObject (C function)
@anchor{c-api/exceptions c PyErr_SetExcFromWindowsErrWithFilenameObject}@anchor{5331}
@deffn {C Function} @ref{5df,,PyObject} *PyErr_SetExcFromWindowsErrWithFilenameObject (PyObject *type, int ierr, PyObject *filename)
`Return value: Always NULL.'` Part of the @ref{776,,Stable ABI} on Windows since version 3.7.'
Similar to @ref{5330,,PyErr_SetExcFromWindowsErr()}, with the additional behavior
that if `filename' is not @code{NULL}, it is passed to the constructor of
@ref{2c2,,OSError} as a third parameter to be used to define the
@code{filename} attribute of the exception instance.

@ref{2181,,Availability}: Windows.
@end deffn

@geindex PyErr_SetExcFromWindowsErrWithFilenameObjects (C function)
@anchor{c-api/exceptions c PyErr_SetExcFromWindowsErrWithFilenameObjects}@anchor{5332}
@deffn {C Function} @ref{5df,,PyObject} *PyErr_SetExcFromWindowsErrWithFilenameObjects (PyObject *type, int ierr, PyObject *filename, PyObject *filename2)
`Return value: Always NULL.'` Part of the @ref{776,,Stable ABI} on Windows since version 3.7.'
Similar to @ref{5331,,PyErr_SetExcFromWindowsErrWithFilenameObject()},
but accepts a second filename object.

@ref{2181,,Availability}: Windows.


Added in version 3.4.

@end deffn

@geindex PyErr_SetExcFromWindowsErrWithFilename (C function)
@anchor{c-api/exceptions c PyErr_SetExcFromWindowsErrWithFilename}@anchor{1acc}
@deffn {C Function} @ref{5df,,PyObject} *PyErr_SetExcFromWindowsErrWithFilename (PyObject *type, int ierr, const char *filename)
`Return value: Always NULL.'` Part of the @ref{776,,Stable ABI} on Windows since version 3.7.'
Similar to @ref{1acd,,PyErr_SetFromWindowsErrWithFilename()}, with an additional
parameter specifying the exception type to be raised.

@ref{2181,,Availability}: Windows.
@end deffn

@geindex PyErr_SetImportError (C function)
@anchor{c-api/exceptions c PyErr_SetImportError}@anchor{f3f}
@deffn {C Function} @ref{5df,,PyObject} *PyErr_SetImportError (PyObject *msg, PyObject *name, PyObject *path)
`Return value: Always NULL.'` Part of the @ref{776,,Stable ABI} since version 3.7.'
This is a convenience function to raise @ref{65b,,ImportError}. `msg' will be
set as the exception’s message string. `name' and `path', both of which can
be @code{NULL}, will be set as the @code{ImportError}’s respective @code{name}
and @code{path} attributes.


Added in version 3.3.

@end deffn

@geindex PyErr_SetImportErrorSubclass (C function)
@anchor{c-api/exceptions c PyErr_SetImportErrorSubclass}@anchor{f18}
@deffn {C Function} @ref{5df,,PyObject} *PyErr_SetImportErrorSubclass (PyObject *exception, PyObject *msg, PyObject *name, PyObject *path)
`Return value: Always NULL.'` Part of the @ref{776,,Stable ABI} since version 3.6.'
Much like @ref{f3f,,PyErr_SetImportError()} but this function allows for
specifying a subclass of @ref{65b,,ImportError} to raise.


Added in version 3.6.

@end deffn

@geindex PyErr_SyntaxLocationObject (C function)
@anchor{c-api/exceptions c PyErr_SyntaxLocationObject}@anchor{554f}
@deffn {C Function} void PyErr_SyntaxLocationObject (PyObject *filename, int lineno, int col_offset)

Set file, line, and offset information for the current exception.  If the
current exception is not a @ref{18f,,SyntaxError}, then it sets additional
attributes, which make the exception printing subsystem think the exception
is a @code{SyntaxError}.


Added in version 3.4.

@end deffn

@geindex PyErr_RangedSyntaxLocationObject (C function)
@anchor{c-api/exceptions c PyErr_RangedSyntaxLocationObject}@anchor{5550}
@deffn {C Function} void PyErr_RangedSyntaxLocationObject (PyObject *filename, int lineno, int col_offset, int end_lineno, int end_col_offset)

Similar to @ref{554f,,PyErr_SyntaxLocationObject()}, but also sets the
`end_lineno' and `end_col_offset' information for the current exception.


Added in version 3.10.

@end deffn

@geindex PyErr_SyntaxLocationEx (C function)
@anchor{c-api/exceptions c PyErr_SyntaxLocationEx}@anchor{5339}
@deffn {C Function} void PyErr_SyntaxLocationEx (const char *filename, int lineno, int col_offset)
` Part of the @ref{776,,Stable ABI} since version 3.7.'
Like @ref{554f,,PyErr_SyntaxLocationObject()}, but `filename' is a byte string
decoded from the @ref{75e,,filesystem encoding and error handler}.


Added in version 3.2.

@end deffn

@geindex PyErr_SyntaxLocation (C function)
@anchor{c-api/exceptions c PyErr_SyntaxLocation}@anchor{5338}
@deffn {C Function} void PyErr_SyntaxLocation (const char *filename, int lineno)
` Part of the @ref{776,,Stable ABI}.'
Like @ref{5339,,PyErr_SyntaxLocationEx()}, but the `col_offset' parameter is
omitted.
@end deffn

@geindex PyErr_BadInternalCall (C function)
@anchor{c-api/exceptions c PyErr_BadInternalCall}@anchor{532c}
@deffn {C Function} void PyErr_BadInternalCall ()
` Part of the @ref{776,,Stable ABI}.'
This is a shorthand for @code{PyErr_SetString(PyExc_SystemError, message)},
where `message' indicates that an internal operation (e.g. a Python/C API
function) was invoked with an illegal argument.  It is mostly for internal
use.
@end deffn

@geindex PyErr_ProgramTextObject (C function)
@anchor{c-api/exceptions c PyErr_ProgramTextObject}@anchor{5551}
@deffn {C Function} @ref{5df,,PyObject} *PyErr_ProgramTextObject (PyObject *filename, int lineno)

Get the source line in `filename' at line `lineno'. `filename' should be a
Python @ref{16a,,str} object.

On success, this function returns a Python string object with the found line.
On failure, this function returns @code{NULL} without an exception set.
@end deffn

@geindex PyErr_ProgramText (C function)
@anchor{c-api/exceptions c PyErr_ProgramText}@anchor{532f}
@deffn {C Function} @ref{5df,,PyObject} *PyErr_ProgramText (const char *filename, int lineno)
` Part of the @ref{776,,Stable ABI}.'
Similar to @ref{5551,,PyErr_ProgramTextObject()}, but `filename' is a
const char*, which is decoded with the
@ref{75e,,filesystem encoding and error handler}, instead of a
Python object reference.
@end deffn

@node Issuing warnings,Querying the error indicator,Raising exceptions,Exception Handling
@anchor{c-api/exceptions issuing-warnings}@anchor{5552}
@subsection Issuing warnings


Use these functions to issue warnings from C code.  They mirror similar
functions exported by the Python @ref{119,,warnings} module.  They normally
print a warning message to `sys.stderr'; however, it is
also possible that the user has specified that warnings are to be turned into
errors, and in that case they will raise an exception.  It is also possible that
the functions raise an exception because of a problem with the warning machinery.
The return value is @code{0} if no exception is raised, or @code{-1} if an exception
is raised.  (It is not possible to determine whether a warning message is
actually printed, nor what the reason is for the exception; this is
intentional.)  If an exception is raised, the caller should do its normal
exception handling (for example, @ref{791,,Py_DECREF()} owned references and return
an error value).

@geindex PyErr_WarnEx (C function)
@anchor{c-api/exceptions c PyErr_WarnEx}@anchor{1658}
@deffn {C Function} int PyErr_WarnEx (PyObject *category, const char *message, Py_ssize_t stack_level)
` Part of the @ref{776,,Stable ABI}.'
Issue a warning message.  The `category' argument is a warning category (see
below) or @code{NULL}; the `message' argument is a UTF-8 encoded string.  `stack_level' is a
positive number giving a number of stack frames; the warning will be issued from
the  currently executing line of code in that stack frame.  A `stack_level' of 1
is the function calling @ref{1658,,PyErr_WarnEx()}, 2 is  the function above that,
and so forth.

Warning categories must be subclasses of @ref{537d,,PyExc_Warning};
@code{PyExc_Warning} is a subclass of @ref{5351,,PyExc_Exception};
the default warning category is @ref{536d,,PyExc_RuntimeWarning}. The standard
Python warning categories are available as global variables whose names are
enumerated at @ref{5553,,Warning types}.

For information about warning control, see the documentation for the
@ref{119,,warnings} module and the @ref{acb,,-W} option in the command line
documentation.  There is no C API for warning control.
@end deffn

@geindex PyErr_WarnExplicitObject (C function)
@anchor{c-api/exceptions c PyErr_WarnExplicitObject}@anchor{5554}
@deffn {C Function} int PyErr_WarnExplicitObject (PyObject *category, PyObject *message, PyObject *filename, int lineno, PyObject *module, PyObject *registry)

Issue a warning message with explicit control over all warning attributes.  This
is a straightforward wrapper around the Python function
@ref{f03,,warnings.warn_explicit()}; see there for more information.  The `module'
and `registry' arguments may be set to @code{NULL} to get the default effect
described there.


Added in version 3.4.

@end deffn

@geindex PyErr_WarnExplicit (C function)
@anchor{c-api/exceptions c PyErr_WarnExplicit}@anchor{1ad3}
@deffn {C Function} int PyErr_WarnExplicit (PyObject *category, const char *message, const char *filename, int lineno, const char *module, PyObject *registry)
` Part of the @ref{776,,Stable ABI}.'
Similar to @ref{5554,,PyErr_WarnExplicitObject()} except that `message' and
`module' are UTF-8 encoded strings, and `filename' is decoded from the
@ref{75e,,filesystem encoding and error handler}.
@end deffn

@geindex PyErr_WarnFormat (C function)
@anchor{c-api/exceptions c PyErr_WarnFormat}@anchor{533a}
@deffn {C Function} int PyErr_WarnFormat (PyObject *category, Py_ssize_t stack_level, const char *format, ...)
` Part of the @ref{776,,Stable ABI}.'
Function similar to @ref{1658,,PyErr_WarnEx()}, but uses
@ref{62b,,PyUnicode_FromFormat()} to format the warning message.  `format' is
an ASCII-encoded string.


Added in version 3.2.

@end deffn

@geindex PyErr_WarnExplicitFormat (C function)
@anchor{c-api/exceptions c PyErr_WarnExplicitFormat}@anchor{5555}
@deffn {C Function} int PyErr_WarnExplicitFormat (PyObject *category, const char *filename, int lineno, const char *module, PyObject *registry, const char *format, ...)

Similar to @ref{1ad3,,PyErr_WarnExplicit()}, but uses
@ref{62b,,PyUnicode_FromFormat()} to format the warning message. `format' is
an ASCII-encoded string.


Added in version 3.2.

@end deffn

@geindex PyErr_ResourceWarning (C function)
@anchor{c-api/exceptions c PyErr_ResourceWarning}@anchor{f19}
@deffn {C Function} int PyErr_ResourceWarning (PyObject *source, Py_ssize_t stack_level, const char *format, ...)
` Part of the @ref{776,,Stable ABI} since version 3.6.'
Function similar to @ref{533a,,PyErr_WarnFormat()}, but `category' is
@ref{54d,,ResourceWarning} and it passes `source' to @code{warnings.WarningMessage}.


Added in version 3.6.

@end deffn

@node Querying the error indicator,Signal Handling<2>,Issuing warnings,Exception Handling
@anchor{c-api/exceptions querying-the-error-indicator}@anchor{5556}
@subsection Querying the error indicator


@geindex PyErr_Occurred (C function)
@anchor{c-api/exceptions c PyErr_Occurred}@anchor{1cf0}
@deffn {C Function} @ref{5df,,PyObject} *PyErr_Occurred ()
`Return value: Borrowed reference.'` Part of the @ref{776,,Stable ABI}.'
Test whether the error indicator is set.  If set, return the exception `type'
(the first argument to the last call to one of the @code{PyErr_Set*}
functions or to @ref{429,,PyErr_Restore()}).  If not set, return @code{NULL}.  You do not
own a reference to the return value, so you do not need to @ref{791,,Py_DECREF()}
it.

The caller must have an @ref{5231,,attached thread state}.

@cartouche
@quotation Note 
Do not compare the return value to a specific exception; use
@ref{52ae,,PyErr_ExceptionMatches()} instead, shown below.  (The comparison could
easily fail since the exception may be an instance instead of a class, in the
case of a class exception, or it may be a subclass of the expected exception.)
@end quotation
@end cartouche
@end deffn

@geindex PyErr_ExceptionMatches (C function)
@anchor{c-api/exceptions c PyErr_ExceptionMatches}@anchor{52ae}
@deffn {C Function} int PyErr_ExceptionMatches (PyObject *exc)
` Part of the @ref{776,,Stable ABI}.'
Equivalent to @code{PyErr_GivenExceptionMatches(PyErr_Occurred(), exc)}.  This
should only be called when an exception is actually set; a memory access
violation will occur if no exception has been raised.
@end deffn

@geindex PyErr_GivenExceptionMatches (C function)
@anchor{c-api/exceptions c PyErr_GivenExceptionMatches}@anchor{532d}
@deffn {C Function} int PyErr_GivenExceptionMatches (PyObject *given, PyObject *exc)
` Part of the @ref{776,,Stable ABI}.'
Return true if the `given' exception matches the exception type in `exc'.  If
`exc' is a class object, this also returns true when `given' is an instance
of a subclass.  If `exc' is a tuple, all exception types in the tuple (and
recursively in subtuples) are searched for a match.
@end deffn

@geindex PyErr_GetRaisedException (C function)
@anchor{c-api/exceptions c PyErr_GetRaisedException}@anchor{427}
@deffn {C Function} @ref{5df,,PyObject} *PyErr_GetRaisedException (void)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI} since version 3.12.'
Return the exception currently being raised, clearing the error indicator at
the same time. Return @code{NULL} if the error indicator is not set.

This function is used by code that needs to catch exceptions,
or code that needs to save and restore the error indicator temporarily.

For example:

@example
@{
   PyObject *exc = PyErr_GetRaisedException();

   /* ... code that might produce other errors ... */

   PyErr_SetRaisedException(exc);
@}
@end example


@subsubheading See also


@ref{978,,PyErr_GetHandledException()},
to save the exception currently being handled.



Added in version 3.12.

@end deffn

@geindex PyErr_SetRaisedException (C function)
@anchor{c-api/exceptions c PyErr_SetRaisedException}@anchor{42a}
@deffn {C Function} void PyErr_SetRaisedException (PyObject *exc)
` Part of the @ref{776,,Stable ABI} since version 3.12.'
Set `exc' as the exception currently being raised,
clearing the existing exception if one is set.

@cartouche
@quotation Warning 
This call steals a reference to `exc', which must be a valid exception.
@end quotation
@end cartouche


Added in version 3.12.

@end deffn

@geindex PyErr_Fetch (C function)
@anchor{c-api/exceptions c PyErr_Fetch}@anchor{426}
@deffn {C Function} void PyErr_Fetch (PyObject **ptype, PyObject **pvalue, PyObject **ptraceback)
` Part of the @ref{776,,Stable ABI}.'

Deprecated since version 3.12: Use @ref{427,,PyErr_GetRaisedException()} instead.


Retrieve the error indicator into three variables whose addresses are passed.
If the error indicator is not set, set all three variables to @code{NULL}.  If it is
set, it will be cleared and you own a reference to each object retrieved.  The
value and traceback object may be @code{NULL} even when the type object is not.

@cartouche
@quotation Note 
This function is normally only used by legacy code that needs to catch
exceptions or save and restore the error indicator temporarily.

For example:

@example
@{
   PyObject *type, *value, *traceback;
   PyErr_Fetch(&type, &value, &traceback);

   /* ... code that might produce other errors ... */

   PyErr_Restore(type, value, traceback);
@}
@end example
@end quotation
@end cartouche
@end deffn

@geindex PyErr_Restore (C function)
@anchor{c-api/exceptions c PyErr_Restore}@anchor{429}
@deffn {C Function} void PyErr_Restore (PyObject *type, PyObject *value, PyObject *traceback)
` Part of the @ref{776,,Stable ABI}.'

Deprecated since version 3.12: Use @ref{42a,,PyErr_SetRaisedException()} instead.


Set the error indicator from the three objects,
`type', `value', and `traceback',
clearing the existing exception if one is set.
If the objects are @code{NULL}, the error
indicator is cleared.  Do not pass a @code{NULL} type and non-@code{NULL} value or
traceback.  The exception type should be a class.  Do not pass an invalid
exception type or value. (Violating these rules will cause subtle problems
later.)  This call takes away a reference to each object: you must own a
reference to each object before the call and after the call you no longer own
these references.  (If you don’t understand this, don’t use this function.  I
warned you.)

@cartouche
@quotation Note 
This function is normally only used by legacy code that needs to
save and restore the error indicator temporarily.
Use @ref{426,,PyErr_Fetch()} to save the current error indicator.
@end quotation
@end cartouche
@end deffn

@geindex PyErr_NormalizeException (C function)
@anchor{c-api/exceptions c PyErr_NormalizeException}@anchor{428}
@deffn {C Function} void PyErr_NormalizeException (PyObject **exc, PyObject **val, PyObject **tb)
` Part of the @ref{776,,Stable ABI}.'

Deprecated since version 3.12: Use @ref{427,,PyErr_GetRaisedException()} instead,
to avoid any possible de-normalization.


Under certain circumstances, the values returned by @ref{426,,PyErr_Fetch()} below
can be “unnormalized”, meaning that @code{*exc} is a class object but @code{*val} is
not an instance of the  same class.  This function can be used to instantiate
the class in that case.  If the values are already normalized, nothing happens.
The delayed normalization is implemented to improve performance.

@cartouche
@quotation Note 
This function `does not' implicitly set the
@ref{14d2,,__traceback__}
attribute on the exception value. If setting the traceback
appropriately is desired, the following additional snippet is needed:

@example
if (tb != NULL) @{
  PyException_SetTraceback(val, tb);
@}
@end example
@end quotation
@end cartouche
@end deffn

@geindex PyErr_GetHandledException (C function)
@anchor{c-api/exceptions c PyErr_GetHandledException}@anchor{978}
@deffn {C Function} @ref{5df,,PyObject} *PyErr_GetHandledException (void)
` Part of the @ref{776,,Stable ABI} since version 3.11.'
Retrieve the active exception instance, as would be returned by @ref{89d,,sys.exception()}.
This refers to an exception that was `already caught', not to an exception that was
freshly raised. Returns a new reference to the exception or @code{NULL}.
Does not modify the interpreter’s exception state.

@cartouche
@quotation Note 
This function is not normally used by code that wants to handle exceptions.
Rather, it can be used when code needs to save and restore the exception
state temporarily.  Use @ref{979,,PyErr_SetHandledException()} to restore or
clear the exception state.
@end quotation
@end cartouche


Added in version 3.11.

@end deffn

@geindex PyErr_SetHandledException (C function)
@anchor{c-api/exceptions c PyErr_SetHandledException}@anchor{979}
@deffn {C Function} void PyErr_SetHandledException (PyObject *exc)
` Part of the @ref{776,,Stable ABI} since version 3.11.'
Set the active exception, as known from @code{sys.exception()}.  This refers
to an exception that was `already caught', not to an exception that was
freshly raised.
To clear the exception state, pass @code{NULL}.

@cartouche
@quotation Note 
This function is not normally used by code that wants to handle exceptions.
Rather, it can be used when code needs to save and restore the exception
state temporarily.  Use @ref{978,,PyErr_GetHandledException()} to get the exception
state.
@end quotation
@end cartouche


Added in version 3.11.

@end deffn

@geindex PyErr_GetExcInfo (C function)
@anchor{c-api/exceptions c PyErr_GetExcInfo}@anchor{97b}
@deffn {C Function} void PyErr_GetExcInfo (PyObject **ptype, PyObject **pvalue, PyObject **ptraceback)
` Part of the @ref{776,,Stable ABI} since version 3.7.'
Retrieve the old-style representation of the exception info, as known from
@ref{89c,,sys.exc_info()}.  This refers to an exception that was `already caught',
not to an exception that was freshly raised.  Returns new references for the
three objects, any of which may be @code{NULL}.  Does not modify the exception
info state.  This function is kept for backwards compatibility. Prefer using
@ref{978,,PyErr_GetHandledException()}.

@cartouche
@quotation Note 
This function is not normally used by code that wants to handle exceptions.
Rather, it can be used when code needs to save and restore the exception
state temporarily.  Use @ref{97a,,PyErr_SetExcInfo()} to restore or clear the
exception state.
@end quotation
@end cartouche


Added in version 3.3.

@end deffn

@geindex PyErr_SetExcInfo (C function)
@anchor{c-api/exceptions c PyErr_SetExcInfo}@anchor{97a}
@deffn {C Function} void PyErr_SetExcInfo (PyObject *type, PyObject *value, PyObject *traceback)
` Part of the @ref{776,,Stable ABI} since version 3.7.'
Set the exception info, as known from @code{sys.exc_info()}.  This refers
to an exception that was `already caught', not to an exception that was
freshly raised.  This function steals the references of the arguments.
To clear the exception state, pass @code{NULL} for all three arguments.
This function is kept for backwards compatibility. Prefer using
@ref{979,,PyErr_SetHandledException()}.

@cartouche
@quotation Note 
This function is not normally used by code that wants to handle exceptions.
Rather, it can be used when code needs to save and restore the exception
state temporarily.  Use @ref{97b,,PyErr_GetExcInfo()} to read the exception
state.
@end quotation
@end cartouche


Added in version 3.3.



Changed in version 3.11: The @code{type} and @code{traceback} arguments are no longer used and
can be NULL. The interpreter now derives them from the exception
instance (the @code{value} argument). The function still steals
references of all three arguments.

@end deffn

@node Signal Handling<2>,Exception Classes,Querying the error indicator,Exception Handling
@anchor{c-api/exceptions signal-handling}@anchor{5557}
@subsection Signal Handling


@geindex PyErr_CheckSignals (C function)
@anchor{c-api/exceptions c PyErr_CheckSignals}@anchor{694}
@deffn {C Function} int PyErr_CheckSignals ()
` Part of the @ref{776,,Stable ABI}.'
@geindex module; signal
@geindex SIGINT (C macro)
@geindex KeyboardInterrupt (built-in exception)

Handle external interruptions, such as signals or activating a debugger,
whose processing has been delayed until it is safe
to run Python code and/or raise exceptions.

For example, pressing @code{Ctrl}-@code{C} causes a terminal to send the
@ref{255,,signal.SIGINT} signal.
This function executes the corresponding Python signal handler, which,
by default, raises the @ref{bcb,,KeyboardInterrupt} exception.

@code{PyErr_CheckSignals()} should be called by long-running C code
frequently enough so that the response appears immediate to humans.

Handlers invoked by this function currently include:


@itemize -

@item 
Signal handlers, including Python functions registered using
the @ref{cb,,signal} module.

Signal handlers are only run in the main thread of the main interpreter.

(This is where the function got the name: originally, signals
were the only way to interrupt the interpreter.)

@item 
Running the garbage collector, if necessary.

@item 
Executing a pending @ref{4c86,,remote debugger} script.
@end itemize

If any handler raises an exception, immediately return @code{-1} with that
exception set.
Any remaining interruptions are left to be processed on the next
@ref{694,,PyErr_CheckSignals()} invocation, if appropriate.

If all handlers finish successfully, or there are no handlers to run,
return @code{0}.


Changed in version 3.12: This function may now invoke the garbage collector.



Changed in version 3.14: This function may now execute a remote debugger script, if remote
debugging is enabled.

@end deffn

@geindex PyErr_SetInterrupt (C function)
@anchor{c-api/exceptions c PyErr_SetInterrupt}@anchor{5336}
@deffn {C Function} void PyErr_SetInterrupt ()
` Part of the @ref{776,,Stable ABI}.'
@geindex module; signal
@geindex SIGINT (C macro)
@geindex KeyboardInterrupt (built-in exception)

Simulate the effect of a @code{SIGINT} signal arriving.
This is equivalent to @code{PyErr_SetInterruptEx(SIGINT)}.

@cartouche
@quotation Note 
This function is async-signal-safe.  It can be called without
an @ref{5231,,attached thread state} and from a C signal handler.
@end quotation
@end cartouche
@end deffn

@geindex PyErr_SetInterruptEx (C function)
@anchor{c-api/exceptions c PyErr_SetInterruptEx}@anchor{aa4}
@deffn {C Function} int PyErr_SetInterruptEx (int signum)
` Part of the @ref{776,,Stable ABI} since version 3.10.'
@geindex module; signal
@geindex KeyboardInterrupt (built-in exception)

Simulate the effect of a signal arriving. The next time
@ref{694,,PyErr_CheckSignals()} is called,  the Python signal handler for
the given signal number will be called.

This function can be called by C code that sets up its own signal handling
and wants Python signal handlers to be invoked as expected when an
interruption is requested (for example when the user presses Ctrl-C
to interrupt an operation).

If the given signal isn’t handled by Python (it was set to
@ref{1bf5,,signal.SIG_DFL} or @ref{1bf4,,signal.SIG_IGN}), it will be ignored.

If `signum' is outside of the allowed range of signal numbers, @code{-1}
is returned.  Otherwise, @code{0} is returned.  The error indicator is
never changed by this function.

@cartouche
@quotation Note 
This function is async-signal-safe.  It can be called without
an @ref{5231,,attached thread state} and from a C signal handler.
@end quotation
@end cartouche


Added in version 3.10.

@end deffn

@geindex PySignal_SetWakeupFd (C function)
@anchor{c-api/exceptions c PySignal_SetWakeupFd}@anchor{15e7}
@deffn {C Function} int PySignal_SetWakeupFd (int fd)

This utility function specifies a file descriptor to which the signal number
is written as a single byte whenever a signal is received. `fd' must be
non-blocking. It returns the previous such file descriptor.

The value @code{-1} disables the feature; this is the initial state.
This is equivalent to @ref{d6d,,signal.set_wakeup_fd()} in Python, but without any
error checking.  `fd' should be a valid file descriptor.  The function should
only be called from the main thread.


Changed in version 3.5: On Windows, the function now also supports socket handles.

@end deffn

@node Exception Classes,Exception Objects,Signal Handling<2>,Exception Handling
@anchor{c-api/exceptions exception-classes}@anchor{5558}
@subsection Exception Classes


@geindex PyErr_NewException (C function)
@anchor{c-api/exceptions c PyErr_NewException}@anchor{1475}
@deffn {C Function} @ref{5df,,PyObject} *PyErr_NewException (const char *name, PyObject *base, PyObject *dict)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
This utility function creates and returns a new exception class. The `name'
argument must be the name of the new exception, a C string of the form
@code{module.classname}.  The `base' and `dict' arguments are normally @code{NULL}.
This creates a class object derived from @ref{bd3,,Exception} (accessible in C as
@ref{5351,,PyExc_Exception}).

The @ref{617,,__module__} attribute of the new class is set to the first part (up
to the last dot) of the `name' argument, and the class name is set to the last
part (after the last dot).  The `base' argument can be used to specify alternate
base classes; it can either be only one class or a tuple of classes. The `dict'
argument can be used to specify a dictionary of class variables and methods.
@end deffn

@geindex PyErr_NewExceptionWithDoc (C function)
@anchor{c-api/exceptions c PyErr_NewExceptionWithDoc}@anchor{1474}
@deffn {C Function} @ref{5df,,PyObject} *PyErr_NewExceptionWithDoc (const char *name, const char *doc, PyObject *base, PyObject *dict)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Same as @ref{1475,,PyErr_NewException()}, except that the new exception class can
easily be given a docstring: If `doc' is non-@code{NULL}, it will be used as the
docstring for the exception class.


Added in version 3.2.

@end deffn

@geindex PyExceptionClass_Check (C function)
@anchor{c-api/exceptions c PyExceptionClass_Check}@anchor{5559}
@deffn {C Function} int PyExceptionClass_Check (PyObject *ob)

Return non-zero if `ob' is an exception class, zero otherwise. This function always succeeds.
@end deffn

@geindex PyExceptionClass_Name (C function)
@anchor{c-api/exceptions c PyExceptionClass_Name}@anchor{c61}
@deffn {C Function} const char *PyExceptionClass_Name (PyObject *ob)
` Part of the @ref{776,,Stable ABI} since version 3.8.'
Return @ref{1cf1,,tp_name} of the exception class `ob'.
@end deffn

@node Exception Objects,Unicode Exception Objects,Exception Classes,Exception Handling
@anchor{c-api/exceptions exception-objects}@anchor{555a}
@subsection Exception Objects


@geindex PyExceptionInstance_Check (C function)
@anchor{c-api/exceptions c PyExceptionInstance_Check}@anchor{555b}
@deffn {C Function} int PyExceptionInstance_Check (PyObject *op)

Return true if `op' is an instance of @ref{7d8,,BaseException}, false
otherwise. This function always succeeds.
@end deffn

@geindex PyExceptionInstance_Class (C macro)
@anchor{c-api/exceptions c PyExceptionInstance_Class}@anchor{555c}
@deffn {C Macro} PyExceptionInstance_Class (op)

Equivalent to @ref{3c7,,Py_TYPE(op)}.
@end deffn

@geindex PyException_GetTraceback (C function)
@anchor{c-api/exceptions c PyException_GetTraceback}@anchor{5381}
@deffn {C Function} @ref{5df,,PyObject} *PyException_GetTraceback (PyObject *ex)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Return the traceback associated with the exception as a new reference, as
accessible from Python through the @ref{14d2,,__traceback__}
attribute. If there is no
traceback associated, this returns @code{NULL}.
@end deffn

@geindex PyException_SetTraceback (C function)
@anchor{c-api/exceptions c PyException_SetTraceback}@anchor{1e10}
@deffn {C Function} int PyException_SetTraceback (PyObject *ex, PyObject *tb)
` Part of the @ref{776,,Stable ABI}.'
Set the traceback associated with the exception to `tb'.  Use @code{Py_None} to
clear it.
@end deffn

@geindex PyException_GetContext (C function)
@anchor{c-api/exceptions c PyException_GetContext}@anchor{5380}
@deffn {C Function} @ref{5df,,PyObject} *PyException_GetContext (PyObject *ex)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Return the context (another exception instance during whose handling `ex' was
raised) associated with the exception as a new reference, as accessible from
Python through the @ref{14d3,,__context__} attribute.
If there is no context associated, this returns @code{NULL}.
@end deffn

@geindex PyException_SetContext (C function)
@anchor{c-api/exceptions c PyException_SetContext}@anchor{5383}
@deffn {C Function} void PyException_SetContext (PyObject *ex, PyObject *ctx)
` Part of the @ref{776,,Stable ABI}.'
Set the context associated with the exception to `ctx'.  Use @code{NULL} to clear
it.  There is no type check to make sure that `ctx' is an exception instance.
This steals a reference to `ctx'.
@end deffn

@geindex PyException_GetCause (C function)
@anchor{c-api/exceptions c PyException_GetCause}@anchor{537f}
@deffn {C Function} @ref{5df,,PyObject} *PyException_GetCause (PyObject *ex)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Return the cause (either an exception instance, or @code{None},
set by @code{raise ... from ...}) associated with the exception as a new
reference, as accessible from Python through the
@ref{14d4,,__cause__} attribute.
@end deffn

@geindex PyException_SetCause (C function)
@anchor{c-api/exceptions c PyException_SetCause}@anchor{5382}
@deffn {C Function} void PyException_SetCause (PyObject *ex, PyObject *cause)
` Part of the @ref{776,,Stable ABI}.'
Set the cause associated with the exception to `cause'.  Use @code{NULL} to clear
it.  There is no type check to make sure that `cause' is either an exception
instance or @code{None}.  This steals a reference to `cause'.

The @ref{255b,,__suppress_context__} attribute is implicitly set
to @code{True} by this function.
@end deffn

@geindex PyException_GetArgs (C function)
@anchor{c-api/exceptions c PyException_GetArgs}@anchor{78c}
@deffn {C Function} @ref{5df,,PyObject} *PyException_GetArgs (PyObject *ex)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI} since version 3.12.'
Return @ref{78e,,args} of exception `ex'.
@end deffn

@geindex PyException_SetArgs (C function)
@anchor{c-api/exceptions c PyException_SetArgs}@anchor{78d}
@deffn {C Function} void PyException_SetArgs (PyObject *ex, PyObject *args)
` Part of the @ref{776,,Stable ABI} since version 3.12.'
Set @ref{78e,,args} of exception `ex' to `args'.
@end deffn

@geindex PyUnstable_Exc_PrepReraiseStar (C function)
@anchor{c-api/exceptions c PyUnstable_Exc_PrepReraiseStar}@anchor{555d}
@deffn {C Function} @ref{5df,,PyObject} *PyUnstable_Exc_PrepReraiseStar (PyObject *orig, PyObject *excs)

@cartouche
@quotation This is Unstable API. It may change without warning in minor releases. `This is @ref{76a,,Unstable API}. It may change without warning in minor releases.'
@end quotation
@end cartouche

Implement part of the interpreter’s implementation of @code{except*}.
`orig' is the original exception that was caught, and `excs' is the list of
the exceptions that need to be raised. This list contains the unhandled
part of `orig', if any, as well as the exceptions that were raised from the
@code{except*} clauses (so they have a different traceback from `orig') and
those that were reraised (and have the same traceback as `orig').
Return the @ref{4d3,,ExceptionGroup} that needs to be reraised in the end, or
@code{None} if there is nothing to reraise.


Added in version 3.12.

@end deffn

@node Unicode Exception Objects,Recursion Control,Exception Objects,Exception Handling
@anchor{c-api/exceptions unicode-exception-objects}@anchor{555e}@anchor{c-api/exceptions unicodeexceptions}@anchor{45f}
@subsection Unicode Exception Objects


The following functions are used to create and modify Unicode exceptions from C.

@geindex PyUnicodeDecodeError_Create (C function)
@anchor{c-api/exceptions c PyUnicodeDecodeError_Create}@anchor{543d}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicodeDecodeError_Create (const char *encoding, const char *object, Py_ssize_t length, Py_ssize_t start, Py_ssize_t end, const char *reason)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Create a @ref{c0e,,UnicodeDecodeError} object with the attributes `encoding',
`object', `length', `start', `end' and `reason'. `encoding' and `reason' are
UTF-8 encoded strings.
@end deffn

@geindex PyUnicodeDecodeError_GetEncoding (C function)
@geindex PyUnicodeEncodeError_GetEncoding (C function)
@anchor{c-api/exceptions c PyUnicodeDecodeError_GetEncoding}@anchor{543e}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicodeDecodeError_GetEncoding (PyObject *exc)
@anchor{c-api/exceptions c PyUnicodeEncodeError_GetEncoding}@anchor{5446}
@deffnx {C Function} @ref{5df,,PyObject} *PyUnicodeEncodeError_GetEncoding (PyObject *exc)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Return the `encoding' attribute of the given exception object.
@end deffn

@geindex PyUnicodeDecodeError_GetObject (C function)
@geindex PyUnicodeEncodeError_GetObject (C function)
@geindex PyUnicodeTranslateError_GetObject (C function)
@anchor{c-api/exceptions c PyUnicodeDecodeError_GetObject}@anchor{5440}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicodeDecodeError_GetObject (PyObject *exc)
@anchor{c-api/exceptions c PyUnicodeEncodeError_GetObject}@anchor{5447}
@deffnx {C Function} @ref{5df,,PyObject} *PyUnicodeEncodeError_GetObject (PyObject *exc)
@anchor{c-api/exceptions c PyUnicodeTranslateError_GetObject}@anchor{544e}
@deffnx {C Function} @ref{5df,,PyObject} *PyUnicodeTranslateError_GetObject (PyObject *exc)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Return the `object' attribute of the given exception object.
@end deffn

@geindex PyUnicodeDecodeError_GetStart (C function)
@geindex PyUnicodeEncodeError_GetStart (C function)
@geindex PyUnicodeTranslateError_GetStart (C function)
@anchor{c-api/exceptions c PyUnicodeDecodeError_GetStart}@anchor{5442}
@deffn {C Function} int PyUnicodeDecodeError_GetStart (PyObject *exc, Py_ssize_t *start)
@anchor{c-api/exceptions c PyUnicodeEncodeError_GetStart}@anchor{1943}
@deffnx {C Function} int PyUnicodeEncodeError_GetStart (PyObject *exc, Py_ssize_t *start)
@anchor{c-api/exceptions c PyUnicodeTranslateError_GetStart}@anchor{5450}
@deffnx {C Function} int PyUnicodeTranslateError_GetStart (PyObject *exc, Py_ssize_t *start)
` Part of the @ref{776,,Stable ABI}.'
Get the `start' attribute of the given exception object and place it into
`*start'.  `start' must not be @code{NULL}.  Return @code{0} on success, @code{-1} on
failure.

If the @ref{1941,,UnicodeError.object} is an empty sequence, the resulting
`start' is @code{0}. Otherwise, it is clipped to @code{[0, len(object) - 1]}.


@subsubheading See also


@ref{1906,,UnicodeError.start}

@end deffn

@geindex PyUnicodeDecodeError_SetStart (C function)
@geindex PyUnicodeEncodeError_SetStart (C function)
@geindex PyUnicodeTranslateError_SetStart (C function)
@anchor{c-api/exceptions c PyUnicodeDecodeError_SetStart}@anchor{5445}
@deffn {C Function} int PyUnicodeDecodeError_SetStart (PyObject *exc, Py_ssize_t start)
@anchor{c-api/exceptions c PyUnicodeEncodeError_SetStart}@anchor{544b}
@deffnx {C Function} int PyUnicodeEncodeError_SetStart (PyObject *exc, Py_ssize_t start)
@anchor{c-api/exceptions c PyUnicodeTranslateError_SetStart}@anchor{5453}
@deffnx {C Function} int PyUnicodeTranslateError_SetStart (PyObject *exc, Py_ssize_t start)
` Part of the @ref{776,,Stable ABI}.'
Set the `start' attribute of the given exception object to `start'.
Return @code{0} on success, @code{-1} on failure.

@cartouche
@quotation Note 
While passing a negative `start' does not raise an exception,
the corresponding getters will not consider it as a relative
offset.
@end quotation
@end cartouche
@end deffn

@geindex PyUnicodeDecodeError_GetEnd (C function)
@geindex PyUnicodeEncodeError_GetEnd (C function)
@geindex PyUnicodeTranslateError_GetEnd (C function)
@anchor{c-api/exceptions c PyUnicodeDecodeError_GetEnd}@anchor{543f}
@deffn {C Function} int PyUnicodeDecodeError_GetEnd (PyObject *exc, Py_ssize_t *end)
@anchor{c-api/exceptions c PyUnicodeEncodeError_GetEnd}@anchor{1940}
@deffnx {C Function} int PyUnicodeEncodeError_GetEnd (PyObject *exc, Py_ssize_t *end)
@anchor{c-api/exceptions c PyUnicodeTranslateError_GetEnd}@anchor{544d}
@deffnx {C Function} int PyUnicodeTranslateError_GetEnd (PyObject *exc, Py_ssize_t *end)
` Part of the @ref{776,,Stable ABI}.'
Get the `end' attribute of the given exception object and place it into
`*end'.  `end' must not be @code{NULL}.  Return @code{0} on success, @code{-1} on
failure.

If the @ref{1941,,UnicodeError.object} is an empty sequence, the resulting
`end' is @code{0}. Otherwise, it is clipped to @code{[1, len(object)]}.
@end deffn

@geindex PyUnicodeDecodeError_SetEnd (C function)
@geindex PyUnicodeEncodeError_SetEnd (C function)
@geindex PyUnicodeTranslateError_SetEnd (C function)
@anchor{c-api/exceptions c PyUnicodeDecodeError_SetEnd}@anchor{5443}
@deffn {C Function} int PyUnicodeDecodeError_SetEnd (PyObject *exc, Py_ssize_t end)
@anchor{c-api/exceptions c PyUnicodeEncodeError_SetEnd}@anchor{5449}
@deffnx {C Function} int PyUnicodeEncodeError_SetEnd (PyObject *exc, Py_ssize_t end)
@anchor{c-api/exceptions c PyUnicodeTranslateError_SetEnd}@anchor{5451}
@deffnx {C Function} int PyUnicodeTranslateError_SetEnd (PyObject *exc, Py_ssize_t end)
` Part of the @ref{776,,Stable ABI}.'
Set the `end' attribute of the given exception object to `end'.  Return @code{0}
on success, @code{-1} on failure.


@subsubheading See also


@ref{1907,,UnicodeError.end}

@end deffn

@geindex PyUnicodeDecodeError_GetReason (C function)
@geindex PyUnicodeEncodeError_GetReason (C function)
@geindex PyUnicodeTranslateError_GetReason (C function)
@anchor{c-api/exceptions c PyUnicodeDecodeError_GetReason}@anchor{5441}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicodeDecodeError_GetReason (PyObject *exc)
@anchor{c-api/exceptions c PyUnicodeEncodeError_GetReason}@anchor{5448}
@deffnx {C Function} @ref{5df,,PyObject} *PyUnicodeEncodeError_GetReason (PyObject *exc)
@anchor{c-api/exceptions c PyUnicodeTranslateError_GetReason}@anchor{544f}
@deffnx {C Function} @ref{5df,,PyObject} *PyUnicodeTranslateError_GetReason (PyObject *exc)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Return the `reason' attribute of the given exception object.
@end deffn

@geindex PyUnicodeDecodeError_SetReason (C function)
@geindex PyUnicodeEncodeError_SetReason (C function)
@geindex PyUnicodeTranslateError_SetReason (C function)
@anchor{c-api/exceptions c PyUnicodeDecodeError_SetReason}@anchor{5444}
@deffn {C Function} int PyUnicodeDecodeError_SetReason (PyObject *exc, const char *reason)
@anchor{c-api/exceptions c PyUnicodeEncodeError_SetReason}@anchor{544a}
@deffnx {C Function} int PyUnicodeEncodeError_SetReason (PyObject *exc, const char *reason)
@anchor{c-api/exceptions c PyUnicodeTranslateError_SetReason}@anchor{5452}
@deffnx {C Function} int PyUnicodeTranslateError_SetReason (PyObject *exc, const char *reason)
` Part of the @ref{776,,Stable ABI}.'
Set the `reason' attribute of the given exception object to `reason'.  Return
@code{0} on success, @code{-1} on failure.
@end deffn

@node Recursion Control,Exception and warning types,Unicode Exception Objects,Exception Handling
@anchor{c-api/exceptions recursion}@anchor{555f}@anchor{c-api/exceptions recursion-control}@anchor{5560}
@subsection Recursion Control


These two functions provide a way to perform safe recursive calls at the C
level, both in the core and in extension modules.  They are needed if the
recursive code does not necessarily invoke Python code (which tracks its
recursion depth automatically).
They are also not needed for `tp_call' implementations
because the @ref{7a4,,call protocol} takes care of recursion handling.

@geindex Py_EnterRecursiveCall (C function)
@anchor{c-api/exceptions c Py_EnterRecursiveCall}@anchor{3d0}
@deffn {C Function} int Py_EnterRecursiveCall (const char *where)
` Part of the @ref{776,,Stable ABI} since version 3.9.'
Marks a point where a recursive C-level call is about to be performed.

The function then checks if the stack limit is reached.  If this is the
case, a @ref{f6e,,RecursionError} is set and a nonzero value is returned.
Otherwise, zero is returned.

`where' should be a UTF-8 encoded string such as @code{" in instance check"} to
be concatenated to the @ref{f6e,,RecursionError} message caused by the recursion
depth limit.


@subsubheading See also


The @ref{464,,PyUnstable_ThreadState_SetStackProtection()} function.



Changed in version 3.9: This function is now also available in the @ref{637,,limited API}.

@end deffn

@geindex Py_LeaveRecursiveCall (C function)
@anchor{c-api/exceptions c Py_LeaveRecursiveCall}@anchor{b71}
@deffn {C Function} void Py_LeaveRecursiveCall (void)
` Part of the @ref{776,,Stable ABI} since version 3.9.'
Ends a @ref{3d0,,Py_EnterRecursiveCall()}.  Must be called once for each
`successful' invocation of @code{Py_EnterRecursiveCall()}.


Changed in version 3.9: This function is now also available in the @ref{637,,limited API}.

@end deffn

Properly implementing @ref{5244,,tp_repr} for container types requires
special recursion handling.  In addition to protecting the stack,
@code{tp_repr} also needs to track objects to prevent cycles.  The
following two functions facilitate this functionality.  Effectively,
these are the C equivalent to @ref{13ff,,reprlib.recursive_repr()}.

@geindex Py_ReprEnter (C function)
@anchor{c-api/exceptions c Py_ReprEnter}@anchor{5495}
@deffn {C Function} int Py_ReprEnter (PyObject *object)
` Part of the @ref{776,,Stable ABI}.'
Called at the beginning of the @ref{5244,,tp_repr} implementation to
detect cycles.

If the object has already been processed, the function returns a
positive integer.  In that case the @ref{5244,,tp_repr} implementation
should return a string object indicating a cycle.  As examples,
@ref{184,,dict} objects return @code{@{...@}} and @ref{24f,,list} objects
return @code{[...]}.

The function will return a negative integer if the recursion limit
is reached.  In that case the @ref{5244,,tp_repr} implementation should
typically return @code{NULL}.

Otherwise, the function returns zero and the @ref{5244,,tp_repr}
implementation can continue normally.
@end deffn

@geindex Py_ReprLeave (C function)
@anchor{c-api/exceptions c Py_ReprLeave}@anchor{5496}
@deffn {C Function} void Py_ReprLeave (PyObject *object)
` Part of the @ref{776,,Stable ABI}.'
Ends a @ref{5495,,Py_ReprEnter()}.  Must be called once for each
invocation of @code{Py_ReprEnter()} that returns zero.
@end deffn

@geindex Py_GetRecursionLimit (C function)
@anchor{c-api/exceptions c Py_GetRecursionLimit}@anchor{5490}
@deffn {C Function} int Py_GetRecursionLimit (void)
` Part of the @ref{776,,Stable ABI}.'
Get the recursion limit for the current interpreter. It can be set with
@ref{5497,,Py_SetRecursionLimit()}. The recursion limit prevents the
Python interpreter stack from growing infinitely.

This function cannot fail, and the caller must hold an
@ref{5231,,attached thread state}.


@subsubheading See also


@ref{6ec,,sys.getrecursionlimit()}

@end deffn

@geindex Py_SetRecursionLimit (C function)
@anchor{c-api/exceptions c Py_SetRecursionLimit}@anchor{5497}
@deffn {C Function} void Py_SetRecursionLimit (int new_limit)
` Part of the @ref{776,,Stable ABI}.'
Set the recursion limit for the current interpreter.

This function cannot fail, and the caller must hold an
@ref{5231,,attached thread state}.


@subsubheading See also


@ref{6eb,,sys.setrecursionlimit()}

@end deffn

@node Exception and warning types,Tracebacks,Recursion Control,Exception Handling
@anchor{c-api/exceptions exception-and-warning-types}@anchor{5561}@anchor{c-api/exceptions standardexceptions}@anchor{5562}
@subsection Exception and warning types


All standard Python exceptions and warning categories are available as global
variables whose names are @code{PyExc_} followed by the Python exception name.
These have the type @ref{5df,,PyObject}*; they are all class objects.

For completeness, here are all the variables:

@menu
* Exception types:: 
* OSError aliases:: 
* Warning types:: 

@end menu

@node Exception types,OSError aliases,,Exception and warning types
@anchor{c-api/exceptions exception-types}@anchor{5563}
@subsubsection Exception types



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

C name

@tab

Python name

@item

@geindex PyExc_BaseException (C var)
@anchor{c-api/exceptions c PyExc_BaseException}@anchor{5342}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_BaseException
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@tab

@ref{7d8,,BaseException}

@item

@geindex PyExc_BaseExceptionGroup (C var)
@anchor{c-api/exceptions c PyExc_BaseExceptionGroup}@anchor{5343}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_BaseExceptionGroup
` Part of the @ref{776,,Stable ABI} since version 3.11.'
@end deffn

@tab

@ref{566,,BaseExceptionGroup}

@item

@geindex PyExc_Exception (C var)
@anchor{c-api/exceptions c PyExc_Exception}@anchor{5351}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_Exception
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@tab

@ref{bd3,,Exception}

@item

@geindex PyExc_ArithmeticError (C var)
@anchor{c-api/exceptions c PyExc_ArithmeticError}@anchor{533f}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_ArithmeticError
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@tab

@ref{272f,,ArithmeticError}

@item

@geindex PyExc_AssertionError (C var)
@anchor{c-api/exceptions c PyExc_AssertionError}@anchor{5340}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_AssertionError
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@tab

@ref{8ba,,AssertionError}

@item

@geindex PyExc_AttributeError (C var)
@anchor{c-api/exceptions c PyExc_AttributeError}@anchor{5341}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_AttributeError
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@tab

@ref{5f0,,AttributeError}

@item

@geindex PyExc_BlockingIOError (C var)
@anchor{c-api/exceptions c PyExc_BlockingIOError}@anchor{5344}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_BlockingIOError
` Part of the @ref{776,,Stable ABI} since version 3.7.'
@end deffn

@tab

@ref{237,,BlockingIOError}

@item

@geindex PyExc_BrokenPipeError (C var)
@anchor{c-api/exceptions c PyExc_BrokenPipeError}@anchor{5345}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_BrokenPipeError
` Part of the @ref{776,,Stable ABI} since version 3.7.'
@end deffn

@tab

@ref{1262,,BrokenPipeError}

@item

@geindex PyExc_BufferError (C var)
@anchor{c-api/exceptions c PyExc_BufferError}@anchor{5346}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_BufferError
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@tab

@ref{17e9,,BufferError}

@item

@geindex PyExc_ChildProcessError (C var)
@anchor{c-api/exceptions c PyExc_ChildProcessError}@anchor{5348}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_ChildProcessError
` Part of the @ref{776,,Stable ABI} since version 3.7.'
@end deffn

@tab

@ref{125e,,ChildProcessError}

@item

@geindex PyExc_ConnectionAbortedError (C var)
@anchor{c-api/exceptions c PyExc_ConnectionAbortedError}@anchor{5349}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_ConnectionAbortedError
` Part of the @ref{776,,Stable ABI} since version 3.7.'
@end deffn

@tab

@ref{1263,,ConnectionAbortedError}

@item

@geindex PyExc_ConnectionError (C var)
@anchor{c-api/exceptions c PyExc_ConnectionError}@anchor{534a}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_ConnectionError
` Part of the @ref{776,,Stable ABI} since version 3.7.'
@end deffn

@tab

@ref{1011,,ConnectionError}

@item

@geindex PyExc_ConnectionRefusedError (C var)
@anchor{c-api/exceptions c PyExc_ConnectionRefusedError}@anchor{534b}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_ConnectionRefusedError
` Part of the @ref{776,,Stable ABI} since version 3.7.'
@end deffn

@tab

@ref{1264,,ConnectionRefusedError}

@item

@geindex PyExc_ConnectionResetError (C var)
@anchor{c-api/exceptions c PyExc_ConnectionResetError}@anchor{534c}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_ConnectionResetError
` Part of the @ref{776,,Stable ABI} since version 3.7.'
@end deffn

@tab

@ref{1265,,ConnectionResetError}

@item

@geindex PyExc_EOFError (C var)
@anchor{c-api/exceptions c PyExc_EOFError}@anchor{534e}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_EOFError
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@tab

@ref{14e5,,EOFError}

@item

@geindex PyExc_FileExistsError (C var)
@anchor{c-api/exceptions c PyExc_FileExistsError}@anchor{5352}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_FileExistsError
` Part of the @ref{776,,Stable ABI} since version 3.7.'
@end deffn

@tab

@ref{1226,,FileExistsError}

@item

@geindex PyExc_FileNotFoundError (C var)
@anchor{c-api/exceptions c PyExc_FileNotFoundError}@anchor{5353}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_FileNotFoundError
` Part of the @ref{776,,Stable ABI} since version 3.7.'
@end deffn

@tab

@ref{266,,FileNotFoundError}

@item

@geindex PyExc_FloatingPointError (C var)
@anchor{c-api/exceptions c PyExc_FloatingPointError}@anchor{5354}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_FloatingPointError
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@tab

@ref{2730,,FloatingPointError}

@item

@geindex PyExc_GeneratorExit (C var)
@anchor{c-api/exceptions c PyExc_GeneratorExit}@anchor{5356}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_GeneratorExit
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@tab

@ref{15d3,,GeneratorExit}

@item

@geindex PyExc_ImportError (C var)
@anchor{c-api/exceptions c PyExc_ImportError}@anchor{5358}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_ImportError
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@tab

@ref{65b,,ImportError}

@item

@geindex PyExc_IndentationError (C var)
@anchor{c-api/exceptions c PyExc_IndentationError}@anchor{535a}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_IndentationError
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@tab

@ref{9b1,,IndentationError}

@item

@geindex PyExc_IndexError (C var)
@anchor{c-api/exceptions c PyExc_IndexError}@anchor{535b}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_IndexError
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@tab

@ref{1741,,IndexError}

@item

@geindex PyExc_InterruptedError (C var)
@anchor{c-api/exceptions c PyExc_InterruptedError}@anchor{535c}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_InterruptedError
` Part of the @ref{776,,Stable ABI} since version 3.7.'
@end deffn

@tab

@ref{f8e,,InterruptedError}

@item

@geindex PyExc_IsADirectoryError (C var)
@anchor{c-api/exceptions c PyExc_IsADirectoryError}@anchor{535d}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_IsADirectoryError
` Part of the @ref{776,,Stable ABI} since version 3.7.'
@end deffn

@tab

@ref{125f,,IsADirectoryError}

@item

@geindex PyExc_KeyError (C var)
@anchor{c-api/exceptions c PyExc_KeyError}@anchor{535e}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_KeyError
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@tab

@ref{5e7,,KeyError}

@item

@geindex PyExc_KeyboardInterrupt (C var)
@anchor{c-api/exceptions c PyExc_KeyboardInterrupt}@anchor{535f}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_KeyboardInterrupt
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@tab

@ref{bcb,,KeyboardInterrupt}

@item

@geindex PyExc_LookupError (C var)
@anchor{c-api/exceptions c PyExc_LookupError}@anchor{5360}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_LookupError
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@tab

@ref{242c,,LookupError}

@item

@geindex PyExc_MemoryError (C var)
@anchor{c-api/exceptions c PyExc_MemoryError}@anchor{5361}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_MemoryError
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@tab

@ref{1761,,MemoryError}

@item

@geindex PyExc_ModuleNotFoundError (C var)
@anchor{c-api/exceptions c PyExc_ModuleNotFoundError}@anchor{5362}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_ModuleNotFoundError
` Part of the @ref{776,,Stable ABI} since version 3.6.'
@end deffn

@tab

@ref{d43,,ModuleNotFoundError}

@item

@geindex PyExc_NameError (C var)
@anchor{c-api/exceptions c PyExc_NameError}@anchor{5363}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_NameError
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@tab

@ref{450,,NameError}

@item

@geindex PyExc_NotADirectoryError (C var)
@anchor{c-api/exceptions c PyExc_NotADirectoryError}@anchor{5364}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_NotADirectoryError
` Part of the @ref{776,,Stable ABI} since version 3.7.'
@end deffn

@tab

@ref{1260,,NotADirectoryError}

@item

@geindex PyExc_NotImplementedError (C var)
@anchor{c-api/exceptions c PyExc_NotImplementedError}@anchor{5365}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_NotImplementedError
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@tab

@ref{369,,NotImplementedError}

@item

@geindex PyExc_OSError (C var)
@anchor{c-api/exceptions c PyExc_OSError}@anchor{51fb}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_OSError
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@tab

@ref{2c2,,OSError}

@item

@geindex PyExc_OverflowError (C var)
@anchor{c-api/exceptions c PyExc_OverflowError}@anchor{5366}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_OverflowError
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@tab

@ref{a87,,OverflowError}

@item

@geindex PyExc_PermissionError (C var)
@anchor{c-api/exceptions c PyExc_PermissionError}@anchor{5368}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_PermissionError
` Part of the @ref{776,,Stable ABI} since version 3.7.'
@end deffn

@tab

@ref{f44,,PermissionError}

@item

@geindex PyExc_ProcessLookupError (C var)
@anchor{c-api/exceptions c PyExc_ProcessLookupError}@anchor{5369}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_ProcessLookupError
` Part of the @ref{776,,Stable ABI} since version 3.7.'
@end deffn

@tab

@ref{1261,,ProcessLookupError}

@item

@geindex PyExc_PythonFinalizationError (C var)
@anchor{c-api/exceptions c PyExc_PythonFinalizationError}@anchor{5564}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_PythonFinalizationError
@end deffn

@tab

@ref{479,,PythonFinalizationError}

@item

@geindex PyExc_RecursionError (C var)
@anchor{c-api/exceptions c PyExc_RecursionError}@anchor{10b8}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_RecursionError
` Part of the @ref{776,,Stable ABI} since version 3.7.'
@end deffn

@tab

@ref{f6e,,RecursionError}

@item

@geindex PyExc_ReferenceError (C var)
@anchor{c-api/exceptions c PyExc_ReferenceError}@anchor{536a}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_ReferenceError
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@tab

@ref{1719,,ReferenceError}

@item

@geindex PyExc_RuntimeError (C var)
@anchor{c-api/exceptions c PyExc_RuntimeError}@anchor{536c}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_RuntimeError
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@tab

@ref{246,,RuntimeError}

@item

@geindex PyExc_StopAsyncIteration (C var)
@anchor{c-api/exceptions c PyExc_StopAsyncIteration}@anchor{536e}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_StopAsyncIteration
` Part of the @ref{776,,Stable ABI} since version 3.7.'
@end deffn

@tab

@ref{1e52,,StopAsyncIteration}

@item

@geindex PyExc_StopIteration (C var)
@anchor{c-api/exceptions c PyExc_StopIteration}@anchor{536f}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_StopIteration
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@tab

@ref{dfb,,StopIteration}

@item

@geindex PyExc_SyntaxError (C var)
@anchor{c-api/exceptions c PyExc_SyntaxError}@anchor{5370}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_SyntaxError
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@tab

@ref{18f,,SyntaxError}

@item

@geindex PyExc_SystemError (C var)
@anchor{c-api/exceptions c PyExc_SystemError}@anchor{5372}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_SystemError
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@tab

@ref{796,,SystemError}

@item

@geindex PyExc_SystemExit (C var)
@anchor{c-api/exceptions c PyExc_SystemExit}@anchor{5373}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_SystemExit
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@tab

@ref{f42,,SystemExit}

@item

@geindex PyExc_TabError (C var)
@anchor{c-api/exceptions c PyExc_TabError}@anchor{5374}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_TabError
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@tab

@ref{766,,TabError}

@item

@geindex PyExc_TimeoutError (C var)
@anchor{c-api/exceptions c PyExc_TimeoutError}@anchor{5375}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_TimeoutError
` Part of the @ref{776,,Stable ABI} since version 3.7.'
@end deffn

@tab

@ref{a3c,,TimeoutError}

@item

@geindex PyExc_TypeError (C var)
@anchor{c-api/exceptions c PyExc_TypeError}@anchor{51fa}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_TypeError
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@tab

@ref{199,,TypeError}

@item

@geindex PyExc_UnboundLocalError (C var)
@anchor{c-api/exceptions c PyExc_UnboundLocalError}@anchor{5376}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_UnboundLocalError
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@tab

@ref{1742,,UnboundLocalError}

@item

@geindex PyExc_UnicodeDecodeError (C var)
@anchor{c-api/exceptions c PyExc_UnicodeDecodeError}@anchor{5377}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_UnicodeDecodeError
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@tab

@ref{c0e,,UnicodeDecodeError}

@item

@geindex PyExc_UnicodeEncodeError (C var)
@anchor{c-api/exceptions c PyExc_UnicodeEncodeError}@anchor{5378}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_UnicodeEncodeError
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@tab

@ref{889,,UnicodeEncodeError}

@item

@geindex PyExc_UnicodeError (C var)
@anchor{c-api/exceptions c PyExc_UnicodeError}@anchor{5379}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_UnicodeError
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@tab

@ref{460,,UnicodeError}

@item

@geindex PyExc_UnicodeTranslateError (C var)
@anchor{c-api/exceptions c PyExc_UnicodeTranslateError}@anchor{537a}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_UnicodeTranslateError
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@tab

@ref{1942,,UnicodeTranslateError}

@item

@geindex PyExc_ValueError (C var)
@anchor{c-api/exceptions c PyExc_ValueError}@anchor{51fc}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_ValueError
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@tab

@ref{2ee,,ValueError}

@item

@geindex PyExc_ZeroDivisionError (C var)
@anchor{c-api/exceptions c PyExc_ZeroDivisionError}@anchor{51f7}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_ZeroDivisionError
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@tab

@ref{b45,,ZeroDivisionError}

@end multitable



Added in version 3.3: @ref{5344,,PyExc_BlockingIOError}, @ref{5345,,PyExc_BrokenPipeError},
@ref{5348,,PyExc_ChildProcessError}, @ref{534a,,PyExc_ConnectionError},
@ref{5349,,PyExc_ConnectionAbortedError}, @ref{534b,,PyExc_ConnectionRefusedError},
@ref{534c,,PyExc_ConnectionResetError}, @ref{5352,,PyExc_FileExistsError},
@ref{5353,,PyExc_FileNotFoundError}, @ref{535c,,PyExc_InterruptedError},
@ref{535d,,PyExc_IsADirectoryError}, @ref{5364,,PyExc_NotADirectoryError},
@ref{5368,,PyExc_PermissionError}, @ref{5369,,PyExc_ProcessLookupError}
and @ref{5375,,PyExc_TimeoutError} were introduced following 
@geindex Python Enhancement Proposals; PEP 3151
PEP 3151@footnote{https://peps.python.org/pep-3151/}.



Added in version 3.5: @ref{536e,,PyExc_StopAsyncIteration} and @ref{10b8,,PyExc_RecursionError}.



Added in version 3.6: @ref{5362,,PyExc_ModuleNotFoundError}.



Added in version 3.11: @ref{5343,,PyExc_BaseExceptionGroup}.


@node OSError aliases,Warning types,Exception types,Exception and warning types
@anchor{c-api/exceptions oserror-aliases}@anchor{5565}
@subsubsection OSError aliases


The following are a compatibility aliases to @ref{51fb,,PyExc_OSError}.


Changed in version 3.3: These aliases used to be separate exception types.



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

C name

@tab

Python name

@tab

Notes

@item

@geindex PyExc_EnvironmentError (C var)
@anchor{c-api/exceptions c PyExc_EnvironmentError}@anchor{5350}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_EnvironmentError
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@tab

@ref{2c2,,OSError}

@tab

@item

@geindex PyExc_IOError (C var)
@anchor{c-api/exceptions c PyExc_IOError}@anchor{5357}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_IOError
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@tab

@ref{2c2,,OSError}

@tab

@item

@geindex PyExc_WindowsError (C var)
@anchor{c-api/exceptions c PyExc_WindowsError}@anchor{537e}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_WindowsError
` Part of the @ref{776,,Stable ABI} on Windows since version 3.7.'
@end deffn

@tab

@ref{2c2,,OSError}

@tab

@ref{5566,,[win]}

@end multitable


Notes:

@anchor{c-api/exceptions win}@anchor{5566}@w{(win)} 
@code{PyExc_WindowsError} is only defined on Windows; protect code that uses this by testing that the preprocessor macro @code{MS_WINDOWS} is defined.

@node Warning types,,OSError aliases,Exception and warning types
@anchor{c-api/exceptions standardwarningcategories}@anchor{5553}@anchor{c-api/exceptions warning-types}@anchor{5567}
@subsubsection Warning types



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

C name

@tab

Python name

@item

@geindex PyExc_Warning (C var)
@anchor{c-api/exceptions c PyExc_Warning}@anchor{537d}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_Warning
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@tab

@ref{275b,,Warning}

@item

@geindex PyExc_BytesWarning (C var)
@anchor{c-api/exceptions c PyExc_BytesWarning}@anchor{5347}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_BytesWarning
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@tab

@ref{e22,,BytesWarning}

@item

@geindex PyExc_DeprecationWarning (C var)
@anchor{c-api/exceptions c PyExc_DeprecationWarning}@anchor{534d}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_DeprecationWarning
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@tab

@ref{1a4,,DeprecationWarning}

@item

@geindex PyExc_EncodingWarning (C var)
@anchor{c-api/exceptions c PyExc_EncodingWarning}@anchor{534f}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_EncodingWarning
` Part of the @ref{776,,Stable ABI} since version 3.10.'
@end deffn

@tab

@ref{2171,,EncodingWarning}

@item

@geindex PyExc_FutureWarning (C var)
@anchor{c-api/exceptions c PyExc_FutureWarning}@anchor{5355}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_FutureWarning
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@tab

@ref{659,,FutureWarning}

@item

@geindex PyExc_ImportWarning (C var)
@anchor{c-api/exceptions c PyExc_ImportWarning}@anchor{5359}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_ImportWarning
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@tab

@ref{71f,,ImportWarning}

@item

@geindex PyExc_PendingDeprecationWarning (C var)
@anchor{c-api/exceptions c PyExc_PendingDeprecationWarning}@anchor{5367}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_PendingDeprecationWarning
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@tab

@ref{acc,,PendingDeprecationWarning}

@item

@geindex PyExc_ResourceWarning (C var)
@anchor{c-api/exceptions c PyExc_ResourceWarning}@anchor{536b}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_ResourceWarning
` Part of the @ref{776,,Stable ABI} since version 3.7.'
@end deffn

@tab

@ref{54d,,ResourceWarning}

@item

@geindex PyExc_RuntimeWarning (C var)
@anchor{c-api/exceptions c PyExc_RuntimeWarning}@anchor{536d}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_RuntimeWarning
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@tab

@ref{4d8,,RuntimeWarning}

@item

@geindex PyExc_SyntaxWarning (C var)
@anchor{c-api/exceptions c PyExc_SyntaxWarning}@anchor{5371}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_SyntaxWarning
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@tab

@ref{1af,,SyntaxWarning}

@item

@geindex PyExc_UnicodeWarning (C var)
@anchor{c-api/exceptions c PyExc_UnicodeWarning}@anchor{537b}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_UnicodeWarning
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@tab

@ref{1630,,UnicodeWarning}

@item

@geindex PyExc_UserWarning (C var)
@anchor{c-api/exceptions c PyExc_UserWarning}@anchor{537c}
@deffn {C Variable} @ref{5df,,PyObject} *PyExc_UserWarning
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@tab

@ref{275c,,UserWarning}

@end multitable



Added in version 3.2: @ref{536b,,PyExc_ResourceWarning}.



Added in version 3.10: @ref{534f,,PyExc_EncodingWarning}.


@node Tracebacks,,Exception and warning types,Exception Handling
@anchor{c-api/exceptions tracebacks}@anchor{5568}
@subsection Tracebacks


@geindex PyTraceBack_Type (C var)
@anchor{c-api/exceptions c PyTraceBack_Type}@anchor{5434}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyTraceBack_Type
` Part of the @ref{776,,Stable ABI}.'
Type object for traceback objects. This is available as
@ref{cf0,,types.TracebackType} in the Python layer.
@end deffn

@geindex PyTraceBack_Check (C function)
@anchor{c-api/exceptions c PyTraceBack_Check}@anchor{5569}
@deffn {C Function} int PyTraceBack_Check (PyObject *op)

Return true if `op' is a traceback object, false otherwise. This function
does not account for subtypes.
@end deffn

@geindex PyTraceBack_Here (C function)
@anchor{c-api/exceptions c PyTraceBack_Here}@anchor{5432}
@deffn {C Function} int PyTraceBack_Here (PyFrameObject *f)
` Part of the @ref{776,,Stable ABI}.'
Replace the @ref{14d2,,__traceback__} attribute on the current
exception with a new traceback prepending `f' to the existing chain.

Calling this function without an exception set is undefined behavior.

This function returns @code{0} on success, and returns @code{-1} with an
exception set on failure.
@end deffn

@geindex PyTraceBack_Print (C function)
@anchor{c-api/exceptions c PyTraceBack_Print}@anchor{5433}
@deffn {C Function} int PyTraceBack_Print (PyObject *tb, PyObject *f)
` Part of the @ref{776,,Stable ABI}.'
Write the traceback `tb' into the file `f'.

This function returns @code{0} on success, and returns @code{-1} with an
exception set on failure.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Defining extension modules,Utilities<2>,Exception Handling,Python/C API reference manual
@anchor{c-api/extension-modules doc}@anchor{556a}@anchor{c-api/extension-modules defining-extension-modules}@anchor{556b}@anchor{c-api/extension-modules extension-modules}@anchor{525c}@anchor{c-api/extension-modules translation-repo}@anchor{556c}
@section Defining extension modules


A C extension for CPython is a shared library (for example, a @code{.so} file
on Linux, @code{.pyd} DLL on Windows), which is loadable into the Python process
(for example, it is compiled with compatible compiler settings), and which
exports an @ref{556d,,initialization function}.

To be importable by default (that is, by
@ref{eb4,,importlib.machinery.ExtensionFileLoader}),
the shared library must be available on @ref{3e2,,sys.path},
and must be named after the module name plus an extension listed in
@ref{73a,,importlib.machinery.EXTENSION_SUFFIXES}.

@cartouche
@quotation Note 
Building, packaging and distributing extension modules is best done with
third-party tools, and is out of scope of this document.
One suitable tool is Setuptools, whose documentation can be found at
@indicateurl{https://setuptools.pypa.io/en/latest/setuptools.html}.
@end quotation
@end cartouche

Normally, the initialization function returns a module definition initialized
using @ref{5203,,PyModuleDef_Init()}.
This allows splitting the creation process into several phases:


@itemize -

@item 
Before any substantial code is executed, Python can determine which
capabilities the module supports, and it can adjust the environment or
refuse loading an incompatible extension.

@item 
By default, Python itself creates the module object – that is, it does
the equivalent of @ref{7a1,,object.__new__()} for classes.
It also sets initial attributes like @ref{325,,__package__} and
@ref{339,,__loader__}.

@item 
Afterwards, the module object is initialized using extension-specific
code – the equivalent of @ref{8c1,,__init__()} on classes.
@end itemize

This is called `multi-phase initialization' to distinguish it from the legacy
(but still supported) `single-phase initialization' scheme,
where the initialization function returns a fully constructed module.
See the @ref{556e,,single-phase-initialization section below}
for details.


Changed in version 3.5: Added support for multi-phase initialization (
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).


@menu
* Multiple module instances:: 
* Initialization function:: 
* Multi-phase initialization:: 
* Legacy single-phase initialization:: 

@end menu

@node Multiple module instances,Initialization function,,Defining extension modules
@anchor{c-api/extension-modules multiple-module-instances}@anchor{556f}
@subsection Multiple module instances


By default, extension modules are not singletons.
For example, if the @ref{1771,,sys.modules} entry is removed and the module
is re-imported, a new module object is created, and typically populated with
fresh method and type objects.
The old module is subject to normal garbage collection.
This mirrors the behavior of pure-Python modules.

Additional module instances may be created in
@ref{164,,sub-interpreters}
or after Python runtime reinitialization
(@ref{45d,,Py_Finalize()} and @ref{45e,,Py_Initialize()}).
In these cases, sharing Python objects between module instances would likely
cause crashes or undefined behavior.

To avoid such issues, each instance of an extension module should
be `isolated': changes to one instance should not implicitly affect the others,
and all state owned by the module, including references to Python objects,
should be specific to a particular module instance.
See @ref{167,,Isolating Extension Modules} for more details and a practical guide.

A simpler way to avoid these issues is
@ref{5570,,raising an error on repeated initialization}.

All modules are expected to support
@ref{164,,sub-interpreters}, or otherwise explicitly
signal a lack of support.
This is usually achieved by isolation or blocking repeated initialization,
as above.
A module may also be limited to the main interpreter using
the @ref{54b2,,Py_mod_multiple_interpreters} slot.

@node Initialization function,Multi-phase initialization,Multiple module instances,Defining extension modules
@anchor{c-api/extension-modules extension-export-hook}@anchor{556d}@anchor{c-api/extension-modules initialization-function}@anchor{5571}
@subsection Initialization function


The initialization function defined by an extension module has the
following signature:

@geindex PyInit_modulename (C function)
@anchor{c-api/extension-modules c PyInit_modulename}@anchor{5572}
@deffn {C Function} @ref{5df,,PyObject} *PyInit_modulename (void)
@end deffn

Its name should be @code{PyInit_@var{<name>}}, with @code{<name>} replaced by the
name of the module.

For modules with ASCII-only names, the function must instead be named
@code{PyInit_@var{<name>}}, with @code{<name>} replaced by the name of the module.
When using @ref{5573,,Multi-phase initialization}, non-ASCII module names
are allowed. In this case, the initialization function name is
@code{PyInitU_@var{<name>}}, with @code{<name>} encoded using Python’s
`punycode' encoding with hyphens replaced by underscores. In Python:

@example
def initfunc_name(name):
    try:
        suffix = b'_' + name.encode('ascii')
    except UnicodeEncodeError:
        suffix = b'U_' + name.encode('punycode').replace(b'-', b'_')
    return b'PyInit' + suffix
@end example

It is recommended to define the initialization function using a helper macro:

@geindex PyMODINIT_FUNC (C macro)
@anchor{c-api/extension-modules c PyMODINIT_FUNC}@anchor{16df}
@deffn {C Macro} PyMODINIT_FUNC

Declare an extension module initialization function.
This macro:


@itemize *

@item 
specifies the @ref{5df,,PyObject}* return type,

@item 
adds any special linkage declarations required by the platform, and

@item 
for C++, declares the function as @code{extern "C"}.
@end itemize
@end deffn

For example, a module called @code{spam} would be defined like this:

@example
static struct PyModuleDef spam_module = @{
    .m_base = PyModuleDef_HEAD_INIT,
    .m_name = "spam",
    ...
@};

PyMODINIT_FUNC
PyInit_spam(void)
@{
    return PyModuleDef_Init(&spam_module);
@}
@end example

It is possible to export multiple modules from a single shared library by
defining multiple initialization functions. However, importing them requires
using symbolic links or a custom importer, because by default only the
function corresponding to the filename is found.
See the Multiple modules in one library@footnote{https://peps.python.org/pep-0489/#multiple-modules-in-one-library}
section in 
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/} for details.

The initialization function is typically the only non-@code{static}
item defined in the module’s C source.

@node Multi-phase initialization,Legacy single-phase initialization,Initialization function,Defining extension modules
@anchor{c-api/extension-modules id1}@anchor{5574}@anchor{c-api/extension-modules multi-phase-initialization}@anchor{5573}
@subsection Multi-phase initialization


Normally, the @ref{556d,,initialization function}
(@code{PyInit_modulename}) returns a @ref{b7a,,PyModuleDef} instance with
non-@code{NULL} @ref{5575,,m_slots}.
Before it is returned, the @code{PyModuleDef} instance must be initialized
using the following function:

@geindex PyModuleDef_Init (C function)
@anchor{c-api/extension-modules c PyModuleDef_Init}@anchor{5203}
@deffn {C Function} @ref{5df,,PyObject} *PyModuleDef_Init (PyModuleDef *def)
` Part of the @ref{776,,Stable ABI} since version 3.5.'
Ensure a module definition is a properly initialized Python object that
correctly reports its type and a reference count.

Return `def' cast to @code{PyObject*}, or @code{NULL} if an error occurred.

Calling this function is required for @ref{5573,,Multi-phase initialization}.
It should not be used in other contexts.

Note that Python assumes that @code{PyModuleDef} structures are statically
allocated.
This function may return either a new reference or a borrowed one;
this reference must not be released.


Added in version 3.5.

@end deffn

@node Legacy single-phase initialization,,Multi-phase initialization,Defining extension modules
@anchor{c-api/extension-modules legacy-single-phase-initialization}@anchor{5576}@anchor{c-api/extension-modules single-phase-initialization}@anchor{556e}
@subsection Legacy single-phase initialization


@cartouche
@quotation Attention 
Single-phase initialization is a legacy mechanism to initialize extension
modules, with known drawbacks and design flaws. Extension module authors
are encouraged to use multi-phase initialization instead.
@end quotation
@end cartouche

In single-phase initialization, the
@ref{556d,,initialization function} (@code{PyInit_modulename})
should create, populate and return a module object.
This is typically done using @ref{5577,,PyModule_Create()} and functions like
@ref{60a,,PyModule_AddObjectRef()}.

Single-phase initialization differs from the @ref{5573,,default}
in the following ways:


@itemize *

@item 
Single-phase modules are, or rather `contain', “singletons”.

When the module is first initialized, Python saves the contents of
the module’s @code{__dict__} (that is, typically, the module’s functions and
types).

For subsequent imports, Python does not call the initialization function
again.
Instead, it creates a new module object with a new @code{__dict__}, and copies
the saved contents to it.
For example, given a single-phase module @code{_testsinglephase}
@footnote{
@code{_testsinglephase} is an internal module used
in CPython’s self-test suite; your installation may or may not
include it.
} that defines a function @code{sum} and an exception class
@code{error}:

@example
>>> import sys
>>> import _testsinglephase as one
>>> del sys.modules['_testsinglephase']
>>> import _testsinglephase as two
>>> one is two
False
>>> one.__dict__ is two.__dict__
False
>>> one.sum is two.sum
True
>>> one.error is two.error
True
@end example

The exact behavior should be considered a CPython implementation detail.

@item 
To work around the fact that @code{PyInit_modulename} does not take a `spec'
argument, some state of the import machinery is saved and applied to the
first suitable module created during the @code{PyInit_modulename} call.
Specifically, when a sub-module is imported, this mechanism prepends the
parent package name to the name of the module.

A single-phase @code{PyInit_modulename} function should create “its” module
object as soon as possible, before any other module objects can be created.

@item 
Non-ASCII module names (@code{PyInitU_modulename}) are not supported.

@item 
Single-phase modules support module lookup functions like
@ref{5415,,PyState_FindModule()}.
@end itemize

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Utilities<2>,Abstract Objects Layer,Defining extension modules,Python/C API reference manual
@anchor{c-api/utilities doc}@anchor{5578}@anchor{c-api/utilities id1}@anchor{5579}@anchor{c-api/utilities translation-repo}@anchor{557a}@anchor{c-api/utilities utilities}@anchor{557b}
@section Utilities


The functions in this chapter perform various utility tasks, ranging from
helping C code be more portable across platforms, using Python modules from C,
and parsing function arguments and constructing Python values from C values.

@menu
* Operating System Utilities:: 
* System Functions:: 
* Process Control:: 
* Importing Modules: Importing Modules<2>. 
* Data marshalling support:: 
* Parsing arguments and building values:: 
* String conversion and formatting:: 
* Character classification and conversion:: 
* PyHash API:: 
* Reflection:: 
* Codec registry and support functions:: 
* PyTime C API:: 
* Support for Perf Maps:: 

@end menu

@node Operating System Utilities,System Functions,,Utilities<2>
@anchor{c-api/sys doc}@anchor{557c}@anchor{c-api/sys operating-system-utilities}@anchor{557d}@anchor{c-api/sys os}@anchor{557e}
@subsection Operating System Utilities


@geindex PyOS_FSPath (C function)
@anchor{c-api/sys c PyOS_FSPath}@anchor{f1a}
@deffn {C Function} @ref{5df,,PyObject} *PyOS_FSPath (PyObject *path)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI} since version 3.6.'
Return the file system representation for `path'. If the object is a
@ref{16a,,str} or @ref{193,,bytes} object, then a new
@ref{5e2,,strong reference} is returned.
If the object implements the @ref{e51,,os.PathLike} interface,
then @ref{e52,,__fspath__()} is returned as long as it is a
@code{str} or @code{bytes} object. Otherwise @ref{199,,TypeError} is raised
and @code{NULL} is returned.


Added in version 3.6.

@end deffn

@geindex Py_FdIsInteractive (C function)
@anchor{c-api/sys c Py_FdIsInteractive}@anchor{557f}
@deffn {C Function} int Py_FdIsInteractive (FILE *fp, const char *filename)

Return true (nonzero) if the standard I/O file `fp' with name `filename' is
deemed interactive.  This is the case for files for which @code{isatty(fileno(fp))}
is true.  If the @ref{3fd,,PyConfig.interactive} is non-zero, this function
also returns true if the `filename' pointer is @code{NULL} or if the name is equal to
one of the strings @code{'<stdin>'} or @code{'???'}.

This function must not be called before Python is initialized.
@end deffn

@geindex PyOS_BeforeFork (C function)
@anchor{c-api/sys c PyOS_BeforeFork}@anchor{dbe}
@deffn {C Function} void PyOS_BeforeFork ()
` Part of the @ref{776,,Stable ABI} on platforms with fork() since version 3.7.'
Function to prepare some internal state before a process fork.  This
should be called before calling @code{fork()} or any similar function
that clones the current process.
Only available on systems where @code{fork()} is defined.

@cartouche
@quotation Warning 
The C @code{fork()} call should only be made from the
@ref{5580,,“main” thread} (of the
@ref{164,,“main” interpreter}).  The same is
true for @code{PyOS_BeforeFork()}.
@end quotation
@end cartouche


Added in version 3.7.

@end deffn

@geindex PyOS_AfterFork_Parent (C function)
@anchor{c-api/sys c PyOS_AfterFork_Parent}@anchor{dbf}
@deffn {C Function} void PyOS_AfterFork_Parent ()
` Part of the @ref{776,,Stable ABI} on platforms with fork() since version 3.7.'
Function to update some internal state after a process fork.  This
should be called from the parent process after calling @code{fork()}
or any similar function that clones the current process, regardless
of whether process cloning was successful.
Only available on systems where @code{fork()} is defined.

@cartouche
@quotation Warning 
The C @code{fork()} call should only be made from the
@ref{5580,,“main” thread} (of the
@ref{164,,“main” interpreter}).  The same is
true for @code{PyOS_AfterFork_Parent()}.
@end quotation
@end cartouche


Added in version 3.7.

@end deffn

@geindex PyOS_AfterFork_Child (C function)
@anchor{c-api/sys c PyOS_AfterFork_Child}@anchor{42e}
@deffn {C Function} void PyOS_AfterFork_Child ()
` Part of the @ref{776,,Stable ABI} on platforms with fork() since version 3.7.'
Function to update internal interpreter state after a process fork.
This must be called from the child process after calling @code{fork()},
or any similar function that clones the current process, if there is
any chance the process will call back into the Python interpreter.
Only available on systems where @code{fork()} is defined.

@cartouche
@quotation Warning 
The C @code{fork()} call should only be made from the
@ref{5580,,“main” thread} (of the
@ref{164,,“main” interpreter}).  The same is
true for @code{PyOS_AfterFork_Child()}.
@end quotation
@end cartouche


Added in version 3.7.



@subsubheading See also


@ref{353,,os.register_at_fork()} allows registering custom Python functions
to be called by @ref{dbe,,PyOS_BeforeFork()},
@ref{dbf,,PyOS_AfterFork_Parent()} and  @ref{42e,,PyOS_AfterFork_Child()}.

@end deffn

@geindex PyOS_AfterFork (C function)
@anchor{c-api/sys c PyOS_AfterFork}@anchor{42d}
@deffn {C Function} void PyOS_AfterFork ()
` Part of the @ref{776,,Stable ABI} on platforms with fork().'
Function to update some internal state after a process fork; this should be
called in the new process if the Python interpreter will continue to be used.
If a new executable is loaded into the new process, this function does not need
to be called.


Deprecated since version 3.7: This function is superseded by @ref{42e,,PyOS_AfterFork_Child()}.

@end deffn

@geindex PyOS_CheckStack (C function)
@anchor{c-api/sys c PyOS_CheckStack}@anchor{1be4}
@deffn {C Function} int PyOS_CheckStack ()
` Part of the @ref{776,,Stable ABI} on platforms with USE_STACKCHECK since version 3.7.'
@geindex USE_STACKCHECK (C macro)

Return true when the interpreter runs out of stack space.  This is a reliable
check, but is only available when @code{USE_STACKCHECK} is defined (currently
on certain versions of Windows using the Microsoft Visual C++ compiler).
@code{USE_STACKCHECK} will be defined automatically; you should never
change the definition in your own code.
@end deffn

@geindex PyOS_sighandler_t (C type)
@anchor{c-api/sys c PyOS_sighandler_t}@anchor{53e4}
@deffn {C Type} typedef void (*PyOS_sighandler_t)(int)
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@geindex PyOS_getsig (C function)
@anchor{c-api/sys c PyOS_getsig}@anchor{174a}
@deffn {C Function} @ref{53e4,,PyOS_sighandler_t} PyOS_getsig (int i)
` Part of the @ref{776,,Stable ABI}.'
Return the current signal handler for signal `i'.  This is a thin wrapper around
either @code{sigaction()} or @code{signal()}.  Do not call those functions
directly!
@end deffn

@geindex PyOS_setsig (C function)
@anchor{c-api/sys c PyOS_setsig}@anchor{174b}
@deffn {C Function} @ref{53e4,,PyOS_sighandler_t} PyOS_setsig (int i, PyOS_sighandler_t h)
` Part of the @ref{776,,Stable ABI}.'
Set the signal handler for signal `i' to be `h'; return the old signal handler.
This is a thin wrapper around either @code{sigaction()} or @code{signal()}.  Do
not call those functions directly!
@end deffn

@geindex PyOS_InterruptOccurred (C function)
@anchor{c-api/sys c PyOS_InterruptOccurred}@anchor{1d86}
@deffn {C Function} int PyOS_InterruptOccurred (void)
` Part of the @ref{776,,Stable ABI}.'
Check if a @code{SIGINT} signal has been received.

Returns @code{1} if a @code{SIGINT} has occurred and clears the signal flag,
or @code{0} otherwise.

In most cases, you should prefer @ref{694,,PyErr_CheckSignals()} over this function.
@code{PyErr_CheckSignals()} invokes the appropriate signal handlers
for all pending signals, allowing Python code to handle the signal properly.
This function only detects @code{SIGINT} and does not invoke any Python
signal handlers.

This function is async-signal-safe and this function cannot fail.
The caller must hold an @ref{5231,,attached thread state}.
@end deffn

@geindex Py_DecodeLocale (C function)
@anchor{c-api/sys c Py_DecodeLocale}@anchor{dc6}
@deffn {C Function} wchar_t *Py_DecodeLocale (const char *arg, size_t *size)
` Part of the @ref{776,,Stable ABI} since version 3.7.'
@cartouche
@quotation Warning 
This function should not be called directly: use the @ref{3f5,,PyConfig}
API with the @ref{bb1,,PyConfig_SetBytesString()} function which ensures
that @ref{434e,,Python is preinitialized}.

This function must not be called before @ref{434e,,Python is preinitialized} and so that the LC_CTYPE locale is properly configured: see
the @ref{41c,,Py_PreInitialize()} function.
@end quotation
@end cartouche

Decode a byte string from the @ref{75e,,filesystem encoding and error handler}.
If the error handler is @ref{28be,,surrogateescape error handler}, undecodable bytes are decoded as characters in range
U+DC80..U+DCFF; and if a byte sequence can be decoded as a surrogate
character, the bytes are escaped using the surrogateescape error handler
instead of decoding them.

Return a pointer to a newly allocated wide character string, use
@ref{634,,PyMem_RawFree()} to free the memory. If size is not @code{NULL}, write
the number of wide characters excluding the null character into @code{*size}

Return @code{NULL} on decoding error or memory allocation error. If `size' is
not @code{NULL}, @code{*size} is set to @code{(size_t)-1} on memory error or set to
@code{(size_t)-2} on decoding error.

The @ref{75e,,filesystem encoding and error handler} are selected by
@ref{998,,PyConfig_Read()}: see @ref{419,,filesystem_encoding} and
@ref{41a,,filesystem_errors} members of @ref{3f5,,PyConfig}.

Decoding errors should never happen, unless there is a bug in the C
library.

Use the @ref{dc7,,Py_EncodeLocale()} function to encode the character string
back to a byte string.


@subsubheading See also


The @ref{545f,,PyUnicode_DecodeFSDefaultAndSize()} and
@ref{dc8,,PyUnicode_DecodeLocaleAndSize()} functions.



Added in version 3.5.



Changed in version 3.7: The function now uses the UTF-8 encoding in the @ref{868,,Python UTF-8 Mode}.



Changed in version 3.8: The function now uses the UTF-8 encoding on Windows if
@ref{416,,PyPreConfig.legacy_windows_fs_encoding} is zero;

@end deffn

@geindex Py_EncodeLocale (C function)
@anchor{c-api/sys c Py_EncodeLocale}@anchor{dc7}
@deffn {C Function} char *Py_EncodeLocale (const wchar_t *text, size_t *error_pos)
` Part of the @ref{776,,Stable ABI} since version 3.7.'
Encode a wide character string to the @ref{75e,,filesystem encoding and error handler}. If the error handler is @ref{28be,,surrogateescape error handler}, surrogate characters in the range U+DC80..U+DCFF are
converted to bytes 0x80..0xFF.

Return a pointer to a newly allocated byte string, use @ref{164e,,PyMem_Free()}
to free the memory. Return @code{NULL} on encoding error or memory allocation
error.

If error_pos is not @code{NULL}, @code{*error_pos} is set to @code{(size_t)-1} on
success,  or set to the index of the invalid character on encoding error.

The @ref{75e,,filesystem encoding and error handler} are selected by
@ref{998,,PyConfig_Read()}: see @ref{419,,filesystem_encoding} and
@ref{41a,,filesystem_errors} members of @ref{3f5,,PyConfig}.

Use the @ref{dc6,,Py_DecodeLocale()} function to decode the bytes string back
to a wide character string.

@cartouche
@quotation Warning 
This function must not be called before @ref{434e,,Python is preinitialized} and so that the LC_CTYPE locale is properly configured: see
the @ref{41c,,Py_PreInitialize()} function.
@end quotation
@end cartouche


@subsubheading See also


The @ref{1e73,,PyUnicode_EncodeFSDefault()} and
@ref{dc9,,PyUnicode_EncodeLocale()} functions.



Added in version 3.5.



Changed in version 3.7: The function now uses the UTF-8 encoding in the @ref{868,,Python UTF-8 Mode}.



Changed in version 3.8: The function now uses the UTF-8 encoding on Windows if
@ref{416,,PyPreConfig.legacy_windows_fs_encoding} is zero.

@end deffn

@geindex Py_fopen (C function)
@anchor{c-api/sys c Py_fopen}@anchor{391}
@deffn {C Function} FILE *Py_fopen (PyObject *path, const char *mode)

Similar to @code{fopen()}, but `path' is a Python object and
an exception is set on error.

`path' must be a @ref{16a,,str} object, a @ref{193,,bytes} object,
or a @ref{5a1,,path-like object}.

On success, return the new file pointer.
On error, set an exception and return @code{NULL}.

The file must be closed by @ref{392,,Py_fclose()} rather than calling directly
@code{fclose()}.

The file descriptor is created non-inheritable (
@geindex Python Enhancement Proposals; PEP 446
PEP 446@footnote{https://peps.python.org/pep-0446/}).

The caller must have an @ref{5231,,attached thread state}.


Added in version 3.14.

@end deffn

@geindex Py_fclose (C function)
@anchor{c-api/sys c Py_fclose}@anchor{392}
@deffn {C Function} int Py_fclose (FILE *file)

Close a file that was opened by @ref{391,,Py_fopen()}.

On success, return @code{0}.
On error, return @code{EOF} and @code{errno} is set to indicate the error.
In either case, any further access (including another call to
@ref{392,,Py_fclose()}) to the stream results in undefined behavior.


Added in version 3.14.

@end deffn

@node System Functions,Process Control,Operating System Utilities,Utilities<2>
@anchor{c-api/sys system-functions}@anchor{5581}@anchor{c-api/sys systemfunctions}@anchor{5582}
@subsection System Functions


These are utility functions that make functionality from the @ref{df,,sys} module
accessible to C code.  They all work with the current interpreter thread’s
@code{sys} module’s dict, which is contained in the internal thread state structure.

@geindex PySys_GetObject (C function)
@anchor{c-api/sys c PySys_GetObject}@anchor{62a}
@deffn {C Function} @ref{5df,,PyObject} *PySys_GetObject (const char *name)
`Return value: Borrowed reference.'` Part of the @ref{776,,Stable ABI}.'
Return the object `name' from the @ref{df,,sys} module or @code{NULL} if it does
not exist, without setting an exception.
@end deffn

@geindex PySys_SetObject (C function)
@anchor{c-api/sys c PySys_SetObject}@anchor{541f}
@deffn {C Function} int PySys_SetObject (const char *name, PyObject *v)
` Part of the @ref{776,,Stable ABI}.'
Set `name' in the @ref{df,,sys} module to `v' unless `v' is @code{NULL}, in which
case `name' is deleted from the sys module. Returns @code{0} on success, @code{-1}
on error.
@end deffn

@geindex PySys_ResetWarnOptions (C function)
@anchor{c-api/sys c PySys_ResetWarnOptions}@anchor{3f2}
@deffn {C Function} void PySys_ResetWarnOptions ()
` Part of the @ref{776,,Stable ABI}.'
Reset @ref{3f3,,sys.warnoptions} to an empty list. This function may be
called prior to @ref{45e,,Py_Initialize()}.


Deprecated since version 3.13, will be removed in version 3.15: Clear @ref{3f3,,sys.warnoptions} and @code{warnings.filters} instead.

@end deffn

@geindex PySys_WriteStdout (C function)
@anchor{c-api/sys c PySys_WriteStdout}@anchor{5421}
@deffn {C Function} void PySys_WriteStdout (const char *format, ...)
` Part of the @ref{776,,Stable ABI}.'
Write the output string described by `format' to @ref{cd3,,sys.stdout}.  No
exceptions are raised, even if truncation occurs (see below).

`format' should limit the total size of the formatted output string to
1000 bytes or less – after 1000 bytes, the output string is truncated.
In particular, this means that no unrestricted “%s” formats should occur;
these should be limited using “%.<N>s” where <N> is a decimal number
calculated so that <N> plus the maximum size of other formatted text does not
exceed 1000 bytes.  Also watch out for “%f”, which can print hundreds of
digits for very large numbers.

If a problem occurs, or @ref{cd3,,sys.stdout} is unset, the formatted message
is written to the real (C level) `stdout'.
@end deffn

@geindex PySys_WriteStderr (C function)
@anchor{c-api/sys c PySys_WriteStderr}@anchor{5420}
@deffn {C Function} void PySys_WriteStderr (const char *format, ...)
` Part of the @ref{776,,Stable ABI}.'
As @ref{5421,,PySys_WriteStdout()}, but write to @ref{b39,,sys.stderr} or `stderr'
instead.
@end deffn

@geindex PySys_FormatStdout (C function)
@anchor{c-api/sys c PySys_FormatStdout}@anchor{541d}
@deffn {C Function} void PySys_FormatStdout (const char *format, ...)
` Part of the @ref{776,,Stable ABI}.'
Function similar to PySys_WriteStdout() but format the message using
@ref{795,,PyUnicode_FromFormatV()} and don’t truncate the message to an
arbitrary length.


Added in version 3.2.

@end deffn

@geindex PySys_FormatStderr (C function)
@anchor{c-api/sys c PySys_FormatStderr}@anchor{541c}
@deffn {C Function} void PySys_FormatStderr (const char *format, ...)
` Part of the @ref{776,,Stable ABI}.'
As @ref{541d,,PySys_FormatStdout()}, but write to @ref{b39,,sys.stderr} or `stderr'
instead.


Added in version 3.2.

@end deffn

@geindex PySys_GetXOptions (C function)
@anchor{c-api/sys c PySys_GetXOptions}@anchor{541e}
@deffn {C Function} @ref{5df,,PyObject} *PySys_GetXOptions ()
`Return value: Borrowed reference.'` Part of the @ref{776,,Stable ABI} since version 3.7.'
Return the current dictionary of @ref{170,,-X} options, similarly to
@ref{2174,,sys._xoptions}.  On error, @code{NULL} is returned and an exception is
set.


Added in version 3.2.

@end deffn

@geindex PySys_Audit (C function)
@anchor{c-api/sys c PySys_Audit}@anchor{613}
@deffn {C Function} int PySys_Audit (const char *event, const char *format, ...)
` Part of the @ref{776,,Stable ABI} since version 3.13.'
Raise an auditing event with any active hooks. Return zero for success
and non-zero with an exception set on failure.

The `event' string argument must not be `NULL'.

If any hooks have been added, `format' and other arguments will be used
to construct a tuple to pass. Apart from @code{N}, the same format characters
as used in @ref{3c0,,Py_BuildValue()} are available. If the built value is not
a tuple, it will be added into a single-element tuple.

The @code{N} format option must not be used. It consumes a reference, but since
there is no way to know whether arguments to this function will be consumed,
using it may cause reference leaks.

Note that @code{#} format characters should always be treated as
@ref{c5b,,Py_ssize_t}, regardless of whether @code{PY_SSIZE_T_CLEAN} was defined.

@ref{195f,,sys.audit()} performs the same function from Python code.

See also @ref{612,,PySys_AuditTuple()}.


Added in version 3.8.



Changed in version 3.8.2: Require @ref{c5b,,Py_ssize_t} for @code{#} format characters. Previously, an
unavoidable deprecation warning was raised.

@end deffn

@geindex PySys_AuditTuple (C function)
@anchor{c-api/sys c PySys_AuditTuple}@anchor{612}
@deffn {C Function} int PySys_AuditTuple (const char *event, PyObject *args)
` Part of the @ref{776,,Stable ABI} since version 3.13.'
Similar to @ref{613,,PySys_Audit()}, but pass arguments as a Python object.
`args' must be a @ref{614,,tuple}. To pass no arguments, `args' can be `NULL'.


Added in version 3.13.

@end deffn

@geindex PySys_AddAuditHook (C function)
@anchor{c-api/sys c PySys_AddAuditHook}@anchor{4ab1}
@deffn {C Function} int PySys_AddAuditHook (Py_AuditHookFunction hook, void *userData)

Append the callable `hook' to the list of active auditing hooks.
Return zero on success
and non-zero on failure. If the runtime has been initialized, also set an
error on failure. Hooks added through this API are called for all
interpreters created by the runtime.

The `userData' pointer is passed into the hook function. Since hook
functions may be called from different runtimes, this pointer should not
refer directly to Python state.

This function is safe to call before @ref{45e,,Py_Initialize()}. When called
after runtime initialization, existing audit hooks are notified and may
silently abort the operation by raising an error subclassed from
@ref{bd3,,Exception} (other errors will not be silenced).

The hook function is always called with an @ref{5231,,attached thread state} by
the Python interpreter that raised the event.

See 
@geindex Python Enhancement Proposals; PEP 578
PEP 578@footnote{https://peps.python.org/pep-0578/} for a detailed description of auditing.  Functions in the
runtime and standard library that raise events are listed in the
@ref{1c56,,audit events table}.
Details are in each function’s documentation.


If the interpreter is initialized, this function raises an auditing event
@code{sys.addaudithook} with no arguments. If any existing hooks raise an
exception derived from @ref{bd3,,Exception}, the new hook will not be
added and the exception is cleared. As a result, callers cannot assume
that their hook has been added unless they control all existing hooks.


@geindex Py_AuditHookFunction (C type)
@anchor{c-api/sys c Py_AuditHookFunction}@anchor{5583}
@deffn {C Type} typedef int (*Py_AuditHookFunction)(const char *event, @ref{5df,,PyObject} *args, void *userData)

The type of the hook function.
`event' is the C string event argument passed to @ref{613,,PySys_Audit()} or
@ref{612,,PySys_AuditTuple()}.
`args' is guaranteed to be a @ref{5584,,PyTupleObject}.
`userData' is the argument passed to PySys_AddAuditHook().
@end deffn


Added in version 3.8.

@end deffn

@node Process Control,Importing Modules<2>,System Functions,Utilities<2>
@anchor{c-api/sys process-control}@anchor{5585}@anchor{c-api/sys processcontrol}@anchor{5586}
@subsection Process Control


@geindex Py_FatalError (C function)
@anchor{c-api/sys c Py_FatalError}@anchor{b80}
@deffn {C Function} void Py_FatalError (const char *message)
` Part of the @ref{776,,Stable ABI}.'
@geindex abort (C function)

Print a fatal error message and kill the process.  No cleanup is performed.
This function should only be invoked when a condition is detected that would
make it dangerous to continue using the Python interpreter; e.g., when the
object administration appears to be corrupted.  On Unix, the standard C library
function @code{abort()} is called which will attempt to produce a @code{core}
file.

The @code{Py_FatalError()} function is replaced with a macro which logs
automatically the name of the current function, unless the
@code{Py_LIMITED_API} macro is defined.


Changed in version 3.9: Log the function name automatically.

@end deffn

@geindex Py_Exit (C function)
@anchor{c-api/sys c Py_Exit}@anchor{f51}
@deffn {C Function} void Py_Exit (int status)
` Part of the @ref{776,,Stable ABI}.'
@geindex Py_FinalizeEx (C function)
@geindex exit (C function)

Exit the current process.  This calls @ref{f17,,Py_FinalizeEx()} and then calls the
standard C library function @code{exit(status)}.  If @code{Py_FinalizeEx()}
indicates an error, the exit status is set to 120.


Changed in version 3.6: Errors from finalization no longer ignored.

@end deffn

@geindex Py_AtExit (C function)
@anchor{c-api/sys c Py_AtExit}@anchor{5488}
@deffn {C Function} int Py_AtExit (void (*func)())
` Part of the @ref{776,,Stable ABI}.'
@geindex Py_FinalizeEx (C function)
@geindex cleanup functions

Register a cleanup function to be called by @ref{f17,,Py_FinalizeEx()}.  The cleanup
function will be called with no arguments and should return no value.  At most
32 cleanup functions can be registered.  When the registration is successful,
@ref{5488,,Py_AtExit()} returns @code{0}; on failure, it returns @code{-1}.  The cleanup
function registered last is called first. Each cleanup function will be called
at most once.  Since Python’s internal finalization will have completed before
the cleanup function, no Python APIs should be called by `func'.


@subsubheading See also


@ref{193f,,PyUnstable_AtExit()} for passing a @code{void *data} argument.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Importing Modules<2>,Data marshalling support,Process Control,Utilities<2>
@anchor{c-api/import doc}@anchor{5587}@anchor{c-api/import importing}@anchor{5588}@anchor{c-api/import importing-modules}@anchor{5589}@anchor{c-api/import translation-repo}@anchor{558a}
@subsection Importing Modules


@geindex PyImport_ImportModule (C function)
@anchor{c-api/import c PyImport_ImportModule}@anchor{3da}
@deffn {C Function} @ref{5df,,PyObject} *PyImport_ImportModule (const char *name)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
@geindex package variable; __all__
@geindex __all__ (package variable)
@geindex modules (in module sys)

This is a wrapper around @ref{1608,,PyImport_Import()} which takes a
const char* as an argument instead of a @ref{5df,,PyObject}*.
@end deffn

@geindex PyImport_ImportModuleNoBlock (C function)
@anchor{c-api/import c PyImport_ImportModuleNoBlock}@anchor{3d9}
@deffn {C Function} @ref{5df,,PyObject} *PyImport_ImportModuleNoBlock (const char *name)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
This function is a deprecated alias of @ref{3da,,PyImport_ImportModule()}.


Changed in version 3.3: This function used to fail immediately when the import lock was held
by another thread.  In Python 3.3 though, the locking scheme switched
to per-module locks for most purposes, so this function’s special
behaviour isn’t needed anymore.



Deprecated since version 3.13, will be removed in version 3.15: Use @ref{3da,,PyImport_ImportModule()} instead.

@end deffn

@geindex PyImport_ImportModuleEx (C function)
@anchor{c-api/import c PyImport_ImportModuleEx}@anchor{13b1}
@deffn {C Function} @ref{5df,,PyObject} *PyImport_ImportModuleEx (const char *name, PyObject *globals, PyObject *locals, PyObject *fromlist)
`Return value: New reference.'
@geindex built-in function; __import__

Import a module.  This is best described by referring to the built-in Python
function @ref{ad7,,__import__()}.

The return value is a new reference to the imported module or top-level
package, or @code{NULL} with an exception set on failure.  Like for
@ref{ad7,,__import__()}, the return value when a submodule of a package was
requested is normally the top-level package, unless a non-empty `fromlist'
was given.

Failing imports remove incomplete module objects, like with
@ref{3da,,PyImport_ImportModule()}.
@end deffn

@geindex PyImport_ImportModuleLevelObject (C function)
@anchor{c-api/import c PyImport_ImportModuleLevelObject}@anchor{5399}
@deffn {C Function} @ref{5df,,PyObject} *PyImport_ImportModuleLevelObject (PyObject *name, PyObject *globals, PyObject *locals, PyObject *fromlist, int level)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI} since version 3.7.'
Import a module.  This is best described by referring to the built-in Python
function @ref{ad7,,__import__()}, as the standard @code{__import__()} function calls
this function directly.

The return value is a new reference to the imported module or top-level package,
or @code{NULL} with an exception set on failure.  Like for @ref{ad7,,__import__()},
the return value when a submodule of a package was requested is normally the
top-level package, unless a non-empty `fromlist' was given.


Added in version 3.3.

@end deffn

@geindex PyImport_ImportModuleLevel (C function)
@anchor{c-api/import c PyImport_ImportModuleLevel}@anchor{13b0}
@deffn {C Function} @ref{5df,,PyObject} *PyImport_ImportModuleLevel (const char *name, PyObject *globals, PyObject *locals, PyObject *fromlist, int level)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Similar to @ref{5399,,PyImport_ImportModuleLevelObject()}, but the name is a
UTF-8 encoded string instead of a Unicode object.


Changed in version 3.3: Negative values for `level' are no longer accepted.

@end deffn

@geindex PyImport_Import (C function)
@anchor{c-api/import c PyImport_Import}@anchor{1608}
@deffn {C Function} @ref{5df,,PyObject} *PyImport_Import (PyObject *name)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
This is a higher-level interface that calls the current “import hook
function” (with an explicit `level' of 0, meaning absolute import).  It
invokes the @ref{ad7,,__import__()} function from the @code{__builtins__} of the
current globals.  This means that the import is done using whatever import
hooks are installed in the current environment.

This function always uses absolute imports.
@end deffn

@geindex PyImport_ReloadModule (C function)
@anchor{c-api/import c PyImport_ReloadModule}@anchor{539a}
@deffn {C Function} @ref{5df,,PyObject} *PyImport_ReloadModule (PyObject *m)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Reload a module.  Return a new reference to the reloaded module, or @code{NULL} with
an exception set on failure (the module still exists in this case).
@end deffn

@geindex PyImport_AddModuleRef (C function)
@anchor{c-api/import c PyImport_AddModuleRef}@anchor{5fb}
@deffn {C Function} @ref{5df,,PyObject} *PyImport_AddModuleRef (const char *name)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI} since version 3.13.'
Return the module object corresponding to a module name.

The `name' argument may be of the form @code{package.module}. First check the
modules dictionary if there’s one there, and if not, create a new one and
insert it in the modules dictionary.

Return a @ref{5e2,,strong reference} to the module on success. Return @code{NULL}
with an exception set on failure.

The module name `name' is decoded from UTF-8.

This function does not load or import the module; if the module wasn’t
already loaded, you will get an empty module object. Use
@ref{3da,,PyImport_ImportModule()} or one of its variants to import a module.
Package structures implied by a dotted name for `name' are not created if
not already present.


Added in version 3.13.

@end deffn

@geindex PyImport_AddModuleObject (C function)
@anchor{c-api/import c PyImport_AddModuleObject}@anchor{5390}
@deffn {C Function} @ref{5df,,PyObject} *PyImport_AddModuleObject (PyObject *name)
`Return value: Borrowed reference.'` Part of the @ref{776,,Stable ABI} since version 3.7.'
Similar to @ref{5fb,,PyImport_AddModuleRef()}, but return a @ref{3d5,,borrowed reference} and `name' is a Python @ref{16a,,str} object.


Added in version 3.3.

@end deffn

@geindex PyImport_AddModule (C function)
@anchor{c-api/import c PyImport_AddModule}@anchor{5fc}
@deffn {C Function} @ref{5df,,PyObject} *PyImport_AddModule (const char *name)
`Return value: Borrowed reference.'` Part of the @ref{776,,Stable ABI}.'
Similar to @ref{5fb,,PyImport_AddModuleRef()}, but return a @ref{3d5,,borrowed reference}.
@end deffn

@geindex PyImport_ExecCodeModule (C function)
@anchor{c-api/import c PyImport_ExecCodeModule}@anchor{5391}
@deffn {C Function} @ref{5df,,PyObject} *PyImport_ExecCodeModule (const char *name, PyObject *co)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
@geindex built-in function; compile

Given a module name (possibly of the form @code{package.module}) and a code object
read from a Python bytecode file or obtained from the built-in function
@ref{4b2,,compile()}, load the module.  Return a new reference to the module object,
or @code{NULL} with an exception set if an error occurred.  `name'
is removed from @ref{1771,,sys.modules} in error cases, even if `name' was already
in @code{sys.modules} on entry to @ref{5391,,PyImport_ExecCodeModule()}.  Leaving
incompletely initialized modules in @code{sys.modules} is dangerous, as imports of
such modules have no way to know that the module object is an unknown (and
probably damaged with respect to the module author’s intents) state.

The module’s @ref{23a8,,__spec__} and @ref{339,,__loader__} will be
set, if not set already, with the appropriate values.  The spec’s loader
will be set to the module’s @code{__loader__} (if set) and to an instance
of @ref{127a,,SourceFileLoader} otherwise.

The module’s @ref{23ad,,__file__} attribute will be set to the code
object’s @ref{1579,,co_filename}.  If applicable,
@ref{323,,__cached__} will also be set.

This function will reload the module if it was already imported.  See
@ref{539a,,PyImport_ReloadModule()} for the intended way to reload a module.

If `name' points to a dotted name of the form @code{package.module}, any package
structures not already created will still not be created.

See also @ref{5392,,PyImport_ExecCodeModuleEx()} and
@ref{5394,,PyImport_ExecCodeModuleWithPathnames()}.


Changed in version 3.12: The setting of @ref{323,,__cached__} and @ref{339,,__loader__}
is deprecated. See @ref{22b0,,ModuleSpec} for
alternatives.

@end deffn

@geindex PyImport_ExecCodeModuleEx (C function)
@anchor{c-api/import c PyImport_ExecCodeModuleEx}@anchor{5392}
@deffn {C Function} @ref{5df,,PyObject} *PyImport_ExecCodeModuleEx (const char *name, PyObject *co, const char *pathname)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Like @ref{5391,,PyImport_ExecCodeModule()}, but the @ref{23ad,,__file__}
attribute of the module object is set to `pathname' if it is non-@code{NULL}.

See also @ref{5394,,PyImport_ExecCodeModuleWithPathnames()}.
@end deffn

@geindex PyImport_ExecCodeModuleObject (C function)
@anchor{c-api/import c PyImport_ExecCodeModuleObject}@anchor{5393}
@deffn {C Function} @ref{5df,,PyObject} *PyImport_ExecCodeModuleObject (PyObject *name, PyObject *co, PyObject *pathname, PyObject *cpathname)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI} since version 3.7.'
Like @ref{5392,,PyImport_ExecCodeModuleEx()}, but the @ref{323,,__cached__}
attribute of the module object is set to `cpathname' if it is
non-@code{NULL}.  Of the three functions, this is the preferred one to use.


Added in version 3.3.



Changed in version 3.12: Setting @ref{323,,__cached__} is deprecated. See
@ref{22b0,,ModuleSpec} for alternatives.

@end deffn

@geindex PyImport_ExecCodeModuleWithPathnames (C function)
@anchor{c-api/import c PyImport_ExecCodeModuleWithPathnames}@anchor{5394}
@deffn {C Function} @ref{5df,,PyObject} *PyImport_ExecCodeModuleWithPathnames (const char *name, PyObject *co, const char *pathname, const char *cpathname)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Like @ref{5393,,PyImport_ExecCodeModuleObject()}, but `name', `pathname' and
`cpathname' are UTF-8 encoded strings. Attempts are also made to figure out
what the value for `pathname' should be from `cpathname' if the former is
set to @code{NULL}.


Added in version 3.2.



Changed in version 3.3: Uses @code{imp.source_from_cache()} in calculating the source path if
only the bytecode path is provided.



Changed in version 3.12: No longer uses the removed @code{imp} module.

@end deffn

@geindex PyImport_GetMagicNumber (C function)
@anchor{c-api/import c PyImport_GetMagicNumber}@anchor{13af}
@deffn {C Function} long PyImport_GetMagicNumber ()
` Part of the @ref{776,,Stable ABI}.'
Return the magic number for Python bytecode files (a.k.a. @code{.pyc} file).
The magic number should be present in the first four bytes of the bytecode
file, in little-endian byte order. Returns @code{-1} on error.


Changed in version 3.3: Return value of @code{-1} upon failure.

@end deffn

@geindex PyImport_GetMagicTag (C function)
@anchor{c-api/import c PyImport_GetMagicTag}@anchor{5395}
@deffn {C Function} const char *PyImport_GetMagicTag ()
` Part of the @ref{776,,Stable ABI}.'
Return the magic tag string for 
@geindex Python Enhancement Proposals; PEP 3147
PEP 3147@footnote{https://peps.python.org/pep-3147/} format Python bytecode file
names.  Keep in mind that the value at @code{sys.implementation.cache_tag} is
authoritative and should be used instead of this function.


Added in version 3.2.

@end deffn

@geindex PyImport_GetModuleDict (C function)
@anchor{c-api/import c PyImport_GetModuleDict}@anchor{5396}
@deffn {C Function} @ref{5df,,PyObject} *PyImport_GetModuleDict ()
`Return value: Borrowed reference.'` Part of the @ref{776,,Stable ABI}.'
Return the dictionary used for the module administration (a.k.a.
@code{sys.modules}).  Note that this is a per-interpreter variable.
@end deffn

@geindex PyImport_GetModule (C function)
@anchor{c-api/import c PyImport_GetModule}@anchor{db2}
@deffn {C Function} @ref{5df,,PyObject} *PyImport_GetModule (PyObject *name)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI} since version 3.8.'
Return the already imported module with the given name.  If the
module has not been imported yet then returns @code{NULL} but does not set
an error.  Returns @code{NULL} and sets an error if the lookup failed.


Added in version 3.7.

@end deffn

@geindex PyImport_GetImporter (C function)
@anchor{c-api/import c PyImport_GetImporter}@anchor{1aca}
@deffn {C Function} @ref{5df,,PyObject} *PyImport_GetImporter (PyObject *path)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Return a finder object for a @ref{3e2,,sys.path}/@code{pkg.__path__} item
`path', possibly by fetching it from the @ref{7fb,,sys.path_importer_cache}
dict.  If it wasn’t yet cached, traverse @ref{122a,,sys.path_hooks} until a hook
is found that can handle the path item.  Return @code{None} if no hook could;
this tells our caller that the @ref{2494,,path based finder} could not find a
finder for this path item. Cache the result in @code{sys.path_importer_cache}.
Return a new reference to the finder object.
@end deffn

@geindex PyImport_ImportFrozenModuleObject (C function)
@anchor{c-api/import c PyImport_ImportFrozenModuleObject}@anchor{5398}
@deffn {C Function} int PyImport_ImportFrozenModuleObject (PyObject *name)
` Part of the @ref{776,,Stable ABI} since version 3.7.'
Load a frozen module named `name'.  Return @code{1} for success, @code{0} if the
module is not found, and @code{-1} with an exception set if the initialization
failed.  To access the imported module on a successful load, use
@ref{3da,,PyImport_ImportModule()}.  (Note the misnomer — this function would
reload the module if it was already imported.)


Added in version 3.3.



Changed in version 3.4: The @code{__file__} attribute is no longer set on the module.

@end deffn

@geindex PyImport_ImportFrozenModule (C function)
@anchor{c-api/import c PyImport_ImportFrozenModule}@anchor{5397}
@deffn {C Function} int PyImport_ImportFrozenModule (const char *name)
` Part of the @ref{776,,Stable ABI}.'
Similar to @ref{5398,,PyImport_ImportFrozenModuleObject()}, but the name is a
UTF-8 encoded string instead of a Unicode object.
@end deffn

@geindex _frozen (C struct)
@anchor{c-api/import c _frozen}@anchor{97e}
@deffn {C Struct} struct _frozen

@geindex freeze utility

This is the structure type definition for frozen module descriptors, as
generated by the @code{freeze} utility (see @code{Tools/freeze/} in the
Python source distribution).  Its definition, found in @code{Include/import.h},
is:

@example
struct _frozen @{
    const char *name;
    const unsigned char *code;
    int size;
    bool is_package;
@};
@end example


Changed in version 3.11: The new @code{is_package} field indicates whether the module is a package or not.
This replaces setting the @code{size} field to a negative value.

@end deffn

@geindex PyImport_FrozenModules (C var)
@anchor{c-api/import c PyImport_FrozenModules}@anchor{338f}
@deffn {C Variable} const struct @ref{97e,,_frozen} *PyImport_FrozenModules

This pointer is initialized to point to an array of @ref{97e,,_frozen}
records, terminated by one whose members are all @code{NULL} or zero.  When a frozen
module is imported, it is searched in this table.  Third-party code could play
tricks with this to provide a dynamically created collection of frozen modules.
@end deffn

@geindex PyImport_AppendInittab (C function)
@anchor{c-api/import c PyImport_AppendInittab}@anchor{1b60}
@deffn {C Function} int PyImport_AppendInittab (const char *name, PyObject *(*initfunc)(void))
` Part of the @ref{776,,Stable ABI}.'
Add a single module to the existing table of built-in modules.  This is a
convenience wrapper around @ref{1b61,,PyImport_ExtendInittab()}, returning @code{-1} if
the table could not be extended.  The new module can be imported by the name
`name', and uses the function `initfunc' as the initialization function called
on the first attempted import.  This should be called before
@ref{45e,,Py_Initialize()}.
@end deffn

@geindex _inittab (C struct)
@anchor{c-api/import c _inittab}@anchor{558b}
@deffn {C Struct} struct _inittab

Structure describing a single entry in the list of built-in modules.
Programs which
embed Python may use an array of these structures in conjunction with
@ref{1b61,,PyImport_ExtendInittab()} to provide additional built-in modules.
The structure consists of two members:

@geindex _inittab.name (C member)
@anchor{c-api/import c _inittab name}@anchor{558c}
@deffn {C Member} const char *name

The module name, as an ASCII encoded string.
@end deffn

@geindex _inittab.initfunc (C member)
@anchor{c-api/import c _inittab initfunc}@anchor{558d}
@deffn {C Member} @ref{5df,,PyObject} *(*initfunc)(void)

Initialization function for a module built into the interpreter.
@end deffn
@end deffn

@geindex PyImport_ExtendInittab (C function)
@anchor{c-api/import c PyImport_ExtendInittab}@anchor{1b61}
@deffn {C Function} int PyImport_ExtendInittab (struct _inittab *newtab)

Add a collection of modules to the table of built-in modules.  The `newtab'
array must end with a sentinel entry which contains @code{NULL} for the @ref{558c,,name}
field; failure to provide the sentinel value can result in a memory fault.
Returns @code{0} on success or @code{-1} if insufficient memory could be allocated to
extend the internal table.  In the event of failure, no modules are added to the
internal table.  This must be called before @ref{45e,,Py_Initialize()}.

If Python is initialized multiple times, @ref{1b60,,PyImport_AppendInittab()} or
@ref{1b61,,PyImport_ExtendInittab()} must be called before each Python
initialization.
@end deffn

@geindex PyImport_Inittab (C var)
@anchor{c-api/import c PyImport_Inittab}@anchor{1b5f}
@deffn {C Variable} struct @ref{558b,,_inittab} *PyImport_Inittab

The table of built-in modules used by Python initialization. Do not use this directly;
use @ref{1b60,,PyImport_AppendInittab()} and @ref{1b61,,PyImport_ExtendInittab()}
instead.
@end deffn

@geindex PyImport_ImportModuleAttr (C function)
@anchor{c-api/import c PyImport_ImportModuleAttr}@anchor{394}
@deffn {C Function} @ref{5df,,PyObject} *PyImport_ImportModuleAttr (PyObject *mod_name, PyObject *attr_name)
`Return value: New reference.'
Import the module `mod_name' and get its attribute `attr_name'.

Names must be Python @ref{16a,,str} objects.

Helper function combining @ref{1608,,PyImport_Import()} and
@ref{5ee,,PyObject_GetAttr()}. For example, it can raise @ref{65b,,ImportError} if
the module is not found, and @ref{5f0,,AttributeError} if the attribute doesn’t
exist.


Added in version 3.14.

@end deffn

@geindex PyImport_ImportModuleAttrString (C function)
@anchor{c-api/import c PyImport_ImportModuleAttrString}@anchor{395}
@deffn {C Function} @ref{5df,,PyObject} *PyImport_ImportModuleAttrString (const char *mod_name, const char *attr_name)
`Return value: New reference.'
Similar to @ref{394,,PyImport_ImportModuleAttr()}, but names are UTF-8 encoded
strings instead of Python @ref{16a,,str} objects.


Added in version 3.14.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Data marshalling support,Parsing arguments and building values,Importing Modules<2>,Utilities<2>
@anchor{c-api/marshal doc}@anchor{558e}@anchor{c-api/marshal data-marshalling-support}@anchor{558f}@anchor{c-api/marshal marshalling-utils}@anchor{5590}@anchor{c-api/marshal translation-repo}@anchor{5591}
@subsection Data marshalling support


These routines allow C code to work with serialized objects using the same
data format as the @ref{91,,marshal} module.  There are functions to write data
into the serialization format, and additional functions that can be used to
read the data back.  Files used to store marshalled data must be opened in
binary mode.

Numeric values are stored with the least significant byte first.

The module supports several versions of the data format; see
the @ref{91,,Python module documentation} for details.

@geindex Py_MARSHAL_VERSION (C macro)
@anchor{c-api/marshal c Py_MARSHAL_VERSION}@anchor{5592}
@deffn {C Macro} Py_MARSHAL_VERSION

The current format version. See @ref{2db3,,marshal.version}.
@end deffn

@geindex PyMarshal_WriteLongToFile (C function)
@anchor{c-api/marshal c PyMarshal_WriteLongToFile}@anchor{99e}
@deffn {C Function} void PyMarshal_WriteLongToFile (long value, FILE *file, int version)

Marshal a long integer, `value', to `file'.  This will only write
the least-significant 32 bits of `value'; regardless of the size of the
native long type.  `version' indicates the file format.

This function can fail, in which case it sets the error indicator.
Use @ref{1cf0,,PyErr_Occurred()} to check for that.
@end deffn

@geindex PyMarshal_WriteObjectToFile (C function)
@anchor{c-api/marshal c PyMarshal_WriteObjectToFile}@anchor{99f}
@deffn {C Function} void PyMarshal_WriteObjectToFile (PyObject *value, FILE *file, int version)

Marshal a Python object, `value', to `file'.
`version' indicates the file format.

This function can fail, in which case it sets the error indicator.
Use @ref{1cf0,,PyErr_Occurred()} to check for that.
@end deffn

@geindex PyMarshal_WriteObjectToString (C function)
@anchor{c-api/marshal c PyMarshal_WriteObjectToString}@anchor{9a1}
@deffn {C Function} @ref{5df,,PyObject} *PyMarshal_WriteObjectToString (PyObject *value, int version)
`Return value: New reference.'
Return a bytes object containing the marshalled representation of `value'.
`version' indicates the file format.
@end deffn

The following functions allow marshalled values to be read back in.

@geindex PyMarshal_ReadLongFromFile (C function)
@anchor{c-api/marshal c PyMarshal_ReadLongFromFile}@anchor{5593}
@deffn {C Function} long PyMarshal_ReadLongFromFile (FILE *file)

Return a C long from the data stream in a FILE* opened
for reading.  Only a 32-bit value can be read in using this function,
regardless of the native size of long.

On error, sets the appropriate exception (@ref{14e5,,EOFError}) and returns
@code{-1}.
@end deffn

@geindex PyMarshal_ReadShortFromFile (C function)
@anchor{c-api/marshal c PyMarshal_ReadShortFromFile}@anchor{5594}
@deffn {C Function} int PyMarshal_ReadShortFromFile (FILE *file)

Return a C short from the data stream in a FILE* opened
for reading.  Only a 16-bit value can be read in using this function,
regardless of the native size of short.

On error, sets the appropriate exception (@ref{14e5,,EOFError}) and returns
@code{-1}.
@end deffn

@geindex PyMarshal_ReadObjectFromFile (C function)
@anchor{c-api/marshal c PyMarshal_ReadObjectFromFile}@anchor{5595}
@deffn {C Function} @ref{5df,,PyObject} *PyMarshal_ReadObjectFromFile (FILE *file)
`Return value: New reference.'
Return a Python object from the data stream in a FILE* opened for
reading.

On error, sets the appropriate exception (@ref{14e5,,EOFError}, @ref{2ee,,ValueError}
or @ref{199,,TypeError}) and returns @code{NULL}.
@end deffn

@geindex PyMarshal_ReadLastObjectFromFile (C function)
@anchor{c-api/marshal c PyMarshal_ReadLastObjectFromFile}@anchor{5596}
@deffn {C Function} @ref{5df,,PyObject} *PyMarshal_ReadLastObjectFromFile (FILE *file)
`Return value: New reference.'
Return a Python object from the data stream in a FILE* opened for
reading.  Unlike @ref{5595,,PyMarshal_ReadObjectFromFile()}, this function
assumes that no further objects will be read from the file, allowing it to
aggressively load file data into memory so that the de-serialization can
operate from data in memory rather than reading a byte at a time from the
file.  Only use this variant if you are certain that you won’t be reading
anything else from the file.

On error, sets the appropriate exception (@ref{14e5,,EOFError}, @ref{2ee,,ValueError}
or @ref{199,,TypeError}) and returns @code{NULL}.
@end deffn

@geindex PyMarshal_ReadObjectFromString (C function)
@anchor{c-api/marshal c PyMarshal_ReadObjectFromString}@anchor{9a0}
@deffn {C Function} @ref{5df,,PyObject} *PyMarshal_ReadObjectFromString (const char *data, Py_ssize_t len)
`Return value: New reference.'
Return a Python object from the data stream in a byte buffer
containing `len' bytes pointed to by `data'.

On error, sets the appropriate exception (@ref{14e5,,EOFError}, @ref{2ee,,ValueError}
or @ref{199,,TypeError}) and returns @code{NULL}.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Parsing arguments and building values,String conversion and formatting,Data marshalling support,Utilities<2>
@anchor{c-api/arg doc}@anchor{5597}@anchor{c-api/arg arg-parsing}@anchor{3d3}@anchor{c-api/arg parsing-arguments-and-building-values}@anchor{5598}@anchor{c-api/arg translation-repo}@anchor{5599}
@subsection Parsing arguments and building values


These functions are useful when creating your own extension functions and
methods.  Additional information and examples are available in
@ref{1fff,,Extending and Embedding the Python Interpreter}.

The first three of these functions described, @ref{3bf,,PyArg_ParseTuple()},
@ref{624,,PyArg_ParseTupleAndKeywords()}, and @ref{1858,,PyArg_Parse()}, all use `format
strings' which are used to tell the function about the expected arguments.  The
format strings use the same syntax for each of these functions.

@menu
* Parsing arguments: Parsing arguments<2>. 
* Building values:: 

@end menu

@node Parsing arguments<2>,Building values,,Parsing arguments and building values
@anchor{c-api/arg parsing-arguments}@anchor{559a}
@subsubsection Parsing arguments


A format string consists of zero or more “format units.”  A format unit
describes one Python object; it is usually a single character or a parenthesized
sequence of format units.  With a few exceptions, a format unit that is not a
parenthesized sequence normally corresponds to a single address argument to
these functions.  In the following description, the quoted form is the format
unit; the entry in (round) parentheses is the Python object type that matches
the format unit; and the entry in [square] brackets is the type of the C
variable(s) whose address should be passed.

@menu
* Strings and buffers:: 
* Numbers: Numbers<2>. 
* Other objects:: 
* API Functions:: 

@end menu

@node Strings and buffers,Numbers<2>,,Parsing arguments<2>
@anchor{c-api/arg arg-parsing-string-and-buffers}@anchor{62c}@anchor{c-api/arg strings-and-buffers}@anchor{559b}
@subsubsection Strings and buffers


@cartouche
@quotation Note 
On Python 3.12 and older, the macro @code{PY_SSIZE_T_CLEAN} must be
defined before including @code{Python.h} to use all @code{#} variants of
formats (@code{s#}, @code{y#}, etc.) explained below.
This is not necessary on Python 3.13 and later.
@end quotation
@end cartouche

These formats allow accessing an object as a contiguous chunk of memory.
You don’t have to provide raw storage for the returned unicode or bytes
area.

Unless otherwise stated, buffers are not NUL-terminated.

There are three ways strings and buffers can be converted to C:


@itemize *

@item 
Formats such as @code{y*} and @code{s*} fill a @ref{961,,Py_buffer} structure.
This locks the underlying buffer so that the caller can subsequently use
the buffer even inside a @ref{521d,,Py_BEGIN_ALLOW_THREADS}
block without the risk of mutable data being resized or destroyed.
As a result, `you have to call' @ref{63b,,PyBuffer_Release()} after you have
finished processing the data (or in any early abort case).

@item 
The @code{es}, @code{es#}, @code{et} and @code{et#} formats allocate the result buffer.
`You have to call' @ref{164e,,PyMem_Free()} after you have finished
processing the data (or in any early abort case).

@item @anchor{c-api/arg c-arg-borrowed-buffer}@anchor{3d4}
Other formats take a @ref{16a,,str} or a read-only @ref{194,,bytes-like object},
such as @ref{193,,bytes}, and provide a @code{const char *} pointer to
its buffer.
In this case the buffer is “borrowed”: it is managed by the corresponding
Python object, and shares the lifetime of this object.
You won’t have to release any memory yourself.

To ensure that the underlying buffer may be safely borrowed, the object’s
@ref{96c,,PyBufferProcs.bf_releasebuffer} field must be @code{NULL}.
This disallows common mutable objects such as @ref{342,,bytearray},
but also some read-only objects such as @ref{166,,memoryview} of
@ref{193,,bytes}.

Besides this @code{bf_releasebuffer} requirement, there is no check to verify
whether the input object is immutable (e.g. whether it would honor a request
for a writable buffer, or whether another thread can mutate the data).
@end itemize


@table @asis

@item @code{s} (@ref{16a,,str}) [const char *]

Convert a Unicode object to a C pointer to a character string.
A pointer to an existing string is stored in the character pointer
variable whose address you pass.  The C string is NUL-terminated.
The Python string must not contain embedded null code points; if it does,
a @ref{2ee,,ValueError} exception is raised. Unicode objects are converted
to C strings using @code{'utf-8'} encoding. If this conversion fails, a
@ref{460,,UnicodeError} is raised.

@cartouche
@quotation Note 
This format does not accept @ref{194,,bytes-like objects}.  If you want to accept
filesystem paths and convert them to C character strings, it is
preferable to use the @code{O&} format with @ref{f1b,,PyUnicode_FSConverter()}
as `converter'.
@end quotation
@end cartouche


Changed in version 3.5: Previously, @ref{199,,TypeError} was raised when embedded null code points
were encountered in the Python string.


@item @code{s*} (@ref{16a,,str} or @ref{194,,bytes-like object}) [Py_buffer]

This format accepts Unicode objects as well as bytes-like objects.
It fills a @ref{961,,Py_buffer} structure provided by the caller.
In this case the resulting C string may contain embedded NUL bytes.
Unicode objects are converted to C strings using @code{'utf-8'} encoding.

@item @code{s#} (@ref{16a,,str}, read-only @ref{194,,bytes-like object}) [const char *, @ref{c5b,,Py_ssize_t}]

Like @code{s*}, except that it provides a @ref{3d4,,borrowed buffer}.
The result is stored into two C variables,
the first one a pointer to a C string, the second one its length.
The string may contain embedded null bytes. Unicode objects are converted
to C strings using @code{'utf-8'} encoding.

@item @code{z} (@ref{16a,,str} or @code{None}) [const char *]

Like @code{s}, but the Python object may also be @code{None}, in which case the C
pointer is set to @code{NULL}.

@item @code{z*} (@ref{16a,,str}, @ref{194,,bytes-like object} or @code{None}) [Py_buffer]

Like @code{s*}, but the Python object may also be @code{None}, in which case the
@code{buf} member of the @ref{961,,Py_buffer} structure is set to @code{NULL}.

@item @code{z#} (@ref{16a,,str}, read-only @ref{194,,bytes-like object} or @code{None}) [const char *, @ref{c5b,,Py_ssize_t}]

Like @code{s#}, but the Python object may also be @code{None}, in which case the C
pointer is set to @code{NULL}.

@item @code{y} (read-only @ref{194,,bytes-like object}) [const char *]

This format converts a bytes-like object to a C pointer to a
@ref{3d4,,borrowed} character string;
it does not accept Unicode objects.  The bytes buffer must not
contain embedded null bytes; if it does, a @ref{2ee,,ValueError}
exception is raised.


Changed in version 3.5: Previously, @ref{199,,TypeError} was raised when embedded null bytes were
encountered in the bytes buffer.


@item @code{y*} (@ref{194,,bytes-like object}) [Py_buffer]

This variant on @code{s*} doesn’t accept Unicode objects, only
bytes-like objects.  `This is the recommended way to accept
binary data.'

@item @code{y#} (read-only @ref{194,,bytes-like object}) [const char *, @ref{c5b,,Py_ssize_t}]

This variant on @code{s#} doesn’t accept Unicode objects, only bytes-like
objects.

@item @code{S} (@ref{193,,bytes}) [PyBytesObject *]

Requires that the Python object is a @ref{193,,bytes} object, without
attempting any conversion.  Raises @ref{199,,TypeError} if the object is not
a bytes object.  The C variable may also be declared as @ref{5df,,PyObject}*.

@item @code{Y} (@ref{342,,bytearray}) [PyByteArrayObject *]

Requires that the Python object is a @ref{342,,bytearray} object, without
attempting any conversion.  Raises @ref{199,,TypeError} if the object is not
a @code{bytearray} object. The C variable may also be declared as @ref{5df,,PyObject}*.

@item @code{U} (@ref{16a,,str}) [PyObject *]

Requires that the Python object is a Unicode object, without attempting
any conversion.  Raises @ref{199,,TypeError} if the object is not a Unicode
object.  The C variable may also be declared as @ref{5df,,PyObject}*.

@item @code{w*} (read-write @ref{194,,bytes-like object}) [Py_buffer]

This format accepts any object which implements the read-write buffer
interface. It fills a @ref{961,,Py_buffer} structure provided by the caller.
The buffer may contain embedded null bytes. The caller has to call
@ref{63b,,PyBuffer_Release()} when it is done with the buffer.

@item @code{es} (@ref{16a,,str}) [const char *encoding, char **buffer]

This variant on @code{s} is used for encoding Unicode into a character buffer.
It only works for encoded data without embedded NUL bytes.

This format requires two arguments.  The first is only used as input, and
must be a const char* which points to the name of an encoding as a
NUL-terminated string, or @code{NULL}, in which case @code{'utf-8'} encoding is used.
An exception is raised if the named encoding is not known to Python.  The
second argument must be a char**; the value of the pointer it
references will be set to a buffer with the contents of the argument text.
The text will be encoded in the encoding specified by the first argument.

@ref{3bf,,PyArg_ParseTuple()} will allocate a buffer of the needed size, copy the
encoded data into this buffer and adjust `*buffer' to reference the newly
allocated storage.  The caller is responsible for calling @ref{164e,,PyMem_Free()} to
free the allocated buffer after use.

@item @code{et} (@ref{16a,,str}, @ref{193,,bytes} or @ref{342,,bytearray}) [const char *encoding, char **buffer]

Same as @code{es} except that byte string objects are passed through without
recoding them.  Instead, the implementation assumes that the byte string object uses
the encoding passed in as parameter.

@item @code{es#} (@ref{16a,,str}) [const char *encoding, char **buffer, @ref{c5b,,Py_ssize_t} *buffer_length]

This variant on @code{s#} is used for encoding Unicode into a character buffer.
Unlike the @code{es} format, this variant allows input data which contains NUL
characters.

It requires three arguments.  The first is only used as input, and must be a
const char* which points to the name of an encoding as a
NUL-terminated string, or @code{NULL}, in which case @code{'utf-8'} encoding is used.
An exception is raised if the named encoding is not known to Python.  The
second argument must be a char**; the value of the pointer it
references will be set to a buffer with the contents of the argument text.
The text will be encoded in the encoding specified by the first argument.
The third argument must be a pointer to an integer; the referenced integer
will be set to the number of bytes in the output buffer.

There are two modes of operation:

If `*buffer' points a @code{NULL} pointer, the function will allocate a buffer of
the needed size, copy the encoded data into this buffer and set `*buffer' to
reference the newly allocated storage.  The caller is responsible for calling
@ref{164e,,PyMem_Free()} to free the allocated buffer after usage.

If `*buffer' points to a non-@code{NULL} pointer (an already allocated buffer),
@ref{3bf,,PyArg_ParseTuple()} will use this location as the buffer and interpret the
initial value of `*buffer_length' as the buffer size.  It will then copy the
encoded data into the buffer and NUL-terminate it.  If the buffer is not large
enough, a @ref{2ee,,ValueError} will be set.

In both cases, `*buffer_length' is set to the length of the encoded data
without the trailing NUL byte.

@item @code{et#} (@ref{16a,,str}, @ref{193,,bytes} or @ref{342,,bytearray}) [const char *encoding, char **buffer, @ref{c5b,,Py_ssize_t} *buffer_length]

Same as @code{es#} except that byte string objects are passed through without recoding
them. Instead, the implementation assumes that the byte string object uses the
encoding passed in as parameter.
@end table


Changed in version 3.12: @code{u}, @code{u#}, @code{Z}, and @code{Z#} are removed because they used a legacy
@code{Py_UNICODE*} representation.


@node Numbers<2>,Other objects,Strings and buffers,Parsing arguments<2>
@anchor{c-api/arg numbers}@anchor{559c}
@subsubsection Numbers


These formats allow representing Python numbers or single characters as C numbers.
Formats that require @ref{19c,,int}, @ref{197,,float} or @ref{198,,complex} can
also use the corresponding special methods @ref{19f,,__index__()},
@ref{bc7,,__float__()} or @ref{7fe,,__complex__()} to convert
the Python object to the required type.

For signed integer formats, @ref{a87,,OverflowError} is raised if the value
is out of range for the C type.
For unsigned integer formats, no range checking is done — the
most significant bits are silently truncated when the receiving field is too
small to receive the value.


@table @asis

@item @code{b} (@ref{19c,,int}) [unsigned char]

Convert a nonnegative Python integer to an unsigned tiny integer, stored in a C
unsigned char.

@item @code{B} (@ref{19c,,int}) [unsigned char]

Convert a Python integer to a tiny integer without overflow checking, stored in a C
unsigned char.

@item @code{h} (@ref{19c,,int}) [short int]

Convert a Python integer to a C short int.

@item @code{H} (@ref{19c,,int}) [unsigned short int]

Convert a Python integer to a C unsigned short int, without overflow
checking.

@item @code{i} (@ref{19c,,int}) [int]

Convert a Python integer to a plain C int.

@item @code{I} (@ref{19c,,int}) [unsigned int]

Convert a Python integer to a C unsigned int, without overflow
checking.

@item @code{l} (@ref{19c,,int}) [long int]

Convert a Python integer to a C long int.

@item @code{k} (@ref{19c,,int}) [unsigned long]

Convert a Python integer to a C unsigned long without
overflow checking.


Changed in version 3.14: Use @ref{19f,,__index__()} if available.


@item @code{L} (@ref{19c,,int}) [long long]

Convert a Python integer to a C long long.

@item @code{K} (@ref{19c,,int}) [unsigned long long]

Convert a Python integer to a C unsigned long long
without overflow checking.


Changed in version 3.14: Use @ref{19f,,__index__()} if available.


@item @code{n} (@ref{19c,,int}) [@ref{c5b,,Py_ssize_t}]

Convert a Python integer to a C @ref{c5b,,Py_ssize_t}.

@item @code{c} (@ref{193,,bytes} or @ref{342,,bytearray} of length 1) [char]

Convert a Python byte, represented as a @ref{193,,bytes} or
@ref{342,,bytearray} object of length 1, to a C char.


Changed in version 3.3: Allow @ref{342,,bytearray} objects.


@item @code{C} (@ref{16a,,str} of length 1) [int]

Convert a Python character, represented as a @ref{16a,,str} object of
length 1, to a C int.

@item @code{f} (@ref{197,,float}) [float]

Convert a Python floating-point number to a C float.

@item @code{d} (@ref{197,,float}) [double]

Convert a Python floating-point number to a C double.

@item @code{D} (@ref{198,,complex}) [Py_complex]

Convert a Python complex number to a C @ref{559d,,Py_complex} structure.
@end table

@node Other objects,API Functions,Numbers<2>,Parsing arguments<2>
@anchor{c-api/arg other-objects}@anchor{559e}
@subsubsection Other objects



@table @asis

@item @code{O} (object) [PyObject *]

Store a Python object (without any conversion) in a C object pointer.  The C
program thus receives the actual object that was passed.  A new
@ref{5e2,,strong reference} to the object is not created
(i.e. its reference count is not increased).
The pointer stored is not @code{NULL}.

@item @code{O!} (object) [`typeobject', PyObject *]

Store a Python object in a C object pointer.  This is similar to @code{O}, but
takes two C arguments: the first is the address of a Python type object, the
second is the address of the C variable (of type @ref{5df,,PyObject}*) into which
the object pointer is stored.  If the Python object does not have the required
type, @ref{199,,TypeError} is raised.
@end table
@anchor{c-api/arg o-ampersand}@anchor{559f}

@table @asis

@item @code{O&} (object) [`converter', `address']

Convert a Python object to a C variable through a `converter' function.  This
takes two arguments: the first is a function, the second is the address of a C
variable (of arbitrary type), converted to void*.  The `converter'
function in turn is called as follows:

@example
status = converter(object, address);
@end example

where `object' is the Python object to be converted and `address' is the
void* argument that was passed to the @code{PyArg_Parse*} function.
The returned `status' should be @code{1} for a successful conversion and @code{0} if
the conversion has failed.  When the conversion fails, the `converter' function
should raise an exception and leave the content of `address' unmodified.

@geindex Py_CLEANUP_SUPPORTED (C macro)
@anchor{c-api/arg c Py_CLEANUP_SUPPORTED}@anchor{55a0}
If the `converter' returns @code{Py_CLEANUP_SUPPORTED}, it may get called a
second time if the argument parsing eventually fails, giving the converter a
chance to release any memory that it had already allocated. In this second
call, the `object' parameter will be @code{NULL}; `address' will have the same value
as in the original call.

Examples of converters: @ref{f1b,,PyUnicode_FSConverter()} and
@ref{798,,PyUnicode_FSDecoder()}.


Changed in version 3.1: @code{Py_CLEANUP_SUPPORTED} was added.


@item @code{p} (@ref{3c1,,bool}) [int]

Tests the value passed in for truth (a boolean `p'redicate) and converts
the result to its equivalent C true/false integer value.
Sets the int to @code{1} if the expression was true and @code{0} if it was false.
This accepts any valid Python value.  See @ref{18a1,,Truth Value Testing} for more
information about how Python tests values for truth.


Added in version 3.3.


@item @code{(items)} (sequence) [`matching-items']

The object must be a Python sequence (except @ref{16a,,str}, @ref{193,,bytes}
or @ref{342,,bytearray}) whose length is the number of format units
in `items'.  The C arguments must correspond to the individual format units in
`items'.  Format units for sequences may be nested.

If `items' contains format units which store a @ref{3d4,,borrowed buffer} (@code{s}, @code{s#}, @code{z}, @code{z#}, @code{y}, or @code{y#})
or a @ref{3d5,,borrowed reference} (@code{S}, @code{Y}, @code{U}, @code{O}, or @code{O!}),
the object must be a Python tuple.
The `converter' for the @code{O&} format unit in `items' must not store
a borrowed buffer or a borrowed reference.


Changed in version 3.14: @ref{16a,,str} and @ref{342,,bytearray} objects no longer accepted as a sequence.



Deprecated since version 3.14: Non-tuple sequences are deprecated if `items' contains format units
which store a borrowed buffer or a borrowed reference.

@end table

A few other characters have a meaning in a format string.  These may not occur
inside nested parentheses.  They are:


@table @asis

@item @code{|}

Indicates that the remaining arguments in the Python argument list are optional.
The C variables corresponding to optional arguments should be initialized to
their default value — when an optional argument is not specified,
@ref{3bf,,PyArg_ParseTuple()} does not touch the contents of the corresponding C
variable(s).

@item @code{$}

@ref{624,,PyArg_ParseTupleAndKeywords()} only:
Indicates that the remaining arguments in the Python argument list are
keyword-only.  Currently, all keyword-only arguments must also be optional
arguments, so @code{|} must always be specified before @code{$} in the format
string.


Added in version 3.3.


@item @code{:}

The list of format units ends here; the string after the colon is used as the
function name in error messages (the “associated value” of the exception that
@ref{3bf,,PyArg_ParseTuple()} raises).

@item @code{;}

The list of format units ends here; the string after the semicolon is used as
the error message `instead' of the default error message.  @code{:} and @code{;}
mutually exclude each other.
@end table

Note that any Python object references which are provided to the caller are
`borrowed' references; do not release them
(i.e. do not decrement their reference count)!

Additional arguments passed to these functions must be addresses of variables
whose type is determined by the format string; these are used to store values
from the input tuple.  There are a few cases, as described in the list of format
units above, where these parameters are used as input values; they should match
what is specified for the corresponding format unit in that case.

For the conversion to succeed, the `arg' object must match the format
and the format must be exhausted.  On success, the
@code{PyArg_Parse*} functions return true, otherwise they return
false and raise an appropriate exception. When the
@code{PyArg_Parse*} functions fail due to conversion failure in one
of the format units, the variables at the addresses corresponding to that
and the following format units are left untouched.

@node API Functions,,Other objects,Parsing arguments<2>
@anchor{c-api/arg api-functions}@anchor{55a1}
@subsubsection API Functions


@geindex PyArg_ParseTuple (C function)
@anchor{c-api/arg c PyArg_ParseTuple}@anchor{3bf}
@deffn {C Function} int PyArg_ParseTuple (PyObject *args, const char *format, ...)
` Part of the @ref{776,,Stable ABI}.'
Parse the parameters of a function that takes only positional parameters into
local variables.  Returns true on success; on failure, it returns false and
raises the appropriate exception.
@end deffn

@geindex PyArg_VaParse (C function)
@anchor{c-api/arg c PyArg_VaParse}@anchor{52c4}
@deffn {C Function} int PyArg_VaParse (PyObject *args, const char *format, va_list vargs)
` Part of the @ref{776,,Stable ABI}.'
Identical to @ref{3bf,,PyArg_ParseTuple()}, except that it accepts a va_list rather
than a variable number of arguments.
@end deffn

@geindex PyArg_ParseTupleAndKeywords (C function)
@anchor{c-api/arg c PyArg_ParseTupleAndKeywords}@anchor{624}
@deffn {C Function} int PyArg_ParseTupleAndKeywords (PyObject *args, PyObject *kw, const char *format, char *const *keywords, ...)
` Part of the @ref{776,,Stable ABI}.'
Parse the parameters of a function that takes both positional and keyword
parameters into local variables.
The `keywords' argument is a @code{NULL}-terminated array of keyword parameter
names specified as null-terminated ASCII or UTF-8 encoded C strings.
Empty names denote
@ref{c7e,,positional-only parameters}.
Returns true on success; on failure, it returns false and raises the
appropriate exception.

@cartouche
@quotation Note 
The `keywords' parameter declaration is char *const* in C and
const char *const* in C++.
This can be overridden with the @ref{626,,PY_CXX_CONST} macro.
@end quotation
@end cartouche


Changed in version 3.6: Added support for @ref{c7e,,positional-only parameters}.



Changed in version 3.13: The `keywords' parameter has now type char *const* in C and
const char *const* in C++, instead of char**.
Added support for non-ASCII keyword parameter names.

@end deffn

@geindex PyArg_VaParseTupleAndKeywords (C function)
@anchor{c-api/arg c PyArg_VaParseTupleAndKeywords}@anchor{625}
@deffn {C Function} int PyArg_VaParseTupleAndKeywords (PyObject *args, PyObject *kw, const char *format, char *const *keywords, va_list vargs)
` Part of the @ref{776,,Stable ABI}.'
Identical to @ref{624,,PyArg_ParseTupleAndKeywords()}, except that it accepts a
va_list rather than a variable number of arguments.
@end deffn

@geindex PyArg_ValidateKeywordArguments (C function)
@anchor{c-api/arg c PyArg_ValidateKeywordArguments}@anchor{52c5}
@deffn {C Function} int PyArg_ValidateKeywordArguments (PyObject*)
` Part of the @ref{776,,Stable ABI}.'
Ensure that the keys in the keywords argument dictionary are strings.  This
is only needed if @ref{624,,PyArg_ParseTupleAndKeywords()} is not used, since the
latter already does this check.


Added in version 3.2.

@end deffn

@geindex PyArg_Parse (C function)
@anchor{c-api/arg c PyArg_Parse}@anchor{1858}
@deffn {C Function} int PyArg_Parse (PyObject *args, const char *format, ...)
` Part of the @ref{776,,Stable ABI}.'
Parse the parameter of a function that takes a single positional parameter
into a local variable.  Returns true on success; on failure, it returns
false and raises the appropriate exception.

Example:

@example
// Function using METH_O calling convention
static PyObject*
my_function(PyObject *module, PyObject *arg)
@{
    int value;
    if (!PyArg_Parse(arg, "i:my_function", &value)) @{
        return NULL;
    @}
    // ... use value ...
@}
@end example
@end deffn

@geindex PyArg_UnpackTuple (C function)
@anchor{c-api/arg c PyArg_UnpackTuple}@anchor{1712}
@deffn {C Function} int PyArg_UnpackTuple (PyObject *args, const char *name, Py_ssize_t min, Py_ssize_t max, ...)
` Part of the @ref{776,,Stable ABI}.'
A simpler form of parameter retrieval which does not use a format string to
specify the types of the arguments.  Functions which use this method to retrieve
their parameters should be declared as @ref{1714,,METH_VARARGS} in function or
method tables.  The tuple containing the actual parameters should be passed as
`args'; it must actually be a tuple.  The length of the tuple must be at least
`min' and no more than `max'; `min' and `max' may be equal.  Additional
arguments must be passed to the function, each of which should be a pointer to a
@ref{5df,,PyObject}* variable; these will be filled in with the values from
`args'; they will contain @ref{3d5,,borrowed references}.
The variables which correspond
to optional parameters not given by `args' will not be filled in; these should
be initialized by the caller. This function returns true on success and false if
`args' is not a tuple or contains the wrong number of elements; an exception
will be set if there was a failure.

This is an example of the use of this function, taken from the sources for the
@code{_weakref} helper module for weak references:

@example
static PyObject *
weakref_ref(PyObject *self, PyObject *args)
@{
    PyObject *object;
    PyObject *callback = NULL;
    PyObject *result = NULL;

    if (PyArg_UnpackTuple(args, "ref", 1, 2, &object, &callback)) @{
        result = PyWeakref_NewRef(object, callback);
    @}
    return result;
@}
@end example

The call to @ref{1712,,PyArg_UnpackTuple()} in this example is entirely equivalent to
this call to @ref{3bf,,PyArg_ParseTuple()}:

@example
PyArg_ParseTuple(args, "O|O:ref", &object, &callback)
@end example
@end deffn

@geindex PY_CXX_CONST (C macro)
@anchor{c-api/arg c PY_CXX_CONST}@anchor{626}
@deffn {C Macro} PY_CXX_CONST

The value to be inserted, if any, before char *const*
in the `keywords' parameter declaration of
@ref{624,,PyArg_ParseTupleAndKeywords()} and
@ref{625,,PyArg_VaParseTupleAndKeywords()}.
Default empty for C and @code{const} for C++
(const char *const*).
To override, define it to the desired value before including
@code{Python.h}.


Added in version 3.13.

@end deffn

@node Building values,,Parsing arguments<2>,Parsing arguments and building values
@anchor{c-api/arg building-values}@anchor{55a2}
@subsubsection Building values


@geindex Py_BuildValue (C function)
@anchor{c-api/arg c Py_BuildValue}@anchor{3c0}
@deffn {C Function} @ref{5df,,PyObject} *Py_BuildValue (const char *format, ...)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Create a new value based on a format string similar to those accepted by the
@code{PyArg_Parse*} family of functions and a sequence of values.  Returns
the value or @code{NULL} in the case of an error; an exception will be raised if
@code{NULL} is returned.

@ref{3c0,,Py_BuildValue()} does not always build a tuple.  It builds a tuple only if
its format string contains two or more format units.  If the format string is
empty, it returns @code{None}; if it contains exactly one format unit, it returns
whatever object is described by that format unit.  To force it to return a tuple
of size 0 or one, parenthesize the format string.

When memory buffers are passed as parameters to supply data to build objects, as
for the @code{s} and @code{s#} formats, the required data is copied.  Buffers provided
by the caller are never referenced by the objects created by
@ref{3c0,,Py_BuildValue()}.  In other words, if your code invokes @code{malloc()}
and passes the allocated memory to @code{Py_BuildValue()}, your code is
responsible for calling @code{free()} for that memory once
@code{Py_BuildValue()} returns.

In the following description, the quoted form is the format unit; the entry in
(round) parentheses is the Python object type that the format unit will return;
and the entry in [square] brackets is the type of the C value(s) to be passed.

The characters space, tab, colon and comma are ignored in format strings (but
not within format units such as @code{s#}).  This can be used to make long format
strings a tad more readable.


@table @asis

@item @code{s} (@ref{16a,,str} or @code{None}) [const char *]

Convert a null-terminated C string to a Python @ref{16a,,str} object using @code{'utf-8'}
encoding. If the C string pointer is @code{NULL}, @code{None} is used.

@item @code{s#} (@ref{16a,,str} or @code{None}) [const char *, @ref{c5b,,Py_ssize_t}]

Convert a C string and its length to a Python @ref{16a,,str} object using @code{'utf-8'}
encoding. If the C string pointer is @code{NULL}, the length is ignored and
@code{None} is returned.

@item @code{y} (@ref{193,,bytes}) [const char *]

This converts a C string to a Python @ref{193,,bytes} object.  If the C
string pointer is @code{NULL}, @code{None} is returned.

@item @code{y#} (@ref{193,,bytes}) [const char *, @ref{c5b,,Py_ssize_t}]

This converts a C string and its lengths to a Python object.  If the C
string pointer is @code{NULL}, @code{None} is returned.

@item @code{z} (@ref{16a,,str} or @code{None}) [const char *]

Same as @code{s}.

@item @code{z#} (@ref{16a,,str} or @code{None}) [const char *, @ref{c5b,,Py_ssize_t}]

Same as @code{s#}.

@item @code{u} (@ref{16a,,str}) [const wchar_t *]

Convert a null-terminated @code{wchar_t} buffer of Unicode (UTF-16 or UCS-4)
data to a Python Unicode object.  If the Unicode buffer pointer is @code{NULL},
@code{None} is returned.

@item @code{u#} (@ref{16a,,str}) [const wchar_t *, @ref{c5b,,Py_ssize_t}]

Convert a Unicode (UTF-16 or UCS-4) data buffer and its length to a Python
Unicode object.   If the Unicode buffer pointer is @code{NULL}, the length is ignored
and @code{None} is returned.

@item @code{U} (@ref{16a,,str} or @code{None}) [const char *]

Same as @code{s}.

@item @code{U#} (@ref{16a,,str} or @code{None}) [const char *, @ref{c5b,,Py_ssize_t}]

Same as @code{s#}.

@item @code{i} (@ref{19c,,int}) [int]

Convert a plain C int to a Python integer object.

@item @code{b} (@ref{19c,,int}) [char]

Convert a plain C char to a Python integer object.

@item @code{h} (@ref{19c,,int}) [short int]

Convert a plain C short int to a Python integer object.

@item @code{l} (@ref{19c,,int}) [long int]

Convert a C long int to a Python integer object.

@item @code{B} (@ref{19c,,int}) [unsigned char]

Convert a C unsigned char to a Python integer object.

@item @code{H} (@ref{19c,,int}) [unsigned short int]

Convert a C unsigned short int to a Python integer object.

@item @code{I} (@ref{19c,,int}) [unsigned int]

Convert a C unsigned int to a Python integer object.

@item @code{k} (@ref{19c,,int}) [unsigned long]

Convert a C unsigned long to a Python integer object.

@item @code{L} (@ref{19c,,int}) [long long]

Convert a C long long to a Python integer object.
@end table
@anchor{c-api/arg capi-py-buildvalue-format-k}@anchor{18b4}

@table @asis

@item @code{K} (@ref{19c,,int}) [unsigned long long]

Convert a C unsigned long long to a Python integer object.

@item @code{n} (@ref{19c,,int}) [@ref{c5b,,Py_ssize_t}]

Convert a C @ref{c5b,,Py_ssize_t} to a Python integer.

@item @code{p} (@ref{3c1,,bool}) [int]

Convert a C int to a Python @ref{3c1,,bool} object.

Be aware that this format requires an @code{int} argument.
Unlike most other contexts in C, variadic arguments are not coerced to
a suitable type automatically.
You can convert another type (for example, a pointer or a float) to a
suitable @code{int} value using @code{(x) ? 1 : 0} or @code{!!x}.


Added in version 3.14.


@item @code{c} (@ref{193,,bytes} of length 1) [char]

Convert a C int representing a byte to a Python @ref{193,,bytes} object of
length 1.

@item @code{C} (@ref{16a,,str} of length 1) [int]

Convert a C int representing a character to Python @ref{16a,,str}
object of length 1.

@item @code{d} (@ref{197,,float}) [double]

Convert a C double to a Python floating-point number.

@item @code{f} (@ref{197,,float}) [float]

Convert a C float to a Python floating-point number.

@item @code{D} (@ref{198,,complex}) [Py_complex *]

Convert a C @ref{559d,,Py_complex} structure to a Python complex number.

@item @code{O} (object) [PyObject *]

Pass a Python object untouched but create a new
@ref{5e2,,strong reference} to it
(i.e. its reference count is incremented by one).
If the object passed in is a @code{NULL} pointer, it is assumed
that this was caused because the call producing the argument found an error and
set an exception. Therefore, @ref{3c0,,Py_BuildValue()} will return @code{NULL} but won’t
raise an exception.  If no exception has been raised yet, @ref{796,,SystemError} is
set.

@item @code{S} (object) [PyObject *]

Same as @code{O}.

@item @code{N} (object) [PyObject *]

Same as @code{O}, except it doesn’t create a new @ref{5e2,,strong reference}.
Useful when the object is created by a call to an object constructor in the
argument list.

@item @code{O&} (object) [`converter', `anything']

Convert `anything' to a Python object through a `converter' function.  The
function is called with `anything' (which should be compatible with void*)
as its argument and should return a “new” Python object, or @code{NULL} if an
error occurred.

@item @code{(items)} (@ref{614,,tuple}) [`matching-items']

Convert a sequence of C values to a Python tuple with the same number of items.

@item @code{[items]} (@ref{24f,,list}) [`matching-items']

Convert a sequence of C values to a Python list with the same number of items.

@item @code{@{items@}} (@ref{184,,dict}) [`matching-items']

Convert a sequence of C values to a Python dictionary.  Each pair of consecutive
C values adds one item to the dictionary, serving as key and value,
respectively.
@end table

If there is an error in the format string, the @ref{796,,SystemError} exception is
set and @code{NULL} returned.
@end deffn

@geindex Py_VaBuildValue (C function)
@anchor{c-api/arg c Py_VaBuildValue}@anchor{54aa}
@deffn {C Function} @ref{5df,,PyObject} *Py_VaBuildValue (const char *format, va_list vargs)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Identical to @ref{3c0,,Py_BuildValue()}, except that it accepts a va_list
rather than a variable number of arguments.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node String conversion and formatting,Character classification and conversion,Parsing arguments and building values,Utilities<2>
@anchor{c-api/conversion doc}@anchor{55a3}@anchor{c-api/conversion string-conversion}@anchor{55a4}@anchor{c-api/conversion string-conversion-and-formatting}@anchor{55a5}@anchor{c-api/conversion translation-repo}@anchor{55a6}
@subsection String conversion and formatting


Functions for number conversion and formatted string output.

@geindex PyOS_snprintf (C function)
@anchor{c-api/conversion c PyOS_snprintf}@anchor{1715}
@deffn {C Function} int PyOS_snprintf (char *str, size_t size, const char *format, ...)
` Part of the @ref{776,,Stable ABI}.'
Output not more than `size' bytes to `str' according to the format string
`format' and the extra arguments. See the Unix man page @code{snprintf(3)@footnote{https://manpages.debian.org/snprintf(3)}}.
@end deffn

@geindex PyOS_vsnprintf (C function)
@anchor{c-api/conversion c PyOS_vsnprintf}@anchor{1716}
@deffn {C Function} int PyOS_vsnprintf (char *str, size_t size, const char *format, va_list va)
` Part of the @ref{776,,Stable ABI}.'
Output not more than `size' bytes to `str' according to the format string
`format' and the variable argument list `va'. Unix man page
@code{vsnprintf(3)@footnote{https://manpages.debian.org/vsnprintf(3)}}.
@end deffn

@ref{1715,,PyOS_snprintf()} and @ref{1716,,PyOS_vsnprintf()} wrap the Standard C library
functions @code{snprintf()} and @code{vsnprintf()}. Their purpose is to
guarantee consistent behavior in corner cases, which the Standard C functions do
not.

The wrappers ensure that @code{str[size-1]} is always @code{'\0'} upon return. They
never write more than `size' bytes (including the trailing @code{'\0'}) into str.
Both functions require that @code{str != NULL}, @code{size > 0}, @code{format != NULL}
and @code{size < INT_MAX}. Note that this means there is no equivalent to the C99
@code{n = snprintf(NULL, 0, ...)} which would determine the necessary buffer size.

The return value (`rv') for these functions should be interpreted as follows:


@itemize *

@item 
When @code{0 <= rv < size}, the output conversion was successful and `rv'
characters were written to `str' (excluding the trailing @code{'\0'} byte at
@code{str[rv]}).

@item 
When @code{rv >= size}, the output conversion was truncated and a buffer with
@code{rv + 1} bytes would have been needed to succeed. @code{str[size-1]} is @code{'\0'}
in this case.

@item 
When @code{rv < 0}, the output conversion failed and @code{str[size-1]} is @code{'\0'} in
this case too, but the rest of `str' is undefined. The exact cause of the error
depends on the underlying platform.
@end itemize

The following functions provide locale-independent string to number conversions.

@geindex PyOS_strtoul (C function)
@anchor{c-api/conversion c PyOS_strtoul}@anchor{53e6}
@deffn {C Function} unsigned long PyOS_strtoul (const char *str, char **ptr, int base)
` Part of the @ref{776,,Stable ABI}.'
Convert the initial part of the string in @code{str} to an unsigned long value according to the given @code{base}, which must be between @code{2} and
@code{36} inclusive, or be the special value @code{0}.

Leading white space and case of characters are ignored.  If @code{base} is zero
it looks for a leading @code{0b}, @code{0o} or @code{0x} to tell which base.  If
these are absent it defaults to @code{10}.  Base must be 0 or between 2 and 36
(inclusive).  If @code{ptr} is non-@code{NULL} it will contain a pointer to the
end of the scan.

If the converted value falls out of range of corresponding return type,
range error occurs (@code{errno} is set to @code{ERANGE}) and
@code{ULONG_MAX} is returned.  If no conversion can be performed, @code{0}
is returned.

See also the Unix man page @code{strtoul(3)@footnote{https://manpages.debian.org/strtoul(3)}}.


Added in version 3.2.

@end deffn

@geindex PyOS_strtol (C function)
@anchor{c-api/conversion c PyOS_strtol}@anchor{53e5}
@deffn {C Function} long PyOS_strtol (const char *str, char **ptr, int base)
` Part of the @ref{776,,Stable ABI}.'
Convert the initial part of the string in @code{str} to an long value
according to the given @code{base}, which must be between @code{2} and @code{36}
inclusive, or be the special value @code{0}.

Same as @ref{53e6,,PyOS_strtoul()}, but return a long value instead
and @code{LONG_MAX} on overflows.

See also the Unix man page @code{strtol(3)@footnote{https://manpages.debian.org/strtol(3)}}.


Added in version 3.2.

@end deffn

@geindex PyOS_string_to_double (C function)
@anchor{c-api/conversion c PyOS_string_to_double}@anchor{14a1}
@deffn {C Function} double PyOS_string_to_double (const char *s, char **endptr, PyObject *overflow_exception)
` Part of the @ref{776,,Stable ABI}.'
Convert a string @code{s} to a double, raising a Python
exception on failure.  The set of accepted strings corresponds to
the set of strings accepted by Python’s @ref{197,,float()} constructor,
except that @code{s} must not have leading or trailing whitespace.
The conversion is independent of the current locale.

If @code{endptr} is @code{NULL}, convert the whole string.  Raise
@ref{2ee,,ValueError} and return @code{-1.0} if the string is not a valid
representation of a floating-point number.

If endptr is not @code{NULL}, convert as much of the string as
possible and set @code{*endptr} to point to the first unconverted
character.  If no initial segment of the string is the valid
representation of a floating-point number, set @code{*endptr} to point
to the beginning of the string, raise ValueError, and return
@code{-1.0}.

If @code{s} represents a value that is too large to store in a float
(for example, @code{"1e500"} is such a string on many platforms) then
if @code{overflow_exception} is @code{NULL} return @code{Py_INFINITY} (with
an appropriate sign) and don’t set any exception.  Otherwise,
@code{overflow_exception} must point to a Python exception object;
raise that exception and return @code{-1.0}.  In both cases, set
@code{*endptr} to point to the first character after the converted value.

If any other error occurs during the conversion (for example an
out-of-memory error), set the appropriate Python exception and
return @code{-1.0}.


Added in version 3.1.

@end deffn

@geindex PyOS_double_to_string (C function)
@anchor{c-api/conversion c PyOS_double_to_string}@anchor{53e3}
@deffn {C Function} char *PyOS_double_to_string (double val, char format_code, int precision, int flags, int *ptype)
` Part of the @ref{776,,Stable ABI}.'
Convert a double `val' to a string using supplied
`format_code', `precision', and `flags'.

`format_code' must be one of @code{'e'}, @code{'E'}, @code{'f'}, @code{'F'},
@code{'g'}, @code{'G'} or @code{'r'}.  For @code{'r'}, the supplied `precision'
must be 0 and is ignored.  The @code{'r'} format code specifies the
standard @ref{1c3,,repr()} format.

`flags' can be zero or more of the following values or-ed together:

@geindex Py_DTSF_SIGN (C macro)
@anchor{c-api/conversion c Py_DTSF_SIGN}@anchor{55a7}
@deffn {C Macro} Py_DTSF_SIGN

Always precede the returned string with a sign
character, even if `val' is non-negative.
@end deffn

@geindex Py_DTSF_ADD_DOT_0 (C macro)
@anchor{c-api/conversion c Py_DTSF_ADD_DOT_0}@anchor{55a8}
@deffn {C Macro} Py_DTSF_ADD_DOT_0

Ensure that the returned string will not look like an integer.
@end deffn

@geindex Py_DTSF_ALT (C macro)
@anchor{c-api/conversion c Py_DTSF_ALT}@anchor{55a9}
@deffn {C Macro} Py_DTSF_ALT

Apply “alternate” formatting rules.
See the documentation for the @ref{1715,,PyOS_snprintf()} @code{'#'} specifier for
details.
@end deffn

@geindex Py_DTSF_NO_NEG_0 (C macro)
@anchor{c-api/conversion c Py_DTSF_NO_NEG_0}@anchor{55aa}
@deffn {C Macro} Py_DTSF_NO_NEG_0

Negative zero is converted to positive zero.


Added in version 3.11.

@end deffn

If `ptype' is non-@code{NULL}, then the value it points to will be set to one
of the following constants depending on the type of `val':


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

`*ptype'

@tab

type of `val'

@item

@geindex Py_DTST_FINITE (C macro)
@anchor{c-api/conversion c Py_DTST_FINITE}@anchor{55ab}
@deffn {C Macro} Py_DTST_FINITE
@end deffn

@tab

finite number

@item

@geindex Py_DTST_INFINITE (C macro)
@anchor{c-api/conversion c Py_DTST_INFINITE}@anchor{55ac}
@deffn {C Macro} Py_DTST_INFINITE
@end deffn

@tab

infinite number

@item

@geindex Py_DTST_NAN (C macro)
@anchor{c-api/conversion c Py_DTST_NAN}@anchor{55ad}
@deffn {C Macro} Py_DTST_NAN
@end deffn

@tab

not a number

@end multitable


The return value is a pointer to `buffer' with the converted string or
@code{NULL} if the conversion failed. The caller is responsible for freeing the
returned string by calling @ref{164e,,PyMem_Free()}.


Added in version 3.1.

@end deffn

@geindex PyOS_mystricmp (C function)
@geindex PyOS_mystrnicmp (C function)
@anchor{c-api/conversion c PyOS_mystricmp}@anchor{1d7f}
@deffn {C Function} int PyOS_mystricmp (const char *str1, const char *str2)
@anchor{c-api/conversion c PyOS_mystrnicmp}@anchor{1d7e}
@deffnx {C Function} int PyOS_mystrnicmp (const char *str1, const char *str2, Py_ssize_t size)
` Part of the @ref{776,,Stable ABI}.'
Case insensitive comparison of strings. These functions work almost
identically to @code{strcmp()} and @code{strncmp()} (respectively),
except that they ignore the case of ASCII characters.

Return @code{0} if the strings are equal, a negative value if `str1' sorts
lexicographically before `str2', or a positive value if it sorts after.

In the `str1' or `str2' arguments, a NUL byte marks the end of the string.
For @code{PyOS_mystrnicmp()}, the `size' argument gives the maximum size
of the string, as if NUL was present at the index given by `size'.

These functions do not use the locale.
@end deffn

@geindex PyOS_stricmp (C function)
@geindex PyOS_strnicmp (C function)
@anchor{c-api/conversion c PyOS_stricmp}@anchor{55ae}
@deffn {C Function} int PyOS_stricmp (const char *str1, const char *str2)
@anchor{c-api/conversion c PyOS_strnicmp}@anchor{55af}
@deffnx {C Function} int PyOS_strnicmp (const char *str1, const char *str2, Py_ssize_t size)

Case insensitive comparison of strings.

On Windows, these are aliases of @code{stricmp()} and @code{strnicmp()},
respectively.

On other platforms, they are aliases of @ref{1d7f,,PyOS_mystricmp()} and
@ref{1d7e,,PyOS_mystrnicmp()}, respectively.
@end deffn

@node Character classification and conversion,PyHash API,String conversion and formatting,Utilities<2>
@anchor{c-api/conversion character-classification-and-conversion}@anchor{55b0}
@subsection Character classification and conversion


The following macros provide locale-independent (unlike the C standard library
@code{ctype.h}) character classification and conversion.
The argument must be a signed or unsigned char.

@geindex Py_ISALNUM (C macro)
@anchor{c-api/conversion c Py_ISALNUM}@anchor{155d}
@deffn {C Macro} Py_ISALNUM (c)

Return true if the character `c' is an alphanumeric character.
@end deffn

@geindex Py_ISALPHA (C macro)
@anchor{c-api/conversion c Py_ISALPHA}@anchor{155e}
@deffn {C Macro} Py_ISALPHA (c)

Return true if the character `c' is an alphabetic character (@code{a-z} and @code{A-Z}).
@end deffn

@geindex Py_ISDIGIT (C macro)
@anchor{c-api/conversion c Py_ISDIGIT}@anchor{155f}
@deffn {C Macro} Py_ISDIGIT (c)

Return true if the character `c' is a decimal digit (@code{0-9}).
@end deffn

@geindex Py_ISLOWER (C macro)
@anchor{c-api/conversion c Py_ISLOWER}@anchor{1560}
@deffn {C Macro} Py_ISLOWER (c)

Return true if the character `c' is a lowercase ASCII letter (@code{a-z}).
@end deffn

@geindex Py_ISUPPER (C macro)
@anchor{c-api/conversion c Py_ISUPPER}@anchor{1562}
@deffn {C Macro} Py_ISUPPER (c)

Return true if the character `c' is an uppercase ASCII letter (@code{A-Z}).
@end deffn

@geindex Py_ISSPACE (C macro)
@anchor{c-api/conversion c Py_ISSPACE}@anchor{1561}
@deffn {C Macro} Py_ISSPACE (c)

Return true if the character `c' is a whitespace character (space, tab,
carriage return, newline, vertical tab, or form feed).
@end deffn

@geindex Py_ISXDIGIT (C macro)
@anchor{c-api/conversion c Py_ISXDIGIT}@anchor{1563}
@deffn {C Macro} Py_ISXDIGIT (c)

Return true if the character `c' is a hexadecimal digit (@code{0-9}, @code{a-f}, and
@code{A-F}).
@end deffn

@geindex Py_TOLOWER (C macro)
@anchor{c-api/conversion c Py_TOLOWER}@anchor{1564}
@deffn {C Macro} Py_TOLOWER (c)

Return the lowercase equivalent of the character `c'.
@end deffn

@geindex Py_TOUPPER (C macro)
@anchor{c-api/conversion c Py_TOUPPER}@anchor{1565}
@deffn {C Macro} Py_TOUPPER (c)

Return the uppercase equivalent of the character `c'.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node PyHash API,Reflection,Character classification and conversion,Utilities<2>
@anchor{c-api/hash doc}@anchor{55b1}@anchor{c-api/hash pyhash-api}@anchor{55b2}@anchor{c-api/hash translation-repo}@anchor{55b3}
@subsection PyHash API


See also the @ref{5256,,PyTypeObject.tp_hash} member and @ref{2646,,Hashing of numeric types}.

@geindex Py_hash_t (C type)
@anchor{c-api/hash c Py_hash_t}@anchor{146f}
@deffn {C Type} type Py_hash_t

Hash value type: signed integer.


Added in version 3.2.

@end deffn

@geindex Py_uhash_t (C type)
@anchor{c-api/hash c Py_uhash_t}@anchor{55b4}
@deffn {C Type} type Py_uhash_t

Hash value type: unsigned integer.


Added in version 3.2.

@end deffn

@geindex Py_HASH_ALGORITHM (C macro)
@anchor{c-api/hash c Py_HASH_ALGORITHM}@anchor{55b5}
@deffn {C Macro} Py_HASH_ALGORITHM

A numerical value indicating the algorithm for hashing of @ref{16a,,str},
@ref{193,,bytes}, and @ref{166,,memoryview}.

The algorithm name is exposed by @ref{4c7c,,sys.hash_info.algorithm}.


Added in version 3.4.

@end deffn

@geindex Py_HASH_FNV (C macro)
@geindex Py_HASH_SIPHASH24 (C macro)
@geindex Py_HASH_SIPHASH13 (C macro)
@anchor{c-api/hash c Py_HASH_FNV}@anchor{55b6}
@deffn {C Macro} Py_HASH_FNV
@anchor{c-api/hash c Py_HASH_SIPHASH24}@anchor{55b7}
@deffnx {C Macro} Py_HASH_SIPHASH24
@anchor{c-api/hash c Py_HASH_SIPHASH13}@anchor{55b8}
@deffnx {C Macro} Py_HASH_SIPHASH13

Numerical values to compare to @ref{55b5,,Py_HASH_ALGORITHM} to determine
which algorithm is used for hashing. The hash algorithm can be configured
via the configure @ref{21f8,,--with-hash-algorithm} option.


Added in version 3.4: Add @code{Py_HASH_FNV} and @code{Py_HASH_SIPHASH24}.



Added in version 3.11: Add @code{Py_HASH_SIPHASH13}.

@end deffn

@geindex Py_HASH_CUTOFF (C macro)
@anchor{c-api/hash c Py_HASH_CUTOFF}@anchor{55b9}
@deffn {C Macro} Py_HASH_CUTOFF

Buffers of length in range @code{[1, Py_HASH_CUTOFF)} are hashed using DJBX33A
instead of the algorithm described by @ref{55b5,,Py_HASH_ALGORITHM}.


@itemize -

@item 
A @code{Py_HASH_CUTOFF} of 0 disables the optimization.

@item 
@code{Py_HASH_CUTOFF} must be non-negative and less or equal than 7.
@end itemize

32-bit platforms should use a cutoff smaller than 64-bit platforms because
it is easier to create colliding strings. A cutoff of 7 on 64-bit platforms
and 5 on 32-bit platforms should provide a decent safety margin.

This corresponds to the @ref{4c7f,,sys.hash_info.cutoff} constant.


Added in version 3.4.

@end deffn

@geindex PyHASH_MODULUS (C macro)
@anchor{c-api/hash c PyHASH_MODULUS}@anchor{1a2c}
@deffn {C Macro} PyHASH_MODULUS

The Mersenne prime@footnote{https://en.wikipedia.org/wiki/Mersenne_prime} @code{P = 2**n -1},
used for numeric hash scheme.

This corresponds to the @ref{2647,,sys.hash_info.modulus} constant.


Added in version 3.13.

@end deffn

@geindex PyHASH_BITS (C macro)
@anchor{c-api/hash c PyHASH_BITS}@anchor{1a2d}
@deffn {C Macro} PyHASH_BITS

The exponent @code{n} of @code{P} in @ref{1a2c,,PyHASH_MODULUS}.


Added in version 3.13.

@end deffn

@geindex PyHASH_MULTIPLIER (C macro)
@anchor{c-api/hash c PyHASH_MULTIPLIER}@anchor{19d7}
@deffn {C Macro} PyHASH_MULTIPLIER

Prime multiplier used in string and various other hashes.


Added in version 3.13.

@end deffn

@geindex PyHASH_INF (C macro)
@anchor{c-api/hash c PyHASH_INF}@anchor{1a2e}
@deffn {C Macro} PyHASH_INF

The hash value returned for a positive infinity.

This corresponds to the @ref{4c79,,sys.hash_info.inf} constant.


Added in version 3.13.

@end deffn

@geindex PyHASH_IMAG (C macro)
@anchor{c-api/hash c PyHASH_IMAG}@anchor{1a2f}
@deffn {C Macro} PyHASH_IMAG

The multiplier used for the imaginary part of a complex number.

This corresponds to the @ref{4c7b,,sys.hash_info.imag} constant.


Added in version 3.13.

@end deffn

@geindex PyHash_FuncDef (C type)
@anchor{c-api/hash c PyHash_FuncDef}@anchor{55ba}
@deffn {C Type} type PyHash_FuncDef

Hash function definition used by @ref{55bb,,PyHash_GetFuncDef()}.

@geindex PyHash_FuncDef.hash (C member)
@anchor{c-api/hash c PyHash_FuncDef hash}@anchor{55bc}
@deffn {C Member} @ref{146f,,Py_hash_t} (*const hash)(const void*, @ref{c5b,,Py_ssize_t})

Hash function.
@end deffn

@geindex PyHash_FuncDef.name (C member)
@anchor{c-api/hash c PyHash_FuncDef name}@anchor{55bd}
@deffn {C Member} const char *name

Hash function name (UTF-8 encoded string).

This corresponds to the @ref{4c7c,,sys.hash_info.algorithm} constant.
@end deffn

@geindex PyHash_FuncDef.hash_bits (C member)
@anchor{c-api/hash c PyHash_FuncDef hash_bits}@anchor{55be}
@deffn {C Member} const int hash_bits

Internal size of the hash value in bits.

This corresponds to the @ref{4c7d,,sys.hash_info.hash_bits} constant.
@end deffn

@geindex PyHash_FuncDef.seed_bits (C member)
@anchor{c-api/hash c PyHash_FuncDef seed_bits}@anchor{55bf}
@deffn {C Member} const int seed_bits

Size of seed input in bits.

This corresponds to the @ref{4c7e,,sys.hash_info.seed_bits} constant.
@end deffn


Added in version 3.4.

@end deffn

@geindex PyHash_GetFuncDef (C function)
@anchor{c-api/hash c PyHash_GetFuncDef}@anchor{55bb}
@deffn {C Function} @ref{55ba,,PyHash_FuncDef} *PyHash_GetFuncDef (void)

Get the hash function definition.


@subsubheading See also


@geindex Python Enhancement Proposals; PEP 456
PEP 456@footnote{https://peps.python.org/pep-0456/} “Secure and interchangeable hash algorithm”.



Added in version 3.4.

@end deffn

@geindex Py_HashPointer (C function)
@anchor{c-api/hash c Py_HashPointer}@anchor{423}
@deffn {C Function} @ref{146f,,Py_hash_t} Py_HashPointer (const void *ptr)

Hash a pointer value: process the pointer value as an integer (cast it to
@code{uintptr_t} internally). The pointer is not dereferenced.

The function cannot fail: it cannot return @code{-1}.


Added in version 3.13.

@end deffn

@geindex Py_HashBuffer (C function)
@anchor{c-api/hash c Py_HashBuffer}@anchor{393}
@deffn {C Function} @ref{146f,,Py_hash_t} Py_HashBuffer (const void *ptr, Py_ssize_t len)

Compute and return the hash value of a buffer of `len' bytes
starting at address `ptr'. The hash is guaranteed to match that of
@ref{193,,bytes}, @ref{166,,memoryview}, and other built-in objects
that implement the @ref{262,,buffer protocol}.

Use this function to implement hashing for immutable objects whose
@ref{5250,,tp_richcompare} function compares to another
object’s buffer.

`len' must be greater than or equal to @code{0}.

This function always succeeds.


Added in version 3.14.

@end deffn

@geindex PyObject_GenericHash (C function)
@anchor{c-api/hash c PyObject_GenericHash}@anchor{60c}
@deffn {C Function} @ref{146f,,Py_hash_t} PyObject_GenericHash (PyObject *obj)

Generic hashing function that is meant to be put into a type
object’s @code{tp_hash} slot.
Its result only depends on the object’s identity.

`CPython implementation detail:' In CPython, it is equivalent to @ref{423,,Py_HashPointer()}.


Added in version 3.13.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Reflection,Codec registry and support functions,PyHash API,Utilities<2>
@anchor{c-api/reflection doc}@anchor{55c0}@anchor{c-api/reflection id1}@anchor{55c1}@anchor{c-api/reflection reflection}@anchor{55c2}@anchor{c-api/reflection translation-repo}@anchor{55c3}
@subsection Reflection


@geindex PyEval_GetBuiltins (C function)
@anchor{c-api/reflection c PyEval_GetBuiltins}@anchor{5f4}
@deffn {C Function} @ref{5df,,PyObject} *PyEval_GetBuiltins (void)
`Return value: Borrowed reference.'` Part of the @ref{776,,Stable ABI}.'

Deprecated since version 3.13: Use @ref{5f3,,PyEval_GetFrameBuiltins()} instead.


Return a dictionary of the builtins in the current execution frame,
or the interpreter of the thread state if no frame is currently executing.
@end deffn

@geindex PyEval_GetLocals (C function)
@anchor{c-api/reflection c PyEval_GetLocals}@anchor{5f8}
@deffn {C Function} @ref{5df,,PyObject} *PyEval_GetLocals (void)
`Return value: Borrowed reference.'` Part of the @ref{776,,Stable ABI}.'

Deprecated since version 3.13: Use either @ref{5f7,,PyEval_GetFrameLocals()} to obtain the same behaviour as calling
@ref{46f,,locals()} in Python code, or else call @ref{661,,PyFrame_GetLocals()} on the result
of @ref{1b7d,,PyEval_GetFrame()} to access the @ref{4a6,,f_locals} attribute of the
currently executing frame.


Return a mapping providing access to the local variables in the current execution frame,
or @code{NULL} if no frame is currently executing.

Refer to @ref{46f,,locals()} for details of the mapping returned at different scopes.

As this function returns a @ref{3d5,,borrowed reference}, the dictionary returned for
@ref{4a2,,optimized scopes} is cached on the frame object and will remain
alive as long as the frame object does. Unlike @ref{5f7,,PyEval_GetFrameLocals()} and
@ref{46f,,locals()}, subsequent calls to this function in the same frame will update the
contents of the cached dictionary to reflect changes in the state of the local variables
rather than returning a new snapshot.


Changed in version 3.13: As part of 
@geindex Python Enhancement Proposals; PEP 667
PEP 667@footnote{https://peps.python.org/pep-0667/}, @ref{661,,PyFrame_GetLocals()}, @ref{46f,,locals()}, and
@ref{4a6,,FrameType.f_locals} no longer make use of the shared cache
dictionary. Refer to the @ref{470,,What’s New entry} for
additional details.

@end deffn

@geindex PyEval_GetGlobals (C function)
@anchor{c-api/reflection c PyEval_GetGlobals}@anchor{5f6}
@deffn {C Function} @ref{5df,,PyObject} *PyEval_GetGlobals (void)
`Return value: Borrowed reference.'` Part of the @ref{776,,Stable ABI}.'

Deprecated since version 3.13: Use @ref{5f5,,PyEval_GetFrameGlobals()} instead.


Return a dictionary of the global variables in the current execution frame,
or @code{NULL} if no frame is currently executing.
@end deffn

@geindex PyEval_GetFrame (C function)
@anchor{c-api/reflection c PyEval_GetFrame}@anchor{1b7d}
@deffn {C Function} @ref{991,,PyFrameObject} *PyEval_GetFrame (void)
`Return value: Borrowed reference.'` Part of the @ref{776,,Stable ABI}.'
Return the @ref{5231,,attached thread state}’s frame, which is @code{NULL} if no frame is
currently executing.

See also @ref{996,,PyThreadState_GetFrame()}.
@end deffn

@geindex PyEval_GetFrameBuiltins (C function)
@anchor{c-api/reflection c PyEval_GetFrameBuiltins}@anchor{5f3}
@deffn {C Function} @ref{5df,,PyObject} *PyEval_GetFrameBuiltins (void)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI} since version 3.13.'
Return a dictionary of the builtins in the current execution frame,
or the interpreter of the thread state if no frame is currently executing.


Added in version 3.13.

@end deffn

@geindex PyEval_GetFrameLocals (C function)
@anchor{c-api/reflection c PyEval_GetFrameLocals}@anchor{5f7}
@deffn {C Function} @ref{5df,,PyObject} *PyEval_GetFrameLocals (void)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI} since version 3.13.'
Return a dictionary of the local variables in the current execution frame,
or @code{NULL} if no frame is currently executing. Equivalent to calling
@ref{46f,,locals()} in Python code.

To access @ref{4a6,,f_locals} on the current frame without making an independent
snapshot in @ref{4a2,,optimized scopes}, call @ref{661,,PyFrame_GetLocals()}
on the result of @ref{1b7d,,PyEval_GetFrame()}.


Added in version 3.13.

@end deffn

@geindex PyEval_GetFrameGlobals (C function)
@anchor{c-api/reflection c PyEval_GetFrameGlobals}@anchor{5f5}
@deffn {C Function} @ref{5df,,PyObject} *PyEval_GetFrameGlobals (void)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI} since version 3.13.'
Return a dictionary of the global variables in the current execution frame,
or @code{NULL} if no frame is currently executing. Equivalent to calling
@ref{1c4d,,globals()} in Python code.


Added in version 3.13.

@end deffn

@geindex PyEval_GetFuncName (C function)
@anchor{c-api/reflection c PyEval_GetFuncName}@anchor{533d}
@deffn {C Function} const char *PyEval_GetFuncName (PyObject *func)
` Part of the @ref{776,,Stable ABI}.'
Return the name of `func' if it is a function, class or instance object, else the
name of `func's type.
@end deffn

@geindex PyEval_GetFuncDesc (C function)
@anchor{c-api/reflection c PyEval_GetFuncDesc}@anchor{533c}
@deffn {C Function} const char *PyEval_GetFuncDesc (PyObject *func)
` Part of the @ref{776,,Stable ABI}.'
Return a description string, depending on the type of `func'.
Return values include “()” for functions and methods, “ constructor”,
“ instance”, and “ object”.  Concatenated with the result of
@ref{533d,,PyEval_GetFuncName()}, the result will be a description of
`func'.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Codec registry and support functions,PyTime C API,Reflection,Utilities<2>
@anchor{c-api/codec doc}@anchor{55c4}@anchor{c-api/codec codec-registry}@anchor{f36}@anchor{c-api/codec codec-registry-and-support-functions}@anchor{55c5}@anchor{c-api/codec translation-repo}@anchor{55c6}
@subsection Codec registry and support functions


@geindex PyCodec_Register (C function)
@anchor{c-api/codec c PyCodec_Register}@anchor{5306}
@deffn {C Function} int PyCodec_Register (PyObject *search_function)
` Part of the @ref{776,,Stable ABI}.'
Register a new codec search function.

As a side effect, this tries to load the @code{encodings} package, if not yet
done, to make sure that it is always first in the list of search functions.
@end deffn

@geindex PyCodec_Unregister (C function)
@anchor{c-api/codec c PyCodec_Unregister}@anchor{a9d}
@deffn {C Function} int PyCodec_Unregister (PyObject *search_function)
` Part of the @ref{776,,Stable ABI} since version 3.10.'
Unregister a codec search function and clear the registry’s cache.
If the search function is not registered, do nothing.
Return 0 on success. Raise an exception and return -1 on error.


Added in version 3.10.

@end deffn

@geindex PyCodec_KnownEncoding (C function)
@anchor{c-api/codec c PyCodec_KnownEncoding}@anchor{5304}
@deffn {C Function} int PyCodec_KnownEncoding (const char *encoding)
` Part of the @ref{776,,Stable ABI}.'
Return @code{1} or @code{0} depending on whether there is a registered codec for
the given `encoding'.  This function always succeeds.
@end deffn

@geindex PyCodec_Encode (C function)
@anchor{c-api/codec c PyCodec_Encode}@anchor{3e0}
@deffn {C Function} @ref{5df,,PyObject} *PyCodec_Encode (PyObject *object, const char *encoding, const char *errors)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Generic codec based encoding API.

`object' is passed through the encoder function found for the given
`encoding' using the error handling method defined by `errors'.  `errors' may
be @code{NULL} to use the default method defined for the codec.  Raises a
@ref{242c,,LookupError} if no encoder can be found.
@end deffn

@geindex PyCodec_Decode (C function)
@anchor{c-api/codec c PyCodec_Decode}@anchor{3df}
@deffn {C Function} @ref{5df,,PyObject} *PyCodec_Decode (PyObject *object, const char *encoding, const char *errors)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Generic codec based decoding API.

`object' is passed through the decoder function found for the given
`encoding' using the error handling method defined by `errors'.  `errors' may
be @code{NULL} to use the default method defined for the codec.  Raises a
@ref{242c,,LookupError} if no decoder can be found.
@end deffn

@menu
* Codec lookup API:: 
* Registry API for Unicode encoding error handlers:: 
* Codec utility variables:: 

@end menu

@node Codec lookup API,Registry API for Unicode encoding error handlers,,Codec registry and support functions
@anchor{c-api/codec codec-lookup-api}@anchor{55c7}
@subsubsection Codec lookup API


In the following functions, the `encoding' string is looked up converted to all
lower-case characters, which makes encodings looked up through this mechanism
effectively case-insensitive.  If no codec is found, a @ref{5e7,,KeyError} is set
and @code{NULL} returned.

@geindex PyCodec_Encoder (C function)
@anchor{c-api/codec c PyCodec_Encoder}@anchor{5300}
@deffn {C Function} @ref{5df,,PyObject} *PyCodec_Encoder (const char *encoding)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Get an encoder function for the given `encoding'.
@end deffn

@geindex PyCodec_Decoder (C function)
@anchor{c-api/codec c PyCodec_Decoder}@anchor{52ff}
@deffn {C Function} @ref{5df,,PyObject} *PyCodec_Decoder (const char *encoding)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Get a decoder function for the given `encoding'.
@end deffn

@geindex PyCodec_IncrementalEncoder (C function)
@anchor{c-api/codec c PyCodec_IncrementalEncoder}@anchor{5303}
@deffn {C Function} @ref{5df,,PyObject} *PyCodec_IncrementalEncoder (const char *encoding, const char *errors)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Get an @ref{28a1,,IncrementalEncoder} object for the given `encoding'.
@end deffn

@geindex PyCodec_IncrementalDecoder (C function)
@anchor{c-api/codec c PyCodec_IncrementalDecoder}@anchor{5302}
@deffn {C Function} @ref{5df,,PyObject} *PyCodec_IncrementalDecoder (const char *encoding, const char *errors)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Get an @ref{28a2,,IncrementalDecoder} object for the given `encoding'.
@end deffn

@geindex PyCodec_StreamReader (C function)
@anchor{c-api/codec c PyCodec_StreamReader}@anchor{5309}
@deffn {C Function} @ref{5df,,PyObject} *PyCodec_StreamReader (const char *encoding, PyObject *stream, const char *errors)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Get a @ref{28a6,,StreamReader} factory function for the given `encoding'.
@end deffn

@geindex PyCodec_StreamWriter (C function)
@anchor{c-api/codec c PyCodec_StreamWriter}@anchor{530a}
@deffn {C Function} @ref{5df,,PyObject} *PyCodec_StreamWriter (const char *encoding, PyObject *stream, const char *errors)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Get a @ref{28a5,,StreamWriter} factory function for the given `encoding'.
@end deffn

@node Registry API for Unicode encoding error handlers,Codec utility variables,Codec lookup API,Codec registry and support functions
@anchor{c-api/codec registry-api-for-unicode-encoding-error-handlers}@anchor{55c8}
@subsubsection Registry API for Unicode encoding error handlers


@geindex PyCodec_RegisterError (C function)
@anchor{c-api/codec c PyCodec_RegisterError}@anchor{5307}
@deffn {C Function} int PyCodec_RegisterError (const char *name, PyObject *error)
` Part of the @ref{776,,Stable ABI}.'
Register the error handling callback function `error' under the given `name'.
This callback function will be called by a codec when it encounters
unencodable characters/undecodable bytes and `name' is specified as the error
parameter in the call to the encode/decode function.

The callback gets a single argument, an instance of
@ref{889,,UnicodeEncodeError}, @ref{c0e,,UnicodeDecodeError} or
@ref{1942,,UnicodeTranslateError} that holds information about the problematic
sequence of characters or bytes and their offset in the original string (see
@ref{45f,,Unicode Exception Objects} for functions to extract this information).  The
callback must either raise the given exception, or return a two-item tuple
containing the replacement for the problematic sequence, and an integer
giving the offset in the original string at which encoding/decoding should be
resumed.

Return @code{0} on success, @code{-1} on error.
@end deffn

@geindex PyCodec_LookupError (C function)
@anchor{c-api/codec c PyCodec_LookupError}@anchor{5305}
@deffn {C Function} @ref{5df,,PyObject} *PyCodec_LookupError (const char *name)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Lookup the error handling callback function registered under `name'.  As a
special case @code{NULL} can be passed, in which case the error handling callback
for “strict” will be returned.
@end deffn

@geindex PyCodec_StrictErrors (C function)
@anchor{c-api/codec c PyCodec_StrictErrors}@anchor{530b}
@deffn {C Function} @ref{5df,,PyObject} *PyCodec_StrictErrors (PyObject *exc)
`Return value: Always NULL.'` Part of the @ref{776,,Stable ABI}.'
Raise `exc' as an exception.
@end deffn

@geindex PyCodec_IgnoreErrors (C function)
@anchor{c-api/codec c PyCodec_IgnoreErrors}@anchor{5301}
@deffn {C Function} @ref{5df,,PyObject} *PyCodec_IgnoreErrors (PyObject *exc)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Ignore the unicode error, skipping the faulty input.
@end deffn

@geindex PyCodec_ReplaceErrors (C function)
@anchor{c-api/codec c PyCodec_ReplaceErrors}@anchor{5308}
@deffn {C Function} @ref{5df,,PyObject} *PyCodec_ReplaceErrors (PyObject *exc)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Replace the unicode encode error with @code{?} or @code{U+FFFD}.
@end deffn

@geindex PyCodec_XMLCharRefReplaceErrors (C function)
@anchor{c-api/codec c PyCodec_XMLCharRefReplaceErrors}@anchor{530c}
@deffn {C Function} @ref{5df,,PyObject} *PyCodec_XMLCharRefReplaceErrors (PyObject *exc)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Replace the unicode encode error with XML character references.
@end deffn

@geindex PyCodec_BackslashReplaceErrors (C function)
@anchor{c-api/codec c PyCodec_BackslashReplaceErrors}@anchor{52fe}
@deffn {C Function} @ref{5df,,PyObject} *PyCodec_BackslashReplaceErrors (PyObject *exc)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Replace the unicode encode error with backslash escapes (@code{\x}, @code{\u} and
@code{\U}).
@end deffn

@geindex PyCodec_NameReplaceErrors (C function)
@anchor{c-api/codec c PyCodec_NameReplaceErrors}@anchor{10b5}
@deffn {C Function} @ref{5df,,PyObject} *PyCodec_NameReplaceErrors (PyObject *exc)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI} since version 3.7.'
Replace the unicode encode error with @code{\N@{...@}} escapes.


Added in version 3.5.

@end deffn

@node Codec utility variables,,Registry API for Unicode encoding error handlers,Codec registry and support functions
@anchor{c-api/codec codec-utility-variables}@anchor{55c9}
@subsubsection Codec utility variables


@geindex Py_hexdigits (C var)
@anchor{c-api/codec c Py_hexdigits}@anchor{55ca}
@deffn {C Variable} const char *Py_hexdigits

A string constant containing the lowercase hexadecimal digits: @code{"0123456789abcdef"}.


Added in version 3.3.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node PyTime C API,Support for Perf Maps,Codec registry and support functions,Utilities<2>
@anchor{c-api/time doc}@anchor{484}@anchor{c-api/time c-api-time}@anchor{5d2}@anchor{c-api/time pytime-c-api}@anchor{55cb}@anchor{c-api/time translation-repo}@anchor{55cc}
@subsection PyTime C API



Added in version 3.13.


The clock C API provides access to system clocks.
It is similar to the Python @ref{f4,,time} module.

For C API related to the @ref{34,,datetime} module, see @ref{55cd,,DateTime Objects}.

@menu
* Types: Types<3>. 
* Clock Functions:: 
* Raw Clock Functions:: 
* Conversion functions:: 

@end menu

@node Types<3>,Clock Functions,,PyTime C API
@anchor{c-api/time types}@anchor{55ce}
@subsubsection Types


@geindex PyTime_t (C type)
@anchor{c-api/time c PyTime_t}@anchor{5d3}
@deffn {C Type} type PyTime_t

A timestamp or duration in nanoseconds, represented as a signed 64-bit
integer.

The reference point for timestamps depends on the clock used. For example,
@ref{5db,,PyTime_Time()} returns timestamps relative to the UNIX epoch.

The supported range is around [-292.3 years; +292.3 years].
Using the Unix epoch (January 1st, 1970) as reference, the supported date
range is around [1677-09-21; 2262-04-11].
The exact limits are exposed as constants:
@end deffn

@geindex PyTime_MIN (C var)
@anchor{c-api/time c PyTime_MIN}@anchor{5d4}
@deffn {C Variable} @ref{5d3,,PyTime_t} PyTime_MIN

Minimum value of @ref{5d3,,PyTime_t}.
@end deffn

@geindex PyTime_MAX (C var)
@anchor{c-api/time c PyTime_MAX}@anchor{5d5}
@deffn {C Variable} @ref{5d3,,PyTime_t} PyTime_MAX

Maximum value of @ref{5d3,,PyTime_t}.
@end deffn

@node Clock Functions,Raw Clock Functions,Types<3>,PyTime C API
@anchor{c-api/time clock-functions}@anchor{55cf}
@subsubsection Clock Functions


The following functions take a pointer to a @ref{5d3,,PyTime_t} that they
set to the value of a particular clock.
Details of each clock are given in the documentation of the corresponding
Python function.

The functions return @code{0} on success, or @code{-1} (with an exception set)
on failure.

On integer overflow, they set the @ref{5366,,PyExc_OverflowError} exception and
set @code{*result} to the value clamped to the @code{[PyTime_MIN; PyTime_MAX]}
range.
(On current systems, integer overflows are likely caused by misconfigured
system time.)

As any other C API (unless otherwise specified), the functions must be called
with an @ref{5231,,attached thread state}.

@geindex PyTime_Monotonic (C function)
@anchor{c-api/time c PyTime_Monotonic}@anchor{5d7}
@deffn {C Function} int PyTime_Monotonic (PyTime_t *result)

Read the monotonic clock.
See @ref{55c,,time.monotonic()} for important details on this clock.
@end deffn

@geindex PyTime_PerfCounter (C function)
@anchor{c-api/time c PyTime_PerfCounter}@anchor{5d9}
@deffn {C Function} int PyTime_PerfCounter (PyTime_t *result)

Read the performance counter.
See @ref{c80,,time.perf_counter()} for important details on this clock.
@end deffn

@geindex PyTime_Time (C function)
@anchor{c-api/time c PyTime_Time}@anchor{5db}
@deffn {C Function} int PyTime_Time (PyTime_t *result)

Read the “wall clock” time.
See @ref{55d,,time.time()} for details important on this clock.
@end deffn

@node Raw Clock Functions,Conversion functions,Clock Functions,PyTime C API
@anchor{c-api/time raw-clock-functions}@anchor{55d0}
@subsubsection Raw Clock Functions


Similar to clock functions, but don’t set an exception on error and don’t
require the caller to have an @ref{5231,,attached thread state}.

On success, the functions return @code{0}.

On failure, they set @code{*result} to @code{0} and return @code{-1}, `without' setting
an exception. To get the cause of the error, @ref{5231,,attach} a @ref{188f,,thread state},
and call the regular (non-@code{Raw}) function. Note that the regular function may succeed after
the @code{Raw} one failed.

@geindex PyTime_MonotonicRaw (C function)
@anchor{c-api/time c PyTime_MonotonicRaw}@anchor{5d8}
@deffn {C Function} int PyTime_MonotonicRaw (PyTime_t *result)

Similar to @ref{5d7,,PyTime_Monotonic()},
but don’t set an exception on error and don’t require an @ref{5231,,attached thread state}.
@end deffn

@geindex PyTime_PerfCounterRaw (C function)
@anchor{c-api/time c PyTime_PerfCounterRaw}@anchor{5da}
@deffn {C Function} int PyTime_PerfCounterRaw (PyTime_t *result)

Similar to @ref{5d9,,PyTime_PerfCounter()},
but don’t set an exception on error and don’t require an @ref{5231,,attached thread state}.
@end deffn

@geindex PyTime_TimeRaw (C function)
@anchor{c-api/time c PyTime_TimeRaw}@anchor{5dc}
@deffn {C Function} int PyTime_TimeRaw (PyTime_t *result)

Similar to @ref{5db,,PyTime_Time()},
but don’t set an exception on error and don’t require an @ref{5231,,attached thread state}.
@end deffn

@node Conversion functions,,Raw Clock Functions,PyTime C API
@anchor{c-api/time conversion-functions}@anchor{55d1}
@subsubsection Conversion functions


@geindex PyTime_AsSecondsDouble (C function)
@anchor{c-api/time c PyTime_AsSecondsDouble}@anchor{5d6}
@deffn {C Function} double PyTime_AsSecondsDouble (PyTime_t t)

Convert a timestamp to a number of seconds as a C double.

The function cannot fail, but note that double has limited
accuracy for large values.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Support for Perf Maps,,PyTime C API,Utilities<2>
@anchor{c-api/perfmaps doc}@anchor{55d2}@anchor{c-api/perfmaps perfmaps}@anchor{55d3}@anchor{c-api/perfmaps support-for-perf-maps}@anchor{55d4}@anchor{c-api/perfmaps translation-repo}@anchor{55d5}
@subsection Support for Perf Maps


On supported platforms (as of this writing, only Linux), the runtime can take
advantage of `perf map files' to make Python functions visible to an external
profiling tool (such as perf@footnote{https://perf.wiki.kernel.org/index.php/Main_Page}).
A running process may create a file in the @code{/tmp} directory, which contains entries
that can map a section of executable code to a name. This interface is described in the
documentation of the Linux Perf tool@footnote{https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/tools/perf/Documentation/jit-interface.txt}.

In Python, these helper APIs can be used by libraries and features that rely
on generating machine code on the fly.

Note that holding an @ref{5231,,attached thread state} is not required for these APIs.

@geindex PyUnstable_PerfMapState_Init (C function)
@anchor{c-api/perfmaps c PyUnstable_PerfMapState_Init}@anchor{1af1}
@deffn {C Function} int PyUnstable_PerfMapState_Init (void)

@cartouche
@quotation This is Unstable API. It may change without warning in minor releases. `This is @ref{76a,,Unstable API}. It may change without warning in minor releases.'
@end quotation
@end cartouche

Open the @code{/tmp/perf-$pid.map} file, unless it’s already opened, and create
a lock to ensure thread-safe writes to the file (provided the writes are
done through @ref{1af0,,PyUnstable_WritePerfMapEntry()}). Normally, there’s no need
to call this explicitly; just use @code{PyUnstable_WritePerfMapEntry()}
and it will initialize the state on first call.

Returns @code{0} on success, @code{-1} on failure to create/open the perf map file,
or @code{-2} on failure to create a lock. Check @code{errno} for more information
about the cause of a failure.
@end deffn

@geindex PyUnstable_WritePerfMapEntry (C function)
@anchor{c-api/perfmaps c PyUnstable_WritePerfMapEntry}@anchor{1af0}
@deffn {C Function} int PyUnstable_WritePerfMapEntry (const void *code_addr, unsigned int code_size, const char *entry_name)

@cartouche
@quotation This is Unstable API. It may change without warning in minor releases. `This is @ref{76a,,Unstable API}. It may change without warning in minor releases.'
@end quotation
@end cartouche

Write one single entry to the @code{/tmp/perf-$pid.map} file. This function is
thread safe. Here is what an example entry looks like:

@example
# address      size  name
7f3529fcf759 b     py::bar:/run/t.py
@end example

Will call @ref{1af1,,PyUnstable_PerfMapState_Init()} before writing the entry, if
the perf map file is not already opened. Returns @code{0} on success, or the
same error codes as @code{PyUnstable_PerfMapState_Init()} on failure.
@end deffn

@geindex PyUnstable_PerfMapState_Fini (C function)
@anchor{c-api/perfmaps c PyUnstable_PerfMapState_Fini}@anchor{1af2}
@deffn {C Function} void PyUnstable_PerfMapState_Fini (void)

@cartouche
@quotation This is Unstable API. It may change without warning in minor releases. `This is @ref{76a,,Unstable API}. It may change without warning in minor releases.'
@end quotation
@end cartouche

Close the perf map file opened by @ref{1af1,,PyUnstable_PerfMapState_Init()}.
This is called by the runtime itself during interpreter shut-down. In
general, there shouldn’t be a reason to explicitly call this, except to
handle specific scenarios such as forking.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Abstract Objects Layer,Concrete Objects Layer,Utilities<2>,Python/C API reference manual
@anchor{c-api/abstract doc}@anchor{55d6}@anchor{c-api/abstract abstract}@anchor{5253}@anchor{c-api/abstract abstract-objects-layer}@anchor{55d7}@anchor{c-api/abstract translation-repo}@anchor{55d8}
@section Abstract Objects Layer


The functions in this chapter interact with Python objects regardless of their
type, or with wide classes of object types (e.g. all numerical types, or all
sequence types).  When used on object types for which they do not apply, they
will raise a Python exception.

It is not possible to use these functions on objects that are not properly
initialized, such as a list object that has been created by @ref{52a9,,PyList_New()},
but whose items have not been set to some non-@code{NULL} value yet.

@menu
* Object Protocol:: 
* Call Protocol:: 
* Number Protocol:: 
* Sequence Protocol:: 
* Mapping Protocol:: 
* Iterator Protocol:: 
* Buffer Protocol:: 

@end menu

@node Object Protocol,Call Protocol,,Abstract Objects Layer
@anchor{c-api/object doc}@anchor{55d9}@anchor{c-api/object object}@anchor{55da}@anchor{c-api/object object-protocol}@anchor{55db}
@subsection Object Protocol


@geindex Py_GetConstant (C function)
@anchor{c-api/object c Py_GetConstant}@anchor{5f9}
@deffn {C Function} @ref{5df,,PyObject} *Py_GetConstant (unsigned int constant_id)
` Part of the @ref{776,,Stable ABI} since version 3.13.'
Get a @ref{5e2,,strong reference} to a constant.

Set an exception and return @code{NULL} if `constant_id' is invalid.

`constant_id' must be one of these constant identifiers:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Constant Identifier

@tab

Value

@tab

Returned object

@item

@geindex Py_CONSTANT_NONE (C macro)
@anchor{c-api/object c Py_CONSTANT_NONE}@anchor{55dc}
@deffn {C Macro} Py_CONSTANT_NONE
@end deffn

@tab

@code{0}

@tab

@ref{887,,None}

@item

@geindex Py_CONSTANT_FALSE (C macro)
@anchor{c-api/object c Py_CONSTANT_FALSE}@anchor{55dd}
@deffn {C Macro} Py_CONSTANT_FALSE
@end deffn

@tab

@code{1}

@tab

@ref{d31,,False}

@item

@geindex Py_CONSTANT_TRUE (C macro)
@anchor{c-api/object c Py_CONSTANT_TRUE}@anchor{55de}
@deffn {C Macro} Py_CONSTANT_TRUE
@end deffn

@tab

@code{2}

@tab

@ref{e0d,,True}

@item

@geindex Py_CONSTANT_ELLIPSIS (C macro)
@anchor{c-api/object c Py_CONSTANT_ELLIPSIS}@anchor{55df}
@deffn {C Macro} Py_CONSTANT_ELLIPSIS
@end deffn

@tab

@code{3}

@tab

@ref{236c,,Ellipsis}

@item

@geindex Py_CONSTANT_NOT_IMPLEMENTED (C macro)
@anchor{c-api/object c Py_CONSTANT_NOT_IMPLEMENTED}@anchor{55e0}
@deffn {C Macro} Py_CONSTANT_NOT_IMPLEMENTED
@end deffn

@tab

@code{4}

@tab

@ref{1a3,,NotImplemented}

@item

@geindex Py_CONSTANT_ZERO (C macro)
@anchor{c-api/object c Py_CONSTANT_ZERO}@anchor{55e1}
@deffn {C Macro} Py_CONSTANT_ZERO
@end deffn

@tab

@code{5}

@tab

@code{0}

@item

@geindex Py_CONSTANT_ONE (C macro)
@anchor{c-api/object c Py_CONSTANT_ONE}@anchor{55e2}
@deffn {C Macro} Py_CONSTANT_ONE
@end deffn

@tab

@code{6}

@tab

@code{1}

@item

@geindex Py_CONSTANT_EMPTY_STR (C macro)
@anchor{c-api/object c Py_CONSTANT_EMPTY_STR}@anchor{55e3}
@deffn {C Macro} Py_CONSTANT_EMPTY_STR
@end deffn

@tab

@code{7}

@tab

@code{'@w{'}}

@item

@geindex Py_CONSTANT_EMPTY_BYTES (C macro)
@anchor{c-api/object c Py_CONSTANT_EMPTY_BYTES}@anchor{55e4}
@deffn {C Macro} Py_CONSTANT_EMPTY_BYTES
@end deffn

@tab

@code{8}

@tab

@code{b'@w{'}}

@item

@geindex Py_CONSTANT_EMPTY_TUPLE (C macro)
@anchor{c-api/object c Py_CONSTANT_EMPTY_TUPLE}@anchor{55e5}
@deffn {C Macro} Py_CONSTANT_EMPTY_TUPLE
@end deffn

@tab

@code{9}

@tab

@code{()}

@end multitable


Numeric values are only given for projects which cannot use the constant
identifiers.


Added in version 3.13.


`CPython implementation detail:' In CPython, all of these constants are @ref{292,,immortal}.
@end deffn

@geindex Py_GetConstantBorrowed (C function)
@anchor{c-api/object c Py_GetConstantBorrowed}@anchor{5fa}
@deffn {C Function} @ref{5df,,PyObject} *Py_GetConstantBorrowed (unsigned int constant_id)
` Part of the @ref{776,,Stable ABI} since version 3.13.'
Similar to @ref{5f9,,Py_GetConstant()}, but return a @ref{3d5,,borrowed reference}.

This function is primarily intended for backwards compatibility:
using @ref{5f9,,Py_GetConstant()} is recommended for new code.

The reference is borrowed from the interpreter, and is valid until the
interpreter finalization.


Added in version 3.13.

@end deffn

@geindex Py_NotImplemented (C var)
@anchor{c-api/object c Py_NotImplemented}@anchor{55e6}
@deffn {C Variable} @ref{5df,,PyObject} *Py_NotImplemented

The @code{NotImplemented} singleton, used to signal that an operation is
not implemented for the given type combination.
@end deffn

@geindex Py_RETURN_NOTIMPLEMENTED (C macro)
@anchor{c-api/object c Py_RETURN_NOTIMPLEMENTED}@anchor{1832}
@deffn {C Macro} Py_RETURN_NOTIMPLEMENTED

Properly handle returning @ref{55e6,,Py_NotImplemented} from within a C
function (that is, create a new @ref{5e2,,strong reference}
to @ref{1a3,,NotImplemented} and return it).
@end deffn

@geindex Py_PRINT_RAW (C macro)
@anchor{c-api/object c Py_PRINT_RAW}@anchor{55e7}
@deffn {C Macro} Py_PRINT_RAW

Flag to be used with multiple functions that print the object (like
@ref{1792,,PyObject_Print()} and @ref{5386,,PyFile_WriteObject()}).
If passed, these functions use the @ref{16a,,str()} of the object
instead of the @ref{1c3,,repr()}.
@end deffn

@geindex PyObject_Print (C function)
@anchor{c-api/object c PyObject_Print}@anchor{1792}
@deffn {C Function} int PyObject_Print (PyObject *o, FILE *fp, int flags)

Print an object `o', on file `fp'.  Returns @code{-1} on error.  The flags argument
is used to enable certain printing options.  The only option currently supported
is @ref{55e7,,Py_PRINT_RAW}; if given, the @ref{16a,,str()} of the object is written
instead of the @ref{1c3,,repr()}.
@end deffn

@geindex PyObject_HasAttrWithError (C function)
@anchor{c-api/object c PyObject_HasAttrWithError}@anchor{61b}
@deffn {C Function} int PyObject_HasAttrWithError (PyObject *o, PyObject *attr_name)
` Part of the @ref{776,,Stable ABI} since version 3.13.'
Returns @code{1} if `o' has the attribute `attr_name', and @code{0} otherwise.
This is equivalent to the Python expression @code{hasattr(o, attr_name)}.
On failure, return @code{-1}.


Added in version 3.13.

@end deffn

@geindex PyObject_HasAttrStringWithError (C function)
@anchor{c-api/object c PyObject_HasAttrStringWithError}@anchor{61d}
@deffn {C Function} int PyObject_HasAttrStringWithError (PyObject *o, const char *attr_name)
` Part of the @ref{776,,Stable ABI} since version 3.13.'
This is the same as @ref{61b,,PyObject_HasAttrWithError()}, but `attr_name' is
specified as a const char* UTF-8 encoded bytes string,
rather than a @ref{5df,,PyObject}*.


Added in version 3.13.

@end deffn

@geindex PyObject_HasAttr (C function)
@anchor{c-api/object c PyObject_HasAttr}@anchor{61c}
@deffn {C Function} int PyObject_HasAttr (PyObject *o, PyObject *attr_name)
` Part of the @ref{776,,Stable ABI}.'
Returns @code{1} if `o' has the attribute `attr_name', and @code{0} otherwise.
This function always succeeds.

@cartouche
@quotation Note 
Exceptions that occur when this calls @ref{6fb,,__getattr__()} and
@ref{dd1,,__getattribute__()} methods aren’t propagated,
but instead given to @ref{508,,sys.unraisablehook()}.
For proper error handling, use @ref{61b,,PyObject_HasAttrWithError()},
@ref{5ec,,PyObject_GetOptionalAttr()} or @ref{5ee,,PyObject_GetAttr()} instead.
@end quotation
@end cartouche
@end deffn

@geindex PyObject_HasAttrString (C function)
@anchor{c-api/object c PyObject_HasAttrString}@anchor{61e}
@deffn {C Function} int PyObject_HasAttrString (PyObject *o, const char *attr_name)
` Part of the @ref{776,,Stable ABI}.'
This is the same as @ref{61c,,PyObject_HasAttr()}, but `attr_name' is
specified as a const char* UTF-8 encoded bytes string,
rather than a @ref{5df,,PyObject}*.

@cartouche
@quotation Note 
Exceptions that occur when this calls @ref{6fb,,__getattr__()} and
@ref{dd1,,__getattribute__()} methods or while creating the temporary
@ref{16a,,str} object are silently ignored.
For proper error handling, use @ref{61d,,PyObject_HasAttrStringWithError()},
@ref{5ed,,PyObject_GetOptionalAttrString()}
or @ref{5ef,,PyObject_GetAttrString()} instead.
@end quotation
@end cartouche
@end deffn

@geindex PyObject_GetAttr (C function)
@anchor{c-api/object c PyObject_GetAttr}@anchor{5ee}
@deffn {C Function} @ref{5df,,PyObject} *PyObject_GetAttr (PyObject *o, PyObject *attr_name)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Retrieve an attribute named `attr_name' from object `o'. Returns the attribute
value on success, or @code{NULL} on failure.  This is the equivalent of the Python
expression @code{o.attr_name}.

If the missing attribute should not be treated as a failure, you can use
@ref{5ec,,PyObject_GetOptionalAttr()} instead.
@end deffn

@geindex PyObject_GetAttrString (C function)
@anchor{c-api/object c PyObject_GetAttrString}@anchor{5ef}
@deffn {C Function} @ref{5df,,PyObject} *PyObject_GetAttrString (PyObject *o, const char *attr_name)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
This is the same as @ref{5ee,,PyObject_GetAttr()}, but `attr_name' is
specified as a const char* UTF-8 encoded bytes string,
rather than a @ref{5df,,PyObject}*.

If the missing attribute should not be treated as a failure, you can use
@ref{5ed,,PyObject_GetOptionalAttrString()} instead.
@end deffn

@geindex PyObject_GetOptionalAttr (C function)
@anchor{c-api/object c PyObject_GetOptionalAttr}@anchor{5ec}
@deffn {C Function} int PyObject_GetOptionalAttr (PyObject *obj, PyObject *attr_name, PyObject **result);
` Part of the @ref{776,,Stable ABI} since version 3.13.'
Variant of @ref{5ee,,PyObject_GetAttr()} which doesn’t raise
@ref{5f0,,AttributeError} if the attribute is not found.

If the attribute is found, return @code{1} and set `*result' to a new
@ref{5e2,,strong reference} to the attribute.
If the attribute is not found, return @code{0} and set `*result' to @code{NULL};
the @ref{5f0,,AttributeError} is silenced.
If an error other than @code{AttributeError} is raised, return @code{-1} and
set `*result' to @code{NULL}.


Added in version 3.13.

@end deffn

@geindex PyObject_GetOptionalAttrString (C function)
@anchor{c-api/object c PyObject_GetOptionalAttrString}@anchor{5ed}
@deffn {C Function} int PyObject_GetOptionalAttrString (PyObject *obj, const char *attr_name, PyObject **result);
` Part of the @ref{776,,Stable ABI} since version 3.13.'
This is the same as @ref{5ec,,PyObject_GetOptionalAttr()}, but `attr_name' is
specified as a const char* UTF-8 encoded bytes string,
rather than a @ref{5df,,PyObject}*.


Added in version 3.13.

@end deffn

@geindex PyObject_GenericGetAttr (C function)
@anchor{c-api/object c PyObject_GenericGetAttr}@anchor{53ef}
@deffn {C Function} @ref{5df,,PyObject} *PyObject_GenericGetAttr (PyObject *o, PyObject *name)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Generic attribute getter function that is meant to be put into a type
object’s @code{tp_getattro} slot.  It looks for a descriptor in the dictionary
of classes in the object’s MRO as well as an attribute in the object’s
@ref{77e,,__dict__} (if present).  As outlined in @ref{e4f,,Implementing Descriptors},
data descriptors take preference over instance attributes, while non-data
descriptors don’t.  Otherwise, an @ref{5f0,,AttributeError} is raised.
@end deffn

@geindex PyObject_SetAttr (C function)
@anchor{c-api/object c PyObject_SetAttr}@anchor{17a9}
@deffn {C Function} int PyObject_SetAttr (PyObject *o, PyObject *attr_name, PyObject *v)
` Part of the @ref{776,,Stable ABI}.'
Set the value of the attribute named `attr_name', for object `o', to the value
`v'. Raise an exception and return @code{-1} on failure;
return @code{0} on success.  This is the equivalent of the Python statement
@code{o.attr_name = v}.

If `v' is @code{NULL}, the attribute is deleted. This behaviour is deprecated
in favour of using @ref{187b,,PyObject_DelAttr()}, but there are currently no
plans to remove it.
@end deffn

@geindex PyObject_SetAttrString (C function)
@anchor{c-api/object c PyObject_SetAttrString}@anchor{19d1}
@deffn {C Function} int PyObject_SetAttrString (PyObject *o, const char *attr_name, PyObject *v)
` Part of the @ref{776,,Stable ABI}.'
This is the same as @ref{17a9,,PyObject_SetAttr()}, but `attr_name' is
specified as a const char* UTF-8 encoded bytes string,
rather than a @ref{5df,,PyObject}*.

If `v' is @code{NULL}, the attribute is deleted, but this feature is
deprecated in favour of using @ref{187c,,PyObject_DelAttrString()}.

The number of different attribute names passed to this function
should be kept small, usually by using a statically allocated string
as `attr_name'.
For attribute names that aren’t known at compile time, prefer calling
@ref{5472,,PyUnicode_FromString()} and @ref{17a9,,PyObject_SetAttr()} directly.
For more details, see @ref{19cf,,PyUnicode_InternFromString()}, which may be
used internally to create a key object.
@end deffn

@geindex PyObject_GenericSetAttr (C function)
@anchor{c-api/object c PyObject_GenericSetAttr}@anchor{53f0}
@deffn {C Function} int PyObject_GenericSetAttr (PyObject *o, PyObject *name, PyObject *value)
` Part of the @ref{776,,Stable ABI}.'
Generic attribute setter and deleter function that is meant
to be put into a type object’s @ref{5248,,tp_setattro}
slot.  It looks for a data descriptor in the
dictionary of classes in the object’s MRO, and if found it takes preference
over setting or deleting the attribute in the instance dictionary. Otherwise, the
attribute is set or deleted in the object’s @ref{77e,,__dict__} (if present).
On success, @code{0} is returned, otherwise an @ref{5f0,,AttributeError}
is raised and @code{-1} is returned.
@end deffn

@geindex PyObject_DelAttr (C function)
@anchor{c-api/object c PyObject_DelAttr}@anchor{187b}
@deffn {C Function} int PyObject_DelAttr (PyObject *o, PyObject *attr_name)
` Part of the @ref{776,,Stable ABI} since version 3.13.'
Delete attribute named `attr_name', for object `o'. Returns @code{-1} on failure.
This is the equivalent of the Python statement @code{del o.attr_name}.
@end deffn

@geindex PyObject_DelAttrString (C function)
@anchor{c-api/object c PyObject_DelAttrString}@anchor{187c}
@deffn {C Function} int PyObject_DelAttrString (PyObject *o, const char *attr_name)
` Part of the @ref{776,,Stable ABI} since version 3.13.'
This is the same as @ref{187b,,PyObject_DelAttr()}, but `attr_name' is
specified as a const char* UTF-8 encoded bytes string,
rather than a @ref{5df,,PyObject}*.

The number of different attribute names passed to this function
should be kept small, usually by using a statically allocated string
as `attr_name'.
For attribute names that aren’t known at compile time, prefer calling
@ref{5472,,PyUnicode_FromString()} and @ref{187b,,PyObject_DelAttr()} directly.
For more details, see @ref{19cf,,PyUnicode_InternFromString()}, which may be
used internally to create a key object for lookup.
@end deffn

@geindex PyObject_GenericGetDict (C function)
@anchor{c-api/object c PyObject_GenericGetDict}@anchor{1d49}
@deffn {C Function} @ref{5df,,PyObject} *PyObject_GenericGetDict (PyObject *o, void *context)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI} since version 3.10.'
A generic implementation for the getter of a @code{__dict__} descriptor. It
creates the dictionary if necessary.

This function may also be called to get the @ref{77e,,__dict__}
of the object `o'. Pass @code{NULL} for `context' when calling it.
Since this function may need to allocate memory for the
dictionary, it may be more efficient to call @ref{5ee,,PyObject_GetAttr()}
when accessing an attribute on the object.

On failure, returns @code{NULL} with an exception set.


Added in version 3.3.

@end deffn

@geindex PyObject_GenericSetDict (C function)
@anchor{c-api/object c PyObject_GenericSetDict}@anchor{53f1}
@deffn {C Function} int PyObject_GenericSetDict (PyObject *o, PyObject *value, void *context)
` Part of the @ref{776,,Stable ABI} since version 3.7.'
A generic implementation for the setter of a @code{__dict__} descriptor. This
implementation does not allow the dictionary to be deleted.


Added in version 3.3.

@end deffn

@geindex _PyObject_GetDictPtr (C function)
@anchor{c-api/object c _PyObject_GetDictPtr}@anchor{55e8}
@deffn {C Function} @ref{5df,,PyObject} **_PyObject_GetDictPtr (PyObject *obj)

Return a pointer to @ref{77e,,__dict__} of the object `obj'.
If there is no @code{__dict__}, return @code{NULL} without setting an exception.

This function may need to allocate memory for the
dictionary, so it may be more efficient to call @ref{5ee,,PyObject_GetAttr()}
when accessing an attribute on the object.
@end deffn

@geindex PyObject_RichCompare (C function)
@anchor{c-api/object c PyObject_RichCompare}@anchor{5251}
@deffn {C Function} @ref{5df,,PyObject} *PyObject_RichCompare (PyObject *o1, PyObject *o2, int opid)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Compare the values of `o1' and `o2' using the operation specified by `opid',
which must be one of @ref{55e9,,Py_LT}, @ref{55ea,,Py_LE}, @ref{55eb,,Py_EQ},
@ref{55ec,,Py_NE}, @ref{55ed,,Py_GT}, or @ref{55ee,,Py_GE}, corresponding to @code{<},
@code{<=}, @code{==}, @code{!=}, @code{>}, or @code{>=} respectively. This is the equivalent of
the Python expression @code{o1 op o2}, where @code{op} is the operator corresponding
to `opid'. Returns the value of the comparison on success, or @code{NULL} on failure.
@end deffn

@geindex PyObject_RichCompareBool (C function)
@anchor{c-api/object c PyObject_RichCompareBool}@anchor{1dd0}
@deffn {C Function} int PyObject_RichCompareBool (PyObject *o1, PyObject *o2, int opid)
` Part of the @ref{776,,Stable ABI}.'
Compare the values of `o1' and `o2' using the operation specified by `opid',
like @ref{5251,,PyObject_RichCompare()}, but returns @code{-1} on error, @code{0} if
the result is false, @code{1} otherwise.
@end deffn

@cartouche
@quotation Note 
If `o1' and `o2' are the same object, @ref{1dd0,,PyObject_RichCompareBool()}
will always return @code{1} for @ref{55eb,,Py_EQ} and @code{0} for @ref{55ec,,Py_NE}.
@end quotation
@end cartouche

@geindex PyObject_Format (C function)
@anchor{c-api/object c PyObject_Format}@anchor{53ee}
@deffn {C Function} @ref{5df,,PyObject} *PyObject_Format (PyObject *obj, PyObject *format_spec)
` Part of the @ref{776,,Stable ABI}.'
Format `obj' using `format_spec'. This is equivalent to the Python
expression @code{format(obj, format_spec)}.

`format_spec' may be @code{NULL}. In this case the call is equivalent
to @code{format(obj)}.
Returns the formatted string on success, @code{NULL} on failure.
@end deffn

@geindex PyObject_Repr (C function)
@anchor{c-api/object c PyObject_Repr}@anchor{1235}
@deffn {C Function} @ref{5df,,PyObject} *PyObject_Repr (PyObject *o)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
@geindex built-in function; repr

Compute a string representation of object `o'.  Returns the string
representation on success, @code{NULL} on failure.  This is the equivalent of the
Python expression @code{repr(o)}.  Called by the @ref{1c3,,repr()} built-in function.

If argument is @code{NULL}, return the string @code{'<NULL>'}.


Changed in version 3.4: This function now includes a debug assertion to help ensure that it
does not silently discard an active exception.

@end deffn

@geindex PyObject_ASCII (C function)
@anchor{c-api/object c PyObject_ASCII}@anchor{53e7}
@deffn {C Function} @ref{5df,,PyObject} *PyObject_ASCII (PyObject *o)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
@geindex built-in function; ascii

As @ref{1235,,PyObject_Repr()}, compute a string representation of object `o', but
escape the non-ASCII characters in the string returned by
@code{PyObject_Repr()} with @code{\x}, @code{\u} or @code{\U} escapes.  This generates
a string similar to that returned by @code{PyObject_Repr()} in Python 2.
Called by the @ref{15f2,,ascii()} built-in function.

If argument is @code{NULL}, return the string @code{'<NULL>'}.

@geindex string; PyObject_Str (C function)
@end deffn

@geindex PyObject_Str (C function)
@anchor{c-api/object c PyObject_Str}@anchor{1236}
@deffn {C Function} @ref{5df,,PyObject} *PyObject_Str (PyObject *o)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Compute a string representation of object `o'.  Returns the string
representation on success, @code{NULL} on failure.  This is the equivalent of the
Python expression @code{str(o)}.  Called by the @ref{16a,,str()} built-in function
and, therefore, by the @ref{117b,,print()} function.

If argument is @code{NULL}, return the string @code{'<NULL>'}.


Changed in version 3.4: This function now includes a debug assertion to help ensure that it
does not silently discard an active exception.

@end deffn

@geindex PyObject_Bytes (C function)
@anchor{c-api/object c PyObject_Bytes}@anchor{53e9}
@deffn {C Function} @ref{5df,,PyObject} *PyObject_Bytes (PyObject *o)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
@geindex built-in function; bytes

Compute a bytes representation of object `o'.  @code{NULL} is returned on
failure and a bytes object on success.  This is equivalent to the Python
expression @code{bytes(o)}, when `o' is not an integer.  Unlike @code{bytes(o)},
a TypeError is raised when `o' is an integer instead of a zero-initialized
bytes object.

If argument is @code{NULL}, return the @ref{193,,bytes} object @code{b'<NULL>'}.
@end deffn

@geindex PyObject_IsSubclass (C function)
@anchor{c-api/object c PyObject_IsSubclass}@anchor{10ad}
@deffn {C Function} int PyObject_IsSubclass (PyObject *derived, PyObject *cls)
` Part of the @ref{776,,Stable ABI}.'
Return @code{1} if the class `derived' is identical to or derived from the class
`cls', otherwise return @code{0}.  In case of an error, return @code{-1}.

If `cls' is a tuple, the check will be done against every entry in `cls'.
The result will be @code{1} when at least one of the checks returns @code{1},
otherwise it will be @code{0}.

If `cls' has a @ref{240e,,__subclasscheck__()} method, it will be called to
determine the subclass status as described in 
@geindex Python Enhancement Proposals; PEP 3119
PEP 3119@footnote{https://peps.python.org/pep-3119/}.  Otherwise,
`derived' is a subclass of `cls' if it is a direct or indirect subclass,
i.e. contained in @ref{23bb,,cls.__mro__}.

Normally only class objects, i.e. instances of @ref{f4a,,type} or a derived
class, are considered classes.  However, objects can override this by having
a @ref{16b8,,__bases__} attribute (which must be a tuple of base classes).
@end deffn

@geindex PyObject_IsInstance (C function)
@anchor{c-api/object c PyObject_IsInstance}@anchor{10ac}
@deffn {C Function} int PyObject_IsInstance (PyObject *inst, PyObject *cls)
` Part of the @ref{776,,Stable ABI}.'
Return @code{1} if `inst' is an instance of the class `cls' or a subclass of
`cls', or @code{0} if not.  On error, returns @code{-1} and sets an exception.

If `cls' is a tuple, the check will be done against every entry in `cls'.
The result will be @code{1} when at least one of the checks returns @code{1},
otherwise it will be @code{0}.

If `cls' has a @ref{240d,,__instancecheck__()} method, it will be called to
determine the subclass status as described in 
@geindex Python Enhancement Proposals; PEP 3119
PEP 3119@footnote{https://peps.python.org/pep-3119/}.  Otherwise, `inst'
is an instance of `cls' if its class is a subclass of `cls'.

An instance `inst' can override what is considered its class by having a
@ref{16b9,,__class__} attribute.

An object `cls' can override if it is considered a class, and what its base
classes are, by having a @ref{16b8,,__bases__} attribute (which must be a tuple
of base classes).
@end deffn

@geindex PyObject_Hash (C function)
@anchor{c-api/object c PyObject_Hash}@anchor{434}
@deffn {C Function} @ref{146f,,Py_hash_t} PyObject_Hash (PyObject *o)
` Part of the @ref{776,,Stable ABI}.'
@geindex built-in function; hash

Compute and return the hash value of an object `o'.  On failure, return @code{-1}.
This is the equivalent of the Python expression @code{hash(o)}.


Changed in version 3.2: The return type is now Py_hash_t.  This is a signed integer the same size
as @ref{c5b,,Py_ssize_t}.

@end deffn

@geindex PyObject_HashNotImplemented (C function)
@anchor{c-api/object c PyObject_HashNotImplemented}@anchor{15d2}
@deffn {C Function} @ref{146f,,Py_hash_t} PyObject_HashNotImplemented (PyObject *o)
` Part of the @ref{776,,Stable ABI}.'
Set a @ref{199,,TypeError} indicating that @code{type(o)} is not @ref{825,,hashable} and return @code{-1}.
This function receives special treatment when stored in a @code{tp_hash} slot,
allowing a type to explicitly indicate to the interpreter that it is not
hashable.
@end deffn

@geindex PyObject_IsTrue (C function)
@anchor{c-api/object c PyObject_IsTrue}@anchor{53f4}
@deffn {C Function} int PyObject_IsTrue (PyObject *o)
` Part of the @ref{776,,Stable ABI}.'
Returns @code{1} if the object `o' is considered to be true, and @code{0} otherwise.
This is equivalent to the Python expression @code{not not o}.  On failure, return
@code{-1}.
@end deffn

@geindex PyObject_Not (C function)
@anchor{c-api/object c PyObject_Not}@anchor{53f6}
@deffn {C Function} int PyObject_Not (PyObject *o)
` Part of the @ref{776,,Stable ABI}.'
Returns @code{0} if the object `o' is considered to be true, and @code{1} otherwise.
This is equivalent to the Python expression @code{not o}.  On failure, return
@code{-1}.
@end deffn

@geindex PyObject_Type (C function)
@anchor{c-api/object c PyObject_Type}@anchor{53f9}
@deffn {C Function} @ref{5df,,PyObject} *PyObject_Type (PyObject *o)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
@geindex built-in function; type

When `o' is non-@code{NULL}, returns a type object corresponding to the object type
of object `o'. On failure, raises @ref{796,,SystemError} and returns @code{NULL}.  This
is equivalent to the Python expression @code{type(o)}.
This function creates a new @ref{5e2,,strong reference} to the return value.
There’s really no reason to use this
function instead of the @ref{3c7,,Py_TYPE()} function, which returns a
pointer of type @ref{ca2,,PyTypeObject}*, except when a new
strong reference is needed.
@end deffn

@geindex PyObject_TypeCheck (C function)
@anchor{c-api/object c PyObject_TypeCheck}@anchor{1cf6}
@deffn {C Function} int PyObject_TypeCheck (PyObject *o, PyTypeObject *type)

Return non-zero if the object `o' is of type `type' or a subtype of `type', and
@code{0} otherwise.  Both parameters must be non-@code{NULL}.
@end deffn

@geindex PyObject_Size (C function)
@geindex PyObject_Length (C function)
@anchor{c-api/object c PyObject_Size}@anchor{53f8}
@deffn {C Function} @ref{c5b,,Py_ssize_t} PyObject_Size (PyObject *o)
@anchor{c-api/object c PyObject_Length}@anchor{53f5}
@deffnx {C Function} @ref{c5b,,Py_ssize_t} PyObject_Length (PyObject *o)
` Part of the @ref{776,,Stable ABI}.'
@geindex built-in function; len

Return the length of object `o'.  If the object `o' provides either the sequence
and mapping protocols, the sequence length is returned.  On error, @code{-1} is
returned.  This is the equivalent to the Python expression @code{len(o)}.
@end deffn

@geindex PyObject_LengthHint (C function)
@anchor{c-api/object c PyObject_LengthHint}@anchor{120a}
@deffn {C Function} @ref{c5b,,Py_ssize_t} PyObject_LengthHint (PyObject *o, Py_ssize_t defaultvalue)

Return an estimated length for the object `o'. First try to return its
actual length, then an estimate using @ref{1114,,__length_hint__()}, and
finally return the default value. On error return @code{-1}. This is the
equivalent to the Python expression @code{operator.length_hint(o, defaultvalue)}.


Added in version 3.4.

@end deffn

@geindex PyObject_GetItem (C function)
@anchor{c-api/object c PyObject_GetItem}@anchor{5ea}
@deffn {C Function} @ref{5df,,PyObject} *PyObject_GetItem (PyObject *o, PyObject *key)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Return element of `o' corresponding to the object `key' or @code{NULL} on failure.
This is the equivalent of the Python expression @code{o[key]}.
@end deffn

@geindex PyObject_SetItem (C function)
@anchor{c-api/object c PyObject_SetItem}@anchor{52a8}
@deffn {C Function} int PyObject_SetItem (PyObject *o, PyObject *key, PyObject *v)
` Part of the @ref{776,,Stable ABI}.'
Map the object `key' to the value `v'.  Raise an exception and
return @code{-1} on failure; return @code{0} on success.  This is the
equivalent of the Python statement @code{o[key] = v}.  This function `does
not' steal a reference to `v'.
@end deffn

@geindex PyObject_DelItem (C function)
@anchor{c-api/object c PyObject_DelItem}@anchor{53eb}
@deffn {C Function} int PyObject_DelItem (PyObject *o, PyObject *key)
` Part of the @ref{776,,Stable ABI}.'
Remove the mapping for the object `key' from the object `o'.  Return @code{-1}
on failure.  This is equivalent to the Python statement @code{del o[key]}.
@end deffn

@geindex PyObject_DelItemString (C function)
@anchor{c-api/object c PyObject_DelItemString}@anchor{53ec}
@deffn {C Function} int PyObject_DelItemString (PyObject *o, const char *key)
` Part of the @ref{776,,Stable ABI}.'
This is the same as @ref{53eb,,PyObject_DelItem()}, but `key' is
specified as a const char* UTF-8 encoded bytes string,
rather than a @ref{5df,,PyObject}*.
@end deffn

@geindex PyObject_Dir (C function)
@anchor{c-api/object c PyObject_Dir}@anchor{53ed}
@deffn {C Function} @ref{5df,,PyObject} *PyObject_Dir (PyObject *o)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
This is equivalent to the Python expression @code{dir(o)}, returning a (possibly
empty) list of strings appropriate for the object argument, or @code{NULL} if there
was an error.  If the argument is @code{NULL}, this is like the Python @code{dir()},
returning the names of the current locals; in this case, if no execution frame
is active then @code{NULL} is returned but @ref{1cf0,,PyErr_Occurred()} will return false.
@end deffn

@geindex PyObject_GetIter (C function)
@anchor{c-api/object c PyObject_GetIter}@anchor{53f3}
@deffn {C Function} @ref{5df,,PyObject} *PyObject_GetIter (PyObject *o)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
This is equivalent to the Python expression @code{iter(o)}. It returns a new
iterator for the object argument, or the object  itself if the object is already
an iterator.  Raises @ref{199,,TypeError} and returns @code{NULL} if the object cannot be
iterated.
@end deffn

@geindex PyObject_SelfIter (C function)
@anchor{c-api/object c PyObject_SelfIter}@anchor{53f7}
@deffn {C Function} @ref{5df,,PyObject} *PyObject_SelfIter (PyObject *obj)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
This is equivalent to the Python @code{__iter__(self): return self} method.
It is intended for @ref{4c9,,iterator} types, to be used in the @ref{16fb,,PyTypeObject.tp_iter} slot.
@end deffn

@geindex PyObject_GetAIter (C function)
@anchor{c-api/object c PyObject_GetAIter}@anchor{53f2}
@deffn {C Function} @ref{5df,,PyObject} *PyObject_GetAIter (PyObject *o)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI} since version 3.10.'
This is the equivalent to the Python expression @code{aiter(o)}. Takes an
@code{AsyncIterable} object and returns an @code{AsyncIterator} for it.
This is typically a new iterator but if the argument is an
@code{AsyncIterator}, this returns itself. Raises @ref{199,,TypeError} and
returns @code{NULL} if the object cannot be iterated.


Added in version 3.10.

@end deffn

@geindex PyObject_GetTypeData (C function)
@anchor{c-api/object c PyObject_GetTypeData}@anchor{76c}
@deffn {C Function} void *PyObject_GetTypeData (PyObject *o, PyTypeObject *cls)
` Part of the @ref{776,,Stable ABI} since version 3.12.'
Get a pointer to subclass-specific data reserved for `cls'.

The object `o' must be an instance of `cls', and `cls' must have been
created using negative @ref{76b,,PyType_Spec.basicsize}.
Python does not check this.

On error, set an exception and return @code{NULL}.


Added in version 3.12.

@end deffn

@geindex PyType_GetTypeDataSize (C function)
@anchor{c-api/object c PyType_GetTypeDataSize}@anchor{76d}
@deffn {C Function} @ref{c5b,,Py_ssize_t} PyType_GetTypeDataSize (PyTypeObject *cls)
` Part of the @ref{776,,Stable ABI} since version 3.12.'
Return the size of the instance memory space reserved for `cls', i.e. the size of the
memory @ref{76c,,PyObject_GetTypeData()} returns.

This may be larger than requested using @ref{76b,,-PyType_Spec.basicsize};
it is safe to use this larger size (e.g. with @code{memset()}).

The type `cls' `must' have been created using
negative @ref{76b,,PyType_Spec.basicsize}.
Python does not check this.

On error, set an exception and return a negative value.


Added in version 3.12.

@end deffn

@geindex PyObject_GetItemData (C function)
@anchor{c-api/object c PyObject_GetItemData}@anchor{76f}
@deffn {C Function} void *PyObject_GetItemData (PyObject *o)

Get a pointer to per-item data for a class with
@ref{76e,,Py_TPFLAGS_ITEMS_AT_END}.

On error, set an exception and return @code{NULL}.
@ref{199,,TypeError} is raised if `o' does not have
@ref{76e,,Py_TPFLAGS_ITEMS_AT_END} set.


Added in version 3.12.

@end deffn

@geindex PyObject_VisitManagedDict (C function)
@anchor{c-api/object c PyObject_VisitManagedDict}@anchor{60d}
@deffn {C Function} int PyObject_VisitManagedDict (PyObject *obj, visitproc visit, void *arg)

Visit the managed dictionary of `obj'.

This function must only be called in a traverse function of the type which
has the @ref{60f,,Py_TPFLAGS_MANAGED_DICT} flag set.


Added in version 3.13.

@end deffn

@geindex PyObject_ClearManagedDict (C function)
@anchor{c-api/object c PyObject_ClearManagedDict}@anchor{60e}
@deffn {C Function} void PyObject_ClearManagedDict (PyObject *obj)

Clear the managed dictionary of `obj'.

This function must only be called in a clear function of the type which
has the @ref{60f,,Py_TPFLAGS_MANAGED_DICT} flag set.


Added in version 3.13.

@end deffn

@geindex PyUnstable_Object_EnableDeferredRefcount (C function)
@anchor{c-api/object c PyUnstable_Object_EnableDeferredRefcount}@anchor{3c3}
@deffn {C Function} int PyUnstable_Object_EnableDeferredRefcount (PyObject *obj)

@cartouche
@quotation This is Unstable API. It may change without warning in minor releases. `This is @ref{76a,,Unstable API}. It may change without warning in minor releases.'
@end quotation
@end cartouche

Enable deferred reference counting@footnote{https://peps.python.org/pep-0703/#deferred-reference-counting} on `obj',
if supported by the runtime.  In the @ref{1f6,,free-threaded} build,
this allows the interpreter to avoid reference count adjustments to `obj',
which may improve multi-threaded performance.  The tradeoff is
that `obj' will only be deallocated by the tracing garbage collector, and
not when the interpreter no longer has any references to it.

This function returns @code{1} if deferred reference counting is enabled on `obj',
and @code{0} if deferred reference counting is not supported or if the hint was
ignored by the interpreter, such as when deferred reference counting is already
enabled on `obj'. This function is thread-safe, and cannot fail.

This function does nothing on builds with the @ref{165,,GIL} enabled, which do
not support deferred reference counting. This also does nothing if `obj' is not
an object tracked by the garbage collector (see @ref{1519,,gc.is_tracked()} and
@ref{b73,,PyObject_GC_IsTracked()}).

This function is intended to be used soon after `obj' is created,
by the code that creates it, such as in the object’s @ref{7a0,,tp_new}
slot.


Added in version 3.14.

@end deffn

@geindex PyUnstable_Object_IsUniqueReferencedTemporary (C function)
@anchor{c-api/object c PyUnstable_Object_IsUniqueReferencedTemporary}@anchor{3c5}
@deffn {C Function} int PyUnstable_Object_IsUniqueReferencedTemporary (PyObject *obj)

@cartouche
@quotation This is Unstable API. It may change without warning in minor releases. `This is @ref{76a,,Unstable API}. It may change without warning in minor releases.'
@end quotation
@end cartouche

Check if `obj' is a unique temporary object.
Returns @code{1} if `obj' is known to be a unique temporary object,
and @code{0} otherwise.  This function cannot fail, but the check is
conservative, and may return @code{0} in some cases even if `obj' is a unique
temporary object.

If an object is a unique temporary, it is guaranteed that the current code
has the only reference to the object. For arguments to C functions, this
should be used instead of checking if the reference count is @code{1}. Starting
with Python 3.14, the interpreter internally avoids some reference count
modifications when loading objects onto the operands stack by
@ref{3d5,,borrowing} references when possible, which means
that a reference count of @code{1} by itself does not guarantee that a function
argument uniquely referenced.

In the example below, @code{my_func} is called with a unique temporary object
as its argument:

@example
my_func([1, 2, 3])
@end example

In the example below, @code{my_func} is `not' called with a unique temporary
object as its argument, even if its refcount is @code{1}:

@example
my_list = [1, 2, 3]
my_func(my_list)
@end example

See also the function @ref{2d1,,Py_REFCNT()}.


Added in version 3.14.

@end deffn

@geindex PyUnstable_IsImmortal (C function)
@anchor{c-api/object c PyUnstable_IsImmortal}@anchor{3c2}
@deffn {C Function} int PyUnstable_IsImmortal (PyObject *obj)

@cartouche
@quotation This is Unstable API. It may change without warning in minor releases. `This is @ref{76a,,Unstable API}. It may change without warning in minor releases.'
@end quotation
@end cartouche

This function returns non-zero if `obj' is @ref{292,,immortal}, and zero
otherwise. This function cannot fail.

@cartouche
@quotation Note 
Objects that are immortal in one CPython version are not guaranteed to
be immortal in another.
@end quotation
@end cartouche


Added in version 3.14.

@end deffn

@geindex PyUnstable_TryIncRef (C function)
@anchor{c-api/object c PyUnstable_TryIncRef}@anchor{190f}
@deffn {C Function} int PyUnstable_TryIncRef (PyObject *obj)

@cartouche
@quotation This is Unstable API. It may change without warning in minor releases. `This is @ref{76a,,Unstable API}. It may change without warning in minor releases.'
@end quotation
@end cartouche

Increments the reference count of `obj' if it is not zero.  Returns @code{1}
if the object’s reference count was successfully incremented. Otherwise,
this function returns @code{0}.

@ref{1910,,PyUnstable_EnableTryIncRef()} must have been called
earlier on `obj' or this function may spuriously return @code{0} in the
@ref{1791,,free-threaded build}.

This function is logically equivalent to the following C code, except that
it behaves atomically in the @ref{1791,,free-threaded build}:

@example
if (Py_REFCNT(op) > 0) @{
   Py_INCREF(op);
   return 1;
@}
return 0;
@end example

This is intended as a building block for managing weak references
without the overhead of a Python @ref{55ef,,weak reference object}.

Typically, correct use of this function requires support from `obj'’s
deallocator (@ref{521c,,tp_dealloc}).
For example, the following sketch could be adapted to implement a
“weakmap” that works like a @ref{196e,,WeakValueDictionary}
for a specific type:

@example
PyMutex mutex;

PyObject *
add_entry(weakmap_key_type *key, PyObject *value)
@{
    PyUnstable_EnableTryIncRef(value);
    weakmap_type weakmap = ...;
    PyMutex_Lock(&mutex);
    weakmap_add_entry(weakmap, key, value);
    PyMutex_Unlock(&mutex);
    Py_RETURN_NONE;
@}

PyObject *
get_value(weakmap_key_type *key)
@{
    weakmap_type weakmap = ...;
    PyMutex_Lock(&mutex);
    PyObject *result = weakmap_find(weakmap, key);
    if (PyUnstable_TryIncRef(result)) @{
        // `result` is safe to use
        PyMutex_Unlock(&mutex);
        return result;
    @}
    // if we get here, `result` is starting to be garbage-collected,
    // but has not been removed from the weakmap yet
    PyMutex_Unlock(&mutex);
    return NULL;
@}

// tp_dealloc function for weakmap values
void
value_dealloc(PyObject *value)
@{
    weakmap_type weakmap = ...;
    PyMutex_Lock(&mutex);
    weakmap_remove_value(weakmap, value);

    ...
    PyMutex_Unlock(&mutex);
@}
@end example


Added in version 3.14.

@end deffn

@geindex PyUnstable_EnableTryIncRef (C function)
@anchor{c-api/object c PyUnstable_EnableTryIncRef}@anchor{1910}
@deffn {C Function} void PyUnstable_EnableTryIncRef (PyObject *obj)

@cartouche
@quotation This is Unstable API. It may change without warning in minor releases. `This is @ref{76a,,Unstable API}. It may change without warning in minor releases.'
@end quotation
@end cartouche

Enables subsequent uses of @ref{190f,,PyUnstable_TryIncRef()} on `obj'.  The
caller must hold a @ref{5e2,,strong reference} to `obj' when calling this.


Added in version 3.14.

@end deffn

@geindex PyUnstable_Object_IsUniquelyReferenced (C function)
@anchor{c-api/object c PyUnstable_Object_IsUniquelyReferenced}@anchor{3c4}
@deffn {C Function} int PyUnstable_Object_IsUniquelyReferenced (PyObject *op)

@cartouche
@quotation This is Unstable API. It may change without warning in minor releases. `This is @ref{76a,,Unstable API}. It may change without warning in minor releases.'
@end quotation
@end cartouche

Determine if `op' only has one reference.

On GIL-enabled builds, this function is equivalent to
@ref{2d1,,Py_REFCNT}(@ref{3c4,,op}) == 1.

On a @ref{1791,,free-threaded build}, this checks if `op'’s
@ref{5229,,reference count} is equal to one and additionally checks if `op'
is only used by this thread. @ref{2d1,,Py_REFCNT}(@ref{3c4,,op}) == 1 is `not'
thread-safe on free-threaded builds; prefer this function.

The caller must hold an @ref{5231,,attached thread state}, despite the fact
that this function doesn’t call into the Python interpreter. This function
cannot fail.


Added in version 3.14.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Call Protocol,Number Protocol,Object Protocol,Abstract Objects Layer
@anchor{c-api/call doc}@anchor{55f0}@anchor{c-api/call call}@anchor{7a4}@anchor{c-api/call call-protocol}@anchor{55f1}@anchor{c-api/call translation-repo}@anchor{55f2}
@subsection Call Protocol


CPython supports two different calling protocols:
`tp_call' and vectorcall.

@menu
* The tp_call Protocol:: 
* The Vectorcall Protocol:: 
* Object Calling API:: 
* Call Support API:: 

@end menu

@node The tp_call Protocol,The Vectorcall Protocol,,Call Protocol
@anchor{c-api/call the-tp-call-protocol}@anchor{55f3}
@subsubsection The `tp_call' Protocol


Instances of classes that set @ref{77c,,tp_call} are callable.
The signature of the slot is:

@example
PyObject *tp_call(PyObject *callable, PyObject *args, PyObject *kwargs);
@end example

A call is made using a tuple for the positional arguments
and a dict for the keyword arguments, similarly to
@code{callable(*args, **kwargs)} in Python code.
`args' must be non-NULL (use an empty tuple if there are no arguments)
but `kwargs' may be `NULL' if there are no keyword arguments.

This convention is not only used by `tp_call':
@ref{7a0,,tp_new} and @ref{7a2,,tp_init}
also pass arguments this way.

To call an object, use @ref{63d,,PyObject_Call()} or another
@ref{55f4,,call API}.

@node The Vectorcall Protocol,Object Calling API,The tp_call Protocol,Call Protocol
@anchor{c-api/call the-vectorcall-protocol}@anchor{55f5}@anchor{c-api/call vectorcall}@anchor{775}
@subsubsection The Vectorcall Protocol



Added in version 3.9.


The vectorcall protocol was introduced in 
@geindex Python Enhancement Proposals; PEP 590
PEP 590@footnote{https://peps.python.org/pep-0590/} as an additional protocol
for making calls more efficient.

As rule of thumb, CPython will prefer the vectorcall for internal calls
if the callable supports it. However, this is not a hard rule.
Additionally, some third-party extensions use `tp_call' directly
(rather than using @ref{63d,,PyObject_Call()}).
Therefore, a class supporting vectorcall must also implement
@ref{77c,,tp_call}.
Moreover, the callable must behave the same
regardless of which protocol is used.
The recommended way to achieve this is by setting
@code{tp_call} to @ref{779,,PyVectorcall_Call()}.
This bears repeating:

@cartouche
@quotation Warning 
A class supporting vectorcall `must' also implement
@ref{77c,,tp_call} with the same semantics.
@end quotation
@end cartouche


Changed in version 3.12: The @ref{777,,Py_TPFLAGS_HAVE_VECTORCALL} flag is now removed from a class
when the class’s @ref{77b,,__call__()} method is reassigned.
(This internally sets @ref{77c,,tp_call} only, and thus
may make it behave differently than the vectorcall function.)
In earlier Python versions, vectorcall should only be used with
@ref{3cd,,immutable} or static types.


A class should not implement vectorcall if that would be slower
than `tp_call'. For example, if the callee needs to convert
the arguments to an args tuple and kwargs dict anyway, then there is no point
in implementing vectorcall.

Classes can implement the vectorcall protocol by enabling the
@ref{777,,Py_TPFLAGS_HAVE_VECTORCALL} flag and setting
@ref{55f6,,tp_vectorcall_offset} to the offset inside the
object structure where a `vectorcallfunc' appears.
This is a pointer to a function with the following signature:

@geindex vectorcallfunc (C type)
@anchor{c-api/call c vectorcallfunc}@anchor{77a}
@deffn {C Type} typedef @ref{5df,,PyObject} *(*vectorcallfunc)(@ref{5df,,PyObject} *callable, @ref{5df,,PyObject} *const *args, size_t nargsf, @ref{5df,,PyObject} *kwnames)
` Part of the @ref{776,,Stable ABI} since version 3.12.'
@end deffn


@itemize -

@item 
`callable' is the object being called.

@item 

@table @asis

@item `args' is a C array consisting of the positional arguments followed by the

values of the keyword arguments.
This can be `NULL' if there are no arguments.
@end table

@item 

@table @asis

@item `nargsf' is the number of positional arguments plus possibly the

@ref{781,,PY_VECTORCALL_ARGUMENTS_OFFSET} flag.
To get the actual number of positional arguments from `nargsf',
use @ref{778,,PyVectorcall_NARGS()}.
@end table

@item 

@table @asis

@item `kwnames' is a tuple containing the names of the keyword arguments;

in other words, the keys of the kwargs dict.
These names must be strings (instances of @code{str} or a subclass)
and they must be unique.
If there are no keyword arguments, then `kwnames' can instead be `NULL'.
@end table
@end itemize

@geindex PY_VECTORCALL_ARGUMENTS_OFFSET (C macro)
@anchor{c-api/call c PY_VECTORCALL_ARGUMENTS_OFFSET}@anchor{781}
@deffn {C Macro} PY_VECTORCALL_ARGUMENTS_OFFSET
` Part of the @ref{776,,Stable ABI} since version 3.12.'
If this flag is set in a vectorcall `nargsf' argument, the callee is allowed
to temporarily change @code{args[-1]}. In other words, `args' points to
argument 1 (not 0) in the allocated vector.
The callee must restore the value of @code{args[-1]} before returning.

For @ref{780,,PyObject_VectorcallMethod()}, this flag means instead that
@code{args[0]} may be changed.

Whenever they can do so cheaply (without additional allocation), callers
are encouraged to use @ref{781,,PY_VECTORCALL_ARGUMENTS_OFFSET}.
Doing so will allow callables such as bound methods to make their onward
calls (which include a prepended `self' argument) very efficiently.


Added in version 3.8.

@end deffn

To call an object that implements vectorcall, use a @ref{55f4,,call API}
function as with any other callable.
@ref{77f,,PyObject_Vectorcall()} will usually be most efficient.

@menu
* Recursion Control: Recursion Control<2>. 
* Vectorcall Support API:: 

@end menu

@node Recursion Control<2>,Vectorcall Support API,,The Vectorcall Protocol
@anchor{c-api/call recursion-control}@anchor{55f7}
@subsubsection Recursion Control


When using `tp_call', callees do not need to worry about
@ref{555f,,recursion}: CPython uses
@ref{3d0,,Py_EnterRecursiveCall()} and @ref{b71,,Py_LeaveRecursiveCall()}
for calls made using `tp_call'.

For efficiency, this is not the case for calls done using vectorcall:
the callee should use `Py_EnterRecursiveCall' and `Py_LeaveRecursiveCall'
if needed.

@node Vectorcall Support API,,Recursion Control<2>,The Vectorcall Protocol
@anchor{c-api/call vectorcall-support-api}@anchor{55f8}
@subsubsection Vectorcall Support API


@geindex PyVectorcall_NARGS (C function)
@anchor{c-api/call c PyVectorcall_NARGS}@anchor{778}
@deffn {C Function} @ref{c5b,,Py_ssize_t} PyVectorcall_NARGS (size_t nargsf)
` Part of the @ref{776,,Stable ABI} since version 3.12.'
Given a vectorcall `nargsf' argument, return the actual number of
arguments.
Currently equivalent to:

@example
(Py_ssize_t)(nargsf & ~PY_VECTORCALL_ARGUMENTS_OFFSET)
@end example

However, the function @code{PyVectorcall_NARGS} should be used to allow
for future extensions.


Added in version 3.8.

@end deffn

@geindex PyVectorcall_Function (C function)
@anchor{c-api/call c PyVectorcall_Function}@anchor{55f9}
@deffn {C Function} @ref{77a,,vectorcallfunc} PyVectorcall_Function (PyObject *op)

If `op' does not support the vectorcall protocol (either because the type
does not or because the specific instance does not), return `NULL'.
Otherwise, return the vectorcall function pointer stored in `op'.
This function never raises an exception.

This is mostly useful to check whether or not `op' supports vectorcall,
which can be done by checking @code{PyVectorcall_Function(op) != NULL}.


Added in version 3.9.

@end deffn

@geindex PyVectorcall_Call (C function)
@anchor{c-api/call c PyVectorcall_Call}@anchor{779}
@deffn {C Function} @ref{5df,,PyObject} *PyVectorcall_Call (PyObject *callable, PyObject *tuple, PyObject *dict)
` Part of the @ref{776,,Stable ABI} since version 3.12.'
Call `callable'’s @ref{77a,,vectorcallfunc} with positional and keyword
arguments given in a tuple and dict, respectively.

This is a specialized function, intended to be put in the
@ref{77c,,tp_call} slot or be used in an implementation of @code{tp_call}.
It does not check the @ref{777,,Py_TPFLAGS_HAVE_VECTORCALL} flag
and it does not fall back to @code{tp_call}.


Added in version 3.8.

@end deffn

@node Object Calling API,Call Support API,The Vectorcall Protocol,Call Protocol
@anchor{c-api/call capi-call}@anchor{55f4}@anchor{c-api/call object-calling-api}@anchor{55fa}
@subsubsection Object Calling API


Various functions are available for calling a Python object.
Each converts its arguments to a convention supported by the called object –
either `tp_call' or vectorcall.
In order to do as little conversion as possible, pick one that best fits
the format of data you have available.

The following table summarizes the available functions;
please see individual documentation for details.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxx} 
@headitem

Function

@tab

callable

@tab

args

@tab

kwargs

@item

@ref{63d,,PyObject_Call()}

@tab

@code{PyObject *}

@tab

tuple

@tab

dict/@code{NULL}

@item

@ref{63c,,PyObject_CallNoArgs()}

@tab

@code{PyObject *}

@tab

—

@tab

—

@item

@ref{b75,,PyObject_CallOneArg()}

@tab

@code{PyObject *}

@tab

1 object

@tab

—

@item

@ref{520c,,PyObject_CallObject()}

@tab

@code{PyObject *}

@tab

tuple/@code{NULL}

@tab

—

@item

@ref{63f,,PyObject_CallFunction()}

@tab

@code{PyObject *}

@tab

format

@tab

—

@item

@ref{640,,PyObject_CallMethod()}

@tab

obj + @code{char*}

@tab

format

@tab

—

@item

@ref{53ea,,PyObject_CallFunctionObjArgs()}

@tab

@code{PyObject *}

@tab

variadic

@tab

—

@item

@ref{1e21,,PyObject_CallMethodObjArgs()}

@tab

obj + name

@tab

variadic

@tab

—

@item

@ref{55fb,,PyObject_CallMethodNoArgs()}

@tab

obj + name

@tab

—

@tab

—

@item

@ref{55fc,,PyObject_CallMethodOneArg()}

@tab

obj + name

@tab

1 object

@tab

—

@item

@ref{77f,,PyObject_Vectorcall()}

@tab

@code{PyObject *}

@tab

vectorcall

@tab

vectorcall

@item

@ref{55fd,,PyObject_VectorcallDict()}

@tab

@code{PyObject *}

@tab

vectorcall

@tab

dict/@code{NULL}

@item

@ref{780,,PyObject_VectorcallMethod()}

@tab

arg + name

@tab

vectorcall

@tab

vectorcall

@end multitable


@geindex PyObject_Call (C function)
@anchor{c-api/call c PyObject_Call}@anchor{63d}
@deffn {C Function} @ref{5df,,PyObject} *PyObject_Call (PyObject *callable, PyObject *args, PyObject *kwargs)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Call a callable Python object `callable', with arguments given by the
tuple `args', and named arguments given by the dictionary `kwargs'.

`args' must not be `NULL'; use an empty tuple if no arguments are needed.
If no named arguments are needed, `kwargs' can be `NULL'.

Return the result of the call on success, or raise an exception and return
`NULL' on failure.

This is the equivalent of the Python expression:
@code{callable(*args, **kwargs)}.
@end deffn

@geindex PyObject_CallNoArgs (C function)
@anchor{c-api/call c PyObject_CallNoArgs}@anchor{63c}
@deffn {C Function} @ref{5df,,PyObject} *PyObject_CallNoArgs (PyObject *callable)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI} since version 3.10.'
Call a callable Python object `callable' without any arguments. It is the
most efficient way to call a callable Python object without any argument.

Return the result of the call on success, or raise an exception and return
`NULL' on failure.


Added in version 3.9.

@end deffn

@geindex PyObject_CallOneArg (C function)
@anchor{c-api/call c PyObject_CallOneArg}@anchor{b75}
@deffn {C Function} @ref{5df,,PyObject} *PyObject_CallOneArg (PyObject *callable, PyObject *arg)
`Return value: New reference.'
Call a callable Python object `callable' with exactly 1 positional argument
`arg' and no keyword arguments.

Return the result of the call on success, or raise an exception and return
`NULL' on failure.


Added in version 3.9.

@end deffn

@geindex PyObject_CallObject (C function)
@anchor{c-api/call c PyObject_CallObject}@anchor{520c}
@deffn {C Function} @ref{5df,,PyObject} *PyObject_CallObject (PyObject *callable, PyObject *args)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Call a callable Python object `callable', with arguments given by the
tuple `args'.  If no arguments are needed, then `args' can be `NULL'.

Return the result of the call on success, or raise an exception and return
`NULL' on failure.

This is the equivalent of the Python expression: @code{callable(*args)}.
@end deffn

@geindex PyObject_CallFunction (C function)
@anchor{c-api/call c PyObject_CallFunction}@anchor{63f}
@deffn {C Function} @ref{5df,,PyObject} *PyObject_CallFunction (PyObject *callable, const char *format, ...)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Call a callable Python object `callable', with a variable number of C arguments.
The C arguments are described using a @ref{3c0,,Py_BuildValue()} style format
string.  The format can be `NULL', indicating that no arguments are provided.

Return the result of the call on success, or raise an exception and return
`NULL' on failure.

This is the equivalent of the Python expression: @code{callable(*args)}.

Note that if you only pass @ref{5df,,PyObject}* args,
@ref{53ea,,PyObject_CallFunctionObjArgs()} is a faster alternative.


Changed in version 3.4: The type of `format' was changed from @code{char *}.

@end deffn

@geindex PyObject_CallMethod (C function)
@anchor{c-api/call c PyObject_CallMethod}@anchor{640}
@deffn {C Function} @ref{5df,,PyObject} *PyObject_CallMethod (PyObject *obj, const char *name, const char *format, ...)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Call the method named `name' of object `obj' with a variable number of C
arguments.  The C arguments are described by a @ref{3c0,,Py_BuildValue()} format
string that should produce a tuple.

The format can be `NULL', indicating that no arguments are provided.

Return the result of the call on success, or raise an exception and return
`NULL' on failure.

This is the equivalent of the Python expression:
@code{obj.name(arg1, arg2, ...)}.

Note that if you only pass @ref{5df,,PyObject}* args,
@ref{1e21,,PyObject_CallMethodObjArgs()} is a faster alternative.


Changed in version 3.4: The types of `name' and `format' were changed from @code{char *}.

@end deffn

@geindex PyObject_CallFunctionObjArgs (C function)
@anchor{c-api/call c PyObject_CallFunctionObjArgs}@anchor{53ea}
@deffn {C Function} @ref{5df,,PyObject} *PyObject_CallFunctionObjArgs (PyObject *callable, ...)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Call a callable Python object `callable', with a variable number of
@ref{5df,,PyObject}* arguments.  The arguments are provided as a variable number
of parameters followed by `NULL'.

Return the result of the call on success, or raise an exception and return
`NULL' on failure.

This is the equivalent of the Python expression:
@code{callable(arg1, arg2, ...)}.
@end deffn

@geindex PyObject_CallMethodObjArgs (C function)
@anchor{c-api/call c PyObject_CallMethodObjArgs}@anchor{1e21}
@deffn {C Function} @ref{5df,,PyObject} *PyObject_CallMethodObjArgs (PyObject *obj, PyObject *name, ...)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Call a method of the Python object `obj', where the name of the method is given as a
Python string object in `name'.  It is called with a variable number of
@ref{5df,,PyObject}* arguments.  The arguments are provided as a variable number
of parameters followed by `NULL'.

Return the result of the call on success, or raise an exception and return
`NULL' on failure.
@end deffn

@geindex PyObject_CallMethodNoArgs (C function)
@anchor{c-api/call c PyObject_CallMethodNoArgs}@anchor{55fb}
@deffn {C Function} @ref{5df,,PyObject} *PyObject_CallMethodNoArgs (PyObject *obj, PyObject *name)

Call a method of the Python object `obj' without arguments,
where the name of the method is given as a Python string object in `name'.

Return the result of the call on success, or raise an exception and return
`NULL' on failure.


Added in version 3.9.

@end deffn

@geindex PyObject_CallMethodOneArg (C function)
@anchor{c-api/call c PyObject_CallMethodOneArg}@anchor{55fc}
@deffn {C Function} @ref{5df,,PyObject} *PyObject_CallMethodOneArg (PyObject *obj, PyObject *name, PyObject *arg)

Call a method of the Python object `obj' with a single positional argument
`arg', where the name of the method is given as a Python string object in
`name'.

Return the result of the call on success, or raise an exception and return
`NULL' on failure.


Added in version 3.9.

@end deffn

@geindex _PyObject_Vectorcall (C function)

@geindex PyObject_Vectorcall (C function)
@anchor{c-api/call c _PyObject_Vectorcall}@anchor{55fe}@anchor{c-api/call c PyObject_Vectorcall}@anchor{77f}
@deffn {C Function} @ref{5df,,PyObject} *PyObject_Vectorcall (PyObject *callable, PyObject *const *args, size_t nargsf, PyObject *kwnames)
` Part of the @ref{776,,Stable ABI} since version 3.12.'
Call a callable Python object `callable'.
The arguments are the same as for @ref{77a,,vectorcallfunc}.
If `callable' supports @ref{775,,vectorcall}, this directly calls
the vectorcall function stored in `callable'.

Return the result of the call on success, or raise an exception and return
`NULL' on failure.


Added in version 3.8: as @code{_PyObject_Vectorcall}



Changed in version 3.9: Renamed to the current name, without the leading underscore.
The old provisional name is @ref{23f,,soft deprecated}.

@end deffn

@geindex PyObject_VectorcallDict (C function)
@anchor{c-api/call c PyObject_VectorcallDict}@anchor{55fd}
@deffn {C Function} @ref{5df,,PyObject} *PyObject_VectorcallDict (PyObject *callable, PyObject *const *args, size_t nargsf, PyObject *kwdict)

Call `callable' with positional arguments passed exactly as in the @ref{775,,vectorcall} protocol,
but with keyword arguments passed as a dictionary `kwdict'.
The `args' array contains only the positional arguments.

Regardless of which protocol is used internally,
a conversion of arguments needs to be done.
Therefore, this function should only be used if the caller
already has a dictionary ready to use for the keyword arguments,
but not a tuple for the positional arguments.


Added in version 3.9.

@end deffn

@geindex PyObject_VectorcallMethod (C function)
@anchor{c-api/call c PyObject_VectorcallMethod}@anchor{780}
@deffn {C Function} @ref{5df,,PyObject} *PyObject_VectorcallMethod (PyObject *name, PyObject *const *args, size_t nargsf, PyObject *kwnames)
` Part of the @ref{776,,Stable ABI} since version 3.12.'
Call a method using the vectorcall calling convention. The name of the method
is given as a Python string `name'. The object whose method is called is
`args[0]', and the `args' array starting at `args[1]' represents the arguments
of the call. There must be at least one positional argument.
`nargsf' is the number of positional arguments including `args[0]',
plus @ref{781,,PY_VECTORCALL_ARGUMENTS_OFFSET} if the value of @code{args[0]} may
temporarily be changed. Keyword arguments can be passed just like in
@ref{77f,,PyObject_Vectorcall()}.

If the object has the @ref{5498,,Py_TPFLAGS_METHOD_DESCRIPTOR} feature,
this will call the unbound method object with the full
`args' vector as arguments.

Return the result of the call on success, or raise an exception and return
`NULL' on failure.


Added in version 3.9.

@end deffn

@node Call Support API,,Object Calling API,Call Protocol
@anchor{c-api/call call-support-api}@anchor{55ff}
@subsubsection Call Support API


@geindex PyCallable_Check (C function)
@anchor{c-api/call c PyCallable_Check}@anchor{52f2}
@deffn {C Function} int PyCallable_Check (PyObject *o)
` Part of the @ref{776,,Stable ABI}.'
Determine if the object `o' is callable.  Return @code{1} if the object is callable
and @code{0} otherwise.  This function always succeeds.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Number Protocol,Sequence Protocol,Call Protocol,Abstract Objects Layer
@anchor{c-api/number doc}@anchor{5600}@anchor{c-api/number number}@anchor{5601}@anchor{c-api/number number-protocol}@anchor{5602}@anchor{c-api/number translation-repo}@anchor{5603}
@subsection Number Protocol


@geindex PyNumber_Check (C function)
@anchor{c-api/number c PyNumber_Check}@anchor{c62}
@deffn {C Function} int PyNumber_Check (PyObject *o)
` Part of the @ref{776,,Stable ABI}.'
Returns @code{1} if the object `o' provides numeric protocols, and false otherwise.
This function always succeeds.


Changed in version 3.8: Returns @code{1} if `o' is an index integer.

@end deffn

@geindex PyNumber_Add (C function)
@anchor{c-api/number c PyNumber_Add}@anchor{53c6}
@deffn {C Function} @ref{5df,,PyObject} *PyNumber_Add (PyObject *o1, PyObject *o2)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Returns the result of adding `o1' and `o2', or @code{NULL} on failure.  This is the
equivalent of the Python expression @code{o1 + o2}.
@end deffn

@geindex PyNumber_Subtract (C function)
@anchor{c-api/number c PyNumber_Subtract}@anchor{53e0}
@deffn {C Function} @ref{5df,,PyObject} *PyNumber_Subtract (PyObject *o1, PyObject *o2)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Returns the result of subtracting `o2' from `o1', or @code{NULL} on failure.  This is
the equivalent of the Python expression @code{o1 - o2}.
@end deffn

@geindex PyNumber_Multiply (C function)
@anchor{c-api/number c PyNumber_Multiply}@anchor{53d9}
@deffn {C Function} @ref{5df,,PyObject} *PyNumber_Multiply (PyObject *o1, PyObject *o2)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Returns the result of multiplying `o1' and `o2', or @code{NULL} on failure.  This is
the equivalent of the Python expression @code{o1 * o2}.
@end deffn

@geindex PyNumber_MatrixMultiply (C function)
@anchor{c-api/number c PyNumber_MatrixMultiply}@anchor{10bc}
@deffn {C Function} @ref{5df,,PyObject} *PyNumber_MatrixMultiply (PyObject *o1, PyObject *o2)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI} since version 3.7.'
Returns the result of matrix multiplication on `o1' and `o2', or @code{NULL} on
failure.  This is the equivalent of the Python expression @code{o1 @@ o2}.


Added in version 3.5.

@end deffn

@geindex PyNumber_FloorDivide (C function)
@anchor{c-api/number c PyNumber_FloorDivide}@anchor{53ca}
@deffn {C Function} @ref{5df,,PyObject} *PyNumber_FloorDivide (PyObject *o1, PyObject *o2)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Return the floor of `o1' divided by `o2', or @code{NULL} on failure.  This is
the equivalent of the Python expression @code{o1 // o2}.
@end deffn

@geindex PyNumber_TrueDivide (C function)
@anchor{c-api/number c PyNumber_TrueDivide}@anchor{53e1}
@deffn {C Function} @ref{5df,,PyObject} *PyNumber_TrueDivide (PyObject *o1, PyObject *o2)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Return a reasonable approximation for the mathematical value of `o1' divided by
`o2', or @code{NULL} on failure.  The return value is “approximate” because binary
floating-point numbers are approximate; it is not possible to represent all real
numbers in base two.  This function can return a floating-point value when
passed two integers.  This is the equivalent of the Python expression @code{o1 / o2}.
@end deffn

@geindex PyNumber_Remainder (C function)
@anchor{c-api/number c PyNumber_Remainder}@anchor{53de}
@deffn {C Function} @ref{5df,,PyObject} *PyNumber_Remainder (PyObject *o1, PyObject *o2)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Returns the remainder of dividing `o1' by `o2', or @code{NULL} on failure.  This is
the equivalent of the Python expression @code{o1 % o2}.
@end deffn

@geindex PyNumber_Divmod (C function)
@anchor{c-api/number c PyNumber_Divmod}@anchor{53c9}
@deffn {C Function} @ref{5df,,PyObject} *PyNumber_Divmod (PyObject *o1, PyObject *o2)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
@geindex built-in function; divmod

See the built-in function @ref{b9f,,divmod()}. Returns @code{NULL} on failure.  This is
the equivalent of the Python expression @code{divmod(o1, o2)}.
@end deffn

@geindex PyNumber_Power (C function)
@anchor{c-api/number c PyNumber_Power}@anchor{53dd}
@deffn {C Function} @ref{5df,,PyObject} *PyNumber_Power (PyObject *o1, PyObject *o2, PyObject *o3)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
@geindex built-in function; pow

See the built-in function @ref{1a5,,pow()}. Returns @code{NULL} on failure.  This is the
equivalent of the Python expression @code{pow(o1, o2, o3)}, where `o3' is optional.
If `o3' is to be ignored, pass @ref{51ff,,Py_None} in its place (passing @code{NULL} for
`o3' would cause an illegal memory access).
@end deffn

@geindex PyNumber_Negative (C function)
@anchor{c-api/number c PyNumber_Negative}@anchor{53da}
@deffn {C Function} @ref{5df,,PyObject} *PyNumber_Negative (PyObject *o)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Returns the negation of `o' on success, or @code{NULL} on failure. This is the
equivalent of the Python expression @code{-o}.
@end deffn

@geindex PyNumber_Positive (C function)
@anchor{c-api/number c PyNumber_Positive}@anchor{53dc}
@deffn {C Function} @ref{5df,,PyObject} *PyNumber_Positive (PyObject *o)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Returns `o' on success, or @code{NULL} on failure.  This is the equivalent of the
Python expression @code{+o}.
@end deffn

@geindex PyNumber_Absolute (C function)
@anchor{c-api/number c PyNumber_Absolute}@anchor{53c5}
@deffn {C Function} @ref{5df,,PyObject} *PyNumber_Absolute (PyObject *o)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
@geindex built-in function; abs

Returns the absolute value of `o', or @code{NULL} on failure.  This is the equivalent
of the Python expression @code{abs(o)}.
@end deffn

@geindex PyNumber_Invert (C function)
@anchor{c-api/number c PyNumber_Invert}@anchor{53d7}
@deffn {C Function} @ref{5df,,PyObject} *PyNumber_Invert (PyObject *o)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Returns the bitwise negation of `o' on success, or @code{NULL} on failure.  This is
the equivalent of the Python expression @code{~o}.
@end deffn

@geindex PyNumber_Lshift (C function)
@anchor{c-api/number c PyNumber_Lshift}@anchor{53d8}
@deffn {C Function} @ref{5df,,PyObject} *PyNumber_Lshift (PyObject *o1, PyObject *o2)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Returns the result of left shifting `o1' by `o2' on success, or @code{NULL} on
failure.  This is the equivalent of the Python expression @code{o1 << o2}.
@end deffn

@geindex PyNumber_Rshift (C function)
@anchor{c-api/number c PyNumber_Rshift}@anchor{53df}
@deffn {C Function} @ref{5df,,PyObject} *PyNumber_Rshift (PyObject *o1, PyObject *o2)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Returns the result of right shifting `o1' by `o2' on success, or @code{NULL} on
failure.  This is the equivalent of the Python expression @code{o1 >> o2}.
@end deffn

@geindex PyNumber_And (C function)
@anchor{c-api/number c PyNumber_And}@anchor{53c7}
@deffn {C Function} @ref{5df,,PyObject} *PyNumber_And (PyObject *o1, PyObject *o2)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Returns the “bitwise and” of `o1' and `o2' on success and @code{NULL} on failure.
This is the equivalent of the Python expression @code{o1 & o2}.
@end deffn

@geindex PyNumber_Xor (C function)
@anchor{c-api/number c PyNumber_Xor}@anchor{53e2}
@deffn {C Function} @ref{5df,,PyObject} *PyNumber_Xor (PyObject *o1, PyObject *o2)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Returns the “bitwise exclusive or” of `o1' by `o2' on success, or @code{NULL} on
failure.  This is the equivalent of the Python expression @code{o1 ^ o2}.
@end deffn

@geindex PyNumber_Or (C function)
@anchor{c-api/number c PyNumber_Or}@anchor{53db}
@deffn {C Function} @ref{5df,,PyObject} *PyNumber_Or (PyObject *o1, PyObject *o2)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Returns the “bitwise or” of `o1' and `o2' on success, or @code{NULL} on failure.
This is the equivalent of the Python expression @code{o1 | o2}.
@end deffn

@geindex PyNumber_InPlaceAdd (C function)
@anchor{c-api/number c PyNumber_InPlaceAdd}@anchor{53cb}
@deffn {C Function} @ref{5df,,PyObject} *PyNumber_InPlaceAdd (PyObject *o1, PyObject *o2)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Returns the result of adding `o1' and `o2', or @code{NULL} on failure.  The operation
is done `in-place' when `o1' supports it.  This is the equivalent of the Python
statement @code{o1 += o2}.
@end deffn

@geindex PyNumber_InPlaceSubtract (C function)
@anchor{c-api/number c PyNumber_InPlaceSubtract}@anchor{53d4}
@deffn {C Function} @ref{5df,,PyObject} *PyNumber_InPlaceSubtract (PyObject *o1, PyObject *o2)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Returns the result of subtracting `o2' from `o1', or @code{NULL} on failure.  The
operation is done `in-place' when `o1' supports it.  This is the equivalent of
the Python statement @code{o1 -= o2}.
@end deffn

@geindex PyNumber_InPlaceMultiply (C function)
@anchor{c-api/number c PyNumber_InPlaceMultiply}@anchor{53cf}
@deffn {C Function} @ref{5df,,PyObject} *PyNumber_InPlaceMultiply (PyObject *o1, PyObject *o2)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Returns the result of multiplying `o1' and `o2', or @code{NULL} on failure.  The
operation is done `in-place' when `o1' supports it.  This is the equivalent of
the Python statement @code{o1 *= o2}.
@end deffn

@geindex PyNumber_InPlaceMatrixMultiply (C function)
@anchor{c-api/number c PyNumber_InPlaceMatrixMultiply}@anchor{10bd}
@deffn {C Function} @ref{5df,,PyObject} *PyNumber_InPlaceMatrixMultiply (PyObject *o1, PyObject *o2)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI} since version 3.7.'
Returns the result of matrix multiplication on `o1' and `o2', or @code{NULL} on
failure.  The operation is done `in-place' when `o1' supports it.  This is
the equivalent of the Python statement @code{o1 @@= o2}.


Added in version 3.5.

@end deffn

@geindex PyNumber_InPlaceFloorDivide (C function)
@anchor{c-api/number c PyNumber_InPlaceFloorDivide}@anchor{53cd}
@deffn {C Function} @ref{5df,,PyObject} *PyNumber_InPlaceFloorDivide (PyObject *o1, PyObject *o2)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Returns the mathematical floor of dividing `o1' by `o2', or @code{NULL} on failure.
The operation is done `in-place' when `o1' supports it.  This is the equivalent
of the Python statement @code{o1 //= o2}.
@end deffn

@geindex PyNumber_InPlaceTrueDivide (C function)
@anchor{c-api/number c PyNumber_InPlaceTrueDivide}@anchor{53d5}
@deffn {C Function} @ref{5df,,PyObject} *PyNumber_InPlaceTrueDivide (PyObject *o1, PyObject *o2)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Return a reasonable approximation for the mathematical value of `o1' divided by
`o2', or @code{NULL} on failure.  The return value is “approximate” because binary
floating-point numbers are approximate; it is not possible to represent all real
numbers in base two.  This function can return a floating-point value when
passed two integers.  The operation is done `in-place' when `o1' supports it.
This is the equivalent of the Python statement @code{o1 /= o2}.
@end deffn

@geindex PyNumber_InPlaceRemainder (C function)
@anchor{c-api/number c PyNumber_InPlaceRemainder}@anchor{53d2}
@deffn {C Function} @ref{5df,,PyObject} *PyNumber_InPlaceRemainder (PyObject *o1, PyObject *o2)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Returns the remainder of dividing `o1' by `o2', or @code{NULL} on failure.  The
operation is done `in-place' when `o1' supports it.  This is the equivalent of
the Python statement @code{o1 %= o2}.
@end deffn

@geindex PyNumber_InPlacePower (C function)
@anchor{c-api/number c PyNumber_InPlacePower}@anchor{53d1}
@deffn {C Function} @ref{5df,,PyObject} *PyNumber_InPlacePower (PyObject *o1, PyObject *o2, PyObject *o3)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
@geindex built-in function; pow

See the built-in function @ref{1a5,,pow()}. Returns @code{NULL} on failure.  The operation
is done `in-place' when `o1' supports it.  This is the equivalent of the Python
statement @code{o1 **= o2} when o3 is @ref{51ff,,Py_None}, or an in-place variant of
@code{pow(o1, o2, o3)} otherwise. If `o3' is to be ignored, pass @code{Py_None}
in its place (passing @code{NULL} for `o3' would cause an illegal memory access).
@end deffn

@geindex PyNumber_InPlaceLshift (C function)
@anchor{c-api/number c PyNumber_InPlaceLshift}@anchor{53ce}
@deffn {C Function} @ref{5df,,PyObject} *PyNumber_InPlaceLshift (PyObject *o1, PyObject *o2)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Returns the result of left shifting `o1' by `o2' on success, or @code{NULL} on
failure.  The operation is done `in-place' when `o1' supports it.  This is the
equivalent of the Python statement @code{o1 <<= o2}.
@end deffn

@geindex PyNumber_InPlaceRshift (C function)
@anchor{c-api/number c PyNumber_InPlaceRshift}@anchor{53d3}
@deffn {C Function} @ref{5df,,PyObject} *PyNumber_InPlaceRshift (PyObject *o1, PyObject *o2)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Returns the result of right shifting `o1' by `o2' on success, or @code{NULL} on
failure.  The operation is done `in-place' when `o1' supports it.  This is the
equivalent of the Python statement @code{o1 >>= o2}.
@end deffn

@geindex PyNumber_InPlaceAnd (C function)
@anchor{c-api/number c PyNumber_InPlaceAnd}@anchor{53cc}
@deffn {C Function} @ref{5df,,PyObject} *PyNumber_InPlaceAnd (PyObject *o1, PyObject *o2)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Returns the “bitwise and” of `o1' and `o2' on success and @code{NULL} on failure. The
operation is done `in-place' when `o1' supports it.  This is the equivalent of
the Python statement @code{o1 &= o2}.
@end deffn

@geindex PyNumber_InPlaceXor (C function)
@anchor{c-api/number c PyNumber_InPlaceXor}@anchor{53d6}
@deffn {C Function} @ref{5df,,PyObject} *PyNumber_InPlaceXor (PyObject *o1, PyObject *o2)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Returns the “bitwise exclusive or” of `o1' by `o2' on success, or @code{NULL} on
failure.  The operation is done `in-place' when `o1' supports it.  This is the
equivalent of the Python statement @code{o1 ^= o2}.
@end deffn

@geindex PyNumber_InPlaceOr (C function)
@anchor{c-api/number c PyNumber_InPlaceOr}@anchor{53d0}
@deffn {C Function} @ref{5df,,PyObject} *PyNumber_InPlaceOr (PyObject *o1, PyObject *o2)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Returns the “bitwise or” of `o1' and `o2' on success, or @code{NULL} on failure.  The
operation is done `in-place' when `o1' supports it.  This is the equivalent of
the Python statement @code{o1 |= o2}.
@end deffn

@geindex PyNumber_Long (C function)
@anchor{c-api/number c PyNumber_Long}@anchor{c63}
@deffn {C Function} @ref{5df,,PyObject} *PyNumber_Long (PyObject *o)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
@geindex built-in function; int

Returns the `o' converted to an integer object on success, or @code{NULL} on
failure.  This is the equivalent of the Python expression @code{int(o)}.
@end deffn

@geindex PyNumber_Float (C function)
@anchor{c-api/number c PyNumber_Float}@anchor{c64}
@deffn {C Function} @ref{5df,,PyObject} *PyNumber_Float (PyObject *o)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
@geindex built-in function; float

Returns the `o' converted to a float object on success, or @code{NULL} on failure.
This is the equivalent of the Python expression @code{float(o)}.
@end deffn

@geindex PyNumber_Index (C function)
@anchor{c-api/number c PyNumber_Index}@anchor{a99}
@deffn {C Function} @ref{5df,,PyObject} *PyNumber_Index (PyObject *o)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Returns the `o' converted to a Python int on success or @code{NULL} with a
@ref{199,,TypeError} exception raised on failure.


Changed in version 3.10: The result always has exact type @ref{19c,,int}.  Previously, the result
could have been an instance of a subclass of @code{int}.

@end deffn

@geindex PyNumber_ToBase (C function)
@anchor{c-api/number c PyNumber_ToBase}@anchor{1bb7}
@deffn {C Function} @ref{5df,,PyObject} *PyNumber_ToBase (PyObject *n, int base)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Returns the integer `n' converted to base `base' as a string.  The `base'
argument must be one of 2, 8, 10, or 16.  For base 2, 8, or 16, the
returned string is prefixed with a base marker of @code{'0b'}, @code{'0o'}, or
@code{'0x'}, respectively.  If `n' is not a Python int, it is converted with
@ref{a99,,PyNumber_Index()} first.
@end deffn

@geindex PyNumber_AsSsize_t (C function)
@anchor{c-api/number c PyNumber_AsSsize_t}@anchor{53c8}
@deffn {C Function} @ref{c5b,,Py_ssize_t} PyNumber_AsSsize_t (PyObject *o, PyObject *exc)
` Part of the @ref{776,,Stable ABI}.'
Returns `o' converted to a @ref{c5b,,Py_ssize_t} value if `o' can be interpreted as an
integer.  If the call fails, an exception is raised and @code{-1} is returned.

If `o' can be converted to a Python int but the attempt to
convert to a @ref{c5b,,Py_ssize_t} value would raise an @ref{a87,,OverflowError}, then the
`exc' argument is the type of exception that will be raised (usually
@ref{1741,,IndexError} or @code{OverflowError}).  If `exc' is @code{NULL}, then the
exception is cleared and the value is clipped to @code{PY_SSIZE_T_MIN} for a negative
integer or @code{PY_SSIZE_T_MAX} for a positive integer.
@end deffn

@geindex PyIndex_Check (C function)
@anchor{c-api/number c PyIndex_Check}@anchor{b87}
@deffn {C Function} int PyIndex_Check (PyObject *o)
` Part of the @ref{776,,Stable ABI} since version 3.8.'
Returns @code{1} if `o' is an index integer (has the @code{nb_index} slot of the
@code{tp_as_number} structure filled in), and @code{0} otherwise.
This function always succeeds.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Sequence Protocol,Mapping Protocol,Number Protocol,Abstract Objects Layer
@anchor{c-api/sequence doc}@anchor{5604}@anchor{c-api/sequence sequence}@anchor{5605}@anchor{c-api/sequence sequence-protocol}@anchor{5606}@anchor{c-api/sequence translation-repo}@anchor{5607}
@subsection Sequence Protocol


@geindex PySequence_Check (C function)
@anchor{c-api/sequence c PySequence_Check}@anchor{5400}
@deffn {C Function} int PySequence_Check (PyObject *o)
` Part of the @ref{776,,Stable ABI}.'
Return @code{1} if the object provides the sequence protocol, and @code{0} otherwise.
Note that it returns @code{1} for Python classes with a @ref{588,,__getitem__()}
method, unless they are @ref{184,,dict} subclasses, since in general it
is impossible to determine what type of keys the class supports.  This
function always succeeds.
@end deffn

@geindex PySequence_Size (C function)
@geindex PySequence_Length (C function)
@anchor{c-api/sequence c PySequence_Size}@anchor{1e75}
@deffn {C Function} @ref{c5b,,Py_ssize_t} PySequence_Size (PyObject *o)
@anchor{c-api/sequence c PySequence_Length}@anchor{5408}
@deffnx {C Function} @ref{c5b,,Py_ssize_t} PySequence_Length (PyObject *o)
` Part of the @ref{776,,Stable ABI}.'
@geindex built-in function; len

Returns the number of objects in sequence `o' on success, and @code{-1} on
failure.  This is equivalent to the Python expression @code{len(o)}.
@end deffn

@geindex PySequence_Concat (C function)
@anchor{c-api/sequence c PySequence_Concat}@anchor{5401}
@deffn {C Function} @ref{5df,,PyObject} *PySequence_Concat (PyObject *o1, PyObject *o2)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Return the concatenation of `o1' and `o2' on success, and @code{NULL} on failure.
This is the equivalent of the Python expression @code{o1 + o2}.
@end deffn

@geindex PySequence_Repeat (C function)
@anchor{c-api/sequence c PySequence_Repeat}@anchor{540a}
@deffn {C Function} @ref{5df,,PyObject} *PySequence_Repeat (PyObject *o, Py_ssize_t count)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Return the result of repeating sequence object `o' `count' times, or @code{NULL} on
failure.  This is the equivalent of the Python expression @code{o * count}.
@end deffn

@geindex PySequence_InPlaceConcat (C function)
@anchor{c-api/sequence c PySequence_InPlaceConcat}@anchor{5405}
@deffn {C Function} @ref{5df,,PyObject} *PySequence_InPlaceConcat (PyObject *o1, PyObject *o2)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Return the concatenation of `o1' and `o2' on success, and @code{NULL} on failure.
The operation is done `in-place' when `o1' supports it.  This is the equivalent
of the Python expression @code{o1 += o2}.
@end deffn

@geindex PySequence_InPlaceRepeat (C function)
@anchor{c-api/sequence c PySequence_InPlaceRepeat}@anchor{5406}
@deffn {C Function} @ref{5df,,PyObject} *PySequence_InPlaceRepeat (PyObject *o, Py_ssize_t count)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Return the result of repeating sequence object `o' `count' times, or @code{NULL} on
failure.  The operation is done `in-place' when `o' supports it.  This is the
equivalent of the Python expression @code{o *= count}.
@end deffn

@geindex PySequence_GetItem (C function)
@anchor{c-api/sequence c PySequence_GetItem}@anchor{1e76}
@deffn {C Function} @ref{5df,,PyObject} *PySequence_GetItem (PyObject *o, Py_ssize_t i)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Return the `i'th element of `o', or @code{NULL} on failure. This is the equivalent of
the Python expression @code{o[i]}.
@end deffn

@geindex PySequence_GetSlice (C function)
@anchor{c-api/sequence c PySequence_GetSlice}@anchor{5404}
@deffn {C Function} @ref{5df,,PyObject} *PySequence_GetSlice (PyObject *o, Py_ssize_t i1, Py_ssize_t i2)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Return the slice of sequence object `o' between `i1' and `i2', or @code{NULL} on
failure. This is the equivalent of the Python expression @code{o[i1:i2]}.
@end deffn

@geindex PySequence_SetItem (C function)
@anchor{c-api/sequence c PySequence_SetItem}@anchor{1e77}
@deffn {C Function} int PySequence_SetItem (PyObject *o, Py_ssize_t i, PyObject *v)
` Part of the @ref{776,,Stable ABI}.'
Assign object `v' to the `i'th element of `o'.  Raise an exception
and return @code{-1} on failure; return @code{0} on success.  This
is the equivalent of the Python statement @code{o[i] = v}.  This function `does
not' steal a reference to `v'.

If `v' is @code{NULL}, the element is deleted, but this feature is
deprecated in favour of using @ref{1e78,,PySequence_DelItem()}.
@end deffn

@geindex PySequence_DelItem (C function)
@anchor{c-api/sequence c PySequence_DelItem}@anchor{1e78}
@deffn {C Function} int PySequence_DelItem (PyObject *o, Py_ssize_t i)
` Part of the @ref{776,,Stable ABI}.'
Delete the `i'th element of object `o'.  Returns @code{-1} on failure.  This is the
equivalent of the Python statement @code{del o[i]}.
@end deffn

@geindex PySequence_SetSlice (C function)
@anchor{c-api/sequence c PySequence_SetSlice}@anchor{540b}
@deffn {C Function} int PySequence_SetSlice (PyObject *o, Py_ssize_t i1, Py_ssize_t i2, PyObject *v)
` Part of the @ref{776,,Stable ABI}.'
Assign the sequence object `v' to the slice in sequence object `o' from `i1' to
`i2'.  This is the equivalent of the Python statement @code{o[i1:i2] = v}.
@end deffn

@geindex PySequence_DelSlice (C function)
@anchor{c-api/sequence c PySequence_DelSlice}@anchor{5403}
@deffn {C Function} int PySequence_DelSlice (PyObject *o, Py_ssize_t i1, Py_ssize_t i2)
` Part of the @ref{776,,Stable ABI}.'
Delete the slice in sequence object `o' from `i1' to `i2'.  Returns @code{-1} on
failure.  This is the equivalent of the Python statement @code{del o[i1:i2]}.
@end deffn

@geindex PySequence_Count (C function)
@anchor{c-api/sequence c PySequence_Count}@anchor{5402}
@deffn {C Function} @ref{c5b,,Py_ssize_t} PySequence_Count (PyObject *o, PyObject *value)
` Part of the @ref{776,,Stable ABI}.'
Return the number of occurrences of `value' in `o', that is, return the number
of keys for which @code{o[key] == value}.  On failure, return @code{-1}.  This is
equivalent to the Python expression @code{o.count(value)}.
@end deffn

@geindex PySequence_Contains (C function)
@anchor{c-api/sequence c PySequence_Contains}@anchor{3d7}
@deffn {C Function} int PySequence_Contains (PyObject *o, PyObject *value)
` Part of the @ref{776,,Stable ABI}.'
Determine if `o' contains `value'.  If an item in `o' is equal to `value',
return @code{1}, otherwise return @code{0}. On error, return @code{-1}.  This is
equivalent to the Python expression @code{value in o}.
@end deffn

@geindex PySequence_In (C function)
@anchor{c-api/sequence c PySequence_In}@anchor{3d6}
@deffn {C Function} int PySequence_In (PyObject *o, PyObject *value)
` Part of the @ref{776,,Stable ABI}.'
Alias for @ref{3d7,,PySequence_Contains()}.


@ref{23f,,Soft deprecated} since version 3.14: The function should no longer be used to write new code.

@end deffn

@geindex PySequence_Index (C function)
@anchor{c-api/sequence c PySequence_Index}@anchor{5407}
@deffn {C Function} @ref{c5b,,Py_ssize_t} PySequence_Index (PyObject *o, PyObject *value)
` Part of the @ref{776,,Stable ABI}.'
Return the first index `i' for which @code{o[i] == value}.  On error, return
@code{-1}.    This is equivalent to the Python expression @code{o.index(value)}.
@end deffn

@geindex PySequence_List (C function)
@anchor{c-api/sequence c PySequence_List}@anchor{5409}
@deffn {C Function} @ref{5df,,PyObject} *PySequence_List (PyObject *o)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Return a list object with the same contents as the sequence or iterable `o',
or @code{NULL} on failure.  The returned list is guaranteed to be new.  This is
equivalent to the Python expression @code{list(o)}.
@end deffn

@geindex PySequence_Tuple (C function)
@anchor{c-api/sequence c PySequence_Tuple}@anchor{540c}
@deffn {C Function} @ref{5df,,PyObject} *PySequence_Tuple (PyObject *o)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
@geindex built-in function; tuple

Return a tuple object with the same contents as the sequence or iterable `o',
or @code{NULL} on failure.  If `o' is a tuple, a new reference will be returned,
otherwise a tuple will be constructed with the appropriate contents.  This is
equivalent to the Python expression @code{tuple(o)}.
@end deffn

@geindex PySequence_Fast (C function)
@anchor{c-api/sequence c PySequence_Fast}@anchor{18e9}
@deffn {C Function} @ref{5df,,PyObject} *PySequence_Fast (PyObject *o, const char *m)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Return the sequence or iterable `o' as an object usable by the other
@code{PySequence_Fast*} family of functions. If the object is not a sequence or
iterable, raises @ref{199,,TypeError} with `m' as the message text. Returns
@code{NULL} on failure.

The @code{PySequence_Fast*} functions are thus named because they assume
`o' is a @ref{5584,,PyTupleObject} or a @ref{2776,,PyListObject} and access
the data fields of `o' directly.

As a CPython implementation detail, if `o' is already a sequence or list, it
will be returned.
@end deffn

@geindex PySequence_Fast_GET_SIZE (C function)
@anchor{c-api/sequence c PySequence_Fast_GET_SIZE}@anchor{3c8}
@deffn {C Function} @ref{c5b,,Py_ssize_t} PySequence_Fast_GET_SIZE (PyObject *o)

Returns the length of `o', assuming that `o' was returned by
@ref{18e9,,PySequence_Fast()} and that `o' is not @code{NULL}.  The size can also be
retrieved by calling @ref{1e75,,PySequence_Size()} on `o', but
@ref{3c8,,PySequence_Fast_GET_SIZE()} is faster because it can assume `o' is a
list or tuple.
@end deffn

@geindex PySequence_Fast_GET_ITEM (C function)
@anchor{c-api/sequence c PySequence_Fast_GET_ITEM}@anchor{3c9}
@deffn {C Function} @ref{5df,,PyObject} *PySequence_Fast_GET_ITEM (PyObject *o, Py_ssize_t i)
`Return value: Borrowed reference.'
Return the `i'th element of `o', assuming that `o' was returned by
@ref{18e9,,PySequence_Fast()}, `o' is not @code{NULL}, and that `i' is within bounds.
@end deffn

@geindex PySequence_Fast_ITEMS (C function)
@anchor{c-api/sequence c PySequence_Fast_ITEMS}@anchor{3ca}
@deffn {C Function} @ref{5df,,PyObject} **PySequence_Fast_ITEMS (PyObject *o)

Return the underlying array of PyObject pointers.  Assumes that `o' was returned
by @ref{18e9,,PySequence_Fast()} and `o' is not @code{NULL}.

Note, if a list gets resized, the reallocation may relocate the items array.
So, only use the underlying array pointer in contexts where the sequence
cannot change.
@end deffn

@geindex PySequence_ITEM (C function)
@anchor{c-api/sequence c PySequence_ITEM}@anchor{5608}
@deffn {C Function} @ref{5df,,PyObject} *PySequence_ITEM (PyObject *o, Py_ssize_t i)
`Return value: New reference.'
Return the `i'th element of `o' or @code{NULL} on failure. Faster form of
@ref{1e76,,PySequence_GetItem()} but without checking that
@ref{5400,,PySequence_Check()} on `o' is true and without adjustment for negative
indices.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Mapping Protocol,Iterator Protocol,Sequence Protocol,Abstract Objects Layer
@anchor{c-api/mapping doc}@anchor{5609}@anchor{c-api/mapping mapping}@anchor{560a}@anchor{c-api/mapping mapping-protocol}@anchor{560b}@anchor{c-api/mapping translation-repo}@anchor{560c}
@subsection Mapping Protocol


See also @ref{5ea,,PyObject_GetItem()}, @ref{52a8,,PyObject_SetItem()} and
@ref{53eb,,PyObject_DelItem()}.

@geindex PyMapping_Check (C function)
@anchor{c-api/mapping c PyMapping_Check}@anchor{53b1}
@deffn {C Function} int PyMapping_Check (PyObject *o)
` Part of the @ref{776,,Stable ABI}.'
Return @code{1} if the object provides the mapping protocol or supports slicing,
and @code{0} otherwise.  Note that it returns @code{1} for Python classes with
a @ref{588,,__getitem__()} method, since in general it is impossible to
determine what type of keys the class supports. This function always succeeds.
@end deffn

@geindex PyMapping_Size (C function)
@geindex PyMapping_Length (C function)
@anchor{c-api/mapping c PyMapping_Size}@anchor{1e79}
@deffn {C Function} @ref{c5b,,Py_ssize_t} PyMapping_Size (PyObject *o)
@anchor{c-api/mapping c PyMapping_Length}@anchor{53b2}
@deffnx {C Function} @ref{c5b,,Py_ssize_t} PyMapping_Length (PyObject *o)
` Part of the @ref{776,,Stable ABI}.'
@geindex built-in function; len

Returns the number of keys in object `o' on success, and @code{-1} on failure.
This is equivalent to the Python expression @code{len(o)}.
@end deffn

@geindex PyMapping_GetItemString (C function)
@anchor{c-api/mapping c PyMapping_GetItemString}@anchor{5eb}
@deffn {C Function} @ref{5df,,PyObject} *PyMapping_GetItemString (PyObject *o, const char *key)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
This is the same as @ref{5ea,,PyObject_GetItem()}, but `key' is
specified as a const char* UTF-8 encoded bytes string,
rather than a @ref{5df,,PyObject}*.
@end deffn

@geindex PyMapping_GetOptionalItem (C function)
@anchor{c-api/mapping c PyMapping_GetOptionalItem}@anchor{5e8}
@deffn {C Function} int PyMapping_GetOptionalItem (PyObject *obj, PyObject *key, PyObject **result)
` Part of the @ref{776,,Stable ABI} since version 3.13.'
Variant of @ref{5ea,,PyObject_GetItem()} which doesn’t raise
@ref{5e7,,KeyError} if the key is not found.

If the key is found, return @code{1} and set `*result' to a new
@ref{5e2,,strong reference} to the corresponding value.
If the key is not found, return @code{0} and set `*result' to @code{NULL};
the @ref{5e7,,KeyError} is silenced.
If an error other than @code{KeyError} is raised, return @code{-1} and
set `*result' to @code{NULL}.


Added in version 3.13.

@end deffn

@geindex PyMapping_GetOptionalItemString (C function)
@anchor{c-api/mapping c PyMapping_GetOptionalItemString}@anchor{5e9}
@deffn {C Function} int PyMapping_GetOptionalItemString (PyObject *obj, const char *key, PyObject **result)
` Part of the @ref{776,,Stable ABI} since version 3.13.'
This is the same as @ref{5e8,,PyMapping_GetOptionalItem()}, but `key' is
specified as a const char* UTF-8 encoded bytes string,
rather than a @ref{5df,,PyObject}*.


Added in version 3.13.

@end deffn

@geindex PyMapping_SetItemString (C function)
@anchor{c-api/mapping c PyMapping_SetItemString}@anchor{53b3}
@deffn {C Function} int PyMapping_SetItemString (PyObject *o, const char *key, PyObject *v)
` Part of the @ref{776,,Stable ABI}.'
This is the same as @ref{52a8,,PyObject_SetItem()}, but `key' is
specified as a const char* UTF-8 encoded bytes string,
rather than a @ref{5df,,PyObject}*.
@end deffn

@geindex PyMapping_DelItem (C function)
@anchor{c-api/mapping c PyMapping_DelItem}@anchor{560d}
@deffn {C Function} int PyMapping_DelItem (PyObject *o, PyObject *key)

This is an alias of @ref{53eb,,PyObject_DelItem()}.
@end deffn

@geindex PyMapping_DelItemString (C function)
@anchor{c-api/mapping c PyMapping_DelItemString}@anchor{560e}
@deffn {C Function} int PyMapping_DelItemString (PyObject *o, const char *key)

This is the same as @ref{53eb,,PyObject_DelItem()}, but `key' is
specified as a const char* UTF-8 encoded bytes string,
rather than a @ref{5df,,PyObject}*.
@end deffn

@geindex PyMapping_HasKeyWithError (C function)
@anchor{c-api/mapping c PyMapping_HasKeyWithError}@anchor{61f}
@deffn {C Function} int PyMapping_HasKeyWithError (PyObject *o, PyObject *key)
` Part of the @ref{776,,Stable ABI} since version 3.13.'
Return @code{1} if the mapping object has the key `key' and @code{0} otherwise.
This is equivalent to the Python expression @code{key in o}.
On failure, return @code{-1}.


Added in version 3.13.

@end deffn

@geindex PyMapping_HasKeyStringWithError (C function)
@anchor{c-api/mapping c PyMapping_HasKeyStringWithError}@anchor{621}
@deffn {C Function} int PyMapping_HasKeyStringWithError (PyObject *o, const char *key)
` Part of the @ref{776,,Stable ABI} since version 3.13.'
This is the same as @ref{61f,,PyMapping_HasKeyWithError()}, but `key' is
specified as a const char* UTF-8 encoded bytes string,
rather than a @ref{5df,,PyObject}*.


Added in version 3.13.

@end deffn

@geindex PyMapping_HasKey (C function)
@anchor{c-api/mapping c PyMapping_HasKey}@anchor{620}
@deffn {C Function} int PyMapping_HasKey (PyObject *o, PyObject *key)
` Part of the @ref{776,,Stable ABI}.'
Return @code{1} if the mapping object has the key `key' and @code{0} otherwise.
This is equivalent to the Python expression @code{key in o}.
This function always succeeds.

@cartouche
@quotation Note 
Exceptions which occur when this calls the @ref{588,,__getitem__()}
method are silently ignored.
For proper error handling, use @ref{61f,,PyMapping_HasKeyWithError()},
@ref{5e8,,PyMapping_GetOptionalItem()} or @ref{5ea,,PyObject_GetItem()} instead.
@end quotation
@end cartouche
@end deffn

@geindex PyMapping_HasKeyString (C function)
@anchor{c-api/mapping c PyMapping_HasKeyString}@anchor{622}
@deffn {C Function} int PyMapping_HasKeyString (PyObject *o, const char *key)
` Part of the @ref{776,,Stable ABI}.'
This is the same as @ref{620,,PyMapping_HasKey()}, but `key' is
specified as a const char* UTF-8 encoded bytes string,
rather than a @ref{5df,,PyObject}*.

@cartouche
@quotation Note 
Exceptions that occur when this calls the @ref{588,,__getitem__()}
method or while creating the temporary @ref{16a,,str}
object are silently ignored.
For proper error handling, use @ref{621,,PyMapping_HasKeyStringWithError()},
@ref{5e9,,PyMapping_GetOptionalItemString()} or
@ref{5eb,,PyMapping_GetItemString()} instead.
@end quotation
@end cartouche
@end deffn

@geindex PyMapping_Keys (C function)
@anchor{c-api/mapping c PyMapping_Keys}@anchor{dbb}
@deffn {C Function} @ref{5df,,PyObject} *PyMapping_Keys (PyObject *o)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
On success, return a list of the keys in object `o'.  On failure, return
@code{NULL}.


Changed in version 3.7: Previously, the function returned a list or a tuple.

@end deffn

@geindex PyMapping_Values (C function)
@anchor{c-api/mapping c PyMapping_Values}@anchor{dbc}
@deffn {C Function} @ref{5df,,PyObject} *PyMapping_Values (PyObject *o)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
On success, return a list of the values in object `o'.  On failure, return
@code{NULL}.


Changed in version 3.7: Previously, the function returned a list or a tuple.

@end deffn

@geindex PyMapping_Items (C function)
@anchor{c-api/mapping c PyMapping_Items}@anchor{dbd}
@deffn {C Function} @ref{5df,,PyObject} *PyMapping_Items (PyObject *o)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
On success, return a list of the items in object `o', where each item is a
tuple containing a key-value pair.  On failure, return @code{NULL}.


Changed in version 3.7: Previously, the function returned a list or a tuple.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Iterator Protocol,Buffer Protocol,Mapping Protocol,Abstract Objects Layer
@anchor{c-api/iter doc}@anchor{560f}@anchor{c-api/iter iterator}@anchor{5610}@anchor{c-api/iter iterator-protocol}@anchor{5611}@anchor{c-api/iter translation-repo}@anchor{5612}
@subsection Iterator Protocol


There are two functions specifically for working with iterators.

@geindex PyIter_Check (C function)
@anchor{c-api/iter c PyIter_Check}@anchor{1cf3}
@deffn {C Function} int PyIter_Check (PyObject *o)
` Part of the @ref{776,,Stable ABI} since version 3.8.'
Return non-zero if the object `o' can be safely passed to
@ref{396,,PyIter_NextItem()} and @code{0} otherwise.
This function always succeeds.
@end deffn

@geindex PyAIter_Check (C function)
@anchor{c-api/iter c PyAIter_Check}@anchor{52c3}
@deffn {C Function} int PyAIter_Check (PyObject *o)
` Part of the @ref{776,,Stable ABI} since version 3.10.'
Return non-zero if the object `o' provides the @code{AsyncIterator}
protocol, and @code{0} otherwise.  This function always succeeds.


Added in version 3.10.

@end deffn

@geindex PyIter_NextItem (C function)
@anchor{c-api/iter c PyIter_NextItem}@anchor{396}
@deffn {C Function} int PyIter_NextItem (PyObject *iter, PyObject **item)
` Part of the @ref{776,,Stable ABI} since version 3.14.'
Return @code{1} and set `item' to a @ref{5e2,,strong reference} of the
next value of the iterator `iter' on success.
Return @code{0} and set `item' to @code{NULL} if there are no remaining values.
Return @code{-1}, set `item' to @code{NULL} and set an exception on error.


Added in version 3.14.

@end deffn

@geindex PyIter_Next (C function)
@anchor{c-api/iter c PyIter_Next}@anchor{397}
@deffn {C Function} @ref{5df,,PyObject} *PyIter_Next (PyObject *o)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
This is an older version of @code{PyIter_NextItem()},
which is retained for backwards compatibility.
Prefer @ref{396,,PyIter_NextItem()}.

Return the next value from the iterator `o'.  The object must be an iterator
according to @ref{1cf3,,PyIter_Check()} (it is up to the caller to check this).
If there are no remaining values, returns @code{NULL} with no exception set.
If an error occurs while retrieving the item, returns @code{NULL} and passes
along the exception.
@end deffn

@geindex PySendResult (C type)
@anchor{c-api/iter c PySendResult}@anchor{5613}
@deffn {C Type} type PySendResult

The enum value used to represent different results of @ref{a9e,,PyIter_Send()}.


Added in version 3.10.

@end deffn

@geindex PyIter_Send (C function)
@anchor{c-api/iter c PyIter_Send}@anchor{a9e}
@deffn {C Function} @ref{5613,,PySendResult} PyIter_Send (PyObject *iter, PyObject *arg, PyObject **presult)
` Part of the @ref{776,,Stable ABI} since version 3.10.'
Sends the `arg' value into the iterator `iter'. Returns:


@itemize -

@item 
@code{PYGEN_RETURN} if iterator returns. Return value is returned via `presult'.

@item 
@code{PYGEN_NEXT} if iterator yields. Yielded value is returned via `presult'.

@item 
@code{PYGEN_ERROR} if iterator has raised and exception. `presult' is set to @code{NULL}.
@end itemize


Added in version 3.10.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@geindex buffer protocol
@geindex buffer interface; (see buffer protocol)
@geindex buffer object; (see buffer protocol)

@node Buffer Protocol,,Iterator Protocol,Abstract Objects Layer
@anchor{c-api/buffer doc}@anchor{5614}@anchor{c-api/buffer buffer-protocol}@anchor{5615}@anchor{c-api/buffer bufferobjects}@anchor{262}@anchor{c-api/buffer translation-repo}@anchor{5616}
@subsection Buffer Protocol


Certain objects available in Python wrap access to an underlying memory
array or `buffer'.  Such objects include the built-in @ref{193,,bytes} and
@ref{342,,bytearray}, and some extension types like @ref{4bf,,array.array}.
Third-party libraries may define their own types for special purposes, such
as image processing or numeric analysis.

While each of these types have their own semantics, they share the common
characteristic of being backed by a possibly large memory buffer.  It is
then desirable, in some situations, to access that buffer directly and
without intermediate copying.

Python provides such a facility at the C and Python level in the form of the
@ref{262,,buffer protocol}.  This protocol has two sides:

@geindex PyBufferProcs (C type)


@itemize -

@item 
on the producer side, a type can export a “buffer interface” which allows
objects of that type to expose information about their underlying buffer.
This interface is described in the section @ref{5617,,Buffer Object Structures}; for
Python see @ref{2457,,Emulating buffer types}.

@item 
on the consumer side, several means are available to obtain a pointer to
the raw underlying data of an object (for example a method parameter). For
Python see @ref{166,,memoryview}.
@end itemize

Simple objects such as @ref{193,,bytes} and @ref{342,,bytearray} expose their
underlying buffer in byte-oriented form.  Other forms are possible; for example,
the elements exposed by an @ref{4bf,,array.array} can be multi-byte values.

An example consumer of the buffer interface is the @ref{edd,,write()}
method of file objects: any object that can export a series of bytes through
the buffer interface can be written to a file.  While @code{write()} only
needs read-only access to the internal contents of the object passed to it,
other methods such as @ref{18dc,,readinto()} need write access
to the contents of their argument.  The buffer interface allows objects to
selectively allow or reject exporting of read-write and read-only buffers.

There are two ways for a consumer of the buffer interface to acquire a buffer
over a target object:


@itemize *

@item 
call @ref{63a,,PyObject_GetBuffer()} with the right parameters;

@item 
call @ref{3bf,,PyArg_ParseTuple()} (or one of its siblings) with one of the
@code{y*}, @code{w*} or @code{s*} @ref{3d3,,format codes}.
@end itemize

In both cases, @ref{63b,,PyBuffer_Release()} must be called when the buffer
isn’t needed anymore.  Failure to do so could lead to various issues such as
resource leaks.


Added in version 3.12: The buffer protocol is now accessible in Python, see
@ref{2457,,Emulating buffer types} and @ref{166,,memoryview}.


@menu
* Buffer structure:: 
* Buffer request types:: 
* Complex arrays:: 
* Buffer-related functions:: 

@end menu

@node Buffer structure,Buffer request types,,Buffer Protocol
@anchor{c-api/buffer buffer-structure}@anchor{5618}@anchor{c-api/buffer id1}@anchor{5619}
@subsubsection Buffer structure


Buffer structures (or simply “buffers”) are useful as a way to expose the
binary data from another object to the Python programmer.  They can also be
used as a zero-copy slicing mechanism.  Using their ability to reference a
block of memory, it is possible to expose any data to the Python programmer
quite easily.  The memory could be a large, constant array in a C extension,
it could be a raw block of memory for manipulation before passing to an
operating system library, or it could be used to pass around structured data
in its native, in-memory format.

Contrary to most data types exposed by the Python interpreter, buffers
are not @ref{5df,,PyObject} pointers but rather simple C structures.  This
allows them to be created and copied very simply.  When a generic wrapper
around a buffer is needed, a @ref{561a,,memoryview} object
can be created.

For short instructions how to write an exporting object, see
@ref{5617,,Buffer Object Structures}. For obtaining
a buffer, see @ref{63a,,PyObject_GetBuffer()}.

@geindex Py_buffer (C type)
@anchor{c-api/buffer c Py_buffer}@anchor{961}
@deffn {C Type} type Py_buffer
` Part of the @ref{776,,Stable ABI} (including all members) since version 3.11.'
@geindex Py_buffer.buf (C member)
@anchor{c-api/buffer c Py_buffer buf}@anchor{561b}
@deffn {C Member} void *buf

A pointer to the start of the logical structure described by the buffer
fields. This can be any location within the underlying physical memory
block of the exporter. For example, with negative @ref{561c,,strides}
the value may point to the end of the memory block.

For @ref{26ce,,contiguous} arrays, the value points to the beginning of
the memory block.
@end deffn

@geindex Py_buffer.obj (C member)
@anchor{c-api/buffer c Py_buffer obj}@anchor{561d}
@deffn {C Member} @ref{5df,,PyObject} *obj

A new reference to the exporting object. The reference is owned by
the consumer and automatically released
(i.e. reference count decremented)
and set to @code{NULL} by
@ref{63b,,PyBuffer_Release()}. The field is the equivalent of the return
value of any standard C-API function.

As a special case, for `temporary' buffers that are wrapped by
@ref{96a,,PyMemoryView_FromBuffer()} or @ref{969,,PyBuffer_FillInfo()}
this field is @code{NULL}. In general, exporting objects MUST NOT
use this scheme.
@end deffn

@geindex Py_buffer.len (C member)
@anchor{c-api/buffer c Py_buffer len}@anchor{561e}
@deffn {C Member} @ref{c5b,,Py_ssize_t} len

@code{product(shape) * itemsize}. For contiguous arrays, this is the length
of the underlying memory block. For non-contiguous arrays, it is the length
that the logical structure would have if it were copied to a contiguous
representation.

Accessing @code{((char *)buf)[0] up to ((char *)buf)[len-1]} is only valid
if the buffer has been obtained by a request that guarantees contiguity. In
most cases such a request will be @ref{52d1,,PyBUF_SIMPLE} or @ref{15c1,,PyBUF_WRITABLE}.
@end deffn

@geindex Py_buffer.readonly (C member)
@anchor{c-api/buffer c Py_buffer readonly}@anchor{561f}
@deffn {C Member} int readonly

An indicator of whether the buffer is read-only. This field is controlled
by the @ref{15c1,,PyBUF_WRITABLE} flag.
@end deffn

@geindex Py_buffer.itemsize (C member)
@anchor{c-api/buffer c Py_buffer itemsize}@anchor{5620}
@deffn {C Member} @ref{c5b,,Py_ssize_t} itemsize

Item size in bytes of a single element. Same as the value of @ref{1dec,,struct.calcsize()}
called on non-@code{NULL} @ref{5621,,format} values.

Important exception: If a consumer requests a buffer without the
@ref{52c9,,PyBUF_FORMAT} flag, @ref{5621,,format} will
be set to  @code{NULL},  but @ref{5620,,itemsize} still has
the value for the original format.

If @ref{5622,,shape} is present, the equality
@code{product(shape) * itemsize == len} still holds and the consumer
can use @ref{5620,,itemsize} to navigate the buffer.

If @ref{5622,,shape} is @code{NULL} as a result of a @ref{52d1,,PyBUF_SIMPLE}
or a @ref{15c1,,PyBUF_WRITABLE} request, the consumer must disregard
@ref{5620,,itemsize} and assume @code{itemsize == 1}.
@end deffn

@geindex Py_buffer.format (C member)
@anchor{c-api/buffer c Py_buffer format}@anchor{5621}
@deffn {C Member} char *format

A `NULL' terminated string in @ref{db,,struct} module style syntax describing
the contents of a single item. If this is @code{NULL}, @code{"B"} (unsigned bytes)
is assumed.

This field is controlled by the @ref{52c9,,PyBUF_FORMAT} flag.
@end deffn

@geindex Py_buffer.ndim (C member)
@anchor{c-api/buffer c Py_buffer ndim}@anchor{5623}
@deffn {C Member} int ndim

The number of dimensions the memory represents as an n-dimensional array.
If it is @code{0}, @ref{561b,,buf} points to a single item representing
a scalar. In this case, @ref{5622,,shape}, @ref{561c,,strides}
and @ref{5624,,suboffsets} MUST be @code{NULL}.
The maximum number of dimensions is given by @ref{52cd,,PyBUF_MAX_NDIM}.
@end deffn

@geindex Py_buffer.shape (C member)
@anchor{c-api/buffer c Py_buffer shape}@anchor{5622}
@deffn {C Member} @ref{c5b,,Py_ssize_t} *shape

An array of @ref{c5b,,Py_ssize_t} of length @ref{5623,,ndim}
indicating the shape of the memory as an n-dimensional array. Note that
@code{shape[0] * ... * shape[ndim-1] * itemsize} MUST be equal to
@ref{561e,,len}.

Shape values are restricted to @code{shape[n] >= 0}. The case
@code{shape[n] == 0} requires special attention. See @ref{5625,,complex arrays}
for further information.

The shape array is read-only for the consumer.
@end deffn

@geindex Py_buffer.strides (C member)
@anchor{c-api/buffer c Py_buffer strides}@anchor{561c}
@deffn {C Member} @ref{c5b,,Py_ssize_t} *strides

An array of @ref{c5b,,Py_ssize_t} of length @ref{5623,,ndim}
giving the number of bytes to skip to get to a new element in each
dimension.

Stride values can be any integer. For regular arrays, strides are
usually positive, but a consumer MUST be able to handle the case
@code{strides[n] <= 0}. See @ref{5625,,complex arrays} for further information.

The strides array is read-only for the consumer.
@end deffn

@geindex Py_buffer.suboffsets (C member)
@anchor{c-api/buffer c Py_buffer suboffsets}@anchor{5624}
@deffn {C Member} @ref{c5b,,Py_ssize_t} *suboffsets

An array of @ref{c5b,,Py_ssize_t} of length @ref{5623,,ndim}.
If @code{suboffsets[n] >= 0}, the values stored along the nth dimension are
pointers and the suboffset value dictates how many bytes to add to each
pointer after de-referencing. A suboffset value that is negative
indicates that no de-referencing should occur (striding in a contiguous
memory block).

If all suboffsets are negative (i.e. no de-referencing is needed), then
this field must be @code{NULL} (the default value).

This type of array representation is used by the Python Imaging Library
(PIL). See @ref{5625,,complex arrays} for further information how to access elements
of such an array.

The suboffsets array is read-only for the consumer.
@end deffn

@geindex Py_buffer.internal (C member)
@anchor{c-api/buffer c Py_buffer internal}@anchor{5626}
@deffn {C Member} void *internal

This is for use internally by the exporting object. For example, this
might be re-cast as an integer by the exporter and used to store flags
about whether or not the shape, strides, and suboffsets arrays must be
freed when the buffer is released. The consumer MUST NOT alter this
value.
@end deffn
@end deffn

Constants:

@geindex PyBUF_MAX_NDIM (C macro)
@anchor{c-api/buffer c PyBUF_MAX_NDIM}@anchor{52cd}
@deffn {C Macro} PyBUF_MAX_NDIM
` Part of the @ref{776,,Stable ABI} since version 3.11.'
The maximum number of dimensions the memory represents.
Exporters MUST respect this limit, consumers of multi-dimensional
buffers SHOULD be able to handle up to @code{PyBUF_MAX_NDIM} dimensions.
Currently set to 64.
@end deffn

@node Buffer request types,Complex arrays,Buffer structure,Buffer Protocol
@anchor{c-api/buffer buffer-request-types}@anchor{4dbc}@anchor{c-api/buffer id2}@anchor{5627}
@subsubsection Buffer request types


Buffers are usually obtained by sending a buffer request to an exporting
object via @ref{63a,,PyObject_GetBuffer()}. Since the complexity of the logical
structure of the memory can vary drastically, the consumer uses the `flags'
argument to specify the exact buffer type it can handle.

All @ref{961,,Py_buffer} fields are unambiguously defined by the request
type.

@menu
* request-independent fields:: 
* readonly@comma{} format: readonly format. 
* shape@comma{} strides@comma{} suboffsets: shape strides suboffsets. 
* contiguity requests:: 
* compound requests:: 

@end menu

@node request-independent fields,readonly format,,Buffer request types
@anchor{c-api/buffer request-independent-fields}@anchor{5628}
@subsubsection request-independent fields


The following fields are not influenced by `flags' and must always be filled in
with the correct values: @ref{561d,,obj}, @ref{561b,,buf},
@ref{561e,,len}, @ref{5620,,itemsize}, @ref{5623,,ndim}.

@node readonly format,shape strides suboffsets,request-independent fields,Buffer request types
@anchor{c-api/buffer readonly-format}@anchor{5629}
@subsubsection readonly, format


@quotation

@geindex PyBUF_WRITABLE (C macro)
@anchor{c-api/buffer c PyBUF_WRITABLE}@anchor{15c1}
@deffn {C Macro} PyBUF_WRITABLE
` Part of the @ref{776,,Stable ABI} since version 3.11.'
Controls the @ref{561f,,readonly} field. If set, the exporter
MUST provide a writable buffer or else report failure. Otherwise, the
exporter MAY provide either a read-only or writable buffer, but the choice
MUST be consistent for all consumers. For example, @ref{52d1,,PyBUF_SIMPLE} | @ref{15c1,,PyBUF_WRITABLE}
can be used to request a simple writable buffer.
@end deffn

@geindex PyBUF_WRITEABLE (C macro)
@anchor{c-api/buffer c PyBUF_WRITEABLE}@anchor{562a}
@deffn {C Macro} PyBUF_WRITEABLE

This is a @ref{23f,,soft deprecated} alias to @ref{15c1,,PyBUF_WRITABLE}.
@end deffn

@geindex PyBUF_FORMAT (C macro)
@anchor{c-api/buffer c PyBUF_FORMAT}@anchor{52c9}
@deffn {C Macro} PyBUF_FORMAT
` Part of the @ref{776,,Stable ABI} since version 3.11.'
Controls the @ref{5621,,format} field. If set, this field MUST
be filled in correctly. Otherwise, this field MUST be @code{NULL}.
@end deffn
@end quotation

@ref{15c1,,PyBUF_WRITABLE} can be |’d to any of the flags in the next section.
Since @ref{52d1,,PyBUF_SIMPLE} is defined as 0, @code{PyBUF_WRITABLE}
can be used as a stand-alone flag to request a simple writable buffer.

@ref{52c9,,PyBUF_FORMAT} must be |’d to any of the flags except @ref{52d1,,PyBUF_SIMPLE}, because
the latter already implies format @code{B} (unsigned bytes). @code{PyBUF_FORMAT} cannot be
used on its own.

@node shape strides suboffsets,contiguity requests,readonly format,Buffer request types
@anchor{c-api/buffer shape-strides-suboffsets}@anchor{562b}
@subsubsection shape, strides, suboffsets


The flags that control the logical structure of the memory are listed
in decreasing order of complexity. Note that each flag contains all bits
of the flags below it.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxx} {xxxxxxxxxxx} {xxxxxxxxxxxxxx} 
@headitem

Request

@tab

shape

@tab

strides

@tab

suboffsets

@item

@geindex PyBUF_INDIRECT (C macro)
@anchor{c-api/buffer c PyBUF_INDIRECT}@anchor{52cc}
@deffn {C Macro} PyBUF_INDIRECT
` Part of the @ref{776,,Stable ABI} since version 3.11.'
@end deffn

@tab

yes

@tab

yes

@tab

if needed

@item

@geindex PyBUF_STRIDES (C macro)
@anchor{c-api/buffer c PyBUF_STRIDES}@anchor{52d4}
@deffn {C Macro} PyBUF_STRIDES
` Part of the @ref{776,,Stable ABI} since version 3.11.'
@end deffn

@tab

yes

@tab

yes

@tab

NULL

@item

@geindex PyBUF_ND (C macro)
@anchor{c-api/buffer c PyBUF_ND}@anchor{52ce}
@deffn {C Macro} PyBUF_ND
` Part of the @ref{776,,Stable ABI} since version 3.11.'
@end deffn

@tab

yes

@tab

NULL

@tab

NULL

@item

@geindex PyBUF_SIMPLE (C macro)
@anchor{c-api/buffer c PyBUF_SIMPLE}@anchor{52d1}
@deffn {C Macro} PyBUF_SIMPLE
` Part of the @ref{776,,Stable ABI} since version 3.11.'
@end deffn

@tab

NULL

@tab

NULL

@tab

NULL

@end multitable


@geindex contiguous
@geindex C-contiguous
@geindex Fortran contiguous

@node contiguity requests,compound requests,shape strides suboffsets,Buffer request types
@anchor{c-api/buffer contiguity-requests}@anchor{562c}
@subsubsection contiguity requests


C or Fortran @ref{26ce,,contiguity} can be explicitly requested,
with and without stride information. Without stride information, the buffer
must be C-contiguous.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxx} {xxxxxxxxxxx} {xxxxxxxxxxxxxx} {xxxxxxxxxx} 
@headitem

Request

@tab

shape

@tab

strides

@tab

suboffsets

@tab

contig

@item

@geindex PyBUF_C_CONTIGUOUS (C macro)
@anchor{c-api/buffer c PyBUF_C_CONTIGUOUS}@anchor{15c2}
@deffn {C Macro} PyBUF_C_CONTIGUOUS
` Part of the @ref{776,,Stable ABI} since version 3.11.'
@end deffn

@tab

yes

@tab

yes

@tab

NULL

@tab

C

@item

@geindex PyBUF_F_CONTIGUOUS (C macro)
@anchor{c-api/buffer c PyBUF_F_CONTIGUOUS}@anchor{15c3}
@deffn {C Macro} PyBUF_F_CONTIGUOUS
` Part of the @ref{776,,Stable ABI} since version 3.11.'
@end deffn

@tab

yes

@tab

yes

@tab

NULL

@tab

F

@item

@geindex PyBUF_ANY_CONTIGUOUS (C macro)
@anchor{c-api/buffer c PyBUF_ANY_CONTIGUOUS}@anchor{52c6}
@deffn {C Macro} PyBUF_ANY_CONTIGUOUS
` Part of the @ref{776,,Stable ABI} since version 3.11.'
@end deffn

@tab

yes

@tab

yes

@tab

NULL

@tab

C or F

@item

@ref{52ce,,PyBUF_ND}

@tab

yes

@tab

NULL

@tab

NULL

@tab

C

@end multitable


@node compound requests,,contiguity requests,Buffer request types
@anchor{c-api/buffer compound-requests}@anchor{562d}
@subsubsection compound requests


All possible requests are fully defined by some combination of the flags in
the previous section. For convenience, the buffer protocol provides frequently
used combinations as single flags.

In the following table `U' stands for undefined contiguity. The consumer would
have to call @ref{967,,PyBuffer_IsContiguous()} to determine contiguity.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxx} {xxxxxxxxxxx} {xxxxxxxxxxxxxx} {xxxxxxxxxx} {xxxxxxxxxxxx} {xxxxxxxxxx} 
@headitem

Request

@tab

shape

@tab

strides

@tab

suboffsets

@tab

contig

@tab

readonly

@tab

format

@item

@geindex PyBUF_FULL (C macro)
@anchor{c-api/buffer c PyBUF_FULL}@anchor{52ca}
@deffn {C Macro} PyBUF_FULL
` Part of the @ref{776,,Stable ABI} since version 3.11.'
@end deffn

@tab

yes

@tab

yes

@tab

if needed

@tab

U

@tab

0

@tab

yes

@item

@geindex PyBUF_FULL_RO (C macro)
@anchor{c-api/buffer c PyBUF_FULL_RO}@anchor{52cb}
@deffn {C Macro} PyBUF_FULL_RO
` Part of the @ref{776,,Stable ABI} since version 3.11.'
@end deffn

@tab

yes

@tab

yes

@tab

if needed

@tab

U

@tab

1 or 0

@tab

yes

@item

@geindex PyBUF_RECORDS (C macro)
@anchor{c-api/buffer c PyBUF_RECORDS}@anchor{52cf}
@deffn {C Macro} PyBUF_RECORDS
` Part of the @ref{776,,Stable ABI} since version 3.11.'
@end deffn

@tab

yes

@tab

yes

@tab

NULL

@tab

U

@tab

0

@tab

yes

@item

@geindex PyBUF_RECORDS_RO (C macro)
@anchor{c-api/buffer c PyBUF_RECORDS_RO}@anchor{52d0}
@deffn {C Macro} PyBUF_RECORDS_RO
` Part of the @ref{776,,Stable ABI} since version 3.11.'
@end deffn

@tab

yes

@tab

yes

@tab

NULL

@tab

U

@tab

1 or 0

@tab

yes

@item

@geindex PyBUF_STRIDED (C macro)
@anchor{c-api/buffer c PyBUF_STRIDED}@anchor{52d2}
@deffn {C Macro} PyBUF_STRIDED
` Part of the @ref{776,,Stable ABI} since version 3.11.'
@end deffn

@tab

yes

@tab

yes

@tab

NULL

@tab

U

@tab

0

@tab

NULL

@item

@geindex PyBUF_STRIDED_RO (C macro)
@anchor{c-api/buffer c PyBUF_STRIDED_RO}@anchor{52d3}
@deffn {C Macro} PyBUF_STRIDED_RO
` Part of the @ref{776,,Stable ABI} since version 3.11.'
@end deffn

@tab

yes

@tab

yes

@tab

NULL

@tab

U

@tab

1 or 0

@tab

NULL

@item

@geindex PyBUF_CONTIG (C macro)
@anchor{c-api/buffer c PyBUF_CONTIG}@anchor{52c7}
@deffn {C Macro} PyBUF_CONTIG
` Part of the @ref{776,,Stable ABI} since version 3.11.'
@end deffn

@tab

yes

@tab

NULL

@tab

NULL

@tab

C

@tab

0

@tab

NULL

@item

@geindex PyBUF_CONTIG_RO (C macro)
@anchor{c-api/buffer c PyBUF_CONTIG_RO}@anchor{52c8}
@deffn {C Macro} PyBUF_CONTIG_RO
` Part of the @ref{776,,Stable ABI} since version 3.11.'
@end deffn

@tab

yes

@tab

NULL

@tab

NULL

@tab

C

@tab

1 or 0

@tab

NULL

@end multitable


@node Complex arrays,Buffer-related functions,Buffer request types,Buffer Protocol
@anchor{c-api/buffer complex-arrays}@anchor{5625}
@subsubsection Complex arrays


@menu
* NumPy-style; shape and strides: NumPy-style shape and strides. 
* PIL-style; shape@comma{} strides and suboffsets: PIL-style shape strides and suboffsets. 

@end menu

@node NumPy-style shape and strides,PIL-style shape strides and suboffsets,,Complex arrays
@anchor{c-api/buffer numpy-style-shape-and-strides}@anchor{562e}
@subsubsection NumPy-style: shape and strides


The logical structure of NumPy-style arrays is defined by @ref{5620,,itemsize},
@ref{5623,,ndim}, @ref{5622,,shape} and @ref{561c,,strides}.

If @code{ndim == 0}, the memory location pointed to by @ref{561b,,buf} is
interpreted as a scalar of size @ref{5620,,itemsize}. In that case,
both @ref{5622,,shape} and @ref{561c,,strides} are @code{NULL}.

If @ref{561c,,strides} is @code{NULL}, the array is interpreted as
a standard n-dimensional C-array. Otherwise, the consumer must access an
n-dimensional array as follows:

@example
ptr = (char *)buf + indices[0] * strides[0] + ... + indices[n-1] * strides[n-1];
item = *((typeof(item) *)ptr);
@end example

As noted above, @ref{561b,,buf} can point to any location within
the actual memory block. An exporter can check the validity of a buffer with
this function:

@example
def verify_structure(memlen, itemsize, ndim, shape, strides, offset):
    """Verify that the parameters represent a valid array within
       the bounds of the allocated memory:
           char *mem: start of the physical memory block
           memlen: length of the physical memory block
           offset: (char *)buf - mem
    """
    if offset % itemsize:
        return False
    if offset < 0 or offset+itemsize > memlen:
        return False
    if any(v % itemsize for v in strides):
        return False

    if ndim <= 0:
        return ndim == 0 and not shape and not strides
    if 0 in shape:
        return True

    imin = sum(strides[j]*(shape[j]-1) for j in range(ndim)
               if strides[j] <= 0)
    imax = sum(strides[j]*(shape[j]-1) for j in range(ndim)
               if strides[j] > 0)

    return 0 <= offset+imin and offset+imax+itemsize <= memlen
@end example

@node PIL-style shape strides and suboffsets,,NumPy-style shape and strides,Complex arrays
@anchor{c-api/buffer pil-style-shape-strides-and-suboffsets}@anchor{562f}
@subsubsection PIL-style: shape, strides and suboffsets


In addition to the regular items, PIL-style arrays can contain pointers
that must be followed in order to get to the next element in a dimension.
For example, the regular three-dimensional C-array @code{char v[2][2][3]} can
also be viewed as an array of 2 pointers to 2 two-dimensional arrays:
@code{char (*v[2])[2][3]}. In suboffsets representation, those two pointers
can be embedded at the start of @ref{561b,,buf}, pointing
to two @code{char x[2][3]} arrays that can be located anywhere in memory.

Here is a function that returns a pointer to the element in an N-D array
pointed to by an N-dimensional index when there are both non-@code{NULL} strides
and suboffsets:

@example
void *get_item_pointer(int ndim, void *buf, Py_ssize_t *strides,
                       Py_ssize_t *suboffsets, Py_ssize_t *indices) @{
    char *pointer = (char*)buf;
    int i;
    for (i = 0; i < ndim; i++) @{
        pointer += strides[i] * indices[i];
        if (suboffsets[i] >=0 ) @{
            pointer = *((char**)pointer) + suboffsets[i];
        @}
    @}
    return (void*)pointer;
@}
@end example

@node Buffer-related functions,,Complex arrays,Buffer Protocol
@anchor{c-api/buffer buffer-related-functions}@anchor{5630}
@subsubsection Buffer-related functions


@geindex PyObject_CheckBuffer (C function)
@anchor{c-api/buffer c PyObject_CheckBuffer}@anchor{639}
@deffn {C Function} int PyObject_CheckBuffer (PyObject *obj)
` Part of the @ref{776,,Stable ABI} since version 3.11.'
Return @code{1} if `obj' supports the buffer interface otherwise @code{0}.  When @code{1} is
returned, it doesn’t guarantee that @ref{63a,,PyObject_GetBuffer()} will
succeed.  This function always succeeds.
@end deffn

@geindex PyObject_GetBuffer (C function)
@anchor{c-api/buffer c PyObject_GetBuffer}@anchor{63a}
@deffn {C Function} int PyObject_GetBuffer (PyObject *exporter, Py_buffer *view, int flags)
` Part of the @ref{776,,Stable ABI} since version 3.11.'
Send a request to `exporter' to fill in `view' as specified by  `flags'.
If the exporter cannot provide a buffer of the exact type, it MUST raise
@ref{17e9,,BufferError}, set @code{view->obj} to @code{NULL} and
return @code{-1}.

On success, fill in `view', set @code{view->obj} to a new reference
to `exporter' and return 0. In the case of chained buffer providers
that redirect requests to a single object, @code{view->obj} MAY
refer to this object instead of `exporter' (See @ref{5617,,Buffer Object Structures}).

Successful calls to @ref{63a,,PyObject_GetBuffer()} must be paired with calls
to @ref{63b,,PyBuffer_Release()}, similar to @code{malloc()} and @code{free()}.
Thus, after the consumer is done with the buffer, @code{PyBuffer_Release()}
must be called exactly once.
@end deffn

@geindex PyBuffer_Release (C function)
@anchor{c-api/buffer c PyBuffer_Release}@anchor{63b}
@deffn {C Function} void PyBuffer_Release (Py_buffer *view)
` Part of the @ref{776,,Stable ABI} since version 3.11.'
Release the buffer `view' and release the @ref{5e2,,strong reference}
(i.e. decrement the reference count) to the view’s supporting object,
@code{view->obj}. This function MUST be called when the buffer
is no longer being used, otherwise reference leaks may occur.

It is an error to call this function on a buffer that was not obtained via
@ref{63a,,PyObject_GetBuffer()}.
@end deffn

@geindex PyBuffer_SizeFromFormat (C function)
@anchor{c-api/buffer c PyBuffer_SizeFromFormat}@anchor{963}
@deffn {C Function} @ref{c5b,,Py_ssize_t} PyBuffer_SizeFromFormat (const char *format)
` Part of the @ref{776,,Stable ABI} since version 3.11.'
Return the implied @ref{5620,,itemsize} from @ref{5621,,format}.
On error, raise an exception and return -1.


Added in version 3.9.

@end deffn

@geindex PyBuffer_IsContiguous (C function)
@anchor{c-api/buffer c PyBuffer_IsContiguous}@anchor{967}
@deffn {C Function} int PyBuffer_IsContiguous (const Py_buffer *view, char order)
` Part of the @ref{776,,Stable ABI} since version 3.11.'
Return @code{1} if the memory defined by the `view' is C-style (`order' is
@code{'C'}) or Fortran-style (`order' is @code{'F'}) @ref{26ce,,contiguous} or either one
(`order' is @code{'A'}).  Return @code{0} otherwise.  This function always succeeds.
@end deffn

@geindex PyBuffer_GetPointer (C function)
@anchor{c-api/buffer c PyBuffer_GetPointer}@anchor{962}
@deffn {C Function} void *PyBuffer_GetPointer (const Py_buffer *view, const Py_ssize_t *indices)
` Part of the @ref{776,,Stable ABI} since version 3.11.'
Get the memory area pointed to by the `indices' inside the given `view'.
`indices' must point to an array of @code{view->ndim} indices.
@end deffn

@geindex PyBuffer_FromContiguous (C function)
@anchor{c-api/buffer c PyBuffer_FromContiguous}@anchor{965}
@deffn {C Function} int PyBuffer_FromContiguous (const Py_buffer *view, const void *buf, Py_ssize_t len, char fort)
` Part of the @ref{776,,Stable ABI} since version 3.11.'
Copy contiguous `len' bytes from `buf' to `view'.
`fort' can be @code{'C'} or @code{'F'} (for C-style or Fortran-style ordering).
@code{0} is returned on success, @code{-1} on error.
@end deffn

@geindex PyBuffer_ToContiguous (C function)
@anchor{c-api/buffer c PyBuffer_ToContiguous}@anchor{964}
@deffn {C Function} int PyBuffer_ToContiguous (void *buf, const Py_buffer *src, Py_ssize_t len, char order)
` Part of the @ref{776,,Stable ABI} since version 3.11.'
Copy `len' bytes from `src' to its contiguous representation in `buf'.
`order' can be @code{'C'} or @code{'F'} or @code{'A'} (for C-style or Fortran-style
ordering or either one). @code{0} is returned on success, @code{-1} on error.

This function fails if `len' != `src->len'.
@end deffn

@geindex PyObject_CopyData (C function)
@anchor{c-api/buffer c PyObject_CopyData}@anchor{966}
@deffn {C Function} int PyObject_CopyData (PyObject *dest, PyObject *src)
` Part of the @ref{776,,Stable ABI} since version 3.11.'
Copy data from `src' to `dest' buffer. Can convert between C-style and
or Fortran-style buffers.

@code{0} is returned on success, @code{-1} on error.
@end deffn

@geindex PyBuffer_FillContiguousStrides (C function)
@anchor{c-api/buffer c PyBuffer_FillContiguousStrides}@anchor{968}
@deffn {C Function} void PyBuffer_FillContiguousStrides (int ndims, Py_ssize_t *shape, Py_ssize_t *strides, int itemsize, char order)
` Part of the @ref{776,,Stable ABI} since version 3.11.'
Fill the `strides' array with byte-strides of a @ref{26ce,,contiguous} (C-style if
`order' is @code{'C'} or Fortran-style if `order' is @code{'F'}) array of the
given shape with the given number of bytes per element.
@end deffn

@geindex PyBuffer_FillInfo (C function)
@anchor{c-api/buffer c PyBuffer_FillInfo}@anchor{969}
@deffn {C Function} int PyBuffer_FillInfo (Py_buffer *view, PyObject *exporter, void *buf, Py_ssize_t len, int readonly, int flags)
` Part of the @ref{776,,Stable ABI} since version 3.11.'
Handle buffer requests for an exporter that wants to expose `buf' of size `len'
with writability set according to `readonly'. `buf' is interpreted as a sequence
of unsigned bytes.

The `flags' argument indicates the request type. This function always fills in
`view' as specified by flags, unless `buf' has been designated as read-only
and @ref{15c1,,PyBUF_WRITABLE} is set in `flags'.

On success, set @code{view->obj} to a new reference to `exporter' and
return 0. Otherwise, raise @ref{17e9,,BufferError}, set
@code{view->obj} to @code{NULL} and return @code{-1};

If this function is used as part of a @ref{5617,,getbufferproc},
`exporter' MUST be set to the exporting object and `flags' must be passed
unmodified. Otherwise, `exporter' MUST be @code{NULL}.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Concrete Objects Layer,Interpreter initialization and finalization,Abstract Objects Layer,Python/C API reference manual
@anchor{c-api/concrete doc}@anchor{5631}@anchor{c-api/concrete concrete}@anchor{5632}@anchor{c-api/concrete concrete-objects-layer}@anchor{5633}@anchor{c-api/concrete translation-repo}@anchor{5634}
@section Concrete Objects Layer


The functions in this chapter are specific to certain Python object types.
Passing them an object of the wrong type is not a good idea; if you receive an
object from a Python program and you are not sure that it has the right type,
you must perform a type check first; for example, to check that an object is a
dictionary, use @ref{5635,,PyDict_Check()}.  The chapter is structured like the
“family tree” of Python object types.

@cartouche
@quotation Warning 
While the functions described in this chapter carefully check the type of the
objects which are passed in, many of them do not check for @code{NULL} being passed
instead of a valid object.  Allowing @code{NULL} to be passed in can cause memory
access violations and immediate termination of the interpreter.
@end quotation
@end cartouche

@menu
* Fundamental Objects:: 
* Numeric Objects:: 
* Sequence Objects:: 
* Container Objects:: 
* Function Objects: Function Objects<2>. 
* Other Objects:: 
* C API for extension modules:: 

@end menu

@node Fundamental Objects,Numeric Objects,,Concrete Objects Layer
@anchor{c-api/concrete fundamental}@anchor{5636}@anchor{c-api/concrete fundamental-objects}@anchor{5637}
@subsection Fundamental Objects


This section describes Python type objects and the singleton object @code{None}.

@menu
* Type Objects: Type Objects<2>. 
* The None Object:: 

@end menu

@node Type Objects<2>,The None Object,,Fundamental Objects
@anchor{c-api/type doc}@anchor{5638}@anchor{c-api/type type-objects}@anchor{5639}@anchor{c-api/type typeobjects}@anchor{563a}
@subsubsection Type Objects


@geindex object; type

@geindex PyTypeObject (C type)
@anchor{c-api/type c PyTypeObject}@anchor{ca2}
@deffn {C Type} type PyTypeObject
` Part of the @ref{776,,Limited API} (as an opaque struct).'
The C structure of the objects used to describe built-in types.
@end deffn

@geindex PyType_Type (C var)
@anchor{c-api/type c PyType_Type}@anchor{770}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyType_Type
` Part of the @ref{776,,Stable ABI}.'
This is the type object for type objects; it is the same object as
@ref{f4a,,type} in the Python layer.
@end deffn

@geindex PyType_Check (C function)
@anchor{c-api/type c PyType_Check}@anchor{1dcb}
@deffn {C Function} int PyType_Check (PyObject *o)

Return non-zero if the object `o' is a type object, including instances of
types derived from the standard type object.  Return 0 in all other cases.
This function always succeeds.
@end deffn

@geindex PyType_CheckExact (C function)
@anchor{c-api/type c PyType_CheckExact}@anchor{1dcc}
@deffn {C Function} int PyType_CheckExact (PyObject *o)

Return non-zero if the object `o' is a type object, but not a subtype of
the standard type object.  Return 0 in all other cases.  This function
always succeeds.
@end deffn

@geindex PyType_ClearCache (C function)
@anchor{c-api/type c PyType_ClearCache}@anchor{543a}
@deffn {C Function} unsigned int PyType_ClearCache ()
` Part of the @ref{776,,Stable ABI}.'
Clear the internal lookup cache. Return the current version tag.
@end deffn

@geindex PyType_GetFlags (C function)
@anchor{c-api/type c PyType_GetFlags}@anchor{1d81}
@deffn {C Function} unsigned long PyType_GetFlags (PyTypeObject *type)
` Part of the @ref{776,,Stable ABI}.'
Return the @ref{1cb4,,tp_flags} member of `type'. This function is primarily
meant for use with @code{Py_LIMITED_API}; the individual flag bits are
guaranteed to be stable across Python releases, but access to
@code{tp_flags} itself is not part of the @ref{637,,limited API}.


Added in version 3.2.



Changed in version 3.4: The return type is now @code{unsigned long} rather than @code{long}.

@end deffn

@geindex PyType_GetDict (C function)
@anchor{c-api/type c PyType_GetDict}@anchor{1ad1}
@deffn {C Function} @ref{5df,,PyObject} *PyType_GetDict (PyTypeObject *type)

Return the type object’s internal namespace, which is otherwise only
exposed via a read-only proxy (@ref{e5d,,cls.__dict__}).
This is a
replacement for accessing @ref{1ad2,,tp_dict} directly.
The returned dictionary must be treated as read-only.

This function is meant for specific embedding and language-binding cases,
where direct access to the dict is necessary and indirect access
(e.g. via the proxy or @ref{5ee,,PyObject_GetAttr()}) isn’t adequate.

Extension modules should continue to use @code{tp_dict},
directly or indirectly, when setting up their own types.


Added in version 3.12.

@end deffn

@geindex PyType_Modified (C function)
@anchor{c-api/type c PyType_Modified}@anchor{1bbf}
@deffn {C Function} void PyType_Modified (PyTypeObject *type)
` Part of the @ref{776,,Stable ABI}.'
Invalidate the internal lookup cache for the type and all of its
subtypes.  This function must be called after any manual
modification of the attributes or base classes of the type.
@end deffn

@geindex PyType_AddWatcher (C function)
@anchor{c-api/type c PyType_AddWatcher}@anchor{786}
@deffn {C Function} int PyType_AddWatcher (PyType_WatchCallback callback)

Register `callback' as a type watcher. Return a non-negative integer ID
which must be passed to future calls to @ref{787,,PyType_Watch()}. In case of
error (e.g. no more watcher IDs available), return @code{-1} and set an
exception.

In free-threaded builds, @ref{786,,PyType_AddWatcher()} is not thread-safe,
so it must be called at start up (before spawning the first thread).


Added in version 3.12.

@end deffn

@geindex PyType_ClearWatcher (C function)
@anchor{c-api/type c PyType_ClearWatcher}@anchor{563b}
@deffn {C Function} int PyType_ClearWatcher (int watcher_id)

Clear watcher identified by `watcher_id' (previously returned from
@ref{786,,PyType_AddWatcher()}). Return @code{0} on success, @code{-1} on error (e.g.
if `watcher_id' was never registered.)

An extension should never call @code{PyType_ClearWatcher} with a `watcher_id'
that was not returned to it by a previous call to
@ref{786,,PyType_AddWatcher()}.


Added in version 3.12.

@end deffn

@geindex PyType_Watch (C function)
@anchor{c-api/type c PyType_Watch}@anchor{787}
@deffn {C Function} int PyType_Watch (int watcher_id, PyObject *type)

Mark `type' as watched. The callback granted `watcher_id' by
@ref{786,,PyType_AddWatcher()} will be called whenever
@ref{1bbf,,PyType_Modified()} reports a change to `type'. (The callback may be
called only once for a series of consecutive modifications to `type', if
@code{_PyType_Lookup()} is not called on `type' between the modifications;
this is an implementation detail and subject to change.)

An extension should never call @code{PyType_Watch} with a `watcher_id' that was
not returned to it by a previous call to @ref{786,,PyType_AddWatcher()}.


Added in version 3.12.

@end deffn

@geindex PyType_Unwatch (C function)
@anchor{c-api/type c PyType_Unwatch}@anchor{563c}
@deffn {C Function} int PyType_Unwatch (int watcher_id, PyObject *type)

Mark `type' as not watched. This undoes a previous call to
@ref{787,,PyType_Watch()}. `type' must not be @code{NULL}.

An extension should never call this function with a `watcher_id' that was
not returned to it by a previous call to @ref{786,,PyType_AddWatcher()}.

On success, this function returns @code{0}. On failure, this function returns
@code{-1} with an exception set.


Added in version 3.12.

@end deffn

@geindex PyType_WatchCallback (C type)
@anchor{c-api/type c PyType_WatchCallback}@anchor{563d}
@deffn {C Type} typedef int (*PyType_WatchCallback)(@ref{5df,,PyObject} *type)

Type of a type-watcher callback function.

The callback must not modify `type' or cause @ref{1bbf,,PyType_Modified()} to be
called on `type' or any type in its MRO; violating this rule could cause
infinite recursion.


Added in version 3.12.

@end deffn

@geindex PyType_HasFeature (C function)
@anchor{c-api/type c PyType_HasFeature}@anchor{1d80}
@deffn {C Function} int PyType_HasFeature (PyTypeObject *o, int feature)

Return non-zero if the type object `o' sets the feature `feature'.
Type features are denoted by single bit flags.
@end deffn

@geindex PyType_FastSubclass (C function)
@anchor{c-api/type c PyType_FastSubclass}@anchor{563e}
@deffn {C Function} int PyType_FastSubclass (PyTypeObject *type, int flag)

Return non-zero if the type object `type' sets the subclass flag `flag'.
Subclass flags are denoted by
@ref{563f,,Py_TPFLAGS_*_SUBCLASS}.
This function is used by many @code{_Check} functions for common types.


@subsubheading See also


@ref{1cf6,,PyObject_TypeCheck()}, which is used as a slower alternative in
@code{_Check} functions for types that don’t come with subclass flags.

@end deffn

@geindex PyType_IS_GC (C function)
@anchor{c-api/type c PyType_IS_GC}@anchor{5640}
@deffn {C Function} int PyType_IS_GC (PyTypeObject *o)

Return true if the type object includes support for the cycle detector; this
tests the type flag @ref{986,,Py_TPFLAGS_HAVE_GC}.
@end deffn

@geindex PyType_IsSubtype (C function)
@anchor{c-api/type c PyType_IsSubtype}@anchor{543b}
@deffn {C Function} int PyType_IsSubtype (PyTypeObject *a, PyTypeObject *b)
` Part of the @ref{776,,Stable ABI}.'
Return true if `a' is a subtype of `b'.

This function only checks for actual subtypes, which means that
@ref{240e,,__subclasscheck__()} is not called on `b'.  Call
@ref{10ad,,PyObject_IsSubclass()} to do the same check that @ref{9ca,,issubclass()}
would do.
@end deffn

@geindex PyType_GenericAlloc (C function)
@anchor{c-api/type c PyType_GenericAlloc}@anchor{c67}
@deffn {C Function} @ref{5df,,PyObject} *PyType_GenericAlloc (PyTypeObject *type, Py_ssize_t nitems)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Generic handler for the @ref{5230,,tp_alloc} slot of a type
object.  Uses Python’s default memory allocation mechanism to allocate memory
for a new instance, zeros the memory, then initializes the memory as if by
calling @ref{c66,,PyObject_Init()} or @ref{1d84,,PyObject_InitVar()}.

Do not call this directly to allocate memory for an object; call the type’s
@ref{5230,,tp_alloc} slot instead.

For types that support garbage collection (i.e., the
@ref{986,,Py_TPFLAGS_HAVE_GC} flag is set), this function behaves like
@ref{c9f,,PyObject_GC_New} or @ref{ca0,,PyObject_GC_NewVar} (except the
memory is guaranteed to be zeroed before initialization), and should be
paired with @ref{170f,,PyObject_GC_Del()} in @ref{522f,,tp_free}.
Otherwise, it behaves like @ref{b82,,PyObject_New} or
@ref{b83,,PyObject_NewVar} (except the memory is guaranteed to be zeroed
before initialization) and should be paired with @ref{e65,,PyObject_Free()} in
@code{tp_free}.
@end deffn

@geindex PyType_GenericNew (C function)
@anchor{c-api/type c PyType_GenericNew}@anchor{522c}
@deffn {C Function} @ref{5df,,PyObject} *PyType_GenericNew (PyTypeObject *type, PyObject *args, PyObject *kwds)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Generic handler for the @ref{7a0,,tp_new} slot of a type
object.  Creates a new instance using the type’s
@ref{5230,,tp_alloc} slot and returns the resulting object.
@end deffn

@geindex PyType_Ready (C function)
@anchor{c-api/type c PyType_Ready}@anchor{985}
@deffn {C Function} int PyType_Ready (PyTypeObject *type)
` Part of the @ref{776,,Stable ABI}.'
Finalize a type object.  This should be called on all type objects to finish
their initialization.  This function is responsible for adding inherited slots
from a type’s base class.  Return @code{0} on success, or return @code{-1} and sets an
exception on error.

@cartouche
@quotation Note 
If some of the base classes implements the GC protocol and the provided
type does not include the @ref{986,,Py_TPFLAGS_HAVE_GC} in its flags, then
the GC protocol will be automatically implemented from its parents. On
the contrary, if the type being created does include
@code{Py_TPFLAGS_HAVE_GC} in its flags then it `must' implement the
GC protocol itself by at least implementing the
@ref{987,,tp_traverse} handle.
@end quotation
@end cartouche
@end deffn

@geindex PyType_GetName (C function)
@anchor{c-api/type c PyType_GetName}@anchor{95d}
@deffn {C Function} @ref{5df,,PyObject} *PyType_GetName (PyTypeObject *type)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI} since version 3.11.'
Return the type’s name. Equivalent to getting the type’s
@ref{16b7,,__name__} attribute.


Added in version 3.11.

@end deffn

@geindex PyType_GetQualName (C function)
@anchor{c-api/type c PyType_GetQualName}@anchor{95e}
@deffn {C Function} @ref{5df,,PyObject} *PyType_GetQualName (PyTypeObject *type)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI} since version 3.11.'
Return the type’s qualified name. Equivalent to getting the
type’s @ref{23b7,,__qualname__} attribute.


Added in version 3.11.

@end deffn

@geindex PyType_GetFullyQualifiedName (C function)
@anchor{c-api/type c PyType_GetFullyQualifiedName}@anchor{616}
@deffn {C Function} @ref{5df,,PyObject} *PyType_GetFullyQualifiedName (PyTypeObject *type)
` Part of the @ref{776,,Stable ABI} since version 3.13.'
Return the type’s fully qualified name. Equivalent to
@code{f"@{type.__module__@}.@{type.__qualname__@}"}, or @ref{23b7,,type.__qualname__}
if @ref{617,,type.__module__} is not a string or is equal to @code{"builtins"}.


Added in version 3.13.

@end deffn

@geindex PyType_GetModuleName (C function)
@anchor{c-api/type c PyType_GetModuleName}@anchor{618}
@deffn {C Function} @ref{5df,,PyObject} *PyType_GetModuleName (PyTypeObject *type)
` Part of the @ref{776,,Stable ABI} since version 3.13.'
Return the type’s module name. Equivalent to getting the
@ref{617,,type.__module__} attribute.


Added in version 3.13.

@end deffn

@geindex PyType_GetSlot (C function)
@anchor{c-api/type c PyType_GetSlot}@anchor{aa2}
@deffn {C Function} void *PyType_GetSlot (PyTypeObject *type, int slot)
` Part of the @ref{776,,Stable ABI} since version 3.4.'
Return the function pointer stored in the given slot. If the
result is @code{NULL}, this indicates that either the slot is @code{NULL},
or that the function was called with invalid parameters.
Callers will typically cast the result pointer into the appropriate
function type.

See @ref{5641,,PyType_Slot.slot} for possible values of the `slot' argument.


Added in version 3.4.



Changed in version 3.10: @ref{aa2,,PyType_GetSlot()} can now accept all types.
Previously, it was limited to @ref{b64,,heap types}.

@end deffn

@geindex PyType_GetModule (C function)
@anchor{c-api/type c PyType_GetModule}@anchor{b6c}
@deffn {C Function} @ref{5df,,PyObject} *PyType_GetModule (PyTypeObject *type)
`Return value: Borrowed reference.'` Part of the @ref{776,,Stable ABI} since version 3.10.'
Return the module object associated with the given type when the type was
created using @ref{774,,PyType_FromModuleAndSpec()}.

The returned reference is @ref{3d5,,borrowed} from `type',
and will be valid as long as you hold a reference to `type'.
Do not release it with @ref{791,,Py_DECREF()} or similar.

If no module is associated with the given type, sets @ref{199,,TypeError}
and returns @code{NULL}.

This function is usually used to get the module in which a method is defined.
Note that in such a method, @code{PyType_GetModule(Py_TYPE(self))}
may not return the intended result.
@code{Py_TYPE(self)} may be a `subclass' of the intended class, and subclasses
are not necessarily defined in the same module as their superclass.
See @ref{96d,,PyCMethod} to get the class that defines the method.
See @ref{635,,PyType_GetModuleByDef()} for cases when @code{PyCMethod} cannot
be used.


Added in version 3.9.

@end deffn

@geindex PyType_GetModuleState (C function)
@anchor{c-api/type c PyType_GetModuleState}@anchor{b6d}
@deffn {C Function} void *PyType_GetModuleState (PyTypeObject *type)
` Part of the @ref{776,,Stable ABI} since version 3.10.'
Return the state of the module object associated with the given type.
This is a shortcut for calling @ref{b7d,,PyModule_GetState()} on the result
of @ref{b6c,,PyType_GetModule()}.

If no module is associated with the given type, sets @ref{199,,TypeError}
and returns @code{NULL}.

If the `type' has an associated module but its state is @code{NULL},
returns @code{NULL} without setting an exception.


Added in version 3.9.

@end deffn

@geindex PyType_GetModuleByDef (C function)
@anchor{c-api/type c PyType_GetModuleByDef}@anchor{635}
@deffn {C Function} @ref{5df,,PyObject} *PyType_GetModuleByDef (PyTypeObject *type, struct PyModuleDef *def)
`Return value: Borrowed reference.'` Part of the @ref{776,,Stable ABI} since version 3.13.'
Find the first superclass whose module was created from
the given @ref{b7a,,PyModuleDef} `def', and return that module.

If no module is found, raises a @ref{199,,TypeError} and returns @code{NULL}.

This function is intended to be used together with
@ref{b7d,,PyModule_GetState()} to get module state from slot methods (such as
@ref{7a2,,tp_init} or @ref{5642,,nb_add})
and other places where a method’s defining class cannot be passed using the
@ref{96d,,PyCMethod} calling convention.

The returned reference is @ref{3d5,,borrowed} from `type',
and will be valid as long as you hold a reference to `type'.
Do not release it with @ref{791,,Py_DECREF()} or similar.


Added in version 3.11.

@end deffn

@geindex PyType_GetBaseByToken (C function)
@anchor{c-api/type c PyType_GetBaseByToken}@anchor{3ae}
@deffn {C Function} int PyType_GetBaseByToken (PyTypeObject *type, void *token, PyTypeObject **result)
` Part of the @ref{776,,Stable ABI} since version 3.14.'
Find the first superclass in `type'’s @ref{2627,,method resolution order} whose
@ref{3af,,Py_tp_token} token is equal to the given one.


@itemize *

@item 
If found, set `*result' to a new @ref{5e2,,strong reference}
to it and return @code{1}.

@item 
If not found, set `*result' to @code{NULL} and return @code{0}.

@item 
On error, set `*result' to @code{NULL} and return @code{-1} with an
exception set.
@end itemize

The `result' argument may be @code{NULL}, in which case `*result' is not set.
Use this if you need only the return value.

The `token' argument may not be @code{NULL}.


Added in version 3.14.

@end deffn

@geindex PyUnstable_Type_AssignVersionTag (C function)
@anchor{c-api/type c PyUnstable_Type_AssignVersionTag}@anchor{5643}
@deffn {C Function} int PyUnstable_Type_AssignVersionTag (PyTypeObject *type)

@cartouche
@quotation This is Unstable API. It may change without warning in minor releases. `This is @ref{76a,,Unstable API}. It may change without warning in minor releases.'
@end quotation
@end cartouche

Attempt to assign a version tag to the given type.

Returns 1 if the type already had a valid version tag or a new one was
assigned, or 0 if a new tag could not be assigned.


Added in version 3.12.

@end deffn

@geindex PyType_SUPPORTS_WEAKREFS (C function)
@anchor{c-api/type c PyType_SUPPORTS_WEAKREFS}@anchor{5644}
@deffn {C Function} int PyType_SUPPORTS_WEAKREFS (PyTypeObject *type)

Return true if instances of `type' support creating weak references, false
otherwise. This function always succeeds. `type' must not be @code{NULL}.


@subsubheading See also



@itemize *

@item 
@ref{55ef,,Weak Reference Objects}

@item 
@ref{11b,,weakref}
@end itemize

@end deffn

@menu
* Creating Heap-Allocated Types:: 

@end menu

@node Creating Heap-Allocated Types,,,Type Objects<2>
@anchor{c-api/type creating-heap-allocated-types}@anchor{5645}
@subsubsection Creating Heap-Allocated Types


The following functions and structs are used to create
@ref{b64,,heap types}.

@geindex PyType_FromMetaclass (C function)
@anchor{c-api/type c PyType_FromMetaclass}@anchor{773}
@deffn {C Function} @ref{5df,,PyObject} *PyType_FromMetaclass (PyTypeObject *metaclass, PyObject *module, PyType_Spec *spec, PyObject *bases)
` Part of the @ref{776,,Stable ABI} since version 3.12.'
Create and return a @ref{b64,,heap type} from the `spec'
(see @ref{ab2,,Py_TPFLAGS_HEAPTYPE}).

The metaclass `metaclass' is used to construct the resulting type object.
When `metaclass' is @code{NULL}, the metaclass is derived from `bases'
(or `Py_tp_base[s]' slots if `bases' is @code{NULL}, see below).

Metaclasses that override @ref{7a0,,tp_new} are not
supported, except if @code{tp_new} is @code{NULL}.

The `bases' argument can be used to specify base classes; it can either
be only one class or a tuple of classes.
If `bases' is @code{NULL}, the @ref{54e3,,Py_tp_bases} slot is used instead.
If that also is @code{NULL}, the @ref{54e2,,Py_tp_base} slot is used instead.
If that also is @code{NULL}, the new type derives from @ref{c84,,object}.

The `module' argument can be used to record the module in which the new
class is defined. It must be a module object or @code{NULL}.
If not @code{NULL}, the module is associated with the new type and can later be
retrieved with @ref{b6c,,PyType_GetModule()}.
The associated module is not inherited by subclasses; it must be specified
for each class individually.

This function calls @ref{985,,PyType_Ready()} on the new type.

Note that this function does `not' fully match the behavior of
calling @ref{f4a,,type()} or using the @ref{14e3,,class} statement.
With user-provided base types or metaclasses, prefer
@ref{55f4,,calling} @code{type} (or the metaclass)
over @code{PyType_From*} functions.
Specifically:


@itemize *

@item 
@ref{7a1,,__new__()} is not called on the new class
(and it must be set to @code{type.__new__}).

@item 
@ref{8c1,,__init__()} is not called on the new class.

@item 
@ref{844,,__init_subclass__()} is not called on any bases.

@item 
@ref{e4e,,__set_name__()} is not called on new descriptors.
@end itemize


Added in version 3.12.

@end deffn

@geindex PyType_FromModuleAndSpec (C function)
@anchor{c-api/type c PyType_FromModuleAndSpec}@anchor{774}
@deffn {C Function} @ref{5df,,PyObject} *PyType_FromModuleAndSpec (PyObject *module, PyType_Spec *spec, PyObject *bases)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI} since version 3.10.'
Equivalent to @code{PyType_FromMetaclass(NULL, module, spec, bases)}.


Added in version 3.9.



Changed in version 3.10: The function now accepts a single class as the `bases' argument and
@code{NULL} as the @code{tp_doc} slot.



Changed in version 3.12: The function now finds and uses a metaclass corresponding to the provided
base classes.  Previously, only @ref{f4a,,type} instances were returned.

The @ref{7a0,,tp_new} of the metaclass is `ignored'.
which may result in incomplete initialization.
Creating classes whose metaclass overrides
@code{tp_new} is deprecated.



Changed in version 3.14: Creating classes whose metaclass overrides
@ref{7a0,,tp_new} is no longer allowed.

@end deffn

@geindex PyType_FromSpecWithBases (C function)
@anchor{c-api/type c PyType_FromSpecWithBases}@anchor{79f}
@deffn {C Function} @ref{5df,,PyObject} *PyType_FromSpecWithBases (PyType_Spec *spec, PyObject *bases)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI} since version 3.3.'
Equivalent to @code{PyType_FromMetaclass(NULL, NULL, spec, bases)}.


Added in version 3.3.



Changed in version 3.12: The function now finds and uses a metaclass corresponding to the provided
base classes.  Previously, only @ref{f4a,,type} instances were returned.

The @ref{7a0,,tp_new} of the metaclass is `ignored'.
which may result in incomplete initialization.
Creating classes whose metaclass overrides
@code{tp_new} is deprecated.



Changed in version 3.14: Creating classes whose metaclass overrides
@ref{7a0,,tp_new} is no longer allowed.

@end deffn

@geindex PyType_FromSpec (C function)
@anchor{c-api/type c PyType_FromSpec}@anchor{79e}
@deffn {C Function} @ref{5df,,PyObject} *PyType_FromSpec (PyType_Spec *spec)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Equivalent to @code{PyType_FromMetaclass(NULL, NULL, spec, NULL)}.


Changed in version 3.12: The function now finds and uses a metaclass corresponding to the
base classes provided in `Py_tp_base[s]' slots.
Previously, only @ref{f4a,,type} instances were returned.

The @ref{7a0,,tp_new} of the metaclass is `ignored'.
which may result in incomplete initialization.
Creating classes whose metaclass overrides
@code{tp_new} is deprecated.



Changed in version 3.14: Creating classes whose metaclass overrides
@ref{7a0,,tp_new} is no longer allowed.

@end deffn

@geindex PyType_Freeze (C function)
@anchor{c-api/type c PyType_Freeze}@anchor{3ad}
@deffn {C Function} int PyType_Freeze (PyTypeObject *type)
` Part of the @ref{776,,Stable ABI} since version 3.14.'
Make a type immutable: set the @ref{3cd,,Py_TPFLAGS_IMMUTABLETYPE} flag.

All base classes of `type' must be immutable.

On success, return @code{0}.
On error, set an exception and return @code{-1}.

The type must not be used before it’s made immutable. For example, type
instances must not be created before the type is made immutable.


Added in version 3.14.

@end deffn

@geindex PyType_Spec (C type)
@anchor{c-api/type c PyType_Spec}@anchor{1acf}
@deffn {C Type} type PyType_Spec
` Part of the @ref{776,,Stable ABI} (including all members).'
Structure defining a type’s behavior.

@geindex PyType_Spec.name (C member)
@anchor{c-api/type c PyType_Spec name}@anchor{5646}
@deffn {C Member} const char *name

Name of the type, used to set @ref{1cf1,,PyTypeObject.tp_name}.
@end deffn

@geindex PyType_Spec.basicsize (C member)
@anchor{c-api/type c PyType_Spec basicsize}@anchor{76b}
@deffn {C Member} int basicsize

If positive, specifies the size of the instance in bytes.
It is used to set @ref{b84,,PyTypeObject.tp_basicsize}.

If zero, specifies that @ref{b84,,tp_basicsize}
should be inherited.

If negative, the absolute value specifies how much space instances of the
class need `in addition' to the superclass.
Use @ref{76c,,PyObject_GetTypeData()} to get a pointer to subclass-specific
memory reserved this way.
For negative @code{basicsize}, Python will insert padding when
needed to meet @ref{b84,,tp_basicsize}’s alignment
requirements.


Changed in version 3.12: Previously, this field could not be negative.

@end deffn

@geindex PyType_Spec.itemsize (C member)
@anchor{c-api/type c PyType_Spec itemsize}@anchor{5647}
@deffn {C Member} int itemsize

Size of one element of a variable-size type, in bytes.
Used to set @ref{2402,,PyTypeObject.tp_itemsize}.
See @code{tp_itemsize} documentation for caveats.

If zero, @ref{2402,,tp_itemsize} is inherited.
Extending arbitrary variable-sized classes is dangerous,
since some types use a fixed offset for variable-sized memory,
which can then overlap fixed-sized memory used by a subclass.
To help prevent mistakes, inheriting @code{itemsize} is only possible
in the following situations:


@itemize -

@item 
The base is not variable-sized (its
@ref{2402,,tp_itemsize}).

@item 
The requested @ref{76b,,PyType_Spec.basicsize} is positive,
suggesting that the memory layout of the base class is known.

@item 
The requested @ref{76b,,PyType_Spec.basicsize} is zero,
suggesting that the subclass does not access the instance’s memory
directly.

@item 
With the @ref{76e,,Py_TPFLAGS_ITEMS_AT_END} flag.
@end itemize
@end deffn

@geindex PyType_Spec.flags (C member)
@anchor{c-api/type c PyType_Spec flags}@anchor{5648}
@deffn {C Member} unsigned int flags

Type flags, used to set @ref{1cb4,,PyTypeObject.tp_flags}.

If the @code{Py_TPFLAGS_HEAPTYPE} flag is not set,
@ref{79f,,PyType_FromSpecWithBases()} sets it automatically.
@end deffn

@geindex PyType_Spec.slots (C member)
@anchor{c-api/type c PyType_Spec slots}@anchor{5649}
@deffn {C Member} @ref{543c,,PyType_Slot} *slots

Array of @ref{543c,,PyType_Slot} structures.
Terminated by the special slot value @code{@{0, NULL@}}.

Each slot ID should be specified at most once.
@end deffn
@end deffn

@geindex PyType_Slot (C type)
@anchor{c-api/type c PyType_Slot}@anchor{543c}
@deffn {C Type} type PyType_Slot
` Part of the @ref{776,,Stable ABI} (including all members).'
Structure defining optional functionality of a type, containing a slot ID
and a value pointer.

@geindex PyType_Slot.slot (C member)
@anchor{c-api/type c PyType_Slot slot}@anchor{5641}
@deffn {C Member} int slot

A slot ID.

Slot IDs are named like the field names of the structures
@ref{ca2,,PyTypeObject}, @ref{162a,,PyNumberMethods},
@ref{5254,,PySequenceMethods}, @ref{5255,,PyMappingMethods} and
@ref{564a,,PyAsyncMethods} with an added @code{Py_} prefix.
For example, use:


@itemize *

@item 
@ref{54e6,,Py_tp_dealloc} to set @ref{521c,,PyTypeObject.tp_dealloc}

@item 
@ref{54b7,,Py_nb_add} to set @ref{5642,,PyNumberMethods.nb_add}

@item 
@ref{54df,,Py_sq_length} to set @ref{564b,,PySequenceMethods.sq_length}
@end itemize

An additional slot is supported that does not correspond to a
@code{PyTypeObject} struct field:


@itemize *

@item 
@ref{3af,,Py_tp_token}
@end itemize

The following “offset” fields cannot be set using @ref{543c,,PyType_Slot}:


@itemize *

@item 
@ref{b85,,tp_weaklistoffset}
(use @ref{77d,,Py_TPFLAGS_MANAGED_WEAKREF} instead if possible)

@item 
@ref{564c,,tp_dictoffset}
(use @ref{60f,,Py_TPFLAGS_MANAGED_DICT} instead if possible)

@item 
@ref{55f6,,tp_vectorcall_offset}
(use @code{"__vectorcalloffset__"} in
@ref{564d,,PyMemberDef})
@end itemize

If it is not possible to switch to a @code{MANAGED} flag (for example,
for vectorcall or to support Python older than 3.12), specify the
offset in @ref{54f5,,Py_tp_members}.
See @ref{564d,,PyMemberDef documentation}
for details.

The following internal fields cannot be set at all when creating a heap
type:


@itemize *

@item 
@ref{1ad2,,tp_dict},
@ref{564e,,tp_mro},
@ref{564f,,tp_cache},
@ref{793,,tp_subclasses}, and
@ref{5650,,tp_weaklist}.
@end itemize

Setting @ref{54e3,,Py_tp_bases} or @ref{54e2,,Py_tp_base} may be
problematic on some platforms.
To avoid issues, use the `bases' argument of
@ref{79f,,PyType_FromSpecWithBases()} instead.


Changed in version 3.9: Slots in @ref{5651,,PyBufferProcs} may be set in the unlimited API.



Changed in version 3.11: @ref{96b,,bf_getbuffer} and
@ref{96c,,bf_releasebuffer} are now available
under the @ref{637,,limited API}.



Changed in version 3.14: The field @ref{19ce,,tp_vectorcall} can now be set
using @ref{54fe,,Py_tp_vectorcall}.  See the field’s documentation
for details.

@end deffn

@geindex PyType_Slot.pfunc (C member)
@anchor{c-api/type c PyType_Slot pfunc}@anchor{5652}
@deffn {C Member} void *pfunc

The desired value of the slot. In most cases, this is a pointer
to a function.

`pfunc' values may not be @code{NULL}, except for the following slots:


@itemize *

@item 
@ref{54ea,,Py_tp_doc}

@item 
@ref{3af,,Py_tp_token} (for clarity, prefer @ref{5499,,Py_TP_USE_SPEC}
rather than @code{NULL})
@end itemize
@end deffn
@end deffn

@geindex Py_tp_token (C macro)
@anchor{c-api/type c Py_tp_token}@anchor{3af}
@deffn {C Macro} Py_tp_token
` Part of the @ref{776,,Stable ABI} since version 3.14.'
A @ref{5641,,slot} that records a static memory layout ID
for a class.

If the @ref{1acf,,PyType_Spec} of the class is statically
allocated, the token can be set to the spec using the special value
@ref{5499,,Py_TP_USE_SPEC}:

@example
static PyType_Slot foo_slots[] = @{
   @{Py_tp_token, Py_TP_USE_SPEC@},
@end example

It can also be set to an arbitrary pointer, but you must ensure that:


@itemize *

@item 
The pointer outlives the class, so it’s not reused for something else
while the class exists.

@item 
It “belongs” to the extension module where the class lives, so it will not
clash with other extensions.
@end itemize

Use @ref{3ae,,PyType_GetBaseByToken()} to check if a class’s superclass has
a given token – that is, check whether the memory layout is compatible.

To get the token for a given class (without considering superclasses),
use @ref{aa2,,PyType_GetSlot()} with @code{Py_tp_token}.


Added in version 3.14.


@geindex Py_TP_USE_SPEC (C macro)
@anchor{c-api/type c Py_TP_USE_SPEC}@anchor{5499}
@deffn {C Macro} Py_TP_USE_SPEC
` Part of the @ref{776,,Stable ABI} since version 3.14.'
Used as a value with @ref{3af,,Py_tp_token} to set the token to the
class’s @ref{1acf,,PyType_Spec}.
Expands to @code{NULL}.


Added in version 3.14.

@end deffn
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node The None Object,,Type Objects<2>,Fundamental Objects
@anchor{c-api/none doc}@anchor{5653}@anchor{c-api/none noneobject}@anchor{5654}@anchor{c-api/none the-none-object}@anchor{5655}@anchor{c-api/none translation-repo}@anchor{5656}
@subsubsection The @code{None} Object


@geindex object; None

Note that the @ref{ca2,,PyTypeObject} for @code{None} is not directly exposed in the
Python/C API.  Since @code{None} is a singleton, testing for object identity (using
@code{==} in C) is sufficient. There is no @code{PyNone_Check()} function for the
same reason.

@geindex Py_None (C var)
@anchor{c-api/none c Py_None}@anchor{51ff}
@deffn {C Variable} @ref{5df,,PyObject} *Py_None

The Python @code{None} object, denoting lack of value.  This object has no methods
and is @ref{292,,immortal}.


Changed in version 3.12: @ref{51ff,,Py_None} is @ref{292,,immortal}.

@end deffn

@geindex Py_RETURN_NONE (C macro)
@anchor{c-api/none c Py_RETURN_NONE}@anchor{167f}
@deffn {C Macro} Py_RETURN_NONE

Return @ref{51ff,,Py_None} from a function.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Numeric Objects,Sequence Objects,Fundamental Objects,Concrete Objects Layer
@anchor{c-api/concrete numeric-objects}@anchor{5657}@anchor{c-api/concrete numericobjects}@anchor{5658}
@subsection Numeric Objects


@geindex object; numeric

@menu
* Integer Objects:: 
* Boolean Objects:: 
* Floating-Point Objects:: 
* Complex Number Objects:: 

@end menu

@node Integer Objects,Boolean Objects,,Numeric Objects
@anchor{c-api/long doc}@anchor{5659}@anchor{c-api/long integer-objects}@anchor{565a}@anchor{c-api/long longobjects}@anchor{565b}
@subsubsection Integer Objects


@geindex object; long integer
@geindex object; integer

All integers are implemented as “long” integer objects of arbitrary size.

On error, most @code{PyLong_As*} APIs return @code{(return type)-1} which cannot be
distinguished from a number.  Use @ref{1cf0,,PyErr_Occurred()} to disambiguate.

@geindex PyLongObject (C type)
@anchor{c-api/long c PyLongObject}@anchor{39c}
@deffn {C Type} type PyLongObject
` Part of the @ref{776,,Limited API} (as an opaque struct).'
This subtype of @ref{5df,,PyObject} represents a Python integer object.
@end deffn

@geindex PyLong_Type (C var)
@anchor{c-api/long c PyLong_Type}@anchor{53af}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyLong_Type
` Part of the @ref{776,,Stable ABI}.'
This instance of @ref{ca2,,PyTypeObject} represents the Python integer type.
This is the same object as @ref{19c,,int} in the Python layer.
@end deffn

@geindex PyLong_Check (C function)
@anchor{c-api/long c PyLong_Check}@anchor{565c}
@deffn {C Function} int PyLong_Check (PyObject *p)

Return true if its argument is a @ref{39c,,PyLongObject} or a subtype of
@code{PyLongObject}.  This function always succeeds.
@end deffn

@geindex PyLong_CheckExact (C function)
@anchor{c-api/long c PyLong_CheckExact}@anchor{565d}
@deffn {C Function} int PyLong_CheckExact (PyObject *p)

Return true if its argument is a @ref{39c,,PyLongObject}, but not a subtype of
@code{PyLongObject}.  This function always succeeds.
@end deffn

@geindex PyLong_FromLong (C function)
@anchor{c-api/long c PyLong_FromLong}@anchor{1c13}
@deffn {C Function} @ref{5df,,PyObject} *PyLong_FromLong (long v)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Return a new @ref{39c,,PyLongObject} object from `v', or @code{NULL} on failure.

`CPython implementation detail:' CPython keeps an array of integer objects for all integers
between @code{-5} and @code{256}.  When you create an int in that range
you actually just get back a reference to the existing object.
@end deffn

@geindex PyLong_FromUnsignedLong (C function)
@anchor{c-api/long c PyLong_FromUnsignedLong}@anchor{1903}
@deffn {C Function} @ref{5df,,PyObject} *PyLong_FromUnsignedLong (unsigned long v)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Return a new @ref{39c,,PyLongObject} object from a C unsigned long, or
@code{NULL} on failure.
@end deffn

@geindex PyLong_FromSsize_t (C function)
@anchor{c-api/long c PyLong_FromSsize_t}@anchor{18e5}
@deffn {C Function} @ref{5df,,PyObject} *PyLong_FromSsize_t (Py_ssize_t v)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Return a new @ref{39c,,PyLongObject} object from a C @ref{c5b,,Py_ssize_t}, or
@code{NULL} on failure.
@end deffn

@geindex PyLong_FromSize_t (C function)
@anchor{c-api/long c PyLong_FromSize_t}@anchor{1905}
@deffn {C Function} @ref{5df,,PyObject} *PyLong_FromSize_t (size_t v)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Return a new @ref{39c,,PyLongObject} object from a C @code{size_t}, or
@code{NULL} on failure.
@end deffn

@geindex PyLong_FromLongLong (C function)
@anchor{c-api/long c PyLong_FromLongLong}@anchor{1c14}
@deffn {C Function} @ref{5df,,PyObject} *PyLong_FromLongLong (long long v)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Return a new @ref{39c,,PyLongObject} object from a C long long, or @code{NULL}
on failure.
@end deffn

@geindex PyLong_FromUnsignedLongLong (C function)
@anchor{c-api/long c PyLong_FromUnsignedLongLong}@anchor{1904}
@deffn {C Function} @ref{5df,,PyObject} *PyLong_FromUnsignedLongLong (unsigned long long v)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Return a new @ref{39c,,PyLongObject} object from a C unsigned long long,
or @code{NULL} on failure.
@end deffn

@geindex PyLong_FromInt32 (C function)
@geindex PyLong_FromInt64 (C function)
@anchor{c-api/long c PyLong_FromInt32}@anchor{3a1}
@deffn {C Function} @ref{5df,,PyObject} *PyLong_FromInt32 (int32_t value)
@anchor{c-api/long c PyLong_FromInt64}@anchor{3a2}
@deffnx {C Function} @ref{5df,,PyObject} *PyLong_FromInt64 (int64_t value)
` Part of the @ref{776,,Stable ABI} since version 3.14.'
Return a new @ref{39c,,PyLongObject} object from a signed C
int32_t or int64_t, or @code{NULL}
with an exception set on failure.


Added in version 3.14.

@end deffn

@geindex PyLong_FromUInt32 (C function)
@geindex PyLong_FromUInt64 (C function)
@anchor{c-api/long c PyLong_FromUInt32}@anchor{3a3}
@deffn {C Function} @ref{5df,,PyObject} *PyLong_FromUInt32 (uint32_t value)
@anchor{c-api/long c PyLong_FromUInt64}@anchor{3a4}
@deffnx {C Function} @ref{5df,,PyObject} *PyLong_FromUInt64 (uint64_t value)
` Part of the @ref{776,,Stable ABI} since version 3.14.'
Return a new @ref{39c,,PyLongObject} object from an unsigned C
uint32_t or uint64_t, or @code{NULL}
with an exception set on failure.


Added in version 3.14.

@end deffn

@geindex PyLong_FromDouble (C function)
@anchor{c-api/long c PyLong_FromDouble}@anchor{b42}
@deffn {C Function} @ref{5df,,PyObject} *PyLong_FromDouble (double v)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Return a new @ref{39c,,PyLongObject} object from the integer part of `v', or
@code{NULL} on failure.
@end deffn

@geindex PyLong_FromString (C function)
@anchor{c-api/long c PyLong_FromString}@anchor{53ac}
@deffn {C Function} @ref{5df,,PyObject} *PyLong_FromString (const char *str, char **pend, int base)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Return a new @ref{39c,,PyLongObject} based on the string value in `str', which
is interpreted according to the radix in `base', or @code{NULL} on failure.  If
`pend' is non-@code{NULL}, `*pend' will point to the end of `str' on success or
to the first character that could not be processed on error.  If `base' is @code{0},
`str' is interpreted using the @ref{234f,,Integer literals} definition; in this case, leading
zeros in a non-zero decimal number raises a @ref{2ee,,ValueError}.  If `base' is not
@code{0}, it must be between @code{2} and @code{36}, inclusive.  Leading and trailing
whitespace and single underscores after a base specifier and between digits are
ignored.  If there are no digits or `str' is not NULL-terminated following the
digits and trailing whitespace, @code{ValueError} will be raised.


@subsubheading See also


@ref{606,,PyLong_AsNativeBytes()} and
@ref{607,,PyLong_FromNativeBytes()} functions can be used to convert
a @ref{39c,,PyLongObject} to/from an array of bytes in base @code{256}.

@end deffn

@geindex PyLong_FromUnicodeObject (C function)
@anchor{c-api/long c PyLong_FromUnicodeObject}@anchor{abd}
@deffn {C Function} @ref{5df,,PyObject} *PyLong_FromUnicodeObject (PyObject *u, int base)
`Return value: New reference.'
Convert a sequence of Unicode digits in the string `u' to a Python integer
value.


Added in version 3.3.

@end deffn

@geindex PyLong_FromVoidPtr (C function)
@anchor{c-api/long c PyLong_FromVoidPtr}@anchor{53ad}
@deffn {C Function} @ref{5df,,PyObject} *PyLong_FromVoidPtr (void *p)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Create a Python integer from the pointer `p'. The pointer value can be
retrieved from the resulting value using @ref{53ab,,PyLong_AsVoidPtr()}.
@end deffn

@geindex PyLong_FromNativeBytes (C function)
@anchor{c-api/long c PyLong_FromNativeBytes}@anchor{607}
@deffn {C Function} @ref{5df,,PyObject} *PyLong_FromNativeBytes (const void *buffer, size_t n_bytes, int flags)
` Part of the @ref{776,,Stable ABI} since version 3.14.'
Create a Python integer from the value contained in the first `n_bytes' of
`buffer', interpreted as a two’s-complement signed number.

`flags' are as for @ref{606,,PyLong_AsNativeBytes()}. Passing @code{-1} will select
the native endian that CPython was compiled with and assume that the
most-significant bit is a sign bit. Passing
@code{Py_ASNATIVEBYTES_UNSIGNED_BUFFER} will produce the same result as calling
@ref{608,,PyLong_FromUnsignedNativeBytes()}. Other flags are ignored.


Added in version 3.13.

@end deffn

@geindex PyLong_FromUnsignedNativeBytes (C function)
@anchor{c-api/long c PyLong_FromUnsignedNativeBytes}@anchor{608}
@deffn {C Function} @ref{5df,,PyObject} *PyLong_FromUnsignedNativeBytes (const void *buffer, size_t n_bytes, int flags)
` Part of the @ref{776,,Stable ABI} since version 3.14.'
Create a Python integer from the value contained in the first `n_bytes' of
`buffer', interpreted as an unsigned number.

`flags' are as for @ref{606,,PyLong_AsNativeBytes()}. Passing @code{-1} will select
the native endian that CPython was compiled with and assume that the
most-significant bit is not a sign bit. Flags other than endian are ignored.


Added in version 3.13.

@end deffn

@geindex PyLong_FromPid (C macro)
@anchor{c-api/long c PyLong_FromPid}@anchor{565e}
@deffn {C Macro} PyLong_FromPid (pid)

Macro for creating a Python integer from a process identifier.

This can be defined as an alias to @ref{1c13,,PyLong_FromLong()} or
@ref{1c14,,PyLong_FromLongLong()}, depending on the size of the system’s
PID type.


Added in version 3.2.

@end deffn

@geindex PyLong_AsLong (C function)
@anchor{c-api/long c PyLong_AsLong}@anchor{605}
@deffn {C Function} long PyLong_AsLong (PyObject *obj)
` Part of the @ref{776,,Stable ABI}.'
@geindex LONG_MAX (C macro)
@geindex OverflowError (built-in exception)

Return a C long representation of `obj'.  If `obj' is not an
instance of @ref{39c,,PyLongObject}, first call its @ref{19f,,__index__()} method
(if present) to convert it to a @code{PyLongObject}.

Raise @ref{a87,,OverflowError} if the value of `obj' is out of range for a
long.

Returns @code{-1} on error.  Use @ref{1cf0,,PyErr_Occurred()} to disambiguate.


Changed in version 3.8: Use @ref{19f,,__index__()} if available.



Changed in version 3.10: This function will no longer use @ref{19e,,__int__()}.


@geindex PyLong_AS_LONG (C function)
@anchor{c-api/long c PyLong_AS_LONG}@anchor{565f}
@deffn {C Function} long PyLong_AS_LONG (PyObject *obj)

Exactly equivalent to the preferred @code{PyLong_AsLong}. In particular,
it can fail with @ref{a87,,OverflowError} or another exception.


@ref{23f,,Soft deprecated} since version 3.14.

@end deffn
@end deffn

@geindex PyLong_AsInt (C function)
@anchor{c-api/long c PyLong_AsInt}@anchor{604}
@deffn {C Function} int PyLong_AsInt (PyObject *obj)
` Part of the @ref{776,,Stable ABI} since version 3.13.'
Similar to @ref{605,,PyLong_AsLong()}, but store the result in a C
int instead of a C long.


Added in version 3.13.

@end deffn

@geindex PyLong_AsLongAndOverflow (C function)
@anchor{c-api/long c PyLong_AsLongAndOverflow}@anchor{1472}
@deffn {C Function} long PyLong_AsLongAndOverflow (PyObject *obj, int *overflow)
` Part of the @ref{776,,Stable ABI}.'
Return a C long representation of `obj'.  If `obj' is not an
instance of @ref{39c,,PyLongObject}, first call its @ref{19f,,__index__()}
method (if present) to convert it to a @code{PyLongObject}.

If the value of `obj' is greater than @code{LONG_MAX} or less than
@code{LONG_MIN}, set `*overflow' to @code{1} or @code{-1}, respectively, and
return @code{-1}; otherwise, set `*overflow' to @code{0}.  If any other exception
occurs set `*overflow' to @code{0} and return @code{-1} as usual.

Returns @code{-1} on error.  Use @ref{1cf0,,PyErr_Occurred()} to disambiguate.


Changed in version 3.8: Use @ref{19f,,__index__()} if available.



Changed in version 3.10: This function will no longer use @ref{19e,,__int__()}.

@end deffn

@geindex PyLong_AsLongLong (C function)
@anchor{c-api/long c PyLong_AsLongLong}@anchor{53a6}
@deffn {C Function} long long PyLong_AsLongLong (PyObject *obj)
` Part of the @ref{776,,Stable ABI}.'
@geindex OverflowError (built-in exception)

Return a C long long representation of `obj'.  If `obj' is not an
instance of @ref{39c,,PyLongObject}, first call its @ref{19f,,__index__()} method
(if present) to convert it to a @code{PyLongObject}.

Raise @ref{a87,,OverflowError} if the value of `obj' is out of range for a
long long.

Returns @code{-1} on error.  Use @ref{1cf0,,PyErr_Occurred()} to disambiguate.


Changed in version 3.8: Use @ref{19f,,__index__()} if available.



Changed in version 3.10: This function will no longer use @ref{19e,,__int__()}.

@end deffn

@geindex PyLong_AsLongLongAndOverflow (C function)
@anchor{c-api/long c PyLong_AsLongLongAndOverflow}@anchor{1471}
@deffn {C Function} long long PyLong_AsLongLongAndOverflow (PyObject *obj, int *overflow)
` Part of the @ref{776,,Stable ABI}.'
Return a C long long representation of `obj'.  If `obj' is not an
instance of @ref{39c,,PyLongObject}, first call its @ref{19f,,__index__()} method
(if present) to convert it to a @code{PyLongObject}.

If the value of `obj' is greater than @code{LLONG_MAX} or less than
@code{LLONG_MIN}, set `*overflow' to @code{1} or @code{-1}, respectively,
and return @code{-1}; otherwise, set `*overflow' to @code{0}.  If any other
exception occurs set `*overflow' to @code{0} and return @code{-1} as usual.

Returns @code{-1} on error.  Use @ref{1cf0,,PyErr_Occurred()} to disambiguate.


Added in version 3.2.



Changed in version 3.8: Use @ref{19f,,__index__()} if available.



Changed in version 3.10: This function will no longer use @ref{19e,,__int__()}.

@end deffn

@geindex PyLong_AsSsize_t (C function)
@anchor{c-api/long c PyLong_AsSsize_t}@anchor{53a8}
@deffn {C Function} @ref{c5b,,Py_ssize_t} PyLong_AsSsize_t (PyObject *pylong)
` Part of the @ref{776,,Stable ABI}.'
@geindex PY_SSIZE_T_MAX (C macro)
@geindex OverflowError (built-in exception)

Return a C @ref{c5b,,Py_ssize_t} representation of `pylong'.  `pylong' must
be an instance of @ref{39c,,PyLongObject}.

Raise @ref{a87,,OverflowError} if the value of `pylong' is out of range for a
@ref{c5b,,Py_ssize_t}.

Returns @code{-1} on error.  Use @ref{1cf0,,PyErr_Occurred()} to disambiguate.
@end deffn

@geindex PyLong_AsUnsignedLong (C function)
@anchor{c-api/long c PyLong_AsUnsignedLong}@anchor{53a9}
@deffn {C Function} unsigned long PyLong_AsUnsignedLong (PyObject *pylong)
` Part of the @ref{776,,Stable ABI}.'
@geindex ULONG_MAX (C macro)
@geindex OverflowError (built-in exception)

Return a C unsigned long representation of `pylong'.  `pylong'
must be an instance of @ref{39c,,PyLongObject}.

Raise @ref{a87,,OverflowError} if the value of `pylong' is out of range for a
unsigned long.

Returns @code{(unsigned long)-1} on error.
Use @ref{1cf0,,PyErr_Occurred()} to disambiguate.
@end deffn

@geindex PyLong_AsSize_t (C function)
@anchor{c-api/long c PyLong_AsSize_t}@anchor{53a7}
@deffn {C Function} size_t PyLong_AsSize_t (PyObject *pylong)
` Part of the @ref{776,,Stable ABI}.'
@geindex SIZE_MAX (C macro)
@geindex OverflowError (built-in exception)

Return a C @code{size_t} representation of `pylong'.  `pylong' must be
an instance of @ref{39c,,PyLongObject}.

Raise @ref{a87,,OverflowError} if the value of `pylong' is out of range for a
@code{size_t}.

Returns @code{(size_t)-1} on error.
Use @ref{1cf0,,PyErr_Occurred()} to disambiguate.
@end deffn

@geindex PyLong_AsUnsignedLongLong (C function)
@anchor{c-api/long c PyLong_AsUnsignedLongLong}@anchor{14a0}
@deffn {C Function} unsigned long long PyLong_AsUnsignedLongLong (PyObject *pylong)
` Part of the @ref{776,,Stable ABI}.'
@geindex OverflowError (built-in exception)

Return a C unsigned long long representation of `pylong'.  `pylong'
must be an instance of @ref{39c,,PyLongObject}.

Raise @ref{a87,,OverflowError} if the value of `pylong' is out of range for an
unsigned long long.

Returns @code{(unsigned long long)-1} on error.
Use @ref{1cf0,,PyErr_Occurred()} to disambiguate.


Changed in version 3.1: A negative `pylong' now raises @ref{a87,,OverflowError}, not @ref{199,,TypeError}.

@end deffn

@geindex PyLong_AsUnsignedLongMask (C function)
@anchor{c-api/long c PyLong_AsUnsignedLongMask}@anchor{53aa}
@deffn {C Function} unsigned long PyLong_AsUnsignedLongMask (PyObject *obj)
` Part of the @ref{776,,Stable ABI}.'
Return a C unsigned long representation of `obj'.  If `obj' is not
an instance of @ref{39c,,PyLongObject}, first call its @ref{19f,,__index__()}
method (if present) to convert it to a @code{PyLongObject}.

If the value of `obj' is out of range for an unsigned long,
return the reduction of that value modulo @code{ULONG_MAX + 1}.

Returns @code{(unsigned long)-1} on error.  Use @ref{1cf0,,PyErr_Occurred()} to
disambiguate.


Changed in version 3.8: Use @ref{19f,,__index__()} if available.



Changed in version 3.10: This function will no longer use @ref{19e,,__int__()}.

@end deffn

@geindex PyLong_AsUnsignedLongLongMask (C function)
@anchor{c-api/long c PyLong_AsUnsignedLongLongMask}@anchor{1e0c}
@deffn {C Function} unsigned long long PyLong_AsUnsignedLongLongMask (PyObject *obj)
` Part of the @ref{776,,Stable ABI}.'
Return a C unsigned long long representation of `obj'.  If `obj'
is not an instance of @ref{39c,,PyLongObject}, first call its
@ref{19f,,__index__()} method (if present) to convert it to a
@code{PyLongObject}.

If the value of `obj' is out of range for an unsigned long long,
return the reduction of that value modulo @code{ULLONG_MAX + 1}.

Returns @code{(unsigned long long)-1} on error.  Use @ref{1cf0,,PyErr_Occurred()}
to disambiguate.


Changed in version 3.8: Use @ref{19f,,__index__()} if available.



Changed in version 3.10: This function will no longer use @ref{19e,,__int__()}.

@end deffn

@geindex PyLong_AsInt32 (C function)
@geindex PyLong_AsInt64 (C function)
@anchor{c-api/long c PyLong_AsInt32}@anchor{39d}
@deffn {C Function} int PyLong_AsInt32 (PyObject *obj, int32_t *value)
@anchor{c-api/long c PyLong_AsInt64}@anchor{39e}
@deffnx {C Function} int PyLong_AsInt64 (PyObject *obj, int64_t *value)
` Part of the @ref{776,,Stable ABI} since version 3.14.'
Set `*value' to a signed C int32_t or int64_t
representation of `obj'.

If `obj' is not an instance of @ref{39c,,PyLongObject}, first call its
@ref{19f,,__index__()} method (if present) to convert it to a
@code{PyLongObject}.

If the `obj' value is out of range, raise an @ref{a87,,OverflowError}.

Set `*value' and return @code{0} on success.
Set an exception and return @code{-1} on error.

`value' must not be @code{NULL}.


Added in version 3.14.

@end deffn

@geindex PyLong_AsUInt32 (C function)
@geindex PyLong_AsUInt64 (C function)
@anchor{c-api/long c PyLong_AsUInt32}@anchor{39f}
@deffn {C Function} int PyLong_AsUInt32 (PyObject *obj, uint32_t *value)
@anchor{c-api/long c PyLong_AsUInt64}@anchor{3a0}
@deffnx {C Function} int PyLong_AsUInt64 (PyObject *obj, uint64_t *value)
` Part of the @ref{776,,Stable ABI} since version 3.14.'
Set `*value' to an unsigned C uint32_t or uint64_t
representation of `obj'.

If `obj' is not an instance of @ref{39c,,PyLongObject}, first call its
@ref{19f,,__index__()} method (if present) to convert it to a
@code{PyLongObject}.


@itemize *

@item 
If `obj' is negative, raise a @ref{2ee,,ValueError}.

@item 
If the `obj' value is out of range, raise an @ref{a87,,OverflowError}.
@end itemize

Set `*value' and return @code{0} on success.
Set an exception and return @code{-1} on error.

`value' must not be @code{NULL}.


Added in version 3.14.

@end deffn

@geindex PyLong_AsDouble (C function)
@anchor{c-api/long c PyLong_AsDouble}@anchor{19b9}
@deffn {C Function} double PyLong_AsDouble (PyObject *pylong)
` Part of the @ref{776,,Stable ABI}.'
Return a C double representation of `pylong'.  `pylong' must be
an instance of @ref{39c,,PyLongObject}.

Raise @ref{a87,,OverflowError} if the value of `pylong' is out of range for a
double.

Returns @code{-1.0} on error.  Use @ref{1cf0,,PyErr_Occurred()} to disambiguate.
@end deffn

@geindex PyLong_AsVoidPtr (C function)
@anchor{c-api/long c PyLong_AsVoidPtr}@anchor{53ab}
@deffn {C Function} void *PyLong_AsVoidPtr (PyObject *pylong)
` Part of the @ref{776,,Stable ABI}.'
Convert a Python integer `pylong' to a C void pointer.
If `pylong' cannot be converted, an @ref{a87,,OverflowError} will be raised.  This
is only assured to produce a usable void pointer for values created
with @ref{53ad,,PyLong_FromVoidPtr()}.

Returns @code{NULL} on error.  Use @ref{1cf0,,PyErr_Occurred()} to disambiguate.
@end deffn

@geindex PyLong_AsNativeBytes (C function)
@anchor{c-api/long c PyLong_AsNativeBytes}@anchor{606}
@deffn {C Function} @ref{c5b,,Py_ssize_t} PyLong_AsNativeBytes (PyObject *pylong, void *buffer, Py_ssize_t n_bytes, int flags)
` Part of the @ref{776,,Stable ABI} since version 3.14.'
Copy the Python integer value `pylong' to a native `buffer' of size
`n_bytes'. The `flags' can be set to @code{-1} to behave similarly to a C cast,
or to values documented below to control the behavior.

Returns @code{-1} with an exception raised on error.  This may happen if
`pylong' cannot be interpreted as an integer, or if `pylong' was negative
and the @code{Py_ASNATIVEBYTES_REJECT_NEGATIVE} flag was set.

Otherwise, returns the number of bytes required to store the value.
If this is equal to or less than `n_bytes', the entire value was copied.
All `n_bytes' of the buffer are written: remaining bytes filled by
copies of the sign bit.

If the returned value is greater than `n_bytes', the value was
truncated: as many of the lowest bits of the value as could fit are written,
and the higher bits are ignored. This matches the typical behavior
of a C-style downcast.

@cartouche
@quotation Note 
Overflow is not considered an error. If the returned value
is larger than `n_bytes', most significant bits were discarded.
@end quotation
@end cartouche

@code{0} will never be returned.

Values are always copied as two’s-complement.

Usage example:

@example
int32_t value;
Py_ssize_t bytes = PyLong_AsNativeBytes(pylong, &value, sizeof(value), -1);
if (bytes < 0) @{
    // Failed. A Python exception was set with the reason.
    return NULL;
@}
else if (bytes <= (Py_ssize_t)sizeof(value)) @{
    // Success!
@}
else @{
    // Overflow occurred, but 'value' contains the truncated
    // lowest bits of pylong.
@}
@end example

Passing zero to `n_bytes' will return the size of a buffer that would
be large enough to hold the value. This may be larger than technically
necessary, but not unreasonably so. If `n_bytes=0', `buffer' may be
@code{NULL}.

@cartouche
@quotation Note 
Passing `n_bytes=0' to this function is not an accurate way to determine
the bit length of the value.
@end quotation
@end cartouche

To get at the entire Python value of an unknown size, the function can be
called twice: first to determine the buffer size, then to fill it:

@example
// Ask how much space we need.
Py_ssize_t expected = PyLong_AsNativeBytes(pylong, NULL, 0, -1);
if (expected < 0) @{
    // Failed. A Python exception was set with the reason.
    return NULL;
@}
assert(expected != 0);  // Impossible per the API definition.
uint8_t *bignum = malloc(expected);
if (!bignum) @{
    PyErr_SetString(PyExc_MemoryError, "bignum malloc failed.");
    return NULL;
@}
// Safely get the entire value.
Py_ssize_t bytes = PyLong_AsNativeBytes(pylong, bignum, expected, -1);
if (bytes < 0) @{  // Exception has been set.
    free(bignum);
    return NULL;
@}
else if (bytes > expected) @{  // This should not be possible.
    PyErr_SetString(PyExc_RuntimeError,
        "Unexpected bignum truncation after a size check.");
    free(bignum);
    return NULL;
@}
// The expected success given the above pre-check.
// ... use bignum ...
free(bignum);
@end example

`flags' is either @code{-1} (@code{Py_ASNATIVEBYTES_DEFAULTS}) to select defaults
that behave most like a C cast, or a combination of the other flags in
the table below.
Note that @code{-1} cannot be combined with other flags.

Currently, @code{-1} corresponds to
@code{Py_ASNATIVEBYTES_NATIVE_ENDIAN | Py_ASNATIVEBYTES_UNSIGNED_BUFFER}.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxx} 
@headitem

Flag

@tab

Value

@item

@geindex Py_ASNATIVEBYTES_DEFAULTS (C macro)
@anchor{c-api/long c Py_ASNATIVEBYTES_DEFAULTS}@anchor{5483}
@deffn {C Macro} Py_ASNATIVEBYTES_DEFAULTS
` Part of the @ref{776,,Stable ABI} since version 3.14.'
@end deffn

@tab

@code{-1}

@item

@geindex Py_ASNATIVEBYTES_BIG_ENDIAN (C macro)
@anchor{c-api/long c Py_ASNATIVEBYTES_BIG_ENDIAN}@anchor{5482}
@deffn {C Macro} Py_ASNATIVEBYTES_BIG_ENDIAN
` Part of the @ref{776,,Stable ABI} since version 3.14.'
@end deffn

@tab

@code{0}

@item

@geindex Py_ASNATIVEBYTES_LITTLE_ENDIAN (C macro)
@anchor{c-api/long c Py_ASNATIVEBYTES_LITTLE_ENDIAN}@anchor{5484}
@deffn {C Macro} Py_ASNATIVEBYTES_LITTLE_ENDIAN
` Part of the @ref{776,,Stable ABI} since version 3.14.'
@end deffn

@tab

@code{1}

@item

@geindex Py_ASNATIVEBYTES_NATIVE_ENDIAN (C macro)
@anchor{c-api/long c Py_ASNATIVEBYTES_NATIVE_ENDIAN}@anchor{5485}
@deffn {C Macro} Py_ASNATIVEBYTES_NATIVE_ENDIAN
` Part of the @ref{776,,Stable ABI} since version 3.14.'
@end deffn

@tab

@code{3}

@item

@geindex Py_ASNATIVEBYTES_UNSIGNED_BUFFER (C macro)
@anchor{c-api/long c Py_ASNATIVEBYTES_UNSIGNED_BUFFER}@anchor{5487}
@deffn {C Macro} Py_ASNATIVEBYTES_UNSIGNED_BUFFER
` Part of the @ref{776,,Stable ABI} since version 3.14.'
@end deffn

@tab

@code{4}

@item

@geindex Py_ASNATIVEBYTES_REJECT_NEGATIVE (C macro)
@anchor{c-api/long c Py_ASNATIVEBYTES_REJECT_NEGATIVE}@anchor{5486}
@deffn {C Macro} Py_ASNATIVEBYTES_REJECT_NEGATIVE
` Part of the @ref{776,,Stable ABI} since version 3.14.'
@end deffn

@tab

@code{8}

@item

@geindex Py_ASNATIVEBYTES_ALLOW_INDEX (C macro)
@anchor{c-api/long c Py_ASNATIVEBYTES_ALLOW_INDEX}@anchor{5481}
@deffn {C Macro} Py_ASNATIVEBYTES_ALLOW_INDEX
` Part of the @ref{776,,Stable ABI} since version 3.14.'
@end deffn

@tab

@code{16}

@end multitable


Specifying @code{Py_ASNATIVEBYTES_NATIVE_ENDIAN} will override any other endian
flags. Passing @code{2} is reserved.

By default, sufficient buffer will be requested to include a sign bit.
For example, when converting 128 with `n_bytes=1', the function will return
2 (or more) in order to store a zero sign bit.

If @code{Py_ASNATIVEBYTES_UNSIGNED_BUFFER} is specified, a zero sign bit
will be omitted from size calculations. This allows, for example, 128 to fit
in a single-byte buffer. If the destination buffer is later treated as
signed, a positive input value may become negative.
Note that the flag does not affect handling of negative values: for those,
space for a sign bit is always requested.

Specifying @code{Py_ASNATIVEBYTES_REJECT_NEGATIVE} causes an exception to be set
if `pylong' is negative. Without this flag, negative values will be copied
provided there is enough space for at least one sign bit, regardless of
whether @code{Py_ASNATIVEBYTES_UNSIGNED_BUFFER} was specified.

If @code{Py_ASNATIVEBYTES_ALLOW_INDEX} is specified and a non-integer value is
passed, its @ref{19f,,__index__()} method will be called first. This may
result in Python code executing and other threads being allowed to run, which
could cause changes to other objects or values in use. When `flags' is
@code{-1}, this option is not set, and non-integer values will raise
@ref{199,,TypeError}.

@cartouche
@quotation Note 
With the default `flags' (@code{-1}, or `UNSIGNED_BUFFER'  without
`REJECT_NEGATIVE'), multiple Python integers can map to a single value
without overflow. For example, both @code{255} and @code{-1} fit a single-byte
buffer and set all its bits.
This matches typical C cast behavior.
@end quotation
@end cartouche


Added in version 3.13.

@end deffn

@geindex PyLong_AsPid (C macro)
@anchor{c-api/long c PyLong_AsPid}@anchor{1a13}
@deffn {C Macro} PyLong_AsPid (pid)

Macro for converting a Python integer into a process identifier.

This can be defined as an alias to @ref{605,,PyLong_AsLong()},
@ref{1c14,,PyLong_FromLongLong()}, or @ref{604,,PyLong_AsInt()}, depending on the
size of the system’s PID type.


Added in version 3.2.

@end deffn

@geindex PyLong_GetSign (C function)
@anchor{c-api/long c PyLong_GetSign}@anchor{398}
@deffn {C Function} int PyLong_GetSign (PyObject *obj, int *sign)

Get the sign of the integer object `obj'.

On success, set `*sign' to the integer sign  (0, -1 or +1 for zero, negative or
positive integer, respectively) and return 0.

On failure, return -1 with an exception set.  This function always succeeds
if `obj' is a @ref{39c,,PyLongObject} or its subtype.


Added in version 3.14.

@end deffn

@geindex PyLong_IsPositive (C function)
@anchor{c-api/long c PyLong_IsPositive}@anchor{399}
@deffn {C Function} int PyLong_IsPositive (PyObject *obj)

Check if the integer object `obj' is positive (@code{obj > 0}).

If `obj' is an instance of @ref{39c,,PyLongObject} or its subtype,
return @code{1} when it’s positive and @code{0} otherwise.  Else set an
exception and return @code{-1}.


Added in version 3.14.

@end deffn

@geindex PyLong_IsNegative (C function)
@anchor{c-api/long c PyLong_IsNegative}@anchor{39a}
@deffn {C Function} int PyLong_IsNegative (PyObject *obj)

Check if the integer object `obj' is negative (@code{obj < 0}).

If `obj' is an instance of @ref{39c,,PyLongObject} or its subtype,
return @code{1} when it’s negative and @code{0} otherwise.  Else set an
exception and return @code{-1}.


Added in version 3.14.

@end deffn

@geindex PyLong_IsZero (C function)
@anchor{c-api/long c PyLong_IsZero}@anchor{39b}
@deffn {C Function} int PyLong_IsZero (PyObject *obj)

Check if the integer object `obj' is zero.

If `obj' is an instance of @ref{39c,,PyLongObject} or its subtype,
return @code{1} when it’s zero and @code{0} otherwise.  Else set an
exception and return @code{-1}.


Added in version 3.14.

@end deffn

@geindex PyLong_GetInfo (C function)
@anchor{c-api/long c PyLong_GetInfo}@anchor{53ae}
@deffn {C Function} @ref{5df,,PyObject} *PyLong_GetInfo (void)
` Part of the @ref{776,,Stable ABI}.'
On success, return a read only @ref{85f,,named tuple}, that holds
information about Python’s internal representation of integers.
See @ref{149f,,sys.int_info} for description of individual fields.

On failure, return @code{NULL} with an exception set.


Added in version 3.1.

@end deffn

@geindex PyUnstable_Long_IsCompact (C function)
@anchor{c-api/long c PyUnstable_Long_IsCompact}@anchor{7a7}
@deffn {C Function} int PyUnstable_Long_IsCompact (const PyLongObject *op)

@cartouche
@quotation This is Unstable API. It may change without warning in minor releases. `This is @ref{76a,,Unstable API}. It may change without warning in minor releases.'
@end quotation
@end cartouche

Return 1 if `op' is compact, 0 otherwise.

This function makes it possible for performance-critical code to implement
a “fast path” for small integers. For compact values use
@ref{7a8,,PyUnstable_Long_CompactValue()}; for others fall back to a
@ref{53a7,,PyLong_As*} function or
@ref{606,,PyLong_AsNativeBytes()}.

The speedup is expected to be negligible for most users.

Exactly what values are considered compact is an implementation detail
and is subject to change.


Added in version 3.12.

@end deffn

@geindex PyUnstable_Long_CompactValue (C function)
@anchor{c-api/long c PyUnstable_Long_CompactValue}@anchor{7a8}
@deffn {C Function} @ref{c5b,,Py_ssize_t} PyUnstable_Long_CompactValue (const PyLongObject *op)

@cartouche
@quotation This is Unstable API. It may change without warning in minor releases. `This is @ref{76a,,Unstable API}. It may change without warning in minor releases.'
@end quotation
@end cartouche

If `op' is compact, as determined by @ref{7a7,,PyUnstable_Long_IsCompact()},
return its value.

Otherwise, the return value is undefined.


Added in version 3.12.

@end deffn

@menu
* Export API:: 
* PyLongWriter API:: 
* Deprecated API:: 

@end menu

@node Export API,PyLongWriter API,,Integer Objects
@anchor{c-api/long export-api}@anchor{5660}
@subsubsection Export API



Added in version 3.14.


@geindex PyLongLayout (C struct)
@anchor{c-api/long c PyLongLayout}@anchor{5661}
@deffn {C Struct} struct PyLongLayout

Layout of an array of “digits” (“limbs” in the GMP terminology), used to
represent absolute value for arbitrary precision integers.

Use @ref{3a5,,PyLong_GetNativeLayout()} to get the native layout of Python
@ref{19c,,int} objects, used internally for integers with “big enough”
absolute value.

See also @ref{149f,,sys.int_info} which exposes similar information in Python.

@geindex PyLongLayout.bits_per_digit (C member)
@anchor{c-api/long c PyLongLayout bits_per_digit}@anchor{5662}
@deffn {C Member} uint8_t bits_per_digit

Bits per digit. For example, a 15 bit digit means that bits 0-14 contain
meaningful information.
@end deffn

@geindex PyLongLayout.digit_size (C member)
@anchor{c-api/long c PyLongLayout digit_size}@anchor{5663}
@deffn {C Member} uint8_t digit_size

Digit size in bytes. For example, a 15 bit digit will require at least 2
bytes.
@end deffn

@geindex PyLongLayout.digits_order (C member)
@anchor{c-api/long c PyLongLayout digits_order}@anchor{5664}
@deffn {C Member} int8_t digits_order

Digits order:


@itemize -

@item 
@code{1} for most significant digit first

@item 
@code{-1} for least significant digit first
@end itemize
@end deffn

@geindex PyLongLayout.digit_endianness (C member)
@anchor{c-api/long c PyLongLayout digit_endianness}@anchor{5665}
@deffn {C Member} int8_t digit_endianness

Digit endianness:


@itemize -

@item 
@code{1} for most significant byte first (big endian)

@item 
@code{-1} for least significant byte first (little endian)
@end itemize
@end deffn
@end deffn

@geindex PyLong_GetNativeLayout (C function)
@anchor{c-api/long c PyLong_GetNativeLayout}@anchor{3a5}
@deffn {C Function} const @ref{5661,,PyLongLayout} *PyLong_GetNativeLayout (void)

Get the native layout of Python @ref{19c,,int} objects.

See the @ref{5661,,PyLongLayout} structure.

The function must not be called before Python initialization nor after
Python finalization. The returned layout is valid until Python is
finalized. The layout is the same for all Python sub-interpreters
in a process, and so it can be cached.
@end deffn

@geindex PyLongExport (C struct)
@anchor{c-api/long c PyLongExport}@anchor{5666}
@deffn {C Struct} struct PyLongExport

Export of a Python @ref{19c,,int} object.

There are two cases:


@itemize *

@item 
If @ref{5667,,digits} is @code{NULL}, only use the @ref{5668,,value} member.

@item 
If @ref{5667,,digits} is not @code{NULL}, use @ref{5669,,negative},
@ref{566a,,ndigits} and @code{digits} members.
@end itemize

@geindex PyLongExport.value (C member)
@anchor{c-api/long c PyLongExport value}@anchor{5668}
@deffn {C Member} int64_t value

The native integer value of the exported @ref{19c,,int} object.
Only valid if @ref{5667,,digits} is @code{NULL}.
@end deffn

@geindex PyLongExport.negative (C member)
@anchor{c-api/long c PyLongExport negative}@anchor{5669}
@deffn {C Member} uint8_t negative

@code{1} if the number is negative, @code{0} otherwise.
Only valid if @ref{5667,,digits} is not @code{NULL}.
@end deffn

@geindex PyLongExport.ndigits (C member)
@anchor{c-api/long c PyLongExport ndigits}@anchor{566a}
@deffn {C Member} @ref{c5b,,Py_ssize_t} ndigits

Number of digits in @ref{5667,,digits} array.
Only valid if @code{digits} is not @code{NULL}.
@end deffn

@geindex PyLongExport.digits (C member)
@anchor{c-api/long c PyLongExport digits}@anchor{5667}
@deffn {C Member} const void *digits

Read-only array of unsigned digits. Can be @code{NULL}.
@end deffn
@end deffn

@geindex PyLong_Export (C function)
@anchor{c-api/long c PyLong_Export}@anchor{3a6}
@deffn {C Function} int PyLong_Export (PyObject *obj, PyLongExport *export_long)

Export a Python @ref{19c,,int} object.

`export_long' must point to a @ref{5666,,PyLongExport} structure allocated
by the caller. It must not be @code{NULL}.

On success, fill in `*export_long' and return @code{0}.
On error, set an exception and return @code{-1}.

@ref{3a7,,PyLong_FreeExport()} must be called when the export is no longer
needed.

@quotation

`CPython implementation detail:' This function always succeeds if `obj' is a Python @ref{19c,,int} object
or a subclass.
@end quotation
@end deffn

@geindex PyLong_FreeExport (C function)
@anchor{c-api/long c PyLong_FreeExport}@anchor{3a7}
@deffn {C Function} void PyLong_FreeExport (PyLongExport *export_long)

Release the export `export_long' created by @ref{3a6,,PyLong_Export()}.

`CPython implementation detail:' Calling @ref{3a7,,PyLong_FreeExport()} is optional if `export_long->digits'
is @code{NULL}.
@end deffn

@node PyLongWriter API,Deprecated API,Export API,Integer Objects
@anchor{c-api/long pylongwriter-api}@anchor{566b}
@subsubsection PyLongWriter API


The @ref{566c,,PyLongWriter} API can be used to import an integer.


Added in version 3.14.


@geindex PyLongWriter (C struct)
@anchor{c-api/long c PyLongWriter}@anchor{566c}
@deffn {C Struct} struct PyLongWriter

A Python @ref{19c,,int} writer instance.

The instance must be destroyed by @ref{3a9,,PyLongWriter_Finish()} or
@ref{3aa,,PyLongWriter_Discard()}.
@end deffn

@geindex PyLongWriter_Create (C function)
@anchor{c-api/long c PyLongWriter_Create}@anchor{3a8}
@deffn {C Function} @ref{566c,,PyLongWriter} *PyLongWriter_Create (int negative, Py_ssize_t ndigits, void **digits)

Create a @ref{566c,,PyLongWriter}.

On success, allocate `*digits' and return a writer.
On error, set an exception and return @code{NULL}.

`negative' is @code{1} if the number is negative, or @code{0} otherwise.

`ndigits' is the number of digits in the `digits' array. It must be
greater than 0.

`digits' must not be NULL.

After a successful call to this function, the caller should fill in the
array of digits `digits' and then call @ref{3a9,,PyLongWriter_Finish()} to get
a Python @ref{19c,,int}.
The layout of `digits' is described by @ref{3a5,,PyLong_GetNativeLayout()}.

Digits must be in the range [@code{0}; @code{(1 << bits_per_digit) - 1}]
(where the @ref{5662,,bits_per_digit} is the number of bits
per digit).
Any unused most significant digits must be set to @code{0}.

Alternately, call @ref{3aa,,PyLongWriter_Discard()} to destroy the writer
instance without creating an @ref{19c,,int} object.
@end deffn

@geindex PyLongWriter_Finish (C function)
@anchor{c-api/long c PyLongWriter_Finish}@anchor{3a9}
@deffn {C Function} @ref{5df,,PyObject} *PyLongWriter_Finish (PyLongWriter *writer)
`Return value: New reference.'
Finish a @ref{566c,,PyLongWriter} created by @ref{3a8,,PyLongWriter_Create()}.

On success, return a Python @ref{19c,,int} object.
On error, set an exception and return @code{NULL}.

The function takes care of normalizing the digits and converts the object
to a compact integer if needed.

The writer instance and the `digits' array are invalid after the call.
@end deffn

@geindex PyLongWriter_Discard (C function)
@anchor{c-api/long c PyLongWriter_Discard}@anchor{3aa}
@deffn {C Function} void PyLongWriter_Discard (PyLongWriter *writer)

Discard a @ref{566c,,PyLongWriter} created by @ref{3a8,,PyLongWriter_Create()}.

If `writer' is @code{NULL}, no operation is performed.

The writer instance and the `digits' array are invalid after the call.
@end deffn

@node Deprecated API,,PyLongWriter API,Integer Objects
@anchor{c-api/long deprecated-api}@anchor{566d}
@subsubsection Deprecated API


These macros are @ref{23f,,soft deprecated}. They describe parameters
of the internal representation of @ref{39c,,PyLongObject} instances.

Use @ref{3a5,,PyLong_GetNativeLayout()} instead, along with @ref{3a6,,PyLong_Export()}
to read integer data or @ref{566c,,PyLongWriter} to write it.
These currently use the same layout, but are designed to continue working correctly
even if CPython’s internal integer representation changes.

@geindex PyLong_SHIFT (C macro)
@anchor{c-api/long c PyLong_SHIFT}@anchor{566e}
@deffn {C Macro} PyLong_SHIFT

This is equivalent to @ref{5662,,bits_per_digit} in
the output of @ref{3a5,,PyLong_GetNativeLayout()}.
@end deffn

@geindex PyLong_BASE (C macro)
@anchor{c-api/long c PyLong_BASE}@anchor{1c43}
@deffn {C Macro} PyLong_BASE

This is currently equivalent to 1 << @ref{566e,,PyLong_SHIFT}.
@end deffn

@geindex PyLong_MASK (C macro)
@anchor{c-api/long c PyLong_MASK}@anchor{566f}
@deffn {C Macro} PyLong_MASK

This is currently equivalent to (1 << @ref{566e,,PyLong_SHIFT}) - 1
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Boolean Objects,Floating-Point Objects,Integer Objects,Numeric Objects
@anchor{c-api/bool doc}@anchor{5670}@anchor{c-api/bool boolean-objects}@anchor{5671}@anchor{c-api/bool boolobjects}@anchor{5672}@anchor{c-api/bool translation-repo}@anchor{5673}
@subsubsection Boolean Objects


Booleans in Python are implemented as a subclass of integers.  There are only
two booleans, @ref{5674,,Py_False} and @ref{5675,,Py_True}.  As such, the normal
creation and deletion functions don’t apply to booleans.  The following macros
are available, however.

@geindex PyBool_Type (C var)
@anchor{c-api/bool c PyBool_Type}@anchor{52d7}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyBool_Type
` Part of the @ref{776,,Stable ABI}.'
This instance of @ref{ca2,,PyTypeObject} represents the Python boolean type; it
is the same object as @ref{3c1,,bool} in the Python layer.
@end deffn

@geindex PyBool_Check (C function)
@anchor{c-api/bool c PyBool_Check}@anchor{5676}
@deffn {C Function} int PyBool_Check (PyObject *o)

Return true if `o' is of type @ref{52d7,,PyBool_Type}.  This function always
succeeds.
@end deffn

@geindex Py_False (C var)
@anchor{c-api/bool c Py_False}@anchor{5674}
@deffn {C Variable} @ref{5df,,PyObject} *Py_False

The Python @code{False} object.  This object has no methods and is
@ref{292,,immortal}.


Changed in version 3.12: @ref{5674,,Py_False} is @ref{292,,immortal}.

@end deffn

@geindex Py_True (C var)
@anchor{c-api/bool c Py_True}@anchor{5675}
@deffn {C Variable} @ref{5df,,PyObject} *Py_True

The Python @code{True} object.  This object has no methods and is
@ref{292,,immortal}.


Changed in version 3.12: @ref{5675,,Py_True} is @ref{292,,immortal}.

@end deffn

@geindex Py_RETURN_FALSE (C macro)
@anchor{c-api/bool c Py_RETURN_FALSE}@anchor{1681}
@deffn {C Macro} Py_RETURN_FALSE

Return @ref{5674,,Py_False} from a function.
@end deffn

@geindex Py_RETURN_TRUE (C macro)
@anchor{c-api/bool c Py_RETURN_TRUE}@anchor{1680}
@deffn {C Macro} Py_RETURN_TRUE

Return @ref{5675,,Py_True} from a function.
@end deffn

@geindex PyBool_FromLong (C function)
@anchor{c-api/bool c PyBool_FromLong}@anchor{52d6}
@deffn {C Function} @ref{5df,,PyObject} *PyBool_FromLong (long v)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Return @ref{5675,,Py_True} or @ref{5674,,Py_False}, depending on the truth value of `v'.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Floating-Point Objects,Complex Number Objects,Boolean Objects,Numeric Objects
@anchor{c-api/float doc}@anchor{5677}@anchor{c-api/float floating-point-objects}@anchor{5678}@anchor{c-api/float floatobjects}@anchor{5679}@anchor{c-api/float translation-repo}@anchor{567a}
@subsubsection Floating-Point Objects


@geindex object; floating-point

@geindex PyFloatObject (C type)
@anchor{c-api/float c PyFloatObject}@anchor{567b}
@deffn {C Type} type PyFloatObject

This subtype of @ref{5df,,PyObject} represents a Python floating-point object.
@end deffn

@geindex PyFloat_Type (C var)
@anchor{c-api/float c PyFloat_Type}@anchor{538b}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyFloat_Type
` Part of the @ref{776,,Stable ABI}.'
This instance of @ref{ca2,,PyTypeObject} represents the Python floating-point
type.  This is the same object as @ref{197,,float} in the Python layer.
@end deffn

@geindex PyFloat_Check (C function)
@anchor{c-api/float c PyFloat_Check}@anchor{567c}
@deffn {C Function} int PyFloat_Check (PyObject *p)

Return true if its argument is a @ref{567b,,PyFloatObject} or a subtype of
@code{PyFloatObject}.  This function always succeeds.
@end deffn

@geindex PyFloat_CheckExact (C function)
@anchor{c-api/float c PyFloat_CheckExact}@anchor{567d}
@deffn {C Function} int PyFloat_CheckExact (PyObject *p)

Return true if its argument is a @ref{567b,,PyFloatObject}, but not a subtype of
@code{PyFloatObject}.  This function always succeeds.
@end deffn

@geindex PyFloat_FromString (C function)
@anchor{c-api/float c PyFloat_FromString}@anchor{538a}
@deffn {C Function} @ref{5df,,PyObject} *PyFloat_FromString (PyObject *str)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Create a @ref{567b,,PyFloatObject} object based on the string value in `str', or
@code{NULL} on failure.
@end deffn

@geindex PyFloat_FromDouble (C function)
@anchor{c-api/float c PyFloat_FromDouble}@anchor{5389}
@deffn {C Function} @ref{5df,,PyObject} *PyFloat_FromDouble (double v)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Create a @ref{567b,,PyFloatObject} object from `v', or @code{NULL} on failure.
@end deffn

@geindex PyFloat_AsDouble (C function)
@anchor{c-api/float c PyFloat_AsDouble}@anchor{c65}
@deffn {C Function} double PyFloat_AsDouble (PyObject *pyfloat)
` Part of the @ref{776,,Stable ABI}.'
Return a C double representation of the contents of `pyfloat'.  If
`pyfloat' is not a Python floating-point object but has a @ref{bc7,,__float__()}
method, this method will first be called to convert `pyfloat' into a float.
If @code{__float__()} is not defined then it falls back to @ref{19f,,__index__()}.
This method returns @code{-1.0} upon failure, so one should call
@ref{1cf0,,PyErr_Occurred()} to check for errors.


Changed in version 3.8: Use @ref{19f,,__index__()} if available.

@end deffn

@geindex PyFloat_AS_DOUBLE (C function)
@anchor{c-api/float c PyFloat_AS_DOUBLE}@anchor{567e}
@deffn {C Function} double PyFloat_AS_DOUBLE (PyObject *pyfloat)

Return a C double representation of the contents of `pyfloat', but
without error checking.
@end deffn

@geindex PyFloat_GetInfo (C function)
@anchor{c-api/float c PyFloat_GetInfo}@anchor{15fc}
@deffn {C Function} @ref{5df,,PyObject} *PyFloat_GetInfo (void)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Return a structseq instance which contains information about the
precision, minimum and maximum values of a float. It’s a thin wrapper
around the header file @code{float.h}.
@end deffn

@geindex PyFloat_GetMax (C function)
@anchor{c-api/float c PyFloat_GetMax}@anchor{15fa}
@deffn {C Function} double PyFloat_GetMax ()
` Part of the @ref{776,,Stable ABI}.'
Return the maximum representable finite float `DBL_MAX' as C double.
@end deffn

@geindex PyFloat_GetMin (C function)
@anchor{c-api/float c PyFloat_GetMin}@anchor{15fb}
@deffn {C Function} double PyFloat_GetMin ()
` Part of the @ref{776,,Stable ABI}.'
Return the minimum normalized positive float `DBL_MIN' as C double.
@end deffn

@geindex Py_INFINITY (C macro)
@anchor{c-api/float c Py_INFINITY}@anchor{567f}
@deffn {C Macro} Py_INFINITY

This macro expands to a constant expression of type double, that
represents the positive infinity.

On most platforms, this is equivalent to the @code{INFINITY} macro from
the C11 standard @code{<math.h>} header.
@end deffn

@geindex Py_NAN (C macro)
@anchor{c-api/float c Py_NAN}@anchor{5680}
@deffn {C Macro} Py_NAN

This macro expands to a constant expression of type double, that
represents a quiet not-a-number (qNaN) value.

On most platforms, this is equivalent to the @code{NAN} macro from
the C11 standard @code{<math.h>} header.
@end deffn

@geindex Py_HUGE_VAL (C macro)
@anchor{c-api/float c Py_HUGE_VAL}@anchor{5681}
@deffn {C Macro} Py_HUGE_VAL

Equivalent to @code{INFINITY}.


Deprecated since version 3.14: The macro is @ref{23f,,soft deprecated}.

@end deffn

@geindex Py_MATH_E (C macro)
@anchor{c-api/float c Py_MATH_E}@anchor{5682}
@deffn {C Macro} Py_MATH_E

The definition (accurate for a double type) of the @ref{2af2,,math.e} constant.
@end deffn

@geindex Py_MATH_El (C macro)
@anchor{c-api/float c Py_MATH_El}@anchor{5683}
@deffn {C Macro} Py_MATH_El

High precision (long double) definition of @ref{2af2,,e} constant.
@end deffn

@geindex Py_MATH_PI (C macro)
@anchor{c-api/float c Py_MATH_PI}@anchor{5684}
@deffn {C Macro} Py_MATH_PI

The definition (accurate for a double type) of the @ref{2af1,,math.pi} constant.
@end deffn

@geindex Py_MATH_PIl (C macro)
@anchor{c-api/float c Py_MATH_PIl}@anchor{5685}
@deffn {C Macro} Py_MATH_PIl

High precision (long double) definition of @ref{2af1,,pi} constant.
@end deffn

@geindex Py_MATH_TAU (C macro)
@anchor{c-api/float c Py_MATH_TAU}@anchor{5686}
@deffn {C Macro} Py_MATH_TAU

The definition (accurate for a double type) of the @ref{2af3,,math.tau} constant.


Added in version 3.6.

@end deffn

@geindex Py_RETURN_NAN (C macro)
@anchor{c-api/float c Py_RETURN_NAN}@anchor{5687}
@deffn {C Macro} Py_RETURN_NAN

Return @ref{875,,math.nan} from a function.

On most platforms, this is equivalent to @code{return PyFloat_FromDouble(NAN)}.
@end deffn

@geindex Py_RETURN_INF (C macro)
@anchor{c-api/float c Py_RETURN_INF}@anchor{5688}
@deffn {C Macro} Py_RETURN_INF (sign)

Return @ref{e86,,math.inf} or @code{-math.inf} from a function,
depending on the sign of `sign'.

On most platforms, this is equivalent to the following:

@example
return PyFloat_FromDouble(copysign(INFINITY, sign));
@end example
@end deffn

@geindex Py_IS_FINITE (C macro)
@anchor{c-api/float c Py_IS_FINITE}@anchor{5689}
@deffn {C Macro} Py_IS_FINITE (X)

Return @code{1} if the given floating-point number `X' is finite,
that is, it is normal, subnormal or zero, but not infinite or NaN.
Return @code{0} otherwise.


Deprecated since version 3.14: The macro is @ref{23f,,soft deprecated}.  Use @code{isfinite} instead.

@end deffn

@geindex Py_IS_INFINITY (C macro)
@anchor{c-api/float c Py_IS_INFINITY}@anchor{568a}
@deffn {C Macro} Py_IS_INFINITY (X)

Return @code{1} if the given floating-point number `X' is positive or negative
infinity.  Return @code{0} otherwise.


Deprecated since version 3.14: The macro is @ref{23f,,soft deprecated}.  Use @code{isinf} instead.

@end deffn

@geindex Py_IS_NAN (C macro)
@anchor{c-api/float c Py_IS_NAN}@anchor{1682}
@deffn {C Macro} Py_IS_NAN (X)

Return @code{1} if the given floating-point number `X' is a not-a-number (NaN)
value.  Return @code{0} otherwise.


Deprecated since version 3.14: The macro is @ref{23f,,soft deprecated}.  Use @code{isnan} instead.

@end deffn

@menu
* Pack and Unpack functions:: 

@end menu

@node Pack and Unpack functions,,,Floating-Point Objects
@anchor{c-api/float pack-and-unpack-functions}@anchor{568b}
@subsubsection Pack and Unpack functions


The pack and unpack functions provide an efficient platform-independent way to
store floating-point values as byte strings. The Pack routines produce a bytes
string from a C double, and the Unpack routines produce a C
double from such a bytes string. The suffix (2, 4 or 8) specifies the
number of bytes in the bytes string.

On platforms that appear to use IEEE 754 formats these functions work by
copying bits. On other platforms, the 2-byte format is identical to the IEEE
754 binary16 half-precision format, the 4-byte format (32-bit) is identical to
the IEEE 754 binary32 single precision format, and the 8-byte format to the
IEEE 754 binary64 double precision format, although the packing of INFs and
NaNs (if such things exist on the platform) isn’t handled correctly, and
attempting to unpack a bytes string containing an IEEE INF or NaN will raise an
exception.

Note that NaN type may not be preserved on IEEE platforms (signaling NaNs become
quiet NaNs), for example on x86 systems in 32-bit mode.

On non-IEEE platforms with more precision, or larger dynamic range, than IEEE
754 supports, not all values can be packed; on non-IEEE platforms with less
precision, or smaller dynamic range, not all values can be unpacked. What
happens in such cases is partly accidental (alas).


Added in version 3.11.


@menu
* Pack functions:: 
* Unpack functions:: 

@end menu

@node Pack functions,Unpack functions,,Pack and Unpack functions
@anchor{c-api/float pack-functions}@anchor{568c}
@subsubsection Pack functions


The pack routines write 2, 4 or 8 bytes, starting at `p'. `le' is an
int argument, non-zero if you want the bytes string in little-endian
format (exponent last, at @code{p+1}, @code{p+3}, or @code{p+6} and @code{p+7}), zero if you
want big-endian format (exponent first, at `p'). The @code{PY_BIG_ENDIAN}
constant can be used to use the native endian: it is equal to @code{1} on big
endian processor, or @code{0} on little endian processor.

Return value: @code{0} if all is OK, @code{-1} if error (and an exception is set,
most likely @ref{a87,,OverflowError}).

There are two problems on non-IEEE platforms:


@itemize *

@item 
What this does is undefined if `x' is a NaN or infinity.

@item 
@code{-0.0} and @code{+0.0} produce the same bytes string.
@end itemize

@geindex PyFloat_Pack2 (C function)
@anchor{c-api/float c PyFloat_Pack2}@anchor{96e}
@deffn {C Function} int PyFloat_Pack2 (double x, char *p, int le)

Pack a C double as the IEEE 754 binary16 half-precision format.
@end deffn

@geindex PyFloat_Pack4 (C function)
@anchor{c-api/float c PyFloat_Pack4}@anchor{96f}
@deffn {C Function} int PyFloat_Pack4 (double x, char *p, int le)

Pack a C double as the IEEE 754 binary32 single precision format.
@end deffn

@geindex PyFloat_Pack8 (C function)
@anchor{c-api/float c PyFloat_Pack8}@anchor{970}
@deffn {C Function} int PyFloat_Pack8 (double x, char *p, int le)

Pack a C double as the IEEE 754 binary64 double precision format.
@end deffn

@node Unpack functions,,Pack functions,Pack and Unpack functions
@anchor{c-api/float unpack-functions}@anchor{568d}
@subsubsection Unpack functions


The unpack routines read 2, 4 or 8 bytes, starting at `p'.  `le' is an
int argument, non-zero if the bytes string is in little-endian format
(exponent last, at @code{p+1}, @code{p+3} or @code{p+6} and @code{p+7}), zero if big-endian
(exponent first, at `p'). The @code{PY_BIG_ENDIAN} constant can be used to
use the native endian: it is equal to @code{1} on big endian processor, or @code{0}
on little endian processor.

Return value: The unpacked double.  On error, this is @code{-1.0} and
@ref{1cf0,,PyErr_Occurred()} is true (and an exception is set, most likely
@ref{a87,,OverflowError}).

Note that on a non-IEEE platform this will refuse to unpack a bytes string that
represents a NaN or infinity.

@geindex PyFloat_Unpack2 (C function)
@anchor{c-api/float c PyFloat_Unpack2}@anchor{971}
@deffn {C Function} double PyFloat_Unpack2 (const char *p, int le)

Unpack the IEEE 754 binary16 half-precision format as a C double.
@end deffn

@geindex PyFloat_Unpack4 (C function)
@anchor{c-api/float c PyFloat_Unpack4}@anchor{972}
@deffn {C Function} double PyFloat_Unpack4 (const char *p, int le)

Unpack the IEEE 754 binary32 single precision format as a C double.
@end deffn

@geindex PyFloat_Unpack8 (C function)
@anchor{c-api/float c PyFloat_Unpack8}@anchor{973}
@deffn {C Function} double PyFloat_Unpack8 (const char *p, int le)

Unpack the IEEE 754 binary64 double precision format as a C double.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Complex Number Objects,,Floating-Point Objects,Numeric Objects
@anchor{c-api/complex doc}@anchor{568e}@anchor{c-api/complex complex-number-objects}@anchor{568f}@anchor{c-api/complex complexobjects}@anchor{5690}@anchor{c-api/complex translation-repo}@anchor{5691}
@subsubsection Complex Number Objects


@geindex object; complex number

Python’s complex number objects are implemented as two distinct types when
viewed from the C API:  one is the Python object exposed to Python programs, and
the other is a C structure which represents the actual complex number value.
The API provides functions for working with both.

@menu
* Complex Numbers as C Structures:: 
* Complex Numbers as Python Objects:: 

@end menu

@node Complex Numbers as C Structures,Complex Numbers as Python Objects,,Complex Number Objects
@anchor{c-api/complex complex-numbers-as-c-structures}@anchor{5692}
@subsubsection Complex Numbers as C Structures


Note that the functions which accept these structures as parameters and return
them as results do so `by value' rather than dereferencing them through
pointers.  This is consistent throughout the API.

@geindex Py_complex (C type)
@anchor{c-api/complex c Py_complex}@anchor{559d}
@deffn {C Type} type Py_complex

The C structure which corresponds to the value portion of a Python complex
number object.  Most of the functions for dealing with complex number objects
use structures of this type as input or output values, as appropriate.

@geindex Py_complex.real (C member)
@geindex Py_complex.imag (C member)
@anchor{c-api/complex c Py_complex real}@anchor{5693}
@deffn {C Member} double real
@anchor{c-api/complex c Py_complex imag}@anchor{5694}
@deffnx {C Member} double imag
@end deffn

The structure is defined as:

@example
typedef struct @{
    double real;
    double imag;
@} Py_complex;
@end example
@end deffn

@geindex _Py_c_sum (C function)
@anchor{c-api/complex c _Py_c_sum}@anchor{5695}
@deffn {C Function} @ref{559d,,Py_complex} _Py_c_sum (Py_complex left, Py_complex right)

Return the sum of two complex numbers, using the C @ref{559d,,Py_complex}
representation.
@end deffn

@geindex _Py_c_diff (C function)
@anchor{c-api/complex c _Py_c_diff}@anchor{5696}
@deffn {C Function} @ref{559d,,Py_complex} _Py_c_diff (Py_complex left, Py_complex right)

Return the difference between two complex numbers, using the C
@ref{559d,,Py_complex} representation.
@end deffn

@geindex _Py_c_neg (C function)
@anchor{c-api/complex c _Py_c_neg}@anchor{5697}
@deffn {C Function} @ref{559d,,Py_complex} _Py_c_neg (Py_complex num)

Return the negation of the complex number `num', using the C
@ref{559d,,Py_complex} representation.
@end deffn

@geindex _Py_c_prod (C function)
@anchor{c-api/complex c _Py_c_prod}@anchor{5698}
@deffn {C Function} @ref{559d,,Py_complex} _Py_c_prod (Py_complex left, Py_complex right)

Return the product of two complex numbers, using the C @ref{559d,,Py_complex}
representation.
@end deffn

@geindex _Py_c_quot (C function)
@anchor{c-api/complex c _Py_c_quot}@anchor{5699}
@deffn {C Function} @ref{559d,,Py_complex} _Py_c_quot (Py_complex dividend, Py_complex divisor)

Return the quotient of two complex numbers, using the C @ref{559d,,Py_complex}
representation.

If `divisor' is null, this method returns zero and sets
@code{errno} to @code{EDOM}.
@end deffn

@geindex _Py_c_pow (C function)
@anchor{c-api/complex c _Py_c_pow}@anchor{1937}
@deffn {C Function} @ref{559d,,Py_complex} _Py_c_pow (Py_complex num, Py_complex exp)

Return the exponentiation of `num' by `exp', using the C @ref{559d,,Py_complex}
representation.

If `num' is null and `exp' is not a positive real number,
this method returns zero and sets @code{errno} to @code{EDOM}.

Set @code{errno} to @code{ERANGE} on overflows.
@end deffn

@node Complex Numbers as Python Objects,,Complex Numbers as C Structures,Complex Number Objects
@anchor{c-api/complex complex-numbers-as-python-objects}@anchor{569a}
@subsubsection Complex Numbers as Python Objects


@geindex PyComplexObject (C type)
@anchor{c-api/complex c PyComplexObject}@anchor{569b}
@deffn {C Type} type PyComplexObject

This subtype of @ref{5df,,PyObject} represents a Python complex number object.
@end deffn

@geindex PyComplex_Type (C var)
@anchor{c-api/complex c PyComplex_Type}@anchor{530e}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyComplex_Type
` Part of the @ref{776,,Stable ABI}.'
This instance of @ref{ca2,,PyTypeObject} represents the Python complex number
type. It is the same object as @ref{198,,complex} in the Python layer.
@end deffn

@geindex PyComplex_Check (C function)
@anchor{c-api/complex c PyComplex_Check}@anchor{569c}
@deffn {C Function} int PyComplex_Check (PyObject *p)

Return true if its argument is a @ref{569b,,PyComplexObject} or a subtype of
@code{PyComplexObject}.  This function always succeeds.
@end deffn

@geindex PyComplex_CheckExact (C function)
@anchor{c-api/complex c PyComplex_CheckExact}@anchor{569d}
@deffn {C Function} int PyComplex_CheckExact (PyObject *p)

Return true if its argument is a @ref{569b,,PyComplexObject}, but not a subtype of
@code{PyComplexObject}.  This function always succeeds.
@end deffn

@geindex PyComplex_FromCComplex (C function)
@anchor{c-api/complex c PyComplex_FromCComplex}@anchor{569e}
@deffn {C Function} @ref{5df,,PyObject} *PyComplex_FromCComplex (Py_complex v)
`Return value: New reference.'
Create a new Python complex number object from a C @ref{559d,,Py_complex} value.
Return @code{NULL} with an exception set on error.
@end deffn

@geindex PyComplex_FromDoubles (C function)
@anchor{c-api/complex c PyComplex_FromDoubles}@anchor{530d}
@deffn {C Function} @ref{5df,,PyObject} *PyComplex_FromDoubles (double real, double imag)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Return a new @ref{569b,,PyComplexObject} object from `real' and `imag'.
Return @code{NULL} with an exception set on error.
@end deffn

@geindex PyComplex_RealAsDouble (C function)
@anchor{c-api/complex c PyComplex_RealAsDouble}@anchor{1a59}
@deffn {C Function} double PyComplex_RealAsDouble (PyObject *op)
` Part of the @ref{776,,Stable ABI}.'
Return the real part of `op' as a C double.

If `op' is not a Python complex number object but has a
@ref{7fe,,__complex__()} method, this method will first be called to
convert `op' to a Python complex number object.  If @code{__complex__()} is
not defined then it falls back to call @ref{c65,,PyFloat_AsDouble()} and
returns its result.

Upon failure, this method returns @code{-1.0} with an exception set, so one
should call @ref{1cf0,,PyErr_Occurred()} to check for errors.


Changed in version 3.13: Use @ref{7fe,,__complex__()} if available.

@end deffn

@geindex PyComplex_ImagAsDouble (C function)
@anchor{c-api/complex c PyComplex_ImagAsDouble}@anchor{1a5a}
@deffn {C Function} double PyComplex_ImagAsDouble (PyObject *op)
` Part of the @ref{776,,Stable ABI}.'
Return the imaginary part of `op' as a C double.

If `op' is not a Python complex number object but has a
@ref{7fe,,__complex__()} method, this method will first be called to
convert `op' to a Python complex number object.  If @code{__complex__()} is
not defined then it falls back to call @ref{c65,,PyFloat_AsDouble()} and
returns @code{0.0} on success.

Upon failure, this method returns @code{-1.0} with an exception set, so one
should call @ref{1cf0,,PyErr_Occurred()} to check for errors.


Changed in version 3.13: Use @ref{7fe,,__complex__()} if available.

@end deffn

@geindex PyComplex_AsCComplex (C function)
@anchor{c-api/complex c PyComplex_AsCComplex}@anchor{15fd}
@deffn {C Function} @ref{559d,,Py_complex} PyComplex_AsCComplex (PyObject *op)

Return the @ref{559d,,Py_complex} value of the complex number `op'.

If `op' is not a Python complex number object but has a @ref{7fe,,__complex__()}
method, this method will first be called to convert `op' to a Python complex
number object.  If @code{__complex__()} is not defined then it falls back to
@ref{bc7,,__float__()}.  If @code{__float__()} is not defined then it falls back
to @ref{19f,,__index__()}.

Upon failure, this method returns @ref{559d,,Py_complex}
with @ref{5693,,real} set to @code{-1.0} and with an exception set, so one
should call @ref{1cf0,,PyErr_Occurred()} to check for errors.


Changed in version 3.8: Use @ref{19f,,__index__()} if available.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Sequence Objects,Container Objects,Numeric Objects,Concrete Objects Layer
@anchor{c-api/concrete sequence-objects}@anchor{569f}@anchor{c-api/concrete sequenceobjects}@anchor{56a0}
@subsection Sequence Objects


@geindex object; sequence

Generic operations on sequence objects were discussed in the previous chapter;
this section deals with the specific kinds of sequence objects that are
intrinsic to the Python language.

@c XXX sort out unicode, str, bytes and bytearray

@menu
* Bytes Objects: Bytes Objects<2>. 
* Byte Array Objects:: 
* Unicode Objects and Codecs:: 
* Tuple Objects:: 
* Struct Sequence Objects:: 
* List Objects:: 

@end menu

@node Bytes Objects<2>,Byte Array Objects,,Sequence Objects
@anchor{c-api/bytes doc}@anchor{56a1}@anchor{c-api/bytes bytes-objects}@anchor{56a2}@anchor{c-api/bytes bytesobjects}@anchor{56a3}
@subsubsection Bytes Objects


These functions raise @ref{199,,TypeError} when expecting a bytes parameter and
called with a non-bytes parameter.

@geindex object; bytes

@geindex PyBytesObject (C type)
@anchor{c-api/bytes c PyBytesObject}@anchor{99a}
@deffn {C Type} type PyBytesObject

This subtype of @ref{5df,,PyObject} represents a Python bytes object.
@end deffn

@geindex PyBytes_Type (C var)
@anchor{c-api/bytes c PyBytes_Type}@anchor{52e8}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyBytes_Type
` Part of the @ref{776,,Stable ABI}.'
This instance of @ref{ca2,,PyTypeObject} represents the Python bytes type; it
is the same object as @ref{193,,bytes} in the Python layer.
@end deffn

@geindex PyBytes_Check (C function)
@anchor{c-api/bytes c PyBytes_Check}@anchor{15ab}
@deffn {C Function} int PyBytes_Check (PyObject *o)

Return true if the object `o' is a bytes object or an instance of a subtype
of the bytes type.  This function always succeeds.
@end deffn

@geindex PyBytes_CheckExact (C function)
@anchor{c-api/bytes c PyBytes_CheckExact}@anchor{56a4}
@deffn {C Function} int PyBytes_CheckExact (PyObject *o)

Return true if the object `o' is a bytes object, but not an instance of a
subtype of the bytes type.  This function always succeeds.
@end deffn

@geindex PyBytes_FromString (C function)
@anchor{c-api/bytes c PyBytes_FromString}@anchor{52e5}
@deffn {C Function} @ref{5df,,PyObject} *PyBytes_FromString (const char *v)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{2778,,Atomic}.'
Return a new bytes object with a copy of the string `v' as value on success,
and @code{NULL} on failure.  The parameter `v' must not be @code{NULL}; it will not be
checked.
@end deffn

@geindex PyBytes_FromStringAndSize (C function)
@anchor{c-api/bytes c PyBytes_FromStringAndSize}@anchor{15ac}
@deffn {C Function} @ref{5df,,PyObject} *PyBytes_FromStringAndSize (const char *v, Py_ssize_t len)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{2778,,Atomic}.'
Return a new bytes object with a copy of the string `v' as value and length
`len' on success, and @code{NULL} on failure.  If `v' is @code{NULL}, the contents of
the bytes object are uninitialized.
@end deffn

@geindex PyBytes_FromFormat (C function)
@anchor{c-api/bytes c PyBytes_FromFormat}@anchor{1e4e}
@deffn {C Function} @ref{5df,,PyObject} *PyBytes_FromFormat (const char *format, ...)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{2778,,Atomic}.'
Take a C @code{printf()}-style `format' string and a variable number of
arguments, calculate the size of the resulting Python bytes object and return
a bytes object with the values formatted into it.  The variable arguments
must be C types and must correspond exactly to the format characters in the
`format' string.  The following format characters are allowed:

@c % XXX: This should be exactly the same as the table in PyErr_Format.

@c % One should just refer to the other.


@multitable {xxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Format Characters

@tab

Type

@tab

Comment

@item

@code{%%}

@tab

`n/a'

@tab

The literal % character.

@item

@code{%c}

@tab

int

@tab

A single byte,
represented as a C int.

@item

@code{%d}

@tab

int

@tab

Equivalent to
@code{printf("%d")}. @footnote{
For integer specifiers (d, u, ld, lu, zd, zu, i, x): the 0-conversion
flag has effect even when a precision is given.
}

@item

@code{%u}

@tab

unsigned int

@tab

Equivalent to
@code{printf("%u")}. @footnote{
For integer specifiers (d, u, ld, lu, zd, zu, i, x): the 0-conversion
flag has effect even when a precision is given.
}

@item

@code{%ld}

@tab

long

@tab

Equivalent to
@code{printf("%ld")}. @footnote{
For integer specifiers (d, u, ld, lu, zd, zu, i, x): the 0-conversion
flag has effect even when a precision is given.
}

@item

@code{%lu}

@tab

unsigned long

@tab

Equivalent to
@code{printf("%lu")}. @footnote{
For integer specifiers (d, u, ld, lu, zd, zu, i, x): the 0-conversion
flag has effect even when a precision is given.
}

@item

@code{%zd}

@tab

@ref{c5b,,Py_ssize_t}

@tab

Equivalent to
@code{printf("%zd")}. @footnote{
For integer specifiers (d, u, ld, lu, zd, zu, i, x): the 0-conversion
flag has effect even when a precision is given.
}

@item

@code{%zu}

@tab

size_t

@tab

Equivalent to
@code{printf("%zu")}. @footnote{
For integer specifiers (d, u, ld, lu, zd, zu, i, x): the 0-conversion
flag has effect even when a precision is given.
}

@item

@code{%i}

@tab

int

@tab

Equivalent to
@code{printf("%i")}. @footnote{
For integer specifiers (d, u, ld, lu, zd, zu, i, x): the 0-conversion
flag has effect even when a precision is given.
}

@item

@code{%x}

@tab

int

@tab

Equivalent to
@code{printf("%x")}. @footnote{
For integer specifiers (d, u, ld, lu, zd, zu, i, x): the 0-conversion
flag has effect even when a precision is given.
}

@item

@code{%s}

@tab

const char*

@tab

A null-terminated C character
array.

@item

@code{%p}

@tab

const void*

@tab

The hex representation of a C
pointer. Mostly equivalent to
@code{printf("%p")} except that
it is guaranteed to start with
the literal @code{0x} regardless
of what the platform’s
@code{printf} yields.

@end multitable


An unrecognized format character causes all the rest of the format string to be
copied as-is to the result object, and any extra arguments discarded.
@end deffn

@geindex PyBytes_FromFormatV (C function)
@anchor{c-api/bytes c PyBytes_FromFormatV}@anchor{52e3}
@deffn {C Function} @ref{5df,,PyObject} *PyBytes_FromFormatV (const char *format, va_list vargs)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{2778,,Atomic}.'
Identical to @ref{1e4e,,PyBytes_FromFormat()} except that it takes exactly two
arguments.
@end deffn

@geindex PyBytes_FromObject (C function)
@anchor{c-api/bytes c PyBytes_FromObject}@anchor{52e4}
@deffn {C Function} @ref{5df,,PyObject} *PyBytes_FromObject (PyObject *o)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{2773,,Safe for concurrent use on the same object}.'
Return the bytes representation of object `o' that implements the buffer
protocol.

@cartouche
@quotation Note 
If the object implements the buffer protocol, then the buffer
must not be mutated while the bytes object is being created.
@end quotation
@end cartouche
@end deffn

@geindex PyBytes_Size (C function)
@anchor{c-api/bytes c PyBytes_Size}@anchor{52e7}
@deffn {C Function} @ref{c5b,,Py_ssize_t} PyBytes_Size (PyObject *o)
` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{2778,,Atomic}.'
Return the length of the bytes in bytes object `o'.
@end deffn

@geindex PyBytes_GET_SIZE (C function)
@anchor{c-api/bytes c PyBytes_GET_SIZE}@anchor{56a5}
@deffn {C Function} @ref{c5b,,Py_ssize_t} PyBytes_GET_SIZE (PyObject *o)
` Thread safety: @ref{2778,,Atomic}.'
Similar to @ref{52e7,,PyBytes_Size()}, but without error checking.
@end deffn

@geindex PyBytes_AsString (C function)
@anchor{c-api/bytes c PyBytes_AsString}@anchor{a8d}
@deffn {C Function} char *PyBytes_AsString (PyObject *o)
` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{276c,,Safe to call from multiple threads with external synchronization only}.'
Return a pointer to the contents of `o'.  The pointer
refers to the internal buffer of `o', which consists of @code{len(o) + 1}
bytes.  The last byte in the buffer is always null, regardless of
whether there are any other null bytes.  The data must not be
modified in any way, unless the object was just created using
@code{PyBytes_FromStringAndSize(NULL, size)}. It must not be deallocated.  If
`o' is not a bytes object at all, @ref{a8d,,PyBytes_AsString()} returns @code{NULL}
and raises @ref{199,,TypeError}.
@end deffn

@geindex PyBytes_AS_STRING (C function)
@anchor{c-api/bytes c PyBytes_AS_STRING}@anchor{56a6}
@deffn {C Function} char *PyBytes_AS_STRING (PyObject *string)
` Thread safety: @ref{276c,,Safe to call from multiple threads with external synchronization only}.'
Similar to @ref{a8d,,PyBytes_AsString()}, but without error checking.
@end deffn

@geindex PyBytes_AsStringAndSize (C function)
@anchor{c-api/bytes c PyBytes_AsStringAndSize}@anchor{52df}
@deffn {C Function} int PyBytes_AsStringAndSize (PyObject *obj, char **buffer, Py_ssize_t *length)
` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{276c,,Safe to call from multiple threads with external synchronization only}.'
Return the null-terminated contents of the object `obj'
through the output variables `buffer' and `length'.
Returns @code{0} on success.

If `length' is @code{NULL}, the bytes object
may not contain embedded null bytes;
if it does, the function returns @code{-1} and a @ref{2ee,,ValueError} is raised.

The buffer refers to an internal buffer of `obj', which includes an
additional null byte at the end (not counted in `length').  The data
must not be modified in any way, unless the object was just created using
@code{PyBytes_FromStringAndSize(NULL, size)}.  It must not be deallocated.  If
`obj' is not a bytes object at all, @ref{52df,,PyBytes_AsStringAndSize()}
returns @code{-1} and raises @ref{199,,TypeError}.


Changed in version 3.5: Previously, @ref{199,,TypeError} was raised when embedded null bytes were
encountered in the bytes object.

@end deffn

@geindex PyBytes_Concat (C function)
@anchor{c-api/bytes c PyBytes_Concat}@anchor{52e0}
@deffn {C Function} void PyBytes_Concat (PyObject **bytes, PyObject *newpart)
` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{2773,,Safe for concurrent use on the same object}.'
Create a new bytes object in `*bytes' containing the contents of `newpart'
appended to `bytes'; the caller will own the new reference.  The reference to
the old value of `bytes' will be stolen.  If the new object cannot be
created, the old reference to `bytes' will still be discarded and the value
of `*bytes' will be set to @code{NULL}; the appropriate exception will be set.

@cartouche
@quotation Note 
If `newpart' implements the buffer protocol, then the buffer
must not be mutated while the new bytes object is being created.
@end quotation
@end cartouche
@end deffn

@geindex PyBytes_ConcatAndDel (C function)
@anchor{c-api/bytes c PyBytes_ConcatAndDel}@anchor{52e1}
@deffn {C Function} void PyBytes_ConcatAndDel (PyObject **bytes, PyObject *newpart)
` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{2773,,Safe for concurrent use on the same object}.'
Create a new bytes object in `*bytes' containing the contents of `newpart'
appended to `bytes'.  This version releases the @ref{5e2,,strong reference}
to `newpart' (i.e. decrements its reference count).

@cartouche
@quotation Note 
If `newpart' implements the buffer protocol, then the buffer
must not be mutated while the new bytes object is being created.
@end quotation
@end cartouche
@end deffn

@geindex PyBytes_Join (C function)
@anchor{c-api/bytes c PyBytes_Join}@anchor{381}
@deffn {C Function} @ref{5df,,PyObject} *PyBytes_Join (PyObject *sep, PyObject *iterable)
` Thread safety: @ref{2773,,Safe for concurrent use on the same object}.'
Similar to @code{sep.join(iterable)} in Python.

`sep' must be Python @ref{193,,bytes} object.
(Note that @ref{13ae,,PyUnicode_Join()} accepts @code{NULL} separator and treats
it as a space, whereas @ref{381,,PyBytes_Join()} doesn’t accept @code{NULL}
separator.)

`iterable' must be an iterable object yielding objects that implement the
@ref{262,,buffer protocol}.

On success, return a new @ref{193,,bytes} object.
On error, set an exception and return @code{NULL}.


Added in version 3.14.


@cartouche
@quotation Note 
If `iterable' objects implement the buffer protocol, then the buffers
must not be mutated while the new bytes object is being created.
@end quotation
@end cartouche
@end deffn

@geindex _PyBytes_Resize (C function)
@anchor{c-api/bytes c _PyBytes_Resize}@anchor{1a12}
@deffn {C Function} int _PyBytes_Resize (PyObject **bytes, Py_ssize_t newsize)
` Thread safety: @ref{2771,,Safe to call without external synchronization on distinct objects}.'
Resize a bytes object. `newsize' will be the new length of the bytes object.
You can think of it as creating a new bytes object and destroying the old
one, only more efficiently.
Pass the address of an
existing bytes object as an lvalue (it may be written into), and the new size
desired.  On success, `*bytes' holds the resized bytes object and @code{0} is
returned; the address in `*bytes' may differ from its input value.  If the
reallocation fails, the original bytes object at `*bytes' is deallocated,
`*bytes' is set to @code{NULL}, @ref{1761,,MemoryError} is set, and @code{-1} is
returned.
@end deffn

@geindex PyBytes_Repr (C function)
@anchor{c-api/bytes c PyBytes_Repr}@anchor{52e6}
@deffn {C Function} @ref{5df,,PyObject} *PyBytes_Repr (PyObject *bytes, int smartquotes)
` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{2778,,Atomic}.'
Get the string representation of `bytes'. This function is currently used to
implement @code{bytes.__repr__()} in Python.

This function does not do type checking; it is undefined behavior to pass
`bytes' as a non-bytes object or @code{NULL}.

If `smartquotes' is true, the representation will use a double-quoted string
instead of single-quoted string when single-quotes are present in `bytes'.
For example, the byte string @code{'Python'} would be represented as
@code{b"'Python'"} when `smartquotes' is true, or @code{b'\'Python\'@w{'}} when it is
false.

On success, this function returns a @ref{5e2,,strong reference} to a
@ref{16a,,str} object containing the representation. On failure, this
returns @code{NULL} with an exception set.
@end deffn

@geindex PyBytes_DecodeEscape (C function)
@anchor{c-api/bytes c PyBytes_DecodeEscape}@anchor{52e2}
@deffn {C Function} @ref{5df,,PyObject} *PyBytes_DecodeEscape (const char *s, Py_ssize_t len, const char *errors, Py_ssize_t unicode, const char *recode_encoding)
` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{2778,,Atomic}.'
Unescape a backslash-escaped string `s'. `s' must not be @code{NULL}.
`len' must be the size of `s'.

`errors' must be one of @code{"strict"}, @code{"replace"}, or @code{"ignore"}. If
`errors' is @code{NULL}, then @code{"strict"} is used by default.

On success, this function returns a @ref{5e2,,strong reference} to a Python
@ref{193,,bytes} object containing the unescaped string. On failure, this
function returns @code{NULL} with an exception set.


Changed in version 3.9: `unicode' and `recode_encoding' are now unused.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Byte Array Objects,Unicode Objects and Codecs,Bytes Objects<2>,Sequence Objects
@anchor{c-api/bytearray doc}@anchor{56a7}@anchor{c-api/bytearray byte-array-objects}@anchor{56a8}@anchor{c-api/bytearray bytearrayobjects}@anchor{56a9}@anchor{c-api/bytearray translation-repo}@anchor{56aa}
@subsubsection Byte Array Objects


@geindex object; bytearray

@geindex PyByteArrayObject (C type)
@anchor{c-api/bytearray c PyByteArrayObject}@anchor{56ab}
@deffn {C Type} type PyByteArrayObject

This subtype of @ref{5df,,PyObject} represents a Python bytearray object.
@end deffn

@geindex PyByteArray_Type (C var)
@anchor{c-api/bytearray c PyByteArray_Type}@anchor{52dd}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyByteArray_Type
` Part of the @ref{776,,Stable ABI}.'
This instance of @ref{ca2,,PyTypeObject} represents the Python bytearray type;
it is the same object as @ref{342,,bytearray} in the Python layer.
@end deffn

@menu
* Type check macros:: 
* Direct API functions:: 
* Macros:: 

@end menu

@node Type check macros,Direct API functions,,Byte Array Objects
@anchor{c-api/bytearray type-check-macros}@anchor{56ac}
@subsubsection Type check macros


@geindex PyByteArray_Check (C function)
@anchor{c-api/bytearray c PyByteArray_Check}@anchor{56ad}
@deffn {C Function} int PyByteArray_Check (PyObject *o)

Return true if the object `o' is a bytearray object or an instance of a
subtype of the bytearray type.  This function always succeeds.
@end deffn

@geindex PyByteArray_CheckExact (C function)
@anchor{c-api/bytearray c PyByteArray_CheckExact}@anchor{56ae}
@deffn {C Function} int PyByteArray_CheckExact (PyObject *o)

Return true if the object `o' is a bytearray object, but not an instance of a
subtype of the bytearray type.  This function always succeeds.
@end deffn

@node Direct API functions,Macros,Type check macros,Byte Array Objects
@anchor{c-api/bytearray direct-api-functions}@anchor{56af}
@subsubsection Direct API functions


@geindex PyByteArray_FromObject (C function)
@anchor{c-api/bytearray c PyByteArray_FromObject}@anchor{15b4}
@deffn {C Function} @ref{5df,,PyObject} *PyByteArray_FromObject (PyObject *o)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{2773,,Safe for concurrent use on the same object}.'
Return a new bytearray object from any object, `o', that implements the
@ref{262,,buffer protocol}.

On failure, return @code{NULL} with an exception set.

@cartouche
@quotation Note 
If the object implements the buffer protocol, then the buffer
must not be mutated while the bytearray object is being created.
@end quotation
@end cartouche
@end deffn

@geindex PyByteArray_FromStringAndSize (C function)
@anchor{c-api/bytearray c PyByteArray_FromStringAndSize}@anchor{15b5}
@deffn {C Function} @ref{5df,,PyObject} *PyByteArray_FromStringAndSize (const char *string, Py_ssize_t len)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{2778,,Atomic}.'
Create a new bytearray object from `string' and its length, `len'.

On failure, return @code{NULL} with an exception set.
@end deffn

@geindex PyByteArray_Concat (C function)
@anchor{c-api/bytearray c PyByteArray_Concat}@anchor{52da}
@deffn {C Function} @ref{5df,,PyObject} *PyByteArray_Concat (PyObject *a, PyObject *b)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{2773,,Safe for concurrent use on the same object}.'
Concat bytearrays `a' and `b' and return a new bytearray with the result.

On failure, return @code{NULL} with an exception set.

@cartouche
@quotation Note 
If the object implements the buffer protocol, then the buffer
must not be mutated while the bytearray object is being created.
@end quotation
@end cartouche
@end deffn

@geindex PyByteArray_Size (C function)
@anchor{c-api/bytearray c PyByteArray_Size}@anchor{52dc}
@deffn {C Function} @ref{c5b,,Py_ssize_t} PyByteArray_Size (PyObject *bytearray)
` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{2778,,Atomic}.'
Return the size of `bytearray' after checking for a @code{NULL} pointer.
@end deffn

@geindex PyByteArray_AsString (C function)
@anchor{c-api/bytearray c PyByteArray_AsString}@anchor{52d9}
@deffn {C Function} char *PyByteArray_AsString (PyObject *bytearray)
` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{276c,,Safe to call from multiple threads with external synchronization only}.'
Return the contents of `bytearray' as a char array after checking for a
@code{NULL} pointer.  The returned array always has an extra
null byte appended.

@cartouche
@quotation Note 
It is not thread-safe to mutate the bytearray object while using the returned char array.
@end quotation
@end cartouche
@end deffn

@geindex PyByteArray_Resize (C function)
@anchor{c-api/bytearray c PyByteArray_Resize}@anchor{52db}
@deffn {C Function} int PyByteArray_Resize (PyObject *bytearray, Py_ssize_t len)
` Part of the @ref{776,,Stable ABI}.'
Resize the internal buffer of `bytearray' to `len'.
Failure is a @code{-1} return with an exception set.


Changed in version 3.14: A negative `len' will now result in an exception being set and -1 returned.

@end deffn

@node Macros,,Direct API functions,Byte Array Objects
@anchor{c-api/bytearray macros}@anchor{56b0}
@subsubsection Macros


These macros trade safety for speed and they don’t check pointers.

@geindex PyByteArray_AS_STRING (C function)
@anchor{c-api/bytearray c PyByteArray_AS_STRING}@anchor{56b1}
@deffn {C Function} char *PyByteArray_AS_STRING (PyObject *bytearray)
` Thread safety: @ref{276c,,Safe to call from multiple threads with external synchronization only}.'
Similar to @ref{52d9,,PyByteArray_AsString()}, but without error checking.

@cartouche
@quotation Note 
It is not thread-safe to mutate the bytearray object while using the returned char array.
@end quotation
@end cartouche
@end deffn

@geindex PyByteArray_GET_SIZE (C function)
@anchor{c-api/bytearray c PyByteArray_GET_SIZE}@anchor{56b2}
@deffn {C Function} @ref{c5b,,Py_ssize_t} PyByteArray_GET_SIZE (PyObject *bytearray)
` Thread safety: @ref{2778,,Atomic}.'
Similar to @ref{52dc,,PyByteArray_Size()}, but without error checking.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Unicode Objects and Codecs,Tuple Objects,Byte Array Objects,Sequence Objects
@anchor{c-api/unicode doc}@anchor{13ac}@anchor{c-api/unicode translation-repo}@anchor{56b3}@anchor{c-api/unicode unicode-objects-and-codecs}@anchor{56b4}@anchor{c-api/unicode unicodeobjects}@anchor{56b5}
@subsubsection Unicode Objects and Codecs


@menu
* Unicode Objects:: 
* Built-in Codecs:: 
* Methods and Slot Functions:: 
* PyUnicodeWriter:: 
* Deprecated API: Deprecated API<2>. 

@end menu

@node Unicode Objects,Built-in Codecs,,Unicode Objects and Codecs
@anchor{c-api/unicode unicode-objects}@anchor{56b6}
@subsubsection Unicode Objects


Since the implementation of 
@geindex Python Enhancement Proposals; PEP 393
PEP 393@footnote{https://peps.python.org/pep-0393/} in Python 3.3, Unicode objects internally
use a variety of representations, in order to allow handling the complete range
of Unicode characters while staying memory efficient.  There are special cases
for strings where all code points are below 128, 256, or 65536; otherwise, code
points must be below 1114112 (which is the full Unicode range).

UTF-8 representation is created on demand and cached in the Unicode object.

@cartouche
@quotation Note 
The @ref{3de,,Py_UNICODE} representation has been removed since Python 3.12
with deprecated APIs.
See 
@geindex Python Enhancement Proposals; PEP 623
PEP 623@footnote{https://peps.python.org/pep-0623/} for more information.
@end quotation
@end cartouche

@menu
* Unicode Type:: 
* Unicode Character Properties:: 
* Creating and accessing Unicode strings:: 
* Locale Encoding:: 
* File System Encoding:: 
* wchar_t Support:: 

@end menu

@node Unicode Type,Unicode Character Properties,,Unicode Objects
@anchor{c-api/unicode unicode-type}@anchor{56b7}
@subsubsection Unicode Type


These are the basic Unicode object types used for the Unicode implementation in
Python:

@geindex PyUnicode_Type (C var)
@anchor{c-api/unicode c PyUnicode_Type}@anchor{547b}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyUnicode_Type
` Part of the @ref{776,,Stable ABI}.'
This instance of @ref{ca2,,PyTypeObject} represents the Python Unicode type.
It is exposed to Python code as @ref{16a,,str}.
@end deffn

@geindex PyUnicodeIter_Type (C var)
@anchor{c-api/unicode c PyUnicodeIter_Type}@anchor{544c}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyUnicodeIter_Type
` Part of the @ref{776,,Stable ABI}.'
This instance of @ref{ca2,,PyTypeObject} represents the Python Unicode
iterator type. It is used to iterate over Unicode string objects.
@end deffn

@geindex Py_UCS4 (C type)
@geindex Py_UCS2 (C type)
@geindex Py_UCS1 (C type)
@anchor{c-api/unicode c Py_UCS4}@anchor{33b}
@deffn {C Type} type Py_UCS4
@anchor{c-api/unicode c Py_UCS2}@anchor{1380}
@deffnx {C Type} type Py_UCS2
@anchor{c-api/unicode c Py_UCS1}@anchor{137f}
@deffnx {C Type} type Py_UCS1
` Part of the @ref{776,,Stable ABI}.'
These types are typedefs for unsigned integer types wide enough to contain
characters of 32 bits, 16 bits and 8 bits, respectively.  When dealing with
single Unicode characters, use @ref{33b,,Py_UCS4}.


Added in version 3.3.

@end deffn

@geindex PyASCIIObject (C type)
@geindex PyCompactUnicodeObject (C type)
@geindex PyUnicodeObject (C type)
@anchor{c-api/unicode c PyASCIIObject}@anchor{1381}
@deffn {C Type} type PyASCIIObject
@anchor{c-api/unicode c PyCompactUnicodeObject}@anchor{1382}
@deffnx {C Type} type PyCompactUnicodeObject
@anchor{c-api/unicode c PyUnicodeObject}@anchor{99c}
@deffnx {C Type} type PyUnicodeObject

These subtypes of @ref{5df,,PyObject} represent a Python Unicode object.  In
almost all cases, they shouldn’t be used directly, since all API functions
that deal with Unicode objects take and return @code{PyObject} pointers.


Added in version 3.3.


The structure of a particular object can be determined using the following
macros.
The macros cannot fail; their behavior is undefined if their argument
is not a Python Unicode object.

@geindex PyUnicode_IS_COMPACT (C macro)
@anchor{c-api/unicode c PyUnicode_IS_COMPACT}@anchor{56b8}
@deffn {C Macro} PyUnicode_IS_COMPACT (o)

True if `o' uses the @ref{1382,,PyCompactUnicodeObject} structure.


Added in version 3.3.

@end deffn

@geindex PyUnicode_IS_COMPACT_ASCII (C macro)
@anchor{c-api/unicode c PyUnicode_IS_COMPACT_ASCII}@anchor{56b9}
@deffn {C Macro} PyUnicode_IS_COMPACT_ASCII (o)

True if `o' uses the @ref{1381,,PyASCIIObject} structure.


Added in version 3.3.

@end deffn
@end deffn

The following APIs are C macros and static inlined functions for fast checks and
access to internal read-only data of Unicode objects:

@geindex PyUnicode_Check (C function)
@anchor{c-api/unicode c PyUnicode_Check}@anchor{56ba}
@deffn {C Function} int PyUnicode_Check (PyObject *obj)

Return true if the object `obj' is a Unicode object or an instance of a Unicode
subtype.  This function always succeeds.
@end deffn

@geindex PyUnicode_CheckExact (C function)
@anchor{c-api/unicode c PyUnicode_CheckExact}@anchor{56bb}
@deffn {C Function} int PyUnicode_CheckExact (PyObject *obj)

Return true if the object `obj' is a Unicode object, but not an instance of a
subtype.  This function always succeeds.
@end deffn

@geindex PyUnicode_GET_LENGTH (C function)
@anchor{c-api/unicode c PyUnicode_GET_LENGTH}@anchor{ab7}
@deffn {C Function} @ref{c5b,,Py_ssize_t} PyUnicode_GET_LENGTH (PyObject *unicode)

Return the length of the Unicode string, in code points.  `unicode' has to be a
Unicode object in the “canonical” representation (not checked).


Added in version 3.3.

@end deffn

@geindex PyUnicode_1BYTE_DATA (C function)
@geindex PyUnicode_2BYTE_DATA (C function)
@geindex PyUnicode_4BYTE_DATA (C function)
@anchor{c-api/unicode c PyUnicode_1BYTE_DATA}@anchor{1386}
@deffn {C Function} @ref{137f,,Py_UCS1} *PyUnicode_1BYTE_DATA (PyObject *unicode)
@anchor{c-api/unicode c PyUnicode_2BYTE_DATA}@anchor{1387}
@deffnx {C Function} @ref{1380,,Py_UCS2} *PyUnicode_2BYTE_DATA (PyObject *unicode)
@anchor{c-api/unicode c PyUnicode_4BYTE_DATA}@anchor{1388}
@deffnx {C Function} @ref{33b,,Py_UCS4} *PyUnicode_4BYTE_DATA (PyObject *unicode)

Return a pointer to the canonical representation cast to UCS1, UCS2 or UCS4
integer types for direct character access.  No checks are performed if the
canonical representation has the correct character size; use
@ref{1389,,PyUnicode_KIND()} to select the right function.


Added in version 3.3.

@end deffn

@geindex PyUnicode_1BYTE_KIND (C macro)
@geindex PyUnicode_2BYTE_KIND (C macro)
@geindex PyUnicode_4BYTE_KIND (C macro)
@anchor{c-api/unicode c PyUnicode_1BYTE_KIND}@anchor{138a}
@deffn {C Macro} PyUnicode_1BYTE_KIND
@anchor{c-api/unicode c PyUnicode_2BYTE_KIND}@anchor{138b}
@deffnx {C Macro} PyUnicode_2BYTE_KIND
@anchor{c-api/unicode c PyUnicode_4BYTE_KIND}@anchor{138c}
@deffnx {C Macro} PyUnicode_4BYTE_KIND

Return values of the @ref{1389,,PyUnicode_KIND()} macro.


Added in version 3.3.



Changed in version 3.12: @code{PyUnicode_WCHAR_KIND} has been removed.

@end deffn

@geindex PyUnicode_KIND (C function)
@anchor{c-api/unicode c PyUnicode_KIND}@anchor{1389}
@deffn {C Function} int PyUnicode_KIND (PyObject *unicode)

Return one of the PyUnicode kind constants (see above) that indicate how many
bytes per character this Unicode object uses to store its data.  `unicode' has to
be a Unicode object in the “canonical” representation (not checked).


Added in version 3.3.

@end deffn

@geindex PyUnicode_DATA (C function)
@anchor{c-api/unicode c PyUnicode_DATA}@anchor{1385}
@deffn {C Function} void *PyUnicode_DATA (PyObject *unicode)

Return a void pointer to the raw Unicode buffer.  `unicode' has to be a Unicode
object in the “canonical” representation (not checked).


Added in version 3.3.

@end deffn

@geindex PyUnicode_WRITE (C function)
@anchor{c-api/unicode c PyUnicode_WRITE}@anchor{138f}
@deffn {C Function} void PyUnicode_WRITE (int kind, void *data, Py_ssize_t index, Py_UCS4 value)

Write the code point `value' to the given zero-based `index' in a string.

The `kind' value and `data' pointer must have been obtained from a
string using @ref{1389,,PyUnicode_KIND()} and @ref{1385,,PyUnicode_DATA()}
respectively. You must hold a reference to that string while calling
@code{PyUnicode_WRITE()}. All requirements of
@ref{137e,,PyUnicode_WriteChar()} also apply.

The function performs no checks for any of its requirements,
and is intended for usage in loops.


Added in version 3.3.

@end deffn

@geindex PyUnicode_READ (C function)
@anchor{c-api/unicode c PyUnicode_READ}@anchor{138d}
@deffn {C Function} @ref{33b,,Py_UCS4} PyUnicode_READ (int kind, void *data, Py_ssize_t index)

Read a code point from a canonical representation `data' (as obtained with
@ref{1385,,PyUnicode_DATA()}).  No checks or ready calls are performed.


Added in version 3.3.

@end deffn

@geindex PyUnicode_READ_CHAR (C function)
@anchor{c-api/unicode c PyUnicode_READ_CHAR}@anchor{138e}
@deffn {C Function} @ref{33b,,Py_UCS4} PyUnicode_READ_CHAR (PyObject *unicode, Py_ssize_t index)

Read a character from a Unicode object `unicode', which must be in the “canonical”
representation.  This is less efficient than @ref{138d,,PyUnicode_READ()} if you
do multiple consecutive reads.


Added in version 3.3.

@end deffn

@geindex PyUnicode_MAX_CHAR_VALUE (C function)
@anchor{c-api/unicode c PyUnicode_MAX_CHAR_VALUE}@anchor{1390}
@deffn {C Function} @ref{33b,,Py_UCS4} PyUnicode_MAX_CHAR_VALUE (PyObject *unicode)

Return the maximum code point that is suitable for creating another string
based on `unicode', which must be in the “canonical” representation.  This is
always an approximation but more efficient than iterating over the string.


Added in version 3.3.

@end deffn

@geindex PyUnicode_IsIdentifier (C function)
@anchor{c-api/unicode c PyUnicode_IsIdentifier}@anchor{1dca}
@deffn {C Function} int PyUnicode_IsIdentifier (PyObject *unicode)
` Part of the @ref{776,,Stable ABI}.'
Return @code{1} if the string is a valid identifier according to the language
definition, section @ref{22e4,,Names (identifiers and keywords)}. Return @code{0} otherwise.


Changed in version 3.9: The function does not call @ref{b80,,Py_FatalError()} anymore if the string
is not ready.

@end deffn

@geindex PyUnicode_IS_ASCII (C function)
@anchor{c-api/unicode c PyUnicode_IS_ASCII}@anchor{56bc}
@deffn {C Function} unsigned int PyUnicode_IS_ASCII (PyObject *unicode)

Return true if the string only contains ASCII characters.
Equivalent to @ref{cef,,str.isascii()}.


Added in version 3.2.

@end deffn

@node Unicode Character Properties,Creating and accessing Unicode strings,Unicode Type,Unicode Objects
@anchor{c-api/unicode unicode-character-properties}@anchor{56bd}
@subsubsection Unicode Character Properties


Unicode provides many different character properties. The most often needed ones
are available through these macros which are mapped to C functions depending on
the Python configuration.

@geindex Py_UNICODE_ISSPACE (C function)
@anchor{c-api/unicode c Py_UNICODE_ISSPACE}@anchor{1d06}
@deffn {C Function} int Py_UNICODE_ISSPACE (Py_UCS4 ch)

Return @code{1} or @code{0} depending on whether `ch' is a whitespace character.
@end deffn

@geindex Py_UNICODE_ISLOWER (C function)
@anchor{c-api/unicode c Py_UNICODE_ISLOWER}@anchor{56be}
@deffn {C Function} int Py_UNICODE_ISLOWER (Py_UCS4 ch)

Return @code{1} or @code{0} depending on whether `ch' is a lowercase character.
@end deffn

@geindex Py_UNICODE_ISUPPER (C function)
@anchor{c-api/unicode c Py_UNICODE_ISUPPER}@anchor{56bf}
@deffn {C Function} int Py_UNICODE_ISUPPER (Py_UCS4 ch)

Return @code{1} or @code{0} depending on whether `ch' is an uppercase character.
@end deffn

@geindex Py_UNICODE_ISTITLE (C function)
@anchor{c-api/unicode c Py_UNICODE_ISTITLE}@anchor{56c0}
@deffn {C Function} int Py_UNICODE_ISTITLE (Py_UCS4 ch)

Return @code{1} or @code{0} depending on whether `ch' is a titlecase character.
@end deffn

@geindex Py_UNICODE_ISLINEBREAK (C function)
@anchor{c-api/unicode c Py_UNICODE_ISLINEBREAK}@anchor{56c1}
@deffn {C Function} int Py_UNICODE_ISLINEBREAK (Py_UCS4 ch)

Return @code{1} or @code{0} depending on whether `ch' is a linebreak character.
@end deffn

@geindex Py_UNICODE_ISDECIMAL (C function)
@anchor{c-api/unicode c Py_UNICODE_ISDECIMAL}@anchor{56c2}
@deffn {C Function} int Py_UNICODE_ISDECIMAL (Py_UCS4 ch)

Return @code{1} or @code{0} depending on whether `ch' is a decimal character.
@end deffn

@geindex Py_UNICODE_ISDIGIT (C function)
@anchor{c-api/unicode c Py_UNICODE_ISDIGIT}@anchor{56c3}
@deffn {C Function} int Py_UNICODE_ISDIGIT (Py_UCS4 ch)

Return @code{1} or @code{0} depending on whether `ch' is a digit character.
@end deffn

@geindex Py_UNICODE_ISNUMERIC (C function)
@anchor{c-api/unicode c Py_UNICODE_ISNUMERIC}@anchor{56c4}
@deffn {C Function} int Py_UNICODE_ISNUMERIC (Py_UCS4 ch)

Return @code{1} or @code{0} depending on whether `ch' is a numeric character.
@end deffn

@geindex Py_UNICODE_ISALPHA (C function)
@anchor{c-api/unicode c Py_UNICODE_ISALPHA}@anchor{56c5}
@deffn {C Function} int Py_UNICODE_ISALPHA (Py_UCS4 ch)

Return @code{1} or @code{0} depending on whether `ch' is an alphabetic character.
@end deffn

@geindex Py_UNICODE_ISALNUM (C function)
@anchor{c-api/unicode c Py_UNICODE_ISALNUM}@anchor{56c6}
@deffn {C Function} int Py_UNICODE_ISALNUM (Py_UCS4 ch)

Return @code{1} or @code{0} depending on whether `ch' is an alphanumeric character.
@end deffn

@geindex Py_UNICODE_ISPRINTABLE (C function)
@anchor{c-api/unicode c Py_UNICODE_ISPRINTABLE}@anchor{56c7}
@deffn {C Function} int Py_UNICODE_ISPRINTABLE (Py_UCS4 ch)

Return @code{1} or @code{0} depending on whether `ch' is a printable character,
in the sense of @ref{fde,,str.isprintable()}.
@end deffn

These APIs can be used for fast direct character conversions:

@geindex Py_UNICODE_TOLOWER (C function)
@anchor{c-api/unicode c Py_UNICODE_TOLOWER}@anchor{56c8}
@deffn {C Function} @ref{33b,,Py_UCS4} Py_UNICODE_TOLOWER (Py_UCS4 ch)

Return the character `ch' converted to lower case.
@end deffn

@geindex Py_UNICODE_TOUPPER (C function)
@anchor{c-api/unicode c Py_UNICODE_TOUPPER}@anchor{56c9}
@deffn {C Function} @ref{33b,,Py_UCS4} Py_UNICODE_TOUPPER (Py_UCS4 ch)

Return the character `ch' converted to upper case.
@end deffn

@geindex Py_UNICODE_TOTITLE (C function)
@anchor{c-api/unicode c Py_UNICODE_TOTITLE}@anchor{56ca}
@deffn {C Function} @ref{33b,,Py_UCS4} Py_UNICODE_TOTITLE (Py_UCS4 ch)

Return the character `ch' converted to title case.
@end deffn

@geindex Py_UNICODE_TODECIMAL (C function)
@anchor{c-api/unicode c Py_UNICODE_TODECIMAL}@anchor{56cb}
@deffn {C Function} int Py_UNICODE_TODECIMAL (Py_UCS4 ch)

Return the character `ch' converted to a decimal positive integer.  Return
@code{-1} if this is not possible.  This function does not raise exceptions.
@end deffn

@geindex Py_UNICODE_TODIGIT (C function)
@anchor{c-api/unicode c Py_UNICODE_TODIGIT}@anchor{56cc}
@deffn {C Function} int Py_UNICODE_TODIGIT (Py_UCS4 ch)

Return the character `ch' converted to a single digit integer. Return @code{-1} if
this is not possible.  This function does not raise exceptions.
@end deffn

@geindex Py_UNICODE_TONUMERIC (C function)
@anchor{c-api/unicode c Py_UNICODE_TONUMERIC}@anchor{56cd}
@deffn {C Function} double Py_UNICODE_TONUMERIC (Py_UCS4 ch)

Return the character `ch' converted to a double. Return @code{-1.0} if this is not
possible.  This function does not raise exceptions.
@end deffn

These APIs can be used to work with surrogates:

@geindex Py_UNICODE_IS_SURROGATE (C function)
@anchor{c-api/unicode c Py_UNICODE_IS_SURROGATE}@anchor{56ce}
@deffn {C Function} int Py_UNICODE_IS_SURROGATE (Py_UCS4 ch)

Check if `ch' is a surrogate (@code{0xD800 <= ch <= 0xDFFF}).
@end deffn

@geindex Py_UNICODE_IS_HIGH_SURROGATE (C function)
@anchor{c-api/unicode c Py_UNICODE_IS_HIGH_SURROGATE}@anchor{56cf}
@deffn {C Function} int Py_UNICODE_IS_HIGH_SURROGATE (Py_UCS4 ch)

Check if `ch' is a high surrogate (@code{0xD800 <= ch <= 0xDBFF}).
@end deffn

@geindex Py_UNICODE_IS_LOW_SURROGATE (C function)
@anchor{c-api/unicode c Py_UNICODE_IS_LOW_SURROGATE}@anchor{56d0}
@deffn {C Function} int Py_UNICODE_IS_LOW_SURROGATE (Py_UCS4 ch)

Check if `ch' is a low surrogate (@code{0xDC00 <= ch <= 0xDFFF}).
@end deffn

@geindex Py_UNICODE_HIGH_SURROGATE (C function)
@anchor{c-api/unicode c Py_UNICODE_HIGH_SURROGATE}@anchor{56d1}
@deffn {C Function} @ref{33b,,Py_UCS4} Py_UNICODE_HIGH_SURROGATE (Py_UCS4 ch)

Return the high UTF-16 surrogate (@code{0xD800} to @code{0xDBFF}) for a Unicode
code point in the range @code{[0x10000; 0x10FFFF]}.
@end deffn

@geindex Py_UNICODE_LOW_SURROGATE (C function)
@anchor{c-api/unicode c Py_UNICODE_LOW_SURROGATE}@anchor{56d2}
@deffn {C Function} @ref{33b,,Py_UCS4} Py_UNICODE_LOW_SURROGATE (Py_UCS4 ch)

Return the low UTF-16 surrogate (@code{0xDC00} to @code{0xDFFF}) for a Unicode
code point in the range @code{[0x10000; 0x10FFFF]}.
@end deffn

@geindex Py_UNICODE_JOIN_SURROGATES (C function)
@anchor{c-api/unicode c Py_UNICODE_JOIN_SURROGATES}@anchor{56d3}
@deffn {C Function} @ref{33b,,Py_UCS4} Py_UNICODE_JOIN_SURROGATES (Py_UCS4 high, Py_UCS4 low)

Join two surrogate code points and return a single @ref{33b,,Py_UCS4} value.
`high' and `low' are respectively the leading and trailing surrogates in a
surrogate pair. `high' must be in the range @code{[0xD800; 0xDBFF]} and `low' must
be in the range @code{[0xDC00; 0xDFFF]}.
@end deffn

@node Creating and accessing Unicode strings,Locale Encoding,Unicode Character Properties,Unicode Objects
@anchor{c-api/unicode creating-and-accessing-unicode-strings}@anchor{56d4}
@subsubsection Creating and accessing Unicode strings


To create Unicode objects and access their basic sequence properties, use these
APIs:

@geindex PyUnicode_New (C function)
@anchor{c-api/unicode c PyUnicode_New}@anchor{aaf}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicode_New (Py_ssize_t size, Py_UCS4 maxchar)
`Return value: New reference.'
Create a new Unicode object.  `maxchar' should be the true maximum code point
to be placed in the string.  As an approximation, it can be rounded up to the
nearest value in the sequence 127, 255, 65535, 1114111.

On error, set an exception and return @code{NULL}.

After creation, the string can be filled by @ref{137e,,PyUnicode_WriteChar()},
@ref{ab8,,PyUnicode_CopyCharacters()}, @ref{1399,,PyUnicode_Fill()},
@ref{138f,,PyUnicode_WRITE()} or similar.
Since strings are supposed to be immutable, take care to not “use” the
result while it is being modified. In particular, before it’s filled
with its final contents, a string:


@itemize -

@item 
must not be hashed,

@item 
must not be @ref{a9f,,converted to UTF-8},
or another non-“canonical” representation,

@item 
must not have its reference count changed,

@item 
must not be shared with code that might do one of the above.
@end itemize

This list is not exhaustive. Avoiding these uses is your responsibility;
Python does not always check these requirements.

To avoid accidentally exposing a partially-written string object, prefer
using the @ref{3b1,,PyUnicodeWriter} API, or one of the @code{PyUnicode_From*}
functions below.


Added in version 3.3.

@end deffn

@geindex PyUnicode_FromKindAndData (C function)
@anchor{c-api/unicode c PyUnicode_FromKindAndData}@anchor{1383}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicode_FromKindAndData (int kind, const void *buffer, Py_ssize_t size)
`Return value: New reference.'
Create a new Unicode object with the given `kind' (possible values are
@ref{138a,,PyUnicode_1BYTE_KIND} etc., as returned by
@ref{1389,,PyUnicode_KIND()}).  The `buffer' must point to an array of `size'
units of 1, 2 or 4 bytes per character, as given by the kind.

If necessary, the input `buffer' is copied and transformed into the
canonical representation.  For example, if the `buffer' is a UCS4 string
(@ref{138c,,PyUnicode_4BYTE_KIND}) and it consists only of codepoints in
the UCS1 range, it will be transformed into UCS1
(@ref{138a,,PyUnicode_1BYTE_KIND}).


Added in version 3.3.

@end deffn

@geindex PyUnicode_FromStringAndSize (C function)
@anchor{c-api/unicode c PyUnicode_FromStringAndSize}@anchor{5473}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicode_FromStringAndSize (const char *str, Py_ssize_t size)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Create a Unicode object from the char buffer `str'.  The bytes will be
interpreted as being UTF-8 encoded.  The buffer is copied into the new
object.
The return value might be a shared object, i.e. modification of the data is
not allowed.

This function raises @ref{796,,SystemError} when:


@itemize *

@item 
`size' < 0,

@item 
`str' is @code{NULL} and `size' > 0
@end itemize


Changed in version 3.12: `str' == @code{NULL} with `size' > 0 is not allowed anymore.

@end deffn

@geindex PyUnicode_FromString (C function)
@anchor{c-api/unicode c PyUnicode_FromString}@anchor{5472}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicode_FromString (const char *str)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Create a Unicode object from a UTF-8 encoded null-terminated char buffer
`str'.
@end deffn

@geindex PyUnicode_FromFormat (C function)
@anchor{c-api/unicode c PyUnicode_FromFormat}@anchor{62b}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicode_FromFormat (const char *format, ...)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Take a C @code{printf()}-style `format' string and a variable number of
arguments, calculate the size of the resulting Python Unicode string and return
a string with the values formatted into it.  The variable arguments must be C
types and must correspond exactly to the format characters in the `format'
ASCII-encoded string.

A conversion specifier contains two or more characters and has the following
components, which must occur in this order:


@enumerate 

@item 
The @code{'%'} character, which marks the start of the specifier.

@item 
Conversion flags (optional), which affect the result of some conversion
types.

@item 
Minimum field width (optional).
If specified as an @code{'*'} (asterisk), the actual width is given in the
next argument, which must be of type int, and the object to
convert comes after the minimum field width and optional precision.

@item 
Precision (optional), given as a @code{'.'} (dot) followed by the precision.
If specified as @code{'*'} (an asterisk), the actual precision is given in
the next argument, which must be of type int, and the value to
convert comes after the precision.

@item 
Length modifier (optional).

@item 
Conversion type.
@end enumerate

The conversion flag characters are:


@multitable {xxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Flag

@tab

Meaning

@item

@code{0}

@tab

The conversion will be zero padded for numeric values.

@item

@code{-}

@tab

The converted value is left adjusted (overrides the @code{0}
flag if both are given).

@end multitable


The length modifiers for following integer conversions (@code{d}, @code{i},
@code{o}, @code{u}, @code{x}, or @code{X}) specify the type of the argument
(int by default):


@multitable {xxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Modifier

@tab

Types

@item

@code{l}

@tab

long or unsigned long

@item

@code{ll}

@tab

long long or unsigned long long

@item

@code{j}

@tab

@code{intmax_t} or @code{uintmax_t}

@item

@code{z}

@tab

@code{size_t} or @code{ssize_t}

@item

@code{t}

@tab

@code{ptrdiff_t}

@end multitable


The length modifier @code{l} for following conversions @code{s} or @code{V} specify
that the type of the argument is const wchar_t*.

The conversion specifiers are:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Conversion Specifier

@tab

Type

@tab

Comment

@item

@code{%}

@tab

`n/a'

@tab

The literal @code{%} character.

@item

@code{d}, @code{i}

@tab

Specified by the length modifier

@tab

The decimal representation of a signed C integer.

@item

@code{u}

@tab

Specified by the length modifier

@tab

The decimal representation of an unsigned C integer.

@item

@code{o}

@tab

Specified by the length modifier

@tab

The octal representation of an unsigned C integer.

@item

@code{x}

@tab

Specified by the length modifier

@tab

The hexadecimal representation of an unsigned C integer (lowercase).

@item

@code{X}

@tab

Specified by the length modifier

@tab

The hexadecimal representation of an unsigned C integer (uppercase).

@item

@code{c}

@tab

int

@tab

A single character.

@item

@code{s}

@tab

const char* or const wchar_t*

@tab

A null-terminated C character array.

@item

@code{p}

@tab

const void*

@tab

The hex representation of a C  pointer.
Mostly equivalent to @code{printf("%p")} except that it is guaranteed to
start with the literal @code{0x} regardless of what the platform’s
@code{printf} yields.

@item

@code{A}

@tab

@ref{5df,,PyObject}*

@tab

The result of calling @ref{15f2,,ascii()}.

@item

@code{U}

@tab

@ref{5df,,PyObject}*

@tab

A Unicode object.

@item

@code{V}

@tab

@ref{5df,,PyObject}*, const char* or const wchar_t*

@tab

A Unicode object (which may be @code{NULL}) and a null-terminated
C character array as a second parameter (which will be used,
if the first parameter is @code{NULL}).

@item

@code{S}

@tab

@ref{5df,,PyObject}*

@tab

The result of calling @ref{1236,,PyObject_Str()}.

@item

@code{R}

@tab

@ref{5df,,PyObject}*

@tab

The result of calling @ref{1235,,PyObject_Repr()}.

@item

@code{T}

@tab

@ref{5df,,PyObject}*

@tab

Get the fully qualified name of an object type;
call @ref{616,,PyType_GetFullyQualifiedName()}.

@item

@code{#T}

@tab

@ref{5df,,PyObject}*

@tab

Similar to @code{T} format, but use a colon (@code{:}) as separator between
the module name and the qualified name.

@item

@code{N}

@tab

@ref{ca2,,PyTypeObject}*

@tab

Get the fully qualified name of a type;
call @ref{616,,PyType_GetFullyQualifiedName()}.

@item

@code{#N}

@tab

@ref{ca2,,PyTypeObject}*

@tab

Similar to @code{N} format, but use a colon (@code{:}) as separator between
the module name and the qualified name.

@end multitable


@cartouche
@quotation Note 
The width formatter unit is number of characters rather than bytes.
The precision formatter unit is number of bytes or @code{wchar_t}
items (if the length modifier @code{l} is used) for @code{"%s"} and
@code{"%V"} (if the @code{PyObject*} argument is @code{NULL}), and a number of
characters for @code{"%A"}, @code{"%U"}, @code{"%S"}, @code{"%R"} and @code{"%V"}
(if the @code{PyObject*} argument is not @code{NULL}).
@end quotation
@end cartouche

@cartouche
@quotation Note 
Unlike to C @code{printf()} the @code{0} flag has effect even when
a precision is given for integer conversions (@code{d}, @code{i}, @code{u}, @code{o},
@code{x}, or @code{X}).
@end quotation
@end cartouche


Changed in version 3.2: Support for @code{"%lld"} and @code{"%llu"} added.



Changed in version 3.3: Support for @code{"%li"}, @code{"%lli"} and @code{"%zi"} added.



Changed in version 3.4: Support width and precision formatter for @code{"%s"}, @code{"%A"}, @code{"%U"},
@code{"%V"}, @code{"%S"}, @code{"%R"} added.



Changed in version 3.12: Support for conversion specifiers @code{o} and @code{X}.
Support for length modifiers @code{j} and @code{t}.
Length modifiers are now applied to all integer conversions.
Length modifier @code{l} is now applied to conversion specifiers @code{s} and @code{V}.
Support for variable width and precision @code{*}.
Support for flag @code{-}.

An unrecognized format character now sets a @ref{796,,SystemError}.
In previous versions it caused all the rest of the format string to be
copied as-is to the result string, and any extra arguments discarded.



Changed in version 3.13: Support for @code{%T}, @code{%#T}, @code{%N} and @code{%#N} formats added.

@end deffn

@geindex PyUnicode_FromFormatV (C function)
@anchor{c-api/unicode c PyUnicode_FromFormatV}@anchor{795}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicode_FromFormatV (const char *format, va_list vargs)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Identical to @ref{62b,,PyUnicode_FromFormat()} except that it takes exactly two
arguments.
@end deffn

@geindex PyUnicode_FromObject (C function)
@anchor{c-api/unicode c PyUnicode_FromObject}@anchor{5470}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicode_FromObject (PyObject *obj)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Copy an instance of a Unicode subtype to a new true Unicode object if
necessary. If `obj' is already a true Unicode object (not a subtype),
return a new @ref{5e2,,strong reference} to the object.

Objects other than Unicode or its subtypes will cause a @ref{199,,TypeError}.
@end deffn

@geindex PyUnicode_FromOrdinal (C function)
@anchor{c-api/unicode c PyUnicode_FromOrdinal}@anchor{5471}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicode_FromOrdinal (int ordinal)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Create a Unicode Object from the given Unicode code point `ordinal'.

The ordinal must be in @code{range(0x110000)}. A @ref{2ee,,ValueError} is
raised in the case it is not.
@end deffn

@geindex PyUnicode_FromEncodedObject (C function)
@anchor{c-api/unicode c PyUnicode_FromEncodedObject}@anchor{546f}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicode_FromEncodedObject (PyObject *obj, const char *encoding, const char *errors)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Decode an encoded object `obj' to a Unicode object.

@ref{193,,bytes}, @ref{342,,bytearray} and other
@ref{194,,bytes-like objects}
are decoded according to the given `encoding' and using the error handling
defined by `errors'. Both can be @code{NULL} to have the interface use the default
values (see @ref{56d5,,Built-in Codecs} for details).

All other objects, including Unicode objects, cause a @ref{199,,TypeError} to be
set.

The API returns @code{NULL} if there was an error.  The caller is responsible for
decref’ing the returned objects.
@end deffn

@geindex PyUnicode_Append (C function)
@anchor{c-api/unicode c PyUnicode_Append}@anchor{5454}
@deffn {C Function} void PyUnicode_Append (PyObject **p_left, PyObject *right)
` Part of the @ref{776,,Stable ABI}.'
Append the string `right' to the end of `p_left'.
`p_left' must point to a @ref{5e2,,strong reference} to a Unicode object;
@code{PyUnicode_Append()} releases (“steals”) this reference.

On error, set `*p_left' to @code{NULL} and set an exception.

On success, set `*p_left' to a new strong reference to the result.
@end deffn

@geindex PyUnicode_AppendAndDel (C function)
@anchor{c-api/unicode c PyUnicode_AppendAndDel}@anchor{5455}
@deffn {C Function} void PyUnicode_AppendAndDel (PyObject **p_left, PyObject *right)
` Part of the @ref{776,,Stable ABI}.'
The function is similar to @ref{5454,,PyUnicode_Append()}, with the only
difference being that it decrements the reference count of `right' by one.
@end deffn

@geindex PyUnicode_BuildEncodingMap (C function)
@anchor{c-api/unicode c PyUnicode_BuildEncodingMap}@anchor{1aa8}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicode_BuildEncodingMap (PyObject *string)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Return a mapping suitable for decoding a custom single-byte encoding.
Given a Unicode string `string' of up to 256 characters representing an encoding
table, returns either a compact internal mapping object or a dictionary
mapping character ordinals to byte values. Raises a @ref{199,,TypeError} and
return @code{NULL} on invalid input.


Added in version 3.2.

@end deffn

@geindex PyUnicode_GetDefaultEncoding (C function)
@anchor{c-api/unicode c PyUnicode_GetDefaultEncoding}@anchor{5474}
@deffn {C Function} const char *PyUnicode_GetDefaultEncoding (void)
` Part of the @ref{776,,Stable ABI}.'
Return the name of the default string encoding, @code{"utf-8"}.
See @ref{4c76,,sys.getdefaultencoding()}.

The returned string does not need to be freed, and is valid
until interpreter shutdown.
@end deffn

@geindex PyUnicode_GetLength (C function)
@anchor{c-api/unicode c PyUnicode_GetLength}@anchor{ab6}
@deffn {C Function} @ref{c5b,,Py_ssize_t} PyUnicode_GetLength (PyObject *unicode)
` Part of the @ref{776,,Stable ABI} since version 3.7.'
Return the length of the Unicode object, in code points.

On error, set an exception and return @code{-1}.


Added in version 3.3.

@end deffn

@geindex PyUnicode_CopyCharacters (C function)
@anchor{c-api/unicode c PyUnicode_CopyCharacters}@anchor{ab8}
@deffn {C Function} @ref{c5b,,Py_ssize_t} PyUnicode_CopyCharacters (PyObject *to, Py_ssize_t to_start, PyObject *from, Py_ssize_t from_start, Py_ssize_t how_many)

Copy characters from one Unicode object into another.  This function performs
character conversion when necessary and falls back to @code{memcpy()} if
possible.  Returns @code{-1} and sets an exception on error, otherwise returns
the number of copied characters.

The string must not have been “used” yet.
See @ref{aaf,,PyUnicode_New()} for details.


Added in version 3.3.

@end deffn

@geindex PyUnicode_Resize (C function)
@anchor{c-api/unicode c PyUnicode_Resize}@anchor{5476}
@deffn {C Function} int PyUnicode_Resize (PyObject **unicode, Py_ssize_t length);
` Part of the @ref{776,,Stable ABI}.'
Resize a Unicode object `*unicode' to the new `length' in code points.

Try to resize the string in place (which is usually faster than allocating
a new string and copying characters), or create a new string.

`*unicode' is modified to point to the new (resized) object and @code{0} is
returned on success. Otherwise, @code{-1} is returned and an exception is set,
and `*unicode' is left untouched.

The function doesn’t check string content, the result may not be a
string in canonical representation.
@end deffn

@geindex PyUnicode_Fill (C function)
@anchor{c-api/unicode c PyUnicode_Fill}@anchor{1399}
@deffn {C Function} @ref{c5b,,Py_ssize_t} PyUnicode_Fill (PyObject *unicode, Py_ssize_t start, Py_ssize_t length, Py_UCS4 fill_char)

Fill a string with a character: write `fill_char' into
@code{unicode[start:start+length]}.

Fail if `fill_char' is bigger than the string maximum character, or if the
string has more than 1 reference.

The string must not have been “used” yet.
See @ref{aaf,,PyUnicode_New()} for details.

Return the number of written characters, or return @code{-1} and raise an
exception on error.


Added in version 3.3.

@end deffn

@geindex PyUnicode_WriteChar (C function)
@anchor{c-api/unicode c PyUnicode_WriteChar}@anchor{137e}
@deffn {C Function} int PyUnicode_WriteChar (PyObject *unicode, Py_ssize_t index, Py_UCS4 character)
` Part of the @ref{776,,Stable ABI} since version 3.7.'
Write a `character' to the string `unicode' at the zero-based `index'.
Return @code{0} on success, @code{-1} on error with an exception set.

This function checks that `unicode' is a Unicode object, that the index is
not out of bounds, and that the object’s reference count is one.
See @ref{138f,,PyUnicode_WRITE()} for a version that skips these checks,
making them your responsibility.

The string must not have been “used” yet.
See @ref{aaf,,PyUnicode_New()} for details.


Added in version 3.3.

@end deffn

@geindex PyUnicode_ReadChar (C function)
@anchor{c-api/unicode c PyUnicode_ReadChar}@anchor{137d}
@deffn {C Function} @ref{33b,,Py_UCS4} PyUnicode_ReadChar (PyObject *unicode, Py_ssize_t index)
` Part of the @ref{776,,Stable ABI} since version 3.7.'
Read a character from a string.  This function checks that `unicode' is a
Unicode object and the index is not out of bounds, in contrast to
@ref{138e,,PyUnicode_READ_CHAR()}, which performs no error checking.

Return character on success, @code{-1} on error with an exception set.


Added in version 3.3.

@end deffn

@geindex PyUnicode_Substring (C function)
@anchor{c-api/unicode c PyUnicode_Substring}@anchor{ab9}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicode_Substring (PyObject *unicode, Py_ssize_t start, Py_ssize_t end)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI} since version 3.7.'
Return a substring of `unicode', from character index `start' (included) to
character index `end' (excluded).  Negative indices are not supported.
On error, set an exception and return @code{NULL}.


Added in version 3.3.

@end deffn

@geindex PyUnicode_AsUCS4 (C function)
@anchor{c-api/unicode c PyUnicode_AsUCS4}@anchor{1384}
@deffn {C Function} @ref{33b,,Py_UCS4} *PyUnicode_AsUCS4 (PyObject *unicode, Py_UCS4 *buffer, Py_ssize_t buflen, int copy_null)
` Part of the @ref{776,,Stable ABI} since version 3.7.'
Copy the string `unicode' into a UCS4 buffer, including a null character, if
`copy_null' is set.  Returns @code{NULL} and sets an exception on error (in
particular, a @ref{796,,SystemError} if `buflen' is smaller than the length of
`unicode').  `buffer' is returned on success.


Added in version 3.3.

@end deffn

@geindex PyUnicode_AsUCS4Copy (C function)
@anchor{c-api/unicode c PyUnicode_AsUCS4Copy}@anchor{abe}
@deffn {C Function} @ref{33b,,Py_UCS4} *PyUnicode_AsUCS4Copy (PyObject *unicode)
` Part of the @ref{776,,Stable ABI} since version 3.7.'
Copy the string `unicode' into a new UCS4 buffer that is allocated using
@ref{e66,,PyMem_Malloc()}.  If this fails, @code{NULL} is returned with a
@ref{1761,,MemoryError} set.  The returned buffer always has an extra
null code point appended.


Added in version 3.3.

@end deffn

@node Locale Encoding,File System Encoding,Creating and accessing Unicode strings,Unicode Objects
@anchor{c-api/unicode locale-encoding}@anchor{56d6}
@subsubsection Locale Encoding


The current locale encoding can be used to decode text from the operating
system.

@geindex PyUnicode_DecodeLocaleAndSize (C function)
@anchor{c-api/unicode c PyUnicode_DecodeLocaleAndSize}@anchor{dc8}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicode_DecodeLocaleAndSize (const char *str, Py_ssize_t length, const char *errors)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI} since version 3.7.'
Decode a string from UTF-8 on Android and VxWorks, or from the current
locale encoding on other platforms. The supported
error handlers are @code{"strict"} and @code{"surrogateescape"}
(
@geindex Python Enhancement Proposals; PEP 383
PEP 383@footnote{https://peps.python.org/pep-0383/}). The decoder uses @code{"strict"} error handler if
`errors' is @code{NULL}.  `str' must end with a null character but
cannot contain embedded null characters.

Use @ref{545f,,PyUnicode_DecodeFSDefaultAndSize()} to decode a string from
the @ref{75e,,filesystem encoding and error handler}.

This function ignores the @ref{868,,Python UTF-8 Mode}.


@subsubheading See also


The @ref{dc6,,Py_DecodeLocale()} function.



Added in version 3.3.



Changed in version 3.7: The function now also uses the current locale encoding for the
@code{surrogateescape} error handler, except on Android. Previously, @ref{dc6,,Py_DecodeLocale()}
was used for the @code{surrogateescape}, and the current locale encoding was
used for @code{strict}.

@end deffn

@geindex PyUnicode_DecodeLocale (C function)
@anchor{c-api/unicode c PyUnicode_DecodeLocale}@anchor{5461}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicode_DecodeLocale (const char *str, const char *errors)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI} since version 3.7.'
Similar to @ref{dc8,,PyUnicode_DecodeLocaleAndSize()}, but compute the string
length using @code{strlen()}.


Added in version 3.3.

@end deffn

@geindex PyUnicode_EncodeLocale (C function)
@anchor{c-api/unicode c PyUnicode_EncodeLocale}@anchor{dc9}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicode_EncodeLocale (PyObject *unicode, const char *errors)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI} since version 3.7.'
Encode a Unicode object to UTF-8 on Android and VxWorks, or to the current
locale encoding on other platforms. The
supported error handlers are @code{"strict"} and @code{"surrogateescape"}
(
@geindex Python Enhancement Proposals; PEP 383
PEP 383@footnote{https://peps.python.org/pep-0383/}). The encoder uses @code{"strict"} error handler if
`errors' is @code{NULL}. Return a @ref{193,,bytes} object. `unicode' cannot
contain embedded null characters.

Use @ref{1e73,,PyUnicode_EncodeFSDefault()} to encode a string to the
@ref{75e,,filesystem encoding and error handler}.

This function ignores the @ref{868,,Python UTF-8 Mode}.


@subsubheading See also


The @ref{dc7,,Py_EncodeLocale()} function.



Added in version 3.3.



Changed in version 3.7: The function now also uses the current locale encoding for the
@code{surrogateescape} error handler, except on Android. Previously,
@ref{dc7,,Py_EncodeLocale()}
was used for the @code{surrogateescape}, and the current locale encoding was
used for @code{strict}.

@end deffn

@node File System Encoding,wchar_t Support,Locale Encoding,Unicode Objects
@anchor{c-api/unicode file-system-encoding}@anchor{56d7}
@subsubsection File System Encoding


Functions encoding to and decoding from the @ref{75e,,filesystem encoding and error handler} (
@geindex Python Enhancement Proposals; PEP 383
PEP 383@footnote{https://peps.python.org/pep-0383/} and 
@geindex Python Enhancement Proposals; PEP 529
PEP 529@footnote{https://peps.python.org/pep-0529/}).

To encode file names to @ref{193,,bytes} during argument parsing, the @code{"O&"}
converter should be used, passing @code{PyUnicode_FSConverter()} as the
conversion function:

@geindex PyUnicode_FSConverter (C function)
@anchor{c-api/unicode c PyUnicode_FSConverter}@anchor{f1b}
@deffn {C Function} int PyUnicode_FSConverter (PyObject *obj, void *result)
` Part of the @ref{776,,Stable ABI}.'
@ref{3d3,,PyArg_Parse* converter}: encode @ref{16a,,str} objects – obtained directly or
through the @ref{e51,,os.PathLike} interface – to @ref{193,,bytes} using
@ref{1e73,,PyUnicode_EncodeFSDefault()}; @code{bytes} objects are output as-is.
`result' must be an address of a C variable of type @ref{5df,,PyObject}*
(or @ref{99a,,PyBytesObject}*).
On success, set the variable to a new @ref{5e2,,strong reference} to
a @ref{56a3,,bytes object} which must be released
when it is no longer used and return a non-zero value
(@ref{55a0,,Py_CLEANUP_SUPPORTED}).
Embedded null bytes are not allowed in the result.
On failure, return @code{0} with an exception set.

If `obj' is @code{NULL}, the function releases a strong reference
stored in the variable referred by `result' and returns @code{1}.


Added in version 3.1.



Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.

@end deffn

To decode file names to @ref{16a,,str} during argument parsing, the @code{"O&"}
converter should be used, passing @code{PyUnicode_FSDecoder()} as the
conversion function:

@geindex PyUnicode_FSDecoder (C function)
@anchor{c-api/unicode c PyUnicode_FSDecoder}@anchor{798}
@deffn {C Function} int PyUnicode_FSDecoder (PyObject *obj, void *result)
` Part of the @ref{776,,Stable ABI}.'
@ref{3d3,,PyArg_Parse* converter}: decode @ref{193,,bytes} objects – obtained either
directly or indirectly through the @ref{e51,,os.PathLike} interface – to
@ref{16a,,str} using @ref{545f,,PyUnicode_DecodeFSDefaultAndSize()}; @code{str}
objects are output as-is.
`result' must be an address of a C variable of type @ref{5df,,PyObject}*
(or @ref{99c,,PyUnicodeObject}*).
On success, set the variable to a new @ref{5e2,,strong reference} to
a @ref{56b5,,Unicode object} which must be released
when it is no longer used and return a non-zero value
(@ref{55a0,,Py_CLEANUP_SUPPORTED}).
Embedded null characters are not allowed in the result.
On failure, return @code{0} with an exception set.

If `obj' is @code{NULL}, release the strong reference
to the object referred to by `result' and return @code{1}.


Added in version 3.2.



Changed in version 3.6: Accepts a @ref{5a1,,path-like object}.

@end deffn

@geindex PyUnicode_DecodeFSDefaultAndSize (C function)
@anchor{c-api/unicode c PyUnicode_DecodeFSDefaultAndSize}@anchor{545f}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicode_DecodeFSDefaultAndSize (const char *str, Py_ssize_t size)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Decode a string from the @ref{75e,,filesystem encoding and error handler}.

If you need to decode a string from the current locale encoding, use
@ref{dc8,,PyUnicode_DecodeLocaleAndSize()}.


@subsubheading See also


The @ref{dc6,,Py_DecodeLocale()} function.



Changed in version 3.6: The @ref{75e,,filesystem error handler} is now used.

@end deffn

@geindex PyUnicode_DecodeFSDefault (C function)
@anchor{c-api/unicode c PyUnicode_DecodeFSDefault}@anchor{1ace}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicode_DecodeFSDefault (const char *str)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Decode a null-terminated string from the @ref{75e,,filesystem encoding and error handler}.

If the string length is known, use
@ref{545f,,PyUnicode_DecodeFSDefaultAndSize()}.


Changed in version 3.6: The @ref{75e,,filesystem error handler} is now used.

@end deffn

@geindex PyUnicode_EncodeFSDefault (C function)
@anchor{c-api/unicode c PyUnicode_EncodeFSDefault}@anchor{1e73}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicode_EncodeFSDefault (PyObject *unicode)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Encode a Unicode object to the @ref{75e,,filesystem encoding and error handler}, and return @ref{193,,bytes}. Note that the resulting @code{bytes}
object can contain null bytes.

If you need to encode a string to the current locale encoding, use
@ref{dc9,,PyUnicode_EncodeLocale()}.


@subsubheading See also


The @ref{dc7,,Py_EncodeLocale()} function.



Added in version 3.2.



Changed in version 3.6: The @ref{75e,,filesystem error handler} is now used.

@end deffn

@node wchar_t Support,,File System Encoding,Unicode Objects
@anchor{c-api/unicode wchar-t-support}@anchor{56d8}
@subsubsection wchar_t Support


@code{wchar_t} support for platforms which support it:

@geindex PyUnicode_FromWideChar (C function)
@anchor{c-api/unicode c PyUnicode_FromWideChar}@anchor{1398}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicode_FromWideChar (const wchar_t *wstr, Py_ssize_t size)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Create a Unicode object from the @code{wchar_t} buffer `wstr' of the given `size'.
Passing @code{-1} as the `size' indicates that the function must itself compute the length,
using @code{wcslen()}.
Return @code{NULL} on failure.
@end deffn

@geindex PyUnicode_AsWideChar (C function)
@anchor{c-api/unicode c PyUnicode_AsWideChar}@anchor{1e7a}
@deffn {C Function} @ref{c5b,,Py_ssize_t} PyUnicode_AsWideChar (PyObject *unicode, wchar_t *wstr, Py_ssize_t size)
` Part of the @ref{776,,Stable ABI}.'
Copy the Unicode object contents into the @code{wchar_t} buffer `wstr'.  At most
`size' @code{wchar_t} characters are copied (excluding a possibly trailing
null termination character).  Return the number of @code{wchar_t} characters
copied or @code{-1} in case of an error.

When `wstr' is @code{NULL}, instead return the `size' that would be required
to store all of `unicode' including a terminating null.

Note that the resulting wchar_t*
string may or may not be null-terminated.  It is the responsibility of the caller
to make sure that the wchar_t* string is null-terminated in case this is
required by the application. Also, note that the wchar_t* string
might contain null characters, which would cause the string to be truncated
when used with most C functions.
@end deffn

@geindex PyUnicode_AsWideCharString (C function)
@anchor{c-api/unicode c PyUnicode_AsWideCharString}@anchor{abf}
@deffn {C Function} wchar_t *PyUnicode_AsWideCharString (PyObject *unicode, Py_ssize_t *size)
` Part of the @ref{776,,Stable ABI} since version 3.7.'
Convert the Unicode object to a wide character string. The output string
always ends with a null character. If `size' is not @code{NULL}, write the number
of wide characters (excluding the trailing null termination character) into
`*size'. Note that the resulting @code{wchar_t} string might contain
null characters, which would cause the string to be truncated when used with
most C functions. If `size' is @code{NULL} and the wchar_t* string
contains null characters a @ref{2ee,,ValueError} is raised.

Returns a buffer allocated by @ref{1730,,PyMem_New} (use
@ref{164e,,PyMem_Free()} to free it) on success. On error, returns @code{NULL}
and `*size' is undefined. Raises a @ref{1761,,MemoryError} if memory allocation
is failed.


Added in version 3.2.



Changed in version 3.7: Raises a @ref{2ee,,ValueError} if `size' is @code{NULL} and the wchar_t*
string contains null characters.

@end deffn

@node Built-in Codecs,Methods and Slot Functions,Unicode Objects,Unicode Objects and Codecs
@anchor{c-api/unicode built-in-codecs}@anchor{56d9}@anchor{c-api/unicode builtincodecs}@anchor{56d5}
@subsubsection Built-in Codecs


Python provides a set of built-in codecs which are written in C for speed. All of
these codecs are directly usable via the following functions.

Many of the following APIs take two arguments encoding and errors, and they
have the same semantics as the ones of the built-in @ref{16a,,str()} string object
constructor.

Setting encoding to @code{NULL} causes the default encoding to be used
which is UTF-8.  The file system calls should use
@ref{f1b,,PyUnicode_FSConverter()} for encoding file names. This uses the
@ref{75e,,filesystem encoding and error handler} internally.

Error handling is set by errors which may also be set to @code{NULL} meaning to use
the default handling defined for the codec.  Default error handling for all
built-in codecs is “strict” (@ref{2ee,,ValueError} is raised).

The codecs all use a similar interface.  Only deviations from the following
generic ones are documented for simplicity.

@menu
* Generic Codecs:: 
* UTF-8 Codecs:: 
* UTF-32 Codecs:: 
* UTF-16 Codecs:: 
* UTF-7 Codecs:: 
* Unicode-Escape Codecs:: 
* Raw-Unicode-Escape Codecs:: 
* Latin-1 Codecs:: 
* ASCII Codecs:: 
* Character Map Codecs:: 
* MBCS codecs for Windows:: 

@end menu

@node Generic Codecs,UTF-8 Codecs,,Built-in Codecs
@anchor{c-api/unicode generic-codecs}@anchor{56da}
@subsubsection Generic Codecs


The following macro is provided:

@geindex Py_UNICODE_REPLACEMENT_CHARACTER (C macro)
@anchor{c-api/unicode c Py_UNICODE_REPLACEMENT_CHARACTER}@anchor{56db}
@deffn {C Macro} Py_UNICODE_REPLACEMENT_CHARACTER

The Unicode code point @code{U+FFFD} (replacement character).

This Unicode character is used as the replacement character during
decoding if the `errors' argument is set to “replace”.
@end deffn

These are the generic codec APIs:

@geindex PyUnicode_Decode (C function)
@anchor{c-api/unicode c PyUnicode_Decode}@anchor{1e09}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicode_Decode (const char *str, Py_ssize_t size, const char *encoding, const char *errors)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Create a Unicode object by decoding `size' bytes of the encoded string `str'.
`encoding' and `errors' have the same meaning as the parameters of the same name
in the @ref{16a,,str()} built-in function.  The codec to be used is looked up
using the Python codec registry.  Return @code{NULL} if an exception was raised by
the codec.
@end deffn

@geindex PyUnicode_AsEncodedString (C function)
@anchor{c-api/unicode c PyUnicode_AsEncodedString}@anchor{5457}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicode_AsEncodedString (PyObject *unicode, const char *encoding, const char *errors)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Encode a Unicode object and return the result as Python bytes object.
`encoding' and `errors' have the same meaning as the parameters of the same
name in the Unicode @ref{ad8,,encode()} method. The codec to be used is looked up
using the Python codec registry. Return @code{NULL} if an exception was raised by
the codec.
@end deffn

@node UTF-8 Codecs,UTF-32 Codecs,Generic Codecs,Built-in Codecs
@anchor{c-api/unicode utf-8-codecs}@anchor{56dc}
@subsubsection UTF-8 Codecs


These are the UTF-8 codec APIs:

@geindex PyUnicode_DecodeUTF8 (C function)
@anchor{c-api/unicode c PyUnicode_DecodeUTF8}@anchor{546b}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicode_DecodeUTF8 (const char *str, Py_ssize_t size, const char *errors)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Create a Unicode object by decoding `size' bytes of the UTF-8 encoded string
`str'. Return @code{NULL} if an exception was raised by the codec.
@end deffn

@geindex PyUnicode_DecodeUTF8Stateful (C function)
@anchor{c-api/unicode c PyUnicode_DecodeUTF8Stateful}@anchor{1b5b}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicode_DecodeUTF8Stateful (const char *str, Py_ssize_t size, const char *errors, Py_ssize_t *consumed)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
If `consumed' is @code{NULL}, behave like @ref{546b,,PyUnicode_DecodeUTF8()}. If
`consumed' is not @code{NULL}, trailing incomplete UTF-8 byte sequences will not be
treated as an error. Those bytes will not be decoded and the number of bytes
that have been decoded will be stored in `consumed'.
@end deffn

@geindex PyUnicode_AsUTF8String (C function)
@anchor{c-api/unicode c PyUnicode_AsUTF8String}@anchor{139a}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicode_AsUTF8String (PyObject *unicode)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Encode a Unicode object using UTF-8 and return the result as Python bytes
object.  Error handling is “strict”.  Return @code{NULL} if an exception was
raised by the codec.

The function fails if the string contains surrogate code points
(@code{U+D800} - @code{U+DFFF}).
@end deffn

@geindex PyUnicode_AsUTF8AndSize (C function)
@anchor{c-api/unicode c PyUnicode_AsUTF8AndSize}@anchor{a9f}
@deffn {C Function} const char *PyUnicode_AsUTF8AndSize (PyObject *unicode, Py_ssize_t *size)
` Part of the @ref{776,,Stable ABI} since version 3.10.'
Return a pointer to the UTF-8 encoding of the Unicode object, and
store the size of the encoded representation (in bytes) in `size'.  The
`size' argument can be @code{NULL}; in this case no size will be stored.  The
returned buffer always has an extra null byte appended (not included in
`size'), regardless of whether there are any other null code points.

On error, set an exception, set `size' to @code{-1} (if it’s not NULL) and
return @code{NULL}.

The function fails if the string contains surrogate code points
(@code{U+D800} - @code{U+DFFF}).

This caches the UTF-8 representation of the string in the Unicode object, and
subsequent calls will return a pointer to the same buffer.  The caller is not
responsible for deallocating the buffer. The buffer is deallocated and
pointers to it become invalid when the Unicode object is garbage collected.


Added in version 3.3.



Changed in version 3.7: The return type is now @code{const char *} rather than @code{char *}.



Changed in version 3.10: This function is a part of the @ref{637,,limited API}.

@end deffn

@geindex PyUnicode_AsUTF8 (C function)
@anchor{c-api/unicode c PyUnicode_AsUTF8}@anchor{422}
@deffn {C Function} const char *PyUnicode_AsUTF8 (PyObject *unicode)

As @ref{a9f,,PyUnicode_AsUTF8AndSize()}, but does not store the size.

@cartouche
@quotation Warning 
This function does not have any special behavior for
null characters@footnote{https://en.wikipedia.org/wiki/Null_character} embedded within
`unicode'. As a result, strings containing null characters will remain in the returned
string, which some C functions might interpret as the end of the string, leading to
truncation. If truncation is an issue, it is recommended to use @ref{a9f,,PyUnicode_AsUTF8AndSize()}
instead.
@end quotation
@end cartouche


Added in version 3.3.



Changed in version 3.7: The return type is now @code{const char *} rather than @code{char *}.

@end deffn

@node UTF-32 Codecs,UTF-16 Codecs,UTF-8 Codecs,Built-in Codecs
@anchor{c-api/unicode utf-32-codecs}@anchor{56dd}
@subsubsection UTF-32 Codecs


These are the UTF-32 codec APIs:

@geindex PyUnicode_DecodeUTF32 (C function)
@anchor{c-api/unicode c PyUnicode_DecodeUTF32}@anchor{5467}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicode_DecodeUTF32 (const char *str, Py_ssize_t size, const char *errors, int *byteorder)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Decode `size' bytes from a UTF-32 encoded buffer string and return the
corresponding Unicode object.  `errors' (if non-@code{NULL}) defines the error
handling. It defaults to “strict”.

If `byteorder' is non-@code{NULL}, the decoder starts decoding using the given byte
order:

@example
*byteorder == -1: little endian
*byteorder == 0:  native order
*byteorder == 1:  big endian
@end example

If @code{*byteorder} is zero, and the first four bytes of the input data are a
byte order mark (BOM), the decoder switches to this byte order and the BOM is
not copied into the resulting Unicode string.  If @code{*byteorder} is @code{-1} or
@code{1}, any byte order mark is copied to the output.

After completion, `*byteorder' is set to the current byte order at the end
of input data.

If `byteorder' is @code{NULL}, the codec starts in native order mode.

Return @code{NULL} if an exception was raised by the codec.
@end deffn

@geindex PyUnicode_DecodeUTF32Stateful (C function)
@anchor{c-api/unicode c PyUnicode_DecodeUTF32Stateful}@anchor{5468}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicode_DecodeUTF32Stateful (const char *str, Py_ssize_t size, const char *errors, int *byteorder, Py_ssize_t *consumed)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
If `consumed' is @code{NULL}, behave like @ref{5467,,PyUnicode_DecodeUTF32()}. If
`consumed' is not @code{NULL}, @ref{5468,,PyUnicode_DecodeUTF32Stateful()} will not treat
trailing incomplete UTF-32 byte sequences (such as a number of bytes not divisible
by four) as an error. Those bytes will not be decoded and the number of bytes
that have been decoded will be stored in `consumed'.
@end deffn

@geindex PyUnicode_AsUTF32String (C function)
@anchor{c-api/unicode c PyUnicode_AsUTF32String}@anchor{5459}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicode_AsUTF32String (PyObject *unicode)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Return a Python byte string using the UTF-32 encoding in native byte
order. The string always starts with a BOM mark.  Error handling is “strict”.
Return @code{NULL} if an exception was raised by the codec.
@end deffn

@node UTF-16 Codecs,UTF-7 Codecs,UTF-32 Codecs,Built-in Codecs
@anchor{c-api/unicode utf-16-codecs}@anchor{56de}
@subsubsection UTF-16 Codecs


These are the UTF-16 codec APIs:

@geindex PyUnicode_DecodeUTF16 (C function)
@anchor{c-api/unicode c PyUnicode_DecodeUTF16}@anchor{5465}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicode_DecodeUTF16 (const char *str, Py_ssize_t size, const char *errors, int *byteorder)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Decode `size' bytes from a UTF-16 encoded buffer string and return the
corresponding Unicode object.  `errors' (if non-@code{NULL}) defines the error
handling. It defaults to “strict”.

If `byteorder' is non-@code{NULL}, the decoder starts decoding using the given byte
order:

@example
*byteorder == -1: little endian
*byteorder == 0:  native order
*byteorder == 1:  big endian
@end example

If @code{*byteorder} is zero, and the first two bytes of the input data are a
byte order mark (BOM), the decoder switches to this byte order and the BOM is
not copied into the resulting Unicode string.  If @code{*byteorder} is @code{-1} or
@code{1}, any byte order mark is copied to the output (where it will result in
either a @code{\ufeff} or a @code{\ufffe} character).

After completion, @code{*byteorder} is set to the current byte order at the end
of input data.

If `byteorder' is @code{NULL}, the codec starts in native order mode.

Return @code{NULL} if an exception was raised by the codec.
@end deffn

@geindex PyUnicode_DecodeUTF16Stateful (C function)
@anchor{c-api/unicode c PyUnicode_DecodeUTF16Stateful}@anchor{5466}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicode_DecodeUTF16Stateful (const char *str, Py_ssize_t size, const char *errors, int *byteorder, Py_ssize_t *consumed)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
If `consumed' is @code{NULL}, behave like @ref{5465,,PyUnicode_DecodeUTF16()}. If
`consumed' is not @code{NULL}, @ref{5466,,PyUnicode_DecodeUTF16Stateful()} will not treat
trailing incomplete UTF-16 byte sequences (such as an odd number of bytes or a
split surrogate pair) as an error. Those bytes will not be decoded and the
number of bytes that have been decoded will be stored in `consumed'.
@end deffn

@geindex PyUnicode_AsUTF16String (C function)
@anchor{c-api/unicode c PyUnicode_AsUTF16String}@anchor{5458}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicode_AsUTF16String (PyObject *unicode)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Return a Python byte string using the UTF-16 encoding in native byte
order. The string always starts with a BOM mark.  Error handling is “strict”.
Return @code{NULL} if an exception was raised by the codec.
@end deffn

@node UTF-7 Codecs,Unicode-Escape Codecs,UTF-16 Codecs,Built-in Codecs
@anchor{c-api/unicode utf-7-codecs}@anchor{56df}
@subsubsection UTF-7 Codecs


These are the UTF-7 codec APIs:

@geindex PyUnicode_DecodeUTF7 (C function)
@anchor{c-api/unicode c PyUnicode_DecodeUTF7}@anchor{5469}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicode_DecodeUTF7 (const char *str, Py_ssize_t size, const char *errors)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Create a Unicode object by decoding `size' bytes of the UTF-7 encoded string
`str'.  Return @code{NULL} if an exception was raised by the codec.
@end deffn

@geindex PyUnicode_DecodeUTF7Stateful (C function)
@anchor{c-api/unicode c PyUnicode_DecodeUTF7Stateful}@anchor{546a}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicode_DecodeUTF7Stateful (const char *str, Py_ssize_t size, const char *errors, Py_ssize_t *consumed)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
If `consumed' is @code{NULL}, behave like @ref{5469,,PyUnicode_DecodeUTF7()}.  If
`consumed' is not @code{NULL}, trailing incomplete UTF-7 base-64 sections will not
be treated as an error.  Those bytes will not be decoded and the number of
bytes that have been decoded will be stored in `consumed'.
@end deffn

@node Unicode-Escape Codecs,Raw-Unicode-Escape Codecs,UTF-7 Codecs,Built-in Codecs
@anchor{c-api/unicode unicode-escape-codecs}@anchor{56e0}
@subsubsection Unicode-Escape Codecs


These are the “Unicode Escape” codec APIs:

@geindex PyUnicode_DecodeUnicodeEscape (C function)
@anchor{c-api/unicode c PyUnicode_DecodeUnicodeEscape}@anchor{546c}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicode_DecodeUnicodeEscape (const char *str, Py_ssize_t size, const char *errors)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Create a Unicode object by decoding `size' bytes of the Unicode-Escape encoded
string `str'.  Return @code{NULL} if an exception was raised by the codec.
@end deffn

@geindex PyUnicode_AsUnicodeEscapeString (C function)
@anchor{c-api/unicode c PyUnicode_AsUnicodeEscapeString}@anchor{139b}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicode_AsUnicodeEscapeString (PyObject *unicode)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Encode a Unicode object using Unicode-Escape and return the result as a
bytes object.  Error handling is “strict”.  Return @code{NULL} if an exception was
raised by the codec.
@end deffn

@node Raw-Unicode-Escape Codecs,Latin-1 Codecs,Unicode-Escape Codecs,Built-in Codecs
@anchor{c-api/unicode raw-unicode-escape-codecs}@anchor{56e1}
@subsubsection Raw-Unicode-Escape Codecs


These are the “Raw Unicode Escape” codec APIs:

@geindex PyUnicode_DecodeRawUnicodeEscape (C function)
@anchor{c-api/unicode c PyUnicode_DecodeRawUnicodeEscape}@anchor{5464}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicode_DecodeRawUnicodeEscape (const char *str, Py_ssize_t size, const char *errors)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Create a Unicode object by decoding `size' bytes of the Raw-Unicode-Escape
encoded string `str'.  Return @code{NULL} if an exception was raised by the codec.
@end deffn

@geindex PyUnicode_AsRawUnicodeEscapeString (C function)
@anchor{c-api/unicode c PyUnicode_AsRawUnicodeEscapeString}@anchor{139c}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicode_AsRawUnicodeEscapeString (PyObject *unicode)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Encode a Unicode object using Raw-Unicode-Escape and return the result as
a bytes object.  Error handling is “strict”.  Return @code{NULL} if an exception
was raised by the codec.
@end deffn

@node Latin-1 Codecs,ASCII Codecs,Raw-Unicode-Escape Codecs,Built-in Codecs
@anchor{c-api/unicode latin-1-codecs}@anchor{56e2}
@subsubsection Latin-1 Codecs


These are the Latin-1 codec APIs: Latin-1 corresponds to the first 256 Unicode
ordinals and only these are accepted by the codecs during encoding.

@geindex PyUnicode_DecodeLatin1 (C function)
@anchor{c-api/unicode c PyUnicode_DecodeLatin1}@anchor{5460}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicode_DecodeLatin1 (const char *str, Py_ssize_t size, const char *errors)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Create a Unicode object by decoding `size' bytes of the Latin-1 encoded string
`str'.  Return @code{NULL} if an exception was raised by the codec.
@end deffn

@geindex PyUnicode_AsLatin1String (C function)
@anchor{c-api/unicode c PyUnicode_AsLatin1String}@anchor{139d}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicode_AsLatin1String (PyObject *unicode)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Encode a Unicode object using Latin-1 and return the result as Python bytes
object.  Error handling is “strict”.  Return @code{NULL} if an exception was
raised by the codec.
@end deffn

@node ASCII Codecs,Character Map Codecs,Latin-1 Codecs,Built-in Codecs
@anchor{c-api/unicode ascii-codecs}@anchor{56e3}
@subsubsection ASCII Codecs


These are the ASCII codec APIs.  Only 7-bit ASCII data is accepted. All other
codes generate errors.

@geindex PyUnicode_DecodeASCII (C function)
@anchor{c-api/unicode c PyUnicode_DecodeASCII}@anchor{545c}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicode_DecodeASCII (const char *str, Py_ssize_t size, const char *errors)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Create a Unicode object by decoding `size' bytes of the ASCII encoded string
`str'.  Return @code{NULL} if an exception was raised by the codec.
@end deffn

@geindex PyUnicode_AsASCIIString (C function)
@anchor{c-api/unicode c PyUnicode_AsASCIIString}@anchor{139e}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicode_AsASCIIString (PyObject *unicode)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Encode a Unicode object using ASCII and return the result as Python bytes
object.  Error handling is “strict”.  Return @code{NULL} if an exception was
raised by the codec.
@end deffn

@node Character Map Codecs,MBCS codecs for Windows,ASCII Codecs,Built-in Codecs
@anchor{c-api/unicode character-map-codecs}@anchor{56e4}
@subsubsection Character Map Codecs


This codec is special in that it can be used to implement many different codecs
(and this is in fact what was done to obtain most of the standard codecs
included in the @code{encodings} package). The codec uses mappings to encode and
decode characters.  The mapping objects provided must support the
@ref{588,,__getitem__()} mapping interface; dictionaries and sequences work well.

These are the mapping codec APIs:

@geindex PyUnicode_DecodeCharmap (C function)
@anchor{c-api/unicode c PyUnicode_DecodeCharmap}@anchor{545d}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicode_DecodeCharmap (const char *str, Py_ssize_t length, PyObject *mapping, const char *errors)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Create a Unicode object by decoding `size' bytes of the encoded string `str'
using the given `mapping' object.  Return @code{NULL} if an exception was raised
by the codec.

If `mapping' is @code{NULL}, Latin-1 decoding will be applied.  Else
`mapping' must map bytes ordinals (integers in the range from 0 to 255)
to Unicode strings, integers (which are then interpreted as Unicode
ordinals) or @code{None}.  Unmapped data bytes – ones which cause a
@ref{242c,,LookupError}, as well as ones which get mapped to @code{None},
@code{0xFFFE} or @code{'\ufffe'}, are treated as undefined mappings and cause
an error.
@end deffn

@geindex PyUnicode_AsCharmapString (C function)
@anchor{c-api/unicode c PyUnicode_AsCharmapString}@anchor{5456}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicode_AsCharmapString (PyObject *unicode, PyObject *mapping)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Encode a Unicode object using the given `mapping' object and return the
result as a bytes object.  Error handling is “strict”.  Return @code{NULL} if an
exception was raised by the codec.

The `mapping' object must map Unicode ordinal integers to bytes objects,
integers in the range from 0 to 255 or @code{None}.  Unmapped character
ordinals (ones which cause a @ref{242c,,LookupError}) as well as mapped to
@code{None} are treated as “undefined mapping” and cause an error.
@end deffn

The following codec API is special in that maps Unicode to Unicode.

@geindex PyUnicode_Translate (C function)
@anchor{c-api/unicode c PyUnicode_Translate}@anchor{547a}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicode_Translate (PyObject *unicode, PyObject *table, const char *errors)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Translate a string by applying a character mapping table to it and return the
resulting Unicode object. Return @code{NULL} if an exception was raised by the
codec.

The mapping table must map Unicode ordinal integers to Unicode ordinal integers
or @code{None} (causing deletion of the character).

Mapping tables need only provide the @ref{588,,__getitem__()} interface; dictionaries
and sequences work well.  Unmapped character ordinals (ones which cause a
@ref{242c,,LookupError}) are left untouched and are copied as-is.

`errors' has the usual meaning for codecs. It may be @code{NULL} which indicates to
use the default error handling.
@end deffn

@node MBCS codecs for Windows,,Character Map Codecs,Built-in Codecs
@anchor{c-api/unicode mbcs-codecs-for-windows}@anchor{56e5}
@subsubsection MBCS codecs for Windows


These are the MBCS codec APIs. They are currently only available on Windows and
use the Win32 MBCS converters to implement the conversions.  Note that MBCS (or
DBCS) is a class of encodings, not just one.  The target encoding is defined by
the user settings on the machine running the codec.

@geindex PyUnicode_DecodeMBCS (C function)
@anchor{c-api/unicode c PyUnicode_DecodeMBCS}@anchor{5462}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicode_DecodeMBCS (const char *str, Py_ssize_t size, const char *errors)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI} on Windows since version 3.7.'
Create a Unicode object by decoding `size' bytes of the MBCS encoded string `str'.
Return @code{NULL} if an exception was raised by the codec.
@end deffn

@geindex PyUnicode_DecodeMBCSStateful (C function)
@anchor{c-api/unicode c PyUnicode_DecodeMBCSStateful}@anchor{5463}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicode_DecodeMBCSStateful (const char *str, Py_ssize_t size, const char *errors, Py_ssize_t *consumed)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI} on Windows since version 3.7.'
If `consumed' is @code{NULL}, behave like @ref{5462,,PyUnicode_DecodeMBCS()}. If
`consumed' is not @code{NULL}, @ref{5463,,PyUnicode_DecodeMBCSStateful()} will not decode
trailing lead byte and the number of bytes that have been decoded will be stored
in `consumed'.
@end deffn

@geindex PyUnicode_DecodeCodePageStateful (C function)
@anchor{c-api/unicode c PyUnicode_DecodeCodePageStateful}@anchor{545e}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicode_DecodeCodePageStateful (int code_page, const char *str, Py_ssize_t size, const char *errors, Py_ssize_t *consumed)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI} on Windows since version 3.7.'
Similar to @ref{5463,,PyUnicode_DecodeMBCSStateful()}, except uses the code page
specified by `code_page'.
@end deffn

@geindex PyUnicode_AsMBCSString (C function)
@anchor{c-api/unicode c PyUnicode_AsMBCSString}@anchor{139f}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicode_AsMBCSString (PyObject *unicode)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI} on Windows since version 3.7.'
Encode a Unicode object using MBCS and return the result as Python bytes
object.  Error handling is “strict”.  Return @code{NULL} if an exception was
raised by the codec.
@end deffn

@geindex PyUnicode_EncodeCodePage (C function)
@anchor{c-api/unicode c PyUnicode_EncodeCodePage}@anchor{13a0}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicode_EncodeCodePage (int code_page, PyObject *unicode, const char *errors)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI} on Windows since version 3.7.'
Encode the Unicode object using the specified code page and return a Python
bytes object.  Return @code{NULL} if an exception was raised by the codec. Use
@code{CP_ACP} code page to get the MBCS encoder.


Added in version 3.3.

@end deffn

@node Methods and Slot Functions,PyUnicodeWriter,Built-in Codecs,Unicode Objects and Codecs
@anchor{c-api/unicode methods-and-slot-functions}@anchor{56e6}@anchor{c-api/unicode unicodemethodsandslots}@anchor{56e7}
@subsubsection Methods and Slot Functions


The following APIs are capable of handling Unicode objects and strings on input
(we refer to them as strings in the descriptions) and return Unicode objects or
integers as appropriate.

They all return @code{NULL} or @code{-1} if an exception occurs.

@geindex PyUnicode_Concat (C function)
@anchor{c-api/unicode c PyUnicode_Concat}@anchor{13ad}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicode_Concat (PyObject *left, PyObject *right)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Concat two strings giving a new Unicode string.
@end deffn

@geindex PyUnicode_Split (C function)
@anchor{c-api/unicode c PyUnicode_Split}@anchor{5478}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicode_Split (PyObject *unicode, PyObject *sep, Py_ssize_t maxsplit)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Split a string giving a list of Unicode strings.  If `sep' is @code{NULL}, splitting
will be done at all whitespace substrings.  Otherwise, splits occur at the given
separator.  At most `maxsplit' splits will be done.  If negative, no limit is
set.  Separators are not included in the resulting list.

On error, return @code{NULL} with an exception set.

Equivalent to @ref{10b0,,str.split()}.
@end deffn

@geindex PyUnicode_RSplit (C function)
@anchor{c-api/unicode c PyUnicode_RSplit}@anchor{18de}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicode_RSplit (PyObject *unicode, PyObject *sep, Py_ssize_t maxsplit)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Similar to @ref{5478,,PyUnicode_Split()}, but splitting will be done beginning
at the end of the string.

On error, return @code{NULL} with an exception set.

Equivalent to @ref{1461,,str.rsplit()}.
@end deffn

@geindex PyUnicode_Splitlines (C function)
@anchor{c-api/unicode c PyUnicode_Splitlines}@anchor{5479}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicode_Splitlines (PyObject *unicode, int keepends)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Split a Unicode string at line breaks, returning a list of Unicode strings.
CRLF is considered to be one line break.  If `keepends' is @code{0}, the Line break
characters are not included in the resulting strings.
@end deffn

@geindex PyUnicode_Partition (C function)
@anchor{c-api/unicode c PyUnicode_Partition}@anchor{18df}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicode_Partition (PyObject *unicode, PyObject *sep)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Split a Unicode string at the first occurrence of `sep', and return
a 3-tuple containing the part before the separator, the separator itself,
and the part after the separator. If the separator is not found,
return a 3-tuple containing the string itself, followed by two empty strings.

`sep' must not be empty.

On error, return @code{NULL} with an exception set.

Equivalent to @ref{10b1,,str.partition()}.
@end deffn

@geindex PyUnicode_RPartition (C function)
@anchor{c-api/unicode c PyUnicode_RPartition}@anchor{18e0}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicode_RPartition (PyObject *unicode, PyObject *sep)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Similar to @ref{18df,,PyUnicode_Partition()}, but split a Unicode string at the
last occurrence of `sep'. If the separator is not found, return a 3-tuple
containing two empty strings, followed by the string itself.

`sep' must not be empty.

On error, return @code{NULL} with an exception set.

Equivalent to @ref{1464,,str.rpartition()}.
@end deffn

@geindex PyUnicode_Join (C function)
@anchor{c-api/unicode c PyUnicode_Join}@anchor{13ae}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicode_Join (PyObject *separator, PyObject *seq)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Join a sequence of strings using the given `separator' and return the resulting
Unicode string.
@end deffn

@geindex PyUnicode_Tailmatch (C function)
@anchor{c-api/unicode c PyUnicode_Tailmatch}@anchor{abb}
@deffn {C Function} @ref{c5b,,Py_ssize_t} PyUnicode_Tailmatch (PyObject *unicode, PyObject *substr, Py_ssize_t start, Py_ssize_t end, int direction)
` Part of the @ref{776,,Stable ABI}.'
Return @code{1} if `substr' matches @code{unicode[start:end]} at the given tail end
(`direction' == @code{-1} means to do a prefix match, `direction' == @code{1} a suffix match),
@code{0} otherwise. Return @code{-1} if an error occurred.
@end deffn

@geindex PyUnicode_Find (C function)
@anchor{c-api/unicode c PyUnicode_Find}@anchor{546d}
@deffn {C Function} @ref{c5b,,Py_ssize_t} PyUnicode_Find (PyObject *unicode, PyObject *substr, Py_ssize_t start, Py_ssize_t end, int direction)
` Part of the @ref{776,,Stable ABI}.'
Return the first position of `substr' in @code{unicode[start:end]} using the given
`direction' (`direction' == @code{1} means to do a forward search, `direction' == @code{-1} a
backward search).  The return value is the index of the first match; a value of
@code{-1} indicates that no match was found, and @code{-2} indicates that an error
occurred and an exception has been set.
@end deffn

@geindex PyUnicode_FindChar (C function)
@anchor{c-api/unicode c PyUnicode_FindChar}
@deffn {C Function} @ref{c5b,,Py_ssize_t} PyUnicode_FindChar (PyObject *unicode, Py_UCS4 ch, Py_ssize_t start, Py_ssize_t end, int direction)
` Part of the @ref{776,,Stable ABI} since version 3.7.'
Return the first position of the character `ch' in @code{unicode[start:end]} using
the given `direction' (`direction' == @code{1} means to do a forward search,
`direction' == @code{-1} a backward search).  The return value is the index of the
first match; a value of @code{-1} indicates that no match was found, and @code{-2}
indicates that an error occurred and an exception has been set.


Added in version 3.3.



Changed in version 3.7: `start' and `end' are now adjusted to behave like @code{unicode[start:end]}.

@end deffn

@geindex PyUnicode_Count (C function)
@anchor{c-api/unicode c PyUnicode_Count}@anchor{545b}
@deffn {C Function} @ref{c5b,,Py_ssize_t} PyUnicode_Count (PyObject *unicode, PyObject *substr, Py_ssize_t start, Py_ssize_t end)
` Part of the @ref{776,,Stable ABI}.'
Return the number of non-overlapping occurrences of `substr' in
@code{unicode[start:end]}.  Return @code{-1} if an error occurred.
@end deffn

@geindex PyUnicode_Replace (C function)
@anchor{c-api/unicode c PyUnicode_Replace}@anchor{5475}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicode_Replace (PyObject *unicode, PyObject *substr, PyObject *replstr, Py_ssize_t maxcount)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Replace at most `maxcount' occurrences of `substr' in `unicode' with `replstr' and
return the resulting Unicode object. `maxcount' == @code{-1} means replace all
occurrences.
@end deffn

@geindex PyUnicode_Compare (C function)
@anchor{c-api/unicode c PyUnicode_Compare}@anchor{aba}
@deffn {C Function} int PyUnicode_Compare (PyObject *left, PyObject *right)
` Part of the @ref{776,,Stable ABI}.'
Compare two strings and return @code{-1}, @code{0}, @code{1} for less than, equal, and greater than,
respectively.

This function returns @code{-1} upon failure, so one should call
@ref{1cf0,,PyErr_Occurred()} to check for errors.


@subsubheading See also


The @ref{3b0,,PyUnicode_Equal()} function.

@end deffn

@geindex PyUnicode_Equal (C function)
@anchor{c-api/unicode c PyUnicode_Equal}@anchor{3b0}
@deffn {C Function} int PyUnicode_Equal (PyObject *a, PyObject *b)
` Part of the @ref{776,,Stable ABI} since version 3.14.'
Test if two strings are equal:


@itemize *

@item 
Return @code{1} if `a' is equal to `b'.

@item 
Return @code{0} if `a' is not equal to `b'.

@item 
Set a @ref{199,,TypeError} exception and return @code{-1} if `a' or `b' is not a
@ref{16a,,str} object.
@end itemize

The function always succeeds if `a' and `b' are @ref{16a,,str} objects.

The function works for @ref{16a,,str} subclasses, but does not honor custom
@code{__eq__()} method.


@subsubheading See also


The @ref{aba,,PyUnicode_Compare()} function.



Added in version 3.14.

@end deffn

@geindex PyUnicode_EqualToUTF8AndSize (C function)
@anchor{c-api/unicode c PyUnicode_EqualToUTF8AndSize}@anchor{619}
@deffn {C Function} int PyUnicode_EqualToUTF8AndSize (PyObject *unicode, const char *string, Py_ssize_t size)
` Part of the @ref{776,,Stable ABI} since version 3.13.'
Compare a Unicode object with a char buffer which is interpreted as
being UTF-8 or ASCII encoded and return true (@code{1}) if they are equal,
or false (@code{0}) otherwise.
If the Unicode object contains surrogate code points
(@code{U+D800} - @code{U+DFFF}) or the C string is not valid UTF-8,
false (@code{0}) is returned.

This function does not raise exceptions.


Added in version 3.13.

@end deffn

@geindex PyUnicode_EqualToUTF8 (C function)
@anchor{c-api/unicode c PyUnicode_EqualToUTF8}@anchor{61a}
@deffn {C Function} int PyUnicode_EqualToUTF8 (PyObject *unicode, const char *string)
` Part of the @ref{776,,Stable ABI} since version 3.13.'
Similar to @ref{619,,PyUnicode_EqualToUTF8AndSize()}, but compute `string'
length using @code{strlen()}.
If the Unicode object contains null characters, false (@code{0}) is returned.


Added in version 3.13.

@end deffn

@geindex PyUnicode_CompareWithASCIIString (C function)
@anchor{c-api/unicode c PyUnicode_CompareWithASCIIString}@anchor{1473}
@deffn {C Function} int PyUnicode_CompareWithASCIIString (PyObject *unicode, const char *string)
` Part of the @ref{776,,Stable ABI}.'
Compare a Unicode object, `unicode', with `string' and return @code{-1}, @code{0}, @code{1} for less
than, equal, and greater than, respectively. It is best to pass only
ASCII-encoded strings, but the function interprets the input string as
ISO-8859-1 if it contains non-ASCII characters.

This function does not raise exceptions.
@end deffn

@geindex PyUnicode_RichCompare (C function)
@anchor{c-api/unicode c PyUnicode_RichCompare}@anchor{5477}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicode_RichCompare (PyObject *left, PyObject *right, int op)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Rich compare two Unicode strings and return one of the following:


@itemize *

@item 
@code{NULL} in case an exception was raised

@item 
@ref{5675,,Py_True} or @ref{5674,,Py_False} for successful comparisons

@item 
@ref{55e6,,Py_NotImplemented} in case the type combination is unknown
@end itemize

Possible values for `op' are @ref{55ed,,Py_GT}, @ref{55ee,,Py_GE}, @ref{55eb,,Py_EQ},
@ref{55ec,,Py_NE}, @ref{55e9,,Py_LT}, and @ref{55ea,,Py_LE}.
@end deffn

@geindex PyUnicode_Format (C function)
@anchor{c-api/unicode c PyUnicode_Format}@anchor{546e}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicode_Format (PyObject *format, PyObject *args)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Return a new string object from `format' and `args'; this is analogous to
@code{format % args}.
@end deffn

@geindex PyUnicode_Contains (C function)
@anchor{c-api/unicode c PyUnicode_Contains}@anchor{545a}
@deffn {C Function} int PyUnicode_Contains (PyObject *unicode, PyObject *substr)
` Part of the @ref{776,,Stable ABI}.'
Check whether `substr' is contained in `unicode' and return true or false
accordingly.

`substr' has to coerce to a one element Unicode string. @code{-1} is returned
if there was an error.
@end deffn

@geindex PyUnicode_InternInPlace (C function)
@anchor{c-api/unicode c PyUnicode_InternInPlace}@anchor{ab4}
@deffn {C Function} void PyUnicode_InternInPlace (PyObject **p_unicode)
` Part of the @ref{776,,Stable ABI}.'
Intern the argument *@ref{ab4,,p_unicode} in place.  The argument must be the address of a
pointer variable pointing to a Python Unicode string object.  If there is an
existing interned string that is the same as *p_unicode, it sets *p_unicode to
it (releasing the reference to the old string object and creating a new
@ref{5e2,,strong reference} to the interned string object), otherwise it leaves
*p_unicode alone and interns it.

(Clarification: even though there is a lot of talk about references, think
of this function as reference-neutral. You must own the object you pass in;
after the call you no longer own the passed-in reference, but you newly own
the result.)

This function never raises an exception.
On error, it leaves its argument unchanged without interning it.

Instances of subclasses of @ref{16a,,str} may not be interned, that is,
@ref{56bb,,PyUnicode_CheckExact}(*@ref{ab4,,p_unicode}) must be true. If it is not,
then – as with any other error – the argument is left unchanged.

Note that interned strings are not “immortal”.
You must keep a reference to the result to benefit from interning.
@end deffn

@geindex PyUnicode_InternFromString (C function)
@anchor{c-api/unicode c PyUnicode_InternFromString}@anchor{19cf}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicode_InternFromString (const char *str)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
A combination of @ref{5472,,PyUnicode_FromString()} and
@ref{ab4,,PyUnicode_InternInPlace()}, meant for statically allocated strings.

Return a new (“owned”) reference to either a new Unicode string object
that has been interned, or an earlier interned string object with the
same value.

Python may keep a reference to the result, or make it @ref{292,,immortal},
preventing it from being garbage-collected promptly.
For interning an unbounded number of different strings, such as ones coming
from user input, prefer calling @ref{5472,,PyUnicode_FromString()} and
@ref{ab4,,PyUnicode_InternInPlace()} directly.
@end deffn

@geindex PyUnicode_CHECK_INTERNED (C function)
@anchor{c-api/unicode c PyUnicode_CHECK_INTERNED}@anchor{56e8}
@deffn {C Function} unsigned int PyUnicode_CHECK_INTERNED (PyObject *str)

Return a non-zero value if `str' is interned, zero if not.
The `str' argument must be a string; this is not checked.
This function always succeeds.

`CPython implementation detail:' A non-zero return value may carry additional information
about `how' the string is interned.
The meaning of such non-zero values, as well as each specific string’s
intern-related details, may change between CPython versions.
@end deffn

@node PyUnicodeWriter,Deprecated API<2>,Methods and Slot Functions,Unicode Objects and Codecs
@anchor{c-api/unicode pyunicodewriter}@anchor{56e9}
@subsubsection PyUnicodeWriter


The @ref{3b1,,PyUnicodeWriter} API can be used to create a Python @ref{16a,,str}
object.


Added in version 3.14.


@geindex PyUnicodeWriter (C type)
@anchor{c-api/unicode c PyUnicodeWriter}@anchor{3b1}
@deffn {C Type} type PyUnicodeWriter

A Unicode writer instance.

The instance must be destroyed by @ref{3b5,,PyUnicodeWriter_Finish()} on
success, or @ref{3b4,,PyUnicodeWriter_Discard()} on error.
@end deffn

@geindex PyUnicodeWriter_Create (C function)
@anchor{c-api/unicode c PyUnicodeWriter_Create}@anchor{3b2}
@deffn {C Function} @ref{3b1,,PyUnicodeWriter} *PyUnicodeWriter_Create (Py_ssize_t length)

Create a Unicode writer instance.

`length' must be greater than or equal to @code{0}.

If `length' is greater than @code{0}, preallocate an internal buffer of
`length' characters.

Set an exception and return @code{NULL} on error.
@end deffn

@geindex PyUnicodeWriter_Finish (C function)
@anchor{c-api/unicode c PyUnicodeWriter_Finish}@anchor{3b5}
@deffn {C Function} @ref{5df,,PyObject} *PyUnicodeWriter_Finish (PyUnicodeWriter *writer)

Return the final Python @ref{16a,,str} object and destroy the writer instance.

Set an exception and return @code{NULL} on error.

The writer instance is invalid after this call.
@end deffn

@geindex PyUnicodeWriter_Discard (C function)
@anchor{c-api/unicode c PyUnicodeWriter_Discard}@anchor{3b4}
@deffn {C Function} void PyUnicodeWriter_Discard (PyUnicodeWriter *writer)

Discard the internal Unicode buffer and destroy the writer instance.

If `writer' is @code{NULL}, no operation is performed.

The writer instance is invalid after this call.
@end deffn

@geindex PyUnicodeWriter_WriteChar (C function)
@anchor{c-api/unicode c PyUnicodeWriter_WriteChar}@anchor{3b8}
@deffn {C Function} int PyUnicodeWriter_WriteChar (PyUnicodeWriter *writer, Py_UCS4 ch)

Write the single Unicode character `ch' into `writer'.

On success, return @code{0}.
On error, set an exception, leave the writer unchanged, and return @code{-1}.
@end deffn

@geindex PyUnicodeWriter_WriteUTF8 (C function)
@anchor{c-api/unicode c PyUnicodeWriter_WriteUTF8}@anchor{3bd}
@deffn {C Function} int PyUnicodeWriter_WriteUTF8 (PyUnicodeWriter *writer, const char *str, Py_ssize_t size)

Decode the string `str' from UTF-8 in strict mode and write the output into `writer'.

`size' is the string length in bytes. If `size' is equal to @code{-1}, call
@code{strlen(str)} to get the string length.

On success, return @code{0}.
On error, set an exception, leave the writer unchanged, and return @code{-1}.

See also @ref{3b3,,PyUnicodeWriter_DecodeUTF8Stateful()}.
@end deffn

@geindex PyUnicodeWriter_WriteASCII (C function)
@anchor{c-api/unicode c PyUnicodeWriter_WriteASCII}@anchor{3b7}
@deffn {C Function} int PyUnicodeWriter_WriteASCII (PyUnicodeWriter *writer, const char *str, Py_ssize_t size)

Write the ASCII string `str' into `writer'.

`size' is the string length in bytes. If `size' is equal to @code{-1}, call
@code{strlen(str)} to get the string length.

`str' must only contain ASCII characters. The behavior is undefined if
`str' contains non-ASCII characters.

On success, return @code{0}.
On error, set an exception, leave the writer unchanged, and return @code{-1}.
@end deffn

@geindex PyUnicodeWriter_WriteWideChar (C function)
@anchor{c-api/unicode c PyUnicodeWriter_WriteWideChar}@anchor{3be}
@deffn {C Function} int PyUnicodeWriter_WriteWideChar (PyUnicodeWriter *writer, const wchar_t *str, Py_ssize_t size)

Write the wide string `str' into `writer'.

`size' is a number of wide characters. If `size' is equal to @code{-1}, call
@code{wcslen(str)} to get the string length.

On success, return @code{0}.
On error, set an exception, leave the writer unchanged, and return @code{-1}.
@end deffn

@geindex PyUnicodeWriter_WriteUCS4 (C function)
@anchor{c-api/unicode c PyUnicodeWriter_WriteUCS4}@anchor{3bc}
@deffn {C Function} int PyUnicodeWriter_WriteUCS4 (PyUnicodeWriter *writer, Py_UCS4 *str, Py_ssize_t size)

Writer the UCS4 string `str' into `writer'.

`size' is a number of UCS4 characters.

On success, return @code{0}.
On error, set an exception, leave the writer unchanged, and return @code{-1}.
@end deffn

@geindex PyUnicodeWriter_WriteStr (C function)
@anchor{c-api/unicode c PyUnicodeWriter_WriteStr}@anchor{3ba}
@deffn {C Function} int PyUnicodeWriter_WriteStr (PyUnicodeWriter *writer, PyObject *obj)

Call @ref{1236,,PyObject_Str()} on `obj' and write the output into `writer'.

On success, return @code{0}.
On error, set an exception, leave the writer unchanged, and return @code{-1}.

To write a @ref{16a,,str} subclass which overrides the @ref{831,,__str__()}
method, @ref{5470,,PyUnicode_FromObject()} can be used to get the original
string.
@end deffn

@geindex PyUnicodeWriter_WriteRepr (C function)
@anchor{c-api/unicode c PyUnicodeWriter_WriteRepr}@anchor{3b9}
@deffn {C Function} int PyUnicodeWriter_WriteRepr (PyUnicodeWriter *writer, PyObject *obj)

Call @ref{1235,,PyObject_Repr()} on `obj' and write the output into `writer'.

If `obj' is @code{NULL}, write the string @code{"<NULL>"} into `writer'.

On success, return @code{0}.
On error, set an exception, leave the writer unchanged, and return @code{-1}.


Changed in version 3.14.4: Added support for @code{NULL}.

@end deffn

@geindex PyUnicodeWriter_WriteSubstring (C function)
@anchor{c-api/unicode c PyUnicodeWriter_WriteSubstring}@anchor{3bb}
@deffn {C Function} int PyUnicodeWriter_WriteSubstring (PyUnicodeWriter *writer, PyObject *str, Py_ssize_t start, Py_ssize_t end)

Write the substring @code{str[start:end]} into `writer'.

`str' must be Python @ref{16a,,str} object. `start' must be greater than or
equal to 0, and less than or equal to `end'. `end' must be less than or
equal to `str' length.

On success, return @code{0}.
On error, set an exception, leave the writer unchanged, and return @code{-1}.
@end deffn

@geindex PyUnicodeWriter_Format (C function)
@anchor{c-api/unicode c PyUnicodeWriter_Format}@anchor{3b6}
@deffn {C Function} int PyUnicodeWriter_Format (PyUnicodeWriter *writer, const char *format, ...)

Similar to @ref{62b,,PyUnicode_FromFormat()}, but write the output directly into `writer'.

On success, return @code{0}.
On error, set an exception, leave the writer unchanged, and return @code{-1}.
@end deffn

@geindex PyUnicodeWriter_DecodeUTF8Stateful (C function)
@anchor{c-api/unicode c PyUnicodeWriter_DecodeUTF8Stateful}@anchor{3b3}
@deffn {C Function} int PyUnicodeWriter_DecodeUTF8Stateful (PyUnicodeWriter *writer, const char *string, Py_ssize_t length, const char *errors, Py_ssize_t *consumed)

Decode the string `str' from UTF-8 with `errors' error handler and write the
output into `writer'.

`size' is the string length in bytes. If `size' is equal to @code{-1}, call
@code{strlen(str)} to get the string length.

`errors' is an @ref{1bb3,,error handler} name, such as
@code{"replace"}. If `errors' is @code{NULL}, use the strict error handler.

If `consumed' is not @code{NULL}, set `*consumed' to the number of decoded
bytes on success.
If `consumed' is @code{NULL}, treat trailing incomplete UTF-8 byte sequences
as an error.

On success, return @code{0}.
On error, set an exception, leave the writer unchanged, and return @code{-1}.

See also @ref{3bd,,PyUnicodeWriter_WriteUTF8()}.
@end deffn

@node Deprecated API<2>,,PyUnicodeWriter,Unicode Objects and Codecs
@anchor{c-api/unicode deprecated-api}@anchor{56ea}
@subsubsection Deprecated API


The following API is deprecated.

@geindex Py_UNICODE (C type)
@anchor{c-api/unicode c Py_UNICODE}@anchor{3de}
@deffn {C Type} type Py_UNICODE

This is a typedef of @code{wchar_t}, which is a 16-bit type or 32-bit type
depending on the platform.
Please use @code{wchar_t} directly instead.


Changed in version 3.3: In previous versions, this was a 16-bit type or a 32-bit type depending on
whether you selected a “narrow” or “wide” Unicode version of Python at
build time.



Deprecated since version 3.13, will be removed in version 3.15.

@end deffn

@geindex PyUnicode_READY (C function)
@anchor{c-api/unicode c PyUnicode_READY}@anchor{432}
@deffn {C Function} int PyUnicode_READY (PyObject *unicode)

Do nothing and return @code{0}.
This API is kept only for backward compatibility, but there are no plans
to remove it.


Added in version 3.3.



Deprecated since version 3.10: This API does nothing since Python 3.12.
Previously, this needed to be called for each string created using
the old API (@code{PyUnicode_FromUnicode()} or similar).

@end deffn

@geindex PyUnicode_IS_READY (C function)
@anchor{c-api/unicode c PyUnicode_IS_READY}@anchor{56eb}
@deffn {C Function} unsigned int PyUnicode_IS_READY (PyObject *unicode)

Do nothing and return @code{1}.
This API is kept only for backward compatibility, but there are no plans
to remove it.


Added in version 3.3.



Deprecated since version 3.14: This API does nothing since Python 3.12.
Previously, this could be called to check if
@ref{432,,PyUnicode_READY()} is necessary.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Tuple Objects,Struct Sequence Objects,Unicode Objects and Codecs,Sequence Objects
@anchor{c-api/tuple doc}@anchor{56ec}@anchor{c-api/tuple translation-repo}@anchor{56ed}@anchor{c-api/tuple tuple-objects}@anchor{56ee}@anchor{c-api/tuple tupleobjects}@anchor{56ef}
@subsubsection Tuple Objects


@geindex object; tuple

@geindex PyTupleObject (C type)
@anchor{c-api/tuple c PyTupleObject}@anchor{5584}
@deffn {C Type} type PyTupleObject

This subtype of @ref{5df,,PyObject} represents a Python tuple object.
@end deffn

@geindex PyTuple_Type (C var)
@anchor{c-api/tuple c PyTuple_Type}@anchor{5439}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyTuple_Type
` Part of the @ref{776,,Stable ABI}.'
This instance of @ref{ca2,,PyTypeObject} represents the Python tuple type; it
is the same object as @ref{614,,tuple} in the Python layer.
@end deffn

@geindex PyTuple_Check (C function)
@anchor{c-api/tuple c PyTuple_Check}@anchor{56f0}
@deffn {C Function} int PyTuple_Check (PyObject *p)

Return true if `p' is a tuple object or an instance of a subtype of the
tuple type.  This function always succeeds.
@end deffn

@geindex PyTuple_CheckExact (C function)
@anchor{c-api/tuple c PyTuple_CheckExact}@anchor{56f1}
@deffn {C Function} int PyTuple_CheckExact (PyObject *p)

Return true if `p' is a tuple object, but not an instance of a subtype of the
tuple type.  This function always succeeds.
@end deffn

@geindex PyTuple_New (C function)
@anchor{c-api/tuple c PyTuple_New}@anchor{63e}
@deffn {C Function} @ref{5df,,PyObject} *PyTuple_New (Py_ssize_t len)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Return a new tuple object of size `len',
or @code{NULL} with an exception set on failure.
@end deffn

@geindex PyTuple_Pack (C function)
@anchor{c-api/tuple c PyTuple_Pack}@anchor{5437}
@deffn {C Function} @ref{5df,,PyObject} *PyTuple_Pack (Py_ssize_t n, ...)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Return a new tuple object of size `n',
or @code{NULL} with an exception set on failure. The tuple values
are initialized to the subsequent `n' C arguments pointing to Python objects.
@code{PyTuple_Pack(2, a, b)} is equivalent to @code{Py_BuildValue("(OO)", a, b)}.
@end deffn

@geindex PyTuple_Size (C function)
@anchor{c-api/tuple c PyTuple_Size}@anchor{5438}
@deffn {C Function} @ref{c5b,,Py_ssize_t} PyTuple_Size (PyObject *p)
` Part of the @ref{776,,Stable ABI}.'
Take a pointer to a tuple object, and return the size of that tuple.
On error, return @code{-1} with an exception set.
@end deffn

@geindex PyTuple_GET_SIZE (C function)
@anchor{c-api/tuple c PyTuple_GET_SIZE}@anchor{56f2}
@deffn {C Function} @ref{c5b,,Py_ssize_t} PyTuple_GET_SIZE (PyObject *p)

Like @ref{5438,,PyTuple_Size()}, but without error checking.
@end deffn

@geindex PyTuple_GetItem (C function)
@anchor{c-api/tuple c PyTuple_GetItem}@anchor{5217}
@deffn {C Function} @ref{5df,,PyObject} *PyTuple_GetItem (PyObject *p, Py_ssize_t pos)
`Return value: Borrowed reference.'` Part of the @ref{776,,Stable ABI}.'
Return the object at position `pos' in the tuple pointed to by `p'.  If `pos' is
negative or out of bounds, return @code{NULL} and set an @ref{1741,,IndexError} exception.

The returned reference is borrowed from the tuple `p'
(that is: it is only valid as long as you hold a reference to `p').
To get a @ref{5e2,,strong reference}, use
@ref{aa0,,Py_NewRef(PyTuple_GetItem(...))}
or @ref{1e76,,PySequence_GetItem()}.
@end deffn

@geindex PyTuple_GET_ITEM (C function)
@anchor{c-api/tuple c PyTuple_GET_ITEM}@anchor{56f3}
@deffn {C Function} @ref{5df,,PyObject} *PyTuple_GET_ITEM (PyObject *p, Py_ssize_t pos)
`Return value: Borrowed reference.'
Like @ref{5217,,PyTuple_GetItem()}, but does no checking of its arguments.
@end deffn

@geindex PyTuple_GetSlice (C function)
@anchor{c-api/tuple c PyTuple_GetSlice}@anchor{5436}
@deffn {C Function} @ref{5df,,PyObject} *PyTuple_GetSlice (PyObject *p, Py_ssize_t low, Py_ssize_t high)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Return the slice of the tuple pointed to by `p' between `low' and `high',
or @code{NULL} with an exception set on failure.

This is the equivalent of the Python expression @code{p[low:high]}.
Indexing from the end of the tuple is not supported.
@end deffn

@geindex PyTuple_SetItem (C function)
@anchor{c-api/tuple c PyTuple_SetItem}@anchor{5218}
@deffn {C Function} int PyTuple_SetItem (PyObject *p, Py_ssize_t pos, PyObject *o)
` Part of the @ref{776,,Stable ABI}.'
Insert a reference to object `o' at position `pos' of the tuple pointed to by
`p'.  Return @code{0} on success.  If `pos' is out of bounds, return @code{-1}
and set an @ref{1741,,IndexError} exception.

@cartouche
@quotation Note 
This function “steals” a reference to `o' and discards a reference to
an item already in the tuple at the affected position.
@end quotation
@end cartouche
@end deffn

@geindex PyTuple_SET_ITEM (C function)
@anchor{c-api/tuple c PyTuple_SET_ITEM}@anchor{62e}
@deffn {C Function} void PyTuple_SET_ITEM (PyObject *p, Py_ssize_t pos, PyObject *o)

Like @ref{5218,,PyTuple_SetItem()}, but does no error checking, and should `only' be
used to fill in brand new tuples.

Bounds checking is performed as an assertion if Python is built in
@ref{50a,,debug mode} or @ref{62d,,with assertions}.

@cartouche
@quotation Note 
This function “steals” a reference to `o', and, unlike
@ref{5218,,PyTuple_SetItem()}, does `not' discard a reference to any item that
is being replaced; any reference in the tuple at position `pos' will be
leaked.
@end quotation
@end cartouche

@cartouche
@quotation Warning 
This macro should `only' be used on tuples that are newly created.
Using this macro on a tuple that is already in use (or in other words, has
a refcount > 1) could lead to undefined behavior.
@end quotation
@end cartouche
@end deffn

@geindex _PyTuple_Resize (C function)
@anchor{c-api/tuple c _PyTuple_Resize}@anchor{1717}
@deffn {C Function} int _PyTuple_Resize (PyObject **p, Py_ssize_t newsize)

Can be used to resize a tuple.  `newsize' will be the new length of the tuple.
Because tuples are `supposed' to be immutable, this should only be used if there
is only one reference to the object.  Do `not' use this if the tuple may already
be known to some other part of the code.  The tuple will always grow or shrink
at the end.  Think of this as destroying the old tuple and creating a new one,
only more efficiently.  Returns @code{0} on success. Client code should never
assume that the resulting value of @code{*p} will be the same as before calling
this function. If the object referenced by @code{*p} is replaced, the original
@code{*p} is destroyed.  On failure, returns @code{-1} and sets @code{*p} to @code{NULL}, and
raises @ref{1761,,MemoryError} or @ref{796,,SystemError}.
@end deffn

@node Struct Sequence Objects,List Objects,Tuple Objects,Sequence Objects
@anchor{c-api/tuple id1}@anchor{56f4}@anchor{c-api/tuple struct-sequence-objects}@anchor{13cb}
@subsubsection Struct Sequence Objects


Struct sequence objects are the C equivalent of @ref{4e1,,namedtuple()}
objects, i.e. a sequence whose items can also be accessed through attributes.
To create a struct sequence, you first have to create a specific struct sequence
type.

@geindex PyStructSequence_NewType (C function)
@anchor{c-api/tuple c PyStructSequence_NewType}@anchor{5419}
@deffn {C Function} @ref{ca2,,PyTypeObject} *PyStructSequence_NewType (PyStructSequence_Desc *desc)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Create a new struct sequence type from the data in `desc', described below. Instances
of the resulting type can be created with @ref{5418,,PyStructSequence_New()}.

Return @code{NULL} with an exception set on failure.
@end deffn

@geindex PyStructSequence_InitType (C function)
@anchor{c-api/tuple c PyStructSequence_InitType}@anchor{1209}
@deffn {C Function} void PyStructSequence_InitType (PyTypeObject *type, PyStructSequence_Desc *desc)

Initializes a struct sequence type `type' from `desc' in place.
@end deffn

@geindex PyStructSequence_InitType2 (C function)
@anchor{c-api/tuple c PyStructSequence_InitType2}@anchor{1208}
@deffn {C Function} int PyStructSequence_InitType2 (PyTypeObject *type, PyStructSequence_Desc *desc)

Like @ref{1209,,PyStructSequence_InitType()}, but returns @code{0} on success
and @code{-1} with an exception set on failure.


Added in version 3.4.

@end deffn

@geindex PyStructSequence_Desc (C type)
@anchor{c-api/tuple c PyStructSequence_Desc}@anchor{dba}
@deffn {C Type} type PyStructSequence_Desc
` Part of the @ref{776,,Stable ABI} (including all members).'
Contains the meta information of a struct sequence type to create.

@geindex PyStructSequence_Desc.name (C member)
@anchor{c-api/tuple c PyStructSequence_Desc name}@anchor{56f5}
@deffn {C Member} const char *name

Fully qualified name of the type; null-terminated UTF-8 encoded.
The name must contain the module name.
@end deffn

@geindex PyStructSequence_Desc.doc (C member)
@anchor{c-api/tuple c PyStructSequence_Desc doc}@anchor{56f6}
@deffn {C Member} const char *doc

Pointer to docstring for the type or @code{NULL} to omit.
@end deffn

@geindex PyStructSequence_Desc.fields (C member)
@anchor{c-api/tuple c PyStructSequence_Desc fields}@anchor{56f7}
@deffn {C Member} @ref{db9,,PyStructSequence_Field} *fields

Pointer to @code{NULL}-terminated array with field names of the new type.
@end deffn

@geindex PyStructSequence_Desc.n_in_sequence (C member)
@anchor{c-api/tuple c PyStructSequence_Desc n_in_sequence}@anchor{56f8}
@deffn {C Member} int n_in_sequence

Number of fields visible to the Python side (if used as tuple).
@end deffn
@end deffn

@geindex PyStructSequence_Field (C type)
@anchor{c-api/tuple c PyStructSequence_Field}@anchor{db9}
@deffn {C Type} type PyStructSequence_Field
` Part of the @ref{776,,Stable ABI} (including all members).'
Describes a field of a struct sequence. As a struct sequence is modeled as a
tuple, all fields are typed as @ref{5df,,PyObject}*.  The index in the
@ref{56f7,,fields} array of
the @ref{dba,,PyStructSequence_Desc} determines which
field of the struct sequence is described.

@geindex PyStructSequence_Field.name (C member)
@anchor{c-api/tuple c PyStructSequence_Field name}@anchor{56f9}
@deffn {C Member} const char *name

Name for the field or @code{NULL} to end the list of named fields,
set to @ref{b7f,,PyStructSequence_UnnamedField} to leave unnamed.
@end deffn

@geindex PyStructSequence_Field.doc (C member)
@anchor{c-api/tuple c PyStructSequence_Field doc}@anchor{56fa}
@deffn {C Member} const char *doc

Field docstring or @code{NULL} to omit.
@end deffn
@end deffn

@geindex PyStructSequence_UnnamedField (C var)
@anchor{c-api/tuple c PyStructSequence_UnnamedField}@anchor{b7f}
@deffn {C Variable} const char *const PyStructSequence_UnnamedField
` Part of the @ref{776,,Stable ABI} since version 3.11.'
Special value for a field name to leave it unnamed.


Changed in version 3.9: The type was changed from @code{char *}.

@end deffn

@geindex PyStructSequence_New (C function)
@anchor{c-api/tuple c PyStructSequence_New}@anchor{5418}
@deffn {C Function} @ref{5df,,PyObject} *PyStructSequence_New (PyTypeObject *type)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Creates an instance of `type', which must have been created with
@ref{5419,,PyStructSequence_NewType()}.

Return @code{NULL} with an exception set on failure.
@end deffn

@geindex PyStructSequence_GetItem (C function)
@anchor{c-api/tuple c PyStructSequence_GetItem}@anchor{5417}
@deffn {C Function} @ref{5df,,PyObject} *PyStructSequence_GetItem (PyObject *p, Py_ssize_t pos)
`Return value: Borrowed reference.'` Part of the @ref{776,,Stable ABI}.'
Return the object at position `pos' in the struct sequence pointed to by `p'.

Bounds checking is performed as an assertion if Python is built in
@ref{50a,,debug mode} or @ref{62d,,with assertions}.
@end deffn

@geindex PyStructSequence_GET_ITEM (C function)
@anchor{c-api/tuple c PyStructSequence_GET_ITEM}@anchor{56fb}
@deffn {C Function} @ref{5df,,PyObject} *PyStructSequence_GET_ITEM (PyObject *p, Py_ssize_t pos)
`Return value: Borrowed reference.'
Alias to @ref{5417,,PyStructSequence_GetItem()}.


Changed in version 3.13: Now implemented as an alias to @ref{5417,,PyStructSequence_GetItem()}.

@end deffn

@geindex PyStructSequence_SetItem (C function)
@anchor{c-api/tuple c PyStructSequence_SetItem}@anchor{541a}
@deffn {C Function} void PyStructSequence_SetItem (PyObject *p, Py_ssize_t pos, PyObject *o)
` Part of the @ref{776,,Stable ABI}.'
Sets the field at index `pos' of the struct sequence `p' to value `o'.  Like
@ref{62e,,PyTuple_SET_ITEM()}, this should only be used to fill in brand new
instances.

Bounds checking is performed as an assertion if Python is built in
@ref{50a,,debug mode} or @ref{62d,,with assertions}.

@cartouche
@quotation Note 
This function “steals” a reference to `o'.
@end quotation
@end cartouche
@end deffn

@geindex PyStructSequence_SET_ITEM (C function)
@anchor{c-api/tuple c PyStructSequence_SET_ITEM}@anchor{56fc}
@deffn {C Function} void PyStructSequence_SET_ITEM (PyObject *p, Py_ssize_t *pos, PyObject *o)

Alias to @ref{541a,,PyStructSequence_SetItem()}.


Changed in version 3.13: Now implemented as an alias to @ref{541a,,PyStructSequence_SetItem()}.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node List Objects,,Struct Sequence Objects,Sequence Objects
@anchor{c-api/list doc}@anchor{56fd}@anchor{c-api/list list-objects}@anchor{56fe}@anchor{c-api/list listobjects}@anchor{56ff}@anchor{c-api/list translation-repo}@anchor{5700}
@subsubsection List Objects


@geindex object; list

@geindex PyListObject (C type)
@anchor{c-api/list c PyListObject}@anchor{2776}
@deffn {C Type} type PyListObject

This subtype of @ref{5df,,PyObject} represents a Python list object.
@end deffn

@geindex PyList_Type (C var)
@anchor{c-api/list c PyList_Type}@anchor{523b}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyList_Type
` Part of the @ref{776,,Stable ABI}.'
This instance of @ref{ca2,,PyTypeObject} represents the Python list type.
This is the same object as @ref{24f,,list} in the Python layer.
@end deffn

@geindex PyList_Check (C function)
@anchor{c-api/list c PyList_Check}@anchor{5701}
@deffn {C Function} int PyList_Check (PyObject *p)
` Thread safety: @ref{2778,,Atomic}.'
Return true if `p' is a list object or an instance of a subtype of the list
type.  This function always succeeds.
@end deffn

@geindex PyList_CheckExact (C function)
@anchor{c-api/list c PyList_CheckExact}@anchor{5702}
@deffn {C Function} int PyList_CheckExact (PyObject *p)
` Thread safety: @ref{2778,,Atomic}.'
Return true if `p' is a list object, but not an instance of a subtype of
the list type.  This function always succeeds.
@end deffn

@geindex PyList_New (C function)
@anchor{c-api/list c PyList_New}@anchor{52a9}
@deffn {C Function} @ref{5df,,PyObject} *PyList_New (Py_ssize_t len)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{2778,,Atomic}.'
Return a new list of length `len' on success, or @code{NULL} on failure.

@cartouche
@quotation Note 
If `len' is greater than zero, the returned list object’s items are
set to @code{NULL}. Thus you cannot use abstract API functions such as
@ref{1e77,,PySequence_SetItem()} or expose the object to Python code before
setting all items to a real object with @ref{1900,,PyList_SetItem()} or
@ref{62f,,PyList_SET_ITEM()}. The following APIs are safe APIs before
the list is fully initialized: @code{PyList_SetItem()} and @code{PyList_SET_ITEM()}.
@end quotation
@end cartouche
@end deffn

@geindex PyList_Size (C function)
@anchor{c-api/list c PyList_Size}@anchor{1626}
@deffn {C Function} @ref{c5b,,Py_ssize_t} PyList_Size (PyObject *list)
` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{2778,,Atomic}.'
@geindex built-in function; len

Return the length of the list object in `list'; this is equivalent to
@code{len(list)} on a list object.
@end deffn

@geindex PyList_GET_SIZE (C function)
@anchor{c-api/list c PyList_GET_SIZE}@anchor{5703}
@deffn {C Function} @ref{c5b,,Py_ssize_t} PyList_GET_SIZE (PyObject *list)
` Thread safety: @ref{2778,,Atomic}.'
Similar to @ref{1626,,PyList_Size()}, but without error checking.
@end deffn

@geindex PyList_GetItemRef (C function)
@anchor{c-api/list c PyList_GetItemRef}@anchor{5fe}
@deffn {C Function} @ref{5df,,PyObject} *PyList_GetItemRef (PyObject *list, Py_ssize_t index)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI} since version 3.13.'` Thread safety: @ref{2778,,Atomic}.'
Return the object at position `index' in the list pointed to by `list'.  The
position must be non-negative; indexing from the end of the list is not
supported.  If `index' is out of bounds (@code{<0 or >=len(list)}),
return @code{NULL} and set an @ref{1741,,IndexError} exception.


Added in version 3.13.

@end deffn

@geindex PyList_GetItem (C function)
@anchor{c-api/list c PyList_GetItem}@anchor{5ff}
@deffn {C Function} @ref{5df,,PyObject} *PyList_GetItem (PyObject *list, Py_ssize_t index)
`Return value: Borrowed reference.'` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{276c,,Safe to call from multiple threads with external synchronization only}.'
Like @ref{5fe,,PyList_GetItemRef()}, but returns a
@ref{3d5,,borrowed reference} instead of a @ref{5e2,,strong reference}.

@cartouche
@quotation Note 
In the @ref{1791,,free-threaded build}, the returned
@ref{3d5,,borrowed reference} may become invalid if another thread modifies
the list concurrently. Prefer @ref{5fe,,PyList_GetItemRef()}, which returns
a @ref{5e2,,strong reference}.
@end quotation
@end cartouche
@end deffn

@geindex PyList_GET_ITEM (C function)
@anchor{c-api/list c PyList_GET_ITEM}@anchor{52bf}
@deffn {C Function} @ref{5df,,PyObject} *PyList_GET_ITEM (PyObject *list, Py_ssize_t i)
`Return value: Borrowed reference.'` Thread safety: @ref{276c,,Safe to call from multiple threads with external synchronization only}.'
Similar to @ref{5ff,,PyList_GetItem()}, but without error checking.

@cartouche
@quotation Note 
In the @ref{1791,,free-threaded build}, the returned
@ref{3d5,,borrowed reference} may become invalid if another thread modifies
the list concurrently. Prefer @ref{5fe,,PyList_GetItemRef()}, which returns
a @ref{5e2,,strong reference}.
@end quotation
@end cartouche
@end deffn

@geindex PyList_SetItem (C function)
@anchor{c-api/list c PyList_SetItem}@anchor{1900}
@deffn {C Function} int PyList_SetItem (PyObject *list, Py_ssize_t index, PyObject *item)
` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{2778,,Atomic}.'
Set the item at index `index' in list to `item'.  Return @code{0} on success.
If `index' is out of bounds, return @code{-1} and set an @ref{1741,,IndexError}
exception.

@cartouche
@quotation Note 
This function “steals” a reference to `item' and discards a reference to
an item already in the list at the affected position.
@end quotation
@end cartouche
@end deffn

@geindex PyList_SET_ITEM (C function)
@anchor{c-api/list c PyList_SET_ITEM}@anchor{62f}
@deffn {C Function} void PyList_SET_ITEM (PyObject *list, Py_ssize_t i, PyObject *o)
` Thread safety: @ref{276c,,Safe to call from multiple threads with external synchronization only}.'
Macro form of @ref{1900,,PyList_SetItem()} without error checking. This is
normally only used to fill in new lists where there is no previous content.

Bounds checking is performed as an assertion if Python is built in
@ref{50a,,debug mode} or @ref{62d,,with assertions}.

@cartouche
@quotation Note 
This macro “steals” a reference to `item', and, unlike
@ref{1900,,PyList_SetItem()}, does `not' discard a reference to any item that
is being replaced; any reference in `list' at position `i' will be
leaked.
@end quotation
@end cartouche

@cartouche
@quotation Note 
In the @ref{1791,,free-threaded build}, this macro has no internal
synchronization. It is normally only used to fill in new lists where no
other thread has a reference to the list. If the list may be shared,
use @ref{1900,,PyList_SetItem()} instead, which uses a @ref{2774,,per-object lock}.
@end quotation
@end cartouche
@end deffn

@geindex PyList_Insert (C function)
@anchor{c-api/list c PyList_Insert}@anchor{18ff}
@deffn {C Function} int PyList_Insert (PyObject *list, Py_ssize_t index, PyObject *item)
` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{2773,,Safe for concurrent use on the same object}.'
Insert the item `item' into list `list' in front of index `index'.  Return
@code{0} if successful; return @code{-1} and set an exception if unsuccessful.
Analogous to @code{list.insert(index, item)}.
@end deffn

@geindex PyList_Append (C function)
@anchor{c-api/list c PyList_Append}@anchor{539f}
@deffn {C Function} int PyList_Append (PyObject *list, PyObject *item)
` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{2778,,Atomic}.'
Append the object `item' at the end of list `list'. Return @code{0} if
successful; return @code{-1} and set an exception if unsuccessful.  Analogous
to @code{list.append(item)}.
@end deffn

@geindex PyList_GetSlice (C function)
@anchor{c-api/list c PyList_GetSlice}@anchor{53a1}
@deffn {C Function} @ref{5df,,PyObject} *PyList_GetSlice (PyObject *list, Py_ssize_t low, Py_ssize_t high)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{2778,,Atomic}.'
Return a list of the objects in `list' containing the objects `between' `low'
and `high'.  Return @code{NULL} and set an exception if unsuccessful.  Analogous
to @code{list[low:high]}.  Indexing from the end of the list is not supported.
@end deffn

@geindex PyList_SetSlice (C function)
@anchor{c-api/list c PyList_SetSlice}@anchor{53a3}
@deffn {C Function} int PyList_SetSlice (PyObject *list, Py_ssize_t low, Py_ssize_t high, PyObject *itemlist)
` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{2773,,Safe for concurrent use on the same object}.'
Set the slice of `list' between `low' and `high' to the contents of
`itemlist'.  Analogous to @code{list[low:high] = itemlist}. The `itemlist' may
be @code{NULL}, indicating the assignment of an empty list (slice deletion).
Return @code{0} on success, @code{-1} on failure.  Indexing from the end of the
list is not supported.

@cartouche
@quotation Note 
In the @ref{1791,,free-threaded build}, when `itemlist' is a @ref{24f,,list},
both `list' and `itemlist' are locked for the duration of the operation.
For other iterables (or @code{NULL}), only `list' is locked.
@end quotation
@end cartouche
@end deffn

@geindex PyList_Extend (C function)
@anchor{c-api/list c PyList_Extend}@anchor{600}
@deffn {C Function} int PyList_Extend (PyObject *list, PyObject *iterable)
` Thread safety: @ref{2773,,Safe for concurrent use on the same object}.'
Extend `list' with the contents of `iterable'.  This is the same as
@code{PyList_SetSlice(list, PY_SSIZE_T_MAX, PY_SSIZE_T_MAX, iterable)}
and analogous to @code{list.extend(iterable)} or @code{list += iterable}.

Raise an exception and return @code{-1} if `list' is not a @ref{24f,,list}
object. Return 0 on success.


Added in version 3.13.


@cartouche
@quotation Note 
In the @ref{1791,,free-threaded build}, when `iterable' is a @ref{24f,,list},
@ref{185,,set}, @ref{184,,dict}, or dict view, both `list' and `iterable'
(or its underlying dict) are locked for the duration of the operation.
For other iterables, only `list' is locked; `iterable' may be
concurrently modified by another thread.
@end quotation
@end cartouche
@end deffn

@geindex PyList_Clear (C function)
@anchor{c-api/list c PyList_Clear}@anchor{601}
@deffn {C Function} int PyList_Clear (PyObject *list)
` Thread safety: @ref{2778,,Atomic}.'
Remove all items from `list'.  This is the same as
@code{PyList_SetSlice(list, 0, PY_SSIZE_T_MAX, NULL)} and analogous to
@code{list.clear()} or @code{del list[:]}.

Raise an exception and return @code{-1} if `list' is not a @ref{24f,,list}
object.  Return 0 on success.


Added in version 3.13.

@end deffn

@geindex PyList_Sort (C function)
@anchor{c-api/list c PyList_Sort}@anchor{53a4}
@deffn {C Function} int PyList_Sort (PyObject *list)
` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{2773,,Safe for concurrent use on the same object}.'
Sort the items of `list' in place.  Return @code{0} on success, @code{-1} on
failure.  This is equivalent to @code{list.sort()}.

@cartouche
@quotation Note 
In the @ref{1791,,free-threaded build}, element comparison via
@ref{14ac,,__lt__()} can execute arbitrary Python code, during which
the @ref{2774,,per-object lock} may be temporarily released. For built-in
types (@ref{16a,,str}, @ref{19c,,int}, @ref{197,,float}), the lock is not
released during comparison.
@end quotation
@end cartouche
@end deffn

@geindex PyList_Reverse (C function)
@anchor{c-api/list c PyList_Reverse}@anchor{53a2}
@deffn {C Function} int PyList_Reverse (PyObject *list)
` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{2773,,Safe for concurrent use on the same object}.'
Reverse the items of `list' in place.  Return @code{0} on success, @code{-1} on
failure.  This is the equivalent of @code{list.reverse()}.
@end deffn

@geindex PyList_AsTuple (C function)
@anchor{c-api/list c PyList_AsTuple}@anchor{53a0}
@deffn {C Function} @ref{5df,,PyObject} *PyList_AsTuple (PyObject *list)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{2778,,Atomic}.'
@geindex built-in function; tuple

Return a new tuple object containing the contents of `list'; equivalent to
@code{tuple(list)}.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Container Objects,Function Objects<2>,Sequence Objects,Concrete Objects Layer
@anchor{c-api/concrete container-objects}@anchor{5704}@anchor{c-api/concrete mapobjects}@anchor{5705}
@subsection Container Objects


@geindex object; mapping

@menu
* Dictionary Objects:: 
* Set Objects:: 

@end menu

@node Dictionary Objects,Set Objects,,Container Objects
@anchor{c-api/dict doc}@anchor{5706}@anchor{c-api/dict dictionary-objects}@anchor{5707}@anchor{c-api/dict dictobjects}@anchor{5708}
@subsubsection Dictionary Objects


@geindex object; dictionary

@geindex PyDictObject (C type)
@anchor{c-api/dict c PyDictObject}@anchor{64f}
@deffn {C Type} type PyDictObject

This subtype of @ref{5df,,PyObject} represents a Python dictionary object.
@end deffn

@geindex PyDict_Type (C var)
@anchor{c-api/dict c PyDict_Type}@anchor{5326}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyDict_Type
` Part of the @ref{776,,Stable ABI}.'
This instance of @ref{ca2,,PyTypeObject} represents the Python dictionary
type.  This is the same object as @ref{184,,dict} in the Python layer.
@end deffn

@geindex PyDict_Check (C function)
@anchor{c-api/dict c PyDict_Check}@anchor{5635}
@deffn {C Function} int PyDict_Check (PyObject *p)
` Thread safety: @ref{2778,,Atomic}.'
Return true if `p' is a dict object or an instance of a subtype of the dict
type.  This function always succeeds.
@end deffn

@geindex PyDict_CheckExact (C function)
@anchor{c-api/dict c PyDict_CheckExact}@anchor{5709}
@deffn {C Function} int PyDict_CheckExact (PyObject *p)
` Thread safety: @ref{2778,,Atomic}.'
Return true if `p' is a dict object, but not an instance of a subtype of
the dict type.  This function always succeeds.
@end deffn

@geindex PyDict_New (C function)
@anchor{c-api/dict c PyDict_New}@anchor{5324}
@deffn {C Function} @ref{5df,,PyObject} *PyDict_New ()
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{2778,,Atomic}.'
Return a new empty dictionary, or @code{NULL} on failure.
@end deffn

@geindex PyDictProxy_New (C function)
@anchor{c-api/dict c PyDictProxy_New}@anchor{5317}
@deffn {C Function} @ref{5df,,PyObject} *PyDictProxy_New (PyObject *mapping)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Return a @ref{699,,types.MappingProxyType} object for a mapping which
enforces read-only behavior.  This is normally used to create a view to
prevent modification of the dictionary for non-dynamic class types.
@end deffn

@geindex PyDictProxy_Type (C var)
@anchor{c-api/dict c PyDictProxy_Type}@anchor{5318}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyDictProxy_Type
` Part of the @ref{776,,Stable ABI}.'
The type object for mapping proxy objects created by
@ref{5317,,PyDictProxy_New()} and for the read-only @code{__dict__} attribute
of many built-in types. A @ref{5318,,PyDictProxy_Type} instance provides a
dynamic, read-only view of an underlying dictionary: changes to the
underlying dictionary are reflected in the proxy, but the proxy itself
does not support mutation operations. This corresponds to
@ref{699,,types.MappingProxyType} in Python.
@end deffn

@geindex PyDict_Clear (C function)
@anchor{c-api/dict c PyDict_Clear}@anchor{531d}
@deffn {C Function} void PyDict_Clear (PyObject *p)
` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{2778,,Atomic}.'
Empty an existing dictionary of all key-value pairs.
@end deffn

@geindex PyDict_Contains (C function)
@anchor{c-api/dict c PyDict_Contains}@anchor{5de}
@deffn {C Function} int PyDict_Contains (PyObject *p, PyObject *key)
` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{2773,,Safe for concurrent use on the same object}.'
Determine if dictionary `p' contains `key'.  If an item in `p' matches
`key', return @code{1}, otherwise return @code{0}.  On error, return @code{-1}.
This is equivalent to the Python expression @code{key in p}.

@cartouche
@quotation Note 
The operation is atomic on @ref{1791,,free threading}
when `key' is @ref{16a,,str}, @ref{19c,,int}, @ref{197,,float}, @ref{3c1,,bool} or @ref{193,,bytes}.
@end quotation
@end cartouche
@end deffn

@geindex PyDict_ContainsString (C function)
@anchor{c-api/dict c PyDict_ContainsString}@anchor{5dd}
@deffn {C Function} int PyDict_ContainsString (PyObject *p, const char *key)
` Thread safety: @ref{2778,,Atomic}.'
This is the same as @ref{5de,,PyDict_Contains()}, but `key' is specified as a
const char* UTF-8 encoded bytes string, rather than a
@ref{5df,,PyObject}*.


Added in version 3.13.

@end deffn

@geindex PyDict_Copy (C function)
@anchor{c-api/dict c PyDict_Copy}@anchor{662}
@deffn {C Function} @ref{5df,,PyObject} *PyDict_Copy (PyObject *p)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{2778,,Atomic}.'
Return a new dictionary that contains the same key-value pairs as `p'.
@end deffn

@geindex PyDict_SetItem (C function)
@anchor{c-api/dict c PyDict_SetItem}@anchor{5219}
@deffn {C Function} int PyDict_SetItem (PyObject *p, PyObject *key, PyObject *val)
` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{2773,,Safe for concurrent use on the same object}.'
Insert `val' into the dictionary `p' with a key of `key'.  `key' must be
@ref{825,,hashable}; if it isn’t, @ref{199,,TypeError} will be raised. Return
@code{0} on success or @code{-1} on failure.  This function `does not' steal a
reference to `val'.

@cartouche
@quotation Note 
The operation is atomic on @ref{1791,,free threading}
when `key' is @ref{16a,,str}, @ref{19c,,int}, @ref{197,,float}, @ref{3c1,,bool} or @ref{193,,bytes}.
@end quotation
@end cartouche
@end deffn

@geindex PyDict_SetItemString (C function)
@anchor{c-api/dict c PyDict_SetItemString}@anchor{19d0}
@deffn {C Function} int PyDict_SetItemString (PyObject *p, const char *key, PyObject *val)
` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{2778,,Atomic}.'
This is the same as @ref{5219,,PyDict_SetItem()}, but `key' is
specified as a const char* UTF-8 encoded bytes string,
rather than a @ref{5df,,PyObject}*.
@end deffn

@geindex PyDict_DelItem (C function)
@anchor{c-api/dict c PyDict_DelItem}@anchor{531e}
@deffn {C Function} int PyDict_DelItem (PyObject *p, PyObject *key)
` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{2773,,Safe for concurrent use on the same object}.'
Remove the entry in dictionary `p' with key `key'. `key' must be @ref{825,,hashable};
if it isn’t, @ref{199,,TypeError} is raised.
If `key' is not in the dictionary, @ref{5e7,,KeyError} is raised.
Return @code{0} on success or @code{-1} on failure.

@cartouche
@quotation Note 
The operation is atomic on @ref{1791,,free threading}
when `key' is @ref{16a,,str}, @ref{19c,,int}, @ref{197,,float}, @ref{3c1,,bool} or @ref{193,,bytes}.
@end quotation
@end cartouche
@end deffn

@geindex PyDict_DelItemString (C function)
@anchor{c-api/dict c PyDict_DelItemString}@anchor{531f}
@deffn {C Function} int PyDict_DelItemString (PyObject *p, const char *key)
` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{2778,,Atomic}.'
This is the same as @ref{531e,,PyDict_DelItem()}, but `key' is
specified as a const char* UTF-8 encoded bytes string,
rather than a @ref{5df,,PyObject}*.
@end deffn

@geindex PyDict_GetItemRef (C function)
@anchor{c-api/dict c PyDict_GetItemRef}@anchor{5e0}
@deffn {C Function} int PyDict_GetItemRef (PyObject *p, PyObject *key, PyObject **result)
` Part of the @ref{776,,Stable ABI} since version 3.13.'` Thread safety: @ref{2773,,Safe for concurrent use on the same object}.'
Return a new @ref{5e2,,strong reference} to the object from dictionary `p'
which has a key `key':


@itemize *

@item 
If the key is present, set `*result' to a new @ref{5e2,,strong reference}
to the value and return @code{1}.

@item 
If the key is missing, set `*result' to @code{NULL} and return @code{0}.

@item 
On error, raise an exception, set `*result' to @code{NULL} and return @code{-1}.
@end itemize

@cartouche
@quotation Note 
The operation is atomic on @ref{1791,,free threading}
when `key' is @ref{16a,,str}, @ref{19c,,int}, @ref{197,,float}, @ref{3c1,,bool} or @ref{193,,bytes}.
@end quotation
@end cartouche


Added in version 3.13.


See also the @ref{5ea,,PyObject_GetItem()} function.
@end deffn

@geindex PyDict_GetItem (C function)
@anchor{c-api/dict c PyDict_GetItem}@anchor{628}
@deffn {C Function} @ref{5df,,PyObject} *PyDict_GetItem (PyObject *p, PyObject *key)
`Return value: Borrowed reference.'` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{276c,,Safe to call from multiple threads with external synchronization only}.'
Return a @ref{3d5,,borrowed reference} to the object from dictionary `p' which
has a key `key'.  Return @code{NULL} if the key `key' is missing `without'
setting an exception.

@cartouche
@quotation Note 
Exceptions that occur while this calls @ref{cf9,,__hash__()} and
@ref{cf8,,__eq__()} methods are silently ignored.
Prefer the @ref{5e1,,PyDict_GetItemWithError()} function instead.
@end quotation
@end cartouche

@cartouche
@quotation Note 
In the @ref{1791,,free-threaded build}, the returned
@ref{3d5,,borrowed reference} may become invalid if another thread modifies
the dictionary concurrently. Prefer @ref{5e0,,PyDict_GetItemRef()}, which
returns a @ref{5e2,,strong reference}.
@end quotation
@end cartouche


Changed in version 3.10: Calling this API without an @ref{5231,,attached thread state} had been allowed for historical
reason. It is no longer allowed.

@end deffn

@geindex PyDict_GetItemWithError (C function)
@anchor{c-api/dict c PyDict_GetItemWithError}@anchor{5e1}
@deffn {C Function} @ref{5df,,PyObject} *PyDict_GetItemWithError (PyObject *p, PyObject *key)
`Return value: Borrowed reference.'` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{276c,,Safe to call from multiple threads with external synchronization only}.'
Variant of @ref{628,,PyDict_GetItem()} that does not suppress
exceptions. Return @code{NULL} `with' an exception set if an exception
occurred.  Return @code{NULL} `without' an exception set if the key
wasn’t present.

@cartouche
@quotation Note 
In the @ref{1791,,free-threaded build}, the returned
@ref{3d5,,borrowed reference} may become invalid if another thread modifies
the dictionary concurrently. Prefer @ref{5e0,,PyDict_GetItemRef()}, which
returns a @ref{5e2,,strong reference}.
@end quotation
@end cartouche
@end deffn

@geindex PyDict_GetItemString (C function)
@anchor{c-api/dict c PyDict_GetItemString}@anchor{629}
@deffn {C Function} @ref{5df,,PyObject} *PyDict_GetItemString (PyObject *p, const char *key)
`Return value: Borrowed reference.'` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{276c,,Safe to call from multiple threads with external synchronization only}.'
This is the same as @ref{628,,PyDict_GetItem()}, but `key' is specified as a
const char* UTF-8 encoded bytes string, rather than a
@ref{5df,,PyObject}*.

@cartouche
@quotation Note 
Exceptions that occur while this calls @ref{cf9,,__hash__()} and
@ref{cf8,,__eq__()} methods or while creating the temporary @ref{16a,,str}
object are silently ignored.
Prefer using the @ref{5e1,,PyDict_GetItemWithError()} function with your own
@ref{5472,,PyUnicode_FromString()} `key' instead.
@end quotation
@end cartouche

@cartouche
@quotation Note 
In the @ref{1791,,free-threaded build}, the returned
@ref{3d5,,borrowed reference} may become invalid if another thread modifies
the dictionary concurrently. Prefer @ref{41f,,PyDict_GetItemStringRef()},
which returns a @ref{5e2,,strong reference}.
@end quotation
@end cartouche
@end deffn

@geindex PyDict_GetItemStringRef (C function)
@anchor{c-api/dict c PyDict_GetItemStringRef}@anchor{41f}
@deffn {C Function} int PyDict_GetItemStringRef (PyObject *p, const char *key, PyObject **result)
` Part of the @ref{776,,Stable ABI} since version 3.13.'` Thread safety: @ref{2778,,Atomic}.'
Similar to @ref{5e0,,PyDict_GetItemRef()}, but `key' is specified as a
const char* UTF-8 encoded bytes string, rather than a
@ref{5df,,PyObject}*.


Added in version 3.13.

@end deffn

@geindex PyDict_SetDefault (C function)
@anchor{c-api/dict c PyDict_SetDefault}@anchor{5e4}
@deffn {C Function} @ref{5df,,PyObject} *PyDict_SetDefault (PyObject *p, PyObject *key, PyObject *defaultobj)
`Return value: Borrowed reference.'` Thread safety: @ref{276c,,Safe to call from multiple threads with external synchronization only}.'
This is the same as the Python-level @ref{127f,,dict.setdefault()}.  If present, it
returns the value corresponding to `key' from the dictionary `p'.  If the key
is not in the dict, it is inserted with value `defaultobj' and `defaultobj'
is returned.  This function evaluates the hash function of `key' only once,
instead of evaluating it independently for the lookup and the insertion.


Added in version 3.4.


@cartouche
@quotation Note 
In the @ref{1791,,free-threaded build}, the returned
@ref{3d5,,borrowed reference} may become invalid if another thread modifies
the dictionary concurrently. Prefer @ref{5e3,,PyDict_SetDefaultRef()},
which returns a @ref{5e2,,strong reference}.
@end quotation
@end cartouche
@end deffn

@geindex PyDict_SetDefaultRef (C function)
@anchor{c-api/dict c PyDict_SetDefaultRef}@anchor{5e3}
@deffn {C Function} int PyDict_SetDefaultRef (PyObject *p, PyObject *key, PyObject *default_value, PyObject **result)
` Thread safety: @ref{2773,,Safe for concurrent use on the same object}.'
Inserts `default_value' into the dictionary `p' with a key of `key' if the
key is not already present in the dictionary. If `result' is not @code{NULL},
then `*result' is set to a @ref{5e2,,strong reference} to either
`default_value', if the key was not present, or the existing value, if `key'
was already present in the dictionary.
Returns @code{1} if the key was present and `default_value' was not inserted,
or @code{0} if the key was not present and `default_value' was inserted.
On failure, returns @code{-1}, sets an exception, and sets @code{*result}
to @code{NULL}.

For clarity: if you have a strong reference to `default_value' before
calling this function, then after it returns, you hold a strong reference
to both `default_value' and `*result' (if it’s not @code{NULL}).
These may refer to the same object: in that case you hold two separate
references to it.

@cartouche
@quotation Note 
The operation is atomic on @ref{1791,,free threading}
when `key' is @ref{16a,,str}, @ref{19c,,int}, @ref{197,,float}, @ref{3c1,,bool} or @ref{193,,bytes}.
@end quotation
@end cartouche


Added in version 3.13.

@end deffn

@geindex PyDict_Pop (C function)
@anchor{c-api/dict c PyDict_Pop}@anchor{420}
@deffn {C Function} int PyDict_Pop (PyObject *p, PyObject *key, PyObject **result)
` Thread safety: @ref{2773,,Safe for concurrent use on the same object}.'
Remove `key' from dictionary `p' and optionally return the removed value.
Do not raise @ref{5e7,,KeyError} if the key is missing.


@itemize -

@item 
If the key is present, set `*result' to a new reference to the removed
value if `result' is not @code{NULL}, and return @code{1}.

@item 
If the key is missing, set `*result' to @code{NULL} if `result' is not
@code{NULL}, and return @code{0}.

@item 
On error, raise an exception and return @code{-1}.
@end itemize

Similar to @ref{5e6,,dict.pop()}, but without the default value and
not raising @ref{5e7,,KeyError} if the key is missing.

@cartouche
@quotation Note 
The operation is atomic on @ref{1791,,free threading}
when `key' is @ref{16a,,str}, @ref{19c,,int}, @ref{197,,float}, @ref{3c1,,bool} or @ref{193,,bytes}.
@end quotation
@end cartouche


Added in version 3.13.

@end deffn

@geindex PyDict_PopString (C function)
@anchor{c-api/dict c PyDict_PopString}@anchor{5e5}
@deffn {C Function} int PyDict_PopString (PyObject *p, const char *key, PyObject **result)
` Thread safety: @ref{2778,,Atomic}.'
Similar to @ref{420,,PyDict_Pop()}, but `key' is specified as a
const char* UTF-8 encoded bytes string, rather than a
@ref{5df,,PyObject}*.


Added in version 3.13.

@end deffn

@geindex PyDict_Items (C function)
@anchor{c-api/dict c PyDict_Items}@anchor{5320}
@deffn {C Function} @ref{5df,,PyObject} *PyDict_Items (PyObject *p)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{2778,,Atomic}.'
Return a @ref{2776,,PyListObject} containing all the items from the dictionary.
@end deffn

@geindex PyDict_Keys (C function)
@anchor{c-api/dict c PyDict_Keys}@anchor{5321}
@deffn {C Function} @ref{5df,,PyObject} *PyDict_Keys (PyObject *p)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{2778,,Atomic}.'
Return a @ref{2776,,PyListObject} containing all the keys from the dictionary.
@end deffn

@geindex PyDict_Values (C function)
@anchor{c-api/dict c PyDict_Values}@anchor{5328}
@deffn {C Function} @ref{5df,,PyObject} *PyDict_Values (PyObject *p)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{2778,,Atomic}.'
Return a @ref{2776,,PyListObject} containing all the values from the dictionary
`p'.
@end deffn

@geindex PyDict_Size (C function)
@anchor{c-api/dict c PyDict_Size}@anchor{5325}
@deffn {C Function} @ref{c5b,,Py_ssize_t} PyDict_Size (PyObject *p)
` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{2778,,Atomic}.'
@geindex built-in function; len

Return the number of items in the dictionary.  This is equivalent to
@code{len(p)} on a dictionary.
@end deffn

@geindex PyDict_GET_SIZE (C function)
@anchor{c-api/dict c PyDict_GET_SIZE}@anchor{570a}
@deffn {C Function} @ref{c5b,,Py_ssize_t} PyDict_GET_SIZE (PyObject *p)
` Thread safety: @ref{2778,,Atomic}.'
Similar to @ref{5325,,PyDict_Size()}, but without error checking.
@end deffn

@geindex PyDict_Next (C function)
@anchor{c-api/dict c PyDict_Next}@anchor{19d2}
@deffn {C Function} int PyDict_Next (PyObject *p, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue)
` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{276c,,Safe to call from multiple threads with external synchronization only}.'
Iterate over all key-value pairs in the dictionary `p'.  The
@ref{c5b,,Py_ssize_t} referred to by `ppos' must be initialized to @code{0}
prior to the first call to this function to start the iteration; the
function returns true for each pair in the dictionary, and false once all
pairs have been reported.  The parameters `pkey' and `pvalue' should either
point to @ref{5df,,PyObject}* variables that will be filled in with each key
and value, respectively, or may be @code{NULL}.  Any references returned through
them are borrowed.  `ppos' should not be altered during iteration. Its
value represents offsets within the internal dictionary structure, and
since the structure is sparse, the offsets are not consecutive.

For example:

@example
PyObject *key, *value;
Py_ssize_t pos = 0;

while (PyDict_Next(self->dict, &pos, &key, &value)) @{
    /* do something interesting with the values... */
    ...
@}
@end example

The dictionary `p' should not be mutated during iteration.  It is safe to
modify the values of the keys as you iterate over the dictionary, but only
so long as the set of keys does not change.  For example:

@example
PyObject *key, *value;
Py_ssize_t pos = 0;

while (PyDict_Next(self->dict, &pos, &key, &value)) @{
    long i = PyLong_AsLong(value);
    if (i == -1 && PyErr_Occurred()) @{
        return -1;
    @}
    PyObject *o = PyLong_FromLong(i + 1);
    if (o == NULL)
        return -1;
    if (PyDict_SetItem(self->dict, key, o) < 0) @{
        Py_DECREF(o);
        return -1;
    @}
    Py_DECREF(o);
@}
@end example

The function is not thread-safe in the @ref{1f6,,free-threaded}
build without external synchronization.  You can use
@ref{570b,,Py_BEGIN_CRITICAL_SECTION} to lock the dictionary while iterating
over it:

@example
Py_BEGIN_CRITICAL_SECTION(self->dict);
while (PyDict_Next(self->dict, &pos, &key, &value)) @{
    ...
@}
Py_END_CRITICAL_SECTION();
@end example

@cartouche
@quotation Note 
On the free-threaded build, this function can be used safely inside a
critical section. However, the references returned for `pkey' and `pvalue'
are @ref{3d5,,borrowed} and are only valid while the
critical section is held. If you need to use these objects outside the
critical section or when the critical section can be suspended, create a
@ref{5e2,,strong reference} (for example, using
@ref{aa0,,Py_NewRef()}).
@end quotation
@end cartouche
@end deffn

@geindex PyDict_Merge (C function)
@anchor{c-api/dict c PyDict_Merge}@anchor{5322}
@deffn {C Function} int PyDict_Merge (PyObject *a, PyObject *b, int override)
` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{2773,,Safe for concurrent use on the same object}.'
Iterate over mapping object `b' adding key-value pairs to dictionary `a'.
`b' may be a dictionary, or any object supporting @ref{dbb,,PyMapping_Keys()}
and @ref{5ea,,PyObject_GetItem()}. If `override' is true, existing pairs in `a'
will be replaced if a matching key is found in `b', otherwise pairs will
only be added if there is not a matching key in `a'. Return @code{0} on
success or @code{-1} if an exception was raised.

@cartouche
@quotation Note 
In the @ref{1791,,free-threaded build}, when `b' is a
@ref{184,,dict} (with the standard iterator), both `a' and `b' are locked
for the duration of the operation. When `b' is a non-dict mapping, only
`a' is locked; `b' may be concurrently modified by another thread.
@end quotation
@end cartouche
@end deffn

@geindex PyDict_Update (C function)
@anchor{c-api/dict c PyDict_Update}@anchor{5327}
@deffn {C Function} int PyDict_Update (PyObject *a, PyObject *b)
` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{2773,,Safe for concurrent use on the same object}.'
This is the same as @code{PyDict_Merge(a, b, 1)} in C, and is similar to
@code{a.update(b)} in Python except that @ref{5327,,PyDict_Update()} doesn’t fall
back to the iterating over a sequence of key value pairs if the second
argument has no “keys” attribute.  Return @code{0} on success or @code{-1} if an
exception was raised.

@cartouche
@quotation Note 
In the @ref{1791,,free-threaded build}, when `b' is a
@ref{184,,dict} (with the standard iterator), both `a' and `b' are locked
for the duration of the operation. When `b' is a non-dict mapping, only
`a' is locked; `b' may be concurrently modified by another thread.
@end quotation
@end cartouche
@end deffn

@geindex PyDict_MergeFromSeq2 (C function)
@anchor{c-api/dict c PyDict_MergeFromSeq2}@anchor{5323}
@deffn {C Function} int PyDict_MergeFromSeq2 (PyObject *a, PyObject *seq2, int override)
` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{2773,,Safe for concurrent use on the same object}.'
Update or merge into dictionary `a', from the key-value pairs in `seq2'.
`seq2' must be an iterable object producing iterable objects of length 2,
viewed as key-value pairs.  In case of duplicate keys, the last wins if
`override' is true, else the first wins. Return @code{0} on success or @code{-1}
if an exception was raised. Equivalent Python (except for the return
value):

@example
def PyDict_MergeFromSeq2(a, seq2, override):
    for key, value in seq2:
        if override or key not in a:
            a[key] = value
@end example

@cartouche
@quotation Note 
In the @ref{1f6,,free-threaded} build, only `a' is locked.
The iteration over `seq2' is not synchronized; `seq2' may be concurrently
modified by another thread.
@end quotation
@end cartouche
@end deffn

@geindex PyDict_AddWatcher (C function)
@anchor{c-api/dict c PyDict_AddWatcher}@anchor{3ce}
@deffn {C Function} int PyDict_AddWatcher (PyDict_WatchCallback callback)
` Thread safety: @ref{276c,,Safe to call from multiple threads with external synchronization only}.'
Register `callback' as a dictionary watcher. Return a non-negative integer
id which must be passed to future calls to @ref{785,,PyDict_Watch()}. In case
of error (e.g. no more watcher IDs available), return @code{-1} and set an
exception.

@cartouche
@quotation Note 
This function is not internally synchronized. In the
@ref{1f6,,free-threaded} build, callers should ensure no
concurrent calls to @ref{3ce,,PyDict_AddWatcher()} or
@ref{1783,,PyDict_ClearWatcher()} are in progress.
@end quotation
@end cartouche


Added in version 3.12.

@end deffn

@geindex PyDict_ClearWatcher (C function)
@anchor{c-api/dict c PyDict_ClearWatcher}@anchor{1783}
@deffn {C Function} int PyDict_ClearWatcher (int watcher_id)
` Thread safety: @ref{276c,,Safe to call from multiple threads with external synchronization only}.'
Clear watcher identified by `watcher_id' previously returned from
@ref{3ce,,PyDict_AddWatcher()}. Return @code{0} on success, @code{-1} on error (e.g.
if the given `watcher_id' was never registered.)

@cartouche
@quotation Note 
This function is not internally synchronized. In the
@ref{1f6,,free-threaded} build, callers should ensure no
concurrent calls to @ref{3ce,,PyDict_AddWatcher()} or
@ref{1783,,PyDict_ClearWatcher()} are in progress.
@end quotation
@end cartouche


Added in version 3.12.

@end deffn

@geindex PyDict_Watch (C function)
@anchor{c-api/dict c PyDict_Watch}@anchor{785}
@deffn {C Function} int PyDict_Watch (int watcher_id, PyObject *dict)
` Thread safety: @ref{2771,,Safe to call without external synchronization on distinct objects}.'
Mark dictionary `dict' as watched. The callback granted `watcher_id' by
@ref{3ce,,PyDict_AddWatcher()} will be called when `dict' is modified or
deallocated. Return @code{0} on success or @code{-1} on error.


Added in version 3.12.

@end deffn

@geindex PyDict_Unwatch (C function)
@anchor{c-api/dict c PyDict_Unwatch}@anchor{1784}
@deffn {C Function} int PyDict_Unwatch (int watcher_id, PyObject *dict)
` Thread safety: @ref{2771,,Safe to call without external synchronization on distinct objects}.'
Mark dictionary `dict' as no longer watched. The callback granted
`watcher_id' by @ref{3ce,,PyDict_AddWatcher()} will no longer be called when
`dict' is modified or deallocated. The dict must previously have been
watched by this watcher. Return @code{0} on success or @code{-1} on error.


Added in version 3.12.

@end deffn

@geindex PyDict_WatchEvent (C type)
@anchor{c-api/dict c PyDict_WatchEvent}@anchor{570c}
@deffn {C Type} type PyDict_WatchEvent

Enumeration of possible dictionary watcher events: @code{PyDict_EVENT_ADDED},
@code{PyDict_EVENT_MODIFIED}, @code{PyDict_EVENT_DELETED}, @code{PyDict_EVENT_CLONED},
@code{PyDict_EVENT_CLEARED}, or @code{PyDict_EVENT_DEALLOCATED}.


Added in version 3.12.

@end deffn

@geindex PyDict_WatchCallback (C type)
@anchor{c-api/dict c PyDict_WatchCallback}@anchor{570d}
@deffn {C Type} typedef int (*PyDict_WatchCallback)(@ref{570c,,PyDict_WatchEvent} event, @ref{5df,,PyObject} *dict, @ref{5df,,PyObject} *key, @ref{5df,,PyObject} *new_value)

Type of a dict watcher callback function.

If `event' is @code{PyDict_EVENT_CLEARED} or @code{PyDict_EVENT_DEALLOCATED}, both
`key' and `new_value' will be @code{NULL}. If `event' is @code{PyDict_EVENT_ADDED}
or @code{PyDict_EVENT_MODIFIED}, `new_value' will be the new value for `key'.
If `event' is @code{PyDict_EVENT_DELETED}, `key' is being deleted from the
dictionary and `new_value' will be @code{NULL}.

@code{PyDict_EVENT_CLONED} occurs when `dict' was previously empty and another
dict is merged into it. To maintain efficiency of this operation, per-key
@code{PyDict_EVENT_ADDED} events are not issued in this case; instead a
single @code{PyDict_EVENT_CLONED} is issued, and `key' will be the source
dictionary.

The callback may inspect but must not modify `dict'; doing so could have
unpredictable effects, including infinite recursion. Do not trigger Python
code execution in the callback, as it could modify the dict as a side effect.

If `event' is @code{PyDict_EVENT_DEALLOCATED}, taking a new reference in the
callback to the about-to-be-destroyed dictionary will resurrect it and
prevent it from being freed at this time. When the resurrected object is
destroyed later, any watcher callbacks active at that time will be called
again.

Callbacks occur before the notified modification to `dict' takes place, so
the prior state of `dict' can be inspected.

If the callback sets an exception, it must return @code{-1}; this exception will
be printed as an unraisable exception using @ref{5f2,,PyErr_WriteUnraisable()}.
Otherwise it should return @code{0}.

There may already be a pending exception set on entry to the callback. In
this case, the callback should return @code{0} with the same exception still
set. This means the callback may not call any other API that can set an
exception unless it saves and clears the exception state first, and restores
it before returning.


Added in version 3.12.

@end deffn

@menu
* Dictionary View Objects:: 
* Ordered Dictionaries:: 

@end menu

@node Dictionary View Objects,Ordered Dictionaries,,Dictionary Objects
@anchor{c-api/dict dictionary-view-objects}@anchor{570e}
@subsubsection Dictionary View Objects


@geindex PyDictViewSet_Check (C function)
@anchor{c-api/dict c PyDictViewSet_Check}@anchor{570f}
@deffn {C Function} int PyDictViewSet_Check (PyObject *op)

Return true if `op' is a view of a set inside a dictionary. This is currently
equivalent to @ref{5710,,PyDictKeys_Check}(@ref{570f,,op}) || @ref{5711,,PyDictItems_Check}(op). This
function always succeeds.
@end deffn

@geindex PyDictKeys_Type (C var)
@anchor{c-api/dict c PyDictKeys_Type}@anchor{5316}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyDictKeys_Type
` Part of the @ref{776,,Stable ABI}.'
Type object for a view of dictionary keys. In Python, this is the type of
the object returned by @ref{9d6,,dict.keys()}.
@end deffn

@geindex PyDictKeys_Check (C function)
@anchor{c-api/dict c PyDictKeys_Check}@anchor{5710}
@deffn {C Function} int PyDictKeys_Check (PyObject *op)

Return true if `op' is an instance of a dictionary keys view. This function
always succeeds.
@end deffn

@geindex PyDictValues_Type (C var)
@anchor{c-api/dict c PyDictValues_Type}@anchor{531c}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyDictValues_Type
` Part of the @ref{776,,Stable ABI}.'
Type object for a view of dictionary values. In Python, this is the type of
the object returned by @ref{9d7,,dict.values()}.
@end deffn

@geindex PyDictValues_Check (C function)
@anchor{c-api/dict c PyDictValues_Check}@anchor{5712}
@deffn {C Function} int PyDictValues_Check (PyObject *op)

Return true if `op' is an instance of a dictionary values view. This function
always succeeds.
@end deffn

@geindex PyDictItems_Type (C var)
@anchor{c-api/dict c PyDictItems_Type}@anchor{5312}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyDictItems_Type
` Part of the @ref{776,,Stable ABI}.'
Type object for a view of dictionary items. In Python, this is the type of
the object returned by @ref{9d8,,dict.items()}.
@end deffn

@geindex PyDictItems_Check (C function)
@anchor{c-api/dict c PyDictItems_Check}@anchor{5711}
@deffn {C Function} int PyDictItems_Check (PyObject *op)

Return true if `op' is an instance of a dictionary items view. This function
always succeeds.
@end deffn

@node Ordered Dictionaries,,Dictionary View Objects,Dictionary Objects
@anchor{c-api/dict ordered-dictionaries}@anchor{5713}
@subsubsection Ordered Dictionaries


Python’s C API provides interface for @ref{7f4,,collections.OrderedDict} from C.
Since Python 3.7, dictionaries are ordered by default, so there is usually
little need for these functions; prefer @code{PyDict*} where possible.

@geindex PyODict_Type (C var)
@anchor{c-api/dict c PyODict_Type}@anchor{5714}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyODict_Type

Type object for ordered dictionaries. This is the same object as
@ref{7f4,,collections.OrderedDict} in the Python layer.
@end deffn

@geindex PyODict_Check (C function)
@anchor{c-api/dict c PyODict_Check}@anchor{5715}
@deffn {C Function} int PyODict_Check (PyObject *od)

Return true if `od' is an ordered dictionary object or an instance of a
subtype of the @ref{7f4,,OrderedDict} type.  This function
always succeeds.
@end deffn

@geindex PyODict_CheckExact (C function)
@anchor{c-api/dict c PyODict_CheckExact}@anchor{5716}
@deffn {C Function} int PyODict_CheckExact (PyObject *od)

Return true if `od' is an ordered dictionary object, but not an instance of
a subtype of the @ref{7f4,,OrderedDict} type.
This function always succeeds.
@end deffn

@geindex PyODictKeys_Type (C var)
@anchor{c-api/dict c PyODictKeys_Type}@anchor{5717}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyODictKeys_Type

Analogous to @ref{5316,,PyDictKeys_Type} for ordered dictionaries.
@end deffn

@geindex PyODictValues_Type (C var)
@anchor{c-api/dict c PyODictValues_Type}@anchor{5718}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyODictValues_Type

Analogous to @ref{531c,,PyDictValues_Type} for ordered dictionaries.
@end deffn

@geindex PyODictItems_Type (C var)
@anchor{c-api/dict c PyODictItems_Type}@anchor{5719}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyODictItems_Type

Analogous to @ref{5312,,PyDictItems_Type} for ordered dictionaries.
@end deffn

@geindex PyODict_New (C function)
@anchor{c-api/dict c PyODict_New}@anchor{571a}
@deffn {C Function} @ref{5df,,PyObject} *PyODict_New (void)

Return a new empty ordered dictionary, or @code{NULL} on failure.

This is analogous to @ref{5324,,PyDict_New()}.
@end deffn

@geindex PyODict_SetItem (C function)
@anchor{c-api/dict c PyODict_SetItem}@anchor{571b}
@deffn {C Function} int PyODict_SetItem (PyObject *od, PyObject *key, PyObject *value)

Insert `value' into the ordered dictionary `od' with a key of `key'.
Return @code{0} on success or @code{-1} with an exception set on failure.

This is analogous to @ref{5219,,PyDict_SetItem()}.
@end deffn

@geindex PyODict_DelItem (C function)
@anchor{c-api/dict c PyODict_DelItem}@anchor{571c}
@deffn {C Function} int PyODict_DelItem (PyObject *od, PyObject *key)

Remove the entry in the ordered dictionary `od' with key `key'.
Return @code{0} on success or @code{-1} with an exception set on failure.

This is analogous to @ref{531e,,PyDict_DelItem()}.
@end deffn

These are @ref{23f,,soft deprecated} aliases to @code{PyDict} APIs:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

@code{PyODict}

@tab

@code{PyDict}

@item

@geindex PyODict_GetItem (C macro)
@anchor{c-api/dict c PyODict_GetItem}@anchor{571d}
@deffn {C Macro} PyODict_GetItem (od, key)
@end deffn

@tab

@ref{628,,PyDict_GetItem()}

@item

@geindex PyODict_GetItemWithError (C macro)
@anchor{c-api/dict c PyODict_GetItemWithError}@anchor{571e}
@deffn {C Macro} PyODict_GetItemWithError (od, key)
@end deffn

@tab

@ref{5e1,,PyDict_GetItemWithError()}

@item

@geindex PyODict_GetItemString (C macro)
@anchor{c-api/dict c PyODict_GetItemString}@anchor{571f}
@deffn {C Macro} PyODict_GetItemString (od, key)
@end deffn

@tab

@ref{629,,PyDict_GetItemString()}

@item

@geindex PyODict_Contains (C macro)
@anchor{c-api/dict c PyODict_Contains}@anchor{5720}
@deffn {C Macro} PyODict_Contains (od, key)
@end deffn

@tab

@ref{5de,,PyDict_Contains()}

@item

@geindex PyODict_Size (C macro)
@anchor{c-api/dict c PyODict_Size}@anchor{5721}
@deffn {C Macro} PyODict_Size (od)
@end deffn

@tab

@ref{5325,,PyDict_Size()}

@item

@geindex PyODict_SIZE (C macro)
@anchor{c-api/dict c PyODict_SIZE}@anchor{5722}
@deffn {C Macro} PyODict_SIZE (od)
@end deffn

@tab

@ref{570a,,PyDict_GET_SIZE()}

@end multitable


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Set Objects,,Dictionary Objects,Container Objects
@anchor{c-api/set doc}@anchor{5723}@anchor{c-api/set set-objects}@anchor{5724}@anchor{c-api/set setobjects}@anchor{5725}@anchor{c-api/set translation-repo}@anchor{5726}
@subsubsection Set Objects


@geindex object; set
@geindex object; frozenset

This section details the public API for @ref{185,,set} and @ref{7f3,,frozenset}
objects.  Any functionality not listed below is best accessed using either
the abstract object protocol (including @ref{640,,PyObject_CallMethod()},
@ref{1dd0,,PyObject_RichCompareBool()}, @ref{434,,PyObject_Hash()},
@ref{1235,,PyObject_Repr()}, @ref{53f4,,PyObject_IsTrue()}, @ref{1792,,PyObject_Print()}, and
@ref{53f3,,PyObject_GetIter()}) or the abstract number protocol (including
@ref{53c7,,PyNumber_And()}, @ref{53e0,,PyNumber_Subtract()}, @ref{53db,,PyNumber_Or()},
@ref{53e2,,PyNumber_Xor()}, @ref{53cc,,PyNumber_InPlaceAnd()},
@ref{53d4,,PyNumber_InPlaceSubtract()}, @ref{53d0,,PyNumber_InPlaceOr()}, and
@ref{53d6,,PyNumber_InPlaceXor()}).

@geindex PySetObject (C type)
@anchor{c-api/set c PySetObject}@anchor{5727}
@deffn {C Type} type PySetObject

This subtype of @ref{5df,,PyObject} is used to hold the internal data for both
@ref{185,,set} and @ref{7f3,,frozenset} objects.  It is like a @ref{64f,,PyDictObject}
in that it is a fixed size for small sets (much like tuple storage) and will
point to a separate, variable sized block of memory for medium and large sized
sets (much like list storage). None of the fields of this structure should be
considered public and all are subject to change.  All access should be done through
the documented API rather than by manipulating the values in the structure.
@end deffn

@geindex PySet_Type (C var)
@anchor{c-api/set c PySet_Type}@anchor{5410}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PySet_Type
` Part of the @ref{776,,Stable ABI}.'
This is an instance of @ref{ca2,,PyTypeObject} representing the Python
@ref{185,,set} type.
@end deffn

@geindex PyFrozenSet_Type (C var)
@anchor{c-api/set c PyFrozenSet_Type}@anchor{538c}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyFrozenSet_Type
` Part of the @ref{776,,Stable ABI}.'
This is an instance of @ref{ca2,,PyTypeObject} representing the Python
@ref{7f3,,frozenset} type.
@end deffn

The following type check macros work on pointers to any Python object. Likewise,
the constructor functions work with any iterable Python object.

@geindex PySet_Check (C function)
@anchor{c-api/set c PySet_Check}@anchor{5728}
@deffn {C Function} int PySet_Check (PyObject *p)

Return true if `p' is a @ref{185,,set} object or an instance of a subtype.
This function always succeeds.
@end deffn

@geindex PyFrozenSet_Check (C function)
@anchor{c-api/set c PyFrozenSet_Check}@anchor{5729}
@deffn {C Function} int PyFrozenSet_Check (PyObject *p)

Return true if `p' is a @ref{7f3,,frozenset} object or an instance of a
subtype.  This function always succeeds.
@end deffn

@geindex PyAnySet_Check (C function)
@anchor{c-api/set c PyAnySet_Check}@anchor{572a}
@deffn {C Function} int PyAnySet_Check (PyObject *p)

Return true if `p' is a @ref{185,,set} object, a @ref{7f3,,frozenset} object, or an
instance of a subtype.  This function always succeeds.
@end deffn

@geindex PySet_CheckExact (C function)
@anchor{c-api/set c PySet_CheckExact}@anchor{aa3}
@deffn {C Function} int PySet_CheckExact (PyObject *p)

Return true if `p' is a @ref{185,,set} object but not an instance of a
subtype.  This function always succeeds.


Added in version 3.10.

@end deffn

@geindex PyAnySet_CheckExact (C function)
@anchor{c-api/set c PyAnySet_CheckExact}@anchor{572b}
@deffn {C Function} int PyAnySet_CheckExact (PyObject *p)

Return true if `p' is a @ref{185,,set} object or a @ref{7f3,,frozenset} object but
not an instance of a subtype.  This function always succeeds.
@end deffn

@geindex PyFrozenSet_CheckExact (C function)
@anchor{c-api/set c PyFrozenSet_CheckExact}@anchor{572c}
@deffn {C Function} int PyFrozenSet_CheckExact (PyObject *p)

Return true if `p' is a @ref{7f3,,frozenset} object but not an instance of a
subtype.  This function always succeeds.
@end deffn

@geindex PySet_New (C function)
@anchor{c-api/set c PySet_New}@anchor{1650}
@deffn {C Function} @ref{5df,,PyObject} *PySet_New (PyObject *iterable)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{2773,,Safe for concurrent use on the same object}.'
Return a new @ref{185,,set} containing objects returned by the `iterable'.  The
`iterable' may be @code{NULL} to create a new empty set.  Return the new set on
success or @code{NULL} on failure.  Raise @ref{199,,TypeError} if `iterable' is not
actually iterable.  The constructor is also useful for copying a set
(@code{c=set(s)}).

@cartouche
@quotation Note 
The operation is atomic on @ref{1791,,free threading}
when `iterable' is a @ref{185,,set}, @ref{7f3,,frozenset} or @ref{184,,dict}.
@end quotation
@end cartouche
@end deffn

@geindex PyFrozenSet_New (C function)
@anchor{c-api/set c PyFrozenSet_New}@anchor{1651}
@deffn {C Function} @ref{5df,,PyObject} *PyFrozenSet_New (PyObject *iterable)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{2773,,Safe for concurrent use on the same object}.'
Return a new @ref{7f3,,frozenset} containing objects returned by the `iterable'.
The `iterable' may be @code{NULL} to create a new empty frozenset.  Return the new
set on success or @code{NULL} on failure.  Raise @ref{199,,TypeError} if `iterable' is
not actually iterable.

@cartouche
@quotation Note 
The operation is atomic on @ref{1791,,free threading}
when `iterable' is a @ref{185,,set}, @ref{7f3,,frozenset} or @ref{184,,dict}.
@end quotation
@end cartouche
@end deffn

The following functions and macros are available for instances of @ref{185,,set}
or @ref{7f3,,frozenset} or instances of their subtypes.

@geindex PySet_Size (C function)
@anchor{c-api/set c PySet_Size}@anchor{1655}
@deffn {C Function} @ref{c5b,,Py_ssize_t} PySet_Size (PyObject *anyset)
` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{2778,,Atomic}.'
@geindex built-in function; len

Return the length of a @ref{185,,set} or @ref{7f3,,frozenset} object. Equivalent to
@code{len(anyset)}.  Raises a @ref{796,,SystemError} if `anyset' is not a
@code{set}, @code{frozenset}, or an instance of a subtype.
@end deffn

@geindex PySet_GET_SIZE (C function)
@anchor{c-api/set c PySet_GET_SIZE}@anchor{572d}
@deffn {C Function} @ref{c5b,,Py_ssize_t} PySet_GET_SIZE (PyObject *anyset)
` Thread safety: @ref{2778,,Atomic}.'
Macro form of @ref{1655,,PySet_Size()} without error checking.
@end deffn

@geindex PySet_Contains (C function)
@anchor{c-api/set c PySet_Contains}@anchor{1654}
@deffn {C Function} int PySet_Contains (PyObject *anyset, PyObject *key)
` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{2773,,Safe for concurrent use on the same object}.'
Return @code{1} if found, @code{0} if not found, and @code{-1} if an error is encountered.  Unlike
the Python @ref{15c5,,__contains__()} method, this function does not automatically
convert unhashable sets into temporary frozensets.  Raise a @ref{199,,TypeError} if
the `key' is unhashable. Raise @ref{796,,SystemError} if `anyset' is not a
@ref{185,,set}, @ref{7f3,,frozenset}, or an instance of a subtype.

@cartouche
@quotation Note 
The operation is atomic on @ref{1791,,free threading}
when `key' is @ref{16a,,str}, @ref{19c,,int}, @ref{197,,float}, @ref{3c1,,bool} or @ref{193,,bytes}.
@end quotation
@end cartouche
@end deffn

@geindex PySet_Add (C function)
@anchor{c-api/set c PySet_Add}@anchor{1652}
@deffn {C Function} int PySet_Add (PyObject *set, PyObject *key)
` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{2773,,Safe for concurrent use on the same object}.'
Add `key' to a @ref{185,,set} instance.  Also works with @ref{7f3,,frozenset}
instances (like @ref{5218,,PyTuple_SetItem()} it can be used to fill in the values
of brand new frozensets before they are exposed to other code).  Return @code{0} on
success or @code{-1} on failure. Raise a @ref{199,,TypeError} if the `key' is
unhashable. Raise a @ref{1761,,MemoryError} if there is no room to grow.  Raise a
@ref{796,,SystemError} if `set' is not an instance of @code{set} or its
subtype.

@cartouche
@quotation Note 
The operation is atomic on @ref{1791,,free threading}
when `key' is @ref{16a,,str}, @ref{19c,,int}, @ref{197,,float}, @ref{3c1,,bool} or @ref{193,,bytes}.
@end quotation
@end cartouche
@end deffn

The following functions are available for instances of @ref{185,,set} or its
subtypes but not for instances of @ref{7f3,,frozenset} or its subtypes.

@geindex PySet_Discard (C function)
@anchor{c-api/set c PySet_Discard}@anchor{1653}
@deffn {C Function} int PySet_Discard (PyObject *set, PyObject *key)
` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{2773,,Safe for concurrent use on the same object}.'
Return @code{1} if found and removed, @code{0} if not found (no action taken), and @code{-1} if an
error is encountered.  Does not raise @ref{5e7,,KeyError} for missing keys.  Raise a
@ref{199,,TypeError} if the `key' is unhashable.  Unlike the Python @ref{26e9,,discard()}
method, this function does not automatically convert unhashable sets into
temporary frozensets. Raise @ref{796,,SystemError} if `set' is not an
instance of @ref{185,,set} or its subtype.

@cartouche
@quotation Note 
The operation is atomic on @ref{1791,,free threading}
when `key' is @ref{16a,,str}, @ref{19c,,int}, @ref{197,,float}, @ref{3c1,,bool} or @ref{193,,bytes}.
@end quotation
@end cartouche
@end deffn

@geindex PySet_Pop (C function)
@anchor{c-api/set c PySet_Pop}@anchor{540f}
@deffn {C Function} @ref{5df,,PyObject} *PySet_Pop (PyObject *set)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{2778,,Atomic}.'
Return a new reference to an arbitrary object in the `set', and removes the
object from the `set'.  Return @code{NULL} on failure.  Raise @ref{5e7,,KeyError} if the
set is empty. Raise a @ref{796,,SystemError} if `set' is not an instance of
@ref{185,,set} or its subtype.
@end deffn

@geindex PySet_Clear (C function)
@anchor{c-api/set c PySet_Clear}@anchor{540e}
@deffn {C Function} int PySet_Clear (PyObject *set)
` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{2778,,Atomic}.'
Empty an existing set of all elements. Return @code{0} on
success. Return @code{-1} and raise @ref{796,,SystemError} if `set' is not an instance of
@ref{185,,set} or its subtype.

@cartouche
@quotation Note 
In the @ref{1791,,free-threaded build}, the set is emptied before its entries
are cleared, so other threads will observe an empty set rather than
intermediate states.
@end quotation
@end cartouche
@end deffn

@menu
* Deprecated API: Deprecated API<3>. 

@end menu

@node Deprecated API<3>,,,Set Objects
@anchor{c-api/set deprecated-api}@anchor{572e}
@subsubsection Deprecated API


@geindex PySet_MINSIZE (C macro)
@anchor{c-api/set c PySet_MINSIZE}@anchor{572f}
@deffn {C Macro} PySet_MINSIZE

A @ref{23f,,soft deprecated} constant representing the size of an internal
preallocated table inside @ref{5727,,PySetObject} instances.

This is documented solely for completeness, as there are no guarantees
that a given version of CPython uses preallocated tables with a fixed
size.
In code that does not deal with unstable set internals,
@code{PySet_MINSIZE} can be replaced with a small constant like @code{8}.

If looking for the size of a set, use @ref{1655,,PySet_Size()} instead.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Function Objects<2>,Other Objects,Container Objects,Concrete Objects Layer
@anchor{c-api/concrete function-objects}@anchor{5730}@anchor{c-api/concrete otherobjects}@anchor{5731}
@subsection Function Objects


@menu
* Function Objects: Function Objects<3>. 
* Instance Method Objects:: 
* Method Objects: Method Objects<2>. 
* Cell Objects:: 
* Code Objects: Code Objects<2>. 
* Code Object Flags:: 
* Extra information:: 

@end menu

@node Function Objects<3>,Instance Method Objects,,Function Objects<2>
@anchor{c-api/function doc}@anchor{5732}@anchor{c-api/function function-objects}@anchor{5733}@anchor{c-api/function id1}@anchor{5734}
@subsubsection Function Objects


@geindex object; function

There are a few functions specific to Python functions.

@geindex PyFunctionObject (C type)
@anchor{c-api/function c PyFunctionObject}@anchor{784}
@deffn {C Type} type PyFunctionObject

The C structure used for functions.
@end deffn

@geindex PyFunction_Type (C var)
@anchor{c-api/function c PyFunction_Type}@anchor{5735}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyFunction_Type

@geindex MethodType (in module types)

This is an instance of @ref{ca2,,PyTypeObject} and represents the Python function
type.  It is exposed to Python programmers as @code{types.FunctionType}.
@end deffn

@geindex PyFunction_Check (C function)
@anchor{c-api/function c PyFunction_Check}@anchor{5736}
@deffn {C Function} int PyFunction_Check (PyObject *o)

Return true if `o' is a function object (has type @ref{5735,,PyFunction_Type}).
The parameter must not be @code{NULL}.  This function always succeeds.
@end deffn

@geindex PyFunction_New (C function)
@anchor{c-api/function c PyFunction_New}@anchor{5737}
@deffn {C Function} @ref{5df,,PyObject} *PyFunction_New (PyObject *code, PyObject *globals)
`Return value: New reference.'
Return a new function object associated with the code object `code'. `globals'
must be a dictionary with the global variables accessible to the function.

The function’s docstring and name are retrieved from the code object.
@ref{238e,,__module__}
is retrieved from `globals'. The argument defaults, annotations and closure are
set to @code{NULL}. @ref{238d,,__qualname__} is set to the same value as
the code object’s @ref{23cd,,co_qualname} field.
@end deffn

@geindex PyFunction_NewWithQualName (C function)
@anchor{c-api/function c PyFunction_NewWithQualName}@anchor{5738}
@deffn {C Function} @ref{5df,,PyObject} *PyFunction_NewWithQualName (PyObject *code, PyObject *globals, PyObject *qualname)
`Return value: New reference.'
As @ref{5737,,PyFunction_New()}, but also allows setting the function object’s
@ref{238d,,__qualname__} attribute.
`qualname' should be a unicode object or @code{NULL};
if @code{NULL}, the @code{__qualname__} attribute is set to the same value as
the code object’s @ref{23cd,,co_qualname} field.


Added in version 3.3.

@end deffn

@geindex PyFunction_GetCode (C function)
@anchor{c-api/function c PyFunction_GetCode}@anchor{5739}
@deffn {C Function} @ref{5df,,PyObject} *PyFunction_GetCode (PyObject *op)
`Return value: Borrowed reference.'
Return the code object associated with the function object `op'.
@end deffn

@geindex PyFunction_GetGlobals (C function)
@anchor{c-api/function c PyFunction_GetGlobals}@anchor{573a}
@deffn {C Function} @ref{5df,,PyObject} *PyFunction_GetGlobals (PyObject *op)
`Return value: Borrowed reference.'
Return the globals dictionary associated with the function object `op'.
@end deffn

@geindex PyFunction_GetModule (C function)
@anchor{c-api/function c PyFunction_GetModule}@anchor{573b}
@deffn {C Function} @ref{5df,,PyObject} *PyFunction_GetModule (PyObject *op)
`Return value: Borrowed reference.'
Return a @ref{3d5,,borrowed reference} to the @ref{238e,,__module__}
attribute of the @ref{59c,,function object} `op'.
It can be `NULL'.

This is normally a @ref{16a,,string} containing the module name,
but can be set to any other object by Python code.
@end deffn

@geindex PyFunction_GetDefaults (C function)
@anchor{c-api/function c PyFunction_GetDefaults}@anchor{573c}
@deffn {C Function} @ref{5df,,PyObject} *PyFunction_GetDefaults (PyObject *op)
`Return value: Borrowed reference.'
Return the argument default values of the function object `op'. This can be a
tuple of arguments or @code{NULL}.
@end deffn

@geindex PyFunction_SetDefaults (C function)
@anchor{c-api/function c PyFunction_SetDefaults}@anchor{573d}
@deffn {C Function} int PyFunction_SetDefaults (PyObject *op, PyObject *defaults)

Set the argument default values for the function object `op'. `defaults' must be
@code{Py_None} or a tuple.

Raises @ref{796,,SystemError} and returns @code{-1} on failure.
@end deffn

@geindex PyFunction_SetVectorcall (C function)
@anchor{c-api/function c PyFunction_SetVectorcall}@anchor{783}
@deffn {C Function} void PyFunction_SetVectorcall (PyFunctionObject *func, vectorcallfunc vectorcall)

Set the vectorcall field of a given function object `func'.

Warning: extensions using this API must preserve the behavior
of the unaltered (default) vectorcall function!


Added in version 3.12.

@end deffn

@geindex PyFunction_GetKwDefaults (C function)
@anchor{c-api/function c PyFunction_GetKwDefaults}@anchor{573e}
@deffn {C Function} @ref{5df,,PyObject} *PyFunction_GetKwDefaults (PyObject *op)
`Return value: Borrowed reference.'
Return the keyword-only argument default values of the function object `op'. This can be a
dictionary of arguments or @code{NULL}.
@end deffn

@geindex PyFunction_SetKwDefaults (C function)
@anchor{c-api/function c PyFunction_SetKwDefaults}@anchor{573f}
@deffn {C Function} int PyFunction_SetKwDefaults (PyObject *op, PyObject *defaults)

Set the keyword-only argument default values of the function object `op'.
`defaults' must be a dictionary of keyword-only arguments or @code{Py_None}.

This function returns @code{0} on success, and returns @code{-1} with an exception
set on failure.
@end deffn

@geindex PyFunction_GetClosure (C function)
@anchor{c-api/function c PyFunction_GetClosure}@anchor{5740}
@deffn {C Function} @ref{5df,,PyObject} *PyFunction_GetClosure (PyObject *op)
`Return value: Borrowed reference.'
Return the closure associated with the function object `op'. This can be @code{NULL}
or a tuple of cell objects.
@end deffn

@geindex PyFunction_SetClosure (C function)
@anchor{c-api/function c PyFunction_SetClosure}@anchor{5741}
@deffn {C Function} int PyFunction_SetClosure (PyObject *op, PyObject *closure)

Set the closure associated with the function object `op'. `closure' must be
@code{Py_None} or a tuple of cell objects.

Raises @ref{796,,SystemError} and returns @code{-1} on failure.
@end deffn

@geindex PyFunction_GetAnnotations (C function)
@anchor{c-api/function c PyFunction_GetAnnotations}@anchor{1b7b}
@deffn {C Function} @ref{5df,,PyObject} *PyFunction_GetAnnotations (PyObject *op)
`Return value: Borrowed reference.'
Return the annotations of the function object `op'. This can be a
mutable dictionary or @code{NULL}.
@end deffn

@geindex PyFunction_SetAnnotations (C function)
@anchor{c-api/function c PyFunction_SetAnnotations}@anchor{5742}
@deffn {C Function} int PyFunction_SetAnnotations (PyObject *op, PyObject *annotations)

Set the annotations for the function object `op'. `annotations'
must be a dictionary or @code{Py_None}.

Raises @ref{796,,SystemError} and returns @code{-1} on failure.
@end deffn

@geindex PyFunction_GET_CODE (C function)
@geindex PyFunction_GET_GLOBALS (C function)
@geindex PyFunction_GET_MODULE (C function)
@geindex PyFunction_GET_DEFAULTS (C function)
@geindex PyFunction_GET_KW_DEFAULTS (C function)
@geindex PyFunction_GET_CLOSURE (C function)
@geindex PyFunction_GET_ANNOTATIONS (C function)
@anchor{c-api/function c PyFunction_GET_CODE}@anchor{5743}
@deffn {C Function} @ref{5df,,PyObject} *PyFunction_GET_CODE (PyObject *op)
@anchor{c-api/function c PyFunction_GET_GLOBALS}@anchor{5744}
@deffnx {C Function} @ref{5df,,PyObject} *PyFunction_GET_GLOBALS (PyObject *op)
@anchor{c-api/function c PyFunction_GET_MODULE}@anchor{5745}
@deffnx {C Function} @ref{5df,,PyObject} *PyFunction_GET_MODULE (PyObject *op)
@anchor{c-api/function c PyFunction_GET_DEFAULTS}@anchor{5746}
@deffnx {C Function} @ref{5df,,PyObject} *PyFunction_GET_DEFAULTS (PyObject *op)
@anchor{c-api/function c PyFunction_GET_KW_DEFAULTS}@anchor{5747}
@deffnx {C Function} @ref{5df,,PyObject} *PyFunction_GET_KW_DEFAULTS (PyObject *op)
@anchor{c-api/function c PyFunction_GET_CLOSURE}@anchor{5748}
@deffnx {C Function} @ref{5df,,PyObject} *PyFunction_GET_CLOSURE (PyObject *op)
@anchor{c-api/function c PyFunction_GET_ANNOTATIONS}@anchor{5749}
@deffnx {C Function} @ref{5df,,PyObject} *PyFunction_GET_ANNOTATIONS (PyObject *op)
`Return value: Borrowed reference.'
These functions are similar to their @code{PyFunction_Get*} counterparts, but
do not do type checking. Passing anything other than an instance of
@ref{5735,,PyFunction_Type} is undefined behavior.
@end deffn

@geindex PyFunction_AddWatcher (C function)
@anchor{c-api/function c PyFunction_AddWatcher}@anchor{574a}
@deffn {C Function} int PyFunction_AddWatcher (PyFunction_WatchCallback callback)

Register `callback' as a function watcher for the current interpreter.
Return an ID which may be passed to @ref{574b,,PyFunction_ClearWatcher()}.
In case of error (e.g. no more watcher IDs available),
return @code{-1} and set an exception.


Added in version 3.12.

@end deffn

@geindex PyFunction_ClearWatcher (C function)
@anchor{c-api/function c PyFunction_ClearWatcher}@anchor{574b}
@deffn {C Function} int PyFunction_ClearWatcher (int watcher_id)

Clear watcher identified by `watcher_id' previously returned from
@ref{574a,,PyFunction_AddWatcher()} for the current interpreter.
Return @code{0} on success, or @code{-1} and set an exception on error
(e.g.  if the given `watcher_id' was never registered.)


Added in version 3.12.

@end deffn

@geindex PyFunction_WatchEvent (C type)
@anchor{c-api/function c PyFunction_WatchEvent}@anchor{574c}
@deffn {C Type} type PyFunction_WatchEvent

@quotation

Enumeration of possible function watcher events:


@itemize -

@item 
@code{PyFunction_EVENT_CREATE}

@item 
@code{PyFunction_EVENT_DESTROY}

@item 
@code{PyFunction_EVENT_MODIFY_CODE}

@item 
@code{PyFunction_EVENT_MODIFY_DEFAULTS}

@item 
@code{PyFunction_EVENT_MODIFY_KWDEFAULTS}
@end itemize
@end quotation


Added in version 3.12.

@end deffn

@geindex PyFunction_WatchCallback (C type)
@anchor{c-api/function c PyFunction_WatchCallback}@anchor{574d}
@deffn {C Type} typedef int (*PyFunction_WatchCallback)(@ref{574c,,PyFunction_WatchEvent} event, @ref{784,,PyFunctionObject} *func, @ref{5df,,PyObject} *new_value)

Type of a function watcher callback function.

If `event' is @code{PyFunction_EVENT_CREATE} or @code{PyFunction_EVENT_DESTROY}
then `new_value' will be @code{NULL}. Otherwise, `new_value' will hold a
@ref{3d5,,borrowed reference} to the new value that is about to be stored in
`func' for the attribute that is being modified.

The callback may inspect but must not modify `func'; doing so could have
unpredictable effects, including infinite recursion.

If `event' is @code{PyFunction_EVENT_CREATE}, then the callback is invoked
after `func' has been fully initialized. Otherwise, the callback is invoked
before the modification to `func' takes place, so the prior state of `func'
can be inspected. The runtime is permitted to optimize away the creation of
function objects when possible. In such cases no event will be emitted.
Although this creates the possibility of an observable difference of
runtime behavior depending on optimization decisions, it does not change
the semantics of the Python code being executed.

If `event' is @code{PyFunction_EVENT_DESTROY},  Taking a reference in the
callback to the about-to-be-destroyed function will resurrect it, preventing
it from being freed at this time. When the resurrected object is destroyed
later, any watcher callbacks active at that time will be called again.

If the callback sets an exception, it must return @code{-1}; this exception will
be printed as an unraisable exception using @ref{5f2,,PyErr_WriteUnraisable()}.
Otherwise it should return @code{0}.

There may already be a pending exception set on entry to the callback. In
this case, the callback should return @code{0} with the same exception still
set. This means the callback may not call any other API that can set an
exception unless it saves and clears the exception state first, and restores
it before returning.


Added in version 3.12.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Instance Method Objects,Method Objects<2>,Function Objects<3>,Function Objects<2>
@anchor{c-api/method doc}@anchor{574e}@anchor{c-api/method instance-method-objects}@anchor{574f}@anchor{c-api/method instancemethod-objects}@anchor{5750}@anchor{c-api/method translation-repo}@anchor{5751}
@subsubsection Instance Method Objects


@geindex object; instancemethod

An instance method is a wrapper for a @ref{1684,,PyCFunction} and the new way
to bind a @code{PyCFunction} to a class object. It replaces the former call
@code{PyMethod_New(func, NULL, class)}.

@geindex PyInstanceMethod_Type (C var)
@anchor{c-api/method c PyInstanceMethod_Type}@anchor{5752}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyInstanceMethod_Type

This instance of @ref{ca2,,PyTypeObject} represents the Python instance
method type. It is not exposed to Python programs.
@end deffn

@geindex PyInstanceMethod_Check (C function)
@anchor{c-api/method c PyInstanceMethod_Check}@anchor{5753}
@deffn {C Function} int PyInstanceMethod_Check (PyObject *o)

Return true if `o' is an instance method object (has type
@ref{5752,,PyInstanceMethod_Type}).  The parameter must not be @code{NULL}.
This function always succeeds.
@end deffn

@geindex PyInstanceMethod_New (C function)
@anchor{c-api/method c PyInstanceMethod_New}@anchor{5754}
@deffn {C Function} @ref{5df,,PyObject} *PyInstanceMethod_New (PyObject *func)
`Return value: New reference.'
Return a new instance method object, with `func' being any callable object.
`func' is the function that will be called when the instance method is
called.
@end deffn

@geindex PyInstanceMethod_Function (C function)
@anchor{c-api/method c PyInstanceMethod_Function}@anchor{5755}
@deffn {C Function} @ref{5df,,PyObject} *PyInstanceMethod_Function (PyObject *im)
`Return value: Borrowed reference.'
Return the function object associated with the instance method `im'.
@end deffn

@geindex PyInstanceMethod_GET_FUNCTION (C function)
@anchor{c-api/method c PyInstanceMethod_GET_FUNCTION}@anchor{5756}
@deffn {C Function} @ref{5df,,PyObject} *PyInstanceMethod_GET_FUNCTION (PyObject *im)
`Return value: Borrowed reference.'
Macro version of @ref{5755,,PyInstanceMethod_Function()} which avoids error checking.
@end deffn

@node Method Objects<2>,Cell Objects,Instance Method Objects,Function Objects<2>
@anchor{c-api/method id1}@anchor{5757}@anchor{c-api/method method-objects}@anchor{5758}
@subsubsection Method Objects


@geindex object; method

Methods are bound function objects. Methods are always bound to an instance of
a user-defined class. Unbound methods (methods bound to a class object) are
no longer available.

@geindex PyMethod_Type (C var)
@anchor{c-api/method c PyMethod_Type}@anchor{5759}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyMethod_Type

@geindex MethodType (in module types)

This instance of @ref{ca2,,PyTypeObject} represents the Python method type.  This
is exposed to Python programs as @code{types.MethodType}.
@end deffn

@geindex PyMethod_Check (C function)
@anchor{c-api/method c PyMethod_Check}@anchor{575a}
@deffn {C Function} int PyMethod_Check (PyObject *o)

Return true if `o' is a method object (has type @ref{5759,,PyMethod_Type}).  The
parameter must not be @code{NULL}.  This function always succeeds.
@end deffn

@geindex PyMethod_New (C function)
@anchor{c-api/method c PyMethod_New}@anchor{575b}
@deffn {C Function} @ref{5df,,PyObject} *PyMethod_New (PyObject *func, PyObject *self)
`Return value: New reference.'
Return a new method object, with `func' being any callable object and `self'
the instance the method should be bound. `func' is the function that will
be called when the method is called. `self' must not be @code{NULL}.
@end deffn

@geindex PyMethod_Function (C function)
@anchor{c-api/method c PyMethod_Function}@anchor{575c}
@deffn {C Function} @ref{5df,,PyObject} *PyMethod_Function (PyObject *meth)
`Return value: Borrowed reference.'
Return the function object associated with the method `meth'.
@end deffn

@geindex PyMethod_GET_FUNCTION (C function)
@anchor{c-api/method c PyMethod_GET_FUNCTION}@anchor{575d}
@deffn {C Function} @ref{5df,,PyObject} *PyMethod_GET_FUNCTION (PyObject *meth)
`Return value: Borrowed reference.'
Macro version of @ref{575c,,PyMethod_Function()} which avoids error checking.
@end deffn

@geindex PyMethod_Self (C function)
@anchor{c-api/method c PyMethod_Self}@anchor{575e}
@deffn {C Function} @ref{5df,,PyObject} *PyMethod_Self (PyObject *meth)
`Return value: Borrowed reference.'
Return the instance associated with the method `meth'.
@end deffn

@geindex PyMethod_GET_SELF (C function)
@anchor{c-api/method c PyMethod_GET_SELF}@anchor{575f}
@deffn {C Function} @ref{5df,,PyObject} *PyMethod_GET_SELF (PyObject *meth)
`Return value: Borrowed reference.'
Macro version of @ref{575e,,PyMethod_Self()} which avoids error checking.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Cell Objects,Code Objects<2>,Method Objects<2>,Function Objects<2>
@anchor{c-api/cell doc}@anchor{5760}@anchor{c-api/cell cell-objects}@anchor{912}@anchor{c-api/cell id1}@anchor{5761}@anchor{c-api/cell translation-repo}@anchor{5762}
@subsubsection Cell Objects


“Cell” objects are used to implement variables referenced by multiple scopes.
For each such variable, a cell object is created to store the value; the local
variables of each stack frame that references the value contain a reference to
the cells from outer scopes which also use that variable.  When the value is
accessed, the value contained in the cell is used instead of the cell object
itself.  This de-referencing of the cell object requires support from the
generated byte-code; these are not automatically de-referenced when accessed.
Cell objects are not likely to be useful elsewhere.

@geindex PyCellObject (C type)
@anchor{c-api/cell c PyCellObject}@anchor{5763}
@deffn {C Type} type PyCellObject

The C structure used for cell objects.
@end deffn

@geindex PyCell_Type (C var)
@anchor{c-api/cell c PyCell_Type}@anchor{5764}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyCell_Type

The type object corresponding to cell objects.
@end deffn

@geindex PyCell_Check (C function)
@anchor{c-api/cell c PyCell_Check}@anchor{5765}
@deffn {C Function} int PyCell_Check (PyObject *ob)

Return true if `ob' is a cell object; `ob' must not be @code{NULL}.  This
function always succeeds.
@end deffn

@geindex PyCell_New (C function)
@anchor{c-api/cell c PyCell_New}@anchor{5766}
@deffn {C Function} @ref{5df,,PyObject} *PyCell_New (PyObject *ob)
`Return value: New reference.'
Create and return a new cell object containing the value `ob'. The parameter may
be @code{NULL}.
@end deffn

@geindex PyCell_Get (C function)
@anchor{c-api/cell c PyCell_Get}@anchor{5767}
@deffn {C Function} @ref{5df,,PyObject} *PyCell_Get (PyObject *cell)
`Return value: New reference.'
Return the contents of the cell `cell', which can be @code{NULL}.
If `cell' is not a cell object, returns @code{NULL} with an exception set.
@end deffn

@geindex PyCell_GET (C function)
@anchor{c-api/cell c PyCell_GET}@anchor{5768}
@deffn {C Function} @ref{5df,,PyObject} *PyCell_GET (PyObject *cell)
`Return value: Borrowed reference.'
Return the contents of the cell `cell', but without checking that `cell' is
non-@code{NULL} and a cell object.
@end deffn

@geindex PyCell_Set (C function)
@anchor{c-api/cell c PyCell_Set}@anchor{5769}
@deffn {C Function} int PyCell_Set (PyObject *cell, PyObject *value)

Set the contents of the cell object `cell' to `value'.  This releases the
reference to any current content of the cell. `value' may be @code{NULL}.  `cell'
must be non-@code{NULL}.

On success, return @code{0}.
If `cell' is not a cell object, set an exception and return @code{-1}.
@end deffn

@geindex PyCell_SET (C function)
@anchor{c-api/cell c PyCell_SET}@anchor{ab1}
@deffn {C Function} void PyCell_SET (PyObject *cell, PyObject *value)

Sets the value of the cell object `cell' to `value'.  No reference counts are
adjusted, and no checks are made for safety; `cell' must be non-@code{NULL} and must
be a cell object.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@geindex object; code
@geindex code object

@node Code Objects<2>,Code Object Flags,Cell Objects,Function Objects<2>
@anchor{c-api/code doc}@anchor{576a}@anchor{c-api/code code-objects}@anchor{576b}@anchor{c-api/code codeobjects}@anchor{7d3}@anchor{c-api/code translation-repo}@anchor{576c}
@subsubsection Code Objects


Code objects are a low-level detail of the CPython implementation.
Each one represents a chunk of executable code that hasn’t yet been
bound into a function.

@geindex PyCodeObject (C type)
@anchor{c-api/code c PyCodeObject}@anchor{980}
@deffn {C Type} type PyCodeObject

The C structure of the objects used to describe code objects.  The
fields of this type are subject to change at any time.
@end deffn

@geindex PyCode_Type (C var)
@anchor{c-api/code c PyCode_Type}@anchor{576d}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyCode_Type

This is an instance of @ref{ca2,,PyTypeObject} representing the Python
@ref{4e7,,code object}.
@end deffn

@geindex PyCode_Check (C function)
@anchor{c-api/code c PyCode_Check}@anchor{576e}
@deffn {C Function} int PyCode_Check (PyObject *co)

Return true if `co' is a @ref{4e7,,code object}.
This function always succeeds.
@end deffn

@geindex PyCode_GetNumFree (C function)
@anchor{c-api/code c PyCode_GetNumFree}@anchor{576f}
@deffn {C Function} @ref{c5b,,Py_ssize_t} PyCode_GetNumFree (PyCodeObject *co)

Return the number of @ref{18da,,free (closure) variables}
in a code object.
@end deffn

@geindex PyUnstable_Code_GetFirstFree (C function)
@anchor{c-api/code c PyUnstable_Code_GetFirstFree}@anchor{627}
@deffn {C Function} int PyUnstable_Code_GetFirstFree (PyCodeObject *co)

@cartouche
@quotation This is Unstable API. It may change without warning in minor releases. `This is @ref{76a,,Unstable API}. It may change without warning in minor releases.'
@end quotation
@end cartouche

Return the position of the first @ref{18da,,free (closure) variable}
in a code object.


Changed in version 3.13: Renamed from @code{PyCode_GetFirstFree} as part of @ref{76a,,Unstable C API}.
The old name is deprecated, but will remain available until the
signature changes again.

@end deffn

@geindex PyUnstable_Code_New (C function)
@anchor{c-api/code c PyUnstable_Code_New}@anchor{5770}
@deffn {C Function} @ref{980,,PyCodeObject} *PyUnstable_Code_New (int argcount, int kwonlyargcount, int nlocals, int stacksize, int flags, PyObject *code, PyObject *consts, PyObject *names, PyObject *varnames, PyObject *freevars, PyObject *cellvars, PyObject *filename, PyObject *name, PyObject *qualname, int firstlineno, PyObject *linetable, PyObject *exceptiontable)

@cartouche
@quotation This is Unstable API. It may change without warning in minor releases. `This is @ref{76a,,Unstable API}. It may change without warning in minor releases.'
@end quotation
@end cartouche

Return a new code object.  If you need a dummy code object to create a frame,
use @ref{155c,,PyCode_NewEmpty()} instead.

Since the definition of the bytecode changes often, calling
@ref{5770,,PyUnstable_Code_New()} directly can bind you to a precise Python version.

The many arguments of this function are inter-dependent in complex
ways, meaning that subtle changes to values are likely to result in incorrect
execution or VM crashes. Use this function only with extreme care.


Changed in version 3.11: Added @code{qualname} and @code{exceptiontable} parameters.


@geindex PyCode_New (C function)


Changed in version 3.12: Renamed from @code{PyCode_New} as part of @ref{76a,,Unstable C API}.
The old name is deprecated, but will remain available until the
signature changes again.

@end deffn

@geindex PyCode_NewWithPosOnlyArgs (C function)

@geindex PyUnstable_Code_NewWithPosOnlyArgs (C function)
@anchor{c-api/code c PyCode_NewWithPosOnlyArgs}@anchor{5771}@anchor{c-api/code c PyUnstable_Code_NewWithPosOnlyArgs}@anchor{5772}
@deffn {C Function} @ref{980,,PyCodeObject} *PyUnstable_Code_NewWithPosOnlyArgs (int argcount, int posonlyargcount, int kwonlyargcount, int nlocals, int stacksize, int flags, PyObject *code, PyObject *consts, PyObject *names, PyObject *varnames, PyObject *freevars, PyObject *cellvars, PyObject *filename, PyObject *name, PyObject *qualname, int firstlineno, PyObject *linetable, PyObject *exceptiontable)

@cartouche
@quotation This is Unstable API. It may change without warning in minor releases. `This is @ref{76a,,Unstable API}. It may change without warning in minor releases.'
@end quotation
@end cartouche

Similar to @ref{5770,,PyUnstable_Code_New()}, but with an extra “posonlyargcount” for positional-only arguments.
The same caveats that apply to @code{PyUnstable_Code_New} also apply to this function.


Added in version 3.8: as @code{PyCode_NewWithPosOnlyArgs}



Changed in version 3.11: Added @code{qualname} and  @code{exceptiontable} parameters.



Changed in version 3.12: Renamed to @code{PyUnstable_Code_NewWithPosOnlyArgs}.
The old name is deprecated, but will remain available until the
signature changes again.

@end deffn

@geindex PyCode_NewEmpty (C function)
@anchor{c-api/code c PyCode_NewEmpty}@anchor{155c}
@deffn {C Function} @ref{980,,PyCodeObject} *PyCode_NewEmpty (const char *filename, const char *funcname, int firstlineno)
`Return value: New reference.'
Return a new empty code object with the specified filename,
function name, and first line number. The resulting code
object will raise an @code{Exception} if executed.
@end deffn

@geindex PyCode_Addr2Line (C function)
@anchor{c-api/code c PyCode_Addr2Line}@anchor{a8f}
@deffn {C Function} int PyCode_Addr2Line (PyCodeObject *co, int byte_offset)

Return the line number of the instruction that occurs on or before @code{byte_offset} and ends after it.
If you just need the line number of a frame, use @ref{993,,PyFrame_GetLineNumber()} instead.

For efficiently iterating over the line numbers in a code object, use 
@geindex Python Enhancement Proposals; PEP 0626#out-of-process-debuggers-and-profilers
the API described in PEP 626@footnote{https://peps.python.org/pep-0626/#out-of-process-debuggers-and-profilers}.
@end deffn

@geindex PyCode_Addr2Location (C function)
@anchor{c-api/code c PyCode_Addr2Location}@anchor{7d2}
@deffn {C Function} int PyCode_Addr2Location (PyObject *co, int byte_offset, int *start_line, int *start_column, int *end_line, int *end_column)

Sets the passed @code{int} pointers to the source code line and column numbers
for the instruction at @code{byte_offset}. Sets the value to @code{0} when
information is not available for any particular element.

Returns @code{1} if the function succeeds and 0 otherwise.


Added in version 3.11.

@end deffn

@geindex PyCode_GetCode (C function)
@anchor{c-api/code c PyCode_GetCode}@anchor{981}
@deffn {C Function} @ref{5df,,PyObject} *PyCode_GetCode (PyCodeObject *co)

Equivalent to the Python code @code{getattr(co, 'co_code')}.
Returns a strong reference to a @ref{99a,,PyBytesObject} representing the
bytecode in a code object. On error, @code{NULL} is returned and an exception
is raised.

This @code{PyBytesObject} may be created on-demand by the interpreter and does
not necessarily represent the bytecode actually executed by CPython. The
primary use case for this function is debuggers and profilers.


Added in version 3.11.

@end deffn

@geindex PyCode_GetVarnames (C function)
@anchor{c-api/code c PyCode_GetVarnames}@anchor{982}
@deffn {C Function} @ref{5df,,PyObject} *PyCode_GetVarnames (PyCodeObject *co)

Equivalent to the Python code @code{getattr(co, 'co_varnames')}.
Returns a new reference to a @ref{5584,,PyTupleObject} containing the names of
the local variables. On error, @code{NULL} is returned and an exception
is raised.


Added in version 3.11.

@end deffn

@geindex PyCode_GetCellvars (C function)
@anchor{c-api/code c PyCode_GetCellvars}@anchor{983}
@deffn {C Function} @ref{5df,,PyObject} *PyCode_GetCellvars (PyCodeObject *co)

Equivalent to the Python code @code{getattr(co, 'co_cellvars')}.
Returns a new reference to a @ref{5584,,PyTupleObject} containing the names of
the local variables that are referenced by nested functions. On error, @code{NULL}
is returned and an exception is raised.


Added in version 3.11.

@end deffn

@geindex PyCode_GetFreevars (C function)
@anchor{c-api/code c PyCode_GetFreevars}@anchor{984}
@deffn {C Function} @ref{5df,,PyObject} *PyCode_GetFreevars (PyCodeObject *co)

Equivalent to the Python code @code{getattr(co, 'co_freevars')}.
Returns a new reference to a @ref{5584,,PyTupleObject} containing the names of
the @ref{18da,,free (closure) variables}. On error, @code{NULL} is returned
and an exception is raised.


Added in version 3.11.

@end deffn

@geindex PyCode_AddWatcher (C function)
@anchor{c-api/code c PyCode_AddWatcher}@anchor{788}
@deffn {C Function} int PyCode_AddWatcher (PyCode_WatchCallback callback)

Register `callback' as a code object watcher for the current interpreter.
Return an ID which may be passed to @ref{789,,PyCode_ClearWatcher()}.
In case of error (e.g. no more watcher IDs available),
return @code{-1} and set an exception.


Added in version 3.12.

@end deffn

@geindex PyCode_ClearWatcher (C function)
@anchor{c-api/code c PyCode_ClearWatcher}@anchor{789}
@deffn {C Function} int PyCode_ClearWatcher (int watcher_id)

Clear watcher identified by `watcher_id' previously returned from
@ref{788,,PyCode_AddWatcher()} for the current interpreter.
Return @code{0} on success, or @code{-1} and set an exception on error
(e.g. if the given `watcher_id' was never registered.)


Added in version 3.12.

@end deffn

@geindex PyCodeEvent (C type)
@anchor{c-api/code c PyCodeEvent}@anchor{5773}
@deffn {C Type} type PyCodeEvent

Enumeration of possible code object watcher events:
- @code{PY_CODE_EVENT_CREATE}
- @code{PY_CODE_EVENT_DESTROY}


Added in version 3.12.

@end deffn

@geindex PyCode_WatchCallback (C type)
@anchor{c-api/code c PyCode_WatchCallback}@anchor{5774}
@deffn {C Type} typedef int (*PyCode_WatchCallback)(@ref{5773,,PyCodeEvent} event, @ref{980,,PyCodeObject} *co)

Type of a code object watcher callback function.

If `event' is @code{PY_CODE_EVENT_CREATE}, then the callback is invoked
after `co' has been fully initialized. Otherwise, the callback is invoked
before the destruction of `co' takes place, so the prior state of `co'
can be inspected.

If `event' is @code{PY_CODE_EVENT_DESTROY}, taking a reference in the callback
to the about-to-be-destroyed code object will resurrect it and prevent it
from being freed at this time. When the resurrected object is destroyed
later, any watcher callbacks active at that time will be called again.

Users of this API should not rely on internal runtime implementation
details. Such details may include, but are not limited to, the exact
order and timing of creation and destruction of code objects. While
changes in these details may result in differences observable by watchers
(including whether a callback is invoked or not), it does not change
the semantics of the Python code being executed.

If the callback sets an exception, it must return @code{-1}; this exception will
be printed as an unraisable exception using @ref{5f2,,PyErr_WriteUnraisable()}.
Otherwise it should return @code{0}.

There may already be a pending exception set on entry to the callback. In
this case, the callback should return @code{0} with the same exception still
set. This means the callback may not call any other API that can set an
exception unless it saves and clears the exception state first, and restores
it before returning.


Added in version 3.12.

@end deffn

@geindex PyCode_Optimize (C function)
@anchor{c-api/code c PyCode_Optimize}@anchor{5775}
@deffn {C Function} @ref{5df,,PyObject} *PyCode_Optimize (PyObject *code, PyObject *consts, PyObject *names, PyObject *lnotab_obj)

This is a @ref{23f,,soft deprecated} function that does nothing.

Prior to Python 3.10, this function would perform basic optimizations to a
code object.


Changed in version 3.10: This function now does nothing.

@end deffn

@node Code Object Flags,Extra information,Code Objects<2>,Function Objects<2>
@anchor{c-api/code c-codeobject-flags}@anchor{5541}@anchor{c-api/code code-object-flags}@anchor{5776}
@subsubsection Code Object Flags


Code objects contain a bit-field of flags, which can be retrieved as the
@ref{1921,,co_flags} Python attribute (for example using
@ref{5ef,,PyObject_GetAttrString()}), and set using a `flags' argument to
@ref{5770,,PyUnstable_Code_New()} and similar functions.

Flags whose names start with @code{CO_FUTURE_} correspond to features normally
selectable by @ref{45b,,future statements}. These flags can be used in
@ref{553a,,PyCompilerFlags.cf_flags}.
Note that many @code{CO_FUTURE_} flags are mandatory in current versions of
Python, and setting them has no effect.

The following flags are available.
For their meaning, see the linked documentation of their Python equivalents.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Flag

@tab

Meaning

@item

@geindex CO_OPTIMIZED (C macro)
@anchor{c-api/code c CO_OPTIMIZED}@anchor{5777}
@deffn {C Macro} CO_OPTIMIZED
@end deffn

@tab

@ref{4db1,,inspect.CO_OPTIMIZED}

@item

@geindex CO_NEWLOCALS (C macro)
@anchor{c-api/code c CO_NEWLOCALS}@anchor{5778}
@deffn {C Macro} CO_NEWLOCALS
@end deffn

@tab

@ref{4db2,,inspect.CO_NEWLOCALS}

@item

@geindex CO_VARARGS (C macro)
@anchor{c-api/code c CO_VARARGS}@anchor{5779}
@deffn {C Macro} CO_VARARGS
@end deffn

@tab

@ref{4db3,,inspect.CO_VARARGS}

@item

@geindex CO_VARKEYWORDS (C macro)
@anchor{c-api/code c CO_VARKEYWORDS}@anchor{577a}
@deffn {C Macro} CO_VARKEYWORDS
@end deffn

@tab

@ref{4db4,,inspect.CO_VARKEYWORDS}

@item

@geindex CO_NESTED (C macro)
@anchor{c-api/code c CO_NESTED}@anchor{577b}
@deffn {C Macro} CO_NESTED
@end deffn

@tab

@ref{4db5,,inspect.CO_NESTED}

@item

@geindex CO_GENERATOR (C macro)
@anchor{c-api/code c CO_GENERATOR}@anchor{577c}
@deffn {C Macro} CO_GENERATOR
@end deffn

@tab

@ref{4db6,,inspect.CO_GENERATOR}

@item

@geindex CO_COROUTINE (C macro)
@anchor{c-api/code c CO_COROUTINE}@anchor{577d}
@deffn {C Macro} CO_COROUTINE
@end deffn

@tab

@ref{4db7,,inspect.CO_COROUTINE}

@item

@geindex CO_ITERABLE_COROUTINE (C macro)
@anchor{c-api/code c CO_ITERABLE_COROUTINE}@anchor{577e}
@deffn {C Macro} CO_ITERABLE_COROUTINE
@end deffn

@tab

@ref{4db8,,inspect.CO_ITERABLE_COROUTINE}

@item

@geindex CO_ASYNC_GENERATOR (C macro)
@anchor{c-api/code c CO_ASYNC_GENERATOR}@anchor{577f}
@deffn {C Macro} CO_ASYNC_GENERATOR
@end deffn

@tab

@ref{4db9,,inspect.CO_ASYNC_GENERATOR}

@item

@geindex CO_HAS_DOCSTRING (C macro)
@anchor{c-api/code c CO_HAS_DOCSTRING}@anchor{5780}
@deffn {C Macro} CO_HAS_DOCSTRING
@end deffn

@tab

@ref{23db,,inspect.CO_HAS_DOCSTRING}

@item

@geindex CO_METHOD (C macro)
@anchor{c-api/code c CO_METHOD}@anchor{5781}
@deffn {C Macro} CO_METHOD
@end deffn

@tab

@ref{4dba,,inspect.CO_METHOD}

@item

@geindex CO_FUTURE_DIVISION (C macro)
@anchor{c-api/code c CO_FUTURE_DIVISION}@anchor{5782}
@deffn {C Macro} CO_FUTURE_DIVISION
@end deffn

@tab

no effect (@ref{4d5f,,__future__.division})

@item

@geindex CO_FUTURE_ABSOLUTE_IMPORT (C macro)
@anchor{c-api/code c CO_FUTURE_ABSOLUTE_IMPORT}@anchor{5783}
@deffn {C Macro} CO_FUTURE_ABSOLUTE_IMPORT
@end deffn

@tab

no effect (@ref{4d60,,__future__.absolute_import})

@item

@geindex CO_FUTURE_WITH_STATEMENT (C macro)
@anchor{c-api/code c CO_FUTURE_WITH_STATEMENT}@anchor{5784}
@deffn {C Macro} CO_FUTURE_WITH_STATEMENT
@end deffn

@tab

no effect (@ref{4d61,,__future__.with_statement})

@item

@geindex CO_FUTURE_PRINT_FUNCTION (C macro)
@anchor{c-api/code c CO_FUTURE_PRINT_FUNCTION}@anchor{5785}
@deffn {C Macro} CO_FUTURE_PRINT_FUNCTION
@end deffn

@tab

no effect (@ref{4d62,,__future__.print_function})

@item

@geindex CO_FUTURE_UNICODE_LITERALS (C macro)
@anchor{c-api/code c CO_FUTURE_UNICODE_LITERALS}@anchor{5786}
@deffn {C Macro} CO_FUTURE_UNICODE_LITERALS
@end deffn

@tab

no effect (@ref{4d63,,__future__.unicode_literals})

@item

@geindex CO_FUTURE_GENERATOR_STOP (C macro)
@anchor{c-api/code c CO_FUTURE_GENERATOR_STOP}@anchor{5787}
@deffn {C Macro} CO_FUTURE_GENERATOR_STOP
@end deffn

@tab

no effect (@ref{4d64,,__future__.generator_stop})

@item

@geindex CO_FUTURE_ANNOTATIONS (C macro)
@anchor{c-api/code c CO_FUTURE_ANNOTATIONS}@anchor{5540}
@deffn {C Macro} CO_FUTURE_ANNOTATIONS
@end deffn

@tab

@ref{4d65,,__future__.annotations}

@end multitable


@node Extra information,,Code Object Flags,Function Objects<2>
@anchor{c-api/code extra-information}@anchor{5788}
@subsubsection Extra information


To support low-level extensions to frame evaluation, such as external
just-in-time compilers, it is possible to attach arbitrary extra data to
code objects.

These functions are part of the unstable C API tier:
this functionality is a CPython implementation detail, and the API
may change without deprecation warnings.

@geindex _PyEval_RequestCodeExtraIndex (C function)

@geindex PyUnstable_Eval_RequestCodeExtraIndex (C function)
@anchor{c-api/code c _PyEval_RequestCodeExtraIndex}@anchor{5789}@anchor{c-api/code c PyUnstable_Eval_RequestCodeExtraIndex}@anchor{17c2}
@deffn {C Function} @ref{c5b,,Py_ssize_t} PyUnstable_Eval_RequestCodeExtraIndex (freefunc free)

@cartouche
@quotation This is Unstable API. It may change without warning in minor releases. `This is @ref{76a,,Unstable API}. It may change without warning in minor releases.'
@end quotation
@end cartouche

Return a new opaque index value used to adding data to code objects.

You generally call this function once (per interpreter) and use the result
with @code{PyCode_GetExtra} and @code{PyCode_SetExtra} to manipulate
data on individual code objects.

If `free' is not @code{NULL}: when a code object is deallocated,
`free' will be called on non-@code{NULL} data stored under the new index.
Use @ref{548a,,Py_DecRef()} when storing @ref{5df,,PyObject}.


Added in version 3.6: as @code{_PyEval_RequestCodeExtraIndex}



Changed in version 3.12: Renamed to @code{PyUnstable_Eval_RequestCodeExtraIndex}.
The old private name is deprecated, but will be available until the API
changes.

@end deffn

@geindex _PyCode_GetExtra (C function)

@geindex PyUnstable_Code_GetExtra (C function)
@anchor{c-api/code c _PyCode_GetExtra}@anchor{578a}@anchor{c-api/code c PyUnstable_Code_GetExtra}@anchor{17c1}
@deffn {C Function} int PyUnstable_Code_GetExtra (PyObject *code, Py_ssize_t index, void **extra)

@cartouche
@quotation This is Unstable API. It may change without warning in minor releases. `This is @ref{76a,,Unstable API}. It may change without warning in minor releases.'
@end quotation
@end cartouche

Set `extra' to the extra data stored under the given index.
Return 0 on success. Set an exception and return -1 on failure.

If no data was set under the index, set `extra' to @code{NULL} and return
0 without setting an exception.


Added in version 3.6: as @code{_PyCode_GetExtra}



Changed in version 3.12: Renamed to @code{PyUnstable_Code_GetExtra}.
The old private name is deprecated, but will be available until the API
changes.

@end deffn

@geindex _PyCode_SetExtra (C function)

@geindex PyUnstable_Code_SetExtra (C function)
@anchor{c-api/code c _PyCode_SetExtra}@anchor{578b}@anchor{c-api/code c PyUnstable_Code_SetExtra}@anchor{17c0}
@deffn {C Function} int PyUnstable_Code_SetExtra (PyObject *code, Py_ssize_t index, void *extra)

@cartouche
@quotation This is Unstable API. It may change without warning in minor releases. `This is @ref{76a,,Unstable API}. It may change without warning in minor releases.'
@end quotation
@end cartouche

Set the extra data stored under the given index to `extra'.
Return 0 on success. Set an exception and return -1 on failure.


Added in version 3.6: as @code{_PyCode_SetExtra}



Changed in version 3.12: Renamed to @code{PyUnstable_Code_SetExtra}.
The old private name is deprecated, but will be available until the API
changes.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Other Objects,C API for extension modules,Function Objects<2>,Concrete Objects Layer
@anchor{c-api/concrete other-objects}@anchor{578c}
@subsection Other Objects


@menu
* File objects:: 
* Module Objects:: 
* Module definitions:: 
* Creating extension modules dynamically:: 
* Support functions:: 
* Iterator Objects:: 
* Descriptor Objects:: 
* Slice Objects:: 
* MemoryView objects:: 
* Pickle buffer objects:: 
* Weak Reference Objects: Weak Reference Objects<2>. 
* Capsules: Capsules<2>. 
* Frame objects: Frame objects<2>. 
* Generator Objects:: 
* Coroutine Objects: Coroutine Objects<2>. 
* Context Variables Objects:: 
* Objects for Type Hinting:: 

@end menu

@node File objects,Module Objects,,Other Objects
@anchor{c-api/file doc}@anchor{578d}@anchor{c-api/file file-objects}@anchor{578e}@anchor{c-api/file fileobjects}@anchor{578f}
@subsubsection File objects


@geindex object; file

These APIs are a minimal emulation of the Python 2 C API for built-in file
objects, which used to rely on the buffered I/O (FILE*) support
from the C standard library.  In Python 3, files and streams use the new
@ref{83,,io} module, which defines several layers over the low-level unbuffered
I/O of the operating system.  The functions described below are
convenience C wrappers over these new APIs, and meant mostly for internal
error reporting in the interpreter; third-party code is advised to access
the @code{io} APIs instead.

@geindex PyFile_FromFd (C function)
@anchor{c-api/file c PyFile_FromFd}@anchor{5384}
@deffn {C Function} @ref{5df,,PyObject} *PyFile_FromFd (int fd, const char *name, const char *mode, int buffering, const char *encoding, const char *errors, const char *newline, int closefd)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Create a Python file object from the file descriptor of an already
opened file `fd'.  The arguments `name', `encoding', `errors' and `newline'
can be @code{NULL} to use the defaults; `buffering' can be `-1' to use the
default. `name' is ignored and kept for backward compatibility. Return
@code{NULL} on failure. For a more comprehensive description of the arguments,
please refer to the @ref{741,,io.open()} function documentation.

@cartouche
@quotation Warning 
Since Python streams have their own buffering layer, mixing them with
OS-level file descriptors can produce various issues (such as unexpected
ordering of data).
@end quotation
@end cartouche


Changed in version 3.2: Ignore `name' attribute.

@end deffn

@geindex PyObject_AsFileDescriptor (C function)
@anchor{c-api/file c PyObject_AsFileDescriptor}@anchor{53e8}
@deffn {C Function} int PyObject_AsFileDescriptor (PyObject *p)
` Part of the @ref{776,,Stable ABI}.'
Return the file descriptor associated with `p' as an int.  If the
object is an integer, its value is returned.  If not, the
object’s @ref{17fe,,fileno()} method is called if it exists; the
method must return an integer, which is returned as the file descriptor
value.  Sets an exception and returns @code{-1} on failure.
@end deffn

@geindex PyFile_GetLine (C function)
@anchor{c-api/file c PyFile_GetLine}@anchor{5385}
@deffn {C Function} @ref{5df,,PyObject} *PyFile_GetLine (PyObject *p, int n)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
@geindex EOFError (built-in exception)

Equivalent to @code{p.readline([n])}, this function reads one line from the
object `p'.  `p' may be a file object or any object with a
@ref{1535,,readline()}
method.  If `n' is @code{0}, exactly one line is read, regardless of the length of
the line.  If `n' is greater than @code{0}, no more than `n' bytes will be read
from the file; a partial line can be returned.  In both cases, an empty string
is returned if the end of the file is reached immediately.  If `n' is less than
@code{0}, however, one line is read regardless of length, but @ref{14e5,,EOFError} is
raised if the end of the file is reached immediately.
@end deffn

@geindex PyFile_SetOpenCodeHook (C function)
@anchor{c-api/file c PyFile_SetOpenCodeHook}@anchor{1ae0}
@deffn {C Function} int PyFile_SetOpenCodeHook (Py_OpenCodeHookFunction handler)

Overrides the normal behavior of @ref{17a5,,io.open_code()} to pass its parameter
through the provided handler.

The `handler' is a function of type:

@geindex Py_OpenCodeHookFunction (C type)
@anchor{c-api/file c Py_OpenCodeHookFunction}@anchor{5790}
@deffn {C Type} typedef @ref{5df,,PyObject} *(*Py_OpenCodeHookFunction)(@ref{5df,,PyObject}*, void*)

Equivalent of @ref{5df,,PyObject} *(*)(PyObject *path, void *userData), where `path' is guaranteed to be
@ref{99c,,PyUnicodeObject}.
@end deffn

The `userData' pointer is passed into the hook function. Since hook
functions may be called from different runtimes, this pointer should not
refer directly to Python state.

As this hook is intentionally used during import, avoid importing new modules
during its execution unless they are known to be frozen or available in
@code{sys.modules}.

Once a hook has been set, it cannot be removed or replaced, and later calls to
@ref{1ae0,,PyFile_SetOpenCodeHook()} will fail. On failure, the function returns
-1 and sets an exception if the interpreter has been initialized.

This function is safe to call before @ref{45e,,Py_Initialize()}.

Raises an @ref{1cb1,,auditing event} @code{setopencodehook} with no arguments.


Added in version 3.8.

@end deffn

@geindex PyFile_OpenCodeObject (C function)
@anchor{c-api/file c PyFile_OpenCodeObject}@anchor{5791}
@deffn {C Function} @ref{5df,,PyObject} *PyFile_OpenCodeObject (PyObject *path)

Open `path' with the mode @code{'rb'}. `path' must be a Python @ref{16a,,str}
object. The behavior of this function may be overridden by
@ref{1ae0,,PyFile_SetOpenCodeHook()} to allow for some preprocessing of the
text.

This is analogous to @ref{17a5,,io.open_code()} in Python.

On success, this function returns a @ref{5e2,,strong reference} to a Python
file object. On failure, this function returns @code{NULL} with an exception
set.


Added in version 3.8.

@end deffn

@geindex PyFile_OpenCode (C function)
@anchor{c-api/file c PyFile_OpenCode}@anchor{5792}
@deffn {C Function} @ref{5df,,PyObject} *PyFile_OpenCode (const char *path)

Similar to @ref{5791,,PyFile_OpenCodeObject()}, but `path' is a
UTF-8 encoded const char*.


Added in version 3.8.

@end deffn

@geindex PyFile_WriteObject (C function)
@anchor{c-api/file c PyFile_WriteObject}@anchor{5386}
@deffn {C Function} int PyFile_WriteObject (PyObject *obj, PyObject *p, int flags)
` Part of the @ref{776,,Stable ABI}.'
@geindex Py_PRINT_RAW (C macro)

Write object `obj' to file object `p'.  The only supported flag for `flags' is
@ref{55e7,,Py_PRINT_RAW}; if given, the @ref{16a,,str()} of the object is written
instead of the @ref{1c3,,repr()}.

If `obj' is @code{NULL}, write the string @code{"<NULL>"}.

Return @code{0} on success or @code{-1} on failure; the
appropriate exception will be set.
@end deffn

@geindex PyFile_WriteString (C function)
@anchor{c-api/file c PyFile_WriteString}@anchor{5387}
@deffn {C Function} int PyFile_WriteString (const char *s, PyObject *p)
` Part of the @ref{776,,Stable ABI}.'
Write string `s' to file object `p'.  Return @code{0} on success or @code{-1} on
failure; the appropriate exception will be set.
@end deffn

@menu
* Soft-deprecated API:: 

@end menu

@node Soft-deprecated API,,,File objects
@anchor{c-api/file soft-deprecated-api}@anchor{5793}
@subsubsection Soft-deprecated API



@ref{23f,,Soft deprecated} since version 3.15.


These are APIs that were included in Python’s C API
by mistake. They are documented solely for completeness; use other
@code{PyFile*} APIs instead.

@geindex PyFile_NewStdPrinter (C function)
@anchor{c-api/file c PyFile_NewStdPrinter}@anchor{5794}
@deffn {C Function} @ref{5df,,PyObject} *PyFile_NewStdPrinter (int fd)

Use @ref{5384,,PyFile_FromFd()} with defaults (@code{fd, NULL, "w", -1, NULL, NULL, NULL, 0}) instead.
@end deffn

@geindex PyStdPrinter_Type (C var)
@anchor{c-api/file c PyStdPrinter_Type}@anchor{5795}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyStdPrinter_Type

Type of file-like objects used internally at Python startup when @ref{83,,io} is
not yet available.
Use Python @ref{318,,open()} or @ref{5384,,PyFile_FromFd()} to create file objects instead.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Module Objects,Module definitions,File objects,Other Objects
@anchor{c-api/module doc}@anchor{5796}@anchor{c-api/module module-objects}@anchor{5797}@anchor{c-api/module moduleobjects}@anchor{5798}@anchor{c-api/module translation-repo}@anchor{5799}
@subsubsection Module Objects


@geindex object; module

@geindex PyModule_Type (C var)
@anchor{c-api/module c PyModule_Type}@anchor{53c4}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyModule_Type
` Part of the @ref{776,,Stable ABI}.'
@geindex ModuleType (in module types)

This instance of @ref{ca2,,PyTypeObject} represents the Python module type.  This
is exposed to Python programs as @ref{101a,,types.ModuleType}.
@end deffn

@geindex PyModule_Check (C function)
@anchor{c-api/module c PyModule_Check}@anchor{579a}
@deffn {C Function} int PyModule_Check (PyObject *p)

Return true if `p' is a module object, or a subtype of a module object.
This function always succeeds.
@end deffn

@geindex PyModule_CheckExact (C function)
@anchor{c-api/module c PyModule_CheckExact}@anchor{579b}
@deffn {C Function} int PyModule_CheckExact (PyObject *p)

Return true if `p' is a module object, but not a subtype of
@ref{53c4,,PyModule_Type}.  This function always succeeds.
@end deffn

@geindex PyModule_NewObject (C function)
@anchor{c-api/module c PyModule_NewObject}@anchor{53c2}
@deffn {C Function} @ref{5df,,PyObject} *PyModule_NewObject (PyObject *name)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI} since version 3.7.'
@geindex __name__ (module attribute)
@geindex __doc__ (module attribute)
@geindex __file__ (module attribute)
@geindex __package__ (module attribute)
@geindex __loader__ (module attribute)

Return a new module object with @ref{1597,,module.__name__} set to `name'.
The module’s @code{__name__}, @ref{1c32,,__doc__},
@ref{325,,__package__} and @ref{339,,__loader__} attributes are
filled in (all but @code{__name__} are set to @code{None}). The caller is
responsible for setting a @ref{23ad,,__file__} attribute.

Return @code{NULL} with an exception set on error.


Added in version 3.3.



Changed in version 3.4: @ref{325,,__package__} and @ref{339,,__loader__} are now set to
@code{None}.

@end deffn

@geindex PyModule_New (C function)
@anchor{c-api/module c PyModule_New}@anchor{53c1}
@deffn {C Function} @ref{5df,,PyObject} *PyModule_New (const char *name)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Similar to @ref{53c2,,PyModule_NewObject()}, but the name is a UTF-8 encoded
string instead of a Unicode object.
@end deffn

@geindex PyModule_GetDict (C function)
@anchor{c-api/module c PyModule_GetDict}@anchor{53be}
@deffn {C Function} @ref{5df,,PyObject} *PyModule_GetDict (PyObject *module)
`Return value: Borrowed reference.'` Part of the @ref{776,,Stable ABI}.'
@geindex __dict__ (module attribute)

Return the dictionary object that implements `module'’s namespace; this object
is the same as the @ref{77e,,__dict__} attribute of the module object.
If `module' is not a module object (or a subtype of a module object),
@ref{796,,SystemError} is raised and @code{NULL} is returned.

It is recommended extensions use other @code{PyModule_*} and
@code{PyObject_*} functions rather than directly manipulate a module’s
@ref{77e,,__dict__}.

The returned reference is borrowed from the module; it is valid until
the module is destroyed.
@end deffn

@geindex PyModule_GetNameObject (C function)
@anchor{c-api/module c PyModule_GetNameObject}@anchor{53c0}
@deffn {C Function} @ref{5df,,PyObject} *PyModule_GetNameObject (PyObject *module)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI} since version 3.7.'
@geindex __name__ (module attribute)
@geindex SystemError (built-in exception)

Return `module'’s @ref{1597,,__name__} value.  If the module does not
provide one, or if it is not a string, @ref{796,,SystemError} is raised and
@code{NULL} is returned.


Added in version 3.3.

@end deffn

@geindex PyModule_GetName (C function)
@anchor{c-api/module c PyModule_GetName}@anchor{53bf}
@deffn {C Function} const char *PyModule_GetName (PyObject *module)
` Part of the @ref{776,,Stable ABI}.'
Similar to @ref{53c0,,PyModule_GetNameObject()} but return the name encoded to
@code{'utf-8'}.

The returned buffer is only valid until the module is renamed or destroyed.
Note that Python code may rename a module by setting its @ref{1597,,__name__}
attribute.
@end deffn

@geindex PyModule_GetState (C function)
@anchor{c-api/module c PyModule_GetState}@anchor{b7d}
@deffn {C Function} void *PyModule_GetState (PyObject *module)
` Part of the @ref{776,,Stable ABI}.'
Return the “state” of the module, that is, a pointer to the block of memory
allocated at module creation time, or @code{NULL}.  See
@ref{b7c,,PyModuleDef.m_size}.
@end deffn

@geindex PyModule_GetDef (C function)
@anchor{c-api/module c PyModule_GetDef}@anchor{53bd}
@deffn {C Function} @ref{b7a,,PyModuleDef} *PyModule_GetDef (PyObject *module)
` Part of the @ref{776,,Stable ABI}.'
Return a pointer to the @ref{b7a,,PyModuleDef} struct from which the module was
created, or @code{NULL} if the module wasn’t created from a definition.

On error, return @code{NULL} with an exception set.
Use @ref{1cf0,,PyErr_Occurred()} to tell this case apart from a missing
@code{PyModuleDef}.
@end deffn

@geindex PyModule_GetFilenameObject (C function)
@anchor{c-api/module c PyModule_GetFilenameObject}@anchor{42c}
@deffn {C Function} @ref{5df,,PyObject} *PyModule_GetFilenameObject (PyObject *module)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
@geindex __file__ (module attribute)
@geindex SystemError (built-in exception)

Return the name of the file from which `module' was loaded using `module'’s
@ref{23ad,,__file__} attribute.  If this is not defined, or if it is not a
string, raise @ref{796,,SystemError} and return @code{NULL}; otherwise return
a reference to a Unicode object.


Added in version 3.2.

@end deffn

@geindex PyModule_GetFilename (C function)
@anchor{c-api/module c PyModule_GetFilename}@anchor{42b}
@deffn {C Function} const char *PyModule_GetFilename (PyObject *module)
` Part of the @ref{776,,Stable ABI}.'
Similar to @ref{42c,,PyModule_GetFilenameObject()} but return the filename
encoded to ‘utf-8’.

The returned buffer is only valid until the module’s @ref{23ad,,__file__} attribute
is reassigned or the module is destroyed.


Deprecated since version 3.2: @ref{42b,,PyModule_GetFilename()} raises @ref{889,,UnicodeEncodeError} on
unencodable filenames, use @ref{42c,,PyModule_GetFilenameObject()} instead.

@end deffn

@node Module definitions,Creating extension modules dynamically,Module Objects,Other Objects
@anchor{c-api/module module-definitions}@anchor{579c}@anchor{c-api/module pymoduledef}@anchor{579d}
@subsubsection Module definitions


The functions in the previous section work on any module object, including
modules imported from Python code.

Modules defined using the C API typically use a `module definition',
@ref{b7a,,PyModuleDef} – a statically allocated, constant “description” of
how a module should be created.

The definition is usually used to define an extension’s “main” module object
(see @ref{525c,,Defining extension modules} for details).
It is also used to
@ref{579e,,create extension modules dynamically}.

Unlike @ref{53c1,,PyModule_New()}, the definition allows management of
`module state' – a piece of memory that is allocated and cleared together
with the module object.
Unlike the module’s Python attributes, Python code cannot replace or delete
data stored in module state.

@geindex PyModuleDef (C type)
@anchor{c-api/module c PyModuleDef}@anchor{b7a}
@deffn {C Type} type PyModuleDef
` Part of the @ref{776,,Stable ABI} (including all members).'
The module definition struct, which holds all information needed to create
a module object.
This structure must be statically allocated (or be otherwise guaranteed
to be valid while any modules created from it exist).
Usually, there is only one variable of this type for each extension module.

@geindex PyModuleDef.m_base (C member)
@anchor{c-api/module c PyModuleDef m_base}@anchor{579f}
@deffn {C Member} PyModuleDef_Base m_base

Always initialize this member to @code{PyModuleDef_HEAD_INIT}.
@end deffn

@geindex PyModuleDef.m_name (C member)
@anchor{c-api/module c PyModuleDef m_name}@anchor{57a0}
@deffn {C Member} const char *m_name

Name for the new module.
@end deffn

@geindex PyModuleDef.m_doc (C member)
@anchor{c-api/module c PyModuleDef m_doc}@anchor{57a1}
@deffn {C Member} const char *m_doc

Docstring for the module; usually a docstring variable created with
@ref{1d9f,,PyDoc_STRVAR} is used.
@end deffn

@geindex PyModuleDef.m_size (C member)
@anchor{c-api/module c PyModuleDef m_size}@anchor{b7c}
@deffn {C Member} @ref{c5b,,Py_ssize_t} m_size

Module state may be kept in a per-module memory area that can be
retrieved with @ref{b7d,,PyModule_GetState()}, rather than in static globals.
This makes modules safe for use in multiple sub-interpreters.

This memory area is allocated based on `m_size' on module creation,
and freed when the module object is deallocated, after the
@ref{b79,,m_free} function has been called, if present.

Setting it to a non-negative value means that the module can be
re-initialized and specifies the additional amount of memory it requires
for its state.

Setting @code{m_size} to @code{-1} means that the module does not support
sub-interpreters, because it has global state.
Negative @code{m_size} is only allowed when using
@ref{556e,,legacy single-phase initialization}
or when @ref{579e,,creating modules dynamically}.

See 
@geindex Python Enhancement Proposals; PEP 3121
PEP 3121@footnote{https://peps.python.org/pep-3121/} for more details.
@end deffn

@geindex PyModuleDef.m_methods (C member)
@anchor{c-api/module c PyModuleDef m_methods}@anchor{57a2}
@deffn {C Member} @ref{16e3,,PyMethodDef} *m_methods

A pointer to a table of module-level functions, described by
@ref{16e3,,PyMethodDef} values.  Can be @code{NULL} if no functions are present.
@end deffn

@geindex PyModuleDef.m_slots (C member)
@anchor{c-api/module c PyModuleDef m_slots}@anchor{5575}
@deffn {C Member} @ref{53b9,,PyModuleDef_Slot} *m_slots

An array of slot definitions for multi-phase initialization, terminated by
a @code{@{0, NULL@}} entry.
When using legacy single-phase initialization, `m_slots' must be @code{NULL}.


Changed in version 3.5: Prior to version 3.5, this member was always set to @code{NULL},
and was defined as:

@quotation

@geindex PyModuleDef.m_slots.m_reload (C member)
@anchor{c-api/module c PyModuleDef m_slots m_reload}@anchor{57a3}
@deffn {C Member} @ref{550b,,inquiry} m_reload
@end deffn
@end quotation

@end deffn

@geindex PyModuleDef.m_traverse (C member)
@anchor{c-api/module c PyModuleDef m_traverse}@anchor{b77}
@deffn {C Member} @ref{551a,,traverseproc} m_traverse

A traversal function to call during GC traversal of the module object, or
@code{NULL} if not needed.

This function is not called if the module state was requested but is not
allocated yet. This is the case immediately after the module is created
and before the module is executed (@ref{b7b,,Py_mod_exec} function). More
precisely, this function is not called if @ref{b7c,,m_size} is greater
than 0 and the module state (as returned by @ref{b7d,,PyModule_GetState()})
is @code{NULL}.


Changed in version 3.9: No longer called before the module state is allocated.

@end deffn

@geindex PyModuleDef.m_clear (C member)
@anchor{c-api/module c PyModuleDef m_clear}@anchor{b78}
@deffn {C Member} @ref{550b,,inquiry} m_clear

A clear function to call during GC clearing of the module object, or
@code{NULL} if not needed.

This function is not called if the module state was requested but is not
allocated yet. This is the case immediately after the module is created
and before the module is executed (@ref{b7b,,Py_mod_exec} function). More
precisely, this function is not called if @ref{b7c,,m_size} is greater
than 0 and the module state (as returned by @ref{b7d,,PyModule_GetState()})
is @code{NULL}.

Like @ref{5242,,PyTypeObject.tp_clear}, this function is not `always'
called before a module is deallocated. For example, when reference
counting is enough to determine that an object is no longer used,
the cyclic garbage collector is not involved and
@ref{b79,,m_free} is called directly.


Changed in version 3.9: No longer called before the module state is allocated.

@end deffn

@geindex PyModuleDef.m_free (C member)
@anchor{c-api/module c PyModuleDef m_free}@anchor{b79}
@deffn {C Member} @ref{57a4,,freefunc} m_free

A function to call during deallocation of the module object, or @code{NULL}
if not needed.

This function is not called if the module state was requested but is not
allocated yet. This is the case immediately after the module is created
and before the module is executed (@ref{b7b,,Py_mod_exec} function). More
precisely, this function is not called if @ref{b7c,,m_size} is greater
than 0 and the module state (as returned by @ref{b7d,,PyModule_GetState()})
is @code{NULL}.


Changed in version 3.9: No longer called before the module state is allocated.

@end deffn
@end deffn

@geindex PyModuleDef_Type (C var)
@anchor{c-api/module c PyModuleDef_Type}@anchor{53ba}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyModuleDef_Type
` Part of the @ref{776,,Stable ABI} since version 3.5.'
The type of @code{PyModuleDef} objects.
@end deffn

@menu
* Module slots:: 

@end menu

@node Module slots,,,Module definitions
@anchor{c-api/module module-slots}@anchor{57a5}
@subsubsection Module slots


@geindex PyModuleDef_Slot (C type)
@anchor{c-api/module c PyModuleDef_Slot}@anchor{53b9}
@deffn {C Type} type PyModuleDef_Slot
` Part of the @ref{776,,Stable ABI} (including all members) since version 3.5.'
@geindex PyModuleDef_Slot.slot (C member)
@anchor{c-api/module c PyModuleDef_Slot slot}@anchor{57a6}
@deffn {C Member} int slot

A slot ID, chosen from the available values explained below.
@end deffn

@geindex PyModuleDef_Slot.value (C member)
@anchor{c-api/module c PyModuleDef_Slot value}@anchor{57a7}
@deffn {C Member} void *value

Value of the slot, whose meaning depends on the slot ID.
@end deffn


Added in version 3.5.

@end deffn

The available slot types are:

@geindex Py_mod_create (C macro)
@anchor{c-api/module c Py_mod_create}@anchor{54b1}
@deffn {C Macro} Py_mod_create
` Part of the @ref{776,,Stable ABI} since version 3.5.'
Specifies a function that is called to create the module object itself.
The `value' pointer of this slot must point to a function of the signature:

@anchor{c-api/module c Py_mod_create create_module}@anchor{57a8}
@deffn {C Function} @ref{5df,,PyObject} *create_module (PyObject *spec, PyModuleDef *def)
@end deffn

The function receives a @ref{22b0,,ModuleSpec}
instance, as defined in 
@geindex Python Enhancement Proposals; PEP 451
PEP 451@footnote{https://peps.python.org/pep-0451/}, and the module definition.
It should return a new module object, or set an error
and return @code{NULL}.

This function should be kept minimal. In particular, it should not
call arbitrary Python code, as trying to import the same module again may
result in an infinite loop.

Multiple @code{Py_mod_create} slots may not be specified in one module
definition.

If @code{Py_mod_create} is not specified, the import machinery will create
a normal module object using @ref{53c1,,PyModule_New()}. The name is taken from
`spec', not the definition, to allow extension modules to dynamically adjust
to their place in the module hierarchy and be imported under different
names through symlinks, all while sharing a single module definition.

There is no requirement for the returned object to be an instance of
@ref{53c4,,PyModule_Type}. Any type can be used, as long as it supports
setting and getting import-related attributes.
However, only @code{PyModule_Type} instances may be returned if the
@code{PyModuleDef} has non-@code{NULL} @code{m_traverse}, @code{m_clear},
@code{m_free}; non-zero @code{m_size}; or slots other than @code{Py_mod_create}.


Added in version 3.5.

@end deffn

@geindex Py_mod_exec (C macro)
@anchor{c-api/module c Py_mod_exec}@anchor{b7b}
@deffn {C Macro} Py_mod_exec
` Part of the @ref{776,,Stable ABI} since version 3.5.'
Specifies a function that is called to `execute' the module.
This is equivalent to executing the code of a Python module: typically,
this function adds classes and constants to the module.
The signature of the function is:

@anchor{c-api/module c Py_mod_exec exec_module}@anchor{57a9}
@deffn {C Function} int exec_module (PyObject *module)
@end deffn

If multiple @code{Py_mod_exec} slots are specified, they are processed in the
order they appear in the `m_slots' array.


Added in version 3.5.

@end deffn

@geindex Py_mod_multiple_interpreters (C macro)
@anchor{c-api/module c Py_mod_multiple_interpreters}@anchor{54b2}
@deffn {C Macro} Py_mod_multiple_interpreters
` Part of the @ref{776,,Stable ABI} since version 3.12.'
Specifies one of the following values:

@geindex Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED (C macro)
@anchor{c-api/module c Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED}@anchor{5204}
@deffn {C Macro} Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED

The module does not support being imported in subinterpreters.
@end deffn

@geindex Py_MOD_MULTIPLE_INTERPRETERS_SUPPORTED (C macro)
@anchor{c-api/module c Py_MOD_MULTIPLE_INTERPRETERS_SUPPORTED}@anchor{57aa}
@deffn {C Macro} Py_MOD_MULTIPLE_INTERPRETERS_SUPPORTED

The module supports being imported in subinterpreters,
but only when they share the main interpreter’s GIL.
(See @ref{167,,Isolating Extension Modules}.)
@end deffn

@geindex Py_MOD_PER_INTERPRETER_GIL_SUPPORTED (C macro)
@anchor{c-api/module c Py_MOD_PER_INTERPRETER_GIL_SUPPORTED}@anchor{57ab}
@deffn {C Macro} Py_MOD_PER_INTERPRETER_GIL_SUPPORTED

The module supports being imported in subinterpreters,
even when they have their own GIL.
(See @ref{167,,Isolating Extension Modules}.)
@end deffn

This slot determines whether or not importing this module
in a subinterpreter will fail.

Multiple @code{Py_mod_multiple_interpreters} slots may not be specified
in one module definition.

If @code{Py_mod_multiple_interpreters} is not specified, the import
machinery defaults to @code{Py_MOD_MULTIPLE_INTERPRETERS_SUPPORTED}.


Added in version 3.12.

@end deffn

@geindex Py_mod_gil (C macro)
@anchor{c-api/module c Py_mod_gil}@anchor{483}
@deffn {C Macro} Py_mod_gil
` Part of the @ref{776,,Stable ABI} since version 3.13.'
Specifies one of the following values:

@geindex Py_MOD_GIL_USED (C macro)
@anchor{c-api/module c Py_MOD_GIL_USED}@anchor{57ac}
@deffn {C Macro} Py_MOD_GIL_USED

The module depends on the presence of the global interpreter lock (GIL),
and may access global state without synchronization.
@end deffn

@geindex Py_MOD_GIL_NOT_USED (C macro)
@anchor{c-api/module c Py_MOD_GIL_NOT_USED}@anchor{57ad}
@deffn {C Macro} Py_MOD_GIL_NOT_USED

The module is safe to run without an active GIL.
@end deffn

This slot is ignored by Python builds not configured with
@ref{49a,,--disable-gil}.  Otherwise, it determines whether or not importing
this module will cause the GIL to be automatically enabled. See
@ref{46d,,Free-threaded CPython} for more detail.

Multiple @code{Py_mod_gil} slots may not be specified in one module definition.

If @code{Py_mod_gil} is not specified, the import machinery defaults to
@code{Py_MOD_GIL_USED}.


Added in version 3.13.

@end deffn

@node Creating extension modules dynamically,Support functions,Module definitions,Other Objects
@anchor{c-api/module creating-extension-modules-dynamically}@anchor{57ae}@anchor{c-api/module moduledef-dynamic}@anchor{579e}
@subsubsection Creating extension modules dynamically


The following functions may be used to create a module outside of an
extension’s @ref{556d,,initialization function}.
They are also used in
@ref{556e,,single-phase initialization}.

@geindex PyModule_Create (C function)
@anchor{c-api/module c PyModule_Create}@anchor{5577}
@deffn {C Function} @ref{5df,,PyObject} *PyModule_Create (PyModuleDef *def)
`Return value: New reference.'
Create a new module object, given the definition in `def'.
This is a macro that calls @ref{53bc,,PyModule_Create2()} with
`module_api_version' set to @ref{4c8d,,PYTHON_API_VERSION}, or
to @ref{57af,,PYTHON_ABI_VERSION} if using the
@ref{637,,limited API}.
@end deffn

@geindex PyModule_Create2 (C function)
@anchor{c-api/module c PyModule_Create2}@anchor{53bc}
@deffn {C Function} @ref{5df,,PyObject} *PyModule_Create2 (PyModuleDef *def, int module_api_version)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Create a new module object, given the definition in `def', assuming the
API version `module_api_version'.  If that version does not match the version
of the running interpreter, a @ref{4d8,,RuntimeWarning} is emitted.

Return @code{NULL} with an exception set on error.

This function does not support slots.
The @ref{5575,,m_slots} member of `def' must be @code{NULL}.

@cartouche
@quotation Note 
Most uses of this function should be using @ref{5577,,PyModule_Create()}
instead; only use this if you are sure you need it.
@end quotation
@end cartouche
@end deffn

@geindex PyModule_FromDefAndSpec (C function)
@anchor{c-api/module c PyModule_FromDefAndSpec}@anchor{10b9}
@deffn {C Function} @ref{5df,,PyObject} *PyModule_FromDefAndSpec (PyModuleDef *def, PyObject *spec)
`Return value: New reference.'
This macro calls @ref{10ba,,PyModule_FromDefAndSpec2()} with
`module_api_version' set to @ref{4c8d,,PYTHON_API_VERSION}, or
to @ref{57af,,PYTHON_ABI_VERSION} if using the
@ref{637,,limited API}.


Added in version 3.5.

@end deffn

@geindex PyModule_FromDefAndSpec2 (C function)
@anchor{c-api/module c PyModule_FromDefAndSpec2}@anchor{10ba}
@deffn {C Function} @ref{5df,,PyObject} *PyModule_FromDefAndSpec2 (PyModuleDef *def, PyObject *spec, int module_api_version)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI} since version 3.7.'
Create a new module object, given the definition in `def' and the
ModuleSpec `spec', assuming the API version `module_api_version'.
If that version does not match the version of the running interpreter,
a @ref{4d8,,RuntimeWarning} is emitted.

Return @code{NULL} with an exception set on error.

Note that this does not process execution slots (@ref{b7b,,Py_mod_exec}).
Both @code{PyModule_FromDefAndSpec} and @code{PyModule_ExecDef} must be called
to fully initialize a module.

@cartouche
@quotation Note 
Most uses of this function should be using @ref{10b9,,PyModule_FromDefAndSpec()}
instead; only use this if you are sure you need it.
@end quotation
@end cartouche


Added in version 3.5.

@end deffn

@geindex PyModule_ExecDef (C function)
@anchor{c-api/module c PyModule_ExecDef}@anchor{10bb}
@deffn {C Function} int PyModule_ExecDef (PyObject *module, PyModuleDef *def)
` Part of the @ref{776,,Stable ABI} since version 3.7.'
Process any execution slots (@ref{b7b,,Py_mod_exec}) given in `def'.


Added in version 3.5.

@end deffn

@geindex PYTHON_API_VERSION (C macro)
@anchor{c-api/module c PYTHON_API_VERSION}@anchor{4c8d}
@deffn {C Macro} PYTHON_API_VERSION

The C API version. Defined for backwards compatibility.

Currently, this constant is not updated in new Python versions, and is not
useful for versioning. This may change in the future.
@end deffn

@geindex PYTHON_ABI_VERSION (C macro)
@anchor{c-api/module c PYTHON_ABI_VERSION}@anchor{57af}
@deffn {C Macro} PYTHON_ABI_VERSION

Defined as @code{3} for backwards compatibility.

Currently, this constant is not updated in new Python versions, and is not
useful for versioning. This may change in the future.
@end deffn

@node Support functions,Iterator Objects,Creating extension modules dynamically,Other Objects
@anchor{c-api/module support-functions}@anchor{57b0}
@subsubsection Support functions


The following functions are provided to help initialize a module
state.
They are intended for a module’s execution slots (@ref{b7b,,Py_mod_exec}),
the initialization function for legacy @ref{556e,,single-phase initialization},
or code that creates modules dynamically.

@geindex PyModule_AddObjectRef (C function)
@anchor{c-api/module c PyModule_AddObjectRef}@anchor{60a}
@deffn {C Function} int PyModule_AddObjectRef (PyObject *module, const char *name, PyObject *value)
` Part of the @ref{776,,Stable ABI} since version 3.10.'
Add an object to `module' as `name'.  This is a convenience function which
can be used from the module’s initialization function.

On success, return @code{0}. On error, raise an exception and return @code{-1}.

Example usage:

@example
static int
add_spam(PyObject *module, int value)
@{
    PyObject *obj = PyLong_FromLong(value);
    if (obj == NULL) @{
        return -1;
    @}
    int res = PyModule_AddObjectRef(module, "spam", obj);
    Py_DECREF(obj);
    return res;
 @}
@end example

To be convenient, the function accepts @code{NULL} `value' with an exception
set. In this case, return @code{-1} and just leave the raised exception
unchanged.

The example can also be written without checking explicitly if `obj' is
@code{NULL}:

@example
static int
add_spam(PyObject *module, int value)
@{
    PyObject *obj = PyLong_FromLong(value);
    int res = PyModule_AddObjectRef(module, "spam", obj);
    Py_XDECREF(obj);
    return res;
 @}
@end example

Note that @code{Py_XDECREF()} should be used instead of @code{Py_DECREF()} in
this case, since `obj' can be @code{NULL}.

The number of different `name' strings passed to this function
should be kept small, usually by only using statically allocated strings
as `name'.
For names that aren’t known at compile time, prefer calling
@ref{5472,,PyUnicode_FromString()} and @ref{17a9,,PyObject_SetAttr()} directly.
For more details, see @ref{19cf,,PyUnicode_InternFromString()}, which may be
used internally to create a key object.


Added in version 3.10.

@end deffn

@geindex PyModule_Add (C function)
@anchor{c-api/module c PyModule_Add}@anchor{609}
@deffn {C Function} int PyModule_Add (PyObject *module, const char *name, PyObject *value)
` Part of the @ref{776,,Stable ABI} since version 3.13.'
Similar to @ref{60a,,PyModule_AddObjectRef()}, but “steals” a reference
to `value'.
It can be called with a result of function that returns a new reference
without bothering to check its result or even saving it to a variable.

Example usage:

@example
if (PyModule_Add(module, "spam", PyBytes_FromString(value)) < 0) @{
    goto error;
@}
@end example


Added in version 3.13.

@end deffn

@geindex PyModule_AddObject (C function)
@anchor{c-api/module c PyModule_AddObject}@anchor{60b}
@deffn {C Function} int PyModule_AddObject (PyObject *module, const char *name, PyObject *value)
` Part of the @ref{776,,Stable ABI}.'
Similar to @ref{60a,,PyModule_AddObjectRef()}, but steals a reference to
`value' on success (if it returns @code{0}).

The new @ref{609,,PyModule_Add()} or @ref{60a,,PyModule_AddObjectRef()}
functions are recommended, since it is
easy to introduce reference leaks by misusing the
@ref{60b,,PyModule_AddObject()} function.

@cartouche
@quotation Note 
Unlike other functions that steal references, @code{PyModule_AddObject()}
only releases the reference to `value' `on success'.

This means that its return value must be checked, and calling code must
@ref{997,,Py_XDECREF()} `value' manually on error.
@end quotation
@end cartouche

Example usage:

@example
PyObject *obj = PyBytes_FromString(value);
if (PyModule_AddObject(module, "spam", obj) < 0) @{
    // If 'obj' is not NULL and PyModule_AddObject() failed,
    // 'obj' strong reference must be deleted with Py_XDECREF().
    // If 'obj' is NULL, Py_XDECREF() does nothing.
    Py_XDECREF(obj);
    goto error;
@}
// PyModule_AddObject() stole a reference to obj:
// Py_XDECREF(obj) is not needed here.
@end example


@ref{23f,,Soft deprecated} since version 3.13.

@end deffn

@geindex PyModule_AddIntConstant (C function)
@anchor{c-api/module c PyModule_AddIntConstant}@anchor{1748}
@deffn {C Function} int PyModule_AddIntConstant (PyObject *module, const char *name, long value)
` Part of the @ref{776,,Stable ABI}.'
Add an integer constant to `module' as `name'.  This convenience function can be
used from the module’s initialization function.
Return @code{-1} with an exception set on error, @code{0} on success.

This is a convenience function that calls @ref{1c13,,PyLong_FromLong()} and
@ref{60a,,PyModule_AddObjectRef()}; see their documentation for details.
@end deffn

@geindex PyModule_AddStringConstant (C function)
@anchor{c-api/module c PyModule_AddStringConstant}@anchor{1749}
@deffn {C Function} int PyModule_AddStringConstant (PyObject *module, const char *name, const char *value)
` Part of the @ref{776,,Stable ABI}.'
Add a string constant to `module' as `name'.  This convenience function can be
used from the module’s initialization function.  The string `value' must be
@code{NULL}-terminated.
Return @code{-1} with an exception set on error, @code{0} on success.

This is a convenience function that calls
@ref{19cf,,PyUnicode_InternFromString()} and @ref{60a,,PyModule_AddObjectRef()};
see their documentation for details.
@end deffn

@geindex PyModule_AddIntMacro (C macro)
@anchor{c-api/module c PyModule_AddIntMacro}@anchor{15ff}
@deffn {C Macro} PyModule_AddIntMacro (module, macro)

Add an int constant to `module'. The name and the value are taken from
`macro'. For example @code{PyModule_AddIntMacro(module, AF_INET)} adds the int
constant `AF_INET' with the value of `AF_INET' to `module'.
Return @code{-1} with an exception set on error, @code{0} on success.
@end deffn

@geindex PyModule_AddStringMacro (C macro)
@anchor{c-api/module c PyModule_AddStringMacro}@anchor{15fe}
@deffn {C Macro} PyModule_AddStringMacro (module, macro)

Add a string constant to `module'.
@end deffn

@geindex PyModule_AddType (C function)
@anchor{c-api/module c PyModule_AddType}@anchor{b72}
@deffn {C Function} int PyModule_AddType (PyObject *module, PyTypeObject *type)
` Part of the @ref{776,,Stable ABI} since version 3.10.'
Add a type object to `module'.
The type object is finalized by calling internally @ref{985,,PyType_Ready()}.
The name of the type object is taken from the last component of
@ref{1cf1,,tp_name} after dot.
Return @code{-1} with an exception set on error, @code{0} on success.


Added in version 3.9.

@end deffn

@geindex PyModule_AddFunctions (C function)
@anchor{c-api/module c PyModule_AddFunctions}@anchor{53bb}
@deffn {C Function} int PyModule_AddFunctions (PyObject *module, PyMethodDef *functions)
` Part of the @ref{776,,Stable ABI} since version 3.7.'
Add the functions from the @code{NULL} terminated `functions' array to `module'.
Refer to the @ref{16e3,,PyMethodDef} documentation for details on individual
entries (due to the lack of a shared module namespace, module level
“functions” implemented in C typically receive the module as their first
parameter, making them similar to instance methods on Python classes).

This function is called automatically when creating a module from
@code{PyModuleDef} (such as when using @ref{5573,,Multi-phase initialization},
@code{PyModule_Create}, or @code{PyModule_FromDefAndSpec}).
Some module authors may prefer defining functions in multiple
@ref{16e3,,PyMethodDef} arrays; in that case they should call this function
directly.

The `functions' array must be statically allocated (or otherwise guaranteed
to outlive the module object).


Added in version 3.5.

@end deffn

@geindex PyModule_SetDocString (C function)
@anchor{c-api/module c PyModule_SetDocString}@anchor{53c3}
@deffn {C Function} int PyModule_SetDocString (PyObject *module, const char *docstring)
` Part of the @ref{776,,Stable ABI} since version 3.7.'
Set the docstring for `module' to `docstring'.
This function is called automatically when creating a module from
@code{PyModuleDef} (such as when using @ref{5573,,Multi-phase initialization},
@code{PyModule_Create}, or @code{PyModule_FromDefAndSpec}).

Return @code{0} on success.
Return @code{-1} with an exception set on error.


Added in version 3.5.

@end deffn

@geindex PyUnstable_Module_SetGIL (C function)
@anchor{c-api/module c PyUnstable_Module_SetGIL}@anchor{49e}
@deffn {C Function} int PyUnstable_Module_SetGIL (PyObject *module, void *gil)

@cartouche
@quotation This is Unstable API. It may change without warning in minor releases. `This is @ref{76a,,Unstable API}. It may change without warning in minor releases.'
@end quotation
@end cartouche

Indicate that `module' does or does not support running without the global
interpreter lock (GIL), using one of the values from
@ref{483,,Py_mod_gil}. It must be called during `module'’s initialization
function when using @ref{556e,,Legacy single-phase initialization}.
If this function is not called during module initialization, the
import machinery assumes the module does not support running without the
GIL. This function is only available in Python builds configured with
@ref{49a,,--disable-gil}.
Return @code{-1} with an exception set on error, @code{0} on success.


Added in version 3.13.

@end deffn

@menu
* Module lookup (single-phase initialization): Module lookup single-phase initialization. 

@end menu

@node Module lookup single-phase initialization,,,Support functions
@anchor{c-api/module module-lookup-single-phase-initialization}@anchor{57b1}
@subsubsection Module lookup (single-phase initialization)


The legacy @ref{556e,,single-phase initialization}
initialization scheme creates singleton modules that can be looked up
in the context of the current interpreter. This allows the module object to be
retrieved later with only a reference to the module definition.

These functions will not work on modules created using multi-phase initialization,
since multiple such modules can be created from a single definition.

@geindex PyState_FindModule (C function)
@anchor{c-api/module c PyState_FindModule}@anchor{5415}
@deffn {C Function} @ref{5df,,PyObject} *PyState_FindModule (PyModuleDef *def)
`Return value: Borrowed reference.'` Part of the @ref{776,,Stable ABI}.'
Returns the module object that was created from `def' for the current interpreter.
This method requires that the module object has been attached to the interpreter state with
@ref{5414,,PyState_AddModule()} beforehand. In case the corresponding module object is not
found or has not been attached to the interpreter state yet, it returns @code{NULL}.
@end deffn

@geindex PyState_AddModule (C function)
@anchor{c-api/module c PyState_AddModule}@anchor{5414}
@deffn {C Function} int PyState_AddModule (PyObject *module, PyModuleDef *def)
` Part of the @ref{776,,Stable ABI} since version 3.3.'
Attaches the module object passed to the function to the interpreter state. This allows
the module object to be accessible via @ref{5415,,PyState_FindModule()}.

Only effective on modules created using single-phase initialization.

Python calls @code{PyState_AddModule} automatically after importing a module
that uses @ref{556e,,single-phase initialization},
so it is unnecessary (but harmless) to call it from module initialization
code. An explicit call is needed only if the module’s own init code
subsequently calls @code{PyState_FindModule}.
The function is mainly intended for implementing alternative import
mechanisms (either by calling it directly, or by referring to its
implementation for details of the required state updates).

If a module was attached previously using the same `def', it is replaced
by the new `module'.

The caller must have an @ref{5231,,attached thread state}.

Return @code{-1} with an exception set on error, @code{0} on success.


Added in version 3.3.

@end deffn

@geindex PyState_RemoveModule (C function)
@anchor{c-api/module c PyState_RemoveModule}@anchor{5416}
@deffn {C Function} int PyState_RemoveModule (PyModuleDef *def)
` Part of the @ref{776,,Stable ABI} since version 3.3.'
Removes the module object created from `def' from the interpreter state.
Return @code{-1} with an exception set on error, @code{0} on success.

The caller must have an @ref{5231,,attached thread state}.


Added in version 3.3.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Iterator Objects,Descriptor Objects,Support functions,Other Objects
@anchor{c-api/iterator doc}@anchor{57b2}@anchor{c-api/iterator id1}@anchor{57b3}@anchor{c-api/iterator iterator-objects}@anchor{57b4}@anchor{c-api/iterator translation-repo}@anchor{57b5}
@subsubsection Iterator Objects


Python provides two general-purpose iterator objects.  The first, a sequence
iterator, works with an arbitrary sequence supporting the @ref{588,,__getitem__()}
method.  The second works with a callable object and a sentinel value, calling
the callable for each item in the sequence, and ending the iteration when the
sentinel value is returned.

@geindex PySeqIter_Type (C var)
@anchor{c-api/iterator c PySeqIter_Type}@anchor{53ff}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PySeqIter_Type
` Part of the @ref{776,,Stable ABI}.'
Type object for iterator objects returned by @ref{53fe,,PySeqIter_New()} and the
one-argument form of the @ref{9dd,,iter()} built-in function for built-in sequence
types.
@end deffn

@geindex PySeqIter_Check (C function)
@anchor{c-api/iterator c PySeqIter_Check}@anchor{57b6}
@deffn {C Function} int PySeqIter_Check (PyObject *op)

Return true if the type of `op' is @ref{53ff,,PySeqIter_Type}.  This function
always succeeds.
@end deffn

@geindex PySeqIter_New (C function)
@anchor{c-api/iterator c PySeqIter_New}@anchor{53fe}
@deffn {C Function} @ref{5df,,PyObject} *PySeqIter_New (PyObject *seq)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Return an iterator that works with a general sequence object, `seq'.  The
iteration ends when the sequence raises @ref{1741,,IndexError} for the subscripting
operation.
@end deffn

@geindex PyCallIter_Type (C var)
@anchor{c-api/iterator c PyCallIter_Type}@anchor{52f1}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyCallIter_Type
` Part of the @ref{776,,Stable ABI}.'
Type object for iterator objects returned by @ref{52f0,,PyCallIter_New()} and the
two-argument form of the @ref{9dd,,iter()} built-in function.
@end deffn

@geindex PyCallIter_Check (C function)
@anchor{c-api/iterator c PyCallIter_Check}@anchor{57b7}
@deffn {C Function} int PyCallIter_Check (PyObject *op)

Return true if the type of `op' is @ref{52f1,,PyCallIter_Type}.  This
function always succeeds.
@end deffn

@geindex PyCallIter_New (C function)
@anchor{c-api/iterator c PyCallIter_New}@anchor{52f0}
@deffn {C Function} @ref{5df,,PyObject} *PyCallIter_New (PyObject *callable, PyObject *sentinel)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Return a new iterator.  The first parameter, `callable', can be any Python
callable object that can be called with no parameters; each call to it should
return the next item in the iteration.  When `callable' returns a value equal to
`sentinel', the iteration will be terminated.
@end deffn

@menu
* Range Objects:: 
* Builtin Iterator Types:: 
* Other Iterator Objects:: 

@end menu

@node Range Objects,Builtin Iterator Types,,Iterator Objects
@anchor{c-api/iterator range-objects}@anchor{57b8}
@subsubsection Range Objects


@geindex PyRange_Type (C var)
@anchor{c-api/iterator c PyRange_Type}@anchor{53fc}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyRange_Type
` Part of the @ref{776,,Stable ABI}.'
The type object for @ref{b43,,range} objects.
@end deffn

@geindex PyRange_Check (C function)
@anchor{c-api/iterator c PyRange_Check}@anchor{57b9}
@deffn {C Function} int PyRange_Check (PyObject *o)

Return true if the object `o' is an instance of a @ref{b43,,range} object.
This function always succeeds.
@end deffn

@node Builtin Iterator Types,Other Iterator Objects,Range Objects,Iterator Objects
@anchor{c-api/iterator builtin-iterator-types}@anchor{57ba}
@subsubsection Builtin Iterator Types


These are built-in iteration types that are included in Python’s C API, but
provide no additional functions. They are here for completeness.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

C type

@tab

Python type

@item

@geindex PyEnum_Type (C var)
@anchor{c-api/iterator c PyEnum_Type}@anchor{532a}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyEnum_Type
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@tab

@ref{168d,,enumerate}

@item

@geindex PyFilter_Type (C var)
@anchor{c-api/iterator c PyFilter_Type}@anchor{5388}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyFilter_Type
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@tab

@ref{a6a,,filter}

@item

@geindex PyMap_Type (C var)
@anchor{c-api/iterator c PyMap_Type}@anchor{53b0}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyMap_Type
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@tab

@ref{1a0,,map}

@item

@geindex PyReversed_Type (C var)
@anchor{c-api/iterator c PyReversed_Type}@anchor{53fd}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyReversed_Type
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@tab

@ref{a6b,,reversed}

@item

@geindex PyZip_Type (C var)
@anchor{c-api/iterator c PyZip_Type}@anchor{5480}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyZip_Type
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@tab

@ref{1a1,,zip}

@end multitable


@node Other Iterator Objects,,Builtin Iterator Types,Iterator Objects
@anchor{c-api/iterator other-iterator-objects}@anchor{57bb}
@subsubsection Other Iterator Objects


@geindex PyByteArrayIter_Type (C var)
@anchor{c-api/iterator c PyByteArrayIter_Type}@anchor{52d8}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyByteArrayIter_Type
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@geindex PyBytesIter_Type (C var)
@anchor{c-api/iterator c PyBytesIter_Type}@anchor{52de}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyBytesIter_Type
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@geindex PyListIter_Type (C var)
@anchor{c-api/iterator c PyListIter_Type}@anchor{539d}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyListIter_Type
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@geindex PyListRevIter_Type (C var)
@anchor{c-api/iterator c PyListRevIter_Type}@anchor{539e}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyListRevIter_Type
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@geindex PySetIter_Type (C var)
@anchor{c-api/iterator c PySetIter_Type}@anchor{540d}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PySetIter_Type
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@geindex PyTupleIter_Type (C var)
@anchor{c-api/iterator c PyTupleIter_Type}@anchor{5435}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyTupleIter_Type
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@geindex PyRangeIter_Type (C var)
@anchor{c-api/iterator c PyRangeIter_Type}@anchor{53fb}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyRangeIter_Type
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@geindex PyLongRangeIter_Type (C var)
@anchor{c-api/iterator c PyLongRangeIter_Type}@anchor{53a5}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyLongRangeIter_Type
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@geindex PyDictIterKey_Type (C var)
@anchor{c-api/iterator c PyDictIterKey_Type}@anchor{5314}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyDictIterKey_Type
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@geindex PyDictRevIterKey_Type (C var)
@anchor{c-api/iterator c PyDictRevIterKey_Type}@anchor{531a}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyDictRevIterKey_Type
` Part of the @ref{776,,Stable ABI} since version 3.8.'
@end deffn

@geindex PyDictIterValue_Type (C var)
@anchor{c-api/iterator c PyDictIterValue_Type}@anchor{5315}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyDictIterValue_Type
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@geindex PyDictRevIterValue_Type (C var)
@anchor{c-api/iterator c PyDictRevIterValue_Type}@anchor{531b}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyDictRevIterValue_Type
` Part of the @ref{776,,Stable ABI} since version 3.8.'
@end deffn

@geindex PyDictIterItem_Type (C var)
@anchor{c-api/iterator c PyDictIterItem_Type}@anchor{5313}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyDictIterItem_Type
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@geindex PyDictRevIterItem_Type (C var)
@anchor{c-api/iterator c PyDictRevIterItem_Type}@anchor{5319}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyDictRevIterItem_Type
` Part of the @ref{776,,Stable ABI} since version 3.8.'
@end deffn

@geindex PyODictIter_Type (C var)
@anchor{c-api/iterator c PyODictIter_Type}@anchor{57bc}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyODictIter_Type

Type objects for iterators of various built-in objects.

Do not create instances of these directly; prefer calling
@ref{53f3,,PyObject_GetIter()} instead.

Note that there is no guarantee that a given built-in type uses a given iterator
type. For example, iterating over @ref{b43,,range} will use one of two iterator
types depending on the size of the range. Other types may start using a
similar scheme in the future, without warning.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Descriptor Objects,Slice Objects,Iterator Objects,Other Objects
@anchor{c-api/descriptor doc}@anchor{57bd}@anchor{c-api/descriptor descriptor-objects}@anchor{57be}@anchor{c-api/descriptor id1}@anchor{57bf}@anchor{c-api/descriptor translation-repo}@anchor{57c0}
@subsubsection Descriptor Objects


“Descriptors” are objects that describe some attribute of an object. They are
found in the dictionary of type objects.

@c XXX document these!

@geindex PyProperty_Type (C var)
@anchor{c-api/descriptor c PyProperty_Type}@anchor{53fa}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyProperty_Type
` Part of the @ref{776,,Stable ABI}.'
The type object for the built-in descriptor types.
@end deffn

@geindex PyDescr_NewGetSet (C function)
@anchor{c-api/descriptor c PyDescr_NewGetSet}@anchor{5310}
@deffn {C Function} @ref{5df,,PyObject} *PyDescr_NewGetSet (PyTypeObject *type, struct PyGetSetDef *getset)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
@end deffn

@geindex PyDescr_NewMember (C function)
@anchor{c-api/descriptor c PyDescr_NewMember}@anchor{5311}
@deffn {C Function} @ref{5df,,PyObject} *PyDescr_NewMember (PyTypeObject *type, struct PyMemberDef *meth)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
@end deffn

@geindex PyMemberDescr_Type (C var)
@anchor{c-api/descriptor c PyMemberDescr_Type}@anchor{53b4}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyMemberDescr_Type
` Part of the @ref{776,,Stable ABI}.'
The type object for member descriptor objects created from
@ref{772,,PyMemberDef} structures. These descriptors expose fields of a
C struct as attributes on a type, and correspond
to @ref{2a55,,types.MemberDescriptorType} objects in Python.
@end deffn

@geindex PyGetSetDescr_Type (C var)
@anchor{c-api/descriptor c PyGetSetDescr_Type}@anchor{538f}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyGetSetDescr_Type
` Part of the @ref{776,,Stable ABI}.'
The type object for get/set descriptor objects created from
@ref{db8,,PyGetSetDef} structures. These descriptors implement attributes
whose value is computed by C getter and setter functions, and are used
for many built-in type attributes.
@end deffn

@geindex PyDescr_NewMethod (C function)
@anchor{c-api/descriptor c PyDescr_NewMethod}@anchor{1db9}
@deffn {C Function} @ref{5df,,PyObject} *PyDescr_NewMethod (PyTypeObject *type, struct PyMethodDef *meth)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
@end deffn

@geindex PyMethodDescr_Type (C var)
@anchor{c-api/descriptor c PyMethodDescr_Type}@anchor{53b8}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyMethodDescr_Type
` Part of the @ref{776,,Stable ABI}.'
The type object for method descriptor objects created from
@ref{16e3,,PyMethodDef} structures. These descriptors expose C functions as
methods on a type, and correspond to @ref{2a55,,types.MemberDescriptorType}
objects in Python.
@end deffn

@geindex PyDescr_NewWrapper (C function)
@anchor{c-api/descriptor c PyDescr_NewWrapper}@anchor{57c1}
@deffn {C Function} @ref{5df,,PyObject} *PyDescr_NewWrapper (PyTypeObject *type, struct wrapperbase *wrapper, void *wrapped)
`Return value: New reference.'
@end deffn

@geindex PyWrapperDescr_Type (C var)
@anchor{c-api/descriptor c PyWrapperDescr_Type}@anchor{547e}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyWrapperDescr_Type
` Part of the @ref{776,,Stable ABI}.'
The type object for wrapper descriptor objects created by
@ref{57c1,,PyDescr_NewWrapper()} and @ref{547f,,PyWrapper_New()}. Wrapper
descriptors are used internally to expose special methods implemented
via wrapper structures, and appear in Python as
@ref{d98,,types.WrapperDescriptorType} objects.
@end deffn

@geindex PyDescr_NewClassMethod (C function)
@anchor{c-api/descriptor c PyDescr_NewClassMethod}@anchor{530f}
@deffn {C Function} @ref{5df,,PyObject} *PyDescr_NewClassMethod (PyTypeObject *type, PyMethodDef *method)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
@end deffn

@geindex PyDescr_IsData (C function)
@anchor{c-api/descriptor c PyDescr_IsData}@anchor{1cf4}
@deffn {C Function} int PyDescr_IsData (PyObject *descr)

Return non-zero if the descriptor object `descr' describes a data attribute, or
@code{0} if it describes a method.  `descr' must be a descriptor object; there is
no error checking.
@end deffn

@geindex PyWrapper_New (C function)
@anchor{c-api/descriptor c PyWrapper_New}@anchor{547f}
@deffn {C Function} @ref{5df,,PyObject} *PyWrapper_New (PyObject*, PyObject*)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
@end deffn

@menu
* Built-in descriptors:: 

@end menu

@node Built-in descriptors,,,Descriptor Objects
@anchor{c-api/descriptor built-in-descriptors}@anchor{57c2}
@subsubsection Built-in descriptors


@geindex PySuper_Type (C var)
@anchor{c-api/descriptor c PySuper_Type}@anchor{541b}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PySuper_Type
` Part of the @ref{776,,Stable ABI}.'
The type object for super objects. This is the same object as
@ref{1a7,,super} in the Python layer.
@end deffn

@geindex PyClassMethod_Type (C var)
@anchor{c-api/descriptor c PyClassMethod_Type}@anchor{57c3}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyClassMethod_Type

The type of class method objects. This is the same object as
@ref{48f,,classmethod} in the Python layer.
@end deffn

@geindex PyClassMethodDescr_Type (C var)
@anchor{c-api/descriptor c PyClassMethodDescr_Type}@anchor{52fd}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyClassMethodDescr_Type
` Part of the @ref{776,,Stable ABI}.'
The type object for C-level class method descriptor objects.
This is the type of the descriptors created for @ref{48f,,classmethod()} defined in
C extension types, and is the same object as @ref{48f,,classmethod}
in Python.
@end deffn

@geindex PyClassMethod_New (C function)
@anchor{c-api/descriptor c PyClassMethod_New}@anchor{57c4}
@deffn {C Function} @ref{5df,,PyObject} *PyClassMethod_New (PyObject *callable)

Create a new @ref{48f,,classmethod} object wrapping `callable'.
`callable' must be a callable object and must not be @code{NULL}.

On success, this function returns a @ref{5e2,,strong reference} to a new class
method descriptor. On failure, this function returns @code{NULL} with an
exception set.
@end deffn

@geindex PyStaticMethod_Type (C var)
@anchor{c-api/descriptor c PyStaticMethod_Type}@anchor{57c5}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyStaticMethod_Type

The type of static method objects. This is the same object as
@ref{451,,staticmethod} in the Python layer.
@end deffn

@geindex PyStaticMethod_New (C function)
@anchor{c-api/descriptor c PyStaticMethod_New}@anchor{57c6}
@deffn {C Function} @ref{5df,,PyObject} *PyStaticMethod_New (PyObject *callable)

Create a new @ref{451,,staticmethod} object wrapping `callable'.
`callable' must be a callable object and must not be @code{NULL}.

On success, this function returns a @ref{5e2,,strong reference} to a new static
method descriptor. On failure, this function returns @code{NULL} with an
exception set.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Slice Objects,MemoryView objects,Descriptor Objects,Other Objects
@anchor{c-api/slice doc}@anchor{57c7}@anchor{c-api/slice id1}@anchor{57c8}@anchor{c-api/slice slice-objects}@anchor{57c9}@anchor{c-api/slice translation-repo}@anchor{57ca}
@subsubsection Slice Objects


@geindex PySlice_Type (C var)
@anchor{c-api/slice c PySlice_Type}@anchor{5413}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PySlice_Type
` Part of the @ref{776,,Stable ABI}.'
The type object for slice objects.  This is the same as @ref{695,,slice} in the
Python layer.
@end deffn

@geindex PySlice_Check (C function)
@anchor{c-api/slice c PySlice_Check}@anchor{57cb}
@deffn {C Function} int PySlice_Check (PyObject *ob)

Return true if `ob' is a slice object; `ob' must not be @code{NULL}.  This
function always succeeds.
@end deffn

@geindex PySlice_New (C function)
@anchor{c-api/slice c PySlice_New}@anchor{5412}
@deffn {C Function} @ref{5df,,PyObject} *PySlice_New (PyObject *start, PyObject *stop, PyObject *step)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Return a new slice object with the given values.  The `start', `stop', and
`step' parameters are used as the values of the slice object attributes of
the same names.  Any of the values may be @code{NULL}, in which case the
@code{None} will be used for the corresponding attribute.

Return @code{NULL} with an exception set if
the new object could not be allocated.
@end deffn

@geindex PySlice_GetIndices (C function)
@anchor{c-api/slice c PySlice_GetIndices}@anchor{5411}
@deffn {C Function} int PySlice_GetIndices (PyObject *slice, Py_ssize_t length, Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step)
` Part of the @ref{776,,Stable ABI}.'
Retrieve the start, stop and step indices from the slice object `slice',
assuming a sequence of length `length'. Treats indices greater than
`length' as errors.

Returns @code{0} on success and @code{-1} on error with no exception set (unless one of
the indices was not @code{None} and failed to be converted to an integer,
in which case @code{-1} is returned with an exception set).

You probably do not want to use this function.


Changed in version 3.2: The parameter type for the `slice' parameter was @code{PySliceObject*}
before.

@end deffn

@geindex PySlice_GetIndicesEx (C function)
@anchor{c-api/slice c PySlice_GetIndicesEx}@anchor{42f}
@deffn {C Function} int PySlice_GetIndicesEx (PyObject *slice, Py_ssize_t length, Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step, Py_ssize_t *slicelength)
` Part of the @ref{776,,Stable ABI}.'
Usable replacement for @ref{5411,,PySlice_GetIndices()}.  Retrieve the start,
stop, and step indices from the slice object `slice' assuming a sequence of
length `length', and store the length of the slice in `slicelength'.  Out
of bounds indices are clipped in a manner consistent with the handling of
normal slices.

Return @code{0} on success and @code{-1} on error with an exception set.

@cartouche
@quotation Note 
This function is considered not safe for resizable sequences.
Its invocation should be replaced by a combination of
@ref{430,,PySlice_Unpack()} and @ref{431,,PySlice_AdjustIndices()} where

@example
if (PySlice_GetIndicesEx(slice, length, &start, &stop, &step, &slicelength) < 0) @{
    // return error
@}
@end example

is replaced by

@example
if (PySlice_Unpack(slice, &start, &stop, &step) < 0) @{
    // return error
@}
slicelength = PySlice_AdjustIndices(length, &start, &stop, step);
@end example
@end quotation
@end cartouche


Changed in version 3.2: The parameter type for the `slice' parameter was @code{PySliceObject*}
before.



Changed in version 3.6.1: If @code{Py_LIMITED_API} is not set or set to the value between @code{0x03050400}
and @code{0x03060000} (not including) or @code{0x03060100} or higher
@code{PySlice_GetIndicesEx()} is implemented as a macro using
@code{PySlice_Unpack()} and @code{PySlice_AdjustIndices()}.
Arguments `start', `stop' and `step' are evaluated more than once.



Deprecated since version 3.6.1: If @code{Py_LIMITED_API} is set to the value less than @code{0x03050400} or
between @code{0x03060000} and @code{0x03060100} (not including)
@code{PySlice_GetIndicesEx()} is a deprecated function.

@end deffn

@geindex PySlice_Unpack (C function)
@anchor{c-api/slice c PySlice_Unpack}@anchor{430}
@deffn {C Function} int PySlice_Unpack (PyObject *slice, Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step)
` Part of the @ref{776,,Stable ABI} since version 3.7.'
Extract the start, stop and step data members from a slice object as
C integers.  Silently reduce values larger than @code{PY_SSIZE_T_MAX} to
@code{PY_SSIZE_T_MAX}, silently boost the start and stop values less than
@code{PY_SSIZE_T_MIN} to @code{PY_SSIZE_T_MIN}, and silently boost the step
values less than @code{-PY_SSIZE_T_MAX} to @code{-PY_SSIZE_T_MAX}.

Return @code{-1} with an exception set on error, @code{0} on success.


Added in version 3.6.1.

@end deffn

@geindex PySlice_AdjustIndices (C function)
@anchor{c-api/slice c PySlice_AdjustIndices}@anchor{431}
@deffn {C Function} @ref{c5b,,Py_ssize_t} PySlice_AdjustIndices (Py_ssize_t length, Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t step)
` Part of the @ref{776,,Stable ABI} since version 3.7.'
Adjust start/end slice indices assuming a sequence of the specified length.
Out of bounds indices are clipped in a manner consistent with the handling
of normal slices.

Return the length of the slice.  Always successful.  Doesn’t call Python
code.


Added in version 3.6.1.

@end deffn

@menu
* Ellipsis Object:: 

@end menu

@node Ellipsis Object,,,Slice Objects
@anchor{c-api/slice ellipsis-object}@anchor{57cc}
@subsubsection Ellipsis Object


@geindex PyEllipsis_Type (C var)
@anchor{c-api/slice c PyEllipsis_Type}@anchor{5329}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyEllipsis_Type
` Part of the @ref{776,,Stable ABI}.'
The type of Python @ref{236c,,Ellipsis} object.  Same as @ref{a57,,types.EllipsisType}
in the Python layer.
@end deffn

@geindex Py_Ellipsis (C var)
@anchor{c-api/slice c Py_Ellipsis}@anchor{57cd}
@deffn {C Variable} @ref{5df,,PyObject} *Py_Ellipsis

The Python @code{Ellipsis} object.  This object has no methods.  Like
@ref{51ff,,Py_None}, it is an @ref{292,,immortal} singleton object.


Changed in version 3.12: @ref{57cd,,Py_Ellipsis} is immortal.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@geindex object; memoryview
@anchor{c-api/memoryview memoryview-objects}@anchor{561a}
@node MemoryView objects,Pickle buffer objects,Slice Objects,Other Objects
@anchor{c-api/memoryview doc}@anchor{57ce}@anchor{c-api/memoryview id1}@anchor{57cf}@anchor{c-api/memoryview translation-repo}@anchor{57d0}
@subsubsection MemoryView objects


A @ref{166,,memoryview} object exposes the C level @ref{262,,buffer interface} as a Python object which can then be passed around like
any other object.

@geindex PyMemoryView_Type (C var)
@anchor{c-api/memoryview c PyMemoryView_Type}@anchor{53b7}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyMemoryView_Type
` Part of the @ref{776,,Stable ABI}.'
This instance of @ref{ca2,,PyTypeObject} represents the Python memoryview
type. This is the same object as @ref{166,,memoryview} in the Python layer.
@end deffn

@geindex PyMemoryView_FromObject (C function)
@anchor{c-api/memoryview c PyMemoryView_FromObject}@anchor{53b5}
@deffn {C Function} @ref{5df,,PyObject} *PyMemoryView_FromObject (PyObject *obj)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Create a memoryview object from an object that provides the buffer interface.
If `obj' supports writable buffer exports, the memoryview object will be
read/write, otherwise it may be either read-only or read/write at the
discretion of the exporter.
@end deffn

@geindex PyBUF_READ (C macro)
@anchor{c-api/memoryview c PyBUF_READ}@anchor{1a52}
@deffn {C Macro} PyBUF_READ
` Part of the @ref{776,,Stable ABI} since version 3.11.'
Flag to request a readonly buffer.
@end deffn

@geindex PyBUF_WRITE (C macro)
@anchor{c-api/memoryview c PyBUF_WRITE}@anchor{1a53}
@deffn {C Macro} PyBUF_WRITE
` Part of the @ref{776,,Stable ABI} since version 3.11.'
Flag to request a writable buffer.
@end deffn

@geindex PyMemoryView_FromMemory (C function)
@anchor{c-api/memoryview c PyMemoryView_FromMemory}@anchor{137c}
@deffn {C Function} @ref{5df,,PyObject} *PyMemoryView_FromMemory (char *mem, Py_ssize_t size, int flags)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI} since version 3.7.'
Create a memoryview object using `mem' as the underlying buffer.
`flags' can be one of @ref{1a52,,PyBUF_READ} or @ref{1a53,,PyBUF_WRITE}.


Added in version 3.3.

@end deffn

@geindex PyMemoryView_FromBuffer (C function)
@anchor{c-api/memoryview c PyMemoryView_FromBuffer}@anchor{96a}
@deffn {C Function} @ref{5df,,PyObject} *PyMemoryView_FromBuffer (const Py_buffer *view)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI} since version 3.11.'
Create a memoryview object wrapping the given buffer structure `view'.
For simple byte buffers, @ref{137c,,PyMemoryView_FromMemory()} is the preferred
function.
@end deffn

@geindex PyMemoryView_GetContiguous (C function)
@anchor{c-api/memoryview c PyMemoryView_GetContiguous}@anchor{53b6}
@deffn {C Function} @ref{5df,,PyObject} *PyMemoryView_GetContiguous (PyObject *obj, int buffertype, char order)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Create a memoryview object to a @ref{26ce,,contiguous} chunk of memory (in either
‘C’ or ‘F’ortran `order') from an object that defines the buffer
interface. If memory is contiguous, the memoryview object points to the
original memory. Otherwise, a copy is made and the memoryview points to a
new bytes object.

`buffertype' can be one of @ref{1a52,,PyBUF_READ} or @ref{1a53,,PyBUF_WRITE}.
@end deffn

@geindex PyMemoryView_Check (C function)
@anchor{c-api/memoryview c PyMemoryView_Check}@anchor{57d1}
@deffn {C Function} int PyMemoryView_Check (PyObject *obj)

Return true if the object `obj' is a memoryview object.  It is not
currently allowed to create subclasses of @ref{166,,memoryview}.  This
function always succeeds.
@end deffn

@geindex PyMemoryView_GET_BUFFER (C function)
@anchor{c-api/memoryview c PyMemoryView_GET_BUFFER}@anchor{57d2}
@deffn {C Function} @ref{961,,Py_buffer} *PyMemoryView_GET_BUFFER (PyObject *mview)

Return a pointer to the memoryview’s private copy of the exporter’s buffer.
`mview' `must' be a memoryview instance; this macro doesn’t check its type,
you must do it yourself or you will risk crashes.
@end deffn

@geindex PyMemoryView_GET_BASE (C function)
@anchor{c-api/memoryview c PyMemoryView_GET_BASE}@anchor{57d3}
@deffn {C Function} @ref{5df,,PyObject} *PyMemoryView_GET_BASE (PyObject *mview)

Return either a pointer to the exporting object that the memoryview is based
on or @code{NULL} if the memoryview has been created by one of the functions
@ref{137c,,PyMemoryView_FromMemory()} or @ref{96a,,PyMemoryView_FromBuffer()}.
`mview' `must' be a memoryview instance.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@geindex object; PickleBuffer
@anchor{c-api/picklebuffer picklebuffer-objects}@anchor{57d4}
@node Pickle buffer objects,Weak Reference Objects<2>,MemoryView objects,Other Objects
@anchor{c-api/picklebuffer doc}@anchor{57d5}@anchor{c-api/picklebuffer pickle-buffer-objects}@anchor{57d6}@anchor{c-api/picklebuffer translation-repo}@anchor{57d7}
@subsubsection Pickle buffer objects



Added in version 3.8.


A @ref{1797,,pickle.PickleBuffer} object wraps a @ref{262,,buffer-providing object} for out-of-band data transfer with the @ref{ab,,pickle} module.

@geindex PyPickleBuffer_Type (C var)
@anchor{c-api/picklebuffer c PyPickleBuffer_Type}@anchor{57d8}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyPickleBuffer_Type

This instance of @ref{ca2,,PyTypeObject} represents the Python pickle buffer type.
This is the same object as @ref{1797,,pickle.PickleBuffer} in the Python layer.
@end deffn

@geindex PyPickleBuffer_Check (C function)
@anchor{c-api/picklebuffer c PyPickleBuffer_Check}@anchor{57d9}
@deffn {C Function} int PyPickleBuffer_Check (PyObject *op)

Return true if `op' is a pickle buffer instance.
This function always succeeds.
@end deffn

@geindex PyPickleBuffer_FromObject (C function)
@anchor{c-api/picklebuffer c PyPickleBuffer_FromObject}@anchor{57da}
@deffn {C Function} @ref{5df,,PyObject} *PyPickleBuffer_FromObject (PyObject *obj)

Create a pickle buffer from the object `obj'.

This function will fail if `obj' doesn’t support the @ref{262,,buffer protocol}.

On success, return a new pickle buffer instance.
On failure, set an exception and return @code{NULL}.

Analogous to calling @ref{1797,,pickle.PickleBuffer} with `obj' in Python.
@end deffn

@geindex PyPickleBuffer_GetBuffer (C function)
@anchor{c-api/picklebuffer c PyPickleBuffer_GetBuffer}@anchor{57db}
@deffn {C Function} const @ref{961,,Py_buffer} *PyPickleBuffer_GetBuffer (PyObject *picklebuf)

Get a pointer to the underlying @ref{961,,Py_buffer} that the pickle buffer wraps.

The returned pointer is valid as long as `picklebuf' is alive and has not been
released. The caller must not modify or free the returned @ref{961,,Py_buffer}.
If the pickle buffer has been released, raise @ref{2ee,,ValueError}.

On success, return a pointer to the buffer view.
On failure, set an exception and return @code{NULL}.
@end deffn

@geindex PyPickleBuffer_Release (C function)
@anchor{c-api/picklebuffer c PyPickleBuffer_Release}@anchor{57dc}
@deffn {C Function} int PyPickleBuffer_Release (PyObject *picklebuf)

Release the underlying buffer held by the pickle buffer.

Return @code{0} on success. On failure, set an exception and return @code{-1}.

Analogous to calling @ref{2d8d,,pickle.PickleBuffer.release()} in Python.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Weak Reference Objects<2>,Capsules<2>,Pickle buffer objects,Other Objects
@anchor{c-api/weakref doc}@anchor{57dd}@anchor{c-api/weakref translation-repo}@anchor{57de}@anchor{c-api/weakref weak-reference-objects}@anchor{57df}@anchor{c-api/weakref weakrefobjects}@anchor{55ef}
@subsubsection Weak Reference Objects


Python supports `weak references' as first-class objects.  There are two
specific object types which directly implement weak references.  The first is a
simple reference object, and the second acts as a proxy for the original object
as much as it can.

@geindex PyWeakref_Check (C function)
@anchor{c-api/weakref c PyWeakref_Check}@anchor{57e0}
@deffn {C Function} int PyWeakref_Check (PyObject *ob)

Return non-zero if `ob' is either a reference or proxy object.  This function
always succeeds.
@end deffn

@geindex PyWeakref_CheckRef (C function)
@anchor{c-api/weakref c PyWeakref_CheckRef}@anchor{57e1}
@deffn {C Function} int PyWeakref_CheckRef (PyObject *ob)

Return non-zero if `ob' is a reference object or a subclass of the reference
type.  This function always succeeds.
@end deffn

@geindex PyWeakref_CheckRefExact (C function)
@anchor{c-api/weakref c PyWeakref_CheckRefExact}@anchor{57e2}
@deffn {C Function} int PyWeakref_CheckRefExact (PyObject *ob)

Return non-zero if `ob' is a reference object, but not a subclass of the
reference type.  This function always succeeds.
@end deffn

@geindex PyWeakref_CheckProxy (C function)
@anchor{c-api/weakref c PyWeakref_CheckProxy}@anchor{57e3}
@deffn {C Function} int PyWeakref_CheckProxy (PyObject *ob)

Return non-zero if `ob' is a proxy object.  This function always succeeds.
@end deffn

@geindex PyWeakref_NewRef (C function)
@anchor{c-api/weakref c PyWeakref_NewRef}@anchor{1c29}
@deffn {C Function} @ref{5df,,PyObject} *PyWeakref_NewRef (PyObject *ob, PyObject *callback)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Return a weak reference object for the object `ob'.  This will always return
a new reference, but is not guaranteed to create a new object; an existing
reference object may be returned.  The second parameter, `callback', can be a
callable object that receives notification when `ob' is garbage collected; it
should accept a single parameter, which will be the weak reference object
itself. `callback' may also be @code{None} or @code{NULL}.  If `ob' is not a
weakly referenceable object, this will raise @ref{199,,TypeError} and return
@code{NULL}.


@subsubheading See also


@ref{5644,,PyType_SUPPORTS_WEAKREFS()} for checking if `ob' is weakly
referenceable.

@end deffn

@geindex PyWeakref_NewProxy (C function)
@anchor{c-api/weakref c PyWeakref_NewProxy}@anchor{547d}
@deffn {C Function} @ref{5df,,PyObject} *PyWeakref_NewProxy (PyObject *ob, PyObject *callback)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Return a weak reference proxy object for the object `ob'.  This will always
return a new reference, but is not guaranteed to create a new object; an
existing proxy object may be returned.  The second parameter, `callback', can
be a callable object that receives notification when `ob' is garbage
collected; it should accept a single parameter, which will be the weak
reference object itself. `callback' may also be @code{None} or @code{NULL}.  If `ob'
weakly referenceable object, this will raise @ref{199,,TypeError} and return
@code{NULL}.


@subsubheading See also


@ref{5644,,PyType_SUPPORTS_WEAKREFS()} for checking if `ob' is weakly
referenceable.

@end deffn

@geindex PyWeakref_GetRef (C function)
@anchor{c-api/weakref c PyWeakref_GetRef}@anchor{3dd}
@deffn {C Function} int PyWeakref_GetRef (PyObject *ref, PyObject **pobj)
` Part of the @ref{776,,Stable ABI} since version 3.13.'
Get a @ref{5e2,,strong reference} to the referenced object from a weak
reference, `ref', into `*pobj'.


@itemize *

@item 
On success, set `*pobj' to a new @ref{5e2,,strong reference} to the
referenced object and return 1.

@item 
If the reference is dead, set `*pobj' to @code{NULL} and return 0.

@item 
On error, raise an exception and return -1.
@end itemize


Added in version 3.13.

@end deffn

@geindex PyWeakref_GetObject (C function)
@anchor{c-api/weakref c PyWeakref_GetObject}@anchor{3db}
@deffn {C Function} @ref{5df,,PyObject} *PyWeakref_GetObject (PyObject *ref)
`Return value: Borrowed reference.'` Part of the @ref{776,,Stable ABI}.'
Return a @ref{3d5,,borrowed reference} to the referenced object from a weak
reference, `ref'.  If the referent is no longer live, returns @code{Py_None}.

@cartouche
@quotation Note 
This function returns a @ref{3d5,,borrowed reference} to the referenced object.
This means that you should always call @ref{790,,Py_INCREF()} on the object
except when it cannot be destroyed before the last usage of the borrowed
reference.
@end quotation
@end cartouche


Deprecated since version 3.13, will be removed in version 3.15: Use @ref{3dd,,PyWeakref_GetRef()} instead.

@end deffn

@geindex PyWeakref_GET_OBJECT (C function)
@anchor{c-api/weakref c PyWeakref_GET_OBJECT}@anchor{3dc}
@deffn {C Function} @ref{5df,,PyObject} *PyWeakref_GET_OBJECT (PyObject *ref)
`Return value: Borrowed reference.'
Similar to @ref{3db,,PyWeakref_GetObject()}, but does no error checking.


Deprecated since version 3.13, will be removed in version 3.15: Use @ref{3dd,,PyWeakref_GetRef()} instead.

@end deffn

@geindex PyWeakref_IsDead (C function)
@anchor{c-api/weakref c PyWeakref_IsDead}@anchor{1925}
@deffn {C Function} int PyWeakref_IsDead (PyObject *ref)

Test if the weak reference `ref' is dead. Returns 1 if the reference is
dead, 0 if it is alive, and -1 with an error set if `ref' is not a weak
reference object.


Added in version 3.14.

@end deffn

@geindex PyObject_ClearWeakRefs (C function)
@anchor{c-api/weakref c PyObject_ClearWeakRefs}@anchor{797}
@deffn {C Function} void PyObject_ClearWeakRefs (PyObject *object)
` Part of the @ref{776,,Stable ABI}.'
This function is called by the @ref{521c,,tp_dealloc} handler
to clear weak references.

This iterates through the weak references for `object' and calls callbacks
for those references which have one. It returns when all callbacks have
been attempted.
@end deffn

@geindex PyUnstable_Object_ClearWeakRefsNoCallbacks (C function)
@anchor{c-api/weakref c PyUnstable_Object_ClearWeakRefsNoCallbacks}@anchor{19d8}
@deffn {C Function} void PyUnstable_Object_ClearWeakRefsNoCallbacks (PyObject *object)

@cartouche
@quotation This is Unstable API. It may change without warning in minor releases. `This is @ref{76a,,Unstable API}. It may change without warning in minor releases.'
@end quotation
@end cartouche

Clears the weakrefs for `object' without calling the callbacks.

This function is called by the @ref{521c,,tp_dealloc} handler
for types with finalizers (i.e., @ref{1203,,__del__()}).  The handler for
those objects first calls @ref{797,,PyObject_ClearWeakRefs()} to clear weakrefs
and call their callbacks, then the finalizer, and finally this function to
clear any weakrefs that may have been created by the finalizer.

In most circumstances, it’s more appropriate to use
@ref{797,,PyObject_ClearWeakRefs()} to clear weakrefs instead of this function.


Added in version 3.13.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Capsules<2>,Frame objects<2>,Weak Reference Objects<2>,Other Objects
@anchor{c-api/capsule doc}@anchor{57e4}@anchor{c-api/capsule capsules}@anchor{2a5c}@anchor{c-api/capsule id1}@anchor{57e5}@anchor{c-api/capsule translation-repo}@anchor{57e6}
@subsubsection Capsules


@geindex object; Capsule

Refer to @ref{1569,,Providing a C API for an Extension Module} for more information on using these objects.


Added in version 3.1.


@geindex PyCapsule (C type)
@anchor{c-api/capsule c PyCapsule}@anchor{147e}
@deffn {C Type} type PyCapsule

This subtype of @ref{5df,,PyObject} represents an opaque value, useful for C
extension modules which need to pass an opaque value (as a void*
pointer) through Python code to other C code.  It is often used to make a C
function pointer defined in one module available to other modules, so the
regular import mechanism can be used to access C APIs defined in dynamically
loaded modules.
@end deffn

@geindex PyCapsule_Type (C var)
@anchor{c-api/capsule c PyCapsule_Type}@anchor{52fc}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyCapsule_Type
` Part of the @ref{776,,Stable ABI}.'
The type object corresponding to capsule objects. This is the same object
as @ref{2a5b,,types.CapsuleType} in the Python layer.
@end deffn

@geindex PyCapsule_Destructor (C type)
@anchor{c-api/capsule c PyCapsule_Destructor}@anchor{52f3}
@deffn {C Type} type PyCapsule_Destructor
` Part of the @ref{776,,Stable ABI}.'
The type of a destructor callback for a capsule.  Defined as:

@example
typedef void (*PyCapsule_Destructor)(PyObject *);
@end example

See @ref{5223,,PyCapsule_New()} for the semantics of PyCapsule_Destructor
callbacks.
@end deffn

@geindex PyCapsule_CheckExact (C function)
@anchor{c-api/capsule c PyCapsule_CheckExact}@anchor{57e7}
@deffn {C Function} int PyCapsule_CheckExact (PyObject *p)
` Thread safety: @ref{2778,,Atomic}.'
Return true if its argument is a @ref{147e,,PyCapsule}.  This function always
succeeds.
@end deffn

@geindex PyCapsule_New (C function)
@anchor{c-api/capsule c PyCapsule_New}@anchor{5223}
@deffn {C Function} @ref{5df,,PyObject} *PyCapsule_New (void *pointer, const char *name, PyCapsule_Destructor destructor)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{2778,,Atomic}.'
Create a @ref{147e,,PyCapsule} encapsulating the `pointer'.  The `pointer'
argument may not be @code{NULL}.

On failure, set an exception and return @code{NULL}.

The `name' string may either be @code{NULL} or a pointer to a valid C string.  If
non-@code{NULL}, this string must outlive the capsule.  (Though it is permitted to
free it inside the `destructor'.)

If the `destructor' argument is not @code{NULL}, it will be called with the
capsule as its argument when it is destroyed.

If this capsule will be stored as an attribute of a module, the `name' should
be specified as @code{modulename.attributename}.  This will enable other modules
to import the capsule using @ref{1c53,,PyCapsule_Import()}.
@end deffn

@geindex PyCapsule_GetPointer (C function)
@anchor{c-api/capsule c PyCapsule_GetPointer}@anchor{52f7}
@deffn {C Function} void *PyCapsule_GetPointer (PyObject *capsule, const char *name)
` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{2771,,Safe to call without external synchronization on distinct objects}.'
Retrieve the `pointer' stored in the capsule.  On failure, set an exception
and return @code{NULL}.

The `name' parameter must compare exactly to the name stored in the capsule.
If the name stored in the capsule is @code{NULL}, the `name' passed in must also
be @code{NULL}.  Python uses the C function @code{strcmp()} to compare capsule
names.
@end deffn

@geindex PyCapsule_GetDestructor (C function)
@anchor{c-api/capsule c PyCapsule_GetDestructor}@anchor{52f5}
@deffn {C Function} @ref{52f3,,PyCapsule_Destructor} PyCapsule_GetDestructor (PyObject *capsule)
` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{2771,,Safe to call without external synchronization on distinct objects}.'
Return the current destructor stored in the capsule.  On failure, set an
exception and return @code{NULL}.

It is legal for a capsule to have a @code{NULL} destructor.  This makes a @code{NULL}
return code somewhat ambiguous; use @ref{1568,,PyCapsule_IsValid()} or
@ref{1cf0,,PyErr_Occurred()} to disambiguate.
@end deffn

@geindex PyCapsule_GetContext (C function)
@anchor{c-api/capsule c PyCapsule_GetContext}@anchor{52f4}
@deffn {C Function} void *PyCapsule_GetContext (PyObject *capsule)
` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{2771,,Safe to call without external synchronization on distinct objects}.'
Return the current context stored in the capsule.  On failure, set an
exception and return @code{NULL}.

It is legal for a capsule to have a @code{NULL} context.  This makes a @code{NULL}
return code somewhat ambiguous; use @ref{1568,,PyCapsule_IsValid()} or
@ref{1cf0,,PyErr_Occurred()} to disambiguate.
@end deffn

@geindex PyCapsule_GetName (C function)
@anchor{c-api/capsule c PyCapsule_GetName}@anchor{52f6}
@deffn {C Function} const char *PyCapsule_GetName (PyObject *capsule)
` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{2771,,Safe to call without external synchronization on distinct objects}.'
Return the current name stored in the capsule.  On failure, set an exception
and return @code{NULL}.

It is legal for a capsule to have a @code{NULL} name.  This makes a @code{NULL} return
code somewhat ambiguous; use @ref{1568,,PyCapsule_IsValid()} or
@ref{1cf0,,PyErr_Occurred()} to disambiguate.
@end deffn

@geindex PyCapsule_Import (C function)
@anchor{c-api/capsule c PyCapsule_Import}@anchor{1c53}
@deffn {C Function} void *PyCapsule_Import (const char *name, int no_block)
` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{276c,,Safe to call from multiple threads with external synchronization only}.'
Import a pointer to a C object from a capsule attribute in a module.  The
`name' parameter should specify the full name to the attribute, as in
@code{module.attribute}.  The `name' stored in the capsule must match this
string exactly.

This function splits `name' on the @code{.} character, and imports the first
element. It then processes further elements using attribute lookups.

Return the capsule’s internal `pointer' on success.  On failure, set an
exception and return @code{NULL}.

@cartouche
@quotation Note 
If `name' points to an attribute of some submodule or subpackage, this
submodule or subpackage must be previously imported using other means
(for example, by using @ref{3da,,PyImport_ImportModule()}) for the
attribute lookups to succeed.
@end quotation
@end cartouche


Changed in version 3.3: `no_block' has no effect anymore.

@end deffn

@geindex PyCapsule_IsValid (C function)
@anchor{c-api/capsule c PyCapsule_IsValid}@anchor{1568}
@deffn {C Function} int PyCapsule_IsValid (PyObject *capsule, const char *name)
` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{2771,,Safe to call without external synchronization on distinct objects}.'
Determines whether or not `capsule' is a valid capsule.  A valid capsule is
non-@code{NULL}, passes @ref{57e7,,PyCapsule_CheckExact()}, has a non-@code{NULL} pointer
stored in it, and its internal name matches the `name' parameter.  (See
@ref{52f7,,PyCapsule_GetPointer()} for information on how capsule names are
compared.)

In other words, if @ref{1568,,PyCapsule_IsValid()} returns a true value, calls to
any of the accessors (any function starting with @code{PyCapsule_Get}) are
guaranteed to succeed.

Return a nonzero value if the object is valid and matches the name passed in.
Return @code{0} otherwise.  This function will not fail.
@end deffn

@geindex PyCapsule_SetContext (C function)
@anchor{c-api/capsule c PyCapsule_SetContext}@anchor{52f8}
@deffn {C Function} int PyCapsule_SetContext (PyObject *capsule, void *context)
` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{2771,,Safe to call without external synchronization on distinct objects}.'
Set the context pointer inside `capsule' to `context'.

Return @code{0} on success.  Return nonzero and set an exception on failure.
@end deffn

@geindex PyCapsule_SetDestructor (C function)
@anchor{c-api/capsule c PyCapsule_SetDestructor}@anchor{52f9}
@deffn {C Function} int PyCapsule_SetDestructor (PyObject *capsule, PyCapsule_Destructor destructor)
` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{2771,,Safe to call without external synchronization on distinct objects}.'
Set the destructor inside `capsule' to `destructor'.

Return @code{0} on success.  Return nonzero and set an exception on failure.
@end deffn

@geindex PyCapsule_SetName (C function)
@anchor{c-api/capsule c PyCapsule_SetName}@anchor{52fa}
@deffn {C Function} int PyCapsule_SetName (PyObject *capsule, const char *name)
` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{2771,,Safe to call without external synchronization on distinct objects}.'
Set the name inside `capsule' to `name'.  If non-@code{NULL}, the name must
outlive the capsule.  If the previous `name' stored in the capsule was not
@code{NULL}, no attempt is made to free it.

Return @code{0} on success.  Return nonzero and set an exception on failure.
@end deffn

@geindex PyCapsule_SetPointer (C function)
@anchor{c-api/capsule c PyCapsule_SetPointer}@anchor{52fb}
@deffn {C Function} int PyCapsule_SetPointer (PyObject *capsule, void *pointer)
` Part of the @ref{776,,Stable ABI}.'` Thread safety: @ref{2771,,Safe to call without external synchronization on distinct objects}.'
Set the void pointer inside `capsule' to `pointer'.  The pointer may not be
@code{NULL}.

Return @code{0} on success.  Return nonzero and set an exception on failure.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Frame objects<2>,Generator Objects,Capsules<2>,Other Objects
@anchor{c-api/frame doc}@anchor{57e8}@anchor{c-api/frame frame-objects}@anchor{57e9}@anchor{c-api/frame translation-repo}@anchor{57ea}
@subsubsection Frame objects


@geindex PyFrameObject (C type)
@anchor{c-api/frame c PyFrameObject}@anchor{991}
@deffn {C Type} type PyFrameObject
` Part of the @ref{776,,Limited API} (as an opaque struct).'
The C structure of the objects used to describe frame objects.

There are no public members in this structure.


Changed in version 3.11: The members of this structure were removed from the public C API.
Refer to the @ref{990,,What’s New entry}
for details.

@end deffn

The @ref{1b7d,,PyEval_GetFrame()} and @ref{996,,PyThreadState_GetFrame()} functions
can be used to get a frame object.

See also @ref{55c2,,Reflection}.

@geindex PyFrame_Type (C var)
@anchor{c-api/frame c PyFrame_Type}@anchor{98f}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyFrame_Type

The type of frame objects.
It is the same object as @ref{1c31,,types.FrameType} in the Python layer.


Changed in version 3.11: Previously, this type was only available after including
@code{<frameobject.h>}.

@end deffn

@geindex PyFrame_New (C function)
@anchor{c-api/frame c PyFrame_New}@anchor{1b33}
@deffn {C Function} @ref{991,,PyFrameObject} *PyFrame_New (PyThreadState *tstate, PyCodeObject *code, PyObject *globals, PyObject *locals)

Create a new frame object. This function returns a @ref{5e2,,strong reference}
to the new frame object on success, and returns @code{NULL} with an exception
set on failure.
@end deffn

@geindex PyFrame_Check (C function)
@anchor{c-api/frame c PyFrame_Check}@anchor{98d}
@deffn {C Function} int PyFrame_Check (PyObject *obj)

Return non-zero if `obj' is a frame object.


Changed in version 3.11: Previously, this function was only available after including
@code{<frameobject.h>}.

@end deffn

@geindex PyFrame_GetBack (C function)
@anchor{c-api/frame c PyFrame_GetBack}@anchor{98e}
@deffn {C Function} @ref{991,,PyFrameObject} *PyFrame_GetBack (PyFrameObject *frame)
`Return value: New reference.'
Get the `frame' next outer frame.

Return a @ref{5e2,,strong reference}, or @code{NULL} if `frame' has no outer
frame.
This raises no exceptions.


Added in version 3.9.

@end deffn

@geindex PyFrame_GetBuiltins (C function)
@anchor{c-api/frame c PyFrame_GetBuiltins}@anchor{974}
@deffn {C Function} @ref{5df,,PyObject} *PyFrame_GetBuiltins (PyFrameObject *frame)
`Return value: New reference.'
Get the `frame'’s @ref{23e2,,f_builtins} attribute.

Return a @ref{5e2,,strong reference}. The result cannot be @code{NULL}.


Added in version 3.11.

@end deffn

@geindex PyFrame_GetCode (C function)
@anchor{c-api/frame c PyFrame_GetCode}@anchor{992}
@deffn {C Function} @ref{980,,PyCodeObject} *PyFrame_GetCode (PyFrameObject *frame)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI} since version 3.10.'
Get the `frame' code.

Return a @ref{5e2,,strong reference}.

The result (frame code) cannot be @code{NULL}.


Added in version 3.9.

@end deffn

@geindex PyFrame_GetGenerator (C function)
@anchor{c-api/frame c PyFrame_GetGenerator}@anchor{975}
@deffn {C Function} @ref{5df,,PyObject} *PyFrame_GetGenerator (PyFrameObject *frame)
`Return value: New reference.'
Get the generator, coroutine, or async generator that owns this frame,
or @code{NULL} if this frame is not owned by a generator.
Does not raise an exception, even if the return value is @code{NULL}.

Return a @ref{5e2,,strong reference}, or @code{NULL}.


Added in version 3.11.

@end deffn

@geindex PyFrame_GetGlobals (C function)
@anchor{c-api/frame c PyFrame_GetGlobals}@anchor{976}
@deffn {C Function} @ref{5df,,PyObject} *PyFrame_GetGlobals (PyFrameObject *frame)
`Return value: New reference.'
Get the `frame'’s @ref{23e1,,f_globals} attribute.

Return a @ref{5e2,,strong reference}. The result cannot be @code{NULL}.


Added in version 3.11.

@end deffn

@geindex PyFrame_GetLasti (C function)
@anchor{c-api/frame c PyFrame_GetLasti}@anchor{977}
@deffn {C Function} int PyFrame_GetLasti (PyFrameObject *frame)

Get the `frame'’s @ref{a8e,,f_lasti} attribute.

Returns -1 if @code{frame.f_lasti} is @code{None}.


Added in version 3.11.

@end deffn

@geindex PyFrame_GetVar (C function)
@anchor{c-api/frame c PyFrame_GetVar}@anchor{78a}
@deffn {C Function} @ref{5df,,PyObject} *PyFrame_GetVar (PyFrameObject *frame, PyObject *name)
`Return value: New reference.'
Get the variable `name' of `frame'.


@itemize *

@item 
Return a @ref{5e2,,strong reference} to the variable value on success.

@item 
Raise @ref{450,,NameError} and return @code{NULL} if the variable does not exist.

@item 
Raise an exception and return @code{NULL} on error.
@end itemize

`name' type must be a @ref{16a,,str}.


Added in version 3.12.

@end deffn

@geindex PyFrame_GetVarString (C function)
@anchor{c-api/frame c PyFrame_GetVarString}@anchor{78b}
@deffn {C Function} @ref{5df,,PyObject} *PyFrame_GetVarString (PyFrameObject *frame, const char *name)
`Return value: New reference.'
Similar to @ref{78a,,PyFrame_GetVar()}, but the variable name is a C string
encoded in UTF-8.


Added in version 3.12.

@end deffn

@geindex PyFrame_GetLocals (C function)
@anchor{c-api/frame c PyFrame_GetLocals}@anchor{661}
@deffn {C Function} @ref{5df,,PyObject} *PyFrame_GetLocals (PyFrameObject *frame)
`Return value: New reference.'
Get the `frame'’s @ref{4a6,,f_locals} attribute.
If the frame refers to an @ref{4a2,,optimized scope}, this returns a
write-through proxy object that allows modifying the locals.
In all other cases (classes, modules, @ref{4a3,,exec()}, @ref{4a4,,eval()}) it returns
the mapping representing the frame locals directly (as described for
@ref{46f,,locals()}).

Return a @ref{5e2,,strong reference}.


Added in version 3.11.



Changed in version 3.13: As part of 
@geindex Python Enhancement Proposals; PEP 667
PEP 667@footnote{https://peps.python.org/pep-0667/}, return an instance of @ref{57eb,,PyFrameLocalsProxy_Type}.

@end deffn

@geindex PyFrame_GetLineNumber (C function)
@anchor{c-api/frame c PyFrame_GetLineNumber}@anchor{993}
@deffn {C Function} int PyFrame_GetLineNumber (PyFrameObject *frame)
` Part of the @ref{776,,Stable ABI} since version 3.10.'
Return the line number that `frame' is currently executing.
@end deffn

@menu
* Frame locals proxies:: 
* Legacy local variable APIs:: 
* Internal frames:: 

@end menu

@node Frame locals proxies,Legacy local variable APIs,,Frame objects<2>
@anchor{c-api/frame frame-locals-proxies}@anchor{57ec}
@subsubsection Frame locals proxies



Added in version 3.13.


The @ref{4a6,,f_locals} attribute on a @ref{8f1,,frame object}
is an instance of a “frame-locals proxy”. The proxy object exposes a
write-through view of the underlying locals dictionary for the frame. This
ensures that the variables exposed by @code{f_locals} are always up to date with
the live local variables in the frame itself.

See 
@geindex Python Enhancement Proposals; PEP 667
PEP 667@footnote{https://peps.python.org/pep-0667/} for more information.

@geindex PyFrameLocalsProxy_Type (C var)
@anchor{c-api/frame c PyFrameLocalsProxy_Type}@anchor{57eb}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyFrameLocalsProxy_Type

The type of frame @ref{46f,,locals()} proxy objects.
@end deffn

@geindex PyFrameLocalsProxy_Check (C function)
@anchor{c-api/frame c PyFrameLocalsProxy_Check}@anchor{57ed}
@deffn {C Function} int PyFrameLocalsProxy_Check (PyObject *obj)

Return non-zero if `obj' is a frame @ref{46f,,locals()} proxy.
@end deffn

@node Legacy local variable APIs,Internal frames,Frame locals proxies,Frame objects<2>
@anchor{c-api/frame legacy-local-variable-apis}@anchor{57ee}
@subsubsection Legacy local variable APIs


These APIs are @ref{23f,,soft deprecated}. As of Python 3.13, they do nothing.
They exist solely for backwards compatibility.

@geindex PyFrame_LocalsToFast (C function)
@anchor{c-api/frame c PyFrame_LocalsToFast}@anchor{57ef}
@deffn {C Function} void PyFrame_LocalsToFast (PyFrameObject *f, int clear)

Prior to Python 3.13, this function would copy the @ref{4a6,,f_locals}
attribute of `f' to the internal “fast” array of local variables, allowing
changes in frame objects to be visible to the interpreter. If `clear' was
true, this function would process variables that were unset in the locals
dictionary.


@ref{23f,,Soft deprecated} since version 3.13: This function now does nothing.

@end deffn

@geindex PyFrame_FastToLocals (C function)
@anchor{c-api/frame c PyFrame_FastToLocals}@anchor{57f0}
@deffn {C Function} void PyFrame_FastToLocals (PyFrameObject *f)

Prior to Python 3.13, this function would copy the internal “fast” array
of local variables (which is used by the interpreter) to the
@ref{4a6,,f_locals} attribute of `f', allowing changes in local
variables to be visible to frame objects.


@ref{23f,,Soft deprecated} since version 3.13: This function now does nothing.

@end deffn

@geindex PyFrame_FastToLocalsWithError (C function)
@anchor{c-api/frame c PyFrame_FastToLocalsWithError}@anchor{57f1}
@deffn {C Function} int PyFrame_FastToLocalsWithError (PyFrameObject *f)

Prior to Python 3.13, this function was similar to
@ref{57f0,,PyFrame_FastToLocals()}, but would return @code{0} on success, and
@code{-1} with an exception set on failure.


@ref{23f,,Soft deprecated} since version 3.13: This function now does nothing.

@end deffn


@subsubheading See also


@geindex Python Enhancement Proposals; PEP 667
PEP 667@footnote{https://peps.python.org/pep-0667/}


@node Internal frames,,Legacy local variable APIs,Frame objects<2>
@anchor{c-api/frame internal-frames}@anchor{57f2}
@subsubsection Internal frames


Unless using 
@geindex Python Enhancement Proposals; PEP 523
PEP 523@footnote{https://peps.python.org/pep-0523/}, you will not need this.

@geindex _PyInterpreterFrame (C struct)
@anchor{c-api/frame c _PyInterpreterFrame}@anchor{19b2}
@deffn {C Struct} struct _PyInterpreterFrame

The interpreter’s internal frame representation.


Added in version 3.11.

@end deffn

@geindex PyUnstable_InterpreterFrame_GetCode (C function)
@anchor{c-api/frame c PyUnstable_InterpreterFrame_GetCode}@anchor{57f3}
@deffn {C Function} @ref{5df,,PyObject} *PyUnstable_InterpreterFrame_GetCode (struct _PyInterpreterFrame *frame);

@cartouche
@quotation This is Unstable API. It may change without warning in minor releases. `This is @ref{76a,,Unstable API}. It may change without warning in minor releases.'
@end quotation
@end cartouche

@quotation

Return a @ref{5e2,,strong reference} to the code object for the frame.
@end quotation


Added in version 3.12.

@end deffn

@geindex PyUnstable_InterpreterFrame_GetLasti (C function)
@anchor{c-api/frame c PyUnstable_InterpreterFrame_GetLasti}@anchor{57f4}
@deffn {C Function} int PyUnstable_InterpreterFrame_GetLasti (struct _PyInterpreterFrame *frame);

@cartouche
@quotation This is Unstable API. It may change without warning in minor releases. `This is @ref{76a,,Unstable API}. It may change without warning in minor releases.'
@end quotation
@end cartouche

Return the byte offset into the last executed instruction.


Added in version 3.12.

@end deffn

@geindex PyUnstable_InterpreterFrame_GetLine (C function)
@anchor{c-api/frame c PyUnstable_InterpreterFrame_GetLine}@anchor{57f5}
@deffn {C Function} int PyUnstable_InterpreterFrame_GetLine (struct _PyInterpreterFrame *frame);

@cartouche
@quotation This is Unstable API. It may change without warning in minor releases. `This is @ref{76a,,Unstable API}. It may change without warning in minor releases.'
@end quotation
@end cartouche

Return the currently executing line number, or -1 if there is no line number.


Added in version 3.12.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Generator Objects,Coroutine Objects<2>,Frame objects<2>,Other Objects
@anchor{c-api/gen doc}@anchor{57f6}@anchor{c-api/gen gen-objects}@anchor{57f7}@anchor{c-api/gen generator-objects}@anchor{57f8}@anchor{c-api/gen translation-repo}@anchor{57f9}
@subsubsection Generator Objects


Generator objects are what Python uses to implement generator iterators. They
are normally created by iterating over a function that yields values, rather
than explicitly calling @ref{57fa,,PyGen_New()} or @ref{57fb,,PyGen_NewWithQualName()}.

@geindex PyGenObject (C type)
@anchor{c-api/gen c PyGenObject}@anchor{57fc}
@deffn {C Type} type PyGenObject

The C structure used for generator objects.
@end deffn

@geindex PyGen_Type (C var)
@anchor{c-api/gen c PyGen_Type}@anchor{57fd}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyGen_Type

The type object corresponding to generator objects.
@end deffn

@geindex PyGen_Check (C function)
@anchor{c-api/gen c PyGen_Check}@anchor{57fe}
@deffn {C Function} int PyGen_Check (PyObject *ob)

Return true if `ob' is a generator object; `ob' must not be @code{NULL}.  This
function always succeeds.
@end deffn

@geindex PyGen_CheckExact (C function)
@anchor{c-api/gen c PyGen_CheckExact}@anchor{57ff}
@deffn {C Function} int PyGen_CheckExact (PyObject *ob)

Return true if `ob'’s type is @ref{57fd,,PyGen_Type}; `ob' must not be
@code{NULL}.  This function always succeeds.
@end deffn

@geindex PyGen_New (C function)
@anchor{c-api/gen c PyGen_New}@anchor{57fa}
@deffn {C Function} @ref{5df,,PyObject} *PyGen_New (PyFrameObject *frame)
`Return value: New reference.'
Create and return a new generator object based on the `frame' object.
A reference to `frame' is stolen by this function. The argument must not be
@code{NULL}.
@end deffn

@geindex PyGen_NewWithQualName (C function)
@anchor{c-api/gen c PyGen_NewWithQualName}@anchor{57fb}
@deffn {C Function} @ref{5df,,PyObject} *PyGen_NewWithQualName (PyFrameObject *frame, PyObject *name, PyObject *qualname)
`Return value: New reference.'
Create and return a new generator object based on the `frame' object,
with @code{__name__} and @code{__qualname__} set to `name' and `qualname'.
A reference to `frame' is stolen by this function.  The `frame' argument
must not be @code{NULL}.
@end deffn

@geindex PyGen_GetCode (C function)
@anchor{c-api/gen c PyGen_GetCode}@anchor{5800}
@deffn {C Function} @ref{980,,PyCodeObject} *PyGen_GetCode (PyGenObject *gen)

Return a new @ref{5e2,,strong reference} to the code object wrapped by `gen'.
This function always succeeds.
@end deffn

@menu
* Asynchronous Generator Objects:: 
* Deprecated API: Deprecated API<4>. 

@end menu

@node Asynchronous Generator Objects,Deprecated API<4>,,Generator Objects
@anchor{c-api/gen asynchronous-generator-objects}@anchor{5801}
@subsubsection Asynchronous Generator Objects



@subsubheading See also


@geindex Python Enhancement Proposals; PEP 525
PEP 525@footnote{https://peps.python.org/pep-0525/}


@geindex PyAsyncGen_Type (C var)
@anchor{c-api/gen c PyAsyncGen_Type}@anchor{5802}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyAsyncGen_Type

The type object corresponding to asynchronous generator objects. This is
available as @ref{2a50,,types.AsyncGeneratorType} in the Python layer.


Added in version 3.6.

@end deffn

@geindex PyAsyncGen_New (C function)
@anchor{c-api/gen c PyAsyncGen_New}@anchor{5803}
@deffn {C Function} @ref{5df,,PyObject} *PyAsyncGen_New (PyFrameObject *frame, PyObject *name, PyObject *qualname)

Create a new asynchronous generator wrapping `frame', with @code{__name__} and
@code{__qualname__} set to `name' and `qualname'. `frame' is stolen by this
function and must not be @code{NULL}.

On success, this function returns a @ref{5e2,,strong reference} to the
new asynchronous generator. On failure, this function returns @code{NULL}
with an exception set.


Added in version 3.6.

@end deffn

@geindex PyAsyncGen_CheckExact (C function)
@anchor{c-api/gen c PyAsyncGen_CheckExact}@anchor{5804}
@deffn {C Function} int PyAsyncGen_CheckExact (PyObject *op)

Return true if `op' is an asynchronous generator object, false otherwise.
This function always succeeds.


Added in version 3.6.

@end deffn

@node Deprecated API<4>,,Asynchronous Generator Objects,Generator Objects
@anchor{c-api/gen deprecated-api}@anchor{5805}
@subsubsection Deprecated API


@geindex PyAsyncGenASend_CheckExact (C macro)
@anchor{c-api/gen c PyAsyncGenASend_CheckExact}@anchor{5806}
@deffn {C Macro} PyAsyncGenASend_CheckExact (op)

This is a @ref{23f,,soft deprecated} API that was included in Python’s C API
by mistake.

It is solely here for completeness; do not use this API.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Coroutine Objects<2>,Context Variables Objects,Generator Objects,Other Objects
@anchor{c-api/coro doc}@anchor{5807}@anchor{c-api/coro coro-objects}@anchor{10d6}@anchor{c-api/coro coroutine-objects}@anchor{5808}@anchor{c-api/coro translation-repo}@anchor{5809}
@subsubsection Coroutine Objects



Added in version 3.5.


Coroutine objects are what functions declared with an @code{async} keyword
return.

@geindex PyCoroObject (C type)
@anchor{c-api/coro c PyCoroObject}@anchor{580a}
@deffn {C Type} type PyCoroObject

The C structure used for coroutine objects.
@end deffn

@geindex PyCoro_Type (C var)
@anchor{c-api/coro c PyCoro_Type}@anchor{580b}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyCoro_Type

The type object corresponding to coroutine objects.
@end deffn

@geindex PyCoro_CheckExact (C function)
@anchor{c-api/coro c PyCoro_CheckExact}@anchor{580c}
@deffn {C Function} int PyCoro_CheckExact (PyObject *ob)

Return true if `ob'’s type is @ref{580b,,PyCoro_Type}; `ob' must not be @code{NULL}.
This function always succeeds.
@end deffn

@geindex PyCoro_New (C function)
@anchor{c-api/coro c PyCoro_New}@anchor{580d}
@deffn {C Function} @ref{5df,,PyObject} *PyCoro_New (PyFrameObject *frame, PyObject *name, PyObject *qualname)
`Return value: New reference.'
Create and return a new coroutine object based on the `frame' object,
with @code{__name__} and @code{__qualname__} set to `name' and `qualname'.
A reference to `frame' is stolen by this function.  The `frame' argument
must not be @code{NULL}.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Context Variables Objects,Objects for Type Hinting,Coroutine Objects<2>,Other Objects
@anchor{c-api/contextvars doc}@anchor{580e}@anchor{c-api/contextvars context-variables-objects}@anchor{580f}@anchor{c-api/contextvars contextvarsobjects}@anchor{cf6}@anchor{c-api/contextvars translation-repo}@anchor{5810}
@subsubsection Context Variables Objects

@anchor{c-api/contextvars contextvarsobjects-pointertype-change}@anchor{e25}

Added in version 3.7.



Changed in version 3.7.1: 

@cartouche
@quotation Note 
In Python 3.7.1 the signatures of all context variables
C APIs were `changed' to use @ref{5df,,PyObject} pointers instead
of @ref{5811,,PyContext}, @ref{5812,,PyContextVar}, and
@ref{5813,,PyContextToken}, e.g.:

@example
// in 3.7.0:
PyContext *PyContext_New(void);

// in 3.7.1+:
PyObject *PyContext_New(void);
@end example

See bpo-34762@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34762} for more details.
@end quotation
@end cartouche


This section details the public C API for the @ref{28,,contextvars} module.

@geindex PyContext (C type)
@anchor{c-api/contextvars c PyContext}@anchor{5811}
@deffn {C Type} type PyContext

The C structure used to represent a @ref{178,,contextvars.Context}
object.
@end deffn

@geindex PyContextVar (C type)
@anchor{c-api/contextvars c PyContextVar}@anchor{5812}
@deffn {C Type} type PyContextVar

The C structure used to represent a @ref{18be,,contextvars.ContextVar}
object.
@end deffn

@geindex PyContextToken (C type)
@anchor{c-api/contextvars c PyContextToken}@anchor{5813}
@deffn {C Type} type PyContextToken

The C structure used to represent a @ref{1e4,,contextvars.Token} object.
@end deffn

@geindex PyContext_Type (C var)
@anchor{c-api/contextvars c PyContext_Type}@anchor{5814}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyContext_Type

The type object representing the `context' type.
@end deffn

@geindex PyContextVar_Type (C var)
@anchor{c-api/contextvars c PyContextVar_Type}@anchor{5815}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyContextVar_Type

The type object representing the `context variable' type.
@end deffn

@geindex PyContextToken_Type (C var)
@anchor{c-api/contextvars c PyContextToken_Type}@anchor{5816}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyContextToken_Type

The type object representing the `context variable token' type.
@end deffn

Type-check macros:

@geindex PyContext_CheckExact (C function)
@anchor{c-api/contextvars c PyContext_CheckExact}@anchor{5817}
@deffn {C Function} int PyContext_CheckExact (PyObject *o)

Return true if `o' is of type @ref{5814,,PyContext_Type}. `o' must not be
@code{NULL}.  This function always succeeds.
@end deffn

@geindex PyContextVar_CheckExact (C function)
@anchor{c-api/contextvars c PyContextVar_CheckExact}@anchor{5818}
@deffn {C Function} int PyContextVar_CheckExact (PyObject *o)

Return true if `o' is of type @ref{5815,,PyContextVar_Type}. `o' must not be
@code{NULL}.  This function always succeeds.
@end deffn

@geindex PyContextToken_CheckExact (C function)
@anchor{c-api/contextvars c PyContextToken_CheckExact}@anchor{5819}
@deffn {C Function} int PyContextToken_CheckExact (PyObject *o)

Return true if `o' is of type @ref{5816,,PyContextToken_Type}.
`o' must not be @code{NULL}.  This function always succeeds.
@end deffn

Context object management functions:

@geindex PyContext_New (C function)
@anchor{c-api/contextvars c PyContext_New}@anchor{581a}
@deffn {C Function} @ref{5df,,PyObject} *PyContext_New (void)
`Return value: New reference.'
Create a new empty context object.  Returns @code{NULL} if an error
has occurred.
@end deffn

@geindex PyContext_Copy (C function)
@anchor{c-api/contextvars c PyContext_Copy}@anchor{581b}
@deffn {C Function} @ref{5df,,PyObject} *PyContext_Copy (PyObject *ctx)
`Return value: New reference.'
Create a shallow copy of the passed `ctx' context object.
Returns @code{NULL} if an error has occurred.
@end deffn

@geindex PyContext_CopyCurrent (C function)
@anchor{c-api/contextvars c PyContext_CopyCurrent}@anchor{581c}
@deffn {C Function} @ref{5df,,PyObject} *PyContext_CopyCurrent (void)
`Return value: New reference.'
Create a shallow copy of the current thread context.
Returns @code{NULL} if an error has occurred.
@end deffn

@geindex PyContext_Enter (C function)
@anchor{c-api/contextvars c PyContext_Enter}@anchor{581d}
@deffn {C Function} int PyContext_Enter (PyObject *ctx)

Set `ctx' as the current context for the current thread.
Returns @code{0} on success, and @code{-1} on error.
@end deffn

@geindex PyContext_Exit (C function)
@anchor{c-api/contextvars c PyContext_Exit}@anchor{581e}
@deffn {C Function} int PyContext_Exit (PyObject *ctx)

Deactivate the `ctx' context and restore the previous context as the
current context for the current thread.  Returns @code{0} on success,
and @code{-1} on error.
@end deffn

@geindex PyContext_AddWatcher (C function)
@anchor{c-api/contextvars c PyContext_AddWatcher}@anchor{19d5}
@deffn {C Function} int PyContext_AddWatcher (PyContext_WatchCallback callback)

Register `callback' as a context object watcher for the current interpreter.
Return an ID which may be passed to @ref{19d6,,PyContext_ClearWatcher()}.
In case of error (e.g. no more watcher IDs available),
return @code{-1} and set an exception.


Added in version 3.14.

@end deffn

@geindex PyContext_ClearWatcher (C function)
@anchor{c-api/contextvars c PyContext_ClearWatcher}@anchor{19d6}
@deffn {C Function} int PyContext_ClearWatcher (int watcher_id)

Clear watcher identified by `watcher_id' previously returned from
@ref{19d5,,PyContext_AddWatcher()} for the current interpreter.
Return @code{0} on success, or @code{-1} and set an exception on error
(e.g. if the given `watcher_id' was never registered.)


Added in version 3.14.

@end deffn

@geindex PyContextEvent (C type)
@anchor{c-api/contextvars c PyContextEvent}@anchor{581f}
@deffn {C Type} type PyContextEvent

Enumeration of possible context object watcher events:


@itemize -

@item 
@code{Py_CONTEXT_SWITCHED}: The @ref{19a8,,current context} has switched to a
different context.  The object passed to the watch callback is the
now-current @ref{178,,contextvars.Context} object, or None if no context is
current.
@end itemize


Added in version 3.14.

@end deffn

@geindex PyContext_WatchCallback (C type)
@anchor{c-api/contextvars c PyContext_WatchCallback}@anchor{5820}
@deffn {C Type} typedef int (*PyContext_WatchCallback)(@ref{581f,,PyContextEvent} event, @ref{5df,,PyObject} *obj)

Context object watcher callback function.  The object passed to the callback
is event-specific; see @ref{581f,,PyContextEvent} for details.

If the callback returns with an exception set, it must return @code{-1}; this
exception will be printed as an unraisable exception using
@ref{5f1,,PyErr_FormatUnraisable()}. Otherwise it should return @code{0}.

There may already be a pending exception set on entry to the callback. In
this case, the callback should return @code{0} with the same exception still
set. This means the callback may not call any other API that can set an
exception unless it saves and clears the exception state first, and restores
it before returning.


Added in version 3.14.

@end deffn

Context variable functions:

@geindex PyContextVar_New (C function)
@anchor{c-api/contextvars c PyContextVar_New}@anchor{5821}
@deffn {C Function} @ref{5df,,PyObject} *PyContextVar_New (const char *name, PyObject *def)
`Return value: New reference.'
Create a new @code{ContextVar} object.  The `name' parameter is used
for introspection and debug purposes.  The `def' parameter specifies
a default value for the context variable, or @code{NULL} for no default.
If an error has occurred, this function returns @code{NULL}.
@end deffn

@geindex PyContextVar_Get (C function)
@anchor{c-api/contextvars c PyContextVar_Get}@anchor{5822}
@deffn {C Function} int PyContextVar_Get (PyObject *var, PyObject *default_value, PyObject **value)

Get the value of a context variable.  Returns @code{-1} if an error has
occurred during lookup, and @code{0} if no error occurred, whether or not
a value was found.

If the context variable was found, `value' will be a pointer to it.
If the context variable was `not' found, `value' will point to:


@itemize -

@item 
`default_value', if not @code{NULL};

@item 
the default value of `var', if not @code{NULL};

@item 
@code{NULL}
@end itemize

Except for @code{NULL}, the function returns a new reference.
@end deffn

@geindex PyContextVar_Set (C function)
@anchor{c-api/contextvars c PyContextVar_Set}@anchor{5823}
@deffn {C Function} @ref{5df,,PyObject} *PyContextVar_Set (PyObject *var, PyObject *value)
`Return value: New reference.'
Set the value of `var' to `value' in the current context.  Returns
a new token object for this change, or @code{NULL} if an error has occurred.
@end deffn

@geindex PyContextVar_Reset (C function)
@anchor{c-api/contextvars c PyContextVar_Reset}@anchor{5824}
@deffn {C Function} int PyContextVar_Reset (PyObject *var, PyObject *token)

Reset the state of the `var' context variable to that it was in before
@ref{5823,,PyContextVar_Set()} that returned the `token' was called.
This function returns @code{0} on success and @code{-1} on error.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Objects for Type Hinting,,Context Variables Objects,Other Objects
@anchor{c-api/typehints doc}@anchor{5825}@anchor{c-api/typehints objects-for-type-hinting}@anchor{5826}@anchor{c-api/typehints translation-repo}@anchor{5827}@anchor{c-api/typehints typehintobjects}@anchor{5828}
@subsubsection Objects for Type Hinting


Various built-in types for type hinting are provided.  Currently,
two types exist – @ref{8c3,,GenericAlias} and
@ref{9cb,,Union}.  Only @code{GenericAlias} is exposed to C.

@geindex Py_GenericAlias (C function)
@anchor{c-api/typehints c Py_GenericAlias}@anchor{548b}
@deffn {C Function} @ref{5df,,PyObject} *Py_GenericAlias (PyObject *origin, PyObject *args)
` Part of the @ref{776,,Stable ABI} since version 3.9.'
Create a @ref{8c3,,GenericAlias} object.
Equivalent to calling the Python class
@ref{9f2,,types.GenericAlias}.  The `origin' and `args' arguments set the
@code{GenericAlias}‘s @code{__origin__} and @code{__args__} attributes respectively.
`origin' should be a @ref{ca2,,PyTypeObject}*, and `args' can be a
@ref{5584,,PyTupleObject}* or any @code{PyObject*}.  If `args' passed is
not a tuple, a 1-tuple is automatically constructed and @code{__args__} is set
to @code{(args,)}.
Minimal checking is done for the arguments, so the function will succeed even
if `origin' is not a type.
The @code{GenericAlias}‘s @code{__parameters__} attribute is constructed lazily
from @code{__args__}.  On failure, an exception is raised and @code{NULL} is
returned.

Here’s an example of how to make an extension type generic:

@example
...
static PyMethodDef my_obj_methods[] = @{
    // Other methods.
    ...
    @{"__class_getitem__", Py_GenericAlias, METH_O|METH_CLASS, "my_obj is generic over its contained type"@}
    ...
@}
@end example


@subsubheading See also


The data model method @ref{948,,__class_getitem__()}.



Added in version 3.9.

@end deffn

@geindex Py_GenericAliasType (C var)
@anchor{c-api/typehints c Py_GenericAliasType}@anchor{548c}
@deffn {C Variable} @ref{ca2,,PyTypeObject} Py_GenericAliasType
` Part of the @ref{776,,Stable ABI} since version 3.9.'
The C type of the object returned by @ref{548b,,Py_GenericAlias()}. Equivalent to
@ref{9f2,,types.GenericAlias} in Python.


Added in version 3.9.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node C API for extension modules,,Other Objects,Concrete Objects Layer
@anchor{c-api/concrete c-api-for-extension-modules}@anchor{5829}
@subsection C API for extension modules


@menu
* Curses C API:: 
* Internal data:: 
* DateTime Objects: DateTime Objects<2>. 
* Internal data: Internal data<2>. 

@end menu

@node Curses C API,Internal data,,C API for extension modules
@anchor{c-api/curses doc}@anchor{582a}@anchor{c-api/curses curses-c-api}@anchor{582b}
@subsubsection Curses C API


@ref{2f,,curses} exposes a small C interface for extension modules.
Consumers must include the header file @code{py_curses.h} (which is not
included by default by @code{Python.h}) and @ref{582c,,import_curses()} must
be invoked, usually as part of the module initialisation function, to populate
@ref{582d,,PyCurses_API}.

@cartouche
@quotation Warning 
Neither the C API nor the pure Python @ref{2f,,curses} module are compatible
with subinterpreters.
@end quotation
@end cartouche

@geindex import_curses (C macro)
@anchor{c-api/curses c import_curses}@anchor{582c}
@deffn {C Macro} import_curses ()

Import the curses C API. The macro does not need a semi-colon to be called.

On success, populate the @ref{582d,,PyCurses_API} pointer.

On failure, set @ref{582d,,PyCurses_API} to NULL and set an exception.
The caller must check if an error occurred via @ref{1cf0,,PyErr_Occurred()}:

@example
import_curses();  // semi-colon is optional but recommended
if (PyErr_Occurred()) @{ /* cleanup */ @}
@end example
@end deffn

@geindex PyCurses_API (C var)
@anchor{c-api/curses c PyCurses_API}@anchor{582d}
@deffn {C Variable} void **PyCurses_API

Dynamically allocated object containing the curses C API.
This variable is only available once @ref{582c,,import_curses} succeeds.

@code{PyCurses_API[0]} corresponds to @ref{582e,,PyCursesWindow_Type}.

@code{PyCurses_API[1]}, @code{PyCurses_API[2]}, and @code{PyCurses_API[3]}
are pointers to predicate functions of type @code{int (*)(void)}.

When called, these predicates return whether @ref{351d,,curses.setupterm()},
@ref{1953,,curses.initscr()}, and @ref{3522,,curses.start_color()} have been called
respectively.

See also the convenience macros @ref{582f,,PyCursesSetupTermCalled},
@ref{5830,,PyCursesInitialised}, and @ref{5831,,PyCursesInitialisedColor}.

@cartouche
@quotation Note 
The number of entries in this structure is subject to changes.
Consider using @ref{5832,,PyCurses_API_pointers} to check if
new fields are available or not.
@end quotation
@end cartouche
@end deffn

@geindex PyCurses_API_pointers (C macro)
@anchor{c-api/curses c PyCurses_API_pointers}@anchor{5832}
@deffn {C Macro} PyCurses_API_pointers

The number of accessible fields (@code{4}) in @ref{582d,,PyCurses_API}.
This number is incremented whenever new fields are added.
@end deffn

@geindex PyCursesWindow_Type (C var)
@anchor{c-api/curses c PyCursesWindow_Type}@anchor{582e}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyCursesWindow_Type

The @ref{b64,,heap type} corresponding to @ref{12a1,,curses.window}.
@end deffn

@geindex PyCursesWindow_Check (C function)
@anchor{c-api/curses c PyCursesWindow_Check}@anchor{5833}
@deffn {C Function} int PyCursesWindow_Check (PyObject *op)

Return true if `op' is a @ref{12a1,,curses.window} instance, false otherwise.
@end deffn

The following macros are convenience macros expanding into C statements.
In particular, they can only be used as @code{macro;} or @code{macro}, but not
@code{macro()} or @code{macro();}.

@geindex PyCursesSetupTermCalled (C macro)
@anchor{c-api/curses c PyCursesSetupTermCalled}@anchor{582f}
@deffn {C Macro} PyCursesSetupTermCalled

Macro checking if @ref{351d,,curses.setupterm()} has been called.

The macro expansion is roughly equivalent to:

@example
@{
    typedef int (*predicate_t)(void);
    predicate_t was_setupterm_called = (predicate_t)PyCurses_API[1];
    if (!was_setupterm_called()) @{
        return NULL;
    @}
@}
@end example
@end deffn

@geindex PyCursesInitialised (C macro)
@anchor{c-api/curses c PyCursesInitialised}@anchor{5830}
@deffn {C Macro} PyCursesInitialised

Macro checking if @ref{1953,,curses.initscr()} has been called.

The macro expansion is roughly equivalent to:

@example
@{
    typedef int (*predicate_t)(void);
    predicate_t was_initscr_called = (predicate_t)PyCurses_API[2];
    if (!was_initscr_called()) @{
        return NULL;
    @}
@}
@end example
@end deffn

@geindex PyCursesInitialisedColor (C macro)
@anchor{c-api/curses c PyCursesInitialisedColor}@anchor{5831}
@deffn {C Macro} PyCursesInitialisedColor

Macro checking if @ref{3522,,curses.start_color()} has been called.

The macro expansion is roughly equivalent to:

@example
@{
    typedef int (*predicate_t)(void);
    predicate_t was_start_color_called = (predicate_t)PyCurses_API[3];
    if (!was_start_color_called()) @{
        return NULL;
    @}
@}
@end example
@end deffn

@node Internal data,DateTime Objects<2>,Curses C API,C API for extension modules
@anchor{c-api/curses internal-data}@anchor{5834}
@subsubsection Internal data


The following objects are exposed by the C API but should be considered
internal-only.

@geindex PyCurses_CAPSULE_NAME (C macro)
@anchor{c-api/curses c PyCurses_CAPSULE_NAME}@anchor{5835}
@deffn {C Macro} PyCurses_CAPSULE_NAME

Name of the curses capsule to pass to @ref{1c53,,PyCapsule_Import()}.

Internal usage only. Use @ref{582c,,import_curses} instead.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node DateTime Objects<2>,Internal data<2>,Internal data,C API for extension modules
@anchor{c-api/datetime doc}@anchor{5836}@anchor{c-api/datetime datetime-objects}@anchor{5837}@anchor{c-api/datetime datetimeobjects}@anchor{55cd}@anchor{c-api/datetime translation-repo}@anchor{5838}
@subsubsection DateTime Objects


Various date and time objects are supplied by the @ref{34,,datetime} module.
Before using any of these functions, the header file @code{datetime.h} must be
included in your source (note that this is not included by @code{Python.h}),
and the macro @ref{5839,,PyDateTime_IMPORT} must be invoked, usually as part of
the module initialisation function.  The macro puts a pointer to a C structure
into a static variable, @ref{583a,,PyDateTimeAPI}, that is used by the following
macros.

@geindex PyDateTime_IMPORT (C macro)
@anchor{c-api/datetime c PyDateTime_IMPORT}@anchor{5839}
@deffn {C Macro} PyDateTime_IMPORT ()

Import the datetime C API.

On success, populate the @ref{583a,,PyDateTimeAPI} pointer.
On failure, set @code{PyDateTimeAPI} to @code{NULL} and set an exception.
The caller must check if an error occurred via @ref{1cf0,,PyErr_Occurred()}:

@example
PyDateTime_IMPORT;
if (PyErr_Occurred()) @{ /* cleanup */ @}
@end example

@cartouche
@quotation Warning 
This is not compatible with subinterpreters.
@end quotation
@end cartouche
@end deffn

@geindex PyDateTime_CAPI (C type)
@anchor{c-api/datetime c PyDateTime_CAPI}@anchor{583b}
@deffn {C Type} type PyDateTime_CAPI

Structure containing the fields for the datetime C API.

The fields of this structure are private and subject to change.

Do not use this directly; prefer @code{PyDateTime_*} APIs instead.
@end deffn

@geindex PyDateTimeAPI (C var)
@anchor{c-api/datetime c PyDateTimeAPI}@anchor{583a}
@deffn {C Variable} @ref{583b,,PyDateTime_CAPI} *PyDateTimeAPI

Dynamically allocated object containing the datetime C API.

This variable is only available once @ref{5839,,PyDateTime_IMPORT} succeeds.
@end deffn

@geindex PyDateTime_Date (C type)
@anchor{c-api/datetime c PyDateTime_Date}@anchor{583c}
@deffn {C Type} type PyDateTime_Date

This subtype of @ref{5df,,PyObject} represents a Python date object.
@end deffn

@geindex PyDateTime_DateTime (C type)
@anchor{c-api/datetime c PyDateTime_DateTime}@anchor{583d}
@deffn {C Type} type PyDateTime_DateTime

This subtype of @ref{5df,,PyObject} represents a Python datetime object.
@end deffn

@geindex PyDateTime_Time (C type)
@anchor{c-api/datetime c PyDateTime_Time}@anchor{583e}
@deffn {C Type} type PyDateTime_Time

This subtype of @ref{5df,,PyObject} represents a Python time object.
@end deffn

@geindex PyDateTime_Delta (C type)
@anchor{c-api/datetime c PyDateTime_Delta}@anchor{583f}
@deffn {C Type} type PyDateTime_Delta

This subtype of @ref{5df,,PyObject} represents the difference between two datetime values.
@end deffn

@geindex PyDateTime_DateType (C var)
@anchor{c-api/datetime c PyDateTime_DateType}@anchor{5840}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyDateTime_DateType

This instance of @ref{ca2,,PyTypeObject} represents the Python date type;
it is the same object as @ref{1fc,,datetime.date} in the Python layer.
@end deffn

@geindex PyDateTime_DateTimeType (C var)
@anchor{c-api/datetime c PyDateTime_DateTimeType}@anchor{5841}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyDateTime_DateTimeType

This instance of @ref{ca2,,PyTypeObject} represents the Python datetime type;
it is the same object as @ref{4e3,,datetime.datetime} in the Python layer.
@end deffn

@geindex PyDateTime_TimeType (C var)
@anchor{c-api/datetime c PyDateTime_TimeType}@anchor{5842}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyDateTime_TimeType

This instance of @ref{ca2,,PyTypeObject} represents the Python time type;
it is the same object as @ref{1fd,,datetime.time} in the Python layer.
@end deffn

@geindex PyDateTime_DeltaType (C var)
@anchor{c-api/datetime c PyDateTime_DeltaType}@anchor{5843}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyDateTime_DeltaType

This instance of @ref{ca2,,PyTypeObject} represents the Python type for
the difference between two datetime values;
it is the same object as @ref{bc9,,datetime.timedelta} in the Python layer.
@end deffn

@geindex PyDateTime_TZInfoType (C var)
@anchor{c-api/datetime c PyDateTime_TZInfoType}@anchor{5844}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyDateTime_TZInfoType

This instance of @ref{ca2,,PyTypeObject} represents the Python time zone info type;
it is the same object as @ref{7f7,,datetime.tzinfo} in the Python layer.
@end deffn

Macro for access to the UTC singleton:

@geindex PyDateTime_TimeZone_UTC (C var)
@anchor{c-api/datetime c PyDateTime_TimeZone_UTC}@anchor{dc2}
@deffn {C Variable} @ref{5df,,PyObject} *PyDateTime_TimeZone_UTC

Returns the time zone singleton representing UTC, the same object as
@ref{828,,datetime.timezone.utc}.


Added in version 3.7.

@end deffn

Type-check macros:

@geindex PyDate_Check (C function)
@anchor{c-api/datetime c PyDate_Check}@anchor{5845}
@deffn {C Function} int PyDate_Check (PyObject *ob)

Return true if `ob' is of type @ref{5840,,PyDateTime_DateType} or a subtype of
@code{PyDateTime_DateType}.  `ob' must not be @code{NULL}.  This function always
succeeds.
@end deffn

@geindex PyDate_CheckExact (C function)
@anchor{c-api/datetime c PyDate_CheckExact}@anchor{5846}
@deffn {C Function} int PyDate_CheckExact (PyObject *ob)

Return true if `ob' is of type @ref{5840,,PyDateTime_DateType}. `ob' must not be
@code{NULL}.  This function always succeeds.
@end deffn

@geindex PyDateTime_Check (C function)
@anchor{c-api/datetime c PyDateTime_Check}@anchor{5847}
@deffn {C Function} int PyDateTime_Check (PyObject *ob)

Return true if `ob' is of type @ref{5841,,PyDateTime_DateTimeType} or a subtype of
@code{PyDateTime_DateTimeType}.  `ob' must not be @code{NULL}.  This function always
succeeds.
@end deffn

@geindex PyDateTime_CheckExact (C function)
@anchor{c-api/datetime c PyDateTime_CheckExact}@anchor{5848}
@deffn {C Function} int PyDateTime_CheckExact (PyObject *ob)

Return true if `ob' is of type @ref{5841,,PyDateTime_DateTimeType}. `ob' must not
be @code{NULL}.  This function always succeeds.
@end deffn

@geindex PyTime_Check (C function)
@anchor{c-api/datetime c PyTime_Check}@anchor{5849}
@deffn {C Function} int PyTime_Check (PyObject *ob)

Return true if `ob' is of type @ref{5842,,PyDateTime_TimeType} or a subtype of
@code{PyDateTime_TimeType}.  `ob' must not be @code{NULL}.  This function always
succeeds.
@end deffn

@geindex PyTime_CheckExact (C function)
@anchor{c-api/datetime c PyTime_CheckExact}@anchor{584a}
@deffn {C Function} int PyTime_CheckExact (PyObject *ob)

Return true if `ob' is of type @ref{5842,,PyDateTime_TimeType}. `ob' must not be
@code{NULL}.  This function always succeeds.
@end deffn

@geindex PyDelta_Check (C function)
@anchor{c-api/datetime c PyDelta_Check}@anchor{584b}
@deffn {C Function} int PyDelta_Check (PyObject *ob)

Return true if `ob' is of type @ref{5843,,PyDateTime_DeltaType} or a subtype of
@code{PyDateTime_DeltaType}.  `ob' must not be @code{NULL}.  This function always
succeeds.
@end deffn

@geindex PyDelta_CheckExact (C function)
@anchor{c-api/datetime c PyDelta_CheckExact}@anchor{584c}
@deffn {C Function} int PyDelta_CheckExact (PyObject *ob)

Return true if `ob' is of type @ref{5843,,PyDateTime_DeltaType}. `ob' must not be
@code{NULL}.  This function always succeeds.
@end deffn

@geindex PyTZInfo_Check (C function)
@anchor{c-api/datetime c PyTZInfo_Check}@anchor{584d}
@deffn {C Function} int PyTZInfo_Check (PyObject *ob)

Return true if `ob' is of type @ref{5844,,PyDateTime_TZInfoType} or a subtype of
@code{PyDateTime_TZInfoType}.  `ob' must not be @code{NULL}.  This function always
succeeds.
@end deffn

@geindex PyTZInfo_CheckExact (C function)
@anchor{c-api/datetime c PyTZInfo_CheckExact}@anchor{584e}
@deffn {C Function} int PyTZInfo_CheckExact (PyObject *ob)

Return true if `ob' is of type @ref{5844,,PyDateTime_TZInfoType}. `ob' must not be
@code{NULL}.  This function always succeeds.
@end deffn

Macros to create objects:

@geindex PyDate_FromDate (C function)
@anchor{c-api/datetime c PyDate_FromDate}@anchor{584f}
@deffn {C Function} @ref{5df,,PyObject} *PyDate_FromDate (int year, int month, int day)
`Return value: New reference.'
Return a @ref{1fc,,datetime.date} object with the specified year, month and day.
@end deffn

@geindex PyDateTime_FromDateAndTime (C function)
@anchor{c-api/datetime c PyDateTime_FromDateAndTime}@anchor{5850}
@deffn {C Function} @ref{5df,,PyObject} *PyDateTime_FromDateAndTime (int year, int month, int day, int hour, int minute, int second, int usecond)
`Return value: New reference.'
Return a @ref{4e3,,datetime.datetime} object with the specified year, month, day, hour,
minute, second and microsecond.
@end deffn

@geindex PyDateTime_FromDateAndTimeAndFold (C function)
@anchor{c-api/datetime c PyDateTime_FromDateAndTimeAndFold}@anchor{5851}
@deffn {C Function} @ref{5df,,PyObject} *PyDateTime_FromDateAndTimeAndFold (int year, int month, int day, int hour, int minute, int second, int usecond, int fold)
`Return value: New reference.'
Return a @ref{4e3,,datetime.datetime} object with the specified year, month, day, hour,
minute, second, microsecond and fold.


Added in version 3.6.

@end deffn

@geindex PyTime_FromTime (C function)
@anchor{c-api/datetime c PyTime_FromTime}@anchor{5852}
@deffn {C Function} @ref{5df,,PyObject} *PyTime_FromTime (int hour, int minute, int second, int usecond)
`Return value: New reference.'
Return a @ref{1fd,,datetime.time} object with the specified hour, minute, second and
microsecond.
@end deffn

@geindex PyTime_FromTimeAndFold (C function)
@anchor{c-api/datetime c PyTime_FromTimeAndFold}@anchor{5853}
@deffn {C Function} @ref{5df,,PyObject} *PyTime_FromTimeAndFold (int hour, int minute, int second, int usecond, int fold)
`Return value: New reference.'
Return a @ref{1fd,,datetime.time} object with the specified hour, minute, second,
microsecond and fold.


Added in version 3.6.

@end deffn

@geindex PyDelta_FromDSU (C function)
@anchor{c-api/datetime c PyDelta_FromDSU}@anchor{5854}
@deffn {C Function} @ref{5df,,PyObject} *PyDelta_FromDSU (int days, int seconds, int useconds)
`Return value: New reference.'
Return a @ref{bc9,,datetime.timedelta} object representing the given number
of days, seconds and microseconds.  Normalization is performed so that the
resulting number of microseconds and seconds lie in the ranges documented for
@code{datetime.timedelta} objects.
@end deffn

@geindex PyTimeZone_FromOffset (C function)
@anchor{c-api/datetime c PyTimeZone_FromOffset}@anchor{dc0}
@deffn {C Function} @ref{5df,,PyObject} *PyTimeZone_FromOffset (PyObject *offset)
`Return value: New reference.'
Return a @ref{12cb,,datetime.timezone} object with an unnamed fixed offset
represented by the `offset' argument.


Added in version 3.7.

@end deffn

@geindex PyTimeZone_FromOffsetAndName (C function)
@anchor{c-api/datetime c PyTimeZone_FromOffsetAndName}@anchor{dc1}
@deffn {C Function} @ref{5df,,PyObject} *PyTimeZone_FromOffsetAndName (PyObject *offset, PyObject *name)
`Return value: New reference.'
Return a @ref{12cb,,datetime.timezone} object with a fixed offset represented
by the `offset' argument and with tzname `name'.


Added in version 3.7.

@end deffn

Macros to extract fields from date objects.  The argument must be an instance of
@ref{583c,,PyDateTime_Date}, including subclasses (such as
@ref{583d,,PyDateTime_DateTime}).  The argument must not be @code{NULL}, and the type is
not checked:

@geindex PyDateTime_GET_YEAR (C function)
@anchor{c-api/datetime c PyDateTime_GET_YEAR}@anchor{5855}
@deffn {C Function} int PyDateTime_GET_YEAR (PyDateTime_Date *o)

Return the year, as a positive int.
@end deffn

@geindex PyDateTime_GET_MONTH (C function)
@anchor{c-api/datetime c PyDateTime_GET_MONTH}@anchor{5856}
@deffn {C Function} int PyDateTime_GET_MONTH (PyDateTime_Date *o)

Return the month, as an int from 1 through 12.
@end deffn

@geindex PyDateTime_GET_DAY (C function)
@anchor{c-api/datetime c PyDateTime_GET_DAY}@anchor{5857}
@deffn {C Function} int PyDateTime_GET_DAY (PyDateTime_Date *o)

Return the day, as an int from 1 through 31.
@end deffn

Macros to extract fields from datetime objects.  The argument must be an
instance of @ref{583d,,PyDateTime_DateTime}, including subclasses. The argument
must not be @code{NULL}, and the type is not checked:

@geindex PyDateTime_DATE_GET_HOUR (C function)
@anchor{c-api/datetime c PyDateTime_DATE_GET_HOUR}@anchor{5858}
@deffn {C Function} int PyDateTime_DATE_GET_HOUR (PyDateTime_DateTime *o)

Return the hour, as an int from 0 through 23.
@end deffn

@geindex PyDateTime_DATE_GET_MINUTE (C function)
@anchor{c-api/datetime c PyDateTime_DATE_GET_MINUTE}@anchor{5859}
@deffn {C Function} int PyDateTime_DATE_GET_MINUTE (PyDateTime_DateTime *o)

Return the minute, as an int from 0 through 59.
@end deffn

@geindex PyDateTime_DATE_GET_SECOND (C function)
@anchor{c-api/datetime c PyDateTime_DATE_GET_SECOND}@anchor{585a}
@deffn {C Function} int PyDateTime_DATE_GET_SECOND (PyDateTime_DateTime *o)

Return the second, as an int from 0 through 59.
@end deffn

@geindex PyDateTime_DATE_GET_MICROSECOND (C function)
@anchor{c-api/datetime c PyDateTime_DATE_GET_MICROSECOND}@anchor{585b}
@deffn {C Function} int PyDateTime_DATE_GET_MICROSECOND (PyDateTime_DateTime *o)

Return the microsecond, as an int from 0 through 999999.
@end deffn

@geindex PyDateTime_DATE_GET_FOLD (C function)
@anchor{c-api/datetime c PyDateTime_DATE_GET_FOLD}@anchor{585c}
@deffn {C Function} int PyDateTime_DATE_GET_FOLD (PyDateTime_DateTime *o)

Return the fold, as an int from 0 through 1.


Added in version 3.6.

@end deffn

@geindex PyDateTime_DATE_GET_TZINFO (C function)
@anchor{c-api/datetime c PyDateTime_DATE_GET_TZINFO}@anchor{a9b}
@deffn {C Function} @ref{5df,,PyObject} *PyDateTime_DATE_GET_TZINFO (PyDateTime_DateTime *o)

Return the tzinfo (which may be @code{None}).


Added in version 3.10.

@end deffn

Macros to extract fields from time objects.  The argument must be an instance of
@ref{583e,,PyDateTime_Time}, including subclasses. The argument must not be @code{NULL},
and the type is not checked:

@geindex PyDateTime_TIME_GET_HOUR (C function)
@anchor{c-api/datetime c PyDateTime_TIME_GET_HOUR}@anchor{585d}
@deffn {C Function} int PyDateTime_TIME_GET_HOUR (PyDateTime_Time *o)

Return the hour, as an int from 0 through 23.
@end deffn

@geindex PyDateTime_TIME_GET_MINUTE (C function)
@anchor{c-api/datetime c PyDateTime_TIME_GET_MINUTE}@anchor{585e}
@deffn {C Function} int PyDateTime_TIME_GET_MINUTE (PyDateTime_Time *o)

Return the minute, as an int from 0 through 59.
@end deffn

@geindex PyDateTime_TIME_GET_SECOND (C function)
@anchor{c-api/datetime c PyDateTime_TIME_GET_SECOND}@anchor{585f}
@deffn {C Function} int PyDateTime_TIME_GET_SECOND (PyDateTime_Time *o)

Return the second, as an int from 0 through 59.
@end deffn

@geindex PyDateTime_TIME_GET_MICROSECOND (C function)
@anchor{c-api/datetime c PyDateTime_TIME_GET_MICROSECOND}@anchor{5860}
@deffn {C Function} int PyDateTime_TIME_GET_MICROSECOND (PyDateTime_Time *o)

Return the microsecond, as an int from 0 through 999999.
@end deffn

@geindex PyDateTime_TIME_GET_FOLD (C function)
@anchor{c-api/datetime c PyDateTime_TIME_GET_FOLD}@anchor{5861}
@deffn {C Function} int PyDateTime_TIME_GET_FOLD (PyDateTime_Time *o)

Return the fold, as an int from 0 through 1.


Added in version 3.6.

@end deffn

@geindex PyDateTime_TIME_GET_TZINFO (C function)
@anchor{c-api/datetime c PyDateTime_TIME_GET_TZINFO}@anchor{a9c}
@deffn {C Function} @ref{5df,,PyObject} *PyDateTime_TIME_GET_TZINFO (PyDateTime_Time *o)

Return the tzinfo (which may be @code{None}).


Added in version 3.10.

@end deffn

Macros to extract fields from time delta objects.  The argument must be an
instance of @ref{583f,,PyDateTime_Delta}, including subclasses. The argument must
not be @code{NULL}, and the type is not checked:

@geindex PyDateTime_DELTA_GET_DAYS (C function)
@anchor{c-api/datetime c PyDateTime_DELTA_GET_DAYS}@anchor{5862}
@deffn {C Function} int PyDateTime_DELTA_GET_DAYS (PyDateTime_Delta *o)

Return the number of days, as an int from -999999999 to 999999999.


Added in version 3.3.

@end deffn

@geindex PyDateTime_DELTA_GET_SECONDS (C function)
@anchor{c-api/datetime c PyDateTime_DELTA_GET_SECONDS}@anchor{5863}
@deffn {C Function} int PyDateTime_DELTA_GET_SECONDS (PyDateTime_Delta *o)

Return the number of seconds, as an int from 0 through 86399.


Added in version 3.3.

@end deffn

@geindex PyDateTime_DELTA_GET_MICROSECONDS (C function)
@anchor{c-api/datetime c PyDateTime_DELTA_GET_MICROSECONDS}@anchor{5864}
@deffn {C Function} int PyDateTime_DELTA_GET_MICROSECONDS (PyDateTime_Delta *o)

Return the number of microseconds, as an int from 0 through 999999.


Added in version 3.3.

@end deffn

Macros for the convenience of modules implementing the DB API:

@geindex PyDateTime_FromTimestamp (C function)
@anchor{c-api/datetime c PyDateTime_FromTimestamp}@anchor{5865}
@deffn {C Function} @ref{5df,,PyObject} *PyDateTime_FromTimestamp (PyObject *args)
`Return value: New reference.'
Create and return a new @ref{4e3,,datetime.datetime} object given an argument
tuple suitable for passing to @ref{713,,datetime.datetime.fromtimestamp()}.
@end deffn

@geindex PyDate_FromTimestamp (C function)
@anchor{c-api/datetime c PyDate_FromTimestamp}@anchor{1e34}
@deffn {C Function} @ref{5df,,PyObject} *PyDate_FromTimestamp (PyObject *args)
`Return value: New reference.'
Create and return a new @ref{1fc,,datetime.date} object given an argument
tuple suitable for passing to @ref{dd3,,datetime.date.fromtimestamp()}.
@end deffn

@node Internal data<2>,,DateTime Objects<2>,C API for extension modules
@anchor{c-api/datetime internal-data}@anchor{5866}
@subsubsection Internal data


The following symbols are exposed by the C API but should be considered
internal-only.

@geindex PyDateTime_CAPSULE_NAME (C macro)
@anchor{c-api/datetime c PyDateTime_CAPSULE_NAME}@anchor{5867}
@deffn {C Macro} PyDateTime_CAPSULE_NAME

Name of the datetime capsule to pass to @ref{1c53,,PyCapsule_Import()}.

Internal usage only. Use @ref{5839,,PyDateTime_IMPORT} instead.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Interpreter initialization and finalization,Thread states and the global interpreter lock,Concrete Objects Layer,Python/C API reference manual
@anchor{c-api/interp-lifecycle doc}@anchor{5868}@anchor{c-api/interp-lifecycle initialization}@anchor{5869}@anchor{c-api/interp-lifecycle interpreter-initialization-and-finalization}@anchor{586a}@anchor{c-api/interp-lifecycle translation-repo}@anchor{586b}
@section Interpreter initialization and finalization


See @ref{646,,Python Initialization Configuration} for details
on how to configure the interpreter prior to initialization.

@menu
* Before Python initialization:: 
* Global configuration variables:: 
* Initializing and finalizing the interpreter:: 
* Cautions regarding runtime finalization:: 
* Process-wide parameters:: 

@end menu

@node Before Python initialization,Global configuration variables,,Interpreter initialization and finalization
@anchor{c-api/interp-lifecycle before-python-initialization}@anchor{586c}@anchor{c-api/interp-lifecycle pre-init-safe}@anchor{dc4}
@subsection Before Python initialization


In an application embedding Python, the @ref{45e,,Py_Initialize()} function must
be called before using any other Python/C API functions; with the exception of
a few functions and the @ref{586d,,global configuration variables}.

The following functions can be safely called before Python is initialized:


@itemize *

@item 
Functions that initialize the interpreter:


@itemize *

@item 
@ref{45e,,Py_Initialize()}

@item 
@ref{5493,,Py_InitializeEx()}

@item 
@ref{3f4,,Py_InitializeFromConfig()}

@item 
@ref{bbe,,Py_BytesMain()}

@item 
@ref{e24,,Py_Main()}

@item 
the runtime pre-initialization functions covered in @ref{646,,Python Initialization Configuration}
@end itemize

@item 
Configuration functions:


@itemize *

@item 
@ref{1b60,,PyImport_AppendInittab()}

@item 
@ref{1b61,,PyImport_ExtendInittab()}

@item 
@code{PyInitFrozenExtensions()}

@item 
@ref{7a9,,PyMem_SetAllocator()}

@item 
@ref{e6a,,PyMem_SetupDebugHooks()}

@item 
@ref{586e,,PyObject_SetArenaAllocator()}

@item 
@ref{19f8,,Py_SetProgramName()}

@item 
@ref{19f7,,Py_SetPythonHome()}

@item 
the configuration functions covered in @ref{646,,Python Initialization Configuration}
@end itemize

@item 
Informative functions:


@itemize *

@item 
@ref{52b1,,Py_IsInitialized()}

@item 
@ref{586f,,PyMem_GetAllocator()}

@item 
@ref{5870,,PyObject_GetArenaAllocator()}

@item 
@ref{163e,,Py_GetBuildInfo()}

@item 
@ref{548d,,Py_GetCompiler()}

@item 
@ref{548e,,Py_GetCopyright()}

@item 
@ref{548f,,Py_GetPlatform()}

@item 
@ref{5491,,Py_GetVersion()}

@item 
@ref{52b1,,Py_IsInitialized()}
@end itemize

@item 
Utilities:


@itemize *

@item 
@ref{dc6,,Py_DecodeLocale()}

@item 
the status reporting and utility functions covered in @ref{646,,Python Initialization Configuration}
@end itemize

@item 
Memory allocators:


@itemize *

@item 
@ref{631,,PyMem_RawMalloc()}

@item 
@ref{633,,PyMem_RawRealloc()}

@item 
@ref{632,,PyMem_RawCalloc()}

@item 
@ref{634,,PyMem_RawFree()}
@end itemize

@item 
Synchronization:


@itemize *

@item 
@ref{5d0,,PyMutex_Lock()}

@item 
@ref{5d1,,PyMutex_Unlock()}
@end itemize
@end itemize

@cartouche
@quotation Note 
Despite their apparent similarity to some of the functions listed above,
the following functions `should not be called' before the interpreter has
been initialized: @ref{dc7,,Py_EncodeLocale()}, @ref{19fb,,PyEval_InitThreads()}, and
@ref{bc2,,Py_RunMain()}.
@end quotation
@end cartouche

@node Global configuration variables,Initializing and finalizing the interpreter,Before Python initialization,Interpreter initialization and finalization
@anchor{c-api/interp-lifecycle global-conf-vars}@anchor{586d}@anchor{c-api/interp-lifecycle global-configuration-variables}@anchor{5871}
@subsection Global configuration variables


Python has variables for the global configuration to control different features
and options. By default, these flags are controlled by @ref{215e,,command line options}.

When a flag is set by an option, the value of the flag is the number of times
that the option was set. For example, @code{-b} sets @ref{404,,Py_BytesWarningFlag}
to 1 and @code{-bb} sets @code{Py_BytesWarningFlag} to 2.

@geindex Py_BytesWarningFlag (C var)
@anchor{c-api/interp-lifecycle c Py_BytesWarningFlag}@anchor{404}
@deffn {C Variable} int Py_BytesWarningFlag

This API is kept for backward compatibility: setting
@ref{405,,PyConfig.bytes_warning} should be used instead, see @ref{646,,Python Initialization Configuration}.

Issue a warning when comparing @ref{193,,bytes} or @ref{342,,bytearray} with
@ref{16a,,str} or @code{bytes} with @ref{19c,,int}.  Issue an error if greater
or equal to @code{2}.

Set by the @ref{7fa,,-b} option.


Deprecated since version 3.12, will be removed in version 3.15.

@end deffn

@geindex Py_DebugFlag (C var)
@anchor{c-api/interp-lifecycle c Py_DebugFlag}@anchor{3f6}
@deffn {C Variable} int Py_DebugFlag

This API is kept for backward compatibility: setting
@ref{3f7,,PyConfig.parser_debug} should be used instead, see @ref{646,,Python Initialization Configuration}.

Turn on parser debugging output (for expert only, depending on compilation
options).

Set by the @ref{2166,,-d} option and the 
@geindex PYTHONDEBUG
@geindex environment variable; PYTHONDEBUG
@ref{2167,,PYTHONDEBUG} environment
variable.


Deprecated since version 3.12, will be removed in version 3.15.

@end deffn

@geindex Py_DontWriteBytecodeFlag (C var)
@anchor{c-api/interp-lifecycle c Py_DontWriteBytecodeFlag}@anchor{40a}
@deffn {C Variable} int Py_DontWriteBytecodeFlag

This API is kept for backward compatibility: setting
@ref{40b,,PyConfig.write_bytecode} should be used instead, see @ref{646,,Python Initialization Configuration}.

If set to non-zero, Python won’t try to write @code{.pyc} files on the
import of source modules.

Set by the @ref{15d9,,-B} option and the 
@geindex PYTHONDONTWRITEBYTECODE
@geindex environment variable; PYTHONDONTWRITEBYTECODE
@ref{15da,,PYTHONDONTWRITEBYTECODE}
environment variable.


Deprecated since version 3.12, will be removed in version 3.15.

@end deffn

@geindex Py_FrozenFlag (C var)
@anchor{c-api/interp-lifecycle c Py_FrozenFlag}@anchor{406}
@deffn {C Variable} int Py_FrozenFlag

This API is kept for backward compatibility: setting
@ref{407,,PyConfig.pathconfig_warnings} should be used instead, see
@ref{646,,Python Initialization Configuration}.

Private flag used by @code{_freeze_module} and @code{frozenmain} programs.


Deprecated since version 3.12, will be removed in version 3.15.

@end deffn

@geindex Py_HashRandomizationFlag (C var)
@anchor{c-api/interp-lifecycle c Py_HashRandomizationFlag}@anchor{410}
@deffn {C Variable} int Py_HashRandomizationFlag

This API is kept for backward compatibility: setting
@ref{412,,PyConfig.hash_seed} and @ref{411,,PyConfig.use_hash_seed} should
be used instead, see @ref{646,,Python Initialization Configuration}.

Set to @code{1} if the 
@geindex PYTHONHASHSEED
@geindex environment variable; PYTHONHASHSEED
@ref{1283,,PYTHONHASHSEED} environment variable is set to
a non-empty string.

If the flag is non-zero, read the 
@geindex PYTHONHASHSEED
@geindex environment variable; PYTHONHASHSEED
@ref{1283,,PYTHONHASHSEED} environment
variable to initialize the secret hash seed.


Deprecated since version 3.12, will be removed in version 3.15.

@end deffn

@geindex Py_IgnoreEnvironmentFlag (C var)
@anchor{c-api/interp-lifecycle c Py_IgnoreEnvironmentFlag}@anchor{408}
@deffn {C Variable} int Py_IgnoreEnvironmentFlag

This API is kept for backward compatibility: setting
@ref{409,,PyConfig.use_environment} should be used instead, see
@ref{646,,Python Initialization Configuration}.

Ignore all @code{PYTHON*} environment variables, e.g.
@geindex PYTHONPATH
@geindex environment variable; PYTHONPATH
@ref{1223,,PYTHONPATH} and 
@geindex PYTHONHOME
@geindex environment variable; PYTHONHOME
@ref{3ee,,PYTHONHOME}, that might be set.

Set by the @ref{b5c,,-E} and @ref{b5d,,-I} options.


Deprecated since version 3.12, will be removed in version 3.15.

@end deffn

@geindex Py_InspectFlag (C var)
@anchor{c-api/interp-lifecycle c Py_InspectFlag}@anchor{3fe}
@deffn {C Variable} int Py_InspectFlag

This API is kept for backward compatibility: setting
@ref{3ff,,PyConfig.inspect} should be used instead, see
@ref{646,,Python Initialization Configuration}.

When a script is passed as first argument or the @ref{1a9,,-c} option is used,
enter interactive mode after executing the script or the command, even when
@ref{760,,sys.stdin} does not appear to be a terminal.

Set by the @ref{16e7,,-i} option and the 
@geindex PYTHONINSPECT
@geindex environment variable; PYTHONINSPECT
@ref{16e6,,PYTHONINSPECT} environment
variable.


Deprecated since version 3.12, will be removed in version 3.15.

@end deffn

@geindex Py_InteractiveFlag (C var)
@anchor{c-api/interp-lifecycle c Py_InteractiveFlag}@anchor{3fc}
@deffn {C Variable} int Py_InteractiveFlag

This API is kept for backward compatibility: setting
@ref{3fd,,PyConfig.interactive} should be used instead, see
@ref{646,,Python Initialization Configuration}.

Set by the @ref{16e7,,-i} option.


Deprecated since version 3.12, will be removed in version 3.15.

@end deffn

@geindex Py_IsolatedFlag (C var)
@anchor{c-api/interp-lifecycle c Py_IsolatedFlag}@anchor{413}
@deffn {C Variable} int Py_IsolatedFlag

This API is kept for backward compatibility: setting
@ref{414,,PyConfig.isolated} should be used instead, see
@ref{646,,Python Initialization Configuration}.

Run Python in isolated mode. In isolated mode @ref{3e2,,sys.path} contains
neither the script’s directory nor the user’s site-packages directory.

Set by the @ref{b5d,,-I} option.


Added in version 3.4.



Deprecated since version 3.12, will be removed in version 3.15.

@end deffn

@geindex Py_LegacyWindowsFSEncodingFlag (C var)
@anchor{c-api/interp-lifecycle c Py_LegacyWindowsFSEncodingFlag}@anchor{415}
@deffn {C Variable} int Py_LegacyWindowsFSEncodingFlag

This API is kept for backward compatibility: setting
@ref{416,,PyPreConfig.legacy_windows_fs_encoding} should be used instead, see
@ref{646,,Python Initialization Configuration}.

If the flag is non-zero, use the @code{mbcs} encoding with @code{replace} error
handler, instead of the UTF-8 encoding with @code{surrogatepass} error handler,
for the @ref{75e,,filesystem encoding and error handler}.

Set to @code{1} if the 
@geindex PYTHONLEGACYWINDOWSFSENCODING
@geindex environment variable; PYTHONLEGACYWINDOWSFSENCODING
@ref{33d,,PYTHONLEGACYWINDOWSFSENCODING} environment
variable is set to a non-empty string.

See 
@geindex Python Enhancement Proposals; PEP 529
PEP 529@footnote{https://peps.python.org/pep-0529/} for more details.

@ref{2181,,Availability}: Windows.


Deprecated since version 3.12, will be removed in version 3.15.

@end deffn

@geindex Py_LegacyWindowsStdioFlag (C var)
@anchor{c-api/interp-lifecycle c Py_LegacyWindowsStdioFlag}@anchor{417}
@deffn {C Variable} int Py_LegacyWindowsStdioFlag

This API is kept for backward compatibility: setting
@ref{418,,PyConfig.legacy_windows_stdio} should be used instead, see
@ref{646,,Python Initialization Configuration}.

If the flag is non-zero, use @ref{151b,,io.FileIO} instead of
@code{io._WindowsConsoleIO} for @ref{df,,sys} standard streams.

Set to @code{1} if the 
@geindex PYTHONLEGACYWINDOWSSTDIO
@geindex environment variable; PYTHONLEGACYWINDOWSSTDIO
@ref{e5b,,PYTHONLEGACYWINDOWSSTDIO} environment
variable is set to a non-empty string.

See 
@geindex Python Enhancement Proposals; PEP 528
PEP 528@footnote{https://peps.python.org/pep-0528/} for more details.

@ref{2181,,Availability}: Windows.


Deprecated since version 3.12, will be removed in version 3.15.

@end deffn

@geindex Py_NoSiteFlag (C var)
@anchor{c-api/interp-lifecycle c Py_NoSiteFlag}@anchor{402}
@deffn {C Variable} int Py_NoSiteFlag

This API is kept for backward compatibility: setting
@ref{403,,PyConfig.site_import} should be used instead, see
@ref{646,,Python Initialization Configuration}.

Disable the import of the module @ref{cc,,site} and the site-dependent
manipulations of @ref{3e2,,sys.path} that it entails.  Also disable these
manipulations if @code{site} is explicitly imported later (call
@ref{216a,,site.main()} if you want them to be triggered).

Set by the @ref{13b4,,-S} option.


Deprecated since version 3.12, will be removed in version 3.15.

@end deffn

@geindex Py_NoUserSiteDirectory (C var)
@anchor{c-api/interp-lifecycle c Py_NoUserSiteDirectory}@anchor{40c}
@deffn {C Variable} int Py_NoUserSiteDirectory

This API is kept for backward compatibility: setting
@ref{40d,,PyConfig.user_site_directory} should be used instead, see
@ref{646,,Python Initialization Configuration}.

Don’t add the @ref{2169,,user site-packages directory} to
@ref{3e2,,sys.path}.

Set by the @ref{159a,,-s} and @ref{b5d,,-I} options, and the
@geindex PYTHONNOUSERSITE
@geindex environment variable; PYTHONNOUSERSITE
@ref{159b,,PYTHONNOUSERSITE} environment variable.


Deprecated since version 3.12, will be removed in version 3.15.

@end deffn

@geindex Py_OptimizeFlag (C var)
@anchor{c-api/interp-lifecycle c Py_OptimizeFlag}@anchor{400}
@deffn {C Variable} int Py_OptimizeFlag

This API is kept for backward compatibility: setting
@ref{401,,PyConfig.optimization_level} should be used instead, see
@ref{646,,Python Initialization Configuration}.

Set by the @ref{18d,,-O} option and the 
@geindex PYTHONOPTIMIZE
@geindex environment variable; PYTHONOPTIMIZE
@ref{2168,,PYTHONOPTIMIZE} environment
variable.


Deprecated since version 3.12, will be removed in version 3.15.

@end deffn

@geindex Py_QuietFlag (C var)
@anchor{c-api/interp-lifecycle c Py_QuietFlag}@anchor{3fa}
@deffn {C Variable} int Py_QuietFlag

This API is kept for backward compatibility: setting
@ref{3fb,,PyConfig.quiet} should be used instead, see @ref{646,,Python Initialization Configuration}.

Don’t display the copyright and version messages even in interactive mode.

Set by the @ref{17cf,,-q} option.


Added in version 3.2.



Deprecated since version 3.12, will be removed in version 3.15.

@end deffn

@geindex Py_UnbufferedStdioFlag (C var)
@anchor{c-api/interp-lifecycle c Py_UnbufferedStdioFlag}@anchor{40e}
@deffn {C Variable} int Py_UnbufferedStdioFlag

This API is kept for backward compatibility: setting
@ref{40f,,PyConfig.buffered_stdio} should be used instead, see @ref{646,,Python Initialization Configuration}.

Force the stdout and stderr streams to be unbuffered.

Set by the @ref{1dd1,,-u} option and the 
@geindex PYTHONUNBUFFERED
@geindex environment variable; PYTHONUNBUFFERED
@ref{1dd2,,PYTHONUNBUFFERED}
environment variable.


Deprecated since version 3.12, will be removed in version 3.15.

@end deffn

@geindex Py_VerboseFlag (C var)
@anchor{c-api/interp-lifecycle c Py_VerboseFlag}@anchor{3f8}
@deffn {C Variable} int Py_VerboseFlag

This API is kept for backward compatibility: setting
@ref{3f9,,PyConfig.verbose} should be used instead, see @ref{646,,Python Initialization Configuration}.

Print a message each time a module is initialized, showing the place
(filename or built-in module) from which it is loaded.  If greater or equal
to @code{2}, print a message for each file that is checked for when
searching for a module. Also provides information on module cleanup at exit.

Set by the @ref{1631,,-v} option and the 
@geindex PYTHONVERBOSE
@geindex environment variable; PYTHONVERBOSE
@ref{216b,,PYTHONVERBOSE} environment
variable.


Deprecated since version 3.12, will be removed in version 3.15.

@end deffn

@node Initializing and finalizing the interpreter,Cautions regarding runtime finalization,Global configuration variables,Interpreter initialization and finalization
@anchor{c-api/interp-lifecycle initializing-and-finalizing-the-interpreter}@anchor{5872}
@subsection Initializing and finalizing the interpreter


@geindex Py_Initialize (C function)
@anchor{c-api/interp-lifecycle c Py_Initialize}@anchor{45e}
@deffn {C Function} void Py_Initialize ()
` Part of the @ref{776,,Stable ABI}.'
@geindex PyEval_InitThreads()
@geindex modules (in module sys)
@geindex path (in module sys)
@geindex module; builtins
@geindex module; __main__
@geindex module; sys
@geindex module; search; path
@geindex Py_FinalizeEx (C function)

Initialize the Python interpreter.  In an application embedding Python,
this should be called before using any other Python/C API functions; see
@ref{dc4,,Before Python Initialization} for the few exceptions.

This initializes the table of loaded modules (@code{sys.modules}), and creates
the fundamental modules @ref{13,,builtins}, @ref{1,,__main__} and @ref{df,,sys}.
It also initializes the module search path (@code{sys.path}). It does not set
@code{sys.argv}; use the @ref{646,,Python Initialization Configuration}
API for that. This is a no-op when called for a second time (without calling
@ref{f17,,Py_FinalizeEx()} first).  There is no return value; it is a fatal
error if the initialization fails.

Use @ref{3f4,,Py_InitializeFromConfig()} to customize the
@ref{646,,Python Initialization Configuration}.

@cartouche
@quotation Note 
On Windows, changes the console mode from @code{O_TEXT} to @code{O_BINARY},
which will also affect non-Python uses of the console using the C Runtime.
@end quotation
@end cartouche
@end deffn

@geindex Py_InitializeEx (C function)
@anchor{c-api/interp-lifecycle c Py_InitializeEx}@anchor{5493}
@deffn {C Function} void Py_InitializeEx (int initsigs)
` Part of the @ref{776,,Stable ABI}.'
This function works like @ref{45e,,Py_Initialize()} if `initsigs' is @code{1}. If
`initsigs' is @code{0}, it skips initialization registration of signal handlers,
which may be useful when CPython is embedded as part of a larger application.

Use @ref{3f4,,Py_InitializeFromConfig()} to customize the
@ref{646,,Python Initialization Configuration}.
@end deffn

@geindex Py_InitializeFromConfig (C function)
@anchor{c-api/interp-lifecycle c Py_InitializeFromConfig}@anchor{3f4}
@deffn {C Function} @ref{baa,,PyStatus} Py_InitializeFromConfig (const PyConfig *config)

Initialize Python from `config' configuration, as described in
@ref{5873,,Initialization with PyConfig}.

See the @ref{646,,Python Initialization Configuration} section for details on pre-initializing the
interpreter, populating the runtime configuration structure, and querying
the returned status structure.
@end deffn

@geindex Py_IsInitialized (C function)
@anchor{c-api/interp-lifecycle c Py_IsInitialized}@anchor{52b1}
@deffn {C Function} int Py_IsInitialized ()
` Part of the @ref{776,,Stable ABI}.'
Return true (nonzero) when the Python interpreter has been initialized, false
(zero) if not.  After @ref{f17,,Py_FinalizeEx()} is called, this returns false until
@ref{45e,,Py_Initialize()} is called again.
@end deffn

@geindex Py_IsFinalizing (C function)
@anchor{c-api/interp-lifecycle c Py_IsFinalizing}@anchor{5fd}
@deffn {C Function} int Py_IsFinalizing ()
` Part of the @ref{776,,Stable ABI} since version 3.13.'
Return true (non-zero) if the main Python interpreter is
@ref{47a,,shutting down}. Return false (zero) otherwise.


Added in version 3.13.

@end deffn

@geindex Py_FinalizeEx (C function)
@anchor{c-api/interp-lifecycle c Py_FinalizeEx}@anchor{f17}
@deffn {C Function} int Py_FinalizeEx ()
` Part of the @ref{776,,Stable ABI} since version 3.6.'
Undo all initializations made by @ref{45e,,Py_Initialize()} and subsequent use of
Python/C API functions, and destroy all sub-interpreters (see
@ref{1b75,,Py_NewInterpreter()} below) that were created and not yet destroyed since
the last call to @code{Py_Initialize()}.  This is a no-op when called for a second
time (without calling @code{Py_Initialize()} again first).

Since this is the reverse of @ref{45e,,Py_Initialize()}, it should be called
in the same thread with the same interpreter active.  That means
the main thread and the main interpreter.
This should never be called while @ref{bc2,,Py_RunMain()} is running.

Normally the return value is @code{0}.
If there were errors during finalization (flushing buffered data),
@code{-1} is returned.

Note that Python will do a best effort at freeing all memory allocated by the Python
interpreter.  Therefore, any C-Extension should make sure to correctly clean up all
of the previously allocated PyObjects before using them in subsequent calls to
@ref{45e,,Py_Initialize()}.  Otherwise it could introduce vulnerabilities and incorrect
behavior.

This function is provided for a number of reasons.  An embedding application
might want to restart Python without having to restart the application itself.
An application that has loaded the Python interpreter from a dynamically
loadable library (or DLL) might want to free all memory allocated by Python
before unloading the DLL. During a hunt for memory leaks in an application a
developer might want to free all memory allocated by Python before exiting from
the application.

`Bugs and caveats:' The destruction of modules and objects in modules is done
in random order; this may cause destructors (@ref{1203,,__del__()} methods) to fail
when they depend on other objects (even functions) or modules.  Dynamically
loaded extension modules loaded by Python are not unloaded.  Small amounts of
memory allocated by the Python interpreter may not be freed (if you find a leak,
please report it).  Memory tied up in circular references between objects is not
freed.  Interned strings will all be deallocated regardless of their reference count.
Some memory allocated by extension modules may not be freed.  Some extensions may not
work properly if their initialization routine is called more than once; this can
happen if an application calls @ref{45e,,Py_Initialize()} and @ref{f17,,Py_FinalizeEx()}
more than once.  @code{Py_FinalizeEx()} must not be called recursively from
within itself.  Therefore, it must not be called by any code that may be run
as part of the interpreter shutdown process, such as @ref{d,,atexit}
handlers, object finalizers, or any code that may be run while flushing the
stdout and stderr files.

Raises an @ref{1cb1,,auditing event} @code{cpython._PySys_ClearAuditHooks} with no arguments.


Added in version 3.6.

@end deffn

@geindex Py_Finalize (C function)
@anchor{c-api/interp-lifecycle c Py_Finalize}@anchor{45d}
@deffn {C Function} void Py_Finalize ()
` Part of the @ref{776,,Stable ABI}.'
This is a backwards-compatible version of @ref{f17,,Py_FinalizeEx()} that
disregards the return value.
@end deffn

@geindex Py_BytesMain (C function)
@anchor{c-api/interp-lifecycle c Py_BytesMain}@anchor{bbe}
@deffn {C Function} int Py_BytesMain (int argc, char **argv)
` Part of the @ref{776,,Stable ABI} since version 3.8.'
Similar to @ref{e24,,Py_Main()} but `argv' is an array of bytes strings,
allowing the calling application to delegate the text decoding step to
the CPython runtime.


Added in version 3.8.

@end deffn

@geindex Py_Main (C function)
@anchor{c-api/interp-lifecycle c Py_Main}@anchor{e24}
@deffn {C Function} int Py_Main (int argc, wchar_t **argv)
` Part of the @ref{776,,Stable ABI}.'
The main program for the standard interpreter, encapsulating a full
initialization/finalization cycle, as well as additional
behaviour to implement reading configurations settings from the environment
and command line, and then executing @code{__main__} in accordance with
@ref{120d,,Command line}.

This is made available for programs which wish to support the full CPython
command line interface, rather than just embedding a Python runtime in a
larger application.

The `argc' and `argv' parameters are similar to those which are passed to a
C program’s @code{main()} function, except that the `argv' entries are first
converted to @code{wchar_t} using @ref{dc6,,Py_DecodeLocale()}. It is also
important to note that the argument list entries may be modified to point to
strings other than those passed in (however, the contents of the strings
pointed to by the argument list are not modified).

The return value is @code{2} if the argument list does not represent a valid
Python command line, and otherwise the same as @ref{bc2,,Py_RunMain()}.

In terms of the CPython runtime configuration APIs documented in the
@ref{646,,runtime configuration} section (and without accounting
for error handling), @code{Py_Main} is approximately equivalent to:

@example
PyConfig config;
PyConfig_InitPythonConfig(&config);
PyConfig_SetArgv(&config, argc, argv);
Py_InitializeFromConfig(&config);
PyConfig_Clear(&config);

Py_RunMain();
@end example

In normal usage, an embedding application will call this function
`instead' of calling @ref{45e,,Py_Initialize()}, @ref{5493,,Py_InitializeEx()} or
@ref{3f4,,Py_InitializeFromConfig()} directly, and all settings will be applied
as described elsewhere in this documentation. If this function is instead
called `after' a preceding runtime initialization API call, then exactly
which environmental and command line configuration settings will be updated
is version dependent (as it depends on which settings correctly support
being modified after they have already been set once when the runtime was
first initialized).
@end deffn

@geindex Py_RunMain (C function)
@anchor{c-api/interp-lifecycle c Py_RunMain}@anchor{bc2}
@deffn {C Function} int Py_RunMain (void)

Executes the main module in a fully configured CPython runtime.

Executes the command (@ref{5874,,PyConfig.run_command}), the script
(@ref{5875,,PyConfig.run_filename}) or the module
(@ref{5876,,PyConfig.run_module}) specified on the command line or in the
configuration. If none of these values are set, runs the interactive Python
prompt (REPL) using the @code{__main__} module’s global namespace.

If @ref{3ff,,PyConfig.inspect} is not set (the default), the return value
will be @code{0} if the interpreter exits normally (that is, without raising
an exception), the exit status of an unhandled @ref{f42,,SystemExit}, or @code{1}
for any other unhandled exception.

If @ref{3ff,,PyConfig.inspect} is set (such as when the @ref{16e7,,-i} option
is used), rather than returning when the interpreter exits, execution will
instead resume in an interactive Python prompt (REPL) using the @code{__main__}
module’s global namespace. If the interpreter exited with an exception, it
is immediately raised in the REPL session. The function return value is
then determined by the way the `REPL session' terminates: @code{0}, @code{1}, or
the status of a @ref{f42,,SystemExit}, as specified above.

This function always finalizes the Python interpreter before it returns.

See @ref{5877,,Python Configuration} for an example of a
customized Python that always runs in isolated mode using
@ref{bc2,,Py_RunMain()}.
@end deffn

@geindex PyUnstable_AtExit (C function)
@anchor{c-api/interp-lifecycle c PyUnstable_AtExit}@anchor{193f}
@deffn {C Function} int PyUnstable_AtExit (PyInterpreterState *interp, void (*func)(void*), void *data)

@cartouche
@quotation This is Unstable API. It may change without warning in minor releases. `This is @ref{76a,,Unstable API}. It may change without warning in minor releases.'
@end quotation
@end cartouche

Register an @ref{d,,atexit} callback for the target interpreter `interp'.
This is similar to @ref{5488,,Py_AtExit()}, but takes an explicit interpreter and
data pointer for the callback.

There must be an @ref{5231,,attached thread state} for `interp'.


Added in version 3.13.

@end deffn

@node Cautions regarding runtime finalization,Process-wide parameters,Initializing and finalizing the interpreter,Interpreter initialization and finalization
@anchor{c-api/interp-lifecycle cautions-regarding-runtime-finalization}@anchor{5878}@anchor{c-api/interp-lifecycle id1}@anchor{5879}
@subsection Cautions regarding runtime finalization


In the late stage of @ref{47a,,interpreter shutdown}, after attempting to wait for
non-daemon threads to exit (though this can be interrupted by
@ref{bcb,,KeyboardInterrupt}) and running the @ref{d,,atexit} functions, the runtime
is marked as `finalizing': @ref{5fd,,Py_IsFinalizing()} and
@ref{c86,,sys.is_finalizing()} return true.  At this point, only the `finalization
thread' that initiated finalization (typically the main thread) is allowed to
acquire the @ref{165,,GIL}.

If any thread, other than the finalization thread, attempts to attach a @ref{188f,,thread state}
during finalization, either explicitly or
implicitly, the thread enters `a permanently blocked state'
where it remains until the program exits.  In most cases this is harmless, but this can result
in deadlock if a later stage of finalization attempts to acquire a lock owned by the
blocked thread, or otherwise waits on the blocked thread.

Gross? Yes. This prevents random crashes and/or unexpectedly skipped C++
finalizations further up the call stack when such threads were forcibly exited
here in CPython 3.13 and earlier. The CPython runtime @ref{188f,,thread state} C APIs
have never had any error reporting or handling expectations at thread state
attachment time that would’ve allowed for graceful exit from this situation. Changing that
would require new stable C APIs and rewriting the majority of C code in the
CPython ecosystem to use those with error handling.

@node Process-wide parameters,,Cautions regarding runtime finalization,Interpreter initialization and finalization
@anchor{c-api/interp-lifecycle process-wide-parameters}@anchor{587a}
@subsection Process-wide parameters


@geindex Py_SetProgramName (C function)
@anchor{c-api/interp-lifecycle c Py_SetProgramName}@anchor{19f8}
@deffn {C Function} void Py_SetProgramName (const wchar_t *name)
` Part of the @ref{776,,Stable ABI}.'
@geindex Py_Initialize()
@geindex main()
@geindex Py_GetPath()

This API is kept for backward compatibility: setting
@ref{3f0,,PyConfig.program_name} should be used instead, see @ref{646,,Python Initialization Configuration}.

This function should be called before @ref{45e,,Py_Initialize()} is called for
the first time, if it is called at all.  It tells the interpreter the value
of the @code{argv[0]} argument to the @code{main()} function of the program
(converted to wide characters).
This is used by @ref{3e1,,Py_GetPath()} and some other functions below to find
the Python run-time libraries relative to the interpreter executable.  The
default value is @code{'python'}.  The argument should point to a
zero-terminated wide character string in static storage whose contents will not
change for the duration of the program’s execution.  No code in the Python
interpreter will change the contents of this storage.

Use @ref{dc6,,Py_DecodeLocale()} to decode a bytes string to get a
wchar_t* string.


Deprecated since version 3.11, will be removed in version 3.15.

@end deffn

@geindex Py_GetProgramName (C function)
@anchor{c-api/interp-lifecycle c Py_GetProgramName}@anchor{3ec}
@deffn {C Function} wchar_t *Py_GetProgramName ()
` Part of the @ref{776,,Stable ABI}.'
Return the program name set with @ref{3f0,,PyConfig.program_name}, or the default.
The returned string points into static storage; the caller should not modify its
value.

This function should not be called before @ref{45e,,Py_Initialize()}, otherwise
it returns @code{NULL}.


Changed in version 3.10: It now returns @code{NULL} if called before @ref{45e,,Py_Initialize()}.



Deprecated since version 3.13, will be removed in version 3.15: Use @ref{37a,,PyConfig_Get("executable")}
(@ref{3eb,,sys.executable}) instead.

@end deffn

@geindex Py_GetPrefix (C function)
@anchor{c-api/interp-lifecycle c Py_GetPrefix}@anchor{3e3}
@deffn {C Function} wchar_t *Py_GetPrefix ()
` Part of the @ref{776,,Stable ABI}.'
Return the `prefix' for installed platform-independent files. This is derived
through a number of complicated rules from the program name set with
@ref{3f0,,PyConfig.program_name} and some environment variables; for example, if the
program name is @code{'/usr/local/bin/python'}, the prefix is @code{'/usr/local'}. The
returned string points into static storage; the caller should not modify its
value.  This corresponds to the @code{prefix} variable in the top-level
@code{Makefile} and the @ref{2191,,--prefix} argument to the @code{configure}
script at build time.  The value is available to Python code as @code{sys.base_prefix}.
It is only useful on Unix.  See also the next function.

This function should not be called before @ref{45e,,Py_Initialize()}, otherwise
it returns @code{NULL}.


Changed in version 3.10: It now returns @code{NULL} if called before @ref{45e,,Py_Initialize()}.



Deprecated since version 3.13, will be removed in version 3.15: Use @ref{37a,,PyConfig_Get("base_prefix")}
(@ref{3e4,,sys.base_prefix}) instead. Use @code{PyConfig_Get("prefix")} (@ref{3e5,,sys.prefix}) if @ref{3e6,,virtual environments} need to be handled.

@end deffn

@geindex Py_GetExecPrefix (C function)
@anchor{c-api/interp-lifecycle c Py_GetExecPrefix}@anchor{3e7}
@deffn {C Function} wchar_t *Py_GetExecPrefix ()
` Part of the @ref{776,,Stable ABI}.'
Return the `exec-prefix' for installed platform-`dependent' files.  This is
derived through a number of complicated rules from the program name set with
@ref{3f0,,PyConfig.program_name} and some environment variables; for example, if the
program name is @code{'/usr/local/bin/python'}, the exec-prefix is
@code{'/usr/local'}.  The returned string points into static storage; the caller
should not modify its value.  This corresponds to the @code{exec_prefix}
variable in the top-level @code{Makefile} and the @code{--exec-prefix}
argument to the @code{configure} script at build  time.  The value is
available to Python code as @code{sys.base_exec_prefix}.  It is only useful on
Unix.

Background: The exec-prefix differs from the prefix when platform dependent
files (such as executables and shared libraries) are installed in a different
directory tree.  In a typical installation, platform dependent files may be
installed in the @code{/usr/local/plat} subtree while platform independent may
be installed in @code{/usr/local}.

Generally speaking, a platform is a combination of hardware and software
families, e.g.  Sparc machines running the Solaris 2.x operating system are
considered the same platform, but Intel machines running Solaris 2.x are another
platform, and Intel machines running Linux are yet another platform.  Different
major revisions of the same operating system generally also form different
platforms.  Non-Unix operating systems are a different story; the installation
strategies on those systems are so different that the prefix and exec-prefix are
meaningless, and set to the empty string. Note that compiled Python bytecode
files are platform independent (but not independent from the Python version by
which they were compiled!).

System administrators will know how to configure the @code{mount} or
@code{automount} programs to share @code{/usr/local} between platforms
while having @code{/usr/local/plat} be a different filesystem for each
platform.

This function should not be called before @ref{45e,,Py_Initialize()}, otherwise
it returns @code{NULL}.


Changed in version 3.10: It now returns @code{NULL} if called before @ref{45e,,Py_Initialize()}.



Deprecated since version 3.13, will be removed in version 3.15: Use @ref{37a,,PyConfig_Get("base_exec_prefix")}
(@ref{3e8,,sys.base_exec_prefix}) instead. Use
@code{PyConfig_Get("exec_prefix")}
(@ref{3e9,,sys.exec_prefix}) if @ref{3e6,,virtual environments} need
to be handled.

@end deffn

@geindex Py_GetProgramFullPath (C function)
@anchor{c-api/interp-lifecycle c Py_GetProgramFullPath}@anchor{3ea}
@deffn {C Function} wchar_t *Py_GetProgramFullPath ()
` Part of the @ref{776,,Stable ABI}.'
@geindex executable (in module sys)

Return the full program name of the Python executable; this is  computed as a
side-effect of deriving the default module search path  from the program name
(set by @ref{3f0,,PyConfig.program_name}). The returned string points into
static storage; the caller should not modify its value.  The value is available
to Python code as @code{sys.executable}.

This function should not be called before @ref{45e,,Py_Initialize()}, otherwise
it returns @code{NULL}.


Changed in version 3.10: It now returns @code{NULL} if called before @ref{45e,,Py_Initialize()}.



Deprecated since version 3.13, will be removed in version 3.15: Use @ref{37a,,PyConfig_Get("executable")}
(@ref{3eb,,sys.executable}) instead.

@end deffn

@geindex Py_GetPath (C function)
@anchor{c-api/interp-lifecycle c Py_GetPath}@anchor{3e1}
@deffn {C Function} wchar_t *Py_GetPath ()
` Part of the @ref{776,,Stable ABI}.'
@geindex module; search; path
@geindex path (in module sys)

Return the default module search path; this is computed from the program name
(set by @ref{3f0,,PyConfig.program_name}) and some environment variables.
The returned string consists of a series of directory names separated by a
platform dependent delimiter character.  The delimiter character is @code{':'}
on Unix and macOS, @code{';'} on Windows.  The returned string points into
static storage; the caller should not modify its value.  The list
@ref{3e2,,sys.path} is initialized with this value on interpreter startup; it
can be (and usually is) modified later to change the search path for loading
modules.

This function should not be called before @ref{45e,,Py_Initialize()}, otherwise
it returns @code{NULL}.

@c XXX should give the exact rules


Changed in version 3.10: It now returns @code{NULL} if called before @ref{45e,,Py_Initialize()}.



Deprecated since version 3.13, will be removed in version 3.15: Use @ref{37a,,PyConfig_Get("module_search_paths")}
(@ref{3e2,,sys.path}) instead.

@end deffn

@geindex Py_GetVersion (C function)
@anchor{c-api/interp-lifecycle c Py_GetVersion}@anchor{5491}
@deffn {C Function} const char *Py_GetVersion ()
` Part of the @ref{776,,Stable ABI}.'
Return the version of this Python interpreter.  This is a string that looks
something like

@example
"3.0a5+ (py3k:63103M, May 12 2008, 00:53:55) \n[GCC 4.2.3]"
@end example

@geindex version (in module sys)

The first word (up to the first space character) is the current Python version;
the first characters are the major and minor version separated by a
period.  The returned string points into static storage; the caller should not
modify its value.  The value is available to Python code as @ref{49d,,sys.version}.

See also the @ref{37f,,Py_Version} constant.
@end deffn

@geindex Py_GetPlatform (C function)
@anchor{c-api/interp-lifecycle c Py_GetPlatform}@anchor{548f}
@deffn {C Function} const char *Py_GetPlatform ()
` Part of the @ref{776,,Stable ABI}.'
@geindex platform (in module sys)

Return the platform identifier for the current platform.  On Unix, this is
formed from the “official” name of the operating system, converted to lower
case, followed by the major revision number; e.g., for Solaris 2.x, which is
also known as SunOS 5.x, the value is @code{'sunos5'}.  On macOS, it is
@code{'darwin'}.  On Windows, it is @code{'win'}.  The returned string points into
static storage; the caller should not modify its value.  The value is available
to Python code as @code{sys.platform}.
@end deffn

@geindex Py_GetCopyright (C function)
@anchor{c-api/interp-lifecycle c Py_GetCopyright}@anchor{548e}
@deffn {C Function} const char *Py_GetCopyright ()
` Part of the @ref{776,,Stable ABI}.'
Return the official copyright string for the current Python version, for example

@code{'Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam'}

@geindex copyright (in module sys)

The returned string points into static storage; the caller should not modify its
value.  The value is available to Python code as @code{sys.copyright}.
@end deffn

@geindex Py_GetCompiler (C function)
@anchor{c-api/interp-lifecycle c Py_GetCompiler}@anchor{548d}
@deffn {C Function} const char *Py_GetCompiler ()
` Part of the @ref{776,,Stable ABI}.'
Return an indication of the compiler used to build the current Python version,
in square brackets, for example:

@example
"[GCC 2.7.2.2]"
@end example

@geindex version (in module sys)

The returned string points into static storage; the caller should not modify its
value.  The value is available to Python code as part of the variable
@code{sys.version}.
@end deffn

@geindex Py_GetBuildInfo (C function)
@anchor{c-api/interp-lifecycle c Py_GetBuildInfo}@anchor{163e}
@deffn {C Function} const char *Py_GetBuildInfo ()
` Part of the @ref{776,,Stable ABI}.'
Return information about the sequence number and build date and time of the
current Python interpreter instance, for example

@example
"#67, Aug  1 1997, 22:34:28"
@end example

@geindex version (in module sys)

The returned string points into static storage; the caller should not modify its
value.  The value is available to Python code as part of the variable
@code{sys.version}.
@end deffn

@geindex PySys_SetArgvEx (C function)
@anchor{c-api/interp-lifecycle c PySys_SetArgvEx}@anchor{19f9}
@deffn {C Function} void PySys_SetArgvEx (int argc, wchar_t **argv, int updatepath)
` Part of the @ref{776,,Stable ABI}.'
@geindex main()
@geindex Py_FatalError()
@geindex argv (in module sys)

This API is kept for backward compatibility: setting
@ref{3ef,,PyConfig.argv}, @ref{1d35,,PyConfig.parse_argv} and
@ref{97c,,PyConfig.safe_path} should be used instead, see @ref{646,,Python Initialization Configuration}.

Set @ref{1470,,sys.argv} based on `argc' and `argv'.  These parameters are
similar to those passed to the program’s @code{main()} function with the
difference that the first entry should refer to the script file to be
executed rather than the executable hosting the Python interpreter.  If there
isn’t a script that will be run, the first entry in `argv' can be an empty
string.  If this function fails to initialize @code{sys.argv}, a fatal
condition is signalled using @ref{b80,,Py_FatalError()}.

If `updatepath' is zero, this is all the function does.  If `updatepath'
is non-zero, the function also modifies @ref{3e2,,sys.path} according to the
following algorithm:


@itemize -

@item 
If the name of an existing script is passed in @code{argv[0]}, the absolute
path of the directory where the script is located is prepended to
@ref{3e2,,sys.path}.

@item 
Otherwise (that is, if `argc' is @code{0} or @code{argv[0]} doesn’t point
to an existing file name), an empty string is prepended to
@ref{3e2,,sys.path}, which is the same as prepending the current working
directory (@code{"."}).
@end itemize

Use @ref{dc6,,Py_DecodeLocale()} to decode a bytes string to get a
wchar_t* string.

See also @ref{a9a,,PyConfig.orig_argv} and @ref{3ef,,PyConfig.argv}
members of the @ref{646,,Python Initialization Configuration}.

@cartouche
@quotation Note 
It is recommended that applications embedding the Python interpreter
for purposes other than executing a single script pass @code{0} as `updatepath',
and update @ref{3e2,,sys.path} themselves if desired.
See 
@geindex Common Vulnerabilities and Exposures; CVE 2008-5983
CVE 2008-5983@footnote{https://www.cve.org/CVERecord?id=CVE-2008-5983}.

On versions before 3.1.3, you can achieve the same effect by manually
popping the first @ref{3e2,,sys.path} element after having called
@ref{19fa,,PySys_SetArgv()}, for example using:

@example
PyRun_SimpleString("import sys; sys.path.pop(0)\n");
@end example
@end quotation
@end cartouche


Added in version 3.1.3.



Deprecated since version 3.11, will be removed in version 3.15.

@end deffn

@geindex PySys_SetArgv (C function)
@anchor{c-api/interp-lifecycle c PySys_SetArgv}@anchor{19fa}
@deffn {C Function} void PySys_SetArgv (int argc, wchar_t **argv)
` Part of the @ref{776,,Stable ABI}.'
This API is kept for backward compatibility: setting
@ref{3ef,,PyConfig.argv} and @ref{1d35,,PyConfig.parse_argv} should be used
instead, see @ref{646,,Python Initialization Configuration}.

This function works like @ref{19f9,,PySys_SetArgvEx()} with `updatepath' set
to @code{1} unless the @code{python} interpreter was started with the
@ref{b5d,,-I}.

Use @ref{dc6,,Py_DecodeLocale()} to decode a bytes string to get a
wchar_t* string.

See also @ref{a9a,,PyConfig.orig_argv} and @ref{3ef,,PyConfig.argv}
members of the @ref{646,,Python Initialization Configuration}.


Changed in version 3.4: The `updatepath' value depends on @ref{b5d,,-I}.



Deprecated since version 3.11, will be removed in version 3.15.

@end deffn

@geindex Py_SetPythonHome (C function)
@anchor{c-api/interp-lifecycle c Py_SetPythonHome}@anchor{19f7}
@deffn {C Function} void Py_SetPythonHome (const wchar_t *home)
` Part of the @ref{776,,Stable ABI}.'
This API is kept for backward compatibility: setting
@ref{3f1,,PyConfig.home} should be used instead, see @ref{646,,Python Initialization Configuration}.

Set the default “home” directory, that is, the location of the standard
Python libraries.  See 
@geindex PYTHONHOME
@geindex environment variable; PYTHONHOME
@ref{3ee,,PYTHONHOME} for the meaning of the
argument string.

The argument should point to a zero-terminated character string in static
storage whose contents will not change for the duration of the program’s
execution.  No code in the Python interpreter will change the contents of
this storage.

Use @ref{dc6,,Py_DecodeLocale()} to decode a bytes string to get a
wchar_t* string.


Deprecated since version 3.11, will be removed in version 3.15.

@end deffn

@geindex Py_GetPythonHome (C function)
@anchor{c-api/interp-lifecycle c Py_GetPythonHome}@anchor{3ed}
@deffn {C Function} wchar_t *Py_GetPythonHome ()
` Part of the @ref{776,,Stable ABI}.'
Return the default “home”, that is, the value set by
@ref{3f1,,PyConfig.home}, or the value of the 
@geindex PYTHONHOME
@geindex environment variable; PYTHONHOME
@ref{3ee,,PYTHONHOME}
environment variable if it is set.

This function should not be called before @ref{45e,,Py_Initialize()}, otherwise
it returns @code{NULL}.


Changed in version 3.10: It now returns @code{NULL} if called before @ref{45e,,Py_Initialize()}.



Deprecated since version 3.13, will be removed in version 3.15: Use @ref{37a,,PyConfig_Get("home")} or the
@geindex PYTHONHOME
@geindex environment variable; PYTHONHOME
@ref{3ee,,PYTHONHOME} environment variable instead.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Thread states and the global interpreter lock,Asynchronous notifications,Interpreter initialization and finalization,Python/C API reference manual
@anchor{c-api/threads doc}@anchor{587b}@anchor{c-api/threads thread-states-and-the-global-interpreter-lock}@anchor{587c}@anchor{c-api/threads threads}@anchor{587d}@anchor{c-api/threads translation-repo}@anchor{587e}
@section Thread states and the global interpreter lock


@geindex global interpreter lock
@geindex interpreter lock
@geindex lock@comma{} interpreter

Unless on a @ref{1791,,free-threaded build} of @ref{907,,CPython},
the Python interpreter is generally not thread-safe.  In order to support
multi-threaded Python programs, there’s a global lock, called the @ref{474,,global interpreter lock} or @ref{165,,GIL}, that must be held by a thread before
accessing Python objects. Without the lock, even the simplest operations
could cause problems in a multi-threaded program: for example, when
two threads simultaneously increment the reference count of the same object, the
reference count could end up being incremented only once instead of twice.

As such, only a thread that holds the GIL may operate on Python objects or
invoke Python’s C API.

@geindex setswitchinterval (in module sys)

In order to emulate concurrency, the interpreter regularly tries to switch
threads between bytecode instructions (see @ref{b4a,,sys.setswitchinterval()}).
This is why locks are also necessary for thread-safety in pure-Python code.

Additionally, the global interpreter lock is released around blocking I/O
operations, such as reading or writing to a file. From the C API, this is done
by @ref{587f,,detaching the thread state}.

@geindex PyThreadState (C type)

The Python interpreter keeps some thread-local information inside
a data structure called @ref{995,,PyThreadState}, known as a @ref{188f,,thread state}.
Each thread has a thread-local pointer to a @code{PyThreadState}; a thread state
referenced by this pointer is considered to be @ref{5231,,attached}.

A thread can only have one @ref{5231,,attached thread state} at a time. An attached
thread state is typically analogous with holding the GIL, except on
free-threaded builds.  On builds with the GIL enabled, attaching a thread state
will block until the GIL can be acquired. However, even on builds with the GIL
disabled, it is still required to have an attached thread state, as the interpreter
needs to keep track of which threads may access Python objects.

@cartouche
@quotation Note 
Even on the free-threaded build, attaching a thread state may block, as the
GIL can be re-enabled or threads might be temporarily suspended (such as during
a garbage collection).
@end quotation
@end cartouche

Generally, there will always be an attached thread state when using Python’s
C API, including during embedding and when implementing methods, so it’s uncommon
to need to set up a thread state on your own. Only in some specific cases, such
as in a @ref{521d,,Py_BEGIN_ALLOW_THREADS} block or in a fresh thread, will the
thread not have an attached thread state.
If uncertain, check if @ref{421,,PyThreadState_GetUnchecked()} returns @code{NULL}.

If it turns out that you do need to create a thread state, call @ref{5423,,PyThreadState_New()}
followed by @ref{5424,,PyThreadState_Swap()}, or use the dangerous
@ref{64a,,PyGILState_Ensure()} function.

@menu
* Detaching the thread state from extension code:: 
* Non-Python created threads:: 
* Legacy API:: 
* Cautions about fork(): Cautions about fork. 
* High-level APIs:: 
* GIL-state APIs:: 
* Low-level APIs:: 

@end menu

@node Detaching the thread state from extension code,Non-Python created threads,,Thread states and the global interpreter lock
@anchor{c-api/threads detaching-the-thread-state-from-extension-code}@anchor{5880}@anchor{c-api/threads detaching-thread-state}@anchor{587f}
@subsection Detaching the thread state from extension code


Most extension code manipulating the @ref{188f,,thread state} has the following simple
structure:

@example
Save the thread state in a local variable.
... Do some blocking I/O operation ...
Restore the thread state from the local variable.
@end example

This is so common that a pair of macros exists to simplify it:

@example
Py_BEGIN_ALLOW_THREADS
... Do some blocking I/O operation ...
Py_END_ALLOW_THREADS
@end example

@geindex Py_BEGIN_ALLOW_THREADS (C macro)
@geindex Py_END_ALLOW_THREADS (C macro)

The @ref{521d,,Py_BEGIN_ALLOW_THREADS} macro opens a new block and declares a
hidden local variable; the @ref{c85,,Py_END_ALLOW_THREADS} macro closes the
block.

The block above expands to the following code:

@example
PyThreadState *_save;

_save = PyEval_SaveThread();
... Do some blocking I/O operation ...
PyEval_RestoreThread(_save);
@end example

@geindex PyEval_RestoreThread (C function)
@geindex PyEval_SaveThread (C function)

Here is how these functions work:

The attached thread state implies that the GIL is held for the interpreter.
To detach it, @ref{647,,PyEval_SaveThread()} is called and the result is stored
in a local variable.

By detaching the thread state, the GIL is released, which allows other threads
to attach to the interpreter and execute while the current thread performs
blocking I/O. When the I/O operation is complete, the old thread state is
reattached by calling @ref{648,,PyEval_RestoreThread()}, which will wait until
the GIL can be acquired.

@cartouche
@quotation Note 
Performing blocking I/O is the most common use case for detaching
the thread state, but it is also useful to call it over long-running
native code that doesn’t need access to Python objects or Python’s C API.
For example, the standard @ref{13a,,zlib} and @ref{6c,,hashlib} modules detach the
@ref{5231,,thread state} when compressing or hashing
data.
@end quotation
@end cartouche

On a @ref{1791,,free-threaded build}, the @ref{165,,GIL} is usually out of the question,
but `detaching the thread state is still required', because the interpreter
periodically needs to block all threads to get a consistent view of Python objects
without the risk of race conditions.
For example, CPython currently suspends all threads for a short period of time
while running the garbage collector.

@cartouche
@quotation Warning 
Detaching the thread state can lead to unexpected behavior during interpreter
finalization. See @ref{5878,,Cautions regarding runtime finalization} for more
details.
@end quotation
@end cartouche

@menu
* APIs:: 

@end menu

@node APIs,,,Detaching the thread state from extension code
@anchor{c-api/threads apis}@anchor{5881}
@subsubsection APIs


The following macros are normally used without a trailing semicolon; look for
example usage in the Python source distribution.

@cartouche
@quotation Note 
These macros are still necessary on the @ref{1791,,free-threaded build} to prevent
deadlocks.
@end quotation
@end cartouche

@geindex Py_BEGIN_ALLOW_THREADS (C macro)
@anchor{c-api/threads c Py_BEGIN_ALLOW_THREADS}@anchor{521d}
@deffn {C Macro} Py_BEGIN_ALLOW_THREADS
` Part of the @ref{776,,Stable ABI}.'
This macro expands to @code{@{ PyThreadState *_save; _save = PyEval_SaveThread();}.
Note that it contains an opening brace; it must be matched with a following
@ref{c85,,Py_END_ALLOW_THREADS} macro.  See above for further discussion of this
macro.
@end deffn

@geindex Py_END_ALLOW_THREADS (C macro)
@anchor{c-api/threads c Py_END_ALLOW_THREADS}@anchor{c85}
@deffn {C Macro} Py_END_ALLOW_THREADS
` Part of the @ref{776,,Stable ABI}.'
This macro expands to @code{PyEval_RestoreThread(_save); @}}. Note that it contains
a closing brace; it must be matched with an earlier
@ref{521d,,Py_BEGIN_ALLOW_THREADS} macro.  See above for further discussion of
this macro.
@end deffn

@geindex Py_BLOCK_THREADS (C macro)
@anchor{c-api/threads c Py_BLOCK_THREADS}@anchor{5489}
@deffn {C Macro} Py_BLOCK_THREADS
` Part of the @ref{776,,Stable ABI}.'
This macro expands to @code{PyEval_RestoreThread(_save);}: it is equivalent to
@ref{c85,,Py_END_ALLOW_THREADS} without the closing brace.
@end deffn

@geindex Py_UNBLOCK_THREADS (C macro)
@anchor{c-api/threads c Py_UNBLOCK_THREADS}@anchor{54a9}
@deffn {C Macro} Py_UNBLOCK_THREADS
` Part of the @ref{776,,Stable ABI}.'
This macro expands to @code{_save = PyEval_SaveThread();}: it is equivalent to
@ref{521d,,Py_BEGIN_ALLOW_THREADS} without the opening brace and variable
declaration.
@end deffn

@node Non-Python created threads,Legacy API,Detaching the thread state from extension code,Thread states and the global interpreter lock
@anchor{c-api/threads non-python-created-threads}@anchor{5882}
@subsection Non-Python created threads


When threads are created using the dedicated Python APIs (such as the
@ref{f3,,threading} module), a thread state is automatically associated with them,
However, when a thread is created from native code (for example, by a
third-party library with its own thread management), it doesn’t hold an
attached thread state.

If you need to call Python code from these threads (often this will be part
of a callback API provided by the aforementioned third-party library),
you must first register these threads with the interpreter by
creating a new thread state and attaching it.

The most robust way to do this is through @ref{5423,,PyThreadState_New()} followed
by @ref{5424,,PyThreadState_Swap()}.

@cartouche
@quotation Note 
@code{PyThreadState_New} requires an argument pointing to the desired
interpreter; such a pointer can be acquired via a call to
@ref{64c,,PyInterpreterState_Get()} from the code where the thread was
created.
@end quotation
@end cartouche

For example:

@example
/* The return value of PyInterpreterState_Get() from the
   function that created this thread. */
PyInterpreterState *interp = thread_data->interp;

/* Create a new thread state for the interpreter. It does not start out
   attached. */
PyThreadState *tstate = PyThreadState_New(interp);

/* Attach the thread state, which will acquire the GIL. */
PyThreadState_Swap(tstate);

/* Perform Python actions here. */
result = CallSomeFunction();
/* evaluate result or handle exception */

/* Destroy the thread state. No Python API allowed beyond this point. */
PyThreadState_Clear(tstate);
PyThreadState_DeleteCurrent();
@end example

@cartouche
@quotation Warning 
If the interpreter finalized before @code{PyThreadState_Swap} was called, then
@code{interp} will be a dangling pointer!
@end quotation
@end cartouche

@node Legacy API,Cautions about fork,Non-Python created threads,Thread states and the global interpreter lock
@anchor{c-api/threads gilstate}@anchor{5883}@anchor{c-api/threads legacy-api}@anchor{5884}
@subsection Legacy API


Another common pattern to call Python code from a non-Python thread is to use
@ref{64a,,PyGILState_Ensure()} followed by a call to @ref{64b,,PyGILState_Release()}.

These functions do not work well when multiple interpreters exist in the Python
process. If no Python interpreter has ever been used in the current thread (which
is common for threads created outside Python), @code{PyGILState_Ensure} will create
and attach a thread state for the “main” interpreter (the first interpreter in
the Python process).

Additionally, these functions have thread-safety issues during interpreter
finalization. Using @code{PyGILState_Ensure} during finalization will likely
crash the process.

Usage of these functions look like such:

@example
PyGILState_STATE gstate;
gstate = PyGILState_Ensure();

/* Perform Python actions here. */
result = CallSomeFunction();
/* evaluate result or handle exception */

/* Release the thread. No Python API allowed beyond this point. */
PyGILState_Release(gstate);
@end example

@node Cautions about fork,High-level APIs,Legacy API,Thread states and the global interpreter lock
@anchor{c-api/threads cautions-about-fork}@anchor{5885}@anchor{c-api/threads fork-and-threads}@anchor{5580}
@subsection Cautions about fork()


Another important thing to note about threads is their behaviour in the face
of the C @code{fork()} call. On most systems with @code{fork()}, after a
process forks only the thread that issued the fork will exist.  This has a
concrete impact both on how locks must be handled and on all stored state
in CPython’s runtime.

The fact that only the “current” thread remains
means any locks held by other threads will never be released. Python solves
this for @ref{4b6,,os.fork()} by acquiring the locks it uses internally before
the fork, and releasing them afterwards. In addition, it resets any
@ref{369d,,Lock objects} in the child. When extending or embedding Python, there
is no way to inform Python of additional (non-Python) locks that need to be
acquired before or reset after a fork. OS facilities such as
@code{pthread_atfork()} would need to be used to accomplish the same thing.
Additionally, when extending or embedding Python, calling @code{fork()}
directly rather than through @code{os.fork()} (and returning to or calling
into Python) may result in a deadlock by one of Python’s internal locks
being held by a thread that is defunct after the fork.
@ref{42e,,PyOS_AfterFork_Child()} tries to reset the necessary locks, but is not
always able to.

The fact that all other threads go away also means that CPython’s
runtime state there must be cleaned up properly, which @ref{4b6,,os.fork()}
does.  This means finalizing all other @ref{995,,PyThreadState} objects
belonging to the current interpreter and all other
@ref{ac0,,PyInterpreterState} objects.  Due to this and the special
nature of the @ref{164,,“main” interpreter},
@code{fork()} should only be called in that interpreter’s “main”
thread, where the CPython global runtime was originally initialized.
The only exception is if @code{exec()} will be called immediately
after.

@node High-level APIs,GIL-state APIs,Cautions about fork,Thread states and the global interpreter lock
@anchor{c-api/threads high-level-apis}@anchor{5886}
@subsection High-level APIs


These are the most commonly used types and functions when writing multi-threaded
C extensions.

@geindex PyThreadState (C type)
@anchor{c-api/threads c PyThreadState}@anchor{995}
@deffn {C Type} type PyThreadState
` Part of the @ref{776,,Limited API} (as an opaque struct).'
This data structure represents the state of a single thread.  The only public
data member is:

@geindex PyThreadState.interp (C member)
@anchor{c-api/threads c PyThreadState interp}@anchor{5887}
@deffn {C Member} @ref{ac0,,PyInterpreterState} *interp

This thread’s interpreter state.
@end deffn
@end deffn

@geindex PyEval_InitThreads (C function)
@anchor{c-api/threads c PyEval_InitThreads}@anchor{19fb}
@deffn {C Function} void PyEval_InitThreads ()
` Part of the @ref{776,,Stable ABI}.'
@geindex PyEval_AcquireThread()
@geindex PyEval_ReleaseThread()
@geindex PyEval_SaveThread()
@geindex PyEval_RestoreThread()

Deprecated function which does nothing.

In Python 3.6 and older, this function created the GIL if it didn’t exist.


Changed in version 3.9: The function now does nothing.



Changed in version 3.7: This function is now called by @ref{45e,,Py_Initialize()}, so you don’t
have to call it yourself anymore.



Changed in version 3.2: This function cannot be called before @ref{45e,,Py_Initialize()} anymore.



Deprecated since version 3.9.


@geindex module; _thread
@end deffn

@geindex PyEval_SaveThread (C function)
@anchor{c-api/threads c PyEval_SaveThread}@anchor{647}
@deffn {C Function} @ref{995,,PyThreadState} *PyEval_SaveThread ()
` Part of the @ref{776,,Stable ABI}.'
Detach the @ref{5231,,attached thread state} and return it.
The thread will have no @ref{188f,,thread state} upon returning.
@end deffn

@geindex PyEval_RestoreThread (C function)
@anchor{c-api/threads c PyEval_RestoreThread}@anchor{648}
@deffn {C Function} void PyEval_RestoreThread (PyThreadState *tstate)
` Part of the @ref{776,,Stable ABI}.'
Set the @ref{5231,,attached thread state} to `tstate'.
The passed @ref{188f,,thread state} `should not' be attached,
otherwise deadlock ensues. `tstate' will be attached upon returning.

@cartouche
@quotation Note 
Calling this function from a thread when the runtime is finalizing will
hang the thread until the program exits, even if the thread was not
created by Python.  Refer to
@ref{5878,,Cautions regarding runtime finalization} for more details.
@end quotation
@end cartouche


Changed in version 3.14: Hangs the current thread, rather than terminating it, if called while the
interpreter is finalizing.

@end deffn

@geindex PyThreadState_Get (C function)
@anchor{c-api/threads c PyThreadState_Get}@anchor{615}
@deffn {C Function} @ref{995,,PyThreadState} *PyThreadState_Get ()
` Part of the @ref{776,,Stable ABI}.'
Return the @ref{5231,,attached thread state}. If the thread has no attached
thread state, (such as when inside of @ref{521d,,Py_BEGIN_ALLOW_THREADS}
block), then this issues a fatal error (so that the caller needn’t check
for @code{NULL}).

See also @ref{421,,PyThreadState_GetUnchecked()}.
@end deffn

@geindex PyThreadState_GetUnchecked (C function)
@anchor{c-api/threads c PyThreadState_GetUnchecked}@anchor{421}
@deffn {C Function} @ref{995,,PyThreadState} *PyThreadState_GetUnchecked ()

Similar to @ref{615,,PyThreadState_Get()}, but don’t kill the process with a
fatal error if it is NULL. The caller is responsible to check if the result
is NULL.


Added in version 3.13: In Python 3.5 to 3.12, the function was private and known as
@code{_PyThreadState_UncheckedGet()}.

@end deffn

@geindex PyThreadState_Swap (C function)
@anchor{c-api/threads c PyThreadState_Swap}@anchor{5424}
@deffn {C Function} @ref{995,,PyThreadState} *PyThreadState_Swap (PyThreadState *tstate)
` Part of the @ref{776,,Stable ABI}.'
Set the @ref{5231,,attached thread state} to `tstate', and return the
@ref{188f,,thread state} that was attached prior to calling.

This function is safe to call without an @ref{5231,,attached thread state}; it
will simply return @code{NULL} indicating that there was no prior thread state.


@subsubheading See also


@ref{533e,,PyEval_ReleaseThread()}


@cartouche
@quotation Note 
Similar to @ref{64a,,PyGILState_Ensure()}, this function will hang the
thread if the runtime is finalizing.
@end quotation
@end cartouche
@end deffn

@node GIL-state APIs,Low-level APIs,High-level APIs,Thread states and the global interpreter lock
@anchor{c-api/threads gil-state-apis}@anchor{5888}
@subsection GIL-state APIs


The following functions use thread-local storage, and are not compatible
with sub-interpreters:

@geindex PyGILState_STATE (C type)
@anchor{c-api/threads c PyGILState_STATE}@anchor{538e}
@deffn {C Type} type PyGILState_STATE
` Part of the @ref{776,,Stable ABI}.'
The type of the value returned by @ref{64a,,PyGILState_Ensure()} and passed to
@ref{64b,,PyGILState_Release()}.

@geindex PyGILState_STATE.PyGILState_LOCKED (C enumerator)
@anchor{c-api/threads c PyGILState_STATE PyGILState_LOCKED}@anchor{5889}
@deffn {C Enumerator} enumerator PyGILState_LOCKED

The GIL was already held when @ref{64a,,PyGILState_Ensure()} was called.
@end deffn

@geindex PyGILState_STATE.PyGILState_UNLOCKED (C enumerator)
@anchor{c-api/threads c PyGILState_STATE PyGILState_UNLOCKED}@anchor{588a}
@deffn {C Enumerator} enumerator PyGILState_UNLOCKED

The GIL was not held when @ref{64a,,PyGILState_Ensure()} was called.
@end deffn
@end deffn

@geindex PyGILState_Ensure (C function)
@anchor{c-api/threads c PyGILState_Ensure}@anchor{64a}
@deffn {C Function} @ref{538e,,PyGILState_STATE} PyGILState_Ensure ()
` Part of the @ref{776,,Stable ABI}.'
Ensure that the current thread is ready to call the Python C API regardless
of the current state of Python, or of the @ref{5231,,attached thread state}. This may
be called as many times as desired by a thread as long as each call is
matched with a call to @ref{64b,,PyGILState_Release()}. In general, other
thread-related APIs may be used between @ref{64a,,PyGILState_Ensure()} and
@code{PyGILState_Release()} calls as long as the thread state is restored to
its previous state before the Release().  For example, normal usage of the
@ref{521d,,Py_BEGIN_ALLOW_THREADS} and @ref{c85,,Py_END_ALLOW_THREADS} macros is
acceptable.

The return value is an opaque “handle” to the @ref{5231,,attached thread state} when
@ref{64a,,PyGILState_Ensure()} was called, and must be passed to
@ref{64b,,PyGILState_Release()} to ensure Python is left in the same state. Even
though recursive calls are allowed, these handles `cannot' be shared - each
unique call to @code{PyGILState_Ensure()} must save the handle for its call
to @code{PyGILState_Release()}.

When the function returns, there will be an @ref{5231,,attached thread state}
and the thread will be able to call arbitrary Python code.  Failure is a fatal error.

@cartouche
@quotation Warning 
Calling this function when the runtime is finalizing is unsafe. Doing
so will either hang the thread until the program ends, or fully crash
the interpreter in rare cases. Refer to
@ref{5878,,Cautions regarding runtime finalization} for more details.
@end quotation
@end cartouche


Changed in version 3.14: Hangs the current thread, rather than terminating it, if called while the
interpreter is finalizing.

@end deffn

@geindex PyGILState_Release (C function)
@anchor{c-api/threads c PyGILState_Release}@anchor{64b}
@deffn {C Function} void PyGILState_Release (PyGILState_STATE)
` Part of the @ref{776,,Stable ABI}.'
Release any resources previously acquired.  After this call, Python’s state will
be the same as it was prior to the corresponding @ref{64a,,PyGILState_Ensure()} call
(but generally this state will be unknown to the caller, hence the use of the
GILState API).

Every call to @ref{64a,,PyGILState_Ensure()} must be matched by a call to
@ref{64b,,PyGILState_Release()} on the same thread.
@end deffn

@geindex PyGILState_GetThisThreadState (C function)
@anchor{c-api/threads c PyGILState_GetThisThreadState}@anchor{538d}
@deffn {C Function} @ref{995,,PyThreadState} *PyGILState_GetThisThreadState ()
` Part of the @ref{776,,Stable ABI}.'
Get the @ref{5231,,attached thread state} for this thread.  May return @code{NULL} if no
GILState API has been used on the current thread.  Note that the main thread
always has such a thread-state, even if no auto-thread-state call has been
made on the main thread.  This is mainly a helper/diagnostic function.

@cartouche
@quotation Note 
This function may return non-@code{NULL} even when the @ref{188f,,thread state}
is detached.
Prefer @ref{615,,PyThreadState_Get()} or @ref{421,,PyThreadState_GetUnchecked()}
for most cases.
@end quotation
@end cartouche


@subsubheading See also


@ref{615,,PyThreadState_Get()}

@end deffn

@geindex PyGILState_Check (C function)
@anchor{c-api/threads c PyGILState_Check}@anchor{588b}
@deffn {C Function} int PyGILState_Check ()

Return @code{1} if the current thread is holding the @ref{165,,GIL} and @code{0} otherwise.
This function can be called from any thread at any time.
Only if it has had its @ref{5231,,thread state} initialized
via @ref{64a,,PyGILState_Ensure()} will it return @code{1}.
This is mainly a helper/diagnostic function.  It can be useful
for example in callback contexts or memory allocation functions when
knowing that the GIL is locked can allow the caller to perform sensitive
actions or otherwise behave differently.

@cartouche
@quotation Note 
If the current Python process has ever created a subinterpreter, this
function will `always' return @code{1}. Prefer @ref{421,,PyThreadState_GetUnchecked()}
for most cases.
@end quotation
@end cartouche


Added in version 3.4.

@end deffn

@node Low-level APIs,,GIL-state APIs,Thread states and the global interpreter lock
@anchor{c-api/threads low-level-apis}@anchor{588c}
@subsection Low-level APIs


@geindex PyThreadState_New (C function)
@anchor{c-api/threads c PyThreadState_New}@anchor{5423}
@deffn {C Function} @ref{995,,PyThreadState} *PyThreadState_New (PyInterpreterState *interp)
` Part of the @ref{776,,Stable ABI}.'
Create a new thread state object belonging to the given interpreter object.
An @ref{5231,,attached thread state} is not needed.
@end deffn

@geindex PyThreadState_Clear (C function)
@anchor{c-api/threads c PyThreadState_Clear}@anchor{19d4}
@deffn {C Function} void PyThreadState_Clear (PyThreadState *tstate)
` Part of the @ref{776,,Stable ABI}.'
Reset all information in a @ref{188f,,thread state} object.  `tstate'
must be @ref{5231,,attached}


Changed in version 3.9: This function now calls the @code{PyThreadState.on_delete} callback.
Previously, that happened in @ref{1dcd,,PyThreadState_Delete()}.



Changed in version 3.13: The @code{PyThreadState.on_delete} callback was removed.

@end deffn

@geindex PyThreadState_Delete (C function)
@anchor{c-api/threads c PyThreadState_Delete}@anchor{1dcd}
@deffn {C Function} void PyThreadState_Delete (PyThreadState *tstate)
` Part of the @ref{776,,Stable ABI}.'
Destroy a @ref{188f,,thread state} object.  `tstate' should not
be @ref{5231,,attached} to any thread.
`tstate' must have been reset with a previous call to
@ref{19d4,,PyThreadState_Clear()}.
@end deffn

@geindex PyThreadState_DeleteCurrent (C function)
@anchor{c-api/threads c PyThreadState_DeleteCurrent}@anchor{1dfa}
@deffn {C Function} void PyThreadState_DeleteCurrent (void)

Detach the @ref{5231,,attached thread state} (which must have been reset
with a previous call to @ref{19d4,,PyThreadState_Clear()}) and then destroy it.

No @ref{188f,,thread state} will be @ref{5231,,attached} upon
returning.
@end deffn

@geindex PyThreadState_GetFrame (C function)
@anchor{c-api/threads c PyThreadState_GetFrame}@anchor{996}
@deffn {C Function} @ref{991,,PyFrameObject} *PyThreadState_GetFrame (PyThreadState *tstate)
` Part of the @ref{776,,Stable ABI} since version 3.10.'
Get the current frame of the Python thread state `tstate'.

Return a @ref{5e2,,strong reference}. Return @code{NULL} if no frame is currently
executing.

See also @ref{1b7d,,PyEval_GetFrame()}.

`tstate' must not be @code{NULL}, and must be @ref{5231,,attached}.


Added in version 3.9.

@end deffn

@geindex PyThreadState_GetID (C function)
@anchor{c-api/threads c PyThreadState_GetID}@anchor{b70}
@deffn {C Function} uint64_t PyThreadState_GetID (PyThreadState *tstate)
` Part of the @ref{776,,Stable ABI} since version 3.10.'
Get the unique @ref{188f,,thread state} identifier of the Python thread state `tstate'.

`tstate' must not be @code{NULL}, and must be @ref{5231,,attached}.


Added in version 3.9.

@end deffn

@geindex PyThreadState_GetInterpreter (C function)
@anchor{c-api/threads c PyThreadState_GetInterpreter}@anchor{b6f}
@deffn {C Function} @ref{ac0,,PyInterpreterState} *PyThreadState_GetInterpreter (PyThreadState *tstate)
` Part of the @ref{776,,Stable ABI} since version 3.10.'
Get the interpreter of the Python thread state `tstate'.

`tstate' must not be @code{NULL}, and must be @ref{5231,,attached}.


Added in version 3.9.

@end deffn

@geindex PyThreadState_EnterTracing (C function)
@anchor{c-api/threads c PyThreadState_EnterTracing}@anchor{95f}
@deffn {C Function} void PyThreadState_EnterTracing (PyThreadState *tstate)

Suspend tracing and profiling in the Python thread state `tstate'.

Resume them using the @ref{960,,PyThreadState_LeaveTracing()} function.


Added in version 3.11.

@end deffn

@geindex PyThreadState_LeaveTracing (C function)
@anchor{c-api/threads c PyThreadState_LeaveTracing}@anchor{960}
@deffn {C Function} void PyThreadState_LeaveTracing (PyThreadState *tstate)

Resume tracing and profiling in the Python thread state `tstate' suspended
by the @ref{95f,,PyThreadState_EnterTracing()} function.

See also @ref{663,,PyEval_SetTrace()} and @ref{1709,,PyEval_SetProfile()}
functions.


Added in version 3.11.

@end deffn

@geindex PyUnstable_ThreadState_SetStackProtection (C function)
@anchor{c-api/threads c PyUnstable_ThreadState_SetStackProtection}@anchor{464}
@deffn {C Function} int PyUnstable_ThreadState_SetStackProtection (PyThreadState *tstate, void *stack_start_addr, size_t stack_size)

@cartouche
@quotation This is Unstable API. It may change without warning in minor releases. `This is @ref{76a,,Unstable API}. It may change without warning in minor releases.'
@end quotation
@end cartouche

Set the stack protection start address and stack protection size
of a Python thread state.

On success, return @code{0}.
On failure, set an exception and return @code{-1}.

CPython implements @ref{555f,,recursion control} for C code by raising
@ref{f6e,,RecursionError} when it notices that the machine execution stack is close
to overflow. See for example the @ref{3d0,,Py_EnterRecursiveCall()} function.
For this, it needs to know the location of the current thread’s stack, which it
normally gets from the operating system.
When the stack is changed, for example using context switching techniques like the
Boost library’s @code{boost::context}, you must call
@ref{464,,PyUnstable_ThreadState_SetStackProtection()} to inform CPython of the change.

Call @ref{464,,PyUnstable_ThreadState_SetStackProtection()} either before
or after changing the stack.
Do not call any other Python C API between the call and the stack
change.

See @ref{465,,PyUnstable_ThreadState_ResetStackProtection()} for undoing this operation.


Added in version 3.15.

@end deffn

@geindex PyUnstable_ThreadState_ResetStackProtection (C function)
@anchor{c-api/threads c PyUnstable_ThreadState_ResetStackProtection}@anchor{465}
@deffn {C Function} void PyUnstable_ThreadState_ResetStackProtection (PyThreadState *tstate)

@cartouche
@quotation This is Unstable API. It may change without warning in minor releases. `This is @ref{76a,,Unstable API}. It may change without warning in minor releases.'
@end quotation
@end cartouche

Reset the stack protection start address and stack protection size
of a Python thread state to the operating system defaults.

See @ref{464,,PyUnstable_ThreadState_SetStackProtection()} for an explanation.


Added in version 3.15.

@end deffn

@geindex PyThreadState_GetDict (C function)
@anchor{c-api/threads c PyThreadState_GetDict}@anchor{5422}
@deffn {C Function} @ref{5df,,PyObject} *PyThreadState_GetDict ()
`Return value: Borrowed reference.'` Part of the @ref{776,,Stable ABI}.'
Return a dictionary in which extensions can store thread-specific state
information.  Each extension should use a unique key to use to store state in
the dictionary.  It is okay to call this function when no @ref{188f,,thread state}
is @ref{5231,,attached}. If this function returns
@code{NULL}, no exception has been raised and the caller should assume no
thread state is attached.
@end deffn

@geindex PyEval_AcquireThread (C function)
@anchor{c-api/threads c PyEval_AcquireThread}@anchor{649}
@deffn {C Function} void PyEval_AcquireThread (PyThreadState *tstate)
` Part of the @ref{776,,Stable ABI}.'
@ref{5231,,Attach} `tstate' to the current thread,
which must not be @code{NULL} or already attached.

The calling thread must not already have an @ref{5231,,attached thread state}.

@cartouche
@quotation Note 
Calling this function from a thread when the runtime is finalizing will
hang the thread until the program exits, even if the thread was not
created by Python.  Refer to
@ref{5878,,Cautions regarding runtime finalization} for more details.
@end quotation
@end cartouche


Changed in version 3.8: Updated to be consistent with @ref{648,,PyEval_RestoreThread()},
@ref{c85,,Py_END_ALLOW_THREADS()}, and @ref{64a,,PyGILState_Ensure()},
and terminate the current thread if called while the interpreter is finalizing.



Changed in version 3.14: Hangs the current thread, rather than terminating it, if called while the
interpreter is finalizing.


@ref{648,,PyEval_RestoreThread()} is a higher-level function which is always
available (even when threads have not been initialized).
@end deffn

@geindex PyEval_ReleaseThread (C function)
@anchor{c-api/threads c PyEval_ReleaseThread}@anchor{533e}
@deffn {C Function} void PyEval_ReleaseThread (PyThreadState *tstate)
` Part of the @ref{776,,Stable ABI}.'
Detach the @ref{5231,,attached thread state}.
The `tstate' argument, which must not be @code{NULL}, is only used to check
that it represents the attached thread state — if it isn’t, a fatal error is
reported.

@ref{647,,PyEval_SaveThread()} is a higher-level function which is always
available (even when threads have not been initialized).
@end deffn

@node Asynchronous notifications,Operating system thread APIs,Thread states and the global interpreter lock,Python/C API reference manual
@anchor{c-api/threads asynchronous-notifications}@anchor{588d}
@section Asynchronous notifications


A mechanism is provided to make asynchronous notifications to the main
interpreter thread.  These notifications take the form of a function
pointer and a void pointer argument.

@geindex Py_AddPendingCall (C function)
@anchor{c-api/threads c Py_AddPendingCall}@anchor{b7e}
@deffn {C Function} int Py_AddPendingCall (int (*func)(void*), void *arg)
` Part of the @ref{776,,Stable ABI}.'
Schedule a function to be called from the main interpreter thread.  On
success, @code{0} is returned and `func' is queued for being called in the
main thread.  On failure, @code{-1} is returned without setting any exception.

When successfully queued, `func' will be `eventually' called from the
main interpreter thread with the argument `arg'.  It will be called
asynchronously with respect to normally running Python code, but with
both these conditions met:


@itemize *

@item 
on a @ref{4ab,,bytecode} boundary;

@item 
with the main thread holding an @ref{5231,,attached thread state}
(`func' can therefore use the full C API).
@end itemize

`func' must return @code{0} on success, or @code{-1} on failure with an exception
set.  `func' won’t be interrupted to perform another asynchronous
notification recursively, but it can still be interrupted to switch
threads if the @ref{5231,,thread state} is detached.

This function doesn’t need an @ref{5231,,attached thread state}. However, to call this
function in a subinterpreter, the caller must have an attached thread state.
Otherwise, the function `func' can be scheduled to be called from the wrong interpreter.

@cartouche
@quotation Warning 
This is a low-level function, only useful for very special cases.
There is no guarantee that `func' will be called as quick as
possible.  If the main thread is busy executing a system call,
`func' won’t be called before the system call returns.  This
function is generally `not' suitable for calling Python code from
arbitrary C threads.  Instead, use the @ref{5883,,PyGILState API}.
@end quotation
@end cartouche


Added in version 3.1.



Changed in version 3.9: If this function is called in a subinterpreter, the function `func' is
now scheduled to be called from the subinterpreter, rather than being
called from the main interpreter. Each subinterpreter now has its own
list of scheduled calls.



Changed in version 3.12: This function now always schedules `func' to be run in the main
interpreter.

@end deffn

@geindex Py_MakePendingCalls (C function)
@anchor{c-api/threads c Py_MakePendingCalls}@anchor{5494}
@deffn {C Function} int Py_MakePendingCalls (void)
` Part of the @ref{776,,Stable ABI}.'
Execute all pending calls. This is usually executed automatically by the
interpreter.

This function returns @code{0} on success, and returns @code{-1} with an exception
set on failure.

If this is not called in the main thread of the main
interpreter, this function does nothing and returns @code{0}.
The caller must hold an @ref{5231,,attached thread state}.


Added in version 3.1.



Changed in version 3.12: This function only runs pending calls in the main interpreter.

@end deffn

@geindex PyThreadState_SetAsyncExc (C function)
@anchor{c-api/threads c PyThreadState_SetAsyncExc}@anchor{dc3}
@deffn {C Function} int PyThreadState_SetAsyncExc (unsigned long id, PyObject *exc)
` Part of the @ref{776,,Stable ABI}.'
Asynchronously raise an exception in a thread. The `id' argument is the thread
id of the target thread; `exc' is the exception object to be raised. This
function does not steal any references to `exc'. To prevent naive misuse, you
must write your own C extension to call this.  Must be called with an @ref{5231,,attached thread state}.
Returns the number of thread states modified; this is normally one, but will be
zero if the thread id isn’t found.  If `exc' is @code{NULL}, the pending
exception (if any) for the thread is cleared. This raises no exceptions.


Changed in version 3.7: The type of the `id' parameter changed from long to
unsigned long.

@end deffn

@node Operating system thread APIs,Synchronization primitives<2>,Asynchronous notifications,Python/C API reference manual
@anchor{c-api/threads operating-system-thread-apis}@anchor{588e}
@section Operating system thread APIs


@geindex PYTHREAD_INVALID_THREAD_ID (C macro)
@anchor{c-api/threads c PYTHREAD_INVALID_THREAD_ID}@anchor{588f}
@deffn {C Macro} PYTHREAD_INVALID_THREAD_ID

Sentinel value for an invalid thread ID.

This is currently equivalent to @code{(unsigned long)-1}.
@end deffn

@geindex PyThread_start_new_thread (C function)
@anchor{c-api/threads c PyThread_start_new_thread}@anchor{1e6d}
@deffn {C Function} unsigned long PyThread_start_new_thread (void (*func)(void*), void *arg)
` Part of the @ref{776,,Stable ABI}.'
Start function `func' in a new thread with argument `arg'.
The resulting thread is not intended to be joined.

`func' must not be @code{NULL}, but `arg' may be @code{NULL}.

On success, this function returns the identifier of the new thread; on failure,
this returns @ref{588f,,PYTHREAD_INVALID_THREAD_ID}.

The caller does not need to hold an @ref{5231,,attached thread state}.
@end deffn

@geindex PyThread_get_thread_ident (C function)
@anchor{c-api/threads c PyThread_get_thread_ident}@anchor{542c}
@deffn {C Function} unsigned long PyThread_get_thread_ident (void)
` Part of the @ref{776,,Stable ABI}.'
Return the identifier of the current thread, which will never be zero.

This function cannot fail, and the caller does not need to hold an
@ref{5231,,attached thread state}.


@subsubheading See also


@ref{1366,,threading.get_ident()}

@end deffn

@geindex PyThread_GetInfo (C function)
@anchor{c-api/threads c PyThread_GetInfo}@anchor{5425}
@deffn {C Function} @ref{5df,,PyObject} *PyThread_GetInfo (void)
` Part of the @ref{776,,Stable ABI} since version 3.3.'
Get general information about the current thread in the form of a
@ref{13cb,,struct sequence} object. This information is
accessible as @ref{135c,,sys.thread_info} in Python.

On success, this returns a new @ref{5e2,,strong reference} to the thread
information; on failure, this returns @code{NULL} with an exception set.

The caller must hold an @ref{5231,,attached thread state}.
@end deffn

@geindex PY_HAVE_THREAD_NATIVE_ID (C macro)
@anchor{c-api/threads c PY_HAVE_THREAD_NATIVE_ID}@anchor{5890}
@deffn {C Macro} PY_HAVE_THREAD_NATIVE_ID

This macro is defined when the system supports native thread IDs.
@end deffn

@geindex PyThread_get_thread_native_id (C function)
@anchor{c-api/threads c PyThread_get_thread_native_id}@anchor{1be5}
@deffn {C Function} unsigned long PyThread_get_thread_native_id (void)
` Part of the @ref{776,,Stable ABI} on platforms with native thread IDs.'
Get the native identifier of the current thread as it was assigned by the operating
system’s kernel, which will never be less than zero.

This function is only available when @ref{5890,,PY_HAVE_THREAD_NATIVE_ID} is
defined.

This function cannot fail, and the caller does not need to hold an
@ref{5231,,attached thread state}.


@subsubheading See also


@ref{c38,,threading.get_native_id()}

@end deffn

@geindex PyThread_exit_thread (C function)
@anchor{c-api/threads c PyThread_exit_thread}@anchor{5429}
@deffn {C Function} void PyThread_exit_thread (void)
` Part of the @ref{776,,Stable ABI}.'
Terminate the current thread. This function is generally considered unsafe
and should be avoided. It is kept solely for backwards compatibility.

This function is only safe to call if all functions in the full call
stack are written to safely allow it.

@cartouche
@quotation Warning 
If the current system uses POSIX threads (also known as “pthreads”),
this calls @code{pthread_exit(3)@footnote{https://manpages.debian.org/pthread_exit(3)}}, which attempts to unwind the stack
and call C++ destructors on some libc implementations. However, if a
@code{noexcept} function is reached, it may terminate the process.
Other systems, such as macOS, do unwinding.

On Windows, this function calls @code{_endthreadex()}, which kills the thread
without calling C++ destructors.

In any case, there is a risk of corruption on the thread’s stack.
@end quotation
@end cartouche


Deprecated since version 3.14.

@end deffn

@geindex PyThread_init_thread (C function)
@anchor{c-api/threads c PyThread_init_thread}@anchor{542d}
@deffn {C Function} void PyThread_init_thread (void)
` Part of the @ref{776,,Stable ABI}.'
Initialize @code{PyThread*} APIs. Python executes this function automatically,
so there’s little need to call it from an extension module.
@end deffn

@geindex PyThread_set_stacksize (C function)
@anchor{c-api/threads c PyThread_set_stacksize}@anchor{542f}
@deffn {C Function} int PyThread_set_stacksize (size_t size)
` Part of the @ref{776,,Stable ABI}.'
Set the stack size of the current thread to `size' bytes.

This function returns @code{0} on success, @code{-1} if `size' is invalid, or
@code{-2} if the system does not support changing the stack size. This function
does not set exceptions.

The caller does not need to hold an @ref{5231,,attached thread state}.
@end deffn

@geindex PyThread_get_stacksize (C function)
@anchor{c-api/threads c PyThread_get_stacksize}@anchor{542b}
@deffn {C Function} size_t PyThread_get_stacksize (void)
` Part of the @ref{776,,Stable ABI}.'
Return the stack size of the current thread in bytes, or @code{0} if the system’s
default stack size is in use.

The caller does not need to hold an @ref{5231,,attached thread state}.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Synchronization primitives<2>,Thread-local storage support,Operating system thread APIs,Python/C API reference manual
@anchor{c-api/synchronization doc}@anchor{5891}@anchor{c-api/synchronization synchronization}@anchor{5892}@anchor{c-api/synchronization synchronization-primitives}@anchor{5893}@anchor{c-api/synchronization translation-repo}@anchor{5894}
@section Synchronization primitives


The C-API provides a basic mutual exclusion lock.

@geindex PyMutex (C type)
@anchor{c-api/synchronization c PyMutex}@anchor{485}
@deffn {C Type} type PyMutex

A mutual exclusion lock.  The @code{PyMutex} should be initialized to
zero to represent the unlocked state.  For example:

@example
PyMutex mutex = @{0@};
@end example

Instances of @code{PyMutex} should not be copied or moved.  Both the
contents and address of a @code{PyMutex} are meaningful, and it must
remain at a fixed, writable location in memory.

@cartouche
@quotation Note 
A @code{PyMutex} currently occupies one byte, but the size should be
considered unstable.  The size may change in future Python releases
without a deprecation period.
@end quotation
@end cartouche


Added in version 3.13.

@end deffn

@geindex PyMutex_Lock (C function)
@anchor{c-api/synchronization c PyMutex_Lock}@anchor{5d0}
@deffn {C Function} void PyMutex_Lock (PyMutex *m)
` Thread safety: @ref{2778,,Atomic}.'
Lock mutex `m'.  If another thread has already locked it, the calling
thread will block until the mutex is unlocked.  While blocked, the thread
will temporarily detach the @ref{5231,,thread state} if one exists.


Added in version 3.13.

@end deffn

@geindex PyMutex_Unlock (C function)
@anchor{c-api/synchronization c PyMutex_Unlock}@anchor{5d1}
@deffn {C Function} void PyMutex_Unlock (PyMutex *m)
` Thread safety: @ref{2778,,Atomic}.'
Unlock mutex `m'. The mutex must be locked — otherwise, the function will
issue a fatal error.


Added in version 3.13.

@end deffn

@geindex PyMutex_IsLocked (C function)
@anchor{c-api/synchronization c PyMutex_IsLocked}@anchor{461}
@deffn {C Function} int PyMutex_IsLocked (PyMutex *m)
` Thread safety: @ref{2778,,Atomic}.'
Returns non-zero if the mutex `m' is currently locked, zero otherwise.

@cartouche
@quotation Note 
This function is intended for use in assertions and debugging only and
should not be used to make concurrency control decisions, as the lock
state may change immediately after the check.
@end quotation
@end cartouche


Added in version 3.14.

@end deffn

@menu
* Python critical section API:: 
* Legacy locking APIs:: 

@end menu

@node Python critical section API,Legacy locking APIs,,Synchronization primitives<2>
@anchor{c-api/synchronization id1}@anchor{5895}@anchor{c-api/synchronization python-critical-section-api}@anchor{2775}
@subsection Python critical section API


The critical section API provides a deadlock avoidance layer on top of
per-object locks for @ref{1f6,,free-threaded} CPython.  They are
intended to replace reliance on the @ref{474,,global interpreter lock}, and are
no-ops in versions of Python with the global interpreter lock.

Critical sections are intended to be used for custom types implemented
in C-API extensions. They should generally not be used with built-in types like
@ref{24f,,list} and @ref{184,,dict} because their public C-APIs
already use critical sections internally, with the notable
exception of @ref{19d2,,PyDict_Next()}, which requires critical section
to be acquired externally.

Critical sections avoid deadlocks by implicitly suspending active critical
sections, hence, they do not provide exclusive access such as provided by
traditional locks like @ref{485,,PyMutex}.  When a critical section is started,
the per-object lock for the object is acquired. If the code executed inside the
critical section calls C-API functions then it can suspend the critical section thereby
releasing the per-object lock, so other threads can acquire the per-object lock
for the same object.

Variants that accept @ref{485,,PyMutex} pointers rather than Python objects are also
available. Use these variants to start a critical section in a situation where
there is no @ref{5df,,PyObject} – for example, when working with a C type that
does not extend or wrap @code{PyObject} but still needs to call into the C
API in a manner that might lead to deadlocks.

The functions and structs used by the macros are exposed for cases
where C macros are not available. They should only be used as in the
given macro expansions. Note that the sizes and contents of the structures may
change in future Python versions.

@cartouche
@quotation Note 
Operations that need to lock two objects at once must use
@ref{5896,,Py_BEGIN_CRITICAL_SECTION2}.  You `cannot' use nested critical
sections to lock more than one object at once, because the inner critical
section may suspend the outer critical sections.  This API does not provide
a way to lock more than two objects at once.
@end quotation
@end cartouche

Example usage:

@example
static PyObject *
set_field(MyObject *self, PyObject *value)
@{
   Py_BEGIN_CRITICAL_SECTION(self);
   Py_SETREF(self->field, Py_XNewRef(value));
   Py_END_CRITICAL_SECTION();
   Py_RETURN_NONE;
@}
@end example

In the above example, @ref{79a,,Py_SETREF} calls @ref{791,,Py_DECREF}, which
can call arbitrary code through an object’s deallocation function.  The critical
section API avoids potential deadlocks due to reentrancy and lock ordering
by allowing the runtime to temporarily suspend the critical section if the
code triggered by the finalizer blocks and calls @ref{647,,PyEval_SaveThread()}.

@geindex Py_BEGIN_CRITICAL_SECTION (C macro)
@anchor{c-api/synchronization c Py_BEGIN_CRITICAL_SECTION}@anchor{570b}
@deffn {C Macro} Py_BEGIN_CRITICAL_SECTION (op)

Acquires the per-object lock for the object `op' and begins a
critical section.

In the free-threaded build, this macro expands to:

@example
@{
    PyCriticalSection _py_cs;
    PyCriticalSection_Begin(&_py_cs, (PyObject*)(op))
@end example

In the default build, this macro expands to @code{@{}.


Added in version 3.13.

@end deffn

@geindex Py_BEGIN_CRITICAL_SECTION_MUTEX (C macro)
@anchor{c-api/synchronization c Py_BEGIN_CRITICAL_SECTION_MUTEX}@anchor{5897}
@deffn {C Macro} Py_BEGIN_CRITICAL_SECTION_MUTEX (m)

Locks the mutex `m' and begins a critical section.

In the free-threaded build, this macro expands to:

@example
@{
     PyCriticalSection _py_cs;
     PyCriticalSection_BeginMutex(&_py_cs, m)
@end example

Note that unlike @ref{570b,,Py_BEGIN_CRITICAL_SECTION}, there is no cast for
the argument of the macro - it must be a @ref{485,,PyMutex} pointer.

On the default build, this macro expands to @code{@{}.


Added in version 3.14.

@end deffn

@geindex Py_END_CRITICAL_SECTION (C macro)
@anchor{c-api/synchronization c Py_END_CRITICAL_SECTION}@anchor{5898}
@deffn {C Macro} Py_END_CRITICAL_SECTION ()

Ends the critical section and releases the per-object lock.

In the free-threaded build, this macro expands to:

@example
    PyCriticalSection_End(&_py_cs);
@}
@end example

In the default build, this macro expands to @code{@}}.


Added in version 3.13.

@end deffn

@geindex Py_BEGIN_CRITICAL_SECTION2 (C macro)
@anchor{c-api/synchronization c Py_BEGIN_CRITICAL_SECTION2}@anchor{5896}
@deffn {C Macro} Py_BEGIN_CRITICAL_SECTION2 (a, b)

Acquires the per-object locks for the objects `a' and `b' and begins a
critical section.  The locks are acquired in a consistent order (lowest
address first) to avoid lock ordering deadlocks.

In the free-threaded build, this macro expands to:

@example
@{
    PyCriticalSection2 _py_cs2;
    PyCriticalSection2_Begin(&_py_cs2, (PyObject*)(a), (PyObject*)(b))
@end example

In the default build, this macro expands to @code{@{}.


Added in version 3.13.

@end deffn

@geindex Py_BEGIN_CRITICAL_SECTION2_MUTEX (C macro)
@anchor{c-api/synchronization c Py_BEGIN_CRITICAL_SECTION2_MUTEX}@anchor{5899}
@deffn {C Macro} Py_BEGIN_CRITICAL_SECTION2_MUTEX (m1, m2)

Locks the mutexes `m1' and `m2' and begins a critical section.

In the free-threaded build, this macro expands to:

@example
@{
     PyCriticalSection2 _py_cs2;
     PyCriticalSection2_BeginMutex(&_py_cs2, m1, m2)
@end example

Note that unlike @ref{5896,,Py_BEGIN_CRITICAL_SECTION2}, there is no cast for
the arguments of the macro - they must be @ref{485,,PyMutex} pointers.

On the default build, this macro expands to @code{@{}.


Added in version 3.14.

@end deffn

@geindex Py_END_CRITICAL_SECTION2 (C macro)
@anchor{c-api/synchronization c Py_END_CRITICAL_SECTION2}@anchor{589a}
@deffn {C Macro} Py_END_CRITICAL_SECTION2 ()

Ends the critical section and releases the per-object locks.

In the free-threaded build, this macro expands to:

@example
    PyCriticalSection2_End(&_py_cs2);
@}
@end example

In the default build, this macro expands to @code{@}}.


Added in version 3.13.

@end deffn

@node Legacy locking APIs,,Python critical section API,Synchronization primitives<2>
@anchor{c-api/synchronization legacy-locking-apis}@anchor{589b}
@subsection Legacy locking APIs


These APIs are obsolete since Python 3.13 with the introduction of
@ref{485,,PyMutex}.

@geindex PyThread_type_lock (C type)
@anchor{c-api/synchronization c PyThread_type_lock}@anchor{589c}
@deffn {C Type} type PyThread_type_lock

A pointer to a mutual exclusion lock.
@end deffn

@geindex PyLockStatus (C type)
@anchor{c-api/synchronization c PyLockStatus}@anchor{589d}
@deffn {C Type} type PyLockStatus

The result of acquiring a lock with a timeout.

@geindex PY_LOCK_FAILURE (C enumerator)
@anchor{c-api/synchronization c PY_LOCK_FAILURE}@anchor{589e}
@deffn {C Enumerator} enumerator PY_LOCK_FAILURE

Failed to acquire the lock.
@end deffn

@geindex PY_LOCK_ACQUIRED (C enumerator)
@anchor{c-api/synchronization c PY_LOCK_ACQUIRED}@anchor{589f}
@deffn {C Enumerator} enumerator PY_LOCK_ACQUIRED

The lock was successfully acquired.
@end deffn

@geindex PY_LOCK_INTR (C enumerator)
@anchor{c-api/synchronization c PY_LOCK_INTR}@anchor{58a0}
@deffn {C Enumerator} enumerator PY_LOCK_INTR

The lock was interrupted by a signal.
@end deffn
@end deffn

@geindex PyThread_allocate_lock (C function)
@anchor{c-api/synchronization c PyThread_allocate_lock}@anchor{5428}
@deffn {C Function} @ref{589c,,PyThread_type_lock} PyThread_allocate_lock (void)
` Part of the @ref{776,,Stable ABI}.'
Allocate a new lock.

On success, this function returns a lock; on failure, this
function returns @code{0} without an exception set.

The caller does not need to hold an @ref{5231,,attached thread state}.
@end deffn

@geindex PyThread_free_lock (C function)
@anchor{c-api/synchronization c PyThread_free_lock}@anchor{542a}
@deffn {C Function} void PyThread_free_lock (PyThread_type_lock lock)
` Part of the @ref{776,,Stable ABI}.'
Destroy `lock'. The lock should not be held by any thread when calling
this.

The caller does not need to hold an @ref{5231,,attached thread state}.
@end deffn

@geindex PyThread_acquire_lock_timed (C function)
@anchor{c-api/synchronization c PyThread_acquire_lock_timed}@anchor{5427}
@deffn {C Function} @ref{589d,,PyLockStatus} PyThread_acquire_lock_timed (PyThread_type_lock lock, long long microseconds, int intr_flag)
` Part of the @ref{776,,Stable ABI}.'
Acquire `lock' with a timeout.

This will wait for `microseconds' microseconds to acquire the lock. If the
timeout expires, this function returns @ref{589e,,PY_LOCK_FAILURE}.
If `microseconds' is @code{-1}, this will wait indefinitely until the lock has
been released.

If `intr_flag' is @code{1}, acquiring the lock may be interrupted by a signal,
in which case this function returns @ref{58a0,,PY_LOCK_INTR}. Upon
interruption, it’s generally expected that the caller makes a call to
@ref{5494,,Py_MakePendingCalls()} to propagate an exception to Python code.

If the lock is successfully acquired, this function returns
@ref{589f,,PY_LOCK_ACQUIRED}.

The caller does not need to hold an @ref{5231,,attached thread state}.
@end deffn

@geindex PyThread_acquire_lock (C function)
@anchor{c-api/synchronization c PyThread_acquire_lock}@anchor{5426}
@deffn {C Function} int PyThread_acquire_lock (PyThread_type_lock lock, int waitflag)
` Part of the @ref{776,,Stable ABI}.'
Acquire `lock'.

If `waitflag' is @code{1} and another thread currently holds the lock, this
function will wait until the lock can be acquired and will always return
@code{1}.

If `waitflag' is @code{0} and another thread holds the lock, this function will
not wait and instead return @code{0}. If the lock is not held by any other
thread, then this function will acquire it and return @code{1}.

Unlike @ref{5427,,PyThread_acquire_lock_timed()}, acquiring the lock cannot be
interrupted by a signal.

The caller does not need to hold an @ref{5231,,attached thread state}.
@end deffn

@geindex PyThread_release_lock (C function)
@anchor{c-api/synchronization c PyThread_release_lock}@anchor{542e}
@deffn {C Function} int PyThread_release_lock (PyThread_type_lock lock)
` Part of the @ref{776,,Stable ABI}.'
Release `lock'. If `lock' is not held, then this function issues a
fatal error.

The caller does not need to hold an @ref{5231,,attached thread state}.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Thread-local storage support,Multiple interpreters in a Python process,Synchronization primitives<2>,Python/C API reference manual
@anchor{c-api/tls doc}@anchor{58a1}@anchor{c-api/tls thread-local-storage}@anchor{58a2}@anchor{c-api/tls thread-local-storage-support}@anchor{58a3}@anchor{c-api/tls translation-repo}@anchor{58a4}
@section Thread-local storage support


The Python interpreter provides low-level support for thread-local storage
(TLS) which wraps the underlying native TLS implementation to support the
Python-level thread-local storage API (@ref{18a8,,threading.local}).  The
CPython C level APIs are similar to those offered by pthreads and Windows:
use a thread key and functions to associate a void* value per
thread.

A @ref{188f,,thread state} does `not' need to be @ref{5231,,attached}
when calling these functions; they supply their own locking.

Note that @code{Python.h} does not include the declaration of the TLS APIs,
you need to include @code{pythread.h} to use thread-local storage.

@cartouche
@quotation Note 
None of these API functions handle memory management on behalf of the
void* values.  You need to allocate and deallocate them yourself.
If the void* values happen to be @ref{5df,,PyObject}*, these
functions don’t do refcount operations on them either.
@end quotation
@end cartouche

@menu
* Thread-specific storage API:: 
* Dynamic allocation:: 
* Methods: Methods<2>. 
* Legacy APIs:: 

@end menu

@node Thread-specific storage API,Dynamic allocation,,Thread-local storage support
@anchor{c-api/tls id1}@anchor{58a5}@anchor{c-api/tls thread-specific-storage-api}@anchor{cdb}
@subsection Thread-specific storage API


The thread-specific storage (TSS) API was introduced to supersede the use of the existing TLS API within the
CPython interpreter.  This API uses a new type @ref{cdc,,Py_tss_t} instead of
int to represent thread keys.


Added in version 3.7.



@subsubheading See also


“A New C-API for Thread-Local Storage in CPython” (
@geindex Python Enhancement Proposals; PEP 539
PEP 539@footnote{https://peps.python.org/pep-0539/})


@geindex Py_tss_t (C type)
@anchor{c-api/tls c Py_tss_t}@anchor{cdc}
@deffn {C Type} type Py_tss_t

This data structure represents the state of a thread key, the definition of
which may depend on the underlying TLS implementation, and it has an
internal field representing the key’s initialization state.  There are no
public members in this structure.

When @ref{776,,Py_LIMITED_API} is not defined, static allocation of
this type by @ref{58a6,,Py_tss_NEEDS_INIT} is allowed.
@end deffn

@geindex Py_tss_NEEDS_INIT (C macro)
@anchor{c-api/tls c Py_tss_NEEDS_INIT}@anchor{58a6}
@deffn {C Macro} Py_tss_NEEDS_INIT

This macro expands to the initializer for @ref{cdc,,Py_tss_t} variables.
Note that this macro won’t be defined with @ref{776,,Py_LIMITED_API}.
@end deffn

@node Dynamic allocation,Methods<2>,Thread-specific storage API,Thread-local storage support
@anchor{c-api/tls dynamic-allocation}@anchor{58a7}
@subsection Dynamic allocation


Dynamic allocation of the @ref{cdc,,Py_tss_t}, required in extension modules
built with @ref{776,,Py_LIMITED_API}, where static allocation of this type
is not possible due to its implementation being opaque at build time.

@geindex PyThread_tss_alloc (C function)
@anchor{c-api/tls c PyThread_tss_alloc}@anchor{436}
@deffn {C Function} @ref{cdc,,Py_tss_t} *PyThread_tss_alloc ()
` Part of the @ref{776,,Stable ABI} since version 3.7.'
Return a value which is the same state as a value initialized with
@ref{58a6,,Py_tss_NEEDS_INIT}, or @code{NULL} in the case of dynamic allocation
failure.
@end deffn

@geindex PyThread_tss_free (C function)
@anchor{c-api/tls c PyThread_tss_free}@anchor{438}
@deffn {C Function} void PyThread_tss_free (Py_tss_t *key)
` Part of the @ref{776,,Stable ABI} since version 3.7.'
Free the given `key' allocated by @ref{436,,PyThread_tss_alloc()}, after
first calling @ref{43e,,PyThread_tss_delete()} to ensure any associated
thread locals have been unassigned. This is a no-op if the `key'
argument is @code{NULL}.

@cartouche
@quotation Note 
A freed key becomes a dangling pointer. You should reset the key to
@code{NULL}.
@end quotation
@end cartouche
@end deffn

@node Methods<2>,Legacy APIs,Dynamic allocation,Thread-local storage support
@anchor{c-api/tls methods}@anchor{58a8}
@subsection Methods


The parameter `key' of these functions must not be @code{NULL}.  Moreover, the
behaviors of @ref{43a,,PyThread_tss_set()} and @ref{43c,,PyThread_tss_get()} are
undefined if the given @ref{cdc,,Py_tss_t} has not been initialized by
@ref{5430,,PyThread_tss_create()}.

@geindex PyThread_tss_is_created (C function)
@anchor{c-api/tls c PyThread_tss_is_created}@anchor{5431}
@deffn {C Function} int PyThread_tss_is_created (Py_tss_t *key)
` Part of the @ref{776,,Stable ABI} since version 3.7.'
Return a non-zero value if the given @ref{cdc,,Py_tss_t} has been initialized
by @ref{5430,,PyThread_tss_create()}.
@end deffn

@geindex PyThread_tss_create (C function)
@anchor{c-api/tls c PyThread_tss_create}@anchor{5430}
@deffn {C Function} int PyThread_tss_create (Py_tss_t *key)
` Part of the @ref{776,,Stable ABI} since version 3.7.'
Return a zero value on successful initialization of a TSS key.  The behavior
is undefined if the value pointed to by the `key' argument is not
initialized by @ref{58a6,,Py_tss_NEEDS_INIT}.  This function can be called
repeatedly on the same key – calling it on an already initialized key is a
no-op and immediately returns success.
@end deffn

@geindex PyThread_tss_delete (C function)
@anchor{c-api/tls c PyThread_tss_delete}@anchor{43e}
@deffn {C Function} void PyThread_tss_delete (Py_tss_t *key)
` Part of the @ref{776,,Stable ABI} since version 3.7.'
Destroy a TSS key to forget the values associated with the key across all
threads, and change the key’s initialization state to uninitialized.  A
destroyed key is able to be initialized again by
@ref{5430,,PyThread_tss_create()}. This function can be called repeatedly on
the same key – calling it on an already destroyed key is a no-op.
@end deffn

@geindex PyThread_tss_set (C function)
@anchor{c-api/tls c PyThread_tss_set}@anchor{43a}
@deffn {C Function} int PyThread_tss_set (Py_tss_t *key, void *value)
` Part of the @ref{776,,Stable ABI} since version 3.7.'
Return a zero value to indicate successfully associating a void*
value with a TSS key in the current thread.  Each thread has a distinct
mapping of the key to a void* value.
@end deffn

@geindex PyThread_tss_get (C function)
@anchor{c-api/tls c PyThread_tss_get}@anchor{43c}
@deffn {C Function} void *PyThread_tss_get (Py_tss_t *key)
` Part of the @ref{776,,Stable ABI} since version 3.7.'
Return the void* value associated with a TSS key in the current
thread.  This returns @code{NULL} if no value is associated with the key in the
current thread.
@end deffn

@node Legacy APIs,,Methods<2>,Thread-local storage support
@anchor{c-api/tls legacy-apis}@anchor{58a9}@anchor{c-api/tls thread-local-storage-api}@anchor{cda}
@subsection Legacy APIs



Deprecated since version 3.7: This API is superseded by the
@ref{cdb,,thread-specific storage (TSS) API}.


@cartouche
@quotation Note 
This version of the API does not support platforms where the native TLS key
is defined in a way that cannot be safely cast to @code{int}.  On such platforms,
@ref{435,,PyThread_create_key()} will return immediately with a failure status,
and the other TLS functions will all be no-ops on such platforms.
@end quotation
@end cartouche

Due to the compatibility problem noted above, this version of the API should not
be used in new code.

@geindex PyThread_create_key (C function)
@anchor{c-api/tls c PyThread_create_key}@anchor{435}
@deffn {C Function} int PyThread_create_key ()
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@geindex PyThread_delete_key (C function)
@anchor{c-api/tls c PyThread_delete_key}@anchor{437}
@deffn {C Function} void PyThread_delete_key (int key)
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@geindex PyThread_set_key_value (C function)
@anchor{c-api/tls c PyThread_set_key_value}@anchor{439}
@deffn {C Function} int PyThread_set_key_value (int key, void *value)
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@geindex PyThread_get_key_value (C function)
@anchor{c-api/tls c PyThread_get_key_value}@anchor{43b}
@deffn {C Function} void *PyThread_get_key_value (int key)
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@geindex PyThread_delete_key_value (C function)
@anchor{c-api/tls c PyThread_delete_key_value}@anchor{43d}
@deffn {C Function} void PyThread_delete_key_value (int key)
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@geindex PyThread_ReInitTLS (C function)
@anchor{c-api/tls c PyThread_ReInitTLS}@anchor{43f}
@deffn {C Function} void PyThread_ReInitTLS ()
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Multiple interpreters in a Python process,Profiling and tracing,Thread-local storage support,Python/C API reference manual
@anchor{c-api/subinterpreters doc}@anchor{58aa}@anchor{c-api/subinterpreters multiple-interpreters-in-a-python-process}@anchor{58ab}@anchor{c-api/subinterpreters sub-interpreter-support}@anchor{164}@anchor{c-api/subinterpreters translation-repo}@anchor{58ac}
@section Multiple interpreters in a Python process


While in most uses, you will only embed a single Python interpreter, there
are cases where you need to create several independent interpreters in the
same process and perhaps even in the same thread. Sub-interpreters allow
you to do that.

The “main” interpreter is the first one created when the runtime initializes.
It is usually the only Python interpreter in a process.  Unlike sub-interpreters,
the main interpreter has unique process-global responsibilities like signal
handling.  It is also responsible for execution during runtime initialization and
is usually the active interpreter during runtime finalization.  The
@ref{58ad,,PyInterpreterState_Main()} function returns a pointer to its state.

You can switch between sub-interpreters using the @ref{5424,,PyThreadState_Swap()}
function. You can create and destroy them using the following functions:

@geindex PyInterpreterConfig (C type)
@anchor{c-api/subinterpreters c PyInterpreterConfig}@anchor{78f}
@deffn {C Type} type PyInterpreterConfig

Structure containing most parameters to configure a sub-interpreter.
Its values are used only in @ref{68a,,Py_NewInterpreterFromConfig()} and
never modified by the runtime.


Added in version 3.12.


Structure fields:

@geindex PyInterpreterConfig.use_main_obmalloc (C member)
@anchor{c-api/subinterpreters c PyInterpreterConfig use_main_obmalloc}@anchor{4c77}
@deffn {C Member} int use_main_obmalloc

If this is @code{0} then the sub-interpreter will use its own
“object” allocator state.
Otherwise it will use (share) the main interpreter’s.

If this is @code{0} then
@ref{58ae,,check_multi_interp_extensions}
must be @code{1} (non-zero).
If this is @code{1} then @ref{58af,,gil}
must not be @ref{58b0,,PyInterpreterConfig_OWN_GIL}.
@end deffn

@geindex PyInterpreterConfig.allow_fork (C member)
@anchor{c-api/subinterpreters c PyInterpreterConfig allow_fork}@anchor{58b1}
@deffn {C Member} int allow_fork

If this is @code{0} then the runtime will not support forking the
process in any thread where the sub-interpreter is currently active.
Otherwise fork is unrestricted.

Note that the @ref{dc,,subprocess} module still works
when fork is disallowed.
@end deffn

@geindex PyInterpreterConfig.allow_exec (C member)
@anchor{c-api/subinterpreters c PyInterpreterConfig allow_exec}@anchor{58b2}
@deffn {C Member} int allow_exec

If this is @code{0} then the runtime will not support replacing the
current process via exec (e.g. @ref{3089,,os.execv()}) in any thread
where the sub-interpreter is currently active.
Otherwise exec is unrestricted.

Note that the @ref{dc,,subprocess} module still works
when exec is disallowed.
@end deffn

@geindex PyInterpreterConfig.allow_threads (C member)
@anchor{c-api/subinterpreters c PyInterpreterConfig allow_threads}@anchor{58b3}
@deffn {C Member} int allow_threads

If this is @code{0} then the sub-interpreter’s @ref{f3,,threading} module
won’t create threads.
Otherwise threads are allowed.
@end deffn

@geindex PyInterpreterConfig.allow_daemon_threads (C member)
@anchor{c-api/subinterpreters c PyInterpreterConfig allow_daemon_threads}@anchor{58b4}
@deffn {C Member} int allow_daemon_threads

If this is @code{0} then the sub-interpreter’s @ref{f3,,threading} module
won’t create daemon threads.
Otherwise daemon threads are allowed (as long as
@ref{58b3,,allow_threads} is non-zero).
@end deffn

@geindex PyInterpreterConfig.check_multi_interp_extensions (C member)
@anchor{c-api/subinterpreters c PyInterpreterConfig check_multi_interp_extensions}@anchor{58ae}
@deffn {C Member} int check_multi_interp_extensions

If this is @code{0} then all extension modules may be imported,
including legacy (single-phase init) modules,
in any thread where the sub-interpreter is currently active.
Otherwise only multi-phase init extension modules
(see 
@geindex Python Enhancement Proposals; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}) may be imported.
(Also see @ref{54b2,,Py_mod_multiple_interpreters}.)

This must be @code{1} (non-zero) if
@ref{4c77,,use_main_obmalloc} is @code{0}.
@end deffn

@geindex PyInterpreterConfig.gil (C member)
@anchor{c-api/subinterpreters c PyInterpreterConfig gil}@anchor{58af}
@deffn {C Member} int gil

This determines the operation of the GIL for the sub-interpreter.
It may be one of the following:

@geindex PyInterpreterConfig_DEFAULT_GIL (C macro)
@anchor{c-api/subinterpreters c PyInterpreterConfig_DEFAULT_GIL}@anchor{58b5}
@deffn {C Macro} PyInterpreterConfig_DEFAULT_GIL

Use the default selection (@ref{58b6,,PyInterpreterConfig_SHARED_GIL}).
@end deffn

@geindex PyInterpreterConfig_SHARED_GIL (C macro)
@anchor{c-api/subinterpreters c PyInterpreterConfig_SHARED_GIL}@anchor{58b6}
@deffn {C Macro} PyInterpreterConfig_SHARED_GIL

Use (share) the main interpreter’s GIL.
@end deffn

@geindex PyInterpreterConfig_OWN_GIL (C macro)
@anchor{c-api/subinterpreters c PyInterpreterConfig_OWN_GIL}@anchor{58b0}
@deffn {C Macro} PyInterpreterConfig_OWN_GIL

Use the sub-interpreter’s own GIL.
@end deffn

If this is @ref{58b0,,PyInterpreterConfig_OWN_GIL} then
@ref{4c77,,PyInterpreterConfig.use_main_obmalloc} must be @code{0}.
@end deffn
@end deffn

@geindex Py_NewInterpreterFromConfig (C function)
@anchor{c-api/subinterpreters c Py_NewInterpreterFromConfig}@anchor{68a}
@deffn {C Function} @ref{baa,,PyStatus} Py_NewInterpreterFromConfig (PyThreadState **tstate_p, const PyInterpreterConfig *config)

@geindex module; builtins
@geindex module; __main__
@geindex module; sys
@geindex stdout (in module sys)
@geindex stderr (in module sys)
@geindex stdin (in module sys)

Create a new sub-interpreter.  This is an (almost) totally separate environment
for the execution of Python code.  In particular, the new interpreter has
separate, independent versions of all imported modules, including the
fundamental modules @ref{13,,builtins}, @ref{1,,__main__} and @ref{df,,sys}.  The
table of loaded modules (@code{sys.modules}) and the module search path
(@code{sys.path}) are also separate.  The new environment has no @code{sys.argv}
variable.  It has new standard I/O stream file objects @code{sys.stdin},
@code{sys.stdout} and @code{sys.stderr} (however these refer to the same underlying
file descriptors).

The given `config' controls the options with which the interpreter
is initialized.

Upon success, `tstate_p' will be set to the first @ref{188f,,thread state}
created in the new sub-interpreter.  This thread state is
@ref{5231,,attached}.
Note that no actual thread is created; see the discussion of thread states
below.  If creation of the new interpreter is unsuccessful,
`tstate_p' is set to @code{NULL};
no exception is set since the exception state is stored in the
attached thread state, which might not exist.

Like all other Python/C API functions, an @ref{5231,,attached thread state}
must be present before calling this function, but it might be detached upon
returning. On success, the returned thread state will be attached.
If the sub-interpreter is created with its own @ref{165,,GIL} then the
attached thread state of the calling interpreter will be detached.
When the function returns, the new interpreter’s @ref{188f,,thread state}
will be attached to the current thread and
the previous interpreter’s attached thread state will remain detached.


Added in version 3.12.


Sub-interpreters are most effective when isolated from each other,
with certain functionality restricted:

@example
PyInterpreterConfig config = @{
    .use_main_obmalloc = 0,
    .allow_fork = 0,
    .allow_exec = 0,
    .allow_threads = 1,
    .allow_daemon_threads = 0,
    .check_multi_interp_extensions = 1,
    .gil = PyInterpreterConfig_OWN_GIL,
@};
PyThreadState *tstate = NULL;
PyStatus status = Py_NewInterpreterFromConfig(&tstate, &config);
if (PyStatus_Exception(status)) @{
    Py_ExitStatusException(status);
@}
@end example

Note that the config is used only briefly and does not get modified.
During initialization the config’s values are converted into various
@ref{ac0,,PyInterpreterState} values.  A read-only copy of the config
may be stored internally on the @code{PyInterpreterState}.

@geindex Py_FinalizeEx (C function)
@geindex Py_Initialize (C function)

Extension modules are shared between (sub-)interpreters as follows:


@itemize *

@item 
For modules using multi-phase initialization,
e.g. @ref{10b9,,PyModule_FromDefAndSpec()}, a separate module object is
created and initialized for each interpreter.
Only C-level static and global variables are shared between these
module objects.

@item 
For modules using legacy
@ref{556e,,single-phase initialization},
e.g. @ref{5577,,PyModule_Create()}, the first time a particular extension
is imported, it is initialized normally, and a (shallow) copy of its
module’s dictionary is squirreled away.
When the same extension is imported by another (sub-)interpreter, a new
module is initialized and filled with the contents of this copy; the
extension’s @code{init} function is not called.
Objects in the module’s dictionary thus end up shared across
(sub-)interpreters, which might cause unwanted behavior (see
@ref{58b7,,Bugs and caveats} below).

Note that this is different from what happens when an extension is
imported after the interpreter has been completely re-initialized by
calling @ref{f17,,Py_FinalizeEx()} and @ref{45e,,Py_Initialize()}; in that
case, the extension’s @code{initmodule} function `is' called again.
As with multi-phase initialization, this means that only C-level static
and global variables are shared between these modules.
@end itemize

@geindex close (in module os)
@end deffn

@geindex Py_NewInterpreter (C function)
@anchor{c-api/subinterpreters c Py_NewInterpreter}@anchor{1b75}
@deffn {C Function} @ref{995,,PyThreadState} *Py_NewInterpreter (void)
` Part of the @ref{776,,Stable ABI}.'
@geindex module; builtins
@geindex module; __main__
@geindex module; sys
@geindex stdout (in module sys)
@geindex stderr (in module sys)
@geindex stdin (in module sys)

Create a new sub-interpreter.  This is essentially just a wrapper
around @ref{68a,,Py_NewInterpreterFromConfig()} with a config that
preserves the existing behavior.  The result is an unisolated
sub-interpreter that shares the main interpreter’s GIL, allows
fork/exec, allows daemon threads, and allows single-phase init
modules.
@end deffn

@geindex Py_EndInterpreter (C function)
@anchor{c-api/subinterpreters c Py_EndInterpreter}@anchor{188e}
@deffn {C Function} void Py_EndInterpreter (PyThreadState *tstate)
` Part of the @ref{776,,Stable ABI}.'
@geindex Py_FinalizeEx (C function)

Destroy the (sub-)interpreter represented by the given @ref{188f,,thread state}.
The given thread state must be @ref{5231,,attached}.
When the call returns, there will be no attached thread state.
All thread states associated with this interpreter are destroyed.

@ref{f17,,Py_FinalizeEx()} will destroy all sub-interpreters that
haven’t been explicitly destroyed at that point.
@end deffn

@menu
* A per-interpreter GIL:: 
* Bugs and caveats:: 
* High-level APIs: High-level APIs<2>. 
* Low-level APIs: Low-level APIs<2>. 
* Advanced debugger support:: 

@end menu

@node A per-interpreter GIL,Bugs and caveats,,Multiple interpreters in a Python process
@anchor{c-api/subinterpreters a-per-interpreter-gil}@anchor{58b8}@anchor{c-api/subinterpreters per-interpreter-gil}@anchor{58b9}
@subsection A per-interpreter GIL



Added in version 3.12.


Using @ref{68a,,Py_NewInterpreterFromConfig()} you can create
a sub-interpreter that is completely isolated from other interpreters,
including having its own GIL.  The most important benefit of this
isolation is that such an interpreter can execute Python code without
being blocked by other interpreters or blocking any others.  Thus a
single Python process can truly take advantage of multiple CPU cores
when running Python code.  The isolation also encourages a different
approach to concurrency than that of just using threads.
(See 
@geindex Python Enhancement Proposals; PEP 554
PEP 554@footnote{https://peps.python.org/pep-0554/} and 
@geindex Python Enhancement Proposals; PEP 684
PEP 684@footnote{https://peps.python.org/pep-0684/}.)

Using an isolated interpreter requires vigilance in preserving that
isolation.  That especially means not sharing any objects or mutable
state without guarantees about thread-safety.  Even objects that are
otherwise immutable (e.g. @code{None}, @code{(1, 5)}) can’t normally be shared
because of the refcount.  One simple but less-efficient approach around
this is to use a global lock around all use of some state (or object).
Alternately, effectively immutable objects (like integers or strings)
can be made safe in spite of their refcounts by making them @ref{292,,immortal}.
In fact, this has been done for the builtin singletons, small integers,
and a number of other builtin objects.

If you preserve isolation then you will have access to proper multi-core
computing without the complications that come with free-threading.
Failure to preserve isolation will expose you to the full consequences
of free-threading, including races and hard-to-debug crashes.

Aside from that, one of the main challenges of using multiple isolated
interpreters is how to communicate between them safely (not break
isolation) and efficiently.  The runtime and stdlib do not provide
any standard approach to this yet.  A future stdlib module would help
mitigate the effort of preserving isolation and expose effective tools
for communicating (and sharing) data between interpreters.

@node Bugs and caveats,High-level APIs<2>,A per-interpreter GIL,Multiple interpreters in a Python process
@anchor{c-api/subinterpreters bugs-and-caveats}@anchor{58b7}
@subsection Bugs and caveats


Because sub-interpreters (and the main interpreter) are part of the same
process, the insulation between them isn’t perfect — for example, using
low-level file operations like @ref{d71,,os.close()} they can
(accidentally or maliciously) affect each other’s open files.  Because of the
way extensions are shared between (sub-)interpreters, some extensions may not
work properly; this is especially likely when using single-phase initialization
or (static) global variables.
It is possible to insert objects created in one sub-interpreter into
a namespace of another (sub-)interpreter; this should be avoided if possible.

Special care should be taken to avoid sharing user-defined functions,
methods, instances or classes between sub-interpreters, since import
operations executed by such objects may affect the wrong (sub-)interpreter’s
dictionary of loaded modules. It is equally important to avoid sharing
objects from which the above are reachable.

Also note that combining this functionality with @code{PyGILState_*} APIs
is delicate, because these APIs assume a bijection between Python thread states
and OS-level threads, an assumption broken by the presence of sub-interpreters.
It is highly recommended that you don’t switch sub-interpreters between a pair
of matching @ref{64a,,PyGILState_Ensure()} and @ref{64b,,PyGILState_Release()} calls.
Furthermore, extensions (such as @ref{2e,,ctypes}) using these APIs to allow calling
of Python code from non-Python created threads will probably be broken when using
sub-interpreters.

@node High-level APIs<2>,Low-level APIs<2>,Bugs and caveats,Multiple interpreters in a Python process
@anchor{c-api/subinterpreters high-level-apis}@anchor{58ba}
@subsection High-level APIs


@geindex PyInterpreterState (C type)
@anchor{c-api/subinterpreters c PyInterpreterState}@anchor{ac0}
@deffn {C Type} type PyInterpreterState
` Part of the @ref{776,,Limited API} (as an opaque struct).'
This data structure represents the state shared by a number of cooperating
threads.  Threads belonging to the same interpreter share their module
administration and a few other internal items. There are no public members in
this structure.

Threads belonging to different interpreters initially share nothing, except
process state like available memory, open file descriptors and such.  The global
interpreter lock is also shared by all threads, regardless of to which
interpreter they belong.


Changed in version 3.12: 
@geindex Python Enhancement Proposals; PEP 684
PEP 684@footnote{https://peps.python.org/pep-0684/} introduced the possibility
of a @ref{58b9,,per-interpreter GIL}.
See @ref{68a,,Py_NewInterpreterFromConfig()}.

@end deffn

@geindex PyInterpreterState_Get (C function)
@anchor{c-api/subinterpreters c PyInterpreterState_Get}@anchor{64c}
@deffn {C Function} @ref{ac0,,PyInterpreterState} *PyInterpreterState_Get (void)
` Part of the @ref{776,,Stable ABI} since version 3.9.'
Get the current interpreter.

Issue a fatal error if there is no @ref{5231,,attached thread state}.
It cannot return NULL.


Added in version 3.9.

@end deffn

@geindex PyInterpreterState_GetID (C function)
@anchor{c-api/subinterpreters c PyInterpreterState_GetID}@anchor{dc5}
@deffn {C Function} int64_t PyInterpreterState_GetID (PyInterpreterState *interp)
` Part of the @ref{776,,Stable ABI} since version 3.7.'
Return the interpreter’s unique ID.  If there was any error in doing
so then @code{-1} is returned and an error is set.

The caller must have an @ref{5231,,attached thread state}.


Added in version 3.7.

@end deffn

@geindex PyInterpreterState_GetDict (C function)
@anchor{c-api/subinterpreters c PyInterpreterState_GetDict}@anchor{539c}
@deffn {C Function} @ref{5df,,PyObject} *PyInterpreterState_GetDict (PyInterpreterState *interp)
`Return value: Borrowed reference.'` Part of the @ref{776,,Stable ABI} since version 3.8.'
Return a dictionary in which interpreter-specific data may be stored.
If this function returns @code{NULL} then no exception has been raised and
the caller should assume no interpreter-specific dict is available.

This is not a replacement for @ref{b7d,,PyModule_GetState()}, which
extensions should use to store interpreter-specific state information.

The returned dictionary is borrowed from the interpreter and is valid until
interpreter shutdown.


Added in version 3.8.

@end deffn

@geindex _PyFrameEvalFunction (C type)
@anchor{c-api/subinterpreters c _PyFrameEvalFunction}@anchor{97f}
@deffn {C Type} typedef @ref{5df,,PyObject} *(*_PyFrameEvalFunction)(@ref{995,,PyThreadState} *tstate, @ref{19b2,,_PyInterpreterFrame} *frame, int throwflag)

Type of a frame evaluation function.

The `throwflag' parameter is used by the @code{throw()} method of generators:
if non-zero, handle the current exception.


Changed in version 3.9: The function now takes a `tstate' parameter.



Changed in version 3.11: The `frame' parameter changed from @code{PyFrameObject*} to @code{_PyInterpreterFrame*}.

@end deffn

@geindex _PyInterpreterState_GetEvalFrameFunc (C function)
@anchor{c-api/subinterpreters c _PyInterpreterState_GetEvalFrameFunc}@anchor{1dbb}
@deffn {C Function} @ref{97f,,_PyFrameEvalFunction} _PyInterpreterState_GetEvalFrameFunc (PyInterpreterState *interp)

Get the frame evaluation function.

See the 
@geindex Python Enhancement Proposals; PEP 523
PEP 523@footnote{https://peps.python.org/pep-0523/} “Adding a frame evaluation API to CPython”.


Added in version 3.9.

@end deffn

@geindex _PyInterpreterState_SetEvalFrameFunc (C function)
@anchor{c-api/subinterpreters c _PyInterpreterState_SetEvalFrameFunc}@anchor{1dbc}
@deffn {C Function} void _PyInterpreterState_SetEvalFrameFunc (PyInterpreterState *interp, _PyFrameEvalFunction eval_frame)

Set the frame evaluation function.

See the 
@geindex Python Enhancement Proposals; PEP 523
PEP 523@footnote{https://peps.python.org/pep-0523/} “Adding a frame evaluation API to CPython”.


Added in version 3.9.

@end deffn

@node Low-level APIs<2>,Advanced debugger support,High-level APIs<2>,Multiple interpreters in a Python process
@anchor{c-api/subinterpreters low-level-apis}@anchor{58bb}
@subsection Low-level APIs


All of the following functions must be called after @ref{45e,,Py_Initialize()}.


Changed in version 3.7: @ref{45e,,Py_Initialize()} now initializes the @ref{165,,GIL}
and sets an @ref{5231,,attached thread state}.


@geindex PyInterpreterState_New (C function)
@anchor{c-api/subinterpreters c PyInterpreterState_New}@anchor{4ab4}
@deffn {C Function} @ref{ac0,,PyInterpreterState} *PyInterpreterState_New ()
` Part of the @ref{776,,Stable ABI}.'
Create a new interpreter state object.  An @ref{5231,,attached thread state} is not needed,
but may optionally exist if it is necessary to serialize calls to this
function.

Raises an @ref{1cb1,,auditing event} @code{cpython.PyInterpreterState_New} with no arguments.
@end deffn

@geindex PyInterpreterState_Clear (C function)
@anchor{c-api/subinterpreters c PyInterpreterState_Clear}@anchor{4ab3}
@deffn {C Function} void PyInterpreterState_Clear (PyInterpreterState *interp)
` Part of the @ref{776,,Stable ABI}.'
Reset all information in an interpreter state object.  There must be
an @ref{5231,,attached thread state} for the interpreter.

Raises an @ref{1cb1,,auditing event} @code{cpython.PyInterpreterState_Clear} with no arguments.
@end deffn

@geindex PyInterpreterState_Delete (C function)
@anchor{c-api/subinterpreters c PyInterpreterState_Delete}@anchor{539b}
@deffn {C Function} void PyInterpreterState_Delete (PyInterpreterState *interp)
` Part of the @ref{776,,Stable ABI}.'
Destroy an interpreter state object.  There `should not' be an
@ref{5231,,attached thread state} for the target interpreter. The interpreter
state must have been reset with a previous call to @ref{4ab3,,PyInterpreterState_Clear()}.
@end deffn

@node Advanced debugger support,,Low-level APIs<2>,Multiple interpreters in a Python process
@anchor{c-api/subinterpreters advanced-debugger-support}@anchor{58bc}@anchor{c-api/subinterpreters advanced-debugging}@anchor{58bd}
@subsection Advanced debugger support


These functions are only intended to be used by advanced debugging tools.

@geindex PyInterpreterState_Head (C function)
@anchor{c-api/subinterpreters c PyInterpreterState_Head}@anchor{170b}
@deffn {C Function} @ref{ac0,,PyInterpreterState} *PyInterpreterState_Head ()

Return the interpreter state object at the head of the list of all such objects.
@end deffn

@geindex PyInterpreterState_Main (C function)
@anchor{c-api/subinterpreters c PyInterpreterState_Main}@anchor{58ad}
@deffn {C Function} @ref{ac0,,PyInterpreterState} *PyInterpreterState_Main ()

Return the main interpreter state object.
@end deffn

@geindex PyInterpreterState_Next (C function)
@anchor{c-api/subinterpreters c PyInterpreterState_Next}@anchor{170c}
@deffn {C Function} @ref{ac0,,PyInterpreterState} *PyInterpreterState_Next (PyInterpreterState *interp)

Return the next interpreter state object after `interp' from the list of all
such objects.
@end deffn

@geindex PyInterpreterState_ThreadHead (C function)
@anchor{c-api/subinterpreters c PyInterpreterState_ThreadHead}@anchor{170d}
@deffn {C Function} @ref{995,,PyThreadState} *PyInterpreterState_ThreadHead (PyInterpreterState *interp)

Return the pointer to the first @ref{995,,PyThreadState} object in the list of
threads associated with the interpreter `interp'.
@end deffn

@geindex PyThreadState_Next (C function)
@anchor{c-api/subinterpreters c PyThreadState_Next}@anchor{170e}
@deffn {C Function} @ref{995,,PyThreadState} *PyThreadState_Next (PyThreadState *tstate)

Return the next thread state object after `tstate' from the list of all such
objects belonging to the same @ref{ac0,,PyInterpreterState} object.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Profiling and tracing,Reference tracing,Multiple interpreters in a Python process,Python/C API reference manual
@anchor{c-api/profiling doc}@anchor{58be}@anchor{c-api/profiling profiling}@anchor{58bf}@anchor{c-api/profiling profiling-and-tracing}@anchor{58c0}@anchor{c-api/profiling translation-repo}@anchor{58c1}
@section Profiling and tracing


The Python interpreter provides some low-level support for attaching profiling
and execution tracing facilities.  These are used for profiling, debugging, and
coverage analysis tools.

This C interface allows the profiling or tracing code to avoid the overhead of
calling through Python-level callable objects, making a direct C function call
instead.  The essential attributes of the facility have not changed; the
interface allows trace functions to be installed per-thread, and the basic
events reported to the trace function are the same as had been reported to the
Python-level trace functions in previous versions.

@geindex Py_tracefunc (C type)
@anchor{c-api/profiling c Py_tracefunc}@anchor{58c2}
@deffn {C Type} typedef int (*Py_tracefunc)(@ref{5df,,PyObject} *obj, @ref{991,,PyFrameObject} *frame, int what, @ref{5df,,PyObject} *arg)

The type of the trace function registered using @ref{1709,,PyEval_SetProfile()} and
@ref{663,,PyEval_SetTrace()}. The first parameter is the object passed to the
registration function as `obj', `frame' is the frame object to which the event
pertains, `what' is one of the constants @ref{58c3,,PyTrace_CALL},
@ref{58c4,,PyTrace_EXCEPTION}, @ref{58c5,,PyTrace_LINE}, @ref{58c6,,PyTrace_RETURN},
@ref{58c7,,PyTrace_C_CALL}, @ref{58c8,,PyTrace_C_EXCEPTION}, @ref{58c9,,PyTrace_C_RETURN},
or @ref{58ca,,PyTrace_OPCODE}, and `arg' depends on the value of `what':


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Value of `what'

@tab

Meaning of `arg'

@item

@ref{58c3,,PyTrace_CALL}

@tab

Always @ref{51ff,,Py_None}.

@item

@ref{58c4,,PyTrace_EXCEPTION}

@tab

Exception information as returned by
@ref{89c,,sys.exc_info()}.

@item

@ref{58c5,,PyTrace_LINE}

@tab

Always @ref{51ff,,Py_None}.

@item

@ref{58c6,,PyTrace_RETURN}

@tab

Value being returned to the caller,
or @code{NULL} if caused by an exception.

@item

@ref{58c7,,PyTrace_C_CALL}

@tab

Function object being called.

@item

@ref{58c8,,PyTrace_C_EXCEPTION}

@tab

Function object being called.

@item

@ref{58c9,,PyTrace_C_RETURN}

@tab

Function object being called.

@item

@ref{58ca,,PyTrace_OPCODE}

@tab

Always @ref{51ff,,Py_None}.

@end multitable

@end deffn

@geindex PyTrace_CALL (C var)
@anchor{c-api/profiling c PyTrace_CALL}@anchor{58c3}
@deffn {C Variable} int PyTrace_CALL

The value of the `what' parameter to a @ref{58c2,,Py_tracefunc} function when a new
call to a function or method is being reported, or a new entry into a generator.
Note that the creation of the iterator for a generator function is not reported
as there is no control transfer to the Python bytecode in the corresponding
frame.
@end deffn

@geindex PyTrace_EXCEPTION (C var)
@anchor{c-api/profiling c PyTrace_EXCEPTION}@anchor{58c4}
@deffn {C Variable} int PyTrace_EXCEPTION

The value of the `what' parameter to a @ref{58c2,,Py_tracefunc} function when an
exception has been raised.  The callback function is called with this value for
`what' when after any bytecode is processed after which the exception becomes
set within the frame being executed.  The effect of this is that as exception
propagation causes the Python stack to unwind, the callback is called upon
return to each frame as the exception propagates.  Only trace functions receive
these events; they are not needed by the profiler.
@end deffn

@geindex PyTrace_LINE (C var)
@anchor{c-api/profiling c PyTrace_LINE}@anchor{58c5}
@deffn {C Variable} int PyTrace_LINE

The value passed as the `what' parameter to a @ref{58c2,,Py_tracefunc} function
(but not a profiling function) when a line-number event is being reported.
It may be disabled for a frame by setting @ref{ddc,,f_trace_lines} to
`0' on that frame.
@end deffn

@geindex PyTrace_RETURN (C var)
@anchor{c-api/profiling c PyTrace_RETURN}@anchor{58c6}
@deffn {C Variable} int PyTrace_RETURN

The value for the `what' parameter to @ref{58c2,,Py_tracefunc} functions when a
call is about to return.
@end deffn

@geindex PyTrace_C_CALL (C var)
@anchor{c-api/profiling c PyTrace_C_CALL}@anchor{58c7}
@deffn {C Variable} int PyTrace_C_CALL

The value for the `what' parameter to @ref{58c2,,Py_tracefunc} functions when a C
function is about to be called.
@end deffn

@geindex PyTrace_C_EXCEPTION (C var)
@anchor{c-api/profiling c PyTrace_C_EXCEPTION}@anchor{58c8}
@deffn {C Variable} int PyTrace_C_EXCEPTION

The value for the `what' parameter to @ref{58c2,,Py_tracefunc} functions when a C
function has raised an exception.
@end deffn

@geindex PyTrace_C_RETURN (C var)
@anchor{c-api/profiling c PyTrace_C_RETURN}@anchor{58c9}
@deffn {C Variable} int PyTrace_C_RETURN

The value for the `what' parameter to @ref{58c2,,Py_tracefunc} functions when a C
function has returned.
@end deffn

@geindex PyTrace_OPCODE (C var)
@anchor{c-api/profiling c PyTrace_OPCODE}@anchor{58ca}
@deffn {C Variable} int PyTrace_OPCODE

The value for the `what' parameter to @ref{58c2,,Py_tracefunc} functions (but not
profiling functions) when a new opcode is about to be executed.  This event is
not emitted by default: it must be explicitly requested by setting
@ref{ddd,,f_trace_opcodes} to `1' on the frame.
@end deffn

@geindex PyEval_SetProfile (C function)
@anchor{c-api/profiling c PyEval_SetProfile}@anchor{1709}
@deffn {C Function} void PyEval_SetProfile (Py_tracefunc func, PyObject *obj)

Set the profiler function to `func'.  The `obj' parameter is passed to the
function as its first parameter, and may be any Python object, or @code{NULL}.  If
the profile function needs to maintain state, using a different value for `obj'
for each thread provides a convenient and thread-safe place to store it.  The
profile function is called for all monitored events except @ref{58c5,,PyTrace_LINE}
@ref{58ca,,PyTrace_OPCODE} and @ref{58c4,,PyTrace_EXCEPTION}.

See also the @ref{170a,,sys.setprofile()} function.

The caller must have an @ref{5231,,attached thread state}.
@end deffn

@geindex PyEval_SetProfileAllThreads (C function)
@anchor{c-api/profiling c PyEval_SetProfileAllThreads}@anchor{782}
@deffn {C Function} void PyEval_SetProfileAllThreads (Py_tracefunc func, PyObject *obj)

Like @ref{1709,,PyEval_SetProfile()} but sets the profile function in all running threads
belonging to the current interpreter instead of the setting it only on the current thread.

The caller must have an @ref{5231,,attached thread state}.

As @ref{1709,,PyEval_SetProfile()}, this function ignores any exceptions raised while
setting the profile functions in all threads.
@end deffn


Added in version 3.12.


@geindex PyEval_SetTrace (C function)
@anchor{c-api/profiling c PyEval_SetTrace}@anchor{663}
@deffn {C Function} void PyEval_SetTrace (Py_tracefunc func, PyObject *obj)

Set the tracing function to `func'.  This is similar to
@ref{1709,,PyEval_SetProfile()}, except the tracing function does receive line-number
events and per-opcode events, but does not receive any event related to C function
objects being called.  Any trace function registered using @ref{663,,PyEval_SetTrace()}
will not receive @ref{58c7,,PyTrace_C_CALL}, @ref{58c8,,PyTrace_C_EXCEPTION} or
@ref{58c9,,PyTrace_C_RETURN} as a value for the `what' parameter.

See also the @ref{2e3,,sys.settrace()} function.

The caller must have an @ref{5231,,attached thread state}.
@end deffn

@geindex PyEval_SetTraceAllThreads (C function)
@anchor{c-api/profiling c PyEval_SetTraceAllThreads}@anchor{664}
@deffn {C Function} void PyEval_SetTraceAllThreads (Py_tracefunc func, PyObject *obj)

Like @ref{663,,PyEval_SetTrace()} but sets the tracing function in all running threads
belonging to the current interpreter instead of the setting it only on the current thread.

The caller must have an @ref{5231,,attached thread state}.

As @ref{663,,PyEval_SetTrace()}, this function ignores any exceptions raised while
setting the trace functions in all threads.
@end deffn


Added in version 3.12.


@node Reference tracing,Python Initialization Configuration,Profiling and tracing,Python/C API reference manual
@anchor{c-api/profiling reference-tracing}@anchor{58cb}
@section Reference tracing



Added in version 3.13.


@geindex PyRefTracer (C type)
@anchor{c-api/profiling c PyRefTracer}@anchor{58cc}
@deffn {C Type} typedef int (*PyRefTracer)(@ref{5df,,PyObject}*, int event, void *data)

The type of the trace function registered using @ref{610,,PyRefTracer_SetTracer()}.
The first parameter is a Python object that has been just created (when `event'
is set to @ref{58cd,,PyRefTracer_CREATE}) or about to be destroyed (when `event'
is set to @ref{58ce,,PyRefTracer_DESTROY}). The `data' argument is the opaque pointer
that was provided when @code{PyRefTracer_SetTracer()} was called.

If a new tracing function is registered replacing the current one, a call to the
trace function will be made with the object set to `NULL' and `event' set to
@ref{58cf,,PyRefTracer_TRACKER_REMOVED}. This will happen just before the new
function is registered.
@end deffn


Added in version 3.13.


@geindex PyRefTracer_CREATE (C var)
@anchor{c-api/profiling c PyRefTracer_CREATE}@anchor{58cd}
@deffn {C Variable} int PyRefTracer_CREATE

The value for the `event' parameter to @ref{58cc,,PyRefTracer} functions when a Python
object has been created.
@end deffn

@geindex PyRefTracer_DESTROY (C var)
@anchor{c-api/profiling c PyRefTracer_DESTROY}@anchor{58ce}
@deffn {C Variable} int PyRefTracer_DESTROY

The value for the `event' parameter to @ref{58cc,,PyRefTracer} functions when a Python
object has been destroyed.
@end deffn

@geindex PyRefTracer_TRACKER_REMOVED (C var)
@anchor{c-api/profiling c PyRefTracer_TRACKER_REMOVED}@anchor{58cf}
@deffn {C Variable} int PyRefTracer_TRACKER_REMOVED

The value for the `event' parameter to @ref{58cc,,PyRefTracer} functions when the
current tracer is about to be replaced by a new one.


Added in version 3.14.

@end deffn

@geindex PyRefTracer_SetTracer (C function)
@anchor{c-api/profiling c PyRefTracer_SetTracer}@anchor{610}
@deffn {C Function} int PyRefTracer_SetTracer (PyRefTracer tracer, void *data)

Register a reference tracer function. The function will be called when a new
Python object has been created or when an object is going to be destroyed. If
`data' is provided it must be an opaque pointer that will be provided when
the tracer function is called. Return @code{0} on success. Set an exception and
return @code{-1} on error.

Note that tracer functions `must not' create Python objects inside or
otherwise the call will be re-entrant. The tracer also `must not' clear
any existing exception or set an exception.  A @ref{188f,,thread state} will be active
every time the tracer function is called.

There must be an @ref{5231,,attached thread state} when calling this function.

If another tracer function was already registered, the old function will be
called with `event' set to @ref{58cf,,PyRefTracer_TRACKER_REMOVED} just before
the new function is registered.
@end deffn


Added in version 3.13.


@geindex PyRefTracer_GetTracer (C function)
@anchor{c-api/profiling c PyRefTracer_GetTracer}@anchor{611}
@deffn {C Function} @ref{58cc,,PyRefTracer} PyRefTracer_GetTracer (void **data)

Get the registered reference tracer function and the value of the opaque data
pointer that was registered when @ref{610,,PyRefTracer_SetTracer()} was called.
If no tracer was registered this function will return NULL and will set the
`data' pointer to NULL.

There must be an @ref{5231,,attached thread state} when calling this function.
@end deffn


Added in version 3.13.


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Python Initialization Configuration,Memory Management,Reference tracing,Python/C API reference manual
@anchor{c-api/init_config doc}@anchor{58d0}@anchor{c-api/init_config init-config}@anchor{646}@anchor{c-api/init_config python-initialization-configuration}@anchor{58d1}@anchor{c-api/init_config translation-repo}@anchor{58d2}
@section Python Initialization Configuration


@menu
* PyInitConfig C API:: 
* Configuration Options:: 
* Runtime Python configuration API:: 
* PyConfig C API:: 
* Py_GetArgcArgv(): Py_GetArgcArgv. 
* Delaying main module execution:: 

@end menu

@node PyInitConfig C API,Configuration Options,,Python Initialization Configuration
@anchor{c-api/init_config pyinitconfig-api}@anchor{377}@anchor{c-api/init_config pyinitconfig-c-api}@anchor{58d3}
@subsection PyInitConfig C API



Added in version 3.14.


Python can be initialized with @ref{384,,Py_InitializeFromInitConfig()}.

The @ref{bc2,,Py_RunMain()} function can be used to write a customized Python
program.

See also @ref{5869,,Initialization@comma{} Finalization@comma{} and Threads}.


@subsubheading See also


@geindex Python Enhancement Proposals; PEP 741
PEP 741@footnote{https://peps.python.org/pep-0741/} “Python Configuration C API”.


@menu
* Example: Example<17>. 
* Create Config:: 
* Error Handling: Error Handling<2>. 
* Get Options:: 
* Set Options:: 
* Module:: 
* Initialize Python:: 

@end menu

@node Example<17>,Create Config,,PyInitConfig C API
@anchor{c-api/init_config example}@anchor{58d4}
@subsubsection Example


Example of customized Python always running with the @ref{509,,Python Development Mode} enabled; return @code{-1} on error:

@example
int init_python(void)
@{
    PyInitConfig *config = PyInitConfig_Create();
    if (config == NULL) @{
        printf("PYTHON INIT ERROR: memory allocation failed\n");
        return -1;
    @}

    // Enable the Python Development Mode
    if (PyInitConfig_SetInt(config, "dev_mode", 1) < 0) @{
        goto error;
    @}

    // Initialize Python with the configuration
    if (Py_InitializeFromInitConfig(config) < 0) @{
        goto error;
    @}
    PyInitConfig_Free(config);
    return 0;

error:
    @{
        // Display the error message.
        //
        // This uncommon braces style is used, because you cannot make
        // goto targets point to variable declarations.
        const char *err_msg;
        (void)PyInitConfig_GetError(config, &err_msg);
        printf("PYTHON INIT ERROR: %s\n", err_msg);
        PyInitConfig_Free(config);
        return -1;
    @}
@}
@end example

@node Create Config,Error Handling<2>,Example<17>,PyInitConfig C API
@anchor{c-api/init_config create-config}@anchor{58d5}
@subsubsection Create Config


@geindex PyInitConfig (C struct)
@anchor{c-api/init_config c PyInitConfig}@anchor{58d6}
@deffn {C Struct} struct PyInitConfig

Opaque structure to configure the Python initialization.
@end deffn

@geindex PyInitConfig_Create (C function)
@anchor{c-api/init_config c PyInitConfig_Create}@anchor{385}
@deffn {C Function} @ref{58d6,,PyInitConfig} *PyInitConfig_Create (void)

Create a new initialization configuration using @ref{58d7,,Isolated Configuration} default values.

It must be freed by @ref{386,,PyInitConfig_Free()}.

Return @code{NULL} on memory allocation failure.
@end deffn

@geindex PyInitConfig_Free (C function)
@anchor{c-api/init_config c PyInitConfig_Free}@anchor{386}
@deffn {C Function} void PyInitConfig_Free (PyInitConfig *config)

Free memory of the initialization configuration `config'.

If `config' is @code{NULL}, no operation is performed.
@end deffn

@node Error Handling<2>,Get Options,Create Config,PyInitConfig C API
@anchor{c-api/init_config error-handling}@anchor{58d8}
@subsubsection Error Handling


@geindex PyInitConfig_GetError (C function)
@anchor{c-api/init_config c PyInitConfig_GetError}@anchor{388}
@deffn {C Function} int PyInitConfig_GetError (PyInitConfig *config, const char **err_msg)

Get the `config' error message.


@itemize *

@item 
Set `*err_msg' and return @code{1} if an error is set.

@item 
Set `*err_msg' to @code{NULL} and return @code{0} otherwise.
@end itemize

An error message is a UTF-8 encoded string.

If `config' has an exit code, format the exit code as an error
message.

The error message remains valid until another @code{PyInitConfig}
function is called with `config'. The caller doesn’t have to free the
error message.
@end deffn

@geindex PyInitConfig_GetExitCode (C function)
@anchor{c-api/init_config c PyInitConfig_GetExitCode}@anchor{389}
@deffn {C Function} int PyInitConfig_GetExitCode (PyInitConfig *config, int *exitcode)

Get the `config' exit code.


@itemize *

@item 
Set `*exitcode' and return @code{1} if `config' has an exit code set.

@item 
Return @code{0} if `config' has no exit code set.
@end itemize

Only the @code{Py_InitializeFromInitConfig()} function can set an exit
code if the @code{parse_argv} option is non-zero.

An exit code can be set when parsing the command line failed (exit
code @code{2}) or when a command line option asks to display the command
line help (exit code @code{0}).
@end deffn

@node Get Options,Set Options,Error Handling<2>,PyInitConfig C API
@anchor{c-api/init_config get-options}@anchor{58d9}
@subsubsection Get Options


The configuration option `name' parameter must be a non-NULL null-terminated
UTF-8 encoded string. See @ref{58da,,Configuration Options}.

@geindex PyInitConfig_HasOption (C function)
@anchor{c-api/init_config c PyInitConfig_HasOption}@anchor{38d}
@deffn {C Function} int PyInitConfig_HasOption (PyInitConfig *config, const char *name)

Test if the configuration has an option called `name'.

Return @code{1} if the option exists, or return @code{0} otherwise.
@end deffn

@geindex PyInitConfig_GetInt (C function)
@anchor{c-api/init_config c PyInitConfig_GetInt}@anchor{38a}
@deffn {C Function} int PyInitConfig_GetInt (PyInitConfig *config, const char *name, int64_t *value)

Get an integer configuration option.


@itemize *

@item 
Set `*value', and return @code{0} on success.

@item 
Set an error in `config' and return @code{-1} on error.
@end itemize
@end deffn

@geindex PyInitConfig_GetStr (C function)
@anchor{c-api/init_config c PyInitConfig_GetStr}@anchor{38b}
@deffn {C Function} int PyInitConfig_GetStr (PyInitConfig *config, const char *name, char **value)

Get a string configuration option as a null-terminated UTF-8
encoded string.


@itemize *

@item 
Set `*value', and return @code{0} on success.

@item 
Set an error in `config' and return @code{-1} on error.
@end itemize

`*value' can be set to @code{NULL} if the option is an optional string and the
option is unset.

On success, the string must be released with @code{free(value)} if it’s not
@code{NULL}.
@end deffn

@geindex PyInitConfig_GetStrList (C function)
@anchor{c-api/init_config c PyInitConfig_GetStrList}@anchor{38c}
@deffn {C Function} int PyInitConfig_GetStrList (PyInitConfig *config, const char *name, size_t *length, char ***items)

Get a string list configuration option as an array of
null-terminated UTF-8 encoded strings.


@itemize *

@item 
Set `*length' and `*value', and return @code{0} on success.

@item 
Set an error in `config' and return @code{-1} on error.
@end itemize

On success, the string list must be released with
@code{PyInitConfig_FreeStrList(length, items)}.
@end deffn

@geindex PyInitConfig_FreeStrList (C function)
@anchor{c-api/init_config c PyInitConfig_FreeStrList}@anchor{387}
@deffn {C Function} void PyInitConfig_FreeStrList (size_t length, char **items)

Free memory of a string list created by
@code{PyInitConfig_GetStrList()}.
@end deffn

@node Set Options,Module,Get Options,PyInitConfig C API
@anchor{c-api/init_config set-options}@anchor{58db}
@subsubsection Set Options


The configuration option `name' parameter must be a non-NULL null-terminated
UTF-8 encoded string. See @ref{58da,,Configuration Options}.

Some configuration options have side effects on other options. This logic is
only implemented when @code{Py_InitializeFromInitConfig()} is called, not by the
“Set” functions below. For example, setting @code{dev_mode} to @code{1} does not set
@code{faulthandler} to @code{1}.

@geindex PyInitConfig_SetInt (C function)
@anchor{c-api/init_config c PyInitConfig_SetInt}@anchor{38e}
@deffn {C Function} int PyInitConfig_SetInt (PyInitConfig *config, const char *name, int64_t value)

Set an integer configuration option.


@itemize *

@item 
Return @code{0} on success.

@item 
Set an error in `config' and return @code{-1} on error.
@end itemize
@end deffn

@geindex PyInitConfig_SetStr (C function)
@anchor{c-api/init_config c PyInitConfig_SetStr}@anchor{38f}
@deffn {C Function} int PyInitConfig_SetStr (PyInitConfig *config, const char *name, const char *value)

Set a string configuration option from a null-terminated UTF-8
encoded string. The string is copied.


@itemize *

@item 
Return @code{0} on success.

@item 
Set an error in `config' and return @code{-1} on error.
@end itemize
@end deffn

@geindex PyInitConfig_SetStrList (C function)
@anchor{c-api/init_config c PyInitConfig_SetStrList}@anchor{390}
@deffn {C Function} int PyInitConfig_SetStrList (PyInitConfig *config, const char *name, size_t length, char *const *items)

Set a string list configuration option from an array of
null-terminated UTF-8 encoded strings. The string list is copied.


@itemize *

@item 
Return @code{0} on success.

@item 
Set an error in `config' and return @code{-1} on error.
@end itemize
@end deffn

@node Module,Initialize Python,Set Options,PyInitConfig C API
@anchor{c-api/init_config module}@anchor{58dc}
@subsubsection Module


@geindex PyInitConfig_AddModule (C function)
@anchor{c-api/init_config c PyInitConfig_AddModule}@anchor{379}
@deffn {C Function} int PyInitConfig_AddModule (PyInitConfig *config, const char *name, PyObject *(*initfunc)(void))

Add a built-in extension module to the table of built-in modules.

The new module can be imported by the name `name', and uses the function
`initfunc' as the initialization function called on the first attempted
import.


@itemize *

@item 
Return @code{0} on success.

@item 
Set an error in `config' and return @code{-1} on error.
@end itemize

If Python is initialized multiple times, @code{PyInitConfig_AddModule()} must
be called at each Python initialization.

Similar to the @ref{1b60,,PyImport_AppendInittab()} function.
@end deffn

@node Initialize Python,,Module,PyInitConfig C API
@anchor{c-api/init_config initialize-python}@anchor{58dd}
@subsubsection Initialize Python


@geindex Py_InitializeFromInitConfig (C function)
@anchor{c-api/init_config c Py_InitializeFromInitConfig}@anchor{384}
@deffn {C Function} int Py_InitializeFromInitConfig (PyInitConfig *config)

Initialize Python from the initialization configuration.


@itemize *

@item 
Return @code{0} on success.

@item 
Set an error in `config' and return @code{-1} on error.

@item 
Set an exit code in `config' and return @code{-1} if Python wants to
exit.
@end itemize

See @code{PyInitConfig_GetExitcode()} for the exit code case.
@end deffn

@node Configuration Options,Runtime Python configuration API,PyInitConfig C API,Python Initialization Configuration
@anchor{c-api/init_config configuration-options}@anchor{58de}@anchor{c-api/init_config pyinitconfig-opts}@anchor{58da}
@subsection Configuration Options



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Option

@tab

PyConfig/PyPreConfig member

@tab

Type

@tab

Visibility

@item

@code{"allocator"}

@tab

@ref{58df,,allocator}

@tab

@code{int}

@tab

Read-only

@item

@code{"argv"}

@tab

@ref{3ef,,argv}

@tab

@code{list[str]}

@tab

Public

@item

@code{"base_exec_prefix"}

@tab

@ref{58e0,,base_exec_prefix}

@tab

@code{str}

@tab

Public

@item

@code{"base_executable"}

@tab

@ref{58e1,,base_executable}

@tab

@code{str}

@tab

Public

@item

@code{"base_prefix"}

@tab

@ref{58e2,,base_prefix}

@tab

@code{str}

@tab

Public

@item

@code{"buffered_stdio"}

@tab

@ref{40f,,buffered_stdio}

@tab

@code{bool}

@tab

Read-only

@item

@code{"bytes_warning"}

@tab

@ref{405,,bytes_warning}

@tab

@code{int}

@tab

Public

@item

@code{"check_hash_pycs_mode"}

@tab

@ref{58e3,,check_hash_pycs_mode}

@tab

@code{str}

@tab

Read-only

@item

@code{"code_debug_ranges"}

@tab

@ref{58e4,,code_debug_ranges}

@tab

@code{bool}

@tab

Read-only

@item

@code{"coerce_c_locale"}

@tab

@ref{58e5,,coerce_c_locale}

@tab

@code{bool}

@tab

Read-only

@item

@code{"coerce_c_locale_warn"}

@tab

@ref{58e6,,coerce_c_locale_warn}

@tab

@code{bool}

@tab

Read-only

@item

@code{"configure_c_stdio"}

@tab

@ref{58e7,,configure_c_stdio}

@tab

@code{bool}

@tab

Read-only

@item

@code{"configure_locale"}

@tab

@ref{58e8,,configure_locale}

@tab

@code{bool}

@tab

Read-only

@item

@code{"cpu_count"}

@tab

@ref{58e9,,cpu_count}

@tab

@code{int}

@tab

Public

@item

@code{"dev_mode"}

@tab

@ref{58ea,,dev_mode}

@tab

@code{bool}

@tab

Read-only

@item

@code{"dump_refs"}

@tab

@ref{58eb,,dump_refs}

@tab

@code{bool}

@tab

Read-only

@item

@code{"dump_refs_file"}

@tab

@ref{58ec,,dump_refs_file}

@tab

@code{str}

@tab

Read-only

@item

@code{"exec_prefix"}

@tab

@ref{58ed,,exec_prefix}

@tab

@code{str}

@tab

Public

@item

@code{"executable"}

@tab

@ref{645,,executable}

@tab

@code{str}

@tab

Public

@item

@code{"faulthandler"}

@tab

@ref{58ee,,faulthandler}

@tab

@code{bool}

@tab

Read-only

@item

@code{"filesystem_encoding"}

@tab

@ref{419,,filesystem_encoding}

@tab

@code{str}

@tab

Read-only

@item

@code{"filesystem_errors"}

@tab

@ref{41a,,filesystem_errors}

@tab

@code{str}

@tab

Read-only

@item

@code{"hash_seed"}

@tab

@ref{412,,hash_seed}

@tab

@code{int}

@tab

Read-only

@item

@code{"home"}

@tab

@ref{3f1,,home}

@tab

@code{str}

@tab

Read-only

@item

@code{"import_time"}

@tab

@ref{58ef,,import_time}

@tab

@code{int}

@tab

Read-only

@item

@code{"inspect"}

@tab

@ref{3ff,,inspect}

@tab

@code{bool}

@tab

Public

@item

@code{"install_signal_handlers"}

@tab

@ref{ac1,,install_signal_handlers}

@tab

@code{bool}

@tab

Read-only

@item

@code{"int_max_str_digits"}

@tab

@ref{58f0,,int_max_str_digits}

@tab

@code{int}

@tab

Public

@item

@code{"interactive"}

@tab

@ref{3fd,,interactive}

@tab

@code{bool}

@tab

Public

@item

@code{"isolated"}

@tab

@ref{414,,isolated}

@tab

@code{bool}

@tab

Read-only

@item

@code{"legacy_windows_fs_encoding"}

@tab

@ref{416,,legacy_windows_fs_encoding}

@tab

@code{bool}

@tab

Read-only

@item

@code{"legacy_windows_stdio"}

@tab

@ref{418,,legacy_windows_stdio}

@tab

@code{bool}

@tab

Read-only

@item

@code{"malloc_stats"}

@tab

@ref{58f1,,malloc_stats}

@tab

@code{bool}

@tab

Read-only

@item

@code{"module_search_paths"}

@tab

@ref{643,,module_search_paths}

@tab

@code{list[str]}

@tab

Public

@item

@code{"optimization_level"}

@tab

@ref{401,,optimization_level}

@tab

@code{int}

@tab

Public

@item

@code{"orig_argv"}

@tab

@ref{a9a,,orig_argv}

@tab

@code{list[str]}

@tab

Read-only

@item

@code{"parse_argv"}

@tab

@ref{1d35,,parse_argv}

@tab

@code{bool}

@tab

Read-only

@item

@code{"parser_debug"}

@tab

@ref{3f7,,parser_debug}

@tab

@code{bool}

@tab

Public

@item

@code{"pathconfig_warnings"}

@tab

@ref{407,,pathconfig_warnings}

@tab

@code{bool}

@tab

Read-only

@item

@code{"perf_profiling"}

@tab

@ref{58f2,,perf_profiling}

@tab

@code{bool}

@tab

Read-only

@item

@code{"platlibdir"}

@tab

@ref{1d65,,platlibdir}

@tab

@code{str}

@tab

Public

@item

@code{"prefix"}

@tab

@ref{58f3,,prefix}

@tab

@code{str}

@tab

Public

@item

@code{"program_name"}

@tab

@ref{3f0,,program_name}

@tab

@code{str}

@tab

Read-only

@item

@code{"pycache_prefix"}

@tab

@ref{58f4,,pycache_prefix}

@tab

@code{str}

@tab

Public

@item

@code{"quiet"}

@tab

@ref{3fb,,quiet}

@tab

@code{bool}

@tab

Public

@item

@code{"run_command"}

@tab

@ref{5874,,run_command}

@tab

@code{str}

@tab

Read-only

@item

@code{"run_filename"}

@tab

@ref{5875,,run_filename}

@tab

@code{str}

@tab

Read-only

@item

@code{"run_module"}

@tab

@ref{5876,,run_module}

@tab

@code{str}

@tab

Read-only

@item

@code{"run_presite"}

@tab

@ref{58f5,,run_presite}

@tab

@code{str}

@tab

Read-only

@item

@code{"safe_path"}

@tab

@ref{97c,,safe_path}

@tab

@code{bool}

@tab

Read-only

@item

@code{"show_ref_count"}

@tab

@ref{58f6,,show_ref_count}

@tab

@code{bool}

@tab

Read-only

@item

@code{"site_import"}

@tab

@ref{403,,site_import}

@tab

@code{bool}

@tab

Read-only

@item

@code{"skip_source_first_line"}

@tab

@ref{58f7,,skip_source_first_line}

@tab

@code{bool}

@tab

Read-only

@item

@code{"stdio_encoding"}

@tab

@ref{644,,stdio_encoding}

@tab

@code{str}

@tab

Read-only

@item

@code{"stdio_errors"}

@tab

@ref{4c87,,stdio_errors}

@tab

@code{str}

@tab

Read-only

@item

@code{"stdlib_dir"}

@tab

@ref{58f8,,stdlib_dir}

@tab

@code{str}

@tab

Public

@item

@code{"tracemalloc"}

@tab

@ref{58f9,,tracemalloc}

@tab

@code{int}

@tab

Read-only

@item

@code{"use_environment"}

@tab

@ref{409,,use_environment}

@tab

@code{bool}

@tab

Public

@item

@code{"use_frozen_modules"}

@tab

@ref{58fa,,use_frozen_modules}

@tab

@code{bool}

@tab

Read-only

@item

@code{"use_hash_seed"}

@tab

@ref{411,,use_hash_seed}

@tab

@code{bool}

@tab

Read-only

@item

@code{"use_system_logger"}

@tab

@ref{22b5,,use_system_logger}

@tab

@code{bool}

@tab

Read-only

@item

@code{"user_site_directory"}

@tab

@ref{40d,,user_site_directory}

@tab

@code{bool}

@tab

Read-only

@item

@code{"utf8_mode"}

@tab

@ref{41b,,utf8_mode}

@tab

@code{bool}

@tab

Read-only

@item

@code{"verbose"}

@tab

@ref{3f9,,verbose}

@tab

@code{int}

@tab

Public

@item

@code{"warn_default_encoding"}

@tab

@ref{58fb,,warn_default_encoding}

@tab

@code{bool}

@tab

Read-only

@item

@code{"warnoptions"}

@tab

@ref{641,,warnoptions}

@tab

@code{list[str]}

@tab

Public

@item

@code{"write_bytecode"}

@tab

@ref{40b,,write_bytecode}

@tab

@code{bool}

@tab

Public

@item

@code{"xoptions"}

@tab

@ref{642,,xoptions}

@tab

@code{dict[str, str]}

@tab

Public

@item

@code{"_pystats"}

@tab

@ref{58fc,,_pystats}

@tab

@code{bool}

@tab

Read-only

@end multitable


Visibility:


@itemize *

@item 
Public: Can be retrieved by @ref{37a,,PyConfig_Get()} and set by
@ref{37b,,PyConfig_Set()}.

@item 
Read-only: Can be retrieved by @ref{37a,,PyConfig_Get()}, but cannot be set by
@ref{37b,,PyConfig_Set()}.
@end itemize

@node Runtime Python configuration API,PyConfig C API,Configuration Options,Python Initialization Configuration
@anchor{c-api/init_config runtime-python-configuration-api}@anchor{58fd}
@subsection Runtime Python configuration API


At runtime, it’s possible to get and set configuration options using
@ref{37a,,PyConfig_Get()} and  @ref{37b,,PyConfig_Set()} functions.

The configuration option `name' parameter must be a non-NULL null-terminated
UTF-8 encoded string. See @ref{58da,,Configuration Options}.

Some options are read from the @ref{df,,sys} attributes. For example, the option
@code{"argv"} is read from @ref{1470,,sys.argv}.

@geindex PyConfig_Get (C function)
@anchor{c-api/init_config c PyConfig_Get}@anchor{37a}
@deffn {C Function} @ref{5df,,PyObject} *PyConfig_Get (const char *name)

Get the current runtime value of a configuration option as a Python object.


@itemize *

@item 
Return a new reference on success.

@item 
Set an exception and return @code{NULL} on error.
@end itemize

The object type depends on the configuration option. It can be:


@itemize *

@item 
@code{bool}

@item 
@code{int}

@item 
@code{str}

@item 
@code{list[str]}

@item 
@code{dict[str, str]}
@end itemize

The caller must have an @ref{5231,,attached thread state}. The function cannot
be called before Python initialization nor after Python finalization.


Added in version 3.14.

@end deffn

@geindex PyConfig_GetInt (C function)
@anchor{c-api/init_config c PyConfig_GetInt}@anchor{382}
@deffn {C Function} int PyConfig_GetInt (const char *name, int *value)

Similar to @ref{37a,,PyConfig_Get()}, but get the value as a C int.


@itemize *

@item 
Return @code{0} on success.

@item 
Set an exception and return @code{-1} on error.
@end itemize


Added in version 3.14.

@end deffn

@geindex PyConfig_Names (C function)
@anchor{c-api/init_config c PyConfig_Names}@anchor{383}
@deffn {C Function} @ref{5df,,PyObject} *PyConfig_Names (void)

Get all configuration option names as a @code{frozenset}.


@itemize *

@item 
Return a new reference on success.

@item 
Set an exception and return @code{NULL} on error.
@end itemize

The caller must have an @ref{5231,,attached thread state}. The function cannot
be called before Python initialization nor after Python finalization.


Added in version 3.14.

@end deffn

@geindex PyConfig_Set (C function)
@anchor{c-api/init_config c PyConfig_Set}@anchor{37b}
@deffn {C Function} int PyConfig_Set (const char *name, PyObject *value)

Set the current runtime value of a configuration option.


@itemize *

@item 
Raise a @ref{2ee,,ValueError} if there is no option `name'.

@item 
Raise a @ref{2ee,,ValueError} if `value' is an invalid value.

@item 
Raise a @ref{2ee,,ValueError} if the option is read-only (cannot be set).

@item 
Raise a @ref{199,,TypeError} if `value' has not the proper type.
@end itemize

The caller must have an @ref{5231,,attached thread state}. The function cannot
be called before Python initialization nor after Python finalization.

Raises an @ref{1cb1,,auditing event} @code{cpython.PyConfig_Set} with arguments @code{name}, @code{value}.


Added in version 3.14.



Changed in version 3.14.6 (unreleased): The function now replaces @ref{89e,,sys.flags} (create a new object),
instead of modifying @code{sys.flags} in-place.

@end deffn

@node PyConfig C API,Py_GetArgcArgv,Runtime Python configuration API,Python Initialization Configuration
@anchor{c-api/init_config pyconfig-api}@anchor{378}@anchor{c-api/init_config pyconfig-c-api}@anchor{58fe}
@subsection PyConfig C API



Added in version 3.8.


Python can be initialized with @ref{3f4,,Py_InitializeFromConfig()} and the
@ref{3f5,,PyConfig} structure. It can be preinitialized with
@ref{41c,,Py_PreInitialize()} and the @ref{ba9,,PyPreConfig} structure.

There are two kinds of configuration:


@itemize *

@item 
The @ref{5877,,Python Configuration} can be used to build a
customized Python which behaves as the regular Python. For example,
environment variables and command line arguments are used to configure
Python.

@item 
The @ref{58d7,,Isolated Configuration} can be used to embed
Python into an application. It isolates Python from the system. For example,
environment variables are ignored, the LC_CTYPE locale is left unchanged and
no signal handler is registered.
@end itemize

The @ref{bc2,,Py_RunMain()} function can be used to write a customized Python
program.

See also @ref{5869,,Initialization@comma{} Finalization@comma{} and Threads}.


@subsubheading See also


@geindex Python Enhancement Proposals; PEP 587
PEP 587@footnote{https://peps.python.org/pep-0587/} “Python Initialization Configuration”.


@menu
* Example: Example<18>. 
* PyWideStringList:: 
* PyStatus:: 
* PyPreConfig:: 
* Preinitialize Python with PyPreConfig:: 
* PyConfig:: 
* Initialization with PyConfig:: 
* Isolated Configuration:: 
* Python Configuration:: 
* Python Path Configuration:: 

@end menu

@node Example<18>,PyWideStringList,,PyConfig C API
@anchor{c-api/init_config id1}@anchor{58ff}
@subsubsection Example


Example of customized Python always running in isolated mode:

@example
int main(int argc, char **argv)
@{
    PyStatus status;

    PyConfig config;
    PyConfig_InitPythonConfig(&config);
    config.isolated = 1;

    /* Decode command line arguments.
       Implicitly preinitialize Python (in isolated mode). */
    status = PyConfig_SetBytesArgv(&config, argc, argv);
    if (PyStatus_Exception(status)) @{
        goto exception;
    @}

    status = Py_InitializeFromConfig(&config);
    if (PyStatus_Exception(status)) @{
        goto exception;
    @}
    PyConfig_Clear(&config);

    return Py_RunMain();

exception:
    PyConfig_Clear(&config);
    if (PyStatus_IsExit(status)) @{
        return status.exitcode;
    @}
    /* Display the error message and exit the process with
       non-zero exit code */
    Py_ExitStatusException(status);
@}
@end example

@node PyWideStringList,PyStatus,Example<18>,PyConfig C API
@anchor{c-api/init_config pywidestringlist}@anchor{5900}
@subsubsection PyWideStringList


@geindex PyWideStringList (C type)
@anchor{c-api/init_config c PyWideStringList}@anchor{bab}
@deffn {C Type} type PyWideStringList

List of @code{wchar_t*} strings.

If `length' is non-zero, `items' must be non-@code{NULL} and all strings must be
non-@code{NULL}.

Methods:

@geindex PyWideStringList_Append (C function)
@anchor{c-api/init_config c PyWideStringList_Append}@anchor{bbc}
@deffn {C Function} @ref{baa,,PyStatus} PyWideStringList_Append (PyWideStringList *list, const wchar_t *item)

Append `item' to `list'.

Python must be preinitialized to call this function.
@end deffn

@geindex PyWideStringList_Insert (C function)
@anchor{c-api/init_config c PyWideStringList_Insert}@anchor{bbd}
@deffn {C Function} @ref{baa,,PyStatus} PyWideStringList_Insert (PyWideStringList *list, Py_ssize_t index, const wchar_t *item)

Insert `item' into `list' at `index'.

If `index' is greater than or equal to `list' length, append `item' to
`list'.

`index' must be greater than or equal to @code{0}.

Python must be preinitialized to call this function.
@end deffn

Structure fields:

@geindex PyWideStringList.length (C member)
@anchor{c-api/init_config c PyWideStringList length}@anchor{5901}
@deffn {C Member} @ref{c5b,,Py_ssize_t} length

List length.
@end deffn

@geindex PyWideStringList.items (C member)
@anchor{c-api/init_config c PyWideStringList items}@anchor{5902}
@deffn {C Member} wchar_t **items

List items.
@end deffn
@end deffn

@node PyStatus,PyPreConfig,PyWideStringList,PyConfig C API
@anchor{c-api/init_config pystatus}@anchor{5903}
@subsubsection PyStatus


@geindex PyStatus (C type)
@anchor{c-api/init_config c PyStatus}@anchor{baa}
@deffn {C Type} type PyStatus

Structure to store an initialization function status: success, error
or exit.

For an error, it can store the C function name which created the error.

Structure fields:

@geindex PyStatus.exitcode (C member)
@anchor{c-api/init_config c PyStatus exitcode}@anchor{5904}
@deffn {C Member} int exitcode

Exit code. Argument passed to @code{exit()}.
@end deffn

@geindex PyStatus.err_msg (C member)
@anchor{c-api/init_config c PyStatus err_msg}@anchor{5905}
@deffn {C Member} const char *err_msg

Error message.
@end deffn

@geindex PyStatus.func (C member)
@anchor{c-api/init_config c PyStatus func}@anchor{5906}
@deffn {C Member} const char *func

Name of the function which created an error, can be @code{NULL}.
@end deffn

Functions to create a status:

@geindex PyStatus_Ok (C function)
@anchor{c-api/init_config c PyStatus_Ok}@anchor{bbb}
@deffn {C Function} @ref{baa,,PyStatus} PyStatus_Ok (void)

Success.
@end deffn

@geindex PyStatus_Error (C function)
@anchor{c-api/init_config c PyStatus_Error}@anchor{bb5}
@deffn {C Function} @ref{baa,,PyStatus} PyStatus_Error (const char *err_msg)

Initialization error with a message.

`err_msg' must not be @code{NULL}.
@end deffn

@geindex PyStatus_NoMemory (C function)
@anchor{c-api/init_config c PyStatus_NoMemory}@anchor{bba}
@deffn {C Function} @ref{baa,,PyStatus} PyStatus_NoMemory (void)

Memory allocation failure (out of memory).
@end deffn

@geindex PyStatus_Exit (C function)
@anchor{c-api/init_config c PyStatus_Exit}@anchor{bb7}
@deffn {C Function} @ref{baa,,PyStatus} PyStatus_Exit (int exitcode)

Exit Python with the specified exit code.
@end deffn

Functions to handle a status:

@geindex PyStatus_Exception (C function)
@anchor{c-api/init_config c PyStatus_Exception}@anchor{bb6}
@deffn {C Function} int PyStatus_Exception (PyStatus status)

Is the status an error or an exit? If true, the exception must be
handled; by calling @ref{bbf,,Py_ExitStatusException()} for example.
@end deffn

@geindex PyStatus_IsError (C function)
@anchor{c-api/init_config c PyStatus_IsError}@anchor{bb8}
@deffn {C Function} int PyStatus_IsError (PyStatus status)

Is the result an error?
@end deffn

@geindex PyStatus_IsExit (C function)
@anchor{c-api/init_config c PyStatus_IsExit}@anchor{bb9}
@deffn {C Function} int PyStatus_IsExit (PyStatus status)

Is the result an exit?
@end deffn

@geindex Py_ExitStatusException (C function)
@anchor{c-api/init_config c Py_ExitStatusException}@anchor{bbf}
@deffn {C Function} void Py_ExitStatusException (PyStatus status)

Call @code{exit(exitcode)} if `status' is an exit. Print the error
message and exit with a non-zero exit code if `status' is an error.  Must
only be called if @code{PyStatus_Exception(status)} is non-zero.
@end deffn
@end deffn

@cartouche
@quotation Note 
Internally, Python uses macros which set @code{PyStatus.func},
whereas functions to create a status set @code{func} to @code{NULL}.
@end quotation
@end cartouche

Example:

@example
PyStatus alloc(void **ptr, size_t size)
@{
    *ptr = PyMem_RawMalloc(size);
    if (*ptr == NULL) @{
        return PyStatus_NoMemory();
    @}
    return PyStatus_Ok();
@}

int main(int argc, char **argv)
@{
    void *ptr;
    PyStatus status = alloc(&ptr, 16);
    if (PyStatus_Exception(status)) @{
        Py_ExitStatusException(status);
    @}
    PyMem_Free(ptr);
    return 0;
@}
@end example

@node PyPreConfig,Preinitialize Python with PyPreConfig,PyStatus,PyConfig C API
@anchor{c-api/init_config pypreconfig}@anchor{5907}
@subsubsection PyPreConfig


@geindex PyPreConfig (C type)
@anchor{c-api/init_config c PyPreConfig}@anchor{ba9}
@deffn {C Type} type PyPreConfig

Structure used to preinitialize Python.

Function to initialize a preconfiguration:

@geindex PyPreConfig_InitPythonConfig (C function)
@anchor{c-api/init_config c PyPreConfig_InitPythonConfig}@anchor{bb4}
@deffn {C Function} void PyPreConfig_InitPythonConfig (PyPreConfig *preconfig)

Initialize the preconfiguration with @ref{5877,,Python Configuration}.
@end deffn

@geindex PyPreConfig_InitIsolatedConfig (C function)
@anchor{c-api/init_config c PyPreConfig_InitIsolatedConfig}@anchor{bb3}
@deffn {C Function} void PyPreConfig_InitIsolatedConfig (PyPreConfig *preconfig)

Initialize the preconfiguration with @ref{58d7,,Isolated Configuration}.
@end deffn

Structure fields:

@geindex PyPreConfig.allocator (C member)
@anchor{c-api/init_config c PyPreConfig allocator}@anchor{58df}
@deffn {C Member} int allocator

Name of the Python memory allocators:


@itemize *

@item 
@code{PYMEM_ALLOCATOR_NOT_SET} (@code{0}): don’t change memory allocators
(use defaults).

@item 
@code{PYMEM_ALLOCATOR_DEFAULT} (@code{1}): @ref{217e,,default memory allocators}.

@item 
@code{PYMEM_ALLOCATOR_DEBUG} (@code{2}): @ref{217e,,default memory allocators} with @ref{2180,,debug hooks}.

@item 
@code{PYMEM_ALLOCATOR_MALLOC} (@code{3}): use @code{malloc()} of the C library.

@item 
@code{PYMEM_ALLOCATOR_MALLOC_DEBUG} (@code{4}): force usage of
@code{malloc()} with @ref{2180,,debug hooks}.

@item 
@code{PYMEM_ALLOCATOR_PYMALLOC} (@code{5}): @ref{f11,,Python pymalloc memory allocator}.

@item 
@code{PYMEM_ALLOCATOR_PYMALLOC_DEBUG} (@code{6}): @ref{f11,,Python pymalloc memory allocator} with @ref{2180,,debug hooks}.

@item 
@code{PYMEM_ALLOCATOR_MIMALLOC} (@code{6}): use @code{mimalloc}, a fast
malloc replacement.

@item 
@code{PYMEM_ALLOCATOR_MIMALLOC_DEBUG} (@code{7}): use @code{mimalloc}, a fast
malloc replacement with @ref{2180,,debug hooks}.
@end itemize

@code{PYMEM_ALLOCATOR_PYMALLOC} and @code{PYMEM_ALLOCATOR_PYMALLOC_DEBUG} are
not supported if Python is @ref{21e3,,configured using --without-pymalloc}.

@code{PYMEM_ALLOCATOR_MIMALLOC} and @code{PYMEM_ALLOCATOR_MIMALLOC_DEBUG} are
not supported if Python is @ref{21e2,,configured using --without-mimalloc} or if the underlying atomic support isn’t
available.

See @ref{5908,,Memory Management}.

Default: @code{PYMEM_ALLOCATOR_NOT_SET}.
@end deffn

@geindex PyPreConfig.configure_locale (C member)
@anchor{c-api/init_config c PyPreConfig configure_locale}@anchor{58e8}
@deffn {C Member} int configure_locale

Set the LC_CTYPE locale to the user preferred locale.

If equals to @code{0}, set @ref{58e5,,coerce_c_locale} and
@ref{58e6,,coerce_c_locale_warn} members to @code{0}.

See the @ref{54b,,locale encoding}.

Default: @code{1} in Python config, @code{0} in isolated config.
@end deffn

@geindex PyPreConfig.coerce_c_locale (C member)
@anchor{c-api/init_config c PyPreConfig coerce_c_locale}@anchor{58e5}
@deffn {C Member} int coerce_c_locale

If equals to @code{2}, coerce the C locale.

If equals to @code{1}, read the LC_CTYPE locale to decide if it should be
coerced.

See the @ref{54b,,locale encoding}.

Default: @code{-1} in Python config, @code{0} in isolated config.
@end deffn

@geindex PyPreConfig.coerce_c_locale_warn (C member)
@anchor{c-api/init_config c PyPreConfig coerce_c_locale_warn}@anchor{58e6}
@deffn {C Member} int coerce_c_locale_warn

If non-zero, emit a warning if the C locale is coerced.

Default: @code{-1} in Python config, @code{0} in isolated config.
@end deffn

@geindex PyPreConfig.dev_mode (C member)
@anchor{c-api/init_config c PyPreConfig dev_mode}@anchor{5909}
@deffn {C Member} int dev_mode

@ref{509,,Python Development Mode}: see
@ref{58ea,,PyConfig.dev_mode}.

Default: @code{-1} in Python mode, @code{0} in isolated mode.
@end deffn

@geindex PyPreConfig.isolated (C member)
@anchor{c-api/init_config c PyPreConfig isolated}@anchor{590a}
@deffn {C Member} int isolated

Isolated mode: see @ref{414,,PyConfig.isolated}.

Default: @code{0} in Python mode, @code{1} in isolated mode.
@end deffn

@geindex PyPreConfig.legacy_windows_fs_encoding (C member)
@anchor{c-api/init_config c PyPreConfig legacy_windows_fs_encoding}@anchor{416}
@deffn {C Member} int legacy_windows_fs_encoding

If non-zero:


@itemize *

@item 
Set @ref{41b,,PyPreConfig.utf8_mode} to @code{0},

@item 
Set @ref{419,,PyConfig.filesystem_encoding} to @code{"mbcs"},

@item 
Set @ref{41a,,PyConfig.filesystem_errors} to @code{"replace"}.
@end itemize

Initialized from the 
@geindex PYTHONLEGACYWINDOWSFSENCODING
@geindex environment variable; PYTHONLEGACYWINDOWSFSENCODING
@ref{33d,,PYTHONLEGACYWINDOWSFSENCODING} environment
variable value.

Only available on Windows. @code{#ifdef MS_WINDOWS} macro can be used for
Windows specific code.

Default: @code{0}.
@end deffn

@geindex PyPreConfig.parse_argv (C member)
@anchor{c-api/init_config c PyPreConfig parse_argv}@anchor{590b}
@deffn {C Member} int parse_argv

If non-zero, @ref{bc0,,Py_PreInitializeFromArgs()} and
@ref{bc1,,Py_PreInitializeFromBytesArgs()} parse their @code{argv} argument the
same way the regular Python parses command line arguments: see
@ref{120d,,Command Line Arguments}.

Default: @code{1} in Python config, @code{0} in isolated config.
@end deffn

@geindex PyPreConfig.use_environment (C member)
@anchor{c-api/init_config c PyPreConfig use_environment}@anchor{590c}
@deffn {C Member} int use_environment

Use @ref{808,,environment variables}? See
@ref{409,,PyConfig.use_environment}.

Default: @code{1} in Python config and @code{0} in isolated config.
@end deffn

@geindex PyPreConfig.utf8_mode (C member)
@anchor{c-api/init_config c PyPreConfig utf8_mode}@anchor{41b}
@deffn {C Member} int utf8_mode

If non-zero, enable the @ref{868,,Python UTF-8 Mode}.

Set to @code{0} or @code{1} by the @ref{170,,-X utf8} command line option
and the 
@geindex PYTHONUTF8
@geindex environment variable; PYTHONUTF8
@ref{cd5,,PYTHONUTF8} environment variable.

Also set to @code{1} if the @code{LC_CTYPE} locale is @code{C} or @code{POSIX}.

Default: @code{-1} in Python config and @code{0} in isolated config.
@end deffn
@end deffn

@node Preinitialize Python with PyPreConfig,PyConfig,PyPreConfig,PyConfig C API
@anchor{c-api/init_config c-preinit}@anchor{434e}@anchor{c-api/init_config preinitialize-python-with-pypreconfig}@anchor{590d}
@subsubsection Preinitialize Python with PyPreConfig


The preinitialization of Python:


@itemize *

@item 
Set the Python memory allocators (@ref{58df,,PyPreConfig.allocator})

@item 
Configure the LC_CTYPE locale (@ref{54b,,locale encoding})

@item 
Set the @ref{868,,Python UTF-8 Mode}
(@ref{41b,,PyPreConfig.utf8_mode})
@end itemize

The current preconfiguration (@code{PyPreConfig} type) is stored in
@code{_PyRuntime.preconfig}.

Functions to preinitialize Python:

@geindex Py_PreInitialize (C function)
@anchor{c-api/init_config c Py_PreInitialize}@anchor{41c}
@deffn {C Function} @ref{baa,,PyStatus} Py_PreInitialize (const PyPreConfig *preconfig)

Preinitialize Python from `preconfig' preconfiguration.

`preconfig' must not be @code{NULL}.
@end deffn

@geindex Py_PreInitializeFromBytesArgs (C function)
@anchor{c-api/init_config c Py_PreInitializeFromBytesArgs}@anchor{bc1}
@deffn {C Function} @ref{baa,,PyStatus} Py_PreInitializeFromBytesArgs (const PyPreConfig *preconfig, int argc, char *const *argv)

Preinitialize Python from `preconfig' preconfiguration.

Parse `argv' command line arguments (bytes strings) if
@ref{590b,,parse_argv} of `preconfig' is non-zero.

`preconfig' must not be @code{NULL}.
@end deffn

@geindex Py_PreInitializeFromArgs (C function)
@anchor{c-api/init_config c Py_PreInitializeFromArgs}@anchor{bc0}
@deffn {C Function} @ref{baa,,PyStatus} Py_PreInitializeFromArgs (const PyPreConfig *preconfig, int argc, wchar_t *const *argv)

Preinitialize Python from `preconfig' preconfiguration.

Parse `argv' command line arguments (wide strings) if
@ref{590b,,parse_argv} of `preconfig' is non-zero.

`preconfig' must not be @code{NULL}.
@end deffn

The caller is responsible to handle exceptions (error or exit) using
@ref{bb6,,PyStatus_Exception()} and @ref{bbf,,Py_ExitStatusException()}.

For @ref{5877,,Python Configuration}
(@ref{bb4,,PyPreConfig_InitPythonConfig()}), if Python is initialized with
command line arguments, the command line arguments must also be passed to
preinitialize Python, since they have an effect on the pre-configuration
like encodings. For example, the @ref{170,,-X utf8} command line option
enables the @ref{868,,Python UTF-8 Mode}.

@code{PyMem_SetAllocator()} can be called after @ref{41c,,Py_PreInitialize()} and
before @ref{3f4,,Py_InitializeFromConfig()} to install a custom memory allocator.
It can be called before @code{Py_PreInitialize()} if
@ref{58df,,PyPreConfig.allocator} is set to @code{PYMEM_ALLOCATOR_NOT_SET}.

Python memory allocation functions like @ref{631,,PyMem_RawMalloc()} must not be
used before the Python preinitialization, whereas calling directly @code{malloc()}
and @code{free()} is always safe. @ref{dc6,,Py_DecodeLocale()} must not be called
before the Python preinitialization.

Example using the preinitialization to enable
the @ref{868,,Python UTF-8 Mode}:

@example
PyStatus status;
PyPreConfig preconfig;
PyPreConfig_InitPythonConfig(&preconfig);

preconfig.utf8_mode = 1;

status = Py_PreInitialize(&preconfig);
if (PyStatus_Exception(status)) @{
    Py_ExitStatusException(status);
@}

/* at this point, Python speaks UTF-8 */

Py_Initialize();
/* ... use Python API here ... */
Py_Finalize();
@end example

@node PyConfig,Initialization with PyConfig,Preinitialize Python with PyPreConfig,PyConfig C API
@anchor{c-api/init_config pyconfig}@anchor{590e}
@subsubsection PyConfig


@geindex PyConfig (C type)
@anchor{c-api/init_config c PyConfig}@anchor{3f5}
@deffn {C Type} type PyConfig

Structure containing most parameters to configure Python.

When done, the @ref{bac,,PyConfig_Clear()} function must be used to release the
configuration memory.

Structure methods:

@geindex PyConfig_InitPythonConfig (C function)
@anchor{c-api/init_config c PyConfig_InitPythonConfig}@anchor{bae}
@deffn {C Function} void PyConfig_InitPythonConfig (PyConfig *config)

Initialize configuration with the @ref{5877,,Python Configuration}.
@end deffn

@geindex PyConfig_InitIsolatedConfig (C function)
@anchor{c-api/init_config c PyConfig_InitIsolatedConfig}@anchor{bad}
@deffn {C Function} void PyConfig_InitIsolatedConfig (PyConfig *config)

Initialize configuration with the @ref{58d7,,Isolated Configuration}.
@end deffn

@geindex PyConfig_SetString (C function)
@anchor{c-api/init_config c PyConfig_SetString}@anchor{bb2}
@deffn {C Function} @ref{baa,,PyStatus} PyConfig_SetString (PyConfig *config, wchar_t *const *config_str, const wchar_t *str)

Copy the wide character string `str' into @code{*config_str}.

@ref{434e,,Preinitialize Python} if needed.
@end deffn

@geindex PyConfig_SetBytesString (C function)
@anchor{c-api/init_config c PyConfig_SetBytesString}@anchor{bb1}
@deffn {C Function} @ref{baa,,PyStatus} PyConfig_SetBytesString (PyConfig *config, wchar_t *const *config_str, const char *str)

Decode `str' using @ref{dc6,,Py_DecodeLocale()} and set the result into
@code{*config_str}.

@ref{434e,,Preinitialize Python} if needed.
@end deffn

@geindex PyConfig_SetArgv (C function)
@anchor{c-api/init_config c PyConfig_SetArgv}@anchor{baf}
@deffn {C Function} @ref{baa,,PyStatus} PyConfig_SetArgv (PyConfig *config, int argc, wchar_t *const *argv)

Set command line arguments (@ref{3ef,,argv} member of
`config') from the `argv' list of wide character strings.

@ref{434e,,Preinitialize Python} if needed.
@end deffn

@geindex PyConfig_SetBytesArgv (C function)
@anchor{c-api/init_config c PyConfig_SetBytesArgv}@anchor{bb0}
@deffn {C Function} @ref{baa,,PyStatus} PyConfig_SetBytesArgv (PyConfig *config, int argc, char *const *argv)

Set command line arguments (@ref{3ef,,argv} member of
`config') from the `argv' list of bytes strings. Decode bytes using
@ref{dc6,,Py_DecodeLocale()}.

@ref{434e,,Preinitialize Python} if needed.
@end deffn

@geindex PyConfig_SetWideStringList (C function)
@anchor{c-api/init_config c PyConfig_SetWideStringList}@anchor{1e0b}
@deffn {C Function} @ref{baa,,PyStatus} PyConfig_SetWideStringList (PyConfig *config, PyWideStringList *list, Py_ssize_t length, wchar_t **items)

Set the list of wide strings `list' to `length' and `items'.

@ref{434e,,Preinitialize Python} if needed.
@end deffn

@geindex PyConfig_Read (C function)
@anchor{c-api/init_config c PyConfig_Read}@anchor{998}
@deffn {C Function} @ref{baa,,PyStatus} PyConfig_Read (PyConfig *config)

Read all Python configuration.

Fields which are already initialized are left unchanged.

Fields for @ref{ab0,,path configuration} are no longer
calculated or modified when calling this function, as of Python 3.11.

The @ref{998,,PyConfig_Read()} function only parses
@ref{3ef,,PyConfig.argv} arguments once: @ref{1d35,,PyConfig.parse_argv}
is set to @code{2} after arguments are parsed. Since Python arguments are
stripped from @code{PyConfig.argv}, parsing arguments twice would
parse the application options as Python options.

@ref{434e,,Preinitialize Python} if needed.


Changed in version 3.10: The @ref{3ef,,PyConfig.argv} arguments are now only parsed once,
@ref{1d35,,PyConfig.parse_argv} is set to @code{2} after arguments are
parsed, and arguments are only parsed if
@code{PyConfig.parse_argv} equals @code{1}.



Changed in version 3.11: @ref{998,,PyConfig_Read()} no longer calculates all paths, and so fields
listed under @ref{ab0,,Python Path Configuration} may
no longer be updated until @ref{3f4,,Py_InitializeFromConfig()} is
called.

@end deffn

@geindex PyConfig_Clear (C function)
@anchor{c-api/init_config c PyConfig_Clear}@anchor{bac}
@deffn {C Function} void PyConfig_Clear (PyConfig *config)

Release configuration memory.
@end deffn

Most @code{PyConfig} methods @ref{434e,,preinitialize Python} if needed.
In that case, the Python preinitialization configuration
(@ref{ba9,,PyPreConfig}) is based on the @ref{3f5,,PyConfig}. If configuration
fields which are in common with @code{PyPreConfig} are tuned, they must
be set before calling a @code{PyConfig} method:


@itemize *

@item 
@ref{58ea,,PyConfig.dev_mode}

@item 
@ref{414,,PyConfig.isolated}

@item 
@ref{1d35,,PyConfig.parse_argv}

@item 
@ref{409,,PyConfig.use_environment}
@end itemize

Moreover, if @ref{baf,,PyConfig_SetArgv()} or @ref{bb0,,PyConfig_SetBytesArgv()}
is used, this method must be called before other methods, since the
preinitialization configuration depends on command line arguments (if
@ref{1d35,,parse_argv} is non-zero).

The caller of these methods is responsible to handle exceptions (error or
exit) using @code{PyStatus_Exception()} and @code{Py_ExitStatusException()}.

Structure fields:

@geindex PyConfig.argv (C member)
@anchor{c-api/init_config c PyConfig argv}@anchor{3ef}
@deffn {C Member} @ref{bab,,PyWideStringList} argv

@geindex main()
@geindex argv (in module sys)

Set @ref{1470,,sys.argv} command line arguments based on
@ref{3ef,,argv}.  These parameters are similar to those passed
to the program’s @code{main()} function with the difference that the
first entry should refer to the script file to be executed rather than
the executable hosting the Python interpreter.  If there isn’t a script
that will be run, the first entry in @code{argv} can be an
empty string.

Set @ref{1d35,,parse_argv} to @code{1} to parse
@ref{3ef,,argv} the same way the regular Python parses Python
command line arguments and then to strip Python arguments from
@code{argv}.

If @ref{3ef,,argv} is empty, an empty string is added to
ensure that @ref{1470,,sys.argv} always exists and is never empty.

Default: @code{NULL}.

See also the @ref{a9a,,orig_argv} member.
@end deffn

@geindex PyConfig.safe_path (C member)
@anchor{c-api/init_config c PyConfig safe_path}@anchor{97c}
@deffn {C Member} int safe_path

If equals to zero, @code{Py_RunMain()} prepends a potentially unsafe path to
@ref{3e2,,sys.path} at startup:


@itemize *

@item 
If @ref{3ef,,argv[0]} is equal to @code{L"-m"}
(@code{python -m module}), prepend the current working directory.

@item 
If running a script (@code{python script.py}), prepend the script’s
directory.  If it’s a symbolic link, resolve symbolic links.

@item 
Otherwise (@code{python -c code} and @code{python}), prepend an empty string,
which means the current working directory.
@end itemize

Set to @code{1} by the @ref{7c2,,-P} command line option and the
@geindex PYTHONSAFEPATH
@geindex environment variable; PYTHONSAFEPATH
@ref{7c3,,PYTHONSAFEPATH} environment variable.

Default: @code{0} in Python config, @code{1} in isolated config.


Added in version 3.11.

@end deffn

@geindex PyConfig.base_exec_prefix (C member)
@anchor{c-api/init_config c PyConfig base_exec_prefix}@anchor{58e0}
@deffn {C Member} wchar_t *base_exec_prefix

@ref{3e8,,sys.base_exec_prefix}.

Default: @code{NULL}.

Part of the @ref{ab0,,Python Path Configuration} output.

See also @ref{58ed,,PyConfig.exec_prefix}.
@end deffn

@geindex PyConfig.base_executable (C member)
@anchor{c-api/init_config c PyConfig base_executable}@anchor{58e1}
@deffn {C Member} wchar_t *base_executable

Python base executable: @code{sys._base_executable}.

Set by the 
@geindex __PYVENV_LAUNCHER__
@geindex environment variable; __PYVENV_LAUNCHER__
@code{__PYVENV_LAUNCHER__} environment variable.

Set from @ref{645,,PyConfig.executable} if @code{NULL}.

Default: @code{NULL}.

Part of the @ref{ab0,,Python Path Configuration} output.

See also @ref{645,,PyConfig.executable}.
@end deffn

@geindex PyConfig.base_prefix (C member)
@anchor{c-api/init_config c PyConfig base_prefix}@anchor{58e2}
@deffn {C Member} wchar_t *base_prefix

@ref{3e4,,sys.base_prefix}.

Default: @code{NULL}.

Part of the @ref{ab0,,Python Path Configuration} output.

See also @ref{58f3,,PyConfig.prefix}.
@end deffn

@geindex PyConfig.buffered_stdio (C member)
@anchor{c-api/init_config c PyConfig buffered_stdio}@anchor{40f}
@deffn {C Member} int buffered_stdio

If equals to @code{0} and @ref{58e7,,configure_c_stdio} is non-zero,
disable buffering on the C streams stdout and stderr.

Set to @code{0} by the @ref{1dd1,,-u} command line option and the
@geindex PYTHONUNBUFFERED
@geindex environment variable; PYTHONUNBUFFERED
@ref{1dd2,,PYTHONUNBUFFERED} environment variable.

stdin is always opened in buffered mode.

Default: @code{1}.
@end deffn

@geindex PyConfig.bytes_warning (C member)
@anchor{c-api/init_config c PyConfig bytes_warning}@anchor{405}
@deffn {C Member} int bytes_warning

If equals to @code{1}, issue a warning when comparing @ref{193,,bytes} or
@ref{342,,bytearray} with @ref{16a,,str}, or comparing @code{bytes} with
@ref{19c,,int}.

If equal or greater to @code{2}, raise a @ref{e22,,BytesWarning} exception in these
cases.

Incremented by the @ref{7fa,,-b} command line option.

Default: @code{0}.
@end deffn

@geindex PyConfig.warn_default_encoding (C member)
@anchor{c-api/init_config c PyConfig warn_default_encoding}@anchor{58fb}
@deffn {C Member} int warn_default_encoding

If non-zero, emit a @ref{2171,,EncodingWarning} warning when @ref{9c4,,io.TextIOWrapper}
uses its default encoding. See @ref{2182,,Opt-in EncodingWarning} for details.

Default: @code{0}.


Added in version 3.10.

@end deffn

@geindex PyConfig.code_debug_ranges (C member)
@anchor{c-api/init_config c PyConfig code_debug_ranges}@anchor{58e4}
@deffn {C Member} int code_debug_ranges

If equals to @code{0}, disables the inclusion of the end line and column
mappings in code objects. Also disables traceback printing carets to
specific error locations.

Set to @code{0} by the 
@geindex PYTHONNODEBUGRANGES
@geindex environment variable; PYTHONNODEBUGRANGES
@ref{7d4,,PYTHONNODEBUGRANGES} environment variable
and by the @ref{170,,-X no_debug_ranges} command line option.

Default: @code{1}.


Added in version 3.11.

@end deffn

@geindex PyConfig.check_hash_pycs_mode (C member)
@anchor{c-api/init_config c PyConfig check_hash_pycs_mode}@anchor{58e3}
@deffn {C Member} wchar_t *check_hash_pycs_mode

Control the validation behavior of hash-based @code{.pyc} files:
value of the @ref{2165,,--check-hash-based-pycs} command line option.

Valid values:


@itemize -

@item 
@code{L"always"}: Hash the source file for invalidation regardless of
value of the ‘check_source’ flag.

@item 
@code{L"never"}: Assume that hash-based pycs always are valid.

@item 
@code{L"default"}: The ‘check_source’ flag in hash-based pycs
determines invalidation.
@end itemize

Default: @code{L"default"}.

See also 
@geindex Python Enhancement Proposals; PEP 552
PEP 552@footnote{https://peps.python.org/pep-0552/} “Deterministic pycs”.
@end deffn

@geindex PyConfig.configure_c_stdio (C member)
@anchor{c-api/init_config c PyConfig configure_c_stdio}@anchor{58e7}
@deffn {C Member} int configure_c_stdio

If non-zero, configure C standard streams:


@itemize *

@item 
On Windows, set the binary mode (@code{O_BINARY}) on stdin, stdout and
stderr.

@item 
If @ref{40f,,buffered_stdio} equals zero, disable buffering
of stdin, stdout and stderr streams.

@item 
If @ref{3fd,,interactive} is non-zero, enable stream
buffering on stdin and stdout (only stdout on Windows).
@end itemize

Default: @code{1} in Python config, @code{0} in isolated config.
@end deffn

@geindex PyConfig.dev_mode (C member)
@anchor{c-api/init_config c PyConfig dev_mode}@anchor{58ea}
@deffn {C Member} int dev_mode

If non-zero, enable the @ref{509,,Python Development Mode}.

Set to @code{1} by the @ref{170,,-X dev} option and the
@geindex PYTHONDEVMODE
@geindex environment variable; PYTHONDEVMODE
@ref{ced,,PYTHONDEVMODE} environment variable.

Default: @code{-1} in Python mode, @code{0} in isolated mode.
@end deffn

@geindex PyConfig.dump_refs (C member)
@anchor{c-api/init_config c PyConfig dump_refs}@anchor{58eb}
@deffn {C Member} int dump_refs

Dump Python references?

If non-zero, dump all objects which are still alive at exit.

Set to @code{1} by the 
@geindex PYTHONDUMPREFS
@geindex environment variable; PYTHONDUMPREFS
@ref{ba4,,PYTHONDUMPREFS} environment variable.

Needs a special build of Python with the @code{Py_TRACE_REFS} macro defined:
see the @ref{636,,configure --with-trace-refs option}.

Default: @code{0}.
@end deffn

@geindex PyConfig.dump_refs_file (C member)
@anchor{c-api/init_config c PyConfig dump_refs_file}@anchor{58ec}
@deffn {C Member} wchar_t *dump_refs_file

Filename where to dump Python references.

Set by the 
@geindex PYTHONDUMPREFSFILE
@geindex environment variable; PYTHONDUMPREFSFILE
@ref{1c82,,PYTHONDUMPREFSFILE} environment variable.

Default: @code{NULL}.


Added in version 3.11.

@end deffn

@geindex PyConfig.exec_prefix (C member)
@anchor{c-api/init_config c PyConfig exec_prefix}@anchor{58ed}
@deffn {C Member} wchar_t *exec_prefix

The site-specific directory prefix where the platform-dependent Python
files are installed: @ref{3e9,,sys.exec_prefix}.

Default: @code{NULL}.

Part of the @ref{ab0,,Python Path Configuration} output.

See also @ref{58e0,,PyConfig.base_exec_prefix}.
@end deffn

@geindex PyConfig.executable (C member)
@anchor{c-api/init_config c PyConfig executable}@anchor{645}
@deffn {C Member} wchar_t *executable

The absolute path of the executable binary for the Python interpreter:
@ref{3eb,,sys.executable}.

Default: @code{NULL}.

Part of the @ref{ab0,,Python Path Configuration} output.

See also @ref{58e1,,PyConfig.base_executable}.
@end deffn

@geindex PyConfig.faulthandler (C member)
@anchor{c-api/init_config c PyConfig faulthandler}@anchor{58ee}
@deffn {C Member} int faulthandler

Enable faulthandler?

If non-zero, call @ref{211,,faulthandler.enable()} at startup.

Set to @code{1} by @ref{170,,-X faulthandler} and the
@geindex PYTHONFAULTHANDLER
@geindex environment variable; PYTHONFAULTHANDLER
@ref{128b,,PYTHONFAULTHANDLER} environment variable.

Default: @code{-1} in Python mode, @code{0} in isolated mode.
@end deffn

@geindex PyConfig.filesystem_encoding (C member)
@anchor{c-api/init_config c PyConfig filesystem_encoding}@anchor{419}
@deffn {C Member} wchar_t *filesystem_encoding

@ref{75e,,Filesystem encoding}:
@ref{e59,,sys.getfilesystemencoding()}.

On macOS, Android and VxWorks: use @code{"utf-8"} by default.

On Windows: use @code{"utf-8"} by default, or @code{"mbcs"} if
@ref{416,,legacy_windows_fs_encoding} of
@ref{ba9,,PyPreConfig} is non-zero.

Default encoding on other platforms:


@itemize *

@item 
@code{"utf-8"} if @ref{41b,,PyPreConfig.utf8_mode} is non-zero.

@item 
@code{"ascii"} if Python detects that @code{nl_langinfo(CODESET)} announces
the ASCII encoding, whereas the @code{mbstowcs()} function
decodes from a different encoding (usually Latin1).

@item 
@code{"utf-8"} if @code{nl_langinfo(CODESET)} returns an empty string.

@item 
Otherwise, use the @ref{54b,,locale encoding}:
@code{nl_langinfo(CODESET)} result.
@end itemize

At Python startup, the encoding name is normalized to the Python codec
name. For example, @code{"ANSI_X3.4-1968"} is replaced with @code{"ascii"}.

See also the @ref{41a,,filesystem_errors} member.
@end deffn

@geindex PyConfig.filesystem_errors (C member)
@anchor{c-api/init_config c PyConfig filesystem_errors}@anchor{41a}
@deffn {C Member} wchar_t *filesystem_errors

@ref{75e,,Filesystem error handler}:
@ref{ee8,,sys.getfilesystemencodeerrors()}.

On Windows: use @code{"surrogatepass"} by default, or @code{"replace"}  if
@ref{416,,legacy_windows_fs_encoding} of
@ref{ba9,,PyPreConfig} is non-zero.

On other platforms: use @code{"surrogateescape"} by default.

Supported error handlers:


@itemize *

@item 
@code{"strict"}

@item 
@code{"surrogateescape"}

@item 
@code{"surrogatepass"} (only supported with the UTF-8 encoding)
@end itemize

See also the @ref{419,,filesystem_encoding} member.
@end deffn

@geindex PyConfig.use_frozen_modules (C member)
@anchor{c-api/init_config c PyConfig use_frozen_modules}@anchor{58fa}
@deffn {C Member} int use_frozen_modules

If non-zero, use frozen modules.

Set by the 
@geindex PYTHON_FROZEN_MODULES
@geindex environment variable; PYTHON_FROZEN_MODULES
@ref{4ae,,PYTHON_FROZEN_MODULES} environment variable.

Default: @code{1} in a release build, or @code{0} in a @ref{50a,,debug build}.
@end deffn

@geindex PyConfig.hash_seed (C member)
@anchor{c-api/init_config c PyConfig hash_seed}@anchor{412}
@deffn {C Member} unsigned long hash_seed
@end deffn

@geindex PyConfig.use_hash_seed (C member)
@anchor{c-api/init_config c PyConfig use_hash_seed}@anchor{411}
@deffn {C Member} int use_hash_seed

Randomized hash function seed.

If @ref{411,,use_hash_seed} is zero, a seed is chosen randomly
at Python startup, and @ref{412,,hash_seed} is ignored.

Set by the 
@geindex PYTHONHASHSEED
@geindex environment variable; PYTHONHASHSEED
@ref{1283,,PYTHONHASHSEED} environment variable.

Default `use_hash_seed' value: @code{-1} in Python mode, @code{0} in isolated
mode.
@end deffn

@geindex PyConfig.home (C member)
@anchor{c-api/init_config c PyConfig home}@anchor{3f1}
@deffn {C Member} wchar_t *home

Set the default Python “home” directory, that is, the location of the
standard Python libraries (see 
@geindex PYTHONHOME
@geindex environment variable; PYTHONHOME
@ref{3ee,,PYTHONHOME}).

Set by the 
@geindex PYTHONHOME
@geindex environment variable; PYTHONHOME
@ref{3ee,,PYTHONHOME} environment variable.

Default: @code{NULL}.

Part of the @ref{ab0,,Python Path Configuration} input.
@end deffn

@geindex PyConfig.import_time (C member)
@anchor{c-api/init_config c PyConfig import_time}@anchor{58ef}
@deffn {C Member} int import_time

@quotation

If @code{1}, profile import time.
If @code{2}, include additional output that indicates
when an imported module has already been loaded.

Set by the @ref{170,,-X importtime} option and the
@geindex PYTHONPROFILEIMPORTTIME
@geindex environment variable; PYTHONPROFILEIMPORTTIME
@ref{cf3,,PYTHONPROFILEIMPORTTIME} environment variable.

Default: @code{0}.
@end quotation


Changed in version 3.14: Added support for @code{import_time = 2}

@end deffn

@geindex PyConfig.inspect (C member)
@anchor{c-api/init_config c PyConfig inspect}@anchor{3ff}
@deffn {C Member} int inspect

Enter interactive mode after executing a script or a command.

If greater than @code{0}, enable inspect: when a script is passed as first
argument or the -c option is used, enter interactive mode after executing
the script or the command, even when @ref{760,,sys.stdin} does not appear to
be a terminal.

Incremented by the @ref{16e7,,-i} command line option. Set to @code{1} if the
@geindex PYTHONINSPECT
@geindex environment variable; PYTHONINSPECT
@ref{16e6,,PYTHONINSPECT} environment variable is non-empty.

Default: @code{0}.
@end deffn

@geindex PyConfig.install_signal_handlers (C member)
@anchor{c-api/init_config c PyConfig install_signal_handlers}@anchor{ac1}
@deffn {C Member} int install_signal_handlers

Install Python signal handlers?

Default: @code{1} in Python mode, @code{0} in isolated mode.
@end deffn

@geindex PyConfig.interactive (C member)
@anchor{c-api/init_config c PyConfig interactive}@anchor{3fd}
@deffn {C Member} int interactive

If greater than @code{0}, enable the interactive mode (REPL).

Incremented by the @ref{16e7,,-i} command line option.

Default: @code{0}.
@end deffn

@geindex PyConfig.int_max_str_digits (C member)
@anchor{c-api/init_config c PyConfig int_max_str_digits}@anchor{58f0}
@deffn {C Member} int int_max_str_digits

Configures the @ref{80c,,integer string conversion length limitation}.  An initial value of @code{-1} means the value will
be taken from the command line or environment or otherwise default to
4300 (@ref{2726,,sys.int_info.default_max_str_digits}).  A value of @code{0}
disables the limitation.  Values greater than zero but less than 640
(@ref{4c84,,sys.int_info.str_digits_check_threshold}) are unsupported and
will produce an error.

Configured by the @ref{170,,-X int_max_str_digits} command line
flag or the 
@geindex PYTHONINTMAXSTRDIGITS
@geindex environment variable; PYTHONINTMAXSTRDIGITS
@ref{1b7e,,PYTHONINTMAXSTRDIGITS} environment variable.

Default: @code{-1} in Python mode.  4300
(@ref{2726,,sys.int_info.default_max_str_digits}) in isolated mode.


Added in version 3.12.

@end deffn

@geindex PyConfig.cpu_count (C member)
@anchor{c-api/init_config c PyConfig cpu_count}@anchor{58e9}
@deffn {C Member} int cpu_count

If the value of @ref{58e9,,cpu_count} is not @code{-1} then it will
override the return values of @ref{4dc,,os.cpu_count()},
@ref{4db,,os.process_cpu_count()}, and @ref{1175,,multiprocessing.cpu_count()}.

Configured by the @code{-X cpu_count=@var{n|default}} command line
flag or the 
@geindex PYTHON_CPU_COUNT
@geindex environment variable; PYTHON_CPU_COUNT
@ref{51f,,PYTHON_CPU_COUNT} environment variable.

Default: @code{-1}.


Added in version 3.13.

@end deffn

@geindex PyConfig.isolated (C member)
@anchor{c-api/init_config c PyConfig isolated}@anchor{414}
@deffn {C Member} int isolated

If greater than @code{0}, enable isolated mode:


@itemize *

@item 
Set @ref{97c,,safe_path} to @code{1}:
don’t prepend a potentially unsafe path to @ref{3e2,,sys.path} at Python
startup, such as the current directory, the script’s directory or an
empty string.

@item 
Set @ref{409,,use_environment} to @code{0}: ignore @code{PYTHON}
environment variables.

@item 
Set @ref{40d,,user_site_directory} to @code{0}: don’t add the user
site directory to @ref{3e2,,sys.path}.

@item 
Python REPL doesn’t import @ref{bf,,readline} nor enable default readline
configuration on interactive prompts.
@end itemize

Set to @code{1} by the @ref{b5d,,-I} command line option.

Default: @code{0} in Python mode, @code{1} in isolated mode.

See also the @ref{58d7,,Isolated Configuration} and
@ref{590a,,PyPreConfig.isolated}.
@end deffn

@geindex PyConfig.legacy_windows_stdio (C member)
@anchor{c-api/init_config c PyConfig legacy_windows_stdio}@anchor{418}
@deffn {C Member} int legacy_windows_stdio

If non-zero, use @ref{151b,,io.FileIO} instead of
@code{io._WindowsConsoleIO} for @ref{760,,sys.stdin}, @ref{cd3,,sys.stdout}
and @ref{b39,,sys.stderr}.

Set to @code{1} if the 
@geindex PYTHONLEGACYWINDOWSSTDIO
@geindex environment variable; PYTHONLEGACYWINDOWSSTDIO
@ref{e5b,,PYTHONLEGACYWINDOWSSTDIO} environment
variable is set to a non-empty string.

Only available on Windows. @code{#ifdef MS_WINDOWS} macro can be used for
Windows specific code.

Default: @code{0}.

See also the 
@geindex Python Enhancement Proposals; PEP 528
PEP 528@footnote{https://peps.python.org/pep-0528/} (Change Windows console encoding to UTF-8).
@end deffn

@geindex PyConfig.malloc_stats (C member)
@anchor{c-api/init_config c PyConfig malloc_stats}@anchor{58f1}
@deffn {C Member} int malloc_stats

If non-zero, dump statistics on @ref{f11,,Python pymalloc memory allocator} at exit.

Set to @code{1} by the 
@geindex PYTHONMALLOCSTATS
@geindex environment variable; PYTHONMALLOCSTATS
@ref{1f79,,PYTHONMALLOCSTATS} environment variable.

The option is ignored if Python is @ref{21e3,,configured using the --without-pymalloc option}.

Default: @code{0}.
@end deffn

@geindex PyConfig.platlibdir (C member)
@anchor{c-api/init_config c PyConfig platlibdir}@anchor{1d65}
@deffn {C Member} wchar_t *platlibdir

Platform library directory name: @ref{b38,,sys.platlibdir}.

Set by the 
@geindex PYTHONPLATLIBDIR
@geindex environment variable; PYTHONPLATLIBDIR
@ref{1d67,,PYTHONPLATLIBDIR} environment variable.

Default: value of the @code{PLATLIBDIR} macro which is set by the
@ref{21ae,,configure --with-platlibdir option}
(default: @code{"lib"}, or @code{"DLLs"} on Windows).

Part of the @ref{ab0,,Python Path Configuration} input.


Added in version 3.9.



Changed in version 3.11: This macro is now used on Windows to locate the standard
library extension modules, typically under @code{DLLs}. However,
for compatibility, note that this value is ignored for any
non-standard layouts, including in-tree builds and virtual
environments.

@end deffn

@geindex PyConfig.pythonpath_env (C member)
@anchor{c-api/init_config c PyConfig pythonpath_env}@anchor{590f}
@deffn {C Member} wchar_t *pythonpath_env

Module search paths (@ref{3e2,,sys.path}) as a string separated by @code{DELIM}
(@ref{2177,,os.pathsep}).

Set by the 
@geindex PYTHONPATH
@geindex environment variable; PYTHONPATH
@ref{1223,,PYTHONPATH} environment variable.

Default: @code{NULL}.

Part of the @ref{ab0,,Python Path Configuration} input.
@end deffn

@geindex PyConfig.module_search_paths (C member)
@anchor{c-api/init_config c PyConfig module_search_paths}@anchor{643}
@deffn {C Member} @ref{bab,,PyWideStringList} module_search_paths
@end deffn

@geindex PyConfig.module_search_paths_set (C member)
@anchor{c-api/init_config c PyConfig module_search_paths_set}@anchor{806}
@deffn {C Member} int module_search_paths_set

Module search paths: @ref{3e2,,sys.path}.

If @ref{806,,module_search_paths_set} is equal to @code{0},
@ref{3f4,,Py_InitializeFromConfig()} will replace
@ref{643,,module_search_paths} and sets
@code{module_search_paths_set} to @code{1}.

Default: empty list (@code{module_search_paths}) and @code{0}
(@code{module_search_paths_set}).

Part of the @ref{ab0,,Python Path Configuration} output.
@end deffn

@geindex PyConfig.optimization_level (C member)
@anchor{c-api/init_config c PyConfig optimization_level}@anchor{401}
@deffn {C Member} int optimization_level

Compilation optimization level:


@itemize *

@item 
@code{0}: Peephole optimizer, set @code{__debug__} to @code{True}.

@item 
@code{1}: Level 0, remove assertions, set @code{__debug__} to @code{False}.

@item 
@code{2}: Level 1, strip docstrings.
@end itemize

Incremented by the @ref{18d,,-O} command line option. Set to the
@geindex PYTHONOPTIMIZE
@geindex environment variable; PYTHONOPTIMIZE
@ref{2168,,PYTHONOPTIMIZE} environment variable value.

Default: @code{0}.
@end deffn

@geindex PyConfig.orig_argv (C member)
@anchor{c-api/init_config c PyConfig orig_argv}@anchor{a9a}
@deffn {C Member} @ref{bab,,PyWideStringList} orig_argv

The list of the original command line arguments passed to the Python
executable: @ref{a47,,sys.orig_argv}.

If @ref{a9a,,orig_argv} list is empty and
@ref{3ef,,argv} is not a list only containing an empty
string, @ref{998,,PyConfig_Read()} copies @code{argv} into
@code{orig_argv} before modifying
@code{argv} (if @ref{1d35,,parse_argv} is
non-zero).

See also the @ref{3ef,,argv} member and the
@ref{1d85,,Py_GetArgcArgv()} function.

Default: empty list.


Added in version 3.10.

@end deffn

@geindex PyConfig.parse_argv (C member)
@anchor{c-api/init_config c PyConfig parse_argv}@anchor{1d35}
@deffn {C Member} int parse_argv

Parse command line arguments?

If equals to @code{1}, parse @ref{3ef,,argv} the same way the regular
Python parses @ref{120d,,command line arguments}, and strip
Python arguments from @code{argv}.

The @ref{998,,PyConfig_Read()} function only parses
@ref{3ef,,PyConfig.argv} arguments once: @ref{1d35,,PyConfig.parse_argv}
is set to @code{2} after arguments are parsed. Since Python arguments are
stripped from @code{PyConfig.argv}, parsing arguments twice would
parse the application options as Python options.

Default: @code{1} in Python mode, @code{0} in isolated mode.


Changed in version 3.10: The @ref{3ef,,PyConfig.argv} arguments are now only parsed if
@ref{1d35,,PyConfig.parse_argv} equals to @code{1}.

@end deffn

@geindex PyConfig.parser_debug (C member)
@anchor{c-api/init_config c PyConfig parser_debug}@anchor{3f7}
@deffn {C Member} int parser_debug

Parser debug mode. If greater than @code{0}, turn on parser debugging output (for expert only, depending
on compilation options).

Incremented by the @ref{2166,,-d} command line option. Set to the
@geindex PYTHONDEBUG
@geindex environment variable; PYTHONDEBUG
@ref{2167,,PYTHONDEBUG} environment variable value.

Needs a @ref{50a,,debug build of Python} (the @code{Py_DEBUG} macro
must be defined).

Default: @code{0}.
@end deffn

@geindex PyConfig.pathconfig_warnings (C member)
@anchor{c-api/init_config c PyConfig pathconfig_warnings}@anchor{407}
@deffn {C Member} int pathconfig_warnings

If non-zero, calculation of path configuration is allowed to log
warnings into @code{stderr}. If equals to @code{0}, suppress these warnings.

Default: @code{1} in Python mode, @code{0} in isolated mode.

Part of the @ref{ab0,,Python Path Configuration} input.


Changed in version 3.11: Now also applies on Windows.

@end deffn

@geindex PyConfig.prefix (C member)
@anchor{c-api/init_config c PyConfig prefix}@anchor{58f3}
@deffn {C Member} wchar_t *prefix

The site-specific directory prefix where the platform independent Python
files are installed: @ref{3e5,,sys.prefix}.

Default: @code{NULL}.

Part of the @ref{ab0,,Python Path Configuration} output.

See also @ref{58e2,,PyConfig.base_prefix}.
@end deffn

@geindex PyConfig.program_name (C member)
@anchor{c-api/init_config c PyConfig program_name}@anchor{3f0}
@deffn {C Member} wchar_t *program_name

Program name used to initialize @ref{645,,executable} and in
early error messages during Python initialization.


@itemize *

@item 
On macOS, use 
@geindex PYTHONEXECUTABLE
@geindex environment variable; PYTHONEXECUTABLE
@ref{217b,,PYTHONEXECUTABLE} environment variable if set.

@item 
If the @code{WITH_NEXT_FRAMEWORK} macro is defined, use
@geindex __PYVENV_LAUNCHER__
@geindex environment variable; __PYVENV_LAUNCHER__
@code{__PYVENV_LAUNCHER__} environment variable if set.

@item 
Use @code{argv[0]} of @ref{3ef,,argv} if available and
non-empty.

@item 
Otherwise, use @code{L"python"} on Windows, or @code{L"python3"} on other
platforms.
@end itemize

Default: @code{NULL}.

Part of the @ref{ab0,,Python Path Configuration} input.
@end deffn

@geindex PyConfig.pycache_prefix (C member)
@anchor{c-api/init_config c PyConfig pycache_prefix}@anchor{58f4}
@deffn {C Member} wchar_t *pycache_prefix

Directory where cached @code{.pyc} files are written:
@ref{ba2,,sys.pycache_prefix}.

Set by the @ref{170,,-X pycache_prefix=PATH} command line option and
the 
@geindex PYTHONPYCACHEPREFIX
@geindex environment variable; PYTHONPYCACHEPREFIX
@ref{ba1,,PYTHONPYCACHEPREFIX} environment variable.
The command-line option takes precedence.

If @code{NULL}, @ref{ba2,,sys.pycache_prefix} is set to @code{None}.

Default: @code{NULL}.
@end deffn

@geindex PyConfig.quiet (C member)
@anchor{c-api/init_config c PyConfig quiet}@anchor{3fb}
@deffn {C Member} int quiet

Quiet mode. If greater than @code{0}, don’t display the copyright and version at
Python startup in interactive mode.

Incremented by the @ref{17cf,,-q} command line option.

Default: @code{0}.
@end deffn

@geindex PyConfig.run_command (C member)
@anchor{c-api/init_config c PyConfig run_command}@anchor{5874}
@deffn {C Member} wchar_t *run_command

Value of the @ref{1a9,,-c} command line option.

Used by @ref{bc2,,Py_RunMain()}.

Default: @code{NULL}.
@end deffn

@geindex PyConfig.run_filename (C member)
@anchor{c-api/init_config c PyConfig run_filename}@anchor{5875}
@deffn {C Member} wchar_t *run_filename

Filename passed on the command line: trailing command line argument
without @ref{1a9,,-c} or @ref{23e,,-m}. It is used by the
@ref{bc2,,Py_RunMain()} function.

For example, it is set to @code{script.py} by the @code{python3 script.py arg}
command line.

See also the @ref{58f7,,PyConfig.skip_source_first_line} option.

Default: @code{NULL}.
@end deffn

@geindex PyConfig.run_module (C member)
@anchor{c-api/init_config c PyConfig run_module}@anchor{5876}
@deffn {C Member} wchar_t *run_module

Value of the @ref{23e,,-m} command line option.

Used by @ref{bc2,,Py_RunMain()}.

Default: @code{NULL}.
@end deffn

@geindex PyConfig.run_presite (C member)
@anchor{c-api/init_config c PyConfig run_presite}@anchor{58f5}
@deffn {C Member} wchar_t *run_presite

@code{package.module} path to module that should be imported before
@code{site.py} is run.

Set by the @ref{170,,-X presite=package.module} command-line
option and the 
@geindex PYTHON_PRESITE
@geindex environment variable; PYTHON_PRESITE
@ref{2172,,PYTHON_PRESITE} environment variable.
The command-line option takes precedence.

Needs a @ref{50a,,debug build of Python} (the @code{Py_DEBUG} macro
must be defined).

Default: @code{NULL}.
@end deffn

@geindex PyConfig.show_ref_count (C member)
@anchor{c-api/init_config c PyConfig show_ref_count}@anchor{58f6}
@deffn {C Member} int show_ref_count

Show total reference count at exit (excluding @ref{292,,immortal} objects)?

Set to @code{1} by @ref{170,,-X showrefcount} command line option.

Needs a @ref{50a,,debug build of Python} (the @code{Py_REF_DEBUG}
macro must be defined).

Default: @code{0}.
@end deffn

@geindex PyConfig.site_import (C member)
@anchor{c-api/init_config c PyConfig site_import}@anchor{403}
@deffn {C Member} int site_import

Import the @ref{cc,,site} module at startup?

If equal to zero, disable the import of the module site and the
site-dependent manipulations of @ref{3e2,,sys.path} that it entails.

Also disable these manipulations if the @ref{cc,,site} module is explicitly
imported later (call @ref{216a,,site.main()} if you want them to be triggered).

Set to @code{0} by the @ref{13b4,,-S} command line option.

@ref{89e,,sys.flags.no_site} is set to the inverted value of
@ref{403,,site_import}.

Default: @code{1}.
@end deffn

@geindex PyConfig.skip_source_first_line (C member)
@anchor{c-api/init_config c PyConfig skip_source_first_line}@anchor{58f7}
@deffn {C Member} int skip_source_first_line

If non-zero, skip the first line of the @ref{5875,,PyConfig.run_filename}
source.

It allows the usage of non-Unix forms of @code{#!cmd}. This is intended for
a DOS specific hack only.

Set to @code{1} by the @ref{216e,,-x} command line option.

Default: @code{0}.
@end deffn

@geindex PyConfig.stdio_encoding (C member)
@anchor{c-api/init_config c PyConfig stdio_encoding}@anchor{644}
@deffn {C Member} wchar_t *stdio_encoding
@end deffn

@geindex PyConfig.stdio_errors (C member)
@anchor{c-api/init_config c PyConfig stdio_errors}@anchor{4c87}
@deffn {C Member} wchar_t *stdio_errors

Encoding and encoding errors of @ref{760,,sys.stdin}, @ref{cd3,,sys.stdout} and
@ref{b39,,sys.stderr} (but @code{sys.stderr} always uses
@code{"backslashreplace"} error handler).

Use the 
@geindex PYTHONIOENCODING
@geindex environment variable; PYTHONIOENCODING
@ref{1210,,PYTHONIOENCODING} environment variable if it is
non-empty.

Default encoding:


@itemize *

@item 
@code{"UTF-8"} if @ref{41b,,PyPreConfig.utf8_mode} is non-zero.

@item 
Otherwise, use the @ref{54b,,locale encoding}.
@end itemize

Default error handler:


@itemize *

@item 
On Windows: use @code{"surrogateescape"}.

@item 
@code{"surrogateescape"} if @ref{41b,,PyPreConfig.utf8_mode} is non-zero,
or if the LC_CTYPE locale is “C” or “POSIX”.

@item 
@code{"strict"} otherwise.
@end itemize

See also @ref{418,,PyConfig.legacy_windows_stdio}.
@end deffn

@geindex PyConfig.tracemalloc (C member)
@anchor{c-api/init_config c PyConfig tracemalloc}@anchor{58f9}
@deffn {C Member} int tracemalloc

Enable tracemalloc?

If non-zero, call @ref{216f,,tracemalloc.start()} at startup.

Set by @ref{170,,-X tracemalloc=N} command line option and by the
@geindex PYTHONTRACEMALLOC
@geindex environment variable; PYTHONTRACEMALLOC
@ref{2170,,PYTHONTRACEMALLOC} environment variable.

Default: @code{-1} in Python mode, @code{0} in isolated mode.
@end deffn

@geindex PyConfig.perf_profiling (C member)
@anchor{c-api/init_config c PyConfig perf_profiling}@anchor{58f2}
@deffn {C Member} int perf_profiling

Enable the Linux @code{perf} profiler support?

If equals to @code{1}, enable support for the Linux @code{perf} profiler.

If equals to @code{2}, enable support for the Linux @code{perf} profiler with
DWARF JIT support.

Set to @code{1} by @ref{170,,-X perf} command-line option and the
@geindex PYTHONPERFSUPPORT
@geindex environment variable; PYTHONPERFSUPPORT
@ref{69a,,PYTHONPERFSUPPORT} environment variable.

Set to @code{2} by the @ref{170,,-X perf_jit} command-line option and
the 
@geindex PYTHON_PERF_JIT_SUPPORT
@geindex environment variable; PYTHON_PERF_JIT_SUPPORT
@ref{4b0,,PYTHON_PERF_JIT_SUPPORT} environment variable.

Default: @code{-1}.


@subsubheading See also


See @ref{4af,,Python support for the Linux perf profiler} for more information.



Added in version 3.12.

@end deffn

@geindex PyConfig.stdlib_dir (C member)
@anchor{c-api/init_config c PyConfig stdlib_dir}@anchor{58f8}
@deffn {C Member} wchar_t *stdlib_dir

Directory of the Python standard library.

Default: @code{NULL}.


Added in version 3.11.

@end deffn

@geindex PyConfig.use_environment (C member)
@anchor{c-api/init_config c PyConfig use_environment}@anchor{409}
@deffn {C Member} int use_environment

Use @ref{808,,environment variables}?

If equals to zero, ignore the @ref{808,,environment variables}.

Set to @code{0} by the @ref{b5c,,-E} environment variable.

Default: @code{1} in Python config and @code{0} in isolated config.
@end deffn

@geindex PyConfig.use_system_logger (C member)
@anchor{c-api/init_config c PyConfig use_system_logger}@anchor{22b5}
@deffn {C Member} int use_system_logger

If non-zero, @code{stdout} and @code{stderr} will be redirected to the system
log.

Only available on macOS 10.12 and later, and on iOS.

Default: @code{0} (don’t use the system log) on macOS; @code{1} on iOS (use the
system log).


Added in version 3.14.

@end deffn

@geindex PyConfig.user_site_directory (C member)
@anchor{c-api/init_config c PyConfig user_site_directory}@anchor{40d}
@deffn {C Member} int user_site_directory

If non-zero, add the user site directory to @ref{3e2,,sys.path}.

Set to @code{0} by the @ref{159a,,-s} and @ref{b5d,,-I} command line options.

Set to @code{0} by the 
@geindex PYTHONNOUSERSITE
@geindex environment variable; PYTHONNOUSERSITE
@ref{159b,,PYTHONNOUSERSITE} environment variable.

Default: @code{1} in Python mode, @code{0} in isolated mode.
@end deffn

@geindex PyConfig.verbose (C member)
@anchor{c-api/init_config c PyConfig verbose}@anchor{3f9}
@deffn {C Member} int verbose

Verbose mode. If greater than @code{0}, print a message each time a module is
imported, showing the place (filename or built-in module) from which
it is loaded.

If greater than or equal to @code{2}, print a message for each file that is
checked for when searching for a module. Also provides information on
module cleanup at exit.

Incremented by the @ref{1631,,-v} command line option.

Set by the 
@geindex PYTHONVERBOSE
@geindex environment variable; PYTHONVERBOSE
@ref{216b,,PYTHONVERBOSE} environment variable value.

Default: @code{0}.
@end deffn

@geindex PyConfig.warnoptions (C member)
@anchor{c-api/init_config c PyConfig warnoptions}@anchor{641}
@deffn {C Member} @ref{bab,,PyWideStringList} warnoptions

Options of the @ref{119,,warnings} module to build warnings filters, lowest
to highest priority: @ref{3f3,,sys.warnoptions}.

The @ref{119,,warnings} module adds @ref{3f3,,sys.warnoptions} in the reverse
order: the last @ref{641,,PyConfig.warnoptions} item becomes the first
item of @code{warnings.filters} which is checked first (highest
priority).

The @ref{acb,,-W} command line options adds its value to
@ref{641,,warnoptions}, it can be used multiple times.

The 
@geindex PYTHONWARNINGS
@geindex environment variable; PYTHONWARNINGS
@ref{da9,,PYTHONWARNINGS} environment variable can also be used to add
warning options. Multiple options can be specified, separated by commas
(@code{,}).

Default: empty list.
@end deffn

@geindex PyConfig.write_bytecode (C member)
@anchor{c-api/init_config c PyConfig write_bytecode}@anchor{40b}
@deffn {C Member} int write_bytecode

If equal to @code{0}, Python won’t try to write @code{.pyc} files on the import of
source modules.

Set to @code{0} by the @ref{15d9,,-B} command line option and the
@geindex PYTHONDONTWRITEBYTECODE
@geindex environment variable; PYTHONDONTWRITEBYTECODE
@ref{15da,,PYTHONDONTWRITEBYTECODE} environment variable.

@ref{4c51,,sys.dont_write_bytecode} is initialized to the inverted value of
@ref{40b,,write_bytecode}.

Default: @code{1}.
@end deffn

@geindex PyConfig.xoptions (C member)
@anchor{c-api/init_config c PyConfig xoptions}@anchor{642}
@deffn {C Member} @ref{bab,,PyWideStringList} xoptions

Values of the @ref{170,,-X} command line options: @ref{2174,,sys._xoptions}.

Default: empty list.
@end deffn

@geindex PyConfig._pystats (C member)
@anchor{c-api/init_config c PyConfig _pystats}@anchor{58fc}
@deffn {C Member} int _pystats

If non-zero, write performance statistics at Python exit.

Need a special build with the @code{Py_STATS} macro:
see @ref{1b7c,,--enable-pystats}.

Default: @code{0}.
@end deffn
@end deffn

If @ref{1d35,,parse_argv} is non-zero, @ref{3ef,,argv}
arguments are parsed the same way the regular Python parses @ref{120d,,command line arguments}, and Python arguments are stripped from
@code{argv}.

The @ref{642,,xoptions} options are parsed to set other options: see
the @ref{170,,-X} command line option.


Changed in version 3.9: The @code{show_alloc_count} field has been removed.


@node Initialization with PyConfig,Isolated Configuration,PyConfig,PyConfig C API
@anchor{c-api/init_config init-from-config}@anchor{5873}@anchor{c-api/init_config initialization-with-pyconfig}@anchor{5910}
@subsubsection Initialization with PyConfig


Initializing the interpreter from a populated configuration struct is handled
by calling @ref{3f4,,Py_InitializeFromConfig()}.

The caller is responsible to handle exceptions (error or exit) using
@ref{bb6,,PyStatus_Exception()} and @ref{bbf,,Py_ExitStatusException()}.

If @ref{338f,,PyImport_FrozenModules()}, @ref{1b60,,PyImport_AppendInittab()} or
@ref{1b61,,PyImport_ExtendInittab()} are used, they must be set or called after
Python preinitialization and before the Python initialization. If Python is
initialized multiple times, @code{PyImport_AppendInittab()} or
@code{PyImport_ExtendInittab()} must be called before each Python
initialization.

The current configuration (@code{PyConfig} type) is stored in
@code{PyInterpreterState.config}.

Example setting the program name:

@example
void init_python(void)
@{
    PyStatus status;

    PyConfig config;
    PyConfig_InitPythonConfig(&config);

    /* Set the program name. Implicitly preinitialize Python. */
    status = PyConfig_SetString(&config, &config.program_name,
                                L"/path/to/my_program");
    if (PyStatus_Exception(status)) @{
        goto exception;
    @}

    status = Py_InitializeFromConfig(&config);
    if (PyStatus_Exception(status)) @{
        goto exception;
    @}
    PyConfig_Clear(&config);
    return;

exception:
    PyConfig_Clear(&config);
    Py_ExitStatusException(status);
@}
@end example

More complete example modifying the default configuration, read the
configuration, and then override some parameters. Note that since
3.11, many parameters are not calculated until initialization, and
so values cannot be read from the configuration structure. Any values
set before initialize is called will be left unchanged by
initialization:

@example
PyStatus init_python(const char *program_name)
@{
    PyStatus status;

    PyConfig config;
    PyConfig_InitPythonConfig(&config);

    /* Set the program name before reading the configuration
       (decode byte string from the locale encoding).

       Implicitly preinitialize Python. */
    status = PyConfig_SetBytesString(&config, &config.program_name,
                                     program_name);
    if (PyStatus_Exception(status)) @{
        goto done;
    @}

    /* Read all configuration at once */
    status = PyConfig_Read(&config);
    if (PyStatus_Exception(status)) @{
        goto done;
    @}

    /* Specify sys.path explicitly */
    /* If you want to modify the default set of paths, finish
       initialization first and then use PySys_GetObject("path") */
    config.module_search_paths_set = 1;
    status = PyWideStringList_Append(&config.module_search_paths,
                                     L"/path/to/stdlib");
    if (PyStatus_Exception(status)) @{
        goto done;
    @}
    status = PyWideStringList_Append(&config.module_search_paths,
                                     L"/path/to/more/modules");
    if (PyStatus_Exception(status)) @{
        goto done;
    @}

    /* Override executable computed by PyConfig_Read() */
    status = PyConfig_SetString(&config, &config.executable,
                                L"/path/to/my_executable");
    if (PyStatus_Exception(status)) @{
        goto done;
    @}

    status = Py_InitializeFromConfig(&config);

done:
    PyConfig_Clear(&config);
    return status;
@}
@end example

@node Isolated Configuration,Python Configuration,Initialization with PyConfig,PyConfig C API
@anchor{c-api/init_config init-isolated-conf}@anchor{58d7}@anchor{c-api/init_config isolated-configuration}@anchor{5911}
@subsubsection Isolated Configuration


@ref{bb3,,PyPreConfig_InitIsolatedConfig()} and
@ref{bad,,PyConfig_InitIsolatedConfig()} functions create a configuration to
isolate Python from the system. For example, to embed Python into an
application.

This configuration ignores global configuration variables, environment
variables, command line arguments (@ref{3ef,,PyConfig.argv} is not parsed)
and user site directory. The C standard streams (ex: @code{stdout}) and the
LC_CTYPE locale are left unchanged. Signal handlers are not installed.

Configuration files are still used with this configuration to determine
paths that are unspecified. Ensure @ref{3f1,,PyConfig.home} is specified
to avoid computing the default path configuration.

@node Python Configuration,Python Path Configuration,Isolated Configuration,PyConfig C API
@anchor{c-api/init_config init-python-config}@anchor{5877}@anchor{c-api/init_config python-configuration}@anchor{5912}
@subsubsection Python Configuration


@ref{bb4,,PyPreConfig_InitPythonConfig()} and @ref{bae,,PyConfig_InitPythonConfig()}
functions create a configuration to build a customized Python which behaves as
the regular Python.

Environments variables and command line arguments are used to configure
Python, whereas global configuration variables are ignored.

This function enables C locale coercion (
@geindex Python Enhancement Proposals; PEP 538
PEP 538@footnote{https://peps.python.org/pep-0538/})
and @ref{868,,Python UTF-8 Mode}
(
@geindex Python Enhancement Proposals; PEP 540
PEP 540@footnote{https://peps.python.org/pep-0540/}) depending on the LC_CTYPE locale, 
@geindex PYTHONUTF8
@geindex environment variable; PYTHONUTF8
@ref{cd5,,PYTHONUTF8} and
@geindex PYTHONCOERCECLOCALE
@geindex environment variable; PYTHONCOERCECLOCALE
@ref{cd2,,PYTHONCOERCECLOCALE} environment variables.

@node Python Path Configuration,,Python Configuration,PyConfig C API
@anchor{c-api/init_config init-path-config}@anchor{ab0}@anchor{c-api/init_config python-path-configuration}@anchor{5913}
@subsubsection Python Path Configuration


@ref{3f5,,PyConfig} contains multiple fields for the path configuration:


@itemize *

@item 
Path configuration inputs:


@itemize *

@item 
@ref{3f1,,PyConfig.home}

@item 
@ref{1d65,,PyConfig.platlibdir}

@item 
@ref{407,,PyConfig.pathconfig_warnings}

@item 
@ref{3f0,,PyConfig.program_name}

@item 
@ref{590f,,PyConfig.pythonpath_env}

@item 
current working directory: to get absolute paths

@item 
@code{PATH} environment variable to get the program full path
(from @ref{3f0,,PyConfig.program_name})

@item 
@code{__PYVENV_LAUNCHER__} environment variable

@item 
(Windows only) Application paths in the registry under
“SoftwarePythonPythonCoreX.YPythonPath” of HKEY_CURRENT_USER and
HKEY_LOCAL_MACHINE (where X.Y is the Python version).
@end itemize

@item 
Path configuration output fields:


@itemize *

@item 
@ref{58e0,,PyConfig.base_exec_prefix}

@item 
@ref{58e1,,PyConfig.base_executable}

@item 
@ref{58e2,,PyConfig.base_prefix}

@item 
@ref{58ed,,PyConfig.exec_prefix}

@item 
@ref{645,,PyConfig.executable}

@item 
@ref{806,,PyConfig.module_search_paths_set},
@ref{643,,PyConfig.module_search_paths}

@item 
@ref{58f3,,PyConfig.prefix}
@end itemize
@end itemize

If at least one “output field” is not set, Python calculates the path
configuration to fill unset fields. If
@ref{806,,module_search_paths_set} is equal to @code{0},
@ref{643,,module_search_paths} is overridden and
@code{module_search_paths_set} is set to @code{1}.

It is possible to completely ignore the function calculating the default
path configuration by setting explicitly all path configuration output
fields listed above. A string is considered as set even if it is non-empty.
@code{module_search_paths} is considered as set if
@code{module_search_paths_set} is set to @code{1}. In this case,
@code{module_search_paths} will be used without modification.

Set @ref{407,,pathconfig_warnings} to @code{0} to suppress warnings when
calculating the path configuration (Unix only, Windows does not log any warning).

If @ref{58e2,,base_prefix} or @ref{58e0,,base_exec_prefix}
fields are not set, they inherit their value from @ref{58f3,,prefix}
and @ref{58ed,,exec_prefix} respectively.

@ref{bc2,,Py_RunMain()} and @ref{e24,,Py_Main()} modify @ref{3e2,,sys.path}:


@itemize *

@item 
If @ref{5875,,run_filename} is set and is a directory which contains a
@code{__main__.py} script, prepend @code{run_filename} to
@ref{3e2,,sys.path}.

@item 
If @ref{414,,isolated} is zero:


@itemize *

@item 
If @ref{5876,,run_module} is set, prepend the current directory
to @ref{3e2,,sys.path}. Do nothing if the current directory cannot be read.

@item 
If @ref{5875,,run_filename} is set, prepend the directory of the
filename to @ref{3e2,,sys.path}.

@item 
Otherwise, prepend an empty string to @ref{3e2,,sys.path}.
@end itemize
@end itemize

If @ref{403,,site_import} is non-zero, @ref{3e2,,sys.path} can be
modified by the @ref{cc,,site} module. If
@ref{40d,,user_site_directory} is non-zero and the user’s
site-package directory exists, the @code{site} module appends the user’s
site-package directory to @code{sys.path}.

The following configuration files are used by the path configuration:


@itemize *

@item 
@code{pyvenv.cfg}

@item 
@code{._pth} file (ex: @code{python._pth})

@item 
@code{pybuilddir.txt} (Unix only)
@end itemize

If a @code{._pth} file is present:


@itemize *

@item 
Set @ref{414,,isolated} to @code{1}.

@item 
Set @ref{409,,use_environment} to @code{0}.

@item 
Set @ref{403,,site_import} to @code{0}.

@item 
Set @ref{97c,,safe_path} to @code{1}.
@end itemize

If @ref{3f1,,home} is not set and a @code{pyvenv.cfg} file is present in
the same directory as @ref{645,,executable}, or its parent,
@ref{58f3,,prefix} and @ref{58ed,,exec_prefix} are set that
location. When this happens, @ref{58e2,,base_prefix} and
@ref{58e0,,base_exec_prefix} still keep their value, pointing to the
base installation. See @ref{4c13,,Virtual Environments} for more
information.

The @code{__PYVENV_LAUNCHER__} environment variable is used to set
@ref{58e1,,PyConfig.base_executable}.


Changed in version 3.14: @ref{58f3,,prefix}, and @ref{58ed,,exec_prefix}, are now
set to the @code{pyvenv.cfg} directory. This was previously done by @ref{cc,,site},
therefore affected by @ref{13b4,,-S}.


@node Py_GetArgcArgv,Delaying main module execution,PyConfig C API,Python Initialization Configuration
@anchor{c-api/init_config py-getargcargv}@anchor{5914}
@subsection Py_GetArgcArgv()


@geindex Py_GetArgcArgv (C function)
@anchor{c-api/init_config c Py_GetArgcArgv}@anchor{1d85}
@deffn {C Function} void Py_GetArgcArgv (int *argc, wchar_t ***argv)

Get the original command line arguments, before Python modified them.

See also @ref{a9a,,PyConfig.orig_argv} member.
@end deffn

@node Delaying main module execution,,Py_GetArgcArgv,Python Initialization Configuration
@anchor{c-api/init_config delaying-main-module-execution}@anchor{5915}
@subsection Delaying main module execution


In some embedding use cases, it may be desirable to separate interpreter initialization
from the execution of the main module.

This separation can be achieved by setting @code{PyConfig.run_command} to the empty
string during initialization (to prevent the interpreter from dropping into the
interactive prompt), and then subsequently executing the desired main module
code using @code{__main__.__dict__} as the global namespace.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Memory Management,Object Implementation Support,Python Initialization Configuration,Python/C API reference manual
@anchor{c-api/memory doc}@anchor{5916}@anchor{c-api/memory memory}@anchor{5908}@anchor{c-api/memory memory-management}@anchor{5917}@anchor{c-api/memory translation-repo}@anchor{5918}
@section Memory Management


@menu
* Overview: Overview<4>. 
* Allocator Domains:: 
* Raw Memory Interface:: 
* Memory Interface:: 
* Object allocators:: 
* Default Memory Allocators:: 
* Customize Memory Allocators:: 
* Debug hooks on the Python memory allocators:: 
* The pymalloc allocator:: 
* The mimalloc allocator:: 
* tracemalloc C API:: 
* Examples: Examples<38>. 

@end menu

@node Overview<4>,Allocator Domains,,Memory Management
@anchor{c-api/memory memoryoverview}@anchor{5919}@anchor{c-api/memory overview}@anchor{591a}
@subsection Overview


Memory management in Python involves a private heap containing all Python
objects and data structures. The management of this private heap is ensured
internally by the `Python memory manager'.  The Python memory manager has
different components which deal with various dynamic storage management aspects,
like sharing, segmentation, preallocation or caching.

At the lowest level, a raw memory allocator ensures that there is enough room in
the private heap for storing all Python-related data by interacting with the
memory manager of the operating system. On top of the raw memory allocator,
several object-specific allocators operate on the same heap and implement
distinct memory management policies adapted to the peculiarities of every object
type. For example, integer objects are managed differently within the heap than
strings, tuples or dictionaries because integers imply different storage
requirements and speed/space tradeoffs. The Python memory manager thus delegates
some of the work to the object-specific allocators, but ensures that the latter
operate within the bounds of the private heap.

It is important to understand that the management of the Python heap is
performed by the interpreter itself and that the user has no control over it,
even if they regularly manipulate object pointers to memory blocks inside that
heap.  The allocation of heap space for Python objects and other internal
buffers is performed on demand by the Python memory manager through the Python/C
API functions listed in this document.

@geindex malloc (C function)
@geindex calloc (C function)
@geindex realloc (C function)
@geindex free (C function)

To avoid memory corruption, extension writers should never try to operate on
Python objects with the functions exported by the C library: @code{malloc()},
@code{calloc()}, @code{realloc()} and @code{free()}.  This will result in  mixed
calls between the C allocator and the Python memory manager with fatal
consequences, because they implement different algorithms and operate on
different heaps.  However, one may safely allocate and release memory blocks
with the C library allocator for individual purposes, as shown in the following
example:

@example
PyObject *res;
char *buf = (char *) malloc(BUFSIZ); /* for I/O */

if (buf == NULL)
    return PyErr_NoMemory();
...Do some I/O operation involving buf...
res = PyBytes_FromString(buf);
free(buf); /* malloc'ed */
return res;
@end example

In this example, the memory request for the I/O buffer is handled by the C
library allocator. The Python memory manager is involved only in the allocation
of the bytes object returned as a result.

In most situations, however, it is recommended to allocate memory from the
Python heap specifically because the latter is under control of the Python
memory manager. For example, this is required when the interpreter is extended
with new object types written in C. Another reason for using the Python heap is
the desire to `inform' the Python memory manager about the memory needs of the
extension module. Even when the requested memory is used exclusively for
internal, highly specific purposes, delegating all memory requests to the Python
memory manager causes the interpreter to have a more accurate image of its
memory footprint as a whole. Consequently, under certain circumstances, the
Python memory manager may or may not trigger appropriate actions, like garbage
collection, memory compaction or other preventive procedures. Note that by using
the C library allocator as shown in the previous example, the allocated memory
for the I/O buffer completely escapes the Python memory manager.


@subsubheading See also


The 
@geindex PYTHONMALLOC
@geindex environment variable; PYTHONMALLOC
@ref{e64,,PYTHONMALLOC} environment variable can be used to configure
the memory allocators used by Python.

The 
@geindex PYTHONMALLOCSTATS
@geindex environment variable; PYTHONMALLOCSTATS
@ref{1f79,,PYTHONMALLOCSTATS} environment variable can be used to print
statistics of the @ref{f11,,pymalloc memory allocator} every time a
new pymalloc object arena is created, and on shutdown.


@node Allocator Domains,Raw Memory Interface,Overview<4>,Memory Management
@anchor{c-api/memory allocator-domains}@anchor{591b}
@subsection Allocator Domains

@anchor{c-api/memory id1}@anchor{591c}
All allocating functions belong to one of three different “domains” (see also
@ref{591d,,PyMemAllocatorDomain}). These domains represent different allocation
strategies and are optimized for different purposes. The specific details on
how every domain allocates memory or what internal functions each domain calls
is considered an implementation detail, but for debugging purposes a simplified
table can be found at @ref{217e,,Default Memory Allocators}.
The APIs used to allocate and free a block of memory must be from the same domain.
For example, @ref{164e,,PyMem_Free()} must be used to free memory allocated using @ref{e66,,PyMem_Malloc()}.

The three allocation domains are:


@itemize *

@item 
Raw domain: intended for allocating memory for general-purpose memory
buffers where the allocation `must' go to the system allocator or where the
allocator can operate without an @ref{5231,,attached thread state}. The memory
is requested directly from the system. See @ref{591e,,Raw Memory Interface}.

@item 
“Mem” domain: intended for allocating memory for Python buffers and
general-purpose memory buffers where the allocation must be performed with
an @ref{5231,,attached thread state}. The memory is taken from the Python private heap.
See @ref{591f,,Memory Interface}.

@item 
Object domain: intended for allocating memory for Python objects. The
memory is taken from the Python private heap. See @ref{5920,,Object allocators}.
@end itemize

@cartouche
@quotation Note 
The @ref{1f6,,free-threaded} build requires that only Python objects are allocated using the “object” domain
and that all Python objects are allocated using that domain. This differs from the prior Python versions,
where this was only a best practice and not a hard requirement.

For example, buffers (non-Python objects) should be allocated using @ref{e66,,PyMem_Malloc()},
@ref{631,,PyMem_RawMalloc()}, or @code{malloc()}, but not @ref{e68,,PyObject_Malloc()}.

See @ref{5921,,Memory Allocation APIs}.
@end quotation
@end cartouche

@node Raw Memory Interface,Memory Interface,Allocator Domains,Memory Management
@anchor{c-api/memory raw-memory-interface}@anchor{5922}@anchor{c-api/memory raw-memoryinterface}@anchor{591e}
@subsection Raw Memory Interface


The following function sets are wrappers to the system allocator. These
functions are thread-safe, so a @ref{188f,,thread state} does not
need to be @ref{5231,,attached}.

The @ref{217e,,default raw memory allocator} uses
the following functions: @code{malloc()}, @code{calloc()}, @code{realloc()}
and @code{free()}; call @code{malloc(1)} (or @code{calloc(1, 1)}) when requesting
zero bytes.


Added in version 3.4.


@geindex PyMem_RawMalloc (C function)
@anchor{c-api/memory c PyMem_RawMalloc}@anchor{631}
@deffn {C Function} void *PyMem_RawMalloc (size_t n)
` Part of the @ref{776,,Stable ABI} since version 3.13.'
Allocates `n' bytes and returns a pointer of type void* to the
allocated memory, or @code{NULL} if the request fails.

Requesting zero bytes returns a distinct non-@code{NULL} pointer if possible, as
if @code{PyMem_RawMalloc(1)} had been called instead. The memory will not have
been initialized in any way.
@end deffn

@geindex PyMem_RawCalloc (C function)
@anchor{c-api/memory c PyMem_RawCalloc}@anchor{632}
@deffn {C Function} void *PyMem_RawCalloc (size_t nelem, size_t elsize)
` Part of the @ref{776,,Stable ABI} since version 3.13.'
Allocates `nelem' elements each of size `elsize' bytes and returns
a pointer of type void* to the allocated memory, or @code{NULL} if the
request fails. The memory is initialized to zeros.

Requesting zero elements or elements of size zero bytes returns a distinct
non-@code{NULL} pointer if possible, as if @code{PyMem_RawCalloc(1, 1)} had been
called instead.


Added in version 3.5.

@end deffn

@geindex PyMem_RawRealloc (C function)
@anchor{c-api/memory c PyMem_RawRealloc}@anchor{633}
@deffn {C Function} void *PyMem_RawRealloc (void *p, size_t n)
` Part of the @ref{776,,Stable ABI} since version 3.13.'
Resizes the memory block pointed to by `p' to `n' bytes. The contents will
be unchanged to the minimum of the old and the new sizes.

If `p' is @code{NULL}, the call is equivalent to @code{PyMem_RawMalloc(n)}; else if
`n' is equal to zero, the memory block is resized but is not freed, and the
returned pointer is non-@code{NULL}.

Unless `p' is @code{NULL}, it must have been returned by a previous call to
@ref{631,,PyMem_RawMalloc()}, @ref{633,,PyMem_RawRealloc()} or
@ref{632,,PyMem_RawCalloc()}.

If the request fails, @ref{633,,PyMem_RawRealloc()} returns @code{NULL} and `p'
remains a valid pointer to the previous memory area.
@end deffn

@geindex PyMem_RawFree (C function)
@anchor{c-api/memory c PyMem_RawFree}@anchor{634}
@deffn {C Function} void PyMem_RawFree (void *p)
` Part of the @ref{776,,Stable ABI} since version 3.13.'
Frees the memory block pointed to by `p', which must have been returned by a
previous call to @ref{631,,PyMem_RawMalloc()}, @ref{633,,PyMem_RawRealloc()} or
@ref{632,,PyMem_RawCalloc()}.  Otherwise, or if @code{PyMem_RawFree(p)} has been
called before, undefined behavior occurs.

If `p' is @code{NULL}, no operation is performed.
@end deffn

@node Memory Interface,Object allocators,Raw Memory Interface,Memory Management
@anchor{c-api/memory memory-interface}@anchor{5923}@anchor{c-api/memory memoryinterface}@anchor{591f}
@subsection Memory Interface


The following function sets, modeled after the ANSI C standard, but specifying
behavior when requesting zero bytes, are available for allocating and releasing
memory from the Python heap.

In the GIL-enabled build (default build) the
@ref{217e,,default memory allocator} uses the
@ref{f11,,pymalloc memory allocator}, whereas in the
@ref{1791,,free-threaded build}, the default is the
@ref{176a,,mimalloc memory allocator} instead.

@cartouche
@quotation Warning 
There must be an @ref{5231,,attached thread state} when using these functions.
@end quotation
@end cartouche


Changed in version 3.6: The default allocator is now pymalloc instead of system @code{malloc()}.



Changed in version 3.13: In the @ref{1f6,,free-threaded} build, the default allocator
is now @ref{176a,,mimalloc}.


@geindex PyMem_Malloc (C function)
@anchor{c-api/memory c PyMem_Malloc}@anchor{e66}
@deffn {C Function} void *PyMem_Malloc (size_t n)
` Part of the @ref{776,,Stable ABI}.'
Allocates `n' bytes and returns a pointer of type void* to the
allocated memory, or @code{NULL} if the request fails.

Requesting zero bytes returns a distinct non-@code{NULL} pointer if possible, as
if @code{PyMem_Malloc(1)} had been called instead. The memory will not have
been initialized in any way.
@end deffn

@geindex PyMem_Calloc (C function)
@anchor{c-api/memory c PyMem_Calloc}@anchor{10b3}
@deffn {C Function} void *PyMem_Calloc (size_t nelem, size_t elsize)
` Part of the @ref{776,,Stable ABI} since version 3.7.'
Allocates `nelem' elements each of size `elsize' bytes and returns
a pointer of type void* to the allocated memory, or @code{NULL} if the
request fails. The memory is initialized to zeros.

Requesting zero elements or elements of size zero bytes returns a distinct
non-@code{NULL} pointer if possible, as if @code{PyMem_Calloc(1, 1)} had been called
instead.


Added in version 3.5.

@end deffn

@geindex PyMem_Realloc (C function)
@anchor{c-api/memory c PyMem_Realloc}@anchor{1238}
@deffn {C Function} void *PyMem_Realloc (void *p, size_t n)
` Part of the @ref{776,,Stable ABI}.'
Resizes the memory block pointed to by `p' to `n' bytes. The contents will be
unchanged to the minimum of the old and the new sizes.

If `p' is @code{NULL}, the call is equivalent to @code{PyMem_Malloc(n)}; else if `n'
is equal to zero, the memory block is resized but is not freed, and the
returned pointer is non-@code{NULL}.

Unless `p' is @code{NULL}, it must have been returned by a previous call to
@ref{e66,,PyMem_Malloc()}, @ref{1238,,PyMem_Realloc()} or @ref{10b3,,PyMem_Calloc()}.

If the request fails, @ref{1238,,PyMem_Realloc()} returns @code{NULL} and `p' remains
a valid pointer to the previous memory area.
@end deffn

@geindex PyMem_Free (C function)
@anchor{c-api/memory c PyMem_Free}@anchor{164e}
@deffn {C Function} void PyMem_Free (void *p)
` Part of the @ref{776,,Stable ABI}.'
Frees the memory block pointed to by `p', which must have been returned by a
previous call to @ref{e66,,PyMem_Malloc()}, @ref{1238,,PyMem_Realloc()} or
@ref{10b3,,PyMem_Calloc()}.  Otherwise, or if @code{PyMem_Free(p)} has been called
before, undefined behavior occurs.

If `p' is @code{NULL}, no operation is performed.
@end deffn

The following type-oriented macros are provided for convenience.  Note  that
`TYPE' refers to any C type.

@geindex PyMem_New (C macro)
@anchor{c-api/memory c PyMem_New}@anchor{1730}
@deffn {C Macro} PyMem_New (TYPE, n)

Same as @ref{e66,,PyMem_Malloc()}, but allocates @code{(n * sizeof(TYPE))} bytes of
memory.  Returns a pointer cast to @code{TYPE*}.  The memory will not have
been initialized in any way.
@end deffn

@geindex PyMem_Resize (C macro)
@anchor{c-api/memory c PyMem_Resize}@anchor{5924}
@deffn {C Macro} PyMem_Resize (p, TYPE, n)

Same as @ref{1238,,PyMem_Realloc()}, but the memory block is resized to @code{(n *
sizeof(TYPE))} bytes.  Returns a pointer cast to @code{TYPE*}. On return,
`p' will be a pointer to the new memory area, or @code{NULL} in the event of
failure.

This is a C preprocessor macro; `p' is always reassigned.  Save the original
value of `p' to avoid losing memory when handling errors.
@end deffn

@geindex PyMem_Del (C function)
@anchor{c-api/memory c PyMem_Del}@anchor{1731}
@deffn {C Function} void PyMem_Del (void *p)

Same as @ref{164e,,PyMem_Free()}.
@end deffn

@menu
* Deprecated aliases: Deprecated aliases<2>. 

@end menu

@node Deprecated aliases<2>,,,Memory Interface
@anchor{c-api/memory deprecated-aliases}@anchor{5925}
@subsubsection Deprecated aliases


These are @ref{23f,,soft deprecated} aliases to existing functions and macros.
They exist solely for backwards compatibility.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Deprecated alias

@tab

Corresponding function or macro

@item

@geindex PyMem_MALLOC (C macro)
@anchor{c-api/memory c PyMem_MALLOC}@anchor{5926}
@deffn {C Macro} PyMem_MALLOC (size)
@end deffn

@tab

@ref{e66,,PyMem_Malloc()}

@item

@geindex PyMem_NEW (C macro)
@anchor{c-api/memory c PyMem_NEW}@anchor{5927}
@deffn {C Macro} PyMem_NEW (type, size)
@end deffn

@tab

@ref{1730,,PyMem_New}

@item

@geindex PyMem_REALLOC (C macro)
@anchor{c-api/memory c PyMem_REALLOC}@anchor{5928}
@deffn {C Macro} PyMem_REALLOC (ptr, size)
@end deffn

@tab

@ref{1238,,PyMem_Realloc()}

@item

@geindex PyMem_RESIZE (C macro)
@anchor{c-api/memory c PyMem_RESIZE}@anchor{5929}
@deffn {C Macro} PyMem_RESIZE (ptr, type, size)
@end deffn

@tab

@ref{5924,,PyMem_Resize}

@item

@geindex PyMem_FREE (C macro)
@anchor{c-api/memory c PyMem_FREE}@anchor{592a}
@deffn {C Macro} PyMem_FREE (ptr)
@end deffn

@tab

@ref{164e,,PyMem_Free()}

@item

@geindex PyMem_DEL (C macro)
@anchor{c-api/memory c PyMem_DEL}@anchor{592b}
@deffn {C Macro} PyMem_DEL (ptr)
@end deffn

@tab

@ref{164e,,PyMem_Free()}

@end multitable



Changed in version 3.4: The macros are now aliases of the corresponding functions and macros.
Previously, their behavior was the same, but their use did not necessarily
preserve binary compatibility across Python versions.



Deprecated since version 2.0.


@node Object allocators,Default Memory Allocators,Memory Interface,Memory Management
@anchor{c-api/memory object-allocators}@anchor{592c}@anchor{c-api/memory objectinterface}@anchor{5920}
@subsection Object allocators


The following function sets, modeled after the ANSI C standard, but specifying
behavior when requesting zero bytes, are available for allocating and releasing
memory from the Python heap.

@cartouche
@quotation Note 
There is no guarantee that the memory returned by these allocators can be
successfully cast to a Python object when intercepting the allocating
functions in this domain by the methods described in
the @ref{592d,,Customize Memory Allocators} section.
@end quotation
@end cartouche

The @ref{217e,,default object allocator} uses the
@ref{f11,,pymalloc memory allocator}.  In the
@ref{1f6,,free-threaded} build, the default is the
@ref{176a,,mimalloc memory allocator} instead.

@cartouche
@quotation Warning 
There must be an @ref{5231,,attached thread state} when using these functions.
@end quotation
@end cartouche

@geindex PyObject_Malloc (C function)
@anchor{c-api/memory c PyObject_Malloc}@anchor{e68}
@deffn {C Function} void *PyObject_Malloc (size_t n)
` Part of the @ref{776,,Stable ABI}.'
Allocates `n' bytes and returns a pointer of type void* to the
allocated memory, or @code{NULL} if the request fails.

Requesting zero bytes returns a distinct non-@code{NULL} pointer if possible, as
if @code{PyObject_Malloc(1)} had been called instead. The memory will not have
been initialized in any way.
@end deffn

@geindex PyObject_Calloc (C function)
@anchor{c-api/memory c PyObject_Calloc}@anchor{10b4}
@deffn {C Function} void *PyObject_Calloc (size_t nelem, size_t elsize)
` Part of the @ref{776,,Stable ABI} since version 3.7.'
Allocates `nelem' elements each of size `elsize' bytes and returns
a pointer of type void* to the allocated memory, or @code{NULL} if the
request fails. The memory is initialized to zeros.

Requesting zero elements or elements of size zero bytes returns a distinct
non-@code{NULL} pointer if possible, as if @code{PyObject_Calloc(1, 1)} had been called
instead.


Added in version 3.5.

@end deffn

@geindex PyObject_Realloc (C function)
@anchor{c-api/memory c PyObject_Realloc}@anchor{164f}
@deffn {C Function} void *PyObject_Realloc (void *p, size_t n)
` Part of the @ref{776,,Stable ABI}.'
Resizes the memory block pointed to by `p' to `n' bytes. The contents will be
unchanged to the minimum of the old and the new sizes.

If `p' is @code{NULL}, the call is equivalent to @code{PyObject_Malloc(n)}; else if `n'
is equal to zero, the memory block is resized but is not freed, and the
returned pointer is non-@code{NULL}.

Unless `p' is @code{NULL}, it must have been returned by a previous call to
@ref{e68,,PyObject_Malloc()}, @ref{164f,,PyObject_Realloc()} or @ref{10b4,,PyObject_Calloc()}.

If the request fails, @ref{164f,,PyObject_Realloc()} returns @code{NULL} and `p' remains
a valid pointer to the previous memory area.
@end deffn

@geindex PyObject_Free (C function)
@anchor{c-api/memory c PyObject_Free}@anchor{e65}
@deffn {C Function} void PyObject_Free (void *p)
` Part of the @ref{776,,Stable ABI}.'
Frees the memory block pointed to by `p', which must have been returned by a
previous call to @ref{e68,,PyObject_Malloc()}, @ref{164f,,PyObject_Realloc()} or
@ref{10b4,,PyObject_Calloc()}.  Otherwise, or if @code{PyObject_Free(p)} has been called
before, undefined behavior occurs.

If `p' is @code{NULL}, no operation is performed.

Do not call this directly to free an object’s memory; call the type’s
@ref{522f,,tp_free} slot instead.

Do not use this for memory allocated by @ref{c9f,,PyObject_GC_New} or
@ref{ca0,,PyObject_GC_NewVar}; use @ref{170f,,PyObject_GC_Del()} instead.


@subsubheading See also



@itemize *

@item 
@ref{170f,,PyObject_GC_Del()} is the equivalent of this function for memory
allocated by types that support garbage collection.

@item 
@ref{e68,,PyObject_Malloc()}

@item 
@ref{164f,,PyObject_Realloc()}

@item 
@ref{10b4,,PyObject_Calloc()}

@item 
@ref{b82,,PyObject_New}

@item 
@ref{b83,,PyObject_NewVar}

@item 
@ref{c67,,PyType_GenericAlloc()}

@item 
@ref{522f,,tp_free}
@end itemize

@end deffn

@node Default Memory Allocators,Customize Memory Allocators,Object allocators,Memory Management
@anchor{c-api/memory default-memory-allocators}@anchor{217e}@anchor{c-api/memory id2}@anchor{592e}
@subsection Default Memory Allocators


Default memory allocators:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Configuration

@tab

Name

@tab

PyMem_RawMalloc

@tab

PyMem_Malloc

@tab

PyObject_Malloc

@item

Release build

@tab

@code{"pymalloc"}

@tab

@code{malloc}

@tab

@code{pymalloc}

@tab

@code{pymalloc}

@item

Debug build

@tab

@code{"pymalloc_debug"}

@tab

@code{malloc} + debug

@tab

@code{pymalloc} + debug

@tab

@code{pymalloc} + debug

@item

Release build, without pymalloc

@tab

@code{"malloc"}

@tab

@code{malloc}

@tab

@code{malloc}

@tab

@code{malloc}

@item

Debug build, without pymalloc

@tab

@code{"malloc_debug"}

@tab

@code{malloc} + debug

@tab

@code{malloc} + debug

@tab

@code{malloc} + debug

@item

Free-threaded build

@tab

@code{"mimalloc"}

@tab

@code{mimalloc}

@tab

@code{mimalloc}

@tab

@code{mimalloc}

@item

Free-threaded debug build

@tab

@code{"mimalloc_debug"}

@tab

@code{mimalloc} + debug

@tab

@code{mimalloc} + debug

@tab

@code{mimalloc} + debug

@end multitable


Legend:


@itemize *

@item 
Name: value for 
@geindex PYTHONMALLOC
@geindex environment variable; PYTHONMALLOC
@ref{e64,,PYTHONMALLOC} environment variable.

@item 
@code{malloc}: system allocators from the standard C library, C functions:
@code{malloc()}, @code{calloc()}, @code{realloc()} and @code{free()}.

@item 
@code{pymalloc}: @ref{f11,,pymalloc memory allocator}.

@item 
@code{mimalloc}: @ref{176a,,mimalloc memory allocator}.

@item 
“+ debug”: with @ref{2180,,debug hooks on the Python memory allocators}.

@item 
“Debug build”: @ref{50a,,Python build in debug mode}.
@end itemize

@node Customize Memory Allocators,Debug hooks on the Python memory allocators,Default Memory Allocators,Memory Management
@anchor{c-api/memory customize-memory-allocators}@anchor{592d}@anchor{c-api/memory id3}@anchor{592f}
@subsection Customize Memory Allocators



Added in version 3.4.


@geindex PyMemAllocatorEx (C type)
@anchor{c-api/memory c PyMemAllocatorEx}@anchor{10d4}
@deffn {C Type} type PyMemAllocatorEx

Structure used to describe a memory block allocator. The structure has
the following fields:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Field

@tab

Meaning

@item

@code{void *ctx}

@tab

user context passed as first argument

@item

@code{void* malloc(void *ctx, size_t size)}

@tab

allocate a memory block

@item

@code{void* calloc(void *ctx, size_t nelem, size_t elsize)}

@tab

allocate a memory block initialized
with zeros

@item

@code{void* realloc(void *ctx, void *ptr, size_t new_size)}

@tab

allocate or resize a memory block

@item

@code{void free(void *ctx, void *ptr)}

@tab

free a memory block

@end multitable



Changed in version 3.5: The @code{PyMemAllocator} structure was renamed to
@ref{10d4,,PyMemAllocatorEx} and a new @code{calloc} field was added.

@end deffn

@geindex PyMemAllocatorDomain (C type)
@anchor{c-api/memory c PyMemAllocatorDomain}@anchor{591d}
@deffn {C Type} type PyMemAllocatorDomain

Enum used to identify an allocator domain. Domains:

@geindex PYMEM_DOMAIN_RAW (C macro)
@anchor{c-api/memory c PYMEM_DOMAIN_RAW}@anchor{217f}
@deffn {C Macro} PYMEM_DOMAIN_RAW

Functions:


@itemize *

@item 
@ref{631,,PyMem_RawMalloc()}

@item 
@ref{633,,PyMem_RawRealloc()}

@item 
@ref{632,,PyMem_RawCalloc()}

@item 
@ref{634,,PyMem_RawFree()}
@end itemize
@end deffn

@geindex PYMEM_DOMAIN_MEM (C macro)
@anchor{c-api/memory c PYMEM_DOMAIN_MEM}@anchor{e69}
@deffn {C Macro} PYMEM_DOMAIN_MEM

Functions:


@itemize *

@item 
@ref{e66,,PyMem_Malloc()},

@item 
@ref{1238,,PyMem_Realloc()}

@item 
@ref{10b3,,PyMem_Calloc()}

@item 
@ref{164e,,PyMem_Free()}
@end itemize
@end deffn

@geindex PYMEM_DOMAIN_OBJ (C macro)
@anchor{c-api/memory c PYMEM_DOMAIN_OBJ}@anchor{e67}
@deffn {C Macro} PYMEM_DOMAIN_OBJ

Functions:


@itemize *

@item 
@ref{e68,,PyObject_Malloc()}

@item 
@ref{164f,,PyObject_Realloc()}

@item 
@ref{10b4,,PyObject_Calloc()}

@item 
@ref{e65,,PyObject_Free()}
@end itemize
@end deffn
@end deffn

@geindex PyMem_GetAllocator (C function)
@anchor{c-api/memory c PyMem_GetAllocator}@anchor{586f}
@deffn {C Function} void PyMem_GetAllocator (PyMemAllocatorDomain domain, PyMemAllocatorEx *allocator)

Get the memory block allocator of the specified domain.
@end deffn

@geindex PyMem_SetAllocator (C function)
@anchor{c-api/memory c PyMem_SetAllocator}@anchor{7a9}
@deffn {C Function} void PyMem_SetAllocator (PyMemAllocatorDomain domain, PyMemAllocatorEx *allocator)

Set the memory block allocator of the specified domain.

The new allocator must return a distinct non-@code{NULL} pointer when requesting
zero bytes.

For the @ref{217f,,PYMEM_DOMAIN_RAW} domain, the allocator must be
thread-safe: a @ref{188f,,thread state} is not @ref{5231,,attached}
when the allocator is called.

For the remaining domains, the allocator must also be thread-safe:
the allocator may be called in different interpreters that do not
share a @ref{165,,GIL}.

If the new allocator is not a hook (does not call the previous allocator),
the @ref{e6a,,PyMem_SetupDebugHooks()} function must be called to reinstall the
debug hooks on top on the new allocator.

See also @ref{58df,,PyPreConfig.allocator} and @ref{434e,,Preinitialize Python with PyPreConfig}.

@cartouche
@quotation Warning 
@ref{7a9,,PyMem_SetAllocator()} does have the following contract:


@itemize *

@item 
It can be called after @ref{41c,,Py_PreInitialize()} and before
@ref{3f4,,Py_InitializeFromConfig()} to install a custom memory
allocator. There are no restrictions over the installed allocator
other than the ones imposed by the domain (for instance, the Raw
Domain allows the allocator to be called without an @ref{5231,,attached thread state}).
See @ref{591c,,the section on allocator domains} for more
information.

@item 
If called after Python has finish initializing (after
@ref{3f4,,Py_InitializeFromConfig()} has been called) the allocator
`must' wrap the existing allocator. Substituting the current
allocator for some other arbitrary one is `not supported'.
@end itemize
@end quotation
@end cartouche


Changed in version 3.12: All allocators must be thread-safe.

@end deffn

@geindex PyMem_SetupDebugHooks (C function)
@anchor{c-api/memory c PyMem_SetupDebugHooks}@anchor{e6a}
@deffn {C Function} void PyMem_SetupDebugHooks (void)

Setup @ref{2180,,debug hooks in the Python memory allocators}
to detect memory errors.
@end deffn

@node Debug hooks on the Python memory allocators,The pymalloc allocator,Customize Memory Allocators,Memory Management
@anchor{c-api/memory debug-hooks-on-the-python-memory-allocators}@anchor{5930}@anchor{c-api/memory pymem-debug-hooks}@anchor{2180}
@subsection Debug hooks on the Python memory allocators


When @ref{50a,,Python is built in debug mode}, the
@ref{e6a,,PyMem_SetupDebugHooks()} function is called at the @ref{434e,,Python preinitialization} to setup debug hooks on Python memory allocators
to detect memory errors.

The 
@geindex PYTHONMALLOC
@geindex environment variable; PYTHONMALLOC
@ref{e64,,PYTHONMALLOC} environment variable can be used to install debug
hooks on a Python compiled in release mode (ex: @code{PYTHONMALLOC=debug}).

The @ref{e6a,,PyMem_SetupDebugHooks()} function can be used to set debug hooks
after calling @ref{7a9,,PyMem_SetAllocator()}.

These debug hooks fill dynamically allocated memory blocks with special,
recognizable bit patterns. Newly allocated memory is filled with the byte
@code{0xCD} (@code{PYMEM_CLEANBYTE}), freed memory is filled with the byte @code{0xDD}
(@code{PYMEM_DEADBYTE}). Memory blocks are surrounded by “forbidden bytes”
filled with the byte @code{0xFD} (@code{PYMEM_FORBIDDENBYTE}). Strings of these bytes
are unlikely to be valid addresses, floats, or ASCII strings.

Runtime checks:


@itemize -

@item 
Detect API violations. For example, detect if @ref{e65,,PyObject_Free()} is
called on a memory block allocated by @ref{e66,,PyMem_Malloc()}.

@item 
Detect write before the start of the buffer (buffer underflow).

@item 
Detect write after the end of the buffer (buffer overflow).

@item 
Check that there is an @ref{5231,,attached thread state} when
allocator functions of @ref{e67,,PYMEM_DOMAIN_OBJ} (ex:
@ref{e68,,PyObject_Malloc()}) and @ref{e69,,PYMEM_DOMAIN_MEM} (ex:
@ref{e66,,PyMem_Malloc()}) domains are called.
@end itemize

On error, the debug hooks use the @ref{106,,tracemalloc} module to get the
traceback where a memory block was allocated. The traceback is only displayed
if @code{tracemalloc} is tracing Python memory allocations and the memory block
was traced.

Let `S' = @code{sizeof(size_t)}. @code{2*S} bytes are added at each end of each block
of `N' bytes requested.  The memory layout is like so, where p represents the
address returned by a malloc-like or realloc-like function (@code{p[i:j]} means
the slice of bytes from @code{*(p+i)} inclusive up to @code{*(p+j)} exclusive; note
that the treatment of negative indices differs from a Python slice):


@table @asis

@item @code{p[-2*S:-S]}

Number of bytes originally asked for.  This is a size_t, big-endian (easier
to read in a memory dump).

@item @code{p[-S]}

API identifier (ASCII character):


@itemize *

@item 
@code{'r'} for @ref{217f,,PYMEM_DOMAIN_RAW}.

@item 
@code{'m'} for @ref{e69,,PYMEM_DOMAIN_MEM}.

@item 
@code{'o'} for @ref{e67,,PYMEM_DOMAIN_OBJ}.
@end itemize

@item @code{p[-S+1:0]}

Copies of PYMEM_FORBIDDENBYTE.  Used to catch under- writes and reads.

@item @code{p[0:N]}

The requested memory, filled with copies of PYMEM_CLEANBYTE, used to catch
reference to uninitialized memory.  When a realloc-like function is called
requesting a larger memory block, the new excess bytes are also filled with
PYMEM_CLEANBYTE.  When a free-like function is called, these are
overwritten with PYMEM_DEADBYTE, to catch reference to freed memory.  When
a realloc- like function is called requesting a smaller memory block, the
excess old bytes are also filled with PYMEM_DEADBYTE.

@item @code{p[N:N+S]}

Copies of PYMEM_FORBIDDENBYTE.  Used to catch over- writes and reads.

@item @code{p[N+S:N+2*S]}

Only used if the @code{PYMEM_DEBUG_SERIALNO} macro is defined (not defined by
default).

A serial number, incremented by 1 on each call to a malloc-like or
realloc-like function.  Big-endian @code{size_t}.  If “bad memory” is detected
later, the serial number gives an excellent way to set a breakpoint on the
next run, to capture the instant at which this block was passed out.  The
static function bumpserialno() in obmalloc.c is the only place the serial
number is incremented, and exists so you can set such a breakpoint easily.
@end table

A realloc-like or free-like function first checks that the PYMEM_FORBIDDENBYTE
bytes at each end are intact.  If they’ve been altered, diagnostic output is
written to stderr, and the program is aborted via Py_FatalError().  The other
main failure mode is provoking a memory error when a program reads up one of
the special bit patterns and tries to use it as an address.  If you get in a
debugger then and look at the object, you’re likely to see that it’s entirely
filled with PYMEM_DEADBYTE (meaning freed memory is getting used) or
PYMEM_CLEANBYTE (meaning uninitialized memory is getting used).


Changed in version 3.6: The @ref{e6a,,PyMem_SetupDebugHooks()} function now also works on Python
compiled in release mode.  On error, the debug hooks now use
@ref{106,,tracemalloc} to get the traceback where a memory block was allocated.
The debug hooks now also check if there is an @ref{5231,,attached thread state} when
functions of @ref{e67,,PYMEM_DOMAIN_OBJ} and @ref{e69,,PYMEM_DOMAIN_MEM} domains are
called.



Changed in version 3.8: Byte patterns @code{0xCB} (@code{PYMEM_CLEANBYTE}), @code{0xDB} (@code{PYMEM_DEADBYTE})
and @code{0xFB} (@code{PYMEM_FORBIDDENBYTE}) have been replaced with @code{0xCD},
@code{0xDD} and @code{0xFD} to use the same values than Windows CRT debug
@code{malloc()} and @code{free()}.


@node The pymalloc allocator,The mimalloc allocator,Debug hooks on the Python memory allocators,Memory Management
@anchor{c-api/memory pymalloc}@anchor{f11}@anchor{c-api/memory the-pymalloc-allocator}@anchor{5931}
@subsection The pymalloc allocator


Python has a `pymalloc' allocator optimized for small objects (smaller or equal
to 512 bytes) with a short lifetime. It uses memory mappings called “arenas”
with a fixed size of either 256 KiB on 32-bit platforms or 1 MiB on 64-bit
platforms. It falls back to @ref{631,,PyMem_RawMalloc()} and
@ref{633,,PyMem_RawRealloc()} for allocations larger than 512 bytes.

`pymalloc' is the @ref{217e,,default allocator} of the
@ref{e69,,PYMEM_DOMAIN_MEM} (ex: @ref{e66,,PyMem_Malloc()}) and
@ref{e67,,PYMEM_DOMAIN_OBJ} (ex: @ref{e68,,PyObject_Malloc()}) domains.

The arena allocator uses the following functions:


@itemize *

@item 
@code{VirtualAlloc()} and @code{VirtualFree()} on Windows,

@item 
@code{mmap()} and @code{munmap()} if available,

@item 
@code{malloc()} and @code{free()} otherwise.
@end itemize

This allocator is disabled if Python is configured with the
@ref{21e3,,--without-pymalloc} option. It can also be disabled at runtime using
the 
@geindex PYTHONMALLOC
@geindex environment variable; PYTHONMALLOC
@ref{e64,,PYTHONMALLOC} environment variable (ex: @code{PYTHONMALLOC=malloc}).

Typically, it makes sense to disable the pymalloc allocator when building
Python with AddressSanitizer (@ref{21ec,,--with-address-sanitizer}) which helps
uncover low level bugs within the C code.

@menu
* Customize pymalloc Arena Allocator:: 

@end menu

@node Customize pymalloc Arena Allocator,,,The pymalloc allocator
@anchor{c-api/memory customize-pymalloc-arena-allocator}@anchor{5932}
@subsubsection Customize pymalloc Arena Allocator



Added in version 3.4.


@geindex PyObjectArenaAllocator (C type)
@anchor{c-api/memory c PyObjectArenaAllocator}@anchor{5933}
@deffn {C Type} type PyObjectArenaAllocator

Structure used to describe an arena allocator. The structure has
three fields:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Field

@tab

Meaning

@item

@code{void *ctx}

@tab

user context passed as first argument

@item

@code{void* alloc(void *ctx, size_t size)}

@tab

allocate an arena of size bytes

@item

@code{void free(void *ctx, void *ptr, size_t size)}

@tab

free an arena

@end multitable

@end deffn

@geindex PyObject_GetArenaAllocator (C function)
@anchor{c-api/memory c PyObject_GetArenaAllocator}@anchor{5870}
@deffn {C Function} void PyObject_GetArenaAllocator (PyObjectArenaAllocator *allocator)

Get the arena allocator.
@end deffn

@geindex PyObject_SetArenaAllocator (C function)
@anchor{c-api/memory c PyObject_SetArenaAllocator}@anchor{586e}
@deffn {C Function} void PyObject_SetArenaAllocator (PyObjectArenaAllocator *allocator)

Set the arena allocator.
@end deffn

@node The mimalloc allocator,tracemalloc C API,The pymalloc allocator,Memory Management
@anchor{c-api/memory mimalloc}@anchor{176a}@anchor{c-api/memory the-mimalloc-allocator}@anchor{5934}
@subsection The mimalloc allocator



Added in version 3.13.


Python supports the mimalloc@footnote{https://github.com/microsoft/mimalloc/}
allocator when the underlying platform support is available.
mimalloc is a general purpose allocator with excellent performance
characteristics, initially developed by Daan Leijen for the runtime systems
of the Koka and Lean languages.

Unlike @ref{f11,,pymalloc}, which is optimized for small objects (512
bytes or fewer), mimalloc handles allocations of any size.

In the @ref{1f6,,free-threaded} build, mimalloc is the default
and `required' allocator for the @ref{e69,,PYMEM_DOMAIN_MEM} and
@ref{e67,,PYMEM_DOMAIN_OBJ} domains.  It cannot be disabled in free-threaded
builds.  The free-threaded build uses per-thread mimalloc heaps, which allows
allocation and deallocation to proceed without locking in most cases.

In the default (non-free-threaded) build, mimalloc is available but not the
default allocator.  It can be selected at runtime using
@geindex PYTHONMALLOC
@geindex environment variable; PYTHONMALLOC
@ref{e64,,PYTHONMALLOC}@code{=mimalloc} (or @code{mimalloc_debug} to include
@ref{2180,,debug hooks}).  It can be disabled at build time
using the @ref{21e2,,--without-mimalloc} configure option, but this option
cannot be combined with @ref{49a,,--disable-gil}.

@node tracemalloc C API,Examples<38>,The mimalloc allocator,Memory Management
@anchor{c-api/memory tracemalloc-c-api}@anchor{5935}
@subsection tracemalloc C API



Added in version 3.7.


@geindex PyTraceMalloc_Track (C function)
@anchor{c-api/memory c PyTraceMalloc_Track}@anchor{db5}
@deffn {C Function} int PyTraceMalloc_Track (unsigned int domain, uintptr_t ptr, size_t size)

Track an allocated memory block in the @ref{106,,tracemalloc} module.

Return @code{0} on success, return @code{-1} on error (failed to allocate memory to
store the trace). Return @code{-2} if tracemalloc is disabled.

If memory block is already tracked, update the existing trace.
@end deffn

@geindex PyTraceMalloc_Untrack (C function)
@anchor{c-api/memory c PyTraceMalloc_Untrack}@anchor{db6}
@deffn {C Function} int PyTraceMalloc_Untrack (unsigned int domain, uintptr_t ptr)

Untrack an allocated memory block in the @ref{106,,tracemalloc} module.
Do nothing if the block was not tracked.

Return @code{-2} if tracemalloc is disabled, otherwise return @code{0}.
@end deffn

@node Examples<38>,,tracemalloc C API,Memory Management
@anchor{c-api/memory examples}@anchor{5936}@anchor{c-api/memory memoryexamples}@anchor{5937}
@subsection Examples


Here is the example from section @ref{5919,,Overview}, rewritten so that the
I/O buffer is allocated from the Python heap by using the first function set:

@example
PyObject *res;
char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */

if (buf == NULL)
    return PyErr_NoMemory();
/* ...Do some I/O operation involving buf... */
res = PyBytes_FromString(buf);
PyMem_Free(buf); /* allocated with PyMem_Malloc */
return res;
@end example

The same code using the type-oriented function set:

@example
PyObject *res;
char *buf = PyMem_New(char, BUFSIZ); /* for I/O */

if (buf == NULL)
    return PyErr_NoMemory();
/* ...Do some I/O operation involving buf... */
res = PyBytes_FromString(buf);
PyMem_Free(buf); /* allocated with PyMem_New */
return res;
@end example

Note that in the two examples above, the buffer is always manipulated via
functions belonging to the same set. Indeed, it is required to use the same
memory API family for a given memory block, so that the risk of mixing different
allocators is reduced to a minimum. The following code sequence contains two
errors, one of which is labeled as `fatal' because it mixes two different
allocators operating on different heaps.

@example
char *buf1 = PyMem_New(char, BUFSIZ);
char *buf2 = (char *) malloc(BUFSIZ);
char *buf3 = (char *) PyMem_Malloc(BUFSIZ);
...
PyMem_Del(buf3);  /* Wrong -- should be PyMem_Free() */
free(buf2);       /* Right -- allocated via malloc() */
free(buf1);       /* Fatal -- should be PyMem_Free()  */
@end example

In addition to the functions aimed at handling raw memory blocks from the Python
heap, objects in Python are allocated and released with @ref{b82,,PyObject_New},
@ref{b83,,PyObject_NewVar} and @ref{e65,,PyObject_Free()}.

These will be explained in the next chapter on defining and implementing new
object types in C.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Object Implementation Support,API and ABI Versioning,Memory Management,Python/C API reference manual
@anchor{c-api/objimpl doc}@anchor{5938}@anchor{c-api/objimpl newtypes}@anchor{5939}@anchor{c-api/objimpl object-implementation-support}@anchor{593a}@anchor{c-api/objimpl translation-repo}@anchor{593b}
@section Object Implementation Support


This chapter describes the functions, types, and macros used when defining new
object types.

@menu
* Allocating objects on the heap:: 
* Object Life Cycle:: 
* Common Object Structures:: 
* Type Object Structures:: 
* Supporting Cyclic Garbage Collection:: 

@end menu

@node Allocating objects on the heap,Object Life Cycle,,Object Implementation Support
@anchor{c-api/allocation doc}@anchor{593c}@anchor{c-api/allocation allocating-objects}@anchor{593d}@anchor{c-api/allocation allocating-objects-on-the-heap}@anchor{593e}
@subsection Allocating objects on the heap


@geindex _PyObject_New (C function)
@anchor{c-api/allocation c _PyObject_New}@anchor{593f}
@deffn {C Function} @ref{5df,,PyObject} *_PyObject_New (PyTypeObject *type)
`Return value: New reference.'
@end deffn

@geindex _PyObject_NewVar (C function)
@anchor{c-api/allocation c _PyObject_NewVar}@anchor{5940}
@deffn {C Function} @ref{4a36,,PyVarObject} *_PyObject_NewVar (PyTypeObject *type, Py_ssize_t size)
`Return value: New reference.'
@end deffn

@geindex PyObject_Init (C function)
@anchor{c-api/allocation c PyObject_Init}@anchor{c66}
@deffn {C Function} @ref{5df,,PyObject} *PyObject_Init (PyObject *op, PyTypeObject *type)
`Return value: Borrowed reference.'` Part of the @ref{776,,Stable ABI}.'
Initialize a newly allocated object `op' with its type and initial
reference.  Returns the initialized object.  Other fields of the object are
not initialized.  Despite its name, this function is unrelated to the
object’s @ref{8c1,,__init__()} method (@ref{7a2,,tp_init}
slot).  Specifically, this function does `not' call the object’s
@code{__init__()} method.

In general, consider this function to be a low-level routine. Use
@ref{5230,,tp_alloc} where possible.
For implementing @code{tp_alloc} for your type, prefer
@ref{c67,,PyType_GenericAlloc()} or @ref{b82,,PyObject_New()}.

@cartouche
@quotation Note 
This function only initializes the object’s memory corresponding to the
initial @ref{5df,,PyObject} structure.  It does not zero the rest.
@end quotation
@end cartouche
@end deffn

@geindex PyObject_InitVar (C function)
@anchor{c-api/allocation c PyObject_InitVar}@anchor{1d84}
@deffn {C Function} @ref{4a36,,PyVarObject} *PyObject_InitVar (PyVarObject *op, PyTypeObject *type, Py_ssize_t size)
`Return value: Borrowed reference.'` Part of the @ref{776,,Stable ABI}.'
This does everything @ref{c66,,PyObject_Init()} does, and also initializes the
length information for a variable-size object.

@cartouche
@quotation Note 
This function only initializes some of the object’s memory.  It does not
zero the rest.
@end quotation
@end cartouche
@end deffn

@geindex PyObject_New (C macro)
@anchor{c-api/allocation c PyObject_New}@anchor{b82}
@deffn {C Macro} PyObject_New (TYPE, typeobj)

Allocates a new Python object using the C structure type `TYPE' and the
Python type object `typeobj' (@code{PyTypeObject*}) by calling
@ref{e68,,PyObject_Malloc()} to allocate memory and initializing it like
@ref{c66,,PyObject_Init()}.  The caller will own the only reference to the
object (i.e. its reference count will be one).

Avoid calling this directly to allocate memory for an object; call the type’s
@ref{5230,,tp_alloc} slot instead.

When populating a type’s @ref{5230,,tp_alloc} slot,
@ref{c67,,PyType_GenericAlloc()} is preferred over a custom function that
simply calls this macro.

This macro does not call @ref{5230,,tp_alloc},
@ref{7a0,,tp_new} (@ref{7a1,,__new__()}), or
@ref{7a2,,tp_init} (@ref{8c1,,__init__()}).

This cannot be used for objects with @ref{986,,Py_TPFLAGS_HAVE_GC} set in
@ref{1cb4,,tp_flags}; use @ref{c9f,,PyObject_GC_New} instead.

Memory allocated by this macro must be freed with @ref{e65,,PyObject_Free()}
(usually called via the object’s @ref{522f,,tp_free} slot).

@cartouche
@quotation Note 
The returned memory is not guaranteed to have been completely zeroed
before it was initialized.
@end quotation
@end cartouche

@cartouche
@quotation Note 
This macro does not construct a fully initialized object of the given
type; it merely allocates memory and prepares it for further
initialization by @ref{7a2,,tp_init}.  To construct a
fully initialized object, call `typeobj' instead.  For example:

@example
PyObject *foo = PyObject_CallNoArgs((PyObject *)&PyFoo_Type);
@end example
@end quotation
@end cartouche


@subsubheading See also



@itemize *

@item 
@ref{e65,,PyObject_Free()}

@item 
@ref{c9f,,PyObject_GC_New}

@item 
@ref{c67,,PyType_GenericAlloc()}

@item 
@ref{5230,,tp_alloc}
@end itemize

@end deffn

@geindex PyObject_NewVar (C macro)
@anchor{c-api/allocation c PyObject_NewVar}@anchor{b83}
@deffn {C Macro} PyObject_NewVar (TYPE, typeobj, size)

Like @ref{b82,,PyObject_New} except:


@itemize *

@item 
It allocates enough memory for the `TYPE' structure plus `size'
(@code{Py_ssize_t}) fields of the size given by the
@ref{2402,,tp_itemsize} field of `typeobj'.

@item 
The memory is initialized like @ref{1d84,,PyObject_InitVar()}.
@end itemize

This is useful for implementing objects like tuples, which are able to
determine their size at construction time.  Embedding the array of fields
into the same allocation decreases the number of allocations, improving the
memory management efficiency.

Avoid calling this directly to allocate memory for an object; call the type’s
@ref{5230,,tp_alloc} slot instead.

When populating a type’s @ref{5230,,tp_alloc} slot,
@ref{c67,,PyType_GenericAlloc()} is preferred over a custom function that
simply calls this macro.

This cannot be used for objects with @ref{986,,Py_TPFLAGS_HAVE_GC} set in
@ref{1cb4,,tp_flags}; use @ref{ca0,,PyObject_GC_NewVar}
instead.

Memory allocated by this function must be freed with @ref{e65,,PyObject_Free()}
(usually called via the object’s @ref{522f,,tp_free} slot).

@cartouche
@quotation Note 
The returned memory is not guaranteed to have been completely zeroed
before it was initialized.
@end quotation
@end cartouche

@cartouche
@quotation Note 
This macro does not construct a fully initialized object of the given
type; it merely allocates memory and prepares it for further
initialization by @ref{7a2,,tp_init}.  To construct a
fully initialized object, call `typeobj' instead.  For example:

@example
PyObject *list_instance = PyObject_CallNoArgs((PyObject *)&PyList_Type);
@end example
@end quotation
@end cartouche


@subsubheading See also



@itemize *

@item 
@ref{e65,,PyObject_Free()}

@item 
@ref{ca0,,PyObject_GC_NewVar}

@item 
@ref{c67,,PyType_GenericAlloc()}

@item 
@ref{5230,,tp_alloc}
@end itemize

@end deffn

@geindex _Py_NoneStruct (C var)
@anchor{c-api/allocation c _Py_NoneStruct}@anchor{5941}
@deffn {C Variable} @ref{5df,,PyObject} _Py_NoneStruct

Object which is visible in Python as @code{None}.  This should only be accessed
using the @ref{51ff,,Py_None} macro, which evaluates to a pointer to this
object.
@end deffn


@subsubheading See also



@table @asis

@item @ref{5798,,Module Objects}

To allocate and create extension modules.
@end table


@menu
* Soft-deprecated aliases:: 

@end menu

@node Soft-deprecated aliases,,,Allocating objects on the heap
@anchor{c-api/allocation soft-deprecated-aliases}@anchor{5942}
@subsubsection Soft-deprecated aliases



@ref{23f,,Soft deprecated} since version 3.10.


These are aliases to existing functions and macros.
They exist solely for backwards compatibility.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Soft-deprecated alias

@tab

Function

@item

@geindex PyObject_NEW (C macro)
@anchor{c-api/allocation c PyObject_NEW}@anchor{5943}
@deffn {C Macro} PyObject_NEW (type, typeobj)
@end deffn

@tab

@ref{b82,,PyObject_New}

@item

@geindex PyObject_NEW_VAR (C macro)
@anchor{c-api/allocation c PyObject_NEW_VAR}@anchor{5944}
@deffn {C Macro} PyObject_NEW_VAR (type, typeobj, n)
@end deffn

@tab

@ref{b83,,PyObject_NewVar}

@item

@geindex PyObject_INIT (C macro)
@anchor{c-api/allocation c PyObject_INIT}@anchor{1d82}
@deffn {C Macro} PyObject_INIT (op, typeobj)
@end deffn

@tab

@ref{c66,,PyObject_Init()}

@item

@geindex PyObject_INIT_VAR (C macro)
@anchor{c-api/allocation c PyObject_INIT_VAR}@anchor{1d83}
@deffn {C Macro} PyObject_INIT_VAR (op, typeobj, n)
@end deffn

@tab

@ref{1d84,,PyObject_InitVar()}

@item

@geindex PyObject_MALLOC (C macro)
@anchor{c-api/allocation c PyObject_MALLOC}@anchor{5945}
@deffn {C Macro} PyObject_MALLOC (n)
@end deffn

@tab

@ref{e68,,PyObject_Malloc()}

@item

@geindex PyObject_REALLOC (C macro)
@anchor{c-api/allocation c PyObject_REALLOC}@anchor{5946}
@deffn {C Macro} PyObject_REALLOC (p, n)
@end deffn

@tab

@ref{164f,,PyObject_Realloc()}

@item

@geindex PyObject_FREE (C macro)
@anchor{c-api/allocation c PyObject_FREE}@anchor{5947}
@deffn {C Macro} PyObject_FREE (p)
@end deffn

@tab

@ref{e65,,PyObject_Free()}

@item

@geindex PyObject_DEL (C macro)
@anchor{c-api/allocation c PyObject_DEL}@anchor{5948}
@deffn {C Macro} PyObject_DEL (p)
@end deffn

@tab

@ref{e65,,PyObject_Free()}

@item

@geindex PyObject_Del (C macro)
@anchor{c-api/allocation c PyObject_Del}@anchor{16dd}
@deffn {C Macro} PyObject_Del (p)
@end deffn

@tab

@ref{e65,,PyObject_Free()}

@end multitable


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Object Life Cycle,Common Object Structures,Allocating objects on the heap,Object Implementation Support
@anchor{c-api/lifecycle doc}@anchor{5949}@anchor{c-api/lifecycle life-cycle}@anchor{594a}@anchor{c-api/lifecycle object-life-cycle}@anchor{594b}@anchor{c-api/lifecycle translation-repo}@anchor{594c}
@subsection Object Life Cycle


This section explains how a type’s slots relate to each other throughout the
life of an object.  It is not intended to be a complete canonical reference for
the slots; instead, refer to the slot-specific documentation in
@ref{b8a,,Type Object Structures} for details about a particular slot.

@menu
* Life Events:: 
* Cyclic Isolate Destruction:: 
* Functions: Functions<15>. 

@end menu

@node Life Events,Cyclic Isolate Destruction,,Object Life Cycle
@anchor{c-api/lifecycle life-events}@anchor{594d}
@subsubsection Life Events


The figure below illustrates the order of events that can occur throughout an
object’s life.  An arrow from `A' to `B' indicates that event `B' can occur
after event `A' has occurred, with the arrow’s label indicating the condition
that must be true for `B' to occur after `A'.


@image{python-figures/lifecycle.dot,,,Diagram showing events in an object's life. Explained in detail below.,svg}


Explanation:


@itemize *

@item 
When a new object is constructed by calling its type:


@enumerate 

@item 
@ref{7a0,,tp_new} is called to create a new object.

@item 
@ref{5230,,tp_alloc} is directly called by
@ref{7a0,,tp_new} to allocate the memory for the new
object.

@item 
@ref{7a2,,tp_init} initializes the newly created object.
@code{tp_init} can be called again to re-initialize an object, if
desired. The @code{tp_init} call can also be skipped entirely,
for example by Python code calling @ref{7a1,,__new__()}.
@end enumerate

@item 
After @code{tp_init} completes, the object is ready to use.

@item 
Some time after the last reference to an object is removed:


@enumerate 

@item 
If an object is not marked as `finalized', it might be finalized by
marking it as `finalized' and calling its
@ref{ca3,,tp_finalize} function.  Python does
`not' finalize an object when the last reference to it is deleted; use
@ref{594e,,PyObject_CallFinalizerFromDealloc()} to ensure that
@code{tp_finalize} is always called.

@item 
If the object is marked as finalized,
@ref{5242,,tp_clear} might be called by the garbage collector
to clear references held by the object.  It is `not' called when the
object’s reference count reaches zero.

@item 
@ref{521c,,tp_dealloc} is called to destroy the object.
To avoid code duplication, @code{tp_dealloc} typically
calls into @ref{5242,,tp_clear} to free up the object’s
references.

@item 
When @ref{521c,,tp_dealloc} finishes object destruction,
it directly calls @ref{522f,,tp_free} (usually set to
@ref{e65,,PyObject_Free()} or @ref{170f,,PyObject_GC_Del()} automatically as
appropriate for the type) to deallocate the memory.
@end enumerate

@item 
The @ref{ca3,,tp_finalize} function is permitted to add a
reference to the object if desired.  If it does, the object is
`resurrected', preventing its pending destruction.  (Only
@code{tp_finalize} is allowed to resurrect an object;
@ref{5242,,tp_clear} and
@ref{521c,,tp_dealloc} cannot without calling into
@code{tp_finalize}.)  Resurrecting an object may
or may not cause the object’s `finalized' mark to be removed.  Currently,
Python does not remove the `finalized' mark from a resurrected object if
it supports garbage collection (i.e., the @ref{986,,Py_TPFLAGS_HAVE_GC}
flag is set) but does remove the mark if the object does not support
garbage collection; either or both of these behaviors may change in the
future.

@item 
@ref{521c,,tp_dealloc} can optionally call
@ref{ca3,,tp_finalize} via
@ref{594e,,PyObject_CallFinalizerFromDealloc()} if it wishes to reuse that
code to help with object destruction.  This is recommended because it
guarantees that @code{tp_finalize} is always called before
destruction.  See the @code{tp_dealloc} documentation
for example code.

@item 
If the object is a member of a @ref{594f,,cyclic isolate} and either
@ref{5242,,tp_clear} fails to break the reference cycle or
the cyclic isolate is not detected (perhaps @ref{4d6d,,gc.disable()} was called,
or the @ref{986,,Py_TPFLAGS_HAVE_GC} flag was erroneously omitted in one
of the involved types), the objects remain indefinitely uncollectable
(they “leak”).  See @ref{13cd,,gc.garbage}.
@end itemize

If the object is marked as supporting garbage collection (the
@ref{986,,Py_TPFLAGS_HAVE_GC} flag is set in
@ref{1cb4,,tp_flags}), the following events are also possible:


@itemize *

@item 
The garbage collector occasionally calls
@ref{987,,tp_traverse} to identify @ref{594f,,cyclic isolates}.

@item 
When the garbage collector discovers a @ref{594f,,cyclic isolate}, it
finalizes one of the objects in the group by marking it as `finalized' and
calling its @ref{ca3,,tp_finalize} function, if it has one.
This repeats until the cyclic isolate doesn’t exist or all of the objects
have been finalized.

@item 
@ref{ca3,,tp_finalize} is permitted to resurrect the object
by adding a reference from outside the @ref{594f,,cyclic isolate}.  The new
reference causes the group of objects to no longer form a cyclic isolate
(the reference cycle may still exist, but if it does the objects are no
longer isolated).

@item 
When the garbage collector discovers a @ref{594f,,cyclic isolate} and all of
the objects in the group have already been marked as `finalized', the
garbage collector clears one or more of the uncleared objects in the group
(possibly concurrently) by calling each’s
@ref{5242,,tp_clear} function.  This repeats as long as the
cyclic isolate still exists and not all of the objects have been cleared.
@end itemize

@node Cyclic Isolate Destruction,Functions<15>,Life Events,Object Life Cycle
@anchor{c-api/lifecycle cyclic-isolate-destruction}@anchor{5950}
@subsubsection Cyclic Isolate Destruction


Listed below are the stages of life of a hypothetical @ref{594f,,cyclic isolate}
that continues to exist after each member object is finalized or cleared.  It
is a memory leak if a cyclic isolate progresses through all of these stages; it should
vanish once all objects are cleared, if not sooner.  A cyclic isolate can
vanish either because the reference cycle is broken or because the objects are
no longer isolated due to finalizer resurrection (see
@ref{ca3,,tp_finalize}).


@enumerate 0

@item 
`Reachable' (not yet a cyclic isolate): All objects are in their normal,
reachable state.  A reference cycle could exist, but an external reference
means the objects are not yet isolated.

@item 
`Unreachable but consistent:' The final reference from outside the cyclic
group of objects has been removed, causing the objects to become isolated
(thus a cyclic isolate is born).  None of the group’s objects have been
finalized or cleared yet.  The cyclic isolate remains at this stage until
some future run of the garbage collector (not necessarily the next run
because the next run might not scan every object).

@item 
`Mix of finalized and not finalized:' Objects in a cyclic isolate are
finalized one at a time, which means that there is a period of time when the
cyclic isolate is composed of a mix of finalized and non-finalized objects.
Finalization order is unspecified, so it can appear random.  A finalized
object must behave in a sane manner when non-finalized objects interact with
it, and a non-finalized object must be able to tolerate the finalization of
an arbitrary subset of its referents.

@item 
`All finalized:' All objects in a cyclic isolate are finalized before any
of them are cleared.

@item 
`Mix of finalized and cleared:' The objects can be cleared serially or
concurrently (but with the @ref{165,,GIL} held); either way, some will finish
before others.  A finalized object must be able to tolerate the clearing of
a subset of its referents.  
@geindex Python Enhancement Proposals; PEP 442
PEP 442@footnote{https://peps.python.org/pep-0442/} calls this stage “cyclic trash”.

@item 
`Leaked:' If a cyclic isolate still exists after all objects in the group
have been finalized and cleared, then the objects remain indefinitely
uncollectable (see @ref{13cd,,gc.garbage}).  It is a bug if a cyclic isolate
reaches this stage—it means the @ref{5242,,tp_clear} methods
of the participating objects have failed to break the reference cycle as
required.
@end enumerate

If @ref{5242,,tp_clear} did not exist, then Python would have no
way to safely break a reference cycle.  Simply destroying an object in a cyclic
isolate would result in a dangling pointer, triggering undefined behavior when
an object referencing the destroyed object is itself destroyed.  The clearing
step makes object destruction a two-phase process: first
@code{tp_clear} is called to partially destroy the objects
enough to detangle them from each other, then
@ref{521c,,tp_dealloc} is called to complete the destruction.

Unlike clearing, finalization is not a phase of destruction.  A finalized
object must still behave properly by continuing to fulfill its design
contracts.  An object’s finalizer is allowed to execute arbitrary Python code,
and is even allowed to prevent the impending destruction by adding a reference.
The finalizer is only related to destruction by call order—if it runs, it runs
before destruction, which starts with @ref{5242,,tp_clear} (if
called) and concludes with @ref{521c,,tp_dealloc}.

The finalization step is not necessary to safely reclaim the objects in a
cyclic isolate, but its existence makes it easier to design types that behave
in a sane manner when objects are cleared.  Clearing an object might
necessarily leave it in a broken, partially destroyed state—it might be
unsafe to call any of the cleared object’s methods or access any of its
attributes.  With finalization, only finalized objects can possibly interact
with cleared objects; non-finalized objects are guaranteed to interact with
only non-cleared (but potentially finalized) objects.

To summarize the possible interactions:


@itemize *

@item 
A non-finalized object might have references to or from non-finalized and
finalized objects, but not to or from cleared objects.

@item 
A finalized object might have references to or from non-finalized, finalized,
and cleared objects.

@item 
A cleared object might have references to or from finalized and cleared
objects, but not to or from non-finalized objects.
@end itemize

Without any reference cycles, an object can be simply destroyed once its last
reference is deleted; the finalization and clearing steps are not necessary to
safely reclaim unused objects.  However, it can be useful to automatically call
@ref{ca3,,tp_finalize} and @ref{5242,,tp_clear}
before destruction anyway because type design is simplified when all objects
always experience the same series of events regardless of whether they
participated in a cyclic isolate.  Python currently only calls
@code{tp_finalize} and @code{tp_clear} as
needed to destroy a cyclic isolate; this may change in a future version.

@node Functions<15>,,Cyclic Isolate Destruction,Object Life Cycle
@anchor{c-api/lifecycle functions}@anchor{5951}
@subsubsection Functions


To allocate and free memory, see @ref{593d,,Allocating objects on the heap}.

@geindex PyObject_CallFinalizer (C function)
@anchor{c-api/lifecycle c PyObject_CallFinalizer}@anchor{5952}
@deffn {C Function} void PyObject_CallFinalizer (PyObject *op)

Finalizes the object as described in @ref{ca3,,tp_finalize}.
Call this function (or @ref{594e,,PyObject_CallFinalizerFromDealloc()}) instead
of calling @code{tp_finalize} directly because this
function may deduplicate multiple calls to @code{tp_finalize}.
Currently, calls are only deduplicated if the type supports garbage
collection (i.e., the @ref{986,,Py_TPFLAGS_HAVE_GC} flag is set); this may
change in the future.


Added in version 3.4.

@end deffn

@geindex PyObject_CallFinalizerFromDealloc (C function)
@anchor{c-api/lifecycle c PyObject_CallFinalizerFromDealloc}@anchor{594e}
@deffn {C Function} int PyObject_CallFinalizerFromDealloc (PyObject *op)

Same as @ref{5952,,PyObject_CallFinalizer()} but meant to be called at the
beginning of the object’s destructor (@ref{521c,,tp_dealloc}).
There must not be any references to the object.  If the object’s finalizer
resurrects the object, this function returns -1; no further destruction
should happen.  Otherwise, this function returns 0 and destruction can
continue normally.


Added in version 3.4.



@subsubheading See also


@ref{521c,,tp_dealloc} for example code.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Common Object Structures,Type Object Structures,Object Life Cycle,Object Implementation Support
@anchor{c-api/structures doc}@anchor{5953}@anchor{c-api/structures common-object-structures}@anchor{5954}@anchor{c-api/structures common-structs}@anchor{5955}@anchor{c-api/structures translation-repo}@anchor{5956}
@subsection Common Object Structures


There are a large number of structures which are used in the definition of
object types for Python.  This section describes these structures and how they
are used.

@menu
* Base object types and macros:: 
* Implementing functions and methods:: 
* Accessing attributes of extension types:: 

@end menu

@node Base object types and macros,Implementing functions and methods,,Common Object Structures
@anchor{c-api/structures base-object-types-and-macros}@anchor{5957}
@subsubsection Base object types and macros


All Python objects ultimately share a small number of fields at the beginning
of the object’s representation in memory.  These are represented by the
@ref{5df,,PyObject} and @ref{4a36,,PyVarObject} types, which are defined, in turn,
by the expansions of some macros also used, whether directly or indirectly, in
the definition of all other Python objects.  Additional macros can be found
under @ref{5547,,reference counting}.

@geindex PyObject (C type)
@anchor{c-api/structures c PyObject}@anchor{5df}
@deffn {C Type} type PyObject
` Part of the @ref{776,,Limited API}. (Only some members are part of the stable ABI.)'
All object types are extensions of this type.  This is a type which
contains the information Python needs to treat a pointer to an object as an
object.  In a normal “release” build, it contains only the object’s
reference count and a pointer to the corresponding type object.
Nothing is actually declared to be a @ref{5df,,PyObject}, but every pointer
to a Python object can be cast to a @ref{5df,,PyObject}*.

The members must not be accessed directly; instead use macros such as
@ref{2d1,,Py_REFCNT} and @ref{3c7,,Py_TYPE}.

@geindex PyObject.ob_refcnt (C member)
@anchor{c-api/structures c PyObject ob_refcnt}@anchor{aa5}
@deffn {C Member} @ref{c5b,,Py_ssize_t} ob_refcnt
` Part of the @ref{776,,Stable ABI}.'
The object’s reference count, as returned by @ref{2d1,,Py_REFCNT}.
Do not use this field directly; instead use functions and macros such as
@code{Py_REFCNT}, @ref{790,,Py_INCREF()} and @ref{548a,,Py_DecRef()}.

The field type may be different from @code{Py_ssize_t}, depending on
build configuration and platform.
@end deffn

@geindex PyObject.ob_type (C member)
@anchor{c-api/structures c PyObject ob_type}@anchor{522d}
@deffn {C Member} @ref{ca2,,PyTypeObject} *ob_type
` Part of the @ref{776,,Stable ABI}.'
The object’s type.
Do not use this field directly; use @ref{3c7,,Py_TYPE} and
@ref{989,,Py_SET_TYPE()} instead.
@end deffn
@end deffn

@geindex PyVarObject (C type)
@anchor{c-api/structures c PyVarObject}@anchor{4a36}
@deffn {C Type} type PyVarObject
` Part of the @ref{776,,Limited API}. (Only some members are part of the stable ABI.)'
An extension of @ref{5df,,PyObject} that adds the
@ref{547c,,ob_size} field.
This is intended for objects that have some notion of `length'.

As with @code{PyObject}, the members must not be accessed directly;
instead use macros such as @ref{98a,,Py_SIZE}, @ref{2d1,,Py_REFCNT} and
@ref{3c7,,Py_TYPE}.

@geindex PyVarObject.ob_size (C member)
@anchor{c-api/structures c PyVarObject ob_size}@anchor{547c}
@deffn {C Member} @ref{c5b,,Py_ssize_t} ob_size
` Part of the @ref{776,,Stable ABI}.'
A size field, whose contents should be considered an object’s internal
implementation detail.

Do not use this field directly; use @ref{98a,,Py_SIZE} instead.

Object creation functions such as @ref{b83,,PyObject_NewVar()} will
generally set this field to the requested size (number of items).
After creation, arbitrary values can be stored in @code{ob_size}
using @ref{98b,,Py_SET_SIZE}.

To get an object’s publicly exposed length, as returned by
the Python function @ref{841,,len()}, use @ref{53f5,,PyObject_Length()}
instead.
@end deffn
@end deffn

@geindex PyObject_HEAD (C macro)
@anchor{c-api/structures c PyObject_HEAD}@anchor{14e9}
@deffn {C Macro} PyObject_HEAD

This is a macro used when declaring new types which represent objects
without a varying length.  The PyObject_HEAD macro expands to:

@example
PyObject ob_base;
@end example

See documentation of @ref{5df,,PyObject} above.
@end deffn

@geindex PyObject_VAR_HEAD (C macro)
@anchor{c-api/structures c PyObject_VAR_HEAD}@anchor{5958}
@deffn {C Macro} PyObject_VAR_HEAD

This is a macro used when declaring new types which represent objects
with a length that varies from instance to instance.
The PyObject_VAR_HEAD macro expands to:

@example
PyVarObject ob_base;
@end example

See documentation of @ref{4a36,,PyVarObject} above.
@end deffn

@geindex PyBaseObject_Type (C var)
@anchor{c-api/structures c PyBaseObject_Type}@anchor{52d5}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyBaseObject_Type
` Part of the @ref{776,,Stable ABI}.'
The base class of all other objects, the same as @ref{c84,,object} in Python.
@end deffn

@geindex Py_Is (C function)
@anchor{c-api/structures c Py_Is}@anchor{aa6}
@deffn {C Function} int Py_Is (PyObject *x, PyObject *y)
` Part of the @ref{776,,Stable ABI} since version 3.10.'
Test if the `x' object is the `y' object, the same as @code{x is y} in Python.


Added in version 3.10.

@end deffn

@geindex Py_IsNone (C function)
@anchor{c-api/structures c Py_IsNone}@anchor{aa7}
@deffn {C Function} int Py_IsNone (PyObject *x)
` Part of the @ref{776,,Stable ABI} since version 3.10.'
Test if an object is the @code{None} singleton,
the same as @code{x is None} in Python.


Added in version 3.10.

@end deffn

@geindex Py_IsTrue (C function)
@anchor{c-api/structures c Py_IsTrue}@anchor{aa8}
@deffn {C Function} int Py_IsTrue (PyObject *x)
` Part of the @ref{776,,Stable ABI} since version 3.10.'
Test if an object is the @code{True} singleton,
the same as @code{x is True} in Python.


Added in version 3.10.

@end deffn

@geindex Py_IsFalse (C function)
@anchor{c-api/structures c Py_IsFalse}@anchor{aa9}
@deffn {C Function} int Py_IsFalse (PyObject *x)
` Part of the @ref{776,,Stable ABI} since version 3.10.'
Test if an object is the @code{False} singleton,
the same as @code{x is False} in Python.


Added in version 3.10.

@end deffn

@geindex Py_TYPE (C function)
@anchor{c-api/structures c Py_TYPE}@anchor{3c7}
@deffn {C Function} @ref{ca2,,PyTypeObject} *Py_TYPE (PyObject *o)
`Return value: Borrowed reference.'` Part of the @ref{776,,Stable ABI} since version 3.14.'
Get the type of the Python object `o'.

The returned reference is @ref{3d5,,borrowed} from `o'.
Do not release it with @ref{791,,Py_DECREF()} or similar.


Changed in version 3.11: @ref{3c7,,Py_TYPE()} is changed to an inline static function.
The parameter type is no longer const @ref{5df,,PyObject}*.

@end deffn

@geindex Py_IS_TYPE (C function)
@anchor{c-api/structures c Py_IS_TYPE}@anchor{1be3}
@deffn {C Function} int Py_IS_TYPE (PyObject *o, PyTypeObject *type)

Return non-zero if the object `o' type is `type'. Return zero otherwise.
Equivalent to: @code{Py_TYPE(o) == type}.


Added in version 3.9.

@end deffn

@geindex Py_SET_TYPE (C function)
@anchor{c-api/structures c Py_SET_TYPE}@anchor{989}
@deffn {C Function} void Py_SET_TYPE (PyObject *o, PyTypeObject *type)

Set the type of object `o' to `type', without any checking or reference
counting.

This is a very low-level operation.
Consider instead setting the Python attribute @ref{16b9,,__class__}
using @ref{19d1,,PyObject_SetAttrString()} or similar.

Note that assigning an incompatible type can lead to undefined behavior.

If `type' is a @ref{b64,,heap type}, the caller must create a
new reference to it.
Similarly, if the old type of `o' is a heap type, the caller must release
a reference to that type.


Added in version 3.9.

@end deffn

@geindex Py_SIZE (C function)
@anchor{c-api/structures c Py_SIZE}@anchor{98a}
@deffn {C Function} @ref{c5b,,Py_ssize_t} Py_SIZE (PyVarObject *o)

Get the @ref{547c,,ob_size} field of `o'.


Changed in version 3.11: @ref{98a,,Py_SIZE()} is changed to an inline static function.
The parameter type is no longer const @ref{4a36,,PyVarObject}*.

@end deffn

@geindex Py_SET_SIZE (C function)
@anchor{c-api/structures c Py_SET_SIZE}@anchor{98b}
@deffn {C Function} void Py_SET_SIZE (PyVarObject *o, Py_ssize_t size)

Set the @ref{547c,,ob_size} field of `o' to `size'.


Added in version 3.9.

@end deffn

@geindex PyObject_HEAD_INIT (C macro)
@anchor{c-api/structures c PyObject_HEAD_INIT}@anchor{5959}
@deffn {C Macro} PyObject_HEAD_INIT (type)

This is a macro which expands to initialization values for a new
@ref{5df,,PyObject} type.  This macro expands to:

@example
_PyObject_EXTRA_INIT
1, type,
@end example
@end deffn

@geindex PyVarObject_HEAD_INIT (C macro)
@anchor{c-api/structures c PyVarObject_HEAD_INIT}@anchor{595a}
@deffn {C Macro} PyVarObject_HEAD_INIT (type, size)

This is a macro which expands to initialization values for a new
@ref{4a36,,PyVarObject} type, including the @ref{547c,,ob_size} field.
This macro expands to:

@example
_PyObject_EXTRA_INIT
1, type, size,
@end example
@end deffn

@node Implementing functions and methods,Accessing attributes of extension types,Base object types and macros,Common Object Structures
@anchor{c-api/structures implementing-functions-and-methods}@anchor{595b}
@subsubsection Implementing functions and methods


@geindex PyCFunction (C type)
@anchor{c-api/structures c PyCFunction}@anchor{1684}
@deffn {C Type} type PyCFunction
` Part of the @ref{776,,Stable ABI}.'
Type of the functions used to implement most Python callables in C.
Functions of this type take two @ref{5df,,PyObject}* parameters and return
one such value.  If the return value is @code{NULL}, an exception shall have
been set.  If not @code{NULL}, the return value is interpreted as the return
value of the function as exposed in Python.  The function must return a new
reference.

The function signature is:

@example
PyObject *PyCFunction(PyObject *self,
                      PyObject *args);
@end example
@end deffn

@geindex PyCFunctionWithKeywords (C type)
@anchor{c-api/structures c PyCFunctionWithKeywords}@anchor{52eb}
@deffn {C Type} type PyCFunctionWithKeywords
` Part of the @ref{776,,Stable ABI}.'
Type of the functions used to implement Python callables in C
with signature @ref{595c,,METH_VARARGS | METH_KEYWORDS}.
The function signature is:

@example
PyObject *PyCFunctionWithKeywords(PyObject *self,
                                  PyObject *args,
                                  PyObject *kwargs);
@end example
@end deffn

@geindex PyCFunctionFast (C type)
@anchor{c-api/structures c PyCFunctionFast}@anchor{52e9}
@deffn {C Type} type PyCFunctionFast
` Part of the @ref{776,,Stable ABI} since version 3.13.'
Type of the functions used to implement Python callables in C
with signature @ref{19e1,,METH_FASTCALL}.
The function signature is:

@example
PyObject *PyCFunctionFast(PyObject *self,
                          PyObject *const *args,
                          Py_ssize_t nargs);
@end example
@end deffn

@geindex PyCFunctionFastWithKeywords (C type)
@anchor{c-api/structures c PyCFunctionFastWithKeywords}@anchor{52ea}
@deffn {C Type} type PyCFunctionFastWithKeywords
` Part of the @ref{776,,Stable ABI} since version 3.13.'
Type of the functions used to implement Python callables in C
with signature @ref{595d,,METH_FASTCALL | METH_KEYWORDS}.
The function signature is:

@example
PyObject *PyCFunctionFastWithKeywords(PyObject *self,
                                      PyObject *const *args,
                                      Py_ssize_t nargs,
                                      PyObject *kwnames);
@end example
@end deffn

@geindex PyCMethod (C type)
@anchor{c-api/structures c PyCMethod}@anchor{96d}
@deffn {C Type} type PyCMethod

Type of the functions used to implement Python callables in C
with signature @ref{1a50,,METH_METHOD | METH_FASTCALL | METH_KEYWORDS}.
The function signature is:

@example
PyObject *PyCMethod(PyObject *self,
                    PyTypeObject *defining_class,
                    PyObject *const *args,
                    Py_ssize_t nargs,
                    PyObject *kwnames)
@end example


Added in version 3.9.

@end deffn

@geindex PyMethodDef (C type)
@anchor{c-api/structures c PyMethodDef}@anchor{16e3}
@deffn {C Type} type PyMethodDef
` Part of the @ref{776,,Stable ABI} (including all members).'
Structure used to describe a method of an extension type.  This structure has
four fields:

@geindex PyMethodDef.ml_name (C member)
@anchor{c-api/structures c PyMethodDef ml_name}@anchor{5249}
@deffn {C Member} const char *ml_name

Name of the method.
@end deffn

@geindex PyMethodDef.ml_meth (C member)
@anchor{c-api/structures c PyMethodDef ml_meth}@anchor{595e}
@deffn {C Member} @ref{1684,,PyCFunction} ml_meth

Pointer to the C implementation.
@end deffn

@geindex PyMethodDef.ml_flags (C member)
@anchor{c-api/structures c PyMethodDef ml_flags}@anchor{595f}
@deffn {C Member} int ml_flags

Flags bits indicating how the call should be constructed.
@end deffn

@geindex PyMethodDef.ml_doc (C member)
@anchor{c-api/structures c PyMethodDef ml_doc}@anchor{5960}
@deffn {C Member} const char *ml_doc

Points to the contents of the docstring.
@end deffn
@end deffn

The @ref{595e,,ml_meth} is a C function pointer.
The functions may be of different
types, but they always return @ref{5df,,PyObject}*.  If the function is not of
the @ref{1684,,PyCFunction}, the compiler will require a cast in the method table.
Even though @code{PyCFunction} defines the first parameter as
PyObject*, it is common that the method implementation uses the
specific C type of the `self' object.

The @ref{595f,,ml_flags} field is a bitfield which can include
the following flags.
The individual flags indicate either a calling convention or a binding
convention.

There are these calling conventions:

@geindex METH_VARARGS (C macro)
@anchor{c-api/structures c METH_VARARGS}@anchor{1714}
@deffn {C Macro} METH_VARARGS
` Part of the @ref{776,,Stable ABI}.'
This is the typical calling convention, where the methods have the type
@ref{1684,,PyCFunction}. The function expects two @ref{5df,,PyObject}* values.
The first one is the `self' object for methods; for module functions, it is
the module object.  The second parameter (often called `args') is a tuple
object representing all arguments. This parameter is typically processed
using @ref{3bf,,PyArg_ParseTuple()} or @ref{1712,,PyArg_UnpackTuple()}.
@end deffn

@geindex METH_KEYWORDS (C macro)
@anchor{c-api/structures c METH_KEYWORDS}@anchor{5202}
@deffn {C Macro} METH_KEYWORDS

Can only be used in certain combinations with other flags:
@ref{595c,,METH_VARARGS | METH_KEYWORDS},
@ref{595d,,METH_FASTCALL | METH_KEYWORDS} and
@ref{1a50,,METH_METHOD | METH_FASTCALL | METH_KEYWORDS}.
@end deffn
@anchor{c-api/structures meth-varargs-meth-keywords}@anchor{595c}

@table @asis

@item @ref{1714,,METH_VARARGS} | @ref{5202,,METH_KEYWORDS}

Methods with these flags must be of type @ref{52eb,,PyCFunctionWithKeywords}.
The function expects three parameters: `self', `args', `kwargs' where
`kwargs' is a dictionary of all the keyword arguments or possibly @code{NULL}
if there are no keyword arguments.  The parameters are typically processed
using @ref{624,,PyArg_ParseTupleAndKeywords()}.
@end table

@geindex METH_FASTCALL (C macro)
@anchor{c-api/structures c METH_FASTCALL}@anchor{19e1}
@deffn {C Macro} METH_FASTCALL
` Part of the @ref{776,,Stable ABI} since version 3.10.'
Fast calling convention supporting only positional arguments.
The methods have the type @ref{52e9,,PyCFunctionFast}.
The first parameter is `self', the second parameter is a C array
of @ref{5df,,PyObject}* values indicating the arguments and the third
parameter is the number of arguments (the length of the array).


Added in version 3.7.



Changed in version 3.10: @code{METH_FASTCALL} is now part of the @ref{52bd,,stable ABI}.

@end deffn
@anchor{c-api/structures meth-fastcall-meth-keywords}@anchor{595d}

@table @asis

@item @ref{19e1,,METH_FASTCALL} | @ref{5202,,METH_KEYWORDS}

Extension of @ref{19e1,,METH_FASTCALL} supporting also keyword arguments,
with methods of type @ref{52ea,,PyCFunctionFastWithKeywords}.
Keyword arguments are passed the same way as in the
@ref{775,,vectorcall protocol}:
there is an additional fourth @ref{5df,,PyObject}* parameter
which is a tuple representing the names of the keyword arguments
(which are guaranteed to be strings)
or possibly @code{NULL} if there are no keywords.  The values of the keyword
arguments are stored in the `args' array, after the positional arguments.


Added in version 3.7.

@end table

@geindex METH_METHOD (C macro)
@anchor{c-api/structures c METH_METHOD}@anchor{b6e}
@deffn {C Macro} METH_METHOD
` Part of the @ref{776,,Stable ABI} since version 3.7.'
Can only be used in the combination with other flags:
@ref{1a50,,METH_METHOD | METH_FASTCALL | METH_KEYWORDS}.
@end deffn
@anchor{c-api/structures meth-method-meth-fastcall-meth-keywords}@anchor{1a50}

@table @asis

@item @ref{b6e,,METH_METHOD} | @ref{19e1,,METH_FASTCALL} | @ref{5202,,METH_KEYWORDS}

Extension of @ref{595d,,METH_FASTCALL | METH_KEYWORDS}
supporting the `defining class', that is,
the class that contains the method in question.
The defining class might be a superclass of @code{Py_TYPE(self)}.

The method needs to be of type @ref{96d,,PyCMethod}, the same as for
@code{METH_FASTCALL | METH_KEYWORDS} with @code{defining_class} argument added after
@code{self}.


Added in version 3.9.

@end table

@geindex METH_NOARGS (C macro)
@anchor{c-api/structures c METH_NOARGS}@anchor{16e0}
@deffn {C Macro} METH_NOARGS
` Part of the @ref{776,,Stable ABI}.'
Methods without parameters don’t need to check whether arguments are given if
they are listed with the @ref{16e0,,METH_NOARGS} flag.  They need to be of type
@ref{1684,,PyCFunction}.  The first parameter is typically named `self' and will
hold a reference to the module or object instance.  In all cases the second
parameter will be @code{NULL}.

The function must have 2 parameters. Since the second parameter is unused,
@ref{1ad0,,Py_UNUSED} can be used to prevent a compiler warning.
@end deffn

@geindex METH_O (C macro)
@anchor{c-api/structures c METH_O}@anchor{1713}
@deffn {C Macro} METH_O
` Part of the @ref{776,,Stable ABI}.'
Methods with a single object argument can be listed with the @ref{1713,,METH_O}
flag, instead of invoking @ref{3bf,,PyArg_ParseTuple()} with a @code{"O"} argument.
They have the type @ref{1684,,PyCFunction}, with the `self' parameter, and a
@ref{5df,,PyObject}* parameter representing the single argument.
@end deffn

These two constants are not used to indicate the calling convention but the
binding when used with methods of classes.  These may not be used for functions
defined for modules.  At most one of these flags may be set for any given
method.

@geindex METH_CLASS (C macro)
@anchor{c-api/structures c METH_CLASS}@anchor{16e1}
@deffn {C Macro} METH_CLASS
` Part of the @ref{776,,Stable ABI}.'
@geindex built-in function; classmethod

The method will be passed the type object as the first parameter rather
than an instance of the type.  This is used to create `class methods',
similar to what is created when using the @ref{48f,,classmethod()} built-in
function.
@end deffn

@geindex METH_STATIC (C macro)
@anchor{c-api/structures c METH_STATIC}@anchor{16e2}
@deffn {C Macro} METH_STATIC
` Part of the @ref{776,,Stable ABI}.'
@geindex built-in function; staticmethod

The method will be passed @code{NULL} as the first parameter rather than an
instance of the type.  This is used to create `static methods', similar to
what is created when using the @ref{451,,staticmethod()} built-in function.
@end deffn

One other constant controls whether a method is loaded in place of another
definition with the same method name.

@geindex METH_COEXIST (C macro)
@anchor{c-api/structures c METH_COEXIST}@anchor{1683}
@deffn {C Macro} METH_COEXIST
` Part of the @ref{776,,Stable ABI}.'
The method will be loaded in place of existing definitions.  Without
`METH_COEXIST', the default is to skip repeated definitions.  Since slot
wrappers are loaded before the method table, the existence of a
`sq_contains' slot, for example, would generate a wrapped method named
@ref{15c5,,__contains__()} and preclude the loading of a corresponding
PyCFunction with the same name.  With the flag defined, the PyCFunction
will be loaded in place of the wrapper object and will co-exist with the
slot.  This is helpful because calls to PyCFunctions are optimized more
than wrapper object calls.
@end deffn

@geindex PyCMethod_Type (C var)
@anchor{c-api/structures c PyCMethod_Type}@anchor{5961}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyCMethod_Type

The type object corresponding to Python C method objects. This is
available as @ref{2a53,,types.BuiltinMethodType} in the Python layer.
@end deffn

@geindex PyCMethod_Check (C function)
@anchor{c-api/structures c PyCMethod_Check}@anchor{5962}
@deffn {C Function} int PyCMethod_Check (PyObject *op)

Return true if `op' is an instance of the @ref{5961,,PyCMethod_Type} type
or a subtype of it. This function always succeeds.
@end deffn

@geindex PyCMethod_CheckExact (C function)
@anchor{c-api/structures c PyCMethod_CheckExact}@anchor{5963}
@deffn {C Function} int PyCMethod_CheckExact (PyObject *op)

This is the same as @ref{5962,,PyCMethod_Check()}, but does not account for
subtypes.
@end deffn

@geindex PyCMethod_New (C function)
@anchor{c-api/structures c PyCMethod_New}@anchor{1cec}
@deffn {C Function} @ref{5df,,PyObject} *PyCMethod_New (PyMethodDef *ml, PyObject *self, PyObject *module, PyTypeObject *cls)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI} since version 3.9.'
Turn `ml' into a Python @ref{2dec,,callable} object.
The caller must ensure that `ml' outlives the callable.
Typically, `ml' is defined as a static variable.

The `self' parameter will be passed as the `self' argument
to the C function in @code{ml->ml_meth} when invoked.
`self' can be @code{NULL}.

The @ref{2dec,,callable} object’s @code{__module__} attribute
can be set from the given `module' argument.
`module' should be a Python string,
which will be used as name of the module the function is defined in.
If unavailable, it can be set to @ref{887,,None} or @code{NULL}.


@subsubheading See also


@ref{238e,,function.__module__}


The `cls' parameter will be passed as the `defining_class'
argument to the C function.
Must be set if @ref{b6e,,METH_METHOD} is set on @code{ml->ml_flags}.


Added in version 3.9.

@end deffn

@geindex PyCFunction_Type (C var)
@anchor{c-api/structures c PyCFunction_Type}@anchor{52ef}
@deffn {C Variable} @ref{ca2,,PyTypeObject} PyCFunction_Type
` Part of the @ref{776,,Stable ABI}.'
The type object corresponding to Python C function objects. This is
available as @ref{2a52,,types.BuiltinFunctionType} in the Python layer.
@end deffn

@geindex PyCFunction_Check (C function)
@anchor{c-api/structures c PyCFunction_Check}@anchor{5964}
@deffn {C Function} int PyCFunction_Check (PyObject *op)

Return true if `op' is an instance of the @ref{52ef,,PyCFunction_Type} type
or a subtype of it. This function always succeeds.
@end deffn

@geindex PyCFunction_CheckExact (C function)
@anchor{c-api/structures c PyCFunction_CheckExact}@anchor{5965}
@deffn {C Function} int PyCFunction_CheckExact (PyObject *op)

This is the same as @ref{5964,,PyCFunction_Check()}, but does not account for
subtypes.
@end deffn

@geindex PyCFunction_NewEx (C function)
@anchor{c-api/structures c PyCFunction_NewEx}@anchor{1dba}
@deffn {C Function} @ref{5df,,PyObject} *PyCFunction_NewEx (PyMethodDef *ml, PyObject *self, PyObject *module)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI}.'
Equivalent to @code{PyCMethod_New(ml, self, module, NULL)}.
@end deffn

@geindex PyCFunction_New (C function)
@anchor{c-api/structures c PyCFunction_New}@anchor{1cf2}
@deffn {C Function} @ref{5df,,PyObject} *PyCFunction_New (PyMethodDef *ml, PyObject *self)
`Return value: New reference.'` Part of the @ref{776,,Stable ABI} since version 3.4.'
Equivalent to @code{PyCMethod_New(ml, self, NULL, NULL)}.
@end deffn

@geindex PyCFunction_GetFlags (C function)
@anchor{c-api/structures c PyCFunction_GetFlags}@anchor{52ec}
@deffn {C Function} int PyCFunction_GetFlags (PyObject *func)
` Part of the @ref{776,,Stable ABI}.'
Get the function’s flags on `func' as they were passed to
@ref{595f,,ml_flags}.

If `func' is not a C function object, this fails with an exception.
`func' must not be @code{NULL}.

This function returns the function’s flags on success, and @code{-1} with an
exception set on failure.
@end deffn

@geindex PyCFunction_GET_FLAGS (C function)
@anchor{c-api/structures c PyCFunction_GET_FLAGS}@anchor{5966}
@deffn {C Function} int PyCFunction_GET_FLAGS (PyObject *func)

This is the same as @ref{52ec,,PyCFunction_GetFlags()}, but without error
or type checking.
@end deffn

@geindex PyCFunction_GetFunction (C function)
@anchor{c-api/structures c PyCFunction_GetFunction}@anchor{52ed}
@deffn {C Function} @ref{1684,,PyCFunction} PyCFunction_GetFunction (PyObject *func)
` Part of the @ref{776,,Stable ABI}.'
Get the function pointer on `func' as it was passed to
@ref{595e,,ml_meth}.

If `func' is not a C function object, this fails with an exception.
`func' must not be @code{NULL}.

This function returns the function pointer on success, and @code{NULL} with an
exception set on failure.
@end deffn

@geindex PyCFunction_GET_FUNCTION (C function)
@anchor{c-api/structures c PyCFunction_GET_FUNCTION}@anchor{5967}
@deffn {C Function} int PyCFunction_GET_FUNCTION (PyObject *func)

This is the same as @ref{52ed,,PyCFunction_GetFunction()}, but without error
or type checking.
@end deffn

@geindex PyCFunction_GetSelf (C function)
@anchor{c-api/structures c PyCFunction_GetSelf}@anchor{52ee}
@deffn {C Function} @ref{5df,,PyObject} *PyCFunction_GetSelf (PyObject *func)
` Part of the @ref{776,,Stable ABI}.'
Get the “self” object on `func'. This is the object that would be passed
to the first argument of a @ref{1684,,PyCFunction}. For C function objects
created through a @ref{16e3,,PyMethodDef} on a @ref{b7a,,PyModuleDef}, this
is the resulting module object.

If `func' is not a C function object, this fails with an exception.
`func' must not be @code{NULL}.

This function returns a @ref{3d5,,borrowed reference} to the “self” object
on success, and @code{NULL} with an exception set on failure.
@end deffn

@geindex PyCFunction_GET_SELF (C function)
@anchor{c-api/structures c PyCFunction_GET_SELF}@anchor{5968}
@deffn {C Function} @ref{5df,,PyObject} *PyCFunction_GET_SELF (PyObject *func)

This is the same as @ref{52ee,,PyCFunction_GetSelf()}, but without error or
type checking.
@end deffn

@node Accessing attributes of extension types,,Implementing functions and methods,Common Object Structures
@anchor{c-api/structures accessing-attributes-of-extension-types}@anchor{5969}
@subsubsection Accessing attributes of extension types


@geindex PyMemberDef (C type)
@anchor{c-api/structures c PyMemberDef}@anchor{772}
@deffn {C Type} type PyMemberDef
` Part of the @ref{776,,Stable ABI} (including all members).'
Structure which describes an attribute of a type which corresponds to a C
struct member.
When defining a class, put a NULL-terminated array of these
structures in the @ref{5232,,tp_members} slot.

Its fields are, in order:

@geindex PyMemberDef.name (C member)
@anchor{c-api/structures c PyMemberDef name}@anchor{596a}
@deffn {C Member} const char *name

Name of the member.
A NULL value marks the end of a @code{PyMemberDef[]} array.

The string should be static, no copy is made of it.
@end deffn

@geindex PyMemberDef.type (C member)
@anchor{c-api/structures c PyMemberDef type}@anchor{524a}
@deffn {C Member} int type

The type of the member in the C struct.
See @ref{1a34,,Member types} for the possible values.
@end deffn

@geindex PyMemberDef.offset (C member)
@anchor{c-api/structures c PyMemberDef offset}@anchor{596b}
@deffn {C Member} @ref{c5b,,Py_ssize_t} offset

The offset in bytes that the member is located on the type’s object struct.
@end deffn

@geindex PyMemberDef.flags (C member)
@anchor{c-api/structures c PyMemberDef flags}@anchor{524b}
@deffn {C Member} int flags

Zero or more of the @ref{596c,,Member flags}, combined using bitwise OR.
@end deffn

@geindex PyMemberDef.doc (C member)
@anchor{c-api/structures c PyMemberDef doc}@anchor{596d}
@deffn {C Member} const char *doc

The docstring, or NULL.
The string should be static, no copy is made of it.
Typically, it is defined using @ref{1bda,,PyDoc_STR}.
@end deffn

By default (when @ref{524b,,flags} is @code{0}), members allow
both read and write access.
Use the @ref{7af,,Py_READONLY} flag for read-only access.
Certain types, like @ref{54a2,,Py_T_STRING}, imply @code{Py_READONLY}.
Only @ref{7b2,,Py_T_OBJECT_EX} (and legacy @ref{7b1,,T_OBJECT}) members can
be deleted.
@anchor{c-api/structures pymemberdef-offsets}@anchor{564d}
For heap-allocated types (created using @ref{79e,,PyType_FromSpec()} or similar),
@code{PyMemberDef} may contain a definition for the special member
@code{"__vectorcalloffset__"}, corresponding to
@ref{55f6,,tp_vectorcall_offset} in type objects.
This member must be defined with @code{Py_T_PYSSIZET}, and either
@code{Py_READONLY} or @code{Py_READONLY | Py_RELATIVE_OFFSET}. For example:

@example
static PyMemberDef spam_type_members[] = @{
    @{"__vectorcalloffset__", Py_T_PYSSIZET,
     offsetof(Spam_object, vectorcall), Py_READONLY@},
    @{NULL@}  /* Sentinel */
@};
@end example

(You may need to @code{#include <stddef.h>} for @code{offsetof()}.)

The legacy offsets @ref{564c,,tp_dictoffset} and
@ref{b85,,tp_weaklistoffset} can be defined similarly using
@code{"__dictoffset__"} and @code{"__weaklistoffset__"} members, but extensions
are strongly encouraged to use @ref{60f,,Py_TPFLAGS_MANAGED_DICT} and
@ref{77d,,Py_TPFLAGS_MANAGED_WEAKREF} instead.


Changed in version 3.12: @code{PyMemberDef} is always available.
Previously, it required including @code{"structmember.h"}.



Changed in version 3.14: @ref{771,,Py_RELATIVE_OFFSET} is now allowed for
@code{"__vectorcalloffset__"}, @code{"__dictoffset__"} and
@code{"__weaklistoffset__"}.

@end deffn

@geindex PyMember_GetOne (C function)
@anchor{c-api/structures c PyMember_GetOne}@anchor{7ab}
@deffn {C Function} @ref{5df,,PyObject} *PyMember_GetOne (const char *obj_addr, struct PyMemberDef *m)
` Part of the @ref{776,,Stable ABI}.'
Get an attribute belonging to the object at address `obj_addr'.  The
attribute is described by @code{PyMemberDef} `m'.  Returns @code{NULL}
on error.


Changed in version 3.12: @code{PyMember_GetOne} is always available.
Previously, it required including @code{"structmember.h"}.

@end deffn

@geindex PyMember_SetOne (C function)
@anchor{c-api/structures c PyMember_SetOne}@anchor{7ac}
@deffn {C Function} int PyMember_SetOne (char *obj_addr, struct PyMemberDef *m, PyObject *o)
` Part of the @ref{776,,Stable ABI}.'
Set an attribute belonging to the object at address `obj_addr' to object `o'.
The attribute to set is described by @code{PyMemberDef} `m'.  Returns @code{0}
if successful and a negative value on failure.


Changed in version 3.12: @code{PyMember_SetOne} is always available.
Previously, it required including @code{"structmember.h"}.

@end deffn

@menu
* Member flags:: 
* Member types:: 
* Defining Getters and Setters:: 

@end menu

@node Member flags,Member types,,Accessing attributes of extension types
@anchor{c-api/structures member-flags}@anchor{596e}@anchor{c-api/structures pymemberdef-flags}@anchor{596c}
@subsubsection Member flags


The following flags can be used with @ref{524b,,PyMemberDef.flags}:

@geindex Py_READONLY (C macro)
@anchor{c-api/structures c Py_READONLY}@anchor{7af}
@deffn {C Macro} Py_READONLY
` Part of the @ref{776,,Stable ABI} since version 3.12.'
Not writable.
@end deffn

@geindex Py_AUDIT_READ (C macro)
@anchor{c-api/structures c Py_AUDIT_READ}@anchor{7b0}
@deffn {C Macro} Py_AUDIT_READ
` Part of the @ref{776,,Stable ABI} since version 3.12.'
Emit an @code{object.__getattr__} @ref{1c56,,audit event}
before reading.
@end deffn

@geindex Py_RELATIVE_OFFSET (C macro)
@anchor{c-api/structures c Py_RELATIVE_OFFSET}@anchor{771}
@deffn {C Macro} Py_RELATIVE_OFFSET
` Part of the @ref{776,,Stable ABI} since version 3.12.'
Indicates that the @ref{596b,,offset} of this @code{PyMemberDef}
entry indicates an offset from the subclass-specific data, rather than
from @code{PyObject}.

Can only be used as part of the @ref{54f5,,Py_tp_members}
@ref{543c,,slot} when creating a class using negative
@ref{76b,,basicsize}.
It is mandatory in that case.
When setting @ref{5232,,tp_members} from the slot during
class creation, Python clears the flag and sets
@ref{596b,,PyMemberDef.offset} to the offset from the @code{PyObject} struct.
@end deffn

@geindex READ_RESTRICTED (C macro)
@geindex WRITE_RESTRICTED (C macro)
@geindex RESTRICTED (C macro)


Changed in version 3.10: The @code{RESTRICTED}, @code{READ_RESTRICTED} and
@code{WRITE_RESTRICTED} macros available with
@code{#include "structmember.h"} are deprecated.
@code{READ_RESTRICTED} and @code{RESTRICTED} are equivalent to
@ref{7b0,,Py_AUDIT_READ}; @code{WRITE_RESTRICTED} does nothing.


@geindex READONLY (C macro)


Changed in version 3.12: The @code{READONLY} macro was renamed to @ref{7af,,Py_READONLY}.
The @code{PY_AUDIT_READ} macro was renamed with the @code{Py_} prefix.
The new names are now always available.
Previously, these required @code{#include "structmember.h"}.
The header is still available and it provides the old names.


@node Member types,Defining Getters and Setters,Member flags,Accessing attributes of extension types
@anchor{c-api/structures member-types}@anchor{596f}@anchor{c-api/structures pymemberdef-types}@anchor{1a34}
@subsubsection Member types


@ref{524a,,PyMemberDef.type} can be one of the following macros corresponding
to various C types.
When the member is accessed in Python, it will be converted to the
equivalent Python type.
When it is set from Python, it will be converted back to the C type.
If that is not possible, an exception such as @ref{199,,TypeError} or
@ref{2ee,,ValueError} is raised.

Unless marked (D), attributes defined this way cannot be deleted
using e.g. @ref{1b63,,del} or @ref{25fe,,delattr()}.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Macro name

@tab

C type

@tab

Python type

@item

@geindex Py_T_BYTE (C macro)
@anchor{c-api/structures c Py_T_BYTE}@anchor{549b}
@deffn {C Macro} Py_T_BYTE
` Part of the @ref{776,,Stable ABI} since version 3.12.'
@end deffn

@tab

char

@tab

@ref{19c,,int}

@item

@geindex Py_T_SHORT (C macro)
@anchor{c-api/structures c Py_T_SHORT}@anchor{54a1}
@deffn {C Macro} Py_T_SHORT
` Part of the @ref{776,,Stable ABI} since version 3.12.'
@end deffn

@tab

short

@tab

@ref{19c,,int}

@item

@geindex Py_T_INT (C macro)
@anchor{c-api/structures c Py_T_INT}@anchor{7ad}
@deffn {C Macro} Py_T_INT
` Part of the @ref{776,,Stable ABI} since version 3.12.'
@end deffn

@tab

int

@tab

@ref{19c,,int}

@item

@geindex Py_T_LONG (C macro)
@anchor{c-api/structures c Py_T_LONG}@anchor{549e}
@deffn {C Macro} Py_T_LONG
` Part of the @ref{776,,Stable ABI} since version 3.12.'
@end deffn

@tab

long

@tab

@ref{19c,,int}

@item

@geindex Py_T_LONGLONG (C macro)
@anchor{c-api/structures c Py_T_LONGLONG}@anchor{549f}
@deffn {C Macro} Py_T_LONGLONG
` Part of the @ref{776,,Stable ABI} since version 3.12.'
@end deffn

@tab

long long

@tab

@ref{19c,,int}

@item

@geindex Py_T_UBYTE (C macro)
@anchor{c-api/structures c Py_T_UBYTE}@anchor{54a4}
@deffn {C Macro} Py_T_UBYTE
` Part of the @ref{776,,Stable ABI} since version 3.12.'
@end deffn

@tab

unsigned char

@tab

@ref{19c,,int}

@item

@geindex Py_T_UINT (C macro)
@anchor{c-api/structures c Py_T_UINT}@anchor{54a5}
@deffn {C Macro} Py_T_UINT
` Part of the @ref{776,,Stable ABI} since version 3.12.'
@end deffn

@tab

unsigned int

@tab

@ref{19c,,int}

@item

@geindex Py_T_USHORT (C macro)
@anchor{c-api/structures c Py_T_USHORT}@anchor{54a8}
@deffn {C Macro} Py_T_USHORT
` Part of the @ref{776,,Stable ABI} since version 3.12.'
@end deffn

@tab

unsigned short

@tab

@ref{19c,,int}

@item

@geindex Py_T_ULONG (C macro)
@anchor{c-api/structures c Py_T_ULONG}@anchor{54a6}
@deffn {C Macro} Py_T_ULONG
` Part of the @ref{776,,Stable ABI} since version 3.12.'
@end deffn

@tab

unsigned long

@tab

@ref{19c,,int}

@item

@geindex Py_T_ULONGLONG (C macro)
@anchor{c-api/structures c Py_T_ULONGLONG}@anchor{54a7}
@deffn {C Macro} Py_T_ULONGLONG
` Part of the @ref{776,,Stable ABI} since version 3.12.'
@end deffn

@tab

unsigned long long

@tab

@ref{19c,,int}

@item

@geindex Py_T_PYSSIZET (C macro)
@anchor{c-api/structures c Py_T_PYSSIZET}@anchor{54a0}
@deffn {C Macro} Py_T_PYSSIZET
` Part of the @ref{776,,Stable ABI} since version 3.12.'
@end deffn

@tab

@ref{c5b,,Py_ssize_t}

@tab

@ref{19c,,int}

@item

@geindex Py_T_FLOAT (C macro)
@anchor{c-api/structures c Py_T_FLOAT}@anchor{549d}
@deffn {C Macro} Py_T_FLOAT
` Part of the @ref{776,,Stable ABI} since version 3.12.'
@end deffn

@tab

float

@tab

@ref{197,,float}

@item

@geindex Py_T_DOUBLE (C macro)
@anchor{c-api/structures c Py_T_DOUBLE}@anchor{7ae}
@deffn {C Macro} Py_T_DOUBLE
` Part of the @ref{776,,Stable ABI} since version 3.12.'
@end deffn

@tab

double

@tab

@ref{197,,float}

@item

@geindex Py_T_BOOL (C macro)
@anchor{c-api/structures c Py_T_BOOL}@anchor{549a}
@deffn {C Macro} Py_T_BOOL
` Part of the @ref{776,,Stable ABI} since version 3.12.'
@end deffn

@tab

char
(written as 0 or 1)

@tab

@ref{3c1,,bool}

@item

@geindex Py_T_STRING (C macro)
@anchor{c-api/structures c Py_T_STRING}@anchor{54a2}
@deffn {C Macro} Py_T_STRING
` Part of the @ref{776,,Stable ABI} since version 3.12.'
@end deffn

@tab

const char* (*)

@tab

@ref{16a,,str} (RO)

@item

@geindex Py_T_STRING_INPLACE (C macro)
@anchor{c-api/structures c Py_T_STRING_INPLACE}@anchor{54a3}
@deffn {C Macro} Py_T_STRING_INPLACE
` Part of the @ref{776,,Stable ABI} since version 3.12.'
@end deffn

@tab

const char[] (*)

@tab

@ref{16a,,str} (RO)

@item

@geindex Py_T_CHAR (C macro)
@anchor{c-api/structures c Py_T_CHAR}@anchor{549c}
@deffn {C Macro} Py_T_CHAR
` Part of the @ref{776,,Stable ABI} since version 3.12.'
@end deffn

@tab

char (0-127)

@tab

@ref{16a,,str} (**)

@item

@geindex Py_T_OBJECT_EX (C macro)
@anchor{c-api/structures c Py_T_OBJECT_EX}@anchor{7b2}
@deffn {C Macro} Py_T_OBJECT_EX
` Part of the @ref{776,,Stable ABI} since version 3.12.'
@end deffn

@tab

@ref{5df,,PyObject}*

@tab

@ref{c84,,object} (D)

@end multitable


@quotation

(*): Zero-terminated, UTF8-encoded C string.
With @code{Py_T_STRING} the C representation is a pointer;
with @code{Py_T_STRING_INPLACE} the string is stored directly
in the structure.

(**): String of length 1. Only ASCII is accepted.

(RO): Implies @ref{7af,,Py_READONLY}.

(D): Can be deleted, in which case the pointer is set to @code{NULL}.
Reading a @code{NULL} pointer raises @ref{5f0,,AttributeError}.
@end quotation

@geindex T_BYTE (C macro)
@geindex T_SHORT (C macro)
@geindex T_INT (C macro)
@geindex T_LONG (C macro)
@geindex T_LONGLONG (C macro)
@geindex T_UBYTE (C macro)
@geindex T_USHORT (C macro)
@geindex T_UINT (C macro)
@geindex T_ULONG (C macro)
@geindex T_ULONGULONG (C macro)
@geindex T_PYSSIZET (C macro)
@geindex T_FLOAT (C macro)
@geindex T_DOUBLE (C macro)
@geindex T_BOOL (C macro)
@geindex T_CHAR (C macro)
@geindex T_STRING (C macro)
@geindex T_STRING_INPLACE (C macro)
@geindex T_OBJECT_EX (C macro)
@geindex structmember.h


Added in version 3.12: In previous versions, the macros were only available with
@code{#include "structmember.h"} and were named without the @code{Py_} prefix
(e.g. as @code{T_INT}).
The header is still available and contains the old names, along with
the following deprecated types:

@geindex T_OBJECT (C macro)
@anchor{c-api/structures c T_OBJECT}@anchor{7b1}
@deffn {C Macro} T_OBJECT

Like @code{Py_T_OBJECT_EX}, but @code{NULL} is converted to @code{None}.
This results in surprising behavior in Python: deleting the attribute
effectively sets it to @code{None}.
@end deffn

@geindex T_NONE (C macro)
@anchor{c-api/structures c T_NONE}@anchor{7b3}
@deffn {C Macro} T_NONE

Always @code{None}. Must be used with @ref{7af,,Py_READONLY}.
@end deffn


@node Defining Getters and Setters,,Member types,Accessing attributes of extension types
@anchor{c-api/structures defining-getters-and-setters}@anchor{5970}
@subsubsection Defining Getters and Setters


@geindex PyGetSetDef (C type)
@anchor{c-api/structures c PyGetSetDef}@anchor{db8}
@deffn {C Type} type PyGetSetDef
` Part of the @ref{776,,Stable ABI} (including all members).'
Structure to define property-like access for a type. See also description of
the @ref{5237,,PyTypeObject.tp_getset} slot.

@geindex PyGetSetDef.name (C member)
@anchor{c-api/structures c PyGetSetDef name}@anchor{5971}
@deffn {C Member} const char *name

attribute name
@end deffn

@geindex PyGetSetDef.get (C member)
@anchor{c-api/structures c PyGetSetDef get}@anchor{5972}
@deffn {C Member} @ref{5508,,getter} get

C function to get the attribute.
@end deffn

@geindex PyGetSetDef.set (C member)
@anchor{c-api/structures c PyGetSetDef set}@anchor{5973}
@deffn {C Member} @ref{5516,,setter} set

Optional C function to set or delete the attribute.
If @code{NULL}, the attribute is read-only.
@end deffn

@geindex PyGetSetDef.doc (C member)
@anchor{c-api/structures c PyGetSetDef doc}@anchor{5974}
@deffn {C Member} const char *doc

optional docstring
@end deffn

@geindex PyGetSetDef.closure (C member)
@anchor{c-api/structures c PyGetSetDef closure}@anchor{5975}
@deffn {C Member} void *closure

Optional user data pointer, providing additional data for getter and setter.
@end deffn
@end deffn

@geindex getter (C type)
@anchor{c-api/structures c getter}@anchor{5508}
@deffn {C Type} typedef @ref{5df,,PyObject} *(*getter)(@ref{5df,,PyObject}*, void*)
` Part of the @ref{776,,Stable ABI}.'
The @code{get} function takes one @ref{5df,,PyObject}* parameter (the
instance) and a user data pointer (the associated @code{closure}):

It should return a new reference on success or @code{NULL} with a set exception
on failure.
@end deffn

@geindex setter (C type)
@anchor{c-api/structures c setter}@anchor{5516}
@deffn {C Type} typedef int (*setter)(@ref{5df,,PyObject}*, @ref{5df,,PyObject}*, void*)
` Part of the @ref{776,,Stable ABI}.'
@code{set} functions take two @ref{5df,,PyObject}* parameters (the instance and
the value to be set) and a user data pointer (the associated @code{closure}):

In case the attribute should be deleted the second parameter is @code{NULL}.
Should return @code{0} on success or @code{-1} with a set exception on failure.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Type Object Structures,Supporting Cyclic Garbage Collection,Common Object Structures,Object Implementation Support
@anchor{c-api/typeobj doc}@anchor{5976}@anchor{c-api/typeobj translation-repo}@anchor{5977}@anchor{c-api/typeobj type-object-structures}@anchor{5978}@anchor{c-api/typeobj type-structs}@anchor{b8a}
@subsection Type Object Structures


Perhaps one of the most important structures of the Python object system is the
structure that defines a new type: the @ref{ca2,,PyTypeObject} structure.  Type
objects can be handled using any of the @code{PyObject_*} or
@code{PyType_*} functions, but do not offer much that’s interesting to most
Python applications. These objects are fundamental to how objects behave, so
they are very important to the interpreter itself and to any extension module
that implements new types.

Type objects are fairly large compared to most of the standard types. The reason
for the size is that each type object stores a large number of values, mostly C
function pointers, each of which implements a small part of the type’s
functionality.  The fields of the type object are examined in detail in this
section.  The fields will be described in the order in which they occur in the
structure.

In addition to the following quick reference, the @ref{5979,,Examples}
section provides at-a-glance insight into the meaning and use of
@ref{ca2,,PyTypeObject}.

@menu
* Quick Reference:: 
* PyTypeObject Definition:: 
* PyObject Slots:: 
* PyVarObject Slots:: 
* PyTypeObject Slots:: 
* Static Types:: 
* Heap Types:: 
* Number Object Structures:: 
* Mapping Object Structures:: 
* Sequence Object Structures:: 
* Buffer Object Structures:: 
* Async Object Structures:: 
* Slot Type typedefs:: 
* Examples: Examples<39>. 

@end menu

@node Quick Reference,PyTypeObject Definition,,Type Object Structures
@anchor{c-api/typeobj quick-reference}@anchor{597a}
@subsubsection Quick Reference


@menu
* “tp slots”:: 
* sub-slots:: 
* slot typedefs:: 

@end menu

@node “tp slots”,sub-slots,,Quick Reference
@anchor{c-api/typeobj tp-slots}@anchor{597b}@anchor{c-api/typeobj tp-slots-table}@anchor{597c}
@subsubsection “tp slots”



@multitable {xxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxx} {xxx} {xxx} {xxx} {xxx} 
@headitem

PyTypeObject Slot @footnote{
`()': A slot name in parentheses indicates it is (effectively) deprecated.

`<>': Names in angle brackets should be initially set to @code{NULL} and
treated as read-only.

`[]': Names in square brackets are for internal use only.

`<R>' (as a prefix) means the field is required (must be non-@code{NULL}).
}

@tab

@ref{597d,,Type}

@tab

special
methods/attrs

@tab

Info @footnote{
Columns:

`“O”':  set on @ref{52d5,,PyBaseObject_Type}

`“T”':  set on @ref{770,,PyType_Type}

`“D”':  default (if slot is set to @code{NULL})

@example
X - PyType_Ready sets this value if it is NULL
~ - PyType_Ready always sets this value (it should be NULL)
? - PyType_Ready may set this value depending on other slots

Also see the inheritance column ("I").
@end example

`“I”':  inheritance

@example
X - type slot is inherited via *PyType_Ready* if defined with a *NULL* value
% - the slots of the sub-struct are inherited individually
G - inherited, but only in combination with other slots; see the slot's description
? - it's complicated; see the slot's description
@end example

Note that some slots are effectively inherited through the normal
attribute lookup chain.
}

@tab

@tab

@tab

@item

O

@tab

T

@tab

D

@tab

I

@item

<R> @ref{1cf1,,tp_name}

@tab

const char *

@tab

__name__

@tab

X

@tab

X

@tab

@tab

@item

@ref{b84,,tp_basicsize}

@tab

@ref{c5b,,Py_ssize_t}

@tab

@tab

X

@tab

X

@tab

@tab

X

@item

@ref{2402,,tp_itemsize}

@tab

@ref{c5b,,Py_ssize_t}

@tab

@tab

@tab

X

@tab

@tab

X

@item

@ref{521c,,tp_dealloc}

@tab

@ref{5503,,destructor}

@tab

@tab

X

@tab

X

@tab

@tab

X

@item

@ref{55f6,,tp_vectorcall_offset}

@tab

@ref{c5b,,Py_ssize_t}

@tab

@tab

@tab

X

@tab

@tab

X

@item

(@ref{524d,,tp_getattr})

@tab

@ref{5504,,getattrfunc}

@tab

__getattribute__,
__getattr__

@tab

@tab

@tab

@tab

G

@item

(@ref{524e,,tp_setattr})

@tab

@ref{5514,,setattrfunc}

@tab

__setattr__,
__delattr__

@tab

@tab

@tab

@tab

G

@item

@ref{10d5,,tp_as_async}

@tab

@ref{564a,,PyAsyncMethods} *

@tab

@ref{597e,,sub-slots}

@tab

@tab

@tab

@tab

%

@item

@ref{5244,,tp_repr}

@tab

@ref{5512,,reprfunc}

@tab

__repr__

@tab

X

@tab

X

@tab

@tab

X

@item

@ref{b88,,tp_as_number}

@tab

@ref{162a,,PyNumberMethods} *

@tab

@ref{597e,,sub-slots}

@tab

@tab

@tab

@tab

%

@item

@ref{597f,,tp_as_sequence}

@tab

@ref{5254,,PySequenceMethods} *

@tab

@ref{597e,,sub-slots}

@tab

@tab

@tab

@tab

%

@item

@ref{5980,,tp_as_mapping}

@tab

@ref{5255,,PyMappingMethods} *

@tab

@ref{597e,,sub-slots}

@tab

@tab

@tab

@tab

%

@item

@ref{5256,,tp_hash}

@tab

@ref{5509,,hashfunc}

@tab

__hash__

@tab

X

@tab

@tab

@tab

G

@item

@ref{77c,,tp_call}

@tab

@ref{5519,,ternaryfunc}

@tab

__call__

@tab

@tab

X

@tab

@tab

X

@item

@ref{5245,,tp_str}

@tab

@ref{5512,,reprfunc}

@tab

__str__

@tab

X

@tab

@tab

@tab

X

@item

@ref{1aaa,,tp_getattro}

@tab

@ref{5505,,getattrofunc}

@tab

__getattribute__,
__getattr__

@tab

X

@tab

X

@tab

@tab

G

@item

@ref{5248,,tp_setattro}

@tab

@ref{5515,,setattrofunc}

@tab

__setattr__,
__delattr__

@tab

X

@tab

X

@tab

@tab

G

@item

@ref{b86,,tp_as_buffer}

@tab

@ref{5651,,PyBufferProcs} *

@tab

@ref{597e,,sub-slots}

@tab

@tab

@tab

@tab

%

@item

@ref{1cb4,,tp_flags}

@tab

unsigned long

@tab

@tab

X

@tab

X

@tab

@tab

?

@item

@ref{522b,,tp_doc}

@tab

const char *

@tab

__doc__

@tab

X

@tab

X

@tab

@tab

@item

@ref{987,,tp_traverse}

@tab

@ref{551a,,traverseproc}

@tab

@tab

@tab

X

@tab

@tab

G

@item

@ref{5242,,tp_clear}

@tab

@ref{550b,,inquiry}

@tab

@tab

@tab

X

@tab

@tab

G

@item

@ref{5250,,tp_richcompare}

@tab

@ref{5513,,richcmpfunc}

@tab

__lt__,
__le__,
__eq__,
__ne__,
__gt__,
__ge__

@tab

X

@tab

@tab

@tab

G

@item

(@ref{b85,,tp_weaklistoffset})

@tab

@ref{c5b,,Py_ssize_t}

@tab

@tab

@tab

X

@tab

@tab

?

@item

@ref{16fb,,tp_iter}

@tab

@ref{5507,,getiterfunc}

@tab

__iter__

@tab

@tab

@tab

@tab

X

@item

@ref{16fc,,tp_iternext}

@tab

@ref{550c,,iternextfunc}

@tab

__next__

@tab

@tab

@tab

@tab

X

@item

@ref{5234,,tp_methods}

@tab

@ref{16e3,,PyMethodDef} []

@tab

@tab

X

@tab

X

@tab

@tab

@item

@ref{5232,,tp_members}

@tab

@ref{772,,PyMemberDef} []

@tab

@tab

@tab

X

@tab

@tab

@item

@ref{5237,,tp_getset}

@tab

@ref{db8,,PyGetSetDef} []

@tab

@tab

X

@tab

X

@tab

@tab

@item

@ref{23b9,,tp_base}

@tab

@ref{ca2,,PyTypeObject} *

@tab

__base__

@tab

@tab

@tab

X

@tab

@item

@ref{1ad2,,tp_dict}

@tab

@ref{5df,,PyObject} *

@tab

__dict__

@tab

@tab

@tab

?

@tab

@item

@ref{5981,,tp_descr_get}

@tab

@ref{5501,,descrgetfunc}

@tab

__get__

@tab

@tab

@tab

@tab

X

@item

@ref{1cf5,,tp_descr_set}

@tab

@ref{5502,,descrsetfunc}

@tab

__set__,
__delete__

@tab

@tab

@tab

@tab

X

@item

(@ref{564c,,tp_dictoffset})

@tab

@ref{c5b,,Py_ssize_t}

@tab

@tab

@tab

X

@tab

@tab

?

@item

@ref{7a2,,tp_init}

@tab

@ref{550a,,initproc}

@tab

__init__

@tab

X

@tab

X

@tab

@tab

X

@item

@ref{5230,,tp_alloc}

@tab

@ref{54ff,,allocfunc}

@tab

@tab

X

@tab

@tab

?

@tab

?

@item

@ref{7a0,,tp_new}

@tab

@ref{550e,,newfunc}

@tab

__new__

@tab

X

@tab

X

@tab

?

@tab

?

@item

@ref{522f,,tp_free}

@tab

@ref{57a4,,freefunc}

@tab

@tab

X

@tab

X

@tab

?

@tab

?

@item

@ref{5982,,tp_is_gc}

@tab

@ref{550b,,inquiry}

@tab

@tab

@tab

X

@tab

@tab

X

@item

<@ref{5983,,tp_bases}>

@tab

@ref{5df,,PyObject} *

@tab

__bases__

@tab

@tab

@tab

~

@tab

@item

<@ref{564e,,tp_mro}>

@tab

@ref{5df,,PyObject} *

@tab

__mro__

@tab

@tab

@tab

~

@tab

@item

[@ref{564f,,tp_cache}]

@tab

@ref{5df,,PyObject} *

@tab

@tab

@tab

@tab

@tab

@item

[@ref{793,,tp_subclasses}]

@tab

void *

@tab

__subclasses__

@tab

@tab

@tab

@tab

@item

[@ref{5650,,tp_weaklist}]

@tab

@ref{5df,,PyObject} *

@tab

@tab

@tab

@tab

@tab

@item

(@ref{5984,,tp_del})

@tab

@ref{5503,,destructor}

@tab

@tab

@tab

@tab

@tab

@item

[@ref{5985,,tp_version_tag}]

@tab

unsigned int

@tab

@tab

@tab

@tab

@tab

@item

@ref{ca3,,tp_finalize}

@tab

@ref{5503,,destructor}

@tab

__del__

@tab

@tab

@tab

@tab

X

@item

@ref{19ce,,tp_vectorcall}

@tab

@ref{77a,,vectorcallfunc}

@tab

@tab

@tab

@tab

@tab

@item

[@ref{5986,,tp_watched}]

@tab

unsigned char

@tab

@tab

@tab

@tab

@tab

@end multitable


@node sub-slots,slot typedefs,“tp slots”,Quick Reference
@anchor{c-api/typeobj id3}@anchor{5987}@anchor{c-api/typeobj sub-slots}@anchor{597e}
@subsubsection sub-slots



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxx} 
@headitem

Slot

@tab

@ref{597d,,Type}

@tab

special
methods

@item

@ref{5988,,am_await}

@tab

@ref{551b,,unaryfunc}

@tab

__await__

@item

@ref{5989,,am_aiter}

@tab

@ref{551b,,unaryfunc}

@tab

__aiter__

@item

@ref{598a,,am_anext}

@tab

@ref{551b,,unaryfunc}

@tab

__anext__

@item

@ref{598b,,am_send}

@tab

@ref{598c,,sendfunc}

@tab

@item

@tab

@tab

@item

@ref{5642,,nb_add}

@tab

@ref{5500,,binaryfunc}

@tab

__add__
__radd__

@item

@ref{598d,,nb_inplace_add}

@tab

@ref{5500,,binaryfunc}

@tab

__iadd__

@item

@ref{598e,,nb_subtract}

@tab

@ref{5500,,binaryfunc}

@tab

__sub__
__rsub__

@item

@ref{598f,,nb_inplace_subtract}

@tab

@ref{5500,,binaryfunc}

@tab

__isub__

@item

@ref{5990,,nb_multiply}

@tab

@ref{5500,,binaryfunc}

@tab

__mul__
__rmul__

@item

@ref{5991,,nb_inplace_multiply}

@tab

@ref{5500,,binaryfunc}

@tab

__imul__

@item

@ref{5992,,nb_remainder}

@tab

@ref{5500,,binaryfunc}

@tab

__mod__
__rmod__

@item

@ref{5993,,nb_inplace_remainder}

@tab

@ref{5500,,binaryfunc}

@tab

__imod__

@item

@ref{5994,,nb_divmod}

@tab

@ref{5500,,binaryfunc}

@tab

__divmod__
__rdivmod__

@item

@ref{5995,,nb_power}

@tab

@ref{5519,,ternaryfunc}

@tab

__pow__
__rpow__

@item

@ref{5996,,nb_inplace_power}

@tab

@ref{5519,,ternaryfunc}

@tab

__ipow__

@item

@ref{5997,,nb_negative}

@tab

@ref{551b,,unaryfunc}

@tab

__neg__

@item

@ref{5998,,nb_positive}

@tab

@ref{551b,,unaryfunc}

@tab

__pos__

@item

@ref{5999,,nb_absolute}

@tab

@ref{551b,,unaryfunc}

@tab

__abs__

@item

@ref{599a,,nb_bool}

@tab

@ref{550b,,inquiry}

@tab

__bool__

@item

@ref{599b,,nb_invert}

@tab

@ref{551b,,unaryfunc}

@tab

__invert__

@item

@ref{599c,,nb_lshift}

@tab

@ref{5500,,binaryfunc}

@tab

__lshift__
__rlshift__

@item

@ref{599d,,nb_inplace_lshift}

@tab

@ref{5500,,binaryfunc}

@tab

__ilshift__

@item

@ref{599e,,nb_rshift}

@tab

@ref{5500,,binaryfunc}

@tab

__rshift__
__rrshift__

@item

@ref{599f,,nb_inplace_rshift}

@tab

@ref{5500,,binaryfunc}

@tab

__irshift__

@item

@ref{59a0,,nb_and}

@tab

@ref{5500,,binaryfunc}

@tab

__and__
__rand__

@item

@ref{59a1,,nb_inplace_and}

@tab

@ref{5500,,binaryfunc}

@tab

__iand__

@item

@ref{59a2,,nb_xor}

@tab

@ref{5500,,binaryfunc}

@tab

__xor__
__rxor__

@item

@ref{59a3,,nb_inplace_xor}

@tab

@ref{5500,,binaryfunc}

@tab

__ixor__

@item

@ref{59a4,,nb_or}

@tab

@ref{5500,,binaryfunc}

@tab

__or__
__ror__

@item

@ref{59a5,,nb_inplace_or}

@tab

@ref{5500,,binaryfunc}

@tab

__ior__

@item

@ref{59a6,,nb_int}

@tab

@ref{551b,,unaryfunc}

@tab

__int__

@item

@ref{59a7,,nb_reserved}

@tab

void *

@tab

@item

@ref{59a8,,nb_float}

@tab

@ref{551b,,unaryfunc}

@tab

__float__

@item

@ref{59a9,,nb_floor_divide}

@tab

@ref{5500,,binaryfunc}

@tab

__floordiv__

@item

@ref{59aa,,nb_inplace_floor_divide}

@tab

@ref{5500,,binaryfunc}

@tab

__ifloordiv__

@item

@ref{59ab,,nb_true_divide}

@tab

@ref{5500,,binaryfunc}

@tab

__truediv__

@item

@ref{59ac,,nb_inplace_true_divide}

@tab

@ref{5500,,binaryfunc}

@tab

__itruediv__

@item

@ref{1629,,nb_index}

@tab

@ref{551b,,unaryfunc}

@tab

__index__

@item

@ref{59ad,,nb_matrix_multiply}

@tab

@ref{5500,,binaryfunc}

@tab

__matmul__
__rmatmul__

@item

@ref{59ae,,nb_inplace_matrix_multiply}

@tab

@ref{5500,,binaryfunc}

@tab

__imatmul__

@item

@tab

@tab

@item

@ref{59af,,mp_length}

@tab

@ref{550d,,lenfunc}

@tab

__len__

@item

@ref{1d3a,,mp_subscript}

@tab

@ref{5500,,binaryfunc}

@tab

__getitem__

@item

@ref{59b0,,mp_ass_subscript}

@tab

@ref{550f,,objobjargproc}

@tab

__setitem__,
__delitem__

@item

@tab

@tab

@item

@ref{564b,,sq_length}

@tab

@ref{550d,,lenfunc}

@tab

__len__

@item

@ref{59b1,,sq_concat}

@tab

@ref{5500,,binaryfunc}

@tab

__add__

@item

@ref{59b2,,sq_repeat}

@tab

@ref{5517,,ssizeargfunc}

@tab

__mul__

@item

@ref{1d39,,sq_item}

@tab

@ref{5517,,ssizeargfunc}

@tab

__getitem__

@item

@ref{59b3,,sq_ass_item}

@tab

@ref{5518,,ssizeobjargproc}

@tab

__setitem__
__delitem__

@item

@ref{59b4,,sq_contains}

@tab

@ref{5510,,objobjproc}

@tab

__contains__

@item

@ref{59b5,,sq_inplace_concat}

@tab

@ref{5500,,binaryfunc}

@tab

__iadd__

@item

@ref{59b6,,sq_inplace_repeat}

@tab

@ref{5517,,ssizeargfunc}

@tab

__imul__

@item

@tab

@tab

@item

@ref{96b,,bf_getbuffer}

@tab

@ref{5506,,getbufferproc()}

@tab

__buffer__

@item

@ref{96c,,bf_releasebuffer}

@tab

@ref{5511,,releasebufferproc()}

@tab

__release_buffer__

@end multitable


@node slot typedefs,,sub-slots,Quick Reference
@anchor{c-api/typeobj slot-typedefs}@anchor{59b7}@anchor{c-api/typeobj slot-typedefs-table}@anchor{597d}
@subsubsection slot typedefs



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

typedef

@tab

Parameter Types

@tab

Return Type

@item

@ref{54ff,,allocfunc}

@tab


@display
@ref{ca2,,PyTypeObject} *@w{ }
@ref{c5b,,Py_ssize_t}@w{ }
@end display



@tab

@ref{5df,,PyObject} *

@item

@ref{5503,,destructor}

@tab

@ref{5df,,PyObject} *

@tab

void

@item

@ref{57a4,,freefunc}

@tab

void *

@tab

void

@item

@ref{551a,,traverseproc}

@tab


@display
@ref{5df,,PyObject} *@w{ }
@ref{551c,,visitproc}@w{ }
void *@w{ }
@end display



@tab

int

@item

@ref{550e,,newfunc}

@tab


@display
@ref{ca2,,PyTypeObject} *@w{ }
@ref{5df,,PyObject} *@w{ }
@ref{5df,,PyObject} *@w{ }
@end display



@tab

@ref{5df,,PyObject} *

@item

@ref{550a,,initproc}

@tab


@display
@ref{5df,,PyObject} *@w{ }
@ref{5df,,PyObject} *@w{ }
@ref{5df,,PyObject} *@w{ }
@end display



@tab

int

@item

@ref{5512,,reprfunc}

@tab

@ref{5df,,PyObject} *

@tab

@ref{5df,,PyObject} *

@item

@ref{5504,,getattrfunc}

@tab


@display
@ref{5df,,PyObject} *@w{ }
const char *@w{ }
@end display



@tab

@ref{5df,,PyObject} *

@item

@ref{5514,,setattrfunc}

@tab


@display
@ref{5df,,PyObject} *@w{ }
const char *@w{ }
@ref{5df,,PyObject} *@w{ }
@end display



@tab

int

@item

@ref{5505,,getattrofunc}

@tab


@display
@ref{5df,,PyObject} *@w{ }
@ref{5df,,PyObject} *@w{ }
@end display



@tab

@ref{5df,,PyObject} *

@item

@ref{5515,,setattrofunc}

@tab


@display
@ref{5df,,PyObject} *@w{ }
@ref{5df,,PyObject} *@w{ }
@ref{5df,,PyObject} *@w{ }
@end display



@tab

int

@item

@ref{5501,,descrgetfunc}

@tab


@display
@ref{5df,,PyObject} *@w{ }
@ref{5df,,PyObject} *@w{ }
@ref{5df,,PyObject} *@w{ }
@end display



@tab

@ref{5df,,PyObject} *

@item

@ref{5502,,descrsetfunc}

@tab


@display
@ref{5df,,PyObject} *@w{ }
@ref{5df,,PyObject} *@w{ }
@ref{5df,,PyObject} *@w{ }
@end display



@tab

int

@item

@ref{5509,,hashfunc}

@tab

@ref{5df,,PyObject} *

@tab

Py_hash_t

@item

@ref{5513,,richcmpfunc}

@tab


@display
@ref{5df,,PyObject} *@w{ }
@ref{5df,,PyObject} *@w{ }
int@w{ }
@end display



@tab

@ref{5df,,PyObject} *

@item

@ref{5507,,getiterfunc}

@tab

@ref{5df,,PyObject} *

@tab

@ref{5df,,PyObject} *

@item

@ref{550c,,iternextfunc}

@tab

@ref{5df,,PyObject} *

@tab

@ref{5df,,PyObject} *

@item

@ref{550d,,lenfunc}

@tab

@ref{5df,,PyObject} *

@tab

@ref{c5b,,Py_ssize_t}

@item

@ref{5506,,getbufferproc}

@tab


@display
@ref{5df,,PyObject} *@w{ }
@ref{961,,Py_buffer} *@w{ }
int@w{ }
@end display



@tab

int

@item

@ref{5511,,releasebufferproc}

@tab


@display
@ref{5df,,PyObject} *@w{ }
@ref{961,,Py_buffer} *@w{ }
@end display



@tab

void

@item

@ref{550b,,inquiry}

@tab

@ref{5df,,PyObject} *

@tab

int

@item

@ref{551b,,unaryfunc}

@tab


@display
@ref{5df,,PyObject} *@w{ }
@end display



@tab

@ref{5df,,PyObject} *

@item

@ref{5500,,binaryfunc}

@tab


@display
@ref{5df,,PyObject} *@w{ }
@ref{5df,,PyObject} *@w{ }
@end display



@tab

@ref{5df,,PyObject} *

@item

@ref{5519,,ternaryfunc}

@tab


@display
@ref{5df,,PyObject} *@w{ }
@ref{5df,,PyObject} *@w{ }
@ref{5df,,PyObject} *@w{ }
@end display



@tab

@ref{5df,,PyObject} *

@item

@ref{5517,,ssizeargfunc}

@tab


@display
@ref{5df,,PyObject} *@w{ }
@ref{c5b,,Py_ssize_t}@w{ }
@end display



@tab

@ref{5df,,PyObject} *

@item

@ref{5518,,ssizeobjargproc}

@tab


@display
@ref{5df,,PyObject} *@w{ }
@ref{c5b,,Py_ssize_t}@w{ }
@ref{5df,,PyObject} *@w{ }
@end display



@tab

int

@item

@ref{5510,,objobjproc}

@tab


@display
@ref{5df,,PyObject} *@w{ }
@ref{5df,,PyObject} *@w{ }
@end display



@tab

int

@item

@ref{550f,,objobjargproc}

@tab


@display
@ref{5df,,PyObject} *@w{ }
@ref{5df,,PyObject} *@w{ }
@ref{5df,,PyObject} *@w{ }
@end display



@tab

int

@end multitable


See @ref{59b8,,Slot Type typedefs} below for more detail.

@node PyTypeObject Definition,PyObject Slots,Quick Reference,Type Object Structures
@anchor{c-api/typeobj pytypeobject-definition}@anchor{59b9}
@subsubsection PyTypeObject Definition


The structure definition for @ref{ca2,,PyTypeObject} can be found in
@code{Include/cpython/object.h}.  For convenience of reference, this repeats the
definition found there:

@c XXX Drop this?

@example
typedef struct _typeobject @{
    PyObject_VAR_HEAD
    const char *tp_name; /* For printing, in format "<module>.<name>" */
    Py_ssize_t tp_basicsize, tp_itemsize; /* For allocation */

    /* Methods to implement standard operations */

    destructor tp_dealloc;
    Py_ssize_t tp_vectorcall_offset;
    getattrfunc tp_getattr;
    setattrfunc tp_setattr;
    PyAsyncMethods *tp_as_async; /* formerly known as tp_compare (Python 2)
                                    or tp_reserved (Python 3) */
    reprfunc tp_repr;

    /* Method suites for standard classes */

    PyNumberMethods *tp_as_number;
    PySequenceMethods *tp_as_sequence;
    PyMappingMethods *tp_as_mapping;

    /* More standard operations (here for binary compatibility) */

    hashfunc tp_hash;
    ternaryfunc tp_call;
    reprfunc tp_str;
    getattrofunc tp_getattro;
    setattrofunc tp_setattro;

    /* Functions to access object as input/output buffer */
    PyBufferProcs *tp_as_buffer;

    /* Flags to define presence of optional/expanded features */
    unsigned long tp_flags;

    const char *tp_doc; /* Documentation string */

    /* Assigned meaning in release 2.0 */
    /* call function for all accessible objects */
    traverseproc tp_traverse;

    /* delete references to contained objects */
    inquiry tp_clear;

    /* Assigned meaning in release 2.1 */
    /* rich comparisons */
    richcmpfunc tp_richcompare;

    /* weak reference enabler */
    Py_ssize_t tp_weaklistoffset;

    /* Iterators */
    getiterfunc tp_iter;
    iternextfunc tp_iternext;

    /* Attribute descriptor and subclassing stuff */
    PyMethodDef *tp_methods;
    PyMemberDef *tp_members;
    PyGetSetDef *tp_getset;
    // Strong reference on a heap type, borrowed reference on a static type
    PyTypeObject *tp_base;
    PyObject *tp_dict;
    descrgetfunc tp_descr_get;
    descrsetfunc tp_descr_set;
    Py_ssize_t tp_dictoffset;
    initproc tp_init;
    allocfunc tp_alloc;
    newfunc tp_new;
    freefunc tp_free; /* Low-level free-memory routine */
    inquiry tp_is_gc; /* For PyObject_IS_GC */
    PyObject *tp_bases;
    PyObject *tp_mro; /* method resolution order */
    PyObject *tp_cache; /* no longer used */
    void *tp_subclasses;  /* for static builtin types this is an index */
    PyObject *tp_weaklist; /* not used for static builtin types */
    destructor tp_del;

    /* Type attribute cache version tag. Added in version 2.6.
     * If zero, the cache is invalid and must be initialized.
     */
    unsigned int tp_version_tag;

    destructor tp_finalize;
    vectorcallfunc tp_vectorcall;

    /* bitset of which type-watchers care about this type */
    unsigned char tp_watched;

    /* Number of tp_version_tag values used.
     * Set to _Py_ATTR_CACHE_UNUSED if the attribute cache is
     * disabled for this type (e.g. due to custom MRO entries).
     * Otherwise, limited to MAX_VERSIONS_PER_CLASS (defined elsewhere).
     */
    uint16_t tp_versions_used;
@} PyTypeObject;
@end example

@node PyObject Slots,PyVarObject Slots,PyTypeObject Definition,Type Object Structures
@anchor{c-api/typeobj pyobject-slots}@anchor{59ba}
@subsubsection PyObject Slots


The type object structure extends the @ref{4a36,,PyVarObject} structure. The
@ref{547c,,ob_size} field is used for dynamic types (created by @code{type_new()},
usually called from a class statement). Note that @ref{770,,PyType_Type} (the
metatype) initializes @ref{2402,,tp_itemsize}, which means that its instances (i.e.
type objects) `must' have the @code{ob_size} field.

@ref{aa5,,PyObject.ob_refcnt}

@quotation

The type object’s reference count is initialized to @code{1} by the
@code{PyObject_HEAD_INIT} macro.  Note that for @ref{988,,statically allocated type objects}, the type’s instances (objects whose @ref{522d,,ob_type}
points back to the type) do `not' count as references.  But for
@ref{b64,,dynamically allocated type objects}, the instances `do'
count as references.

`Inheritance:'

This field is not inherited by subtypes.
@end quotation

@ref{522d,,PyObject.ob_type}

@quotation

This is the type’s type, in other words its metatype.  It is initialized by the
argument to the @code{PyObject_HEAD_INIT} macro, and its value should normally be
@code{&PyType_Type}.  However, for dynamically loadable extension modules that must
be usable on Windows (at least), the compiler complains that this is not a valid
initializer.  Therefore, the convention is to pass @code{NULL} to the
@code{PyObject_HEAD_INIT} macro and to initialize this field explicitly at the
start of the module’s initialization function, before doing anything else.  This
is typically done like this:

@example
Foo_Type.ob_type = &PyType_Type;
@end example

This should be done before any instances of the type are created.
@ref{985,,PyType_Ready()} checks if @ref{522d,,ob_type} is @code{NULL}, and if so,
initializes it to the @code{ob_type} field of the base class.
@code{PyType_Ready()} will not change this field if it is non-zero.

`Inheritance:'

This field is inherited by subtypes.
@end quotation

@node PyVarObject Slots,PyTypeObject Slots,PyObject Slots,Type Object Structures
@anchor{c-api/typeobj pyvarobject-slots}@anchor{59bb}
@subsubsection PyVarObject Slots


@ref{547c,,PyVarObject.ob_size}

@quotation

For @ref{988,,statically allocated type objects}, this should be
initialized to zero. For @ref{b64,,dynamically allocated type objects}, this field has a special internal meaning.

This field should be accessed using the @ref{98a,,Py_SIZE()} macro.

`Inheritance:'

This field is not inherited by subtypes.
@end quotation

@node PyTypeObject Slots,Static Types,PyVarObject Slots,Type Object Structures
@anchor{c-api/typeobj pytypeobject-slots}@anchor{59bc}
@subsubsection PyTypeObject Slots


Each slot has a section describing inheritance.  If @ref{985,,PyType_Ready()}
may set a value when the field is set to @code{NULL} then there will also be
a “Default” section.  (Note that many fields set on @ref{52d5,,PyBaseObject_Type}
and @ref{770,,PyType_Type} effectively act as defaults.)

@geindex PyTypeObject.tp_name (C member)
@anchor{c-api/typeobj c PyTypeObject tp_name}@anchor{1cf1}
@deffn {C Member} const char *@ref{ca2,,PyTypeObject}.tp_name

Pointer to a NUL-terminated string containing the name of the type. For types
that are accessible as module globals, the string should be the full module
name, followed by a dot, followed by the type name; for built-in types, it
should be just the type name.  If the module is a submodule of a package, the
full package name is part of the full module name.  For example, a type named
@code{T} defined in module @code{M} in subpackage @code{Q} in package @code{P}
should have the @ref{1cf1,,tp_name} initializer @code{"P.Q.M.T"}.

For @ref{b64,,dynamically allocated type objects},
this should just be the type name, and
the module name explicitly stored in the type dict as the value for key
@code{'__module__'}.

For @ref{988,,statically allocated type objects},
the `tp_name' field should contain a dot.
Everything before the last dot is made accessible as the @ref{617,,__module__}
attribute, and everything after the last dot is made accessible as the
@ref{16b7,,__name__} attribute.

If no dot is present, the entire @ref{1cf1,,tp_name} field is made accessible as the
@ref{16b7,,__name__} attribute, and the @ref{617,,__module__} attribute is undefined
(unless explicitly set in the dictionary, as explained above).  This means your
type will be impossible to pickle.  Additionally, it will not be listed in
module documentations created with pydoc.

This field must not be @code{NULL}.  It is the only required field
in @ref{ca2,,PyTypeObject()} (other than potentially
@ref{2402,,tp_itemsize}).

`Inheritance:'

This field is not inherited by subtypes.
@end deffn

@geindex PyTypeObject.tp_basicsize (C member)
@geindex PyTypeObject.tp_itemsize (C member)
@anchor{c-api/typeobj c PyTypeObject tp_basicsize}@anchor{b84}
@deffn {C Member} @ref{c5b,,Py_ssize_t} @ref{ca2,,PyTypeObject}.tp_basicsize
@anchor{c-api/typeobj c PyTypeObject tp_itemsize}@anchor{2402}
@deffnx {C Member} @ref{c5b,,Py_ssize_t} @ref{ca2,,PyTypeObject}.tp_itemsize

These fields allow calculating the size in bytes of instances of the type.

There are two kinds of types: types with fixed-length instances have a zero
@code{tp_itemsize} field, types with variable-length instances have a non-zero
@code{tp_itemsize} field.  For a type with fixed-length instances, all
instances have the same size, given in @code{tp_basicsize}.
(Exceptions to this rule can be made using
@ref{1aef,,PyUnstable_Object_GC_NewWithExtraData()}.)

For a type with variable-length instances, the instances must have an
@ref{547c,,ob_size} field, and the instance size is
@code{tp_basicsize} plus N times @code{tp_itemsize},
where N is the “length” of the object.

Functions like @ref{b83,,PyObject_NewVar()} will take the value of N as an
argument, and store in the instance’s @ref{547c,,ob_size} field.
Note that the @code{ob_size} field may later be used for
other purposes. For example, @ref{19c,,int} instances use the bits of
@code{ob_size} in an implementation-defined
way; the underlying storage and its size should be accessed using
@ref{3a6,,PyLong_Export()}.

@cartouche
@quotation Note 
The @ref{547c,,ob_size} field should be accessed using
the @ref{98a,,Py_SIZE()} and @ref{98b,,Py_SET_SIZE()} macros.
@end quotation
@end cartouche

Also, the presence of an @ref{547c,,ob_size} field in the
instance layout doesn’t mean that the instance structure is variable-length.
For example, the @ref{24f,,list} type has fixed-length instances, yet those
instances have a @code{ob_size} field.
(As with @ref{19c,,int}, avoid reading lists’ @code{ob_size} directly.
Call @ref{1626,,PyList_Size()} instead.)

The @code{tp_basicsize} includes size needed for data of the type’s
@ref{23b9,,tp_base}, plus any extra data needed
by each instance.

The  correct way to set @code{tp_basicsize} is to use the
@code{sizeof} operator on the struct used to declare the instance layout.
This struct must include the struct used to declare the base type.
In other words, @code{tp_basicsize} must be greater than or equal
to the base’s @code{tp_basicsize}.

Since every type is a subtype of @ref{c84,,object}, this struct must
include @ref{5df,,PyObject} or @ref{4a36,,PyVarObject} (depending on
whether @ref{547c,,ob_size} should be included). These are
usually defined by the macro @ref{14e9,,PyObject_HEAD} or
@ref{5958,,PyObject_VAR_HEAD}, respectively.

The basic size does not include the GC header size, as that header is not
part of @ref{14e9,,PyObject_HEAD}.

For cases where struct used to declare the base type is unknown,
see @ref{76b,,PyType_Spec.basicsize} and @ref{773,,PyType_FromMetaclass()}.

Notes about alignment:


@itemize -

@item 
@code{tp_basicsize} must be a multiple of @code{_Alignof(PyObject)}.
When using @code{sizeof} on a @code{struct} that includes
@ref{14e9,,PyObject_HEAD}, as recommended, the compiler ensures this.
When not using a C @code{struct}, or when using compiler
extensions like @code{__attribute__((packed))}, it is up to you.

@item 
If the variable items require a particular alignment,
@code{tp_basicsize} and @code{tp_itemsize} must each be a
multiple of that alignment.
For example, if a type’s variable part stores a @code{double}, it is
your responsibility that both fields are a multiple of
@code{_Alignof(double)}.
@end itemize

`Inheritance:'

These fields are inherited separately by subtypes.
(That is, if the field is set to zero, @ref{985,,PyType_Ready()} will copy
the value from the base type, indicating that the instances do not
need additional storage.)

If the base type has a non-zero @ref{2402,,tp_itemsize}, it is generally not safe to set
@code{tp_itemsize} to a different non-zero value in a subtype (though this
depends on the implementation of the base type).
@end deffn

@geindex PyTypeObject.tp_dealloc (C member)
@anchor{c-api/typeobj c PyTypeObject tp_dealloc}@anchor{521c}
@deffn {C Member} @ref{5503,,destructor} @ref{ca2,,PyTypeObject}.tp_dealloc

` The corresponding @ref{543c,,slot ID} @code{Py_tp_dealloc} is part of the @ref{776,,Stable ABI}.'
@geindex Py_tp_dealloc (C macro)
@anchor{c-api/typeobj c Py_tp_dealloc}@anchor{54e6}

A pointer to the instance destructor function.  The function signature is:

@example
void tp_dealloc(PyObject *self);
@end example

The destructor function should remove all references which the instance owns
(e.g., call @ref{799,,Py_CLEAR()}), free all memory buffers owned by the
instance, and call the type’s @ref{522f,,tp_free} function to
free the object itself.

If you may call functions that may set the error indicator, you must use
@ref{427,,PyErr_GetRaisedException()} and @ref{42a,,PyErr_SetRaisedException()}
to ensure you don’t clobber a preexisting error indicator (the deallocation
could have occurred while processing a different error):

@example
static void
foo_dealloc(foo_object *self)
@{
    PyObject *et, *ev, *etb;
    PyObject *exc = PyErr_GetRaisedException();
    ...
    PyErr_SetRaisedException(exc);
@}
@end example

The dealloc handler itself must not raise an exception; if it hits an error
case it should call @ref{5f1,,PyErr_FormatUnraisable()} to log (and clear) an
unraisable exception.

No guarantees are made about when an object is destroyed, except:


@itemize *

@item 
Python will destroy an object immediately or some time after the final
reference to the object is deleted, unless its finalizer
(@ref{ca3,,tp_finalize}) subsequently resurrects the
object.

@item 
An object will not be destroyed while it is being automatically finalized
(@ref{ca3,,tp_finalize}) or automatically cleared
(@ref{5242,,tp_clear}).
@end itemize

CPython currently destroys an object immediately from @ref{791,,Py_DECREF()}
when the new reference count is zero, but this may change in a future
version.

It is recommended to call @ref{594e,,PyObject_CallFinalizerFromDealloc()} at the
beginning of @code{tp_dealloc} to guarantee that the object is always
finalized before destruction.

If the type supports garbage collection (the @ref{986,,Py_TPFLAGS_HAVE_GC}
flag is set), the destructor should call @ref{1711,,PyObject_GC_UnTrack()}
before clearing any member fields.

It is permissible to call @ref{5242,,tp_clear} from
@code{tp_dealloc} to reduce code duplication and to guarantee that the
object is always cleared before destruction.  Beware that
@code{tp_clear} might have already been called.

If the type is heap allocated (@ref{ab2,,Py_TPFLAGS_HEAPTYPE}), the
deallocator should release the owned reference to its type object (via
@ref{791,,Py_DECREF()}) after calling the type deallocator.  See the example
code below.:

@example
static void
foo_dealloc(PyObject *op)
@{
   foo_object *self = (foo_object *) op;
   PyObject_GC_UnTrack(self);
   Py_CLEAR(self->ref);
   Py_TYPE(self)->tp_free(self);
@}
@end example

@code{tp_dealloc} must leave the exception status unchanged.  If it
needs to call something that might raise an exception, the exception state
must be backed up first and restored later (after logging any exceptions
with @ref{5f2,,PyErr_WriteUnraisable()}).

Example:

@example
static void
foo_dealloc(PyObject *self)
@{
    PyObject *exc = PyErr_GetRaisedException();

    if (PyObject_CallFinalizerFromDealloc(self) < 0) @{
        // self was resurrected.
        goto done;
    @}

    PyTypeObject *tp = Py_TYPE(self);

    if (tp->tp_flags & Py_TPFLAGS_HAVE_GC) @{
        PyObject_GC_UnTrack(self);
    @}

    // Optional, but convenient to avoid code duplication.
    if (tp->tp_clear && tp->tp_clear(self) < 0) @{
        PyErr_WriteUnraisable(self);
    @}

    // Any additional destruction goes here.

    tp->tp_free(self);
    self = NULL;  // In case PyErr_WriteUnraisable() is called below.

    if (tp->tp_flags & Py_TPFLAGS_HEAPTYPE) @{
        Py_CLEAR(tp);
    @}

done:
    // Optional, if something was called that might have raised an
    // exception.
    if (PyErr_Occurred()) @{
        PyErr_WriteUnraisable(self);
    @}
    PyErr_SetRaisedException(exc);
@}
@end example

@code{tp_dealloc} may be called from
any Python thread, not just the thread which created the object (if the
object becomes part of a refcount cycle, that cycle might be collected by
a garbage collection on any thread).  This is not a problem for Python
API calls, since the thread on which @code{tp_dealloc} is called
with an @ref{5231,,attached thread state}.  However, if the object being
destroyed in turn destroys objects from some other C library, care
should be taken to ensure that destroying those objects on the thread
which called @code{tp_dealloc} will not violate any assumptions of
the library.

`Inheritance:'

This field is inherited by subtypes.


@subsubheading See also


@ref{594a,,Object Life Cycle} for details about how this slot relates to other slots.

@end deffn

@geindex PyTypeObject.tp_vectorcall_offset (C member)
@anchor{c-api/typeobj c PyTypeObject tp_vectorcall_offset}@anchor{55f6}
@deffn {C Member} @ref{c5b,,Py_ssize_t} @ref{ca2,,PyTypeObject}.tp_vectorcall_offset

An optional offset to a per-instance function that implements calling
the object using the @ref{775,,vectorcall protocol},
a more efficient alternative
of the simpler @ref{77c,,tp_call}.

This field is only used if the flag @ref{777,,Py_TPFLAGS_HAVE_VECTORCALL}
is set. If so, this must be a positive integer containing the offset in the
instance of a @ref{77a,,vectorcallfunc} pointer.

The `vectorcallfunc' pointer may be @code{NULL}, in which case the instance behaves
as if @ref{777,,Py_TPFLAGS_HAVE_VECTORCALL} was not set: calling the instance
falls back to @ref{77c,,tp_call}.

Any class that sets @code{Py_TPFLAGS_HAVE_VECTORCALL} must also set
@ref{77c,,tp_call} and make sure its behaviour is consistent
with the `vectorcallfunc' function.
This can be done by setting `tp_call' to @ref{779,,PyVectorcall_Call()}.


Changed in version 3.8: Before version 3.8, this slot was named @code{tp_print}.
In Python 2.x, it was used for printing to a file.
In Python 3.0 to 3.7, it was unused.



Changed in version 3.12: Before version 3.12, it was not recommended for
@ref{b64,,mutable heap types} to implement the vectorcall
protocol.
When a user sets @ref{77b,,__call__} in Python code, only `tp_call' is
updated, likely making it inconsistent with the vectorcall function.
Since 3.12, setting @code{__call__} will disable vectorcall optimization
by clearing the @ref{777,,Py_TPFLAGS_HAVE_VECTORCALL} flag.


`Inheritance:'

This field is always inherited.
However, the @ref{777,,Py_TPFLAGS_HAVE_VECTORCALL} flag is not
always inherited. If it’s not set, then the subclass won’t use
@ref{775,,vectorcall}, except when
@ref{779,,PyVectorcall_Call()} is explicitly called.
@end deffn

@geindex PyTypeObject.tp_getattr (C member)
@anchor{c-api/typeobj c PyTypeObject tp_getattr}@anchor{524d}
@deffn {C Member} @ref{5504,,getattrfunc} @ref{ca2,,PyTypeObject}.tp_getattr

` The corresponding @ref{543c,,slot ID} @code{Py_tp_getattr} is part of the @ref{776,,Stable ABI}.'
@geindex Py_tp_getattr (C macro)
@anchor{c-api/typeobj c Py_tp_getattr}@anchor{54ed}

An optional pointer to the get-attribute-string function.

This field is deprecated.  When it is defined, it should point to a function
that acts the same as the @ref{1aaa,,tp_getattro} function, but taking a C string
instead of a Python string object to give the attribute name.

`Inheritance:'

Group: @ref{524d,,tp_getattr}, @ref{1aaa,,tp_getattro}

This field is inherited by subtypes together with @ref{1aaa,,tp_getattro}: a subtype
inherits both @ref{524d,,tp_getattr} and @code{tp_getattro} from its base type when
the subtype’s @code{tp_getattr} and @code{tp_getattro} are both @code{NULL}.
@end deffn

@geindex PyTypeObject.tp_setattr (C member)
@anchor{c-api/typeobj c PyTypeObject tp_setattr}@anchor{524e}
@deffn {C Member} @ref{5514,,setattrfunc} @ref{ca2,,PyTypeObject}.tp_setattr

` The corresponding @ref{543c,,slot ID} @code{Py_tp_setattr} is part of the @ref{776,,Stable ABI}.'
@geindex Py_tp_setattr (C macro)
@anchor{c-api/typeobj c Py_tp_setattr}@anchor{54fa}

An optional pointer to the function for setting and deleting attributes.

This field is deprecated.  When it is defined, it should point to a function
that acts the same as the @ref{5248,,tp_setattro} function, but taking a C string
instead of a Python string object to give the attribute name.

`Inheritance:'

Group: @ref{524e,,tp_setattr}, @ref{5248,,tp_setattro}

This field is inherited by subtypes together with @ref{5248,,tp_setattro}: a subtype
inherits both @ref{524e,,tp_setattr} and @code{tp_setattro} from its base type when
the subtype’s @code{tp_setattr} and @code{tp_setattro} are both @code{NULL}.
@end deffn

@geindex PyTypeObject.tp_as_async (C member)
@anchor{c-api/typeobj c PyTypeObject tp_as_async}@anchor{10d5}
@deffn {C Member} @ref{564a,,PyAsyncMethods} *@ref{ca2,,PyTypeObject}.tp_as_async

Pointer to an additional structure that contains fields relevant only to
objects which implement @ref{4ca,,awaitable} and @ref{4c8,,asynchronous iterator}
protocols at the C-level.  See @ref{59bd,,Async Object Structures} for details.


Added in version 3.5: Formerly known as @code{tp_compare} and @code{tp_reserved}.


`Inheritance:'

The @ref{10d5,,tp_as_async} field is not inherited,
but the contained fields are inherited individually.
@end deffn

@geindex PyTypeObject.tp_repr (C member)
@anchor{c-api/typeobj c PyTypeObject tp_repr}@anchor{5244}
@deffn {C Member} @ref{5512,,reprfunc} @ref{ca2,,PyTypeObject}.tp_repr

` The corresponding @ref{543c,,slot ID} @code{Py_tp_repr} is part of the @ref{776,,Stable ABI}.'
@geindex Py_tp_repr (C macro)
@anchor{c-api/typeobj c Py_tp_repr}@anchor{54f8}

@geindex built-in function; repr

An optional pointer to a function that implements the built-in function
@ref{1c3,,repr()}.

The signature is the same as for @ref{1235,,PyObject_Repr()}:

@example
PyObject *tp_repr(PyObject *self);
@end example

The function must return a string or a Unicode object.  Ideally,
this function should return a string that, when passed to
@ref{4a4,,eval()}, given a suitable environment, returns an object with the
same value.  If this is not feasible, it should return a string starting with
@code{'<'} and ending with @code{'>'} from which both the type and the value of the
object can be deduced.

`Inheritance:'

This field is inherited by subtypes.

`Default:'

When this field is not set, a string of the form @code{<%s object at %p>} is
returned, where @code{%s} is replaced by the type name, and @code{%p} by the object’s
memory address.
@end deffn

@geindex PyTypeObject.tp_as_number (C member)
@anchor{c-api/typeobj c PyTypeObject tp_as_number}@anchor{b88}
@deffn {C Member} @ref{162a,,PyNumberMethods} *@ref{ca2,,PyTypeObject}.tp_as_number

Pointer to an additional structure that contains fields relevant only to
objects which implement the number protocol.  These fields are documented in
@ref{59be,,Number Object Structures}.

`Inheritance:'

The @ref{b88,,tp_as_number} field is not inherited, but the contained fields are
inherited individually.
@end deffn

@geindex PyTypeObject.tp_as_sequence (C member)
@anchor{c-api/typeobj c PyTypeObject tp_as_sequence}@anchor{597f}
@deffn {C Member} @ref{5254,,PySequenceMethods} *@ref{ca2,,PyTypeObject}.tp_as_sequence

Pointer to an additional structure that contains fields relevant only to
objects which implement the sequence protocol.  These fields are documented
in @ref{59bf,,Sequence Object Structures}.

`Inheritance:'

The @ref{597f,,tp_as_sequence} field is not inherited, but the contained fields
are inherited individually.
@end deffn

@geindex PyTypeObject.tp_as_mapping (C member)
@anchor{c-api/typeobj c PyTypeObject tp_as_mapping}@anchor{5980}
@deffn {C Member} @ref{5255,,PyMappingMethods} *@ref{ca2,,PyTypeObject}.tp_as_mapping

Pointer to an additional structure that contains fields relevant only to
objects which implement the mapping protocol.  These fields are documented in
@ref{59c0,,Mapping Object Structures}.

`Inheritance:'

The @ref{5980,,tp_as_mapping} field is not inherited, but the contained fields
are inherited individually.
@end deffn

@geindex PyTypeObject.tp_hash (C member)
@anchor{c-api/typeobj c PyTypeObject tp_hash}@anchor{5256}
@deffn {C Member} @ref{5509,,hashfunc} @ref{ca2,,PyTypeObject}.tp_hash

` The corresponding @ref{543c,,slot ID} @code{Py_tp_hash} is part of the @ref{776,,Stable ABI}.'
@geindex Py_tp_hash (C macro)
@anchor{c-api/typeobj c Py_tp_hash}@anchor{54f0}

@geindex built-in function; hash

An optional pointer to a function that implements the built-in function
@ref{802,,hash()}.

The signature is the same as for @ref{434,,PyObject_Hash()}:

@example
Py_hash_t tp_hash(PyObject *);
@end example

The value @code{-1} should not be returned as a
normal return value; when an error occurs during the computation of the hash
value, the function should set an exception and return @code{-1}.

When this field is not set (`and' @ref{5250,,tp_richcompare} is not set),
an attempt to take the hash of the object raises @ref{199,,TypeError}.
This is the same as setting it to @ref{15d2,,PyObject_HashNotImplemented()}.

This field can be set explicitly to @ref{15d2,,PyObject_HashNotImplemented()} to
block inheritance of the hash method from a parent type. This is interpreted
as the equivalent of @code{__hash__ = None} at the Python level, causing
@code{isinstance(o, collections.Hashable)} to correctly return @code{False}. Note
that the converse is also true - setting @code{__hash__ = None} on a class at
the Python level will result in the @code{tp_hash} slot being set to
@code{PyObject_HashNotImplemented()}.

`Inheritance:'

Group: @ref{5256,,tp_hash}, @ref{5250,,tp_richcompare}

This field is inherited by subtypes together with
@ref{5250,,tp_richcompare}: a subtype inherits both of
@code{tp_richcompare} and @ref{5256,,tp_hash}, when the subtype’s
@code{tp_richcompare} and @code{tp_hash} are both @code{NULL}.

`Default:'

@ref{52d5,,PyBaseObject_Type} uses @ref{60c,,PyObject_GenericHash()}.
@end deffn

@geindex PyTypeObject.tp_call (C member)
@anchor{c-api/typeobj c PyTypeObject tp_call}@anchor{77c}
@deffn {C Member} @ref{5519,,ternaryfunc} @ref{ca2,,PyTypeObject}.tp_call

` The corresponding @ref{543c,,slot ID} @code{Py_tp_call} is part of the @ref{776,,Stable ABI}.'
@geindex Py_tp_call (C macro)
@anchor{c-api/typeobj c Py_tp_call}@anchor{54e4}

An optional pointer to a function that implements calling the object.  This
should be @code{NULL} if the object is not callable.  The signature is the same as
for @ref{63d,,PyObject_Call()}:

@example
PyObject *tp_call(PyObject *self, PyObject *args, PyObject *kwargs);
@end example

`Inheritance:'

This field is inherited by subtypes.
@end deffn

@geindex PyTypeObject.tp_str (C member)
@anchor{c-api/typeobj c PyTypeObject tp_str}@anchor{5245}
@deffn {C Member} @ref{5512,,reprfunc} @ref{ca2,,PyTypeObject}.tp_str

` The corresponding @ref{543c,,slot ID} @code{Py_tp_str} is part of the @ref{776,,Stable ABI}.'
@geindex Py_tp_str (C macro)
@anchor{c-api/typeobj c Py_tp_str}@anchor{54fc}

An optional pointer to a function that implements the built-in operation
@ref{16a,,str()}.  (Note that @ref{16a,,str} is a type now, and @code{str()} calls the
constructor for that type.  This constructor calls @ref{1236,,PyObject_Str()} to do
the actual work, and @code{PyObject_Str()} will call this handler.)

The signature is the same as for @ref{1236,,PyObject_Str()}:

@example
PyObject *tp_str(PyObject *self);
@end example

The function must return a string or a Unicode object.  It should be a “friendly” string
representation of the object, as this is the representation that will be used,
among other things, by the @ref{117b,,print()} function.

`Inheritance:'

This field is inherited by subtypes.

`Default:'

When this field is not set, @ref{1235,,PyObject_Repr()} is called to return a string
representation.
@end deffn

@geindex PyTypeObject.tp_getattro (C member)
@anchor{c-api/typeobj c PyTypeObject tp_getattro}@anchor{1aaa}
@deffn {C Member} @ref{5505,,getattrofunc} @ref{ca2,,PyTypeObject}.tp_getattro

` The corresponding @ref{543c,,slot ID} @code{Py_tp_getattro} is part of the @ref{776,,Stable ABI}.'
@geindex Py_tp_getattro (C macro)
@anchor{c-api/typeobj c Py_tp_getattro}@anchor{54ee}

An optional pointer to the get-attribute function.

The signature is the same as for @ref{5ee,,PyObject_GetAttr()}:

@example
PyObject *tp_getattro(PyObject *self, PyObject *attr);
@end example

It is usually convenient to set this field to @ref{53ef,,PyObject_GenericGetAttr()},
which implements the normal way of looking for object attributes.

`Inheritance:'

Group: @ref{524d,,tp_getattr}, @ref{1aaa,,tp_getattro}

This field is inherited by subtypes together with @ref{524d,,tp_getattr}: a subtype
inherits both @code{tp_getattr} and @ref{1aaa,,tp_getattro} from its base type when
the subtype’s @code{tp_getattr} and @code{tp_getattro} are both @code{NULL}.

`Default:'

@ref{52d5,,PyBaseObject_Type} uses @ref{53ef,,PyObject_GenericGetAttr()}.
@end deffn

@geindex PyTypeObject.tp_setattro (C member)
@anchor{c-api/typeobj c PyTypeObject tp_setattro}@anchor{5248}
@deffn {C Member} @ref{5515,,setattrofunc} @ref{ca2,,PyTypeObject}.tp_setattro

` The corresponding @ref{543c,,slot ID} @code{Py_tp_setattro} is part of the @ref{776,,Stable ABI}.'
@geindex Py_tp_setattro (C macro)
@anchor{c-api/typeobj c Py_tp_setattro}@anchor{54fb}

An optional pointer to the function for setting and deleting attributes.

The signature is the same as for @ref{17a9,,PyObject_SetAttr()}:

@example
int tp_setattro(PyObject *self, PyObject *attr, PyObject *value);
@end example

In addition, setting `value' to @code{NULL} to delete an attribute must be
supported.  It is usually convenient to set this field to
@ref{53f0,,PyObject_GenericSetAttr()}, which implements the normal
way of setting object attributes.

`Inheritance:'

Group: @ref{524e,,tp_setattr}, @ref{5248,,tp_setattro}

This field is inherited by subtypes together with @ref{524e,,tp_setattr}: a subtype
inherits both @code{tp_setattr} and @ref{5248,,tp_setattro} from its base type when
the subtype’s @code{tp_setattr} and @code{tp_setattro} are both @code{NULL}.

`Default:'

@ref{52d5,,PyBaseObject_Type} uses @ref{53f0,,PyObject_GenericSetAttr()}.
@end deffn

@geindex PyTypeObject.tp_as_buffer (C member)
@anchor{c-api/typeobj c PyTypeObject tp_as_buffer}@anchor{b86}
@deffn {C Member} @ref{5651,,PyBufferProcs} *@ref{ca2,,PyTypeObject}.tp_as_buffer

Pointer to an additional structure that contains fields relevant only to objects
which implement the buffer interface.  These fields are documented in
@ref{5617,,Buffer Object Structures}.

`Inheritance:'

The @ref{b86,,tp_as_buffer} field is not inherited,
but the contained fields are inherited individually.
@end deffn

@geindex PyTypeObject.tp_flags (C member)
@anchor{c-api/typeobj c PyTypeObject tp_flags}@anchor{1cb4}
@deffn {C Member} unsigned long @ref{ca2,,PyTypeObject}.tp_flags

This field is a bit mask of various flags.  Some flags indicate variant
semantics for certain situations; others are used to indicate that certain
fields in the type object (or in the extension structures referenced via
@ref{b88,,tp_as_number}, @ref{597f,,tp_as_sequence}, @ref{5980,,tp_as_mapping}, and
@ref{b86,,tp_as_buffer}) that were historically not always present are valid; if
such a flag bit is clear, the type fields it guards must not be accessed and
must be considered to have a zero or @code{NULL} value instead.

`Inheritance:'

Inheritance of this field is complicated.  Most flag bits are inherited
individually, i.e. if the base type has a flag bit set, the subtype inherits
this flag bit.  The flag bits that pertain to extension structures are strictly
inherited if the extension structure is inherited, i.e. the base type’s value of
the flag bit is copied into the subtype together with a pointer to the extension
structure.  The @ref{986,,Py_TPFLAGS_HAVE_GC} flag bit is inherited together with
the @ref{987,,tp_traverse} and @ref{5242,,tp_clear} fields, i.e. if the
@code{Py_TPFLAGS_HAVE_GC} flag bit is clear in the subtype and the
@code{tp_traverse} and @code{tp_clear} fields in the subtype exist and have
@code{NULL} values.

@c XXX are most flag bits *really* inherited individually?

`Default:'

@ref{52d5,,PyBaseObject_Type} uses
@code{Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE}.

`Bit Masks:'

The following bit masks are currently defined; these can be ORed together using
the @code{|} operator to form the value of the @ref{1cb4,,tp_flags} field.  The macro
@ref{1d80,,PyType_HasFeature()} takes a type and a flags value, `tp' and `f', and
checks whether @code{tp->tp_flags & f} is non-zero.

@geindex Py_TPFLAGS_HEAPTYPE (C macro)
@anchor{c-api/typeobj c Py_TPFLAGS_HEAPTYPE}@anchor{ab2}
@deffn {C Macro} Py_TPFLAGS_HEAPTYPE

This bit is set when the type object itself is allocated on the heap, for
example, types created dynamically using @ref{79e,,PyType_FromSpec()}.  In this
case, the @ref{522d,,ob_type} field of its instances is considered a reference to
the type, and the type object is INCREF’ed when a new instance is created, and
DECREF’ed when an instance is destroyed (this does not apply to instances of
subtypes; only the type referenced by the instance’s ob_type gets INCREF’ed or
DECREF’ed). Heap types should also @ref{59c1,,support garbage collection}
as they can form a reference cycle with their own module object.

`Inheritance:'

???
@end deffn

@geindex Py_TPFLAGS_BASETYPE (C macro)
@anchor{c-api/typeobj c Py_TPFLAGS_BASETYPE}@anchor{5235}
@deffn {C Macro} Py_TPFLAGS_BASETYPE
` Part of the @ref{776,,Stable ABI}.'
This bit is set when the type can be used as the base type of another type.  If
this bit is clear, the type cannot be subtyped (similar to a “final” class in
Java).

`Inheritance:'

???
@end deffn

@geindex Py_TPFLAGS_READY (C macro)
@anchor{c-api/typeobj c Py_TPFLAGS_READY}@anchor{59c2}
@deffn {C Macro} Py_TPFLAGS_READY

This bit is set when the type object has been fully initialized by
@ref{985,,PyType_Ready()}.

`Inheritance:'

???
@end deffn

@geindex Py_TPFLAGS_READYING (C macro)
@anchor{c-api/typeobj c Py_TPFLAGS_READYING}@anchor{59c3}
@deffn {C Macro} Py_TPFLAGS_READYING

This bit is set while @ref{985,,PyType_Ready()} is in the process of initializing
the type object.

`Inheritance:'

???
@end deffn

@geindex Py_TPFLAGS_HAVE_GC (C macro)
@anchor{c-api/typeobj c Py_TPFLAGS_HAVE_GC}@anchor{986}
@deffn {C Macro} Py_TPFLAGS_HAVE_GC
` Part of the @ref{776,,Stable ABI}.'
This bit is set when the object supports garbage collection.  If this bit
is set, memory for new instances (see @ref{5230,,tp_alloc})
must be allocated using @ref{c9f,,PyObject_GC_New} or
@ref{c67,,PyType_GenericAlloc()} and deallocated (see
@ref{522f,,tp_free}) using @ref{170f,,PyObject_GC_Del()}.  More
information in section @ref{59c1,,Supporting Cyclic Garbage Collection}.

`Inheritance:'

Group: @ref{986,,Py_TPFLAGS_HAVE_GC}, @ref{987,,tp_traverse}, @ref{5242,,tp_clear}

The @ref{986,,Py_TPFLAGS_HAVE_GC} flag bit is inherited
together with the @ref{987,,tp_traverse} and @ref{5242,,tp_clear}
fields, i.e.  if the @code{Py_TPFLAGS_HAVE_GC} flag bit is
clear in the subtype and the @code{tp_traverse} and
@code{tp_clear} fields in the subtype exist and have @code{NULL}
values.
@end deffn

@geindex Py_TPFLAGS_DEFAULT (C macro)
@anchor{c-api/typeobj c Py_TPFLAGS_DEFAULT}@anchor{522a}
@deffn {C Macro} Py_TPFLAGS_DEFAULT
` Part of the @ref{776,,Stable ABI}.'
This is a bitmask of all the bits that pertain to the existence of certain
fields in the type object and its extension structures. Currently, it includes
the following bits: @ref{59c4,,Py_TPFLAGS_HAVE_STACKLESS_EXTENSION}.

`Inheritance:'

???
@end deffn

@geindex Py_TPFLAGS_METHOD_DESCRIPTOR (C macro)
@anchor{c-api/typeobj c Py_TPFLAGS_METHOD_DESCRIPTOR}@anchor{5498}
@deffn {C Macro} Py_TPFLAGS_METHOD_DESCRIPTOR
` Part of the @ref{776,,Stable ABI} since version 3.8.'
This bit indicates that objects behave like unbound methods.

If this flag is set for @code{type(meth)}, then:


@itemize -

@item 
@code{meth.__get__(obj, cls)(*args, **kwds)} (with @code{obj} not None)
must be equivalent to @code{meth(obj, *args, **kwds)}.

@item 
@code{meth.__get__(None, cls)(*args, **kwds)}
must be equivalent to @code{meth(*args, **kwds)}.
@end itemize

This flag enables an optimization for typical method calls like
@code{obj.meth()}: it avoids creating a temporary “bound method” object for
@code{obj.meth}.


Added in version 3.8.


`Inheritance:'

This flag is never inherited by types without the
@ref{3cd,,Py_TPFLAGS_IMMUTABLETYPE} flag set.  For extension types, it is
inherited whenever @ref{5981,,tp_descr_get} is inherited.
@end deffn

@geindex Py_TPFLAGS_MANAGED_DICT (C macro)
@anchor{c-api/typeobj c Py_TPFLAGS_MANAGED_DICT}@anchor{60f}
@deffn {C Macro} Py_TPFLAGS_MANAGED_DICT

This bit indicates that instances of the class have a @ref{77e,,__dict__}
attribute, and that the space for the dictionary is managed by the VM.

If this flag is set, @ref{986,,Py_TPFLAGS_HAVE_GC} should also be set.

The type traverse function must call @ref{60d,,PyObject_VisitManagedDict()}
and its clear function must call @ref{60e,,PyObject_ClearManagedDict()}.


Added in version 3.12.


`Inheritance:'

This flag is inherited unless the
@ref{564c,,tp_dictoffset} field is set in a superclass.
@end deffn

@geindex Py_TPFLAGS_MANAGED_WEAKREF (C macro)
@anchor{c-api/typeobj c Py_TPFLAGS_MANAGED_WEAKREF}@anchor{77d}
@deffn {C Macro} Py_TPFLAGS_MANAGED_WEAKREF

This bit indicates that instances of the class should be weakly
referenceable.


Added in version 3.12.


`Inheritance:'

This flag is inherited unless the
@ref{b85,,tp_weaklistoffset} field is set in a superclass.
@end deffn

@geindex Py_TPFLAGS_ITEMS_AT_END (C macro)
@anchor{c-api/typeobj c Py_TPFLAGS_ITEMS_AT_END}@anchor{76e}
@deffn {C Macro} Py_TPFLAGS_ITEMS_AT_END
` Part of the @ref{776,,Stable ABI} since version 3.12.'
Only usable with variable-size types, i.e. ones with non-zero
@ref{2402,,tp_itemsize}.

Indicates that the variable-sized portion of an instance of this type is
at the end of the instance’s memory area, at an offset of
@code{Py_TYPE(obj)->tp_basicsize} (which may be different in each
subclass).

When setting this flag, be sure that all superclasses either
use this memory layout, or are not variable-sized.
Python does not check this.


Added in version 3.12.


`Inheritance:'

This flag is inherited.
@end deffn

@c XXX Document more flags here?

@geindex Py_TPFLAGS_LONG_SUBCLASS (C macro)
@anchor{c-api/typeobj c Py_TPFLAGS_LONG_SUBCLASS}@anchor{563f}
@deffn {C Macro} Py_TPFLAGS_LONG_SUBCLASS
@end deffn

@geindex Py_TPFLAGS_LIST_SUBCLASS (C macro)
@anchor{c-api/typeobj c Py_TPFLAGS_LIST_SUBCLASS}@anchor{59c5}
@deffn {C Macro} Py_TPFLAGS_LIST_SUBCLASS
@end deffn

@geindex Py_TPFLAGS_TUPLE_SUBCLASS (C macro)
@anchor{c-api/typeobj c Py_TPFLAGS_TUPLE_SUBCLASS}@anchor{59c6}
@deffn {C Macro} Py_TPFLAGS_TUPLE_SUBCLASS
@end deffn

@geindex Py_TPFLAGS_BYTES_SUBCLASS (C macro)
@anchor{c-api/typeobj c Py_TPFLAGS_BYTES_SUBCLASS}@anchor{59c7}
@deffn {C Macro} Py_TPFLAGS_BYTES_SUBCLASS
@end deffn

@geindex Py_TPFLAGS_UNICODE_SUBCLASS (C macro)
@anchor{c-api/typeobj c Py_TPFLAGS_UNICODE_SUBCLASS}@anchor{59c8}
@deffn {C Macro} Py_TPFLAGS_UNICODE_SUBCLASS
@end deffn

@geindex Py_TPFLAGS_DICT_SUBCLASS (C macro)
@anchor{c-api/typeobj c Py_TPFLAGS_DICT_SUBCLASS}@anchor{59c9}
@deffn {C Macro} Py_TPFLAGS_DICT_SUBCLASS
@end deffn

@geindex Py_TPFLAGS_BASE_EXC_SUBCLASS (C macro)
@anchor{c-api/typeobj c Py_TPFLAGS_BASE_EXC_SUBCLASS}@anchor{59ca}
@deffn {C Macro} Py_TPFLAGS_BASE_EXC_SUBCLASS
@end deffn

@geindex Py_TPFLAGS_TYPE_SUBCLASS (C macro)
@anchor{c-api/typeobj c Py_TPFLAGS_TYPE_SUBCLASS}@anchor{59cb}
@deffn {C Macro} Py_TPFLAGS_TYPE_SUBCLASS

Functions such as @ref{565c,,PyLong_Check()} will call @ref{563e,,PyType_FastSubclass()}
with one of these flags to quickly determine if a type is a subclass
of a built-in type; such specific checks are faster than a generic
check, like @ref{10ac,,PyObject_IsInstance()}. Custom types that inherit
from built-ins should have their @ref{1cb4,,tp_flags}
set appropriately, or the code that interacts with such types
will behave differently depending on what kind of check is used.
@end deffn

@geindex Py_TPFLAGS_HAVE_FINALIZE (C macro)
@anchor{c-api/typeobj c Py_TPFLAGS_HAVE_FINALIZE}@anchor{425}
@deffn {C Macro} Py_TPFLAGS_HAVE_FINALIZE

This bit is set when the @ref{ca3,,tp_finalize} slot is present in the
type structure.


Added in version 3.4.



Deprecated since version 3.8: This flag isn’t necessary anymore, as the interpreter assumes the
@ref{ca3,,tp_finalize} slot is always present in the
type structure.

@end deffn

@geindex _Py_TPFLAGS_HAVE_VECTORCALL (C macro)

@geindex Py_TPFLAGS_HAVE_VECTORCALL (C macro)
@anchor{c-api/typeobj c _Py_TPFLAGS_HAVE_VECTORCALL}@anchor{59cc}@anchor{c-api/typeobj c Py_TPFLAGS_HAVE_VECTORCALL}@anchor{777}
@deffn {C Macro} Py_TPFLAGS_HAVE_VECTORCALL
` Part of the @ref{776,,Stable ABI} since version 3.12.'
This bit is set when the class implements
the @ref{775,,vectorcall protocol}.
See @ref{55f6,,tp_vectorcall_offset} for details.

`Inheritance:'

This bit is inherited if @ref{77c,,tp_call} is also
inherited.


Added in version 3.8: as @code{_Py_TPFLAGS_HAVE_VECTORCALL}



Changed in version 3.9.


Renamed to the current name, without the leading underscore.
The old provisional name is @ref{23f,,soft deprecated}.


Changed in version 3.12: This flag is now removed from a class when the class’s
@ref{77b,,__call__()} method is reassigned.

This flag can now be inherited by mutable classes.

@end deffn

@geindex Py_TPFLAGS_IMMUTABLETYPE (C macro)
@anchor{c-api/typeobj c Py_TPFLAGS_IMMUTABLETYPE}@anchor{3cd}
@deffn {C Macro} Py_TPFLAGS_IMMUTABLETYPE

This bit is set for type objects that are immutable: type attributes cannot be set nor deleted.

@ref{985,,PyType_Ready()} automatically applies this flag to
@ref{988,,static types}.

`Inheritance:'

This flag is not inherited.


Added in version 3.10.

@end deffn

@geindex Py_TPFLAGS_DISALLOW_INSTANTIATION (C macro)
@anchor{c-api/typeobj c Py_TPFLAGS_DISALLOW_INSTANTIATION}@anchor{7a3}
@deffn {C Macro} Py_TPFLAGS_DISALLOW_INSTANTIATION

Disallow creating instances of the type: set
@ref{7a0,,tp_new} to NULL and don’t create the @code{__new__}
key in the type dictionary.

The flag must be set before creating the type, not after. For example, it
must be set before @ref{985,,PyType_Ready()} is called on the type.

The flag is set automatically on @ref{988,,static types} if
@ref{23b9,,tp_base} is NULL or @code{&PyBaseObject_Type} and
@ref{7a0,,tp_new} is NULL.

`Inheritance:'

This flag is not inherited.
However, subclasses will not be instantiable unless they provide a
non-NULL @ref{7a0,,tp_new} (which is only possible
via the C API).

@cartouche
@quotation Note 
To disallow instantiating a class directly but allow instantiating
its subclasses (e.g. for an @ref{13c2,,abstract base class}),
do not use this flag.
Instead, make @ref{7a0,,tp_new} only succeed for
subclasses.
@end quotation
@end cartouche


Added in version 3.10.

@end deffn

@geindex Py_TPFLAGS_MAPPING (C macro)
@anchor{c-api/typeobj c Py_TPFLAGS_MAPPING}@anchor{1c9b}
@deffn {C Macro} Py_TPFLAGS_MAPPING

This bit indicates that instances of the class may match mapping patterns
when used as the subject of a @ref{a14,,match} block. It is automatically
set when registering or subclassing @ref{acd,,collections.abc.Mapping}, and
unset when registering @ref{13d0,,collections.abc.Sequence}.

@cartouche
@quotation Note 
@ref{1c9b,,Py_TPFLAGS_MAPPING} and @ref{1c9c,,Py_TPFLAGS_SEQUENCE} are
mutually exclusive; it is an error to enable both flags simultaneously.
@end quotation
@end cartouche

`Inheritance:'

This flag is inherited by types that do not already set
@ref{1c9c,,Py_TPFLAGS_SEQUENCE}.


@subsubheading See also


@geindex Python Enhancement Proposals; PEP 634
PEP 634@footnote{https://peps.python.org/pep-0634/} – Structural Pattern Matching: Specification



Added in version 3.10.

@end deffn

@geindex Py_TPFLAGS_SEQUENCE (C macro)
@anchor{c-api/typeobj c Py_TPFLAGS_SEQUENCE}@anchor{1c9c}
@deffn {C Macro} Py_TPFLAGS_SEQUENCE

This bit indicates that instances of the class may match sequence patterns
when used as the subject of a @ref{a14,,match} block. It is automatically
set when registering or subclassing @ref{13d0,,collections.abc.Sequence}, and
unset when registering @ref{acd,,collections.abc.Mapping}.

@cartouche
@quotation Note 
@ref{1c9b,,Py_TPFLAGS_MAPPING} and @ref{1c9c,,Py_TPFLAGS_SEQUENCE} are
mutually exclusive; it is an error to enable both flags simultaneously.
@end quotation
@end cartouche

`Inheritance:'

This flag is inherited by types that do not already set
@ref{1c9b,,Py_TPFLAGS_MAPPING}.


@subsubheading See also


@geindex Python Enhancement Proposals; PEP 634
PEP 634@footnote{https://peps.python.org/pep-0634/} – Structural Pattern Matching: Specification



Added in version 3.10.

@end deffn

@geindex Py_TPFLAGS_VALID_VERSION_TAG (C macro)
@anchor{c-api/typeobj c Py_TPFLAGS_VALID_VERSION_TAG}@anchor{59cd}
@deffn {C Macro} Py_TPFLAGS_VALID_VERSION_TAG

Internal. Do not set or unset this flag.
To indicate that a class has changed call @ref{1bbf,,PyType_Modified()}

@cartouche
@quotation Warning 
This flag is present in header files, but is not be used.
It will be removed in a future version of CPython
@end quotation
@end cartouche
@end deffn

@geindex Py_TPFLAGS_HAVE_VERSION_TAG (C macro)
@anchor{c-api/typeobj c Py_TPFLAGS_HAVE_VERSION_TAG}@anchor{15d6}
@deffn {C Macro} Py_TPFLAGS_HAVE_VERSION_TAG

This is a @ref{23f,,soft deprecated} macro that does nothing.
Historically, this would indicate that the
@ref{5985,,tp_version_tag} field was available and
initialized.
@end deffn

@geindex Py_TPFLAGS_INLINE_VALUES (C macro)
@anchor{c-api/typeobj c Py_TPFLAGS_INLINE_VALUES}@anchor{59ce}
@deffn {C Macro} Py_TPFLAGS_INLINE_VALUES

This bit indicates that instances of this type will have an “inline values”
array (containing the object’s attributes) placed directly after the end
of the object.

This requires that @ref{986,,Py_TPFLAGS_HAVE_GC} is set.

`Inheritance:'

This flag is not inherited.


Added in version 3.13.

@end deffn

@geindex Py_TPFLAGS_IS_ABSTRACT (C macro)
@anchor{c-api/typeobj c Py_TPFLAGS_IS_ABSTRACT}@anchor{59cf}
@deffn {C Macro} Py_TPFLAGS_IS_ABSTRACT

This bit indicates that this is an abstract type and therefore cannot
be instantiated.

`Inheritance:'

This flag is not inherited.


@subsubheading See also


@ref{4,,abc}

@end deffn

@geindex Py_TPFLAGS_HAVE_STACKLESS_EXTENSION (C macro)
@anchor{c-api/typeobj c Py_TPFLAGS_HAVE_STACKLESS_EXTENSION}@anchor{59c4}
@deffn {C Macro} Py_TPFLAGS_HAVE_STACKLESS_EXTENSION

Internal. Do not set or unset this flag.
Historically, this was a reserved flag for use in Stackless Python.

@cartouche
@quotation Warning 
This flag is present in header files, but is not be used.
This may be removed in a future version of CPython.
@end quotation
@end cartouche
@end deffn
@end deffn

@geindex PyTypeObject.tp_doc (C member)
@anchor{c-api/typeobj c PyTypeObject tp_doc}@anchor{522b}
@deffn {C Member} const char *@ref{ca2,,PyTypeObject}.tp_doc

` The corresponding @ref{543c,,slot ID} @code{Py_tp_doc} is part of the @ref{776,,Stable ABI}.'
@geindex Py_tp_doc (C macro)
@anchor{c-api/typeobj c Py_tp_doc}@anchor{54ea}

An optional pointer to a NUL-terminated C string giving the docstring for this
type object.  This is exposed as the @ref{20d9,,__doc__} attribute on the
type and instances of the type.

`Inheritance:'

This field is `not' inherited by subtypes.
@end deffn

@geindex PyTypeObject.tp_traverse (C member)
@anchor{c-api/typeobj c PyTypeObject tp_traverse}@anchor{987}
@deffn {C Member} @ref{551a,,traverseproc} @ref{ca2,,PyTypeObject}.tp_traverse

` The corresponding @ref{543c,,slot ID} @code{Py_tp_traverse} is part of the @ref{776,,Stable ABI}.'
@geindex Py_tp_traverse (C macro)
@anchor{c-api/typeobj c Py_tp_traverse}@anchor{54fd}

An optional pointer to a traversal function for the garbage collector.  This is
only used if the @ref{986,,Py_TPFLAGS_HAVE_GC} flag bit is set.  The signature is:

@example
int tp_traverse(PyObject *self, visitproc visit, void *arg);
@end example

More information about Python’s garbage collection scheme can be found
in section @ref{59c1,,Supporting Cyclic Garbage Collection}.

The @ref{987,,tp_traverse} pointer is used by the garbage collector to detect
reference cycles. A typical implementation of a @code{tp_traverse} function
simply calls @ref{5239,,Py_VISIT()} on each of the instance’s members that are Python
objects that the instance owns. For example, this is function @code{local_traverse()} from the
@code{_thread} extension module:

@example
static int
local_traverse(PyObject *op, visitproc visit, void *arg)
@{
    localobject *self = (localobject *) op;
    Py_VISIT(self->args);
    Py_VISIT(self->kw);
    Py_VISIT(self->dict);
    return 0;
@}
@end example

Note that @ref{5239,,Py_VISIT()} is called only on those members that can participate
in reference cycles.  Although there is also a @code{self->key} member, it can only
be @code{NULL} or a Python string and therefore cannot be part of a reference cycle.

On the other hand, even if you know a member can never be part of a cycle, as a
debugging aid you may want to visit it anyway just so the @ref{64,,gc} module’s
@ref{a0c,,get_referents()} function will include it.

Heap types (@ref{ab2,,Py_TPFLAGS_HEAPTYPE}) must visit their type with:

@example
Py_VISIT(Py_TYPE(self));
@end example

It is only needed since Python 3.9. To support Python 3.8 and older, this
line must be conditional:

@example
#if PY_VERSION_HEX >= 0x03090000
    Py_VISIT(Py_TYPE(self));
#endif
@end example

If the @ref{60f,,Py_TPFLAGS_MANAGED_DICT} bit is set in the
@ref{1cb4,,tp_flags} field, the traverse function must call
@ref{60d,,PyObject_VisitManagedDict()} like this:

@example
PyObject_VisitManagedDict((PyObject*)self, visit, arg);
@end example

@cartouche
@quotation Warning 
When implementing @ref{987,,tp_traverse}, only the
members that the instance `owns' (by having @ref{5e2,,strong references} to them) must be
visited. For instance, if an object supports weak references via the
@ref{5650,,tp_weaklist} slot, the pointer supporting
the linked list (what `tp_weaklist' points to) must `not' be
visited as the instance does not directly own the weak references to itself
(the weakreference list is there to support the weak reference machinery,
but the instance has no strong reference to the elements inside it, as they
are allowed to be removed even if the instance is still alive).
@end quotation
@end cartouche

@cartouche
@quotation Warning 
The traversal function must not have any side effects.  It must not
modify the reference counts of any Python objects nor create or destroy
any Python objects.
@end quotation
@end cartouche

Note that @ref{5239,,Py_VISIT()} requires the `visit' and `arg' parameters to
@code{local_traverse()} to have these specific names; don’t name them just
anything.

Instances of @ref{b64,,heap-allocated types} hold a reference to
their type. Their traversal function must therefore either visit
@ref{3c7,,Py_TYPE(self)}, or delegate this responsibility by
calling @code{tp_traverse} of another heap-allocated type (such as a
heap-allocated superclass).
If they do not, the type object may not be garbage-collected.

@cartouche
@quotation Note 
The @ref{987,,tp_traverse} function can be called from any
thread.
@end quotation
@end cartouche


Changed in version 3.9: Heap-allocated types are expected to visit @code{Py_TYPE(self)} in
@code{tp_traverse}.  In earlier versions of Python, due to
bug 40217@footnote{https://bugs.python.org/issue40217}, doing this
may lead to crashes in subclasses.


`Inheritance:'

Group: @ref{986,,Py_TPFLAGS_HAVE_GC}, @ref{987,,tp_traverse}, @ref{5242,,tp_clear}

This field is inherited by subtypes together with @ref{5242,,tp_clear} and the
@ref{986,,Py_TPFLAGS_HAVE_GC} flag bit: the flag bit, @ref{987,,tp_traverse}, and
@code{tp_clear} are all inherited from the base type if they are all zero in
the subtype.
@end deffn

@geindex PyTypeObject.tp_clear (C member)
@anchor{c-api/typeobj c PyTypeObject tp_clear}@anchor{5242}
@deffn {C Member} @ref{550b,,inquiry} @ref{ca2,,PyTypeObject}.tp_clear

` The corresponding @ref{543c,,slot ID} @code{Py_tp_clear} is part of the @ref{776,,Stable ABI}.'
@geindex Py_tp_clear (C macro)
@anchor{c-api/typeobj c Py_tp_clear}@anchor{54e5}

An optional pointer to a clear function.  The signature is:

@example
int tp_clear(PyObject *);
@end example

The purpose of this function is to break reference cycles that are causing a
@ref{594f,,cyclic isolate} so that the objects can be safely destroyed.  A
cleared object is a partially destroyed object; the object is not obligated
to satisfy design invariants held during normal use.

@code{tp_clear} does not need to delete references to objects that
can’t participate in reference cycles, such as Python strings or Python
integers.  However, it may be convenient to clear all references, and write
the type’s @ref{521c,,tp_dealloc} function to invoke
@code{tp_clear} to avoid code duplication.  (Beware that
@code{tp_clear} might have already been called. Prefer calling
idempotent functions like @ref{799,,Py_CLEAR()}.)

Any non-trivial cleanup should be performed in
@ref{ca3,,tp_finalize} instead of @code{tp_clear}.

@cartouche
@quotation Note 
If @code{tp_clear} fails to break a reference cycle then the
objects in the @ref{594f,,cyclic isolate} may remain indefinitely
uncollectable (“leak”).  See @ref{13cd,,gc.garbage}.
@end quotation
@end cartouche

@cartouche
@quotation Note 
Referents (direct and indirect) might have already been cleared; they are
not guaranteed to be in a consistent state.
@end quotation
@end cartouche

@cartouche
@quotation Note 
The @ref{5242,,tp_clear} function can be called from any
thread.
@end quotation
@end cartouche

@cartouche
@quotation Note 
An object is not guaranteed to be automatically cleared before its
destructor (@ref{521c,,tp_dealloc}) is called.
@end quotation
@end cartouche

This function differs from the destructor
(@ref{521c,,tp_dealloc}) in the following ways:


@itemize *

@item 
The purpose of clearing an object is to remove references to other objects
that might participate in a reference cycle.  The purpose of the
destructor, on the other hand, is a superset: it must release `all'
resources it owns, including references to objects that cannot participate
in a reference cycle (e.g., integers) as well as the object’s own memory
(by calling @ref{522f,,tp_free}).

@item 
When @code{tp_clear} is called, other objects might still hold
references to the object being cleared.  Because of this,
@code{tp_clear} must not deallocate the object’s own memory
(@ref{522f,,tp_free}).  The destructor, on the other hand,
is only called when no (strong) references exist, and as such, must
safely destroy the object itself by deallocating it.

@item 
@code{tp_clear} might never be automatically called.  An object’s
destructor, on the other hand, will be automatically called some time
after the object becomes unreachable (i.e., either there are no references
to the object or the object is a member of a @ref{594f,,cyclic isolate}).
@end itemize

No guarantees are made about when, if, or how often Python automatically
clears an object, except:


@itemize *

@item 
Python will not automatically clear an object if it is reachable, i.e.,
there is a reference to it and it is not a member of a @ref{594f,,cyclic isolate}.

@item 
Python will not automatically clear an object if it has not been
automatically finalized (see @ref{ca3,,tp_finalize}).  (If
the finalizer resurrected the object, the object may or may not be
automatically finalized again before it is cleared.)

@item 
If an object is a member of a @ref{594f,,cyclic isolate}, Python will not
automatically clear it if any member of the cyclic isolate has not yet
been automatically finalized (@ref{ca3,,tp_finalize}).

@item 
Python will not destroy an object until after any automatic calls to its
@code{tp_clear} function have returned.  This ensures that the act
of breaking a reference cycle does not invalidate the @code{self} pointer
while @code{tp_clear} is still executing.

@item 
Python will not automatically call @code{tp_clear} multiple times
concurrently.
@end itemize

CPython currently only automatically clears objects as needed to break
reference cycles in a @ref{594f,,cyclic isolate}, but future versions might
clear objects regularly before their destruction.

Taken together, all @ref{5242,,tp_clear} functions in the
system must combine to break all reference cycles.  This is subtle, and if
in any doubt supply a @code{tp_clear} function.  For
example, the tuple type does not implement a
@code{tp_clear} function, because it’s possible to prove
that no reference cycle can be composed entirely of tuples.  Therefore the
@code{tp_clear} functions of other types are responsible
for breaking any cycle containing a tuple.  This isn’t immediately obvious,
and there’s rarely a good reason to avoid implementing
@code{tp_clear}.

Implementations of @ref{5242,,tp_clear} should drop the instance’s references to
those of its members that may be Python objects, and set its pointers to those
members to @code{NULL}, as in the following example:

@example
static int
local_clear(PyObject *op)
@{
    localobject *self = (localobject *) op;
    Py_CLEAR(self->key);
    Py_CLEAR(self->args);
    Py_CLEAR(self->kw);
    Py_CLEAR(self->dict);
    return 0;
@}
@end example

The @ref{799,,Py_CLEAR()} macro should be used, because clearing references is
delicate:  the reference to the contained object must not be released
(via @ref{791,,Py_DECREF()}) until
after the pointer to the contained object is set to @code{NULL}.  This is because
releasing the reference may cause the contained object to become trash,
triggering a chain of reclamation activity that may include invoking arbitrary
Python code (due to finalizers, or weakref callbacks, associated with the
contained object). If it’s possible for such code to reference `self' again,
it’s important that the pointer to the contained object be @code{NULL} at that time,
so that `self' knows the contained object can no longer be used.  The
@code{Py_CLEAR()} macro performs the operations in a safe order.

If the @ref{60f,,Py_TPFLAGS_MANAGED_DICT} bit is set in the
@ref{1cb4,,tp_flags} field, the clear function must call
@ref{60e,,PyObject_ClearManagedDict()} like this:

@example
PyObject_ClearManagedDict((PyObject*)self);
@end example

More information about Python’s garbage collection scheme can be found in
section @ref{59c1,,Supporting Cyclic Garbage Collection}.

`Inheritance:'

Group: @ref{986,,Py_TPFLAGS_HAVE_GC}, @ref{987,,tp_traverse}, @ref{5242,,tp_clear}

This field is inherited by subtypes together with @ref{987,,tp_traverse} and the
@ref{986,,Py_TPFLAGS_HAVE_GC} flag bit: the flag bit, @code{tp_traverse}, and
@ref{5242,,tp_clear} are all inherited from the base type if they are all zero in
the subtype.


@subsubheading See also


@ref{594a,,Object Life Cycle} for details about how this slot relates to other slots.

@end deffn

@geindex PyTypeObject.tp_richcompare (C member)
@anchor{c-api/typeobj c PyTypeObject tp_richcompare}@anchor{5250}
@deffn {C Member} @ref{5513,,richcmpfunc} @ref{ca2,,PyTypeObject}.tp_richcompare

` The corresponding @ref{543c,,slot ID} @code{Py_tp_richcompare} is part of the @ref{776,,Stable ABI}.'
@geindex Py_tp_richcompare (C macro)
@anchor{c-api/typeobj c Py_tp_richcompare}@anchor{54f9}

An optional pointer to the rich comparison function, whose signature is:

@example
PyObject *tp_richcompare(PyObject *self, PyObject *other, int op);
@end example

The first parameter is guaranteed to be an instance of the type
that is defined by @ref{ca2,,PyTypeObject}.

The function should return the result of the comparison (usually @code{Py_True}
or @code{Py_False}).  If the comparison is undefined, it must return
@code{Py_NotImplemented}, if another error occurred it must return @code{NULL} and
set an exception condition.

The following constants are defined to be used as the third argument for
@ref{5250,,tp_richcompare} and for @ref{5251,,PyObject_RichCompare()}:


@multitable {xxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxx} 
@headitem

Constant

@tab

Comparison

@item

@geindex Py_LT (C macro)
@anchor{c-api/typeobj c Py_LT}@anchor{55e9}
@deffn {C Macro} Py_LT
@end deffn

@tab

@code{<}

@item

@geindex Py_LE (C macro)
@anchor{c-api/typeobj c Py_LE}@anchor{55ea}
@deffn {C Macro} Py_LE
@end deffn

@tab

@code{<=}

@item

@geindex Py_EQ (C macro)
@anchor{c-api/typeobj c Py_EQ}@anchor{55eb}
@deffn {C Macro} Py_EQ
@end deffn

@tab

@code{==}

@item

@geindex Py_NE (C macro)
@anchor{c-api/typeobj c Py_NE}@anchor{55ec}
@deffn {C Macro} Py_NE
@end deffn

@tab

@code{!=}

@item

@geindex Py_GT (C macro)
@anchor{c-api/typeobj c Py_GT}@anchor{55ed}
@deffn {C Macro} Py_GT
@end deffn

@tab

@code{>}

@item

@geindex Py_GE (C macro)
@anchor{c-api/typeobj c Py_GE}@anchor{55ee}
@deffn {C Macro} Py_GE
@end deffn

@tab

@code{>=}

@end multitable


The following macro is defined to ease writing rich comparison functions:

@geindex Py_RETURN_RICHCOMPARE (C macro)
@anchor{c-api/typeobj c Py_RETURN_RICHCOMPARE}@anchor{db3}
@deffn {C Macro} Py_RETURN_RICHCOMPARE (VAL_A, VAL_B, op)

Return @code{Py_True} or @code{Py_False} from the function, depending on the
result of a comparison.
VAL_A and VAL_B must be orderable by C comparison operators (for example,
they may be C ints or floats). The third argument specifies the requested
operation, as for @ref{5251,,PyObject_RichCompare()}.

The returned value is a new @ref{5e2,,strong reference}.

On error, sets an exception and returns @code{NULL} from the function.


Added in version 3.7.

@end deffn

`Inheritance:'

Group: @ref{5256,,tp_hash}, @ref{5250,,tp_richcompare}

This field is inherited by subtypes together with @ref{5256,,tp_hash}:
a subtype inherits @ref{5250,,tp_richcompare} and @code{tp_hash} when
the subtype’s @code{tp_richcompare} and @code{tp_hash} are both
@code{NULL}.

`Default:'

@ref{52d5,,PyBaseObject_Type} provides a @ref{5250,,tp_richcompare}
implementation, which may be inherited.  However, if only
@ref{5256,,tp_hash} is defined, not even the inherited function is used
and instances of the type will not be able to participate in any
comparisons.
@end deffn

@geindex PyTypeObject.tp_weaklistoffset (C member)
@anchor{c-api/typeobj c PyTypeObject tp_weaklistoffset}@anchor{b85}
@deffn {C Member} @ref{c5b,,Py_ssize_t} @ref{ca2,,PyTypeObject}.tp_weaklistoffset

While this field is still supported, @ref{77d,,Py_TPFLAGS_MANAGED_WEAKREF}
should be used instead, if at all possible.

If the instances of this type are weakly referenceable, this field is greater
than zero and contains the offset in the instance structure of the weak
reference list head (ignoring the GC header, if present); this offset is used by
@ref{797,,PyObject_ClearWeakRefs()} and the @code{PyWeakref_*} functions.  The
instance structure needs to include a field of type @ref{5df,,PyObject}* which is
initialized to @code{NULL}.

Do not confuse this field with @ref{5650,,tp_weaklist}; that is the list head for
weak references to the type object itself.

It is an error to set both the @ref{77d,,Py_TPFLAGS_MANAGED_WEAKREF} bit and
@ref{b85,,tp_weaklistoffset}.

`Inheritance:'

This field is inherited by subtypes, but see the rules listed below. A subtype
may override this offset; this means that the subtype uses a different weak
reference list head than the base type.  Since the list head is always found via
@ref{b85,,tp_weaklistoffset}, this should not be a problem.

`Default:'

If the @ref{77d,,Py_TPFLAGS_MANAGED_WEAKREF} bit is set in the
@ref{1cb4,,tp_flags} field, then
@ref{b85,,tp_weaklistoffset} will be set to a negative value,
to indicate that it is unsafe to use this field.
@end deffn

@geindex PyTypeObject.tp_iter (C member)
@anchor{c-api/typeobj c PyTypeObject tp_iter}@anchor{16fb}
@deffn {C Member} @ref{5507,,getiterfunc} @ref{ca2,,PyTypeObject}.tp_iter

` The corresponding @ref{543c,,slot ID} @code{Py_tp_iter} is part of the @ref{776,,Stable ABI}.'
@geindex Py_tp_iter (C macro)
@anchor{c-api/typeobj c Py_tp_iter}@anchor{54f3}

An optional pointer to a function that returns an @ref{4c9,,iterator} for the
object.  Its presence normally signals that the instances of this type are
@ref{1433,,iterable} (although sequences may be iterable without this function).

This function has the same signature as @ref{53f3,,PyObject_GetIter()}:

@example
PyObject *tp_iter(PyObject *self);
@end example

`Inheritance:'

This field is inherited by subtypes.
@end deffn

@geindex PyTypeObject.tp_iternext (C member)
@anchor{c-api/typeobj c PyTypeObject tp_iternext}@anchor{16fc}
@deffn {C Member} @ref{550c,,iternextfunc} @ref{ca2,,PyTypeObject}.tp_iternext

` The corresponding @ref{543c,,slot ID} @code{Py_tp_iternext} is part of the @ref{776,,Stable ABI}.'
@geindex Py_tp_iternext (C macro)
@anchor{c-api/typeobj c Py_tp_iternext}@anchor{54f4}

An optional pointer to a function that returns the next item in an
@ref{4c9,,iterator}. The signature is:

@example
PyObject *tp_iternext(PyObject *self);
@end example

When the iterator is exhausted, it must return @code{NULL}; a @ref{dfb,,StopIteration}
exception may or may not be set.  When another error occurs, it must return
@code{NULL} too.  Its presence signals that the instances of this type are
iterators.

Iterator types should also define the @ref{16fb,,tp_iter} function, and that
function should return the iterator instance itself (not a new iterator
instance).

This function has the same signature as @ref{397,,PyIter_Next()}.

`Inheritance:'

This field is inherited by subtypes.
@end deffn

@geindex PyTypeObject.tp_methods (C member)
@anchor{c-api/typeobj c PyTypeObject tp_methods}@anchor{5234}
@deffn {C Member} struct @ref{16e3,,PyMethodDef} *@ref{ca2,,PyTypeObject}.tp_methods

` The corresponding @ref{543c,,slot ID} @code{Py_tp_methods} is part of the @ref{776,,Stable ABI}.'
@geindex Py_tp_methods (C macro)
@anchor{c-api/typeobj c Py_tp_methods}@anchor{54f6}

An optional pointer to a static @code{NULL}-terminated array of @ref{16e3,,PyMethodDef}
structures, declaring regular methods of this type.

For each entry in the array, an entry is added to the type’s dictionary (see
@ref{1ad2,,tp_dict} below) containing a method descriptor.

`Inheritance:'

This field is not inherited by subtypes (methods are inherited through a
different mechanism).
@end deffn

@geindex PyTypeObject.tp_members (C member)
@anchor{c-api/typeobj c PyTypeObject tp_members}@anchor{5232}
@deffn {C Member} struct @ref{772,,PyMemberDef} *@ref{ca2,,PyTypeObject}.tp_members

` The corresponding @ref{543c,,slot ID} @code{Py_tp_members} is part of the @ref{776,,Stable ABI}.'
@geindex Py_tp_members (C macro)
@anchor{c-api/typeobj c Py_tp_members}@anchor{54f5}

An optional pointer to a static @code{NULL}-terminated array of @ref{772,,PyMemberDef}
structures, declaring regular data members (fields or slots) of instances of
this type.

For each entry in the array, an entry is added to the type’s dictionary (see
@ref{1ad2,,tp_dict} below) containing a member descriptor.

`Inheritance:'

This field is not inherited by subtypes (members are inherited through a
different mechanism).
@end deffn

@geindex PyTypeObject.tp_getset (C member)
@anchor{c-api/typeobj c PyTypeObject tp_getset}@anchor{5237}
@deffn {C Member} struct @ref{db8,,PyGetSetDef} *@ref{ca2,,PyTypeObject}.tp_getset

` The corresponding @ref{543c,,slot ID} @code{Py_tp_getset} is part of the @ref{776,,Stable ABI}.'
@geindex Py_tp_getset (C macro)
@anchor{c-api/typeobj c Py_tp_getset}@anchor{54ef}

An optional pointer to a static @code{NULL}-terminated array of @ref{db8,,PyGetSetDef}
structures, declaring computed attributes of instances of this type.

For each entry in the array, an entry is added to the type’s dictionary (see
@ref{1ad2,,tp_dict} below) containing a getset descriptor.

`Inheritance:'

This field is not inherited by subtypes (computed attributes are inherited
through a different mechanism).
@end deffn

@geindex PyTypeObject.tp_base (C member)
@anchor{c-api/typeobj c PyTypeObject tp_base}@anchor{23b9}
@deffn {C Member} @ref{ca2,,PyTypeObject} *@ref{ca2,,PyTypeObject}.tp_base

` The corresponding @ref{543c,,slot ID} @code{Py_tp_base} is part of the @ref{776,,Stable ABI}.'
@geindex Py_tp_base (C macro)
@anchor{c-api/typeobj c Py_tp_base}@anchor{54e2}

An optional pointer to a base type from which type properties are inherited.  At
this level, only single inheritance is supported; multiple inheritance require
dynamically creating a type object by calling the metatype.

@cartouche
@quotation Note 
@c from Modules/xxmodule.c

Slot initialization is subject to the rules of initializing globals.
C99 requires the initializers to be “address constants”.  Function
designators like @ref{522c,,PyType_GenericNew()}, with implicit conversion
to a pointer, are valid C99 address constants.

However, the unary ‘&’ operator applied to a non-static variable
like @ref{52d5,,PyBaseObject_Type} is not required to produce an address
constant.  Compilers may support this (gcc does), MSVC does not.
Both compilers are strictly standard conforming in this particular
behavior.

Consequently, @ref{23b9,,tp_base} should be set in
the extension module’s init function.
@end quotation
@end cartouche

`Inheritance:'

This field is not inherited by subtypes (obviously).

`Default:'

This field defaults to @code{&PyBaseObject_Type} (which to Python
programmers is known as the type @ref{c84,,object}).
@end deffn

@geindex PyTypeObject.tp_dict (C member)
@anchor{c-api/typeobj c PyTypeObject tp_dict}@anchor{1ad2}
@deffn {C Member} @ref{5df,,PyObject} *@ref{ca2,,PyTypeObject}.tp_dict

The type’s dictionary is stored here by @ref{985,,PyType_Ready()}.

This field should normally be initialized to @code{NULL} before PyType_Ready is
called; it may also be initialized to a dictionary containing initial attributes
for the type.  Once @ref{985,,PyType_Ready()} has initialized the type, extra
attributes for the type may be added to this dictionary only if they don’t
correspond to overloaded operations (like @ref{2424,,__add__()}).  Once
initialization for the type has finished, this field should be
treated as read-only.

Some types may not store their dictionary in this slot.
Use @ref{1ad1,,PyType_GetDict()} to retrieve the dictionary for an arbitrary
type.


Changed in version 3.12: Internals detail: For static builtin types, this is always @code{NULL}.
Instead, the dict for such types is stored on @code{PyInterpreterState}.
Use @ref{1ad1,,PyType_GetDict()} to get the dict for an arbitrary type.


`Inheritance:'

This field is not inherited by subtypes (though the attributes defined in here
are inherited through a different mechanism).

`Default:'

If this field is @code{NULL}, @ref{985,,PyType_Ready()} will assign a new
dictionary to it.

@cartouche
@quotation Warning 
It is not safe to use @ref{5219,,PyDict_SetItem()} on or otherwise modify
@ref{1ad2,,tp_dict} with the dictionary C-API.
@end quotation
@end cartouche
@end deffn

@geindex PyTypeObject.tp_descr_get (C member)
@anchor{c-api/typeobj c PyTypeObject tp_descr_get}@anchor{5981}
@deffn {C Member} @ref{5501,,descrgetfunc} @ref{ca2,,PyTypeObject}.tp_descr_get

` The corresponding @ref{543c,,slot ID} @code{Py_tp_descr_get} is part of the @ref{776,,Stable ABI}.'
@geindex Py_tp_descr_get (C macro)
@anchor{c-api/typeobj c Py_tp_descr_get}@anchor{54e8}

An optional pointer to a “descriptor get” function.

The function signature is:

@example
PyObject * tp_descr_get(PyObject *self, PyObject *obj, PyObject *type);
@end example

@c XXX explain more?

`Inheritance:'

This field is inherited by subtypes.
@end deffn

@geindex PyTypeObject.tp_descr_set (C member)
@anchor{c-api/typeobj c PyTypeObject tp_descr_set}@anchor{1cf5}
@deffn {C Member} @ref{5502,,descrsetfunc} @ref{ca2,,PyTypeObject}.tp_descr_set

` The corresponding @ref{543c,,slot ID} @code{Py_tp_descr_set} is part of the @ref{776,,Stable ABI}.'
@geindex Py_tp_descr_set (C macro)
@anchor{c-api/typeobj c Py_tp_descr_set}@anchor{54e9}

An optional pointer to a function for setting and deleting
a descriptor’s value.

The function signature is:

@example
int tp_descr_set(PyObject *self, PyObject *obj, PyObject *value);
@end example

The `value' argument is set to @code{NULL} to delete the value.

@c XXX explain more?

`Inheritance:'

This field is inherited by subtypes.
@end deffn

@geindex PyTypeObject.tp_dictoffset (C member)
@anchor{c-api/typeobj c PyTypeObject tp_dictoffset}@anchor{564c}
@deffn {C Member} @ref{c5b,,Py_ssize_t} @ref{ca2,,PyTypeObject}.tp_dictoffset

While this field is still supported, @ref{60f,,Py_TPFLAGS_MANAGED_DICT} should be
used instead, if at all possible.

If the instances of this type have a dictionary containing instance variables,
this field is non-zero and contains the offset in the instances of the type of
the instance variable dictionary; this offset is used by
@ref{53ef,,PyObject_GenericGetAttr()}.

Do not confuse this field with @ref{1ad2,,tp_dict}; that is the dictionary for
attributes of the type object itself.

The value specifies the offset of the dictionary from the start of the instance structure.

The @ref{564c,,tp_dictoffset} should be regarded as write-only.
To get the pointer to the dictionary call @ref{1d49,,PyObject_GenericGetDict()}.
Calling @code{PyObject_GenericGetDict()} may need to allocate memory for the
dictionary, so it is may be more efficient to call @ref{5ee,,PyObject_GetAttr()}
when accessing an attribute on the object.

It is an error to set both the @ref{60f,,Py_TPFLAGS_MANAGED_DICT} bit and
@ref{564c,,tp_dictoffset}.

`Inheritance:'

This field is inherited by subtypes. A subtype should not override this offset;
doing so could be unsafe, if C code tries to access the dictionary at the
previous offset.
To properly support inheritance, use @ref{60f,,Py_TPFLAGS_MANAGED_DICT}.

`Default:'

This slot has no default.  For @ref{988,,static types}, if the
field is @code{NULL} then no @ref{77e,,__dict__} gets created for instances.

If the @ref{60f,,Py_TPFLAGS_MANAGED_DICT} bit is set in the
@ref{1cb4,,tp_flags} field, then
@ref{564c,,tp_dictoffset} will be set to @code{-1}, to indicate
that it is unsafe to use this field.
@end deffn

@geindex PyTypeObject.tp_init (C member)
@anchor{c-api/typeobj c PyTypeObject tp_init}@anchor{7a2}
@deffn {C Member} @ref{550a,,initproc} @ref{ca2,,PyTypeObject}.tp_init

` The corresponding @ref{543c,,slot ID} @code{Py_tp_init} is part of the @ref{776,,Stable ABI}.'
@geindex Py_tp_init (C macro)
@anchor{c-api/typeobj c Py_tp_init}@anchor{54f1}

An optional pointer to an instance initialization function.

This function corresponds to the @ref{8c1,,__init__()} method of classes.  Like
@code{__init__()}, it is possible to create an instance without calling
@code{__init__()}, and it is possible to reinitialize an instance by calling its
@code{__init__()} method again.

The function signature is:

@example
int tp_init(PyObject *self, PyObject *args, PyObject *kwds);
@end example

The self argument is the instance to be initialized; the `args' and `kwds'
arguments represent positional and keyword arguments of the call to
@ref{8c1,,__init__()}.

The @ref{7a2,,tp_init} function, if not @code{NULL}, is called when an instance is
created normally by calling its type, after the type’s @ref{7a0,,tp_new} function
has returned an instance of the type.  If the @code{tp_new} function returns an
instance of some other type that is not a subtype of the original type, no
@code{tp_init} function is called; if @code{tp_new} returns an instance of a
subtype of the original type, the subtype’s @code{tp_init} is called.

Returns @code{0} on success, @code{-1} and sets an exception on error.

`Inheritance:'

This field is inherited by subtypes.

`Default:'

For @ref{988,,static types} this field does not have a default.
@end deffn

@geindex PyTypeObject.tp_alloc (C member)
@anchor{c-api/typeobj c PyTypeObject tp_alloc}@anchor{5230}
@deffn {C Member} @ref{54ff,,allocfunc} @ref{ca2,,PyTypeObject}.tp_alloc

` The corresponding @ref{543c,,slot ID} @code{Py_tp_alloc} is part of the @ref{776,,Stable ABI}.'
@geindex Py_tp_alloc (C macro)
@anchor{c-api/typeobj c Py_tp_alloc}@anchor{54e1}

An optional pointer to an instance allocation function.

The function signature is:

@example
PyObject *tp_alloc(PyTypeObject *self, Py_ssize_t nitems);
@end example

`Inheritance:'

Static subtypes inherit this slot, which will be
@ref{c67,,PyType_GenericAlloc()} if inherited from @ref{c84,,object}.

@ref{b64,,Heap subtypes} do not inherit this slot.

`Default:'

For heap subtypes, this field is always set to
@ref{c67,,PyType_GenericAlloc()}.

For static subtypes, this slot is inherited (see above).
@end deffn

@geindex PyTypeObject.tp_new (C member)
@anchor{c-api/typeobj c PyTypeObject tp_new}@anchor{7a0}
@deffn {C Member} @ref{550e,,newfunc} @ref{ca2,,PyTypeObject}.tp_new

` The corresponding @ref{543c,,slot ID} @code{Py_tp_new} is part of the @ref{776,,Stable ABI}.'
@geindex Py_tp_new (C macro)
@anchor{c-api/typeobj c Py_tp_new}@anchor{54f7}

An optional pointer to an instance creation function.

The function signature is:

@example
PyObject *tp_new(PyTypeObject *subtype, PyObject *args, PyObject *kwds);
@end example

The `subtype' argument is the type of the object being created; the `args' and
`kwds' arguments represent positional and keyword arguments of the call to the
type.  Note that `subtype' doesn’t have to equal the type whose @ref{7a0,,tp_new}
function is called; it may be a subtype of that type (but not an unrelated
type).

The @ref{7a0,,tp_new} function should call @code{subtype->tp_alloc(subtype, nitems)}
to allocate space for the object, and then do only as much further
initialization as is absolutely necessary.  Initialization that can safely be
ignored or repeated should be placed in the @ref{7a2,,tp_init} handler.  A good
rule of thumb is that for immutable types, all initialization should take place
in @code{tp_new}, while for mutable types, most initialization should be
deferred to @code{tp_init}.

Set the @ref{7a3,,Py_TPFLAGS_DISALLOW_INSTANTIATION} flag to disallow creating
instances of the type in Python.

`Inheritance:'

This field is inherited by subtypes, except it is not inherited by
@ref{988,,static types} whose @ref{23b9,,tp_base}
is @code{NULL} or @code{&PyBaseObject_Type}.

`Default:'

For @ref{988,,static types} this field has no default.
This means if the slot is defined as @code{NULL}, the type cannot be called
to create new instances; presumably there is some other way to create
instances, like a factory function.
@end deffn

@geindex PyTypeObject.tp_free (C member)
@anchor{c-api/typeobj c PyTypeObject tp_free}@anchor{522f}
@deffn {C Member} @ref{57a4,,freefunc} @ref{ca2,,PyTypeObject}.tp_free

` The corresponding @ref{543c,,slot ID} @code{Py_tp_free} is part of the @ref{776,,Stable ABI}.'
@geindex Py_tp_free (C macro)
@anchor{c-api/typeobj c Py_tp_free}@anchor{54ec}

An optional pointer to an instance deallocation function.  Its signature is:

@example
void tp_free(void *self);
@end example

This function must free the memory allocated by
@ref{5230,,tp_alloc}.

`Inheritance:'

Static subtypes inherit this slot, which will be @ref{e65,,PyObject_Free()} if
inherited from @ref{c84,,object}.  Exception: If the type supports garbage
collection (i.e., the @ref{986,,Py_TPFLAGS_HAVE_GC} flag is set in
@ref{1cb4,,tp_flags}) and it would inherit
@code{PyObject_Free()}, then this slot is not inherited but instead defaults
to @ref{170f,,PyObject_GC_Del()}.

@ref{b64,,Heap subtypes} do not inherit this slot.

`Default:'

For @ref{b64,,heap subtypes}, this slot defaults to a deallocator suitable to match
@ref{c67,,PyType_GenericAlloc()} and the value of the
@ref{986,,Py_TPFLAGS_HAVE_GC} flag.

For static subtypes, this slot is inherited (see above).
@end deffn

@geindex PyTypeObject.tp_is_gc (C member)
@anchor{c-api/typeobj c PyTypeObject tp_is_gc}@anchor{5982}
@deffn {C Member} @ref{550b,,inquiry} @ref{ca2,,PyTypeObject}.tp_is_gc

` The corresponding @ref{543c,,slot ID} @code{Py_tp_is_gc} is part of the @ref{776,,Stable ABI}.'
@geindex Py_tp_is_gc (C macro)
@anchor{c-api/typeobj c Py_tp_is_gc}@anchor{54f2}

An optional pointer to a function called by the garbage collector.

The garbage collector needs to know whether a particular object is collectible
or not.  Normally, it is sufficient to look at the object’s type’s
@ref{1cb4,,tp_flags} field, and check the @ref{986,,Py_TPFLAGS_HAVE_GC} flag bit.  But
some types have a mixture of statically and dynamically allocated instances, and
the statically allocated instances are not collectible.  Such types should
define this function; it should return @code{1} for a collectible instance, and
@code{0} for a non-collectible instance. The signature is:

@example
int tp_is_gc(PyObject *self);
@end example

(The only example of this are types themselves.  The metatype,
@ref{770,,PyType_Type}, defines this function to distinguish between statically
and @ref{b64,,dynamically allocated types}.)

`Inheritance:'

This field is inherited by subtypes.

`Default:'

This slot has no default.  If this field is @code{NULL},
@ref{986,,Py_TPFLAGS_HAVE_GC} is used as the functional equivalent.
@end deffn

@geindex PyTypeObject.tp_bases (C member)
@anchor{c-api/typeobj c PyTypeObject tp_bases}@anchor{5983}
@deffn {C Member} @ref{5df,,PyObject} *@ref{ca2,,PyTypeObject}.tp_bases

` The corresponding @ref{543c,,slot ID} @code{Py_tp_bases} is part of the @ref{776,,Stable ABI}.'
@geindex Py_tp_bases (C macro)
@anchor{c-api/typeobj c Py_tp_bases}@anchor{54e3}

Tuple of base types.

This field should be set to @code{NULL} and treated as read-only.
Python will fill it in when the type is @ref{985,,initialized}.

For dynamically created classes, the @ref{54e3,,Py_tp_bases}
@ref{543c,,slot} can be used instead of the `bases' argument
of @ref{79f,,PyType_FromSpecWithBases()}.
The argument form is preferred.

@cartouche
@quotation Warning 
Multiple inheritance does not work well for statically defined types.
If you set @code{tp_bases} to a tuple, Python will not raise an error,
but some slots will only be inherited from the first base.
@end quotation
@end cartouche

`Inheritance:'

This field is not inherited.
@end deffn

@geindex PyTypeObject.tp_mro (C member)
@anchor{c-api/typeobj c PyTypeObject tp_mro}@anchor{564e}
@deffn {C Member} @ref{5df,,PyObject} *@ref{ca2,,PyTypeObject}.tp_mro

Tuple containing the expanded set of base types, starting with the type itself
and ending with @ref{c84,,object}, in Method Resolution Order.

This field should be set to @code{NULL} and treated as read-only.
Python will fill it in when the type is @ref{985,,initialized}.

`Inheritance:'

This field is not inherited; it is calculated fresh by
@ref{985,,PyType_Ready()}.
@end deffn

@geindex PyTypeObject.tp_cache (C member)
@anchor{c-api/typeobj c PyTypeObject tp_cache}@anchor{564f}
@deffn {C Member} @ref{5df,,PyObject} *@ref{ca2,,PyTypeObject}.tp_cache

Unused.  Internal use only.

`Inheritance:'

This field is not inherited.
@end deffn

@geindex PyTypeObject.tp_subclasses (C member)
@anchor{c-api/typeobj c PyTypeObject tp_subclasses}@anchor{793}
@deffn {C Member} void *@ref{ca2,,PyTypeObject}.tp_subclasses

A collection of subclasses.  Internal use only.  May be an invalid pointer.

To get a list of subclasses, call the Python method
@ref{794,,__subclasses__()}.


Changed in version 3.12: For some types, this field does not hold a valid @ref{5df,,PyObject}*.
The type was changed to void* to indicate this.


`Inheritance:'

This field is not inherited.
@end deffn

@geindex PyTypeObject.tp_weaklist (C member)
@anchor{c-api/typeobj c PyTypeObject tp_weaklist}@anchor{5650}
@deffn {C Member} @ref{5df,,PyObject} *@ref{ca2,,PyTypeObject}.tp_weaklist

Weak reference list head, for weak references to this type object.  Not
inherited.  Internal use only.


Changed in version 3.12: Internals detail: For the static builtin types this is always @code{NULL},
even if weakrefs are added.  Instead, the weakrefs for each are stored
on @code{PyInterpreterState}.  Use the public C-API or the internal
@code{_PyObject_GET_WEAKREFS_LISTPTR()} macro to avoid the distinction.


`Inheritance:'

This field is not inherited.
@end deffn

@geindex PyTypeObject.tp_del (C member)
@anchor{c-api/typeobj c PyTypeObject tp_del}@anchor{5984}
@deffn {C Member} @ref{5503,,destructor} @ref{ca2,,PyTypeObject}.tp_del

` The corresponding @ref{543c,,slot ID} @code{Py_tp_del} is part of the @ref{776,,Stable ABI}.'
@geindex Py_tp_del (C macro)
@anchor{c-api/typeobj c Py_tp_del}@anchor{54e7}

This field is deprecated.  Use @ref{ca3,,tp_finalize} instead.
@end deffn

@geindex PyTypeObject.tp_version_tag (C member)
@anchor{c-api/typeobj c PyTypeObject tp_version_tag}@anchor{5985}
@deffn {C Member} unsigned int @ref{ca2,,PyTypeObject}.tp_version_tag

Used to index into the method cache.  Internal use only.

`Inheritance:'

This field is not inherited.
@end deffn

@geindex PyTypeObject.tp_finalize (C member)
@anchor{c-api/typeobj c PyTypeObject tp_finalize}@anchor{ca3}
@deffn {C Member} @ref{5503,,destructor} @ref{ca2,,PyTypeObject}.tp_finalize

` The corresponding @ref{543c,,slot ID} @code{Py_tp_finalize} is part of the @ref{776,,Stable ABI} since version 3.5.'
@geindex Py_tp_finalize (C macro)
@anchor{c-api/typeobj c Py_tp_finalize}@anchor{54eb}

An optional pointer to an instance finalization function.  This is the C
implementation of the @ref{1203,,__del__()} special method.  Its signature
is:

@example
void tp_finalize(PyObject *self);
@end example

The primary purpose of finalization is to perform any non-trivial cleanup
that must be performed before the object is destroyed, while the object and
any other objects it directly or indirectly references are still in a
consistent state.  The finalizer is allowed to execute
arbitrary Python code.

Before Python automatically finalizes an object, some of the object’s direct
or indirect referents might have themselves been automatically finalized.
However, none of the referents will have been automatically cleared
(@ref{5242,,tp_clear}) yet.

Other non-finalized objects might still be using a finalized object, so the
finalizer must leave the object in a sane state (e.g., invariants are still
met).

@cartouche
@quotation Note 
After Python automatically finalizes an object, Python might start
automatically clearing (@ref{5242,,tp_clear}) the object
and its referents (direct and indirect).  Cleared objects are not
guaranteed to be in a consistent state; a finalized object must be able
to tolerate cleared referents.
@end quotation
@end cartouche

@cartouche
@quotation Note 
An object is not guaranteed to be automatically finalized before its
destructor (@ref{521c,,tp_dealloc}) is called.  It is
recommended to call @ref{594e,,PyObject_CallFinalizerFromDealloc()} at the
beginning of @code{tp_dealloc} to guarantee that the object is
always finalized before destruction.
@end quotation
@end cartouche

@cartouche
@quotation Note 
The @ref{ca3,,tp_finalize} function can be called from any
thread, although the @ref{165,,GIL} will be held.
@end quotation
@end cartouche

@cartouche
@quotation Note 
The @code{tp_finalize} function can be called during shutdown,
after some global variables have been deleted.  See the documentation of
the @ref{1203,,__del__()} method for details.
@end quotation
@end cartouche

When Python finalizes an object, it behaves like the following algorithm:


@enumerate 

@item 
Python might mark the object as `finalized'.  Currently, Python always
marks objects whose type supports garbage collection (i.e., the
@ref{986,,Py_TPFLAGS_HAVE_GC} flag is set in
@ref{1cb4,,tp_flags}) and never marks other types of
objects; this might change in a future version.

@item 
If the object is not marked as `finalized' and its
@code{tp_finalize} finalizer function is non-@code{NULL}, the
finalizer function is called.

@item 
If the finalizer function was called and the finalizer made the object
reachable (i.e., there is a reference to the object and it is not a
member of a @ref{594f,,cyclic isolate}), then the finalizer is said to have
`resurrected' the object.  It is unspecified whether the finalizer can
also resurrect the object by adding a new reference to the object that
does not make it reachable, i.e., the object is (still) a member of a
cyclic isolate.

@item 
If the finalizer resurrected the object, the object’s pending destruction
is canceled and the object’s `finalized' mark might be removed if
present.  Currently, Python never removes the `finalized' mark; this
might change in a future version.
@end enumerate

`Automatic finalization' refers to any finalization performed by Python
except via calls to @ref{5952,,PyObject_CallFinalizer()} or
@ref{594e,,PyObject_CallFinalizerFromDealloc()}.  No guarantees are made about
when, if, or how often an object is automatically finalized, except:


@itemize *

@item 
Python will not automatically finalize an object if it is reachable, i.e.,
there is a reference to it and it is not a member of a @ref{594f,,cyclic isolate}.

@item 
Python will not automatically finalize an object if finalizing it would
not mark the object as `finalized'.  Currently, this applies to objects
whose type does not support garbage collection, i.e., the
@ref{986,,Py_TPFLAGS_HAVE_GC} flag is not set.  Such objects can still be
manually finalized by calling @ref{5952,,PyObject_CallFinalizer()} or
@ref{594e,,PyObject_CallFinalizerFromDealloc()}.

@item 
Python will not automatically finalize any two members of a @ref{594f,,cyclic isolate} concurrently.

@item 
Python will not automatically finalize an object after it has
automatically cleared (@ref{5242,,tp_clear}) the object.

@item 
If an object is a member of a @ref{594f,,cyclic isolate}, Python will not
automatically finalize it after automatically clearing (see
@ref{5242,,tp_clear}) any other member.

@item 
Python will automatically finalize every member of a @ref{594f,,cyclic isolate} before it automatically clears (see
@ref{5242,,tp_clear}) any of them.

@item 
If Python is going to automatically clear an object
(@ref{5242,,tp_clear}), it will automatically finalize the
object first.
@end itemize

Python currently only automatically finalizes objects that are members of a
@ref{594f,,cyclic isolate}, but future versions might finalize objects regularly
before their destruction.

To manually finalize an object, do not call this function directly; call
@ref{5952,,PyObject_CallFinalizer()} or
@ref{594e,,PyObject_CallFinalizerFromDealloc()} instead.

@ref{ca3,,tp_finalize} should leave the current exception
status unchanged.  The recommended way to write a non-trivial finalizer is
to back up the exception at the beginning by calling
@ref{427,,PyErr_GetRaisedException()} and restore the exception at the end by
calling @ref{42a,,PyErr_SetRaisedException()}.  If an exception is encountered
in the middle of the finalizer, log and clear it with
@ref{5f2,,PyErr_WriteUnraisable()} or @ref{5f1,,PyErr_FormatUnraisable()}.  For
example:

@example
static void
foo_finalize(PyObject *self)
@{
    // Save the current exception, if any.
    PyObject *exc = PyErr_GetRaisedException();

    // ...

    if (do_something_that_might_raise() != success_indicator) @{
        PyErr_WriteUnraisable(self);
        goto done;
    @}

done:
    // Restore the saved exception.  This silently discards any exception
    // raised above, so be sure to call PyErr_WriteUnraisable first if
    // necessary.
    PyErr_SetRaisedException(exc);
@}
@end example

`Inheritance:'

This field is inherited by subtypes.


Added in version 3.4.



Changed in version 3.8: Before version 3.8 it was necessary to set the
@ref{425,,Py_TPFLAGS_HAVE_FINALIZE} flags bit in order for this field to be
used.  This is no longer required.



@subsubheading See also



@itemize *

@item 
@geindex Python Enhancement Proposals; PEP 442
PEP 442@footnote{https://peps.python.org/pep-0442/}: “Safe object finalization”

@item 
@ref{594a,,Object Life Cycle} for details about how this slot relates to other
slots.

@item 
@ref{5952,,PyObject_CallFinalizer()}

@item 
@ref{594e,,PyObject_CallFinalizerFromDealloc()}
@end itemize

@end deffn

@geindex PyTypeObject.tp_vectorcall (C member)
@anchor{c-api/typeobj c PyTypeObject tp_vectorcall}@anchor{19ce}
@deffn {C Member} @ref{77a,,vectorcallfunc} @ref{ca2,,PyTypeObject}.tp_vectorcall

` The corresponding @ref{543c,,slot ID} @code{Py_tp_vectorcall} is part of the @ref{776,,Stable ABI} since version 3.14.'
@geindex Py_tp_vectorcall (C macro)
@anchor{c-api/typeobj c Py_tp_vectorcall}@anchor{54fe}

A @ref{775,,vectorcall function} to use for calls of this type
object (rather than instances).
In other words, @code{tp_vectorcall} can be used to optimize @code{type.__call__},
which typically returns a new instance of `type'.

As with any vectorcall function, if @code{tp_vectorcall} is @code{NULL},
the `tp_call' protocol (@code{Py_TYPE(type)->tp_call}) is used instead.

@cartouche
@quotation Note 
The @ref{775,,vectorcall protocol} requires that the vectorcall
function has the same behavior as the corresponding @code{tp_call}.
This means that @code{type->tp_vectorcall} must match the behavior of
@code{Py_TYPE(type)->tp_call}.

Specifically, if `type' uses the default metaclass,
@code{type->tp_vectorcall} must behave the same as
@ref{770,,PyType_Type}->tp_call, which:


@itemize -

@item 
calls @code{type->tp_new},

@item 
if the result is a subclass of `type', calls @code{type->tp_init}
on the result of @code{tp_new}, and

@item 
returns the result of @code{tp_new}.
@end itemize

Typically, @code{tp_vectorcall} is overridden to optimize this process
for specific @ref{7a0,,tp_new} and
@ref{7a2,,tp_init}.
When doing this for user-subclassable types, note that both can be
overridden (using @ref{7a1,,__new__()} and
@ref{8c1,,__init__()}, respectively).
@end quotation
@end cartouche

`Inheritance:'

This field is never inherited.


Added in version 3.9: (the field exists since 3.8 but it’s only used since 3.9)

@end deffn

@geindex PyTypeObject.tp_watched (C member)
@anchor{c-api/typeobj c PyTypeObject tp_watched}@anchor{5986}
@deffn {C Member} unsigned char @ref{ca2,,PyTypeObject}.tp_watched

Internal. Do not use.


Added in version 3.12.

@end deffn

@node Static Types,Heap Types,PyTypeObject Slots,Type Object Structures
@anchor{c-api/typeobj id4}@anchor{59d0}@anchor{c-api/typeobj static-types}@anchor{988}
@subsubsection Static Types


Traditionally, types defined in C code are `static', that is,
a static @ref{ca2,,PyTypeObject} structure is defined directly in code
and initialized using @ref{985,,PyType_Ready()}.

This results in types that are limited relative to types defined in Python:


@itemize *

@item 
Static types are limited to one base, i.e. they cannot use multiple
inheritance.

@item 
Static type objects (but not necessarily their instances) are immutable.
It is not possible to add or modify the type object’s attributes from Python.

@item 
Static type objects are shared across
@ref{164,,sub-interpreters}, so they should not
include any subinterpreter-specific state.
@end itemize

Also, since @ref{ca2,,PyTypeObject} is only part of the @ref{637,,Limited API} as an opaque struct, any extension modules using static types must be
compiled for a specific Python minor version.

@node Heap Types,Number Object Structures,Static Types,Type Object Structures
@anchor{c-api/typeobj heap-types}@anchor{b64}@anchor{c-api/typeobj id5}@anchor{59d1}
@subsubsection Heap Types


An alternative to @ref{988,,static types} is `heap-allocated types',
or `heap types' for short, which correspond closely to classes created by
Python’s @code{class} statement. Heap types have the @ref{ab2,,Py_TPFLAGS_HEAPTYPE}
flag set.

This is done by filling a @ref{1acf,,PyType_Spec} structure and calling
@ref{79e,,PyType_FromSpec()}, @ref{79f,,PyType_FromSpecWithBases()},
@ref{774,,PyType_FromModuleAndSpec()}, or @ref{773,,PyType_FromMetaclass()}.

@node Number Object Structures,Mapping Object Structures,Heap Types,Type Object Structures
@anchor{c-api/typeobj number-object-structures}@anchor{59d2}@anchor{c-api/typeobj number-structs}@anchor{59be}
@subsubsection Number Object Structures


@geindex PyNumberMethods (C type)
@anchor{c-api/typeobj c PyNumberMethods}@anchor{162a}
@deffn {C Type} type PyNumberMethods

This structure holds pointers to the functions which an object uses to
implement the number protocol.  Each function is used by the function of
similar name documented in the @ref{5601,,Number Protocol} section.

@c XXX Drop the definition?

Here is the structure definition:

@example
typedef struct @{
     binaryfunc nb_add;
     binaryfunc nb_subtract;
     binaryfunc nb_multiply;
     binaryfunc nb_remainder;
     binaryfunc nb_divmod;
     ternaryfunc nb_power;
     unaryfunc nb_negative;
     unaryfunc nb_positive;
     unaryfunc nb_absolute;
     inquiry nb_bool;
     unaryfunc nb_invert;
     binaryfunc nb_lshift;
     binaryfunc nb_rshift;
     binaryfunc nb_and;
     binaryfunc nb_xor;
     binaryfunc nb_or;
     unaryfunc nb_int;
     void *nb_reserved;
     unaryfunc nb_float;

     binaryfunc nb_inplace_add;
     binaryfunc nb_inplace_subtract;
     binaryfunc nb_inplace_multiply;
     binaryfunc nb_inplace_remainder;
     ternaryfunc nb_inplace_power;
     binaryfunc nb_inplace_lshift;
     binaryfunc nb_inplace_rshift;
     binaryfunc nb_inplace_and;
     binaryfunc nb_inplace_xor;
     binaryfunc nb_inplace_or;

     binaryfunc nb_floor_divide;
     binaryfunc nb_true_divide;
     binaryfunc nb_inplace_floor_divide;
     binaryfunc nb_inplace_true_divide;

     unaryfunc nb_index;

     binaryfunc nb_matrix_multiply;
     binaryfunc nb_inplace_matrix_multiply;
@} PyNumberMethods;
@end example

@cartouche
@quotation Note 
Binary and ternary functions must check the type of all their operands,
and implement the necessary conversions (at least one of the operands is
an instance of the defined type).  If the operation is not defined for the
given operands, binary and ternary functions must return
@code{Py_NotImplemented}, if another error occurred they must return @code{NULL}
and set an exception.
@end quotation
@end cartouche

@cartouche
@quotation Note 
The @ref{59a7,,nb_reserved} field should always be @code{NULL}.  It
was previously called @code{nb_long}, and was renamed in
Python 3.0.1.
@end quotation
@end cartouche
@end deffn

@geindex PyNumberMethods.nb_add (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_add}@anchor{5642}
@deffn {C Member} @ref{5500,,binaryfunc} @ref{162a,,PyNumberMethods}.nb_add

` The corresponding @ref{543c,,slot ID} @code{Py_nb_add} is part of the @ref{776,,Stable ABI}.'
@geindex Py_nb_add (C macro)
@anchor{c-api/typeobj c Py_nb_add}@anchor{54b7}
@end deffn

@geindex PyNumberMethods.nb_subtract (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_subtract}@anchor{598e}
@deffn {C Member} @ref{5500,,binaryfunc} @ref{162a,,PyNumberMethods}.nb_subtract

` The corresponding @ref{543c,,slot ID} @code{Py_nb_subtract} is part of the @ref{776,,Stable ABI}.'
@geindex Py_nb_subtract (C macro)
@anchor{c-api/typeobj c Py_nb_subtract}@anchor{54d6}
@end deffn

@geindex PyNumberMethods.nb_multiply (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_multiply}@anchor{5990}
@deffn {C Member} @ref{5500,,binaryfunc} @ref{162a,,PyNumberMethods}.nb_multiply

` The corresponding @ref{543c,,slot ID} @code{Py_nb_multiply} is part of the @ref{776,,Stable ABI}.'
@geindex Py_nb_multiply (C macro)
@anchor{c-api/typeobj c Py_nb_multiply}@anchor{54cf}
@end deffn

@geindex PyNumberMethods.nb_remainder (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_remainder}@anchor{5992}
@deffn {C Member} @ref{5500,,binaryfunc} @ref{162a,,PyNumberMethods}.nb_remainder

` The corresponding @ref{543c,,slot ID} @code{Py_nb_remainder} is part of the @ref{776,,Stable ABI}.'
@geindex Py_nb_remainder (C macro)
@anchor{c-api/typeobj c Py_nb_remainder}@anchor{54d4}
@end deffn

@geindex PyNumberMethods.nb_divmod (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_divmod}@anchor{5994}
@deffn {C Member} @ref{5500,,binaryfunc} @ref{162a,,PyNumberMethods}.nb_divmod

` The corresponding @ref{543c,,slot ID} @code{Py_nb_divmod} is part of the @ref{776,,Stable ABI}.'
@geindex Py_nb_divmod (C macro)
@anchor{c-api/typeobj c Py_nb_divmod}@anchor{54ba}
@end deffn

@geindex PyNumberMethods.nb_power (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_power}@anchor{5995}
@deffn {C Member} @ref{5519,,ternaryfunc} @ref{162a,,PyNumberMethods}.nb_power

` The corresponding @ref{543c,,slot ID} @code{Py_nb_power} is part of the @ref{776,,Stable ABI}.'
@geindex Py_nb_power (C macro)
@anchor{c-api/typeobj c Py_nb_power}@anchor{54d3}
@end deffn

@geindex PyNumberMethods.nb_negative (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_negative}@anchor{5997}
@deffn {C Member} @ref{551b,,unaryfunc} @ref{162a,,PyNumberMethods}.nb_negative

` The corresponding @ref{543c,,slot ID} @code{Py_nb_negative} is part of the @ref{776,,Stable ABI}.'
@geindex Py_nb_negative (C macro)
@anchor{c-api/typeobj c Py_nb_negative}@anchor{54d0}
@end deffn

@geindex PyNumberMethods.nb_positive (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_positive}@anchor{5998}
@deffn {C Member} @ref{551b,,unaryfunc} @ref{162a,,PyNumberMethods}.nb_positive

` The corresponding @ref{543c,,slot ID} @code{Py_nb_positive} is part of the @ref{776,,Stable ABI}.'
@geindex Py_nb_positive (C macro)
@anchor{c-api/typeobj c Py_nb_positive}@anchor{54d2}
@end deffn

@geindex PyNumberMethods.nb_absolute (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_absolute}@anchor{5999}
@deffn {C Member} @ref{551b,,unaryfunc} @ref{162a,,PyNumberMethods}.nb_absolute

` The corresponding @ref{543c,,slot ID} @code{Py_nb_absolute} is part of the @ref{776,,Stable ABI}.'
@geindex Py_nb_absolute (C macro)
@anchor{c-api/typeobj c Py_nb_absolute}@anchor{54b6}
@end deffn

@geindex PyNumberMethods.nb_bool (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_bool}@anchor{599a}
@deffn {C Member} @ref{550b,,inquiry} @ref{162a,,PyNumberMethods}.nb_bool

` The corresponding @ref{543c,,slot ID} @code{Py_nb_bool} is part of the @ref{776,,Stable ABI}.'
@geindex Py_nb_bool (C macro)
@anchor{c-api/typeobj c Py_nb_bool}@anchor{54b9}
@end deffn

@geindex PyNumberMethods.nb_invert (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_invert}@anchor{599b}
@deffn {C Member} @ref{551b,,unaryfunc} @ref{162a,,PyNumberMethods}.nb_invert

` The corresponding @ref{543c,,slot ID} @code{Py_nb_invert} is part of the @ref{776,,Stable ABI}.'
@geindex Py_nb_invert (C macro)
@anchor{c-api/typeobj c Py_nb_invert}@anchor{54cc}
@end deffn

@geindex PyNumberMethods.nb_lshift (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_lshift}@anchor{599c}
@deffn {C Member} @ref{5500,,binaryfunc} @ref{162a,,PyNumberMethods}.nb_lshift

` The corresponding @ref{543c,,slot ID} @code{Py_nb_lshift} is part of the @ref{776,,Stable ABI}.'
@geindex Py_nb_lshift (C macro)
@anchor{c-api/typeobj c Py_nb_lshift}@anchor{54cd}
@end deffn

@geindex PyNumberMethods.nb_rshift (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_rshift}@anchor{599e}
@deffn {C Member} @ref{5500,,binaryfunc} @ref{162a,,PyNumberMethods}.nb_rshift

` The corresponding @ref{543c,,slot ID} @code{Py_nb_rshift} is part of the @ref{776,,Stable ABI}.'
@geindex Py_nb_rshift (C macro)
@anchor{c-api/typeobj c Py_nb_rshift}@anchor{54d5}
@end deffn

@geindex PyNumberMethods.nb_and (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_and}@anchor{59a0}
@deffn {C Member} @ref{5500,,binaryfunc} @ref{162a,,PyNumberMethods}.nb_and

` The corresponding @ref{543c,,slot ID} @code{Py_nb_and} is part of the @ref{776,,Stable ABI}.'
@geindex Py_nb_and (C macro)
@anchor{c-api/typeobj c Py_nb_and}@anchor{54b8}
@end deffn

@geindex PyNumberMethods.nb_xor (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_xor}@anchor{59a2}
@deffn {C Member} @ref{5500,,binaryfunc} @ref{162a,,PyNumberMethods}.nb_xor

` The corresponding @ref{543c,,slot ID} @code{Py_nb_xor} is part of the @ref{776,,Stable ABI}.'
@geindex Py_nb_xor (C macro)
@anchor{c-api/typeobj c Py_nb_xor}@anchor{54d8}
@end deffn

@geindex PyNumberMethods.nb_or (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_or}@anchor{59a4}
@deffn {C Member} @ref{5500,,binaryfunc} @ref{162a,,PyNumberMethods}.nb_or

` The corresponding @ref{543c,,slot ID} @code{Py_nb_or} is part of the @ref{776,,Stable ABI}.'
@geindex Py_nb_or (C macro)
@anchor{c-api/typeobj c Py_nb_or}@anchor{54d1}
@end deffn

@geindex PyNumberMethods.nb_int (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_int}@anchor{59a6}
@deffn {C Member} @ref{551b,,unaryfunc} @ref{162a,,PyNumberMethods}.nb_int

` The corresponding @ref{543c,,slot ID} @code{Py_nb_int} is part of the @ref{776,,Stable ABI}.'
@geindex Py_nb_int (C macro)
@anchor{c-api/typeobj c Py_nb_int}@anchor{54cb}
@end deffn

@geindex PyNumberMethods.nb_reserved (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_reserved}@anchor{59a7}
@deffn {C Member} void *@ref{162a,,PyNumberMethods}.nb_reserved
@end deffn

@geindex PyNumberMethods.nb_float (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_float}@anchor{59a8}
@deffn {C Member} @ref{551b,,unaryfunc} @ref{162a,,PyNumberMethods}.nb_float

` The corresponding @ref{543c,,slot ID} @code{Py_nb_float} is part of the @ref{776,,Stable ABI}.'
@geindex Py_nb_float (C macro)
@anchor{c-api/typeobj c Py_nb_float}@anchor{54bb}
@end deffn

@geindex PyNumberMethods.nb_inplace_add (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_inplace_add}@anchor{598d}
@deffn {C Member} @ref{5500,,binaryfunc} @ref{162a,,PyNumberMethods}.nb_inplace_add

` The corresponding @ref{543c,,slot ID} @code{Py_nb_inplace_add} is part of the @ref{776,,Stable ABI}.'
@geindex Py_nb_inplace_add (C macro)
@anchor{c-api/typeobj c Py_nb_inplace_add}@anchor{54be}
@end deffn

@geindex PyNumberMethods.nb_inplace_subtract (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_inplace_subtract}@anchor{598f}
@deffn {C Member} @ref{5500,,binaryfunc} @ref{162a,,PyNumberMethods}.nb_inplace_subtract

` The corresponding @ref{543c,,slot ID} @code{Py_nb_inplace_subtract} is part of the @ref{776,,Stable ABI}.'
@geindex Py_nb_inplace_subtract (C macro)
@anchor{c-api/typeobj c Py_nb_inplace_subtract}@anchor{54c8}
@end deffn

@geindex PyNumberMethods.nb_inplace_multiply (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_inplace_multiply}@anchor{5991}
@deffn {C Member} @ref{5500,,binaryfunc} @ref{162a,,PyNumberMethods}.nb_inplace_multiply

` The corresponding @ref{543c,,slot ID} @code{Py_nb_inplace_multiply} is part of the @ref{776,,Stable ABI}.'
@geindex Py_nb_inplace_multiply (C macro)
@anchor{c-api/typeobj c Py_nb_inplace_multiply}@anchor{54c3}
@end deffn

@geindex PyNumberMethods.nb_inplace_remainder (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_inplace_remainder}@anchor{5993}
@deffn {C Member} @ref{5500,,binaryfunc} @ref{162a,,PyNumberMethods}.nb_inplace_remainder

` The corresponding @ref{543c,,slot ID} @code{Py_nb_inplace_remainder} is part of the @ref{776,,Stable ABI}.'
@geindex Py_nb_inplace_remainder (C macro)
@anchor{c-api/typeobj c Py_nb_inplace_remainder}@anchor{54c6}
@end deffn

@geindex PyNumberMethods.nb_inplace_power (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_inplace_power}@anchor{5996}
@deffn {C Member} @ref{5519,,ternaryfunc} @ref{162a,,PyNumberMethods}.nb_inplace_power

` The corresponding @ref{543c,,slot ID} @code{Py_nb_inplace_power} is part of the @ref{776,,Stable ABI}.'
@geindex Py_nb_inplace_power (C macro)
@anchor{c-api/typeobj c Py_nb_inplace_power}@anchor{54c5}
@end deffn

@geindex PyNumberMethods.nb_inplace_lshift (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_inplace_lshift}@anchor{599d}
@deffn {C Member} @ref{5500,,binaryfunc} @ref{162a,,PyNumberMethods}.nb_inplace_lshift

` The corresponding @ref{543c,,slot ID} @code{Py_nb_inplace_lshift} is part of the @ref{776,,Stable ABI}.'
@geindex Py_nb_inplace_lshift (C macro)
@anchor{c-api/typeobj c Py_nb_inplace_lshift}@anchor{54c1}
@end deffn

@geindex PyNumberMethods.nb_inplace_rshift (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_inplace_rshift}@anchor{599f}
@deffn {C Member} @ref{5500,,binaryfunc} @ref{162a,,PyNumberMethods}.nb_inplace_rshift

` The corresponding @ref{543c,,slot ID} @code{Py_nb_inplace_rshift} is part of the @ref{776,,Stable ABI}.'
@geindex Py_nb_inplace_rshift (C macro)
@anchor{c-api/typeobj c Py_nb_inplace_rshift}@anchor{54c7}
@end deffn

@geindex PyNumberMethods.nb_inplace_and (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_inplace_and}@anchor{59a1}
@deffn {C Member} @ref{5500,,binaryfunc} @ref{162a,,PyNumberMethods}.nb_inplace_and

` The corresponding @ref{543c,,slot ID} @code{Py_nb_inplace_and} is part of the @ref{776,,Stable ABI}.'
@geindex Py_nb_inplace_and (C macro)
@anchor{c-api/typeobj c Py_nb_inplace_and}@anchor{54bf}
@end deffn

@geindex PyNumberMethods.nb_inplace_xor (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_inplace_xor}@anchor{59a3}
@deffn {C Member} @ref{5500,,binaryfunc} @ref{162a,,PyNumberMethods}.nb_inplace_xor

` The corresponding @ref{543c,,slot ID} @code{Py_nb_inplace_xor} is part of the @ref{776,,Stable ABI}.'
@geindex Py_nb_inplace_xor (C macro)
@anchor{c-api/typeobj c Py_nb_inplace_xor}@anchor{54ca}
@end deffn

@geindex PyNumberMethods.nb_inplace_or (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_inplace_or}@anchor{59a5}
@deffn {C Member} @ref{5500,,binaryfunc} @ref{162a,,PyNumberMethods}.nb_inplace_or

` The corresponding @ref{543c,,slot ID} @code{Py_nb_inplace_or} is part of the @ref{776,,Stable ABI}.'
@geindex Py_nb_inplace_or (C macro)
@anchor{c-api/typeobj c Py_nb_inplace_or}@anchor{54c4}
@end deffn

@geindex PyNumberMethods.nb_floor_divide (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_floor_divide}@anchor{59a9}
@deffn {C Member} @ref{5500,,binaryfunc} @ref{162a,,PyNumberMethods}.nb_floor_divide

` The corresponding @ref{543c,,slot ID} @code{Py_nb_floor_divide} is part of the @ref{776,,Stable ABI}.'
@geindex Py_nb_floor_divide (C macro)
@anchor{c-api/typeobj c Py_nb_floor_divide}@anchor{54bc}
@end deffn

@geindex PyNumberMethods.nb_true_divide (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_true_divide}@anchor{59ab}
@deffn {C Member} @ref{5500,,binaryfunc} @ref{162a,,PyNumberMethods}.nb_true_divide

` The corresponding @ref{543c,,slot ID} @code{Py_nb_true_divide} is part of the @ref{776,,Stable ABI}.'
@geindex Py_nb_true_divide (C macro)
@anchor{c-api/typeobj c Py_nb_true_divide}@anchor{54d7}
@end deffn

@geindex PyNumberMethods.nb_inplace_floor_divide (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_inplace_floor_divide}@anchor{59aa}
@deffn {C Member} @ref{5500,,binaryfunc} @ref{162a,,PyNumberMethods}.nb_inplace_floor_divide

` The corresponding @ref{543c,,slot ID} @code{Py_nb_inplace_floor_divide} is part of the @ref{776,,Stable ABI}.'
@geindex Py_nb_inplace_floor_divide (C macro)
@anchor{c-api/typeobj c Py_nb_inplace_floor_divide}@anchor{54c0}
@end deffn

@geindex PyNumberMethods.nb_inplace_true_divide (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_inplace_true_divide}@anchor{59ac}
@deffn {C Member} @ref{5500,,binaryfunc} @ref{162a,,PyNumberMethods}.nb_inplace_true_divide

` The corresponding @ref{543c,,slot ID} @code{Py_nb_inplace_true_divide} is part of the @ref{776,,Stable ABI}.'
@geindex Py_nb_inplace_true_divide (C macro)
@anchor{c-api/typeobj c Py_nb_inplace_true_divide}@anchor{54c9}
@end deffn

@geindex PyNumberMethods.nb_index (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_index}@anchor{1629}
@deffn {C Member} @ref{551b,,unaryfunc} @ref{162a,,PyNumberMethods}.nb_index

` The corresponding @ref{543c,,slot ID} @code{Py_nb_index} is part of the @ref{776,,Stable ABI}.'
@geindex Py_nb_index (C macro)
@anchor{c-api/typeobj c Py_nb_index}@anchor{54bd}
@end deffn

@geindex PyNumberMethods.nb_matrix_multiply (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_matrix_multiply}@anchor{59ad}
@deffn {C Member} @ref{5500,,binaryfunc} @ref{162a,,PyNumberMethods}.nb_matrix_multiply

` The corresponding @ref{543c,,slot ID} @code{Py_nb_matrix_multiply} is part of the @ref{776,,Stable ABI} since version 3.5.'
@geindex Py_nb_matrix_multiply (C macro)
@anchor{c-api/typeobj c Py_nb_matrix_multiply}@anchor{54ce}
@end deffn

@geindex PyNumberMethods.nb_inplace_matrix_multiply (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_inplace_matrix_multiply}@anchor{59ae}
@deffn {C Member} @ref{5500,,binaryfunc} @ref{162a,,PyNumberMethods}.nb_inplace_matrix_multiply

` The corresponding @ref{543c,,slot ID} @code{Py_nb_inplace_matrix_multiply} is part of the @ref{776,,Stable ABI} since version 3.5.'
@geindex Py_nb_inplace_matrix_multiply (C macro)
@anchor{c-api/typeobj c Py_nb_inplace_matrix_multiply}@anchor{54c2}
@end deffn

@node Mapping Object Structures,Sequence Object Structures,Number Object Structures,Type Object Structures
@anchor{c-api/typeobj mapping-object-structures}@anchor{59d3}@anchor{c-api/typeobj mapping-structs}@anchor{59c0}
@subsubsection Mapping Object Structures


@geindex PyMappingMethods (C type)
@anchor{c-api/typeobj c PyMappingMethods}@anchor{5255}
@deffn {C Type} type PyMappingMethods

This structure holds pointers to the functions which an object uses to
implement the mapping protocol.  It has three members:
@end deffn

@geindex PyMappingMethods.mp_length (C member)
@anchor{c-api/typeobj c PyMappingMethods mp_length}@anchor{59af}
@deffn {C Member} @ref{550d,,lenfunc} @ref{5255,,PyMappingMethods}.mp_length

` The corresponding @ref{543c,,slot ID} @code{Py_mp_length} is part of the @ref{776,,Stable ABI}.'
@geindex Py_mp_length (C macro)
@anchor{c-api/typeobj c Py_mp_length}@anchor{54b4}

This function is used by @ref{1e79,,PyMapping_Size()} and
@ref{53f8,,PyObject_Size()}, and has the same signature.  This slot may be set to
@code{NULL} if the object has no defined length.
@end deffn

@geindex PyMappingMethods.mp_subscript (C member)
@anchor{c-api/typeobj c PyMappingMethods mp_subscript}@anchor{1d3a}
@deffn {C Member} @ref{5500,,binaryfunc} @ref{5255,,PyMappingMethods}.mp_subscript

` The corresponding @ref{543c,,slot ID} @code{Py_mp_subscript} is part of the @ref{776,,Stable ABI}.'
@geindex Py_mp_subscript (C macro)
@anchor{c-api/typeobj c Py_mp_subscript}@anchor{54b5}

This function is used by @ref{5ea,,PyObject_GetItem()} and
@ref{5404,,PySequence_GetSlice()}, and has the same signature as
@code{PyObject_GetItem()}.  This slot must be filled for the
@ref{53b1,,PyMapping_Check()} function to return @code{1}, it can be @code{NULL}
otherwise.
@end deffn

@geindex PyMappingMethods.mp_ass_subscript (C member)
@anchor{c-api/typeobj c PyMappingMethods mp_ass_subscript}@anchor{59b0}
@deffn {C Member} @ref{550f,,objobjargproc} @ref{5255,,PyMappingMethods}.mp_ass_subscript

` The corresponding @ref{543c,,slot ID} @code{Py_mp_ass_subscript} is part of the @ref{776,,Stable ABI}.'
@geindex Py_mp_ass_subscript (C macro)
@anchor{c-api/typeobj c Py_mp_ass_subscript}@anchor{54b3}

This function is used by @ref{52a8,,PyObject_SetItem()},
@ref{53eb,,PyObject_DelItem()}, @ref{540b,,PySequence_SetSlice()} and
@ref{5403,,PySequence_DelSlice()}.  It has the same signature as
@code{PyObject_SetItem()}, but `v' can also be set to @code{NULL} to delete
an item.  If this slot is @code{NULL}, the object does not support item
assignment and deletion.
@end deffn

@node Sequence Object Structures,Buffer Object Structures,Mapping Object Structures,Type Object Structures
@anchor{c-api/typeobj sequence-object-structures}@anchor{59d4}@anchor{c-api/typeobj sequence-structs}@anchor{59bf}
@subsubsection Sequence Object Structures


@geindex PySequenceMethods (C type)
@anchor{c-api/typeobj c PySequenceMethods}@anchor{5254}
@deffn {C Type} type PySequenceMethods

This structure holds pointers to the functions which an object uses to
implement the sequence protocol.
@end deffn

@geindex PySequenceMethods.sq_length (C member)
@anchor{c-api/typeobj c PySequenceMethods sq_length}@anchor{564b}
@deffn {C Member} @ref{550d,,lenfunc} @ref{5254,,PySequenceMethods}.sq_length

` The corresponding @ref{543c,,slot ID} @code{Py_sq_length} is part of the @ref{776,,Stable ABI}.'
@geindex Py_sq_length (C macro)
@anchor{c-api/typeobj c Py_sq_length}@anchor{54df}

This function is used by @ref{1e75,,PySequence_Size()} and
@ref{53f8,,PyObject_Size()}, and has the same signature.  It is also used for
handling negative indices via the @ref{1d39,,sq_item}
and the @ref{59b3,,sq_ass_item} slots.
@end deffn

@geindex PySequenceMethods.sq_concat (C member)
@anchor{c-api/typeobj c PySequenceMethods sq_concat}@anchor{59b1}
@deffn {C Member} @ref{5500,,binaryfunc} @ref{5254,,PySequenceMethods}.sq_concat

` The corresponding @ref{543c,,slot ID} @code{Py_sq_concat} is part of the @ref{776,,Stable ABI}.'
@geindex Py_sq_concat (C macro)
@anchor{c-api/typeobj c Py_sq_concat}@anchor{54da}

This function is used by @ref{5401,,PySequence_Concat()} and has the same
signature.  It is also used by the @code{+} operator, after trying the numeric
addition via the @ref{5642,,nb_add} slot.
@end deffn

@geindex PySequenceMethods.sq_repeat (C member)
@anchor{c-api/typeobj c PySequenceMethods sq_repeat}@anchor{59b2}
@deffn {C Member} @ref{5517,,ssizeargfunc} @ref{5254,,PySequenceMethods}.sq_repeat

` The corresponding @ref{543c,,slot ID} @code{Py_sq_repeat} is part of the @ref{776,,Stable ABI}.'
@geindex Py_sq_repeat (C macro)
@anchor{c-api/typeobj c Py_sq_repeat}@anchor{54e0}

This function is used by @ref{540a,,PySequence_Repeat()} and has the same
signature.  It is also used by the @code{*} operator, after trying numeric
multiplication via the @ref{5990,,nb_multiply} slot.
@end deffn

@geindex PySequenceMethods.sq_item (C member)
@anchor{c-api/typeobj c PySequenceMethods sq_item}@anchor{1d39}
@deffn {C Member} @ref{5517,,ssizeargfunc} @ref{5254,,PySequenceMethods}.sq_item

` The corresponding @ref{543c,,slot ID} @code{Py_sq_item} is part of the @ref{776,,Stable ABI}.'
@geindex Py_sq_item (C macro)
@anchor{c-api/typeobj c Py_sq_item}@anchor{54de}

This function is used by @ref{1e76,,PySequence_GetItem()} and has the same
signature.  It is also used by @ref{5ea,,PyObject_GetItem()}, after trying
the subscription via the @ref{1d3a,,mp_subscript} slot.
This slot must be filled for the @ref{5400,,PySequence_Check()}
function to return @code{1}, it can be @code{NULL} otherwise.

Negative indexes are handled as follows: if the @ref{564b,,sq_length} slot is
filled, it is called and the sequence length is used to compute a positive
index which is passed to  @ref{1d39,,sq_item}.  If @code{sq_length} is @code{NULL},
the index is passed as is to the function.
@end deffn

@geindex PySequenceMethods.sq_ass_item (C member)
@anchor{c-api/typeobj c PySequenceMethods sq_ass_item}@anchor{59b3}
@deffn {C Member} @ref{5518,,ssizeobjargproc} @ref{5254,,PySequenceMethods}.sq_ass_item

` The corresponding @ref{543c,,slot ID} @code{Py_sq_ass_item} is part of the @ref{776,,Stable ABI}.'
@geindex Py_sq_ass_item (C macro)
@anchor{c-api/typeobj c Py_sq_ass_item}@anchor{54d9}

This function is used by @ref{1e77,,PySequence_SetItem()} and has the same
signature.  It is also used by @ref{52a8,,PyObject_SetItem()} and
@ref{53eb,,PyObject_DelItem()}, after trying the item assignment and deletion
via the @ref{59b0,,mp_ass_subscript} slot.
This slot may be left to @code{NULL} if the object does not support
item assignment and deletion.
@end deffn

@geindex PySequenceMethods.sq_contains (C member)
@anchor{c-api/typeobj c PySequenceMethods sq_contains}@anchor{59b4}
@deffn {C Member} @ref{5510,,objobjproc} @ref{5254,,PySequenceMethods}.sq_contains

` The corresponding @ref{543c,,slot ID} @code{Py_sq_contains} is part of the @ref{776,,Stable ABI}.'
@geindex Py_sq_contains (C macro)
@anchor{c-api/typeobj c Py_sq_contains}@anchor{54db}

This function may be used by @ref{3d7,,PySequence_Contains()} and has the same
signature.  This slot may be left to @code{NULL}, in this case
@code{PySequence_Contains()} simply traverses the sequence until it
finds a match.
@end deffn

@geindex PySequenceMethods.sq_inplace_concat (C member)
@anchor{c-api/typeobj c PySequenceMethods sq_inplace_concat}@anchor{59b5}
@deffn {C Member} @ref{5500,,binaryfunc} @ref{5254,,PySequenceMethods}.sq_inplace_concat

` The corresponding @ref{543c,,slot ID} @code{Py_sq_inplace_concat} is part of the @ref{776,,Stable ABI}.'
@geindex Py_sq_inplace_concat (C macro)
@anchor{c-api/typeobj c Py_sq_inplace_concat}@anchor{54dc}

This function is used by @ref{5405,,PySequence_InPlaceConcat()} and has the same
signature.  It should modify its first operand, and return it.  This slot
may be left to @code{NULL}, in this case @code{PySequence_InPlaceConcat()}
will fall back to @ref{5401,,PySequence_Concat()}.  It is also used by the
augmented assignment @code{+=}, after trying numeric in-place addition
via the @ref{598d,,nb_inplace_add} slot.
@end deffn

@geindex PySequenceMethods.sq_inplace_repeat (C member)
@anchor{c-api/typeobj c PySequenceMethods sq_inplace_repeat}@anchor{59b6}
@deffn {C Member} @ref{5517,,ssizeargfunc} @ref{5254,,PySequenceMethods}.sq_inplace_repeat

` The corresponding @ref{543c,,slot ID} @code{Py_sq_inplace_repeat} is part of the @ref{776,,Stable ABI}.'
@geindex Py_sq_inplace_repeat (C macro)
@anchor{c-api/typeobj c Py_sq_inplace_repeat}@anchor{54dd}

This function is used by @ref{5406,,PySequence_InPlaceRepeat()} and has the same
signature.  It should modify its first operand, and return it.  This slot
may be left to @code{NULL}, in this case @code{PySequence_InPlaceRepeat()}
will fall back to @ref{540a,,PySequence_Repeat()}.  It is also used by the
augmented assignment @code{*=}, after trying numeric in-place multiplication
via the @ref{5991,,nb_inplace_multiply} slot.
@end deffn

@node Buffer Object Structures,Async Object Structures,Sequence Object Structures,Type Object Structures
@anchor{c-api/typeobj buffer-object-structures}@anchor{59d5}@anchor{c-api/typeobj buffer-structs}@anchor{5617}
@subsubsection Buffer Object Structures


@geindex PyBufferProcs (C type)
@anchor{c-api/typeobj c PyBufferProcs}@anchor{5651}
@deffn {C Type} type PyBufferProcs

This structure holds pointers to the functions required by the
@ref{262,,Buffer protocol}. The protocol defines how
an exporter object can expose its internal data to consumer objects.
@end deffn

@geindex PyBufferProcs.bf_getbuffer (C member)
@anchor{c-api/typeobj c PyBufferProcs bf_getbuffer}@anchor{96b}
@deffn {C Member} @ref{5506,,getbufferproc} @ref{5651,,PyBufferProcs}.bf_getbuffer

` The corresponding @ref{543c,,slot ID} @code{Py_bf_getbuffer} is part of the @ref{776,,Stable ABI} since version 3.11.'
@geindex Py_bf_getbuffer (C macro)
@anchor{c-api/typeobj c Py_bf_getbuffer}@anchor{54af}

The signature of this function is:

@example
int (PyObject *exporter, Py_buffer *view, int flags);
@end example

Handle a request to `exporter' to fill in `view' as specified by `flags'.
Except for point (3), an implementation of this function MUST take these
steps:


@enumerate 

@item 
Check if the request can be met. If not, raise @ref{17e9,,BufferError},
set @code{view->obj} to @code{NULL} and return @code{-1}.

@item 
Fill in the requested fields.

@item 
Increment an internal counter for the number of exports.

@item 
Set @code{view->obj} to `exporter' and increment @code{view->obj}.

@item 
Return @code{0}.
@end enumerate

`Thread safety:'

In the @ref{1791,,free-threaded build}, implementations must ensure:


@itemize *

@item 
The export counter increment in step (3) is atomic.

@item 
The underlying buffer data remains valid and at a stable memory
location for the lifetime of all exports.

@item 
For objects that support resizing or reallocation (such as
@ref{342,,bytearray}), the export counter is checked atomically before
such operations, and @ref{17e9,,BufferError} is raised if exports exist.

@item 
The function is safe to call concurrently from multiple threads.
@end itemize

See also @ref{2458,,Thread safety for memoryview objects} for the Python-level
thread safety guarantees of @ref{166,,memoryview} objects.

If `exporter' is part of a chain or tree of buffer providers, two main
schemes can be used:


@itemize *

@item 
Re-export: Each member of the tree acts as the exporting object and
sets @code{view->obj} to a new reference to itself.

@item 
Redirect: The buffer request is redirected to the root object of the
tree. Here, @code{view->obj} will be a new reference to the root
object.
@end itemize

The individual fields of `view' are described in section
@ref{5618,,Buffer structure}, the rules how an exporter
must react to specific requests are in section
@ref{4dbc,,Buffer request types}.

All memory pointed to in the @ref{961,,Py_buffer} structure belongs to
the exporter and must remain valid until there are no consumers left.
@ref{5621,,format}, @ref{5622,,shape},
@ref{561c,,strides}, @ref{5624,,suboffsets}
and @ref{5626,,internal}
are read-only for the consumer.

@ref{969,,PyBuffer_FillInfo()} provides an easy way of exposing a simple
bytes buffer while dealing correctly with all request types.

@ref{63a,,PyObject_GetBuffer()} is the interface for the consumer that
wraps this function.
@end deffn

@geindex PyBufferProcs.bf_releasebuffer (C member)
@anchor{c-api/typeobj c PyBufferProcs bf_releasebuffer}@anchor{96c}
@deffn {C Member} @ref{5511,,releasebufferproc} @ref{5651,,PyBufferProcs}.bf_releasebuffer

` The corresponding @ref{543c,,slot ID} @code{Py_bf_releasebuffer} is part of the @ref{776,,Stable ABI} since version 3.11.'
@geindex Py_bf_releasebuffer (C macro)
@anchor{c-api/typeobj c Py_bf_releasebuffer}@anchor{54b0}

The signature of this function is:

@example
void (PyObject *exporter, Py_buffer *view);
@end example

Handle a request to release the resources of the buffer. If no resources
need to be released, @ref{96c,,PyBufferProcs.bf_releasebuffer} may be
@code{NULL}. Otherwise, a standard implementation of this function will take
these optional steps:


@enumerate 

@item 
Decrement an internal counter for the number of exports.

@item 
If the counter is @code{0}, free all memory associated with `view'.
@end enumerate

`Thread safety:'

In the @ref{1791,,free-threaded build}:


@itemize *

@item 
The export counter decrement in step (1) must be atomic.

@item 
Resource cleanup when the counter reaches zero must be done atomically,
as the final release may race with concurrent releases from other
threads and dellocation must only happen once.
@end itemize

The exporter MUST use the @ref{5626,,internal} field to keep
track of buffer-specific resources. This field is guaranteed to remain
constant, while a consumer MAY pass a copy of the original buffer as the
`view' argument.

This function MUST NOT decrement @code{view->obj}, since that is
done automatically in @ref{63b,,PyBuffer_Release()} (this scheme is
useful for breaking reference cycles).

@ref{63b,,PyBuffer_Release()} is the interface for the consumer that
wraps this function.
@end deffn

@node Async Object Structures,Slot Type typedefs,Buffer Object Structures,Type Object Structures
@anchor{c-api/typeobj async-object-structures}@anchor{59d6}@anchor{c-api/typeobj async-structs}@anchor{59bd}
@subsubsection Async Object Structures



Added in version 3.5.


@geindex PyAsyncMethods (C type)
@anchor{c-api/typeobj c PyAsyncMethods}@anchor{564a}
@deffn {C Type} type PyAsyncMethods

This structure holds pointers to the functions required to implement
@ref{4ca,,awaitable} and @ref{4c8,,asynchronous iterator} objects.

Here is the structure definition:

@example
typedef struct @{
    unaryfunc am_await;
    unaryfunc am_aiter;
    unaryfunc am_anext;
    sendfunc am_send;
@} PyAsyncMethods;
@end example
@end deffn

@geindex PyAsyncMethods.am_await (C member)
@anchor{c-api/typeobj c PyAsyncMethods am_await}@anchor{5988}
@deffn {C Member} @ref{551b,,unaryfunc} @ref{564a,,PyAsyncMethods}.am_await

` The corresponding @ref{543c,,slot ID} @code{Py_am_await} is part of the @ref{776,,Stable ABI} since version 3.5.'
@geindex Py_am_await (C macro)
@anchor{c-api/typeobj c Py_am_await}@anchor{54ad}

The signature of this function is:

@example
PyObject *am_await(PyObject *self);
@end example

The returned object must be an @ref{4c9,,iterator}, i.e. @ref{1cf3,,PyIter_Check()}
must return @code{1} for it.

This slot may be set to @code{NULL} if an object is not an @ref{4ca,,awaitable}.
@end deffn

@geindex PyAsyncMethods.am_aiter (C member)
@anchor{c-api/typeobj c PyAsyncMethods am_aiter}@anchor{5989}
@deffn {C Member} @ref{551b,,unaryfunc} @ref{564a,,PyAsyncMethods}.am_aiter

` The corresponding @ref{543c,,slot ID} @code{Py_am_aiter} is part of the @ref{776,,Stable ABI} since version 3.5.'
@geindex Py_am_aiter (C macro)
@anchor{c-api/typeobj c Py_am_aiter}@anchor{54ab}

The signature of this function is:

@example
PyObject *am_aiter(PyObject *self);
@end example

Must return an @ref{4c8,,asynchronous iterator} object.
See @ref{18ca,,__anext__()} for details.

This slot may be set to @code{NULL} if an object does not implement
asynchronous iteration protocol.
@end deffn

@geindex PyAsyncMethods.am_anext (C member)
@anchor{c-api/typeobj c PyAsyncMethods am_anext}@anchor{598a}
@deffn {C Member} @ref{551b,,unaryfunc} @ref{564a,,PyAsyncMethods}.am_anext

` The corresponding @ref{543c,,slot ID} @code{Py_am_anext} is part of the @ref{776,,Stable ABI} since version 3.5.'
@geindex Py_am_anext (C macro)
@anchor{c-api/typeobj c Py_am_anext}@anchor{54ac}

The signature of this function is:

@example
PyObject *am_anext(PyObject *self);
@end example

Must return an @ref{4ca,,awaitable} object.
See @ref{18ca,,__anext__()} for details.
This slot may be set to @code{NULL}.
@end deffn

@geindex PyAsyncMethods.am_send (C member)
@anchor{c-api/typeobj c PyAsyncMethods am_send}@anchor{598b}
@deffn {C Member} @ref{598c,,sendfunc} @ref{564a,,PyAsyncMethods}.am_send

` The corresponding @ref{543c,,slot ID} @code{Py_am_send} is part of the @ref{776,,Stable ABI} since version 3.10.'
@geindex Py_am_send (C macro)
@anchor{c-api/typeobj c Py_am_send}@anchor{54ae}

The signature of this function is:

@example
PySendResult am_send(PyObject *self, PyObject *arg, PyObject **result);
@end example

See @ref{a9e,,PyIter_Send()} for details.
This slot may be set to @code{NULL}.


Added in version 3.10.

@end deffn

@node Slot Type typedefs,Examples<39>,Async Object Structures,Type Object Structures
@anchor{c-api/typeobj id6}@anchor{59b8}@anchor{c-api/typeobj slot-type-typedefs}@anchor{59d7}
@subsubsection Slot Type typedefs


@geindex allocfunc (C type)
@anchor{c-api/typeobj c allocfunc}@anchor{54ff}
@deffn {C Type} typedef @ref{5df,,PyObject} *(*allocfunc)(@ref{ca2,,PyTypeObject} *cls, @ref{c5b,,Py_ssize_t} nitems)
` Part of the @ref{776,,Stable ABI}.'
The purpose of this function is to separate memory allocation from memory
initialization.  It should return a pointer to a block of memory of adequate
length for the instance, suitably aligned, and initialized to zeros, but with
@ref{aa5,,ob_refcnt} set to @code{1} and @ref{522d,,ob_type} set to the type argument.  If
the type’s @ref{2402,,tp_itemsize} is non-zero, the object’s @ref{547c,,ob_size} field
should be initialized to `nitems' and the length of the allocated memory block
should be @code{tp_basicsize + nitems*tp_itemsize}, rounded up to a multiple of
@code{sizeof(void*)}; otherwise, `nitems' is not used and the length of the block
should be @ref{b84,,tp_basicsize}.

This function should not do any other instance initialization, not even to
allocate additional memory; that should be done by @ref{7a0,,tp_new}.
@end deffn

@geindex destructor (C type)
@anchor{c-api/typeobj c destructor}@anchor{5503}
@deffn {C Type} typedef void (*destructor)(@ref{5df,,PyObject}*)
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@geindex freefunc (C type)
@anchor{c-api/typeobj c freefunc}@anchor{57a4}
@deffn {C Type} typedef void (*freefunc)(void*)

See @ref{522f,,tp_free}.
@end deffn

@geindex newfunc (C type)
@anchor{c-api/typeobj c newfunc}@anchor{550e}
@deffn {C Type} typedef @ref{5df,,PyObject} *(*newfunc)(@ref{ca2,,PyTypeObject}*, @ref{5df,,PyObject}*, @ref{5df,,PyObject}*)
` Part of the @ref{776,,Stable ABI}.'
See @ref{7a0,,tp_new}.
@end deffn

@geindex initproc (C type)
@anchor{c-api/typeobj c initproc}@anchor{550a}
@deffn {C Type} typedef int (*initproc)(@ref{5df,,PyObject}*, @ref{5df,,PyObject}*, @ref{5df,,PyObject}*)
` Part of the @ref{776,,Stable ABI}.'
See @ref{7a2,,tp_init}.
@end deffn

@geindex reprfunc (C type)
@anchor{c-api/typeobj c reprfunc}@anchor{5512}
@deffn {C Type} typedef @ref{5df,,PyObject} *(*reprfunc)(@ref{5df,,PyObject}*)
` Part of the @ref{776,,Stable ABI}.'
See @ref{5244,,tp_repr}.
@end deffn

@geindex getattrfunc (C type)
@anchor{c-api/typeobj c getattrfunc}@anchor{5504}
@deffn {C Type} typedef @ref{5df,,PyObject} *(*getattrfunc)(@ref{5df,,PyObject} *self, char *attr)
` Part of the @ref{776,,Stable ABI}.'
Return the value of the named attribute for the object.
@end deffn

@geindex setattrfunc (C type)
@anchor{c-api/typeobj c setattrfunc}@anchor{5514}
@deffn {C Type} typedef int (*setattrfunc)(@ref{5df,,PyObject} *self, char *attr, @ref{5df,,PyObject} *value)
` Part of the @ref{776,,Stable ABI}.'
Set the value of the named attribute for the object.
The value argument is set to @code{NULL} to delete the attribute.
@end deffn

@geindex getattrofunc (C type)
@anchor{c-api/typeobj c getattrofunc}@anchor{5505}
@deffn {C Type} typedef @ref{5df,,PyObject} *(*getattrofunc)(@ref{5df,,PyObject} *self, @ref{5df,,PyObject} *attr)
` Part of the @ref{776,,Stable ABI}.'
Return the value of the named attribute for the object.

See @ref{1aaa,,tp_getattro}.
@end deffn

@geindex setattrofunc (C type)
@anchor{c-api/typeobj c setattrofunc}@anchor{5515}
@deffn {C Type} typedef int (*setattrofunc)(@ref{5df,,PyObject} *self, @ref{5df,,PyObject} *attr, @ref{5df,,PyObject} *value)
` Part of the @ref{776,,Stable ABI}.'
Set the value of the named attribute for the object.
The value argument is set to @code{NULL} to delete the attribute.

See @ref{5248,,tp_setattro}.
@end deffn

@geindex descrgetfunc (C type)
@anchor{c-api/typeobj c descrgetfunc}@anchor{5501}
@deffn {C Type} typedef @ref{5df,,PyObject} *(*descrgetfunc)(@ref{5df,,PyObject}*, @ref{5df,,PyObject}*, @ref{5df,,PyObject}*)
` Part of the @ref{776,,Stable ABI}.'
See @ref{5981,,tp_descr_get}.
@end deffn

@geindex descrsetfunc (C type)
@anchor{c-api/typeobj c descrsetfunc}@anchor{5502}
@deffn {C Type} typedef int (*descrsetfunc)(@ref{5df,,PyObject}*, @ref{5df,,PyObject}*, @ref{5df,,PyObject}*)
` Part of the @ref{776,,Stable ABI}.'
See @ref{1cf5,,tp_descr_set}.
@end deffn

@geindex hashfunc (C type)
@anchor{c-api/typeobj c hashfunc}@anchor{5509}
@deffn {C Type} typedef @ref{146f,,Py_hash_t} (*hashfunc)(@ref{5df,,PyObject}*)
` Part of the @ref{776,,Stable ABI}.'
See @ref{5256,,tp_hash}.
@end deffn

@geindex richcmpfunc (C type)
@anchor{c-api/typeobj c richcmpfunc}@anchor{5513}
@deffn {C Type} typedef @ref{5df,,PyObject} *(*richcmpfunc)(@ref{5df,,PyObject}*, @ref{5df,,PyObject}*, int)
` Part of the @ref{776,,Stable ABI}.'
See @ref{5250,,tp_richcompare}.
@end deffn

@geindex getiterfunc (C type)
@anchor{c-api/typeobj c getiterfunc}@anchor{5507}
@deffn {C Type} typedef @ref{5df,,PyObject} *(*getiterfunc)(@ref{5df,,PyObject}*)
` Part of the @ref{776,,Stable ABI}.'
See @ref{16fb,,tp_iter}.
@end deffn

@geindex iternextfunc (C type)
@anchor{c-api/typeobj c iternextfunc}@anchor{550c}
@deffn {C Type} typedef @ref{5df,,PyObject} *(*iternextfunc)(@ref{5df,,PyObject}*)
` Part of the @ref{776,,Stable ABI}.'
See @ref{16fc,,tp_iternext}.
@end deffn

@geindex lenfunc (C type)
@anchor{c-api/typeobj c lenfunc}@anchor{550d}
@deffn {C Type} typedef @ref{c5b,,Py_ssize_t} (*lenfunc)(@ref{5df,,PyObject}*)
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@geindex getbufferproc (C type)
@anchor{c-api/typeobj c getbufferproc}@anchor{5506}
@deffn {C Type} typedef int (*getbufferproc)(@ref{5df,,PyObject}*, @ref{961,,Py_buffer}*, int)
` Part of the @ref{776,,Stable ABI} since version 3.12.'
@end deffn

@geindex releasebufferproc (C type)
@anchor{c-api/typeobj c releasebufferproc}@anchor{5511}
@deffn {C Type} typedef void (*releasebufferproc)(@ref{5df,,PyObject}*, @ref{961,,Py_buffer}*)
` Part of the @ref{776,,Stable ABI} since version 3.12.'
@end deffn

@geindex unaryfunc (C type)
@anchor{c-api/typeobj c unaryfunc}@anchor{551b}
@deffn {C Type} typedef @ref{5df,,PyObject} *(*unaryfunc)(@ref{5df,,PyObject}*)
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@geindex binaryfunc (C type)
@anchor{c-api/typeobj c binaryfunc}@anchor{5500}
@deffn {C Type} typedef @ref{5df,,PyObject} *(*binaryfunc)(@ref{5df,,PyObject}*, @ref{5df,,PyObject}*)
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@geindex sendfunc (C type)
@anchor{c-api/typeobj c sendfunc}@anchor{598c}
@deffn {C Type} typedef @ref{5613,,PySendResult} (*sendfunc)(@ref{5df,,PyObject}*, @ref{5df,,PyObject}*, @ref{5df,,PyObject}**)

See @ref{598b,,am_send}.
@end deffn

@geindex ternaryfunc (C type)
@anchor{c-api/typeobj c ternaryfunc}@anchor{5519}
@deffn {C Type} typedef @ref{5df,,PyObject} *(*ternaryfunc)(@ref{5df,,PyObject}*, @ref{5df,,PyObject}*, @ref{5df,,PyObject}*)
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@geindex ssizeargfunc (C type)
@anchor{c-api/typeobj c ssizeargfunc}@anchor{5517}
@deffn {C Type} typedef @ref{5df,,PyObject} *(*ssizeargfunc)(@ref{5df,,PyObject}*, @ref{c5b,,Py_ssize_t})
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@geindex ssizeobjargproc (C type)
@anchor{c-api/typeobj c ssizeobjargproc}@anchor{5518}
@deffn {C Type} typedef int (*ssizeobjargproc)(@ref{5df,,PyObject}*, @ref{c5b,,Py_ssize_t}, @ref{5df,,PyObject}*)
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@geindex objobjproc (C type)
@anchor{c-api/typeobj c objobjproc}@anchor{5510}
@deffn {C Type} typedef int (*objobjproc)(@ref{5df,,PyObject}*, @ref{5df,,PyObject}*)
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@geindex objobjargproc (C type)
@anchor{c-api/typeobj c objobjargproc}@anchor{550f}
@deffn {C Type} typedef int (*objobjargproc)(@ref{5df,,PyObject}*, @ref{5df,,PyObject}*, @ref{5df,,PyObject}*)
` Part of the @ref{776,,Stable ABI}.'
@end deffn

@node Examples<39>,,Slot Type typedefs,Type Object Structures
@anchor{c-api/typeobj examples}@anchor{59d8}@anchor{c-api/typeobj typedef-examples}@anchor{5979}
@subsubsection Examples


The following are simple examples of Python type definitions.  They
include common usage you may encounter.  Some demonstrate tricky corner
cases.  For more examples, practical info, and a tutorial, see
@ref{5225,,Defining Extension Types; Tutorial} and @ref{523e,,Defining Extension Types; Assorted Topics}.

A basic @ref{988,,static type}:

@example
typedef struct @{
    PyObject_HEAD
    const char *data;
@} MyObject;

static PyTypeObject MyObject_Type = @{
    PyVarObject_HEAD_INIT(NULL, 0)
    .tp_name = "mymod.MyObject",
    .tp_basicsize = sizeof(MyObject),
    .tp_doc = PyDoc_STR("My objects"),
    .tp_new = myobj_new,
    .tp_dealloc = (destructor)myobj_dealloc,
    .tp_repr = (reprfunc)myobj_repr,
@};
@end example

You may also find older code (especially in the CPython code base)
with a more verbose initializer:

@example
static PyTypeObject MyObject_Type = @{
    PyVarObject_HEAD_INIT(NULL, 0)
    "mymod.MyObject",               /* tp_name */
    sizeof(MyObject),               /* tp_basicsize */
    0,                              /* tp_itemsize */
    (destructor)myobj_dealloc,      /* tp_dealloc */
    0,                              /* tp_vectorcall_offset */
    0,                              /* tp_getattr */
    0,                              /* tp_setattr */
    0,                              /* tp_as_async */
    (reprfunc)myobj_repr,           /* tp_repr */
    0,                              /* tp_as_number */
    0,                              /* tp_as_sequence */
    0,                              /* tp_as_mapping */
    0,                              /* tp_hash */
    0,                              /* tp_call */
    0,                              /* tp_str */
    0,                              /* tp_getattro */
    0,                              /* tp_setattro */
    0,                              /* tp_as_buffer */
    0,                              /* tp_flags */
    PyDoc_STR("My objects"),        /* tp_doc */
    0,                              /* tp_traverse */
    0,                              /* tp_clear */
    0,                              /* tp_richcompare */
    0,                              /* tp_weaklistoffset */
    0,                              /* tp_iter */
    0,                              /* tp_iternext */
    0,                              /* tp_methods */
    0,                              /* tp_members */
    0,                              /* tp_getset */
    0,                              /* tp_base */
    0,                              /* tp_dict */
    0,                              /* tp_descr_get */
    0,                              /* tp_descr_set */
    0,                              /* tp_dictoffset */
    0,                              /* tp_init */
    0,                              /* tp_alloc */
    myobj_new,                      /* tp_new */
@};
@end example

A type that supports weakrefs, instance dicts, and hashing:

@example
typedef struct @{
    PyObject_HEAD
    const char *data;
@} MyObject;

static PyTypeObject MyObject_Type = @{
    PyVarObject_HEAD_INIT(NULL, 0)
    .tp_name = "mymod.MyObject",
    .tp_basicsize = sizeof(MyObject),
    .tp_doc = PyDoc_STR("My objects"),
    .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
         Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_MANAGED_DICT |
         Py_TPFLAGS_MANAGED_WEAKREF,
    .tp_new = myobj_new,
    .tp_traverse = (traverseproc)myobj_traverse,
    .tp_clear = (inquiry)myobj_clear,
    .tp_alloc = PyType_GenericNew,
    .tp_dealloc = (destructor)myobj_dealloc,
    .tp_repr = (reprfunc)myobj_repr,
    .tp_hash = (hashfunc)myobj_hash,
    .tp_richcompare = PyBaseObject_Type.tp_richcompare,
@};
@end example

A str subclass that cannot be subclassed and cannot be called
to create instances (e.g. uses a separate factory func) using
@ref{7a3,,Py_TPFLAGS_DISALLOW_INSTANTIATION} flag:

@example
typedef struct @{
    PyUnicodeObject raw;
    char *extra;
@} MyStr;

static PyTypeObject MyStr_Type = @{
    PyVarObject_HEAD_INIT(NULL, 0)
    .tp_name = "mymod.MyStr",
    .tp_basicsize = sizeof(MyStr),
    .tp_base = NULL,  // set to &PyUnicode_Type in module init
    .tp_doc = PyDoc_STR("my custom str"),
    .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION,
    .tp_repr = (reprfunc)myobj_repr,
@};
@end example

The simplest @ref{988,,static type} with fixed-length instances:

@example
typedef struct @{
    PyObject_HEAD
@} MyObject;

static PyTypeObject MyObject_Type = @{
    PyVarObject_HEAD_INIT(NULL, 0)
    .tp_name = "mymod.MyObject",
@};
@end example

The simplest @ref{988,,static type} with variable-length instances:

@example
typedef struct @{
    PyObject_VAR_HEAD
    const char *data[1];
@} MyObject;

static PyTypeObject MyObject_Type = @{
    PyVarObject_HEAD_INIT(NULL, 0)
    .tp_name = "mymod.MyObject",
    .tp_basicsize = sizeof(MyObject) - sizeof(char *),
    .tp_itemsize = sizeof(char *),
@};
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Supporting Cyclic Garbage Collection,,Type Object Structures,Object Implementation Support
@anchor{c-api/gcsupport doc}@anchor{59d9}@anchor{c-api/gcsupport supporting-cycle-detection}@anchor{59c1}@anchor{c-api/gcsupport supporting-cyclic-garbage-collection}@anchor{59da}@anchor{c-api/gcsupport translation-repo}@anchor{59db}
@subsection Supporting Cyclic Garbage Collection


Python’s support for detecting and collecting garbage which involves circular
references requires support from object types which are “containers” for other
objects which may also be containers.  Types which do not store references to
other objects, or which only store references to atomic types (such as numbers
or strings), do not need to provide any explicit support for garbage
collection.

To create a container type, the @ref{1cb4,,tp_flags} field of the type object must
include the @ref{986,,Py_TPFLAGS_HAVE_GC} and provide an implementation of the
@ref{987,,tp_traverse} handler.  If instances of the type are mutable, a
@ref{5242,,tp_clear} implementation must also be provided.


@table @asis

@item @ref{986,,Py_TPFLAGS_HAVE_GC}

Objects with a type with this flag set must conform with the rules
documented here.  For convenience these objects will be referred to as
container objects.
@end table

Constructors for container types must conform to two rules:


@enumerate 

@item 
The memory for the object must be allocated using @ref{c9f,,PyObject_GC_New}
or @ref{ca0,,PyObject_GC_NewVar}.

@item 
Once all the fields which may contain references to other containers are
initialized, it must call @ref{1710,,PyObject_GC_Track()}.
@end enumerate

Similarly, the deallocator for the object must conform to a similar pair of
rules:


@enumerate 

@item 
Before fields which refer to other containers are invalidated,
@ref{1711,,PyObject_GC_UnTrack()} must be called.

@item 
The object’s memory must be deallocated using @ref{170f,,PyObject_GC_Del()}.

@cartouche
@quotation Warning 
If a type adds the Py_TPFLAGS_HAVE_GC, then it `must' implement at least
a @ref{987,,tp_traverse} handler or explicitly use one
from its subclass or subclasses.

When calling @ref{985,,PyType_Ready()} or some of the APIs that indirectly
call it like @ref{79f,,PyType_FromSpecWithBases()} or
@ref{79e,,PyType_FromSpec()} the interpreter will automatically populate the
@ref{1cb4,,tp_flags}, @ref{987,,tp_traverse}
and @ref{5242,,tp_clear} fields if the type inherits from a
class that implements the garbage collector protocol and the child class
does `not' include the @ref{986,,Py_TPFLAGS_HAVE_GC} flag.
@end quotation
@end cartouche
@end enumerate

@geindex PyObject_GC_New (C macro)
@anchor{c-api/gcsupport c PyObject_GC_New}@anchor{c9f}
@deffn {C Macro} PyObject_GC_New (TYPE, typeobj)

Analogous to @ref{b82,,PyObject_New} but for container objects with the
@ref{986,,Py_TPFLAGS_HAVE_GC} flag set.

Do not call this directly to allocate memory for an object; call the type’s
@ref{5230,,tp_alloc} slot instead.

When populating a type’s @ref{5230,,tp_alloc} slot,
@ref{c67,,PyType_GenericAlloc()} is preferred over a custom function that
simply calls this macro.

Memory allocated by this macro must be freed with
@ref{170f,,PyObject_GC_Del()} (usually called via the object’s
@ref{522f,,tp_free} slot).


@subsubheading See also



@itemize *

@item 
@ref{170f,,PyObject_GC_Del()}

@item 
@ref{b82,,PyObject_New}

@item 
@ref{c67,,PyType_GenericAlloc()}

@item 
@ref{5230,,tp_alloc}
@end itemize

@end deffn

@geindex PyObject_GC_NewVar (C macro)
@anchor{c-api/gcsupport c PyObject_GC_NewVar}@anchor{ca0}
@deffn {C Macro} PyObject_GC_NewVar (TYPE, typeobj, size)

Analogous to @ref{b83,,PyObject_NewVar} but for container objects with the
@ref{986,,Py_TPFLAGS_HAVE_GC} flag set.

Do not call this directly to allocate memory for an object; call the type’s
@ref{5230,,tp_alloc} slot instead.

When populating a type’s @ref{5230,,tp_alloc} slot,
@ref{c67,,PyType_GenericAlloc()} is preferred over a custom function that
simply calls this macro.

Memory allocated by this macro must be freed with
@ref{170f,,PyObject_GC_Del()} (usually called via the object’s
@ref{522f,,tp_free} slot).


@subsubheading See also



@itemize *

@item 
@ref{170f,,PyObject_GC_Del()}

@item 
@ref{b83,,PyObject_NewVar}

@item 
@ref{c67,,PyType_GenericAlloc()}

@item 
@ref{5230,,tp_alloc}
@end itemize

@end deffn

@geindex PyUnstable_Object_GC_NewWithExtraData (C function)
@anchor{c-api/gcsupport c PyUnstable_Object_GC_NewWithExtraData}@anchor{1aef}
@deffn {C Function} @ref{5df,,PyObject} *PyUnstable_Object_GC_NewWithExtraData (PyTypeObject *type, size_t extra_size)

@cartouche
@quotation This is Unstable API. It may change without warning in minor releases. `This is @ref{76a,,Unstable API}. It may change without warning in minor releases.'
@end quotation
@end cartouche

Analogous to @ref{c9f,,PyObject_GC_New} but allocates `extra_size'
bytes at the end of the object (at offset
@ref{b84,,tp_basicsize}).
The allocated memory is initialized to zeros,
except for the @ref{5df,,Python object header}.

The extra data will be deallocated with the object, but otherwise it is
not managed by Python.

Memory allocated by this function must be freed with
@ref{170f,,PyObject_GC_Del()} (usually called via the object’s
@ref{522f,,tp_free} slot).

@cartouche
@quotation Warning 
The function is marked as unstable because the final mechanism
for reserving extra data after an instance is not yet decided.
For allocating a variable number of fields, prefer using
@ref{4a36,,PyVarObject} and @ref{2402,,tp_itemsize}
instead.
@end quotation
@end cartouche


Added in version 3.12.

@end deffn

@geindex PyObject_GC_Resize (C macro)
@anchor{c-api/gcsupport c PyObject_GC_Resize}@anchor{1af4}
@deffn {C Macro} PyObject_GC_Resize (TYPE, op, newsize)

Resize an object allocated by @ref{b83,,PyObject_NewVar}.
Returns the resized object of type @code{TYPE*} (refers to any C type)
or @code{NULL} on failure.

`op' must be of type @ref{4a36,,PyVarObject}*
and must not be tracked by the collector yet.
`newsize' must be of type @ref{c5b,,Py_ssize_t}.
@end deffn

@geindex PyObject_GC_Track (C function)
@anchor{c-api/gcsupport c PyObject_GC_Track}@anchor{1710}
@deffn {C Function} void PyObject_GC_Track (PyObject *op)
` Part of the @ref{776,,Stable ABI}.'
Adds the object `op' to the set of container objects tracked by the
collector.  The collector can run at unexpected times so objects must be
valid while being tracked.  This should be called once all the fields
followed by the @ref{987,,tp_traverse} handler become valid, usually near the
end of the constructor.
@end deffn

@geindex PyObject_IS_GC (C function)
@anchor{c-api/gcsupport c PyObject_IS_GC}@anchor{b81}
@deffn {C Function} int PyObject_IS_GC (PyObject *obj)

Returns non-zero if the object implements the garbage collector protocol,
otherwise returns 0.

The object cannot be tracked by the garbage collector if this function returns 0.
@end deffn

@geindex PyObject_GC_IsTracked (C function)
@anchor{c-api/gcsupport c PyObject_GC_IsTracked}@anchor{b73}
@deffn {C Function} int PyObject_GC_IsTracked (PyObject *op)
` Part of the @ref{776,,Stable ABI} since version 3.9.'
Returns 1 if the object type of `op' implements the GC protocol and `op' is being
currently tracked by the garbage collector and 0 otherwise.

This is analogous to the Python function @ref{1519,,gc.is_tracked()}.


Added in version 3.9.

@end deffn

@geindex PyObject_GC_IsFinalized (C function)
@anchor{c-api/gcsupport c PyObject_GC_IsFinalized}@anchor{b74}
@deffn {C Function} int PyObject_GC_IsFinalized (PyObject *op)
` Part of the @ref{776,,Stable ABI} since version 3.9.'
Returns 1 if the object type of `op' implements the GC protocol and `op' has been
already finalized by the garbage collector and 0 otherwise.

This is analogous to the Python function @ref{aff,,gc.is_finalized()}.


Added in version 3.9.

@end deffn

@geindex PyObject_GC_Del (C function)
@anchor{c-api/gcsupport c PyObject_GC_Del}@anchor{170f}
@deffn {C Function} void PyObject_GC_Del (void *op)
` Part of the @ref{776,,Stable ABI}.'
Releases memory allocated to an object using @ref{c9f,,PyObject_GC_New} or
@ref{ca0,,PyObject_GC_NewVar}.

Do not call this directly to free an object’s memory; call the type’s
@ref{522f,,tp_free} slot instead.

Do not use this for memory allocated by @ref{b82,,PyObject_New},
@ref{b83,,PyObject_NewVar}, or related allocation functions; use
@ref{e65,,PyObject_Free()} instead.


@subsubheading See also



@itemize *

@item 
@ref{e65,,PyObject_Free()} is the non-GC equivalent of this function.

@item 
@ref{c9f,,PyObject_GC_New}

@item 
@ref{ca0,,PyObject_GC_NewVar}

@item 
@ref{c67,,PyType_GenericAlloc()}

@item 
@ref{522f,,tp_free}
@end itemize

@end deffn

@geindex PyObject_GC_UnTrack (C function)
@anchor{c-api/gcsupport c PyObject_GC_UnTrack}@anchor{1711}
@deffn {C Function} void PyObject_GC_UnTrack (void *op)
` Part of the @ref{776,,Stable ABI}.'
Remove the object `op' from the set of container objects tracked by the
collector.  Note that @ref{1710,,PyObject_GC_Track()} can be called again on
this object to add it back to the set of tracked objects.  The deallocator
(@ref{521c,,tp_dealloc} handler) should call this for the object before any of
the fields used by the @ref{987,,tp_traverse} handler become invalid.
@end deffn


Changed in version 3.8: The @code{_PyObject_GC_TRACK()} and @code{_PyObject_GC_UNTRACK()} macros
have been removed from the public C API.


The @ref{987,,tp_traverse} handler accepts a function parameter of this type:

@geindex visitproc (C type)
@anchor{c-api/gcsupport c visitproc}@anchor{551c}
@deffn {C Type} typedef int (*visitproc)(@ref{5df,,PyObject} *object, void *arg)
` Part of the @ref{776,,Stable ABI}.'
Type of the visitor function passed to the @ref{987,,tp_traverse} handler.
The function should be called with an object to traverse as `object' and
the third parameter to the @code{tp_traverse} handler as `arg'.  The
Python core uses several visitor functions to implement cyclic garbage
detection; it’s not expected that users will need to write their own
visitor functions.
@end deffn

The @ref{987,,tp_traverse} handler must have the following type:

@geindex traverseproc (C type)
@anchor{c-api/gcsupport c traverseproc}@anchor{551a}
@deffn {C Type} typedef int (*traverseproc)(@ref{5df,,PyObject} *self, @ref{551c,,visitproc} visit, void *arg)
` Part of the @ref{776,,Stable ABI}.'
Traversal function for a container object.  Implementations must call the
`visit' function for each object directly contained by `self', with the
parameters to `visit' being the contained object and the `arg' value passed
to the handler.  The `visit' function must not be called with a @code{NULL}
object argument.  If `visit' returns a non-zero value that value should be
returned immediately.

The traversal function must not have any side effects.  Implementations
may not modify the reference counts of any Python objects nor create or
destroy any Python objects.
@end deffn

To simplify writing @ref{987,,tp_traverse} handlers, a @ref{5239,,Py_VISIT()} macro is
provided.  In order to use this macro, the @code{tp_traverse} implementation
must name its arguments exactly `visit' and `arg':

@geindex Py_VISIT (C macro)
@anchor{c-api/gcsupport c Py_VISIT}@anchor{5239}
@deffn {C Macro} Py_VISIT (o)

If the @ref{5df,,PyObject}* `o' is not @code{NULL}, call the `visit' callback, with arguments `o'
and `arg'.  If `visit' returns a non-zero value, then return it.
Using this macro, @ref{987,,tp_traverse} handlers
look like:

@example
static int
my_traverse(Noddy *self, visitproc visit, void *arg)
@{
    Py_VISIT(self->foo);
    Py_VISIT(self->bar);
    return 0;
@}
@end example
@end deffn

The @ref{5242,,tp_clear} handler must be of the @ref{550b,,inquiry} type, or @code{NULL}
if the object is immutable.

@geindex inquiry (C type)
@anchor{c-api/gcsupport c inquiry}@anchor{550b}
@deffn {C Type} typedef int (*inquiry)(@ref{5df,,PyObject} *self)
` Part of the @ref{776,,Stable ABI}.'
Drop references that may have created reference cycles.  Immutable objects
do not have to define this method since they can never directly create
reference cycles.  Note that the object must still be valid after calling
this method (don’t just call @ref{791,,Py_DECREF()} on a reference).  The
collector will call this method if it detects that this object is involved
in a reference cycle.
@end deffn

@menu
* Controlling the Garbage Collector State:: 
* Querying Garbage Collector State:: 

@end menu

@node Controlling the Garbage Collector State,Querying Garbage Collector State,,Supporting Cyclic Garbage Collection
@anchor{c-api/gcsupport controlling-the-garbage-collector-state}@anchor{59dc}
@subsubsection Controlling the Garbage Collector State


The C-API provides the following functions for controlling
garbage collection runs.

@geindex PyGC_Collect (C function)
@anchor{c-api/gcsupport c PyGC_Collect}@anchor{b8b}
@deffn {C Function} @ref{c5b,,Py_ssize_t} PyGC_Collect (void)
` Part of the @ref{776,,Stable ABI}.'
Perform a full garbage collection, if the garbage collector is enabled.
(Note that @ref{1b5,,gc.collect()} runs it unconditionally.)

Returns the number of collected + unreachable objects which cannot
be collected.
If the garbage collector is disabled or already collecting,
returns @code{0} immediately.
Errors during garbage collection are passed to @ref{508,,sys.unraisablehook}.
This function does not raise exceptions.
@end deffn

@geindex PyGC_Enable (C function)
@anchor{c-api/gcsupport c PyGC_Enable}@anchor{aaa}
@deffn {C Function} int PyGC_Enable (void)
` Part of the @ref{776,,Stable ABI} since version 3.10.'
Enable the garbage collector: similar to @ref{4d6c,,gc.enable()}.
Returns the previous state, 0 for disabled and 1 for enabled.


Added in version 3.10.

@end deffn

@geindex PyGC_Disable (C function)
@anchor{c-api/gcsupport c PyGC_Disable}@anchor{aab}
@deffn {C Function} int PyGC_Disable (void)
` Part of the @ref{776,,Stable ABI} since version 3.10.'
Disable the garbage collector: similar to @ref{4d6d,,gc.disable()}.
Returns the previous state, 0 for disabled and 1 for enabled.


Added in version 3.10.

@end deffn

@geindex PyGC_IsEnabled (C function)
@anchor{c-api/gcsupport c PyGC_IsEnabled}@anchor{aac}
@deffn {C Function} int PyGC_IsEnabled (void)
` Part of the @ref{776,,Stable ABI} since version 3.10.'
Query the state of the garbage collector: similar to @ref{4d6e,,gc.isenabled()}.
Returns the current state, 0 for disabled and 1 for enabled.


Added in version 3.10.

@end deffn

@node Querying Garbage Collector State,,Controlling the Garbage Collector State,Supporting Cyclic Garbage Collection
@anchor{c-api/gcsupport querying-garbage-collector-state}@anchor{59dd}
@subsubsection Querying Garbage Collector State


The C-API provides the following interface for querying information about
the garbage collector.

@geindex PyUnstable_GC_VisitObjects (C function)
@anchor{c-api/gcsupport c PyUnstable_GC_VisitObjects}@anchor{59de}
@deffn {C Function} void PyUnstable_GC_VisitObjects (gcvisitobjects_t callback, void *arg)

@cartouche
@quotation This is Unstable API. It may change without warning in minor releases. `This is @ref{76a,,Unstable API}. It may change without warning in minor releases.'
@end quotation
@end cartouche

Run supplied `callback' on all live GC-capable objects. `arg' is passed through to
all invocations of `callback'.

@cartouche
@quotation Warning 
If new objects are (de)allocated by the callback it is undefined if they
will be visited.

Garbage collection is disabled during operation. Explicitly running a collection
in the callback may lead to undefined behaviour e.g. visiting the same objects
multiple times or not at all.
@end quotation
@end cartouche


Added in version 3.12.

@end deffn

@geindex gcvisitobjects_t (C type)
@anchor{c-api/gcsupport c gcvisitobjects_t}@anchor{59df}
@deffn {C Type} typedef int (*gcvisitobjects_t)(@ref{5df,,PyObject} *object, void *arg)

Type of the visitor function to be passed to @ref{59de,,PyUnstable_GC_VisitObjects()}.
`arg' is the same as the `arg' passed to @code{PyUnstable_GC_VisitObjects}.
Return @code{1} to continue iteration, return @code{0} to stop iteration. Other return
values are reserved for now so behavior on returning anything else is undefined.


Added in version 3.12.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node API and ABI Versioning,Monitoring C API,Object Implementation Support,Python/C API reference manual
@anchor{c-api/apiabiversion doc}@anchor{59e0}@anchor{c-api/apiabiversion api-and-abi-versioning}@anchor{59e1}@anchor{c-api/apiabiversion apiabiversion}@anchor{4c81}@anchor{c-api/apiabiversion translation-repo}@anchor{59e2}
@section API and ABI Versioning


@menu
* Build-time version constants:: 
* Run-time version:: 
* Bit-packing macros:: 

@end menu

@node Build-time version constants,Run-time version,,API and ABI Versioning
@anchor{c-api/apiabiversion build-time-version-constants}@anchor{59e3}
@subsection Build-time version constants


CPython exposes its version number in the following macros.
Note that these correspond to the version code is `built' with.
See @ref{37f,,Py_Version} for the version used at `run time'.

See @ref{776,,C API Stability} for a discussion of API and ABI stability across versions.

@geindex PY_MAJOR_VERSION (C macro)
@anchor{c-api/apiabiversion c PY_MAJOR_VERSION}@anchor{59e4}
@deffn {C Macro} PY_MAJOR_VERSION

The @code{3} in @code{3.4.1a2}.
@end deffn

@geindex PY_MINOR_VERSION (C macro)
@anchor{c-api/apiabiversion c PY_MINOR_VERSION}@anchor{59e5}
@deffn {C Macro} PY_MINOR_VERSION

The @code{4} in @code{3.4.1a2}.
@end deffn

@geindex PY_MICRO_VERSION (C macro)
@anchor{c-api/apiabiversion c PY_MICRO_VERSION}@anchor{59e6}
@deffn {C Macro} PY_MICRO_VERSION

The @code{1} in @code{3.4.1a2}.
@end deffn

@geindex PY_RELEASE_LEVEL (C macro)
@anchor{c-api/apiabiversion c PY_RELEASE_LEVEL}@anchor{59e7}
@deffn {C Macro} PY_RELEASE_LEVEL

The @code{a} in @code{3.4.1a2}.
This can be @code{0xA} for alpha, @code{0xB} for beta, @code{0xC} for release
candidate or @code{0xF} for final.
@end deffn

@geindex PY_RELEASE_SERIAL (C macro)
@anchor{c-api/apiabiversion c PY_RELEASE_SERIAL}@anchor{59e8}
@deffn {C Macro} PY_RELEASE_SERIAL

The @code{2} in @code{3.4.1a2}. Zero for final releases.
@end deffn

@geindex PY_VERSION_HEX (C macro)
@anchor{c-api/apiabiversion c PY_VERSION_HEX}@anchor{380}
@deffn {C Macro} PY_VERSION_HEX

The Python version number encoded in a single integer.
See @ref{37e,,Py_PACK_FULL_VERSION()} for the encoding details.

Use this for numeric comparisons, for example,
@code{#if PY_VERSION_HEX >= ...}.
@end deffn

These macros are defined in Include/patchlevel.h@footnote{https://github.com/python/cpython/tree/3.14/Include/patchlevel.h}.

@node Run-time version,Bit-packing macros,Build-time version constants,API and ABI Versioning
@anchor{c-api/apiabiversion run-time-version}@anchor{59e9}
@subsection Run-time version


@geindex Py_Version (C var)
@anchor{c-api/apiabiversion c Py_Version}@anchor{37f}
@deffn {C Variable} const unsigned long Py_Version
` Part of the @ref{776,,Stable ABI} since version 3.11.'
The Python runtime version number encoded in a single constant integer.
See @ref{37e,,Py_PACK_FULL_VERSION()} for the encoding details.
This contains the Python version used at run time.

Use this for numeric comparisons, for example, @code{if (Py_Version >= ...)}.


Added in version 3.11.

@end deffn

@node Bit-packing macros,,Run-time version,API and ABI Versioning
@anchor{c-api/apiabiversion bit-packing-macros}@anchor{59ea}
@subsection Bit-packing macros


@geindex Py_PACK_FULL_VERSION (C function)
@anchor{c-api/apiabiversion c Py_PACK_FULL_VERSION}@anchor{37e}
@deffn {C Function} uint32_t Py_PACK_FULL_VERSION (int major, int minor, int micro, int release_level, int release_serial)
` Part of the @ref{776,,Stable ABI} since version 3.14.'
Return the given version, encoded as a single 32-bit integer with
the following structure:


@multitable {xxxxxxxxxxxxxxxxxxxx} {xxxxxxxxx} {xxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxx} {xxxxxxxxxxxxxxx} {xxxxxxxxxxxxxx} 
@headitem

Argument

@tab

No.
of
bits

@tab

Bit mask

@tab

Bit shift

@tab

Example values

@tab

@item

@code{3.4.1a2}

@tab

@code{3.10.0}

@item

`major'

@tab

8

@tab

@code{0xFF000000}

@tab

24

@tab

@code{0x03}

@tab

@code{0x03}

@item

`minor'

@tab

8

@tab

@code{0x00FF0000}

@tab

16

@tab

@code{0x04}

@tab

@code{0x0A}

@item

`micro'

@tab

8

@tab

@code{0x0000FF00}

@tab

8

@tab

@code{0x01}

@tab

@code{0x00}

@item

`release_level'

@tab

4

@tab

@code{0x000000F0}

@tab

4

@tab

@code{0xA}

@tab

@code{0xF}

@item

`release_serial'

@tab

4

@tab

@code{0x0000000F}

@tab

0

@tab

@code{0x2}

@tab

@code{0x0}

@end multitable


For example:


@multitable {xxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxx} 
@headitem

Version

@tab

@code{Py_PACK_FULL_VERSION} arguments

@tab

Encoded version

@item

@code{3.4.1a2}

@tab

@code{(3, 4, 1, 0xA, 2)}

@tab

@code{0x030401a2}

@item

@code{3.10.0}

@tab

@code{(3, 10, 0, 0xF, 0)}

@tab

@code{0x030a00f0}

@end multitable


Out-of range bits in the arguments are ignored.
That is, the macro can be defined as:

@example
#ifndef Py_PACK_FULL_VERSION
#define Py_PACK_FULL_VERSION(X, Y, Z, LEVEL, SERIAL) ( \
   (((X) & 0xff) << 24) |                              \
   (((Y) & 0xff) << 16) |                              \
   (((Z) & 0xff) << 8) |                               \
   (((LEVEL) & 0xf) << 4) |                            \
   (((SERIAL) & 0xf) << 0))
#endif
@end example

@code{Py_PACK_FULL_VERSION} is primarily a macro, intended for use in
@code{#if} directives, but it is also available as an exported function.


Added in version 3.14.

@end deffn

@geindex Py_PACK_VERSION (C function)
@anchor{c-api/apiabiversion c Py_PACK_VERSION}@anchor{37d}
@deffn {C Function} uint32_t Py_PACK_VERSION (int major, int minor)
` Part of the @ref{776,,Stable ABI} since version 3.14.'
Equivalent to @code{Py_PACK_FULL_VERSION(major, minor, 0, 0, 0)}.
The result does not correspond to any Python release, but is useful
in numeric comparisons.


Added in version 3.14.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Monitoring C API,Generating Execution Events,API and ABI Versioning,Python/C API reference manual
@anchor{c-api/monitoring doc}@anchor{59eb}@anchor{c-api/monitoring c-api-monitoring}@anchor{486}@anchor{c-api/monitoring monitoring-c-api}@anchor{59ec}@anchor{c-api/monitoring translation-repo}@anchor{59ed}
@section Monitoring C API


Added in version 3.13.

An extension may need to interact with the event monitoring system. Subscribing
to events and registering callbacks can be done via the Python API exposed in
@ref{e0,,sys.monitoring}.

@node Generating Execution Events,,Monitoring C API,Python/C API reference manual
@anchor{c-api/monitoring generating-execution-events}@anchor{59ee}
@section Generating Execution Events


The functions below make it possible for an extension to fire monitoring
events as it emulates the execution of Python code. Each of these functions
accepts a @code{PyMonitoringState} struct which contains concise information
about the activation state of events, as well as the event arguments, which
include a @code{PyObject*} representing the code object, the instruction offset
and sometimes additional, event-specific arguments (see @ref{e0,,sys.monitoring}
for details about the signatures of the different event callbacks).
The @code{codelike} argument should be an instance of @ref{32d,,types.CodeType}
or of a type that emulates it.

The VM disables tracing when firing an event, so there is no need for user
code to do that.

Monitoring functions should not be called with an exception set,
except those listed below as working with the current exception.

@geindex PyMonitoringState (C type)
@anchor{c-api/monitoring c PyMonitoringState}@anchor{5be}
@deffn {C Type} type PyMonitoringState

Representation of the state of an event type. It is allocated by the user
while its contents are maintained by the monitoring API functions described below.
@end deffn

All of the functions below return 0 on success and -1 (with an exception set) on error.

See @ref{e0,,sys.monitoring} for descriptions of the events.

@geindex PyMonitoring_FirePyStartEvent (C function)
@anchor{c-api/monitoring c PyMonitoring_FirePyStartEvent}@anchor{5bf}
@deffn {C Function} int PyMonitoring_FirePyStartEvent (PyMonitoringState *state, PyObject *codelike, int32_t offset)

Fire a @code{PY_START} event.
@end deffn

@geindex PyMonitoring_FirePyResumeEvent (C function)
@anchor{c-api/monitoring c PyMonitoring_FirePyResumeEvent}@anchor{5c0}
@deffn {C Function} int PyMonitoring_FirePyResumeEvent (PyMonitoringState *state, PyObject *codelike, int32_t offset)

Fire a @code{PY_RESUME} event.
@end deffn

@geindex PyMonitoring_FirePyReturnEvent (C function)
@anchor{c-api/monitoring c PyMonitoring_FirePyReturnEvent}@anchor{5c1}
@deffn {C Function} int PyMonitoring_FirePyReturnEvent (PyMonitoringState *state, PyObject *codelike, int32_t offset, PyObject *retval)

Fire a @code{PY_RETURN} event.
@end deffn

@geindex PyMonitoring_FirePyYieldEvent (C function)
@anchor{c-api/monitoring c PyMonitoring_FirePyYieldEvent}@anchor{5c2}
@deffn {C Function} int PyMonitoring_FirePyYieldEvent (PyMonitoringState *state, PyObject *codelike, int32_t offset, PyObject *retval)

Fire a @code{PY_YIELD} event.
@end deffn

@geindex PyMonitoring_FireCallEvent (C function)
@anchor{c-api/monitoring c PyMonitoring_FireCallEvent}@anchor{5c3}
@deffn {C Function} int PyMonitoring_FireCallEvent (PyMonitoringState *state, PyObject *codelike, int32_t offset, PyObject *callable, PyObject *arg0)

Fire a @code{CALL} event.
@end deffn

@geindex PyMonitoring_FireLineEvent (C function)
@anchor{c-api/monitoring c PyMonitoring_FireLineEvent}@anchor{5c4}
@deffn {C Function} int PyMonitoring_FireLineEvent (PyMonitoringState *state, PyObject *codelike, int32_t offset, int lineno)

Fire a @code{LINE} event.
@end deffn

@geindex PyMonitoring_FireJumpEvent (C function)
@anchor{c-api/monitoring c PyMonitoring_FireJumpEvent}@anchor{5c5}
@deffn {C Function} int PyMonitoring_FireJumpEvent (PyMonitoringState *state, PyObject *codelike, int32_t offset, PyObject *target_offset)

Fire a @code{JUMP} event.
@end deffn

@geindex PyMonitoring_FireBranchLeftEvent (C function)
@anchor{c-api/monitoring c PyMonitoring_FireBranchLeftEvent}@anchor{3ab}
@deffn {C Function} int PyMonitoring_FireBranchLeftEvent (PyMonitoringState *state, PyObject *codelike, int32_t offset, PyObject *target_offset)

Fire a @code{BRANCH_LEFT} event.
@end deffn

@geindex PyMonitoring_FireBranchRightEvent (C function)
@anchor{c-api/monitoring c PyMonitoring_FireBranchRightEvent}@anchor{3ac}
@deffn {C Function} int PyMonitoring_FireBranchRightEvent (PyMonitoringState *state, PyObject *codelike, int32_t offset, PyObject *target_offset)

Fire a @code{BRANCH_RIGHT} event.
@end deffn

@geindex PyMonitoring_FireCReturnEvent (C function)
@anchor{c-api/monitoring c PyMonitoring_FireCReturnEvent}@anchor{5c6}
@deffn {C Function} int PyMonitoring_FireCReturnEvent (PyMonitoringState *state, PyObject *codelike, int32_t offset, PyObject *retval)

Fire a @code{C_RETURN} event.
@end deffn

@geindex PyMonitoring_FirePyThrowEvent (C function)
@anchor{c-api/monitoring c PyMonitoring_FirePyThrowEvent}@anchor{5c7}
@deffn {C Function} int PyMonitoring_FirePyThrowEvent (PyMonitoringState *state, PyObject *codelike, int32_t offset)

Fire a @code{PY_THROW} event with the current exception (as returned by
@ref{427,,PyErr_GetRaisedException()}).
@end deffn

@geindex PyMonitoring_FireRaiseEvent (C function)
@anchor{c-api/monitoring c PyMonitoring_FireRaiseEvent}@anchor{5c8}
@deffn {C Function} int PyMonitoring_FireRaiseEvent (PyMonitoringState *state, PyObject *codelike, int32_t offset)

Fire a @code{RAISE} event with the current exception (as returned by
@ref{427,,PyErr_GetRaisedException()}).
@end deffn

@geindex PyMonitoring_FireCRaiseEvent (C function)
@anchor{c-api/monitoring c PyMonitoring_FireCRaiseEvent}@anchor{5c9}
@deffn {C Function} int PyMonitoring_FireCRaiseEvent (PyMonitoringState *state, PyObject *codelike, int32_t offset)

Fire a @code{C_RAISE} event with the current exception (as returned by
@ref{427,,PyErr_GetRaisedException()}).
@end deffn

@geindex PyMonitoring_FireReraiseEvent (C function)
@anchor{c-api/monitoring c PyMonitoring_FireReraiseEvent}@anchor{5ca}
@deffn {C Function} int PyMonitoring_FireReraiseEvent (PyMonitoringState *state, PyObject *codelike, int32_t offset)

Fire a @code{RERAISE} event with the current exception (as returned by
@ref{427,,PyErr_GetRaisedException()}).
@end deffn

@geindex PyMonitoring_FireExceptionHandledEvent (C function)
@anchor{c-api/monitoring c PyMonitoring_FireExceptionHandledEvent}@anchor{5cb}
@deffn {C Function} int PyMonitoring_FireExceptionHandledEvent (PyMonitoringState *state, PyObject *codelike, int32_t offset)

Fire an @code{EXCEPTION_HANDLED} event with the current exception (as returned by
@ref{427,,PyErr_GetRaisedException()}).
@end deffn

@geindex PyMonitoring_FirePyUnwindEvent (C function)
@anchor{c-api/monitoring c PyMonitoring_FirePyUnwindEvent}@anchor{5cc}
@deffn {C Function} int PyMonitoring_FirePyUnwindEvent (PyMonitoringState *state, PyObject *codelike, int32_t offset)

Fire a @code{PY_UNWIND} event with the current exception (as returned by
@ref{427,,PyErr_GetRaisedException()}).
@end deffn

@geindex PyMonitoring_FireStopIterationEvent (C function)
@anchor{c-api/monitoring c PyMonitoring_FireStopIterationEvent}@anchor{5cd}
@deffn {C Function} int PyMonitoring_FireStopIterationEvent (PyMonitoringState *state, PyObject *codelike, int32_t offset, PyObject *value)

Fire a @code{STOP_ITERATION} event. If @code{value} is an instance of @ref{dfb,,StopIteration}, it is used. Otherwise,
a new @code{StopIteration} instance is created with @code{value} as its argument.
@end deffn

@menu
* Managing the Monitoring State:: 

@end menu

@node Managing the Monitoring State,,,Generating Execution Events
@anchor{c-api/monitoring managing-the-monitoring-state}@anchor{59ef}
@subsection Managing the Monitoring State


Monitoring states can be managed with the help of monitoring scopes. A scope
would typically correspond to a Python function.

@geindex PyMonitoring_EnterScope (C function)
@anchor{c-api/monitoring c PyMonitoring_EnterScope}@anchor{5ce}
@deffn {C Function} int PyMonitoring_EnterScope (PyMonitoringState *state_array, uint64_t *version, const uint8_t *event_types, Py_ssize_t length)

Enter a monitored scope. @code{event_types} is an array of the event IDs for
events that may be fired from the scope. For example, the ID of a @code{PY_START}
event is the value @code{PY_MONITORING_EVENT_PY_START}, which is numerically equal
to the base-2 logarithm of @code{sys.monitoring.events.PY_START}.
@code{state_array} is an array with a monitoring state entry for each event in
@code{event_types}, it is allocated by the user but populated by
@code{PyMonitoring_EnterScope()} with information about the activation state of
the event. The size of @code{event_types} (and hence also of @code{state_array})
is given in @code{length}.

The @code{version} argument is a pointer to a value which should be allocated
by the user together with @code{state_array} and initialized to 0,
and then set only by @code{PyMonitoring_EnterScope()} itself. It allows this
function to determine whether event states have changed since the previous call,
and to return quickly if they have not.

The scopes referred to here are lexical scopes: a function, class or method.
@code{PyMonitoring_EnterScope()} should be called whenever the lexical scope is
entered. Scopes can be reentered, reusing the same `state_array' and `version',
in situations like when emulating a recursive Python function. When a code-like’s
execution is paused, such as when emulating a generator, the scope needs to
be exited and re-entered.

The macros for `event_types' are:

@c The table is here to make the docs searchable, and to allow automatic
@c links to the identifiers.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Macro

@tab

Event

@item

@geindex PY_MONITORING_EVENT_BRANCH_LEFT (C macro)
@anchor{c-api/monitoring c PY_MONITORING_EVENT_BRANCH_LEFT}@anchor{59f0}
@deffn {C Macro} PY_MONITORING_EVENT_BRANCH_LEFT
@end deffn

@tab

@ref{297,,BRANCH_LEFT}

@item

@geindex PY_MONITORING_EVENT_BRANCH_RIGHT (C macro)
@anchor{c-api/monitoring c PY_MONITORING_EVENT_BRANCH_RIGHT}@anchor{59f1}
@deffn {C Macro} PY_MONITORING_EVENT_BRANCH_RIGHT
@end deffn

@tab

@ref{298,,BRANCH_RIGHT}

@item

@geindex PY_MONITORING_EVENT_CALL (C macro)
@anchor{c-api/monitoring c PY_MONITORING_EVENT_CALL}@anchor{59f2}
@deffn {C Macro} PY_MONITORING_EVENT_CALL
@end deffn

@tab

@ref{19ff,,CALL}

@item

@geindex PY_MONITORING_EVENT_C_RAISE (C macro)
@anchor{c-api/monitoring c PY_MONITORING_EVENT_C_RAISE}@anchor{59f3}
@deffn {C Macro} PY_MONITORING_EVENT_C_RAISE
@end deffn

@tab

@ref{4c99,,C_RAISE}

@item

@geindex PY_MONITORING_EVENT_C_RETURN (C macro)
@anchor{c-api/monitoring c PY_MONITORING_EVENT_C_RETURN}@anchor{59f4}
@deffn {C Macro} PY_MONITORING_EVENT_C_RETURN
@end deffn

@tab

@ref{4c9a,,C_RETURN}

@item

@geindex PY_MONITORING_EVENT_EXCEPTION_HANDLED (C macro)
@anchor{c-api/monitoring c PY_MONITORING_EVENT_EXCEPTION_HANDLED}@anchor{59f5}
@deffn {C Macro} PY_MONITORING_EVENT_EXCEPTION_HANDLED
@end deffn

@tab

@ref{4c9b,,EXCEPTION_HANDLED}

@item

@geindex PY_MONITORING_EVENT_INSTRUCTION (C macro)
@anchor{c-api/monitoring c PY_MONITORING_EVENT_INSTRUCTION}@anchor{59f6}
@deffn {C Macro} PY_MONITORING_EVENT_INSTRUCTION
@end deffn

@tab

@ref{4c9c,,INSTRUCTION}

@item

@geindex PY_MONITORING_EVENT_JUMP (C macro)
@anchor{c-api/monitoring c PY_MONITORING_EVENT_JUMP}@anchor{59f7}
@deffn {C Macro} PY_MONITORING_EVENT_JUMP
@end deffn

@tab

@ref{4c9d,,JUMP}

@item

@geindex PY_MONITORING_EVENT_LINE (C macro)
@anchor{c-api/monitoring c PY_MONITORING_EVENT_LINE}@anchor{59f8}
@deffn {C Macro} PY_MONITORING_EVENT_LINE
@end deffn

@tab

@ref{4c9e,,LINE}

@item

@geindex PY_MONITORING_EVENT_PY_RESUME (C macro)
@anchor{c-api/monitoring c PY_MONITORING_EVENT_PY_RESUME}@anchor{59f9}
@deffn {C Macro} PY_MONITORING_EVENT_PY_RESUME
@end deffn

@tab

@ref{4c9f,,PY_RESUME}

@item

@geindex PY_MONITORING_EVENT_PY_RETURN (C macro)
@anchor{c-api/monitoring c PY_MONITORING_EVENT_PY_RETURN}@anchor{59fa}
@deffn {C Macro} PY_MONITORING_EVENT_PY_RETURN
@end deffn

@tab

@ref{4ca0,,PY_RETURN}

@item

@geindex PY_MONITORING_EVENT_PY_START (C macro)
@anchor{c-api/monitoring c PY_MONITORING_EVENT_PY_START}@anchor{59fb}
@deffn {C Macro} PY_MONITORING_EVENT_PY_START
@end deffn

@tab

@ref{4ca1,,PY_START}

@item

@geindex PY_MONITORING_EVENT_PY_THROW (C macro)
@anchor{c-api/monitoring c PY_MONITORING_EVENT_PY_THROW}@anchor{59fc}
@deffn {C Macro} PY_MONITORING_EVENT_PY_THROW
@end deffn

@tab

@ref{189e,,PY_THROW}

@item

@geindex PY_MONITORING_EVENT_PY_UNWIND (C macro)
@anchor{c-api/monitoring c PY_MONITORING_EVENT_PY_UNWIND}@anchor{59fd}
@deffn {C Macro} PY_MONITORING_EVENT_PY_UNWIND
@end deffn

@tab

@ref{4ca2,,PY_UNWIND}

@item

@geindex PY_MONITORING_EVENT_PY_YIELD (C macro)
@anchor{c-api/monitoring c PY_MONITORING_EVENT_PY_YIELD}@anchor{59fe}
@deffn {C Macro} PY_MONITORING_EVENT_PY_YIELD
@end deffn

@tab

@ref{4ca3,,PY_YIELD}

@item

@geindex PY_MONITORING_EVENT_RAISE (C macro)
@anchor{c-api/monitoring c PY_MONITORING_EVENT_RAISE}@anchor{59ff}
@deffn {C Macro} PY_MONITORING_EVENT_RAISE
@end deffn

@tab

@ref{19b8,,RAISE}

@item

@geindex PY_MONITORING_EVENT_RERAISE (C macro)
@anchor{c-api/monitoring c PY_MONITORING_EVENT_RERAISE}@anchor{5a00}
@deffn {C Macro} PY_MONITORING_EVENT_RERAISE
@end deffn

@tab

@ref{4ca5,,RERAISE}

@item

@geindex PY_MONITORING_EVENT_STOP_ITERATION (C macro)
@anchor{c-api/monitoring c PY_MONITORING_EVENT_STOP_ITERATION}@anchor{5a01}
@deffn {C Macro} PY_MONITORING_EVENT_STOP_ITERATION
@end deffn

@tab

@ref{4ca4,,STOP_ITERATION}

@end multitable

@end deffn

@geindex PyMonitoring_ExitScope (C function)
@anchor{c-api/monitoring c PyMonitoring_ExitScope}@anchor{5cf}
@deffn {C Function} int PyMonitoring_ExitScope (void)

Exit the last scope that was entered with @code{PyMonitoring_EnterScope()}.
@end deffn

@geindex PY_MONITORING_IS_INSTRUMENTED_EVENT (C function)
@anchor{c-api/monitoring c PY_MONITORING_IS_INSTRUMENTED_EVENT}@anchor{5a02}
@deffn {C Function} int PY_MONITORING_IS_INSTRUMENTED_EVENT (uint8_t ev)

Return true if the event corresponding to the event ID `ev' is
a @ref{4ca9,,local event}.


Added in version 3.13.



@ref{23f,,Soft deprecated} since version 3.14.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Installing Python modules,Python HOWTOs,Python/C API reference manual,Top
@anchor{installing/index doc}@anchor{5a03}@anchor{installing/index installing-index}@anchor{10fe}@anchor{installing/index installing-python-modules}@anchor{5a04}@anchor{installing/index translation-repo}@anchor{5a05}
@chapter Installing Python modules


As a popular open source development project, Python has an active
supporting community of contributors and users that also make their software
available for other Python developers to use under open-source license terms.

This allows Python users to share and collaborate effectively, benefiting
from the solutions others have already created to common (and sometimes
even rare!) problems, as well as potentially contributing their own
solutions to the common pool.

This guide covers the installation part of the process. For a guide to
creating and sharing your own Python projects, refer to the
Python packaging user guide@footnote{https://packaging.python.org/en/latest/tutorials/packaging-projects/}.

@cartouche
@quotation Note 
For corporate and other institutional users, be aware that many
organisations have their own policies around using and contributing to
open source software. Please take such policies into account when making
use of the distribution and installation tools provided with Python.
@end quotation
@end cartouche

@menu
* Key terms:: 
* Basic usage: Basic usage<2>. 
* How do I …?:: 
* Common installation issues:: 

@end menu

@node Key terms,Basic usage<2>,,Installing Python modules
@anchor{installing/index key-terms}@anchor{5a06}
@section Key terms



@itemize *

@item 
@code{pip} is the preferred installer program. It
is included by default with the Python binary installers.

@item 
A `virtual environment' is a semi-isolated Python environment that allows
packages to be installed for use by a particular application, rather than
being installed system wide.

@item 
@code{venv} is the standard tool for creating virtual environments.
It defaults to installing @code{pip} into all created virtual environments.

@item 
@code{virtualenv} is a third-party alternative (and predecessor) to
@code{venv}.

@item 
The Python Package Index (PyPI)@footnote{https://pypi.org} is a public
repository of open source licensed packages made available for use by
other Python users.

@item 
The Python Packaging Authority@footnote{https://www.pypa.io/} is the group of
developers and documentation authors responsible for the maintenance and
evolution of the standard packaging tools and the associated metadata and
file format standards. They maintain a variety of tools, documentation,
and issue trackers on GitHub@footnote{https://github.com/pypa}.
@end itemize


Changed in version 3.5: The use of @code{venv} is now recommended for creating virtual environments.



@subsubheading See also


Python Packaging User Guide: Creating and using virtual environments@footnote{https://packaging.python.org/installing/#creating-virtual-environments}


@node Basic usage<2>,How do I …?,Key terms,Installing Python modules
@anchor{installing/index basic-usage}@anchor{5a07}
@section Basic usage


The standard packaging tools are all designed to be used from the command
line.

The following command will install the latest version of a module and its
dependencies from PyPI:

@example
python -m pip install SomePackage
@end example

@cartouche
@quotation Note 
For POSIX users (including macOS and Linux users), the examples in
this guide assume the use of a @ref{2131,,virtual environment}.

For Windows users, the examples in this guide assume that the option to
adjust the system PATH environment variable was selected when installing
Python.
@end quotation
@end cartouche

It’s also possible to specify an exact or minimum version directly on the
command line. When using comparator operators such as @code{>}, @code{<} or some other
special character which get interpreted by shell, the package name and the
version should be enclosed within double quotes:

@example
python -m pip install SomePackage==1.0.4    # specific version
python -m pip install "SomePackage>=1.0.4"  # minimum version
@end example

Normally, if a suitable module is already installed, attempting to install
it again will have no effect. Upgrading existing modules must be requested
explicitly:

@example
python -m pip install --upgrade SomePackage
@end example

More information and resources regarding @code{pip} and its capabilities can be
found in the Python Packaging User Guide@footnote{https://packaging.python.org}.

Creation of virtual environments is done through the @ref{118,,venv} module.
Installing packages into an active virtual environment uses the commands shown
above.


@subsubheading See also


Python Packaging User Guide: Installing Python Distribution Packages@footnote{https://packaging.python.org/installing/}


@node How do I …?,Common installation issues,Basic usage<2>,Installing Python modules
@anchor{installing/index how-do-i}@anchor{5a08}
@section How do I …?


These are quick answers or links for some common tasks.

@c installing-per-user-installation:

@menu
* … install packages just for the current user?:: 
* … install scientific Python packages?:: 
* … work with multiple versions of Python installed in parallel?:: 

@end menu

@node … install packages just for the current user?,… install scientific Python packages?,,How do I …?
@anchor{installing/index install-packages-just-for-the-current-user}@anchor{5a09}
@subsection … install packages just for the current user?


Passing the @code{--user} option to @code{python -m pip install} will install a
package just for the current user, rather than for all users of the system.

@node … install scientific Python packages?,… work with multiple versions of Python installed in parallel?,… install packages just for the current user?,How do I …?
@anchor{installing/index install-scientific-python-packages}@anchor{5a0a}
@subsection … install scientific Python packages?


A number of scientific Python packages have complex binary dependencies, and
aren’t currently easy to install using @code{pip} directly.
It will often be easier for users to install these packages by
other means@footnote{https://packaging.python.org/science/}
rather than attempting to install them with @code{pip}.


@subsubheading See also


Python Packaging User Guide: Installing Scientific Packages@footnote{https://packaging.python.org/science/}


@node … work with multiple versions of Python installed in parallel?,,… install scientific Python packages?,How do I …?
@anchor{installing/index work-with-multiple-versions-of-python-installed-in-parallel}@anchor{5a0b}
@subsection … work with multiple versions of Python installed in parallel?


On Linux, macOS, and other POSIX systems, use the versioned Python commands
in combination with the @code{-m} switch to run the appropriate copy of
@code{pip}:

@example
python3    -m pip install SomePackage  # default Python 3
python3.14 -m pip install SomePackage  # specifically Python 3.14
@end example

Appropriately versioned @code{pip} commands may also be available.

On Windows, use the @code{py} Python launcher in combination with the @code{-m}
switch:

@example
py -3    -m pip install SomePackage  # default Python 3
py -3.14 -m pip install SomePackage  # specifically Python 3.14
@end example

@c other questions:
@c 
@c Once the Development & Deployment part of PPUG is fleshed out, some of
@c those sections should be linked from new questions here (most notably,
@c we should have a question about avoiding depending on PyPI that links to
@c https://packaging.python.org/en/latest/guides/index-mirrors-and-caches/)

@node Common installation issues,,How do I …?,Installing Python modules
@anchor{installing/index common-installation-issues}@anchor{5a0c}
@section Common installation issues


@menu
* Installing into the system Python on Linux:: 
* Pip not installed:: 
* Installing binary extensions:: 

@end menu

@node Installing into the system Python on Linux,Pip not installed,,Common installation issues
@anchor{installing/index installing-into-the-system-python-on-linux}@anchor{5a0d}
@subsection Installing into the system Python on Linux


On Linux systems, a Python installation will typically be included as part
of the distribution. Installing into this Python installation requires
root access to the system, and may interfere with the operation of the
system package manager and other components of the system if a component
is unexpectedly upgraded using @code{pip}.

On such systems, it is often better to use a virtual environment or a
per-user installation when installing packages with @code{pip}.

@node Pip not installed,Installing binary extensions,Installing into the system Python on Linux,Common installation issues
@anchor{installing/index pip-not-installed}@anchor{5a0e}
@subsection Pip not installed


It is possible that @code{pip} does not get installed by default. One potential fix is:

@example
python -m ensurepip --default-pip
@end example

There are also additional resources for installing pip@footnote{https://packaging.python.org/en/latest/tutorials/installing-packages/#ensure-pip-setuptools-and-wheel-are-up-to-date}.

@node Installing binary extensions,,Pip not installed,Common installation issues
@anchor{installing/index installing-binary-extensions}@anchor{5a0f}
@subsection Installing binary extensions


Python once relied heavily on source-based distribution, with end
users being expected to compile extension modules from source as part of
the installation process.

With the introduction of the binary wheel format, and the
ability to publish wheels through PyPI, this problem is diminishing,
as users are more regularly able to install pre-built extensions rather
than needing to build them themselves.

Some of the solutions for installing scientific software@footnote{https://packaging.python.org/science/}
that are not yet available as pre-built wheel files may also help with
obtaining other binary extensions without needing to build them locally.


@subsubheading See also


Python Packaging User Guide: Binary Extensions@footnote{https://packaging.python.org/extensions/}


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Python HOWTOs,Python Frequently Asked Questions,Installing Python modules,Top
@anchor{howto/index doc}@anchor{5a10}@anchor{howto/index how-tos}@anchor{5a11}@anchor{howto/index python-howtos}@anchor{5a12}@anchor{howto/index translation-repo}@anchor{5a13}
@chapter Python HOWTOs


Python HOWTOs are documents that cover a specific topic in-depth.
Modeled on the Linux Documentation Project’s HOWTO collection, this collection is an
effort to foster documentation that’s more detailed than the
Python Library Reference.

@menu
* A Conceptual Overview of asyncio:: 
* Porting Extension Modules to Python 3:: 
* Curses Programming with Python:: 
* Descriptor Guide:: 
* Debugging C API extensions and CPython Internals with GDB:: 
* Enum HOWTO:: 
* Functional Programming HOWTO:: 
* Logging HOWTO:: 
* Logging Cookbook:: 
* Regular expression HOWTO:: 
* Socket Programming HOWTO:: 
* Sorting Techniques:: 
* Unicode HOWTO:: 
* HOWTO Fetch Internet Resources Using The urllib Package:: 
* An introduction to the ipaddress module:: 
* Instrumenting CPython with DTrace and SystemTap:: 
* Python support for the Linux perf profiler:: 
* Annotations Best Practices:: 
* Isolating Extension Modules:: 
* timer file descriptor HOWTO:: 
* The Python 2.3 Method Resolution Order: The Python 2 3 Method Resolution Order. 
* Python support for free threading:: 
* C API Extension Support for Free Threading:: 
* Remote debugging attachment protocol:: 
* Permission requirements:: 
* Locating the PyRuntime structure:: 
* Reading _Py_DebugOffsets:: 
* Locating the interpreter and thread state:: 
* Writing control information:: 
* Summary:: 
* Security and threat model:: 

@end menu

@node A Conceptual Overview of asyncio,Porting Extension Modules to Python 3,,Python HOWTOs
@anchor{howto/a-conceptual-overview-of-asyncio doc}@anchor{5a14}@anchor{howto/a-conceptual-overview-of-asyncio a-conceptual-overview-of-asyncio}@anchor{382f}@anchor{howto/a-conceptual-overview-of-asyncio id1}@anchor{5a15}
@section A Conceptual Overview of @code{asyncio}


This @ref{5a11,,HOWTO} article seeks to help you build a sturdy mental
model of how @ref{b,,asyncio} fundamentally works, helping you understand the
how and why behind the recommended patterns.

You might be curious about some key @code{asyncio} concepts.
By the end of this article, you’ll be able to comfortably answer these questions:


@itemize -

@item 
What’s happening behind the scenes when an object is awaited?

@item 
How does @code{asyncio} differentiate between a task which doesn’t need
CPU time (such as a network request or file read) as opposed to a task that
does (such as computing n-factorial)?

@item 
How to write an asynchronous variant of an operation, such as
an async sleep or database request.
@end itemize


@subsubheading See also



@itemize *

@item 
The guide@footnote{https://github.com/anordin95/a-conceptual-overview-of-asyncio/tree/main} that inspired this HOWTO article, by Alexander Nordin.

@item 
This in-depth YouTube tutorial series@footnote{https://www.youtube.com/watch?v=Xbl7XjFYsN4&list=PLhNSoGM2ik6SIkVGXWBwerucXjgP1rHmB} on
@code{asyncio} created by Python core team member, Łukasz Langa.

@item 
500 Lines or Less: A Web Crawler With asyncio Coroutines@footnote{https://aosabook.org/en/500L/a-web-crawler-with-asyncio-coroutines.html} by A.
Jesse Jiryu Davis and Guido van Rossum.
@end itemize


@menu
* A conceptual overview part 1; the high-level: A conceptual overview part 1 the high-level. 
* A conceptual overview part 2; the nuts and bolts: A conceptual overview part 2 the nuts and bolts. 

@end menu

@node A conceptual overview part 1 the high-level,A conceptual overview part 2 the nuts and bolts,,A Conceptual Overview of asyncio
@anchor{howto/a-conceptual-overview-of-asyncio a-conceptual-overview-part-1-the-high-level}@anchor{5a16}
@subsection A conceptual overview part 1: the high-level


In part 1, we’ll cover the main, high-level building blocks of @code{asyncio}:
the event loop, coroutine functions, coroutine objects, tasks, and @code{await}.

@menu
* Event Loop:: 
* Asynchronous functions and coroutines:: 
* Tasks: Tasks<2>. 
* await:: 

@end menu

@node Event Loop,Asynchronous functions and coroutines,,A conceptual overview part 1 the high-level
@anchor{howto/a-conceptual-overview-of-asyncio event-loop}@anchor{5a17}
@subsubsection Event Loop


Everything in @code{asyncio} happens relative to the event loop.
It’s the star of the show.
It’s like an orchestra conductor.
It’s behind the scenes managing resources.
Some power is explicitly granted to it, but a lot of its ability to get things
done comes from the respect and cooperation of its worker bees.

In more technical terms, the event loop contains a collection of jobs to be run.
Some jobs are added directly by you, and some indirectly by @code{asyncio}.
The event loop takes a job from its backlog of work and invokes it (or “gives
it control”), similar to calling a function, and then that job runs.
Once it pauses or completes, it returns control to the event loop.
The event loop will then select another job from its pool and invoke it.
You can `roughly' think of the collection of jobs as a queue: jobs are added and
then processed one at a time, generally (but not always) in order.
This process repeats indefinitely, with the event loop cycling endlessly
onwards.
If there are no more jobs pending execution, the event loop is smart enough to
rest and avoid needlessly wasting CPU cycles, and will come back when there’s
more work to be done.

Effective execution relies on jobs sharing well and cooperating; a greedy job
could hog control and leave the other jobs to starve, rendering the overall
event loop approach rather useless.

@example
import asyncio

# This creates an event loop and indefinitely cycles through
# its collection of jobs.
event_loop = asyncio.new_event_loop()
event_loop.run_forever()
@end example

@node Asynchronous functions and coroutines,Tasks<2>,Event Loop,A conceptual overview part 1 the high-level
@anchor{howto/a-conceptual-overview-of-asyncio asynchronous-functions-and-coroutines}@anchor{5a18}
@subsubsection Asynchronous functions and coroutines


This is a basic, boring Python function:

@example
def hello_printer():
    print(
        "Hi, I am a lowly, simple printer, though I have all I "
        "need in life -- \nfresh paper and my dearly beloved octopus "
        "partner in crime."
    )
@end example

Calling a regular function invokes its logic or body:

@example
>>> hello_printer()
Hi, I am a lowly, simple printer, though I have all I need in life --
fresh paper and my dearly beloved octopus partner in crime.
@end example

The @ref{7ee,,async def}, as opposed to just a plain @code{def}, makes
this an asynchronous function (or “coroutine function”).
Calling it creates and returns a @ref{3830,,coroutine} object.

@example
async def loudmouth_penguin(magic_number: int):
    print(
     "I am a super special talking penguin. Far cooler than that printer. "
     f"By the way, my lucky number is: @{magic_number@}."
    )
@end example

Calling the async function, @code{loudmouth_penguin}, does not execute the print statement;
instead, it creates a coroutine object:

@example
>>> loudmouth_penguin(magic_number=3)
<coroutine object loudmouth_penguin at 0x104ed2740>
@end example

The terms “coroutine function” and “coroutine object” are often conflated
as coroutine.
That can be confusing!
In this article, coroutine specifically refers to a coroutine object, or more
precisely, an instance of @ref{108f,,types.CoroutineType} (native coroutine).
Note that coroutines can also exist as instances of
@ref{fe3,,collections.abc.Coroutine} – a distinction that matters for type
checking.

A coroutine represents the function’s body or logic.
A coroutine has to be explicitly started; again, merely creating the coroutine
does not start it.
Notably, the coroutine can be paused and resumed at various points within the
function’s body.
That pausing and resuming ability is what allows for asynchronous behavior!

Coroutines and coroutine functions were built by leveraging the functionality
of @ref{ddf,,generators} and
@ref{1267,,generator functions}.
Recall, a generator function is a function that @ref{bc8,,yield}s, like this
one:

@example
def get_random_number():
    # This would be a bad random number generator!
    print("Hi")
    yield 1
    print("Hello")
    yield 7
    print("Howdy")
    yield 4
    ...
@end example

Similar to a coroutine function, calling a generator function does not run it.
Instead, it creates a generator object:

@example
>>> get_random_number()
<generator object get_random_number at 0x1048671c0>
@end example

You can proceed to the next @code{yield} of a generator by using the
built-in function @ref{9de,,next()}.
In other words, the generator runs, then pauses.
For example:

@example
>>> generator = get_random_number()
>>> next(generator)
Hi
1
>>> next(generator)
Hello
7
@end example

@node Tasks<2>,await,Asynchronous functions and coroutines,A conceptual overview part 1 the high-level
@anchor{howto/a-conceptual-overview-of-asyncio tasks}@anchor{5a19}
@subsubsection Tasks


Roughly speaking, @ref{3862,,tasks} are coroutines (not coroutine
functions) tied to an event loop.
A task also maintains a list of callback functions whose importance will become
clear in a moment when we discuss @ref{18e,,await}.
The recommended way to create tasks is via @ref{1cb,,asyncio.create_task()}.

Creating a task automatically schedules it for execution (by adding a
callback to run it in the event loop’s to-do list, that is, collection of jobs).

@code{asyncio} automatically associates tasks with the event loop for you.
This automatic association was purposely designed into @code{asyncio} for
the sake of simplicity.
Without it, you’d have to keep track of the event loop object and pass it to
any coroutine function that wants to create tasks, adding redundant clutter
to your code.

@example
coroutine = loudmouth_penguin(magic_number=5)
# This creates a Task object and schedules its execution via the event loop.
task = asyncio.create_task(coroutine)
@end example

Earlier, we manually created the event loop and set it to run forever.
In practice, it’s recommended to use (and common to see) @ref{2f5,,asyncio.run()},
which takes care of managing the event loop and ensuring the provided
coroutine finishes before advancing.
For example, many async programs follow this setup:

@example
import asyncio

async def main():
    # Perform all sorts of wacky, wild asynchronous things...
    ...

if __name__ == "__main__":
    asyncio.run(main())
    # The program will not reach the following print statement until the
    # coroutine main() finishes.
    print("coroutine main() is done!")
@end example

It’s important to be aware that the task itself is not added to the event loop,
only a callback to the task is.
This matters if the task object you created is garbage collected before it’s
called by the event loop.
For example, consider this program:

@example
async def hello():
    print("hello!")

async def main():
    asyncio.create_task(hello())
    # Other asynchronous instructions which run for a while
    # and cede control to the event loop...
    ...

asyncio.run(main())
@end example

Because there’s no reference to the task object created on line 5, it `might'
be garbage collected before the event loop invokes it.
Later instructions in the coroutine @code{main()} hand control back to the event
loop so it can invoke other jobs.
When the event loop eventually tries to run the task, it might fail and
discover the task object does not exist!
This can also happen even if a coroutine keeps a reference to a task but
completes before that task finishes.
When the coroutine exits, local variables go out of scope and may be subject
to garbage collection.
In practice, @code{asyncio} and Python’s garbage collector work pretty hard to
ensure this sort of thing doesn’t happen.
But that’s no reason to be reckless!

@node await,,Tasks<2>,A conceptual overview part 1 the high-level
@anchor{howto/a-conceptual-overview-of-asyncio await}@anchor{5a1a}
@subsubsection await


@ref{18e,,await} is a Python keyword that’s commonly used in one of two
different ways:

@example
await task
await coroutine
@end example

In a crucial way, the behavior of @code{await} depends on the type of object
being awaited.

Awaiting a task will cede control from the current task or coroutine to
the event loop.
In the process of relinquishing control, a few important things happen.
We’ll use the following code example to illustrate:

@example
async def plant_a_tree():
    dig_the_hole_task = asyncio.create_task(dig_the_hole())
    await dig_the_hole_task

    # Other instructions associated with planting a tree.
    ...
@end example

In this example, imagine the event loop has passed control to the start of the
coroutine @code{plant_a_tree()}.
As seen above, the coroutine creates a task and then awaits it.
The @code{await dig_the_hole_task} instruction adds a callback (which will resume
@code{plant_a_tree()}) to the @code{dig_the_hole_task} object’s list of callbacks.
And then, the instruction cedes control to the event loop.
Some time later, the event loop will pass control to @code{dig_the_hole_task}
and the task will finish whatever it needs to do.
Once the task finishes, it will add its various callbacks to the event loop,
in this case, a call to resume @code{plant_a_tree()}.

Generally speaking, when the awaited task finishes (@code{dig_the_hole_task}),
the original task or coroutine (@code{plant_a_tree()}) is added back to the event
loop’s to-do list to be resumed.

This is a basic, yet reliable mental model.
In practice, the control handoffs are slightly more complex, but not by much.
In part 2, we’ll walk through the details that make this possible.

`Unlike tasks, awaiting a coroutine does not hand control back to the event
loop!'
Wrapping a coroutine in a task first, then awaiting that would cede
control.
The behavior of @code{await coroutine} is effectively the same as invoking a
regular, synchronous Python function.
Consider this program:

@example
import asyncio

async def coro_a():
   print("I am coro_a(). Hi!")

async def coro_b():
   print("I am coro_b(). I sure hope no one hogs the event loop...")

async def main():
   task_b = asyncio.create_task(coro_b())
   num_repeats = 3
   for _ in range(num_repeats):
      await coro_a()
   await task_b

asyncio.run(main())
@end example

The first statement in the coroutine @code{main()} creates @code{task_b} and schedules
it for execution via the event loop.
Then, @code{coro_a()} is repeatedly awaited. Control never cedes to the
event loop, which is why we see the output of all three @code{coro_a()}
invocations before @code{coro_b()}’s output:

@example
I am coro_a(). Hi!
I am coro_a(). Hi!
I am coro_a(). Hi!
I am coro_b(). I sure hope no one hogs the event loop...
@end example

If we change @code{await coro_a()} to @code{await asyncio.create_task(coro_a())}, the
behavior changes.
The coroutine @code{main()} cedes control to the event loop with that statement.
The event loop then proceeds through its backlog of work, calling @code{task_b}
and then the task which wraps @code{coro_a()} before resuming the coroutine
@code{main()}.

@example
I am coro_b(). I sure hope no one hogs the event loop...
I am coro_a(). Hi!
I am coro_a(). Hi!
I am coro_a(). Hi!
@end example

This behavior of @code{await coroutine} can trip a lot of people up!
That example highlights how using only @code{await coroutine} could
unintentionally hog control from other tasks and effectively stall the event
loop.
@ref{2f5,,asyncio.run()} can help you detect such occurrences via the
@code{debug=True} flag, which enables
@ref{217d,,debug mode}.
Among other things, it will log any coroutines that monopolize execution for
100ms or longer.

The design intentionally trades off some conceptual clarity around usage of
@code{await} for improved performance.
Each time a task is awaited, control needs to be passed all the way up the
call stack to the event loop.
That might sound minor, but in a large program with many @code{await} statements and a deep
call stack, that overhead can add up to a meaningful performance drag.

@node A conceptual overview part 2 the nuts and bolts,,A conceptual overview part 1 the high-level,A Conceptual Overview of asyncio
@anchor{howto/a-conceptual-overview-of-asyncio a-conceptual-overview-part-2-the-nuts-and-bolts}@anchor{5a1b}
@subsection A conceptual overview part 2: the nuts and bolts


Part 2 goes into detail on the mechanisms @code{asyncio} uses to manage
control flow.
This is where the magic happens.
You’ll come away from this section knowing what @code{await} does behind the scenes
and how to make your own asynchronous operators.

@menu
* The inner workings of coroutines:: 
* Futures: Futures<2>. 
* A homemade asyncio.sleep: A homemade asyncio sleep. 

@end menu

@node The inner workings of coroutines,Futures<2>,,A conceptual overview part 2 the nuts and bolts
@anchor{howto/a-conceptual-overview-of-asyncio the-inner-workings-of-coroutines}@anchor{5a1c}
@subsubsection The inner workings of coroutines


@code{asyncio} leverages four components to pass around control.

@ref{2461,,coroutine.send(arg)} is the method used to start or
resume a coroutine.
If the coroutine was paused and is now being resumed, the argument @code{arg}
will be sent in as the return value of the @code{yield} statement which originally
paused it.
If the coroutine is being used for the first time (as opposed to being resumed),
@code{arg} must be @code{None}.

@example
class Rock:
    def __await__(self):
        value_sent_in = yield 7
        print(f"Rock.__await__ resuming with value: @{value_sent_in@}.")
        return value_sent_in

async def main():
    print("Beginning coroutine main().")
    rock = Rock()
    print("Awaiting rock...")
    value_from_rock = await rock
    print(f"Coroutine received value: @{value_from_rock@} from rock.")
    return 23

coroutine = main()
intermediate_result = coroutine.send(None)
print(f"Coroutine paused and returned intermediate value: @{intermediate_result@}.")

print(f"Resuming coroutine and sending in value: 42.")
try:
    coroutine.send(42)
except StopIteration as e:
    returned_value = e.value
print(f"Coroutine main() finished and provided value: @{returned_value@}.")
@end example

@ref{24df,,yield}, as usual, pauses execution and returns control
to the caller.
In the example above, the @code{yield}, on line 3, is called by
@code{... = await rock} on line 11.
More broadly speaking, @code{await} calls the @ref{f7b,,__await__()} method of
the given object.
@code{await} also does one more very special thing: it propagates (or “passes
along”) any @code{yield}s it receives up the call chain.
In this case, that’s back to @code{... = coroutine.send(None)} on line 16.

The coroutine is resumed via the @code{coroutine.send(42)} call on line 21.
The coroutine picks back up from where it @code{yield}ed (or paused) on line 3
and executes the remaining statements in its body.
When a coroutine finishes, it raises a @ref{dfb,,StopIteration} exception with the
return value attached in the @ref{245e,,value} attribute.

That snippet produces this output:

@example
Beginning coroutine main().
Awaiting rock...
Coroutine paused and returned intermediate value: 7.
Resuming coroutine and sending in value: 42.
Rock.__await__ resuming with value: 42.
Coroutine received value: 42 from rock.
Coroutine main() finished and provided value: 23.
@end example

It’s worth pausing for a moment here and making sure you followed the various
ways that control flow and values were passed. A lot of important ideas were
covered and it’s worth ensuring your understanding is firm.

The only way to yield (or effectively cede control) from a coroutine is to
@code{await} an object that @code{yield}s in its @code{__await__} method.
That might sound odd to you. You might be thinking:

@quotation

1. What about a @code{yield} directly within the coroutine function? The
coroutine function becomes an
@ref{24e3,,async generator function}, a
different beast entirely.

2. What about a @ref{24df,,yield from} within the coroutine function to a (plain)
generator?
That causes the error: @code{SyntaxError: yield from not allowed in a coroutine.}
This was intentionally designed for the sake of simplicity – mandating only
one way of using coroutines.
Initially @code{yield} was barred as well, but was re-accepted to allow for
async generators.
Despite that, @code{yield from} and @code{await} effectively do the same thing.
@end quotation

@node Futures<2>,A homemade asyncio sleep,The inner workings of coroutines,A conceptual overview part 2 the nuts and bolts
@anchor{howto/a-conceptual-overview-of-asyncio futures}@anchor{5a1d}
@subsubsection Futures


A @ref{393d,,future} is an object meant to represent a
computation’s status and result.
The term is a nod to the idea of something still to come or not yet happened,
and the object is a way to keep an eye on that something.

A future has a few important attributes. One is its state, which can be either
“pending”, “cancelled”, or “done”.
Another is its result, which is set when the state transitions to done.
Unlike a coroutine, a future does not represent the actual computation to be
done; instead, it represents the status and result of that computation, kind of
like a status light (red, yellow, or green) or indicator.

@ref{1c9,,asyncio.Task} subclasses @ref{dcc,,asyncio.Future} in order to gain
these various capabilities.
The prior section said tasks store a list of callbacks, which wasn’t entirely
accurate.
It’s actually the @code{Future} class that implements this logic, which @code{Task}
inherits.

Futures may also be used directly (not via tasks).
Tasks mark themselves as done when their coroutine is complete.
Futures are much more versatile and will be marked as done when you say so.
In this way, they’re the flexible interface for you to make your own conditions
for waiting and resuming.

@node A homemade asyncio sleep,,Futures<2>,A conceptual overview part 2 the nuts and bolts
@anchor{howto/a-conceptual-overview-of-asyncio a-homemade-asyncio-sleep}@anchor{5a1e}
@subsubsection A homemade asyncio.sleep


We’ll go through an example of how you could leverage a future to create your
own variant of asynchronous sleep (@code{async_sleep}) which mimics
@ref{c6a,,asyncio.sleep()}.

This snippet registers a few tasks with the event loop and then awaits the task
created by @code{asyncio.create_task}, which wraps the @code{async_sleep(3)} coroutine.
We want that task to finish only after three seconds have elapsed, but without
preventing other tasks from running.

@example
async def other_work():
    print("I like work. Work work.")

async def main():
    # Add a few other tasks to the event loop, so there's something
    # to do while asynchronously sleeping.
    work_tasks = [
        asyncio.create_task(other_work()),
        asyncio.create_task(other_work()),
        asyncio.create_task(other_work())
    ]
    print(
        "Beginning asynchronous sleep at time: "
        f"@{datetime.datetime.now().strftime("%H:%M:%S")@}."
    )
    await asyncio.create_task(async_sleep(3))
    print(
        "Done asynchronous sleep at time: "
        f"@{datetime.datetime.now().strftime("%H:%M:%S")@}."
    )
    # asyncio.gather effectively awaits each task in the collection.
    await asyncio.gather(*work_tasks)
@end example

Below, we use a future to enable custom control over when that task will be
marked as done.
If @ref{3865,,future.set_result()} (the method
responsible for marking that future as done) is never called, then this task
will never finish.
We’ve also enlisted the help of another task, which we’ll see in a moment, that
will monitor how much time has elapsed and, accordingly, call
@code{future.set_result()}.

@example
async def async_sleep(seconds: float):
    future = asyncio.Future()
    time_to_wake = time.time() + seconds
    # Add the watcher-task to the event loop.
    watcher_task = asyncio.create_task(_sleep_watcher(future, time_to_wake))
    # Block until the future is marked as done.
    await future
@end example

Below, we use a rather bare @code{YieldToEventLoop()} object to @code{yield}
from its @code{__await__} method, ceding control to the event loop.
This is effectively the same as calling @code{asyncio.sleep(0)}, but this approach
offers more clarity, not to mention it’s somewhat cheating to use
@code{asyncio.sleep} when showcasing how to implement it!

As usual, the event loop cycles through its tasks, giving them control
and receiving control back when they pause or finish.
The @code{watcher_task}, which runs the coroutine @code{_sleep_watcher(...)}, will
be invoked once per full cycle of the event loop.
On each resumption, it’ll check the time and if not enough has elapsed, then
it’ll pause once again and hand control back to the event loop.
Once enough time has elapsed, @code{_sleep_watcher(...)}
marks the future as done and completes by exiting its
infinite @code{while} loop.
Given this helper task is only invoked once per cycle of the event loop,
you’d be correct to note that this asynchronous sleep will sleep `at least'
three seconds, rather than exactly three seconds.
Note this is also true of @code{asyncio.sleep}.

@example
class YieldToEventLoop:
    def __await__(self):
        yield

async def _sleep_watcher(future, time_to_wake):
    while True:
        if time.time() >= time_to_wake:
            # This marks the future as done.
            future.set_result(None)
            break
        else:
            await YieldToEventLoop()
@end example

Here is the full program’s output:

@example
$ python custom-async-sleep.py
Beginning asynchronous sleep at time: 14:52:22.
I like work. Work work.
I like work. Work work.
I like work. Work work.
Done asynchronous sleep at time: 14:52:25.
@end example

You might feel this implementation of asynchronous sleep was unnecessarily
convoluted.
And, well, it was.
The example was meant to showcase the versatility of futures with a simple
example that could be mimicked for more complex needs.
For reference, you could implement it without futures, like so:

@example
async def simpler_async_sleep(seconds):
    time_to_wake = time.time() + seconds
    while True:
        if time.time() >= time_to_wake:
            return
        else:
            await YieldToEventLoop()
@end example

But that’s all for now. Hopefully you’re ready to more confidently dive into
some async programming or check out advanced topics in the
@ref{b,,rest of the documentation}.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Porting Extension Modules to Python 3,Curses Programming with Python,A Conceptual Overview of asyncio,Python HOWTOs
@anchor{howto/cporting doc}@anchor{5a1f}@anchor{howto/cporting cporting-howto}@anchor{14ec}@anchor{howto/cporting porting-extension-modules-to-python-3}@anchor{5a20}@anchor{howto/cporting translation-repo}@anchor{5a21}
@section Porting Extension Modules to Python 3


We recommend the following resources for porting extension modules to Python 3:


@itemize *

@item 
The Migrating C extensions@footnote{http://python3porting.com/cextensions.html} chapter from
`Supporting Python 3: An in-depth guide', a book on moving from Python 2
to Python 3 in general, guides the reader through porting an extension
module.

@item 
The Porting guide@footnote{https://py3c.readthedocs.io/en/latest/guide.html} from the `py3c' project provides opinionated
suggestions with supporting code.

@item 
@ref{51ee,,Recommended third party tools} offer abstractions over
the Python’s C API.
Extensions generally need to be re-written to use one of them,
but the library then handles differences between various Python
versions and implementations.
@end itemize

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Curses Programming with Python,Descriptor Guide,Porting Extension Modules to Python 3,Python HOWTOs
@anchor{howto/curses doc}@anchor{5a22}@anchor{howto/curses curses-howto}@anchor{34da}@anchor{howto/curses curses-programming-with-python}@anchor{5a23}@anchor{howto/curses translation-repo}@anchor{5a24}
@section Curses Programming with Python


@*Author: 
A.M. Kuchling, Eric S. Raymond


@*Release: 
2.04


@subsubheading Abstract



This document describes how to use the @ref{2f,,curses} extension
module to control text-mode displays.

@menu
* What is curses?:: 
* Starting and ending a curses application:: 
* Windows and Pads:: 
* Displaying Text:: 
* User Input:: 
* For More Information:: 

@end menu

@node What is curses?,Starting and ending a curses application,,Curses Programming with Python
@anchor{howto/curses what-is-curses}@anchor{5a25}
@subsection What is curses?


The curses library supplies a terminal-independent screen-painting and
keyboard-handling facility for text-based terminals; such terminals
include VT100s, the Linux console, and the simulated terminal provided
by various programs.  Display terminals support various control codes
to perform common operations such as moving the cursor, scrolling the
screen, and erasing areas.  Different terminals use widely differing
codes, and often have their own minor quirks.

In a world of graphical displays, one might ask “why bother”?  It’s
true that character-cell display terminals are an obsolete technology,
but there are niches in which being able to do fancy things with them
are still valuable.  One niche is on small-footprint or embedded
Unixes that don’t run an X server.  Another is tools such as OS
installers and kernel configurators that may have to run before any
graphical support is available.

The curses library provides fairly basic functionality, providing the
programmer with an abstraction of a display containing multiple
non-overlapping windows of text.  The contents of a window can be
changed in various ways—adding text, erasing it, changing its
appearance—and the curses library will figure out what control codes
need to be sent to the terminal to produce the right output.  curses
doesn’t provide many user-interface concepts such as buttons, checkboxes,
or dialogs; if you need such features, consider a user interface library such as
Urwid@footnote{https://pypi.org/project/Urwid/}.

The curses library was originally written for BSD Unix; the later System V
versions of Unix from AT&T added many enhancements and new functions. BSD curses
is no longer maintained, having been replaced by ncurses, which is an
open-source implementation of the AT&T interface.  If you’re using an
open-source Unix such as Linux or FreeBSD, your system almost certainly uses
ncurses.  Since most current commercial Unix versions are based on System V
code, all the functions described here will probably be available.  The older
versions of curses carried by some proprietary Unixes may not support
everything, though.

The Windows version of Python doesn’t include the @ref{2f,,curses}
module.  A ported version called UniCurses@footnote{https://pypi.org/project/UniCurses/} is available.

@menu
* The Python curses module:: 

@end menu

@node The Python curses module,,,What is curses?
@anchor{howto/curses the-python-curses-module}@anchor{5a26}
@subsubsection The Python curses module


The Python module is a fairly simple wrapper over the C functions provided by
curses; if you’re already familiar with curses programming in C, it’s really
easy to transfer that knowledge to Python.  The biggest difference is that the
Python interface makes things simpler by merging different C functions such as
@code{addstr()}, @code{mvaddstr()}, and @code{mvwaddstr()} into a single
@ref{34f0,,addstr()} method.  You’ll see this covered in more
detail later.

This HOWTO is an introduction to writing text-mode programs with curses
and Python. It doesn’t attempt to be a complete guide to the curses API; for
that, see the Python library guide’s section on ncurses, and the C manual pages
for ncurses.  It will, however, give you the basic ideas.

@node Starting and ending a curses application,Windows and Pads,What is curses?,Curses Programming with Python
@anchor{howto/curses starting-and-ending-a-curses-application}@anchor{5a27}
@subsection Starting and ending a curses application


Before doing anything, curses must be initialized.  This is done by
calling the @ref{1953,,initscr()} function, which will determine the
terminal type, send any required setup codes to the terminal, and
create various internal data structures.  If successful,
@code{initscr()} returns a window object representing the entire
screen; this is usually called @code{stdscr} after the name of the
corresponding C variable.

@example
import curses
stdscr = curses.initscr()
@end example

Usually curses applications turn off automatic echoing of keys to the
screen, in order to be able to read keys and only display them under
certain circumstances.  This requires calling the
@ref{3519,,noecho()} function.

@example
curses.noecho()
@end example

Applications will also commonly need to react to keys instantly,
without requiring the Enter key to be pressed; this is called cbreak
mode, as opposed to the usual buffered input mode.

@example
curses.cbreak()
@end example

Terminals usually return special keys, such as the cursor keys or navigation
keys such as Page Up and Home, as a multibyte escape sequence.  While you could
write your application to expect such sequences and process them accordingly,
curses can do it for you, returning a special value such as
@ref{358d,,curses.KEY_LEFT}.  To get curses to do the job, you’ll have to enable
keypad mode.

@example
stdscr.keypad(True)
@end example

Terminating a curses application is much easier than starting one. You’ll need
to call:

@example
curses.nocbreak()
stdscr.keypad(False)
curses.echo()
@end example

to reverse the curses-friendly terminal settings. Then call the
@ref{34f3,,endwin()} function to restore the terminal to its original
operating mode.

@example
curses.endwin()
@end example

A common problem when debugging a curses application is to get your terminal
messed up when the application dies without restoring the terminal to its
previous state.  In Python this commonly happens when your code is buggy and
raises an uncaught exception.  Keys are no longer echoed to the screen when
you type them, for example, which makes using the shell difficult.

In Python you can avoid these complications and make debugging much easier by
importing the @ref{c79,,curses.wrapper()} function and using it like this:

@example
from curses import wrapper

def main(stdscr):
    # Clear screen
    stdscr.clear()

    # This raises ZeroDivisionError when i == 10.
    for i in range(0, 11):
        v = i-10
        stdscr.addstr(i, 0, '10 divided by @{@} is @{@}'.format(v, 10/v))

        stdscr.refresh()
        stdscr.getkey()

wrapper(main)
@end example

The @ref{c79,,wrapper()} function takes a callable object and does the
initializations described above, also initializing colors if color
support is present.  @code{wrapper()} then runs your provided callable.
Once the callable returns, @code{wrapper()} will restore the original
state of the terminal.  The callable is called inside a
@ref{8fa,,try}…@ref{1ac,,except} that catches exceptions, restores
the state of the terminal, and then re-raises the exception.  Therefore
your terminal won’t be left in a funny state on exception and you’ll be
able to read the exception’s message and traceback.

@node Windows and Pads,Displaying Text,Starting and ending a curses application,Curses Programming with Python
@anchor{howto/curses windows-and-pads}@anchor{5a28}
@subsection Windows and Pads


Windows are the basic abstraction in curses.  A window object represents a
rectangular area of the screen, and supports methods to display text,
erase it, allow the user to input strings, and so forth.

The @code{stdscr} object returned by the @ref{1953,,initscr()} function is a
window object that covers the entire screen.  Many programs may need
only this single window, but you might wish to divide the screen into
smaller windows, in order to redraw or clear them separately. The
@ref{3516,,newwin()} function creates a new window of a given size,
returning the new window object.

@example
begin_x = 20; begin_y = 7
height = 5; width = 40
win = curses.newwin(height, width, begin_y, begin_x)
@end example

Note that the coordinate system used in curses is unusual.
Coordinates are always passed in the order `y,x', and the top-left
corner of a window is coordinate (0,0).  This breaks the normal
convention for handling coordinates where the `x' coordinate comes
first.  This is an unfortunate difference from most other computer
applications, but it’s been part of curses since it was first written,
and it’s too late to change things now.

Your application can determine the size of the screen by using the
@ref{ff2,,curses.LINES} and @ref{ff3,,curses.COLS} variables to obtain the `y' and
`x' sizes.  Legal coordinates will then extend from @code{(0,0)} to
@code{(curses.LINES - 1, curses.COLS - 1)}.

When you call a method to display or erase text, the effect doesn’t
immediately show up on the display.  Instead you must call the
@ref{34f1,,refresh()} method of window objects to update the
screen.

This is because curses was originally written with slow 300-baud
terminal connections in mind; with these terminals, minimizing the
time required to redraw the screen was very important.  Instead curses
accumulates changes to the screen and displays them in the most
efficient manner when you call @code{refresh()}.  For example, if your
program displays some text in a window and then clears the window,
there’s no need to send the original text because they’re never
visible.

In practice, explicitly telling curses to redraw a window doesn’t
really complicate programming with curses much. Most programs go into a flurry
of activity, and then pause waiting for a keypress or some other action on the
part of the user.  All you have to do is to be sure that the screen has been
redrawn before pausing to wait for user input, by first calling
@code{stdscr.refresh()} or the @code{refresh()} method of some other relevant
window.

A pad is a special case of a window; it can be larger than the actual display
screen, and only a portion of the pad displayed at a time. Creating a pad
requires the pad’s height and width, while refreshing a pad requires giving the
coordinates of the on-screen area where a subsection of the pad will be
displayed.

@example
pad = curses.newpad(100, 100)
# These loops fill the pad with letters; addch() is
# explained in the next section
for y in range(0, 99):
    for x in range(0, 99):
        pad.addch(y,x, ord('a') + (x*x+y*y) % 26)

# Displays a section of the pad in the middle of the screen.
# (0,0) : coordinate of upper-left corner of pad area to display.
# (5,5) : coordinate of upper-left corner of window area to be filled
#         with pad content.
# (20, 75) : coordinate of lower-right corner of window area to be
#          : filled with pad content.
pad.refresh( 0,0, 5,5, 20,75)
@end example

The @code{refresh()} call displays a section of the pad in the rectangle
extending from coordinate (5,5) to coordinate (20,75) on the screen; the upper
left corner of the displayed section is coordinate (0,0) on the pad.  Beyond
that difference, pads are exactly like ordinary windows and support the same
methods.

If you have multiple windows and pads on screen there is a more
efficient way to update the screen and prevent annoying screen flicker
as each part of the screen gets updated.  @code{refresh()} actually
does two things:


@enumerate 

@item 
Calls the @ref{34ef,,noutrefresh()} method of each window
to update an underlying data structure representing the desired
state of the screen.

@item 
Calls the function @ref{34ee,,doupdate()} function to change the
physical screen to match the desired state recorded in the data structure.
@end enumerate

Instead you can call @code{noutrefresh()} on a number of windows to
update the data structure, and then call @code{doupdate()} to update
the screen.

@node Displaying Text,User Input,Windows and Pads,Curses Programming with Python
@anchor{howto/curses displaying-text}@anchor{5a29}
@subsection Displaying Text


From a C programmer’s point of view, curses may sometimes look like a
twisty maze of functions, all subtly different.  For example,
@code{addstr()} displays a string at the current cursor location in
the @code{stdscr} window, while @code{mvaddstr()} moves to a given y,x
coordinate first before displaying the string. @code{waddstr()} is just
like @code{addstr()}, but allows specifying a window to use instead of
using @code{stdscr} by default. @code{mvwaddstr()} allows specifying both
a window and a coordinate.

Fortunately the Python interface hides all these details.  @code{stdscr}
is a window object like any other, and methods such as
@ref{34f0,,addstr()} accept multiple argument forms.  Usually there
are four different forms.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Form

@tab

Description

@item

`str' or `ch'

@tab

Display the string `str' or character `ch' at
the current position

@item

`str' or `ch', `attr'

@tab

Display the string `str' or character `ch',
using attribute `attr' at the current
position

@item

`y', `x', `str' or `ch'

@tab

Move to position `y,x' within the window, and
display `str' or `ch'

@item

`y', `x', `str' or `ch', `attr'

@tab

Move to position `y,x' within the window, and
display `str' or `ch', using attribute `attr'

@end multitable


Attributes allow displaying text in highlighted forms such as boldface,
underline, reverse code, or in color.  They’ll be explained in more detail in
the next subsection.

The @ref{34f0,,addstr()} method takes a Python string or
bytestring as the value to be displayed.  The contents of bytestrings
are sent to the terminal as-is.  Strings are encoded to bytes using
the value of the window’s @ref{12a2,,encoding} attribute; this defaults to
the default system encoding as returned by @ref{867,,locale.getencoding()}.

The @ref{352f,,addch()} methods take a character, which can be
either a string of length 1, a bytestring of length 1, or an integer.

Constants are provided for extension characters; these constants are
integers greater than 255.  For example, @ref{35fa,,ACS_PLMINUS} is a +/-
symbol, and @ref{3539,,ACS_ULCORNER} is the upper left corner of a box
(handy for drawing borders).  You can also use the appropriate Unicode
character.

Windows remember where the cursor was left after the last operation, so if you
leave out the `y,x' coordinates, the string or character will be displayed
wherever the last operation left off.  You can also move the cursor with the
@code{move(y,x)} method.  Because some terminals always display a flashing cursor,
you may want to ensure that the cursor is positioned in some location where it
won’t be distracting; it can be confusing to have the cursor blinking at some
apparently random location.

If your application doesn’t need a blinking cursor at all, you can
call @code{curs_set(False)} to make it invisible.  For compatibility
with older curses versions, there’s a @code{leaveok(bool)} function
that’s a synonym for @ref{34e8,,curs_set()}.  When `bool' is true, the
curses library will attempt to suppress the flashing cursor, and you
won’t need to worry about leaving it in odd locations.

@menu
* Attributes and Color:: 

@end menu

@node Attributes and Color,,,Displaying Text
@anchor{howto/curses attributes-and-color}@anchor{5a2a}
@subsubsection Attributes and Color


Characters can be displayed in different ways.  Status lines in a text-based
application are commonly shown in reverse video, or a text viewer may need to
highlight certain words.  curses supports this by allowing you to specify an
attribute for each cell on the screen.

An attribute is an integer, each bit representing a different
attribute.  You can try to display text with multiple attribute bits
set, but curses doesn’t guarantee that all the possible combinations
are available, or that they’re all visually distinct.  That depends on
the ability of the terminal being used, so it’s safest to stick to the
most commonly available attributes, listed here.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Attribute

@tab

Description

@item

@ref{3579,,A_BLINK}

@tab

Blinking text

@item

@ref{357a,,A_BOLD}

@tab

Extra bright or bold text

@item

@ref{357b,,A_DIM}

@tab

Half bright text

@item

@ref{34e6,,A_REVERSE}

@tab

Reverse-video text

@item

@ref{34e5,,A_STANDOUT}

@tab

The best highlighting mode available

@item

@ref{357f,,A_UNDERLINE}

@tab

Underlined text

@end multitable


So, to display a reverse-video status line on the top line of the screen, you
could code:

@example
stdscr.addstr(0, 0, "Current mode: Typing mode",
              curses.A_REVERSE)
stdscr.refresh()
@end example

The curses library also supports color on those terminals that provide it. The
most common such terminal is probably the Linux console, followed by color
xterms.

To use color, you must call the @ref{3522,,start_color()} function soon
after calling @ref{1953,,initscr()}, to initialize the default color set
(the @ref{c79,,curses.wrapper()} function does this automatically).  Once that’s
done, the @ref{3506,,has_colors()} function returns TRUE if the terminal
in use can
actually display color.  (Note: curses uses the American spelling ‘color’,
instead of the Canadian/British spelling ‘colour’.  If you’re used to the
British spelling, you’ll have to resign yourself to misspelling it for the sake
of these functions.)

The curses library maintains a finite number of color pairs, containing a
foreground (or text) color and a background color.  You can get the attribute
value corresponding to a color pair with the @ref{34e4,,color_pair()}
function; this can be bitwise-OR’ed with other attributes such as
@ref{34e6,,A_REVERSE}, but again, such combinations are not guaranteed to work
on all terminals.

An example, which displays a line of text using color pair 1:

@example
stdscr.addstr("Pretty text", curses.color_pair(1))
stdscr.refresh()
@end example

As I said before, a color pair consists of a foreground and background color.
The @code{init_pair(n, f, b)} function changes the definition of color pair `n', to
foreground color f and background color b.  Color pair 0 is hard-wired to white
on black, and cannot be changed.

Colors are numbered, and @ref{3522,,start_color()} initializes 8 basic
colors when it activates color mode.  They are: 0:black, 1:red,
2:green, 3:yellow, 4:blue, 5:magenta, 6:cyan, and 7:white.  The @ref{2f,,curses}
module defines named constants for each of these colors:
@ref{360c,,curses.COLOR_BLACK}, @ref{3611,,curses.COLOR_RED}, and so forth.

Let’s put all this together. To change color 1 to red text on a white
background, you would call:

@example
curses.init_pair(1, curses.COLOR_RED, curses.COLOR_WHITE)
@end example

When you change a color pair, any text already displayed using that color pair
will change to the new colors.  You can also display new text in this color
with:

@example
stdscr.addstr(0,0, "RED ALERT!", curses.color_pair(1))
@end example

Very fancy terminals can change the definitions of the actual colors to a given
RGB value.  This lets you change color 1, which is usually red, to purple or
blue or any other color you like.  Unfortunately, the Linux console doesn’t
support this, so I’m unable to try it out, and can’t provide any examples.  You
can check if your terminal can do this by calling
@ref{34e1,,can_change_color()}, which returns @code{True} if the capability is
there.  If you’re lucky enough to have such a talented terminal, consult your
system’s man pages for more information.

@node User Input,For More Information,Displaying Text,Curses Programming with Python
@anchor{howto/curses user-input}@anchor{5a2b}
@subsection User Input


The C curses library offers only very simple input mechanisms. Python’s
@ref{2f,,curses} module adds a basic text-input widget.  (Other libraries
such as Urwid@footnote{https://pypi.org/project/Urwid/} have more extensive collections of widgets.)

There are two methods for getting input from a window:


@itemize *

@item 
@ref{186f,,getch()} refreshes the screen and then waits for
the user to hit a key, displaying the key if @ref{34f2,,echo()} has been
called earlier.  You can optionally specify a coordinate to which
the cursor should be moved before pausing.

@item 
@ref{354d,,getkey()} does the same thing but converts the
integer to a string.  Individual characters are returned as
1-character strings, and special keys such as function keys return
longer strings containing a key name such as @code{KEY_UP} or @code{^G}.
@end itemize

It’s possible to not wait for the user using the
@ref{3561,,nodelay()} window method. After @code{nodelay(True)},
@code{getch()} and @code{getkey()} for the window become
non-blocking. To signal that no input is ready, @code{getch()} returns
@code{curses.ERR} (a value of -1) and @code{getkey()} raises an exception.
There’s also a @ref{350a,,halfdelay()} function, which can be used to (in
effect) set a timer on each @code{getch()}; if no input becomes
available within a specified delay (measured in tenths of a second),
curses raises an exception.

The @code{getch()} method returns an integer; if it’s between 0 and 255, it
represents the ASCII code of the key pressed.  Values greater than 255 are
special keys such as Page Up, Home, or the cursor keys. You can compare the
value returned to constants such as @ref{359e,,curses.KEY_PPAGE},
@ref{358f,,curses.KEY_HOME}, or @ref{358d,,curses.KEY_LEFT}.  The main loop of
your program may look something like this:

@example
while True:
    c = stdscr.getch()
    if c == ord('p'):
        PrintDocument()
    elif c == ord('q'):
        break  # Exit the while loop
    elif c == curses.KEY_HOME:
        x = y = 0
@end example

The @ref{30,,curses.ascii} module supplies ASCII class membership functions that
take either integer or 1-character string arguments; these may be useful in
writing more readable tests for such loops.  It also supplies
conversion functions  that take either integer or 1-character-string arguments
and return the same type.  For example, @ref{3654,,curses.ascii.ctrl()} returns the
control character corresponding to its argument.

There’s also a method to retrieve an entire string,
@ref{1887,,getstr()}.  It isn’t used very often, because its
functionality is quite limited; the only editing keys available are
the backspace key and the Enter key, which terminates the string.  It
can optionally be limited to a fixed number of characters.

@example
curses.echo()            # Enable echoing of characters

# Get a 15-character string, with the cursor on the top line
s = stdscr.getstr(0,0, 15)
@end example

The @ref{32,,curses.textpad} module supplies a text box that supports an
Emacs-like set of keybindings.  Various methods of the
@ref{3615,,Textbox} class support editing with input
validation and gathering the edit results either with or without
trailing spaces.  Here’s an example:

@example
import curses
from curses.textpad import Textbox, rectangle

def main(stdscr):
    stdscr.addstr(0, 0, "Enter IM message: (hit Ctrl-G to send)")

    editwin = curses.newwin(5,30, 2,1)
    rectangle(stdscr, 1,0, 1+5+1, 1+30+1)
    stdscr.refresh()

    box = Textbox(editwin)

    # Let the user edit until Ctrl-G is struck.
    box.edit()

    # Get resulting contents
    message = box.gather()
@end example

See the library documentation on @ref{32,,curses.textpad} for more details.

@node For More Information,,User Input,Curses Programming with Python
@anchor{howto/curses for-more-information}@anchor{5a2c}
@subsection For More Information


This HOWTO doesn’t cover some advanced topics, such as reading the
contents of the screen or capturing mouse events from an xterm
instance, but the Python library page for the @ref{2f,,curses} module is now
reasonably complete.  You should browse it next.

If you’re in doubt about the detailed behavior of the curses
functions, consult the manual pages for your curses implementation,
whether it’s ncurses or a proprietary Unix vendor’s.  The manual pages
will document any quirks, and provide complete lists of all the
functions, attributes, and @ref{35e6,,ACS_*} characters available to
you.

Because the curses API is so large, some functions aren’t supported in
the Python interface.  Often this isn’t because they’re difficult to
implement, but because no one has needed them yet.  Also, Python
doesn’t yet support the menu library associated with ncurses.
Patches adding support for these would be welcome; see
the Python Developer's Guide@footnote{https://devguide.python.org/} to
learn more about submitting patches to Python.


@itemize *

@item 
Writing Programs with NCURSES@footnote{https://invisible-island.net/ncurses/ncurses-intro.html}:
a lengthy tutorial for C programmers.

@item 
The ncurses man page@footnote{https://linux.die.net/man/3/ncurses}

@item 
The ncurses FAQ@footnote{https://invisible-island.net/ncurses/ncurses.faq.html}

@item 
"Use curses... don't swear"@footnote{https://www.youtube.com/watch?v=eN1eZtjLEnU}:
video of a PyCon 2013 talk on controlling terminals using curses or Urwid.

@item 
"Console Applications with Urwid"@footnote{https://pyvideo.org/video/1568/console-applications-with-urwid}:
video of a PyCon CA 2012 talk demonstrating some applications written using
Urwid.
@end itemize

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Descriptor Guide,Debugging C API extensions and CPython Internals with GDB,Curses Programming with Python,Python HOWTOs
@anchor{howto/descriptor doc}@anchor{5a2d}@anchor{howto/descriptor descriptor-guide}@anchor{5a2e}@anchor{howto/descriptor descriptorhowto}@anchor{16f9}@anchor{howto/descriptor translation-repo}@anchor{5a2f}
@section Descriptor Guide


@*Author: 
Raymond Hettinger


@*Contact: 
<python at rcn dot com>


@ref{18c9,,Descriptors} let objects customize attribute lookup,
storage, and deletion.

This guide has four major sections:


@enumerate 

@item 
The “primer” gives a basic overview, moving gently from simple examples,
adding one feature at a time.  Start here if you’re new to descriptors.

@item 
The second section shows a complete, practical descriptor example.  If you
already know the basics, start there.

@item 
The third section provides a more technical tutorial that goes into the
detailed mechanics of how descriptors work.  Most people don’t need this
level of detail.

@item 
The last section has pure Python equivalents for built-in descriptors that
are written in C.  Read this if you’re curious about how functions turn
into bound methods or about the implementation of common tools like
@ref{48f,,classmethod()}, @ref{451,,staticmethod()}, @ref{4b4,,property()}, and
@ref{7f8,,__slots__}.
@end enumerate

@menu
* Primer:: 
* Complete Practical Example:: 
* Technical Tutorial:: 
* Pure Python Equivalents:: 

@end menu

@node Primer,Complete Practical Example,,Descriptor Guide
@anchor{howto/descriptor primer}@anchor{5a30}
@subsection Primer


In this primer, we start with the most basic possible example and then we’ll
add new capabilities one by one.

@menu
* Simple example; A descriptor that returns a constant: Simple example A descriptor that returns a constant. 
* Dynamic lookups:: 
* Managed attributes:: 
* Customized names:: 
* Closing thoughts:: 

@end menu

@node Simple example A descriptor that returns a constant,Dynamic lookups,,Primer
@anchor{howto/descriptor simple-example-a-descriptor-that-returns-a-constant}@anchor{5a31}
@subsubsection Simple example: A descriptor that returns a constant


The @code{Ten} class is a descriptor whose @ref{16f4,,__get__()} method always
returns the constant @code{10}:

@example
class Ten:
    def __get__(self, obj, objtype=None):
        return 10
@end example

To use the descriptor, it must be stored as a class variable in another class:

@example
class A:
    x = 5                       # Regular class attribute
    y = Ten()                   # Descriptor instance
@end example

An interactive session shows the difference between normal attribute lookup
and descriptor lookup:

@example
>>> a = A()                     # Make an instance of class A
>>> a.x                         # Normal attribute lookup
5
>>> a.y                         # Descriptor lookup
10
@end example

In the @code{a.x} attribute lookup, the dot operator finds @code{'x': 5}
in the class dictionary.  In the @code{a.y} lookup, the dot operator
finds a descriptor instance, recognized by its @code{__get__} method.
Calling that method returns @code{10}.

Note that the value @code{10} is not stored in either the class dictionary or the
instance dictionary.  Instead, the value @code{10} is computed on demand.

This example shows how a simple descriptor works, but it isn’t very useful.
For retrieving constants, normal attribute lookup would be better.

In the next section, we’ll create something more useful, a dynamic lookup.

@node Dynamic lookups,Managed attributes,Simple example A descriptor that returns a constant,Primer
@anchor{howto/descriptor dynamic-lookups}@anchor{5a32}
@subsubsection Dynamic lookups


Interesting descriptors typically run computations instead of returning
constants:

@example
import os

class DirectorySize:

    def __get__(self, obj, objtype=None):
        return len(os.listdir(obj.dirname))

class Directory:

    size = DirectorySize()              # Descriptor instance

    def __init__(self, dirname):
        self.dirname = dirname          # Regular instance attribute
@end example

An interactive session shows that the lookup is dynamic — it computes
different, updated answers each time:

@example
>>> s = Directory('songs')
>>> g = Directory('games')
>>> s.size                              # The songs directory has twenty files
20
>>> g.size                              # The games directory has three files
3
>>> os.remove('games/chess')            # Delete a game
>>> g.size                              # File count is automatically updated
2
@end example

Besides showing how descriptors can run computations, this example also
reveals the purpose of the parameters to @ref{16f4,,__get__()}.  The `self'
parameter is `size', an instance of `DirectorySize'.  The `obj' parameter is
either `g' or `s', an instance of `Directory'.  It is the `obj' parameter that
lets the @code{__get__()} method learn the target directory.  The `objtype'
parameter is the class `Directory'.

@node Managed attributes,Customized names,Dynamic lookups,Primer
@anchor{howto/descriptor managed-attributes}@anchor{5a33}
@subsubsection Managed attributes


A popular use for descriptors is managing access to instance data.  The
descriptor is assigned to a public attribute in the class dictionary while the
actual data is stored as a private attribute in the instance dictionary.  The
descriptor’s @ref{16f4,,__get__()} and @ref{23fc,,__set__()} methods are triggered when
the public attribute is accessed.

In the following example, `age' is the public attribute and `_age' is the
private attribute.  When the public attribute is accessed, the descriptor logs
the lookup or update:

@example
import logging

logging.basicConfig(level=logging.INFO)

class LoggedAgeAccess:

    def __get__(self, obj, objtype=None):
        value = obj._age
        logging.info('Accessing %r giving %r', 'age', value)
        return value

    def __set__(self, obj, value):
        logging.info('Updating %r to %r', 'age', value)
        obj._age = value

class Person:

    age = LoggedAgeAccess()             # Descriptor instance

    def __init__(self, name, age):
        self.name = name                # Regular instance attribute
        self.age = age                  # Calls __set__()

    def birthday(self):
        self.age += 1                   # Calls both __get__() and __set__()
@end example

An interactive session shows that all access to the managed attribute `age' is
logged, but that the regular attribute `name' is not logged:

@c import logging, sys
@c logging.basicConfig(level=logging.INFO, stream=sys.stdout, force=True)

@example
>>> mary = Person('Mary M', 30)         # The initial age update is logged
INFO:root:Updating 'age' to 30
>>> dave = Person('David D', 40)
INFO:root:Updating 'age' to 40

>>> vars(mary)                          # The actual data is in a private attribute
@{'name': 'Mary M', '_age': 30@}
>>> vars(dave)
@{'name': 'David D', '_age': 40@}

>>> mary.age                            # Access the data and log the lookup
INFO:root:Accessing 'age' giving 30
30
>>> mary.birthday()                     # Updates are logged as well
INFO:root:Accessing 'age' giving 30
INFO:root:Updating 'age' to 31

>>> dave.name                           # Regular attribute lookup isn't logged
'David D'
>>> dave.age                            # Only the managed attribute is logged
INFO:root:Accessing 'age' giving 40
40
@end example

One major issue with this example is that the private name `_age' is hardwired in
the `LoggedAgeAccess' class.  That means that each instance can only have one
logged attribute and that its name is unchangeable.  In the next example,
we’ll fix that problem.

@node Customized names,Closing thoughts,Managed attributes,Primer
@anchor{howto/descriptor customized-names}@anchor{5a34}
@subsubsection Customized names


When a class uses descriptors, it can inform each descriptor about which
variable name was used.

In this example, the @code{Person} class has two descriptor instances,
`name' and `age'.  When the @code{Person} class is defined, it makes a
callback to @ref{e4e,,__set_name__()} in `LoggedAccess' so that the field names can
be recorded, giving each descriptor its own `public_name' and `private_name':

@example
import logging

logging.basicConfig(level=logging.INFO)

class LoggedAccess:

    def __set_name__(self, owner, name):
        self.public_name = name
        self.private_name = '_' + name

    def __get__(self, obj, objtype=None):
        value = getattr(obj, self.private_name)
        logging.info('Accessing %r giving %r', self.public_name, value)
        return value

    def __set__(self, obj, value):
        logging.info('Updating %r to %r', self.public_name, value)
        setattr(obj, self.private_name, value)

class Person:

    name = LoggedAccess()                # First descriptor instance
    age = LoggedAccess()                 # Second descriptor instance

    def __init__(self, name, age):
        self.name = name                 # Calls the first descriptor
        self.age = age                   # Calls the second descriptor

    def birthday(self):
        self.age += 1
@end example

An interactive session shows that the @code{Person} class has called
@ref{e4e,,__set_name__()} so that the field names would be recorded.  Here
we call @ref{1e65,,vars()} to look up the descriptor without triggering it:

@example
>>> vars(vars(Person)['name'])
@{'public_name': 'name', 'private_name': '_name'@}
>>> vars(vars(Person)['age'])
@{'public_name': 'age', 'private_name': '_age'@}
@end example

The new class now logs access to both `name' and `age':

@c import logging, sys
@c logging.basicConfig(level=logging.INFO, stream=sys.stdout, force=True)

@example
>>> pete = Person('Peter P', 10)
INFO:root:Updating 'name' to 'Peter P'
INFO:root:Updating 'age' to 10
>>> kate = Person('Catherine C', 20)
INFO:root:Updating 'name' to 'Catherine C'
INFO:root:Updating 'age' to 20
@end example

The two `Person' instances contain only the private names:

@example
>>> vars(pete)
@{'_name': 'Peter P', '_age': 10@}
>>> vars(kate)
@{'_name': 'Catherine C', '_age': 20@}
@end example

@node Closing thoughts,,Customized names,Primer
@anchor{howto/descriptor closing-thoughts}@anchor{5a35}
@subsubsection Closing thoughts


A @ref{18c9,,descriptor} is what we call any object that defines @ref{16f4,,__get__()},
@ref{23fc,,__set__()}, or @ref{1993,,__delete__()}.

Optionally, descriptors can have a @ref{e4e,,__set_name__()} method.  This is only
used in cases where a descriptor needs to know either the class where it was
created or the name of class variable it was assigned to.  (This method, if
present, is called even if the class is not a descriptor.)

Descriptors get invoked by the dot operator during attribute lookup.  If a
descriptor is accessed indirectly with @code{vars(some_class)[descriptor_name]},
the descriptor instance is returned without invoking it.

Descriptors only work when used as class variables.  When put in instances,
they have no effect.

The main motivation for descriptors is to provide a hook allowing objects
stored in class variables to control what happens during attribute lookup.

Traditionally, the calling class controls what happens during lookup.
Descriptors invert that relationship and allow the data being looked-up to
have a say in the matter.

Descriptors are used throughout the language.  It is how functions turn into
bound methods.  Common tools like @ref{48f,,classmethod()}, @ref{451,,staticmethod()},
@ref{4b4,,property()}, and @ref{764,,functools.cached_property()} are all implemented as
descriptors.

@node Complete Practical Example,Technical Tutorial,Primer,Descriptor Guide
@anchor{howto/descriptor complete-practical-example}@anchor{5a36}
@subsection Complete Practical Example


In this example, we create a practical and powerful tool for locating
notoriously hard to find data corruption bugs.

@menu
* Validator class:: 
* Custom validators:: 
* Practical application:: 

@end menu

@node Validator class,Custom validators,,Complete Practical Example
@anchor{howto/descriptor validator-class}@anchor{5a37}
@subsubsection Validator class


A validator is a descriptor for managed attribute access.  Prior to storing
any data, it verifies that the new value meets various type and range
restrictions.  If those restrictions aren’t met, it raises an exception to
prevent data corruption at its source.

This @code{Validator} class is both an @ref{13c2,,abstract base class} and a
managed attribute descriptor:

@example
from abc import ABC, abstractmethod

class Validator(ABC):

    def __set_name__(self, owner, name):
        self.private_name = '_' + name

    def __get__(self, obj, objtype=None):
        return getattr(obj, self.private_name)

    def __set__(self, obj, value):
        self.validate(value)
        setattr(obj, self.private_name, value)

    @@abstractmethod
    def validate(self, value):
        pass
@end example

Custom validators need to inherit from @code{Validator} and must supply a
@code{validate()} method to test various restrictions as needed.

@node Custom validators,Practical application,Validator class,Complete Practical Example
@anchor{howto/descriptor custom-validators}@anchor{5a38}
@subsubsection Custom validators


Here are three practical data validation utilities:


@enumerate 

@item 
@code{OneOf} verifies that a value is one of a restricted set of options.

@item 
@code{Number} verifies that a value is either an @ref{19c,,int} or
@ref{197,,float}.  Optionally, it verifies that a value is between a given
minimum or maximum.

@item 
@code{String} verifies that a value is a @ref{16a,,str}.  Optionally, it
validates a given minimum or maximum length.  It can validate a
user-defined predicate@footnote{https://en.wikipedia.org/wiki/Predicate_(mathematical_logic)} as well.
@end enumerate

@example
class OneOf(Validator):

    def __init__(self, *options):
        self.options = set(options)

    def validate(self, value):
        if value not in self.options:
            raise ValueError(
                f'Expected @{value!r@} to be one of @{self.options!r@}'
            )

class Number(Validator):

    def __init__(self, minvalue=None, maxvalue=None):
        self.minvalue = minvalue
        self.maxvalue = maxvalue

    def validate(self, value):
        if not isinstance(value, (int, float)):
            raise TypeError(f'Expected @{value!r@} to be an int or float')
        if self.minvalue is not None and value < self.minvalue:
            raise ValueError(
                f'Expected @{value!r@} to be at least @{self.minvalue!r@}'
            )
        if self.maxvalue is not None and value > self.maxvalue:
            raise ValueError(
                f'Expected @{value!r@} to be no more than @{self.maxvalue!r@}'
            )

class String(Validator):

    def __init__(self, minsize=None, maxsize=None, predicate=None):
        self.minsize = minsize
        self.maxsize = maxsize
        self.predicate = predicate

    def validate(self, value):
        if not isinstance(value, str):
            raise TypeError(f'Expected @{value!r@} to be a str')
        if self.minsize is not None and len(value) < self.minsize:
            raise ValueError(
                f'Expected @{value!r@} to be no smaller than @{self.minsize!r@}'
            )
        if self.maxsize is not None and len(value) > self.maxsize:
            raise ValueError(
                f'Expected @{value!r@} to be no bigger than @{self.maxsize!r@}'
            )
        if self.predicate is not None and not self.predicate(value):
            raise ValueError(
                f'Expected @{self.predicate@} to be true for @{value!r@}'
            )
@end example

@node Practical application,,Custom validators,Complete Practical Example
@anchor{howto/descriptor practical-application}@anchor{5a39}
@subsubsection Practical application


Here’s how the data validators can be used in a real class:

@example
class Component:

    name = String(minsize=3, maxsize=10, predicate=str.isupper)
    kind = OneOf('wood', 'metal', 'plastic')
    quantity = Number(minvalue=0)

    def __init__(self, name, kind, quantity):
        self.name = name
        self.kind = kind
        self.quantity = quantity
@end example

The descriptors prevent invalid instances from being created:

@example
>>> Component('Widget', 'metal', 5)      # Blocked: 'Widget' is not all uppercase
Traceback (most recent call last):
    ...
ValueError: Expected <method 'isupper' of 'str' objects> to be true for 'Widget'

>>> Component('WIDGET', 'metle', 5)      # Blocked: 'metle' is misspelled
Traceback (most recent call last):
    ...
ValueError: Expected 'metle' to be one of @{'metal', 'plastic', 'wood'@}

>>> Component('WIDGET', 'metal', -5)     # Blocked: -5 is negative
Traceback (most recent call last):
    ...
ValueError: Expected -5 to be at least 0

>>> Component('WIDGET', 'metal', 'V')    # Blocked: 'V' isn't a number
Traceback (most recent call last):
    ...
TypeError: Expected 'V' to be an int or float

>>> c = Component('WIDGET', 'metal', 5)  # Allowed:  The inputs are valid
@end example

@node Technical Tutorial,Pure Python Equivalents,Complete Practical Example,Descriptor Guide
@anchor{howto/descriptor technical-tutorial}@anchor{5a3a}
@subsection Technical Tutorial


What follows is a more technical tutorial for the mechanics and details of how
descriptors work.

@menu
* Abstract:: 
* Definition and introduction:: 
* Descriptor protocol:: 
* Overview of descriptor invocation:: 
* Invocation from an instance:: 
* Invocation from a class:: 
* Invocation from super:: 
* Summary of invocation logic:: 
* Automatic name notification:: 
* ORM example:: 

@end menu

@node Abstract,Definition and introduction,,Technical Tutorial
@anchor{howto/descriptor abstract}@anchor{5a3b}
@subsubsection Abstract


Defines descriptors, summarizes the protocol, and shows how descriptors are
called.  Provides an example showing how object relational mappings work.

Learning about descriptors not only provides access to a larger toolset, it
creates a deeper understanding of how Python works.

@node Definition and introduction,Descriptor protocol,Abstract,Technical Tutorial
@anchor{howto/descriptor definition-and-introduction}@anchor{5a3c}
@subsubsection Definition and introduction


In general, a descriptor is an attribute value that has one of the methods in
the descriptor protocol.  Those methods are @ref{16f4,,__get__()}, @ref{23fc,,__set__()},
and @ref{1993,,__delete__()}.  If any of those methods are defined for an
attribute, it is said to be a @ref{18c9,,descriptor}.

The default behavior for attribute access is to get, set, or delete the
attribute from an object’s dictionary.  For instance, @code{a.x} has a lookup chain
starting with @code{a.__dict__['x']}, then @code{type(a).__dict__['x']}, and
continuing through the method resolution order of @code{type(a)}. If the
looked-up value is an object defining one of the descriptor methods, then Python
may override the default behavior and invoke the descriptor method instead.
Where this occurs in the precedence chain depends on which descriptor methods
were defined.

Descriptors are a powerful, general purpose protocol.  They are the mechanism
behind properties, methods, static methods, class methods, and
@ref{1a7,,super()}.  They are used throughout Python itself.  Descriptors
simplify the underlying C code and offer a flexible set of new tools for
everyday Python programs.

@node Descriptor protocol,Overview of descriptor invocation,Definition and introduction,Technical Tutorial
@anchor{howto/descriptor descriptor-protocol}@anchor{5a3d}
@subsubsection Descriptor protocol


@code{descr.__get__(self, obj, type=None)}

@code{descr.__set__(self, obj, value)}

@code{descr.__delete__(self, obj)}

That is all there is to it.  Define any of these methods and an object is
considered a descriptor and can override default behavior upon being looked up
as an attribute.

If an object defines @ref{23fc,,__set__()} or @ref{1993,,__delete__()}, it is considered
a data descriptor.  Descriptors that only define @ref{16f4,,__get__()} are called
non-data descriptors (they are often used for methods but other uses are
possible).

Data and non-data descriptors differ in how overrides are calculated with
respect to entries in an instance’s dictionary.  If an instance’s dictionary
has an entry with the same name as a data descriptor, the data descriptor
takes precedence.  If an instance’s dictionary has an entry with the same
name as a non-data descriptor, the dictionary entry takes precedence.

To make a read-only data descriptor, define both @ref{16f4,,__get__()} and
@ref{23fc,,__set__()} with the @code{__set__()} raising an @ref{5f0,,AttributeError} when
called.  Defining the @code{__set__()} method with an exception raising
placeholder is enough to make it a data descriptor.

@node Overview of descriptor invocation,Invocation from an instance,Descriptor protocol,Technical Tutorial
@anchor{howto/descriptor overview-of-descriptor-invocation}@anchor{5a3e}
@subsubsection Overview of descriptor invocation


A descriptor can be called directly with @code{desc.__get__(obj)} or
@code{desc.__get__(None, cls)}.

But it is more common for a descriptor to be invoked automatically from
attribute access.

The expression @code{obj.x} looks up the attribute @code{x} in the chain of
namespaces for @code{obj}.  If the search finds a descriptor outside of the
instance @ref{77e,,__dict__}, its @ref{16f4,,__get__()} method is
invoked according to the precedence rules listed below.

The details of invocation depend on whether @code{obj} is an object, class, or
instance of super.

@node Invocation from an instance,Invocation from a class,Overview of descriptor invocation,Technical Tutorial
@anchor{howto/descriptor invocation-from-an-instance}@anchor{5a3f}
@subsubsection Invocation from an instance


Instance lookup scans through a chain of namespaces giving data descriptors
the highest priority, followed by instance variables, then non-data
descriptors, then class variables, and lastly @ref{6fb,,__getattr__()} if it is
provided.

If a descriptor is found for @code{a.x}, then it is invoked with:
@code{desc.__get__(a, type(a))}.

The logic for a dotted lookup is in @ref{dd1,,object.__getattribute__()}.  Here is
a pure Python equivalent:

@example
def find_name_in_mro(cls, name, default):
    "Emulate _PyType_Lookup() in Objects/typeobject.c"
    for base in cls.__mro__:
        if name in vars(base):
            return vars(base)[name]
    return default

def object_getattribute(obj, name):
    "Emulate PyObject_GenericGetAttr() in Objects/object.c"
    null = object()
    objtype = type(obj)
    cls_var = find_name_in_mro(objtype, name, null)
    descr_get = getattr(type(cls_var), '__get__', null)
    if descr_get is not null:
        if (hasattr(type(cls_var), '__set__')
            or hasattr(type(cls_var), '__delete__')):
            return descr_get(cls_var, obj, objtype)     # data descriptor
    if hasattr(obj, '__dict__') and name in vars(obj):
        return vars(obj)[name]                          # instance variable
    if descr_get is not null:
        return descr_get(cls_var, obj, objtype)         # non-data descriptor
    if cls_var is not null:
        return cls_var                                  # class variable
    raise AttributeError(name)
@end example

@c # Test the fidelity of object_getattribute() by comparing it with the
@c # normal object.__getattribute__().  The former will be accessed by
@c # square brackets and the latter by the dot operator.
@c 
@c class Object:
@c 
@c     def __getitem__(obj, name):
@c         try:
@c             return object_getattribute(obj, name)
@c         except AttributeError:
@c             if not hasattr(type(obj), '__getattr__'):
@c                 raise
@c         return type(obj).__getattr__(obj, name)             # __getattr__
@c 
@c class DualOperator(Object):
@c 
@c     x = 10
@c 
@c     def __init__(self, z):
@c         self.z = z
@c 
@c     @property
@c     def p2(self):
@c         return 2 * self.x
@c 
@c     @property
@c     def p3(self):
@c         return 3 * self.x
@c 
@c     def m5(self, y):
@c         return 5 * y
@c 
@c     def m7(self, y):
@c         return 7 * y
@c 
@c     def __getattr__(self, name):
@c         return ('getattr_hook', self, name)
@c 
@c class DualOperatorWithSlots:
@c 
@c     __getitem__ = Object.__getitem__
@c 
@c     __slots__ = ['z']
@c 
@c     x = 15
@c 
@c     def __init__(self, z):
@c         self.z = z
@c 
@c     @property
@c     def p2(self):
@c         return 2 * self.x
@c 
@c     def m5(self, y):
@c         return 5 * y
@c 
@c     def __getattr__(self, name):
@c         return ('getattr_hook', self, name)
@c 
@c class D1:
@c     def __get__(self, obj, objtype=None):
@c         return type(self), obj, objtype
@c 
@c class U1:
@c     x = D1()
@c 
@c class U2(U1):
@c     pass

@c >>> a = DualOperator(11)
@c >>> vars(a).update(p3 = '_p3', m7 = '_m7')
@c >>> a.x == a['x'] == 10
@c True
@c >>> a.z == a['z'] == 11
@c True
@c >>> a.p2 == a['p2'] == 20
@c True
@c >>> a.p3 == a['p3'] == 30
@c True
@c >>> a.m5(100) == a.m5(100) == 500
@c True
@c >>> a.m7 == a['m7'] == '_m7'
@c True
@c >>> a.g == a['g'] == ('getattr_hook', a, 'g')
@c True
@c 
@c >>> b = DualOperatorWithSlots(22)
@c >>> b.x == b['x'] == 15
@c True
@c >>> b.z == b['z'] == 22
@c True
@c >>> b.p2 == b['p2'] == 30
@c True
@c >>> b.m5(200) == b['m5'](200) == 1000
@c True
@c >>> b.g == b['g'] == ('getattr_hook', b, 'g')
@c True
@c 
@c >>> u2 = U2()
@c >>> object_getattribute(u2, 'x') == u2.x == (D1, u2, U2)
@c True

Note, there is no @ref{6fb,,__getattr__()} hook in the @ref{dd1,,__getattribute__()}
code.  That is why calling @code{__getattribute__()} directly or with
@code{super().__getattribute__} will bypass @code{__getattr__()} entirely.

Instead, it is the dot operator and the @ref{dd0,,getattr()} function that are
responsible for invoking @ref{6fb,,__getattr__()} whenever @ref{dd1,,__getattribute__()}
raises an @ref{5f0,,AttributeError}.  Their logic is encapsulated in a helper
function:

@example
def getattr_hook(obj, name):
    "Emulate slot_tp_getattr_hook() in Objects/typeobject.c"
    try:
        return obj.__getattribute__(name)
    except AttributeError:
        if not hasattr(type(obj), '__getattr__'):
            raise
    return type(obj).__getattr__(obj, name)             # __getattr__
@end example

@c >>> class ClassWithGetAttr:
@c ...     x = 123
@c ...     def __getattr__(self, attr):
@c ...         return attr.upper()
@c ...
@c >>> cw = ClassWithGetAttr()
@c >>> cw.y = 456
@c >>> getattr_hook(cw, 'x')
@c 123
@c >>> getattr_hook(cw, 'y')
@c 456
@c >>> getattr_hook(cw, 'z')
@c 'Z'
@c 
@c >>> class ClassWithoutGetAttr:
@c ...     x = 123
@c ...
@c >>> cwo = ClassWithoutGetAttr()
@c >>> cwo.y = 456
@c >>> getattr_hook(cwo, 'x')
@c 123
@c >>> getattr_hook(cwo, 'y')
@c 456
@c >>> getattr_hook(cwo, 'z')
@c Traceback (most recent call last):
@c     ...
@c AttributeError: 'ClassWithoutGetAttr' object has no attribute 'z'

@node Invocation from a class,Invocation from super,Invocation from an instance,Technical Tutorial
@anchor{howto/descriptor invocation-from-a-class}@anchor{5a40}
@subsubsection Invocation from a class


The logic for a dotted lookup such as @code{A.x} is in
@code{type.__getattribute__()}.  The steps are similar to those for
@code{object.__getattribute__()} but the instance dictionary lookup is replaced
by a search through the class’s @ref{2627,,method resolution order}.

If a descriptor is found, it is invoked with @code{desc.__get__(None, A)}.

The full C implementation can be found in @code{type_getattro()} and
@code{_PyType_Lookup()} in Objects/typeobject.c@footnote{https://github.com/python/cpython/tree/3.14/Objects/typeobject.c}.

@node Invocation from super,Summary of invocation logic,Invocation from a class,Technical Tutorial
@anchor{howto/descriptor invocation-from-super}@anchor{5a41}
@subsubsection Invocation from super


The logic for super’s dotted lookup is in the @ref{dd1,,__getattribute__()} method for
object returned by @ref{1a7,,super()}.

A dotted lookup such as @code{super(A, obj).m} searches @code{obj.__class__.__mro__}
for the base class @code{B} immediately following @code{A} and then returns
@code{B.__dict__['m'].__get__(obj, A)}.  If not a descriptor, @code{m} is returned
unchanged.

The full C implementation can be found in @code{super_getattro()} in
Objects/typeobject.c@footnote{https://github.com/python/cpython/tree/3.14/Objects/typeobject.c}.  A pure Python equivalent can be found in
Guido's Tutorial@footnote{https://www.python.org/download/releases/2.2.3/descrintro/#cooperation}.

@node Summary of invocation logic,Automatic name notification,Invocation from super,Technical Tutorial
@anchor{howto/descriptor summary-of-invocation-logic}@anchor{5a42}
@subsubsection Summary of invocation logic


The mechanism for descriptors is embedded in the @ref{dd1,,__getattribute__()}
methods for @ref{c84,,object}, @ref{f4a,,type}, and @ref{1a7,,super()}.

The important points to remember are:


@itemize *

@item 
Descriptors are invoked by the @ref{dd1,,__getattribute__()} method.

@item 
Classes inherit this machinery from @ref{c84,,object}, @ref{f4a,,type}, or
@ref{1a7,,super()}.

@item 
Overriding @ref{dd1,,__getattribute__()} prevents automatic descriptor calls
because all the descriptor logic is in that method.

@item 
@code{object.__getattribute__()} and @code{type.__getattribute__()} make
different calls to @ref{16f4,,__get__()}.  The first includes the instance and may
include the class.  The second puts in @code{None} for the instance and always
includes the class.

@item 
Data descriptors always override instance dictionaries.

@item 
Non-data descriptors may be overridden by instance dictionaries.
@end itemize

@node Automatic name notification,ORM example,Summary of invocation logic,Technical Tutorial
@anchor{howto/descriptor automatic-name-notification}@anchor{5a43}
@subsubsection Automatic name notification


Sometimes it is desirable for a descriptor to know what class variable name it
was assigned to.  When a new class is created, the @ref{f4a,,type} metaclass
scans the dictionary of the new class.  If any of the entries are descriptors
and if they define @ref{e4e,,__set_name__()}, that method is called with two
arguments.  The `owner' is the class where the descriptor is used, and the
`name' is the class variable the descriptor was assigned to.

The implementation details are in @code{type_new()} and
@code{set_names()} in Objects/typeobject.c@footnote{https://github.com/python/cpython/tree/3.14/Objects/typeobject.c}.

Since the update logic is in @code{type.__new__()}, notifications only take
place at the time of class creation.  If descriptors are added to the class
afterwards, @ref{e4e,,__set_name__()} will need to be called manually.

@node ORM example,,Automatic name notification,Technical Tutorial
@anchor{howto/descriptor orm-example}@anchor{5a44}
@subsubsection ORM example


The following code is a simplified skeleton showing how data descriptors could
be used to implement an object relational mapping@footnote{https://en.wikipedia.org/wiki/Object%E2%80%93relational_mapping}.

The essential idea is that the data is stored in an external database.  The
Python instances only hold keys to the database’s tables.  Descriptors take
care of lookups or updates:

@example
class Field:

    def __set_name__(self, owner, name):
        self.fetch = f'SELECT @{name@} FROM @{owner.table@} WHERE @{owner.key@}=?;'
        self.store = f'UPDATE @{owner.table@} SET @{name@}=? WHERE @{owner.key@}=?;'

    def __get__(self, obj, objtype=None):
        return conn.execute(self.fetch, [obj.key]).fetchone()[0]

    def __set__(self, obj, value):
        conn.execute(self.store, [value, obj.key])
        conn.commit()
@end example

We can use the @code{Field} class to define models@footnote{https://en.wikipedia.org/wiki/Database_model} that describe the schema for
each table in a database:

@example
class Movie:
    table = 'Movies'                    # Table name
    key = 'title'                       # Primary key
    director = Field()
    year = Field()

    def __init__(self, key):
        self.key = key

class Song:
    table = 'Music'
    key = 'title'
    artist = Field()
    year = Field()
    genre = Field()

    def __init__(self, key):
        self.key = key
@end example

To use the models, first connect to the database:

@example
>>> import sqlite3
>>> conn = sqlite3.connect('entertainment.db')
@end example

An interactive session shows how data is retrieved from the database and how
it can be updated:

@c song_data = [
@c     ('Country Roads', 'John Denver', 1972),
@c     ('Me and Bobby McGee', 'Janice Joplin', 1971),
@c     ('Coal Miners Daughter', 'Loretta Lynn', 1970),
@c ]
@c 
@c movie_data = [
@c     ('Star Wars', 'George Lucas', 1977),
@c     ('Jaws', 'Steven Spielberg', 1975),
@c     ('Aliens', 'James Cameron', 1986),
@c ]
@c 
@c import sqlite3
@c 
@c conn = sqlite3.connect(':memory:')
@c conn.execute('CREATE TABLE Music (title text, artist text, year integer);')
@c conn.execute('CREATE INDEX MusicNdx ON Music (title);')
@c conn.executemany('INSERT INTO Music VALUES (?, ?, ?);', song_data)
@c conn.execute('CREATE TABLE Movies (title text, director text, year integer);')
@c conn.execute('CREATE INDEX MovieNdx ON Music (title);')
@c conn.executemany('INSERT INTO Movies VALUES (?, ?, ?);', movie_data)
@c conn.commit()

@example
>>> Movie('Star Wars').director
'George Lucas'
>>> jaws = Movie('Jaws')
>>> f'Released in @{jaws.year@} by @{jaws.director@}'
'Released in 1975 by Steven Spielberg'

>>> Song('Country Roads').artist
'John Denver'

>>> Movie('Star Wars').director = 'J.J. Abrams'
>>> Movie('Star Wars').director
'J.J. Abrams'
@end example

@c conn.close()

@node Pure Python Equivalents,,Technical Tutorial,Descriptor Guide
@anchor{howto/descriptor pure-python-equivalents}@anchor{5a45}
@subsection Pure Python Equivalents


The descriptor protocol is simple and offers exciting possibilities.  Several
use cases are so common that they have been prepackaged into built-in tools.
Properties, bound methods, static methods, class methods, and __slots__ are
all based on the descriptor protocol.

@menu
* Properties:: 
* Functions and methods:: 
* Kinds of methods:: 
* Static methods:: 
* Class methods:: 
* Member objects and __slots__:: 

@end menu

@node Properties,Functions and methods,,Pure Python Equivalents
@anchor{howto/descriptor properties}@anchor{5a46}
@subsubsection Properties


Calling @ref{4b4,,property()} is a succinct way of building a data descriptor that
triggers a function call upon access to an attribute.  Its signature is:

@example
property(fget=None, fset=None, fdel=None, doc=None) -> property
@end example

The documentation shows a typical use to define a managed attribute @code{x}:

@example
class C:
    def getx(self): return self.__x
    def setx(self, value): self.__x = value
    def delx(self): del self.__x
    x = property(getx, setx, delx, "I'm the 'x' property.")
@end example

@c >>> C.x.__doc__
@c "I'm the 'x' property."
@c >>> c.x = 2.71828
@c >>> c.x
@c 2.71828
@c >>> del c.x
@c >>> c.x
@c Traceback (most recent call last):
@c   ...
@c AttributeError: 'C' object has no attribute '_C__x'

To see how @ref{4b4,,property()} is implemented in terms of the descriptor protocol,
here is a pure Python equivalent that implements most of the core functionality:

@example
class Property:
    "Emulate PyProperty_Type() in Objects/descrobject.c"

    def __init__(self, fget=None, fset=None, fdel=None, doc=None):
        self.fget = fget
        self.fset = fset
        self.fdel = fdel
        if doc is None and fget is not None:
            doc = fget.__doc__
        self.__doc__ = doc

    def __set_name__(self, owner, name):
        self.__name__ = name

    def __get__(self, obj, objtype=None):
        if obj is None:
            return self
        if self.fget is None:
            raise AttributeError
        return self.fget(obj)

    def __set__(self, obj, value):
        if self.fset is None:
            raise AttributeError
        self.fset(obj, value)

    def __delete__(self, obj):
        if self.fdel is None:
            raise AttributeError
        self.fdel(obj)

    def getter(self, fget):
        return type(self)(fget, self.fset, self.fdel, self.__doc__)

    def setter(self, fset):
        return type(self)(self.fget, fset, self.fdel, self.__doc__)

    def deleter(self, fdel):
        return type(self)(self.fget, self.fset, fdel, self.__doc__)
@end example

@c # Verify the Property() emulation
@c 
@c class CC:
@c     def getx(self):
@c         return self.__x
@c     def setx(self, value):
@c         self.__x = value
@c     def delx(self):
@c         del self.__x
@c     x = Property(getx, setx, delx, "I'm the 'x' property.")
@c     no_getter = Property(None, setx, delx, "I'm the 'x' property.")
@c     no_setter = Property(getx, None, delx, "I'm the 'x' property.")
@c     no_deleter = Property(getx, setx, None, "I'm the 'x' property.")
@c     no_doc = Property(getx, setx, delx, None)
@c 
@c 
@c # Now do it again but use the decorator style
@c 
@c class CCC:
@c     @Property
@c     def x(self):
@c         return self.__x
@c     @x.setter
@c     def x(self, value):
@c         self.__x = value
@c     @x.deleter
@c     def x(self):
@c         del self.__x

@c >>> cc = CC()
@c >>> hasattr(cc, 'x')
@c False
@c >>> cc.x = 33
@c >>> cc.x
@c 33
@c >>> del cc.x
@c >>> hasattr(cc, 'x')
@c False
@c 
@c >>> ccc = CCC()
@c >>> hasattr(ccc, 'x')
@c False
@c >>> ccc.x = 333
@c >>> ccc.x == 333
@c True
@c >>> del ccc.x
@c >>> hasattr(ccc, 'x')
@c False
@c 
@c >>> cc = CC()
@c >>> cc.x = 33
@c >>> try:
@c ...     cc.no_getter
@c ... except AttributeError as e:
@c ...     type(e).__name__
@c ...
@c 'AttributeError'
@c 
@c >>> try:
@c ...     cc.no_setter = 33
@c ... except AttributeError as e:
@c ...     type(e).__name__
@c ...
@c 'AttributeError'
@c 
@c >>> try:
@c ...     del cc.no_deleter
@c ... except AttributeError as e:
@c ...     type(e).__name__
@c ...
@c 'AttributeError'
@c 
@c >>> CC.no_doc.__doc__ is None
@c True

The @ref{4b4,,property()} builtin helps whenever a user interface has granted
attribute access and then subsequent changes require the intervention of a
method.

For instance, a spreadsheet class may grant access to a cell value through
@code{Cell('b10').value}. Subsequent improvements to the program require the cell
to be recalculated on every access; however, the programmer does not want to
affect existing client code accessing the attribute directly.  The solution is
to wrap access to the value attribute in a property data descriptor:

@example
class Cell:
    ...

    @@property
    def value(self):
        "Recalculate the cell before returning value"
        self.recalc()
        return self._value
@end example

Either the built-in @ref{4b4,,property()} or our @code{Property()} equivalent would
work in this example.

@node Functions and methods,Kinds of methods,Properties,Pure Python Equivalents
@anchor{howto/descriptor functions-and-methods}@anchor{5a47}
@subsubsection Functions and methods


Python’s object oriented features are built upon a function based environment.
Using non-data descriptors, the two are merged seamlessly.

Functions stored in class dictionaries get turned into methods when invoked.
Methods only differ from regular functions in that the object instance is
prepended to the other arguments.  By convention, the instance is called
`self' but could be called `this' or any other variable name.

Methods can be created manually with @ref{1bc7,,types.MethodType} which is
roughly equivalent to:

@example
class MethodType:
    "Emulate PyMethod_Type in Objects/classobject.c"

    def __init__(self, func, obj):
        self.__func__ = func
        self.__self__ = obj

    def __call__(self, *args, **kwargs):
        func = self.__func__
        obj = self.__self__
        return func(obj, *args, **kwargs)

    def __getattribute__(self, name):
        "Emulate method_getset() in Objects/classobject.c"
        if name == '__doc__':
            return self.__func__.__doc__
        return object.__getattribute__(self, name)

    def __getattr__(self, name):
        "Emulate method_getattro() in Objects/classobject.c"
        return getattr(self.__func__, name)

    def __get__(self, obj, objtype=None):
        "Emulate method_descr_get() in Objects/classobject.c"
        return self
@end example

To support automatic creation of methods, functions include the
@ref{16f4,,__get__()} method for binding methods during attribute access.  This
means that functions are non-data descriptors that return bound methods
during dotted lookup from an instance.  Here’s how it works:

@example
class Function:
    ...

    def __get__(self, obj, objtype=None):
        "Simulate func_descr_get() in Objects/funcobject.c"
        if obj is None:
            return self
        return MethodType(self, obj)
@end example

Running the following class in the interpreter shows how the function
descriptor works in practice:

@example
class D:
    def f(self):
         return self

class D2:
    pass
@end example

@c >>> d = D()
@c >>> d2 = D2()
@c >>> d2.f = d.f.__get__(d2, D2)
@c >>> d2.f() is d
@c True

The function has a @ref{1d68,,qualified name} attribute to support introspection:

@example
>>> D.f.__qualname__
'D.f'
@end example

Accessing the function through the class dictionary does not invoke
@ref{16f4,,__get__()}.  Instead, it just returns the underlying function object:

@example
>>> D.__dict__['f']
<function D.f at 0x00C45070>
@end example

Dotted access from a class calls @ref{16f4,,__get__()} which just returns the
underlying function unchanged:

@example
>>> D.f
<function D.f at 0x00C45070>
@end example

The interesting behavior occurs during dotted access from an instance.  The
dotted lookup calls @ref{16f4,,__get__()} which returns a bound method object:

@example
>>> d = D()
>>> d.f
<bound method D.f of <__main__.D object at 0x00B18C90>>
@end example

Internally, the bound method stores the underlying function and the bound
instance:

@example
>>> d.f.__func__
<function D.f at 0x00C45070>

>>> d.f.__self__
<__main__.D object at 0x00B18C90>
@end example

If you have ever wondered where `self' comes from in regular methods or where
`cls' comes from in class methods, this is it!

@node Kinds of methods,Static methods,Functions and methods,Pure Python Equivalents
@anchor{howto/descriptor kinds-of-methods}@anchor{5a48}
@subsubsection Kinds of methods


Non-data descriptors provide a simple mechanism for variations on the usual
patterns of binding functions into methods.

To recap, functions have a @ref{16f4,,__get__()} method so that they can be converted
to a method when accessed as attributes.  The non-data descriptor transforms an
@code{obj.f(*args)} call into @code{f(obj, *args)}.  Calling @code{cls.f(*args)}
becomes @code{f(*args)}.

This chart summarizes the binding and its two most useful variants:

@quotation


@multitable {xxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxx} 
@headitem

Transformation

@tab

Called from an
object

@tab

Called from a
class

@item

function

@tab

f(obj, *args)

@tab

f(*args)

@item

staticmethod

@tab

f(*args)

@tab

f(*args)

@item

classmethod

@tab

f(type(obj), *args)

@tab

f(cls, *args)

@end multitable

@end quotation

@node Static methods,Class methods,Kinds of methods,Pure Python Equivalents
@anchor{howto/descriptor static-methods}@anchor{5a49}
@subsubsection Static methods


Static methods return the underlying function without changes.  Calling either
@code{c.f} or @code{C.f} is the equivalent of a direct lookup into
@code{object.__getattribute__(c, "f")} or @code{object.__getattribute__(C, "f")}. As a
result, the function becomes identically accessible from either an object or a
class.

Good candidates for static methods are methods that do not reference the
@code{self} variable.

For instance, a statistics package may include a container class for
experimental data.  The class provides normal methods for computing the average,
mean, median, and other descriptive statistics that depend on the data. However,
there may be useful functions which are conceptually related but do not depend
on the data.  For instance, @code{erf(x)} is handy conversion routine that comes up
in statistical work but does not directly depend on a particular dataset.
It can be called either from an object or the class:  @code{s.erf(1.5) --> 0.9332}
or @code{Sample.erf(1.5) --> 0.9332}.

Since static methods return the underlying function with no changes, the
example calls are unexciting:

@example
class E:
    @@staticmethod
    def f(x):
        return x * 10
@end example

@example
>>> E.f(3)
30
>>> E().f(3)
30
@end example

Using the non-data descriptor protocol, a pure Python version of
@ref{451,,staticmethod()} would look like this:

@example
import functools

class StaticMethod:
    "Emulate PyStaticMethod_Type() in Objects/funcobject.c"

    def __init__(self, f):
        self.f = f
        functools.update_wrapper(self, f)

    def __get__(self, obj, objtype=None):
        return self.f

    def __call__(self, *args, **kwds):
        return self.f(*args, **kwds)

    @@property
    def __annotations__(self):
        return self.f.__annotations__
@end example

The @ref{1228,,functools.update_wrapper()} call adds a @code{__wrapped__} attribute
that refers to the underlying function.  Also it carries forward
the attributes necessary to make the wrapper look like the wrapped
function, including @ref{14e0,,__name__}, @ref{238d,,__qualname__},
and @ref{13e5,,__doc__}.

@c class E_sim:
@c     @StaticMethod
@c     def f(x: int) -> str:
@c         "Simple function example"
@c         return "!" * x
@c 
@c wrapped_ord = StaticMethod(ord)

@c >>> E_sim.f(3)
@c '!!!'
@c >>> E_sim().f(3)
@c '!!!'
@c 
@c >>> sm = vars(E_sim)['f']
@c >>> type(sm).__name__
@c 'StaticMethod'
@c >>> f = E_sim.f
@c >>> type(f).__name__
@c 'function'
@c >>> sm.__name__
@c 'f'
@c >>> f.__name__
@c 'f'
@c >>> sm.__qualname__
@c 'E_sim.f'
@c >>> f.__qualname__
@c 'E_sim.f'
@c >>> sm.__doc__
@c 'Simple function example'
@c >>> f.__doc__
@c 'Simple function example'
@c >>> sm.__annotations__
@c {'x': <class 'int'>, 'return': <class 'str'>}
@c >>> f.__annotations__
@c {'x': <class 'int'>, 'return': <class 'str'>}
@c >>> sm.__module__ == f.__module__
@c True
@c >>> sm(3)
@c '!!!'
@c >>> f(3)
@c '!!!'
@c 
@c >>> wrapped_ord('A')
@c 65
@c >>> wrapped_ord.__module__ == ord.__module__
@c True
@c >>> wrapped_ord.__wrapped__ == ord
@c True
@c >>> wrapped_ord.__name__ == ord.__name__
@c True
@c >>> wrapped_ord.__qualname__ == ord.__qualname__
@c True
@c >>> wrapped_ord.__doc__ == ord.__doc__
@c True

@node Class methods,Member objects and __slots__,Static methods,Pure Python Equivalents
@anchor{howto/descriptor class-methods}@anchor{5a4a}
@subsubsection Class methods


Unlike static methods, class methods prepend the class reference to the
argument list before calling the function.  This format is the same
for whether the caller is an object or a class:

@example
class F:
    @@classmethod
    def f(cls, x):
        return cls.__name__, x
@end example

@example
>>> F.f(3)
('F', 3)
>>> F().f(3)
('F', 3)
@end example

This behavior is useful whenever the method only needs to have a class
reference and does not rely on data stored in a specific instance.  One use for
class methods is to create alternate class constructors.  For example, the
classmethod @ref{250,,dict.fromkeys()} creates a new dictionary from a list of
keys.  The pure Python equivalent is:

@example
class Dict(dict):
    @@classmethod
    def fromkeys(cls, iterable, value=None):
        "Emulate dict_fromkeys() in Objects/dictobject.c"
        d = cls()
        for key in iterable:
            d[key] = value
        return d
@end example

Now a new dictionary of unique keys can be constructed like this:

@example
>>> d = Dict.fromkeys('abracadabra')
>>> type(d) is Dict
True
>>> d
@{'a': None, 'b': None, 'r': None, 'c': None, 'd': None@}
@end example

Using the non-data descriptor protocol, a pure Python version of
@ref{48f,,classmethod()} would look like this:

@example
import functools

class ClassMethod:
    "Emulate PyClassMethod_Type() in Objects/funcobject.c"

    def __init__(self, f):
        self.f = f
        functools.update_wrapper(self, f)

    def __get__(self, obj, cls=None):
        if cls is None:
            cls = type(obj)
        return MethodType(self.f, cls)
@end example

@c # Verify the emulation works
@c class T:
@c     @ClassMethod
@c     def cm(cls, x: int, y: str) -> tuple[str, int, str]:
@c         "Class method that returns a tuple"
@c         return (cls.__name__, x, y)

@c >>> T.cm(11, 22)
@c ('T', 11, 22)
@c 
@c # Also call it from an instance
@c >>> t = T()
@c >>> t.cm(11, 22)
@c ('T', 11, 22)
@c 
@c # Verify that T uses our emulation
@c >>> type(vars(T)['cm']).__name__
@c 'ClassMethod'
@c 
@c # Verify that update_wrapper() correctly copied attributes
@c >>> T.cm.__name__
@c 'cm'
@c >>> T.cm.__qualname__
@c 'T.cm'
@c >>> T.cm.__doc__
@c 'Class method that returns a tuple'
@c >>> T.cm.__annotations__
@c {'x': <class 'int'>, 'y': <class 'str'>, 'return': tuple[str, int, str]}
@c 
@c # Verify that __wrapped__ was added and works correctly
@c >>> f = vars(T)['cm'].__wrapped__
@c >>> type(f).__name__
@c 'function'
@c >>> f.__name__
@c 'cm'
@c >>> f(T, 11, 22)
@c ('T', 11, 22)

The @ref{1228,,functools.update_wrapper()} call in @code{ClassMethod} adds a
@code{__wrapped__} attribute that refers to the underlying function.  Also
it carries forward the attributes necessary to make the wrapper look
like the wrapped function: @ref{14e0,,__name__},
@ref{238d,,__qualname__}, @ref{13e5,,__doc__},
and @ref{13e4,,__annotations__}.

@node Member objects and __slots__,,Class methods,Pure Python Equivalents
@anchor{howto/descriptor member-objects-and-slots}@anchor{5a4b}
@subsubsection Member objects and __slots__


When a class defines @code{__slots__}, it replaces instance dictionaries with a
fixed-length array of slot values.  From a user point of view that has
several effects:

1. Provides immediate detection of bugs due to misspelled attribute
assignments.  Only attribute names specified in @code{__slots__} are allowed:

@example
class Vehicle:
    __slots__ = ('id_number', 'make', 'model')
@end example

@example
>>> auto = Vehicle()
>>> auto.id_nubmer = 'VYE483814LQEX'
Traceback (most recent call last):
    ...
AttributeError: 'Vehicle' object has no attribute 'id_nubmer'
@end example

2. Helps create immutable objects where descriptors manage access to private
attributes stored in @code{__slots__}:

@example
class Immutable:

    __slots__ = ('_dept', '_name')          # Replace the instance dictionary

    def __init__(self, dept, name):
        self._dept = dept                   # Store to private attribute
        self._name = name                   # Store to private attribute

    @@property                               # Read-only descriptor
    def dept(self):
        return self._dept

    @@property
    def name(self):                         # Read-only descriptor
        return self._name
@end example

@example
>>> mark = Immutable('Botany', 'Mark Watney')
>>> mark.dept
'Botany'
>>> mark.dept = 'Space Pirate'
Traceback (most recent call last):
    ...
AttributeError: property 'dept' of 'Immutable' object has no setter
>>> mark.location = 'Mars'
Traceback (most recent call last):
    ...
AttributeError: 'Immutable' object has no attribute 'location'
@end example

3. Saves memory.  On a 64-bit Linux build, an instance with two attributes
takes 48 bytes with @code{__slots__} and 152 bytes without.  This flyweight design pattern@footnote{https://en.wikipedia.org/wiki/Flyweight_pattern} likely only
matters when a large number of instances are going to be created.

4. Improves speed.  Reading instance variables is 35% faster with
@code{__slots__} (as measured with Python 3.10 on an Apple M1 processor).

5. Blocks tools like @ref{764,,functools.cached_property()} which require an
instance dictionary to function correctly:

@example
from functools import cached_property

class CP:
    __slots__ = ()                          # Eliminates the instance dict

    @@cached_property                        # Requires an instance dict
    def pi(self):
        return 4 * sum((-1.0)**n / (2.0*n + 1.0)
                       for n in reversed(range(100_000)))
@end example

@example
>>> CP().pi
Traceback (most recent call last):
  ...
TypeError: No '__dict__' attribute on 'CP' instance to cache 'pi' property.
@end example

It is not possible to create an exact drop-in pure Python version of
@code{__slots__} because it requires direct access to C structures and control
over object memory allocation.  However, we can build a mostly faithful
simulation where the actual C structure for slots is emulated by a private
@code{_slotvalues} list.  Reads and writes to that private structure are managed
by member descriptors:

@example
null = object()

class Member:

    def __init__(self, name, clsname, offset):
        'Emulate PyMemberDef in Include/descrobject.h'
        # Also see descr_new() in Objects/descrobject.c
        self.name = name
        self.clsname = clsname
        self.offset = offset

    def __get__(self, obj, objtype=None):
        'Emulate member_get() in Objects/descrobject.c'
        # Also see PyMember_GetOne() in Python/structmember.c
        if obj is None:
            return self
        value = obj._slotvalues[self.offset]
        if value is null:
            raise AttributeError(self.name)
        return value

    def __set__(self, obj, value):
        'Emulate member_set() in Objects/descrobject.c'
        obj._slotvalues[self.offset] = value

    def __delete__(self, obj):
        'Emulate member_delete() in Objects/descrobject.c'
        value = obj._slotvalues[self.offset]
        if value is null:
            raise AttributeError(self.name)
        obj._slotvalues[self.offset] = null

    def __repr__(self):
        'Emulate member_repr() in Objects/descrobject.c'
        return f'<Member @{self.name!r@} of @{self.clsname!r@}>'
@end example

The @code{type.__new__()} method takes care of adding member objects to class
variables:

@example
class Type(type):
    'Simulate how the type metaclass adds member objects for slots'

    def __new__(mcls, clsname, bases, mapping, **kwargs):
        'Emulate type_new() in Objects/typeobject.c'
        # type_new() calls PyTypeReady() which calls add_methods()
        slot_names = mapping.get('slot_names', [])
        for offset, name in enumerate(slot_names):
            mapping[name] = Member(name, clsname, offset)
        return type.__new__(mcls, clsname, bases, mapping, **kwargs)
@end example

The @ref{7a1,,object.__new__()} method takes care of creating instances that have
slots instead of an instance dictionary.  Here is a rough simulation in pure
Python:

@example
class Object:
    'Simulate how object.__new__() allocates memory for __slots__'

    def __new__(cls, *args, **kwargs):
        'Emulate object_new() in Objects/typeobject.c'
        inst = super().__new__(cls)
        if hasattr(cls, 'slot_names'):
            empty_slots = [null] * len(cls.slot_names)
            object.__setattr__(inst, '_slotvalues', empty_slots)
        return inst

    def __setattr__(self, name, value):
        'Emulate _PyObject_GenericSetAttrWithDict() Objects/object.c'
        cls = type(self)
        if hasattr(cls, 'slot_names') and name not in cls.slot_names:
            raise AttributeError(
                f'@{cls.__name__!r@} object has no attribute @{name!r@}'
            )
        super().__setattr__(name, value)

    def __delattr__(self, name):
        'Emulate _PyObject_GenericSetAttrWithDict() Objects/object.c'
        cls = type(self)
        if hasattr(cls, 'slot_names') and name not in cls.slot_names:
            raise AttributeError(
                f'@{cls.__name__!r@} object has no attribute @{name!r@}'
            )
        super().__delattr__(name)
@end example

To use the simulation in a real class, just inherit from @code{Object} and
set the @ref{2417,,metaclass} to @code{Type}:

@example
class H(Object, metaclass=Type):
    'Instance variables stored in slots'

    slot_names = ['x', 'y']

    def __init__(self, x, y):
        self.x = x
        self.y = y
@end example

At this point, the metaclass has loaded member objects for `x' and `y':

@example
>>> from pprint import pp
>>> pp(dict(vars(H)))
@{'__module__': '__main__',
 '__doc__': 'Instance variables stored in slots',
 'slot_names': ['x', 'y'],
 '__init__': <function H.__init__ at 0x7fb5d302f9d0>,
 'x': <Member 'x' of 'H'>,
 'y': <Member 'y' of 'H'>@}
@end example

@c # We test this separately because the preceding section is not
@c # doctestable due to the hex memory address for the __init__ function
@c >>> isinstance(vars(H)['x'], Member)
@c True
@c >>> isinstance(vars(H)['y'], Member)
@c True

When instances are created, they have a @code{slot_values} list where the
attributes are stored:

@example
>>> h = H(10, 20)
>>> vars(h)
@{'_slotvalues': [10, 20]@}
>>> h.x = 55
>>> vars(h)
@{'_slotvalues': [55, 20]@}
@end example

Misspelled or unassigned attributes will raise an exception:

@example
>>> h.xz
Traceback (most recent call last):
    ...
AttributeError: 'H' object has no attribute 'xz'
@end example

@c  # Examples for deleted attributes are not shown because this section
@c  # is already a bit lengthy.  We still test that code here.
@c  >>> del h.x
@c  >>> hasattr(h, 'x')
@c  False
@c 
@c  # Also test the code for uninitialized slots
@c  >>> class HU(Object, metaclass=Type):
@c  ...     slot_names = ['x', 'y']
@c  ...
@c  >>> hu = HU()
@c  >>> hasattr(hu, 'x')
@c  False
@c  >>> hasattr(hu, 'y')
@c  False

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Debugging C API extensions and CPython Internals with GDB,Enum HOWTO,Descriptor Guide,Python HOWTOs
@anchor{howto/gdb_helpers doc}@anchor{5a4c}@anchor{howto/gdb_helpers debugging-c-api-extensions-and-cpython-internals-with-gdb}@anchor{5a4d}@anchor{howto/gdb_helpers gdb}@anchor{5a4e}@anchor{howto/gdb_helpers translation-repo}@anchor{5a4f}
@section Debugging C API extensions and CPython Internals with GDB


This document explains how the Python GDB extension, @code{python-gdb.py}, can
be used with the GDB debugger to debug CPython extensions and the
CPython interpreter itself.

When debugging low-level problems such as crashes or deadlocks, a low-level
debugger, such as GDB, is useful to diagnose and correct the issue.
By default, GDB (or any of its front-ends) doesn’t support high-level
information specific to the CPython interpreter.

The @code{python-gdb.py} extension adds CPython interpreter information to GDB.
The extension helps introspect the stack of currently executing Python functions.
Given a Python object represented by a @ref{5df,,PyObject}* pointer,
the extension surfaces the type and value of the object.

Developers who are working on CPython extensions or tinkering with parts
of CPython that are written in C can use this document to learn how to use the
@code{python-gdb.py} extension with GDB.

@cartouche
@quotation Note 
This document assumes that you are familiar with the basics of GDB and the
CPython C API. It consolidates guidance from the
devguide@footnote{https://devguide.python.org}  and the
Python wiki@footnote{https://wiki.python.org/moin/DebuggingWithGdb}.
@end quotation
@end cartouche

@menu
* Prerequisites:: 
* Using the Debug build and Development mode:: 
* Using the python-gdb extension:: 
* Use with GDB commands:: 

@end menu

@node Prerequisites,Using the Debug build and Development mode,,Debugging C API extensions and CPython Internals with GDB
@anchor{howto/gdb_helpers prerequisites}@anchor{5a50}
@subsection Prerequisites


You need to have:


@itemize -

@item 
GDB 7 or later. (For earlier versions of GDB, see @code{Misc/gdbinit} in the
sources of Python 3.11 or earlier.)

@item 
GDB-compatible debugging information for Python and any extension you are
debugging.

@item 
The @code{python-gdb.py} extension.
@end itemize

The extension is built with Python, but might be distributed separately or
not at all. Below, we include tips for a few common systems as examples.
Note that even if the instructions match your system, they might be outdated.

@menu
* Setup with Python built from source:: 
* Setup for Python from a Linux distro:: 

@end menu

@node Setup with Python built from source,Setup for Python from a Linux distro,,Prerequisites
@anchor{howto/gdb_helpers setup-with-python-built-from-source}@anchor{5a51}
@subsubsection Setup with Python built from source


When you build CPython from source, debugging information should be available,
and the build should add a @code{python-gdb.py} file to the root directory of
your repository.

To activate support, you must add the directory containing @code{python-gdb.py}
to GDB’s “auto-load-safe-path”.
If you haven’t done this, recent versions of GDB will print out a warning
with instructions on how to do this.

@cartouche
@quotation Note 
If you do not see instructions for your version of GDB, put this in your
configuration file (@code{~/.gdbinit} or @code{~/.config/gdb/gdbinit}):

@example
add-auto-load-safe-path /path/to/cpython
@end example

You can also add multiple paths, separated by @code{:}.
@end quotation
@end cartouche

@node Setup for Python from a Linux distro,,Setup with Python built from source,Prerequisites
@anchor{howto/gdb_helpers setup-for-python-from-a-linux-distro}@anchor{5a52}
@subsubsection Setup for Python from a Linux distro


Most Linux systems provide debug information for the system Python
in a package called @code{python-debuginfo}, @code{python-dbg} or similar.
For example:


@itemize -

@item 
Fedora:

@quotation

@example
sudo dnf install gdb
sudo dnf debuginfo-install python3
@end example
@end quotation

@item 
Ubuntu:

@quotation

@example
sudo apt install gdb python3-dbg
@end example
@end quotation
@end itemize

On several recent Linux systems, GDB can download debugging symbols
automatically using `debuginfod'.
However, this will not install the @code{python-gdb.py} extension;
you generally do need to install the debug info package separately.

@node Using the Debug build and Development mode,Using the python-gdb extension,Prerequisites,Debugging C API extensions and CPython Internals with GDB
@anchor{howto/gdb_helpers using-the-debug-build-and-development-mode}@anchor{5a53}
@subsection Using the Debug build and Development mode


For easier debugging, you might want to:


@itemize -

@item 
Use a @ref{50a,,debug build} of Python. (When building from source,
use @code{configure --with-pydebug}. On Linux distros, install and run a package
like @code{python-debug} or @code{python-dbg}, if available.)

@item 
Use the runtime @ref{509,,development mode} (@code{-X dev}).
@end itemize

Both enable extra assertions and disable some optimizations.
Sometimes this hides the bug you are trying to find, but in most cases they
make the process easier.

@node Using the python-gdb extension,Use with GDB commands,Using the Debug build and Development mode,Debugging C API extensions and CPython Internals with GDB
@anchor{howto/gdb_helpers using-the-python-gdb-extension}@anchor{5a54}
@subsection Using the @code{python-gdb} extension


When the extension is loaded, it provides two main features:
pretty printers for Python values, and additional commands.

@menu
* Pretty-printers:: 
* py-list:: 
* py-up and py-down:: 
* py-bt:: 
* py-print:: 
* py-locals:: 

@end menu

@node Pretty-printers,py-list,,Using the python-gdb extension
@anchor{howto/gdb_helpers pretty-printers}@anchor{5a55}
@subsubsection Pretty-printers


This is what a GDB backtrace looks like (truncated) when this extension is
enabled:

@example
#0  0x000000000041a6b1 in PyObject_Malloc (nbytes=Cannot access memory at address 0x7fffff7fefe8
) at Objects/obmalloc.c:748
#1  0x000000000041b7c0 in _PyObject_DebugMallocApi (id=111 'o', nbytes=24) at Objects/obmalloc.c:1445
#2  0x000000000041b717 in _PyObject_DebugMalloc (nbytes=24) at Objects/obmalloc.c:1412
#3  0x000000000044060a in _PyUnicode_New (length=11) at Objects/unicodeobject.c:346
#4  0x00000000004466aa in PyUnicodeUCS2_DecodeUTF8Stateful (s=0x5c2b8d "__lltrace__", size=11, errors=0x0, consumed=
    0x0) at Objects/unicodeobject.c:2531
#5  0x0000000000446647 in PyUnicodeUCS2_DecodeUTF8 (s=0x5c2b8d "__lltrace__", size=11, errors=0x0)
    at Objects/unicodeobject.c:2495
#6  0x0000000000440d1b in PyUnicodeUCS2_FromStringAndSize (u=0x5c2b8d "__lltrace__", size=11)
    at Objects/unicodeobject.c:551
#7  0x0000000000440d94 in PyUnicodeUCS2_FromString (u=0x5c2b8d "__lltrace__") at Objects/unicodeobject.c:569
#8  0x0000000000584abd in PyDict_GetItemString (v=
    @{'Yuck': <type at remote 0xad4730>, '__builtins__': <module at remote 0x7ffff7fd5ee8>, '__file__': 'Lib/test/crashers/nasty_eq_vs_dict.py', '__package__': None, 'y': <Yuck(i=0) at remote 0xaacd80>, 'dict': @{0: 0, 1: 1, 2: 2, 3: 3@}, '__cached__': None, '__name__': '__main__', 'z': <Yuck(i=0) at remote 0xaace60>, '__doc__': None@}, key=
    0x5c2b8d "__lltrace__") at Objects/dictobject.c:2171
@end example

Notice how the dictionary argument to @code{PyDict_GetItemString} is displayed
as its @code{repr()}, rather than an opaque @code{PyObject *} pointer.

The extension works by supplying a custom printing routine for values of type
@code{PyObject *}.  If you need to access lower-level details of an object, then
cast the value to a pointer of the appropriate type.  For example:

@example
(gdb) p globals
$1 = @{'__builtins__': <module at remote 0x7ffff7fb1868>, '__name__':
'__main__', 'ctypes': <module at remote 0x7ffff7f14360>, '__doc__': None,
'__package__': None@}

(gdb) p *(PyDictObject*)globals
$2 = @{ob_refcnt = 3, ob_type = 0x3dbdf85820, ma_fill = 5, ma_used = 5,
ma_mask = 7, ma_table = 0x63d0f8, ma_lookup = 0x3dbdc7ea70
<lookdict_string>, ma_smalltable = @{@{me_hash = 7065186196740147912,
me_key = '__builtins__', me_value = <module at remote 0x7ffff7fb1868>@},
@{me_hash = -368181376027291943, me_key = '__name__',
me_value ='__main__'@}, @{me_hash = 0, me_key = 0x0, me_value = 0x0@},
@{me_hash = 0, me_key = 0x0, me_value = 0x0@},
@{me_hash = -9177857982131165996, me_key = 'ctypes',
me_value = <module at remote 0x7ffff7f14360>@},
@{me_hash = -8518757509529533123, me_key = '__doc__', me_value = None@},
@{me_hash = 0, me_key = 0x0, me_value = 0x0@}, @{
  me_hash = 6614918939584953775, me_key = '__package__', me_value = None@}@}@}
@end example

Note that the pretty-printers do not actually call @code{repr()}.
For basic types, they try to match its result closely.

An area that can be confusing is that the custom printer for some types look a
lot like GDB’s built-in printer for standard types.  For example, the
pretty-printer for a Python @code{int} (@ref{39c,,PyLongObject}*)
gives a representation that is not distinguishable from one of a
regular machine-level integer:

@example
(gdb) p some_machine_integer
$3 = 42

(gdb) p some_python_integer
$4 = 42
@end example

The internal structure can be revealed with a cast to @ref{39c,,PyLongObject}*:

@example
(gdb) p *(PyLongObject*)some_python_integer
$5 = @{ob_base = @{ob_base = @{ob_refcnt = 8, ob_type = 0x3dad39f5e0@}, ob_size = 1@},
ob_digit = @{42@}@}
@end example

A similar confusion can arise with the @code{str} type, where the output looks a
lot like gdb’s built-in printer for @code{char *}:

@example
(gdb) p ptr_to_python_str
$6 = '__builtins__'
@end example

The pretty-printer for @code{str} instances defaults to using single-quotes (as
does Python’s @code{repr} for strings) whereas the standard printer for @code{char *}
values uses double-quotes and contains a hexadecimal address:

@example
(gdb) p ptr_to_char_star
$7 = 0x6d72c0 "hello world"
@end example

Again, the implementation details can be revealed with a cast to
@ref{99c,,PyUnicodeObject}*:

@example
(gdb) p *(PyUnicodeObject*)$6
$8 = @{ob_base = @{ob_refcnt = 33, ob_type = 0x3dad3a95a0@}, length = 12,
str = 0x7ffff2128500, hash = 7065186196740147912, state = 1, defenc = 0x0@}
@end example

@node py-list,py-up and py-down,Pretty-printers,Using the python-gdb extension
@anchor{howto/gdb_helpers py-list}@anchor{5a56}
@subsubsection @code{py-list}


@quotation

The extension adds a @code{py-list} command, which
lists the Python source code (if any) for the current frame in the selected
thread.  The current line is marked with a “>”:

@example
(gdb) py-list
 901        if options.profile:
 902            options.profile = False
 903            profile_me()
 904            return
 905
>906        u = UI()
 907        if not u.quit:
 908            try:
 909                gtk.main()
 910            except KeyboardInterrupt:
 911                # properly quit on a keyboard interrupt...
@end example

Use @code{py-list START} to list at a different line number within the Python
source, and @code{py-list START,END} to list a specific range of lines within
the Python source.
@end quotation

@node py-up and py-down,py-bt,py-list,Using the python-gdb extension
@anchor{howto/gdb_helpers py-up-and-py-down}@anchor{5a57}
@subsubsection @code{py-up} and @code{py-down}


@quotation

The @code{py-up} and @code{py-down} commands are analogous to GDB’s regular @code{up}
and @code{down} commands, but try to move at the level of CPython frames, rather
than C frames.

GDB is not always able to read the relevant frame information, depending on
the optimization level with which CPython was compiled. Internally, the
commands look for C frames that are executing the default frame evaluation
function (that is, the core bytecode interpreter loop within CPython) and
look up the value of the related @code{PyFrameObject *}.

They emit the frame number (at the C level) within the thread.

For example:

@example
(gdb) py-up
#37 Frame 0x9420b04, for file /usr/lib/python2.6/site-packages/
gnome_sudoku/main.py, line 906, in start_game ()
    u = UI()
(gdb) py-up
#40 Frame 0x948e82c, for file /usr/lib/python2.6/site-packages/
gnome_sudoku/gnome_sudoku.py, line 22, in start_game(main=<module at remote 0xb771b7f4>)
    main.start_game()
(gdb) py-up
Unable to find an older python frame
@end example

so we’re at the top of the Python stack.

The frame numbers correspond to those displayed by GDB’s standard
@code{backtrace} command.
The command skips C frames which are not executing Python code.

Going back down:

@example
(gdb) py-down
#37 Frame 0x9420b04, for file /usr/lib/python2.6/site-packages/gnome_sudoku/main.py, line 906, in start_game ()
    u = UI()
(gdb) py-down
#34 (unable to read python frame information)
(gdb) py-down
#23 (unable to read python frame information)
(gdb) py-down
#19 (unable to read python frame information)
(gdb) py-down
#14 Frame 0x99262ac, for file /usr/lib/python2.6/site-packages/gnome_sudoku/game_selector.py, line 201, in run_swallowed_dialog (self=<NewOrSavedGameSelector(new_game_model=<gtk.ListStore at remote 0x98fab44>, puzzle=None, saved_games=[@{'gsd.auto_fills': 0, 'tracking': @{@}, 'trackers': @{@}, 'notes': [], 'saved_at': 1270084485, 'game': '7 8 0 0 0 0 0 5 6 0 0 9 0 8 0 1 0 0 0 4 6 0 0 0 0 7 0 6 5 0 0 0 4 7 9 2 0 0 0 9 0 1 0 0 0 3 9 7 6 0 0 0 1 8 0 6 0 0 0 0 2 8 0 0 0 5 0 4 0 6 0 0 2 1 0 0 0 0 0 4 5\n7 8 0 0 0 0 0 5 6 0 0 9 0 8 0 1 0 0 0 4 6 0 0 0 0 7 0 6 5 1 8 3 4 7 9 2 0 0 0 9 0 1 0 0 0 3 9 7 6 0 0 0 1 8 0 6 0 0 0 0 2 8 0 0 0 5 0 4 0 6 0 0 2 1 0 0 0 0 0 4 5', 'gsd.impossible_hints': 0, 'timer.__absolute_start_time__': <float at remote 0x984b474>, 'gsd.hints': 0, 'timer.active_time': <float at remote 0x984b494>, 'timer.total_time': <float at remote 0x984b464>@}], dialog=<gtk.Dialog at remote 0x98faaa4>, saved_game_model=<gtk.ListStore at remote 0x98fad24>, sudoku_maker=<SudokuMaker(terminated=False, played=[], batch_siz...(truncated)
            swallower.run_dialog(self.dialog)
(gdb) py-down
#11 Frame 0x9aead74, for file /usr/lib/python2.6/site-packages/gnome_sudoku/dialog_swallower.py, line 48, in run_dialog (self=<SwappableArea(running=<gtk.Dialog at remote 0x98faaa4>, main_page=0) at remote 0x98fa6e4>, d=<gtk.Dialog at remote 0x98faaa4>)
            gtk.main()
(gdb) py-down
#8 (unable to read python frame information)
(gdb) py-down
Unable to find a newer python frame
@end example

and we’re at the bottom of the Python stack.

Note that in Python 3.12 and newer, the same C stack frame can be used for
multiple Python stack frames. This means that @code{py-up} and @code{py-down}
may move multiple Python frames at once. For example:

@example
(gdb) py-up
#6 Frame 0x7ffff7fb62b0, for file /tmp/rec.py, line 5, in recursive_function (n=0)
   time.sleep(5)
#6 Frame 0x7ffff7fb6240, for file /tmp/rec.py, line 7, in recursive_function (n=1)
   recursive_function(n-1)
#6 Frame 0x7ffff7fb61d0, for file /tmp/rec.py, line 7, in recursive_function (n=2)
   recursive_function(n-1)
#6 Frame 0x7ffff7fb6160, for file /tmp/rec.py, line 7, in recursive_function (n=3)
   recursive_function(n-1)
#6 Frame 0x7ffff7fb60f0, for file /tmp/rec.py, line 7, in recursive_function (n=4)
   recursive_function(n-1)
#6 Frame 0x7ffff7fb6080, for file /tmp/rec.py, line 7, in recursive_function (n=5)
   recursive_function(n-1)
#6 Frame 0x7ffff7fb6020, for file /tmp/rec.py, line 9, in <module> ()
   recursive_function(5)
(gdb) py-up
Unable to find an older python frame
@end example
@end quotation

@node py-bt,py-print,py-up and py-down,Using the python-gdb extension
@anchor{howto/gdb_helpers py-bt}@anchor{5a58}
@subsubsection @code{py-bt}


@quotation

The @code{py-bt} command attempts to display a Python-level backtrace of the
current thread.

For example:

@example
(gdb) py-bt
#8 (unable to read python frame information)
#11 Frame 0x9aead74, for file /usr/lib/python2.6/site-packages/gnome_sudoku/dialog_swallower.py, line 48, in run_dialog (self=<SwappableArea(running=<gtk.Dialog at remote 0x98faaa4>, main_page=0) at remote 0x98fa6e4>, d=<gtk.Dialog at remote 0x98faaa4>)
            gtk.main()
#14 Frame 0x99262ac, for file /usr/lib/python2.6/site-packages/gnome_sudoku/game_selector.py, line 201, in run_swallowed_dialog (self=<NewOrSavedGameSelector(new_game_model=<gtk.ListStore at remote 0x98fab44>, puzzle=None, saved_games=[@{'gsd.auto_fills': 0, 'tracking': @{@}, 'trackers': @{@}, 'notes': [], 'saved_at': 1270084485, 'game': '7 8 0 0 0 0 0 5 6 0 0 9 0 8 0 1 0 0 0 4 6 0 0 0 0 7 0 6 5 0 0 0 4 7 9 2 0 0 0 9 0 1 0 0 0 3 9 7 6 0 0 0 1 8 0 6 0 0 0 0 2 8 0 0 0 5 0 4 0 6 0 0 2 1 0 0 0 0 0 4 5\n7 8 0 0 0 0 0 5 6 0 0 9 0 8 0 1 0 0 0 4 6 0 0 0 0 7 0 6 5 1 8 3 4 7 9 2 0 0 0 9 0 1 0 0 0 3 9 7 6 0 0 0 1 8 0 6 0 0 0 0 2 8 0 0 0 5 0 4 0 6 0 0 2 1 0 0 0 0 0 4 5', 'gsd.impossible_hints': 0, 'timer.__absolute_start_time__': <float at remote 0x984b474>, 'gsd.hints': 0, 'timer.active_time': <float at remote 0x984b494>, 'timer.total_time': <float at remote 0x984b464>@}], dialog=<gtk.Dialog at remote 0x98faaa4>, saved_game_model=<gtk.ListStore at remote 0x98fad24>, sudoku_maker=<SudokuMaker(terminated=False, played=[], batch_siz...(truncated)
            swallower.run_dialog(self.dialog)
#19 (unable to read python frame information)
#23 (unable to read python frame information)
#34 (unable to read python frame information)
#37 Frame 0x9420b04, for file /usr/lib/python2.6/site-packages/gnome_sudoku/main.py, line 906, in start_game ()
    u = UI()
#40 Frame 0x948e82c, for file /usr/lib/python2.6/site-packages/gnome_sudoku/gnome_sudoku.py, line 22, in start_game (main=<module at remote 0xb771b7f4>)
    main.start_game()
@end example

The frame numbers correspond to those displayed by GDB’s standard
@code{backtrace} command.
@end quotation

@node py-print,py-locals,py-bt,Using the python-gdb extension
@anchor{howto/gdb_helpers py-print}@anchor{5a59}
@subsubsection @code{py-print}


@quotation

The @code{py-print} command looks up a Python name and tries to print it.
It looks in locals within the current thread, then globals, then finally
builtins:

@example
(gdb) py-print self
local 'self' = <SwappableArea(running=<gtk.Dialog at remote 0x98faaa4>,
main_page=0) at remote 0x98fa6e4>
(gdb) py-print __name__
global '__name__' = 'gnome_sudoku.dialog_swallower'
(gdb) py-print len
builtin 'len' = <built-in function len>
(gdb) py-print scarlet_pimpernel
'scarlet_pimpernel' not found
@end example

If the current C frame corresponds to multiple Python frames, @code{py-print}
only considers the first one.
@end quotation

@node py-locals,,py-print,Using the python-gdb extension
@anchor{howto/gdb_helpers py-locals}@anchor{5a5a}
@subsubsection @code{py-locals}


@quotation

The @code{py-locals} command looks up all Python locals within the current
Python frame in the selected thread, and prints their representations:

@example
(gdb) py-locals
self = <SwappableArea(running=<gtk.Dialog at remote 0x98faaa4>,
main_page=0) at remote 0x98fa6e4>
d = <gtk.Dialog at remote 0x98faaa4>
@end example

If the current C frame corresponds to multiple Python frames, locals from
all of them will be shown:

@example
(gdb) py-locals
Locals for recursive_function
n = 0
Locals for recursive_function
n = 1
Locals for recursive_function
n = 2
Locals for recursive_function
n = 3
Locals for recursive_function
n = 4
Locals for recursive_function
n = 5
Locals for <module>
@end example
@end quotation

@node Use with GDB commands,,Using the python-gdb extension,Debugging C API extensions and CPython Internals with GDB
@anchor{howto/gdb_helpers use-with-gdb-commands}@anchor{5a5b}
@subsection Use with GDB commands


The extension commands complement GDB’s built-in commands.
For example, you can use a frame numbers shown by @code{py-bt} with the @code{frame}
command to go a specific frame within the selected thread, like this:

@example
(gdb) py-bt
(output snipped)
#68 Frame 0xaa4560, for file Lib/test/regrtest.py, line 1548, in <module> ()
        main()
(gdb) frame 68
#68 0x00000000004cd1e6 in PyEval_EvalFrameEx (f=Frame 0xaa4560, for file Lib/test/regrtest.py, line 1548, in <module> (), throwflag=0) at Python/ceval.c:2665
2665                            x = call_function(&sp, oparg);
(gdb) py-list
1543        # Run the tests in a context manager that temporary changes the CWD to a
1544        # temporary and writable directory. If it's not possible to create or
1545        # change the CWD, the original CWD will be used. The original CWD is
1546        # available from test_support.SAVEDCWD.
1547        with test_support.temp_cwd(TESTCWD, quiet=True):
>1548            main()
@end example

The @code{info threads} command will give you a list of the threads within the
process, and you can use the @code{thread} command to select a different one:

@example
(gdb) info threads
  105 Thread 0x7fffefa18710 (LWP 10260)  sem_wait () at ../nptl/sysdeps/unix/sysv/linux/x86_64/sem_wait.S:86
  104 Thread 0x7fffdf5fe710 (LWP 10259)  sem_wait () at ../nptl/sysdeps/unix/sysv/linux/x86_64/sem_wait.S:86
* 1 Thread 0x7ffff7fe2700 (LWP 10145)  0x00000038e46d73e3 in select () at ../sysdeps/unix/syscall-template.S:82
@end example

You can use @code{thread apply all COMMAND} or (@code{t a a COMMAND} for short) to run
a command on all threads.  With @code{py-bt}, this lets you see what every
thread is doing at the Python level:

@example
(gdb) t a a py-bt

Thread 105 (Thread 0x7fffefa18710 (LWP 10260)):
#5 Frame 0x7fffd00019d0, for file /home/david/coding/python-svn/Lib/threading.py, line 155, in _acquire_restore (self=<_RLock(_Verbose__verbose=False, _RLock__owner=140737354016512, _RLock__block=<thread.lock at remote 0x858770>, _RLock__count=1) at remote 0xd7ff40>, count_owner=(1, 140737213728528), count=1, owner=140737213728528)
        self.__block.acquire()
#8 Frame 0x7fffac001640, for file /home/david/coding/python-svn/Lib/threading.py, line 269, in wait (self=<_Condition(_Condition__lock=<_RLock(_Verbose__verbose=False, _RLock__owner=140737354016512, _RLock__block=<thread.lock at remote 0x858770>, _RLock__count=1) at remote 0xd7ff40>, acquire=<instancemethod at remote 0xd80260>, _is_owned=<instancemethod at remote 0xd80160>, _release_save=<instancemethod at remote 0xd803e0>, release=<instancemethod at remote 0xd802e0>, _acquire_restore=<instancemethod at remote 0xd7ee60>, _Verbose__verbose=False, _Condition__waiters=[]) at remote 0xd7fd10>, timeout=None, waiter=<thread.lock at remote 0x858a90>, saved_state=(1, 140737213728528))
            self._acquire_restore(saved_state)
#12 Frame 0x7fffb8001a10, for file /home/david/coding/python-svn/Lib/test/lock_tests.py, line 348, in f ()
            cond.wait()
#16 Frame 0x7fffb8001c40, for file /home/david/coding/python-svn/Lib/test/lock_tests.py, line 37, in task (tid=140737213728528)
                f()

Thread 104 (Thread 0x7fffdf5fe710 (LWP 10259)):
#5 Frame 0x7fffe4001580, for file /home/david/coding/python-svn/Lib/threading.py, line 155, in _acquire_restore (self=<_RLock(_Verbose__verbose=False, _RLock__owner=140737354016512, _RLock__block=<thread.lock at remote 0x858770>, _RLock__count=1) at remote 0xd7ff40>, count_owner=(1, 140736940992272), count=1, owner=140736940992272)
        self.__block.acquire()
#8 Frame 0x7fffc8002090, for file /home/david/coding/python-svn/Lib/threading.py, line 269, in wait (self=<_Condition(_Condition__lock=<_RLock(_Verbose__verbose=False, _RLock__owner=140737354016512, _RLock__block=<thread.lock at remote 0x858770>, _RLock__count=1) at remote 0xd7ff40>, acquire=<instancemethod at remote 0xd80260>, _is_owned=<instancemethod at remote 0xd80160>, _release_save=<instancemethod at remote 0xd803e0>, release=<instancemethod at remote 0xd802e0>, _acquire_restore=<instancemethod at remote 0xd7ee60>, _Verbose__verbose=False, _Condition__waiters=[]) at remote 0xd7fd10>, timeout=None, waiter=<thread.lock at remote 0x858860>, saved_state=(1, 140736940992272))
            self._acquire_restore(saved_state)
#12 Frame 0x7fffac001c90, for file /home/david/coding/python-svn/Lib/test/lock_tests.py, line 348, in f ()
            cond.wait()
#16 Frame 0x7fffac0011c0, for file /home/david/coding/python-svn/Lib/test/lock_tests.py, line 37, in task (tid=140736940992272)
                f()

Thread 1 (Thread 0x7ffff7fe2700 (LWP 10145)):
#5 Frame 0xcb5380, for file /home/david/coding/python-svn/Lib/test/lock_tests.py, line 16, in _wait ()
    time.sleep(0.01)
#8 Frame 0x7fffd00024a0, for file /home/david/coding/python-svn/Lib/test/lock_tests.py, line 378, in _check_notify (self=<ConditionTests(_testMethodName='test_notify', _resultForDoCleanups=<TestResult(_original_stdout=<cStringIO.StringO at remote 0xc191e0>, skipped=[], _mirrorOutput=False, testsRun=39, buffer=False, _original_stderr=<file at remote 0x7ffff7fc6340>, _stdout_buffer=<cStringIO.StringO at remote 0xc9c7f8>, _stderr_buffer=<cStringIO.StringO at remote 0xc9c790>, _moduleSetUpFailed=False, expectedFailures=[], errors=[], _previousTestClass=<type at remote 0x928310>, unexpectedSuccesses=[], failures=[], shouldStop=False, failfast=False) at remote 0xc185a0>, _threads=(0,), _cleanups=[], _type_equality_funcs=@{<type at remote 0x7eba00>: <instancemethod at remote 0xd750e0>, <type at remote 0x7e7820>: <instancemethod at remote 0xd75160>, <type at remote 0x7e30e0>: <instancemethod at remote 0xd75060>, <type at remote 0x7e7d20>: <instancemethod at remote 0xd751e0>, <type at remote 0x7f19e0...(truncated)
        _wait()
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Enum HOWTO,Functional Programming HOWTO,Debugging C API extensions and CPython Internals with GDB,Python HOWTOs
@anchor{howto/enum doc}@anchor{5a5c}@anchor{howto/enum enum-howto}@anchor{5a5d}@anchor{howto/enum id1}@anchor{5a5e}@anchor{howto/enum translation-repo}@anchor{5a5f}
@section Enum HOWTO

@anchor{howto/enum enum-basic-tutorial}@anchor{2a90}
An @ref{843,,Enum} is a set of symbolic names bound to unique values.  They are
similar to global variables, but they offer a more useful @ref{1c3,,repr()},
grouping, type-safety, and a few other features.

They are most useful when you have a variable that can take one of a limited
selection of values.  For example, the days of the week:

@example
>>> from enum import Enum
>>> class Weekday(Enum):
...     MONDAY = 1
...     TUESDAY = 2
...     WEDNESDAY = 3
...     THURSDAY = 4
...     FRIDAY = 5
...     SATURDAY = 6
...     SUNDAY = 7
@end example

Or perhaps the RGB primary colors:

@example
>>> from enum import Enum
>>> class Color(Enum):
...     RED = 1
...     GREEN = 2
...     BLUE = 3
@end example

As you can see, creating an @ref{843,,Enum} is as simple as writing a class that
inherits from @code{Enum} itself.

@cartouche
@quotation Note 
Case of Enum Members

Because Enums are used to represent constants, and to help avoid issues
with name clashes between mixin-class methods/attributes and enum names,
we strongly recommend using UPPER_CASE names for members, and will be using
that style in our examples.
@end quotation
@end cartouche

Depending on the nature of the enum a member’s value may or may not be
important, but either way that value can be used to get the corresponding
member:

@example
>>> Weekday(3)
<Weekday.WEDNESDAY: 3>
@end example

As you can see, the @code{repr()} of a member shows the enum name, the member name,
and the value.  The @code{str()} of a member shows only the enum name and member
name:

@example
>>> print(Weekday.THURSDAY)
Weekday.THURSDAY
@end example

The `type' of an enumeration member is the enum it belongs to:

@example
>>> type(Weekday.MONDAY)
<enum 'Weekday'>
>>> isinstance(Weekday.FRIDAY, Weekday)
True
@end example

Enum members have an attribute that contains just their @code{name}:

@example
>>> print(Weekday.TUESDAY.name)
TUESDAY
@end example

Likewise, they have an attribute for their @code{value}:

@example
>>> Weekday.WEDNESDAY.value
3
@end example

Unlike many languages that treat enumerations solely as name/value pairs,
Python Enums can have behavior added.  For example, @ref{1fc,,datetime.date}
has two methods for returning the weekday:
@ref{292a,,weekday()} and @ref{292b,,isoweekday()}.
The difference is that one of them counts from 0-6 and the other from 1-7.
Rather than keep track of that ourselves we can add a method to the @code{Weekday}
enum to extract the day from the @code{date} instance and return the matching
enum member:

@example
@@classmethod
def from_date(cls, date):
    return cls(date.isoweekday())
@end example

The complete @code{Weekday} enum now looks like this:

@example
>>> class Weekday(Enum):
...     MONDAY = 1
...     TUESDAY = 2
...     WEDNESDAY = 3
...     THURSDAY = 4
...     FRIDAY = 5
...     SATURDAY = 6
...     SUNDAY = 7
...     #
...     @@classmethod
...     def from_date(cls, date):
...         return cls(date.isoweekday())
@end example

Now we can find out what today is!  Observe:

@example
>>> import datetime as dt
>>> Weekday.from_date(dt.date.today())
<Weekday.TUESDAY: 2>
@end example

Of course, if you’re reading this on some other day, you’ll see that day instead.

This @code{Weekday} enum is great if our variable only needs one day, but
what if we need several?  Maybe we’re writing a function to plot chores during
a week, and don’t want to use a @ref{24f,,list} – we could use a different type
of @ref{843,,Enum}:

@example
>>> from enum import Flag
>>> class Weekday(Flag):
...     MONDAY = 1
...     TUESDAY = 2
...     WEDNESDAY = 4
...     THURSDAY = 8
...     FRIDAY = 16
...     SATURDAY = 32
...     SUNDAY = 64
@end example

We’ve changed two things: we’re inherited from @ref{836,,Flag}, and the values are
all powers of 2.

Just like the original @code{Weekday} enum above, we can have a single selection:

@example
>>> first_week_day = Weekday.MONDAY
>>> first_week_day
<Weekday.MONDAY: 1>
@end example

But @ref{836,,Flag} also allows us to combine several members into a single
variable:

@example
>>> weekend = Weekday.SATURDAY | Weekday.SUNDAY
>>> weekend
<Weekday.SATURDAY|SUNDAY: 96>
@end example

You can even iterate over a @ref{836,,Flag} variable:

@example
>>> for day in weekend:
...     print(day)
Weekday.SATURDAY
Weekday.SUNDAY
@end example

Okay, let’s get some chores set up:

@example
>>> chores_for_ethan = @{
...     'feed the cat': Weekday.MONDAY | Weekday.WEDNESDAY | Weekday.FRIDAY,
...     'do the dishes': Weekday.TUESDAY | Weekday.THURSDAY,
...     'answer SO questions': Weekday.SATURDAY,
...     @}
@end example

And a function to display the chores for a given day:

@example
>>> def show_chores(chores, day):
...     for chore, days in chores.items():
...         if day in days:
...             print(chore)
...
>>> show_chores(chores_for_ethan, Weekday.SATURDAY)
answer SO questions
@end example

In cases where the actual values of the members do not matter, you can save
yourself some work and use @ref{ea1,,auto()} for the values:

@example
>>> from enum import auto
>>> class Weekday(Flag):
...     MONDAY = auto()
...     TUESDAY = auto()
...     WEDNESDAY = auto()
...     THURSDAY = auto()
...     FRIDAY = auto()
...     SATURDAY = auto()
...     SUNDAY = auto()
...     WEEKEND = SATURDAY | SUNDAY
@end example

@menu
* Programmatic access to enumeration members and their attributes:: 
* Duplicating enum members and values:: 
* Ensuring unique enumeration values:: 
* Using automatic values:: 
* Iteration: Iteration<2>. 
* Comparisons: Comparisons<3>. 
* Allowed members and attributes of enumerations:: 
* Restricted Enum subclassing:: 
* Dataclass support:: 
* Pickling:: 
* Functional API: Functional API<3>. 
* Derived Enumerations:: 
* When to use __new__() vs. __init__(): When to use __new__ vs __init__. 
* Finer Points:: 
* How are Enums and Flags different?:: 
* Enum Cookbook:: 
* Subclassing EnumType:: 

@end menu

@node Programmatic access to enumeration members and their attributes,Duplicating enum members and values,,Enum HOWTO
@anchor{howto/enum enum-advanced-tutorial}@anchor{2a91}@anchor{howto/enum programmatic-access-to-enumeration-members-and-their-attributes}@anchor{5a60}
@subsection Programmatic access to enumeration members and their attributes


Sometimes it’s useful to access members in enumerations programmatically (i.e.
situations where @code{Color.RED} won’t do because the exact color is not known
at program-writing time).  @code{Enum} allows such access:

@example
>>> Color(1)
<Color.RED: 1>
>>> Color(3)
<Color.BLUE: 3>
@end example

If you want to access enum members by `name', use item access:

@example
>>> Color['RED']
<Color.RED: 1>
>>> Color['GREEN']
<Color.GREEN: 2>
@end example

If you have an enum member and need its @code{name} or @code{value}:

@example
>>> member = Color.RED
>>> member.name
'RED'
>>> member.value
1
@end example

@node Duplicating enum members and values,Ensuring unique enumeration values,Programmatic access to enumeration members and their attributes,Enum HOWTO
@anchor{howto/enum duplicating-enum-members-and-values}@anchor{5a61}
@subsection Duplicating enum members and values


Having two enum members with the same name is invalid:

@example
>>> class Shape(Enum):
...     SQUARE = 2
...     SQUARE = 3
...
Traceback (most recent call last):
...
TypeError: 'SQUARE' already defined as 2
@end example

However, an enum member can have other names associated with it.  Given two
entries @code{A} and @code{B} with the same value (and @code{A} defined first), @code{B}
is an alias for the member @code{A}.  By-value lookup of the value of @code{A} will
return the member @code{A}.  By-name lookup of @code{A} will return the member @code{A}.
By-name lookup of @code{B} will also return the member @code{A}:

@example
>>> class Shape(Enum):
...     SQUARE = 2
...     DIAMOND = 1
...     CIRCLE = 3
...     ALIAS_FOR_SQUARE = 2
...
>>> Shape.SQUARE
<Shape.SQUARE: 2>
>>> Shape.ALIAS_FOR_SQUARE
<Shape.SQUARE: 2>
>>> Shape(2)
<Shape.SQUARE: 2>
@end example

@cartouche
@quotation Note 
Attempting to create a member with the same name as an already
defined attribute (another member, a method, etc.) or attempting to create
an attribute with the same name as a member is not allowed.
@end quotation
@end cartouche

@node Ensuring unique enumeration values,Using automatic values,Duplicating enum members and values,Enum HOWTO
@anchor{howto/enum ensuring-unique-enumeration-values}@anchor{5a62}
@subsection Ensuring unique enumeration values


By default, enumerations allow multiple names as aliases for the same value.
When this behavior isn’t desired, you can use the @ref{2a96,,unique()} decorator:

@example
>>> from enum import Enum, unique
>>> @@unique
... class Mistake(Enum):
...     ONE = 1
...     TWO = 2
...     THREE = 3
...     FOUR = 3
...
Traceback (most recent call last):
...
ValueError: duplicate values found in <enum 'Mistake'>: FOUR -> THREE
@end example

@node Using automatic values,Iteration<2>,Ensuring unique enumeration values,Enum HOWTO
@anchor{howto/enum using-automatic-values}@anchor{5a63}
@subsection Using automatic values


If the exact value is unimportant you can use @ref{ea1,,auto}:

@example
>>> from enum import Enum, auto
>>> class Color(Enum):
...     RED = auto()
...     BLUE = auto()
...     GREEN = auto()
...
>>> [member.value for member in Color]
[1, 2, 3]
@end example

The values are chosen by @ref{2aaa,,_generate_next_value_()}, which can be
overridden:

@example
>>> class AutoName(Enum):
...     @@staticmethod
...     def _generate_next_value_(name, start, count, last_values):
...         return name
...
>>> class Ordinal(AutoName):
...     NORTH = auto()
...     SOUTH = auto()
...     EAST = auto()
...     WEST = auto()
...
>>> [member.value for member in Ordinal]
['NORTH', 'SOUTH', 'EAST', 'WEST']
@end example

@cartouche
@quotation Note 
The @ref{2aaa,,_generate_next_value_()} method must be defined before any members.
@end quotation
@end cartouche

@node Iteration<2>,Comparisons<3>,Using automatic values,Enum HOWTO
@anchor{howto/enum iteration}@anchor{5a64}
@subsection Iteration


Iterating over the members of an enum does not provide the aliases:

@example
>>> list(Shape)
[<Shape.SQUARE: 2>, <Shape.DIAMOND: 1>, <Shape.CIRCLE: 3>]
>>> list(Weekday)
[<Weekday.MONDAY: 1>, <Weekday.TUESDAY: 2>, <Weekday.WEDNESDAY: 4>, <Weekday.THURSDAY: 8>, <Weekday.FRIDAY: 16>, <Weekday.SATURDAY: 32>, <Weekday.SUNDAY: 64>]
@end example

Note that the aliases @code{Shape.ALIAS_FOR_SQUARE} and @code{Weekday.WEEKEND} aren’t shown.

The special attribute @code{__members__} is a read-only ordered mapping of names
to members.  It includes all names defined in the enumeration, including the
aliases:

@example
>>> for name, member in Shape.__members__.items():
...     name, member
...
('SQUARE', <Shape.SQUARE: 2>)
('DIAMOND', <Shape.DIAMOND: 1>)
('CIRCLE', <Shape.CIRCLE: 3>)
('ALIAS_FOR_SQUARE', <Shape.SQUARE: 2>)
@end example

The @code{__members__} attribute can be used for detailed programmatic access to
the enumeration members.  For example, finding all the aliases:

@example
>>> [name for name, member in Shape.__members__.items() if member.name != name]
['ALIAS_FOR_SQUARE']
@end example

@cartouche
@quotation Note 
Aliases for flags include values with multiple flags set, such as @code{3},
and no flags set, i.e. @code{0}.
@end quotation
@end cartouche

@node Comparisons<3>,Allowed members and attributes of enumerations,Iteration<2>,Enum HOWTO
@anchor{howto/enum comparisons}@anchor{5a65}
@subsection Comparisons


Enumeration members are compared by identity:

@example
>>> Color.RED is Color.RED
True
>>> Color.RED is Color.BLUE
False
>>> Color.RED is not Color.BLUE
True
@end example

Ordered comparisons between enumeration values are `not' supported.  Enum
members are not integers (but see @ref{5a66,,IntEnum} below):

@example
>>> Color.RED < Color.BLUE
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: '<' not supported between instances of 'Color' and 'Color'
@end example

Equality comparisons are defined though:

@example
>>> Color.BLUE == Color.RED
False
>>> Color.BLUE != Color.RED
True
>>> Color.BLUE == Color.BLUE
True
@end example

Comparisons against non-enumeration values will always compare not equal
(again, @ref{ee1,,IntEnum} was explicitly designed to behave differently, see
below):

@example
>>> Color.BLUE == 2
False
@end example

@cartouche
@quotation Warning 
It is possible to reload modules – if a reloaded module contains
enums, they will be recreated, and the new members may not
compare identical/equal to the original members.
@end quotation
@end cartouche

@node Allowed members and attributes of enumerations,Restricted Enum subclassing,Comparisons<3>,Enum HOWTO
@anchor{howto/enum allowed-members-and-attributes-of-enumerations}@anchor{5a67}
@subsection Allowed members and attributes of enumerations


Most of the examples above use integers for enumeration values.  Using integers
is short and handy (and provided by default by the @ref{5a68,,Functional API}), but not
strictly enforced.  In the vast majority of use-cases, one doesn’t care what
the actual value of an enumeration is.  But if the value `is' important,
enumerations can have arbitrary values.

Enumerations are Python classes, and can have methods and special methods as
usual.  If we have this enumeration:

@example
>>> class Mood(Enum):
...     FUNKY = 1
...     HAPPY = 3
...
...     def describe(self):
...         # self is the member here
...         return self.name, self.value
...
...     def __str__(self):
...         return 'my custom str! @{0@}'.format(self.value)
...
...     @@classmethod
...     def favorite_mood(cls):
...         # cls here is the enumeration
...         return cls.HAPPY
...
@end example

Then:

@example
>>> Mood.favorite_mood()
<Mood.HAPPY: 3>
>>> Mood.HAPPY.describe()
('HAPPY', 3)
>>> str(Mood.FUNKY)
'my custom str! 1'
@end example

The rules for what is allowed are as follows: names that start and end with
a single underscore are reserved by enum and cannot be used; all other
attributes defined within an enumeration will become members of this
enumeration, with the exception of special methods (@ref{831,,__str__()},
@ref{2424,,__add__()}, etc.), descriptors (methods are also descriptors), and
variable names listed in @ref{2aa8,,_ignore_}.

Note:  if your enumeration defines @ref{7a1,,__new__()} and/or @ref{8c1,,__init__()},
any value(s) given to the enum member will be passed into those methods.
See @ref{5a69,,Planet} for an example.

@cartouche
@quotation Note 
The @ref{7a1,,__new__()} method, if defined, is used during creation of the Enum
members; it is then replaced by Enum’s @code{__new__()} which is used after
class creation for lookup of existing members.  See @ref{5a6a,,When to use __new__() vs. __init__()} for
more details.
@end quotation
@end cartouche

@node Restricted Enum subclassing,Dataclass support,Allowed members and attributes of enumerations,Enum HOWTO
@anchor{howto/enum restricted-enum-subclassing}@anchor{5a6b}
@subsection Restricted Enum subclassing


A new @ref{843,,Enum} class must have one base enum class, up to one concrete
data type, and as many @ref{c84,,object}-based mixin classes as needed.  The
order of these base classes is:

@example
class EnumName([mix-in, ...,] [data-type,] base-enum):
    pass
@end example

Also, subclassing an enumeration is allowed only if the enumeration does not define
any members.  So this is forbidden:

@example
>>> class MoreColor(Color):
...     PINK = 17
...
Traceback (most recent call last):
...
TypeError: <enum 'MoreColor'> cannot extend <enum 'Color'>
@end example

But this is allowed:

@example
>>> class Foo(Enum):
...     def some_behavior(self):
...         pass
...
>>> class Bar(Foo):
...     HAPPY = 1
...     SAD = 2
...
@end example

Allowing subclassing of enums that define members would lead to a violation of
some important invariants of types and instances.  On the other hand, it makes
sense to allow sharing some common behavior between a group of enumerations.
(See @ref{5a6c,,OrderedEnum} for an example.)

@node Dataclass support,Pickling,Restricted Enum subclassing,Enum HOWTO
@anchor{howto/enum dataclass-support}@anchor{5a6d}@anchor{howto/enum enum-dataclass-support}@anchor{1b3d}
@subsection Dataclass support


When inheriting from a @ref{4e2,,dataclass},
the @ref{1b3e,,__repr__()} omits the inherited class’ name.  For example:

@example
>>> from dataclasses import dataclass, field
>>> @@dataclass
... class CreatureDataMixin:
...     size: str
...     legs: int
...     tail: bool = field(repr=False, default=True)
...
>>> class Creature(CreatureDataMixin, Enum):
...     BEETLE = 'small', 6
...     DOG = 'medium', 4
...
>>> Creature.DOG
<Creature.DOG: size='medium', legs=4>
@end example

Use the @ref{4e2,,dataclass()} argument @code{repr=False}
to use the standard @ref{1c3,,repr()}.


Changed in version 3.12: Only the dataclass fields are shown in the value area, not the dataclass’
name.


@cartouche
@quotation Note 
Adding @ref{4e2,,dataclass()} decorator to @ref{843,,Enum}
and its subclasses is not supported. It will not raise any errors,
but it will produce very strange results at runtime, such as members
being equal to each other:

@example
>>> @@dataclass               # don't do this: it does not make any sense
... class Color(Enum):
...    RED = 1
...    BLUE = 2
...
>>> Color.RED is Color.BLUE
False
>>> Color.RED == Color.BLUE  # problem is here: they should not be equal
True
@end example
@end quotation
@end cartouche

@node Pickling,Functional API<3>,Dataclass support,Enum HOWTO
@anchor{howto/enum pickling}@anchor{5a6e}
@subsection Pickling


Enumerations can be pickled and unpickled:

@example
>>> from test.test_enum import Fruit
>>> from pickle import dumps, loads
>>> Fruit.TOMATO is loads(dumps(Fruit.TOMATO))
True
@end example

The usual restrictions for pickling apply: picklable enums must be defined in
the top level of a module, since unpickling requires them to be importable
from that module.

@cartouche
@quotation Note 
With pickle protocol version 4 it is possible to easily pickle enums
nested in other classes.
@end quotation
@end cartouche

It is possible to modify how enum members are pickled/unpickled by defining
@ref{19af,,__reduce_ex__()} in the enumeration class.  The default method is by-value,
but enums with complicated values may want to use by-name:

@example
>>> import enum
>>> class MyEnum(enum.Enum):
...     __reduce_ex__ = enum.pickle_by_enum_name
@end example

@cartouche
@quotation Note 
Using by-name for flags is not recommended, as unnamed aliases will
not unpickle.
@end quotation
@end cartouche

@node Functional API<3>,Derived Enumerations,Pickling,Enum HOWTO
@anchor{howto/enum functional-api}@anchor{5a68}
@subsection Functional API


The @ref{843,,Enum} class is callable, providing the following functional API:

@example
>>> Animal = Enum('Animal', 'ANT BEE CAT DOG')
>>> Animal
<enum 'Animal'>
>>> Animal.ANT
<Animal.ANT: 1>
>>> list(Animal)
[<Animal.ANT: 1>, <Animal.BEE: 2>, <Animal.CAT: 3>, <Animal.DOG: 4>]
@end example

The semantics of this API resemble @ref{4e1,,namedtuple}. The first
argument of the call to @ref{843,,Enum} is the name of the enumeration.

The second argument is the `source' of enumeration member names.  It can be a
whitespace-separated string of names, a sequence of names, a sequence of
2-tuples with key/value pairs, or a mapping (e.g. dictionary) of names to
values.  The last two options enable assigning arbitrary values to
enumerations; the others auto-assign increasing integers starting with 1 (use
the @code{start} parameter to specify a different starting value).  A
new class derived from @ref{843,,Enum} is returned.  In other words, the above
assignment to @code{Animal} is equivalent to:

@example
>>> class Animal(Enum):
...     ANT = 1
...     BEE = 2
...     CAT = 3
...     DOG = 4
...
@end example

The reason for defaulting to @code{1} as the starting number and not @code{0} is
that @code{0} is @code{False} in a boolean sense, but by default enum members all
evaluate to @code{True}.

Pickling enums created with the functional API can be tricky as frame stack
implementation details are used to try and figure out which module the
enumeration is being created in (e.g. it will fail if you use a utility
function in a separate module, and also may not work on IronPython or Jython).
The solution is to specify the module name explicitly as follows:

@example
>>> Animal = Enum('Animal', 'ANT BEE CAT DOG', module=__name__)
@end example

@cartouche
@quotation Warning 
If @code{module} is not supplied, and Enum cannot determine what it is,
the new Enum members will not be unpicklable; to keep errors closer to
the source, pickling will be disabled.
@end quotation
@end cartouche

The new pickle protocol 4 also, in some circumstances, relies on
@ref{23b7,,__qualname__} being set to the location where pickle will be able
to find the class.  For example, if the class was made available in class
SomeData in the global scope:

@example
>>> Animal = Enum('Animal', 'ANT BEE CAT DOG', qualname='SomeData.Animal')
@end example

The complete signature is:

@example
Enum(
    value='NewEnumName',
    names=<...>,
    *,
    module='...',
    qualname='...',
    type=<mixed-in class>,
    start=1,
    )
@end example


@itemize *

@item 
`value': What the new enum class will record as its name.

@item 
`names': The enum members.  This can be a whitespace- or comma-separated string
(values will start at 1 unless otherwise specified):

@example
'RED GREEN BLUE' | 'RED,GREEN,BLUE' | 'RED, GREEN, BLUE'
@end example

or an iterator of names:

@example
['RED', 'GREEN', 'BLUE']
@end example

or an iterator of (name, value) pairs:

@example
[('CYAN', 4), ('MAGENTA', 5), ('YELLOW', 6)]
@end example

or a mapping:

@example
@{'CHARTREUSE': 7, 'SEA_GREEN': 11, 'ROSEMARY': 42@}
@end example

@item 
`module': name of module where new enum class can be found.

@item 
`qualname': where in module new enum class can be found.

@item 
`type': type to mix in to new enum class.

@item 
`start': number to start counting at if only names are passed in.
@end itemize


Changed in version 3.5: The `start' parameter was added.


@node Derived Enumerations,When to use __new__ vs __init__,Functional API<3>,Enum HOWTO
@anchor{howto/enum derived-enumerations}@anchor{5a6f}
@subsection Derived Enumerations


@menu
* IntEnum:: 
* StrEnum:: 
* IntFlag:: 
* Flag:: 
* Others: Others<2>. 

@end menu

@node IntEnum,StrEnum,,Derived Enumerations
@anchor{howto/enum intenum}@anchor{5a66}
@subsubsection IntEnum


The first variation of @ref{843,,Enum} that is provided is also a subclass of
@ref{19c,,int}.  Members of an @ref{ee1,,IntEnum} can be compared to integers;
by extension, integer enumerations of different types can also be compared
to each other:

@example
>>> from enum import IntEnum
>>> class Shape(IntEnum):
...     CIRCLE = 1
...     SQUARE = 2
...
>>> class Request(IntEnum):
...     POST = 1
...     GET = 2
...
>>> Shape == 1
False
>>> Shape.CIRCLE == 1
True
>>> Shape.CIRCLE == Request.POST
True
@end example

However, they still can’t be compared to standard @ref{843,,Enum} enumerations:

@example
>>> class Shape(IntEnum):
...     CIRCLE = 1
...     SQUARE = 2
...
>>> class Color(Enum):
...     RED = 1
...     GREEN = 2
...
>>> Shape.CIRCLE == Color.RED
False
@end example

@ref{ee1,,IntEnum} values behave like integers in other ways you’d expect:

@example
>>> int(Shape.CIRCLE)
1
>>> ['a', 'b', 'c'][Shape.CIRCLE]
'b'
>>> [i for i in range(Shape.SQUARE)]
[0, 1]
@end example

@node StrEnum,IntFlag,IntEnum,Derived Enumerations
@anchor{howto/enum strenum}@anchor{5a70}
@subsubsection StrEnum


The second variation of @ref{843,,Enum} that is provided is also a subclass of
@ref{16a,,str}.  Members of a @ref{82e,,StrEnum} can be compared to strings;
by extension, string enumerations of different types can also be compared
to each other.


Added in version 3.11.


@node IntFlag,Flag,StrEnum,Derived Enumerations
@anchor{howto/enum intflag}@anchor{5a71}
@subsubsection IntFlag


The next variation of @ref{843,,Enum} provided, @ref{ea0,,IntFlag}, is also based
on @ref{19c,,int}.  The difference being @code{IntFlag} members can be combined
using the bitwise operators (&, |, ^, ~) and the result is still an
@code{IntFlag} member, if possible.  Like @ref{ee1,,IntEnum}, @code{IntFlag}
members are also integers and can be used wherever an @code{int} is used.

@cartouche
@quotation Note 
Any operation on an @ref{ea0,,IntFlag} member besides the bit-wise operations will
lose the @code{IntFlag} membership.

Bit-wise operations that result in invalid @ref{ea0,,IntFlag} values will lose the
@code{IntFlag} membership.  See @ref{837,,FlagBoundary} for
details.
@end quotation
@end cartouche


Added in version 3.6.



Changed in version 3.11.


Sample @ref{ea0,,IntFlag} class:

@example
>>> from enum import IntFlag
>>> class Perm(IntFlag):
...     R = 4
...     W = 2
...     X = 1
...
>>> Perm.R | Perm.W
<Perm.R|W: 6>
>>> Perm.R + Perm.W
6
>>> RW = Perm.R | Perm.W
>>> Perm.R in RW
True
@end example

It is also possible to name the combinations:

@example
>>> class Perm(IntFlag):
...     R = 4
...     W = 2
...     X = 1
...     RWX = 7
...
>>> Perm.RWX
<Perm.RWX: 7>
>>> ~Perm.RWX
<Perm: 0>
>>> Perm(7)
<Perm.RWX: 7>
@end example

@cartouche
@quotation Note 
Named combinations are considered aliases.  Aliases do not show up during
iteration, but can be returned from by-value lookups.
@end quotation
@end cartouche


Changed in version 3.11.


Another important difference between @ref{ea0,,IntFlag} and @ref{843,,Enum} is that
if no flags are set (the value is 0), its boolean evaluation is @ref{d31,,False}:

@example
>>> Perm.R & Perm.X
<Perm: 0>
>>> bool(Perm.R & Perm.X)
False
@end example

Because @ref{ea0,,IntFlag} members are also subclasses of @ref{19c,,int} they can
be combined with them (but may lose @code{IntFlag} membership:

@example
>>> Perm.X | 4
<Perm.R|X: 5>

>>> Perm.X + 8
9
@end example

@cartouche
@quotation Note 
The negation operator, @code{~}, always returns an @ref{ea0,,IntFlag} member with a
positive value:

@example
>>> (~Perm.X).value == (Perm.R|Perm.W).value == 6
True
@end example
@end quotation
@end cartouche

@ref{ea0,,IntFlag} members can also be iterated over:

@example
>>> list(RW)
[<Perm.R: 4>, <Perm.W: 2>]
@end example


Added in version 3.11.


@node Flag,Others<2>,IntFlag,Derived Enumerations
@anchor{howto/enum flag}@anchor{5a72}
@subsubsection Flag


The last variation is @ref{836,,Flag}.  Like @ref{ea0,,IntFlag}, @code{Flag}
members can be combined using the bitwise operators (&, |, ^, ~).  Unlike
@code{IntFlag}, they cannot be combined with, nor compared against, any
other @code{Flag} enumeration, nor @ref{19c,,int}.  While it is possible to
specify the values directly it is recommended to use @ref{ea1,,auto} as the
value and let @code{Flag} select an appropriate value.


Added in version 3.6.


Like @ref{ea0,,IntFlag}, if a combination of @ref{836,,Flag} members results in no
flags being set, the boolean evaluation is @ref{d31,,False}:

@example
>>> from enum import Flag, auto
>>> class Color(Flag):
...     RED = auto()
...     BLUE = auto()
...     GREEN = auto()
...
>>> Color.RED & Color.GREEN
<Color: 0>
>>> bool(Color.RED & Color.GREEN)
False
@end example

Individual flags should have values that are powers of two (1, 2, 4, 8, …),
while combinations of flags will not:

@example
>>> class Color(Flag):
...     RED = auto()
...     BLUE = auto()
...     GREEN = auto()
...     WHITE = RED | BLUE | GREEN
...
>>> Color.WHITE
<Color.WHITE: 7>
@end example

Giving a name to the “no flags set” condition does not change its boolean
value:

@example
>>> class Color(Flag):
...     BLACK = 0
...     RED = auto()
...     BLUE = auto()
...     GREEN = auto()
...
>>> Color.BLACK
<Color.BLACK: 0>
>>> bool(Color.BLACK)
False
@end example

@ref{836,,Flag} members can also be iterated over:

@example
>>> purple = Color.RED | Color.BLUE
>>> list(purple)
[<Color.RED: 1>, <Color.BLUE: 2>]
@end example


Added in version 3.11.


@cartouche
@quotation Note 
For the majority of new code, @ref{843,,Enum} and @ref{836,,Flag} are strongly
recommended, since @ref{ee1,,IntEnum} and @ref{ea0,,IntFlag} break some
semantic promises of an enumeration (by being comparable to integers, and
thus by transitivity to other unrelated enumerations).  @code{IntEnum}
and @code{IntFlag} should be used only in cases where @code{Enum} and
@code{Flag} will not do; for example, when integer constants are replaced
with enumerations, or for interoperability with other systems.
@end quotation
@end cartouche

@node Others<2>,,Flag,Derived Enumerations
@anchor{howto/enum others}@anchor{5a73}
@subsubsection Others


While @ref{ee1,,IntEnum} is part of the @ref{5a,,enum} module, it would be very
simple to implement independently:

@example
class IntEnum(int, ReprEnum):   # or Enum instead of ReprEnum
    pass
@end example

This demonstrates how similar derived enumerations can be defined; for example
a @code{FloatEnum} that mixes in @ref{197,,float} instead of @ref{19c,,int}.

Some rules:


@enumerate 

@item 
When subclassing @ref{843,,Enum}, mix-in types must appear before the
@code{Enum} class itself in the sequence of bases, as in the @ref{ee1,,IntEnum}
example above.

@item 
Mix-in types must be subclassable. For example, @ref{3c1,,bool} and
@ref{b43,,range} are not subclassable and will throw an error during Enum
creation if used as the mix-in type.

@item 
While @ref{843,,Enum} can have members of any type, once you mix in an
additional type, all the members must have values of that type, e.g.
@ref{19c,,int} above.  This restriction does not apply to mix-ins which only
add methods and don’t specify another type.

@item 
When another data type is mixed in, the @ref{2aa3,,value} attribute is `not the
same' as the enum member itself, although it is equivalent and will compare
equal.

@item 
A @code{data type} is a mixin that defines @ref{7a1,,__new__()}, or a
@ref{4e2,,dataclass}

@item 
%-style formatting:  @code{%s} and @code{%r} call the @ref{843,,Enum} class’s
@ref{831,,__str__()} and @ref{830,,__repr__()} respectively; other codes (such as
@code{%i} or @code{%h} for IntEnum) treat the enum member as its mixed-in type.

@item 
@ref{19b,,Formatted string literals}, @ref{834,,str.format()},
and @ref{19a,,format()} will use the enum’s @ref{831,,__str__()} method.
@end enumerate

@cartouche
@quotation Note 
Because @ref{ee1,,IntEnum}, @ref{ea0,,IntFlag}, and @ref{82e,,StrEnum} are
designed to be drop-in replacements for existing constants, their
@ref{831,,__str__()} method has been reset to their data types’
@code{__str__()} method.
@end quotation
@end cartouche

@node When to use __new__ vs __init__,Finer Points,Derived Enumerations,Enum HOWTO
@anchor{howto/enum new-vs-init}@anchor{5a6a}@anchor{howto/enum when-to-use-new-vs-init}@anchor{5a74}
@subsection When to use @code{__new__()} vs. @code{__init__()}


@ref{7a1,,__new__()} must be used whenever you want to customize the actual value of
the @ref{843,,Enum} member.  Any other modifications may go in either
@code{__new__()} or @ref{8c1,,__init__()}, with @code{__init__()} being preferred.

For example, if you want to pass several items to the constructor, but only
want one of them to be the value:

@example
>>> class Coordinate(bytes, Enum):
...     """
...     Coordinate with binary codes that can be indexed by the int code.
...     """
...     def __new__(cls, value, label, unit):
...         obj = bytes.__new__(cls, [value])
...         obj._value_ = value
...         obj.label = label
...         obj.unit = unit
...         return obj
...     PX = (0, 'P.X', 'km')
...     PY = (1, 'P.Y', 'km')
...     VX = (2, 'V.X', 'km/s')
...     VY = (3, 'V.Y', 'km/s')
...

>>> print(Coordinate['PY'])
Coordinate.PY

>>> print(Coordinate(3))
Coordinate.VY
@end example

@cartouche
@quotation Warning 
`Do not' call @code{super().__new__()}, as the lookup-only @code{__new__} is the one
that is found; instead, use the data type directly.
@end quotation
@end cartouche

@node Finer Points,How are Enums and Flags different?,When to use __new__ vs __init__,Enum HOWTO
@anchor{howto/enum finer-points}@anchor{5a75}
@subsection Finer Points


@menu
* Supported __dunder__ and _sunder_ names:: 
* _Private__names:: 
* Enum member type:: 
* Creating members that are mixed with other data types:: 
* Boolean value of Enum classes and members:: 
* Enum classes with methods:: 
* Combining members of Flag:: 
* Flag and IntFlag minutia:: 

@end menu

@node Supported __dunder__ and _sunder_ names,_Private__names,,Finer Points
@anchor{howto/enum supported-dunder-and-sunder-names}@anchor{5a76}
@subsubsection Supported @code{__dunder__} and @code{_sunder_} names


The supported @code{__dunder__} and @code{_sunder_} names can be found in the @ref{2ac2,,Enum API documentation}.

@node _Private__names,Enum member type,Supported __dunder__ and _sunder_ names,Finer Points
@anchor{howto/enum private-names}@anchor{5a77}
@subsubsection _Private__names


@ref{20e7,,Private names} are not converted to enum members,
but remain normal attributes.


Changed in version 3.11.


@node Enum member type,Creating members that are mixed with other data types,_Private__names,Finer Points
@anchor{howto/enum enum-member-type}@anchor{5a78}
@subsubsection @code{Enum} member type


Enum members are instances of their enum class, and are normally accessed as
@code{EnumClass.member}.  In certain situations, such as writing custom enum
behavior, being able to access one member directly from another is useful,
and is supported; however, in order to avoid name clashes between member names
and attributes/methods from mixed-in classes, upper-case names are strongly
recommended.


Changed in version 3.5.


@node Creating members that are mixed with other data types,Boolean value of Enum classes and members,Enum member type,Finer Points
@anchor{howto/enum creating-members-that-are-mixed-with-other-data-types}@anchor{5a79}
@subsubsection Creating members that are mixed with other data types


When subclassing other data types, such as @ref{19c,,int} or @ref{16a,,str}, with
an @ref{843,,Enum}, all values after the @code{=} are passed to that data type’s
constructor.  For example:

@example
>>> class MyEnum(IntEnum):      # help(int) -> int(x, base=10) -> integer
...     example = '11', 16      # so x='11' and base=16
...
>>> MyEnum.example.value        # and hex(11) is...
17
@end example

@node Boolean value of Enum classes and members,Enum classes with methods,Creating members that are mixed with other data types,Finer Points
@anchor{howto/enum boolean-value-of-enum-classes-and-members}@anchor{5a7a}
@subsubsection Boolean value of @code{Enum} classes and members


Enum classes that are mixed with non-@ref{843,,Enum} types (such as
@ref{19c,,int}, @ref{16a,,str}, etc.) are evaluated according to the mixed-in
type’s rules; otherwise, all members evaluate as @ref{e0d,,True}.  To make your
own enum’s boolean evaluation depend on the member’s value add the following to
your class:

@example
def __bool__(self):
    return bool(self.value)
@end example

Plain @ref{843,,Enum} classes always evaluate as @ref{e0d,,True}.

@node Enum classes with methods,Combining members of Flag,Boolean value of Enum classes and members,Finer Points
@anchor{howto/enum enum-classes-with-methods}@anchor{5a7b}
@subsubsection @code{Enum} classes with methods


If you give your enum subclass extra methods, like the @ref{5a69,,Planet}
class below, those methods will show up in a @ref{845,,dir()} of the member,
but not of the class:

@example
>>> dir(Planet)
['EARTH', 'JUPITER', 'MARS', 'MERCURY', 'NEPTUNE', 'SATURN', 'URANUS', 'VENUS', '__class__', '__doc__', '__members__', '__module__']
>>> dir(Planet.EARTH)
['__class__', '__doc__', '__module__', 'mass', 'name', 'radius', 'surface_gravity', 'value']
@end example

@node Combining members of Flag,Flag and IntFlag minutia,Enum classes with methods,Finer Points
@anchor{howto/enum combining-members-of-flag}@anchor{5a7c}
@subsubsection Combining members of @code{Flag}


Iterating over a combination of @ref{836,,Flag} members will only return the members that
are comprised of a single bit:

@example
>>> class Color(Flag):
...     RED = auto()
...     GREEN = auto()
...     BLUE = auto()
...     MAGENTA = RED | BLUE
...     YELLOW = RED | GREEN
...     CYAN = GREEN | BLUE
...
>>> Color(3)  # named combination
<Color.YELLOW: 3>
>>> Color(7)      # not named combination
<Color.RED|GREEN|BLUE: 7>
@end example

@node Flag and IntFlag minutia,,Combining members of Flag,Finer Points
@anchor{howto/enum flag-and-intflag-minutia}@anchor{5a7d}
@subsubsection @code{Flag} and @code{IntFlag} minutia


Using the following snippet for our examples:

@example
>>> class Color(IntFlag):
...     BLACK = 0
...     RED = 1
...     GREEN = 2
...     BLUE = 4
...     PURPLE = RED | BLUE
...     WHITE = RED | GREEN | BLUE
...
@end example

the following are true:


@itemize -

@item 
single-bit flags are canonical

@item 
multi-bit and zero-bit flags are aliases

@item 
only canonical flags are returned during iteration:

@example
>>> list(Color.WHITE)
[<Color.RED: 1>, <Color.GREEN: 2>, <Color.BLUE: 4>]
@end example

@item 
negating a flag or flag set returns a new flag/flag set with the
corresponding positive integer value:

@example
>>> Color.BLUE
<Color.BLUE: 4>

>>> ~Color.BLUE
<Color.RED|GREEN: 3>
@end example

@item 
names of pseudo-flags are constructed from their members’ names:

@example
>>> (Color.RED | Color.GREEN).name
'RED|GREEN'

>>> class Perm(IntFlag):
...     R = 4
...     W = 2
...     X = 1
...
>>> (Perm.R & Perm.W).name is None  # effectively Perm(0)
True
@end example

@item 
multi-bit flags, aka aliases, can be returned from operations:

@example
>>> Color.RED | Color.BLUE
<Color.PURPLE: 5>

>>> Color(7)  # or Color(-1)
<Color.WHITE: 7>

>>> Color(0)
<Color.BLACK: 0>
@end example

@item 
membership / containment checking: zero-valued flags are always considered
to be contained:

@example
>>> Color.BLACK in Color.WHITE
True
@end example

otherwise, only if all bits of one flag are in the other flag will True
be returned:

@example
>>> Color.PURPLE in Color.WHITE
True

>>> Color.GREEN in Color.PURPLE
False
@end example
@end itemize

There is a new boundary mechanism that controls how out-of-range / invalid
bits are handled: @code{STRICT}, @code{CONFORM}, @code{EJECT}, and @code{KEEP}:


@itemize *

@item 
STRICT –> raises an exception when presented with invalid values

@item 
CONFORM –> discards any invalid bits

@item 
EJECT –> lose Flag status and become a normal int with the given value

@item 
KEEP –> keep the extra bits


@itemize -

@item 
keeps Flag status and extra bits

@item 
extra bits do not show up in iteration

@item 
extra bits do show up in repr() and str()
@end itemize
@end itemize

The default for Flag is @code{STRICT}, the default for @code{IntFlag} is @code{EJECT},
and the default for @code{_convert_} is @code{KEEP} (see @code{ssl.Options} for an
example of when @code{KEEP} is needed).

@node How are Enums and Flags different?,Enum Cookbook,Finer Points,Enum HOWTO
@anchor{howto/enum enum-class-differences}@anchor{2a93}@anchor{howto/enum how-are-enums-and-flags-different}@anchor{5a7e}
@subsection How are Enums and Flags different?


Enums have a custom metaclass that affects many aspects of both derived @ref{843,,Enum}
classes and their instances (members).

@menu
* Enum Classes:: 
* Flag Classes:: 
* Enum Members (aka instances): Enum Members aka instances. 
* Flag Members:: 

@end menu

@node Enum Classes,Flag Classes,,How are Enums and Flags different?
@anchor{howto/enum enum-classes}@anchor{5a7f}
@subsubsection Enum Classes


The @ref{4f8,,EnumType} metaclass is responsible for providing the
@ref{15c5,,__contains__()}, @ref{17b9,,__dir__()}, @ref{e6f,,__iter__()} and other methods that
allow one to do things with an @ref{843,,Enum} class that fail on a typical
class, such as @code{list(Color)} or @code{some_enum_var in Color}.  @code{EnumType} is
responsible for ensuring that various other methods on the final @code{Enum}
class are correct (such as @ref{7a1,,__new__()}, @ref{fda,,__getnewargs__()},
@ref{831,,__str__()} and @ref{830,,__repr__()}).

@node Flag Classes,Enum Members aka instances,Enum Classes,How are Enums and Flags different?
@anchor{howto/enum flag-classes}@anchor{5a80}
@subsubsection Flag Classes


Flags have an expanded view of aliasing: to be canonical, the value of a flag
needs to be a power-of-two value, and not a duplicate name.  So, in addition to the
@ref{843,,Enum} definition of alias, a flag with no value (a.k.a. @code{0}) or with more than one
power-of-two value (e.g. @code{3}) is considered an alias.

@node Enum Members aka instances,Flag Members,Flag Classes,How are Enums and Flags different?
@anchor{howto/enum enum-members-aka-instances}@anchor{5a81}
@subsubsection Enum Members (aka instances)


The most interesting thing about enum members is that they are singletons.
@ref{4f8,,EnumType} creates them all while it is creating the enum class itself,
and then puts a custom @ref{7a1,,__new__()} in place to ensure that no new ones are
ever instantiated by returning only the existing member instances.

@node Flag Members,,Enum Members aka instances,How are Enums and Flags different?
@anchor{howto/enum flag-members}@anchor{5a82}
@subsubsection Flag Members


Flag members can be iterated over just like the @ref{836,,Flag} class, and only the
canonical members will be returned.  For example:

@example
>>> list(Color)
[<Color.RED: 1>, <Color.GREEN: 2>, <Color.BLUE: 4>]
@end example

(Note that @code{BLACK}, @code{PURPLE}, and @code{WHITE} do not show up.)

Inverting a flag member returns the corresponding positive value,
rather than a negative value — for example:

@example
>>> ~Color.RED
<Color.GREEN|BLUE: 6>
@end example

Flag members have a length corresponding to the number of power-of-two values
they contain.  For example:

@example
>>> len(Color.PURPLE)
2
@end example

@node Enum Cookbook,Subclassing EnumType,How are Enums and Flags different?,Enum HOWTO
@anchor{howto/enum enum-cookbook}@anchor{2a92}@anchor{howto/enum id2}@anchor{5a83}
@subsection Enum Cookbook


While @ref{843,,Enum}, @ref{ee1,,IntEnum}, @ref{82e,,StrEnum}, @ref{836,,Flag}, and
@ref{ea0,,IntFlag} are expected to cover the majority of use-cases, they cannot
cover them all.  Here are recipes for some different types of enumerations
that can be used directly, or as examples for creating one’s own.

@menu
* Omitting values:: 
* OrderedEnum:: 
* DuplicateFreeEnum:: 
* MultiValueEnum:: 
* Planet:: 
* TimePeriod:: 

@end menu

@node Omitting values,OrderedEnum,,Enum Cookbook
@anchor{howto/enum omitting-values}@anchor{5a84}
@subsubsection Omitting values


In many use-cases, one doesn’t care what the actual value of an enumeration
is. There are several ways to define this type of simple enumeration:


@itemize -

@item 
use instances of @ref{ea1,,auto} for the value

@item 
use instances of @ref{c84,,object} as the value

@item 
use a descriptive string as the value

@item 
use a tuple as the value and a custom @ref{7a1,,__new__()} to replace the
tuple with an @ref{19c,,int} value
@end itemize

Using any of these methods signifies to the user that these values are not
important, and also enables one to add, remove, or reorder members without
having to renumber the remaining members.

@menu
* Using auto:: 
* Using object:: 
* Using a descriptive string:: 
* Using a custom __new__(): Using a custom __new__. 

@end menu

@node Using auto,Using object,,Omitting values
@anchor{howto/enum using-auto}@anchor{5a85}
@subsubsection Using @code{auto}


Using @ref{ea1,,auto} would look like:

@example
>>> class Color(Enum):
...     RED = auto()
...     BLUE = auto()
...     GREEN = auto()
...
>>> Color.GREEN
<Color.GREEN: 3>
@end example

@node Using object,Using a descriptive string,Using auto,Omitting values
@anchor{howto/enum using-object}@anchor{5a86}
@subsubsection Using @code{object}


Using @ref{c84,,object} would look like:

@example
>>> class Color(Enum):
...     RED = object()
...     GREEN = object()
...     BLUE = object()
...
>>> Color.GREEN
<Color.GREEN: <object object at 0x...>>
@end example

This is also a good example of why you might want to write your own
@ref{830,,__repr__()}:

@example
>>> class Color(Enum):
...     RED = object()
...     GREEN = object()
...     BLUE = object()
...     def __repr__(self):
...         return "<%s.%s>" % (self.__class__.__name__, self._name_)
...
>>> Color.GREEN
<Color.GREEN>
@end example

@node Using a descriptive string,Using a custom __new__,Using object,Omitting values
@anchor{howto/enum using-a-descriptive-string}@anchor{5a87}
@subsubsection Using a descriptive string


Using a string as the value would look like:

@example
>>> class Color(Enum):
...     RED = 'stop'
...     GREEN = 'go'
...     BLUE = 'too fast!'
...
>>> Color.GREEN
<Color.GREEN: 'go'>
@end example

@node Using a custom __new__,,Using a descriptive string,Omitting values
@anchor{howto/enum using-a-custom-new}@anchor{5a88}
@subsubsection Using a custom @code{__new__()}


Using an auto-numbering @ref{7a1,,__new__()} would look like:

@example
>>> class AutoNumber(Enum):
...     def __new__(cls):
...         value = len(cls.__members__) + 1
...         obj = object.__new__(cls)
...         obj._value_ = value
...         return obj
...
>>> class Color(AutoNumber):
...     RED = ()
...     GREEN = ()
...     BLUE = ()
...
>>> Color.GREEN
<Color.GREEN: 2>
@end example

To make a more general purpose @code{AutoNumber}, add @code{*args} to the signature:

@example
>>> class AutoNumber(Enum):
...     def __new__(cls, *args):      # this is the only change from above
...         value = len(cls.__members__) + 1
...         obj = object.__new__(cls)
...         obj._value_ = value
...         return obj
...
@end example

Then when you inherit from @code{AutoNumber} you can write your own @code{__init__}
to handle any extra arguments:

@example
>>> class Swatch(AutoNumber):
...     def __init__(self, pantone='unknown'):
...         self.pantone = pantone
...     AUBURN = '3497'
...     SEA_GREEN = '1246'
...     BLEACHED_CORAL = () # New color, no Pantone code yet!
...
>>> Swatch.SEA_GREEN
<Swatch.SEA_GREEN: 2>
>>> Swatch.SEA_GREEN.pantone
'1246'
>>> Swatch.BLEACHED_CORAL.pantone
'unknown'
@end example

@cartouche
@quotation Note 
The @ref{7a1,,__new__()} method, if defined, is used during creation of the Enum
members; it is then replaced by Enum’s @code{__new__()} which is used after
class creation for lookup of existing members.
@end quotation
@end cartouche

@cartouche
@quotation Warning 
`Do not' call @code{super().__new__()}, as the lookup-only @code{__new__} is the one
that is found; instead, use the data type directly – e.g.:

@example
obj = int.__new__(cls, value)
@end example
@end quotation
@end cartouche

@node OrderedEnum,DuplicateFreeEnum,Omitting values,Enum Cookbook
@anchor{howto/enum orderedenum}@anchor{5a6c}
@subsubsection OrderedEnum


An ordered enumeration that is not based on @ref{ee1,,IntEnum} and so maintains
the normal @ref{843,,Enum} invariants (such as not being comparable to other
enumerations):

@example
>>> class OrderedEnum(Enum):
...     def __ge__(self, other):
...         if self.__class__ is other.__class__:
...             return self.value >= other.value
...         return NotImplemented
...     def __gt__(self, other):
...         if self.__class__ is other.__class__:
...             return self.value > other.value
...         return NotImplemented
...     def __le__(self, other):
...         if self.__class__ is other.__class__:
...             return self.value <= other.value
...         return NotImplemented
...     def __lt__(self, other):
...         if self.__class__ is other.__class__:
...             return self.value < other.value
...         return NotImplemented
...
>>> class Grade(OrderedEnum):
...     A = 5
...     B = 4
...     C = 3
...     D = 2
...     F = 1
...
>>> Grade.C < Grade.A
True
@end example

@node DuplicateFreeEnum,MultiValueEnum,OrderedEnum,Enum Cookbook
@anchor{howto/enum duplicatefreeenum}@anchor{5a89}
@subsubsection DuplicateFreeEnum


Raises an error if a duplicate member value is found instead of creating an
alias:

@example
>>> class DuplicateFreeEnum(Enum):
...     def __init__(self, *args):
...         cls = self.__class__
...         if any(self.value == e.value for e in cls):
...             a = self.name
...             e = cls(self.value).name
...             raise ValueError(
...                 "aliases not allowed in DuplicateFreeEnum:  %r --> %r"
...                 % (a, e))
...
>>> class Color(DuplicateFreeEnum):
...     RED = 1
...     GREEN = 2
...     BLUE = 3
...     GRENE = 2
...
Traceback (most recent call last):
  ...
ValueError: aliases not allowed in DuplicateFreeEnum:  'GRENE' --> 'GREEN'
@end example

@cartouche
@quotation Note 
This is a useful example for subclassing Enum to add or change other
behaviors as well as disallowing aliases.  If the only desired change is
disallowing aliases, the @ref{2a96,,unique()} decorator can be used instead.
@end quotation
@end cartouche

@node MultiValueEnum,Planet,DuplicateFreeEnum,Enum Cookbook
@anchor{howto/enum multi-value-enum}@anchor{2ab0}@anchor{howto/enum multivalueenum}@anchor{5a8a}
@subsubsection MultiValueEnum


Supports having more than one value per member:

@example
>>> class MultiValueEnum(Enum):
...     def __new__(cls, value, *values):
...         self = object.__new__(cls)
...         self._value_ = value
...         for v in values:
...             self._add_value_alias_(v)
...         return self
...
>>> class DType(MultiValueEnum):
...     float32 = 'f', 8
...     double64 = 'd', 9
...
>>> DType('f')
<DType.float32: 'f'>
>>> DType(9)
<DType.double64: 'd'>
@end example

@node Planet,TimePeriod,MultiValueEnum,Enum Cookbook
@anchor{howto/enum planet}@anchor{5a69}
@subsubsection Planet


If @ref{7a1,,__new__()} or @ref{8c1,,__init__()} is defined, the value of the enum member
will be passed to those methods:

@example
>>> class Planet(Enum):
...     MERCURY = (3.303e+23, 2.4397e6)
...     VENUS   = (4.869e+24, 6.0518e6)
...     EARTH   = (5.976e+24, 6.37814e6)
...     MARS    = (6.421e+23, 3.3972e6)
...     JUPITER = (1.9e+27,   7.1492e7)
...     SATURN  = (5.688e+26, 6.0268e7)
...     URANUS  = (8.686e+25, 2.5559e7)
...     NEPTUNE = (1.024e+26, 2.4746e7)
...     def __init__(self, mass, radius):
...         self.mass = mass       # in kilograms
...         self.radius = radius   # in meters
...     @@property
...     def surface_gravity(self):
...         # universal gravitational constant  (m3 kg-1 s-2)
...         G = 6.67300E-11
...         return G * self.mass / (self.radius * self.radius)
...
>>> Planet.EARTH.value
(5.976e+24, 6378140.0)
>>> Planet.EARTH.surface_gravity
9.802652743337129
@end example

@node TimePeriod,,Planet,Enum Cookbook
@anchor{howto/enum enum-time-period}@anchor{2aa9}@anchor{howto/enum timeperiod}@anchor{5a8b}
@subsubsection TimePeriod


An example to show the @ref{2aa8,,_ignore_} attribute in use:

@example
>>> import datetime as dt
>>> class Period(dt.timedelta, Enum):
...     "different lengths of time"
...     _ignore_ = 'Period i'
...     Period = vars()
...     for i in range(367):
...         Period['day_%d' % i] = i
...
>>> list(Period)[:2]
[<Period.day_0: datetime.timedelta(0)>, <Period.day_1: datetime.timedelta(days=1)>]
>>> list(Period)[-2:]
[<Period.day_365: datetime.timedelta(days=365)>, <Period.day_366: datetime.timedelta(days=366)>]
@end example

@node Subclassing EnumType,,Enum Cookbook,Enum HOWTO
@anchor{howto/enum enumtype-examples}@anchor{2a99}@anchor{howto/enum subclassing-enumtype}@anchor{5a8c}
@subsection Subclassing EnumType


While most enum needs can be met by customizing @ref{843,,Enum} subclasses,
either with class decorators or custom functions, @ref{4f8,,EnumType} can be
subclassed to provide a different Enum experience.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Functional Programming HOWTO,Logging HOWTO,Enum HOWTO,Python HOWTOs
@anchor{howto/functional doc}@anchor{5a8d}@anchor{howto/functional functional-howto}@anchor{5a8e}@anchor{howto/functional functional-programming-howto}@anchor{5a8f}@anchor{howto/functional translation-repo}@anchor{5a90}
@section Functional Programming HOWTO


@*Author: 
A. M. Kuchling


@*Release: 
0.32


In this document, we’ll take a tour of Python’s features suitable for
implementing programs in a functional style.  After an introduction to the
concepts of functional programming, we’ll look at language features such as
@ref{4c9,,iterator}s and @ref{1267,,generator}s and relevant library modules such as
@ref{85,,itertools} and @ref{63,,functools}.

@menu
* Introduction: Introduction<15>. 
* Iterators: Iterators<2>. 
* Generator expressions and list comprehensions:: 
* Generators: Generators<2>. 
* Built-in functions: Built-in functions<2>. 
* The itertools module:: 
* The functools module:: 
* Small functions and the lambda expression:: 
* Revision History and Acknowledgements:: 
* References: References<2>. 

@end menu

@node Introduction<15>,Iterators<2>,,Functional Programming HOWTO
@anchor{howto/functional introduction}@anchor{5a91}
@subsection Introduction


This section explains the basic concept of functional programming; if
you’re just interested in learning about Python language features,
skip to the next section on @ref{5a92,,Iterators}.

Programming languages support decomposing problems in several different ways:


@itemize *

@item 
Most programming languages are `procedural': programs are lists of
instructions that tell the computer what to do with the program’s input.  C,
Pascal, and even Unix shells are procedural languages.

@item 
In `declarative' languages, you write a specification that describes the
problem to be solved, and the language implementation figures out how to
perform the computation efficiently.  SQL is the declarative language you’re
most likely to be familiar with; a SQL query describes the data set you want
to retrieve, and the SQL engine decides whether to scan tables or use indexes,
which subclauses should be performed first, etc.

@item 
`Object-oriented' programs manipulate collections of objects.  Objects have
internal state and support methods that query or modify this internal state in
some way. Smalltalk and Java are object-oriented languages.  C++ and Python
are languages that support object-oriented programming, but don’t force the
use of object-oriented features.

@item 
`Functional' programming decomposes a problem into a set of functions.
Ideally, functions only take inputs and produce outputs, and don’t have any
internal state that affects the output produced for a given input.  Well-known
functional languages include the ML family (Standard ML, OCaml, and other
variants) and Haskell.
@end itemize

The designers of some computer languages choose to emphasize one
particular approach to programming.  This often makes it difficult to
write programs that use a different approach.  Other languages are
multi-paradigm languages that support several different approaches.
Lisp, C++, and Python are multi-paradigm; you can write programs or
libraries that are largely procedural, object-oriented, or functional
in all of these languages.  In a large program, different sections
might be written using different approaches; the GUI might be
object-oriented while the processing logic is procedural or
functional, for example.

In a functional program, input flows through a set of functions. Each function
operates on its input and produces some output.  Functional style discourages
functions with side effects that modify internal state or make other changes
that aren’t visible in the function’s return value.  Functions that have no side
effects at all are called `purely functional'.  Avoiding side effects means
not using data structures that get updated as a program runs; every function’s
output must only depend on its input.

Some languages are very strict about purity and don’t even have assignment
statements such as @code{a=3} or @code{c = a + b}, but it’s difficult to avoid all
side effects, such as printing to the screen or writing to a disk file. Another
example is a call to the @ref{117b,,print()} or @ref{8ae,,time.sleep()} function, neither
of which returns a useful value. Both are called only for their side effects
of sending some text to the screen or pausing execution for a second.

Python programs written in functional style usually won’t go to the extreme of
avoiding all I/O or all assignments; instead, they’ll provide a
functional-appearing interface but will use non-functional features internally.
For example, the implementation of a function will still use assignments to
local variables, but won’t modify global variables or have other side effects.

Functional programming can be considered the opposite of object-oriented
programming.  Objects are little capsules containing some internal state along
with a collection of method calls that let you modify this state, and programs
consist of making the right set of state changes.  Functional programming wants
to avoid state changes as much as possible and works with data flowing between
functions.  In Python you might combine the two approaches by writing functions
that take and return instances representing objects in your application (e-mail
messages, transactions, etc.).

Functional design may seem like an odd constraint to work under.  Why should you
avoid objects and side effects?  There are theoretical and practical advantages
to the functional style:


@itemize *

@item 
Formal provability.

@item 
Modularity.

@item 
Composability.

@item 
Ease of debugging and testing.
@end itemize

@menu
* Formal provability:: 
* Modularity:: 
* Ease of debugging and testing:: 
* Composability:: 

@end menu

@node Formal provability,Modularity,,Introduction<15>
@anchor{howto/functional formal-provability}@anchor{5a93}
@subsubsection Formal provability


A theoretical benefit is that it’s easier to construct a mathematical proof that
a functional program is correct.

For a long time researchers have been interested in finding ways to
mathematically prove programs correct.  This is different from testing a program
on numerous inputs and concluding that its output is usually correct, or reading
a program’s source code and concluding that the code looks right; the goal is
instead a rigorous proof that a program produces the right result for all
possible inputs.

The technique used to prove programs correct is to write down `invariants',
properties of the input data and of the program’s variables that are always
true.  For each line of code, you then show that if invariants X and Y are true
`before' the line is executed, the slightly different invariants X’ and Y’ are
true `after' the line is executed.  This continues until you reach the end of
the program, at which point the invariants should match the desired conditions
on the program’s output.

Functional programming’s avoidance of assignments arose because assignments are
difficult to handle with this technique; assignments can break invariants that
were true before the assignment without producing any new invariants that can be
propagated onward.

Unfortunately, proving programs correct is largely impractical and not relevant
to Python software. Even trivial programs require proofs that are several pages
long; the proof of correctness for a moderately complicated program would be
enormous, and few or none of the programs you use daily (the Python interpreter,
your XML parser, your web browser) could be proven correct.  Even if you wrote
down or generated a proof, there would then be the question of verifying the
proof; maybe there’s an error in it, and you wrongly believe you’ve proved the
program correct.

@node Modularity,Ease of debugging and testing,Formal provability,Introduction<15>
@anchor{howto/functional modularity}@anchor{5a94}
@subsubsection Modularity


A more practical benefit of functional programming is that it forces you to
break apart your problem into small pieces.  Programs are more modular as a
result.  It’s easier to specify and write a small function that does one thing
than a large function that performs a complicated transformation.  Small
functions are also easier to read and to check for errors.

@node Ease of debugging and testing,Composability,Modularity,Introduction<15>
@anchor{howto/functional ease-of-debugging-and-testing}@anchor{5a95}
@subsubsection Ease of debugging and testing


Testing and debugging a functional-style program is easier.

Debugging is simplified because functions are generally small and clearly
specified.  When a program doesn’t work, each function is an interface point
where you can check that the data are correct.  You can look at the intermediate
inputs and outputs to quickly isolate the function that’s responsible for a bug.

Testing is easier because each function is a potential subject for a unit test.
Functions don’t depend on system state that needs to be replicated before
running a test; instead you only have to synthesize the right input and then
check that the output matches expectations.

@node Composability,,Ease of debugging and testing,Introduction<15>
@anchor{howto/functional composability}@anchor{5a96}
@subsubsection Composability


As you work on a functional-style program, you’ll write a number of functions
with varying inputs and outputs.  Some of these functions will be unavoidably
specialized to a particular application, but others will be useful in a wide
variety of programs.  For example, a function that takes a directory path and
returns all the XML files in the directory, or a function that takes a filename
and returns its contents, can be applied to many different situations.

Over time you’ll form a personal library of utilities.  Often you’ll assemble
new programs by arranging existing functions in a new configuration and writing
a few functions specialized for the current task.

@node Iterators<2>,Generator expressions and list comprehensions,Introduction<15>,Functional Programming HOWTO
@anchor{howto/functional functional-howto-iterators}@anchor{5a92}@anchor{howto/functional iterators}@anchor{5a97}
@subsection Iterators


I’ll start by looking at a Python language feature that’s an important
foundation for writing functional-style programs: iterators.

An iterator is an object representing a stream of data; this object returns the
data one element at a time.  A Python iterator must support a method called
@ref{14d9,,__next__()} that takes no arguments and always returns the next
element of the stream.  If there are no more elements in the stream,
@code{__next__()} must raise the @ref{dfb,,StopIteration} exception.
Iterators don’t have to be finite, though; it’s perfectly reasonable to write
an iterator that produces an infinite stream of data.

The built-in @ref{9dd,,iter()} function takes an arbitrary object and tries to return
an iterator that will return the object’s contents or elements, raising
@ref{199,,TypeError} if the object doesn’t support iteration.  Several of Python’s
built-in data types support iteration, the most common being lists and
dictionaries.  An object is called @ref{1433,,iterable} if you can get an iterator
for it.

You can experiment with the iteration interface manually:

@example
>>> L = [1, 2, 3]
>>> it = iter(L)
>>> it
<...iterator object at ...>
>>> it.__next__()  # same as next(it)
1
>>> next(it)
2
>>> next(it)
3
>>> next(it)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>>
@end example

Python expects iterable objects in several different contexts, the most
important being the @ref{348,,for} statement.  In the statement @code{for X in Y},
Y must be an iterator or some object for which @ref{9dd,,iter()} can create an
iterator.  These two statements are equivalent:

@example
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
@end example

Iterators can be materialized as lists or tuples by using the @ref{24f,,list()} or
@ref{614,,tuple()} constructor functions:

@example
>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
@end example

Sequence unpacking also supports iterators: if you know an iterator will return
N elements, you can unpack them into an N-tuple:

@example
>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> a, b, c = iterator
>>> a, b, c
(1, 2, 3)
@end example

Built-in functions such as @ref{1112,,max()} and @ref{1111,,min()} can take a single
iterator argument and will return the largest or smallest element.  The @code{"in"}
and @code{"not in"} operators also support iterators: @code{X in iterator} is true if
X is found in the stream returned by the iterator.  You’ll run into obvious
problems if the iterator is infinite; @code{max()}, @code{min()}
will never return, and if the element X never appears in the stream, the
@code{"in"} and @code{"not in"} operators won’t return either.

Note that you can only go forward in an iterator; there’s no way to get the
previous element, reset the iterator, or make a copy of it.  Iterator objects
can optionally provide these additional capabilities, but the iterator protocol
only specifies the @ref{14d9,,__next__()} method.  Functions may therefore
consume all of the iterator’s output, and if you need to do something different
with the same stream, you’ll have to create a new iterator.

@menu
* Data Types That Support Iterators:: 

@end menu

@node Data Types That Support Iterators,,,Iterators<2>
@anchor{howto/functional data-types-that-support-iterators}@anchor{5a98}
@subsubsection Data Types That Support Iterators


We’ve already seen how lists and tuples support iterators.  In fact, any Python
sequence type, such as strings, will automatically support creation of an
iterator.

Calling @ref{9dd,,iter()} on a dictionary returns an iterator that will loop over the
dictionary’s keys:

@example
>>> m = @{'Jan': 1, 'Feb': 2, 'Mar': 3, 'Apr': 4, 'May': 5, 'Jun': 6,
...      'Jul': 7, 'Aug': 8, 'Sep': 9, 'Oct': 10, 'Nov': 11, 'Dec': 12@}
>>> for key in m:
...     print(key, m[key])
Jan 1
Feb 2
Mar 3
Apr 4
May 5
Jun 6
Jul 7
Aug 8
Sep 9
Oct 10
Nov 11
Dec 12
@end example

Note that starting with Python 3.7, dictionary iteration order is guaranteed
to be the same as the insertion order. In earlier versions, the behaviour was
unspecified and could vary between implementations.

Applying @ref{9dd,,iter()} to a dictionary always loops over the keys, but
dictionaries have methods that return other iterators.  If you want to iterate
over values or key/value pairs, you can explicitly call the
@ref{9d7,,values()} or @ref{9d8,,items()} methods to get an appropriate
iterator.

The @ref{184,,dict()} constructor can accept an iterator that returns a finite stream
of @code{(key, value)} tuples:

@example
>>> L = [('Italy', 'Rome'), ('France', 'Paris'), ('US', 'Washington DC')]
>>> dict(iter(L))
@{'Italy': 'Rome', 'France': 'Paris', 'US': 'Washington DC'@}
@end example

Files also support iteration by calling the @ref{20ea,,readline()}
method until there are no more lines in the file.  This means you can read each
line of a file like this:

@example
for line in file:
    # do something for each line
    ...
@end example

Sets can take their contents from an iterable and let you iterate over the set’s
elements:

@example
>>> S = @{2, 3, 5, 7, 11, 13@}
>>> for i in S:
...     print(i)
2
3
5
7
11
13
@end example

@node Generator expressions and list comprehensions,Generators<2>,Iterators<2>,Functional Programming HOWTO
@anchor{howto/functional generator-expressions-and-list-comprehensions}@anchor{5a99}
@subsection Generator expressions and list comprehensions


Two common operations on an iterator’s output are 1) performing some operation
for every element, 2) selecting a subset of elements that meet some condition.
For example, given a list of strings, you might want to strip off trailing
whitespace from each line or extract all the strings containing a given
substring.

List comprehensions and generator expressions (short form: “listcomps” and
“genexps”) are a concise notation for such operations, borrowed from the
functional programming language Haskell (@indicateurl{https://www.haskell.org/}).  You can strip
all the whitespace from a stream of strings with the following code:

@example
>>> line_list = ['  line 1\n', 'line 2  \n', ' \n', '@w{'}]

>>> # Generator expression -- returns iterator
>>> stripped_iter = (line.strip() for line in line_list)

>>> # List comprehension -- returns list
>>> stripped_list = [line.strip() for line in line_list]
@end example

You can select only certain elements by adding an @code{"if"} condition:

@example
>>> stripped_list = [line.strip() for line in line_list
...                  if line != ""]
@end example

With a list comprehension, you get back a Python list; @code{stripped_list} is a
list containing the resulting lines, not an iterator.  Generator expressions
return an iterator that computes the values as necessary, not needing to
materialize all the values at once.  This means that list comprehensions aren’t
useful if you’re working with iterators that return an infinite stream or a very
large amount of data.  Generator expressions are preferable in these situations.

Generator expressions are surrounded by parentheses (“()”) and list
comprehensions are surrounded by square brackets (“[]”).  Generator expressions
have the form:

@example
( expression for expr in sequence1
             if condition1
             for expr2 in sequence2
             if condition2
             for expr3 in sequence3
             ...
             if condition3
             for exprN in sequenceN
             if conditionN )
@end example

Again, for a list comprehension only the outside brackets are different (square
brackets instead of parentheses).

The elements of the generated output will be the successive values of
@code{expression}.  The @code{if} clauses are all optional; if present, @code{expression}
is only evaluated and added to the result when @code{condition} is true.

Generator expressions always have to be written inside parentheses, but the
parentheses signalling a function call also count.  If you want to create an
iterator that will be immediately passed to a function you can write:

@example
obj_total = sum(obj.count for obj in list_all_objects())
@end example

The @code{for...in} clauses contain the sequences to be iterated over.  The
sequences do not have to be the same length, because they are iterated over from
left to right, `not' in parallel.  For each element in @code{sequence1},
@code{sequence2} is looped over from the beginning.  @code{sequence3} is then looped
over for each resulting pair of elements from @code{sequence1} and @code{sequence2}.

To put it another way, a list comprehension or generator expression is
equivalent to the following Python code:

@example
for expr1 in sequence1:
    if not (condition1):
        continue   # Skip this element
    for expr2 in sequence2:
        if not (condition2):
            continue   # Skip this element
        ...
        for exprN in sequenceN:
            if not (conditionN):
                continue   # Skip this element

            # Output the value of
            # the expression.
@end example

This means that when there are multiple @code{for...in} clauses but no @code{if}
clauses, the length of the resulting output will be equal to the product of the
lengths of all the sequences.  If you have two lists of length 3, the output
list is 9 elements long:

@example
>>> seq1 = 'abc'
>>> seq2 = (1, 2, 3)
>>> [(x, y) for x in seq1 for y in seq2]
[('a', 1), ('a', 2), ('a', 3),
 ('b', 1), ('b', 2), ('b', 3),
 ('c', 1), ('c', 2), ('c', 3)]
@end example

To avoid introducing an ambiguity into Python’s grammar, if @code{expression} is
creating a tuple, it must be surrounded with parentheses.  The first list
comprehension below is a syntax error, while the second one is correct:

@example
# Syntax error
[x, y for x in seq1 for y in seq2]
# Correct
[(x, y) for x in seq1 for y in seq2]
@end example

@node Generators<2>,Built-in functions<2>,Generator expressions and list comprehensions,Functional Programming HOWTO
@anchor{howto/functional generators}@anchor{5a9a}
@subsection Generators


Generators are a special class of functions that simplify the task of writing
iterators.  Regular functions compute a value and return it, but generators
return an iterator that returns a stream of values.

You’re doubtless familiar with how regular function calls work in Python or C.
When you call a function, it gets a private namespace where its local variables
are created.  When the function reaches a @code{return} statement, the local
variables are destroyed and the value is returned to the caller.  A later call
to the same function creates a new private namespace and a fresh set of local
variables. But, what if the local variables weren’t thrown away on exiting a
function?  What if you could later resume the function where it left off?  This
is what generators provide; they can be thought of as resumable functions.

Here’s the simplest example of a generator function:

@example
>>> def generate_ints(N):
...    for i in range(N):
...        yield i
@end example

Any function containing a @ref{bc8,,yield} keyword is a generator function;
this is detected by Python’s @ref{4ab,,bytecode} compiler which compiles the
function specially as a result.

When you call a generator function, it doesn’t return a single value; instead it
returns a generator object that supports the iterator protocol.  On executing
the @code{yield} expression, the generator outputs the value of @code{i}, similar to a
@code{return} statement.  The big difference between @code{yield} and a @code{return}
statement is that on reaching a @code{yield} the generator’s state of execution is
suspended and local variables are preserved.  On the next call to the
generator’s @ref{20f2,,__next__()} method, the function will resume
executing.

Here’s a sample usage of the @code{generate_ints()} generator:

@example
>>> gen = generate_ints(3)
>>> gen
<generator object generate_ints at ...>
>>> next(gen)
0
>>> next(gen)
1
>>> next(gen)
2
>>> next(gen)
Traceback (most recent call last):
  File "stdin", line 1, in <module>
  File "stdin", line 2, in generate_ints
StopIteration
@end example

You could equally write @code{for i in generate_ints(5)}, or @code{a, b, c =
generate_ints(3)}.

Inside a generator function, @code{return value} causes @code{StopIteration(value)}
to be raised from the @ref{20f2,,__next__()} method.  Once this happens, or
the bottom of the function is reached, the procession of values ends and the
generator cannot yield any further values.

You could achieve the effect of generators manually by writing your own class
and storing all the local variables of the generator as instance variables.  For
example, returning a list of integers could be done by setting @code{self.count} to
0, and having the @ref{14d9,,__next__()} method increment @code{self.count} and
return it.
However, for a moderately complicated generator, writing a corresponding class
can be much messier.

The test suite included with Python’s library,
Lib/test/test_generators.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/test/test_generators.py}, contains
a number of more interesting examples.  Here’s one generator that implements an
in-order traversal of a tree using generators recursively.

@example
# A recursive generator that generates Tree leaves in in-order.
def inorder(t):
    if t:
        for x in inorder(t.left):
            yield x

        yield t.label

        for x in inorder(t.right):
            yield x
@end example

Two other examples in @code{test_generators.py} produce solutions for the N-Queens
problem (placing N queens on an NxN chess board so that no queen threatens
another) and the Knight’s Tour (finding a route that takes a knight to every
square of an NxN chessboard without visiting any square twice).

@menu
* Passing values into a generator:: 

@end menu

@node Passing values into a generator,,,Generators<2>
@anchor{howto/functional passing-values-into-a-generator}@anchor{5a9b}
@subsubsection Passing values into a generator


In Python 2.4 and earlier, generators only produced output.  Once a generator’s
code was invoked to create an iterator, there was no way to pass any new
information into the function when its execution is resumed.  You could hack
together this ability by making the generator look at a global variable or by
passing in some mutable object that callers then modify, but these approaches
are messy.

In Python 2.5 there’s a simple way to pass values into a generator.
@ref{bc8,,yield} became an expression, returning a value that can be assigned to
a variable or otherwise operated on:

@example
val = (yield i)
@end example

I recommend that you `always' put parentheses around a @code{yield} expression
when you’re doing something with the returned value, as in the above example.
The parentheses aren’t always necessary, but it’s easier to always add them
instead of having to remember when they’re needed.

(
@geindex Python Enhancement Proposals; PEP 342
PEP 342@footnote{https://peps.python.org/pep-0342/} explains the exact rules, which are that a @code{yield}-expression must
always be parenthesized except when it occurs at the top-level expression on the
right-hand side of an assignment.  This means you can write @code{val = yield i}
but have to use parentheses when there’s an operation, as in @code{val = (yield i)
+ 12}.)

Values are sent into a generator by calling its @ref{2461,,send(value)} method.  This method resumes the generator’s code and the
@code{yield} expression returns the specified value.  If the regular
@ref{20f2,,__next__()} method is called, the @code{yield} returns @code{None}.

Here’s a simple counter that increments by 1 and allows changing the value of
the internal counter.

@example
def counter(maximum):
    i = 0
    while i < maximum:
        val = (yield i)
        # If value provided, change counter
        if val is not None:
            i = val
        else:
            i += 1
@end example

And here’s an example of changing the counter:

@example
>>> it = counter(10)
>>> next(it)
0
>>> next(it)
1
>>> it.send(8)
8
>>> next(it)
9
>>> next(it)
Traceback (most recent call last):
  File "t.py", line 15, in <module>
    it.next()
StopIteration
@end example

Because @code{yield} will often be returning @code{None}, you should always check for
this case.  Don’t just use its value in expressions unless you’re sure that the
@ref{2461,,send()} method will be the only method used to resume your
generator function.

In addition to @ref{2461,,send()}, there are two other methods on
generators:


@itemize *

@item 
@ref{71d,,throw(value)} is used to
raise an exception inside the generator; the exception is raised by the
@code{yield} expression where the generator’s execution is paused.

@item 
@ref{17e5,,close()} sends a @ref{15d3,,GeneratorExit} exception to the
generator to terminate the iteration.  On receiving this exception, the
generator’s code must either raise @code{GeneratorExit} or
@ref{dfb,,StopIteration}; catching the exception and doing anything else is
illegal and will trigger a @ref{246,,RuntimeError}.  @code{close()}
will also be called by Python’s garbage collector when the generator is
garbage-collected.

If you need to run cleanup code when a @ref{15d3,,GeneratorExit} occurs, I suggest
using a @code{try: ... finally:} suite instead of catching @code{GeneratorExit}.
@end itemize

The cumulative effect of these changes is to turn generators from one-way
producers of information into both producers and consumers.

Generators also become `coroutines', a more generalized form of subroutines.
Subroutines are entered at one point and exited at another point (the top of the
function, and a @code{return} statement), but coroutines can be entered, exited,
and resumed at many different points (the @code{yield} statements).

@node Built-in functions<2>,The itertools module,Generators<2>,Functional Programming HOWTO
@anchor{howto/functional built-in-functions}@anchor{5a9c}
@subsection Built-in functions


Let’s look in more detail at built-in functions often used with iterators.

Two of Python’s built-in functions, @ref{1a0,,map()} and @ref{a6a,,filter()} duplicate the
features of generator expressions:


@table @asis

@item @ref{1a0,,map(f@comma{} iterA@comma{} iterB@comma{} ...)} returns an iterator over the sequence

@code{f(iterA[0], iterB[0]), f(iterA[1], iterB[1]), f(iterA[2], iterB[2]), ...}.

@example
>>> def upper(s):
...     return s.upper()
@end example

@example
>>> list(map(upper, ['sentence', 'fragment']))
['SENTENCE', 'FRAGMENT']
>>> [upper(s) for s in ['sentence', 'fragment']]
['SENTENCE', 'FRAGMENT']
@end example
@end table

You can of course achieve the same effect with a list comprehension.

@ref{a6a,,filter(predicate@comma{} iter)} returns an iterator over all the
sequence elements that meet a certain condition, and is similarly duplicated by
list comprehensions.  A `predicate' is a function that returns the truth
value of some condition; for use with @code{filter()}, the predicate must take a
single value.

@example
>>> def is_even(x):
...     return (x % 2) == 0
@end example

@example
>>> list(filter(is_even, range(10)))
[0, 2, 4, 6, 8]
@end example

This can also be written as a list comprehension:

@example
>>> list(x for x in range(10) if is_even(x))
[0, 2, 4, 6, 8]
@end example

@ref{168d,,enumerate(iter@comma{} start=0)} counts off the elements in the
iterable returning 2-tuples containing the count (from `start') and
each element.

@example
>>> for item in enumerate(['subject', 'verb', 'object']):
...     print(item)
(0, 'subject')
(1, 'verb')
(2, 'object')
@end example

@ref{168d,,enumerate()} is often used when looping through a list and recording the
indexes at which certain conditions are met:

@example
f = open('data.txt', 'r')
for i, line in enumerate(f):
    if line.strip() == '@w{'}:
        print('Blank line at line #%i' % i)
@end example

@ref{dcd,,sorted(iterable@comma{} key=None@comma{} reverse=False)} collects all the
elements of the iterable into a list, sorts the list, and returns the sorted
result.  The `key' and `reverse' arguments are passed through to the
constructed list’s @ref{dce,,sort()} method.

@example
>>> import random
>>> # Generate 8 random numbers between [0, 10000)
>>> rand_list = random.sample(range(10000), 8)
>>> rand_list
[769, 7953, 9828, 6431, 8442, 9878, 6213, 2207]
>>> sorted(rand_list)
[769, 2207, 6213, 6431, 7953, 8442, 9828, 9878]
>>> sorted(rand_list, reverse=True)
[9878, 9828, 8442, 7953, 6431, 6213, 2207, 769]
@end example

(For a more detailed discussion of sorting, see the @ref{2625,,Sorting Techniques}.)

The @ref{162d,,any(iter)} and @ref{162e,,all(iter)} built-ins look at the
truth values of an iterable’s contents.  @code{any()} returns @code{True} if any element
in the iterable is a true value, and @code{all()} returns @code{True} if all of the
elements are true values:

@example
>>> any([0, 1, 0])
True
>>> any([0, 0, 0])
False
>>> any([1, 1, 1])
True
>>> all([0, 1, 0])
False
>>> all([0, 0, 0])
False
>>> all([1, 1, 1])
True
@end example

@ref{1a1,,zip(iterA@comma{} iterB@comma{} ...)} takes one element from each iterable and
returns them in a tuple:

@example
zip(['a', 'b', 'c'], (1, 2, 3)) =>
  ('a', 1), ('b', 2), ('c', 3)
@end example

It doesn’t construct an in-memory list and exhaust all the input iterators
before returning; instead tuples are constructed and returned only if they’re
requested.  (The technical term for this behaviour is lazy evaluation@footnote{https://en.wikipedia.org/wiki/Lazy_evaluation}.)

This iterator is intended to be used with iterables that are all of the same
length.  If the iterables are of different lengths, the resulting stream will be
the same length as the shortest iterable.

@example
zip(['a', 'b'], (1, 2, 3)) =>
  ('a', 1), ('b', 2)
@end example

You should avoid doing this, though, because an element may be taken from the
longer iterators and discarded.  This means you can’t go on to use the iterators
further because you risk skipping a discarded element.

@node The itertools module,The functools module,Built-in functions<2>,Functional Programming HOWTO
@anchor{howto/functional the-itertools-module}@anchor{5a9d}
@subsection The itertools module


The @ref{85,,itertools} module contains a number of commonly used iterators as well
as functions for combining several iterators.  This section will introduce the
module’s contents by showing small examples.

The module’s functions fall into a few broad classes:


@itemize *

@item 
Functions that create a new iterator based on an existing iterator.

@item 
Functions for treating an iterator’s elements as function arguments.

@item 
Functions for selecting portions of an iterator’s output.

@item 
A function for grouping an iterator’s output.
@end itemize

@menu
* Creating new iterators:: 
* Calling functions on elements:: 
* Selecting elements:: 
* Combinatoric functions:: 
* Grouping elements:: 

@end menu

@node Creating new iterators,Calling functions on elements,,The itertools module
@anchor{howto/functional creating-new-iterators}@anchor{5a9e}
@subsubsection Creating new iterators


@ref{148f,,itertools.count(start@comma{} step)} returns an infinite
stream of evenly spaced values.  You can optionally supply the starting number,
which defaults to 0, and the interval between numbers, which defaults to 1:

@example
itertools.count() =>
  0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ...
itertools.count(10) =>
  10, 11, 12, 13, 14, 15, 16, 17, 18, 19, ...
itertools.count(10, 5) =>
  10, 15, 20, 25, 30, 35, 40, 45, 50, 55, ...
@end example

@ref{2c15,,itertools.cycle(iter)} saves a copy of the contents of
a provided iterable and returns a new iterator that returns its elements from
first to last.  The new iterator will repeat these elements infinitely.

@example
itertools.cycle([1, 2, 3, 4, 5]) =>
  1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ...
@end example

@ref{18a2,,itertools.repeat(elem@comma{} [n])} returns the provided
element `n' times, or returns the element endlessly if `n' is not provided.

@example
itertools.repeat('abc') =>
  abc, abc, abc, abc, abc, abc, abc, abc, abc, abc, ...
itertools.repeat('abc', 5) =>
  abc, abc, abc, abc, abc
@end example

@ref{2626,,itertools.chain(iterA@comma{} iterB@comma{} ...)} takes an arbitrary
number of iterables as input, and returns all the elements of the first
iterator, then all the elements of the second, and so on, until all of the
iterables have been exhausted.

@example
itertools.chain(['a', 'b', 'c'], (1, 2, 3)) =>
  a, b, c, 1, 2, 3
@end example

@ref{d49,,itertools.islice(iter@comma{} [start]@comma{} stop@comma{} [step])} returns
a stream that’s a slice of the iterator.  With a single `stop' argument, it
will return the first `stop' elements.  If you supply a starting index, you’ll
get `stop-start' elements, and if you supply a value for `step', elements
will be skipped accordingly.  Unlike Python’s string and list slicing, you can’t
use negative values for `start', `stop', or `step'.

@example
itertools.islice(range(10), 8) =>
  0, 1, 2, 3, 4, 5, 6, 7
itertools.islice(range(10), 2, 8) =>
  2, 3, 4, 5, 6, 7
itertools.islice(range(10), 2, 8, 2) =>
  2, 4, 6
@end example

@ref{2c18,,itertools.tee(iter@comma{} [n])} replicates an iterator; it
returns `n' independent iterators that will all return the contents of the
source iterator.
If you don’t supply a value for `n', the default is 2.  Replicating iterators
requires saving some of the contents of the source iterator, so this can consume
significant memory if the iterator is large and one of the new iterators is
consumed more than the others.

@example
itertools.tee( itertools.count() ) =>
   iterA, iterB

where iterA ->
   0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ...

and   iterB ->
   0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ...
@end example

@node Calling functions on elements,Selecting elements,Creating new iterators,The itertools module
@anchor{howto/functional calling-functions-on-elements}@anchor{5a9f}
@subsubsection Calling functions on elements


The @ref{a3,,operator} module contains a set of functions corresponding to Python’s
operators.  Some examples are @ref{2c3f,,operator.add(a@comma{} b)} (adds
two values), @ref{2c2f,,operator.ne(a@comma{} b)} (same as @code{a != b}), and
@ref{1039,,operator.attrgetter('id')}
(returns a callable that fetches the @code{.id} attribute).

@ref{12f0,,itertools.starmap(func@comma{} iter)} assumes that the
iterable will return a stream of tuples, and calls `func' using these tuples as
the arguments:

@example
itertools.starmap(os.path.join,
                  [('/bin', 'python'), ('/usr', 'bin', 'java'),
                   ('/usr', 'bin', 'perl'), ('/usr', 'bin', 'ruby')])
=>
  /bin/python, /usr/bin/java, /usr/bin/perl, /usr/bin/ruby
@end example

@node Selecting elements,Combinatoric functions,Calling functions on elements,The itertools module
@anchor{howto/functional selecting-elements}@anchor{5aa0}
@subsubsection Selecting elements


Another group of functions chooses a subset of an iterator’s elements based on a
predicate.

@ref{2615,,itertools.filterfalse(predicate@comma{} iter)} is the
opposite of @ref{a6a,,filter()}, returning all elements for which the predicate
returns false:

@example
itertools.filterfalse(is_even, itertools.count()) =>
  1, 3, 5, 7, 9, 11, 13, 15, ...
@end example

@ref{2c17,,itertools.takewhile(predicate@comma{} iter)} returns
elements for as long as the predicate returns true.  Once the predicate returns
false, the iterator will signal the end of its results.

@example
def less_than_10(x):
    return x < 10

itertools.takewhile(less_than_10, itertools.count()) =>
  0, 1, 2, 3, 4, 5, 6, 7, 8, 9

itertools.takewhile(is_even, itertools.count()) =>
  0
@end example

@ref{2c16,,itertools.dropwhile(predicate@comma{} iter)} discards
elements while the predicate returns true, and then returns the rest of the
iterable’s results.

@example
itertools.dropwhile(less_than_10, itertools.count()) =>
  10, 11, 12, 13, 14, 15, 16, 17, 18, 19, ...

itertools.dropwhile(is_even, itertools.count()) =>
  1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ...
@end example

@ref{148e,,itertools.compress(data@comma{} selectors)} takes two
iterators and returns only those elements of `data' for which the corresponding
element of `selectors' is true, stopping whenever either one is exhausted:

@example
itertools.compress([1, 2, 3, 4, 5], [True, True, False, False, True]) =>
   1, 2, 5
@end example

@node Combinatoric functions,Grouping elements,Selecting elements,The itertools module
@anchor{howto/functional combinatoric-functions}@anchor{5aa1}
@subsubsection Combinatoric functions


The @ref{151d,,itertools.combinations(iterable@comma{} r)}
returns an iterator giving all possible `r'-tuple combinations of the
elements contained in `iterable'.

@example
itertools.combinations([1, 2, 3, 4, 5], 2) =>
  (1, 2), (1, 3), (1, 4), (1, 5),
  (2, 3), (2, 4), (2, 5),
  (3, 4), (3, 5),
  (4, 5)

itertools.combinations([1, 2, 3, 4, 5], 3) =>
  (1, 2, 3), (1, 2, 4), (1, 2, 5), (1, 3, 4), (1, 3, 5), (1, 4, 5),
  (2, 3, 4), (2, 3, 5), (2, 4, 5),
  (3, 4, 5)
@end example

The elements within each tuple remain in the same order as
`iterable' returned them.  For example, the number 1 is always before
2, 3, 4, or 5 in the examples above.  A similar function,
@ref{1d21,,itertools.permutations(iterable@comma{} r=None)},
removes this constraint on the order, returning all possible
arrangements of length `r':

@example
itertools.permutations([1, 2, 3, 4, 5], 2) =>
  (1, 2), (1, 3), (1, 4), (1, 5),
  (2, 1), (2, 3), (2, 4), (2, 5),
  (3, 1), (3, 2), (3, 4), (3, 5),
  (4, 1), (4, 2), (4, 3), (4, 5),
  (5, 1), (5, 2), (5, 3), (5, 4)

itertools.permutations([1, 2, 3, 4, 5]) =>
  (1, 2, 3, 4, 5), (1, 2, 3, 5, 4), (1, 2, 4, 3, 5),
  ...
  (5, 4, 3, 2, 1)
@end example

If you don’t supply a value for `r' the length of the iterable is used,
meaning that all the elements are permuted.

Note that these functions produce all of the possible combinations by
position and don’t require that the contents of `iterable' are unique:

@example
itertools.permutations('aba', 3) =>
  ('a', 'b', 'a'), ('a', 'a', 'b'), ('b', 'a', 'a'),
  ('b', 'a', 'a'), ('a', 'a', 'b'), ('a', 'b', 'a')
@end example

The identical tuple @code{('a', 'a', 'b')} occurs twice, but the two ‘a’
strings came from different positions.

The @ref{148d,,itertools.combinations_with_replacement(iterable@comma{} r)}
function relaxes a different constraint: elements can be repeated
within a single tuple.  Conceptually an element is selected for the
first position of each tuple and then is replaced before the second
element is selected.

@example
itertools.combinations_with_replacement([1, 2, 3, 4, 5], 2) =>
  (1, 1), (1, 2), (1, 3), (1, 4), (1, 5),
  (2, 2), (2, 3), (2, 4), (2, 5),
  (3, 3), (3, 4), (3, 5),
  (4, 4), (4, 5),
  (5, 5)
@end example

@node Grouping elements,,Combinatoric functions,The itertools module
@anchor{howto/functional grouping-elements}@anchor{5aa2}
@subsubsection Grouping elements


The last function I’ll discuss, @ref{17ad,,itertools.groupby(iter@comma{} key_func=None)}, is the most complicated.  @code{key_func(elem)} is a function
that can compute a key value for each element returned by the iterable.  If you
don’t supply a key function, the key is simply each element itself.

@ref{17ad,,groupby()} collects all the consecutive elements from the
underlying iterable that have the same key value, and returns a stream of
2-tuples containing a key value and an iterator for the elements with that key.

@example
city_list = [('Decatur', 'AL'), ('Huntsville', 'AL'), ('Selma', 'AL'),
             ('Anchorage', 'AK'), ('Nome', 'AK'),
             ('Flagstaff', 'AZ'), ('Phoenix', 'AZ'), ('Tucson', 'AZ'),
             ...
            ]

def get_state(city_state):
    return city_state[1]

itertools.groupby(city_list, get_state) =>
  ('AL', iterator-1),
  ('AK', iterator-2),
  ('AZ', iterator-3), ...

where
iterator-1 =>
  ('Decatur', 'AL'), ('Huntsville', 'AL'), ('Selma', 'AL')
iterator-2 =>
  ('Anchorage', 'AK'), ('Nome', 'AK')
iterator-3 =>
  ('Flagstaff', 'AZ'), ('Phoenix', 'AZ'), ('Tucson', 'AZ')
@end example

@ref{17ad,,groupby()} assumes that the underlying iterable’s contents will
already be sorted based on the key.  Note that the returned iterators also use
the underlying iterable, so you have to consume the results of iterator-1 before
requesting iterator-2 and its corresponding key.

@node The functools module,Small functions and the lambda expression,The itertools module,Functional Programming HOWTO
@anchor{howto/functional the-functools-module}@anchor{5aa3}
@subsection The functools module


The @ref{63,,functools} module contains some higher-order functions.
A `higher-order function' takes one or more functions as input and returns a
new function.  The most useful tool in this module is the
@ref{219,,functools.partial()} function.

For programs written in a functional style, you’ll sometimes want to construct
variants of existing functions that have some of the parameters filled in.
Consider a Python function @code{f(a, b, c)}; you may wish to create a new function
@code{g(b, c)} that’s equivalent to @code{f(1, b, c)}; you’re filling in a value for
one of @code{f()}’s parameters.  This is called “partial function application”.

The constructor for @ref{219,,partial()} takes the arguments
@code{(function, arg1, arg2, ..., kwarg1=value1, kwarg2=value2)}.  The resulting
object is callable, so you can just call it to invoke @code{function} with the
filled-in arguments.

Here’s a small but realistic example:

@example
import functools

def log(message, subsystem):
    """Write the contents of 'message' to the specified subsystem."""
    print('%s: %s' % (subsystem, message))
    ...

server_log = functools.partial(log, subsystem='server')
server_log('Unable to open socket')
@end example

@ref{21c,,functools.reduce(func@comma{} iter@comma{} [initial_value])}
cumulatively performs an operation on all the iterable’s elements and,
therefore, can’t be applied to infinite iterables. `func' must be a function
that takes two elements and returns a single value.  @code{functools.reduce()}
takes the first two elements A and B returned by the iterator and calculates
@code{func(A, B)}.  It then requests the third element, C, calculates
@code{func(func(A, B), C)}, combines this result with the fourth element returned,
and continues until the iterable is exhausted.  If the iterable returns no
values at all, a @ref{199,,TypeError} exception is raised.  If the initial value is
supplied, it’s used as a starting point and @code{func(initial_value, A)} is the
first calculation.

@example
>>> import operator, functools
>>> functools.reduce(operator.concat, ['A', 'BB', 'C'])
'ABBC'
>>> functools.reduce(operator.concat, [])
Traceback (most recent call last):
  ...
TypeError: reduce() of empty iterable with no initial value
>>> functools.reduce(operator.mul, [1, 2, 3], 1)
6
>>> functools.reduce(operator.mul, [], 1)
1
@end example

If you use @ref{2c3f,,operator.add()} with @ref{21c,,functools.reduce()}, you’ll add up all the
elements of the iterable.  This case is so common that there’s a special
built-in called @ref{696,,sum()} to compute it:

@example
>>> import functools, operator
>>> functools.reduce(operator.add, [1, 2, 3, 4], 0)
10
>>> sum([1, 2, 3, 4])
10
>>> sum([])
0
@end example

For many uses of @ref{21c,,functools.reduce()}, though, it can be clearer to just
write the obvious @ref{348,,for} loop:

@example
import functools
# Instead of:
product = functools.reduce(operator.mul, [1, 2, 3], 1)

# You can write:
product = 1
for i in [1, 2, 3]:
    product *= i
@end example

A related function is @ref{bf6,,itertools.accumulate(iterable@comma{} func=operator.add)}.  It performs the same calculation, but instead of
returning only the final result, @code{accumulate()} returns an iterator
that also yields each partial result:

@example
itertools.accumulate([1, 2, 3, 4, 5]) =>
  1, 3, 6, 10, 15

itertools.accumulate([1, 2, 3, 4, 5], operator.mul) =>
  1, 2, 6, 24, 120
@end example

@menu
* The operator module:: 

@end menu

@node The operator module,,,The functools module
@anchor{howto/functional the-operator-module}@anchor{5aa4}
@subsubsection The operator module


The @ref{a3,,operator} module was mentioned earlier.  It contains a set of
functions corresponding to Python’s operators.  These functions are often useful
in functional-style code because they save you from writing trivial functions
that perform a single operation.

Some of the functions in this module are:


@itemize *

@item 
Math operations: @code{add()}, @code{sub()}, @code{mul()}, @code{floordiv()}, @code{abs()}, …

@item 
Logical operations: @code{not_()}, @code{truth()}.

@item 
Bitwise operations: @code{and_()}, @code{or_()}, @code{invert()}.

@item 
Comparisons: @code{eq()}, @code{ne()}, @code{lt()}, @code{le()}, @code{gt()}, and @code{ge()}.

@item 
Object identity: @code{is_()}, @code{is_not()}.
@end itemize

Consult the operator module’s documentation for a complete list.

@node Small functions and the lambda expression,Revision History and Acknowledgements,The functools module,Functional Programming HOWTO
@anchor{howto/functional small-functions-and-the-lambda-expression}@anchor{5aa5}
@subsection Small functions and the lambda expression


When writing functional-style programs, you’ll often need little functions that
act as predicates or that combine elements in some way.

If there’s a Python built-in or a module function that’s suitable, you don’t
need to define a new function at all:

@example
stripped_lines = [line.strip() for line in lines]
existing_files = filter(os.path.exists, file_list)
@end example

If the function you need doesn’t exist, you need to write it.  One way to write
small functions is to use the @ref{14a9,,lambda} expression.  @code{lambda} takes a
number of parameters and an expression combining these parameters, and creates
an anonymous function that returns the value of the expression:

@example
adder = lambda x, y: x+y

print_assign = lambda name, value: name + '=' + str(value)
@end example

An alternative is to just use the @code{def} statement and define a function in the
usual way:

@example
def adder(x, y):
    return x + y

def print_assign(name, value):
    return name + '=' + str(value)
@end example

Which alternative is preferable?  That’s a style question; my usual course is to
avoid using @code{lambda}.

One reason for my preference is that @code{lambda} is quite limited in the
functions it can define.  The result has to be computable as a single
expression, which means you can’t have multiway @code{if... elif... else}
comparisons or @code{try... except} statements.  If you try to do too much in a
@code{lambda} statement, you’ll end up with an overly complicated expression that’s
hard to read.  Quick, what’s the following code doing?

@example
import functools
total = functools.reduce(lambda a, b: (0, a[1] + b[1]), items)[1]
@end example

You can figure it out, but it takes time to disentangle the expression to figure
out what’s going on.  Using a short nested @code{def} statements makes things a
little bit better:

@example
import functools
def combine(a, b):
    return 0, a[1] + b[1]

total = functools.reduce(combine, items)[1]
@end example

But it would be best of all if I had simply used a @code{for} loop:

@example
total = 0
for a, b in items:
    total += b
@end example

Or the @ref{696,,sum()} built-in and a generator expression:

@example
total = sum(b for a, b in items)
@end example

Many uses of @ref{21c,,functools.reduce()} are clearer when written as @code{for} loops.

Fredrik Lundh once suggested the following set of rules for refactoring uses of
@code{lambda}:


@enumerate 

@item 
Write a lambda function.

@item 
Write a comment explaining what the heck that lambda does.

@item 
Study the comment for a while, and think of a name that captures the essence
of the comment.

@item 
Convert the lambda to a def statement, using that name.

@item 
Remove the comment.
@end enumerate

I really like these rules, but you’re free to disagree
about whether this lambda-free style is better.

@node Revision History and Acknowledgements,References<2>,Small functions and the lambda expression,Functional Programming HOWTO
@anchor{howto/functional revision-history-and-acknowledgements}@anchor{5aa6}
@subsection Revision History and Acknowledgements


The author would like to thank the following people for offering suggestions,
corrections and assistance with various drafts of this article: Ian Bicking,
Nick Coghlan, Nick Efford, Raymond Hettinger, Jim Jewett, Mike Krell, Leandro
Lameiro, Jussi Salmela, Collin Winter, Blake Winton.

Version 0.1: posted June 30 2006.

Version 0.11: posted July 1 2006.  Typo fixes.

Version 0.2: posted July 10 2006.  Merged genexp and listcomp sections into one.
Typo fixes.

Version 0.21: Added more references suggested on the tutor mailing list.

Version 0.30: Adds a section on the @code{functional} module written by Collin
Winter; adds short section on the operator module; a few other edits.

@node References<2>,,Revision History and Acknowledgements,Functional Programming HOWTO
@anchor{howto/functional references}@anchor{5aa7}
@subsection References


@menu
* General:: 
* Python-specific:: 
* Python documentation:: 

@end menu

@node General,Python-specific,,References<2>
@anchor{howto/functional general}@anchor{5aa8}
@subsubsection General


`Structure and Interpretation of Computer Programs', by Harold Abelson and
Gerald Jay Sussman with Julie Sussman.  The book can be found at
@indicateurl{https://mitpress.mit.edu/sicp}.  In this classic textbook of computer science,
chapters 2 and 3 discuss the use of sequences and streams to organize the data
flow inside a program.  The book uses Scheme for its examples, but many of the
design approaches described in these chapters are applicable to functional-style
Python code.

@indicateurl{https://defmacro.org/2006/06/19/fp.html}: A general introduction to functional
programming that uses Java examples and has a lengthy historical introduction.

@indicateurl{https://en.wikipedia.org/wiki/Functional_programming}: General Wikipedia entry
describing functional programming.

@indicateurl{https://en.wikipedia.org/wiki/Coroutine}: Entry for coroutines.

@indicateurl{https://en.wikipedia.org/wiki/Partial_application}: Entry for the concept of partial function application.

@indicateurl{https://en.wikipedia.org/wiki/Currying}: Entry for the concept of currying.

@node Python-specific,Python documentation,General,References<2>
@anchor{howto/functional python-specific}@anchor{5aa9}
@subsubsection Python-specific


@indicateurl{https://gnosis.cx/TPiP/}: The first chapter of David Mertz’s book
@cite{Text Processing in Python} discusses functional programming
for text processing, in the section titled “Utilizing Higher-Order Functions in
Text Processing”.

Mertz also wrote a 3-part series of articles on functional programming
for IBM’s DeveloperWorks site; see
part 1@footnote{https://developer.ibm.com/articles/l-prog/},
part 2@footnote{https://developer.ibm.com/tutorials/l-prog2/}, and
part 3@footnote{https://developer.ibm.com/tutorials/l-prog3/},

@node Python documentation,,Python-specific,References<2>
@anchor{howto/functional python-documentation}@anchor{5aaa}
@subsubsection Python documentation


Documentation for the @ref{85,,itertools} module.

Documentation for the @ref{63,,functools} module.

Documentation for the @ref{a3,,operator} module.

@geindex Python Enhancement Proposals; PEP 289
PEP 289@footnote{https://peps.python.org/pep-0289/}: “Generator Expressions”

@geindex Python Enhancement Proposals; PEP 342
PEP 342@footnote{https://peps.python.org/pep-0342/}: “Coroutines via Enhanced Generators” describes the new generator
features in Python 2.5.

@c comment
@c 
@c Handy little function for printing part of an iterator -- used
@c while writing this document.
@c 
@c import itertools
@c def print_iter(it):
@c      slice = itertools.islice(it, 10)
@c      for elem in slice[:-1]:
@c          sys.stdout.write(str(elem))
@c          sys.stdout.write(', ')
@c     print(elem[-1])

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Logging HOWTO,Logging Cookbook,Functional Programming HOWTO,Python HOWTOs
@anchor{howto/logging doc}@anchor{5aab}@anchor{howto/logging id1}@anchor{5aac}@anchor{howto/logging logging-howto}@anchor{5aad}@anchor{howto/logging translation-repo}@anchor{5aae}
@section Logging HOWTO


@*Author: 
Vinay Sajip <vinay_sajip at red-dove dot com>

@anchor{howto/logging logging-basic-tutorial}@anchor{1401}
This page contains tutorial information. For links to reference information and a
logging cookbook, please see @ref{5aaf,,Other resources}.

@menu
* Basic Logging Tutorial:: 
* Advanced Logging Tutorial:: 
* Logging Levels: Logging Levels<2>. 
* Useful Handlers:: 
* Exceptions raised during logging:: 
* Using arbitrary objects as messages:: 
* Optimization:: 
* Other resources:: 

@end menu

@node Basic Logging Tutorial,Advanced Logging Tutorial,,Logging HOWTO
@anchor{howto/logging basic-logging-tutorial}@anchor{5ab0}
@subsection Basic Logging Tutorial


Logging is a means of tracking events that happen when some software runs. The
software’s developer adds logging calls to their code to indicate that certain
events have occurred. An event is described by a descriptive message which can
optionally contain variable data (i.e. data that is potentially different for
each occurrence of the event). Events also have an importance which the
developer ascribes to the event; the importance can also be called the `level'
or `severity'.

@menu
* When to use logging:: 
* A simple example:: 
* Logging to a file:: 
* Logging variable data:: 
* Changing the format of displayed messages:: 
* Displaying the date/time in messages:: 
* Next Steps:: 

@end menu

@node When to use logging,A simple example,,Basic Logging Tutorial
@anchor{howto/logging when-to-use-logging}@anchor{5ab1}
@subsubsection When to use logging


You can access logging functionality by creating a logger via @code{logger =
logging.getLogger(__name__)}, and then calling the logger’s @ref{1031,,debug()},
@ref{31cf,,info()}, @ref{1aba,,warning()}, @ref{31d1,,error()} and
@ref{1030,,critical()} methods. To determine when to use logging, and to see
which logger methods to use when, see the table below. It states, for each of a
set of common tasks, the best tool to use for that task.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Task you want to perform

@tab

The best tool for the task

@item

Display console output for ordinary
usage of a command line script or
program

@tab

@ref{117b,,print()}

@item

Report events that occur during
normal operation of a program (e.g.
for status monitoring or fault
investigation)

@tab

A logger’s @ref{31cf,,info()} (or
@ref{1031,,debug()} method for very
detailed output for diagnostic
purposes)

@item

Issue a warning regarding a
particular runtime event

@tab

@ref{1725,,warnings.warn()} in library
code if the issue is avoidable and
the client application should be
modified to eliminate the warning

A logger’s @ref{1aba,,warning()}
method if there is nothing the client
application can do about the
situation, but the event should still
be noted

@item

Report an error regarding a
particular runtime event

@tab

Raise an exception

@item

Report suppression of an error
without raising an exception (e.g.
error handler in a long-running
server process)

@tab

A logger’s @ref{31d1,,error()},
@ref{102f,,exception()} or
@ref{1030,,critical()} method as
appropriate for the specific error
and application domain

@end multitable


The logger methods are named after the level or severity of the events
they are used to track. The standard levels and their applicability are
described below (in increasing order of severity):


@multitable {xxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Level

@tab

When it’s used

@item

@code{DEBUG}

@tab

Detailed information, typically of interest
only when diagnosing problems.

@item

@code{INFO}

@tab

Confirmation that things are working as
expected.

@item

@code{WARNING}

@tab

An indication that something unexpected
happened, or indicative of some problem in
the near future (e.g. ‘disk space low’).
The software is still working as expected.

@item

@code{ERROR}

@tab

Due to a more serious problem, the software
has not been able to perform some function.

@item

@code{CRITICAL}

@tab

A serious error, indicating that the program
itself may be unable to continue running.

@end multitable


The default level is @code{WARNING}, which means that only events of this severity and higher
will be tracked, unless the logging package is configured to do otherwise.

Events that are tracked can be handled in different ways. The simplest way of
handling tracked events is to print them to the console. Another common way
is to write them to a disk file.

@node A simple example,Logging to a file,When to use logging,Basic Logging Tutorial
@anchor{howto/logging a-simple-example}@anchor{5ab2}@anchor{howto/logging howto-minimal-example}@anchor{5ab3}
@subsubsection A simple example


A very simple example is:

@example
import logging
logging.warning('Watch out!')  # will print a message to the console
logging.info('I told you so')  # will not print anything
@end example

If you type these lines into a script and run it, you’ll see:

@example
WARNING:root:Watch out!
@end example

printed out on the console. The @code{INFO} message doesn’t appear because the
default level is @code{WARNING}. The printed message includes the indication of the
level and the description of the event provided in the logging call, i.e.
‘Watch out!’. The actual output can be formatted quite flexibly if you need
that; formatting options will also be explained later.

Notice that in this example, we use functions directly on the @code{logging}
module, like @code{logging.debug}, rather than creating a logger and calling
functions on it. These functions operate on the root logger, but can be useful
as they will call @ref{bf9,,basicConfig()} for you if it has not been called yet, like in
this example.  In larger programs you’ll usually want to control the logging
configuration explicitly however - so for that reason as well as others, it’s
better to create loggers and call their methods.

@node Logging to a file,Logging variable data,A simple example,Basic Logging Tutorial
@anchor{howto/logging logging-to-a-file}@anchor{5ab4}
@subsubsection Logging to a file


A very common situation is that of recording logging events in a file, so let’s
look at that next. Be sure to try the following in a newly started Python
interpreter, and don’t just continue from the session described above:

@example
import logging
logger = logging.getLogger(__name__)
logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG)
logger.debug('This message should go to the log file')
logger.info('So should this')
logger.warning('And this, too')
logger.error('And non-ASCII stuff, too, like Øresund and Malmö')
@end example


Changed in version 3.9: The `encoding' argument was added. In earlier Python versions, or if not
specified, the encoding used is the default value used by @ref{318,,open()}. While
not shown in the above example, an `errors' argument can also now be passed,
which determines how encoding errors are handled. For available values and
the default, see the documentation for @code{open()}.


And now if we open the file and look at what we have, we should find the log
messages:

@example
DEBUG:__main__:This message should go to the log file
INFO:__main__:So should this
WARNING:__main__:And this, too
ERROR:__main__:And non-ASCII stuff, too, like Øresund and Malmö
@end example

This example also shows how you can set the logging level which acts as the
threshold for tracking. In this case, because we set the threshold to
@code{DEBUG}, all of the messages were printed.

If you want to set the logging level from a command-line option such as:

@example
--log=INFO
@end example

and you have the value of the parameter passed for @code{--log} in some variable
`loglevel', you can use:

@example
getattr(logging, loglevel.upper())
@end example

to get the value which you’ll pass to @ref{bf9,,basicConfig()} via the `level'
argument. You may want to error check any user input value, perhaps as in the
following example:

@example
# assuming loglevel is bound to the string value obtained from the
# command line argument. Convert to upper case to allow the user to
# specify --log=DEBUG or --log=debug
numeric_level = getattr(logging, loglevel.upper(), None)
if not isinstance(numeric_level, int):
    raise ValueError('Invalid log level: %s' % loglevel)
logging.basicConfig(level=numeric_level, ...)
@end example

The call to @ref{bf9,,basicConfig()} should come `before' any calls to a logger’s
methods such as @ref{1031,,debug()}, @ref{31cf,,info()}, etc. Otherwise,
that logging event may not be handled in the desired manner.

If you run the above script several times, the messages from successive runs
are appended to the file `example.log'. If you want each run to start afresh,
not remembering the messages from earlier runs, you can specify the `filemode'
argument, by changing the call in the above example to:

@example
logging.basicConfig(filename='example.log', filemode='w', level=logging.DEBUG)
@end example

The output will be the same as before, but the log file is no longer appended
to, so the messages from earlier runs are lost.

@node Logging variable data,Changing the format of displayed messages,Logging to a file,Basic Logging Tutorial
@anchor{howto/logging logging-variable-data}@anchor{5ab5}
@subsubsection Logging variable data


To log variable data, use a format string for the event description message and
append the variable data as arguments. For example:

@example
import logging
logging.warning('%s before you %s', 'Look', 'leap!')
@end example

will display:

@example
WARNING:root:Look before you leap!
@end example

As you can see, merging of variable data into the event description message
uses the old, %-style of string formatting. This is for backwards
compatibility: the logging package pre-dates newer formatting options such as
@ref{834,,str.format()} and @ref{899,,string.Template}. These newer formatting
options `are' supported, but exploring them is outside the scope of this
tutorial: see @ref{31ee,,Using particular formatting styles throughout your application} for more information.

@node Changing the format of displayed messages,Displaying the date/time in messages,Logging variable data,Basic Logging Tutorial
@anchor{howto/logging changing-the-format-of-displayed-messages}@anchor{5ab6}
@subsubsection Changing the format of displayed messages


To change the format which is used to display messages, you need to
specify the format you want to use:

@example
import logging
logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.DEBUG)
logging.debug('This message should appear on the console')
logging.info('So should this')
logging.warning('And this, too')
@end example

which would print:

@example
DEBUG:This message should appear on the console
INFO:So should this
WARNING:And this, too
@end example

Notice that the ‘root’ which appeared in earlier examples has disappeared. For
a full set of things that can appear in format strings, you can refer to the
documentation for @ref{31ce,,LogRecord attributes}, but for simple usage, you just
need the `levelname' (severity), `message' (event description, including
variable data) and perhaps to display when the event occurred. This is
described in the next section.

@node Displaying the date/time in messages,Next Steps,Changing the format of displayed messages,Basic Logging Tutorial
@anchor{howto/logging displaying-the-date-time-in-messages}@anchor{5ab7}
@subsubsection Displaying the date/time in messages


To display the date and time of an event, you would place ‘%(asctime)s’ in
your format string:

@example
import logging
logging.basicConfig(format='%(asctime)s %(message)s')
logging.warning('is when this event was logged.')
@end example

which should print something like this:

@example
2010-12-12 11:41:42,612 is when this event was logged.
@end example

The default format for date/time display (shown above) is like ISO8601 or
@geindex RFC; RFC 3339
RFC 3339@footnote{https://datatracker.ietf.org/doc/html/rfc3339.html}. If you need more control over the formatting of the date/time, provide
a `datefmt' argument to @code{basicConfig}, as in this example:

@example
import logging
logging.basicConfig(format='%(asctime)s %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p')
logging.warning('is when this event was logged.')
@end example

which would display something like this:

@example
12/12/2010 11:46:36 AM is when this event was logged.
@end example

The format of the `datefmt' argument is the same as supported by
@ref{13f5,,time.strftime()}.

@node Next Steps,,Displaying the date/time in messages,Basic Logging Tutorial
@anchor{howto/logging next-steps}@anchor{5ab8}
@subsubsection Next Steps


That concludes the basic tutorial. It should be enough to get you up and
running with logging. There’s a lot more that the logging package offers, but
to get the best out of it, you’ll need to invest a little more of your time in
reading the following sections. If you’re ready for that, grab some of your
favourite beverage and carry on.

If your logging needs are simple, then use the above examples to incorporate
logging into your own scripts, and if you run into problems or don’t understand
something, please post a question in the Help category of the Python discussion forum@footnote{https://discuss.python.org/c/help/7} and you should receive
help before too long.

Still here? You can carry on reading the next few sections, which provide a
slightly more advanced/in-depth tutorial than the basic one above. After that,
you can take a look at the @ref{1403,,Logging Cookbook}.

@node Advanced Logging Tutorial,Logging Levels<2>,Basic Logging Tutorial,Logging HOWTO
@anchor{howto/logging advanced-logging-tutorial}@anchor{5ab9}@anchor{howto/logging logging-advanced-tutorial}@anchor{1402}
@subsection Advanced Logging Tutorial


The logging library takes a modular approach and offers several categories
of components: loggers, handlers, filters, and formatters.


@itemize *

@item 
Loggers expose the interface that application code directly uses.

@item 
Handlers send the log records (created by loggers) to the appropriate
destination.

@item 
Filters provide a finer grained facility for determining which log records
to output.

@item 
Formatters specify the layout of log records in the final output.
@end itemize

Log event information is passed between loggers, handlers, filters and
formatters in a @ref{11ec,,LogRecord} instance.

Logging is performed by calling methods on instances of the @ref{d4c,,Logger}
class (hereafter called `loggers'). Each instance has a name, and they are
conceptually arranged in a namespace hierarchy using dots (periods) as
separators. For example, a logger named ‘scan’ is the parent of loggers
‘scan.text’, ‘scan.html’ and ‘scan.pdf’. Logger names can be anything you want,
and indicate the area of an application in which a logged message originates.

A good convention to use when naming loggers is to use a module-level logger,
in each module which uses logging, named as follows:

@example
logger = logging.getLogger(__name__)
@end example

This means that logger names track the package/module hierarchy, and it’s
intuitively obvious where events are logged just from the logger name.

The root of the hierarchy of loggers is called the root logger. That’s the
logger used by the functions @ref{31d0,,debug()}, @ref{31f9,,info()}, @ref{352,,warning()},
@ref{320d,,error()} and @ref{320e,,critical()}, which just call the same-named method of
the root logger. The functions and the methods have the same signatures. The
root logger’s name is printed as ‘root’ in the logged output.

It is, of course, possible to log messages to different destinations. Support
is included in the package for writing log messages to files, HTTP GET/POST
locations, email via SMTP, generic sockets, queues, or OS-specific logging
mechanisms such as syslog or the Windows NT event log. Destinations are served
by `handler' classes. You can create your own log destination class if
you have special requirements not met by any of the built-in handler classes.

By default, no destination is set for any logging messages. You can specify
a destination (such as console or file) by using @ref{bf9,,basicConfig()} as in the
tutorial examples. If you call the functions  @ref{31d0,,debug()}, @ref{31f9,,info()},
@ref{352,,warning()}, @ref{320d,,error()} and @ref{320e,,critical()}, they will check to see
if no destination is set; and if one is not set, they will set a destination
of the console (@code{sys.stderr}) and a default format for the displayed
message before delegating to the root logger to do the actual message output.

The default format set by @ref{bf9,,basicConfig()} for messages is:

@example
severity:logger name:message
@end example

You can change this by passing a format string to @ref{bf9,,basicConfig()} with the
`format' keyword argument. For all options regarding how a format string is
constructed, see @ref{31eb,,Formatter Objects}.

@menu
* Logging Flow:: 
* Loggers:: 
* Handlers:: 
* Formatters:: 
* Configuring Logging:: 
* What happens if no configuration is provided:: 
* Configuring Logging for a Library:: 

@end menu

@node Logging Flow,Loggers,,Advanced Logging Tutorial
@anchor{howto/logging logging-flow}@anchor{5aba}
@subsubsection Logging Flow


The flow of log event information in loggers and handlers is illustrated in the
following diagram.

@image{python-figures/logging_flow,,,,png}

@node Loggers,Handlers,Logging Flow,Advanced Logging Tutorial
@anchor{howto/logging loggers}@anchor{5abb}
@subsubsection Loggers


@ref{d4c,,Logger} objects have a threefold job.  First, they expose several
methods to application code so that applications can log messages at runtime.
Second, logger objects determine which log messages to act upon based upon
severity (the default filtering facility) or filter objects.  Third, logger
objects pass along relevant log messages to all interested log handlers.

The most widely used methods on logger objects fall into two categories:
configuration and message sending.

These are the most common configuration methods:


@itemize *

@item 
@ref{169f,,Logger.setLevel()} specifies the lowest-severity log message a logger
will handle, where debug is the lowest built-in severity level and critical
is the highest built-in severity.  For example, if the severity level is
INFO, the logger will handle only INFO, WARNING, ERROR, and CRITICAL messages
and will ignore DEBUG messages.

@item 
@ref{31c9,,Logger.addHandler()} and @ref{31ca,,Logger.removeHandler()} add and remove
handler objects from the logger object.  Handlers are covered in more detail
in @ref{5abc,,Handlers}.

@item 
@ref{31d2,,Logger.addFilter()} and @ref{31d3,,Logger.removeFilter()} add and remove filter
objects from the logger object.  Filters are covered in more detail in
@ref{31f6,,Filter Objects}.
@end itemize

You don’t need to always call these methods on every logger you create. See the
last two paragraphs in this section.

With the logger object configured, the following methods create log messages:


@itemize *

@item 
@ref{1031,,Logger.debug()}, @ref{31cf,,Logger.info()}, @ref{1aba,,Logger.warning()},
@ref{31d1,,Logger.error()}, and @ref{1030,,Logger.critical()} all create log records with
a message and a level that corresponds to their respective method names. The
message is actually a format string, which may contain the standard string
substitution syntax of @code{%s}, @code{%d}, @code{%f}, and so on.  The
rest of their arguments is a list of objects that correspond with the
substitution fields in the message.  With regard to @code{**kwargs}, the
logging methods care only about a keyword of @code{exc_info} and use it to
determine whether to log exception information.

@item 
@ref{102f,,Logger.exception()} creates a log message similar to
@ref{31d1,,Logger.error()}.  The difference is that @code{Logger.exception()} dumps a
stack trace along with it.  Call this method only from an exception handler.

@item 
@ref{102e,,Logger.log()} takes a log level as an explicit argument.  This is a
little more verbose for logging messages than using the log level convenience
methods listed above, but this is how to log at custom log levels.
@end itemize

@ref{b5f,,getLogger()} returns a reference to a logger instance with the specified
name if it is provided, or @code{root} if not.  The names are period-separated
hierarchical structures.  Multiple calls to @code{getLogger()} with the same name
will return a reference to the same logger object.  Loggers that are further
down in the hierarchical list are children of loggers higher up in the list.
For example, given a logger with a name of @code{foo}, loggers with names of
@code{foo.bar}, @code{foo.bar.baz}, and @code{foo.bam} are all descendants of @code{foo}.

Loggers have a concept of `effective level'. If a level is not explicitly set
on a logger, the level of its parent is used instead as its effective level.
If the parent has no explicit level set, `its' parent is examined, and so on -
all ancestors are searched until an explicitly set level is found. The root
logger always has an explicit level set (@code{WARNING} by default). When deciding
whether to process an event, the effective level of the logger is used to
determine whether the event is passed to the logger’s handlers.

Child loggers propagate messages up to the handlers associated with their
ancestor loggers. Because of this, it is unnecessary to define and configure
handlers for all the loggers an application uses. It is sufficient to
configure handlers for a top-level logger and create child loggers as needed.
(You can, however, turn off propagation by setting the `propagate'
attribute of a logger to @code{False}.)

@node Handlers,Formatters,Loggers,Advanced Logging Tutorial
@anchor{howto/logging handler-basic}@anchor{5abc}@anchor{howto/logging handlers}@anchor{5abd}
@subsubsection Handlers


@ref{16a2,,Handler} objects are responsible for dispatching the
appropriate log messages (based on the log messages’ severity) to the handler’s
specified destination.  @ref{d4c,,Logger} objects can add zero or more handler
objects to themselves with an @ref{31c9,,addHandler()} method.  As an example
scenario, an application may want to send all log messages to a log file, all
log messages of error or higher to stdout, and all messages of critical to an
email address. This scenario requires three individual handlers where each
handler is responsible for sending messages of a specific severity to a specific
location.

The standard library includes quite a few handler types (see
@ref{5abe,,Useful Handlers}); the tutorials use mainly @ref{1404,,StreamHandler} and
@ref{1c96,,FileHandler} in its examples.

There are very few methods in a handler for application developers to concern
themselves with.  The only handler methods that seem relevant for application
developers who are using the built-in handler objects (that is, not creating
custom handlers) are the following configuration methods:


@itemize *

@item 
The @ref{31e0,,setLevel()} method, just as in logger objects, specifies the
lowest severity that will be dispatched to the appropriate destination.  Why
are there two @code{setLevel()} methods?  The level set in the logger
determines which severity of messages it will pass to its handlers.  The level
set in each handler determines which messages that handler will send on.

@item 
@ref{31e1,,setFormatter()} selects a Formatter object for this handler to
use.

@item 
@ref{31e2,,addFilter()} and @ref{31e3,,removeFilter()} respectively
configure and deconfigure filter objects on handlers.
@end itemize

Application code should not directly instantiate and use instances of
@ref{16a2,,Handler}.  Instead, the @code{Handler} class is a base class that
defines the interface that all handlers should have and establishes some
default behavior that child classes can use (or override).

@node Formatters,Configuring Logging,Handlers,Advanced Logging Tutorial
@anchor{howto/logging formatters}@anchor{5abf}
@subsubsection Formatters


Formatter objects configure the final order, structure, and contents of the log
message.  Unlike the base @ref{16a2,,logging.Handler} class, application code may
instantiate formatter classes, although you could likely subclass the formatter
if your application needs special behavior.  The constructor takes three
optional arguments – a message format string, a date format string and a style
indicator.

@geindex __init__() (logging.logging.Formatter method)
@anchor{howto/logging logging logging Formatter __init__}@anchor{5ac0}
@deffn {Method} logging.Formatter.__init__ (fmt=None, datefmt=None, style='%')
@end deffn

If there is no message format string, the default is to use the
raw message.  If there is no date format string, the default date format is:

@example
%Y-%m-%d %H:%M:%S
@end example

with the milliseconds tacked on at the end. The @code{style} is one of @code{'%'},
@code{'@{'}, or @code{'$'}. If one of these is not specified, then @code{'%'} will be used.

If the @code{style} is @code{'%'}, the message format string uses
@code{%(<dictionary key>)s} styled string substitution; the possible keys are
documented in @ref{31ce,,LogRecord attributes}. If the style is @code{'@{'}, the message
format string is assumed to be compatible with @ref{834,,str.format()} (using
keyword arguments), while if the style is @code{'$'} then the message format string
should conform to what is expected by @ref{2119,,string.Template.substitute()}.


Changed in version 3.2: Added the @code{style} parameter.


The following message format string will log the time in a human-readable
format, the severity of the message, and the contents of the message, in that
order:

@example
'%(asctime)s - %(levelname)s - %(message)s'
@end example

Formatters use a user-configurable function to convert the creation time of a
record to a tuple. By default, @ref{1705,,time.localtime()} is used; to change this
for a particular formatter instance, set the @code{converter} attribute of the
instance to a function with the same signature as @code{time.localtime()} or
@ref{13cc,,time.gmtime()}. To change it for all formatters, for example if you want
all logging times to be shown in GMT, set the @code{converter} attribute in the
Formatter class (to @code{time.gmtime} for GMT display).

@node Configuring Logging,What happens if no configuration is provided,Formatters,Advanced Logging Tutorial
@anchor{howto/logging configuring-logging}@anchor{5ac1}
@subsubsection Configuring Logging


Programmers can configure logging in three ways:


@enumerate 

@item 
Creating loggers, handlers, and formatters explicitly using Python
code that calls the configuration methods listed above.

@item 
Creating a logging config file and reading it using the @ref{d4e,,fileConfig()}
function.

@item 
Creating a dictionary of configuration information and passing it
to the @ref{13bc,,dictConfig()} function.
@end enumerate

For the reference documentation on the last two options, see
@ref{14fd,,Configuration functions}.  The following example configures a very simple
logger, a console handler, and a simple formatter using Python code:

@example
import logging

# create logger
logger = logging.getLogger('simple_example')
logger.setLevel(logging.DEBUG)

# create console handler and set level to debug
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)

# create formatter
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

# add formatter to ch
ch.setFormatter(formatter)

# add ch to logger
logger.addHandler(ch)

# 'application' code
logger.debug('debug message')
logger.info('info message')
logger.warning('warn message')
logger.error('error message')
logger.critical('critical message')
@end example

Running this module from the command line produces the following output:

@example
$ python simple_logging_module.py
2005-03-19 15:10:26,618 - simple_example - DEBUG - debug message
2005-03-19 15:10:26,620 - simple_example - INFO - info message
2005-03-19 15:10:26,695 - simple_example - WARNING - warn message
2005-03-19 15:10:26,697 - simple_example - ERROR - error message
2005-03-19 15:10:26,773 - simple_example - CRITICAL - critical message
@end example

The following Python module creates a logger, handler, and formatter nearly
identical to those in the example listed above, with the only difference being
the names of the objects:

@example
import logging
import logging.config

logging.config.fileConfig('logging.conf')

# create logger
logger = logging.getLogger('simpleExample')

# 'application' code
logger.debug('debug message')
logger.info('info message')
logger.warning('warn message')
logger.error('error message')
logger.critical('critical message')
@end example

Here is the logging.conf file:

@example
[loggers]
keys=root,simpleExample

[handlers]
keys=consoleHandler

[formatters]
keys=simpleFormatter

[logger_root]
level=DEBUG
handlers=consoleHandler

[logger_simpleExample]
level=DEBUG
handlers=consoleHandler
qualname=simpleExample
propagate=0

[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=simpleFormatter
args=(sys.stdout,)

[formatter_simpleFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
@end example

The output is nearly identical to that of the non-config-file-based example:

@example
$ python simple_logging_config.py
2005-03-19 15:38:55,977 - simpleExample - DEBUG - debug message
2005-03-19 15:38:55,979 - simpleExample - INFO - info message
2005-03-19 15:38:56,054 - simpleExample - WARNING - warn message
2005-03-19 15:38:56,055 - simpleExample - ERROR - error message
2005-03-19 15:38:56,130 - simpleExample - CRITICAL - critical message
@end example

You can see that the config file approach has a few advantages over the Python
code approach, mainly separation of configuration and code and the ability of
noncoders to easily modify the logging properties.

@cartouche
@quotation Warning 
The @ref{d4e,,fileConfig()} function takes a default parameter,
@code{disable_existing_loggers}, which defaults to @code{True} for reasons of
backward compatibility. This may or may not be what you want, since it
will cause any non-root loggers existing before the @code{fileConfig()}
call to be disabled unless they (or an ancestor) are explicitly named in
the configuration. Please refer to the reference documentation for more
information, and specify @code{False} for this parameter if you wish.

The dictionary passed to @ref{13bc,,dictConfig()} can also specify a Boolean
value with key @code{disable_existing_loggers}, which if not specified
explicitly in the dictionary also defaults to being interpreted as
@code{True}. This leads to the logger-disabling behaviour described above,
which may not be what you want - in which case, provide the key
explicitly with a value of @code{False}.
@end quotation
@end cartouche

Note that the class names referenced in config files need to be either relative
to the logging module, or absolute values which can be resolved using normal
import mechanisms. Thus, you could use either
@ref{324d,,WatchedFileHandler} (relative to the logging module) or
@code{mypackage.mymodule.MyHandler} (for a class defined in package @code{mypackage}
and module @code{mymodule}, where @code{mypackage} is available on the Python import
path).

In Python 3.2, a new means of configuring logging has been introduced, using
dictionaries to hold configuration information. This provides a superset of the
functionality of the config-file-based approach outlined above, and is the
recommended configuration method for new applications and deployments. Because
a Python dictionary is used to hold configuration information, and since you
can populate that dictionary using different means, you have more options for
configuration. For example, you can use a configuration file in JSON format,
or, if you have access to YAML processing functionality, a file in YAML
format, to populate the configuration dictionary. Or, of course, you can
construct the dictionary in Python code, receive it in pickled form over a
socket, or use whatever approach makes sense for your application.

Here’s an example of the same configuration as above, in YAML format for
the new dictionary-based approach:

@example
version: 1
formatters:
  simple:
    format: '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
handlers:
  console:
    class: logging.StreamHandler
    level: DEBUG
    formatter: simple
    stream: ext://sys.stdout
loggers:
  simpleExample:
    level: DEBUG
    handlers: [console]
    propagate: no
root:
  level: DEBUG
  handlers: [console]
@end example

For more information about logging using a dictionary, see
@ref{14fd,,Configuration functions}.

@node What happens if no configuration is provided,Configuring Logging for a Library,Configuring Logging,Advanced Logging Tutorial
@anchor{howto/logging what-happens-if-no-configuration-is-provided}@anchor{5ac2}
@subsubsection What happens if no configuration is provided


If no logging configuration is provided, it is possible to have a situation
where a logging event needs to be output, but no handlers can be found to
output the event.

The event is output using a ‘handler of last resort’, stored in
@ref{1406,,lastResort}. This internal handler is not associated with any
logger, and acts like a @ref{1404,,StreamHandler} which writes the
event description message to the current value of @code{sys.stderr} (therefore
respecting any redirections which may be in effect). No formatting is
done on the message - just the bare event description message is printed.
The handler’s level is set to @code{WARNING}, so all events at this and
greater severities will be output.


Changed in version 3.2: For versions of Python prior to 3.2, the behaviour is as follows:


@itemize *

@item 
If @ref{1405,,raiseExceptions} is @code{False} (production mode), the event is
silently dropped.

@item 
If @ref{1405,,raiseExceptions} is @code{True} (development mode), a message
‘No handlers could be found for logger X.Y.Z’ is printed once.
@end itemize

To obtain the pre-3.2 behaviour,
@ref{1406,,lastResort} can be set to @code{None}.


@node Configuring Logging for a Library,,What happens if no configuration is provided,Advanced Logging Tutorial
@anchor{howto/logging configuring-logging-for-a-library}@anchor{5ac3}@anchor{howto/logging library-config}@anchor{324a}
@subsubsection Configuring Logging for a Library


When developing a library which uses logging, you should take care to
document how the library uses logging - for example, the names of loggers
used. Some consideration also needs to be given to its logging configuration.
If the using application does not use logging, and library code makes logging
calls, then (as described in the previous section) events of severity
@code{WARNING} and greater will be printed to @code{sys.stderr}. This is regarded as
the best default behaviour.

If for some reason you `don’t' want these messages printed in the absence of
any logging configuration, you can attach a do-nothing handler to the top-level
logger for your library. This avoids the message being printed, since a handler
will always be found for the library’s events: it just doesn’t produce any
output. If the library user configures logging for application use, presumably
that configuration will add some handlers, and if levels are suitably
configured then logging calls made in library code will send output to those
handlers, as normal.

A do-nothing handler is included in the logging package:
@ref{1490,,NullHandler} (since Python 3.1). An instance of this handler
could be added to the top-level logger of the logging namespace used by the
library (`if' you want to prevent your library’s logged events being output to
@code{sys.stderr} in the absence of logging configuration). If all logging by a
library `foo' is done using loggers with names matching ‘foo.x’, ‘foo.x.y’,
etc. then the code:

@example
import logging
logging.getLogger('foo').addHandler(logging.NullHandler())
@end example

should have the desired effect. If an organisation produces a number of
libraries, then the logger name specified can be ‘orgname.foo’ rather than
just ‘foo’.

@cartouche
@quotation Note 
It is strongly advised that you `do not log to the root logger'
in your library. Instead, use a logger with a unique and easily
identifiable name, such as the @code{__name__} for your library’s top-level package
or module. Logging to the root logger will make it difficult or impossible for
the application developer to configure the logging verbosity or handlers of
your library as they wish.
@end quotation
@end cartouche

@cartouche
@quotation Note 
It is strongly advised that you `do not add any handlers other
than' @ref{1490,,NullHandler} `to your library’s loggers'. This is
because the configuration of handlers is the prerogative of the application
developer who uses your library. The application developer knows their
target audience and what handlers are most appropriate for their
application: if you add handlers ‘under the hood’, you might well interfere
with their ability to carry out unit tests and deliver logs which suit their
requirements.
@end quotation
@end cartouche

@node Logging Levels<2>,Useful Handlers,Advanced Logging Tutorial,Logging HOWTO
@anchor{howto/logging logging-levels}@anchor{5ac4}
@subsection Logging Levels


The numeric values of logging levels are given in the following table. These are
primarily of interest if you want to define your own levels, and need them to
have specific values relative to the predefined levels. If you define a level
with the same numeric value, it overwrites the predefined value; the predefined
name is lost.


@multitable {xxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxx} 
@headitem

Level

@tab

Numeric value

@item

@code{CRITICAL}

@tab

50

@item

@code{ERROR}

@tab

40

@item

@code{WARNING}

@tab

30

@item

@code{INFO}

@tab

20

@item

@code{DEBUG}

@tab

10

@item

@code{NOTSET}

@tab

0

@end multitable


Levels can also be associated with loggers, being set either by the developer or
through loading a saved logging configuration. When a logging method is called
on a logger, the logger compares its own level with the level associated with
the method call. If the logger’s level is higher than the method call’s, no
logging message is actually generated. This is the basic mechanism controlling
the verbosity of logging output.

Logging messages are encoded as instances of the @ref{11ec,,LogRecord}
class. When a logger decides to actually log an event, a
@code{LogRecord} instance is created from the logging message.

Logging messages are subjected to a dispatch mechanism through the use of
`handlers', which are instances of subclasses of the @ref{16a2,,Handler}
class. Handlers are responsible for ensuring that a logged message (in the form
of a @ref{11ec,,LogRecord}) ends up in a particular location (or set of locations)
which is useful for the target audience for that message (such as end users,
support desk staff, system administrators, developers). Handlers are passed
@code{LogRecord} instances intended for particular destinations. Each logger
can have zero, one or more handlers associated with it (via the
@ref{31c9,,addHandler()} method of @ref{d4c,,Logger}). In addition to any
handlers directly associated with a logger, `all handlers associated with all
ancestors of the logger' are called to dispatch the message (unless the
`propagate' flag for a logger is set to a false value, at which point the
passing to ancestor handlers stops).

Just as for loggers, handlers can have levels associated with them. A handler’s
level acts as a filter in the same way as a logger’s level does. If a handler
decides to actually dispatch an event, the @ref{31e9,,emit()} method is used
to send the message to its destination. Most user-defined subclasses of
@ref{16a2,,Handler} will need to override this @code{emit()}.

@menu
* Custom Levels:: 

@end menu

@node Custom Levels,,,Logging Levels<2>
@anchor{howto/logging custom-levels}@anchor{3212}@anchor{howto/logging id2}@anchor{5ac5}
@subsubsection Custom Levels


Defining your own levels is possible, but should not be necessary, as the
existing levels have been chosen on the basis of practical experience.
However, if you are convinced that you need custom levels, great care should
be exercised when doing this, and it is possibly `a very bad idea to define
custom levels if you are developing a library'. That’s because if multiple
library authors all define their own custom levels, there is a chance that
the logging output from such multiple libraries used together will be
difficult for the using developer to control and/or interpret, because a
given numeric value might mean different things for different libraries.

@node Useful Handlers,Exceptions raised during logging,Logging Levels<2>,Logging HOWTO
@anchor{howto/logging id3}@anchor{5ac6}@anchor{howto/logging useful-handlers}@anchor{5abe}
@subsection Useful Handlers


In addition to the base @ref{16a2,,Handler} class, many useful subclasses are
provided:


@enumerate 

@item 
@ref{1404,,StreamHandler} instances send messages to streams (file-like
objects).

@item 
@ref{1c96,,FileHandler} instances send messages to disk files.

@item 
@ref{3251,,BaseRotatingHandler} is the base class for handlers that
rotate log files at a certain point. It is not meant to be  instantiated
directly. Instead, use @ref{1985,,RotatingFileHandler} or
@ref{1167,,TimedRotatingFileHandler}.

@item 
@ref{1985,,RotatingFileHandler} instances send messages to disk
files, with support for maximum log file sizes and log file rotation.

@item 
@ref{1167,,TimedRotatingFileHandler} instances send messages to
disk files, rotating the log file at certain timed intervals.

@item 
@ref{1168,,SocketHandler} instances send messages to TCP/IP
sockets. Since 3.4, Unix domain sockets are also supported.

@item 
@ref{1169,,DatagramHandler} instances send messages to UDP
sockets. Since 3.4, Unix domain sockets are also supported.

@item 
@ref{18f8,,SMTPHandler} instances send messages to a designated
email address.

@item 
@ref{86e,,SysLogHandler} instances send messages to a Unix
syslog daemon, possibly on a remote machine.

@item 
@ref{3277,,NTEventLogHandler} instances send messages to a
Windows NT/2000/XP event log.

@item 
@ref{3230,,MemoryHandler} instances send messages to a buffer
in memory, which is flushed whenever specific criteria are met.

@item 
@ref{1032,,HTTPHandler} instances send messages to an HTTP
server using either @code{GET} or @code{POST} semantics.

@item 
@ref{324d,,WatchedFileHandler} instances watch the file they are
logging to. If the file changes, it is closed and reopened using the file
name. This handler is only useful on Unix-like systems; Windows does not
support the underlying mechanism used.

@item 
@ref{1ba5,,QueueHandler} instances send messages to a queue, such as
those implemented in the @ref{bb,,queue} or @ref{98,,multiprocessing} modules.

@item 
@ref{1490,,NullHandler} instances do nothing with error messages. They are used
by library developers who want to use logging, but want to avoid the ‘No
handlers could be found for logger `XXX'’ message which can be displayed if
the library user has not configured logging. See @ref{324a,,Configuring Logging for a Library} for
more information.
@end enumerate


Added in version 3.1: The @ref{1490,,NullHandler} class.



Added in version 3.2: The @ref{1ba5,,QueueHandler} class.


The @ref{1490,,NullHandler}, @ref{1404,,StreamHandler} and @ref{1c96,,FileHandler}
classes are defined in the core logging package. The other handlers are
defined in a sub-module, @ref{8d,,logging.handlers}. (There is also another
sub-module, @ref{8c,,logging.config}, for configuration functionality.)

Logged messages are formatted for presentation through instances of the
@ref{16a3,,Formatter} class. They are initialized with a format string suitable for
use with the % operator and a dictionary.

For formatting multiple messages in a batch, instances of
@ref{31f2,,BufferingFormatter} can be used. In addition to the format
string (which is applied to each message in the batch), there is provision for
header and trailer format strings.

When filtering based on logger level and/or handler level is not enough,
instances of @ref{1407,,Filter} can be added to both @ref{d4c,,Logger} and
@ref{16a2,,Handler} instances (through their @ref{31e2,,addFilter()} method).
Before deciding to process a message further, both loggers and handlers consult
all their filters for permission. If any filter returns a false value, the
message is not processed further.

The basic @ref{1407,,Filter} functionality allows filtering by specific logger
name. If this feature is used, messages sent to the named logger and its
children are allowed through the filter, and all others dropped.

@node Exceptions raised during logging,Using arbitrary objects as messages,Useful Handlers,Logging HOWTO
@anchor{howto/logging exceptions-raised-during-logging}@anchor{5ac7}@anchor{howto/logging logging-exceptions}@anchor{5ac8}
@subsection Exceptions raised during logging


The logging package is designed to swallow exceptions which occur while logging
in production. This is so that errors which occur while handling logging events
- such as logging misconfiguration, network or other similar errors - do not
cause the application using logging to terminate prematurely.

@ref{f42,,SystemExit} and @ref{bcb,,KeyboardInterrupt} exceptions are never
swallowed. Other exceptions which occur during the @ref{31e9,,emit()} method
of a @ref{16a2,,Handler} subclass are passed to its @ref{31e8,,handleError()}
method.

The default implementation of @ref{31e8,,handleError()} in @ref{16a2,,Handler}
checks to see if a module-level variable, @ref{1405,,raiseExceptions}, is set. If
set, a traceback is printed to @ref{b39,,sys.stderr}. If not set, the exception is
swallowed.

@cartouche
@quotation Note 
The default value of @ref{1405,,raiseExceptions} is @code{True}. This is
because during development, you typically want to be notified of any
exceptions that occur. It’s advised that you set @code{raiseExceptions} to
@code{False} for production usage.
@end quotation
@end cartouche

@node Using arbitrary objects as messages,Optimization,Exceptions raised during logging,Logging HOWTO
@anchor{howto/logging arbitrary-object-messages}@anchor{31fe}@anchor{howto/logging using-arbitrary-objects-as-messages}@anchor{5ac9}
@subsection Using arbitrary objects as messages


In the preceding sections and examples, it has been assumed that the message
passed when logging the event is a string. However, this is not the only
possibility. You can pass an arbitrary object as a message, and its
@ref{831,,__str__()} method will be called when the logging system needs to
convert it to a string representation. In fact, if you want to, you can avoid
computing a string representation altogether - for example, the
@ref{1168,,SocketHandler} emits an event by pickling it and sending it
over the wire.

@node Optimization,Other resources,Using arbitrary objects as messages,Logging HOWTO
@anchor{howto/logging optimization}@anchor{5aca}
@subsection Optimization


Formatting of message arguments is deferred until it cannot be avoided.
However, computing the arguments passed to the logging method can also be
expensive, and you may want to avoid doing it if the logger will just throw
away your event. To decide what to do, you can call the
@ref{1502,,isEnabledFor()} method which takes a level argument and returns
true if the event would be created by the Logger for that level of call.
You can write code like this:

@example
if logger.isEnabledFor(logging.DEBUG):
    logger.debug('Message with %s, %s', expensive_func1(),
                                        expensive_func2())
@end example

so that if the logger’s threshold is set above @code{DEBUG}, the calls to
@code{expensive_func1} and @code{expensive_func2} are never made.

@cartouche
@quotation Note 
In some cases, @ref{1502,,isEnabledFor()} can itself be more
expensive than you’d like (e.g. for deeply nested loggers where an explicit
level is only set high up in the logger hierarchy). In such cases (or if you
want to avoid calling a method in tight loops), you can cache the result of a
call to @code{isEnabledFor()} in a local or instance variable, and use
that instead of calling the method each time. Such a cached value would only
need to be recomputed when the logging configuration changes dynamically
while the application is running (which is not all that common).
@end quotation
@end cartouche

There are other optimizations which can be made for specific applications which
need more precise control over what logging information is collected. Here’s a
list of things you can do to avoid processing during logging which you don’t
need:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

What you don’t want to collect

@tab

How to avoid collecting it

@item

Information about where calls were made from.

@tab

Set @code{logging._srcfile} to @code{None}.
This avoids calling @ref{8f2,,sys._getframe()}, which
may help to speed up your code in environments
like PyPy (which can’t speed up code that uses
@code{sys._getframe()}).

@item

Threading information.

@tab

Set @code{logging.logThreads} to @code{False}.

@item

Current process ID (@ref{3071,,os.getpid()})

@tab

Set @code{logging.logProcesses} to @code{False}.

@item

Current process name when using @code{multiprocessing}
to manage multiple processes.

@tab

Set @code{logging.logMultiprocessing} to @code{False}.

@item

Current @ref{1c9,,asyncio.Task} name when using
@code{asyncio}.

@tab

Set @code{logging.logAsyncioTasks} to @code{False}.

@end multitable


Also note that the core logging module only includes the basic handlers. If
you don’t import @ref{8d,,logging.handlers} and @ref{8c,,logging.config}, they won’t
take up any memory.

@node Other resources,,Optimization,Logging HOWTO
@anchor{howto/logging other-resources}@anchor{5acb}@anchor{howto/logging tutorial-ref-links}@anchor{5aaf}
@subsection Other resources



@subsubheading See also



@table @asis

@item Module @ref{8b,,logging}

API reference for the logging module.

@item Module @ref{8c,,logging.config}

Configuration API for the logging module.

@item Module @ref{8d,,logging.handlers}

Useful handlers included with the logging module.
@end table

@ref{1403,,A logging cookbook}


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Logging Cookbook,Regular expression HOWTO,Logging HOWTO,Python HOWTOs
@anchor{howto/logging-cookbook doc}@anchor{5acc}@anchor{howto/logging-cookbook id1}@anchor{5acd}@anchor{howto/logging-cookbook logging-cookbook}@anchor{1403}@anchor{howto/logging-cookbook translation-repo}@anchor{5ace}
@section Logging Cookbook


@*Author: 
Vinay Sajip <vinay_sajip at red-dove dot com>


This page contains a number of recipes related to logging, which have been found
useful in the past. For links to tutorial and reference information, please see
@ref{5acf,,Other resources}.

@menu
* Using logging in multiple modules:: 
* Logging from multiple threads:: 
* Multiple handlers and formatters:: 
* Logging to multiple destinations:: 
* Custom handling of levels:: 
* Configuration server example:: 
* Dealing with handlers that block:: 
* Sending and receiving logging events across a network:: 
* Adding contextual information to your logging output:: 
* Use of contextvars:: 
* Imparting contextual information in handlers:: 
* Logging to a single file from multiple processes:: 
* Using file rotation:: 
* Use of alternative formatting styles:: 
* Customizing LogRecord:: 
* Subclassing QueueHandler and QueueListener- a ZeroMQ example:: 
* Subclassing QueueHandler and QueueListener- a pynng example:: 
* An example dictionary-based configuration:: 
* Using a rotator and namer to customize log rotation processing:: 
* A more elaborate multiprocessing example:: 
* Inserting a BOM into messages sent to a SysLogHandler:: 
* Implementing structured logging:: 
* Customizing handlers with dictConfig(): Customizing handlers with dictConfig. 
* Using particular formatting styles throughout your application:: 
* Configuring filters with dictConfig(): Configuring filters with dictConfig. 
* Customized exception formatting:: 
* Speaking logging messages:: 
* Buffering logging messages and outputting them conditionally:: 
* Sending logging messages to email@comma{} with buffering: Sending logging messages to email with buffering. 
* Formatting times using UTC (GMT) via configuration: Formatting times using UTC GMT via configuration. 
* Using a context manager for selective logging:: 
* A CLI application starter template:: 
* A Qt GUI for logging:: 
* Logging to syslog with RFC5424 support:: 
* How to treat a logger like an output stream:: 
* How to uniformly handle newlines in logging output:: 
* Patterns to avoid:: 
* Other resources: Other resources<2>. 

@end menu

@node Using logging in multiple modules,Logging from multiple threads,,Logging Cookbook
@anchor{howto/logging-cookbook using-logging-in-multiple-modules}@anchor{5ad0}
@subsection Using logging in multiple modules


Multiple calls to @code{logging.getLogger('someLogger')} return a reference to the
same logger object.  This is true not only within the same module, but also
across modules as long as it is in the same Python interpreter process.  It is
true for references to the same object; additionally, application code can
define and configure a parent logger in one module and create (but not
configure) a child logger in a separate module, and all logger calls to the
child will pass up to the parent.  Here is a main module:

@example
import logging
import auxiliary_module

# create logger with 'spam_application'
logger = logging.getLogger('spam_application')
logger.setLevel(logging.DEBUG)
# create file handler which logs even debug messages
fh = logging.FileHandler('spam.log')
fh.setLevel(logging.DEBUG)
# create console handler with a higher log level
ch = logging.StreamHandler()
ch.setLevel(logging.ERROR)
# create formatter and add it to the handlers
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
ch.setFormatter(formatter)
# add the handlers to the logger
logger.addHandler(fh)
logger.addHandler(ch)

logger.info('creating an instance of auxiliary_module.Auxiliary')
a = auxiliary_module.Auxiliary()
logger.info('created an instance of auxiliary_module.Auxiliary')
logger.info('calling auxiliary_module.Auxiliary.do_something')
a.do_something()
logger.info('finished auxiliary_module.Auxiliary.do_something')
logger.info('calling auxiliary_module.some_function()')
auxiliary_module.some_function()
logger.info('done with auxiliary_module.some_function()')
@end example

Here is the auxiliary module:

@example
import logging

# create logger
module_logger = logging.getLogger('spam_application.auxiliary')

class Auxiliary:
    def __init__(self):
        self.logger = logging.getLogger('spam_application.auxiliary.Auxiliary')
        self.logger.info('creating an instance of Auxiliary')

    def do_something(self):
        self.logger.info('doing something')
        a = 1 + 1
        self.logger.info('done doing something')

def some_function():
    module_logger.info('received a call to "some_function"')
@end example

The output looks like this:

@example
2005-03-23 23:47:11,663 - spam_application - INFO -
   creating an instance of auxiliary_module.Auxiliary
2005-03-23 23:47:11,665 - spam_application.auxiliary.Auxiliary - INFO -
   creating an instance of Auxiliary
2005-03-23 23:47:11,665 - spam_application - INFO -
   created an instance of auxiliary_module.Auxiliary
2005-03-23 23:47:11,668 - spam_application - INFO -
   calling auxiliary_module.Auxiliary.do_something
2005-03-23 23:47:11,668 - spam_application.auxiliary.Auxiliary - INFO -
   doing something
2005-03-23 23:47:11,669 - spam_application.auxiliary.Auxiliary - INFO -
   done doing something
2005-03-23 23:47:11,670 - spam_application - INFO -
   finished auxiliary_module.Auxiliary.do_something
2005-03-23 23:47:11,671 - spam_application - INFO -
   calling auxiliary_module.some_function()
2005-03-23 23:47:11,672 - spam_application.auxiliary - INFO -
   received a call to 'some_function'
2005-03-23 23:47:11,673 - spam_application - INFO -
   done with auxiliary_module.some_function()
@end example

@node Logging from multiple threads,Multiple handlers and formatters,Using logging in multiple modules,Logging Cookbook
@anchor{howto/logging-cookbook logging-from-multiple-threads}@anchor{5ad1}
@subsection Logging from multiple threads


Logging from multiple threads requires no special effort. The following example
shows logging from the main (initial) thread and another thread:

@example
import logging
import threading
import time

def worker(arg):
    while not arg['stop']:
        logging.debug('Hi from myfunc')
        time.sleep(0.5)

def main():
    logging.basicConfig(level=logging.DEBUG, format='%(relativeCreated)6d %(threadName)s %(message)s')
    info = @{'stop': False@}
    thread = threading.Thread(target=worker, args=(info,))
    thread.start()
    while True:
        try:
            logging.debug('Hello from main')
            time.sleep(0.75)
        except KeyboardInterrupt:
            info['stop'] = True
            break
    thread.join()

if __name__ == '__main__':
    main()
@end example

When run, the script should print something like the following:

@example
   0 Thread-1 Hi from myfunc
   3 MainThread Hello from main
 505 Thread-1 Hi from myfunc
 755 MainThread Hello from main
1007 Thread-1 Hi from myfunc
1507 MainThread Hello from main
1508 Thread-1 Hi from myfunc
2010 Thread-1 Hi from myfunc
2258 MainThread Hello from main
2512 Thread-1 Hi from myfunc
3009 MainThread Hello from main
3013 Thread-1 Hi from myfunc
3515 Thread-1 Hi from myfunc
3761 MainThread Hello from main
4017 Thread-1 Hi from myfunc
4513 MainThread Hello from main
4518 Thread-1 Hi from myfunc
@end example

This shows the logging output interspersed as one might expect. This approach
works for more threads than shown here, of course.

@node Multiple handlers and formatters,Logging to multiple destinations,Logging from multiple threads,Logging Cookbook
@anchor{howto/logging-cookbook multiple-handlers-and-formatters}@anchor{5ad2}
@subsection Multiple handlers and formatters


Loggers are plain Python objects.  The @ref{31c9,,addHandler()} method has no
minimum or maximum quota for the number of handlers you may add.  Sometimes it
will be beneficial for an application to log all messages of all severities to a
text file while simultaneously logging errors or above to the console.  To set
this up, simply configure the appropriate handlers.  The logging calls in the
application code will remain unchanged.  Here is a slight modification to the
previous simple module-based configuration example:

@example
import logging

logger = logging.getLogger('simple_example')
logger.setLevel(logging.DEBUG)
# create file handler which logs even debug messages
fh = logging.FileHandler('spam.log')
fh.setLevel(logging.DEBUG)
# create console handler with a higher log level
ch = logging.StreamHandler()
ch.setLevel(logging.ERROR)
# create formatter and add it to the handlers
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
ch.setFormatter(formatter)
fh.setFormatter(formatter)
# add the handlers to logger
logger.addHandler(ch)
logger.addHandler(fh)

# 'application' code
logger.debug('debug message')
logger.info('info message')
logger.warning('warn message')
logger.error('error message')
logger.critical('critical message')
@end example

Notice that the ‘application’ code does not care about multiple handlers.  All
that changed was the addition and configuration of a new handler named `fh'.

The ability to create new handlers with higher- or lower-severity filters can be
very helpful when writing and testing an application.  Instead of using many
@code{print} statements for debugging, use @code{logger.debug}: Unlike the print
statements, which you will have to delete or comment out later, the logger.debug
statements can remain intact in the source code and remain dormant until you
need them again.  At that time, the only change that needs to happen is to
modify the severity level of the logger and/or handler to debug.

@node Logging to multiple destinations,Custom handling of levels,Multiple handlers and formatters,Logging Cookbook
@anchor{howto/logging-cookbook logging-to-multiple-destinations}@anchor{5ad3}@anchor{howto/logging-cookbook multiple-destinations}@anchor{5ad4}
@subsection Logging to multiple destinations


Let’s say you want to log to console and file with different message formats and
in differing circumstances. Say you want to log messages with levels of DEBUG
and higher to file, and those messages at level INFO and higher to the console.
Let’s also assume that the file should contain timestamps, but the console
messages should not. Here’s how you can achieve this:

@example
import logging

# set up logging to file - see previous section for more details
logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
                    datefmt='%m-%d %H:%M',
                    filename='/tmp/myapp.log',
                    filemode='w')
# define a Handler which writes INFO messages or higher to the sys.stderr
console = logging.StreamHandler()
console.setLevel(logging.INFO)
# set a format which is simpler for console use
formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
# tell the handler to use this format
console.setFormatter(formatter)
# add the handler to the root logger
logging.getLogger().addHandler(console)

# Now, we can log to the root logger, or any other logger. First the root...
logging.info('Jackdaws love my big sphinx of quartz.')

# Now, define a couple of other loggers which might represent areas in your
# application:

logger1 = logging.getLogger('myapp.area1')
logger2 = logging.getLogger('myapp.area2')

logger1.debug('Quick zephyrs blow, vexing daft Jim.')
logger1.info('How quickly daft jumping zebras vex.')
logger2.warning('Jail zesty vixen who grabbed pay from quack.')
logger2.error('The five boxing wizards jump quickly.')
@end example

When you run this, on the console you will see

@example
root        : INFO     Jackdaws love my big sphinx of quartz.
myapp.area1 : INFO     How quickly daft jumping zebras vex.
myapp.area2 : WARNING  Jail zesty vixen who grabbed pay from quack.
myapp.area2 : ERROR    The five boxing wizards jump quickly.
@end example

and in the file you will see something like

@example
10-22 22:19 root         INFO     Jackdaws love my big sphinx of quartz.
10-22 22:19 myapp.area1  DEBUG    Quick zephyrs blow, vexing daft Jim.
10-22 22:19 myapp.area1  INFO     How quickly daft jumping zebras vex.
10-22 22:19 myapp.area2  WARNING  Jail zesty vixen who grabbed pay from quack.
10-22 22:19 myapp.area2  ERROR    The five boxing wizards jump quickly.
@end example

As you can see, the DEBUG message only shows up in the file. The other messages
are sent to both destinations.

This example uses console and file handlers, but you can use any number and
combination of handlers you choose.

Note that the above choice of log filename @code{/tmp/myapp.log} implies use of a
standard location for temporary files on POSIX systems. On Windows, you may need to
choose a different directory name for the log - just ensure that the directory exists
and that you have the permissions to create and update files in it.

@node Custom handling of levels,Configuration server example,Logging to multiple destinations,Logging Cookbook
@anchor{howto/logging-cookbook custom-handling-of-levels}@anchor{5ad5}@anchor{howto/logging-cookbook custom-level-handling}@anchor{5ad6}
@subsection Custom handling of levels


Sometimes, you might want to do something slightly different from the standard
handling of levels in handlers, where all levels above a threshold get
processed by a handler. To do this, you need to use filters. Let’s look at a
scenario where you want to arrange things as follows:


@itemize *

@item 
Send messages of severity @code{INFO} and @code{WARNING} to @code{sys.stdout}

@item 
Send messages of severity @code{ERROR} and above to @code{sys.stderr}

@item 
Send messages of severity @code{DEBUG} and above to file @code{app.log}
@end itemize

Suppose you configure logging with the following JSON:

@example
@{
    "version": 1,
    "disable_existing_loggers": false,
    "formatters": @{
        "simple": @{
            "format": "%(levelname)-8s - %(message)s"
        @}
    @},
    "handlers": @{
        "stdout": @{
            "class": "logging.StreamHandler",
            "level": "INFO",
            "formatter": "simple",
            "stream": "ext://sys.stdout"
        @},
        "stderr": @{
            "class": "logging.StreamHandler",
            "level": "ERROR",
            "formatter": "simple",
            "stream": "ext://sys.stderr"
        @},
        "file": @{
            "class": "logging.FileHandler",
            "formatter": "simple",
            "filename": "app.log",
            "mode": "w"
        @}
    @},
    "root": @{
        "level": "DEBUG",
        "handlers": [
            "stderr",
            "stdout",
            "file"
        ]
    @}
@}
@end example

This configuration does `almost' what we want, except that @code{sys.stdout} would show messages
of severity @code{ERROR} and only events of this severity and higher will be tracked
as well as @code{INFO} and @code{WARNING} messages. To prevent this, we can set up a filter which
excludes those messages and add it to the relevant handler. This can be configured by
adding a @code{filters} section parallel to @code{formatters} and @code{handlers}:

@example
@{
    "filters": @{
        "warnings_and_below": @{
            "()" : "__main__.filter_maker",
            "level": "WARNING"
        @}
    @}
@}
@end example

and changing the section on the @code{stdout} handler to add it:

@example
@{
    "stdout": @{
        "class": "logging.StreamHandler",
        "level": "INFO",
        "formatter": "simple",
        "stream": "ext://sys.stdout",
        "filters": ["warnings_and_below"]
    @}
@}
@end example

A filter is just a function, so we can define the @code{filter_maker} (a factory
function) as follows:

@example
def filter_maker(level):
    level = getattr(logging, level)

    def filter(record):
        return record.levelno <= level

    return filter
@end example

This converts the string argument passed in to a numeric level, and returns a
function which only returns @code{True} if the level of the passed in record is
at or below the specified level. Note that in this example I have defined the
@code{filter_maker} in a test script @code{main.py} that I run from the command line,
so its module will be @code{__main__} - hence the @code{__main__.filter_maker} in the
filter configuration. You will need to change that if you define it in a
different module.

With the filter added, we can run @code{main.py}, which in full is:

@example
import json
import logging
import logging.config

CONFIG = '@w{'}'
@{
    "version": 1,
    "disable_existing_loggers": false,
    "formatters": @{
        "simple": @{
            "format": "%(levelname)-8s - %(message)s"
        @}
    @},
    "filters": @{
        "warnings_and_below": @{
            "()" : "__main__.filter_maker",
            "level": "WARNING"
        @}
    @},
    "handlers": @{
        "stdout": @{
            "class": "logging.StreamHandler",
            "level": "INFO",
            "formatter": "simple",
            "stream": "ext://sys.stdout",
            "filters": ["warnings_and_below"]
        @},
        "stderr": @{
            "class": "logging.StreamHandler",
            "level": "ERROR",
            "formatter": "simple",
            "stream": "ext://sys.stderr"
        @},
        "file": @{
            "class": "logging.FileHandler",
            "formatter": "simple",
            "filename": "app.log",
            "mode": "w"
        @}
    @},
    "root": @{
        "level": "DEBUG",
        "handlers": [
            "stderr",
            "stdout",
            "file"
        ]
    @}
@}
'@w{'}'

def filter_maker(level):
    level = getattr(logging, level)

    def filter(record):
        return record.levelno <= level

    return filter

logging.config.dictConfig(json.loads(CONFIG))
logging.debug('A DEBUG message')
logging.info('An INFO message')
logging.warning('A WARNING message')
logging.error('An ERROR message')
logging.critical('A CRITICAL message')
@end example

And after running it like this:

@example
python main.py 2>stderr.log >stdout.log
@end example

We can see the results are as expected:

@example
$ more *.log
::::::::::::::
app.log
::::::::::::::
DEBUG    - A DEBUG message
INFO     - An INFO message
WARNING  - A WARNING message
ERROR    - An ERROR message
CRITICAL - A CRITICAL message
::::::::::::::
stderr.log
::::::::::::::
ERROR    - An ERROR message
CRITICAL - A CRITICAL message
::::::::::::::
stdout.log
::::::::::::::
INFO     - An INFO message
WARNING  - A WARNING message
@end example

@node Configuration server example,Dealing with handlers that block,Custom handling of levels,Logging Cookbook
@anchor{howto/logging-cookbook configuration-server-example}@anchor{5ad7}
@subsection Configuration server example


Here is an example of a module using the logging configuration server:

@example
import logging
import logging.config
import time
import os

# read initial config file
logging.config.fileConfig('logging.conf')

# create and start listener on port 9999
t = logging.config.listen(9999)
t.start()

logger = logging.getLogger('simpleExample')

try:
    # loop through logging calls to see the difference
    # new configurations make, until Ctrl+C is pressed
    while True:
        logger.debug('debug message')
        logger.info('info message')
        logger.warning('warn message')
        logger.error('error message')
        logger.critical('critical message')
        time.sleep(5)
except KeyboardInterrupt:
    # cleanup
    logging.config.stopListening()
    t.join()
@end example

And here is a script that takes a filename and sends that file to the server,
properly preceded with the binary-encoded length, as the new logging
configuration:

@example
#!/usr/bin/env python
import socket, sys, struct

with open(sys.argv[1], 'rb') as f:
    data_to_send = f.read()

HOST = 'localhost'
PORT = 9999
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print('connecting...')
s.connect((HOST, PORT))
print('sending config...')
s.send(struct.pack('>L', len(data_to_send)))
s.send(data_to_send)
s.close()
print('complete')
@end example

@node Dealing with handlers that block,Sending and receiving logging events across a network,Configuration server example,Logging Cookbook
@anchor{howto/logging-cookbook blocking-handlers}@anchor{39b6}@anchor{howto/logging-cookbook dealing-with-handlers-that-block}@anchor{5ad8}
@subsection Dealing with handlers that block


Sometimes you have to get your logging handlers to do their work without
blocking the thread you’re logging from. This is common in web applications,
though of course it also occurs in other scenarios.

A common culprit which demonstrates sluggish behaviour is the
@ref{18f8,,SMTPHandler}: sending emails can take a long time, for a
number of reasons outside the developer’s control (for example, a poorly
performing mail or network infrastructure). But almost any network-based
handler can block: Even a @ref{1168,,SocketHandler} operation may do a
DNS query under the hood which is too slow (and this query can be deep in the
socket library code, below the Python layer, and outside your control).

One solution is to use a two-part approach. For the first part, attach only a
@ref{1ba5,,QueueHandler} to those loggers which are accessed from
performance-critical threads. They simply write to their queue, which can be
sized to a large enough capacity or initialized with no upper bound to their
size. The write to the queue will typically be accepted quickly, though you
will probably need to catch the @ref{36e7,,queue.Full} exception as a precaution
in your code. If you are a library developer who has performance-critical
threads in their code, be sure to document this (together with a suggestion to
attach only @code{QueueHandlers} to your loggers) for the benefit of other
developers who will use your code.

The second part of the solution is @ref{244,,QueueListener}, which has been
designed as the counterpart to @ref{1ba5,,QueueHandler}.  A
@code{QueueListener} is very simple: it’s passed a queue and some handlers,
and it fires up an internal thread which listens to its queue for LogRecords
sent from @code{QueueHandlers} (or any other source of @code{LogRecords}, for that
matter). The @code{LogRecords} are removed from the queue and passed to the
handlers for processing.

The advantage of having a separate @ref{244,,QueueListener} class is that you
can use the same instance to service multiple @code{QueueHandlers}. This is more
resource-friendly than, say, having threaded versions of the existing handler
classes, which would eat up one thread per handler for no particular benefit.

An example of using these two classes follows (imports omitted):

@example
que = queue.Queue(-1)  # no limit on size
queue_handler = QueueHandler(que)
handler = logging.StreamHandler()
listener = QueueListener(que, handler)
root = logging.getLogger()
root.addHandler(queue_handler)
formatter = logging.Formatter('%(threadName)s: %(message)s')
handler.setFormatter(formatter)
listener.start()
# The log output will display the thread which generated
# the event (the main thread) rather than the internal
# thread which monitors the internal queue. This is what
# you want to happen.
root.warning('Look out!')
listener.stop()
@end example

which, when run, will produce:

@example
MainThread: Look out!
@end example

@cartouche
@quotation Note 
Although the earlier discussion wasn’t specifically talking about
async code, but rather about slow logging handlers, it should be noted that
when logging from async code, network and even file handlers could lead to
problems (blocking the event loop) because some logging is done from
@ref{b,,asyncio} internals. It might be best, if any async code is used in an
application, to use the above approach for logging, so that any blocking code
runs only in the @code{QueueListener} thread.
@end quotation
@end cartouche


Changed in version 3.5: Prior to Python 3.5, the @ref{244,,QueueListener} always passed every message
received from the queue to every handler it was initialized with. (This was
because it was assumed that level filtering was all done on the other side,
where the queue is filled.) From 3.5 onwards, this behaviour can be changed
by passing a keyword argument @code{respect_handler_level=True} to the
listener’s constructor. When this is done, the listener compares the level
of each message with the handler’s level, and only passes a message to a
handler if it’s appropriate to do so.



Changed in version 3.14: The @ref{244,,QueueListener} can be started (and stopped) via the
@ref{187,,with} statement. For example:

@example
with QueueListener(que, handler) as listener:
    # The queue listener automatically starts
    # when the 'with' block is entered.
    pass
# The queue listener automatically stops once
# the 'with' block is exited.
@end example


@node Sending and receiving logging events across a network,Adding contextual information to your logging output,Dealing with handlers that block,Logging Cookbook
@anchor{howto/logging-cookbook network-logging}@anchor{5ad9}@anchor{howto/logging-cookbook sending-and-receiving-logging-events-across-a-network}@anchor{5ada}
@subsection Sending and receiving logging events across a network


Let’s say you want to send logging events across a network, and handle them at
the receiving end. A simple way of doing this is attaching a
@ref{1168,,SocketHandler} instance to the root logger at the sending end:

@example
import logging, logging.handlers

rootLogger = logging.getLogger()
rootLogger.setLevel(logging.DEBUG)
socketHandler = logging.handlers.SocketHandler('localhost',
                    logging.handlers.DEFAULT_TCP_LOGGING_PORT)
# don't bother with a formatter, since a socket handler sends the event as
# an unformatted pickle
rootLogger.addHandler(socketHandler)

# Now, we can log to the root logger, or any other logger. First the root...
logging.info('Jackdaws love my big sphinx of quartz.')

# Now, define a couple of other loggers which might represent areas in your
# application:

logger1 = logging.getLogger('myapp.area1')
logger2 = logging.getLogger('myapp.area2')

logger1.debug('Quick zephyrs blow, vexing daft Jim.')
logger1.info('How quickly daft jumping zebras vex.')
logger2.warning('Jail zesty vixen who grabbed pay from quack.')
logger2.error('The five boxing wizards jump quickly.')
@end example

At the receiving end, you can set up a receiver using the @ref{d2,,socketserver}
module. Here is a basic working example:

@example
import pickle
import logging
import logging.handlers
import socketserver
import struct


class LogRecordStreamHandler(socketserver.StreamRequestHandler):
    """Handler for a streaming logging request.

    This basically logs the record using whatever logging policy is
    configured locally.
    """

    def handle(self):
        """
        Handle multiple requests - each expected to be a 4-byte length,
        followed by the LogRecord in pickle format. Logs the record
        according to whatever policy is configured locally.
        """
        while True:
            chunk = self.connection.recv(4)
            if len(chunk) < 4:
                break
            slen = struct.unpack('>L', chunk)[0]
            chunk = self.connection.recv(slen)
            while len(chunk) < slen:
                chunk = chunk + self.connection.recv(slen - len(chunk))
            obj = self.unPickle(chunk)
            record = logging.makeLogRecord(obj)
            self.handleLogRecord(record)

    def unPickle(self, data):
        return pickle.loads(data)

    def handleLogRecord(self, record):
        # if a name is specified, we use the named logger rather than the one
        # implied by the record.
        if self.server.logname is not None:
            name = self.server.logname
        else:
            name = record.name
        logger = logging.getLogger(name)
        # N.B. EVERY record gets logged. This is because Logger.handle
        # is normally called AFTER logger-level filtering. If you want
        # to do filtering, do it at the client end to save wasting
        # cycles and network bandwidth!
        logger.handle(record)

class LogRecordSocketReceiver(socketserver.ThreadingTCPServer):
    """
    Simple TCP socket-based logging receiver suitable for testing.
    """

    allow_reuse_address = True

    def __init__(self, host='localhost',
                 port=logging.handlers.DEFAULT_TCP_LOGGING_PORT,
                 handler=LogRecordStreamHandler):
        socketserver.ThreadingTCPServer.__init__(self, (host, port), handler)
        self.abort = 0
        self.timeout = 1
        self.logname = None

    def serve_until_stopped(self):
        import select
        abort = 0
        while not abort:
            rd, wr, ex = select.select([self.socket.fileno()],
                                       [], [],
                                       self.timeout)
            if rd:
                self.handle_request()
            abort = self.abort

def main():
    logging.basicConfig(
        format='%(relativeCreated)5d %(name)-15s %(levelname)-8s %(message)s')
    tcpserver = LogRecordSocketReceiver()
    print('About to start TCP server...')
    tcpserver.serve_until_stopped()

if __name__ == '__main__':
    main()
@end example

First run the server, and then the client. On the client side, nothing is
printed on the console; on the server side, you should see something like:

@example
About to start TCP server...
   59 root            INFO     Jackdaws love my big sphinx of quartz.
   59 myapp.area1     DEBUG    Quick zephyrs blow, vexing daft Jim.
   69 myapp.area1     INFO     How quickly daft jumping zebras vex.
   69 myapp.area2     WARNING  Jail zesty vixen who grabbed pay from quack.
   69 myapp.area2     ERROR    The five boxing wizards jump quickly.
@end example

Note that there are some security issues with pickle in some scenarios. If
these affect you, you can use an alternative serialization scheme by overriding
the @ref{3268,,makePickle()} method and implementing your
alternative there, as well as adapting the above script to use your alternative
serialization.

@menu
* Running a logging socket listener in production:: 

@end menu

@node Running a logging socket listener in production,,,Sending and receiving logging events across a network
@anchor{howto/logging-cookbook running-a-logging-socket-listener-in-production}@anchor{5adb}
@subsubsection Running a logging socket listener in production


To run a logging listener in production, you may need to use a
process-management tool such as Supervisor@footnote{http://supervisord.org/}.
Here is a Gist@footnote{https://gist.github.com/vsajip/4b227eeec43817465ca835ca66f75e2b}
which provides the bare-bones files to run the above functionality using
Supervisor. It consists of the following files:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

File

@tab

Purpose

@item

@code{prepare.sh}

@tab

A Bash script to prepare the environment for
testing

@item

@code{supervisor.conf}

@tab

The Supervisor configuration file, which has
entries for the listener and a multi-process web
application

@item

@code{ensure_app.sh}

@tab

A Bash script to ensure that Supervisor is running
with the above configuration

@item

@code{log_listener.py}

@tab

The socket listener program which receives log
events and records them to a file

@item

@code{main.py}

@tab

A simple web application which performs logging
via a socket connected to the listener

@item

@code{webapp.json}

@tab

A JSON configuration file for the web application

@item

@code{client.py}

@tab

A Python script to exercise the web application

@end multitable


The web application uses Gunicorn@footnote{https://gunicorn.org/}, which is a
popular web application server that starts multiple worker processes to handle
requests. This example setup shows how the workers can write to the same log file
without conflicting with one another — they all go through the socket listener.

To test these files, do the following in a POSIX environment:


@enumerate 

@item 
Download the Gist@footnote{https://gist.github.com/vsajip/4b227eeec43817465ca835ca66f75e2b}
as a ZIP archive using the Download ZIP button.

@item 
Unzip the above files from the archive into a scratch directory.

@item 
In the scratch directory, run @code{bash prepare.sh} to get things ready.
This creates a @code{run} subdirectory to contain Supervisor-related and
log files, and a @code{venv} subdirectory to contain a virtual environment
into which @code{bottle}, @code{gunicorn} and @code{supervisor} are installed.

@item 
Run @code{bash ensure_app.sh} to ensure that Supervisor is running with
the above configuration.

@item 
Run @code{venv/bin/python client.py} to exercise the web application,
which will lead to records being written to the log.

@item 
Inspect the log files in the @code{run} subdirectory. You should see the
most recent log lines in files matching the pattern @code{app.log*}. They
won’t be in any particular order, since they have been handled concurrently
by different worker processes in a non-deterministic way.

@item 
You can shut down the listener and the web application by running
@code{venv/bin/supervisorctl -c supervisor.conf shutdown}.
@end enumerate

You may need to tweak the configuration files in the unlikely event that the
configured ports clash with something else in your test environment.

The default configuration uses a TCP socket on port 9020. You can use a Unix
Domain socket instead of a TCP socket by doing the following:


@enumerate 

@item 
In @code{listener.json}, add a @code{socket} key with the path to the domain
socket you want to use. If this key is present, the listener listens on the
corresponding domain socket and not on a TCP socket (the @code{port} key is
ignored).

@item 
In @code{webapp.json}, change the socket handler configuration dictionary
so that the @code{host} value is the path to the domain socket, and set the
@code{port} value to @code{null}.
@end enumerate

@node Adding contextual information to your logging output,Use of contextvars,Sending and receiving logging events across a network,Logging Cookbook
@anchor{howto/logging-cookbook adding-contextual-information-to-your-logging-output}@anchor{5adc}@anchor{howto/logging-cookbook context-info}@anchor{3205}
@subsection Adding contextual information to your logging output


Sometimes you want logging output to contain contextual information in
addition to the parameters passed to the logging call. For example, in a
networked application, it may be desirable to log client-specific information
in the log (e.g. remote client’s username, or IP address). Although you could
use the `extra' parameter to achieve this, it’s not always convenient to pass
the information in this way. While it might be tempting to create
@ref{d4c,,Logger} instances on a per-connection basis, this is not a good idea
because these instances are not garbage collected. While this is not a problem
in practice, when the number of @code{Logger} instances is dependent on the
level of granularity you want to use in logging an application, it could
be hard to manage if the number of @code{Logger} instances becomes
effectively unbounded.

@menu
* Using LoggerAdapters to impart contextual information:: 
* Using Filters to impart contextual information:: 

@end menu

@node Using LoggerAdapters to impart contextual information,Using Filters to impart contextual information,,Adding contextual information to your logging output
@anchor{howto/logging-cookbook using-loggeradapters-to-impart-contextual-information}@anchor{5add}
@subsubsection Using LoggerAdapters to impart contextual information


An easy way in which you can pass contextual information to be output along
with logging event information is to use the @ref{1501,,LoggerAdapter} class.
This class is designed to look like a @ref{d4c,,Logger}, so that you can call
@ref{31d0,,debug()}, @ref{31f9,,info()}, @ref{352,,warning()}, @ref{320d,,error()},
@ref{16a0,,exception()}, @ref{320e,,critical()} and @ref{320f,,log()}. These methods have the
same signatures as their counterparts in @code{Logger}, so you can use the
two types of instances interchangeably.

When you create an instance of @ref{1501,,LoggerAdapter}, you pass it a
@ref{d4c,,Logger} instance and a dict-like object which contains your contextual
information. When you call one of the logging methods on an instance of
@code{LoggerAdapter}, it delegates the call to the underlying instance of
@code{Logger} passed to its constructor, and arranges to pass the contextual
information in the delegated call. Here’s a snippet from the code of
@code{LoggerAdapter}:

@example
def debug(self, msg, /, *args, **kwargs):
    """
    Delegate a debug call to the underlying logger, after adding
    contextual information from this adapter instance.
    """
    msg, kwargs = self.process(msg, kwargs)
    self.logger.debug(msg, *args, **kwargs)
@end example

The @ref{3206,,process()} method of @ref{1501,,LoggerAdapter} is where the
contextual information is added to the logging output. It’s passed the message
and keyword arguments of the logging call, and it passes back (potentially)
modified versions of these to use in the call to the underlying logger. The
default implementation of this method leaves the message alone, but inserts
an ‘extra’ key in the keyword argument whose value is the dict-like object
passed to the constructor. Of course, if you had passed an ‘extra’ keyword
argument in the call to the adapter, it will be silently overwritten.

The advantage of using ‘extra’ is that the values in the dict-like object are
merged into the @ref{11ec,,LogRecord} instance’s __dict__, allowing you to use
customized strings with your @ref{16a3,,Formatter} instances which know about
the keys of the dict-like object. If you need a different method, e.g. if you
want to prepend or append the contextual information to the message string,
you just need to subclass @ref{1501,,LoggerAdapter} and override
@ref{3206,,process()} to do what you need. Here is a simple example:

@example
class CustomAdapter(logging.LoggerAdapter):
    """
    This example adapter expects the passed in dict-like object to have a
    'connid' key, whose value in brackets is prepended to the log message.
    """
    def process(self, msg, kwargs):
        return '[%s] %s' % (self.extra['connid'], msg), kwargs
@end example

which you can use like this:

@example
logger = logging.getLogger(__name__)
adapter = CustomAdapter(logger, @{'connid': some_conn_id@})
@end example

Then any events that you log to the adapter will have the value of
@code{some_conn_id} prepended to the log messages.

@menu
* Using objects other than dicts to pass contextual information:: 

@end menu

@node Using objects other than dicts to pass contextual information,,,Using LoggerAdapters to impart contextual information
@anchor{howto/logging-cookbook using-objects-other-than-dicts-to-pass-contextual-information}@anchor{5ade}
@subsubsection Using objects other than dicts to pass contextual information


You don’t need to pass an actual dict to a @ref{1501,,LoggerAdapter} - you could
pass an instance of a class which implements @code{__getitem__} and @code{__iter__} so
that it looks like a dict to logging. This would be useful if you want to
generate values dynamically (whereas the values in a dict would be constant).

@node Using Filters to impart contextual information,,Using LoggerAdapters to impart contextual information,Adding contextual information to your logging output
@anchor{howto/logging-cookbook filters-contextual}@anchor{31fa}@anchor{howto/logging-cookbook using-filters-to-impart-contextual-information}@anchor{5adf}
@subsubsection Using Filters to impart contextual information


You can also add contextual information to log output using a user-defined
@ref{1407,,Filter}. @code{Filter} instances are allowed to modify the @code{LogRecords}
passed to them, including adding additional attributes which can then be output
using a suitable format string, or if needed a custom @ref{16a3,,Formatter}.

For example in a web application, the request being processed (or at least,
the interesting parts of it) can be stored in a threadlocal
(@ref{18a8,,threading.local}) variable, and then accessed from a @code{Filter} to
add, say, information from the request - say, the remote IP address and remote
user’s username - to the @code{LogRecord}, using the attribute names ‘ip’ and
‘user’ as in the @code{LoggerAdapter} example above. In that case, the same format
string can be used to get similar output to that shown above. Here’s an example
script:

@example
import logging
from random import choice

class ContextFilter(logging.Filter):
    """
    This is a filter which injects contextual information into the log.

    Rather than use actual contextual information, we just use random
    data in this demo.
    """

    USERS = ['jim', 'fred', 'sheila']
    IPS = ['123.231.231.123', '127.0.0.1', '192.168.0.1']

    def filter(self, record):

        record.ip = choice(ContextFilter.IPS)
        record.user = choice(ContextFilter.USERS)
        return True

if __name__ == '__main__':
    levels = (logging.DEBUG, logging.INFO, logging.WARNING, logging.ERROR, logging.CRITICAL)
    logging.basicConfig(level=logging.DEBUG,
                        format='%(asctime)-15s %(name)-5s %(levelname)-8s IP: %(ip)-15s User: %(user)-8s %(message)s')
    a1 = logging.getLogger('a.b.c')
    a2 = logging.getLogger('d.e.f')

    f = ContextFilter()
    a1.addFilter(f)
    a2.addFilter(f)
    a1.debug('A debug message')
    a1.info('An info message with %s', 'some parameters')
    for x in range(10):
        lvl = choice(levels)
        lvlname = logging.getLevelName(lvl)
        a2.log(lvl, 'A message at %s level with %d %s', lvlname, 2, 'parameters')
@end example

which, when run, produces something like:

@example
2010-09-06 22:38:15,292 a.b.c DEBUG    IP: 123.231.231.123 User: fred     A debug message
2010-09-06 22:38:15,300 a.b.c INFO     IP: 192.168.0.1     User: sheila   An info message with some parameters
2010-09-06 22:38:15,300 d.e.f CRITICAL IP: 127.0.0.1       User: sheila   A message at CRITICAL level with 2 parameters
2010-09-06 22:38:15,300 d.e.f ERROR    IP: 127.0.0.1       User: jim      A message at ERROR level with 2 parameters
2010-09-06 22:38:15,300 d.e.f DEBUG    IP: 127.0.0.1       User: sheila   A message at DEBUG level with 2 parameters
2010-09-06 22:38:15,300 d.e.f ERROR    IP: 123.231.231.123 User: fred     A message at ERROR level with 2 parameters
2010-09-06 22:38:15,300 d.e.f CRITICAL IP: 192.168.0.1     User: jim      A message at CRITICAL level with 2 parameters
2010-09-06 22:38:15,300 d.e.f CRITICAL IP: 127.0.0.1       User: sheila   A message at CRITICAL level with 2 parameters
2010-09-06 22:38:15,300 d.e.f DEBUG    IP: 192.168.0.1     User: jim      A message at DEBUG level with 2 parameters
2010-09-06 22:38:15,301 d.e.f ERROR    IP: 127.0.0.1       User: sheila   A message at ERROR level with 2 parameters
2010-09-06 22:38:15,301 d.e.f DEBUG    IP: 123.231.231.123 User: fred     A message at DEBUG level with 2 parameters
2010-09-06 22:38:15,301 d.e.f INFO     IP: 123.231.231.123 User: fred     A message at INFO level with 2 parameters
@end example

@node Use of contextvars,Imparting contextual information in handlers,Adding contextual information to your logging output,Logging Cookbook
@anchor{howto/logging-cookbook use-of-contextvars}@anchor{5ae0}
@subsection Use of @code{contextvars}


Since Python 3.7, the @ref{28,,contextvars} module has provided context-local storage
which works for both @ref{f3,,threading} and @ref{b,,asyncio} processing needs. This type
of storage may thus be generally preferable to thread-locals. The following example
shows how, in a multi-threaded environment, logs can populated with contextual
information such as, for example, request attributes handled by web applications.

For the purposes of illustration, say that you have different web applications, each
independent of the other but running in the same Python process and using a library
common to them. How can each of these applications have their own log, where all
logging messages from the library (and other request processing code) are directed to
the appropriate application’s log file, while including in the log additional
contextual information such as client IP, HTTP request method and client username?

Let’s assume that the library can be simulated by the following code:

@example
# webapplib.py
import logging
import time

logger = logging.getLogger(__name__)

def useful():
    # Just a representative event logged from the library
    logger.debug('Hello from webapplib!')
    # Just sleep for a bit so other threads get to run
    time.sleep(0.01)
@end example

We can simulate the multiple web applications by means of two simple classes,
@code{Request} and @code{WebApp}. These simulate how real threaded web applications work -
each request is handled by a thread:

@example
# main.py
import argparse
from contextvars import ContextVar
import logging
import os
from random import choice
import threading
import webapplib

logger = logging.getLogger(__name__)
root = logging.getLogger()
root.setLevel(logging.DEBUG)

class Request:
    """
    A simple dummy request class which just holds dummy HTTP request method,
    client IP address and client username
    """
    def __init__(self, method, ip, user):
        self.method = method
        self.ip = ip
        self.user = user

# A dummy set of requests which will be used in the simulation - we'll just pick
# from this list randomly. Note that all GET requests are from 192.168.2.XXX
# addresses, whereas POST requests are from 192.16.3.XXX addresses. Three users
# are represented in the sample requests.

REQUESTS = [
    Request('GET', '192.168.2.20', 'jim'),
    Request('POST', '192.168.3.20', 'fred'),
    Request('GET', '192.168.2.21', 'sheila'),
    Request('POST', '192.168.3.21', 'jim'),
    Request('GET', '192.168.2.22', 'fred'),
    Request('POST', '192.168.3.22', 'sheila'),
]

# Note that the format string includes references to request context information
# such as HTTP method, client IP and username

formatter = logging.Formatter('%(threadName)-11s %(appName)s %(name)-9s %(user)-6s %(ip)s %(method)-4s %(message)s')

# Create our context variables. These will be filled at the start of request
# processing, and used in the logging that happens during that processing

ctx_request = ContextVar('request')
ctx_appname = ContextVar('appname')

class InjectingFilter(logging.Filter):
    """
    A filter which injects context-specific information into logs and ensures
    that only information for a specific webapp is included in its log
    """
    def __init__(self, app):
        self.app = app

    def filter(self, record):
        request = ctx_request.get()
        record.method = request.method
        record.ip = request.ip
        record.user = request.user
        record.appName = appName = ctx_appname.get()
        return appName == self.app.name

class WebApp:
    """
    A dummy web application class which has its own handler and filter for a
    webapp-specific log.
    """
    def __init__(self, name):
        self.name = name
        handler = logging.FileHandler(name + '.log', 'w')
        f = InjectingFilter(self)
        handler.setFormatter(formatter)
        handler.addFilter(f)
        root.addHandler(handler)
        self.num_requests = 0

    def process_request(self, request):
        """
        This is the dummy method for processing a request. It's called on a
        different thread for every request. We store the context information into
        the context vars before doing anything else.
        """
        ctx_request.set(request)
        ctx_appname.set(self.name)
        self.num_requests += 1
        logger.debug('Request processing started')
        webapplib.useful()
        logger.debug('Request processing finished')

def main():
    fn = os.path.splitext(os.path.basename(__file__))[0]
    adhf = argparse.ArgumentDefaultsHelpFormatter
    ap = argparse.ArgumentParser(formatter_class=adhf, prog=fn,
                                 description='Simulate a couple of web '
                                             'applications handling some '
                                             'requests, showing how request '
                                             'context can be used to '
                                             'populate logs')
    aa = ap.add_argument
    aa('--count', '-c', type=int, default=100, help='How many requests to simulate')
    options = ap.parse_args()

    # Create the dummy webapps and put them in a list which we can use to select
    # from randomly
    app1 = WebApp('app1')
    app2 = WebApp('app2')
    apps = [app1, app2]
    threads = []
    # Add a common handler which will capture all events
    handler = logging.FileHandler('app.log', 'w')
    handler.setFormatter(formatter)
    root.addHandler(handler)

    # Generate calls to process requests
    for i in range(options.count):
        try:
            # Pick an app at random and a request for it to process
            app = choice(apps)
            request = choice(REQUESTS)
            # Process the request in its own thread
            t = threading.Thread(target=app.process_request, args=(request,))
            threads.append(t)
            t.start()
        except KeyboardInterrupt:
            break

    # Wait for the threads to terminate
    for t in threads:
        t.join()

    for app in apps:
        print('%s processed %s requests' % (app.name, app.num_requests))

if __name__ == '__main__':
    main()
@end example

If you run the above, you should find that roughly half the requests go
into @code{app1.log} and the rest into @code{app2.log}, and the all the requests are
logged to @code{app.log}. Each webapp-specific log will contain only log entries for
only that webapp, and the request information will be displayed consistently in the
log (i.e. the information in each dummy request will always appear together in a log
line). This is illustrated by the following shell output:

@example
~/logging-contextual-webapp$ python main.py
app1 processed 51 requests
app2 processed 49 requests
~/logging-contextual-webapp$ wc -l *.log
  153 app1.log
  147 app2.log
  300 app.log
  600 total
~/logging-contextual-webapp$ head -3 app1.log
Thread-3 (process_request) app1 __main__  jim    192.168.3.21 POST Request processing started
Thread-3 (process_request) app1 webapplib jim    192.168.3.21 POST Hello from webapplib!
Thread-5 (process_request) app1 __main__  jim    192.168.3.21 POST Request processing started
~/logging-contextual-webapp$ head -3 app2.log
Thread-1 (process_request) app2 __main__  sheila 192.168.2.21 GET  Request processing started
Thread-1 (process_request) app2 webapplib sheila 192.168.2.21 GET  Hello from webapplib!
Thread-2 (process_request) app2 __main__  jim    192.168.2.20 GET  Request processing started
~/logging-contextual-webapp$ head app.log
Thread-1 (process_request) app2 __main__  sheila 192.168.2.21 GET  Request processing started
Thread-1 (process_request) app2 webapplib sheila 192.168.2.21 GET  Hello from webapplib!
Thread-2 (process_request) app2 __main__  jim    192.168.2.20 GET  Request processing started
Thread-3 (process_request) app1 __main__  jim    192.168.3.21 POST Request processing started
Thread-2 (process_request) app2 webapplib jim    192.168.2.20 GET  Hello from webapplib!
Thread-3 (process_request) app1 webapplib jim    192.168.3.21 POST Hello from webapplib!
Thread-4 (process_request) app2 __main__  fred   192.168.2.22 GET  Request processing started
Thread-5 (process_request) app1 __main__  jim    192.168.3.21 POST Request processing started
Thread-4 (process_request) app2 webapplib fred   192.168.2.22 GET  Hello from webapplib!
Thread-6 (process_request) app1 __main__  jim    192.168.3.21 POST Request processing started
~/logging-contextual-webapp$ grep app1 app1.log | wc -l
153
~/logging-contextual-webapp$ grep app2 app2.log | wc -l
147
~/logging-contextual-webapp$ grep app1 app.log | wc -l
153
~/logging-contextual-webapp$ grep app2 app.log | wc -l
147
@end example

@node Imparting contextual information in handlers,Logging to a single file from multiple processes,Use of contextvars,Logging Cookbook
@anchor{howto/logging-cookbook imparting-contextual-information-in-handlers}@anchor{5ae1}
@subsection Imparting contextual information in handlers


Each @ref{16a2,,Handler} has its own chain of filters.
If you want to add contextual information to a @ref{11ec,,LogRecord} without leaking
it to other handlers, you can use a filter that returns
a new @code{LogRecord} instead of modifying it in-place, as shown in the following script:

@example
import copy
import logging

def filter(record: logging.LogRecord):
    record = copy.copy(record)
    record.user = 'jim'
    return record

if __name__ == '__main__':
    logger = logging.getLogger()
    logger.setLevel(logging.INFO)
    handler = logging.StreamHandler()
    formatter = logging.Formatter('%(message)s from %(user)-8s')
    handler.setFormatter(formatter)
    handler.addFilter(filter)
    logger.addHandler(handler)

    logger.info('A log message')
@end example

@node Logging to a single file from multiple processes,Using file rotation,Imparting contextual information in handlers,Logging Cookbook
@anchor{howto/logging-cookbook logging-to-a-single-file-from-multiple-processes}@anchor{5ae2}@anchor{howto/logging-cookbook multiple-processes}@anchor{5ae3}
@subsection Logging to a single file from multiple processes


Although logging is thread-safe, and logging to a single file from multiple
threads in a single process `is' supported, logging to a single file from
`multiple processes' is `not' supported, because there is no standard way to
serialize access to a single file across multiple processes in Python. If you
need to log to a single file from multiple processes, one way of doing this is
to have all the processes log to a @ref{1168,,SocketHandler}, and have a
separate process which implements a socket server which reads from the socket
and logs to file. (If you prefer, you can dedicate one thread in one of the
existing processes to perform this function.)
@ref{5ad9,,This section} documents this approach in more detail and
includes a working socket receiver which can be used as a starting point for you
to adapt in your own applications.

You could also write your own handler which uses the @ref{189c,,Lock}
class from the @ref{98,,multiprocessing} module to serialize access to the
file from your processes. The stdlib @ref{1c96,,FileHandler} and subclasses do
not make use of @code{multiprocessing}.

Alternatively, you can use a @code{Queue} and a @ref{1ba5,,QueueHandler} to send
all logging events to one of the processes in your multi-process application.
The following example script demonstrates how you can do this; in the example
a separate listener process listens for events sent by other processes and logs
them according to its own logging configuration. Although the example only
demonstrates one way of doing it (for example, you may want to use a listener
thread rather than a separate listener process – the implementation would be
analogous) it does allow for completely different logging configurations for
the listener and the other processes in your application, and can be used as
the basis for code meeting your own specific requirements:

@example
# You'll need these imports in your own code
import logging
import logging.handlers
import multiprocessing

# Next two import lines for this demo only
from random import choice, random
import time

#
# Because you'll want to define the logging configurations for listener and workers, the
# listener and worker process functions take a configurer parameter which is a callable
# for configuring logging for that process. These functions are also passed the queue,
# which they use for communication.
#
# In practice, you can configure the listener however you want, but note that in this
# simple example, the listener does not apply level or filter logic to received records.
# In practice, you would probably want to do this logic in the worker processes, to avoid
# sending events which would be filtered out between processes.
#
# The size of the rotated files is made small so you can see the results easily.
def listener_configurer():
    root = logging.getLogger()
    h = logging.handlers.RotatingFileHandler('mptest.log', 'a', 300, 10)
    f = logging.Formatter('%(asctime)s %(processName)-10s %(name)s %(levelname)-8s %(message)s')
    h.setFormatter(f)
    root.addHandler(h)

# This is the listener process top-level loop: wait for logging events
# (LogRecords)on the queue and handle them, quit when you get a None for a
# LogRecord.
def listener_process(queue, configurer):
    configurer()
    while True:
        try:
            record = queue.get()
            if record is None:  # We send this as a sentinel to tell the listener to quit.
                break
            logger = logging.getLogger(record.name)
            logger.handle(record)  # No level or filter logic applied - just do it!
        except Exception:
            import sys, traceback
            print('Whoops! Problem:', file=sys.stderr)
            traceback.print_exc(file=sys.stderr)

# Arrays used for random selections in this demo

LEVELS = [logging.DEBUG, logging.INFO, logging.WARNING,
          logging.ERROR, logging.CRITICAL]

LOGGERS = ['a.b.c', 'd.e.f']

MESSAGES = [
    'Random message #1',
    'Random message #2',
    'Random message #3',
]

# The worker configuration is done at the start of the worker process run.
# Note that on Windows you can't rely on fork semantics, so each process
# will run the logging configuration code when it starts.
def worker_configurer(queue):
    h = logging.handlers.QueueHandler(queue)  # Just the one handler needed
    root = logging.getLogger()
    root.addHandler(h)
    # send all messages, for demo; no other level or filter logic applied.
    root.setLevel(logging.DEBUG)

# This is the worker process top-level loop, which just logs ten events with
# random intervening delays before terminating.
# The print messages are just so you know it's doing something!
def worker_process(queue, configurer):
    configurer(queue)
    name = multiprocessing.current_process().name
    print('Worker started: %s' % name)
    for i in range(10):
        time.sleep(random())
        logger = logging.getLogger(choice(LOGGERS))
        level = choice(LEVELS)
        message = choice(MESSAGES)
        logger.log(level, message)
    print('Worker finished: %s' % name)

# Here's where the demo gets orchestrated. Create the queue, create and start
# the listener, create ten workers and start them, wait for them to finish,
# then send a None to the queue to tell the listener to finish.
def main():
    queue = multiprocessing.Queue(-1)
    listener = multiprocessing.Process(target=listener_process,
                                       args=(queue, listener_configurer))
    listener.start()
    workers = []
    for i in range(10):
        worker = multiprocessing.Process(target=worker_process,
                                         args=(queue, worker_configurer))
        workers.append(worker)
        worker.start()
    for w in workers:
        w.join()
    queue.put_nowait(None)
    listener.join()

if __name__ == '__main__':
    main()
@end example

A variant of the above script keeps the logging in the main process, in a
separate thread:

@example
import logging
import logging.config
import logging.handlers
from multiprocessing import Process, Queue
import random
import threading
import time

def logger_thread(q):
    while True:
        record = q.get()
        if record is None:
            break
        logger = logging.getLogger(record.name)
        logger.handle(record)


def worker_process(q):
    qh = logging.handlers.QueueHandler(q)
    root = logging.getLogger()
    root.setLevel(logging.DEBUG)
    root.addHandler(qh)
    levels = [logging.DEBUG, logging.INFO, logging.WARNING, logging.ERROR,
              logging.CRITICAL]
    loggers = ['foo', 'foo.bar', 'foo.bar.baz',
               'spam', 'spam.ham', 'spam.ham.eggs']
    for i in range(100):
        lvl = random.choice(levels)
        logger = logging.getLogger(random.choice(loggers))
        logger.log(lvl, 'Message no. %d', i)

if __name__ == '__main__':
    q = Queue()
    d = @{
        'version': 1,
        'formatters': @{
            'detailed': @{
                'class': 'logging.Formatter',
                'format': '%(asctime)s %(name)-15s %(levelname)-8s %(processName)-10s %(message)s'
            @}
        @},
        'handlers': @{
            'console': @{
                'class': 'logging.StreamHandler',
                'level': 'INFO',
            @},
            'file': @{
                'class': 'logging.FileHandler',
                'filename': 'mplog.log',
                'mode': 'w',
                'formatter': 'detailed',
            @},
            'foofile': @{
                'class': 'logging.FileHandler',
                'filename': 'mplog-foo.log',
                'mode': 'w',
                'formatter': 'detailed',
            @},
            'errors': @{
                'class': 'logging.FileHandler',
                'filename': 'mplog-errors.log',
                'mode': 'w',
                'level': 'ERROR',
                'formatter': 'detailed',
            @},
        @},
        'loggers': @{
            'foo': @{
                'handlers': ['foofile']
            @}
        @},
        'root': @{
            'level': 'DEBUG',
            'handlers': ['console', 'file', 'errors']
        @},
    @}
    workers = []
    for i in range(5):
        wp = Process(target=worker_process, name='worker %d' % (i + 1), args=(q,))
        workers.append(wp)
        wp.start()
    logging.config.dictConfig(d)
    lp = threading.Thread(target=logger_thread, args=(q,))
    lp.start()
    # At this point, the main process could do some useful work of its own
    # Once it's done that, it can wait for the workers to terminate...
    for wp in workers:
        wp.join()
    # And now tell the logging thread to finish up, too
    q.put(None)
    lp.join()
@end example

This variant shows how you can e.g. apply configuration for particular loggers
- e.g. the @code{foo} logger has a special handler which stores all events in the
@code{foo} subsystem in a file @code{mplog-foo.log}. This will be used by the logging
machinery in the main process (even though the logging events are generated in
the worker processes) to direct the messages to the appropriate destinations.

@menu
* Using concurrent.futures.ProcessPoolExecutor: Using concurrent futures ProcessPoolExecutor. 
* Deploying web applications using Gunicorn and uWSGI:: 

@end menu

@node Using concurrent futures ProcessPoolExecutor,Deploying web applications using Gunicorn and uWSGI,,Logging to a single file from multiple processes
@anchor{howto/logging-cookbook using-concurrent-futures-processpoolexecutor}@anchor{5ae4}
@subsubsection Using concurrent.futures.ProcessPoolExecutor


If you want to use @ref{1d8,,concurrent.futures.ProcessPoolExecutor} to start
your worker processes, you need to create the queue slightly differently.
Instead of

@example
queue = multiprocessing.Queue(-1)
@end example

you should use

@example
queue = multiprocessing.Manager().Queue(-1)  # also works with the examples above
@end example

and you can then replace the worker creation from this:

@example
workers = []
for i in range(10):
    worker = multiprocessing.Process(target=worker_process,
                                     args=(queue, worker_configurer))
    workers.append(worker)
    worker.start()
for w in workers:
    w.join()
@end example

to this (remembering to first import @ref{24,,concurrent.futures}):

@example
with concurrent.futures.ProcessPoolExecutor(max_workers=10) as executor:
    for i in range(10):
        executor.submit(worker_process, queue, worker_configurer)
@end example

@node Deploying web applications using Gunicorn and uWSGI,,Using concurrent futures ProcessPoolExecutor,Logging to a single file from multiple processes
@anchor{howto/logging-cookbook deploying-web-applications-using-gunicorn-and-uwsgi}@anchor{5ae5}
@subsubsection Deploying web applications using Gunicorn and uWSGI


When deploying web applications using Gunicorn@footnote{https://gunicorn.org/} or uWSGI@footnote{https://uwsgi-docs.readthedocs.io/en/latest/} (or similar), multiple worker
processes are created to handle client requests. In such environments, avoid creating
file-based handlers directly in your web application. Instead, use a
@ref{1168,,SocketHandler} to log from the web application to a listener in a separate
process. This can be set up using a process management tool such as Supervisor - see
@ref{5adb,,Running a logging socket listener in production} for more details.

@node Using file rotation,Use of alternative formatting styles,Logging to a single file from multiple processes,Logging Cookbook
@anchor{howto/logging-cookbook using-file-rotation}@anchor{5ae6}
@subsection Using file rotation


@c (see <https://pymotw.com/3/logging/>)

Sometimes you want to let a log file grow to a certain size, then open a new
file and log to that. You may want to keep a certain number of these files, and
when that many files have been created, rotate the files so that the number of
files and the size of the files both remain bounded. For this usage pattern, the
logging package provides a @ref{1985,,RotatingFileHandler}:

@example
import glob
import logging
import logging.handlers

LOG_FILENAME = 'logging_rotatingfile_example.out'

# Set up a specific logger with our desired output level
my_logger = logging.getLogger('MyLogger')
my_logger.setLevel(logging.DEBUG)

# Add the log message handler to the logger
handler = logging.handlers.RotatingFileHandler(
              LOG_FILENAME, maxBytes=20, backupCount=5)

my_logger.addHandler(handler)

# Log some messages
for i in range(20):
    my_logger.debug('i = %d' % i)

# See what files are created
logfiles = glob.glob('%s*' % LOG_FILENAME)

for filename in logfiles:
    print(filename)
@end example

The result should be 6 separate files, each with part of the log history for the
application:

@example
logging_rotatingfile_example.out
logging_rotatingfile_example.out.1
logging_rotatingfile_example.out.2
logging_rotatingfile_example.out.3
logging_rotatingfile_example.out.4
logging_rotatingfile_example.out.5
@end example

The most current file is always @code{logging_rotatingfile_example.out},
and each time it reaches the size limit it is renamed with the suffix
@code{.1}. Each of the existing backup files is renamed to increment the suffix
(@code{.1} becomes @code{.2}, etc.)  and the @code{.6} file is erased.

Obviously this example sets the log length much too small as an extreme
example.  You would want to set `maxBytes' to an appropriate value.

@node Use of alternative formatting styles,Customizing LogRecord,Using file rotation,Logging Cookbook
@anchor{howto/logging-cookbook format-styles}@anchor{5ae7}@anchor{howto/logging-cookbook use-of-alternative-formatting-styles}@anchor{5ae8}
@subsection Use of alternative formatting styles


When logging was added to the Python standard library, the only way of
formatting messages with variable content was to use the %-formatting
method. Since then, Python has gained two new formatting approaches:
@ref{899,,string.Template} (added in Python 2.4) and @ref{834,,str.format()}
(added in Python 2.6).

Logging (as of 3.2) provides improved support for these two additional
formatting styles. The @ref{16a3,,Formatter} class been enhanced to take an
additional, optional keyword parameter named @code{style}. This defaults to
@code{'%'}, but other possible values are @code{'@{'} and @code{'$'}, which correspond
to the other two formatting styles. Backwards compatibility is maintained by
default (as you would expect), but by explicitly specifying a style parameter,
you get the ability to specify format strings which work with
@ref{834,,str.format()} or @ref{899,,string.Template}. Here’s an example console
session to show the possibilities:

@example
>>> import logging
>>> root = logging.getLogger()
>>> root.setLevel(logging.DEBUG)
>>> handler = logging.StreamHandler()
>>> bf = logging.Formatter('@{asctime@} @{name@} @{levelname:8s@} @{message@}',
...                        style='@{')
>>> handler.setFormatter(bf)
>>> root.addHandler(handler)
>>> logger = logging.getLogger('foo.bar')
>>> logger.debug('This is a DEBUG message')
2010-10-28 15:11:55,341 foo.bar DEBUG    This is a DEBUG message
>>> logger.critical('This is a CRITICAL message')
2010-10-28 15:12:11,526 foo.bar CRITICAL This is a CRITICAL message
>>> df = logging.Formatter('$asctime $name $@{levelname@} $message',
...                        style='$')
>>> handler.setFormatter(df)
>>> logger.debug('This is a DEBUG message')
2010-10-28 15:13:06,924 foo.bar DEBUG This is a DEBUG message
>>> logger.critical('This is a CRITICAL message')
2010-10-28 15:13:11,494 foo.bar CRITICAL This is a CRITICAL message
>>>
@end example

Note that the formatting of logging messages for final output to logs is
completely independent of how an individual logging message is constructed.
That can still use %-formatting, as shown here:

@example
>>> logger.error('This is an%s %s %s', 'other,', 'ERROR,', 'message')
2010-10-28 15:19:29,833 foo.bar ERROR This is another, ERROR, message
>>>
@end example

Logging calls (@code{logger.debug()}, @code{logger.info()} etc.) only take
positional parameters for the actual logging message itself, with keyword
parameters used only for determining options for how to handle the actual
logging call (e.g. the @code{exc_info} keyword parameter to indicate that
traceback information should be logged, or the @code{extra} keyword parameter
to indicate additional contextual information to be added to the log). So
you cannot directly make logging calls using @ref{834,,str.format()} or
@ref{899,,string.Template} syntax, because internally the logging package
uses %-formatting to merge the format string and the variable arguments.
There would be no changing this while preserving backward compatibility, since
all logging calls which are out there in existing code will be using %-format
strings.

There is, however, a way that you can use @{@}- and $- formatting to construct
your individual log messages. Recall that for a message you can use an
arbitrary object as a message format string, and that the logging package will
call @code{str()} on that object to get the actual format string. Consider the
following two classes:

@example
class BraceMessage:
    def __init__(self, fmt, /, *args, **kwargs):
        self.fmt = fmt
        self.args = args
        self.kwargs = kwargs

    def __str__(self):
        return self.fmt.format(*self.args, **self.kwargs)

class DollarMessage:
    def __init__(self, fmt, /, **kwargs):
        self.fmt = fmt
        self.kwargs = kwargs

    def __str__(self):
        from string import Template
        return Template(self.fmt).substitute(**self.kwargs)
@end example

Either of these can be used in place of a format string, to allow @{@}- or
$-formatting to be used to build the actual “message” part which appears in the
formatted log output in place of “%(message)s” or “@{message@}” or “$message”.
It’s a little unwieldy to use the class names whenever you want to log
something, but it’s quite palatable if you use an alias such as __ (double
underscore — not to be confused with _, the single underscore used as a
synonym/alias for @ref{1675,,gettext.gettext()} or its brethren).

The above classes are not included in Python, though they’re easy enough to
copy and paste into your own code. They can be used as follows (assuming that
they’re declared in a module called @code{wherever}):

@example
>>> from wherever import BraceMessage as __
>>> print(__('Message with @{0@} @{name@}', 2, name='placeholders'))
Message with 2 placeholders
>>> class Point: pass
...
>>> p = Point()
>>> p.x = 0.5
>>> p.y = 0.5
>>> print(__('Message with coordinates: (@{point.x:.2f@}, @{point.y:.2f@})',
...       point=p))
Message with coordinates: (0.50, 0.50)
>>> from wherever import DollarMessage as __
>>> print(__('Message with $num $what', num=2, what='placeholders'))
Message with 2 placeholders
>>>
@end example

While the above examples use @code{print()} to show how the formatting works, you
would of course use @code{logger.debug()} or similar to actually log using this
approach.

One thing to note is that you pay no significant performance penalty with this
approach: the actual formatting happens not when you make the logging call, but
when (and if) the logged message is actually about to be output to a log by a
handler. So the only slightly unusual thing which might trip you up is that the
parentheses go around the format string and the arguments, not just the format
string. That’s because the __ notation is just syntax sugar for a constructor
call to one of the @code{@var{XXX}Message} classes.

If you prefer, you can use a @ref{1501,,LoggerAdapter} to achieve a similar effect
to the above, as in the following example:

@example
import logging

class Message:
    def __init__(self, fmt, args):
        self.fmt = fmt
        self.args = args

    def __str__(self):
        return self.fmt.format(*self.args)

class StyleAdapter(logging.LoggerAdapter):
    def log(self, level, msg, /, *args, stacklevel=1, **kwargs):
        if self.isEnabledFor(level):
            msg, kwargs = self.process(msg, kwargs)
            self.logger.log(level, Message(msg, args), **kwargs,
                            stacklevel=stacklevel+1)

logger = StyleAdapter(logging.getLogger(__name__))

def main():
    logger.debug('Hello, @{@}', 'world!')

if __name__ == '__main__':
    logging.basicConfig(level=logging.DEBUG)
    main()
@end example

The above script should log the message @code{Hello, world!} when run with
Python 3.8 or later.

@node Customizing LogRecord,Subclassing QueueHandler and QueueListener- a ZeroMQ example,Use of alternative formatting styles,Logging Cookbook
@anchor{howto/logging-cookbook custom-logrecord}@anchor{5ae9}@anchor{howto/logging-cookbook customizing-logrecord}@anchor{5aea}
@subsection Customizing @code{LogRecord}


Every logging event is represented by a @ref{11ec,,LogRecord} instance.
When an event is logged and not filtered out by a logger’s level, a
@code{LogRecord} is created, populated with information about the event and
then passed to the handlers for that logger (and its ancestors, up to and
including the logger where further propagation up the hierarchy is disabled).
Before Python 3.2, there were only two places where this creation was done:


@itemize *

@item 
@ref{31d7,,Logger.makeRecord()}, which is called in the normal process of
logging an event. This invoked @ref{11ec,,LogRecord} directly to create an
instance.

@item 
@ref{31fd,,makeLogRecord()}, which is called with a dictionary containing
attributes to be added to the LogRecord. This is typically invoked when a
suitable dictionary has been received over the network (e.g. in pickle form
via a @ref{1168,,SocketHandler}, or in JSON form via an
@ref{1032,,HTTPHandler}).
@end itemize

This has usually meant that if you need to do anything special with a
@ref{11ec,,LogRecord}, you’ve had to do one of the following.


@itemize *

@item 
Create your own @ref{d4c,,Logger} subclass, which overrides
@ref{31d7,,Logger.makeRecord()}, and set it using @ref{320c,,setLoggerClass()}
before any loggers that you care about are instantiated.

@item 
Add a @ref{1407,,Filter} to a logger or handler, which does the
necessary special manipulation you need when its
@ref{31f8,,filter()} method is called.
@end itemize

The first approach would be a little unwieldy in the scenario where (say)
several different libraries wanted to do different things. Each would attempt
to set its own @ref{d4c,,Logger} subclass, and the one which did this last would
win.

The second approach works reasonably well for many cases, but does not allow
you to e.g. use a specialized subclass of @ref{11ec,,LogRecord}. Library
developers can set a suitable filter on their loggers, but they would have to
remember to do this every time they introduced a new logger (which they would
do simply by adding new packages or modules and doing

@example
logger = logging.getLogger(__name__)
@end example

at module level). It’s probably one too many things to think about. Developers
could also add the filter to a @ref{1490,,NullHandler} attached to their
top-level logger, but this would not be invoked if an application developer
attached a handler to a lower-level library logger — so output from that
handler would not reflect the intentions of the library developer.

In Python 3.2 and later, @ref{11ec,,LogRecord} creation is done through a
factory, which you can specify. The factory is just a callable you can set with
@ref{3201,,setLogRecordFactory()}, and interrogate with
@ref{3200,,getLogRecordFactory()}. The factory is invoked with the same
signature as the @code{LogRecord} constructor, as @ref{11ec,,LogRecord}
is the default setting for the factory.

This approach allows a custom factory to control all aspects of LogRecord
creation. For example, you could return a subclass, or just add some additional
attributes to the record once created, using a pattern similar to this:

@example
old_factory = logging.getLogRecordFactory()

def record_factory(*args, **kwargs):
    record = old_factory(*args, **kwargs)
    record.custom_attribute = 0xdecafbad
    return record

logging.setLogRecordFactory(record_factory)
@end example

This pattern allows different libraries to chain factories together, and as
long as they don’t overwrite each other’s attributes or unintentionally
overwrite the attributes provided as standard, there should be no surprises.
However, it should be borne in mind that each link in the chain adds run-time
overhead to all logging operations, and the technique should only be used when
the use of a @ref{1407,,Filter} does not provide the desired result.

@node Subclassing QueueHandler and QueueListener- a ZeroMQ example,Subclassing QueueHandler and QueueListener- a pynng example,Customizing LogRecord,Logging Cookbook
@anchor{howto/logging-cookbook subclassing-queuehandler-and-queuelistener-a-zeromq-example}@anchor{5aeb}@anchor{howto/logging-cookbook zeromq-handlers}@anchor{5aec}
@subsection Subclassing QueueHandler and QueueListener- a ZeroMQ example


@menu
* Subclass QueueHandler:: 
* Subclass QueueListener:: 

@end menu

@node Subclass QueueHandler,Subclass QueueListener,,Subclassing QueueHandler and QueueListener- a ZeroMQ example
@anchor{howto/logging-cookbook subclass-queuehandler}@anchor{5aed}
@subsubsection Subclass @code{QueueHandler}


You can use a @ref{1ba5,,QueueHandler} subclass to send messages to other kinds
of queues, for example a ZeroMQ ‘publish’ socket. In the example below,the
socket is created separately and passed to the handler (as its ‘queue’):

@example
import zmq   # using pyzmq, the Python binding for ZeroMQ
import json  # for serializing records portably

ctx = zmq.Context()
sock = zmq.Socket(ctx, zmq.PUB)  # or zmq.PUSH, or other suitable value
sock.bind('tcp://*:5556')        # or wherever

class ZeroMQSocketHandler(QueueHandler):
    def enqueue(self, record):
        self.queue.send_json(record.__dict__)


handler = ZeroMQSocketHandler(sock)
@end example

Of course there are other ways of organizing this, for example passing in the
data needed by the handler to create the socket:

@example
class ZeroMQSocketHandler(QueueHandler):
    def __init__(self, uri, socktype=zmq.PUB, ctx=None):
        self.ctx = ctx or zmq.Context()
        socket = zmq.Socket(self.ctx, socktype)
        socket.bind(uri)
        super().__init__(socket)

    def enqueue(self, record):
        self.queue.send_json(record.__dict__)

    def close(self):
        self.queue.close()
@end example

@node Subclass QueueListener,,Subclass QueueHandler,Subclassing QueueHandler and QueueListener- a ZeroMQ example
@anchor{howto/logging-cookbook subclass-queuelistener}@anchor{5aee}
@subsubsection Subclass @code{QueueListener}


You can also subclass @ref{244,,QueueListener} to get messages from other kinds
of queues, for example a ZeroMQ ‘subscribe’ socket. Here’s an example:

@example
class ZeroMQSocketListener(QueueListener):
    def __init__(self, uri, /, *handlers, **kwargs):
        self.ctx = kwargs.get('ctx') or zmq.Context()
        socket = zmq.Socket(self.ctx, zmq.SUB)
        socket.setsockopt_string(zmq.SUBSCRIBE, '@w{'})  # subscribe to everything
        socket.connect(uri)
        super().__init__(socket, *handlers, **kwargs)

    def dequeue(self):
        msg = self.queue.recv_json()
        return logging.makeLogRecord(msg)
@end example

@node Subclassing QueueHandler and QueueListener- a pynng example,An example dictionary-based configuration,Subclassing QueueHandler and QueueListener- a ZeroMQ example,Logging Cookbook
@anchor{howto/logging-cookbook pynng-handlers}@anchor{5aef}@anchor{howto/logging-cookbook subclassing-queuehandler-and-queuelistener-a-pynng-example}@anchor{5af0}
@subsection Subclassing QueueHandler and QueueListener- a @code{pynng} example


In a similar way to the above section, we can implement a listener and handler
using pynng@footnote{https://pypi.org/project/pynng/}, which is a Python binding to
NNG@footnote{https://nng.nanomsg.org/}, billed as a spiritual successor to ZeroMQ.
The following snippets illustrate – you can test them in an environment which has
@code{pynng} installed. Just for variety, we present the listener first.

@menu
* Subclass QueueListener: Subclass QueueListener<2>. 
* Subclass QueueHandler: Subclass QueueHandler<2>. 

@end menu

@node Subclass QueueListener<2>,Subclass QueueHandler<2>,,Subclassing QueueHandler and QueueListener- a pynng example
@anchor{howto/logging-cookbook id3}@anchor{5af1}
@subsubsection Subclass @code{QueueListener}


@example
# listener.py
import json
import logging
import logging.handlers

import pynng

DEFAULT_ADDR = "tcp://localhost:13232"

interrupted = False

class NNGSocketListener(logging.handlers.QueueListener):

    def __init__(self, uri, /, *handlers, **kwargs):
        # Have a timeout for interruptability, and open a
        # subscriber socket
        socket = pynng.Sub0(listen=uri, recv_timeout=500)
        # The b'@w{'} subscription matches all topics
        topics = kwargs.pop('topics', None) or b'@w{'}
        socket.subscribe(topics)
        # We treat the socket as a queue
        super().__init__(socket, *handlers, **kwargs)

    def dequeue(self, block):
        data = None
        # Keep looping while not interrupted and no data received over the
        # socket
        while not interrupted:
            try:
                data = self.queue.recv(block=block)
                break
            except pynng.Timeout:
                pass
            except pynng.Closed:  # sometimes happens when you hit Ctrl-C
                break
        if data is None:
            return None
        # Get the logging event sent from a publisher
        event = json.loads(data.decode('utf-8'))
        return logging.makeLogRecord(event)

    def enqueue_sentinel(self):
        # Not used in this implementation, as the socket isn't really a
        # queue
        pass

logging.getLogger('pynng').propagate = False
listener = NNGSocketListener(DEFAULT_ADDR, logging.StreamHandler(), topics=b'@w{'})
listener.start()
print('Press Ctrl-C to stop.')
try:
    while True:
        pass
except KeyboardInterrupt:
    interrupted = True
finally:
    listener.stop()
@end example

@node Subclass QueueHandler<2>,,Subclass QueueListener<2>,Subclassing QueueHandler and QueueListener- a pynng example
@anchor{howto/logging-cookbook id4}@anchor{5af2}
@subsubsection Subclass @code{QueueHandler}


@example
# sender.py
import json
import logging
import logging.handlers
import time
import random

import pynng

DEFAULT_ADDR = "tcp://localhost:13232"

class NNGSocketHandler(logging.handlers.QueueHandler):

    def __init__(self, uri):
        socket = pynng.Pub0(dial=uri, send_timeout=500)
        super().__init__(socket)

    def enqueue(self, record):
        # Send the record as UTF-8 encoded JSON
        d = dict(record.__dict__)
        data = json.dumps(d)
        self.queue.send(data.encode('utf-8'))

    def close(self):
        self.queue.close()

logging.getLogger('pynng').propagate = False
handler = NNGSocketHandler(DEFAULT_ADDR)
# Make sure the process ID is in the output
logging.basicConfig(level=logging.DEBUG,
                    handlers=[logging.StreamHandler(), handler],
                    format='%(levelname)-8s %(name)10s %(process)6s %(message)s')
levels = (logging.DEBUG, logging.INFO, logging.WARNING, logging.ERROR,
          logging.CRITICAL)
logger_names = ('myapp', 'myapp.lib1', 'myapp.lib2')
msgno = 1
while True:
    # Just randomly select some loggers and levels and log away
    level = random.choice(levels)
    logger = logging.getLogger(random.choice(logger_names))
    logger.log(level, 'Message no. %5d' % msgno)
    msgno += 1
    delay = random.random() * 2 + 0.5
    time.sleep(delay)
@end example

You can run the above two snippets in separate command shells. If we run the
listener in one shell and run the sender in two separate shells, we should see
something like the following. In the first sender shell:

@example
$ python sender.py
DEBUG         myapp    613 Message no.     1
WARNING  myapp.lib2    613 Message no.     2
CRITICAL myapp.lib2    613 Message no.     3
WARNING  myapp.lib2    613 Message no.     4
CRITICAL myapp.lib1    613 Message no.     5
DEBUG         myapp    613 Message no.     6
CRITICAL myapp.lib1    613 Message no.     7
INFO     myapp.lib1    613 Message no.     8
(and so on)
@end example

In the second sender shell:

@example
$ python sender.py
INFO     myapp.lib2    657 Message no.     1
CRITICAL myapp.lib2    657 Message no.     2
CRITICAL      myapp    657 Message no.     3
CRITICAL myapp.lib1    657 Message no.     4
INFO     myapp.lib1    657 Message no.     5
WARNING  myapp.lib2    657 Message no.     6
CRITICAL      myapp    657 Message no.     7
DEBUG    myapp.lib1    657 Message no.     8
(and so on)
@end example

In the listener shell:

@example
$ python listener.py
Press Ctrl-C to stop.
DEBUG         myapp    613 Message no.     1
WARNING  myapp.lib2    613 Message no.     2
INFO     myapp.lib2    657 Message no.     1
CRITICAL myapp.lib2    613 Message no.     3
CRITICAL myapp.lib2    657 Message no.     2
CRITICAL      myapp    657 Message no.     3
WARNING  myapp.lib2    613 Message no.     4
CRITICAL myapp.lib1    613 Message no.     5
CRITICAL myapp.lib1    657 Message no.     4
INFO     myapp.lib1    657 Message no.     5
DEBUG         myapp    613 Message no.     6
WARNING  myapp.lib2    657 Message no.     6
CRITICAL      myapp    657 Message no.     7
CRITICAL myapp.lib1    613 Message no.     7
INFO     myapp.lib1    613 Message no.     8
DEBUG    myapp.lib1    657 Message no.     8
(and so on)
@end example

As you can see, the logging from the two sender processes is interleaved in the
listener’s output.

@node An example dictionary-based configuration,Using a rotator and namer to customize log rotation processing,Subclassing QueueHandler and QueueListener- a pynng example,Logging Cookbook
@anchor{howto/logging-cookbook an-example-dictionary-based-configuration}@anchor{5af3}
@subsection An example dictionary-based configuration


Below is an example of a logging configuration dictionary - it’s taken from
the documentation on the Django project@footnote{https://docs.djangoproject.com/en/stable/topics/logging/#configuring-logging}.
This dictionary is passed to @ref{13bc,,dictConfig()} to put the configuration into effect:

@example
LOGGING = @{
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': @{
        'verbose': @{
            'format': '@{levelname@} @{asctime@} @{module@} @{process:d@} @{thread:d@} @{message@}',
            'style': '@{',
        @},
        'simple': @{
            'format': '@{levelname@} @{message@}',
            'style': '@{',
        @},
    @},
    'filters': @{
        'special': @{
            '()': 'project.logging.SpecialFilter',
            'foo': 'bar',
        @},
    @},
    'handlers': @{
        'console': @{
            'level': 'INFO',
            'class': 'logging.StreamHandler',
            'formatter': 'simple',
        @},
        'mail_admins': @{
            'level': 'ERROR',
            'class': 'django.utils.log.AdminEmailHandler',
            'filters': ['special']
        @}
    @},
    'loggers': @{
        'django': @{
            'handlers': ['console'],
            'propagate': True,
        @},
        'django.request': @{
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': False,
        @},
        'myproject.custom': @{
            'handlers': ['console', 'mail_admins'],
            'level': 'INFO',
            'filters': ['special']
        @}
    @}
@}
@end example

For more information about this configuration, you can see the relevant section@footnote{https://docs.djangoproject.com/en/stable/topics/logging/#configuring-logging}
of the Django documentation.

@node Using a rotator and namer to customize log rotation processing,A more elaborate multiprocessing example,An example dictionary-based configuration,Logging Cookbook
@anchor{howto/logging-cookbook cookbook-rotator-namer}@anchor{3257}@anchor{howto/logging-cookbook using-a-rotator-and-namer-to-customize-log-rotation-processing}@anchor{5af4}
@subsection Using a rotator and namer to customize log rotation processing


An example of how you can define a namer and rotator is given in the following
runnable script, which shows gzip compression of the log file:

@example
import gzip
import logging
import logging.handlers
import os
import shutil

def namer(name):
    return name + ".gz"

def rotator(source, dest):
    with open(source, 'rb') as f_in:
        with gzip.open(dest, 'wb') as f_out:
            shutil.copyfileobj(f_in, f_out)
    os.remove(source)


rh = logging.handlers.RotatingFileHandler('rotated.log', maxBytes=128, backupCount=5)
rh.rotator = rotator
rh.namer = namer

root = logging.getLogger()
root.setLevel(logging.INFO)
root.addHandler(rh)
f = logging.Formatter('%(asctime)s %(message)s')
rh.setFormatter(f)
for i in range(1000):
    root.info(f'Message no. @{i + 1@}')
@end example

After running this, you will see six new files, five of which are compressed:

@example
$ ls rotated.log*
rotated.log       rotated.log.2.gz  rotated.log.4.gz
rotated.log.1.gz  rotated.log.3.gz  rotated.log.5.gz
$ zcat rotated.log.1.gz
2023-01-20 02:28:17,767 Message no. 996
2023-01-20 02:28:17,767 Message no. 997
2023-01-20 02:28:17,767 Message no. 998
@end example

@node A more elaborate multiprocessing example,Inserting a BOM into messages sent to a SysLogHandler,Using a rotator and namer to customize log rotation processing,Logging Cookbook
@anchor{howto/logging-cookbook a-more-elaborate-multiprocessing-example}@anchor{5af5}
@subsection A more elaborate multiprocessing example


The following working example shows how logging can be used with multiprocessing
using configuration files. The configurations are fairly simple, but serve to
illustrate how more complex ones could be implemented in a real multiprocessing
scenario.

In the example, the main process spawns a listener process and some worker
processes. Each of the main process, the listener and the workers have three
separate configurations (the workers all share the same configuration). We can
see logging in the main process, how the workers log to a QueueHandler and how
the listener implements a QueueListener and a more complex logging
configuration, and arranges to dispatch events received via the queue to the
handlers specified in the configuration. Note that these configurations are
purely illustrative, but you should be able to adapt this example to your own
scenario.

Here’s the script - the docstrings and the comments hopefully explain how it
works:

@example
import logging
import logging.config
import logging.handlers
from multiprocessing import Process, Queue, Event, current_process
import os
import random
import time

class MyHandler:
    """
    A simple handler for logging events. It runs in the listener process and
    dispatches events to loggers based on the name in the received record,
    which then get dispatched, by the logging system, to the handlers
    configured for those loggers.
    """

    def handle(self, record):
        if record.name == "root":
            logger = logging.getLogger()
        else:
            logger = logging.getLogger(record.name)

        if logger.isEnabledFor(record.levelno):
            # The process name is transformed just to show that it's the listener
            # doing the logging to files and console
            record.processName = '%s (for %s)' % (current_process().name, record.processName)
            logger.handle(record)

def listener_process(q, stop_event, config):
    """
    This could be done in the main process, but is just done in a separate
    process for illustrative purposes.

    This initialises logging according to the specified configuration,
    starts the listener and waits for the main process to signal completion
    via the event. The listener is then stopped, and the process exits.
    """
    logging.config.dictConfig(config)
    listener = logging.handlers.QueueListener(q, MyHandler())
    listener.start()
    if os.name == 'posix':
        # On POSIX, the setup logger will have been configured in the
        # parent process, but should have been disabled following the
        # dictConfig call.
        # On Windows, since fork isn't used, the setup logger won't
        # exist in the child, so it would be created and the message
        # would appear - hence the "if posix" clause.
        logger = logging.getLogger('setup')
        logger.critical('Should not appear, because of disabled logger ...')
    stop_event.wait()
    listener.stop()

def worker_process(config):
    """
    A number of these are spawned for the purpose of illustration. In
    practice, they could be a heterogeneous bunch of processes rather than
    ones which are identical to each other.

    This initialises logging according to the specified configuration,
    and logs a hundred messages with random levels to randomly selected
    loggers.

    A small sleep is added to allow other processes a chance to run. This
    is not strictly needed, but it mixes the output from the different
    processes a bit more than if it's left out.
    """
    logging.config.dictConfig(config)
    levels = [logging.DEBUG, logging.INFO, logging.WARNING, logging.ERROR,
              logging.CRITICAL]
    loggers = ['foo', 'foo.bar', 'foo.bar.baz',
               'spam', 'spam.ham', 'spam.ham.eggs']
    if os.name == 'posix':
        # On POSIX, the setup logger will have been configured in the
        # parent process, but should have been disabled following the
        # dictConfig call.
        # On Windows, since fork isn't used, the setup logger won't
        # exist in the child, so it would be created and the message
        # would appear - hence the "if posix" clause.
        logger = logging.getLogger('setup')
        logger.critical('Should not appear, because of disabled logger ...')
    for i in range(100):
        lvl = random.choice(levels)
        logger = logging.getLogger(random.choice(loggers))
        logger.log(lvl, 'Message no. %d', i)
        time.sleep(0.01)

def main():
    q = Queue()
    # The main process gets a simple configuration which prints to the console.
    config_initial = @{
        'version': 1,
        'handlers': @{
            'console': @{
                'class': 'logging.StreamHandler',
                'level': 'INFO'
            @}
        @},
        'root': @{
            'handlers': ['console'],
            'level': 'DEBUG'
        @}
    @}
    # The worker process configuration is just a QueueHandler attached to the
    # root logger, which allows all messages to be sent to the queue.
    # We disable existing loggers to disable the "setup" logger used in the
    # parent process. This is needed on POSIX because the logger will
    # be there in the child following a fork().
    config_worker = @{
        'version': 1,
        'disable_existing_loggers': True,
        'handlers': @{
            'queue': @{
                'class': 'logging.handlers.QueueHandler',
                'queue': q
            @}
        @},
        'root': @{
            'handlers': ['queue'],
            'level': 'DEBUG'
        @}
    @}
    # The listener process configuration shows that the full flexibility of
    # logging configuration is available to dispatch events to handlers however
    # you want.
    # We disable existing loggers to disable the "setup" logger used in the
    # parent process. This is needed on POSIX because the logger will
    # be there in the child following a fork().
    config_listener = @{
        'version': 1,
        'disable_existing_loggers': True,
        'formatters': @{
            'detailed': @{
                'class': 'logging.Formatter',
                'format': '%(asctime)s %(name)-15s %(levelname)-8s %(processName)-10s %(message)s'
            @},
            'simple': @{
                'class': 'logging.Formatter',
                'format': '%(name)-15s %(levelname)-8s %(processName)-10s %(message)s'
            @}
        @},
        'handlers': @{
            'console': @{
                'class': 'logging.StreamHandler',
                'formatter': 'simple',
                'level': 'INFO'
            @},
            'file': @{
                'class': 'logging.FileHandler',
                'filename': 'mplog.log',
                'mode': 'w',
                'formatter': 'detailed'
            @},
            'foofile': @{
                'class': 'logging.FileHandler',
                'filename': 'mplog-foo.log',
                'mode': 'w',
                'formatter': 'detailed'
            @},
            'errors': @{
                'class': 'logging.FileHandler',
                'filename': 'mplog-errors.log',
                'mode': 'w',
                'formatter': 'detailed',
                'level': 'ERROR'
            @}
        @},
        'loggers': @{
            'foo': @{
                'handlers': ['foofile']
            @}
        @},
        'root': @{
            'handlers': ['console', 'file', 'errors'],
            'level': 'DEBUG'
        @}
    @}
    # Log some initial events, just to show that logging in the parent works
    # normally.
    logging.config.dictConfig(config_initial)
    logger = logging.getLogger('setup')
    logger.info('About to create workers ...')
    workers = []
    for i in range(5):
        wp = Process(target=worker_process, name='worker %d' % (i + 1),
                     args=(config_worker,))
        workers.append(wp)
        wp.start()
        logger.info('Started worker: %s', wp.name)
    logger.info('About to create listener ...')
    stop_event = Event()
    lp = Process(target=listener_process, name='listener',
                 args=(q, stop_event, config_listener))
    lp.start()
    logger.info('Started listener')
    # We now hang around for the workers to finish their work.
    for wp in workers:
        wp.join()
    # Workers all done, listening can now stop.
    # Logging in the parent still works normally.
    logger.info('Telling listener to stop ...')
    stop_event.set()
    lp.join()
    logger.info('All done.')

if __name__ == '__main__':
    main()
@end example

@node Inserting a BOM into messages sent to a SysLogHandler,Implementing structured logging,A more elaborate multiprocessing example,Logging Cookbook
@anchor{howto/logging-cookbook inserting-a-bom-into-messages-sent-to-a-sysloghandler}@anchor{5af6}
@subsection Inserting a BOM into messages sent to a SysLogHandler


@geindex RFC; RFC 5424
RFC 5424@footnote{https://datatracker.ietf.org/doc/html/rfc5424.html} requires that a
Unicode message be sent to a syslog daemon as a set of bytes which have the
following structure: an optional pure-ASCII component, followed by a UTF-8 Byte
Order Mark (BOM), followed by Unicode encoded using UTF-8. (See the
@geindex RFC; RFC 5424 Section 6
relevant section of the specification@footnote{https://datatracker.ietf.org/doc/html/rfc5424.html#section-6}.)

In Python 3.1, code was added to
@ref{86e,,SysLogHandler} to insert a BOM into the message, but
unfortunately, it was implemented incorrectly, with the BOM appearing at the
beginning of the message and hence not allowing any pure-ASCII component to
appear before it.

As this behaviour is broken, the incorrect BOM insertion code is being removed
from Python 3.2.4 and later. However, it is not being replaced, and if you
want to produce 
@geindex RFC; RFC 5424
RFC 5424@footnote{https://datatracker.ietf.org/doc/html/rfc5424.html}-compliant messages which include a BOM, an optional
pure-ASCII sequence before it and arbitrary Unicode after it, encoded using
UTF-8, then you need to do the following:


@enumerate 

@item 
Attach a @ref{16a3,,Formatter} instance to your
@ref{86e,,SysLogHandler} instance, with a format string
such as:

@example
'ASCII section\ufeffUnicode section'
@end example

The Unicode code point U+FEFF, when encoded using UTF-8, will be
encoded as a UTF-8 BOM – the byte-string @code{b'\xef\xbb\xbf'}.

@item 
Replace the ASCII section with whatever placeholders you like, but make sure
that the data that appears in there after substitution is always ASCII (that
way, it will remain unchanged after UTF-8 encoding).

@item 
Replace the Unicode section with whatever placeholders you like; if the data
which appears there after substitution contains characters outside the ASCII
range, that’s fine – it will be encoded using UTF-8.
@end enumerate

The formatted message `will' be encoded using UTF-8 encoding by
@code{SysLogHandler}. If you follow the above rules, you should be able to produce
@geindex RFC; RFC 5424
RFC 5424@footnote{https://datatracker.ietf.org/doc/html/rfc5424.html}-compliant messages. If you don’t, logging may not complain, but your
messages will not be RFC 5424-compliant, and your syslog daemon may complain.

@node Implementing structured logging,Customizing handlers with dictConfig,Inserting a BOM into messages sent to a SysLogHandler,Logging Cookbook
@anchor{howto/logging-cookbook implementing-structured-logging}@anchor{5af7}
@subsection Implementing structured logging


Although most logging messages are intended for reading by humans, and thus not
readily machine-parseable, there might be circumstances where you want to output
messages in a structured format which `is' capable of being parsed by a program
(without needing complex regular expressions to parse the log message). This is
straightforward to achieve using the logging package. There are a number of
ways in which this could be achieved, but the following is a simple approach
which uses JSON to serialise the event in a machine-parseable manner:

@example
import json
import logging

class StructuredMessage:
    def __init__(self, message, /, **kwargs):
        self.message = message
        self.kwargs = kwargs

    def __str__(self):
        return '%s >>> %s' % (self.message, json.dumps(self.kwargs))

_ = StructuredMessage   # optional, to improve readability

logging.basicConfig(level=logging.INFO, format='%(message)s')
logging.info(_('message 1', foo='bar', bar='baz', num=123, fnum=123.456))
@end example

If the above script is run, it prints:

@example
message 1 >>> @{"fnum": 123.456, "num": 123, "bar": "baz", "foo": "bar"@}
@end example

Note that the order of items might be different according to the version of
Python used.

If you need more specialised processing, you can use a custom JSON encoder,
as in the following complete example:

@example
import json
import logging


class Encoder(json.JSONEncoder):
    def default(self, o):
        if isinstance(o, set):
            return tuple(o)
        elif isinstance(o, str):
            return o.encode('unicode_escape').decode('ascii')
        return super().default(o)

class StructuredMessage:
    def __init__(self, message, /, **kwargs):
        self.message = message
        self.kwargs = kwargs

    def __str__(self):
        s = Encoder().encode(self.kwargs)
        return '%s >>> %s' % (self.message, s)

_ = StructuredMessage   # optional, to improve readability

def main():
    logging.basicConfig(level=logging.INFO, format='%(message)s')
    logging.info(_('message 1', set_value=@{1, 2, 3@}, snowman='\u2603'))

if __name__ == '__main__':
    main()
@end example

When the above script is run, it prints:

@example
message 1 >>> @{"snowman": "\u2603", "set_value": [1, 2, 3]@}
@end example

Note that the order of items might be different according to the version of
Python used.

@node Customizing handlers with dictConfig,Using particular formatting styles throughout your application,Implementing structured logging,Logging Cookbook
@anchor{howto/logging-cookbook custom-handlers}@anchor{5af8}@anchor{howto/logging-cookbook customizing-handlers-with-dictconfig}@anchor{5af9}
@subsection Customizing handlers with @code{dictConfig()}


There are times when you want to customize logging handlers in particular ways,
and if you use @ref{13bc,,dictConfig()} you may be able to do this without
subclassing. As an example, consider that you may want to set the ownership of a
log file. On POSIX, this is easily done using @ref{549,,shutil.chown()}, but the file
handlers in the stdlib don’t offer built-in support. You can customize handler
creation using a plain function such as:

@example
def owned_file_handler(filename, mode='a', encoding=None, owner=None):
    if owner:
        if not os.path.exists(filename):
            open(filename, 'a').close()
        shutil.chown(filename, *owner)
    return logging.FileHandler(filename, mode, encoding)
@end example

You can then specify, in a logging configuration passed to @ref{13bc,,dictConfig()},
that a logging handler be created by calling this function:

@example
LOGGING = @{
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': @{
        'default': @{
            'format': '%(asctime)s %(levelname)s %(name)s %(message)s'
        @},
    @},
    'handlers': @{
        'file':@{
            # The values below are popped from this dictionary and
            # used to create the handler, set the handler's level and
            # its formatter.
            '()': owned_file_handler,
            'level':'DEBUG',
            'formatter': 'default',
            # The values below are passed to the handler creator callable
            # as keyword arguments.
            'owner': ['pulse', 'pulse'],
            'filename': 'chowntest.log',
            'mode': 'w',
            'encoding': 'utf-8',
        @},
    @},
    'root': @{
        'handlers': ['file'],
        'level': 'DEBUG',
    @},
@}
@end example

In this example I am setting the ownership using the @code{pulse} user and group,
just for the purposes of illustration. Putting it together into a working
script, @code{chowntest.py}:

@example
import logging, logging.config, os, shutil

def owned_file_handler(filename, mode='a', encoding=None, owner=None):
    if owner:
        if not os.path.exists(filename):
            open(filename, 'a').close()
        shutil.chown(filename, *owner)
    return logging.FileHandler(filename, mode, encoding)

LOGGING = @{
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': @{
        'default': @{
            'format': '%(asctime)s %(levelname)s %(name)s %(message)s'
        @},
    @},
    'handlers': @{
        'file':@{
            # The values below are popped from this dictionary and
            # used to create the handler, set the handler's level and
            # its formatter.
            '()': owned_file_handler,
            'level':'DEBUG',
            'formatter': 'default',
            # The values below are passed to the handler creator callable
            # as keyword arguments.
            'owner': ['pulse', 'pulse'],
            'filename': 'chowntest.log',
            'mode': 'w',
            'encoding': 'utf-8',
        @},
    @},
    'root': @{
        'handlers': ['file'],
        'level': 'DEBUG',
    @},
@}

logging.config.dictConfig(LOGGING)
logger = logging.getLogger('mylogger')
logger.debug('A debug message')
@end example

To run this, you will probably need to run as @code{root}:

@example
$ sudo python3.3 chowntest.py
$ cat chowntest.log
2013-11-05 09:34:51,128 DEBUG mylogger A debug message
$ ls -l chowntest.log
-rw-r--r-- 1 pulse pulse 55 2013-11-05 09:34 chowntest.log
@end example

Note that this example uses Python 3.3 because that’s where @ref{549,,shutil.chown()}
makes an appearance. This approach should work with any Python version that
supports @ref{13bc,,dictConfig()} - namely, Python 2.7, 3.2 or later. With pre-3.3
versions, you would need to implement the actual ownership change using e.g.
@ref{12fa,,os.chown()}.

In practice, the handler-creating function may be in a utility module somewhere
in your project. Instead of the line in the configuration:

@example
'()': owned_file_handler,
@end example

you could use e.g.:

@example
'()': 'ext://project.util.owned_file_handler',
@end example

where @code{project.util} can be replaced with the actual name of the package
where the function resides. In the above working script, using
@code{'ext://__main__.owned_file_handler'} should work. Here, the actual callable
is resolved by @ref{13bc,,dictConfig()} from the @code{ext://} specification.

This example hopefully also points the way to how you could implement other
types of file change - e.g. setting specific POSIX permission bits - in the
same way, using @ref{52a,,os.chmod()}.

Of course, the approach could also be extended to types of handler other than a
@ref{1c96,,FileHandler} - for example, one of the rotating file handlers,
or a different type of handler altogether.

@node Using particular formatting styles throughout your application,Configuring filters with dictConfig,Customizing handlers with dictConfig,Logging Cookbook
@anchor{howto/logging-cookbook formatting-styles}@anchor{31ee}@anchor{howto/logging-cookbook using-particular-formatting-styles-throughout-your-application}@anchor{5afa}
@subsection Using particular formatting styles throughout your application


In Python 3.2, the @ref{16a3,,Formatter} gained a @code{style} keyword
parameter which, while defaulting to @code{%} for backward compatibility, allowed
the specification of @code{@{} or @code{$} to support the formatting approaches
supported by @ref{834,,str.format()} and @ref{899,,string.Template}. Note that this
governs the formatting of logging messages for final output to logs, and is
completely orthogonal to how an individual logging message is constructed.

Logging calls (@ref{1031,,debug()}, @ref{31cf,,info()} etc.) only take
positional parameters for the actual logging message itself, with keyword
parameters used only for determining options for how to handle the logging call
(e.g. the @code{exc_info} keyword parameter to indicate that traceback information
should be logged, or the @code{extra} keyword parameter to indicate additional
contextual information to be added to the log). So you cannot directly make
logging calls using @ref{834,,str.format()} or @ref{899,,string.Template} syntax,
because internally the logging package uses %-formatting to merge the format
string and the variable arguments. There would be no changing this while preserving
backward compatibility, since all logging calls which are out there in existing
code will be using %-format strings.

There have been suggestions to associate format styles with specific loggers,
but that approach also runs into backward compatibility problems because any
existing code could be using a given logger name and using %-formatting.

For logging to work interoperably between any third-party libraries and your
code, decisions about formatting need to be made at the level of the
individual logging call. This opens up a couple of ways in which alternative
formatting styles can be accommodated.

@menu
* Using LogRecord factories:: 
* Using custom message objects:: 

@end menu

@node Using LogRecord factories,Using custom message objects,,Using particular formatting styles throughout your application
@anchor{howto/logging-cookbook using-logrecord-factories}@anchor{5afb}
@subsubsection Using LogRecord factories


In Python 3.2, along with the @ref{16a3,,Formatter} changes mentioned
above, the logging package gained the ability to allow users to set their own
@ref{11ec,,LogRecord} subclasses, using the @ref{3201,,setLogRecordFactory()} function.
You can use this to set your own subclass of @code{LogRecord}, which does the
Right Thing by overriding the @ref{31ff,,getMessage()} method. The base
class implementation of this method is where the @code{msg % args} formatting
happens, and where you can substitute your alternate formatting; however, you
should be careful to support all formatting styles and allow %-formatting as
the default, to ensure interoperability with other code. Care should also be
taken to call @code{str(self.msg)}, just as the base implementation does.

Refer to the reference documentation on @ref{3201,,setLogRecordFactory()} and
@ref{11ec,,LogRecord} for more information.

@node Using custom message objects,,Using LogRecord factories,Using particular formatting styles throughout your application
@anchor{howto/logging-cookbook using-custom-message-objects}@anchor{5afc}
@subsubsection Using custom message objects


There is another, perhaps simpler way that you can use @{@}- and $- formatting to
construct your individual log messages. You may recall (from
@ref{31fe,,Using arbitrary objects as messages}) that when logging you can use an arbitrary
object as a message format string, and that the logging package will call
@ref{16a,,str()} on that object to get the actual format string. Consider the
following two classes:

@example
class BraceMessage:
    def __init__(self, fmt, /, *args, **kwargs):
        self.fmt = fmt
        self.args = args
        self.kwargs = kwargs

    def __str__(self):
        return self.fmt.format(*self.args, **self.kwargs)

class DollarMessage:
    def __init__(self, fmt, /, **kwargs):
        self.fmt = fmt
        self.kwargs = kwargs

    def __str__(self):
        from string import Template
        return Template(self.fmt).substitute(**self.kwargs)
@end example

Either of these can be used in place of a format string, to allow @{@}- or
$-formatting to be used to build the actual “message” part which appears in the
formatted log output in place of “%(message)s” or “@{message@}” or “$message”.
If you find it a little unwieldy to use the class names whenever you want to log
something, you can make it more palatable if you use an alias such as @code{M} or
@code{_} for the message (or perhaps @code{__}, if you are using @code{_} for
localization).

Examples of this approach are given below. Firstly, formatting with
@ref{834,,str.format()}:

@example
>>> __ = BraceMessage
>>> print(__('Message with @{0@} @{1@}', 2, 'placeholders'))
Message with 2 placeholders
>>> class Point: pass
...
>>> p = Point()
>>> p.x = 0.5
>>> p.y = 0.5
>>> print(__('Message with coordinates: (@{point.x:.2f@}, @{point.y:.2f@})', point=p))
Message with coordinates: (0.50, 0.50)
@end example

Secondly, formatting with @ref{899,,string.Template}:

@example
>>> __ = DollarMessage
>>> print(__('Message with $num $what', num=2, what='placeholders'))
Message with 2 placeholders
>>>
@end example

One thing to note is that you pay no significant performance penalty with this
approach: the actual formatting happens not when you make the logging call, but
when (and if) the logged message is actually about to be output to a log by a
handler. So the only slightly unusual thing which might trip you up is that the
parentheses go around the format string and the arguments, not just the format
string. That’s because the __ notation is just syntax sugar for a constructor
call to one of the @code{@var{XXX}Message} classes shown above.

@node Configuring filters with dictConfig,Customized exception formatting,Using particular formatting styles throughout your application,Logging Cookbook
@anchor{howto/logging-cookbook configuring-filters-with-dictconfig}@anchor{5afd}@anchor{howto/logging-cookbook filters-dictconfig}@anchor{5afe}
@subsection Configuring filters with @code{dictConfig()}


You `can' configure filters using @ref{13bc,,dictConfig()}, though it
might not be obvious at first glance how to do it (hence this recipe). Since
@ref{1407,,Filter} is the only filter class included in the standard
library, and it is unlikely to cater to many requirements (it’s only there as a
base class), you will typically need to define your own @code{Filter}
subclass with an overridden @ref{31f8,,filter()} method. To do this,
specify the @code{()} key in the configuration dictionary for the filter,
specifying a callable which will be used to create the filter (a class is the
most obvious, but you can provide any callable which returns a
@code{Filter} instance). Here is a complete example:

@example
import logging
import logging.config
import sys

class MyFilter(logging.Filter):
    def __init__(self, param=None):
        self.param = param

    def filter(self, record):
        if self.param is None:
            allow = True
        else:
            allow = self.param not in record.msg
        if allow:
            record.msg = 'changed: ' + record.msg
        return allow

LOGGING = @{
    'version': 1,
    'filters': @{
        'myfilter': @{
            '()': MyFilter,
            'param': 'noshow',
        @}
    @},
    'handlers': @{
        'console': @{
            'class': 'logging.StreamHandler',
            'filters': ['myfilter']
        @}
    @},
    'root': @{
        'level': 'DEBUG',
        'handlers': ['console']
    @},
@}

if __name__ == '__main__':
    logging.config.dictConfig(LOGGING)
    logging.debug('hello')
    logging.debug('hello - noshow')
@end example

This example shows how you can pass configuration data to the callable which
constructs the instance, in the form of keyword parameters. When run, the above
script will print:

@example
changed: hello
@end example

which shows that the filter is working as configured.

A couple of extra points to note:


@itemize *

@item 
If you can’t refer to the callable directly in the configuration (e.g. if it
lives in a different module, and you can’t import it directly where the
configuration dictionary is), you can use the form @code{ext://...} as described
in @ref{322d,,Access to external objects}. For example, you could have used
the text @code{'ext://__main__.MyFilter'} instead of @code{MyFilter} in the above
example.

@item 
As well as for filters, this technique can also be used to configure custom
handlers and formatters. See @ref{3221,,User-defined objects} for more
information on how logging supports using user-defined objects in its
configuration, and see the other cookbook recipe @ref{5af8,,Customizing handlers with dictConfig()} above.
@end itemize

@node Customized exception formatting,Speaking logging messages,Configuring filters with dictConfig,Logging Cookbook
@anchor{howto/logging-cookbook custom-format-exception}@anchor{5aff}@anchor{howto/logging-cookbook customized-exception-formatting}@anchor{5b00}
@subsection Customized exception formatting


There might be times when you want to do customized exception formatting - for
argument’s sake, let’s say you want exactly one line per logged event, even
when exception information is present. You can do this with a custom formatter
class, as shown in the following example:

@example
import logging

class OneLineExceptionFormatter(logging.Formatter):
    def formatException(self, exc_info):
        """
        Format an exception so that it prints on a single line.
        """
        result = super().formatException(exc_info)
        return repr(result)  # or format into one line however you want to

    def format(self, record):
        s = super().format(record)
        if record.exc_text:
            s = s.replace('\n', '@w{'}) + '|'
        return s

def configure_logging():
    fh = logging.FileHandler('output.txt', 'w')
    f = OneLineExceptionFormatter('%(asctime)s|%(levelname)s|%(message)s|',
                                  '%d/%m/%Y %H:%M:%S')
    fh.setFormatter(f)
    root = logging.getLogger()
    root.setLevel(logging.DEBUG)
    root.addHandler(fh)

def main():
    configure_logging()
    logging.info('Sample message')
    try:
        x = 1 / 0
    except ZeroDivisionError as e:
        logging.exception('ZeroDivisionError: %s', e)

if __name__ == '__main__':
    main()
@end example

When run, this produces a file with exactly two lines:

@example
28/01/2015 07:21:23|INFO|Sample message|
28/01/2015 07:21:23|ERROR|ZeroDivisionError: division by zero|'Traceback (most recent call last):\n  File "logtest7.py", line 30, in main\n    x = 1 / 0\nZeroDivisionError: division by zero'|
@end example

While the above treatment is simplistic, it points the way to how exception
information can be formatted to your liking. The @ref{105,,traceback} module may be
helpful for more specialized needs.

@node Speaking logging messages,Buffering logging messages and outputting them conditionally,Customized exception formatting,Logging Cookbook
@anchor{howto/logging-cookbook speaking-logging-messages}@anchor{5b01}@anchor{howto/logging-cookbook spoken-messages}@anchor{5b02}
@subsection Speaking logging messages


There might be situations when it is desirable to have logging messages rendered
in an audible rather than a visible format. This is easy to do if you have
text-to-speech (TTS) functionality available in your system, even if it doesn’t have
a Python binding. Most TTS systems have a command line program you can run, and
this can be invoked from a handler using @ref{dc,,subprocess}. It’s assumed here
that TTS command line programs won’t expect to interact with users or take a
long time to complete, and that the frequency of logged messages will be not so
high as to swamp the user with messages, and that it’s acceptable to have the
messages spoken one at a time rather than concurrently, The example implementation
below waits for one message to be spoken before the next is processed, and this
might cause other handlers to be kept waiting. Here is a short example showing
the approach, which assumes that the @code{espeak} TTS package is available:

@example
import logging
import subprocess
import sys

class TTSHandler(logging.Handler):
    def emit(self, record):
        msg = self.format(record)
        # Speak slowly in a female English voice
        cmd = ['espeak', '-s150', '-ven+f3', msg]
        p = subprocess.Popen(cmd, stdout=subprocess.PIPE,
                             stderr=subprocess.STDOUT)
        # wait for the program to finish
        p.communicate()

def configure_logging():
    h = TTSHandler()
    root = logging.getLogger()
    root.addHandler(h)
    # the default formatter just returns the message
    root.setLevel(logging.DEBUG)

def main():
    logging.info('Hello')
    logging.debug('Goodbye')

if __name__ == '__main__':
    configure_logging()
    sys.exit(main())
@end example

When run, this script should say “Hello” and then “Goodbye” in a female voice.

The above approach can, of course, be adapted to other TTS systems and even
other systems altogether which can process messages via external programs run
from a command line.

@node Buffering logging messages and outputting them conditionally,Sending logging messages to email with buffering,Speaking logging messages,Logging Cookbook
@anchor{howto/logging-cookbook buffered-logging}@anchor{5b03}@anchor{howto/logging-cookbook buffering-logging-messages-and-outputting-them-conditionally}@anchor{5b04}
@subsection Buffering logging messages and outputting them conditionally


There might be situations where you want to log messages in a temporary area
and only output them if a certain condition occurs. For example, you may want to
start logging debug events in a function, and if the function completes without
errors, you don’t want to clutter the log with the collected debug information,
but if there is an error, you want all the debug information to be output as well
as the error.

Here is an example which shows how you could do this using a decorator for your
functions where you want logging to behave this way. It makes use of the
@ref{3230,,logging.handlers.MemoryHandler}, which allows buffering of logged events
until some condition occurs, at which point the buffered events are @code{flushed}
- passed to another handler (the @code{target} handler) for processing. By default,
the @code{MemoryHandler} flushed when its buffer gets filled up or an event whose
level is greater than or equal to a specified threshold is seen. You can use this
recipe with a more specialised subclass of @code{MemoryHandler} if you want custom
flushing behavior.

The example script has a simple function, @code{foo}, which just cycles through
all the logging levels, writing to @code{sys.stderr} to say what level it’s about
to log at, and then actually logging a message at that level. You can pass a
parameter to @code{foo} which, if true, will log at ERROR and CRITICAL levels -
otherwise, it only logs at DEBUG, INFO and WARNING levels.

The script just arranges to decorate @code{foo} with a decorator which will do the
conditional logging that’s required. The decorator takes a logger as a parameter
and attaches a memory handler for the duration of the call to the decorated
function. The decorator can be additionally parameterised using a target handler,
a level at which flushing should occur, and a capacity for the buffer (number of
records buffered). These default to a @ref{1404,,StreamHandler} which
writes to @code{sys.stderr}, @code{logging.ERROR} and @code{100} respectively.

Here’s the script:

@example
import logging
from logging.handlers import MemoryHandler
import sys

logger = logging.getLogger(__name__)
logger.addHandler(logging.NullHandler())

def log_if_errors(logger, target_handler=None, flush_level=None, capacity=None):
    if target_handler is None:
        target_handler = logging.StreamHandler()
    if flush_level is None:
        flush_level = logging.ERROR
    if capacity is None:
        capacity = 100
    handler = MemoryHandler(capacity, flushLevel=flush_level, target=target_handler)

    def decorator(fn):
        def wrapper(*args, **kwargs):
            logger.addHandler(handler)
            try:
                return fn(*args, **kwargs)
            except Exception:
                logger.exception('call failed')
                raise
            finally:
                super(MemoryHandler, handler).flush()
                logger.removeHandler(handler)
        return wrapper

    return decorator

def write_line(s):
    sys.stderr.write('%s\n' % s)

def foo(fail=False):
    write_line('about to log at DEBUG ...')
    logger.debug('Actually logged at DEBUG')
    write_line('about to log at INFO ...')
    logger.info('Actually logged at INFO')
    write_line('about to log at WARNING ...')
    logger.warning('Actually logged at WARNING')
    if fail:
        write_line('about to log at ERROR ...')
        logger.error('Actually logged at ERROR')
        write_line('about to log at CRITICAL ...')
        logger.critical('Actually logged at CRITICAL')
    return fail

decorated_foo = log_if_errors(logger)(foo)

if __name__ == '__main__':
    logger.setLevel(logging.DEBUG)
    write_line('Calling undecorated foo with False')
    assert not foo(False)
    write_line('Calling undecorated foo with True')
    assert foo(True)
    write_line('Calling decorated foo with False')
    assert not decorated_foo(False)
    write_line('Calling decorated foo with True')
    assert decorated_foo(True)
@end example

When this script is run, the following output should be observed:

@example
Calling undecorated foo with False
about to log at DEBUG ...
about to log at INFO ...
about to log at WARNING ...
Calling undecorated foo with True
about to log at DEBUG ...
about to log at INFO ...
about to log at WARNING ...
about to log at ERROR ...
about to log at CRITICAL ...
Calling decorated foo with False
about to log at DEBUG ...
about to log at INFO ...
about to log at WARNING ...
Calling decorated foo with True
about to log at DEBUG ...
about to log at INFO ...
about to log at WARNING ...
about to log at ERROR ...
Actually logged at DEBUG
Actually logged at INFO
Actually logged at WARNING
Actually logged at ERROR
about to log at CRITICAL ...
Actually logged at CRITICAL
@end example

As you can see, actual logging output only occurs when an event is logged whose
severity is ERROR or greater, but in that case, any previous events at lower
severities are also logged.

You can of course use the conventional means of decoration:

@example
@@log_if_errors(logger)
def foo(fail=False):
    ...
@end example

@node Sending logging messages to email with buffering,Formatting times using UTC GMT via configuration,Buffering logging messages and outputting them conditionally,Logging Cookbook
@anchor{howto/logging-cookbook buffered-smtp}@anchor{5b05}@anchor{howto/logging-cookbook sending-logging-messages-to-email-with-buffering}@anchor{5b06}
@subsection Sending logging messages to email, with buffering


To illustrate how you can send log messages via email, so that a set number of
messages are sent per email, you can subclass
@ref{3283,,BufferingHandler}. In the following  example, which you can
adapt to suit your specific needs, a simple test harness is provided which allows you
to run the script with command line arguments specifying what you typically need to
send things via SMTP. (Run the downloaded script with the @code{-h} argument to see the
required and optional arguments.)

@example
import logging
import logging.handlers
import smtplib

class BufferingSMTPHandler(logging.handlers.BufferingHandler):
    def __init__(self, mailhost, port, username, password, fromaddr, toaddrs,
                 subject, capacity):
        logging.handlers.BufferingHandler.__init__(self, capacity)
        self.mailhost = mailhost
        self.mailport = port
        self.username = username
        self.password = password
        self.fromaddr = fromaddr
        if isinstance(toaddrs, str):
            toaddrs = [toaddrs]
        self.toaddrs = toaddrs
        self.subject = subject
        self.setFormatter(logging.Formatter("%(asctime)s %(levelname)-5s %(message)s"))

    def flush(self):
        if len(self.buffer) > 0:
            try:
                smtp = smtplib.SMTP(self.mailhost, self.mailport)
                smtp.starttls()
                smtp.login(self.username, self.password)
                msg = "From: %s\r\nTo: %s\r\nSubject: %s\r\n\r\n" % (self.fromaddr, ','.join(self.toaddrs), self.subject)
                for record in self.buffer:
                    s = self.format(record)
                    msg = msg + s + "\r\n"
                smtp.sendmail(self.fromaddr, self.toaddrs, msg)
                smtp.quit()
            except Exception:
                if logging.raiseExceptions:
                    raise
            self.buffer = []

if __name__ == '__main__':
    import argparse

    ap = argparse.ArgumentParser()
    aa = ap.add_argument
    aa('host', metavar='HOST', help='SMTP server')
    aa('--port', '-p', type=int, default=587, help='SMTP port')
    aa('user', metavar='USER', help='SMTP username')
    aa('password', metavar='PASSWORD', help='SMTP password')
    aa('to', metavar='TO', help='Addressee for emails')
    aa('sender', metavar='SENDER', help='Sender email address')
    aa('--subject', '-s',
       default='Test Logging email from Python logging module (buffering)',
       help='Subject of email')
    options = ap.parse_args()
    logger = logging.getLogger()
    logger.setLevel(logging.DEBUG)
    h = BufferingSMTPHandler(options.host, options.port, options.user,
                             options.password, options.sender,
                             options.to, options.subject, 10)
    logger.addHandler(h)
    for i in range(102):
        logger.info("Info index = %d", i)
    h.flush()
    h.close()
@end example

If you run this script and your SMTP server is correctly set up, you should find that
it sends eleven emails to the addressee you specify. The first ten emails will each
have ten log messages, and the eleventh will have two messages. That makes up 102
messages as specified in the script.

@node Formatting times using UTC GMT via configuration,Using a context manager for selective logging,Sending logging messages to email with buffering,Logging Cookbook
@anchor{howto/logging-cookbook formatting-times-using-utc-gmt-via-configuration}@anchor{5b07}@anchor{howto/logging-cookbook utc-formatting}@anchor{5b08}
@subsection Formatting times using UTC (GMT) via configuration


Sometimes you want to format times using UTC, which can be done using a class
such as @code{UTCFormatter}, shown below:

@example
import logging
import time

class UTCFormatter(logging.Formatter):
    converter = time.gmtime
@end example

and you can then use the @code{UTCFormatter} in your code instead of
@ref{16a3,,Formatter}. If you want to do that via configuration, you can
use the @ref{13bc,,dictConfig()} API with an approach illustrated by
the following complete example:

@example
import logging
import logging.config
import time

class UTCFormatter(logging.Formatter):
    converter = time.gmtime

LOGGING = @{
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': @{
        'utc': @{
            '()': UTCFormatter,
            'format': '%(asctime)s %(message)s',
        @},
        'local': @{
            'format': '%(asctime)s %(message)s',
        @}
    @},
    'handlers': @{
        'console1': @{
            'class': 'logging.StreamHandler',
            'formatter': 'utc',
        @},
        'console2': @{
            'class': 'logging.StreamHandler',
            'formatter': 'local',
        @},
    @},
    'root': @{
        'handlers': ['console1', 'console2'],
   @}
@}

if __name__ == '__main__':
    logging.config.dictConfig(LOGGING)
    logging.warning('The local time is %s', time.asctime())
@end example

When this script is run, it should print something like:

@example
2015-10-17 12:53:29,501 The local time is Sat Oct 17 13:53:29 2015
2015-10-17 13:53:29,501 The local time is Sat Oct 17 13:53:29 2015
@end example

showing how the time is formatted both as local time and UTC, one for each
handler.

@node Using a context manager for selective logging,A CLI application starter template,Formatting times using UTC GMT via configuration,Logging Cookbook
@anchor{howto/logging-cookbook context-manager}@anchor{5b09}@anchor{howto/logging-cookbook using-a-context-manager-for-selective-logging}@anchor{5b0a}
@subsection Using a context manager for selective logging


There are times when it would be useful to temporarily change the logging
configuration and revert it back after doing something. For this, a context
manager is the most obvious way of saving and restoring the logging context.
Here is a simple example of such a context manager, which allows you to
optionally change the logging level and add a logging handler purely in the
scope of the context manager:

@example
import logging
import sys

class LoggingContext:
    def __init__(self, logger, level=None, handler=None, close=True):
        self.logger = logger
        self.level = level
        self.handler = handler
        self.close = close

    def __enter__(self):
        if self.level is not None:
            self.old_level = self.logger.level
            self.logger.setLevel(self.level)
        if self.handler:
            self.logger.addHandler(self.handler)

    def __exit__(self, et, ev, tb):
        if self.level is not None:
            self.logger.setLevel(self.old_level)
        if self.handler:
            self.logger.removeHandler(self.handler)
        if self.handler and self.close:
            self.handler.close()
        # implicit return of None => don't swallow exceptions
@end example

If you specify a level value, the logger’s level is set to that value in the
scope of the with block covered by the context manager. If you specify a
handler, it is added to the logger on entry to the block and removed on exit
from the block. You can also ask the manager to close the handler for you on
block exit - you could do this if you don’t need the handler any more.

To illustrate how it works, we can add the following block of code to the
above:

@example
if __name__ == '__main__':
    logger = logging.getLogger('foo')
    logger.addHandler(logging.StreamHandler())
    logger.setLevel(logging.INFO)
    logger.info('1. This should appear just once on stderr.')
    logger.debug('2. This should not appear.')
    with LoggingContext(logger, level=logging.DEBUG):
        logger.debug('3. This should appear once on stderr.')
    logger.debug('4. This should not appear.')
    h = logging.StreamHandler(sys.stdout)
    with LoggingContext(logger, level=logging.DEBUG, handler=h, close=True):
        logger.debug('5. This should appear twice - once on stderr and once on stdout.')
    logger.info('6. This should appear just once on stderr.')
    logger.debug('7. This should not appear.')
@end example

We initially set the logger’s level to @code{INFO}, so message #1 appears and
message #2 doesn’t. We then change the level to @code{DEBUG} temporarily in the
following @code{with} block, and so message #3 appears. After the block exits, the
logger’s level is restored to @code{INFO} and so message #4 doesn’t appear. In the
next @code{with} block, we set the level to @code{DEBUG} again but also add a handler
writing to @code{sys.stdout}. Thus, message #5 appears twice on the console (once
via @code{stderr} and once via @code{stdout}). After the @code{with} statement’s
completion, the status is as it was before so message #6 appears (like message
#1) whereas message #7 doesn’t (just like message #2).

If we run the resulting script, the result is as follows:

@example
$ python logctx.py
1. This should appear just once on stderr.
3. This should appear once on stderr.
5. This should appear twice - once on stderr and once on stdout.
5. This should appear twice - once on stderr and once on stdout.
6. This should appear just once on stderr.
@end example

If we run it again, but pipe @code{stderr} to @code{/dev/null}, we see the following,
which is the only message written to @code{stdout}:

@example
$ python logctx.py 2>/dev/null
5. This should appear twice - once on stderr and once on stdout.
@end example

Once again, but piping @code{stdout} to @code{/dev/null}, we get:

@example
$ python logctx.py >/dev/null
1. This should appear just once on stderr.
3. This should appear once on stderr.
5. This should appear twice - once on stderr and once on stdout.
6. This should appear just once on stderr.
@end example

In this case, the message #5 printed to @code{stdout} doesn’t appear, as expected.

Of course, the approach described here can be generalised, for example to attach
logging filters temporarily. Note that the above code works in Python 2 as well
as Python 3.

@node A CLI application starter template,A Qt GUI for logging,Using a context manager for selective logging,Logging Cookbook
@anchor{howto/logging-cookbook a-cli-application-starter-template}@anchor{5b0b}@anchor{howto/logging-cookbook starter-template}@anchor{5b0c}
@subsection A CLI application starter template


Here’s an example which shows how you can:


@itemize *

@item 
Use a logging level based on command-line arguments

@item 
Dispatch to multiple subcommands in separate files, all logging at the same
level in a consistent way

@item 
Make use of simple, minimal configuration
@end itemize

Suppose we have a command-line application whose job is to stop, start or
restart some services. This could be organised for the purposes of illustration
as a file @code{app.py} that is the main script for the application, with individual
commands implemented in @code{start.py}, @code{stop.py} and @code{restart.py}. Suppose
further that we want to control the verbosity of the application via a
command-line argument, defaulting to @code{logging.INFO}. Here’s one way that
@code{app.py} could be written:

@example
import argparse
import importlib
import logging
import os
import sys

def main(args=None):
    scriptname = os.path.basename(__file__)
    parser = argparse.ArgumentParser(scriptname)
    levels = ('DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL')
    parser.add_argument('--log-level', default='INFO', choices=levels)
    subparsers = parser.add_subparsers(dest='command',
                                       help='Available commands:')
    start_cmd = subparsers.add_parser('start', help='Start a service')
    start_cmd.add_argument('name', metavar='NAME',
                           help='Name of service to start')
    stop_cmd = subparsers.add_parser('stop',
                                     help='Stop one or more services')
    stop_cmd.add_argument('names', metavar='NAME', nargs='+',
                          help='Name of service to stop')
    restart_cmd = subparsers.add_parser('restart',
                                        help='Restart one or more services')
    restart_cmd.add_argument('names', metavar='NAME', nargs='+',
                             help='Name of service to restart')
    options = parser.parse_args()
    # the code to dispatch commands could all be in this file. For the purposes
    # of illustration only, we implement each command in a separate module.
    try:
        mod = importlib.import_module(options.command)
        cmd = getattr(mod, 'command')
    except (ImportError, AttributeError):
        print('Unable to find the code for command \'%s\'@w{'} % options.command)
        return 1
    # Could get fancy here and load configuration from file or dictionary
    logging.basicConfig(level=options.log_level,
                        format='%(levelname)s %(name)s %(message)s')
    cmd(options)

if __name__ == '__main__':
    sys.exit(main())
@end example

And the @code{start}, @code{stop} and @code{restart} commands can be implemented in
separate modules, like so for starting:

@example
# start.py
import logging

logger = logging.getLogger(__name__)

def command(options):
    logger.debug('About to start %s', options.name)
    # actually do the command processing here ...
    logger.info('Started the \'%s\' service.', options.name)
@end example

and thus for stopping:

@example
# stop.py
import logging

logger = logging.getLogger(__name__)

def command(options):
    n = len(options.names)
    if n == 1:
        plural = '@w{'}
        services = '\'%s\'@w{'} % options.names[0]
    else:
        plural = 's'
        services = ', '.join('\'%s\'@w{'} % name for name in options.names)
        i = services.rfind(', ')
        services = services[:i] + ' and ' + services[i + 2:]
    logger.debug('About to stop %s', services)
    # actually do the command processing here ...
    logger.info('Stopped the %s service%s.', services, plural)
@end example

and similarly for restarting:

@example
# restart.py
import logging

logger = logging.getLogger(__name__)

def command(options):
    n = len(options.names)
    if n == 1:
        plural = '@w{'}
        services = '\'%s\'@w{'} % options.names[0]
    else:
        plural = 's'
        services = ', '.join('\'%s\'@w{'} % name for name in options.names)
        i = services.rfind(', ')
        services = services[:i] + ' and ' + services[i + 2:]
    logger.debug('About to restart %s', services)
    # actually do the command processing here ...
    logger.info('Restarted the %s service%s.', services, plural)
@end example

If we run this application with the default log level, we get output like this:

@example
$ python app.py start foo
INFO start Started the 'foo' service.

$ python app.py stop foo bar
INFO stop Stopped the 'foo' and 'bar' services.

$ python app.py restart foo bar baz
INFO restart Restarted the 'foo', 'bar' and 'baz' services.
@end example

The first word is the logging level, and the second word is the module or
package name of the place where the event was logged.

If we change the logging level, then we can change the information sent to the
log. For example, if we want more information:

@example
$ python app.py --log-level DEBUG start foo
DEBUG start About to start foo
INFO start Started the 'foo' service.

$ python app.py --log-level DEBUG stop foo bar
DEBUG stop About to stop 'foo' and 'bar'
INFO stop Stopped the 'foo' and 'bar' services.

$ python app.py --log-level DEBUG restart foo bar baz
DEBUG restart About to restart 'foo', 'bar' and 'baz'
INFO restart Restarted the 'foo', 'bar' and 'baz' services.
@end example

And if we want less:

@example
$ python app.py --log-level WARNING start foo
$ python app.py --log-level WARNING stop foo bar
$ python app.py --log-level WARNING restart foo bar baz
@end example

In this case, the commands don’t print anything to the console, since nothing
at @code{WARNING} level or above is logged by them.

@node A Qt GUI for logging,Logging to syslog with RFC5424 support,A CLI application starter template,Logging Cookbook
@anchor{howto/logging-cookbook a-qt-gui-for-logging}@anchor{5b0d}@anchor{howto/logging-cookbook qt-gui}@anchor{5b0e}
@subsection A Qt GUI for logging


A question that comes up from time to time is about how to log to a GUI
application. The Qt@footnote{https://www.qt.io/} framework is a popular
cross-platform UI framework with Python bindings using PySide2@footnote{https://pypi.org/project/PySide2/}
or PyQt5@footnote{https://pypi.org/project/PyQt5/} libraries.

The following example shows how to log to a Qt GUI. This introduces a simple
@code{QtHandler} class which takes a callable, which should be a slot in the main
thread that does GUI updates. A worker thread is also created to show how you
can log to the GUI from both the UI itself (via a button for manual logging)
as well as a worker thread doing work in the background (here, just logging
messages at random levels with random short delays in between).

The worker thread is implemented using Qt’s @code{QThread} class rather than the
@ref{f3,,threading} module, as there are circumstances where one has to use
@code{QThread}, which offers better integration with other @code{Qt} components.

The code should work with recent releases of any of @code{PySide6}, @code{PyQt6},
@code{PySide2} or @code{PyQt5}. You should be able to adapt the approach to earlier
versions of Qt. Please refer to the comments in the code snippet for more
detailed information.

@example
import logging
import random
import sys
import time

# Deal with minor differences between different Qt packages
try:
    from PySide6 import QtCore, QtGui, QtWidgets
    Signal = QtCore.Signal
    Slot = QtCore.Slot
except ImportError:
    try:
        from PyQt6 import QtCore, QtGui, QtWidgets
        Signal = QtCore.pyqtSignal
        Slot = QtCore.pyqtSlot
    except ImportError:
        try:
            from PySide2 import QtCore, QtGui, QtWidgets
            Signal = QtCore.Signal
            Slot = QtCore.Slot
        except ImportError:
            from PyQt5 import QtCore, QtGui, QtWidgets
            Signal = QtCore.pyqtSignal
            Slot = QtCore.pyqtSlot

logger = logging.getLogger(__name__)


#
# Signals need to be contained in a QObject or subclass in order to be correctly
# initialized.
#
class Signaller(QtCore.QObject):
    signal = Signal(str, logging.LogRecord)

#
# Output to a Qt GUI is only supposed to happen on the main thread. So, this
# handler is designed to take a slot function which is set up to run in the main
# thread. In this example, the function takes a string argument which is a
# formatted log message, and the log record which generated it. The formatted
# string is just a convenience - you could format a string for output any way
# you like in the slot function itself.
#
# You specify the slot function to do whatever GUI updates you want. The handler
# doesn't know or care about specific UI elements.
#
class QtHandler(logging.Handler):
    def __init__(self, slotfunc, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.signaller = Signaller()
        self.signaller.signal.connect(slotfunc)

    def emit(self, record):
        s = self.format(record)
        self.signaller.signal.emit(s, record)

#
# This example uses QThreads, which means that the threads at the Python level
# are named something like "Dummy-1". The function below gets the Qt name of the
# current thread.
#
def ctname():
    return QtCore.QThread.currentThread().objectName()


#
# Used to generate random levels for logging.
#
LEVELS = (logging.DEBUG, logging.INFO, logging.WARNING, logging.ERROR,
          logging.CRITICAL)

#
# This worker class represents work that is done in a thread separate to the
# main thread. The way the thread is kicked off to do work is via a button press
# that connects to a slot in the worker.
#
# Because the default threadName value in the LogRecord isn't much use, we add
# a qThreadName which contains the QThread name as computed above, and pass that
# value in an "extra" dictionary which is used to update the LogRecord with the
# QThread name.
#
# This example worker just outputs messages sequentially, interspersed with
# random delays of the order of a few seconds.
#
class Worker(QtCore.QObject):
    @@Slot()
    def start(self):
        extra = @{'qThreadName': ctname() @}
        logger.debug('Started work', extra=extra)
        i = 1
        # Let the thread run until interrupted. This allows reasonably clean
        # thread termination.
        while not QtCore.QThread.currentThread().isInterruptionRequested():
            delay = 0.5 + random.random() * 2
            time.sleep(delay)
            try:
                if random.random() < 0.1:
                    raise ValueError('Exception raised: %d' % i)
                else:
                    level = random.choice(LEVELS)
                    logger.log(level, 'Message after delay of %3.1f: %d', delay, i, extra=extra)
            except ValueError as e:
                logger.exception('Failed: %s', e, extra=extra)
            i += 1

#
# Implement a simple UI for this cookbook example. This contains:
#
# * A read-only text edit window which holds formatted log messages
# * A button to start work and log stuff in a separate thread
# * A button to log something from the main thread
# * A button to clear the log window
#
class Window(QtWidgets.QWidget):

    COLORS = @{
        logging.DEBUG: 'black',
        logging.INFO: 'blue',
        logging.WARNING: 'orange',
        logging.ERROR: 'red',
        logging.CRITICAL: 'purple',
    @}

    def __init__(self, app):
        super().__init__()
        self.app = app
        self.textedit = te = QtWidgets.QPlainTextEdit(self)
        # Set whatever the default monospace font is for the platform
        f = QtGui.QFont('nosuchfont')
        if hasattr(f, 'Monospace'):
            f.setStyleHint(f.Monospace)
        else:
            f.setStyleHint(f.StyleHint.Monospace)  # for Qt6
        te.setFont(f)
        te.setReadOnly(True)
        PB = QtWidgets.QPushButton
        self.work_button = PB('Start background work', self)
        self.log_button = PB('Log a message at a random level', self)
        self.clear_button = PB('Clear log window', self)
        self.handler = h = QtHandler(self.update_status)
        # Remember to use qThreadName rather than threadName in the format string.
        fs = '%(asctime)s %(qThreadName)-12s %(levelname)-8s %(message)s'
        formatter = logging.Formatter(fs)
        h.setFormatter(formatter)
        logger.addHandler(h)
        # Set up to terminate the QThread when we exit
        app.aboutToQuit.connect(self.force_quit)

        # Lay out all the widgets
        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(te)
        layout.addWidget(self.work_button)
        layout.addWidget(self.log_button)
        layout.addWidget(self.clear_button)
        self.setFixedSize(900, 400)

        # Connect the non-worker slots and signals
        self.log_button.clicked.connect(self.manual_update)
        self.clear_button.clicked.connect(self.clear_display)

        # Start a new worker thread and connect the slots for the worker
        self.start_thread()
        self.work_button.clicked.connect(self.worker.start)
        # Once started, the button should be disabled
        self.work_button.clicked.connect(lambda : self.work_button.setEnabled(False))

    def start_thread(self):
        self.worker = Worker()
        self.worker_thread = QtCore.QThread()
        self.worker.setObjectName('Worker')
        self.worker_thread.setObjectName('WorkerThread')  # for qThreadName
        self.worker.moveToThread(self.worker_thread)
        # This will start an event loop in the worker thread
        self.worker_thread.start()

    def kill_thread(self):
        # Just tell the worker to stop, then tell it to quit and wait for that
        # to happen
        self.worker_thread.requestInterruption()
        if self.worker_thread.isRunning():
            self.worker_thread.quit()
            self.worker_thread.wait()
        else:
            print('worker has already exited.')

    def force_quit(self):
        # For use when the window is closed
        if self.worker_thread.isRunning():
            self.kill_thread()

    # The functions below update the UI and run in the main thread because
    # that's where the slots are set up

    @@Slot(str, logging.LogRecord)
    def update_status(self, status, record):
        color = self.COLORS.get(record.levelno, 'black')
        s = '<pre><font color="%s">%s</font></pre>' % (color, status)
        self.textedit.appendHtml(s)

    @@Slot()
    def manual_update(self):
        # This function uses the formatted message passed in, but also uses
        # information from the record to format the message in an appropriate
        # color according to its severity (level).
        level = random.choice(LEVELS)
        extra = @{'qThreadName': ctname() @}
        logger.log(level, 'Manually logged!', extra=extra)

    @@Slot()
    def clear_display(self):
        self.textedit.clear()


def main():
    QtCore.QThread.currentThread().setObjectName('MainThread')
    logging.getLogger().setLevel(logging.DEBUG)
    app = QtWidgets.QApplication(sys.argv)
    example = Window(app)
    example.show()
    if hasattr(app, 'exec'):
        rc = app.exec()
    else:
        rc = app.exec_()
    sys.exit(rc)

if __name__=='__main__':
    main()
@end example

@node Logging to syslog with RFC5424 support,How to treat a logger like an output stream,A Qt GUI for logging,Logging Cookbook
@anchor{howto/logging-cookbook logging-to-syslog-with-rfc5424-support}@anchor{5b0f}
@subsection Logging to syslog with RFC5424 support


Although 
@geindex RFC; RFC 5424
RFC 5424@footnote{https://datatracker.ietf.org/doc/html/rfc5424.html} dates from 2009, most syslog servers are configured by default to
use the older 
@geindex RFC; RFC 3164
RFC 3164@footnote{https://datatracker.ietf.org/doc/html/rfc3164.html}, which hails from 2001. When @code{logging} was added to Python
in 2003, it supported the earlier (and only existing) protocol at the time. Since
RFC 5424 came out, as there has not been widespread deployment of it in syslog
servers, the @ref{86e,,SysLogHandler} functionality has not been
updated.

RFC 5424 contains some useful features such as support for structured data, and if you
need to be able to log to a syslog server with support for it, you can do so with a
subclassed handler which looks something like this:

@example
import datetime as dt
import logging.handlers
import re
import socket
import time

class SysLogHandler5424(logging.handlers.SysLogHandler):

    tz_offset = re.compile(r'([+-]\d@{2@})(\d@{2@})$')
    escaped = re.compile(r'([\]"\\])')

    def __init__(self, *args, **kwargs):
        self.msgid = kwargs.pop('msgid', None)
        self.appname = kwargs.pop('appname', None)
        super().__init__(*args, **kwargs)

    def format(self, record):
        version = 1
        asctime = dt.datetime.fromtimestamp(record.created).isoformat()
        m = self.tz_offset.match(time.strftime('%z'))
        has_offset = False
        if m and time.timezone:
            hrs, mins = m.groups()
            if int(hrs) or int(mins):
                has_offset = True
        if not has_offset:
            asctime += 'Z'
        else:
            asctime += f'@{hrs@}:@{mins@}'
        try:
            hostname = socket.gethostname()
        except Exception:
            hostname = '-'
        appname = self.appname or '-'
        procid = record.process
        msgid = '-'
        msg = super().format(record)
        sdata = '-'
        if hasattr(record, 'structured_data'):
            sd = record.structured_data
            # This should be a dict where the keys are SD-ID and the value is a
            # dict mapping PARAM-NAME to PARAM-VALUE (refer to the RFC for what these
            # mean)
            # There's no error checking here - it's purely for illustration, and you
            # can adapt this code for use in production environments
            parts = []

            def replacer(m):
                g = m.groups()
                return '\\' + g[0]

            for sdid, dv in sd.items():
                part = f'[@{sdid@}'
                for k, v in dv.items():
                    s = str(v)
                    s = self.escaped.sub(replacer, s)
                    part += f' @{k@}="@{s@}"'
                part += ']'
                parts.append(part)
            sdata = '@w{'}.join(parts)
        return f'@{version@} @{asctime@} @{hostname@} @{appname@} @{procid@} @{msgid@} @{sdata@} @{msg@}'
@end example

You’ll need to be familiar with RFC 5424 to fully understand the above code, and it
may be that you have slightly different needs (e.g. for how you pass structural data
to the log). Nevertheless, the above should be adaptable to your speciric needs. With
the above handler, you’d pass structured data using something like this:

@example
sd = @{
    'foo@@12345': @{'bar': 'baz', 'baz': 'bozz', 'fizz': r'buzz'@},
    'foo@@54321': @{'rab': 'baz', 'zab': 'bozz', 'zzif': r'buzz'@}
@}
extra = @{'structured_data': sd@}
i = 1
logger.debug('Message %d', i, extra=extra)
@end example

@node How to treat a logger like an output stream,How to uniformly handle newlines in logging output,Logging to syslog with RFC5424 support,Logging Cookbook
@anchor{howto/logging-cookbook how-to-treat-a-logger-like-an-output-stream}@anchor{5b10}
@subsection How to treat a logger like an output stream


Sometimes, you need to interface to a third-party API which expects a file-like
object to write to, but you want to direct the API’s output to a logger. You
can do this using a class which wraps a logger with a file-like API.
Here’s a short script illustrating such a class:

@example
import logging

class LoggerWriter:
    def __init__(self, logger, level):
        self.logger = logger
        self.level = level

    def write(self, message):
        if message != '\n':  # avoid printing bare newlines, if you like
            self.logger.log(self.level, message)

    def flush(self):
        # doesn't actually do anything, but might be expected of a file-like
        # object - so optional depending on your situation
        pass

    def close(self):
        # doesn't actually do anything, but might be expected of a file-like
        # object - so optional depending on your situation. You might want
        # to set a flag so that later calls to write raise an exception
        pass

def main():
    logging.basicConfig(level=logging.DEBUG)
    logger = logging.getLogger('demo')
    info_fp = LoggerWriter(logger, logging.INFO)
    debug_fp = LoggerWriter(logger, logging.DEBUG)
    print('An INFO message', file=info_fp)
    print('A DEBUG message', file=debug_fp)

if __name__ == "__main__":
    main()
@end example

When this script is run, it prints

@example
INFO:demo:An INFO message
DEBUG:demo:A DEBUG message
@end example

You could also use @code{LoggerWriter} to redirect @code{sys.stdout} and
@code{sys.stderr} by doing something like this:

@example
import sys

sys.stdout = LoggerWriter(logger, logging.INFO)
sys.stderr = LoggerWriter(logger, logging.WARNING)
@end example

You should do this `after' configuring logging for your needs. In the above
example, the @ref{bf9,,basicConfig()} call does this (using the
@code{sys.stderr} value `before' it is overwritten by a @code{LoggerWriter}
instance). Then, you’d get this kind of result:

@example
>>> print('Foo')
INFO:demo:Foo
>>> print('Bar', file=sys.stderr)
WARNING:demo:Bar
>>>
@end example

Of course, the examples above show output according to the format used by
@ref{bf9,,basicConfig()}, but you can use a different formatter when you
configure logging.

Note that with the above scheme, you are somewhat at the mercy of buffering and
the sequence of write calls which you are intercepting. For example, with the
definition of @code{LoggerWriter} above, if you have the snippet

@example
sys.stderr = LoggerWriter(logger, logging.WARNING)
1 / 0
@end example

then running the script results in

@example
WARNING:demo:Traceback (most recent call last):

WARNING:demo:  File "/home/runner/cookbook-loggerwriter/test.py", line 53, in <module>

WARNING:demo:
WARNING:demo:main()
WARNING:demo:  File "/home/runner/cookbook-loggerwriter/test.py", line 49, in main

WARNING:demo:
WARNING:demo:1 / 0
WARNING:demo:ZeroDivisionError
WARNING:demo::
WARNING:demo:division by zero
@end example

As you can see, this output isn’t ideal. That’s because the underlying code
which writes to @code{sys.stderr} makes multiple writes, each of which results in a
separate logged line (for example, the last three lines above). To get around
this problem, you need to buffer things and only output log lines when newlines
are seen. Let’s use a slightly better implementation of @code{LoggerWriter}:

@example
class BufferingLoggerWriter(LoggerWriter):
    def __init__(self, logger, level):
        super().__init__(logger, level)
        self.buffer = '@w{'}

    def write(self, message):
        if '\n' not in message:
            self.buffer += message
        else:
            parts = message.split('\n')
            if self.buffer:
                s = self.buffer + parts.pop(0)
                self.logger.log(self.level, s)
            self.buffer = parts.pop()
            for part in parts:
                self.logger.log(self.level, part)
@end example

This just buffers up stuff until a newline is seen, and then logs complete
lines. With this approach, you get better output:

@example
WARNING:demo:Traceback (most recent call last):
WARNING:demo:  File "/home/runner/cookbook-loggerwriter/main.py", line 55, in <module>
WARNING:demo:    main()
WARNING:demo:  File "/home/runner/cookbook-loggerwriter/main.py", line 52, in main
WARNING:demo:    1/0
WARNING:demo:ZeroDivisionError: division by zero
@end example

@node How to uniformly handle newlines in logging output,Patterns to avoid,How to treat a logger like an output stream,Logging Cookbook
@anchor{howto/logging-cookbook how-to-uniformly-handle-newlines-in-logging-output}@anchor{5b11}
@subsection How to uniformly handle newlines in logging output


Usually, messages that are logged (say to console or file) consist of a single
line of text. However, sometimes there is a need to handle messages with
multiple lines - whether because a logging format string contains newlines, or
logged data contains newlines. If you want to handle such messages uniformly, so
that each line in the logged message appears uniformly formatted as if it was
logged separately, you can do this using a handler mixin, as in the following
snippet:

@example
# Assume this is in a module mymixins.py
import copy

class MultilineMixin:
    def emit(self, record):
        s = record.getMessage()
        if '\n' not in s:
            super().emit(record)
        else:
            lines = s.splitlines()
            rec = copy.copy(record)
            rec.args = None
            for line in lines:
                rec.msg = line
                super().emit(rec)
@end example

You can use the mixin as in the following script:

@example
import logging

from mymixins import MultilineMixin

logger = logging.getLogger(__name__)

class StreamHandler(MultilineMixin, logging.StreamHandler):
    pass

if __name__ == '__main__':
    logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(levelname)-9s %(message)s',
                        handlers = [StreamHandler()])
    logger.debug('Single line')
    logger.debug('Multiple lines:\nfool me once ...')
    logger.debug('Another single line')
    logger.debug('Multiple lines:\n%s', 'fool me ...\ncan\'t get fooled again')
@end example

The script, when run, prints something like:

@example
2025-07-02 13:54:47,234 DEBUG     Single line
2025-07-02 13:54:47,234 DEBUG     Multiple lines:
2025-07-02 13:54:47,234 DEBUG     fool me once ...
2025-07-02 13:54:47,234 DEBUG     Another single line
2025-07-02 13:54:47,234 DEBUG     Multiple lines:
2025-07-02 13:54:47,234 DEBUG     fool me ...
2025-07-02 13:54:47,234 DEBUG     can't get fooled again
@end example

If, on the other hand, you are concerned about log injection@footnote{https://owasp.org/www-community/attacks/Log_Injection}, you can use a
formatter which escapes newlines, as per the following example:

@example
import logging

logger = logging.getLogger(__name__)

class EscapingFormatter(logging.Formatter):
    def format(self, record):
        s = super().format(record)
        return s.replace('\n', r'\n')

if __name__ == '__main__':
    h = logging.StreamHandler()
    h.setFormatter(EscapingFormatter('%(asctime)s %(levelname)-9s %(message)s'))
    logging.basicConfig(level=logging.DEBUG, handlers = [h])
    logger.debug('Single line')
    logger.debug('Multiple lines:\nfool me once ...')
    logger.debug('Another single line')
    logger.debug('Multiple lines:\n%s', 'fool me ...\ncan\'t get fooled again')
@end example

You can, of course, use whatever escaping scheme makes the most sense for you.
The script, when run, should produce output like this:

@example
2025-07-09 06:47:33,783 DEBUG     Single line
2025-07-09 06:47:33,783 DEBUG     Multiple lines:\nfool me once ...
2025-07-09 06:47:33,783 DEBUG     Another single line
2025-07-09 06:47:33,783 DEBUG     Multiple lines:\nfool me ...\ncan't get fooled again
@end example

Escaping behaviour can’t be the stdlib default , as it would break backwards
compatibility.

@c patterns-to-avoid:

@node Patterns to avoid,Other resources<2>,How to uniformly handle newlines in logging output,Logging Cookbook
@anchor{howto/logging-cookbook patterns-to-avoid}@anchor{5b12}
@subsection Patterns to avoid


Although the preceding sections have described ways of doing things you might
need to do or deal with, it is worth mentioning some usage patterns which are
`unhelpful', and which should therefore be avoided in most cases. The following
sections are in no particular order.

@menu
* Opening the same log file multiple times:: 
* Using loggers as attributes in a class or passing them as parameters:: 
* Adding handlers other than NullHandler to a logger in a library:: 
* Creating a lot of loggers:: 

@end menu

@node Opening the same log file multiple times,Using loggers as attributes in a class or passing them as parameters,,Patterns to avoid
@anchor{howto/logging-cookbook opening-the-same-log-file-multiple-times}@anchor{5b13}
@subsubsection Opening the same log file multiple times


On Windows, you will generally not be able to open the same file multiple times
as this will lead to a “file is in use by another process” error. However, on
POSIX platforms you’ll not get any errors if you open the same file multiple
times. This could be done accidentally, for example by:


@itemize *

@item 
Adding a file handler more than once which references the same file (e.g. by
a copy/paste/forget-to-change error).

@item 
Opening two files that look different, as they have different names, but are
the same because one is a symbolic link to the other.

@item 
Forking a process, following which both parent and child have a reference to
the same file. This might be through use of the @ref{98,,multiprocessing} module,
for example.
@end itemize

Opening a file multiple times might `appear' to work most of the time, but can
lead to a number of problems in practice:


@itemize *

@item 
Logging output can be garbled because multiple threads or processes try to
write to the same file. Although logging guards against concurrent use of the
same handler instance by multiple threads, there is no such protection if
concurrent writes are attempted by two different threads using two different
handler instances which happen to point to the same file.

@item 
An attempt to delete a file (e.g. during file rotation) silently fails,
because there is another reference pointing to it. This can lead to confusion
and wasted debugging time - log entries end up in unexpected places, or are
lost altogether. Or a file that was supposed to be moved remains in place,
and grows in size unexpectedly despite size-based rotation being supposedly
in place.
@end itemize

Use the techniques outlined in @ref{5ae3,,Logging to a single file from multiple processes} to circumvent such
issues.

@node Using loggers as attributes in a class or passing them as parameters,Adding handlers other than NullHandler to a logger in a library,Opening the same log file multiple times,Patterns to avoid
@anchor{howto/logging-cookbook using-loggers-as-attributes-in-a-class-or-passing-them-as-parameters}@anchor{5b14}
@subsubsection Using loggers as attributes in a class or passing them as parameters


While there might be unusual cases where you’ll need to do this, in general
there is no point because loggers are singletons. Code can always access a
given logger instance by name using @code{logging.getLogger(name)}, so passing
instances around and holding them as instance attributes is pointless. Note
that in other languages such as Java and C#, loggers are often static class
attributes. However, this pattern doesn’t make sense in Python, where the
module (and not the class) is the unit of software decomposition.

@node Adding handlers other than NullHandler to a logger in a library,Creating a lot of loggers,Using loggers as attributes in a class or passing them as parameters,Patterns to avoid
@anchor{howto/logging-cookbook adding-handlers-other-than-nullhandler-to-a-logger-in-a-library}@anchor{5b15}
@subsubsection Adding handlers other than @code{NullHandler} to a logger in a library


Configuring logging by adding handlers, formatters and filters is the
responsibility of the application developer, not the library developer. If you
are maintaining a library, ensure that you don’t add handlers to any of your
loggers other than a @ref{1490,,NullHandler} instance.

@node Creating a lot of loggers,,Adding handlers other than NullHandler to a logger in a library,Patterns to avoid
@anchor{howto/logging-cookbook creating-a-lot-of-loggers}@anchor{5b16}
@subsubsection Creating a lot of loggers


Loggers are singletons that are never freed during a script execution, and so
creating lots of loggers will use up memory which can’t then be freed. Rather
than create a logger per e.g. file processed or network connection made, use
the @ref{3205,,existing mechanisms} for passing contextual
information into your logs and restrict the loggers created to those describing
areas within your application (generally modules, but occasionally slightly
more fine-grained than that).

@node Other resources<2>,,Patterns to avoid,Logging Cookbook
@anchor{howto/logging-cookbook cookbook-ref-links}@anchor{5acf}@anchor{howto/logging-cookbook other-resources}@anchor{5b17}
@subsection Other resources



@subsubheading See also



@table @asis

@item Module @ref{8b,,logging}

API reference for the logging module.

@item Module @ref{8c,,logging.config}

Configuration API for the logging module.

@item Module @ref{8d,,logging.handlers}

Useful handlers included with the logging module.
@end table

@ref{1401,,Basic Tutorial}

@ref{1402,,Advanced Tutorial}


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Regular expression HOWTO,Socket Programming HOWTO,Logging Cookbook,Python HOWTOs
@anchor{howto/regex doc}@anchor{5b18}@anchor{howto/regex regex-howto}@anchor{27cc}@anchor{howto/regex regular-expression-howto}@anchor{5b19}@anchor{howto/regex translation-repo}@anchor{5b1a}
@section Regular expression HOWTO


@*Author: 
A.M. Kuchling <@email{amk@@amk.ca}>


@c TODO:
@c Document lookbehind assertions
@c Better way of displaying a RE, a string, and what it matches
@c Mention optional argument to match.groups()
@c Unicode (at least a reference)

@subsubheading Abstract



This document is an introductory tutorial to using regular expressions in Python
with the @ref{be,,re} module.  It provides a gentler introduction than the
corresponding section in the Library Reference.

@menu
* Introduction: Introduction<16>. 
* Simple patterns:: 
* Using regular expressions:: 
* More pattern power:: 
* Modifying strings:: 
* Common problems:: 
* Feedback:: 

@end menu

@node Introduction<16>,Simple patterns,,Regular expression HOWTO
@anchor{howto/regex introduction}@anchor{5b1b}
@subsection Introduction


Regular expressions (called REs, or regexes, or regex patterns) are essentially
a tiny, highly specialized programming language embedded inside Python and made
available through the @ref{be,,re} module. Using this little language, you specify
the rules for the set of possible strings that you want to match; this set might
contain English sentences, or e-mail addresses, or TeX commands, or anything you
like.  You can then ask questions such as “Does this string match the pattern?”,
or “Is there a match for the pattern anywhere in this string?”.  You can also
use REs to modify a string or to split it apart in various ways.

Regular expression patterns are compiled into a series of bytecodes which are
then executed by a matching engine written in C.  For advanced use, it may be
necessary to pay careful attention to how the engine will execute a given RE,
and write the RE in a certain way in order to produce bytecode that runs faster.
Optimization isn’t covered in this document, because it requires that you have a
good understanding of the matching engine’s internals.

The regular expression language is relatively small and restricted, so not all
possible string processing tasks can be done using regular expressions.  There
are also tasks that `can' be done with regular expressions, but the expressions
turn out to be very complicated.  In these cases, you may be better off writing
Python code to do the processing; while Python code will be slower than an
elaborate regular expression, it will also probably be more understandable.

@node Simple patterns,Using regular expressions,Introduction<16>,Regular expression HOWTO
@anchor{howto/regex simple-patterns}@anchor{5b1c}
@subsection Simple patterns


We’ll start by learning about the simplest possible regular expressions.  Since
regular expressions are used to operate on strings, we’ll begin with the most
common task: matching characters.

For a detailed explanation of the computer science underlying regular
expressions (deterministic and non-deterministic finite automata), you can refer
to almost any textbook on writing compilers.

@menu
* Matching characters:: 
* Repeating things:: 

@end menu

@node Matching characters,Repeating things,,Simple patterns
@anchor{howto/regex matching-characters}@anchor{5b1d}
@subsubsection Matching characters


Most letters and characters will simply match themselves.  For example, the
regular expression @code{test} will match the string @code{test} exactly.  (You can
enable a case-insensitive mode that would let this RE match @code{Test} or @code{TEST}
as well; more about this later.)

There are exceptions to this rule; some characters are special
`metacharacters', and don’t match themselves.  Instead, they signal that
some out-of-the-ordinary thing should be matched, or they affect other portions
of the RE by repeating them or changing their meaning.  Much of this document is
devoted to discussing various metacharacters and what they do.

Here’s a complete list of the metacharacters; their meanings will be discussed
in the rest of this HOWTO.

@example
. ^ $ * + ? @{ @} [ ] \ | ( )
@end example

The first metacharacters we’ll look at are @code{[} and @code{]}. They’re used for
specifying a character class, which is a set of characters that you wish to
match.  Characters can be listed individually, or a range of characters can be
indicated by giving two characters and separating them by a @code{'-'}.  For
example, @code{[abc]} will match any of the characters @code{a}, @code{b}, or @code{c}; this
is the same as @code{[a-c]}, which uses a range to express the same set of
characters.  If you wanted to match only lowercase letters, your RE would be
@code{[a-z]}.

Metacharacters (except @code{\}) are not active inside classes.  For example, @code{[akm$]} will
match any of the characters @code{'a'}, @code{'k'}, @code{'m'}, or @code{'$'}; @code{'$'} is
usually a metacharacter, but inside a character class it’s stripped of its
special nature.

You can match the characters not listed within the class by `complementing'
the set.  This is indicated by including a @code{'^'} as the first character of the
class. For example, @code{[^5]} will match any character except @code{'5'}.  If the
caret appears elsewhere in a character class, it does not have special meaning.
For example: @code{[5^]} will match either a @code{'5'} or a @code{'^'}.

Perhaps the most important metacharacter is the backslash, @code{\}.   As in Python
string literals, the backslash can be followed by various characters to signal
various special sequences.  It’s also used to escape all the metacharacters so
you can still match them in patterns; for example, if you need to match a @code{[}
or  @code{\}, you can precede them with a backslash to remove their special
meaning: @code{\[} or @code{\\}.

Some of the special sequences beginning with @code{'\'} represent
predefined sets of characters that are often useful, such as the set
of digits, the set of letters, or the set of anything that isn’t
whitespace.

Let’s take an example: @code{\w} matches any alphanumeric character.  If
the regex pattern is expressed in bytes, this is equivalent to the
class @code{[a-zA-Z0-9_]}.  If the regex pattern is a string, @code{\w} will
match all the characters marked as letters in the Unicode database
provided by the @ref{10c,,unicodedata} module.  You can use the more
restricted definition of @code{\w} in a string pattern by supplying the
@ref{83f,,re.ASCII} flag when compiling the regular expression.

The following list of special sequences isn’t complete. For a complete
list of sequences and expanded class definitions for Unicode string
patterns, see the last part of @ref{933,,Regular Expression Syntax} in the Standard Library reference.  In general, the
Unicode versions match any character that’s in the appropriate
category in the Unicode database.


@table @asis

@item @code{\d}

Matches any decimal digit; this is equivalent to the class @code{[0-9]}.

@item @code{\D}

Matches any non-digit character; this is equivalent to the class @code{[^0-9]}.

@item @code{\s}

Matches any whitespace character; this is equivalent to the class @code{[
\t\n\r\f\v]}.

@item @code{\S}

Matches any non-whitespace character; this is equivalent to the class @code{[^
\t\n\r\f\v]}.

@item @code{\w}

Matches any alphanumeric character; this is equivalent to the class
@code{[a-zA-Z0-9_]}.

@item @code{\W}

Matches any non-alphanumeric character; this is equivalent to the class
@code{[^a-zA-Z0-9_]}.
@end table

These sequences can be included inside a character class.  For example,
@code{[\s,.]} is a character class that will match any whitespace character, or
@code{','} or @code{'.'}.

The final metacharacter in this section is @code{.}.  It matches anything except a
newline character, and there’s an alternate mode (@ref{27cd,,re.DOTALL}) where it will
match even a newline.  @code{.} is often used where you want to match “any
character”.

@node Repeating things,,Matching characters,Simple patterns
@anchor{howto/regex repeating-things}@anchor{5b1e}
@subsubsection Repeating things


Being able to match varying sets of characters is the first thing regular
expressions can do that isn’t already possible with the methods available on
strings.  However, if that was the only additional capability of regexes, they
wouldn’t be much of an advance. Another capability is that you can specify that
portions of the RE must be repeated a certain number of times.

The first metacharacter for repeating things that we’ll look at is @code{*}.  @code{*}
doesn’t match the literal character @code{'*'}; instead, it specifies that the
previous character can be matched zero or more times, instead of exactly once.

For example, @code{ca*t} will match @code{'ct'} (0 @code{'a'} characters), @code{'cat'} (1 @code{'a'}),
@code{'caaat'} (3 @code{'a'} characters), and so forth.

Repetitions such as @code{*} are `greedy'; when repeating a RE, the matching
engine will try to repeat it as many times as possible. If later portions of the
pattern don’t match, the matching engine will then back up and try again with
fewer repetitions.

A step-by-step example will make this more obvious.  Let’s consider the
expression @code{a[bcd]*b}.  This matches the letter @code{'a'}, zero or more letters
from the class @code{[bcd]}, and finally ends with a @code{'b'}.  Now imagine matching
this RE against the string @code{'abcbd'}.


@multitable {xxxxxxxx} {xxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Step

@tab

Matched

@tab

Explanation

@item

1

@tab

@code{a}

@tab

The @code{a} in the RE matches.

@item

2

@tab

@code{abcbd}

@tab

The engine matches @code{[bcd]*},
going as far as it can, which
is to the end of the string.

@item

3

@tab

`Failure'

@tab

The engine tries to match
@code{b}, but the current position
is at the end of the string, so
it fails.

@item

4

@tab

@code{abcb}

@tab

Back up, so that  @code{[bcd]*}
matches one less character.

@item

5

@tab

`Failure'

@tab

Try @code{b} again, but the
current position is at the last
character, which is a @code{'d'}.

@item

6

@tab

@code{abc}

@tab

Back up again, so that
@code{[bcd]*} is only matching
@code{bc}.

@item

7

@tab

@code{abcb}

@tab

Try @code{b} again.  This time
the character at the
current position is @code{'b'}, so
it succeeds.

@end multitable


The end of the RE has now been reached, and it has matched @code{'abcb'}.  This
demonstrates how the matching engine goes as far as it can at first, and if no
match is found it will then progressively back up and retry the rest of the RE
again and again.  It will back up until it has tried zero matches for
@code{[bcd]*}, and if that subsequently fails, the engine will conclude that the
string doesn’t match the RE at all.

Another repeating metacharacter is @code{+}, which matches one or more times.  Pay
careful attention to the difference between @code{*} and @code{+}; @code{*} matches
`zero' or more times, so whatever’s being repeated may not be present at all,
while @code{+} requires at least `one' occurrence.  To use a similar example,
@code{ca+t} will match @code{'cat'} (1 @code{'a'}), @code{'caaat'} (3 @code{'a'}s), but won’t
match @code{'ct'}.

There are two more repeating operators or quantifiers.  The question mark character, @code{?},
matches either once or zero times; you can think of it as marking something as
being optional.  For example, @code{home-?brew} matches either @code{'homebrew'} or
@code{'home-brew'}.

The most complicated quantifier is @code{@{m,n@}}, where `m' and `n' are
decimal integers.  This quantifier means there must be at least `m' repetitions,
and at most `n'.  For example, @code{a/@{1,3@}b} will match @code{'a/b'}, @code{'a//b'}, and
@code{'a///b'}.  It won’t match @code{'ab'}, which has no slashes, or @code{'a////b'}, which
has four.

You can omit either `m' or `n'; in that case, a reasonable value is assumed for
the missing value.  Omitting `m' is interpreted as a lower limit of 0, while
omitting `n' results in an upper bound of infinity.

The simplest case @code{@{m@}} matches the preceding item exactly `m' times.
For example, @code{a/@{2@}b} will only match @code{'a//b'}.

Readers of a reductionist bent may notice that the three other quantifiers can
all be expressed using this notation.  @code{@{0,@}} is the same as @code{*}, @code{@{1,@}}
is equivalent to @code{+}, and @code{@{0,1@}} is the same as @code{?}.  It’s better to use
@code{*}, @code{+}, or @code{?} when you can, simply because they’re shorter and easier
to read.

@node Using regular expressions,More pattern power,Simple patterns,Regular expression HOWTO
@anchor{howto/regex using-regular-expressions}@anchor{5b1f}
@subsection Using regular expressions


Now that we’ve looked at some simple regular expressions, how do we actually use
them in Python?  The @ref{be,,re} module provides an interface to the regular
expression engine, allowing you to compile REs into objects and then perform
matches with them.

@menu
* Compiling regular expressions:: 
* The backslash plague:: 
* Performing matches:: 
* Module-level functions: Module-level functions<2>. 
* Compilation flags:: 

@end menu

@node Compiling regular expressions,The backslash plague,,Using regular expressions
@anchor{howto/regex compiling-regular-expressions}@anchor{5b20}
@subsubsection Compiling regular expressions


Regular expressions are compiled into pattern objects, which have
methods for various operations such as searching for pattern matches or
performing string substitutions.

@example
>>> import re
>>> p = re.compile('ab*')
>>> p
re.compile('ab*')
@end example

@ref{dd4,,re.compile()} also accepts an optional `flags' argument, used to enable
various special features and syntax variations.  We’ll go over the available
settings later, but for now a single example will do:

@example
>>> p = re.compile('ab*', re.IGNORECASE)
@end example

The RE is passed to @ref{dd4,,re.compile()} as a string.  REs are handled as strings
because regular expressions aren’t part of the core Python language, and no
special syntax was created for expressing them.  (There are applications that
don’t need REs at all, so there’s no need to bloat the language specification by
including them.) Instead, the @ref{be,,re} module is simply a C extension module
included with Python, just like the @ref{d1,,socket} or @ref{13a,,zlib} modules.

Putting REs in strings keeps the Python language simpler, but has one
disadvantage which is the topic of the next section.

@node The backslash plague,Performing matches,Compiling regular expressions,Using regular expressions
@anchor{howto/regex id1}@anchor{5b21}@anchor{howto/regex the-backslash-plague}@anchor{5b22}
@subsubsection The backslash plague


As stated earlier, regular expressions use the backslash character (@code{'\'}) to
indicate special forms or to allow special characters to be used without
invoking their special meaning. This conflicts with Python’s usage of the same
character for the same purpose in string literals.

Let’s say you want to write a RE that matches the string @code{\section}, which
might be found in a LaTeX file.  To figure out what to write in the program
code, start with the desired string to be matched.  Next, you must escape any
backslashes and other metacharacters by preceding them with a backslash,
resulting in the string @code{\\section}.  The resulting string that must be passed
to @ref{dd4,,re.compile()} must be @code{\\section}.  However, to express this as a
Python string literal, both backslashes must be escaped `again'.


@multitable {xxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Characters

@tab

Stage

@item

@code{\section}

@tab

Text string to be matched

@item

@code{\\section}

@tab

Escaped backslash for @ref{dd4,,re.compile()}

@item

@code{"\\\\section"}

@tab

Escaped backslashes for a string literal

@end multitable


In short, to match a literal backslash, one has to write @code{'\\\\'} as the RE
string, because the regular expression must be @code{\\}, and each backslash must
be expressed as @code{\\} inside a regular Python string literal.  In REs that
feature backslashes repeatedly, this leads to lots of repeated backslashes and
makes the resulting strings difficult to understand.

The solution is to use Python’s raw string notation for regular expressions;
backslashes are not handled in any special way in a string literal prefixed with
@code{'r'}, so @code{r"\n"} is a two-character string containing @code{'\'} and @code{'n'},
while @code{"\n"} is a one-character string containing a newline. Regular
expressions will often be written in Python code using this raw string notation.

In addition, special escape sequences that are valid in regular expressions,
but not valid as Python string literals, now result in a
@ref{1af,,SyntaxWarning} and will eventually become a @ref{18f,,SyntaxError},
which means the sequences will be invalid if raw string notation or escaping
the backslashes isn’t used.


@multitable {xxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxx} 
@headitem

Regular String

@tab

Raw string

@item

@code{"ab*"}

@tab

@code{r"ab*"}

@item

@code{"\\\\section"}

@tab

@code{r"\\section"}

@item

@code{"\\w+\\s+\\1"}

@tab

@code{r"\w+\s+\1"}

@end multitable


@node Performing matches,Module-level functions<2>,The backslash plague,Using regular expressions
@anchor{howto/regex performing-matches}@anchor{5b23}
@subsubsection Performing matches


Once you have an object representing a compiled regular expression, what do you
do with it?  Pattern objects have several methods and attributes.
Only the most significant ones will be covered here; consult the @ref{be,,re} docs
for a complete listing.


@multitable {xxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Method/Attribute

@tab

Purpose

@item

@code{match()}

@tab

Determine if the RE matches at the beginning
of the string.

@item

@code{search()}

@tab

Scan through a string, looking for any
location where this RE matches.

@item

@code{findall()}

@tab

Find all substrings where the RE matches, and
return them as a list.

@item

@code{finditer()}

@tab

Find all substrings where the RE matches, and
return them as an @ref{4c9,,iterator}.

@end multitable


@ref{27de,,match()} and @ref{27df,,search()} return @code{None} if no match can be found.  If
they’re successful, a @ref{118e,,match object} instance is returned,
containing information about the match: where it starts and ends, the substring
it matched, and more.

You can learn about this by interactively experimenting with the @ref{be,,re}
module.

This HOWTO uses the standard Python interpreter for its examples. First, run the
Python interpreter, import the @ref{be,,re} module, and compile a RE:

@example
>>> import re
>>> p = re.compile('[a-z]+')
>>> p
re.compile('[a-z]+')
@end example

Now, you can try matching various strings against the RE @code{[a-z]+}.  An empty
string shouldn’t match at all, since @code{+} means ‘one or more repetitions’.
@ref{27de,,match()} should return @code{None} in this case, which will cause the
interpreter to print no output.  You can explicitly print the result of
@code{match()} to make this clear.

@example
>>> p.match("")
>>> print(p.match(""))
None
@end example

Now, let’s try it on a string that it should match, such as @code{tempo}.  In this
case, @ref{27de,,match()} will return a @ref{118e,,match object}, so you
should store the result in a variable for later use.

@example
>>> m = p.match('tempo')
>>> m
<re.Match object; span=(0, 5), match='tempo'>
@end example

Now you can query the @ref{118e,,match object} for information
about the matching string.  Match object instances
also have several methods and attributes; the most important ones are:


@multitable {xxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Method/Attribute

@tab

Purpose

@item

@code{group()}

@tab

Return the string matched by the RE

@item

@code{start()}

@tab

Return the starting position of the match

@item

@code{end()}

@tab

Return the ending position of the match

@item

@code{span()}

@tab

Return a tuple containing the (start, end)
positions  of the match

@end multitable


Trying these methods will soon clarify their meaning:

@example
>>> m.group()
'tempo'
>>> m.start(), m.end()
(0, 5)
>>> m.span()
(0, 5)
@end example

@ref{1231,,group()} returns the substring that was matched by the RE.  @ref{27f1,,start()}
and @ref{27f2,,end()} return the starting and ending index of the match. @ref{27f3,,span()}
returns both start and end indexes in a single tuple.  Since the @ref{27de,,match()}
method only checks if the RE matches at the start of a string, @code{start()}
will always be zero.  However, the @ref{27df,,search()} method of patterns
scans through the string, so  the match may not start at zero in that
case.

@example
>>> print(p.match('::: message'))
None
>>> m = p.search('::: message'); print(m)
<re.Match object; span=(4, 11), match='message'>
>>> m.group()
'message'
>>> m.span()
(4, 11)
@end example

In actual programs, the most common style is to store the
@ref{118e,,match object} in a variable, and then check if it was
@code{None}.  This usually looks like:

@example
p = re.compile( ... )
m = p.match( 'string goes here' )
if m:
    print('Match found: ', m.group())
else:
    print('No match')
@end example

Two pattern methods return all of the matches for a pattern.
@ref{27e5,,findall()} returns a list of matching strings:

@example
>>> p = re.compile(r'\d+')
>>> p.findall('12 drummers drumming, 11 pipers piping, 10 lords a-leaping')
['12', '11', '10']
@end example

The @code{r} prefix, making the literal a raw string literal, is needed in this
example because escape sequences in a normal “cooked” string literal that are
not recognized by Python, as opposed to regular expressions, now result in a
@ref{1af,,SyntaxWarning} and will eventually become a @ref{18f,,SyntaxError}.  See
@ref{5b22,,The backslash plague}.

@ref{27e5,,findall()} has to create the entire list before it can be returned as the
result.  The @ref{27e6,,finditer()} method returns a sequence of
@ref{118e,,match object} instances as an @ref{4c9,,iterator}:

@example
>>> iterator = p.finditer('12 drummers drumming, 11 ... 10 ...')
>>> iterator
<callable_iterator object at 0x...>
>>> for match in iterator:
...     print(match.span())
...
(0, 2)
(22, 24)
(29, 31)
@end example

@node Module-level functions<2>,Compilation flags,Performing matches,Using regular expressions
@anchor{howto/regex module-level-functions}@anchor{5b24}
@subsubsection Module-level functions


You don’t have to create a pattern object and call its methods; the
@ref{be,,re} module also provides top-level functions called @ref{1439,,match()},
@ref{1438,,search()}, @ref{1230,,findall()}, @ref{5a3,,sub()}, and so forth.  These functions
take the same arguments as the corresponding pattern method with
the RE string added as the first argument, and still return either @code{None} or a
@ref{118e,,match object} instance.

@example
>>> print(re.match(r'From\s+', 'Fromage amk'))
None
>>> re.match(r'From\s+', 'From amk Thu May 14 19:12:10 1998')
<re.Match object; span=(0, 5), match='From '>
@end example

Under the hood, these functions simply create a pattern object for you
and call the appropriate method on it.  They also store the compiled
object in a cache, so future calls using the same RE won’t need to
parse the pattern again and again.

Should you use these module-level functions, or should you get the
pattern and call its methods yourself?  If you’re accessing a regex
within a loop, pre-compiling it will save a few function calls.
Outside of loops, there’s not much difference thanks to the internal
cache.

@node Compilation flags,,Module-level functions<2>,Using regular expressions
@anchor{howto/regex compilation-flags}@anchor{5b25}
@subsubsection Compilation flags


Compilation flags let you modify some aspects of how regular expressions work.
Flags are available in the @ref{be,,re} module under two names, a long name such as
@ref{1adc,,IGNORECASE} and a short, one-letter form such as @ref{27d0,,I}.  (If you’re
familiar with Perl’s pattern modifiers, the one-letter forms use the same
letters; the short form of @ref{27dc,,re.VERBOSE} is @ref{27d5,,re.X}, for example.)
Multiple flags can be specified by bitwise OR-ing them; @code{re.I | re.M} sets
both the @code{I} and @ref{27d2,,M} flags, for example.

Here’s a table of the available flags, followed by a more detailed explanation
of each one.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Flag

@tab

Meaning

@item

@ref{83f,,ASCII}, @ref{27cf,,A}

@tab

Makes several escapes like @code{\w}, @code{\b},
@code{\s} and @code{\d} match only on ASCII
characters with the respective property.

@item

@ref{27cd,,DOTALL}, @ref{27d3,,S}

@tab

Make @code{.} match any character, including
newlines.

@item

@ref{1adc,,IGNORECASE}, @ref{27d0,,I}

@tab

Do case-insensitive matches.

@item

@ref{d69,,LOCALE}, @ref{27d1,,L}

@tab

Do a locale-aware match.

@item

@ref{27ce,,MULTILINE}, @ref{27d2,,M}

@tab

Multi-line matching, affecting @code{^} and
@code{$}.

@item

@ref{27dc,,VERBOSE}, @ref{27d5,,X}
(for ‘extended’)

@tab

Enable verbose REs, which can be organized
more cleanly and understandably.

@end multitable



@deffn {Data} re.I

@deffnx {Data} re.IGNORECASE

Perform case-insensitive matching; character class and literal strings will
match letters by ignoring case.  For example, @code{[A-Z]} will match lowercase
letters, too. Full Unicode matching also works unless the @ref{83f,,ASCII}
flag is used to disable non-ASCII matches.  When the Unicode patterns
@code{[a-z]} or @code{[A-Z]} are used in combination with the @ref{1adc,,IGNORECASE}
flag, they will match the 52 ASCII letters and 4 additional non-ASCII
letters: ‘İ’ (U+0130, Latin capital letter I with dot above), ‘ı’ (U+0131,
Latin small letter dotless i), ‘ſ’ (U+017F, Latin small letter long s) and
‘K’ (U+212A, Kelvin sign).  @code{Spam} will match @code{'Spam'}, @code{'spam'},
@code{'spAM'}, or @code{'ſpam'} (the latter is matched only in Unicode mode).
This lowercasing doesn’t take the current locale into account;
it will if you also set the @ref{d69,,LOCALE} flag.
@end deffn


@deffn {Data} re.L

@deffnx {Data} re.LOCALE

Make @code{\w}, @code{\W}, @code{\b}, @code{\B} and case-insensitive matching dependent
on the current locale instead of the Unicode database.

Locales are a feature of the C library intended to help in writing programs
that take account of language differences.  For example, if you’re
processing encoded French text, you’d want to be able to write @code{\w+} to
match words, but @code{\w} only matches the character class @code{[A-Za-z]} in
bytes patterns; it won’t match bytes corresponding to @code{é} or @code{ç}.
If your system is configured properly and a French locale is selected,
certain C functions will tell the program that the byte corresponding to
@code{é} should also be considered a letter.
Setting the @ref{d69,,LOCALE} flag when compiling a regular expression will cause
the resulting compiled object to use these C functions for @code{\w}; this is
slower, but also enables @code{\w+} to match French words as you’d expect.
The use of this flag is discouraged in Python 3 as the locale mechanism
is very unreliable, it only handles one “culture” at a time, and it only
works with 8-bit locales.  Unicode matching is already enabled by default
in Python 3 for Unicode (str) patterns, and it is able to handle different
locales/languages.
@end deffn


@deffn {Data} re.M

@deffnx {Data} re.MULTILINE

(@code{^} and @code{$} haven’t been explained yet;  they’ll be introduced in section
@ref{5b26,,More metacharacters}.)

Usually @code{^} matches only at the beginning of the string, and @code{$} matches
only at the end of the string and immediately before the newline (if any) at the
end of the string. When this flag is specified, @code{^} matches at the beginning
of the string and at the beginning of each line within the string, immediately
following each newline.  Similarly, the @code{$} metacharacter matches either at
the end of the string and at the end of each line (immediately preceding each
newline).
@end deffn


@deffn {Data} re.S

@deffnx {Data} re.DOTALL

Makes the @code{'.'} special character match any character at all, including a
newline; without this flag, @code{'.'} will match anything `except' a newline.
@end deffn


@deffn {Data} re.A

@deffnx {Data} re.ASCII

Make @code{\w}, @code{\W}, @code{\b}, @code{\B}, @code{\s} and @code{\S} perform ASCII-only
matching instead of full Unicode matching. This is only meaningful for
Unicode patterns, and is ignored for byte patterns.
@end deffn


@deffn {Data} re.X

@deffnx {Data} re.VERBOSE

This flag allows you to write regular expressions that are more readable by
granting you more flexibility in how you can format them.  When this flag has
been specified, whitespace within the RE string is ignored, except when the
whitespace is in a character class or preceded by an unescaped backslash; this
lets you organize and indent the RE more clearly.  This flag also lets you put
comments within a RE that will be ignored by the engine; comments are marked by
a @code{'#'} that’s neither in a character class nor preceded by an unescaped
backslash.

For example, here’s a RE that uses @ref{27dc,,re.VERBOSE}; see how much easier it
is to read?

@example
charref = re.compile(r"""
 &[#]                # Start of a numeric entity reference
 (
     0[0-7]+         # Octal form
   | [0-9]+          # Decimal form
   | x[0-9a-fA-F]+   # Hexadecimal form
 )
 ;                   # Trailing semicolon
""", re.VERBOSE)
@end example

Without the verbose setting, the RE would look like this:

@example
charref = re.compile("&#(0[0-7]+"
                     "|[0-9]+"
                     "|x[0-9a-fA-F]+);")
@end example

In the above example, Python’s automatic concatenation of string literals has
been used to break up the RE into smaller pieces, but it’s still more difficult
to understand than the version using @ref{27dc,,re.VERBOSE}.
@end deffn

@node More pattern power,Modifying strings,Using regular expressions,Regular expression HOWTO
@anchor{howto/regex more-pattern-power}@anchor{5b27}
@subsection More pattern power


So far we’ve only covered a part of the features of regular expressions.  In
this section, we’ll cover some new metacharacters, and how to use groups to
retrieve portions of the text that was matched.

@menu
* More metacharacters:: 
* Grouping:: 
* Non-capturing and named groups:: 
* Lookahead assertions:: 

@end menu

@node More metacharacters,Grouping,,More pattern power
@anchor{howto/regex id2}@anchor{5b28}@anchor{howto/regex more-metacharacters}@anchor{5b26}
@subsubsection More metacharacters


There are some metacharacters that we haven’t covered yet.  Most of them will be
covered in this section.

Some of the remaining metacharacters to be discussed are `zero-width
assertions'.  They don’t cause the engine to advance through the string;
instead, they consume no characters at all, and simply succeed or fail.  For
example, @code{\b} is an assertion that the current position is located at a word
boundary; the position isn’t changed by the @code{\b} at all.  This means that
zero-width assertions should never be repeated, because if they match once at a
given location, they can obviously be matched an infinite number of times.


@table @asis

@item @code{|}

Alternation, or the “or” operator.   If `A' and `B' are regular expressions,
@code{A|B} will match any string that matches either `A' or `B'. @code{|} has very
low precedence in order to make it work reasonably when you’re alternating
multi-character strings. @code{Crow|Servo} will match either @code{'Crow'} or @code{'Servo'},
not @code{'Cro'}, a @code{'w'} or an @code{'S'}, and @code{'ervo'}.

To match a literal @code{'|'}, use @code{\|}, or enclose it inside a character class,
as in @code{[|]}.

@item @code{^}

Matches at the beginning of lines.  Unless the @ref{27ce,,MULTILINE} flag has been
set, this will only match at the beginning of the string.  In @code{MULTILINE}
mode, this also matches immediately after each newline within the string.

For example, if you wish to match the word @code{From} only at the beginning of a
line, the RE to use is @code{^From}.

@example
>>> print(re.search('^From', 'From Here to Eternity'))
<re.Match object; span=(0, 4), match='From'>
>>> print(re.search('^From', 'Reciting From Memory'))
None
@end example

To match a literal @code{'^'}, use @code{\^}.

@item @code{$}

Matches at the end of a line, which is defined as either the end of the string,
or any location followed by a newline character.

@example
>>> print(re.search('@}$', '@{block@}'))
<re.Match object; span=(6, 7), match='@}'>
>>> print(re.search('@}$', '@{block@} '))
None
>>> print(re.search('@}$', '@{block@}\n'))
<re.Match object; span=(6, 7), match='@}'>
@end example

To match a literal @code{'$'}, use @code{\$} or enclose it inside a character class,
as in  @code{[$]}.

@item @code{\A}

Matches only at the start of the string.  When not in @ref{27ce,,MULTILINE} mode,
@code{\A} and @code{^} are effectively the same.  In @code{MULTILINE} mode, they’re
different: @code{\A} still matches only at the beginning of the string, but @code{^}
may match at any location inside the string that follows a newline character.

@item @code{\z}

Matches only at the end of the string.

@item @code{\Z}

The same as @code{\z}.  For compatibility with old Python versions.

@item @code{\b}

Word boundary.  This is a zero-width assertion that matches only at the
beginning or end of a word.  A word is defined as a sequence of alphanumeric
characters, so the end of a word is indicated by whitespace or a
non-alphanumeric character.

The following example matches @code{class} only when it’s a complete word; it won’t
match when it’s contained inside another word.

@example
>>> p = re.compile(r'\bclass\b')
>>> print(p.search('no class at all'))
<re.Match object; span=(3, 8), match='class'>
>>> print(p.search('the declassified algorithm'))
None
>>> print(p.search('one subclass is'))
None
@end example

There are two subtleties you should remember when using this special sequence.
First, this is the worst collision between Python’s string literals and regular
expression sequences.  In Python’s string literals, @code{\b} is the backspace
character, ASCII value 8.  If you’re not using raw strings, then Python will
convert the @code{\b} to a backspace, and your RE won’t match as you expect it to.
The following example looks the same as our previous RE, but omits the @code{'r'}
in front of the RE string.

@example
>>> p = re.compile('\bclass\b')
>>> print(p.search('no class at all'))
None
>>> print(p.search('\b' + 'class' + '\b'))
<re.Match object; span=(0, 7), match='\x08class\x08'>
@end example

Second, inside a character class, where there’s no use for this assertion,
@code{\b} represents the backspace character, for compatibility with Python’s
string literals.

@item @code{\B}

Another zero-width assertion, this is the opposite of @code{\b}, only matching when
the current position is not at a word boundary.
@end table

@node Grouping,Non-capturing and named groups,More metacharacters,More pattern power
@anchor{howto/regex grouping}@anchor{5b29}
@subsubsection Grouping


Frequently you need to obtain more information than just whether the RE matched
or not.  Regular expressions are often used to dissect strings by writing a RE
divided into several subgroups which match different components of interest.
For example, an RFC-822 header line is divided into a header name and a value,
separated by a @code{':'}, like this:

@example
From: author@@example.com
User-Agent: Thunderbird 1.5.0.9 (X11/20061227)
MIME-Version: 1.0
To: editor@@example.com
@end example

This can be handled by writing a regular expression which matches an entire
header line, and has one group which matches the header name, and another group
which matches the header’s value.

Groups are marked by the @code{'('}, @code{')'} metacharacters. @code{'('} and @code{')'}
have much the same meaning as they do in mathematical expressions; they group
together the expressions contained inside them, and you can repeat the contents
of a group with a quantifier, such as @code{*}, @code{+}, @code{?}, or
@code{@{m,n@}}.  For example, @code{(ab)*} will match zero or more repetitions of
@code{ab}.

@example
>>> p = re.compile('(ab)*')
>>> print(p.match('ababababab').span())
(0, 10)
@end example

Groups indicated with @code{'('}, @code{')'} also capture the starting and ending
index of the text that they match; this can be retrieved by passing an argument
to @ref{1231,,group()}, @ref{27f1,,start()}, @ref{27f2,,end()}, and
@ref{27f3,,span()}.  Groups are
numbered starting with 0.  Group 0 is always present; it’s the whole RE, so
@ref{118e,,match object} methods all have group 0 as their default
argument.  Later we’ll see how to express groups that don’t capture the span
of text that they match.

@example
>>> p = re.compile('(a)b')
>>> m = p.match('ab')
>>> m.group()
'ab'
>>> m.group(0)
'ab'
@end example

Subgroups are numbered from left to right, from 1 upward.  Groups can be nested;
to determine the number, just count the opening parenthesis characters, going
from left to right.

@example
>>> p = re.compile('(a(b)c)d')
>>> m = p.match('abcd')
>>> m.group(0)
'abcd'
>>> m.group(1)
'abc'
>>> m.group(2)
'b'
@end example

@ref{1231,,group()} can be passed multiple group numbers at a time, in which case it
will return a tuple containing the corresponding values for those groups.

@example
>>> m.group(2,1,2)
('b', 'abc', 'b')
@end example

The @ref{1232,,groups()} method returns a tuple containing the strings for all the
subgroups, from 1 up to however many there are.

@example
>>> m.groups()
('abc', 'b')
@end example

Backreferences in a pattern allow you to specify that the contents of an earlier
capturing group must also be found at the current location in the string.  For
example, @code{\1} will succeed if the exact contents of group 1 can be found at
the current position, and fails otherwise.  Remember that Python’s string
literals also use a backslash followed by numbers to allow including arbitrary
characters in a string, so be sure to use a raw string when incorporating
backreferences in a RE.

For example, the following RE detects doubled words in a string.

@example
>>> p = re.compile(r'\b(\w+)\s+\1\b')
>>> p.search('Paris in the the spring').group()
'the the'
@end example

Backreferences like this aren’t often useful for just searching through a string
— there are few text formats which repeat data in this way — but you’ll soon
find out that they’re `very' useful when performing string substitutions.

@node Non-capturing and named groups,Lookahead assertions,Grouping,More pattern power
@anchor{howto/regex non-capturing-and-named-groups}@anchor{5b2a}
@subsubsection Non-capturing and named groups


Elaborate REs may use many groups, both to capture substrings of interest, and
to group and structure the RE itself.  In complex REs, it becomes difficult to
keep track of the group numbers.  There are two features which help with this
problem.  Both of them use a common syntax for regular expression extensions, so
we’ll look at that first.

Perl 5 is well known for its powerful additions to standard regular expressions.
For these new features the Perl developers couldn’t choose new single-keystroke metacharacters
or new special sequences beginning with @code{\} without making Perl’s regular
expressions confusingly different from standard REs.  If they chose @code{&} as a
new metacharacter, for example, old expressions would be assuming that @code{&} was
a regular character and wouldn’t have escaped it by writing @code{\&} or @code{[&]}.

The solution chosen by the Perl developers was to use @code{(?...)} as the
extension syntax.  @code{?} immediately after a parenthesis was a syntax error
because the @code{?} would have nothing to repeat, so this didn’t introduce any
compatibility problems.  The characters immediately after the @code{?}  indicate
what extension is being used, so @code{(?=foo)} is one thing (a positive lookahead
assertion) and @code{(?:foo)} is something else (a non-capturing group containing
the subexpression @code{foo}).

Python supports several of Perl’s extensions and adds an extension
syntax to Perl’s extension syntax.  If the first character after the
question mark is a @code{P}, you know that it’s an extension that’s
specific to Python.

Now that we’ve looked at the general extension syntax, we can return
to the features that simplify working with groups in complex REs.

Sometimes you’ll want to use a group to denote a part of a regular expression,
but aren’t interested in retrieving the group’s contents. You can make this fact
explicit by using a non-capturing group: @code{(?:...)}, where you can replace the
@code{...} with any other regular expression.

@example
>>> m = re.match("([abc])+", "abc")
>>> m.groups()
('c',)
>>> m = re.match("(?:[abc])+", "abc")
>>> m.groups()
()
@end example

Except for the fact that you can’t retrieve the contents of what the group
matched, a non-capturing group behaves exactly the same as a capturing group;
you can put anything inside it, repeat it with a repetition metacharacter such
as @code{*}, and nest it within other groups (capturing or non-capturing).
@code{(?:...)} is particularly useful when modifying an existing pattern, since you
can add new groups without changing how all the other groups are numbered.  It
should be mentioned that there’s no performance difference in searching between
capturing and non-capturing groups; neither form is any faster than the other.

A more significant feature is named groups: instead of referring to them by
numbers, groups can be referenced by a name.

The syntax for a named group is one of the Python-specific extensions:
@code{(?P<name>...)}.  `name' is, obviously, the name of the group.  Named groups
behave exactly like capturing groups, and additionally associate a name
with a group.  The @ref{118e,,match object} methods that deal with
capturing groups all accept either integers that refer to the group by number
or strings that contain the desired group’s name.  Named groups are still
given numbers, so you can retrieve information about a group in two ways:

@example
>>> p = re.compile(r'(?P<word>\b\w+\b)')
>>> m = p.search( '(((( Lots of punctuation )))' )
>>> m.group('word')
'Lots'
>>> m.group(1)
'Lots'
@end example

Additionally, you can retrieve named groups as a dictionary with
@ref{27f0,,groupdict()}:

@example
>>> m = re.match(r'(?P<first>\w+) (?P<last>\w+)', 'Jane Doe')
>>> m.groupdict()
@{'first': 'Jane', 'last': 'Doe'@}
@end example

Named groups are handy because they let you use easily remembered names, instead
of having to remember numbers.  Here’s an example RE from the @ref{78,,imaplib}
module:

@example
InternalDate = re.compile(r'INTERNALDATE "'
        r'(?P<day>[ 123][0-9])-(?P<mon>[A-Z][a-z][a-z])-'
        r'(?P<year>[0-9][0-9][0-9][0-9])'
        r' (?P<hour>[0-9][0-9]):(?P<min>[0-9][0-9]):(?P<sec>[0-9][0-9])'
        r' (?P<zonen>[-+])(?P<zoneh>[0-9][0-9])(?P<zonem>[0-9][0-9])'
        r'"')
@end example

It’s obviously much easier to retrieve @code{m.group('zonem')}, instead of having
to remember to retrieve group 9.

The syntax for backreferences in an expression such as @code{(...)\1} refers to the
number of the group.  There’s naturally a variant that uses the group name
instead of the number. This is another Python extension: @code{(?P=name)} indicates
that the contents of the group called `name' should again be matched at the
current point.  The regular expression for finding doubled words,
@code{\b(\w+)\s+\1\b} can also be written as @code{\b(?P<word>\w+)\s+(?P=word)\b}:

@example
>>> p = re.compile(r'\b(?P<word>\w+)\s+(?P=word)\b')
>>> p.search('Paris in the the spring').group()
'the the'
@end example

@node Lookahead assertions,,Non-capturing and named groups,More pattern power
@anchor{howto/regex lookahead-assertions}@anchor{5b2b}
@subsubsection Lookahead assertions


Another zero-width assertion is the lookahead assertion.  Lookahead assertions
are available in both positive and negative form, and  look like this:


@table @asis

@item @code{(?=...)}

Positive lookahead assertion.  This succeeds if the contained regular
expression, represented here by @code{...}, successfully matches at the current
location, and fails otherwise. But, once the contained expression has been
tried, the matching engine doesn’t advance at all; the rest of the pattern is
tried right where the assertion started.

@item @code{(?!...)}

Negative lookahead assertion.  This is the opposite of the positive assertion;
it succeeds if the contained expression `doesn’t' match at the current position
in the string.
@end table

To make this concrete, let’s look at a case where a lookahead is useful.
Consider a simple pattern to match a filename and split it apart into a base
name and an extension, separated by a @code{.}.  For example, in @code{news.rc},
@code{news} is the base name, and @code{rc} is the filename’s extension.

The pattern to match this is quite simple:

@code{.*[.].*$}

Notice that the @code{.} needs to be treated specially because it’s a
metacharacter, so it’s inside a character class to only match that
specific character.  Also notice the trailing @code{$}; this is added to
ensure that all the rest of the string must be included in the
extension.  This regular expression matches @code{foo.bar} and
@code{autoexec.bat} and @code{sendmail.cf} and @code{printers.conf}.

Now, consider complicating the problem a bit; what if you want to match
filenames where the extension is not @code{bat}? Some incorrect attempts:

@code{.*[.][^b].*$}

The first attempt above tries to exclude @code{bat} by requiring
that the first character of the extension is not a @code{b}.  This is wrong,
because the pattern also doesn’t match @code{foo.bar}.

@code{.*[.]([^b]..|.[^a].|..[^t])$}

The expression gets messier when you try to patch up the first solution by
requiring one of the following cases to match: the first character of the
extension isn’t @code{b}; the second character isn’t @code{a}; or the third character
isn’t @code{t}.  This accepts @code{foo.bar} and rejects @code{autoexec.bat}, but it
requires a three-letter extension and won’t accept a filename with a two-letter
extension such as @code{sendmail.cf}.  We’ll complicate the pattern again in an
effort to fix it.

@code{.*[.]([^b].?.?|.[^a]?.?|..?[^t]?)$}

In the third attempt, the second and third letters are all made optional in
order to allow matching extensions shorter than three characters, such as
@code{sendmail.cf}.

The pattern’s getting really complicated now, which makes it hard to read and
understand.  Worse, if the problem changes and you want to exclude both @code{bat}
and @code{exe} as extensions, the pattern would get even more complicated and
confusing.

A negative lookahead cuts through all this confusion:

@code{.*[.](?!bat$)[^.]*$}

The negative lookahead means: if the expression @code{bat}
doesn’t match at this point, try the rest of the pattern; if @code{bat$} does
match, the whole pattern will fail.  The trailing @code{$} is required to ensure
that something like @code{sample.batch}, where the extension only starts with
@code{bat}, will be allowed.  The @code{[^.]*} makes sure that the pattern works
when there are multiple dots in the filename.

Excluding another filename extension is now easy; simply add it as an
alternative inside the assertion.  The following pattern excludes filenames that
end in either @code{bat} or @code{exe}:

@code{.*[.](?!bat$|exe$)[^.]*$}

@node Modifying strings,Common problems,More pattern power,Regular expression HOWTO
@anchor{howto/regex modifying-strings}@anchor{5b2c}
@subsection Modifying strings


Up to this point, we’ve simply performed searches against a static string.
Regular expressions are also commonly used to modify strings in various ways,
using the following pattern methods:


@multitable {xxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Method/Attribute

@tab

Purpose

@item

@code{split()}

@tab

Split the string into a list, splitting it
wherever the RE matches

@item

@code{sub()}

@tab

Find all substrings where the RE matches, and
replace them with a different string

@item

@code{subn()}

@tab

Does the same thing as @code{sub()},  but
returns the new string and the number of
replacements

@end multitable


@menu
* Splitting strings:: 
* Search and replace:: 

@end menu

@node Splitting strings,Search and replace,,Modifying strings
@anchor{howto/regex splitting-strings}@anchor{5b2d}
@subsubsection Splitting strings


The @ref{27e4,,split()} method of a pattern splits a string apart
wherever the RE matches, returning a list of the pieces. It’s similar to the
@ref{10b0,,split()} method of strings but provides much more generality in the
delimiters that you can split by; string @code{split()} only supports splitting by
whitespace or by a fixed string.  As you’d expect, there’s a module-level
@ref{5a2,,re.split()} function, too.


@deffn {Method} .split (string[, maxsplit=0])

Split `string' by the matches of the regular expression.  If capturing
parentheses are used in the RE, then their contents will also be returned as
part of the resulting list.  If `maxsplit' is nonzero, at most `maxsplit' splits
are performed.
@end deffn

You can limit the number of splits made, by passing a value for `maxsplit'.
When `maxsplit' is nonzero, at most `maxsplit' splits will be made, and the
remainder of the string is returned as the final element of the list.  In the
following example, the delimiter is any sequence of non-alphanumeric characters.

@example
>>> p = re.compile(r'\W+')
>>> p.split('This is a test, short and sweet, of split().')
['This', 'is', 'a', 'test', 'short', 'and', 'sweet', 'of', 'split', '@w{'}]
>>> p.split('This is a test, short and sweet, of split().', 3)
['This', 'is', 'a', 'test, short and sweet, of split().']
@end example

Sometimes you’re not only interested in what the text between delimiters is, but
also need to know what the delimiter was.  If capturing parentheses are used in
the RE, then their values are also returned as part of the list.  Compare the
following calls:

@example
>>> p = re.compile(r'\W+')
>>> p2 = re.compile(r'(\W+)')
>>> p.split('This... is a test.')
['This', 'is', 'a', 'test', '@w{'}]
>>> p2.split('This... is a test.')
['This', '... ', 'is', ' ', 'a', ' ', 'test', '.', '@w{'}]
@end example

The module-level function @ref{5a2,,re.split()} adds the RE to be used as the first
argument, but is otherwise the same.

@example
>>> re.split(r'[\W]+', 'Words, words, words.')
['Words', 'words', 'words', '@w{'}]
>>> re.split(r'([\W]+)', 'Words, words, words.')
['Words', ', ', 'words', ', ', 'words', '.', '@w{'}]
>>> re.split(r'[\W]+', 'Words, words, words.', 1)
['Words', 'words, words.']
@end example

@node Search and replace,,Splitting strings,Modifying strings
@anchor{howto/regex search-and-replace}@anchor{5b2e}
@subsubsection Search and replace


Another common task is to find all the matches for a pattern, and replace them
with a different string.  The @ref{27e7,,sub()} method takes a replacement value,
which can be either a string or a function, and the string to be processed.


@deffn {Method} .sub (replacement, string[, count=0])

Returns the string obtained by replacing the leftmost non-overlapping
occurrences of the RE in `string' by the replacement `replacement'.  If the
pattern isn’t found, `string' is returned unchanged.

The optional argument `count' is the maximum number of pattern occurrences to be
replaced; `count' must be a non-negative integer.  The default value of 0 means
to replace all occurrences.
@end deffn

Here’s a simple example of using the @ref{27e7,,sub()} method.  It replaces colour
names with the word @code{colour}:

@example
>>> p = re.compile('(blue|white|red)')
>>> p.sub('colour', 'blue socks and red shoes')
'colour socks and colour shoes'
>>> p.sub('colour', 'blue socks and red shoes', count=1)
'colour socks and red shoes'
@end example

The @ref{27e8,,subn()} method does the same work, but returns a 2-tuple containing the
new string value and the number of replacements  that were performed:

@example
>>> p = re.compile('(blue|white|red)')
>>> p.subn('colour', 'blue socks and red shoes')
('colour socks and colour shoes', 2)
>>> p.subn('colour', 'no colours at all')
('no colours at all', 0)
@end example

Empty matches are replaced only when they’re not adjacent to a previous empty match.

@example
>>> p = re.compile('x*')
>>> p.sub('-', 'abxd')
'-a-b--d-'
@end example

If `replacement' is a string, any backslash escapes in it are processed.  That
is, @code{\n} is converted to a single newline character, @code{\r} is converted to a
carriage return, and so forth. Unknown escapes such as @code{\&} are left alone.
Backreferences, such as @code{\6}, are replaced with the substring matched by the
corresponding group in the RE.  This lets you incorporate portions of the
original text in the resulting replacement string.

This example matches the word @code{section} followed by a string enclosed in
@code{@{}, @code{@}}, and changes @code{section} to @code{subsection}:

@example
>>> p = re.compile('section@{ ( [^@}]* ) @}', re.VERBOSE)
>>> p.sub(r'subsection@{\1@}','section@{First@} section@{second@}')
'subsection@{First@} subsection@{second@}'
@end example

There’s also a syntax for referring to named groups as defined by the
@code{(?P<name>...)} syntax.  @code{\g<name>} will use the substring matched by the
group named @code{name}, and  @code{\g<number>}  uses the corresponding group number.
@code{\g<2>} is therefore equivalent to @code{\2},  but isn’t ambiguous in a
replacement string such as @code{\g<2>0}.  (@code{\20} would be interpreted as a
reference to group 20, not a reference to group 2 followed by the literal
character @code{'0'}.)  The following substitutions are all equivalent, but use all
three variations of the replacement string.

@example
>>> p = re.compile('section@{ (?P<name> [^@}]* ) @}', re.VERBOSE)
>>> p.sub(r'subsection@{\1@}','section@{First@}')
'subsection@{First@}'
>>> p.sub(r'subsection@{\g<1>@}','section@{First@}')
'subsection@{First@}'
>>> p.sub(r'subsection@{\g<name>@}','section@{First@}')
'subsection@{First@}'
@end example

`replacement' can also be a function, which gives you even more control.  If
`replacement' is a function, the function is called for every non-overlapping
occurrence of `pattern'.  On each call, the function is passed a
@ref{118e,,match object} argument for the match and can use this
information to compute the desired replacement string and return it.

In the following example, the replacement function translates decimals into
hexadecimal:

@example
>>> def hexrepl(match):
...     "Return the hex string for a decimal number"
...     value = int(match.group())
...     return hex(value)
...
>>> p = re.compile(r'\d+')
>>> p.sub(hexrepl, 'Call 65490 for printing, 49152 for user code.')
'Call 0xffd2 for printing, 0xc000 for user code.'
@end example

When using the module-level @ref{5a3,,re.sub()} function, the pattern is passed as
the first argument.  The pattern may be provided as an object or as a string; if
you need to specify regular expression flags, you must either use a
pattern object as the first parameter, or use embedded modifiers in the
pattern string, e.g. @code{sub("(?i)b+", "x", "bbbb BBBB")} returns @code{'x x'}.

@node Common problems,Feedback,Modifying strings,Regular expression HOWTO
@anchor{howto/regex common-problems}@anchor{5b2f}
@subsection Common problems


Regular expressions are a powerful tool for some applications, but in some ways
their behaviour isn’t intuitive and at times they don’t behave the way you may
expect them to.  This section will point out some of the most common pitfalls.

@menu
* Use string methods:: 
* match() versus search(): match versus search. 
* Greedy versus non-greedy:: 
* Using re.VERBOSE: Using re VERBOSE. 

@end menu

@node Use string methods,match versus search,,Common problems
@anchor{howto/regex use-string-methods}@anchor{5b30}
@subsubsection Use string methods


Sometimes using the @ref{be,,re} module is a mistake.  If you’re matching a fixed
string, or a single character class, and you’re not using any @code{re} features
such as the @ref{1adc,,IGNORECASE} flag, then the full power of regular expressions
may not be required. Strings have several methods for performing operations with
fixed strings and they’re usually much faster, because the implementation is a
single small C loop that’s been optimized for the purpose, instead of the large,
more generalized regular expression engine.

One example might be replacing a single fixed string with another one; for
example, you might replace @code{word} with @code{deed}.  @ref{5a3,,re.sub()} seems like the
function to use for this, but consider the @ref{4b9,,replace()} method.  Note that
@code{replace()} will also replace @code{word} inside words, turning @code{swordfish}
into @code{sdeedfish}, but the  naive RE @code{word} would have done that, too.  (To
avoid performing the substitution on parts of words, the pattern would have to
be @code{\bword\b}, in order to require that @code{word} have a word boundary on
either side.  This takes the job beyond  @code{replace()}’s abilities.)

Another common task is deleting every occurrence of a single character from a
string or replacing it with another single character.  You might do this with
something like @code{re.sub('\n', ' ', S)}, but @ref{268f,,translate()} is capable of
doing both tasks and will be faster than any regular expression operation can
be.

In short, before turning to the @ref{be,,re} module, consider whether your problem
can be solved with a faster and simpler string method.

@node match versus search,Greedy versus non-greedy,Use string methods,Common problems
@anchor{howto/regex match-versus-search}@anchor{5b31}
@subsubsection match() versus search()


The @ref{1439,,match()} function only checks if the RE matches at the beginning of the
string while @ref{1438,,search()} will scan forward through the string for a match.
It’s important to keep this distinction in mind.  Remember,  @code{match()} will
only report a successful match which will start at 0; if the match wouldn’t
start at zero,  @code{match()} will `not' report it.

@example
>>> print(re.match('super', 'superstition').span())
(0, 5)
>>> print(re.match('super', 'insuperable'))
None
@end example

On the other hand, @ref{1438,,search()} will scan forward through the string,
reporting the first match it finds.

@example
>>> print(re.search('super', 'superstition').span())
(0, 5)
>>> print(re.search('super', 'insuperable').span())
(2, 7)
@end example

Sometimes you’ll be tempted to keep using @ref{1439,,re.match()}, and just add @code{.*}
to the front of your RE.  Resist this temptation and use @ref{1438,,re.search()}
instead.  The regular expression compiler does some analysis of REs in order to
speed up the process of looking for a match.  One such analysis figures out what
the first character of a match must be; for example, a pattern starting with
@code{Crow} must match starting with a @code{'C'}.  The analysis lets the engine
quickly scan through the string looking for the starting character, only trying
the full match if a @code{'C'} is found.

Adding @code{.*} defeats this optimization, requiring scanning to the end of the
string and then backtracking to find a match for the rest of the RE.  Use
@ref{1438,,re.search()} instead.

@node Greedy versus non-greedy,Using re VERBOSE,match versus search,Common problems
@anchor{howto/regex greedy-versus-non-greedy}@anchor{5b32}
@subsubsection Greedy versus non-greedy


When repeating a regular expression, as in @code{a*}, the resulting action is to
consume as much of the pattern as possible.  This fact often bites you when
you’re trying to match a pair of balanced delimiters, such as the angle brackets
surrounding an HTML tag.  The naive pattern for matching a single HTML tag
doesn’t work because of the greedy nature of @code{.*}.

@example
>>> s = '<html><head><title>Title</title>'
>>> len(s)
32
>>> print(re.match('<.*>', s).span())
(0, 32)
>>> print(re.match('<.*>', s).group())
<html><head><title>Title</title>
@end example

The RE matches the @code{'<'} in @code{'<html>'}, and the @code{.*} consumes the rest of
the string.  There’s still more left in the RE, though, and the @code{>} can’t
match at the end of the string, so the regular expression engine has to
backtrack character by character until it finds a match for the @code{>}.   The
final match extends from the @code{'<'} in @code{'<html>'} to the @code{'>'} in
@code{'</title>'}, which isn’t what you want.

In this case, the solution is to use the non-greedy quantifiers @code{*?}, @code{+?},
@code{??}, or @code{@{m,n@}?}, which match as `little' text as possible.  In the above
example, the @code{'>'} is tried immediately after the first @code{'<'} matches, and
when it fails, the engine advances a character at a time, retrying the @code{'>'}
at every step.  This produces just the right result:

@example
>>> print(re.match('<.*?>', s).group())
<html>
@end example

(Note that parsing HTML or XML with regular expressions is painful.
Quick-and-dirty patterns will handle common cases, but HTML and XML have special
cases that will break the obvious regular expression; by the time you’ve written
a regular expression that handles all of the possible cases, the patterns will
be `very' complicated.  Use an HTML or XML parser module for such tasks.)

@node Using re VERBOSE,,Greedy versus non-greedy,Common problems
@anchor{howto/regex using-re-verbose}@anchor{5b33}
@subsubsection Using re.VERBOSE


By now you’ve probably noticed that regular expressions are a very compact
notation, but they’re not terribly readable.  REs of moderate complexity can
become lengthy collections of backslashes, parentheses, and metacharacters,
making them difficult to read and understand.

For such REs, specifying the @ref{27dc,,re.VERBOSE} flag when compiling the regular
expression can be helpful, because it allows you to format the regular
expression more clearly.

The @code{re.VERBOSE} flag has several effects.  Whitespace in the regular
expression that `isn’t' inside a character class is ignored.  This means that an
expression such as @code{dog | cat} is equivalent to the less readable @code{dog|cat},
but @code{[a b]} will still match the characters @code{'a'}, @code{'b'}, or a space.  In
addition, you can also put comments inside a RE; comments extend from a @code{#}
character to the next newline.  When used with triple-quoted strings, this
enables REs to be formatted more neatly:

@example
pat = re.compile(r"""
 \s*                 # Skip leading whitespace
 (?P<header>[^:]+)   # Header name
 \s* :               # Whitespace, and a colon
 (?P<value>.*?)      # The header's value -- *? used to
                     # lose the following trailing whitespace
 \s*$                # Trailing whitespace to end-of-line
""", re.VERBOSE)
@end example

This is far more readable than:

@example
pat = re.compile(r"\s*(?P<header>[^:]+)\s*:(?P<value>.*?)\s*$")
@end example

@node Feedback,,Common problems,Regular expression HOWTO
@anchor{howto/regex feedback}@anchor{5b34}
@subsection Feedback


Regular expressions are a complicated topic.  Did this document help you
understand them?  Were there parts that were unclear, or problems you
encountered that weren’t covered here?  If so, please send suggestions for
improvements to the @ref{557,,issue tracker}.

The most complete book on regular expressions is almost certainly Jeffrey
Friedl’s Mastering Regular Expressions, published by O’Reilly.  Unfortunately,
it exclusively concentrates on Perl and Java’s flavours of regular expressions,
and doesn’t contain any Python material at all, so it won’t be useful as a
reference for programming in Python.  (The first edition covered Python’s
now-removed @code{regex} module, which won’t help you much.)  Consider checking
it out from your library.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Socket Programming HOWTO,Sorting Techniques,Regular expression HOWTO,Python HOWTOs
@anchor{howto/sockets doc}@anchor{5b35}@anchor{howto/sockets socket-howto}@anchor{3a25}@anchor{howto/sockets socket-programming-howto}@anchor{5b36}@anchor{howto/sockets translation-repo}@anchor{5b37}
@section Socket Programming HOWTO


@*Author: 
Gordon McMillan


@subsubheading Abstract



Sockets are used nearly everywhere, but are one of the most severely
misunderstood technologies around. This is a 10,000 foot overview of sockets.
It’s not really a tutorial - you’ll still have work to do in getting things
operational. It doesn’t cover the fine points (and there are a lot of them), but
I hope it will give you enough background to begin using them decently.

@menu
* Sockets:: 
* Creating a Socket:: 
* Using a Socket:: 
* Disconnecting:: 
* Non-blocking Sockets:: 

@end menu

@node Sockets,Creating a Socket,,Socket Programming HOWTO
@anchor{howto/sockets sockets}@anchor{5b38}
@subsection Sockets


I’m only going to talk about INET (i.e. IPv4) sockets, but they account for at least 99% of
the sockets in use. And I’ll only talk about STREAM (i.e. TCP) sockets - unless you really
know what you’re doing (in which case this HOWTO isn’t for you!), you’ll get
better behavior and performance from a STREAM socket than anything else. I will
try to clear up the mystery of what a socket is, as well as some hints on how to
work with blocking and non-blocking sockets. But I’ll start by talking about
blocking sockets. You’ll need to know how they work before dealing with
non-blocking sockets.

Part of the trouble with understanding these things is that “socket” can mean a
number of subtly different things, depending on context. So first, let’s make a
distinction between a “client” socket - an endpoint of a conversation, and a
“server” socket, which is more like a switchboard operator. The client
application (your browser, for example) uses “client” sockets exclusively; the
web server it’s talking to uses both “server” sockets and “client” sockets.

@menu
* History:: 

@end menu

@node History,,,Sockets
@anchor{howto/sockets history}@anchor{5b39}
@subsubsection History


Of the various forms of @abbr{IPC,Inter Process Communication},
sockets are by far the most popular.  On any given platform, there are
likely to be other forms of IPC that are faster, but for
cross-platform communication, sockets are about the only game in town.

They were invented in Berkeley as part of the BSD flavor of Unix. They spread
like wildfire with the internet. With good reason — the combination of sockets
with INET makes talking to arbitrary machines around the world unbelievably easy
(at least compared to other schemes).

@node Creating a Socket,Using a Socket,Sockets,Socket Programming HOWTO
@anchor{howto/sockets creating-a-socket}@anchor{5b3a}
@subsection Creating a Socket


Roughly speaking, when you clicked on the link that brought you to this page,
your browser did something like the following:

@example
# create an INET, STREAMing socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# now connect to the web server on port 80 - the normal http port
s.connect(("www.python.org", 80))
@end example

When the @code{connect} completes, the socket @code{s} can be used to send
in a request for the text of the page. The same socket will read the
reply, and then be destroyed. That’s right, destroyed. Client sockets
are normally only used for one exchange (or a small set of sequential
exchanges).

What happens in the web server is a bit more complex. First, the web server
creates a “server socket”:

@example
# create an INET, STREAMing socket
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# bind the socket to a public host, and a well-known port
serversocket.bind((socket.gethostname(), 80))
# become a server socket
serversocket.listen(5)
@end example

A couple things to notice: we used @code{socket.gethostname()} so that the socket
would be visible to the outside world.  If we had used @code{s.bind(('localhost',
80))} or @code{s.bind(('127.0.0.1', 80))} we would still have a “server” socket,
but one that was only visible within the same machine.  @code{s.bind(('@w{'}, 80))}
specifies that the socket is reachable by any address the machine happens to
have.

A second thing to note: low number ports are usually reserved for “well known”
services (HTTP, SNMP etc). If you’re playing around, use a nice high number (4
digits).

Finally, the argument to @code{listen} tells the socket library that we want it to
queue up as many as 5 connect requests (the normal max) before refusing outside
connections. If the rest of the code is written properly, that should be plenty.

Now that we have a “server” socket, listening on port 80, we can enter the
mainloop of the web server:

@example
while True:
    # accept connections from outside
    (clientsocket, address) = serversocket.accept()
    # now do something with the clientsocket
    # in this case, we'll pretend this is a threaded server
    ct = make_client_thread(clientsocket)
    ct.start()
@end example

There’s actually 3 general ways in which this loop could work - dispatching a
thread to handle @code{clientsocket}, create a new process to handle
@code{clientsocket}, or restructure this app to use non-blocking sockets, and
multiplex between our “server” socket and any active @code{clientsocket}s using
@code{select}. More about that later. The important thing to understand now is
this: this is `all' a “server” socket does. It doesn’t send any data. It doesn’t
receive any data. It just produces “client” sockets. Each @code{clientsocket} is
created in response to some `other' “client” socket doing a @code{connect()} to the
host and port we’re bound to. As soon as we’ve created that @code{clientsocket}, we
go back to listening for more connections. The two “clients” are free to chat it
up - they are using some dynamically allocated port which will be recycled when
the conversation ends.

@menu
* IPC:: 

@end menu

@node IPC,,,Creating a Socket
@anchor{howto/sockets ipc}@anchor{5b3b}
@subsubsection IPC


If you need fast IPC between two processes on one machine, you should look into
pipes or shared memory.  If you do decide to use AF_INET sockets, bind the
“server” socket to @code{'localhost'}. On most platforms, this will take a
shortcut around a couple of layers of network code and be quite a bit faster.


@subsubheading See also


The @ref{98,,multiprocessing} integrates cross-platform IPC into a higher-level
API.


@node Using a Socket,Disconnecting,Creating a Socket,Socket Programming HOWTO
@anchor{howto/sockets using-a-socket}@anchor{5b3c}
@subsection Using a Socket


The first thing to note, is that the web browser’s “client” socket and the web
server’s “client” socket are identical beasts. That is, this is a “peer to peer”
conversation. Or to put it another way, `as the designer, you will have to
decide what the rules of etiquette are for a conversation'. Normally, the
@code{connect}ing socket starts the conversation, by sending in a request, or
perhaps a signon. But that’s a design decision - it’s not a rule of sockets.

Now there are two sets of verbs to use for communication. You can use @code{send}
and @code{recv}, or you can transform your client socket into a file-like beast and
use @code{read} and @code{write}. The latter is the way Java presents its sockets.
I’m not going to talk about it here, except to warn you that you need to use
@code{flush} on sockets. These are buffered “files”, and a common mistake is to
@code{write} something, and then @code{read} for a reply. Without a @code{flush} in
there, you may wait forever for the reply, because the request may still be in
your output buffer.

Now we come to the major stumbling block of sockets - @code{send} and @code{recv} operate
on the network buffers. They do not necessarily handle all the bytes you hand
them (or expect from them), because their major focus is handling the network
buffers. In general, they return when the associated network buffers have been
filled (@code{send}) or emptied (@code{recv}). They then tell you how many bytes they
handled. It is `your' responsibility to call them again until your message has
been completely dealt with.

When a @code{recv} returns 0 bytes, it means the other side has closed (or is in
the process of closing) the connection.  You will not receive any more data on
this connection. Ever.  You may be able to send data successfully; I’ll talk
more about this later.

A protocol like HTTP uses a socket for only one transfer. The client sends a
request, then reads a reply.  That’s it. The socket is discarded. This means that
a client can detect the end of the reply by receiving 0 bytes.

But if you plan to reuse your socket for further transfers, you need to realize
that `there is no' @abbr{EOT,End of Transfer} `on a socket.' I repeat: if a socket
@code{send} or @code{recv} returns after handling 0 bytes, the connection has been
broken.  If the connection has `not' been broken, you may wait on a @code{recv}
forever, because the socket will `not' tell you that there’s nothing more to
read (for now).  Now if you think about that a bit, you’ll come to realize a
fundamental truth of sockets: `messages must either be fixed length' (yuck), `or
be delimited' (shrug), `or indicate how long they are' (much better), `or end by
shutting down the connection'. The choice is entirely yours, (but some ways are
righter than others).

Assuming you don’t want to end the connection, the simplest solution is a fixed
length message:

@example
class MySocket:
    """demonstration class only
      - coded for clarity, not efficiency
    """

    def __init__(self, sock=None):
        if sock is None:
            self.sock = socket.socket(
                            socket.AF_INET, socket.SOCK_STREAM)
        else:
            self.sock = sock

    def connect(self, host, port):
        self.sock.connect((host, port))

    def mysend(self, msg):
        totalsent = 0
        while totalsent < MSGLEN:
            sent = self.sock.send(msg[totalsent:])
            if sent == 0:
                raise RuntimeError("socket connection broken")
            totalsent = totalsent + sent

    def myreceive(self):
        chunks = []
        bytes_recd = 0
        while bytes_recd < MSGLEN:
            chunk = self.sock.recv(min(MSGLEN - bytes_recd, 2048))
            if chunk == b'@w{'}:
                raise RuntimeError("socket connection broken")
            chunks.append(chunk)
            bytes_recd = bytes_recd + len(chunk)
        return b'@w{'}.join(chunks)
@end example

The sending code here is usable for almost any messaging scheme - in Python you
send strings, and you can use @code{len()} to determine its length (even if it has
embedded @code{\0} characters). It’s mostly the receiving code that gets more
complex. (And in C, it’s not much worse, except you can’t use @code{strlen} if the
message has embedded @code{\0}s.)

The easiest enhancement is to make the first character of the message an
indicator of message type, and have the type determine the length. Now you have
two @code{recv}s - the first to get (at least) that first character so you can
look up the length, and the second in a loop to get the rest. If you decide to
go the delimited route, you’ll be receiving in some arbitrary chunk size, (4096
or 8192 is frequently a good match for network buffer sizes), and scanning what
you’ve received for a delimiter.

One complication to be aware of: if your conversational protocol allows multiple
messages to be sent back to back (without some kind of reply), and you pass
@code{recv} an arbitrary chunk size, you may end up reading the start of a
following message. You’ll need to put that aside and hold onto it, until it’s
needed.

Prefixing the message with its length (say, as 5 numeric characters) gets more
complex, because (believe it or not), you may not get all 5 characters in one
@code{recv}. In playing around, you’ll get away with it; but in high network loads,
your code will very quickly break unless you use two @code{recv} loops - the first
to determine the length, the second to get the data part of the message. Nasty.
This is also when you’ll discover that @code{send} does not always manage to get
rid of everything in one pass. And despite having read this, you will eventually
get bit by it!

In the interests of space, building your character, (and preserving my
competitive position), these enhancements are left as an exercise for the
reader. Lets move on to cleaning up.

@menu
* Binary Data:: 

@end menu

@node Binary Data,,,Using a Socket
@anchor{howto/sockets binary-data}@anchor{5b3d}
@subsubsection Binary Data


It is perfectly possible to send binary data over a socket. The major problem is
that not all machines use the same formats for binary data. For example,
network byte order@footnote{https://en.wikipedia.org/wiki/Endianness#Networking}
is big-endian, with the most significant byte first,
so a 16 bit integer with the value @code{1} would be the two hex bytes @code{00 01}.
However, most common processors (x86/AMD64, ARM, RISC-V), are little-endian,
with the least significant byte first - that same @code{1} would be @code{01 00}.

Socket libraries have calls for converting 16 and 32 bit integers - @code{ntohl,
htonl, ntohs, htons} where “n” means `network' and “h” means `host', “s” means
`short' and “l” means `long'. Where network order is host order, these do
nothing, but where the machine is byte-reversed, these swap the bytes around
appropriately.

In these days of 64-bit machines, the ASCII representation of binary data is
frequently smaller than the binary representation. That’s because a surprising
amount of the time, most integers have the value 0, or maybe 1.
The string @code{"0"} would be two bytes, while a full 64-bit integer would be 8.
Of course, this doesn’t fit well with fixed-length messages.
Decisions, decisions.

@node Disconnecting,Non-blocking Sockets,Using a Socket,Socket Programming HOWTO
@anchor{howto/sockets disconnecting}@anchor{5b3e}
@subsection Disconnecting


Strictly speaking, you’re supposed to use @code{shutdown} on a socket before you
@code{close} it.  The @code{shutdown} is an advisory to the socket at the other end.
Depending on the argument you pass it, it can mean “I’m not going to send
anymore, but I’ll still listen”, or “I’m not listening, good riddance!”.  Most
socket libraries, however, are so used to programmers neglecting to use this
piece of etiquette that normally a @code{close} is the same as @code{shutdown();
close()}.  So in most situations, an explicit @code{shutdown} is not needed.

One way to use @code{shutdown} effectively is in an HTTP-like exchange. The client
sends a request and then does a @code{shutdown(1)}. This tells the server “This
client is done sending, but can still receive.”  The server can detect “EOF” by
a receive of 0 bytes. It can assume it has the complete request.  The server
sends a reply. If the @code{send} completes successfully then, indeed, the client
was still receiving.

Python takes the automatic shutdown a step further, and says that when a socket
is garbage collected, it will automatically do a @code{close} if it’s needed. But
relying on this is a very bad habit. If your socket just disappears without
doing a @code{close}, the socket at the other end may hang indefinitely, thinking
you’re just being slow. `Please' @code{close} your sockets when you’re done.

@menu
* When Sockets Die:: 

@end menu

@node When Sockets Die,,,Disconnecting
@anchor{howto/sockets when-sockets-die}@anchor{5b3f}
@subsubsection When Sockets Die


Probably the worst thing about using blocking sockets is what happens when the
other side comes down hard (without doing a @code{close}). Your socket is likely to
hang. TCP is a reliable protocol, and it will wait a long, long time
before giving up on a connection. If you’re using threads, the entire thread is
essentially dead. There’s not much you can do about it. As long as you aren’t
doing something dumb, like holding a lock while doing a blocking read, the
thread isn’t really consuming much in the way of resources. Do `not' try to kill
the thread - part of the reason that threads are more efficient than processes
is that they avoid the overhead associated with the automatic recycling of
resources. In other words, if you do manage to kill the thread, your whole
process is likely to be screwed up.

@node Non-blocking Sockets,,Disconnecting,Socket Programming HOWTO
@anchor{howto/sockets non-blocking-sockets}@anchor{5b40}
@subsection Non-blocking Sockets


If you’ve understood the preceding, you already know most of what you need to
know about the mechanics of using sockets. You’ll still use the same calls, in
much the same ways. It’s just that, if you do it right, your app will be almost
inside-out.

In Python, you use @code{socket.setblocking(False)} to make it non-blocking. In C, it’s
more complex, (for one thing, you’ll need to choose between the BSD flavor
@code{O_NONBLOCK} and the almost indistinguishable POSIX flavor @code{O_NDELAY}, which
is completely different from @code{TCP_NODELAY}), but it’s the exact same idea. You
do this after creating the socket, but before using it. (Actually, if you’re
nuts, you can switch back and forth.)

The major mechanical difference is that @code{send}, @code{recv}, @code{connect} and
@code{accept} can return without having done anything. You have (of course) a
number of choices. You can check return code and error codes and generally drive
yourself crazy. If you don’t believe me, try it sometime. Your app will grow
large, buggy and suck CPU. So let’s skip the brain-dead solutions and do it
right.

Use @code{select}.

In C, coding @code{select} is fairly complex. In Python, it’s a piece of cake, but
it’s close enough to the C version that if you understand @code{select} in Python,
you’ll have little trouble with it in C:

@example
ready_to_read, ready_to_write, in_error = \
               select.select(
                  potential_readers,
                  potential_writers,
                  potential_errs,
                  timeout)
@end example

You pass @code{select} three lists: the first contains all sockets that you might
want to try reading; the second all the sockets you might want to try writing
to, and the last (normally left empty) those that you want to check for errors.
You should note that a socket can go into more than one list. The @code{select}
call is blocking, but you can give it a timeout. This is generally a sensible
thing to do - give it a nice long timeout (say a minute) unless you have good
reason to do otherwise.

In return, you will get three lists. They contain the sockets that are actually
readable, writable and in error. Each of these lists is a subset (possibly
empty) of the corresponding list you passed in.

If a socket is in the output readable list, you can be
as-close-to-certain-as-we-ever-get-in-this-business that a @code{recv} on that
socket will return `something'. Same idea for the writable list. You’ll be able
to send `something'. Maybe not all you want to, but `something' is better than
nothing.  (Actually, any reasonably healthy socket will return as writable - it
just means outbound network buffer space is available.)

If you have a “server” socket, put it in the potential_readers list. If it comes
out in the readable list, your @code{accept} will (almost certainly) work. If you
have created a new socket to @code{connect} to someone else, put it in the
potential_writers list. If it shows up in the writable list, you have a decent
chance that it has connected.

Actually, @code{select} can be handy even with blocking sockets. It’s one way of
determining whether you will block - the socket returns as readable when there’s
something in the buffers.  However, this still doesn’t help with the problem of
determining whether the other end is done, or just busy with something else.

`Portability alert': On Unix, @code{select} works both with the sockets and
files. Don’t try this on Windows. On Windows, @code{select} works with sockets
only. Also note that in C, many of the more advanced socket options are done
differently on Windows. In fact, on Windows I usually use threads (which work
very, very well) with my sockets.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Sorting Techniques,Unicode HOWTO,Socket Programming HOWTO,Python HOWTOs
@anchor{howto/sorting doc}@anchor{5b41}@anchor{howto/sorting sorting-techniques}@anchor{5b42}@anchor{howto/sorting sortinghowto}@anchor{2625}@anchor{howto/sorting translation-repo}@anchor{5b43}
@section Sorting Techniques


@*Author: 
Andrew Dalke and Raymond Hettinger


Python lists have a built-in @ref{dce,,list.sort()} method that modifies the list
in-place.  There is also a @ref{dcd,,sorted()} built-in function that builds a new
sorted list from an iterable.

In this document, we explore the various techniques for sorting data using Python.

@menu
* Sorting Basics:: 
* Key Functions:: 
* Operator Module Functions and Partial Function Evaluation:: 
* Ascending and Descending:: 
* Sort Stability and Complex Sorts:: 
* Decorate-Sort-Undecorate:: 
* Comparison Functions:: 
* Strategies For Unorderable Types and Values:: 
* Odds and Ends: Odds and Ends<2>. 
* Partial Sorts:: 

@end menu

@node Sorting Basics,Key Functions,,Sorting Techniques
@anchor{howto/sorting sorting-basics}@anchor{5b44}
@subsection Sorting Basics


A simple ascending sort is very easy: just call the @ref{dcd,,sorted()} function. It
returns a new sorted list:

@example
>>> sorted([5, 2, 3, 1, 4])
[1, 2, 3, 4, 5]
@end example

You can also use the @ref{dce,,list.sort()} method. It modifies the list
in-place (and returns @code{None} to avoid confusion). Usually it’s less convenient
than @ref{dcd,,sorted()} - but if you don’t need the original list, it’s slightly
more efficient.

@example
>>> a = [5, 2, 3, 1, 4]
>>> a.sort()
>>> a
[1, 2, 3, 4, 5]
@end example

Another difference is that the @ref{dce,,list.sort()} method is only defined for
lists. In contrast, the @ref{dcd,,sorted()} function accepts any iterable.

@example
>>> sorted(@{1: 'D', 2: 'B', 3: 'B', 4: 'E', 5: 'A'@})
[1, 2, 3, 4, 5]
@end example

@node Key Functions,Operator Module Functions and Partial Function Evaluation,Sorting Basics,Sorting Techniques
@anchor{howto/sorting key-functions}@anchor{5b45}
@subsection Key Functions


The @ref{dce,,list.sort()} method and the functions @ref{dcd,,sorted()},
@ref{1111,,min()}, @ref{1112,,max()}, @ref{2a0f,,heapq.nsmallest()}, and
@ref{2a0e,,heapq.nlargest()} have a `key' parameter to specify a function (or
other callable) to be called on each list element prior to making
comparisons.

For example, here’s a case-insensitive string comparison using
@ref{fdc,,str.casefold()}:

@example
>>> sorted("This is a test string from Andrew".split(), key=str.casefold)
['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']
@end example

The value of the `key' parameter should be a function (or other callable) that
takes a single argument and returns a key to use for sorting purposes. This
technique is fast because the key function is called exactly once for each
input record.

A common pattern is to sort complex objects using some of the object’s indices
as keys. For example:

@example
>>> student_tuples = [
...     ('john', 'A', 15),
...     ('jane', 'B', 12),
...     ('dave', 'B', 10),
... ]
>>> sorted(student_tuples, key=lambda student: student[2])   # sort by age
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
@end example

The same technique works for objects with named attributes. For example:

@example
>>> class Student:
...     def __init__(self, name, grade, age):
...         self.name = name
...         self.grade = grade
...         self.age = age
...     def __repr__(self):
...         return repr((self.name, self.grade, self.age))

>>> student_objects = [
...     Student('john', 'A', 15),
...     Student('jane', 'B', 12),
...     Student('dave', 'B', 10),
... ]
>>> sorted(student_objects, key=lambda student: student.age)   # sort by age
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
@end example

Objects with named attributes can be made by a regular class as shown
above, or they can be instances of @ref{4e2,,dataclass} or
a @ref{85f,,named tuple}.

@node Operator Module Functions and Partial Function Evaluation,Ascending and Descending,Key Functions,Sorting Techniques
@anchor{howto/sorting operator-module-functions-and-partial-function-evaluation}@anchor{5b46}
@subsection Operator Module Functions and Partial Function Evaluation


The @ref{100c,,key function} patterns shown above are very common, so Python provides
convenience functions to make accessor functions easier and faster. The
@ref{a3,,operator} module has @ref{c5d,,itemgetter()},
@ref{1039,,attrgetter()}, and a @ref{103a,,methodcaller()} function.

Using those functions, the above examples become simpler and faster:

@example
>>> from operator import itemgetter, attrgetter

>>> sorted(student_tuples, key=itemgetter(2))
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

>>> sorted(student_objects, key=attrgetter('age'))
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
@end example

The operator module functions allow multiple levels of sorting. For example, to
sort by `grade' then by `age':

@example
>>> sorted(student_tuples, key=itemgetter(1,2))
[('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]

>>> sorted(student_objects, key=attrgetter('grade', 'age'))
[('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]
@end example

The @ref{63,,functools} module provides another helpful tool for making
key-functions.  The @ref{219,,partial()} function can reduce the
arity@footnote{https://en.wikipedia.org/wiki/Arity} of a multi-argument
function making it suitable for use as a key-function.

@example
>>> from functools import partial
>>> from unicodedata import normalize

>>> names = 'Zoë Åbjørn Núñez Élana Zeke Abe Nubia Eloise'.split()

>>> sorted(names, key=partial(normalize, 'NFD'))
['Abe', 'Åbjørn', 'Eloise', 'Élana', 'Nubia', 'Núñez', 'Zeke', 'Zoë']

>>> sorted(names, key=partial(normalize, 'NFC'))
['Abe', 'Eloise', 'Nubia', 'Núñez', 'Zeke', 'Zoë', 'Åbjørn', 'Élana']
@end example

@node Ascending and Descending,Sort Stability and Complex Sorts,Operator Module Functions and Partial Function Evaluation,Sorting Techniques
@anchor{howto/sorting ascending-and-descending}@anchor{5b47}
@subsection Ascending and Descending


Both @ref{dce,,list.sort()} and @ref{dcd,,sorted()} accept a `reverse' parameter with a
boolean value. This is used to flag descending sorts. For example, to get the
student data in reverse `age' order:

@example
>>> sorted(student_tuples, key=itemgetter(2), reverse=True)
[('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]

>>> sorted(student_objects, key=attrgetter('age'), reverse=True)
[('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
@end example

@node Sort Stability and Complex Sorts,Decorate-Sort-Undecorate,Ascending and Descending,Sorting Techniques
@anchor{howto/sorting sort-stability-and-complex-sorts}@anchor{5b48}
@subsection Sort Stability and Complex Sorts


Sorts are guaranteed to be stable@footnote{https://en.wikipedia.org/wiki/Sorting_algorithm#Stability}. That means that
when multiple records have the same key, their original order is preserved.

@example
>>> data = [('red', 1), ('blue', 1), ('red', 2), ('blue', 2)]
>>> sorted(data, key=itemgetter(0))
[('blue', 1), ('blue', 2), ('red', 1), ('red', 2)]
@end example

Notice how the two records for `blue' retain their original order so that
@code{('blue', 1)} is guaranteed to precede @code{('blue', 2)}.

This wonderful property lets you build complex sorts in a series of sorting
steps. For example, to sort the student data by descending `grade' and then
ascending `age', do the `age' sort first and then sort again using `grade':

@example
>>> s = sorted(student_objects, key=attrgetter('age'))     # sort on secondary key
>>> sorted(s, key=attrgetter('grade'), reverse=True)       # now sort on primary key, descending
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
@end example

This can be abstracted out into a wrapper function that can take a list and
tuples of field and order to sort them on multiple passes.

@example
>>> def multisort(xs, specs):
...     for key, reverse in reversed(specs):
...         xs.sort(key=attrgetter(key), reverse=reverse)
...     return xs

>>> multisort(list(student_objects), (('grade', True), ('age', False)))
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
@end example

The Timsort@footnote{https://en.wikipedia.org/wiki/Timsort} algorithm used in Python
does multiple sorts efficiently because it can take advantage of any ordering
already present in a dataset.

@node Decorate-Sort-Undecorate,Comparison Functions,Sort Stability and Complex Sorts,Sorting Techniques
@anchor{howto/sorting decorate-sort-undecorate}@anchor{5b49}
@subsection Decorate-Sort-Undecorate


This idiom is called Decorate-Sort-Undecorate after its three steps:


@itemize *

@item 
First, the initial list is decorated with new values that control the sort order.

@item 
Second, the decorated list is sorted.

@item 
Finally, the decorations are removed, creating a list that contains only the
initial values in the new order.
@end itemize

For example, to sort the student data by `grade' using the DSU approach:

@example
>>> decorated = [(student.grade, i, student) for i, student in enumerate(student_objects)]
>>> decorated.sort()
>>> [student for grade, i, student in decorated]               # undecorate
[('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
@end example

This idiom works because tuples are compared lexicographically; the first items
are compared; if they are the same then the second items are compared, and so
on.

It is not strictly necessary in all cases to include the index `i' in the
decorated list, but including it gives two benefits:


@itemize *

@item 
The sort is stable – if two items have the same key, their order will be
preserved in the sorted list.

@item 
The original items do not have to be comparable because the ordering of the
decorated tuples will be determined by at most the first two items. So for
example the original list could contain complex numbers which cannot be sorted
directly.
@end itemize

Another name for this idiom is
Schwartzian transform@footnote{https://en.wikipedia.org/wiki/Schwartzian_transform},
after Randal L. Schwartz, who popularized it among Perl programmers.

Now that Python sorting provides key-functions, this technique is not often needed.

@node Comparison Functions,Strategies For Unorderable Types and Values,Decorate-Sort-Undecorate,Sorting Techniques
@anchor{howto/sorting comparison-functions}@anchor{5b4a}
@subsection Comparison Functions


Unlike key functions that return an absolute value for sorting, a comparison
function computes the relative ordering for two inputs.

For example, a balance scale@footnote{https://upload.wikimedia.org/wikipedia/commons/1/17/Balance_à_tabac_1850.JPG}
compares two samples giving a relative ordering: lighter, equal, or heavier.
Likewise, a comparison function such as @code{cmp(a, b)} will return a negative
value for less-than, zero if the inputs are equal, or a positive value for
greater-than.

It is common to encounter comparison functions when translating algorithms from
other languages.  Also, some libraries provide comparison functions as part of
their API.  For example, @ref{4350,,locale.strcoll()} is a comparison function.

To accommodate those situations, Python provides
@ref{13e6,,functools.cmp_to_key} to wrap the comparison function
to make it usable as a key function:

@example
sorted(words, key=cmp_to_key(strcoll))  # locale-aware sort order
@end example

@node Strategies For Unorderable Types and Values,Odds and Ends<2>,Comparison Functions,Sorting Techniques
@anchor{howto/sorting strategies-for-unorderable-types-and-values}@anchor{5b4b}
@subsection Strategies For Unorderable Types and Values


A number of type and value issues can arise when sorting.
Here are some strategies that can help:


@itemize *

@item 
Convert non-comparable input types to strings prior to sorting:
@end itemize

@example
>>> data = ['twelve', '11', 10]
>>> sorted(map(str, data))
['10', '11', 'twelve']
@end example

This is needed because most cross-type comparisons raise a
@ref{199,,TypeError}.


@itemize *

@item 
Remove special values prior to sorting:
@end itemize

@example
>>> from math import isnan
>>> from itertools import filterfalse
>>> data = [3.3, float('nan'), 1.1, 2.2]
>>> sorted(filterfalse(isnan, data))
[1.1, 2.2, 3.3]
@end example

This is needed because the IEEE-754 standard@footnote{https://en.wikipedia.org/wiki/IEEE_754} specifies that, “Every NaN
shall compare unordered with everything, including itself.”

Likewise, @code{None} can be stripped from datasets as well:

@example
>>> data = [3.3, None, 1.1, 2.2]
>>> sorted(x for x in data if x is not None)
[1.1, 2.2, 3.3]
@end example

This is needed because @code{None} is not comparable to other types.


@itemize *

@item 
Convert mapping types into sorted item lists before sorting:
@end itemize

@example
>>> data = [@{'a': 1@}, @{'b': 2@}]
>>> sorted(data, key=lambda d: sorted(d.items()))
[@{'a': 1@}, @{'b': 2@}]
@end example

This is needed because dict-to-dict comparisons raise a
@ref{199,,TypeError}.


@itemize *

@item 
Convert set types into sorted lists before sorting:
@end itemize

@example
>>> data = [@{'a', 'b', 'c'@}, @{'b', 'c', 'd'@}]
>>> sorted(map(sorted, data))
[['a', 'b', 'c'], ['b', 'c', 'd']]
@end example

This is needed because the elements contained in set types do not have a
deterministic order.  For example, @code{list(@{'a', 'b'@})} may produce
either @code{['a', 'b']} or @code{['b', 'a']}.

@node Odds and Ends<2>,Partial Sorts,Strategies For Unorderable Types and Values,Sorting Techniques
@anchor{howto/sorting odds-and-ends}@anchor{5b4c}
@subsection Odds and Ends



@itemize *

@item 
For locale aware sorting, use @ref{180c,,locale.strxfrm()} for a key function or
@ref{4350,,locale.strcoll()} for a comparison function.  This is necessary
because “alphabetical” sort orderings can vary across cultures even
if the underlying alphabet is the same.

@item 
The `reverse' parameter still maintains sort stability (so that records with
equal keys retain the original order). Interestingly, that effect can be
simulated without the parameter by using the builtin @ref{a6b,,reversed()} function
twice:

@example
>>> data = [('red', 1), ('blue', 1), ('red', 2), ('blue', 2)]
>>> standard_way = sorted(data, key=itemgetter(0), reverse=True)
>>> double_reversed = list(reversed(sorted(reversed(data), key=itemgetter(0))))
>>> assert standard_way == double_reversed
>>> standard_way
[('red', 1), ('red', 2), ('blue', 1), ('blue', 2)]
@end example

@item 
The sort routines use @code{<} when making comparisons
between two objects. So, it is easy to add a standard sort order to a class by
defining an @ref{14ac,,__lt__()} method:

@example
>>> Student.__lt__ = lambda self, other: self.age < other.age
>>> sorted(student_objects)
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
@end example

However, note that @code{<} can fall back to using @ref{1517,,__gt__()} if
@ref{14ac,,__lt__()} is not implemented (see @ref{14ac,,object.__lt__()}
for details on the mechanics).  To avoid surprises, 
@geindex Python Enhancement Proposals; PEP 8
PEP 8@footnote{https://peps.python.org/pep-0008/}
recommends that all six comparison methods be implemented.
The @ref{1148,,total_ordering()} decorator is provided to make that
task easier.

@item 
Key functions need not depend directly on the objects being sorted. A key
function can also access external resources. For instance, if the student grades
are stored in a dictionary, they can be used to sort a separate list of student
names:

@example
>>> students = ['dave', 'john', 'jane']
>>> newgrades = @{'john': 'F', 'jane':'A', 'dave': 'C'@}
>>> sorted(students, key=newgrades.__getitem__)
['jane', 'dave', 'john']
@end example
@end itemize

@node Partial Sorts,,Odds and Ends<2>,Sorting Techniques
@anchor{howto/sorting partial-sorts}@anchor{5b4d}
@subsection Partial Sorts


Some applications require only some of the data to be ordered.  The standard
library provides several tools that do less work than a full sort:


@itemize *

@item 
@ref{1111,,min()} and @ref{1112,,max()} return the smallest and largest values,
respectively.  These functions make a single pass over the input data and
require almost no auxiliary memory.

@item 
@ref{2a0f,,heapq.nsmallest()} and @ref{2a0e,,heapq.nlargest()} return
the `n' smallest and largest values, respectively.  These functions
make a single pass over the data keeping only `n' elements in memory
at a time.  For values of `n' that are small relative to the number of
inputs, these functions make far fewer comparisons than a full sort.

@item 
@ref{16c8,,heapq.heappush()} and @ref{16c9,,heapq.heappop()} create and maintain a
partially sorted arrangement of data that keeps the smallest element
at position @code{0}.  These functions are suitable for implementing
priority queues which are commonly used for task scheduling.
@end itemize

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Unicode HOWTO,HOWTO Fetch Internet Resources Using The urllib Package,Sorting Techniques,Python HOWTOs
@anchor{howto/unicode doc}@anchor{5b4e}@anchor{howto/unicode id1}@anchor{5b4f}@anchor{howto/unicode translation-repo}@anchor{5b50}@anchor{howto/unicode unicode-howto}@anchor{14b0}
@section Unicode HOWTO


@*Release: 
1.12


This HOWTO discusses Python’s support for the Unicode specification
for representing textual data, and explains various problems that
people commonly encounter when trying to work with Unicode.

@menu
* Introduction to Unicode:: 
* Python’s Unicode Support:: 
* Reading and Writing Unicode Data:: 
* Acknowledgements: Acknowledgements<10>. 

@end menu

@node Introduction to Unicode,Python’s Unicode Support,,Unicode HOWTO
@anchor{howto/unicode introduction-to-unicode}@anchor{5b51}
@subsection Introduction to Unicode


@menu
* Definitions:: 
* Encodings:: 
* References: References<3>. 

@end menu

@node Definitions,Encodings,,Introduction to Unicode
@anchor{howto/unicode definitions}@anchor{5b52}
@subsubsection Definitions


Today’s programs need to be able to handle a wide variety of
characters.  Applications are often internationalized to display
messages and output in a variety of user-selectable languages; the
same program might need to output an error message in English, French,
Japanese, Hebrew, or Russian.  Web content can be written in any of
these languages and can also include a variety of emoji symbols.
Python’s string type uses the Unicode Standard for representing
characters, which lets Python programs work with all these different
possible characters.

Unicode (@indicateurl{https://www.unicode.org/}) is a specification that aims to
list every character used by human languages and give each character
its own unique code.  The Unicode specifications are continually
revised and updated to add new languages and symbols.

A `character' is the smallest possible component of a text.  ‘A’, ‘B’, ‘C’,
etc., are all different characters.  So are ‘È’ and ‘Í’.  Characters vary
depending on the language or context you’re talking
about.  For example, there’s a character for “Roman Numeral One”, ‘Ⅰ’, that’s
separate from the uppercase letter ‘I’.  They’ll usually look the same,
but these are two different characters that have different meanings.

The Unicode standard describes how characters are represented by
`code points'.  A code point value is an integer in the range 0 to
0x10FFFF (about 1.1 million values, the
actual number assigned@footnote{https://www.unicode.org/versions/latest/#Summary}
is less than that). In the standard and in this document, a code point is written
using the notation @code{U+265E} to mean the character with value
@code{0x265e} (9,822 in decimal).

The Unicode standard contains a lot of tables listing characters and
their corresponding code points:

@example
0061    'a'; LATIN SMALL LETTER A
0062    'b'; LATIN SMALL LETTER B
0063    'c'; LATIN SMALL LETTER C
...
007B    '@{'; LEFT CURLY BRACKET
...
2167    'Ⅷ'; ROMAN NUMERAL EIGHT
2168    'Ⅸ'; ROMAN NUMERAL NINE
...
265E    '♞'; BLACK CHESS KNIGHT
265F    '♟'; BLACK CHESS PAWN
...
1F600   '😀'; GRINNING FACE
1F609   '😉'; WINKING FACE
...
@end example

Strictly, these definitions imply that it’s meaningless to say ‘this is
character @code{U+265E}’.  @code{U+265E} is a code point, which represents some particular
character; in this case, it represents the character ‘BLACK CHESS KNIGHT’,
‘♞’.  In
informal contexts, this distinction between code points and characters will
sometimes be forgotten.

A character is represented on a screen or on paper by a set of graphical
elements that’s called a `glyph'.  The glyph for an uppercase A, for example,
is two diagonal strokes and a horizontal stroke, though the exact details will
depend on the font being used.  Most Python code doesn’t need to worry about
glyphs; figuring out the correct glyph to display is generally the job of a GUI
toolkit or a terminal’s font renderer.

@node Encodings,References<3>,Definitions,Introduction to Unicode
@anchor{howto/unicode encodings}@anchor{5b53}
@subsubsection Encodings


To summarize the previous section: a Unicode string is a sequence of
code points, which are numbers from 0 through @code{0x10FFFF} (1,114,111
decimal).  This sequence of code points needs to be represented in
memory as a set of `code units', and `code units' are then mapped
to 8-bit bytes.  The rules for translating a Unicode string into a
sequence of bytes are called a `character encoding', or just
an `encoding'.

The first encoding you might think of is using 32-bit integers as the
code unit, and then using the CPU’s representation of 32-bit integers.
In this representation, the string “Python” might look like this:

@example
   P           y           t           h           o           n
0x50 00 00 00 79 00 00 00 74 00 00 00 68 00 00 00 6f 00 00 00 6e 00 00 00
   0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
@end example

This representation is straightforward but using it presents a number of
problems.


@enumerate 

@item 
It’s not portable; different processors order the bytes differently.

@item 
It’s very wasteful of space.  In most texts, the majority of the code points
are less than 127, or less than 255, so a lot of space is occupied by @code{0x00}
bytes.  The above string takes 24 bytes compared to the 6 bytes needed for an
ASCII representation.  Increased RAM usage doesn’t matter too much (desktop
computers have gigabytes of RAM, and strings aren’t usually that large), but
expanding our usage of disk and network bandwidth by a factor of 4 is
intolerable.

@item 
It’s not compatible with existing C functions such as @code{strlen()}, so a new
family of wide string functions would need to be used.
@end enumerate

Therefore this encoding isn’t used very much, and people instead choose other
encodings that are more efficient and convenient, such as UTF-8.

UTF-8 is one of the most commonly used encodings, and Python often
defaults to using it.  UTF stands for “Unicode Transformation Format”,
and the ‘8’ means that 8-bit values are used in the encoding.  (There
are also UTF-16 and UTF-32 encodings, but they are less frequently
used than UTF-8.)  UTF-8 uses the following rules:


@enumerate 

@item 
If the code point is < 128, it’s represented by the corresponding byte value.

@item 
If the code point is >= 128, it’s turned into a sequence of two, three, or
four bytes, where each byte of the sequence is between 128 and 255.
@end enumerate

UTF-8 has several convenient properties:


@enumerate 

@item 
It can handle any Unicode code point.

@item 
A Unicode string is turned into a sequence of bytes that contains embedded
zero bytes only where they represent the null character (U+0000). This means
that UTF-8 strings can be processed by C functions such as @code{strcpy()} and sent
through protocols that can’t handle zero bytes for anything other than
end-of-string markers.

@item 
A string of ASCII text is also valid UTF-8 text.

@item 
UTF-8 is fairly compact; the majority of commonly used characters can be
represented with one or two bytes.

@item 
If bytes are corrupted or lost, it’s possible to determine the start of the
next UTF-8-encoded code point and resynchronize.  It’s also unlikely that
random 8-bit data will look like valid UTF-8.

@item 
UTF-8 is a byte oriented encoding. The encoding specifies that each
character is represented by a specific sequence of one or more bytes. This
avoids the byte-ordering issues that can occur with integer and word oriented
encodings, like UTF-16 and UTF-32, where the sequence of bytes varies depending
on the hardware on which the string was encoded.
@end enumerate

@node References<3>,,Encodings,Introduction to Unicode
@anchor{howto/unicode references}@anchor{5b54}
@subsubsection References


The Unicode Consortium site@footnote{https://www.unicode.org} has character charts, a
glossary, and PDF versions of the Unicode specification.  Be prepared for some
difficult reading.  A chronology@footnote{https://www.unicode.org/history/} of the
origin and development of Unicode is also available on the site.

On the Computerphile Youtube channel, Tom Scott briefly
discusses the history of Unicode and UTF-8@footnote{https://www.youtube.com/watch?v=MijmeoH9LT4}
(9 minutes 36 seconds).

To help understand the standard, Jukka Korpela has written an introductory guide@footnote{https://jkorpela.fi/unicode/guide.html} to reading the
Unicode character tables.

Another good introductory article@footnote{https://www.joelonsoftware.com/2003/10/08/the-absolute-minimum-every-software-developer-absolutely-positively-must-know-about-unicode-and-character-sets-no-excuses/}
was written by Joel Spolsky.
If this introduction didn’t make things clear to you, you should try
reading this alternate article before continuing.

Wikipedia entries are often helpful; see the entries for “character encoding@footnote{https://en.wikipedia.org/wiki/Character_encoding}” and UTF-8@footnote{https://en.wikipedia.org/wiki/UTF-8}, for example.

@node Python’s Unicode Support,Reading and Writing Unicode Data,Introduction to Unicode,Unicode HOWTO
@anchor{howto/unicode python-s-unicode-support}@anchor{5b55}
@subsection Python’s Unicode Support


Now that you’ve learned the rudiments of Unicode, we can look at Python’s
Unicode features.

@menu
* The String Type:: 
* Converting to Bytes:: 
* Unicode Literals in Python Source Code:: 
* Unicode Properties:: 
* Comparing Strings:: 
* Unicode Regular Expressions:: 
* References: References<4>. 

@end menu

@node The String Type,Converting to Bytes,,Python’s Unicode Support
@anchor{howto/unicode the-string-type}@anchor{5b56}
@subsubsection The String Type


Since Python 3.0, the language’s @ref{16a,,str} type contains Unicode
characters, meaning any string created using @code{"unicode rocks!"}, @code{'unicode
rocks!'}, or the triple-quoted string syntax is stored as Unicode.

The default encoding for Python source code is UTF-8, so you can simply
include a Unicode character in a string literal:

@example
try:
    with open('/tmp/input.txt', 'r') as f:
        ...
except OSError:
    # 'File not found' error message.
    print("Fichier non trouvé")
@end example

Side note: Python 3 also supports using Unicode characters in identifiers:

@example
répertoire = "/tmp/records.log"
with open(répertoire, "w") as f:
    f.write("test\n")
@end example

If you can’t enter a particular character in your editor or want to
keep the source code ASCII-only for some reason, you can also use
escape sequences in string literals. (Depending on your system,
you may see the actual capital-delta glyph instead of a u escape.)

@example
>>> "\N@{GREEK CAPITAL LETTER DELTA@}"  # Using the character name
'\u0394'
>>> "\u0394"                          # Using a 16-bit hex value
'\u0394'
>>> "\U00000394"                      # Using a 32-bit hex value
'\u0394'
@end example

In addition, one can create a string using the @ref{ad9,,decode()} method of
@ref{193,,bytes}.  This method takes an `encoding' argument, such as @code{UTF-8},
and optionally an `errors' argument.

The `errors' argument specifies the response when the input string can’t be
converted according to the encoding’s rules.  Legal values for this argument are
@code{'strict'} (raise a @ref{c0e,,UnicodeDecodeError} exception), @code{'replace'} (use
@code{U+FFFD}, @code{REPLACEMENT CHARACTER}), @code{'ignore'} (just leave the
character out of the Unicode result), or @code{'backslashreplace'} (inserts a
@code{\xNN} escape sequence).
The following examples show the differences:

@example
>>> b'\x80abc'.decode("utf-8", "strict")
Traceback (most recent call last):
    ...
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0:
  invalid start byte
>>> b'\x80abc'.decode("utf-8", "replace")
'\ufffdabc'
>>> b'\x80abc'.decode("utf-8", "backslashreplace")
'\\x80abc'
>>> b'\x80abc'.decode("utf-8", "ignore")
'abc'
@end example

Encodings are specified as strings containing the encoding’s name.  Python
comes with roughly 100 different encodings; see the Python Library Reference at
@ref{fbe,,Standard Encodings} for a list.  Some encodings have multiple names; for
example, @code{'latin-1'}, @code{'iso_8859_1'} and @code{'8859}’ are all synonyms for
the same encoding.

One-character Unicode strings can also be created with the @ref{1a33,,chr()}
built-in function, which takes integers and returns a Unicode string of length 1
that contains the corresponding code point.  The reverse operation is the
built-in @ref{237f,,ord()} function that takes a one-character Unicode string and
returns the code point value:

@example
>>> chr(57344)
'\ue000'
>>> ord('\ue000')
57344
@end example

@node Converting to Bytes,Unicode Literals in Python Source Code,The String Type,Python’s Unicode Support
@anchor{howto/unicode converting-to-bytes}@anchor{5b57}
@subsubsection Converting to Bytes


The opposite method of @ref{ad9,,bytes.decode()} is @ref{ad8,,str.encode()},
which returns a @ref{193,,bytes} representation of the Unicode string, encoded in the
requested `encoding'.

The `errors' parameter is the same as the parameter of the
@ref{ad9,,decode()} method but supports a few more possible handlers. As well as
@code{'strict'}, @code{'ignore'}, and @code{'replace'} (which in this case
inserts a question mark instead of the unencodable character), there is
also @code{'xmlcharrefreplace'} (inserts an XML character reference),
@code{backslashreplace} (inserts a @code{\uNNNN} escape sequence) and
@code{namereplace} (inserts a @code{\N@{...@}} escape sequence).

The following example shows the different results:

@example
>>> u = chr(40960) + 'abcd' + chr(1972)
>>> u.encode('utf-8')
b'\xea\x80\x80abcd\xde\xb4'
>>> u.encode('ascii')
Traceback (most recent call last):
    ...
UnicodeEncodeError: 'ascii' codec can't encode character '\ua000' in
  position 0: ordinal not in range(128)
>>> u.encode('ascii', 'ignore')
b'abcd'
>>> u.encode('ascii', 'replace')
b'?abcd?'
>>> u.encode('ascii', 'xmlcharrefreplace')
b'&#40960;abcd&#1972;'
>>> u.encode('ascii', 'backslashreplace')
b'\\ua000abcd\\u07b4'
>>> u.encode('ascii', 'namereplace')
b'\\N@{YI SYLLABLE IT@}abcd\\u07b4'
@end example

The low-level routines for registering and accessing the available
encodings are found in the @ref{1c,,codecs} module.  Implementing new
encodings also requires understanding the @code{codecs} module.
However, the encoding and decoding functions returned by this module
are usually more low-level than is comfortable, and writing new encodings
is a specialized task, so the module won’t be covered in this HOWTO.

@node Unicode Literals in Python Source Code,Unicode Properties,Converting to Bytes,Python’s Unicode Support
@anchor{howto/unicode unicode-literals-in-python-source-code}@anchor{5b58}
@subsubsection Unicode Literals in Python Source Code


In Python source code, specific Unicode code points can be written using the
@code{\u} escape sequence, which is followed by four hex digits giving the code
point.  The @code{\U} escape sequence is similar, but expects eight hex digits,
not four:

@example
>>> s = "a\xac\u1234\u20ac\U00008000"
... #     ^^^^ two-digit hex escape
... #         ^^^^^^ four-digit Unicode escape
... #                     ^^^^^^^^^^ eight-digit Unicode escape
>>> [ord(c) for c in s]
[97, 172, 4660, 8364, 32768]
@end example

Using escape sequences for code points greater than 127 is fine in small doses,
but becomes an annoyance if you’re using many accented characters, as you would
in a program with messages in French or some other accent-using language.  You
can also assemble strings using the @ref{1a33,,chr()} built-in function, but this is
even more tedious.

Ideally, you’d want to be able to write literals in your language’s natural
encoding.  You could then edit Python source code with your favorite editor
which would display the accented characters naturally, and have the right
characters used at runtime.

Python supports writing source code in UTF-8 by default, but you can use almost
any encoding if you declare the encoding being used.  This is done by including
a special comment as either the first or second line of the source file:

@example
#!/usr/bin/env python
# -*- coding: latin-1 -*-

u = 'abcdé'
print(ord(u[-1]))
@end example

The syntax is inspired by Emacs’s notation for specifying variables local to a
file.  Emacs supports many different variables, but Python only supports
‘coding’.  The @code{-*-} symbols indicate to Emacs that the comment is special;
they have no significance to Python but are a convention.  Python looks for
@code{coding: name} or @code{coding=name} in the comment.

If you don’t include such a comment, the default encoding used will be UTF-8 as
already mentioned.  See also 
@geindex Python Enhancement Proposals; PEP 263
PEP 263@footnote{https://peps.python.org/pep-0263/} for more information.

@node Unicode Properties,Comparing Strings,Unicode Literals in Python Source Code,Python’s Unicode Support
@anchor{howto/unicode id2}@anchor{5b59}@anchor{howto/unicode unicode-properties}@anchor{2696}
@subsubsection Unicode Properties


The Unicode specification includes a database of information about
code points.  For each defined code point, the information includes
the character’s name, its category, the numeric value if applicable
(for characters representing numeric concepts such as the Roman
numerals, fractions such as one-third and four-fifths, etc.).  There
are also display-related properties, such as how to use the code point
in bidirectional text.

The following program displays some information about several characters, and
prints the numeric value of one particular character:

@example
import unicodedata

u = chr(233) + chr(0x0bf2) + chr(3972) + chr(6000) + chr(13231)

for i, c in enumerate(u):
    print(i, '%04x' % ord(c), unicodedata.category(c), end=" ")
    print(unicodedata.name(c))

# Get numeric value of second character
print(unicodedata.numeric(u[1]))
@end example

When run, this prints:

@example
0 00e9 Ll LATIN SMALL LETTER E WITH ACUTE
1 0bf2 No TAMIL NUMBER ONE THOUSAND
2 0f84 Mn TIBETAN MARK HALANTA
3 1770 Lo TAGBANWA LETTER SA
4 33af So SQUARE RAD OVER S SQUARED
1000.0
@end example

The category codes are abbreviations describing the nature of the character.
These are grouped into categories such as “Letter”, “Number”, “Punctuation”, or
“Symbol”, which in turn are broken up into subcategories.  To take the codes
from the above output, @code{'Ll'} means ‘Letter, lowercase’, @code{'No'} means
“Number, other”, @code{'Mn'} is “Mark, nonspacing”, and @code{'So'} is “Symbol,
other”.  See
the General Category Values section of the Unicode Character Database documentation@footnote{https://www.unicode.org/reports/tr44/#General_Category_Values} for a
list of category codes.

@node Comparing Strings,Unicode Regular Expressions,Unicode Properties,Python’s Unicode Support
@anchor{howto/unicode comparing-strings}@anchor{5b5a}
@subsubsection Comparing Strings


Unicode adds some complication to comparing strings, because the same
set of characters can be represented by different sequences of code
points.  For example, a letter like ‘ê’ can be represented as a single
code point U+00EA, or as U+0065 U+0302, which is the code point for
‘e’ followed by a code point for ‘COMBINING CIRCUMFLEX ACCENT’.  These
will produce the same output when printed, but one is a string of
length 1 and the other is of length 2.

One tool for a case-insensitive comparison is the
@ref{fdc,,casefold()} string method that converts a string to a
case-insensitive form following an algorithm described by the Unicode
Standard.  This algorithm has special handling for characters such as
the German letter ‘ß’ (code point U+00DF), which becomes the pair of
lowercase letters ‘ss’.

@example
>>> street = 'Gürzenichstraße'
>>> street.casefold()
'gürzenichstrasse'
@end example

A second tool is the @ref{10c,,unicodedata} module’s
@ref{8e6,,normalize()} function that converts strings to one
of several normal forms, where letters followed by a combining character are
replaced with single characters.  @code{normalize()} can
be used to perform string comparisons that won’t falsely report
inequality if two strings use combining characters differently:

@example
import unicodedata

def compare_strs(s1, s2):
    def NFD(s):
        return unicodedata.normalize('NFD', s)

    return NFD(s1) == NFD(s2)

single_char = 'ê'
multiple_chars = '\N@{LATIN SMALL LETTER E@}\N@{COMBINING CIRCUMFLEX ACCENT@}'
print('length of first string=', len(single_char))
print('length of second string=', len(multiple_chars))
print(compare_strs(single_char, multiple_chars))
@end example

When run, this outputs:

@example
$ python compare-strs.py
length of first string= 1
length of second string= 2
True
@end example

The first argument to the @ref{8e6,,normalize()} function is a
string giving the desired normalization form, which can be one of
‘NFC’, ‘NFKC’, ‘NFD’, and ‘NFKD’.

The Unicode Standard also specifies how to do caseless comparisons:

@example
import unicodedata

def compare_caseless(s1, s2):
    def NFD(s):
        return unicodedata.normalize('NFD', s)

    return NFD(NFD(s1).casefold()) == NFD(NFD(s2).casefold())

# Example usage
single_char = 'ê'
multiple_chars = '\N@{LATIN CAPITAL LETTER E@}\N@{COMBINING CIRCUMFLEX ACCENT@}'

print(compare_caseless(single_char, multiple_chars))
@end example

This will print @code{True}.  (Why is @code{NFD()} invoked twice?  Because
there are a few characters that make @ref{fdc,,casefold()} return a
non-normalized string, so the result needs to be normalized again. See
section 3.13 of the Unicode Standard for a discussion and an example.)

@node Unicode Regular Expressions,References<4>,Comparing Strings,Python’s Unicode Support
@anchor{howto/unicode unicode-regular-expressions}@anchor{5b5b}
@subsubsection Unicode Regular Expressions


The regular expressions supported by the @ref{be,,re} module can be provided
either as bytes or strings.  Some of the special character sequences such as
@code{\d} and @code{\w} have different meanings depending on whether
the pattern is supplied as bytes or a string.  For example,
@code{\d} will match the characters @code{[0-9]} in bytes but
in strings will match any character that’s in the @code{'Nd'} category.

The string in this example has the number 57 written in both Thai and
Arabic numerals:

@example
import re
p = re.compile(r'\d+')

s = "Over \u0e55\u0e57 57 flavours"
m = p.search(s)
print(repr(m.group()))
@end example

When executed, @code{\d+} will match the Thai numerals and print them
out.  If you supply the @ref{83f,,re.ASCII} flag to
@ref{dd4,,compile()}, @code{\d+} will match the substring “57” instead.

Similarly, @code{\w} matches a wide variety of Unicode characters but
only @code{[a-zA-Z0-9_]} in bytes or if @ref{83f,,re.ASCII} is supplied,
and @code{\s} will match either Unicode whitespace characters or
@code{[ \t\n\r\f\v]}.

@node References<4>,,Unicode Regular Expressions,Python’s Unicode Support
@anchor{howto/unicode id3}@anchor{5b5c}
@subsubsection References


@c comment should these be mentioned earlier, e.g. at the start of the "introduction to Unicode" first section?

Some good alternative discussions of Python’s Unicode support are:


@itemize *

@item 
Processing Text Files in Python 3@footnote{https://python-notes.curiousefficiency.org/en/latest/python3/text_file_processing.html}, by Nick Coghlan.

@item 
Pragmatic Unicode@footnote{https://nedbatchelder.com/text/unipain.html}, a PyCon 2012 presentation by Ned Batchelder.
@end itemize

The @ref{16a,,str} type is described in the Python library reference at
@ref{2023,,Text Sequence Type — str}.

The documentation for the @ref{10c,,unicodedata} module.

The documentation for the @ref{1c,,codecs} module.

Marc-André Lemburg gave a presentation titled "Python and Unicode" (PDF slides)@footnote{https://downloads.egenix.com/python/Unicode-EPC2002-Talk.pdf} at
EuroPython 2002.  The slides are an excellent overview of the design of Python
2’s Unicode features (where the Unicode string type is called @code{unicode} and
literals start with @code{u}).

@node Reading and Writing Unicode Data,Acknowledgements<10>,Python’s Unicode Support,Unicode HOWTO
@anchor{howto/unicode reading-and-writing-unicode-data}@anchor{5b5d}
@subsection Reading and Writing Unicode Data


Once you’ve written some code that works with Unicode data, the next problem is
input/output.  How do you get Unicode strings into your program, and how do you
convert Unicode into a form suitable for storage or transmission?

It’s possible that you may not need to do anything depending on your input
sources and output destinations; you should check whether the libraries used in
your application support Unicode natively.  XML parsers often return Unicode
data, for example.  Many relational databases also support Unicode-valued
columns and can return Unicode values from an SQL query.

Unicode data is usually converted to a particular encoding before it gets
written to disk or sent over a socket.  It’s possible to do all the work
yourself: open a file, read an 8-bit bytes object from it, and convert the bytes
with @code{bytes.decode(encoding)}.  However, the manual approach is not recommended.

One problem is the multi-byte nature of encodings; one Unicode character can be
represented by several bytes.  If you want to read the file in arbitrary-sized
chunks (say, 1024 or 4096 bytes), you need to write error-handling code to catch the case
where only part of the bytes encoding a single Unicode character are read at the
end of a chunk.  One solution would be to read the entire file into memory and
then perform the decoding, but that prevents you from working with files that
are extremely large; if you need to read a 2 GiB file, you need 2 GiB of RAM.
(More, really, since for at least a moment you’d need to have both the encoded
string and its Unicode version in memory.)

The solution would be to use the low-level decoding interface to catch the case
of partial coding sequences.  The work of implementing this has already been
done for you: the built-in @ref{318,,open()} function can return a file-like object
that assumes the file’s contents are in a specified encoding and accepts Unicode
parameters for methods such as @ref{20b0,,read()} and
@ref{209f,,write()}.  This works through @code{open()}'s `encoding' and
`errors' parameters which are interpreted just like those in @ref{ad8,,str.encode()}
and @ref{ad9,,bytes.decode()}.

Reading Unicode from a file is therefore simple:

@example
with open('unicode.txt', encoding='utf-8') as f:
    for line in f:
        print(repr(line))
@end example

It’s also possible to open files in update mode, allowing both reading and
writing:

@example
with open('test', encoding='utf-8', mode='w+') as f:
    f.write('\u4500 blah blah blah\n')
    f.seek(0)
    print(repr(f.readline()[:1]))
@end example

The Unicode character @code{U+FEFF} is used as a byte-order mark (BOM), and is often
written as the first character of a file in order to assist with autodetection
of the file’s byte ordering.  Some encodings, such as UTF-16, expect a BOM to be
present at the start of a file; when such an encoding is used, the BOM will be
automatically written as the first character and will be silently dropped when
the file is read.  There are variants of these encodings, such as ‘utf-16-le’
and ‘utf-16-be’ for little-endian and big-endian encodings, that specify one
particular byte ordering and don’t skip the BOM.

In some areas, it is also convention to use a “BOM” at the start of UTF-8
encoded files; the name is misleading since UTF-8 is not byte-order dependent.
The mark simply announces that the file is encoded in UTF-8.  For reading such
files, use the ‘utf-8-sig’ codec to automatically skip the mark if present.

@menu
* Unicode filenames:: 
* Tips for Writing Unicode-aware Programs:: 
* References: References<5>. 

@end menu

@node Unicode filenames,Tips for Writing Unicode-aware Programs,,Reading and Writing Unicode Data
@anchor{howto/unicode unicode-filenames}@anchor{5b5e}
@subsubsection Unicode filenames


Most of the operating systems in common use today support filenames
that contain arbitrary Unicode characters.  Usually this is
implemented by converting the Unicode string into some encoding that
varies depending on the system.  Today Python is converging on using
UTF-8: Python on MacOS has used UTF-8 for several versions, and Python
3.6 switched to using UTF-8 on Windows as well.  On Unix systems,
there will only be a @ref{75e,,filesystem encoding}. if you’ve set the @code{LANG} or @code{LC_CTYPE} environment variables; if
you haven’t, the default encoding is again UTF-8.

The @ref{e59,,sys.getfilesystemencoding()} function returns the encoding to use on
your current system, in case you want to do the encoding manually, but there’s
not much reason to bother.  When opening a file for reading or writing, you can
usually just provide the Unicode string as the filename, and it will be
automatically converted to the right encoding for you:

@example
filename = 'filename\u4500abc'
with open(filename, 'w') as f:
    f.write('blah\n')
@end example

Functions in the @ref{a5,,os} module such as @ref{26f,,os.stat()} will also accept Unicode
filenames.

The @ref{1306,,os.listdir()} function returns filenames, which raises an issue: should it return
the Unicode version of filenames, or should it return bytes containing
the encoded versions?  @code{os.listdir()} can do both, depending on whether you
provided the directory path as bytes or a Unicode string.  If you pass a
Unicode string as the path, filenames will be decoded using the filesystem’s
encoding and a list of Unicode strings will be returned, while passing a byte
path will return the filenames as bytes.  For example,
assuming the default @ref{75e,,filesystem encoding} is UTF-8, running the following program:

@example
fn = 'filename\u4500abc'
f = open(fn, 'w')
f.close()

import os
print(os.listdir(b'.'))
print(os.listdir('.'))
@end example

will produce the following output:

@example
$ python listdir-test.py
[b'filename\xe4\x94\x80abc', ...]
['filename\u4500abc', ...]
@end example

The first list contains UTF-8-encoded filenames, and the second list contains
the Unicode versions.

Note that on most occasions, you should can just stick with using
Unicode with these APIs.  The bytes APIs should only be used on
systems where undecodable file names can be present; that’s
pretty much only Unix systems now.

@node Tips for Writing Unicode-aware Programs,References<5>,Unicode filenames,Reading and Writing Unicode Data
@anchor{howto/unicode tips-for-writing-unicode-aware-programs}@anchor{5b5f}
@subsubsection Tips for Writing Unicode-aware Programs


This section provides some suggestions on writing software that deals with
Unicode.

The most important tip is:

@quotation

Software should only work with Unicode strings internally, decoding the input
data as soon as possible and encoding the output only at the end.
@end quotation

If you attempt to write processing functions that accept both Unicode and byte
strings, you will find your program vulnerable to bugs wherever you combine the
two different kinds of strings.  There is no automatic encoding or decoding: if
you do e.g. @code{str + bytes}, a @ref{199,,TypeError} will be raised.

When using data coming from a web browser or some other untrusted source, a
common technique is to check for illegal characters in a string before using the
string in a generated command line or storing it in a database.  If you’re doing
this, be careful to check the decoded string, not the encoded bytes data;
some encodings may have interesting properties, such as not being bijective
or not being fully ASCII-compatible.  This is especially true if the input
data also specifies the encoding, since the attacker can then choose a
clever way to hide malicious text in the encoded bytestream.

@menu
* Converting Between File Encodings:: 
* Files in an Unknown Encoding:: 

@end menu

@node Converting Between File Encodings,Files in an Unknown Encoding,,Tips for Writing Unicode-aware Programs
@anchor{howto/unicode converting-between-file-encodings}@anchor{5b60}
@subsubsection Converting Between File Encodings


The @ref{1e16,,StreamRecoder} class can transparently convert between
encodings, taking a stream that returns data in encoding #1
and behaving like a stream returning data in encoding #2.

For example, if you have an input file `f' that’s in Latin-1, you
can wrap it with a @ref{1e16,,StreamRecoder} to return bytes encoded in
UTF-8:

@example
new_f = codecs.StreamRecoder(f,
    # en/decoder: used by read() to encode its results and
    # by write() to decode its input.
    codecs.getencoder('utf-8'), codecs.getdecoder('utf-8'),

    # reader/writer: used to read and write to the stream.
    codecs.getreader('latin-1'), codecs.getwriter('latin-1') )
@end example

@node Files in an Unknown Encoding,,Converting Between File Encodings,Tips for Writing Unicode-aware Programs
@anchor{howto/unicode files-in-an-unknown-encoding}@anchor{5b61}
@subsubsection Files in an Unknown Encoding


What can you do if you need to make a change to a file, but don’t know
the file’s encoding?  If you know the encoding is ASCII-compatible and
only want to examine or modify the ASCII parts, you can open the file
with the @code{surrogateescape} error handler:

@example
with open(fname, 'r', encoding="ascii", errors="surrogateescape") as f:
    data = f.read()

# make changes to the string 'data'

with open(fname + '.new', 'w',
          encoding="ascii", errors="surrogateescape") as f:
    f.write(data)
@end example

The @code{surrogateescape} error handler will decode any non-ASCII bytes
as code points in a special range running from U+DC80 to
U+DCFF.  These code points will then turn back into the
same bytes when the @code{surrogateescape} error handler is used to
encode the data and write it back out.

@node References<5>,,Tips for Writing Unicode-aware Programs,Reading and Writing Unicode Data
@anchor{howto/unicode id4}@anchor{5b62}
@subsubsection References


One section of Mastering Python 3 Input/Output@footnote{https://pyvideo.org/video/289/pycon-2010--mastering-python-3-i-o},
a PyCon 2010 talk by David Beazley, discusses text processing and binary data handling.

The PDF slides for Marc-André Lemburg's presentation "Writing Unicode-aware Applications in Python"@footnote{https://downloads.egenix.com/python/LSM2005-Developing-Unicode-aware-applications-in-Python.pdf}
discuss questions of character encodings as well as how to internationalize
and localize an application.  These slides cover Python 2.x only.

The Guts of Unicode in Python@footnote{https://pyvideo.org/video/1768/the-guts-of-unicode-in-python}
is a PyCon 2013 talk by Benjamin Peterson that discusses the internal Unicode
representation in Python 3.3.

@node Acknowledgements<10>,,Reading and Writing Unicode Data,Unicode HOWTO
@anchor{howto/unicode acknowledgements}@anchor{5b63}
@subsection Acknowledgements


The initial draft of this document was written by Andrew Kuchling.
It has since been revised further by Alexander Belopolsky, Georg Brandl,
Andrew Kuchling, and Ezio Melotti.

Thanks to the following people who have noted errors or offered
suggestions on this article: Éric Araujo, Nicholas Bastin, Nick
Coghlan, Marius Gedminas, Kent Johnson, Ken Krugler, Marc-André
Lemburg, Martin von Löwis, Terry J. Reedy, Serhiy Storchaka,
Eryk Sun, Chad Whitacre, Graham Wideman.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node HOWTO Fetch Internet Resources Using The urllib Package,An introduction to the ipaddress module,Unicode HOWTO,Python HOWTOs
@anchor{howto/urllib2 doc}@anchor{5b64}@anchor{howto/urllib2 howto-fetch-internet-resources-using-the-urllib-package}@anchor{5b65}@anchor{howto/urllib2 translation-repo}@anchor{5b66}@anchor{howto/urllib2 urllib-howto}@anchor{400d}
@section HOWTO Fetch Internet Resources Using The urllib Package


@*Author: 
Michael Foord@footnote{https://agileabstractions.com/}


@menu
* Introduction: Introduction<17>. 
* Fetching URLs:: 
* Handling Exceptions: Handling Exceptions<2>. 
* info and geturl:: 
* Openers and Handlers:: 
* Basic Authentication:: 
* Proxies:: 
* Sockets and Layers:: 
* Footnotes:: 

@end menu

@node Introduction<17>,Fetching URLs,,HOWTO Fetch Internet Resources Using The urllib Package
@anchor{howto/urllib2 introduction}@anchor{5b67}
@subsection Introduction


@subsubheading Related Articles



You may also find useful the following article on fetching web resources
with Python:


@itemize *

@item 
Basic Authentication@footnote{https://web.archive.org/web/20201215133350/http://www.voidspace.org.uk/python/articles/authentication.shtml}

@quotation

A tutorial on `Basic Authentication', with examples in Python.
@end quotation
@end itemize

`urllib.request' is a Python module for fetching URLs
(Uniform Resource Locators). It offers a very simple interface, in the form of
the `urlopen' function. This is capable of fetching URLs using a variety of
different protocols. It also offers a slightly more complex interface for
handling common situations - like basic authentication, cookies, proxies and so
on. These are provided by objects called handlers and openers.

urllib.request supports fetching URLs for many “URL schemes” (identified by the string
before the @code{":"} in URL - for example @code{"ftp"} is the URL scheme of
@code{"ftp://python.org/"}) using their associated network protocols (e.g. FTP, HTTP).
This tutorial focuses on the most common case, HTTP.

For straightforward situations `urlopen' is very easy to use. But as soon as you
encounter errors or non-trivial cases when opening HTTP URLs, you will need some
understanding of the HyperText Transfer Protocol. The most comprehensive and
authoritative reference to HTTP is 
@geindex RFC; RFC 2616
RFC 2616@footnote{https://datatracker.ietf.org/doc/html/rfc2616.html}. This is a technical document and
not intended to be easy to read. This HOWTO aims to illustrate using `urllib',
with enough detail about HTTP to help you through. It is not intended to replace
the @ref{112,,urllib.request} docs, but is supplementary to them.

@node Fetching URLs,Handling Exceptions<2>,Introduction<17>,HOWTO Fetch Internet Resources Using The urllib Package
@anchor{howto/urllib2 fetching-urls}@anchor{5b68}
@subsection Fetching URLs


The simplest way to use urllib.request is as follows:

@example
import urllib.request
with urllib.request.urlopen('http://python.org/') as response:
   html = response.read()
@end example

If you wish to retrieve a resource via URL and store it in a temporary
location, you can do so via the @ref{c58,,shutil.copyfileobj()} and
@ref{6ee,,tempfile.NamedTemporaryFile()} functions:

@example
import shutil
import tempfile
import urllib.request

with urllib.request.urlopen('http://python.org/') as response:
    with tempfile.NamedTemporaryFile(delete=False) as tmp_file:
        shutil.copyfileobj(response, tmp_file)

with open(tmp_file.name) as html:
    pass
@end example

Many uses of urllib will be that simple (note that instead of an ‘http:’ URL we
could have used a URL starting with ‘ftp:’, ‘file:’, etc.).  However, it’s the
purpose of this tutorial to explain the more complicated cases, concentrating on
HTTP.

HTTP is based on requests and responses - the client makes requests and servers
send responses. urllib.request mirrors this with a @code{Request} object which represents
the HTTP request you are making. In its simplest form you create a Request
object that specifies the URL you want to fetch. Calling @code{urlopen} with this
Request object returns a response object for the URL requested. This response is
a file-like object, which means you can for example call @code{.read()} on the
response:

@example
import urllib.request

req = urllib.request.Request('http://python.org/')
with urllib.request.urlopen(req) as response:
   the_page = response.read()
@end example

Note that urllib.request makes use of the same Request interface to handle all URL
schemes.  For example, you can make an FTP request like so:

@example
req = urllib.request.Request('ftp://example.com/')
@end example

In the case of HTTP, there are two extra things that Request objects allow you
to do: First, you can pass data to be sent to the server.  Second, you can pass
extra information (“metadata”) `about' the data or about the request itself, to
the server - this information is sent as HTTP “headers”.  Let’s look at each of
these in turn.

@menu
* Data:: 
* Headers:: 

@end menu

@node Data,Headers,,Fetching URLs
@anchor{howto/urllib2 data}@anchor{5b69}
@subsubsection Data


Sometimes you want to send data to a URL (often the URL will refer to a CGI
(Common Gateway Interface) script or other web application). With HTTP,
this is often done using what’s known as a `POST' request. This is often what
your browser does when you submit a HTML form that you filled in on the web. Not
all POSTs have to come from forms: you can use a POST to transmit arbitrary data
to your own application. In the common case of HTML forms, the data needs to be
encoded in a standard way, and then passed to the Request object as the @code{data}
argument. The encoding is done using a function from the @ref{111,,urllib.parse}
library.

@example
import urllib.parse
import urllib.request

url = 'http://www.someserver.com/cgi-bin/register.cgi'
values = @{'name' : 'Michael Foord',
          'location' : 'Northampton',
          'language' : 'Python' @}

data = urllib.parse.urlencode(values)
data = data.encode('ascii') # data should be bytes
req = urllib.request.Request(url, data)
with urllib.request.urlopen(req) as response:
   the_page = response.read()
@end example

Note that other encodings are sometimes required (e.g. for file upload from HTML
forms - see HTML Specification@comma{} Form Submission@footnote{https://www.w3.org/TR/REC-html40/interact/forms.html#h-17.13} for more
details).

If you do not pass the @code{data} argument, urllib uses a `GET' request. One
way in which GET and POST requests differ is that POST requests often have
“side-effects”: they change the state of the system in some way (for example by
placing an order with the website for a hundredweight of tinned spam to be
delivered to your door).  Though the HTTP standard makes it clear that POSTs are
intended to `always' cause side-effects, and GET requests `never' to cause
side-effects, nothing prevents a GET request from having side-effects, nor a
POST requests from having no side-effects. Data can also be passed in an HTTP
GET request by encoding it in the URL itself.

This is done as follows:

@example
>>> import urllib.request
>>> import urllib.parse
>>> data = @{@}
>>> data['name'] = 'Somebody Here'
>>> data['location'] = 'Northampton'
>>> data['language'] = 'Python'
>>> url_values = urllib.parse.urlencode(data)
>>> print(url_values)  # The order may differ from below.
name=Somebody+Here&language=Python&location=Northampton
>>> url = 'http://www.example.com/example.cgi'
>>> full_url = url + '?' + url_values
>>> data = urllib.request.urlopen(full_url)
@end example

Notice that the full URL is created by adding a @code{?} to the URL, followed by
the encoded values.

@node Headers,,Data,Fetching URLs
@anchor{howto/urllib2 headers}@anchor{5b6a}
@subsubsection Headers


We’ll discuss here one particular HTTP header, to illustrate how to add headers
to your HTTP request.

Some websites @footnote{
Google for example.
} dislike being browsed by programs, or send different versions
to different browsers @footnote{
Browser sniffing is a very bad practice for website design - building
sites using web standards is much more sensible. Unfortunately a lot of
sites still send different versions to different browsers.
}. By default urllib identifies itself as
@code{Python-urllib/x.y} (where @code{x} and @code{y} are the major and minor version
numbers of the Python release,
e.g. @code{Python-urllib/2.5}), which may confuse the site, or just plain
not work. The way a browser identifies itself is through the
@code{User-Agent} header @footnote{
The user agent for MSIE 6 is
`‘Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)’'
}. When you create a Request object you can
pass a dictionary of headers in. The following example makes the same
request as above, but identifies itself as a version of Internet
Explorer @footnote{
For details of more HTTP request headers, see
@uref{https://jkorpela.fi/http.html,Quick Reference to HTTP Headers}.
}.

@example
import urllib.parse
import urllib.request

url = 'http://www.someserver.com/cgi-bin/register.cgi'
user_agent = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64)'
values = @{'name': 'Michael Foord',
          'location': 'Northampton',
          'language': 'Python' @}
headers = @{'User-Agent': user_agent@}

data = urllib.parse.urlencode(values)
data = data.encode('ascii')
req = urllib.request.Request(url, data, headers)
with urllib.request.urlopen(req) as response:
   the_page = response.read()
@end example

The response also has two useful methods. See the section on @ref{5b6b,,info and geturl}
which comes after we have a look at what happens when things go wrong.

@node Handling Exceptions<2>,info and geturl,Fetching URLs,HOWTO Fetch Internet Resources Using The urllib Package
@anchor{howto/urllib2 handling-exceptions}@anchor{5b6c}
@subsection Handling Exceptions


`urlopen' raises @ref{2c0,,URLError} when it cannot handle a response (though as
usual with Python APIs, built-in exceptions such as @ref{2ee,,ValueError},
@ref{199,,TypeError} etc. may also be raised).

@ref{11e4,,HTTPError} is the subclass of @ref{2c0,,URLError} raised in the specific case of
HTTP URLs.

The exception classes are exported from the @ref{110,,urllib.error} module.

@menu
* URLError:: 
* HTTPError:: 
* Wrapping it Up:: 

@end menu

@node URLError,HTTPError,,Handling Exceptions<2>
@anchor{howto/urllib2 urlerror}@anchor{5b6d}
@subsubsection URLError


Often, URLError is raised because there is no network connection (no route to
the specified server), or the specified server doesn’t exist.  In this case, the
exception raised will have a ‘reason’ attribute, which is a tuple containing an
error code and a text error message.

e.g.

@example
>>> req = urllib.request.Request('http://www.pretend_server.org')
>>> try: urllib.request.urlopen(req)
... except urllib.error.URLError as e:
...     print(e.reason)
...
(4, 'getaddrinfo failed')
@end example

@node HTTPError,Wrapping it Up,URLError,Handling Exceptions<2>
@anchor{howto/urllib2 httperror}@anchor{5b6e}
@subsubsection HTTPError


Every HTTP response from the server contains a numeric “status code”. Sometimes
the status code indicates that the server is unable to fulfil the request. The
default handlers will handle some of these responses for you (for example, if
the response is a “redirection” that requests the client fetch the document from
a different URL, urllib will handle that for you). For those it can’t handle,
urlopen will raise an @ref{11e4,,HTTPError}. Typical errors include ‘404’ (page not
found), ‘403’ (request forbidden), and ‘401’ (authentication required).

See section 10 of 
@geindex RFC; RFC 2616
RFC 2616@footnote{https://datatracker.ietf.org/doc/html/rfc2616.html} for a reference on all the HTTP error codes.

The @ref{11e4,,HTTPError} instance raised will have an integer ‘code’ attribute, which
corresponds to the error sent by the server.

@menu
* Error Codes:: 

@end menu

@node Error Codes,,,HTTPError
@anchor{howto/urllib2 error-codes}@anchor{5b6f}
@subsubsection Error Codes


Because the default handlers handle redirects (codes in the 300 range), and
codes in the 100–299 range indicate success, you will usually only see error
codes in the 400–599 range.

@ref{4032,,http.server.BaseHTTPRequestHandler.responses} is a useful dictionary of
response codes that shows all the response codes used by 
@geindex RFC; RFC 2616
RFC 2616@footnote{https://datatracker.ietf.org/doc/html/rfc2616.html}.
An excerpt from the dictionary is shown below

@example
responses = @{
    ...
    <HTTPStatus.OK: 200>: ('OK', 'Request fulfilled, document follows'),
    ...
    <HTTPStatus.FORBIDDEN: 403>: ('Forbidden',
                                  'Request forbidden -- authorization will '
                                  'not help'),
    <HTTPStatus.NOT_FOUND: 404>: ('Not Found',
                                  'Nothing matches the given URI'),
    ...
    <HTTPStatus.IM_A_TEAPOT: 418>: ("I'm a Teapot",
                                    'Server refuses to brew coffee because '
                                    'it is a teapot'),
    ...
    <HTTPStatus.SERVICE_UNAVAILABLE: 503>: ('Service Unavailable',
                                            'The server cannot process the '
                                            'request due to a high load'),
    ...
    @}
@end example

When an error is raised the server responds by returning an HTTP error code
`and' an error page. You can use the @ref{11e4,,HTTPError} instance as a response on the
page returned. This means that as well as the code attribute, it also has read,
geturl, and info, methods as returned by the @code{urllib.response} module:

@example
>>> req = urllib.request.Request('http://www.python.org/fish.html')
>>> try:
...     urllib.request.urlopen(req)
... except urllib.error.HTTPError as e:
...     print(e.code)
...     print(e.read())
...
404
b'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n\n\n<html
  ...
  <title>Page Not Found</title>\n
  ...
@end example

@node Wrapping it Up,,HTTPError,Handling Exceptions<2>
@anchor{howto/urllib2 wrapping-it-up}@anchor{5b70}
@subsubsection Wrapping it Up


So if you want to be prepared for @ref{11e4,,HTTPError} `or' @ref{2c0,,URLError} there are two
basic approaches. I prefer the second approach.

@menu
* Number 1:: 
* Number 2:: 

@end menu

@node Number 1,Number 2,,Wrapping it Up
@anchor{howto/urllib2 number-1}@anchor{5b71}
@subsubsection Number 1


@example
from urllib.request import Request, urlopen
from urllib.error import URLError, HTTPError
req = Request(someurl)
try:
    response = urlopen(req)
except HTTPError as e:
    print('The server couldn\'t fulfill the request.')
    print('Error code: ', e.code)
except URLError as e:
    print('We failed to reach a server.')
    print('Reason: ', e.reason)
else:
    # everything is fine
@end example

@cartouche
@quotation Note 
The @code{except HTTPError} `must' come first, otherwise @code{except URLError}
will `also' catch an @ref{11e4,,HTTPError}.
@end quotation
@end cartouche

@node Number 2,,Number 1,Wrapping it Up
@anchor{howto/urllib2 number-2}@anchor{5b72}
@subsubsection Number 2


@example
from urllib.request import Request, urlopen
from urllib.error import URLError
req = Request(someurl)
try:
    response = urlopen(req)
except URLError as e:
    if hasattr(e, 'reason'):
        print('We failed to reach a server.')
        print('Reason: ', e.reason)
    elif hasattr(e, 'code'):
        print('The server couldn\'t fulfill the request.')
        print('Error code: ', e.code)
else:
    # everything is fine
@end example

@node info and geturl,Openers and Handlers,Handling Exceptions<2>,HOWTO Fetch Internet Resources Using The urllib Package
@anchor{howto/urllib2 info-and-geturl}@anchor{5b6b}
@subsection info and geturl


The response returned by urlopen (or the @ref{11e4,,HTTPError} instance) has two
useful methods @code{info()} and @code{geturl()} and is defined in the module
@ref{113,,urllib.response}.


@itemize *

@item 
`geturl' - this returns the real URL of the page fetched. This is useful
because @code{urlopen} (or the opener object used) may have followed a
redirect. The URL of the page fetched may not be the same as the URL requested.

@item 
`info' - this returns a dictionary-like object that describes the page
fetched, particularly the headers sent by the server. It is currently an
@ref{404b,,http.client.HTTPMessage} instance.
@end itemize

Typical headers include ‘Content-length’, ‘Content-type’, and so on. See the
Quick Reference to HTTP Headers@footnote{https://jkorpela.fi/http.html}
for a useful listing of HTTP headers with brief explanations of their meaning
and use.

@node Openers and Handlers,Basic Authentication,info and geturl,HOWTO Fetch Internet Resources Using The urllib Package
@anchor{howto/urllib2 openers-and-handlers}@anchor{5b73}
@subsection Openers and Handlers


When you fetch a URL you use an opener (an instance of the perhaps
confusingly named @ref{3f9b,,urllib.request.OpenerDirector}). Normally we have been using
the default opener - via @code{urlopen} - but you can create custom
openers. Openers use handlers. All the “heavy lifting” is done by the
handlers. Each handler knows how to open URLs for a particular URL scheme (http,
ftp, etc.), or how to handle an aspect of URL opening, for example HTTP
redirections or HTTP cookies.

You will want to create openers if you want to fetch URLs with specific handlers
installed, for example to get an opener that handles cookies, or to get an
opener that does not handle redirections.

To create an opener, instantiate an @code{OpenerDirector}, and then call
@code{.add_handler(some_handler_instance)} repeatedly.

Alternatively, you can use @code{build_opener}, which is a convenience function for
creating opener objects with a single function call.  @code{build_opener} adds
several handlers by default, but provides a quick way to add more and/or
override the default handlers.

Other sorts of handlers you might want to can handle proxies, authentication,
and other common but slightly specialised situations.

@code{install_opener} can be used to make an @code{opener} object the (global) default
opener. This means that calls to @code{urlopen} will use the opener you have
installed.

Opener objects have an @code{open} method, which can be called directly to fetch
urls in the same way as the @code{urlopen} function: there’s no need to call
@code{install_opener}, except as a convenience.

@node Basic Authentication,Proxies,Openers and Handlers,HOWTO Fetch Internet Resources Using The urllib Package
@anchor{howto/urllib2 basic-authentication}@anchor{5b74}
@subsection Basic Authentication


To illustrate creating and installing a handler we will use the
@code{HTTPBasicAuthHandler}. For a more detailed discussion of this subject –
including an explanation of how Basic Authentication works - see the Basic Authentication Tutorial@footnote{https://web.archive.org/web/20201215133350/http://www.voidspace.org.uk/python/articles/authentication.shtml}.

When authentication is required, the server sends a header (as well as the 401
error code) requesting authentication.  This specifies the authentication scheme
and a ‘realm’. The header looks like: @code{WWW-Authenticate: SCHEME
realm="REALM"}.

e.g.

@example
WWW-Authenticate: Basic realm="cPanel Users"
@end example

The client should then retry the request with the appropriate name and password
for the realm included as a header in the request. This is ‘basic
authentication’. In order to simplify this process we can create an instance of
@code{HTTPBasicAuthHandler} and an opener to use this handler.

The @code{HTTPBasicAuthHandler} uses an object called a password manager to handle
the mapping of URLs and realms to passwords and usernames. If you know what the
realm is (from the authentication header sent by the server), then you can use a
@code{HTTPPasswordMgr}. Frequently one doesn’t care what the realm is. In that
case, it is convenient to use @code{HTTPPasswordMgrWithDefaultRealm}. This allows
you to specify a default username and password for a URL. This will be supplied
in the absence of you providing an alternative combination for a specific
realm. We indicate this by providing @code{None} as the realm argument to the
@code{add_password} method.

The top-level URL is the first URL that requires authentication. URLs “deeper”
than the URL you pass to .add_password() will also match.

@example
# create a password manager
password_mgr = urllib.request.HTTPPasswordMgrWithDefaultRealm()

# Add the username and password.
# If we knew the realm, we could use it instead of None.
top_level_url = "http://example.com/foo/"
password_mgr.add_password(None, top_level_url, username, password)

handler = urllib.request.HTTPBasicAuthHandler(password_mgr)

# create "opener" (OpenerDirector instance)
opener = urllib.request.build_opener(handler)

# use the opener to fetch a URL
opener.open(a_url)

# Install the opener.
# Now all calls to urllib.request.urlopen use our opener.
urllib.request.install_opener(opener)
@end example

@cartouche
@quotation Note 
In the above example we only supplied our @code{HTTPBasicAuthHandler} to
@code{build_opener}. By default openers have the handlers for normal situations
– @code{ProxyHandler} (if a proxy setting such as an @code{http_proxy}
environment variable is set), @code{UnknownHandler}, @code{HTTPHandler},
@code{HTTPDefaultErrorHandler}, @code{HTTPRedirectHandler}, @code{FTPHandler},
@code{FileHandler}, @code{DataHandler}, @code{HTTPErrorProcessor}.
@end quotation
@end cartouche

@code{top_level_url} is in fact `either' a full URL (including the ‘http:’ scheme
component and the hostname and optionally the port number)
e.g. @code{"http://example.com/"} `or' an “authority” (i.e. the hostname,
optionally including the port number) e.g. @code{"example.com"} or @code{"example.com:8080"}
(the latter example includes a port number).  The authority, if present, must
NOT contain the “userinfo” component - for example @code{"joe:password@@example.com"} is
not correct.

@node Proxies,Sockets and Layers,Basic Authentication,HOWTO Fetch Internet Resources Using The urllib Package
@anchor{howto/urllib2 proxies}@anchor{5b75}
@subsection Proxies


`urllib' will auto-detect your proxy settings and use those. This is through
the @code{ProxyHandler}, which is part of the normal handler chain when a proxy
setting is detected.  Normally that’s a good thing, but there are occasions
when it may not be helpful @footnote{
In my case I have to use a proxy to access the internet at work. If you
attempt to fetch `localhost' URLs through this proxy it blocks them. IE
is set to use the proxy, which urllib picks up on. In order to test
scripts with a localhost server, I have to prevent urllib from using
the proxy.
}. One way to do this is to setup our own
@code{ProxyHandler}, with no proxies defined. This is done using similar steps to
setting up a @ref{5b74,,Basic Authentication} handler:

@example
>>> proxy_support = urllib.request.ProxyHandler(@{@})
>>> opener = urllib.request.build_opener(proxy_support)
>>> urllib.request.install_opener(opener)
@end example

@cartouche
@quotation Note 
Currently @code{urllib.request} `does not' support fetching of @code{https} locations
through a proxy.  However, this can be enabled by extending urllib.request as
shown in the recipe @footnote{
urllib opener for SSL proxy (CONNECT method): @uref{https://code.activestate.com/recipes/456195-urrlib2-opener-for-ssl-proxy-connect-method/,ASPN Cookbook Recipe}.
}.
@end quotation
@end cartouche

@cartouche
@quotation Note 
@code{HTTP_PROXY} will be ignored if a variable @code{REQUEST_METHOD} is set; see
the documentation on @ref{3f98,,getproxies()}.
@end quotation
@end cartouche

@node Sockets and Layers,Footnotes,Proxies,HOWTO Fetch Internet Resources Using The urllib Package
@anchor{howto/urllib2 sockets-and-layers}@anchor{5b76}
@subsection Sockets and Layers


The Python support for fetching resources from the web is layered.  urllib uses
the @ref{73,,http.client} library, which in turn uses the socket library.

As of Python 2.3 you can specify how long a socket should wait for a response
before timing out. This can be useful in applications which have to fetch web
pages. By default the socket module has `no timeout' and can hang. Currently,
the socket timeout is not exposed at the http.client or urllib.request levels.
However, you can set the default timeout globally for all sockets using

@example
import socket
import urllib.request

# timeout in seconds
timeout = 10
socket.setdefaulttimeout(timeout)

# this call to urllib.request.urlopen now uses the default timeout
# we have set in the socket module
req = urllib.request.Request('http://www.voidspace.org.uk')
response = urllib.request.urlopen(req)
@end example


__________________________________________________________________


@node Footnotes,,Sockets and Layers,HOWTO Fetch Internet Resources Using The urllib Package
@anchor{howto/urllib2 footnotes}@anchor{5b77}
@subsection Footnotes


This document was reviewed and revised by John Lee.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c import ipaddress

@node An introduction to the ipaddress module,Instrumenting CPython with DTrace and SystemTap,HOWTO Fetch Internet Resources Using The urllib Package,Python HOWTOs
@anchor{howto/ipaddress doc}@anchor{5b78}@anchor{howto/ipaddress an-introduction-to-the-ipaddress-module}@anchor{5b79}@anchor{howto/ipaddress ipaddress-howto}@anchor{4248}@anchor{howto/ipaddress translation-repo}@anchor{5b7a}
@section An introduction to the ipaddress module


@*author: 
Peter Moody


@*author: 
Nick Coghlan


@subsubheading Overview



This document aims to provide a gentle introduction to the
@ref{84,,ipaddress} module. It is aimed primarily at users that aren’t
already familiar with IP networking terminology, but may also be useful
to network engineers wanting an overview of how @code{ipaddress}
represents IP network addressing concepts.

@menu
* Creating Address/Network/Interface objects:: 
* Inspecting Address/Network/Interface Objects:: 
* Networks as lists of Addresses:: 
* Comparisons: Comparisons<4>. 
* Using IP Addresses with other modules:: 
* Getting more detail when instance creation fails:: 

@end menu

@node Creating Address/Network/Interface objects,Inspecting Address/Network/Interface Objects,,An introduction to the ipaddress module
@anchor{howto/ipaddress creating-address-network-interface-objects}@anchor{5b7b}
@subsection Creating Address/Network/Interface objects


Since @ref{84,,ipaddress} is a module for inspecting and manipulating IP addresses,
the first thing you’ll want to do is create some objects.  You can use
@code{ipaddress} to create objects from strings and integers.

@menu
* A Note on IP Versions:: 
* IP Host Addresses:: 
* Defining Networks:: 
* Host Interfaces:: 

@end menu

@node A Note on IP Versions,IP Host Addresses,,Creating Address/Network/Interface objects
@anchor{howto/ipaddress a-note-on-ip-versions}@anchor{5b7c}
@subsubsection A Note on IP Versions


For readers that aren’t particularly familiar with IP addressing, it’s
important to know that the Internet Protocol (IP) is currently in the process
of moving from version 4 of the protocol to version 6. This transition is
occurring largely because version 4 of the protocol doesn’t provide enough
addresses to handle the needs of the whole world, especially given the
increasing number of devices with direct connections to the internet.

Explaining the details of the differences between the two versions of the
protocol is beyond the scope of this introduction, but readers need to at
least be aware that these two versions exist, and it will sometimes be
necessary to force the use of one version or the other.

@node IP Host Addresses,Defining Networks,A Note on IP Versions,Creating Address/Network/Interface objects
@anchor{howto/ipaddress ip-host-addresses}@anchor{5b7d}
@subsubsection IP Host Addresses


Addresses, often referred to as “host addresses” are the most basic unit
when working with IP addressing. The simplest way to create addresses is
to use the @ref{424a,,ipaddress.ip_address()} factory function, which automatically
determines whether to create an IPv4 or IPv6 address based on the passed in
value:

@example
>>> ipaddress.ip_address('192.0.2.1')
IPv4Address('192.0.2.1')
>>> ipaddress.ip_address('2001:DB8::1')
IPv6Address('2001:db8::1')
@end example

Addresses can also be created directly from integers. Values that will
fit within 32 bits are assumed to be IPv4 addresses:

@example
>>> ipaddress.ip_address(3221225985)
IPv4Address('192.0.2.1')
>>> ipaddress.ip_address(42540766411282592856903984951653826561)
IPv6Address('2001:db8::1')
@end example

To force the use of IPv4 or IPv6 addresses, the relevant classes can be
invoked directly. This is particularly useful to force creation of IPv6
addresses for small integers:

@example
>>> ipaddress.ip_address(1)
IPv4Address('0.0.0.1')
>>> ipaddress.IPv4Address(1)
IPv4Address('0.0.0.1')
>>> ipaddress.IPv6Address(1)
IPv6Address('::1')
@end example

@node Defining Networks,Host Interfaces,IP Host Addresses,Creating Address/Network/Interface objects
@anchor{howto/ipaddress defining-networks}@anchor{5b7e}
@subsubsection Defining Networks


Host addresses are usually grouped together into IP networks, so
@ref{84,,ipaddress} provides a way to create, inspect and manipulate network
definitions. IP network objects are constructed from strings that define the
range of host addresses that are part of that network. The simplest form
for that information is a “network address/network prefix” pair, where the
prefix defines the number of leading bits that are compared to determine
whether or not an address is part of the network and the network address
defines the expected value of those bits.

As for addresses, a factory function is provided that determines the correct
IP version automatically:

@example
>>> ipaddress.ip_network('192.0.2.0/24')
IPv4Network('192.0.2.0/24')
>>> ipaddress.ip_network('2001:db8::0/96')
IPv6Network('2001:db8::/96')
@end example

Network objects cannot have any host bits set.  The practical effect of this
is that @code{192.0.2.1/24} does not describe a network.  Such definitions are
referred to as interface objects since the ip-on-a-network notation is
commonly used to describe network interfaces of a computer on a given network
and are described further in the next section.

By default, attempting to create a network object with host bits set will
result in @ref{2ee,,ValueError} being raised. To request that the
additional bits instead be coerced to zero, the flag @code{strict=False} can
be passed to the constructor:

@example
>>> ipaddress.ip_network('192.0.2.1/24')
Traceback (most recent call last):
   ...
ValueError: 192.0.2.1/24 has host bits set
>>> ipaddress.ip_network('192.0.2.1/24', strict=False)
IPv4Network('192.0.2.0/24')
@end example

While the string form offers significantly more flexibility, networks can
also be defined with integers, just like host addresses. In this case, the
network is considered to contain only the single address identified by the
integer, so the network prefix includes the entire network address:

@example
>>> ipaddress.ip_network(3221225984)
IPv4Network('192.0.2.0/32')
>>> ipaddress.ip_network(42540766411282592856903984951653826560)
IPv6Network('2001:db8::/128')
@end example

As with addresses, creation of a particular kind of network can be forced
by calling the class constructor directly instead of using the factory
function.

@node Host Interfaces,,Defining Networks,Creating Address/Network/Interface objects
@anchor{howto/ipaddress host-interfaces}@anchor{5b7f}
@subsubsection Host Interfaces


As mentioned just above, if you need to describe an address on a particular
network, neither the address nor the network classes are sufficient.
Notation like @code{192.0.2.1/24} is commonly used by network engineers and the
people who write tools for firewalls and routers as shorthand for “the host
@code{192.0.2.1} on the network @code{192.0.2.0/24}”, Accordingly, @ref{84,,ipaddress}
provides a set of hybrid classes that associate an address with a particular
network. The interface for creation is identical to that for defining network
objects, except that the address portion isn’t constrained to being a network
address.

@example
>>> ipaddress.ip_interface('192.0.2.1/24')
IPv4Interface('192.0.2.1/24')
>>> ipaddress.ip_interface('2001:db8::1/96')
IPv6Interface('2001:db8::1/96')
@end example

Integer inputs are accepted (as with networks), and use of a particular IP
version can be forced by calling the relevant constructor directly.

@node Inspecting Address/Network/Interface Objects,Networks as lists of Addresses,Creating Address/Network/Interface objects,An introduction to the ipaddress module
@anchor{howto/ipaddress inspecting-address-network-interface-objects}@anchor{5b80}
@subsection Inspecting Address/Network/Interface Objects


You’ve gone to the trouble of creating an IPv(4|6)(Address|Network|Interface)
object, so you probably want to get information about it.  @ref{84,,ipaddress}
tries to make doing this easy and intuitive.

Extracting the IP version:

@example
>>> addr4 = ipaddress.ip_address('192.0.2.1')
>>> addr6 = ipaddress.ip_address('2001:db8::1')
>>> addr6.version
6
>>> addr4.version
4
@end example

Obtaining the network from an interface:

@example
>>> host4 = ipaddress.ip_interface('192.0.2.1/24')
>>> host4.network
IPv4Network('192.0.2.0/24')
>>> host6 = ipaddress.ip_interface('2001:db8::1/96')
>>> host6.network
IPv6Network('2001:db8::/96')
@end example

Finding out how many individual addresses are in a network:

@example
>>> net4 = ipaddress.ip_network('192.0.2.0/24')
>>> net4.num_addresses
256
>>> net6 = ipaddress.ip_network('2001:db8::0/96')
>>> net6.num_addresses
4294967296
@end example

Iterating through the “usable” addresses on a network:

@example
>>> net4 = ipaddress.ip_network('192.0.2.0/24')
>>> for x in net4.hosts():
...     print(x)
192.0.2.1
192.0.2.2
192.0.2.3
192.0.2.4
...
192.0.2.252
192.0.2.253
192.0.2.254
@end example

Obtaining the netmask (i.e. set bits corresponding to the network prefix) or
the hostmask (any bits that are not part of the netmask):

@example
>>> net4 = ipaddress.ip_network('192.0.2.0/24')
>>> net4.netmask
IPv4Address('255.255.255.0')
>>> net4.hostmask
IPv4Address('0.0.0.255')
>>> net6 = ipaddress.ip_network('2001:db8::0/96')
>>> net6.netmask
IPv6Address('ffff:ffff:ffff:ffff:ffff:ffff::')
>>> net6.hostmask
IPv6Address('::ffff:ffff')
@end example

Exploding or compressing the address:

@example
>>> addr6.exploded
'2001:0db8:0000:0000:0000:0000:0000:0001'
>>> addr6.compressed
'2001:db8::1'
>>> net6.exploded
'2001:0db8:0000:0000:0000:0000:0000:0000/96'
>>> net6.compressed
'2001:db8::/96'
@end example

While IPv4 doesn’t support explosion or compression, the associated objects
still provide the relevant properties so that version neutral code can
easily ensure the most concise or most verbose form is used for IPv6
addresses while still correctly handling IPv4 addresses.

@node Networks as lists of Addresses,Comparisons<4>,Inspecting Address/Network/Interface Objects,An introduction to the ipaddress module
@anchor{howto/ipaddress networks-as-lists-of-addresses}@anchor{5b81}
@subsection Networks as lists of Addresses


It’s sometimes useful to treat networks as lists.  This means it is possible
to index them like this:

@example
>>> net4[1]
IPv4Address('192.0.2.1')
>>> net4[-1]
IPv4Address('192.0.2.255')
>>> net6[1]
IPv6Address('2001:db8::1')
>>> net6[-1]
IPv6Address('2001:db8::ffff:ffff')
@end example

It also means that network objects lend themselves to using the list
membership test syntax like this:

@example
if address in network:
    # do something
@end example

Containment testing is done efficiently based on the network prefix:

@example
>>> addr4 = ipaddress.ip_address('192.0.2.1')
>>> addr4 in ipaddress.ip_network('192.0.2.0/24')
True
>>> addr4 in ipaddress.ip_network('192.0.3.0/24')
False
@end example

@node Comparisons<4>,Using IP Addresses with other modules,Networks as lists of Addresses,An introduction to the ipaddress module
@anchor{howto/ipaddress comparisons}@anchor{5b82}
@subsection Comparisons


@ref{84,,ipaddress} provides some simple, hopefully intuitive ways to compare
objects, where it makes sense:

@example
>>> ipaddress.ip_address('192.0.2.1') < ipaddress.ip_address('192.0.2.2')
True
@end example

A @ref{199,,TypeError} exception is raised if you try to compare objects of
different versions or different types.

@node Using IP Addresses with other modules,Getting more detail when instance creation fails,Comparisons<4>,An introduction to the ipaddress module
@anchor{howto/ipaddress using-ip-addresses-with-other-modules}@anchor{5b83}
@subsection Using IP Addresses with other modules


Other modules that use IP addresses (such as @ref{d1,,socket}) usually won’t
accept objects from this module directly. Instead, they must be coerced to
an integer or string that the other module will accept:

@example
>>> addr4 = ipaddress.ip_address('192.0.2.1')
>>> str(addr4)
'192.0.2.1'
>>> int(addr4)
3221225985
@end example

@node Getting more detail when instance creation fails,,Using IP Addresses with other modules,An introduction to the ipaddress module
@anchor{howto/ipaddress getting-more-detail-when-instance-creation-fails}@anchor{5b84}
@subsection Getting more detail when instance creation fails


When creating address/network/interface objects using the version-agnostic
factory functions, any errors will be reported as @ref{2ee,,ValueError} with
a generic error message that simply says the passed in value was not
recognized as an object of that type. The lack of a specific error is
because it’s necessary to know whether the value is `supposed' to be IPv4
or IPv6 in order to provide more detail on why it has been rejected.

To support use cases where it is useful to have access to this additional
detail, the individual class constructors actually raise the
@ref{2ee,,ValueError} subclasses @ref{424f,,ipaddress.AddressValueError} and
@ref{4270,,ipaddress.NetmaskValueError} to indicate exactly which part of
the definition failed to parse correctly.

The error messages are significantly more detailed when using the
class constructors directly. For example:

@example
>>> ipaddress.ip_address("192.168.0.256")
Traceback (most recent call last):
  ...
ValueError: '192.168.0.256' does not appear to be an IPv4 or IPv6 address
>>> ipaddress.IPv4Address("192.168.0.256")
Traceback (most recent call last):
  ...
ipaddress.AddressValueError: Octet 256 (> 255) not permitted in '192.168.0.256'

>>> ipaddress.ip_network("192.168.0.1/64")
Traceback (most recent call last):
  ...
ValueError: '192.168.0.1/64' does not appear to be an IPv4 or IPv6 network
>>> ipaddress.IPv4Network("192.168.0.1/64")
Traceback (most recent call last):
  ...
ipaddress.NetmaskValueError: '64' is not a valid netmask
@end example

However, both of the module specific exceptions have @ref{2ee,,ValueError} as their
parent class, so if you’re not concerned with the particular type of error,
you can still write code like the following:

@example
try:
    network = ipaddress.IPv4Network(address)
except ValueError:
    print('address/netmask is invalid for IPv4:', address)
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Instrumenting CPython with DTrace and SystemTap,Python support for the Linux perf profiler,An introduction to the ipaddress module,Python HOWTOs
@anchor{howto/instrumentation doc}@anchor{5b85}@anchor{howto/instrumentation instrumentation}@anchor{e6c}@anchor{howto/instrumentation instrumenting-cpython-with-dtrace-and-systemtap}@anchor{5b86}@anchor{howto/instrumentation translation-repo}@anchor{5b87}
@section Instrumenting CPython with DTrace and SystemTap


@*author: 
David Malcolm


@*author: 
Łukasz Langa


DTrace and SystemTap are monitoring tools, each providing a way to inspect
what the processes on a computer system are doing.  They both use
domain-specific languages allowing a user to write scripts which:


@itemize -

@item 
filter which processes are to be observed

@item 
gather data from the processes of interest

@item 
generate reports on the data
@end itemize

As of Python 3.6, CPython can be built with embedded “markers”, also
known as “probes”, that can be observed by a DTrace or SystemTap script,
making it easier to monitor what the CPython processes on a system are
doing.

`CPython implementation detail:' DTrace markers are implementation details of the CPython interpreter.
No guarantees are made about probe compatibility between versions of
CPython. DTrace scripts can stop working or work incorrectly without
warning when changing CPython versions.

@menu
* Enabling the static markers:: 
* Static DTrace probes:: 
* Static SystemTap markers:: 
* Available static markers:: 
* SystemTap Tapsets:: 
* Examples: Examples<40>. 

@end menu

@node Enabling the static markers,Static DTrace probes,,Instrumenting CPython with DTrace and SystemTap
@anchor{howto/instrumentation enabling-the-static-markers}@anchor{5b88}
@subsection Enabling the static markers


macOS comes with built-in support for DTrace.  On Linux, in order to
build CPython with the embedded markers for SystemTap, the SystemTap
development tools must be installed.

On a Linux machine, this can be done via:

@example
$ yum install systemtap-sdt-devel
@end example

or:

@example
$ sudo apt-get install systemtap-sdt-dev
@end example

CPython must then be @ref{21eb,,configured with the --with-dtrace option}:

@example
checking for --with-dtrace... yes
@end example

On macOS, you can list available DTrace probes by running a Python
process in the background and listing all probes made available by the
Python provider:

@example
$ python3.6 -q &
$ sudo dtrace -l -P python$!  # or: dtrace -l -m python3.6

   ID   PROVIDER            MODULE                          FUNCTION NAME
29564 python18035        python3.6          _PyEval_EvalFrameDefault function-entry
29565 python18035        python3.6             dtrace_function_entry function-entry
29566 python18035        python3.6          _PyEval_EvalFrameDefault function-return
29567 python18035        python3.6            dtrace_function_return function-return
29568 python18035        python3.6                           collect gc-done
29569 python18035        python3.6                           collect gc-start
29570 python18035        python3.6          _PyEval_EvalFrameDefault line
29571 python18035        python3.6                 maybe_dtrace_line line
@end example

On Linux, you can verify if the SystemTap static markers are present in
the built binary by seeing if it contains a “.note.stapsdt” section.

@example
$ readelf -S ./python | grep .note.stapsdt
[30] .note.stapsdt        NOTE         0000000000000000 00308d78
@end example

If you’ve built Python as a shared library
(with the @ref{a69,,--enable-shared} configure option), you
need to look instead within the shared library.  For example:

@example
$ readelf -S libpython3.3dm.so.1.0 | grep .note.stapsdt
[29] .note.stapsdt        NOTE         0000000000000000 00365b68
@end example

Sufficiently modern readelf can print the metadata:

@example
$ readelf -n ./python

Displaying notes found at file offset 0x00000254 with length 0x00000020:
    Owner                 Data size          Description
    GNU                  0x00000010          NT_GNU_ABI_TAG (ABI version tag)
        OS: Linux, ABI: 2.6.32

Displaying notes found at file offset 0x00000274 with length 0x00000024:
    Owner                 Data size          Description
    GNU                  0x00000014          NT_GNU_BUILD_ID (unique build ID bitstring)
        Build ID: df924a2b08a7e89f6e11251d4602022977af2670

Displaying notes found at file offset 0x002d6c30 with length 0x00000144:
    Owner                 Data size          Description
    stapsdt              0x00000031          NT_STAPSDT (SystemTap probe descriptors)
        Provider: python
        Name: gc__start
        Location: 0x00000000004371c3, Base: 0x0000000000630ce2, Semaphore: 0x00000000008d6bf6
        Arguments: -4@@%ebx
    stapsdt              0x00000030          NT_STAPSDT (SystemTap probe descriptors)
        Provider: python
        Name: gc__done
        Location: 0x00000000004374e1, Base: 0x0000000000630ce2, Semaphore: 0x00000000008d6bf8
        Arguments: -8@@%rax
    stapsdt              0x00000045          NT_STAPSDT (SystemTap probe descriptors)
        Provider: python
        Name: function__entry
        Location: 0x000000000053db6c, Base: 0x0000000000630ce2, Semaphore: 0x00000000008d6be8
        Arguments: 8@@%rbp 8@@%r12 -4@@%eax
    stapsdt              0x00000046          NT_STAPSDT (SystemTap probe descriptors)
        Provider: python
        Name: function__return
        Location: 0x000000000053dba8, Base: 0x0000000000630ce2, Semaphore: 0x00000000008d6bea
        Arguments: 8@@%rbp 8@@%r12 -4@@%eax
@end example

The above metadata contains information for SystemTap describing how it
can patch strategically placed machine code instructions to enable the
tracing hooks used by a SystemTap script.

@node Static DTrace probes,Static SystemTap markers,Enabling the static markers,Instrumenting CPython with DTrace and SystemTap
@anchor{howto/instrumentation static-dtrace-probes}@anchor{5b89}
@subsection Static DTrace probes


The following example DTrace script can be used to show the call/return
hierarchy of a Python script, only tracing within the invocation of
a function called “start”. In other words, import-time function
invocations are not going to be listed:

@example
self int indent;

python$target:::function-entry
/copyinstr(arg1) == "start"/
@{
        self->trace = 1;
@}

python$target:::function-entry
/self->trace/
@{
        printf("%d\t%*s:", timestamp, 15, probename);
        printf("%*s", self->indent, "");
        printf("%s:%s:%d\n", basename(copyinstr(arg0)), copyinstr(arg1), arg2);
        self->indent++;
@}

python$target:::function-return
/self->trace/
@{
        self->indent--;
        printf("%d\t%*s:", timestamp, 15, probename);
        printf("%*s", self->indent, "");
        printf("%s:%s:%d\n", basename(copyinstr(arg0)), copyinstr(arg1), arg2);
@}

python$target:::function-return
/copyinstr(arg1) == "start"/
@{
        self->trace = 0;
@}
@end example

It can be invoked like this:

@example
$ sudo dtrace -q -s call_stack.d -c "python3.6 script.py"
@end example

The output looks like this:

@example
156641360502280  function-entry:call_stack.py:start:23
156641360518804  function-entry: call_stack.py:function_1:1
156641360532797  function-entry:  call_stack.py:function_3:9
156641360546807 function-return:  call_stack.py:function_3:10
156641360563367 function-return: call_stack.py:function_1:2
156641360578365  function-entry: call_stack.py:function_2:5
156641360591757  function-entry:  call_stack.py:function_1:1
156641360605556  function-entry:   call_stack.py:function_3:9
156641360617482 function-return:   call_stack.py:function_3:10
156641360629814 function-return:  call_stack.py:function_1:2
156641360642285 function-return: call_stack.py:function_2:6
156641360656770  function-entry: call_stack.py:function_3:9
156641360669707 function-return: call_stack.py:function_3:10
156641360687853  function-entry: call_stack.py:function_4:13
156641360700719 function-return: call_stack.py:function_4:14
156641360719640  function-entry: call_stack.py:function_5:18
156641360732567 function-return: call_stack.py:function_5:21
156641360747370 function-return:call_stack.py:start:28
@end example

@node Static SystemTap markers,Available static markers,Static DTrace probes,Instrumenting CPython with DTrace and SystemTap
@anchor{howto/instrumentation static-systemtap-markers}@anchor{5b8a}
@subsection Static SystemTap markers


The low-level way to use the SystemTap integration is to use the static
markers directly.  This requires you to explicitly state the binary file
containing them.

For example, this SystemTap script can be used to show the call/return
hierarchy of a Python script:

@example
probe process("python").mark("function__entry") @{
     filename = user_string($arg1);
     funcname = user_string($arg2);
     lineno = $arg3;

     printf("%s => %s in %s:%d\\n",
            thread_indent(1), funcname, filename, lineno);
@}

probe process("python").mark("function__return") @{
    filename = user_string($arg1);
    funcname = user_string($arg2);
    lineno = $arg3;

    printf("%s <= %s in %s:%d\\n",
           thread_indent(-1), funcname, filename, lineno);
@}
@end example

It can be invoked like this:

@example
$ stap \
  show-call-hierarchy.stp \
  -c "./python test.py"
@end example

The output looks like this:

@example
11408 python(8274):        => __contains__ in Lib/_abcoll.py:362
11414 python(8274):         => __getitem__ in Lib/os.py:425
11418 python(8274):          => encode in Lib/os.py:490
11424 python(8274):          <= encode in Lib/os.py:493
11428 python(8274):         <= __getitem__ in Lib/os.py:426
11433 python(8274):        <= __contains__ in Lib/_abcoll.py:366
@end example

where the columns are:


@itemize -

@item 
time in microseconds since start of script

@item 
name of executable

@item 
PID of process
@end itemize

and the remainder indicates the call/return hierarchy as the script executes.

For a @ref{a69,,--enable-shared} build of CPython, the markers are contained within the
libpython shared library, and the probe’s dotted path needs to reflect this. For
example, this line from the above example:

@example
probe process("python").mark("function__entry") @{
@end example

should instead read:

@example
probe process("python").library("libpython3.6dm.so.1.0").mark("function__entry") @{
@end example

(assuming a @ref{50a,,debug build} of CPython 3.6)

@node Available static markers,SystemTap Tapsets,Static SystemTap markers,Instrumenting CPython with DTrace and SystemTap
@anchor{howto/instrumentation available-static-markers}@anchor{5b8b}@anchor{howto/instrumentation static-markers}@anchor{db7}
@subsection Available static markers



@deffn {Object} function__entry(str filename, str funcname, int lineno)

This marker indicates that execution of a Python function has begun.
It is only triggered for pure-Python (bytecode) functions.

The filename, function name, and line number are provided back to the
tracing script as positional arguments, which must be accessed using
@code{$arg1}, @code{$arg2}, @code{$arg3}:

@quotation


@itemize *

@item 
@code{$arg1} : @code{(const char *)} filename, accessible using @code{user_string($arg1)}

@item 
@code{$arg2} : @code{(const char *)} function name, accessible using
@code{user_string($arg2)}

@item 
@code{$arg3} : @code{int} line number
@end itemize
@end quotation
@end deffn


@deffn {Object} function__return(str filename, str funcname, int lineno)

This marker is the converse of @code{function__entry()}, and indicates that
execution of a Python function has ended (either via @code{return}, or via an
exception).  It is only triggered for pure-Python (bytecode) functions.

The arguments are the same as for @code{function__entry()}
@end deffn


@deffn {Object} line(str filename, str funcname, int lineno)

This marker indicates a Python line is about to be executed.  It is
the equivalent of line-by-line tracing with a Python profiler.  It is
not triggered within C functions.

The arguments are the same as for @code{function__entry()}.
@end deffn


@deffn {Object} gc__start(int generation)

Fires when the Python interpreter starts a garbage collection cycle.
@code{arg0} is the generation to scan, like @ref{1b5,,gc.collect()}.
@end deffn


@deffn {Object} gc__done(long collected)

Fires when the Python interpreter finishes a garbage collection
cycle. @code{arg0} is the number of collected objects.
@end deffn


@deffn {Object} import__find__load__start(str modulename)

Fires before @ref{7b,,importlib} attempts to find and load the module.
@code{arg0} is the module name.


Added in version 3.7.

@end deffn


@deffn {Object} import__find__load__done(str modulename, int found)

Fires after @ref{7b,,importlib}’s find_and_load function is called.
@code{arg0} is the module name, @code{arg1} indicates if module was
successfully loaded.


Added in version 3.7.

@end deffn


@deffn {Object} audit(str event, void *tuple)

Fires when @ref{195f,,sys.audit()} or @ref{613,,PySys_Audit()} is called.
@code{arg0} is the event name as C string, @code{arg1} is a @ref{5df,,PyObject}
pointer to a tuple object.


Added in version 3.8.

@end deffn

@menu
* C Entry Points:: 
* C Probing Checks:: 

@end menu

@node C Entry Points,C Probing Checks,,Available static markers
@anchor{howto/instrumentation c-entry-points}@anchor{5b8c}
@subsubsection C Entry Points


To simplify triggering of DTrace markers, Python’s C API comes with a number
of helper functions that mirror each static marker. On builds of Python without
DTrace enabled, these do nothing.

In general, it is not necessary to call these yourself, as Python will do
it for you.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

C API Function

@tab

Static Marker

@tab

Notes

@item

@geindex PyDTrace_LINE (C function)
@anchor{howto/instrumentation c PyDTrace_LINE}@anchor{5b8d}
@deffn {C Function} void PyDTrace_LINE (const char *arg0, const char *arg1, int arg2)
@end deffn

@tab

@code{line()}

@tab

@item

@geindex PyDTrace_FUNCTION_ENTRY (C function)
@anchor{howto/instrumentation c PyDTrace_FUNCTION_ENTRY}@anchor{5b8e}
@deffn {C Function} void PyDTrace_FUNCTION_ENTRY (const char *arg0, const char *arg1, int arg2)
@end deffn

@tab

@code{function__entry()}

@tab

@item

@geindex PyDTrace_FUNCTION_RETURN (C function)
@anchor{howto/instrumentation c PyDTrace_FUNCTION_RETURN}@anchor{5b8f}
@deffn {C Function} void PyDTrace_FUNCTION_RETURN (const char *arg0, const char *arg1, int arg2)
@end deffn

@tab

@code{function__return()}

@tab

@item

@geindex PyDTrace_GC_START (C function)
@anchor{howto/instrumentation c PyDTrace_GC_START}@anchor{5b90}
@deffn {C Function} void PyDTrace_GC_START (int arg0)
@end deffn

@tab

@code{gc__start()}

@tab

@item

@geindex PyDTrace_GC_DONE (C function)
@anchor{howto/instrumentation c PyDTrace_GC_DONE}@anchor{5b91}
@deffn {C Function} void PyDTrace_GC_DONE (Py_ssize_t arg0)
@end deffn

@tab

@code{gc__done()}

@tab

@item

@geindex PyDTrace_INSTANCE_NEW_START (C function)
@anchor{howto/instrumentation c PyDTrace_INSTANCE_NEW_START}@anchor{5b92}
@deffn {C Function} void PyDTrace_INSTANCE_NEW_START (int arg0)
@end deffn

@tab

@code{instance__new__start()}

@tab

Not used by Python

@item

@geindex PyDTrace_INSTANCE_NEW_DONE (C function)
@anchor{howto/instrumentation c PyDTrace_INSTANCE_NEW_DONE}@anchor{5b93}
@deffn {C Function} void PyDTrace_INSTANCE_NEW_DONE (int arg0)
@end deffn

@tab

@code{instance__new__done()}

@tab

Not used by Python

@item

@geindex PyDTrace_INSTANCE_DELETE_START (C function)
@anchor{howto/instrumentation c PyDTrace_INSTANCE_DELETE_START}@anchor{5b94}
@deffn {C Function} void PyDTrace_INSTANCE_DELETE_START (int arg0)
@end deffn

@tab

@code{instance__delete__start()}

@tab

Not used by Python

@item

@geindex PyDTrace_INSTANCE_DELETE_DONE (C function)
@anchor{howto/instrumentation c PyDTrace_INSTANCE_DELETE_DONE}@anchor{5b95}
@deffn {C Function} void PyDTrace_INSTANCE_DELETE_DONE (int arg0)
@end deffn

@tab

@code{instance__delete__done()}

@tab

Not used by Python

@item

@geindex PyDTrace_IMPORT_FIND_LOAD_START (C function)
@anchor{howto/instrumentation c PyDTrace_IMPORT_FIND_LOAD_START}@anchor{5b96}
@deffn {C Function} void PyDTrace_IMPORT_FIND_LOAD_START (const char *arg0)
@end deffn

@tab

@code{import__find__load__start()}

@tab

@item

@geindex PyDTrace_IMPORT_FIND_LOAD_DONE (C function)
@anchor{howto/instrumentation c PyDTrace_IMPORT_FIND_LOAD_DONE}@anchor{5b97}
@deffn {C Function} void PyDTrace_IMPORT_FIND_LOAD_DONE (const char *arg0, int arg1)
@end deffn

@tab

@code{import__find__load__done()}

@tab

@item

@geindex PyDTrace_AUDIT (C function)
@anchor{howto/instrumentation c PyDTrace_AUDIT}@anchor{5b98}
@deffn {C Function} void PyDTrace_AUDIT (const char *arg0, void *arg1)
@end deffn

@tab

@code{audit()}

@tab

@end multitable


@node C Probing Checks,,C Entry Points,Available static markers
@anchor{howto/instrumentation c-probing-checks}@anchor{5b99}
@subsubsection C Probing Checks


@geindex PyDTrace_LINE_ENABLED (C function)
@anchor{howto/instrumentation c PyDTrace_LINE_ENABLED}@anchor{5b9a}
@deffn {C Function} int PyDTrace_LINE_ENABLED (void)
@end deffn

@geindex PyDTrace_FUNCTION_ENTRY_ENABLED (C function)
@anchor{howto/instrumentation c PyDTrace_FUNCTION_ENTRY_ENABLED}@anchor{5b9b}
@deffn {C Function} int PyDTrace_FUNCTION_ENTRY_ENABLED (void)
@end deffn

@geindex PyDTrace_FUNCTION_RETURN_ENABLED (C function)
@anchor{howto/instrumentation c PyDTrace_FUNCTION_RETURN_ENABLED}@anchor{5b9c}
@deffn {C Function} int PyDTrace_FUNCTION_RETURN_ENABLED (void)
@end deffn

@geindex PyDTrace_GC_START_ENABLED (C function)
@anchor{howto/instrumentation c PyDTrace_GC_START_ENABLED}@anchor{5b9d}
@deffn {C Function} int PyDTrace_GC_START_ENABLED (void)
@end deffn

@geindex PyDTrace_GC_DONE_ENABLED (C function)
@anchor{howto/instrumentation c PyDTrace_GC_DONE_ENABLED}@anchor{5b9e}
@deffn {C Function} int PyDTrace_GC_DONE_ENABLED (void)
@end deffn

@geindex PyDTrace_INSTANCE_NEW_START_ENABLED (C function)
@anchor{howto/instrumentation c PyDTrace_INSTANCE_NEW_START_ENABLED}@anchor{5b9f}
@deffn {C Function} int PyDTrace_INSTANCE_NEW_START_ENABLED (void)
@end deffn

@geindex PyDTrace_INSTANCE_NEW_DONE_ENABLED (C function)
@anchor{howto/instrumentation c PyDTrace_INSTANCE_NEW_DONE_ENABLED}@anchor{5ba0}
@deffn {C Function} int PyDTrace_INSTANCE_NEW_DONE_ENABLED (void)
@end deffn

@geindex PyDTrace_INSTANCE_DELETE_START_ENABLED (C function)
@anchor{howto/instrumentation c PyDTrace_INSTANCE_DELETE_START_ENABLED}@anchor{5ba1}
@deffn {C Function} int PyDTrace_INSTANCE_DELETE_START_ENABLED (void)
@end deffn

@geindex PyDTrace_INSTANCE_DELETE_DONE_ENABLED (C function)
@anchor{howto/instrumentation c PyDTrace_INSTANCE_DELETE_DONE_ENABLED}@anchor{5ba2}
@deffn {C Function} int PyDTrace_INSTANCE_DELETE_DONE_ENABLED (void)
@end deffn

@geindex PyDTrace_IMPORT_FIND_LOAD_START_ENABLED (C function)
@anchor{howto/instrumentation c PyDTrace_IMPORT_FIND_LOAD_START_ENABLED}@anchor{5ba3}
@deffn {C Function} int PyDTrace_IMPORT_FIND_LOAD_START_ENABLED (void)
@end deffn

@geindex PyDTrace_IMPORT_FIND_LOAD_DONE_ENABLED (C function)
@anchor{howto/instrumentation c PyDTrace_IMPORT_FIND_LOAD_DONE_ENABLED}@anchor{5ba4}
@deffn {C Function} int PyDTrace_IMPORT_FIND_LOAD_DONE_ENABLED (void)
@end deffn

@geindex PyDTrace_AUDIT_ENABLED (C function)
@anchor{howto/instrumentation c PyDTrace_AUDIT_ENABLED}@anchor{5ba5}
@deffn {C Function} int PyDTrace_AUDIT_ENABLED (void)

All calls to @code{PyDTrace} functions must be guarded by a call to one
of these functions. This allows Python to minimize performance impact
when probing is disabled.

On builds without DTrace enabled, these functions do nothing and return
@code{0}.
@end deffn

@node SystemTap Tapsets,Examples<40>,Available static markers,Instrumenting CPython with DTrace and SystemTap
@anchor{howto/instrumentation systemtap-tapsets}@anchor{5ba6}
@subsection SystemTap Tapsets


The higher-level way to use the SystemTap integration is to use a “tapset”:
SystemTap’s equivalent of a library, which hides some of the lower-level
details of the static markers.

Here is a tapset file, based on a non-shared build of CPython:

@example
/*
   Provide a higher-level wrapping around the function__entry and
   function__return markers:
 \*/
probe python.function.entry = process("python").mark("function__entry")
@{
    filename = user_string($arg1);
    funcname = user_string($arg2);
    lineno = $arg3;
    frameptr = $arg4
@}
probe python.function.return = process("python").mark("function__return")
@{
    filename = user_string($arg1);
    funcname = user_string($arg2);
    lineno = $arg3;
    frameptr = $arg4
@}
@end example

If this file is installed in SystemTap’s tapset directory (e.g.
@code{/usr/share/systemtap/tapset}), then these additional probepoints become
available:


@deffn {Object} python.function.entry(str filename, str funcname, int lineno, frameptr)

This probe point indicates that execution of a Python function has begun.
It is only triggered for pure-Python (bytecode) functions.
@end deffn


@deffn {Object} python.function.return(str filename, str funcname, int lineno, frameptr)

This probe point is the converse of @code{python.function.return}, and
indicates that execution of a Python function has ended (either via
@code{return}, or via an exception).  It is only triggered for pure-Python
(bytecode) functions.
@end deffn

@node Examples<40>,,SystemTap Tapsets,Instrumenting CPython with DTrace and SystemTap
@anchor{howto/instrumentation examples}@anchor{5ba7}
@subsection Examples


This SystemTap script uses the tapset above to more cleanly implement the
example given above of tracing the Python function-call hierarchy, without
needing to directly name the static markers:

@example
probe python.function.entry
@{
  printf("%s => %s in %s:%d\n",
         thread_indent(1), funcname, filename, lineno);
@}

probe python.function.return
@{
  printf("%s <= %s in %s:%d\n",
         thread_indent(-1), funcname, filename, lineno);
@}
@end example

The following script uses the tapset above to provide a top-like view of all
running CPython code, showing the top 20 most frequently entered bytecode
frames, each second, across the whole system:

@example
global fn_calls;

probe python.function.entry
@{
    fn_calls[pid(), filename, funcname, lineno] += 1;
@}

probe timer.ms(1000) @{
    printf("\033[2J\033[1;1H") /* clear screen \*/
    printf("%6s %80s %6s %30s %6s\n",
           "PID", "FILENAME", "LINE", "FUNCTION", "CALLS")
    foreach ([pid, filename, funcname, lineno] in fn_calls- limit 20) @{
        printf("%6d %80s %6d %30s %6d\n",
            pid, filename, lineno, funcname,
            fn_calls[pid, filename, funcname, lineno]);
    @}
    delete fn_calls;
@}
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Python support for the Linux perf profiler,Annotations Best Practices,Instrumenting CPython with DTrace and SystemTap,Python HOWTOs
@anchor{howto/perf_profiling doc}@anchor{1af3}@anchor{howto/perf_profiling perf-profiling}@anchor{4af}@anchor{howto/perf_profiling python-support-for-the-linux-perf-profiler}@anchor{5ba8}@anchor{howto/perf_profiling translation-repo}@anchor{5ba9}
@section Python support for the Linux @code{perf} profiler


@*author: 
Pablo Galindo


The Linux perf profiler@footnote{https://perf.wiki.kernel.org}
is a very powerful tool that allows you to profile and obtain
information about the performance of your application.
@code{perf} also has a very vibrant ecosystem of tools
that aid with the analysis of the data that it produces.

The main problem with using the @code{perf} profiler with Python applications is that
@code{perf} only gets information about native symbols, that is, the names of
functions and procedures written in C. This means that the names and file names
of Python functions in your code will not appear in the output of @code{perf}.

Since Python 3.12, the interpreter can run in a special mode that allows Python
functions to appear in the output of the @code{perf} profiler. When this mode is
enabled, the interpreter will interpose a small piece of code compiled on the
fly before the execution of every Python function and it will teach @code{perf} the
relationship between this piece of code and the associated Python function using
@ref{55d2,,perf map files}.

@cartouche
@quotation Note 
Support for the @code{perf} profiler is currently only available for Linux on
select architectures. Check the output of the @code{configure} build step or
check the output of @code{python -m sysconfig | grep HAVE_PERF_TRAMPOLINE}
to see if your system is supported.
@end quotation
@end cartouche

For example, consider the following script:

@example
def foo(n):
    result = 0
    for _ in range(n):
        result += 1
    return result

def bar(n):
    foo(n)

def baz(n):
    bar(n)

if __name__ == "__main__":
    baz(1000000)
@end example

We can run @code{perf} to sample CPU stack traces at 9999 hertz:

@example
$ perf record -F 9999 -g -o perf.data python my_script.py
@end example

Then we can use @code{perf report} to analyze the data:

@example
$ perf report --stdio -n -g

# Children      Self       Samples  Command     Shared Object       Symbol
# ........  ........  ............  ..........  ..................  ..........................................
#
    91.08%     0.00%             0  python.exe  python.exe          [.] _start
            |
            ---_start
            |
                --90.71%--__libc_start_main
                        Py_BytesMain
                        |
                        |--56.88%--pymain_run_python.constprop.0
                        |          |
                        |          |--56.13%--_PyRun_AnyFileObject
                        |          |          _PyRun_SimpleFileObject
                        |          |          |
                        |          |          |--55.02%--run_mod
                        |          |          |          |
                        |          |          |           --54.65%--PyEval_EvalCode
                        |          |          |                     _PyEval_EvalFrameDefault
                        |          |          |                     PyObject_Vectorcall
                        |          |          |                     _PyEval_Vector
                        |          |          |                     _PyEval_EvalFrameDefault
                        |          |          |                     PyObject_Vectorcall
                        |          |          |                     _PyEval_Vector
                        |          |          |                     _PyEval_EvalFrameDefault
                        |          |          |                     PyObject_Vectorcall
                        |          |          |                     _PyEval_Vector
                        |          |          |                     |
                        |          |          |                     |--51.67%--_PyEval_EvalFrameDefault
                        |          |          |                     |          |
                        |          |          |                     |          |--11.52%--_PyLong_Add
                        |          |          |                     |          |          |
                        |          |          |                     |          |          |--2.97%--_PyObject_Malloc
...
@end example

As you can see, the Python functions are not shown in the output, only @code{_PyEval_EvalFrameDefault}
(the function that evaluates the Python bytecode) shows up. Unfortunately that’s not very useful because all Python
functions use the same C function to evaluate bytecode so we cannot know which Python function corresponds to which
bytecode-evaluating function.

Instead, if we run the same experiment with @code{perf} support enabled we get:

@example
$ perf report --stdio -n -g

# Children      Self       Samples  Command     Shared Object       Symbol
# ........  ........  ............  ..........  ..................  .....................................................................
#
    90.58%     0.36%             1  python.exe  python.exe          [.] _start
            |
            ---_start
            |
                --89.86%--__libc_start_main
                        Py_BytesMain
                        |
                        |--55.43%--pymain_run_python.constprop.0
                        |          |
                        |          |--54.71%--_PyRun_AnyFileObject
                        |          |          _PyRun_SimpleFileObject
                        |          |          |
                        |          |          |--53.62%--run_mod
                        |          |          |          |
                        |          |          |           --53.26%--PyEval_EvalCode
                        |          |          |                     py::<module>:/src/script.py
                        |          |          |                     _PyEval_EvalFrameDefault
                        |          |          |                     PyObject_Vectorcall
                        |          |          |                     _PyEval_Vector
                        |          |          |                     py::baz:/src/script.py
                        |          |          |                     _PyEval_EvalFrameDefault
                        |          |          |                     PyObject_Vectorcall
                        |          |          |                     _PyEval_Vector
                        |          |          |                     py::bar:/src/script.py
                        |          |          |                     _PyEval_EvalFrameDefault
                        |          |          |                     PyObject_Vectorcall
                        |          |          |                     _PyEval_Vector
                        |          |          |                     py::foo:/src/script.py
                        |          |          |                     |
                        |          |          |                     |--51.81%--_PyEval_EvalFrameDefault
                        |          |          |                     |          |
                        |          |          |                     |          |--13.77%--_PyLong_Add
                        |          |          |                     |          |          |
                        |          |          |                     |          |          |--3.26%--_PyObject_Malloc
@end example

@menu
* How to enable perf profiling support:: 
* How to obtain the best results:: 
* How to work without frame pointers:: 

@end menu

@node How to enable perf profiling support,How to obtain the best results,,Python support for the Linux perf profiler
@anchor{howto/perf_profiling how-to-enable-perf-profiling-support}@anchor{5baa}
@subsection How to enable @code{perf} profiling support


@code{perf} profiling support can be enabled either from the start using
the environment variable 
@geindex PYTHONPERFSUPPORT
@geindex environment variable; PYTHONPERFSUPPORT
@ref{69a,,PYTHONPERFSUPPORT} or the
@ref{170,,-X perf} option,
or dynamically using @ref{69b,,sys.activate_stack_trampoline()} and
@ref{69c,,sys.deactivate_stack_trampoline()}.

The @code{sys} functions take precedence over the @code{-X} option,
the @code{-X} option takes precedence over the environment variable.

Example, using the environment variable:

@example
$ PYTHONPERFSUPPORT=1 perf record -F 9999 -g -o perf.data python my_script.py
$ perf report -g -i perf.data
@end example

Example, using the @code{-X} option:

@example
$ perf record -F 9999 -g -o perf.data python -X perf my_script.py
$ perf report -g -i perf.data
@end example

Example, using the @ref{df,,sys} APIs in file @code{example.py}:

@example
import sys

sys.activate_stack_trampoline("perf")
do_profiled_stuff()
sys.deactivate_stack_trampoline()

non_profiled_stuff()
@end example

…then:

@example
$ perf record -F 9999 -g -o perf.data python ./example.py
$ perf report -g -i perf.data
@end example

@node How to obtain the best results,How to work without frame pointers,How to enable perf profiling support,Python support for the Linux perf profiler
@anchor{howto/perf_profiling how-to-obtain-the-best-results}@anchor{5bab}
@subsection How to obtain the best results


For best results, Python should be compiled with
@code{CFLAGS="-fno-omit-frame-pointer -mno-omit-leaf-frame-pointer"} as this allows
profilers to unwind using only the frame pointer and not on DWARF debug
information. This is because as the code that is interposed to allow @code{perf}
support is dynamically generated it doesn’t have any DWARF debugging information
available.

You can check if your system has been compiled with this flag by running:

@example
$ python -m sysconfig | grep 'no-omit-frame-pointer'
@end example

If you don’t see any output it means that your interpreter has not been compiled with
frame pointers and therefore it may not be able to show Python functions in the output
of @code{perf}.

@node How to work without frame pointers,,How to obtain the best results,Python support for the Linux perf profiler
@anchor{howto/perf_profiling how-to-work-without-frame-pointers}@anchor{5bac}
@subsection How to work without frame pointers


If you are working with a Python interpreter that has been compiled without
frame pointers, you can still use the @code{perf} profiler, but the overhead will be
a bit higher because Python needs to generate unwinding information for every
Python function call on the fly. Additionally, @code{perf} will take more time to
process the data because it will need to use the DWARF debugging information to
unwind the stack and this is a slow process.

To enable this mode, you can use the environment variable
@geindex PYTHON_PERF_JIT_SUPPORT
@geindex environment variable; PYTHON_PERF_JIT_SUPPORT
@ref{4b0,,PYTHON_PERF_JIT_SUPPORT} or the @ref{170,,-X perf_jit} option,
which will enable the JIT mode for the @code{perf} profiler.

@cartouche
@quotation Note 
Due to a bug in the @code{perf} tool, only @code{perf} versions higher than v6.8
will work with the JIT mode.  The fix was also backported to the v6.7.2
version of the tool.

Note that when checking the version of the @code{perf} tool (which can be done
by running @code{perf version}) you must take into account that some distros
add some custom version numbers including a @code{-} character.  This means
that @code{perf 6.7-3} is not necessarily @code{perf 6.7.3}.
@end quotation
@end cartouche

When using the perf JIT mode, you need an extra step before you can run @code{perf
report}. You need to call the @code{perf inject} command to inject the JIT
information into the @code{perf.data} file.:

@example
$ perf record -F 9999 -g -k 1 --call-graph dwarf -o perf.data python -Xperf_jit my_script.py
$ perf inject -i perf.data --jit --output perf.jit.data
$ perf report -g -i perf.jit.data
@end example

or using the environment variable:

@example
$ PYTHON_PERF_JIT_SUPPORT=1 perf record -F 9999 -g --call-graph dwarf -o perf.data python my_script.py
$ perf inject -i perf.data --jit --output perf.jit.data
$ perf report -g -i perf.jit.data
@end example

@code{perf inject --jit} command will read @code{perf.data},
automatically pick up the perf dump file that Python creates (in
@code{/tmp/perf-$PID.dump}), and then create @code{perf.jit.data} which merges all the
JIT information together. It should also create a lot of @code{jitted-XXXX-N.so}
files in the current directory which are ELF images for all the JIT trampolines
that were created by Python.

@cartouche
@quotation Warning 
When using @code{--call-graph dwarf}, the @code{perf} tool will take
snapshots of the stack of the process being profiled and save the
information in the @code{perf.data} file. By default, the size of the stack dump
is 8192 bytes, but you can change the size by passing it after
a comma like @code{--call-graph dwarf,16384}.

The size of the stack dump is important because if the size is too small
@code{perf} will not be able to unwind the stack and the output will be
incomplete. On the other hand, if the size is too big, then @code{perf} won’t
be able to sample the process as frequently as it would like as the overhead
will be higher.

The stack size is particularly important when profiling Python code compiled
with low optimization levels (like @code{-O0}), as these builds tend to have
larger stack frames. If you are compiling Python with @code{-O0} and not seeing
Python functions in your profiling output, try increasing the stack dump
size to 65528 bytes (the maximum):

@example
$ perf record -F 9999 -g -k 1 --call-graph dwarf,65528 -o perf.data python -Xperf_jit my_script.py
@end example

Different compilation flags can significantly impact stack sizes:


@itemize -

@item 
Builds with @code{-O0} typically have much larger stack frames than those with @code{-O1} or higher

@item 
Adding optimizations (@code{-O1}, @code{-O2}, etc.) typically reduces stack size

@item 
Frame pointers (@code{-fno-omit-frame-pointer}) generally provide more reliable stack unwinding
@end itemize
@end quotation
@end cartouche

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Annotations Best Practices,Isolating Extension Modules,Python support for the Linux perf profiler,Python HOWTOs
@anchor{howto/annotations doc}@anchor{5bad}@anchor{howto/annotations annotations-best-practices}@anchor{5bae}@anchor{howto/annotations annotations-howto}@anchor{9df}@anchor{howto/annotations translation-repo}@anchor{5baf}
@section Annotations Best Practices


@*author: 
Larry Hastings


@subsubheading Abstract



This document is designed to encapsulate the best practices
for working with annotations dicts.  If you write Python code
that examines @code{__annotations__} on Python objects, we
encourage you to follow the guidelines described below.

The document is organized into four sections:
best practices for accessing the annotations of an object
in Python versions 3.10 and newer,
best practices for accessing the annotations of an object
in Python versions 3.9 and older,
other best practices
for @code{__annotations__} that apply to any Python version,
and
quirks of @code{__annotations__}.

Note that this document is specifically about working with
@code{__annotations__}, not uses `for' annotations.
If you’re looking for information on how to use “type hints”
in your code, please see the @ref{10b,,typing} module.

@menu
* Accessing The Annotations Dict Of An Object In Python 3.10 And Newer: Accessing The Annotations Dict Of An Object In Python 3 10 And Newer. 
* Accessing The Annotations Dict Of An Object In Python 3.9 And Older: Accessing The Annotations Dict Of An Object In Python 3 9 And Older. 
* Manually Un-Stringizing Stringized Annotations:: 
* Best Practices For __annotations__ In Any Python Version:: 
* __annotations__ Quirks:: 

@end menu

@node Accessing The Annotations Dict Of An Object In Python 3 10 And Newer,Accessing The Annotations Dict Of An Object In Python 3 9 And Older,,Annotations Best Practices
@anchor{howto/annotations accessing-the-annotations-dict-of-an-object-in-python-3-10-and-newer}@anchor{5bb0}
@subsection Accessing The Annotations Dict Of An Object In Python 3.10 And Newer


Python 3.10 adds a new function to the standard library:
@ref{a1a,,inspect.get_annotations()}.  In Python versions 3.10
through 3.13, calling this function is the best practice for
accessing the annotations dict of any object that supports
annotations.  This function can also “un-stringize”
stringized annotations for you.

In Python 3.14, there is a new @ref{6,,annotationlib} module
with functionality for working with annotations. This
includes a @ref{457,,annotationlib.get_annotations()} function,
which supersedes @ref{a1a,,inspect.get_annotations()}.

If for some reason @ref{a1a,,inspect.get_annotations()} isn’t
viable for your use case, you may access the
@code{__annotations__} data member manually.  Best practice
for this changed in Python 3.10 as well: as of Python 3.10,
@code{o.__annotations__} is guaranteed to `always' work
on Python functions, classes, and modules.  If you’re
certain the object you’re examining is one of these three
`specific' objects, you may simply use @code{o.__annotations__}
to get at the object’s annotations dict.

However, other types of callables–for example,
callables created by @ref{219,,functools.partial()}–may
not have an @code{__annotations__} attribute defined.  When
accessing the @code{__annotations__} of a possibly unknown
object,  best practice in Python versions 3.10 and
newer is to call @ref{dd0,,getattr()} with three arguments,
for example @code{getattr(o, '__annotations__', None)}.

Before Python 3.10, accessing @code{__annotations__} on a class that
defines no annotations but that has a parent class with
annotations would return the parent’s @code{__annotations__}.
In Python 3.10 and newer, the child class’s annotations
will be an empty dict instead.

@node Accessing The Annotations Dict Of An Object In Python 3 9 And Older,Manually Un-Stringizing Stringized Annotations,Accessing The Annotations Dict Of An Object In Python 3 10 And Newer,Annotations Best Practices
@anchor{howto/annotations accessing-the-annotations-dict-of-an-object-in-python-3-9-and-older}@anchor{5bb1}
@subsection Accessing The Annotations Dict Of An Object In Python 3.9 And Older


In Python 3.9 and older, accessing the annotations dict
of an object is much more complicated than in newer versions.
The problem is a design flaw in these older versions of Python,
specifically to do with class annotations.

Best practice for accessing the annotations dict of other
objects–functions, other callables, and modules–is the same
as best practice for 3.10, assuming you aren’t calling
@ref{a1a,,inspect.get_annotations()}: you should use three-argument
@ref{dd0,,getattr()} to access the object’s @code{__annotations__}
attribute.

Unfortunately, this isn’t best practice for classes.  The problem
is that, since @code{__annotations__} is optional on classes, and
because classes can inherit attributes from their base classes,
accessing the @code{__annotations__} attribute of a class may
inadvertently return the annotations dict of a `base class.'
As an example:

@example
class Base:
    a: int = 3
    b: str = 'abc'

class Derived(Base):
    pass

print(Derived.__annotations__)
@end example

This will print the annotations dict from @code{Base}, not
@code{Derived}.

Your code will have to have a separate code path if the object
you’re examining is a class (@code{isinstance(o, type)}).
In that case, best practice relies on an implementation detail
of Python 3.9 and before: if a class has annotations defined,
they are stored in the class’s @ref{e5d,,__dict__} dictionary.  Since
the class may or may not have annotations defined, best practice
is to call the @ref{2078,,get()} method on the class dict.

To put it all together, here is some sample code that safely
accesses the @code{__annotations__} attribute on an arbitrary
object in Python 3.9 and before:

@example
if isinstance(o, type):
    ann = o.__dict__.get('__annotations__', None)
else:
    ann = getattr(o, '__annotations__', None)
@end example

After running this code, @code{ann} should be either a
dictionary or @code{None}.  You’re encouraged to double-check
the type of @code{ann} using @ref{2af,,isinstance()} before further
examination.

Note that some exotic or malformed type objects may not have
a @ref{e5d,,__dict__} attribute, so for extra safety you may also wish
to use @ref{dd0,,getattr()} to access @code{__dict__}.

@node Manually Un-Stringizing Stringized Annotations,Best Practices For __annotations__ In Any Python Version,Accessing The Annotations Dict Of An Object In Python 3 9 And Older,Annotations Best Practices
@anchor{howto/annotations manually-un-stringizing-stringized-annotations}@anchor{5bb2}
@subsection Manually Un-Stringizing Stringized Annotations


In situations where some annotations may be “stringized”,
and you wish to evaluate those strings to produce the
Python values they represent, it really is best to
call @ref{a1a,,inspect.get_annotations()} to do this work
for you.

If you’re using Python 3.9 or older, or if for some reason
you can’t use @ref{a1a,,inspect.get_annotations()}, you’ll need
to duplicate its logic.  You’re encouraged to examine the
implementation of @code{inspect.get_annotations()} in the
current Python version and follow a similar approach.

In a nutshell, if you wish to evaluate a stringized annotation
on an arbitrary object @code{o}:


@itemize *

@item 
If @code{o} is a module, use @code{o.__dict__} as the
@code{globals} when calling @ref{4a4,,eval()}.

@item 
If @code{o} is a class, use @code{sys.modules[o.__module__].__dict__}
as the @code{globals}, and @code{dict(vars(o))} as the @code{locals},
when calling @ref{4a4,,eval()}.

@item 
If @code{o} is a wrapped callable using @ref{1228,,functools.update_wrapper()},
@ref{1163,,functools.wraps()}, or @ref{219,,functools.partial()}, iteratively
unwrap it by accessing either @code{o.__wrapped__} or @code{o.func} as
appropriate, until you have found the root unwrapped function.

@item 
If @code{o} is a callable (but not a class), use
@ref{14df,,o.__globals__} as the globals when calling
@ref{4a4,,eval()}.
@end itemize

However, not all string values used as annotations can
be successfully turned into Python values by @ref{4a4,,eval()}.
String values could theoretically contain any valid string,
and in practice there are valid use cases for type hints that
require annotating with string values that specifically
`can’t' be evaluated.  For example:


@itemize *

@item 
@geindex Python Enhancement Proposals; PEP 604
PEP 604@footnote{https://peps.python.org/pep-0604/} union types using @code{|}, before support for this
was added to Python 3.10.

@item 
Definitions that aren’t needed at runtime, only imported
when @ref{ef6,,typing.TYPE_CHECKING} is true.
@end itemize

If @ref{4a4,,eval()} attempts to evaluate such values, it will
fail and raise an exception.  So, when designing a library
API that works with annotations, it’s recommended to only
attempt to evaluate string values when explicitly requested
to by the caller.

@node Best Practices For __annotations__ In Any Python Version,__annotations__ Quirks,Manually Un-Stringizing Stringized Annotations,Annotations Best Practices
@anchor{howto/annotations best-practices-for-annotations-in-any-python-version}@anchor{5bb3}
@subsection Best Practices For @code{__annotations__} In Any Python Version



@itemize *

@item 
You should avoid assigning to the @code{__annotations__} member
of objects directly.  Let Python manage setting @code{__annotations__}.

@item 
If you do assign directly to the @code{__annotations__} member
of an object, you should always set it to a @code{dict} object.

@item 
You should avoid accessing @code{__annotations__} directly on any object.
Instead, use @ref{457,,annotationlib.get_annotations()} (Python 3.14+)
or @ref{a1a,,inspect.get_annotations()} (Python 3.10+).

@item 
If you do directly access the @code{__annotations__} member
of an object, you should ensure that it’s a
dictionary before attempting to examine its contents.

@item 
You should avoid modifying @code{__annotations__} dicts.

@item 
You should avoid deleting the @code{__annotations__} attribute
of an object.
@end itemize

@node __annotations__ Quirks,,Best Practices For __annotations__ In Any Python Version,Annotations Best Practices
@anchor{howto/annotations annotations-quirks}@anchor{5bb4}
@subsection @code{__annotations__} Quirks


In all versions of Python 3, function
objects lazy-create an annotations dict if no annotations
are defined on that object.  You can delete the @code{__annotations__}
attribute using @code{del fn.__annotations__}, but if you then
access @code{fn.__annotations__} the object will create a new empty dict
that it will store and return as its annotations.  Deleting the
annotations on a function before it has lazily created its annotations
dict will throw an @code{AttributeError}; using @code{del fn.__annotations__}
twice in a row is guaranteed to always throw an @code{AttributeError}.

Everything in the above paragraph also applies to class and module
objects in Python 3.10 and newer.

In all versions of Python 3, you can set @code{__annotations__}
on a function object to @code{None}.  However, subsequently
accessing the annotations on that object using @code{fn.__annotations__}
will lazy-create an empty dictionary as per the first paragraph of
this section.  This is `not' true of modules and classes, in any Python
version; those objects permit setting @code{__annotations__} to any
Python value, and will retain whatever value is set.

If Python stringizes your annotations for you
(using @code{from __future__ import annotations}), and you
specify a string as an annotation, the string will
itself be quoted.  In effect the annotation is quoted
`twice.'  For example:

@example
from __future__ import annotations
def foo(a: "str"): pass

print(foo.__annotations__)
@end example

This prints @code{@{'a': "'str'"@}}.  This shouldn’t really be considered
a “quirk”; it’s mentioned here simply because it might be surprising.

If you use a class with a custom metaclass and access @code{__annotations__}
on the class, you may observe unexpected behavior; see
@geindex Python Enhancement Proposals; PEP 749#pep749-metaclasses
749@footnote{https://peps.python.org/pep-0749/#pep749-metaclasses} for some examples. You can avoid these
quirks by using @ref{457,,annotationlib.get_annotations()} on Python 3.14+ or
@ref{a1a,,inspect.get_annotations()} on Python 3.10+. On earlier versions of
Python, you can avoid these bugs by accessing the annotations from the
class’s @ref{e5d,,__dict__}
(for example, @code{cls.__dict__.get('__annotations__', None)}).

In some versions of Python, instances of classes may have an @code{__annotations__}
attribute. However, this is not supported functionality. If you need the
annotations of an instance, you can use @ref{f4a,,type()} to access its class
(for example, @code{annotationlib.get_annotations(type(myinstance))} on Python 3.14+).

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Isolating Extension Modules,timer file descriptor HOWTO,Annotations Best Practices,Python HOWTOs
@anchor{howto/isolating-extensions doc}@anchor{5bb5}@anchor{howto/isolating-extensions isolating-extension-modules}@anchor{5bb6}@anchor{howto/isolating-extensions isolating-extensions-howto}@anchor{167}@anchor{howto/isolating-extensions translation-repo}@anchor{5bb7}
@section Isolating Extension Modules


@subsubheading Abstract



Traditionally, state belonging to Python extension modules was kept in C
@code{static} variables, which have process-wide scope. This document
describes problems of such per-process state and shows a safer way:
per-module state.

The document also describes how to switch to per-module state where
possible. This transition involves allocating space for that state, potentially
switching from static types to heap types, and—perhaps most
importantly—accessing per-module state from code.

@menu
* Who should read this:: 
* Background: Background<2>. 
* Making Modules Safe with Multiple Interpreters:: 
* Heap Types: Heap Types<2>. 
* Open Issues:: 

@end menu

@node Who should read this,Background<2>,,Isolating Extension Modules
@anchor{howto/isolating-extensions who-should-read-this}@anchor{5bb8}
@subsection Who should read this


This guide is written for maintainers of @ref{2000,,C-API} extensions
who would like to make that extension safer to use in applications where
Python itself is used as a library.

@node Background<2>,Making Modules Safe with Multiple Interpreters,Who should read this,Isolating Extension Modules
@anchor{howto/isolating-extensions background}@anchor{5bb9}
@subsection Background


An `interpreter' is the context in which Python code runs. It contains
configuration (e.g. the import path) and runtime state (e.g. the set of
imported modules).

Python supports running multiple interpreters in one process. There are
two cases to think about—users may run interpreters:


@itemize -

@item 
in sequence, with several @ref{5493,,Py_InitializeEx()}/@ref{f17,,Py_FinalizeEx()}
cycles, and

@item 
in parallel, managing “sub-interpreters” using
@ref{1b75,,Py_NewInterpreter()}/@ref{188e,,Py_EndInterpreter()}.
@end itemize

Both cases (and combinations of them) would be most useful when
embedding Python within a library. Libraries generally shouldn’t make
assumptions about the application that uses them, which include
assuming a process-wide “main Python interpreter”.

Historically, Python extension modules don’t handle this use case well.
Many extension modules (and even some stdlib modules) use `per-process'
global state, because C @code{static} variables are extremely easy to use.
Thus, data that should be specific to an interpreter ends up being shared
between interpreters. Unless the extension developer is careful, it is very
easy to introduce edge cases that lead to crashes when a module is loaded in
more than one interpreter in the same process.

Unfortunately, `per-interpreter' state is not easy to achieve. Extension
authors tend to not keep multiple interpreters in mind when developing,
and it is currently cumbersome to test the behavior.

@menu
* Enter Per-Module State:: 
* Isolated Module Objects:: 
* Surprising Edge Cases:: 

@end menu

@node Enter Per-Module State,Isolated Module Objects,,Background<2>
@anchor{howto/isolating-extensions enter-per-module-state}@anchor{5bba}
@subsubsection Enter Per-Module State


Instead of focusing on per-interpreter state, Python’s C API is evolving
to better support the more granular `per-module' state.
This means that C-level data should be attached to a `module object'.
Each interpreter creates its own module object, keeping the data separate.
For testing the isolation, multiple module objects corresponding to a single
extension can even be loaded in a single interpreter.

Per-module state provides an easy way to think about lifetime and
resource ownership: the extension module will initialize when a
module object is created, and clean up when it’s freed. In this regard,
a module is just like any other @ref{5df,,PyObject}*; there are no “on
interpreter shutdown” hooks to think—or forget—about.

Note that there are use cases for different kinds of “globals”:
per-process, per-interpreter, per-thread or per-task state.
With per-module state as the default, these are still possible,
but you should treat them as exceptional cases:
if you need them, you should give them additional care and testing.
(Note that this guide does not cover them.)

@node Isolated Module Objects,Surprising Edge Cases,Enter Per-Module State,Background<2>
@anchor{howto/isolating-extensions isolated-module-objects}@anchor{5bbb}
@subsubsection Isolated Module Objects


The key point to keep in mind when developing an extension module is
that several module objects can be created from a single shared library.
For example:

@example
>>> import sys
>>> import binascii
>>> old_binascii = binascii
>>> del sys.modules['binascii']
>>> import binascii  # create a new module object
>>> old_binascii == binascii
False
@end example

As a rule of thumb, the two modules should be completely independent.
All objects and state specific to the module should be encapsulated
within the module object, not shared with other module objects, and
cleaned up when the module object is deallocated.
Since this just is a rule of thumb, exceptions are possible
(see @ref{5bbc,,Managing Global State}), but they will need more
thought and attention to edge cases.

While some modules could do with less stringent restrictions, isolated
modules make it easier to set clear expectations and guidelines that
work across a variety of use cases.

@node Surprising Edge Cases,,Isolated Module Objects,Background<2>
@anchor{howto/isolating-extensions surprising-edge-cases}@anchor{5bbd}
@subsubsection Surprising Edge Cases


Note that isolated modules do create some surprising edge cases. Most
notably, each module object will typically not share its classes and
exceptions with other similar modules. Continuing from the
@ref{5bbb,,example above},
note that @code{old_binascii.Error} and @code{binascii.Error} are
separate objects. In the following code, the exception is `not' caught:

@example
>>> old_binascii.Error == binascii.Error
False
>>> try:
...     old_binascii.unhexlify(b'qwertyuiop')
... except binascii.Error:
...     print('boo')
...
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
binascii.Error: Non-hexadecimal digit found
@end example

This is expected. Notice that pure-Python modules behave the same way:
it is a part of how Python works.

The goal is to make extension modules safe at the C level, not to make
hacks behave intuitively. Mutating @code{sys.modules} “manually” counts
as a hack.

@node Making Modules Safe with Multiple Interpreters,Heap Types<2>,Background<2>,Isolating Extension Modules
@anchor{howto/isolating-extensions making-modules-safe-with-multiple-interpreters}@anchor{5bbe}
@subsection Making Modules Safe with Multiple Interpreters


@menu
* Managing Global State:: 
* Managing Per-Module State:: 
* Opt-Out; Limiting to One Module Object per Process: Opt-Out Limiting to One Module Object per Process. 
* Module State Access from Functions:: 

@end menu

@node Managing Global State,Managing Per-Module State,,Making Modules Safe with Multiple Interpreters
@anchor{howto/isolating-extensions managing-global-state}@anchor{5bbc}
@subsubsection Managing Global State


Sometimes, the state associated with a Python module is not specific to that module, but
to the entire process (or something else “more global” than a module).
For example:


@itemize -

@item 
The @code{readline} module manages `the' terminal.

@item 
A module running on a circuit board wants to control `the' on-board
LED.
@end itemize

In these cases, the Python module should provide `access' to the global
state, rather than `own' it. If possible, write the module so that
multiple copies of it can access the state independently (along with
other libraries, whether for Python or other languages). If that is not
possible, consider explicit locking.

If it is necessary to use process-global state, the simplest way to
avoid issues with multiple interpreters is to explicitly prevent a
module from being loaded more than once per process—see
@ref{5570,,Opt-Out; Limiting to One Module Object per Process}.

@node Managing Per-Module State,Opt-Out Limiting to One Module Object per Process,Managing Global State,Making Modules Safe with Multiple Interpreters
@anchor{howto/isolating-extensions managing-per-module-state}@anchor{5bbf}
@subsubsection Managing Per-Module State


To use per-module state, use
@ref{5573,,multi-phase extension module initialization}.
This signals that your module supports multiple interpreters correctly.

Set @code{PyModuleDef.m_size} to a positive number to request that many
bytes of storage local to the module. Usually, this will be set to the
size of some module-specific @code{struct}, which can store all of the
module’s C-level state. In particular, it is where you should put
pointers to classes (including exceptions, but excluding static types)
and settings (e.g. @code{csv}’s @ref{1bd5,,field_size_limit})
which the C code needs to function.

@cartouche
@quotation Note 
Another option is to store state in the module’s @code{__dict__},
but you must avoid crashing when users modify @code{__dict__} from
Python code. This usually means error- and type-checking at the C level,
which is easy to get wrong and hard to test sufficiently.

However, if module state is not needed in C code, storing it in
@code{__dict__} only is a good idea.
@end quotation
@end cartouche

If the module state includes @code{PyObject} pointers, the module object
must hold references to those objects and implement the module-level hooks
@code{m_traverse}, @code{m_clear} and @code{m_free}. These work like
@code{tp_traverse}, @code{tp_clear} and @code{tp_free} of a class. Adding them will
require some work and make the code longer; this is the price for
modules which can be unloaded cleanly.

An example of a module with per-module state is currently available as
xxlimited@footnote{https://github.com/python/cpython/blob/master/Modules/xxlimited.c};
example module initialization shown at the bottom of the file.

@node Opt-Out Limiting to One Module Object per Process,Module State Access from Functions,Managing Per-Module State,Making Modules Safe with Multiple Interpreters
@anchor{howto/isolating-extensions isolating-extensions-optout}@anchor{5570}@anchor{howto/isolating-extensions opt-out-limiting-to-one-module-object-per-process}@anchor{5bc0}
@subsubsection Opt-Out: Limiting to One Module Object per Process


A non-negative @code{PyModuleDef.m_size} signals that a module supports
multiple interpreters correctly. If this is not yet the case for your
module, you can explicitly make your module loadable only once per
process. For example:

@example
// A process-wide flag
static int loaded = 0;

// Mutex to provide thread safety (only needed for free-threaded Python)
static PyMutex modinit_mutex = @{0@};

static int
exec_module(PyObject* module)
@{
    PyMutex_Lock(&modinit_mutex);
    if (loaded) @{
        PyMutex_Unlock(&modinit_mutex);
        PyErr_SetString(PyExc_ImportError,
                        "cannot load module more than once per process");
        return -1;
    @}
    loaded = 1;
    PyMutex_Unlock(&modinit_mutex);
    // ... rest of initialization
@}
@end example

If your module’s @ref{b78,,PyModuleDef.m_clear} function is able to prepare
for future re-initialization, it should clear the @code{loaded} flag.
In this case, your module won’t support multiple instances existing
`concurrently', but it will, for example, support being loaded after
Python runtime shutdown (@ref{f17,,Py_FinalizeEx()}) and re-initialization
(@ref{45e,,Py_Initialize()}).

@node Module State Access from Functions,,Opt-Out Limiting to One Module Object per Process,Making Modules Safe with Multiple Interpreters
@anchor{howto/isolating-extensions module-state-access-from-functions}@anchor{5bc1}
@subsubsection Module State Access from Functions


Accessing the state from module-level functions is straightforward.
Functions get the module object as their first argument; for extracting
the state, you can use @code{PyModule_GetState}:

@example
static PyObject *
func(PyObject *module, PyObject *args)
@{
    my_struct *state = (my_struct*)PyModule_GetState(module);
    if (state == NULL) @{
        return NULL;
    @}
    // ... rest of logic
@}
@end example

@cartouche
@quotation Note 
@code{PyModule_GetState} may return @code{NULL} without setting an
exception if there is no module state, i.e. @code{PyModuleDef.m_size} was
zero. In your own module, you’re in control of @code{m_size}, so this is
easy to prevent.
@end quotation
@end cartouche

@node Heap Types<2>,Open Issues,Making Modules Safe with Multiple Interpreters,Isolating Extension Modules
@anchor{howto/isolating-extensions heap-types}@anchor{5bc2}
@subsection Heap Types


Traditionally, types defined in C code are `static'; that is,
@code{static PyTypeObject} structures defined directly in code and
initialized using @code{PyType_Ready()}.

Such types are necessarily shared across the process. Sharing them
between module objects requires paying attention to any state they own
or access. To limit the possible issues, static types are immutable at
the Python level: for example, you can’t set @code{str.myattribute = 123}.

`CPython implementation detail:' Sharing truly immutable objects between interpreters is fine,
as long as they don’t provide access to mutable objects.
However, in CPython, every Python object has a mutable implementation
detail: the reference count. Changes to the refcount are guarded by the GIL.
Thus, code that shares any Python objects across interpreters implicitly
depends on CPython’s current, process-wide GIL.

Because they are immutable and process-global, static types cannot access
“their” module state.
If any method of such a type requires access to module state,
the type must be converted to a `heap-allocated type', or `heap type'
for short. These correspond more closely to classes created by Python’s
@code{class} statement.

For new modules, using heap types by default is a good rule of thumb.

@menu
* Changing Static Types to Heap Types:: 
* Defining Heap Types:: 
* Garbage-Collection Protocol:: 
* Module State Access from Classes:: 
* Module State Access from Regular Methods:: 
* Module State Access from Slot Methods@comma{} Getters and Setters: Module State Access from Slot Methods Getters and Setters. 
* Lifetime of the Module State:: 

@end menu

@node Changing Static Types to Heap Types,Defining Heap Types,,Heap Types<2>
@anchor{howto/isolating-extensions changing-static-types-to-heap-types}@anchor{5bc3}
@subsubsection Changing Static Types to Heap Types


Static types can be converted to heap types, but note that
the heap type API was not designed for “lossless” conversion
from static types—that is, creating a type that works exactly like a given
static type.
So, when rewriting the class definition in a new API,
you are likely to unintentionally change a few details (e.g. pickleability
or inherited slots).
Always test the details that are important to you.

Watch out for the following two points in particular (but note that this is not
a comprehensive list):


@itemize *

@item 
Unlike static types, heap type objects are mutable by default.
Use the @ref{3cd,,Py_TPFLAGS_IMMUTABLETYPE} flag to prevent mutability.

@item 
Heap types inherit @ref{7a0,,tp_new} by default,
so it may become possible to instantiate them from Python code.
You can prevent this with the @ref{7a3,,Py_TPFLAGS_DISALLOW_INSTANTIATION} flag.
@end itemize

@node Defining Heap Types,Garbage-Collection Protocol,Changing Static Types to Heap Types,Heap Types<2>
@anchor{howto/isolating-extensions defining-heap-types}@anchor{5bc4}
@subsubsection Defining Heap Types


Heap types can be created by filling a @ref{1acf,,PyType_Spec} structure, a
description or “blueprint” of a class, and calling
@ref{774,,PyType_FromModuleAndSpec()} to construct a new class object.

@cartouche
@quotation Note 
Other functions, like @ref{79e,,PyType_FromSpec()}, can also create
heap types, but @ref{774,,PyType_FromModuleAndSpec()} associates the module
with the class, allowing access to the module state from methods.
@end quotation
@end cartouche

The class should generally be stored in `both' the module state (for
safe access from C) and the module’s @code{__dict__} (for access from
Python code).

@node Garbage-Collection Protocol,Module State Access from Classes,Defining Heap Types,Heap Types<2>
@anchor{howto/isolating-extensions garbage-collection-protocol}@anchor{5bc5}
@subsubsection Garbage-Collection Protocol


Instances of heap types hold a reference to their type.
This ensures that the type isn’t destroyed before all its instances are,
but may result in reference cycles that need to be broken by the
garbage collector.

To avoid memory leaks, instances of heap types must implement the
garbage collection protocol.
That is, heap types should:


@itemize -

@item 
Have the @ref{986,,Py_TPFLAGS_HAVE_GC} flag.

@item 
Define a traverse function using @ref{54fd,,Py_tp_traverse}, which
visits the type (e.g. using @code{Py_VISIT(Py_TYPE(self))}).
@end itemize

Please refer to the documentation of
@ref{986,,Py_TPFLAGS_HAVE_GC} and @ref{987,,tp_traverse}
for additional considerations.

The API for defining heap types grew organically, leaving it
somewhat awkward to use in its current state.
The following sections will guide you through common issues.

@menu
* tp_traverse in Python 3.8 and lower: tp_traverse in Python 3 8 and lower. 
* Delegating tp_traverse:: 
* Defining tp_dealloc:: 
* Not overriding tp_free:: 
* Avoiding PyObject_New:: 

@end menu

@node tp_traverse in Python 3 8 and lower,Delegating tp_traverse,,Garbage-Collection Protocol
@anchor{howto/isolating-extensions tp-traverse-in-python-3-8-and-lower}@anchor{5bc6}
@subsubsection @code{tp_traverse} in Python 3.8 and lower


The requirement to visit the type from @code{tp_traverse} was added in Python 3.9.
If you support Python 3.8 and lower, the traverse function must `not'
visit the type, so it must be more complicated:

@example
static int my_traverse(PyObject *self, visitproc visit, void *arg)
@{
    if (Py_Version >= 0x03090000) @{
        Py_VISIT(Py_TYPE(self));
    @}
    return 0;
@}
@end example

Unfortunately, @ref{37f,,Py_Version} was only added in Python 3.11.
As a replacement, use:


@itemize *

@item 
@ref{380,,PY_VERSION_HEX}, if not using the stable ABI, or

@item 
@ref{8b1,,sys.version_info} (via @ref{62a,,PySys_GetObject()} and
@ref{3bf,,PyArg_ParseTuple()}).
@end itemize

@node Delegating tp_traverse,Defining tp_dealloc,tp_traverse in Python 3 8 and lower,Garbage-Collection Protocol
@anchor{howto/isolating-extensions delegating-tp-traverse}@anchor{5bc7}
@subsubsection Delegating @code{tp_traverse}


If your traverse function delegates to the @ref{987,,tp_traverse}
of its base class (or another type), ensure that @code{Py_TYPE(self)} is visited
only once.
Note that only heap type are expected to visit the type in @code{tp_traverse}.

For example, if your traverse function includes:

@example
base->tp_traverse(self, visit, arg)
@end example

…and @code{base} may be a static type, then it should also include:

@example
if (base->tp_flags & Py_TPFLAGS_HEAPTYPE) @{
    // a heap type's tp_traverse already visited Py_TYPE(self)
@} else @{
    if (Py_Version >= 0x03090000) @{
        Py_VISIT(Py_TYPE(self));
    @}
@}
@end example

It is not necessary to handle the type’s reference count in
@ref{7a0,,tp_new} and @ref{5242,,tp_clear}.

@node Defining tp_dealloc,Not overriding tp_free,Delegating tp_traverse,Garbage-Collection Protocol
@anchor{howto/isolating-extensions defining-tp-dealloc}@anchor{5bc8}
@subsubsection Defining @code{tp_dealloc}


If your type has a custom @ref{521c,,tp_dealloc} function,
it needs to:


@itemize -

@item 
call @ref{1711,,PyObject_GC_UnTrack()} before any fields are invalidated, and

@item 
decrement the reference count of the type.
@end itemize

To keep the type valid while @code{tp_free} is called, the type’s refcount needs
to be decremented `after' the instance is deallocated. For example:

@example
static void my_dealloc(PyObject *self)
@{
    PyObject_GC_UnTrack(self);
    ...
    PyTypeObject *type = Py_TYPE(self);
    type->tp_free(self);
    Py_DECREF(type);
@}
@end example

The default @code{tp_dealloc} function does this, so
if your type does `not' override
@code{tp_dealloc} you don’t need to add it.

@node Not overriding tp_free,Avoiding PyObject_New,Defining tp_dealloc,Garbage-Collection Protocol
@anchor{howto/isolating-extensions not-overriding-tp-free}@anchor{5bc9}
@subsubsection Not overriding @code{tp_free}


The @ref{522f,,tp_free} slot of a heap type must be set to
@ref{170f,,PyObject_GC_Del()}.
This is the default; do not override it.

@node Avoiding PyObject_New,,Not overriding tp_free,Garbage-Collection Protocol
@anchor{howto/isolating-extensions avoiding-pyobject-new}@anchor{5bca}
@subsubsection Avoiding @code{PyObject_New}


GC-tracked objects need to be allocated using GC-aware functions.

If you use @ref{b82,,PyObject_New()} or @ref{b83,,PyObject_NewVar()}:


@itemize -

@item 
Get and call type’s @ref{5230,,tp_alloc} slot, if possible.
That is, replace @code{TYPE *o = PyObject_New(TYPE, typeobj)} with:

@example
TYPE *o = typeobj->tp_alloc(typeobj, 0);
@end example

Replace @code{o = PyObject_NewVar(TYPE, typeobj, size)} with the same,
but use size instead of the 0.

@item 
If the above is not possible (e.g. inside a custom @code{tp_alloc}),
call @ref{c9f,,PyObject_GC_New()} or @ref{ca0,,PyObject_GC_NewVar()}:

@example
TYPE *o = PyObject_GC_New(TYPE, typeobj);

TYPE *o = PyObject_GC_NewVar(TYPE, typeobj, size);
@end example
@end itemize

@node Module State Access from Classes,Module State Access from Regular Methods,Garbage-Collection Protocol,Heap Types<2>
@anchor{howto/isolating-extensions module-state-access-from-classes}@anchor{5bcb}
@subsubsection Module State Access from Classes


If you have a type object defined with @ref{774,,PyType_FromModuleAndSpec()},
you can call @ref{b6c,,PyType_GetModule()} to get the associated module, and then
@ref{b7d,,PyModule_GetState()} to get the module’s state.

To save a some tedious error-handling boilerplate code, you can combine
these two steps with @ref{b6d,,PyType_GetModuleState()}, resulting in:

@example
my_struct *state = (my_struct*)PyType_GetModuleState(type);
if (state == NULL) @{
    return NULL;
@}
@end example

@node Module State Access from Regular Methods,Module State Access from Slot Methods Getters and Setters,Module State Access from Classes,Heap Types<2>
@anchor{howto/isolating-extensions module-state-access-from-regular-methods}@anchor{5bcc}
@subsubsection Module State Access from Regular Methods


Accessing the module-level state from methods of a class is somewhat more
complicated, but is possible thanks to API introduced in Python 3.9.
To get the state, you need to first get the `defining class', and then
get the module state from it.

The largest roadblock is getting `the class a method was defined in', or
that method’s “defining class” for short. The defining class can have a
reference to the module it is part of.

Do not confuse the defining class with @code{Py_TYPE(self)}. If the method
is called on a `subclass' of your type, @code{Py_TYPE(self)} will refer to
that subclass, which may be defined in different module than yours.

@cartouche
@quotation Note 
The following Python code can illustrate the concept.
@code{Base.get_defining_class} returns @code{Base} even
if @code{type(self) == Sub}:

@example
class Base:
    def get_type_of_self(self):
        return type(self)

    def get_defining_class(self):
        return __class__

class Sub(Base):
    pass
@end example
@end quotation
@end cartouche

For a method to get its “defining class”, it must use the
@ref{1a50,,METH_METHOD | METH_FASTCALL | METH_KEYWORDS}
@ref{16e3,,calling convention}
and the corresponding @ref{96d,,PyCMethod} signature:

@example
PyObject *PyCMethod(
    PyObject *self,               // object the method was called on
    PyTypeObject *defining_class, // defining class
    PyObject *const *args,        // C array of arguments
    Py_ssize_t nargs,             // length of "args"
    PyObject *kwnames)            // NULL, or dict of keyword arguments
@end example

Once you have the defining class, call @ref{b6d,,PyType_GetModuleState()} to get
the state of its associated module.

For example:

@example
static PyObject *
example_method(PyObject *self,
        PyTypeObject *defining_class,
        PyObject *const *args,
        Py_ssize_t nargs,
        PyObject *kwnames)
@{
    my_struct *state = (my_struct*)PyType_GetModuleState(defining_class);
    if (state == NULL) @{
        return NULL;
    @}
    ... // rest of logic
@}

PyDoc_STRVAR(example_method_doc, "...");

static PyMethodDef my_methods[] = @{
    @{"example_method",
      (PyCFunction)(void(*)(void))example_method,
      METH_METHOD|METH_FASTCALL|METH_KEYWORDS,
      example_method_doc@}
    @{NULL@},
@}
@end example

@node Module State Access from Slot Methods Getters and Setters,Lifetime of the Module State,Module State Access from Regular Methods,Heap Types<2>
@anchor{howto/isolating-extensions module-state-access-from-slot-methods-getters-and-setters}@anchor{5bcd}
@subsubsection Module State Access from Slot Methods, Getters and Setters


@cartouche
@quotation Note 
This is new in Python 3.11.

@c After adding to limited API:
@c 
@c If you use the :ref:`limited API <limited-c-api>`,
@c you must update ``Py_LIMITED_API`` to ``0x030b0000``, losing ABI
@c compatibility with earlier versions.
@end quotation
@end cartouche

Slot methods—the fast C equivalents for special methods, such as
@ref{5642,,nb_add} for @ref{2424,,__add__} or
@ref{7a0,,tp_new} for initialization—have a very simple API that
doesn’t allow passing in the defining class, unlike with @ref{96d,,PyCMethod}.
The same goes for getters and setters defined with
@ref{db8,,PyGetSetDef}.

To access the module state in these cases, use the
@ref{635,,PyType_GetModuleByDef()} function, and pass in the module definition.
Once you have the module, call @ref{b7d,,PyModule_GetState()}
to get the state:

@example
PyObject *module = PyType_GetModuleByDef(Py_TYPE(self), &module_def);
my_struct *state = (my_struct*)PyModule_GetState(module);
if (state == NULL) @{
    return NULL;
@}
@end example

@code{PyType_GetModuleByDef()} works by searching the
@ref{2627,,method resolution order} (i.e. all superclasses) for the first
superclass that has a corresponding module.

@cartouche
@quotation Note 
In very exotic cases (inheritance chains spanning multiple modules
created from the same definition), @code{PyType_GetModuleByDef()} might not
return the module of the true defining class. However, it will always
return a module with the same definition, ensuring a compatible
C memory layout.
@end quotation
@end cartouche

@node Lifetime of the Module State,,Module State Access from Slot Methods Getters and Setters,Heap Types<2>
@anchor{howto/isolating-extensions lifetime-of-the-module-state}@anchor{5bce}
@subsubsection Lifetime of the Module State


When a module object is garbage-collected, its module state is freed.
For each pointer to (a part of) the module state, you must hold a reference
to the module object.

Usually this is not an issue, because types created with
@ref{774,,PyType_FromModuleAndSpec()}, and their instances, hold a reference
to the module.
However, you must be careful in reference counting when you reference
module state from other places, such as callbacks for external
libraries.

@node Open Issues,,Heap Types<2>,Isolating Extension Modules
@anchor{howto/isolating-extensions open-issues}@anchor{5bcf}
@subsection Open Issues


Several issues around per-module state and heap types are still open.

Discussions about improving the situation are best held on the discuss forum under c-api tag@footnote{https://discuss.python.org/c/core-dev/c-api/30}.

@menu
* Per-Class Scope:: 
* Lossless Conversion to Heap Types:: 

@end menu

@node Per-Class Scope,Lossless Conversion to Heap Types,,Open Issues
@anchor{howto/isolating-extensions per-class-scope}@anchor{5bd0}
@subsubsection Per-Class Scope


It is currently (as of Python 3.11) not possible to attach state to individual
`types' without relying on CPython implementation details (which may change
in the future—perhaps, ironically, to allow a proper solution for
per-class scope).

@node Lossless Conversion to Heap Types,,Per-Class Scope,Open Issues
@anchor{howto/isolating-extensions lossless-conversion-to-heap-types}@anchor{5bd1}
@subsubsection Lossless Conversion to Heap Types


The heap type API was not designed for “lossless” conversion from static types;
that is, creating a type that works exactly like a given static type.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node timer file descriptor HOWTO,The Python 2 3 Method Resolution Order,Isolating Extension Modules,Python HOWTOs
@anchor{howto/timerfd doc}@anchor{5bd2}@anchor{howto/timerfd timer-file-descriptor-howto}@anchor{5bd3}@anchor{howto/timerfd timerfd-howto}@anchor{5bd4}@anchor{howto/timerfd translation-repo}@anchor{5bd5}
@section timer file descriptor HOWTO


@*Release: 
1.13


This HOWTO discusses Python’s support for the linux timer file descriptor.

@menu
* Examples: Examples<41>. 

@end menu

@node Examples<41>,,,timer file descriptor HOWTO
@anchor{howto/timerfd examples}@anchor{5bd6}
@subsection Examples


The following example shows how to use a timer file descriptor
to execute a function twice a second:

@example
# Practical scripts should use really use a non-blocking timer,
# we use a blocking timer here for simplicity.
import os, time

# Create the timer file descriptor
fd = os.timerfd_create(time.CLOCK_REALTIME)

# Start the timer in 1 second, with an interval of half a second
os.timerfd_settime(fd, initial=1, interval=0.5)

try:
    # Process timer events four times.
    for _ in range(4):
        # read() will block until the timer expires
        _ = os.read(fd, 8)
        print("Timer expired")
finally:
    # Remember to close the timer file descriptor!
    os.close(fd)
@end example

To avoid the precision loss caused by the @ref{197,,float} type,
timer file descriptors allow specifying initial expiration and interval
in integer nanoseconds with @code{_ns} variants of the functions.

This example shows how @ref{119a,,epoll()} can be used with timer file
descriptors to wait until the file descriptor is ready for reading:

@example
import os, time, select, socket, sys

# Create an epoll object
ep = select.epoll()

# In this example, use loopback address to send "stop" command to the server.
#
# $ telnet 127.0.0.1 1234
# Trying 127.0.0.1...
# Connected to 127.0.0.1.
# Escape character is '^]'.
# stop
# Connection closed by foreign host.
#
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(("127.0.0.1", 1234))
sock.setblocking(False)
sock.listen(1)
ep.register(sock, select.EPOLLIN)

# Create timer file descriptors in non-blocking mode.
num = 3
fds = []
for _ in range(num):
    fd = os.timerfd_create(time.CLOCK_REALTIME, flags=os.TFD_NONBLOCK)
    fds.append(fd)
    # Register the timer file descriptor for read events
    ep.register(fd, select.EPOLLIN)

# Start the timer with os.timerfd_settime_ns() in nanoseconds.
# Timer 1 fires every 0.25 seconds; timer 2 every 0.5 seconds; etc
for i, fd in enumerate(fds, start=1):
    one_sec_in_nsec = 10**9
    i = i * one_sec_in_nsec
    os.timerfd_settime_ns(fd, initial=i//4, interval=i//4)

timeout = 3
try:
    conn = None
    is_active = True
    while is_active:
        # Wait for the timer to expire for 3 seconds.
        # epoll.poll() returns a list of (fd, event) pairs.
        # fd is a file descriptor.
        # sock and conn[=returned value of socket.accept()] are socket objects, not file descriptors.
        # So use sock.fileno() and conn.fileno() to get the file descriptors.
        events = ep.poll(timeout)

        # If more than one timer file descriptors are ready for reading at once,
        # epoll.poll() returns a list of (fd, event) pairs.
        #
        # In this example settings,
        #    1st timer fires every 0.25 seconds in 0.25 seconds. (0.25, 0.5, 0.75, 1.0, ...)
        #    2nd timer every 0.5 seconds in 0.5 seconds. (0.5, 1.0, 1.5, 2.0, ...)
        #    3rd timer every 0.75 seconds in 0.75 seconds. (0.75, 1.5, 2.25, 3.0, ...)
        #
        #    In 0.25 seconds, only 1st timer fires.
        #    In 0.5 seconds, 1st timer and 2nd timer fires at once.
        #    In 0.75 seconds, 1st timer and 3rd timer fires at once.
        #    In 1.5 seconds, 1st timer, 2nd timer and 3rd timer fires at once.
        #
        # If a timer file descriptor is signaled more than once since
        # the last os.read() call, os.read() returns the number of signaled
        # as host order of class bytes.
        print(f"Signaled events=@{events@}")
        for fd, event in events:
            if event & select.EPOLLIN:
                if fd == sock.fileno():
                    # Check if there is a connection request.
                    print(f"Accepting connection @{fd@}")
                    conn, addr = sock.accept()
                    conn.setblocking(False)
                    print(f"Accepted connection @{conn@} from @{addr@}")
                    ep.register(conn, select.EPOLLIN)
                elif conn and fd == conn.fileno():
                    # Check if there is data to read.
                    print(f"Reading data @{fd@}")
                    data = conn.recv(1024)
                    if data:
                        # You should catch UnicodeDecodeError exception for safety.
                        cmd = data.decode()
                        if cmd.startswith("stop"):
                            print(f"Stopping server")
                            is_active = False
                        else:
                            print(f"Unknown command: @{cmd@}")
                    else:
                        # No more data, close connection
                        print(f"Closing connection @{fd@}")
                        ep.unregister(conn)
                        conn.close()
                        conn = None
                elif fd in fds:
                    print(f"Reading timer @{fd@}")
                    count = int.from_bytes(os.read(fd, 8), byteorder=sys.byteorder)
                    print(f"Timer @{fds.index(fd) + 1@} expired @{count@} times")
                else:
                    print(f"Unknown file descriptor @{fd@}")
finally:
    for fd in fds:
        ep.unregister(fd)
        os.close(fd)
    ep.close()
@end example

This example shows how @ref{fa6,,select()} can be used with timer file
descriptors to wait until the file descriptor is ready for reading:

@example
import os, time, select, socket, sys

# In this example, use loopback address to send "stop" command to the server.
#
# $ telnet 127.0.0.1 1234
# Trying 127.0.0.1...
# Connected to 127.0.0.1.
# Escape character is '^]'.
# stop
# Connection closed by foreign host.
#
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(("127.0.0.1", 1234))
sock.setblocking(False)
sock.listen(1)

# Create timer file descriptors in non-blocking mode.
num = 3
fds = [os.timerfd_create(time.CLOCK_REALTIME, flags=os.TFD_NONBLOCK)
       for _ in range(num)]
select_fds = fds + [sock]

# Start the timers with os.timerfd_settime() in seconds.
# Timer 1 fires every 0.25 seconds; timer 2 every 0.5 seconds; etc
for i, fd in enumerate(fds, start=1):
   os.timerfd_settime(fd, initial=i/4, interval=i/4)

timeout = 3
try:
    conn = None
    is_active = True
    while is_active:
       # Wait for the timer to expire for 3 seconds.
       # select.select() returns a list of file descriptors or objects.
       rfd, wfd, xfd = select.select(select_fds, select_fds, select_fds, timeout)
       for fd in rfd:
           if fd == sock:
               # Check if there is a connection request.
               print(f"Accepting connection @{fd@}")
               conn, addr = sock.accept()
               conn.setblocking(False)
               print(f"Accepted connection @{conn@} from @{addr@}")
               select_fds.append(conn)
           elif conn and fd == conn:
               # Check if there is data to read.
               print(f"Reading data @{fd@}")
               data = conn.recv(1024)
               if data:
                   # You should catch UnicodeDecodeError exception for safety.
                   cmd = data.decode()
                   if cmd.startswith("stop"):
                       print(f"Stopping server")
                       is_active = False
                   else:
                       print(f"Unknown command: @{cmd@}")
               else:
                   # No more data, close connection
                   print(f"Closing connection @{fd@}")
                   select_fds.remove(conn)
                   conn.close()
                   conn = None
           elif fd in fds:
               print(f"Reading timer @{fd@}")
               count = int.from_bytes(os.read(fd, 8), byteorder=sys.byteorder)
               print(f"Timer @{fds.index(fd) + 1@} expired @{count@} times")
           else:
               print(f"Unknown file descriptor @{fd@}")
finally:
    for fd in fds:
       os.close(fd)
    sock.close()
    sock = None
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node The Python 2 3 Method Resolution Order,Python support for free threading,timer file descriptor HOWTO,Python HOWTOs
@anchor{howto/mro doc}@anchor{5bd7}@anchor{howto/mro python-2-3-mro}@anchor{16b6}@anchor{howto/mro the-python-2-3-method-resolution-order}@anchor{5bd8}@anchor{howto/mro translation-repo}@anchor{5bd9}
@section The Python 2.3 Method Resolution Order


@cartouche
@quotation Note 
This is a historical document, provided as an appendix to the official
documentation.
The Method Resolution Order discussed here was `introduced' in Python 2.3,
but it is still used in later versions – including Python 3.
@end quotation
@end cartouche

By Michele Simionato@footnote{https://www.phyast.pitt.edu/~micheles/}.

@*Abstract: 
`This document is intended for Python programmers who want to
understand the C3 Method Resolution Order used in Python 2.3.
Although it is not intended for newbies, it is quite pedagogical with
many worked out examples.  I am not aware of other publicly available
documents with the same scope, therefore it should be useful.'


Disclaimer:

@quotation

`I donate this document to the Python Software Foundation, under the
Python 2.3 license.  As usual in these circumstances, I warn the
reader that what follows' should `be correct, but I don’t give any
warranty.  Use it at your own risk and peril!'
@end quotation

Acknowledgments:

@quotation

`All the people of the Python mailing list who sent me their support.
Paul Foley who pointed out various imprecisions and made me to add the
part on local precedence ordering. David Goodger for help with the
formatting in reStructuredText. David Mertz for help with the editing.
Finally, Guido van Rossum who enthusiastically added this document to
the official Python 2.3 home-page.'
@end quotation

@menu
* The beginning:: 
* The C3 Method Resolution Order:: 
* Examples: Examples<42>. 
* Bad Method Resolution Orders:: 
* The end:: 
* Resources:: 

@end menu

@node The beginning,The C3 Method Resolution Order,,The Python 2 3 Method Resolution Order
@anchor{howto/mro the-beginning}@anchor{5bda}
@subsection The beginning


@quotation

`Felix qui potuit rerum cognoscere causas' – Virgilius
@end quotation

Everything started with a post by Samuele Pedroni to the Python
development mailing list @footnote{
The thread on python-dev started by Samuele Pedroni:
@indicateurl{https://mail.python.org/pipermail/python-dev/2002-October/029035.html}
}.  In his post, Samuele showed that the
Python 2.2 method resolution order is not monotonic and he proposed to
replace it with the C3 method resolution order.  Guido agreed with his
arguments and therefore now Python 2.3 uses C3.  The C3 method itself
has nothing to do with Python, since it was invented by people working
on Dylan and it is described in a paper intended for lispers @footnote{
The paper `A Monotonic Superclass Linearization for Dylan':
@indicateurl{https://doi.org/10.1145/236337.236343}
}.  The
present paper gives a (hopefully) readable discussion of the C3
algorithm for Pythonistas who want to understand the reasons for the
change.

First of all, let me point out that what I am going to say only applies
to the `new style classes' introduced in Python 2.2:  `classic classes'
maintain their old method resolution order, depth first and then left to
right.  Therefore, there is no breaking of old code for classic classes;
and even if in principle there could be breaking of code for Python 2.2
new style classes, in practice the cases in which the C3 resolution
order differs from the Python 2.2 method resolution order are so rare
that no real breaking of code is expected.  Therefore:

@quotation

`Don’t be scared!'
@end quotation

Moreover, unless you make strong use of multiple inheritance and you
have non-trivial hierarchies, you don’t need to understand the C3
algorithm, and you can easily skip this paper.  On the other hand, if
you really want to know how multiple inheritance works, then this paper
is for you.  The good news is that things are not as complicated as you
might expect.

Let me begin with some basic definitions.


@enumerate 

@item 
Given a class C in a complicated multiple inheritance hierarchy, it
is a non-trivial task to specify the order in which methods are
overridden, i.e. to specify the order of the ancestors of C.

@item 
The list of the ancestors of a class C, including the class itself,
ordered from the nearest ancestor to the furthest, is called the
class precedence list or the `linearization' of C.

@item 
The `Method Resolution Order' (MRO) is the set of rules that
construct the linearization.  In the Python literature, the idiom
“the MRO of C” is also used as a synonymous for the linearization of
the class C.

@item 
For instance, in the case of single inheritance hierarchy, if C is a
subclass of C1, and C1 is a subclass of C2, then the linearization of
C is simply the list [C, C1 , C2].  However, with multiple
inheritance hierarchies, the construction of the linearization is
more cumbersome, since it is more difficult to construct a
linearization that respects `local precedence ordering' and
`monotonicity'.

@item 
I will discuss the local precedence ordering later, but I can give
the definition of monotonicity here.  A MRO is monotonic when the
following is true:  `if C1 precedes C2 in the linearization of C,
then C1 precedes C2 in the linearization of any subclass of C'.
Otherwise, the innocuous operation of deriving a new class could
change the resolution order of methods, potentially introducing very
subtle bugs.  Examples where this happens will be shown later.

@item 
Not all classes admit a linearization.  There are cases, in
complicated hierarchies, where it is not possible to derive a class
such that its linearization respects all the desired properties.
@end enumerate

Here I give an example of this situation. Consider the hierarchy

@example
>>> O = object
>>> class X(O): pass
>>> class Y(O): pass
>>> class A(X,Y): pass
>>> class B(Y,X): pass
@end example

which can be represented with the following inheritance graph, where I
have denoted with O the @code{object} class, which is the beginning of any
hierarchy for new style classes:

@quotation

@example
 -----------
|           |
|    O      |
|  /   \    |
 - X    Y  /
   |  / | /
   | /  |/
   A    B
   \   /
     ?
@end example
@end quotation

In this case, it is not possible to derive a new class C from A and B,
since X precedes Y in A, but Y precedes X in B, therefore the method
resolution order would be ambiguous in C.

Python 2.3 raises an exception in this situation (TypeError:  MRO
conflict among bases Y, X) forbidding the naive programmer from creating
ambiguous hierarchies.  Python 2.2 instead does not raise an exception,
but chooses an `ad hoc' ordering (CABXYO in this case).

@node The C3 Method Resolution Order,Examples<42>,The beginning,The Python 2 3 Method Resolution Order
@anchor{howto/mro the-c3-method-resolution-order}@anchor{5bdb}
@subsection The C3 Method Resolution Order


Let me introduce a few simple notations which will be useful for the
following discussion.  I will use the shortcut notation:

@example
C1 C2 ... CN
@end example

to indicate the list of classes [C1, C2, … , CN].

The `head' of the list is its first element:

@example
head = C1
@end example

whereas the `tail' is the rest of the list:

@example
tail = C2 ... CN.
@end example

I shall also use the notation:

@example
C + (C1 C2 ... CN) = C C1 C2 ... CN
@end example

to denote the sum of the lists [C] + [C1, C2, … ,CN].

Now I can explain how the MRO works in Python 2.3.

Consider a class C in a multiple inheritance hierarchy, with C
inheriting from the base classes B1, B2, …  , BN.  We want to
compute the linearization L[C] of the class C. The rule is the
following:

@quotation

`the linearization of C is the sum of C plus the merge of the
linearizations of the parents and the list of the parents.'
@end quotation

In symbolic notation:

@example
L[C(B1 ... BN)] = C + merge(L[B1] ... L[BN], B1 ... BN)
@end example

In particular, if C is the @code{object} class, which has no parents, the
linearization is trivial:

@example
L[object] = object.
@end example

However, in general one has to compute the merge according to the following
prescription:

@quotation

`take the head of the first list, i.e L[B1][0]; if this head is not in
the tail of any of the other lists, then add it to the linearization
of C and remove it from the lists in the merge, otherwise look at the
head of the next list and take it, if it is a good head.  Then repeat
the operation until all the class are removed or it is impossible to
find good heads.  In this case, it is impossible to construct the
merge, Python 2.3 will refuse to create the class C and will raise an
exception.'
@end quotation

This prescription ensures that the merge operation `preserves' the
ordering, if the ordering can be preserved.  On the other hand, if the
order cannot be preserved (as in the example of serious order
disagreement discussed above) then the merge cannot be computed.

The computation of the merge is trivial if C has only one parent
(single inheritance); in this case:

@example
L[C(B)] = C + merge(L[B],B) = C + L[B]
@end example

However, in the case of multiple inheritance things are more cumbersome
and I don’t expect you can understand the rule without a couple of
examples ;-)

@node Examples<42>,Bad Method Resolution Orders,The C3 Method Resolution Order,The Python 2 3 Method Resolution Order
@anchor{howto/mro examples}@anchor{5bdc}
@subsection Examples


First example. Consider the following hierarchy:

@example
>>> O = object
>>> class F(O): pass
>>> class E(O): pass
>>> class D(O): pass
>>> class C(D,F): pass
>>> class B(D,E): pass
>>> class A(B,C): pass
@end example

In this case the inheritance graph can be drawn as:

@quotation

@example
                          6
                         ---
Level 3                 | O |                  (more general)
                      /  ---  \
                     /    |    \                      |
                    /     |     \                     |
                   /      |      \                    |
                  ---    ---    ---                   |
Level 2        3 | D | 4| E |  | F | 5                |
                  ---    ---    ---                   |
                   \  \ _ /       |                   |
                    \    / \ _    |                   |
                     \  /      \  |                   |
                      ---      ---                    |
Level 1            1 | B |    | C | 2                 |
                      ---      ---                    |
                        \      /                      |
                         \    /                      \ /
                           ---
Level 0                 0 | A |                (more specialized)
                           ---
@end example
@end quotation

The linearizations of O,D,E and F are trivial:

@example
L[O] = O
L[D] = D O
L[E] = E O
L[F] = F O
@end example

The linearization of B can be computed as:

@example
L[B] = B + merge(DO, EO, DE)
@end example

We see that D is a good head, therefore we take it and we are reduced to
compute @code{merge(O,EO,E)}.  Now O is not a good head, since it is in the
tail of the sequence EO.  In this case the rule says that we have to
skip to the next sequence.  Then we see that E is a good head; we take
it and we are reduced to compute @code{merge(O,O)} which gives O. Therefore:

@example
L[B] =  B D E O
@end example

Using the same procedure one finds:

@example
L[C] = C + merge(DO,FO,DF)
     = C + D + merge(O,FO,F)
     = C + D + F + merge(O,O)
     = C D F O
@end example

Now we can compute:

@example
L[A] = A + merge(BDEO,CDFO,BC)
     = A + B + merge(DEO,CDFO,C)
     = A + B + C + merge(DEO,DFO)
     = A + B + C + D + merge(EO,FO)
     = A + B + C + D + E + merge(O,FO)
     = A + B + C + D + E + F + merge(O,O)
     = A B C D E F O
@end example

In this example, the linearization is ordered in a pretty nice way
according to the inheritance level, in the sense that lower levels (i.e.
more specialized classes) have higher precedence (see the inheritance
graph).  However, this is not the general case.

I leave as an exercise for the reader to compute the linearization for
my second example:

@example
>>> O = object
>>> class F(O): pass
>>> class E(O): pass
>>> class D(O): pass
>>> class C(D,F): pass
>>> class B(E,D): pass
>>> class A(B,C): pass
@end example

The only difference with the previous example is the change B(D,E) –>
B(E,D); however even such a little modification completely changes the
ordering of the hierarchy:

@quotation

@example
                           6
                          ---
Level 3                  | O |
                       /  ---  \
                      /    |    \
                     /     |     \
                    /      |      \
                  ---     ---    ---
Level 2        2 | E | 4 | D |  | F | 5
                  ---     ---    ---
                   \      / \     /
                    \    /   \   /
                     \  /     \ /
                      ---     ---
Level 1            1 | B |   | C | 3
                      ---     ---
                       \       /
                        \     /
                          ---
Level 0                0 | A |
                          ---
@end example
@end quotation

Notice that the class E, which is in the second level of the hierarchy,
precedes the class C, which is in the first level of the hierarchy, i.e.
E is more specialized than C, even if it is in a higher level.

A lazy programmer can obtain the MRO directly from Python 2.2, since in
this case it coincides with the Python 2.3 linearization.  It is enough
to invoke the @ref{23bd,,mro()} method of class A:

@example
>>> A.mro()
[<class 'A'>, <class 'B'>, <class 'E'>,
<class 'C'>, <class 'D'>, <class 'F'>,
<class 'object'>]
@end example

Finally, let me consider the example discussed in the first section,
involving a serious order disagreement.  In this case, it is
straightforward to compute the linearizations of O, X, Y, A and B:

@quotation

@example
L[O] = 0
L[X] = X O
L[Y] = Y O
L[A] = A X Y O
L[B] = B Y X O
@end example
@end quotation

However, it is impossible to compute the linearization for a class C
that inherits from A and B:

@example
L[C] = C + merge(AXYO, BYXO, AB)
     = C + A + merge(XYO, BYXO, B)
     = C + A + B + merge(XYO, YXO)
@end example

At this point we cannot merge the lists XYO and YXO, since X is in the
tail of YXO whereas Y is in the tail of XYO:  therefore there are no
good heads and the C3 algorithm stops.  Python 2.3 raises an error and
refuses to create the class C.

@node Bad Method Resolution Orders,The end,Examples<42>,The Python 2 3 Method Resolution Order
@anchor{howto/mro bad-method-resolution-orders}@anchor{5bdd}
@subsection Bad Method Resolution Orders


A MRO is `bad' when it breaks such fundamental properties as local
precedence ordering and monotonicity.  In this section, I will show
that both the MRO for classic classes and the MRO for new style classes
in Python 2.2 are bad.

It is easier to start with the local precedence ordering.  Consider the
following example:

@example
>>> F=type('Food',(),@{'remember2buy':'spam'@})
>>> E=type('Eggs',(F,),@{'remember2buy':'eggs'@})
>>> G=type('GoodFood',(F,E),@{@}) # under Python 2.3 this is an error!
@end example

with inheritance diagram

@quotation

@example
             O
             |
(buy spam)   F
             | \
             | E   (buy eggs)
             | /
             G

      (buy eggs or spam ?)
@end example
@end quotation

We see that class G inherits from F and E, with F `before' E:  therefore
we would expect the attribute `G.remember2buy' to be inherited by
`F.remember2buy' and not by `E.remember2buy':  nevertheless Python 2.2
gives

@example
>>> G.remember2buy
'eggs'
@end example

This is a breaking of local precedence ordering since the order in the
local precedence list, i.e. the list of the parents of G, is not
preserved in the Python 2.2 linearization of G:

@example
L[G,P22]= G E F object   # F *follows* E
@end example

One could argue that the reason why F follows E in the Python 2.2
linearization is that F is less specialized than E, since F is the
superclass of E; nevertheless the breaking of local precedence ordering
is quite non-intuitive and error prone.  This is particularly true since
it is a different from old style classes:

@example
>>> class F: remember2buy='spam'
>>> class E(F): remember2buy='eggs'
>>> class G(F,E): pass
>>> G.remember2buy
'spam'
@end example

In this case the MRO is GFEF and the local precedence ordering is
preserved.

As a general rule, hierarchies such as the previous one should be
avoided, since it is unclear if F should override E or vice-versa.
Python 2.3 solves the ambiguity by raising an exception in the creation
of class G, effectively stopping the programmer from generating
ambiguous hierarchies.  The reason for that is that the C3 algorithm
fails when the merge:

@example
merge(FO,EFO,FE)
@end example

cannot be computed, because F is in the tail of EFO and E is in the tail
of FE.

The real solution is to design a non-ambiguous hierarchy, i.e. to derive
G from E and F (the more specific first) and not from F and E; in this
case the MRO is GEF without any doubt.

@quotation

@example
           O
           |
           F (spam)
         / |
(eggs)   E |
         \ |
           G
             (eggs, no doubt)
@end example
@end quotation

Python 2.3 forces the programmer to write good hierarchies (or, at
least, less error-prone ones).

On a related note, let me point out that the Python 2.3 algorithm is
smart enough to recognize obvious mistakes, as the duplication of
classes in the list of parents:

@example
>>> class A(object): pass
>>> class C(A,A): pass # error
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
TypeError: duplicate base class A
@end example

Python 2.2 (both for classic classes and new style classes) in this
situation, would not raise any exception.

Finally, I would like to point out two lessons we have learned from this
example:


@enumerate 

@item 
despite the name, the MRO determines the resolution order of
attributes, not only of methods;

@item 
the default food for Pythonistas is spam !  (but you already knew
that ;-)
@end enumerate

Having discussed the issue of local precedence ordering, let me now
consider the issue of monotonicity.  My goal is to show that neither the
MRO for classic classes nor that for Python 2.2 new style classes is
monotonic.

To prove that the MRO for classic classes is non-monotonic is rather
trivial, it is enough to look at the diamond diagram:

@quotation

@example
   C
  / \
 /   \
A     B
 \   /
  \ /
   D
@end example
@end quotation

One easily discerns the inconsistency:

@example
L[B,P21] = B C        # B precedes C : B's methods win
L[D,P21] = D A C B C  # B follows C  : C's methods win!
@end example

On the other hand, there are no problems with the Python 2.2 and 2.3
MROs, they give both:

@example
L[D] = D A B C
@end example

Guido points out in his essay @footnote{
Guido van Rossum’s essay, `Unifying types and classes in Python 2.2':
@indicateurl{https://web.archive.org/web/20140210194412/http://www.python.org/download/releases/2.2.2/descrintro}
} that the classic MRO is not so bad in
practice, since one can typically avoids diamonds for classic classes.
But all new style classes inherit from @code{object}, therefore diamonds are
unavoidable and inconsistencies shows up in every multiple inheritance
graph.

The MRO of Python 2.2 makes breaking monotonicity difficult, but not
impossible.  The following example, originally provided by Samuele
Pedroni, shows that the MRO of Python 2.2 is non-monotonic:

@example
>>> class A(object): pass
>>> class B(object): pass
>>> class C(object): pass
>>> class D(object): pass
>>> class E(object): pass
>>> class K1(A,B,C): pass
>>> class K2(D,B,E): pass
>>> class K3(D,A):   pass
>>> class Z(K1,K2,K3): pass
@end example

Here are the linearizations according to the C3 MRO (the reader should
verify these linearizations as an exercise and draw the inheritance
diagram ;-)

@example
L[A] = A O
L[B] = B O
L[C] = C O
L[D] = D O
L[E] = E O
L[K1]= K1 A B C O
L[K2]= K2 D B E O
L[K3]= K3 D A O
L[Z] = Z K1 K2 K3 D A B C E O
@end example

Python 2.2 gives exactly the same linearizations for A, B, C, D, E, K1,
K2 and K3, but a different linearization for Z:

@example
L[Z,P22] = Z K1 K3 A K2 D B C E O
@end example

It is clear that this linearization is `wrong', since A comes before D
whereas in the linearization of K3 A comes `after' D. In other words, in
K3 methods derived by D override methods derived by A, but in Z, which
still is a subclass of K3, methods derived by A override methods derived
by D!  This is a violation of monotonicity.  Moreover, the Python 2.2
linearization of Z is also inconsistent with local precedence ordering,
since the local precedence list of the class Z is [K1, K2, K3] (K2
precedes K3), whereas in the linearization of Z K2 `follows' K3.  These
problems explain why the 2.2 rule has been dismissed in favor of the C3
rule.

@node The end,Resources,Bad Method Resolution Orders,The Python 2 3 Method Resolution Order
@anchor{howto/mro the-end}@anchor{5bde}
@subsection The end


This section is for the impatient reader, who skipped all the previous
sections and jumped immediately to the end.  This section is for the
lazy programmer too, who didn’t want to exercise her/his brain.
Finally, it is for the programmer with some hubris, otherwise s/he would
not be reading a paper on the C3 method resolution order in multiple
inheritance hierarchies ;-) These three virtues taken all together (and
`not' separately) deserve a prize:  the prize is a short Python 2.2
script that allows you to compute the 2.3 MRO without risk to your
brain.  Simply change the last line to play with the various examples I
have discussed in this paper.:

@example
#<mro.py>

"""C3 algorithm by Samuele Pedroni (with readability enhanced by me)."""

class __metaclass__(type):
    "All classes are metamagically modified to be nicely printed"
    __repr__ = lambda cls: cls.__name__

class ex_2:
    "Serious order disagreement" #From Guido
    class O: pass
    class X(O): pass
    class Y(O): pass
    class A(X,Y): pass
    class B(Y,X): pass
    try:
        class Z(A,B): pass #creates Z(A,B) in Python 2.2
    except TypeError:
        pass # Z(A,B) cannot be created in Python 2.3

class ex_5:
    "My first example"
    class O: pass
    class F(O): pass
    class E(O): pass
    class D(O): pass
    class C(D,F): pass
    class B(D,E): pass
    class A(B,C): pass

class ex_6:
    "My second example"
    class O: pass
    class F(O): pass
    class E(O): pass
    class D(O): pass
    class C(D,F): pass
    class B(E,D): pass
    class A(B,C): pass

class ex_9:
    "Difference between Python 2.2 MRO and C3" #From Samuele
    class O: pass
    class A(O): pass
    class B(O): pass
    class C(O): pass
    class D(O): pass
    class E(O): pass
    class K1(A,B,C): pass
    class K2(D,B,E): pass
    class K3(D,A): pass
    class Z(K1,K2,K3): pass

def merge(seqs):
    print '\n\nCPL[%s]=%s' % (seqs[0][0],seqs),
    res = []; i=0
    while 1:
      nonemptyseqs=[seq for seq in seqs if seq]
      if not nonemptyseqs: return res
      i+=1; print '\n',i,'round: candidates...',
      for seq in nonemptyseqs: # find merge candidates among seq heads
          cand = seq[0]; print ' ',cand,
          nothead=[s for s in nonemptyseqs if cand in s[1:]]
          if nothead: cand=None #reject candidate
          else: break
      if not cand: raise "Inconsistent hierarchy"
      res.append(cand)
      for seq in nonemptyseqs: # remove cand
          if seq[0] == cand: del seq[0]

def mro(C):
    "Compute the class precedence list (mro) according to C3"
    return merge([[C]]+map(mro,C.__bases__)+[list(C.__bases__)])

def print_mro(C):
    print '\nMRO[%s]=%s' % (C,mro(C))
    print '\nP22 MRO[%s]=%s' % (C,C.mro())

print_mro(ex_9.Z)

#</mro.py>
@end example

That’s all folks,

@quotation

enjoy !
@end quotation

@node Resources,,The end,The Python 2 3 Method Resolution Order
@anchor{howto/mro resources}@anchor{5bdf}
@subsection Resources


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Python support for free threading,C API Extension Support for Free Threading,The Python 2 3 Method Resolution Order,Python HOWTOs
@anchor{howto/free-threading-python doc}@anchor{5be0}@anchor{howto/free-threading-python freethreading-python-howto}@anchor{2766}@anchor{howto/free-threading-python python-support-for-free-threading}@anchor{5be1}@anchor{howto/free-threading-python translation-repo}@anchor{5be2}
@section Python support for free threading


Starting with the 3.13 release, CPython has support for a build of
Python called @ref{1f6,,free threading} where the @ref{474,,global interpreter lock}
(GIL) is disabled.  Free-threaded execution allows for full utilization of the
available processing power by running threads in parallel on available CPU cores.
While not all software will benefit from this automatically, programs
designed with threading in mind will run faster on multi-core hardware.

Some third-party packages, in particular ones
with an @ref{2295,,extension module}, may not be ready for use in a
free-threaded build, and will re-enable the @ref{165,,GIL}.

This document describes the implications of free threading
for Python code.  See @ref{5be3,,C API Extension Support for Free Threading} for information on
how to write C extensions that support the free-threaded build.


@subsubheading See also


@geindex Python Enhancement Proposals; PEP 703
PEP 703@footnote{https://peps.python.org/pep-0703/} – Making the Global Interpreter Lock Optional in CPython for an
overall description of free-threaded Python.


@menu
* Installation: Installation<2>. 
* Identifying free-threaded Python:: 
* The global interpreter lock in free-threaded Python:: 
* Thread safety:: 
* Known limitations:: 
* Behavioral changes:: 

@end menu

@node Installation<2>,Identifying free-threaded Python,,Python support for free threading
@anchor{howto/free-threading-python installation}@anchor{5be4}
@subsection Installation


Starting with Python 3.13, the official macOS and Windows installers
optionally support installing free-threaded Python binaries.  The installers
are available at @indicateurl{https://www.python.org/downloads/}.

For information on other platforms, see the Installing a Free-Threaded Python@footnote{https://py-free-threading.github.io/installing-cpython/}, a
community-maintained installation guide for installing free-threaded Python.

When building CPython from source, the @ref{49a,,--disable-gil} configure option
should be used to build a free-threaded Python interpreter.

@node Identifying free-threaded Python,The global interpreter lock in free-threaded Python,Installation<2>,Python support for free threading
@anchor{howto/free-threading-python identifying-free-threaded-python}@anchor{5be5}
@subsection Identifying free-threaded Python


To check if the current interpreter supports free-threading, @ref{49c,,python -VV}
and @ref{49d,,sys.version} contain “free-threading build”.
The new @ref{4c85,,sys._is_gil_enabled()} function can be used to check whether
the GIL is actually disabled in the running process.

The @code{sysconfig.get_config_var("Py_GIL_DISABLED")} configuration variable can
be used to determine whether the build supports free threading.  If the variable
is set to @code{1}, then the build supports free threading.  This is the recommended
mechanism for decisions related to the build configuration.

@node The global interpreter lock in free-threaded Python,Thread safety,Identifying free-threaded Python,Python support for free threading
@anchor{howto/free-threading-python the-global-interpreter-lock-in-free-threaded-python}@anchor{5be6}
@subsection The global interpreter lock in free-threaded Python


Free-threaded builds of CPython support optionally running with the GIL enabled
at runtime using the environment variable 
@geindex PYTHON_GIL
@geindex environment variable; PYTHON_GIL
@ref{49b,,PYTHON_GIL} or
the command-line option @ref{170,,-X gil}.

The GIL may also automatically be enabled when importing a C-API extension
module that is not explicitly marked as supporting free threading.  A warning
will be printed in this case.

In addition to individual package documentation, the following websites track
the status of popular packages support for free threading:


@itemize *

@item 
@indicateurl{https://py-free-threading.github.io/tracking/}

@item 
@indicateurl{https://hugovk.github.io/free-threaded-wheels/}
@end itemize

@node Thread safety,Known limitations,The global interpreter lock in free-threaded Python,Python support for free threading
@anchor{howto/free-threading-python thread-safety}@anchor{5be7}
@subsection Thread safety


The free-threaded build of CPython aims to provide similar thread-safety
behavior at the Python level to the default GIL-enabled build.  Built-in
types like @ref{184,,dict}, @ref{24f,,list}, and @ref{185,,set} use internal locks
to protect against concurrent modifications in ways that behave similarly to
the GIL.  However, Python has not historically guaranteed specific behavior for
concurrent modifications to these built-in types, so this should be treated
as a description of the current implementation, not a guarantee of current or
future behavior.

@cartouche
@quotation Note 
It’s recommended to use the @ref{1a39,,threading.Lock} or other synchronization
primitives instead of relying on the internal locks of built-in types, when
possible.
@end quotation
@end cartouche

@node Known limitations,Behavioral changes,Thread safety,Python support for free threading
@anchor{howto/free-threading-python known-limitations}@anchor{5be8}
@subsection Known limitations


This section describes known limitations of the free-threaded CPython build.

@menu
* Immortalization:: 
* Frame objects: Frame objects<3>. 
* Iterators: Iterators<3>. 
* Single-threaded performance:: 

@end menu

@node Immortalization,Frame objects<3>,,Known limitations
@anchor{howto/free-threading-python immortalization}@anchor{5be9}
@subsubsection Immortalization


In the free-threaded build, some objects are @ref{292,,immortal}.
Immortal objects are not deallocated and have reference counts that are
never modified.  This is done to avoid reference count contention that would
prevent efficient multi-threaded scaling.

As of the 3.14 release, immortalization is limited to:


@itemize *

@item 
Code constants: numeric literals, string literals, and tuple literals
composed of other constants.

@item 
Strings interned by @ref{14e7,,sys.intern()}.
@end itemize

@node Frame objects<3>,Iterators<3>,Immortalization,Known limitations
@anchor{howto/free-threading-python frame-objects}@anchor{5bea}
@subsubsection Frame objects


It is not safe to access @ref{4a6,,frame.f_locals} from a @ref{8f1,,frame}
object if that frame is currently executing in another thread, and doing so may
crash the interpreter.

@node Iterators<3>,Single-threaded performance,Frame objects<3>,Known limitations
@anchor{howto/free-threading-python iterators}@anchor{5beb}
@subsubsection Iterators


It is generally not thread-safe to access the same iterator object from
multiple threads concurrently, and threads may see duplicate or missing
elements.

@node Single-threaded performance,,Iterators<3>,Known limitations
@anchor{howto/free-threading-python single-threaded-performance}@anchor{5bec}
@subsubsection Single-threaded performance


The free-threaded build has additional overhead when executing Python code
compared to the default GIL-enabled build.  The amount of overhead depends
on the workload and hardware.  On the pyperformance benchmark suite, the
average overhead ranges from about 1% on macOS aarch64 to 8% on x86-64 Linux
systems.

@node Behavioral changes,,Known limitations,Python support for free threading
@anchor{howto/free-threading-python behavioral-changes}@anchor{5bed}
@subsection Behavioral changes


This section describes CPython behavioural changes with the free-threaded
build.

@menu
* Context variables:: 
* Warning filters:: 
* Increased memory usage:: 

@end menu

@node Context variables,Warning filters,,Behavioral changes
@anchor{howto/free-threading-python context-variables}@anchor{5bee}
@subsubsection Context variables


In the free-threaded build, the flag @ref{176,,thread_inherit_context}
is set to true by default which causes threads created with
@ref{177,,threading.Thread} to start with a copy of the
@ref{178,,Context()} of the caller of
@ref{179,,start()}.  In the default GIL-enabled build, the flag
defaults to false so threads start with an
empty @code{Context()}.

@node Warning filters,Increased memory usage,Context variables,Behavioral changes
@anchor{howto/free-threading-python warning-filters}@anchor{5bef}
@subsubsection Warning filters


In the free-threaded build, the flag @ref{18b,,context_aware_warnings}
is set to true by default.  In the default GIL-enabled build, the flag defaults
to false.  If the flag is true then the @ref{17a,,warnings.catch_warnings}
context manager uses a context variable for warning filters.  If the flag is
false then @code{catch_warnings} modifies the global filters list,
which is not thread-safe.  See the @ref{119,,warnings} module for more details.

@node Increased memory usage,,Warning filters,Behavioral changes
@anchor{howto/free-threading-python increased-memory-usage}@anchor{5bf0}
@subsubsection Increased memory usage


The free-threaded build will typically use more memory compared to the default
build.  There are multiple reasons for this, mostly due to design decisions.

@menu
* All interned strings are immortal:: 
* Non-GC objects have a larger object header:: 
* QSBR can delay freeing of memory:: 
* mimalloc allocator vs pymalloc:: 
* Free-threaded reference counting can cause objects to live longer:: 
* Per-thread reference counting can delay freeing objects:: 

@end menu

@node All interned strings are immortal,Non-GC objects have a larger object header,,Increased memory usage
@anchor{howto/free-threading-python all-interned-strings-are-immortal}@anchor{5bf1}
@subsubsection All interned strings are immortal


For modern Python versions (since version 2.3), interning a string (e.g. with
@ref{14e7,,sys.intern()}) does not cause it to become immortal.  Instead, if the last
reference to that string disappears, it will be removed from the interned
string table.  This is not the case for the free-threaded build and any interned
string will become immortal, surviving until interpreter shutdown.

@node Non-GC objects have a larger object header,QSBR can delay freeing of memory,All interned strings are immortal,Increased memory usage
@anchor{howto/free-threading-python non-gc-objects-have-a-larger-object-header}@anchor{5bf2}
@subsubsection Non-GC objects have a larger object header


The free-threaded build uses a different @ref{5df,,PyObject} structure.  Instead
of having the GC related information allocated before the @code{PyObject}
structure, like in the default build, the GC related info is part of the normal
object header.  For example, on the AMD64 platform, @code{None} uses 32 bytes on
the free-threaded build vs 16 bytes for the default build.  GC objects (such as
dicts and lists) are the same size for both builds since the free-threaded
build does not use additional space for the GC info.

@node QSBR can delay freeing of memory,mimalloc allocator vs pymalloc,Non-GC objects have a larger object header,Increased memory usage
@anchor{howto/free-threading-python qsbr-can-delay-freeing-of-memory}@anchor{5bf3}
@subsubsection QSBR can delay freeing of memory


In order to safely implement lock-free data structures, a safe memory
reclamation (SMR) scheme is used, known as quiescent state-based reclamation
(QSBR).  This means that the memory backing data structures allowing lock-free
access will use QSBR, which defers the free operation, rather than immediately
freeing the memory.  Two examples of these data structures are the list object
and the dictionary keys object.  See @code{InternalDocs/qsbr.md} in the CPython
source tree for more details on how QSBR is implemented.  Running
@ref{1b5,,gc.collect()} should cause all memory being held by QSBR to be actually
freed.  Note that even when QSBR frees the memory, the underlying memory
allocator may not immediately return that memory to the OS and so the resident
set size (RSS) of the process might not decrease.

@node mimalloc allocator vs pymalloc,Free-threaded reference counting can cause objects to live longer,QSBR can delay freeing of memory,Increased memory usage
@anchor{howto/free-threading-python mimalloc-allocator-vs-pymalloc}@anchor{5bf4}
@subsubsection mimalloc allocator vs pymalloc


The default build will normally use the “pymalloc” memory allocator for small
allocations (512 bytes or smaller).  The free-threaded build does not use
pymalloc and allocates all Python objects using the “mimalloc” allocator.  The
pymalloc allocator has the following properties that help keep memory usage
low: small per-allocated-block overhead, effective memory fragmentation
prevention, and quick return of free memory to the operating system.  The
mimalloc allocator does quite well in these respects as well but can have some
more overhead.

In the free-threaded build, mimalloc manages memory in a number of separate
heaps (currently four).  For example, all GC supporting objects are allocated
from their own heap.  Using separate heaps means that free memory in one heap
cannot be used for an allocation that uses another heap.  Also, some heaps are
configured to use QSBR (quiescent-state based reclamation) when freeing the
memory that backs up the heap (known as “pages” in mimalloc terminology).  The
use of QSBR creates a delay between all memory blocks for a page being freed
and the memory page being released, either for new allocations or back to the
OS.

The mimalloc allocator also defers returning freed memory back to the OS.  You
can reduce that delay by setting the environment variable
@code{MIMALLOC_PURGE_DELAY} to @code{0}.  Note that this will likely reduce
the performance of the allocator.

@node Free-threaded reference counting can cause objects to live longer,Per-thread reference counting can delay freeing objects,mimalloc allocator vs pymalloc,Increased memory usage
@anchor{howto/free-threading-python free-threaded-reference-counting-can-cause-objects-to-live-longer}@anchor{5bf5}
@subsubsection Free-threaded reference counting can cause objects to live longer


In the default build, when an object’s reference count reaches zero, it is
normally deallocated.  The free-threaded build uses “biased reference
counting”, with a fast-path for objects “owned” by the current thread and a
slow path for other objects.  See 
@geindex Python Enhancement Proposals; PEP 703
PEP 703@footnote{https://peps.python.org/pep-0703/} for additional details.  Any time
an object’s reference count ends up in a “queued” state, deallocation can be
deferred.  The queued state is cleared from the “eval breaker” section of the
bytecode evaluator.

The free-threaded build also allows a different mode of reference counting,
known as “deferred reference counting”.  This mode is enabled by setting a flag
on a per-object basis.  Deferred reference counting is enabled for the
following types:


@itemize *

@item 
module objects

@item 
module top-level functions

@item 
class methods defined in the class scope

@item 
descriptor objects

@item 
thread-local objects, created by @ref{18a8,,threading.local}
@end itemize

When deferred reference counting is enabled, references from Python function
stacks are not added to the reference count.  This scheme reduces the overhead
of reference counting, especially for objects used from multiple threads.
Because the stack references are not counted, objects with deferred reference
counting are not immediately freed when their internal reference count goes to
zero.  Instead, they are examined by the next GC run and, if no stack
references to them are found, they are freed.  This means these objects are
freed by the GC and not when their reference count goes to zero, as is typical.

@node Per-thread reference counting can delay freeing objects,,Free-threaded reference counting can cause objects to live longer,Increased memory usage
@anchor{howto/free-threading-python per-thread-reference-counting-can-delay-freeing-objects}@anchor{5bf6}
@subsubsection Per-thread reference counting can delay freeing objects


To avoid contention on the reference count fields of frequently shared
objects, the free-threaded build also uses “per-thread reference counting”
for a few selected object types.  Rather than updating a single shared
reference count, each thread maintains its own local reference count array,
indexed by a unique id assigned to the object.  The true reference count is
only computed by summing the per-thread counts when the object’s local
count drops to zero.  Per-thread reference counting is currently used for:


@itemize *

@item 
heap type objects (classes created in Python)

@item 
code objects

@item 
the @code{__dict__} of module objects
@end itemize

Because the per-thread counts must be merged back to the object before it
can be deallocated, objects using per-thread reference counting are
typically freed later than they would be in the default build.  In
particular, such an object is usually not freed until the thread that
referenced it reaches a safe point (for example, in the “eval breaker”
section of the bytecode evaluator) or exits.  Running @ref{1b5,,gc.collect()}
will merge the per-thread counts and allow these objects to be freed.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node C API Extension Support for Free Threading,Remote debugging attachment protocol,Python support for free threading,Python HOWTOs
@anchor{howto/free-threading-extensions doc}@anchor{5bf7}@anchor{howto/free-threading-extensions c-api-extension-support-for-free-threading}@anchor{5bf8}@anchor{howto/free-threading-extensions freethreading-extensions-howto}@anchor{5be3}@anchor{howto/free-threading-extensions translation-repo}@anchor{5bf9}
@section C API Extension Support for Free Threading


Starting with the 3.13 release, CPython has support for running with
the @ref{474,,global interpreter lock} (GIL) disabled in a configuration
called @ref{1f6,,free threading}.  This document describes how to adapt C API
extensions to support free threading.

@menu
* Identifying the Free-Threaded Build in C:: 
* Module Initialization:: 
* General API Guidelines:: 
* Borrowed References:: 
* Memory Allocation APIs:: 
* Thread State and GIL APIs:: 
* Protecting Internal Extension State:: 
* Critical Sections:: 
* Building Extensions for the Free-Threaded Build:: 

@end menu

@node Identifying the Free-Threaded Build in C,Module Initialization,,C API Extension Support for Free Threading
@anchor{howto/free-threading-extensions identifying-the-free-threaded-build-in-c}@anchor{5bfa}
@subsection Identifying the Free-Threaded Build in C


The CPython C API exposes the @code{Py_GIL_DISABLED} macro: in the free-threaded
build it’s defined to @code{1}, and in the regular build it’s not defined.
You can use it to enable code that only runs under the free-threaded build:

@example
#ifdef Py_GIL_DISABLED
/* code that only runs in the free-threaded build */
#endif
@end example

@cartouche
@quotation Note 
On Windows, this macro is not defined automatically, but must be specified
to the compiler when building. The @ref{175,,sysconfig.get_config_var()} function
can be used to determine whether the current running interpreter had the
macro defined.
@end quotation
@end cartouche

@node Module Initialization,General API Guidelines,Identifying the Free-Threaded Build in C,C API Extension Support for Free Threading
@anchor{howto/free-threading-extensions module-initialization}@anchor{5bfb}
@subsection Module Initialization


Extension modules need to explicitly indicate that they support running with
the GIL disabled; otherwise importing the extension will raise a warning and
enable the GIL at runtime.

There are two ways to indicate that an extension module supports running with
the GIL disabled depending on whether the extension uses multi-phase or
single-phase initialization.

@menu
* Multi-Phase Initialization:: 
* Single-Phase Initialization:: 

@end menu

@node Multi-Phase Initialization,Single-Phase Initialization,,Module Initialization
@anchor{howto/free-threading-extensions multi-phase-initialization}@anchor{5bfc}
@subsubsection Multi-Phase Initialization


Extensions that use multi-phase initialization (i.e.,
@ref{5203,,PyModuleDef_Init()}) should add a @ref{483,,Py_mod_gil} slot in the
module definition.  If your extension supports older versions of CPython,
you should guard the slot with a @ref{380,,PY_VERSION_HEX} check.

@example
static struct PyModuleDef_Slot module_slots[] = @{
    ...
#if PY_VERSION_HEX >= 0x030D0000
    @{Py_mod_gil, Py_MOD_GIL_NOT_USED@},
#endif
    @{0, NULL@}
@};

static struct PyModuleDef moduledef = @{
    PyModuleDef_HEAD_INIT,
    .m_slots = module_slots,
    ...
@};
@end example

@node Single-Phase Initialization,,Multi-Phase Initialization,Module Initialization
@anchor{howto/free-threading-extensions single-phase-initialization}@anchor{5bfd}
@subsubsection Single-Phase Initialization


Extensions that use single-phase initialization (i.e.,
@ref{5577,,PyModule_Create()}) should call @ref{49e,,PyUnstable_Module_SetGIL()} to
indicate that they support running with the GIL disabled.  The function is
only defined in the free-threaded build, so you should guard the call with
@code{#ifdef Py_GIL_DISABLED} to avoid compilation errors in the regular build.

@example
static struct PyModuleDef moduledef = @{
    PyModuleDef_HEAD_INIT,
    ...
@};

PyMODINIT_FUNC
PyInit_mymodule(void)
@{
    PyObject *m = PyModule_Create(&moduledef);
    if (m == NULL) @{
        return NULL;
    @}
#ifdef Py_GIL_DISABLED
    PyUnstable_Module_SetGIL(m, Py_MOD_GIL_NOT_USED);
#endif
    return m;
@}
@end example

@node General API Guidelines,Borrowed References,Module Initialization,C API Extension Support for Free Threading
@anchor{howto/free-threading-extensions general-api-guidelines}@anchor{5bfe}
@subsection General API Guidelines


Most of the C API is thread-safe, but there are some exceptions.


@itemize *

@item 
`Struct Fields': Accessing fields in Python C API objects or structs
directly is not thread-safe if the field may be concurrently modified.

@item 
`Macros': Accessor macros like @ref{52bf,,PyList_GET_ITEM},
@ref{62f,,PyList_SET_ITEM}, and macros like
@ref{3c8,,PySequence_Fast_GET_SIZE} that use the object returned by
@ref{18e9,,PySequence_Fast()} do not perform any error checking or locking.
These macros are not thread-safe if the container object may be modified
concurrently.

@item 
`Borrowed References': C API functions that return
@ref{3d5,,borrowed references} may not be thread-safe if
the containing object is modified concurrently.  See the section on
@ref{5bff,,borrowed references} for more information.
@end itemize

@menu
* Container Thread Safety:: 

@end menu

@node Container Thread Safety,,,General API Guidelines
@anchor{howto/free-threading-extensions container-thread-safety}@anchor{5c00}
@subsubsection Container Thread Safety


Containers like @ref{2776,,PyListObject},
@ref{64f,,PyDictObject}, and @ref{5727,,PySetObject} perform internal locking
in the free-threaded build.  For example, the @ref{539f,,PyList_Append()} will
lock the list before appending an item.

@menu
* PyDict_Next:: 

@end menu

@node PyDict_Next,,,Container Thread Safety
@anchor{howto/free-threading-extensions id1}@anchor{5c01}@anchor{howto/free-threading-extensions pydict-next}@anchor{5c02}
@subsubsection @code{PyDict_Next}


A notable exception is @ref{19d2,,PyDict_Next()}, which does not lock the
dictionary.  You should use @ref{570b,,Py_BEGIN_CRITICAL_SECTION} to protect
the dictionary while iterating over it if the dictionary may be concurrently
modified:

@example
Py_BEGIN_CRITICAL_SECTION(dict);
PyObject *key, *value;
Py_ssize_t pos = 0;
while (PyDict_Next(dict, &pos, &key, &value)) @{
    ...
@}
Py_END_CRITICAL_SECTION();
@end example

@node Borrowed References,Memory Allocation APIs,General API Guidelines,C API Extension Support for Free Threading
@anchor{howto/free-threading-extensions borrowed-references}@anchor{5c03}
@subsection Borrowed References

@anchor{howto/free-threading-extensions id2}@anchor{5bff}
Some C API functions return @ref{3d5,,borrowed references}.
These APIs are not thread-safe if the containing object is modified
concurrently.  For example, it’s not safe to use @ref{5ff,,PyList_GetItem()}
if the list may be modified concurrently.

The following table lists some borrowed reference APIs and their replacements
that return @ref{5e2,,strong references}.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Borrowed reference API

@tab

Strong reference API

@item

@ref{5ff,,PyList_GetItem()}

@tab

@ref{5fe,,PyList_GetItemRef()}

@item

@ref{52bf,,PyList_GET_ITEM()}

@tab

@ref{5fe,,PyList_GetItemRef()}

@item

@ref{628,,PyDict_GetItem()}

@tab

@ref{5e0,,PyDict_GetItemRef()}

@item

@ref{5e1,,PyDict_GetItemWithError()}

@tab

@ref{5e0,,PyDict_GetItemRef()}

@item

@ref{629,,PyDict_GetItemString()}

@tab

@ref{41f,,PyDict_GetItemStringRef()}

@item

@ref{5e4,,PyDict_SetDefault()}

@tab

@ref{5e3,,PyDict_SetDefaultRef()}

@item

@ref{19d2,,PyDict_Next()}

@tab

none (see @ref{5c02,,PyDict_Next})

@item

@ref{3db,,PyWeakref_GetObject()}

@tab

@ref{3dd,,PyWeakref_GetRef()}

@item

@ref{3dc,,PyWeakref_GET_OBJECT()}

@tab

@ref{3dd,,PyWeakref_GetRef()}

@item

@ref{5fc,,PyImport_AddModule()}

@tab

@ref{5fb,,PyImport_AddModuleRef()}

@item

@ref{5768,,PyCell_GET()}

@tab

@ref{5767,,PyCell_Get()}

@end multitable


Not all APIs that return borrowed references are problematic.  For
example, @ref{5217,,PyTuple_GetItem()} is safe because tuples are immutable.
Similarly, not all uses of the above APIs are problematic.  For example,
@ref{628,,PyDict_GetItem()} is often used for parsing keyword argument
dictionaries in function calls; those keyword argument dictionaries are
effectively private (not accessible by other threads), so using borrowed
references in that context is safe.

Some of these functions were added in Python 3.13.  You can use the
pythoncapi-compat@footnote{https://github.com/python/pythoncapi-compat} package
to provide implementations of these functions for older Python versions.

@node Memory Allocation APIs,Thread State and GIL APIs,Borrowed References,C API Extension Support for Free Threading
@anchor{howto/free-threading-extensions free-threaded-memory-allocation}@anchor{5921}@anchor{howto/free-threading-extensions memory-allocation-apis}@anchor{5c04}
@subsection Memory Allocation APIs


Python’s memory management C API provides functions in three different
@ref{591c,,allocation domains}: “raw”, “mem”, and “object”.
For thread-safety, the free-threaded build requires that only Python objects
are allocated using the object domain, and that all Python objects are
allocated using that domain.  This differs from the prior Python versions,
where this was only a best practice and not a hard requirement.

@cartouche
@quotation Note 
Search for uses of @ref{e68,,PyObject_Malloc()} in your
extension and check that the allocated memory is used for Python objects.
Use @ref{e66,,PyMem_Malloc()} to allocate buffers instead of
@code{PyObject_Malloc()}.
@end quotation
@end cartouche

@node Thread State and GIL APIs,Protecting Internal Extension State,Memory Allocation APIs,C API Extension Support for Free Threading
@anchor{howto/free-threading-extensions thread-state-and-gil-apis}@anchor{5c05}
@subsection Thread State and GIL APIs


Python provides a set of functions and macros to manage thread state and the
GIL, such as:


@itemize *

@item 
@ref{64a,,PyGILState_Ensure()} and @ref{64b,,PyGILState_Release()}

@item 
@ref{647,,PyEval_SaveThread()} and @ref{648,,PyEval_RestoreThread()}

@item 
@ref{521d,,Py_BEGIN_ALLOW_THREADS} and @ref{c85,,Py_END_ALLOW_THREADS}
@end itemize

These functions should still be used in the free-threaded build to manage
thread state even when the @ref{165,,GIL} is disabled.  For example, if you
create a thread outside of Python, you must call @ref{64a,,PyGILState_Ensure()}
before calling into the Python API to ensure that the thread has a valid
Python thread state.

You should continue to call @ref{647,,PyEval_SaveThread()} or
@ref{521d,,Py_BEGIN_ALLOW_THREADS} around blocking operations, such as I/O or
lock acquisitions, to allow other threads to run the
@ref{1826,,cyclic garbage collector}.

@node Protecting Internal Extension State,Critical Sections,Thread State and GIL APIs,C API Extension Support for Free Threading
@anchor{howto/free-threading-extensions protecting-internal-extension-state}@anchor{5c06}
@subsection Protecting Internal Extension State


Your extension may have internal state that was previously protected by the
GIL.  You may need to add locking to protect this state.  The approach will
depend on your extension, but some common patterns include:


@itemize *

@item 
`Caches': global caches are a common source of shared state.  Consider
using a lock to protect the cache or disabling it in the free-threaded build
if the cache is not critical for performance.

@item 
`Global State': global state may need to be protected by a lock or moved
to thread local storage. C11 and C++11 provide the @code{thread_local} or
@code{_Thread_local} for
thread-local storage@footnote{https://en.cppreference.com/w/c/language/storage_duration}.
@end itemize

@node Critical Sections,Building Extensions for the Free-Threaded Build,Protecting Internal Extension State,C API Extension Support for Free Threading
@anchor{howto/free-threading-extensions critical-sections}@anchor{5c07}
@subsection Critical Sections

@anchor{howto/free-threading-extensions id3}@anchor{5c08}
In the free-threaded build, CPython provides a mechanism called “critical
sections” to protect data that would otherwise be protected by the GIL.
While extension authors may not interact with the internal critical section
implementation directly, understanding their behavior is crucial when using
certain C API functions or managing shared state in the free-threaded build.

@menu
* What Are Critical Sections?:: 
* Using Critical Sections:: 
* How Critical Sections Work:: 
* Deadlock Avoidance:: 
* Important Considerations:: 

@end menu

@node What Are Critical Sections?,Using Critical Sections,,Critical Sections
@anchor{howto/free-threading-extensions what-are-critical-sections}@anchor{5c09}
@subsubsection What Are Critical Sections?


Conceptually, critical sections act as a deadlock avoidance layer built on
top of simple mutexes. Each thread maintains a stack of active critical
sections. When a thread needs to acquire a lock associated with a critical
section (e.g., implicitly when calling a thread-safe C API function like
@ref{5219,,PyDict_SetItem()}, or explicitly using macros), it attempts to acquire
the underlying mutex.

@node Using Critical Sections,How Critical Sections Work,What Are Critical Sections?,Critical Sections
@anchor{howto/free-threading-extensions using-critical-sections}@anchor{5c0a}
@subsubsection Using Critical Sections


The primary APIs for using critical sections are:


@itemize *

@item 
@ref{570b,,Py_BEGIN_CRITICAL_SECTION} and @ref{5898,,Py_END_CRITICAL_SECTION} -
For locking a single object

@item 
@ref{5896,,Py_BEGIN_CRITICAL_SECTION2} and @ref{589a,,Py_END_CRITICAL_SECTION2}
- For locking two objects simultaneously
@end itemize

These macros must be used in matching pairs and must appear in the same C
scope, since they establish a new local scope.  These macros are no-ops in
non-free-threaded builds, so they can be safely added to code that needs to
support both build types.

A common use of a critical section would be to lock an object while accessing
an internal attribute of it.  For example, if an extension type has an internal
count field, you could use a critical section while reading or writing that
field:

@example
// read the count, returns new reference to internal count value
PyObject *result;
Py_BEGIN_CRITICAL_SECTION(obj);
result = Py_NewRef(obj->count);
Py_END_CRITICAL_SECTION();
return result;

// write the count, consumes reference from new_count
Py_BEGIN_CRITICAL_SECTION(obj);
obj->count = new_count;
Py_END_CRITICAL_SECTION();
@end example

@node How Critical Sections Work,Deadlock Avoidance,Using Critical Sections,Critical Sections
@anchor{howto/free-threading-extensions how-critical-sections-work}@anchor{5c0b}
@subsubsection How Critical Sections Work


Unlike traditional locks, critical sections do not guarantee exclusive access
throughout their entire duration. If a thread would block while holding a
critical section (e.g., by acquiring another lock or performing I/O), the
critical section is temporarily suspended—all locks are released—and then
resumed when the blocking operation completes.

This behavior is similar to what happens with the GIL when a thread makes a
blocking call. The key differences are:


@itemize *

@item 
Critical sections operate on a per-object basis rather than globally

@item 
Critical sections follow a stack discipline within each thread (the “begin” and
“end” macros enforce this since they must be paired and within the same scope)

@item 
Critical sections automatically release and reacquire locks around potential
blocking operations
@end itemize

@node Deadlock Avoidance,Important Considerations,How Critical Sections Work,Critical Sections
@anchor{howto/free-threading-extensions deadlock-avoidance}@anchor{5c0c}
@subsubsection Deadlock Avoidance


Critical sections help avoid deadlocks in two ways:


@enumerate 

@item 
If a thread tries to acquire a lock that’s already held by another thread,
it first suspends all of its active critical sections, temporarily releasing
their locks

@item 
When the blocking operation completes, only the top-most critical section is
reacquired first
@end enumerate

This means you cannot rely on nested critical sections to lock multiple objects
at once, as the inner critical section may suspend the outer ones. Instead, use
@ref{5896,,Py_BEGIN_CRITICAL_SECTION2} to lock two objects simultaneously.

Note that the locks described above are only @ref{485,,PyMutex} based locks.
The critical section implementation does not know about or affect other locking
mechanisms that might be in use, like POSIX mutexes.  Also note that while
blocking on any @code{PyMutex} causes the critical sections to be
suspended, only the mutexes that are part of the critical sections are
released.  If @code{PyMutex} is used without a critical section, it will
not be released and therefore does not get the same deadlock avoidance.

@node Important Considerations,,Deadlock Avoidance,Critical Sections
@anchor{howto/free-threading-extensions important-considerations}@anchor{5c0d}
@subsubsection Important Considerations



@itemize *

@item 
Critical sections may temporarily release their locks, allowing other threads
to modify the protected data. Be careful about making assumptions about the
state of the data after operations that might block.

@item 
Because locks can be temporarily released (suspended), entering a critical
section does not guarantee exclusive access to the protected resource
throughout the section’s duration. If code within a critical section calls
another function that blocks (e.g., acquires another lock, performs blocking
I/O), all locks held by the thread via critical sections will be released.
This is similar to how the GIL can be released during blocking calls.

@item 
Only the lock(s) associated with the most recently entered (top-most)
critical section are guaranteed to be held at any given time. Locks for
outer, nested critical sections might have been suspended.

@item 
You can lock at most two objects simultaneously with these APIs. If you need
to lock more objects, you’ll need to restructure your code.

@item 
While critical sections will not deadlock if you attempt to lock the same
object twice, they are less efficient than purpose-built reentrant locks for
this use case.

@item 
When using @ref{5896,,Py_BEGIN_CRITICAL_SECTION2}, the order of the objects
doesn’t affect correctness (the implementation handles deadlock avoidance),
but it’s good practice to always lock objects in a consistent order.

@item 
Remember that the critical section macros are primarily for protecting access
to `Python objects' that might be involved in internal CPython operations
susceptible to the deadlock scenarios described above. For protecting purely
internal extension state, standard mutexes or other synchronization
primitives might be more appropriate.
@end itemize

@node Building Extensions for the Free-Threaded Build,,Critical Sections,C API Extension Support for Free Threading
@anchor{howto/free-threading-extensions building-extensions-for-the-free-threaded-build}@anchor{5c0e}
@subsection Building Extensions for the Free-Threaded Build


C API extensions need to be built specifically for the free-threaded build.
The wheels, shared libraries, and binaries are indicated by a @code{t} suffix.


@itemize *

@item 
pypa/manylinux@footnote{https://github.com/pypa/manylinux} supports the
free-threaded build, with the @code{t} suffix, such as @code{python3.14t}.

@item 
pypa/cibuildwheel@footnote{https://github.com/pypa/cibuildwheel} supports
building wheels for the free-threaded build of Python 3.14 and newer.
@end itemize

@menu
* Limited C API and Stable ABI:: 
* Windows: Windows<87>. 

@end menu

@node Limited C API and Stable ABI,Windows<87>,,Building Extensions for the Free-Threaded Build
@anchor{howto/free-threading-extensions limited-c-api-and-stable-abi}@anchor{5c0f}
@subsubsection Limited C API and Stable ABI


The free-threaded build does not currently support the
@ref{637,,Limited C API} or the stable ABI.  If you use
setuptools@footnote{https://setuptools.pypa.io/en/latest/setuptools.html} to build
your extension and currently set @code{py_limited_api=True} you can use
@code{py_limited_api=not sysconfig.get_config_var("Py_GIL_DISABLED")} to opt out
of the limited API when building with the free-threaded build.

@cartouche
@quotation Note 
You will need to build separate wheels specifically for the free-threaded
build.  If you currently use the stable ABI, you can continue to build a
single wheel for multiple non-free-threaded Python versions.
@end quotation
@end cartouche

@node Windows<87>,,Limited C API and Stable ABI,Building Extensions for the Free-Threaded Build
@anchor{howto/free-threading-extensions windows}@anchor{5c10}
@subsubsection Windows


Due to a limitation of the official Windows installer, you will need to
manually define @code{Py_GIL_DISABLED=1} when building extensions from source.


@subsubheading See also


Porting Extension Modules to Support Free-Threading@footnote{https://py-free-threading.github.io/porting/}:
A community-maintained porting guide for extension authors.


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Remote debugging attachment protocol,Permission requirements,C API Extension Support for Free Threading,Python HOWTOs
@anchor{howto/remote_debugging doc}@anchor{5c11}@anchor{howto/remote_debugging remote-debugging}@anchor{4c86}@anchor{howto/remote_debugging remote-debugging-attachment-protocol}@anchor{5c12}@anchor{howto/remote_debugging translation-repo}@anchor{5c13}
@section Remote debugging attachment protocol


This protocol enables external tools to attach to a running CPython process and
execute Python code remotely.

Most platforms require elevated privileges to attach to another Python process.

@menu
* Disabling remote debugging:: 

@end menu

@node Disabling remote debugging,,,Remote debugging attachment protocol
@anchor{howto/remote_debugging disabling-remote-debugging}@anchor{5c14}
@subsection Disabling remote debugging


To disable remote debugging support, use any of the following:


@itemize *

@item 
Set the 
@geindex PYTHON_DISABLE_REMOTE_DEBUG
@geindex environment variable; PYTHON_DISABLE_REMOTE_DEBUG
@ref{16f,,PYTHON_DISABLE_REMOTE_DEBUG} environment variable to @code{1} before
starting the interpreter.

@item 
Use the @ref{170,,-X disable_remote_debug} command-line option.

@item 
Compile Python with the @ref{171,,--without-remote-debug} build flag.
@end itemize

@node Permission requirements,Locating the PyRuntime structure,Remote debugging attachment protocol,Python HOWTOs
@anchor{howto/remote_debugging id1}@anchor{5c15}@anchor{howto/remote_debugging permission-requirements}@anchor{5c16}
@section Permission requirements


Attaching to a running Python process for remote debugging requires elevated
privileges on most platforms. The specific requirements and troubleshooting
steps depend on your operating system:

@subsubheading Linux


The tracer process must have the @code{CAP_SYS_PTRACE} capability or equivalent
privileges. You can only trace processes you own and can signal. Tracing may
fail if the process is already being traced, or if it is running with
set-user-ID or set-group-ID. Security modules like Yama may further restrict
tracing.

To temporarily relax ptrace restrictions (until reboot), run:

@quotation

@code{echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope}
@end quotation

@cartouche
@quotation Note 
Disabling @code{ptrace_scope} reduces system hardening and should only be done
in trusted environments.
@end quotation
@end cartouche

If running inside a container, use @code{--cap-add=SYS_PTRACE} or
@code{--privileged}, and run as root if needed.

Try re-running the command with elevated privileges:

@quotation

@code{sudo -E !!}
@end quotation

@subsubheading macOS


To attach to another process, you typically need to run your debugging tool
with elevated privileges. This can be done by using @code{sudo} or running as
root.

Even when attaching to processes you own, macOS may block debugging unless
the debugger is run with root privileges due to system security restrictions.

@subsubheading Windows


To attach to another process, you usually need to run your debugging tool
with administrative privileges. Start the command prompt or terminal as
Administrator.

Some processes may still be inaccessible even with Administrator rights,
unless you have the @code{SeDebugPrivilege} privilege enabled.

To resolve file or folder access issues, adjust the security permissions:

@quotation


@enumerate 

@item 
Right-click the file or folder and select `Properties'.

@item 
Go to the `Security' tab to view users and groups with access.

@item 
Click `Edit' to modify permissions.

@item 
Select your user account.

@item 
In `Permissions', check `Read' or `Full control' as needed.

@item 
Click `Apply', then `OK' to confirm.
@end enumerate
@end quotation

@cartouche
@quotation Note 
Ensure you’ve satisfied all @ref{5c16,,Permission requirements} before proceeding.
@end quotation
@end cartouche

This section describes the low-level protocol that enables external tools to
inject and execute a Python script within a running CPython process.

This mechanism forms the basis of the @ref{16e,,sys.remote_exec()} function, which
instructs a remote Python process to execute a @code{.py} file. However, this
section does not document the usage of that function. Instead, it provides a
detailed explanation of the underlying protocol, which takes as input the
@code{pid} of a target Python process and the path to a Python source file to be
executed. This information supports independent reimplementation of the
protocol, regardless of programming language.

@cartouche
@quotation Warning 
The execution of the injected script depends on the interpreter reaching a
safe evaluation point. As a result, execution may be delayed depending on
the runtime state of the target process.
@end quotation
@end cartouche

Once injected, the script is executed by the interpreter within the target
process the next time a safe evaluation point is reached. This approach enables
remote execution capabilities without modifying the behavior or structure of
the running Python application.

Subsequent sections provide a step-by-step description of the protocol,
including techniques for locating interpreter structures in memory, safely
accessing internal fields, and triggering code execution. Platform-specific
variations are noted where applicable, and example implementations are included
to clarify each operation.

@node Locating the PyRuntime structure,Reading _Py_DebugOffsets,Permission requirements,Python HOWTOs
@anchor{howto/remote_debugging locating-the-pyruntime-structure}@anchor{5c17}
@section Locating the PyRuntime structure


CPython places the @code{PyRuntime} structure in a dedicated binary section to
help external tools find it at runtime. The name and format of this section
vary by platform. For example, @code{.PyRuntime} is used on ELF systems, and
@code{__DATA,__PyRuntime} is used on macOS. Tools can find the offset of this
structure by examining the binary on disk.

The @code{PyRuntime} structure contains CPython’s global interpreter state and
provides access to other internal data, including the list of interpreters,
thread states, and debugger support fields.

To work with a remote Python process, a debugger must first find the memory
address of the @code{PyRuntime} structure in the target process. This address
can’t be hardcoded or calculated from a symbol name, because it depends on
where the operating system loaded the binary.

The method for finding @code{PyRuntime} depends on the platform, but the steps are
the same in general:


@enumerate 

@item 
Find the base address where the Python binary or shared library was loaded
in the target process.

@item 
Use the on-disk binary to locate the offset of the @code{.PyRuntime} section.

@item 
Add the section offset to the base address to compute the address in memory.
@end enumerate

The sections below explain how to do this on each supported platform and
include example code.

@subsubheading Linux (ELF)


To find the @code{PyRuntime} structure on Linux:


@enumerate 

@item 
Read the process’s memory map (for example, @code{/proc/<pid>/maps}) to find
the address where the Python executable or @code{libpython} was loaded.

@item 
Parse the ELF section headers in the binary to get the offset of the
@code{.PyRuntime} section.

@item 
Add that offset to the base address from step 1 to get the memory address of
@code{PyRuntime}.
@end enumerate

The following is an example implementation:

@example
def find_py_runtime_linux(pid: int) -> int:
    # Step 1: Try to find the Python executable in memory
    binary_path, base_address = find_mapped_binary(
        pid, name_contains="python"
    )

    # Step 2: Fallback to shared library if executable is not found
    if binary_path is None:
        binary_path, base_address = find_mapped_binary(
            pid, name_contains="libpython"
        )

    # Step 3: Parse ELF headers to get .PyRuntime section offset
    section_offset = parse_elf_section_offset(
        binary_path, ".PyRuntime"
    )

    # Step 4: Compute PyRuntime address in memory
    return base_address + section_offset
@end example

On Linux systems, there are two main approaches to read memory from another
process. The first is through the @code{/proc} filesystem, specifically by reading from
@code{/proc/[pid]/mem} which provides direct access to the process’s memory. This
requires appropriate permissions - either being the same user as the target
process or having root access. The second approach is using the
@code{process_vm_readv()} system call which provides a more efficient way to copy
memory between processes. While ptrace’s @code{PTRACE_PEEKTEXT} operation can also be
used to read memory, it is significantly slower as it only reads one word at a
time and requires multiple context switches between the tracer and tracee
processes.

For parsing ELF sections, the process involves reading and interpreting the ELF
file format structures from the binary file on disk. The ELF header contains a
pointer to the section header table. Each section header contains metadata about
a section including its name (stored in a separate string table), offset, and
size. To find a specific section like .PyRuntime, you need to walk through these
headers and match the section name. The section header then provides the offset
where that section exists in the file, which can be used to calculate its
runtime address when the binary is loaded into memory.

You can read more about the ELF file format in the ELF specification@footnote{https://en.wikipedia.org/wiki/Executable_and_Linkable_Format}.

@subsubheading macOS (Mach-O)


To find the @code{PyRuntime} structure on macOS:


@enumerate 

@item 
Call @code{task_for_pid()} to get the @code{mach_port_t} task port for the target
process. This handle is needed to read memory using APIs like
@code{mach_vm_read_overwrite} and @code{mach_vm_region}.

@item 
Scan the memory regions to find the one containing the Python executable or
@code{libpython}.

@item 
Load the binary file from disk and parse the Mach-O headers to find the
section named @code{PyRuntime} in the @code{__DATA} segment.  On macOS, symbol
names are automatically prefixed with an underscore, so the @code{PyRuntime}
symbol appears as @code{_PyRuntime} in the symbol table, but the section name
is not affected.
@end enumerate

The following is an example implementation:

@example
def find_py_runtime_macos(pid: int) -> int:
    # Step 1: Get access to the process's memory
    handle = get_memory_access_handle(pid)

    # Step 2: Try to find the Python executable in memory
    binary_path, base_address = find_mapped_binary(
        handle, name_contains="python"
    )

    # Step 3: Fallback to libpython if the executable is not found
    if binary_path is None:
        binary_path, base_address = find_mapped_binary(
            handle, name_contains="libpython"
        )

    # Step 4: Parse Mach-O headers to get __DATA,__PyRuntime section offset
    section_offset = parse_macho_section_offset(
        binary_path, "__DATA", "__PyRuntime"
    )

    # Step 5: Compute the PyRuntime address in memory
    return base_address + section_offset
@end example

On macOS, accessing another process’s memory requires using Mach-O specific APIs
and file formats. The first step is obtaining a @code{task_port} handle via
@code{task_for_pid()}, which provides access to the target process’s memory space.
This handle enables memory operations through APIs like
@code{mach_vm_read_overwrite()}.

The process memory can be examined using @code{mach_vm_region()} to scan through the
virtual memory space, while @code{proc_regionfilename()} helps identify which binary
files are loaded at each memory region. When the Python binary or library is
found, its Mach-O headers need to be parsed to locate the @code{PyRuntime} structure.

The Mach-O format organizes code and data into segments and sections. The
@code{PyRuntime} structure lives in a section named @code{__PyRuntime} within the
@code{__DATA} segment. The actual runtime address calculation involves finding the
@code{__TEXT} segment which serves as the binary’s base address, then locating the
@code{__DATA} segment containing our target section. The final address is computed by
combining the base address with the appropriate section offsets from the Mach-O
headers.

Note that accessing another process’s memory on macOS typically requires
elevated privileges - either root access or special security entitlements
granted to the debugging process.

@subsubheading Windows (PE)


To find the @code{PyRuntime} structure on Windows:


@enumerate 

@item 
Use the ToolHelp API to enumerate all modules loaded in the target process.
This is done using functions such as CreateToolhelp32Snapshot@footnote{https://learn.microsoft.com/en-us/windows/win32/api/tlhelp32/nf-tlhelp32-createtoolhelp32snapshot},
Module32First@footnote{https://learn.microsoft.com/en-us/windows/win32/api/tlhelp32/nf-tlhelp32-module32first},
and Module32Next@footnote{https://learn.microsoft.com/en-us/windows/win32/api/tlhelp32/nf-tlhelp32-module32next}.

@item 
Identify the module corresponding to @code{python.exe} or
@code{python`XY'.dll}, where @code{X} and @code{Y} are the major and minor
version numbers of the Python version, and record its base address.

@item 
Locate the @code{PyRuntim} section. Due to the PE format’s 8-character limit
on section names (defined as @code{IMAGE_SIZEOF_SHORT_NAME}), the original
name @code{PyRuntime} is truncated. This section contains the @code{PyRuntime}
structure.

@item 
Retrieve the section’s relative virtual address (RVA) and add it to the base
address of the module.
@end enumerate

The following is an example implementation:

@example
def find_py_runtime_windows(pid: int) -> int:
    # Step 1: Try to find the Python executable in memory
    binary_path, base_address = find_loaded_module(
        pid, name_contains="python"
    )

    # Step 2: Fallback to shared pythonXY.dll if the executable is not
    # found
    if binary_path is None:
        binary_path, base_address = find_loaded_module(
            pid, name_contains="python3"
        )

    # Step 3: Parse PE section headers to get the RVA of the PyRuntime
    # section. The section name appears as "PyRuntim" due to the
    # 8-character limit defined by the PE format (IMAGE_SIZEOF_SHORT_NAME).
    section_rva = parse_pe_section_offset(binary_path, "PyRuntim")

    # Step 4: Compute PyRuntime address in memory
    return base_address + section_rva
@end example

On Windows, accessing another process’s memory requires using the Windows API
functions like @code{CreateToolhelp32Snapshot()} and @code{Module32First()/Module32Next()}
to enumerate loaded modules. The @code{OpenProcess()} function provides a handle to
access the target process’s memory space, enabling memory operations through
@code{ReadProcessMemory()}.

The process memory can be examined by enumerating loaded modules to find the
Python binary or DLL. When found, its PE headers need to be parsed to locate the
@code{PyRuntime} structure.

The PE format organizes code and data into sections. The @code{PyRuntime} structure
lives in a section named “PyRuntim” (truncated from “PyRuntime” due to PE’s
8-character name limit). The actual runtime address calculation involves finding
the module’s base address from the module entry, then locating our target
section in the PE headers. The final address is computed by combining the base
address with the section’s virtual address from the PE section headers.

Note that accessing another process’s memory on Windows typically requires
appropriate privileges - either administrative access or the @code{SeDebugPrivilege}
privilege granted to the debugging process.

@node Reading _Py_DebugOffsets,Locating the interpreter and thread state,Locating the PyRuntime structure,Python HOWTOs
@anchor{howto/remote_debugging reading-py-debugoffsets}@anchor{5c18}
@section Reading _Py_DebugOffsets


Once the address of the @code{PyRuntime} structure has been determined, the next
step is to read the @code{_Py_DebugOffsets} structure located at the beginning of
the @code{PyRuntime} block.

This structure provides version-specific field offsets that are needed to
safely read interpreter and thread state memory. These offsets vary between
CPython versions and must be checked before use to ensure they are compatible.

To read and check the debug offsets, follow these steps:


@enumerate 

@item 
Read memory from the target process starting at the @code{PyRuntime} address,
covering the same number of bytes as the @code{_Py_DebugOffsets} structure.
This structure is located at the very start of the @code{PyRuntime} memory
block. Its layout is defined in CPython’s internal headers and stays the
same within a given minor version, but may change in major versions.

@item 
Check that the structure contains valid data:


@itemize -

@item 
The @code{cookie} field must match the expected debug marker.

@item 
The @code{version} field must match the version of the Python interpreter
used by the debugger.

@item 
If either the debugger or the target process is using a pre-release
version (for example, an alpha, beta, or release candidate), the versions
must match exactly.

@item 
The @code{free_threaded} field must have the same value in both the debugger
and the target process.
@end itemize

@item 
If the structure is valid, the offsets it contains can be used to locate
fields in memory. If any check fails, the debugger should stop the operation
to avoid reading memory in the wrong format.
@end enumerate

The following is an example implementation that reads and checks
@code{_Py_DebugOffsets}:

@example
def read_debug_offsets(pid: int, py_runtime_addr: int) -> DebugOffsets:
    # Step 1: Read memory from the target process at the PyRuntime address
    data = read_process_memory(
        pid, address=py_runtime_addr, size=DEBUG_OFFSETS_SIZE
    )

    # Step 2: Deserialize the raw bytes into a _Py_DebugOffsets structure
    debug_offsets = parse_debug_offsets(data)

    # Step 3: Validate the contents of the structure
    if debug_offsets.cookie != EXPECTED_COOKIE:
        raise RuntimeError("Invalid or missing debug cookie")
    if debug_offsets.version != LOCAL_PYTHON_VERSION:
        raise RuntimeError(
            "Mismatch between caller and target Python versions"
        )
    if debug_offsets.free_threaded != LOCAL_FREE_THREADED:
        raise RuntimeError("Mismatch in free-threaded configuration")

    return debug_offsets
@end example

@cartouche
@quotation Warning 
`Process suspension recommended'

To avoid race conditions and ensure memory consistency, it is strongly
recommended that the target process be suspended before performing any
operations that read or write internal interpreter state. The Python runtime
may concurrently mutate interpreter data structures—such as creating or
destroying threads—during normal execution. This can result in invalid
memory reads or writes.

A debugger may suspend execution by attaching to the process with @code{ptrace}
or by sending a @code{SIGSTOP} signal. Execution should only be resumed after
debugger-side memory operations are complete.

@cartouche
@quotation Note 
Some tools, such as profilers or sampling-based debuggers, may operate on
a running process without suspension. In such cases, tools must be
explicitly designed to handle partially updated or inconsistent memory.
For most debugger implementations, suspending the process remains the
safest and most robust approach.
@end quotation
@end cartouche
@end quotation
@end cartouche

@node Locating the interpreter and thread state,Writing control information,Reading _Py_DebugOffsets,Python HOWTOs
@anchor{howto/remote_debugging locating-the-interpreter-and-thread-state}@anchor{5c19}
@section Locating the interpreter and thread state


Before code can be injected and executed in a remote Python process, the
debugger must choose a thread in which to schedule execution. This is necessary
because the control fields used to perform remote code injection are located in
the @code{_PyRemoteDebuggerSupport} structure, which is embedded in a
@code{PyThreadState} object. These fields are modified by the debugger to request
execution of injected scripts.

The @code{PyThreadState} structure represents a thread running inside a Python
interpreter.  It maintains the thread’s evaluation context and contains the
fields required for debugger coordination.  Locating a valid @code{PyThreadState}
is therefore a key prerequisite for triggering execution remotely.

A thread is typically selected based on its role or ID. In most cases, the main
thread is used, but some tools may target a specific thread by its native
thread ID. Once the target thread is chosen, the debugger must locate both the
interpreter and the associated thread state structures in memory.

The relevant internal structures are defined as follows:


@itemize -

@item 
@code{PyInterpreterState} represents an isolated Python interpreter instance.
Each interpreter maintains its own set of imported modules, built-in state,
and thread state list. Although most Python applications use a single
interpreter, CPython supports multiple interpreters in the same process.

@item 
@code{PyThreadState} represents a thread running within an interpreter. It
contains execution state and the control fields used by the debugger.
@end itemize

To locate a thread:


@enumerate 

@item 
Use the offset @code{runtime_state.interpreters_head} to obtain the address of
the first interpreter in the @code{PyRuntime} structure. This is the entry point
to the linked list of active interpreters.

@item 
Use the offset @code{interpreter_state.threads_main} to access the main thread
state associated with the selected interpreter. This is typically the most
reliable thread to target.

@item 
Optionally, use the offset @code{interpreter_state.threads_head} to iterate
through the linked list of all thread states. Each @code{PyThreadState}
structure contains a @code{native_thread_id} field, which may be compared to
a target thread ID to find a specific thread.

@item 
Once a valid @code{PyThreadState} has been found, its address can be used in
later steps of the protocol, such as writing debugger control fields and
scheduling execution.
@end enumerate

The following is an example implementation that locates the main thread state:

@example
def find_main_thread_state(
    pid: int, py_runtime_addr: int, debug_offsets: DebugOffsets,
) -> int:
    # Step 1: Read interpreters_head from PyRuntime
    interp_head_ptr = (
        py_runtime_addr + debug_offsets.runtime_state.interpreters_head
    )
    interp_addr = read_pointer(pid, interp_head_ptr)
    if interp_addr == 0:
        raise RuntimeError("No interpreter found in the target process")

    # Step 2: Read the threads_main pointer from the interpreter
    threads_main_ptr = (
        interp_addr + debug_offsets.interpreter_state.threads_main
    )
    thread_state_addr = read_pointer(pid, threads_main_ptr)
    if thread_state_addr == 0:
        raise RuntimeError("Main thread state is not available")

    return thread_state_addr
@end example

The following example demonstrates how to locate a thread by its native thread
ID:

@example
def find_thread_by_id(
    pid: int,
    interp_addr: int,
    debug_offsets: DebugOffsets,
    target_tid: int,
) -> int:
    # Start at threads_head and walk the linked list
    thread_ptr = read_pointer(
        pid,
        interp_addr + debug_offsets.interpreter_state.threads_head
    )

    while thread_ptr:
        native_tid_ptr = (
            thread_ptr + debug_offsets.thread_state.native_thread_id
        )
        native_tid = read_int(pid, native_tid_ptr)
        if native_tid == target_tid:
            return thread_ptr
        thread_ptr = read_pointer(
            pid,
            thread_ptr + debug_offsets.thread_state.next
        )

    raise RuntimeError("Thread with the given ID was not found")
@end example

Once a valid thread state has been located, the debugger can proceed with
modifying its control fields and scheduling execution, as described in the next
section.

@node Writing control information,Summary,Locating the interpreter and thread state,Python HOWTOs
@anchor{howto/remote_debugging writing-control-information}@anchor{5c1a}
@section Writing control information


Once a valid @code{PyThreadState} structure has been identified, the debugger may
modify control fields within it to schedule the execution of a specified Python
script. These control fields are checked periodically by the interpreter, and
when set correctly, they trigger the execution of remote code at a safe point
in the evaluation loop.

Each @code{PyThreadState} contains a @code{_PyRemoteDebuggerSupport} structure used
for communication between the debugger and the interpreter. The locations of
its fields are defined by the @code{_Py_DebugOffsets} structure and include the
following:


@itemize -

@item 
@code{debugger_script_path}: A fixed-size buffer that holds the full path to a
Python source file (@code{.py}).  This file must be accessible and readable by
the target process when execution is triggered.

@item 
@code{debugger_pending_call}: An integer flag. Setting this to @code{1} tells the
interpreter that a script is ready to be executed.

@item 
@code{eval_breaker}: A field checked by the interpreter during execution.
Setting bit 5 (@code{_PY_EVAL_PLEASE_STOP_BIT}, value @code{1U << 5}) in this
field causes the interpreter to pause and check for debugger activity.
@end itemize

To complete the injection, the debugger must perform the following steps:


@enumerate 

@item 
Write the full script path into the @code{debugger_script_path} buffer.

@item 
Set @code{debugger_pending_call} to @code{1}.

@item 
Read the current value of @code{eval_breaker}, set bit 5
(@code{_PY_EVAL_PLEASE_STOP_BIT}), and write the updated value back. This
signals the interpreter to check for debugger activity.
@end enumerate

The following is an example implementation:

@example
def inject_script(
    pid: int,
    thread_state_addr: int,
    debug_offsets: DebugOffsets,
    script_path: str
) -> None:
    # Compute the base offset of _PyRemoteDebuggerSupport
    support_base = (
        thread_state_addr +
        debug_offsets.debugger_support.remote_debugger_support
    )

    # Step 1: Write the script path into debugger_script_path
    script_path_ptr = (
        support_base +
        debug_offsets.debugger_support.debugger_script_path
    )
    write_string(pid, script_path_ptr, script_path)

    # Step 2: Set debugger_pending_call to 1
    pending_ptr = (
        support_base +
        debug_offsets.debugger_support.debugger_pending_call
    )
    write_int(pid, pending_ptr, 1)

    # Step 3: Set _PY_EVAL_PLEASE_STOP_BIT (bit 5, value 1 << 5) in
    # eval_breaker
    eval_breaker_ptr = (
        thread_state_addr +
        debug_offsets.debugger_support.eval_breaker
    )
    breaker = read_int(pid, eval_breaker_ptr)
    breaker |= (1 << 5)
    write_int(pid, eval_breaker_ptr, breaker)
@end example

Once these fields are set, the debugger may resume the process (if it was
suspended).  The interpreter will process the request at the next safe
evaluation point, load the script from disk, and execute it.

It is the responsibility of the debugger to ensure that the script file remains
present and accessible to the target process during execution.

@cartouche
@quotation Note 
Script execution is asynchronous. The script file cannot be deleted
immediately after injection. The debugger should wait until the injected
script has produced an observable effect before removing the file.
This effect depends on what the script is designed to do. For example,
a debugger might wait until the remote process connects back to a socket
before removing the script. Once such an effect is observed, it is safe to
assume the file is no longer needed.
@end quotation
@end cartouche

@node Summary,Security and threat model,Writing control information,Python HOWTOs
@anchor{howto/remote_debugging summary}@anchor{5c1b}
@section Summary


To inject and execute a Python script in a remote process:


@enumerate 

@item 
Locate the @code{PyRuntime} structure in the target process’s memory.

@item 
Read and validate the @code{_Py_DebugOffsets} structure at the beginning of
@code{PyRuntime}.

@item 
Use the offsets to locate a valid @code{PyThreadState}.

@item 
Write the path to a Python script into @code{debugger_script_path}.

@item 
Set the @code{debugger_pending_call} flag to @code{1}.

@item 
Set @code{_PY_EVAL_PLEASE_STOP_BIT} in the @code{eval_breaker} field.

@item 
Resume the process (if suspended). The script will execute at the next safe
evaluation point.
@end enumerate

@node Security and threat model,,Summary,Python HOWTOs
@anchor{howto/remote_debugging remote-debugging-threat-model}@anchor{5c1c}@anchor{howto/remote_debugging security-and-threat-model}@anchor{5c1d}
@section Security and threat model


The remote debugging protocol relies on the same operating system primitives
used by native debuggers such as GDB and LLDB.  Attaching to a process
requires the `same privileges' that those debuggers require, for example
@code{ptrace} / Yama LSM on Linux, @code{task_for_pid} on macOS, and
@code{SeDebugPrivilege} on Windows.  Python does not introduce any new privilege
escalation path; if an attacker already possesses the permissions needed to
attach to a process, they could equally use GDB to read memory or inject
code.

The following principles define what is, and is not, considered a security
vulnerability in this feature:


@table @asis

@item Attaching requires OS-level privileges

On every supported platform the operating system gates cross-process
memory access behind privilege checks (@code{CAP_SYS_PTRACE}, root, or
administrator rights).  A report that demonstrates an issue only after
these privileges have already been obtained is `not' a vulnerability in
CPython, since the OS security boundary was already crossed.

@item Crashes or memory errors when reading a compromised process are not vulnerabilities

A tool that reads internal interpreter state from a target process must
trust that memory to be well-formed.  If the target process has been
corrupted or is controlled by an attacker, the debugger or profiler may
crash, produce garbage output, or behave unpredictably.  This is the same
risk accepted by every @code{ptrace}-based debugger.  Bugs in this category
(buffer overflows, segmentation faults, or undefined behaviour triggered
by reading corrupted state) are `not' treated as security issues, though
fixes that improve robustness are welcome.

@item Vulnerabilities in the target process are not in scope

If the Python process being debugged has already been compromised, the
attacker already controls execution in that process.  Demonstrating further
impact from that starting point does not constitute a vulnerability in the
remote debugging protocol.
@end table

@menu
* When to use PYTHON_DISABLE_REMOTE_DEBUG:: 

@end menu

@node When to use PYTHON_DISABLE_REMOTE_DEBUG,,,Security and threat model
@anchor{howto/remote_debugging when-to-use-python-disable-remote-debug}@anchor{5c1e}
@subsection When to use @code{PYTHON_DISABLE_REMOTE_DEBUG}


The environment variable 
@geindex PYTHON_DISABLE_REMOTE_DEBUG
@geindex environment variable; PYTHON_DISABLE_REMOTE_DEBUG
@ref{16f,,PYTHON_DISABLE_REMOTE_DEBUG} (and the
equivalent @ref{170,,-X disable_remote_debug} flag) allows operators to disable
the in-process side of the protocol as a `defence-in-depth' measure.  This
may be useful in hardened or sandboxed deployment environments where no
debugging or profiling of the process is expected and reducing attack surface
is a priority, even though the OS-level privilege checks already prevent
unprivileged access.

Setting this variable does `not' affect other OS-level debugging interfaces
(@code{ptrace}, @code{/proc}, @code{task_for_pid}, etc.), which remain available
according to their own permission models.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

General:


@itemize *

@item 
@ref{382f,,A Conceptual Overview of asyncio}

@item 
@ref{9df,,Annotations Best Practices}

@item 
@ref{33e7,,Argparse Tutorial}

@item 
@ref{16f9,,Descriptor Guide}

@item 
@ref{5a5d,,Enum HOWTO}

@item 
@ref{5a8e,,Functional Programming HOWTO}

@item 
@ref{4248,,An introduction to the ipaddress module}

@item 
@ref{5aad,,Logging HOWTO}

@item 
@ref{1403,,Logging Cookbook}

@item 
@ref{27cc,,Regular expression HOWTO}

@item 
@ref{2625,,Sorting Techniques}

@item 
@ref{14b0,,Unicode HOWTO}

@item 
@ref{400d,,HOWTO Fetch Internet Resources Using The urllib Package}
@end itemize

Advanced development:


@itemize *

@item 
@ref{34da,,Curses Programming with Python}

@item 
@ref{2766,,Python support for free threading}

@item 
@ref{5be3,,C API Extension Support for Free Threading}

@item 
@ref{167,,Isolating Extension Modules}

@item 
@ref{16b6,,The Python 2.3 Method Resolution Order}

@item 
@ref{3a25,,Socket Programming HOWTO}

@item 
@ref{5bd4,,timer file descriptor HOWTO}

@item 
@ref{14ec,,Porting Extension Modules to Python 3}
@end itemize

Debugging and profiling:


@itemize *

@item 
@ref{5a4e,,Debugging C API extensions and CPython Internals with GDB}

@item 
@ref{e6c,,Instrumenting CPython with DTrace and SystemTap}

@item 
@ref{4af,,Python support for the Linux perf profiler}

@item 
@ref{4c86,,Remote debugging attachment protocol}
@end itemize

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Python Frequently Asked Questions,Deprecations,Python HOWTOs,Top
@anchor{faq/index doc}@anchor{5c1f}@anchor{faq/index faq-index}@anchor{2138}@anchor{faq/index python-frequently-asked-questions}@anchor{5c20}@anchor{faq/index translation-repo}@anchor{5c21}
@chapter Python Frequently Asked Questions


@menu
* General Python FAQ:: 
* Programming FAQ:: 
* Design and History FAQ:: 
* Library and Extension FAQ:: 
* Extending/Embedding FAQ:: 
* Python on Windows FAQ:: 
* Graphic User Interface FAQ:: 
* “Why is Python Installed on my Computer?” FAQ:: 

@end menu

@node General Python FAQ,Programming FAQ,,Python Frequently Asked Questions
@anchor{faq/general doc}@anchor{5c22}@anchor{faq/general general-python-faq}@anchor{5c23}
@section General Python FAQ



@menu
* General Information:: 
* Python in the real world:: 

@end menu

@node General Information,Python in the real world,,General Python FAQ
@anchor{faq/general general-information}@anchor{5c24}
@subsection General Information


@menu
* What is Python?:: 
* What is the Python Software Foundation?:: 
* Are there copyright restrictions on the use of Python?:: 
* Why was Python created in the first place?:: 
* What is Python good for?:: 
* How does the Python version numbering scheme work?:: 
* How do I obtain a copy of the Python source?:: 
* How do I get documentation on Python?:: 
* I’ve never programmed before. Is there a Python tutorial?: I’ve never programmed before Is there a Python tutorial?. 
* Is there a newsgroup or mailing list devoted to Python?:: 
* How do I get a beta test version of Python?:: 
* How do I submit bug reports and patches for Python?:: 
* Are there any published articles about Python that I can reference?:: 
* Are there any books on Python?:: 
* Where in the world is www.python.org located?: Where in the world is www python org located?. 
* Why is it called Python?:: 
* Do I have to like “Monty Python’s Flying Circus”?:: 

@end menu

@node What is Python?,What is the Python Software Foundation?,,General Information
@anchor{faq/general what-is-python}@anchor{5c25}
@subsubsection What is Python?


Python is an interpreted, interactive, object-oriented programming language.  It
incorporates modules, exceptions, dynamic typing, very high level dynamic data
types, and classes.  It supports multiple programming paradigms beyond
object-oriented programming, such as procedural and functional programming.
Python combines remarkable power with very clear syntax. It has interfaces to
many system calls and libraries, as well as to various window systems, and is
extensible in C or C++.  It is also usable as an extension language for
applications that need a programmable interface. Finally, Python is portable:
it runs on many Unix variants including Linux and macOS, and on Windows.

To find out more, start with @ref{1ffe,,The Python Tutorial}.  The Beginner's Guide to Python@footnote{https://wiki.python.org/moin/BeginnersGuide} links to other
introductory tutorials and resources for learning Python.

@node What is the Python Software Foundation?,Are there copyright restrictions on the use of Python?,What is Python?,General Information
@anchor{faq/general what-is-the-python-software-foundation}@anchor{5c26}
@subsubsection What is the Python Software Foundation?


The Python Software Foundation is an independent non-profit organization that
holds the copyright on Python versions 2.1 and newer.  The PSF’s mission is to
advance open source technology related to the Python programming language and to
publicize the use of Python.  The PSF’s home page is at
@indicateurl{https://www.python.org/psf/}.

Donations to the PSF are tax-exempt in the US.  If you use Python and find it
helpful, please contribute via the PSF donation page@footnote{https://www.python.org/psf/donations/}.

@node Are there copyright restrictions on the use of Python?,Why was Python created in the first place?,What is the Python Software Foundation?,General Information
@anchor{faq/general are-there-copyright-restrictions-on-the-use-of-python}@anchor{5c27}
@subsubsection Are there copyright restrictions on the use of Python?


You can do anything you want with the source, as long as you leave the
copyrights in and display those copyrights in any documentation about Python
that you produce.  If you honor the copyright rules, it’s OK to use Python for
commercial use, to sell copies of Python in source or binary form (modified or
unmodified), or to sell products that incorporate Python in some form.  We would
still like to know about all commercial use of Python, of course.

See the license page@footnote{https://docs.python.org/3/license.html} to find further
explanations and the full text of the PSF License.

The Python logo is trademarked, and in certain cases permission is required to
use it.  Consult the Trademark Usage Policy@footnote{https://www.python.org/psf/trademarks/} for more information.

@node Why was Python created in the first place?,What is Python good for?,Are there copyright restrictions on the use of Python?,General Information
@anchor{faq/general why-was-python-created-in-the-first-place}@anchor{5c28}
@subsubsection Why was Python created in the first place?


Here’s a `very' brief summary of what started it all, written by Guido van
Rossum:

@quotation

I had extensive experience with implementing an interpreted language in the
ABC group at CWI, and from working with this group I had learned a lot about
language design.  This is the origin of many Python features, including the
use of indentation for statement grouping and the inclusion of
very-high-level data types (although the details are all different in
Python).

I had a number of gripes about the ABC language, but also liked many of its
features.  It was impossible to extend the ABC language (or its
implementation) to remedy my complaints – in fact its lack of extensibility
was one of its biggest problems.  I had some experience with using Modula-2+
and talked with the designers of Modula-3 and read the Modula-3 report.
Modula-3 is the origin of the syntax and semantics used for exceptions, and
some other Python features.

I was working in the Amoeba distributed operating system group at CWI.  We
needed a better way to do system administration than by writing either C
programs or Bourne shell scripts, since Amoeba had its own system call
interface which wasn’t easily accessible from the Bourne shell.  My
experience with error handling in Amoeba made me acutely aware of the
importance of exceptions as a programming language feature.

It occurred to me that a scripting language with a syntax like ABC but with
access to the Amoeba system calls would fill the need.  I realized that it
would be foolish to write an Amoeba-specific language, so I decided that I
needed a language that was generally extensible.

During the 1989 Christmas holidays, I had a lot of time on my hand, so I
decided to give it a try.  During the next year, while still mostly working
on it in my own time, Python was used in the Amoeba project with increasing
success, and the feedback from colleagues made me add many early
improvements.

In February 1991, after just over a year of development, I decided to post to
USENET.  The rest is in the @code{Misc/HISTORY} file.
@end quotation

@node What is Python good for?,How does the Python version numbering scheme work?,Why was Python created in the first place?,General Information
@anchor{faq/general what-is-python-good-for}@anchor{5c29}
@subsubsection What is Python good for?


Python is a high-level general-purpose programming language that can be applied
to many different classes of problems.

The language comes with a large standard library that covers areas such as
string processing (regular expressions, Unicode, calculating differences between
files), internet protocols (HTTP, FTP, SMTP, XML-RPC, POP, IMAP),
software engineering (unit testing, logging, profiling, parsing
Python code), and operating system interfaces (system calls, filesystems, TCP/IP
sockets).  Look at the table of contents for @ref{14a,,The Python Standard Library} to get an idea
of what’s available.  A wide variety of third-party extensions are also
available.  Consult the Python Package Index@footnote{https://pypi.org} to
find packages of interest to you.

@node How does the Python version numbering scheme work?,How do I obtain a copy of the Python source?,What is Python good for?,General Information
@anchor{faq/general faq-version-numbering-scheme}@anchor{5c2a}@anchor{faq/general how-does-the-python-version-numbering-scheme-work}@anchor{5c2b}
@subsubsection How does the Python version numbering scheme work?


Python versions are numbered “A.B.C” or “A.B”:


@itemize *

@item 
`A' is the major version number – it is only incremented for really major
changes in the language.

@item 
`B' is the minor version number – it is incremented for less earth-shattering
changes.

@item 
`C' is the micro version number – it is incremented for each bugfix release.
@end itemize

Not all releases are bugfix releases.  In the run-up to a new feature release, a
series of development releases are made, denoted as alpha, beta, or release
candidate.  Alphas are early releases in which interfaces aren’t yet finalized;
it’s not unexpected to see an interface change between two alpha releases.
Betas are more stable, preserving existing interfaces but possibly adding new
modules, and release candidates are frozen, making no changes except as needed
to fix critical bugs.

Alpha, beta and release candidate versions have an additional suffix:


@itemize *

@item 
The suffix for an alpha version is “aN” for some small number `N'.

@item 
The suffix for a beta version is “bN” for some small number `N'.

@item 
The suffix for a release candidate version is “rcN” for some small number `N'.
@end itemize

In other words, all versions labeled `2.0aN' precede the versions labeled
`2.0bN', which precede versions labeled `2.0rcN', and `those' precede 2.0.

You may also find version numbers with a “+” suffix, e.g. “2.2+”.  These are
unreleased versions, built directly from the CPython development repository.  In
practice, after a final minor release is made, the version is incremented to the
next minor version, which becomes the “a0” version, e.g. “2.4a0”.

See the Developer's Guide@footnote{https://devguide.python.org/developer-workflow/development-cycle/}
for more information about the development cycle, and
@geindex Python Enhancement Proposals; PEP 387
PEP 387@footnote{https://peps.python.org/pep-0387/} to learn more about Python’s backward compatibility policy.  See also
the documentation for @ref{49d,,sys.version}, @ref{4c80,,sys.hexversion}, and
@ref{8b1,,sys.version_info}.

@node How do I obtain a copy of the Python source?,How do I get documentation on Python?,How does the Python version numbering scheme work?,General Information
@anchor{faq/general how-do-i-obtain-a-copy-of-the-python-source}@anchor{5c2c}
@subsubsection How do I obtain a copy of the Python source?


The latest Python source distribution is always available from python.org, at
@indicateurl{https://www.python.org/downloads/}.  The latest development sources can be obtained
at @indicateurl{https://github.com/python/cpython/}.

The source distribution is a gzipped tar file containing the complete C source,
Sphinx-formatted documentation, Python library modules, example programs, and
several useful pieces of freely distributable software.  The source will compile
and run out of the box on most UNIX platforms.

Consult the Getting Started section of the Python Developer's Guide@footnote{https://devguide.python.org/setup/} for more
information on getting the source code and compiling it.

@node How do I get documentation on Python?,I’ve never programmed before Is there a Python tutorial?,How do I obtain a copy of the Python source?,General Information
@anchor{faq/general how-do-i-get-documentation-on-python}@anchor{5c2d}
@subsubsection How do I get documentation on Python?


The standard documentation for the current stable version of Python is available
at @indicateurl{https://docs.python.org/3/}.  EPUB, plain text, and downloadable HTML versions are
also available at @indicateurl{https://docs.python.org/3/download.html}.

The documentation is written in reStructuredText and processed by the Sphinx documentation tool@footnote{https://www.sphinx-doc.org/}.  The reStructuredText source for
the documentation is part of the Python source distribution.

@node I’ve never programmed before Is there a Python tutorial?,Is there a newsgroup or mailing list devoted to Python?,How do I get documentation on Python?,General Information
@anchor{faq/general i-ve-never-programmed-before-is-there-a-python-tutorial}@anchor{5c2e}
@subsubsection I’ve never programmed before. Is there a Python tutorial?


There are numerous tutorials and books available.  The standard documentation
includes @ref{1ffe,,The Python Tutorial}.

Consult the Beginner's Guide@footnote{https://wiki.python.org/moin/BeginnersGuide} to
find information for beginning Python programmers, including lists of tutorials.

@node Is there a newsgroup or mailing list devoted to Python?,How do I get a beta test version of Python?,I’ve never programmed before Is there a Python tutorial?,General Information
@anchor{faq/general is-there-a-newsgroup-or-mailing-list-devoted-to-python}@anchor{5c2f}
@subsubsection Is there a newsgroup or mailing list devoted to Python?


There is a newsgroup, @code{comp.lang.python}, and a mailing list,
python-list@footnote{https://mail.python.org/mailman/listinfo/python-list}.  The
newsgroup and mailing list are gatewayed into each other – if you can read news
it’s unnecessary to subscribe to the mailing list.
@code{comp.lang.python} is high-traffic, receiving hundreds of postings
every day, and Usenet readers are often more able to cope with this volume.

Announcements of new software releases and events can be found in
comp.lang.python.announce, a low-traffic moderated list that receives about five
postings per day.  It’s available as the python-announce mailing list@footnote{https://mail.python.org/mailman3/lists/python-announce-list.python.org/}.

More info about other mailing lists and newsgroups
can be found at @indicateurl{https://www.python.org/community/lists/}.

@node How do I get a beta test version of Python?,How do I submit bug reports and patches for Python?,Is there a newsgroup or mailing list devoted to Python?,General Information
@anchor{faq/general how-do-i-get-a-beta-test-version-of-python}@anchor{5c30}
@subsubsection How do I get a beta test version of Python?


Alpha and beta releases are available from @indicateurl{https://www.python.org/downloads/}.  All
releases are announced on the comp.lang.python and comp.lang.python.announce
newsgroups and on the Python home page at @indicateurl{https://www.python.org/}; an RSS feed of
news is available.

You can also access the development version of Python through Git.  See
The Python Developer's Guide@footnote{https://devguide.python.org/} for details.

@node How do I submit bug reports and patches for Python?,Are there any published articles about Python that I can reference?,How do I get a beta test version of Python?,General Information
@anchor{faq/general how-do-i-submit-bug-reports-and-patches-for-python}@anchor{5c31}
@subsubsection How do I submit bug reports and patches for Python?


To report a bug or submit a patch, use the issue tracker at
@indicateurl{https://github.com/python/cpython/issues}.

For more information on how Python is developed, consult the Python Developer's Guide@footnote{https://devguide.python.org/}.

@node Are there any published articles about Python that I can reference?,Are there any books on Python?,How do I submit bug reports and patches for Python?,General Information
@anchor{faq/general are-there-any-published-articles-about-python-that-i-can-reference}@anchor{5c32}
@subsubsection Are there any published articles about Python that I can reference?


It’s probably best to cite your favorite book about Python.

The very first article@footnote{https://ir.cwi.nl/pub/18204} about Python was
written in 1991 and is now quite outdated.

@quotation

Guido van Rossum and Jelke de Boer, “Interactively Testing Remote Servers
Using the Python Programming Language”, CWI Quarterly, Volume 4, Issue 4
(December 1991), Amsterdam, pp 283–303.
@end quotation

@node Are there any books on Python?,Where in the world is www python org located?,Are there any published articles about Python that I can reference?,General Information
@anchor{faq/general are-there-any-books-on-python}@anchor{5c33}
@subsubsection Are there any books on Python?


Yes, there are many, and more are being published.  See the python.org wiki at
@indicateurl{https://wiki.python.org/moin/PythonBooks} for a list.

You can also search online bookstores for “Python” and filter out the Monty
Python references; or perhaps search for “Python” and “language”.

@node Where in the world is www python org located?,Why is it called Python?,Are there any books on Python?,General Information
@anchor{faq/general where-in-the-world-is-www-python-org-located}@anchor{5c34}
@subsubsection Where in the world is www.python.org located?


The Python project’s infrastructure is located all over the world and is managed
by the Python Infrastructure Team. Details here@footnote{https://infra.psf.io}.

@node Why is it called Python?,Do I have to like “Monty Python’s Flying Circus”?,Where in the world is www python org located?,General Information
@anchor{faq/general why-is-it-called-python}@anchor{5c35}
@subsubsection Why is it called Python?


When he began implementing Python, Guido van Rossum was also reading the
published scripts from "Monty Python's Flying Circus"@footnote{https://en.wikipedia.org/wiki/Monty_Python}, a BBC comedy series from the 1970s.  Van Rossum
thought he needed a name that was short, unique, and slightly mysterious, so he
decided to call the language Python.

@node Do I have to like “Monty Python’s Flying Circus”?,,Why is it called Python?,General Information
@anchor{faq/general do-i-have-to-like-monty-python-s-flying-circus}@anchor{5c36}
@subsubsection Do I have to like “Monty Python’s Flying Circus”?


No, but it helps.  :)

@node Python in the real world,,General Information,General Python FAQ
@anchor{faq/general python-in-the-real-world}@anchor{5c37}
@subsection Python in the real world


@menu
* How stable is Python?:: 
* How many people are using Python?:: 
* Have any significant projects been done in Python?:: 
* What new developments are expected for Python in the future?:: 
* Is it reasonable to propose incompatible changes to Python?:: 
* Is Python a good language for beginning programmers?:: 

@end menu

@node How stable is Python?,How many people are using Python?,,Python in the real world
@anchor{faq/general how-stable-is-python}@anchor{5c38}
@subsubsection How stable is Python?


Very stable.  New, stable releases have been coming out roughly every 6 to 18
months since 1991, and this seems likely to continue.  As of version 3.9,
Python will have a new feature release every 12 months (
@geindex Python Enhancement Proposals; PEP 602
PEP 602@footnote{https://peps.python.org/pep-0602/}).

The developers issue bugfix releases of older versions, so the stability of
existing releases gradually improves.  Bugfix releases, indicated by a third
component of the version number (e.g. 3.5.3, 3.6.2), are managed for stability;
only fixes for known problems are included in a bugfix release, and it’s
guaranteed that interfaces will remain the same throughout a series of bugfix
releases.

The latest stable releases can always be found on the Python download page@footnote{https://www.python.org/downloads/}.
Python 3.x is the recommended version and supported by most widely used libraries.
Python 2.x 
@geindex Python Enhancement Proposals; PEP 373
is not maintained anymore@footnote{https://peps.python.org/pep-0373/}.

@node How many people are using Python?,Have any significant projects been done in Python?,How stable is Python?,Python in the real world
@anchor{faq/general how-many-people-are-using-python}@anchor{5c39}
@subsubsection How many people are using Python?


There are probably millions of users, though it’s difficult to obtain an exact
count.

Python is available for free download, so there are no sales figures, and it’s
available from many different sites and packaged with many Linux distributions,
so download statistics don’t tell the whole story either.

The comp.lang.python newsgroup is very active, but not all Python users post to
the group or even read it.

@node Have any significant projects been done in Python?,What new developments are expected for Python in the future?,How many people are using Python?,Python in the real world
@anchor{faq/general have-any-significant-projects-been-done-in-python}@anchor{5c3a}
@subsubsection Have any significant projects been done in Python?


See @indicateurl{https://www.python.org/about/success} for a list of projects that use Python.
Consulting the proceedings for past Python conferences@footnote{https://www.python.org/community/workshops/} will reveal contributions from many
different companies and organizations.

High-profile Python projects include the Mailman mailing list manager@footnote{https://www.list.org} and the Zope application server@footnote{https://www.zope.dev}.  Several Linux distributions, most notably Red Hat@footnote{https://www.redhat.com}, have written part or all of their installer and
system administration software in Python.  Companies that use Python internally
include Google, Yahoo, and Lucasfilm Ltd.

@node What new developments are expected for Python in the future?,Is it reasonable to propose incompatible changes to Python?,Have any significant projects been done in Python?,Python in the real world
@anchor{faq/general what-new-developments-are-expected-for-python-in-the-future}@anchor{5c3b}
@subsubsection What new developments are expected for Python in the future?


See @indicateurl{https://peps.python.org/} for the Python Enhancement Proposals
(PEPs). PEPs are design documents describing a suggested new feature for Python,
providing a concise technical specification and a rationale.  Look for a PEP
titled “Python X.Y Release Schedule”, where X.Y is a version that hasn’t been
publicly released yet.

New development is discussed on the python-dev mailing list@footnote{https://mail.python.org/mailman3/lists/python-dev.python.org/}.

@node Is it reasonable to propose incompatible changes to Python?,Is Python a good language for beginning programmers?,What new developments are expected for Python in the future?,Python in the real world
@anchor{faq/general is-it-reasonable-to-propose-incompatible-changes-to-python}@anchor{5c3c}
@subsubsection Is it reasonable to propose incompatible changes to Python?


In general, no.  There are already millions of lines of Python code around the
world, so any change in the language that invalidates more than a very small
fraction of existing programs has to be frowned upon.  Even if you can provide a
conversion program, there’s still the problem of updating all documentation;
many books have been written about Python, and we don’t want to invalidate them
all at a single stroke.

Providing a gradual upgrade path is necessary if a feature has to be changed.
@geindex Python Enhancement Proposals; PEP 5
PEP 5@footnote{https://peps.python.org/pep-0005/} describes the procedure followed for introducing backward-incompatible
changes while minimizing disruption for users.

@node Is Python a good language for beginning programmers?,,Is it reasonable to propose incompatible changes to Python?,Python in the real world
@anchor{faq/general is-python-a-good-language-for-beginning-programmers}@anchor{5c3d}
@subsubsection Is Python a good language for beginning programmers?


Yes.

It is still common to start students with a procedural and statically typed
language such as Pascal, C, or a subset of C++ or Java.  Students may be better
served by learning Python as their first language.  Python has a very simple and
consistent syntax and a large standard library and, most importantly, using
Python in a beginning programming course lets students concentrate on important
programming skills such as problem decomposition and data type design.  With
Python, students can be quickly introduced to basic concepts such as loops and
procedures.  They can probably even work with user-defined objects in their very
first course.

For a student who has never programmed before, using a statically typed language
seems unnatural.  It presents additional complexity that the student must master
and slows the pace of the course.  The students are trying to learn to think
like a computer, decompose problems, design consistent interfaces, and
encapsulate data.  While learning to use a statically typed language is
important in the long term, it is not necessarily the best topic to address in
the students’ first programming course.

Many other aspects of Python make it a good first language.  Like Java, Python
has a large standard library so that students can be assigned programming
projects very early in the course that `do' something.  Assignments aren’t
restricted to the standard four-function calculator and check balancing
programs.  By using the standard library, students can gain the satisfaction of
working on realistic applications as they learn the fundamentals of programming.
Using the standard library also teaches students about code reuse.  Third-party
modules such as PyGame are also helpful in extending the students’ reach.

Python’s interactive interpreter enables students to test language features
while they’re programming.  They can keep a window with the interpreter running
while they enter their program’s source in another window.  If they can’t
remember the methods for a list, they can do something like this:

@example
>>> L = []
>>> dir(L)
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__',
'__dir__', '__doc__', '__eq__', '__format__', '__ge__',
'__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__',
'__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__',
'__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__',
'__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__',
'__sizeof__', '__str__', '__subclasshook__', 'append', 'clear',
'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove',
'reverse', 'sort']
>>> [d for d in dir(L) if '__' not in d]
['append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

>>> help(L.append)
Help on built-in function append:

append(...)
    L.append(object) -> None -- append object to end

>>> L.append(1)
>>> L
[1]
@end example

With the interpreter, documentation is never far from the student as they are
programming.

There are also good IDEs for Python.  IDLE is a cross-platform IDE for Python
that is written in Python using Tkinter.
Emacs users will be happy to know that there is a very good Python mode for
Emacs.  All of these programming environments provide syntax highlighting,
auto-indenting, and access to the interactive interpreter while coding.  Consult
the Python wiki@footnote{https://wiki.python.org/moin/PythonEditors} for a full list
of Python editing environments.

If you want to discuss Python’s use in education, you may be interested in
joining the edu-sig mailing list@footnote{https://www.python.org/community/sigs/current/edu-sig}.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Programming FAQ,Design and History FAQ,General Python FAQ,Python Frequently Asked Questions
@anchor{faq/programming doc}@anchor{5c3e}@anchor{faq/programming programming-faq}@anchor{5c3f}@anchor{faq/programming translation-repo}@anchor{5c40}
@section Programming FAQ



@menu
* General questions:: 
* Core language:: 
* Numbers and strings:: 
* Performance: Performance<4>. 
* Sequences (tuples/lists): Sequences tuples/lists. 
* Objects:: 
* Modules: Modules<5>. 

@end menu

@node General questions,Core language,,Programming FAQ
@anchor{faq/programming general-questions}@anchor{5c41}
@subsection General questions


@menu
* Is there a source code-level debugger with breakpoints and single-stepping?:: 
* Are there tools to help find bugs or perform static analysis?:: 
* How can I create a stand-alone binary from a Python script?:: 
* Are there coding standards or a style guide for Python programs?:: 

@end menu

@node Is there a source code-level debugger with breakpoints and single-stepping?,Are there tools to help find bugs or perform static analysis?,,General questions
@anchor{faq/programming is-there-a-source-code-level-debugger-with-breakpoints-and-single-stepping}@anchor{5c42}
@subsubsection Is there a source code-level debugger with breakpoints and single-stepping?


Yes.

Several debuggers for Python are described below, and the built-in function
@ref{273,,breakpoint()} allows you to drop into any of them.

The pdb module is a simple but adequate console-mode debugger for Python. It is
part of the standard Python library, and is @ref{aa,,documented in the Library Reference Manual}. You can also write your own debugger by using the code
for pdb as an example.

The IDLE interactive development environment, which is part of the standard
Python distribution (normally available as @ref{77,,idlelib}),
includes a graphical debugger.

PythonWin is a Python IDE that includes a GUI debugger based on pdb.  The
PythonWin debugger colors breakpoints and has quite a few cool features such as
debugging non-PythonWin programs.  PythonWin is available as part of
pywin32@footnote{https://github.com/mhammond/pywin32} project and
as a part of the
ActivePython@footnote{https://www.activestate.com/products/python/} distribution.

Eric@footnote{https://eric-ide.python-projects.org/} is an IDE built on PyQt
and the Scintilla editing component.

trepan3k@footnote{https://github.com/rocky/python3-trepan/} is a gdb-like debugger.

Visual Studio Code@footnote{https://code.visualstudio.com/} is an IDE with debugging
tools that integrates with version-control software.

There are a number of commercial Python IDEs that include graphical debuggers.
They include:


@itemize *

@item 
Wing IDE@footnote{https://wingware.com/}

@item 
PyCharm@footnote{https://www.jetbrains.com/pycharm/}
@end itemize

@node Are there tools to help find bugs or perform static analysis?,How can I create a stand-alone binary from a Python script?,Is there a source code-level debugger with breakpoints and single-stepping?,General questions
@anchor{faq/programming are-there-tools-to-help-find-bugs-or-perform-static-analysis}@anchor{5c43}
@subsubsection Are there tools to help find bugs or perform static analysis?


Yes.

Ruff@footnote{https://docs.astral.sh/ruff/},
Pylint@footnote{https://pylint.readthedocs.io/} and
Pyflakes@footnote{https://github.com/PyCQA/pyflakes} do basic checking that will
help you catch bugs sooner.

Static type checkers such as mypy@footnote{https://mypy-lang.org/},
ty@footnote{https://docs.astral.sh/ty/},
Pyrefly@footnote{https://pyrefly.org/}, and
pytype@footnote{https://github.com/google/pytype} can check type hints in Python
source code.

@node How can I create a stand-alone binary from a Python script?,Are there coding standards or a style guide for Python programs?,Are there tools to help find bugs or perform static analysis?,General questions
@anchor{faq/programming faq-create-standalone-binary}@anchor{5c44}@anchor{faq/programming how-can-i-create-a-stand-alone-binary-from-a-python-script}@anchor{5c45}
@subsubsection How can I create a stand-alone binary from a Python script?


You don’t need the ability to compile Python to C code if all you want is a
stand-alone program that users can download and run without having to install
the Python distribution first.  There are a number of tools that determine the
set of modules required by a program and bind these modules together with a
Python binary to produce a single executable.

One is to use the freeze tool, which is included in the Python source tree as
Tools/freeze@footnote{https://github.com/python/cpython/tree/3.14/Tools/freeze}.
It converts Python byte code to C arrays; with a C compiler you can
embed all your modules into a new program, which is then linked with the
standard Python modules.

It works by scanning your source recursively for import statements (in both
forms) and looking for the modules in the standard Python path as well as in the
source directory (for built-in modules).  It then turns the bytecode for modules
written in Python into C code (array initializers that can be turned into code
objects using the marshal module) and creates a custom-made config file that
only contains those built-in modules which are actually used in the program.  It
then compiles the generated C code and links it with the rest of the Python
interpreter to form a self-contained binary which acts exactly like your script.

The following packages can help with the creation of console and GUI
executables:


@itemize *

@item 
Nuitka@footnote{https://nuitka.net/} (Cross-platform)

@item 
PyInstaller@footnote{https://pyinstaller.org/} (Cross-platform)

@item 
PyOxidizer@footnote{https://pyoxidizer.readthedocs.io/en/stable/} (Cross-platform)

@item 
cx_Freeze@footnote{https://marcelotduarte.github.io/cx_Freeze/} (Cross-platform)

@item 
py2app@footnote{https://github.com/ronaldoussoren/py2app} (macOS only)

@item 
py2exe@footnote{https://www.py2exe.org/} (Windows only)
@end itemize

@node Are there coding standards or a style guide for Python programs?,,How can I create a stand-alone binary from a Python script?,General questions
@anchor{faq/programming are-there-coding-standards-or-a-style-guide-for-python-programs}@anchor{5c46}
@subsubsection Are there coding standards or a style guide for Python programs?


Yes.  The coding style required for standard library modules is documented as
@geindex Python Enhancement Proposals; PEP 8
PEP 8@footnote{https://peps.python.org/pep-0008/}.

@node Core language,Numbers and strings,General questions,Programming FAQ
@anchor{faq/programming core-language}@anchor{5c47}
@subsection Core language


@menu
* Why am I getting an UnboundLocalError when the variable has a value?:: 
* What are the rules for local and global variables in Python?:: 
* Why do lambdas defined in a loop with different values all return the same result?:: 
* How do I share global variables across modules?:: 
* What are the “best practices” for using import in a module?:: 
* Why are default values shared between objects?:: 
* How can I pass optional or keyword parameters from one function to another?:: 
* What is the difference between arguments and parameters?:: 
* Why did changing list ‘y’ also change list ‘x’?:: 
* How do I write a function with output parameters (call by reference)?: How do I write a function with output parameters call by reference ?. 
* How do you make a higher order function in Python?:: 
* How do I copy an object in Python?:: 
* How can I find the methods or attributes of an object?:: 
* How can my code discover the name of an object?:: 
* What’s up with the comma operator’s precedence?:: 
* Is there an equivalent of C’s “?;” ternary operator?: Is there an equivalent of C’s “? ” ternary operator?. 
* Is it possible to write obfuscated one-liners in Python?:: 
* What does the slash(/) in the parameter list of a function mean?: What does the slash / in the parameter list of a function mean?. 

@end menu

@node Why am I getting an UnboundLocalError when the variable has a value?,What are the rules for local and global variables in Python?,,Core language
@anchor{faq/programming faq-unboundlocalerror}@anchor{2473}@anchor{faq/programming why-am-i-getting-an-unboundlocalerror-when-the-variable-has-a-value}@anchor{5c48}
@subsubsection Why am I getting an UnboundLocalError when the variable has a value?


It can be a surprise to get the @ref{1742,,UnboundLocalError} in previously working
code when it is modified by adding an assignment statement somewhere in
the body of a function.

This code:

@example
>>> x = 10
>>> def bar():
...     print(x)
...
>>> bar()
10
@end example

works, but this code:

@example
>>> x = 10
>>> def foo():
...     print(x)
...     x += 1
@end example

results in an @code{UnboundLocalError}:

@example
>>> foo()
Traceback (most recent call last):
  ...
UnboundLocalError: cannot access local variable 'x' where it is not associated with a value
@end example

This is because when you make an assignment to a variable in a scope, that
variable becomes local to that scope and shadows any similarly named variable
in the outer scope.  Since the last statement in foo assigns a new value to
@code{x}, the compiler recognizes it as a local variable.  Consequently when the
earlier @code{print(x)} attempts to print the uninitialized local variable and
an error results.

In the example above you can access the outer scope variable by declaring it
global:

@example
>>> x = 10
>>> def foobar():
...     global x
...     print(x)
...     x += 1
...
>>> foobar()
10
@end example

This explicit declaration is required in order to remind you that (unlike the
superficially analogous situation with class and instance variables) you are
actually modifying the value of the variable in the outer scope:

@example
>>> print(x)
11
@end example

You can do a similar thing in a nested scope using the @ref{14b3,,nonlocal}
keyword:

@example
>>> def foo():
...    x = 10
...    def bar():
...        nonlocal x
...        print(x)
...        x += 1
...    bar()
...    print(x)
...
>>> foo()
10
11
@end example

@node What are the rules for local and global variables in Python?,Why do lambdas defined in a loop with different values all return the same result?,Why am I getting an UnboundLocalError when the variable has a value?,Core language
@anchor{faq/programming what-are-the-rules-for-local-and-global-variables-in-python}@anchor{5c49}
@subsubsection What are the rules for local and global variables in Python?


In Python, variables that are only referenced inside a function are implicitly
global.  If a variable is assigned a value anywhere within the function’s body,
it’s assumed to be a local unless explicitly declared as global.

Though a bit surprising at first, a moment’s consideration explains this.  On
one hand, requiring @ref{4ad,,global} for assigned variables provides a bar
against unintended side-effects.  On the other hand, if @code{global} was required
for all global references, you’d be using @code{global} all the time.  You’d have
to declare as global every reference to a built-in function or to a component of
an imported module.  This clutter would defeat the usefulness of the @code{global}
declaration for identifying side-effects.

@node Why do lambdas defined in a loop with different values all return the same result?,How do I share global variables across modules?,What are the rules for local and global variables in Python?,Core language
@anchor{faq/programming why-do-lambdas-defined-in-a-loop-with-different-values-all-return-the-same-result}@anchor{5c4a}
@subsubsection Why do lambdas defined in a loop with different values all return the same result?


Assume you use a for loop to define a few different lambdas (or even plain
functions), for example:

@example
>>> squares = []
>>> for x in range(5):
...     squares.append(lambda: x**2)
@end example

This gives you a list that contains 5 lambdas that calculate @code{x**2}.  You
might expect that, when called, they would return, respectively, @code{0}, @code{1},
@code{4}, @code{9}, and @code{16}.  However, when you actually try you will see that
they all return @code{16}:

@example
>>> squares[2]()
16
>>> squares[4]()
16
@end example

This happens because @code{x} is not local to the lambdas, but is defined in
the outer scope, and it is accessed when the lambda is called — not when it
is defined.  At the end of the loop, the value of @code{x} is @code{4}, so all the
functions now return @code{4**2}, that is @code{16}.  You can also verify this by
changing the value of @code{x} and see how the results of the lambdas change:

@example
>>> x = 8
>>> squares[2]()
64
@end example

In order to avoid this, you need to save the values in variables local to the
lambdas, so that they don’t rely on the value of the global @code{x}:

@example
>>> squares = []
>>> for x in range(5):
...     squares.append(lambda n=x: n**2)
@end example

Here, @code{n=x} creates a new variable @code{n} local to the lambda and computed
when the lambda is defined so that it has the same value that @code{x} had at
that point in the loop.  This means that the value of @code{n} will be @code{0}
in the first lambda, @code{1} in the second, @code{2} in the third, and so on.
Therefore each lambda will now return the correct result:

@example
>>> squares[2]()
4
>>> squares[4]()
16
@end example

Note that this behaviour is not peculiar to lambdas, but applies to regular
functions too.

@node How do I share global variables across modules?,What are the “best practices” for using import in a module?,Why do lambdas defined in a loop with different values all return the same result?,Core language
@anchor{faq/programming how-do-i-share-global-variables-across-modules}@anchor{5c4b}
@subsubsection How do I share global variables across modules?


The canonical way to share information across modules within a single program is
to create a special module (often called config or cfg).  Just import the config
module in all modules of your application; the module then becomes available as
a global name.  Because there is only one instance of each module, any changes
made to the module object get reflected everywhere.  For example:

config.py:

@example
x = 0   # Default value of the 'x' configuration setting
@end example

mod.py:

@example
import config
config.x = 1
@end example

main.py:

@example
import config
import mod
print(config.x)
@end example

Note that using a module is also the basis for implementing the singleton design
pattern, for the same reason.

@node What are the “best practices” for using import in a module?,Why are default values shared between objects?,How do I share global variables across modules?,Core language
@anchor{faq/programming what-are-the-best-practices-for-using-import-in-a-module}@anchor{5c4c}
@subsubsection What are the “best practices” for using import in a module?


In general, don’t use @code{from modulename import *}.  Doing so clutters the
importer’s namespace, and makes it much harder for linters to detect undefined
names.

Import modules at the top of a file.  Doing so makes it clear what other modules
your code requires and avoids questions of whether the module name is in scope.
Using one import per line makes it easy to add and delete module imports, but
using multiple imports per line uses less screen space.

It’s good practice if you import modules in the following order:


@enumerate 

@item 
standard library modules – such as @ref{df,,sys}, @ref{a5,,os}, @ref{7,,argparse}, @ref{be,,re}

@item 
third-party library modules (anything installed in Python’s site-packages
directory) – such as dateutil@footnote{https://pypi.org/project/dateutil/}, requests@footnote{https://pypi.org/project/requests/}, tzdata@footnote{https://pypi.org/project/tzdata/}

@item 
locally developed modules
@end enumerate

It is sometimes necessary to move imports to a function or class to avoid
problems with circular imports.  Gordon McMillan says:

@quotation

Circular imports are fine where both modules use the “import <module>” form
of import.  They fail when the 2nd module wants to grab a name out of the
first (“from module import name”) and the import is at the top level.  That’s
because names in the 1st are not yet available, because the first module is
busy importing the 2nd.
@end quotation

In this case, if the second module is only used in one function, then the import
can easily be moved into that function.  By the time the import is called, the
first module will have finished initializing, and the second module can do its
import.

It may also be necessary to move imports out of the top level of code if some of
the modules are platform-specific.  In that case, it may not even be possible to
import all of the modules at the top of the file.  In this case, importing the
correct modules in the corresponding platform-specific code is a good option.

Only move imports into a local scope, such as inside a function definition, if
it’s necessary to solve a problem such as avoiding a circular import or are
trying to reduce the initialization time of a module.  This technique is
especially helpful if many of the imports are unnecessary depending on how the
program executes.  You may also want to move imports into a function if the
modules are only ever used in that function.  Note that loading a module the
first time may be expensive because of the one time initialization of the
module, but loading a module multiple times is virtually free, costing only a
couple of dictionary lookups.  Even if the module name has gone out of scope,
the module is probably available in @ref{1771,,sys.modules}.

@node Why are default values shared between objects?,How can I pass optional or keyword parameters from one function to another?,What are the “best practices” for using import in a module?,Core language
@anchor{faq/programming why-are-default-values-shared-between-objects}@anchor{5c4d}
@subsubsection Why are default values shared between objects?


This type of bug commonly bites neophyte programmers.  Consider this function:

@example
def foo(mydict=@{@}):  # Danger: shared reference to one dict for all calls
    ... compute something ...
    mydict[key] = value
    return mydict
@end example

The first time you call this function, @code{mydict} contains a single item.  The
second time, @code{mydict} contains two items because when @code{foo()} begins
executing, @code{mydict} starts out with an item already in it.

It is often expected that a function call creates new objects for default
values. This is not what happens. Default values are created exactly once, when
the function is defined.  If that object is changed, like the dictionary in this
example, subsequent calls to the function will refer to this changed object.

By definition, immutable objects such as numbers, strings, tuples, and @code{None},
are safe from change. Changes to mutable objects such as dictionaries, lists,
and class instances can lead to confusion.

Because of this feature, it is good programming practice to not use mutable
objects as default values.  Instead, use @code{None} as the default value and
inside the function, check if the parameter is @code{None} and create a new
list/dictionary/whatever if it is.  For example, don’t write:

@example
def foo(mydict=@{@}):
    ...
@end example

but:

@example
def foo(mydict=None):
    if mydict is None:
        mydict = @{@}  # create a new dict for local namespace
@end example

This feature can be useful.  When you have a function that’s time-consuming to
compute, a common technique is to cache the parameters and the resulting value
of each call to the function, and return the cached value if the same value is
requested again.  This is called “memoizing”, and can be implemented like this:

@example
# Callers can only provide two parameters and optionally pass _cache by keyword
def expensive(arg1, arg2, *, _cache=@{@}):
    if (arg1, arg2) in _cache:
        return _cache[(arg1, arg2)]

    # Calculate the value
    result = ... expensive computation ...
    _cache[(arg1, arg2)] = result           # Store result in the cache
    return result
@end example

You could use a global variable containing a dictionary instead of the default
value; it’s a matter of taste.

@node How can I pass optional or keyword parameters from one function to another?,What is the difference between arguments and parameters?,Why are default values shared between objects?,Core language
@anchor{faq/programming how-can-i-pass-optional-or-keyword-parameters-from-one-function-to-another}@anchor{5c4e}
@subsubsection How can I pass optional or keyword parameters from one function to another?


Collect the arguments using the @code{*} and @code{**} specifiers in the function’s
parameter list; this gives you the positional arguments as a tuple and the
keyword arguments as a dictionary.  You can then pass these arguments when
calling another function by using @code{*} and @code{**}:

@example
def f(x, *args, **kwargs):
    ...
    kwargs['width'] = '14.3c'
    ...
    g(x, *args, **kwargs)
@end example

@geindex argument; difference from parameter
@geindex parameter; difference from argument

@node What is the difference between arguments and parameters?,Why did changing list ‘y’ also change list ‘x’?,How can I pass optional or keyword parameters from one function to another?,Core language
@anchor{faq/programming faq-argument-vs-parameter}@anchor{5c4f}@anchor{faq/programming what-is-the-difference-between-arguments-and-parameters}@anchor{5c50}
@subsubsection What is the difference between arguments and parameters?


@ref{238f,,Parameters} are defined by the names that appear in a
function definition, whereas @ref{67b,,arguments} are the values
actually passed to a function when calling it.  Parameters define what
kind of arguments a function can accept.  For
example, given the function definition:

@example
def func(foo, bar=None, **kwargs):
    pass
@end example

`foo', `bar' and `kwargs' are parameters of @code{func}.  However, when calling
@code{func}, for example:

@example
func(42, bar=314, extra=somevar)
@end example

the values @code{42}, @code{314}, and @code{somevar} are arguments.

@node Why did changing list ‘y’ also change list ‘x’?,How do I write a function with output parameters call by reference ?,What is the difference between arguments and parameters?,Core language
@anchor{faq/programming why-did-changing-list-y-also-change-list-x}@anchor{5c51}
@subsubsection Why did changing list ‘y’ also change list ‘x’?


If you wrote code like:

@example
>>> x = []
>>> y = x
>>> y.append(10)
>>> y
[10]
>>> x
[10]
@end example

you might be wondering why appending an element to @code{y} changed @code{x} too.

There are two factors that produce this result:


@enumerate 

@item 
Variables are simply names that refer to objects.  Doing @code{y = x} doesn’t
create a copy of the list – it creates a new variable @code{y} that refers to
the same object @code{x} refers to.  This means that there is only one object
(the list), and both @code{x} and @code{y} refer to it.

@item 
Lists are @ref{2027,,mutable}, which means that you can change their content.
@end enumerate

After the call to @ref{241d,,append()}, the content of the mutable object has
changed from @code{[]} to @code{[10]}.  Since both the variables refer to the same
object, using either name accesses the modified value @code{[10]}.

If we instead assign an immutable object to @code{x}:

@example
>>> x = 5  # ints are immutable
>>> y = x
>>> x = x + 1  # 5 can't be mutated, we are creating a new object here
>>> x
6
>>> y
5
@end example

we can see that in this case @code{x} and @code{y} are not equal anymore.  This is
because integers are @ref{2022,,immutable}, and when we do @code{x = x + 1} we are not
mutating the int @code{5} by incrementing its value; instead, we are creating a
new object (the int @code{6}) and assigning it to @code{x} (that is, changing which
object @code{x} refers to).  After this assignment we have two objects (the ints
@code{6} and @code{5}) and two variables that refer to them (@code{x} now refers to
@code{6} but @code{y} still refers to @code{5}).

Some operations (for example @code{y.append(10)} and @code{y.sort()}) mutate the
object, whereas superficially similar operations (for example @code{y = y + [10]}
and @ref{dcd,,sorted(y)}) create a new object.  In general in Python (and in all cases
in the standard library) a method that mutates an object will return @code{None}
to help avoid getting the two types of operations confused.  So if you
mistakenly write @code{y.sort()} thinking it will give you a sorted copy of @code{y},
you’ll instead end up with @code{None}, which will likely cause your program to
generate an easily diagnosed error.

However, there is one class of operations where the same operation sometimes
has different behaviors with different types:  the augmented assignment
operators.  For example, @code{+=} mutates lists but not tuples or ints (@code{a_list
+= [1, 2, 3]} is equivalent to @code{a_list.extend([1, 2, 3])} and mutates
@code{a_list}, whereas @code{some_tuple += (1, 2, 3)} and @code{some_int += 1} create
new objects).

In other words:


@itemize *

@item 
If we have a mutable object (such as @ref{24f,,list}, @ref{184,,dict}, @ref{185,,set}),
we can use some specific operations to mutate it and all the variables
that refer to it will see the change.

@item 
If we have an immutable object (such as @ref{16a,,str}, @ref{19c,,int}, @ref{614,,tuple}),
all the variables that refer to it will always see the same value,
but operations that transform that value into a new value always return a new
object.
@end itemize

If you want to know if two variables refer to the same object or not, you can
use the @ref{34a,,is} operator, or the built-in function @ref{162f,,id()}.

@node How do I write a function with output parameters call by reference ?,How do you make a higher order function in Python?,Why did changing list ‘y’ also change list ‘x’?,Core language
@anchor{faq/programming how-do-i-write-a-function-with-output-parameters-call-by-reference}@anchor{5c52}
@subsubsection How do I write a function with output parameters (call by reference)?


Remember that arguments are passed by assignment in Python.  Since assignment
just creates references to objects, there’s no alias between an argument name in
the caller and callee, and consequently no call-by-reference.  You can achieve the
desired effect in a number of ways.


@enumerate 

@item 
By returning a tuple of the results:

@example
>>> def func1(a, b):
...     a = 'new-value'        # a and b are local names
...     b = b + 1              # assigned to new objects
...     return a, b            # return new values
...
>>> x, y = 'old-value', 99
>>> func1(x, y)
('new-value', 100)
@end example

This is almost always the clearest solution.

@item 
By using global variables.  This isn’t thread-safe, and is not recommended.

@item 
By passing a mutable (changeable in-place) object:

@example
>>> def func2(a):
...     a[0] = 'new-value'     # 'a' references a mutable list
...     a[1] = a[1] + 1        # changes a shared object
...
>>> args = ['old-value', 99]
>>> func2(args)
>>> args
['new-value', 100]
@end example

@item 
By passing in a dictionary that gets mutated:

@example
>>> def func3(args):
...     args['a'] = 'new-value'     # args is a mutable dictionary
...     args['b'] = args['b'] + 1   # change it in-place
...
>>> args = @{'a': 'old-value', 'b': 99@}
>>> func3(args)
>>> args
@{'a': 'new-value', 'b': 100@}
@end example

@item 
Or bundle up values in a class instance:

@example
>>> class Namespace:
...     def __init__(self, /, **args):
...         for key, value in args.items():
...             setattr(self, key, value)
...
>>> def func4(args):
...     args.a = 'new-value'        # args is a mutable Namespace
...     args.b = args.b + 1         # change object in-place
...
>>> args = Namespace(a='old-value', b=99)
>>> func4(args)
>>> vars(args)
@{'a': 'new-value', 'b': 100@}
@end example

There’s almost never a good reason to get this complicated.
@end enumerate

Your best choice is to return a tuple containing the multiple results.

@node How do you make a higher order function in Python?,How do I copy an object in Python?,How do I write a function with output parameters call by reference ?,Core language
@anchor{faq/programming how-do-you-make-a-higher-order-function-in-python}@anchor{5c53}
@subsubsection How do you make a higher order function in Python?


You have two choices: you can use nested scopes or you can use callable objects.
For example, suppose you wanted to define @code{linear(a,b)} which returns a
function @code{f(x)} that computes the value @code{a*x+b}.  Using nested scopes:

@example
def linear(a, b):
    def result(x):
        return a * x + b
    return result
@end example

Or using a callable object:

@example
class linear:

    def __init__(self, a, b):
        self.a, self.b = a, b

    def __call__(self, x):
        return self.a * x + self.b
@end example

In both cases,

@example
taxes = linear(0.3, 2)
@end example

gives a callable object where @code{taxes(10e6) == 0.3 * 10e6 + 2}.

The callable object approach has the disadvantage that it is a bit slower and
results in slightly longer code.  However, note that a collection of callables
can share their signature via inheritance:

@example
class exponential(linear):
    # __init__ inherited
    def __call__(self, x):
        return self.a * (x ** self.b)
@end example

Object can encapsulate state for several methods:

@example
class counter:

    value = 0

    def set(self, x):
        self.value = x

    def up(self):
        self.value = self.value + 1

    def down(self):
        self.value = self.value - 1

count = counter()
inc, dec, reset = count.up, count.down, count.set
@end example

Here @code{inc()}, @code{dec()} and @code{reset()} act like functions which share the
same counting variable.

@node How do I copy an object in Python?,How can I find the methods or attributes of an object?,How do you make a higher order function in Python?,Core language
@anchor{faq/programming how-do-i-copy-an-object-in-python}@anchor{5c54}
@subsubsection How do I copy an object in Python?


In general, try @ref{758,,copy.copy()} or @ref{d6b,,copy.deepcopy()} for the general case.
Not all objects can be copied, but most can.

Some objects can be copied more easily.  Dictionaries have a @ref{dcf,,copy()}
method:

@example
newdict = olddict.copy()
@end example

Sequences can be copied by slicing:

@example
new_l = l[:]
@end example

@node How can I find the methods or attributes of an object?,How can my code discover the name of an object?,How do I copy an object in Python?,Core language
@anchor{faq/programming how-can-i-find-the-methods-or-attributes-of-an-object}@anchor{5c55}
@subsubsection How can I find the methods or attributes of an object?


For an instance @code{x} of a user-defined class, @ref{845,,dir(x)} returns an alphabetized
list of the names containing the instance attributes and methods and attributes
defined by its class.

@node How can my code discover the name of an object?,What’s up with the comma operator’s precedence?,How can I find the methods or attributes of an object?,Core language
@anchor{faq/programming how-can-my-code-discover-the-name-of-an-object}@anchor{5c56}
@subsubsection How can my code discover the name of an object?


Generally speaking, it can’t, because objects don’t really have names.
Essentially, assignment always binds a name to a value; the same is true of
@code{def} and @code{class} statements, but in that case the value is a
callable. Consider the following code:

@example
>>> class A:
...     pass
...
>>> B = A
>>> a = B()
>>> b = a
>>> print(b)
<__main__.A object at 0x16D07CC>
>>> print(a)
<__main__.A object at 0x16D07CC>
@end example

Arguably the class has a name: even though it is bound to two names and invoked
through the name @code{B} the created instance is still reported as an instance of
class @code{A}.  However, it is impossible to say whether the instance’s name is @code{a} or
@code{b}, since both names are bound to the same value.

Generally speaking it should not be necessary for your code to “know the names”
of particular values. Unless you are deliberately writing introspective
programs, this is usually an indication that a change of approach might be
beneficial.

In comp.lang.python, Fredrik Lundh once gave an excellent analogy in answer to
this question:

@quotation

The same way as you get the name of that cat you found on your porch: the cat
(object) itself cannot tell you its name, and it doesn’t really care – so
the only way to find out what it’s called is to ask all your neighbours
(namespaces) if it’s their cat (object)…

….and don’t be surprised if you’ll find that it’s known by many names, or
no name at all!
@end quotation

@node What’s up with the comma operator’s precedence?,Is there an equivalent of C’s “? ” ternary operator?,How can my code discover the name of an object?,Core language
@anchor{faq/programming what-s-up-with-the-comma-operator-s-precedence}@anchor{5c57}
@subsubsection What’s up with the comma operator’s precedence?


Comma is not an operator in Python.  Consider this session:

@example
>>> "a" in "b", "a"
(False, 'a')
@end example

Since the comma is not an operator, but a separator between expressions the
above is evaluated as if you had entered:

@example
("a" in "b"), "a"
@end example

not:

@example
"a" in ("b", "a")
@end example

The same is true of the various assignment operators (@code{=}, @code{+=}, and so on).
They are not truly operators but syntactic delimiters in assignment statements.

@node Is there an equivalent of C’s “? ” ternary operator?,Is it possible to write obfuscated one-liners in Python?,What’s up with the comma operator’s precedence?,Core language
@anchor{faq/programming is-there-an-equivalent-of-c-s-ternary-operator}@anchor{5c58}
@subsubsection Is there an equivalent of C’s “?:” ternary operator?


Yes, there is. The syntax is as follows:

@example
[on_true] if [expression] else [on_false]

x, y = 50, 25
small = x if x < y else y
@end example

Before this syntax was introduced in Python 2.5, a common idiom was to use
logical operators:

@example
[expression] and [on_true] or [on_false]
@end example

However, this idiom is unsafe, as it can give wrong results when `on_true'
has a false boolean value.  Therefore, it is always better to use
the @code{... if ... else ...} form.

@node Is it possible to write obfuscated one-liners in Python?,What does the slash / in the parameter list of a function mean?,Is there an equivalent of C’s “? ” ternary operator?,Core language
@anchor{faq/programming is-it-possible-to-write-obfuscated-one-liners-in-python}@anchor{5c59}
@subsubsection Is it possible to write obfuscated one-liners in Python?


Yes.  Usually this is done by nesting @ref{14a9,,lambda} within
@code{lambda}.  See the following three examples, slightly adapted from Ulf Bartelt:

@example
from functools import reduce

# Primes < 1000
print(list(filter(None,map(lambda y:y*reduce(lambda x,y:x*y!=0,
map(lambda x,y=y:y%x,range(2,int(pow(y,0.5)+1))),1),range(2,1000)))))

# First 10 Fibonacci numbers
print(list(map(lambda x,f=lambda x,f:(f(x-1,f)+f(x-2,f)) if x>1 else 1:
f(x,f), range(10))))

# Mandelbrot set
print((lambda Ru,Ro,Iu,Io,IM,Sx,Sy:reduce(lambda x,y:x+'\n'+y,map(lambda y,
Iu=Iu,Io=Io,Ru=Ru,Ro=Ro,Sy=Sy,L=lambda yc,Iu=Iu,Io=Io,Ru=Ru,Ro=Ro,i=IM,
Sx=Sx,Sy=Sy:reduce(lambda x,y:x+y,map(lambda x,xc=Ru,yc=yc,Ru=Ru,Ro=Ro,
i=i,Sx=Sx,F=lambda xc,yc,x,y,k,f=lambda xc,yc,x,y,k,f:(k<=0)or (x*x+y*y
>=4.0) or 1+f(xc,yc,x*x-y*y+xc,2.0*x*y+yc,k-1,f):f(xc,yc,x,y,k,f):chr(
64+F(Ru+x*(Ro-Ru)/Sx,yc,0,0,i)),range(Sx))):L(Iu+y*(Io-Iu)/Sy),range(Sy
))))(-2.1, 0.7, -1.2, 1.2, 30, 80, 24))
#    \___ ___/  \___ ___/  |   |   |__ lines on screen
#        V          V      |   |______ columns on screen
#        |          |      |__________ maximum of "iterations"
#        |          |_________________ range on y axis
#        |____________________________ range on x axis
@end example

Don’t try this at home, kids!

@node What does the slash / in the parameter list of a function mean?,,Is it possible to write obfuscated one-liners in Python?,Core language
@anchor{faq/programming faq-positional-only-arguments}@anchor{261d}@anchor{faq/programming what-does-the-slash-in-the-parameter-list-of-a-function-mean}@anchor{5c5a}
@subsubsection What does the slash(/) in the parameter list of a function mean?


A slash in the argument list of a function denotes that the parameters prior to
it are positional-only.  Positional-only parameters are the ones without an
externally usable name.  Upon calling a function that accepts positional-only
parameters, arguments are mapped to parameters based solely on their position.
For example, @ref{b9f,,divmod()} is a function that accepts positional-only
parameters. Its documentation looks like this:

@example
>>> help(divmod)
Help on built-in function divmod in module builtins:

divmod(x, y, /)
    Return the tuple (x//y, x%y).  Invariant: div*y + mod == x.
@end example

The slash at the end of the parameter list means that both parameters are
positional-only. Thus, calling @ref{b9f,,divmod()} with keyword arguments would lead
to an error:

@example
>>> divmod(x=3, y=4)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: divmod() takes no keyword arguments
@end example

@node Numbers and strings,Performance<4>,Core language,Programming FAQ
@anchor{faq/programming numbers-and-strings}@anchor{5c5b}
@subsection Numbers and strings


@menu
* How do I specify hexadecimal and octal integers?:: 
* Why does -22 // 10 return -3?:: 
* How do I get int literal attribute instead of SyntaxError?:: 
* How do I convert a string to a number?:: 
* How do I convert a number to a string?:: 
* How do I modify a string in place?:: 
* How do I use strings to call functions/methods?:: 
* Is there an equivalent to Perl’s chomp() for removing trailing newlines from strings?: Is there an equivalent to Perl’s chomp for removing trailing newlines from strings?. 
* Is there a scanf() or sscanf() equivalent?: Is there a scanf or sscanf equivalent?. 
* What does UnicodeDecodeError or UnicodeEncodeError error mean?:: 
* Can I end a raw string with an odd number of backslashes?:: 

@end menu

@node How do I specify hexadecimal and octal integers?,Why does -22 // 10 return -3?,,Numbers and strings
@anchor{faq/programming how-do-i-specify-hexadecimal-and-octal-integers}@anchor{5c5c}
@subsubsection How do I specify hexadecimal and octal integers?


To specify an octal digit, precede the octal value with a zero, and then a lower
or uppercase “o”.  For example, to set the variable “a” to the octal value “10”
(8 in decimal), type:

@example
>>> a = 0o10
>>> a
8
@end example

Hexadecimal is just as easy.  Simply precede the hexadecimal number with a zero,
and then a lower or uppercase “x”.  Hexadecimal digits can be specified in lower
or uppercase.  For example, in the Python interpreter:

@example
>>> a = 0xa5
>>> a
165
>>> b = 0XB2
>>> b
178
@end example

@node Why does -22 // 10 return -3?,How do I get int literal attribute instead of SyntaxError?,How do I specify hexadecimal and octal integers?,Numbers and strings
@anchor{faq/programming why-does-22-10-return-3}@anchor{5c5d}
@subsubsection Why does -22 // 10 return -3?


It’s primarily driven by the desire that @code{i % j} have the same sign as @code{j}.
If you want that, and also want:

@example
i == (i // j) * j + (i % j)
@end example

then integer division has to return the floor.  C also requires that identity to
hold, and then compilers that truncate @code{i // j} need to make @code{i % j} have
the same sign as @code{i}.

There are few real use cases for @code{i % j} when @code{j} is negative.  When @code{j}
is positive, there are many, and in virtually all of them it’s more useful for
@code{i % j} to be @code{>= 0}.  If the clock says 10 now, what did it say 200 hours
ago?  @code{-190 % 12 == 2} is useful; @code{-190 % 12 == -10} is a bug waiting to
bite.

@node How do I get int literal attribute instead of SyntaxError?,How do I convert a string to a number?,Why does -22 // 10 return -3?,Numbers and strings
@anchor{faq/programming how-do-i-get-int-literal-attribute-instead-of-syntaxerror}@anchor{5c5e}
@subsubsection How do I get int literal attribute instead of SyntaxError?


Trying to lookup an @code{int} literal attribute in the normal manner gives
a @ref{18f,,SyntaxError} because the period is seen as a decimal point:

@example
>>> 1.__class__
  File "<stdin>", line 1
  1.__class__
   ^
SyntaxError: invalid decimal literal
@end example

The solution is to separate the literal from the period
with either a space or parentheses.

@example
>>> 1 .__class__
<class 'int'>
>>> (1).__class__
<class 'int'>
@end example

@node How do I convert a string to a number?,How do I convert a number to a string?,How do I get int literal attribute instead of SyntaxError?,Numbers and strings
@anchor{faq/programming how-do-i-convert-a-string-to-a-number}@anchor{5c5f}
@subsubsection How do I convert a string to a number?


For integers, use the built-in @ref{19c,,int()} type constructor, for example, @code{int('144')
== 144}.  Similarly, @ref{197,,float()} converts to a floating-point number,
for example, @code{float('144') == 144.0}.

By default, these interpret the number as decimal, so that @code{int('0144') ==
144} holds true, and @code{int('0x144')} raises @ref{2ee,,ValueError}. @code{int(string,
base)} takes the base to convert from as a second optional argument, so @code{int(
'0x144', 16) == 324}.  If the base is specified as 0, the number is interpreted
using Python’s rules: a leading ‘0o’ indicates octal, and ‘0x’ indicates a hex
number.

Do not use the built-in function @ref{4a4,,eval()} if all you need is to convert
strings to numbers.  @code{eval()} will be significantly slower and it presents a
security risk: someone could pass you a Python expression that might have
unwanted side effects.  For example, someone could pass
@code{__import__('os').system("rm -rf $HOME")} which would erase your home
directory.

@ref{4a4,,eval()} also has the effect of interpreting numbers as Python expressions,
so that, for example, @code{eval('09')} gives a syntax error because Python does not allow
leading ‘0’ in a decimal number (except ‘0’).

@node How do I convert a number to a string?,How do I modify a string in place?,How do I convert a string to a number?,Numbers and strings
@anchor{faq/programming how-do-i-convert-a-number-to-a-string}@anchor{5c60}
@subsubsection How do I convert a number to a string?


For example, to convert the number @code{144} to the string @code{'144'}, use the built-in type
constructor @ref{16a,,str()}.  If you want a hexadecimal or octal representation, use
the built-in functions @ref{14db,,hex()} or @ref{14da,,oct()}.  For fancy formatting, see
the @ref{19b,,f-strings} and @ref{15a7,,Format string syntax} sections.
For example, @code{"@{:04d@}".format(144)} yields
@code{'0144'} and @code{"@{:.3f@}".format(1.0/3.0)} yields @code{'0.333'}.

@node How do I modify a string in place?,How do I use strings to call functions/methods?,How do I convert a number to a string?,Numbers and strings
@anchor{faq/programming how-do-i-modify-a-string-in-place}@anchor{5c61}
@subsubsection How do I modify a string in place?


You can’t, because strings are immutable.  In most situations, you should
simply construct a new string from the various parts you want to assemble
it from.  However, if you need an object with the ability to modify in-place
Unicode data, try using an @ref{112f,,io.StringIO} object or the @ref{8,,array}
module:

@example
>>> import io
>>> s = "Hello, world"
>>> sio = io.StringIO(s)
>>> sio.getvalue()
'Hello, world'
>>> sio.seek(7)
7
>>> sio.write("there!")
6
>>> sio.getvalue()
'Hello, there!'

>>> import array
>>> a = array.array('w', s)
>>> print(a)
array('w', 'Hello, world')
>>> a[0] = 'y'
>>> print(a)
array('w', 'yello, world')
>>> a.tounicode()
'yello, world'
@end example

@node How do I use strings to call functions/methods?,Is there an equivalent to Perl’s chomp for removing trailing newlines from strings?,How do I modify a string in place?,Numbers and strings
@anchor{faq/programming how-do-i-use-strings-to-call-functions-methods}@anchor{5c62}
@subsubsection How do I use strings to call functions/methods?


There are various techniques.


@itemize *

@item 
The best is to use a dictionary that maps strings to functions.  The primary
advantage of this technique is that the strings do not need to match the names
of the functions.  This is also the primary technique used to emulate a case
construct:

@example
def a():
    pass

def b():
    pass

dispatch = @{'go': a, 'stop': b@}  # Note lack of parens for funcs

dispatch[get_input()]()  # Note trailing parens to call function
@end example

@item 
Use the built-in function @ref{dd0,,getattr()}:

@example
import foo
getattr(foo, 'bar')()
@end example

Note that @ref{dd0,,getattr()} works on any object, including classes, class
instances, modules, and so on.

This is used in several places in the standard library, like this:

@example
class Foo:
    def do_foo(self):
        ...

    def do_bar(self):
        ...

f = getattr(foo_instance, 'do_' + opname)
f()
@end example

@item 
Use @ref{46f,,locals()} to resolve the function name:

@example
def myFunc():
    print("hello")

fname = "myFunc"

f = locals()[fname]
f()
@end example
@end itemize

@node Is there an equivalent to Perl’s chomp for removing trailing newlines from strings?,Is there a scanf or sscanf equivalent?,How do I use strings to call functions/methods?,Numbers and strings
@anchor{faq/programming is-there-an-equivalent-to-perl-s-chomp-for-removing-trailing-newlines-from-strings}@anchor{5c63}
@subsubsection Is there an equivalent to Perl’s @code{chomp()} for removing trailing newlines from strings?


You can use @code{S.rstrip("\r\n")} to remove all occurrences of any line
terminator from the end of the string @code{S} without removing other trailing
whitespace.  If the string @code{S} represents more than one line, with several
empty lines at the end, the line terminators for all the blank lines will
be removed:

@example
>>> lines = ("line 1 \r\n"
...          "\r\n"
...          "\r\n")
>>> lines.rstrip("\n\r")
'line 1 '
@end example

Since this is typically only desired when reading text one line at a time, using
@code{S.rstrip()} this way works well.

@node Is there a scanf or sscanf equivalent?,What does UnicodeDecodeError or UnicodeEncodeError error mean?,Is there an equivalent to Perl’s chomp for removing trailing newlines from strings?,Numbers and strings
@anchor{faq/programming is-there-a-scanf-or-sscanf-equivalent}@anchor{5c64}
@subsubsection Is there a @code{scanf()} or @code{sscanf()} equivalent?


Not as such.

For simple input parsing, the easiest approach is usually to split the line into
whitespace-delimited words using the @ref{10b0,,split()} method of string objects
and then convert decimal strings to numeric values using @ref{19c,,int()} or
@ref{197,,float()}.  @code{split()} supports an optional “sep” parameter which is useful
if the line uses something other than whitespace as a separator.

For more complicated input parsing, regular expressions are more powerful
than C’s @code{sscanf} and better suited for the task.

@node What does UnicodeDecodeError or UnicodeEncodeError error mean?,Can I end a raw string with an odd number of backslashes?,Is there a scanf or sscanf equivalent?,Numbers and strings
@anchor{faq/programming what-does-unicodedecodeerror-or-unicodeencodeerror-error-mean}@anchor{5c65}
@subsubsection What does @code{UnicodeDecodeError} or @code{UnicodeEncodeError} error mean?


See the @ref{14b0,,Unicode HOWTO}.

@node Can I end a raw string with an odd number of backslashes?,,What does UnicodeDecodeError or UnicodeEncodeError error mean?,Numbers and strings
@anchor{faq/programming can-i-end-a-raw-string-with-an-odd-number-of-backslashes}@anchor{5c66}@anchor{faq/programming faq-programming-raw-string-backslash}@anchor{2021}
@subsubsection Can I end a raw string with an odd number of backslashes?


A raw string ending with an odd number of backslashes will escape the string’s quote:

@example
>>> r'C:\this\will\not\work\'
  File "<stdin>", line 1
    r'C:\this\will\not\work\'
    ^
SyntaxError: unterminated string literal (detected at line 1)
@end example

There are several workarounds for this. One is to use regular strings and double
the backslashes:

@example
>>> 'C:\\this\\will\\work\\'
'C:\\this\\will\\work\\'
@end example

Another is to concatenate a regular string containing an escaped backslash to the
raw string:

@example
>>> r'C:\this\will\work' '\\'
'C:\\this\\will\\work\\'
@end example

It is also possible to use @ref{19eb,,os.path.join()} to append a backslash on Windows:

@example
>>> os.path.join(r'C:\this\will\work', '@w{'})
'C:\\this\\will\\work\\'
@end example

Note that while a backslash will “escape” a quote for the purposes of
determining where the raw string ends, no escaping occurs when interpreting the
value of the raw string. That is, the backslash remains present in the value of
the raw string:

@example
>>> r'backslash\'preserved'
"backslash\\'preserved"
@end example

Also see the specification in the @ref{22e3,,language reference}.

@node Performance<4>,Sequences tuples/lists,Numbers and strings,Programming FAQ
@anchor{faq/programming performance}@anchor{5c67}
@subsection Performance


@menu
* My program is too slow. How do I speed it up?: My program is too slow How do I speed it up?. 
* What is the most efficient way to concatenate many strings together?:: 

@end menu

@node My program is too slow How do I speed it up?,What is the most efficient way to concatenate many strings together?,,Performance<4>
@anchor{faq/programming my-program-is-too-slow-how-do-i-speed-it-up}@anchor{5c68}
@subsubsection My program is too slow. How do I speed it up?


That’s a tough one, in general.  First, here is a list of things to
remember before diving further:


@itemize *

@item 
Performance characteristics vary across Python implementations.  This FAQ
focuses on @ref{907,,CPython}.

@item 
Behaviour can vary across operating systems, especially when talking about
I/O or multi-threading.

@item 
You should always find the hot spots in your program `before' attempting to
optimize any code (see the @ref{b4,,profile} module).

@item 
Writing benchmark scripts will allow you to iterate quickly when searching
for improvements (see the @ref{f5,,timeit} module).

@item 
It is highly recommended to have good code coverage (through unit testing
or any other technique) before potentially introducing regressions hidden
in sophisticated optimizations.
@end itemize

That being said, there are many tricks to speed up Python code.  Here are
some general principles which go a long way towards reaching acceptable
performance levels:


@itemize *

@item 
Making your algorithms faster (or changing to faster ones) can yield
much larger benefits than trying to sprinkle micro-optimization tricks
all over your code.

@item 
Use the right data structures.  Study documentation for the @ref{2631,,Built-in Types}
and the @ref{1e,,collections} module.

@item 
When the standard library provides a primitive for doing something, it is
likely (although not guaranteed) to be faster than any alternative you
may come up with.  This is doubly true for primitives written in C, such
as builtins and some extension types.  For example, be sure to use
either the @ref{dce,,list.sort()} built-in method or the related @ref{dcd,,sorted()}
function to do sorting (and see the @ref{2625,,Sorting Techniques} for examples
of moderately advanced usage).

@item 
Abstractions tend to create indirections and force the interpreter to work
more.  If the levels of indirection outweigh the amount of useful work
done, your program will be slower.  You should avoid excessive abstraction,
especially under the form of tiny functions or methods (which are also often
detrimental to readability).
@end itemize

If you have reached the limit of what pure Python can allow, there are tools
to take you further away.  For example, Cython@footnote{https://cython.org} can
compile a slightly modified version of Python code into a C extension, and
can be used on many different platforms.  Cython can take advantage of
compilation (and optional type annotations) to make your code significantly
faster than when interpreted.  If you are confident in your C programming
skills, you can also @ref{1fff,,write a C extension module}
yourself.


@subsubheading See also


The wiki page devoted to performance tips@footnote{https://wiki.python.org/moin/PythonSpeed/PerformanceTips}.


@node What is the most efficient way to concatenate many strings together?,,My program is too slow How do I speed it up?,Performance<4>
@anchor{faq/programming efficient-string-concatenation}@anchor{5c69}@anchor{faq/programming what-is-the-most-efficient-way-to-concatenate-many-strings-together}@anchor{5c6a}
@subsubsection What is the most efficient way to concatenate many strings together?


@ref{16a,,str} and @ref{193,,bytes} objects are immutable, therefore concatenating
many strings together is inefficient as each concatenation creates a new
object.  In the general case, the total runtime cost is quadratic in the
total string length.

To accumulate many @ref{16a,,str} objects, the recommended idiom is to place
them into a list and call @ref{2651,,str.join()} at the end:

@example
chunks = []
for s in my_strings:
    chunks.append(s)
result = '@w{'}.join(chunks)
@end example

(Another reasonably efficient idiom is to use @ref{112f,,io.StringIO}.)

To accumulate many @ref{193,,bytes} objects, the recommended idiom is to extend
a @ref{342,,bytearray} object using in-place concatenation (the @code{+=} operator):

@example
result = bytearray()
for b in my_bytes_objects:
    result += b
@end example

@node Sequences tuples/lists,Objects,Performance<4>,Programming FAQ
@anchor{faq/programming sequences-tuples-lists}@anchor{5c6b}
@subsection Sequences (tuples/lists)


@menu
* How do I convert between tuples and lists?:: 
* What’s a negative index?:: 
* How do I iterate over a sequence in reverse order?:: 
* How do you remove duplicates from a list?:: 
* How do you remove multiple items from a list?:: 
* How do you make an array in Python?:: 
* How do I create a multidimensional list?:: 
* How do I apply a method or function to a sequence of objects?:: 
* Why does a_tuple[i] += [‘item’] raise an exception when the addition works?:: 
* I want to do a complicated sort; can you do a Schwartzian Transform in Python?: I want to do a complicated sort can you do a Schwartzian Transform in Python?. 
* How can I sort one list by values from another list?:: 

@end menu

@node How do I convert between tuples and lists?,What’s a negative index?,,Sequences tuples/lists
@anchor{faq/programming how-do-i-convert-between-tuples-and-lists}@anchor{5c6c}
@subsubsection How do I convert between tuples and lists?


The type constructor @code{tuple(seq)} converts any sequence (actually, any
iterable) into a tuple with the same items in the same order.

For example, @code{tuple([1, 2, 3])} yields @code{(1, 2, 3)} and @code{tuple('abc')}
yields @code{('a', 'b', 'c')}.  If the argument is a tuple, it does not make a copy
but returns the same object, so it is cheap to call @ref{614,,tuple()} when you
aren’t sure that an object is already a tuple.

The type constructor @code{list(seq)} converts any sequence or iterable into a list
with the same items in the same order.  For example, @code{list((1, 2, 3))} yields
@code{[1, 2, 3]} and @code{list('abc')} yields @code{['a', 'b', 'c']}.  If the argument
is a list, it makes a copy just like @code{seq[:]} would.

@node What’s a negative index?,How do I iterate over a sequence in reverse order?,How do I convert between tuples and lists?,Sequences tuples/lists
@anchor{faq/programming what-s-a-negative-index}@anchor{5c6d}
@subsubsection What’s a negative index?


Python sequences are indexed with positive numbers and negative numbers.  For
positive numbers 0 is the first index 1 is the second index and so forth.  For
negative indices -1 is the last index and -2 is the penultimate (next to last)
index and so forth.  Think of @code{seq[-n]} as the same as @code{seq[len(seq)-n]}.

Using negative indices can be very convenient.  For example @code{S[:-1]} is all of
the string except for its last character, which is useful for removing the
trailing newline from a string.

@node How do I iterate over a sequence in reverse order?,How do you remove duplicates from a list?,What’s a negative index?,Sequences tuples/lists
@anchor{faq/programming how-do-i-iterate-over-a-sequence-in-reverse-order}@anchor{5c6e}
@subsubsection How do I iterate over a sequence in reverse order?


Use the @ref{a6b,,reversed()} built-in function:

@example
for x in reversed(sequence):
    ...  # do something with x ...
@end example

This won’t touch your original sequence, but build a new copy with reversed
order to iterate over.

@node How do you remove duplicates from a list?,How do you remove multiple items from a list?,How do I iterate over a sequence in reverse order?,Sequences tuples/lists
@anchor{faq/programming how-do-you-remove-duplicates-from-a-list}@anchor{5c6f}
@subsubsection How do you remove duplicates from a list?


See the Python Cookbook for a long discussion of many ways to do this:

@quotation

@indicateurl{https://code.activestate.com/recipes/52560/}
@end quotation

If you don’t mind reordering the list, sort it and then scan from the end of the
list, deleting duplicates as you go:

@example
if mylist:
    mylist.sort()
    last = mylist[-1]
    for i in range(len(mylist)-2, -1, -1):
        if last == mylist[i]:
            del mylist[i]
        else:
            last = mylist[i]
@end example

If all elements of the list may be used as set keys (that is, they are all
@ref{825,,hashable}) this is often faster:

@example
mylist = list(set(mylist))
@end example

This converts the list into a set, thereby removing duplicates, and then back
into a list.

@node How do you remove multiple items from a list?,How do you make an array in Python?,How do you remove duplicates from a list?,Sequences tuples/lists
@anchor{faq/programming how-do-you-remove-multiple-items-from-a-list}@anchor{5c70}
@subsubsection How do you remove multiple items from a list?


As with removing duplicates, explicitly iterating in reverse with a
delete condition is one possibility.  However, it is easier and faster
to use slice replacement with an implicit or explicit forward iteration.
Here are three variations:

@example
mylist[:] = filter(keep_function, mylist)
mylist[:] = (x for x in mylist if keep_condition)
mylist[:] = [x for x in mylist if keep_condition]
@end example

The list comprehension may be fastest.

@node How do you make an array in Python?,How do I create a multidimensional list?,How do you remove multiple items from a list?,Sequences tuples/lists
@anchor{faq/programming how-do-you-make-an-array-in-python}@anchor{5c71}
@subsubsection How do you make an array in Python?


Use a list:

@example
["this", 1, "is", "an", "array"]
@end example

Lists are equivalent to C or Pascal arrays in their time complexity; the primary
difference is that a Python list can contain objects of many different types.

The @code{array} module also provides methods for creating arrays of fixed types
with compact representations, but they are slower to index than lists.  Also
note that NumPy@footnote{https://numpy.org/}
and other third-party packages define array-like structures with
various characteristics as well.

To get Lisp-style linked lists, you can emulate `cons cells' using tuples:

@example
lisp_list = ("like",  ("this",  ("example", None) ) )
@end example

If mutability is desired, you could use lists instead of tuples.  Here the
analogue of a Lisp `car' is @code{lisp_list[0]} and the analogue of `cdr' is
@code{lisp_list[1]}.  Only do this if you’re sure you really need to, because it’s
usually a lot slower than using Python lists.

@node How do I create a multidimensional list?,How do I apply a method or function to a sequence of objects?,How do you make an array in Python?,Sequences tuples/lists
@anchor{faq/programming faq-multidimensional-list}@anchor{2650}@anchor{faq/programming how-do-i-create-a-multidimensional-list}@anchor{5c72}
@subsubsection How do I create a multidimensional list?


You probably tried to make a multidimensional array like this:

@example
>>> A = [[None] * 2] * 3
@end example

This looks correct if you print it:

@c A = [[None] * 2] * 3

@example
>>> A
[[None, None], [None, None], [None, None]]
@end example

But when you assign a value, it shows up in multiple places:

@c A = [[None] * 2] * 3

@example
>>> A[0][0] = 5
>>> A
[[5, None], [5, None], [5, None]]
@end example

The reason is that replicating a list with @code{*} doesn’t create copies, it only
creates references to the existing objects.  The @code{*3} creates a list
containing 3 references to the same list of length two.  Changes to one row will
show in all rows, which is almost certainly not what you want.

The suggested approach is to create a list of the desired length first and then
fill in each element with a newly created list:

@example
A = [None] * 3
for i in range(3):
    A[i] = [None] * 2
@end example

This generates a list containing 3 different lists of length two.  You can also
use a list comprehension:

@example
w, h = 2, 3
A = [[None] * w for i in range(h)]
@end example

Or, you can use an extension that provides a matrix datatype; NumPy@footnote{https://numpy.org/} is the best known.

@node How do I apply a method or function to a sequence of objects?,Why does a_tuple[i] += [‘item’] raise an exception when the addition works?,How do I create a multidimensional list?,Sequences tuples/lists
@anchor{faq/programming how-do-i-apply-a-method-or-function-to-a-sequence-of-objects}@anchor{5c73}
@subsubsection How do I apply a method or function to a sequence of objects?


To call a method or function and accumulate the return values in a list,
a @ref{8df,,list comprehension} is an elegant solution:

@example
result = [obj.method() for obj in mylist]

result = [function(obj) for obj in mylist]
@end example

To just run the method or function without saving the return values,
a plain @ref{348,,for} loop will suffice:

@example
for obj in mylist:
    obj.method()

for obj in mylist:
    function(obj)
@end example

@node Why does a_tuple[i] += [‘item’] raise an exception when the addition works?,I want to do a complicated sort can you do a Schwartzian Transform in Python?,How do I apply a method or function to a sequence of objects?,Sequences tuples/lists
@anchor{faq/programming faq-augmented-assignment-tuple-error}@anchor{2449}@anchor{faq/programming why-does-a-tuple-i-item-raise-an-exception-when-the-addition-works}@anchor{5c74}
@subsubsection Why does a_tuple[i] += [‘item’] raise an exception when the addition works?


This is because of a combination of the fact that augmented assignment
operators are `assignment' operators, and the difference between mutable and
immutable objects in Python.

This discussion applies in general when augmented assignment operators are
applied to elements of a tuple that point to mutable objects, but we’ll use
a @code{list} and @code{+=} as our exemplar.

If you wrote:

@example
>>> a_tuple = (1, 2)
>>> a_tuple[0] += 1
Traceback (most recent call last):
   ...
TypeError: 'tuple' object does not support item assignment
@end example

The reason for the exception should be immediately clear: @code{1} is added to the
object @code{a_tuple[0]} points to (@code{1}), producing the result object, @code{2},
but when we attempt to assign the result of the computation, @code{2}, to element
@code{0} of the tuple, we get an error because we can’t change what an element of
a tuple points to.

Under the covers, what this augmented assignment statement is doing is
approximately this:

@example
>>> result = a_tuple[0] + 1
>>> a_tuple[0] = result
Traceback (most recent call last):
  ...
TypeError: 'tuple' object does not support item assignment
@end example

It is the assignment part of the operation that produces the error, since a
tuple is immutable.

When you write something like:

@example
>>> a_tuple = (['foo'], 'bar')
>>> a_tuple[0] += ['item']
Traceback (most recent call last):
  ...
TypeError: 'tuple' object does not support item assignment
@end example

The exception is a bit more surprising, and even more surprising is the fact
that even though there was an error, the append worked:

@example
>>> a_tuple[0]
['foo', 'item']
@end example

To see why this happens, you need to know that (a) if an object implements an
@ref{2426,,__iadd__()} magic method, it gets called when the @code{+=} augmented
assignment
is executed, and its return value is what gets used in the assignment statement;
and (b) for lists, @code{__iadd__()} is equivalent to calling
@ref{2420,,extend()} on the list and returning the list.
That’s why we say that for lists, @code{+=} is a “shorthand” for @ref{602,,list.extend()}:

@example
>>> a_list = []
>>> a_list += [1]
>>> a_list
[1]
@end example

This is equivalent to:

@example
>>> result = a_list.__iadd__([1])
>>> a_list = result
@end example

The object pointed to by a_list has been mutated, and the pointer to the
mutated object is assigned back to @code{a_list}.  The end result of the
assignment is a no-op, since it is a pointer to the same object that @code{a_list}
was previously pointing to, but the assignment still happens.

Thus, in our tuple example what is happening is equivalent to:

@example
>>> result = a_tuple[0].__iadd__(['item'])
>>> a_tuple[0] = result
Traceback (most recent call last):
  ...
TypeError: 'tuple' object does not support item assignment
@end example

The @code{__iadd__()} succeeds, and thus the list is extended, but even though
@code{result} points to the same object that @code{a_tuple[0]} already points to,
that final assignment still results in an error, because tuples are immutable.

@node I want to do a complicated sort can you do a Schwartzian Transform in Python?,How can I sort one list by values from another list?,Why does a_tuple[i] += [‘item’] raise an exception when the addition works?,Sequences tuples/lists
@anchor{faq/programming i-want-to-do-a-complicated-sort-can-you-do-a-schwartzian-transform-in-python}@anchor{5c75}
@subsubsection I want to do a complicated sort: can you do a Schwartzian Transform in Python?


The technique, attributed to Randal Schwartz of the Perl community, sorts the
elements of a list by a metric which maps each element to its “sort value”. In
Python, use the @code{key} argument for the @ref{dce,,list.sort()} method:

@example
Isorted = L[:]
Isorted.sort(key=lambda s: int(s[10:15]))
@end example

@node How can I sort one list by values from another list?,,I want to do a complicated sort can you do a Schwartzian Transform in Python?,Sequences tuples/lists
@anchor{faq/programming how-can-i-sort-one-list-by-values-from-another-list}@anchor{5c76}
@subsubsection How can I sort one list by values from another list?


Merge them into an iterator of tuples, sort the resulting list, and then pick
out the element you want.

@example
>>> list1 = ["what", "I'm", "sorting", "by"]
>>> list2 = ["something", "else", "to", "sort"]
>>> pairs = zip(list1, list2)
>>> pairs = sorted(pairs)
>>> pairs
[("I'm", 'else'), ('by', 'sort'), ('sorting', 'to'), ('what', 'something')]
>>> result = [x[1] for x in pairs]
>>> result
['else', 'sort', 'to', 'something']
@end example

@node Objects,Modules<5>,Sequences tuples/lists,Programming FAQ
@anchor{faq/programming objects}@anchor{5c77}
@subsection Objects


@menu
* What is a class?:: 
* What is a method?:: 
* What is self?:: 
* How do I check if an object is an instance of a given class or of a subclass of it?:: 
* What is delegation?:: 
* How do I call a method defined in a base class from a derived class that extends it?:: 
* How can I organize my code to make it easier to change the base class?:: 
* How do I create static class data and static class methods?:: 
* How can I overload constructors (or methods) in Python?: How can I overload constructors or methods in Python?. 
* I try to use __spam and I get an error about _SomeClassName__spam.: I try to use __spam and I get an error about _SomeClassName__spam. 
* My class defines __del__ but it is not called when I delete the object.: My class defines __del__ but it is not called when I delete the object. 
* How do I get a list of all instances of a given class?:: 
* Why does the result of id() appear to be not unique?: Why does the result of id appear to be not unique?. 
* When can I rely on identity tests with the is operator?:: 
* How can a subclass control what data is stored in an immutable instance?:: 
* How do I cache method calls?:: 

@end menu

@node What is a class?,What is a method?,,Objects
@anchor{faq/programming what-is-a-class}@anchor{5c78}
@subsubsection What is a class?


A class is the particular object type created by executing a class statement.
Class objects are used as templates to create instance objects, which embody
both the data (attributes) and code (methods) specific to a datatype.

A class can be based on one or more other classes, called its base class(es). It
then inherits the attributes and methods of its base classes. This allows an
object model to be successively refined by inheritance.  You might have a
generic @code{Mailbox} class that provides basic accessor methods for a mailbox,
and subclasses such as @code{MboxMailbox}, @code{MaildirMailbox}, @code{OutlookMailbox}
that handle various specific mailbox formats.

@node What is a method?,What is self?,What is a class?,Objects
@anchor{faq/programming what-is-a-method}@anchor{5c79}
@subsubsection What is a method?


A method is a function on some object @code{x} that you normally call as
@code{x.name(arguments...)}.  Methods are defined as functions inside the class
definition:

@example
class C:
    def meth(self, arg):
        return arg * 2 + self.attribute
@end example

@node What is self?,How do I check if an object is an instance of a given class or of a subclass of it?,What is a method?,Objects
@anchor{faq/programming what-is-self}@anchor{5c7a}
@subsubsection What is self?


Self is merely a conventional name for the first argument of a method.  A method
defined as @code{meth(self, a, b, c)} should be called as @code{x.meth(a, b, c)} for
some instance @code{x} of the class in which the definition occurs; the called
method will think it is called as @code{meth(x, a, b, c)}.

See also @ref{5c7b,,Why must ‘self’ be used explicitly in method definitions and calls?}.

@node How do I check if an object is an instance of a given class or of a subclass of it?,What is delegation?,What is self?,Objects
@anchor{faq/programming how-do-i-check-if-an-object-is-an-instance-of-a-given-class-or-of-a-subclass-of-it}@anchor{5c7c}
@subsubsection How do I check if an object is an instance of a given class or of a subclass of it?


Use the built-in function @ref{2af,,isinstance(obj@comma{} cls)}.  You can
check if an object
is an instance of any of a number of classes by providing a tuple instead of a
single class, for example, @code{isinstance(obj, (class1, class2, ...))}, and can also
check whether an object is one of Python’s built-in types, for example,
@code{isinstance(obj, str)} or @code{isinstance(obj, (int, float, complex))}.

Note that @ref{2af,,isinstance()} also checks for virtual inheritance from an
@ref{13c2,,abstract base class}.  So, the test will return @code{True} for a
registered class even if hasn’t directly or indirectly inherited from it.  To
test for “true inheritance”, scan the @ref{2627,,method resolution order} (MRO) of
the class:

@example
from collections.abc import Mapping

class P:
     pass

class C(P):
    pass

Mapping.register(P)
@end example

@example
>>> c = C()
>>> isinstance(c, C)        # direct
True
>>> isinstance(c, P)        # indirect
True
>>> isinstance(c, Mapping)  # virtual
True

# Actual inheritance chain
>>> type(c).__mro__
(<class 'C'>, <class 'P'>, <class 'object'>)

# Test for "true inheritance"
>>> Mapping in type(c).__mro__
False
@end example

Note that most programs do not use @ref{2af,,isinstance()} on user-defined classes
very often.  If you are developing the classes yourself, a more proper
object-oriented style is to define methods on the classes that encapsulate a
particular behaviour, instead of checking the object’s class and doing a
different thing based on what class it is.  For example, if you have a function
that does something:

@example
def search(obj):
    if isinstance(obj, Mailbox):
        ...  # code to search a mailbox
    elif isinstance(obj, Document):
        ...  # code to search a document
    elif ...
@end example

A better approach is to define a @code{search()} method on all the classes and just
call it:

@example
class Mailbox:
    def search(self):
        ...  # code to search a mailbox

class Document:
    def search(self):
        ...  # code to search a document

obj.search()
@end example

@node What is delegation?,How do I call a method defined in a base class from a derived class that extends it?,How do I check if an object is an instance of a given class or of a subclass of it?,Objects
@anchor{faq/programming what-is-delegation}@anchor{5c7d}
@subsubsection What is delegation?


Delegation is an object-oriented technique (also called a design pattern).
Let’s say you have an object @code{x} and want to change the behaviour of just one
of its methods.  You can create a new class that provides a new implementation
of the method you’re interested in changing and delegates all other methods to
the corresponding method of @code{x}.

Python programmers can easily implement delegation.  For example, the following
class implements a class that behaves like a file but converts all written data
to uppercase:

@example
class UpperOut:

    def __init__(self, outfile):
        self._outfile = outfile

    def write(self, s):
        self._outfile.write(s.upper())

    def __getattr__(self, name):
        return getattr(self._outfile, name)
@end example

Here the @code{UpperOut} class redefines the @code{write()} method to convert the
argument string to uppercase before calling the underlying
@code{self._outfile.write()} method.  All other methods are delegated to the
underlying @code{self._outfile} object.  The delegation is accomplished via the
@ref{6fb,,__getattr__()} method; consult @ref{23f6,,the language reference}
for more information about controlling attribute access.

Note that for more general cases delegation can get trickier. When attributes
must be set as well as retrieved, the class must define a @ref{23bf,,__setattr__()}
method too, and it must do so carefully.  The basic implementation of
@code{__setattr__()} is roughly equivalent to the following:

@example
class X:
    ...
    def __setattr__(self, name, value):
        self.__dict__[name] = value
    ...
@end example

Many @ref{23bf,,__setattr__()} implementations call @code{object.__setattr__()} to set
an attribute on self without causing infinite recursion:

@example
class X:
    def __setattr__(self, name, value):
        # Custom logic here...
        object.__setattr__(self, name, value)
@end example

Alternatively, it is possible to set attributes by inserting
entries into @ref{77e,,self.__dict__} directly.

@node How do I call a method defined in a base class from a derived class that extends it?,How can I organize my code to make it easier to change the base class?,What is delegation?,Objects
@anchor{faq/programming how-do-i-call-a-method-defined-in-a-base-class-from-a-derived-class-that-extends-it}@anchor{5c7e}
@subsubsection How do I call a method defined in a base class from a derived class that extends it?


Use the built-in @ref{1a7,,super()} function:

@example
class Derived(Base):
    def meth(self):
        super().meth()  # calls Base.meth
@end example

In the example, @ref{1a7,,super()} will automatically determine the instance from
which it was called (the @code{self} value), look up the @ref{2627,,method resolution order} (MRO) with @code{type(self).__mro__}, and return the next in line after
@code{Derived} in the MRO: @code{Base}.

@node How can I organize my code to make it easier to change the base class?,How do I create static class data and static class methods?,How do I call a method defined in a base class from a derived class that extends it?,Objects
@anchor{faq/programming how-can-i-organize-my-code-to-make-it-easier-to-change-the-base-class}@anchor{5c7f}
@subsubsection How can I organize my code to make it easier to change the base class?


You could assign the base class to an alias and derive from the alias.  Then all
you have to change is the value assigned to the alias.  Incidentally, this trick
is also handy if you want to decide dynamically (such as depending on availability
of resources) which base class to use.  Example:

@example
class Base:
    ...

BaseAlias = Base

class Derived(BaseAlias):
    ...
@end example

@node How do I create static class data and static class methods?,How can I overload constructors or methods in Python?,How can I organize my code to make it easier to change the base class?,Objects
@anchor{faq/programming how-do-i-create-static-class-data-and-static-class-methods}@anchor{5c80}
@subsubsection How do I create static class data and static class methods?


Both static data and static methods (in the sense of C++ or Java) are supported
in Python.

For static data, simply define a class attribute.  To assign a new value to the
attribute, you have to explicitly use the class name in the assignment:

@example
class C:
    count = 0   # number of times C.__init__ called

    def __init__(self):
        C.count = C.count + 1

    def getcount(self):
        return C.count  # or return self.count
@end example

@code{c.count} also refers to @code{C.count} for any @code{c} such that @code{isinstance(c,
C)} holds, unless overridden by @code{c} itself or by some class on the base-class
search path from @code{c.__class__} back to @code{C}.

Caution: within a method of C, an assignment like @code{self.count = 42} creates a
new and unrelated instance named “count” in @code{self}’s own dict.  Rebinding of a
class-static data name must always specify the class whether inside a method or
not:

@example
C.count = 314
@end example

Static methods are possible:

@example
class C:
    @@staticmethod
    def static(arg1, arg2, arg3):
        # No 'self' parameter!
        ...
@end example

However, a far more straightforward way to get the effect of a static method is
via a simple module-level function:

@example
def getcount():
    return C.count
@end example

If your code is structured so as to define one class (or tightly related class
hierarchy) per module, this supplies the desired encapsulation.

@node How can I overload constructors or methods in Python?,I try to use __spam and I get an error about _SomeClassName__spam,How do I create static class data and static class methods?,Objects
@anchor{faq/programming how-can-i-overload-constructors-or-methods-in-python}@anchor{5c81}
@subsubsection How can I overload constructors (or methods) in Python?


This answer actually applies to all methods, but the question usually comes up
first in the context of constructors.

In C++ you’d write:

@example
class C @{
    C() @{ cout << "No arguments\n"; @}
    C(int i) @{ cout << "Argument is " << i << "\n"; @}
@}
@end example

In Python you have to write a single constructor that catches all cases using
default arguments.  For example:

@example
class C:
    def __init__(self, i=None):
        if i is None:
            print("No arguments")
        else:
            print("Argument is", i)
@end example

This is not entirely equivalent, but close enough in practice.

You could also try a variable-length argument list, for example:

@example
def __init__(self, *args):
    ...
@end example

The same approach works for all method definitions.

@node I try to use __spam and I get an error about _SomeClassName__spam,My class defines __del__ but it is not called when I delete the object,How can I overload constructors or methods in Python?,Objects
@anchor{faq/programming i-try-to-use-spam-and-i-get-an-error-about-someclassname-spam}@anchor{5c82}
@subsubsection I try to use __spam and I get an error about _SomeClassName__spam.


Variable names with double leading underscores are “mangled” to provide a simple
but effective way to define class private variables.  Any identifier of the form
@code{__spam} (at least two leading underscores, at most one trailing underscore)
is textually replaced with @code{_classname__spam}, where @code{classname} is the
current class name with any leading underscores stripped.

The identifier can be used unchanged within the class, but to access it outside
the class, the mangled name must be used:

@example
class A:
    def __one(self):
        return 1
    def two(self):
        return 2 * self.__one()

class B(A):
    def three(self):
        return 3 * self._A__one()

four = 4 * A()._A__one()
@end example

In particular, this does not guarantee privacy since an outside user can still
deliberately access the private attribute; many Python programmers never bother
to use private variable names at all.


@subsubheading See also


The @ref{20e7,,private name mangling specifications}
for details and special cases.


@node My class defines __del__ but it is not called when I delete the object,How do I get a list of all instances of a given class?,I try to use __spam and I get an error about _SomeClassName__spam,Objects
@anchor{faq/programming my-class-defines-del-but-it-is-not-called-when-i-delete-the-object}@anchor{5c83}
@subsubsection My class defines __del__ but it is not called when I delete the object.


There are several possible reasons for this.

The @ref{1b63,,del} statement does not necessarily call @ref{1203,,__del__()} – it simply
decrements the object’s reference count, and if this reaches zero
@code{__del__()} is called.

If your data structures contain circular links (for example, a tree where each child has
a parent reference and each parent has a list of children) the reference counts
will never go back to zero.  Once in a while Python runs an algorithm to detect
such cycles, but the garbage collector might run some time after the last
reference to your data structure vanishes, so your @code{__del__()} method may be
called at an inconvenient and random time. This is inconvenient if you’re trying
to reproduce a problem. Worse, the order in which object’s @code{__del__()}
methods are executed is arbitrary.  You can run @ref{1b5,,gc.collect()} to force a
collection, but there `are' pathological cases where objects will never be
collected.

Despite the cycle collector, it’s still a good idea to define an explicit
@code{close()} method on objects to be called whenever you’re done with them.  The
@code{close()} method can then remove attributes that refer to subobjects.  Don’t
call @code{__del__()} directly – @code{__del__()} should call @code{close()} and
@code{close()} should make sure that it can be called more than once for the same
object.

Another way to avoid cyclical references is to use the @ref{11b,,weakref} module,
which allows you to point to objects without incrementing their reference count.
Tree data structures, for instance, should use weak references for their parent
and sibling references (if they need them!).

@c XXX relevant for Python 3?
@c 
@c If the object has ever been a local variable in a function that caught an
@c expression in an except clause, chances are that a reference to the object
@c still exists in that function's stack frame as contained in the stack trace.
@c Normally, calling :func:`sys.exc_clear` will take care of this by clearing
@c the last recorded exception.

Finally, if your @code{__del__()} method raises an exception, a warning message
is printed to @ref{b39,,sys.stderr}.

@node How do I get a list of all instances of a given class?,Why does the result of id appear to be not unique?,My class defines __del__ but it is not called when I delete the object,Objects
@anchor{faq/programming how-do-i-get-a-list-of-all-instances-of-a-given-class}@anchor{5c84}
@subsubsection How do I get a list of all instances of a given class?


Python does not keep track of all instances of a class (or of a built-in type).
You can program the class’s constructor to keep track of all instances by
keeping a list of weak references to each instance.

@node Why does the result of id appear to be not unique?,When can I rely on identity tests with the is operator?,How do I get a list of all instances of a given class?,Objects
@anchor{faq/programming why-does-the-result-of-id-appear-to-be-not-unique}@anchor{5c85}
@subsubsection Why does the result of @code{id()} appear to be not unique?


The @ref{162f,,id()} builtin returns an integer that is guaranteed to be unique during
the lifetime of the object.  Since in CPython, this is the object’s memory
address, it happens frequently that after an object is deleted from memory, the
next freshly created object is allocated at the same position in memory.  This
is illustrated by this example:

@example
>>> id(1000)
13901272
>>> id(2000)
13901272
@end example

The two ids belong to different integer objects that are created before, and
deleted immediately after execution of the @code{id()} call.  To be sure that
objects whose id you want to examine are still alive, create another reference
to the object:

@example
>>> a = 1000; b = 2000
>>> id(a)
13901272
>>> id(b)
13891296
@end example

@node When can I rely on identity tests with the is operator?,How can a subclass control what data is stored in an immutable instance?,Why does the result of id appear to be not unique?,Objects
@anchor{faq/programming faq-identity-with-is}@anchor{24c7}@anchor{faq/programming when-can-i-rely-on-identity-tests-with-the-is-operator}@anchor{5c86}
@subsubsection When can I rely on identity tests with the `is' operator?


The @code{is} operator tests for object identity.  The test @code{a is b} is
equivalent to @code{id(a) == id(b)}.

The most important property of an identity test is that an object is always
identical to itself, @code{a is a} always returns @code{True}.  Identity tests are
usually faster than equality tests.  And unlike equality tests, identity tests
are guaranteed to return a boolean @code{True} or @code{False}.

However, identity tests can `only' be substituted for equality tests when
object identity is assured.  Generally, there are three circumstances where
identity is guaranteed:


@enumerate 

@item 
Assignments create new names but do not change object identity.  After the
assignment @code{new = old}, it is guaranteed that @code{new is old}.

@item 
Putting an object in a container that stores object references does not
change object identity.  After the list assignment @code{s[0] = x}, it is
guaranteed that @code{s[0] is x}.

@item 
If an object is a singleton, it means that only one instance of that object
can exist.  After the assignments @code{a = None} and @code{b = None}, it is
guaranteed that @code{a is b} because @code{None} is a singleton.
@end enumerate

In most other circumstances, identity tests are inadvisable and equality tests
are preferred.  In particular, identity tests should not be used to check
constants such as @ref{19c,,int} and @ref{16a,,str} which aren’t guaranteed to be
singletons:

@example
>>> a = 10_000_000
>>> b = 5_000_000
>>> c = b + 5_000_000
>>> a is c
False

>>> a = 'Python'
>>> b = 'Py'
>>> c = b + 'thon'
>>> a is c
False
@end example

Likewise, new instances of mutable containers are never identical:

@example
>>> a = []
>>> b = []
>>> a is b
False
@end example

In the standard library code, you will see several common patterns for
correctly using identity tests:


@enumerate 

@item 
As recommended by 
@geindex Python Enhancement Proposals; PEP 8
PEP 8@footnote{https://peps.python.org/pep-0008/}, an identity test is the preferred way to check
for @code{None}.  This reads like plain English in code and avoids confusion
with other objects that may have boolean values that evaluate to false.

@item 
Detecting optional arguments can be tricky when @code{None} is a valid input
value.  In those situations, you can create a singleton sentinel object
guaranteed to be distinct from other objects.  For example, here is how
to implement a method that behaves like @ref{5e6,,dict.pop()}:

@example
_sentinel = object()

def pop(self, key, default=_sentinel):
    if key in self:
        value = self[key]
        del self[key]
        return value
    if default is _sentinel:
        raise KeyError(key)
    return default
@end example

@item 
Container implementations sometimes need to augment equality tests with
identity tests.  This prevents the code from being confused by objects
such as @code{float('NaN')} that are not equal to themselves.
@end enumerate

For example, here is the implementation of
@code{collections.abc.Sequence.__contains__()}:

@example
def __contains__(self, value):
    for v in self:
        if v is value or v == value:
            return True
    return False
@end example

@node How can a subclass control what data is stored in an immutable instance?,How do I cache method calls?,When can I rely on identity tests with the is operator?,Objects
@anchor{faq/programming how-can-a-subclass-control-what-data-is-stored-in-an-immutable-instance}@anchor{5c87}
@subsubsection How can a subclass control what data is stored in an immutable instance?


When subclassing an immutable type, override the @ref{7a1,,__new__()} method
instead of the @ref{8c1,,__init__()} method.  The latter only runs `after' an
instance is created, which is too late to alter data in an immutable
instance.

All of these immutable classes have a different signature than their
parent class:

@example
import datetime as dt

class FirstOfMonthDate(dt.date):
    "Always choose the first day of the month"
    def __new__(cls, year, month, day):
        return super().__new__(cls, year, month, 1)

class NamedInt(int):
    "Allow text names for some numbers"
    xlat = @{'zero': 0, 'one': 1, 'ten': 10@}
    def __new__(cls, value):
        value = cls.xlat.get(value, value)
        return super().__new__(cls, value)

class TitleStr(str):
    "Convert str to name suitable for a URL path"
    def __new__(cls, s):
        s = s.lower().replace(' ', '-')
        s = '@w{'}.join([c for c in s if c.isalnum() or c == '-'])
        return super().__new__(cls, s)
@end example

The classes can be used like this:

@example
>>> FirstOfMonthDate(2012, 2, 14)
FirstOfMonthDate(2012, 2, 1)
>>> NamedInt('ten')
10
>>> NamedInt(20)
20
>>> TitleStr('Blog: Why Python Rocks')
'blog-why-python-rocks'
@end example

@node How do I cache method calls?,,How can a subclass control what data is stored in an immutable instance?,Objects
@anchor{faq/programming faq-cache-method-calls}@anchor{2c20}@anchor{faq/programming how-do-i-cache-method-calls}@anchor{5c88}
@subsubsection How do I cache method calls?


The two principal tools for caching methods are
@ref{764,,functools.cached_property()} and @ref{be8,,functools.lru_cache()}.  The
former stores results at the instance level and the latter at the class
level.

The @code{cached_property} approach only works with methods that do not take
any arguments.  It does not create a reference to the instance.  The
cached method result will be kept only as long as the instance is alive.

The advantage is that when an instance is no longer used, the cached
method result will be released right away.  The disadvantage is that if
instances accumulate, so too will the accumulated method results.  They
can grow without bound.

The @code{lru_cache} approach works with methods that have @ref{825,,hashable}
arguments.  It creates a reference to the instance unless special
efforts are made to pass in weak references.

The advantage of the least recently used algorithm is that the cache is
bounded by the specified `maxsize'.  The disadvantage is that instances
are kept alive until they age out of the cache or until the cache is
cleared.

This example shows the various techniques:

@example
class Weather:
    "Lookup weather information on a government website"

    def __init__(self, station_id):
        self._station_id = station_id
        # The _station_id is private and immutable

    def current_temperature(self):
        "Latest hourly observation"
        # Do not cache this because old results
        # can be out of date.

    @@cached_property
    def location(self):
        "Return the longitude/latitude coordinates of the station"
        # Result only depends on the station_id

    @@lru_cache(maxsize=20)
    def historic_rainfall(self, date, units='mm'):
        "Rainfall on a given date"
        # Depends on the station_id, date, and units.
@end example

The above example assumes that the `station_id' never changes.  If the
relevant instance attributes are mutable, the @code{cached_property} approach
can’t be made to work because it cannot detect changes to the
attributes.

To make the @code{lru_cache} approach work when the `station_id' is mutable,
the class needs to define the @ref{cf8,,__eq__()} and @ref{cf9,,__hash__()}
methods so that the cache can detect relevant attribute updates:

@example
class Weather:
    "Example with a mutable station identifier"

    def __init__(self, station_id):
        self.station_id = station_id

    def change_station(self, station_id):
        self.station_id = station_id

    def __eq__(self, other):
        return self.station_id == other.station_id

    def __hash__(self):
        return hash(self.station_id)

    @@lru_cache(maxsize=20)
    def historic_rainfall(self, date, units='cm'):
        'Rainfall on a given date'
        # Depends on the station_id, date, and units.
@end example

@node Modules<5>,,Objects,Programming FAQ
@anchor{faq/programming modules}@anchor{5c89}
@subsection Modules


@menu
* How do I create a .pyc file?: How do I create a pyc file?. 
* How do I find the current module name?:: 
* How can I have modules that mutually import each other?:: 
* __import__(‘x.y.z’) returns <module ‘x’>; how do I get z?: __import__ ‘x y z’ returns <module ‘x’>; how do I get z?. 
* When I edit an imported module and reimport it@comma{} the changes don’t show up. Why does this happen?: When I edit an imported module and reimport it the changes don’t show up Why does this happen?. 

@end menu

@node How do I create a pyc file?,How do I find the current module name?,,Modules<5>
@anchor{faq/programming how-do-i-create-a-pyc-file}@anchor{5c8a}
@subsubsection How do I create a .pyc file?


When a module is imported for the first time (or when the source file has
changed since the current compiled file was created) a @code{.pyc} file containing
the compiled code should be created in a @code{__pycache__} subdirectory of the
directory containing the @code{.py} file.  The @code{.pyc} file will have a
filename that starts with the same name as the @code{.py} file, and ends with
@code{.pyc}, with a middle component that depends on the particular @code{python}
binary that created it.  (See 
@geindex Python Enhancement Proposals; PEP 3147
PEP 3147@footnote{https://peps.python.org/pep-3147/} for details.)

One reason that a @code{.pyc} file may not be created is a permissions problem
with the directory containing the source file, meaning that the @code{__pycache__}
subdirectory cannot be created. This can happen, for example, if you develop as
one user but run as another, such as if you are testing with a web server.

Unless the 
@geindex PYTHONDONTWRITEBYTECODE
@geindex environment variable; PYTHONDONTWRITEBYTECODE
@ref{15da,,PYTHONDONTWRITEBYTECODE} environment variable is set,
creation of a .pyc file is automatic if you’re importing a module and Python
has the ability (permissions, free space, and so on) to create a @code{__pycache__}
subdirectory and write the compiled module to that subdirectory.

Running Python on a top-level script is not considered an import and no
@code{.pyc} will be created.  For example, if you have a top-level module
@code{foo.py} that imports another module @code{xyz.py}, when you run @code{foo} (by
typing @code{python foo.py} as a shell command), a @code{.pyc} will be created for
@code{xyz} because @code{xyz} is imported, but no @code{.pyc} file will be created for
@code{foo} since @code{foo.py} isn’t being imported.

If you need to create a @code{.pyc} file for @code{foo} – that is, to create a
@code{.pyc} file for a module that is not imported – you can, using the
@ref{b8,,py_compile} and @ref{21,,compileall} modules.

The @ref{b8,,py_compile} module can manually compile any module.  One way is to use
the @code{compile()} function in that module interactively:

@example
>>> import py_compile
>>> py_compile.compile('foo.py')
@end example

This will write the @code{.pyc} to a @code{__pycache__} subdirectory in the same
location as @code{foo.py} (or you can override that with the optional parameter
`cfile').

You can also automatically compile all files in a directory or directories using
the @ref{21,,compileall} module.  You can do it from the shell prompt by running
@code{compileall.py} and providing the path of a directory containing Python files
to compile:

@example
python -m compileall .
@end example

@node How do I find the current module name?,How can I have modules that mutually import each other?,How do I create a pyc file?,Modules<5>
@anchor{faq/programming how-do-i-find-the-current-module-name}@anchor{5c8b}
@subsubsection How do I find the current module name?


A module can find out its own module name by looking at the predefined global
variable @code{__name__}.  If this has the value @code{'__main__'}, the program is
running as a script.  Many modules that are usually used by importing them also
provide a command-line interface or a self-test, and only execute this code
after checking @code{__name__}:

@example
def main():
    print('Running test...')
    ...

if __name__ == '__main__':
    main()
@end example

@node How can I have modules that mutually import each other?,__import__ ‘x y z’ returns <module ‘x’>; how do I get z?,How do I find the current module name?,Modules<5>
@anchor{faq/programming how-can-i-have-modules-that-mutually-import-each-other}@anchor{5c8c}
@subsubsection How can I have modules that mutually import each other?


Suppose you have the following modules:

@code{foo.py}:

@example
from bar import bar_var
foo_var = 1
@end example

@code{bar.py}:

@example
from foo import foo_var
bar_var = 2
@end example

The problem is that the interpreter will perform the following steps:


@itemize *

@item 
main imports @code{foo}

@item 
Empty globals for @code{foo} are created

@item 
@code{foo} is compiled and starts executing

@item 
@code{foo} imports @code{bar}

@item 
Empty globals for @code{bar} are created

@item 
@code{bar} is compiled and starts executing

@item 
@code{bar} imports @code{foo} (which is a no-op since there already is a module named @code{foo})

@item 
The import mechanism tries to read @code{foo_var} from @code{foo} globals, to set @code{bar.foo_var = foo.foo_var}
@end itemize

The last step fails, because Python isn’t done with interpreting @code{foo} yet and
the global symbol dictionary for @code{foo} is still empty.

The same thing happens when you use @code{import foo}, and then try to access
@code{foo.foo_var} in global code.

There are (at least) three possible workarounds for this problem.

Guido van Rossum recommends avoiding all uses of @code{from <module> import ...},
and placing all code inside functions.  Initializations of global variables and
class variables should use constants or built-in functions only.  This means
everything from an imported module is referenced as @code{<module>.<name>}.

Jim Roskind suggests performing steps in the following order in each module:


@itemize *

@item 
exports (globals, functions, and classes that don’t need imported base
classes)

@item 
@code{import} statements

@item 
active code (including globals that are initialized from imported values).
@end itemize

Van Rossum doesn’t like this approach much because the imports appear in a
strange place, but it does work.

Matthias Urlichs recommends restructuring your code so that the recursive import
is not necessary in the first place.

These solutions are not mutually exclusive.

@node __import__ ‘x y z’ returns <module ‘x’>; how do I get z?,When I edit an imported module and reimport it the changes don’t show up Why does this happen?,How can I have modules that mutually import each other?,Modules<5>
@anchor{faq/programming import-x-y-z-returns-module-x-how-do-i-get-z}@anchor{5c8d}
@subsubsection __import__(‘x.y.z’) returns <module ‘x’>; how do I get z?


Consider using the convenience function @ref{73d,,import_module()} from
@ref{7b,,importlib} instead:

@example
z = importlib.import_module('x.y.z')
@end example

@node When I edit an imported module and reimport it the changes don’t show up Why does this happen?,,__import__ ‘x y z’ returns <module ‘x’>; how do I get z?,Modules<5>
@anchor{faq/programming when-i-edit-an-imported-module-and-reimport-it-the-changes-don-t-show-up-why-does-this-happen}@anchor{5c8e}
@subsubsection When I edit an imported module and reimport it, the changes don’t show up.  Why does this happen?


For reasons of efficiency as well as consistency, Python only reads the module
file on the first time a module is imported.  If it didn’t, in a program
consisting of many modules where each one imports the same basic module, the
basic module would be parsed and re-parsed many times.  To force re-reading of a
changed module, do this:

@example
import importlib
import modname
importlib.reload(modname)
@end example

Warning: this technique is not 100% fool-proof.  In particular, modules
containing statements like:

@example
from modname import some_objects
@end example

will continue to work with the old version of the imported objects.  If the
module contains class definitions, existing class instances will `not' be
updated to use the new class definition.  This can result in the following
paradoxical behaviour:

@example
>>> import importlib
>>> import cls
>>> c = cls.C()                # Create an instance of C
>>> importlib.reload(cls)
<module 'cls' from 'cls.py'>
>>> isinstance(c, cls.C)       # isinstance is false?!?
False
@end example

The nature of the problem is made clear if you print out the “identity” of the
class objects:

@example
>>> hex(id(c.__class__))
'0x7352a0'
>>> hex(id(cls.C))
'0x4198d0'
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Design and History FAQ,Library and Extension FAQ,Programming FAQ,Python Frequently Asked Questions
@anchor{faq/design doc}@anchor{5c8f}@anchor{faq/design design-and-history-faq}@anchor{5c90}@anchor{faq/design translation-repo}@anchor{5c91}
@section Design and History FAQ



@menu
* Why does Python use indentation for grouping of statements?:: 
* Why am I getting strange results with simple arithmetic operations?:: 
* Why are floating-point calculations so inaccurate?:: 
* Why are Python strings immutable?:: 
* Why must ‘self’ be used explicitly in method definitions and calls?:: 
* Why can’t I use an assignment in an expression?:: 
* Why does Python use methods for some functionality (e.g. list.index()) but functions for other (e.g. len(list))?: Why does Python use methods for some functionality e g list index but functions for other e g len list ?. 
* Why is join() a string method instead of a list or tuple method?: Why is join a string method instead of a list or tuple method?. 
* How fast are exceptions?:: 
* Why isn’t there a switch or case statement in Python?:: 
* Can’t you emulate threads in the interpreter instead of relying on an OS-specific thread implementation?:: 
* Why can’t lambda expressions contain statements?:: 
* Can Python be compiled to machine code@comma{} C or some other language?: Can Python be compiled to machine code C or some other language?. 
* How does Python manage memory?:: 
* Why doesn’t CPython use a more traditional garbage collection scheme?:: 
* Why isn’t all memory freed when CPython exits?:: 
* Why are there separate tuple and list data types?:: 
* How are lists implemented in CPython?:: 
* How are dictionaries implemented in CPython?:: 
* Why must dictionary keys be immutable?:: 
* Why doesn’t list.sort() return the sorted list?: Why doesn’t list sort return the sorted list?. 
* How do you specify and enforce an interface spec in Python?:: 
* Why is there no goto?:: 
* Why can’t raw strings (r-strings) end with a backslash?: Why can’t raw strings r-strings end with a backslash?. 
* Why doesn’t Python have a “with” statement for attribute assignments?:: 
* Why don’t generators support the with statement?:: 
* Why are colons required for the if/while/def/class statements?:: 
* Why does Python allow commas at the end of lists and tuples?:: 

@end menu

@node Why does Python use indentation for grouping of statements?,Why am I getting strange results with simple arithmetic operations?,,Design and History FAQ
@anchor{faq/design why-does-python-use-indentation-for-grouping-of-statements}@anchor{5c92}
@subsection Why does Python use indentation for grouping of statements?


Guido van Rossum believes that using indentation for grouping is extremely
elegant and contributes a lot to the clarity of the average Python program.
Most people learn to love this feature after a while.

Since there are no begin/end brackets there cannot be a disagreement between
grouping perceived by the parser and the human reader.  Occasionally C
programmers will encounter a fragment of code like this:

@example
if (x <= y)
        x++;
        y--;
z++;
@end example

Only the @code{x++} statement is executed if the condition is true, but the
indentation leads many to believe otherwise.  Even experienced C programmers will
sometimes stare at it a long time wondering as to why @code{y} is being decremented even
for @code{x > y}.

Because there are no begin/end brackets, Python is much less prone to
coding-style conflicts.  In C there are many different ways to place the braces.
After becoming used to reading and writing code using a particular style,
it is normal to feel somewhat uneasy when reading (or being required to write)
in a different one.

Many coding styles place begin/end brackets on a line by themselves.  This makes
programs considerably longer and wastes valuable screen space, making it harder
to get a good overview of a program.  Ideally, a function should fit on one
screen (say, 20–30 lines).  20 lines of Python can do a lot more work than 20
lines of C.  This is not solely due to the lack of begin/end brackets – the
lack of declarations and the high-level data types are also responsible – but
the indentation-based syntax certainly helps.

@node Why am I getting strange results with simple arithmetic operations?,Why are floating-point calculations so inaccurate?,Why does Python use indentation for grouping of statements?,Design and History FAQ
@anchor{faq/design why-am-i-getting-strange-results-with-simple-arithmetic-operations}@anchor{5c93}
@subsection Why am I getting strange results with simple arithmetic operations?


See the next question.

@node Why are floating-point calculations so inaccurate?,Why are Python strings immutable?,Why am I getting strange results with simple arithmetic operations?,Design and History FAQ
@anchor{faq/design why-are-floating-point-calculations-so-inaccurate}@anchor{5c94}
@subsection Why are floating-point calculations so inaccurate?


Users are often surprised by results like this:

@example
>>> 1.2 - 1.0
0.19999999999999996
@end example

and think it is a bug in Python.  It’s not.  This has little to do with Python,
and much more to do with how the underlying platform handles floating-point
numbers.

The @ref{197,,float} type in CPython uses a C @code{double} for storage.  A
@code{float} object’s value is stored in binary floating-point with a fixed
precision (typically 53 bits) and Python uses C operations, which in turn rely
on the hardware implementation in the processor, to perform floating-point
operations. This means that as far as floating-point operations are concerned,
Python behaves like many popular languages including C and Java.

Many numbers that can be written easily in decimal notation cannot be expressed
exactly in binary floating point.  For example, after:

@example
>>> x = 1.2
@end example

the value stored for @code{x} is a (very good) approximation to the decimal value
@code{1.2}, but is not exactly equal to it.  On a typical machine, the actual
stored value is:

@example
1.0011001100110011001100110011001100110011001100110011 (binary)
@end example

which is exactly:

@example
1.1999999999999999555910790149937383830547332763671875 (decimal)
@end example

The typical precision of 53 bits provides Python floats with 15–16
decimal digits of accuracy.

For a fuller explanation, please see the @ref{2144,,floating-point arithmetic} chapter in the Python tutorial.

@node Why are Python strings immutable?,Why must ‘self’ be used explicitly in method definitions and calls?,Why are floating-point calculations so inaccurate?,Design and History FAQ
@anchor{faq/design why-are-python-strings-immutable}@anchor{5c95}
@subsection Why are Python strings immutable?


There are several advantages.

One is performance: knowing that a string is immutable means we can allocate
space for it at creation time, and the storage requirements are fixed and
unchanging.  This is also one of the reasons for the distinction between tuples
and lists.

Another advantage is that strings in Python are considered as “elemental” as
numbers.  No amount of activity will change the value 8 to anything else, and in
Python, no amount of activity will change the string “eight” to anything else.

@node Why must ‘self’ be used explicitly in method definitions and calls?,Why can’t I use an assignment in an expression?,Why are Python strings immutable?,Design and History FAQ
@anchor{faq/design why-must-self-be-used-explicitly-in-method-definitions-and-calls}@anchor{5c96}@anchor{faq/design why-self}@anchor{5c7b}
@subsection Why must ‘self’ be used explicitly in method definitions and calls?


The idea was borrowed from Modula-3.  It turns out to be very useful, for a
variety of reasons.

First, it’s more obvious that you are using a method or instance attribute
instead of a local variable.  Reading @code{self.x} or @code{self.meth()} makes it
absolutely clear that an instance variable or method is used even if you don’t
know the class definition by heart.  In C++, you can sort of tell by the lack of
a local variable declaration (assuming globals are rare or easily recognizable)
– but in Python, there are no local variable declarations, so you’d have to
look up the class definition to be sure.  Some C++ and Java coding standards
call for instance attributes to have an @code{m_} prefix, so this explicitness is
still useful in those languages, too.

Second, it means that no special syntax is necessary if you want to explicitly
reference or call the method from a particular class.  In C++, if you want to
use a method from a base class which is overridden in a derived class, you have
to use the @code{::} operator – in Python you can write
@code{baseclass.methodname(self, <argument list>)}.  This is particularly useful
for @ref{8c1,,__init__()} methods, and in general in cases where a derived class
method wants to extend the base class method of the same name and thus has to
call the base class method somehow.

Finally, for instance variables it solves a syntactic problem with assignment:
since local variables in Python are (by definition!) those variables to which a
value is assigned in a function body (and that aren’t explicitly declared
global), there has to be some way to tell the interpreter that an assignment was
meant to assign to an instance variable instead of to a local variable, and it
should preferably be syntactic (for efficiency reasons).  C++ does this through
declarations, but Python doesn’t have declarations and it would be a pity having
to introduce them just for this purpose.  Using the explicit @code{self.var} solves
this nicely.  Similarly, for using instance variables, having to write
@code{self.var} means that references to unqualified names inside a method don’t
have to search the instance’s directories.  To put it another way, local
variables and instance variables live in two different namespaces, and you need
to tell Python which namespace to use.

@node Why can’t I use an assignment in an expression?,Why does Python use methods for some functionality e g list index but functions for other e g len list ?,Why must ‘self’ be used explicitly in method definitions and calls?,Design and History FAQ
@anchor{faq/design id1}@anchor{5c97}@anchor{faq/design why-can-t-i-use-an-assignment-in-an-expression}@anchor{207c}
@subsection Why can’t I use an assignment in an expression?


Starting in Python 3.8, you can!

Assignment expressions using the walrus operator @code{:=} assign a variable in an
expression:

@example
while chunk := fp.read(200):
   print(chunk)
@end example

See 
@geindex Python Enhancement Proposals; PEP 572
PEP 572@footnote{https://peps.python.org/pep-0572/} for more information.

@node Why does Python use methods for some functionality e g list index but functions for other e g len list ?,Why is join a string method instead of a list or tuple method?,Why can’t I use an assignment in an expression?,Design and History FAQ
@anchor{faq/design why-does-python-use-methods-for-some-functionality-e-g-list-index-but-functions-for-other-e-g-len-list}@anchor{5c98}
@subsection Why does Python use methods for some functionality (e.g. list.index()) but functions for other (e.g. len(list))?


As Guido said:

@quotation

(a) For some operations, prefix notation just reads better than
postfix – prefix (and infix!) operations have a long tradition in
mathematics which likes notations where the visuals help the
mathematician thinking about a problem. Compare the easy with which we
rewrite a formula like x*(a+b) into x*a + x*b to the clumsiness of
doing the same thing using a raw OO notation.

(b) When I read code that says len(x) I `know' that it is asking for
the length of something. This tells me two things: the result is an
integer, and the argument is some kind of container. To the contrary,
when I read x.len(), I have to already know that x is some kind of
container implementing an interface or inheriting from a class that
has a standard len(). Witness the confusion we occasionally have when
a class that is not implementing a mapping has a get() or keys()
method, or something that isn’t a file has a write() method.


@center --- @indicateurl{https://mail.python.org/pipermail/python-3000/2006-November/004643.html}

@end quotation

@node Why is join a string method instead of a list or tuple method?,How fast are exceptions?,Why does Python use methods for some functionality e g list index but functions for other e g len list ?,Design and History FAQ
@anchor{faq/design why-is-join-a-string-method-instead-of-a-list-or-tuple-method}@anchor{5c99}
@subsection Why is join() a string method instead of a list or tuple method?


Strings became much more like other standard types starting in Python 1.6, when
methods were added which give the same functionality that has always been
available using the functions of the string module.  Most of these new methods
have been widely accepted, but the one which appears to make some programmers
feel uncomfortable is:

@example
", ".join(['1', '2', '4', '8', '16'])
@end example

which gives the result:

@example
"1, 2, 4, 8, 16"
@end example

There are two common arguments against this usage.

The first runs along the lines of: “It looks really ugly using a method of a
string literal (string constant)”, to which the answer is that it might, but a
string literal is just a fixed value. If the methods are to be allowed on names
bound to strings there is no logical reason to make them unavailable on
literals.

The second objection is typically cast as: “I am really telling a sequence to
join its members together with a string constant”.  Sadly, you aren’t.  For some
reason there seems to be much less difficulty with having @ref{10b0,,split()} as
a string method, since in that case it is easy to see that

@example
"1, 2, 4, 8, 16".split(", ")
@end example

is an instruction to a string literal to return the substrings delimited by the
given separator (or, by default, arbitrary runs of white space).

@ref{2651,,join()} is a string method because in using it you are telling the
separator string to iterate over a sequence of strings and insert itself between
adjacent elements.  This method can be used with any argument which obeys the
rules for sequence objects, including any new classes you might define yourself.
Similar methods exist for bytes and bytearray objects.

@node How fast are exceptions?,Why isn’t there a switch or case statement in Python?,Why is join a string method instead of a list or tuple method?,Design and History FAQ
@anchor{faq/design how-fast-are-exceptions}@anchor{5c9a}
@subsection How fast are exceptions?


A @ref{8fa,,try}/@ref{1ac,,except} block is extremely efficient if no exceptions
are raised.  Actually
catching an exception is expensive.  In versions of Python prior to 2.0 it was
common to use this idiom:

@example
try:
    value = mydict[key]
except KeyError:
    mydict[key] = getvalue(key)
    value = mydict[key]
@end example

This only made sense when you expected the dict to have the key almost all the
time.  If that wasn’t the case, you coded it like this:

@example
if key in mydict:
    value = mydict[key]
else:
    value = mydict[key] = getvalue(key)
@end example

For this specific case, you could also use @code{value = dict.setdefault(key,
getvalue(key))}, but only if the @code{getvalue()} call is cheap enough because it
is evaluated in all cases.

@node Why isn’t there a switch or case statement in Python?,Can’t you emulate threads in the interpreter instead of relying on an OS-specific thread implementation?,How fast are exceptions?,Design and History FAQ
@anchor{faq/design why-isn-t-there-a-switch-or-case-statement-in-python}@anchor{5c9b}
@subsection Why isn’t there a switch or case statement in Python?


In general, structured switch statements execute one block of code
when an expression has a particular value or set of values.
Since Python 3.10 one can easily match literal values, or constants
within a namespace, with a @code{match ... case} statement.
An older alternative is a sequence of @code{if... elif... elif... else}.

For cases where you need to choose from a very large number of possibilities,
you can create a dictionary mapping case values to functions to call.  For
example:

@example
functions = @{'a': function_1,
             'b': function_2,
             'c': self.method_1@}

func = functions[value]
func()
@end example

For calling methods on objects, you can simplify yet further by using the
@ref{dd0,,getattr()} built-in to retrieve methods with a particular name:

@example
class MyVisitor:
    def visit_a(self):
        ...

    def dispatch(self, value):
        method_name = 'visit_' + str(value)
        method = getattr(self, method_name)
        method()
@end example

It’s suggested that you use a prefix for the method names, such as @code{visit_} in
this example.  Without such a prefix, if values are coming from an untrusted
source, an attacker would be able to call any method on your object.

Imitating switch with fallthrough, as with C’s switch-case-default,
is possible, much harder, and less needed.

@node Can’t you emulate threads in the interpreter instead of relying on an OS-specific thread implementation?,Why can’t lambda expressions contain statements?,Why isn’t there a switch or case statement in Python?,Design and History FAQ
@anchor{faq/design can-t-you-emulate-threads-in-the-interpreter-instead-of-relying-on-an-os-specific-thread-implementation}@anchor{5c9c}
@subsection Can’t you emulate threads in the interpreter instead of relying on an OS-specific thread implementation?


Answer 1: Unfortunately, the interpreter pushes at least one C stack frame for
each Python stack frame.  Also, extensions can call back into Python at almost
random moments.  Therefore, a complete threads implementation requires thread
support for C.

Answer 2: Fortunately, there is Stackless Python@footnote{https://github.com/stackless-dev/stackless/wiki},
which has a completely redesigned interpreter loop that avoids the C stack.

@node Why can’t lambda expressions contain statements?,Can Python be compiled to machine code C or some other language?,Can’t you emulate threads in the interpreter instead of relying on an OS-specific thread implementation?,Design and History FAQ
@anchor{faq/design why-can-t-lambda-expressions-contain-statements}@anchor{5c9d}
@subsection Why can’t lambda expressions contain statements?


Python lambda expressions cannot contain statements because Python’s syntactic
framework can’t handle statements nested inside expressions.  However, in
Python, this is not a serious problem.  Unlike lambda forms in other languages,
where they add functionality, Python lambdas are only a shorthand notation if
you’re too lazy to define a function.

Functions are already first class objects in Python, and can be declared in a
local scope.  Therefore the only advantage of using a lambda instead of a
locally defined function is that you don’t need to invent a name for the
function – but that’s just a local variable to which the function object (which
is exactly the same type of object that a lambda expression yields) is assigned!

@node Can Python be compiled to machine code C or some other language?,How does Python manage memory?,Why can’t lambda expressions contain statements?,Design and History FAQ
@anchor{faq/design can-python-be-compiled-to-machine-code-c-or-some-other-language}@anchor{5c9e}
@subsection Can Python be compiled to machine code, C or some other language?


Cython@footnote{https://cython.org/} compiles a modified version of Python with
optional annotations into C extensions.  Nuitka@footnote{https://nuitka.net/} is
an up-and-coming compiler of Python into C++ code, aiming to support the full
Python language.

@node How does Python manage memory?,Why doesn’t CPython use a more traditional garbage collection scheme?,Can Python be compiled to machine code C or some other language?,Design and History FAQ
@anchor{faq/design how-does-python-manage-memory}@anchor{5c9f}
@subsection How does Python manage memory?


The details of Python memory management depend on the implementation.  The
standard implementation of Python, @ref{907,,CPython}, uses reference counting to
detect inaccessible objects, and another mechanism to collect reference cycles,
periodically executing a cycle detection algorithm which looks for inaccessible
cycles and deletes the objects involved. The @ref{64,,gc} module provides functions
to perform a garbage collection, obtain debugging statistics, and tune the
collector’s parameters.

Other implementations (such as Jython@footnote{https://www.jython.org} or
PyPy@footnote{https://pypy.org}), however, can rely on a different mechanism
such as a full-blown garbage collector.  This difference can cause some
subtle porting problems if your Python code depends on the behavior of the
reference counting implementation.

In some Python implementations, the following code (which is fine in CPython)
will probably run out of file descriptors:

@example
for file in very_long_list_of_files:
    f = open(file)
    c = f.read(1)
@end example

Indeed, using CPython’s reference counting and destructor scheme, each new
assignment to @code{f} closes the previous file.  With a traditional GC, however,
those file objects will only get collected (and closed) at varying and possibly
long intervals.

If you want to write code that will work with any Python implementation,
you should explicitly close the file or use the @ref{187,,with} statement;
this will work regardless of memory management scheme:

@example
for file in very_long_list_of_files:
    with open(file) as f:
        c = f.read(1)
@end example

@node Why doesn’t CPython use a more traditional garbage collection scheme?,Why isn’t all memory freed when CPython exits?,How does Python manage memory?,Design and History FAQ
@anchor{faq/design why-doesn-t-cpython-use-a-more-traditional-garbage-collection-scheme}@anchor{5ca0}
@subsection Why doesn’t CPython use a more traditional garbage collection scheme?


For one thing, this is not a C standard feature and hence it’s not portable.
(Yes, we know about the Boehm GC library.  It has bits of assembler code for
`most' common platforms, not for all of them, and although it is mostly
transparent, it isn’t completely transparent; patches are required to get
Python to work with it.)

Traditional GC also becomes a problem when Python is embedded into other
applications.  While in a standalone Python it’s fine to replace the standard
@code{malloc()} and @code{free()} with versions provided by the GC library, an application
embedding Python may want to have its `own' substitute for @code{malloc()} and @code{free()},
and may not want Python’s.  Right now, CPython works with anything that
implements @code{malloc()} and @code{free()} properly.

@node Why isn’t all memory freed when CPython exits?,Why are there separate tuple and list data types?,Why doesn’t CPython use a more traditional garbage collection scheme?,Design and History FAQ
@anchor{faq/design why-isn-t-all-memory-freed-when-cpython-exits}@anchor{5ca1}
@subsection Why isn’t all memory freed when CPython exits?


Objects referenced from the global namespaces of Python modules are not always
deallocated when Python exits.  This may happen if there are circular
references.  There are also certain bits of memory that are allocated by the C
library that are impossible to free (e.g. a tool like Purify will complain about
these).  Python is, however, aggressive about cleaning up memory on exit and
does try to destroy every single object.

If you want to force Python to delete certain things on deallocation use the
@ref{d,,atexit} module to run a function that will force those deletions.

@node Why are there separate tuple and list data types?,How are lists implemented in CPython?,Why isn’t all memory freed when CPython exits?,Design and History FAQ
@anchor{faq/design why-are-there-separate-tuple-and-list-data-types}@anchor{5ca2}
@subsection Why are there separate tuple and list data types?


Lists and tuples, while similar in many respects, are generally used in
fundamentally different ways.  Tuples can be thought of as being similar to
Pascal @code{records} or C @code{structs}; they’re small collections of related data which may
be of different types which are operated on as a group.  For example, a
Cartesian coordinate is appropriately represented as a tuple of two or three
numbers.

Lists, on the other hand, are more like arrays in other languages.  They tend to
hold a varying number of objects all of which have the same type and which are
operated on one-by-one.  For example, @ref{1306,,os.listdir('.')}
returns a list of
strings representing the files in the current directory.  Functions which
operate on this output would generally not break if you added another file or
two to the directory.

Tuples are immutable, meaning that once a tuple has been created, you can’t
replace any of its elements with a new value.  Lists are mutable, meaning that
you can always change a list’s elements.  Only immutable elements can be used as
dictionary keys, and hence only tuples and not lists can be used as keys.

@node How are lists implemented in CPython?,How are dictionaries implemented in CPython?,Why are there separate tuple and list data types?,Design and History FAQ
@anchor{faq/design how-are-lists-implemented-in-cpython}@anchor{5ca3}
@subsection How are lists implemented in CPython?


CPython’s lists are really variable-length arrays, not Lisp-style linked lists.
The implementation uses a contiguous array of references to other objects, and
keeps a pointer to this array and the array’s length in a list head structure.

This makes indexing a list @code{a[i]} an operation whose cost is independent of
the size of the list or the value of the index.

When items are appended or inserted, the array of references is resized.  Some
cleverness is applied to improve the performance of appending items repeatedly;
when the array must be grown, some extra space is allocated so the next few
times don’t require an actual resize.

@node How are dictionaries implemented in CPython?,Why must dictionary keys be immutable?,How are lists implemented in CPython?,Design and History FAQ
@anchor{faq/design how-are-dictionaries-implemented-in-cpython}@anchor{5ca4}
@subsection How are dictionaries implemented in CPython?


CPython’s dictionaries are implemented as resizable hash tables.  Compared to
B-trees, this gives better performance for lookup (the most common operation by
far) under most circumstances, and the implementation is simpler.

Dictionaries work by computing a hash code for each key stored in the dictionary
using the @ref{802,,hash()} built-in function.  The hash code varies widely depending
on the key and a per-process seed; for example, @code{'Python'} could hash to
@code{-539294296} while @code{'python'}, a string that differs by a single bit, could hash
to @code{1142331976}.  The hash code is then used to calculate a location in an
internal array where the value will be stored.  Assuming that you’re storing
keys that all have different hash values, this means that dictionaries take
constant time – `O'(1), in Big-O notation – to retrieve a key.

@node Why must dictionary keys be immutable?,Why doesn’t list sort return the sorted list?,How are dictionaries implemented in CPython?,Design and History FAQ
@anchor{faq/design why-must-dictionary-keys-be-immutable}@anchor{5ca5}
@subsection Why must dictionary keys be immutable?


The hash table implementation of dictionaries uses a hash value calculated from
the key value to find the key.  If the key were a mutable object, its value
could change, and thus its hash could also change.  But since whoever changes
the key object can’t tell that it was being used as a dictionary key, it can’t
move the entry around in the dictionary.  Then, when you try to look up the same
object in the dictionary it won’t be found because its hash value is different.
If you tried to look up the old value it wouldn’t be found either, because the
value of the object found in that hash bin would be different.

If you want a dictionary indexed with a list, simply convert the list to a tuple
first; the function @code{tuple(L)} creates a tuple with the same entries as the
list @code{L}.  Tuples are immutable and can therefore be used as dictionary keys.

Some unacceptable solutions that have been proposed:


@itemize -

@item 
Hash lists by their address (object ID).  This doesn’t work because if you
construct a new list with the same value it won’t be found; e.g.:

@example
mydict = @{[1, 2]: '12'@}
print(mydict[[1, 2]])
@end example

would raise a @ref{5e7,,KeyError} exception because the id of the @code{[1, 2]} used in the
second line differs from that in the first line.  In other words, dictionary
keys should be compared using @code{==}, not using @ref{34a,,is}.

@item 
Make a copy when using a list as a key.  This doesn’t work because the list,
being a mutable object, could contain a reference to itself, and then the
copying code would run into an infinite loop.

@item 
Allow lists as keys but tell the user not to modify them.  This would allow a
class of hard-to-track bugs in programs when you forgot or modified a list by
accident. It also invalidates an important invariant of dictionaries: every
value in @code{d.keys()} is usable as a key of the dictionary.

@item 
Mark lists as read-only once they are used as a dictionary key.  The problem
is that it’s not just the top-level object that could change its value; you
could use a tuple containing a list as a key.  Entering anything as a key into
a dictionary would require marking all objects reachable from there as
read-only – and again, self-referential objects could cause an infinite loop.
@end itemize

There is a trick to get around this if you need to, but use it at your own risk:
You can wrap a mutable structure inside a class instance which has both a
@ref{cf8,,__eq__()} and a @ref{cf9,,__hash__()} method.
You must then make sure that the
hash value for all such wrapper objects that reside in a dictionary (or other
hash based structure), remain fixed while the object is in the dictionary (or
other structure).

@example
class ListWrapper:
    def __init__(self, the_list):
        self.the_list = the_list

    def __eq__(self, other):
        return self.the_list == other.the_list

    def __hash__(self):
        l = self.the_list
        result = 98767 - len(l)*555
        for i, el in enumerate(l):
            try:
                result = result + (hash(el) % 9999999) * 1001 + i
            except Exception:
                result = (result % 7777777) + i * 333
        return result
@end example

Note that the hash computation is complicated by the possibility that some
members of the list may be unhashable and also by the possibility of arithmetic
overflow.

Furthermore it must always be the case that if @code{o1 == o2} (ie @code{o1.__eq__(o2)
is True}) then @code{hash(o1) == hash(o2)} (ie, @code{o1.__hash__() == o2.__hash__()}),
regardless of whether the object is in a dictionary or not.  If you fail to meet
these restrictions dictionaries and other hash based structures will misbehave.

In the case of @code{ListWrapper}, whenever the wrapper object is in a dictionary the
wrapped list must not change to avoid anomalies.  Don’t do this unless you are
prepared to think hard about the requirements and the consequences of not
meeting them correctly.  Consider yourself warned.

@node Why doesn’t list sort return the sorted list?,How do you specify and enforce an interface spec in Python?,Why must dictionary keys be immutable?,Design and History FAQ
@anchor{faq/design why-doesn-t-list-sort-return-the-sorted-list}@anchor{5ca6}
@subsection Why doesn’t list.sort() return the sorted list?


In situations where performance matters, making a copy of the list just to sort
it would be wasteful. Therefore, @ref{dce,,list.sort()} sorts the list in place. In
order to remind you of that fact, it does not return the sorted list.  This way,
you won’t be fooled into accidentally overwriting a list when you need a sorted
copy but also need to keep the unsorted version around.

If you want to return a new list, use the built-in @ref{dcd,,sorted()} function
instead.  This function creates a new list from a provided iterable, sorts
it and returns it.  For example, here’s how to iterate over the keys of a
dictionary in sorted order:

@example
for key in sorted(mydict):
    ...  # do whatever with mydict[key]...
@end example

@node How do you specify and enforce an interface spec in Python?,Why is there no goto?,Why doesn’t list sort return the sorted list?,Design and History FAQ
@anchor{faq/design how-do-you-specify-and-enforce-an-interface-spec-in-python}@anchor{5ca7}
@subsection How do you specify and enforce an interface spec in Python?


An interface specification for a module as provided by languages such as C++ and
Java describes the prototypes for the methods and functions of the module.  Many
feel that compile-time enforcement of interface specifications helps in the
construction of large programs.

Python 2.6 adds an @ref{4,,abc} module that lets you define Abstract Base Classes
(ABCs).  You can then use @ref{2af,,isinstance()} and @ref{9ca,,issubclass()} to check
whether an instance or a class implements a particular ABC.  The
@ref{1f,,collections.abc} module defines a set of useful ABCs such as
@ref{26f9,,Iterable}, @ref{26fb,,Container}, and
@ref{12b8,,MutableMapping}.

For Python, many of the advantages of interface specifications can be obtained
by an appropriate test discipline for components.

A good test suite for a module can both provide a regression test and serve as a
module interface specification and a set of examples.  Many Python modules can
be run as a script to provide a simple “self test.”  Even modules which use
complex external interfaces can often be tested in isolation using trivial
“stub” emulations of the external interface.  The @ref{3e,,doctest} and
@ref{10d,,unittest} modules or third-party test frameworks can be used to construct
exhaustive test suites that exercise every line of code in a module.

An appropriate testing discipline can help build large complex applications in
Python as well as having interface specifications would.  In fact, it can be
better because an interface specification cannot test certain properties of a
program.  For example, the @ref{8de,,list.append()} method is expected to add new elements
to the end of some internal list; an interface specification cannot test that
your @code{list.append()} implementation will actually do this correctly, but it’s
trivial to check this property in a test suite.

Writing test suites is very helpful, and you might want to design your code to
make it easily tested. One increasingly popular technique, test-driven
development, calls for writing parts of the test suite first, before you write
any of the actual code.  Of course Python allows you to be sloppy and not write
test cases at all.

@node Why is there no goto?,Why can’t raw strings r-strings end with a backslash?,How do you specify and enforce an interface spec in Python?,Design and History FAQ
@anchor{faq/design why-is-there-no-goto}@anchor{5ca8}
@subsection Why is there no goto?


In the 1970s people realized that unrestricted goto could lead
to messy “spaghetti” code that was hard to understand and revise.
In a high-level language, it is also unneeded as long as there
are ways to branch (in Python, with @ref{182,,if} statements and @ref{34b,,or},
@ref{347,,and}, and @code{if}/@ref{17d,,else} expressions) and loop (with @ref{19b7,,while}
and @ref{348,,for} statements, possibly containing @ref{181,,continue} and @ref{180,,break}).

One can also use exceptions to provide a “structured goto”
that works even across
function calls.  Many feel that exceptions can conveniently emulate all
reasonable uses of the @code{go} or @code{goto} constructs of C, Fortran, and other
languages.  For example:

@example
class label(Exception): pass  # declare a label

try:
    ...
    if condition: raise label()  # goto label
    ...
except label:  # where to goto
    pass
...
@end example

This doesn’t allow you to jump into the middle of a loop, but that’s usually
considered an abuse of @code{goto} anyway.  Use sparingly.

@node Why can’t raw strings r-strings end with a backslash?,Why doesn’t Python have a “with” statement for attribute assignments?,Why is there no goto?,Design and History FAQ
@anchor{faq/design why-can-t-raw-strings-r-strings-end-with-a-backslash}@anchor{5ca9}
@subsection Why can’t raw strings (r-strings) end with a backslash?


More precisely, they can’t end with an odd number of backslashes: the unpaired
backslash at the end escapes the closing quote character, leaving an
unterminated string.

Raw strings were designed to ease creating input for processors (chiefly regular
expression engines) that want to do their own backslash escape processing. Such
processors consider an unmatched trailing backslash to be an error anyway, so
raw strings disallow that.  In return, they allow you to pass on the string
quote character by escaping it with a backslash.  These rules work well when
r-strings are used for their intended purpose.

If you’re trying to build Windows pathnames, note that all Windows system calls
accept forward slashes too:

@example
f = open("/mydir/file.txt")  # works fine!
@end example

If you’re trying to build a pathname for a DOS command, try e.g. one of

@example
dir = r"\this\is\my\dos\dir" "\\"
dir = r"\this\is\my\dos\dir\ "[:-1]
dir = "\\this\\is\\my\\dos\\dir\\"
@end example

@node Why doesn’t Python have a “with” statement for attribute assignments?,Why don’t generators support the with statement?,Why can’t raw strings r-strings end with a backslash?,Design and History FAQ
@anchor{faq/design why-doesn-t-python-have-a-with-statement-for-attribute-assignments}@anchor{5caa}
@subsection Why doesn’t Python have a “with” statement for attribute assignments?


Python has a @ref{187,,with} statement that wraps the execution of a block, calling code
on the entrance and exit from the block.  Some languages have a construct that
looks like this:

@example
with obj:
    a = 1               # equivalent to obj.a = 1
    total = total + 1   # obj.total = obj.total + 1
@end example

In Python, such a construct would be ambiguous.

Other languages, such as Object Pascal, Delphi, and C++, use static types, so
it’s possible to know, in an unambiguous way, what member is being assigned
to. This is the main point of static typing – the compiler `always' knows the
scope of every variable at compile time.

Python uses dynamic types. It is impossible to know in advance which attribute
will be referenced at runtime. Member attributes may be added or removed from
objects on the fly. This makes it impossible to know, from a simple reading,
what attribute is being referenced: a local one, a global one, or a member
attribute?

For instance, take the following incomplete snippet:

@example
def foo(a):
    with a:
        print(x)
@end example

The snippet assumes that @code{a} must have a member attribute called @code{x}. However,
there is nothing in Python that tells the interpreter this. What should happen
if @code{a} is, let us say, an integer?  If there is a global variable named @code{x},
will it be used inside the @ref{187,,with} block?  As you see, the dynamic nature of Python
makes such choices much harder.

The primary benefit of @ref{187,,with} and similar language features (reduction of code
volume) can, however, easily be achieved in Python by assignment.  Instead of:

@example
function(args).mydict[index][index].a = 21
function(args).mydict[index][index].b = 42
function(args).mydict[index][index].c = 63
@end example

write this:

@example
ref = function(args).mydict[index][index]
ref.a = 21
ref.b = 42
ref.c = 63
@end example

This also has the side-effect of increasing execution speed because name
bindings are resolved at run-time in Python, and the second version only needs
to perform the resolution once.

Similar proposals that would introduce syntax to further reduce code volume,
such as using a ‘leading dot’, have been rejected in favour of explicitness (see
@indicateurl{https://mail.python.org/pipermail/python-ideas/2016-May/040070.html}).

@node Why don’t generators support the with statement?,Why are colons required for the if/while/def/class statements?,Why doesn’t Python have a “with” statement for attribute assignments?,Design and History FAQ
@anchor{faq/design why-don-t-generators-support-the-with-statement}@anchor{5cab}
@subsection Why don’t generators support the with statement?


For technical reasons, a generator used directly as a context manager
would not work correctly.  When, as is most common, a generator is used as
an iterator run to completion, no closing is needed.  When it is, wrap
it as @ref{1595,,contextlib.closing(generator)}
in the @ref{187,,with} statement.

@node Why are colons required for the if/while/def/class statements?,Why does Python allow commas at the end of lists and tuples?,Why don’t generators support the with statement?,Design and History FAQ
@anchor{faq/design why-are-colons-required-for-the-if-while-def-class-statements}@anchor{5cac}
@subsection Why are colons required for the if/while/def/class statements?


The colon is required primarily to enhance readability (one of the results of
the experimental ABC language).  Consider this:

@example
if a == b
    print(a)
@end example

versus

@example
if a == b:
    print(a)
@end example

Notice how the second one is slightly easier to read.  Notice further how a
colon sets off the example in this FAQ answer; it’s a standard usage in English.

Another minor reason is that the colon makes it easier for editors with syntax
highlighting; they can look for colons to decide when indentation needs to be
increased instead of having to do a more elaborate parsing of the program text.

@node Why does Python allow commas at the end of lists and tuples?,,Why are colons required for the if/while/def/class statements?,Design and History FAQ
@anchor{faq/design why-does-python-allow-commas-at-the-end-of-lists-and-tuples}@anchor{5cad}
@subsection Why does Python allow commas at the end of lists and tuples?


Python lets you add a trailing comma at the end of lists, tuples, and
dictionaries:

@example
[1, 2, 3,]
('a', 'b', 'c',)
d = @{
    "A": [1, 5],
    "B": [6, 7],  # last trailing comma is optional but good style
@}
@end example

There are several reasons to allow this.

When you have a literal value for a list, tuple, or dictionary spread across
multiple lines, it’s easier to add more elements because you don’t have to
remember to add a comma to the previous line.  The lines can also be reordered
without creating a syntax error.

Accidentally omitting the comma can lead to errors that are hard to diagnose.
For example:

@example
x = [
  "fee",
  "fie"
  "foo",
  "fum"
]
@end example

This list looks like it has four elements, but it actually contains three:
“fee”, “fiefoo” and “fum”.  Always adding the comma avoids this source of error.

Allowing the trailing comma may also make programmatic code generation easier.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Library and Extension FAQ,Extending/Embedding FAQ,Design and History FAQ,Python Frequently Asked Questions
@anchor{faq/library doc}@anchor{5cae}@anchor{faq/library library-and-extension-faq}@anchor{5caf}@anchor{faq/library translation-repo}@anchor{5cb0}
@section Library and Extension FAQ



@menu
* General Library Questions:: 
* Common tasks:: 
* Threads:: 
* Input and Output: Input and Output<2>. 
* Network/Internet Programming:: 
* Databases:: 
* Mathematics and Numerics:: 

@end menu

@node General Library Questions,Common tasks,,Library and Extension FAQ
@anchor{faq/library general-library-questions}@anchor{5cb1}
@subsection General Library Questions


@menu
* How do I find a module or application to perform task X?:: 
* Where is the math.py (socket.py@comma{} regex.py@comma{} etc.) source file?: Where is the math py socket py regex py etc source file?. 
* How do I make a Python script executable on Unix?:: 
* Is there a curses/termcap package for Python?:: 
* Is there an equivalent to C’s onexit() in Python?: Is there an equivalent to C’s onexit in Python?. 
* Why don’t my signal handlers work?:: 

@end menu

@node How do I find a module or application to perform task X?,Where is the math py socket py regex py etc source file?,,General Library Questions
@anchor{faq/library how-do-i-find-a-module-or-application-to-perform-task-x}@anchor{5cb2}
@subsubsection How do I find a module or application to perform task X?


Check @ref{14a,,the Library Reference} to see if there’s a relevant
standard library module.  (Eventually you’ll learn what’s in the standard
library and will be able to skip this step.)

For third-party packages, search the Python Package Index@footnote{https://pypi.org} or try Google@footnote{https://www.google.com} or
another web search engine.  Searching for “Python” plus a keyword or two for
your topic of interest will usually find something helpful.

@node Where is the math py socket py regex py etc source file?,How do I make a Python script executable on Unix?,How do I find a module or application to perform task X?,General Library Questions
@anchor{faq/library where-is-the-math-py-socket-py-regex-py-etc-source-file}@anchor{5cb3}
@subsubsection Where is the math.py (socket.py, regex.py, etc.) source file?


If you can’t find a source file for a module it may be a built-in or
dynamically loaded module implemented in C, C++ or other compiled language.
In this case you may not have the source file or it may be something like
@code{mathmodule.c}, somewhere in a C source directory (not on the Python Path).

There are (at least) three kinds of modules in Python:


@enumerate 

@item 
modules written in Python (.py);

@item 
modules written in C and dynamically loaded (.dll, .pyd, .so, .sl, etc);

@item 
modules written in C and linked with the interpreter; to get a list of these,
type:

@example
import sys
print(sys.builtin_module_names)
@end example
@end enumerate

@node How do I make a Python script executable on Unix?,Is there a curses/termcap package for Python?,Where is the math py socket py regex py etc source file?,General Library Questions
@anchor{faq/library how-do-i-make-a-python-script-executable-on-unix}@anchor{5cb4}
@subsubsection How do I make a Python script executable on Unix?


You need to do two things: the script file’s mode must be executable and the
first line must begin with @code{#!} followed by the path of the Python
interpreter.

The first is done by executing @code{chmod +x scriptfile} or perhaps @code{chmod 755
scriptfile}.

The second can be done in a number of ways.  The most straightforward way is to
write

@example
#!/usr/local/bin/python
@end example

as the very first line of your file, using the pathname for where the Python
interpreter is installed on your platform.

If you would like the script to be independent of where the Python interpreter
lives, you can use the @code{env} program.  Almost all Unix variants support
the following, assuming the Python interpreter is in a directory on the user’s
@geindex PATH
@geindex environment variable; PATH
@code{PATH}:

@example
#!/usr/bin/env python
@end example

`Don’t' do this for CGI scripts.  The 
@geindex PATH
@geindex environment variable; PATH
@code{PATH} variable for CGI scripts is
often very minimal, so you need to use the actual absolute pathname of the
interpreter.

Occasionally, a user’s environment is so full that the @code{/usr/bin/env}
program fails; or there’s no env program at all.  In that case, you can try the
following hack (due to Alex Rezinsky):

@example
#! /bin/sh
""":"
exec python $0 $@{1+"$@@"@}
"""
@end example

The minor disadvantage is that this defines the script’s __doc__ string.
However, you can fix that by adding

@example
__doc__ = """...Whatever..."""
@end example

@node Is there a curses/termcap package for Python?,Is there an equivalent to C’s onexit in Python?,How do I make a Python script executable on Unix?,General Library Questions
@anchor{faq/library is-there-a-curses-termcap-package-for-python}@anchor{5cb5}
@subsubsection Is there a curses/termcap package for Python?


@c XXX curses *is* built by default, isn't it?

For Unix variants: The standard Python source distribution comes with a curses
module in the Modules@footnote{https://github.com/python/cpython/tree/3.14/Modules} subdirectory, though it’s not compiled by default.
(Note that this is not available in the Windows distribution – there is no
curses module for Windows.)

The @ref{2f,,curses} module supports basic curses features as well as many additional
functions from ncurses and SYSV curses such as colour, alternative character set
support, pads, and mouse support. This means the module isn’t compatible with
operating systems that only have BSD curses, but there don’t seem to be any
currently maintained OSes that fall into this category.

@node Is there an equivalent to C’s onexit in Python?,Why don’t my signal handlers work?,Is there a curses/termcap package for Python?,General Library Questions
@anchor{faq/library is-there-an-equivalent-to-c-s-onexit-in-python}@anchor{5cb6}
@subsubsection Is there an equivalent to C’s onexit() in Python?


The @ref{d,,atexit} module provides a register function that is similar to C’s
@code{onexit()}.

@node Why don’t my signal handlers work?,,Is there an equivalent to C’s onexit in Python?,General Library Questions
@anchor{faq/library why-don-t-my-signal-handlers-work}@anchor{5cb7}
@subsubsection Why don’t my signal handlers work?


The most common problem is that the signal handler is declared with the wrong
argument list.  It is called as

@example
handler(signum, frame)
@end example

so it should be declared with two parameters:

@example
def handler(signum, frame):
    ...
@end example

@node Common tasks,Threads,General Library Questions,Library and Extension FAQ
@anchor{faq/library common-tasks}@anchor{5cb8}
@subsection Common tasks


@menu
* How do I test a Python program or component?:: 
* How do I create documentation from doc strings?:: 
* How do I get a single keypress at a time?:: 

@end menu

@node How do I test a Python program or component?,How do I create documentation from doc strings?,,Common tasks
@anchor{faq/library how-do-i-test-a-python-program-or-component}@anchor{5cb9}
@subsubsection How do I test a Python program or component?


Python comes with two testing frameworks.  The @ref{3e,,doctest} module finds
examples in the docstrings for a module and runs them, comparing the output with
the expected output given in the docstring.

The @ref{10d,,unittest} module is a fancier testing framework modelled on Java and
Smalltalk testing frameworks.

To make testing easier, you should use good modular design in your program.
Your program should have almost all functionality
encapsulated in either functions or class methods – and this sometimes has the
surprising and delightful effect of making the program run faster (because local
variable accesses are faster than global accesses).  Furthermore the program
should avoid depending on mutating global variables, since this makes testing
much more difficult to do.

The “global main logic” of your program may be as simple as

@example
if __name__ == "__main__":
    main_logic()
@end example

at the bottom of the main module of your program.

Once your program is organized as a tractable collection of function and class
behaviours, you should write test functions that exercise the behaviours.  A
test suite that automates a sequence of tests can be associated with each module.
This sounds like a lot of work, but since Python is so terse and flexible it’s
surprisingly easy.  You can make coding much more pleasant and fun by writing
your test functions in parallel with the “production code”, since this makes it
easy to find bugs and even design flaws earlier.

“Support modules” that are not intended to be the main module of a program may
include a self-test of the module.

@example
if __name__ == "__main__":
    self_test()
@end example

Even programs that interact with complex external interfaces may be tested when
the external interfaces are unavailable by using “fake” interfaces implemented
in Python.

@node How do I create documentation from doc strings?,How do I get a single keypress at a time?,How do I test a Python program or component?,Common tasks
@anchor{faq/library how-do-i-create-documentation-from-doc-strings}@anchor{5cba}
@subsubsection How do I create documentation from doc strings?


The @ref{ba,,pydoc} module can create HTML from the doc strings in your Python
source code.  An alternative for creating API documentation purely from
docstrings is epydoc@footnote{https://epydoc.sourceforge.net/}.  Sphinx@footnote{https://www.sphinx-doc.org} can also include docstring content.

@node How do I get a single keypress at a time?,,How do I create documentation from doc strings?,Common tasks
@anchor{faq/library how-do-i-get-a-single-keypress-at-a-time}@anchor{5cbb}
@subsubsection How do I get a single keypress at a time?


For Unix variants there are several solutions.  It’s straightforward to do this
using curses, but curses is a fairly large module to learn.

@c XXX this doesn't work out of the box, some IO expert needs to check why
@c 
@c Here's a solution without curses::
@c 
@c import termios, fcntl, sys, os
@c fd = sys.stdin.fileno()
@c 
@c oldterm = termios.tcgetattr(fd)
@c newattr = termios.tcgetattr(fd)
@c newattr[3] = newattr[3] & ~termios.ICANON & ~termios.ECHO
@c termios.tcsetattr(fd, termios.TCSANOW, newattr)
@c 
@c oldflags = fcntl.fcntl(fd, fcntl.F_GETFL)
@c fcntl.fcntl(fd, fcntl.F_SETFL, oldflags | os.O_NONBLOCK)
@c 
@c try:
@c     while True:
@c         try:
@c             c = sys.stdin.read(1)
@c             print("Got character", repr(c))
@c         except OSError:
@c             pass
@c finally:
@c     termios.tcsetattr(fd, termios.TCSAFLUSH, oldterm)
@c     fcntl.fcntl(fd, fcntl.F_SETFL, oldflags)
@c 
@c You need the :mod:`termios` and the :mod:`fcntl` module for any of this to
@c work, and I've only tried it on Linux, though it should work elsewhere.  In
@c this code, characters are read and printed one at a time.
@c 
@c :func:`termios.tcsetattr` turns off stdin's echoing and disables canonical
@c mode.  :func:`fcntl.fnctl` is used to obtain stdin's file descriptor flags
@c and modify them for non-blocking mode.  Since reading stdin when it is empty
@c results in an :exc:`OSError`, this error is caught and ignored.
@c 
@c .. versionchanged:: 3.3
@c    *sys.stdin.read* used to raise :exc:`IOError`. Starting from Python 3.3
@c    :exc:`IOError` is alias for :exc:`OSError`.

@node Threads,Input and Output<2>,Common tasks,Library and Extension FAQ
@anchor{faq/library threads}@anchor{5cbc}
@subsection Threads


@menu
* How do I program using threads?:: 
* None of my threads seem to run; why?: None of my threads seem to run why?. 
* How do I parcel out work among a bunch of worker threads?:: 
* What kinds of global value mutation are thread-safe?:: 
* Can’t we get rid of the Global Interpreter Lock?:: 

@end menu

@node How do I program using threads?,None of my threads seem to run why?,,Threads
@anchor{faq/library how-do-i-program-using-threads}@anchor{5cbd}
@subsubsection How do I program using threads?


Be sure to use the @ref{f3,,threading} module and not the @ref{2,,_thread} module.
The @code{threading} module builds convenient abstractions on top of the
low-level primitives provided by the @code{_thread} module.

@node None of my threads seem to run why?,How do I parcel out work among a bunch of worker threads?,How do I program using threads?,Threads
@anchor{faq/library none-of-my-threads-seem-to-run-why}@anchor{5cbe}
@subsubsection None of my threads seem to run: why?


As soon as the main thread exits, all threads are killed.  Your main thread is
running too quickly, giving the threads no time to do any work.

A simple fix is to add a sleep to the end of the program that’s long enough for
all the threads to finish:

@example
import threading, time

def thread_task(name, n):
    for i in range(n):
        print(name, i)

for i in range(10):
    T = threading.Thread(target=thread_task, args=(str(i), i))
    T.start()

time.sleep(10)  # <---------------------------!
@end example

But now (on many platforms) the threads don’t run in parallel, but appear to run
sequentially, one at a time!  The reason is that the OS thread scheduler doesn’t
start a new thread until the previous thread is blocked.

A simple fix is to add a tiny sleep to the start of the run function:

@example
def thread_task(name, n):
    time.sleep(0.001)  # <--------------------!
    for i in range(n):
        print(name, i)

for i in range(10):
    T = threading.Thread(target=thread_task, args=(str(i), i))
    T.start()

time.sleep(10)
@end example

Instead of trying to guess a good delay value for @ref{8ae,,time.sleep()},
it’s better to use some kind of semaphore mechanism.  One idea is to use the
@ref{bb,,queue} module to create a queue object, let each thread append a token to
the queue when it finishes, and let the main thread read as many tokens from the
queue as there are threads.

@node How do I parcel out work among a bunch of worker threads?,What kinds of global value mutation are thread-safe?,None of my threads seem to run why?,Threads
@anchor{faq/library how-do-i-parcel-out-work-among-a-bunch-of-worker-threads}@anchor{5cbf}
@subsubsection How do I parcel out work among a bunch of worker threads?


The easiest way is to use the @ref{24,,concurrent.futures} module,
especially the @ref{94e,,ThreadPoolExecutor} class.

Or, if you want fine control over the dispatching algorithm, you can write
your own logic manually.  Use the @ref{bb,,queue} module to create a queue
containing a list of jobs.  The @ref{15a0,,Queue} class maintains a
list of objects and has a @code{.put(obj)} method that adds items to the queue and
a @code{.get()} method to return them.  The class will take care of the locking
necessary to ensure that each job is handed out exactly once.

Here’s a trivial example:

@example
import threading, queue, time

# The worker thread gets jobs off the queue.  When the queue is empty, it
# assumes there will be no more work and exits.
# (Realistically workers will run until terminated.)
def worker():
    print('Running worker')
    time.sleep(0.1)
    while True:
        try:
            arg = q.get(block=False)
        except queue.Empty:
            print('Worker', threading.current_thread(), end=' ')
            print('queue empty')
            break
        else:
            print('Worker', threading.current_thread(), end=' ')
            print('running with argument', arg)
            time.sleep(0.5)

# Create queue
q = queue.Queue()

# Start a pool of 5 workers
for i in range(5):
    t = threading.Thread(target=worker, name='worker %i' % (i+1))
    t.start()

# Begin adding work to the queue
for i in range(50):
    q.put(i)

# Give threads time to run
print('Main thread sleeping')
time.sleep(5)
@end example

When run, this will produce the following output:

@example
Running worker
Running worker
Running worker
Running worker
Running worker
Main thread sleeping
Worker <Thread(worker 1, started 130283832797456)> running with argument 0
Worker <Thread(worker 2, started 130283824404752)> running with argument 1
Worker <Thread(worker 3, started 130283816012048)> running with argument 2
Worker <Thread(worker 4, started 130283807619344)> running with argument 3
Worker <Thread(worker 5, started 130283799226640)> running with argument 4
Worker <Thread(worker 1, started 130283832797456)> running with argument 5
...
@end example

Consult the module’s documentation for more details; the @ref{15a0,,Queue}
class provides a featureful interface.

@node What kinds of global value mutation are thread-safe?,Can’t we get rid of the Global Interpreter Lock?,How do I parcel out work among a bunch of worker threads?,Threads
@anchor{faq/library what-kinds-of-global-value-mutation-are-thread-safe}@anchor{5cc0}
@subsubsection What kinds of global value mutation are thread-safe?


A @ref{474,,global interpreter lock} (GIL) is used internally to ensure that only one
thread runs in the Python VM at a time.  In general, Python offers to switch
among threads only between bytecode instructions; how frequently it switches can
be set via @ref{b4a,,sys.setswitchinterval()}.  Each bytecode instruction and
therefore all the C implementation code reached from each instruction is
therefore atomic from the point of view of a Python program.

In theory, this means an exact accounting requires an exact understanding of the
PVM bytecode implementation.  In practice, it means that operations on shared
variables of built-in data types (ints, lists, dicts, etc) that “look atomic”
really are.

For example, the following operations are all atomic (L, L1, L2 are lists, D,
D1, D2 are dicts, x, y are objects, i, j are ints):

@example
L.append(x)
L1.extend(L2)
x = L[i]
x = L.pop()
L1[i:j] = L2
L.sort()
x = y
x.field = y
D[x] = y
D1.update(D2)
D.keys()
@end example

These aren’t:

@example
i = i+1
L.append(L[-1])
L[i] = L[j]
D[x] = D[x] + 1
@end example

Operations that replace other objects may invoke those other objects’
@ref{1203,,__del__()} method when their reference count reaches zero, and that can
affect things.  This is especially true for the mass updates to dictionaries and
lists.  When in doubt, use a mutex!

@node Can’t we get rid of the Global Interpreter Lock?,,What kinds of global value mutation are thread-safe?,Threads
@anchor{faq/library can-t-we-get-rid-of-the-global-interpreter-lock}@anchor{5cc1}
@subsubsection Can’t we get rid of the Global Interpreter Lock?


The @ref{474,,global interpreter lock} (GIL) is often seen as a hindrance to Python’s
deployment on high-end multiprocessor server machines, because a multi-threaded
Python program effectively only uses one CPU, due to the insistence that
(almost) all Python code can only run while the GIL is held.

With the approval of 
@geindex Python Enhancement Proposals; PEP 703
PEP 703@footnote{https://peps.python.org/pep-0703/} work is now underway to remove the GIL from the
CPython implementation of Python.  Initially it will be implemented as an
optional compiler flag when building the interpreter, and so separate
builds will be available with and without the GIL.  Long-term, the hope is
to settle on a single build, once the performance implications of removing the
GIL are fully understood.  Python 3.13 is likely to be the first release
containing this work, although it may not be completely functional in this
release.

The current work to remove the GIL is based on a
fork of Python 3.9 with the GIL removed@footnote{https://github.com/colesbury/nogil}
by Sam Gross.
Prior to that,
in the days of Python 1.5, Greg Stein actually implemented a comprehensive
patch set (the “free threading” patches) that removed the GIL and replaced it
with fine-grained locking.  Adam Olsen did a similar experiment
in his python-safethread@footnote{https://code.google.com/archive/p/python-safethread}
project.  Unfortunately, both of these earlier experiments exhibited a sharp
drop in single-thread
performance (at least 30% slower), due to the amount of fine-grained locking
necessary to compensate for the removal of the GIL.  The Python 3.9 fork
is the first attempt at removing the GIL with an acceptable performance
impact.

The presence of the GIL in current Python releases
doesn’t mean that you can’t make good use of Python on multi-CPU machines!
You just have to be creative with dividing the work up between multiple
`processes' rather than multiple `threads'.  The
@ref{1d8,,ProcessPoolExecutor} class in the new
@ref{24,,concurrent.futures} module provides an easy way of doing so; the
@ref{98,,multiprocessing} module provides a lower-level API in case you want
more control over dispatching of tasks.

Judicious use of C extensions will also help; if you use a C extension to
perform a time-consuming task, the extension can release the GIL while the
thread of execution is in the C code and allow other threads to get some work
done.  Some standard library modules such as @ref{13a,,zlib} and @ref{6c,,hashlib}
already do this.

An alternative approach to reducing the impact of the GIL is
to make the GIL a per-interpreter-state lock rather than truly global.
This was @ref{670,,first implemented in Python 3.12} and is
available in the C API. A Python interface to it is expected in Python 3.13.
The main limitation to it at the moment is likely to be 3rd party extension
modules, since these must be written with multiple interpreters in mind in
order to be usable, so many older extension modules will not be usable.

@node Input and Output<2>,Network/Internet Programming,Threads,Library and Extension FAQ
@anchor{faq/library input-and-output}@anchor{5cc2}
@subsection Input and Output


@menu
* How do I delete a file? (And other file questions…): How do I delete a file? And other file questions…. 
* How do I copy a file?:: 
* How do I read (or write) binary data?: How do I read or write binary data?. 
* I can’t seem to use os.read() on a pipe created with os.popen(); why?: I can’t seem to use os read on a pipe created with os popen ; why?. 
* How do I access the serial (RS232) port?: How do I access the serial RS232 port?. 
* Why doesn’t closing sys.stdout (stdin@comma{} stderr) really close it?: Why doesn’t closing sys stdout stdin stderr really close it?. 

@end menu

@node How do I delete a file? And other file questions…,How do I copy a file?,,Input and Output<2>
@anchor{faq/library how-do-i-delete-a-file-and-other-file-questions}@anchor{5cc3}
@subsubsection How do I delete a file? (And other file questions…)


Use @code{os.remove(filename)} or @code{os.unlink(filename)}; for documentation, see
the @ref{a5,,os} module.  The two functions are identical; @ref{1301,,unlink()} is simply
the name of the Unix system call for this function.

To remove a directory, use @ref{12ff,,os.rmdir()}; use @ref{52c,,os.mkdir()} to create one.
@code{os.makedirs(path)} will create any intermediate directories in @code{path} that
don’t exist. @code{os.removedirs(path)} will remove intermediate directories as
long as they’re empty; if you want to delete an entire directory tree and its
contents, use @ref{354,,shutil.rmtree()}.

To rename a file, use @code{os.rename(old_path, new_path)}.

To truncate a file, open it using @code{f = open(filename, "rb+")}, and use
@code{f.truncate(offset)}; offset defaults to the current seek position.  There’s
also @code{os.ftruncate(fd, offset)} for files opened with @ref{f98,,os.open()}, where
`fd' is the file descriptor (a small integer).

The @ref{ca,,shutil} module also contains a number of functions to work on files
including @ref{c54,,copyfile()}, @ref{c24,,copytree()}, and
@ref{354,,rmtree()}.

@node How do I copy a file?,How do I read or write binary data?,How do I delete a file? And other file questions…,Input and Output<2>
@anchor{faq/library how-do-i-copy-a-file}@anchor{5cc4}
@subsubsection How do I copy a file?


The @ref{ca,,shutil} module contains a @ref{c54,,copyfile()} function.
Note that on Windows NTFS volumes, it does not copy
alternate data streams@footnote{https://en.wikipedia.org/wiki/NTFS#Alternate_data_stream_(ADS)}
nor resource forks@footnote{https://en.wikipedia.org/wiki/Resource_fork}
on macOS HFS+ volumes, though both are now rarely used.
It also doesn’t copy file permissions and metadata, though using
@ref{c56,,shutil.copy2()} instead will preserve most (though not all) of it.

@node How do I read or write binary data?,I can’t seem to use os read on a pipe created with os popen ; why?,How do I copy a file?,Input and Output<2>
@anchor{faq/library how-do-i-read-or-write-binary-data}@anchor{5cc5}
@subsubsection How do I read (or write) binary data?


To read or write complex binary data formats, it’s best to use the @ref{db,,struct}
module.  It allows you to take a string containing binary data (usually numbers)
and convert it to Python objects; and vice versa.

For example, the following code reads two 2-byte integers and one 4-byte integer
in big-endian format from a file:

@example
import struct

with open(filename, "rb") as f:
    s = f.read(8)
    x, y, z = struct.unpack(">hhl", s)
@end example

The ‘>’ in the format string forces big-endian data; the letter ‘h’ reads one
“short integer” (2 bytes), and ‘l’ reads one “long integer” (4 bytes) from the
string.

For data that is more regular (e.g. a homogeneous list of ints or floats),
you can also use the @ref{8,,array} module.

@cartouche
@quotation Note 
To read and write binary data, it is mandatory to open the file in
binary mode (here, passing @code{"rb"} to @ref{318,,open()}).  If you use
@code{"r"} instead (the default), the file will be open in text mode
and @code{f.read()} will return @ref{16a,,str} objects rather than
@ref{193,,bytes} objects.
@end quotation
@end cartouche

@node I can’t seem to use os read on a pipe created with os popen ; why?,How do I access the serial RS232 port?,How do I read or write binary data?,Input and Output<2>
@anchor{faq/library i-can-t-seem-to-use-os-read-on-a-pipe-created-with-os-popen-why}@anchor{5cc6}
@subsubsection I can’t seem to use os.read() on a pipe created with os.popen(); why?


@ref{f9b,,os.read()} is a low-level function which takes a file descriptor, a small
integer representing the opened file.  @ref{31c,,os.popen()} creates a high-level
file object, the same type returned by the built-in @ref{318,,open()} function.
Thus, to read `n' bytes from a pipe `p' created with @code{os.popen()}, you need to
use @code{p.read(n)}.

@node How do I access the serial RS232 port?,Why doesn’t closing sys stdout stdin stderr really close it?,I can’t seem to use os read on a pipe created with os popen ; why?,Input and Output<2>
@anchor{faq/library how-do-i-access-the-serial-rs232-port}@anchor{5cc7}
@subsubsection How do I access the serial (RS232) port?


For Win32, OSX, Linux, BSD, Jython, IronPython:

@quotation

pyserial@footnote{https://pypi.org/project/pyserial/}
@end quotation

For Unix, see a Usenet post by Mitch Chapman:

@quotation

@indicateurl{https://groups.google.com/groups?selm=34A04430.CF9@@ohioee.com}
@end quotation

@node Why doesn’t closing sys stdout stdin stderr really close it?,,How do I access the serial RS232 port?,Input and Output<2>
@anchor{faq/library why-doesn-t-closing-sys-stdout-stdin-stderr-really-close-it}@anchor{5cc8}
@subsubsection Why doesn’t closing sys.stdout (stdin, stderr) really close it?


Python @ref{13cf,,file objects} are a high-level layer of
abstraction on low-level C file descriptors.

For most file objects you create in Python via the built-in @ref{318,,open()}
function, @code{f.close()} marks the Python file object as being closed from
Python’s point of view, and also arranges to close the underlying C file
descriptor.  This also happens automatically in @code{f}’s destructor, when
@code{f} becomes garbage.

But stdin, stdout and stderr are treated specially by Python, because of the
special status also given to them by C.  Running @code{sys.stdout.close()} marks
the Python-level file object as being closed, but does `not' close the
associated C file descriptor.

To close the underlying C file descriptor for one of these three, you should
first be sure that’s what you really want to do (e.g., you may confuse
extension modules trying to do I/O).  If it is, use @ref{d71,,os.close()}:

@example
os.close(stdin.fileno())
os.close(stdout.fileno())
os.close(stderr.fileno())
@end example

Or you can use the numeric constants 0, 1 and 2, respectively.

@node Network/Internet Programming,Databases,Input and Output<2>,Library and Extension FAQ
@anchor{faq/library network-internet-programming}@anchor{5cc9}
@subsection Network/Internet Programming


@menu
* What WWW tools are there for Python?:: 
* What module should I use to help with generating HTML?:: 
* How do I send mail from a Python script?:: 
* How do I avoid blocking in the connect() method of a socket?: How do I avoid blocking in the connect method of a socket?. 

@end menu

@node What WWW tools are there for Python?,What module should I use to help with generating HTML?,,Network/Internet Programming
@anchor{faq/library what-www-tools-are-there-for-python}@anchor{5cca}
@subsubsection What WWW tools are there for Python?


See the chapters titled @ref{3f40,,Internet Protocols and Support} and @ref{3b36,,Internet Data Handling} in the Library
Reference Manual.  Python has many modules that will help you build server-side
and client-side web systems.

@c XXX check if wiki page is still up to date

A summary of available frameworks is maintained by Paul Boddie at
@indicateurl{https://wiki.python.org/moin/WebProgramming}.

@node What module should I use to help with generating HTML?,How do I send mail from a Python script?,What WWW tools are there for Python?,Network/Internet Programming
@anchor{faq/library what-module-should-i-use-to-help-with-generating-html}@anchor{5ccb}
@subsubsection What module should I use to help with generating HTML?


@c XXX add modern template languages

You can find a collection of useful links on the Web Programming wiki page@footnote{https://wiki.python.org/moin/WebProgramming}.

@node How do I send mail from a Python script?,How do I avoid blocking in the connect method of a socket?,What module should I use to help with generating HTML?,Network/Internet Programming
@anchor{faq/library how-do-i-send-mail-from-a-python-script}@anchor{5ccc}
@subsubsection How do I send mail from a Python script?


Use the standard library module @ref{cf,,smtplib}.

Here’s a very simple interactive mail sender that uses it.  This method will
work on any host that supports an SMTP listener.

@example
import sys, smtplib

fromaddr = input("From: ")
toaddrs  = input("To: ").split(',')
print("Enter message, end with ^D:")
msg = '@w{'}
while True:
    line = sys.stdin.readline()
    if not line:
        break
    msg += line

# The actual mail send
server = smtplib.SMTP('localhost')
server.sendmail(fromaddr, toaddrs, msg)
server.quit()
@end example

A Unix-only alternative uses sendmail.  The location of the sendmail program
varies between systems; sometimes it is @code{/usr/lib/sendmail}, sometimes
@code{/usr/sbin/sendmail}.  The sendmail manual page will help you out.  Here’s
some sample code:

@example
import os

SENDMAIL = "/usr/sbin/sendmail"  # sendmail location
p = os.popen("%s -t -i" % SENDMAIL, "w")
p.write("To: receiver@@example.com\n")
p.write("Subject: test\n")
p.write("\n")  # blank line separating headers from body
p.write("Some text\n")
p.write("some more text\n")
sts = p.close()
if sts != 0:
    print("Sendmail exit status", sts)
@end example

@node How do I avoid blocking in the connect method of a socket?,,How do I send mail from a Python script?,Network/Internet Programming
@anchor{faq/library how-do-i-avoid-blocking-in-the-connect-method-of-a-socket}@anchor{5ccd}
@subsubsection How do I avoid blocking in the connect() method of a socket?


The @ref{c6,,select} module is commonly used to help with asynchronous I/O on
sockets.

To prevent the TCP connect from blocking, you can set the socket to non-blocking
mode.  Then when you do the @ref{fa9,,connect()},
you will either connect immediately
(unlikely) or get an exception that contains the error number as @code{.errno}.
@code{errno.EINPROGRESS} indicates that the connection is in progress, but hasn’t
finished yet.  Different OSes will return different values, so you’re going to
have to check what’s returned on your system.

You can use the @ref{1745,,connect_ex()} method
to avoid creating an exception.
It will just return the errno value.
To poll, you can call @code{connect_ex()} again later
– @code{0} or @code{errno.EISCONN} indicate that you’re connected – or you can pass this
socket to @ref{fa6,,select.select()} to check if it’s writable.

@cartouche
@quotation Note 
The @ref{b,,asyncio} module provides a general purpose single-threaded and
concurrent asynchronous library, which can be used for writing non-blocking
network code.
The third-party Twisted@footnote{https://twisted.org/} library is
a popular and feature-rich alternative.
@end quotation
@end cartouche

@node Databases,Mathematics and Numerics,Network/Internet Programming,Library and Extension FAQ
@anchor{faq/library databases}@anchor{5cce}
@subsection Databases


@menu
* Are there any interfaces to database packages in Python?:: 
* How do you implement persistent objects in Python?:: 

@end menu

@node Are there any interfaces to database packages in Python?,How do you implement persistent objects in Python?,,Databases
@anchor{faq/library are-there-any-interfaces-to-database-packages-in-python}@anchor{5ccf}
@subsubsection Are there any interfaces to database packages in Python?


Yes.

Interfaces to disk-based hashes such as @ref{38,,DBM} and @ref{37,,GDBM} are also included with standard Python.  There is also the
@ref{d4,,sqlite3} module, which provides a lightweight disk-based relational
database.

Support for most relational databases is available.  See the
DatabaseProgramming wiki page@footnote{https://wiki.python.org/moin/DatabaseProgramming} for details.

@node How do you implement persistent objects in Python?,,Are there any interfaces to database packages in Python?,Databases
@anchor{faq/library how-do-you-implement-persistent-objects-in-python}@anchor{5cd0}
@subsubsection How do you implement persistent objects in Python?


The @ref{ab,,pickle} library module solves this in a very general way (though you
still can’t store things like open files, sockets or windows), and the
@ref{c8,,shelve} library module uses pickle and (g)dbm to create persistent
mappings containing arbitrary Python objects.

@node Mathematics and Numerics,,Databases,Library and Extension FAQ
@anchor{faq/library mathematics-and-numerics}@anchor{5cd1}
@subsection Mathematics and Numerics


@menu
* How do I generate random numbers in Python?:: 

@end menu

@node How do I generate random numbers in Python?,,,Mathematics and Numerics
@anchor{faq/library how-do-i-generate-random-numbers-in-python}@anchor{5cd2}
@subsubsection How do I generate random numbers in Python?


The standard module @ref{bd,,random} implements a random number generator.  Usage
is simple:

@example
import random
random.random()
@end example

This returns a random floating-point number in the range [0, 1).

There are also many other specialized generators in this module, such as:


@itemize *

@item 
@code{randrange(a, b)} chooses an integer in the range [a, b).

@item 
@code{uniform(a, b)} chooses a floating-point number in the range [a, b).

@item 
@code{normalvariate(mean, sdev)} samples the normal (Gaussian) distribution.
@end itemize

Some higher-level functions operate on sequences directly, such as:


@itemize *

@item 
@code{choice(S)} chooses a random element from a given sequence.

@item 
@code{shuffle(L)} shuffles a list in-place, i.e. permutes it randomly.
@end itemize

There’s also a @code{Random} class you can instantiate to create independent
multiple random number generators.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Extending/Embedding FAQ,Python on Windows FAQ,Library and Extension FAQ,Python Frequently Asked Questions
@anchor{faq/extending doc}@anchor{5cd3}@anchor{faq/extending extending-embedding-faq}@anchor{5cd4}@anchor{faq/extending translation-repo}@anchor{5cd5}
@section Extending/Embedding FAQ



@c XXX need review for Python 3.

@menu
* Can I create my own functions in C?:: 
* Can I create my own functions in C++?:: 
* Writing C is hard; are there any alternatives?:: 
* How can I execute arbitrary Python statements from C?:: 
* How can I evaluate an arbitrary Python expression from C?:: 
* How do I extract C values from a Python object?:: 
* How do I use Py_BuildValue() to create a tuple of arbitrary length?: How do I use Py_BuildValue to create a tuple of arbitrary length?. 
* How do I call an object’s method from C?:: 
* How do I catch the output from PyErr_Print() (or anything that prints to stdout/stderr)?: How do I catch the output from PyErr_Print or anything that prints to stdout/stderr ?. 
* How do I access a module written in Python from C?:: 
* How do I interface to C++ objects from Python?:: 
* I added a module using the Setup file and the make fails; why?:: 
* How do I debug an extension?:: 
* I want to compile a Python module on my Linux system@comma{} but some files are missing. Why?: I want to compile a Python module on my Linux system but some files are missing Why?. 
* How do I tell “incomplete input” from “invalid input”?:: 
* How do I find undefined g++ symbols __builtin_new or __pure_virtual?:: 
* Can I create an object class with some methods implemented in C and others in Python (e.g. through inheritance)?: Can I create an object class with some methods implemented in C and others in Python e g through inheritance ?. 

@end menu

@node Can I create my own functions in C?,Can I create my own functions in C++?,,Extending/Embedding FAQ
@anchor{faq/extending can-i-create-my-own-functions-in-c}@anchor{5cd6}
@subsection Can I create my own functions in C?


Yes, you can create built-in modules containing functions, variables, exceptions
and even new types in C.  This is explained in the document
@ref{1fff,,Extending and Embedding the Python Interpreter}.

Most intermediate or advanced Python books will also cover this topic.

@node Can I create my own functions in C++?,Writing C is hard; are there any alternatives?,Can I create my own functions in C?,Extending/Embedding FAQ
@anchor{faq/extending id1}@anchor{5cd7}
@subsection Can I create my own functions in C++?


Yes, using the C compatibility features found in C++.  Place @code{extern "C" @{
... @}} around the Python include files and put @code{extern "C"} before each
function that is going to be called by the Python interpreter.  Global or static
C++ objects with constructors are probably not a good idea.

@node Writing C is hard; are there any alternatives?,How can I execute arbitrary Python statements from C?,Can I create my own functions in C++?,Extending/Embedding FAQ
@anchor{faq/extending c-wrapper-software}@anchor{5cd8}@anchor{faq/extending writing-c-is-hard-are-there-any-alternatives}@anchor{5cd9}
@subsection Writing C is hard; are there any alternatives?


There are a number of alternatives to writing your own C extensions, depending
on what you’re trying to do. @ref{51ee,,Recommended third party tools}
offer both simpler and more sophisticated approaches to creating C and C++
extensions for Python.

@node How can I execute arbitrary Python statements from C?,How can I evaluate an arbitrary Python expression from C?,Writing C is hard; are there any alternatives?,Extending/Embedding FAQ
@anchor{faq/extending how-can-i-execute-arbitrary-python-statements-from-c}@anchor{5cda}
@subsection How can I execute arbitrary Python statements from C?


The highest-level function to do this is @ref{526b,,PyRun_SimpleString()} which takes
a single string argument to be executed in the context of the module
@code{__main__} and returns @code{0} for success and @code{-1} when an exception occurred
(including @ref{18f,,SyntaxError}).  If you want more control, use
@ref{1e02,,PyRun_String()}; see the source for @code{PyRun_SimpleString()} in
@code{Python/pythonrun.c}.

@node How can I evaluate an arbitrary Python expression from C?,How do I extract C values from a Python object?,How can I execute arbitrary Python statements from C?,Extending/Embedding FAQ
@anchor{faq/extending how-can-i-evaluate-an-arbitrary-python-expression-from-c}@anchor{5cdb}
@subsection How can I evaluate an arbitrary Python expression from C?


Call the function @ref{1e02,,PyRun_String()} from the previous question with the
start symbol @ref{5521,,Py_eval_input}; it parses an expression, evaluates it and
returns its value.

@node How do I extract C values from a Python object?,How do I use Py_BuildValue to create a tuple of arbitrary length?,How can I evaluate an arbitrary Python expression from C?,Extending/Embedding FAQ
@anchor{faq/extending how-do-i-extract-c-values-from-a-python-object}@anchor{5cdc}
@subsection How do I extract C values from a Python object?


That depends on the object’s type.  If it’s a tuple, @ref{5438,,PyTuple_Size()}
returns its length and @ref{5217,,PyTuple_GetItem()} returns the item at a specified
index.  Lists have similar functions, @ref{1626,,PyList_Size()} and
@ref{5ff,,PyList_GetItem()}.

For bytes, @ref{52e7,,PyBytes_Size()} returns its length and
@ref{52df,,PyBytes_AsStringAndSize()} provides a pointer to its value and its
length.  Note that Python bytes objects may contain null bytes so C’s
@code{strlen()} should not be used.

To test the type of an object, first make sure it isn’t @code{NULL}, and then use
@ref{15ab,,PyBytes_Check()}, @ref{56f0,,PyTuple_Check()}, @ref{5701,,PyList_Check()}, etc.

There is also a high-level API to Python objects which is provided by the
so-called ‘abstract’ interface – read @code{Include/abstract.h} for further
details.  It allows interfacing with any kind of Python sequence using calls
like @ref{5408,,PySequence_Length()}, @ref{1e76,,PySequence_GetItem()}, etc. as well
as many other useful protocols such as numbers (@ref{a99,,PyNumber_Index()} et
al.) and mappings in the PyMapping APIs.

@node How do I use Py_BuildValue to create a tuple of arbitrary length?,How do I call an object’s method from C?,How do I extract C values from a Python object?,Extending/Embedding FAQ
@anchor{faq/extending how-do-i-use-py-buildvalue-to-create-a-tuple-of-arbitrary-length}@anchor{5cdd}
@subsection How do I use Py_BuildValue() to create a tuple of arbitrary length?


You can’t.  Use @ref{5437,,PyTuple_Pack()} instead.

@node How do I call an object’s method from C?,How do I catch the output from PyErr_Print or anything that prints to stdout/stderr ?,How do I use Py_BuildValue to create a tuple of arbitrary length?,Extending/Embedding FAQ
@anchor{faq/extending how-do-i-call-an-object-s-method-from-c}@anchor{5cde}
@subsection How do I call an object’s method from C?


The @ref{640,,PyObject_CallMethod()} function can be used to call an arbitrary
method of an object.  The parameters are the object, the name of the method to
call, a format string like that used with @ref{3c0,,Py_BuildValue()}, and the
argument values:

@example
PyObject *
PyObject_CallMethod(PyObject *object, const char *method_name,
                    const char *arg_format, ...);
@end example

This works for any object that has methods – whether built-in or user-defined.
You are responsible for eventually @ref{791,,Py_DECREF()}‘ing the return value.

To call, e.g., a file object’s “seek” method with arguments 10, 0 (assuming the
file object pointer is “f”):

@example
res = PyObject_CallMethod(f, "seek", "(ii)", 10, 0);
if (res == NULL) @{
        ... an exception occurred ...
@}
else @{
        Py_DECREF(res);
@}
@end example

Note that since @ref{520c,,PyObject_CallObject()} `always' wants a tuple for the
argument list, to call a function without arguments, pass “()” for the format,
and to call a function with one argument, surround the argument in parentheses,
e.g. “(i)”.

@node How do I catch the output from PyErr_Print or anything that prints to stdout/stderr ?,How do I access a module written in Python from C?,How do I call an object’s method from C?,Extending/Embedding FAQ
@anchor{faq/extending how-do-i-catch-the-output-from-pyerr-print-or-anything-that-prints-to-stdout-stderr}@anchor{5cdf}
@subsection How do I catch the output from PyErr_Print() (or anything that prints to stdout/stderr)?


In Python code, define an object that supports the @code{write()} method.  Assign
this object to @ref{cd3,,sys.stdout} and @ref{b39,,sys.stderr}.  Call print_error, or
just allow the standard traceback mechanism to work. Then, the output will go
wherever your @code{write()} method sends it.

The easiest way to do this is to use the @ref{112f,,io.StringIO} class:

@example
>>> import io, sys
>>> sys.stdout = io.StringIO()
>>> print('foo')
>>> print('hello world!')
>>> sys.stderr.write(sys.stdout.getvalue())
foo
hello world!
@end example

A custom object to do the same would look like this:

@example
>>> import io, sys
>>> class StdoutCatcher(io.TextIOBase):
...     def __init__(self):
...         self.data = []
...     def write(self, stuff):
...         self.data.append(stuff)
...
>>> import sys
>>> sys.stdout = StdoutCatcher()
>>> print('foo')
>>> print('hello world!')
>>> sys.stderr.write('@w{'}.join(sys.stdout.data))
foo
hello world!
@end example

@node How do I access a module written in Python from C?,How do I interface to C++ objects from Python?,How do I catch the output from PyErr_Print or anything that prints to stdout/stderr ?,Extending/Embedding FAQ
@anchor{faq/extending how-do-i-access-a-module-written-in-python-from-c}@anchor{5ce0}
@subsection How do I access a module written in Python from C?


You can get a pointer to the module object as follows:

@example
module = PyImport_ImportModule("<modulename>");
@end example

If the module hasn’t been imported yet (i.e. it is not yet present in
@ref{1771,,sys.modules}), this initializes the module; otherwise it simply returns
the value of @code{sys.modules["<modulename>"]}.  Note that it doesn’t enter the
module into any namespace – it only ensures it has been initialized and is
stored in @code{sys.modules}.

You can then access the module’s attributes (i.e. any name defined in the
module) as follows:

@example
attr = PyObject_GetAttrString(module, "<attrname>");
@end example

Calling @ref{19d1,,PyObject_SetAttrString()} to assign to variables in the module
also works.

@node How do I interface to C++ objects from Python?,I added a module using the Setup file and the make fails; why?,How do I access a module written in Python from C?,Extending/Embedding FAQ
@anchor{faq/extending how-do-i-interface-to-c-objects-from-python}@anchor{5ce1}
@subsection How do I interface to C++ objects from Python?


Depending on your requirements, there are many approaches.  To do this manually,
begin by reading @ref{1fff,,the “Extending and Embedding” document}.  Realize that for the Python run-time system, there isn’t a
whole lot of difference between C and C++ – so the strategy of building a new
Python type around a C structure (pointer) type will also work for C++ objects.

For C++ libraries, see @ref{5cd8,,Writing C is hard; are there any alternatives?}.

@node I added a module using the Setup file and the make fails; why?,How do I debug an extension?,How do I interface to C++ objects from Python?,Extending/Embedding FAQ
@anchor{faq/extending i-added-a-module-using-the-setup-file-and-the-make-fails-why}@anchor{5ce2}
@subsection I added a module using the Setup file and the make fails; why?


Setup must end in a newline, if there is no newline there, the build process
fails.  (Fixing this requires some ugly shell script hackery, and this bug is so
minor that it doesn’t seem worth the effort.)

@node How do I debug an extension?,I want to compile a Python module on my Linux system but some files are missing Why?,I added a module using the Setup file and the make fails; why?,Extending/Embedding FAQ
@anchor{faq/extending how-do-i-debug-an-extension}@anchor{5ce3}
@subsection How do I debug an extension?


When using GDB with dynamically loaded extensions, you can’t set a breakpoint in
your extension until your extension is loaded.

In your @code{.gdbinit} file (or interactively), add the command:

@example
br _PyImport_LoadDynamicModule
@end example

Then, when you run GDB:

@example
$ gdb /local/bin/python
gdb) run myscript.py
gdb) continue # repeat until your extension is loaded
gdb) finish   # so that your extension is loaded
gdb) br myfunction.c:50
gdb) continue
@end example

@node I want to compile a Python module on my Linux system but some files are missing Why?,How do I tell “incomplete input” from “invalid input”?,How do I debug an extension?,Extending/Embedding FAQ
@anchor{faq/extending i-want-to-compile-a-python-module-on-my-linux-system-but-some-files-are-missing-why}@anchor{5ce4}
@subsection I want to compile a Python module on my Linux system, but some files are missing. Why?


Most packaged versions of Python omit some files
required for compiling Python extensions.

For Red Hat, install the python3-devel RPM to get the necessary files.

For Debian, run @code{apt-get install python3-dev}.

@node How do I tell “incomplete input” from “invalid input”?,How do I find undefined g++ symbols __builtin_new or __pure_virtual?,I want to compile a Python module on my Linux system but some files are missing Why?,Extending/Embedding FAQ
@anchor{faq/extending how-do-i-tell-incomplete-input-from-invalid-input}@anchor{5ce5}
@subsection How do I tell “incomplete input” from “invalid input”?


Sometimes you want to emulate the Python interactive interpreter’s behavior,
where it gives you a continuation prompt when the input is incomplete (e.g. you
typed the start of an “if” statement or you didn’t close your parentheses or
triple string quotes), but it gives you a syntax error message immediately when
the input is invalid.

In Python you can use the @ref{1d,,codeop} module, which approximates the parser’s
behavior sufficiently.  IDLE uses this, for example.

The easiest way to do it in C is to call @ref{5529,,PyRun_InteractiveLoop()} (perhaps
in a separate thread) and let the Python interpreter handle the input for
you. You can also set the @ref{7a6,,PyOS_ReadlineFunctionPointer()} to point at your
custom input function. See @code{Modules/readline.c} and @code{Parser/myreadline.c}
for more hints.

@node How do I find undefined g++ symbols __builtin_new or __pure_virtual?,Can I create an object class with some methods implemented in C and others in Python e g through inheritance ?,How do I tell “incomplete input” from “invalid input”?,Extending/Embedding FAQ
@anchor{faq/extending how-do-i-find-undefined-g-symbols-builtin-new-or-pure-virtual}@anchor{5ce6}
@subsection How do I find undefined g++ symbols __builtin_new or __pure_virtual?


To dynamically load g++ extension modules, you must recompile Python, relink it
using g++ (change LINKCC in the Python Modules Makefile), and link your
extension module using g++ (e.g., @code{g++ -shared -o mymodule.so mymodule.o}).

@node Can I create an object class with some methods implemented in C and others in Python e g through inheritance ?,,How do I find undefined g++ symbols __builtin_new or __pure_virtual?,Extending/Embedding FAQ
@anchor{faq/extending can-i-create-an-object-class-with-some-methods-implemented-in-c-and-others-in-python-e-g-through-inheritance}@anchor{5ce7}
@subsection Can I create an object class with some methods implemented in C and others in Python (e.g. through inheritance)?


Yes, you can inherit from built-in classes such as @ref{19c,,int}, @ref{24f,,list},
@ref{184,,dict}, etc.

The Boost Python Library (BPL, @indicateurl{https://www.boost.org/libs/python/doc/index.html})
provides a way of doing this from C++ (i.e. you can inherit from an extension
class written in C++ using the BPL).

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Python on Windows FAQ,Graphic User Interface FAQ,Extending/Embedding FAQ,Python Frequently Asked Questions
@anchor{faq/windows doc}@anchor{5ce8}@anchor{faq/windows python-on-windows-faq}@anchor{5ce9}@anchor{faq/windows translation-repo}@anchor{5cea}@anchor{faq/windows windows-faq}@anchor{5ceb}
@section Python on Windows FAQ



@c XXX need review for Python 3.
@c XXX need review for Windows Vista/Seven?

@menu
* How do I run a Python program under Windows?:: 
* How do I make Python scripts executable?:: 
* Why does Python sometimes take so long to start?:: 
* How do I make an executable from a Python script?:: 
* Is a *.pyd file the same as a DLL?: Is a * pyd file the same as a DLL?. 
* How can I embed Python into a Windows application?:: 
* How do I keep editors from inserting tabs into my Python source?:: 
* How do I check for a keypress without blocking?:: 
* How do I solve the missing api-ms-win-crt-runtime-l1-1-0.dll error?: How do I solve the missing api-ms-win-crt-runtime-l1-1-0 dll error?. 

@end menu

@node How do I run a Python program under Windows?,How do I make Python scripts executable?,,Python on Windows FAQ
@anchor{faq/windows faq-run-program-under-windows}@anchor{5cec}@anchor{faq/windows how-do-i-run-a-python-program-under-windows}@anchor{5ced}
@subsection How do I run a Python program under Windows?


This is not necessarily a straightforward question. If you are already familiar
with running programs from the Windows command line then everything will seem
obvious; otherwise, you might need a little more guidance.

Unless you use some sort of integrated development environment, you will end up
`typing' Windows commands into what is referred to as a
“Command prompt window”.  Usually you can create such a window from your
search bar by searching for @code{cmd}.  You should be able to recognize
when you have started such a window because you will see a Windows “command
prompt”, which usually looks like this:

@example
C:\>
@end example

The letter may be different, and there might be other things after it, so you
might just as easily see something like:

@example
D:\YourName\Projects\Python>
@end example

depending on how your computer has been set up and what else you have recently
done with it.  Once you have started such a window, you are well on the way to
running Python programs.

You need to realize that your Python scripts have to be processed by another
program called the Python `interpreter'.  The interpreter reads your script,
compiles it into bytecodes, and then executes the bytecodes to run your
program. So, how do you arrange for the interpreter to handle your Python?

First, you need to make sure that your command window recognises the word
“py” as an instruction to start the interpreter.  If you have opened a
command window, you should try entering the command @code{py} and hitting
return:

@example
C:\Users\YourName> py
@end example

You should then see something like:

@example
Python 3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:04:45) [MSC v.1900 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
@end example

You have started the interpreter in “interactive mode”. That means you can enter
Python statements or expressions interactively and have them executed or
evaluated while you wait.  This is one of Python’s strongest features.  Check it
by entering a few expressions of your choice and seeing the results:

@example
>>> print("Hello")
Hello
>>> "Hello" * 3
'HelloHelloHello'
@end example

Many people use the interactive mode as a convenient yet highly programmable
calculator.  When you want to end your interactive Python session,
call the @ref{262f,,exit()} function or hold the @code{Ctrl} key down
while you enter a @code{Z}, then hit the “@code{Enter}” key to get
back to your Windows command prompt.

You may also find that you have a Start-menu entry such as Start
‣ Programs ‣ Python 3.x ‣ Python (command line) that results in you
seeing the @code{>>>} prompt in a new window.  If so, the window will disappear
after you call the @ref{262f,,exit()} function or enter the @code{Ctrl}-@code{Z}
character; Windows is running a single “python”
command in the window, and closes it when you terminate the interpreter.

Now that we know the @code{py} command is recognized, you can give your
Python script to it. You’ll have to give either an absolute or a
relative path to the Python script. Let’s say your Python script is
located in your desktop and is named @code{hello.py}, and your command
prompt is nicely opened in your home directory so you’re seeing something
similar to:

@example
C:\Users\YourName>
@end example

So now you’ll ask the @code{py} command to give your script to Python by
typing @code{py} followed by your script path:

@example
C:\Users\YourName> py Desktop\hello.py
hello
@end example

@node How do I make Python scripts executable?,Why does Python sometimes take so long to start?,How do I run a Python program under Windows?,Python on Windows FAQ
@anchor{faq/windows how-do-i-make-python-scripts-executable}@anchor{5cee}
@subsection How do I make Python scripts executable?


On Windows, the standard Python installer already associates the .py
extension with a file type (Python.File) and gives that file type an open
command that runs the interpreter (@code{D:\Program Files\Python\python.exe "%1"
%*}).  This is enough to make scripts executable from the command prompt as
‘foo.py’.  If you’d rather be able to execute the script by simple typing ‘foo’
with no extension you need to add .py to the PATHEXT environment variable.

@node Why does Python sometimes take so long to start?,How do I make an executable from a Python script?,How do I make Python scripts executable?,Python on Windows FAQ
@anchor{faq/windows why-does-python-sometimes-take-so-long-to-start}@anchor{5cef}
@subsection Why does Python sometimes take so long to start?


Usually Python starts very quickly on Windows, but occasionally there are bug
reports that Python suddenly begins to take a long time to start up.  This is
made even more puzzling because Python will work fine on other Windows systems
which appear to be configured identically.

The problem may be caused by a misconfiguration of virus checking software on
the problem machine.  Some virus scanners have been known to introduce startup
overhead of two orders of magnitude when the scanner is configured to monitor
all reads from the filesystem.  Try checking the configuration of virus scanning
software on your systems to ensure that they are indeed configured identically.
McAfee, when configured to scan all file system read activity, is a particular
offender.

@node How do I make an executable from a Python script?,Is a * pyd file the same as a DLL?,Why does Python sometimes take so long to start?,Python on Windows FAQ
@anchor{faq/windows how-do-i-make-an-executable-from-a-python-script}@anchor{5cf0}
@subsection How do I make an executable from a Python script?


See @ref{5c44,,How can I create a stand-alone binary from a Python script?} for a list of tools that can be used to
make executables.

@node Is a * pyd file the same as a DLL?,How can I embed Python into a Windows application?,How do I make an executable from a Python script?,Python on Windows FAQ
@anchor{faq/windows is-a-pyd-file-the-same-as-a-dll}@anchor{5cf1}
@subsection Is a @code{*.pyd} file the same as a DLL?


Yes, .pyd files are dll’s, but there are a few differences.  If you have a DLL
named @code{foo.pyd}, then it must have a function @code{PyInit_foo()}.  You can then
write Python “import foo”, and Python will search for foo.pyd (as well as
foo.py, foo.pyc) and if it finds it, will attempt to call @code{PyInit_foo()} to
initialize it.  You do not link your .exe with foo.lib, as that would cause
Windows to require the DLL to be present.

Note that the search path for foo.pyd is PYTHONPATH, not the same as the path
that Windows uses to search for foo.dll.  Also, foo.pyd need not be present to
run your program, whereas if you linked your program with a dll, the dll is
required.  Of course, foo.pyd is required if you want to say @code{import foo}.  In
a DLL, linkage is declared in the source code with @code{__declspec(dllexport)}.
In a .pyd, linkage is defined in a list of available functions.

@node How can I embed Python into a Windows application?,How do I keep editors from inserting tabs into my Python source?,Is a * pyd file the same as a DLL?,Python on Windows FAQ
@anchor{faq/windows how-can-i-embed-python-into-a-windows-application}@anchor{5cf2}
@subsection How can I embed Python into a Windows application?


Embedding the Python interpreter in a Windows app can be summarized as follows:


@enumerate 

@item 
Do `not' build Python into your .exe file directly.  On Windows, Python must
be a DLL to handle importing modules that are themselves DLL’s.  (This is the
first key undocumented fact.)  Instead, link to @code{python`NN'.dll}; it is
typically installed in @code{C:\Windows\System}.  `NN' is the Python version, a
number such as “33” for Python 3.3.

You can link to Python in two different ways.  Load-time linking means
linking against @code{python`NN'.lib}, while run-time linking means linking
against @code{python`NN'.dll}.  (General note: @code{python`NN'.lib} is the
so-called “import lib” corresponding to @code{python`NN'.dll}.  It merely
defines symbols for the linker.)

Run-time linking greatly simplifies link options; everything happens at run
time.  Your code must load @code{python`NN'.dll} using the Windows
@code{LoadLibraryEx()} routine.  The code must also use access routines and data
in @code{python`NN'.dll} (that is, Python’s C API’s) using pointers obtained
by the Windows @code{GetProcAddress()} routine.  Macros can make using these
pointers transparent to any C code that calls routines in Python’s C API.

@c XXX what about static linking?

@item 
If you use SWIG, it is easy to create a Python “extension module” that will
make the app’s data and methods available to Python.  SWIG will handle just
about all the grungy details for you.  The result is C code that you link
`into' your .exe file (!)  You do `not' have to create a DLL file, and this
also simplifies linking.

@item 
SWIG will create an init function (a C function) whose name depends on the
name of the extension module.  For example, if the name of the module is leo,
the init function will be called initleo().  If you use SWIG shadow classes,
as you should, the init function will be called initleoc().  This initializes
a mostly hidden helper class used by the shadow class.

The reason you can link the C code in step 2 into your .exe file is that
calling the initialization function is equivalent to importing the module
into Python! (This is the second key undocumented fact.)

@item 
In short, you can use the following code to initialize the Python interpreter
with your extension module.

@example
#include <Python.h>
...
Py_Initialize();  // Initialize Python.
initmyAppc();  // Initialize (import) the helper class.
PyRun_SimpleString("import myApp");  // Import the shadow class.
@end example

@item 
There are two problems with Python’s C API which will become apparent if you
use a compiler other than MSVC, the compiler used to build pythonNN.dll.

Problem 1: The so-called “Very High Level” functions that take @code{FILE *}
arguments will not work in a multi-compiler environment because each
compiler’s notion of a @code{struct FILE} will be different.  From an implementation
standpoint these are very low level functions.

Problem 2: SWIG generates the following code when generating wrappers to void
functions:

@example
Py_INCREF(Py_None);
_resultobj = Py_None;
return _resultobj;
@end example

Alas, Py_None is a macro that expands to a reference to a complex data
structure called _Py_NoneStruct inside pythonNN.dll.  Again, this code will
fail in a mult-compiler environment.  Replace such code by:

@example
return Py_BuildValue("");
@end example

It may be possible to use SWIG’s @code{%typemap} command to make the change
automatically, though I have not been able to get this to work (I’m a
complete SWIG newbie).

@item 
Using a Python shell script to put up a Python interpreter window from inside
your Windows app is not a good idea; the resulting window will be independent
of your app’s windowing system.  Rather, you (or the wxPythonWindow class)
should create a “native” interpreter window.  It is easy to connect that
window to the Python interpreter.  You can redirect Python’s i/o to _any_
object that supports read and write, so all you need is a Python object
(defined in your extension module) that contains read() and write() methods.
@end enumerate

@node How do I keep editors from inserting tabs into my Python source?,How do I check for a keypress without blocking?,How can I embed Python into a Windows application?,Python on Windows FAQ
@anchor{faq/windows how-do-i-keep-editors-from-inserting-tabs-into-my-python-source}@anchor{5cf3}
@subsection How do I keep editors from inserting tabs into my Python source?


The FAQ does not recommend using tabs, and the Python style guide, 
@geindex Python Enhancement Proposals; PEP 8
PEP 8@footnote{https://peps.python.org/pep-0008/},
recommends 4 spaces for distributed Python code; this is also the Emacs
python-mode default.

Under any editor, mixing tabs and spaces is a bad idea.  MSVC is no different in
this respect, and is easily configured to use spaces: Take Tools
‣ Options ‣ Tabs, and for file type “Default” set “Tab size” and “Indent
size” to 4, and select the “Insert spaces” radio button.

Python raises @ref{9b1,,IndentationError} or @ref{766,,TabError} if mixed tabs
and spaces are causing problems in leading whitespace.
You may also run the @ref{e3,,tabnanny} module to check a directory tree
in batch mode.

@node How do I check for a keypress without blocking?,How do I solve the missing api-ms-win-crt-runtime-l1-1-0 dll error?,How do I keep editors from inserting tabs into my Python source?,Python on Windows FAQ
@anchor{faq/windows how-do-i-check-for-a-keypress-without-blocking}@anchor{5cf4}
@subsection How do I check for a keypress without blocking?


Use the @ref{97,,msvcrt} module.  This is a standard Windows-specific extension module.
It defines a function @code{kbhit()} which checks whether a keyboard hit is
present, and @code{getch()} which gets one character without echoing it.

@node How do I solve the missing api-ms-win-crt-runtime-l1-1-0 dll error?,,How do I check for a keypress without blocking?,Python on Windows FAQ
@anchor{faq/windows how-do-i-solve-the-missing-api-ms-win-crt-runtime-l1-1-0-dll-error}@anchor{5cf5}
@subsection How do I solve the missing api-ms-win-crt-runtime-l1-1-0.dll error?


This can occur on Python 3.5 and later when using Windows 8.1 or earlier without all updates having been installed.
First ensure your operating system is supported and is up to date, and if that does not resolve the issue,
visit the Microsoft support page@footnote{https://support.microsoft.com/en-us/help/3118401/}
for guidance on manually installing the C Runtime update.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Graphic User Interface FAQ,“Why is Python Installed on my Computer?” FAQ,Python on Windows FAQ,Python Frequently Asked Questions
@anchor{faq/gui doc}@anchor{5cf6}@anchor{faq/gui graphic-user-interface-faq}@anchor{5cf7}@anchor{faq/gui translation-repo}@anchor{5cf8}
@section Graphic User Interface FAQ



@c XXX need review for Python 3.

@menu
* General GUI Questions:: 
* What GUI toolkits exist for Python?:: 
* Tkinter questions:: 

@end menu

@node General GUI Questions,What GUI toolkits exist for Python?,,Graphic User Interface FAQ
@anchor{faq/gui general-gui-questions}@anchor{5cf9}
@subsection General GUI Questions


@node What GUI toolkits exist for Python?,Tkinter questions,General GUI Questions,Graphic User Interface FAQ
@anchor{faq/gui what-gui-toolkits-exist-for-python}@anchor{5cfa}
@subsection What GUI toolkits exist for Python?


Standard builds of Python include an object-oriented interface to the Tcl/Tk
widget set, called @ref{4367,,tkinter}.  This is probably the easiest to
install (since it comes included with most
binary distributions@footnote{https://www.python.org/downloads/} of Python) and use.
For more info about Tk, including pointers to the source, see the
Tcl/Tk home page@footnote{https://www.tcl.tk}.  Tcl/Tk is fully portable to the
macOS, Windows, and Unix platforms.

Depending on what platform(s) you are aiming at, there are also several
alternatives. A list of cross-platform@footnote{https://wiki.python.org/moin/GuiProgramming#Cross-Platform_Frameworks} and
platform-specific@footnote{https://wiki.python.org/moin/GuiProgramming#Platform-specific_Frameworks} GUI
frameworks can be found on the python wiki.

@node Tkinter questions,,What GUI toolkits exist for Python?,Graphic User Interface FAQ
@anchor{faq/gui tkinter-questions}@anchor{5cfb}
@subsection Tkinter questions


@menu
* How do I freeze Tkinter applications?:: 
* Can I have Tk events handled while waiting for I/O?:: 
* I can’t get key bindings to work in Tkinter; why?: I can’t get key bindings to work in Tkinter why?. 

@end menu

@node How do I freeze Tkinter applications?,Can I have Tk events handled while waiting for I/O?,,Tkinter questions
@anchor{faq/gui how-do-i-freeze-tkinter-applications}@anchor{5cfc}
@subsubsection How do I freeze Tkinter applications?


Freeze is a tool to create stand-alone applications.  When freezing Tkinter
applications, the applications will not be truly stand-alone, as the application
will still need the Tcl and Tk libraries.

One solution is to ship the application with the Tcl and Tk libraries, and point
to them at run-time using the @code{TCL_LIBRARY} and @code{TK_LIBRARY}
environment variables.

Various third-party freeze libraries such as py2exe and cx_Freeze have
handling for Tkinter applications built-in.

@node Can I have Tk events handled while waiting for I/O?,I can’t get key bindings to work in Tkinter why?,How do I freeze Tkinter applications?,Tkinter questions
@anchor{faq/gui can-i-have-tk-events-handled-while-waiting-for-i-o}@anchor{5cfd}
@subsubsection Can I have Tk events handled while waiting for I/O?


On platforms other than Windows, yes, and you don’t even
need threads!  But you’ll have to restructure your I/O
code a bit.  Tk has the equivalent of Xt’s @code{XtAddInput()} call, which allows you
to register a callback function which will be called from the Tk mainloop when
I/O is possible on a file descriptor.  See @ref{43a6,,File handlers}.

@node I can’t get key bindings to work in Tkinter why?,,Can I have Tk events handled while waiting for I/O?,Tkinter questions
@anchor{faq/gui i-can-t-get-key-bindings-to-work-in-tkinter-why}@anchor{5cfe}
@subsubsection I can’t get key bindings to work in Tkinter: why?


An often-heard complaint is that event handlers @ref{439f,,bound}
to events with the @code{bind()} method
don’t get handled even when the appropriate key is pressed.

The most common cause is that the widget to which the binding applies doesn’t
have “keyboard focus”.  Check out the Tk documentation for the focus command.
Usually a widget is given the keyboard focus by clicking in it (but not for
labels; see the takefocus option).

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node “Why is Python Installed on my Computer?” FAQ,,Graphic User Interface FAQ,Python Frequently Asked Questions
@anchor{faq/installed doc}@anchor{5cff}@anchor{faq/installed translation-repo}@anchor{5d00}@anchor{faq/installed why-is-python-installed-on-my-computer-faq}@anchor{5d01}
@section “Why is Python Installed on my Computer?” FAQ


@menu
* What is Python?: What is Python?<2>. 
* Why is Python installed on my machine?:: 
* Can I delete Python?:: 

@end menu

@node What is Python?<2>,Why is Python installed on my machine?,,“Why is Python Installed on my Computer?” FAQ
@anchor{faq/installed what-is-python}@anchor{5d02}
@subsection What is Python?


Python is a programming language.  It’s used for many different applications.
It’s used in some high schools and colleges as an introductory programming
language because Python is easy to learn, but it’s also used by professional
software developers at places such as Google, NASA, and Lucasfilm Ltd.

If you wish to learn more about Python, start with the Beginner's Guide to Python@footnote{https://wiki.python.org/moin/BeginnersGuide}.

@node Why is Python installed on my machine?,Can I delete Python?,What is Python?<2>,“Why is Python Installed on my Computer?” FAQ
@anchor{faq/installed why-is-python-installed-on-my-machine}@anchor{5d03}
@subsection Why is Python installed on my machine?


If you find Python installed on your system but don’t remember installing it,
there are several possible ways it could have gotten there.


@itemize *

@item 
Perhaps another user on the computer wanted to learn programming and installed
it; you’ll have to figure out who’s been using the machine and might have
installed it.

@item 
A third-party application installed on the machine might have been written in
Python and included a Python installation.  There are many such applications,
from GUI programs to network servers and administrative scripts.

@item 
Some Windows machines also have Python installed.  At this writing we’re aware
of computers from Hewlett-Packard and Compaq that include Python.  Apparently
some of HP/Compaq’s administrative tools are written in Python.

@item 
Many Unix-compatible operating systems, such as macOS and some Linux
distributions, have Python installed by default; it’s included in the base
installation.
@end itemize

@node Can I delete Python?,,Why is Python installed on my machine?,“Why is Python Installed on my Computer?” FAQ
@anchor{faq/installed can-i-delete-python}@anchor{5d04}
@subsection Can I delete Python?


That depends on where Python came from.

If someone installed it deliberately, you can remove it without hurting
anything.  On Windows, use the Add/Remove Programs icon in the Control Panel.

If Python was installed by a third-party application, you can also remove it,
but that application will no longer work.  You should use that application’s
uninstaller rather than removing Python directly.

If Python came with your operating system, removing it is not recommended.  If
you remove it, whatever tools were written in Python will no longer run, and
some of them might be important to you.  Reinstalling the whole system would
then be required to fix things again.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Deprecations,Glossary,Python Frequently Asked Questions,Top
@anchor{deprecations/index doc}@anchor{5d05}@anchor{deprecations/index deprecations}@anchor{5d06}@anchor{deprecations/index translation-repo}@anchor{5d07}
@chapter Deprecations


@menu
* Pending removal in Python 3.15: Pending removal in Python 3 15<7>. 
* Pending removal in Python 3.16: Pending removal in Python 3 16<7>. 
* Pending removal in Python 3.17: Pending removal in Python 3 17<4>. 
* Pending removal in Python 3.18: Pending removal in Python 3 18<5>. 
* Pending removal in Python 3.19: Pending removal in Python 3 19<3>. 
* Pending removal in future versions: Pending removal in future versions<7>. 
* C API deprecations:: 

@end menu

@node Pending removal in Python 3 15<7>,Pending removal in Python 3 16<7>,,Deprecations
@anchor{deprecations/index pending-removal-in-python-3-15}@anchor{5d08}
@section Pending removal in Python 3.15



@itemize *

@item 
The import system:


@itemize *

@item 
Setting @ref{323,,__cached__} on a module while
failing to set @ref{324,,__spec__.cached}
is deprecated. In Python 3.15, @code{__cached__} will cease to be set or
take into consideration by the import system or standard library. (gh-97879@footnote{https://github.com/python/cpython/issues/97879})

@item 
Setting @ref{325,,__package__} on a module while
failing to set @ref{326,,__spec__.parent}
is deprecated. In Python 3.15, @code{__package__} will cease to be set or
take into consideration by the import system or standard library. (gh-97879@footnote{https://github.com/python/cpython/issues/97879})
@end itemize

@item 
@ref{2e,,ctypes}:


@itemize *

@item 
The undocumented @code{ctypes.SetPointerType()} function
has been deprecated since Python 3.13.
@end itemize

@item 
@ref{76,,http.server}:


@itemize *

@item 
The obsolete and rarely used @ref{327,,CGIHTTPRequestHandler}
has been deprecated since Python 3.13.
No direct replacement exists.
`Anything' is better than CGI to interface
a web server with a request handler.

@item 
The @code{--cgi} flag to the @code{python -m http.server}
command-line interface has been deprecated since Python 3.13.
@end itemize

@item 
@ref{7b,,importlib}:


@itemize *

@item 
@code{load_module()} method: use @code{exec_module()} instead.
@end itemize

@item 
@ref{a8,,pathlib}:


@itemize *

@item 
@ref{328,,PurePath.is_reserved()}
has been deprecated since Python 3.13.
Use @ref{329,,os.path.isreserved()} to detect reserved paths on Windows.
@end itemize

@item 
@ref{af,,platform}:


@itemize *

@item 
@ref{32a,,java_ver()} has been deprecated since Python 3.13.
This function is only useful for Jython support, has a confusing API,
and is largely untested.
@end itemize

@item 
@ref{e1,,sysconfig}:


@itemize *

@item 
The `check_home' argument of @ref{32b,,sysconfig.is_python_build()} has been
deprecated since Python 3.12.
@end itemize

@item 
@ref{f3,,threading}:


@itemize *

@item 
@ref{32c,,RLock()} will take no arguments in Python 3.15.
Passing any arguments has been deprecated since Python 3.14,
as the Python version does not permit any arguments,
but the C version allows any number of positional or keyword arguments,
ignoring every argument.
@end itemize

@item 
@ref{10a,,types}:


@itemize *

@item 
@ref{32d,,types.CodeType}: Accessing @ref{32e,,co_lnotab} was
deprecated in 
@geindex Python Enhancement Proposals; PEP 626
PEP 626@footnote{https://peps.python.org/pep-0626/}
since 3.10 and was planned to be removed in 3.12,
but it only got a proper @ref{1a4,,DeprecationWarning} in 3.12.
May be removed in 3.15.
(Contributed by Nikita Sobolev in gh-101866@footnote{https://github.com/python/cpython/issues/101866}.)
@end itemize

@item 
@ref{10b,,typing}:


@itemize *

@item 
The undocumented keyword argument syntax for creating
@ref{32f,,NamedTuple} classes
(for example, @code{Point = NamedTuple("Point", x=int, y=int)})
has been deprecated since Python 3.13.
Use the class-based syntax or the functional syntax instead.

@item 
When using the functional syntax of @ref{330,,TypedDict}s, failing
to pass a value to the `fields' parameter (@code{TD = TypedDict("TD")}) or
passing @code{None} (@code{TD = TypedDict("TD", None)}) has been deprecated
since Python 3.13.
Use @code{class TD(TypedDict): pass} or @code{TD = TypedDict("TD", @{@})}
to create a TypedDict with zero field.

@item 
The @ref{331,,typing.no_type_check_decorator()} decorator function
has been deprecated since Python 3.13.
After eight years in the @ref{10b,,typing} module,
it has yet to be supported by any major type checker.
@end itemize

@item 
@ref{11a,,wave}:


@itemize *

@item 
The @ref{332,,getmark()}, @code{setmark()},
and @ref{333,,getmarkers()} methods of
the @ref{334,,Wave_read} and @ref{335,,Wave_write} classes
have been deprecated since Python 3.13.
@end itemize

@item 
@ref{139,,zipimport}:


@itemize *

@item 
@ref{336,,load_module()} has been deprecated since
Python 3.10. Use @ref{337,,exec_module()} instead.
(Contributed by Jiahao Li in gh-125746@footnote{https://github.com/python/cpython/issues/125746}.)
@end itemize
@end itemize

@node Pending removal in Python 3 16<7>,Pending removal in Python 3 17<4>,Pending removal in Python 3 15<7>,Deprecations
@anchor{deprecations/index pending-removal-in-python-3-16}@anchor{5d09}
@section Pending removal in Python 3.16



@itemize *

@item 
The import system:


@itemize *

@item 
Setting @ref{339,,__loader__} on a module while
failing to set @ref{33a,,__spec__.loader}
is deprecated. In Python 3.16, @code{__loader__} will cease to be set or
taken into consideration by the import system or the standard library.
@end itemize

@item 
@ref{8,,array}:


@itemize *

@item 
The @code{'u'} format code (@code{wchar_t})
has been deprecated in documentation since Python 3.3
and at runtime since Python 3.13.
Use the @code{'w'} format code (@ref{33b,,Py_UCS4})
for Unicode characters instead.
@end itemize

@item 
@ref{b,,asyncio}:


@itemize *

@item 
@code{asyncio.iscoroutinefunction()} is deprecated
and will be removed in Python 3.16;
use @ref{30f,,inspect.iscoroutinefunction()} instead.
(Contributed by Jiahao Li and Kumar Aditya in gh-122875@footnote{https://github.com/python/cpython/issues/122875}.)

@item 
@ref{b,,asyncio} policy system is deprecated and will be removed in Python 3.16.
In particular, the following classes and functions are deprecated:


@itemize *

@item 
@ref{310,,asyncio.AbstractEventLoopPolicy}

@item 
@ref{311,,asyncio.DefaultEventLoopPolicy}

@item 
@ref{312,,asyncio.WindowsSelectorEventLoopPolicy}

@item 
@ref{313,,asyncio.WindowsProactorEventLoopPolicy}

@item 
@ref{314,,asyncio.get_event_loop_policy()}

@item 
@ref{315,,asyncio.set_event_loop_policy()}
@end itemize

Users should use @ref{2f5,,asyncio.run()} or @ref{2f7,,asyncio.Runner} with
`loop_factory' to use the desired event loop implementation.

For example, to use @ref{316,,asyncio.SelectorEventLoop} on Windows:

@example
import asyncio

async def main():
    ...

asyncio.run(main(), loop_factory=asyncio.SelectorEventLoop)
@end example

(Contributed by Kumar Aditya in gh-127949@footnote{https://github.com/python/cpython/issues/127949}.)
@end itemize

@item 
@ref{13,,builtins}:


@itemize *

@item 
Bitwise inversion on boolean types, @code{~True} or @code{~False}
has been deprecated since Python 3.12,
as it produces surprising and unintuitive results (@code{-2} and @code{-1}).
Use @code{not x} instead for the logical negation of a Boolean.
In the rare case that you need the bitwise inversion of
the underlying integer, convert to @code{int} explicitly (@code{~int(x)}).
@end itemize

@item 
@ref{63,,functools}:


@itemize *

@item 
Calling the Python implementation of @ref{21c,,functools.reduce()} with `function'
or `sequence' as keyword arguments has been deprecated since Python 3.14.
@end itemize

@item 
@ref{8b,,logging}:

Support for custom logging handlers with the `strm' argument is deprecated
and scheduled for removal in Python 3.16. Define handlers with the `stream'
argument instead. (Contributed by Mariusz Felisiak in gh-115032@footnote{https://github.com/python/cpython/issues/115032}.)

@item 
@ref{93,,mimetypes}:


@itemize *

@item 
Valid extensions start with a ‘.’ or are empty for
@ref{31b,,mimetypes.MimeTypes.add_type()}.
Undotted extensions are deprecated and will
raise a @ref{2ee,,ValueError} in Python 3.16.
(Contributed by Hugo van Kemenade in gh-75223@footnote{https://github.com/python/cpython/issues/75223}.)
@end itemize

@item 
@ref{ca,,shutil}:


@itemize *

@item 
The @code{ExecError} exception
has been deprecated since Python 3.14.
It has not been used by any function in @code{shutil} since Python 3.4,
and is now an alias of @ref{246,,RuntimeError}.
@end itemize

@item 
@ref{de,,symtable}:


@itemize *

@item 
The @ref{31f,,Class.get_methods} method
has been deprecated since Python 3.14.
@end itemize

@item 
@ref{df,,sys}:


@itemize *

@item 
The @ref{33c,,_enablelegacywindowsfsencoding()} function
has been deprecated since Python 3.13.
Use the 
@geindex PYTHONLEGACYWINDOWSFSENCODING
@geindex environment variable; PYTHONLEGACYWINDOWSFSENCODING
@ref{33d,,PYTHONLEGACYWINDOWSFSENCODING} environment variable instead.
@end itemize

@item 
@ref{e1,,sysconfig}:


@itemize *

@item 
The @code{sysconfig.expand_makefile_vars()} function
has been deprecated since Python 3.14.
Use the @code{vars} argument of @ref{33e,,sysconfig.get_paths()} instead.
@end itemize

@item 
@ref{e4,,tarfile}:


@itemize *

@item 
The undocumented and unused @code{TarFile.tarfile} attribute
has been deprecated since Python 3.13.
@end itemize
@end itemize

@node Pending removal in Python 3 17<4>,Pending removal in Python 3 18<5>,Pending removal in Python 3 16<7>,Deprecations
@anchor{deprecations/index pending-removal-in-python-3-17}@anchor{5d0a}
@section Pending removal in Python 3.17



@itemize *

@item 
@ref{1f,,collections.abc}:


@itemize -

@item 
@ref{340,,collections.abc.ByteString} is scheduled for removal in Python 3.17.

Use @code{isinstance(obj, collections.abc.Buffer)} to test if @code{obj}
implements the @ref{262,,buffer protocol} at runtime. For use
in type annotations, either use @ref{341,,Buffer} or a union
that explicitly specifies the types your code supports (e.g.,
@code{bytes | bytearray | memoryview}).

@code{ByteString} was originally intended to be an abstract class that
would serve as a supertype of both @ref{193,,bytes} and @ref{342,,bytearray}.
However, since the ABC never had any methods, knowing that an object was an
instance of @code{ByteString} never actually told you anything useful
about the object. Other common buffer types such as @ref{166,,memoryview}
were also never understood as subtypes of @code{ByteString} (either at
runtime or by static type checkers).

See 
@geindex Python Enhancement Proposals; PEP 688#current-options
PEP 688@footnote{https://peps.python.org/pep-0688/#current-options} for more details.
(Contributed by Shantanu Jain in gh-91896@footnote{https://github.com/python/cpython/issues/91896}.)
@end itemize

@item 
@ref{10b,,typing}:


@itemize -

@item 
Before Python 3.14, old-style unions were implemented using the private class
@code{typing._UnionGenericAlias}. This class is no longer needed for the implementation,
but it has been retained for backward compatibility, with removal scheduled for Python
3.17. Users should use documented introspection helpers like @ref{2ad,,typing.get_origin()}
and @ref{2ae,,typing.get_args()} instead of relying on private implementation details.

@item 
@ref{343,,typing.ByteString}, deprecated since Python 3.9, is scheduled for removal in
Python 3.17.

Use @code{isinstance(obj, collections.abc.Buffer)} to test if @code{obj}
implements the @ref{262,,buffer protocol} at runtime. For use
in type annotations, either use @ref{341,,Buffer} or a union
that explicitly specifies the types your code supports (e.g.,
@code{bytes | bytearray | memoryview}).

@code{ByteString} was originally intended to be an abstract class that
would serve as a supertype of both @ref{193,,bytes} and @ref{342,,bytearray}.
However, since the ABC never had any methods, knowing that an object was an
instance of @code{ByteString} never actually told you anything useful
about the object. Other common buffer types such as @ref{166,,memoryview}
were also never understood as subtypes of @code{ByteString} (either at
runtime or by static type checkers).

See 
@geindex Python Enhancement Proposals; PEP 688#current-options
PEP 688@footnote{https://peps.python.org/pep-0688/#current-options} for more details.
(Contributed by Shantanu Jain in gh-91896@footnote{https://github.com/python/cpython/issues/91896}.)
@end itemize
@end itemize

@node Pending removal in Python 3 18<5>,Pending removal in Python 3 19<3>,Pending removal in Python 3 17<4>,Deprecations
@anchor{deprecations/index pending-removal-in-python-3-18}@anchor{5d0b}
@section Pending removal in Python 3.18



@itemize *

@item 
@ref{3a,,decimal}:


@itemize *

@item 
The non-standard and undocumented @ref{200,,Decimal} format
specifier @code{'N'}, which is only supported in the @code{decimal} module’s
C implementation, has been deprecated since Python 3.13.
(Contributed by Serhiy Storchaka in gh-89902@footnote{https://github.com/python/cpython/issues/89902}.)
@end itemize
@end itemize

@node Pending removal in Python 3 19<3>,Pending removal in future versions<7>,Pending removal in Python 3 18<5>,Deprecations
@anchor{deprecations/index pending-removal-in-python-3-19}@anchor{5d0c}
@section Pending removal in Python 3.19



@itemize *

@item 
@ref{2e,,ctypes}:


@itemize *

@item 
Implicitly switching to the MSVC-compatible struct layout by setting
@ref{319,,_pack_} but not @ref{1e9,,_layout_}
on non-Windows platforms.
@end itemize
@end itemize

@node Pending removal in future versions<7>,C API deprecations,Pending removal in Python 3 19<3>,Deprecations
@anchor{deprecations/index pending-removal-in-future-versions}@anchor{5d0d}
@section Pending removal in future versions


The following APIs will be removed in the future,
although there is currently no date scheduled for their removal.


@itemize *

@item 
@ref{7,,argparse}:


@itemize *

@item 
Nesting argument groups and nesting mutually exclusive
groups are deprecated.

@item 
Passing the undocumented keyword argument `prefix_chars' to
@ref{2ed,,add_argument_group()} is now
deprecated.

@item 
The @ref{30e,,argparse.FileType} type converter is deprecated.
@end itemize

@item 
@ref{13,,builtins}:


@itemize *

@item 
Generators: @code{throw(type, exc, tb)} and @code{athrow(type, exc, tb)}
signature is deprecated: use @code{throw(exc)} and @code{athrow(exc)} instead,
the single argument signature.

@item 
Currently Python accepts numeric literals immediately followed by keywords,
for example @code{0in x}, @code{1or x}, @code{0if 1else 2}.  It allows confusing and
ambiguous expressions like @code{[0x1for x in y]} (which can be interpreted as
@code{[0x1 for x in y]} or @code{[0x1f or x in y]}).  A syntax warning is raised
if the numeric literal is immediately followed by one of keywords
@ref{347,,and}, @ref{17d,,else}, @ref{348,,for}, @ref{182,,if},
@ref{349,,in}, @ref{34a,,is} and @ref{34b,,or}.  In a future release it
will be changed to a syntax error. (gh-87999@footnote{https://github.com/python/cpython/issues/87999})

@item 
Support for @code{__index__()} and @code{__int__()} method returning non-int type:
these methods will be required to return an instance of a strict subclass of
@ref{19c,,int}.

@item 
Support for @code{__float__()} method returning a strict subclass of
@ref{197,,float}: these methods will be required to return an instance of
@code{float}.

@item 
Support for @code{__complex__()} method returning a strict subclass of
@ref{198,,complex}: these methods will be required to return an instance of
@code{complex}.

@item 
Passing a complex number as the `real' or `imag' argument in the
@ref{198,,complex()} constructor is now deprecated; it should only be passed
as a single positional argument.
(Contributed by Serhiy Storchaka in gh-109218@footnote{https://github.com/python/cpython/issues/109218}.)
@end itemize

@item 
@ref{15,,calendar}: @code{calendar.January} and @code{calendar.February} constants are
deprecated and replaced by @ref{34c,,calendar.JANUARY} and
@ref{34d,,calendar.FEBRUARY}.
(Contributed by Prince Roshan in gh-103636@footnote{https://github.com/python/cpython/issues/103636}.)

@item 
@ref{1c,,codecs}: use @ref{318,,open()} instead of @ref{317,,codecs.open()}. (gh-133038@footnote{https://github.com/python/cpython/issues/133038})

@item 
@ref{32e,,codeobject.co_lnotab}: use the @ref{34e,,codeobject.co_lines()} method
instead.

@item 
@ref{34,,datetime}:


@itemize *

@item 
@ref{34f,,utcnow()}:
use @code{datetime.datetime.now(tz=datetime.UTC)}.

@item 
@ref{350,,utcfromtimestamp()}:
use @code{datetime.datetime.fromtimestamp(timestamp, tz=datetime.UTC)}.
@end itemize

@item 
@ref{67,,gettext}: Plural value must be an integer.

@item 
@ref{7b,,importlib}:


@itemize *

@item 
@ref{351,,cache_from_source()} `debug_override' parameter is
deprecated: use the `optimization' parameter instead.
@end itemize

@item 
@ref{7e,,importlib.metadata}:


@itemize *

@item 
@code{EntryPoints} tuple interface.

@item 
Implicit @code{None} on return values.
@end itemize

@item 
@ref{8b,,logging}: the @code{warn()} method has been deprecated
since Python 3.3, use @ref{352,,warning()} instead.

@item 
@ref{8f,,mailbox}: Use of StringIO input and text mode is deprecated, use
BytesIO and binary mode instead.

@item 
@ref{a5,,os}: Calling @ref{353,,os.register_at_fork()} in multi-threaded process.

@item 
@code{pydoc.ErrorDuringImport}: A tuple value for `exc_info' parameter is
deprecated, use an exception instance.

@item 
@ref{be,,re}: More strict rules are now applied for numerical group references
and group names in regular expressions.  Only sequence of ASCII digits is now
accepted as a numerical reference.  The group name in bytes patterns and
replacement strings can now only contain ASCII letters and digits and
underscore.
(Contributed by Serhiy Storchaka in gh-91760@footnote{https://github.com/python/cpython/issues/91760}.)

@item 
@code{sre_compile}, @code{sre_constants} and @code{sre_parse} modules.

@item 
@ref{ca,,shutil}: @ref{354,,rmtree()}’s `onerror' parameter is deprecated in
Python 3.12; use the `onexc' parameter instead.

@item 
@ref{d5,,ssl} options and protocols:


@itemize *

@item 
@ref{355,,ssl.SSLContext} without protocol argument is deprecated.

@item 
@ref{355,,ssl.SSLContext}: @ref{356,,set_npn_protocols()} and
@code{selected_npn_protocol()} are deprecated: use ALPN
instead.

@item 
@code{ssl.OP_NO_SSL*} options

@item 
@code{ssl.OP_NO_TLS*} options

@item 
@code{ssl.PROTOCOL_SSLv3}

@item 
@code{ssl.PROTOCOL_TLS}

@item 
@code{ssl.PROTOCOL_TLSv1}

@item 
@code{ssl.PROTOCOL_TLSv1_1}

@item 
@code{ssl.PROTOCOL_TLSv1_2}

@item 
@code{ssl.TLSVersion.SSLv3}

@item 
@code{ssl.TLSVersion.TLSv1}

@item 
@code{ssl.TLSVersion.TLSv1_1}
@end itemize

@item 
@ref{f3,,threading} methods:


@itemize *

@item 
@code{threading.Condition.notifyAll()}: use @ref{357,,notify_all()}.

@item 
@code{threading.Event.isSet()}: use @ref{358,,is_set()}.

@item 
@code{threading.Thread.isDaemon()}, @ref{359,,threading.Thread.setDaemon()}:
use @ref{35a,,threading.Thread.daemon} attribute.

@item 
@code{threading.Thread.getName()}, @ref{35b,,threading.Thread.setName()}:
use @ref{2a2,,threading.Thread.name} attribute.

@item 
@code{threading.currentThread()}: use @ref{35c,,threading.current_thread()}.

@item 
@code{threading.activeCount()}: use @ref{35d,,threading.active_count()}.
@end itemize

@item 
@ref{35e,,typing.Text} (gh-92332@footnote{https://github.com/python/cpython/issues/92332}).

@item 
The internal class @code{typing._UnionGenericAlias} is no longer used to implement
@ref{2aa,,typing.Union}. To preserve compatibility with users using this private
class, a compatibility shim will be provided until at least Python 3.17. (Contributed by
Jelle Zijlstra in gh-105499@footnote{https://github.com/python/cpython/issues/105499}.)

@item 
@ref{35f,,unittest.IsolatedAsyncioTestCase}: it is deprecated to return a value
that is not @code{None} from a test case.

@item 
@ref{111,,urllib.parse} deprecated functions: @ref{360,,urlparse()} instead


@itemize *

@item 
@code{splitattr()}

@item 
@code{splithost()}

@item 
@code{splitnport()}

@item 
@code{splitpasswd()}

@item 
@code{splitport()}

@item 
@code{splitquery()}

@item 
@code{splittag()}

@item 
@code{splittype()}

@item 
@code{splituser()}

@item 
@code{splitvalue()}

@item 
@code{to_bytes()}
@end itemize

@item 
@ref{11f,,wsgiref}: @code{SimpleHandler.stdout.write()} should not do partial
writes.

@item 
@ref{12c,,xml.etree.ElementTree}: Testing the truth value of an
@ref{361,,Element} is deprecated. In a future release it
will always return @code{True}. Prefer explicit @code{len(elem)} or
@code{elem is not None} tests instead.

@item 
@ref{294,,sys._clear_type_cache()} is deprecated:
use @ref{362,,sys._clear_internal_caches()} instead.
@end itemize

@node C API deprecations,,Pending removal in future versions<7>,Deprecations
@anchor{deprecations/index c-api-deprecations}@anchor{5d0e}
@section C API deprecations


@menu
* Pending removal in Python 3.15: Pending removal in Python 3 15<8>. 
* Pending removal in Python 3.18: Pending removal in Python 3 18<6>. 
* Pending removal in future versions: Pending removal in future versions<8>. 

@end menu

@node Pending removal in Python 3 15<8>,Pending removal in Python 3 18<6>,,C API deprecations
@anchor{deprecations/index id1}@anchor{5d0f}
@subsection Pending removal in Python 3.15



@itemize *

@item 
The @ref{3d9,,PyImport_ImportModuleNoBlock()}:
Use @ref{3da,,PyImport_ImportModule()} instead.

@item 
@ref{3db,,PyWeakref_GetObject()} and @ref{3dc,,PyWeakref_GET_OBJECT()}:
Use @ref{3dd,,PyWeakref_GetRef()} instead. The pythoncapi-compat project@footnote{https://github.com/python/pythoncapi-compat/} can be used to get
@code{PyWeakref_GetRef()} on Python 3.12 and older.

@item 
@ref{3de,,Py_UNICODE} type and the @code{Py_UNICODE_WIDE} macro:
Use @code{wchar_t} instead.

@item 
@code{PyUnicode_AsDecodedObject()}:
Use @ref{3df,,PyCodec_Decode()} instead.

@item 
@code{PyUnicode_AsDecodedUnicode()}:
Use @ref{3df,,PyCodec_Decode()} instead; Note that some codecs (for example, “base64”)
may return a type other than @ref{16a,,str}, such as @ref{193,,bytes}.

@item 
@code{PyUnicode_AsEncodedObject()}:
Use @ref{3e0,,PyCodec_Encode()} instead.

@item 
@code{PyUnicode_AsEncodedUnicode()}:
Use @ref{3e0,,PyCodec_Encode()} instead; Note that some codecs (for example, “base64”)
may return a type other than @ref{193,,bytes}, such as @ref{16a,,str}.

@item 
Python initialization functions, deprecated in Python 3.13:


@itemize *

@item 
@ref{3e1,,Py_GetPath()}:
Use @ref{37a,,PyConfig_Get("module_search_paths")}
(@ref{3e2,,sys.path}) instead.

@item 
@ref{3e3,,Py_GetPrefix()}:
Use @ref{37a,,PyConfig_Get("base_prefix")}
(@ref{3e4,,sys.base_prefix}) instead. Use @code{PyConfig_Get("prefix")} (@ref{3e5,,sys.prefix}) if @ref{3e6,,virtual environments} need to be handled.

@item 
@ref{3e7,,Py_GetExecPrefix()}:
Use @ref{37a,,PyConfig_Get("base_exec_prefix")}
(@ref{3e8,,sys.base_exec_prefix}) instead. Use
@code{PyConfig_Get("exec_prefix")}
(@ref{3e9,,sys.exec_prefix}) if @ref{3e6,,virtual environments} need to
be handled.

@item 
@ref{3ea,,Py_GetProgramFullPath()}:
Use @ref{37a,,PyConfig_Get("executable")}
(@ref{3eb,,sys.executable}) instead.

@item 
@ref{3ec,,Py_GetProgramName()}:
Use @ref{37a,,PyConfig_Get("executable")}
(@ref{3eb,,sys.executable}) instead.

@item 
@ref{3ed,,Py_GetPythonHome()}:
Use @ref{37a,,PyConfig_Get("home")} or the
@geindex PYTHONHOME
@geindex environment variable; PYTHONHOME
@ref{3ee,,PYTHONHOME} environment variable instead.
@end itemize

The pythoncapi-compat project@footnote{https://github.com/python/pythoncapi-compat/} can be used to get
@ref{37a,,PyConfig_Get()} on Python 3.13 and older.

@item 
Functions to configure Python’s initialization, deprecated in Python 3.11:


@itemize *

@item 
@code{PySys_SetArgvEx()}:
Set @ref{3ef,,PyConfig.argv} instead.

@item 
@code{PySys_SetArgv()}:
Set @ref{3ef,,PyConfig.argv} instead.

@item 
@code{Py_SetProgramName()}:
Set @ref{3f0,,PyConfig.program_name} instead.

@item 
@code{Py_SetPythonHome()}:
Set @ref{3f1,,PyConfig.home} instead.

@item 
@ref{3f2,,PySys_ResetWarnOptions()}:
Clear @ref{3f3,,sys.warnoptions} and @code{warnings.filters} instead.
@end itemize

The @ref{3f4,,Py_InitializeFromConfig()} API should be used with
@ref{3f5,,PyConfig} instead.

@item 
Global configuration variables:


@itemize *

@item 
@ref{3f6,,Py_DebugFlag}:
Use @ref{3f7,,PyConfig.parser_debug} or
@ref{37a,,PyConfig_Get("parser_debug")} instead.

@item 
@ref{3f8,,Py_VerboseFlag}:
Use @ref{3f9,,PyConfig.verbose} or
@ref{37a,,PyConfig_Get("verbose")} instead.

@item 
@ref{3fa,,Py_QuietFlag}:
Use @ref{3fb,,PyConfig.quiet} or
@ref{37a,,PyConfig_Get("quiet")} instead.

@item 
@ref{3fc,,Py_InteractiveFlag}:
Use @ref{3fd,,PyConfig.interactive} or
@ref{37a,,PyConfig_Get("interactive")} instead.

@item 
@ref{3fe,,Py_InspectFlag}:
Use @ref{3ff,,PyConfig.inspect} or
@ref{37a,,PyConfig_Get("inspect")} instead.

@item 
@ref{400,,Py_OptimizeFlag}:
Use @ref{401,,PyConfig.optimization_level} or
@ref{37a,,PyConfig_Get("optimization_level")} instead.

@item 
@ref{402,,Py_NoSiteFlag}:
Use @ref{403,,PyConfig.site_import} or
@ref{37a,,PyConfig_Get("site_import")} instead.

@item 
@ref{404,,Py_BytesWarningFlag}:
Use @ref{405,,PyConfig.bytes_warning} or
@ref{37a,,PyConfig_Get("bytes_warning")} instead.

@item 
@ref{406,,Py_FrozenFlag}:
Use @ref{407,,PyConfig.pathconfig_warnings} or
@ref{37a,,PyConfig_Get("pathconfig_warnings")} instead.

@item 
@ref{408,,Py_IgnoreEnvironmentFlag}:
Use @ref{409,,PyConfig.use_environment} or
@ref{37a,,PyConfig_Get("use_environment")} instead.

@item 
@ref{40a,,Py_DontWriteBytecodeFlag}:
Use @ref{40b,,PyConfig.write_bytecode} or
@ref{37a,,PyConfig_Get("write_bytecode")} instead.

@item 
@ref{40c,,Py_NoUserSiteDirectory}:
Use @ref{40d,,PyConfig.user_site_directory} or
@ref{37a,,PyConfig_Get("user_site_directory")} instead.

@item 
@ref{40e,,Py_UnbufferedStdioFlag}:
Use @ref{40f,,PyConfig.buffered_stdio} or
@ref{37a,,PyConfig_Get("buffered_stdio")} instead.

@item 
@ref{410,,Py_HashRandomizationFlag}:
Use @ref{411,,PyConfig.use_hash_seed}
and @ref{412,,PyConfig.hash_seed} or
@ref{37a,,PyConfig_Get("hash_seed")} instead.

@item 
@ref{413,,Py_IsolatedFlag}:
Use @ref{414,,PyConfig.isolated} or
@ref{37a,,PyConfig_Get("isolated")} instead.

@item 
@ref{415,,Py_LegacyWindowsFSEncodingFlag}:
Use @ref{416,,PyPreConfig.legacy_windows_fs_encoding} or
@ref{37a,,PyConfig_Get("legacy_windows_fs_encoding")} instead.

@item 
@ref{417,,Py_LegacyWindowsStdioFlag}:
Use @ref{418,,PyConfig.legacy_windows_stdio} or
@ref{37a,,PyConfig_Get("legacy_windows_stdio")} instead.

@item 
@code{Py_FileSystemDefaultEncoding}, @code{Py_HasFileSystemDefaultEncoding}:
Use @ref{419,,PyConfig.filesystem_encoding} or
@ref{37a,,PyConfig_Get("filesystem_encoding")} instead.

@item 
@code{Py_FileSystemDefaultEncodeErrors}:
Use @ref{41a,,PyConfig.filesystem_errors} or
@ref{37a,,PyConfig_Get("filesystem_errors")} instead.

@item 
@code{Py_UTF8Mode}:
Use @ref{41b,,PyPreConfig.utf8_mode} or
@ref{37a,,PyConfig_Get("utf8_mode")} instead.
(see @ref{41c,,Py_PreInitialize()})
@end itemize

The @ref{3f4,,Py_InitializeFromConfig()} API should be used with
@ref{3f5,,PyConfig} to set these options. Or @ref{37a,,PyConfig_Get()} can be
used to get these options at runtime.
@end itemize

@node Pending removal in Python 3 18<6>,Pending removal in future versions<8>,Pending removal in Python 3 15<8>,C API deprecations
@anchor{deprecations/index id2}@anchor{5d10}
@subsection Pending removal in Python 3.18



@itemize *

@item 
The following private functions are deprecated
and planned for removal in Python 3.18:


@itemize *

@item 
@code{_PyBytes_Join()}: use @ref{381,,PyBytes_Join()}.

@item 
@code{_PyDict_GetItemStringWithError()}: use @ref{41f,,PyDict_GetItemStringRef()}.

@item 
@code{_PyDict_Pop()}: use @ref{420,,PyDict_Pop()}.

@item 
@code{_PyLong_Sign()}: use @ref{398,,PyLong_GetSign()}.

@item 
@code{_PyLong_FromDigits()} and @code{_PyLong_New()}:
use @ref{3a8,,PyLongWriter_Create()}.

@item 
@code{_PyThreadState_UncheckedGet()}: use @ref{421,,PyThreadState_GetUnchecked()}.

@item 
@code{_PyUnicode_AsString()}: use @ref{422,,PyUnicode_AsUTF8()}.

@item 
@code{_PyUnicodeWriter_Init()}:
replace @code{_PyUnicodeWriter_Init(&writer)} with
@ref{3b2,,writer = PyUnicodeWriter_Create(0)}.

@item 
@code{_PyUnicodeWriter_Finish()}:
replace @code{_PyUnicodeWriter_Finish(&writer)} with
@ref{3b5,,PyUnicodeWriter_Finish(writer)}.

@item 
@code{_PyUnicodeWriter_Dealloc()}:
replace @code{_PyUnicodeWriter_Dealloc(&writer)} with
@ref{3b4,,PyUnicodeWriter_Discard(writer)}.

@item 
@code{_PyUnicodeWriter_WriteChar()}:
replace @code{_PyUnicodeWriter_WriteChar(&writer, ch)} with
@ref{3b8,,PyUnicodeWriter_WriteChar(writer@comma{} ch)}.

@item 
@code{_PyUnicodeWriter_WriteStr()}:
replace @code{_PyUnicodeWriter_WriteStr(&writer, str)} with
@ref{3ba,,PyUnicodeWriter_WriteStr(writer@comma{} str)}.

@item 
@code{_PyUnicodeWriter_WriteSubstring()}:
replace @code{_PyUnicodeWriter_WriteSubstring(&writer, str, start, end)} with
@ref{3bb,,PyUnicodeWriter_WriteSubstring(writer@comma{} str@comma{} start@comma{} end)}.

@item 
@code{_PyUnicodeWriter_WriteASCIIString()}:
replace @code{_PyUnicodeWriter_WriteASCIIString(&writer, str)} with
@ref{3b7,,PyUnicodeWriter_WriteASCII(writer@comma{} str)}.

@item 
@code{_PyUnicodeWriter_WriteLatin1String()}:
replace @code{_PyUnicodeWriter_WriteLatin1String(&writer, str)} with
@ref{3bd,,PyUnicodeWriter_WriteUTF8(writer@comma{} str)}.

@item 
@code{_PyUnicodeWriter_Prepare()}: (no replacement).

@item 
@code{_PyUnicodeWriter_PrepareKind()}: (no replacement).

@item 
@code{_Py_HashPointer()}: use @ref{423,,Py_HashPointer()}.

@item 
@code{_Py_fopen_obj()}: use @ref{391,,Py_fopen()}.
@end itemize

The pythoncapi-compat project@footnote{https://github.com/python/pythoncapi-compat/} can be used to get
these new public functions on Python 3.13 and older.
(Contributed by Victor Stinner in gh-128863@footnote{https://github.com/python/cpython/issues/128863}.)
@end itemize

@node Pending removal in future versions<8>,,Pending removal in Python 3 18<6>,C API deprecations
@anchor{deprecations/index id3}@anchor{5d11}
@subsection Pending removal in future versions


The following APIs are deprecated and will be removed,
although there is currently no date scheduled for their removal.


@itemize *

@item 
@ref{425,,Py_TPFLAGS_HAVE_FINALIZE}:
Unneeded since Python 3.8.

@item 
@ref{426,,PyErr_Fetch()}:
Use @ref{427,,PyErr_GetRaisedException()} instead.

@item 
@ref{428,,PyErr_NormalizeException()}:
Use @ref{427,,PyErr_GetRaisedException()} instead.

@item 
@ref{429,,PyErr_Restore()}:
Use @ref{42a,,PyErr_SetRaisedException()} instead.

@item 
@ref{42b,,PyModule_GetFilename()}:
Use @ref{42c,,PyModule_GetFilenameObject()} instead.

@item 
@ref{42d,,PyOS_AfterFork()}:
Use @ref{42e,,PyOS_AfterFork_Child()} instead.

@item 
@ref{42f,,PySlice_GetIndicesEx()}:
Use @ref{430,,PySlice_Unpack()} and @ref{431,,PySlice_AdjustIndices()} instead.

@item 
@ref{432,,PyUnicode_READY()}:
Unneeded since Python 3.12

@item 
@code{PyErr_Display()}:
Use @ref{433,,PyErr_DisplayException()} instead.

@item 
@code{_PyErr_ChainExceptions()}:
Use @code{_PyErr_ChainExceptions1()} instead.

@item 
@code{PyBytesObject.ob_shash} member:
call @ref{434,,PyObject_Hash()} instead.

@item 
Thread Local Storage (TLS) API:


@itemize *

@item 
@ref{435,,PyThread_create_key()}:
Use @ref{436,,PyThread_tss_alloc()} instead.

@item 
@ref{437,,PyThread_delete_key()}:
Use @ref{438,,PyThread_tss_free()} instead.

@item 
@ref{439,,PyThread_set_key_value()}:
Use @ref{43a,,PyThread_tss_set()} instead.

@item 
@ref{43b,,PyThread_get_key_value()}:
Use @ref{43c,,PyThread_tss_get()} instead.

@item 
@ref{43d,,PyThread_delete_key_value()}:
Use @ref{43e,,PyThread_tss_delete()} instead.

@item 
@ref{43f,,PyThread_ReInitTLS()}:
Unneeded since Python 3.7.
@end itemize
@end itemize

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Glossary,About this documentation,Deprecations,Top
@anchor{glossary doc}@anchor{5d12}@anchor{glossary glossary}@anchor{2001}@anchor{glossary id1}@anchor{5d13}@anchor{glossary translation-repo}@anchor{5d14}
@chapter Glossary


@c if you add new entries, keep the alphabetical sorting!


@table @asis
@anchor{glossary term-0}@anchor{493}
@geindex >>>

@item @code{>>>}

The default Python prompt of the @ref{1b7,,interactive} shell.  Often
seen for code examples which can be executed interactively in the
interpreter.
@anchor{glossary term-}@anchor{494}
@geindex ...

@item @code{...}

Can refer to:


@itemize *

@item 
The default Python prompt of the @ref{1b7,,interactive} shell when entering the
code for an indented code block, when within a pair of matching left and
right delimiters (parentheses, square brackets, curly braces or triple
quotes), or after specifying a decorator.
@end itemize

@geindex ...; ellipsis literal


@itemize *

@item 
The three dots form of the @ref{2040,,Ellipsis} object.
@end itemize
@anchor{glossary term-abstract-base-class}@anchor{13c2}
@geindex abstract base class

@item abstract base class

Abstract base classes complement @ref{5d15,,duck-typing} by
providing a way to define interfaces when other techniques like
@ref{6fa,,hasattr()} would be clumsy or subtly wrong (for example with
@ref{23f8,,magic methods}).  ABCs introduce virtual
subclasses, which are classes that don’t inherit from a class but are
still recognized by @ref{2af,,isinstance()} and @ref{9ca,,issubclass()}; see the
@ref{4,,abc} module documentation.  Python comes with many built-in ABCs for
data structures (in the @ref{1f,,collections.abc} module), numbers (in the
@ref{a2,,numbers} module), streams (in the @ref{83,,io} module), import finders
and loaders (in the @ref{7c,,importlib.abc} module).  You can create your own
ABCs with the @code{abc} module.
@anchor{glossary term-annotate-function}@anchor{15e}
@geindex annotate function

@item annotate function

A callable that can be called to retrieve the @ref{15d,,annotations} of
an object. Annotate functions are usually @ref{24fe,,functions},
automatically generated as the @ref{19c7,,__annotate__} attribute of functions,
classes, and modules. Annotate functions are a subset of
@ref{484f,,evaluate functions}.
@anchor{glossary term-annotation}@anchor{15d}
@geindex annotation

@item annotation

A label associated with a variable, a class
attribute or a function parameter or return value,
used by convention as a @ref{2412,,type hint}.

Annotations of local variables cannot be accessed at runtime, but
annotations of global variables, class attributes, and functions
can be retrieved by calling @ref{457,,annotationlib.get_annotations()}
on modules, classes, and functions, respectively.

See @ref{f57,,variable annotation}, @ref{205d,,function annotation}, 
@geindex Python Enhancement Proposals; PEP 484
PEP 484@footnote{https://peps.python.org/pep-0484/},
@geindex Python Enhancement Proposals; PEP 526
PEP 526@footnote{https://peps.python.org/pep-0526/}, and 
@geindex Python Enhancement Proposals; PEP 649
PEP 649@footnote{https://peps.python.org/pep-0649/}, which describe this functionality.
Also see @ref{9df,,Annotations Best Practices}
for best practices on working with annotations.
@anchor{glossary term-argument}@anchor{67b}
@geindex argument

@item argument

A value passed to a @ref{24fe,,function} (or @ref{18ad,,method}) when calling the
function.  There are two kinds of argument:


@itemize *

@item 
`keyword argument': an argument preceded by an identifier (e.g.
@code{name=}) in a function call or passed as a value in a dictionary
preceded by @code{**}.  For example, @code{3} and @code{5} are both keyword
arguments in the following calls to @ref{198,,complex()}:

@example
complex(real=3, imag=5)
complex(**@{'real': 3, 'imag': 5@})
@end example

@item 
`positional argument': an argument that is not a keyword argument.
Positional arguments can appear at the beginning of an argument list
and/or be passed as elements of an @ref{1433,,iterable} preceded by @code{*}.
For example, @code{3} and @code{5} are both positional arguments in the
following calls:

@example
complex(3, 5)
complex(*(3, 5))
@end example
@end itemize

Arguments are assigned to the named local variables in a function body.
See the @ref{f83,,Calls} section for the rules governing this assignment.
Syntactically, any expression can be used to represent an argument; the
evaluated value is assigned to the local variable.

See also the @ref{238f,,parameter} glossary entry, the FAQ question on
@ref{5c4f,,the difference between arguments and parameters}, and 
@geindex Python Enhancement Proposals; PEP 362
PEP 362@footnote{https://peps.python.org/pep-0362/}.
@anchor{glossary term-asynchronous-context-manager}@anchor{7f1}
@geindex asynchronous context manager

@item asynchronous context manager

An object which controls the environment seen in an
@ref{186,,async with} statement by defining @ref{2465,,__aenter__()} and
@ref{19e4,,__aexit__()} methods.  Introduced by 
@geindex Python Enhancement Proposals; PEP 492
PEP 492@footnote{https://peps.python.org/pep-0492/}.
@anchor{glossary term-asynchronous-generator}@anchor{24e2}
@geindex asynchronous generator

@item asynchronous generator

A function which returns an @ref{39bc,,asynchronous generator iterator}.  It
looks like a coroutine function defined with @ref{7ee,,async def} except
that it contains @ref{bc8,,yield} expressions for producing a series of
values usable in an @ref{ca7,,async for} loop.

Usually refers to an asynchronous generator function, but may refer to an
`asynchronous generator iterator' in some contexts.  In cases where the
intended meaning isn’t clear, using the full terms avoids ambiguity.

An asynchronous generator function may contain @ref{18e,,await}
expressions as well as @ref{ca7,,async for}, and @ref{186,,async with}
statements.
@anchor{glossary term-asynchronous-generator-iterator}@anchor{39bc}
@geindex asynchronous generator iterator

@item asynchronous generator iterator

An object created by an @ref{24e2,,asynchronous generator} function.

This is an @ref{4c8,,asynchronous iterator} which when called using the
@ref{18ca,,__anext__()} method returns an awaitable object which will execute
the body of the asynchronous generator function until the next
@ref{bc8,,yield} expression.

Each @ref{bc8,,yield} temporarily suspends processing, remembering the
execution state (including local variables and pending
try-statements).  When the `asynchronous generator iterator' effectively
resumes with another awaitable returned by @ref{18ca,,__anext__()}, it
picks up where it left off.  See 
@geindex Python Enhancement Proposals; PEP 492
PEP 492@footnote{https://peps.python.org/pep-0492/} and 
@geindex Python Enhancement Proposals; PEP 525
PEP 525@footnote{https://peps.python.org/pep-0525/}.
@anchor{glossary term-asynchronous-iterable}@anchor{f7a}
@geindex asynchronous iterable

@item asynchronous iterable

An object, that can be used in an @ref{ca7,,async for} statement.
Must return an @ref{4c8,,asynchronous iterator} from its
@ref{dfc,,__aiter__()} method.  Introduced by 
@geindex Python Enhancement Proposals; PEP 492
PEP 492@footnote{https://peps.python.org/pep-0492/}.
@anchor{glossary term-asynchronous-iterator}@anchor{4c8}
@geindex asynchronous iterator

@item asynchronous iterator

An object that implements the @ref{dfc,,__aiter__()} and @ref{18ca,,__anext__()}
methods.  @code{__anext__()} must return an @ref{4ca,,awaitable} object.
@ref{ca7,,async for} resolves the awaitables returned by an asynchronous
iterator’s @code{__anext__()} method until it raises a
@ref{1e52,,StopAsyncIteration} exception.  Introduced by 
@geindex Python Enhancement Proposals; PEP 492
PEP 492@footnote{https://peps.python.org/pep-0492/}.
@anchor{glossary term-atomic-operation}@anchor{2779}
@geindex atomic operation

@item atomic operation

An operation that appears to execute as a single, indivisible step: no
other thread can observe it half-done, and its effects become visible all
at once.  Python does not guarantee that high-level statements are atomic
(for example, @code{x += 1} performs multiple bytecode operations and is not
atomic).  Atomicity is only guaranteed where explicitly documented.  See
also @ref{276e,,race condition} and @ref{276f,,data race}.
@anchor{glossary term-attached-thread-state}@anchor{5231}
@geindex attached thread state

@item attached thread state

A @ref{188f,,thread state} that is active for the current OS thread.

When a @ref{188f,,thread state} is attached, the OS thread has
access to the full Python C API and can safely invoke the
bytecode interpreter.

Unless a function explicitly notes otherwise, attempting to call
the C API without an attached thread state will result in a fatal
error or undefined behavior.  A thread state can be attached and detached
explicitly by the user through the C API, or implicitly by the runtime,
including during blocking C calls and by the bytecode interpreter in between
calls.

On most builds of Python, having an attached thread state implies that the
caller holds the @ref{165,,GIL} for the current interpreter, so only
one OS thread can have an attached thread state at a given moment. In
@ref{1791,,free-threaded builds} of Python, threads can
concurrently hold an attached thread state, allowing for true parallelism of
the bytecode interpreter.
@anchor{glossary term-attribute}@anchor{2975}
@geindex attribute

@item attribute

A value associated with an object which is usually referenced by name
using dotted expressions.
For example, if an object `o' has an attribute
`a' it would be referenced as `o.a'.

It is possible to give an object an attribute whose name is not an
identifier as defined by @ref{22e4,,Names (identifiers and keywords)}, for example using
@ref{2605,,setattr()}, if the object allows it.
Such an attribute will not be accessible using a dotted expression,
and would instead need to be retrieved with @ref{dd0,,getattr()}.
@anchor{glossary term-awaitable}@anchor{4ca}
@geindex awaitable

@item awaitable

An object that can be used in an @ref{18e,,await} expression.  Can be
a @ref{6ba,,coroutine} or an object with an @ref{f7b,,__await__()} method.
See also 
@geindex Python Enhancement Proposals; PEP 492
PEP 492@footnote{https://peps.python.org/pep-0492/}.
@anchor{glossary term-BDFL}@anchor{5d16}
@geindex BDFL

@item BDFL

Benevolent Dictator For Life, a.k.a. Guido van Rossum@footnote{https://gvanrossum.github.io/}, Python’s creator.
@anchor{glossary term-binary-file}@anchor{20b2}
@geindex binary file

@item binary file

A @ref{13cf,,file object} able to read and write
@ref{194,,bytes-like objects}.
Examples of binary files are files opened in binary mode (@code{'rb'},
@code{'wb'} or @code{'rb+'}), @ref{760,,sys.stdin.buffer},
@ref{cd3,,sys.stdout.buffer}, and instances of
@ref{10aa,,io.BytesIO} and @ref{65c,,gzip.GzipFile}.

See also @ref{20b1,,text file} for a file object able to read and write
@ref{16a,,str} objects.
@anchor{glossary term-borrowed-reference}@anchor{3d5}
@geindex borrowed reference

@item borrowed reference

In Python’s C API, a borrowed reference is a reference to an object,
where the code using the object does not own the reference.
It becomes a dangling
pointer if the object is destroyed. For example, a garbage collection can
remove the last @ref{5e2,,strong reference} to the object and so destroy it.

Calling @ref{790,,Py_INCREF()} on the @ref{3d5,,borrowed reference} is
recommended to convert it to a @ref{5e2,,strong reference} in-place, except
when the object cannot be destroyed before the last usage of the borrowed
reference. The @ref{aa0,,Py_NewRef()} function can be used to create a new
strong reference.
@anchor{glossary term-bytes-like-object}@anchor{194}
@geindex bytes-like object

@item bytes-like object

An object that supports the @ref{262,,Buffer Protocol} and can
export a C-@ref{26ce,,contiguous} buffer. This includes all @ref{193,,bytes},
@ref{342,,bytearray}, and @ref{4bf,,array.array} objects, as well as many
common @ref{166,,memoryview} objects.  Bytes-like objects can
be used for various operations that work with binary data; these include
compression, saving to a binary file, and sending over a socket.

Some operations need the binary data to be mutable.  The documentation
often refers to these as “read-write bytes-like objects”.  Example
mutable buffer objects include @ref{342,,bytearray} and a
@ref{166,,memoryview} of a @code{bytearray}.
Other operations require the binary data to be stored in
immutable objects (“read-only bytes-like objects”); examples
of these include @ref{193,,bytes} and a @code{memoryview}
of a @code{bytes} object.
@anchor{glossary term-bytecode}@anchor{4ab}
@geindex bytecode

@item bytecode

Python source code is compiled into bytecode, the internal representation
of a Python program in the CPython interpreter.  The bytecode is also
cached in @code{.pyc} files so that executing the same file is
faster the second time (recompilation from source to bytecode can be
avoided).  This “intermediate language” is said to run on a
@ref{3ae0,,virtual machine} that executes the machine code corresponding to
each bytecode. Do note that bytecodes are not expected to work between
different Python virtual machines, nor to be stable between Python
releases.

A list of bytecode instructions can be found in the documentation for
@ref{7d0,,the dis module}.
@anchor{glossary term-callable}@anchor{2dec}
@geindex callable

@item callable

A callable is an object that can be called, possibly with a set
of arguments (see @ref{67b,,argument}), with the following syntax:

@example
callable(argument1, argument2, argumentN)
@end example

A @ref{24fe,,function}, and by extension a @ref{18ad,,method}, is a callable.
An instance of a class that implements the @ref{77b,,__call__()}
method is also a callable.
@anchor{glossary term-callback}@anchor{2e0d}
@geindex callback

@item callback

A subroutine function which is passed as an argument to be executed at
some point in the future.
@anchor{glossary term-class}@anchor{1d41}
@geindex class

@item class

A template for creating user-defined objects. Class definitions
normally contain method definitions which operate on instances of the
class.
@anchor{glossary term-class-variable}@anchor{5d17}
@geindex class variable

@item class variable

A variable defined in a class and intended to be modified only at
class level (i.e., not in an instance of the class).
@anchor{glossary term-closure-variable}@anchor{18da}
@geindex closure variable

@item closure variable

A @ref{2470,,free variable} referenced from a @ref{23d4,,nested scope} that is defined in an outer
scope rather than being resolved at runtime from the globals or builtin namespaces.
May be explicitly defined with the @ref{14b3,,nonlocal} keyword to allow write access,
or implicitly defined if the variable is only being read.

For example, in the @code{inner} function in the following code, both @code{x} and @code{print} are
@ref{2470,,free variables}, but only @code{x} is a `closure variable':

@example
def outer():
    x = 0
    def inner():
        nonlocal x
        x += 1
        print(x)
    return inner
@end example

Due to the @ref{238b,,codeobject.co_freevars} attribute (which, despite its name, only
includes the names of closure variables rather than listing all referenced free
variables), the more general @ref{2470,,free variable} term is sometimes used even
when the intended meaning is to refer specifically to closure variables.
@anchor{glossary term-complex-number}@anchor{5d18}
@geindex complex number

@item complex number

An extension of the familiar real number system in which all numbers are
expressed as a sum of a real part and an imaginary part.  Imaginary
numbers are real multiples of the imaginary unit (the square root of
@code{-1}), often written @code{i} in mathematics or @code{j} in
engineering.  Python has built-in support for complex numbers, which are
written with this latter notation; the imaginary part is written with a
@code{j} suffix, e.g., @code{3+1j}.  To get access to complex equivalents of the
@ref{92,,math} module, use @ref{19,,cmath}.  Use of complex numbers is a fairly
advanced mathematical feature.  If you’re not aware of a need for them,
it’s almost certain you can safely ignore them.
@anchor{glossary term-concurrency}@anchor{5d19}
@geindex concurrency

@item concurrency

The ability of a computer program to perform multiple tasks at the same
time.  Python provides libraries for writing programs that make use of
different forms of concurrency.  @ref{b,,asyncio} is a library for dealing
with asynchronous tasks and coroutines.  @ref{f3,,threading} provides
access to operating system threads and @ref{98,,multiprocessing} to
operating system processes. Multi-core processors can execute threads and
processes on different CPU cores at the same time (see
@ref{5d1a,,parallelism}).
@anchor{glossary term-concurrent-modification}@anchor{5d1b}
@geindex concurrent modification

@item concurrent modification

When multiple threads modify shared data at the same time.  Concurrent
modification without proper synchronization can cause
@ref{276e,,race conditions}, and might also trigger a
@ref{276f,,data race}, data corruption, or both.
@anchor{glossary term-context}@anchor{19a7}
@geindex context

@item context

This term has different meanings depending on where and how it is used.
Some common meanings:


@itemize *

@item 
The temporary state or environment established by a @ref{1e3,,context manager} via a @ref{187,,with} statement.

@item 
The collection of key­value bindings associated with a particular
@ref{178,,contextvars.Context} object and accessed via
@ref{18be,,ContextVar} objects.  Also see @ref{5d1c,,context variable}.

@item 
A @ref{178,,contextvars.Context} object.  Also see @ref{19a8,,current context}.
@end itemize
@anchor{glossary term-context-management-protocol}@anchor{19a9}
@geindex context management protocol

@item context management protocol

The @ref{7e5,,__enter__()} and @ref{150c,,__exit__()} methods called
by the @ref{187,,with} statement.  See 
@geindex Python Enhancement Proposals; PEP 343
PEP 343@footnote{https://peps.python.org/pep-0343/}.
@anchor{glossary term-context-manager}@anchor{1e3}
@geindex context manager

@item context manager

An object which implements the @ref{19a9,,context management protocol} and
controls the environment seen in a @ref{187,,with} statement.  See
@geindex Python Enhancement Proposals; PEP 343
PEP 343@footnote{https://peps.python.org/pep-0343/}.
@anchor{glossary term-context-variable}@anchor{5d1c}
@geindex context variable

@item context variable

A variable whose value depends on which context is the @ref{19a8,,current context}.  Values are accessed via @ref{18be,,contextvars.ContextVar}
objects.  Context variables are primarily used to isolate state between
concurrent asynchronous tasks.
@anchor{glossary term-contiguous}@anchor{26ce}
@geindex contiguous

@item contiguous

@geindex C-contiguous
@geindex Fortran contiguous

A buffer is considered contiguous exactly if it is either
`C-contiguous' or `Fortran contiguous'.  Zero-dimensional buffers are
C and Fortran contiguous.  In one-dimensional arrays, the items
must be laid out in memory next to each other, in order of
increasing indexes starting from zero.  In multidimensional
C-contiguous arrays, the last index varies the fastest when
visiting items in order of memory address.  However, in
Fortran contiguous arrays, the first index varies the fastest.
@anchor{glossary term-coroutine}@anchor{6ba}
@geindex coroutine

@item coroutine

Coroutines are a more generalized form of subroutines. Subroutines are
entered at one point and exited at another point.  Coroutines can be
entered, exited, and resumed at many different points.  They can be
implemented with the @ref{7ee,,async def} statement.  See also
@geindex Python Enhancement Proposals; PEP 492
PEP 492@footnote{https://peps.python.org/pep-0492/}.
@anchor{glossary term-coroutine-function}@anchor{f79}
@geindex coroutine function

@item coroutine function

A function which returns a @ref{6ba,,coroutine} object.  A coroutine
function may be defined with the @ref{7ee,,async def} statement,
and may contain @ref{18e,,await}, @ref{ca7,,async for}, and
@ref{186,,async with} keywords.  These were introduced
by 
@geindex Python Enhancement Proposals; PEP 492
PEP 492@footnote{https://peps.python.org/pep-0492/}.
@anchor{glossary term-CPython}@anchor{907}
@geindex CPython

@item CPython

The canonical implementation of the Python programming language, as
distributed on python.org@footnote{https://www.python.org}.  The term “CPython”
is used when necessary to distinguish this implementation from others
such as Jython or IronPython.
@anchor{glossary term-current-context}@anchor{19a8}
@geindex current context

@item current context

The @ref{19a7,,context} (@ref{178,,contextvars.Context} object) that is
currently used by @ref{18be,,ContextVar} objects to access (get
or set) the values of @ref{5d1c,,context variables}.  Each
thread has its own current context.  Frameworks for executing asynchronous
tasks (see @ref{b,,asyncio}) associate each task with a context which
becomes the current context whenever the task starts or resumes execution.
@anchor{glossary term-cyclic-isolate}@anchor{594f}
@geindex cyclic isolate

@item cyclic isolate

A subgroup of one or more objects that reference each other in a reference
cycle, but are not referenced by objects outside the group.  The goal of
the @ref{1826,,cyclic garbage collector} is to identify these groups and break the reference
cycles so that the memory can be reclaimed.
@anchor{glossary term-data-race}@anchor{276f}
@geindex data race

@item data race

A situation where multiple threads access the same memory location
concurrently, at least one of the accesses is a write, and the threads
do not use any synchronization to control their access.  Data races
lead to @ref{5d1d,,non-deterministic} behavior and can cause data corruption.
Proper use of @ref{276d,,locks} and other @ref{5d1e,,synchronization primitives} prevents data races.  Note that data races
can only happen in native code, but that @ref{5d1f,,native code} might be
exposed in a Python API.  See also @ref{276e,,race condition} and
@ref{5d20,,thread-safe}.
@anchor{glossary term-deadlock}@anchor{5d21}
@geindex deadlock

@item deadlock

A situation in which two or more tasks (threads, processes, or coroutines)
wait indefinitely for each other to release resources or complete actions,
preventing any from making progress.  For example, if thread A holds lock
1 and waits for lock 2, while thread B holds lock 2 and waits for lock 1,
both threads will wait indefinitely.  In Python this often arises from
acquiring multiple locks in conflicting orders or from circular
join/await dependencies.  Deadlocks can be avoided by always acquiring
multiple @ref{276d,,locks} in a consistent order.  See also
lock and @ref{5d22,,reentrant}.
@anchor{glossary term-decorator}@anchor{93f}
@geindex decorator

@item decorator

A function returning another function, usually applied as a function
transformation using the @code{@@wrapper} syntax.  Common examples for
decorators are @ref{48f,,classmethod()} and @ref{451,,staticmethod()}.

The decorator syntax is merely syntactic sugar, the following two
function definitions are semantically equivalent:

@example
def f(arg):
    ...
f = staticmethod(f)

@@staticmethod
def f(arg):
    ...
@end example

The same concept exists for classes, but is less commonly used there.  See
the documentation for @ref{205c,,function definitions} and
@ref{14e3,,class definitions} for more about decorators.
@anchor{glossary term-descriptor}@anchor{18c9}
@geindex descriptor

@item descriptor

Any object which defines the methods @ref{16f4,,__get__()},
@ref{23fc,,__set__()}, or @ref{1993,,__delete__()}.
When a class attribute is a descriptor, its special
binding behavior is triggered upon attribute lookup.  Normally, using
`a.b' to get, set or delete an attribute looks up the object named `b' in
the class dictionary for `a', but if `b' is a descriptor, the respective
descriptor method gets called.  Understanding descriptors is a key to a
deep understanding of Python because they are the basis for many features
including functions, methods, properties, class methods, static methods,
and reference to super classes.

For more information about descriptors’ methods, see @ref{e4f,,Implementing Descriptors}
or the @ref{16f9,,Descriptor How To Guide}.
@anchor{glossary term-dictionary}@anchor{241c}
@geindex dictionary

@item dictionary

An associative array, where arbitrary keys are mapped to values.  The
keys can be any object with @ref{cf9,,__hash__()} and
@ref{cf8,,__eq__()} methods.
Called a hash in Perl.
@anchor{glossary term-dictionary-comprehension}@anchor{5d23}
@geindex dictionary comprehension

@item dictionary comprehension

A compact way to process all or part of the elements in an iterable and
return a dictionary with the results. @code{results = @{n: n ** 2 for n in
range(10)@}} generates a dictionary containing key @code{n} mapped to
value @code{n ** 2}. See @ref{7ed,,Displays for lists@comma{} sets and dictionaries}.
@anchor{glossary term-dictionary-view}@anchor{29f7}
@geindex dictionary view

@item dictionary view

The objects returned from @ref{9d6,,dict.keys()}, @ref{9d7,,dict.values()}, and
@ref{9d8,,dict.items()} are called dictionary views. They provide a dynamic
view on the dictionary’s entries, which means that when the dictionary
changes, the view reflects these changes. To force the
dictionary view to become a full list use @code{list(dictview)}.  See
@ref{26ee,,Dictionary view objects}.
@anchor{glossary term-docstring}@anchor{2330}
@geindex docstring

@item docstring

A string literal which appears as the first expression in a class,
function or module.  While ignored when the suite is executed, it is
recognized by the compiler and put into the @ref{b27,,__doc__} attribute
of the enclosing class, function or module.  Since it is available via
introspection, it is the canonical place for documentation of the
object.
@anchor{glossary term-duck-typing}@anchor{5d15}
@geindex duck-typing

@item duck-typing

A programming style which does not look at an object’s type to determine
if it has the right interface; instead, the method or attribute is simply
called or used (“If it looks like a duck and quacks like a duck, it
must be a duck.”)  By emphasizing interfaces rather than specific types,
well-designed code improves its flexibility by allowing polymorphic
substitution.  Duck-typing avoids tests using @ref{f4a,,type()} or
@ref{2af,,isinstance()}.  (Note, however, that duck-typing can be complemented
with @ref{13c2,,abstract base classes}.)  Instead, it
typically employs @ref{6fa,,hasattr()} tests or @ref{30e9,,EAFP} programming.
@anchor{glossary term-dunder}@anchor{5d24}
@geindex dunder

@item dunder

An informal short-hand for “double underscore”, used when talking about a
@ref{1ca3,,special method}. For example, @code{__init__} is often pronounced
“dunder init”.
@anchor{glossary term-EAFP}@anchor{30e9}
@geindex EAFP

@item EAFP

Easier to ask for forgiveness than permission.  This common Python coding
style assumes the existence of valid keys or attributes and catches
exceptions if the assumption proves false.  This clean and fast style is
characterized by the presence of many @ref{8fa,,try} and @ref{1ac,,except}
statements.  The technique contrasts with the @ref{5d25,,LBYL} style
common to many other languages such as C.
@anchor{glossary term-evaluate-function}@anchor{484f}
@geindex evaluate function

@item evaluate function

A function that can be called to evaluate a lazily evaluated attribute
of an object, such as the value of type aliases created with the @ref{66d,,type}
statement.
@anchor{glossary term-expression}@anchor{2416}
@geindex expression

@item expression

A piece of syntax which can be evaluated to some value.  In other words,
an expression is an accumulation of expression elements like literals,
names, attribute access, operators or function calls which all return a
value.  In contrast to many other languages, not all language constructs
are expressions.  There are also @ref{2c6d,,statement}s which cannot be used
as expressions, such as @ref{19b7,,while}.  Assignments are also statements,
not expressions.
@anchor{glossary term-extension-module}@anchor{2295}
@geindex extension module

@item extension module

A module written in C or C++, using Python’s C API to interact with the
core and with user code.
@anchor{glossary term-f-string}@anchor{66b}
@geindex f-string

@item f-string@anchor{glossary term-f-strings}@anchor{5d26}
@geindex f-strings

@itemx f-strings

String literals prefixed with @code{f} or @code{F} are commonly called
“f-strings” which is short for
@ref{19b,,formatted string literals}.  See also 
@geindex Python Enhancement Proposals; PEP 498
PEP 498@footnote{https://peps.python.org/pep-0498/}.
@anchor{glossary term-file-object}@anchor{13cf}
@geindex file object

@item file object

An object exposing a file-oriented API (with methods such as
@code{read()} or @code{write()}) to an underlying resource.  Depending
on the way it was created, a file object can mediate access to a real
on-disk file or to another type of storage or communication device
(for example standard input/output, in-memory buffers, sockets, pipes,
etc.).  File objects are also called `file-like objects' or
`streams'.

There are actually three categories of file objects: raw
@ref{20b2,,binary files}, buffered
binary files and @ref{20b1,,text files}.
Their interfaces are defined in the @ref{83,,io} module.  The canonical
way to create a file object is by using the @ref{318,,open()} function.
@anchor{glossary term-file-like-object}@anchor{17fd}
@geindex file-like object

@item file-like object

A synonym for @ref{13cf,,file object}.
@anchor{glossary term-filesystem-encoding-and-error-handler}@anchor{75e}
@geindex filesystem encoding and error handler

@item filesystem encoding and error handler

Encoding and error handler used by Python to decode bytes from the
operating system and encode Unicode to the operating system.

The filesystem encoding must guarantee to successfully decode all bytes
below 128. If the file system encoding fails to provide this guarantee,
API functions can raise @ref{460,,UnicodeError}.

The @ref{e59,,sys.getfilesystemencoding()} and
@ref{ee8,,sys.getfilesystemencodeerrors()} functions can be used to get the
filesystem encoding and error handler.

The @ref{75e,,filesystem encoding and error handler} are configured at
Python startup by the @ref{998,,PyConfig_Read()} function: see
@ref{419,,filesystem_encoding} and
@ref{41a,,filesystem_errors} members of @ref{3f5,,PyConfig}.

See also the @ref{54b,,locale encoding}.
@anchor{glossary term-finder}@anchor{23ae}
@geindex finder

@item finder

An object that tries to find the @ref{1a6f,,loader} for a module that is
being imported.

There are two types of finder: @ref{1276,,meta path finders} for use with @ref{f2d,,sys.meta_path}, and @ref{1277,,path entry finders} for use with @ref{122a,,sys.path_hooks}.

See @ref{248e,,Finders and loaders} and @ref{7b,,importlib} for much more detail.
@anchor{glossary term-floor-division}@anchor{b44}
@geindex floor division

@item floor division

Mathematical division that rounds down to nearest integer.  The floor
division operator is @code{//}.  For example, the expression @code{11 // 4}
evaluates to @code{2} in contrast to the @code{2.75} returned by float true
division.  Note that @code{(-11) // 4} is @code{-3} because that is @code{-2.75}
rounded `downward'. See 
@geindex Python Enhancement Proposals; PEP 238
PEP 238@footnote{https://peps.python.org/pep-0238/}.
@anchor{glossary term-free-threading}@anchor{1f6}
@geindex free threading

@item free threading

A threading model where multiple threads can run Python bytecode
simultaneously within the same interpreter.  This is in contrast to
the @ref{474,,global interpreter lock} which allows only one thread to
execute Python bytecode at a time.  See 
@geindex Python Enhancement Proposals; PEP 703
PEP 703@footnote{https://peps.python.org/pep-0703/}.
@anchor{glossary term-free-threaded-build}@anchor{1791}
@geindex free-threaded build

@item free-threaded build

A build of @ref{907,,CPython} that supports @ref{1f6,,free threading},
configured using the @ref{49a,,--disable-gil} option before compilation.

See @ref{2766,,Python support for free threading}.
@anchor{glossary term-free-variable}@anchor{2470}
@geindex free variable

@item free variable

Formally, as defined in the @ref{246d,,language execution model}, a free
variable is any variable used in a namespace which is not a local variable in that
namespace. See @ref{18da,,closure variable} for an example.
Pragmatically, due to the name of the @ref{238b,,codeobject.co_freevars} attribute,
the term is also sometimes used as a synonym for closure variable.
@anchor{glossary term-function}@anchor{24fe}
@geindex function

@item function

A series of statements which returns some value to a caller. It can also
be passed zero or more @ref{67b,,arguments} which may be used in
the execution of the body. See also @ref{238f,,parameter}, @ref{18ad,,method},
and the @ref{205c,,Function definitions} section.
@anchor{glossary term-function-annotation}@anchor{205d}
@geindex function annotation

@item function annotation

An @ref{15d,,annotation} of a function parameter or return value.

Function annotations are usually used for
@ref{2412,,type hints}: for example, this function is expected to take two
@ref{19c,,int} arguments and is also expected to have an @code{int}
return value:

@example
def sum_two_numbers(a: int, b: int) -> int:
   return a + b
@end example

Function annotation syntax is explained in section @ref{205c,,Function definitions}.

See @ref{f57,,variable annotation} and 
@geindex Python Enhancement Proposals; PEP 484
PEP 484@footnote{https://peps.python.org/pep-0484/},
which describe this functionality.
Also see @ref{9df,,Annotations Best Practices}
for best practices on working with annotations.
@anchor{glossary term-__future__}@anchor{fb3}
@geindex __future__

@item __future__

A @ref{45b,,future statement}, @code{from __future__ import <feature>},
directs the compiler to compile the current module using syntax or
semantics that will become standard in a future release of Python.
The @ref{0,,__future__} module documents the possible values of
`feature'.  By importing this module and evaluating its variables,
you can see when a new feature was first added to the language and
when it will (or did) become the default:

@example
>>> import __future__
>>> __future__.division
_Feature((2, 2, 0, 'alpha', 2), (3, 0, 0, 'alpha', 0), 8192)
@end example
@anchor{glossary term-garbage-collection}@anchor{1826}
@geindex garbage collection

@item garbage collection

The process of freeing memory when it is not used anymore.  Python
performs garbage collection via reference counting and a cyclic garbage
collector that is able to detect and break reference cycles.  The
garbage collector can be controlled using the @ref{64,,gc} module.

@geindex generator
@anchor{glossary term-generator}@anchor{1267}
@geindex generator

@item generator

A function which returns a @ref{ddf,,generator iterator}.  It looks like a
normal function except that it contains @ref{bc8,,yield} expressions
for producing a series of values usable in a for-loop or that can be
retrieved one at a time with the @ref{9de,,next()} function.

Usually refers to a generator function, but may refer to a
`generator iterator' in some contexts.  In cases where the intended
meaning isn’t clear, using the full terms avoids ambiguity.
@anchor{glossary term-generator-iterator}@anchor{ddf}
@geindex generator iterator

@item generator iterator

An object created by a @ref{1267,,generator} function.

Each @ref{bc8,,yield} temporarily suspends processing, remembering the
execution state (including local variables and pending
try-statements).  When the `generator iterator' resumes, it picks up where
it left off (in contrast to functions which start fresh on every
invocation).

@geindex generator expression
@anchor{glossary term-generator-expression}@anchor{5d27}
@geindex generator expression

@item generator expression

An @ref{2416,,expression} that returns an @ref{4c9,,iterator}.  It looks like a normal expression
followed by a @code{for} clause defining a loop variable, range,
and an optional @code{if} clause.  The combined expression
generates values for an enclosing function:

@example
>>> sum(i*i for i in range(10))         # sum of squares 0, 1, 4, ... 81
285
@end example
@anchor{glossary term-generic-function}@anchor{bea}
@geindex generic function

@item generic function

A function composed of multiple functions implementing the same operation
for different types. Which implementation should be used during a call is
determined by the dispatch algorithm.

See also the @ref{beb,,single dispatch} glossary entry, the
@ref{84c,,functools.singledispatch()} decorator, and 
@geindex Python Enhancement Proposals; PEP 443
PEP 443@footnote{https://peps.python.org/pep-0443/}.
@anchor{glossary term-generic-type}@anchor{1a2}
@geindex generic type

@item generic type

A @ref{1d42,,type} that can be parameterized; typically a
@ref{241b,,container class} such as @ref{24f,,list} or
@ref{184,,dict}. Used for @ref{2412,,type hints} and
@ref{15d,,annotations}.

For more details, see @ref{8c3,,generic alias types},
@geindex Python Enhancement Proposals; PEP 483
PEP 483@footnote{https://peps.python.org/pep-0483/}, 
@geindex Python Enhancement Proposals; PEP 484
PEP 484@footnote{https://peps.python.org/pep-0484/}, 
@geindex Python Enhancement Proposals; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/}, and the @ref{10b,,typing} module.
@anchor{glossary term-GIL}@anchor{165}
@geindex GIL

@item GIL

See @ref{474,,global interpreter lock}.
@anchor{glossary term-global-interpreter-lock}@anchor{474}
@geindex global interpreter lock

@item global interpreter lock

The mechanism used by the @ref{907,,CPython} interpreter to assure that
only one thread executes Python @ref{4ab,,bytecode} at a time.
This simplifies the CPython implementation by making the object model
(including critical built-in types such as @ref{184,,dict}) implicitly
safe against concurrent access.  Locking the entire interpreter
makes it easier for the interpreter to be multi-threaded, at the
expense of much of the parallelism afforded by multi-processor
machines.

However, some extension modules, either standard or third-party,
are designed so as to release the GIL when doing computationally intensive
tasks such as compression or hashing.  Also, the GIL is always released
when doing I/O.

As of Python 3.13, the GIL can be disabled using the @ref{49a,,--disable-gil}
build configuration. After building Python with this option, code must be
run with @ref{170,,-X gil=0} or after setting the 
@geindex PYTHON_GIL
@geindex environment variable; PYTHON_GIL
@ref{49b,,PYTHON_GIL=0}
environment variable. This feature enables improved performance for
multi-threaded applications and makes it easier to use multi-core CPUs
efficiently. For more details, see 
@geindex Python Enhancement Proposals; PEP 703
PEP 703@footnote{https://peps.python.org/pep-0703/}.

In prior versions of Python’s C API, a function might declare that it
requires the GIL to be held in order to use it. This refers to having an
@ref{5231,,attached thread state}.
@anchor{glossary term-global-state}@anchor{5d28}
@geindex global state

@item global state

Data that is accessible throughout a program, such as module-level
variables, class variables, or C static variables in @ref{2295,,extension modules}.  In multi-threaded programs, global state shared
between threads typically requires synchronization to avoid
@ref{276e,,race conditions} and
@ref{276f,,data races}.
@anchor{glossary term-hash-based-pyc}@anchor{5d29}
@geindex hash-based pyc

@item hash-based pyc

A bytecode cache file that uses the hash rather than the last-modified
time of the corresponding source file to determine its validity. See
@ref{803,,Cached bytecode invalidation}.
@anchor{glossary term-hashable}@anchor{825}
@geindex hashable

@item hashable

An object is `hashable' if it has a hash value which never changes during
its lifetime (it needs a @ref{cf9,,__hash__()} method), and can be
compared to other objects (it needs an @ref{cf8,,__eq__()} method).
Hashable objects which
compare equal must have the same hash value.

Hashability makes an object usable as a dictionary key and a set member,
because these data structures use the hash value internally.

Most of Python’s immutable built-in objects are hashable; mutable
containers (such as lists or dictionaries) are not; immutable
containers (such as tuples and frozensets) are only hashable if
their elements are hashable.  Objects which are
instances of user-defined classes are hashable by default.  They all
compare unequal (except with themselves), and their hash value is derived
from their @ref{162f,,id()}.
@anchor{glossary term-IDLE}@anchor{5d2a}
@geindex IDLE

@item IDLE

An Integrated Development and Learning Environment for Python.
@ref{121b,,IDLE — Python editor and shell} is a basic editor and interpreter environment
which ships with the standard distribution of Python.
@anchor{glossary term-immortal}@anchor{292}
@geindex immortal

@item immortal

`Immortal objects' are a CPython implementation detail introduced
in 
@geindex Python Enhancement Proposals; PEP 683
PEP 683@footnote{https://peps.python.org/pep-0683/}.

If an object is immortal, its @ref{5229,,reference count} is never modified,
and therefore it is never deallocated while the interpreter is running.
For example, @ref{e0d,,True} and @ref{887,,None} are immortal in CPython.

Immortal objects can be identified via @ref{291,,sys._is_immortal()}, or
via @ref{3c2,,PyUnstable_IsImmortal()} in the C API.
@anchor{glossary term-immutable}@anchor{2022}
@geindex immutable

@item immutable

An object with a fixed value.  Immutable objects include numbers, strings and
tuples.  Such an object cannot be altered.  A new object has to
be created if a different value has to be stored.  They play an important
role in places where a constant hash value is needed, for example as a key
in a dictionary.  Immutable objects are inherently @ref{5d20,,thread-safe}
because their state cannot be modified after creation, eliminating concerns
about improperly synchronized @ref{5d1b,,concurrent modification}.
@anchor{glossary term-import-path}@anchor{2491}
@geindex import path

@item import path

A list of locations (or @ref{249f,,path entries}) that are
searched by the @ref{2494,,path based finder} for modules to import. During
import, this list of locations usually comes from @ref{3e2,,sys.path}, but
for subpackages it may also come from the parent package’s @code{__path__}
attribute.
@anchor{glossary term-importing}@anchor{2484}
@geindex importing

@item importing

The process by which Python code in one module is made available to
Python code in another module.
@anchor{glossary term-importer}@anchor{2490}
@geindex importer

@item importer

An object that both finds and loads a module; both a
@ref{23ae,,finder} and @ref{1a6f,,loader} object.
@anchor{glossary term-index}@anchor{242a}
@geindex index

@item index

A numeric value that represents the position of an element in
a @ref{717,,sequence}.

In Python, indexing starts at zero.
For example, @code{things[0]} names the `first' element of @code{things};
@code{things[1]} names the second one.

In some contexts, Python allows negative indexes for counting from the
end of a sequence, and indexing using @ref{24f5,,slices}.

See also @ref{5d2b,,subscript}.
@anchor{glossary term-interactive}@anchor{1b7}
@geindex interactive

@item interactive

Python has an interactive interpreter which means you can enter
statements and expressions at the interpreter prompt, immediately
execute them and see their results.  Just launch @code{python} with no
arguments (possibly by selecting it from your computer’s main
menu). It is a very powerful way to test out new ideas or inspect
modules and packages (remember @code{help(x)}). For more on interactive
mode, see @ref{495,,Interactive Mode}.
@anchor{glossary term-interpreted}@anchor{5d2c}
@geindex interpreted

@item interpreted

Python is an interpreted language, as opposed to a compiled one,
though the distinction can be blurry because of the presence of the
bytecode compiler.  This means that source files can be run directly
without explicitly creating an executable which is then run.
Interpreted languages typically have a shorter development/debug cycle
than compiled ones, though their programs generally also run more
slowly.  See also @ref{1b7,,interactive}.
@anchor{glossary term-interpreter-shutdown}@anchor{47a}
@geindex interpreter shutdown

@item interpreter shutdown

When asked to shut down, the Python interpreter enters a special phase
where it gradually releases all allocated resources, such as modules
and various critical internal structures.  It also makes several calls
to the @ref{1826,,garbage collector}. This can trigger
the execution of code in user-defined destructors or weakref callbacks.
Code executed during the shutdown phase can encounter various
exceptions as the resources it relies on may not function anymore
(common examples are library modules or the warnings machinery).

The main reason for interpreter shutdown is that the @code{__main__} module
or the script being run has finished executing.
@anchor{glossary term-iterable}@anchor{1433}
@geindex iterable

@item iterable

An object capable of returning its members one at a time. Examples of
iterables include all sequence types (such as @ref{24f,,list}, @ref{16a,,str},
and @ref{614,,tuple}) and some non-sequence types like @ref{184,,dict},
@ref{13cf,,file objects}, and objects of any classes you define
with an @ref{e6f,,__iter__()} method or with a
@ref{588,,__getitem__()} method
that implements @ref{717,,sequence} semantics.

Iterables can be
used in a @ref{348,,for} loop and in many other places where a sequence is
needed (@ref{1a1,,zip()}, @ref{1a0,,map()}, …).  When an iterable object is passed
as an argument to the built-in function @ref{9dd,,iter()}, it returns an
iterator for the object.  This iterator is good for one pass over the set
of values.  When using iterables, it is usually not necessary to call
@code{iter()} or deal with iterator objects yourself.  The @code{for}
statement does that automatically for you, creating a temporary unnamed
variable to hold the iterator for the duration of the loop.  See also
@ref{4c9,,iterator}, @ref{717,,sequence}, and @ref{1267,,generator}.
@anchor{glossary term-iterator}@anchor{4c9}
@geindex iterator

@item iterator

An object representing a stream of data.  Repeated calls to the iterator’s
@ref{14d9,,__next__()} method (or passing it to the built-in function
@ref{9de,,next()}) return successive items in the stream.  When no more data
are available a @ref{dfb,,StopIteration} exception is raised instead.  At this
point, the iterator object is exhausted and any further calls to its
@code{__next__()} method just raise @code{StopIteration} again.  Iterators
are required to have an @ref{20f1,,__iter__()} method that returns the iterator
object itself so every iterator is also iterable and may be used in most
places where other iterables are accepted.  One notable exception is code
which attempts multiple iteration passes.  A container object (such as a
@ref{24f,,list}) produces a fresh new iterator each time you pass it to the
@ref{9dd,,iter()} function or use it in a @ref{348,,for} loop.  Attempting this
with an iterator will just return the same exhausted iterator object used
in the previous iteration pass, making it appear like an empty container.

More information can be found in @ref{261e,,Iterator Types}.

`CPython implementation detail:' CPython does not consistently apply the requirement that an iterator
define @ref{20f1,,__iter__()}.
And also please note that @ref{1f6,,free-threaded}
CPython does not guarantee @ref{5d20,,thread-safe} behavior of iterator
operations.
@anchor{glossary term-key}@anchor{242b}
@geindex key

@item key

A value that identifies an entry in a @ref{13c7,,mapping}.
See also @ref{5d2b,,subscript}.
@anchor{glossary term-key-function}@anchor{100c}
@geindex key function

@item key function

A key function or collation function is a callable that returns a value
used for sorting or ordering.  For example, @ref{180c,,locale.strxfrm()} is
used to produce a sort key that is aware of locale specific sort
conventions.

A number of tools in Python accept key functions to control how elements
are ordered or grouped.  They include @ref{1111,,min()}, @ref{1112,,max()},
@ref{dcd,,sorted()}, @ref{dce,,list.sort()}, @ref{100b,,heapq.merge()},
@ref{2a0f,,heapq.nsmallest()}, @ref{2a0e,,heapq.nlargest()}, and
@ref{17ad,,itertools.groupby()}.

There are several ways to create a key function.  For example. the
@ref{fdc,,str.casefold()} method can serve as a key function for case insensitive
sorts.  Alternatively, a key function can be built from a
@ref{14a9,,lambda} expression such as @code{lambda r: (r[0], r[2])}.  Also,
@ref{1039,,operator.attrgetter()}, @ref{c5d,,operator.itemgetter()}, and
@ref{103a,,operator.methodcaller()} are three key function constructors.  See the @ref{2625,,Sorting HOW TO} for examples of how to create and use key functions.
@anchor{glossary term-keyword-argument}@anchor{f14}
@geindex keyword argument

@item keyword argument

See @ref{67b,,argument}.
@anchor{glossary term-lambda}@anchor{2c24}
@geindex lambda

@item lambda

An anonymous inline function consisting of a single @ref{2416,,expression}
which is evaluated when the function is called.  The syntax to create
a lambda function is @code{lambda [parameters]: expression}
@anchor{glossary term-LBYL}@anchor{5d25}
@geindex LBYL

@item LBYL

Look before you leap.  This coding style explicitly tests for
pre-conditions before making calls or lookups.  This style contrasts with
the @ref{30e9,,EAFP} approach and is characterized by the presence of many
@ref{182,,if} statements.

In a multi-threaded environment, the LBYL approach can risk introducing a
@ref{276e,,race condition} between “the looking” and “the leaping”.  For example,
the code, @code{if key in mapping: return mapping[key]} can fail if another
thread removes `key' from `mapping' after the test, but before the lookup.
This issue can be solved with @ref{276d,,locks} or by using the
@ref{30e9,,EAFP} approach.  See also @ref{5d20,,thread-safe}.
@anchor{glossary term-lexical-analyzer}@anchor{22d6}
@geindex lexical analyzer

@item lexical analyzer

Formal name for the `tokenizer'; see @ref{22cc,,token}.
@anchor{glossary term-list}@anchor{5d2d}
@geindex list

@item list

A built-in Python @ref{717,,sequence}.  Despite its name it is more akin
to an array in other languages than to a linked list since access to
elements is `O'(1).
@anchor{glossary term-list-comprehension}@anchor{8df}
@geindex list comprehension

@item list comprehension

A compact way to process all or part of the elements in a sequence and
return a list with the results.  @code{result = ['@{:#04x@}'.format(x) for x in
range(256) if x % 2 == 0]} generates a list of strings containing
even hex numbers (0x..) in the range from 0 to 255. The @ref{182,,if}
clause is optional.  If omitted, all elements in @code{range(256)} are
processed.
@anchor{glossary term-lock}@anchor{276d}
@geindex lock

@item lock

A @ref{5d1e,,synchronization primitive} that allows only one thread at a
time to access a shared resource.  A thread must acquire a lock before
accessing the protected resource and release it afterward.  If a thread
attempts to acquire a lock that is already held by another thread, it
will block until the lock becomes available.  Python’s @ref{f3,,threading}
module provides @ref{1a39,,Lock} (a basic lock) and
@ref{32c,,RLock} (a @ref{5d22,,reentrant} lock).  Locks are used
to prevent @ref{276e,,race conditions} and ensure
@ref{5d20,,thread-safe} access to shared data.  Alternative design patterns
to locks exist such as queues, producer/consumer patterns, and
thread-local state. See also @ref{5d21,,deadlock}, and reentrant.
@anchor{glossary term-lock-free}@anchor{277b}
@geindex lock-free

@item lock-free

An operation that does not acquire any @ref{276d,,lock} and uses atomic CPU
instructions to ensure correctness. Lock-free operations can execute
concurrently without blocking each other and cannot be blocked by
operations that hold locks. In @ref{1f6,,free-threaded}
Python, built-in types like @ref{184,,dict} and @ref{24f,,list} provide
lock-free read operations, which means other threads may observe
intermediate states during multi-step modifications even when those
modifications hold the @ref{2774,,per-object lock}.
@anchor{glossary term-loader}@anchor{1a6f}
@geindex loader

@item loader

An object that loads a module.
It must define the @code{exec_module()} and @code{create_module()} methods
to implement the @ref{10cd,,Loader} interface.
A loader is typically returned by a @ref{23ae,,finder}.
See also:


@itemize *

@item 
@ref{248e,,Finders and loaders}

@item 
@ref{10cd,,importlib.abc.Loader}

@item 
@geindex Python Enhancement Proposals; PEP 302
PEP 302@footnote{https://peps.python.org/pep-0302/}
@end itemize
@anchor{glossary term-locale-encoding}@anchor{54b}
@geindex locale encoding

@item locale encoding

On Unix, it is the encoding of the LC_CTYPE locale. It can be set with
@ref{931,,locale.setlocale(locale.LC_CTYPE@comma{} new_locale)}.

On Windows, it is the ANSI code page (ex: @code{"cp1252"}).

On Android and VxWorks, Python uses @code{"utf-8"} as the locale encoding.

@ref{867,,locale.getencoding()} can be used to get the locale encoding.

See also the @ref{75e,,filesystem encoding and error handler}.
@anchor{glossary term-magic-method}@anchor{49c7}
@geindex magic method

@item magic method

@geindex magic; method

An informal synonym for @ref{1ca3,,special method}.
@anchor{glossary term-mapping}@anchor{13c7}
@geindex mapping

@item mapping

A container object that supports arbitrary key lookups and implements the
methods specified in the @ref{acd,,collections.abc.Mapping} or
@ref{12b8,,collections.abc.MutableMapping}
@ref{a7e,,abstract base classes}.  Examples
include @ref{184,,dict}, @ref{13c8,,collections.defaultdict},
@ref{7f4,,collections.OrderedDict} and @ref{129d,,collections.Counter}.
@anchor{glossary term-meta-path-finder}@anchor{1276}
@geindex meta path finder

@item meta path finder

A @ref{23ae,,finder} returned by a search of @ref{f2d,,sys.meta_path}.  Meta path
finders are related to, but different from @ref{1277,,path entry finders}.

See @ref{a74,,importlib.abc.MetaPathFinder} for the methods that meta path
finders implement.
@anchor{glossary term-metaclass}@anchor{2417}
@geindex metaclass

@item metaclass

The class of a class.  Class definitions create a class name, a class
dictionary, and a list of base classes.  The metaclass is responsible for
taking those three arguments and creating the class.  Most object oriented
programming languages provide a default implementation.  What makes Python
special is that it is possible to create custom metaclasses.  Most users
never need this tool, but when the need arises, metaclasses can provide
powerful, elegant solutions.  They have been used for logging attribute
access, adding thread-safety, tracking object creation, implementing
singletons, and many other tasks.

More information can be found in @ref{2405,,Metaclasses}.
@anchor{glossary term-method}@anchor{18ad}
@geindex method

@item method

A function which is defined inside a class body.  If called as an attribute
of an instance of that class, the method will get the instance object as
its first @ref{67b,,argument} (which is usually called @code{self}).
See @ref{24fe,,function} and @ref{23d4,,nested scope}.
@anchor{glossary term-method-resolution-order}@anchor{2627}
@geindex method resolution order

@item method resolution order

Method Resolution Order is the order in which base classes are searched
for a member during lookup. See @ref{16b6,,The Python 2.3 Method Resolution Order} for details of the
algorithm used by the Python interpreter since the 2.3 release.
@anchor{glossary term-module}@anchor{1a22}
@geindex module

@item module

An object that serves as an organizational unit of Python code.  Modules
have a namespace containing arbitrary Python objects.  Modules are loaded
into Python by the process of @ref{2484,,importing}.

See also @ref{235,,package}.
@anchor{glossary term-module-spec}@anchor{23a7}
@geindex module spec

@item module spec

A namespace containing the import-related information used to load a
module. An instance of @ref{22b0,,importlib.machinery.ModuleSpec}.

See also @ref{23aa,,Module specs}.
@anchor{glossary term-MRO}@anchor{1923}
@geindex MRO

@item MRO

See @ref{2627,,method resolution order}.
@anchor{glossary term-mutable}@anchor{2027}
@geindex mutable

@item mutable

An @ref{5d2e,,object} with state that is allowed to change during the course
of the program.  In multi-threaded programs, mutable objects that are
shared between threads require careful synchronization to avoid
@ref{276e,,race conditions}.  See also @ref{2022,,immutable},
@ref{5d20,,thread-safe}, and @ref{5d1b,,concurrent modification}.
@anchor{glossary term-named-tuple}@anchor{85f}
@geindex named tuple

@item named tuple

The term “named tuple” applies to any type or class that inherits from
tuple and whose indexable elements are also accessible using named
attributes.  The type or class may have other features as well.

Several built-in types are named tuples, including the values returned
by @ref{1705,,time.localtime()} and @ref{26f,,os.stat()}.  Another example is
@ref{1e11,,sys.float_info}:

@example
>>> sys.float_info[1]                   # indexed access
1024
>>> sys.float_info.max_exp              # named field access
1024
>>> isinstance(sys.float_info, tuple)   # kind of tuple
True
@end example

Some named tuples are built-in types (such as the above examples).
Alternatively, a named tuple can be created from a regular class
definition that inherits from @ref{614,,tuple} and that defines named
fields.  Such a class can be written by hand, or it can be created by
inheriting @ref{32f,,typing.NamedTuple}, or with the factory function
@ref{4e1,,collections.namedtuple()}.  The latter techniques also add some
extra methods that may not be found in hand-written or built-in named
tuples.
@anchor{glossary term-namespace}@anchor{2083}
@geindex namespace

@item namespace

The place where a variable is stored.  Namespaces are implemented as
dictionaries.  There are the local, global and built-in namespaces as well
as nested namespaces in objects (in methods).  Namespaces support
modularity by preventing naming conflicts.  For instance, the functions
@ref{318,,builtins.open} and @ref{f98,,os.open()} are distinguished by
their namespaces.  Namespaces also aid readability and maintainability by
making it clear which module implements a function.  For instance, writing
@ref{147f,,random.seed()} or @ref{d49,,itertools.islice()} makes it clear that those
functions are implemented by the @ref{bd,,random} and @ref{85,,itertools}
modules, respectively.
@anchor{glossary term-namespace-package}@anchor{2b4}
@geindex namespace package

@item namespace package

A @ref{235,,package} which serves only as a container for subpackages.
Namespace packages may have no physical representation,
and specifically are not like a @ref{2488,,regular package} because they
have no @code{__init__.py} file.

Namespace packages allow several individually installable packages to have a common parent package.
Otherwise, it is recommended to use a @ref{2488,,regular package}.

For more information, see 
@geindex Python Enhancement Proposals; PEP 420
PEP 420@footnote{https://peps.python.org/pep-0420/} and @ref{2489,,Namespace packages}.

See also @ref{1a22,,module}.
@anchor{glossary term-native-code}@anchor{5d1f}
@geindex native code

@item native code

Code that is compiled to machine instructions and runs directly on the
processor, as opposed to code that is interpreted or runs in a virtual
machine.  In the context of Python, native code typically refers to
C, C++, Rust or Fortran code in @ref{2295,,extension modules}
that can be called from Python.  See also extension module.
@anchor{glossary term-nested-scope}@anchor{23d4}
@geindex nested scope

@item nested scope

The ability to refer to a variable in an enclosing definition.  For
instance, a function defined inside another function can refer to
variables in the outer function.  Note that nested scopes by default work
only for reference and not for assignment.  Local variables both read and
write in the innermost scope.  Likewise, global variables read and write
to the global namespace.  The @ref{14b3,,nonlocal} allows writing to outer
scopes.
@anchor{glossary term-new-style-class}@anchor{2d7b}
@geindex new-style class

@item new-style class

Old name for the flavor of classes now used for all class objects.  In
earlier Python versions, only new-style classes could use Python’s newer,
versatile features like @ref{16f7,,__slots__}, descriptors,
properties, @ref{dd1,,__getattribute__()}, class methods, and static
methods.
@anchor{glossary term-non-deterministic}@anchor{5d1d}
@geindex non-deterministic

@item non-deterministic

Behavior where the outcome of a program can vary between executions with
the same inputs.  In multi-threaded programs, non-deterministic behavior
often results from @ref{276e,,race conditions} where the
relative timing or interleaving of threads affects the result.
Proper synchronization using @ref{276d,,locks} and other
@ref{5d1e,,synchronization primitives} helps
ensure deterministic behavior.
@anchor{glossary term-object}@anchor{5d2e}
@geindex object

@item object

Any data with state (attributes or value) and defined behavior
(methods).  Also the ultimate base class of any @ref{2d7b,,new-style class}.
@anchor{glossary term-optimized-scope}@anchor{4a2}
@geindex optimized scope

@item optimized scope

A scope where target local variable names are reliably known to the
compiler when the code is compiled, allowing optimization of read and
write access to these names. The local namespaces for functions,
generators, coroutines, comprehensions, and generator expressions are
optimized in this fashion. Note: most interpreter optimizations are
applied to all scopes, only those relying on a known set of local
and nonlocal variable names are restricted to optimized scopes.
@anchor{glossary term-optional-module}@anchor{219c}
@geindex optional module

@item optional module

An @ref{2295,,extension module} that is part of the @ref{5d2f,,standard library},
but may be absent in some builds of @ref{907,,CPython},
usually due to missing third-party libraries or because the module
is not available for a given platform.

See @ref{219a,,Requirements for optional modules} for a list of optional modules
that require third-party libraries.
@anchor{glossary term-package}@anchor{235}
@geindex package

@item package

A Python @ref{1a22,,module} which can contain submodules or recursively,
subpackages.  Technically, a package is a Python module with a
@code{__path__} attribute.

See also @ref{2488,,regular package} and @ref{2b4,,namespace package}.
@anchor{glossary term-parallelism}@anchor{5d1a}
@geindex parallelism

@item parallelism

Executing multiple operations at the same time (e.g. on multiple CPU
cores).  In Python builds with the
@ref{474,,global interpreter lock (GIL)}, only one
thread runs Python bytecode at a time, so taking advantage of multiple
CPU cores typically involves multiple processes
(e.g. @ref{98,,multiprocessing}) or native extensions that release the GIL.
In @ref{1f6,,free-threaded} Python, multiple Python threads
can run Python code simultaneously on different cores.
@anchor{glossary term-parameter}@anchor{238f}
@geindex parameter

@item parameter

A named entity in a @ref{24fe,,function} (or method) definition that
specifies an @ref{67b,,argument} (or in some cases, arguments) that the
function can accept.  There are five kinds of parameter:


@itemize *

@item 
`positional-or-keyword': specifies an argument that can be passed
either @ref{67b,,positionally} or as a keyword argument.  This is the default kind of parameter, for example `foo'
and `bar' in the following:

@example
def func(foo, bar=None): ...
@end example
@end itemize
@anchor{glossary positional-only-parameter}@anchor{c7e}

@itemize *

@item 
`positional-only': specifies an argument that can be supplied only
by position. Positional-only parameters can be defined by including a
@code{/} character in the parameter list of the function definition after
them, for example `posonly1' and `posonly2' in the following:

@example
def func(posonly1, posonly2, /, positional_or_keyword): ...
@end example
@end itemize
@anchor{glossary keyword-only-parameter}@anchor{5a5}

@itemize *

@item 
`keyword-only': specifies an argument that can be supplied only
by keyword.  Keyword-only parameters can be defined by including a
single var-positional parameter or bare @code{*} in the parameter list
of the function definition before them, for example `kw_only1' and
`kw_only2' in the following:

@example
def func(arg, *, kw_only1, kw_only2): ...
@end example

@item 
`var-positional': specifies that an arbitrary sequence of
positional arguments can be provided (in addition to any positional
arguments already accepted by other parameters).  Such a parameter can
be defined by prepending the parameter name with @code{*}, for example
`args' in the following:

@example
def func(*args, **kwargs): ...
@end example

@item 
`var-keyword': specifies that arbitrarily many keyword arguments
can be provided (in addition to any keyword arguments already accepted
by other parameters).  Such a parameter can be defined by prepending
the parameter name with @code{**}, for example `kwargs' in the example
above.
@end itemize

Parameters can specify both optional and required arguments, as well as
default values for some optional arguments.

See also the @ref{67b,,argument} glossary entry, the FAQ question on
@ref{5c4f,,the difference between arguments and parameters}, the @ref{4e5,,inspect.Parameter} class, the
@ref{205c,,Function definitions} section, and 
@geindex Python Enhancement Proposals; PEP 362
PEP 362@footnote{https://peps.python.org/pep-0362/}.
@anchor{glossary term-per-object-lock}@anchor{2774}
@geindex per-object lock

@item per-object lock

A @ref{276d,,lock} associated with an individual object instance rather than
a global lock shared across all objects. In @ref{1f6,,free-threaded} Python, built-in types like @ref{184,,dict} and
@ref{24f,,list} use per-object locks to allow concurrent operations on
different objects while serializing operations on the same object.
Operations that hold the per-object lock prevent other locking operations
on the same object from proceeding, but do not block @ref{277b,,lock-free}
operations.
@anchor{glossary term-path-entry}@anchor{249f}
@geindex path entry

@item path entry

A single location on the @ref{2491,,import path} which the @ref{2494,,path based finder} consults to find modules for importing.
@anchor{glossary term-path-entry-finder}@anchor{1277}
@geindex path entry finder

@item path entry finder

A @ref{23ae,,finder} returned by a callable on @ref{122a,,sys.path_hooks}
(i.e. a @ref{24a1,,path entry hook}) which knows how to locate modules given
a @ref{249f,,path entry}.

See @ref{a75,,importlib.abc.PathEntryFinder} for the methods that path entry
finders implement.
@anchor{glossary term-path-entry-hook}@anchor{24a1}
@geindex path entry hook

@item path entry hook

A callable on the @ref{122a,,sys.path_hooks} list which returns a @ref{1277,,path entry finder} if it knows how to find modules on a specific @ref{249f,,path entry}.
@anchor{glossary term-path-based-finder}@anchor{2494}
@geindex path based finder

@item path based finder

One of the default @ref{1276,,meta path finders} which
searches an @ref{2491,,import path} for modules.
@anchor{glossary term-path-like-object}@anchor{5a1}
@geindex path-like object

@item path-like object

An object representing a file system path. A path-like object is either
a @ref{16a,,str} or @ref{193,,bytes} object representing a path, or an object
implementing the @ref{e51,,os.PathLike} protocol. An object that supports
the @code{os.PathLike} protocol can be converted to a @code{str} or
@code{bytes} file system path by calling the @ref{e53,,os.fspath()} function;
@ref{e54,,os.fsdecode()} and @ref{e55,,os.fsencode()} can be used to guarantee a
@code{str} or @code{bytes} result instead, respectively. Introduced
by 
@geindex Python Enhancement Proposals; PEP 519
PEP 519@footnote{https://peps.python.org/pep-0519/}.
@anchor{glossary term-PEP}@anchor{5d30}
@geindex PEP

@item PEP

Python Enhancement Proposal. A PEP is a design document
providing information to the Python community, or describing a new
feature for Python or its processes or environment. PEPs should
provide a concise technical specification and a rationale for proposed
features.

PEPs are intended to be the primary mechanisms for proposing major new
features, for collecting community input on an issue, and for documenting
the design decisions that have gone into Python. The PEP author is
responsible for building consensus within the community and documenting
dissenting opinions.

See 
@geindex Python Enhancement Proposals; PEP 1
PEP 1@footnote{https://peps.python.org/pep-0001/}.
@anchor{glossary term-portion}@anchor{248b}
@geindex portion

@item portion

A set of files in a single directory (possibly stored in a zip file)
that contribute to a namespace package, as defined in 
@geindex Python Enhancement Proposals; PEP 420
PEP 420@footnote{https://peps.python.org/pep-0420/}.
@anchor{glossary term-positional-argument}@anchor{f15}
@geindex positional argument

@item positional argument

See @ref{67b,,argument}.
@anchor{glossary term-provisional-API}@anchor{3cf}
@geindex provisional API

@item provisional API

A provisional API is one which has been deliberately excluded from
the standard library’s backwards compatibility guarantees.  While major
changes to such interfaces are not expected, as long as they are marked
provisional, backwards incompatible changes (up to and including removal
of the interface) may occur if deemed necessary by core developers.  Such
changes will not be made gratuitously – they will occur only if serious
fundamental flaws are uncovered that were missed prior to the inclusion
of the API.

Even for provisional APIs, backwards incompatible changes are seen as
a “solution of last resort” - every attempt will still be made to find
a backwards compatible resolution to any identified problems.

This process allows the standard library to continue to evolve over
time, without locking in problematic design errors for extended periods
of time.  See 
@geindex Python Enhancement Proposals; PEP 411
PEP 411@footnote{https://peps.python.org/pep-0411/} for more details.
@anchor{glossary term-provisional-package}@anchor{1248}
@geindex provisional package

@item provisional package

See @ref{3cf,,provisional API}.
@anchor{glossary term-Python-3000}@anchor{5d31}
@geindex Python 3000

@item Python 3000

Nickname for the Python 3.x release line (coined long ago when the
release of version 3 was something in the distant future.)  This is also
abbreviated “Py3k”.
@anchor{glossary term-Pythonic}@anchor{5d32}
@geindex Pythonic

@item Pythonic

An idea or piece of code which closely follows the most common idioms
of the Python language, rather than implementing code using concepts
common to other languages.  For example, a common idiom in Python is
to loop over all elements of an iterable using a @ref{348,,for}
statement.  Many other languages don’t have this type of construct, so
people unfamiliar with Python sometimes use a numerical counter instead:

@example
for i in range(len(food)):
    print(food[i])
@end example

As opposed to the cleaner, Pythonic method:

@example
for piece in food:
    print(piece)
@end example
@anchor{glossary term-qualified-name}@anchor{1d68}
@geindex qualified name

@item qualified name

A dotted name showing the “path” from a module’s global scope to a
class, function or method defined in that module, as defined in
@geindex Python Enhancement Proposals; PEP 3155
PEP 3155@footnote{https://peps.python.org/pep-3155/}.  For top-level functions and classes, the qualified name
is the same as the object’s name:

@example
>>> class C:
...     class D:
...         def meth(self):
...             pass
...
>>> C.__qualname__
'C'
>>> C.D.__qualname__
'C.D'
>>> C.D.meth.__qualname__
'C.D.meth'
@end example

When used to refer to modules, the `fully qualified name' means the
entire dotted path to the module, including any parent packages,
e.g. @code{email.mime.text}:

@example
>>> import email.mime.text
>>> email.mime.text.__name__
'email.mime.text'
@end example
@anchor{glossary term-race-condition}@anchor{276e}
@geindex race condition

@item race condition

A condition of a program where the behavior
depends on the relative timing or ordering of events, particularly in
multi-threaded programs.  Race conditions can lead to
@ref{5d1d,,non-deterministic} behavior and bugs that are difficult to
reproduce.  A @ref{276f,,data race} is a specific type of race condition
involving unsynchronized access to shared memory.  The @ref{5d25,,LBYL}
coding style is particularly susceptible to race conditions in
multi-threaded code.  Using @ref{276d,,locks} and other
@ref{5d1e,,synchronization primitives}
helps prevent race conditions.
@anchor{glossary term-reference-count}@anchor{5229}
@geindex reference count

@item reference count

The number of references to an object.  When the reference count of an
object drops to zero, it is deallocated.  Some objects are
@ref{292,,immortal} and have reference counts that are never modified, and
therefore the objects are never deallocated.  Reference counting is
generally not visible to Python code, but it is a key element of the
@ref{907,,CPython} implementation.  Programmers can call the
@ref{2d0,,sys.getrefcount()} function to return the
reference count for a particular object.

In @ref{907,,CPython}, reference counts are not considered to be stable
or well-defined values; the number of references to an object, and how
that number is affected by Python code, may be different between
versions.
@anchor{glossary term-regular-package}@anchor{2488}
@geindex regular package

@item regular package

A traditional @ref{235,,package}, such as a directory containing an
@code{__init__.py} file.

See also @ref{2b4,,namespace package}.
@anchor{glossary term-reentrant}@anchor{5d22}
@geindex reentrant

@item reentrant

A property of a function or @ref{276d,,lock} that allows it to be called or
acquired multiple times by the same thread without causing errors or a
@ref{5d21,,deadlock}.

For functions, reentrancy means the function can be safely called again
before a previous invocation has completed, which is important when
functions may be called recursively or from signal handlers. Thread-unsafe
functions may be @ref{5d1d,,non-deterministic} if they’re called reentrantly in a
multithreaded program.

For locks, Python’s @ref{32c,,threading.RLock} (reentrant lock) is
reentrant, meaning a thread that already holds the lock can acquire it
again without blocking.  In contrast, @ref{1a39,,threading.Lock} is not
reentrant - attempting to acquire it twice from the same thread will cause
a deadlock.

See also @ref{276d,,lock} and @ref{5d21,,deadlock}.
@anchor{glossary term-REPL}@anchor{492}
@geindex REPL

@item REPL

An acronym for the “read–eval–print loop”, another name for the
@ref{1b7,,interactive} interpreter shell.
@anchor{glossary term-__slots__}@anchor{7f8}
@geindex __slots__

@item __slots__

A declaration inside a class that saves memory by pre-declaring space for
instance attributes and eliminating instance dictionaries.  Though
popular, the technique is somewhat tricky to get right and is best
reserved for rare cases where there are large numbers of instances in a
memory-critical application.
@anchor{glossary term-sequence}@anchor{717}
@geindex sequence

@item sequence

An @ref{1433,,iterable} which supports efficient element access using integer
indices via the @ref{588,,__getitem__()} special method and defines a
@ref{17e1,,__len__()} method that returns the length of the sequence.
Some built-in sequence types are @ref{24f,,list}, @ref{16a,,str},
@ref{614,,tuple}, and @ref{193,,bytes}. Note that @ref{184,,dict} also
supports @code{__getitem__()} and @code{__len__()}, but is considered a
mapping rather than a sequence because the lookups use arbitrary
@ref{825,,hashable} keys rather than integers.

The @ref{13d0,,collections.abc.Sequence} abstract base class
defines a much richer interface that goes beyond just
@ref{588,,__getitem__()} and @ref{17e1,,__len__()}, adding
@ref{241f,,count()}, @ref{19bd,,index()},
@ref{15c5,,__contains__()}, and @ref{e8c,,__reversed__()}.
Types that implement this expanded
interface can be registered explicitly using
@ref{1294,,register()}. For more documentation on sequence
methods generally, see
@ref{264f,,Common Sequence Operations}.
@anchor{glossary term-set-comprehension}@anchor{5d33}
@geindex set comprehension

@item set comprehension

A compact way to process all or part of the elements in an iterable and
return a set with the results. @code{results = @{c for c in 'abracadabra' if
c not in 'abc'@}} generates the set of strings @code{@{'r', 'd'@}}.  See
@ref{7ed,,Displays for lists@comma{} sets and dictionaries}.
@anchor{glossary term-single-dispatch}@anchor{beb}
@geindex single dispatch

@item single dispatch

A form of @ref{bea,,generic function} dispatch where the implementation is
chosen based on the type of a single argument.
@anchor{glossary term-slice}@anchor{24f5}
@geindex slice

@item slice

An object of type @ref{695,,slice}, used to describe a portion of
a @ref{717,,sequence}.
A slice object is created when using the @ref{24f4,,slicing} form
of @ref{2415,,subscript notation}, with colons inside square
brackets, such as in @code{variable_name[1:3:5]}.
@anchor{glossary term-soft-deprecated}@anchor{23f}
@geindex soft deprecated

@item soft deprecated

A soft deprecated API should not be used in new code,
but it is safe for already existing code to use it.
The API remains documented and tested, but will not be enhanced further.

Soft deprecation, unlike normal deprecation, does not plan on removing the API
and will not emit warnings.

See PEP 387: Soft Deprecation@footnote{https://peps.python.org/pep-0387/#soft-deprecation}.
@anchor{glossary term-special-method}@anchor{1ca3}
@geindex special method

@item special method

@geindex special; method

A method that is called implicitly by Python to execute a certain
operation on a type, such as addition.  Such methods have names starting
and ending with double underscores.  Special methods are documented in
@ref{e6e,,Special method names}.
@anchor{glossary term-standard-library}@anchor{5d2f}
@geindex standard library

@item standard library

The collection of @ref{235,,packages}, @ref{1a22,,modules}
and @ref{2295,,extension modules} distributed as a part
of the official Python interpreter package.  The exact membership of the
collection may vary based on platform, available system libraries, or
other criteria.  Documentation can be found at @ref{14a,,The Python Standard Library}.

See also @ref{a48,,sys.stdlib_module_names} for a list of all possible
standard library module names.
@anchor{glossary term-statement}@anchor{2c6d}
@geindex statement

@item statement

A statement is part of a suite (a “block” of code).  A statement is either
an @ref{2416,,expression} or one of several constructs with a keyword, such
as @ref{182,,if}, @ref{19b7,,while} or @ref{348,,for}.
@anchor{glossary term-static-type-checker}@anchor{574}
@geindex static type checker

@item static type checker

An external tool that reads Python code and analyzes it, looking for
issues such as incorrect types. See also @ref{2412,,type hints}
and the @ref{10b,,typing} module.
@anchor{glossary term-stdlib}@anchor{17d8}
@geindex stdlib

@item stdlib

An abbreviation of @ref{5d2f,,standard library}.
@anchor{glossary term-strong-reference}@anchor{5e2}
@geindex strong reference

@item strong reference

In Python’s C API, a strong reference is a reference to an object
which is owned by the code holding the reference.  The strong
reference is taken by calling @ref{790,,Py_INCREF()} when the
reference is created and released with @ref{791,,Py_DECREF()}
when the reference is deleted.

The @ref{aa0,,Py_NewRef()} function can be used to create a strong reference
to an object. Usually, the @ref{791,,Py_DECREF()} function must be called on
the strong reference before exiting the scope of the strong reference, to
avoid leaking one reference.

See also @ref{3d5,,borrowed reference}.
@anchor{glossary term-subscript}@anchor{5d2b}
@geindex subscript

@item subscript

The expression in square brackets of a
@ref{2415,,subscription expression}, for example,
the @code{3} in @code{items[3]}.
Usually used to select an element of a container.
Also called a @ref{242b,,key} when subscripting a @ref{13c7,,mapping},
or an @ref{242a,,index} when subscripting a @ref{717,,sequence}.
@anchor{glossary term-synchronization-primitive}@anchor{5d1e}
@geindex synchronization primitive

@item synchronization primitive

A basic building block for coordinating (synchronizing) the execution of
multiple threads to ensure @ref{5d20,,thread-safe} access to shared resources.
Python’s @ref{f3,,threading} module provides several synchronization primitives
including @ref{1a39,,Lock}, @ref{32c,,RLock},
@ref{1362,,Semaphore}, @ref{1361,,Condition},
@ref{1364,,Event}, and @ref{13ef,,Barrier}.  Additionally,
the @ref{bb,,queue} module provides multi-producer, multi-consumer queues
that are especially useful in multithreaded programs. These
primitives help prevent @ref{276e,,race conditions} and
coordinate thread execution.  See also @ref{276d,,lock}.
@anchor{glossary term-t-string}@anchor{5d34}
@geindex t-string

@item t-string@anchor{glossary term-t-strings}@anchor{5d35}
@geindex t-strings

@itemx t-strings

String literals prefixed with @code{t} or @code{T} are commonly called
“t-strings” which is short for
@ref{1844,,template string literals}.
@anchor{glossary term-text-encoding}@anchor{2622}
@geindex text encoding

@item text encoding

A string in Python is a sequence of Unicode code points (in range
@code{U+0000}–@code{U+10FFFF}). To store or transfer a string, it needs to be
serialized as a sequence of bytes.

Serializing a string into a sequence of bytes is known as “encoding”, and
recreating the string from the sequence of bytes is known as “decoding”.

There are a variety of different text serialization
@ref{fbe,,codecs}, which are collectively referred to as
“text encodings”.
@anchor{glossary term-text-file}@anchor{20b1}
@geindex text file

@item text file

A @ref{13cf,,file object} able to read and write @ref{16a,,str} objects.
Often, a text file actually accesses a byte-oriented datastream
and handles the @ref{2622,,text encoding} automatically.
Examples of text files are files opened in text mode (@code{'r'} or @code{'w'}),
@ref{760,,sys.stdin}, @ref{cd3,,sys.stdout}, and instances of
@ref{112f,,io.StringIO}.

See also @ref{20b2,,binary file} for a file object able to read and write
@ref{194,,bytes-like objects}.
@anchor{glossary term-thread-state}@anchor{188f}
@geindex thread state

@item thread state

The information used by the @ref{907,,CPython} runtime to run in an OS thread.
For example, this includes the current exception, if any, and the
state of the bytecode interpreter.

Each thread state is bound to a single OS thread, but threads may have
many thread states available.  At most, one of them may be
@ref{5231,,attached} at once.

An @ref{5231,,attached thread state} is required to call most
of Python’s C API, unless a function explicitly documents otherwise.
The bytecode interpreter only runs under an attached thread state.

Each thread state belongs to a single interpreter, but each interpreter
may have many thread states, including multiple for the same OS thread.
Thread states from multiple interpreters may be bound to the same
thread, but only one can be @ref{5231,,attached} in
that thread at any given moment.

See @ref{587d,,Thread State and the Global Interpreter Lock} for more
information.
@anchor{glossary term-thread-safe}@anchor{5d20}
@geindex thread-safe

@item thread-safe

A module, function, or class that behaves correctly when used by multiple
threads concurrently.  Thread-safe code uses appropriate
@ref{5d1e,,synchronization primitives} like
@ref{276d,,locks} to protect shared mutable state, or is designed
to avoid shared mutable state entirely.  In the
@ref{1f6,,free-threaded} build, built-in types like
@ref{184,,dict}, @ref{24f,,list}, and @ref{185,,set} use internal locking
to make many operations thread-safe, although thread safety is not
necessarily guaranteed.  Code that is not thread-safe may experience
@ref{276e,,race conditions} and @ref{276f,,data races}
when used in multi-threaded programs.
@anchor{glossary term-token}@anchor{22cc}
@geindex token

@item token

A small unit of source code, generated by the
@ref{22d9,,lexical analyzer} (also called the `tokenizer').
Names, numbers, strings, operators,
newlines and similar are represented by tokens.

The @ref{102,,tokenize} module exposes Python’s lexical analyzer.
The @ref{101,,token} module contains information on the various types
of tokens.
@anchor{glossary term-triple-quoted-string}@anchor{5d36}
@geindex triple-quoted string

@item triple-quoted string

A string which is bound by three instances of either a quotation mark
(”) or an apostrophe (‘).  While they don’t provide any functionality
not available with single-quoted strings, they are useful for a number
of reasons.  They allow you to include unescaped single and double
quotes within a string and they can span multiple lines without the
use of the continuation character, making them especially useful when
writing docstrings.
@anchor{glossary term-type}@anchor{1d42}
@geindex type

@item type

The type of a Python object determines what kind of object it is; every
object has a type.  An object’s type is accessible as its
@ref{16b9,,__class__} attribute or can be retrieved with
@code{type(obj)}.
@anchor{glossary term-type-alias}@anchor{66e}
@geindex type alias

@item type alias

A synonym for a type, created by assigning the type to an identifier.

Type aliases are useful for simplifying @ref{2412,,type hints}.
For example:

@example
def remove_gray_shades(
        colors: list[tuple[int, int, int]]) -> list[tuple[int, int, int]]:
    pass
@end example

could be made more readable like this:

@example
Color = tuple[int, int, int]

def remove_gray_shades(colors: list[Color]) -> list[Color]:
    pass
@end example

See @ref{10b,,typing} and 
@geindex Python Enhancement Proposals; PEP 484
PEP 484@footnote{https://peps.python.org/pep-0484/}, which describe this functionality.
@anchor{glossary term-type-hint}@anchor{2412}
@geindex type hint

@item type hint

An @ref{15d,,annotation} that specifies the expected type for a variable, a class
attribute, or a function parameter or return value.

Type hints are optional and are not enforced by Python but
they are useful to @ref{574,,static type checkers}.
They can also aid IDEs with code completion and refactoring.

Type hints of global variables, class attributes, and functions,
but not local variables, can be accessed using
@ref{8c2,,typing.get_type_hints()}.

See @ref{10b,,typing} and 
@geindex Python Enhancement Proposals; PEP 484
PEP 484@footnote{https://peps.python.org/pep-0484/}, which describe this functionality.
@anchor{glossary term-universal-newlines}@anchor{f3b}
@geindex universal newlines

@item universal newlines

A manner of interpreting text streams in which all of the following are
recognized as ending a line: the Unix end-of-line convention @code{'\n'},
the Windows convention @code{'\r\n'}, and the old Macintosh convention
@code{'\r'}.  See 
@geindex Python Enhancement Proposals; PEP 278
PEP 278@footnote{https://peps.python.org/pep-0278/} and 
@geindex Python Enhancement Proposals; PEP 3116
PEP 3116@footnote{https://peps.python.org/pep-3116/}, as well as
@ref{266b,,bytes.splitlines()} for an additional use.
@anchor{glossary term-variable-annotation}@anchor{f57}
@geindex variable annotation

@item variable annotation

An @ref{15d,,annotation} of a variable or a class attribute.

When annotating a variable or a class attribute, assignment is optional:

@example
class C:
    field: 'annotation'
@end example

Variable annotations are usually used for
@ref{2412,,type hints}: for example this variable is expected to take
@ref{19c,,int} values:

@example
count: int = 0
@end example

Variable annotation syntax is explained in section @ref{2552,,Annotated assignment statements}.

See @ref{205d,,function annotation}, 
@geindex Python Enhancement Proposals; PEP 484
PEP 484@footnote{https://peps.python.org/pep-0484/}
and 
@geindex Python Enhancement Proposals; PEP 526
PEP 526@footnote{https://peps.python.org/pep-0526/}, which describe this functionality.
Also see @ref{9df,,Annotations Best Practices}
for best practices on working with annotations.
@anchor{glossary term-virtual-environment}@anchor{2131}
@geindex virtual environment

@item virtual environment

A cooperatively isolated runtime environment that allows Python users
and applications to install and upgrade Python distribution packages
without interfering with the behaviour of other Python applications
running on the same system.

See also @ref{118,,venv}.
@anchor{glossary term-virtual-machine}@anchor{3ae0}
@geindex virtual machine

@item virtual machine

A computer defined entirely in software.  Python’s virtual machine
executes the @ref{4ab,,bytecode} emitted by the bytecode compiler.
@anchor{glossary term-walrus-operator}@anchor{5d37}
@geindex walrus operator

@item walrus operator

A light-hearted way to refer to the @ref{2524,,assignment expression} operator @code{:=} because it looks a bit like a
walrus if you turn your head.
@anchor{glossary term-Zen-of-Python}@anchor{5d38}
@geindex Zen of Python

@item Zen of Python

Listing of Python design principles and philosophies that are helpful in
understanding and using the language.  The listing can be found by typing
“@code{import this}” at the interactive prompt.
@end table

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node About this documentation,Dealing with Bugs,Glossary,Top
@anchor{about doc}@anchor{5d39}@anchor{about about-this-documentation}@anchor{5d3a}@anchor{about translation-repo}@anchor{5d3b}
@chapter About this documentation


Python’s documentation is generated from reStructuredText@footnote{https://docutils.sourceforge.io/rst.html} sources
using Sphinx@footnote{https://www.sphinx-doc.org/}, a documentation generator originally created for Python
and now maintained as an independent project.

@c In the online version of these documents, you can submit comments and suggest
@c changes directly on the documentation pages.

Development of the documentation and its toolchain is an entirely volunteer
effort, just like Python itself.  If you want to contribute, please take a
look at the @ref{5279,,Dealing with Bugs} page for information on how to do so.  New
volunteers are always welcome!

Many thanks go to:


@itemize *

@item 
Fred L. Drake, Jr., the creator of the original Python documentation toolset
and author of much of the content;

@item 
the Docutils@footnote{https://docutils.sourceforge.io/} project for creating
reStructuredText and the Docutils suite;

@item 
Fredrik Lundh for his Alternative Python Reference project from which Sphinx
got many good ideas.
@end itemize

@menu
* Contributors to the Python documentation:: 

@end menu

@node Contributors to the Python documentation,,,About this documentation
@anchor{about contributors-to-the-python-documentation}@anchor{5d3c}
@section Contributors to the Python documentation


Many people have contributed to the Python language, the Python standard
library, and the Python documentation.  See Misc/ACKS@footnote{https://github.com/python/cpython/tree/3.14/Misc/ACKS} in the Python
source distribution for a partial list of contributors.

It is only with the input and contributions of the Python community
that Python has such wonderful documentation – Thank You!

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Dealing with Bugs,Copyright,About this documentation,Top
@anchor{bugs doc}@anchor{5d3d}@anchor{bugs dealing-with-bugs}@anchor{5d3e}@anchor{bugs reporting-bugs}@anchor{5279}@anchor{bugs translation-repo}@anchor{5d3f}
@chapter Dealing with Bugs


Python is a mature programming language which has established a reputation for
stability.  In order to maintain this reputation, the developers would like to
know of any deficiencies you find in Python.

It can be sometimes faster to fix bugs yourself and contribute patches to
Python as it streamlines the process and involves fewer people. Learn how to
@ref{5d40,,contribute}.

@menu
* Documentation bugs:: 
* Using the Python issue tracker:: 
* Getting started contributing to Python yourself:: 

@end menu

@node Documentation bugs,Using the Python issue tracker,,Dealing with Bugs
@anchor{bugs documentation-bugs}@anchor{5d41}
@section Documentation bugs


If you find a bug in this documentation or would like to propose an improvement,
please submit a bug report on the @ref{557,,issue tracker}.  If you
have a suggestion on how to fix it, include that as well.


You can also open a discussion item on our
Documentation Discourse forum@footnote{https://discuss.python.org/c/documentation/26}.

If you find a bug in the theme (HTML / CSS / JavaScript) of the
documentation, please submit a bug report on the python-doc-theme issue tracker@footnote{https://github.com/python/python-docs-theme}.


@subsubheading See also



@table @asis

@item Documentation bugs@footnote{https://github.com/python/cpython/issues?q=is%3Aissue+is%3Aopen+label%3Adocs}

A list of documentation bugs that have been submitted to the Python issue tracker.

@item Issue Tracking@footnote{https://devguide.python.org/tracker/}

Overview of the process involved in reporting an improvement on the tracker.

@item Helping with Documentation@footnote{https://devguide.python.org/docquality/#helping-with-documentation}

Comprehensive guide for individuals that are interested in contributing to Python documentation.

@item Documentation Translations@footnote{https://devguide.python.org/documentation/translating/}

A list of GitHub pages for documentation translation and their primary contacts.
@end table


@node Using the Python issue tracker,Getting started contributing to Python yourself,Documentation bugs,Dealing with Bugs
@anchor{bugs using-the-python-issue-tracker}@anchor{5d42}@anchor{bugs using-the-tracker}@anchor{557}
@section Using the Python issue tracker


Issue reports for Python itself should be submitted via the GitHub issues
tracker (@indicateurl{https://github.com/python/cpython/issues}).
The GitHub issues tracker offers a web form which allows pertinent information
to be entered and submitted to the developers.

The first step in filing a report is to determine whether the problem has
already been reported.  The advantage in doing so, aside from saving the
developers’ time, is that you learn what has been done to fix it; it may be that
the problem has already been fixed for the next release, or additional
information is needed (in which case you are welcome to provide it if you can!).
To do this, search the tracker using the search box at the top of the page.

If the problem you’re reporting is not already in the list, log in to GitHub.
If you don’t already have a GitHub account, create a new account using the
“Sign up” link.
It is not possible to submit a bug report anonymously.

Being now logged in, you can submit an issue.
Click on the “New issue” button in the top bar to report a new issue.

The submission form has two fields, “Title” and “Comment”.

For the “Title” field, enter a `very' short description of the problem;
fewer than ten words is good.

In the “Comment” field, describe the problem in detail, including what you
expected to happen and what did happen.  Be sure to include whether any
extension modules were involved, and what hardware and software platform you
were using (including version information as appropriate).

Each issue report will be reviewed by a developer who will determine what needs to
be done to correct the problem. You will receive an update each time an action is
taken on the issue.


@subsubheading See also



@table @asis

@item How to Report Bugs Effectively@footnote{https://www.chiark.greenend.org.uk/~sgtatham/bugs.html}

Article which goes into some detail about how to create a useful bug report.
This describes what kind of information is useful and why it is useful.

@item Bug Writing Guidelines@footnote{https://bugzilla.mozilla.org/page.cgi?id=bug-writing.html}

Information about writing a good bug report.  Some of this is specific to the
Mozilla project, but describes general good practices.
@end table


@node Getting started contributing to Python yourself,,Using the Python issue tracker,Dealing with Bugs
@anchor{bugs contributing-to-python}@anchor{5d40}@anchor{bugs getting-started-contributing-to-python-yourself}@anchor{5d43}
@section Getting started contributing to Python yourself


Beyond just reporting bugs that you find, you are also welcome to submit
patches to fix them.  You can find more information on how to get started
patching Python in the Python Developer's Guide@footnote{https://devguide.python.org/}.  If you have questions,
the core-mentorship mailing list@footnote{https://mail.python.org/mailman3/lists/core-mentorship.python.org/} is a friendly place to get answers to
any and all questions pertaining to the process of fixing issues in Python.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Copyright,History and License,Dealing with Bugs,Top
@anchor{copyright doc}@anchor{5d44}@anchor{copyright copyright}@anchor{5d45}@anchor{copyright translation-repo}@anchor{5d46}
@chapter Copyright


Python and this documentation is:

Copyright © 2001 Python Software Foundation. All rights reserved.

Copyright © 2000 BeOpen.com. All rights reserved.

Copyright © 1995-2000 Corporation for National Research Initiatives. All rights
reserved.

Copyright © 1991-1995 Stichting Mathematisch Centrum. All rights reserved.


__________________________________________________________________


See @ref{5d47,,History and License} for complete license and permissions information.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node History and License,Python Module Index,Copyright,Top
@anchor{license doc}@anchor{5d48}@anchor{license history-and-license}@anchor{5d47}@anchor{license id1}@anchor{5d49}@anchor{license translation-repo}@anchor{5d4a}
@chapter History and License


@menu
* History of the software:: 
* Terms and conditions for accessing or otherwise using Python:: 
* Licenses and Acknowledgements for Incorporated Software:: 

@end menu

@node History of the software,Terms and conditions for accessing or otherwise using Python,,History and License
@anchor{license history-of-the-software}@anchor{5d4b}
@section History of the software


Python was created in the early 1990s by Guido van Rossum at Stichting
Mathematisch Centrum (CWI, see @indicateurl{https://www.cwi.nl}) in the Netherlands as a
successor of a language called ABC.  Guido remains Python’s principal author,
although it includes many contributions from others.

In 1995, Guido continued his work on Python at the Corporation for National
Research Initiatives (CNRI, see @indicateurl{https://www.cnri.reston.va.us}) in Reston,
Virginia where he released several versions of the software.

In May 2000, Guido and the Python core development team moved to BeOpen.com to
form the BeOpen PythonLabs team.  In October of the same year, the PythonLabs
team moved to Digital Creations, which became
Zope Corporation.  In 2001, the Python Software Foundation (PSF, see
@indicateurl{https://www.python.org/psf/}) was formed, a non-profit organization created
specifically to own Python-related Intellectual Property.  Zope Corporation was a
sponsoring member of the PSF.

All Python releases are Open Source (see @indicateurl{https://opensource.org} for the Open
Source Definition). Historically, most, but not all, Python releases have also
been GPL-compatible; the table below summarizes the various releases.


@multitable {xxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxx} {xxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Release

@tab

Derived from

@tab

Year

@tab

Owner

@tab

GPL-compatible? (1)

@item

0.9.0 thru 1.2

@tab

n/a

@tab

1991-1995

@tab

CWI

@tab

yes

@item

1.3 thru 1.5.2

@tab

1.2

@tab

1995-1999

@tab

CNRI

@tab

yes

@item

1.6

@tab

1.5.2

@tab

2000

@tab

CNRI

@tab

no

@item

2.0

@tab

1.6

@tab

2000

@tab

BeOpen.com

@tab

no

@item

1.6.1

@tab

1.6

@tab

2001

@tab

CNRI

@tab

yes (2)

@item

2.1

@tab

2.0+1.6.1

@tab

2001

@tab

PSF

@tab

no

@item

2.0.1

@tab

2.0+1.6.1

@tab

2001

@tab

PSF

@tab

yes

@item

2.1.1

@tab

2.1+2.0.1

@tab

2001

@tab

PSF

@tab

yes

@item

2.1.2

@tab

2.1.1

@tab

2002

@tab

PSF

@tab

yes

@item

2.1.3

@tab

2.1.2

@tab

2002

@tab

PSF

@tab

yes

@item

2.2 and above

@tab

2.1.1

@tab

2001-now

@tab

PSF

@tab

yes

@end multitable


@cartouche
@quotation Note 

@enumerate 

@item 
GPL-compatible doesn’t mean that we’re distributing Python under the GPL.
All Python licenses, unlike the GPL, let you distribute a modified version
without making your changes open source. The GPL-compatible licenses make
it possible to combine Python with other software that is released under
the GPL; the others don’t.

@item 
According to Richard Stallman, 1.6.1 is not GPL-compatible, because its license
has a choice of law clause. According to CNRI, however, Stallman’s lawyer has
told CNRI’s lawyer that 1.6.1 is “not incompatible” with the GPL.
@end enumerate
@end quotation
@end cartouche

Thanks to the many outside volunteers who have worked under Guido’s direction to
make these releases possible.

@node Terms and conditions for accessing or otherwise using Python,Licenses and Acknowledgements for Incorporated Software,History of the software,History and License
@anchor{license terms-and-conditions-for-accessing-or-otherwise-using-python}@anchor{5d4c}
@section Terms and conditions for accessing or otherwise using Python


Python software and documentation are licensed under the
Python Software Foundation License Version 2.

Starting with Python 3.8.6, examples, recipes, and other code in
the documentation are dual licensed under the PSF License Version 2
and the @ref{5d4d,,Zero-Clause BSD license}.

Some software incorporated into Python is under different licenses.
The licenses are listed with code falling under that license.
See @ref{5d4e,,Licenses and Acknowledgements for Incorporated Software} for an incomplete list of these licenses.

@menu
* PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2:: 
* BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0: BEOPEN COM LICENSE AGREEMENT FOR PYTHON 2 0. 
* CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1: CNRI LICENSE AGREEMENT FOR PYTHON 1 6 1. 
* CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2: CWI LICENSE AGREEMENT FOR PYTHON 0 9 0 THROUGH 1 2. 
* ZERO-CLAUSE BSD LICENSE FOR CODE IN THE PYTHON DOCUMENTATION:: 

@end menu

@node PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2,BEOPEN COM LICENSE AGREEMENT FOR PYTHON 2 0,,Terms and conditions for accessing or otherwise using Python
@anchor{license psf-license}@anchor{5d4f}@anchor{license python-software-foundation-license-version-2}@anchor{5d50}
@subsection PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2


@example
1. This LICENSE AGREEMENT is between the Python Software Foundation ("PSF"), and
   the Individual or Organization ("Licensee") accessing and otherwise using this
   software ("Python") in source or binary form and its associated documentation.

2. Subject to the terms and conditions of this License Agreement, PSF hereby
   grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce,
   analyze, test, perform and/or display publicly, prepare derivative works,
   distribute, and otherwise use Python alone or in any derivative
   version, provided, however, that PSF's License Agreement and PSF's notice of
   copyright, i.e., "Copyright © 2001 Python Software Foundation; All Rights
   Reserved" are retained in Python alone or in any derivative version
   prepared by Licensee.

3. In the event Licensee prepares a derivative work that is based on or
   incorporates Python or any part thereof, and wants to make the
   derivative work available to others as provided herein, then Licensee hereby
   agrees to include in any such work a brief summary of the changes made to Python.

4. PSF is making Python available to Licensee on an "AS IS" basis.
   PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED.  BY WAY OF
   EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND DISCLAIMS ANY REPRESENTATION OR
   WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE
   USE OF PYTHON WILL NOT INFRINGE ANY THIRD PARTY RIGHTS.

5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
   FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF
   MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, OR ANY DERIVATIVE
   THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.

6. This License Agreement will automatically terminate upon a material breach of
   its terms and conditions.

7. Nothing in this License Agreement shall be deemed to create any relationship
   of agency, partnership, or joint venture between PSF and Licensee.  This License
   Agreement does not grant permission to use PSF trademarks or trade name in a
   trademark sense to endorse or promote products or services of Licensee, or any
   third party.

8. By copying, installing or otherwise using Python, Licensee agrees
   to be bound by the terms and conditions of this License Agreement.
@end example

@node BEOPEN COM LICENSE AGREEMENT FOR PYTHON 2 0,CNRI LICENSE AGREEMENT FOR PYTHON 1 6 1,PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2,Terms and conditions for accessing or otherwise using Python
@anchor{license beopen-com-license-agreement-for-python-2-0}@anchor{5d51}
@subsection BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0


BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1

@example
1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an office at
   160 Saratoga Avenue, Santa Clara, CA 95051, and the Individual or Organization
   ("Licensee") accessing and otherwise using this software in source or binary
   form and its associated documentation ("the Software").

2. Subject to the terms and conditions of this BeOpen Python License Agreement,
   BeOpen hereby grants Licensee a non-exclusive, royalty-free, world-wide license
   to reproduce, analyze, test, perform and/or display publicly, prepare derivative
   works, distribute, and otherwise use the Software alone or in any derivative
   version, provided, however, that the BeOpen Python License is retained in the
   Software, alone or in any derivative version prepared by Licensee.

3. BeOpen is making the Software available to Licensee on an "AS IS" basis.
   BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED.  BY WAY OF
   EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND DISCLAIMS ANY REPRESENTATION OR
   WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE
   USE OF THE SOFTWARE WILL NOT INFRINGE ANY THIRD PARTY RIGHTS.

4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE SOFTWARE FOR
   ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF USING,
   MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY DERIVATIVE THEREOF, EVEN IF
   ADVISED OF THE POSSIBILITY THEREOF.

5. This License Agreement will automatically terminate upon a material breach of
   its terms and conditions.

6. This License Agreement shall be governed by and interpreted in all respects
   by the law of the State of California, excluding conflict of law provisions.
   Nothing in this License Agreement shall be deemed to create any relationship of
   agency, partnership, or joint venture between BeOpen and Licensee.  This License
   Agreement does not grant permission to use BeOpen trademarks or trade names in a
   trademark sense to endorse or promote products or services of Licensee, or any
   third party.  As an exception, the "BeOpen Python" logos available at
   @indicateurl{http://www.pythonlabs.com/logos.html} may be used according to the permissions
   granted on that web page.

7. By copying, installing or otherwise using the software, Licensee agrees to be
   bound by the terms and conditions of this License Agreement.
@end example

@node CNRI LICENSE AGREEMENT FOR PYTHON 1 6 1,CWI LICENSE AGREEMENT FOR PYTHON 0 9 0 THROUGH 1 2,BEOPEN COM LICENSE AGREEMENT FOR PYTHON 2 0,Terms and conditions for accessing or otherwise using Python
@anchor{license cnri-license-agreement-for-python-1-6-1}@anchor{5d52}
@subsection CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1


@example
1. This LICENSE AGREEMENT is between the Corporation for National Research
   Initiatives, having an office at 1895 Preston White Drive, Reston, VA 20191
   ("CNRI"), and the Individual or Organization ("Licensee") accessing and
   otherwise using Python 1.6.1 software in source or binary form and its
   associated documentation.

2. Subject to the terms and conditions of this License Agreement, CNRI hereby
   grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce,
   analyze, test, perform and/or display publicly, prepare derivative works,
   distribute, and otherwise use Python 1.6.1 alone or in any derivative version,
   provided, however, that CNRI's License Agreement and CNRI's notice of copyright,
   i.e., "Copyright © 1995-2001 Corporation for National Research Initiatives; All
   Rights Reserved" are retained in Python 1.6.1 alone or in any derivative version
   prepared by Licensee.  Alternately, in lieu of CNRI's License Agreement,
   Licensee may substitute the following text (omitting the quotes): "Python 1.6.1
   is made available subject to the terms and conditions in CNRI's License
   Agreement.  This Agreement together with Python 1.6.1 may be located on the
   internet using the following unique, persistent identifier (known as a handle):
   1895.22/1013.  This Agreement may also be obtained from a proxy server on the
   internet using the following URL: @indicateurl{http://hdl.handle.net/1895.22/1013}".

3. In the event Licensee prepares a derivative work that is based on or
   incorporates Python 1.6.1 or any part thereof, and wants to make the derivative
   work available to others as provided herein, then Licensee hereby agrees to
   include in any such work a brief summary of the changes made to Python 1.6.1.

4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS" basis.  CNRI
   MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED.  BY WAY OF EXAMPLE,
   BUT NOT LIMITATION, CNRI MAKES NO AND DISCLAIMS ANY REPRESENTATION OR WARRANTY
   OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF
   PYTHON 1.6.1 WILL NOT INFRINGE ANY THIRD PARTY RIGHTS.

5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON 1.6.1 FOR
   ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF
   MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1, OR ANY DERIVATIVE
   THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.

6. This License Agreement will automatically terminate upon a material breach of
   its terms and conditions.

7. This License Agreement shall be governed by the federal intellectual property
   law of the United States, including without limitation the federal copyright
   law, and, to the extent such U.S. federal law does not apply, by the law of the
   Commonwealth of Virginia, excluding Virginia's conflict of law provisions.
   Notwithstanding the foregoing, with regard to derivative works based on Python
   1.6.1 that incorporate non-separable material that was previously distributed
   under the GNU General Public License (GPL), the law of the Commonwealth of
   Virginia shall govern this License Agreement only as to issues arising under or
   with respect to Paragraphs 4, 5, and 7 of this License Agreement.  Nothing in
   this License Agreement shall be deemed to create any relationship of agency,
   partnership, or joint venture between CNRI and Licensee.  This License Agreement
   does not grant permission to use CNRI trademarks or trade name in a trademark
   sense to endorse or promote products or services of Licensee, or any third
   party.

8. By clicking on the "ACCEPT" button where indicated, or by copying, installing
   or otherwise using Python 1.6.1, Licensee agrees to be bound by the terms and
   conditions of this License Agreement.
@end example

@node CWI LICENSE AGREEMENT FOR PYTHON 0 9 0 THROUGH 1 2,ZERO-CLAUSE BSD LICENSE FOR CODE IN THE PYTHON DOCUMENTATION,CNRI LICENSE AGREEMENT FOR PYTHON 1 6 1,Terms and conditions for accessing or otherwise using Python
@anchor{license cwi-license-agreement-for-python-0-9-0-through-1-2}@anchor{5d53}
@subsection CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2


@example
Copyright © 1991 - 1995, Stichting Mathematisch Centrum Amsterdam, The
Netherlands.  All rights reserved.

Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted, provided that
the above copyright notice appear in all copies and that both that copyright
notice and this permission notice appear in supporting documentation, and that
the name of Stichting Mathematisch Centrum or CWI not be used in advertising or
publicity pertaining to distribution of the software without specific, written
prior permission.

STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE FOR ANY SPECIAL, INDIRECT
OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
SOFTWARE.
@end example

@node ZERO-CLAUSE BSD LICENSE FOR CODE IN THE PYTHON DOCUMENTATION,,CWI LICENSE AGREEMENT FOR PYTHON 0 9 0 THROUGH 1 2,Terms and conditions for accessing or otherwise using Python
@anchor{license bsd0}@anchor{5d4d}@anchor{license zero-clause-bsd-license-for-code-in-the-python-documentation}@anchor{5d54}
@subsection ZERO-CLAUSE BSD LICENSE FOR CODE IN THE PYTHON DOCUMENTATION


@example
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
@end example

@node Licenses and Acknowledgements for Incorporated Software,,Terms and conditions for accessing or otherwise using Python,History and License
@anchor{license licenses-and-acknowledgements-for-incorporated-software}@anchor{5d55}@anchor{license otherlicenses}@anchor{5d4e}
@section Licenses and Acknowledgements for Incorporated Software


This section is an incomplete, but growing list of licenses and acknowledgements
for third-party software incorporated in the Python distribution.

@menu
* Mersenne Twister:: 
* Sockets: Sockets<2>. 
* Asynchronous socket services:: 
* Cookie management:: 
* Execution tracing:: 
* UUencode and UUdecode functions:: 
* XML Remote Procedure Calls:: 
* test_epoll:: 
* Select kqueue:: 
* SipHash24:: 
* strtod and dtoa:: 
* OpenSSL: OpenSSL<2>. 
* expat:: 
* libffi:: 
* zlib: zlib<4>. 
* cfuhash:: 
* libmpdec:: 
* W3C C14N test suite:: 
* mimalloc:: 
* asyncio: asyncio<15>. 
* Global Unbounded Sequences (GUS): Global Unbounded Sequences GUS. 
* Zstandard bindings:: 

@end menu

@node Mersenne Twister,Sockets<2>,,Licenses and Acknowledgements for Incorporated Software
@anchor{license mersenne-twister}@anchor{5d56}
@subsection Mersenne Twister


The @code{_random} C extension underlying the @ref{bd,,random} module
includes code based on a download from
@indicateurl{http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/emt19937ar.html}. The following are
the verbatim comments from the original code:

@example
A C-program for MT19937, with initialization improved 2002/1/26.
Coded by Takuji Nishimura and Makoto Matsumoto.

Before using, initialize the state by using init_genrand(seed)
or init_by_array(init_key, key_length).

Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura,
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:

 1. Redistributions of source code must retain the above copyright
    notice, this list of conditions and the following disclaimer.

 2. Redistributions in binary form must reproduce the above copyright
    notice, this list of conditions and the following disclaimer in the
    documentation and/or other materials provided with the distribution.

 3. The names of its contributors may not be used to endorse or promote
    products derived from this software without specific prior written
    permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.


Any feedback is very welcome.
http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html
email: m-mat @@ math.sci.hiroshima-u.ac.jp (remove space)
@end example

@node Sockets<2>,Asynchronous socket services,Mersenne Twister,Licenses and Acknowledgements for Incorporated Software
@anchor{license sockets}@anchor{5d57}
@subsection Sockets


The @ref{d1,,socket} module uses the functions, @code{getaddrinfo()}, and
@code{getnameinfo()}, which are coded in separate source files from the WIDE
Project, @indicateurl{https://www.wide.ad.jp/}.

@example
Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
   notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
   notice, this list of conditions and the following disclaimer in the
   documentation and/or other materials provided with the distribution.
3. Neither the name of the project nor the names of its contributors
   may be used to endorse or promote products derived from this software
   without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
SUCH DAMAGE.
@end example

@node Asynchronous socket services,Cookie management,Sockets<2>,Licenses and Acknowledgements for Incorporated Software
@anchor{license asynchronous-socket-services}@anchor{5d58}
@subsection Asynchronous socket services


The @code{test.support.asynchat} and @code{test.support.asyncore}
modules contain the following notice:

@example
Copyright 1996 by Sam Rushing

                        All Rights Reserved

Permission to use, copy, modify, and distribute this software and
its documentation for any purpose and without fee is hereby
granted, provided that the above copyright notice appear in all
copies and that both that copyright notice and this permission
notice appear in supporting documentation, and that the name of Sam
Rushing not be used in advertising or publicity pertaining to
distribution of the software without specific, written prior
permission.

SAM RUSHING DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
NO EVENT SHALL SAM RUSHING BE LIABLE FOR ANY SPECIAL, INDIRECT OR
CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
@end example

@node Cookie management,Execution tracing,Asynchronous socket services,Licenses and Acknowledgements for Incorporated Software
@anchor{license cookie-management}@anchor{5d59}
@subsection Cookie management


The @ref{75,,http.cookies} module contains the following notice:

@example
Copyright 2000 by Timothy O'Malley <timo@@alum.mit.edu>

               All Rights Reserved

Permission to use, copy, modify, and distribute this software
and its documentation for any purpose and without fee is hereby
granted, provided that the above copyright notice appear in all
copies and that both that copyright notice and this permission
notice appear in supporting documentation, and that the name of
Timothy O'Malley  not be used in advertising or publicity
pertaining to distribution of the software without specific, written
prior permission.

Timothy O'Malley DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS, IN NO EVENT SHALL Timothy O'Malley BE LIABLE FOR
ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
@end example

@node Execution tracing,UUencode and UUdecode functions,Cookie management,Licenses and Acknowledgements for Incorporated Software
@anchor{license execution-tracing}@anchor{5d5a}
@subsection Execution tracing


The @ref{104,,trace} module contains the following notice:

@example
portions copyright 2001, Autonomous Zones Industries, Inc., all rights...
err...  reserved and offered to the public under the terms of the
Python 2.2 license.
Author: Zooko O'Whielacronx
http://zooko.com/
mailto:zooko@@zooko.com

Copyright 2000, Mojam Media, Inc., all rights reserved.
Author: Skip Montanaro

Copyright 1999, Bioreason, Inc., all rights reserved.
Author: Andrew Dalke

Copyright 1995-1997, Automatrix, Inc., all rights reserved.
Author: Skip Montanaro

Copyright 1991-1995, Stichting Mathematisch Centrum, all rights reserved.


Permission to use, copy, modify, and distribute this Python software and
its associated documentation for any purpose without fee is hereby
granted, provided that the above copyright notice appears in all copies,
and that both that copyright notice and this permission notice appear in
supporting documentation, and that the name of neither Automatrix,
Bioreason or Mojam Media be used in advertising or publicity pertaining to
distribution of the software without specific, written prior permission.
@end example

@node UUencode and UUdecode functions,XML Remote Procedure Calls,Execution tracing,Licenses and Acknowledgements for Incorporated Software
@anchor{license uuencode-and-uudecode-functions}@anchor{5d5b}
@subsection UUencode and UUdecode functions


The @code{uu} codec contains the following notice:

@example
Copyright 1994 by Lance Ellinghouse
Cathedral City, California Republic, United States of America.
                       All Rights Reserved
Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation, and that the name of Lance Ellinghouse
not be used in advertising or publicity pertaining to distribution
of the software without specific, written prior permission.
LANCE ELLINGHOUSE DISCLAIMS ALL WARRANTIES WITH REGARD TO
THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS, IN NO EVENT SHALL LANCE ELLINGHOUSE CENTRUM BE LIABLE
FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

Modified by Jack Jansen, CWI, July 1995:
- Use binascii module to do the actual line-by-line conversion
  between ascii and binary. This results in a 1000-fold speedup. The C
  version is still 5 times faster, though.
- Arguments more compliant with Python standard
@end example

@node XML Remote Procedure Calls,test_epoll,UUencode and UUdecode functions,Licenses and Acknowledgements for Incorporated Software
@anchor{license xml-remote-procedure-calls}@anchor{5d5c}
@subsection XML Remote Procedure Calls


The @ref{135,,xmlrpc.client} module contains the following notice:

@example
    The XML-RPC client interface is

Copyright (c) 1999-2002 by Secret Labs AB
Copyright (c) 1999-2002 by Fredrik Lundh

By obtaining, using, and/or copying this software and/or its
associated documentation, you agree that you have read, understood,
and will comply with the following terms and conditions:

Permission to use, copy, modify, and distribute this software and
its associated documentation for any purpose and without fee is
hereby granted, provided that the above copyright notice appears in
all copies, and that both that copyright notice and this permission
notice appear in supporting documentation, and that the name of
Secret Labs AB or the author not be used in advertising or publicity
pertaining to distribution of the software without specific, written
prior permission.

SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD
TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT-
ABILITY AND FITNESS.  IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR
BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
OF THIS SOFTWARE.
@end example

@node test_epoll,Select kqueue,XML Remote Procedure Calls,Licenses and Acknowledgements for Incorporated Software
@anchor{license test-epoll}@anchor{5d5d}
@subsection test_epoll


The @code{test.test_epoll} module contains the following notice:

@example
Copyright (c) 2001-2006 Twisted Matrix Laboratories.

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@end example

@node Select kqueue,SipHash24,test_epoll,Licenses and Acknowledgements for Incorporated Software
@anchor{license select-kqueue}@anchor{5d5e}
@subsection Select kqueue


The @ref{c6,,select} module contains the following notice for the kqueue
interface:

@example
Copyright (c) 2000 Doug White, 2006 James Knight, 2007 Christian Heimes
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
   notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
   notice, this list of conditions and the following disclaimer in the
   documentation and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
SUCH DAMAGE.
@end example

@node SipHash24,strtod and dtoa,Select kqueue,Licenses and Acknowledgements for Incorporated Software
@anchor{license siphash24}@anchor{5d5f}
@subsection SipHash24


The file @code{Python/pyhash.c} contains Marek Majkowski’ implementation of
Dan Bernstein’s SipHash24 algorithm. It contains the following note:

@example
<MIT License>
Copyright (c) 2013  Marek Majkowski <marek@@popcount.org>

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
</MIT License>

Original location:
   https://github.com/majek/csiphash/

Solution inspired by code from:
   Samuel Neves (supercop/crypto_auth/siphash24/little)
   djb (supercop/crypto_auth/siphash24/little2)
   Jean-Philippe Aumasson (https://131002.net/siphash/siphash24.c)
@end example

@node strtod and dtoa,OpenSSL<2>,SipHash24,Licenses and Acknowledgements for Incorporated Software
@anchor{license strtod-and-dtoa}@anchor{5d60}
@subsection strtod and dtoa


The file @code{Python/dtoa.c}, which supplies C functions dtoa and
strtod for conversion of C doubles to and from strings, is derived
from the file of the same name by David M. Gay, currently available
from @indicateurl{https://web.archive.org/web/20220517033456/http://www.netlib.org/fp/dtoa.c}.
The original file, as retrieved on March 16, 2009, contains the following
copyright and licensing notice:

@example
/****************************************************************
 *
 * The author of this software is David M. Gay.
 *
 * Copyright (c) 1991, 2000, 2001 by Lucent Technologies.
 *
 * Permission to use, copy, modify, and distribute this software for any
 * purpose without fee is hereby granted, provided that this entire notice
 * is included in all copies of any software which is or includes a copy
 * or modification of this software and in all copies of the supporting
 * documentation for such software.
 *
 * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
 * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHOR NOR LUCENT MAKES ANY
 * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
 * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
 *
 ***************************************************************/
@end example

@node OpenSSL<2>,expat,strtod and dtoa,Licenses and Acknowledgements for Incorporated Software
@anchor{license openssl}@anchor{5d61}
@subsection OpenSSL


The modules @ref{6c,,hashlib}, @ref{b2,,posix} and @ref{d5,,ssl} use
the OpenSSL library for added performance if made available by the
operating system. Additionally, the Windows and macOS installers for
Python may include a copy of the OpenSSL libraries, so we include a copy
of the OpenSSL license here. For the OpenSSL 3.0 release,
and later releases derived from that, the Apache License v2 applies:

@example
                              Apache License
                        Version 2.0, January 2004
                     https://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

1. Definitions.

   "License" shall mean the terms and conditions for use, reproduction,
   and distribution as defined by Sections 1 through 9 of this document.

   "Licensor" shall mean the copyright owner or entity authorized by
   the copyright owner that is granting the License.

   "Legal Entity" shall mean the union of the acting entity and all
   other entities that control, are controlled by, or are under common
   control with that entity. For the purposes of this definition,
   "control" means (i) the power, direct or indirect, to cause the
   direction or management of such entity, whether by contract or
   otherwise, or (ii) ownership of fifty percent (50%) or more of the
   outstanding shares, or (iii) beneficial ownership of such entity.

   "You" (or "Your") shall mean an individual or Legal Entity
   exercising permissions granted by this License.

   "Source" form shall mean the preferred form for making modifications,
   including but not limited to software source code, documentation
   source, and configuration files.

   "Object" form shall mean any form resulting from mechanical
   transformation or translation of a Source form, including but
   not limited to compiled object code, generated documentation,
   and conversions to other media types.

   "Work" shall mean the work of authorship, whether in Source or
   Object form, made available under the License, as indicated by a
   copyright notice that is included in or attached to the work
   (an example is provided in the Appendix below).

   "Derivative Works" shall mean any work, whether in Source or Object
   form, that is based on (or derived from) the Work and for which the
   editorial revisions, annotations, elaborations, or other modifications
   represent, as a whole, an original work of authorship. For the purposes
   of this License, Derivative Works shall not include works that remain
   separable from, or merely link (or bind by name) to the interfaces of,
   the Work and Derivative Works thereof.

   "Contribution" shall mean any work of authorship, including
   the original version of the Work and any modifications or additions
   to that Work or Derivative Works thereof, that is intentionally
   submitted to Licensor for inclusion in the Work by the copyright owner
   or by an individual or Legal Entity authorized to submit on behalf of
   the copyright owner. For the purposes of this definition, "submitted"
   means any form of electronic, verbal, or written communication sent
   to the Licensor or its representatives, including but not limited to
   communication on electronic mailing lists, source code control systems,
   and issue tracking systems that are managed by, or on behalf of, the
   Licensor for the purpose of discussing and improving the Work, but
   excluding communication that is conspicuously marked or otherwise
   designated in writing by the copyright owner as "Not a Contribution."

   "Contributor" shall mean Licensor and any individual or Legal Entity
   on behalf of whom a Contribution has been received by Licensor and
   subsequently incorporated within the Work.

2. Grant of Copyright License. Subject to the terms and conditions of
   this License, each Contributor hereby grants to You a perpetual,
   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
   copyright license to reproduce, prepare Derivative Works of,
   publicly display, publicly perform, sublicense, and distribute the
   Work and such Derivative Works in Source or Object form.

3. Grant of Patent License. Subject to the terms and conditions of
   this License, each Contributor hereby grants to You a perpetual,
   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
   (except as stated in this section) patent license to make, have made,
   use, offer to sell, sell, import, and otherwise transfer the Work,
   where such license applies only to those patent claims licensable
   by such Contributor that are necessarily infringed by their
   Contribution(s) alone or by combination of their Contribution(s)
   with the Work to which such Contribution(s) was submitted. If You
   institute patent litigation against any entity (including a
   cross-claim or counterclaim in a lawsuit) alleging that the Work
   or a Contribution incorporated within the Work constitutes direct
   or contributory patent infringement, then any patent licenses
   granted to You under this License for that Work shall terminate
   as of the date such litigation is filed.

4. Redistribution. You may reproduce and distribute copies of the
   Work or Derivative Works thereof in any medium, with or without
   modifications, and in Source or Object form, provided that You
   meet the following conditions:

   (a) You must give any other recipients of the Work or
       Derivative Works a copy of this License; and

   (b) You must cause any modified files to carry prominent notices
       stating that You changed the files; and

   (c) You must retain, in the Source form of any Derivative Works
       that You distribute, all copyright, patent, trademark, and
       attribution notices from the Source form of the Work,
       excluding those notices that do not pertain to any part of
       the Derivative Works; and

   (d) If the Work includes a "NOTICE" text file as part of its
       distribution, then any Derivative Works that You distribute must
       include a readable copy of the attribution notices contained
       within such NOTICE file, excluding those notices that do not
       pertain to any part of the Derivative Works, in at least one
       of the following places: within a NOTICE text file distributed
       as part of the Derivative Works; within the Source form or
       documentation, if provided along with the Derivative Works; or,
       within a display generated by the Derivative Works, if and
       wherever such third-party notices normally appear. The contents
       of the NOTICE file are for informational purposes only and
       do not modify the License. You may add Your own attribution
       notices within Derivative Works that You distribute, alongside
       or as an addendum to the NOTICE text from the Work, provided
       that such additional attribution notices cannot be construed
       as modifying the License.

   You may add Your own copyright statement to Your modifications and
   may provide additional or different license terms and conditions
   for use, reproduction, or distribution of Your modifications, or
   for any such Derivative Works as a whole, provided Your use,
   reproduction, and distribution of the Work otherwise complies with
   the conditions stated in this License.

5. Submission of Contributions. Unless You explicitly state otherwise,
   any Contribution intentionally submitted for inclusion in the Work
   by You to the Licensor shall be under the terms and conditions of
   this License, without any additional terms or conditions.
   Notwithstanding the above, nothing herein shall supersede or modify
   the terms of any separate license agreement you may have executed
   with Licensor regarding such Contributions.

6. Trademarks. This License does not grant permission to use the trade
   names, trademarks, service marks, or product names of the Licensor,
   except as required for reasonable and customary use in describing the
   origin of the Work and reproducing the content of the NOTICE file.

7. Disclaimer of Warranty. Unless required by applicable law or
   agreed to in writing, Licensor provides the Work (and each
   Contributor provides its Contributions) on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
   implied, including, without limitation, any warranties or conditions
   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
   PARTICULAR PURPOSE. You are solely responsible for determining the
   appropriateness of using or redistributing the Work and assume any
   risks associated with Your exercise of permissions under this License.

8. Limitation of Liability. In no event and under no legal theory,
   whether in tort (including negligence), contract, or otherwise,
   unless required by applicable law (such as deliberate and grossly
   negligent acts) or agreed to in writing, shall any Contributor be
   liable to You for damages, including any direct, indirect, special,
   incidental, or consequential damages of any character arising as a
   result of this License or out of the use or inability to use the
   Work (including but not limited to damages for loss of goodwill,
   work stoppage, computer failure or malfunction, or any and all
   other commercial damages or losses), even if such Contributor
   has been advised of the possibility of such damages.

9. Accepting Warranty or Additional Liability. While redistributing
   the Work or Derivative Works thereof, You may choose to offer,
   and charge a fee for, acceptance of support, warranty, indemnity,
   or other liability obligations and/or rights consistent with this
   License. However, in accepting such obligations, You may act only
   on Your own behalf and on Your sole responsibility, not on behalf
   of any other Contributor, and only if You agree to indemnify,
   defend, and hold each Contributor harmless for any liability
   incurred by, or claims asserted against, such Contributor by reason
   of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS
@end example

@node expat,libffi,OpenSSL<2>,Licenses and Acknowledgements for Incorporated Software
@anchor{license expat}@anchor{5d62}
@subsection expat


The @ref{12d,,pyexpat} extension is built using an included copy of the expat
sources unless the build is configured @code{--with-system-expat}:

@example
Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd
                               and Clark Cooper

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@end example

@node libffi,zlib<4>,expat,Licenses and Acknowledgements for Incorporated Software
@anchor{license libffi}@anchor{5d63}
@subsection libffi


The @code{_ctypes} C extension underlying the @ref{2e,,ctypes} module
is built using an included copy of the libffi
sources unless the build is configured @code{--with-system-libffi}:

@example
Copyright (c) 1996-2008  Red Hat, Inc and others.

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
@end example

@node zlib<4>,cfuhash,libffi,Licenses and Acknowledgements for Incorporated Software
@anchor{license zlib}@anchor{5d64}
@subsection zlib


The @ref{13a,,zlib} extension is built using an included copy of the zlib
sources if the zlib version found on the system is too old to be
used for the build:

@example
Copyright (C) 1995-2011 Jean-loup Gailly and Mark Adler

This software is provided 'as-is', without any express or implied
warranty.  In no event will the authors be held liable for any damages
arising from the use of this software.

Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:

1. The origin of this software must not be misrepresented; you must not
   claim that you wrote the original software. If you use this software
   in a product, an acknowledgment in the product documentation would be
   appreciated but is not required.

2. Altered source versions must be plainly marked as such, and must not be
   misrepresented as being the original software.

3. This notice may not be removed or altered from any source distribution.

Jean-loup Gailly        Mark Adler
jloup@@gzip.org          madler@@alumni.caltech.edu
@end example

@node cfuhash,libmpdec,zlib<4>,Licenses and Acknowledgements for Incorporated Software
@anchor{license cfuhash}@anchor{5d65}
@subsection cfuhash


The implementation of the hash table used by the @ref{106,,tracemalloc} is based
on the cfuhash project:

@example
Copyright (c) 2005 Don Owens
All rights reserved.

This code is released under the BSD license:

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:

  * Redistributions of source code must retain the above copyright
    notice, this list of conditions and the following disclaimer.

  * Redistributions in binary form must reproduce the above
    copyright notice, this list of conditions and the following
    disclaimer in the documentation and/or other materials provided
    with the distribution.

  * Neither the name of the author nor the names of its
    contributors may be used to endorse or promote products derived
    from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
OF THE POSSIBILITY OF SUCH DAMAGE.
@end example

@node libmpdec,W3C C14N test suite,cfuhash,Licenses and Acknowledgements for Incorporated Software
@anchor{license libmpdec}@anchor{5d66}
@subsection libmpdec


The @code{_decimal} C extension underlying the @ref{3a,,decimal} module
is built using an included copy of the libmpdec
library unless the build is configured @code{--with-system-libmpdec}:

@example
Copyright (c) 2008-2020 Stefan Krah. All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:

1. Redistributions of source code must retain the above copyright
   notice, this list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright
   notice, this list of conditions and the following disclaimer in the
   documentation and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
SUCH DAMAGE.
@end example

@node W3C C14N test suite,mimalloc,libmpdec,Licenses and Acknowledgements for Incorporated Software
@anchor{license w3c-c14n-test-suite}@anchor{5d67}
@subsection W3C C14N test suite


The C14N 2.0 test suite in the @ref{e8,,test} package
(@code{Lib/test/xmltestdata/c14n-20/}) was retrieved from the W3C website at
@indicateurl{https://www.w3.org/TR/xml-c14n2-testcases/} and is distributed under the
3-clause BSD license:

@example
Copyright (c) 2013 W3C(R) (MIT, ERCIM, Keio, Beihang),
All Rights Reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:

* Redistributions of works must retain the original copyright notice,
  this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the original copyright
  notice, this list of conditions and the following disclaimer in the
  documentation and/or other materials provided with the distribution.
* Neither the name of the W3C nor the names of its contributors may be
  used to endorse or promote products derived from this work without
  specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@end example

@node mimalloc,asyncio<15>,W3C C14N test suite,Licenses and Acknowledgements for Incorporated Software
@anchor{license mimalloc}@anchor{5d68}@anchor{license mimalloc-license}@anchor{656}
@subsection mimalloc


MIT License:

@example
Copyright (c) 2018-2021 Microsoft Corporation, Daan Leijen

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
@end example

@node asyncio<15>,Global Unbounded Sequences GUS,mimalloc,Licenses and Acknowledgements for Incorporated Software
@anchor{license asyncio}@anchor{5d69}
@subsection asyncio


Parts of the @ref{b,,asyncio} module are incorporated from
uvloop 0.16@footnote{https://github.com/MagicStack/uvloop/tree/v0.16.0},
which is distributed under the MIT license:

@example
Copyright (c) 2015-2021 MagicStack Inc.  http://magic.io

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@end example

@node Global Unbounded Sequences GUS,Zstandard bindings,asyncio<15>,Licenses and Acknowledgements for Incorporated Software
@anchor{license global-unbounded-sequences-gus}@anchor{5d6a}
@subsection Global Unbounded Sequences (GUS)


The file @code{Python/qsbr.c} is adapted from FreeBSD’s “Global Unbounded
Sequences” safe memory reclamation scheme in
subr_smr.c@footnote{https://github.com/freebsd/freebsd-src/blob/main/sys/kern/subr_smr.c}.
The file is distributed under the 2-Clause BSD License:

@example
Copyright (c) 2019,2020 Jeffrey Roberson <jeff@@FreeBSD.org>

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
   notice unmodified, this list of conditions, and the following
   disclaimer.
2. Redistributions in binary form must reproduce the above copyright
   notice, this list of conditions and the following disclaimer in the
   documentation and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@end example

@node Zstandard bindings,,Global Unbounded Sequences GUS,Licenses and Acknowledgements for Incorporated Software
@anchor{license zstandard-bindings}@anchor{5d6b}
@subsection Zstandard bindings


Zstandard bindings in @code{Modules/_zstd} and @code{Lib/compression/zstd}
are based on code from the
pyzstd library@footnote{https://github.com/Rogdham/pyzstd/}, copyright Ma Lin and
contributors. The pyzstd code is distributed under the 3-Clause BSD License:

@example
Copyright (c) 2020-present, Ma Lin and contributors.
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

1. Redistributions of source code must retain the above copyright notice, this
   list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright notice,
   this list of conditions and the following disclaimer in the documentation
   and/or other materials provided with the distribution.

3. Neither the name of the copyright holder nor the names of its
   contributors may be used to endorse or promote products derived from
   this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Python Module Index,Index,History and License,Top
@unnumbered Python Module Index


@menu
* __future__: 0. Future statement definitions
* __main__: 1. The environment where top-level code is run. Covers
                        command-line interfaces@comma{} import-time
                        behavior@comma{} and `@w{`}__name__ ==
                        '__main__'`@w{`}.
* _thread: 2. Low-level threading API.
* _tkinter: 3. A binary module that contains the low-level interface
                        to Tcl/Tk.
* abc: 4. Abstract base classes according to :pep:`3119`.
* aifc: 5. Removed in 3.13.
* annotationlib: 6. Functionality for introspecting annotations
* argparse: 7. Command-line option and argument parsing library.
* array: 8. Space efficient arrays of uniformly typed numeric
                        values.
* ast: 9. Abstract Syntax Tree classes and manipulation.
* asynchat: a. Removed in 3.12.
* asyncio: b. Asynchronous I/O.
* asyncore: c. Removed in 3.12.
* atexit: d. Register and execute cleanup functions.
* audioop: e. Removed in 3.13.
* base64: f. RFC 4648: Base16@comma{} Base32@comma{} Base64 Data
                        Encodings; Base85 and Ascii85
* bdb: 10. Debugger framework.
* binascii: 11. Tools for converting between binary and various ASCII-
                        encoded binary representations.
* bisect: 12. Array bisection algorithms for binary searching.
* builtins: 13. The module that provides the built-in namespace.
* bz2: 14. Interfaces for bzip2 compression and decompression.
* calendar: 15. Functions for working with calendars@comma{} including
                        some emulation of the Unix cal program.
* cgi: 16. Removed in 3.13.
* cgitb: 17. Removed in 3.13.
* chunk: 18. Removed in 3.13.
* cmath: 19. Mathematical functions for complex numbers.
* cmd: 1a. Build line-oriented command interpreters.
* code: 1b. Facilities to implement read-eval-print loops.
* codecs: 1c. Encode and decode data and streams.
* codeop: 1d. Compile (possibly incomplete) Python code.
* collections: 1e. Container datatypes
* collections.abc: 1f. Abstract base classes for containers
* colorsys: 20. Conversion functions between RGB and other color
                        systems.
* compileall: 21. Tools for byte-compiling all Python source files in a
                        directory tree.
* compression: 22. 
* compression.zstd: 23. Low-level interface to compression and decompression
                        routines in the zstd library.
* concurrent.futures: 24. Execute computations concurrently using threads or
                        processes.
* concurrent.interpreters: 25. Multiple interpreters in the same process
* configparser: 26. Configuration file parser.
* contextlib: 27. Utilities for with-statement contexts.
* contextvars: 28. Context Variables
* copy: 29. Shallow and deep copy operations.
* copyreg: 2a. Register pickle support functions.
* cProfile: 2b. 
* crypt: 2c. Removed in 3.13.
* csv: 2d. Write and read tabular data to and from delimited
                        files.
* ctypes: 2e. A foreign function library for Python.
* curses: 2f. An interface to the curses library@comma{} providing
                        portable terminal handling.
* curses.ascii: 30. Constants and set-membership functions for ASCII
                        characters.
* curses.panel: 31. A panel stack extension that adds depth to curses
                        windows.
* curses.textpad: 32. Emacs-like input editing in a curses window.
* dataclasses: 33. Generate special methods on user-defined classes.
* datetime: 34. Basic date and time types.
* dbm: 35. Interfaces to various Unix "database" formats.
* dbm.dumb: 36. Portable implementation of the simple DBM interface.
* dbm.gnu: 37. GNU database manager
* dbm.ndbm: 38. The New Database Manager
* dbm.sqlite3: 39. SQLite backend for dbm
* decimal: 3a. Implementation of the General Decimal Arithmetic
                        Specification.
* difflib: 3b. Helpers for computing differences between objects.
* dis: 3c. Disassembler for Python bytecode.
* distutils: 3d. Removed in 3.12.
* doctest: 3e. Test pieces of code within docstrings.
* email: 3f. Package supporting the parsing@comma{}
                        manipulating@comma{} and generating email messages.
* email.charset: 40. Character Sets
* email.contentmanager: 41. Storing and Retrieving Content from MIME Parts
* email.encoders: 42. Encoders for email message payloads.
* email.errors: 43. The exception classes used by the email package.
* email.generator: 44. Generate flat text email messages from a message
                        structure.
* email.header: 45. Representing non-ASCII headers
* email.headerregistry: 46. Automatic Parsing of headers based on the field name
* email.iterators: 47. Iterate over a message object tree.
* email.message: 48. The base class representing email messages.
* email.mime: 49. Build MIME messages.
* email.mime.application: 4a. 
* email.mime.audio: 4b. 
* email.mime.base: 4c. 
* email.mime.image: 4d. 
* email.mime.message: 4e. 
* email.mime.multipart: 4f. 
* email.mime.nonmultipart: 50. 
* email.mime.text: 51. 
* email.parser: 52. Parse flat text email messages to produce a message
                        object structure.
* email.policy: 53. Controlling the parsing and generating of messages
* email.utils: 54. Miscellaneous email package utilities.
* encodings: 55. Encodings package
* encodings.idna: 56. Internationalized Domain Names implementation
* encodings.mbcs: 57. Windows ANSI codepage
* encodings.utf_8_sig: 58. UTF-8 codec with BOM signature
* ensurepip: 59. Bootstrapping the "pip" installer into an existing
                        Python installation or virtual environment.
* enum: 5a. Implementation of an enumeration class.
* errno: 5b. Standard errno system symbols.
* faulthandler: 5c. Dump the Python traceback.
* fcntl: 5d. The fcntl() and ioctl() system calls.
* filecmp: 5e. Compare files efficiently.
* fileinput: 5f. Loop over standard input or a list of files.
* fnmatch: 60. Unix shell style filename pattern matching.
* fractions: 61. Rational numbers.
* ftplib: 62. FTP protocol client (requires sockets).
* functools: 63. Higher-order functions and operations on callable
                        objects.
* gc: 64. Interface to the cycle-detecting garbage collector.
* getopt: 65. Portable parser for command line options; support both
                        short and long option names.
* getpass: 66. Portable reading of passwords and retrieval of the
                        userid.
* gettext: 67. Multilingual internationalization services.
* glob: 68. Unix shell style pathname pattern expansion.
* graphlib: 69. Functionality to operate with graph-like structures
* grp: 6a. The group database (getgrnam() and friends).
* gzip: 6b. Interfaces for gzip compression and decompression
                        using file objects.
* hashlib: 6c. Secure hash and message digest algorithms.
* heapq: 6d. Heap queue algorithm (a.k.a. priority queue).
* hmac: 6e. Keyed-Hashing for Message Authentication (HMAC)
                        implementation
* html: 6f. Helpers for manipulating HTML.
* html.entities: 70. Definitions of HTML general entities.
* html.parser: 71. A simple parser that can handle HTML and XHTML.
* http: 72. HTTP status codes and messages
* http.client: 73. HTTP and HTTPS protocol client (requires sockets).
* http.cookiejar: 74. Classes for automatic handling of HTTP cookies.
* http.cookies: 75. Support for HTTP state management (cookies).
* http.server: 76. HTTP server and request handlers.
* idlelib: 77. Implementation package for the IDLE shell/editor.
* imaplib: 78. IMAP4 protocol client (requires sockets).
* imghdr: 79. Removed in 3.13.
* imp: 7a. Removed in 3.12.
* importlib: 7b. The implementation of the import machinery.
* importlib.abc: 7c. Abstract base classes related to import
* importlib.machinery: 7d. Importers and path hooks
* importlib.metadata: 7e. Accessing package metadata
* importlib.resources: 7f. Package resource reading@comma{} opening@comma{} and
                        access
* importlib.resources.abc: 80. Abstract base classes for resources
* importlib.util: 81. Utility code for importers
* inspect: 82. Extract information and source code from live objects.
* io: 83. Core tools for working with streams.
* ipaddress: 84. IPv4/IPv6 manipulation library.
* itertools: 85. Functions creating iterators for efficient looping.
* json: 86. Encode and decode the JSON format.
* json.tool: 87. A command-line interface to validate and pretty-print
                        JSON.
* keyword: 88. Test whether a string is a keyword in Python.
* linecache: 89. Provides random access to individual lines from text
                        files.
* locale: 8a. Internationalization services.
* logging: 8b. Flexible event logging system for applications.
* logging.config: 8c. Configuration of the logging module.
* logging.handlers: 8d. Handlers for the logging module.
* lzma: 8e. A Python wrapper for the liblzma compression library.
* mailbox: 8f. Manipulate mailboxes in various formats
* mailcap: 90. Removed in 3.13.
* marshal: 91. Convert Python objects to streams of bytes and back
                        (with different constraints).
* math: 92. Mathematical functions (sin() etc.).
* mimetypes: 93. Mapping of filename extensions to MIME types.
* mmap: 94. Interface to memory-mapped files for Unix and Windows.
* modulefinder: 95. Find modules used by a script.
* msilib: 96. Removed in 3.13.
* msvcrt: 97. Miscellaneous useful routines from the MS VC++
                        runtime.
* multiprocessing: 98. Process-based parallelism.
* multiprocessing.connection: 99. API for dealing with sockets.
* multiprocessing.dummy: 9a. Dumb wrapper around threading.
* multiprocessing.managers: 9b. Share data between process with shared objects.
* multiprocessing.pool: 9c. Create pools of processes.
* multiprocessing.shared_memory: 9d. Provides shared memory for direct access
                                 across processes.
* multiprocessing.sharedctypes: 9e. Allocate ctypes objects from shared memory.
* netrc: 9f. Loading of .netrc files.
* nis: a0. Removed in 3.13.
* nntplib: a1. Removed in 3.13.
* numbers: a2. Numeric abstract base classes (Complex@comma{}
                        Real@comma{} Integral@comma{} etc.).
* operator: a3. Functions corresponding to the standard operators.
* optparse: a4. Command-line option parsing library.
* os: a5. Miscellaneous operating system interfaces.
* os.path: a6. Operations on pathnames.
* ossaudiodev: a7. Removed in 3.13.
* pathlib: a8. Object-oriented filesystem paths
* pathlib.types: a9. pathlib types for static type checking
* pdb: aa. The Python debugger for interactive interpreters.
* pickle: ab. Convert Python objects to streams of bytes and back.
* pickletools: ac. Contains extensive comments about the pickle protocols
                        and pickle-machine opcodes@comma{} as well as some
                        useful functions.
* pipes: ad. Removed in 3.13.
* pkgutil: ae. Utilities for the import system.
* platform: af. Retrieves as much platform identifying data as
                        possible.
* plistlib: b0. Generate and parse Apple plist files.
* poplib: b1. POP3 protocol client (requires sockets).
* posix: b2. The most common POSIX system calls (normally used via
                        module os).
* pprint: b3. Data pretty printer.
* profile: b4. Python source profiler.
* pstats: b5. Statistics object for use with the profiler.
* pty: b6. Pseudo-Terminal Handling for Unix.
* pwd: b7. The password database (getpwnam() and friends).
* py_compile: b8. Generate byte-code files from Python source files.
* pyclbr: b9. Supports information extraction for a Python module
                        browser.
* pydoc: ba. Documentation generator and online help system.
* queue: bb. A synchronized queue class.
* quopri: bc. Encode and decode files using the MIME quoted-
                        printable encoding.
* random: bd. Generate pseudo-random numbers with various common
                        distributions.
* re: be. Regular expression operations.
* readline: bf. GNU readline support for Python.
* reprlib: c0. Alternate repr() implementation with size limits.
* resource: c1. An interface to provide resource usage information on
                        the current process.
* rlcompleter: c2. Python identifier completion@comma{} suitable for the
                        GNU readline library.
* runpy: c3. Locate and run Python modules without importing them
                        first.
* sched: c4. General purpose event scheduler.
* secrets: c5. Generate secure random numbers for managing secrets.
* select: c6. Wait for I/O completion on multiple streams.
* selectors: c7. High-level I/O multiplexing.
* shelve: c8. Python object persistence.
* shlex: c9. Simple lexical analysis for Unix shell-like languages.
* shutil: ca. High-level file operations@comma{} including copying.
* signal: cb. Set handlers for asynchronous events.
* site: cc. Module responsible for site-specific configuration.
* sitecustomize: cd. 
* smtpd: ce. Removed in 3.12.
* smtplib: cf. SMTP protocol client (requires sockets).
* sndhdr: d0. Removed in 3.13.
* socket: d1. Low-level networking interface.
* socketserver: d2. A framework for network servers.
* spwd: d3. Removed in 3.13.
* sqlite3: d4. A DB-API 2.0 implementation using SQLite 3.x.
* ssl: d5. TLS/SSL wrapper for socket objects
* stat: d6. Utilities for interpreting the results of
                        os.stat()@comma{} os.lstat() and os.fstat().
* statistics: d7. Mathematical statistics functions
* string: d8. Common string operations.
* string.templatelib: d9. Support for template string literals.
* stringprep: da. String preparation@comma{} as per RFC 3453
* struct: db. Interpret bytes as packed binary data.
* subprocess: dc. Subprocess management.
* sunau: dd. Removed in 3.13.
* symtable: de. Interface to the compiler's internal symbol tables.
* sys: df. Access system-specific parameters and functions.
* sys.monitoring: e0. Access and control event monitoring
* sysconfig: e1. Python's configuration information
* syslog: e2. An interface to the Unix syslog library routines.
* tabnanny: e3. Tool for detecting white space related problems in
                        Python source files in a directory tree.
* tarfile: e4. Read and write tar-format archive files.
* telnetlib: e5. Removed in 3.13.
* tempfile: e6. Generate temporary files and directories.
* termios: e7. POSIX style tty control.
* test: e8. Regression tests package containing the testing suite
                        for Python.
* test.regrtest: e9. Drives the regression test suite.
* test.support: ea. Support for Python's regression test suite.
* test.support.bytecode_helper: eb. Support tools for testing correct bytecode
                                generation.
* test.support.import_helper: ec. Support for import tests.
* test.support.os_helper: ed. Support for os tests.
* test.support.script_helper: ee. Support for Python's script execution tests.
* test.support.socket_helper: ef. Support for socket tests.
* test.support.threading_helper: f0. Support for threading tests.
* test.support.warnings_helper: f1. Support for warnings tests.
* textwrap: f2. Text wrapping and filling
* threading: f3. Thread-based parallelism.
* time: f4. Time access and conversions.
* timeit: f5. Measure the execution time of small code snippets.
* tkinter: f6. Interface to Tcl/Tk for graphical user interfaces
* tkinter.colorchooser: f7. Color choosing dialog
* tkinter.commondialog: f8. Tkinter base class for dialogs
* tkinter.dialog: f9. A simple dialog box built on the classic Tk widgets.
* tkinter.dnd: fa. Tkinter drag-and-drop interface
* tkinter.filedialog: fb. Dialog classes for file selection
* tkinter.font: fc. Tkinter font-wrapping class
* tkinter.messagebox: fd. Various types of alert dialogs
* tkinter.scrolledtext: fe. Text widget with a vertical scroll bar.
* tkinter.simpledialog: ff. Simple dialog windows
* tkinter.ttk: 100. Tk themed widget set
* token: 101. Constants representing terminal nodes of the parse
                        tree.
* tokenize: 102. Lexical scanner for Python source code.
* tomllib: 103. Parse TOML files.
* trace: 104. Trace or track Python statement execution.
* traceback: 105. Print or retrieve a stack traceback.
* tracemalloc: 106. Trace memory allocations.
* tty: 107. Utility functions that perform common terminal control
                        operations.
* turtle: 108. An educational framework for simple graphics
                        applications
* turtledemo: 109. A viewer for example turtle scripts
* types: 10a. Names for built-in types.
* typing: 10b. Support for type hints (see :pep:`484`).
* unicodedata: 10c. Access the Unicode Database.
* unittest: 10d. Unit testing framework for Python.
* unittest.mock: 10e. Mock object library.
* urllib: 10f. 
* urllib.error: 110. Exception classes raised by urllib.request.
* urllib.parse: 111. Parse URLs into or assemble them from components.
* urllib.request: 112. Extensible library for opening URLs.
* urllib.response: 113. Response classes used by urllib.
* urllib.robotparser: 114. Load a robots.txt file and answer questions about
                        fetchability of other URLs.
* usercustomize: 115. 
* uu: 116. Removed in 3.13.
* uuid: 117. UUID objects (universally unique identifiers)
                        according to RFC 9562
* venv: 118. Creation of virtual environments.
* warnings: 119. Issue warning messages and control their disposition.
* wave: 11a. Provide an interface to the WAV sound format.
* weakref: 11b. Support for weak references and weak dictionaries.
* webbrowser: 11c. Easy-to-use controller for web browsers.
* winreg: 11d. Routines and objects for manipulating the Windows
                        registry.
* winsound: 11e. Access to the sound-playing machinery for Windows.
* wsgiref: 11f. WSGI Utilities and Reference Implementation.
* wsgiref.handlers: 120. WSGI server/gateway base classes.
* wsgiref.headers: 121. WSGI response header tools.
* wsgiref.simple_server: 122. A simple WSGI HTTP server.
* wsgiref.types: 123. WSGI types for static type checking
* wsgiref.util: 124. WSGI environment utilities.
* wsgiref.validate: 125. WSGI conformance checker.
* xdrlib: 126. Removed in 3.13.
* xml: 127. Package containing XML processing modules
* xml.dom: 128. Document Object Model API for Python.
* xml.dom.minidom: 129. Minimal Document Object Model (DOM) implementation.
* xml.dom.pulldom: 12a. Support for building partial DOM trees from SAX
                        events.
* xml.etree.ElementInclude: 12b. 
* xml.etree.ElementTree: 12c. Implementation of the ElementTree API.
* xml.parsers.expat: 12d. An interface to the Expat non-validating XML parser.
* xml.parsers.expat.errors: 12e. 
* xml.parsers.expat.model: 12f. 
* xml.sax: 130. Package containing SAX2 base classes and convenience
                        functions.
* xml.sax.handler: 131. Base classes for SAX event handlers.
* xml.sax.saxutils: 132. Convenience functions and classes for use with SAX.
* xml.sax.xmlreader: 133. Interface which SAX-compliant XML parsers must
                        implement.
* xmlrpc: 134. Server and client modules implementing XML-RPC.
* xmlrpc.client: 135. XML-RPC client access.
* xmlrpc.server: 136. Basic XML-RPC server implementations.
* zipapp: 137. Manage executable Python zip archives
* zipfile: 138. Read and write ZIP-format archive files.
* zipimport: 139. Support for importing Python modules from ZIP
                        archives.
* zlib: 13a. Low-level interface to compression and decompression
                        routines compatible with gzip.
* zoneinfo: 13b. IANA time zone support
@end menu


@node Index,,Python Module Index,Top
@unnumbered Index


@printindex ge

@anchor{using/cmdline audit_event_cpython_run_file_0}@w{                              }
@anchor{library/stdtypes list clear}@w{                              }
@anchor{4ab9}@w{                              }
@anchor{library/stdtypes list copy}@w{                              }
@anchor{2069}@w{                              }
@anchor{19bc}@w{                              }
@anchor{library/stdtypes list append}@w{                              }
@anchor{2a63}@w{                              }
@anchor{4ab8}@w{                              }
@anchor{library/stdtypes list extend}@w{                              }
@anchor{4ab6}@w{                              }
@anchor{4ab7}@w{                              }
@anchor{library/time audit_event_time_sleep_0}@w{                              }
@anchor{8de}@w{                              }
@anchor{4aba}@w{                              }
@anchor{4ac1}@w{                              }
@anchor{library/sys audit_event_cpython_remote_debugger_script_0}@w{                              }
@anchor{library/asyncio audit_event_cpython_run_stdin_2}@w{                              }
@anchor{library/ctypes audit_event_ctypes_memoryview_at_0}@w{                              }
@anchor{library/unittest unittest tearDownModule}@w{                              }
@anchor{15cf}@w{                              }
@anchor{4ab2}@w{                              }
@anchor{4ac3}@w{                              }
@anchor{library/stdtypes range index}@w{                              }
@anchor{602}@w{                              }
@anchor{library/stdtypes list pop}@w{                              }
@anchor{4ab5}@w{                              }
@anchor{using/cmdline audit_event_cpython_run_stdin_0}@w{                              }
@anchor{library/stdtypes list insert}@w{                              }
@anchor{13a4}@w{                              }
@anchor{library/stdtypes tuple index}@w{                              }
@anchor{library/sys script_path}@w{                              }
@anchor{library/stdtypes tuple count}@w{                              }
@anchor{1aa1}@w{                              }
@anchor{1542}@w{                              }
@anchor{library/_thread start_new_thread}@w{                              }
@anchor{using/cmdline audit_event_cpython_run_stdin_1}@w{                              }
@anchor{603}@w{                              }
@anchor{15ce}@w{                              }
@anchor{library/stdtypes list remove}@w{                              }

@c %**end of body
@bye
